commit 6625a8dfaa2b4195232b6ee724e13ad8be9df2de Author: weberni69795 Date: Thu Oct 14 13:47:35 2021 +0200 init diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/README.md b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/README.md new file mode 100644 index 0000000..266b73c --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/README.md @@ -0,0 +1,2 @@ +# OpenViBE_visual_BCI + diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-classifier.cfg b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-classifier.cfg new file mode 100644 index 0000000..d6d4ea3 --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-classifier.cfg @@ -0,0 +1,23 @@ + + Native + Linear Discrimimant Analysis (LDA) + + OVTK_StimulationId_Target + OVTK_StimulationId_NonTarget + + + + 0 1 + + + -1.830140e+00 -2.186864e+00 3.559042e+01 -1.083778e+02 1.779947e+02 -1.877161e+02 1.385119e+02 -8.420175e+01 6.565683e+01 -8.468858e+01 1.225329e+02 -1.628122e+02 1.873070e+02 -1.725218e+02 1.064066e+02 -2.119184e+00 -1.170924e+02 2.253049e+02 -2.975638e+02 3.174168e+02 -2.802059e+02 1.991842e+02 -1.143956e+02 6.861966e+01 -7.352136e+01 1.201358e+02 -2.115440e+02 3.423738e+02 -4.713994e+02 5.599098e+02 -5.918283e+02 5.573591e+02 -4.748986e+02 3.928411e+02 -3.338092e+02 2.763467e+02 -1.819805e+02 4.964026e+01 6.383425e+01 -1.296463e+02 1.761420e+02 -1.990490e+02 1.657955e+02 -9.635469e+01 3.860637e+01 -9.250846e+00 -8.941531e+00 4.933733e+01 -1.377848e+02 2.583936e+02 -3.720801e+02 4.676306e+02 -5.462823e+02 5.843934e+02 -5.688947e+02 5.205689e+02 -4.545138e+02 3.830517e+02 -3.412220e+02 3.706566e+02 -4.747292e+02 6.069638e+02 -6.918061e+02 6.714276e+02 -5.485516e+02 3.807036e+02 -2.289429e+02 1.385710e+02 -1.302142e+02 1.889379e+02 -2.795823e+02 3.512672e+02 -3.391574e+02 2.147787e+02 -2.539907e+01 -1.464064e+02 2.354832e+02 -2.238563e+02 1.487121e+02 -5.782119e+01 -4.471280e+01 1.479935e+02 -2.058389e+02 2.258281e+02 -2.654091e+02 3.143095e+02 -3.350687e+02 3.463940e+02 -3.618979e+02 3.597727e+02 -3.615601e+02 4.065643e+02 -4.638968e+02 4.699463e+02 -4.079192e+02 2.899650e+02 -1.451548e+02 2.259753e+01 5.223942e+01 -8.874236e+01 8.798560e+01 -4.572111e+01 -3.348461e+01 1.533107e+02 -3.011877e+02 4.287501e+02 -5.100423e+02 5.586754e+02 -5.752231e+02 5.528098e+02 -5.032219e+02 4.245067e+02 -2.889144e+02 1.148274e+02 1.406780e+01 -4.648784e+01 6.176074e+00 6.106874e+01 -1.048837e+02 8.158174e+01 -3.405554e+00 -7.658673e+01 1.105747e+02 -8.041239e+01 4.297435e+01 -8.912910e+01 2.167005e+02 -3.445478e+02 4.125452e+02 -4.061561e+02 3.636666e+02 -3.565763e+02 4.068219e+02 -4.857160e+02 6.000355e+02 -7.763236e+02 9.745301e+02 -1.125320e+03 1.224077e+03 -1.299135e+03 1.348637e+03 -1.348061e+03 1.265651e+03 -1.100116e+03 9.141818e+02 -7.475428e+02 5.671345e+02 -3.661131e+02 1.936855e+02 -7.821941e+01 1.536146e+01 4.636106e+00 -2.957974e+00 1.176650e+01 -4.865394e+01 1.092504e+02 -1.915232e+02 2.841306e+02 -3.438041e+02 3.459385e+02 -3.209738e+02 3.079781e+02 -3.151088e+02 3.334223e+02 -3.572123e+02 3.840953e+02 -4.058616e+02 4.152607e+02 -4.074100e+02 3.766550e+02 -3.314412e+02 2.916418e+02 -2.649860e+02 2.523269e+02 -2.571428e+02 2.665677e+02 -2.548424e+02 2.234944e+02 -1.976423e+02 1.809444e+02 -1.624206e+02 1.386467e+02 -1.048243e+02 6.602562e+01 -4.967064e+01 6.292911e+01 -7.354625e+01 5.684196e+01 -2.554078e+01 4.098041e+00 1.287354e+00 -9.237039e+00 3.940817e+01 -8.211354e+01 1.110043e+02 -1.212343e+02 1.234918e+02 -1.109080e+02 7.239587e+01 -2.018430e+01 -2.471812e+01 5.103851e+01 -4.838445e+01 8.899843e+00 6.129881e+01 -1.427204e+02 2.025250e+02 -2.100583e+02 1.683798e+02 -1.131757e+02 7.469127e+01 -6.227470e+01 8.097558e+01 -1.313716e+02 1.958705e+02 -2.485736e+02 2.683634e+02 -2.497521e+02 2.083994e+02 -1.598574e+02 1.095573e+02 -6.739733e+01 4.585975e+01 -4.629460e+01 5.696731e+01 -5.782230e+01 3.725539e+01 -7.700068e+00 -5.121030e-01 -2.195645e+01 4.668608e+01 -4.637548e+01 3.180848e+01 -2.405608e+01 1.273498e+01 2.896915e+01 -1.002374e+02 1.790772e+02 -2.501405e+02 3.055153e+02 -3.448122e+02 3.846456e+02 -4.393110e+02 4.972880e+02 -5.370154e+02 5.470674e+02 -5.273175e+02 4.894149e+02 -4.462485e+02 3.985050e+02 -3.463797e+02 2.921162e+02 -2.308170e+02 1.674012e+02 -1.157445e+02 6.812900e+01 -1.073800e+01 -4.963513e+01 1.059545e+02 -1.656496e+02 2.285014e+02 -2.879856e+02 3.524818e+02 -4.296551e+02 4.997432e+02 -5.387875e+02 5.471678e+02 -5.421331e+02 5.420063e+02 -5.503932e+02 5.528575e+02 -5.431835e+02 5.374984e+02 -5.444704e+02 5.448911e+02 -5.195919e+02 4.700564e+02 -3.991924e+02 3.100860e+02 -2.172494e+02 1.359941e+02 -7.811977e+01 5.792751e+01 -7.164801e+01 9.365871e+01 -1.157249e+02 1.348987e+02 -1.203844e+02 5.636705e+01 2.529228e+01 -8.719409e+01 1.232397e+02 -1.546032e+02 1.989040e+02 -2.468338e+02 2.755259e+02 -2.744386e+02 2.499316e+02 -2.099780e+02 1.604033e+02 -1.160547e+02 9.003275e+01 -6.976496e+01 4.133227e+01 -1.523675e+01 2.955377e+00 + -6.70807 + + + -3.300492e+00 9.047789e+00 9.660379e-01 -4.168157e+01 8.149732e+01 -7.730307e+01 3.573252e+01 1.068012e+01 -4.923332e+01 7.739045e+01 -8.131484e+01 4.206167e+01 2.814139e+01 -8.184615e+01 8.358782e+01 -4.727826e+01 1.650903e+01 -2.373065e+01 7.667637e+01 -1.737397e+02 2.994470e+02 -4.171609e+02 4.917616e+02 -5.065267e+02 4.597470e+02 -3.770293e+02 2.948227e+02 -2.167504e+02 1.324938e+02 -4.722370e+01 -3.214024e+01 9.084687e+01 -1.039026e+02 7.984009e+01 -5.610528e+01 3.796899e+01 7.755136e+00 -7.850824e+01 1.240203e+02 -1.243726e+02 9.794071e+01 -4.895834e+01 -1.768238e+01 7.982394e+01 -1.279154e+02 1.633579e+02 -1.848739e+02 1.965080e+02 -2.006461e+02 1.899877e+02 -1.709042e+02 1.652304e+02 -1.728678e+02 1.667014e+02 -1.242014e+02 3.869136e+01 7.375498e+01 -1.731184e+02 2.326627e+02 -2.361384e+02 1.554789e+02 -6.252668e+00 -1.161729e+02 1.277323e+02 -3.192123e+01 -1.112713e+02 2.320535e+02 -2.778920e+02 2.440705e+02 -1.569221e+02 4.341489e+01 4.264611e+01 -3.198404e+01 -9.016570e+01 2.748641e+02 -4.511441e+02 5.454885e+02 -5.304076e+02 4.505714e+02 -3.418227e+02 1.878279e+02 -1.821503e+01 -7.898450e+01 9.458977e+01 -9.449511e+01 9.961228e+01 -1.077309e+02 1.295315e+02 -1.385108e+02 1.040606e+02 -5.872584e+01 4.060472e+01 -4.560894e+01 6.345540e+01 -7.920591e+01 6.008645e+01 -7.975075e+00 -4.174837e+01 8.162908e+01 -1.230707e+02 1.577769e+02 -1.718565e+02 1.428358e+02 -3.777761e+01 -1.258771e+02 2.843021e+02 -4.164094e+02 5.412298e+02 -6.441238e+02 7.000618e+02 -7.088667e+02 6.529235e+02 -4.962395e+02 2.582456e+02 -1.986528e+01 -1.493877e+02 2.270466e+02 -2.243577e+02 1.828705e+02 -1.556069e+02 1.647815e+02 -1.893008e+02 1.726799e+02 -7.780183e+01 -3.682756e+01 8.298000e+01 -6.009896e+01 1.628443e+01 1.616057e+01 -1.654537e+01 2.681751e+00 -3.013689e+01 1.175777e+02 -2.410939e+02 4.009464e+02 -6.021877e+02 7.940108e+02 -9.207602e+02 9.975585e+02 -1.062530e+03 1.117375e+03 -1.136571e+03 1.091906e+03 -9.854293e+02 8.624090e+02 -7.397312e+02 5.819760e+02 -3.836051e+02 1.886035e+02 -3.646406e+01 -4.316460e+01 4.363856e+01 -1.381231e+01 8.972500e+00 -3.565711e+01 7.994290e+01 -1.472081e+02 2.358694e+02 -3.133889e+02 3.519482e+02 -3.605861e+02 3.617763e+02 -3.613796e+02 3.585451e+02 -3.658775e+02 3.977957e+02 -4.450869e+02 4.823322e+02 -4.929867e+02 4.779222e+02 -4.502552e+02 4.306704e+02 -4.335729e+02 4.567582e+02 -4.890940e+02 5.130916e+02 -5.077587e+02 4.739175e+02 -4.365848e+02 4.079172e+02 -3.791679e+02 3.423428e+02 -2.941472e+02 2.349854e+02 -1.833759e+02 1.595513e+02 -1.536411e+02 1.399507e+02 -1.128808e+02 8.074479e+01 -4.167168e+01 -1.478228e+01 9.058015e+01 -1.666992e+02 2.120412e+02 -2.164009e+02 1.982747e+02 -1.708602e+02 1.336511e+02 -9.299276e+01 5.787427e+01 -2.478819e+01 -3.135366e+00 3.992475e+00 3.142701e+01 -8.524210e+01 1.344426e+02 -1.610580e+02 1.533396e+02 -1.205797e+02 8.797869e+01 -7.059336e+01 7.254766e+01 -9.882418e+01 1.419044e+02 -1.768973e+02 1.792466e+02 -1.422878e+02 8.333210e+01 -2.668074e+01 -1.952931e+01 5.465116e+01 -6.866593e+01 5.831351e+01 -4.387906e+01 4.851128e+01 -7.152828e+01 9.373663e+01 -9.397417e+01 6.764918e+01 -3.458923e+01 1.636260e+01 -5.099979e+00 -1.786702e+01 3.861660e+01 -2.459137e+01 -2.621881e+01 8.870011e+01 -1.365578e+02 1.509674e+02 -1.353674e+02 1.253753e+02 -1.517742e+02 2.081868e+02 -2.709016e+02 3.170232e+02 -3.290250e+02 3.086060e+02 -2.657746e+02 2.070394e+02 -1.529014e+02 1.242338e+02 -1.137023e+02 1.117516e+02 -1.213795e+02 1.260290e+02 -1.020153e+02 5.631579e+01 -5.608823e+00 -5.381425e+01 1.225985e+02 -1.864982e+02 2.440058e+02 -3.033862e+02 3.508386e+02 -3.649628e+02 3.470436e+02 -3.182371e+02 3.031887e+02 -3.084839e+02 3.224889e+02 -3.455391e+02 3.890489e+02 -4.454387e+02 4.944255e+02 -5.293752e+02 5.498786e+02 -5.461146e+02 5.163812e+02 -4.713428e+02 4.127281e+02 -3.416811e+02 2.781548e+02 -2.396423e+02 2.199857e+02 -2.074922e+02 1.917485e+02 -1.565835e+02 9.895700e+01 -4.195867e+01 7.635617e+00 7.836603e+00 -2.716915e+01 6.333918e+01 -1.019424e+02 1.226757e+02 -1.288269e+02 1.308046e+02 -1.185193e+02 8.224168e+01 -3.838160e+01 8.950628e+00 5.897934e+00 -1.144448e+01 7.601596e+00 -1.542633e+00 + -2.46852 + + + + + \ No newline at end of file diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-epoch-average.cfg b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-epoch-average.cfg new file mode 100644 index 0000000..d875a22 --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-epoch-average.cfg @@ -0,0 +1,4 @@ + + Epoch block average + 1 + diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-signal-decimation.cfg b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-signal-decimation.cfg new file mode 100644 index 0000000..17f549b --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-signal-decimation.cfg @@ -0,0 +1,3 @@ + + 2 + diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-spatial-filter.cfg b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-spatial-filter.cfg new file mode 100644 index 0000000..e69de29 diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-spatial-trainer.cfg b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-spatial-trainer.cfg new file mode 100644 index 0000000..5f8ecd1 --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-spatial-trainer.cfg @@ -0,0 +1,6 @@ + + OVTK_StimulationId_ExperimentStop + ${Player_ScenarioDirectory}/cfg/p300-spatial-filter.cfg + 2 + true + \ No newline at end of file diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-speller-stimulator.cfg b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-speller-stimulator.cfg new file mode 100644 index 0000000..0255d2e --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-speller-stimulator.cfg @@ -0,0 +1,15 @@ + + ${Player_ScenarioDirectory}/scripts/p300-speller-stimulator.lua + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_07 + 6 + 6 + 6 + 0.2 + 0.1 + 1.0 + 3.0 + OVTK_StimulationId_Label_00 + + 20 + \ No newline at end of file diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-speller-visualization.cfg b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-speller-visualization.cfg new file mode 100644 index 0000000..94a29a8 --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/p300-speller-visualization.cfg @@ -0,0 +1,17 @@ + + ${Path_Data}/plugins/simple-visualization/p300-speller.ui + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_07 + 5,5,5 + 100,100,100 + 60 + 0,0,0 + 25,25,25 + 40 + 20,20,70 + 10,10,30 + 40 + 10,40,10 + 60,100,60 + 40 + diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/stream-reader.cfg b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/stream-reader.cfg new file mode 100644 index 0000000..eb40b5a --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/stream-reader.cfg @@ -0,0 +1,3 @@ + + ${Player_ScenarioDirectory}/signals/p300-xdawn-train.ov + \ No newline at end of file diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/stream-writer.cfg b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/stream-writer.cfg new file mode 100644 index 0000000..8ec690d --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/cfg/stream-writer.cfg @@ -0,0 +1,4 @@ + + ${Player_ScenarioDirectory}/signals/p300-xdawn-train.ov + false + \ No newline at end of file diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/keyboard-to-stimulations.txt b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/keyboard-to-stimulations.txt new file mode 100644 index 0000000..77e1530 --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/keyboard-to-stimulations.txt @@ -0,0 +1,3 @@ +Return 0x00008100 + + diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/p300-visual-0-signal-monitoring.xml b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/p300-visual-0-signal-monitoring.xml new file mode 100644 index 0000000..ebf1e4f --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/p300-visual-0-signal-monitoring.xml @@ -0,0 +1,721 @@ + + 2 + OpenViBE Designer + 3.1.0 + + + + + + (0x000014bf, 0x000034db) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 928 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xac367a9c, 0x2da95abe) + 6 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003f1b, 0x00003c78) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/cfg/p300-signal-decimation.cfg + + + + + (0x0000556f, 0x000055f8) + Temporal Filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + + + (0x00005c5c, 0x00007610) + Raw + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00006b6d, 0x00002690) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 928 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00007e4e, 0x00006b7b) + Filtered + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + + + (0x000003a7, 0x000034db) + + (0x000014bf, 0x000034db) + 2 + + + (0x00005c5c, 0x00007610) + 1 + + + + (0x00000554, 0x0000661a) + + (0x000014bf, 0x000034db) + 2 + + + (0x00007e4e, 0x00006b7b) + 1 + + + + (0x00001d33, 0x00002bb0) + + (0x00006b6d, 0x00002690) + 2 + + + (0x000014bf, 0x000034db) + 2 + + + + (0x00003f04, 0x000045c3) + + (0x000014bf, 0x000034db) + 1 + + + (0x00005c5c, 0x00007610) + 0 + + + + (0x00004b11, 0x00006a43) + + (0x00003f1b, 0x00003c78) + 0 + + + (0x000014bf, 0x000034db) + 0 + + + + (0x000056fd, 0x00004795) + + (0x000014bf, 0x000034db) + 0 + + + (0x00007e4e, 0x00006b7b) + 0 + + + + (0x00005703, 0x00006037) + + (0x0000556f, 0x000055f8) + 0 + + + (0x00003f1b, 0x00003c78) + 0 + + + + (0x00005e38, 0x00005c99) + + (0x00006b6d, 0x00002690) + 1 + + + (0x000014bf, 0x000034db) + 1 + + + + (0x000073ac, 0x0000581b) + + (0x00006b6d, 0x00002690) + 1 + + + (0x0000556f, 0x000055f8) + 0 + + + + + + (0x00001653, 0x00002964) + <u><b>Note:</b></u> be sure that the +<i>sampling rate</i> and <i>sample count +per buffer</i> you use in the <u>acquisition +server</u> are compatible with the actual +<i>signal decimation factor</i> + + + (0x473d9a43, 0x97fc0a97) + 512 + + + (0x7234b86b, 0x2b8651a5) + 416 + + + + + (0x000028e8, 0x00003dee) + <u><b><big>Overview</big></b></u> + +This scenario can be used in order +to check the quality of the signals +before starting an experiment. + +One should <u>definitely</u> +check the quality of the signals +and ensure that : + +- <b>eye blinks</b> are visible +- <b>jaw clenching</b> are visible +- <b>alpha waves</b> are visible when closing eyes + + + (0x473d9a43, 0x97fc0a97) + 1184 + + + (0x7234b86b, 0x2b8651a5) + 272 + + + + + (0x000049b3, 0x00001e28) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 944 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + (0x00004e8c, 0x000041b6) + The P300 XDawn scenarios are described in + +http://openvibe.inria.fr/p300-speller-xdawn/ + + + (0x473d9a43, 0x97fc0a97) + 576.000000 + + + (0x7234b86b, 0x2b8651a5) + 130.000000 + + + + + (0x000059b5, 0x00001524) + The <i>Temporal Filter</i> +and <i>Signal Decimation</i> +boxes transform the signal +so you can see what is actually +used online. + + + (0x473d9a43, 0x97fc0a97) + 512 + + + (0x7234b86b, 0x2b8651a5) + 288 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":635,"identifier":"(0x000077ee, 0x0000254d)","name":"default","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":783},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004579, 0x00005fcb)","index":0,"name":"Default tab","parentIdentifier":"(0x000077ee, 0x0000254d)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":293,"identifier":"(0x00005446, 0x000043a1)","index":0,"maxDividerPosition":590,"name":"Vertical split","parentIdentifier":"(0x00004579, 0x00005fcb)","type":4},{"boxIdentifier":"(0x00005c5c, 0x00007610)","childCount":0,"identifier":"(0x00000e42, 0x000074b8)","index":0,"parentIdentifier":"(0x00005446, 0x000043a1)","type":3},{"boxIdentifier":"(0x00007e4e, 0x00006b7b)","childCount":0,"identifier":"(0x00005db7, 0x000032ad)","index":1,"parentIdentifier":"(0x00005446, 0x000043a1)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renard + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Signal Monitoring + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/p300-speller-xdawn/ + + + (0xf6b2e3fa, 0x7bd43926) + xDAWN P300 Speller + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/p300-visual-1-acquisition.xml b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/p300-visual-1-acquisition.xml new file mode 100644 index 0000000..39fc3e5 --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/p300-visual-1-acquisition.xml @@ -0,0 +1,969 @@ + + 2 + OpenViBE Designer + 3.1.0 + + + + + + (0x00002ae2, 0x00004e06) + Keyboard stimulator + (0x00d317b9, 0x6324c3ff) + + + (0x6f752dd0, 0x082a321e) + Outgoing Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + ${Player_ScenarioDirectory}/keyboard-to-stimulations.txt + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0x8d89d3b7, 0x8339d210) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00002c69, 0x00000b43) + P300 Speller Visualization + (0x195e41d6, 0x6e684d47) + + + (0x6f752dd0, 0x082a321e) + Sequence stimulations + + + (0x6f752dd0, 0x082a321e) + Target stimulations + + + (0x6f752dd0, 0x082a321e) + Row selection stimulations + + + (0x6f752dd0, 0x082a321e) + Column selection stimulations + + + + + (0x6f752dd0, 0x082a321e) + Target / Non target flagging + + + + + (0x330306dd, 0x74a95f98) + Interface filename + ${Path_Data}/plugins/simple-visualization/p300-speller.glade + ${Path_Data}/plugins/simple-visualization/p300-speller.ui + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x7f45a2a9, 0x7db12219) + Flash background color + 10,10,10 + 5,5,5 + false + + + (0x7f45a2a9, 0x7db12219) + Flash foreground color + 100,100,100 + 100,100,100 + false + + + (0x007deef9, 0x2f3e95c6) + Flash font size + 100 + 60 + false + + + (0x7f45a2a9, 0x7db12219) + No flash background color + 0,0,0 + 0,0,0 + false + + + (0x7f45a2a9, 0x7db12219) + No flash foreground color + 50,50,50 + 25,25,25 + false + + + (0x007deef9, 0x2f3e95c6) + No flash font size + 75 + 40 + false + + + (0x7f45a2a9, 0x7db12219) + Target background color + 10,40,10 + 20,20,70 + false + + + (0x7f45a2a9, 0x7db12219) + Target foreground color + 60,100,60 + 10,10,30 + false + + + (0x007deef9, 0x2f3e95c6) + Target font size + 100 + 40 + false + + + (0x7f45a2a9, 0x7db12219) + Selected background color + 70,20,20 + 10,40,10 + false + + + (0x7f45a2a9, 0x7db12219) + Selected foreground color + 30,10,10 + 60,100,60 + false + + + (0x007deef9, 0x2f3e95c6) + Selected font size + 100 + 40 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x8d89d30c, 0xa939693a) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/cfg/p300-speller-visualization.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x07e64d8b) + + + + + (0x0000356c, 0x00004381) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/p300-xdawn-train.ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 544 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/cfg/stream-writer.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0350a9f0) + + + (0xfba64161, 0x65304e21) + + + + + + (0x000043a8, 0x00004ec3) + Stimulation Filter + (0x02f96101, 0x5e647cb8) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x6f752dd0, 0x082a321e) + Modified Stimulations + + + + + (0x09e59e57, 0x8d4a553a) + Default action + Reject + Reject + false + + + (0x512a166f, 0x5c3ef83f) + Time range begin + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time range end + 0 + 0 + false + + + (0x09e59e57, 0x8d4a553a) + Action to perform + Select + Select + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range begin + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range end + OVTK_StimulationId_Label_0F + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0x47859b3f, 0x1dfdf5cd) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000470b, 0x00001b1d) + Speller Stimulator + (0x0b5a2787, 0x02750621) + + + (0x00000000, 0x16595537) + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/p300-speller-stimulator.lua + false + + + (0x00000000, 0xbae13066) + (0x2c132d6e, 0x44ab0d97) + Row Stimulation Base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x00000000, 0x5518f982) + (0x2c132d6e, 0x44ab0d97) + Column Stimulation Base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x00000000, 0xc152613d) + (0x007deef9, 0x2f3e95c6) + Matrix Size (m*m) + 6 + 6 + false + + + (0x00000000, 0xa0308929) + (0x007deef9, 0x2f3e95c6) + Number of Repetitions + 6 + 3 + false + + + (0x00000000, 0xcde95a6f) + (0x007deef9, 0x2f3e95c6) + Number of Trials + 6 + 3 + false + + + (0x00000000, 0x9b3f9b7b) + (0x512a166f, 0x5c3ef83f) + Flash Duration (in sec) + 0.2 + 0.2 + false + + + (0x00000000, 0x583ad367) + (0x512a166f, 0x5c3ef83f) + No Flash Duration (in sec) + 0.1 + 0.1 + false + + + (0x00000000, 0xfc1c2fb6) + (0x512a166f, 0x5c3ef83f) + Inter-Repetition Delay (in sec) + 1.0 + 1.0 + false + + + (0x00000000, 0x0d9a1e18) + (0x512a166f, 0x5c3ef83f) + Inter-Trial Delay (in sec) + 3.0 + 3.0 + false + + + (0x00000000, 0xaeefd500) + (0x2c132d6e, 0x44ab0d97) + Start Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x00000000, 0xef5eb0e5) + (0x2cdb2f0b, 0x12f231ea) + Free Spelling + false + false + false + + + (0x00000000, 0x4ead155d) + (0x007deef9, 0x2f3e95c6) + Time To Send + 20 + 20 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/cfg/p300-speller-stimulator.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004eca, 0x00003f33) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01070ba6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000599b, 0x000026ba) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02909b75) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00006d0d, 0x000031d8) + Target Letter Generation + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/p300-speller-target.lua + false + + + (0x79a9edeb, 0x245d83fc) + Word to Spell (leave this empty if random) + + + false + + + (0x2c132d6e, 0x44ab0d97) + Row Stimulation Base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column Stimulation Base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x512a166f, 0x5c3ef83f) + Delay Before Sending (in sec) + 2 + 2 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0334c6b7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00000ea4, 0x000068ff) + + (0x0000599b, 0x000026ba) + 2 + + + (0x00004eca, 0x00003f33) + 0 + + + + (0x000019a1, 0x00001d15) + + (0x0000470b, 0x00001b1d) + 0 + + + (0x00002c69, 0x00000b43) + 0 + + + + (0x00002128, 0x0000146c) + + (0x00002ae2, 0x00004e06) + 0 + + + (0x000043a8, 0x00004ec3) + 0 + + + + (0x000036a5, 0x00006190) + + (0x0000599b, 0x000026ba) + 0 + + + (0x0000356c, 0x00004381) + 0 + + + + (0x00003aa4, 0x00002b37) + + (0x00006d0d, 0x000031d8) + 0 + + + (0x00002c69, 0x00000b43) + 1 + + + + (0x0000649d, 0x00004576) + + (0x0000470b, 0x00001b1d) + 0 + + + (0x00006d0d, 0x000031d8) + 0 + + + + (0x000068a0, 0x0000330f) + + (0x0000599b, 0x000026ba) + 2 + + + (0x0000356c, 0x00004381) + 2 + + + + (0x00007a3d, 0x000044a6) + + (0x000043a8, 0x00004ec3) + 0 + + + (0x0000470b, 0x00001b1d) + (0x00000000, 0x16595537) + + + + (0x00007bda, 0x00000772) + + (0x0000599b, 0x000026ba) + 1 + + + (0x0000356c, 0x00004381) + 1 + + + + + + (0x0000363f, 0x00001c2b) + The P300 Speller Visualization +sends the markers (stimulations) directly to +Acquisition Server using TCP Tagging. + + + (0x473d9a43, 0x97fc0a97) + 960.000000 + + + (0x7234b86b, 0x2b8651a5) + 336.000000 + + + + + (0x00004e8c, 0x000041b6) + The P300 XDawn scenarios are described in + +http://openvibe.inria.fr/p300-speller-xdawn/ + + + (0x473d9a43, 0x97fc0a97) + 320.000000 + + + (0x7234b86b, 0x2b8651a5) + 176.000000 + + + + + (0x19b8795c, 0x039f26f7) + <u><b><big>Overview</big></b></u> + +This scenario can be used as a first +step to collect some training data. The +data will later be used to train a spatial +filter and a classifier for online use. + +The flast sequence will start after 20 sec. + +You will then be presented a blue letter that +you have to focus on, followed by a 12 times +flashing sequence of the whole grid. This will +be repeated 10 times. + +<small><i><b>note:</b> the recorded files go to the +folder where the scenario xml is located +(<span color="darkblue">${Player_ScenarioDirectory}/</span>).</i></small> + + + (0x473d9a43, 0x97fc0a97) + 320.000000 + + + (0x7234b86b, 0x2b8651a5) + 400.000000 + + + + + (0x24020235, 0x4f7e23eb) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 304 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00002ae2, 0x00004e06)","childCount":0,"identifier":"(0x0000119f, 0x0000462a)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0x00002c69, 0x00000b43)","childCount":0,"identifier":"(0x0000742d, 0x000050d7)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renard, Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Data Acquisition + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/p300-speller-xdawn/ + + + (0xf6b2e3fa, 0x7bd43926) + xDAWN P300 Speller + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/p300-visual-2-train-xDAWN.xml b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/p300-visual-2-train-xDAWN.xml new file mode 100644 index 0000000..39ba419 --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/p300-visual-2-train-xDAWN.xml @@ -0,0 +1,644 @@ + + 2 + OpenViBE Designer + 3.1.0 + + + + + + (0x00001db8, 0x00001848) + xDAWN Trainer + (0x27542f6e, 0x14aa3548) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Session signal + + + (0x5ba36127, 0x195feae1) + Evoked potential epochs + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train stimulation + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Spatial filter configuration + + ${Player_ScenarioDirectory}/p300-spatial-filter.cfg + false + + + (0x007deef9, 0x2f3e95c6) + Filter dimension + 4 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Save as box config + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0x4b49a133, 0x42f38d94) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/cfg/p300-spatial-trainer.cfg + + + (0xc80ce8af, 0xf699f813) + + + + (0xce18836a, 0x9c0eb403) + + + + (0xcfad85b0, 0x7c6d841c) + + + + + + (0x00002514, 0x00001614) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/p300-xdawn-train.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/cfg/stream-reader.cfg + + + + + (0x0000267a, 0x0000427f) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.250000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.250000 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + + + (0x00004aea, 0x00001465) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000556f, 0x000055f8) + Temporal Filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + + + (0x00006be0, 0x000074b5) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/cfg/p300-signal-decimation.cfg + + + + + (0x00006fa4, 0x00003c76) + Target Selection + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.600000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 250 + + + (0x207c9054, 0x3c841b63) + 425 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + + + + + (0x000002c2, 0x000038de) + + (0x0000556f, 0x000055f8) + 0 + + + (0x00006be0, 0x000074b5) + 0 + + + + (0x000007d3, 0x000071cb) + + (0x0000267a, 0x0000427f) + 0 + + + (0x00006fa4, 0x00003c76) + 0 + + + + (0x00003582, 0x00002c04) + + (0x00006be0, 0x000074b5) + 0 + + + (0x0000267a, 0x0000427f) + 0 + + + + (0x00003920, 0x00007a30) + + (0x0000267a, 0x0000427f) + 0 + + + (0x00001db8, 0x00001848) + 1 + + + + (0x0000452e, 0x0000366d) + + (0x00002514, 0x00001614) + 1 + + + (0x0000556f, 0x000055f8) + 0 + + + + (0x00004be2, 0x00004296) + + (0x00006fa4, 0x00003c76) + 0 + + + (0x00001db8, 0x00001848) + 2 + + + + (0x00004bf5, 0x00007908) + + (0x00001db8, 0x00001848) + 0 + + + (0x00004aea, 0x00001465) + 0 + + + + (0x000059e8, 0x00000032) + + (0x00002514, 0x00001614) + 2 + + + (0x00001db8, 0x00001848) + 0 + + + + (0x00006af9, 0x00002512) + + (0x00002514, 0x00001614) + 2 + + + (0x00006fa4, 0x00003c76) + 1 + + + + + + (0x00000b43, 0x0000067f) + The preprocessing of the signal is +performed here... + +<u><b>Note:</b></u> be sure that the +<i>sampling rate</i> and <i>sample count +per buffer</i> you use in the <u>acquisition +server</u> are compatible with the actual +<i>signal decimation factor</i> + + + (0x473d9a43, 0x97fc0a97) + 48 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + (0x000010db, 0x00003fcd) + For prerecorded data to test this P300, see + +<b>http://openvibe.inria.fr/datasets/</b> + + + + (0x473d9a43, 0x97fc0a97) + 752 + + + (0x7234b86b, 0x2b8651a5) + 192 + + + + + (0x000049d6, 0x00006e67) + <u><b><big>Overview</big></b></u> + +This scenario should be used to train +the spatial filter using the xDAWN algorithm. + +Just configure the <i>Generic Stream Reader</i> +box to point to the last file you recorded with +scenario <i>1-acquisition</i> and fast forward +this scenario. + +At the end of the training, you will have line in +the console about eigen values. +Using a <i>Player Controller</i> the scenario will +automatically pause at the end of the training. + +If you want details on this values, you should read +<u>http://www.icp.inpg.fr/~rivetber/Publications/references/Rivet2009a.pdf</u> + + + (0x473d9a43, 0x97fc0a97) + 800.000000 + + + (0x7234b86b, 0x2b8651a5) + -80.000000 + + + + + (0x00007b93, 0x000041da) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 304.000000 + + + (0x7234b86b, 0x2b8651a5) + -192.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renard + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Spatial Filter Training + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/p300-speller-xdawn/ + + + (0xf6b2e3fa, 0x7bd43926) + xDAWN P300 Speller + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/p300-visual-3-train-classifier.xml b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/p300-visual-3-train-classifier.xml new file mode 100644 index 0000000..cc6c8cc --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/p300-visual-3-train-classifier.xml @@ -0,0 +1,1087 @@ + + 2 + OpenViBE Designer + 3.1.0 + + + + + + (0x00000b2d, 0x00006d61) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002bb807) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000d41, 0x000013b7) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002b7d6e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001f83, 0x00004e32) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/p300-xdawn-train.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/cfg/stream-reader.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x008e34c7) + + + + + (0x00002c8b, 0x000001d5) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00301c7f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002f94, 0x00000341) + Non Target Selection + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.600000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_NonTarget + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002bbddf) + + + + + (0x00003e14, 0x00000027) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/cfg/p300-signal-decimation.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002c5bfc) + + + + + (0x0000556f, 0x000055f8) + Temporal Filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + + + (0x000063a5, 0x0000197c) + Target Selection + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.600000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002b4e91) + + + + + (0x000078d0, 0x000029bc) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Epoch block average + Epoch block average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/cfg/p300-epoch-average.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002b5470) + + + + + (0x000078f9, 0x000063eb) + xDAWN Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 9.970221e-001 -3.729500e-002 -1.177390e-002 2.814447e-002 -3.772446e-003 3.371324e-002 -5.480030e-003 8.893039e-003 -1.565213e-002 -9.956694e-003 -2.347757e-002 -2.312669e-003 -1.847227e-002 -7.550644e-004 -8.423513e-003 3.243223e-002 2.079848e-002 5.079737e-001 -2.835127e-002 8.259231e-002 -3.621803e-001 -2.004259e-001 -2.432480e-001 -1.861558e-001 -3.798139e-001 9.614762e-002 3.407766e-001 -2.158597e-001 3.720552e-001 7.500469e-002 -8.628774e-002 -3.182367e-002 5.923482e-002 4.124707e-001 2.083913e-001 -2.629501e-001 2.023081e-001 -2.658446e-001 4.022738e-001 -1.785569e-001 4.450742e-001 3.549239e-001 1.550204e-002 3.750389e-002 3.114249e-002 9.273764e-002 -7.093797e-002 -2.610929e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 3 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/cfg/p300-spatial-filter.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002b601f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007b56, 0x000033f9) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Epoch block average + Epoch block average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/cfg/p300-epoch-average.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002c2168) + + + + + (0x0a5a6a4a, 0x1d92a778) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/cfg/p300-classifier.cfg + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Target + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_NonTarget + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00000004, 0x00007d3a) + + (0x000078f9, 0x000063eb) + 0 + + + (0x000063a5, 0x0000197c) + 0 + + + + (0x00000aca, 0x000037d3) + + (0x00003e14, 0x00000027) + 0 + + + (0x000078f9, 0x000063eb) + 0 + + + + (0x00001717, 0x00003cf9) + + (0x000078d0, 0x000029bc) + 0 + + + (0x00000b2d, 0x00006d61) + 0 + + + + (0x00001770, 0x00000ded) + + (0x00001f83, 0x00004e32) + 2 + + + (0x000063a5, 0x0000197c) + 1 + + + + (0x00002204, 0x00006850) + + (0x00001f83, 0x00004e32) + 1 + + + (0x0000556f, 0x000055f8) + 0 + + + + (0x0000227f, 0x00003a6f) + + (0x000078f9, 0x000063eb) + 0 + + + (0x00002f94, 0x00000341) + 0 + + + + (0x00002599, 0x0000329b) + + (0x000063a5, 0x0000197c) + 0 + + + (0x000078d0, 0x000029bc) + 0 + + + + (0x00004098, 0x00007e81) + + (0x00002f94, 0x00000341) + 0 + + + (0x00007b56, 0x000033f9) + 0 + + + + (0x00004674, 0x000061af) + + (0x00007b56, 0x000033f9) + 0 + + + (0x00000d41, 0x000013b7) + 0 + + + + (0x00005c01, 0x00003398) + + (0x0000556f, 0x000055f8) + 0 + + + (0x00003e14, 0x00000027) + 0 + + + + (0x00006821, 0x00000c75) + + (0x00001f83, 0x00004e32) + 2 + + + (0x00002f94, 0x00000341) + 1 + + + + (0x175e412c, 0x0692f4ee) + + (0x00000d41, 0x000013b7) + 0 + + + (0x0a5a6a4a, 0x1d92a778) + 2 + + + + (0x5a67b7d8, 0x1cf07f9a) + + (0x00001f83, 0x00004e32) + 2 + + + (0x0a5a6a4a, 0x1d92a778) + 0 + + + + (0x616495af, 0x5c020b32) + + (0x0a5a6a4a, 0x1d92a778) + 0 + + + (0x00002c8b, 0x000001d5) + 0 + + + + (0x63fa63da, 0x0e447c5b) + + (0x00000b2d, 0x00006d61) + 0 + + + (0x0a5a6a4a, 0x1d92a778) + 1 + + + + + + (0x00004785, 0x00007f9c) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -240 + + + + + (0x000047f3, 0x00004eaf) + The preprocessing of the signal is +performed here... + +<u><b>Note:</b></u> be sure that the +<i>sampling rate</i> and <i>sample count +per buffer</i> you use in the <u>acquisition +server</u> are compatible with the actual +<i>signal decimation factor</i> + + + (0x473d9a43, 0x97fc0a97) + 48 + + + (0x7234b86b, 0x2b8651a5) + 0 + + + + + (0x00005277, 0x00007fbe) + <u><b><big>Overview</big></b></u> + +This scenario should be used to train +the LDA classifier. + +Just configure the <i>Generic Stream Reader</i> +box to point to the last file you recorded with +scenario <i>1-acquisition</i> and fast forward +this scenario. + +At the end of the training, you will have an estimation +of the classifier performance printed in the console. +If this performance is lower than 70%, just run a new +<i>4-online</i> session to have better results. + +<u><b>Note:</b></u> in order to run this scenario, +the spatial filter should have been trained using +<i>2-train-xDAWN</i> ! + + + (0x473d9a43, 0x97fc0a97) + 848 + + + (0x7234b86b, 0x2b8651a5) + 96 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renard + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + LDA Classifier Trainer + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/p300-speller-xdawn/ + + + (0xf6b2e3fa, 0x7bd43926) + xDAWN P300 Speller + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/p300-visual-4-online.xml b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/p300-visual-4-online.xml new file mode 100644 index 0000000..d2b3ba9 --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/p300-visual-4-online.xml @@ -0,0 +1,1778 @@ + + 2 + OpenViBE Designer + 3.1.0 + + + + + + (0x00002ae2, 0x00004e06) + Keyboard stimulator + (0x00d317b9, 0x6324c3ff) + + + (0x6f752dd0, 0x082a321e) + Outgoing Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + ${Player_ScenarioDirectory}/keyboard-to-stimulations.txt + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0x8d89d3b7, 0x8339d210) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00002bb3, 0x0000133c) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x007036bf) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00003d0e, 0x000025ef) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003dec, 0x00004c7b) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.6 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_VisualStimulationStart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005ced91) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000043a8, 0x00004ec3) + Stimulation Filter + (0x02f96101, 0x5e647cb8) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x6f752dd0, 0x082a321e) + Modified Stimulations + + + + + (0x09e59e57, 0x8d4a553a) + Default action + Reject + Reject + false + + + (0x512a166f, 0x5c3ef83f) + Time range begin + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time range end + 0 + 0 + false + + + (0x09e59e57, 0x8d4a553a) + Action to perform + Select + Select + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range begin + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range end + OVTK_StimulationId_Label_0F + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 544 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0x47859b3f, 0x1dfdf5cd) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000445b, 0x000068e3) + P300 accumulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input(1) + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/p300-speller-accumulator.lua + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x2c132d6e, 0x44ab0d97) + Segment start + OVTK_StimulationId_SegmentStart + OVTK_StimulationId_TrialStart + false + + + (0x2c132d6e, 0x44ab0d97) + Segment stop + OVTK_StimulationId_SegmentStop + OVTK_StimulationId_TrialStop + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 627 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0304fb88) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000470b, 0x00001b1d) + Speller Stimulator + (0x0b5a2787, 0x02750621) + + + (0x00000000, 0x16595537) + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-speller-stimulator.lua + false + + + (0x00000000, 0xbae13066) + (0x2c132d6e, 0x44ab0d97) + Row Stimulation Base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x00000000, 0x5518f982) + (0x2c132d6e, 0x44ab0d97) + Column Stimulation Base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x00000000, 0xc152613d) + (0x007deef9, 0x2f3e95c6) + Matrix Size (m*m) + 6 + 6 + false + + + (0x00000000, 0xa0308929) + (0x007deef9, 0x2f3e95c6) + Number of Repetitions + 6 + 3 + false + + + (0x00000000, 0xcde95a6f) + (0x007deef9, 0x2f3e95c6) + Number of Trials + 6 + 3 + false + + + (0x00000000, 0x9b3f9b7b) + (0x512a166f, 0x5c3ef83f) + Flash Duration (in sec) + 0.2 + 0.2 + false + + + (0x00000000, 0x583ad367) + (0x512a166f, 0x5c3ef83f) + No Flash Duration (in sec) + 0.1 + 0.1 + false + + + (0x00000000, 0xfc1c2fb6) + (0x512a166f, 0x5c3ef83f) + Inter-Repetition Delay (in sec) + 1.0 + 1.0 + false + + + (0x00000000, 0x0d9a1e18) + (0x512a166f, 0x5c3ef83f) + Inter-Trial Delay (in sec) + 3.0 + 3.0 + false + + + (0x00000000, 0xaeefd500) + (0x2c132d6e, 0x44ab0d97) + Start Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x00000000, 0xef5eb0e5) + (0x2cdb2f0b, 0x12f231ea) + Free Spelling + false + true + false + + + (0x00000000, 0x4ead155d) + (0x007deef9, 0x2f3e95c6) + Time To Send + 20 + 20 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 608 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/cfg/p300-speller-stimulator.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000556f, 0x000055f8) + Temporal Filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + + + (0x00007786, 0x00001163) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x008f57e1, 0x2790537b) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/p300-xdawn-online-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x007b2629) + + + (0xfba64161, 0x65304e21) + + + + + + (0x09c41dd7, 0x09f2e37b) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Epoch block average + Epoch block average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/cfg/p300-epoch-average.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000eaa12) + + + + + (0x0e30a73f, 0x7ae6d95a) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000f9a38) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x28b5e192, 0x37431137) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/cfg/p300-classifier.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 560 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2e63c8c5, 0x79a8ae7b) + P300 Speller Visualization + (0x195e41d6, 0x6e684d47) + + + (0x6f752dd0, 0x082a321e) + Sequence stimulations + + + (0x6f752dd0, 0x082a321e) + Target stimulations + + + (0x6f752dd0, 0x082a321e) + Row selection stimulations + + + (0x6f752dd0, 0x082a321e) + Column selection stimulations + + + + + (0x6f752dd0, 0x082a321e) + Target / Non target flagging + + + + + (0x330306dd, 0x74a95f98) + Interface filename + ${Path_Data}/plugins/simple-visualization/p300-speller.glade + ${Path_Data}/plugins/simple-visualization/p300-speller.ui + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x7f45a2a9, 0x7db12219) + Flash background color + 10,10,10 + 5,5,5 + false + + + (0x7f45a2a9, 0x7db12219) + Flash foreground color + 100,100,100 + 100,100,100 + false + + + (0x007deef9, 0x2f3e95c6) + Flash font size + 100 + 60 + false + + + (0x7f45a2a9, 0x7db12219) + No flash background color + 0,0,0 + 0,0,0 + false + + + (0x7f45a2a9, 0x7db12219) + No flash foreground color + 50,50,50 + 25,25,25 + false + + + (0x007deef9, 0x2f3e95c6) + No flash font size + 75 + 40 + false + + + (0x7f45a2a9, 0x7db12219) + Target background color + 10,40,10 + 20,20,70 + false + + + (0x7f45a2a9, 0x7db12219) + Target foreground color + 60,100,60 + 10,10,30 + false + + + (0x007deef9, 0x2f3e95c6) + Target font size + 100 + 40 + false + + + (0x7f45a2a9, 0x7db12219) + Selected background color + 70,20,20 + 10,40,10 + false + + + (0x7f45a2a9, 0x7db12219) + Selected foreground color + 30,10,10 + 60,100,60 + false + + + (0x007deef9, 0x2f3e95c6) + Selected font size + 100 + 40 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 464 + + + (0x4e7b798a, 0x183beafb) + (0x8d89d30c, 0xa939693a) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/cfg/p300-speller-visualization.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017985f8) + + + + + (0x40e41bf9, 0x5c44b1b1) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/cfg/p300-signal-decimation.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002cae02) + + + + + (0x6d03daab, 0x55fdea78) + xDAWN Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/cfg/p300-spatial-filter.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6f54afd0, 0x5f2e0f65) + Identity + (0x5dffe431, 0x35215c50) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005f48d2) + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x0000062d, 0x00006549) + + (0x0000445b, 0x000068e3) + 1 + + + (0x2e63c8c5, 0x79a8ae7b) + 3 + + + + (0x00001301, 0x000055b2) + + (0x00002bb3, 0x0000133c) + 1 + + + (0x6f54afd0, 0x5f2e0f65) + 1 + + + + (0x00002128, 0x0000146c) + + (0x00002ae2, 0x00004e06) + 0 + + + (0x000043a8, 0x00004ec3) + 0 + + + + (0x0000233b, 0x000050b8) + + (0x0000556f, 0x000055f8) + 0 + + + (0x40e41bf9, 0x5c44b1b1) + 0 + + + + (0x0000266b, 0x000033bb) + + (0x6f54afd0, 0x5f2e0f65) + 2 + + + (0x00003dec, 0x00004c7b) + 1 + + + + (0x00002e50, 0x00003fba) + + (0x00003dec, 0x00004c7b) + 0 + + + (0x09c41dd7, 0x09f2e37b) + 0 + + + + (0x00003835, 0x000030a7) + + (0x00002bb3, 0x0000133c) + 0 + + + (0x6f54afd0, 0x5f2e0f65) + 0 + + + + (0x00004944, 0x00005bde) + + (0x00007786, 0x00001163) + 0 + + + (0x00003d0e, 0x000025ef) + 0 + + + + (0x00005b72, 0x00000606) + + (0x0000445b, 0x000068e3) + 0 + + + (0x2e63c8c5, 0x79a8ae7b) + 2 + + + + (0x00006403, 0x000024ec) + + (0x0000470b, 0x00001b1d) + 0 + + + (0x2e63c8c5, 0x79a8ae7b) + 0 + + + + (0x00006501, 0x000068bf) + + (0x6f54afd0, 0x5f2e0f65) + 2 + + + (0x00007786, 0x00001163) + 0 + + + + (0x00006592, 0x00002f7e) + + (0x00002bb3, 0x0000133c) + 2 + + + (0x6f54afd0, 0x5f2e0f65) + 2 + + + + (0x00006967, 0x00006431) + + (0x6f54afd0, 0x5f2e0f65) + 1 + + + (0x0000556f, 0x000055f8) + 0 + + + + (0x00006c4d, 0x0000126f) + + (0x40e41bf9, 0x5c44b1b1) + 0 + + + (0x6d03daab, 0x55fdea78) + 0 + + + + (0x000074af, 0x000038c2) + + (0x6f54afd0, 0x5f2e0f65) + 2 + + + (0x008f57e1, 0x2790537b) + 2 + + + + (0x0000756d, 0x000027c0) + + (0x6d03daab, 0x55fdea78) + 0 + + + (0x00003dec, 0x00004c7b) + 0 + + + + (0x00007a3d, 0x000044a6) + + (0x000043a8, 0x00004ec3) + 0 + + + (0x0000470b, 0x00001b1d) + (0x00000000, 0x16595537) + + + + (0x00007b30, 0x00005e90) + + (0x00007786, 0x00001163) + 0 + + + (0x0000445b, 0x000068e3) + 1 + + + + (0x00f1a11e, 0x4a813bb8) + + (0x09c41dd7, 0x09f2e37b) + 0 + + + (0x0e30a73f, 0x7ae6d95a) + 0 + + + + (0x0de02dd1, 0x545eff87) + + (0x6f54afd0, 0x5f2e0f65) + 1 + + + (0x008f57e1, 0x2790537b) + 1 + + + + (0x136dcee0, 0x20dbb005) + + (0x28b5e192, 0x37431137) + 0 + + + (0x0000445b, 0x000068e3) + 0 + + + + (0x2893bc68, 0x5c0429ec) + + (0x6f54afd0, 0x5f2e0f65) + 0 + + + (0x008f57e1, 0x2790537b) + 0 + + + + (0x3ccbcbed, 0x529f3e1d) + + (0x0e30a73f, 0x7ae6d95a) + 0 + + + (0x28b5e192, 0x37431137) + 0 + + + + + + (0x1012e1de, 0x78e57c3e) + The stimulation part of the scenario is +similar to scenario <i>1-acquisition</i>. + +If you keep the <i>Target Letter Generation</i> +box, you will be able to train the algorithms +again on the recorded data. + + + + (0x473d9a43, 0x97fc0a97) + 1120 + + + (0x7234b86b, 0x2b8651a5) + 592 + + + + + (0x11fceaee, 0x1f87d83c) + Switch from file reader +to Acquisiton client to use it online + + + (0x473d9a43, 0x97fc0a97) + 176.000000 + + + (0x7234b86b, 0x2b8651a5) + -48.000000 + + + + + (0x27567f54, 0x6e00503a) + You can configure the Flashing Sequence +and the Target Letter Generation in order to +instruct the subject to <u>spell a specific word</u>. + +Set the target word in the Lua Stimulator (e.g. "openvibe") +and adapt the number of trials in the P300 Speller Stimulator +(e.g. 8 trials for the 8 letters in "openvibe") + +<b><u>Note:</u></b> If the number of letter in the chosen word does not match +the number of trial, you won't be able to train xDAWN and +the classifier on the recorded data. + + + (0x473d9a43, 0x97fc0a97) + 128.000000 + + + (0x7234b86b, 0x2b8651a5) + 576.000000 + + + + + (0x3726b6f5, 0x3dea5d78) + <u><b><big>Overview</big></b></u> + +This scenario can be used online once the +spatial filter and the classifiers are trained. +The <i>Target Letter Generation</i> +box still proposes some targets in order to +eventually train the spatial filter / classifier +again, but you may want to disconnect that box +in order to have a real <i>free time</i> use of +the speller. + +The flash sequence starts automatically after 20 sec. + +You will then be presented a blue letter that +you have to focus on, followed by a 12 times +flashing sequence of the whole grid. The detected +letter will be presented in green. This will be repeated +10 times. + +If the performance of the system does not fit your +requirements, just run <i>2-train-xDAWN</i> and <i>3-train-classifier</i> +scenarios again on the data you just recorded. + +<small><i><b>note:</b> the recorded files go to the +folder where the scenario xml is located +(<span color="darkblue">${Player_ScenarioDirectory}/</span>).</i></small> + + + (0x473d9a43, 0x97fc0a97) + 192 + + + (0x7234b86b, 0x2b8651a5) + -48 + + + + + (0x421933f6, 0x00705e90) + The preprocessing of the signal is +performed here... + +<u><b>Note:</b></u> be sure that the +<i>sampling rate</i> and <i>sample count +per buffer</i> you use in the <u>acquisition +server</u> are compatible with the actual +<i>signal decimation factor</i> + + + (0x473d9a43, 0x97fc0a97) + 192 + + + (0x7234b86b, 0x2b8651a5) + 240 + + + + + (0x5bbc727e, 0x1572a9cd) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 608.000000 + + + (0x7234b86b, 0x2b8651a5) + -288.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00002ae2, 0x00004e06)","childCount":0,"identifier":"(0x000016ae, 0x000058fc)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0x2e63c8c5, 0x79a8ae7b)","childCount":0,"identifier":"(0x00001d62, 0x00007def)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Online Use + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/p300-speller-xdawn/ + + + (0xf6b2e3fa, 0x7bd43926) + xDAWN P300 Speller + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-accumulator.lua b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-accumulator.lua new file mode 100644 index 0000000..ac8240d --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-accumulator.lua @@ -0,0 +1,200 @@ + +function arrayMax(a) + if #a == 0 then return nil, nil end + local maxIdx, maxValue = 0, a[0] + for i = 1, (#a -1 ) do + if maxValue < a[i] then + maxIdx, maxValue = i, a[i] + end + end + return maxIdx, maxValue +end + +-- For handling target fifo + +List = {} +function List.new () + return {first = 0, last = -1} +end + +function List.pushright (list, value) + local last = list.last + 1 + list.last = last + list[last] = value +end + +function List.popleft (list) + local first = list.first + if first > list.last then + error("list is empty") + end + local value = list[first] + list[first] = nil -- to allow garbage collection + list.first = first + 1 + return value +end + +function List.isempty (list) + if list.first > list.last then + return true + else + return false + end +end + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + row_base = _G[box:get_setting(2)] + col_base = _G[box:get_setting(3)] + segment_start = _G[box:get_setting(4)] + segment_stop = _G[box:get_setting(5)] + + -- 0 inactive, 1 segment started, 2 segment stopped (can vote) + segment_status = 0 + + -- the idea is to push the flash states to the fifo, and when predictions arrive (with some delay), they are matched in oldest-first fashion. + target_fifo = List.new() + + -- box:log("Info", string.format("pop %d %d", id[1], id[2])) + + row_votes = {} + col_votes = {} + + do_debug = false + +end + +-- this function is called when the box is uninitialized +function uninitialize(box) + +end + +function process(box) + -- loops until box is stopped + while box:keep_processing() do + + -- first, parse the timeline stream + for stimulation = 1, box:get_stimulation_count(2) do + -- gets the received stimulation + local identifier, date, duration = box:get_stimulation(2, 1) + -- discards it + box:remove_stimulation(2, 1) + + if identifier == segment_start then + if do_debug then + box:log("Info", string.format("Trial start")) + box:log("Info", string.format("Clear votes")) + end + -- zero the votes + col_votes = {} + row_votes = {} + target_fifo = List.new() + -- fixme fixed 20 + for i = 0,20 do + col_votes[i] = 0 + row_votes[i] = 0 + end + segment_status = 1 + end + + -- Does the identifier code a flash? if so, put into fifo + if segment_status == 1 and identifier >= row_base and identifier <= OVTK_StimulationId_LabelEnd then + + -- assume rows before cols + if identifier < col_base then + local t = {"row", identifier - row_base} + List.pushright(target_fifo,t) + if do_debug then + box:log("Info", string.format("Push row target %d", identifier - row_base )) + end + else + local t = {"col", identifier - col_base} + List.pushright(target_fifo,t) + if do_debug then + box:log("Info", string.format("Push col target %d", identifier - col_base )) + end + end + + + end + + if identifier == segment_stop then + if do_debug then + box:log("Info", string.format("Trial stop")) + end + segment_status = 2 + end + + end + + -- then parse the classifications + for stimulation = 1, box:get_stimulation_count(1) do + + -- gets the received stimulation + local identifier, date, duration = box:get_stimulation(1, 1) + -- discards it + box:remove_stimulation(1, 1) + + -- Is it an in-class prediction? + if identifier == OVTK_StimulationId_Target then + local t = List.popleft(target_fifo) + if do_debug then + box:log("Info", string.format("Pred fifo %s %d is target", t[1], t[2])) + end + if t[1]=="row" then + row_votes[t[2]] = row_votes[t[2]] + 1 + else + col_votes[t[2]] = col_votes[t[2]] + 1 + end + end + + if identifier == OVTK_StimulationId_NonTarget then + local t = List.popleft(target_fifo) + if do_debug then + box:log("Info", string.format("Pred fifo %s %d is nontarget", t[1], t[2])) + end + end + + end + + if segment_status == 2 and List.isempty(target_fifo) then + -- output the vote after the segment end when we've matched all predictions + + local maxRowIdx, maxRowValue = arrayMax(row_votes) + local maxColIdx, maxColValue = arrayMax(col_votes) + + if maxRowValue == 0 and maxColValue == 0 then + box:log("Warning", string.format("Classifier predicted 'no p300' for all flashes of the trial")); + end + + if do_debug then + local rowVotes = 0 + local colVotes = 0 + for ir, val in pairs(row_votes) do + rowVotes = rowVotes + val + end + for ir, val in pairs(col_votes) do + colVotes = colVotes + val + end + + box:log("Info", string.format("Vote [%d %d] wt [%d,%d]", maxRowIdx+row_base, maxColIdx+col_base, maxRowValue, maxColValue)) + box:log("Info", string.format(" Total [%d %d]", rowVotes, colVotes)) + end + + + + local now = box:get_current_time() + + box:send_stimulation(1, maxRowIdx + row_base, now, 0) + box:send_stimulation(2, maxColIdx + col_base, now, 0) + + segment_status = 0 + end + + box:sleep() + end +end + diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-filter-flash.lua b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-filter-flash.lua new file mode 100644 index 0000000..9f13ff0 --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-filter-flash.lua @@ -0,0 +1,61 @@ + +-- Picks out 'flashes' from a stimulation stream + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + box:set_filter_mode(1); + + state = 0 + + do_debug = false +end + +-- this function is called when the box is uninitialized +function uninitialize(box) +end + +-- this function is called once by the box +function process(box) + + -- loop until box:keep_processing() returns zero + -- cpu will be released with a call to sleep + -- at the end of the loop + while box:keep_processing() do + + -- gets current simulated time + t = box:get_current_time() + + -- loops on every received stimulation for a given input + for stimulation = 1, box:get_stimulation_count(1) do + + -- gets stimulation + stimulation_id, stimulation_time, stimulation_duration = box:get_stimulation(1, 1) + + if stimulation_id == OVTK_StimulationId_SegmentStart then + state = 1 + elseif stimulation_id == OVTK_StimulationId_SegmentStop then + state = 0 + end + + -- If we're between 'rest start' and 'rest_stop', this specifies a target + if state == 1 and stimulation_id >= OVTK_StimulationId_LabelStart and stimulation_id <= OVTK_StimulationId_LabelEnd then + + box:send_stimulation(1, stimulation_id, stimulation_time, 0) + + if do_debug then + box:log("Info", string.format("Push a target %d at %f (now %f)", stimulation_id, stimulation_time, t)) + end + end + + -- discards it + box:remove_stimulation(1, 1) + + end + + -- releases cpu + box:sleep() + end +end diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-filter-target.lua b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-filter-target.lua new file mode 100644 index 0000000..f8c92db --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-filter-target.lua @@ -0,0 +1,61 @@ + +-- Picks out 'targets' from a stimulation stream + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + state = 0 + + box:set_filter_mode(1); + + do_debug = false +end + +-- this function is called when the box is uninitialized +function uninitialize(box) +end + +-- this function is called once by the box +function process(box) + + -- loop until box:keep_processing() returns zero + -- cpu will be released with a call to sleep + -- at the end of the loop + while box:keep_processing() do + + -- gets current simulated time + t = box:get_current_time() + + -- loops on every received stimulation for a given input + for stimulation = 1, box:get_stimulation_count(1) do + + -- gets stimulation + stimulation_id, stimulation_time, stimulation_duration = box:get_stimulation(1, 1) + + if stimulation_id == OVTK_StimulationId_RestStart then + state = 1 + elseif stimulation_id == OVTK_StimulationId_RestStop then + state = 0 + end + + -- If we're between 'rest start' and 'rest_stop', this specifies a target + if state == 1 and stimulation_id >= OVTK_StimulationId_LabelStart and stimulation_id <= OVTK_StimulationId_LabelEnd then + + box:send_stimulation(1, stimulation_id, stimulation_time, 0) + + if do_debug then + box:log("Info", string.format("Push a target %d at %f (now = %f)", stimulation_id, stimulation_time, t)) + end + end + + -- discards it + box:remove_stimulation(1, 1) + + end + + -- releases cpu + box:sleep() + end +end diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-launch.lua b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-launch.lua new file mode 100644 index 0000000..48f728f --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-launch.lua @@ -0,0 +1,21 @@ + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + stim = _G[box:get_setting(2)] + launchTime = box:get_setting(3) + +end + +-- this function is called when the box is uninitialized +function uninitialize(box) +end + +-- this function is called once by the box +function process(box) + + box:send_stimulation(1, stim, launchTime, 0) + +end diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-stimulator.lua b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-stimulator.lua new file mode 100644 index 0000000..ba142bd --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-stimulator.lua @@ -0,0 +1,150 @@ +-- This Lua script sends Stimulations to the speller visualization box for a p300-visual-speller +-- +-- Author : Tobias Baumann +-- Date : 2021-12-06 +-- Revised: 2021-21-07 + +--This function lets the box sleep until a fixed moment +function wait_until(box, time) + while box:get_current_time() < time do + box:sleep() + end +end + +--This function lets the box wait for a fixed duration +function wait_for(box, duration) + wait_until(box, box:get_current_time() + duration) +end + +--this function checks, wether value already is an element of the given stim_matrix +function is_element(matrix, value) + for i = 1, #matrix do + if #matrix == 0 then + return(false) + elseif value == matrix[i] then + return(true) + end + end + return(false) +end +--this function creates a sequence of stimulations by shuffeling the values of the given stim_matrix +function create_sequence(matrix) + math.randomseed(os.time()) + local stim_matrix = {} + local stim_code = 0 + local i = 1 + while i <= #matrix do + stim_code = matrix[math.random(1,#matrix)] + if is_element(stim_matrix, stim_code) == false then + stim_matrix[i] = stim_code + i = i + 1 + end + end + return(stim_matrix) +end + +-- this function is called when the box is initialized +function initialize(box) + --load stimulation codes + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + --load box settings + row_base = _G[box:get_setting(2)] + col_base = _G[box:get_setting(3)] + matrix_size = box:get_setting(4) + n_repetitions = box:get_setting(5) + flash_duration = box:get_setting(7) + noflash_duration = box:get_setting(8) + inter_repetition_delay = box:get_setting(9) + inter_trial_delay = box:get_setting(10) + send_toggle = _G[box:get_setting(11)] + time_to_send = box:get_setting(13) + + if box:get_setting(12) == 'true' then + free_spelling = true + n_trials = 1 + else + free_spelling = false + n_trials = box:get_setting(6) + end + + --Lua variables + send = false + row_stimcodes = {} + col_stimcodes = {} + for x = 1, matrix_size do + row_stimcodes[x] = row_base + x - 1 + end + for x = 1, matrix_size do + col_stimcodes[x] = col_base + x - 1 + end +end + +-- this function is called when the box is uninitialized +function uninitialize(box) + +end + +-- this function is called once by the box +function process(box) + while box:keep_processing() do + + if send then + for stimulation = 1, box:get_stimulation_count(1) do + stimulation_id, stimulation_time, stimulation_duration = box:get_stimulation(1, 1) + if stimulation_id == send_toggle then + send = false + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop ,box:get_current_time() , 0) + box:remove_stimulation(1, 1) + end + end + for trial = 1, n_trials do + if not send then + break + end + box:send_stimulation(1, OVTK_StimulationId_RestStart, box:get_current_time() , 0) + wait_for(box, inter_trial_delay) + box:send_stimulation(1, OVTK_StimulationId_RestStop, box:get_current_time() , 0) + box:send_stimulation(1, OVTK_StimulationId_TrialStart ,box:get_current_time() , 0) + for segment = 1, n_repetitions do + row_stimcodes = create_sequence(row_stimcodes) + col_stimcodes = create_sequence(col_stimcodes) + box:send_stimulation(1, OVTK_StimulationId_SegmentStart ,box:get_current_time() , 0) + for i = 1, matrix_size do + box:send_stimulation(1, row_stimcodes[i] ,box:get_current_time() , 0) + box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStart ,box:get_current_time() , 0) + wait_for(box, flash_duration) + box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStop ,box:get_current_time() , 0) + wait_for(box, noflash_duration) + + box:send_stimulation(1, col_stimcodes[i] ,box:get_current_time() , 0) + box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStart ,box:get_current_time() , 0) + wait_for(box, flash_duration) + box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStop ,box:get_current_time() , 0) + wait_for(box, noflash_duration) + end + box:send_stimulation(1, OVTK_StimulationId_SegmentStop ,box:get_current_time() , 0) + wait_for(box, inter_repetition_delay) + end + box:send_stimulation(1, OVTK_StimulationId_TrialStop ,box:get_current_time() , 0) + end + if not free_spelling then + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop ,box:get_current_time() , 0) + send = false + end + else + for stimulation = 1, box:get_stimulation_count(1) do + stimulation_id, stimulation_time, stimulation_duration = box:get_stimulation(1, 1) + if stimulation_id == send_toggle then + send = true + wait_for(box, time_to_send) + box:send_stimulation(1, OVTK_StimulationId_ExperimentStart ,box:get_current_time() , 0) + box:remove_stimulation(1, 1) + end + end + end + + -- releases cpu + box:sleep() + end +end \ No newline at end of file diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-target.lua b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-target.lua new file mode 100644 index 0000000..6b8d599 --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/scripts/p300-speller-target.lua @@ -0,0 +1,95 @@ +-- This Lua script generates target stimulations for the P300 visualization +-- box based on the matrix of letters / numbers a P300 speller has +-- +-- Author : Yann Renard, INRIA +-- Date : 2011-03-15 + +grid = +{ + { 'a', 'b', 'c', 'd', 'e', 'f' }, + { 'g', 'h', 'i', 'j', 'k', 'l' }, + { 'm', 'n', 'o', 'p', 'q', 'r' }, + { 's', 't', 'u', 'v', 'w', 'x' }, + { 'y', 'z', '1', '2', '3', '4' }, + { '5', '6', '7', '8', '9', '0' }, +} + +index = 0 + +function get_location(c) + for i = 1, 6 do + for j = 1, 6 do + if grid[i][j] == c then + return i, j + end + end + end + return 0, 0 +end + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + math.randomseed(os.time()) + target = box:get_setting(2) + row_base = _G[box:get_setting(3)] + col_base = _G[box:get_setting(4)] + delay = box:get_setting(5) + if target == "" then + for i = 1, 1000 do + a = math.random(1, #grid) + b = math.random(1, #grid[1]) + target = target .. grid[a][b] + end + end +end + +-- this function is called when the box is uninitialized +function uninitialize(box) +end + +-- this function is called once by the box +function process(box) + + -- loop until box:keep_processing() returns zero + -- cpu will be released with a call to sleep + -- at the end of the loop + while box:keep_processing() do + + -- gets current simulated time + t = box:get_current_time() + + -- loops on every received stimulation for a given input + for stimulation = 1, box:get_stimulation_count(1) do + + -- gets stimulation + stimulation_id, stimulation_time, stimulation_duration = box:get_stimulation(1, 1) + + if stimulation_id == OVTK_StimulationId_RestStart then + + -- finds a new target + index = index + 1 + r, c = get_location(string.sub(target, index, index)) + + -- triggers the target + box:send_stimulation(1, row_base+r-1, t+delay, 0) + box:send_stimulation(1, col_base+c-1, t+delay, 0) + + elseif stimulation_id == OVTK_StimulationId_ExperimentStop then + + -- triggers train stimulation + box:send_stimulation(1, OVTK_StimulationId_Train, t+delay+1, 0) + + end + + -- discards it + box:remove_stimulation(1, 1) + + end + + -- releases cpu + box:sleep() + end +end diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/signals/README.txt b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/signals/README.txt new file mode 100644 index 0000000..ac04efc --- /dev/null +++ b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/signals/README.txt @@ -0,0 +1,3 @@ + +The scenario will record its signals here. + diff --git a/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/signals/p300-xdawn-train.ov b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/signals/p300-xdawn-train.ov new file mode 100644 index 0000000..dfc41ff Binary files /dev/null and b/Masterarbeit/Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/signals/p300-xdawn-train.ov differ diff --git a/Masterarbeit/Projekte/test.xml b/Masterarbeit/Projekte/test.xml new file mode 100644 index 0000000..97335df --- /dev/null +++ b/Masterarbeit/Projekte/test.xml @@ -0,0 +1,197 @@ + + 2 + OpenViBE Designer + 3.1.0 + + + + + + (0x3e08c82e, 0x0d2d24a4) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x7b2b7b39, 0x5af5da4c) + Sinus oscillator + (0x7e33bdb8, 0x68194a4a) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + + + (0x70a72d33, 0x184ded92) + + (0x7b2b7b39, 0x5af5da4c) + 0 + + + (0x3e08c82e, 0x0d2d24a4) + 0 + + + + + + + (0x62d57af8, 0x33db2614) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0e97678d, 0x6ef258bb)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0x3e08c82e, 0x0d2d24a4)","childCount":0,"identifier":"(0x7c573eef, 0x20de4327)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x462bc06b, 0x0d9f0c93)","index":0,"name":"Default tab","parentIdentifier":"(0x0e97678d, 0x6ef258bb)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x5328ab5c, 0x6312ede4)","index":0,"name":"Empty","parentIdentifier":"(0x462bc06b, 0x0d9f0c93)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/UIController.py b/Masterarbeit/UIController.py new file mode 100644 index 0000000..9bde1eb --- /dev/null +++ b/Masterarbeit/UIController.py @@ -0,0 +1,25 @@ +from UIModell import * +from UIView import * + + +class Controller(): + + def __init__(self, m, v): + self.model = m + self.view = v + + def test(self): + self.model.trainXDawn() + + def commandoCopySpelling(self): + self.model.startCopySpelling() + self.model.trainXDawn() + self.model.rainClassifier() + + def commandFreeSpelling(self): + self.model.freeSpelling() + + def commandStop(self): + self.model.killProzess() + + diff --git a/Masterarbeit/UIController.pyc b/Masterarbeit/UIController.pyc new file mode 100644 index 0000000..16653f4 Binary files /dev/null and b/Masterarbeit/UIController.pyc differ diff --git a/Masterarbeit/UIModell.py b/Masterarbeit/UIModell.py new file mode 100644 index 0000000..d940b1e --- /dev/null +++ b/Masterarbeit/UIModell.py @@ -0,0 +1,99 @@ +from subprocess import * +import os + +class Modell(): + PATH_OV = 'meta/dist/designer-Release/openvibe-designer.sh' + PATH_FILES = 'Projekte/OpenViBE_visual_BCI-master/openvibe_visual_bci/' + + def __init__(self): + pass + + + def startCopySpelling(self): + print("start copySpelling") + path = self.PATH_FILES + 'p300-visual-1-acquisition.xml' + process = Popen(['bash', self.PATH_OV, '--play', path, '--no-gui'], + stdout=PIPE, + universal_newlines=True) + while True: + output = process.stdout.readline() + print(output.strip()) + x = output.find("schlagwort?") + if(x != -1): + print("Training finished") + process.terminate() + break + + self.killProzess() + + def trainXDawn(self): + print("start training Xdawn") + path = self.PATH_FILES + 'p300-visual-2-train-xDAWN.xml' + process = Popen(['bash', self.PATH_OV, '--play', path, '--no-gui'], + stdout=PIPE, + universal_newlines=True) + while True: + output = process.stdout.readline() + print(output.strip()) + x = output.find("Training finished and saved") + if(x != -1): + print("Training finished") + process.terminate() + break + + self.killProzess() + + + def trainClassifier(self): + print("start training Classifier") + path = self.PATH_FILES + 'p300-visual-3-train-classifier.xml' + process = Popen(['bash', self.PATH_OV, '--play', path, '--no-gui'], + stdout=PIPE, + universal_newlines=True) + while True: + output = process.stdout.readline() + print(output.strip()) + x = output.find("schlagwort?") + if(x != -1): + print("Training finished") + process.terminate() + break + + self.killProzess() + + def freeSpelling(self): + print("start freeSpelling") + path = self.PATH_FILES + 'p300-visual-4-online.xml' + process = Popen(['bash', self.PATH_OV, '--play', path, '--no-gui'], + stdout=PIPE, + universal_newlines=True) + while True: + output = process.stdout.readline() + print(output.strip()) + x = output.find("schlagwort?") + if(x != -1): + print("End Spelling") + process.terminate() + break + + self.killProzess() + + def killProzess(self): + print('start killing') + pidOV = 0 + pidP = 0 + items = [] + + prozesse = Popen(["ps", "-e"], stdout=PIPE).communicate()[0].strip() + zeilen = prozesse.split('\n') + for z in zeilen: + if(z.find("openvibe-design") != -1): + z = z.strip() + items = z.split(' ') + pidOV = items[0] + + #kill -TERM veranlasst dem Prozess sich selbst zu beenden (nicht erzwungen) + Popen(["kill", "-TERM", pidOV], stdout=PIPE).communicate() + + + print("killed openvibe-designer") diff --git a/Masterarbeit/UIModell.pyc b/Masterarbeit/UIModell.pyc new file mode 100644 index 0000000..65640f4 Binary files /dev/null and b/Masterarbeit/UIModell.pyc differ diff --git a/Masterarbeit/UIView.py b/Masterarbeit/UIView.py new file mode 100644 index 0000000..2143599 --- /dev/null +++ b/Masterarbeit/UIView.py @@ -0,0 +1,5 @@ + + +class View(): + def __init__(self): + pass diff --git a/Masterarbeit/UIView.pyc b/Masterarbeit/UIView.pyc new file mode 100644 index 0000000..97a9df3 Binary files /dev/null and b/Masterarbeit/UIView.pyc differ diff --git a/Masterarbeit/gui.py b/Masterarbeit/gui.py new file mode 100644 index 0000000..79f261c --- /dev/null +++ b/Masterarbeit/gui.py @@ -0,0 +1,10 @@ +from UIView import * +from UIModell import * +from UIController import * + +model = Modell() +view = View() +controller = Controller(model,view) + + +controller.test() \ No newline at end of file diff --git a/Masterarbeit/meta b/Masterarbeit/meta new file mode 160000 index 0000000..d760266 --- /dev/null +++ b/Masterarbeit/meta @@ -0,0 +1 @@ +Subproject commit d7602663166ba2397e4f9a8f3a74053e82937d86 diff --git a/Masterarbeit/openvibe/designer-master.tar b/Masterarbeit/openvibe/designer-master.tar new file mode 100644 index 0000000..ee85993 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master.tar differ diff --git a/Masterarbeit/openvibe/designer-master/.gitignore b/Masterarbeit/openvibe/designer-master/.gitignore new file mode 100644 index 0000000..e8d2e9e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/.gitignore @@ -0,0 +1,22 @@ +local-tmp +dependencies +dependencies_x64 +scripts/win32-dependencies.cmd +dist +build +libraries/doc-tmp +CMakeLists.txt.* +CustomCMakeLists.txt +.*.swp +*~ +*.swp +# .build is generated on automated packaging on CI +.build +# this file can be copied from skeleton, and updated with appropriate credentials +scripts/windows-install-dependencies-custom.cmd +scripts/windows-install-dependencies-x64-custom.cmd +.version + +# Temp & Software Folder +.vs/ +.vscode/ \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/CMakeLists.txt b/Masterarbeit/openvibe/designer-master/CMakeLists.txt new file mode 100644 index 0000000..9e5b252 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/CMakeLists.txt @@ -0,0 +1,304 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 3.4) + +cmake_policy(SET CMP0026 OLD) +cmake_policy(SET CMP0039 NEW) +cmake_policy(SET CMP0042 OLD) +cmake_policy(SET CMP0043 OLD) +cmake_policy(SET CMP0045 OLD) +cmake_policy(SET CMP0048 OLD) +cmake_policy(SET CMP0057 NEW) + +PROJECT(Designer) +SET(CMAKE_INSTALL_LIBDIR lib) # Fix for non debian-based distrib, as it seeems to be a common occurence to name this folder lib32/lib64 +LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake-modules") +# OpenViBE-specific helper functions that are used by the CMakeLists of the subprojects. +INCLUDE("OvAddProjects") +INCLUDE("OvInstallLaunchScript") +INCLUDE("OvLinkBoostLib") +INCLUDE("OvDelayLoad") +INCLUDE("SetProjectVersion") +INCLUDE("Utilities") # Include functions debug_message, SET_BUILD_PLATFORM + +# ---------------------- +# Build CMake flags +# ---------------------- +OPTION(Flag_VerboseOutput "Verbose CMake output" OFF) +SET(OEM_DISTRIBUTION "openvibe" CACHE STRING "The OEM distribution for this build, can be openvibe or mensia") +OPTION(OV_DISPLAY_ERROR_LOCATION ON) + +SET(OV_SOURCE_DEPENDENCIES_PATH "${CMAKE_SOURCE_DIR}/dependencies-source") +SET(OV_ICON_PATH "${CMAKE_SOURCE_DIR}/scripts/icons") + +if(NOT(${Flag_VerboseOutput})) + set(CMAKE_INSTALL_MESSAGE LAZY) +endif() + +IF(WIN32) + IF("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + SET(OV_DEPENDENCIES_PLATFORM_FOLDER_NAME "dependencies_x64") + ELSEIF("${CMAKE_SIZEOF_VOID_P}" EQUAL "4") + SET(OV_DEPENDENCIES_PLATFORM_FOLDER_NAME "dependencies") + ELSE() + SET(OV_DEPENDENCIES_PLATFORM_FOLDER_NAME "dependencies") + ENDIF() +ELSE() + SET(OV_DEPENDENCIES_PLATFORM_FOLDER_NAME "dependencies") +ENDIF() + +LIST(APPEND LIST_DEPENDENCIES_PATH "${CMAKE_SOURCE_DIR}/${OV_DEPENDENCIES_PLATFORM_FOLDER_NAME}") + +# ---------------------- +# Set build version +# ---------------------- + +# These versions are used by the subprojects by default. +set_version() +# Sets the PROJECT_VERSION variable to something, depending on overriding OvSetProjectVersion.cmake files +SET_PROJECT_VERSION() +MESSAGE(STATUS "BUILDING VERSION Designer: ${OV_GLOBAL_VERSION_STRING} Branch : ${OV_PROJECT_BRANCH}~${OV_PROJECT_COMMITHASH}. Based on OpenViBE SDK: ${OV_SDK_VERSION_STRING}") + +# Sort target into directories for better visualization in IDE +SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON) +SET(APP_FOLDER Applications) +SET(MODULES_FOLDER Modules) +SET(PLUGINS_FOLDER Plugins) +SET(TESTS_FOLDER Unit-Tests) +SET(VALIDATION_FOLDER Validation-Tests) + +IF(NOT CMAKE_INSTALL_PREFIX) + # Default is to build to dist/. If you wish a custom install, set your own MAKE_INSTALL_PREFIX when you call CMake. Safest to do under a fakeroot. + SET(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/dist") +ENDIF() + +IF(NOT DEFINED OV_PACKAGE) + SET(OV_PACKAGE FALSE) +ENDIF() + +# Setup knowledge of GNU-style install path variables +INCLUDE("GNUInstallDirs") + +if(NOT CMAKE_BUILD_TYPE AND CMAKE_GENERATOR MATCHES "Visual Studio*") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_INSTALL_PREFIX}/bin" ) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_INSTALL_PREFIX}/lib" ) + foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} ) + string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU ) + string(CONCAT DIST_ROOT ${DIST_ROOT} $<$:${CMAKE_INSTALL_PREFIX}/${OUTPUTCONFIG}>) + set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIGU} "${CMAKE_INSTALL_PREFIX}/${OUTPUTCONFIG}/bin" ) + set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIGU} "${CMAKE_INSTALL_PREFIX}/${OUTPUTCONFIG}/lib" ) + endforeach() + set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "OV_CMAKE_PATH_ROOT=\"${DIST_ROOT}\"") + set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "OV_CMAKE_PATH_BIN=\"${DIST_ROOT}/bin\"") + set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "OV_CMAKE_PATH_LIB=\"${DIST_ROOT}/lib\"") + set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "OV_CMAKE_PATH_DATA=\"${DIST_ROOT}/share/openvibe\"") + set(DIST_BINDIR ${DIST_ROOT}/bin) + set(DIST_LIBDIR ${DIST_ROOT}/lib) + set(DIST_INCLUDEDIR ${DIST_ROOT}/include) + set(DIST_DATADIR ${DIST_ROOT}/share) + set(DIST_DOCDIR ${DIST_ROOT}/doc) + set(DIST_DOCTMP ${DIST_ROOT}/doc-tmp) + set(DIST_SYSCONFDIR ${DIST_ROOT}/etc) + # Install the .install file inside the dists folders + install(FILES ${CMAKE_BINARY_DIR}/.install DESTINATION ${DIST_ROOT}) +elseif(CMAKE_BUILD_TYPE AND OV_PACKAGE) + # Add directories that OpenViBE will use to look for its components runtime, unless overridden by environment variables in the launch scripts. + # These defines should only be used in "openvibe/ov_directories.h". + + add_definitions(-DOV_CMAKE_PATH_ROOT="${CMAKE_INSTALL_PREFIX}") + add_definitions(-DOV_CMAKE_PATH_BIN="${CMAKE_INSTALL_FULL_BINDIR}") + add_definitions(-DOV_CMAKE_PATH_LIB="${CMAKE_INSTALL_FULL_LIBDIR}") + add_definitions(-DOV_CMAKE_PATH_DATA="${CMAKE_INSTALL_FULL_DATADIR}/openvibe") + set(CMAKE_INSTALL_PREFIX .) + set(DIST_ROOT ${CMAKE_INSTALL_PREFIX}) + set(DIST_BINDIR ${CMAKE_INSTALL_BINDIR}) + set(DIST_LIBDIR ${CMAKE_INSTALL_LIBDIR}) + set(DIST_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR}) + set(DIST_DATADIR ${CMAKE_INSTALL_DATADIR}) + set(DIST_DOCDIR ${DIST_ROOT}/doc) + set(DIST_DOCTMP ${DIST_ROOT}/doc-tmp) + set(DIST_SYSCONFDIR ${CMAKE_INSTALL_SYSCONFDIR}) + set(CPACK_GENERATOR "ZIP") + set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF) + set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "OpenViBE Designer") + set(CPACK_PACKAGE_VENDOR "Inria & Mensia Technologies") + set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md") + set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING.md") + set(CPACK_PACKAGE_VERSION ${OV_GLOBAL_VERSION_MAJOR}.${OV_GLOBAL_VERSION_MINOR}.${OV_GLOBAL_VERSION_PATCH}.${OV_GLOBAL_VERSION_BUILD}) + set(CPACK_PACKAGE_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) + set(CPACK_PACKAGE_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) + set(CPACK_PACKAGE_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) + if(UNIX) + execute_process(COMMAND bash -c "echo -n $(lsb_release -i -s)$(lsb_release -r -s)" + OUTPUT_VARIABLE CPACK_SYSTEM_NAME) + endif() + + IF("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + SET(PLATFORM_TARGET "x64") + ELSEIF("${CMAKE_SIZEOF_VOID_P}" EQUAL "4") + SET(PLATFORM_TARGET "x86") + ELSE() + SET(PLATFORM_TARGET "Unknown") + ENDIF() + + set(CPACK_PACKAGE_NAME "OpenViBE${CMAKE_PROJECT_NAME}-${CMAKE_BUILD_TYPE}-${PLATFORM_TARGET}") + include(CPack) +elseif(CMAKE_BUILD_TYPE) + # Add directories that OpenViBE will use to look for its components runtime, unless overridden by environment variables in the launch scripts. + # These defines should only be used in "openvibe/ov_directories.h". + add_definitions(-DOV_CMAKE_PATH_ROOT="${CMAKE_INSTALL_PREFIX}") + add_definitions(-DOV_CMAKE_PATH_BIN="${CMAKE_INSTALL_FULL_BINDIR}") + add_definitions(-DOV_CMAKE_PATH_LIB="${CMAKE_INSTALL_FULL_LIBDIR}") + add_definitions(-DOV_CMAKE_PATH_DATA="${CMAKE_INSTALL_FULL_DATADIR}/openvibe") + set(DIST_ROOT ${CMAKE_INSTALL_PREFIX}) + set(DIST_BINDIR ${CMAKE_INSTALL_FULL_BINDIR}) + set(DIST_LIBDIR ${CMAKE_INSTALL_FULL_LIBDIR}) + set(DIST_INCLUDEDIR ${CMAKE_INSTALL_FULL_INCLUDEDIR}) + set(DIST_DATADIR ${CMAKE_INSTALL_FULL_DATADIR}) + set(DIST_DOCDIR ${DIST_ROOT}/doc) + set(DIST_DOCTMP ${DIST_ROOT}/doc-tmp) + set(DIST_SYSCONFDIR ${CMAKE_INSTALL_FULL_SYSCONFDIR}) +else() + message(FATAL_ERROR "Build should specify a type or use a multi-type generator (like Visual Studio)") +endif() + +find_path(SDK_MODULE_PATH NAMES "AddOpenViBESDKComponents.cmake" PATHS ${OPENVIBE_SDK_PATH} PATH_SUFFIXES share NO_DEFAULT_PATH) # Finds multi-type builds + +if(CMAKE_BUILD_TYPE) + string(TOLOWER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_LOWER) + find_path(SDK_MODULE_PATH NAMES AddOpenViBESDKComponents.cmake PATHS ${OPENVIBE_SDK_PATH};${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES openvibe-sdk-${CMAKE_BUILD_TYPE_LOWER}/share NO_DEFAULT_PATH) # Find "regular builds +else() + find_path(SDK_MODULE_PATH NAMES "AddOpenViBESDKComponents.cmake" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES openvibe-sdk-Debug/share openvibe-sdk-Release/share NO_DEFAULT_PATH) # Finds multi-type builds +endif() + +if(SDK_MODULE_PATH) + LIST(APPEND CMAKE_MODULE_PATH ${SDK_MODULE_PATH}) +endif() +include(FindOVSDK) +# include(AddOpenViBESDKComponents) +# OpenViBE SDK modules list +SET(INCLUDED_OV_SDK_COMPONENTS BASE ALLPLUGINS EBML SYSTEM FS XML TOOLKIT) + + +string(TIMESTAMP COPYRIGHT_DATE "2012-%Y") + +# We deduce the branding from the OEM_DISTRIBUTION +IF(OEM_DISTRIBUTION STREQUAL "openvibe") + SET(OV_CONFIG_SUBDIR "OpenVIBE" CACHE STRING "Subdirectory under user directory when configuration and logs will be saved") + SET(BRAND_NAME "OpenViBE") + SET(COMPANY_NAME "Inria") + SET(DESIGNER_NAME "Designer") + SET(LICENCE_TEXT "\ +This program is free software: you can redistribute it and/or modify\ +it under the terms of the GNU Affero General Public License as\ +published by the Free Software Foundation, either version 3 of the\ +License, or (at your option) any later version.\ +\ +This program is distributed in the hope that it will be useful, but\ +WITHOUT ANY WARRANTY; without even the implied warranty of\ +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\ +Affero General Public License for more details.\ +\ +You should have received a copy of the GNU Affero General Public\ +License along with this program. If not, see http://www.gnu.org/licenses/ .") +ELSEIF(OEM_DISTRIBUTION STREQUAL "mensia") + SET(OV_CONFIG_SUBDIR "mensia" CACHE STRING "Subdirectory under user directory when configuration and logs will be saved") + SET(BRAND_NAME "NeuroRT") + SET(DESIGNER_NAME "Studio") + SET(COMPANY_NAME "Mensia Technologies SA") + ADD_DEFINITIONS(-DMENSIA_DISTRIBUTION) +ELSE() + MESSAGE(FATAL_ERROR "OEM_DISTRIBUTION unrecognized (${OEM_DISTRIBUTION}) ! CMake cannot deduce the brand and product names. ") +ENDIF() + +IF(OV_DISPLAY_ERROR_LOCATION) + ADD_DEFINITIONS(-DOV_DISPLAY_ERROR_LOCATION) +ENDIF() + +# The user files will be stored in .../OV_CONFIG_SUBDIR folder +ADD_DEFINITIONS("-DOV_PROJECT_NAME=\"openvibe\"") +ADD_DEFINITIONS("-DOV_CONFIG_SUBDIR=\"${OV_CONFIG_SUBDIR}\"") + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +IF(WIN32) + ADD_DEFINITIONS("-DNOMINMAX -DBOOST_ALL_NO_LIB") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4355") + SET(OV_WIN32_BOOST_VERSION "1_58") +ELSEIF(APPLE) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") +ELSEIF(UNIX) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") + FIND_PATH(PKGCONFIG_PATH lib/pkgconfig/atk.pc PATHS ${LIST_DEPENDENCIES_PATH}) + SET(ENV{PKG_CONFIG_PATH} "${PKGCONFIG_PATH}/lib/pkgconfig") +ELSE(WIN32) + MESSAGE(WARNING "Warning: unknown platform") +ENDIF(WIN32) + +# Print the used compilation parameters (for transparency) +GET_DIRECTORY_PROPERTY(TMP_DEFINITIONS COMPILE_DEFINITIONS) +debug_message("Compilation flags used at source root: ") +debug_message(" COMPILE_DEFINITIONS = '${TMP_DEFINITIONS}'") +debug_message(" CMAKE_CXX_FLAGS = '${CMAKE_CXX_FLAGS}'") +debug_message(" CMAKE_CXX_FLAGS_RELEASE = '${CMAKE_CXX_FLAGS_RELEASE}'") +debug_message(" CMAKE_CXX_FLAGS_DEBUG = '${CMAKE_CXX_FLAGS_DEBUG}'") + +# if no specific branch has been given for an openvibe component, default is to compile its trunk folder +## SET(OV_TRUNK "trunc") + +# By setting SKIP[_FOLDER]* you can skip a subtree (example: SKIP_A_B_C skips folder a/b/c and all its subfolders if any) + +# Custom cmakelist can be used to overwrite the default compilation & packaging parameters +IF(EXISTS "${CMAKE_SOURCE_DIR}/CustomCMakeLists.txt") + debug_message("Found custom build settings") + INCLUDE("${CMAKE_SOURCE_DIR}/CustomCMakeLists.txt") +ENDIF() + + +################################################################# +string(TOLOWER ${BRAND_NAME} LOWER_BRAND_NAME) +string(TOLOWER ${DESIGNER_NAME} LOWER_DESIGNER_NAME) +ADD_DEFINITIONS(-DBRAND_NAME="${BRAND_NAME}") +ADD_DEFINITIONS(-DDESIGNER_NAME="${DESIGNER_NAME}") +################################################################# + +SET(OV_LAUNCHER_SOURCE_PATH "${CMAKE_SOURCE_DIR}/cmake-modules/launchers") + +# a list of all project which will be filled by the directory traversal. This is needed to generate the documentation. +SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS "") +SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS_BUILD_DIR "") + +# Used by the various Find* scripts to locate OpenViBE modules +SET(OV_BASE_DIR ${CMAKE_SOURCE_DIR}) + +# needed for making visual studio projects when this script is called without CMAKE_BUILD_TYPE +SET_PROPERTY(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_DEBUG "TARGET_BUILDTYPE_Debug") +SET_PROPERTY(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_RELEASE "TARGET_BUILDTYPE_Release") +SET_PROPERTY(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_RELWITHDEBINFO "TARGET_BUILDTYPE_Release") + +MESSAGE(STATUS "Building ${BRAND_NAME} ${DESIGNER_NAME} [${OEM_DISTRIBUTION}] Version : ${PROJECT_VERSION} ${OV_PROJECT_BRANCH}~${OV_PROJECT_COMMITHASH}") + +# Add vendor specific installation instructions +# Traverse these directories and build their components + +ADD_SUBDIRECTORY("documentation/") + +IF(NOT(SKIP_PLUGINS)) + ADD_SUBDIRECTORY("plugins/") +ENDIF() + +IF(NOT(SKIP_APPLICATIONS)) + ADD_SUBDIRECTORY("applications/") +ENDIF() + +IF(NOT(SKIP_LIBRARIES)) + ADD_SUBDIRECTORY("libraries/") +ENDIF() + +IF(NOT(SKIP_VISUALIZATION_TOOLKIT)) + ADD_SUBDIRECTORY("visualization-toolkit/") +ENDIF() + +# add the scripts to the project so IDEs using the CMake file are aware of them +FILE(GLOB_RECURSE script_files scripts/*.cmd scripts/*.sh ) +ADD_CUSTOM_TARGET(openvibe-scripts SOURCES ${script_files}) + +INSTALL(FILES "${CMAKE_BINARY_DIR}/.install" DESTINATION ${CMAKE_INSTALL_PREFIX}) diff --git a/Masterarbeit/openvibe/designer-master/COPYING.md b/Masterarbeit/openvibe/designer-master/COPYING.md new file mode 100644 index 0000000..dba13ed --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/COPYING.md @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/Masterarbeit/openvibe/designer-master/README.md b/Masterarbeit/openvibe/designer-master/README.md new file mode 100644 index 0000000..198ee4c --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/README.md @@ -0,0 +1,80 @@ +# OpenViBE Designer + +This repository contains the Designer graphical interface, based on OpenViBE SDK. It also contains various visualization plugins. + +## Build + +In order to compile this project you will need to have the openvibe-sdk dependency compiled somewhere. You can install the last released version +via dependencies or use a folder compiled locally folder. + +Let us call this path `PATH_OPENVIBE_SDK`. The other requirement is to know where Certivibe dependencies can be found, let us call this path +`PATH_OPENVIBE_SDK_DEPENDENCIES`. Finally, let us call the location of the source code `PATH_DESIGNER_SOURCE`. + +### Pre-requisites + +In order to build Designer, you need a compiler installed. On Windows you need to have Visual Studio 2013 installed, the build system is based on CMake and Ninja, +if you don't want to install it on your system, then you can unzip it locally with command by: + +Going to `PATH_DESIGNER_SOURCE\scripts` and open command terminal, set variable PROXYPASS with `username:passwd` and run (or use `windows-install-dependencies-auth.cmd` -> see below): + +``` + powershell.exe -NoProfile -ExecutionPolicy Bypass -file "windows-get-dependencies.ps1" -manifest_file .\windows-build-tools.txt +``` + +### Windows + +#### Installing Designer Dependencies + +The simplest way to install dependencies, is, in folder `scripts`: + +* copy `windows-install-dependencies-auth.cmd-skeleton` +* rename it to `windows-install-dependencies-auth.cmd` +* edit line `set PROXYPASS=XXX:XXX` with appropriate usernamee and password +* run it whenever you want to update dependencies. + +This file is ignored by Git, since credentials should not be commited to repository. + +This script install build tools, SDK dependencies and Designer dependencies. If you have your own CMake install and want to use a local version of openvibe-sdk +you can comment the lines build-tools.txt. + +#### Compile the source code via the script + +The build script can be found in `PATH_DESIGNER_SOURCE\scripts` + +To build Designer in Release mode run: + + windows-build.cmd --sdk PATH_OPENVIBE_SDK --dep PATH_OPENVIBE_SDK_DEPENDENCIES + +#### Creating a Visual Studio project + +A Visual Studio project can be created using scripts. A generator can be found in the `PATH_DESIGNER_SOURCE\scripts` folder. + + windows-generate-vs-project.cmd --sdk "PATH_OPENVIBE_SDK" --dep "PATH_OPENVIBE_SDK_DEPENDENCIES" + +In order to open the visual studio with the correct paths: + + windows-launch-visual-studio.cmd --sdk "PATH_OPENVIBE_SDK" + +Note that currently, only building the project in Release mode is supported if you are using Visual Studio. + +### Linux + +#### Installing Designer Dependencies + +This installation guide supposes that you have already installed the OpenViBE SDK dependencies. + +Go to `PATH_DESIGNER_SOURCE/scripts` and run + + perl linux-install-dependencies.pl + +You will be asked for your root password which you have to grant to the script. + +#### Compile the source code via the script + +The build script is in `PATH_DESIGNER_SOURCE/scripts` + +Run it as so: + + ./unix-build --sdk=PATH_OPENVIBE_SDK + +This will build and install Designer in release mode into `PATH_DESIGNER_SOURCE/build/dist` diff --git a/Masterarbeit/openvibe/designer-master/applications/CMakeLists.txt b/Masterarbeit/openvibe/designer-master/applications/CMakeLists.txt new file mode 100644 index 0000000..9bae9bd --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/CMakeLists.txt @@ -0,0 +1,3 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("APPLICATIONS") diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/CMakeLists.txt b/Masterarbeit/openvibe/designer-master/applications/platform/CMakeLists.txt new file mode 100644 index 0000000..cf14819 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/CMakeLists.txt @@ -0,0 +1,4 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("APPLICATIONS_PLATFORM") + diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/CMakeLists.txt b/Masterarbeit/openvibe/designer-master/applications/platform/designer/CMakeLists.txt new file mode 100755 index 0000000..0da58bb --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/CMakeLists.txt @@ -0,0 +1,56 @@ +project(openvibe-designer) + +set(PROJECT_PRODUCT_NAME "${BRAND_NAME} Designer") + +if(WIN32) + # Should be uncommented once we stop using cmd as launcher + #SET(ENTRYPOINT WIN32) + set(ENTRYPOINT ) +else() + set(ENTRYPOINT ) +endif() + +file(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/visualization/*.cpp src/dynamic_settings/*.cpp) + +include("FindSourceDependencyJSON") + +set(SRC_FILES "${SRC_FILES};${CMAKE_BINARY_DIR}/resource-files/${LOWER_BRAND_NAME}-${LOWER_DESIGNER_NAME}.rc") +add_executable(${PROJECT_NAME} ${ENTRYPOINT} ${SRC_FILES}) + +# Generate launch script +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${LOWER_BRAND_NAME}-${LOWER_DESIGNER_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}" ICON_PATH "${OV_ICON_PATH}/designer.ico") + +SET(INCLUDED_OV_SDK_COMPONENTS BASE ALLPLUGINS ALLMODULES DEPENDENCIES) +include("AddOpenViBESDKComponents") +include("FindOpenViBEVisualizationToolkit") +include("FindThirdPartyGTK") +include("FindThirdPartyBoost") +include("FindThirdPartyBoost_System") +include("FindThirdPartyBoost_Thread") +include("FindThirdPartyBoost_Filesystem") + +add_definitions(-DProjectVersion=\"${OV_GLOBAL_VERSION_STRING}\") +add_definitions(-DM_VERSION_MAJOR=${OV_GLOBAL_VERSION_MAJOR}) +add_definitions(-DM_VERSION_MINOR=${OV_GLOBAL_VERSION_MINOR}) + +SET_BUILD_PLATFORM() + +# Install files +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + + +configure_file(share/designer.conf-base "${CMAKE_CURRENT_BINARY_DIR}/designer.conf" @ONLY) +configure_file(share/about-dialog.ui-base "${CMAKE_CURRENT_BINARY_DIR}/about-dialog.ui") +configure_file(share/interface.ui-base "${CMAKE_CURRENT_BINARY_DIR}/interface.ui") +configure_file(share/interface-settings.ui-base "${CMAKE_CURRENT_BINARY_DIR}/interface-settings.ui") + +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/designer.conf" DESTINATION ${DIST_DATADIR}/openvibe/applications/designer) +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/about-dialog.ui" DESTINATION ${DIST_DATADIR}/openvibe/applications/designer) +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/interface.ui" DESTINATION ${DIST_DATADIR}/openvibe/applications/designer) +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/interface-settings.ui" DESTINATION ${DIST_DATADIR}/openvibe/applications/designer) + +install(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/applications/designer PATTERN PATTERN "*-base*" EXCLUDE) + diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/about-dialog.ui-base b/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/about-dialog.ui-base new file mode 100644 index 0000000..7bc0029 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/about-dialog.ui-base @@ -0,0 +1,91 @@ + + + + + + 5 + False + True + dialog + @BRAND_NAME@ @DESIGNER_NAME@ + @OV_GLOBAL_VERSION_STRING@ + Software technologies for the development of new research, diagnostic and therapeutic solutions leveraging real-time EEG and neurofeedback. +Based on OpenViBE, a software from Inria. + + + @LICENCE_TEXT@ + + Inria & Mensia Technologies SA +--- +Contributors : + - Guillermo Andrade-Barroso / Inria + - Quentin Barthélémy / Mensia + - Laurent Bonnet / Mensia + - Alison Cellard / Inria + - Jérôme Chabrol / Inria + - Vincent Delannoy / Inria + - Morgane Fauvet / Mensia + - Charles Garraud / Inria + - Thierry Gaugry / Inria + - Esrevi Huynh / Mensia + - Anatole Lecuyer / Inria + - Jozef Legény / Mensia + - Jussi T. Lindgren / Inria + - Fabien Lotte / Inria + - Loïc Mahë / Inria + - Benoit Perrin / Mensia + - Alexis Placet / Mensia + - Yann Renard / Mensia + - Cédric Riou / Inria + - Guillaume Serrière / Inria + +Testers: + - Marie Prat / Mensia + - Agnès Dos Santos / Mensia + + + Inria & Mensia Technologies SA +--- +Documenters : + - Quentin Barthélémy / Mensia + - Laurent Bonnet / Mensia + - Jérôme Chabrol / Inria + - Morgane Fauvet / Mensia + - Charles Garraud / Inria + - Thierry Gaugry / Inria + - Esrevi Huynh / Mensia + - Jozef Legény / Mensia + - Jussi T. Lindgren / Inria + - Alexis Placet / Mensia + - Marie Prat / Mensia + - Yann Renard / Mensia + - Cédric Riou / Inria + - Agnès Dos Santos / Mensia + + + + + + + header_logo.png + True + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 2 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + + + False + end + 0 + + + + + + diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/designer.conf-base b/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/designer.conf-base new file mode 100644 index 0000000..5767be8 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/designer.conf-base @@ -0,0 +1,68 @@ +ProjectVersion_Major = @OV_GLOBAL_VERSION_MAJOR@ +ProjectVersion_Minor = @OV_GLOBAL_VERSION_MINOR@ +ProjectVersion_Patch = @OV_GLOBAL_VERSION_PATCH@ +ProjectVersion_Components = \{"openvibe-sdk":"@OV_SDK_VERSION_STRING@", "openvibe-designer":"@OV_GLOBAL_VERSION_MAJOR@.@OV_GLOBAL_VERSION_MINOR@.@OV_GLOBAL_VERSION_PATCH@"\} + +Designer_Locale = C +Designer_UndoRedoStackSize = 64 +Designer_ShowAlgorithms = false +Designer_ShowDeprecated = true +Designer_ShowOriginalBoxName = true +Designer_FullscreenEditor = false +#Designer_FullscreenVisualisation = true +Designer_UnaffectedVisualizationWindowWidth = 480 +Designer_UnaffectedVisualizationWindowHeight = 320 +#Designer_UnaffectedVisualisationWindowFullscreen = false +Designer_DefaultWorkingDirectory = ${Path_UserData} +Designer_WindowManager_Center = false +Designer_ScenarioFileNameTrimmingLimit = 15 +Designer_ScenarioTabsVerticalStack = false + +Designer_ThrowPopUpWhenBoxIsOutdated = false + +Designer_WebBrowserCommand_Windows = start "" +Designer_WebBrowserCommand_Linux = nohup xdg-open +Designer_WebBrowserCommand_MacOS = open +Designer_WebBrowserCommand = ${Designer_WebBrowserCommand_${OperatingSystem}} +Designer_WebBrowserCommandPostfix_Windows = +Designer_WebBrowserCommandPostfix_Linux = >/dev/null 2>&1 +Designer_WebBrowserCommandPostfix_MacOS = & +Designer_WebBrowserCommandPostfix = ${Designer_WebBrowserCommandPostfix_${OperatingSystem}} +Designer_WebBrowserOpenViBEHomepage = http://openvibe.inria.fr/ +Designer_WebBrowserSupportURL = ${Designer_WebBrowserOpenViBEHomepage}/tracker +Designer_WebBrowserHelpURLBase = ${Designer_WebBrowserOpenViBEHomepage}/documentation/@OV_GLOBAL_VERSION_STRING@ + +##################################################################################### +# Designer Help (F1) Configuration +##################################################################################### + +Designer_HelpBrowserCommand_Windows = ${Designer_WebBrowserCommand_Windows} +Designer_HelpBrowserCommand_Linux = ${Designer_WebBrowserCommand_Linux} +Designer_HelpBrowserCommand_MacOS = ${Designer_WebBrowserCommand_MacOS} +Designer_HelpBrowserCommand = ${Designer_WebBrowserCommand} +Designer_HelpBrowserCommandPostfix_Windows = ${Designer_WebBrowserCommandPostfix_Windows} +Designer_HelpBrowserCommandPostfix_Linux = ${Designer_WebBrowserCommandPostfix_Linux} +Designer_HelpBrowserCommandPostfix_MacOS = ${Designer_WebBrowserCommandPostfix_MacOS} +Designer_HelpBrowserURLBase = ${Designer_WebBrowserHelpURLBase} +Designer_HelpBrowserDocumentationIndex = ${Designer_WebBrowserOpenViBEHomepage}/documentation-index +Designer_HelpBrowserCommandPostfix = ${Designer_HelpBrowserCommandPostfix_${OperatingSystem}} + + +Designer_ScriptEditorCommand_Windows = notepad +Designer_ScriptEditorCommand_Linux = xdg-open +Designer_ScriptEditorCommand_MacOS = open +Designer_ScriptEditorCommand = ${Designer_ScriptEditorCommand_${OperatingSystem}} +Designer_PopUpOnError = false +Designer_AllowUpCastConnection = false +Designer_ConsoleLogWithHexa = false +Designer_ConsoleLogTimeInSecond = True +Designer_ConsoleLogTimePrecision = 3 + +Designer_FastForwardFactor = 100.0 + +#Use all OpenViBE plugins, including SDK, Designer and extras +Kernel_PluginsPatternMacOS = ${Path_Lib}/libopenvibe-plugins-*.dylib +Kernel_PluginsPatternLinux = ${Path_Lib}/libopenvibe-plugins-*.so +Kernel_PluginsPatternWindows = ${Path_Bin}/openvibe-plugins-*.dll + +Designer_CustomConfigurationFile = ${Path_UserData}/openvibe-designer.conf diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/designer.ico b/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/designer.ico new file mode 100644 index 0000000..dde314e Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/designer.ico differ diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/header_logo.png b/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/header_logo.png new file mode 100644 index 0000000..a2a3b92 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/header_logo.png differ diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/interface-archway.ui b/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/interface-archway.ui new file mode 100644 index 0000000..b7f2485 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/interface-archway.ui @@ -0,0 +1,444 @@ + + + + + + False + NeuroRT Engine Control Panel + 800 + 600 + True + normal + + + True + False + 2 + + + True + False + + + True + False + False + + + True + False + liststore-engine-connection-types + 0 + + + + 0 + + + + + + + False + True + + + + + True + False + Launch Engine Server + True + + + False + True + + + + + True + False + False + Configure Acquisition + True + gtk-properties + + + False + True + + + + + True + False + Acquire Impedance + True + gtk-go-up + + + False + True + + + + + True + False + False + Reinitialize Archway + True + gtk-refresh + + + False + True + + + + + True + False + + + False + True + + + + + True + False + False + Start Engine + True + gtk-media-play + + + False + True + + + + + True + False + False + Fast Forward + True + gtk-media-forward + + + False + True + + + + + True + False + False + Stop Engine + True + gtk-media-stop + + + False + True + + + + + False + True + 0 + + + + + True + False + <b>Available Pipelines</b> + True + + + False + True + 1 + + + + + True + True + never + automatic + + + 100 + 80 + True + False + none + + + True + True + liststore-pipelines + False + 1 + + + Id + + + right + monospace + + + 1 + + + + + + + 100 + Description + + + + 2 + + + + + + + Has Configuration + + + gtk-edit + + + 3 + + + + + + + + + + + True + True + 2 + + + + + True + False + end + + + 40 + True + False + + + False + False + 0 + + + + + False + True + 3 + + + + + + + 640 + 600 + False + Pipeline Configuration + 5 + True + True + dialog + True + dialog-engine-configuration + + + True + False + 2 + + + True + False + end + + + Apply + True + True + True + False + + + False + False + 0 + + + + + Cancel + True + True + True + False + + + False + False + 1 + + + + + False + True + 0 + + + + + True + True + automatic + automatic + + + True + False + none + + + True + True + liststore-pipeline-configuration + False + 0 + + + True + autosize + Name + + + + 1 + + + + + + + True + autosize + Default Value + + + + 2 + + + + + + + True + autosize + Value + + + True + + + 3 + + + + + + + + + + + True + True + 1 + + + + + + button-pipeline-configuration-apply + button-pipeline-configuration-cancel + + + + 100 + 1 + 10 + + + + + + + + + Local + + + LAN + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/interface-settings.ui-base b/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/interface-settings.ui-base new file mode 100644 index 0000000..f9048e7 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/interface-settings.ui-base @@ -0,0 +1,1245 @@ + + + + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + False + 5 + Color Gradient Editor... + center-on-parent + dialog + + + True + False + 2 + + + True + False + end + + + gtk-apply + True + True + True + True + + + False + False + 0 + + + + + gtk-cancel + True + True + True + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + 4 + + + 320 + True + True + automatic + automatic + + + True + False + queue + none + + + True + False + + + True + False + + + True + False + + + True + True + True + #000000000000 + + + False + True + 0 + + + + + True + True + + False + False + True + True + adjustment3 + + + True + True + 1 + + + + + True + True + 0 + + + + + False + True + 0 + + + + + + + + + + + + True + True + 0 + + + + + True + False + + + False + True + 1 + + + + + True + False + + + True + False + + + True + True + True + + + True + False + gtk-add + 1 + + + + + True + True + 0 + + + + + True + True + True + + + True + False + gtk-remove + 1 + + + + + True + True + 1 + + + + + False + True + 0 + + + + + 360 + True + False + GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK + + + True + True + 1 + + + + + False + True + 2 + + + + + True + True + 1 + + + + + + setting_editor-color_gradient-button_apply + setting_editor-color_gradient-button_cancel + + + + + + + + + + dummy + + + + + False + True + + + True + False + + + True + False + + + True + False + + + + True + True + 0 + + + + + False + False + False + + + True + False + + + True + False + gtk-revert-to-saved + + + True + True + 0 + + + + + True + False + Default + + + True + True + 1 + + + + + + + False + False + 1 + + + + + gtk-revert-to-saved + False + False + False + True + + + False + False + 2 + + + + + True + True + 0 + + + + + True + True + False + False + True + True + + + True + True + 1 + + + + + True + False + + + True + True + + False + False + True + True + + + True + True + 0 + + + + + True + False + Integer increase + True + gtk-go-up + + + False + True + 1 + + + + + True + False + Integer decrease + True + gtk-go-down + + + False + True + 2 + + + + + True + True + 2 + + + + + True + False + + + True + True + + False + False + True + True + + + True + True + 0 + + + + + True + False + Float increase + True + gtk-go-up + + + False + True + 1 + + + + + True + False + Float decrease + True + gtk-go-down + + + False + True + 2 + + + + + True + True + 3 + + + + + True + False + 8 + + + True + True + + False + False + True + True + + + True + True + 0 + + + + + True + True + False + True + + + False + True + 1 + + + + + True + True + 4 + + + + + True + False + model + 4 + 0 + + + True + False + False + True + True + + + + + True + True + 5 + + + + + True + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + True + 6 + + + + + True + False + + + True + True + False + False + True + True + + + True + True + 0 + + + + + True + False + False + + + True + False + gtk-open + 1 + + + + + False + False + 1 + + + + + True + True + 7 + + + + + True + False + + + True + True + False + False + True + True + + + True + True + 0 + + + + + True + True + True + #000000000000 + + + False + True + 1 + + + + + True + True + 8 + + + + + True + False + + + True + True + False + False + True + True + + + True + True + 0 + + + + + True + True + True + + + True + False + gtk-select-color + 1 + + + + + False + True + 1 + + + + + True + True + 9 + + + + + True + False + + + True + True + + False + False + True + True + + + True + True + 0 + + + + + True + True + True + + + True + False + gtk-edit + 1 + + + + + False + False + 1 + + + + + True + True + True + + + True + False + gtk-open + 1 + + + + + False + False + 2 + + + + + True + True + 10 + + + + + True + False + + + True + True + + True + False + False + True + True + + + True + True + 0 + + + + + True + True + True + + + True + False + gtk-open + 1 + + + + + False + False + 1 + + + + + True + True + 11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + + + True + False + 2 + 6 + + + + + + True + False + title + + + + + + 6 + GTK_FILL + + + + + True + False + scenario_io_setting-liststore_type + 2 + + + + 0 + + + + + 1 + 2 + 1 + 2 + + + + + True + True + True + + + True + False + Move up + gtk-goto-top + + + + + 2 + 3 + 1 + 2 + GTK_SHRINK | GTK_FILL + + + + + True + True + True + + + True + False + Move down + gtk-goto-bottom + + + + + 3 + 4 + 1 + 2 + GTK_SHRINK | GTK_FILL + + + + + True + True + True + + + True + False + Edit + gtk-edit + + + + + 4 + 5 + 1 + 2 + GTK_SHRINK | GTK_FILL + + + + + True + True + True + + + True + False + Delete + gtk-delete + + + + + 5 + 6 + 1 + 2 + GTK_SHRINK | GTK_FILL + + + + + + + False + + + True + False + 2 + 3 + + + + + + True + False + title + + + + + + 3 + GTK_FILL + + + + + True + True + True + + + True + False + gtk-clear + + + + + 1 + 2 + 1 + 2 + GTK_SHRINK | GTK_FILL + + + + + True + True + True + + + True + False + gtk-copy + + + + + 2 + 3 + 1 + 2 + GTK_SHRINK | GTK_FILL + + + + + + + + + + + + + False + + + True + False + 3 + 5 + + + + + + + + + + + + + + + True + True + True + + + True + False + gtk-go-up + + + + + 2 + 3 + + + + + True + True + True + + + True + False + gtk-go-down + + + + + 3 + 4 + + + + + True + True + True + + + True + False + Delete setting + gtk-delete + + + + + 4 + 5 + + + + + True + False + scenario_setting-liststore_type + 2 + + + + 0 + + + + + 1 + 2 + + + + + True + True + + True + False + False + True + True + + + + + True + False + Default Value + + + 1 + 2 + + + + + True + False + Identifier + + + 2 + 3 + + + + + True + True + True + + + True + False + gtk-refresh + + + + + 4 + 5 + 2 + 3 + + + + + True + True + + False + False + True + True + + + 1 + 4 + 2 + 3 + + + + + + diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/interface.ui-base b/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/interface.ui-base new file mode 100644 index 0000000..77744eb --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/interface.ui-base @@ -0,0 +1,5910 @@ + + + + + + False + 5 + center + 500 + 900 + normal + @BRAND_NAME@ @DESIGNER_NAME@ + @OV_GLOBAL_VERSION_STRING@ + Software technologies for the development of new research, diagnostic and therapeutic solutions leveraging real-time EEG and neurofeedback + header_logo.png + + + True + False + 2 + + + True + False + end + + + + + + False + True + end + 0 + + + + + True + True + never + + + 300 + True + False + + + True + False + True + + + + + + + True + True + 2 + + + + + Display full changelog + True + True + True + + + True + True + 3 + + + + + + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 1000 + 10 + 0.10000000000000001 + 1 + + + False + 5 + center-on-parent + dialog + True + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 2 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + True + True + True + + + True + False + + + True + False + gtk-open + + + False + True + 0 + + + + + True + False + Load... + + + True + True + 1 + + + + + + + False + False + 0 + + + + + True + True + True + + + True + False + + + True + False + gtk-save + + + False + True + 0 + + + + + True + False + Save... + + + True + True + 1 + + + + + + + False + False + 1 + + + + + True + False + False + + + True + False + + + True + False + gtk-revert-to-saved + + + True + True + 0 + + + + + True + False + Default + + + True + True + 1 + + + + + + + False + False + 2 + + + + + gtk-revert-to-saved + True + False + False + True + + + False + False + 3 + + + + + gtk-apply + True + False + False + True + + + + + False + False + 4 + + + + + gtk-cancel + True + False + False + True + + + + False + False + 5 + + + + + False + True + end + 0 + + + + + True + True + automatic + automatic + + + True + False + none + + + True + False + 4 + 8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + True + 1 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + False + True + 3 + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + False + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + File : + True + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + + + False + False + 0 + + + + + True + True + 0 + + + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Override settings with configuration file + + + + + False + True + 4 + + + + + + box_configuration-button_load_current_from_file + box_configuration-button_save_current_to_file + box_configuration-button_default + box_configuration-button_revert + box_configuration-button_apply + box_configuration-button_cancel + + + + False + 5 + Configuration Manager (read only) + center-on-parent + dialog + + + True + False + 2 + + + True + False + end + + + gtk-close + True + False + False + True + + + + + + False + False + 0 + + + + + gtk-open + True + True + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + True + automatic + automatic + + + 640 + 240 + True + True + True + + + + + True + True + 2 + + + + + + configuration_manager-button_close + configuration_manager-button_load + + + + False + 5 + + center-on-parent + dialog + + + True + False + 2 + + + True + False + end + + + True + True + True + + + True + False + + + True + False + gtk-jump-to + + + True + True + 0 + + + + + True + False + View Messages + + + True + True + 1 + + + + + + + False + False + 0 + + + + + OK + True + True + True + + + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + 4 + 2 + 8 + 8 + + + True + False + <b>One or more errors have occured during the execution of the scenario</b> + True + center + True + + + 1 + 2 + + + + + True + False + gtk-dialog-warning + 6 + + + 3 + + + + + + + True + False + + + 2 + 3 + 4 + GTK_FILL + GTK_FILL + + + + + True + False + <b>0</b> Warnings + True + + + 1 + 2 + 1 + 2 + + + + + True + False + <b>0</b> Errors + True + + + 1 + 2 + 2 + 3 + + + + + True + True + 1 + + + + + + dialog_error_popup-button_view + dialog_error_popup-button_ok + + + + False + 5 + + center-on-parent + dialog + + + True + False + 2 + + + True + False + end + + + gtk-cancel + True + True + True + True + + + False + False + 0 + + + + + Save Scenario + True + True + True + True + + + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + 4 + 2 + 8 + 8 + + + True + False + <b>An error occured while saving your scenario</b> + True + center + True + + + 1 + 2 + + + + + True + False + gtk-dialog-warning + 6 + + + 3 + + + + + + + True + False + + + 2 + 3 + 4 + GTK_FILL + GTK_FILL + + + + + True + False + label + + + 1 + 2 + 1 + 2 + + + + + True + False + label + + + 1 + 2 + 2 + 3 + + + + + True + True + 1 + + + + + + dialog_error_popup_saving-button_cancel + dialog_error_popup_saving-button_ok + + + + False + 5 + Oops... + False + True + center + 400 + 125 + dialog + True + True + warning + close + <big><b>Box documentation not found!</b></big> + True + The documentation Help file (CHM) is not available. + + + + + + False + + + False + end + + + False + True + end + 0 + + + + + True + False + True + True + + + True + True + 2 + + + + + + + + + + False + 5 + Running Scenario + True + center-on-parent + normal + + + True + False + 2 + + + True + False + end + + + gtk-close + True + True + True + True + + + + + False + False + 0 + + + + + False + True + end + 0 + + + + + True + False + 3 + 2 + 8 + 8 + + + True + False + <b>This scenario currently is locked !</b> + True + True + + + 1 + 2 + + + + + True + False + The scenario you are trying to close is locked. It is most probably being used by a player engine, and either started or paused. If you really want to close it, you'll have to stop its execution first. + True + + + 1 + 2 + 1 + 2 + + + + + True + False + gtk-dialog-warning + 6 + + + 2 + + + + + + + True + False + + + 2 + 2 + 3 + GTK_FILL + GTK_FILL + + + + + True + True + 1 + + + + + + running_scenario-button_close + + + + False + 5 + Running Scenario + True + center-on-parent + dialog + + + True + False + 2 + + + True + False + end + + + gtk-close + True + True + True + True + + + + + False + False + 0 + + + + + False + True + end + 0 + + + + + True + False + 3 + 2 + 8 + 8 + + + True + False + <b>A scenario is currently locked !</b> + True + True + + + 1 + 2 + + + + + True + False + One of the opened scenarios is currently locked. It is most probably being used by a player engine, and either started or paused. If you really want to quit, you'll have to stop its execution first. + True + + + 1 + 2 + 1 + 2 + + + + + True + False + gtk-dialog-warning + 6 + + + 2 + + + + + + + True + False + + + 2 + 2 + 3 + GTK_FILL + GTK_FILL + + + + + True + True + 1 + + + + + + running_scenario_global-button_close + + + + False + 5 + Save Scenario + True + center-on-parent + dialog + + + True + False + 2 + + + True + False + end + + + Close Without Saving + True + True + True + + + False + False + 0 + + + + + gtk-cancel + True + True + True + True + True + + + False + False + 1 + + + + + gtk-save + True + True + True + True + + + False + False + 2 + + + + + False + True + end + 0 + + + + + True + False + 3 + 2 + 8 + 8 + + + True + False + <b>Save changes to this scenario before closing ?</b> + True + True + + + 1 + 2 + + + + + True + False + The scenario you are trying to close has been modified. Would you like to save those modifications before closing it ? If you don't save it, the last modifications will be lost. + True + + + 1 + 2 + 1 + 2 + + + + + True + False + gtk-save + 6 + + + 2 + + + + + + + True + False + + + 2 + 2 + 3 + GTK_FILL + GTK_FILL + + + + + True + True + 1 + + + + + + unsaved_scenario-button_delete + unsaved_scenario-button_cancel + unsaved_scenario-button_save + + + + False + 5 + Save Scenario + True + center-on-parent + dialog + + + True + False + 2 + + + True + False + end + + + Quit Without Saving + True + True + True + + + False + False + 0 + + + + + gtk-cancel + True + True + True + True + True + + + False + False + 1 + + + + + gtk-save + True + True + True + True + + + False + False + 2 + + + + + False + True + end + 0 + + + + + True + False + 3 + 2 + 8 + 8 + + + True + False + <b>Save changes to unmodified scenarios before closing ?</b> + True + True + + + 1 + 2 + + + + + True + False + Some of the opened scenarios you are trying to close have been modified. Would you like to save all those modifications before closing them ? If you don't save them, the last modifications will be lost. + True + + + 1 + 2 + 1 + 2 + + + + + True + False + gtk-save + 6 + + + 2 + + + + + + + True + False + + + 2 + 2 + 3 + GTK_FILL + GTK_FILL + + + + + True + True + 1 + + + + + + unsaved_scenario_global-button_delete + unsaved_scenario_global-button_cancel + unsaved_scenario_global-button_save + + + + False + 5 + Oops... + False + True + center + 400 + 125 + dialog + True + True + warning + close + <big><b>Operation not permitted!</b></big> + True + Deprecated I/O or Settings are still pending. Please remove them to terminate the box update, and retry operation. + + + + + + False + + + False + end + + + False + True + end + 0 + + + + + True + False + True + True + + + True + True + 2 + + + + + + + + + + True + False + gtk-missing-image + + + False + 5 + center-on-parent + dialog + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 2 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + + + True + False + Label + + + True + True + 0 + + + + + True + True + True + False + False + True + True + + + True + True + 1 + + + + + True + True + 1 + + + + + + input-button_ok + input-button_cancel + + + + True + False + <small><tt>Mono</tt></small> + True + + + True + False + <small>x<sub>sub</sub></small> + True + + + True + False + <small>x<sup>sup</sup></small> + True + + + True + False + <span color="red">R</span> + True + + + True + False + green + <span color="green">G</span> + True + + + True + False + blue + <span color="blue">B</span> + True + + + 500 + 300 + False + 5 + Modify Comment + True + center + dialog + + + True + False + 2 + + + True + False + icons + + + True + False + bold (ctrl+b) + bold + True + gtk-bold + + + + False + True + + + + + True + False + italic (ctrl+i) + italic + True + gtk-italic + + + + False + True + + + + + True + False + underline (ctrl+u) + underline + True + gtk-underline + + + + False + True + + + + + True + False + strikethrough (ctrl+t) + strikethrough + True + gtk-strikethrough + + + + False + True + + + + + True + False + + + False + True + + + + + True + False + Monospace + True + label4 + + + False + True + + + + + True + False + Subscript + True + label5 + + + False + True + + + + + True + False + superscript + True + label6 + + + False + True + + + + + True + False + big + big + True + gtk-go-up + + + False + True + + + + + True + False + small + small + True + gtk-go-down + + + False + True + + + + + True + False + + + False + True + + + + + True + False + red + True + label7 + + + False + True + + + + + True + False + True + label8 + + + False + True + + + + + True + False + True + label9 + + + False + True + + + + + True + False + + + False + True + + + + + True + False + Help + howto + True + gtk-info + + + False + True + + + + + False + True + 0 + + + + + + + + 480 + 240 + True + True + automatic + + + True + True + word + + + + + True + True + 2 + + + + + True + False + end + + + gtk-apply + True + True + True + True + + + + False + False + 0 + + + + + gtk-cancel + True + True + True + True + + + False + False + 1 + + + + + False + True + end + 3 + + + + + + + + + comment-button_apply + comment-button_cancel + + + + False + 5 + Activate Log Levels + False + True + center-on-parent + dialog + True + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 2 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + end + + + gtk-apply + True + False + False + True + + + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + Check log level(s) to activate + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + + + True + False + False + True + + + True + False + + + True + False + gtk-close + + + True + True + 0 + + + + + True + False + Fatal error + + + True + True + 1 + + + + + + + True + True + 0 + + + + + True + False + False + True + + + True + False + + + True + False + gtk-dialog-error + + + True + True + 0 + + + + + True + False + Error + + + True + True + 1 + + + + + + + True + True + 1 + + + + + True + False + False + True + + + True + False + + + True + False + gtk-dialog-warning + + + True + True + 0 + + + + + True + False + Important warning + + + True + True + 1 + + + + + + + True + True + 2 + + + + + True + False + False + True + + + True + False + + + True + False + gtk-dialog-warning + + + True + True + 0 + + + + + True + False + Warning + + + True + True + 1 + + + + + + + True + True + 3 + + + + + True + False + False + True + + + True + False + + + True + False + gtk-dialog-info + + + True + True + 0 + + + + + True + False + Information + + + True + True + 1 + + + + + + + True + True + 4 + + + + + True + False + False + True + + + True + False + + + True + False + gtk-execute + + + True + True + 0 + + + + + True + False + Trace + + + True + True + 1 + + + + + + + True + True + 5 + + + + + True + False + False + True + + + True + False + + + True + False + gtk-floppy + + + True + True + 0 + + + + + True + False + Benchmark and profiling + + + True + True + 1 + + + + + + + True + True + 6 + + + + + True + False + False + True + + + True + False + + + True + False + gtk-properties + + + True + True + 0 + + + + + True + False + Debug + + + True + True + 1 + + + + + + + True + True + 7 + + + + + True + True + 3 + + + + + + loglevel-button_apply + loglevel-button_cancel + + + + + + + + + + dummy + + + + + False + 5 + Setting Editor + True + center-on-parent + dialog + True + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 2 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-revert-to-saved + True + False + False + True + + + False + False + 0 + + + + + gtk-apply + True + False + False + True + + + + + False + False + 1 + + + + + gtk-cancel + True + False + False + True + + + + False + False + 2 + + + + + False + True + end + 0 + + + + + True + False + 3 + 3 + 4 + 8 + + + + + + 150 + True + False + Name : + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + False + True + True + + + 1 + 2 + + + + + 150 + True + False + Type : + + + 1 + 2 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + model1 + 4 + + + + 0 + + + + + 1 + 2 + 1 + 2 + + + + + 150 + True + False + Default value : + + + 2 + 3 + + + + + gtk-revert-to-saved + 100 + True + False + False + False + True + + + 2 + 3 + + + + + gtk-revert-to-saved + 100 + True + False + False + False + True + + + 2 + 3 + 1 + 2 + + + + + gtk-revert-to-saved + 100 + True + False + False + False + True + + + 2 + 3 + 2 + 3 + + + + + True + True + 1 + + + + + + setting_editor-button_revert + setting_editor-button_apply + setting_editor-button_cancel + + + + + + + + + + dummy + + + + + + + + + + + dummy + + + + + False + 5 + Connector Editor + True + center-on-parent + dialog + True + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 2 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-revert-to-saved + True + False + False + True + + + False + False + 0 + + + + + gtk-apply + True + False + False + True + + + + + False + False + 1 + + + + + gtk-cancel + True + False + False + True + + + + False + False + 2 + + + + + False + True + end + 0 + + + + + True + False + 3 + 3 + 4 + 8 + + + 150 + True + False + Name : + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + False + True + True + + + 1 + 3 + + + + + 150 + True + False + Type : + + + 1 + 2 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + model3 + 4 + + + + 0 + + + + + 1 + 3 + 1 + 2 + + + + + 150 + False + Identifier : + + + 2 + 3 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + True + False + False + True + True + + + 1 + 2 + 2 + 3 + + + + + gtk-refresh + 100 + False + False + True + + + 2 + 3 + 2 + 3 + GTK_FILL + + + + + True + True + 1 + + + + + + connector_editor-button_revert + connector_editor-button_apply + connector_editor-button_cancel + + + + + False + 5 + Plugin Description + center-on-parent + dialog + + + True + False + 2 + + + True + False + end + + + gtk-close + True + False + False + True + + + + + + False + False + 0 + + + + + False + True + end + 0 + + + + + True + False + 8 + 3 + 4 + + + True + True + False + False + False + True + True + + + 1 + 2 + 5 + 6 + + + + + True + True + False + False + False + True + True + + + 1 + 2 + 4 + 5 + + + + + True + True + False + False + False + True + True + + + 1 + 2 + 3 + 4 + + + + + True + True + False + False + False + True + True + + + 1 + 2 + 2 + 3 + + + + + True + True + False + False + False + True + True + + + 1 + 2 + 1 + 2 + + + + + True + False + Category : + + + 4 + 5 + + + + + True + False + Company name : + + + 3 + 4 + + + + + True + False + Version : + + + 5 + 6 + + + + + True + False + Class name : + + + 1 + 2 + + + + + True + False + Author name : + + + 2 + 3 + + + + + True + False + Type : + + + + + 240 + True + True + False + False + False + True + True + + + 1 + 2 + + + + + True + False + 0 + + + True + False + 12 + + + True + True + False + word + fill + + + + + + + True + False + Short description + True + + + + + 2 + 3 + 3 + + + + + True + False + 0 + + + True + False + 2 + 12 + + + 320 + True + True + False + word + fill + + + + + + + True + False + Detailed description + True + + + + + 2 + 3 + 3 + 8 + + + + + True + False + Version of the software when the box was added. + Added Software Version: + + + 6 + 7 + + + + + True + False + Version of the software when the box was last updated. + Update Software Version: + + + 7 + 8 + + + + + True + True + False + + False + False + True + True + + + 1 + 2 + 6 + 7 + + + + + True + True + + False + False + True + True + + + 1 + 2 + 7 + 8 + + + + + True + True + 1 + + + + + + plugin_about-button_close + + + + False + 5 + Rename Object... + center-on-parent + dialog + + + True + False + 2 + + + True + False + end + + + True + False + False + + + True + False + + + True + False + gtk-revert-to-saved + + + True + True + 0 + + + + + True + False + Default + + + True + True + 1 + + + + + + + False + False + 0 + + + + + gtk-revert-to-saved + True + False + False + True + + + False + False + 1 + + + + + gtk-apply + True + False + False + True + + + + + False + False + 2 + + + + + gtk-cancel + True + False + False + True + + + + False + False + 3 + + + + + False + True + end + 0 + + + + + True + False + + + True + False + Enter new name : + + + True + True + 0 + + + + + True + True + False + False + True + True + + + True + True + 1 + + + + + True + True + 1 + + + + + + rename-button_default + rename-button_revert + rename-button_apply + rename-button_cancel + + + + True + False + gtk-refresh + + + False + 5 + Scenario Description + center-on-parent + dialog + + + True + False + 2 + + + True + False + end + + + gtk-close + True + True + True + True + + + + + + False + False + 0 + + + + + False + True + end + 0 + + + + + True + False + 9 + 4 + 4 + + + True + False + Name of the author + Author name : + + + 1 + 2 + GTK_FILL + + + + + True + False + Name of the scenario + Name : + + + GTK_FILL + + + + + True + True + + False + False + True + True + + + 1 + 3 + 1 + 2 + + + + + True + True + + False + False + True + True + + + 1 + 3 + + + + + True + False + Name of the company whose the scenario belongs. + Company name : + + + 2 + 3 + GTK_FILL + + + + + True + True + + False + False + True + True + + + 1 + 3 + 2 + 3 + + + + + True + False + If the scenario is a metabox, this item sets the category in the one the metabox appears. +This can be for example "Tools/Example" + Category : + + + 3 + 4 + GTK_FILL + + + + + True + False + Version of the scenario. + 0.51999998092651367 + Version : + + + 4 + 5 + GTK_FILL + + + + + True + True + + False + False + True + True + + + 1 + 3 + 3 + 4 + + + + + True + True + + False + False + True + True + + + 1 + 3 + 4 + 5 + + + + + True + False + Documentation page : + + + 5 + 6 + GTK_FILL + + + + + True + True + + False + False + True + True + + + 1 + 3 + 5 + 6 + + + + + True + False + 0 + none + + + True + False + 12 + + + True + True + + + + + + + True + False + Short Description + True + + + + + 3 + 4 + 3 + + + + + True + False + 0 + none + + + True + False + 12 + + + True + True + + + + + + + True + False + Detailed Description + True + + + + + 3 + 4 + 3 + 9 + + + + + True + False + Version of the software when you created the scenario. + Added Software Version: + + + 6 + 7 + + + + + True + False + Version of the software when you updated the scenario. + Update software version: + + + 7 + 8 + + + + + True + True + + False + False + True + True + + + 1 + 3 + 6 + 7 + + + + + True + True + + False + False + True + True + + + 1 + 3 + 7 + 8 + + + + + True + False + Metabox Id : + + + 8 + 9 + + + + + True + True + + False + False + True + True + + + 1 + 2 + 8 + 9 + + + + + True + True + True + scenario_about-icon_refresh + + + 2 + 3 + 8 + 9 + + + + + True + True + 1 + + + + + + scenario_about-button_close + + + + You can format text using the Pango markup language. +This language uses xml-like tags, with keyword 'span' and 'name=value' definitions. +For example, using the name 'color' with value 'red' like this: <span color='red'>text</span> +will print 'text' in red. + +<span name=value> attributes +------------------------------------------------ +font, font_desc + A font description string, such as "Sans Italic 12". +font_family, face + A font family name +font_size, size + Font size in 1024ths of a point, or one of the absolute sizes 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', + or one of the relative sizes 'smaller' or 'larger'. + If you want to specify a absolute size, it's usually easier to take advantage of the ability + to specify a partial font description using 'font'; you can use font='12.5' rather than size='12800'. +font_style, style + One of 'normal', 'oblique', 'italic' +font_weight, weight + One of 'ultralight', 'light', 'normal', 'bold', 'ultrabold', 'heavy', or a numeric weight +font_variant, variant + One of 'normal' or 'smallcaps' +font_stretch, stretch + One of 'ultracondensed', 'extracondensed', 'condensed', 'semicondensed', 'normal', + 'semiexpanded', 'expanded', 'extraexpanded', 'ultraexpanded' +foreground, fgcolor, color + An RGB color specification such as '#00FF00' or a color name such as 'red' +background, bgcolor + An RGB color specification such as '#00FF00' or a color name such as 'red' +underline + One of 'none', 'single', 'double', 'low', 'error' +underline_color + The color of underlines; an RGB color specification such as '#00FF00' or a color name such as 'red' +rise + Vertical displacement, in Pango units. Can be negative for subscript, positive for superscript. +strikethrough + 'true' or 'false' whether to strike through the text +strikethrough_color + The color of strikethrough lines; an RGB color specification such as '#00FF00' or a color name such as 'red' +letter_spacing + Inter-letter spacing in 1024ths of a point. + +The following convenience tags are provided: +------------------------------------------------ +b + Bold +big + Makes font relatively larger, equivalent to <span size="larger"> +i + Italic +s + Strikethrough +sub + Subscript +sup + Superscript +small + Makes font relatively smaller, equivalent to <span size="smaller"> +tt + Monospace font +u + Underline + + + 700 + 400 + False + 5 + Help + True + center + dialog + True + False + close + <span size="x-large">How to format comments using <i>Pango Markup Language</i></span> + True + + + + + + + + True + False + 2 + + + True + False + end + + + + + + + + + False + True + end + 0 + + + + + True + True + automatic + automatic + + + True + True + False + 5 + 5 + False + textbuffer_pango_manual + + + + + True + True + 2 + + + + + + + + + + False + popup + False + tooltip + True + False + False + + + True + False + 6 + 2 + 2 + 2 + + + True + False + center + + + 1 + 2 + + + + + True + False + center + + + + + + + False + + + True + False + 3 + 3 + + + 8 + 8 + True + False + + + + + + 2 + 3 + 2 + 3 + GTK_SHRINK + GTK_SHRINK + + + + + 8 + True + False + + + + + + 1 + 2 + 2 + 3 + GTK_SHRINK | GTK_FILL + GTK_SHRINK + + + + + 8 + 8 + True + False + + + + + + 2 + 3 + GTK_SHRINK + GTK_SHRINK + + + + + 8 + True + False + + + + + + 2 + 3 + 1 + 2 + GTK_SHRINK + GTK_SHRINK | GTK_FILL + + + + + 8 + True + False + + + + + + 1 + 2 + GTK_SHRINK + GTK_SHRINK | GTK_FILL + + + + + 8 + 8 + True + False + + + + + + 2 + 3 + GTK_SHRINK + GTK_SHRINK + + + + + 8 + True + False + + + + + + 1 + 2 + GTK_SHRINK | GTK_FILL + GTK_SHRINK + + + + + 8 + 8 + True + False + + + + + + GTK_SHRINK + GTK_SHRINK + + + + + True + False + False + + + 1 + 2 + 1 + 2 + GTK_EXPAND | GTK_SHRINK | GTK_FILL + GTK_EXPAND | GTK_SHRINK | GTK_FILL + + + + + + + 10 + 300 + 100 + 5 + 25 + + + 320 + 240 + False + @BRAND_NAME@ @DESIGNER_NAME@ @OV_GLOBAL_VERSION_STRING@ + center + 1024 + 768 + True + + + True + False + + + True + False + + + True + False + _File + True + + + True + False + + + gtk-new + True + False + True + True + + + + + + gtk-open + True + False + True + True + + + + + + True + False + _Recent scenarios + True + + + True + False + + + + + + + gtk-save + True + False + True + True + + + + + + gtk-save-as + True + False + True + True + + + + + True + False + + + + + gtk-close + True + False + True + True + + + + + gtk-quit + True + False + True + True + + + + + + + + + True + False + _Edit + True + + + True + False + + + gtk-find + True + False + True + True + + + + + + gtk-undo + True + False + True + True + + + + + + gtk-redo + True + False + True + True + + + + + + True + False + + + + + gtk-cut + True + False + True + True + + + + + + gtk-copy + True + False + True + True + + + + + + gtk-paste + True + False + True + True + + + + + + gtk-delete + True + False + True + True + + + + + + True + False + + + + + gtk-preferences + True + False + True + True + + + + + + + + + True + False + _Tools + True + + + True + False + + + Restore default scenarios + True + False + True + False + + + + + + + + + True + False + _Help + True + + + True + False + + + About this _scenario + True + False + True + False + + + + + _About @BRAND_NAME@ + True + False + True + False + + + + + Browse _documentation + True + False + True + False + + + + + Register _license + True + False + True + False + + + + + _Report issue + True + False + True + False + + + + + What's new in version @OV_GLOBAL_VERSION_STRING@ of @DESIGNER_NAME@ + True + False + True + False + + + + + + + + + False + True + 0 + + + + + True + False + 4 + + + True + False + both-horiz + False + 1 + True + + + True + False + creates a new +scenario... +(Ctrl+N) + new + gtk-new + + + False + True + + + + + True + False + opens an existing +scenario... +(Ctrl+O) + open + gtk-open + + + False + True + + + + + True + False + saves the current +scenario... +(Ctrl+S) + save + gtk-save + + + False + True + + + + + True + False + saves the current +scenario letting you +choose a filename... + save as ... + gtk-save-as + + + False + True + + + + + True + False + closes the current +scenario... + close + gtk-close + + + False + True + + + + + True + False + + + False + + + + + True + False + False + Undo your last action +(Ctrl+Z) + undo + gtk-undo + + + False + True + + + + + True + False + False + Redo your last canceled action +(Ctrl+Y) + redo + gtk-redo + + + False + True + + + + + True + False + + + False + + + + + True + False + toggles the window +manager... + window manager + gtk-preferences + + + False + True + + + + + True + False + allows you to modify the +active log levels... + log levels... + gtk-edit + + + False + True + + + + + True + False + + + False + + + + + True + False + allows you to add a new +comment in the scenario... + add comment + gtk-index + + + False + True + + + + + True + False + allows you to read / modify +the information about the scenario... + about scenario + True + gtk-about + + + False + True + + + + + True + False + + + False + + + + + GTK_FILL + + + + + 16 + True + False + both-horiz + False + 1 + True + + + True + False + open engine control panel... + Mensia Engine + gtk-connect + + + False + True + + + + + 2 + 3 + GTK_FILL + + + + + True + False + both-horiz + False + 1 + True + + + True + False + stops the execution of +the current scenario... + stop + gtk-media-stop + + + False + True + + + + + True + False + steps a fraction of time on +the current scenario... + one step + gtk-media-next + + + False + True + + + + + True + False + starts / pauses the execution +of the current scenario... + play + gtk-media-play + + + False + True + + + + + True + False + executes the current +scenario as fast as +possible... + start + gtk-media-forward + + + False + True + + + + + True + False + run the scenario in a loop, +un-check it to stop loop... + loop + gtk-refresh + + + False + True + + + + + True + False + + + False + + + + + True + False + + + True + False + + + True + False + Max FF +Factor : + + + True + True + 0 + + + + + True + True + Sets the maximum acceleration factor when scenario is played in fast-forward mode. + + False + False + True + True + adjustment3 + 1 + 2 + + + True + True + 1 + + + + + + + False + + + + + True + False + + + False + + + + + True + False + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + current time of the scenario... + Time : 0 + + + + + False + + + + + True + False + + + False + True + + + + + 1 + 2 + GTK_FILL + + + + + True + False + both-horiz + False + 1 + True + + + True + False + zoom in... + Zoom in + True + gtk-zoom-in + + + False + True + + + + + True + False + zoom out... + Zoom out + True + gtk-zoom-out + + + False + True + + + + + True + False + + + True + True + zoom rate... + + False + False + True + True + zoom_adjustment + + + + + False + True + + + + + 3 + 4 + + + + + False + True + 1 + + + + + True + True + 640 + True + + + True + True + True + + + True + True + GDK_STRUCTURE_MASK | GDK_SCROLL_MASK + automatic + automatic + + + True + False + queue + + + True + True + GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK + + + + + + + + + True + False + + + True + False + gtk-jump-to + + + True + True + 0 + + + + + True + False + Scenario + + + True + True + 1 + + + + + True + True + True + none + + + True + False + gtk-close + 2 + + + + + True + True + 2 + + + + + False + + + + + True + False + + + + + True + True + + + True + False + + + True + False + + + True + True + add a filter on the search +only the boxes containing the keyword you entered in their name or descriptionwill be displayed + + gtk-find + True + False + True + True + + + True + True + 0 + + + + + False + True + 0 + + + + + True + True + automatic + automatic + + + True + True + 0 + vertical + True + + + + + True + True + 1 + + + + + + + True + False + + + True + False + gtk-convert + + + True + True + 0 + + + + + True + False + Display the list of boxes available in @BRAND_NAME@ @DESIGNER_NAME@ + Boxes + + + True + True + 1 + + + + + True + True + True + none + + + True + False + Expand all boxes... + gtk-goto-bottom + 2 + + + + + True + True + 2 + + + + + True + True + True + none + + + True + False + gtk-goto-top + 2 + + + + + True + True + 3 + + + + + False + + + + + True + True + automatic + automatic + + + True + True + 0 + vertical + True + + + + + 1 + + + + + True + False + + + True + False + gtk-apply + + + True + True + 0 + + + + + True + False + Algorithms + + + True + True + 1 + + + + + True + True + True + none + + + True + False + gtk-goto-bottom + 2 + + + + + True + True + 2 + + + + + True + True + True + none + + + True + False + gtk-goto-top + 2 + + + + + True + True + 3 + + + + + 1 + False + + + + + True + False + + + True + True + automatic + automatic + + + True + False + none + + + True + False + 4 + 1 + + + + + + + + + + True + True + 0 + + + + + Configure Settings + True + True + True + + + False + True + 1 + + + + + 2 + + + + + True + False + + + True + False + gtk-preferences + + + True + True + 0 + + + + + True + False + Display the list of custom settings available in scenarios + Scenario Configuration + + + True + True + 1 + + + + + 2 + False + + + + + True + False + + + 3 + + + + + True + False + + + True + False + gtk-disconnect + + + True + True + 0 + + + + + True + False + Display the list of input/output exposed in metaboxes + Scenario I/O + + + True + True + 1 + + + + + 3 + False + + + + + True + True + + + + + True + True + 2 + + + + + True + True + Display the @DESIGNER_NAME@ console + + + True + False + + + True + False + both-horiz + 1 + + + True + False + Clear the console + True + Clear + True + gtk-clear + + + False + True + + + + + True + False + Display the debug messages. +These messages can be activated only in log files. + True + DEBUG + gtk-info + + + False + True + + + + + True + False + Display the bench messages. +These messages can be activated only in log files. + True + BENCH + True + gtk-info + + + False + True + + + + + True + False + Display the trace messages. +In most cases trace messages ae not useful and should remain disabled. + True + TRACE + True + gtk-info + + + False + True + + + + + True + False + Display information messages in console. + True + INF + True + gtk-info + + + False + True + + + + + True + False + Display warning messages in console. + True + WARNING + True + gtk-dialog-warning + + + False + True + + + + + True + False + Display important warning messages in console. + True + IMPORTANT WARNING + True + gtk-dialog-warning + + + False + True + + + + + True + False + Display error messages in console. + True + ERROR + True + gtk-dialog-error + + + False + True + + + + + True + False + Display fatal error messages in console. + True + FATAL + True + gtk-dialog-error + + + False + True + + + + + True + False + + + Show pop-up +on Warnings and Errors + True + True + False + Display a pop-up each time a warning or an error is thrown by a box. + True + + + + + False + True + + + + + False + True + 0 + + + + + True + False + + + True + False + Search for : + + + False + True + 0 + + + + + True + True + + True + False + False + True + True + + + True + True + 1 + + + + + True + True + 1 + + + + + True + True + automatic + automatic + + + 250 + True + True + False + openvibe-textbuffer_messages + + + + + True + True + 2 + + + + + + + True + False + + + True + False + gtk-info + + + True + True + 0 + + + + + True + False + <b>0</b> Messages + True + + + True + True + 10 + 1 + + + + + False + gtk-dialog-warning + + + True + True + 2 + + + + + False + <b>0</b> Warnings + True + + + True + True + 10 + 3 + + + + + False + gtk-dialog-error + + + True + True + 4 + + + + + False + <b>0</b> Errors + True + + + True + True + 10 + 5 + + + + + + + False + True + 3 + + + + + True + False + + + True + False + 2 + + + True + True + 0 + + + + + True + False + + + True + False + + + False + True + 2 + 0 + + + + + True + False + Start monitoring of CPU usage +(Useful to help optimize your scenario or your custom boxes) + System load : + + + False + True + 2 + 1 + + + + + 64 + 32 + True + False + bottom-to-top + + + False + True + 2 + 2 + + + + + True + True + True + Start monitoring of CPU usage +(Useful to help optimize your scenario or your custom boxes) + 0.49000000953674316 + + + True + False + + + True + False + gtk-info + + + True + True + 0 + + + + + + + False + True + 2 + 3 + + + + + False + True + 1 + + + + + False + True + 4 + + + + + + + False + 5 + True + center-on-parent + 600 + dialog + openvibe + + + True + False + 2 + + + True + False + end + + + gtk-apply + True + True + True + True + + + False + False + 0 + + + + + gtk-cancel + True + True + True + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + True + never + automatic + + + True + False + none + + + True + False + + + + + + + + + + True + True + 2 + + + + + Add Setting + True + True + True + + + False + False + 3 + + + + + + button1 + button2 + + + diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/mensia-decoration.png b/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/mensia-decoration.png new file mode 100644 index 0000000..d187b33 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/applications/platform/designer/share/mensia-decoration.png differ diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/archway/ovProcessUtilities.hpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/archway/ovProcessUtilities.hpp new file mode 100644 index 0000000..5338501 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/archway/ovProcessUtilities.hpp @@ -0,0 +1,125 @@ +#pragma once + +#include + +#if defined TARGET_OS_Windows +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS +#include +#include +#include +#include +#include +#include +#include +#endif + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS +namespace +{ + class CProcessEnumeratorCB : public FS::IEntryEnumeratorCallBack + { + public: + CProcessEnumeratorCB(std::string processName, bool& rbFoundProcess) : m_name(processName), m_found(rbFoundProcess) { } + + virtual FS::boolean callback(FS::IEntryEnumerator::IEntry& entry, FS::IEntryEnumerator::IAttributes& /*attributes*/) + { + std::ifstream fsInputStream; + FS::Files::openIFStream(fsInputStream, entry.getName()); + std::string fileContents; + + if (fsInputStream.is_open()) + { + while(!fsInputStream.eof()) { fsInputStream >> fileContents; } + size_t pos = fileContents.rfind(m_name); + if (pos != std::string::npos && pos == fileContents.length() - m_name.length() - 1 ) { m_found = true; } + + } + fsInputStream.close(); + return true; + } + + std::string m_name; + bool& m_found; + }; +} +#endif + +namespace OpenViBE { +namespace ProcessUtilities { +bool doesProcessExist(const std::string& name) +{ +#if defined TARGET_OS_Windows + PROCESSENTRY32 pe32; + + // Take a snapshot of all processes in the system. + const HANDLE processSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (processSnap == INVALID_HANDLE_VALUE) { return false; } + + // Set the size of the structure before using it. + pe32.dwSize = sizeof(PROCESSENTRY32); + + // Retrieve information about the first process, + // and exit if unsuccessful + if (!Process32First(processSnap, &pe32)) + { + CloseHandle(processSnap); // clean the snapshot object + return false; + } + + bool bReturnValue = false; + // Now walk the snapshot of processes + do { if (name + ".exe" == std::string(pe32.szExeFile)) { bReturnValue = true; } } while (Process32Next(processSnap, &pe32)); + + CloseHandle(processSnap); + + return bReturnValue; +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + + bool found = false; + CProcessEnumeratorCB* cb = new CProcessEnumeratorCB(name, found); + + FS::IEntryEnumerator* entry = FS::createEntryEnumerator(*cb); + entry->enumerate("/proc/*/cmdline"); + entry->release(); + + delete cb; + return found; +#endif +} + +bool launchCommand(const char* sCommandLine) +{ +#if defined TARGET_OS_Windows + /* + LPTSTR szCmdline = TEXT(const_cast(sCommandLine)); + + STARTUPINFO lpStartupInfo; + ZeroMemory(&lpStartupInfo,sizeof(lpStartupInfo)); + lpStartupInfo.cb = sizeof(lpStartupInfo); + lpStartupInfo.dwFlags |= CREATE_NEW_CONSOLE; + + PROCESS_INFORMATION lpProcessInfo; + // Create the process + if (!CreateProcess(nullptr,szCmdline, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, &lpStartupInfo, &lpProcessInfo)) { exit(1); } + */ + const std::string cmd = "start \"\" \"" + std::string(sCommandLine) + "\""; + system(cmd.c_str()); +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + + if (fork() == 0) + { + system(sCommandLine); + exit(0); + } + + // FIXME: temporary solution using system() +#endif + + return true; +} +} // namespace ProcessUtilities +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/archway/ovdCArchwayHandler.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/archway/ovdCArchwayHandler.cpp new file mode 100644 index 0000000..def49e2 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/archway/ovdCArchwayHandler.cpp @@ -0,0 +1,611 @@ +#ifdef MENSIA_DISTRIBUTION + +#include "ovdCArchwayHandler.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace OpenViBE { + +const std::string CArchwayHandler::ARCHWAY_CONFIG_FILE = (Directories::getUserDataDir() + "/studio-archway.conf").toASCIIString(); +const std::string CArchwayHandler::ARCHWAY_PIPELINES_CONFIG_FILE = (Directories::getUserDataDir() + "/studio-archway-pipeline-configuration.conf"). + toASCIIString(); + +std::string CArchwayHandler::getArchwayErrorString() const +{ + assert(m_Archway); + const auto errorCode = m_archway->getLastError(); + const auto errorString = m_archway->getErrorString(errorCode); + + std::stringstream stream; + stream << std::hex << errorCode; + return "[0x" + stream.str() + "] " + errorString; +} + + +EEngineInitialisationStatus CArchwayHandler::initialize() +{ +#if defined TARGET_OS_Windows + m_archwayModule.loadFromPath("mensia-engine.dll", "initialize"); +#elif defined TARGET_OS_Linux + m_archwayModule.loadFromPath("libmensia-engine.so", "initialize"); +#elif defined TARGET_OS_MacOS + m_archwayModule.loadFromPath("libmensia-engine.dylib", "initialize"); +#endif + + if (!m_archwayModule.isLoaded()) { return EEngineInitialisationStatus::NotAvailable; } + m_archway = new struct ArchwayAPI(); + + bool didLoad = true; + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "getLastError", &m_archway->getLastError); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "getErrorString", &m_archway->getErrorString); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "getVersionDescription", &m_archway->getVersionDescription); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "getConfigurationParameterAsString", + &m_archway->getConfigurationParameterAsString); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "getPipelineScenarioPath", &m_archway->getPipelineScenarioPath); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "initialize", &m_archway->initialize); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "startAllAcquisitionDevices", &m_archway->startAllAcquisitionDevices); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "startImpedanceCheckOnAllAcquisitionDevices", + &m_archway->startImpedanceCheckOnAllAcquisitionDevices); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "startEngine", &m_archway->startEngine); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "startEngineInFastForward", &m_archway->startEngineInFastForward); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "stopEngine", &m_archway->stopEngine); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "stopAllAcquisitionDevices", &m_archway->stopAllAcquisitionDevices); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "uninitialize", &m_archway->uninitialize); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "enumerateAvailablePipelines", &m_archway->enumerateAvailablePipelines); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "createPipeline", &m_archway->createPipeline); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "releasePipeline", &m_archway->releasePipeline); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "isPipelineRunning", &m_archway->isPipelineRunning); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "isPipelineInErrorState", &m_archway->isPipelineInErrorState); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "enumeratePipelineParameters", &m_archway->enumeratePipelineParameters); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "setPipelineParameterAsString", &m_archway->setPipelineParameterAsString); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "mainloop", &m_archway->mainloop); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "getPendingValueCount", &m_archway->getPendingValueCount); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "getPendingValueDimension", &m_archway->getPendingValueDimension); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "getPendingValue", &m_archway->getPendingValue); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "getPendingLogMessageCount", &m_archway->getPendingLogMessageCount); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "getPendingLogMessage", &m_archway->getPendingLogMessage); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "dropPendingValues", &m_archway->dropPendingValues); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "dropPendingEvents", &m_archway->dropPendingEvents); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "isInitialized", &m_archway->isInitialized); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "isAcquiring", &m_archway->isAcquiring); + didLoad &= System::CDynamicModuleSymbolLoader::getSymbol<>(m_archwayModule, "isStarted", &m_archway->isStarted); + + + if (!didLoad) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Failed to load symbols from Archway library [" << m_archwayModule.getErrorDetails() << + "]\n"; + delete m_archway; + m_archway = nullptr; + return EEngineInitialisationStatus::NotAvailable; + } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Working with Archway version: " << m_archway->getVersionDescription() << "\n"; + + // Now initialize the ArchwayBridge structure with closures that bridge to local Archway functions + // this way we do not have to expose the Archway object or the C API + + m_ArchwayBridge.isStarted = [this]() { return this->m_archway->isStarted(); }; + m_ArchwayBridge.getAvailableValueMatrixCount = [this](size_t valueChannelId) + { + return this->m_archway->getPendingValueCount(m_RunningPipelineId, valueChannelId); + }; + + // This function returns the last getPendingValue result as a vector + // Such encapsulation enables us to avoid a call to getPendingValueDimension + // from the client plugin. + m_ArchwayBridge.popValueMatrix = [this](const size_t valueChannelId) + { + std::vector valueMatrix; + const auto valueChannelDim = this->m_archway->getPendingValueDimension(m_RunningPipelineId, valueChannelId); + valueMatrix.resize(valueChannelDim); + if (valueChannelDim > 0) + { + if (!this->m_archway->getPendingValue(m_RunningPipelineId, valueChannelId, &valueMatrix[0])) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Failed to get pending value " << this->getArchwayErrorString().c_str() << "\n"; + } + } + return valueMatrix; + }; + + // As archway buffers signals we have to expose this function to the client plugins + m_ArchwayBridge.dropBuffers = [this]() + { + m_archway->dropPendingEvents(0); + m_archway->dropPendingValues(0); + return true; + }; + + // We save the address of the structure in the heap memory as a string and save it in + // the ConfigurationManager, this is because a box can not communicate directly with the Designer + std::ostringstream archwayBridgeAddress; + archwayBridgeAddress << static_cast(&m_ArchwayBridge); + m_kernelCtx.getConfigurationManager().createConfigurationToken("Designer_ArchwayBridgeAddress", archwayBridgeAddress.str().c_str()); + + if (!this->loadPipelineConfigurations()) { return EEngineInitialisationStatus::Failure; } + + m_EngineType = EEngineType::Local; + + // Get the starting engine type from configuration + std::ifstream archwayConfigFile; + FS::Files::openIFStream(archwayConfigFile, ARCHWAY_CONFIG_FILE.c_str()); + if (archwayConfigFile.good()) + { + try + { + std::string line; + while (std::getline(archwayConfigFile, line)) + { + std::cmatch cm; + if (std::regex_match(line.c_str(), cm, std::regex("config.server\\s*=\\s*'(lan|local)'"))) + { + if (cm[1] == "lan") { m_EngineType = EEngineType::LAN; } + } + else if (std::regex_match(line.c_str(), cm, std::regex("config.device[1]\\s*=\\s*'([^']*)'"))) { m_DeviceURL = cm[1]; } + } + } + catch (...) + { + // An exception will be thrown when using libc++ from ubuntu 14.04 + // in that case we do nothing and keep the defaults + } + } + + + if (!this->initializeArchway()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Failed to initialize the engine " << this->getArchwayErrorString().c_str() << "\n"; + return EEngineInitialisationStatus::Failure; + } + + char deviceURL[2048]; + m_archway->getConfigurationParameterAsString("config.device[1]", deviceURL, sizeof(deviceURL)); + m_DeviceURL = deviceURL; + + return EEngineInitialisationStatus::Success; +} + +bool CArchwayHandler::uninitialize() +{ + assert(m_Archway); + + if (m_archway->isStarted()) + { + if (!m_archway->stopEngine()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Failed to stop Engine " << this->getArchwayErrorString().c_str() << "\n"; + } + } + + if (m_archway->isAcquiring()) + { + if (!m_archway->stopAllAcquisitionDevices()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Failed to stop all acquisition devices " << this->getArchwayErrorString().c_str() << + "\n"; + } + } + + if (m_archway->isInitialized()) + { + if (!m_archway->uninitialize()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Failed to uninitialize Archway " << this->getArchwayErrorString().c_str() << "\n"; + } + } + + delete m_archway; + m_archway = nullptr; + + if (!this->savePipelineConfigurations()) { return false; } + + return true; +} + +CArchwayHandler::~CArchwayHandler() { if (m_archway) { this->uninitialize(); } } + + +bool CArchwayHandler::initializeArchway() +{ + assert(m_Archway); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Re-initializing engine in [" << (m_EngineType == EEngineType::Local ? "Local" : "LAN") << "]" << + "\n"; + return m_archway->initialize("user", "pass", "neurort-studio", ARCHWAY_CONFIG_FILE.c_str()); +} + +bool CArchwayHandler::uninitializeArchway() +{ + assert(m_Archway); + + if (m_archway->isInitialized()) + { + if (!m_archway->uninitialize()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Failed to uninitialize Archway " << this->getArchwayErrorString().c_str() << "\n"; + return false; + } + } + + return true; +} + +bool CArchwayHandler::reinitializeArchway() +{ + assert(m_Archway); + + if (!this->uninitializeArchway()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Failed to uninitialize Engine " << this->getArchwayErrorString().c_str() << "\n"; + return false; + } + + this->writeArchwayConfigurationFile(); + + if (!this->initializeArchway()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Failed to initialize Engine " << this->getArchwayErrorString().c_str() << "\n"; + return false; + } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Archway re-initialized \n"; + return true; +} + +bool CArchwayHandler::startEngineWithPipeline(const size_t pipelineClassID, const bool isFastForward, const bool shouldAcquireImpedance) +{ + assert(m_Archway); + + if (m_archway->isStarted()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Engine is already started\n"; + return true; + } + + if (!m_archway->isAcquiring()) + { + if (shouldAcquireImpedance) + { + if (!m_archway->startImpedanceCheckOnAllAcquisitionDevices()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to start the impedance acquisition" << this->getArchwayErrorString().c_str() << + "\n"; + return false; + } + } + else if (!m_archway->startAllAcquisitionDevices()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to start the data acquisition" << this->getArchwayErrorString().c_str() << "\n"; + return false; + } + } + + m_RunningPipelineId = m_archway->createPipeline(pipelineClassID, ""); + + if (m_RunningPipelineId == 0) + { + m_archway->stopAllAcquisitionDevices(); + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to create pipeline " << this->getArchwayErrorString().c_str() << "\n"; + return false; + } + + if (m_pipelineSettings.count(pipelineClassID) != 0) + { + for (auto& parameter : m_pipelineSettings[pipelineClassID]) + { + m_archway->setPipelineParameterAsString(m_RunningPipelineId, parameter.first.c_str(), parameter.second.c_str()); + } + } + + if (!(isFastForward ? m_archway->startEngineInFastForward() : m_archway->startEngine())) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Engine failed to start " << this->getArchwayErrorString().c_str() << "\n"; + + const size_t nPendingLogMessage = m_archway->getPendingLogMessageCount(m_RunningPipelineId); + + for (size_t i = 0; i < nPendingLogMessage; ++i) + { + size_t logLevel; + char messageBuffer[2048]; + std::string logMessages; + + m_archway->getPendingLogMessage(m_RunningPipelineId, &logLevel, messageBuffer, sizeof(messageBuffer)); + m_kernelCtx.getLogManager() << Kernel::ELogLevel(logLevel) << messageBuffer; + } + + if (!m_archway->stopAllAcquisitionDevices()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to stop all acquisition devices " << this->getArchwayErrorString().c_str() << "\n"; + } + + return false; + } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Engine Started\n"; + + return true; +} + +bool CArchwayHandler::stopEngine() +{ + assert(m_Archway); + + bool hasStopSucceeded = true; + + if (m_archway->isStarted()) + { + if (!m_archway->stopEngine()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Failed to stop Engine " << this->getArchwayErrorString().c_str() << "\n"; + hasStopSucceeded = false; + } + } + + if (m_archway->isAcquiring()) + { + if (!m_archway->stopAllAcquisitionDevices()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Failed to all acquisition devices " << this->getArchwayErrorString().c_str() << "\n"; + hasStopSucceeded = false; + } + } + + if (m_RunningPipelineId != 0) + { + if (!m_archway->releasePipeline(m_RunningPipelineId)) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Failed to release pipeline [" << m_RunningPipelineId << "] " << this-> + getArchwayErrorString().c_str() << "\n"; + hasStopSucceeded = false; + } + + m_RunningPipelineId = 0; + } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Engine Stopped\n"; + return hasStopSucceeded; +} + +bool CArchwayHandler::loopEngine() +{ + assert(m_Archway); + + const bool success = m_archway->mainloop(); + + const bool isPipelineRunning = m_archway->isPipelineRunning(m_RunningPipelineId); + const bool isPipelineInErrorState = m_archway->isPipelineInErrorState(m_RunningPipelineId); + + if (!isPipelineRunning) { m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Pipeline [" << m_RunningPipelineId << "] is not running.\n"; } + + if (isPipelineInErrorState) { m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Pipeline [" << m_RunningPipelineId << "] is in error state.\n"; } + + const size_t nPendingLogMessage = m_archway->getPendingLogMessageCount(m_RunningPipelineId); + + for (size_t i = 0; i < nPendingLogMessage; ++i) + { + size_t logLevel; + char messageBuffer[2048]; + std::string logMessages; + + m_archway->getPendingLogMessage(m_RunningPipelineId, &logLevel, messageBuffer, sizeof(messageBuffer)); + m_kernelCtx.getLogManager() << Kernel::ELogLevel(logLevel) << messageBuffer; + } + + if (!isPipelineRunning || isPipelineInErrorState) + { + if (!this->stopEngine()) { return false; } + + m_GUIBridge.refreshStoppedEngine(); + + return success && !isPipelineInErrorState; + } + + return success; +} + +bool CArchwayHandler::isEngineStarted() +{ + if (!m_archway) { return false; } + return m_archway->isStarted(); +} + +namespace { +void enumerateEnginePipelinesCallback(const size_t pipelineID, const char* pipelineDescription, void* userData) +{ + const auto callbackParameters = static_cast*, std::map>*>*>(userData); + auto enginePipelines = callbackParameters->first; + const auto pipelineSettings = callbackParameters->second; + + enginePipelines->push_back({ pipelineID, pipelineDescription, pipelineSettings->count(pipelineID) != 0 }); +} + +void enumeratePipelineParametersCallback(size_t/*pipelineID*/, const char* parameterName, const char* parameterValue, void* userData) +{ + // This callback will go through the pipeline parameters one by one and push them into the + // vector of SPipelineParameters which is passed as the first element of the data input pair + // This callback receives the parameter's name and default value from Archway, which is why we pass + // it the list of the _currently set_ parameters for the pipeline + const auto parameters = static_cast*, std::map const*>*>(userData); + + // Our output parameter is the list of pipeline parameters + auto pipelineParameters = parameters->first; + // Our additional input parameter is the map of currently set parameters for the pipeline + // (note that if no parameters are set for the pipeline then this pointer will be null) + const auto pipelineSettings = parameters->second; + + // Search for the currently set value of the currently handled parameter + std::string str; + + if (pipelineSettings && pipelineSettings->count(parameterName) != 0) { str = pipelineSettings->at(parameterName); } + + pipelineParameters->push_back({ parameterName, parameterValue, str }); +} +} // namespace + +std::vector CArchwayHandler::getEnginePipelines() const +{ + assert(m_Archway); + + std::vector enginePipelines; + auto callbackParameters = make_pair(&enginePipelines, &m_pipelineSettings); + + if (!m_archway->enumerateAvailablePipelines(enumerateEnginePipelinesCallback, &callbackParameters)) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Failed enumerate the available pipelines " << this->getArchwayErrorString().c_str() << "\n"; + } + + return enginePipelines; +} + +std::vector CArchwayHandler::getPipelineParameters(const size_t pipelineClassID) const +{ + assert(m_Archway); + + std::vector pipelineParameters; + std::map const* pipelineSettings = nullptr; + + if (m_pipelineSettings.count(pipelineClassID) != 0) { pipelineSettings = &m_pipelineSettings.at(pipelineClassID); } + + auto callbackParameters = std::make_pair(&pipelineParameters, pipelineSettings); + + const size_t pipelineID = m_archway->createPipeline(pipelineClassID, ""); + + if (!m_archway->enumeratePipelineParameters(pipelineID, enumeratePipelineParametersCallback, &callbackParameters)) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Failed enumerate the pipeline's parameters " << this->getArchwayErrorString().c_str() << + "\n"; + } + + if (!m_archway->releasePipeline(pipelineID)) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Failed to release pipeline " << this->getArchwayErrorString().c_str() << "\n"; + } + + return pipelineParameters; +} + +std::string CArchwayHandler::getPipelineScenarioPath(size_t pipelineClassID) const +{ + assert(m_Archway); + + char messageBuffer[2048]; + std::string logMessages; + + if (!m_archway->getPipelineScenarioPath(pipelineClassID, messageBuffer, sizeof(messageBuffer))) { return ""; } + return std::string(messageBuffer); +} + + +bool CArchwayHandler::setPipelineParameterValue(const size_t pipelineClassID, std::string const& parameterName, std::string const& parameterValue) +{ + if (m_pipelineSettings.find(pipelineClassID) == m_pipelineSettings.end()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to set the value [" << parameterValue << "] to the parameter [" << parameterName << + "]. The pipeline class id is invalid.\n"; + return false; + } + + if (parameterValue != "") { m_pipelineSettings[pipelineClassID][parameterName] = parameterValue; } + else + { + if (m_pipelineSettings.count(pipelineClassID) != 0) + { + if (m_pipelineSettings[pipelineClassID].count(parameterName) != 0) + { + m_pipelineSettings[pipelineClassID].erase(m_pipelineSettings[pipelineClassID].find(parameterName)); + if (m_pipelineSettings[pipelineClassID].size() == 0) { m_pipelineSettings.erase(m_pipelineSettings.find(pipelineClassID)); } + } + } + } + + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Set [" << uiPipelineClassId << "/" << sParameterName << "] to [" << sParameterValue << "]\n"; + return true; +} + +bool CArchwayHandler::writeArchwayConfigurationFile() +{ + std::ofstream file; + FS::Files::openOFStream(file, ARCHWAY_CONFIG_FILE.c_str()); + + if (!file.good()) + { + file.close(); + return false; + } + + file << "config.server = '" << (m_EngineType == EEngineType::LAN ? "lan" : "local") << "'\n"; + file << "config.device[1] = '" << m_DeviceURL << "'\n"; + file.close(); + + return true; +} + +bool CArchwayHandler::savePipelineConfigurations() +{ + std::ofstream file; + FS::Files::openOFStream(file, ARCHWAY_PIPELINES_CONFIG_FILE.c_str()); + + if (!file.good()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Cannot open file for writing\n"; + return false; + } + + for (auto& pipeline : m_pipelineSettings) + { + for (auto& setting : pipeline.second) { file << pipeline.first << "\t" << setting.first << "\t" << setting.second << "\n"; } + } + + file.close(); + + return true; +} + +bool CArchwayHandler::loadPipelineConfigurations() +{ + std::ifstream file; + FS::Files::openIFStream(file, ARCHWAY_PIPELINES_CONFIG_FILE.c_str()); + + if (!file.good()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Cannot open Engine Pipeline Configuration file for reading\n"; + return false; + } + + while (!file.eof()) + { + size_t pipelineClassID; + file >> pipelineClassID; + + std::string parameterName; + // The first one simply trashes the tab after the pipeline Id + getline(file, parameterName, '\t'); + getline(file, parameterName, '\t'); + + std::string parameterValue; + getline(file, parameterValue, '\n'); + + if (parameterValue != "") + { + m_pipelineSettings[pipelineClassID]; + m_pipelineSettings[pipelineClassID][parameterName] = parameterValue; + } + } + + file.close(); + + return true; +} + +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/archway/ovdCArchwayHandler.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/archway/ovdCArchwayHandler.h new file mode 100644 index 0000000..197cdac --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/archway/ovdCArchwayHandler.h @@ -0,0 +1,144 @@ +#pragma once + +#ifdef MENSIA_DISTRIBUTION + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace OpenViBE { +enum class EEngineType { Local, LAN }; + +enum class EEngineInitialisationStatus { Success, Failure, NotAvailable }; + +struct SPipelineParameter +{ + std::string name; + std::string defaultValue; + std::string value; +}; + +struct SPipeline +{ + size_t id; + std::string description; + bool isConfigured; +}; + +struct SArchwayBridge +{ + std::function isStarted; + std::function getAvailableValueMatrixCount; + std::function(size_t)> popValueMatrix; + std::function dropBuffers; +}; + +struct SGUIBridge +{ + std::function refreshStoppedEngine; +}; + +class CArchwayHandler final +{ +public: + explicit CArchwayHandler(const Kernel::IKernelContext& ctx) : m_DeviceURL("simulator://"), m_kernelCtx(ctx) { } + ~CArchwayHandler(); + + EEngineInitialisationStatus initialize(); + bool uninitialize(); + + bool reinitializeArchway(); + std::vector getEnginePipelines() const; + std::vector getPipelineParameters(size_t pipelineClassID) const; + bool setPipelineParameterValue(size_t pipelineClassID, std::string const& parameterName, std::string const& parameterValue); + std::string getPipelineScenarioPath(size_t pipelineID) const; + + bool startEngineWithPipeline(size_t pipelineClassID, bool isFastForward, bool shouldAcquireImpedance); + bool loopEngine(); + bool stopEngine(); + + bool isEngineStarted(); + bool writeArchwayConfigurationFile(); + + std::map& getPipelineSettings(const size_t pipelineClassID) { return m_pipelineSettings[pipelineClassID]; } + + SArchwayBridge m_ArchwayBridge; + SGUIBridge m_GUIBridge; + std::string m_DeviceURL; + EEngineType m_EngineType = EEngineType::Local; + +private: + bool initializeArchway(); + bool uninitializeArchway(); + bool savePipelineConfigurations(); + bool loadPipelineConfigurations(); + std::string getArchwayErrorString() const; + +private: + typedef void (*FPEnumerateAvailablePipelinesCallback)(size_t pipelineClassID, const char* pipelineDescription, void* userData); + typedef void (*FPEnumeratePipelineParametersCallback)(size_t pipelineID, const char* parameterName, const char* parameterValue, void* userData); + + struct ArchwayAPI + { + size_t (*getLastError)(); + const char* (*getErrorString)(size_t errorCode); + + const char* (*getVersionDescription)(); + + void (*getConfigurationParameterAsString)(const char* configurationParameter, char* outputBuffer, size_t bufferLength); + bool (*getPipelineScenarioPath)(size_t pipelineID, char* messageBuffer, size_t bufferLength); + + bool (*initialize)(const char* login, const char* password, const char* applicationName, const char* configFilename); + bool (*startAllAcquisitionDevices)(); + bool (*startImpedanceCheckOnAllAcquisitionDevices)(); + bool (*startEngine)(); + bool (*startEngineInFastForward)(); + bool (*stopEngine)(); + bool (*stopAllAcquisitionDevices)(); + bool (*uninitialize)(); + + bool (*enumerateAvailablePipelines)(FPEnumerateAvailablePipelinesCallback callback, void* userData); + size_t (*createPipeline)(size_t pipelineClassID, const char* profileName); + bool (*releasePipeline)(size_t pipelineID); + bool (*isPipelineRunning)(size_t pipelineID); + bool (*isPipelineInErrorState)(size_t pipelineID); + + bool (*enumeratePipelineParameters)(size_t pipelineID, FPEnumeratePipelineParametersCallback callback, void* userData); + bool (*setPipelineParameterAsString)(size_t pipelineID, const char* parameterName, const char* value); + + bool (*mainloop)(); + size_t (*getPendingValueCount)(size_t pipelineID, size_t matrixOutputIdx); + size_t (*getPendingValueDimension)(size_t pipelineID, size_t matrixOutputIdx); + bool (*getPendingValue)(size_t pipelineID, size_t matrixOutputIdx, float* value); + size_t (*getPendingLogMessageCount)(size_t pipelineID); + bool (*getPendingLogMessage)(size_t pipelineID, size_t* logLevel, char* messageBuffer, size_t bufferSize); + + bool (*dropPendingValues)(size_t pipelineID); + bool (*dropPendingEvents)(size_t pipelineID); + + bool (*isInitialized)(); + bool (*isAcquiring)(); + bool (*isStarted)(); + }; + + struct ArchwayAPI* m_archway = nullptr; + System::CDynamicModule m_archwayModule; + const Kernel::IKernelContext& m_kernelCtx; + + // Current Configuration + std::map> m_pipelineSettings; + + static const std::string ARCHWAY_CONFIG_FILE; + static const std::string ARCHWAY_PIPELINES_CONFIG_FILE; + + size_t m_RunningPipelineId = 0; +}; +} // namespace OpenViBE + +#endif diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/archway/ovdCArchwayHandlerGUI.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/archway/ovdCArchwayHandlerGUI.cpp new file mode 100644 index 0000000..caa9676 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/archway/ovdCArchwayHandlerGUI.cpp @@ -0,0 +1,482 @@ +#ifdef MENSIA_DISTRIBUTION +#include "ovdCArchwayHandlerGUI.h" +#include +#include +#include +#include +#include +#include + +#include "../ovdCApplication.h" +#include "ovProcessUtilities.hpp" + +#if defined TARGET_OS_Windows +#define pclose _pclose +#endif + +namespace OpenViBE { + +namespace { +enum EnginePipelinesModelColumn +{ + Column_PipelineId = 0, + Column_PipelineHexId, + Column_PipelineDescription, + Column_PipelineIsConfigured +}; + +enum PipelineConfigurationModelColumn +{ + Column_SettingPipelineId = 0, + Column_SettingName = 1, + Column_SettingDefaultValue = 2, + Column_SettingValue = 3 +}; + +void on_button_configure_acquisition_clicked(GtkMenuItem* menuItem, gpointer data) +{ + auto gui = static_cast(data); + + const std::string configToolLaunchCmd = std::string(Directories::getBinDir().toASCIIString()) + "/mensia-device-configuration"; + //std::string configFilePath = std::string(getenv("USERPROFILE")) + "\\lib-mensia-engine.conf"; + + std::string escapedURL = gui->m_Controller.m_DeviceURL; + + size_t startPosition = 0; + while ((startPosition = escapedURL.find('\"', startPosition)) != std::string::npos) + { + escapedURL.replace(startPosition, 1, "\\\""); + startPosition += 2; // Handles case where 'to' is a substring of 'from' + } + + +#if defined TARGET_OS_Windows + std::string command = "\"\"" + configToolLaunchCmd + "\" --no-file \"" + escapedURL + "\"\""; + for (std::string stringToEscape : { "^", "<", ">", "&", "|", "%" }) // ^ must be escaped first! + { + startPosition = 0; + while ((startPosition = command.find(stringToEscape, startPosition)) != std::string::npos) + { + command.replace(startPosition, stringToEscape.size(), "^" + stringToEscape); + startPosition += 1 + stringToEscape.size(); + } + } +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + std::string command = configurationToolLaunchCmd + " --no-file \"" + escapedURL + "\""; +#endif + FILE* commandPipe = FS::Files::popen(command.c_str(), "r"); + + char buffer[512]; + std::stringstream urlStream; + while (fgets(buffer, sizeof(buffer), commandPipe) != nullptr) { urlStream << buffer; } + pclose(commandPipe); + + auto deviceURL = urlStream.str(); + deviceURL = deviceURL.substr(0, deviceURL.length() - 1); + + gui->m_Controller.m_DeviceURL = deviceURL; + gui->m_Controller.writeArchwayConfigurationFile(); +} + +void on_button_reinitialize_archway_clicked(GtkMenuItem*, gpointer data) +{ + auto gui = static_cast(data); + const auto engineTypeCombobox = GTK_COMBO_BOX(gtk_builder_get_object(gui->m_Builder, "combobox-engine-connection-type")); + gui->m_Controller.m_EngineType = (gtk_combo_box_get_active(engineTypeCombobox) == 0 ? EEngineType::Local : EEngineType::LAN); + + gui->m_Controller.reinitializeArchway(); + gui->refreshEnginePipelines(); +} + +void on_combobox_engine_type_changed(GtkComboBox*, gpointer data) +{ + const auto gui = static_cast(data); + if (gtk_combo_box_get_active(gui->m_ComboBoxEngineType) == 0) { gtk_widget_set_sensitive(gui->m_ButtonLaunchEngine, FALSE); } + else { gtk_widget_set_sensitive(gui->m_ButtonLaunchEngine, TRUE); } + on_button_reinitialize_archway_clicked(nullptr, data); +} + +gboolean on_dialog_engine_configuration_delete_event(GtkDialog* dialog, GdkEvent*, gpointer data) +{ + const auto gui = static_cast(data); + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(gui->m_ButtonOpenEngineConfigurationDialog), false); + gtk_widget_hide(GTK_WIDGET(dialog)); + return TRUE; +} + +gboolean on_dialog_pipeline_configuration_delete_event(GtkDialog* pDialog, GdkEvent*, gpointer) +{ + gtk_dialog_response(pDialog, GTK_RESPONSE_CANCEL); + gtk_widget_hide(GTK_WIDGET(pDialog)); + return TRUE; +} + +void view_pipeline_config(CArchwayHandlerGUI* gui) +{ + const auto treeModel = gtk_tree_view_get_model(GTK_TREE_VIEW(gui->m_TreeViewEnginePipelines)); + guint64 pipelineID; + gtk_tree_model_get(treeModel, &gui->m_SelectedPipelineIter, Column_PipelineId, &pipelineID, -1); + + gui->displayPipelineConfigurationDialog(size_t(pipelineID)); + + auto enginePipelines = gui->m_Controller.getEnginePipelines(); + for (const auto& pipeline : enginePipelines) + { + if (pipeline.id != pipelineID) { continue; } + gtk_list_store_set(GTK_LIST_STORE(treeModel), &gui->m_SelectedPipelineIter, Column_PipelineIsConfigured, pipeline.isConfigured, -1); + } +} + +void view_popup_menu_onOpenScenario(GtkWidget* menuitem, gpointer data) +{ + auto gui = static_cast(data); + const auto treeModel = gtk_tree_view_get_model(GTK_TREE_VIEW(gui->m_TreeViewEnginePipelines)); + guint64 pipelineID; + gtk_tree_model_get(treeModel, &gui->m_SelectedPipelineIter, Column_PipelineId, &pipelineID, -1); + + if (gui->m_Controller.m_EngineType == EEngineType::Local) + { + const std::string path = gui->m_Controller.getPipelineScenarioPath(size_t(pipelineID)); + gui->m_Application->openScenario(path.c_str()); + } +} + +void view_popup_menu_onConfItem(GtkWidget* menuitem, gpointer data) +{ + const auto gui = static_cast(data); + view_pipeline_config(gui); +} + +void on_treeview_engine_pipelines_popup_menu(CArchwayHandlerGUI* gui, GdkEventButton* event) +{ + GtkWidget* menu = gtk_menu_new(); + GtkWidget* openConfItem = gtk_menu_item_new_with_label("Open configuration file"); + g_signal_connect(openConfItem, "activate", GCallback(view_popup_menu_onConfItem), gui); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), openConfItem); + + if (gui->m_Controller.m_EngineType == EEngineType::Local) + { + GtkWidget* openScenarioItem = gtk_menu_item_new_with_label("Open scenario"); + g_signal_connect(openScenarioItem, "activate", GCallback(view_popup_menu_onOpenScenario), gui); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), openScenarioItem); + } + + gtk_widget_show_all(menu); + gtk_menu_popup(GTK_MENU(menu), nullptr, nullptr, nullptr, nullptr, event->button, gdk_event_get_time(reinterpret_cast(event))); +} + +gboolean on_treeview_engine_pipelines_button_pressed(GtkWidget* treeView, GdkEventButton* event, gpointer userData) +{ + // Only acknowledge, if it's a right click, or double click + if (!(event->type == GDK_BUTTON_PRESS && event->button == 3) && !(event->type == GDK_2BUTTON_PRESS && event->button == 1)) { return FALSE; } + + auto gui = static_cast(userData); + + GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gui->m_TreeViewEnginePipelines)); + if (gtk_tree_selection_count_selected_rows(selection) == 1) + { + gtk_tree_selection_get_selected(selection, &gui->m_TreeModelEnginePipelines, &gui->m_SelectedPipelineIter); + + // single click with the right mouse button + if (event->type == GDK_BUTTON_PRESS && event->button == 3) + { + on_treeview_engine_pipelines_popup_menu(gui, event); + return TRUE; + } + else if (event->type == GDK_2BUTTON_PRESS && event->button == 1) + { + view_pipeline_config(gui); + return TRUE; + } + } + return FALSE; +} + +void startEngine(GtkWidget* widget, gpointer data, bool isFastForward) +{ + auto gui = static_cast(data); + + // Get the currently selected pipeline in the list + const auto selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gui->m_TreeViewEnginePipelines)); + + if (gtk_tree_selection_count_selected_rows(selection) == 1) + { + gtk_tree_selection_get_selected(selection, &gui->m_TreeModelEnginePipelines, &gui->m_SelectedPipelineIter); + + size_t pipelineID = 0; + gtk_tree_model_get(gui->m_TreeModelEnginePipelines, &gui->m_SelectedPipelineIter, Column_PipelineId, &pipelineID, -1); + + const bool shouldAcquireImpedance = (gtk_toggle_tool_button_get_active(gui->m_ToggleAcquireImpedance) == gboolean(true)); + if (gui->m_Controller.startEngineWithPipeline(size_t(pipelineID), isFastForward, shouldAcquireImpedance)) + { + gtk_widget_set_sensitive(GTK_WIDGET(gui->m_ToggleAcquireImpedance), false); + gtk_widget_set_sensitive(GTK_WIDGET(gui->m_ComboBoxEngineType), false); + gtk_widget_set_sensitive(gui->m_ButtonConfigureAcquisition, false); + gtk_widget_set_sensitive(gui->m_ButtonLaunchEngine, false); + gtk_widget_set_sensitive(gui->m_ButtonStartEngine, false); + gtk_widget_set_sensitive(gui->m_ButtonStartEngineFastFoward, false); + gtk_widget_set_sensitive(gui->m_ButtonStopEngine, true); + gtk_widget_set_sensitive(gui->m_TreeViewEnginePipelines, false); + gtk_spinner_start(gui->m_SpinnerEngineActivity); + gtk_widget_show(GTK_WIDGET(gui->m_SpinnerEngineActivity)); + } + } + else + { + const auto alertDialog = gtk_message_dialog_new(nullptr, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Please select a pipeline to run."); + gtk_dialog_run(GTK_DIALOG(alertDialog)); + gtk_widget_destroy(alertDialog); + } +} + +void on_button_start_engine_clicked(GtkWidget* widget, gpointer data) { startEngine(widget, data, false); } + +void on_button_start_engine_fast_forward_clicked(GtkWidget* widget, gpointer data) { startEngine(widget, data, true); } + +void on_button_stop_engine_clicked(GtkWidget* widget, gpointer data) +{ + auto gui = static_cast(data); + + if (gui->m_Controller.stopEngine()) + { + gtk_widget_set_sensitive(GTK_WIDGET(gui->m_ToggleAcquireImpedance), true); + gtk_widget_set_sensitive(GTK_WIDGET(gui->m_ComboBoxEngineType), true); + gtk_widget_set_sensitive(gui->m_ButtonConfigureAcquisition, true); + gtk_widget_set_sensitive(gui->m_ButtonLaunchEngine, true); + gtk_widget_set_sensitive(gui->m_ButtonStartEngine, true); + gtk_widget_set_sensitive(gui->m_ButtonStartEngineFastFoward, true); + gtk_widget_set_sensitive(gui->m_ButtonStopEngine, false); + gtk_widget_set_sensitive(gui->m_TreeViewEnginePipelines, true); + gtk_spinner_stop(gui->m_SpinnerEngineActivity); + gtk_widget_hide(GTK_WIDGET(gui->m_SpinnerEngineActivity)); + } +} + +void on_button_pipeline_configuration_apply_clicked(GtkWidget* widget, gpointer) +{ + GtkWidget* dialog = gtk_widget_get_parent(gtk_widget_get_parent((gtk_widget_get_parent(widget)))); + gtk_dialog_response(GTK_DIALOG(dialog), GTK_RESPONSE_APPLY); + gtk_widget_hide(dialog); +} + +void on_button_pipeline_configuration_cancel_clicked(GtkWidget* widget, gpointer) +{ + GtkWidget* dialog = gtk_widget_get_parent(gtk_widget_get_parent((gtk_widget_get_parent(widget)))); + gtk_dialog_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL); + gtk_widget_hide(dialog); +} + +void on_pipeline_configuration_cellrenderer_parameter_value_edited(GtkCellRendererText* cell, gchar* path, gchar* newText, gpointer data) +{ + auto gui = static_cast(data); + gui->setPipelineParameterValueAtPath(path, newText); +} + +gboolean on_pipeline_configuration_cellrenderer_parameter_value_entry_focus_out(GtkWidget* widget, GdkEvent* event, gpointer data) +{ + auto gui = static_cast(data); + const auto entry = GTK_ENTRY(widget); + gui->setPipelineParameterValueAtPath(gui->m_CurrentlyEditedCellPath.c_str(), gtk_entry_get_text(entry)); + return FALSE; +} + +void on_pipeline_configuration_cellrenderer_parameter_value_editing_started(GtkCellRenderer* cell, GtkCellEditable* editable, gchar* path, gpointer data) +{ + auto gui = static_cast(data); + + // As we are sending data to a callback created within a callback, we really want to avoid + // allocating memory. + gui->m_CurrentlyEditedCellPath = path; + + const auto entry = GTK_ENTRY(editable); + g_signal_connect(G_OBJECT(entry), + "focus-out-event", + G_CALLBACK(on_pipeline_configuration_cellrenderer_parameter_value_entry_focus_out), data); +} + + +void on_button_launch_engine_clicked(GtkWidget* widget, gpointer data) +{ + // auto gui = static_cast(data); + + if (!ProcessUtilities::doesProcessExist("mensia-engine-server")) + { +#if defined TARGET_OS_Windows + if (FS::Files::fileExists(Directories::getBinDir() + "/mensia-engine-server.exe")) + { + ProcessUtilities::launchCommand(std::string(Directories::getBinDir() + "/mensia-engine-server.exe").c_str()); + } + else if (FS::Files::fileExists("C:/Program Files (x86)/NeuroRT/NeuroRT Engine Server/bin/mensia-engine-server.exe")) + { + ProcessUtilities::launchCommand(std::string("C:/Program Files (x86)/NeuroRT/NeuroRT Engine Server/neurort-engine-server.cmd").c_str()); + } +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + if (FS::Files::fileExists(Directories::getBinDir() + "/mensia-engine-server")) + { + ProcessUtilities::launchCommand(std::string(Directories::getBinDir() + "/mensia-engine-server").c_str()); + } +#endif + } +} +} + +CArchwayHandlerGUI::CArchwayHandlerGUI(CArchwayHandler& controller, Designer::CApplication* application) + : m_Controller(controller), m_Application(application) +{ + m_Builder = gtk_builder_new(); + GError* gtkError = nullptr; + gtk_builder_add_from_file(m_Builder, Directories::getDataDir() + "/applications/designer/interface-archway.ui", >kError); + + assert(gtkError == nullptr); + // gtk_builder_connect_signals(m_builder, nullptr); + + + m_ButtonConfigureAcquisition = GTK_WIDGET(gtk_builder_get_object(m_Builder, "button-configure-acquisition")); + g_signal_connect(G_OBJECT(m_ButtonConfigureAcquisition), "clicked", G_CALLBACK(on_button_configure_acquisition_clicked), this); + + m_ButtonReinitializeArchway = GTK_WIDGET(gtk_builder_get_object(m_Builder, "button-reinitialize-archway")); + g_signal_connect(G_OBJECT(m_ButtonReinitializeArchway), "clicked", G_CALLBACK(on_button_reinitialize_archway_clicked), this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "button-pipeline-configuration-apply")), + "clicked", G_CALLBACK(on_button_pipeline_configuration_apply_clicked), this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "button-pipeline-configuration-cancel")), + "clicked", G_CALLBACK(on_button_pipeline_configuration_cancel_clicked), this); + + m_SpinnerEngineActivity = GTK_SPINNER(gtk_builder_get_object(m_Builder, "spinner-engine-activity")); + gtk_widget_hide(GTK_WIDGET(m_SpinnerEngineActivity)); + + m_ToggleAcquireImpedance = GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "toggle-acquire-impedance")); + + m_ButtonStartEngine = GTK_WIDGET(gtk_builder_get_object(m_Builder, "button-start-engine")); + m_ButtonStartEngineFastFoward = GTK_WIDGET(gtk_builder_get_object(m_Builder, "button-start-engine-fast")); + m_ButtonStopEngine = GTK_WIDGET(gtk_builder_get_object(m_Builder, "button-stop-engine")); + gtk_widget_set_sensitive(m_ButtonStopEngine, false); + + g_signal_connect(G_OBJECT(m_ButtonStartEngine), "clicked", G_CALLBACK(on_button_start_engine_clicked), this); + g_signal_connect(G_OBJECT(m_ButtonStartEngineFastFoward), "clicked", G_CALLBACK(on_button_start_engine_fast_forward_clicked), this); + g_signal_connect(G_OBJECT(m_ButtonStopEngine), "clicked", G_CALLBACK(on_button_stop_engine_clicked), this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "dialog-engine-configuration")), + "delete-event", G_CALLBACK(on_dialog_engine_configuration_delete_event), this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "dialog-pipeline-configuration")), + "delete-event", G_CALLBACK(on_dialog_pipeline_configuration_delete_event), this); + + m_TreeViewEnginePipelines = GTK_WIDGET(gtk_builder_get_object(m_Builder, "treeview-engine-pipelines")); + g_signal_connect(m_TreeViewEnginePipelines, "button-press-event", GCallback(on_treeview_engine_pipelines_button_pressed), this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "pipeline-configuration-cellrenderer-parameter-value")), + "edited", + G_CALLBACK(on_pipeline_configuration_cellrenderer_parameter_value_edited), this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "pipeline-configuration-cellrenderer-parameter-value")), + "editing-started", + G_CALLBACK(on_pipeline_configuration_cellrenderer_parameter_value_editing_started), this); + + m_TreeModelEnginePipelines = GTK_TREE_MODEL(gtk_builder_get_object(m_Builder, "liststore-pipelines")); + + m_Controller.m_GUIBridge.refreshStoppedEngine = [this]() + { + gtk_widget_set_sensitive(GTK_WIDGET(m_ToggleAcquireImpedance), true); + gtk_widget_set_sensitive(GTK_WIDGET(m_ComboBoxEngineType), true); + gtk_widget_set_sensitive(m_ButtonConfigureAcquisition, true); + gtk_widget_set_sensitive(m_ButtonLaunchEngine, true); + gtk_widget_set_sensitive(m_ButtonStartEngine, true); + gtk_widget_set_sensitive(m_ButtonStartEngineFastFoward, true); + gtk_widget_set_sensitive(m_ButtonStopEngine, false); + gtk_widget_set_sensitive(m_TreeViewEnginePipelines, true); + gtk_spinner_stop(m_SpinnerEngineActivity); + gtk_widget_hide(GTK_WIDGET(m_SpinnerEngineActivity)); + }; + + m_ComboBoxEngineType = GTK_COMBO_BOX(gtk_builder_get_object(m_Builder, "combobox-engine-connection-type")); + g_signal_connect(G_OBJECT(m_ComboBoxEngineType), "changed", G_CALLBACK(on_combobox_engine_type_changed), this); + + m_ButtonLaunchEngine = GTK_WIDGET(gtk_builder_get_object(m_Builder, "button-launch-engine-server")); + g_signal_connect(G_OBJECT(m_ButtonLaunchEngine), "clicked", G_CALLBACK(on_button_launch_engine_clicked), this); +} + +CArchwayHandlerGUI::~CArchwayHandlerGUI() { if (m_Builder) { g_object_unref(G_OBJECT(m_Builder)); } } + +void CArchwayHandlerGUI::refreshEnginePipelines() +{ + const auto listStorePipelines = GTK_LIST_STORE(m_TreeModelEnginePipelines); + + gtk_list_store_clear(listStorePipelines); + auto enginePipelines = m_Controller.getEnginePipelines(); + GtkTreeIter iter; + for (auto& pipeline : enginePipelines) + { + std::stringstream pipelineIdInHex; + pipelineIdInHex << std::hex << pipeline.id; + + gtk_list_store_append(listStorePipelines, &iter); + gtk_list_store_set(listStorePipelines, &iter, Column_PipelineId, pipeline.id, Column_PipelineHexId, pipelineIdInHex.str().c_str(), + Column_PipelineDescription, pipeline.description.c_str(), Column_PipelineIsConfigured, pipeline.isConfigured, -1); + } +} + +void CArchwayHandlerGUI::toggleNeuroRTEngineConfigurationDialog(const bool shouldDisplay) +{ + const auto engineConfigurationWidget = GTK_WIDGET(gtk_builder_get_object(m_Builder, "dialog-engine-configuration")); + + if (shouldDisplay) + { + gtk_combo_box_set_active(m_ComboBoxEngineType, m_Controller.m_EngineType == EEngineType::Local ? 0 : 1); + this->refreshEnginePipelines(); + gtk_widget_show(engineConfigurationWidget); + } + else { gtk_widget_hide(engineConfigurationWidget); } +} + +void CArchwayHandlerGUI::displayPipelineConfigurationDialog(const size_t pipelineID) +{ + const auto pipelineConfigurationWidget = GTK_WIDGET(gtk_builder_get_object(m_Builder, "dialog-pipeline-configuration")); + const auto pipelineConfigurationListStore = GTK_LIST_STORE(gtk_builder_get_object(m_Builder, "liststore-pipeline-configuration")); + + gtk_list_store_clear(pipelineConfigurationListStore); + + auto pipelineParameters = m_Controller.getPipelineParameters(pipelineID); + + GtkTreeIter iter; + for (auto& parameter : pipelineParameters) + { + gtk_list_store_append(pipelineConfigurationListStore, &iter); + gtk_list_store_set(pipelineConfigurationListStore, &iter, + Column_SettingPipelineId, static_cast(pipelineID), + Column_SettingName, parameter.name.c_str(), + Column_SettingDefaultValue, parameter.defaultValue.c_str(), + Column_SettingValue, parameter.value.c_str(), + -1); + } + + const auto savedSettings = m_Controller.getPipelineSettings(pipelineID); + const auto response = gtk_dialog_run(GTK_DIALOG(pipelineConfigurationWidget)); + if (response == GTK_RESPONSE_CANCEL) { m_Controller.getPipelineSettings(pipelineID) = savedSettings; } +} + +bool CArchwayHandlerGUI::setPipelineParameterValueAtPath(gchar const* path, gchar const* value) +{ + const auto pipelineConfigurationListStore = + GTK_TREE_MODEL(gtk_builder_get_object(this->m_Builder, "liststore-pipeline-configuration")); + + GtkTreeIter iter; + gboolean valid = gtk_tree_model_get_iter_from_string(pipelineConfigurationListStore, &iter, path); + assert(valid); + + size_t id = 0; + gchar* name; + + gtk_tree_model_get(pipelineConfigurationListStore, &iter, Column_SettingName, &name, -1); + gtk_tree_model_get(pipelineConfigurationListStore, &iter, Column_SettingPipelineId, &id, -1); + gtk_list_store_set(GTK_LIST_STORE(pipelineConfigurationListStore), &iter, Column_SettingValue, value, -1); + + this->m_Controller.setPipelineParameterValue(size_t(id), name, value); + g_free(name); + + return true; +} + +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/archway/ovdCArchwayHandlerGUI.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/archway/ovdCArchwayHandlerGUI.h new file mode 100644 index 0000000..cd88a0b --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/archway/ovdCArchwayHandlerGUI.h @@ -0,0 +1,58 @@ +#pragma once + +#ifdef MENSIA_DISTRIBUTION + +#include "ovdCArchwayHandler.h" +#include + +namespace OpenViBE { +namespace Designer { +class CApplication; +} +} + +namespace OpenViBE { +class CArchwayHandlerGUI final +{ +public: + CArchwayHandlerGUI(CArchwayHandler& controller, Designer::CApplication* application); + ~CArchwayHandlerGUI(); + + void refreshEnginePipelines(); + void toggleNeuroRTEngineConfigurationDialog(const bool shouldDisplay); + void displayPipelineConfigurationDialog(const size_t pipelineID); + + bool setPipelineParameterValueAtPath(gchar const* path, gchar const* value); + + GtkBuilder* m_Builder = nullptr; + GtkBuilder* m_ApplicationBuilder = nullptr; + CArchwayHandler& m_Controller; + Designer::CApplication* m_Application = nullptr; + + // This variable is used to store the path of an edited cell + // while editing the PipelineParameters. + std::string m_CurrentlyEditedCellPath; + + GtkWidget* m_ButtonOpenEngineConfigurationDialog = nullptr; + + GtkWidget* m_ButtonConfigureAcquisition = nullptr; + GtkToggleToolButton* m_ToggleAcquireImpedance = nullptr; + + GtkComboBox* m_ComboBoxEngineType = nullptr; + GtkWidget* m_ButtonReinitializeArchway = nullptr; + GtkWidget* m_ButtonLaunchEngine = nullptr; + + GtkWidget* m_ButtonStartEngine = nullptr; + GtkWidget* m_ButtonStartEngineFastFoward = nullptr; + GtkWidget* m_ButtonStopEngine = nullptr; + + GtkWidget* m_TreeViewEnginePipelines = nullptr; + + GtkSpinner* m_SpinnerEngineActivity = nullptr; + + GtkTreeModel* m_TreeModelEnginePipelines = nullptr; + GtkTreeIter m_SelectedPipelineIter; +}; +} + +#endif diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCAbstractSettingView.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCAbstractSettingView.cpp new file mode 100755 index 0000000..fcdfe5c --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCAbstractSettingView.cpp @@ -0,0 +1,94 @@ +#include "ovdCAbstractSettingView.h" + +namespace OpenViBE { +namespace Designer { +namespace Setting { + +static void CollectWidgetCB(GtkWidget* widget, gpointer data) { static_cast*>(data)->push_back(widget); } + +CAbstractSettingView::~CAbstractSettingView() +{ + if (GTK_IS_WIDGET(m_nameWidget)) { gtk_widget_destroy(m_nameWidget); } + if (GTK_IS_WIDGET(m_entryNameWidget)) { gtk_widget_destroy(m_entryNameWidget); } + if (G_IS_OBJECT(m_builder)) { g_object_unref(m_builder); } +} + +CAbstractSettingView::CAbstractSettingView(Kernel::IBox& box, const size_t index, const char* builderName, const char* widgetName) + : m_box(box), m_index(index), m_settingWidgetName("") +{ + if (builderName != nullptr) + { + m_builder = gtk_builder_new(); + gtk_builder_add_from_file(m_builder, builderName, nullptr); + gtk_builder_connect_signals(m_builder, nullptr); + + if (widgetName != nullptr) + { + m_settingWidgetName = widgetName; + CAbstractSettingView::generateNameWidget(); + m_entryFieldWidget = CAbstractSettingView::generateEntryWidget(); + } + } +} + +void CAbstractSettingView::setNameWidget(GtkWidget* widget) +{ + if (m_nameWidget) { gtk_widget_destroy(m_nameWidget); } + m_nameWidget = widget; +} + +void CAbstractSettingView::setEntryWidget(GtkWidget* widget) +{ + if (m_entryNameWidget) { gtk_widget_destroy(m_entryNameWidget); } + m_entryNameWidget = widget; +} + +void CAbstractSettingView::generateNameWidget() +{ + GtkWidget* settingName = GTK_WIDGET(gtk_builder_get_object(m_builder, "settings_collection-label_setting_name")); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(settingName)), settingName); + setNameWidget(settingName); + + CString name; + getBox().getSettingName(m_index, name); + gtk_label_set_text(GTK_LABEL(settingName), name); +} + +GtkWidget* CAbstractSettingView::generateEntryWidget() +{ + GtkTable* table = GTK_TABLE(gtk_table_new(1, 3, false)); + + GtkWidget* settingWidget = GTK_WIDGET(gtk_builder_get_object(m_builder, m_settingWidgetName.toASCIIString())); + GtkWidget* settingRevert = GTK_WIDGET(gtk_builder_get_object(m_builder, "settings_collection-button_setting_revert")); + GtkWidget* settingDefault = GTK_WIDGET(gtk_builder_get_object(m_builder, "settings_collection-button_setting_default")); + + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(settingWidget)), settingWidget); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(settingRevert)), settingRevert); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(settingDefault)), settingDefault); + + gtk_table_attach(table, settingWidget, 0, 1, 0, 1, GtkAttachOptions(GTK_FILL | GTK_EXPAND), GtkAttachOptions(GTK_FILL | GTK_EXPAND), 0, 0); + //gtk_table_attach(m_table, settingDefault, 1, 2, 0, 1, GtkAttachOptions(GTK_SHRINK), GtkAttachOptions(GTK_SHRINK), 0, 0); + //gtk_table_attach(m_table, settingRevert, 2, 3, 0, 1, GtkAttachOptions(GTK_SHRINK), GtkAttachOptions(GTK_SHRINK), 0, 0); + + setEntryWidget(GTK_WIDGET(table)); + gtk_widget_set_visible(getEntryWidget(), true); + //If we don't increase the ref counter it will cause trouble when we gonna move it later + g_object_ref(G_OBJECT(table)); + return settingWidget; +} + +void CAbstractSettingView::initializeValue() +{ + CString value; + getBox().getSettingValue(m_index, value); + setValue(value); +} + +void CAbstractSettingView::extractWidget(GtkWidget* widget, std::vector& widgets) +{ + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); +} + +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCAbstractSettingView.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCAbstractSettingView.h new file mode 100755 index 0000000..385abaf --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCAbstractSettingView.h @@ -0,0 +1,73 @@ +#pragma once + +#include "../ovd_base.h" +#include // size_t for unix + +namespace OpenViBE { +namespace Designer { +namespace Setting { +class CAbstractSettingView +{ +public: + virtual ~CAbstractSettingView(); + + //Store the value of the setting in value + virtual void getValue(CString& value) const = 0; + //Set the view with the value contains in value + virtual void setValue(const CString& value) = 0; + + //Get the label which contains the name of the setting + virtual GtkWidget* getNameWidget() { return m_nameWidget; } + //Get the table of widget which display the value of the setting (the entry and all interaction buttons) + virtual GtkWidget* getEntryWidget() { return m_entryNameWidget; } + + //This function is use to update the setting index when a setting is suppressed or inserted + virtual void setSettingIndex(const size_t index) { m_index = index; } + + //Get the index of the setting + virtual size_t getSettingIndex() { return m_index; } + +protected: + //Initialize the common part of all view. If builderName and widgetName are not nullptr, the entryTable and the label + //will be set according to these informations. + //If there are nullptr, name and entry widget will have to be set after with corresponding setter. + CAbstractSettingView(Kernel::IBox& box, const size_t index, const char* builderName, const char* widgetName); + + //Return the box which contains the setting + virtual Kernel::IBox& getBox() { return m_box; } + + + //Set the widget as the new widget name + virtual void setNameWidget(GtkWidget* widget); + //Set the widget as the new widget name + virtual void setEntryWidget(GtkWidget* widget); + + //Set the setting view with the current value of the setting + virtual void initializeValue(); + + //Return a vector which contains the list of the widget contains int the widget widget + virtual void extractWidget(GtkWidget* widget, std::vector& widgets); + + //Return the part of the entry table which is not revert or default button + virtual GtkWidget* getEntryFieldWidget() { return m_entryFieldWidget; } + +private: + //Generate the label of the setting + virtual void generateNameWidget(); + //Generate the table of widget which display the value of the setting (the entry and all interaction buttons) + virtual GtkWidget* generateEntryWidget(); + + + Kernel::IBox& m_box; + size_t m_index = 0; + CString m_settingWidgetName; + GtkWidget* m_nameWidget = nullptr; + GtkWidget* m_entryNameWidget = nullptr; + GtkWidget* m_entryFieldWidget = nullptr; + + //If we don't store the builder, the setting name will be free when we'll unref the builder + GtkBuilder* m_builder = nullptr; +}; +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCBitMaskSettingView.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCBitMaskSettingView.cpp new file mode 100755 index 0000000..df1ceee --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCBitMaskSettingView.cpp @@ -0,0 +1,80 @@ +#include "ovdCBitMaskSettingView.h" +#include "../ovd_base.h" + +namespace OpenViBE { +namespace Designer { +namespace Setting { + +static void OnCheckbuttonPressed(GtkToggleButton* /*button*/, gpointer data) { static_cast(data)->onChange(); } + +CBitMaskSettingView::CBitMaskSettingView(Kernel::IBox& box, const size_t index, CString& builderName, const Kernel::IKernelContext& ctx, + const CIdentifier& typeID) + : CAbstractSettingView(box, index, builderName, "settings_collection-table_setting_bitmask"), m_typeID(typeID), m_kernelCtx(ctx) +{ + GtkWidget* settingWidget = CAbstractSettingView::getEntryFieldWidget(); + + const gint tableSize = guint((m_kernelCtx.getTypeManager().getBitMaskEntryCount(m_typeID) + 1) >> 1); + GtkTable* bitMaskTable = GTK_TABLE(settingWidget); + gtk_table_resize(bitMaskTable, 2, tableSize); + + for (size_t i = 0; i < m_kernelCtx.getTypeManager().getBitMaskEntryCount(m_typeID); ++i) + { + CString name; + uint64_t value; + if (m_kernelCtx.getTypeManager().getBitMaskEntry(m_typeID, i, name, value)) + { + GtkWidget* button = gtk_check_button_new(); + gtk_table_attach_defaults(bitMaskTable, button, guint(i & 1), guint((i & 1) + 1), guint(i >> 1), guint((i >> 1) + 1)); + gtk_button_set_label(GTK_BUTTON(button), name.toASCIIString()); + m_toggleButton.push_back(GTK_TOGGLE_BUTTON(button)); + g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(OnCheckbuttonPressed), this); + } + } + gtk_widget_show_all(GTK_WIDGET(bitMaskTable)); + + CAbstractSettingView::initializeValue(); +} + + +void CBitMaskSettingView::getValue(CString& value) const +{ + std::string res; + for (auto& toggle : m_toggleButton) + { + if (gtk_toggle_button_get_active(toggle)) + { + if (!res.empty()) { res += ':'; } + res += gtk_button_get_label(GTK_BUTTON(toggle)); + } + } + value = res.c_str(); +} + +void CBitMaskSettingView::setValue(const CString& value) +{ + m_onValueSetting = true; + const std::string str(value); + + for (auto& toggle : m_toggleButton) + { + const gchar* label = gtk_button_get_label(GTK_BUTTON(toggle)); + if (str.find(label) != std::string::npos) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), true); } + else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), false); } + } + + m_onValueSetting = false; +} + +void CBitMaskSettingView::onChange() +{ + if (!m_onValueSetting) + { + CString value; + this->getValue(value); + getBox().setSettingValue(getSettingIndex(), value); + } +} + +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCBitMaskSettingView.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCBitMaskSettingView.h new file mode 100755 index 0000000..1f3e332 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCBitMaskSettingView.h @@ -0,0 +1,30 @@ +#pragma once + +#include "../ovd_base.h" +#include "ovdCAbstractSettingView.h" + +#include + +namespace OpenViBE { +namespace Designer { +namespace Setting { +class CBitMaskSettingView final : public CAbstractSettingView +{ +public: + CBitMaskSettingView(Kernel::IBox& box, const size_t index, CString& builderName, const Kernel::IKernelContext& ctx, const CIdentifier& typeID); + + void getValue(CString& value) const override; + void setValue(const CString& value) override; + + void onChange(); + +private: + CIdentifier m_typeID = CIdentifier::undefined(); + const Kernel::IKernelContext& m_kernelCtx; + + std::vector m_toggleButton; + bool m_onValueSetting = false; +}; +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCBooleanSettingView.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCBooleanSettingView.cpp new file mode 100755 index 0000000..3324def --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCBooleanSettingView.cpp @@ -0,0 +1,78 @@ +#include "ovdCBooleanSettingView.h" +#include "../ovd_base.h" + +namespace OpenViBE { +namespace Designer { +namespace Setting { + +static void OnCheckbuttonSettingBooleanPressed(GtkToggleButton* /*button*/, gpointer data) { static_cast(data)->toggleButtonClick(); } + +static void OnInsertion(GtkEntry* /*entry*/, gpointer data) { static_cast(data)->onChange(); } + +CBooleanSettingView::CBooleanSettingView(Kernel::IBox& box, const size_t index, CString& builderName) + : CAbstractSettingView(box, index, builderName, "settings_collection-hbox_setting_boolean") +{ + GtkWidget* settingWidget = CAbstractSettingView::getEntryFieldWidget(); + + std::vector widgets; + CAbstractSettingView::extractWidget(settingWidget, widgets); + m_toggle = GTK_TOGGLE_BUTTON(widgets[1]); + m_entry = GTK_ENTRY(widgets[0]); + + g_signal_connect(G_OBJECT(m_entry), "changed", G_CALLBACK(OnInsertion), this); + g_signal_connect(G_OBJECT(m_toggle), "toggled", G_CALLBACK(OnCheckbuttonSettingBooleanPressed), this); + + CAbstractSettingView::initializeValue(); +} + +void CBooleanSettingView::getValue(CString& value) const { value = CString(gtk_entry_get_text(m_entry)); } + +void CBooleanSettingView::setValue(const CString& value) +{ + m_onValueSetting = true; + if (value == CString("true")) + { + gtk_toggle_button_set_active(m_toggle, true); + gtk_toggle_button_set_inconsistent(m_toggle, false); + } + else if (value == CString("false")) + { + gtk_toggle_button_set_active(m_toggle, false); + gtk_toggle_button_set_inconsistent(m_toggle, false); + } + else { gtk_toggle_button_set_inconsistent(m_toggle, true); } + + gtk_entry_set_text(m_entry, value); + m_onValueSetting = false; +} + + +void CBooleanSettingView::toggleButtonClick() +{ + if (!m_onValueSetting) + { + if (gtk_toggle_button_get_active(m_toggle)) + { + getBox().setSettingValue(getSettingIndex(), "true"); + setValue("true"); + } + else + { + getBox().setSettingValue(getSettingIndex(), "false"); + setValue("false"); + } + } +} + +void CBooleanSettingView::onChange() +{ + if (!m_onValueSetting) + { + const gchar* value = gtk_entry_get_text(m_entry); + getBox().setSettingValue(getSettingIndex(), value); + } +} + +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCBooleanSettingView.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCBooleanSettingView.h new file mode 100755 index 0000000..5dfbf63 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCBooleanSettingView.h @@ -0,0 +1,28 @@ +#pragma once + +#include "../ovd_base.h" +#include "ovdCAbstractSettingView.h" + +namespace OpenViBE { +namespace Designer { +namespace Setting { +class CBooleanSettingView final : public CAbstractSettingView +{ +public: + CBooleanSettingView(Kernel::IBox& box, const size_t index, CString& builderName); + + void getValue(CString& value) const override; + void setValue(const CString& value) override; + + void toggleButtonClick(); + void onChange(); + + +private: + GtkToggleButton* m_toggle = nullptr; + GtkEntry* m_entry = nullptr; + bool m_onValueSetting = false; +}; +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCColorGradientSettingView.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCColorGradientSettingView.cpp new file mode 100755 index 0000000..fcb0723 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCColorGradientSettingView.cpp @@ -0,0 +1,250 @@ +#include "ovdCColorGradientSettingView.h" +#include "../ovd_base.h" +#include + +#include + +namespace OpenViBE { +namespace Designer { +namespace Setting { + +static void OnColorGradientColorButtonPressed(GtkColorButton* button, gpointer data) { static_cast(data)->colorChange(button); } + +static void OnButtonSettingColorGradientConfigurePressed(GtkButton* /*button*/, gpointer data) +{ + static_cast(data)->configurePressed(); +} + +static void OnRefreshColorGradient(GtkWidget* /*widget*/, GdkEventExpose* /*event*/, gpointer data) +{ + static_cast(data)->refreshColorGradient(); +} + +static void OnGTKWidgetDestroy(GtkWidget* widget, gpointer /*data*/) { gtk_widget_destroy(widget); } +static void OnInitializeColorGradient(GtkWidget* /*widget*/, gpointer data) { static_cast(data)->initializeGradient(); } +static void OnButtonColorGradientAddPressed(GtkButton* /*button*/, gpointer data) { static_cast(data)->addColor(); } +static void OnButtonColorGradientRemovePressed(GtkButton* /*button*/, gpointer data) { static_cast(data)->removeColor(); } +static void OnColorGradientSpinButtonValueChanged(GtkSpinButton* button, gpointer data) { static_cast(data)->spinChange(button); } +static void OnChange(GtkEntry* /*entry*/, gpointer data) { static_cast(data)->onChange(); } + +CColorGradientSettingView::CColorGradientSettingView(Kernel::IBox& box, const size_t index, CString& builderName, const Kernel::IKernelContext& ctx) + : CAbstractSettingView(box, index, builderName, "settings_collection-hbox_setting_color_gradient"), m_kernelCtx(ctx), m_builderName(builderName) +{ + GtkWidget* settingWidget = CAbstractSettingView::getEntryFieldWidget(); + + std::vector widgets; + CAbstractSettingView::extractWidget(settingWidget, widgets); + m_entry = GTK_ENTRY(widgets[0]); + + g_signal_connect(G_OBJECT(m_entry), "changed", G_CALLBACK(OnChange), this); + g_signal_connect(G_OBJECT(widgets[1]), "clicked", G_CALLBACK(OnButtonSettingColorGradientConfigurePressed), this); + + CAbstractSettingView::initializeValue(); +} + +void CColorGradientSettingView::getValue(CString& value) const { value = CString(gtk_entry_get_text(m_entry)); } + +void CColorGradientSettingView::setValue(const CString& value) +{ + m_onValueSetting = true; + gtk_entry_set_text(m_entry, value); + m_onValueSetting = false; +} + +void CColorGradientSettingView::configurePressed() +{ + GtkBuilder* builder = gtk_builder_new(); + gtk_builder_add_from_file(builder, m_builderName.toASCIIString(), nullptr); + gtk_builder_connect_signals(builder, nullptr); + + m_dialog = GTK_WIDGET(gtk_builder_get_object(builder, "setting_editor-color_gradient-dialog")); + + const CString initialGradient = m_kernelCtx.getConfigurationManager().expand(gtk_entry_get_text(m_entry)); + CMatrix colorGradient; + + VisualizationToolkit::ColorGradient::parse(colorGradient, initialGradient); + m_colorGradient.resize(std::max(colorGradient.getDimensionSize(1), 2)); + for (size_t i = 0; i < colorGradient.getDimensionSize(1); ++i) + { + const size_t idx = i * 4; + m_colorGradient[i].percent = colorGradient[idx]; + m_colorGradient[i].color.red = guint(colorGradient[idx + 1] * .01 * 65535.); + m_colorGradient[i].color.green = guint(colorGradient[idx + 2] * .01 * 65535.); + m_colorGradient[i].color.blue = guint(colorGradient[idx + 3] * .01 * 65535.); + } + + m_container = GTK_WIDGET(gtk_builder_get_object(builder, "setting_editor-color_gradient-vbox")); + m_drawingArea = GTK_WIDGET(gtk_builder_get_object(builder, "setting_editor-color_gradient-drawingarea")); + + g_signal_connect(G_OBJECT(m_dialog), "show", G_CALLBACK(OnInitializeColorGradient), this); + g_signal_connect(G_OBJECT(m_drawingArea), "expose_event", G_CALLBACK(OnRefreshColorGradient), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(builder, "setting_editor-color_gradient-add_button")), "pressed", + G_CALLBACK(OnButtonColorGradientAddPressed), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(builder, "setting_editor-color_gradient-remove_button")), "pressed", + G_CALLBACK(OnButtonColorGradientRemovePressed), this); + + if (gtk_dialog_run(GTK_DIALOG(m_dialog)) == GTK_RESPONSE_APPLY) + { + CString finalGradient; + CMatrix finalColorGradient(4, m_colorGradient.size()); + size_t idx = 0; + for (size_t i = 0; i < m_colorGradient.size(); ++i) + { + finalColorGradient[idx++] = m_colorGradient[i].percent; + finalColorGradient[idx++] = round(m_colorGradient[i].color.red * 100. / 65535.); + finalColorGradient[idx++] = round(m_colorGradient[i].color.green * 100. / 65535.); + finalColorGradient[idx++] = round(m_colorGradient[i].color.blue * 100. / 65535.); + } + VisualizationToolkit::ColorGradient::format(finalGradient, finalColorGradient); + if (!m_onValueSetting) { getBox().setSettingValue(getSettingIndex(), finalGradient.toASCIIString()); } + setValue(finalGradient.toASCIIString()); + } + + gtk_widget_destroy(m_dialog); + g_object_unref(builder); +} + + +void CColorGradientSettingView::initializeGradient() +{ + gtk_widget_hide(m_container); + + gtk_container_foreach(GTK_CONTAINER(m_container), OnGTKWidgetDestroy, nullptr); + + size_t i = 0; + const size_t count = m_colorGradient.size(); + m_colorButtons.clear(); + m_spinButtons.clear(); + for (auto& cg : m_colorGradient) + { + GtkBuilder* builder = gtk_builder_new(); + gtk_builder_add_from_file(builder, m_builderName.toASCIIString(), nullptr); + gtk_builder_connect_signals(builder, nullptr); + + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(builder, "setting_editor-color_gradient-hbox")); + + cg.colorButton = GTK_COLOR_BUTTON(gtk_builder_get_object(builder, "setting_editor-color_gradient-colorbutton")); + cg.spinButton = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "setting_editor-color_gradient-spinbutton")); + + gtk_color_button_set_color(cg.colorButton, &cg.color); + gtk_spin_button_set_value(cg.spinButton, cg.percent); + + g_signal_connect(G_OBJECT(cg.colorButton), "color-set", G_CALLBACK(OnColorGradientColorButtonPressed), this); + g_signal_connect(G_OBJECT(cg.spinButton), "value-changed", G_CALLBACK(OnColorGradientSpinButtonValueChanged), this); + + g_object_ref(widget); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(widget)), widget); + gtk_container_add(GTK_CONTAINER(m_container), widget); + g_object_unref(widget); + + g_object_unref(builder); + + m_colorButtons[cg.colorButton] = i; + m_spinButtons[cg.spinButton] = i; + i++; + } + + gtk_spin_button_set_value(m_colorGradient[0].spinButton, 0); + gtk_spin_button_set_value(m_colorGradient[count - 1].spinButton, 100); + + gtk_widget_show(m_container); +} + +void CColorGradientSettingView::refreshColorGradient() +{ + const size_t steps = 100; + gint sizex = 0; + gint sizey = 0; + gdk_drawable_get_size(m_drawingArea->window, &sizex, &sizey); + + CMatrix gradient(4, m_colorGradient.size()); + for (size_t i = 0; i < m_colorGradient.size(); ++i) + { + const size_t idx = i * 4; + gradient[idx] = m_colorGradient[i].percent; + gradient[idx + 1] = m_colorGradient[i].color.red * 100. / 65535.; + gradient[idx + 2] = m_colorGradient[i].color.green * 100. / 65535.; + gradient[idx + 3] = m_colorGradient[i].color.blue * 100. / 65535.; + } + + CMatrix interpolated; + VisualizationToolkit::ColorGradient::interpolate(interpolated, gradient, steps); + + GdkGC* gc = gdk_gc_new(m_drawingArea->window); + GdkColor color; + + for (size_t i = 0; i < steps; ++i) + { + color.red = guint(interpolated[i * 4 + 1] * 65535 * .01); + color.green = guint(interpolated[i * 4 + 2] * 65535 * .01); + color.blue = guint(interpolated[i * 4 + 3] * 65535 * .01); + gdk_gc_set_rgb_fg_color(gc, &color); + gdk_draw_rectangle(m_drawingArea->window, gc, TRUE, gint((sizex * i) / steps), 0, gint((sizex * (i + 1)) / steps), sizey); + } + g_object_unref(gc); +} + +void CColorGradientSettingView::addColor() +{ + m_colorGradient.resize(m_colorGradient.size() + 1); + m_colorGradient[m_colorGradient.size() - 1].percent = 100; + initializeGradient(); + refreshColorGradient(); +} + +void CColorGradientSettingView::removeColor() +{ + if (m_colorGradient.size() > 2) + { + m_colorGradient.resize(m_colorGradient.size() - 1); + m_colorGradient[m_colorGradient.size() - 1].percent = 100; + initializeGradient(); + refreshColorGradient(); + } +} + +void CColorGradientSettingView::spinChange(GtkSpinButton* button) +{ + gtk_spin_button_update(button); + + const size_t i = m_spinButtons[button]; + GtkSpinButton* prevSpinButton = i > 0 ? m_colorGradient[i - 1].spinButton : nullptr; + GtkSpinButton* nextSpinButton = i < m_colorGradient.size() - 1 ? m_colorGradient[i + 1].spinButton : nullptr; + if (!prevSpinButton) { gtk_spin_button_set_value(button, 0); } + if (!nextSpinButton) { gtk_spin_button_set_value(button, 100); } + if (prevSpinButton && gtk_spin_button_get_value(button) < gtk_spin_button_get_value(prevSpinButton)) + { + gtk_spin_button_set_value(button, gtk_spin_button_get_value(prevSpinButton)); + } + if (nextSpinButton && gtk_spin_button_get_value(button) > gtk_spin_button_get_value(nextSpinButton)) + { + gtk_spin_button_set_value(button, gtk_spin_button_get_value(nextSpinButton)); + } + + m_colorGradient[i].percent = gtk_spin_button_get_value(button); + + refreshColorGradient(); +} + +void CColorGradientSettingView::colorChange(GtkColorButton* button) +{ + GdkColor color; + gtk_color_button_get_color(button, &color); + + m_colorGradient[m_colorButtons[button]].color = color; + + refreshColorGradient(); +} + +void CColorGradientSettingView::onChange() +{ + if (!m_onValueSetting) + { + const gchar* value = gtk_entry_get_text(m_entry); + getBox().setSettingValue(getSettingIndex(), value); + } +} + +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCColorGradientSettingView.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCColorGradientSettingView.h new file mode 100755 index 0000000..3ac380f --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCColorGradientSettingView.h @@ -0,0 +1,59 @@ +#pragma once + +#include "../ovd_base.h" +#include "ovdCAbstractSettingView.h" + +#include +#include +#include + +namespace OpenViBE { +namespace Designer { +namespace Setting { +typedef struct +{ + double percent; + GdkColor color; + GtkColorButton* colorButton; + GtkSpinButton* spinButton; +} color_gradient_data_node_t; + + +class CColorGradientSettingView final : public CAbstractSettingView +{ +public: + CColorGradientSettingView(Kernel::IBox& box, const size_t index, CString& builderName, const Kernel::IKernelContext& ctx); + + void getValue(CString& value) const override; + void setValue(const CString& value) override; + + void configurePressed(); + + void initializeGradient(); + void refreshColorGradient(); + void addColor(); + void removeColor(); + + void spinChange(GtkSpinButton* button); + void colorChange(GtkColorButton* button); + + void onChange(); + + +private: + GtkEntry* m_entry = nullptr; + const Kernel::IKernelContext& m_kernelCtx; + CString m_builderName; + + GtkWidget* m_dialog = nullptr; + GtkWidget* m_container = nullptr; + GtkWidget* m_drawingArea = nullptr; + std::vector m_colorGradient; + std::map m_colorButtons; + std::map m_spinButtons; + + bool m_onValueSetting = false; +}; +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCColorSettingView.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCColorSettingView.cpp new file mode 100755 index 0000000..9c48850 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCColorSettingView.cpp @@ -0,0 +1,72 @@ +#include "ovdCColorSettingView.h" +#include "../ovd_base.h" + +#include + +namespace OpenViBE { +namespace Designer { +namespace Setting { + +static int Color2Percent(const guint16 color) { return int(round(color / 655.350)); } // c * 100 / 65535 +static guint16 Percent2Color(const int color) { return guint16(color * 655.35); } // c * 65535 / 100 + +static void OnButtonSettingColorChoosePressed(GtkColorButton* /*button*/, gpointer data) { static_cast(data)->selectColor(); } +static void OnChange(GtkEntry* /*entry*/, gpointer data) { static_cast(data)->onChange(); } + +CColorSettingView::CColorSettingView(Kernel::IBox& box, const size_t index, CString& builderName, const Kernel::IKernelContext& ctx) + : CAbstractSettingView(box, index, builderName, "settings_collection-hbox_setting_color"), m_kernelCtx(ctx) +{ + GtkWidget* settingWidget = CAbstractSettingView::getEntryFieldWidget(); + + std::vector widgets; + CAbstractSettingView::extractWidget(settingWidget, widgets); + m_entry = GTK_ENTRY(widgets[0]); + m_button = GTK_COLOR_BUTTON(widgets[1]); + + g_signal_connect(G_OBJECT(m_entry), "changed", G_CALLBACK(OnChange), this); + g_signal_connect(G_OBJECT(m_button), "color-set", G_CALLBACK(OnButtonSettingColorChoosePressed), this); + + CAbstractSettingView::initializeValue(); +} + + +void CColorSettingView::getValue(CString& value) const { value = CString(gtk_entry_get_text(m_entry)); } + +void CColorSettingView::setValue(const CString& value) +{ + m_onValueSetting = true; + int r = 0, g = 0, b = 0; + sscanf(m_kernelCtx.getConfigurationManager().expand(value).toASCIIString(), "%i,%i,%i", &r, &g, &b); + + GdkColor color; + color.red = Percent2Color(r); + color.green = Percent2Color(g); + color.blue = Percent2Color(b); + gtk_color_button_set_color(m_button, &color); + + gtk_entry_set_text(m_entry, value); + m_onValueSetting = false; +} + +void CColorSettingView::selectColor() +{ + GdkColor color; + gtk_color_button_get_color(m_button, &color); + const std::string value = std::to_string(Color2Percent(color.red)) + "," + std::to_string(Color2Percent(color.green)) + "," + + std::to_string(Color2Percent(color.blue)); + getBox().setSettingValue(getSettingIndex(), value.c_str()); + setValue(value.c_str()); +} + +void CColorSettingView::onChange() +{ + if (!m_onValueSetting) + { + const gchar* value = gtk_entry_get_text(m_entry); + getBox().setSettingValue(getSettingIndex(), value); + } +} + +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCColorSettingView.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCColorSettingView.h new file mode 100755 index 0000000..2486baf --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCColorSettingView.h @@ -0,0 +1,29 @@ +#pragma once + +#include "../ovd_base.h" +#include "ovdCAbstractSettingView.h" + +namespace OpenViBE { +namespace Designer { +namespace Setting { +class CColorSettingView final : public CAbstractSettingView +{ +public: + CColorSettingView(Kernel::IBox& box, const size_t index, CString& builderName, const Kernel::IKernelContext& ctx); + + void getValue(CString& value) const override; + void setValue(const CString& value) override; + + void selectColor(); + void onChange(); + +private: + GtkEntry* m_entry = nullptr; + GtkColorButton* m_button = nullptr; + + const Kernel::IKernelContext& m_kernelCtx; + bool m_onValueSetting = false; +}; +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCEnumerationSettingView.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCEnumerationSettingView.cpp new file mode 100755 index 0000000..9f96dff --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCEnumerationSettingView.cpp @@ -0,0 +1,103 @@ +#include "ovdCEnumerationSettingView.h" +#include "../ovd_base.h" + +#include // std::sort +#include + +namespace OpenViBE { +namespace Designer { +namespace Setting { + +static void OnChange(GtkEntry* /*entry*/, gpointer data) { static_cast(data)->onChange(); } + +CEnumerationSettingView::CEnumerationSettingView(Kernel::IBox& box, const size_t index, CString& builderName, const Kernel::IKernelContext& ctx, + const CIdentifier& typeID) + : CAbstractSettingView(box, index, builderName, "settings_collection-comboboxentry_setting_enumeration"), m_typeID(typeID), m_kernelCtx(ctx) +{ + GtkWidget* setting = CAbstractSettingView::getEntryFieldWidget(); + + m_comboBox = GTK_COMBO_BOX(setting); + + std::vector entries; + + for (size_t i = 0; i < m_kernelCtx.getTypeManager().getEnumerationEntryCount(m_typeID); ++i) + { + CString name; + uint64_t value; + if (m_kernelCtx.getTypeManager().getEnumerationEntry(m_typeID, i, name, value)) { entries.push_back(name.toASCIIString()); } + } + + std::sort(entries.begin(), entries.end()); + + GtkTreeIter it; + GtkListStore* list = GTK_LIST_STORE(gtk_combo_box_get_model(m_comboBox)); + gtk_combo_box_set_wrap_width(m_comboBox, 0); + gtk_list_store_clear(list); + + for (size_t i = 0; i < entries.size(); ++i) + { + gtk_list_store_append(list, &it); + gtk_list_store_set(list, &it, 0, entries[i].c_str(), -1); + + m_entriesIdx[CString(entries[i].c_str())] = uint64_t(i); + } + + CString value; + box.getSettingValue(index, value); + if (m_entriesIdx.count(value.toASCIIString()) == 0) + { + gtk_list_store_append(list, &it); + gtk_list_store_set(list, &it, 0, value.toASCIIString(), -1); + } + + CAbstractSettingView::initializeValue(); + + g_signal_connect(G_OBJECT(m_comboBox), "changed", G_CALLBACK(OnChange), this); +} + + +void CEnumerationSettingView::getValue(CString& value) const { value = CString(gtk_combo_box_get_active_text(m_comboBox)); } + + +void CEnumerationSettingView::setValue(const CString& value) +{ + m_onValueSetting = true; + + // If the current value of the setting is not in the enumeration list, we will add or replace the last value in the list, so it can be set to this value + if (m_entriesIdx.count(value) == 0) + { + GtkTreeIter it; + GtkListStore* list = GTK_LIST_STORE(gtk_combo_box_get_model(m_comboBox)); + int valuesInModel = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list), nullptr); + if (valuesInModel == int(m_entriesIdx.size())) + { + gtk_list_store_append(list, &it); + valuesInModel += 1; + } + else + { + // We just set the iterator at the end + GtkTreePath* treePath = gtk_tree_path_new_from_indices(valuesInModel - 1, -1); + gtk_tree_model_get_iter(GTK_TREE_MODEL(list), &it, treePath); + gtk_tree_path_free(treePath); + } + gtk_list_store_set(list, &it, 0, value.toASCIIString(), -1); + gtk_combo_box_set_active(m_comboBox, valuesInModel - 1); + } + else { gtk_combo_box_set_active(m_comboBox, gint(m_entriesIdx[value])); } + m_onValueSetting = false; +} + +void CEnumerationSettingView::onChange() +{ + if (!m_onValueSetting) + { + gchar* value = gtk_combo_box_get_active_text(m_comboBox); + getBox().setSettingValue(getSettingIndex(), value); + g_free(value); + } +} + +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCEnumerationSettingView.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCEnumerationSettingView.h new file mode 100755 index 0000000..6c3b962 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCEnumerationSettingView.h @@ -0,0 +1,33 @@ +#pragma once + +#include "../ovd_base.h" +#include "ovdCAbstractSettingView.h" + +#include + +namespace OpenViBE { +namespace Designer { +namespace Setting { +class CEnumerationSettingView final : public CAbstractSettingView +{ +public: + CEnumerationSettingView(Kernel::IBox& box, const size_t index, CString& builderName, const Kernel::IKernelContext& ctx, const CIdentifier& typeID); + + void getValue(CString& value) const override; + void setValue(const CString& value) override; + + void onChange(); + + +private: + GtkComboBox* m_comboBox = nullptr; + CIdentifier m_typeID = CIdentifier::undefined(); + + std::map m_entriesIdx; + + const Kernel::IKernelContext& m_kernelCtx; + bool m_onValueSetting = false; +}; +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCFilenameSettingView.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCFilenameSettingView.cpp new file mode 100755 index 0000000..118247f --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCFilenameSettingView.cpp @@ -0,0 +1,118 @@ +#include "ovdCFilenameSettingView.h" +#include "../ovd_base.h" + +#include +#include + +namespace OpenViBE { +namespace Designer { +namespace Setting { + +static void OnButtonSettingFilenameBrowsePressed(GtkButton* /*button*/, gpointer data) { static_cast(data)->browse(); } +static void OnChange(GtkEntry* /*entry*/, gpointer data) { static_cast(data)->onChange(); } + +#if defined TARGET_OS_Windows +static gboolean OnFocusOutEvent(GtkEntry* /*entry*/, GdkEvent* /*event*/, gpointer data) +{ + static_cast(data)->onFocusLost(); + return FALSE; +} +#endif + +CFilenameSettingView::CFilenameSettingView(Kernel::IBox& box, const size_t index, CString& builderName, const Kernel::IKernelContext& ctx) + : CAbstractSettingView(box, index, builderName, "settings_collection-hbox_setting_filename"), m_kernelCtx(ctx) +{ + GtkWidget* settingWidget = CAbstractSettingView::getEntryFieldWidget(); + + std::vector widgets; + CAbstractSettingView::extractWidget(settingWidget, widgets); + m_entry = GTK_ENTRY(widgets[0]); + + g_signal_connect(G_OBJECT(m_entry), "changed", G_CALLBACK(OnChange), this); +#if defined TARGET_OS_Windows + // Only called for Windows path + g_signal_connect(G_OBJECT(m_entry), "focus_out_event", G_CALLBACK(OnFocusOutEvent), this); +#endif + g_signal_connect(G_OBJECT(widgets[1]), "clicked", G_CALLBACK(OnButtonSettingFilenameBrowsePressed), this); + + CAbstractSettingView::initializeValue(); +} + +void CFilenameSettingView::getValue(CString& value) const { value = CString(gtk_entry_get_text(m_entry)); } + +void CFilenameSettingView::setValue(const CString& value) +{ + m_onValueSetting = true; + gtk_entry_set_text(m_entry, value); + m_onValueSetting = false; +} + +void CFilenameSettingView::browse() const +{ + GtkWidget* widgetDialogOpen = gtk_file_chooser_dialog_new("Select file to open...", nullptr, GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nullptr); + + const CString initialFilename = m_kernelCtx.getConfigurationManager().expand(gtk_entry_get_text(m_entry)); + if (g_path_is_absolute(initialFilename.toASCIIString())) + { + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widgetDialogOpen), initialFilename.toASCIIString()); + } + else + { + char* fullPath = g_build_filename(g_get_current_dir(), initialFilename.toASCIIString(), nullptr); + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widgetDialogOpen), fullPath); + g_free(fullPath); + } + + gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(widgetDialogOpen), false); + + if (gtk_dialog_run(GTK_DIALOG(widgetDialogOpen)) == GTK_RESPONSE_ACCEPT) + { + char* fileName = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widgetDialogOpen)); + char* backslash; + while ((backslash = strchr(fileName, '\\')) != nullptr) { *backslash = '/'; } + gtk_entry_set_text(m_entry, fileName); + g_free(fileName); + } + gtk_widget_destroy(widgetDialogOpen); +} + +void CFilenameSettingView::onChange() +{ + if (!m_onValueSetting) + { + const gchar* value = gtk_entry_get_text(m_entry); + getBox().setSettingValue(getSettingIndex(), value); + } +} + +#if defined TARGET_OS_Windows +void CFilenameSettingView::onFocusLost() +{ + // We replace antislash, interpreted as escape, by slash in Windows path + if (!m_onValueSetting) + { + std::string fileName = gtk_entry_get_text(m_entry); + auto it = fileName.begin(); + + while ((it = std::find(it, fileName.end(), '\\')) != fileName.end()) + { + if (it == std::prev(fileName.end())) + { + *it = '/'; + break; + } + if (*std::next(it) != '{' && *std::next(it) != '$' && *std::next(it) != '}') { *it = '/'; } + + std::advance(it, 1); + } + + gtk_entry_set_text(m_entry, fileName.c_str()); + getBox().setSettingValue(this->getSettingIndex(), fileName.c_str()); + } +} +#endif + +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCFilenameSettingView.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCFilenameSettingView.h new file mode 100755 index 0000000..1a1298f --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCFilenameSettingView.h @@ -0,0 +1,32 @@ +#pragma once + +#include "../ovd_base.h" +#include "ovdCAbstractSettingView.h" + +namespace OpenViBE { +namespace Designer { +namespace Setting { +class CFilenameSettingView final : public CAbstractSettingView +{ +public: + CFilenameSettingView(Kernel::IBox& box, const size_t index, CString& builderName, const Kernel::IKernelContext& ctx); + + void getValue(CString& value) const override; + void setValue(const CString& value) override; + + void browse() const; + void onChange(); + +#if defined TARGET_OS_Windows + void onFocusLost(); +#endif + +private: + GtkEntry* m_entry = nullptr; + + const Kernel::IKernelContext& m_kernelCtx; + bool m_onValueSetting = false; +}; +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCFloatSettingView.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCFloatSettingView.cpp new file mode 100755 index 0000000..01a7029 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCFloatSettingView.cpp @@ -0,0 +1,57 @@ +#include "ovdCFloatSettingView.h" +#include "../ovd_base.h" + +namespace OpenViBE { +namespace Designer { +namespace Setting { + +static void OnButtonSettingFloatUpPressed(GtkButton* /*button*/, gpointer data) { static_cast(data)->adjustValue(1.0); } +static void OnButtonSettingFloatDownPressed(GtkButton* /*button*/, gpointer data) { static_cast(data)->adjustValue(-1.0); } +static void OnChange(GtkEntry* /*entry*/, gpointer data) { static_cast(data)->onChange(); } + +CFloatSettingView::CFloatSettingView(Kernel::IBox& box, const size_t index, CString& builderName, const Kernel::IKernelContext& ctx) + : CAbstractSettingView(box, index, builderName, "settings_collection-hbox_setting_float"), m_kernelCtx(ctx) +{ + GtkWidget* settingWidget = CAbstractSettingView::getEntryFieldWidget(); + + std::vector widgets; + CAbstractSettingView::extractWidget(settingWidget, widgets); + m_entry = GTK_ENTRY(widgets[0]); + + g_signal_connect(G_OBJECT(m_entry), "changed", G_CALLBACK(OnChange), this); + + g_signal_connect(G_OBJECT(widgets[1]), "clicked", G_CALLBACK(OnButtonSettingFloatUpPressed), this); + g_signal_connect(G_OBJECT(widgets[2]), "clicked", G_CALLBACK(OnButtonSettingFloatDownPressed), this); + + CAbstractSettingView::initializeValue(); +} + +void CFloatSettingView::getValue(CString& value) const { value = CString(gtk_entry_get_text(m_entry)); } + +void CFloatSettingView::setValue(const CString& value) +{ + m_onValueSetting = true; + gtk_entry_set_text(m_entry, value); + m_onValueSetting = false; +} + +void CFloatSettingView::adjustValue(const double amount) +{ + const double value = m_kernelCtx.getConfigurationManager().expandAsFloat(gtk_entry_get_text(m_entry), 0) + amount; + const std::string str = std::to_string(value); + getBox().setSettingValue(getSettingIndex(), str.c_str()); + setValue(str.c_str()); +} + +void CFloatSettingView::onChange() +{ + if (!m_onValueSetting) + { + const gchar* value = gtk_entry_get_text(m_entry); + getBox().setSettingValue(getSettingIndex(), value); + } +} + +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCFloatSettingView.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCFloatSettingView.h new file mode 100755 index 0000000..3dc57ae --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCFloatSettingView.h @@ -0,0 +1,29 @@ +#pragma once + +#include "../ovd_base.h" +#include "ovdCAbstractSettingView.h" + +namespace OpenViBE { +namespace Designer { +namespace Setting { +class CFloatSettingView final : public CAbstractSettingView +{ +public: + CFloatSettingView(Kernel::IBox& box, const size_t index, CString& builderName, const Kernel::IKernelContext& ctx); + + void getValue(CString& value) const override; + void setValue(const CString& value) override; + + void adjustValue(double amount); + void onChange(); + + +private: + GtkEntry* m_entry = nullptr; + + const Kernel::IKernelContext& m_kernelCtx; + bool m_onValueSetting = false; +}; +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCIntegerSettingView.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCIntegerSettingView.cpp new file mode 100755 index 0000000..684f707 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCIntegerSettingView.cpp @@ -0,0 +1,58 @@ +#include "ovdCIntegerSettingView.h" +#include "../ovd_base.h" + +namespace OpenViBE { +namespace Designer { +namespace Setting { + +static void OnButtonSettingIntegerUpPressed(GtkButton* /*button*/, gpointer data) { static_cast(data)->adjustValue(1); } +static void OnButtonSettingIntegerDownPressed(GtkButton* /*button*/, gpointer data) { static_cast(data)->adjustValue(-1); } +static void OnInsertion(GtkEntry* /*entry*/, gpointer data) { static_cast(data)->onChange(); } + +CIntegerSettingView::CIntegerSettingView(Kernel::IBox& box, const size_t index, CString& builderName, const Kernel::IKernelContext& ctx) + : CAbstractSettingView(box, index, builderName, "settings_collection-hbox_setting_integer"), m_kernelCtx(ctx) +{ + GtkWidget* settingWidget = CAbstractSettingView::getEntryFieldWidget(); + + std::vector widgets; + CAbstractSettingView::extractWidget(settingWidget, widgets); + m_entry = GTK_ENTRY(widgets[0]); + + g_signal_connect(G_OBJECT(m_entry), "changed", G_CALLBACK(OnInsertion), this); + + g_signal_connect(G_OBJECT(widgets[1]), "clicked", G_CALLBACK(OnButtonSettingIntegerUpPressed), this); + g_signal_connect(G_OBJECT(widgets[2]), "clicked", G_CALLBACK(OnButtonSettingIntegerDownPressed), this); + + CAbstractSettingView::initializeValue(); +} + +void CIntegerSettingView::getValue(CString& value) const { value = CString(gtk_entry_get_text(m_entry)); } + +void CIntegerSettingView::setValue(const CString& value) +{ + m_onValueSetting = true; + gtk_entry_set_text(m_entry, value); + m_onValueSetting = false; +} + +void CIntegerSettingView::adjustValue(const int amount) +{ + const int64_t value = m_kernelCtx.getConfigurationManager().expandAsInteger(gtk_entry_get_text(m_entry), 0) + amount; + const std::string res = std::to_string(value); + + getBox().setSettingValue(getSettingIndex(), res.c_str()); + setValue(res.c_str()); +} + +void CIntegerSettingView::onChange() +{ + if (!m_onValueSetting) + { + const gchar* value = gtk_entry_get_text(m_entry); + getBox().setSettingValue(getSettingIndex(), value); + } +} + +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCIntegerSettingView.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCIntegerSettingView.h new file mode 100755 index 0000000..2f1d27a --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCIntegerSettingView.h @@ -0,0 +1,28 @@ +#pragma once + +#include "../ovd_base.h" +#include "ovdCAbstractSettingView.h" + +namespace OpenViBE { +namespace Designer { +namespace Setting { +class CIntegerSettingView final : public CAbstractSettingView +{ +public: + CIntegerSettingView(Kernel::IBox& box, const size_t index, CString& builderName, const Kernel::IKernelContext& ctx); + + void getValue(CString& value) const override; + void setValue(const CString& value) override; + + void adjustValue(int amount); + void onChange(); + +private: + GtkEntry* m_entry = nullptr; + + const Kernel::IKernelContext& m_kernelCtx; + bool m_onValueSetting = false; +}; +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCScriptSettingView.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCScriptSettingView.cpp new file mode 100755 index 0000000..17c8931 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCScriptSettingView.cpp @@ -0,0 +1,138 @@ +#include "ovdCScriptSettingView.h" +#include "../ovd_base.h" + +#include +#include + +namespace OpenViBE { +namespace Designer { +namespace Setting { + +static void OnButtonSettingFilenameBrowsePressed(GtkButton* /*button*/, gpointer data) { static_cast(data)->browse(); } +static void OnButtonSettingScriptEditPressed(GtkButton* /*button*/, gpointer data) { static_cast(data)->edit(); } +static void OnChange(GtkEntry* /*entry*/, gpointer data) { static_cast(data)->onChange(); } + +#if defined TARGET_OS_Windows +static gboolean OnFocusOutEvent(GtkEntry* /*entry*/, GdkEvent* /*event*/, gpointer data) +{ + static_cast(data)->onFocusLost(); + return FALSE; +} +#endif + +CScriptSettingView::CScriptSettingView(Kernel::IBox& box, const size_t index, CString& builderName, const Kernel::IKernelContext& ctx) + : CAbstractSettingView(box, index, builderName, "settings_collection-hbox_setting_script"), m_kernelCtx(ctx) +{ + GtkWidget* settingWidget = CAbstractSettingView::getEntryFieldWidget(); + + std::vector widgets; + CAbstractSettingView::extractWidget(settingWidget, widgets); + m_entry = GTK_ENTRY(widgets[0]); + + g_signal_connect(G_OBJECT(m_entry), "changed", G_CALLBACK(OnChange), this); +#if defined TARGET_OS_Windows + // Only called for Windows path + g_signal_connect(G_OBJECT(m_entry), "focus_out_event", G_CALLBACK(OnFocusOutEvent), this); +#endif + g_signal_connect(G_OBJECT(widgets[1]), "clicked", G_CALLBACK(OnButtonSettingScriptEditPressed), this); + g_signal_connect(G_OBJECT(widgets[2]), "clicked", G_CALLBACK(OnButtonSettingFilenameBrowsePressed), this); + + CAbstractSettingView::initializeValue(); +} + +void CScriptSettingView::getValue(CString& value) const { value = CString(gtk_entry_get_text(m_entry)); } + +void CScriptSettingView::setValue(const CString& value) +{ + m_onValueSetting = true; + gtk_entry_set_text(m_entry, value); + m_onValueSetting = false; +} + +void CScriptSettingView::browse() const +{ + GtkWidget* widgetDialogOpen = gtk_file_chooser_dialog_new("Select file to open...", nullptr, GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nullptr); + + const CString initialFileName = m_kernelCtx.getConfigurationManager().expand(gtk_entry_get_text(m_entry)); + if (g_path_is_absolute(initialFileName.toASCIIString())) + { + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widgetDialogOpen), initialFileName.toASCIIString()); + } + else + { + char* fullPath = g_build_filename(g_get_current_dir(), initialFileName.toASCIIString(), nullptr); + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widgetDialogOpen), fullPath); + g_free(fullPath); + } + + gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(widgetDialogOpen), false); + + if (gtk_dialog_run(GTK_DIALOG(widgetDialogOpen)) == GTK_RESPONSE_ACCEPT) + { + char* fileName = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widgetDialogOpen)); + char* backslash; + while ((backslash = strchr(fileName, '\\')) != nullptr) { *backslash = '/'; } + gtk_entry_set_text(m_entry, fileName); + g_free(fileName); + } + gtk_widget_destroy(widgetDialogOpen); +} + +void CScriptSettingView::edit() const +{ + const CString fileName = m_kernelCtx.getConfigurationManager().expand(gtk_entry_get_text(m_entry)); + const CString editorCmd = m_kernelCtx.getConfigurationManager().expand("${Designer_ScriptEditorCommand}"); + + if (editorCmd != CString("")) + { + CString fullCmd = editorCmd + CString(" \"") + fileName + CString("\""); +#if defined TARGET_OS_Windows + fullCmd = "START " + fullCmd; +#elif defined TARGET_OS_Linux + fullCmd = fullCmd + " &"; +#else +#endif + if (system(fullCmd.toASCIIString()) < 0) { m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Could not run command " << fullCmd << "\n"; } + } +} + +void CScriptSettingView::onChange() +{ + if (!m_onValueSetting) + { + const gchar* value = gtk_entry_get_text(m_entry); + getBox().setSettingValue(getSettingIndex(), value); + } +} + +#if defined TARGET_OS_Windows +void CScriptSettingView::onFocusLost() +{ + // We replace antislash, interpreted as escape, by slash in Windows path + if (!m_onValueSetting) + { + std::string fileName = gtk_entry_get_text(m_entry); + auto it = fileName.begin(); + + while ((it = std::find(it, fileName.end(), '\\')) != fileName.end()) + { + if (it == std::prev(fileName.end())) + { + *it = '/'; + break; + } + if (*std::next(it) != '{' && *std::next(it) != '$' && *std::next(it) != '}') { *it = '/'; } + + std::advance(it, 1); + } + + gtk_entry_set_text(m_entry, fileName.c_str()); + getBox().setSettingValue(this->getSettingIndex(), fileName.c_str()); + } +} +#endif + +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCScriptSettingView.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCScriptSettingView.h new file mode 100755 index 0000000..f4c6d23 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCScriptSettingView.h @@ -0,0 +1,33 @@ +#pragma once + +#include "../ovd_base.h" +#include "ovdCAbstractSettingView.h" + +namespace OpenViBE { +namespace Designer { +namespace Setting { +class CScriptSettingView final : public CAbstractSettingView +{ +public: + CScriptSettingView(Kernel::IBox& box, const size_t index, CString& builderName, const Kernel::IKernelContext& ctx); + + void getValue(CString& value) const override; + void setValue(const CString& value) override; + + void browse() const; + void edit() const; + + void onChange(); +#if defined TARGET_OS_Windows + void onFocusLost(); +#endif + +private: + GtkEntry* m_entry = nullptr; + + const Kernel::IKernelContext& m_kernelCtx; + bool m_onValueSetting = false; +}; +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCSettingViewFactory.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCSettingViewFactory.cpp new file mode 100755 index 0000000..021af8d --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCSettingViewFactory.cpp @@ -0,0 +1,40 @@ +#include "ovdCSettingViewFactory.h" + +#include "ovdCBooleanSettingView.h" +#include "ovdCIntegerSettingView.h" +#include "ovdCFloatSettingView.h" +#include "ovdCStringSettingView.h" +#include "ovdCFilenameSettingView.h" +#include "ovdCScriptSettingView.h" +#include "ovdCColorSettingView.h" +#include "ovdCColorGradientSettingView.h" +#include "ovdCEnumerationSettingView.h" +#include "ovdCBitMaskSettingView.h" + +namespace OpenViBE { +namespace Designer { +namespace Setting { + +CAbstractSettingView* CSettingViewFactory::getSettingView(Kernel::IBox& box, const size_t index) +{ + CIdentifier type; + box.getSettingType(index, type); + + if (type == OV_TypeId_Boolean) { return new CBooleanSettingView(box, index, m_builderName); } + if (type == OV_TypeId_Integer) { return new CIntegerSettingView(box, index, m_builderName, m_kernelCtx); } + if (type == OV_TypeId_Float) { return new CFloatSettingView(box, index, m_builderName, m_kernelCtx); } + if (type == OV_TypeId_String) { return new CStringSettingView(box, index, m_builderName); } + if (type == OV_TypeId_Filename) { return new CFilenameSettingView(box, index, m_builderName, m_kernelCtx); } + if (type == OV_TypeId_Script) { return new CScriptSettingView(box, index, m_builderName, m_kernelCtx); } + if (type == OV_TypeId_Color) { return new CColorSettingView(box, index, m_builderName, m_kernelCtx); } + if (type == OV_TypeId_ColorGradient) { return new CColorGradientSettingView(box, index, m_builderName, m_kernelCtx); } + if (m_kernelCtx.getTypeManager().isEnumeration(type)) { return new CEnumerationSettingView(box, index, m_builderName, m_kernelCtx, type); } + if (m_kernelCtx.getTypeManager().isBitMask(type)) { return new CBitMaskSettingView(box, index, m_builderName, m_kernelCtx, type); } + + //By default we consider every settings as a string + return new CStringSettingView(box, index, m_builderName); +} + +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCSettingViewFactory.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCSettingViewFactory.h new file mode 100755 index 0000000..a819e13 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCSettingViewFactory.h @@ -0,0 +1,25 @@ +#pragma once + +#include "../ovd_base.h" +#include "ovdCAbstractSettingView.h" + +namespace OpenViBE { +namespace Designer { +namespace Setting { +class CSettingViewFactory final +{ +public: + CSettingViewFactory(const CString& builderName, const Kernel::IKernelContext& ctx) + : m_builderName(builderName), m_kernelCtx(ctx) { } + + ~CSettingViewFactory() = default; + + CAbstractSettingView* getSettingView(Kernel::IBox& box, const size_t index); + +private: + CString m_builderName; + const Kernel::IKernelContext& m_kernelCtx; +}; +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCStringSettingView.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCStringSettingView.cpp new file mode 100755 index 0000000..888b23a --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCStringSettingView.cpp @@ -0,0 +1,41 @@ +#include "ovdCStringSettingView.h" +#include "../ovd_base.h" + +namespace OpenViBE { +namespace Designer { +namespace Setting { + +static void OnChange(GtkEntry* /*entry*/, gpointer data) { static_cast(data)->onChange(); } + +CStringSettingView::CStringSettingView(Kernel::IBox& box, const size_t index, CString& builderName) + : CAbstractSettingView(box, index, builderName, "settings_collection-entry_setting_string") +{ + GtkWidget* settingWidget = CAbstractSettingView::getEntryFieldWidget(); + + m_entry = GTK_ENTRY(settingWidget); + g_signal_connect(G_OBJECT(m_entry), "changed", G_CALLBACK(OnChange), this); + + CAbstractSettingView::initializeValue(); +} + +void CStringSettingView::getValue(CString& value) const { value = CString(gtk_entry_get_text(m_entry)); } + +void CStringSettingView::setValue(const CString& value) +{ + m_onValueSetting = true; + gtk_entry_set_text(m_entry, value); + m_onValueSetting = false; +} + +void CStringSettingView::onChange() +{ + if (!m_onValueSetting) + { + const gchar* value = gtk_entry_get_text(m_entry); + getBox().setSettingValue(getSettingIndex(), value); + } +} + +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCStringSettingView.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCStringSettingView.h new file mode 100755 index 0000000..f5b4dd0 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/dynamic_settings/ovdCStringSettingView.h @@ -0,0 +1,25 @@ +#pragma once + +#include "../ovd_base.h" +#include "ovdCAbstractSettingView.h" + +namespace OpenViBE { +namespace Designer { +namespace Setting { +class CStringSettingView final : public CAbstractSettingView +{ +public: + CStringSettingView(Kernel::IBox& box, const size_t index, CString& builderName); + + void getValue(CString& value) const override; + void setValue(const CString& value) override; + + void onChange(); + +private: + GtkEntry* m_entry = nullptr; + bool m_onValueSetting = false; +}; +} // namespace Setting +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdAssert.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdAssert.h new file mode 100644 index 0000000..4f24241 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdAssert.h @@ -0,0 +1,70 @@ +#pragma once + +#include +#include +#include + +#include +#include +#include + +#define OV_ERROR_D(description, type, returnValue) OV_ERROR(description, type, returnValue, m_kernelCtx.getErrorManager(), m_kernelCtx.getLogManager()) +#define OV_ERROR_DRF(description, type) OV_ERROR(description, type, false, m_kernelCtx.getErrorManager(), m_kernelCtx.getLogManager()) +#define OV_ERROR_DRZ(description, type) OV_ERROR(description, type, 0, m_kernelCtx.getErrorManager(), m_kernelCtx.getLogManager()) +#define OV_ERROR_DRU(description, type) OV_ERROR(description, type, CIdentifier::undefined(), m_kernelCtx.getErrorManager(), m_kernelCtx.getLogManager()) +#define OV_ERROR_DRV(description, type) OV_ERROR(description, type, void(), m_kernelCtx.getErrorManager(), m_kernelCtx.getLogManager()) +#define OV_ERROR_DRN(description, type) OV_ERROR(description, type, nullptr, m_kernelCtx.getErrorManager(), m_kernelCtx.getLogManager()) + +#define OV_ERROR_UNLESS_D(expression, description, type, returnValue) OV_ERROR_UNLESS(expression, description, type, returnValue, m_kernelCtx.getErrorManager(), m_kernelCtx.getLogManager()) +#define OV_ERROR_UNLESS_DRF(expression, description, type) OV_ERROR_UNLESS(expression, description, type, false, m_kernelCtx.getErrorManager(), m_kernelCtx.getLogManager()) +#define OV_ERROR_UNLESS_DRZ(expression, description, type) OV_ERROR_UNLESS(expression, description, type, 0, m_kernelCtx.getErrorManager(), m_kernelCtx.getLogManager()) +#define OV_ERROR_UNLESS_DRU(expression, description, type) OV_ERROR_UNLESS(expression, description, type, CIdentifier::undefined(), m_kernelCtx.getErrorManager(), m_kernelCtx.getLogManager()) +#define OV_ERROR_UNLESS_DRV(expression, description, type) OV_ERROR_UNLESS(expression, description, type, void() , m_kernelCtx.getErrorManager(), m_kernelCtx.getLogManager()) +#define OV_ERROR_UNLESS_DRN(expression, description, type) OV_ERROR_UNLESS(expression, description, type, nullptr, m_kernelCtx.getErrorManager(), m_kernelCtx.getLogManager()) + +#define OV_FATAL_D(description, type) OV_FATAL(description, type, m_kernelCtx.getLogManager()) +#define OV_FATAL_UNLESS_D(expression, description, type) OV_FATAL_UNLESS(expression, description, type, m_kernelCtx.getLogManager()) + +#ifndef _MSC_VER +#define NOEXCEPT noexcept +#else +#define NOEXCEPT +#endif + +class DesignerException final : public std::runtime_error +{ +public: + DesignerException(OpenViBE::Kernel::IErrorManager& errorManager) + : std::runtime_error("Designer caused an exception"), m_ErrorManager(errorManager) {} + + const char* what() const NOEXCEPT override { return m_ErrorManager.getLastErrorString(); } + + std::string getErrorString() const + { + std::string errorMessage; + const OpenViBE::Kernel::IError* error = m_ErrorManager.getLastError(); + while (error) + { + char location[1024]; + FS::Files::getFilename(error->getErrorLocation(), location); + errorMessage += "Message: " + std::string(error->getErrorString()) + "\nFile: " + location + "\n"; + error = error->getNestedError(); + } + m_ErrorManager.releaseErrors(); + return errorMessage; + } + + void releaseErrors() NOEXCEPT { m_ErrorManager.releaseErrors(); } + + OpenViBE::Kernel::IErrorManager& m_ErrorManager; +}; + +#define OV_EXCEPTION_D(description, type) \ +do { \ + m_kernelCtx.getErrorManager().pushErrorAtLocation(type, static_cast(OpenViBE::ErrorStream() << description).str().c_str(), __FILE__, __LINE__ ); \ + m_kernelCtx.getLogManager() << OpenViBE::Kernel::LogLevel_Fatal << "[Error description] = " << description << "; [Error code] = " << size_t((type)) << "\n"; \ + throw DesignerException(m_kernelCtx.getErrorManager()); \ +} while(0) + +#define OV_EXCEPTION_UNLESS_D(expression, description, type) \ +do { if (!(expression)) { OV_EXCEPTION_D(description, type); } } while(0) diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCAboutPluginDialog.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCAboutPluginDialog.cpp new file mode 100644 index 0000000..ab846aa --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCAboutPluginDialog.cpp @@ -0,0 +1,56 @@ +#include "ovdCAboutPluginDialog.h" + +namespace OpenViBE { +namespace Designer { + +bool CAboutPluginDialog::run() +{ + if (m_pods == nullptr) { m_pods = m_kernelCtx.getPluginManager().getPluginObjectDescCreating(m_pluginClassID); } + if (!m_pods) { return false; } + + GtkBuilder* interface = gtk_builder_new(); // glade_xml_new(m_guiFilename.toASCIIString(), "plugin_about", nullptr); + gtk_builder_add_from_file(interface, m_guiFilename.toASCIIString(), nullptr); + gtk_builder_connect_signals(interface, nullptr); + + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(interface, "plugin_about")); + GtkWidget* type = GTK_WIDGET(gtk_builder_get_object(interface, "plugin_about-entry_type")); + GtkWidget* name = GTK_WIDGET(gtk_builder_get_object(interface, "plugin_about-entry_name")); + GtkWidget* authorName = GTK_WIDGET(gtk_builder_get_object(interface, "plugin_about-entry_author_name")); + GtkWidget* authorCompanyName = GTK_WIDGET(gtk_builder_get_object(interface, "plugin_about-entry_company_name")); + GtkWidget* category = GTK_WIDGET(gtk_builder_get_object(interface, "plugin_about-entry_category")); + GtkWidget* version = GTK_WIDGET(gtk_builder_get_object(interface, "plugin_about-entry_version")); + GtkWidget* addedSoftwareVersion = GTK_WIDGET(gtk_builder_get_object(interface, "plugin_about-entry_added_software_version")); + GtkWidget* updatedSoftwareVersion = GTK_WIDGET(gtk_builder_get_object(interface, "plugin_about-entry_update_software_version")); + GtkWidget* shortDesc = GTK_WIDGET(gtk_builder_get_object(interface, "plugin_about-textview_short_description")); + GtkWidget* detailedDesc = GTK_WIDGET(gtk_builder_get_object(interface, "plugin_about-textview_detailed_description")); + g_object_unref(interface); + + if (m_pods->isDerivedFromClass(OV_ClassId_Plugins_AlgorithmDesc)) { gtk_entry_set_text(GTK_ENTRY(type), "Algorithm"); } + else if (m_pods->isDerivedFromClass(OV_ClassId_Plugins_BoxAlgorithmDesc)) { gtk_entry_set_text(GTK_ENTRY(type), "Box algorithm"); } + else if (m_pods->isDerivedFromClass(OV_ClassId_Plugins_ScenarioImporterDesc)) { gtk_entry_set_text(GTK_ENTRY(type), "Scenario importer"); } + else if (m_pods->isDerivedFromClass(OV_ClassId_Plugins_ScenarioExporterDesc)) { gtk_entry_set_text(GTK_ENTRY(type), "Scenario exporter"); } + + GtkTextBuffer* shortDescBuffer = gtk_text_buffer_new(nullptr); + GtkTextBuffer* detailedDescBuffer = gtk_text_buffer_new(nullptr); + gtk_text_buffer_set_text(shortDescBuffer, m_pods->getShortDescription(), -1); + gtk_text_buffer_set_text(detailedDescBuffer, m_pods->getDetailedDescription(), -1); + gtk_entry_set_text(GTK_ENTRY(name), m_pods->getName()); + gtk_entry_set_text(GTK_ENTRY(authorName), m_pods->getAuthorName()); + gtk_entry_set_text(GTK_ENTRY(authorCompanyName), m_pods->getAuthorCompanyName()); + gtk_entry_set_text(GTK_ENTRY(category), m_pods->getCategory()); + gtk_entry_set_text(GTK_ENTRY(version), m_pods->getVersion()); + gtk_entry_set_text(GTK_ENTRY(addedSoftwareVersion), m_pods->getAddedSoftwareVersion()); + gtk_entry_set_text(GTK_ENTRY(updatedSoftwareVersion), m_pods->getUpdatedSoftwareVersion()); + gtk_text_view_set_buffer(GTK_TEXT_VIEW(shortDesc), shortDescBuffer); + gtk_text_view_set_buffer(GTK_TEXT_VIEW(detailedDesc), detailedDescBuffer); + g_object_unref(shortDescBuffer); + g_object_unref(detailedDescBuffer); + + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + + return true; +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCAboutPluginDialog.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCAboutPluginDialog.h new file mode 100644 index 0000000..2e6c0af --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCAboutPluginDialog.h @@ -0,0 +1,31 @@ +#pragma once + +#include "ovd_base.h" + +namespace OpenViBE { +namespace Designer { +class CAboutPluginDialog final +{ +public: + + CAboutPluginDialog(const Kernel::IKernelContext& ctx, const CIdentifier& pluginClassID, const char* guiFilename) + : m_kernelCtx(ctx), m_pluginClassID(pluginClassID), m_guiFilename(guiFilename) { } + + CAboutPluginDialog(const Kernel::IKernelContext& ctx, const Plugins::IPluginObjectDesc* pod, const char* guiFilename) + : m_kernelCtx(ctx), m_pluginClassID(CIdentifier::undefined()), m_guiFilename(guiFilename), m_pods(pod) { } + + ~CAboutPluginDialog() = default; + + bool run(); + +protected: + + const Kernel::IKernelContext& m_kernelCtx; + CIdentifier m_pluginClassID = CIdentifier::undefined(); + CString m_guiFilename; + const Plugins::IPluginObjectDesc* m_pods = nullptr; + + CAboutPluginDialog() = delete; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCAboutScenarioDialog.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCAboutScenarioDialog.cpp new file mode 100755 index 0000000..e1e74b6 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCAboutScenarioDialog.cpp @@ -0,0 +1,99 @@ +#include "ovdCAboutScenarioDialog.h" + +namespace OpenViBE { +namespace Designer { + +static void buttonMetaboxReset_clicked(GtkWidget* /*widget*/, gpointer data) { gtk_entry_set_text(GTK_ENTRY(data), CIdentifier::random().str().c_str()); } + +bool CAboutScenarioDialog::run() + +{ + GtkBuilder* interface = gtk_builder_new(); // glade_xml_new(m_guiFilename.toASCIIString(), "scenario_about", nullptr); + gtk_builder_add_from_file(interface, m_guiFilename.toASCIIString(), nullptr); + gtk_builder_connect_signals(interface, nullptr); + + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(interface, "scenario_about")); + GtkWidget* name = GTK_WIDGET(gtk_builder_get_object(interface, "scenario_about-entry_name")); + GtkWidget* authorName = GTK_WIDGET(gtk_builder_get_object(interface, "scenario_about-entry_author_name")); + GtkWidget* authorCompanyName = GTK_WIDGET(gtk_builder_get_object(interface, "scenario_about-entry_company_name")); + GtkWidget* category = GTK_WIDGET(gtk_builder_get_object(interface, "scenario_about-entry_category")); + GtkWidget* version = GTK_WIDGET(gtk_builder_get_object(interface, "scenario_about-entry_version")); + GtkWidget* documentationPage = GTK_WIDGET(gtk_builder_get_object(interface, "scenario_about-entry_documentation_page")); + GtkWidget* addedSoftwareVersion = GTK_WIDGET(gtk_builder_get_object(interface, "scenario_about-entry_added_software_version")); + GtkWidget* updatedSoftwareVersion = GTK_WIDGET(gtk_builder_get_object(interface, "scenario_about-entry_update_software_version")); + + GtkWidget* metaboxId = GTK_WIDGET(gtk_builder_get_object(interface, "scenario_about-entry_metabox_id")); + + GtkWidget* resetMetaboxId = GTK_WIDGET(gtk_builder_get_object(interface, "scenario_about-button_reset_metabox_id")); + const gulong signalHandlerId = g_signal_connect(G_OBJECT(resetMetaboxId), "clicked", G_CALLBACK(buttonMetaboxReset_clicked), metaboxId); + + GtkWidget* shortDesc = GTK_WIDGET(gtk_builder_get_object(interface, "scenario_about-textview_short_description")); + GtkWidget* detailedDesc = GTK_WIDGET(gtk_builder_get_object(interface, "scenario_about-textview_detailed_description")); + + g_object_unref(interface); + + gtk_entry_set_text(GTK_ENTRY(name), m_scenario.getAttributeValue(OV_AttributeId_Scenario_Name).toASCIIString()); + gtk_entry_set_text(GTK_ENTRY(authorName), m_scenario.getAttributeValue(OV_AttributeId_Scenario_Author).toASCIIString()); + gtk_entry_set_text(GTK_ENTRY(authorCompanyName), m_scenario.getAttributeValue(OV_AttributeId_Scenario_Company).toASCIIString()); + gtk_entry_set_text(GTK_ENTRY(category), m_scenario.getAttributeValue(OV_AttributeId_Scenario_Category).toASCIIString()); + gtk_entry_set_text(GTK_ENTRY(version), m_scenario.getAttributeValue(OV_AttributeId_Scenario_Version).toASCIIString()); + gtk_entry_set_text(GTK_ENTRY(documentationPage), m_scenario.getAttributeValue(OV_AttributeId_Scenario_DocumentationPage).toASCIIString()); + gtk_entry_set_text(GTK_ENTRY(addedSoftwareVersion), m_scenario.getAttributeValue(OV_AttributeId_Scenario_AddedSoftwareVersion).toASCIIString()); + gtk_entry_set_text(GTK_ENTRY(updatedSoftwareVersion), m_scenario.getAttributeValue(OV_AttributeId_Scenario_UpdatedSoftwareVersion).toASCIIString()); + + if (m_scenario.isMetabox()) { gtk_entry_set_text(GTK_ENTRY(metaboxId), m_scenario.getAttributeValue(OVP_AttributeId_Metabox_ID).toASCIIString()); } + else + { + gtk_widget_set_sensitive(metaboxId, FALSE); + gtk_widget_set_sensitive(resetMetaboxId, FALSE); + } + + GtkTextBuffer* shortDescBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(shortDesc)); + gtk_text_buffer_set_text(shortDescBuffer, m_scenario.getAttributeValue(OV_AttributeId_Scenario_ShortDescription).toASCIIString(), -1); + GtkTextBuffer* detailedDescBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(detailedDesc)); + gtk_text_buffer_set_text(detailedDescBuffer, m_scenario.getAttributeValue(OV_AttributeId_Scenario_DetailedDescription).toASCIIString(), -1); + + gtk_dialog_run(GTK_DIALOG(dialog)); + + g_signal_handler_disconnect(G_OBJECT(resetMetaboxId), signalHandlerId); + m_scenario.setAttributeValue(OV_AttributeId_Scenario_Name, gtk_entry_get_text(GTK_ENTRY(name))); + m_scenario.setAttributeValue(OV_AttributeId_Scenario_Author, gtk_entry_get_text(GTK_ENTRY(authorName))); + m_scenario.setAttributeValue(OV_AttributeId_Scenario_Company, gtk_entry_get_text(GTK_ENTRY(authorCompanyName))); + m_scenario.setAttributeValue(OV_AttributeId_Scenario_Category, gtk_entry_get_text(GTK_ENTRY(category))); + m_scenario.setAttributeValue(OV_AttributeId_Scenario_Version, gtk_entry_get_text(GTK_ENTRY(version))); + m_scenario.setAttributeValue(OV_AttributeId_Scenario_DocumentationPage, gtk_entry_get_text(GTK_ENTRY(documentationPage))); + m_scenario.setAttributeValue(OV_AttributeId_Scenario_AddedSoftwareVersion, gtk_entry_get_text(GTK_ENTRY(addedSoftwareVersion))); + m_scenario.setAttributeValue(OV_AttributeId_Scenario_UpdatedSoftwareVersion, gtk_entry_get_text(GTK_ENTRY(updatedSoftwareVersion))); + + if (m_scenario.isMetabox()) + { + const CString id(gtk_entry_get_text(GTK_ENTRY(metaboxId))); + CIdentifier tmp; + if (!tmp.fromString(id)) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Invalid identifier " << id + << " is not in the \"(0x[0-9a-f]{1-8}, 0x[0-9a-f]{1-8})\" format. "; + m_kernelCtx.getLogManager() << "Reverting to " << m_scenario.getAttributeValue(OVP_AttributeId_Metabox_ID).toASCIIString() << ".\n"; + } + else { m_scenario.setAttributeValue(OVP_AttributeId_Metabox_ID, id); } + } + + GtkTextIter start, end; + + gtk_text_buffer_get_start_iter(shortDescBuffer, &start); + gtk_text_buffer_get_end_iter(shortDescBuffer, &end); + m_scenario.setAttributeValue(OV_AttributeId_Scenario_ShortDescription, + gtk_text_buffer_get_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(shortDesc)), &start, &end, FALSE)); + + gtk_text_buffer_get_start_iter(detailedDescBuffer, &start); + gtk_text_buffer_get_end_iter(detailedDescBuffer, &end); + m_scenario.setAttributeValue(OV_AttributeId_Scenario_DetailedDescription, + gtk_text_buffer_get_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(detailedDesc)), &start, &end, FALSE)); + + gtk_widget_destroy(dialog); + + return true; +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCAboutScenarioDialog.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCAboutScenarioDialog.h new file mode 100644 index 0000000..ce753df --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCAboutScenarioDialog.h @@ -0,0 +1,27 @@ +#pragma once + +#include "ovd_base.h" + +namespace OpenViBE { +namespace Designer { +class CAboutScenarioDialog final +{ +public: + + CAboutScenarioDialog(const Kernel::IKernelContext& ctx, Kernel::IScenario& scenario, const char* guiFilename) + : m_kernelCtx(ctx), m_scenario(scenario), m_guiFilename(guiFilename) { } + + ~CAboutScenarioDialog() = default; + + bool run(); + +protected: + + const Kernel::IKernelContext& m_kernelCtx; + Kernel::IScenario& m_scenario; + CString m_guiFilename; + + CAboutScenarioDialog() = delete; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCApplication.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCApplication.cpp new file mode 100755 index 0000000..54235af --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCApplication.cpp @@ -0,0 +1,2923 @@ +#include "ovd_base.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#if defined TARGET_OS_Windows +#include "system/WindowsUtilities.h" +#include "Windows.h" +#endif + +#include +#include +#include +#include +#include +#include + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS +#include +#define _strcmpi strcasecmp +#endif + +#define OVD_GUI_File OpenViBE::Directories::getDataDir() + "/applications/designer/interface.ui" +#define OVD_GUI_AboutDialog_File OpenViBE::Directories::getDataDir() + "/applications/designer/about-dialog.ui" +#define OVD_GUI_Settings_File OpenViBE::Directories::getDataDir() + "/applications/designer/interface-settings.ui" +#define OVD_AttributeId_ScenarioFilename OpenViBE::CIdentifier(0x4C536D0A, 0xB23DC545) +#define OVD_README_File OpenViBE::Directories::getDistRootDir() + "/ReadMe.txt" + + +#define OVD_SCENARIOS_PATH "${Path_Data}/scenarios" +#define OVD_WORKING_SCENARIOS_PATH "${Designer_DefaultWorkingDirectory}/scenarios" + +static const size_t s_RecentFileNumber = 10; + +#include "ovdCDesignerVisualization.h" +#include "ovdCPlayerVisualization.h" +#include "ovdCInterfacedObject.h" +#include "ovdCInterfacedScenario.h" +#include "ovdCApplication.h" +#include "ovdAssert.h" +#include "ovdCLogListenerDesigner.h" + +#include "visualization/ovdCVisualizationManager.h" + +#define OV_ClassId_Selected OpenViBE::CIdentifier(0xC67A01DC, 0x28CE06C1) + +// because std::tolower has multiple signatures, it can not be easily used in std::transform this workaround is taken from http://www.gcek.net/ref/books/sw/cpp/ticppv2/ +template +static TChar to_lower(TChar c) { return tolower(c); } + +namespace OpenViBE { +namespace Designer { +namespace { + +struct SBoxProto final : Kernel::IBoxProto +{ + explicit SBoxProto(Kernel::ITypeManager& typeManager) : typeManager(typeManager) { } + + bool addInput(const CString& /*name*/, const CIdentifier& typeID, const CIdentifier& id, const bool /*notify*/) override + { + uint64_t v = typeID.id(); + swap_byte(v, nInputHash); + swap_byte(nInputHash, 0x7936A0F3BD12D936LL); + hash = hash.id() ^ v; + if (id != CIdentifier::undefined()) + { + v = id.id(); + swap_byte(v, 0x2BD1D158F340014D); + hash = hash.id() ^ v; + } + return true; + } + // + bool addOutput(const CString& /*name*/, const CIdentifier& typeID, const CIdentifier& id, const bool /*notify*/) override + { + uint64_t v = typeID.id(); + swap_byte(v, nOutputHash); + swap_byte(nOutputHash, 0xCBB66A5B893AA4E9LL); + hash = hash.id() ^ v; + if (id != CIdentifier::undefined()) + { + v = id.id(); + swap_byte(v, 0x87CA0F5EFC4FAC68); + hash = hash.id() ^ v; + } + return true; + } + + bool addSetting(const CString& /*name*/, const CIdentifier& typeID, const CString& /*defaultValue*/, const bool /*modifiable*/, const CIdentifier& id, + const bool /*notify*/) override + { + uint64_t v = typeID.id(); + swap_byte(v, nSettingHash); + swap_byte(nSettingHash, 0x3C87F3AAE9F8303BLL); + hash = hash.id() ^ v; + if (id != CIdentifier::undefined()) + { + v = id.id(); + swap_byte(v, 0x17185F7CDA63A9FA); + hash = hash.id() ^ v; + } + return true; + } + + bool addInputSupport(const CIdentifier& /*typeID*/) override { return true; } + bool addOutputSupport(const CIdentifier& /*typeID*/) override { return true; } + + bool addFlag(const Kernel::EBoxFlag flag) override + { + switch (flag) + { + case Kernel::BoxFlag_CanAddInput: hash = hash.id() ^ CIdentifier(0x07507AC8, 0xEB643ACE).id(); + break; + case Kernel::BoxFlag_CanModifyInput: hash = hash.id() ^ CIdentifier(0x5C985376, 0x8D74CDB8).id(); + break; + case Kernel::BoxFlag_CanAddOutput: hash = hash.id() ^ CIdentifier(0x58DEA69B, 0x12411365).id(); + break; + case Kernel::BoxFlag_CanModifyOutput: hash = hash.id() ^ CIdentifier(0x6E162C01, 0xAC979F22).id(); + break; + case Kernel::BoxFlag_CanAddSetting: hash = hash.id() ^ CIdentifier(0xFA7A50DC, 0x2140C013).id(); + break; + case Kernel::BoxFlag_CanModifySetting: hash = hash.id() ^ CIdentifier(0x624D7661, 0xD8DDEA0A).id(); + break; + case Kernel::BoxFlag_IsDeprecated: isDeprecated = true; + break; + default: return false; + } + return true; + } + + bool addFlag(const CIdentifier& flag) override + { + const uint64_t value = typeManager.getEnumerationEntryValueFromName(OV_TypeId_BoxAlgorithmFlag, flag.toString()); + return value != CIdentifier::undefined().id(); + } + + void swap_byte(uint64_t& v, const uint64_t s) + { + uint8_t V[sizeof(v)]; + uint8_t S[sizeof(s)]; + System::Memory::hostToLittleEndian(v, V); + System::Memory::hostToLittleEndian(s, S); + for (size_t i = 0; i < sizeof(s); i += 2) + { + const size_t j = S[i] % sizeof(v); + const size_t k = S[i + 1] % sizeof(v); + const uint8_t t = V[j]; + V[j] = V[k]; + V[k] = t; + } + System::Memory::littleEndianToHost(V, &v); + } + + _IsDerivedFromClass_Final_(IBoxProto, CIdentifier::undefined()) + + CIdentifier hash; + bool isDeprecated = false; + uint64_t nInputHash = 0x64AC3CB54A35888CLL; + uint64_t nOutputHash = 0x21E0FAAFE5CAF1E1LL; + uint64_t nSettingHash = 0x6BDFB15B54B09F63LL; + Kernel::ITypeManager& typeManager; +}; + +extern "C" G_MODULE_EXPORT void open_url_mensia_cb(GtkWidget* /*widget*/, gpointer /*data*/) +{ +#if defined(TARGET_OS_Windows) && defined(MENSIA_DISTRIBUTION) + system("start http://mensiatech.com"); +#endif +} +} // namespace + +static guint idle_add_cb(GSourceFunc callback, gpointer data, gint /*priority*/ = G_PRIORITY_DEFAULT_IDLE) +{ + GSource* src = g_idle_source_new(); + g_source_set_priority(src, G_PRIORITY_LOW); + g_source_set_callback(src, callback, data, nullptr); + return g_source_attach(src, nullptr); +} + +static guint timeout_add_cb(const guint interval, GSourceFunc callback, gpointer data, gint /*iPriority*/ = G_PRIORITY_DEFAULT) +{ + GSource* src = g_timeout_source_new(interval); + g_source_set_priority(src, G_PRIORITY_LOW); + g_source_set_callback(src, callback, data, nullptr); + return g_source_attach(src, nullptr); +} + +static void drag_data_get_cb(GtkWidget* widget, GdkDragContext* dc, GtkSelectionData* selectionData, const guint info, const guint time, const gpointer data) +{ + static_cast(data)->dragDataGetCB(widget, dc, selectionData, info, time); +} + +static void menu_undo_cb(GtkMenuItem* /*item*/, gpointer data) { static_cast(data)->undoCB(); } +static void menu_redo_cb(GtkMenuItem* /*item*/, gpointer data) { static_cast(data)->redoCB(); } + +static void menu_focus_search_cb(GtkMenuItem* /*item*/, gpointer data) +{ + gtk_widget_grab_focus(GTK_WIDGET(gtk_builder_get_object(static_cast(data)->m_Builder, "openvibe-box_algorithm_searchbox"))); +} + +static void menu_copy_selection_cb(GtkMenuItem* /*item*/, gpointer data) { static_cast(data)->copySelectionCB(); } +static void menu_cut_selection_cb(GtkMenuItem* /*item*/, gpointer data) { static_cast(data)->cutSelectionCB(); } +static void menu_paste_selection_cb(GtkMenuItem* /*item*/, gpointer data) { static_cast(data)->pasteSelectionCB(); } +static void menu_delete_selection_cb(GtkMenuItem* /*item*/, gpointer data) { static_cast(data)->deleteSelectionCB(); } +static void menu_preferences_cb(GtkMenuItem* /*item*/, gpointer data) { static_cast(data)->preferencesCB(); } +static void menu_new_scenario_cb(GtkMenuItem* /*item*/, gpointer data) { static_cast(data)->newScenarioCB(); } +static void menu_open_scenario_cb(GtkMenuItem* /*item*/, gpointer data) { static_cast(data)->openScenarioCB(); } + +static void menu_open_recent_scenario_cb(GtkMenuItem* item, gpointer data) +{ + const gchar* fileName = gtk_menu_item_get_label(item); + static_cast(data)->openScenario(fileName); +} + +static void menu_save_scenario_cb(GtkMenuItem* /*item*/, gpointer data) { static_cast(data)->saveScenarioCB(); } +static void menu_save_scenario_as_cb(GtkMenuItem* /*item*/, gpointer data) { static_cast(data)->saveScenarioAsCB(); } +static void menu_restore_default_scenarios_cb(GtkMenuItem* /*item*/, gpointer data) { static_cast(data)->restoreDefaultScenariosCB(); } + +static void menu_close_scenario_cb(GtkMenuItem* /*item*/, gpointer data) +{ + static_cast(data)->closeScenarioCB(static_cast(data)->getCurrentInterfacedScenario()); +} + +static void menu_quit_application_cb(GtkMenuItem* /*item*/, gpointer data) { if (static_cast(data)->quitApplicationCB()) { gtk_main_quit(); } } + +static void menu_about_scenario_cb(GtkMenuItem* /*item*/, gpointer data) +{ + static_cast(data)->aboutScenarioCB(static_cast(data)->getCurrentInterfacedScenario()); +} + +static void menu_about_openvibe_cb(GtkMenuItem* /*item*/, gpointer data) { static_cast(data)->aboutOpenViBECB(); } + +#if defined(TARGET_OS_Windows) +static void menu_about_link_clicked_cb(GtkAboutDialog* /*dialog*/, const gchar* linkPtr, gpointer data) +{ + static_cast(data)->aboutLinkClickedCB(linkPtr); +} +#endif + +static void menu_browse_documentation_cb(GtkMenuItem* /*item*/, gpointer data) { static_cast(data)->browseDocumentationCB(); } + +#ifdef MENSIA_DISTRIBUTION +static void menu_register_license_cb(GtkMenuItem* /*item*/, gpointer data) { static_cast(data)->registerLicenseCB(); } +#endif + +static void menu_report_issue_cb(GtkMenuItem* /*item*/, gpointer data) { static_cast(data)->reportIssueCB(); } + +static void menu_display_changelog_cb(GtkMenuItem* /*item*/, gpointer data) +{ + if (!static_cast(data)->displayChangelogWhenAvailable()) + { + const std::string version = static_cast(data)->m_kernelCtx.getConfigurationManager().expand("${Application_Version}").toASCIIString(); + GtkWidget* dialog = gtk_message_dialog_new(nullptr, GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, + "No boxes were added or updated in version %s of " DESIGNER_NAME ".", + version != "${Application_Version}" ? version.c_str() : ProjectVersion); + gtk_window_set_title(GTK_WINDOW(dialog), "No new boxes"); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + } +} + +static void button_new_scenario_cb(GtkButton* /*button*/, gpointer data) { static_cast(data)->newScenarioCB(); } +static void button_open_scenario_cb(GtkButton* /*button*/, gpointer data) { static_cast(data)->openScenarioCB(); } +static void button_save_scenario_cb(GtkButton* /*button*/, gpointer data) { static_cast(data)->saveScenarioCB(); } +static void button_save_scenario_as_cb(GtkButton* /*button*/, gpointer data) { static_cast(data)->saveScenarioAsCB(); } + +static void button_close_scenario_cb(GtkButton* /*button*/, gpointer data) +{ + static_cast(data)->closeScenarioCB(static_cast(data)->getCurrentInterfacedScenario()); +} + +static void button_undo_cb(GtkButton* /*button*/, gpointer data) { static_cast(data)->undoCB(); } +static void button_redo_cb(GtkButton* /*button*/, gpointer data) { static_cast(data)->redoCB(); } + +#ifdef MENSIA_DISTRIBUTION +static void button_toggle_neurort_engine_configuration_cb(GtkMenuItem* item, gpointer data) +{ + static_cast(data)->m_ArchwayHandlerGUI->toggleNeuroRTEngineConfigurationDialog( + bool(gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(item)) == TRUE)); +} +#endif + +static void delete_designer_visualisation_cb(gpointer data) { static_cast(data)->deleteDesignerVisualizationCB(); } + +static void button_toggle_window_manager_cb(GtkToggleToolButton* /*button*/, gpointer data) +{ + static_cast(data)->toggleDesignerVisualizationCB(); +} + +static void button_comment_cb(GtkButton* /*button*/, CApplication* app) { app->addCommentCB(app->getCurrentInterfacedScenario()); } + +static void button_about_scenario_cb(GtkButton* /*button*/, gpointer data) +{ + static_cast(data)->aboutScenarioCB(static_cast(data)->getCurrentInterfacedScenario()); +} + +static void stop_scenario_cb(GtkButton* /*button*/, gpointer data) { static_cast(data)->stopScenarioCB(); } + +static void play_pause_scenario_cb(GtkButton* button, gpointer data) +{ + if (std::string(gtk_tool_button_get_stock_id(GTK_TOOL_BUTTON(button))) == GTK_STOCK_MEDIA_PLAY) { static_cast(data)->playScenarioCB(); } + else { static_cast(data)->pauseScenarioCB(); } +} + +static void next_scenario_cb(GtkButton* /*button*/, gpointer data) { static_cast(data)->nextScenarioCB(); } +static void forward_scenario_cb(GtkButton* /*button*/, gpointer data) { static_cast(data)->forwardScenarioCB(); } + +static void button_configure_current_scenario_settings_cb(GtkButton* /*button*/, CApplication* app) +{ + app->configureScenarioSettingsCB(app->getCurrentInterfacedScenario()); +} + +static gboolean button_quit_application_cb(GtkWidget* /*widget*/, GdkEvent* /*pEvent*/, gpointer data) +{ + if (static_cast(data)->quitApplicationCB()) + { + gtk_main_quit(); + return FALSE; + } + return TRUE; +} + +static gboolean window_state_changed_cb(GtkWidget* /*widget*/, GdkEventWindowState* event, gpointer data) +{ + if (event->changed_mask & GDK_WINDOW_STATE_MAXIMIZED) + { + // window has changed from maximized to not maximized or the other way around + static_cast(data)->windowStateChangedCB((event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) != 0); + } + return TRUE; +} + +static void log_level_cb(GtkButton* /*button*/, gpointer data) { static_cast(data)->logLevelCB(); } +static void cpu_usage_cb(GtkToggleButton* /*button*/, gpointer data) { static_cast(data)->cpuUsageCB(); } + +static gboolean change_current_scenario_cb(GtkNotebook* /*notebook*/, GtkNotebookPage* /*notebookPage*/, const guint pageNumber, gpointer data) +{ + static_cast(data)->changeCurrentScenario(int(pageNumber)); + return TRUE; +} + +static gboolean reorder_scenario_cb(GtkNotebook* /*notebook*/, GtkNotebookPage* /*notebookPage*/, const guint pageNumber, gpointer data) +{ + static_cast(data)->reorderCurrentScenario(int(pageNumber)); + return TRUE; +} + +static void box_algorithm_title_button_expand_cb(GtkButton* /*button*/, gpointer data) +{ + gtk_tree_view_expand_all(GTK_TREE_VIEW(gtk_builder_get_object(static_cast(data)->m_Builder, "openvibe-box_algorithm_tree"))); + gtk_notebook_set_current_page(GTK_NOTEBOOK(gtk_builder_get_object(static_cast(data)->m_Builder, "openvibe-resource_notebook")), 0); +} + +static void box_algorithm_title_button_collapse_cb(GtkButton* /*button*/, gpointer data) +{ + gtk_tree_view_collapse_all(GTK_TREE_VIEW(gtk_builder_get_object(static_cast(data)->m_Builder, "openvibe-box_algorithm_tree"))); + gtk_notebook_set_current_page(GTK_NOTEBOOK(gtk_builder_get_object(static_cast(data)->m_Builder, "openvibe-resource_notebook")), 0); +} + +static void algorithm_title_button_expand_cb(GtkButton* /*button*/, gpointer data) +{ + gtk_tree_view_expand_all(GTK_TREE_VIEW(gtk_builder_get_object(static_cast(data)->m_Builder, "openvibe-algorithm_tree"))); + gtk_notebook_set_current_page(GTK_NOTEBOOK(gtk_builder_get_object(static_cast(data)->m_Builder, "openvibe-resource_notebook")), 1); +} + +static void algorithm_title_button_collapse_cb(GtkButton* /*button*/, gpointer data) +{ + gtk_tree_view_collapse_all(GTK_TREE_VIEW(gtk_builder_get_object(static_cast(data)->m_Builder, "openvibe-algorithm_tree"))); + gtk_notebook_set_current_page(GTK_NOTEBOOK(gtk_builder_get_object(static_cast(data)->m_Builder, "openvibe-resource_notebook")), 1); +} + +static void clear_messages_cb(GtkButton* /*button*/, gpointer data) { static_cast(data)->clearMessages(); } +static void add_scenario_input_cb(GtkButton* /*button*/, CApplication* app) { app->getCurrentInterfacedScenario()->addScenarioInputCB(); } +static void add_scenario_output_cb(GtkButton* /*button*/, CApplication* app) { app->getCurrentInterfacedScenario()->addScenarioOutputCB(); } +static void add_scenario_setting_cb(GtkButton* /*button*/, CApplication* app) { app->getCurrentInterfacedScenario()->addScenarioSettingCB(); } + +static std::string strtoupper(std::string str) +{ + std::transform(str.begin(), str.end(), str.begin(), std::ptr_fun(std::toupper)); + return str; +} + +static gboolean box_algorithm_search_func(GtkTreeModel* model, GtkTreeIter* iter, gpointer data) +{ + auto* app = static_cast(data); + /* Visible if row is non-empty and first column is "HI" */ + + + gboolean visible = false; + gchar* name; + gchar* desc; + gboolean unstable; + + gtk_tree_model_get(model, iter, Resource_StringName, &name, Resource_StringShortDescription, &desc, Resource_BooleanIsUnstable, &unstable, -1); + + // consider only leaf nodes which match the search term + if (name != nullptr && desc != nullptr) + { + if (!unstable && (std::string::npos != strtoupper(name).find(strtoupper(app->m_SearchTerm)) + || std::string::npos != strtoupper(desc).find(strtoupper(app->m_SearchTerm)) || gtk_tree_model_iter_has_child(model, iter))) + { + //std::cout << "value : " << app->m_searchTerm << "\n"; + visible = true; + } + + g_free(name); + g_free(desc); + } + else { visible = true; } + + return visible; +} + +static gboolean box_algorithm_prune_empty_folders(GtkTreeModel* model, GtkTreeIter* iter, gpointer /*data*/) +{ + gboolean isPlugin; + gtk_tree_model_get(model, iter, Resource_BooleanIsPlugin, &isPlugin, -1); + + if (gtk_tree_model_iter_has_child(model, iter) || isPlugin) { return true; } + + return false; +} + +static gboolean do_refilter(CApplication* app) +{ + //if (0 == strcmp(app->m_searchTerm, "")) { gtk_tree_view_set_model(pApplication->m_pBoxAlgorithmTreeView, GTK_TREE_MODEL(app->m_BoxAlgorithmTreeModel)); } // reattach the old model + //else { + app->m_BoxAlgorithmTreeModelFilter = gtk_tree_model_filter_new(GTK_TREE_MODEL(app->m_BoxAlgorithmTreeModel), nullptr); + app->m_BoxAlgorithmTreeModelFilter2 = gtk_tree_model_filter_new(GTK_TREE_MODEL(app->m_BoxAlgorithmTreeModelFilter), nullptr); + app->m_BoxAlgorithmTreeModelFilter3 = gtk_tree_model_filter_new(GTK_TREE_MODEL(app->m_BoxAlgorithmTreeModelFilter2), nullptr); + app->m_BoxAlgorithmTreeModelFilter4 = gtk_tree_model_filter_new(GTK_TREE_MODEL(app->m_BoxAlgorithmTreeModelFilter3), nullptr); + // detach the normal model from the treeview + gtk_tree_view_set_model(app->m_BoxAlgorithmTreeView, nullptr); + + // clear the model + + // add a filtering function to the model + gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(app->m_BoxAlgorithmTreeModelFilter), box_algorithm_search_func, app, nullptr); + gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(app->m_BoxAlgorithmTreeModelFilter2), box_algorithm_prune_empty_folders, app, nullptr); + gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(app->m_BoxAlgorithmTreeModelFilter3), box_algorithm_prune_empty_folders, app, nullptr); + gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(app->m_BoxAlgorithmTreeModelFilter4), box_algorithm_prune_empty_folders, app, nullptr); + + // attach the model to the treeview + gtk_tree_view_set_model(app->m_BoxAlgorithmTreeView, GTK_TREE_MODEL(app->m_BoxAlgorithmTreeModelFilter4)); + + if (0 == strcmp(app->m_SearchTerm, "")) { gtk_tree_view_collapse_all(app->m_BoxAlgorithmTreeView); } + else { gtk_tree_view_expand_all(app->m_BoxAlgorithmTreeView); } + //} + + app->m_FilterTimeout = 0; + + return false; +} + +static void queue_refilter(CApplication* app) +{ + if (app->m_FilterTimeout) { g_source_remove(app->m_FilterTimeout); } + app->m_FilterTimeout = g_timeout_add(300, GSourceFunc(do_refilter), app); +} + +static void refresh_search_cb(GtkEntry* textfield, CApplication* app) +{ + app->m_SearchTerm = gtk_entry_get_text(textfield); + queue_refilter(app); +} + +static void refresh_search_no_data_cb(GtkToggleButton* /*button*/, CApplication* app) +{ + app->m_SearchTerm = gtk_entry_get_text(GTK_ENTRY(gtk_builder_get_object(app->m_Builder, "openvibe-box_algorithm_searchbox"))); + queue_refilter(app); +} + +static gboolean searchbox_select_all_cb(GtkWidget* widget, GdkEvent* /*event*/, CApplication* /*app*/) +{ + // we select the current search + gtk_widget_grab_focus(widget); // we must grab or selection wont work. It also triggers the other CBs. + gtk_editable_select_region(GTK_EDITABLE(widget), 0, -1); + return false; +} + +static gboolean searchbox_focus_in_cb(GtkWidget* /*widget*/, GdkEvent* /*event*/, CApplication* app) +{ + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(app->m_Builder, "openvibe-menu_edit")), false); + return false; +} + +static gboolean searchbox_focus_out_cb(GtkWidget* widget, GdkEvent* /*event*/, CApplication* app) +{ + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(app->m_Builder, "openvibe-menu_edit")), true); + gtk_editable_select_region(GTK_EDITABLE(widget), 0, 0); + return false; +} + +#if defined TARGET_OS_Windows +static void about_newversion_button_display_changelog_cb(GtkButton* /*button*/, gpointer /*data*/) +{ + System::WindowsUtilities::utf16CompliantShellExecute(nullptr, "open", (OVD_README_File).toASCIIString(), nullptr, nullptr, SHOW_OPENWINDOW); +} +#endif + +static gboolean idle_application_loop(gpointer data) +{ + auto* app = static_cast(data); +#ifdef MENSIA_DISTRIBUTION + if (app->m_ArchwayHandler->isEngineStarted()) { app->m_ArchwayHandler->loopEngine(); } +#endif + + CInterfacedScenario* scenario = app->getCurrentInterfacedScenario(); + if (scenario) + { + if (app->getPlayer() && scenario->m_PlayerStatus != app->getPlayer()->getStatus()) + { + switch (app->getPlayer()->getStatus()) + { + case Kernel::EPlayerStatus::Stop: + gtk_signal_emit_by_name(GTK_OBJECT(gtk_builder_get_object(app->m_Builder, "openvibe-button_stop")), "clicked"); + break; + case Kernel::EPlayerStatus::Pause: + while (scenario->m_PlayerStatus != Kernel::EPlayerStatus::Pause) + { + gtk_signal_emit_by_name(GTK_OBJECT(gtk_builder_get_object(app->m_Builder, "openvibe-button_play_pause")), "clicked"); + } + break; + case Kernel::EPlayerStatus::Step: break; + case Kernel::EPlayerStatus::Play: + while (scenario->m_PlayerStatus != Kernel::EPlayerStatus::Play) + { + gtk_signal_emit_by_name(GTK_OBJECT(gtk_builder_get_object(app->m_Builder, "openvibe-button_play_pause")), "clicked"); + } + break; + case Kernel::EPlayerStatus::Forward: + gtk_signal_emit_by_name(GTK_OBJECT(gtk_builder_get_object(app->m_Builder, "openvibe-button_forward")), "clicked"); + break; + default: + std::cout << "unhandled player status : " << toString(app->getPlayer()->getStatus()) << " :(\n"; + break; + } + } + else + { + const double time = (scenario->m_Player ? CTime(scenario->m_Player->getCurrentSimulatedTime()).toSeconds() : 0.0); + if (app->m_LastTimeRefresh != time) + { + app->m_LastTimeRefresh = uint64_t(time); + + const size_t milli = (size_t(time * 1000) % 1000); + const size_t seconds = (size_t(time)) % 60; + const size_t minutes = (size_t(time) / 60) % 60; + const size_t hours = (size_t(time) / 60) / 60; + + const double cpuUsage = (scenario->m_Player ? scenario->m_Player->getCPUUsage() : 0); + + std::stringstream ss("Time : "); + ss.fill('0'); + if (hours) + { + ss << std::setw(2) << hours << "h " << std::setw(2) << minutes << "m " << std::setw(2) << seconds << "s " << std::setw(3) << milli << "ms"; + } + else if (minutes) { ss << std::setw(2) << minutes << "m " << std::setw(2) << seconds << "s " << std::setw(3) << milli << "ms"; } + else if (seconds) { ss << std::setw(2) << seconds << "s " << std::setw(3) << milli << "ms"; } + else { ss << std::setw(3) << milli << "ms"; } + + + gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(app->m_Builder, "openvibe-label_current_time")), ss.str().c_str()); + + ss.str(""); + ss.fill('0'); + ss.precision(1); + ss << std::fixed << cpuUsage << "%"; + + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(gtk_builder_get_object(app->m_Builder, "openvibe-progressbar_cpu_usage")), cpuUsage * .01); + gtk_progress_bar_set_text(GTK_PROGRESS_BAR(gtk_builder_get_object(app->m_Builder, "openvibe-progressbar_cpu_usage")), ss.str().c_str()); + if (scenario->m_Player && scenario->m_DebugCPUUsage) + { + // redraws scenario + scenario->redraw(); + } + } + } + } + else + { + gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(app->m_Builder, "openvibe-label_current_time")), "Time : 000ms"); + gtk_progress_bar_set_text(GTK_PROGRESS_BAR(gtk_builder_get_object(app->m_Builder, "openvibe-progressbar_cpu_usage")), ""); + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(gtk_builder_get_object(app->m_Builder, "openvibe-progressbar_cpu_usage")), 0); + } + + if (!app->hasRunningScenario()) { System::Time::sleep(50); } + + return TRUE; +} + +static gboolean idle_scenario_loop(gpointer data) +{ + auto* scenario = static_cast(data); + const uint64_t time = System::Time::zgetTime(); + if (scenario->m_LastLoopTime == uint64_t(-1)) { scenario->m_LastLoopTime = time; } + scenario->m_Player->setFastForwardMaximumFactor(gtk_spin_button_get_value(scenario->m_Application.m_FastForwardFactor)); + if (!scenario->m_Player->loop(time - scenario->m_LastLoopTime)) { scenario->m_Application.stopInterfacedScenarioAndReleasePlayer(scenario); } + scenario->m_LastLoopTime = time; + return TRUE; +} + +static gboolean timeout_application_loop(gpointer data) +{ + auto* app = static_cast(data); + if (!app->hasRunningScenario() && app->m_CmdLineFlags & CommandLineFlag_NoGui) + { + app->quitApplicationCB(); + gtk_main_quit(); + return FALSE; + } + return TRUE; +} + +#ifdef NDEBUG +/** +* Function called in gtk loop: to check each 0.1second if a message was sent by a second instance of Designer +* (Meaning that someone tried to reopen Designer and this instance has to do something) +**/ +static gboolean receiveSecondInstanceMessage(gpointer data) +{ + try + { // Open or create ensures that + boost::interprocess::named_mutex mutex(boost::interprocess::open_or_create, MUTEX_NAME); + { + boost::interprocess::scoped_lock lock(mutex); + CApplication* app = static_cast(data); + //Tries to open a message, if fails, go to catch + boost::interprocess::message_queue message(boost::interprocess::open_only, MESSAGE_NAME); + app->m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "ovdCApplication::receiveSecondInstanceMessage- A message was detected \n"; + + // Whatever contains the message the first instance should try to take the focus + gtk_window_present(GTK_WINDOW(app->m_MainWindow)); + size_t size; + uint32_t priority = 0; + char buffer[2048]; + if (message.try_receive(&buffer, sizeof(buffer), size, priority)) + { + boost::interprocess::message_queue::remove(MESSAGE_NAME); + + int mode = 0; + char path[2048]; + char* msg = strtok(buffer, ";"); + while (msg != nullptr) + { + sscanf(msg, "%1d : <%2048[^>]> ", &mode, &path); + switch (mode) + { + case CommandLineFlag_Open: + app->openScenario(path); + break; + case CommandLineFlag_Play: + if (app->openScenario(path)) { app->playScenarioCB(); } + break; + case CommandLineFlag_PlayFast: + if (app->openScenario(path)) { app->forwardScenarioCB(); } + break; + default: break; + } + mode = 0; + msg = strtok(nullptr, ";"); + } + } + else { boost::interprocess::message_queue::remove(MESSAGE_NAME); } + } + } + // An interprocess_exception is throwed if no messages could be found, in this case we do nothing + catch (boost::interprocess::interprocess_exception) {} + return TRUE; +} +#endif + +static void zoom_in_scenario_cb(GtkButton* /*button*/, gpointer data) { static_cast(data)->zoomInCB(); } +static void zoom_out_scenario_cb(GtkButton* /*button*/, gpointer data) { static_cast(data)->zoomOutCB(); } + +static void spinner_zoom_changed_cb(GtkSpinButton* button, gpointer data) +{ + static_cast(data)->spinnerZoomChangedCB(size_t(gtk_spin_button_get_value(button))); +} + +static const GtkTargetEntry TARGET_ENTRY[] = { { static_cast("STRING"), 0, 0 }, { static_cast("text/plain"), 0, 0 } }; + + +CApplication::CApplication(const Kernel::IKernelContext& ctx) : m_kernelCtx(ctx) +{ + m_PluginMgr = &m_kernelCtx.getPluginManager(); + m_ScenarioMgr = &m_kernelCtx.getScenarioManager(); + m_ScenarioMgr->registerScenarioImporter(OVD_ScenarioImportContext_OpenScenario, ".xml", OVP_GD_ClassId_Algorithm_XMLScenarioImporter); + m_ScenarioMgr->registerScenarioImporter(OVD_ScenarioImportContext_OpenScenario, ".mxs", OVP_GD_ClassId_Algorithm_XMLScenarioImporter); + m_ScenarioMgr->registerScenarioImporter(OVD_ScenarioImportContext_OpenScenario, ".mxb", OVP_GD_ClassId_Algorithm_XMLScenarioImporter); + m_ScenarioMgr->registerScenarioExporter(OVD_ScenarioExportContext_SaveScenario, ".xml", OVP_GD_ClassId_Algorithm_XMLScenarioExporter); + m_ScenarioMgr->registerScenarioExporter(OVD_ScenarioExportContext_SaveScenario, ".mxs", OVP_GD_ClassId_Algorithm_XMLScenarioExporter); + m_ScenarioMgr->registerScenarioExporter(OVD_ScenarioExportContext_SaveMetabox, ".xml", OVP_GD_ClassId_Algorithm_XMLScenarioExporter); + m_ScenarioMgr->registerScenarioExporter(OVD_ScenarioExportContext_SaveMetabox, ".mxb", OVP_GD_ClassId_Algorithm_XMLScenarioExporter); + + m_VisualizationMgr = new CVisualizationManager(m_kernelCtx); + m_visualizationCtx = dynamic_cast( + m_kernelCtx.getPluginManager().createPluginObject(OVP_ClassId_Plugin_VisualizationCtx)); + m_visualizationCtx->setManager(m_VisualizationMgr); + m_logListener = nullptr; + + m_kernelCtx.getConfigurationManager().createConfigurationToken("Player_ScenarioDirectory", ""); + m_kernelCtx.getConfigurationManager().createConfigurationToken("__volatile_ScenarioDir", ""); + +#ifdef MENSIA_DISTRIBUTION + m_ArchwayHandler = new CArchwayHandler(ctx); + m_ArchwayHandlerGUI = new CArchwayHandlerGUI(*m_ArchwayHandler, this); +#endif +} + +CApplication::~CApplication() +{ + if (m_Builder) + { + m_kernelCtx.getLogManager().removeListener(m_logListener); + // @FIXME this likely still does not deallocate the actual widgets allocated by add_from_file + g_object_unref(G_OBJECT(m_Builder)); + m_Builder = nullptr; + } + + m_kernelCtx.getPluginManager().releasePluginObject(m_visualizationCtx); + +#ifdef MENSIA_DISTRIBUTION + delete m_ArchwayHandlerGUI; + delete m_ArchwayHandler; +#endif +} + +void CApplication::initialize(const ECommandLineFlag cmdLineFlags) +{ + m_CmdLineFlags = cmdLineFlags; + m_SearchTerm = ""; + + // Load metaboxes from metabox path + m_kernelCtx.getMetaboxManager().addMetaboxesFromFiles(m_kernelCtx.getConfigurationManager().expand("${Kernel_Metabox}")); + + // Copy recursively default scenario directory to the default working directory if not exists + const CString defaultWorkingDirectory = m_kernelCtx.getConfigurationManager().expand(OVD_WORKING_SCENARIOS_PATH); + const CString defaultScenariosDirectory = m_kernelCtx.getConfigurationManager().expand(OVD_SCENARIOS_PATH); + if (!FS::Files::directoryExists(defaultWorkingDirectory) && FS::Files::directoryExists(defaultScenariosDirectory)) + { + if (!FS::Files::copyDirectory(defaultScenariosDirectory, defaultWorkingDirectory)) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Could not create " << defaultWorkingDirectory << " folder\n"; + } + } + + + // Prepares scenario clipboard + CIdentifier clipboardScenarioID; + if (m_ScenarioMgr->createScenario(clipboardScenarioID)) { m_ClipboardScenario = &m_ScenarioMgr->getScenario(clipboardScenarioID); } + + m_Builder = gtk_builder_new(); // glade_xml_new(OVD_GUI_File, "openvibe", nullptr); + gtk_builder_add_from_file(m_Builder, OVD_GUI_File, nullptr); + gtk_builder_connect_signals(m_Builder, nullptr); + + std::string version = m_kernelCtx.getConfigurationManager().expand("${Application_Version}").toASCIIString(); + if (version == "${Application_Version}") + { + version = m_kernelCtx.getConfigurationManager().expand("${ProjectVersion_Major}.${ProjectVersion_Minor}.${ProjectVersion_Patch}").toASCIIString(); + } + const std::string defaultWindowTitle = BRAND_NAME " " DESIGNER_NAME " " + version; + + m_MainWindow = GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe")); + gtk_window_set_title(GTK_WINDOW(m_MainWindow), defaultWindowTitle.c_str()); + gtk_menu_item_set_label( + GTK_MENU_ITEM(gtk_builder_get_object(m_Builder, "openvibe-menu_display_changelog")), + ("What's new in " + version + " version of " + BRAND_NAME " " DESIGNER_NAME).c_str()); + + // Catch delete events when close button is clicked + g_signal_connect(m_MainWindow, "delete_event", G_CALLBACK(button_quit_application_cb), this); + // be notified on maximize/minimize events + g_signal_connect(m_MainWindow, "window-state-event", G_CALLBACK(window_state_changed_cb), this); + + // Connects menu actions + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_undo")), "activate", G_CALLBACK(menu_undo_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_redo")), "activate", G_CALLBACK(menu_redo_cb), this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_focus_search")), "activate", G_CALLBACK(menu_focus_search_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_copy")), "activate", G_CALLBACK(menu_copy_selection_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_cut")), "activate", G_CALLBACK(menu_cut_selection_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_paste")), "activate", G_CALLBACK(menu_paste_selection_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_delete")), "activate", G_CALLBACK(menu_delete_selection_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_preferences")), "activate", G_CALLBACK(menu_preferences_cb), this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_new")), "activate", G_CALLBACK(menu_new_scenario_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_open")), "activate", G_CALLBACK(menu_open_scenario_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_save")), "activate", G_CALLBACK(menu_save_scenario_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_save_as")), "activate", G_CALLBACK(menu_save_scenario_as_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_close")), "activate", G_CALLBACK(menu_close_scenario_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_quit")), "activate", G_CALLBACK(menu_quit_application_cb), this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_restore_default_scenarios")), "activate", + G_CALLBACK(menu_restore_default_scenarios_cb), this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_about")), "activate", G_CALLBACK(menu_about_openvibe_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_scenario_about")), "activate", G_CALLBACK(menu_about_scenario_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_documentation")), "activate", G_CALLBACK(menu_browse_documentation_cb), this); +#ifdef MENSIA_DISTRIBUTION + if (FS::Files::fileExists(Directories::getBinDir() + "/mensia-flexnet-activation.exe")) + { + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_register_license")), "activate", G_CALLBACK(menu_register_license_cb), this); + } + else { gtk_widget_hide(GTK_WIDGET((gtk_builder_get_object(m_Builder, "openvibe-menu_register_license")))); } +#else + gtk_widget_hide(GTK_WIDGET((gtk_builder_get_object(m_Builder, "openvibe-menu_register_license")))); +#endif + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_issue_report")), "activate", G_CALLBACK(menu_report_issue_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-menu_display_changelog")), "activate", G_CALLBACK(menu_display_changelog_cb), this); + + // g_signal_connect(G_OBJECT(gtk_builder_get_object(m_builderInterface, "openvibe-menu_test")), "activate", G_CALLBACK(menu_test_cb), this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-button_new")), "clicked", G_CALLBACK(button_new_scenario_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-button_open")), "clicked", G_CALLBACK(button_open_scenario_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-button_save")), "clicked", G_CALLBACK(button_save_scenario_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-button_save_as")), "clicked", G_CALLBACK(button_save_scenario_as_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-button_close")), "clicked", G_CALLBACK(button_close_scenario_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-button_undo")), "clicked", G_CALLBACK(button_undo_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-button_redo")), "clicked", G_CALLBACK(button_redo_cb), this); + + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-button_log_level")), "clicked", G_CALLBACK(log_level_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-button_windowmanager")), "toggled", G_CALLBACK(button_toggle_window_manager_cb), + this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-button_comment")), "clicked", G_CALLBACK(button_comment_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-button_aboutscenario")), "clicked", G_CALLBACK(button_about_scenario_cb), this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-button_stop")), "clicked", G_CALLBACK(stop_scenario_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-button_play_pause")), "clicked", G_CALLBACK(play_pause_scenario_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-button_next")), "clicked", G_CALLBACK(next_scenario_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-button_forward")), "clicked", G_CALLBACK(forward_scenario_cb), this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-box_algorithm_title_button_expand")), "clicked", + G_CALLBACK(box_algorithm_title_button_expand_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-box_algorithm_title_button_collapse")), "clicked", + G_CALLBACK(box_algorithm_title_button_collapse_cb), this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-algorithm_title_button_expand")), "clicked", + G_CALLBACK(algorithm_title_button_expand_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-algorithm_title_button_collapse")), "clicked", + G_CALLBACK(algorithm_title_button_collapse_cb), this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-box_algorithm_searchbox")), "icon-press", G_CALLBACK(searchbox_select_all_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-box_algorithm_searchbox")), "changed", G_CALLBACK(refresh_search_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-box_algorithm_searchbox")), "focus-in-event", G_CALLBACK(searchbox_focus_in_cb), + this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-box_algorithm_searchbox")), "focus-out-event", G_CALLBACK(searchbox_focus_out_cb), + this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-scenario_configuration_button_configure")), "clicked", + G_CALLBACK(button_configure_current_scenario_settings_cb), this); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-button_zoomin")), "clicked", G_CALLBACK(zoom_in_scenario_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-button_zoomout")), "clicked", G_CALLBACK(zoom_out_scenario_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-zoom_spinner")), "value-changed", G_CALLBACK(spinner_zoom_changed_cb), this); +#ifdef MENSIA_DISTRIBUTION + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "neurort-toggle_engine_configuration")), "clicked", + G_CALLBACK(button_toggle_neurort_engine_configuration_cb), this); + m_ArchwayHandlerGUI->m_ButtonOpenEngineConfigurationDialog = GTK_WIDGET(gtk_builder_get_object(m_Builder, "neurort-toggle_engine_configuration")); +#endif + // Prepares fast forward feature + const double fastForwardFactor = m_kernelCtx.getConfigurationManager().expandAsFloat("${Designer_FastForwardFactor}", -1); + m_FastForwardFactor = GTK_SPIN_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-spinbutton_fast-forward-factor")); + if (fastForwardFactor == -1) { gtk_spin_button_set_value(m_FastForwardFactor, 100); } + else { gtk_spin_button_set_value(m_FastForwardFactor, fastForwardFactor); } + +#if defined(TARGET_OS_Windows) +#if GTK_CHECK_VERSION(2, 24, 0) + // expect it to work */ +#else + gtk_about_dialog_set_url_hook((GtkAboutDialogActivateLinkFunc)menu_about_link_clicked_cb, this, nullptr); +#endif +#endif + + idle_add_cb(idle_application_loop, this); + timeout_add_cb(1000, timeout_application_loop, this); +#ifdef NDEBUG + timeout_add_cb(100, receiveSecondInstanceMessage, this); +#endif + + // Prepares main notebooks + m_scenarioNotebook = GTK_NOTEBOOK(gtk_builder_get_object(m_Builder, "openvibe-scenario_notebook")); + // optional behavior: vertically stacked scenarios (filename trimming mandatory in that case). + if (m_kernelCtx.getConfigurationManager().expandAsBoolean("${Designer_ScenarioTabsVerticalStack}", false)) + { + gtk_notebook_set_tab_pos(m_scenarioNotebook, GTK_POS_LEFT); + } + + g_signal_connect(G_OBJECT(m_scenarioNotebook), "switch-page", G_CALLBACK(change_current_scenario_cb), this); + g_signal_connect(G_OBJECT(m_scenarioNotebook), "page-reordered", G_CALLBACK(reorder_scenario_cb), this); + m_resourceNotebook = GTK_NOTEBOOK(gtk_builder_get_object(m_Builder, "openvibe-resource_notebook")); + + // Creates an empty scnenario + gtk_notebook_remove_page(m_scenarioNotebook, 0); + + // Initialize menu open recent + m_menuOpenRecent = GTK_CONTAINER(gtk_builder_get_object(m_Builder, "openvibe-menu_recent_content")); + + //newScenarioCB(); + { + // Prepares box algorithm view + m_BoxAlgorithmTreeView = GTK_TREE_VIEW(gtk_builder_get_object(m_Builder, "openvibe-box_algorithm_tree")); + GtkTreeViewColumn* treeViewColumnName = gtk_tree_view_column_new(); + GtkTreeViewColumn* treeViewColumnDesc = gtk_tree_view_column_new(); + GtkCellRenderer* cellRendererIcon = gtk_cell_renderer_pixbuf_new(); + GtkCellRenderer* cellRendererName = gtk_cell_renderer_text_new(); + GtkCellRenderer* cellRendererDesc = gtk_cell_renderer_text_new(); + gtk_tree_view_column_set_title(treeViewColumnName, "Name"); + gtk_tree_view_column_set_title(treeViewColumnDesc, "Description"); + gtk_tree_view_column_pack_start(treeViewColumnName, cellRendererIcon, FALSE); + gtk_tree_view_column_pack_start(treeViewColumnName, cellRendererName, TRUE); + gtk_tree_view_column_pack_start(treeViewColumnDesc, cellRendererDesc, TRUE); + gtk_tree_view_column_set_attributes(treeViewColumnName, cellRendererIcon, "stock-id", Resource_StringStockIcon, nullptr); + gtk_tree_view_column_set_attributes(treeViewColumnName, cellRendererName, "text", Resource_StringName, "foreground", Resource_StringColor, "font", + Resource_StringFont, "background", Resource_BackGroundColor, nullptr); + gtk_tree_view_column_set_attributes(treeViewColumnDesc, cellRendererDesc, "text", Resource_StringShortDescription, "foreground", Resource_StringColor, + "background", Resource_BackGroundColor, nullptr); + gtk_tree_view_column_set_sizing(treeViewColumnName, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_sizing(treeViewColumnDesc, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_expand(treeViewColumnName, FALSE); + gtk_tree_view_column_set_expand(treeViewColumnDesc, FALSE); + gtk_tree_view_column_set_resizable(treeViewColumnName, TRUE); + gtk_tree_view_column_set_resizable(treeViewColumnDesc, TRUE); + gtk_tree_view_column_set_min_width(treeViewColumnName, 64); + gtk_tree_view_column_set_min_width(treeViewColumnDesc, 64); + gtk_tree_view_column_set_fixed_width(treeViewColumnName, 256); + gtk_tree_view_column_set_fixed_width(treeViewColumnDesc, 512); + gtk_tree_view_append_column(m_BoxAlgorithmTreeView, treeViewColumnName); + gtk_tree_view_append_column(m_BoxAlgorithmTreeView, treeViewColumnDesc); + + // Prepares box algorithm model + m_BoxAlgorithmTreeModel = gtk_tree_store_new(9, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_STRING); + + // Tree Storage for the searches + gtk_tree_view_set_model(m_BoxAlgorithmTreeView, GTK_TREE_MODEL(m_BoxAlgorithmTreeModel)); + } + + { + // Prepares algorithm view + m_algorithmTreeView = GTK_TREE_VIEW(gtk_builder_get_object(m_Builder, "openvibe-algorithm_tree")); + GtkTreeViewColumn* treeViewColumnName = gtk_tree_view_column_new(); + GtkTreeViewColumn* treeViewColumnDesc = gtk_tree_view_column_new(); + GtkCellRenderer* cellRendererIcon = gtk_cell_renderer_pixbuf_new(); + GtkCellRenderer* cellRendererName = gtk_cell_renderer_text_new(); + GtkCellRenderer* cellRendererDesc = gtk_cell_renderer_text_new(); + gtk_tree_view_column_set_title(treeViewColumnName, "Name"); + gtk_tree_view_column_set_title(treeViewColumnDesc, "Description"); + gtk_tree_view_column_pack_start(treeViewColumnName, cellRendererIcon, FALSE); + gtk_tree_view_column_pack_start(treeViewColumnName, cellRendererName, TRUE); + gtk_tree_view_column_pack_start(treeViewColumnDesc, cellRendererDesc, TRUE); + gtk_tree_view_column_set_attributes(treeViewColumnName, cellRendererIcon, "stock-id", Resource_StringStockIcon, nullptr); + gtk_tree_view_column_set_attributes(treeViewColumnName, cellRendererName, "text", Resource_StringName, "foreground", Resource_StringColor, nullptr); + gtk_tree_view_column_set_attributes(treeViewColumnDesc, cellRendererDesc, "text", Resource_StringShortDescription, "foreground", Resource_StringColor, + nullptr); + + gtk_tree_view_column_set_sizing(treeViewColumnName, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_sizing(treeViewColumnDesc, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_expand(treeViewColumnName, FALSE); + gtk_tree_view_column_set_expand(treeViewColumnDesc, FALSE); + gtk_tree_view_column_set_resizable(treeViewColumnName, TRUE); + gtk_tree_view_column_set_resizable(treeViewColumnDesc, TRUE); + gtk_tree_view_column_set_min_width(treeViewColumnName, 64); + gtk_tree_view_column_set_min_width(treeViewColumnDesc, 64); + gtk_tree_view_column_set_fixed_width(treeViewColumnName, 256); + gtk_tree_view_column_set_fixed_width(treeViewColumnDesc, 512); + gtk_tree_view_append_column(m_algorithmTreeView, treeViewColumnName); + gtk_tree_view_append_column(m_algorithmTreeView, treeViewColumnDesc); + + // Prepares algorithm model + m_AlgorithmTreeModel = gtk_tree_store_new(9, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN, G_TYPE_STRING); + gtk_tree_view_set_model(m_algorithmTreeView, GTK_TREE_MODEL(m_AlgorithmTreeModel)); + } + + m_configureSettingsAddSettingButton = GTK_WIDGET(gtk_builder_get_object(m_Builder, "dialog_scenario_configuration-button_add_setting")); + g_signal_connect(G_OBJECT(m_configureSettingsAddSettingButton), "clicked", G_CALLBACK(add_scenario_setting_cb), this); + // Set up the UI for adding Inputs and Outputs to the scenario + + GtkWidget* scenarioLinksVBox = GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-scenario_links_vbox")); + + m_Inputs = gtk_table_new(1, 3, FALSE); + m_Outputs = gtk_table_new(1, 3, FALSE); + + GtkWidget* scrolledWindowInputs = gtk_scrolled_window_new(nullptr, nullptr); + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolledWindowInputs), GTK_WIDGET(m_Inputs)); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledWindowInputs), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + + GtkWidget* scrolledWindowOutputs = gtk_scrolled_window_new(nullptr, nullptr); + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolledWindowOutputs), GTK_WIDGET(m_Outputs)); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledWindowOutputs), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + + GtkWidget* addInputButton = gtk_button_new_with_label("Add Input"); + GtkWidget* addOutputButton = gtk_button_new_with_label("Add Output"); + + g_signal_connect(G_OBJECT(addInputButton), "clicked", G_CALLBACK(add_scenario_input_cb), this); + g_signal_connect(G_OBJECT(addOutputButton), "clicked", G_CALLBACK(add_scenario_output_cb), this); + + gtk_box_pack_start(GTK_BOX(scenarioLinksVBox), gtk_label_new("Inputs"), FALSE, FALSE, 4); + gtk_box_pack_start(GTK_BOX(scenarioLinksVBox), scrolledWindowInputs, TRUE, TRUE, 4); + gtk_box_pack_start(GTK_BOX(scenarioLinksVBox), addInputButton, FALSE, FALSE, 4); + gtk_box_pack_start(GTK_BOX(scenarioLinksVBox), gtk_label_new("Outputs"), FALSE, FALSE, 4); + gtk_box_pack_start(GTK_BOX(scenarioLinksVBox), scrolledWindowOutputs, TRUE, TRUE, 4); + gtk_box_pack_start(GTK_BOX(scenarioLinksVBox), addOutputButton, FALSE, FALSE, 4); + + gtk_widget_show_all(scenarioLinksVBox); + + // Prepares drag& drop for box creation + gtk_drag_source_set(GTK_WIDGET(m_BoxAlgorithmTreeView), GDK_BUTTON1_MASK, TARGET_ENTRY, sizeof(TARGET_ENTRY) / sizeof(GtkTargetEntry), GDK_ACTION_COPY); + g_signal_connect(G_OBJECT(m_BoxAlgorithmTreeView), "drag_data_get", G_CALLBACK(drag_data_get_cb), this); + + // Shows main window + gtk_builder_connect_signals(m_Builder, nullptr); + m_isMaximized = false; + + const int height = int(m_kernelCtx.getConfigurationManager().expandAsInteger("${Designer_EditorSizeHeight}")); + const int width = int(m_kernelCtx.getConfigurationManager().expandAsInteger("${Designer_EditorSizeWidth}")); + if (height > 0 && width > 0) { gtk_window_resize(GTK_WINDOW(m_MainWindow), width, height); } + + if (m_kernelCtx.getConfigurationManager().expandAsBoolean("${Designer_FullscreenEditor}")) { gtk_window_maximize(GTK_WINDOW(m_MainWindow)); } + + const int panedPosition = int(m_kernelCtx.getConfigurationManager().expandAsInteger("${Designer_EditorPanedPosition}")); + if (panedPosition > 0) { gtk_paned_set_position(GTK_PANED(gtk_builder_get_object(m_Builder, "openvibe-horizontal_container")), panedPosition); } + + GtkNotebook* sidebar = GTK_NOTEBOOK(gtk_builder_get_object(m_Builder, "openvibe-resource_notebook")); + + + // List the notebook pages, cycle through them in reverse so we can remove pages without modifying indexes + for (int notebookIdx = gtk_notebook_get_n_pages(sidebar) - 1; notebookIdx >= 0; notebookIdx--) + { + GtkWidget* tabWidget = gtk_notebook_get_nth_page(sidebar, notebookIdx); + GtkWidget* tabLabel = gtk_notebook_get_tab_label(sidebar, tabWidget); + if (!m_kernelCtx.getConfigurationManager().expandAsBoolean("${Designer_ShowAlgorithms}")) + { + if (tabLabel == GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-algorithm_title_container"))) + { + gtk_notebook_remove_page(sidebar, notebookIdx); + } + } + } + + // gtk_window_set_icon_name(GTK_WINDOW(m_MainWindow), "ov-logo"); + gtk_window_set_icon_from_file(GTK_WINDOW(m_MainWindow), Directories::getDataDir() + "/applications/designer/designer.ico", nullptr); + gtk_window_set_default_icon_from_file(Directories::getDataDir() + "/applications/designer/designer.ico", nullptr); + + if (!(m_CmdLineFlags & CommandLineFlag_NoManageSession)) + { + CIdentifier id; + char name[1024]; + unsigned i = 0; + do + { + sprintf(name, "Designer_LastScenarioFilename_%03u", ++i); + if ((id = m_kernelCtx.getConfigurationManager().lookUpConfigurationTokenIdentifier(name)) != CIdentifier::undefined()) + { + CString filename; + filename = m_kernelCtx.getConfigurationManager().getConfigurationTokenValue(id); + filename = m_kernelCtx.getConfigurationManager().expand(filename); + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Restoring scenario [" << filename << "]\n"; + if (!this->openScenario(filename.toASCIIString())) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "Failed to restore scenario [" << filename << "]\n"; + } + } + } while (id != CIdentifier::undefined()); + } + + CIdentifier tokenID; + char str[1024]; + unsigned i = 0; + do + { + sprintf(str, "Designer_RecentScenario_%03u", ++i); + if ((tokenID = m_kernelCtx.getConfigurationManager().lookUpConfigurationTokenIdentifier(str)) != CIdentifier::undefined()) + { + CString fileName; + fileName = m_kernelCtx.getConfigurationManager().getConfigurationTokenValue(tokenID); + fileName = m_kernelCtx.getConfigurationManager().expand(fileName); + + GtkWidget* newRecentItem = gtk_image_menu_item_new_with_label(fileName.toASCIIString()); + g_signal_connect(G_OBJECT(newRecentItem), "activate", G_CALLBACK(menu_open_recent_scenario_cb), this); + gtk_menu_shell_append(GTK_MENU_SHELL(m_menuOpenRecent), newRecentItem); + gtk_widget_show(newRecentItem); + m_recentScenarios.push_back(newRecentItem); + } + } while (tokenID != CIdentifier::undefined()); + + refresh_search_no_data_cb(nullptr, this); + // Add the designer log listener + const CString logLevel = m_kernelCtx.getConfigurationManager().expand("${Kernel_ConsoleLogLevel}"); + std::string value(logLevel.toASCIIString()); + transform(value.begin(), value.end(), value.begin(), ::to_lower); + + Kernel::ELogLevel level = Kernel::LogLevel_Debug; + if (value == "debug") { level = Kernel::LogLevel_Debug; } + if (value == "benchmarking / profiling") { level = Kernel::LogLevel_Benchmark; } + if (value == "trace") { level = Kernel::LogLevel_Trace; } + if (value == "information") { level = Kernel::LogLevel_Info; } + if (value == "warning") { level = Kernel::LogLevel_Warning; } + if (value == "important warning") { level = Kernel::LogLevel_ImportantWarning; } + if (value == "error") { level = Kernel::LogLevel_Error; } + if (value == "fatal error") { level = Kernel::LogLevel_Fatal; } + + switch (level) + { + case Kernel::LogLevel_Debug: gtk_toggle_tool_button_set_active( + GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_debug")), true); + case Kernel::LogLevel_Benchmark: gtk_toggle_tool_button_set_active( + GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_bench")), true); + case Kernel::LogLevel_Trace: gtk_toggle_tool_button_set_active( + GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_trace")), true); + case Kernel::LogLevel_Info: gtk_toggle_tool_button_set_active( + GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_info")), true); + case Kernel::LogLevel_Warning: gtk_toggle_tool_button_set_active( + GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_warning")), true); + case Kernel::LogLevel_ImportantWarning: gtk_toggle_tool_button_set_active( + GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_impwarning")), true); + case Kernel::LogLevel_Error: gtk_toggle_tool_button_set_active( + GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_error")), true); + case Kernel::LogLevel_Fatal: gtk_toggle_tool_button_set_active( + GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_fatal")), true); + default: break; + } + + gtk_widget_set_sensitive( + GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_debug")), m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Debug)); + gtk_widget_set_sensitive( + GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_bench")), m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Benchmark)); + gtk_widget_set_sensitive( + GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_trace")), m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Trace)); + gtk_widget_set_sensitive( + GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_info")), m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Info)); + gtk_widget_set_sensitive( + GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_warning")), m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Warning)); + gtk_widget_set_sensitive( + GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_impwarning")), + m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_ImportantWarning)); + gtk_widget_set_sensitive( + GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_error")), m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Error)); + gtk_widget_set_sensitive( + GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_fatal")), m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Fatal)); + + if (!(m_CmdLineFlags & CommandLineFlag_NoGui)) + { + m_logListener = new CLogListenerDesigner(m_kernelCtx, m_Builder); + m_logListener->m_CenterOnBoxFun = [this](CIdentifier& id) { this->getCurrentInterfacedScenario()->centerOnBox(id); }; + m_kernelCtx.getLogManager().addListener(m_logListener); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_clear")), "clicked", G_CALLBACK(clear_messages_cb), m_logListener); + gtk_widget_show(m_MainWindow); + } + // If last version of Designer used is anterior or null, then consider it as a new version + const CString lastUsedVersion = m_kernelCtx.getConfigurationManager().expand("${Designer_LastVersionUsed}"); + int lastUsedVersionMajor = 0; + int lastUsedVersionMinor = 0; + int lastUsedVersionPatch = 0; + const int currentVersionMajor = int(m_kernelCtx.getConfigurationManager().expandAsInteger("${ProjectVersion_Major}")); + const int currentVersionMinor = int(m_kernelCtx.getConfigurationManager().expandAsInteger("${ProjectVersion_Minor}")); + const int currentVersionPatch = int(m_kernelCtx.getConfigurationManager().expandAsInteger("${ProjectVersion_Patch}")); + + sscanf(lastUsedVersion.toASCIIString(), "%d.%d.%d", &lastUsedVersionMajor, &lastUsedVersionMinor, &lastUsedVersionPatch); + if (lastUsedVersionMajor < currentVersionMajor + || (lastUsedVersionMajor == currentVersionMajor && lastUsedVersionMinor < currentVersionMinor) + || (lastUsedVersionMinor == currentVersionMinor && lastUsedVersionPatch < currentVersionPatch) + || (lastUsedVersionMajor == 0 && lastUsedVersionMinor == 0 && lastUsedVersionPatch == 0)) { m_IsNewVersion = true; } + + std::string defaultURLBaseString = std::string(m_kernelCtx.getConfigurationManager().expand("${Designer_HelpBrowserURLBase}")); +#ifdef MENSIA_DISTRIBUTION + if (m_ArchwayHandler->initialize() == EEngineInitialisationStatus::NotAvailable) + { + gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(m_Builder, "neurort-toggle_engine_configuration"))); + } +#else + gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(m_Builder, "neurort-toggle_engine_configuration"))); +#endif +} + +bool CApplication::displayChangelogWhenAvailable() +{ + // If last version used is ulterior as current version, and at least one box was added/updated, show the list + if (!m_NewBoxes.empty() || !m_UpdatedBoxes.empty()) + { + GtkBuilder* builder = gtk_builder_new(); + gtk_builder_add_from_file(builder, OVD_GUI_File, nullptr); + + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(builder, "aboutdialog-newversion")); + gtk_window_set_title(GTK_WINDOW(dialog), "Changelog"); + + + std::string version = m_kernelCtx.getConfigurationManager().expand("${Application_Version}").toASCIIString(); + version = (version != "${Application_Version}") ? version + : m_kernelCtx.getConfigurationManager().expand("${ProjectVersion_Major}.${ProjectVersion_Minor}.${ProjectVersion_Patch}"). + toASCIIString(); + + gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog), version.c_str()); + + std::string labelNewBoxesList = "Changes in version " + version + " of the software:"; + if (!m_NewBoxes.empty()) + { + labelNewBoxesList += "\nThe following boxes were added:\n"; + for (auto pNewBoxDesc : m_NewBoxes) + { + labelNewBoxesList += " " + pNewBoxDesc->getName() + ": " + pNewBoxDesc->getShortDescription() + "\n"; + } + } + if (!m_UpdatedBoxes.empty()) + { + labelNewBoxesList += "\nThe following boxes were updated:\n"; + for (auto pUpdatedBoxDesc : m_UpdatedBoxes) + { + labelNewBoxesList += " " + pUpdatedBoxDesc->getName() + ": " + pUpdatedBoxDesc->getShortDescription() + "\n"; + } + } +#if defined TARGET_OS_Windows // This function makes Windows calls only, hide button on other OSs + g_signal_connect(G_OBJECT(gtk_builder_get_object(builder, "button-display_changelog")), "clicked", + G_CALLBACK(about_newversion_button_display_changelog_cb), this); +#else + gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(builder, "button-display_changelog"))); +#endif + if (!FS::Files::fileExists((OVD_README_File).toASCIIString())) + { + gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(builder, "button-display_changelog"))); + } + GtkLabel* label = GTK_LABEL(gtk_builder_get_object(builder, "label-newversion")); + gtk_label_set_markup(label, labelNewBoxesList.c_str()); + gtk_dialog_run(GTK_DIALOG(dialog)); + if (m_IsNewVersion) + { + gtk_entry_set_text(GTK_ENTRY(gtk_builder_get_object(m_Builder, "openvibe-box_algorithm_searchbox")), "(New)"); + gtk_window_set_focus(GTK_WINDOW(m_MainWindow), GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-box_algorithm_searchbox"))); + } + + gtk_widget_destroy(dialog); + g_object_unref(builder); + } + else { return false; } + return true; +} + +bool CApplication::openScenario(const char* filename) +{ + // Prevent opening twice the same scenario + for (size_t i = 0; i < m_Scenarios.size(); ++i) + { + const auto scenario = m_Scenarios[i]; + if (scenario->m_Filename == std::string(filename)) + { + gtk_notebook_set_current_page(m_scenarioNotebook, i); + return true; + } + } + + CIdentifier scenarioID; + if (m_ScenarioMgr->importScenarioFromFile(scenarioID, OVD_ScenarioImportContext_OpenScenario, filename)) + { + // Closes first unnamed scenario + if (m_Scenarios.size() == 1) + { + if (!m_Scenarios[0]->m_HasBeenModified && !m_Scenarios[0]->m_HasFileName) + { + const CIdentifier tmp = m_Scenarios[0]->m_ScenarioID; + delete m_Scenarios[0]; + m_ScenarioMgr->releaseScenario(tmp); + m_Scenarios.clear(); + } + } + + Kernel::IScenario& scenario = m_ScenarioMgr->getScenario(scenarioID); + + // Creates interfaced scenario + CInterfacedScenario* interfacedScenario = new CInterfacedScenario(m_kernelCtx, *this, scenario, scenarioID, *m_scenarioNotebook, OVD_GUI_File, + OVD_GUI_Settings_File); + + // Deserialize the visualization tree from the scenario metadata, if it exists + + // Find the VisualizationTree metadata + Kernel::IMetadata* vizTreeMetadata = nullptr; + CIdentifier metadataID = CIdentifier::undefined(); + while ((metadataID = scenario.getNextMetadataIdentifier(metadataID)) != CIdentifier::undefined()) + { + vizTreeMetadata = scenario.getMetadataDetails(metadataID); + if (vizTreeMetadata && vizTreeMetadata->getType() == OVVIZ_MetadataIdentifier_VisualizationTree) { break; } + } + VisualizationToolkit::IVisualizationTree* vizTree = interfacedScenario->m_Tree; + if (vizTreeMetadata && vizTree) { vizTree->deserialize(vizTreeMetadata->getData()); } + + CIdentifier id; + + // Ensure visualization widgets contained in the scenario (if any) appear in the window manager + // even when the VisualizationTree section of a scenario file is missing, erroneous or deprecated + + // no visualization widget was added to visualization tree : ensure there aren't any in scenario + CIdentifier boxID; + while ((boxID = scenario.getNextBoxIdentifier(boxID)) != CIdentifier::undefined()) + { + if (!vizTree->getVisualizationWidgetFromBoxIdentifier(boxID)) + { + const Kernel::IBox* box = scenario.getBoxDetails(boxID); + const Plugins::IPluginObjectDesc* boxAlgorithmDesc = m_kernelCtx.getPluginManager().getPluginObjectDescCreating( + box->getAlgorithmClassIdentifier()); + if (boxAlgorithmDesc && boxAlgorithmDesc->hasFunctionality(Plugins::EPluginFunctionality::Visualization)) + { + //a visualization widget was found in scenario : manually add it to visualization tree + vizTree->addVisualizationWidget(id, box->getName(), VisualizationToolkit::EVisualizationWidget::Box, + CIdentifier::undefined(), 0, box->getIdentifier(), 0, CIdentifier::undefined()); + } + } + } + + if (interfacedScenario->m_DesignerVisualization != nullptr) + { + interfacedScenario->m_DesignerVisualization->setDeleteEventCB(&delete_designer_visualisation_cb, this); + interfacedScenario->m_DesignerVisualization->load(); + } + //interfacedScenario->snapshotCB(); --> a snapshot is already created in CInterfacedScenario builder ! + interfacedScenario->m_Filename = filename; + interfacedScenario->m_HasFileName = true; + interfacedScenario->m_HasBeenModified = false; + interfacedScenario->snapshotCB(false); + + m_Scenarios.push_back(interfacedScenario); + + interfacedScenario->redrawScenarioSettings(); + + gtk_notebook_set_current_page(m_scenarioNotebook, gtk_notebook_get_n_pages(m_scenarioNotebook) - 1); + //this->changeCurrentScenario(gtk_notebook_get_n_pages(m_scenarioNotebook)-1); + + interfacedScenario->updateScenarioLabel(); + + this->saveOpenedScenarios(); + return true; + } + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Importing scenario from file [" << filename << "] failed... " + << " Current file either is corrupted or is not compatible with the selected scenario importer (ie not an OpenViBE scenario file)\n"; + + if (!(m_CmdLineFlags & CommandLineFlag_NoGui)) + { + std::stringstream ss; + ss << "The requested file: " << filename << "\n"; + ss << "may either not be an OpenViBE scenario file, \n"; + ss << "a " + std::string(BRAND_NAME) + " scenario file, \n"; + ss << "be corrupted or not compatible with \n"; + ss << "the selected scenario importer..."; + GtkWidget* dialog = gtk_message_dialog_new(nullptr, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Scenario importation process failed !"); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), "%s", ss.str().c_str()); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + } + return false; +} + +CString CApplication::getWorkingDirectory() +{ + CString workingDirectory = m_kernelCtx.getConfigurationManager().expand("${Designer_DefaultWorkingDirectory}/scenarios"); + + CInterfacedScenario* scenario = this->getCurrentInterfacedScenario(); + if (scenario) + { + if (scenario->m_HasFileName) + { + std::string directory = std::string(g_path_get_dirname(scenario->m_Filename.c_str())); +#if defined TARGET_OS_Windows + std::replace(directory.begin(), directory.end(), '\\', '/'); +#endif + workingDirectory = directory.c_str(); + } + } + + if (!g_path_is_absolute(workingDirectory.toASCIIString())) + { + std::string directory = g_get_current_dir(); +#if defined TARGET_OS_Windows + std::replace(directory.begin(), directory.end(), '\\', '/'); +#endif + workingDirectory = directory.c_str() + CString("/") + workingDirectory; + } + + return workingDirectory; +} + +bool CApplication::hasRunningScenario() +{ + return std::any_of(m_Scenarios.begin(), m_Scenarios.end(), [](CInterfacedScenario* elem) { return elem->m_Player != nullptr; }); +} + +bool CApplication::hasUnsavedScenario() +{ + return std::any_of(m_Scenarios.begin(), m_Scenarios.end(), [](CInterfacedScenario* elem) { return elem->m_HasBeenModified; }); +} + +CInterfacedScenario* CApplication::getCurrentInterfacedScenario() +{ + if (m_currentScenarioIdx < m_Scenarios.size()) { return m_Scenarios[m_currentScenarioIdx]; } + return nullptr; +} + +void CApplication::saveOpenedScenarios() +{ + // Saves opened scenarios + if (!(m_CmdLineFlags & CommandLineFlag_NoManageSession)) + { + const CString appConfigFile = m_kernelCtx.getConfigurationManager().expand("${Designer_CustomConfigurationFile}"); + + FILE* file = FS::Files::open(appConfigFile.toASCIIString(), "wt"); + if (file) + { + size_t i = 1; + fprintf(file, "# This file is generated\n"); + fprintf(file, "# Do not modify\n"); + fprintf(file, "\n"); + + int width, height; + gtk_window_get_size(GTK_WINDOW(m_MainWindow), &width, &height); + fprintf(file, "Designer_EditorSizeWidth = %i\n", width); + fprintf(file, "Designer_EditorSizeHeight = %i\n", height); + fprintf(file, "Designer_EditorPanedPosition = %i\n", + gtk_paned_get_position(GTK_PANED(gtk_builder_get_object(m_Builder, "openvibe-horizontal_container")))); + fprintf(file, "Designer_FullscreenEditor = %s\n", m_isMaximized ? "True" : "False"); + + fprintf(file, "# Last files opened in %s\n", std::string(DESIGNER_NAME).c_str()); + + for (CInterfacedScenario* scenario : m_Scenarios) + { + if (!scenario->m_Filename.empty()) + { + fprintf(file, "Designer_LastScenarioFilename_%03u = %s\n", i, scenario->m_Filename.c_str()); + i++; + } + } + fprintf(file, "\n"); + + const CString projectVersion = m_kernelCtx.getConfigurationManager().expand( + "${ProjectVersion_Major}.${ProjectVersion_Minor}.${ProjectVersion_Patch}"); + const CString componentVersions = m_kernelCtx.getConfigurationManager().lookUpConfigurationTokenValue("ProjectVersion_Components"); + fprintf(file, "# Last version of " DESIGNER_NAME " used:\n"); + fprintf(file, "Designer_LastVersionUsed = %s\n", projectVersion.toASCIIString()); + fprintf(file, "Designer_LastComponentVersionsUsed = %s\n", componentVersions.toASCIIString()); + fprintf(file, "\n"); + + fprintf(file, "# Recently opened scenario\n"); + size_t scenarioID = 1; + for (const GtkWidget* recentScenario : m_recentScenarios) + { + const gchar* recentScenarioPath = gtk_menu_item_get_label(GTK_MENU_ITEM(recentScenario)); + fprintf(file, "Designer_RecentScenario_%03u = %s\n", scenarioID, recentScenarioPath); + ++scenarioID; + } + fprintf(file, "\n"); + + fclose(file); + } + else { m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Error writing to '" << appConfigFile << "'\n"; } + } +} + +void CApplication::dragDataGetCB(GtkWidget* /*widget*/, GdkDragContext* /*dc*/, GtkSelectionData* selectionData, guint /*info*/, guint /*time*/) const +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "dragDataGetCB\n"; + + GtkTreeView* view = GTK_TREE_VIEW(gtk_builder_get_object(m_Builder, "openvibe-box_algorithm_tree")); + GtkTreeSelection* selection = gtk_tree_view_get_selection(view); + GtkTreeModel* model = nullptr; + GtkTreeIter iter; + if (gtk_tree_selection_get_selected(selection, &model, &iter)) + { + const char* boxAlgorithmID = nullptr; + gtk_tree_model_get(model, &iter, Resource_StringIdentifier, &boxAlgorithmID, -1); + if (boxAlgorithmID) + { + gtk_selection_data_set(selectionData, GDK_SELECTION_TYPE_STRING, 8, reinterpret_cast(boxAlgorithmID), + gint(strlen(boxAlgorithmID) + 1)); + } + } +} + +void CApplication::undoCB() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "undoCB\n"; + + CInterfacedScenario* scenario = this->getCurrentInterfacedScenario(); + if (scenario) { scenario->undoCB(); } +} + +void CApplication::redoCB() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "redoCB\n"; + + CInterfacedScenario* scenario = this->getCurrentInterfacedScenario(); + if (scenario) { scenario->redoCB(); } +} + +void CApplication::copySelectionCB() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "copySelectionCB\n"; + CInterfacedScenario* scenario = this->getCurrentInterfacedScenario(); + if (scenario) { scenario->copySelection(); } +} + +void CApplication::cutSelectionCB() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "cutSelectionCB\n"; + CInterfacedScenario* scenario = this->getCurrentInterfacedScenario(); + if (scenario) { scenario->cutSelection(); } +} + +void CApplication::pasteSelectionCB() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "pasteSelectionCB\n"; + CInterfacedScenario* scenario = this->getCurrentInterfacedScenario(); + if (scenario) { scenario->pasteSelection(); } +} + +void CApplication::deleteSelectionCB() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "deleteSelectionCB\n"; + CInterfacedScenario* scenario = this->getCurrentInterfacedScenario(); + if (scenario) { scenario->deleteSelection(); } +} + +void CApplication::preferencesCB() const +{ + enum { Resource_TokenName, Resource_TokenValue, Resource_TokenExpand }; + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "preferencesCB\n"; + GtkBuilder* builder = gtk_builder_new(); // glade_xml_new(OVD_GUI_File, "configuration_manager", nullptr); + gtk_builder_add_from_file(builder, OVD_GUI_File, nullptr); + gtk_builder_connect_signals(builder, nullptr); + + GtkWidget* configMgr = GTK_WIDGET(gtk_builder_get_object(builder, "configuration_manager")); + GtkTreeView* configMgrTreeView = GTK_TREE_VIEW(gtk_builder_get_object(builder, "configuration_manager-treeview")); + + // Prepares tree view + GtkTreeViewColumn* treeViewColumnTokenName = gtk_tree_view_column_new(); + GtkTreeViewColumn* treeViewColumnTokenValue = gtk_tree_view_column_new(); + GtkTreeViewColumn* treeViewColumnTokenExpand = gtk_tree_view_column_new(); + GtkCellRenderer* cellRendererTokenName = gtk_cell_renderer_text_new(); + GtkCellRenderer* cellRendererTokenValue = gtk_cell_renderer_text_new(); + GtkCellRenderer* cellRendererTokenExpand = gtk_cell_renderer_text_new(); + gtk_tree_view_column_set_title(treeViewColumnTokenName, "Token name"); + gtk_tree_view_column_set_title(treeViewColumnTokenValue, "Token value"); + gtk_tree_view_column_set_title(treeViewColumnTokenExpand, "Expanded token value"); + gtk_tree_view_column_pack_start(treeViewColumnTokenName, cellRendererTokenName, TRUE); + gtk_tree_view_column_pack_start(treeViewColumnTokenValue, cellRendererTokenValue, TRUE); + gtk_tree_view_column_pack_start(treeViewColumnTokenExpand, cellRendererTokenExpand, TRUE); + gtk_tree_view_column_set_attributes(treeViewColumnTokenName, cellRendererTokenName, "text", Resource_TokenName, nullptr); + gtk_tree_view_column_set_attributes(treeViewColumnTokenValue, cellRendererTokenValue, "text", Resource_TokenValue, nullptr); + gtk_tree_view_column_set_attributes(treeViewColumnTokenExpand, cellRendererTokenExpand, "text", Resource_TokenExpand, nullptr); + gtk_tree_view_column_set_sort_column_id(treeViewColumnTokenName, Resource_TokenName); + gtk_tree_view_column_set_sort_column_id(treeViewColumnTokenValue, Resource_TokenValue); + gtk_tree_view_column_set_sort_column_id(treeViewColumnTokenExpand, Resource_TokenExpand); + gtk_tree_view_column_set_sizing(treeViewColumnTokenName, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_sizing(treeViewColumnTokenValue, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_sizing(treeViewColumnTokenExpand, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_expand(treeViewColumnTokenName, TRUE); + gtk_tree_view_column_set_expand(treeViewColumnTokenValue, TRUE); + gtk_tree_view_column_set_expand(treeViewColumnTokenExpand, TRUE); + gtk_tree_view_column_set_resizable(treeViewColumnTokenName, TRUE); + gtk_tree_view_column_set_resizable(treeViewColumnTokenValue, TRUE); + gtk_tree_view_column_set_resizable(treeViewColumnTokenExpand, TRUE); + gtk_tree_view_column_set_min_width(treeViewColumnTokenName, 256); + gtk_tree_view_column_set_min_width(treeViewColumnTokenValue, 256); + gtk_tree_view_column_set_min_width(treeViewColumnTokenExpand, 256); + gtk_tree_view_append_column(configMgrTreeView, treeViewColumnTokenName); + gtk_tree_view_append_column(configMgrTreeView, treeViewColumnTokenValue); + gtk_tree_view_append_column(configMgrTreeView, treeViewColumnTokenExpand); + gtk_tree_view_column_set_sort_indicator(treeViewColumnTokenName, TRUE); + + // Prepares tree model + CIdentifier tokenID; + GtkTreeStore* configMgrTreeModel = gtk_tree_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + while ((tokenID = m_kernelCtx.getConfigurationManager().getNextConfigurationTokenIdentifier(tokenID)) != CIdentifier::undefined()) + { + GtkTreeIter iter; + CString name = m_kernelCtx.getConfigurationManager().getConfigurationTokenName(tokenID); + CString value = m_kernelCtx.getConfigurationManager().getConfigurationTokenValue(tokenID); + CString expand = m_kernelCtx.getConfigurationManager().expand(value); + gtk_tree_store_append(configMgrTreeModel, &iter, nullptr); + gtk_tree_store_set(configMgrTreeModel, &iter, Resource_TokenName, name.toASCIIString(), Resource_TokenValue, value.toASCIIString(), + Resource_TokenExpand, expand.toASCIIString(), -1); + } + gtk_tree_view_set_model(configMgrTreeView, GTK_TREE_MODEL(configMgrTreeModel)); + g_signal_emit_by_name(treeViewColumnTokenName, "clicked"); + + gtk_dialog_run(GTK_DIALOG(configMgr)); + gtk_widget_destroy(configMgr); + + g_object_unref(configMgrTreeModel); + g_object_unref(builder); +} + +void CApplication::testCB() const { m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "testCB\n"; } + +void CApplication::newScenarioCB() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "newScenarioCB\n"; + + CIdentifier scenarioID; + if (m_ScenarioMgr->createScenario(scenarioID)) + { + Kernel::IScenario& scenario = m_ScenarioMgr->getScenario(scenarioID); + CInterfacedScenario* interfacedScenario = new CInterfacedScenario(m_kernelCtx, *this, scenario, scenarioID, *m_scenarioNotebook, OVD_GUI_File, + OVD_GUI_Settings_File); + if (interfacedScenario->m_DesignerVisualization != nullptr) + { + interfacedScenario->m_DesignerVisualization->setDeleteEventCB(&delete_designer_visualisation_cb, this); + interfacedScenario->m_DesignerVisualization->newVisualizationWindow("Default window"); + } + interfacedScenario->updateScenarioLabel(); + m_Scenarios.push_back(interfacedScenario); + gtk_notebook_set_current_page(m_scenarioNotebook, gtk_notebook_get_n_pages(m_scenarioNotebook) - 1); + //this->changeCurrentScenario(gtk_notebook_get_n_pages(m_scenarioNotebook)-1); + } +} + +void CApplication::openScenarioCB() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "openScenarioCB\n"; + + GtkFileFilter* specific = gtk_file_filter_new(); + GtkFileFilter* all = gtk_file_filter_new(); + + std::string allFileFormatsString = "All available formats ("; + CString fileNameExtension = ""; + while ((fileNameExtension = m_kernelCtx.getScenarioManager().getNextScenarioImporter(OVD_ScenarioImportContext_OpenScenario, fileNameExtension)) != + CString("")) + { + std::string currentFileFormatMask = "*" + std::string(fileNameExtension.toASCIIString()); + gtk_file_filter_add_pattern(specific, currentFileFormatMask.c_str()); + allFileFormatsString += "*" + std::string(fileNameExtension) + ", "; + } + + allFileFormatsString.erase(allFileFormatsString.size() - 2); // because the loop adds one ", " too much + allFileFormatsString += ")"; + + gtk_file_filter_set_name(specific, allFileFormatsString.c_str()); + + gtk_file_filter_set_name(all, "All files"); + gtk_file_filter_add_pattern(all, "*"); + + GtkWidget* widgetDialogOpen = gtk_file_chooser_dialog_new("Select scenario to open...", nullptr, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nullptr); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(widgetDialogOpen), specific); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(widgetDialogOpen), all); + gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(widgetDialogOpen), specific); + + // GTK 2 known bug: this won't work if setCurrentFolder is also used on the dialog. + gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(widgetDialogOpen), true); + + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(widgetDialogOpen), this->getWorkingDirectory().toASCIIString()); + + gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(widgetDialogOpen), true); + + if (gtk_dialog_run(GTK_DIALOG(widgetDialogOpen)) == GTK_RESPONSE_ACCEPT) + { + //char* fileName=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widgetDialogOpen)); + GSList* list; + GSList* file = list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(widgetDialogOpen)); + while (file) + { + char* filename = static_cast(file->data); + char* backslash; + while ((backslash = strchr(filename, '\\')) != nullptr) { *backslash = '/'; } + this->openScenario(filename); + g_free(file->data); + file = file->next; + } + g_slist_free(list); + } + gtk_widget_destroy(widgetDialogOpen); + // g_object_unref(fileFilterSpecific); + // g_object_unref(fileFilterAll); +} + +void CApplication::saveScenarioCB(CInterfacedScenario* scenario) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "saveScenarioCB\n"; + + CInterfacedScenario* currScenario = scenario ? scenario : getCurrentInterfacedScenario(); + if (!currScenario) { return; } + + if (currScenario->m_Scenario.containsBoxWithDeprecatedInterfacors()) + { + cannotSaveScenarioBeforeUpdate(); + return; + } + + if (!currScenario->m_HasFileName) { saveScenarioAsCB(scenario); } + else + { + // If the current scenario is a metabox, we will save its prototype hash into an attribute of the scenario + // that way the standalone scheduler can check whether metaboxes included inside need updating. + if (currScenario->m_Scenario.isMetabox()) + { + SBoxProto metaboxProto(m_kernelCtx.getTypeManager()); + + Kernel::IScenario& tmp = currScenario->m_Scenario; + for (size_t i = 0; i < tmp.getInputCount(); ++i) + { + CString name; + CIdentifier typeID; + CIdentifier id; + + tmp.getInputType(i, typeID); + tmp.getInputName(i, name); + tmp.getInterfacorIdentifier(Kernel::Input, i, id); + + metaboxProto.addInput(name, typeID, id, true); + } + + for (size_t i = 0; i < tmp.getOutputCount(); ++i) + { + CString name; + CIdentifier typeID; + CIdentifier id; + + tmp.getOutputType(i, typeID); + tmp.getOutputName(i, name); + tmp.getInterfacorIdentifier(Kernel::Output, i, id); + + metaboxProto.addOutput(name, typeID, id, true); + } + + for (size_t i = 0; i < tmp.getSettingCount(); ++i) + { + CString name; + CIdentifier typeID; + CString value; + + tmp.getSettingName(i, name); + tmp.getSettingType(i, typeID); + tmp.getSettingDefaultValue(i, value); + + metaboxProto.addSetting(name, typeID, value, false, CIdentifier::undefined(), true); + } + + if (tmp.hasAttribute(OV_AttributeId_Scenario_MetaboxHash)) + { + tmp.setAttributeValue(OV_AttributeId_Scenario_MetaboxHash, metaboxProto.hash.toString()); + } + else { tmp.addAttribute(OV_AttributeId_Scenario_MetaboxHash, metaboxProto.hash.toString()); } + + if (!tmp.hasAttribute(OVP_AttributeId_Metabox_ID)) { tmp.setAttributeValue(OVP_AttributeId_Metabox_ID, CIdentifier::random().str().c_str()); } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "This metaboxes Hash : " << metaboxProto.hash << "\n"; + } + + const char* scenarioFileName = currScenario->m_Filename.c_str(); + + // Remove attributes that were added to links and boxes by the designer and which are used only for interal functionality. + // This way the scenarios do not change if, for example somebody opens them on a system with different font metrics. + currScenario->m_Scenario.removeAttribute(OV_AttributeId_ScenarioFilename); + + CIdentifier linkID; + while ((linkID = currScenario->m_Scenario.getNextLinkIdentifier(linkID)) != CIdentifier::undefined()) + { + auto link = currScenario->m_Scenario.getLinkDetails(linkID); + link->removeAttribute(OV_AttributeId_Link_XSrc); + link->removeAttribute(OV_AttributeId_Link_YSrc); + link->removeAttribute(OV_AttributeId_Link_XDst); + link->removeAttribute(OV_AttributeId_Link_YDst); + link->removeAttribute(OV_ClassId_Selected); + } + + CIdentifier boxID; + while ((boxID = currScenario->m_Scenario.getNextBoxIdentifier(boxID)) != CIdentifier::undefined()) + { + auto box = currScenario->m_Scenario.getBoxDetails(boxID); + box->removeAttribute(OV_AttributeId_Box_XSize); + box->removeAttribute(OV_AttributeId_Box_YSize); + box->removeAttribute(OV_ClassId_Selected); + } + + CIdentifier commentID; + while ((commentID = currScenario->m_Scenario.getNextCommentIdentifier(commentID)) != CIdentifier::undefined()) + { + auto comment = currScenario->m_Scenario.getCommentDetails(commentID); + comment->removeAttribute(OV_ClassId_Selected); + } + + // Remove all VisualizationTree type metadata + // We save the last found identifier if there was one, this allows us to not modify it on subsequent saves + CIdentifier metadataID = CIdentifier::undefined(); + CIdentifier lastFoundTreeIdentifier = CIdentifier::undefined(); + while ((metadataID = currScenario->m_Scenario.getNextMetadataIdentifier(metadataID)) != CIdentifier::undefined()) + { + if (currScenario->m_Scenario.getMetadataDetails(metadataID)->getType() == OVVIZ_MetadataIdentifier_VisualizationTree) + { + currScenario->m_Scenario.removeMetadata(metadataID); + lastFoundTreeIdentifier = metadataID; + metadataID = CIdentifier::undefined(); + } + } + + // Insert new metadata + currScenario->m_Scenario.addMetadata(metadataID, lastFoundTreeIdentifier); + currScenario->m_Scenario.getMetadataDetails(metadataID)->setType(OVVIZ_MetadataIdentifier_VisualizationTree); + currScenario->m_Scenario.getMetadataDetails(metadataID)->setData(currScenario->m_Tree->serialize()); + + CIdentifier scenarioExportContext = OVD_ScenarioExportContext_SaveScenario; + if (currScenario->m_Scenario.isMetabox()) { scenarioExportContext = OVD_ScenarioExportContext_SaveMetabox; } + + m_kernelCtx.getErrorManager().releaseErrors(); + if (m_ScenarioMgr->exportScenarioToFile(scenarioExportContext, scenarioFileName, currScenario->m_ScenarioID)) + { + currScenario->snapshotCB(); + currScenario->m_HasFileName = true; + currScenario->m_HasBeenModified = false; + currScenario->updateScenarioLabel(); + this->saveOpenedScenarios(); + } + else + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Exporting scenario failed...\n"; + GtkBuilder* builder = gtk_builder_new(); // glade_xml_new(OVD_GUI_File, "about", nullptr); + gtk_builder_add_from_file(builder, OVD_GUI_File, nullptr); + gtk_builder_connect_signals(builder, nullptr); + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(builder, "dialog_error_popup_saving")); + // Reset the labels + gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(builder, "dialog_error_popup_saving-label1")), ""); + gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(builder, "dialog_error_popup_saving-label2")), ""); + if (m_kernelCtx.getErrorManager().hasError()) + { + gtk_label_set_text( + GTK_LABEL(gtk_builder_get_object(builder, "dialog_error_popup_saving-label1")), m_kernelCtx.getErrorManager().getLastErrorString()); + } + gtk_builder_connect_signals(builder, nullptr); + const gint responseId = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + g_object_unref(builder); + + switch (responseId) + { + case GTK_RESPONSE_OK: + this->saveScenarioCB(scenario); + break; + case GTK_RESPONSE_DELETE_EVENT: + case GTK_RESPONSE_CANCEL: //return; //useless no loop and default make nothing + default: break; + } + } + } +} + +void CApplication::restoreDefaultScenariosCB() const +{ + const CString defaultScenariosDirectory = m_kernelCtx.getConfigurationManager().expand(OVD_SCENARIOS_PATH); + const CString defaultWorkingDirectory = m_kernelCtx.getConfigurationManager().expand(OVD_WORKING_SCENARIOS_PATH); + const CString message = "Default scenarios will be restored in '" + defaultWorkingDirectory + "' folder.\n" + + "All previous scenarios in this folder will be removed.\n" + + "Do you want to continue ?\n"; + + GtkWidget* widgetDialogRestoreScenarios = gtk_message_dialog_new(nullptr, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "%s", + message.toASCIIString()); + + + const CString backupFolder = defaultWorkingDirectory + m_kernelCtx.getConfigurationManager().expand("-$core{date}-$core{time}"); + + if (gtk_dialog_run(GTK_DIALOG(widgetDialogRestoreScenarios)) == GTK_RESPONSE_YES) + { + // to avoid to loose old data, make a backup + FS::Files::removeAll(backupFolder); + if (FS::Files::copyDirectory(defaultWorkingDirectory, backupFolder)) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Old scenario folder backed up into " + << backupFolder << " folder\n"; + // make the copy + FS::Files::removeAll(defaultWorkingDirectory); + if (FS::Files::copyDirectory(defaultScenariosDirectory, defaultWorkingDirectory)) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Default scenarios restored into " << defaultWorkingDirectory << " folder\n"; + } + else { m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Could not copy " << defaultWorkingDirectory << " folder\n"; } + } + else { m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Could not back up " << defaultWorkingDirectory << " folder. Copy has aborted.\n"; } + } + + gtk_widget_destroy(widgetDialogRestoreScenarios); +} + +void CApplication::saveScenarioAsCB(CInterfacedScenario* scenario) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "saveScenarioAsCB\n"; + + CInterfacedScenario* currScenario = scenario ? scenario : getCurrentInterfacedScenario(); + if (!currScenario) { return; } + + if (currScenario->m_Scenario.containsBoxWithDeprecatedInterfacors()) + { + cannotSaveScenarioBeforeUpdate(); + return; + } + + const bool isCurrentScenarioAMetabox = currScenario->m_Scenario.isMetabox(); + + GtkFileFilter* all = gtk_file_filter_new(); // All files + gtk_file_filter_set_name(all, "All files"); + gtk_file_filter_add_pattern(all, "*"); + + GtkFileFilter* allCompatibleFormatsFileFilter = gtk_file_filter_new(); // All compatible files + + std::map fileFilters; + + + std::set compatibleExtensions; + CString ext; + if (!isCurrentScenarioAMetabox) + { + while ((ext = m_kernelCtx.getScenarioManager().getNextScenarioExporter(OVD_ScenarioExportContext_SaveScenario, ext)) != CString("")) + { + compatibleExtensions.emplace(ext); + } + } + while ((ext = m_kernelCtx.getScenarioManager().getNextScenarioExporter(OVD_ScenarioExportContext_SaveMetabox, ext)) != CString("")) + { + compatibleExtensions.emplace(ext); + } + + std::string allCompatibleFormatsFilterName = "All compatible formats ("; + + for (auto& extension : compatibleExtensions) + { + GtkFileFilter* fileFilter = gtk_file_filter_new(); + std::string filterName = m_kernelCtx.getConfigurationManager().expand(std::string("${ScenarioFileNameExtension" + extension + "}").c_str()). + toASCIIString() + std::string(" (*") + extension + ")"; + gtk_file_filter_set_name(fileFilter, filterName.c_str()); + std::string filterWildcard = "*" + extension; + gtk_file_filter_add_pattern(fileFilter, filterWildcard.c_str()); + fileFilters[fileFilter] = extension; + + allCompatibleFormatsFilterName += filterWildcard + ", "; + gtk_file_filter_add_pattern(allCompatibleFormatsFileFilter, filterWildcard.c_str()); + } + + allCompatibleFormatsFilterName.erase(allCompatibleFormatsFilterName.size() - 2); // because the loop adds one ", " too much + allCompatibleFormatsFilterName += ")"; + + gtk_file_filter_set_name(allCompatibleFormatsFileFilter, allCompatibleFormatsFilterName.c_str()); + + // gtk_file_filter_set_name(fileFilterSVG, "SVG image"); + // gtk_file_filter_add_pattern(fileFilterSVG, "*.svg"); + + GtkWidget* widgetDialogSaveAs = gtk_file_chooser_dialog_new("Select scenario to save...", nullptr, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, nullptr); + + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(widgetDialogSaveAs), allCompatibleFormatsFileFilter); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(widgetDialogSaveAs), all); + + for (const auto& fileFilter : fileFilters) { gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(widgetDialogSaveAs), fileFilter.first); } + + gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(widgetDialogSaveAs), allCompatibleFormatsFileFilter); + // gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(l_widgetDialogSaveAs), true); + if (currScenario->m_HasFileName) { gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widgetDialogSaveAs), currScenario->m_Filename.c_str()); } + else + { + // Put metaboxes to the User metabox folder by default + if (isCurrentScenarioAMetabox) + { + gtk_file_chooser_set_current_folder( + GTK_FILE_CHOOSER(widgetDialogSaveAs), m_kernelCtx.getConfigurationManager().expand("${Path_UserData}/metaboxes").toASCIIString()); + } + else { gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(widgetDialogSaveAs), this->getWorkingDirectory().toASCIIString()); } + } + + if (gtk_dialog_run(GTK_DIALOG(widgetDialogSaveAs)) == GTK_RESPONSE_ACCEPT) + { + char* tmp = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widgetDialogSaveAs)); + + // replaces \ with / on windows + char* backslash; + while ((backslash = strchr(tmp, '\\')) != nullptr) { *backslash = '/'; } + + // stores filename in a local variable + char filename[1024]; + int length = sprintf(filename, "%s", tmp); + g_free(tmp); + + GtkFileFilter* filter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(widgetDialogSaveAs)); + if (fileFilters.count(filter) != 0) + { + // User chose a specific filter + const std::string expectedExtension = fileFilters[filter]; + if (_strcmpi(filename + length - 4, (std::string(".") + expectedExtension).c_str()) != 0) + { + // If filename already has an extension, remove it + if (filename[length - 4] == '.') + { + length -= 4; + filename[length] = '\0'; + } + + // When user did not put appropriate extension, append it + strcat(filename, expectedExtension.c_str()); + //filenameLength += int(1 + expectedExtension.length()); + } + } + + // Set a default extension in case the current one is not compatible or there is none + const std::string scenarioFilenameExtension = boost::filesystem::extension(filename); + if (!compatibleExtensions.count(scenarioFilenameExtension)) + { + //if (isCurrentScenarioAMetabox) { strcat(filename, ".mxb"); } + //else { strcat(filename, ".mxs"); } + //filenameLength += 4; + strcat(filename, ".xml"); + } + + // We ensure the file does not exist + bool isSaveActionValid = true; + FILE* file = FS::Files::open(filename, "r"); + if (file) + { + fclose(file); + GtkDialog* confirmationDialog = GTK_DIALOG( + ::gtk_message_dialog_new(nullptr, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "The file already exists")); + gtk_message_dialog_format_secondary_text( + GTK_MESSAGE_DIALOG(confirmationDialog), + "%s\n\nThe file you are trying to save-as already exists, confirming this action will overwrite the existing file. Please confirm you want to overwrite the existing file.", + filename); + isSaveActionValid = (gtk_dialog_run(GTK_DIALOG(confirmationDialog)) == GTK_RESPONSE_OK); + gtk_widget_destroy(GTK_WIDGET(confirmationDialog)); + } + + // Finally save the scenario + if (isSaveActionValid) + { + currScenario->m_Filename = filename; + currScenario->m_HasFileName = true; + currScenario->m_HasBeenModified = false; + currScenario->updateScenarioLabel(); + saveScenarioCB(currScenario); + } + else { m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Canceled 'save-as' action for filename [" << filename << "]\n"; } + } + + gtk_widget_destroy(widgetDialogSaveAs); + // g_object_unref(fileFilterSpecific); + // g_object_unref(fileFilterAll); +} + +void CApplication::addRecentScenario(const std::string& scenarioPath) +{ + bool scenarioFound = false; + // If scenario path is already in menu, remove it from menu shell and re-add it on top of list + for (size_t i = 0; i < m_recentScenarios.size(); ++i) + { + const gchar* fileName = gtk_menu_item_get_label(GTK_MENU_ITEM(m_recentScenarios[i])); + if (strcmp(fileName, scenarioPath.c_str()) == 0) + { + gtk_container_remove(m_menuOpenRecent, GTK_WIDGET(m_recentScenarios[i])); + gtk_menu_shell_prepend(GTK_MENU_SHELL(m_menuOpenRecent), GTK_WIDGET(m_recentScenarios[i])); + scenarioFound = true; + m_recentScenarios.insert(m_recentScenarios.begin(), m_recentScenarios[i]); + m_recentScenarios.erase(m_recentScenarios.begin() + i + 1); + break; + } + } + // If scenario is not in menu, create new widget and add it to menu shell + if (!scenarioFound) + { + GtkWidget* newRecentItem = gtk_image_menu_item_new_with_label(scenarioPath.c_str()); + + g_signal_connect(G_OBJECT(newRecentItem), "activate", G_CALLBACK(menu_open_recent_scenario_cb), this); + gtk_menu_shell_prepend(GTK_MENU_SHELL(m_menuOpenRecent), newRecentItem); + gtk_widget_show(newRecentItem); + m_recentScenarios.insert(m_recentScenarios.begin(), newRecentItem); + } + + if (m_recentScenarios.size() > s_RecentFileNumber) + { + for (auto it = m_recentScenarios.begin() + s_RecentFileNumber; it != m_recentScenarios.end(); ++it) + { + gtk_container_remove(m_menuOpenRecent, GTK_WIDGET(*it)); + gtk_widget_destroy(GTK_WIDGET(*it)); + } + m_recentScenarios.erase(m_recentScenarios.begin() + s_RecentFileNumber, m_recentScenarios.end()); + } +} + +void CApplication::closeScenarioCB(CInterfacedScenario* scenario) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "closeScenarioCB\n"; + + if (!scenario) { return; } + if (scenario->isLocked()) + { + GtkBuilder* builder = gtk_builder_new(); // glade_xml_new(OVD_GUI_File, "about", nullptr); + gtk_builder_add_from_file(builder, OVD_GUI_File, nullptr); + gtk_builder_connect_signals(builder, nullptr); + + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(builder, "dialog_running_scenario")); + gtk_builder_connect_signals(builder, nullptr); + // gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE, true); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + g_object_unref(builder); + return; + } + if (scenario->m_HasBeenModified) + { + GtkBuilder* builder = gtk_builder_new(); // glade_xml_new(OVD_GUI_File, "about", nullptr); + gtk_builder_add_from_file(builder, OVD_GUI_File, nullptr); + gtk_builder_connect_signals(builder, nullptr); + + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(builder, "dialog_unsaved_scenario")); + gtk_builder_connect_signals(builder, nullptr); + // gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE, true); + const gint responseId = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + g_object_unref(builder); + + switch (responseId) + { + case GTK_RESPONSE_OK: + this->saveScenarioCB(scenario); + if (scenario->m_HasBeenModified) { return; } + break; + case GTK_RESPONSE_DELETE_EVENT: + case GTK_RESPONSE_CANCEL: + return; + default: + break; + } + } + // Add scenario to recently opened: + this->addRecentScenario(scenario->m_Filename); + + const auto it = std::find(m_Scenarios.begin(), m_Scenarios.end(), scenario); + if (it != m_Scenarios.end()) + { + // We need to erase the scenario from the list first, because deleting the scenario will launch a "switch-page" + // callback accessing this array with the identifier of the deleted scenario (if its not the last one) -> boom. + m_Scenarios.erase(it); + const CIdentifier id = scenario->m_ScenarioID; + delete scenario; + m_ScenarioMgr->releaseScenario(id); + //when closing last open scenario, no "switch-page" event is triggered so we manually handle this case + if (m_Scenarios.empty()) { newScenarioCB(); } + else { changeCurrentScenario(gtk_notebook_get_current_page(m_scenarioNotebook)); } + } + + this->saveOpenedScenarios(); +} + +void CApplication::deleteDesignerVisualizationCB() +{ + //untoggle window manager button when its associated dialog is closed + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-button_windowmanager")), FALSE); + + CInterfacedScenario* scenario = getCurrentInterfacedScenario(); + if (scenario) { scenario->snapshotCB(); } +} + +void CApplication::toggleDesignerVisualizationCB() +{ + CInterfacedScenario* scenario = getCurrentInterfacedScenario(); + if (scenario != nullptr && !scenario->isLocked()) + { + const auto index = size_t(gtk_notebook_get_current_page(m_scenarioNotebook)); + if (index < m_Scenarios.size()) { m_Scenarios[index]->toggleDesignerVisualization(); } + } +} + +void CApplication::aboutOpenViBECB() const + +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "CApplication::aboutOpenViBECB\n"; + GtkBuilder* builder = gtk_builder_new(); // glade_xml_new(OVD_GUI_File, "about", nullptr); + gtk_builder_add_from_file(builder, OVD_GUI_AboutDialog_File, nullptr); + gtk_builder_connect_signals(builder, nullptr); + //gtk_builder_connect_signals(builder, nullptr); + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(builder, "about")); + if (dialog == nullptr) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Dialog could not be opened\n"; + return; + } + + if (m_kernelCtx.getConfigurationManager().expand("${Application_Name}").length() > 0) + { + gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(dialog), m_kernelCtx.getConfigurationManager().expand("${Application_Name}").toASCIIString()); + } + if (m_kernelCtx.getConfigurationManager().expand("${Application_Version}").length() > 0) + { + gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog), m_kernelCtx.getConfigurationManager().expand("${Application_Version}").toASCIIString()); + } + + gchar* strval; + g_object_get(dialog, "comments", &strval, nullptr); + // We use a lookup instead of expansion as JSON can contain { } characters + const std::string componentVersionsJSON = m_kernelCtx.getConfigurationManager().expand("${ProjectVersion_Components}").toASCIIString(); + if (!componentVersionsJSON.empty()) + { + // This check is necessary because the asignemt operator would fail with an assert + if (json::Deserialize(componentVersionsJSON).GetType() == json::ObjectVal) + { + json::Object components = json::Deserialize(componentVersionsJSON); + const std::string update = std::accumulate(components.begin(), components.end(), std::string(strval) + "\nComponents :\n", + [](const std::string& a, const std::pair& b) + { + return a + b.first + " version " + b.second.ToString() + "\n"; + }); + g_object_set(dialog, "comments", update.c_str(), nullptr); + } + } + g_free(strval); + gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE, true); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + g_object_unref(builder); +} + +void CApplication::aboutScenarioCB(CInterfacedScenario* scenario) const +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "CApplication::aboutScenarioCB\n"; + if (scenario && !scenario->isLocked()) { scenario->contextMenuScenarioAboutCB(); } +} + +void CApplication::aboutLinkClickedCB(const gchar* url) const +{ + if (!url) { return; } + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "CApplication::aboutLinkClickedCB\n"; + const CString command = m_kernelCtx.getConfigurationManager().expand("${Designer_WebBrowserCommand} " + CString(url)); + const int result = system(command.toASCIIString()); + if (result < 0) { m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Could not launch command " << command << "\n"; } +} + +void CApplication::browseDocumentationCB() const +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "CApplication::browseDocumentationCB\n"; + const CString command = m_kernelCtx.getConfigurationManager().expand( + "${Designer_HelpBrowserCommand} \"${Designer_HelpBrowserDocumentationIndex}\" ${Designer_HelpBrowserCommandPostfix}"); + + const int result = system(command.toASCIIString()); + OV_WARNING_UNLESS((result == 0), "Could not launch command " << command << "\n", m_kernelCtx.getLogManager()); +} + +void CApplication::registerLicenseCB() +{ +#if defined TARGET_OS_Windows && defined(MENSIA_DISTRIBUTION) + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "CApplication::registerLicenseCB\n"; + const std::string cmd = (Directories::getBinDir() + "/mensia-flexnet-activation.exe").toASCIIString(); + STARTUPINFO startupInfo; + PROCESS_INFORMATION processInfo; + GetStartupInfo(&startupInfo); + if (!System::WindowsUtilities::utf16CompliantCreateProcess(nullptr, const_cast(cmd.c_str()), nullptr, nullptr, 0, 0, nullptr, nullptr, &startupInfo, + &processInfo)) { exit(1); } +#elif defined TARGET_OS_Linux && defined(MENSIA_DISTRIBUTION) + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Register License application's GUI cannot run on Linux. In order to activate your license," + << " you can use the tool 'mensia-flexnet-activation' in command line.\n"; +#endif +} + +void CApplication::reportIssueCB() const + +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "CApplication::reportIssueCB\n"; + const CString command = m_kernelCtx.getConfigurationManager().expand( + "${Designer_WebBrowserCommand} ${Designer_WebBrowserSupportURL} ${Designer_WebBrowserCommandPostfix}"); + const int result = system(command.toASCIIString()); + + OV_WARNING_UNLESS((result == 0), "Could not launch command " << command << "\n", m_kernelCtx.getLogManager()); +} + +void CApplication::addCommentCB(CInterfacedScenario* scenario) const +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "CApplication::addCommentCB\n"; + if (scenario && !scenario->isLocked()) { scenario->addCommentCB(); } +} + +void CApplication::configureScenarioSettingsCB(CInterfacedScenario* scenario) const +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "CApplication::configureScenarioSettingsCB " << m_currentScenarioIdx << "\n"; + + if (scenario && !scenario->isLocked()) { scenario->configureScenarioSettingsCB(); } +} + +Kernel::IPlayer* CApplication::getPlayer() +{ + CInterfacedScenario* scenario = getCurrentInterfacedScenario(); + return (scenario ? scenario->m_Player : nullptr); +} + +bool CApplication::createPlayer() + +{ + CInterfacedScenario* scenario = getCurrentInterfacedScenario(); + if (scenario && !scenario->m_Player) + { + // create a snapshot so settings override does not modify the scenario ! + scenario->snapshotCB(false); + + // set filename attribute to scenario so delayed configuration can be used + if (scenario->m_HasFileName) + { + if (scenario->m_Scenario.hasAttribute(OV_AttributeId_ScenarioFilename)) + { + scenario->m_Scenario.setAttributeValue(OV_AttributeId_ScenarioFilename, scenario->m_Filename.c_str()); + } + else { scenario->m_Scenario.addAttribute(OV_AttributeId_ScenarioFilename, scenario->m_Filename.c_str()); } + } + + m_kernelCtx.getPlayerManager().createPlayer(scenario->m_PlayerID); + const CIdentifier scenarioID = scenario->m_ScenarioID; + const CIdentifier playerID = scenario->m_PlayerID; + scenario->m_Player = &m_kernelCtx.getPlayerManager().getPlayer(playerID); + if (!scenario->m_Player->setScenario(scenarioID)) + { + scenario->m_PlayerID = CIdentifier::undefined(); + scenario->m_Player = nullptr; + m_kernelCtx.getPlayerManager().releasePlayer(playerID); + OV_ERROR_DRF("The current scenario could not be loaded by the player.\n", Kernel::ErrorType::BadCall); + } + + // The visualization manager needs to know the visualization tree in which the widgets should be inserted + scenario->m_Player->getRuntimeConfigurationManager(). + createConfigurationToken("VisualizationContext_VisualizationTreeId", scenario->m_TreeID.toString()); + + // TODO_JL: This should be a copy of the tree containing visualizations from the metaboxes + scenario->createPlayerVisualization(scenario->m_Tree); + + + if (scenario->m_Player->initialize() != Kernel::EPlayerReturnCodes::Success) + { + scenario->releasePlayerVisualization(); + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "The player could not be initialized.\n"; + scenario->m_PlayerID = CIdentifier::undefined(); + scenario->m_Player = nullptr; + m_kernelCtx.getPlayerManager().releasePlayer(playerID); + return false; + } + scenario->m_LastLoopTime = uint64_t(-1); + + //set up idle function + idle_add_cb(idle_scenario_loop, scenario); + + // redraws scenario + scenario->redraw(); + } + return true; +} + +void CApplication::stopInterfacedScenarioAndReleasePlayer(CInterfacedScenario* scenario) +{ + if (!(scenario && scenario->m_Player)) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Trying to stop a non-started scenario" << "\n"; + return; + } + + scenario->stopAndReleasePlayer(); + + if (scenario == this->getCurrentInterfacedScenario()) + { + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_stop")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_play_pause")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_next")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_forward")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_windowmanager")), true); + gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-button_play_pause")), GTK_STOCK_MEDIA_PLAY); + } +} + +void CApplication::stopScenarioCB() + +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "stopScenarioCB\n"; + + const Kernel::EPlayerStatus currentState = this->getCurrentInterfacedScenario()->m_PlayerStatus; + if (currentState == Kernel::EPlayerStatus::Play || currentState == Kernel::EPlayerStatus::Pause || currentState == Kernel::EPlayerStatus::Forward) + { + this->stopInterfacedScenarioAndReleasePlayer(this->getCurrentInterfacedScenario()); + + if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-toggle_button_loop")))) + { + switch (currentState) + { + case Kernel::EPlayerStatus::Play: + playScenarioCB(); + break; + case Kernel::EPlayerStatus::Forward: + forwardScenarioCB(); + break; + default: + break; + } + } + } +} + +void CApplication::pauseScenarioCB() + +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "pauseScenarioCB\n"; + + this->createPlayer(); + this->getPlayer()->pause(); + this->getCurrentInterfacedScenario()->m_PlayerStatus = this->getPlayer()->getStatus(); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_stop")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_play_pause")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_next")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_forward")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_windowmanager")), false); + gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-button_play_pause")), GTK_STOCK_MEDIA_PLAY); +} + +void CApplication::nextScenarioCB() + +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "nextScenarioCB\n"; + + this->createPlayer(); + auto player = this->getPlayer(); + OV_ERROR_UNLESS_DRV(player, "Player did not initialize correctly", Kernel::ErrorType::BadCall); + player->step(); + this->getCurrentInterfacedScenario()->m_PlayerStatus = this->getPlayer()->getStatus(); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_stop")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_play_pause")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_next")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_forward")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_windowmanager")), false); + gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-button_play_pause")), GTK_STOCK_MEDIA_PLAY); +} + +void CApplication::playScenarioCB() + +{ + if (this->getCurrentInterfacedScenario() != nullptr) + { + Kernel::IScenario& scenario = this->getCurrentInterfacedScenario()->m_Scenario; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "playScenarioCB\n"; + if (scenario.hasOutdatedBox()) + { + if (m_kernelCtx.getConfigurationManager().expandAsBoolean("${Kernel_AbortPlayerWhenBoxIsOutdated}", false)) + { + std::string outdatedBoxesList = "You can not start the scenario because following boxes need to be updated: \n"; + CIdentifier boxID; + while ((boxID = scenario.getNextOutdatedBoxIdentifier(boxID)) != CIdentifier::undefined()) + { + const Kernel::IBox* box = scenario.getBoxDetails(boxID); + outdatedBoxesList += "\t[" + box->getName() + "]\n"; + } + outdatedBoxesList += "To update a box you need to delete it from scenario, and add it again."; + GtkWidget* dialog = gtk_message_dialog_new(nullptr, GtkDialogFlags(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT), GTK_MESSAGE_INFO, + GTK_BUTTONS_OK, "%s", outdatedBoxesList.c_str()); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + return; + } + if (m_kernelCtx.getConfigurationManager().expandAsBoolean("${Designer_ThrowPopUpWhenBoxIsOutdated}", false)) + { + std::string outdatedBoxesList = "The following boxes need to be updated: \n"; + CIdentifier boxID; + while ((boxID = scenario.getNextOutdatedBoxIdentifier(boxID)) != CIdentifier::undefined()) + { + const Kernel::IBox* box = scenario.getBoxDetails(boxID); + outdatedBoxesList += "\t[" + box->getName() + "]\n"; + } + outdatedBoxesList += "Do you still want to play the scenario ?"; + GtkWidget* dialog = gtk_message_dialog_new(nullptr, GtkDialogFlags(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT), GTK_MESSAGE_QUESTION, + GTK_BUTTONS_YES_NO, "%s", outdatedBoxesList.c_str()); + const gint response = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + + if (response == GTK_RESPONSE_YES) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CApplication::playScenarioCB - GTK_RESPONSE_YES: the scenario will be played. \n"; + } + else + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CApplication::playScenarioCB - the scenario will not be played. \n"; + return; + } + } + } + } + + if (!this->createPlayer()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "The initialization of player failed. Check the above log messages to get the issue.\n"; + return; + } + if (!this->getPlayer()->play()) + { + this->stopInterfacedScenarioAndReleasePlayer(this->getCurrentInterfacedScenario()); + return; + } + this->getCurrentInterfacedScenario()->m_PlayerStatus = this->getPlayer()->getStatus(); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_stop")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_play_pause")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_next")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_forward")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_windowmanager")), false); + gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-button_play_pause")), GTK_STOCK_MEDIA_PAUSE); + + if (m_CmdLineFlags & CommandLineFlag_NoVisualization) { for (auto& iScenario : m_Scenarios) { iScenario->hideCurrentVisualization(); } } +} + +void CApplication::forwardScenarioCB() + +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "forwardScenarioCB\n"; + + if (!this->createPlayer()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "CreatePlayer failed\n"; + return; + } + + if (!this->getPlayer()->forward()) + { + this->stopInterfacedScenarioAndReleasePlayer(this->getCurrentInterfacedScenario()); + return; + } + + this->getCurrentInterfacedScenario()->m_PlayerStatus = this->getPlayer()->getStatus(); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_stop")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_play_pause")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_next")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_forward")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_windowmanager")), false); + gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-button_play_pause")), GTK_STOCK_MEDIA_PLAY); + + if (m_CmdLineFlags & CommandLineFlag_NoVisualization) { for (auto& iScenario : m_Scenarios) { iScenario->hideCurrentVisualization(); } } +} + +bool CApplication::quitApplicationCB() + +{ + CIdentifier id; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "quitApplicationCB\n"; + + // can't quit while scenarios are running + if (this->hasRunningScenario()) + { + GtkBuilder* builder = gtk_builder_new(); // glade_xml_new(OVD_GUI_File, "about", nullptr); + gtk_builder_add_from_file(builder, OVD_GUI_File, nullptr); + gtk_builder_connect_signals(builder, nullptr); + + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(builder, "dialog_running_scenario_global")); + gtk_builder_connect_signals(builder, nullptr); + // gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE, true); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + g_object_unref(builder); + + // prevent Gtk from handling delete_event and killing app + return false; + } + + // can't quit while scenarios are unsaved + if (this->hasUnsavedScenario()) + { + GtkBuilder* builder = gtk_builder_new(); // glade_xml_new(OVD_GUI_File, "about", nullptr); + gtk_builder_add_from_file(builder, OVD_GUI_File, nullptr); + gtk_builder_connect_signals(builder, nullptr); + + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(builder, "dialog_unsaved_scenario_global")); + gtk_builder_connect_signals(builder, nullptr); + const gint responseId = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + g_object_unref(builder); + + switch (responseId) + { + case GTK_RESPONSE_OK: + for (auto i = m_Scenarios.begin(); i != m_Scenarios.end(); ++i) { this->saveScenarioCB(*i); } + if (this->hasUnsavedScenario()) + { + // prevent Gtk from handling delete_event and killing app + return false; + } + break; + case GTK_RESPONSE_DELETE_EVENT: + case GTK_RESPONSE_CANCEL: + // prevent Gtk from handling delete_event and killing app + return false; + default: + break; + } + } + + // Switch to quitting mode + m_IsQuitting = true; + + // Saves opened scenarios + this->saveOpenedScenarios(); + + // Clears all existing interfaced scenarios + for (auto interfacedScenario : m_Scenarios) { delete interfacedScenario; } + + // Clears all existing scenarios + std::vector scenarioIDs; + while ((id = m_kernelCtx.getScenarioManager().getNextScenarioIdentifier(id)) != CIdentifier::undefined()) { scenarioIDs.push_back(id); } + + for (auto& scenario : scenarioIDs) { m_kernelCtx.getScenarioManager().releaseScenario(scenario); } + + // release the log manager and free the memory + if (m_logListener) + { + m_kernelCtx.getLogManager().removeListener(m_logListener); + delete m_logListener; + m_logListener = nullptr; + } + + // OK to kill app + return true; +} + +void CApplication::windowStateChangedCB(const bool isMaximized) +{ + if (m_isMaximized != isMaximized && !isMaximized) // we switched to not maximized + { + //gtk_paned_set_position(GTK_PANED(gtk_builder_get_object(m_builderInterface, "openvibe-horizontal_container")), 640); + gtk_window_resize(GTK_WINDOW(m_MainWindow), 1024, 768); + } + m_isMaximized = isMaximized; +} + +void CApplication::logLevelCB() const +{ + // Loads log level dialog + GtkBuilder* builder = gtk_builder_new(); // glade_xml_new(OVD_GUI_File, "loglevel", nullptr); + gtk_builder_add_from_file(builder, OVD_GUI_File, nullptr); + gtk_builder_connect_signals(builder, nullptr); + + gtk_toggle_button_set_active( + GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "loglevel-checkbutton_loglevel_fatal")), + m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Fatal)); + gtk_toggle_button_set_active( + GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "loglevel-checkbutton_loglevel_error")), + m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Error)); + gtk_toggle_button_set_active( + GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "loglevel-checkbutton_loglevel_important_warning")), + m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_ImportantWarning)); + gtk_toggle_button_set_active( + GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "loglevel-checkbutton_loglevel_warning")), + m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Warning)); + gtk_toggle_button_set_active( + GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "loglevel-checkbutton_loglevel_info")), m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Info)); + gtk_toggle_button_set_active( + GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "loglevel-checkbutton_loglevel_trace")), + m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Trace)); + gtk_toggle_button_set_active( + GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "loglevel-checkbutton_loglevel_benchmark")), + m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Benchmark)); + gtk_toggle_button_set_active( + GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "loglevel-checkbutton_loglevel_debug")), + m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Debug)); + + GtkDialog* logLevelDialog = GTK_DIALOG(gtk_builder_get_object(builder, "loglevel")); + const gint result = gtk_dialog_run(logLevelDialog); + if (result == GTK_RESPONSE_APPLY) + { + m_kernelCtx.getLogManager().activate( + Kernel::LogLevel_Fatal, + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "loglevel-checkbutton_loglevel_fatal"))) != 0); + m_kernelCtx.getLogManager().activate( + Kernel::LogLevel_Error, + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "loglevel-checkbutton_loglevel_error"))) != 0); + m_kernelCtx.getLogManager().activate(Kernel::LogLevel_ImportantWarning, + gtk_toggle_button_get_active( + GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "loglevel-checkbutton_loglevel_important_warning"))) != 0); + m_kernelCtx.getLogManager().activate(Kernel::LogLevel_Warning, + gtk_toggle_button_get_active( + GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "loglevel-checkbutton_loglevel_warning"))) != 0); + m_kernelCtx.getLogManager().activate( + Kernel::LogLevel_Info, + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "loglevel-checkbutton_loglevel_info"))) != 0); + m_kernelCtx.getLogManager().activate( + Kernel::LogLevel_Trace, + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "loglevel-checkbutton_loglevel_trace"))) != 0); + m_kernelCtx.getLogManager().activate(Kernel::LogLevel_Benchmark, + gtk_toggle_button_get_active( + GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "loglevel-checkbutton_loglevel_benchmark"))) != 0); + m_kernelCtx.getLogManager().activate( + Kernel::LogLevel_Debug, + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "loglevel-checkbutton_loglevel_debug"))) != 0); + + gtk_widget_set_sensitive( + GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_debug")), m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Debug)); + gtk_widget_set_sensitive( + GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_bench")), m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Benchmark)); + gtk_widget_set_sensitive( + GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_trace")), m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Trace)); + gtk_widget_set_sensitive( + GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_info")), m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Info)); + gtk_widget_set_sensitive( + GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_warning")), m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Warning)); + gtk_widget_set_sensitive( + GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_impwarning")), + m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_ImportantWarning)); + gtk_widget_set_sensitive( + GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_error")), m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Error)); + gtk_widget_set_sensitive( + GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-messages_tb_fatal")), m_kernelCtx.getLogManager().isActive(Kernel::LogLevel_Fatal)); + } + + gtk_widget_destroy(GTK_WIDGET(logLevelDialog)); + g_object_unref(builder); +} + +void CApplication::cpuUsageCB() + +{ + CInterfacedScenario* scenario = getCurrentInterfacedScenario(); + if (scenario) + { + scenario->m_DebugCPUUsage = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-togglebutton_cpu_usage"))) != 0 + ); + scenario->redraw(); + } +} + +void CApplication::changeCurrentScenario(const int pageIdx) +{ + if (m_IsQuitting) { return; } + + //hide window manager of previously active scenario, if any + const int i = gtk_notebook_get_current_page(m_scenarioNotebook); + if (i >= 0 && i < int(m_Scenarios.size())) { m_Scenarios[i]->hideCurrentVisualization(); } + + //closing last open scenario + if (pageIdx == -1) + { + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_stop")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_play_pause")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_next")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_forward")), false); + gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-button_play_pause")), GTK_STOCK_MEDIA_PLAY); + + g_signal_handlers_disconnect_by_func(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-togglebutton_cpu_usage")), G_CALLBACK2(cpu_usage_cb), this); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_windowmanager")), false); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-togglebutton_cpu_usage")), false); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-togglebutton_cpu_usage")), "toggled", G_CALLBACK(cpu_usage_cb), this); + + //toggle off window manager button + GtkWidget* windowManagerButton = GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_windowmanager")); + g_signal_handlers_disconnect_by_func(windowManagerButton, G_CALLBACK2(button_toggle_window_manager_cb), this); + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(windowManagerButton), false); + g_signal_connect(windowManagerButton, "toggled", G_CALLBACK(button_toggle_window_manager_cb), this); + + // toggle off and reset scenario settings + GtkWidget* settingsVBox = GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-scenario_configuration_vbox")); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-scenario_configuration_button_configure")), false); + + + GList* settingWidgets = gtk_container_get_children(GTK_CONTAINER(gtk_builder_get_object(m_Builder, "openvibe-scenario_configuration_vbox"))); + for (GList* settingIterator = settingWidgets; settingIterator != nullptr; settingIterator = g_list_next(settingIterator)) + { + gtk_widget_destroy(GTK_WIDGET(settingIterator->data)); + } + g_list_free(settingWidgets); + + GtkWidget* settingPlaceholderLabel = gtk_label_new("This scenario has no settings"); + gtk_box_pack_end_defaults(GTK_BOX(settingsVBox), settingPlaceholderLabel); + gtk_widget_show_all(settingsVBox); + + + // current scenario is the current notebook page. + m_currentScenarioIdx = i; + } + //switching to an existing scenario + else if (pageIdx < m_Scenarios.size()) + { + CInterfacedScenario* scenario = m_Scenarios[pageIdx]; + const Kernel::EPlayerStatus playerStatus = (scenario->m_Player ? scenario->m_Player->getStatus() : Kernel::EPlayerStatus::Stop); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_stop")), playerStatus != Kernel::EPlayerStatus::Stop); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_play_pause")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_next")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_forward")), playerStatus != Kernel::EPlayerStatus::Forward); + gtk_tool_button_set_stock_id( + GTK_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-button_play_pause")), + (playerStatus == Kernel::EPlayerStatus::Stop || playerStatus == Kernel::EPlayerStatus::Pause) ? GTK_STOCK_MEDIA_PLAY : GTK_STOCK_MEDIA_PAUSE); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_undo")), scenario->m_StateStack->isUndoPossible()); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_redo")), scenario->m_StateStack->isRedoPossible()); + + g_signal_handlers_disconnect_by_func(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-togglebutton_cpu_usage")), G_CALLBACK2(cpu_usage_cb), this); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_windowmanager")), playerStatus == Kernel::EPlayerStatus::Stop); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-togglebutton_cpu_usage")), scenario->m_DebugCPUUsage); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-togglebutton_cpu_usage")), "toggled", G_CALLBACK(cpu_usage_cb), this); + + // gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builderInterface, "openvibe-button_save")), scenario->m_hasFileName && scenario->m_hasBeenModified); + // gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builderInterface, "openvibe-menu_save")), scenario->m_hasFileName && scenario->m_hasBeenModified); + + //don't show window manager if in offline mode and it is toggled off + if (playerStatus == Kernel::EPlayerStatus::Stop && !m_Scenarios[pageIdx]->isDesignerVisualizationToggled()) + { + m_Scenarios[pageIdx]->hideCurrentVisualization(); + + // we are in edition mode, updating internal configuration token + std::string path = m_Scenarios[pageIdx]->m_Filename; + path = path.substr(0, path.rfind('/')); + m_kernelCtx.getConfigurationManager().setConfigurationTokenValue( + m_kernelCtx.getConfigurationManager().lookUpConfigurationTokenIdentifier("Player_ScenarioDirectory"), path.c_str()); + m_kernelCtx.getConfigurationManager().setConfigurationTokenValue( + m_kernelCtx.getConfigurationManager().lookUpConfigurationTokenIdentifier("__volatile_ScenarioDir"), path.c_str()); + } + else { m_Scenarios[pageIdx]->showCurrentVisualization(); } + + //update window manager button state + GtkWidget* windowMgrButton = GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_windowmanager")); + g_signal_handlers_disconnect_by_func(windowMgrButton, G_CALLBACK2(button_toggle_window_manager_cb), this); + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(windowMgrButton), m_Scenarios[pageIdx]->isDesignerVisualizationToggled()); + g_signal_connect(windowMgrButton, "toggled", G_CALLBACK(button_toggle_window_manager_cb), this); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-scenario_configuration_button_configure")), true); + m_Scenarios[pageIdx]->redrawScenarioSettings(); + m_Scenarios[pageIdx]->redrawScenarioInputSettings(); + m_Scenarios[pageIdx]->redrawScenarioOutputSettings(); + + + // current scenario is the selected one + m_currentScenarioIdx = pageIdx; + } + //first scenario is created (or a scenario is opened and replaces first unnamed unmodified scenario) + else + { + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_stop")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_play_pause")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_next")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_forward")), true); + gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-button_play_pause")), GTK_STOCK_MEDIA_PLAY); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_undo")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_redo")), false); + + g_signal_handlers_disconnect_by_func(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-togglebutton_cpu_usage")), G_CALLBACK2(cpu_usage_cb), this); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_windowmanager")), true); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-togglebutton_cpu_usage")), false); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "openvibe-togglebutton_cpu_usage")), "toggled", G_CALLBACK(cpu_usage_cb), this); + + //toggle off window manager button + GtkWidget* windowMgrButton = GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-button_windowmanager")); + g_signal_handlers_disconnect_by_func(windowMgrButton, G_CALLBACK2(button_toggle_window_manager_cb), this); + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(windowMgrButton), false); + g_signal_connect(windowMgrButton, "toggled", G_CALLBACK(button_toggle_window_manager_cb), this); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "openvibe-scenario_configuration_button_configure")), true); + + // we have a new notebook page + m_currentScenarioIdx = pageIdx; + + // we are in edition mode, updating internal configuration token + m_kernelCtx.getConfigurationManager().setConfigurationTokenValue( + m_kernelCtx.getConfigurationManager().lookUpConfigurationTokenIdentifier("Player_ScenarioDirectory"), ""); + m_kernelCtx.getConfigurationManager().setConfigurationTokenValue( + m_kernelCtx.getConfigurationManager().lookUpConfigurationTokenIdentifier("__volatile_ScenarioDir"), ""); + } + + // updates the trimming if need be + for (auto& scenario : m_Scenarios) { scenario->updateScenarioLabel(); } + // Reset zoom + if (getCurrentInterfacedScenario()) + { + gtk_spin_button_set_value( + GTK_SPIN_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-zoom_spinner")), round(getCurrentInterfacedScenario()->getScale() * 100.0)); + } + else { gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-zoom_spinner")), 100); } +} + +void CApplication::reorderCurrentScenario(const size_t newPageIdx) +{ + CInterfacedScenario* scenario = m_Scenarios[m_currentScenarioIdx]; + m_Scenarios.erase(m_Scenarios.begin() + m_currentScenarioIdx); + m_Scenarios.insert(m_Scenarios.begin() + newPageIdx, scenario); + + this->changeCurrentScenario(newPageIdx); +} + +//Increase the zoom of the current scenario +void CApplication::zoomInCB() +{ + gtk_spin_button_set_value( + GTK_SPIN_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-zoom_spinner")), round(getCurrentInterfacedScenario()->getScale() * 100.0) + 5); +} + +//Decrease the zoom of the current scenario +void CApplication::zoomOutCB() +{ + gtk_spin_button_set_value( + GTK_SPIN_BUTTON(gtk_builder_get_object(m_Builder, "openvibe-zoom_spinner")), round(getCurrentInterfacedScenario()->getScale() * 100.0) - 5); +} + +void CApplication::spinnerZoomChangedCB(const size_t scaleDelta) +{ + if (getCurrentInterfacedScenario() != nullptr) { getCurrentInterfacedScenario()->setScale(double(scaleDelta) / 100.0); } +} + +void CApplication::cannotSaveScenarioBeforeUpdate() + +{ + const CString message = "Cannot save a scenario if deprecated I/O or Settings are still pending.\n" + "Please handle or delete all pending deprecated I/O before saving scenario."; + GtkWidget* dialog = gtk_message_dialog_new(nullptr, GtkDialogFlags(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT), GTK_MESSAGE_INFO, GTK_BUTTONS_OK, + "%s", message.toASCIIString()); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); +} + +} //namespace Designer +} //namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCApplication.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCApplication.h new file mode 100755 index 0000000..cea9d72 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCApplication.h @@ -0,0 +1,190 @@ +#pragma once + +#include +#include "ovd_base.h" + +#include "archway/ovdCArchwayHandler.h" +#include "archway/ovdCArchwayHandlerGUI.h" + +#define OVD_ScenarioImportContext_OpenScenario OpenViBE::CIdentifier(0xA180DB91, 0x19235AEE) +#define OVD_ScenarioExportContext_SaveScenario OpenViBE::CIdentifier(0xC98C47AD, 0xCBD952B2) +#define OVD_ScenarioExportContext_SaveMetabox OpenViBE::CIdentifier(0x529494F1, 0x6C2527D9) + +#include + +namespace OpenViBE { +namespace Designer { + +class CInterfacedScenario; + +class CLogListenerDesigner; + +class CApplication +{ +public: + explicit CApplication(const Kernel::IKernelContext& ctx); + ~CApplication(); + + void initialize(ECommandLineFlag cmdLineFlags); + bool openScenario(const char* filename); + + /** \name Drag and drop management */ + //@{ + + void dragDataGetCB(GtkWidget* widget, GdkDragContext* dragCtx, GtkSelectionData* selectionData, guint info, guint time) const; + + //@} + + /** \name Selection management */ + //@{ + + void undoCB(); + void redoCB(); + + void copySelectionCB(); + void cutSelectionCB(); + void pasteSelectionCB(); + void deleteSelectionCB(); + void preferencesCB() const; + + //@} + + /** \name Scenario management */ + //@{ + + CString getWorkingDirectory(); + + bool hasRunningScenario(); + bool hasUnsavedScenario(); + + CInterfacedScenario* getCurrentInterfacedScenario(); + void saveOpenedScenarios(); + + void testCB() const; + void newScenarioCB(); + void openScenarioCB(); + void saveScenarioCB(CInterfacedScenario* scenario = nullptr); // defaults to current scenario if nullptr + void saveScenarioAsCB(CInterfacedScenario* scenario = nullptr); // defaults to current scenario if nullptr + void closeScenarioCB(CInterfacedScenario* scenario); + void restoreDefaultScenariosCB() const; + + void stopScenarioCB(); + void pauseScenarioCB(); + void nextScenarioCB(); + void playScenarioCB(); + void forwardScenarioCB(); + + void configureScenarioSettingsCB(CInterfacedScenario* scenario) const; + + void addCommentCB(CInterfacedScenario* scenario) const; + + void changeCurrentScenario(int pageIdx); + void reorderCurrentScenario(size_t newPageIdx); + void addRecentScenario(const std::string& scenarioPath); + + static void cannotSaveScenarioBeforeUpdate(); + + //@} + + /** \name Designer visualization management */ + //@{ + + void deleteDesignerVisualizationCB(); + void toggleDesignerVisualizationCB(); + + //@} + + /** \name Player management */ + //@{ + + Kernel::IPlayer* getPlayer(); + bool createPlayer(); + void stopInterfacedScenarioAndReleasePlayer(CInterfacedScenario* scenario); + + //@} + + /** \name Application management */ + //@{ + + bool quitApplicationCB(); + void aboutOpenViBECB() const; + void aboutScenarioCB(CInterfacedScenario* scenario) const; + void aboutLinkClickedCB(const gchar* url) const; + + void browseDocumentationCB() const; + static void registerLicenseCB(); + void reportIssueCB() const; + void windowStateChangedCB(bool isMaximized); + bool displayChangelogWhenAvailable(); + + //@} + + void logLevelCB() const; + //void logLevelMessagesCB(); + void cpuUsageCB(); + void zoomInCB(); //Call when a zoom in is required + void zoomOutCB(); //Call when a zoom out is required + void spinnerZoomChangedCB(const size_t scaleDelta); + + const Kernel::IKernelContext& m_kernelCtx; + Kernel::IPluginManager* m_PluginMgr = nullptr; + Kernel::IScenarioManager* m_ScenarioMgr = nullptr; + VisualizationToolkit::IVisualizationManager* m_VisualizationMgr = nullptr; + Kernel::IScenario* m_ClipboardScenario = nullptr; + + ECommandLineFlag m_CmdLineFlags = CommandLineFlag_None; + + GtkBuilder* m_Builder = nullptr; + GtkWidget* m_MainWindow = nullptr; + + GtkTreeStore* m_BoxAlgorithmTreeModel = nullptr; + GtkTreeModel* m_BoxAlgorithmTreeModelFilter = nullptr; + GtkTreeModel* m_BoxAlgorithmTreeModelFilter2 = nullptr; + GtkTreeModel* m_BoxAlgorithmTreeModelFilter3 = nullptr; + GtkTreeModel* m_BoxAlgorithmTreeModelFilter4 = nullptr; + GtkTreeView* m_BoxAlgorithmTreeView = nullptr; + GtkTreeStore* m_AlgorithmTreeModel = nullptr; + + GtkSpinButton* m_FastForwardFactor = nullptr; + + // UI for adding inputs and outputs to a scenario + GtkWidget* m_Inputs = nullptr; + GtkWidget* m_Outputs = nullptr; + + gint m_FilterTimeout = 0; + const gchar* m_SearchTerm = nullptr; + + uint64_t m_LastTimeRefresh = 0; + bool m_IsQuitting = false; + bool m_IsNewVersion = false; + + std::vector m_Scenarios; + std::vector m_NewBoxes; + std::vector m_UpdatedBoxes; + +#ifdef MENSIA_DISTRIBUTION + CArchwayHandler* m_ArchwayHandler = nullptr; + CArchwayHandlerGUI* m_ArchwayHandlerGUI = nullptr; +#endif + +protected: + VisualizationToolkit::IVisualizationContext* m_visualizationCtx = nullptr; + + CLogListenerDesigner* m_logListener = nullptr; + + GtkWidget* m_splashScreen = nullptr; + GtkNotebook* m_scenarioNotebook = nullptr; + GtkNotebook* m_resourceNotebook = nullptr; + GtkTreeView* m_algorithmTreeView = nullptr; + GtkWidget* m_configureSettingsAddSettingButton = nullptr; + GtkContainer* m_menuOpenRecent = nullptr; + std::vector m_recentScenarios; + + bool m_isMaximized = false; + + size_t m_currentScenarioIdx = 0; + std::vector m_documentedBoxes; +}; + +} //namespace Designer +} //namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCBoxConfigurationDialog.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCBoxConfigurationDialog.cpp new file mode 100755 index 0000000..7a57128 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCBoxConfigurationDialog.cpp @@ -0,0 +1,548 @@ +#include "ovdCBoxConfigurationDialog.h" +#include "ovdCSettingCollectionHelper.h" + +#include +#include + +#include +#include + +#include + +namespace OpenViBE { +namespace Designer { + +static const char* const ROOT_NAME = "OpenViBE-SettingsOverride"; +static const char* const SETTING_NAME = "SettingValue"; + +static void onFileOverrideCheckToggled(GtkToggleButton* button, gpointer data) +{ + gtk_widget_set_sensitive(static_cast(data), !gtk_toggle_button_get_active(button)); +} + +static void OnButtonLoadClicked(GtkButton* /*button*/, gpointer data) { static_cast(data)->loadConfig(); } +static void OnButtonSaveClicked(GtkButton* /*button*/, gpointer data) { static_cast(data)->saveConfig(); } +static void OnOverrideBrowseClicked(GtkButton* /*button*/, gpointer data) { static_cast(data)->onOverrideBrowse(); } +static void CollectWidgetCB(GtkWidget* widget, gpointer data) { static_cast*>(data)->push_back(widget); } + +CBoxConfigurationDialog::CBoxConfigurationDialog(const Kernel::IKernelContext& ctx, Kernel::IBox& box, const char* guiFilename, + const char* guiSettingsFilename, const bool isScenarioRunning) + : m_kernelCtx(ctx), m_box(box), m_guiFilename(guiFilename), m_guiSettingsFilename(guiSettingsFilename), + m_settingFactory(m_guiSettingsFilename.toASCIIString(), ctx), m_isScenarioRunning(isScenarioRunning) +{ + m_box.addObserver(this); + + if (m_box.getInterfacorCountIncludingDeprecated(Kernel::EBoxInterfacorType::Setting)) + { + GtkBuilder* builder = gtk_builder_new(); // glade_xml_new(m_guiFilename.toASCIIString(), "box_configuration", nullptr); + gtk_builder_add_from_file(builder, m_guiFilename.toASCIIString(), nullptr); + gtk_builder_connect_signals(builder, nullptr); + + if (!m_isScenarioRunning) + { + // TODO : This is not a modal dialog. It would be better if it was. + m_settingDialog = GTK_WIDGET(gtk_builder_get_object(builder, "box_configuration")); + const std::string title = std::string("Configure ") + m_box.getName().toASCIIString() + " settings"; + gtk_window_set_title(GTK_WINDOW(m_settingDialog), title.c_str()); + } + else + { + // This is actually *not* a dialog + m_settingDialog = GTK_WIDGET(gtk_builder_get_object(builder, "box_configuration-scrolledwindow")); + } + m_settingsTable = GTK_TABLE(gtk_builder_get_object(builder, "box_configuration-table")); + m_scrolledWindow = GTK_SCROLLED_WINDOW(gtk_builder_get_object(builder, "box_configuration-scrolledwindow")); + m_viewPort = GTK_VIEWPORT(gtk_builder_get_object(builder, "box_configuration-viewport")); + + gtk_table_resize(m_settingsTable, guint(m_box.getInterfacorCountIncludingDeprecated(Kernel::EBoxInterfacorType::Setting)), 4); + + generateSettingsTable(); + + const CSettingCollectionHelper helper(m_kernelCtx, m_guiSettingsFilename.toASCIIString()); + + if (!m_isScenarioRunning) + { + GtkContainer* fileOverrideContainer = GTK_CONTAINER(gtk_builder_get_object(builder, "box_configuration-hbox_filename_override")); + m_fileOverrideCheck = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, "box_configuration-checkbutton_filename_override")); + GtkButton* buttonLoad = GTK_BUTTON(gtk_builder_get_object(builder, "box_configuration-button_load_current_from_file")); + GtkButton* buttonSave = GTK_BUTTON(gtk_builder_get_object(builder, "box_configuration-button_save_current_to_file")); + + const std::string settingOverrideWidgetName = helper.getSettingWidgetName(OV_TypeId_Filename).toASCIIString(); + GtkBuilder* builderInterfaceSettingCollection = gtk_builder_new(); + gtk_builder_add_from_file(builderInterfaceSettingCollection, m_guiSettingsFilename.toASCIIString(), nullptr); + + m_overrideEntryContainer = GTK_WIDGET(gtk_builder_get_object(builderInterfaceSettingCollection, settingOverrideWidgetName.c_str())); + + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(m_overrideEntryContainer), CollectWidgetCB, &widgets); + + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(m_overrideEntryContainer)), m_overrideEntryContainer); + gtk_container_add(fileOverrideContainer, m_overrideEntryContainer); + m_overrideEntry = GTK_ENTRY(widgets[0]); + + + g_signal_connect(G_OBJECT(m_fileOverrideCheck), "toggled", G_CALLBACK(onFileOverrideCheckToggled), GTK_WIDGET(m_settingsTable)); + g_signal_connect(G_OBJECT(widgets[1]), "clicked", G_CALLBACK(OnOverrideBrowseClicked), this); + g_signal_connect(G_OBJECT(buttonLoad), "clicked", G_CALLBACK(OnButtonLoadClicked), this); + g_signal_connect(G_OBJECT(buttonSave), "clicked", G_CALLBACK(OnButtonSaveClicked), this); + + if (m_box.hasAttribute(OV_AttributeId_Box_SettingOverrideFilename)) + { + GtkExpander* expander = GTK_EXPANDER(gtk_builder_get_object(builder, "box_configuration-expander")); + gtk_expander_set_expanded(expander, true); + + gtk_entry_set_text(m_overrideEntry, m_box.getAttributeValue(OV_AttributeId_Box_SettingOverrideFilename).toASCIIString()); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_fileOverrideCheck), true); + gtk_widget_set_sensitive(GTK_WIDGET(m_settingsTable), false); + } + else { gtk_entry_set_text(m_overrideEntry, ""); } + + g_object_unref(builder); + g_object_unref(builderInterfaceSettingCollection); + } + } +} + +CBoxConfigurationDialog::~CBoxConfigurationDialog() +{ + m_box.deleteObserver(this); + if (m_settingDialog) { gtk_widget_destroy(m_settingDialog); } +} + +bool CBoxConfigurationDialog::run() +{ + bool modified = false; + if (m_box.getInterfacorCountIncludingDeprecated(Kernel::EBoxInterfacorType::Setting)) + { + //CSettingCollectionHelper helper(m_kernelCtx, m_guiSettingsFilename.toASCIIString()); + storeState(); + bool finished = false; + while (!finished) + { + const gint result = gtk_dialog_run(GTK_DIALOG(m_settingDialog)); + if (result == GTK_RESPONSE_APPLY) + { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_fileOverrideCheck))) + { + const gchar* fileName = gtk_entry_get_text(m_overrideEntry); + if (m_box.hasAttribute(OV_AttributeId_Box_SettingOverrideFilename)) + { + m_box.setAttributeValue(OV_AttributeId_Box_SettingOverrideFilename, fileName); + } + else { m_box.addAttribute(OV_AttributeId_Box_SettingOverrideFilename, fileName); } + } + else + { + if (m_box.hasAttribute(OV_AttributeId_Box_SettingOverrideFilename)) { m_box.removeAttribute(OV_AttributeId_Box_SettingOverrideFilename); } + } + + finished = true; + modified = true; + } + else if (result == GTK_RESPONSE_CANCEL) + { + restoreState(); + finished = true; + } + else if (result == 1) // default + { + // Some settings will add/remove other settings; + // by evaluating m_box.getSettingCount() each time we ensure not ending somewhere in the oblivion + for (size_t i = 0; i < m_settingViews.size(); ++i) + { + CString value; + m_box.getSettingDefaultValue(i, value); + m_box.setSettingValue(i, value); + //m_settingViews[i]->setValue(value); + //helper.setValue(settingType, i < m_settingViews.size()? m_settingViews[i]->getEntryWidget() : nullptr, value); + } + gtk_entry_set_text(GTK_ENTRY(m_overrideEntryContainer), ""); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_fileOverrideCheck), false); + //gtk_widget_set_sensitive(GTK_WIDGET(m_settingsTable), true); + modified = false; + } + else if (result == 2) // revert + { + restoreState(); + + if (m_box.hasAttribute(OV_AttributeId_Box_SettingOverrideFilename)) + { + gtk_entry_set_text( + GTK_ENTRY(m_overrideEntryContainer), m_box.getAttributeValue(OV_AttributeId_Box_SettingOverrideFilename).toASCIIString()); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_fileOverrideCheck), true); + } + else + { + gtk_entry_set_text(GTK_ENTRY(m_overrideEntryContainer), ""); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_fileOverrideCheck), false); + } + } + else if (result == 3) { modified = true; } // load + else if (result == 4) { } // save + else { finished = true; } + } + } + return modified; +} + +void CBoxConfigurationDialog::update(CObservable& /*o*/, void* data) +{ + const Kernel::BoxEventMessage* event = static_cast(data); + + switch (event->m_Type) + { + case Kernel::SettingsAllChange: + generateSettingsTable(); + break; + + case Kernel::SettingValueUpdate: + { + CString value; + m_box.getSettingValue(event->m_FirstIdx, value); + + m_settingViews[event->m_FirstIdx]->setValue(value); + break; + } + + case Kernel::SettingDelete: + removeSetting(event->m_FirstIdx); + break; + + case Kernel::SettingAdd: + addSetting(event->m_FirstIdx); + break; + + case Kernel::SettingChange: + settingChange(event->m_FirstIdx); + break; + + case Kernel::SettingsReorder: break; + default: break; //OV_ERROR_KRF("wtf", Kernel::ErrorType::BadSetting); + } +} + +void CBoxConfigurationDialog::generateSettingsTable() +{ + std::for_each(m_settingViews.begin(), m_settingViews.end(), [](Setting::CAbstractSettingView* elem) { delete elem; }); + m_settingViews.clear(); + //Remove rows + gtk_container_foreach(GTK_CONTAINER(GTK_WIDGET(m_settingsTable)), + [](GtkWidget* widget, gpointer data) { gtk_container_remove(GTK_CONTAINER(data), widget); }, + GTK_WIDGET(m_settingsTable)); + + size_t size = 0; + if (m_isScenarioRunning) + { + for (size_t i = 0; i < m_box.getInterfacorCountIncludingDeprecated(Kernel::EBoxInterfacorType::Setting); ++i) + { + bool mod = false; + m_box.getSettingMod(i, mod); + if (mod) { size++; } + } + } + else { size = m_box.getInterfacorCountIncludingDeprecated(Kernel::EBoxInterfacorType::Setting); } + gtk_table_resize(m_settingsTable, guint(size + 2), 4); + + // Iterate over box settings, generate corresponding gtk widgets. If the scenario is running, we are making a + // 'modifiable settings' dialog and use a subset of widgets with a slightly different layout and buttons. + for (size_t settingIdx = 0, tableIdx = 0; settingIdx < m_box.getInterfacorCountIncludingDeprecated(Kernel::EBoxInterfacorType::Setting); ++settingIdx) + { + if (addSettingsToView(settingIdx, tableIdx)) { ++tableIdx; } + } + updateSize(); +} + +bool CBoxConfigurationDialog::addSettingsToView(const size_t settingIdx, const size_t tableIdx) +{ + bool modifiable; + m_box.getSettingMod(settingIdx, modifiable); + + if ((!m_isScenarioRunning) || (m_isScenarioRunning && modifiable)) + { + CString name; + + m_box.getSettingName(settingIdx, name); + Setting::CAbstractSettingView* view = m_settingFactory.getSettingView(m_box, settingIdx); + + bool isDeprecated = false; + m_box.getInterfacorDeprecatedStatus(Kernel::EBoxInterfacorType::Setting, settingIdx, isDeprecated); + if (isDeprecated) + { + gtk_widget_set_sensitive(GTK_WIDGET(view->getNameWidget()), false); + gtk_widget_set_sensitive(GTK_WIDGET(view->getEntryWidget()), false); + } + + gtk_table_attach(m_settingsTable, view->getNameWidget(), 0, 1, guint(tableIdx), guint(tableIdx + 1), GtkAttachOptions(GTK_FILL), + GtkAttachOptions(GTK_FILL), 0, 0); + gtk_table_attach(m_settingsTable, view->getEntryWidget(), 1, 4, guint(tableIdx), guint(tableIdx + 1), + GtkAttachOptions(GTK_SHRINK | GTK_FILL | GTK_EXPAND), GtkAttachOptions(GTK_SHRINK), 0, 0); + + m_settingViews.insert(m_settingViews.begin() + tableIdx, view); + + return true; + } + return false; +} + +void CBoxConfigurationDialog::settingChange(const size_t index) +{ + //We remeber the place to add the new setting at the same place + const size_t indexTable = getTableIndex(index); + + removeSetting(index, false); + addSettingsToView(index, indexTable); +} + +void CBoxConfigurationDialog::addSetting(const size_t index) +{ + bool modifiable; + m_box.getSettingMod(index, modifiable); + + if ((!m_isScenarioRunning) || (m_isScenarioRunning && modifiable)) + { + const size_t size = m_settingViews.size(); + /*There is two case. + 1) we just add at the end of the setting box + 2) we add it in the middle end we need to shift + */ + const size_t tableIdx = (index > m_settingViews[size - 1]->getSettingIndex()) ? size : getTableIndex(index); + + gtk_table_resize(m_settingsTable, guint(size + 2), 4); + + if (index <= m_settingViews[size - 1]->getSettingIndex()) + { + for (size_t i = size - 1; i >= tableIdx; --i) + { + Setting::CAbstractSettingView* view = m_settingViews[i]; + + //We need to update the index + view->setSettingIndex(view->getSettingIndex() + 1); + + gtk_container_remove(GTK_CONTAINER(m_settingsTable), view->getNameWidget()); + gtk_table_attach(m_settingsTable, view->getNameWidget(), 0, 1, guint(i + 1), guint(i + 2), GtkAttachOptions(GTK_FILL), + GtkAttachOptions(GTK_FILL), 0, 0); + + gtk_container_remove(GTK_CONTAINER(m_settingsTable), view->getEntryWidget()); + gtk_table_attach(m_settingsTable, view->getEntryWidget(), 1, 4, guint(i + 1), guint(i + 2), + GtkAttachOptions(GTK_SHRINK | GTK_FILL | GTK_EXPAND), GtkAttachOptions(GTK_SHRINK), 0, 0); + } + } + addSettingsToView(size_t(tableIdx), index); + updateSize(); + } + //Even if nothing is add to the interface, we still need to update index + else + { + for (Setting::CAbstractSettingView* view : m_settingViews) + { + if (view->getSettingIndex() >= index) { view->setSettingIndex(view->getSettingIndex() + 1); } + } + } +} + +void CBoxConfigurationDialog::removeSetting(const size_t index, const bool shift) +{ + const int tableIdx = getTableIndex(index); + + if (tableIdx != -1) + { + Setting::CAbstractSettingView* view = m_settingViews[tableIdx]; + GtkWidget* name = view->getNameWidget(); + GtkWidget* entry = view->getEntryWidget(); + + gtk_container_remove(GTK_CONTAINER(m_settingsTable), name); + gtk_container_remove(GTK_CONTAINER(m_settingsTable), entry); + + delete view; + m_settingViews.erase(m_settingViews.begin() + tableIdx); + + //Now if we need to do it we shift everything to avoid an empty row in the table + if (shift) + { + for (size_t i = tableIdx; i < m_settingViews.size(); ++i) + { + view = m_settingViews[i]; + view->setSettingIndex(view->getSettingIndex() - 1); + + gtk_container_remove(GTK_CONTAINER(m_settingsTable), view->getNameWidget()); + gtk_table_attach(m_settingsTable, view->getNameWidget(), 0, 1, guint(i), guint(i + 1), GtkAttachOptions(GTK_FILL), GtkAttachOptions(GTK_FILL), + 0, 0); + + gtk_container_remove(GTK_CONTAINER(m_settingsTable), view->getEntryWidget()); + gtk_table_attach(m_settingsTable, view->getEntryWidget(), 1, 4, guint(i), guint(i + 1), GtkAttachOptions(GTK_SHRINK | GTK_FILL | GTK_EXPAND), + GtkAttachOptions(GTK_SHRINK), 0, 0); + } + //Now let's resize everything + gtk_table_resize(m_settingsTable, guint(m_settingViews.size() + 2), 4); + updateSize(); + } + } + //Even if we delete an "invisible" setting we need to update every index. + else + { + for (Setting::CAbstractSettingView* view : m_settingViews) + { + if (view->getSettingIndex() >= index) { view->setSettingIndex(view->getSettingIndex() - 1); } + } + } +} + +int CBoxConfigurationDialog::getTableIndex(const size_t index) +{ + size_t tableIdx = 0; + for (auto it = m_settingViews.begin(); it != m_settingViews.end(); ++it, ++tableIdx) + { + Setting::CAbstractSettingView* view = *it; + if (view->getSettingIndex() == index) { return int(index); } + } + + return -1; +} + +void CBoxConfigurationDialog::updateSize() const +{ + // Resize the window to fit as much of the table as possible, but keep the max size + // limited so it doesn't get outside the screen. For safety, we cap to 800x600 + // anyway to hopefully prevent the window from going under things such as the gnome toolbar. + // The ui file at the moment does not allow resize of this window because the result + // looked ugly if the window was made overly large, and no satisfying solution at the time was + // found by the limited intellectual resources available. + const gint maxWidth = std::min(800, gdk_screen_get_width(gdk_screen_get_default())); + const gint maxHeight = std::min(600, gdk_screen_get_height(gdk_screen_get_default())); + GtkRequisition size; + gtk_widget_size_request(GTK_WIDGET(m_viewPort), &size); + gtk_widget_set_size_request(GTK_WIDGET(m_scrolledWindow), gint(std::min(maxWidth, size.width)), gint(std::min(maxHeight, size.height))); +} + +void CBoxConfigurationDialog::saveConfig() const +{ + GtkWidget* widgetDialogOpen = gtk_file_chooser_dialog_new("Select file to save settings to...", nullptr, GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, nullptr); + + const gchar* initialFileNameToExpand = gtk_entry_get_text(GTK_ENTRY(m_overrideEntryContainer)); + const CString initialFileName = m_kernelCtx.getConfigurationManager().expand(initialFileNameToExpand); + if (g_path_is_absolute(initialFileName.toASCIIString())) + { + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widgetDialogOpen), initialFileName.toASCIIString()); + } + else + { + char* fullPath = g_build_filename(g_get_current_dir(), initialFileName.toASCIIString(), nullptr); + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widgetDialogOpen), fullPath); + g_free(fullPath); + } + + if (gtk_dialog_run(GTK_DIALOG(widgetDialogOpen)) == GTK_RESPONSE_ACCEPT) + { + char* fileName = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widgetDialogOpen)); + + XML::IXMLHandler* handler = XML::createXMLHandler(); + XML::IXMLNode* rootNode = XML::createNode(ROOT_NAME); + for (size_t i = 0; i < m_box.getInterfacorCountIncludingDeprecated(Kernel::EBoxInterfacorType::Setting); ++i) + { + XML::IXMLNode* tmpNode = XML::createNode(SETTING_NAME); + CString value; + m_box.getSettingValue(size_t(i), value); + tmpNode->setPCData(value.toASCIIString()); + + rootNode->addChild(tmpNode); + } + + handler->writeXMLInFile(*rootNode, fileName); + + handler->release(); + rootNode->release(); + g_free(fileName); + } + gtk_widget_destroy(widgetDialogOpen); +} + +void CBoxConfigurationDialog::loadConfig() const +{ + GtkWidget* widgetDialogOpen = gtk_file_chooser_dialog_new("Select file to load settings from...", nullptr, GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nullptr); + + const gchar* filenameToExpand = gtk_entry_get_text(GTK_ENTRY(m_overrideEntryContainer)); + + const CString filename = m_kernelCtx.getConfigurationManager().expand(filenameToExpand); + if (g_path_is_absolute(filename.toASCIIString())) { gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widgetDialogOpen), filename.toASCIIString()); } + else + { + char* fullPath = g_build_filename(g_get_current_dir(), filename.toASCIIString(), nullptr); + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widgetDialogOpen), fullPath); + g_free(fullPath); + } + + if (gtk_dialog_run(GTK_DIALOG(widgetDialogOpen)) == GTK_RESPONSE_ACCEPT) + { + char* path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widgetDialogOpen)); + + XML::IXMLHandler* handler = XML::createXMLHandler(); + XML::IXMLNode* rootNode = handler->parseFile(path); + + for (size_t i = 0; i < rootNode->getChildCount(); ++i) + { + //Hope everything will fit in the right place + m_box.setSettingValue(size_t(i), rootNode->getChild(i)->getPCData()); + } + + rootNode->release(); + handler->release(); + g_free(path); + } + gtk_widget_destroy(widgetDialogOpen); +} + +void CBoxConfigurationDialog::onOverrideBrowse() const +{ + GtkWidget* widgetDialogOpen = gtk_file_chooser_dialog_new("Select file to open...", nullptr, GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nullptr); + + const CString initialFilename = m_kernelCtx.getConfigurationManager().expand(gtk_entry_get_text(GTK_ENTRY(m_overrideEntry))); + if (g_path_is_absolute(initialFilename.toASCIIString())) + { + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widgetDialogOpen), initialFilename.toASCIIString()); + } + else + { + char* fullPath = g_build_filename(g_get_current_dir(), initialFilename.toASCIIString(), nullptr); + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widgetDialogOpen), fullPath); + g_free(fullPath); + } + + gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(widgetDialogOpen), false); + + if (gtk_dialog_run(GTK_DIALOG(widgetDialogOpen)) == GTK_RESPONSE_ACCEPT) + { + gchar* name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widgetDialogOpen)); + std::string filename(name); + g_free(name); + std::replace(filename.begin(), filename.end(), '\\', '/'); + gtk_entry_set_text(GTK_ENTRY(m_overrideEntry), filename.c_str()); + } + gtk_widget_destroy(widgetDialogOpen); +} + + +void CBoxConfigurationDialog::storeState() +{ + m_settingsMemory.clear(); + for (size_t i = 0; i < m_box.getInterfacorCountIncludingDeprecated(Kernel::EBoxInterfacorType::Setting); ++i) + { + CString temp; + m_box.getSettingValue(i, temp); + m_settingsMemory.push_back(temp); + } +} + +void CBoxConfigurationDialog::restoreState() +{ + for (size_t i = 0; i < m_settingsMemory.size(); ++i) + { + if (i >= m_box.getInterfacorCountIncludingDeprecated(Kernel::EBoxInterfacorType::Setting)) { return; } // This is not supposed to happen + m_box.setSettingValue(i, m_settingsMemory[i]); + } +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCBoxConfigurationDialog.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCBoxConfigurationDialog.h new file mode 100755 index 0000000..ed1155e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCBoxConfigurationDialog.h @@ -0,0 +1,61 @@ +#pragma once + +#include "ovd_base.h" + +#include + +#include "dynamic_settings/ovdCAbstractSettingView.h" +#include "dynamic_settings/ovdCSettingViewFactory.h" + +namespace OpenViBE { +namespace Designer { +class CBoxConfigurationDialog final : public IObserver +{ +public: + + CBoxConfigurationDialog(const Kernel::IKernelContext& ctx, Kernel::IBox& box, const char* guiFilename, + const char* guiSettingsFilename, const bool isScenarioRunning = false); + ~CBoxConfigurationDialog() override; + + bool run(); + void update(CObservable& o, void* data) override; + + void saveConfig() const; + void loadConfig() const; + void onOverrideBrowse() const; + + void storeState(); + void restoreState(); + + CIdentifier getBoxID() const { return m_box.getIdentifier(); } + GtkWidget* getWidget() const { return m_settingDialog; } +protected: + + void generateSettingsTable(); + bool addSettingsToView(const size_t settingIdx, const size_t tableIdx); + void updateSize() const; + void settingChange(const size_t index); + void addSetting(const size_t index); + void removeSetting(const size_t index, bool shift = true); + int getTableIndex(const size_t index); + + const Kernel::IKernelContext& m_kernelCtx; + Kernel::IBox& m_box; + CString m_guiFilename; + CString m_guiSettingsFilename; + + Setting::CSettingViewFactory m_settingFactory; + std::vector m_settingViews; + GtkTable* m_settingsTable = nullptr; + GtkViewport* m_viewPort = nullptr; + GtkScrolledWindow* m_scrolledWindow = nullptr; + GtkEntry* m_overrideEntry = nullptr; + GtkWidget* m_overrideEntryContainer = nullptr; + GtkWidget* m_settingDialog = nullptr; + GtkCheckButton* m_fileOverrideCheck = nullptr; + bool m_isScenarioRunning = false; + + std::vector m_settingsMemory; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCBoxProxy.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCBoxProxy.cpp new file mode 100755 index 0000000..cc94b13 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCBoxProxy.cpp @@ -0,0 +1,194 @@ +#include "ovdCBoxProxy.h" +#include "ovdTAttributeHandler.h" +#include + +namespace OpenViBE { +namespace Designer { + +CBoxProxy::CBoxProxy(const Kernel::IKernelContext& ctx, Kernel::IScenario& scenario, const CIdentifier& boxID) + : m_kernelCtx(ctx), m_constBox(scenario.getBoxDetails(boxID)), m_box(scenario.getBoxDetails(boxID)), + m_isDeprecated(m_kernelCtx.getPluginManager().isPluginObjectFlaggedAsDeprecated(m_constBox->getAlgorithmClassIdentifier())) +{ + m_isBoxAlgorithmPresent = false; + + if (m_constBox) + { + if (m_constBox->getAlgorithmClassIdentifier() == OVP_ClassId_BoxAlgorithm_Metabox) + { + CIdentifier metaboxId; + metaboxId.fromString(m_constBox->getAttributeValue(OVP_AttributeId_Metabox_ID)); + const CString path(m_kernelCtx.getMetaboxManager().getMetaboxFilePath(metaboxId)); + + m_isBoxAlgorithmPresent = FS::Files::fileExists(path.toASCIIString()); + } + else { m_isBoxAlgorithmPresent = m_kernelCtx.getPluginManager().canCreatePluginObject(m_constBox->getAlgorithmClassIdentifier()); } + + const TAttributeHandler handler(*m_constBox); + m_centerX = handler.getAttributeValue(OV_AttributeId_Box_XCenterPosition); + m_centerY = handler.getAttributeValue(OV_AttributeId_Box_YCenterPosition); + } + m_showOriginalNameWhenModified = m_kernelCtx.getConfigurationManager().expandAsBoolean("${Designer_ShowOriginalBoxName}", true); +} + +int CBoxProxy::getWidth(GtkWidget* widget) const +{ + int x, y; + updateSize(widget, getLabel(), getStatusLabel(), &x, &y); + return x; +} + +int CBoxProxy::getHeight(GtkWidget* widget) const +{ + int x, y; + updateSize(widget, getLabel(), getStatusLabel(), &x, &y); + return y; +} + +void CBoxProxy::setCenter(const int x, const int y) +{ + m_centerX = x; + m_centerY = y; + m_applied = false; +} + +void CBoxProxy::setBoxAlgorithmDescriptorOverride(const Plugins::IBoxAlgorithmDesc* pBoxAlgorithmDescriptor) +{ + m_boxAlgorithmDescOverride = pBoxAlgorithmDescriptor; +} + +void CBoxProxy::apply() +{ + if (m_box) + { + TAttributeHandler handler(*m_box); + + if (handler.hasAttribute(OV_AttributeId_Box_XCenterPosition)) { handler.setAttributeValue(OV_AttributeId_Box_XCenterPosition, m_centerX); } + else { handler.addAttribute(OV_AttributeId_Box_XCenterPosition, m_centerX); } + + if (handler.hasAttribute(OV_AttributeId_Box_YCenterPosition)) { handler.setAttributeValue(OV_AttributeId_Box_YCenterPosition, m_centerY); } + else { handler.addAttribute(OV_AttributeId_Box_YCenterPosition, m_centerY); } + + m_applied = true; + } +} + +const char* CBoxProxy::getLabel() const +{ + const bool canChangeInput( + m_constBox->hasAttribute(OV_AttributeId_Box_FlagCanModifyInput) || m_constBox->hasAttribute(OV_AttributeId_Box_FlagCanAddInput)); + const bool canChangeOutput( + m_constBox->hasAttribute(OV_AttributeId_Box_FlagCanModifyOutput) || m_constBox->hasAttribute(OV_AttributeId_Box_FlagCanAddOutput)); + const bool canChangeSetting( + m_constBox->hasAttribute(OV_AttributeId_Box_FlagCanModifySetting) || m_constBox->hasAttribute(OV_AttributeId_Box_FlagCanAddSetting)); + + const Plugins::IPluginObjectDesc* desc = (m_boxAlgorithmDescOverride == nullptr + ? m_kernelCtx.getPluginManager().getPluginObjectDescCreating(m_constBox->getAlgorithmClassIdentifier()) + : m_boxAlgorithmDescOverride); + + std::string name(m_constBox->getName()); + + const std::string red("#602020"), green("#206020"), grey("#404040"); + + // pango is used in the box diplay to format the box name (e.g. bold to tell it's a configurable box) + // incidently, this makes the box name pango-enabled. If an error appears in the markup, the box display would be wrong. + if (!pango_parse_markup(name.c_str(), -1, 0, nullptr, nullptr, nullptr, nullptr)) + { + // the name uses invalid markup characters + // we sanitize the markup tag overture '<' + // markup should not be used in the box name anyway (hidden feature), + // but the character '<' may actually be useful in a valid name + for (size_t c = 0; c < name.size(); ++c) + { + if (name[c] == '<') + { + name[c] = ';'; + name.insert(c, "<"); + } + else if (name[c] == '&') + { + name[c] = ';'; + name.insert(c, "&"); + } + } + } + + m_label = name; + + if (name.empty()) { m_label = "Unnamed Box"; } + + const std::string boxNameColor = "#000000"; + + if (m_constBox->getSettingCount() != 0) { m_label = ")" + m_label + ""; } + + if (m_showOriginalNameWhenModified) + { + const std::string boxOriginalName(desc ? std::string(desc->getName()) : name); + if (boxOriginalName != name) { m_label = "" + boxOriginalName + "\n" + m_label; } + } + + if (canChangeInput || canChangeOutput || canChangeSetting) + { + m_label += "\n"; + m_label += "In"; + m_label += "|Out"; + m_label += "|Set"; + m_label += ""; + } + + return m_label.c_str(); +} + +const char* CBoxProxy::getStatusLabel() const +{ + const bool toBeUpdated(m_box->hasAttribute(OV_AttributeId_Box_ToBeUpdated)); + const bool pendingDeprecatedInterfacors(m_box->hasAttribute(OV_AttributeId_Box_PendingDeprecatedInterfacors)); + const bool isDeprecated(this->isBoxAlgorithmPluginPresent() && this->isDeprecated()); + const bool isDisabled(this->isDisabled()); + + const std::string blue("#202060"); + + m_status = ""; + if (isDeprecated || toBeUpdated || isDisabled || pendingDeprecatedInterfacors) + { + m_status += R"("; + if (isDeprecated) { m_status += " deprecated"; } + if (toBeUpdated) { m_status += " update"; } + if (isDisabled) { m_status += " disabled"; } + if (pendingDeprecatedInterfacors) { m_status += " deprecated I/O/S"; } + m_status += " "; + } + return m_status.c_str(); +} + +bool CBoxProxy::isDisabled() const +{ + const TAttributeHandler handler(*m_constBox); + return handler.hasAttribute(OV_AttributeId_Box_Disabled); +} + +void CBoxProxy::updateSize(GtkWidget* widget, const char* label, const char* status, int* xSize, int* ySize) const +{ + PangoRectangle labelRect; + PangoRectangle statusRect; + PangoContext* context = gtk_widget_create_pango_context(widget); + PangoLayout* layout = pango_layout_new(context); + pango_layout_set_markup(layout, label, -1); + pango_layout_get_pixel_extents(layout, nullptr, &labelRect); + pango_layout_set_markup(layout, status, -1); + pango_layout_get_pixel_extents(layout, nullptr, &statusRect); + + if (!strlen(status)) + { + statusRect.width = 0; + statusRect.height = 0; + } + + *xSize = std::max(labelRect.width, statusRect.width); + *ySize = labelRect.height + statusRect.height; + + g_object_unref(layout); + g_object_unref(context); +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCBoxProxy.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCBoxProxy.h new file mode 100644 index 0000000..03cefb9 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCBoxProxy.h @@ -0,0 +1,59 @@ +#pragma once + +#include "ovd_base.h" + +#include + +namespace OpenViBE { +namespace Designer { +class CBoxProxy final +{ +public: + + CBoxProxy(const Kernel::IKernelContext& ctx, Kernel::IScenario& scenario, const CIdentifier& boxID); + ~CBoxProxy() { if (!m_applied) { this->apply(); } } + + operator Kernel::IBox*() const { return m_box; } + operator const Kernel::IBox*() const { return m_constBox; } + + int getWidth(GtkWidget* widget) const; + int getHeight(GtkWidget* widget) const; + + int getXCenter() const { return m_centerX; } + int getYCenter() const { return m_centerY; } + void setCenter(int x, int y); + + void setBoxAlgorithmDescriptorOverride(const Plugins::IBoxAlgorithmDesc* pBoxAlgorithmDescriptor); + + void apply(); + + const char* getLabel() const; + const char* getStatusLabel() const; + + bool isBoxAlgorithmPluginPresent() const { return m_isBoxAlgorithmPresent; } + bool isUpToDate() const { return !m_box->hasAttribute(OV_AttributeId_Box_ToBeUpdated); } + bool hasPendingDeprecatedInterfacors() const { return m_box->hasAttribute(OV_AttributeId_Box_PendingDeprecatedInterfacors); } + bool isDeprecated() const { return m_isDeprecated; } + static bool isUnstable() { return false; } + bool isDisabled() const; + bool isMetabox() const { return m_constBox->getAlgorithmClassIdentifier() == OVP_ClassId_BoxAlgorithm_Metabox; } + +protected: + + void updateSize(GtkWidget* widget, const char* label, const char* status, int* xSize, int* ySize) const; + + const Kernel::IKernelContext& m_kernelCtx; + const Plugins::IBoxAlgorithmDesc* m_boxAlgorithmDescOverride = nullptr; + const Kernel::IBox* m_constBox = nullptr; + Kernel::IBox* m_box = nullptr; + bool m_applied = false; + bool m_showOriginalNameWhenModified = false; + int m_centerX = 0; + int m_centerY = 0; + mutable std::string m_label; + mutable std::string m_status; + bool m_isBoxAlgorithmPresent = false; + bool m_isDeprecated = false; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCCommentEditorDialog.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCCommentEditorDialog.cpp new file mode 100644 index 0000000..6426d26 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCCommentEditorDialog.cpp @@ -0,0 +1,112 @@ +#include "ovdCCommentEditorDialog.h" + +#include + +namespace OpenViBE { +namespace Designer { + +static void BoldSelectionCB(GtkButton* /*button*/, gpointer data) { static_cast(data)->applyTagCB("", ""); } +static void ItalicSelectionCB(GtkButton* /*button*/, gpointer data) { static_cast(data)->applyTagCB("", ""); } +static void UnderlineCB(GtkButton* /*button*/, gpointer data) { static_cast(data)->applyTagCB("", ""); } +static void StrikethroughCB(GtkButton* /*button*/, gpointer data) { static_cast(data)->applyTagCB("", ""); } +static void MonoCB(GtkButton* /*button*/, gpointer data) { static_cast(data)->applyTagCB("", ""); } +static void SubscriptCB(GtkButton* /*button*/, gpointer data) { static_cast(data)->applyTagCB("", ""); } +static void SuperscriptCB(GtkButton* /*button*/, gpointer data) { static_cast(data)->applyTagCB("", ""); } +static void BigCB(GtkButton* /*button*/, gpointer data) { static_cast(data)->applyTagCB("", ""); } +static void SmallCB(GtkButton* /*button*/, gpointer data) { static_cast(data)->applyTagCB("", ""); } +static void RedCB(GtkButton* /*button*/, gpointer data) { static_cast(data)->applyTagCB("", ""); } +static void GreenCB(GtkButton* /*button*/, gpointer data) { static_cast(data)->applyTagCB("", ""); } +static void BlueCB(GtkButton* /*button*/, gpointer data) { static_cast(data)->applyTagCB("", ""); } +static void InfoCB(GtkButton* /*button*/, gpointer data) { static_cast(data)->infoCB(); } + +bool CCommentEditorDialog::run() +{ + bool res = false; + + m_interface = gtk_builder_new(); // glade_xml_new(m_guiFilename.toASCIIString(), "comment", nullptr); + gtk_builder_add_from_file(m_interface, m_guiFilename.toASCIIString(), nullptr); + gtk_builder_connect_signals(m_interface, nullptr); + + ::g_signal_connect(gtk_builder_get_object(m_interface, "comment_toolbutton_bold"), "clicked", G_CALLBACK(BoldSelectionCB), this); + ::g_signal_connect(gtk_builder_get_object(m_interface, "comment_toolbutton_italic"), "clicked", G_CALLBACK(ItalicSelectionCB), this); + ::g_signal_connect(gtk_builder_get_object(m_interface, "comment_toolbutton_underline"), "clicked", G_CALLBACK(UnderlineCB), this); + ::g_signal_connect(gtk_builder_get_object(m_interface, "comment_toolbutton_strikethrough"), "clicked", G_CALLBACK(StrikethroughCB), this); + ::g_signal_connect(gtk_builder_get_object(m_interface, "comment_toolbutton_mono"), "clicked", G_CALLBACK(MonoCB), this); + ::g_signal_connect(gtk_builder_get_object(m_interface, "comment_toolbutton_subscript"), "clicked", G_CALLBACK(SubscriptCB), this); + ::g_signal_connect(gtk_builder_get_object(m_interface, "comment_toolbutton_superscript"), "clicked", G_CALLBACK(SuperscriptCB), this); + ::g_signal_connect(gtk_builder_get_object(m_interface, "comment_toolbutton_big"), "clicked", G_CALLBACK(BigCB), this); + ::g_signal_connect(gtk_builder_get_object(m_interface, "comment_toolbutton_small"), "clicked", G_CALLBACK(SmallCB), this); + ::g_signal_connect(gtk_builder_get_object(m_interface, "comment_toolbutton_red"), "clicked", G_CALLBACK(RedCB), this); + ::g_signal_connect(gtk_builder_get_object(m_interface, "comment_toolbutton_green"), "clicked", G_CALLBACK(GreenCB), this); + ::g_signal_connect(gtk_builder_get_object(m_interface, "comment_toolbutton_blue"), "clicked", G_CALLBACK(BlueCB), this); + ::g_signal_connect(gtk_builder_get_object(m_interface, "comment_toolbutton_info"), "clicked", G_CALLBACK(InfoCB), this); + + m_dialog = GTK_WIDGET(gtk_builder_get_object(m_interface, "comment")); + m_desc = GTK_WIDGET(gtk_builder_get_object(m_interface, "comment-textview_description")); + + m_infoDialog = GTK_WIDGET(gtk_builder_get_object(m_interface, "messagedialog_howto_comment")); + ::g_signal_connect(m_infoDialog, "close", G_CALLBACK(gtk_widget_hide), nullptr); + ::g_signal_connect(m_infoDialog, "delete-event", G_CALLBACK(gtk_widget_hide), nullptr); + + //::g_signal_connect(GTK_WIDGET(gtk_builder_get_object(m_interface, "messagedialog_howto_comment_button_close")), "clicked", G_CALLBACK(gtk_widget_hide), nullptr); + + g_object_unref(m_interface); + + m_buffer = gtk_text_buffer_new(nullptr); + gtk_text_buffer_set_text(m_buffer, m_comment.getText().toASCIIString(), -1); + gtk_text_view_set_buffer(GTK_TEXT_VIEW(m_desc), m_buffer); + g_object_unref(m_buffer); + + gtk_widget_grab_focus(m_desc); + + const gint result = gtk_dialog_run(GTK_DIALOG(m_dialog)); + if (result == GTK_RESPONSE_APPLY) + { + res = true; + GtkTextIter start, end; + m_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(m_desc)); + gtk_text_buffer_get_start_iter(m_buffer, &start); + gtk_text_buffer_get_end_iter(m_buffer, &end); + m_comment.setText(gtk_text_buffer_get_text(m_buffer, &start, &end, TRUE)); + } + gtk_widget_destroy(m_infoDialog); + gtk_widget_destroy(m_dialog); + + return res; +} + +//----------------------------------------------------------------------------------- +void CCommentEditorDialog::applyTagCB(const char* in, const char* out) const +{ + GtkTextIter start, end; + + if (gtk_text_buffer_get_has_selection(m_buffer)) + { + gtk_text_buffer_get_selection_bounds(m_buffer, &start, &end); + gtk_text_buffer_insert(m_buffer, &start, in, gint(strlen(in))); + gtk_text_buffer_get_selection_bounds(m_buffer, &start, &end); + gtk_text_buffer_insert(m_buffer, &end, out, gint(strlen(out))); + + // reset selection to the selected text, as the tagOut is now selected + gtk_text_buffer_get_selection_bounds(m_buffer, &start, &end); + gtk_text_iter_backward_chars(&end, gint(strlen(out))); + gtk_text_buffer_select_range(m_buffer, &start, &end); + } + else + { + gtk_text_buffer_get_selection_bounds(m_buffer, &start, &end); + const gint offset = gtk_text_iter_get_offset(&start); + + gtk_text_buffer_insert_at_cursor(m_buffer, in, gint(strlen(in))); + gtk_text_buffer_insert_at_cursor(m_buffer, out, gint(strlen(out))); + + gtk_text_buffer_get_iter_at_offset(m_buffer, &start, gint(offset + strlen(in))); + gtk_text_buffer_place_cursor(m_buffer, &start); + } + + // set focus on the text, to get back in edition mode directly + gtk_widget_grab_focus(m_desc); +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCCommentEditorDialog.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCCommentEditorDialog.h new file mode 100644 index 0000000..941b17a --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCCommentEditorDialog.h @@ -0,0 +1,38 @@ +#pragma once + +#include "ovd_base.h" + +namespace OpenViBE { +namespace Designer { +class CCommentEditorDialog final +{ +public: + + CCommentEditorDialog(const Kernel::IKernelContext& ctx, Kernel::IComment& comment, const char* guiFilename) + : m_kernelCtx(ctx), m_comment(comment), m_guiFilename(guiFilename) { } + + ~CCommentEditorDialog() = default; + + bool run(); + + // Callback for text formatting + void applyTagCB(const char* in, const char* out) const; + + // help formatting pango + void infoCB() const { gtk_widget_show(m_infoDialog); } +protected: + + const Kernel::IKernelContext& m_kernelCtx; + Kernel::IComment& m_comment; + CString m_guiFilename; + + GtkBuilder* m_interface = nullptr; + GtkWidget* m_dialog = nullptr; + GtkWidget* m_infoDialog = nullptr; + GtkWidget* m_desc = nullptr; + GtkTextBuffer* m_buffer = nullptr; + + CCommentEditorDialog() = delete; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCCommentProxy.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCCommentProxy.cpp new file mode 100644 index 0000000..88090b4 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCCommentProxy.cpp @@ -0,0 +1,88 @@ +#include "ovdCCommentProxy.h" +#include "ovdTAttributeHandler.h" + +namespace OpenViBE { +namespace Designer { + +CCommentProxy::CCommentProxy(const Kernel::IKernelContext& ctx, const Kernel::IComment& comment) + : m_kernelCtx(ctx), m_constComment(&comment) +{ + if (m_constComment) + { + const TAttributeHandler handler(*m_constComment); + m_centerX = handler.getAttributeValue(OV_AttributeId_Comment_XCenterPosition); + m_centerY = handler.getAttributeValue(OV_AttributeId_Comment_YCenterPosition); + } +} + +CCommentProxy::CCommentProxy(const Kernel::IKernelContext& ctx, Kernel::IScenario& scenario, const CIdentifier& commentID) + : m_kernelCtx(ctx), m_constComment(scenario.getCommentDetails(commentID)), m_comment(scenario.getCommentDetails(commentID)) +{ + if (m_constComment) + { + const TAttributeHandler handler(*m_constComment); + m_centerX = handler.getAttributeValue(OV_AttributeId_Comment_XCenterPosition); + m_centerY = handler.getAttributeValue(OV_AttributeId_Comment_YCenterPosition); + } +} + +int CCommentProxy::getWidth(GtkWidget* widget) const +{ + int x, y; + updateSize(widget, getLabel(), &x, &y); + return x; +} + +int CCommentProxy::getHeight(GtkWidget* widget) const +{ + int x, y; + updateSize(widget, getLabel(), &x, &y); + return y; +} + +void CCommentProxy::setCenter(const int centerX, const int centerY) +{ + m_centerX = centerX; + m_centerY = centerY; + m_applied = false; +} + +void CCommentProxy::apply() +{ + if (m_comment) + { + TAttributeHandler handler(*m_comment); + + if (handler.hasAttribute(OV_AttributeId_Comment_XCenterPosition)) { handler.setAttributeValue(OV_AttributeId_Comment_XCenterPosition, m_centerX); } + else { handler.addAttribute(OV_AttributeId_Comment_XCenterPosition, m_centerX); } + + if (handler.hasAttribute(OV_AttributeId_Comment_YCenterPosition)) { handler.setAttributeValue(OV_AttributeId_Comment_YCenterPosition, m_centerY); } + else { handler.addAttribute(OV_AttributeId_Comment_YCenterPosition, m_centerY); } + m_applied = true; + } +} + +const char* CCommentProxy::getLabel() const +{ + m_label = m_constComment->getText().toASCIIString(); + return m_label.c_str(); +} + +void CCommentProxy::updateSize(GtkWidget* widget, const char* text, int* xSize, int* ySize) +{ + PangoRectangle rectangle; + PangoContext* context = gtk_widget_create_pango_context(widget); + PangoLayout* layout = pango_layout_new(context); + + pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER); + if (pango_parse_markup(text, -1, 0, nullptr, nullptr, nullptr, nullptr)) { pango_layout_set_markup(layout, text, -1); } + else { pango_layout_set_text(layout, text, -1); } + pango_layout_get_pixel_extents(layout, nullptr, &rectangle); + *xSize = rectangle.width; + *ySize = rectangle.height; + g_object_unref(layout); + g_object_unref(context); +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCCommentProxy.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCCommentProxy.h new file mode 100644 index 0000000..a2e1f40 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCCommentProxy.h @@ -0,0 +1,45 @@ +#pragma once + +#include "ovd_base.h" + +#include + +namespace OpenViBE { +namespace Designer { +class CCommentProxy final +{ +public: + + CCommentProxy(const Kernel::IKernelContext& ctx, const Kernel::IComment& comment); + CCommentProxy(const Kernel::IKernelContext& ctx, Kernel::IScenario& scenario, const CIdentifier& commentID); + ~CCommentProxy() { if (!m_applied) { this->apply(); } } + + operator Kernel::IComment*() const { return m_comment; } + operator const Kernel::IComment*() const { return m_constComment; } + + int getWidth(GtkWidget* widget) const; + int getHeight(GtkWidget* widget) const; + + int getXCenter() const { return m_centerX; } + int getYCenter() const { return m_centerY; } + + void setCenter(int centerX, int centerY); + + void apply(); + + const char* getLabel() const; + +protected: + + static void updateSize(GtkWidget* widget, const char* text, int* xSize, int* ySize); + + const Kernel::IKernelContext& m_kernelCtx; + const Kernel::IComment* m_constComment = nullptr; + Kernel::IComment* m_comment = nullptr; + bool m_applied = false; + int m_centerX = 0; + int m_centerY = 0; + mutable std::string m_label; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCConnectorEditor.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCConnectorEditor.cpp new file mode 100644 index 0000000..d831f2f --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCConnectorEditor.cpp @@ -0,0 +1,146 @@ +#include "ovdCConnectorEditor.h" + +#include +#include + +namespace OpenViBE { +namespace Designer { + +static void reset_scenario_connector_identifier(GtkWidget* /*widget*/, CConnectorEditor* self) +{ + const CIdentifier newID = self->m_Box.getUnusedInputIdentifier(CIdentifier::undefined()); + if (self->m_IDEntry && newID != CIdentifier::undefined()) { gtk_entry_set_text(self->m_IDEntry, newID.str().c_str()); } +} + +bool CConnectorEditor::run() +{ + //get_identifier_t getID; + set_name_t setName; + set_type_t setType; + is_type_supported_t isTypeSupported; + //update_identifier_t updateID; + + Kernel::EBoxInterfacorType interfacorType; + switch (m_type) + { + case Box_Input: + setName = &Kernel::IBox::setInputName; + setType = &Kernel::IBox::setInputType; + isTypeSupported = &Kernel::IBox::hasInputSupport; + interfacorType = Kernel::Input; + break; + + case Box_Output: + setName = &Kernel::IBox::setOutputName; + setType = &Kernel::IBox::setOutputType; + isTypeSupported = &Kernel::IBox::hasOutputSupport; + interfacorType = Kernel::Output; + break; + + default: + return false; + } + + CString name; + CIdentifier typeID; + CIdentifier id; + m_Box.getInterfacorIdentifier(interfacorType, m_index, id); + m_Box.getInterfacorName(interfacorType, m_index, name); + m_Box.getInterfacorType(interfacorType, m_index, typeID); + + GtkBuilder* builder = gtk_builder_new(); + gtk_builder_add_from_file(builder, m_guiFilename.c_str(), nullptr); + gtk_builder_connect_signals(builder, nullptr); + + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(builder, "connector_editor")); + GtkEntry* nameEntry = GTK_ENTRY(gtk_builder_get_object(builder, "connector_editor-connector_name_entry")); + GtkComboBox* typeComboBox = GTK_COMBO_BOX(gtk_builder_get_object(builder, "connector_editor-connector_type_combobox")); + m_IDEntry = GTK_ENTRY(gtk_builder_get_object(builder, "connector_editor-connector_identifier_entry")); + GtkButton* idResetButton = GTK_BUTTON(gtk_builder_get_object(builder, "connector_editor-connector_identifier_reset_button")); + gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(typeComboBox))); + gtk_window_set_title(GTK_WINDOW(dialog), m_title.c_str()); + + if (m_Box.getAlgorithmClassIdentifier() == CIdentifier::undefined()) + { + gtk_widget_show(GTK_WIDGET(gtk_builder_get_object(builder, "connector_editor-connector_identifier_label"))); + gtk_widget_show(GTK_WIDGET(m_IDEntry)); + gtk_widget_show(GTK_WIDGET(idResetButton)); + g_signal_connect(GTK_WIDGET(idResetButton), "clicked", G_CALLBACK(reset_scenario_connector_identifier), this); + } + + //get a list of stream types and display connector type + std::map streamTypes; + gint active = -1; + + for (const auto& currentTypeID : m_kernelCtx.getTypeManager().getSortedTypes()) + { + //First check if the type is support by the connector + if ((m_Box.*isTypeSupported)(currentTypeID.first)) + { + //If the input type is support by the connector, let's add it to the list + if (m_kernelCtx.getTypeManager().isStream(currentTypeID.first)) + { + gtk_combo_box_append_text(typeComboBox, currentTypeID.second.toASCIIString()); + if (currentTypeID.first == typeID) + { + active = gint(streamTypes.size()); + gtk_combo_box_set_active(typeComboBox, active); + } + streamTypes[currentTypeID.second.toASCIIString()] = currentTypeID.first; + } + } + } + + //display connector name + gtk_entry_set_text(nameEntry, name.toASCIIString()); + gtk_entry_set_text(m_IDEntry, id.str().c_str()); + + bool finished = false; + bool res = false; + while (!finished) + { + const gint result = gtk_dialog_run(GTK_DIALOG(dialog)); + if (result == GTK_RESPONSE_APPLY) + { + char* activeText = gtk_combo_box_get_active_text(typeComboBox); + if (activeText) + { + const auto newName = gtk_entry_get_text(nameEntry); + auto newType = streamTypes[activeText]; + const auto newIdStr = gtk_entry_get_text(m_IDEntry); + + (m_Box.*setType)(m_index, newType); + (m_Box.*setName)(m_index, newName); + + // If the connector identifier is valid then create a new one and swap it with the edited one + // this is because we can not change the identifier of a setting + CIdentifier newID; + if (newID.fromString(newIdStr) && (newID != id)) { m_Box.updateInterfacorIdentifier(interfacorType, m_index, newID); } + // (m_Box.*addConnector)(newName, newType); + finished = true; + res = true; + } + } + else if (result == 2) // revert + { + m_Box.getInterfacorName(interfacorType, m_index, name); + m_Box.getInterfacorType(interfacorType, m_index, typeID); + + gtk_entry_set_text(nameEntry, name.toASCIIString()); + gtk_combo_box_set_active(typeComboBox, active); + } + else + { + finished = true; + res = false; + } + } + + gtk_widget_destroy(dialog); + g_object_unref(builder); + + return res; +} + +} //namespace Designer +} //namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCConnectorEditor.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCConnectorEditor.h new file mode 100644 index 0000000..b5e5e6d --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCConnectorEditor.h @@ -0,0 +1,38 @@ +#pragma once + +#include "ovd_base.h" + +#include + +namespace OpenViBE { +namespace Designer { +class CConnectorEditor final +{ +public: + + CConnectorEditor(const Kernel::IKernelContext& ctx, Kernel::IBox& box, const size_t type, const size_t index, const char* title, const char* guiFilename) + : m_Box(box), m_kernelCtx(ctx), m_type(type), m_index(index), m_guiFilename(guiFilename), m_title(title ? title : "") { } + + ~CConnectorEditor() = default; + bool run(); + + Kernel::IBox& m_Box; + GtkEntry* m_IDEntry = nullptr; + +protected: + const Kernel::IKernelContext& m_kernelCtx; + size_t m_type = 0; + size_t m_index = 0; + const std::string m_guiFilename; + const std::string m_title; + + typedef bool (Kernel::IBox::*get_identifier_t)(size_t index, CIdentifier& identifier) const; + typedef bool (Kernel::IBox::*get_type_t)(size_t index, CIdentifier& typeID) const; + typedef bool (Kernel::IBox::*get_name_t)(size_t index, CString& name) const; + typedef bool (Kernel::IBox::*set_type_t)(size_t index, const CIdentifier& typeID); + typedef bool (Kernel::IBox::*set_name_t)(size_t index, const CString& name); + typedef bool (Kernel::IBox::*is_type_supported_t)(const CIdentifier& typeID) const; + typedef bool (Kernel::IBox::*update_identifier_t)(size_t index, const CIdentifier& newID); +}; +} //namespace Designer +} //namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCDesignerVisualization.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCDesignerVisualization.cpp new file mode 100644 index 0000000..25790a1 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCDesignerVisualization.cpp @@ -0,0 +1,1752 @@ +#include "ovd_base.h" +#include "ovdCDesignerVisualization.h" +#include "ovdCInterfacedScenario.h" +#include "ovdCInputDialog.h" + +#include +#include + +namespace OpenViBE { +namespace Designer { + +using EVTColumn = VisualizationToolkit::EVisualizationTreeColumn; +using EVTNode = VisualizationToolkit::EVisualizationTreeNode; +using EVTWidget = VisualizationToolkit::EVisualizationWidget; +using IVTWidget = VisualizationToolkit::IVisualizationWidget; + +static const GtkTargetEntry TARGETS[] = { { static_cast("STRING"), 0, 0 }, { static_cast("text/plain"), 0, 0 } }; + +/** + * \brief Display an error dialog + * \param[in] text text to display in the dialog + * \param[in] secondaryText additional text to display in the dialog + */ +void displayErrorDialog(const char* text, const char* secondaryText) +{ + GtkWidget* dialog = gtk_message_dialog_new(nullptr, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "%s", text); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), "%s", secondaryText); + gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); +} + +/** + * \brief Helper function retrieving a child in a table from its attach indices + * \param table Table parent to the child to be retrieved + * \param leftAttach Left attach index + * \param rightAttach Right attach index + * \param topAttach Top attach index + * \param bottomAttach Bottom attach index + * \return Pointer to table child if one was found, nullptr otherwise + */ +GtkTableChild* getTableChild(GtkTable* table, const int leftAttach, const int rightAttach, const int topAttach, const int bottomAttach) +{ + GList* list = table->children; + + do + { + GtkTableChild* pTC = static_cast(list->data); + if (pTC->left_attach == leftAttach && pTC->right_attach == rightAttach && + pTC->top_attach == topAttach && pTC->bottom_attach == bottomAttach) { return pTC; } + list = list->next; + } while (list); + + return nullptr; +} + +/** + * \brief Display a yes/no question dialog + * \param[in] pText text to display in the dialog + * \param[in] pSecondaryText additional text to display in the dialog + * \return identifier of the button pressed + */ +/* +gint displayQuestionDialog(const char* pText, const char* pSecondaryText) +{ + ::GtkWidget* dialog = gtk_message_dialog_new(nullptr, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, pText); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), pSecondaryText); + gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE); + gint ret = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + return ret; +}*/ + + +//Menus +//----- + +static char* cNewWin = const_cast("/New window"); +static char* cNewTab = const_cast("/New tab"); +static char* cRename = const_cast("/Rename"); +static char* cRemove = const_cast("/Remove"); +static char* cStockI = const_cast(""); +static char* cBlank = const_cast(""); + +static GtkItemFactoryEntry unaffectedItems[] = { + { cNewWin, cBlank, GtkItemFactoryCallback(CDesignerVisualization::askNewVisualizationWindowCB), 1, cStockI, GTK_STOCK_DND_MULTIPLE } +}; + +static GtkItemFactoryEntry visualizationWindowItems[] = { + { cNewTab, cBlank, GtkItemFactoryCallback(CDesignerVisualization::askNewVisualizationPanelCB), 1, cStockI, GTK_STOCK_DND }, + { cRename, cBlank, GtkItemFactoryCallback(CDesignerVisualization::askRenameVisualizationWindowCB), 1, cStockI, GTK_STOCK_BOLD }, + { cRemove, cBlank, GtkItemFactoryCallback(CDesignerVisualization::removeVisualizationWindowCB), 1, cStockI, GTK_STOCK_DELETE } +}; + +static GtkItemFactoryEntry visualizationPanelItems[] = { + { cRename, cBlank, GtkItemFactoryCallback(CDesignerVisualization::askRenameVisualizationPanelCB), 1, cStockI, GTK_STOCK_BOLD }, + { cRemove, cBlank, GtkItemFactoryCallback(CDesignerVisualization::removeVisualizationPanelCB), 1, cStockI, GTK_STOCK_DELETE } +}; + +static GtkItemFactoryEntry visualizationBoxItems[] = { + { cRemove, cBlank, GtkItemFactoryCallback(CDesignerVisualization::removeVisualizationWidgetCB), 1, cStockI, GTK_STOCK_DELETE } +}; + +static GtkItemFactoryEntry undefinedWidgetItems[] = { + { cRemove, cBlank, GtkItemFactoryCallback(CDesignerVisualization::removeVisualizationWidgetCB), 1, cStockI, GTK_STOCK_DELETE } +}; + +static GtkItemFactoryEntry splitWidgetItems[] = { + { cRemove, cBlank, GtkItemFactoryCallback(CDesignerVisualization::removeVisualizationWidgetCB), 1, cStockI, GTK_STOCK_DELETE } +}; + +static const gint N_UNAFFECTED_ITEMS = sizeof(unaffectedItems) / sizeof(unaffectedItems[0]); +static const gint N_VISUALIZATION_WINDOW_ITEMS = sizeof(visualizationWindowItems) / sizeof(visualizationWindowItems[0]); +static const gint N_VISUALIZATION_PANEL_ITEMS = sizeof(visualizationPanelItems) / sizeof(visualizationPanelItems[0]); +static const gint N_VISUALIZATION_BOX_ITEMS = sizeof(visualizationBoxItems) / sizeof(visualizationBoxItems[0]); +static const gint N_UNDEFINED_WIDGET_ITEMS = sizeof(undefinedWidgetItems) / sizeof(undefinedWidgetItems[0]); +static const gint N_SPLIT_WIDGET_ITEMS = sizeof(splitWidgetItems) / sizeof(splitWidgetItems[0]); + +CDesignerVisualization::~CDesignerVisualization() +{ + g_signal_handlers_disconnect_by_func(G_OBJECT(m_dialog), G_CALLBACK2(configureEventCB), this); +#ifdef HANDLE_MIN_MAX_EVENTS + g_signal_handlers_disconnect_by_func(G_OBJECT(m_dialog), G_CALLBACK2(window_state_event_cb), this); +#endif + gtk_widget_destroy(m_dialog); + + m_tree.setTreeViewCB(nullptr); +} + +void CDesignerVisualization::init(const std::string& guiFile) +{ + m_guiFile = guiFile; + + //create tree view + //---------------- + + //register towards tree store + m_tree.setTreeViewCB(this); + + m_treeView = m_tree.createTreeViewWithModel(); + + GtkTreeViewColumn* treeViewColumnName = gtk_tree_view_column_new(); + GtkCellRenderer* cellRendererIcon = gtk_cell_renderer_pixbuf_new(); + GtkCellRenderer* cellRendererName = gtk_cell_renderer_text_new(); + gtk_tree_view_column_set_title(treeViewColumnName, "Windows for current scenario"); + gtk_tree_view_column_pack_start(treeViewColumnName, cellRendererIcon, FALSE); + gtk_tree_view_column_pack_start(treeViewColumnName, cellRendererName, TRUE); + gtk_tree_view_column_set_attributes(treeViewColumnName, cellRendererIcon, "stock-id", EVTColumn::StringStockIcon, nullptr); + gtk_tree_view_column_set_attributes(treeViewColumnName, cellRendererName, "text", EVTColumn::StringName, nullptr); + //gtk_tree_view_column_set_sizing(treeViewColumnName, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_expand(treeViewColumnName, TRUE/*FALSE*/); + gtk_tree_view_column_set_resizable(treeViewColumnName, TRUE); + gtk_tree_view_column_set_min_width(treeViewColumnName, 64); + gtk_tree_view_append_column(m_treeView, treeViewColumnName); + + GtkTreeViewColumn* desc = gtk_tree_view_column_new(); + gtk_tree_view_append_column(m_treeView, desc); + + gtk_tree_view_column_set_visible(desc, 0); + gtk_tree_view_columns_autosize(GTK_TREE_VIEW(m_treeView)); + + //allow tree items to be dragged + gtk_drag_source_set(GTK_WIDGET(m_treeView), GDK_BUTTON1_MASK, TARGETS, sizeof(TARGETS) / sizeof(GtkTargetEntry), GDK_ACTION_COPY); + + //require notifications upon tree item dragging, mouse button release, active item change + g_signal_connect(G_OBJECT(m_treeView), "drag_data_get", G_CALLBACK(dragDataGetFromTreeCB), this); + g_signal_connect(G_OBJECT(m_treeView), "button-release-event", G_CALLBACK(buttonReleaseCB), this); + g_signal_connect(G_OBJECT(m_treeView), "cursor-changed", G_CALLBACK(cursorChangedCB), this); + + GTK_WIDGET_SET_FLAGS(GTK_WIDGET(m_treeView), GDK_KEY_PRESS_MASK); + g_signal_connect(G_OBJECT(m_treeView), "key-press-event", G_CALLBACK(widgetKeyPressEventCB), this); + + //create main dialog + //------------------ + m_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); + + //retrieve default window size + const size_t treeViewWidth = 200; + m_previewWindowW = size_t(m_kernelCtx.getConfigurationManager().expandAsUInteger("${Designer_UnaffectedVisualizationWindowWidth}", 400)); + m_previewWindowH = size_t(m_kernelCtx.getConfigurationManager().expandAsUInteger("${Designer_UnaffectedVisualizationWindowHeight}", 400)); + CIdentifier windowID; + //if at least one window was created, retrieve its dimensions + if (m_tree.getNextVisualizationWidgetIdentifier(windowID, EVTWidget::Window)) + { + IVTWidget* window = m_tree.getVisualizationWidget(windowID); + m_previewWindowW = window->getWidth(); + m_previewWindowH = window->getHeight(); + /* Change the way window sizes are stored in the widget + TAttributeHandler handler(*window); + m_previewWindowW = handler.getAttributeValue(OVD_AttributeId_VisualizationWindow_Width); + m_previewWindowH = handler.getAttributeValue(OVD_AttributeId_VisualizationWindow_Height); + */ + } + gtk_window_set_default_size(GTK_WINDOW(m_dialog), gint(treeViewWidth + m_previewWindowW), gint(m_previewWindowH)); + //set window title + gtk_window_set_title(GTK_WINDOW(m_dialog), " Window Manager"); + // gtk_window_set_transient_for(GTK_WINDOW(m_dialog), GTK_WINDOW(m_scenario.m_application.m_MainWindow)); + gtk_signal_connect(GTK_OBJECT(m_dialog), "configure_event", G_CALLBACK(configureEventCB), this); +#ifdef HANDLE_MIN_MAX_EVENTS + gtk_signal_connect(GTK_OBJECT(m_dialog), "window_state_event", G_CALLBACK(window_state_event_cb), this); +#endif + g_signal_connect(G_OBJECT(m_dialog), "delete-event", G_CALLBACK(deleteEventCB), this); + + //main pane : tree view to the left, widgets table to the right + m_pane = gtk_hpaned_new(); + gtk_container_add(GTK_CONTAINER(m_dialog), GTK_WIDGET(m_pane)); + + // Add a scrollview to above the treeview + + GtkWidget* scrolledWindow = gtk_scrolled_window_new(nullptr, nullptr); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledWindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(scrolledWindow), GTK_WIDGET(m_treeView)); + + //add tree view to pane + gtk_paned_add1(GTK_PANED(m_pane), GTK_WIDGET(scrolledWindow)); + + //set initial divider position + gtk_paned_set_position(GTK_PANED(m_pane), gint(treeViewWidth)); + + //create popup menus + //------------------ + m_unaffectedItemFactory = gtk_item_factory_new(GTK_TYPE_MENU, "", nullptr); + gtk_item_factory_create_items(m_unaffectedItemFactory, N_UNAFFECTED_ITEMS, unaffectedItems, this); + + m_visualizationWindowItemFactory = gtk_item_factory_new(GTK_TYPE_MENU, "", nullptr); + gtk_item_factory_create_items(m_visualizationWindowItemFactory, N_VISUALIZATION_WINDOW_ITEMS, visualizationWindowItems, this); + + m_visualizationPanelItemFactory = gtk_item_factory_new(GTK_TYPE_MENU, "", nullptr); + gtk_item_factory_create_items(m_visualizationPanelItemFactory, N_VISUALIZATION_PANEL_ITEMS, visualizationPanelItems, this); + + m_visualizationBoxItemFactory = gtk_item_factory_new(GTK_TYPE_MENU, "", nullptr); + gtk_item_factory_create_items(m_visualizationBoxItemFactory, N_VISUALIZATION_BOX_ITEMS, visualizationBoxItems, this); + + m_undefinedItemFactory = gtk_item_factory_new(GTK_TYPE_MENU, "", nullptr); + gtk_item_factory_create_items(m_undefinedItemFactory, N_UNDEFINED_WIDGET_ITEMS, undefinedWidgetItems, this); + + m_splitItemFactory = gtk_item_factory_new(GTK_TYPE_MENU, "", nullptr); + gtk_item_factory_create_items(m_splitItemFactory, N_SPLIT_WIDGET_ITEMS, splitWidgetItems, this); +} + +void CDesignerVisualization::load() +{ + m_tree.setTreeViewCB(this); + m_tree.reloadTree(); + + //if at least one window was created, retrieve its dimensions + CIdentifier id; + if (m_tree.getNextVisualizationWidgetIdentifier(id, EVTWidget::Window)) + { + IVTWidget* window = m_tree.getVisualizationWidget(id); + m_previewWindowW = window->getWidth(); + m_previewWindowH = window->getHeight(); + } + const size_t width = gtk_paned_get_position(GTK_PANED(m_pane)); + gtk_widget_set_size_request(GTK_WIDGET(m_dialog), gint(width + m_previewWindowW), gint(m_previewWindowH)); + gtk_tree_view_expand_all(m_treeView); + setActiveVisualization(m_activeVisualizationWindowName, m_activeVisualizationPanelName); +} + +void CDesignerVisualization::show() const +{ + // since gtk is asynchronous for the expose event, the m_previewWindowVisible flag is turned on in the corresponding callback + //m_previewWindowVisible = true; + gtk_widget_show_all(static_cast(m_dialog)); +} + +void CDesignerVisualization::hide() +{ + m_previewWindowVisible = false; + gtk_widget_hide_all(static_cast(m_dialog)); +} + +void CDesignerVisualization::setDeleteEventCB(visualization_delete_event_cb_t cb, gpointer data) +{ + m_deleteEventCB = cb; + m_deleteEventUserData = data; +} + +void CDesignerVisualization::onVisualizationBoxAdded(const Kernel::IBox* box) +{ + CIdentifier widgetID; + m_tree.addVisualizationWidget(widgetID, box->getName(), EVTWidget::Box, CIdentifier::undefined(), 0, box->getIdentifier(), 0, CIdentifier::undefined()); + + m_tree.reloadTree(); + + //refresh view + GtkTreeIter iter; + m_tree.findChildNodeFromRoot(&iter, widgetID); + refreshActiveVisualization(m_tree.getTreePath(&iter)); +} + +void CDesignerVisualization::onVisualizationBoxRemoved(const CIdentifier& boxID) +{ + IVTWidget* widget = m_tree.getVisualizationWidgetFromBoxIdentifier(boxID); + if (widget != nullptr) + { + //unaffected widget : delete it + if (widget->getParentIdentifier() == CIdentifier::undefined()) { m_tree.destroyHierarchy(widget->getIdentifier()); } + else { destroyVisualizationWidget(widget->getIdentifier()); } //simplify tree + + m_tree.reloadTree(); + + //refresh view + refreshActiveVisualization(nullptr); + } +} + +void CDesignerVisualization::onVisualizationBoxRenamed(const CIdentifier& boxID) +{ + //retrieve visualization widget + IVTWidget* widget = m_tree.getVisualizationWidgetFromBoxIdentifier(boxID); + if (widget != nullptr) + { + //retrieve box name + const Kernel::IBox* box = m_scenario.m_Scenario.getBoxDetails(boxID); + if (box != nullptr) + { + widget->setName(box->getName()); //set new visualization widget name + m_tree.reloadTree(); //reload tree + refreshActiveVisualization(nullptr); //refresh view + } + } +} + +void CDesignerVisualization::createTreeWidget(IVTWidget* widget) +{ + if (widget->getType() == EVTWidget::HorizontalSplit || widget->getType() == EVTWidget::VerticalSplit) + { + /* TODO_JL: Find a way to store divider position and max divider position + TAttributeHandler handler(*widget); + handler.addAttribute(OVD_AttributeId_EVisualizationWidget::DividerPosition, 1); + handler.addAttribute(OVD_AttributeId_EVisualizationWidget::MaxDividerPosition, 2); + */ + } +} + +//need width request of 0 to avoid graphical bugs (label/icon overlapping other widgets) when shrinking buttons +static const gint labelWidthRequest = 0; +static const gint iconWidthRequest = 0; +//need expand and fill flags to TRUE to see 0-size-requesting widgets +static const gboolean labelExpand = TRUE; +static const gboolean labelFill = TRUE; +static const gboolean iconExpand = TRUE; +static const gboolean iconFill = TRUE; + +GtkWidget* CDesignerVisualization::loadTreeWidget(IVTWidget* widget) +{ + GtkWidget* treeWidget = nullptr; + + //create widget + //------------- + if (widget->getType() == EVTWidget::Panel) + { + //retrieve panel index + IVTWidget* window = m_tree.getVisualizationWidget(widget->getParentIdentifier()); + if (window != nullptr) + { + size_t idx; + window->getChildIndex(widget->getIdentifier(), idx); + + //create notebook if this is the first panel + if (idx == 0) { treeWidget = gtk_notebook_new(); } + else //otherwise retrieve it from first panel + { + CIdentifier firstPanelID; + window->getChildIdentifier(0, firstPanelID); + GtkTreeIter firstPanelIter; + m_tree.findChildNodeFromRoot(&firstPanelIter, firstPanelID); + void* notebookWidget = nullptr; + m_tree.getPointerValueFromTreeIter(&firstPanelIter, notebookWidget, EVTColumn::PointerWidget); + treeWidget = static_cast(notebookWidget); + } + } + } + else if (widget->getType() == EVTWidget::VerticalSplit || widget->getType() == EVTWidget::HorizontalSplit + || widget->getType() == EVTWidget::Undefined || widget->getType() == EVTWidget::Box) + { + //tree widget = table containing event boxes + visualization widget in the center + treeWidget = GTK_WIDGET(newWidgetsTable()); + GtkWidget* currentWidget = getVisualizationWidget(treeWidget); + if (currentWidget != nullptr) { gtk_container_remove(GTK_CONTAINER(treeWidget), currentWidget); } + + if (widget->getType() == EVTWidget::VerticalSplit || widget->getType() == EVTWidget::HorizontalSplit) + { + if (gtk_widget_get_parent(treeWidget) != nullptr) { gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(treeWidget)), treeWidget); } + + //create a paned and insert it in table + GtkWidget* paned = (widget->getType() == EVTWidget::HorizontalSplit) ? gtk_hpaned_new() : gtk_vpaned_new(); + gtk_table_attach(GTK_TABLE(treeWidget), paned, 1, 2, 1, 2, GtkAttachOptions(GTK_EXPAND | GTK_SHRINK | GTK_FILL), + GtkAttachOptions(GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0); + } + else //undefined or visualization box : visualization widget is a GtkButton (left : icon, right : label) + { + if (gtk_widget_get_parent(treeWidget) != nullptr) { gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(treeWidget)), treeWidget); } + + //create a button and insert it in table + GtkWidget* button = gtk_button_new(); + gtk_widget_set_size_request(button, 0, 0); + gtk_table_attach(GTK_TABLE(treeWidget), button, 1, 2, 1, 2, GtkAttachOptions(GTK_EXPAND | GTK_SHRINK | GTK_FILL), + GtkAttachOptions(GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0); + + //box inserted in button + GtkBox* box = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_widget_set_size_request(GTK_WIDGET(box), 0, 0); + + //icon - actual icon will be loaded in endLoadTreeWidget + GtkWidget* icon = gtk_image_new_from_stock(getTreeWidgetIcon(EVTNode::Undefined), GTK_ICON_SIZE_BUTTON); + if (iconWidthRequest == 0) { gtk_widget_set_size_request(icon, 0, 0); } + gtk_box_pack_start(box, icon, iconExpand, iconFill, 0); + + //label + GtkWidget* label = gtk_label_new(static_cast(widget->getName())); + if (labelWidthRequest == 0) { gtk_widget_set_size_request(label, 0, 0); } + gtk_box_pack_start(box, label, labelExpand, labelFill, 0); + + //add box to button + gtk_container_add(GTK_CONTAINER(button), GTK_WIDGET(box)); + + //set up button as drag destination + gtk_drag_dest_set(button, GTK_DEST_DEFAULT_ALL, TARGETS, sizeof(TARGETS) / sizeof(GtkTargetEntry), GDK_ACTION_COPY); + g_signal_connect(G_OBJECT(button), "drag_data_received", G_CALLBACK(dragDataReceivedInWidgetCB), this); + + //set up button as drag source as well + gtk_drag_source_set(button, GDK_BUTTON1_MASK, TARGETS, sizeof(TARGETS) / sizeof(GtkTargetEntry), GDK_ACTION_COPY); + g_signal_connect(G_OBJECT(button), "drag_data_get", G_CALLBACK(dragDataGetFromWidgetCB), this); + + //ask for notification of some events + if (widget->getType() == EVTWidget::Box) + { + GTK_WIDGET_SET_FLAGS(button, GDK_KEY_PRESS_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); + g_signal_connect(G_OBJECT(button), "key-press-event", G_CALLBACK(widgetKeyPressEventCB), this); + g_signal_connect(G_OBJECT(button), "enter-notify-event", G_CALLBACK(widgetEnterNotifyEventCB), this); + g_signal_connect(G_OBJECT(button), "leave-notify-event", G_CALLBACK(widgetLeaveNotifyEventCB), this); + } + } + + //parent widget to its parent, if any + //----------------------------------- + IVTWidget* parentWidget = m_tree.getVisualizationWidget(widget->getParentIdentifier()); + if (parentWidget != nullptr) //visualization boxes may be unparented + { + GtkTreeIter parentIter; + m_tree.findChildNodeFromRoot(&parentIter, parentWidget->getIdentifier()); + + if (parentWidget->getType() == EVTWidget::Panel) + { + //parent widget to notebook as a new page + void* notebook = nullptr; + m_tree.getPointerValueFromTreeIter(&parentIter, notebook, EVTColumn::PointerWidget); + char* panelName = nullptr; + m_tree.getStringValueFromTreeIter(&parentIter, panelName, EVTColumn::StringName); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), treeWidget, gtk_label_new(panelName)); + } + else if (parentWidget->getType() == EVTWidget::VerticalSplit || parentWidget->getType() == EVTWidget::HorizontalSplit) + { + //insert widget in parent paned + void* parentTreeWidget = nullptr; + m_tree.getPointerValueFromTreeIter(&parentIter, parentTreeWidget, EVTColumn::PointerWidget); + + + if (parentTreeWidget != nullptr && GTK_IS_WIDGET(parentTreeWidget)) + { + GtkWidget* pParentWidget = getVisualizationWidget(GTK_WIDGET(parentTreeWidget)); + if (pParentWidget != nullptr && GTK_IS_PANED(pParentWidget)) + { + size_t idx; + if (parentWidget->getChildIndex(widget->getIdentifier(), idx)) + { + if (idx == 0) { gtk_paned_pack1(GTK_PANED(pParentWidget), treeWidget, TRUE, TRUE); } + else { gtk_paned_pack2(GTK_PANED(pParentWidget), treeWidget, TRUE, TRUE); } + } + } + } + } + } + } + + //resize widgets once they are allocated : this is the case when they are shown on an expose event + //FIXME : perform resizing only once (when it is done as many times as there are widgets in the tree here) + if (treeWidget != nullptr) { gtk_signal_connect(GTK_OBJECT(getVisualizationWidget(treeWidget)), "expose-event", G_CALLBACK(widgetExposeEventCB), this); } + + return treeWidget; +} + +void CDesignerVisualization::endLoadTreeWidget(IVTWidget* widget) +{ + //retrieve tree widget + GtkTreeIter it; + m_tree.findChildNodeFromRoot(&it, widget->getIdentifier()); + void* treeWidget = nullptr; + m_tree.getPointerValueFromTreeIter(&it, treeWidget, EVTColumn::PointerWidget); + + //get actual visualization widget + GtkWidget* vizWidget = getVisualizationWidget(static_cast(treeWidget)); + + if (widget->getType() == EVTWidget::Panel) + { + //reposition paned widget handles + resizeCB(nullptr); + } + else if (widget->getType() == EVTWidget::Undefined || widget->getType() == EVTWidget::Box) + { + if (GTK_IS_BUTTON(vizWidget) != FALSE) + { + //replace dummy icon with correct one + //----------------------------------- + //retrieve icon name from tree + char* iconString = nullptr; + m_tree.getStringValueFromTreeIter(&it, iconString, EVTColumn::StringStockIcon); + //retrieve hbox + GList* buttonChildren = gtk_container_get_children(GTK_CONTAINER(vizWidget)); + GtkContainer* box = GTK_CONTAINER(buttonChildren->data); + //remove first widget + GList* boxChildren = gtk_container_get_children(box); + gtk_container_remove(box, GTK_WIDGET(boxChildren->data)); + //create new icon + GtkWidget* icon = gtk_image_new_from_stock(iconString, GTK_ICON_SIZE_BUTTON); + if (iconWidthRequest == 0) { gtk_widget_set_size_request(icon, 0, 0); } + gtk_box_pack_start(GTK_BOX(box), icon, iconExpand, iconFill, 0); + //insert it in first position + gtk_box_reorder_child(GTK_BOX(box), icon, 0); + } + } +} + +GtkWidget* CDesignerVisualization::getTreeWidget(GtkWidget* widget) { return gtk_widget_get_parent(widget); } + +GtkWidget* CDesignerVisualization::getVisualizationWidget(GtkWidget* widget) +{ + if (GTK_IS_TABLE(widget)) { return getTableChild(GTK_TABLE(widget), 1, 2, 1, 2)->widget; } + return widget; +} + +const char* CDesignerVisualization::getTreeWidgetIcon(const EVTNode type) +{ + switch (type) + { + case EVTNode::Unaffected: return GTK_STOCK_DIALOG_QUESTION; + case EVTNode::Undefined: return GTK_STOCK_CANCEL; + case EVTNode::VisualizationWindow: return GTK_STOCK_DND_MULTIPLE; + case EVTNode::VisualizationPanel: return GTK_STOCK_DND; + case EVTNode::VisualizationBox: return GTK_STOCK_EXECUTE; //default (actual icon name may be retrieved from box descriptor) + case EVTNode::HorizontalSplit: + case EVTNode::VerticalSplit: return GTK_STOCK_ADD; + case EVTNode::VPU: + default: return ""; + } +} + +gboolean CDesignerVisualization::deleteEventCB(GtkWidget* /*widget*/, GdkEvent* /*event*/, gpointer data) +{ + return static_cast(data)->deleteEvent() ? TRUE : FALSE; +} + +bool CDesignerVisualization::deleteEvent() const +{ + if (m_deleteEventCB != nullptr) + { + m_deleteEventCB(m_deleteEventUserData); + return true; + } + + return false; +} + +#ifdef HANDLE_MIN_MAX_EVENTS +gboolean CDesignerVisualization::window_state_event_cb(GtkWidget * widget, GdkEventWindowState * event, gpointer data) +{ + //refresh widgets if window was maximized or minimized + if (event->changed_mask& GDK_WINDOW_STATE_MAXIMIZED || + event->changed_mask& GDK_WINDOW_STATE_ICONIFIED) + { + //widgets haven't been reallocated yet, perform resizing only when this happens + //gtk_signal_connect(GTK_OBJECT(gtk_paned_get_child2(GTK_PANED(m_pane))), "size-allocate", G_CALLBACK(widget_size_allocate_cb), this); + gtk_signal_connect(GTK_OBJECT(gtk_paned_get_child2(GTK_PANED(m_pane))), "expose-event", G_CALLBACK(widget_expose_cb), this); + } + + return FALSE; +} +#endif + +//event generated whenever window size changes, including when it is first created +gboolean CDesignerVisualization::configureEventCB(GtkWidget* /*widget*/, GdkEventConfigure* /*event*/, gpointer data) +{ + static_cast(data)->m_previewWindowVisible = true; + static_cast(data)->resizeCB(nullptr); + return FALSE; +} + +gboolean CDesignerVisualization::widgetExposeEventCB(GtkWidget* widget, GdkEventExpose* /*event*/, gpointer data) +{ + static_cast(data)->m_previewWindowVisible = true; + g_signal_handlers_disconnect_by_func(G_OBJECT(widget), G_CALLBACK2(CDesignerVisualization::widgetExposeEventCB), data); + static_cast(data)->resizeCB(nullptr); + return FALSE; +} + +void CDesignerVisualization::resizeCB(IVTWidget* widget) +{ + if (widget == nullptr) + { + //assign current window size to each window + GtkWidget* notebook = gtk_paned_get_child2(GTK_PANED(m_pane)); + if (notebook != nullptr) + { + CIdentifier id = CIdentifier::undefined(); + //retrieve current preview window size, if window is visible + if (m_previewWindowVisible) + { + notebook = gtk_paned_get_child2(GTK_PANED(m_pane)); + if (notebook != nullptr) + { + //update preview window dims + m_previewWindowW = notebook->allocation.width; + m_previewWindowH = notebook->allocation.height; + } + } + + while (m_tree.getNextVisualizationWidgetIdentifier(id, EVTWidget::Window)) + { + IVTWidget* window = m_tree.getVisualizationWidget(id); + + //store new dimensions + window->setWidth(m_previewWindowW); + window->setHeight(m_previewWindowH); + } + } + // else { return;} //? + + //retrieve active visualization panel + GtkTreeIter windowIt; + if (!m_tree.findChildNodeFromRoot(&windowIt, m_activeVisualizationWindowName, EVTNode::VisualizationWindow)) { return; } + GtkTreeIter panelIt = windowIt; + if (!m_tree.findChildNodeFromParent(&panelIt, m_activeVisualizationPanelName, EVTNode::VisualizationPanel)) { return; } + CIdentifier panelID; + if (!m_tree.getIdentifierFromTreeIter(&panelIt, panelID, EVTColumn::StringIdentifier)) { return; } + IVTWidget* panel = m_tree.getVisualizationWidget(panelID); + + //resize visualization panel hierarchy + if (panel != nullptr) + { + CIdentifier childID; + panel->getChildIdentifier(0, childID); + IVTWidget* childWidget = m_tree.getVisualizationWidget(childID); + if (childWidget != nullptr) { resizeCB(childWidget); } + } + } + else if (widget->getType() == EVTWidget::VerticalSplit || widget->getType() == EVTWidget::HorizontalSplit) + { + GtkTreeIter it; + if (m_tree.findChildNodeFromRoot(&it, widget->getIdentifier()) == TRUE) + { + //retrieve paned widget + void* treeWidget = nullptr; + m_tree.getPointerValueFromTreeIter(&it, treeWidget, EVTColumn::PointerWidget); + GtkWidget* paned = getVisualizationWidget(GTK_WIDGET(treeWidget)); + enablePanedSignals(paned, false); + + //retrieve paned attributes + const int handlePos = widget->getDividerPosition(); + const int maxHandlePos = widget->getMaxDividerPosition(); + + if (handlePos == std::numeric_limits::min() || maxHandlePos == std::numeric_limits::min()) + { + // these variables hadn't been initialized meaningfully before. @fixme what is the correct place to init them? + notifyPositionPaned(paned); // for now, this inits them as a side effect + } + if (maxHandlePos > 0) + { + //retrieve current maximum handle position + const int pos = GTK_IS_VPANED(paned) ? GTK_PANED(paned)->container.widget.allocation.height + : GTK_PANED(paned)->container.widget.allocation.width; + + //set new paned handle position + gtk_paned_set_position(GTK_PANED(paned), handlePos * pos / maxHandlePos); + } + + enablePanedSignals(paned, true); + + //go down child 1 + CIdentifier childID; + widget->getChildIdentifier(0, childID); + IVTWidget* childWidget = m_tree.getVisualizationWidget(childID); + if (childWidget != nullptr) { resizeCB(childWidget); } + + //go down child 2 + widget->getChildIdentifier(1, childID); + childWidget = m_tree.getVisualizationWidget(childID); + if (childWidget != nullptr) { resizeCB(childWidget); } + } + } +} + +void CDesignerVisualization::notebookPageSwitchCB(GtkNotebook* notebook, GtkNotebookPage* /*page*/, const guint pagenum, gpointer data) +{ + static_cast(data)->notebookPageSelectedCB(notebook, pagenum); +} + +gboolean CDesignerVisualization::notifyPositionPanedCB(GtkWidget* widget, GParamSpec* /*spec*/, gpointer data) +{ + static_cast(data)->notifyPositionPaned(widget); + return TRUE; +} + +//-------------------------- +//Event box table management +//-------------------------- + +void CDesignerVisualization::setupNewEventBoxTable(GtkBuilder* xml) +{ + //set up event boxes as drag targets + gtk_drag_dest_set( + GTK_WIDGET(gtk_builder_get_object(xml, "window_manager_eventbox-eventbox2")), GTK_DEST_DEFAULT_ALL, TARGETS, sizeof(TARGETS) / sizeof(GtkTargetEntry), + GDK_ACTION_COPY); + gtk_drag_dest_set( + GTK_WIDGET(gtk_builder_get_object(xml, "window_manager_eventbox-eventbox4")), GTK_DEST_DEFAULT_ALL, TARGETS, sizeof(TARGETS) / sizeof(GtkTargetEntry), + GDK_ACTION_COPY); + gtk_drag_dest_set( + GTK_WIDGET(gtk_builder_get_object(xml, "window_manager_eventbox-eventbox6")), GTK_DEST_DEFAULT_ALL, TARGETS, sizeof(TARGETS) / sizeof(GtkTargetEntry), + GDK_ACTION_COPY); + gtk_drag_dest_set( + GTK_WIDGET(gtk_builder_get_object(xml, "window_manager_eventbox-eventbox8")), GTK_DEST_DEFAULT_ALL, TARGETS, sizeof(TARGETS) / sizeof(GtkTargetEntry), + GDK_ACTION_COPY); + + //set up event boxes callbacks for drag data received events + char buf[256]; + sprintf(buf, "%p %s", this, "top"); + m_topEventBoxData = buf; + g_signal_connect(G_OBJECT(gtk_builder_get_object(xml, "window_manager_eventbox-eventbox2")), "drag_data_received", G_CALLBACK(dataReceivedInEventBoxCB), + gpointer(m_topEventBoxData.c_str())); + sprintf(buf, "%p %s", this, "left"); + m_leftEventBoxData = buf; + g_signal_connect(G_OBJECT(gtk_builder_get_object(xml, "window_manager_eventbox-eventbox4")), "drag_data_received", G_CALLBACK(dataReceivedInEventBoxCB), + gpointer(m_leftEventBoxData.c_str())); + sprintf(buf, "%p %s", this, "right"); + m_rightEventBoxData = buf; + g_signal_connect(G_OBJECT(gtk_builder_get_object(xml, "window_manager_eventbox-eventbox6")), "drag_data_received", G_CALLBACK(dataReceivedInEventBoxCB), + gpointer(m_rightEventBoxData.c_str())); + sprintf(buf, "%p %s", this, "bottom"); + m_bottomEventBoxData = buf; + g_signal_connect(G_OBJECT(gtk_builder_get_object(xml, "window_manager_eventbox-eventbox8")), "drag_data_received", G_CALLBACK(dataReceivedInEventBoxCB), + gpointer(m_bottomEventBoxData.c_str())); +} + +void CDesignerVisualization::refreshActiveVisualization(GtkTreePath* selectedItemPath) +{ + //show tree + gtk_tree_view_expand_all(m_treeView); + + //select item + if (selectedItemPath != nullptr) { gtk_tree_view_set_cursor(m_treeView, selectedItemPath, nullptr, false); } + else //select previous visualization tab again (or another tab if it doesn't exist anymore) + { + setActiveVisualization(m_activeVisualizationWindowName, m_activeVisualizationPanelName); + } +} + +void CDesignerVisualization::setActiveVisualization(const char* activeWindow, const char* activePanel) +{ + //clear active window/panel names + m_activeVisualizationWindowName = ""; + m_activeVisualizationPanelName = ""; + + //retrieve active window + GtkTreeIter windowIter; + + if (m_tree.findChildNodeFromRoot(&windowIter, activeWindow, EVTNode::VisualizationWindow)) { m_activeVisualizationWindowName = CString(activeWindow); } + else + { + //pick first window if previously active window doesn't exist anymore + CIdentifier id = CIdentifier::undefined(); + + if (m_tree.getNextVisualizationWidgetIdentifier(id, EVTWidget::Window)) + { + m_activeVisualizationWindowName = m_tree.getVisualizationWidget(id)->getName(); + m_tree.findChildNodeFromRoot(&windowIter, m_activeVisualizationWindowName.toASCIIString(), EVTNode::VisualizationWindow); + } + else //no windows left + { + if (gtk_paned_get_child2(GTK_PANED(m_pane)) != nullptr) { gtk_container_remove(GTK_CONTAINER(m_pane), gtk_paned_get_child2(GTK_PANED(m_pane))); } + return; + } + } + + //retrieve active panel + GtkTreeIter panelIter = windowIter; + if (m_tree.findChildNodeFromParent(&panelIter, activePanel, EVTNode::VisualizationPanel)) { m_activeVisualizationPanelName = CString(activePanel); } + else //couldn't find panel : select first one + { + CIdentifier windowID; + m_tree.getIdentifierFromTreeIter(&windowIter, windowID, EVTColumn::StringIdentifier); + IVTWidget* window = m_tree.getVisualizationWidget(windowID); + CIdentifier panelID; + if (window->getChildIdentifier(0, panelID)) + { + panelIter = windowIter; + m_tree.findChildNodeFromParent(&panelIter, panelID); + char* str = nullptr; + m_tree.getStringValueFromTreeIter(&panelIter, str, EVTColumn::StringName); + m_activeVisualizationPanelName = str; + } + else //no panel in window + { + GtkWidget* currentNotebook = gtk_paned_get_child2(GTK_PANED(m_pane)); + if (currentNotebook != nullptr) + { + gtk_object_ref(GTK_OBJECT(currentNotebook)); + gtk_container_remove(GTK_CONTAINER(m_pane), currentNotebook); + } + return; + } + } + + //retrieve notebook and set it visible + void* notebook = nullptr; + m_tree.getPointerValueFromTreeIter(&panelIter, notebook, EVTColumn::PointerWidget); + GtkWidget* widget = gtk_paned_get_child2(GTK_PANED(m_pane)); + if (widget != GTK_WIDGET(notebook)) + { + if (widget != nullptr) + { + //FIXME : don't ref previous notebook if parent window doesn't exist anymore + gtk_object_ref(GTK_OBJECT(widget)); + gtk_container_remove(GTK_CONTAINER(m_pane), widget); + } + gtk_paned_add2(GTK_PANED(m_pane), GTK_WIDGET(notebook)); + //gtk_object_unref(currentNotebook); + } + + //disable switch page notifications + enableNotebookSignals(GTK_WIDGET(notebook), false); + + //set active panel visible + int i; + for (i = 0; i < gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)); ++i) + { + if (strcmp(gtk_notebook_get_tab_label_text(GTK_NOTEBOOK(notebook), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), i)), + m_activeVisualizationPanelName) == 0) + { + gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), i); + break; + } + } + + //if active page couldn't be found + if (i == gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook))) + { + //error! + //pick first page if it exists + if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)) > 0) + { + m_activeVisualizationPanelName = gtk_notebook_get_tab_label_text(GTK_NOTEBOOK(notebook), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), 0)); + gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 0); + } + else //error : no pages in notebook, clear panel name + { + m_activeVisualizationPanelName = ""; + } + } + + //enable switch page notifications + enableNotebookSignals(GTK_WIDGET(notebook), true); + + //refresh display + gtk_widget_show_all(m_pane); +} + +//creates a new widgets table and sets it as current +GtkTable* CDesignerVisualization::newWidgetsTable() +{ + //@FIXME is the memory ever freed? Valgrind is suspicious about this. It seems that a builder is allocated, but only a member of builder is returned as GtkTable*. + GtkBuilder* pGtkBuilderTable = gtk_builder_new(); // glade_xml_new(m_guiFile.c_str(), "window_manager_eventbox-table", nullptr); + gtk_builder_add_from_file(pGtkBuilderTable, m_guiFile.c_str(), nullptr); + gtk_builder_connect_signals(pGtkBuilderTable, nullptr); + + //set up event boxes + setupNewEventBoxTable(pGtkBuilderTable); + + GtkTable* table = GTK_TABLE(gtk_builder_get_object(pGtkBuilderTable, "window_manager_eventbox-table")); + + //clear central button label + GtkTableChild* tc = getTableChild(table, 1, 2, 1, 2); + GtkButton* button = GTK_BUTTON(tc->widget); + gtk_button_set_label(button, ""); + + //set it up as drag destination + gtk_drag_dest_set(GTK_WIDGET(button), GTK_DEST_DEFAULT_ALL, TARGETS, sizeof(TARGETS) / sizeof(GtkTargetEntry), GDK_ACTION_COPY); + g_signal_connect(G_OBJECT(button), "drag_data_received", G_CALLBACK(dragDataReceivedInWidgetCB), this); + + //set it up as drag source as well + gtk_drag_source_set(GTK_WIDGET(button), GDK_BUTTON1_MASK, TARGETS, sizeof(TARGETS) / sizeof(GtkTargetEntry), GDK_ACTION_COPY); + g_signal_connect(G_OBJECT(button), "drag_data_get", G_CALLBACK(dragDataGetFromWidgetCB), this); + + return table; +} + +void CDesignerVisualization::askNewVisualizationWindow() +{ + //show dialog + CInputDialog id(m_guiFile.c_str(), &CDesignerVisualization::newVisualizationWindowCB, this, "New window", "Please enter name of new window : "); + id.run(); +} + +bool CDesignerVisualization::newVisualizationWindow(const char* label) +{ + //ensure name is unique + IVTWidget* window; + CIdentifier windowID = CIdentifier::undefined(); + + while (m_tree.getNextVisualizationWidgetIdentifier(windowID, EVTWidget::Window)) + { + window = m_tree.getVisualizationWidget(windowID); + + if (strcmp(window->getName().toASCIIString(), label) == 0) + { + displayErrorDialog("Window creation failed !", "An existing window already uses this name. Please choose another name."); + return false; + } + } + + //proceed with window creation + //m_visualizationTree.addVisualizationWindow(windowID, CString(label)); + m_tree.addVisualizationWidget(windowID, CString(label), EVTWidget::Window, CIdentifier::undefined(), 0, CIdentifier::undefined(), 0, + CIdentifier::undefined()); + + window = m_tree.getVisualizationWidget(windowID); + + //add attributes + window->setWidth(1); + window->setHeight(1); + + //create default visualization panel as well + CIdentifier childID; + const CString childName = "Default tab"; + + m_tree.addVisualizationWidget(childID, childName, EVTWidget::Panel, windowID, 0, CIdentifier::undefined(), 1, CIdentifier::undefined()); + + m_tree.reloadTree(); + + //refresh view + GtkTreeIter childIter; + m_tree.findChildNodeFromRoot(&childIter, childID); + refreshActiveVisualization(m_tree.getTreePath(&childIter)); + + return true; +} + +void CDesignerVisualization::askRenameVisualizationWindow() +{ + //show dialog + CInputDialog id(m_guiFile.c_str(), &CDesignerVisualization::renameVisualizationWindowCB, this, "Rename window", "Please enter new name of window : "); + + id.run(); +} + +bool CDesignerVisualization::renameVisualizationWindow(const char* label) +{ + //retrieve visualization window + GtkTreeIter iter; + if (!m_tree.findChildNodeFromRoot(&iter, m_activeVisualizationWindowName, EVTNode::VisualizationWindow)) + { + displayErrorDialog("Window renaming failed !", "Couldn't retrieve window."); + return false; + } + + CIdentifier windowID; + m_tree.getIdentifierFromTreeIter(&iter, windowID, EVTColumn::StringIdentifier); + IVTWidget* window = m_tree.getVisualizationWidget(windowID); + if (window == nullptr) + { + displayErrorDialog("Window renaming failed !", "Couldn't retrieve window."); + return false; + } + + //if trying to set identical name, return + const CString newName = label; + if (window->getName() == newName) { return true; } + + //ensure name is unique + CIdentifier id = CIdentifier::undefined(); + while (m_tree.getNextVisualizationWidgetIdentifier(id, EVTWidget::Window)) + { + //name already in use : warn user + if (m_tree.getVisualizationWidget(id)->getName() == newName) + { + displayErrorDialog("Window renaming failed !", "An existing window already uses this name. Please choose another name."); + return false; + } + } + + //change its name + window->setName(newName); + + m_tree.reloadTree(); + + //refresh view + m_tree.findChildNodeFromRoot(&iter, windowID); + refreshActiveVisualization(m_tree.getTreePath(&iter)); + + return true; +} + +bool CDesignerVisualization::removeVisualizationWindow() +{ + //retrieve visualization window + CIdentifier windowID = CIdentifier::undefined(); + while (m_tree.getNextVisualizationWidgetIdentifier(windowID, EVTWidget::Window)) + { + if (m_tree.getVisualizationWidget(windowID)->getName() == m_activeVisualizationWindowName) { break; } + } + + //return if window was not found + if (windowID == CIdentifier::undefined()) + { + displayErrorDialog("Window removal failed !", "Couldn't retrieve window."); + return false; + } + + //destroy hierarchy but only unaffect visualization boxes + m_tree.destroyHierarchy(windowID, false); + + m_tree.reloadTree(); + + //refresh view + refreshActiveVisualization(nullptr); + + return true; +} + +void CDesignerVisualization::askNewVisualizationPanel() +{ + //show dialog + CInputDialog id(m_guiFile.c_str(), &CDesignerVisualization::newVisualizationPanelCB, this, "New tab", "Please enter name of new tab : "); + + id.run(); +} + +bool CDesignerVisualization::newVisualizationPanel(const char* label) +{ + //retrieve visualization window + IVTWidget* window = nullptr; + CIdentifier windowID = CIdentifier::undefined(); + + while (m_tree.getNextVisualizationWidgetIdentifier(windowID, EVTWidget::Window)) + { + window = m_tree.getVisualizationWidget(windowID); + if (window->getName() == m_activeVisualizationWindowName) { break; } + } + + //return if parent window was not found + if (windowID == CIdentifier::undefined() || window == nullptr) + { + displayErrorDialog("Tab creation failed !", "Couldn't retrieve parent window."); + return false; + } + + CIdentifier childID; + const CString newName = label; + + //ensure visualization panel name is unique in this window + for (size_t i = 0; i < window->getNbChildren(); ++i) + { + window->getChildIdentifier(i, childID); + if (m_tree.getVisualizationWidget(childID)->getName() == newName) + { + displayErrorDialog("Tab creation failed !", "An existing tab already uses this name. Please choose another name."); + return false; + } + } + + //proceed with panel creation + m_tree.addVisualizationWidget(childID, newName, EVTWidget::Panel, windowID, window->getNbChildren(), CIdentifier::undefined(), 1, + CIdentifier::undefined()); + + m_tree.reloadTree(); + + //refresh view + GtkTreeIter iter; + m_tree.findChildNodeFromRoot(&iter, childID); + refreshActiveVisualization(m_tree.getTreePath(&iter)); + + return true; +} + +void CDesignerVisualization::askRenameVisualizationPanel() +{ + //show dialog + CInputDialog id(m_guiFile.c_str(), &CDesignerVisualization::renameVisualizationPanelCB, this, "Rename tab", "Please enter new name of tab : "); + + id.run(); +} + +bool CDesignerVisualization::renameVisualizationPanel(const char* label) +{ + //retrieve visualization window + GtkTreeIter iter; + if (!m_tree.findChildNodeFromRoot(&iter, m_activeVisualizationWindowName.toASCIIString(), EVTNode::VisualizationWindow) + ) + { + displayErrorDialog("Tab renaming failed !", "Couldn't retrieve parent window."); + return false; + } + CIdentifier windowID; + m_tree.getIdentifierFromTreeIter(&iter, windowID, EVTColumn::StringIdentifier); + IVTWidget* window = m_tree.getVisualizationWidget(windowID); + if (window == nullptr) + { + displayErrorDialog("Tab renaming failed !", "Couldn't retrieve parent window."); + return false; + } + + //retrieve visualization panel + if (!m_tree.findChildNodeFromParent(&iter, m_activeVisualizationPanelName.toASCIIString(), EVTNode::VisualizationPanel)) + { + displayErrorDialog("Tab renaming failed !", "Couldn't retrieve tab."); + return false; + } + + CIdentifier panelID; + m_tree.getIdentifierFromTreeIter(&iter, panelID, EVTColumn::StringIdentifier); + IVTWidget* widget = m_tree.getVisualizationWidget(panelID); + if (widget == nullptr) + { + displayErrorDialog("tab renaming failed !", "Couldn't retrieve tab."); + return false; + } + + //if trying to set identical name, return + const CString newName = label; + if (widget->getName() == newName) { return true; } + + //ensure visualization panel name is unique in this window + CIdentifier childID; + for (size_t i = 0; i < window->getNbChildren(); ++i) + { + window->getChildIdentifier(i, childID); + if (m_tree.getVisualizationWidget(childID)->getName() == newName) + { + displayErrorDialog("Tab renaming failed !", "An existing tab already uses this name. Please choose another name."); + return false; + } + } + + widget->setName(newName); + + m_tree.reloadTree(); + + //refresh view + m_tree.findChildNodeFromRoot(&iter, panelID); + refreshActiveVisualization(m_tree.getTreePath(&iter)); + + return true; +} + +bool CDesignerVisualization::removeVisualizationPanel() +{ + //retrieve visualization window + GtkTreeIter iter; + m_tree.findChildNodeFromRoot(&iter, m_activeVisualizationWindowName.toASCIIString(), EVTNode::VisualizationWindow); + + //retrieve visualization panel + m_tree.findChildNodeFromParent(&iter, m_activeVisualizationPanelName.toASCIIString(), EVTNode::VisualizationPanel); + CIdentifier panelID; + m_tree.getIdentifierFromTreeIter(&iter, panelID, EVTColumn::StringIdentifier); + + //destroy hierarchy but only unaffect visualization boxes (as opposed to destroying them) + if (!m_tree.destroyHierarchy(m_tree.getVisualizationWidget(panelID)->getIdentifier(), false)) + { + displayErrorDialog("Tab removal failed !", "An error occurred while destroying widget hierarchy."); + return false; + } + + m_tree.reloadTree(); + + //refresh view + refreshActiveVisualization(nullptr); + + return true; +} + +bool CDesignerVisualization::removeVisualizationWidget() +{ + //retrieve widget + GtkTreeIter iter; + if (!m_tree.getTreeSelection(m_treeView, &iter)) { return false; } + CIdentifier id; + m_tree.getIdentifierFromTreeIter(&iter, id, EVTColumn::StringIdentifier); + return removeVisualizationWidget(id); +} + +//TODO : move this to CVisualizationTree? +bool CDesignerVisualization::removeVisualizationWidget(const CIdentifier& identifier) +{ + IVTWidget* widget = m_tree.getVisualizationWidget(identifier); + if (widget == nullptr) { return false; } + + IVTWidget* parentWidget = m_tree.getVisualizationWidget(widget->getParentIdentifier()); + + //unparent or destroy widget + size_t idx; + m_tree.unparentVisualizationWidget(identifier, idx); + if (widget->getType() != EVTWidget::Box) { m_tree.destroyHierarchy(identifier, false); } + + //reparent other child widget, if any + if (parentWidget->getType() != EVTWidget::Panel) + { + //retrieve parent's other widget + CIdentifier otherWidgetID; + parentWidget->getChildIdentifier(1 - idx, otherWidgetID); + + //unparent parent + size_t parentIdx; + const CIdentifier parentID = parentWidget->getParentIdentifier(); + m_tree.unparentVisualizationWidget(parentWidget->getIdentifier(), parentIdx); + + //reparent other widget to its grandparent + m_tree.unparentVisualizationWidget(otherWidgetID, idx); + m_tree.parentVisualizationWidget(otherWidgetID, parentID, parentIdx); + + //destroy parent + m_tree.destroyHierarchy(parentWidget->getIdentifier(), false); + } + + m_tree.reloadTree(); + + //refresh view + refreshActiveVisualization(nullptr); + + return true; +} + +bool CDesignerVisualization::destroyVisualizationWidget(const CIdentifier& identifier) +{ + const bool b = removeVisualizationWidget(identifier); + m_tree.destroyHierarchy(identifier, true); + return b; +} + +//CALLBACKS +//--------- + +void CDesignerVisualization::notebookPageSelectedCB(GtkNotebook* notebook, const guint pagenum) +{ + GtkTreeIter iter; + m_tree.findChildNodeFromRoot(&iter, static_cast(notebook)); + CIdentifier id; + m_tree.getIdentifierFromTreeIter(&iter, id, EVTColumn::StringIdentifier); + IVTWidget* widget = m_tree.getVisualizationWidget(id); + if (widget != nullptr) + { + IVTWidget* window = m_tree.getVisualizationWidget(widget->getParentIdentifier()); + if (window != nullptr) + { + window->getChildIdentifier(pagenum, id); + if (m_tree.findChildNodeFromRoot(&iter, id)) { refreshActiveVisualization(m_tree.getTreePath(&iter)); } + } + } +} + +void CDesignerVisualization::enableNotebookSignals(GtkWidget* notebook, const bool b) +{ + if (b) { g_signal_connect(G_OBJECT(notebook), "switch-page", G_CALLBACK(notebookPageSwitchCB), this); } + else { g_signal_handlers_disconnect_by_func(G_OBJECT(notebook), G_CALLBACK2(notebookPageSwitchCB), this); } +} + +void CDesignerVisualization::notifyPositionPaned(GtkWidget* widget) +{ + GtkPaned* paned = GTK_PANED(widget); + + //return if handle pos was changed because parent window was resized + const int pos = gtk_paned_get_position(paned); + const int maxPos = GTK_IS_VPANED(paned) ? paned->container.widget.allocation.height : paned->container.widget.allocation.width; + const int handleThickness = GTK_IS_VPANED(paned) ? paned->handle_pos.height : paned->handle_pos.width; + + if (pos + handleThickness == maxPos) { return; } + + //look for widget in tree + GtkWidget* treeWidget = getTreeWidget(widget); + GtkTreeIter iter; + if (m_tree.findChildNodeFromRoot(&iter, treeWidget)) + { + CIdentifier id; + m_tree.getIdentifierFromTreeIter(&iter, id, EVTColumn::StringIdentifier); + + //store new position and max position + auto* visualizationWidget = m_tree.getVisualizationWidget(id); + visualizationWidget->setDividerPosition(pos); + visualizationWidget->setMaxDividerPosition(maxPos); + } +} + +void CDesignerVisualization::enablePanedSignals(GtkWidget* paned, const bool b) +{ + if (b) { g_signal_connect(G_OBJECT(paned), "notify::position", G_CALLBACK(notifyPositionPanedCB), this); } + else { g_signal_handlers_disconnect_by_func(G_OBJECT(paned), G_CALLBACK2(notifyPositionPanedCB), this); } +} + +void CDesignerVisualization::askNewVisualizationWindowCB(gpointer data, guint /*callback_action*/, GtkWidget* /*widget*/) +{ + static_cast(data)->askNewVisualizationWindow(); +} + +void CDesignerVisualization::newVisualizationWindowCB(GtkWidget* /*widget*/, gpointer data) +{ + CInputDialog* inputDialog = static_cast(data); + + if (inputDialog->getUserData() != nullptr) + { + static_cast(inputDialog->getUserData())->newVisualizationWindow(inputDialog->getEntry()); + } +} + +void CDesignerVisualization::askRenameVisualizationWindowCB(gpointer data, guint /*callback_action*/, GtkWidget* /*widget*/) +{ + static_cast(data)->askRenameVisualizationWindow(); +} + +void CDesignerVisualization::renameVisualizationWindowCB(GtkWidget* /*widget*/, gpointer data) +{ + CInputDialog* inputDialog = static_cast(data); + + if (inputDialog->getUserData() != nullptr) + { + static_cast(inputDialog->getUserData())->renameVisualizationWindow(inputDialog->getEntry()); + } +} + +void CDesignerVisualization::removeVisualizationWindowCB(gpointer data, guint /*action*/, GtkWidget* /*widget*/) +{ + static_cast(data)->removeVisualizationWindow(); +} + +void CDesignerVisualization::askNewVisualizationPanelCB(gpointer data, guint /*action*/, GtkWidget* /*widget*/) +{ + static_cast(data)->askNewVisualizationPanel(); +} + +void CDesignerVisualization::newVisualizationPanelCB(GtkWidget* /*widget*/, gpointer data) +{ + auto* inputDialog = static_cast(data); + + if (inputDialog->getUserData() != nullptr) + { + static_cast(inputDialog->getUserData())->newVisualizationPanel(inputDialog->getEntry()); + } +} + +void CDesignerVisualization::askRenameVisualizationPanelCB(gpointer data, guint /*action*/, GtkWidget* /*widget*/) +{ + static_cast(data)->askRenameVisualizationPanel(); +} + +void CDesignerVisualization::renameVisualizationPanelCB(GtkWidget* /*widget*/, gpointer data) +{ + auto* inputDialog = static_cast(data); + + if (inputDialog->getUserData() != nullptr) + { + static_cast(inputDialog->getUserData())->renameVisualizationPanel(inputDialog->getEntry()); + } +} + +void CDesignerVisualization::removeVisualizationPanelCB(gpointer data, guint /*action*/, GtkWidget* /*widget*/) +{ + static_cast(data)->removeVisualizationPanel(); +} + +void CDesignerVisualization::removeVisualizationWidgetCB(gpointer data, guint /*action*/, GtkWidget* /*widget*/) +{ + static_cast(data)->removeVisualizationWidget(); +} + +void CDesignerVisualization::widgetKeyPressEventCB(GtkWidget* widget, GdkEventKey* event, gpointer data) +{ + static_cast(data)->widgetKeyPressEvent(widget, event); +} + +void CDesignerVisualization::widgetKeyPressEvent(GtkWidget* /*widget*/, GdkEventKey* event) +{ + //remove widget + if (event->keyval == GDK_Delete || event->keyval == GDK_KP_Delete) + { + if (m_highlightedWidget != nullptr) + { + GtkTreeIter iter; + if (m_tree.findChildNodeFromRoot(&iter, getTreeWidget(m_highlightedWidget))) + { + CIdentifier id; + m_tree.getIdentifierFromTreeIter(&iter, id, EVTColumn::StringIdentifier); + removeVisualizationWidget(id); + } + } + } +} + +gboolean CDesignerVisualization::widgetEnterNotifyEventCB(GtkWidget* widget, GdkEventCrossing* event, gpointer data) +{ + static_cast(data)->widgetEnterNotifyEvent(widget, event); + return FALSE; +} + +void CDesignerVisualization::widgetEnterNotifyEvent(GtkWidget* widget, GdkEventCrossing* /*event*/) { m_highlightedWidget = widget; } + +gboolean CDesignerVisualization::widgetLeaveNotifyEventCB(GtkWidget* widget, GdkEventCrossing* event, gpointer data) +{ + static_cast(data)->widgetLeaveNotifyEvent(widget, event); + return FALSE; +} + +void CDesignerVisualization::widgetLeaveNotifyEvent(GtkWidget* /*widget*/, GdkEventCrossing* /*event*/) { m_highlightedWidget = nullptr; } + +gboolean CDesignerVisualization::buttonReleaseCB(GtkWidget* widget, GdkEventButton* event, gpointer data) +{ + static_cast(data)->buttonRelease(widget, event); + return FALSE; +} + +void CDesignerVisualization::buttonRelease(GtkWidget* widget, GdkEventButton* event) const +{ + if (GTK_IS_TREE_VIEW(widget)) + { + if (event->button == 3) //right button + { + if (event->type != GDK_BUTTON_PRESS) + { + GtkTreeIter it; + + if (!m_tree.getTreeSelection(m_treeView, &it)) { return; } + + const EVTNode type = EVTNode(m_tree.getULongValueFromTreeIter(&it, EVTColumn::ULongNodeType)); + + if (type == EVTNode::Unaffected) + { + gtk_menu_popup(GTK_MENU(gtk_item_factory_get_widget(m_unaffectedItemFactory, "")), + nullptr, nullptr, nullptr, nullptr, event->button, event->time); + } + else if (type == EVTNode::VisualizationWindow) + { + gtk_menu_popup(GTK_MENU(gtk_item_factory_get_widget(m_visualizationWindowItemFactory, "")), + nullptr, nullptr, nullptr, nullptr, event->button, event->time); + } + else if (type == EVTNode::VisualizationPanel) + { + gtk_menu_popup(GTK_MENU(gtk_item_factory_get_widget(m_visualizationPanelItemFactory, "")), + nullptr, nullptr, nullptr, nullptr, event->button, event->time); + } + else if (type == EVTNode::HorizontalSplit || type == EVTNode::VerticalSplit) + { + gtk_menu_popup(GTK_MENU(gtk_item_factory_get_widget(m_splitItemFactory, "")), + nullptr, nullptr, nullptr, nullptr, event->button, event->time); + } + else if (type == EVTNode::VisualizationBox) + { + //ensure visualization box is parented to a tab + if (m_tree.findParentNode(&it, EVTNode::VisualizationPanel)) + { + gtk_menu_popup(GTK_MENU(gtk_item_factory_get_widget(m_visualizationBoxItemFactory, "")), + nullptr, nullptr, nullptr, nullptr, event->button, event->time); + } + } + else if (type == EVTNode::Undefined) + { + //ensure empty plugin is not parented to a panel (because an empty widget is always present in an empty panel) + CIdentifier id; + m_tree.getIdentifierFromTreeIter(&it, id, EVTColumn::StringIdentifier); + IVTWidget* visuWidget = m_tree.getVisualizationWidget(id); + if (visuWidget != nullptr) + { + IVTWidget* parentVisuWidget = m_tree.getVisualizationWidget(visuWidget->getParentIdentifier()); + if (parentVisuWidget != nullptr) + { + if (parentVisuWidget->getType() != EVTWidget::Panel) + { + gtk_menu_popup(GTK_MENU(gtk_item_factory_get_widget(m_undefinedItemFactory, "")), + nullptr, nullptr, nullptr, nullptr, event->button, event->time); + } + } + } + } + } + } + } +} + +void CDesignerVisualization::cursorChangedCB(GtkTreeView* treeView, gpointer data) { static_cast(data)->cursorChanged(treeView); } + +void CDesignerVisualization::cursorChanged(GtkTreeView* treeView) +{ + //retrieve selection + GtkTreeIter selectionIt; + if (!m_tree.getTreeSelection(treeView, &selectionIt)) { return; } + + //save active item + if (m_tree.getULongValueFromTreeIter(&selectionIt, EVTColumn::ULongNodeType) == size_t(EVTNode::VisualizationBox)) + { + m_tree.getIdentifierFromTreeIter(&selectionIt, m_activeVisualizationBoxID, EVTColumn::StringIdentifier); + } + + GtkTreeIter panelIt = selectionIt; + + //if selection lies in a visualization panel subtree, display this subtree + if (m_tree.findParentNode(&panelIt, EVTNode::VisualizationPanel)) + { + //get visualization panel name + char* panelName = nullptr; + m_tree.getStringValueFromTreeIter(&panelIt, panelName, EVTColumn::StringName); + + //retrieve visualization window that contains selection + GtkTreeIter windowIt = panelIt; + if (m_tree.findParentNode(&windowIt, EVTNode::VisualizationWindow)) + { + //get its name + char* windowName = nullptr; + m_tree.getStringValueFromTreeIter(&windowIt, windowName, EVTColumn::StringName); + + //set active visualization + setActiveVisualization(windowName, panelName); + } + } + else + { + GtkTreeIter windowIt = selectionIt; + + //if selection is a visualization window, display it + if (m_tree.findParentNode(&windowIt, EVTNode::VisualizationWindow)) + { + //retrieve visualization window + CIdentifier windowID; + m_tree.getIdentifierFromTreeIter(&windowIt, windowID, EVTColumn::StringIdentifier); + IVTWidget* window = m_tree.getVisualizationWidget(windowID); + + //if window has at least one panel + if (window->getNbChildren() > 0) + { + //retrieve first panel + CIdentifier panelID; + window->getChildIdentifier(0, panelID); + m_tree.findChildNodeFromParent(&panelIt, panelID); + + //retrieve notebook + void* notebook = nullptr; + m_tree.getPointerValueFromTreeIter(&panelIt, notebook, EVTColumn::PointerWidget); + + //get label of its active tab + GtkWidget* pageLabel = gtk_notebook_get_tab_label( + GTK_NOTEBOOK(notebook), gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)))); + + //set active visualization + if (pageLabel != nullptr) { setActiveVisualization(window->getName().toASCIIString(), gtk_label_get_text(GTK_LABEL(pageLabel))); } + else { setActiveVisualization(window->getName().toASCIIString(), nullptr); } + } + else //window has no panels + { + setActiveVisualization(window->getName().toASCIIString(), nullptr); + } + } + else + { + //refresh active visualization (GtkWidgets may have changed if tree was reloaded) + setActiveVisualization(m_activeVisualizationWindowName, m_activeVisualizationPanelName); + } + } +} + +void CDesignerVisualization::dragDataGetFromTreeCB(GtkWidget* srcWidget, GdkDragContext* /*dc*/, GtkSelectionData* selection, + guint /*info*/, guint /*time*/, gpointer /*data*/) +{ + char str[1024]; + sprintf(str, "%p", srcWidget); + gtk_selection_data_set_text(selection, str, gint(strlen(str))); +} + +void CDesignerVisualization::dragDataGetFromWidgetCB(GtkWidget* srcWidget, GdkDragContext* /*dc*/, GtkSelectionData* selection, + guint /*info*/, guint /*time*/, gpointer /*data*/) +{ + char str[1024]; + sprintf(str, "%p", srcWidget); + gtk_selection_data_set_text(selection, str, gint(strlen(str))); +} + +void CDesignerVisualization::dragDataReceivedInWidgetCB(GtkWidget* dstWidget, GdkDragContext* /*dc*/, gint /*x*/, gint /*y*/, GtkSelectionData* selection, + guint /*info*/, guint /*time*/, gpointer data) +{ + static_cast(data)->dragDataReceivedInWidget(dstWidget, selection); +} + +void CDesignerVisualization::dragDataReceivedInWidget(GtkWidget* dstWidget, GtkSelectionData* selection) +{ + void* srcWidget = nullptr; + sscanf(reinterpret_cast(gtk_selection_data_get_text(selection)), "%p", &srcWidget); + GtkTreeIter srcIter; + + //retrieve source widget iterator + if (GTK_IS_TREE_VIEW(srcWidget)) + { + //ensure dragged widget is a visualization box + if (!m_tree.findChildNodeFromRoot(&srcIter, m_activeVisualizationBoxID)) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "dragDataReceivedInWidget couldn't retrieve iterator of active visualization box!\n"; + return; + } + } + else if (GTK_IS_BUTTON(srcWidget)) + { + if (srcWidget == dstWidget) { return; } + if (!m_tree.findChildNodeFromRoot(&srcIter, getTreeWidget(GTK_WIDGET(srcWidget)))) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "dragDataReceivedInWidget couldn't retrieve iterator of dragged button!\n"; + return; + } + } + else { return; } + + //retrieve src widget identifier and src visualization widget + CIdentifier srcID; + m_tree.getIdentifierFromTreeIter(&srcIter, srcID, EVTColumn::StringIdentifier); + IVTWidget* srcVisualizationWidget = m_tree.getVisualizationWidget(srcID); + if (srcVisualizationWidget == nullptr) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "dragDataReceivedInWidget couldn't retrieve source visualization widget!\n"; + return; + } + + //retrieve dest widget type + GtkTreeIter dstIter; + if (!m_tree.findChildNodeFromRoot(&dstIter, getTreeWidget(dstWidget))) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "dragDataReceivedInWidget couldn't retrieve iterator of destination widget!\n"; + return; + } + + //if src widget is unaffected or if dest widget is a visualization box, perform the drop operation directly + if (srcVisualizationWidget->getParentIdentifier() == CIdentifier::undefined() + || m_tree.getULongValueFromTreeIter(&dstIter, EVTColumn::ULongNodeType) == size_t(EVTNode::VisualizationBox)) + { + m_tree.dragDataReceivedInWidgetCB(srcID, dstWidget); + } + else //dest widget is a dummy : unaffect src widget and simplify the tree before performing the drop operation + { + //save dest widget identifier + CIdentifier dstID; + m_tree.getIdentifierFromTreeIter(&dstIter, dstID, EVTColumn::StringIdentifier); + + //unaffect src widget, so that tree is simplified + if (!removeVisualizationWidget(srcID)) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "dragDataReceivedInWidget couldn't remove source widget from its parent!\n"; + return; + } + + //then drop it + if (!m_tree.findChildNodeFromRoot(&dstIter, dstID)) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug + << "dragDataReceivedInWidget couldn't retrieve iterator of dummy destination widget to delete!\n"; + return; + } + void* newDstTreeWidget = nullptr; + m_tree.getPointerValueFromTreeIter(&dstIter, newDstTreeWidget, EVTColumn::PointerWidget); + m_tree.dragDataReceivedInWidgetCB(srcID, getVisualizationWidget(GTK_WIDGET(newDstTreeWidget))); + } + + //refresh view + GtkTreeIter draggedIter; + m_tree.findChildNodeFromRoot(&draggedIter, srcID); + refreshActiveVisualization(m_tree.getTreePath(&draggedIter)); +} + +void CDesignerVisualization::dataReceivedInEventBoxCB(GtkWidget* dstWidget, GdkDragContext* /*dc*/, gint /*x*/, gint /*y*/, GtkSelectionData* selection, + guint /*info*/, guint /*time*/, gpointer data) +{ + char buf[1024]; + void* visualization = nullptr; + sscanf(static_cast(data), "%p %s", &visualization, buf); + + VisualizationToolkit::EDragLocation location; + if (strcmp(buf, "left") == 0) { location = VisualizationToolkit::EDragLocation::Left; } + else if (strcmp(buf, "right") == 0) { location = VisualizationToolkit::EDragLocation::Right; } + else if (strcmp(buf, "top") == 0) { location = VisualizationToolkit::EDragLocation::Top; } + else { location = VisualizationToolkit::EDragLocation::Bottom; } + + static_cast(visualization)->dragDataReceivedInEventBox(dstWidget, selection, location); +} + +void CDesignerVisualization::dragDataReceivedInEventBox(GtkWidget* dstWidget, GtkSelectionData* selection, const VisualizationToolkit::EDragLocation location) +{ + void* srcWidget = nullptr; + sscanf(reinterpret_cast(gtk_selection_data_get_text(selection)), "%p", &srcWidget); + GtkTreeIter srcIter; + + //get iterator to src widget + if (GTK_IS_TREE_VIEW(srcWidget)) + { + if (!m_tree.findChildNodeFromRoot(&srcIter, m_activeVisualizationBoxID)) { return; } + //get actual src widget (item being dropped) and ensure it isn't being dropped in its own table + m_tree.getPointerValueFromTreeIter(&srcIter, srcWidget, EVTColumn::PointerWidget); + if (srcWidget == gtk_widget_get_parent(dstWidget)) { return; } + } + else if (GTK_IS_BUTTON(srcWidget)) + { + //ensure src widget isn't being dropped in its own table + if (gtk_widget_get_parent(GTK_WIDGET(srcWidget)) == gtk_widget_get_parent(dstWidget)) { return; } + m_tree.findChildNodeFromRoot(&srcIter, getTreeWidget(GTK_WIDGET(srcWidget))); + } + else { return; } + + //ensure src widget is a visualization box + if (m_tree.getULongValueFromTreeIter(&srcIter, EVTColumn::ULongNodeType) != size_t(EVTNode::VisualizationBox)) { return; } + + //retrieve src widget identifier + CIdentifier srcID; + m_tree.getIdentifierFromTreeIter(&srcIter, srcID, EVTColumn::StringIdentifier); + + //if widget is unaffected, just drag n drop it + GtkTreeIter unaffectedIter = srcIter; + if (m_tree.findParentNode(&unaffectedIter, EVTNode::Unaffected)) { m_tree.dragDataReceivedOutsideWidgetCB(srcID, dstWidget, location); } + else + { + //save dest widget identifier + GtkTreeIter dstIter; + m_tree.findChildNodeFromRoot(&dstIter, getTreeWidget(dstWidget)); + CIdentifier dstID; + m_tree.getIdentifierFromTreeIter(&dstIter, dstID, EVTColumn::StringIdentifier); + + //if dest widget is src widget's parent (paned widget), drop src widget in corresponding event box of parent's other child + //(otherwise, DND will fail due to parent's removal during tree simplification process) + IVTWidget* srcVisualizationWidget = m_tree.getVisualizationWidget(srcID); + if (srcVisualizationWidget->getParentIdentifier() == dstID) + { + IVTWidget* srcParentWidget = m_tree.getVisualizationWidget(srcVisualizationWidget->getParentIdentifier()); + srcParentWidget->getChildIdentifier(0, dstID); + if (srcID == dstID) { srcParentWidget->getChildIdentifier(1, dstID); } + } + + //unaffect src widget, so that tree is simplified + removeVisualizationWidget(srcID); + + //then drop it + m_tree.findChildNodeFromRoot(&dstIter, dstID); + void* newDstTreeWidget = nullptr; + m_tree.getPointerValueFromTreeIter(&dstIter, newDstTreeWidget, EVTColumn::PointerWidget); + m_tree.dragDataReceivedOutsideWidgetCB(srcID, getVisualizationWidget(GTK_WIDGET(newDstTreeWidget)), location); + } + + //refresh view + GtkTreeIter draggedIter; + m_tree.findChildNodeFromRoot(&draggedIter, srcID); + refreshActiveVisualization(m_tree.getTreePath(&draggedIter)); +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCDesignerVisualization.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCDesignerVisualization.h new file mode 100644 index 0000000..b5eff4e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCDesignerVisualization.h @@ -0,0 +1,173 @@ +#pragma once + +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Designer { +typedef void (*visualization_delete_event_cb_t)(gpointer data); + +class CInterfacedScenario; + +class CDesignerVisualization final : public VisualizationToolkit::ITreeViewCB +{ +public: + CDesignerVisualization(const Kernel::IKernelContext& ctx, VisualizationToolkit::IVisualizationTree& tree, CInterfacedScenario& scenario) + : m_kernelCtx(ctx), m_tree(tree), m_scenario(scenario) { } + + ~CDesignerVisualization() override; + + void init(const std::string& guiFile); + void load(); + void show() const; + void hide(); + + void setDeleteEventCB(visualization_delete_event_cb_t cb, gpointer data); + + void onVisualizationBoxAdded(const Kernel::IBox* box); + void onVisualizationBoxRemoved(const CIdentifier& boxID); + void onVisualizationBoxRenamed(const CIdentifier& boxID); + + //ITreeViewCB callbacks overloading + void createTreeWidget(VisualizationToolkit::IVisualizationWidget* widget) override; + GtkWidget* loadTreeWidget(VisualizationToolkit::IVisualizationWidget* widget) override; + void endLoadTreeWidget(VisualizationToolkit::IVisualizationWidget* widget) override; + GtkWidget* getTreeWidget(GtkWidget* widget) override; + GtkWidget* getVisualizationWidget(GtkWidget* widget) override; + const char* getTreeWidgetIcon(VisualizationToolkit::EVisualizationTreeNode type) override; + + //callbacks for dialog +#ifdef HANDLE_MIN_MAX_EVENTS + static gboolean window_state_event_cb(GtkWidget* widget, GdkEventWindowState* event, gpointer data); +#endif + static gboolean configureEventCB(GtkWidget* widget, GdkEventConfigure* event, gpointer data); + static gboolean widgetExposeEventCB(GtkWidget* widget, GdkEventExpose* event, gpointer data); + void resizeCB(VisualizationToolkit::IVisualizationWidget* widget); + + static void notebookPageSwitchCB(GtkNotebook* notebook, GtkNotebookPage* page, guint pagenum, gpointer data); + + //callback for paned handle position changes + static gboolean notifyPositionPanedCB(GtkWidget* widget, GParamSpec* spec, gpointer data); + + static void askNewVisualizationWindowCB(gpointer data, guint action, GtkWidget* widget); + static void newVisualizationWindowCB(GtkWidget* widget, gpointer data); + static void askRenameVisualizationWindowCB(gpointer data, guint action, GtkWidget* widget); + static void renameVisualizationWindowCB(GtkWidget* widget, gpointer data); + static void removeVisualizationWindowCB(gpointer data, guint action, GtkWidget* widget); + + static void askNewVisualizationPanelCB(gpointer data, guint action, GtkWidget* widget); + static void newVisualizationPanelCB(GtkWidget* widget, gpointer data); + static void askRenameVisualizationPanelCB(gpointer data, guint action, GtkWidget* widget); + static void renameVisualizationPanelCB(GtkWidget* widget, gpointer data); + static void removeVisualizationPanelCB(gpointer data, guint action, GtkWidget* widget); + + static void removeVisualizationWidgetCB(gpointer data, guint action, GtkWidget* widget); + +private: + static gboolean deleteEventCB(GtkWidget* widget, GdkEvent* event, gpointer data); + bool deleteEvent() const; + + void refreshActiveVisualization(GtkTreePath* selectedItemPath); + + void setActiveVisualization(const char* activeWindow, const char* activePanel); + + GtkTable* newWidgetsTable(); + void setupNewEventBoxTable(GtkBuilder* xml); + + //visualization windows + void askNewVisualizationWindow(); +public: + bool newVisualizationWindow(const char* label); +private: + void askRenameVisualizationWindow(); + bool renameVisualizationWindow(const char* label); + bool removeVisualizationWindow(); + + //visualization panels + void askNewVisualizationPanel(); + bool newVisualizationPanel(const char* label); + void askRenameVisualizationPanel(); + bool renameVisualizationPanel(const char* label); + bool removeVisualizationPanel(); + + //visualization widgets + bool removeVisualizationWidget(); + bool removeVisualizationWidget(const CIdentifier& identifier); + bool destroyVisualizationWidget(const CIdentifier& identifier); + + void enableNotebookSignals(GtkWidget* notebook, bool b); + void notebookPageSelectedCB(GtkNotebook* notebook, guint pagenum); + + void enablePanedSignals(GtkWidget* paned, bool b); + void notifyPositionPaned(GtkWidget* widget); + + //Mouse/Key event callbacks + static void widgetKeyPressEventCB(GtkWidget* widget, GdkEventKey* event, gpointer data); + static gboolean widgetEnterNotifyEventCB(GtkWidget* widget, GdkEventCrossing* event, gpointer data); + static gboolean widgetLeaveNotifyEventCB(GtkWidget* widget, GdkEventCrossing* event, gpointer data); + + //Mouse/Key event methods + void widgetKeyPressEvent(GtkWidget* widget, GdkEventKey* event); + void widgetEnterNotifyEvent(GtkWidget* widget, GdkEventCrossing* event); + void widgetLeaveNotifyEvent(GtkWidget* widget, GdkEventCrossing* event); + + //Tree management callbacks + static gboolean buttonReleaseCB(GtkWidget* widget, GdkEventButton* event, gpointer data); + static void cursorChangedCB(GtkTreeView* treeView, gpointer data); + + //Tree management methods + void buttonRelease(GtkWidget* widget, GdkEventButton* event) const; + void cursorChanged(GtkTreeView* treeView); + + //Drag methods + static void dragDataGetFromTreeCB(GtkWidget* srcWidget, GdkDragContext* dc, GtkSelectionData* selection, guint info, guint time, gpointer data); + static void dragDataGetFromWidgetCB(GtkWidget* srcWidget, GdkDragContext* dc, GtkSelectionData* selection, guint info, guint time, gpointer data); + + //Drop methods + static void dragDataReceivedInWidgetCB(GtkWidget* dstWidget, GdkDragContext*, gint, gint, GtkSelectionData* selection, guint info, guint time, + gpointer data); + static void dataReceivedInEventBoxCB(GtkWidget* dstWidget, GdkDragContext* dc, gint x, gint y, GtkSelectionData* selection, guint info, guint time, + gpointer data); + void dragDataReceivedInWidget(GtkWidget* dstWidget, GtkSelectionData* selection); + void dragDataReceivedInEventBox(GtkWidget* dstWidget, GtkSelectionData* selection, VisualizationToolkit::EDragLocation location); + + const Kernel::IKernelContext& m_kernelCtx; + VisualizationToolkit::IVisualizationTree& m_tree; + CInterfacedScenario& m_scenario; + visualization_delete_event_cb_t m_deleteEventCB = nullptr; + gpointer m_deleteEventUserData = nullptr; + std::string m_guiFile; + GtkTreeView* m_treeView = nullptr; + GtkWidget* m_dialog = nullptr; + GtkWidget* m_pane = nullptr; + + //highlighted widget + GtkWidget* m_highlightedWidget = nullptr; + + //active items + CString m_activeVisualizationWindowName, m_activeVisualizationPanelName; + CIdentifier m_activeVisualizationBoxID = CIdentifier::undefined(); + + //preview window visibility flag + bool m_previewWindowVisible = false; + size_t m_previewWindowW = 0; + size_t m_previewWindowH = 0; + + //Factories + GtkItemFactory* m_unaffectedItemFactory = nullptr; + GtkItemFactory* m_visualizationWindowItemFactory = nullptr; + GtkItemFactory* m_visualizationPanelItemFactory = nullptr; + GtkItemFactory* m_visualizationBoxItemFactory = nullptr; + GtkItemFactory* m_undefinedItemFactory = nullptr; + GtkItemFactory* m_splitItemFactory = nullptr; + + std::string m_topEventBoxData; + std::string m_leftEventBoxData; + std::string m_rightEventBoxData; + std::string m_bottomEventBoxData; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCInputDialog.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCInputDialog.cpp new file mode 100644 index 0000000..d8a9333 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCInputDialog.cpp @@ -0,0 +1,70 @@ +#include "ovdCInputDialog.h" +#include + +namespace OpenViBE { +namespace Designer { + +CInputDialog::CInputDialog(const char* gtkBuilder, const fpButtonCB okButtonCB, void* data, const char* title, const char* label, const char* entry) +{ + m_okButtonCB = okButtonCB; + m_userData = data; + + //retrieve input dialog + GtkBuilder* builder = gtk_builder_new(); // glade_xml_new(gtkBuilder, "input", nullptr); + gtk_builder_add_from_file(builder, gtkBuilder, nullptr); + gtk_builder_connect_signals(builder, nullptr); + + m_dialog = GTK_DIALOG(gtk_builder_get_object(builder, "input")); + m_dialogLabel = GTK_LABEL(gtk_builder_get_object(builder, "input-label")); + m_dialogEntry = GTK_ENTRY(gtk_builder_get_object(builder, "input-entry")); + m_dialogOkButton = GTK_BUTTON(gtk_builder_get_object(builder, "input-button_ok")); + m_dialogCancelButton = GTK_BUTTON(gtk_builder_get_object(builder, "input-button_cancel")); + + GTK_WIDGET_SET_FLAGS(GTK_WIDGET(m_dialogEntry), GDK_KEY_PRESS_MASK); + g_signal_connect(G_OBJECT(m_dialogEntry), "key-press-event", G_CALLBACK(keyPressEventCB), m_dialog); + + if (label != nullptr) { gtk_label_set(m_dialogLabel, label); } + if (entry != nullptr) { gtk_entry_set_text(m_dialogEntry, entry); } + + g_signal_connect(G_OBJECT(m_dialogOkButton), "clicked", G_CALLBACK(buttonClickedCB), this); + g_signal_connect(G_OBJECT(m_dialogCancelButton), "clicked", G_CALLBACK(buttonClickedCB), this); + + gtk_window_set_position(GTK_WINDOW(m_dialog), GTK_WIN_POS_MOUSE); + gtk_window_set_title(GTK_WINDOW(m_dialog), title); +} + +CInputDialog::~CInputDialog() { gtk_widget_destroy(GTK_WIDGET(m_dialog)); } + +void CInputDialog::run() +{ + const gint res = gtk_dialog_run(m_dialog); + if (res == GTK_RESPONSE_ACCEPT) { if (m_okButtonCB != nullptr) { m_okButtonCB(GTK_WIDGET(m_dialogOkButton), this); } } + gtk_widget_hide_all(GTK_WIDGET(m_dialog)); +} + +gboolean CInputDialog::keyPressEventCB(GtkWidget* /*widget*/, GdkEventKey* eventKey, gpointer data) +{ + if (eventKey->keyval == GDK_Return || eventKey->keyval == GDK_KP_Enter) + { + gtk_dialog_response(GTK_DIALOG(data), GTK_RESPONSE_ACCEPT); + return TRUE; + } + if (eventKey->keyval == GDK_Escape) + { + gtk_dialog_response(GTK_DIALOG(data), GTK_RESPONSE_REJECT); + return TRUE; + } + + return FALSE; +} + +void CInputDialog::buttonClickedCB(GtkButton* button, gpointer data) { static_cast(data)->buttonClicked(button); } + +void CInputDialog::buttonClicked(GtkButton* button) const +{ + if (button == m_dialogOkButton) { gtk_dialog_response(m_dialog, GTK_RESPONSE_ACCEPT); } + else { gtk_dialog_response(m_dialog, GTK_RESPONSE_REJECT); } +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCInputDialog.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCInputDialog.h new file mode 100644 index 0000000..33a8c07 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCInputDialog.h @@ -0,0 +1,36 @@ +#pragma once + +#include "ovd_base.h" + +namespace OpenViBE { +namespace Designer { +typedef void (*fpButtonCB)(GtkWidget* pWidget, gpointer data); + +class CInputDialog +{ +public: + + CInputDialog(const char* gtkBuilder, fpButtonCB okButtonCB, void* data = nullptr, const char* title = nullptr, const char* label = nullptr, + const char* entry = nullptr); + ~CInputDialog(); + + void run(); + void* getUserData() const { return m_userData; } + const char* getEntry() const { return static_cast(gtk_entry_get_text(m_dialogEntry)); } + +private: + + static gboolean keyPressEventCB(GtkWidget* widget, GdkEventKey* eventKey, gpointer data); + static void buttonClickedCB(GtkButton* button, gpointer data); + void buttonClicked(GtkButton* button) const; + + void* m_userData = nullptr; + fpButtonCB m_okButtonCB; + GtkDialog* m_dialog = nullptr; + GtkLabel* m_dialogLabel = nullptr; + GtkEntry* m_dialogEntry = nullptr; + GtkButton* m_dialogOkButton = nullptr; + GtkButton* m_dialogCancelButton = nullptr; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCInterfacedObject.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCInterfacedObject.h new file mode 100644 index 0000000..26d581d --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCInterfacedObject.h @@ -0,0 +1,22 @@ +#pragma once + +#include "ovd_base.h" + +namespace OpenViBE { +namespace Designer { +class CInterfacedObject +{ +public: + + CInterfacedObject() = default; + explicit CInterfacedObject(const CIdentifier& identifier) : m_ID(identifier) { } + + CInterfacedObject(const CIdentifier& identifier, const size_t connectorType, const size_t connectorIndex) + : m_ID(identifier), m_ConnectorType(connectorType), m_ConnectorIdx(connectorIndex) { } + + CIdentifier m_ID = CIdentifier::undefined(); + size_t m_ConnectorType = 0; + size_t m_ConnectorIdx = 0; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCInterfacedScenario.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCInterfacedScenario.cpp new file mode 100755 index 0000000..87106fd --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCInterfacedScenario.cpp @@ -0,0 +1,3699 @@ +#include +#include "ovdCInterfacedScenario.h" +#include "ovdCApplication.h" +#include "ovdCBoxProxy.h" +#include "ovdCCommentProxy.h" +#include "ovdCLinkProxy.h" +#include "ovdCConnectorEditor.h" +#include "ovdCInterfacedObject.h" +#include "ovdTAttributeHandler.h" +#include "ovdCDesignerVisualization.h" +#include "ovdCPlayerVisualization.h" +#include "ovdCRenameDialog.h" +#include "ovdCAboutPluginDialog.h" +#include "ovdCAboutScenarioDialog.h" +#include "ovdCSettingEditorDialog.h" +#include "ovdCCommentEditorDialog.h" + +#include +#include +#include +#include +#include + +#include +#include + +#include + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS +#include +#define _strcmpi strcasecmp +#endif + +namespace OpenViBE { +namespace Designer { + +extern std::map gColors; + +static GtkTargetEntry targets[] = { { static_cast("STRING"), 0, 0 }, { static_cast("text/plain"), 0, 0 } }; + +static GdkColor colorFromIdentifier(const CIdentifier& id, const bool isDeprecated = false) +{ + GdkColor color; + uint32_t value1 = 0; + uint32_t value2 = 0; + uint64_t res = 0; + + sscanf(id.str().c_str(), "(0x%08X, 0x%08X)", &value1, &value2); + res += value1; + res <<= 32; + res += value2; + + color.pixel = guint16(0); + color.red = guint16((res & 0xffff) | 0x8000); + color.green = guint16(((res >> 16) & 0xffff) | 0x8000); + color.blue = guint16(((res >> 32) & 0xffff) | 0x8000); + + if (isDeprecated) + { + color.blue = 2 * color.blue / 3; + color.red = 2 * color.red / 3; + color.green = 2 * color.green / 3; + } + + return color; +} + +static std::string getBoxAlgorithmURL(const std::string& in, const bool removeSlash = false) +{ + std::string tmp(in); + std::string out; + bool lastWasSeparator = true; + + for (char c : tmp) + { + if (std::isalnum(c) || (!removeSlash && c == '/')) + { + if (c == '/') { out += "_"; } + else + { + if (lastWasSeparator) { out += std::toupper(c); } + else { out += c; } + } + lastWasSeparator = false; + } + else + { + // if(!lastWasSeparator) { out += "_"; } + lastWasSeparator = true; + } + } + return out; +} + +static void count_widget_cb(GtkWidget* /*widget*/, gpointer data) +{ + int* i = reinterpret_cast(data); + if (i) { (*i)++; } +} + +static int gtk_container_get_children_count(GtkContainer* container) +{ + int res = 0; + gtk_container_foreach(container, count_widget_cb, &res); + return res; +} + +static gboolean scenario_scrolledwindow_scroll_event_cb(GtkWidget* /*widget*/, GdkEventScroll* event) +{ + guint state = event->state & gtk_accelerator_get_default_mod_mask(); + + /* Shift+Wheel scrolls the in the perpendicular direction */ + if (state & GDK_SHIFT_MASK) + { + if (event->direction == GDK_SCROLL_UP) { event->direction = GDK_SCROLL_LEFT; } + else if (event->direction == GDK_SCROLL_LEFT) { event->direction = GDK_SCROLL_UP; } + else if (event->direction == GDK_SCROLL_DOWN) { event->direction = GDK_SCROLL_RIGHT; } + else if (event->direction == GDK_SCROLL_RIGHT) { event->direction = GDK_SCROLL_DOWN; } + + event->state &= ~GDK_SHIFT_MASK; + state &= ~GDK_SHIFT_MASK; + } + + return FALSE; +} + +static void scenario_drawing_area_expose_cb(GtkWidget* /*widget*/, GdkEventExpose* event, gpointer data) +{ + static_cast(data)->scenarioDrawingAreaExposeCB(event); +} + +static void scenario_drawing_area_drag_data_received_cb(GtkWidget* /*widget*/, GdkDragContext* dc, const gint x, const gint y, GtkSelectionData* selectionData, + const guint info, const guint t, gpointer data) +{ + static_cast(data)->scenarioDrawingAreaDragDataReceivedCB(dc, x, y, selectionData, info, t); +} + +static gboolean scenario_drawing_area_motion_notify_cb(GtkWidget* widget, GdkEventMotion* event, gpointer data) +{ + static_cast(data)->scenarioDrawingAreaMotionNotifyCB(widget, event); + return FALSE; +} + +static void scenario_drawing_area_button_pressed_cb(GtkWidget* widget, GdkEventButton* event, gpointer data) +{ + static_cast(data)->scenarioDrawingAreaButtonPressedCB(widget, event); +} + +static void scenario_drawing_area_button_released_cb(GtkWidget* widget, GdkEventButton* event, gpointer data) +{ + static_cast(data)->scenarioDrawingAreaButtonReleasedCB(widget, event); +} + +static void scenario_drawing_area_key_press_event_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) +{ + static_cast(data)->scenarioDrawingAreaKeyPressEventCB(widget, event); +} + +static void scenario_drawing_area_key_release_event_cb(GtkWidget* widget, GdkEventKey* event, gpointer data) +{ + static_cast(data)->scenarioDrawingAreaKeyReleaseEventCB(widget, event); +} + +static void context_menu_cb(GtkMenuItem* /*item*/, CInterfacedScenario::box_ctx_menu_cb_t* cb) +{ + //CInterfacedScenario::box_ctx_menu_cb_t* pContextMenuCB=static_cast < CInterfacedScenario::box_ctx_menu_cb_t* >(data); + switch (cb->command) + { + case EContextMenu::SelectionCopy: cb->scenario->copySelection(); + break; + case EContextMenu::SelectionCut: cb->scenario->cutSelection(); + break; + case EContextMenu::SelectionPaste: cb->scenario->pasteSelection(); + break; + case EContextMenu::SelectionDelete: cb->scenario->deleteSelection(); + break; + + case EContextMenu::BoxRename: cb->scenario->contextMenuBoxRenameCB(*cb->box); + break; + case EContextMenu::BoxUpdate: + { + cb->scenario->snapshotCB(); + cb->scenario->contextMenuBoxUpdateCB(*cb->box); + cb->scenario->redraw(); + break; + } + case EContextMenu::BoxRemoveDeprecatedInterfacors: + { + cb->scenario->contextMenuBoxRemoveDeprecatedInterfacorsCB(*cb->box); + cb->scenario->redraw(); + break; + } + //case EContextMenu::BoxRename: cb->pInterfacedScenario->contextMenuBoxRenameAllCB(); break; + case EContextMenu::BoxDelete: + { + // If selection is empty delete the box under cursor + if (cb->scenario->m_SelectedObjects.empty()) + { + cb->scenario->deleteBox(cb->box->getIdentifier()); + cb->scenario->redraw(); + cb->scenario->snapshotCB(); + } + else { cb->scenario->deleteSelection(); } + break; + } + case EContextMenu::BoxAddInput: cb->scenario->contextMenuBoxAddInputCB(*cb->box); + break; + case EContextMenu::BoxEditInput: cb->scenario->contextMenuBoxEditInputCB(*cb->box, cb->index); + break; + case EContextMenu::BoxRemoveInput: cb->scenario->contextMenuBoxRemoveInputCB(*cb->box, cb->index); + break; + case EContextMenu::BoxAddOutput: cb->scenario->contextMenuBoxAddOutputCB(*cb->box); + break; + case EContextMenu::BoxEditOutput: cb->scenario->contextMenuBoxEditOutputCB(*cb->box, cb->index); + break; + case EContextMenu::BoxRemoveOutput: cb->scenario->contextMenuBoxRemoveOutputCB(*cb->box, cb->index); + break; + + case EContextMenu::BoxConnectScenarioInput: cb->scenario->contextMenuBoxConnectScenarioInputCB(*cb->box, cb->index, cb->secondaryIndex); + break; + case EContextMenu::BoxConnectScenarioOutput: cb->scenario->contextMenuBoxConnectScenarioOutputCB(*cb->box, cb->index, cb->secondaryIndex); + break; + + case EContextMenu::BoxDisconnectScenarioInput: cb->scenario->contextMenuBoxDisconnectScenarioInputCB(*cb->box, cb->index, cb->secondaryIndex); + break; + case EContextMenu::BoxDisconnectScenarioOutput: cb->scenario->contextMenuBoxDisconnectScenarioOutputCB(*cb->box, cb->index, cb->secondaryIndex); + break; + + case EContextMenu::BoxAddSetting: cb->scenario->contextMenuBoxAddSettingCB(*cb->box); + break; + case EContextMenu::BoxEditSetting: cb->scenario->contextMenuBoxEditSettingCB(*cb->box, cb->index); + break; + case EContextMenu::BoxRemoveSetting: cb->scenario->contextMenuBoxRemoveSettingCB(*cb->box, cb->index); + break; + case EContextMenu::BoxConfigure: cb->scenario->contextMenuBoxConfigureCB(*cb->box); + break; + case EContextMenu::BoxAbout: cb->scenario->contextMenuBoxAboutCB(*cb->box); + break; + case EContextMenu::BoxEnable: + { + if (cb->scenario->m_SelectedObjects.empty()) { cb->scenario->contextMenuBoxEnableCB(*cb->box); } + else { cb->scenario->contextMenuBoxEnableAllCB(); } + break; + } + case EContextMenu::BoxDisable: + { + if (cb->scenario->m_SelectedObjects.empty()) + { + cb->scenario->contextMenuBoxDisableCB(*cb->box); + break; + } + cb->scenario->contextMenuBoxDisableAllCB(); + break; + } + case EContextMenu::BoxDocumentation: cb->scenario->contextMenuBoxDocumentationCB(*cb->box); + break; + + case EContextMenu::BoxEditMetabox: cb->scenario->contextMenuBoxEditMetaboxCB(*cb->box); + break; + + case EContextMenu::ScenarioAbout: cb->scenario->contextMenuScenarioAboutCB(); + break; + case EContextMenu::ScenarioAddComment: cb->scenario->contextMenuScenarioAddCommentCB(); + break; + default: break; + } + // Redraw in any case, as some of the actual callbacks can forget to redraw. As this callback is only called after the user has accessed + // the right-click menu, so its not a large overhead to do it in general. @TODO might remove the individual redraws. + cb->scenario->redraw(); +} + +static void gdk_draw_rounded_rectangle(GdkDrawable* drawable, GdkGC* drawGC, const gboolean fill, const gint x, const gint y, const gint width, + const gint height, const gint radius = 8) +{ + if (fill != 0) + { +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + gdk_draw_rectangle(drawable, drawGC, TRUE, x + radius, y, width - 2 * radius, height); + gdk_draw_rectangle(drawable, drawGC, TRUE, x, y + radius, width, height - 2 * radius); +#elif defined TARGET_OS_Windows + gdk_draw_rectangle(drawable, drawGC, TRUE, x + radius, y, width - 2 * radius + 1, height + 1); + gdk_draw_rectangle(drawable, drawGC, TRUE, x, y + radius, width + 1, height - 2 * radius + 1); +#else +#pragma error("you should give a version of this function for your OS") +#endif + } + else + { + gdk_draw_line(drawable, drawGC, x + radius, y, x + width - radius, y); + gdk_draw_line(drawable, drawGC, x + radius, y + height, x + width - radius, y + height); + gdk_draw_line(drawable, drawGC, x, y + radius, x, y + height - radius); + gdk_draw_line(drawable, drawGC, x + width, y + radius, x + width, y + height - radius); + } +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + gdk_draw_arc(drawable, drawGC, fill, x + width - radius * 2, y, radius * 2, radius * 2, 0 * 64, 90 * 64); + gdk_draw_arc(drawable, drawGC, fill, x, y, radius * 2, radius * 2, 90 * 64, 90 * 64); + gdk_draw_arc(drawable, drawGC, fill, x, y + height - radius * 2, radius * 2, radius * 2, 180 * 64, 90 * 64); + gdk_draw_arc(drawable, drawGC, fill, x + width - radius * 2, y + height - radius * 2, radius * 2, radius * 2, 270 * 64, 90 * 64); +#elif defined TARGET_OS_Windows + gdk_draw_arc(drawable, drawGC, fill, x + width - radius * 2, y, radius * 2 + (fill != 0 ? 2 : 1), radius * 2 + (fill != 0 ? 2 : 1), 0 * 64, 90 * 64); + gdk_draw_arc(drawable, drawGC, fill, x, y, radius * 2 + (fill != 0 ? 2 : 1), radius * 2 + (fill != 0 ? 2 : 1), 90 * 64, 90 * 64); + gdk_draw_arc(drawable, drawGC, fill, x, y + height - radius * 2, radius * 2 + (fill != 0 ? 2 : 1), radius * 2 + (fill != 0 ? 2 : 1), 180 * 64, 90 * 64); + gdk_draw_arc(drawable, drawGC, fill, x + width - radius * 2, y + height - radius * 2, radius * 2 + (fill != 0 ? 2 : 1), radius * 2 + (fill != 0 ? 2 : 1), + 270 * 64, 90 * 64); +#else +#pragma error("you should give a version of this function for your OS") +#endif +} + +static void scenario_title_button_close_cb(GtkButton* /*button*/, gpointer data) +{ + static_cast(data)->m_Application.closeScenarioCB(static_cast(data)); +} + +static gboolean editable_widget_focus_in_cb(GtkWidget* /*widget*/, GdkEvent* /*event*/, CApplication* app) +{ + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(app->m_Builder, "openvibe-menu_edit")), 0); + return 0; +} + +static gboolean editable_widget_focus_out_cb(GtkWidget* /*widget*/, GdkEvent* /*event*/, CApplication* app) +{ + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(app->m_Builder, "openvibe-menu_edit")), 1); + return 0; +} + +//static void scenario_configuration_add_setting_cb(GtkWidget*, CInterfacedScenario* pInterfacedScenario) { pInterfacedScenario->addScenarioSettingCB(); } + +static void modify_scenario_setting_value_cb(GtkWidget* /*widget*/, CInterfacedScenario::setting_cb_data_t* data) +{ + CIdentifier typeID = CIdentifier::undefined(); + data->scenario->m_Scenario.getSettingType(data->index, typeID); + data->scenario->m_Scenario.setSettingValue(data->index, data->scenario->m_SettingHelper->getValue(typeID, data->widgetValue)); + data->scenario->m_HasBeenModified = true; + data->scenario->updateScenarioLabel(); +} + +static void modify_scenario_setting_default_value_cb(GtkWidget* /*widget*/, CInterfacedScenario::setting_cb_data_t* data) +{ + CIdentifier typeID = CIdentifier::undefined(); + data->scenario->m_Scenario.getSettingType(data->index, typeID); + data->scenario->m_Scenario.setSettingDefaultValue(data->index, data->scenario->m_SettingHelper->getValue(typeID, data->widgetValue)); + + // We also se the 'actual' value to this + data->scenario->m_Scenario.setSettingValue(data->index, data->scenario->m_SettingHelper->getValue(typeID, data->widgetValue)); + data->scenario->m_HasBeenModified = true; + data->scenario->updateScenarioLabel(); +} + +static void modify_scenario_setting_move_up_cb(GtkWidget* /*widget*/, CInterfacedScenario::setting_cb_data_t* data) +{ + if (data->index == 0) { return; } + data->scenario->swapScenarioSettings(data->index - 1, data->index); +} + +static void modify_scenario_setting_move_down_cb(GtkWidget* /*widget*/, CInterfacedScenario::setting_cb_data_t* data) +{ + if (data->index >= data->scenario->m_Scenario.getSettingCount() - 1) { return; } + data->scenario->swapScenarioSettings(data->index, data->index + 1); +} + +static void modify_scenario_setting_revert_to_default_cb(GtkWidget* /*widget*/, CInterfacedScenario::setting_cb_data_t* data) +{ + CString value; + data->scenario->m_Scenario.getSettingDefaultValue(data->index, value); + data->scenario->m_Scenario.setSettingValue(data->index, value); + data->scenario->redrawScenarioSettings(); +} + +static void copy_scenario_setting_token_cb(GtkWidget* /*widget*/, CInterfacedScenario::setting_cb_data_t* data) +{ + CString name; + data->scenario->m_Scenario.getSettingName(data->index, name); + name = CString("$var{") + name + CString("}"); + + GtkClipboard* defaultClipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); + gtk_clipboard_set_text(defaultClipboard, name.toASCIIString(), -1); + + // On X11 there is another clipboard that it is useful to set as well + GtkClipboard* x11Clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY); + gtk_clipboard_set_text(x11Clipboard, name.toASCIIString(), -1); +} + +static void modify_scenario_setting_type_cb(GtkWidget* combobox, CInterfacedScenario::setting_cb_data_t* data) +{ + GtkBuilder* builder = gtk_builder_new(); + gtk_builder_add_from_string(builder, data->scenario->m_SerializedSettingGUIXML.c_str(), data->scenario->m_SerializedSettingGUIXML.length(), nullptr); + + gtk_widget_destroy(data->widgetValue); + + const CIdentifier typeID = data->scenario->m_SettingTypes[gtk_combo_box_get_active_text(GTK_COMBO_BOX(combobox))]; + data->scenario->m_Scenario.setSettingType(data->index, typeID); + + const CString name = data->scenario->m_SettingHelper->getSettingWidgetName(typeID); + + GtkWidget* value = GTK_WIDGET(gtk_builder_get_object(builder, name.toASCIIString())); + + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(value)), value); + gtk_table_attach_defaults(GTK_TABLE(data->container), value, 1, 5, 1, 2); + + // Set the value and connect GUI callbacks (because, yes, setValue connects callbacks like a ninja) + CString str; + data->scenario->m_Scenario.getSettingDefaultValue(data->index, str); + data->scenario->m_SettingHelper->setValue(typeID, value, str); + + // add callbacks to disable the Edit menu in openvibe designer, which will in turn enable using stuff like copy-paste inside the widget + const CString entryName = data->scenario->m_SettingHelper->getSettingEntryWidgetName(typeID); + GtkWidget* entryValue = GTK_WIDGET(gtk_builder_get_object(builder, entryName.toASCIIString())); + + data->widgetValue = value; + data->widgetEntryValue = entryValue; + + g_signal_connect(entryValue, "changed", G_CALLBACK(modify_scenario_setting_default_value_cb), data); + + g_object_unref(builder); +} + +static void delete_scenario_setting_cb(GtkWidget* /*button*/, CInterfacedScenario::setting_cb_data_t* data) +{ + data->scenario->m_Scenario.removeSetting(data->index); + data->scenario->redrawConfigureScenarioSettingsDialog(); +} + +static void modify_scenario_setting_name_cb(GtkWidget* entry, CInterfacedScenario::setting_cb_data_t* data) +{ + data->scenario->m_Scenario.setSettingName(data->index, gtk_entry_get_text(GTK_ENTRY(entry))); +} + +static void reset_scenario_setting_identifier_cb(GtkWidget* /*button*/, CInterfacedScenario::setting_cb_data_t* data) +{ + const CIdentifier id = data->scenario->m_Scenario.getUnusedSettingIdentifier(CIdentifier::undefined()); + if (id != CIdentifier::undefined()) + { + data->scenario->m_Scenario.updateInterfacorIdentifier(Kernel::EBoxInterfacorType::Setting, data->index, id); + data->scenario->redrawConfigureScenarioSettingsDialog(); + } +} + +static void modify_scenario_setting_identifier_cb(GtkWidget* entry, CInterfacedScenario::setting_cb_data_t* data) +{ + CIdentifier id; + if (id.fromString(gtk_entry_get_text(GTK_ENTRY(entry)))) + { + data->scenario->m_Scenario.updateInterfacorIdentifier(Kernel::EBoxInterfacorType::Setting, data->index, id); + } +} + +static void edit_scenario_link_cb(GtkWidget* /*widget*/, CInterfacedScenario::link_cb_data_t* data) +{ + if (data->input) { data->scenario->editScenarioInputCB(data->index); } + else { data->scenario->editScenarioOutputCB(data->index); } + data->scenario->redraw(); +} + +static void modify_scenario_link_move_up_cb(GtkWidget* /*widget*/, CInterfacedScenario::link_cb_data_t* data) +{ + if (data->index == 0) { return; } + if (data->input) { data->scenario->swapScenarioInputs(data->index - 1, data->index); } + else { data->scenario->swapScenarioOutputs(data->index - 1, data->index); } + + data->scenario->snapshotCB(); +} + +static void modify_scenario_link_move_down_cb(GtkWidget* /*widget*/, CInterfacedScenario::link_cb_data_t* data) +{ + const auto interfacorType = data->input ? Kernel::Input : Kernel::Output; + if (data->scenario->m_Scenario.getInterfacorCount(interfacorType) < 2 + || data->index >= data->scenario->m_Scenario.getInterfacorCount(interfacorType) - 1) { return; } + + if (data->input) { data->scenario->swapScenarioInputs(data->index, data->index + 1); } + else { data->scenario->swapScenarioOutputs(data->index, data->index + 1); } + data->scenario->snapshotCB(); +} + +static void delete_scenario_link_cb(GtkButton* /*button*/, CInterfacedScenario::link_cb_data_t* data) +{ + if (data->input) + { + data->scenario->m_Scenario.removeScenarioInput(data->index); + data->scenario->redrawScenarioInputSettings(); + } + else + { + data->scenario->m_Scenario.removeScenarioOutput(data->index); + data->scenario->redrawScenarioOutputSettings(); + } + + data->scenario->snapshotCB(); + data->scenario->redraw(); +} + +/* +static void modify_scenario_link_name_cb(GtkWidget* entry, CInterfacedScenario::link_cb_data_t* data) +{ + if (data->m_isInput) { data->m_interfacedScenario->m_scenario.setInputName(data->m_uiLinkIdx, gtk_entry_get_text(GTK_ENTRY(entry))); } + else { data->m_interfacedScenario->m_scenario.setOutputName(data->m_uiLinkIdx, gtk_entry_get_text(GTK_ENTRY(entry))); } +} + +static void modify_scenario_link_type_cb(GtkWidget* comboBox, CInterfacedScenario::link_cb_data_t* data) +{ + const CIdentifier typeID = data->m_interfacedScenario->m_mStreamType[gtk_combo_box_get_active_text(GTK_COMBO_BOX(comboBox))]; + if (data->m_isInput) { data->m_interfacedScenario->m_scenario.setInputType(data->m_uiLinkIdx, typeID); } + else { data->m_interfacedScenario->m_scenario.setOutputType(data->m_uiLinkIdx, typeID); } + data->m_interfacedScenario->redraw(); +} +//*/ + +// Redraw Static Helper +static std::array get4PointsInterfacorRedraw(const int size, const int shiftX, const int shiftY) +{ + std::array points; + points[0].x = size >> 1; + points[0].y = size; + points[1].x = 0; + points[1].y = 0; + points[2].x = size - 1; + points[2].y = 0; + for (int j = 0; j < 3; ++j) + { + points[j].x += shiftX; + points[j].y += shiftY; + } + return points; +} + +static void drawScenarioTextIOIndex(GtkWidget* widget, GdkGC* gcline, const size_t index, const gint xText, const gint yText, + const gint xL1, const gint yL1, const gint xL2, const gint yL2) +{ + PangoContext* pangoCtx = gtk_widget_get_pango_context(widget); + PangoLayout* pangoLayout = pango_layout_new(pangoCtx); + pango_layout_set_alignment(pangoLayout, PANGO_ALIGN_CENTER); + pango_layout_set_markup(pangoLayout, std::to_string(index + 1).c_str(), -1); + gdk_draw_layout(widget->window, widget->style->text_gc[GTK_WIDGET_STATE(widget)], xText, yText, pangoLayout); + g_object_unref(pangoLayout); + gdk_draw_line(widget->window, gcline, xL1, yL1, xL2, yL2); +} + +static void drawBorderInterfacor(GtkWidget* widget, GdkGC* gc, GdkColor& color, std::array points, const int border, const bool isDeprecated) +{ + gdk_gc_set_rgb_fg_color(gc, &color); + gdk_draw_polygon(widget->window, gc, TRUE, points.data(), 3); + if (isDeprecated) { gdk_gc_set_rgb_fg_color(gc, &gColors[Color_LinkInvalid]); } + else { gdk_gc_set_rgb_fg_color(gc, &gColors[border]); } + gdk_draw_polygon(widget->window, gc, FALSE, points.data(), 3); +} + +static void drawCircleWithBorder(GtkWidget* widget, GdkGC* gc, GdkColor& bgColor, GdkColor& fgColor, const gint x, const gint y, const gint radius) +{ + gdk_gc_set_rgb_fg_color(gc, &bgColor); + gdk_draw_arc(widget->window, gc, TRUE, x, y, radius, radius, 0, 64 * 360); + gdk_gc_set_rgb_fg_color(gc, &fgColor); + gdk_draw_arc(widget->window, gc, FALSE, x, y, radius, radius, 0, 64 * 360); +} + +static void linkHandler(Kernel::ILink* link, const int x, const int y, const CIdentifier& attX, const CIdentifier& attY) +{ + if (link) + { + TAttributeHandler handler(*link); + + if (!handler.hasAttribute(attX)) { handler.addAttribute(attX, x); } + else { handler.setAttributeValue(attX, x); } + + if (!handler.hasAttribute(attY)) { handler.addAttribute(attY, y); } + else { handler.setAttributeValue(attY, y); } + } +} + +CInterfacedScenario::CInterfacedScenario(const Kernel::IKernelContext& ctx, CApplication& application, Kernel::IScenario& scenario, CIdentifier& scenarioID, + GtkNotebook& notebook, const char* guiFilename, const char* guiSettingsFilename) + : m_PlayerStatus(Kernel::EPlayerStatus::Stop), m_ScenarioID(scenarioID), m_Application(application), m_Scenario(scenario), + m_kernelCtx(ctx), m_notebook(notebook), m_guiFilename(guiFilename), m_guiSettingsFilename(guiSettingsFilename) +{ + m_guiBuilder = gtk_builder_new(); + gtk_builder_add_from_file(m_guiBuilder, m_guiFilename.c_str(), nullptr); + gtk_builder_connect_signals(m_guiBuilder, nullptr); + + std::ifstream settingGUIFilestream; + FS::Files::openIFStream(settingGUIFilestream, m_guiSettingsFilename.c_str()); + m_SerializedSettingGUIXML = std::string((std::istreambuf_iterator(settingGUIFilestream)), std::istreambuf_iterator()); + + m_SettingHelper = new CSettingCollectionHelper(m_kernelCtx, m_guiSettingsFilename.c_str()); + + // We will need to access setting types by their name later + CIdentifier typeID; + while ((typeID = m_kernelCtx.getTypeManager().getNextTypeIdentifier(typeID)) != CIdentifier::undefined()) + { + if (!m_kernelCtx.getTypeManager().isStream(typeID)) { m_SettingTypes[m_kernelCtx.getTypeManager().getTypeName(typeID).toASCIIString()] = typeID; } + else { m_streamTypes[m_kernelCtx.getTypeManager().getTypeName(typeID).toASCIIString()] = typeID; } + } + + m_notebookPageTitle = GTK_WIDGET(gtk_builder_get_object(m_guiBuilder, "openvibe_scenario_notebook_title")); + m_notebookPageContent = GTK_WIDGET(gtk_builder_get_object(m_guiBuilder, "openvibe_scenario_notebook_scrolledwindow")); + + gtk_notebook_remove_page(GTK_NOTEBOOK(gtk_builder_get_object(m_guiBuilder, "openvibe-scenario_notebook")), 0); + gtk_notebook_remove_page(GTK_NOTEBOOK(gtk_builder_get_object(m_guiBuilder, "openvibe-scenario_notebook")), 0); + gtk_notebook_append_page(&m_notebook, m_notebookPageContent, m_notebookPageTitle); + gtk_notebook_set_tab_reorderable(&m_notebook, m_notebookPageContent, 1); + + GtkWidget* closeWidget = GTK_WIDGET(gtk_builder_get_object(m_guiBuilder, "openvibe-scenario_button_close")); + g_signal_connect(G_OBJECT(closeWidget), "clicked", G_CALLBACK(scenario_title_button_close_cb), this); + + m_scenarioDrawingArea = GTK_DRAWING_AREA(gtk_builder_get_object(m_guiBuilder, "openvibe-scenario_drawing_area")); + m_scenarioViewport = GTK_VIEWPORT(gtk_builder_get_object(m_guiBuilder, "openvibe-scenario_viewport")); + gtk_drag_dest_set(GTK_WIDGET(m_scenarioDrawingArea), GTK_DEST_DEFAULT_ALL, targets, sizeof(targets) / sizeof(GtkTargetEntry), GDK_ACTION_COPY); + g_signal_connect(G_OBJECT(m_scenarioDrawingArea), "expose_event", G_CALLBACK(scenario_drawing_area_expose_cb), this); + g_signal_connect(G_OBJECT(m_scenarioDrawingArea), "drag_data_received", G_CALLBACK(scenario_drawing_area_drag_data_received_cb), this); + g_signal_connect(G_OBJECT(m_scenarioDrawingArea), "motion_notify_event", G_CALLBACK(scenario_drawing_area_motion_notify_cb), this); + g_signal_connect(G_OBJECT(m_scenarioDrawingArea), "button_press_event", G_CALLBACK(scenario_drawing_area_button_pressed_cb), this); + g_signal_connect(G_OBJECT(m_scenarioDrawingArea), "button_release_event", G_CALLBACK(scenario_drawing_area_button_released_cb), this); + g_signal_connect(G_OBJECT(m_scenarioDrawingArea), "key-press-event", G_CALLBACK(scenario_drawing_area_key_press_event_cb), this); + g_signal_connect(G_OBJECT(m_scenarioDrawingArea), "key-release-event", G_CALLBACK(scenario_drawing_area_key_release_event_cb), this); + g_signal_connect(G_OBJECT(m_notebookPageContent), "scroll-event", G_CALLBACK(scenario_scrolledwindow_scroll_event_cb), this); + + m_mensiaLogoPixbuf = gdk_pixbuf_new_from_file(Directories::getDataDir() + "/applications/designer/mensia-decoration.png", nullptr); + +#if defined TARGET_OS_Windows + // add drag-n-drop capabilities onto the scenario notebook to open new scenario + gtk_drag_dest_add_uri_targets(GTK_WIDGET(m_scenarioDrawingArea)); +#endif + + //retrieve visualization tree + + m_Application.m_VisualizationMgr->createVisualizationTree(m_TreeID); + m_Tree = &m_Application.m_VisualizationMgr->getVisualizationTree(m_TreeID); + m_Tree->init(&m_Scenario); + + //create window manager + m_DesignerVisualization = new CDesignerVisualization(m_kernelCtx, *m_Tree, *this); + m_DesignerVisualization->init(std::string(guiFilename)); + + m_configureSettingsDialog = GTK_WIDGET(gtk_builder_get_object(m_Application.m_Builder, "dialog_scenario_configuration")); + m_settingsVBox = GTK_WIDGET(gtk_builder_get_object(m_Application.m_Builder, "dialog_scenario_configuration-vbox")); + m_noHelpDialog = GTK_WIDGET(gtk_builder_get_object(m_Application.m_Builder, "dialog_no_help")); + m_errorPendingDeprecatedInterfacorsDialog = GTK_WIDGET(gtk_builder_get_object(m_Application.m_Builder, "dialog_pending_deprecated_interfacors")); + + this->redrawScenarioSettings(); + this->redrawScenarioInputSettings(); + this->redrawScenarioOutputSettings(); + + m_StateStack.reset(new CScenarioStateStack(ctx, *this, scenario)); + + CInterfacedScenario::updateScenarioLabel(); + + // Output a log message if any box of the scenario is in some special state + CIdentifier boxID = CIdentifier::undefined(); + bool warningUpdate = false; + bool warningDeprecated = false; + bool warningUnknown = false; + while ((boxID = m_Scenario.getNextBoxIdentifier(boxID)) != CIdentifier::undefined()) + { + //const IBox *box = m_scenario.getBoxDetails(l_oBoxID); + //const CBoxProxy proxy(m_kernelCtx, *box); + const CBoxProxy proxy(m_kernelCtx, m_Scenario, boxID); + + if (!warningUpdate && !proxy.isUpToDate()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << + "Scenario requires 'update' of some box(es). You need to replace these boxes or the scenario may not work correctly.\n"; + warningUpdate = true; + } + if (!warningDeprecated && proxy.isDeprecated()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Scenario constains deprecated box(es). Please consider using other boxes instead.\n"; + warningDeprecated = true; + } + // if (!noteUnstable && proxy.isUnstable()) + // { + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "Scenario contains unstable box(es).\n"; + // noteUnstable = true; + // } + if (!warningUnknown && !proxy.isBoxAlgorithmPluginPresent()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Scenario contains unknown box algorithm(s).\n"; + if (proxy.isMetabox()) + { + CString mPath = m_kernelCtx.getConfigurationManager().expand("${Kernel_Metabox}"); + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Some Metaboxes could not be found in [" << mPath << "]\n"; + } + warningUnknown = true; + } + } +} + +CInterfacedScenario::~CInterfacedScenario() +{ + //delete window manager + delete m_DesignerVisualization; + + if (m_stencilBuffer != nullptr) { g_object_unref(m_stencilBuffer); } + + g_object_unref(m_guiBuilder); + /* + g_object_unref(m_builder); + g_object_unref(m_builder); + */ + + gtk_notebook_remove_page(&m_notebook, gtk_notebook_page_num(&m_notebook, m_notebookPageContent)); +} + +void CInterfacedScenario::redraw() +{ + if (GDK_IS_WINDOW(GTK_WIDGET(m_scenarioDrawingArea)->window)) { gdk_window_invalidate_rect(GTK_WIDGET(m_scenarioDrawingArea)->window, nullptr, 1); } +} + +// This function repaints the dialog which opens when configuring settings +void CInterfacedScenario::redrawConfigureScenarioSettingsDialog() +{ + if (m_HasFileName) + { + char filename[1024]; + FS::Files::getFilename(m_Filename.c_str(), filename); + const std::string title = std::string("Settings for \"") + filename + "\""; + gtk_window_set_title(GTK_WINDOW(m_configureSettingsDialog), title.c_str()); + } + else { gtk_window_set_title(GTK_WINDOW(m_configureSettingsDialog), "Settings for an unnamed scenario"); } + + GList* widgets = gtk_container_get_children(GTK_CONTAINER(m_settingsVBox)); + for (GList* it = widgets; it != nullptr; it = g_list_next(it)) { gtk_widget_destroy(GTK_WIDGET(it->data)); } + g_list_free(widgets); + + m_settingConfigCBDatas.clear(); + m_settingConfigCBDatas.resize(m_Scenario.getSettingCount()); + + if (m_Scenario.getSettingCount() == 0) + { + GtkWidget* widget = gtk_label_new("This scenario has no settings"); + gtk_box_pack_start(GTK_BOX(m_settingsVBox), widget, TRUE, TRUE, 5); + } + else + { + for (size_t i = 0; i < m_Scenario.getSettingCount(); ++i) + { + GtkBuilder* builder = gtk_builder_new(); + gtk_builder_add_from_string(builder, m_SerializedSettingGUIXML.c_str(), m_SerializedSettingGUIXML.length(), nullptr); + + GtkWidget* container = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_configuration_setting-table")); + // this has to be done since the widget is already inside a parent in the gtkbuilder + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(container)), container); + gtk_box_pack_start(GTK_BOX(m_settingsVBox), container, FALSE, FALSE, 5); + + GtkWidget* entryName = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_configuration_setting-entry_name")); + GtkWidget* comboBoxType = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_configuration_setting-combobox_type")); + GtkWidget* buttonUp = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_configuration_setting-button_move_up")); + GtkWidget* buttonDown = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_configuration_setting-button_move_down")); + GtkWidget* buttonDelete = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_configuration_setting-button_delete")); + GtkWidget* entryID = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_configuration_setting-entry_identifier")); + GtkWidget* buttonResetID = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_configuration_setting-button_reset_identifier")); + + // fill the type dropdown + CIdentifier typeID = CIdentifier::undefined(); + m_Scenario.getSettingType(i, typeID); + + CIdentifier id; + CString str; + gint idx = 0; + while ((id = m_kernelCtx.getTypeManager().getNextTypeIdentifier(id)) != CIdentifier::undefined()) + { + if (!m_kernelCtx.getTypeManager().isStream(id)) + { + gtk_combo_box_append_text(GTK_COMBO_BOX(comboBoxType), m_kernelCtx.getTypeManager().getTypeName(id).toASCIIString()); + if (id == typeID) { gtk_combo_box_set_active(GTK_COMBO_BOX(comboBoxType), idx); } + idx++; + } + } + // Set name + m_Scenario.getSettingName(i, str); + gtk_entry_set_text(GTK_ENTRY(entryName), str.toASCIIString()); + + // Set the identifer + m_Scenario.getInterfacorIdentifier(Kernel::EBoxInterfacorType::Setting, i, id); + gtk_entry_set_text(GTK_ENTRY(entryID), id.str().c_str()); + + // Add widget for the actual setting + str = m_SettingHelper->getSettingWidgetName(typeID); + GtkWidget* defaultValue = GTK_WIDGET(gtk_builder_get_object(builder, str.toASCIIString())); + + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(defaultValue)), defaultValue); + gtk_table_attach_defaults(GTK_TABLE(container), defaultValue, 1, 5, 1, 2); + + // Set the value and connect GUI callbacks (because, yes, setValue connects callbacks like a ninja) + m_Scenario.getSettingDefaultValue(i, str); + m_SettingHelper->setValue(typeID, defaultValue, str); + + // add callbacks to disable the Edit menu in openvibe designer, which will in turn enable using stuff like copy-paste inside the widget + str = m_SettingHelper->getSettingEntryWidgetName(typeID); + GtkWidget* entryDefaultValue = GTK_WIDGET(gtk_builder_get_object(builder, str.toASCIIString())); + + // Set the callbacks + setting_cb_data_t cbData; + cbData.scenario = this; + cbData.index = i; + cbData.widgetValue = defaultValue; + cbData.widgetEntryValue = entryDefaultValue; + cbData.container = container; + + m_settingConfigCBDatas[i] = cbData; + + // Connect signals of the container + g_signal_connect(G_OBJECT(comboBoxType), "changed", G_CALLBACK(modify_scenario_setting_type_cb), &m_settingConfigCBDatas[i]); + g_signal_connect(G_OBJECT(buttonDelete), "clicked", G_CALLBACK(delete_scenario_setting_cb), &m_settingConfigCBDatas[i]); + g_signal_connect(G_OBJECT(buttonUp), "clicked", G_CALLBACK(modify_scenario_setting_move_up_cb), &m_settingConfigCBDatas[i]); + g_signal_connect(G_OBJECT(buttonDown), "clicked", G_CALLBACK(modify_scenario_setting_move_down_cb), &m_settingConfigCBDatas[i]); + g_signal_connect(G_OBJECT(entryName), "changed", G_CALLBACK(modify_scenario_setting_name_cb), &m_settingConfigCBDatas[i]); + g_signal_connect(G_OBJECT(entryID), "activate", G_CALLBACK(modify_scenario_setting_identifier_cb), &m_settingConfigCBDatas[i]); + g_signal_connect(G_OBJECT(buttonResetID), "clicked", G_CALLBACK(reset_scenario_setting_identifier_cb), &m_settingConfigCBDatas[i]); + + // these callbacks assure that we can use copy/paste and undo within editable fields + // as otherwise the keyboard shortucts are stolen by the designer + g_signal_connect(G_OBJECT(entryName), "focus-in-event", G_CALLBACK(editable_widget_focus_in_cb), &m_Application); + g_signal_connect(G_OBJECT(entryName), "focus-out-event", G_CALLBACK(editable_widget_focus_out_cb), &m_Application); + g_signal_connect(G_OBJECT(entryDefaultValue), "focus-in-event", G_CALLBACK(editable_widget_focus_in_cb), &m_Application); + g_signal_connect(G_OBJECT(entryDefaultValue), "focus-out-event", G_CALLBACK(editable_widget_focus_out_cb), &m_Application); + + // add callbacks for setting the settings + g_signal_connect(entryDefaultValue, "changed", G_CALLBACK(modify_scenario_setting_default_value_cb), &m_settingConfigCBDatas[i]); + + g_object_unref(builder); + } + } +} + +// This function, similar to the previous one, repaints the settings handling sidebar +void CInterfacedScenario::redrawScenarioSettings() +{ + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_Application.m_Builder, "openvibe-scenario_configuration_vbox")); + + GList* widgets = gtk_container_get_children(GTK_CONTAINER(widget)); + for (GList* settingIterator = widgets; settingIterator != nullptr; settingIterator = g_list_next(settingIterator)) + { + gtk_widget_destroy(GTK_WIDGET(settingIterator->data)); + } + g_list_free(widgets); + + m_settingCBDatas.clear(); + m_settingCBDatas.resize(m_Scenario.getSettingCount()); + + if (m_Scenario.getSettingCount() == 0) + { + GtkWidget* label = gtk_label_new("This scenario has no settings"); + gtk_box_pack_start(GTK_BOX(widget), label, TRUE, TRUE, 5); + } + else + { + for (size_t i = 0; i < m_Scenario.getSettingCount(); ++i) + { + GtkBuilder* builder = gtk_builder_new(); + gtk_builder_add_from_string(builder, m_SerializedSettingGUIXML.c_str(), m_SerializedSettingGUIXML.length(), nullptr); + + GtkWidget* container = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_setting-table")); + // this has to be done since the widget is already inside a parent in the gtkbuilder + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(container)), container); + gtk_box_pack_start(GTK_BOX(widget), container, FALSE, FALSE, 5); + + GtkWidget* labelName = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_setting-label")); + GtkWidget* buttonDefault = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_setting-button_default")); + GtkWidget* buttonCopy = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_setting-button_copy")); + + // Set name + CString str; + m_Scenario.getSettingName(i, str); + gtk_label_set_text(GTK_LABEL(labelName), str.toASCIIString()); + gtk_misc_set_alignment(GTK_MISC(labelName), 0.0, 0.5); + + // Add widget for the actual setting + CIdentifier typeID = CIdentifier::undefined(); + m_Scenario.getSettingType(i, typeID); + str = m_SettingHelper->getSettingWidgetName(typeID); + + GtkWidget* value = GTK_WIDGET(gtk_builder_get_object(builder, str.toASCIIString())); + + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(value)), value); + gtk_table_attach_defaults(GTK_TABLE(container), value, 0, 1, 1, 2); + + // Set the value and connect GUI callbacks (because, yes, setValue connects callbacks like a ninja) + m_Scenario.getSettingValue(i, str); + m_SettingHelper->setValue(typeID, value, str); + + // add callbacks to disable the Edit menu in openvibe designer, which will in turn enable using stuff like copy-paste inside the widget + str = m_SettingHelper->getSettingEntryWidgetName(typeID); + GtkWidget* entryValue = GTK_WIDGET(gtk_builder_get_object(builder, str.toASCIIString())); + + // Set the callbacks + setting_cb_data_t cbData; + cbData.scenario = this; + cbData.index = i; + cbData.widgetValue = value; + cbData.widgetEntryValue = entryValue; + cbData.container = container; + + m_settingCBDatas[i] = cbData; + + // these callbacks assure that we can use copy/paste and undo within editable fields + // as otherwise the keyboard shortucts are stolen by the designer + g_signal_connect(G_OBJECT(entryValue), "focus-in-event", G_CALLBACK(editable_widget_focus_in_cb), &m_Application); + g_signal_connect(G_OBJECT(entryValue), "focus-out-event", G_CALLBACK(editable_widget_focus_out_cb), &m_Application); + + // add callbacks for setting the settings + g_signal_connect(entryValue, "changed", G_CALLBACK(modify_scenario_setting_value_cb), &m_settingCBDatas[i]); + g_signal_connect(buttonDefault, "clicked", G_CALLBACK(modify_scenario_setting_revert_to_default_cb), &m_settingCBDatas[i]); + g_signal_connect(buttonCopy, "clicked", G_CALLBACK(copy_scenario_setting_token_cb), &m_settingCBDatas[i]); + + g_object_unref(builder); + } + } + gtk_widget_show_all(widget); +} + +void CInterfacedScenario::redrawScenarioInputSettings() +{ + size_t (Kernel::IScenario::* getNLink)() const = &Kernel::IScenario::getInputCount; + bool (Kernel::IScenario::* getLinkName)(size_t, CString&) const = &Kernel::IScenario::getInputName; + bool (Kernel::IScenario::* getLinkType)(size_t, CIdentifier&) const = &Kernel::IScenario::getInputType; + + this->redrawScenarioLinkSettings(m_Application.m_Inputs, true, m_scenarioInputCBDatas, getNLink, getLinkName, getLinkType); +} + +void CInterfacedScenario::redrawScenarioOutputSettings() +{ + size_t (Kernel::IScenario::* getNLink)() const = &Kernel::IScenario::getOutputCount; + bool (Kernel::IScenario::* getLinkName)(size_t, CString&) const = &Kernel::IScenario::getOutputName; + bool (Kernel::IScenario::* getLinkType)(size_t, CIdentifier&) const = &Kernel::IScenario::getOutputType; + + this->redrawScenarioLinkSettings(m_Application.m_Outputs, false, m_scenarioOutputCBDatas, getNLink, getLinkName, getLinkType); +} + +// Redraws the tab containing inputs or outputs of the scenario +// This method receives pointers to methods that manipulate either intpus or outputs so it can be generic +void CInterfacedScenario::redrawScenarioLinkSettings(GtkWidget* links, const bool isInput, std::vector& linkCBDatas, + size_t (Kernel::IScenario::* getNLink)() const, + bool (Kernel::IScenario::* getLinkName)(size_t, CString&) const, + bool (Kernel::IScenario::* getLinkType)(size_t, CIdentifier&) const) +{ + GList* widgets = gtk_container_get_children(GTK_CONTAINER(links)); + for (GList* it = widgets; it != nullptr; it = g_list_next(it)) { gtk_widget_destroy(GTK_WIDGET(it->data)); } + g_list_free(widgets); + + const size_t nLink = (m_Scenario.*getNLink)(); + + linkCBDatas.clear(); + linkCBDatas.resize(nLink); + + gtk_table_resize(GTK_TABLE(links), nLink == 0 ? 1 : nLink, 7); + + if (nLink == 0) + { + GtkWidget* settingPlaceholderLabel = gtk_label_new("This scenario has none"); + gtk_table_attach_defaults(GTK_TABLE(links), settingPlaceholderLabel, 0, 1, 0, 1); + } + else + { + for (size_t i = 0; i < nLink; ++i) + { + GtkBuilder* builder = gtk_builder_new(); + gtk_builder_add_from_string(builder, m_SerializedSettingGUIXML.c_str(), m_SerializedSettingGUIXML.length(), nullptr); + + GtkWidget* container = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_io_setting-table")); + // this has to be done since the widget is already inside a parent in the gtkbuilder + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(container)), container); + + GtkWidget* entryLinkName = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_io_setting-label")); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(entryLinkName)), entryLinkName); + + GtkWidget* comboBoxType = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_io_setting-combobox_type")); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(comboBoxType)), comboBoxType); + + // fill the type dropdown + CIdentifier typeID = CIdentifier::undefined(); + (m_Scenario.*getLinkType)(i, typeID); + + CIdentifier id; + gint idx = 0; + while ((id = m_kernelCtx.getTypeManager().getNextTypeIdentifier(id)) != CIdentifier::undefined()) + { + if (m_kernelCtx.getTypeManager().isStream(id)) + { + gtk_combo_box_append_text(GTK_COMBO_BOX(comboBoxType), m_kernelCtx.getTypeManager().getTypeName(id).toASCIIString()); + if (id == typeID) { gtk_combo_box_set_active(GTK_COMBO_BOX(comboBoxType), idx); } + + idx++; + } + } + gtk_combo_box_set_button_sensitivity(GTK_COMBO_BOX(comboBoxType), GTK_SENSITIVITY_OFF); + + GtkWidget* buttonUp = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_io_setting-button_move_up")); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(buttonUp)), buttonUp); + GtkWidget* buttonDown = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_io_setting-button_move_down")); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(buttonDown)), buttonDown); + GtkWidget* buttonEdit = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_io_setting-button_edit")); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(buttonEdit)), buttonEdit); + GtkWidget* buttonDelete = GTK_WIDGET(gtk_builder_get_object(builder, "scenario_io_setting-button_delete")); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(buttonDelete)), buttonDelete); + + // Set name + CString str; + (m_Scenario.*getLinkName)(i, str); + gtk_label_set_text(GTK_LABEL(entryLinkName), str.toASCIIString()); + gtk_misc_set_alignment(GTK_MISC(entryLinkName), 0.0, 0.5); + gtk_widget_set_sensitive(GTK_WIDGET(entryLinkName), GTK_SENSITIVITY_OFF); + + gtk_table_attach(GTK_TABLE(links), entryLinkName, 0, 1, i, i + 1, GtkAttachOptions(GTK_EXPAND | GTK_FILL), GTK_SHRINK, 4, 4); + gtk_table_attach(GTK_TABLE(links), comboBoxType, 1, 2, i, i + 1, GTK_SHRINK, GTK_SHRINK, 4, 4); + gtk_table_attach(GTK_TABLE(links), buttonUp, 3, 4, i, i + 1, GTK_SHRINK, GTK_SHRINK, 4, 4); + gtk_table_attach(GTK_TABLE(links), buttonDown, 4, 5, i, i + 1, GTK_SHRINK, GTK_SHRINK, 4, 4); + gtk_table_attach(GTK_TABLE(links), buttonEdit, 5, 6, i, i + 1, GTK_SHRINK, GTK_SHRINK, 4, 4); + gtk_table_attach(GTK_TABLE(links), buttonDelete, 6, 7, i, i + 1, GTK_SHRINK, GTK_SHRINK, 4, 4); + + // Set the callbacks + link_cb_data_t cbData; + cbData.scenario = this; + cbData.index = i; + cbData.input = isInput; + + linkCBDatas[i] = cbData; + + g_signal_connect(G_OBJECT(buttonDelete), "clicked", G_CALLBACK(delete_scenario_link_cb), &linkCBDatas[i]); + g_signal_connect(G_OBJECT(buttonEdit), "clicked", G_CALLBACK(edit_scenario_link_cb), &linkCBDatas[i]); + g_signal_connect(G_OBJECT(buttonUp), "clicked", G_CALLBACK(modify_scenario_link_move_up_cb), &linkCBDatas[i]); + g_signal_connect(G_OBJECT(buttonDown), "clicked", G_CALLBACK(modify_scenario_link_move_down_cb), &linkCBDatas[i]); + + g_object_unref(builder); + } + } + + gtk_widget_show_all(links); +} + +void CInterfacedScenario::updateScenarioLabel() +{ + GtkLabel* gtkLabel = GTK_LABEL(gtk_builder_get_object(m_guiBuilder, "openvibe-scenario_label")); + std::string label; + std::string filename = m_Filename; + std::string labelUntrimmed = "unsaved document"; + std::string::size_type pos; + while ((pos = filename.find('\\')) != std::string::npos) { filename[pos] = '/'; } + + label += m_HasBeenModified ? "*" : ""; + label += " "; + + // trimming file name if the number of character is above ${Designer_ScenarioFileNameTrimmingLimit} + // trim only unselected scenarios + if (m_HasFileName) + { + labelUntrimmed = filename; + filename = filename.substr(filename.rfind('/') + 1); + size_t trimLimit = size_t(m_kernelCtx.getConfigurationManager().expandAsUInteger("${Designer_ScenarioFileNameTrimmingLimit}", 25)); + if (trimLimit > 3) { trimLimit -= 3; } // limit should include the '...' + // default = we trim everything but the current scenario filename + // if {we are stacking horizontally the scenarios, we trim also } current filename to avoid losing too much of the edition panel. + if (filename.size() > trimLimit) + { + if (m_Application.getCurrentInterfacedScenario() == this + && m_kernelCtx.getConfigurationManager().expandAsBoolean("${Designer_ScenarioTabsVerticalStack}", false)) + { + filename = "..." + filename.substr(filename.size() - trimLimit, trimLimit); + } + if (m_Application.getCurrentInterfacedScenario() != this) + { + filename = filename.substr(0, trimLimit); + filename += "..."; + } + } + label += filename; + } + else { label += "(untitled)"; } + + label += " "; + label += m_HasBeenModified ? "*" : ""; + + gtk_label_set_text(gtkLabel, label.c_str()); + + label = labelUntrimmed; + pos = 0; + while ((pos = label.find('&', pos)) != std::string::npos) + { + label.replace(pos, 1, "&"); + pos += 5; + } + gtk_widget_set_tooltip_markup(GTK_WIDGET(gtkLabel), ("" + label + (m_HasBeenModified ? " - unsaved" : "") + "").c_str()); +} + +#define UPDATE_STENCIL_IDX(id,stencilgc) { (id)++; ::GdkColor sc={0, guint16(((id)&0xff0000)>>8), guint16((id)&0xff00), guint16(((id)&0xff)<<8) }; gdk_gc_set_rgb_fg_color(stencilgc, &sc); } + +void CInterfacedScenario::redraw(Kernel::IBox& box) +{ + GtkWidget* widget = GTK_WIDGET(m_scenarioDrawingArea); + GdkGC* stencilGC = gdk_gc_new(GDK_DRAWABLE(m_stencilBuffer)); + GdkGC* drawGC = gdk_gc_new(widget->window); + + const int marginX = int(round(5 * m_currentScale)); + const int marginY = int(round(5 * m_currentScale)); + const int circleSize = int(round(11 * m_currentScale)); + const int circleSpace = int(round(4 * m_currentScale)); + + //CBoxProxy proxy(m_kernelCtx, box); + CBoxProxy proxy(m_kernelCtx, m_Scenario, box.getIdentifier()); + + if (box.getAlgorithmClassIdentifier() == OVP_ClassId_BoxAlgorithm_Metabox) + { + CIdentifier metaboxId; + metaboxId.fromString(box.getAttributeValue(OVP_AttributeId_Metabox_ID)); + proxy.setBoxAlgorithmDescriptorOverride( + static_cast(m_kernelCtx.getMetaboxManager().getMetaboxObjectDesc(metaboxId))); + } + + int sizeX = int(round(proxy.getWidth(GTK_WIDGET(m_scenarioDrawingArea)) * m_currentScale) + marginX * 2); + int sizeY = int(round(proxy.getHeight(GTK_WIDGET(m_scenarioDrawingArea)) * m_currentScale) + marginY * 2); + int startX = int(round(proxy.getXCenter() * m_currentScale + m_viewOffsetX - (sizeX >> 1))); + int startY = int(round(proxy.getYCenter() * m_currentScale + m_viewOffsetY - (sizeY >> 1))); + + UPDATE_STENCIL_IDX(m_interfacedObjectId, stencilGC); + gdk_draw_rounded_rectangle(GDK_DRAWABLE(m_stencilBuffer), stencilGC, TRUE, startX, startY, sizeX, sizeY, gint(round(8.0 * m_currentScale))); + m_interfacedObjects[m_interfacedObjectId] = CInterfacedObject(box.getIdentifier()); + + bool canCreate = proxy.isBoxAlgorithmPluginPresent(); + bool upToDate = canCreate ? proxy.isUpToDate() : true; + bool pendingDeprecatedInterfacors = proxy.hasPendingDeprecatedInterfacors(); + bool deprecated = canCreate && proxy.isDeprecated(); + bool metabox = canCreate && proxy.isMetabox(); + bool disabled = proxy.isDisabled(); + + // Add a thick dashed border around selected boxes + if (m_SelectedObjects.count(box.getIdentifier())) + { + int offsetTL = 2; // Offset Top Left +#if defined TARGET_OS_Windows + int offsetBR = 4; // Offset Bottom Right +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + int offsetBR = 5; // Offset Bottom Right +#else + int offsetBR = 4; // Offset Bottom Right +#endif + if (metabox) + { + offsetTL = 3; + offsetBR = 6; + } + + gdk_gc_set_rgb_fg_color(drawGC, &gColors[Color_BoxBorderSelected]); + gdk_gc_set_line_attributes(drawGC, 1, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_ROUND); + gdk_draw_rounded_rectangle(widget->window, drawGC, TRUE, startX - offsetTL, startY - offsetTL, sizeX + offsetBR, sizeY + offsetBR); + } + + if (!this->isLocked() || !m_DebugCPUUsage) + { + //if(m_currentObject[box.getIdentifier()]) { gdk_gc_set_rgb_fg_color(drawGC, &gColors[Color_BoxBackgroundSelected]); } + //else + if (!canCreate) { gdk_gc_set_rgb_fg_color(drawGC, &gColors[Color_BoxBackgroundMissing]); } + else if (disabled) { gdk_gc_set_rgb_fg_color(drawGC, &gColors[Color_BoxBackgroundDisabled]); } + else if (deprecated) { gdk_gc_set_rgb_fg_color(drawGC, &gColors[Color_BoxBackgroundDeprecated]); } + else if (!upToDate || pendingDeprecatedInterfacors) { gdk_gc_set_rgb_fg_color(drawGC, &gColors[Color_BoxBackgroundOutdated]); } + //else if(metabox) { gdk_gc_set_rgb_fg_color(drawGC, &gColors[Color_BoxBackgroundMetabox]); } + else { gdk_gc_set_rgb_fg_color(drawGC, &gColors[Color_BoxBackground]); } + } + else + { + CIdentifier timeID; + timeID.fromString(box.getAttributeValue(OV_AttributeId_Box_ComputationTimeLastSecond)); + uint64_t time = (timeID == CIdentifier::undefined() ? 0 : timeID.id()); + uint64_t reference = (1LL << 32) / (m_nBox == 0 ? 1 : m_nBox); + + GdkColor color; + if (time < reference) + { + color.pixel = 0; + color.red = guint16((time << 16) / reference); + color.green = 32768; + color.blue = 0; + } + else + { + if (time < reference * 4) + { + color.pixel = 0; + color.red = 65535; + color.green = guint16(32768 - ((time << 15) / (reference * 4))); + color.blue = 0; + } + else + { + color.pixel = 0; + color.red = 65535; + color.green = 0; + color.blue = 0; + } + } + gdk_gc_set_rgb_fg_color(drawGC, &color); + } + + gdk_draw_rounded_rectangle(widget->window, drawGC, TRUE, startX, startY, sizeX, sizeY, gint(round(8.0 * m_currentScale))); + + + int borderColor = Color_BoxBorder; + gdk_gc_set_rgb_fg_color(drawGC, &gColors[borderColor]); + gdk_gc_set_line_attributes(drawGC, 1, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_ROUND); + gdk_draw_rounded_rectangle(widget->window, drawGC, FALSE, startX, startY, sizeX, sizeY, gint(round(8.0 * m_currentScale))); + + if (metabox) + { + gdk_gc_set_rgb_fg_color(drawGC, &gColors[borderColor]); + gdk_gc_set_line_attributes(drawGC, 1, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_ROUND); + gdk_draw_rounded_rectangle(widget->window, drawGC, FALSE, startX - 3, startY - 3, sizeX + 6, sizeY + 6, gint(round(8.0 * m_currentScale))); + } + + TAttributeHandler handler(box); + + int offset = sizeX / 2 - int(box.getInputCount()) * (circleSpace + circleSize) / 2 + circleSize / 4; + for (size_t i = 0; i < box.getInterfacorCountIncludingDeprecated(Kernel::Input); ++i) + { + CIdentifier id; + bool isDeprecated; + box.getInputType(i, id); + box.getInterfacorDeprecatedStatus(Kernel::Input, i, isDeprecated); + + GdkColor color = colorFromIdentifier(id, isDeprecated); + const auto points = get4PointsInterfacorRedraw(circleSize, startX + int(i) * (circleSpace + circleSize) + offset, startY - (circleSize >> 1)); + + UPDATE_STENCIL_IDX(m_interfacedObjectId, stencilGC); + gdk_draw_polygon(GDK_DRAWABLE(m_stencilBuffer), stencilGC, TRUE, points.data(), 3); + m_interfacedObjects[m_interfacedObjectId] = CInterfacedObject(box.getIdentifier(), Box_Input, i); + + drawBorderInterfacor(widget, drawGC, color, points, Color_BoxInputBorder, isDeprecated); + + int x = startX + int(i) * (circleSpace + circleSize) + (circleSize >> 1) - m_viewOffsetX + offset; + int y = startY - (circleSize >> 1) - m_viewOffsetY; + id = m_Scenario.getNextLinkIdentifierToBoxInput(CIdentifier::undefined(), box.getIdentifier(), i); + while (id != CIdentifier::undefined()) + { + Kernel::ILink* link = m_Scenario.getLinkDetails(id); + linkHandler(link, x, y, OV_AttributeId_Link_XDst, OV_AttributeId_Link_YDst); + id = m_Scenario.getNextLinkIdentifierToBoxInput(id, box.getIdentifier(), i); + } + + // Display a circle above inputs that are linked to the box inputs + for (size_t j = 0; j < m_Scenario.getInputCount(); j++) + { + size_t boxInputIdx; + m_Scenario.getScenarioInputLink(j, id, boxInputIdx); + + if (id == box.getIdentifier() && boxInputIdx == i) + { + // Since the circle representing the input is quite large, we are going to offset each other one + int offsetDisc = int(i % 2) * circleSize * 2; + + const int left = startX + int(i) * (circleSpace + circleSize) + offset - int(circleSize * 0.5); + const int top = startY - (circleSize >> 1) - circleSize * 3 - offsetDisc; + + this->m_Scenario.getInputType(j, id); + color = colorFromIdentifier(id, false); + + UPDATE_STENCIL_IDX(m_interfacedObjectId, stencilGC); + gdk_draw_arc(GDK_DRAWABLE(m_stencilBuffer), stencilGC, TRUE, left, top, circleSize * 2, circleSize * 2, 0, 64 * 360); + m_interfacedObjects[m_interfacedObjectId] = CInterfacedObject(box.getIdentifier(), Box_ScenarioInput, i); + + drawCircleWithBorder(widget, drawGC, color, gColors[Color_BoxInputBorder], left, top, circleSize * 2); + + // Draw the text indicating the scenario input index + drawScenarioTextIOIndex(widget, drawGC, j, left + marginX, top + marginY, + startX + int(i) * (circleSpace + circleSize) + offset + (circleSize >> 1), top + circleSize * 2, + startX + int(i) * (circleSpace + circleSize) + offset + (circleSize >> 1), startY - (circleSize >> 1)); + } + } + } + + gdk_gc_set_line_attributes(drawGC, 1, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_ROUND); + + offset = sizeX / 2 - int(box.getOutputCount()) * (circleSpace + circleSize) / 2 + circleSize / 4; + for (size_t i = 0; i < box.getInterfacorCountIncludingDeprecated(Kernel::Output); ++i) + { + CIdentifier id; + bool isDeprecated; + box.getOutputType(i, id); + box.getInterfacorDeprecatedStatus(Kernel::Output, i, isDeprecated); + GdkColor color = colorFromIdentifier(id, isDeprecated); + + const auto points = get4PointsInterfacorRedraw(circleSize, startX + int(i) * (circleSpace + circleSize) + offset, startY - (circleSize >> 1) + sizeY); + UPDATE_STENCIL_IDX(m_interfacedObjectId, stencilGC); + gdk_draw_polygon(GDK_DRAWABLE(m_stencilBuffer), stencilGC, TRUE, points.data(), 3); + + m_interfacedObjects[m_interfacedObjectId] = CInterfacedObject(box.getIdentifier(), Box_Output, i); + + drawBorderInterfacor(widget, drawGC, color, points, Color_BoxOutputBorder, isDeprecated); + + int x = startX + int(i) * (circleSpace + circleSize) + (circleSize >> 1) - m_viewOffsetX + offset; + int y = startY + sizeY + (circleSize >> 1) + 1 - m_viewOffsetY; + id = m_Scenario.getNextLinkIdentifierFromBoxOutput(CIdentifier::undefined(), box.getIdentifier(), i); + while (id != CIdentifier::undefined()) + { + Kernel::ILink* link = m_Scenario.getLinkDetails(id); + if (link) + { + TAttributeHandler attHandler(*link); + linkHandler(link, x, y, OV_AttributeId_Link_XSrc, OV_AttributeId_Link_YSrc); + } + id = m_Scenario.getNextLinkIdentifierFromBoxOutput(id, box.getIdentifier(), i); + } + + // Display a circle below outputs that are linked to the box outputs + for (size_t j = 0; j < m_Scenario.getOutputCount(); j++) + { + size_t boxOutputIdx; + m_Scenario.getScenarioOutputLink(j, id, boxOutputIdx); + if (id == box.getIdentifier() && boxOutputIdx == i) + { + // Since the circle representing the Output is quite large, we are going to offset each other one + int offsetDisc = (int(i) % 2) * circleSize * 2; + + const int left = startX + int(i) * (circleSpace + circleSize) + offset - int(circleSize * 0.5); + const int top = startY - (circleSize >> 1) + sizeY + offsetDisc + circleSize * 2; + + this->m_Scenario.getOutputType(j, id); + color = colorFromIdentifier(id); + + UPDATE_STENCIL_IDX(m_interfacedObjectId, stencilGC); + gdk_draw_arc(GDK_DRAWABLE(m_stencilBuffer), stencilGC, TRUE, left, top, circleSize * 2, circleSize * 2, 0, 64 * 360); + m_interfacedObjects[m_interfacedObjectId] = CInterfacedObject(box.getIdentifier(), Box_ScenarioOutput, i); + + drawCircleWithBorder(widget, drawGC, color, gColors[Color_BoxOutputBorder], left, top, circleSize * 2); + // Draw the text indicating the scenario output index + // This is somewhat the bottom of the triangle indicating a box output + drawScenarioTextIOIndex(widget, drawGC, j, left + marginX, top + marginY, + startX + int(i) * (circleSpace + circleSize) + offset + (circleSize >> 1), top, + startX + int(i) * (circleSpace + circleSize) + offset + (circleSize >> 1), startY + (circleSize >> 2) + sizeY + 2); + } + } + } + + // Draw labels + PangoContext* ctx = gtk_widget_get_pango_context(widget); + PangoLayout* layout = pango_layout_new(ctx); + + // Draw box label + PangoRectangle labelRect; + pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER); + pango_layout_set_markup(layout, proxy.getLabel(), -1); + pango_layout_get_pixel_extents(layout, nullptr, &labelRect); + gdk_draw_layout(widget->window, widget->style->text_gc[GTK_WIDGET_STATE(widget)], startX + marginX, startY + marginY, layout); + + // Draw box status label + PangoRectangle statusRect; + pango_layout_set_markup(layout, proxy.getStatusLabel(), -1); + pango_layout_get_pixel_extents(layout, nullptr, &statusRect); + int shiftX = (std::max(labelRect.width, statusRect.width) - std::min(labelRect.width, statusRect.width)) / 2; + + UPDATE_STENCIL_IDX(m_interfacedObjectId, stencilGC); + gdk_draw_rectangle(GDK_DRAWABLE(m_stencilBuffer), stencilGC, TRUE, startX + shiftX + marginX, startY + labelRect.height + marginY, statusRect.width, + statusRect.height); + m_interfacedObjects[m_interfacedObjectId] = CInterfacedObject(box.getIdentifier(), Box_Update, 0); + gdk_draw_layout(widget->window, widget->style->text_gc[GTK_WIDGET_STATE(widget)], startX + shiftX + marginX, startY + labelRect.height + marginY, layout); + + g_object_unref(layout); + g_object_unref(drawGC); + g_object_unref(stencilGC); +} + +void CInterfacedScenario::redraw(Kernel::IComment& comment) +{ + GtkWidget* widget = GTK_WIDGET(m_scenarioDrawingArea); + GdkGC* stencilGC = gdk_gc_new(GDK_DRAWABLE(m_stencilBuffer)); + GdkGC* drawGC = gdk_gc_new(widget->window); + + // size_t i; + const int marginX = static_cast(round(16 * m_currentScale)); + const int marginY = static_cast(round(16 * m_currentScale)); + + const CCommentProxy proxy(m_kernelCtx, comment); + const int sizeX = proxy.getWidth(GTK_WIDGET(m_scenarioDrawingArea)) + marginX * 2; + const int sizeY = proxy.getHeight(GTK_WIDGET(m_scenarioDrawingArea)) + marginY * 2; + const int startX = int(round(proxy.getXCenter() * m_currentScale + m_viewOffsetX - (sizeX >> 1))); + const int startY = int(round(proxy.getYCenter() * m_currentScale + m_viewOffsetY - (sizeY >> 1))); + + UPDATE_STENCIL_IDX(m_interfacedObjectId, stencilGC); + gdk_draw_rounded_rectangle(GDK_DRAWABLE(m_stencilBuffer), stencilGC, TRUE, startX, startY, sizeX, sizeY, gint(round(16.0 * m_currentScale))); + m_interfacedObjects[m_interfacedObjectId] = CInterfacedObject(comment.getIdentifier()); + + gdk_gc_set_rgb_fg_color(drawGC, &gColors[m_SelectedObjects.count(comment.getIdentifier()) ? Color_CommentBackgroundSelected : Color_CommentBackground]); + gdk_draw_rounded_rectangle(widget->window, drawGC, TRUE, startX, startY, sizeX, sizeY, gint(round(16.0 * m_currentScale))); + gdk_gc_set_rgb_fg_color(drawGC, &gColors[m_SelectedObjects.count(comment.getIdentifier()) ? Color_CommentBorderSelected : Color_CommentBorder]); + gdk_draw_rounded_rectangle(widget->window, drawGC, FALSE, startX, startY, sizeX, sizeY, gint(round(16.0 * m_currentScale))); + + PangoContext* ctx = gtk_widget_get_pango_context(widget); + PangoLayout* layout = pango_layout_new(ctx); + pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER); + if (pango_parse_markup(comment.getText().toASCIIString(), -1, 0, nullptr, nullptr, nullptr, nullptr)) + { + pango_layout_set_markup(layout, comment.getText().toASCIIString(), -1); + } + else { pango_layout_set_text(layout, comment.getText().toASCIIString(), -1); } + gdk_draw_layout(widget->window, widget->style->text_gc[GTK_WIDGET_STATE(widget)], startX + marginX, startY + marginY, layout); + g_object_unref(layout); + + g_object_unref(drawGC); + g_object_unref(stencilGC); +} + +void CInterfacedScenario::redraw(Kernel::ILink& link) +{ + GtkWidget* widget = GTK_WIDGET(m_scenarioDrawingArea); + GdkGC* stencilGC = gdk_gc_new(GDK_DRAWABLE(m_stencilBuffer)); + GdkGC* drawGC = gdk_gc_new(widget->window); + + const CLinkProxy proxy(link); + + CIdentifier srcOutputTypeID; + CIdentifier dstInputTypeID; + + m_Scenario.getBoxDetails(link.getSourceBoxIdentifier())->getOutputType(link.getSourceBoxOutputIndex(), srcOutputTypeID); + m_Scenario.getBoxDetails(link.getTargetBoxIdentifier())->getInputType(link.getTargetBoxInputIndex(), dstInputTypeID); + + if (link.hasAttribute(OV_AttributeId_Link_Invalid)) { gdk_gc_set_rgb_fg_color(drawGC, &gColors[Color_LinkInvalid]); } + else if (m_SelectedObjects.count(link.getIdentifier())) { gdk_gc_set_rgb_fg_color(drawGC, &gColors[Color_LinkSelected]); } + else if (dstInputTypeID == srcOutputTypeID) { gdk_gc_set_rgb_fg_color(drawGC, &gColors[Color_Link]); } + else + { + if (m_kernelCtx.getTypeManager().isDerivedFromStream(srcOutputTypeID, dstInputTypeID)) + { + gdk_gc_set_rgb_fg_color(drawGC, &gColors[Color_LinkDownCast]); + } + else if (m_kernelCtx.getTypeManager().isDerivedFromStream(dstInputTypeID, srcOutputTypeID)) + { + gdk_gc_set_rgb_fg_color(drawGC, &gColors[Color_LinkUpCast]); + } + else { gdk_gc_set_rgb_fg_color(drawGC, &gColors[Color_LinkInvalid]); } + } + + UPDATE_STENCIL_IDX(m_interfacedObjectId, stencilGC); + gdk_draw_line(GDK_DRAWABLE(m_stencilBuffer), stencilGC, proxy.getXSource() + m_viewOffsetX, proxy.getYSource() + m_viewOffsetY, + proxy.getXTarget() + m_viewOffsetX, proxy.getYTarget() + m_viewOffsetY); + gdk_draw_line(widget->window, drawGC, proxy.getXSource() + m_viewOffsetX, proxy.getYSource() + m_viewOffsetY, proxy.getXTarget() + m_viewOffsetX, + proxy.getYTarget() + m_viewOffsetY); + m_interfacedObjects[m_interfacedObjectId] = CInterfacedObject(link.getIdentifier(), Box_Link, 0); + + g_object_unref(drawGC); + g_object_unref(stencilGC); +} + + +#undef UPDATE_STENCIL_IDX + +size_t CInterfacedScenario::pickInterfacedObject(const int x, const int y) const +{ + if (!GDK_DRAWABLE(m_stencilBuffer)) { return size_t(0xffffffff); } + + int maxX; + int maxY; + uint32_t res = 0xffffffff; + gdk_drawable_get_size(GDK_DRAWABLE(m_stencilBuffer), &maxX, &maxY); + if (x >= 0 && y >= 0 && x < maxX && y < maxY) + { + GdkPixbuf* pixbuf = gdk_pixbuf_get_from_drawable(nullptr, GDK_DRAWABLE(m_stencilBuffer), nullptr, x, y, 0, 0, 1, 1); + if (!pixbuf) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << + "Could not get pixbuf from stencil buffer - couldn't pick object... this should never happen !\n"; + return size_t(0xffffffff); + } + + guchar* pixels = gdk_pixbuf_get_pixels(pixbuf); + if (!pixels) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << + "Could not get pixels from pixbuf - couldn't pick object... this should never happen !\n"; + return 0xffffffff; + } + + res = 0; + res += (pixels[0] << 16); + res += (pixels[1] << 8); + res += (pixels[2]); + g_object_unref(pixbuf); + } + return size_t(res); +} + +bool CInterfacedScenario::pickInterfacedObject(const int x, const int y, int sizeX, int sizeY) +{ + if (!GDK_DRAWABLE(m_stencilBuffer)) + { + // m_kernelCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "No stencil buffer defined - couldn't pick object... this should never happen !\n"; + return false; + } + + int maxX; + int maxY; + gdk_drawable_get_size(GDK_DRAWABLE(m_stencilBuffer), &maxX, &maxY); + + int startX = x; + int startY = y; + int endX = x + sizeX; + int endY = y + sizeY; + + // crops according to drawing area boundings + if (startX < 0) { startX = 0; } + if (startY < 0) { startY = 0; } + if (endX < 0) { endX = 0; } + if (endY < 0) { endY = 0; } + if (startX >= maxX - 1) { startX = maxX - 1; } + if (startY >= maxY - 1) { startY = maxY - 1; } + if (endX >= maxX - 1) { endX = maxX - 1; } + if (endY >= maxY - 1) { endY = maxY - 1; } + + // recompute new size + sizeX = endX - startX + 1; + sizeY = endY - startY + 1; + + GdkPixbuf* pixbuf = gdk_pixbuf_get_from_drawable(nullptr, GDK_DRAWABLE(m_stencilBuffer), nullptr, startX, startY, 0, 0, sizeX, sizeY); + if (!pixbuf) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_ImportantWarning + << "Could not get pixbuf from stencil buffer - couldn't pick object... this should never happen !\n"; + return false; + } + + guchar* pixels = gdk_pixbuf_get_pixels(pixbuf); + if (!pixels) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_ImportantWarning + << "Could not get pixels from pixbuf - couldn't pick object... this should never happen !\n"; + return false; + } + + const int nRowBytes = gdk_pixbuf_get_rowstride(pixbuf); + const int nChannel = gdk_pixbuf_get_n_channels(pixbuf); + for (int j = 0; j < sizeY; ++j) + { + for (int i = 0; i < sizeX; ++i) + { + size_t idx = 0; + idx += (pixels[j * nRowBytes + i * nChannel + 0] << 16); + idx += (pixels[j * nRowBytes + i * nChannel + 1] << 8); + idx += (pixels[j * nRowBytes + i * nChannel + 2]); + if (m_interfacedObjects[idx].m_ID != CIdentifier::undefined()) { m_SelectedObjects.insert(m_interfacedObjects[idx].m_ID); } + } + } + + g_object_unref(pixbuf); + return true; +} + +#define OV_ClassId_Selected CIdentifier(0xC67A01DC, 0x28CE06C1) + +void CInterfacedScenario::undoCB(const bool manageModifiedStatusFlag) +{ + // When a box gets updated we generate a snapshot beforehand to enable undo in all cases + // This will result in two indentical undo states, in order to avoid weird Redo, we drop the + // reduntant state at this moment + bool shouldDropLastState = false; + if (m_Scenario.containsBoxWithDeprecatedInterfacors()) { shouldDropLastState = true; } + + if (m_StateStack->undo()) + { + CIdentifier id; + m_SelectedObjects.clear(); + while ((id = m_Scenario.getNextBoxIdentifier(id)) != CIdentifier::undefined()) + { + if (m_Scenario.getBoxDetails(id)->hasAttribute(OV_ClassId_Selected)) { m_SelectedObjects.insert(id); } + } + while ((id = m_Scenario.getNextLinkIdentifier(id)) != CIdentifier::undefined()) + { + if (m_Scenario.getLinkDetails(id)->hasAttribute(OV_ClassId_Selected)) { m_SelectedObjects.insert(id); } + } + + if (m_DesignerVisualization) { m_DesignerVisualization->load(); } + if (manageModifiedStatusFlag) { m_HasBeenModified = true; } + + this->redrawScenarioSettings(); + this->redrawScenarioInputSettings(); + this->redrawScenarioOutputSettings(); + + this->redraw(); + + if (shouldDropLastState) { m_StateStack->dropLastState(); } + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(this->m_Application.m_Builder, "openvibe-button_redo")), m_StateStack->isRedoPossible()); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(this->m_Application.m_Builder, "openvibe-button_undo")), m_StateStack->isUndoPossible()); + } + else + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Can not undo\n"; + GtkWidget* undoButton = GTK_WIDGET(gtk_builder_get_object(this->m_Application.m_Builder, "openvibe-button_undo")); + gtk_widget_set_sensitive(undoButton, false); + } +} + +void CInterfacedScenario::redoCB(const bool manageModifiedStatusFlag) +{ + if (m_StateStack->redo()) + { + CIdentifier id; + m_SelectedObjects.clear(); + while ((id = m_Scenario.getNextBoxIdentifier(id)) != CIdentifier::undefined()) + { + if (m_Scenario.getBoxDetails(id)->hasAttribute(OV_ClassId_Selected)) { m_SelectedObjects.insert(id); } + } + while ((id = m_Scenario.getNextLinkIdentifier(id)) != CIdentifier::undefined()) + { + if (m_Scenario.getLinkDetails(id)->hasAttribute(OV_ClassId_Selected)) { m_SelectedObjects.insert(id); } + } + + if (m_DesignerVisualization) { m_DesignerVisualization->load(); } + + if (manageModifiedStatusFlag) { m_HasBeenModified = true; } + this->redrawScenarioSettings(); + this->redrawScenarioInputSettings(); + this->redrawScenarioOutputSettings(); + + this->redraw(); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(this->m_Application.m_Builder, "openvibe-button_redo")), m_StateStack->isRedoPossible()); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(this->m_Application.m_Builder, "openvibe-button_undo")), m_StateStack->isUndoPossible()); + } + else + { + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(this->m_Application.m_Builder, "openvibe-button_redo")), false); + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Can not redo\n"; + } +} + +void CInterfacedScenario::snapshotCB(const bool manageModifiedStatusFlag) +{ + if (m_Scenario.containsBoxWithDeprecatedInterfacors()) + { + OV_WARNING("Scenario containing boxes with deprecated I/O or Settings does not support undo", m_kernelCtx.getLogManager()); + } + else + { + CIdentifier id; + + while ((id = m_Scenario.getNextBoxIdentifier(id)) != CIdentifier::undefined()) + { + if (m_SelectedObjects.count(id)) { m_Scenario.getBoxDetails(id)->addAttribute(OV_ClassId_Selected, ""); } + else { m_Scenario.getBoxDetails(id)->removeAttribute(OV_ClassId_Selected); } + } + while ((id = m_Scenario.getNextLinkIdentifier(id)) != CIdentifier::undefined()) + { + if (m_SelectedObjects.count(id)) { m_Scenario.getLinkDetails(id)->addAttribute(OV_ClassId_Selected, ""); } + else { m_Scenario.getLinkDetails(id)->removeAttribute(OV_ClassId_Selected); } + } + + if (manageModifiedStatusFlag) { m_HasBeenModified = true; } + this->updateScenarioLabel(); + m_StateStack->snapshot(); + } + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(this->m_Application.m_Builder, "openvibe-button_redo")), m_StateStack->isRedoPossible()); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(this->m_Application.m_Builder, "openvibe-button_undo")), m_StateStack->isUndoPossible()); +} + +void CInterfacedScenario::addCommentCB(int x, int y) +{ + CIdentifier id; + m_Scenario.addComment(id, CIdentifier::undefined()); + if (x == -1 || y == -1) + { + GtkWidget* scrolledWindow = gtk_widget_get_parent(gtk_widget_get_parent(GTK_WIDGET(m_scenarioDrawingArea))); + GtkAdjustment* adjustmentH = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(scrolledWindow)); + GtkAdjustment* adjustmentV = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrolledWindow)); + +#if defined TARGET_OS_Linux && !defined TARGET_OS_MacOS + x = int(gtk_adjustment_get_value(adjustmentH) + gtk_adjustment_get_page_size(adjustmentH) / 2); + y = int(gtk_adjustment_get_value(adjustmentV) + gtk_adjustment_get_page_size(adjustmentV) / 2); +#elif defined TARGET_OS_Windows + gint wx, wy; + ::gdk_window_get_size(gtk_widget_get_parent(GTK_WIDGET(m_scenarioDrawingArea))->window, &wx, &wy); + x = int(gtk_adjustment_get_value(adjustmentH) + int(wx / 2)); + y = int(gtk_adjustment_get_value(adjustmentV) + int(wy / 2)); +#else + x = int(gtk_adjustment_get_value(adjustmentH) + 32); + y = int(gtk_adjustment_get_value(adjustmentV) + 32); +#endif + } + + CCommentProxy proxy(m_kernelCtx, m_Scenario, id); + proxy.setCenter(x - m_viewOffsetX, y - m_viewOffsetY); + + // Aligns comemnts on grid + proxy.setCenter(int((proxy.getXCenter() + 8) & 0xfffffff0L), int((proxy.getYCenter() + 8) & 0xfffffff0L)); + + // Applies modifications before snapshot + proxy.apply(); + + CCommentEditorDialog dialog(m_kernelCtx, *m_Scenario.getCommentDetails(id), m_guiFilename.c_str()); + if (!dialog.run()) { m_Scenario.removeComment(id); } + else + { + m_SelectedObjects.clear(); + m_SelectedObjects.insert(id); + + this->snapshotCB(); + } + + this->redraw(); +} + +void CInterfacedScenario::configureScenarioSettingsCB() +{ + this->snapshotCB(); + + // construct the dialog + this->redrawConfigureScenarioSettingsDialog(); + + gtk_widget_show_all(m_settingsVBox); + + const gint response = gtk_dialog_run(GTK_DIALOG(m_configureSettingsDialog)); + + if (response == GTK_RESPONSE_CANCEL) { this->undoCB(false); } + else { this->snapshotCB(); } + + gtk_widget_hide(m_configureSettingsDialog); + this->redrawScenarioSettings(); +} + +void CInterfacedScenario::addScenarioSettingCB() +{ + const std::string name = "Setting " + std::to_string(m_Scenario.getSettingCount() + 1); + m_Scenario.addSetting(name.c_str(), OVTK_TypeId_Integer, "0", size_t(-1), false, m_Scenario.getUnusedSettingIdentifier(CIdentifier::undefined())); + + this->redrawConfigureScenarioSettingsDialog(); +} + +void CInterfacedScenario::addScenarioInputCB() +{ + const std::string name = "Input " + std::to_string(m_Scenario.getInputCount() + 1); + // scenario I/O are identified by name/type combination value, at worst uniq in the scope of the inputs of the box. + m_Scenario.addInput(name.c_str(), OVTK_TypeId_StreamedMatrix, m_Scenario.getUnusedInputIdentifier(CIdentifier::undefined())); + + CConnectorEditor editor(m_kernelCtx, m_Scenario, Box_Input, m_Scenario.getInputCount() - 1, "Add Input", m_guiFilename.c_str()); + if (editor.run()) { this->snapshotCB(); } + else { m_Scenario.removeInput(m_Scenario.getInputCount() - 1); } + + this->redrawScenarioInputSettings(); +} + +void CInterfacedScenario::editScenarioInputCB(const size_t index) +{ + CConnectorEditor editor(m_kernelCtx, m_Scenario, Box_Input, index, "Edit Input", m_guiFilename.c_str()); + if (editor.run()) { this->snapshotCB(); } + + this->redrawScenarioInputSettings(); +} + +void CInterfacedScenario::addScenarioOutputCB() +{ + const std::string name = "Output " + std::to_string(m_Scenario.getOutputCount() + 1); + // scenario I/O are identified by name/type combination value, at worst uniq in the scope of the outputs of the box. + m_Scenario.addOutput(name.c_str(), OVTK_TypeId_StreamedMatrix, m_Scenario.getUnusedOutputIdentifier(CIdentifier::undefined())); + + CConnectorEditor editor(m_kernelCtx, m_Scenario, Box_Output, m_Scenario.getOutputCount() - 1, "Add Output", m_guiFilename.c_str()); + if (editor.run()) { this->snapshotCB(); } + else { m_Scenario.removeOutput(m_Scenario.getOutputCount() - 1); } + + this->redrawScenarioOutputSettings(); +} + +void CInterfacedScenario::editScenarioOutputCB(const size_t index) +{ + CConnectorEditor editor(m_kernelCtx, m_Scenario, Box_Output, index, "Edit Output", m_guiFilename.c_str()); + if (editor.run()) { this->snapshotCB(); } + + this->redrawScenarioOutputSettings(); +} + +void CInterfacedScenario::swapScenarioSettings(const size_t indexA, const size_t indexB) +{ + m_Scenario.swapSettings(indexA, indexB); + this->redrawConfigureScenarioSettingsDialog(); +} + +void CInterfacedScenario::swapScenarioInputs(const size_t indexA, const size_t indexB) +{ + CIdentifier idA, idB; + size_t idxA, idxB; + + m_Scenario.getScenarioInputLink(indexA, idA, idxA); + m_Scenario.getScenarioInputLink(indexB, idB, idxB); + + m_Scenario.swapInputs(indexA, indexB); + + m_Scenario.setScenarioInputLink(indexB, idA, idxA); + m_Scenario.setScenarioInputLink(indexA, idB, idxB); + + this->redrawScenarioInputSettings(); + this->redraw(); +} + +void CInterfacedScenario::swapScenarioOutputs(const size_t indexA, const size_t indexB) +{ + CIdentifier idA, idB; + size_t idxA, idxB; + + m_Scenario.getScenarioOutputLink(indexA, idA, idxA); + m_Scenario.getScenarioOutputLink(indexB, idB, idxB); + + m_Scenario.swapOutputs(indexA, indexB); + + m_Scenario.setScenarioOutputLink(indexB, idA, idxA); + m_Scenario.setScenarioOutputLink(indexA, idB, idxB); + + this->redrawScenarioOutputSettings(); + this->redraw(); +} + +void CInterfacedScenario::scenarioDrawingAreaExposeCB(GdkEventExpose* /*event*/) +{ + if (m_currentMode == Mode_None) + { + gint viewportX = -1, viewportY = -1; + + gint minX = 0x7fff, maxX = -0x7fff; + gint minY = 0x7fff, maxY = -0x7fff; + + const gint marginX = gint(round(32.0 * m_currentScale)); + const gint marginY = gint(round(32.0 * m_currentScale)); + + CIdentifier id; + while ((id = m_Scenario.getNextBoxIdentifier(id)) != CIdentifier::undefined()) + { + //CBoxProxy proxy(m_kernelCtx, *m_scenario.getBoxDetails(l_oBoxID)); + CBoxProxy proxy(m_kernelCtx, m_Scenario, id); + minX = std::min(minX, gint((proxy.getXCenter() - 1.0 * proxy.getWidth(GTK_WIDGET(m_scenarioDrawingArea)) / 2) * m_currentScale)); + maxX = std::max(maxX, gint((proxy.getXCenter() + 1.0 * proxy.getWidth(GTK_WIDGET(m_scenarioDrawingArea)) / 2) * m_currentScale)); + minY = std::min(minY, gint((proxy.getYCenter() - 1.0 * proxy.getHeight(GTK_WIDGET(m_scenarioDrawingArea)) / 2) * m_currentScale)); + maxY = std::max(maxY, gint((proxy.getYCenter() + 1.0 * proxy.getHeight(GTK_WIDGET(m_scenarioDrawingArea)) / 2) * m_currentScale)); + } + + while ((id = m_Scenario.getNextCommentIdentifier(id)) != CIdentifier::undefined()) + { + CCommentProxy proxy(m_kernelCtx, *m_Scenario.getCommentDetails(id)); + minX = std::min(minX, gint((proxy.getXCenter() - 1.0 * proxy.getWidth(GTK_WIDGET(m_scenarioDrawingArea)) / 2) * m_currentScale)); + maxX = std::max(maxX, gint((proxy.getXCenter() + 1.0 * proxy.getWidth(GTK_WIDGET(m_scenarioDrawingArea)) / 2) * m_currentScale)); + minY = std::min(minY, gint((proxy.getYCenter() - 1.0 * proxy.getHeight(GTK_WIDGET(m_scenarioDrawingArea)) / 2) * m_currentScale)); + maxY = std::max(maxY, gint((proxy.getYCenter() + 1.0 * proxy.getHeight(GTK_WIDGET(m_scenarioDrawingArea)) / 2) * m_currentScale)); + } + + const gint newSizeX = maxX - minX; + const gint newSizeY = maxY - minY; + gint oldSizeX = -1; + gint oldSizeY = -1; + + gdk_window_get_size(GTK_WIDGET(m_scenarioViewport)->window, &viewportX, &viewportY); + gtk_widget_get_size_request(GTK_WIDGET(m_scenarioDrawingArea), &oldSizeX, &oldSizeY); + + if (newSizeX >= 0 && newSizeY >= 0) + { + if (oldSizeX != newSizeX + 2 * marginX || oldSizeY != newSizeY + 2 * marginY) + { + gtk_widget_set_size_request(GTK_WIDGET(m_scenarioDrawingArea), newSizeX + 2 * marginX, newSizeY + 2 * marginY); + } + m_viewOffsetX = std::min(m_viewOffsetX, -maxX - marginX + std::max(viewportX, newSizeX + 2 * marginX)); + m_viewOffsetX = std::max(m_viewOffsetX, -minX + marginX); + m_viewOffsetY = std::min(m_viewOffsetY, -maxY - marginY + std::max(viewportY, newSizeY + 2 * marginY)); + m_viewOffsetY = std::max(m_viewOffsetY, -minY + marginY); + } + } + + gint x, y; + + gdk_window_get_size(GTK_WIDGET(m_scenarioDrawingArea)->window, &x, &y); + if (m_stencilBuffer) { g_object_unref(m_stencilBuffer); } + m_stencilBuffer = gdk_pixmap_new(GTK_WIDGET(m_scenarioDrawingArea)->window, x, y, -1); + + GdkGC* stencilGC = gdk_gc_new(m_stencilBuffer); + GdkColor color = { 0, 0, 0, 0 }; + gdk_gc_set_rgb_fg_color(stencilGC, &color); + gdk_draw_rectangle(GDK_DRAWABLE(m_stencilBuffer), stencilGC, TRUE, 0, 0, x, y); + g_object_unref(stencilGC); + + if (this->isLocked()) + { + color.pixel = 0; + color.red = 0x0f00; + color.green = 0x0f00; + color.blue = 0x0f00; + + GdkGC* drawGC = gdk_gc_new(GTK_WIDGET(m_scenarioDrawingArea)->window); + gdk_gc_set_rgb_fg_color(drawGC, &color); + gdk_gc_set_function(drawGC, GDK_XOR); + gdk_draw_rectangle(GTK_WIDGET(m_scenarioDrawingArea)->window, drawGC, TRUE, 0, 0, x, y); + g_object_unref(drawGC); + } + // TODO: optimize this as this will be called endlessly + /* + else if (false) //m_scenario.containsBoxWithDeprecatedInterfacors() + { + color.pixel = 0; + color.red = 0xffff; + color.green = 0xefff; + color.blue = 0xefff; + + GdkGC* drawGC = gdk_gc_new(GTK_WIDGET(m_scenarioDrawingArea)->window); + gdk_gc_set_rgb_fg_color(drawGC, &color); + gdk_gc_set_function(drawGC, GDK_AND); + gdk_draw_rectangle(GTK_WIDGET(m_pScenarioDrawingArea)->window, drawGC, TRUE, 0, 0, x, y); + g_object_unref(l_pDrawGC); + } + */ + m_interfacedObjectId = 0; + m_interfacedObjects.clear(); + + size_t count = 0; + CIdentifier id; + while ((id = m_Scenario.getNextCommentIdentifier(id)) != CIdentifier::undefined()) + { + redraw(*m_Scenario.getCommentDetails(id)); + count++; + } + m_nComment = count; + + count = 0; + while ((id = m_Scenario.getNextBoxIdentifier(id)) != CIdentifier::undefined()) + { + redraw(*m_Scenario.getBoxDetails(id)); + count++; + } + m_nBox = count; + + count = 0; + while ((id = m_Scenario.getNextLinkIdentifier(id)) != CIdentifier::undefined()) + { + redraw(*m_Scenario.getLinkDetails(id)); + count++; + } + m_nLink = count; + + if (m_currentMode == Mode_Selection || m_currentMode == Mode_SelectionAdd) + { + const int startX = int(std::min(m_pressMouseX, m_currentMouseX)); + const int startY = int(std::min(m_pressMouseY, m_currentMouseY)); + const int sizeX = int(std::max(m_pressMouseX - m_currentMouseX, m_currentMouseX - m_pressMouseX)); + const int sizeY = int(std::max(m_pressMouseY - m_currentMouseY, m_currentMouseY - m_pressMouseY)); + + GtkWidget* widget = GTK_WIDGET(m_scenarioDrawingArea); + GdkGC* drawGC = gdk_gc_new(widget->window); + gdk_gc_set_function(drawGC, GDK_OR); + gdk_gc_set_rgb_fg_color(drawGC, &gColors[Color_SelectionArea]); + gdk_draw_rectangle(widget->window, drawGC, TRUE, startX, startY, sizeX, sizeY); + gdk_gc_set_function(drawGC, GDK_COPY); + gdk_gc_set_rgb_fg_color(drawGC, &gColors[Color_SelectionAreaBorder]); + gdk_draw_rectangle(widget->window, drawGC, FALSE, startX, startY, sizeX, sizeY); + g_object_unref(drawGC); + } + + if (m_currentMode == Mode_Connect) + { + GtkWidget* widget = GTK_WIDGET(m_scenarioDrawingArea); + GdkGC* drawGC = gdk_gc_new(widget->window); + + gdk_gc_set_rgb_fg_color(drawGC, &gColors[Color_Link]); + gdk_draw_line(widget->window, drawGC, int(m_pressMouseX), int(m_pressMouseY), int(m_currentMouseX), int(m_currentMouseY)); + g_object_unref(drawGC); + } +} + +// This method inserts a box into the scenario upon receiving data +void CInterfacedScenario::scenarioDrawingAreaDragDataReceivedCB(GdkDragContext* dc, const gint x, const gint y, GtkSelectionData* selectionData, + guint /*info*/, guint /*t*/) +{ + if (this->isLocked()) { return; } + + // two cases: dragged from inside the program = a box ... + if (dc->protocol == GDK_DRAG_PROTO_LOCAL || dc->protocol == GDK_DRAG_PROTO_XDND) + { + CIdentifier boxID; + CIdentifier boxAlgorithmClassID; + + // The drag data only contains one string, for a normal box this string is its algorithmClassIdentifier + // However since all metaboxes have the same identifier, we have added the 'identifier' of a metabox after this string + // The identifier itself is the name of the scenario which created the metabox + std::string str(reinterpret_cast(gtk_selection_data_get_text(selectionData))); + + // check that there is an identifier inside the string, its form is (0xXXXXXXXX, 0xXXXXXXXX) + if (str.find(')') != std::string::npos) { boxAlgorithmClassID.fromString(str.substr(0, str.find(')')).c_str()); } + + Kernel::IBox* box = nullptr; + const Plugins::IPluginObjectDesc* pod = nullptr; + + if (boxAlgorithmClassID == CIdentifier::undefined()) + { + m_currentMouseX = x; + m_currentMouseY = y; + return; + } + if (boxAlgorithmClassID == OVP_ClassId_BoxAlgorithm_Metabox) + { + // extract the name of the metabox from the drag data string + CIdentifier id; + id.fromString(CString(str.substr(str.find(')') + 1).c_str())); + + //m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "This is a metabox with ID " << metaboxID << "\n"; + pod = m_kernelCtx.getMetaboxManager().getMetaboxObjectDesc(id); + + // insert a box into the scenario, initialize it from the proxy-descriptor from the metabox loader + m_Scenario.addBox(boxID, *static_cast(pod), CIdentifier::undefined()); + + box = m_Scenario.getBoxDetails(boxID); + box->addAttribute(OVP_AttributeId_Metabox_ID, id.toString()); + } + else + { + m_Scenario.addBox(boxID, boxAlgorithmClassID, CIdentifier::undefined()); + + box = m_Scenario.getBoxDetails(boxID); + const CIdentifier id = box->getAlgorithmClassIdentifier(); + pod = m_kernelCtx.getPluginManager().getPluginObjectDescCreating(id); + } + + m_SelectedObjects.clear(); + m_SelectedObjects.insert(boxID); + + // If a visualization box was dropped, add it in window manager + if (pod && pod->hasFunctionality(Plugins::EPluginFunctionality::Visualization)) + { + // Let window manager know about new box + if (m_DesignerVisualization) { m_DesignerVisualization->onVisualizationBoxAdded(box); } + } + + CBoxProxy proxy(m_kernelCtx, m_Scenario, boxID); + proxy.setCenter(x - m_viewOffsetX, y - m_viewOffsetY); + // Aligns boxes on grid + proxy.setCenter(int((proxy.getXCenter() + 8) & 0xfffffff0L), int((proxy.getYCenter() + 8) & 0xfffffff0L)); + + // Applies modifications before snapshot + proxy.apply(); + + this->snapshotCB(); + + m_currentMouseX = x; + m_currentMouseY = y; + } + + // ... or dragged from outside the application = a file + // ONLY AVAILABLE ON WINDOWS (known d'n'd protocol) +#if defined TARGET_OS_Windows + if (dc->protocol == GDK_DRAG_PROTO_WIN32_DROPFILES) + { + // we get the content of the buffer: the list of files URI: + // file:///path/to/file.ext\r\n + // file:///path/to/file.ext\r\n + // ... + const std::string draggedFilesPath(reinterpret_cast(gtk_selection_data_get_data(selectionData))); + std::stringstream ss(draggedFilesPath); + std::string line; + std::vector filesToOpen; + while (std::getline(ss, line)) + { + // the path starts with file:/// and ends with \r\n once parsed line after line, a \r remains on Windows + line = line.substr(8, line.length() - 9); + + // uri to path (to remove %xx escape characters): + line = g_uri_unescape_string(line.c_str(), nullptr); + + filesToOpen.push_back(line); + } + + for (auto& file : filesToOpen) { m_Application.openScenario(file.c_str()); } + } +#endif +} + +void CInterfacedScenario::scenarioDrawingAreaMotionNotifyCB(GtkWidget* /*widget*/, GdkEventMotion* event) +{ + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "scenarioDrawingAreaMotionNotifyCB\n"; + + if (this->isLocked()) { return; } + + GtkWidget* tooltip = GTK_WIDGET(gtk_builder_get_object(m_guiBuilder, "tooltip")); + gtk_widget_set_name(tooltip, "gtk-tooltips"); + const size_t objIdx = pickInterfacedObject(int(event->x), int(event->y)); + CInterfacedObject& obj = m_interfacedObjects[objIdx]; + if (obj.m_ID != CIdentifier::undefined() && obj.m_ConnectorType != Box_Link && obj.m_ConnectorType != Box_None) + { + Kernel::IBox* boxDetails = m_Scenario.getBoxDetails(obj.m_ID); + if (boxDetails) + { + CString name; + CString type; + if (obj.m_ConnectorType == Box_Input) + { + CIdentifier typeID; + boxDetails->getInputName(obj.m_ConnectorIdx, name); + boxDetails->getInputType(obj.m_ConnectorIdx, typeID); + type = m_kernelCtx.getTypeManager().getTypeName(typeID); + type = CString("[") + type + CString("]"); + } + else if (obj.m_ConnectorType == Box_Output) + { + CIdentifier typeID; + boxDetails->getOutputName(obj.m_ConnectorIdx, name); + boxDetails->getOutputType(obj.m_ConnectorIdx, typeID); + type = m_kernelCtx.getTypeManager().getTypeName(typeID); + type = CString("[") + type + CString("]"); + } + else if (obj.m_ConnectorType == Box_Update) + { + //m_scenario.updateBox(boxDetails->getIdentifier()); + name = CString("Right click for"); + type = "box update"; + } + else if (obj.m_ConnectorType == Box_ScenarioInput) + { + CIdentifier typeID; + boxDetails->getInputName(obj.m_ConnectorIdx, name); + boxDetails->getInputType(obj.m_ConnectorIdx, typeID); + + for (size_t i = 0; i < m_Scenario.getInputCount(); i++) + { + CIdentifier id; + size_t idx; + m_Scenario.getScenarioInputLink(i, id, idx); + if (id == boxDetails->getIdentifier() && idx == obj.m_ConnectorIdx) + { + m_Scenario.getInputName(i, name); + name = CString("Connected to \n") + name; + m_Scenario.getInputType(i, typeID); + } + } + type = m_kernelCtx.getTypeManager().getTypeName(typeID); + type = CString("[") + type + CString("]"); + } + else if (obj.m_ConnectorType == Box_ScenarioOutput) + { + CIdentifier typeID; + boxDetails->getOutputName(obj.m_ConnectorIdx, name); + boxDetails->getOutputType(obj.m_ConnectorIdx, typeID); + + for (size_t i = 0; i < m_Scenario.getOutputCount(); i++) + { + CIdentifier id; + size_t idx; + m_Scenario.getScenarioOutputLink(i, id, idx); + if (id == boxDetails->getIdentifier() && idx == obj.m_ConnectorIdx) + { + m_Scenario.getOutputName(i, name); + name = CString("Connected to \n") + name; + m_Scenario.getOutputType(i, typeID); + } + } + type = m_kernelCtx.getTypeManager().getTypeName(typeID); + type = CString("[") + type + CString("]"); + } + + gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(m_guiBuilder, "tooltip-label_name_content")), name); + gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(m_guiBuilder, "tooltip-label_type_content")), type); + gtk_window_move(GTK_WINDOW(tooltip), gint(event->x_root), gint(event->y_root) + 40); + gtk_widget_show(tooltip); + } + } + else { gtk_widget_hide(tooltip); } + + if (m_currentMode != Mode_None) + { + if (m_currentMode == Mode_MoveScenario) + { + m_viewOffsetX += int(event->x - m_currentMouseX); + m_viewOffsetY += int(event->y - m_currentMouseY); + } + else if (m_currentMode == Mode_MoveSelection) + { + if (m_controlPressed) { m_SelectedObjects.insert(m_currentObject.m_ID); } + else + { + if (!m_SelectedObjects.count(m_currentObject.m_ID)) + { + m_SelectedObjects.clear(); + m_SelectedObjects.insert(m_currentObject.m_ID); + } + } + for (auto& id : m_SelectedObjects) + { + if (m_Scenario.isBox(id)) + { + CBoxProxy proxy(m_kernelCtx, m_Scenario, id); + proxy.setCenter(proxy.getXCenter() + int(event->x - m_currentMouseX), proxy.getYCenter() + int(event->y - m_currentMouseY)); + } + if (m_Scenario.isComment(id)) + { + CCommentProxy proxy(m_kernelCtx, m_Scenario, id); + proxy.setCenter(proxy.getXCenter() + int(event->x - m_currentMouseX), proxy.getYCenter() + int(event->y - m_currentMouseY)); + } + } + } + + this->redraw(); + } + m_currentMouseX = event->x; + m_currentMouseY = event->y; +} + +namespace { +void gtk_menu_add_separator_menu_item(GtkMenu* menu) +{ + GtkSeparatorMenuItem* menuitem = GTK_SEPARATOR_MENU_ITEM(gtk_separator_menu_item_new()); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), GTK_WIDGET(menuitem)); +} + +GtkImageMenuItem* gtk_menu_add_new_image_menu_item(GtkMenu* menu, const char* icon, const char* label) +{ + GtkImageMenuItem* menuitem = GTK_IMAGE_MENU_ITEM(gtk_image_menu_item_new_with_label(label)); + gtk_image_menu_item_set_image(menuitem, gtk_image_new_from_stock(icon, GTK_ICON_SIZE_MENU)); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), GTK_WIDGET(menuitem)); + return menuitem; +} +} // namespace + +GtkImageMenuItem* CInterfacedScenario::addNewImageMenuItemWithCBGeneric(GtkMenu* menu, const char* icon, const char* label, const menu_cb_function_t cb, + Kernel::IBox* box, const EContextMenu command, const size_t index, const size_t index2) +{ + GtkImageMenuItem* menuItem = gtk_menu_add_new_image_menu_item(menu, icon, label); + box_ctx_menu_cb_t menuCB; + menuCB.command = command; + menuCB.index = index; + menuCB.secondaryIndex = index2; + menuCB.box = box; + menuCB.scenario = this; + const auto idx = m_boxCtxMenuCBs.size(); + m_boxCtxMenuCBs[idx] = menuCB; + g_signal_connect(G_OBJECT(menuItem), "activate", G_CALLBACK(cb), &m_boxCtxMenuCBs[idx]); + return menuItem; +} + +void CInterfacedScenario::scenarioDrawingAreaButtonPressedCB(GtkWidget* widget, GdkEventButton* event) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "scenarioDrawingAreaButtonPressedCB\n"; + + if (this->isLocked()) { return; } + + GtkWidget* tooltip = GTK_WIDGET(gtk_builder_get_object(m_guiBuilder, "tooltip")); + gtk_widget_hide(tooltip); + gtk_widget_grab_focus(widget); + + m_buttonPressed |= ((event->type == GDK_BUTTON_PRESS) && (event->button == 1)); + m_pressMouseX = event->x; + m_pressMouseY = event->y; + + size_t objIdx = pickInterfacedObject(int(m_pressMouseX), int(m_pressMouseY)); + m_currentObject = m_interfacedObjects[objIdx]; + + if (event->button == 1) + { + if (event->type == GDK_BUTTON_PRESS) // Simple click + { + if (m_currentObject.m_ID == CIdentifier::undefined()) + { + if (m_shiftPressed) { m_currentMode = Mode_MoveScenario; } + else + { + if (m_controlPressed) { m_currentMode = Mode_SelectionAdd; } + else { m_currentMode = Mode_Selection; } + } + } + else + { + if (m_currentObject.m_ConnectorType == Box_Input || m_currentObject.m_ConnectorType == Box_Output) { m_currentMode = Mode_Connect; } + else + { + m_currentMode = Mode_MoveSelection; + /* + if (m_controlPressed) { m_interfacedObjects[m_currentObject.m_id]=!m_interfacedObjects[m_currentObject.m_id]; } + else + { + m_currentObject.clear(); + m_currentObject[m_oCurrentObject.m_id]=true; + } + */ + } + } + } + else if (event->type == GDK_2BUTTON_PRESS) // Double click + { + if (m_currentObject.m_ID != CIdentifier::undefined()) + { + m_currentMode = Mode_EditSettings; + m_shiftPressed = false; + m_controlPressed = false; + m_altPressed = false; + m_aPressed = false; + m_wPressed = false; + + if (m_currentObject.m_ConnectorType == Box_Input || m_currentObject.m_ConnectorType == Box_Output) + { + Kernel::IBox* box = m_Scenario.getBoxDetails(m_currentObject.m_ID); + if (box) + { + if ((m_currentObject.m_ConnectorType == Box_Input && box->hasAttribute(OV_AttributeId_Box_FlagCanModifyInput)) + || (m_currentObject.m_ConnectorType == Box_Output && box->hasAttribute(OV_AttributeId_Box_FlagCanModifyOutput))) + { + CConnectorEditor editor(m_kernelCtx, *box, m_currentObject.m_ConnectorType, m_currentObject.m_ConnectorIdx, + m_currentObject.m_ConnectorType == Box_Input ? "Edit Input" : "Edit Output", m_guiFilename.c_str()); + if (editor.run()) { this->snapshotCB(); } + } + } + } + else + { + if (m_Scenario.isBox(m_currentObject.m_ID)) + { + Kernel::IBox* box = m_Scenario.getBoxDetails(m_currentObject.m_ID); + if (box) + { + CBoxConfigurationDialog dialog(m_kernelCtx, *box, m_guiFilename.c_str(), m_guiSettingsFilename.c_str(), false); + if (dialog.run()) { this->snapshotCB(); } + } + } + if (m_Scenario.isComment(m_currentObject.m_ID)) + { + Kernel::IComment* comment = m_Scenario.getCommentDetails(m_currentObject.m_ID); + if (comment) + { + CCommentEditorDialog dialog(m_kernelCtx, *comment, m_guiFilename.c_str()); + if (dialog.run()) { this->snapshotCB(); } + } + } + } + } + } + } + else if (event->button == 3) // right click + { + if (event->type == GDK_BUTTON_PRESS) + { + const auto unused = size_t(-1); + GtkMenu* menu = GTK_MENU(gtk_menu_new()); + m_boxCtxMenuCBs.clear(); + + // -------------- SELECTION ----------- + + if (this->hasSelection()) { addNewImageMenuItemWithCB(menu, GTK_STOCK_CUT, "cut", context_menu_cb, nullptr, EContextMenu::SelectionCut, unused); } + if (this->hasSelection()) + { + addNewImageMenuItemWithCB(menu, GTK_STOCK_COPY, "copy", context_menu_cb, nullptr, EContextMenu::SelectionCopy, unused); + } + if ((m_Application.m_ClipboardScenario->getNextBoxIdentifier(CIdentifier::undefined()) != CIdentifier::undefined()) + || (m_Application.m_ClipboardScenario->getNextCommentIdentifier(CIdentifier::undefined()) != CIdentifier::undefined())) + { + addNewImageMenuItemWithCB(menu, GTK_STOCK_PASTE, "paste", context_menu_cb, nullptr, EContextMenu::SelectionPaste, unused); + } + if (this->hasSelection()) + { + addNewImageMenuItemWithCB(menu, GTK_STOCK_DELETE, "delete", context_menu_cb, nullptr, EContextMenu::SelectionDelete, unused); + } + + if (m_currentObject.m_ID != CIdentifier::undefined() && m_Scenario.isBox(m_currentObject.m_ID)) + { + Kernel::IBox* box = m_Scenario.getBoxDetails(m_currentObject.m_ID); + if (box) + { + if (!m_boxCtxMenuCBs.empty()) { gtk_menu_add_separator_menu_item(menu); } + + bool toBeUpdated = box->hasAttribute(OV_AttributeId_Box_ToBeUpdated); + bool pendingDeprecatedInterfacors = box->hasAttribute(OV_AttributeId_Box_PendingDeprecatedInterfacors); + + // -------------- INPUTS -------------- + bool canAddInput = box->hasAttribute(OV_AttributeId_Box_FlagCanAddInput); + bool canModifyInput = box->hasAttribute(OV_AttributeId_Box_FlagCanModifyInput); + bool canConnectScenarioInput = (box->getInputCount() > 0 && m_Scenario.getInputCount() > 0); + if (!pendingDeprecatedInterfacors && !toBeUpdated && (canAddInput || canModifyInput || canConnectScenarioInput)) + { + size_t nFixedInput = 0; + sscanf(box->getAttributeValue(OV_AttributeId_Box_InitialInputCount).toASCIIString(), "%d", &nFixedInput); + GtkMenu* menuInput = GTK_MENU(gtk_menu_new()); + GtkImageMenuItem* input = gtk_menu_add_new_image_menu_item(menu, GTK_STOCK_PROPERTIES, "inputs"); + for (size_t i = 0; i < box->getInputCount(); ++i) + { + CString name; + CIdentifier typeID, id; + box->getInputName(i, name); + box->getInputType(i, typeID); + id = box->getIdentifier(); + const std::string str = std::to_string(i + 1) + " : " + name.toASCIIString(); + GtkImageMenuItem* menuItem = gtk_menu_add_new_image_menu_item(menuInput, GTK_STOCK_PROPERTIES, str.c_str()); + + GtkMenu* menuAction = GTK_MENU(gtk_menu_new()); + + if (canConnectScenarioInput) + { + for (size_t j = 0; j < m_Scenario.getInputCount(); ++j) + { + CString scenarioInputName; + CIdentifier boxID, inputTypeID; + auto idx = size_t(-1); + m_Scenario.getInputName(j, scenarioInputName); + m_Scenario.getInputType(j, inputTypeID); + m_Scenario.getScenarioInputLink(j, boxID, idx); + const std::string str2 = std::to_string(j + 1) + " : " + scenarioInputName.toASCIIString(); + if (boxID == id && idx == i) + { + addNewImageMenuItemWithCBGeneric(menuAction, GTK_STOCK_DISCONNECT, ("disconnect from " + str2).c_str(), context_menu_cb, + box, EContextMenu::BoxDisconnectScenarioInput, i, j); + } + else + { + if (m_kernelCtx.getTypeManager().isDerivedFromStream(inputTypeID, typeID)) + { + addNewImageMenuItemWithCBGeneric(menuAction, GTK_STOCK_CONNECT, ("connect to " + str2).c_str(), context_menu_cb, + box, EContextMenu::BoxConnectScenarioInput, i, j); + } + } + } + } + + if (canModifyInput) + { + addNewImageMenuItemWithCB(menuAction, GTK_STOCK_EDIT, "configure...", context_menu_cb, box, EContextMenu::BoxEditInput, i); + } + + if (canAddInput && nFixedInput <= i) + { + addNewImageMenuItemWithCB(menuAction, GTK_STOCK_REMOVE, "delete", context_menu_cb, box, EContextMenu::BoxRemoveInput, i); + } + + if (gtk_container_get_children_count(GTK_CONTAINER(menuAction)) > 0) + { + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuItem), GTK_WIDGET(menuAction)); + } + else { gtk_widget_set_sensitive(GTK_WIDGET(menuItem), false); } + } + gtk_menu_add_separator_menu_item(menuInput); + if (canAddInput) + { + addNewImageMenuItemWithCB(menuInput, GTK_STOCK_ADD, "new...", context_menu_cb, box, EContextMenu::BoxAddInput, unused); + } + gtk_menu_item_set_submenu(GTK_MENU_ITEM(input), GTK_WIDGET(menuInput)); + } + + // -------------- OUTPUTS -------------- + + bool canAddOutput = box->hasAttribute(OV_AttributeId_Box_FlagCanAddOutput); + bool canModifyOutput = box->hasAttribute(OV_AttributeId_Box_FlagCanModifyOutput); + bool canConnectScenarioOutput = (box->getOutputCount() > 0 && m_Scenario.getOutputCount() > 0); + if (!pendingDeprecatedInterfacors && !toBeUpdated && (canAddOutput || canModifyOutput || canConnectScenarioOutput)) + { + size_t nFixedOutput = 0; + sscanf(box->getAttributeValue(OV_AttributeId_Box_InitialOutputCount).toASCIIString(), "%d", &nFixedOutput); + GtkImageMenuItem* itemOutput = gtk_menu_add_new_image_menu_item(menu, GTK_STOCK_PROPERTIES, "outputs"); + GtkMenu* menuOutput = GTK_MENU(gtk_menu_new()); + for (size_t i = 0; i < box->getOutputCount(); ++i) + { + CString name; + CIdentifier typeID, id; + box->getOutputName(i, name); + box->getOutputType(i, typeID); + id = box->getIdentifier(); + const std::string str = std::to_string(i + 1) + " : " + name.toASCIIString(); + GtkImageMenuItem* menuItem = gtk_menu_add_new_image_menu_item(menuOutput, GTK_STOCK_PROPERTIES, str.c_str()); + + GtkMenu* menuAction = GTK_MENU(gtk_menu_new()); + + if (canConnectScenarioOutput) + { + for (size_t j = 0; j < m_Scenario.getOutputCount(); ++j) + { + CString scenarioOutputName; + CIdentifier boxID, outputTypeID; + auto idx = size_t(-1); + m_Scenario.getOutputName(j, scenarioOutputName); + m_Scenario.getOutputType(j, outputTypeID); + m_Scenario.getScenarioOutputLink(j, boxID, idx); + const std::string str2 = std::to_string(j + 1) + " : " + scenarioOutputName.toASCIIString(); + if (boxID == id && idx == i) + { + addNewImageMenuItemWithCBGeneric(menuAction, GTK_STOCK_DISCONNECT, ("disconnect from " + str2).c_str(), + context_menu_cb, box, EContextMenu::BoxDisconnectScenarioOutput, i, j); + } + else if (m_kernelCtx.getTypeManager().isDerivedFromStream(typeID, outputTypeID)) + { + addNewImageMenuItemWithCBGeneric(menuAction, GTK_STOCK_CONNECT, ("connect to " + str2).c_str(), + context_menu_cb, box, EContextMenu::BoxConnectScenarioOutput, i, j); + } + } + } + + if (canModifyOutput) + { + addNewImageMenuItemWithCB(menuAction, GTK_STOCK_EDIT, "configure...", context_menu_cb, box, EContextMenu::BoxEditOutput, i); + } + if (canAddOutput && nFixedOutput <= i) + { + addNewImageMenuItemWithCB(menuAction, GTK_STOCK_REMOVE, "delete", context_menu_cb, box, EContextMenu::BoxRemoveOutput, i); + } + + if (gtk_container_get_children_count(GTK_CONTAINER(menuAction)) > 0) + { + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuItem), GTK_WIDGET(menuAction)); + } + else { gtk_widget_set_sensitive(GTK_WIDGET(menuItem), false); } + } + gtk_menu_add_separator_menu_item(menuOutput); + if (canAddOutput) + { + addNewImageMenuItemWithCB(menuOutput, GTK_STOCK_ADD, "new...", context_menu_cb, box, EContextMenu::BoxAddOutput, unused); + } + gtk_menu_item_set_submenu(GTK_MENU_ITEM(itemOutput), GTK_WIDGET(menuOutput)); + } + + // -------------- SETTINGS -------------- + + bool canAddSetting = box->hasAttribute(OV_AttributeId_Box_FlagCanAddSetting); + bool canModifySetting = box->hasAttribute(OV_AttributeId_Box_FlagCanModifySetting); + if (!pendingDeprecatedInterfacors && !toBeUpdated && (canAddSetting || canModifySetting)) + { + size_t nFixedSetting = 0; + sscanf(box->getAttributeValue(OV_AttributeId_Box_InitialSettingCount).toASCIIString(), "%d", &nFixedSetting); + GtkImageMenuItem* itemSetting = gtk_menu_add_new_image_menu_item(menu, GTK_STOCK_PROPERTIES, "modify settings"); + GtkMenu* menuSetting = GTK_MENU(gtk_menu_new()); + for (size_t i = 0; i < box->getSettingCount(); ++i) + { + CString name; + CIdentifier typeID; + box->getSettingName(i, name); + box->getSettingType(i, typeID); + const std::string str = std::to_string(i + 1) + " : " + name.toASCIIString(); + GtkImageMenuItem* menuItem = gtk_menu_add_new_image_menu_item(menuSetting, GTK_STOCK_PROPERTIES, str.c_str()); + + if (canModifySetting || nFixedSetting <= i) + { + GtkMenu* menuAction = GTK_MENU(gtk_menu_new()); + if (canModifySetting) + { + addNewImageMenuItemWithCB(menuAction, GTK_STOCK_EDIT, "configure...", context_menu_cb, box, + EContextMenu::BoxEditSetting, i); + } + if (canAddSetting && nFixedSetting <= i) + { + addNewImageMenuItemWithCB(menuAction, GTK_STOCK_REMOVE, "delete", context_menu_cb, box, EContextMenu::BoxRemoveSetting, i); + } + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuItem), GTK_WIDGET(menuAction)); + } + else { gtk_widget_set_sensitive(GTK_WIDGET(menuItem), false); } + } + gtk_menu_add_separator_menu_item(menuSetting); + if (canAddSetting) + { + addNewImageMenuItemWithCB(menuSetting, GTK_STOCK_ADD, "new...", context_menu_cb, box, EContextMenu::BoxAddSetting, unused); + } + gtk_menu_item_set_submenu(GTK_MENU_ITEM(itemSetting), GTK_WIDGET(menuSetting)); + } + + // -------------- ABOUT / RENAME -------------- + + if (!m_boxCtxMenuCBs.empty()) { gtk_menu_add_separator_menu_item(menu); } + if (box->hasAttribute(OV_AttributeId_Box_ToBeUpdated)) + { + auto updateMenuItem = addNewImageMenuItemWithCB(menu, GTK_STOCK_REFRESH, "update box", context_menu_cb, box, + EContextMenu::BoxUpdate, unused); + if (box->hasAttribute(OV_AttributeId_Box_FlagNeedsManualUpdate) + || box->hasAttribute(OV_AttributeId_Box_FlagCanAddInput) + || box->hasAttribute(OV_AttributeId_Box_FlagCanAddOutput) + || box->hasAttribute(OV_AttributeId_Box_FlagCanAddSetting) + || box->hasAttribute(OV_AttributeId_Box_FlagCanModifyInput) + || box->hasAttribute(OV_AttributeId_Box_FlagCanModifyOutput) + || box->hasAttribute(OV_AttributeId_Box_FlagCanModifySetting)) + { + gtk_widget_set_sensitive(GTK_WIDGET(updateMenuItem), FALSE); + gtk_widget_set_tooltip_text(GTK_WIDGET(updateMenuItem), "Box must be manually updated due to its complexity."); + } + } + if (box->hasAttribute(OV_AttributeId_Box_PendingDeprecatedInterfacors)) + { + addNewImageMenuItemWithCB(menu, GTK_STOCK_REFRESH, "remove deprecated I/O/S", context_menu_cb, box, + EContextMenu::BoxRemoveDeprecatedInterfacors, unused); + } + addNewImageMenuItemWithCB(menu, GTK_STOCK_EDIT, "rename box...", context_menu_cb, box, EContextMenu::BoxRename, unused); + if (box->getSettingCount() != 0) + { + addNewImageMenuItemWithCB(menu, GTK_STOCK_PREFERENCES, "configure box...", context_menu_cb, box, EContextMenu::BoxConfigure, unused); + } + // Add this option only if the user has the authorization to open a metabox + if (box->getAlgorithmClassIdentifier() == OVP_ClassId_BoxAlgorithm_Metabox) + { + CIdentifier id; + id.fromString(box->getAttributeValue(OVP_AttributeId_Metabox_ID)); + + std::string path(m_kernelCtx.getMetaboxManager().getMetaboxFilePath(id).toASCIIString()); + std::string ext = boost::filesystem::extension(path); + bool canImportFile = false; + + CString fileExt; + while ((fileExt = m_kernelCtx.getScenarioManager().getNextScenarioImporter(OVD_ScenarioImportContext_OpenScenario, fileExt)) + != CString("")) + { + if (ext == fileExt.toASCIIString()) + { + canImportFile = true; + break; + } + } + + if (canImportFile) + { + addNewImageMenuItemWithCB(menu, GTK_STOCK_PREFERENCES, "open this meta box in editor", context_menu_cb, box, + EContextMenu::BoxEditMetabox, unused); + } + } + addNewImageMenuItemWithCB(menu, GTK_STOCK_CONNECT, "enable box", context_menu_cb, box, EContextMenu::BoxEnable, unused); + addNewImageMenuItemWithCB(menu, GTK_STOCK_DISCONNECT, "disable box", context_menu_cb, box, EContextMenu::BoxDisable, unused); + addNewImageMenuItemWithCB(menu, GTK_STOCK_CUT, "delete box", context_menu_cb, box, EContextMenu::BoxDelete, unused); + addNewImageMenuItemWithCB(menu, GTK_STOCK_HELP, "box documentation...", context_menu_cb, box, EContextMenu::BoxDocumentation, unused); + addNewImageMenuItemWithCB(menu, GTK_STOCK_ABOUT, "about box...", context_menu_cb, box, EContextMenu::BoxAbout, unused); + } + } + + gtk_menu_add_separator_menu_item(menu); + addNewImageMenuItemWithCB(menu, GTK_STOCK_EDIT, "add comment to scenario...", context_menu_cb, nullptr, EContextMenu::ScenarioAddComment, unused); + addNewImageMenuItemWithCB(menu, GTK_STOCK_ABOUT, "about scenario...", context_menu_cb, nullptr, EContextMenu::ScenarioAbout, unused); + + // -------------- RUN -------------- + + gtk_widget_show_all(GTK_WIDGET(menu)); + gtk_menu_popup(menu, nullptr, nullptr, nullptr, nullptr, 3, event->time); + if (m_boxCtxMenuCBs.empty()) { gtk_menu_popdown(menu); } + } + } + + this->redraw(); +} + +void CInterfacedScenario::scenarioDrawingAreaButtonReleasedCB(GtkWidget* /*widget*/, GdkEventButton* event) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "scenarioDrawingAreaButtonReleasedCB\n"; + + if (this->isLocked()) { return; } + + m_buttonPressed &= !((event->type == GDK_BUTTON_RELEASE) && (event->button == 1)); + m_releaseMouseX = event->x; + m_releaseMouseY = event->y; + + if (m_currentMode != Mode_None) + { + const int startX = int(std::min(m_pressMouseX, m_currentMouseX)); + const int startY = int(std::min(m_pressMouseY, m_currentMouseY)); + const int sizeX = int(std::max(m_pressMouseX - m_currentMouseX, m_currentMouseX - m_pressMouseX)); + const int sizeY = int(std::max(m_pressMouseY - m_currentMouseY, m_currentMouseY - m_pressMouseY)); + + if (m_currentMode == Mode_Selection || m_currentMode == Mode_SelectionAdd) + { + if (m_currentMode == Mode_Selection) { m_SelectedObjects.clear(); } + pickInterfacedObject(startX, startY, sizeX, sizeY); + } + if (m_currentMode == Mode_Connect) + { + bool isActuallyConnecting = false; + const bool connectionIsMessage = false; + const size_t interfacedObjectId = pickInterfacedObject(int(m_releaseMouseX), int(m_releaseMouseY)); + const CInterfacedObject currentObject = m_interfacedObjects[interfacedObjectId]; + CInterfacedObject srcObject; + CInterfacedObject dstObject; + if (currentObject.m_ConnectorType == Box_Output && m_currentObject.m_ConnectorType == Box_Input) + { + srcObject = currentObject; + dstObject = m_currentObject; + isActuallyConnecting = true; + } + if (currentObject.m_ConnectorType == Box_Input && m_currentObject.m_ConnectorType == Box_Output) + { + srcObject = m_currentObject; + dstObject = currentObject; + isActuallyConnecting = true; + } + // + if (isActuallyConnecting) + { + CIdentifier srcTypeID; + CIdentifier dstTypeID; + const Kernel::IBox* srcBox = m_Scenario.getBoxDetails(srcObject.m_ID); + const Kernel::IBox* dstBox = m_Scenario.getBoxDetails(dstObject.m_ID); + if (srcBox && dstBox) + { + srcBox->getOutputType(srcObject.m_ConnectorIdx, srcTypeID); + dstBox->getInputType(dstObject.m_ConnectorIdx, dstTypeID); + + bool hasDeprecatedInput = false; + srcBox->getInterfacorDeprecatedStatus(Kernel::Output, srcObject.m_ConnectorIdx, hasDeprecatedInput); + bool hasDeprecatedOutput = false; + dstBox->getInterfacorDeprecatedStatus(Kernel::Input, dstObject.m_ConnectorIdx, hasDeprecatedOutput); + + if ((m_kernelCtx.getTypeManager().isDerivedFromStream(srcTypeID, dstTypeID) + || m_kernelCtx.getConfigurationManager().expandAsBoolean("${Designer_AllowUpCastConnection}", false)) && (!connectionIsMessage)) + { + if (!hasDeprecatedInput && !hasDeprecatedOutput) + { + CIdentifier id; + m_Scenario.connect(id, srcObject.m_ID, srcObject.m_ConnectorIdx, dstObject.m_ID, dstObject.m_ConnectorIdx, + CIdentifier::undefined()); + this->snapshotCB(); + } + else { m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Cannot connect to/from deprecated I/O\n"; } + } + else { m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Invalid connection\n"; } + } + } + } + if (m_currentMode == Mode_MoveSelection) + { + if (sizeX == 0 && sizeY == 0) + { + if (m_controlPressed) + { + if (m_SelectedObjects.count(m_currentObject.m_ID)) { m_SelectedObjects.erase(m_currentObject.m_ID); } + else { m_SelectedObjects.insert(m_currentObject.m_ID); } + } + else + { + m_SelectedObjects.clear(); + m_SelectedObjects.insert(m_currentObject.m_ID); + } + } + else + { + for (const auto& id : m_SelectedObjects) + { + if (m_Scenario.isBox(id)) + { + CBoxProxy proxy(m_kernelCtx, m_Scenario, id); + proxy.setCenter(int((proxy.getXCenter() + 8) & 0xfffffff0), int((proxy.getYCenter() + 8) & 0xfffffff0)); + } + if (m_Scenario.isComment(id)) + { + CCommentProxy proxy(m_kernelCtx, m_Scenario, id); + proxy.setCenter(int((proxy.getXCenter() + 8) & 0xfffffff0), int((proxy.getYCenter() + 8) & 0xfffffff0)); + } + } + this->snapshotCB(); + } + } + this->redraw(); + } + + m_currentMode = Mode_None; +} + +void CInterfacedScenario::scenarioDrawingAreaKeyPressEventCB(GtkWidget* /*widget*/, GdkEventKey* event) +{ + m_shiftPressed |= (event->keyval == GDK_Shift_L || event->keyval == GDK_Shift_R); + m_controlPressed |= (event->keyval == GDK_Control_L || event->keyval == GDK_Control_R); + m_altPressed |= (event->keyval == GDK_Alt_L || event->keyval == GDK_Alt_R); + m_aPressed |= (event->keyval == GDK_a || event->keyval == GDK_A); + m_wPressed |= (event->keyval == GDK_w || event->keyval == GDK_W); + + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Key pressed " << (size_t) event->keyval << "\n"; + /* + if((event->keyval==GDK_Z || event->keyval==GDK_z) && m_controlPressed) { this->undoCB(); } + + if((event->keyval==GDK_Y || event->keyval==GDK_y) && m_controlPressed) { this->redoCB(); } + */ + // CTRL+A = select all + if (m_aPressed && m_controlPressed && !m_shiftPressed && !m_altPressed) + { + CIdentifier id; + while ((id = m_Scenario.getNextBoxIdentifier(id)) != CIdentifier::undefined()) { m_SelectedObjects.insert(id); } + while ((id = m_Scenario.getNextLinkIdentifier(id)) != CIdentifier::undefined()) { m_SelectedObjects.insert(id); } + while ((id = m_Scenario.getNextCommentIdentifier(id)) != CIdentifier::undefined()) { m_SelectedObjects.insert(id); } + this->redraw(); + } + + //CTRL+W : close current scenario + if (m_wPressed && m_controlPressed && !m_shiftPressed && !m_altPressed) + { + m_Application.closeScenarioCB(this); + return; + } + + if ((event->keyval == GDK_C || event->keyval == GDK_c) && m_currentMode == Mode_None) + { + gint x = 0; + gint y = 0; + gdk_window_get_pointer(GTK_WIDGET(m_scenarioDrawingArea)->window, &x, &y, nullptr); + + this->addCommentCB(x, y); + } + + if (event->keyval == GDK_F12 && m_shiftPressed) + { + CIdentifier id; + while ((id = m_Scenario.getNextBoxIdentifier(id)) != CIdentifier::undefined()) + { + Kernel::IBox* box = m_Scenario.getBoxDetails(id); + CIdentifier algorithmID = box->getAlgorithmClassIdentifier(); + CIdentifier hashValue = m_kernelCtx.getPluginManager().getPluginObjectHashValue(algorithmID); + if (box->hasAttribute(OV_AttributeId_Box_InitialPrototypeHashValue)) + { + box->setAttributeValue(OV_AttributeId_Box_InitialPrototypeHashValue, hashValue.toString()); + } + else { box->addAttribute(OV_AttributeId_Box_InitialPrototypeHashValue, hashValue.toString()); } + } + + this->redraw(); + this->snapshotCB(); + } + + // F1 : browse documentation + if (event->keyval == GDK_F1) + { + bool hasDoc = false; + for (const auto& objectId : m_SelectedObjects) + { + if (m_Scenario.isBox(objectId)) + { + browseBoxDocumentation(objectId); + hasDoc = true; + } + } + + if (!hasDoc) + { + const CString fullUrl = m_Scenario.getAttributeValue(OV_AttributeId_Scenario_DocumentationPage); + if (fullUrl != CString("")) + { + browseURL(fullUrl, m_kernelCtx.getConfigurationManager().expand("${Designer_WebBrowserCommand}"), + m_kernelCtx.getConfigurationManager().expand("${Designer_WebBrowserCommandPostfix}")); + } + else { m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "The scenario does not define a documentation page.\n"; } + } + } + + // F2 : rename all selected box(es) + if (event->keyval == GDK_F2) { contextMenuBoxRenameAllCB(); } + + // F8 : toggle enable/disable on all selected box(es) + if (event->keyval == GDK_F3) + { + contextMenuBoxToggleEnableAllCB(); + this->redraw(); + } + + //The shortcuts respect the order in the toolbar + + // F7 :play/pause + if (event->keyval == GDK_F7) + { + if (m_Application.getCurrentInterfacedScenario()->m_PlayerStatus == Kernel::EPlayerStatus::Play) { m_Application.pauseScenarioCB(); } + else { m_Application.playScenarioCB(); } + } + // F6 : step + if (event->keyval == GDK_F6) { m_Application.nextScenarioCB(); } + // F8 :fastforward + if (event->keyval == GDK_F8) { m_Application.forwardScenarioCB(); } + // F5 : stop + if (event->keyval == GDK_F5) { m_Application.stopScenarioCB(); } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "scenarioDrawingAreaKeyPressEventCB (" << (m_shiftPressed ? "true" : "false") << "|" + << (m_controlPressed ? "true" : "false") << "|" << (m_altPressed ? "true" : "false") << "|" << (m_aPressed ? "true" : "false") << "|" + << (m_wPressed ? "true" : "false") << "|" << ")\n"; + + if (this->isLocked()) { return; } + +#if defined TARGET_OS_Windows || defined TARGET_OS_Linux + if (event->keyval == GDK_Delete || event->keyval == GDK_KP_Delete) +#elif defined TARGET_OS_MacOS + if (event->keyval == GDK_BackSpace) +#endif + { + this->deleteSelection(); + } +} + +void CInterfacedScenario::scenarioDrawingAreaKeyReleaseEventCB(GtkWidget* /*widget*/, GdkEventKey* event) +{ + m_shiftPressed &= !(event->keyval == GDK_Shift_L || event->keyval == GDK_Shift_R); + m_controlPressed &= !(event->keyval == GDK_Control_L || event->keyval == GDK_Control_R); + m_altPressed &= !(event->keyval == GDK_Alt_L || event->keyval == GDK_Alt_R); + m_aPressed &= !(event->keyval == GDK_A || event->keyval == GDK_a); + m_wPressed &= !(event->keyval == GDK_W || event->keyval == GDK_w); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug + << "scenarioDrawingAreaKeyReleaseEventCB (" + << (m_shiftPressed ? "true" : "false") << "|" + << (m_controlPressed ? "true" : "false") << "|" + << (m_altPressed ? "true" : "false") << "|" + << (m_aPressed ? "true" : "false") << "|" + << (m_wPressed ? "true" : "false") << "|" + << ")\n"; + + //if (this->isLocked()) { return; } + // ... +} + +void CInterfacedScenario::copySelection() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "copySelection\n"; + + // Prepares copy + std::map mapping; + m_Application.m_ClipboardScenario->clear(); + + // Copies boxes to clipboard + for (auto& objectId : m_SelectedObjects) + { + if (m_Scenario.isBox(objectId)) + { + CIdentifier id; + const Kernel::IBox* box = m_Scenario.getBoxDetails(objectId); + m_Application.m_ClipboardScenario->addBox(id, *box, objectId); + mapping[objectId] = id; + } + } + + // Copies comments to clipboard + for (auto& objectId : m_SelectedObjects) + { + if (m_Scenario.isComment(objectId)) + { + CIdentifier id; + const Kernel::IComment* comment = m_Scenario.getCommentDetails(objectId); + m_Application.m_ClipboardScenario->addComment(id, *comment, objectId); + mapping[objectId] = id; + } + } + + // Copies links to clipboard + for (auto& objectId : m_SelectedObjects) + { + if (m_Scenario.isLink(objectId)) + { + CIdentifier id; + const Kernel::ILink* link = m_Scenario.getLinkDetails(objectId); + + // Connect link only if the source and target boxes are copied + if (mapping.find(link->getSourceBoxIdentifier()) != mapping.end() + && mapping.find(link->getTargetBoxIdentifier()) != mapping.end()) + { + m_Application.m_ClipboardScenario->connect(id, mapping[link->getSourceBoxIdentifier()], link->getSourceBoxOutputIndex(), + mapping[link->getTargetBoxIdentifier()], link->getTargetBoxInputIndex(), link->getIdentifier()); + } + } + } +} + +void CInterfacedScenario::cutSelection() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "cutSelection\n"; + + this->copySelection(); + this->deleteSelection(); +} + +void CInterfacedScenario::pasteSelection() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "pasteSelection\n"; + + // Prepares paste + CIdentifier id; + std::map mapping; + // int centerX = 0, centerY = 0; + int mostTLCopiedBoxCenterX = 1 << 15; // most top most left + int mostTLCopiedBoxCenterY = 1 << 15; // most top most left + // std::cout << "Mouse position : " << m_currentMouseX << "/" << m_currentMouseY << std::endl; + + // Pastes boxes from clipboard + while ((id = m_Application.m_ClipboardScenario->getNextBoxIdentifier(id)) != CIdentifier::undefined()) + { + CIdentifier newID; + Kernel::IBox* box = m_Application.m_ClipboardScenario->getBoxDetails(id); + m_Scenario.addBox(newID, *box, id); + mapping[id] = newID; + + // Updates visualization manager + CIdentifier boxAlgorithmID = box->getAlgorithmClassIdentifier(); + const Plugins::IPluginObjectDesc* pod = m_kernelCtx.getPluginManager().getPluginObjectDescCreating(boxAlgorithmID); + + // If a visualization box was dropped, add it in window manager + if (pod && pod->hasFunctionality(Plugins::EPluginFunctionality::Visualization)) + { + // Let window manager know about new box + if (m_DesignerVisualization) { m_DesignerVisualization->onVisualizationBoxAdded(m_Scenario.getBoxDetails(newID)); } + } + + CBoxProxy proxy(m_kernelCtx, m_Scenario, newID); + + // get the position of the topmost-leftmost box (always position on an actual box so when user pastes he sees something) + if (proxy.getXCenter() < mostTLCopiedBoxCenterX && proxy.getXCenter() < mostTLCopiedBoxCenterY) + { + mostTLCopiedBoxCenterX = proxy.getXCenter(); + mostTLCopiedBoxCenterY = proxy.getYCenter(); + } + } + + // Pastes comments from clipboard + while ((id = m_Application.m_ClipboardScenario->getNextCommentIdentifier(id)) != CIdentifier::undefined()) + { + CIdentifier newID; + Kernel::IComment* comment = m_Application.m_ClipboardScenario->getCommentDetails(id); + m_Scenario.addComment(newID, *comment, id); + mapping[id] = newID; + + CCommentProxy proxy(m_kernelCtx, m_Scenario, newID); + + if (proxy.getXCenter() < mostTLCopiedBoxCenterX && proxy.getYCenter() < mostTLCopiedBoxCenterY) + { + mostTLCopiedBoxCenterX = proxy.getXCenter(); + mostTLCopiedBoxCenterY = proxy.getYCenter(); + } + } + + // Pastes links from clipboard + while ((id = m_Application.m_ClipboardScenario->getNextLinkIdentifier(id)) != CIdentifier::undefined()) + { + CIdentifier newID; + Kernel::ILink* link = m_Application.m_ClipboardScenario->getLinkDetails(id); + m_Scenario.connect(newID, mapping[link->getSourceBoxIdentifier()], link->getSourceBoxOutputIndex(), mapping[link->getTargetBoxIdentifier()], + link->getTargetBoxInputIndex(), link->getIdentifier()); + } + + // Makes pasted stuff the default selection + // Moves boxes under cursor + // Moves comments under cursor + if (m_Application.m_ClipboardScenario->getNextBoxIdentifier(CIdentifier::undefined()) != CIdentifier::undefined() + || m_Application.m_ClipboardScenario->getNextCommentIdentifier(CIdentifier::undefined()) != CIdentifier::undefined()) + { + m_SelectedObjects.clear(); + for (auto& it : mapping) + { + m_SelectedObjects.insert(it.second); + + if (m_Scenario.isBox(it.second)) + { + // Moves boxes under cursor + CBoxProxy proxy(m_kernelCtx, m_Scenario, it.second); + proxy.setCenter(int(proxy.getXCenter() + m_currentMouseX) - mostTLCopiedBoxCenterX - m_viewOffsetX, + int(proxy.getYCenter() + m_currentMouseY) - mostTLCopiedBoxCenterY - m_viewOffsetY); + // Ok, why 32 would you ask, just because it is fine + + // Aligns boxes on grid + proxy.setCenter(int((proxy.getXCenter() + 8) & 0xfffffff0L), int((proxy.getYCenter() + 8) & 0xfffffff0L)); + } + + if (m_Scenario.isComment(it.second)) + { + // Moves commentes under cursor + CCommentProxy proxy(m_kernelCtx, m_Scenario, it.second); + proxy.setCenter(int(proxy.getXCenter() + m_currentMouseX) - mostTLCopiedBoxCenterX - m_viewOffsetX, + int(proxy.getYCenter() + m_currentMouseY) - mostTLCopiedBoxCenterY - m_viewOffsetY); + // Ok, why 32 would you ask, just because it is fine + + // Aligns commentes on grid + proxy.setCenter(int((proxy.getXCenter() + 8) & 0xfffffff0L), int((proxy.getYCenter() + 8) & 0xfffffff0L)); + } + } + } + + this->redraw(); + this->snapshotCB(); +} + +void CInterfacedScenario::deleteSelection() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "deleteSelection\n"; + for (auto& id : m_SelectedObjects) + { + if (m_Scenario.isBox(id)) { this->deleteBox(id); } + if (m_Scenario.isComment(id)) + { + // removes comment from scenario + m_Scenario.removeComment(id); + } + if (m_Scenario.isLink(id)) + { + // removes link from scenario + m_Scenario.disconnect(id); + } + } + m_SelectedObjects.clear(); + + this->redraw(); + this->snapshotCB(); +} + +void CInterfacedScenario::deleteBox(const CIdentifier& boxID) +{ + // removes visualization box from window manager + if (m_DesignerVisualization) { m_DesignerVisualization->onVisualizationBoxRemoved(boxID); } + + // removes box from scenario + m_Scenario.removeBox(boxID); +} + + +void CInterfacedScenario::contextMenuBoxUpdateCB(Kernel::IBox& box) +{ + m_Scenario.updateBox(box.getIdentifier()); + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxUpdateCB\n"; + this->snapshotCB(); +} + +void CInterfacedScenario::contextMenuBoxRemoveDeprecatedInterfacorsCB(Kernel::IBox& box) +{ + m_Scenario.removeDeprecatedInterfacorsFromBox(box.getIdentifier()); + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxRemoveDeprecatedInterfacorsCB\n"; + this->snapshotCB(); +} + +void CInterfacedScenario::contextMenuBoxRenameCB(Kernel::IBox& box) +{ + const Plugins::IPluginObjectDesc* pod = m_kernelCtx.getPluginManager().getPluginObjectDescCreating(box.getAlgorithmClassIdentifier()); + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxRenameCB\n"; + + if (box.getAlgorithmClassIdentifier() == OVP_ClassId_BoxAlgorithm_Metabox) + { + CIdentifier id; + id.fromString(box.getAttributeValue(OVP_AttributeId_Metabox_ID)); + pod = m_kernelCtx.getMetaboxManager().getMetaboxObjectDesc(id); + } + + CRenameDialog rename(m_kernelCtx, box.getName(), pod ? pod->getName() : box.getName(), m_guiFilename.c_str()); + if (rename.run()) + { + box.setName(rename.getResult()); + + //check whether it is a visualization box + const CIdentifier id = box.getAlgorithmClassIdentifier(); + const Plugins::IPluginObjectDesc* desc = m_kernelCtx.getPluginManager().getPluginObjectDescCreating(id); + + //if a visualization box was renamed, tell window manager about it + if (desc && desc->hasFunctionality(Plugins::EPluginFunctionality::Visualization)) + { + if (m_DesignerVisualization) { m_DesignerVisualization->onVisualizationBoxRenamed(box.getIdentifier()); } + } + this->snapshotCB(); + } +} + +void CInterfacedScenario::contextMenuBoxRenameAllCB() +{ + //we find all selected boxes + std::map selectedBoxes; // map(object,class) + for (auto& id : m_SelectedObjects) { if (m_Scenario.isBox(id)) { selectedBoxes[id] = m_Scenario.getBoxDetails(id)->getAlgorithmClassIdentifier(); } } + + if (!selectedBoxes.empty()) + { + bool dialogOk = true; + bool firstBox = true; + CString newName = ""; + for (auto it = selectedBoxes.begin(); it != selectedBoxes.end() && dialogOk; ++it) + { + if (it->second != CIdentifier::undefined()) + { + if (m_kernelCtx.getPluginManager().canCreatePluginObject(it->second) || it->second == OVP_ClassId_BoxAlgorithm_Metabox) + { + Kernel::IBox* box = m_Scenario.getBoxDetails(it->first); + if (firstBox) + { + firstBox = false; + const Plugins::IPluginObjectDesc* pod = m_kernelCtx.getPluginManager().getPluginObjectDescCreating(box->getAlgorithmClassIdentifier()); + if (box->getAlgorithmClassIdentifier() == OVP_ClassId_BoxAlgorithm_Metabox) + { + CIdentifier metaboxId; + metaboxId.fromString(box->getAttributeValue(OVP_AttributeId_Metabox_ID)); + pod = m_kernelCtx.getMetaboxManager().getMetaboxObjectDesc(metaboxId); + } + + CRenameDialog rename(m_kernelCtx, box->getName(), pod ? pod->getName() : box->getName(), m_guiFilename.c_str()); + if (rename.run()) { newName = rename.getResult(); } + else + { + // no rename at all. + dialogOk = false; + } + } + if (dialogOk) + { + box->setName(newName); + + //check whether it is a visualization box + CIdentifier id = box->getAlgorithmClassIdentifier(); + const Plugins::IPluginObjectDesc* pod = m_kernelCtx.getPluginManager().getPluginObjectDescCreating(id); + + //if a visualization box was renamed, tell window manager about it + if (pod && pod->hasFunctionality(Plugins::EPluginFunctionality::Visualization)) + { + if (m_DesignerVisualization) { m_DesignerVisualization->onVisualizationBoxRenamed(box->getIdentifier()); } + } + } + } + } + } + if (dialogOk) { this->snapshotCB(); } + } +} + +void CInterfacedScenario::contextMenuBoxToggleEnableAllCB() +{ + //we find all selected boxes + for (const auto& objectId : m_SelectedObjects) + { + if (m_Scenario.isBox(objectId)) + { + TAttributeHandler handler(*m_Scenario.getBoxDetails(objectId)); + if (handler.hasAttribute(OV_AttributeId_Box_Disabled)) { handler.removeAttribute(OV_AttributeId_Box_Disabled); } + else { handler.addAttribute(OV_AttributeId_Box_Disabled, 1); } + } + } + this->snapshotCB(); +} + +void CInterfacedScenario::contextMenuBoxEnableAllCB() +{ + //we find all selected boxes + for (const auto& objectId : m_SelectedObjects) + { + if (m_Scenario.isBox(objectId)) + { + TAttributeHandler handler(*m_Scenario.getBoxDetails(objectId)); + if (handler.hasAttribute(OV_AttributeId_Box_Disabled)) { handler.removeAttribute(OV_AttributeId_Box_Disabled); } + } + } + this->snapshotCB(); +} + +void CInterfacedScenario::contextMenuBoxDisableAllCB() +{ + //we find all selected boxes + for (const auto& objectId : m_SelectedObjects) + { + if (m_Scenario.isBox(objectId)) + { + TAttributeHandler handler(*m_Scenario.getBoxDetails(objectId)); + if (!handler.hasAttribute(OV_AttributeId_Box_Disabled)) { handler.addAttribute(OV_AttributeId_Box_Disabled, 1); } + } + } + this->snapshotCB(); +} + +void CInterfacedScenario::contextMenuBoxAddInputCB(Kernel::IBox& box) +{ + if (box.hasAttribute(OV_AttributeId_Box_PendingDeprecatedInterfacors)) + { + gtk_dialog_run(GTK_DIALOG(m_errorPendingDeprecatedInterfacorsDialog)); + return; + } + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxAddInputCB\n"; + box.addInput("New input", OV_TypeId_EBMLStream, m_Scenario.getUnusedInputIdentifier()); + if (box.hasAttribute(OV_AttributeId_Box_FlagCanModifyInput)) + { + CConnectorEditor editor(m_kernelCtx, box, Box_Input, box.getInputCount() - 1, "Add Input", m_guiFilename.c_str()); + if (editor.run()) { this->snapshotCB(); } + else { box.removeInput(box.getInputCount() - 1); } + } + else { this->snapshotCB(); } +} + +void CInterfacedScenario::contextMenuBoxEditInputCB(Kernel::IBox& box, const size_t index) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxEditInputCB\n"; + + CConnectorEditor editor(m_kernelCtx, box, Box_Input, index, "Edit Input", m_guiFilename.c_str()); + if (editor.run()) { this->snapshotCB(); } +} + +void CInterfacedScenario::contextMenuBoxRemoveInputCB(Kernel::IBox& box, const size_t index) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxRemoveInputCB\n"; + box.removeInput(index); + this->snapshotCB(); +} + +void CInterfacedScenario::contextMenuBoxAddOutputCB(Kernel::IBox& box) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxAddOutputCB\n"; + box.addOutput("New output", OV_TypeId_EBMLStream, m_Scenario.getUnusedOutputIdentifier()); + if (box.hasAttribute(OV_AttributeId_Box_FlagCanModifyOutput)) + { + CConnectorEditor editor(m_kernelCtx, box, Box_Output, box.getOutputCount() - 1, "Add Output", m_guiFilename.c_str()); + if (editor.run()) { this->snapshotCB(); } + else { box.removeOutput(box.getOutputCount() - 1); } + } + else { this->snapshotCB(); } +} + +void CInterfacedScenario::contextMenuBoxEditOutputCB(Kernel::IBox& box, const size_t index) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxEditOutputCB\n"; + + CConnectorEditor editor(m_kernelCtx, box, Box_Output, index, "Edit Output", m_guiFilename.c_str()); + if (editor.run()) { this->snapshotCB(); } +} + +void CInterfacedScenario::contextMenuBoxRemoveOutputCB(Kernel::IBox& box, const size_t index) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxRemoveOutputCB\n"; + box.removeOutput(index); + this->snapshotCB(); +} + +void CInterfacedScenario::contextMenuBoxConnectScenarioInputCB(Kernel::IBox& box, const size_t boxInputIdx, const size_t scenarioInputIdx) +{ + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "contextMenuBoxConnectScenarioInputCB : box = " << box.getIdentifier().str() << " box input = " << boxInputIdx << " , scenario input = " << scenarioInputIdx << "\n"; + m_Scenario.setScenarioInputLink(scenarioInputIdx, box.getIdentifier(), boxInputIdx); + this->snapshotCB(); +} + +void CInterfacedScenario::contextMenuBoxConnectScenarioOutputCB(Kernel::IBox& box, const size_t boxOutputIdx, const size_t scenarioOutputIdx) +{ + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "contextMenuBoxConnectScenarioOutputCB : box = " << box.getIdentifier().str() << " box Output = " << boxOutputIdx << " , scenario Output = " << scenarioOutputIdx << "\n"; + m_Scenario.setScenarioOutputLink(scenarioOutputIdx, box.getIdentifier(), boxOutputIdx); + this->snapshotCB(); +} + +// Note: In current implementation only the scenarioInputIdx is necessary as it can only be connected to one input +// but to keep things simpler we give it all the info +void CInterfacedScenario::contextMenuBoxDisconnectScenarioInputCB(Kernel::IBox& box, const size_t boxInputIdx, const size_t scenarioInputIdx) +{ + m_Scenario.removeScenarioInputLink(scenarioInputIdx, box.getIdentifier(), boxInputIdx); + this->snapshotCB(); +} + +// Note: In current implementation only the scenarioOutputIdx is necessary as it can only be connected to one output +// but to keep things simpler we give it all the info +void CInterfacedScenario::contextMenuBoxDisconnectScenarioOutputCB(Kernel::IBox& box, const size_t boxOutputIdx, const size_t scenarioOutputIdx) +{ + m_Scenario.removeScenarioOutputLink(scenarioOutputIdx, box.getIdentifier(), boxOutputIdx); + this->snapshotCB(); +} + +void CInterfacedScenario::contextMenuBoxAddSettingCB(Kernel::IBox& box) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxAddSettingCB\n"; + // Store setting count in case the custom "onSettingAdded" of the box adds more than one setting + const size_t nOldSettings = box.getSettingCount(); + box.addSetting("New setting", CIdentifier::undefined(), "", size_t(-1), false, m_Scenario.getUnusedSettingIdentifier(CIdentifier::undefined())); + const size_t nNewSettings = box.getSettingCount(); + // Check that at least one setting was added + if (nNewSettings > nOldSettings && box.hasAttribute(OV_AttributeId_Box_FlagCanModifySetting)) + { + CSettingEditorDialog dialog(m_kernelCtx, box, nOldSettings, "Add Setting", m_guiFilename.c_str(), m_guiSettingsFilename.c_str()); + if (dialog.run()) { this->snapshotCB(); } + else { for (size_t i = nOldSettings; i < nNewSettings; ++i) { box.removeSetting(i); } } + } + else + { + if (nNewSettings > nOldSettings) { this->snapshotCB(); } + else + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "No setting could be added to the box.\n"; + return; + } + } + // Add an information message to inform the user about the new settings + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "[" << nNewSettings - nOldSettings + << "] new setting(s) was(were) added to the box [" << box.getName().toASCIIString() << "]: "; + for (size_t i = nOldSettings; i < nNewSettings; ++i) + { + CString name; + box.getSettingName(i, name); + m_kernelCtx.getLogManager() << "[" << name << "] "; + } + m_kernelCtx.getLogManager() << "\n"; + // After adding setting, open configuration so that the user can see the effects. + CBoxConfigurationDialog dialog(m_kernelCtx, box, m_guiFilename.c_str(), m_guiSettingsFilename.c_str()); + dialog.run(); +} + +void CInterfacedScenario::contextMenuBoxEditSettingCB(Kernel::IBox& box, const size_t index) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxEditSettingCB\n"; + CSettingEditorDialog dialog(m_kernelCtx, box, index, "Edit Setting", m_guiFilename.c_str(), m_guiSettingsFilename.c_str()); + if (dialog.run()) { this->snapshotCB(); } +} + +void CInterfacedScenario::contextMenuBoxRemoveSettingCB(Kernel::IBox& box, const size_t index) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxRemoveSettingCB\n"; + const size_t nOldSettings = box.getSettingCount(); + if (box.removeSetting(index)) + { + const size_t nNewSettings = box.getSettingCount(); + this->snapshotCB(); + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "[" << nOldSettings - nNewSettings + << "] setting(s) was(were) removed from box [" << box.getName() << "] \n"; + } + else + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "The setting with index [" << index + << "] could not be removed from box [" << box.getName() << "] \n"; + } +} + +void CInterfacedScenario::contextMenuBoxConfigureCB(Kernel::IBox& box) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxConfigureCB\n"; + CBoxConfigurationDialog dialog(m_kernelCtx, box, m_guiFilename.c_str(), m_guiSettingsFilename.c_str()); + dialog.run(); + this->snapshotCB(); +} + +void CInterfacedScenario::contextMenuBoxAboutCB(Kernel::IBox& box) const +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxAboutCB\n"; + if (box.getAlgorithmClassIdentifier() != OVP_ClassId_BoxAlgorithm_Metabox) + { + CAboutPluginDialog dialog(m_kernelCtx, box.getAlgorithmClassIdentifier(), m_guiFilename.c_str()); + dialog.run(); + } + else + { + CIdentifier id; + id.fromString(box.getAttributeValue(OVP_AttributeId_Metabox_ID)); + CAboutPluginDialog dialog(m_kernelCtx, m_kernelCtx.getMetaboxManager().getMetaboxObjectDesc(id), m_guiFilename.c_str()); + dialog.run(); + } +} + +void CInterfacedScenario::contextMenuBoxEditMetaboxCB(Kernel::IBox& box) const +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxEditMetaboxCB\n"; + + CIdentifier id; + id.fromString(box.getAttributeValue(OVP_AttributeId_Metabox_ID)); + const CString path(m_kernelCtx.getMetaboxManager().getMetaboxFilePath(id)); + + m_Application.openScenario(path.toASCIIString()); +} + +bool CInterfacedScenario::browseURL(const CString& url, const CString& browserPrefix, const CString& browserPostfix) const +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Requesting web browser on URL " << url << "\n"; + + const CString cmd = browserPrefix + CString(" \"") + url + CString("\"") + browserPostfix; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "Launching [" << cmd << "]\n"; + const int result = system(cmd.toASCIIString()); + if (result < 0) + { + OV_WARNING("Could not launch command [" << cmd << "]\n", m_kernelCtx.getLogManager()); + return false; + } + return true; +} + +bool CInterfacedScenario::browseBoxDocumentation(const CIdentifier& boxID) const +{ + const CIdentifier algorithmClassID = m_Scenario.getBoxDetails(boxID)->getAlgorithmClassIdentifier(); + + // Do not show documentation for non-metaboxes or boxes that can not be created + if (!(boxID != CIdentifier::undefined() && (m_kernelCtx.getPluginManager().canCreatePluginObject(algorithmClassID) || + m_Scenario.getBoxDetails(boxID)->getAlgorithmClassIdentifier() == OVP_ClassId_BoxAlgorithm_Metabox))) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Box with id " << boxID << " can not create a pluging object\n"; + return false; + } + + const CString defaultURLBase = m_kernelCtx.getConfigurationManager().expand("${Designer_HelpBrowserURLBase}"); + CString urlBase = defaultURLBase; + CString browser = m_kernelCtx.getConfigurationManager().expand("${Designer_HelpBrowserCommand}"); + CString browserPostfix = m_kernelCtx.getConfigurationManager().expand("${Designer_HelpBrowserCommandPostfix}"); + CString boxName; + + CString html = "Doc_BoxAlgorithm_"; + if (m_Scenario.getBoxDetails(boxID)->getAlgorithmClassIdentifier() == OVP_ClassId_BoxAlgorithm_Metabox) + { + CIdentifier id; + id.fromString(m_Scenario.getBoxDetails(boxID)->getAttributeValue(OVP_AttributeId_Metabox_ID)); + boxName = m_kernelCtx.getMetaboxManager().getMetaboxObjectDesc(id)->getName(); + } + else + { + const Plugins::IPluginObjectDesc* pod = m_kernelCtx.getPluginManager().getPluginObjectDescCreating(algorithmClassID); + boxName = pod->getName(); + } + // The documentation files do not have spaces in their name, so we remove them + html = html + CString(getBoxAlgorithmURL(boxName.toASCIIString()).c_str()); + + + if (m_Scenario.getBoxDetails(boxID)->hasAttribute(OV_AttributeId_Box_DocumentationURLBase)) + { + urlBase = m_kernelCtx.getConfigurationManager().expand(m_Scenario.getBoxDetails(boxID)->getAttributeValue(OV_AttributeId_Box_DocumentationURLBase)); + } + html = html + ".html"; + + if (m_Scenario.getBoxDetails(boxID)->hasAttribute(OV_AttributeId_Box_DocumentationCommand)) + { + browser = m_kernelCtx.getConfigurationManager().expand(m_Scenario.getBoxDetails(boxID)->getAttributeValue(OV_AttributeId_Box_DocumentationCommand)); + browserPostfix = ""; + } + + CString fullUrl = urlBase + CString("/") + html; + if (m_Scenario.getBoxDetails(boxID)->hasAttribute(OV_AttributeId_Box_DocumentationURL)) + { + fullUrl = m_kernelCtx.getConfigurationManager().expand(m_Scenario.getBoxDetails(boxID)->getAttributeValue(OV_AttributeId_Box_DocumentationURL)); + } + + return browseURL(fullUrl, browser, browserPostfix); +} + +void CInterfacedScenario::contextMenuBoxDocumentationCB(Kernel::IBox& box) const +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxDocumentationCB\n"; + const CIdentifier id = box.getIdentifier(); + browseBoxDocumentation(id); +} + +void CInterfacedScenario::contextMenuBoxEnableCB(Kernel::IBox& box) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxEnableCB\n"; + TAttributeHandler handler(box); + handler.removeAttribute(OV_AttributeId_Box_Disabled); + this->snapshotCB(); +} + +void CInterfacedScenario::contextMenuBoxDisableCB(Kernel::IBox& box) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuBoxDisableCB\n"; + TAttributeHandler handler(box); + if (!handler.hasAttribute(OV_AttributeId_Box_Disabled)) { handler.addAttribute(OV_AttributeId_Box_Disabled, 1); } + else { handler.setAttributeValue(OV_AttributeId_Box_Disabled, 1); } + this->snapshotCB(); +} + +void CInterfacedScenario::contextMenuScenarioAddCommentCB() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuScenarioAddCommentCB\n"; + this->addCommentCB(); +} + +void CInterfacedScenario::contextMenuScenarioAboutCB() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "contextMenuScenarioAboutCB\n"; + CAboutScenarioDialog dialog(m_kernelCtx, m_Scenario, m_guiFilename.c_str()); + dialog.run(); + this->snapshotCB(); +} + +void CInterfacedScenario::toggleDesignerVisualization() +{ + m_designerVisualizationToggled = !m_designerVisualizationToggled; + + if (m_DesignerVisualization) + { + if (m_designerVisualizationToggled) { m_DesignerVisualization->show(); } + else { m_DesignerVisualization->hide(); } + } +} + +void CInterfacedScenario::showCurrentVisualization() const +{ + if (isLocked()) { if (m_playerVisualization != nullptr) { m_playerVisualization->showTopLevelWindows(); } } + else { if (m_DesignerVisualization != nullptr) { m_DesignerVisualization->show(); } } +} + +void CInterfacedScenario::hideCurrentVisualization() const +{ + if (isLocked()) { if (m_playerVisualization != nullptr) { m_playerVisualization->hideTopLevelWindows(); } } + else { if (m_DesignerVisualization != nullptr) { m_DesignerVisualization->hide(); } } +} + +void CInterfacedScenario::createPlayerVisualization(VisualizationToolkit::IVisualizationTree* tree) +{ + //hide window manager + if (m_DesignerVisualization) { m_DesignerVisualization->hide(); } + + if (m_playerVisualization == nullptr) + { + if (tree) { m_playerVisualization = new CPlayerVisualization(m_kernelCtx, *tree, *this); } + else { m_playerVisualization = new CPlayerVisualization(m_kernelCtx, *m_Tree, *this); } + + + //we go here when we press start + //we have to set the modUI here + //first, find the concerned boxes + Kernel::IScenario& runtimeScenario = m_Player->getRuntimeScenarioManager().getScenario(m_Player->getRuntimeScenarioIdentifier()); + CIdentifier id; + while ((id = runtimeScenario.getNextBoxIdentifier(id)) != CIdentifier::undefined()) + { + Kernel::IBox* box = runtimeScenario.getBoxDetails(id); + if (box->hasModifiableSettings())//if the box has modUI + { + //create a BoxConfigurationDialog in mode true + auto* dialog = new CBoxConfigurationDialog(m_kernelCtx, *box, m_guiFilename.c_str(), m_guiSettingsFilename.c_str(), true); + //store it + m_boxConfigDialogs.push_back(dialog); + } + } + } + + //initialize and show windows + m_playerVisualization->init(); +} + +void CInterfacedScenario::releasePlayerVisualization() +{ + if (m_playerVisualization != nullptr) + { + delete m_playerVisualization; + m_playerVisualization = nullptr; + } + + //reload designer visualization + if (m_DesignerVisualization) + { + m_DesignerVisualization->load(); + //show it if it was toggled on + if (m_designerVisualizationToggled) { m_DesignerVisualization->show(); } + } +} + +void CInterfacedScenario::stopAndReleasePlayer() +{ + m_kernelCtx.getErrorManager().releaseErrors(); + m_Player->stop(); + m_PlayerStatus = m_Player->getStatus(); + // removes idle function + g_idle_remove_by_data(this); + + if (!m_Player->uninitialize()) { m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to uninitialize the player" << "\n"; } + + for (auto elem : m_boxConfigDialogs) + { + elem->restoreState(); + delete elem; + } + m_boxConfigDialogs.clear(); + + + if (!m_kernelCtx.getPlayerManager().releasePlayer(m_PlayerID)) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to release the player" << "\n"; + } + + m_PlayerID = CIdentifier::undefined(); + m_Player = nullptr; + + // destroy player windows + releasePlayerVisualization(); + + // redraws scenario + redraw(); +} + +//give the PlayerVisualisation the matching between the GtkWidget created by the CBoxConfigurationDialog and the Box CIdentifier +bool CInterfacedScenario::setModifiableSettingsWidgets() +{ + for (auto& elem : m_boxConfigDialogs) { m_playerVisualization->setWidget(elem->getBoxID(), elem->getWidget()); } + return true; +} + +bool CInterfacedScenario::centerOnBox(const CIdentifier& identifier) +{ + //m_kernelCtx.getLogManager() << Kernel::LogLevel_Fatal << "CInterfacedScenario::centerOnBox" << "\n"; + bool res = false; + if (m_Scenario.isBox(identifier)) + { + //m_kernelCtx.getLogManager() << Kernel::LogLevel_Fatal << "CInterfacedScenario::centerOnBox is box" << "\n"; + Kernel::IBox* box = m_Scenario.getBoxDetails(identifier); + + //clear previous selection + m_SelectedObjects.clear(); + //to select the box + + m_SelectedObjects.insert(identifier); + // m_bScenarioModified=true; + redraw(); + + //CBoxProxy proxy(m_kernelCtx, *box); + const CBoxProxy proxy(m_kernelCtx, m_Scenario, box->getIdentifier()); + const double marginX = 5.0 * m_currentScale; + const double merginY = 5.0 * m_currentScale; + const int sizeX = int(round(proxy.getWidth(GTK_WIDGET(m_scenarioDrawingArea)) + marginX * 2.0)); + const int sizeY = int(round(proxy.getHeight(GTK_WIDGET(m_scenarioDrawingArea)) + merginY * 2.0)); + const double centerX = proxy.getXCenter() * m_currentScale; + const double centerY = proxy.getYCenter() * m_currentScale; + int x, y; + + //get the parameters of the current adjustement + GtkAdjustment* oldAdjustmentH = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(m_notebookPageContent)); + GtkAdjustment* oldAdjustmentV = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(m_notebookPageContent)); + gdouble upper, lower, step, page, pagesize, value; + + g_object_get(oldAdjustmentH, "upper", &upper, "lower", &lower, "step-increment", &step, "page-increment", &page, "page-size", &pagesize, "value", + &value, nullptr); + //create a new adjustement with the correct value since we can not change the upper bound of the old adjustement + auto* adjustment = reinterpret_cast(gtk_adjustment_new(value, lower, upper, step, page, pagesize)); + if (centerX + m_viewOffsetX < upper / 2) { x = int(round(centerX - 2 * sizeX)) + m_viewOffsetX; } + else { x = int(round(centerX + 2 * sizeX - pagesize)) + m_viewOffsetX; } + gtk_adjustment_set_value(adjustment, x); + gtk_scrolled_window_set_hadjustment(GTK_SCROLLED_WINDOW(m_notebookPageContent), adjustment); + + g_object_get(oldAdjustmentV, "upper", &upper, "lower", &lower, "step-increment", &step, "page-increment", &page, "page-size", &pagesize, "value", + &value, nullptr); + adjustment = reinterpret_cast(gtk_adjustment_new(value, lower, upper, step, page, pagesize)); + if (centerY - m_viewOffsetY < upper / 2) { y = int(round(centerY - 2 * sizeY) + m_viewOffsetY); } + else { y = int(round(centerY + 2 * sizeY - pagesize)) + m_viewOffsetY; } + gtk_adjustment_set_value(adjustment, y); + gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(m_notebookPageContent), adjustment); + res = true; + } + return res; +} + +void CInterfacedScenario::setScale(const double scale) +{ + m_currentScale = std::max(scale, 0.1); + + PangoContext* ctx = gtk_widget_get_pango_context(GTK_WIDGET(m_scenarioDrawingArea)); + PangoFontDescription* desc = pango_context_get_font_description(ctx); + // not done in constructor because the font size is changed elsewhere after that withour our knowledge + if (m_normalFontSize == 0) { m_normalFontSize = pango_font_description_get_size(desc); } + pango_font_description_set_size(desc, gint(round(m_normalFontSize * m_currentScale))); + + //m_scenarioModified = true; + redraw(); +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCInterfacedScenario.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCInterfacedScenario.h new file mode 100755 index 0000000..2341f15 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCInterfacedScenario.h @@ -0,0 +1,272 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include "ovd_base.h" + +#include "ovdCInterfacedObject.h" +#include "ovdCScenarioStateStack.h" +#include "ovdCSettingCollectionHelper.h" +#include "ovdCBoxConfigurationDialog.h" +#include + +namespace OpenViBE { +namespace Designer { +class CApplication; +class CDesignerVisualization; +class CPlayerVisualization; + +class CInterfacedScenario +{ +public: + + CInterfacedScenario(const Kernel::IKernelContext& ctx, CApplication& application, Kernel::IScenario& scenario, + CIdentifier& scenarioID, GtkNotebook& notebook, const char* guiFilename, const char* guiSettingsFilename); + virtual ~CInterfacedScenario(); + + virtual bool isLocked() const { return m_Player != nullptr; } + virtual void redraw(); + virtual void redraw(Kernel::IBox& box); + virtual void redraw(Kernel::IComment& comment); + virtual void redraw(Kernel::ILink& link); + virtual void updateScenarioLabel(); + size_t pickInterfacedObject(int x, int y) const; + bool pickInterfacedObject(int x, int y, int sizeX, int sizeY); + + void undoCB(bool manageModifiedStatusFlag = true); + void redoCB(bool manageModifiedStatusFlag = true); + void snapshotCB(bool manageModifiedStatusFlag = true); + void addCommentCB(int x = -1, int y = -1); + + // Utility functions for scenario settings, inputs and outputs + + void addScenarioSettingCB(); + //void editScenarioSettingCB(size_t index); + void swapScenarioSettings(size_t indexA, size_t indexB); + + void addScenarioInputCB(); + void editScenarioInputCB(size_t index); + void swapScenarioInputs(size_t indexA, size_t indexB); + + void addScenarioOutputCB(); + void editScenarioOutputCB(size_t index); + void swapScenarioOutputs(size_t indexA, size_t indexB); + + + // Utility functions for scenario settings, inputs and outputs + void configureScenarioSettingsCB(); + + // Drawing functions for scenario settings, inputs and outputs + void redrawConfigureScenarioSettingsDialog(); + void redrawScenarioSettings(); + void redrawScenarioInputSettings(); + void redrawScenarioOutputSettings(); + + void scenarioDrawingAreaExposeCB(GdkEventExpose* event); + void scenarioDrawingAreaDragDataReceivedCB(GdkDragContext* dc, gint x, gint y, GtkSelectionData* selectionData, guint info, guint t); + void scenarioDrawingAreaMotionNotifyCB(GtkWidget* widget, GdkEventMotion* event); + void scenarioDrawingAreaButtonPressedCB(GtkWidget* widget, GdkEventButton* event); + void scenarioDrawingAreaButtonReleasedCB(GtkWidget* widget, GdkEventButton* event); + void scenarioDrawingAreaKeyPressEventCB(GtkWidget* widget, GdkEventKey* event); + void scenarioDrawingAreaKeyReleaseEventCB(GtkWidget* widget, GdkEventKey* event); + + void copySelection(); + void cutSelection(); + void pasteSelection(); + void deleteSelection(); + + void deleteBox(const CIdentifier& boxID); // Utility method to remove box from scenario and visualization + void contextMenuBoxUpdateCB(Kernel::IBox& box); + void contextMenuBoxRemoveDeprecatedInterfacorsCB(Kernel::IBox& box); + void contextMenuBoxRenameCB(Kernel::IBox& box); + void contextMenuBoxRenameAllCB(); + void contextMenuBoxToggleEnableAllCB(); + void contextMenuBoxAddInputCB(Kernel::IBox& box); + void contextMenuBoxEditInputCB(Kernel::IBox& box, const size_t index); + void contextMenuBoxRemoveInputCB(Kernel::IBox& box, const size_t index); + void contextMenuBoxAddOutputCB(Kernel::IBox& box); + void contextMenuBoxEditOutputCB(Kernel::IBox& box, const size_t index); + void contextMenuBoxRemoveOutputCB(Kernel::IBox& box, const size_t index); + + void contextMenuBoxConnectScenarioInputCB(Kernel::IBox& box, size_t boxInputIdx, size_t scenarioInputIdx); + void contextMenuBoxConnectScenarioOutputCB(Kernel::IBox& box, size_t boxOutputIdx, size_t scenarioOutputIdx); + void contextMenuBoxDisconnectScenarioInputCB(Kernel::IBox& box, size_t boxInputIdx, size_t scenarioInputIdx); + void contextMenuBoxDisconnectScenarioOutputCB(Kernel::IBox& box, size_t boxOutputIdx, size_t scenarioOutputIdx); + + void contextMenuBoxAddSettingCB(Kernel::IBox& box); + void contextMenuBoxEditSettingCB(Kernel::IBox& box, const size_t index); + void contextMenuBoxRemoveSettingCB(Kernel::IBox& box, const size_t index); + void contextMenuBoxConfigureCB(Kernel::IBox& box); + void contextMenuBoxAboutCB(Kernel::IBox& box) const; + void contextMenuBoxEditMetaboxCB(Kernel::IBox& box) const; + + void contextMenuBoxEnableCB(Kernel::IBox& box); + void contextMenuBoxDisableCB(Kernel::IBox& box); + void contextMenuBoxEnableAllCB(); + void contextMenuBoxDisableAllCB(); + + void contextMenuBoxDocumentationCB(Kernel::IBox& box) const; + + void contextMenuScenarioAddCommentCB(); + void contextMenuScenarioAboutCB(); + + bool browseURL(const CString& url, const CString& browserPrefix, const CString& browserPostfix) const; + bool browseBoxDocumentation(const CIdentifier& boxID) const; + + void toggleDesignerVisualization(); + bool isDesignerVisualizationToggled() const { return m_designerVisualizationToggled; } + + void showCurrentVisualization() const; + void hideCurrentVisualization() const; + + void createPlayerVisualization(VisualizationToolkit::IVisualizationTree* tree = nullptr); + void releasePlayerVisualization(); + + + void stopAndReleasePlayer(); + bool setModifiableSettingsWidgets(); + bool hasSelection() const { return !m_SelectedObjects.empty(); } + bool centerOnBox(const CIdentifier& identifier); + void setScale(double scale); + double getScale() const { return m_currentScale; } + + //----------------------------- + //---------- typedef ---------- + //----------------------------- + typedef struct SBoxContextMenuCB + { + EContextMenu command; + size_t index; + size_t secondaryIndex; // Used for connecting two streams + Kernel::IBox* box; + CInterfacedScenario* scenario; + } box_ctx_menu_cb_t; + + // This struct is used for both settings inside the scenario and inside + // the settings configurator + typedef struct SSettingCallbackData + { + CInterfacedScenario* scenario; + size_t index; + GtkWidget* widgetValue; + GtkWidget* widgetEntryValue; + GtkWidget* container; + } setting_cb_data_t; + + // This struct is used for both inputs and outputs of the scenario + typedef struct SLinkCallbackData + { + CInterfacedScenario* scenario; + size_t index; + bool input; + } link_cb_data_t; + + //------------------------------- + //---------- variables ---------- + //------------------------------- + Kernel::EPlayerStatus m_PlayerStatus; + CIdentifier m_ScenarioID = CIdentifier::undefined(); + CIdentifier m_PlayerID = CIdentifier::undefined(); + CIdentifier m_TreeID = CIdentifier::undefined(); + + CApplication& m_Application; + Kernel::IScenario& m_Scenario; + Kernel::IPlayer* m_Player = nullptr; + VisualizationToolkit::IVisualizationTree* m_Tree = nullptr; + CDesignerVisualization* m_DesignerVisualization = nullptr; + + uint64_t m_LastLoopTime = 0; + bool m_HasFileName = false; + bool m_HasBeenModified = false; + bool m_DebugCPUUsage = false; + + std::string m_Filename; + + std::set m_SelectedObjects; + + std::unique_ptr m_StateStack; + + // Objects necessary for holding settings GUI + std::map m_SettingTypes; + CSettingCollectionHelper* m_SettingHelper = nullptr; + std::string m_SerializedSettingGUIXML; + +private: + const Kernel::IKernelContext& m_kernelCtx; + GtkNotebook& m_notebook; + bool m_designerVisualizationToggled = false; + CPlayerVisualization* m_playerVisualization = nullptr; + GtkBuilder* m_guiBuilder = nullptr; + GtkWidget* m_notebookPageTitle = nullptr; + GtkWidget* m_notebookPageContent = nullptr; + GtkViewport* m_scenarioViewport = nullptr; + GtkDrawingArea* m_scenarioDrawingArea = nullptr; + GdkPixmap* m_stencilBuffer = nullptr; + GdkPixbuf* m_mensiaLogoPixbuf = nullptr; + + bool m_buttonPressed = false; + bool m_shiftPressed = false; + bool m_controlPressed = false; + bool m_altPressed = false; + bool m_aPressed = false; + bool m_wPressed = false; + std::string m_guiFilename; + std::string m_guiSettingsFilename; + + double m_pressMouseX = 0; + double m_pressMouseY = 0; + double m_releaseMouseX = 0; + double m_releaseMouseY = 0; + double m_currentMouseX = 0; + double m_currentMouseY = 0; + int m_viewOffsetX = 0; + int m_viewOffsetY = 0; + size_t m_currentMode = 0; + + size_t m_nBox = 0; + size_t m_nComment = 0; + size_t m_nLink = 0; + + size_t m_interfacedObjectId = 0; + std::map m_interfacedObjects; + CInterfacedObject m_currentObject; + + GtkWidget* m_configureSettingsDialog = nullptr; + GtkWidget* m_settingsVBox = nullptr; + GtkWidget* m_noHelpDialog = nullptr; + GtkWidget* m_errorPendingDeprecatedInterfacorsDialog = nullptr; + + std::map m_streamTypes; + + std::map m_boxCtxMenuCBs; + std::vector m_settingConfigCBDatas; + std::vector m_settingCBDatas; + std::vector m_scenarioInputCBDatas; + std::vector m_scenarioOutputCBDatas; + + double m_currentScale = 1; + gint m_normalFontSize = 0; + + std::vector m_boxConfigDialogs; + + typedef void (*menu_cb_function_t)(GtkMenuItem*, box_ctx_menu_cb_t*); + GtkImageMenuItem* addNewImageMenuItemWithCBGeneric(GtkMenu* menu, const char* icon, const char* label, menu_cb_function_t cb, + Kernel::IBox* box, EContextMenu command, const size_t index, const size_t index2); + + GtkImageMenuItem* addNewImageMenuItemWithCB(GtkMenu* menu, const char* icon, const char* label, const menu_cb_function_t cb, + Kernel::IBox* box, const EContextMenu command, const size_t index) + { + return addNewImageMenuItemWithCBGeneric(menu, icon, label, cb, box, command, index, 0); + } + + void redrawScenarioLinkSettings(GtkWidget* links, bool isInput, std::vector& linkCBDatas, + size_t (Kernel::IScenario::* getNLink)() const, + bool (Kernel::IScenario::* getLinkName)(size_t, CString&) const, + bool (Kernel::IScenario::* getLinkType)(size_t, CIdentifier&) const); +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCLinkProxy.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCLinkProxy.cpp new file mode 100644 index 0000000..a7d7405 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCLinkProxy.cpp @@ -0,0 +1,66 @@ +#include "ovdCLinkProxy.h" +#include "ovdTAttributeHandler.h" +#include "../../../../../sdk/openvibe/include/openvibe/ov_defines.h" + +namespace OpenViBE { +namespace Designer { + +CLinkProxy::CLinkProxy(const Kernel::ILink& link) : m_constLink(&link) +{ + if (m_constLink) + { + const TAttributeHandler handler(*m_constLink); + m_xSrc = handler.getAttributeValue(OV_AttributeId_Link_XSrc); + m_ySrc = handler.getAttributeValue(OV_AttributeId_Link_YSrc); + m_xDst = handler.getAttributeValue(OV_AttributeId_Link_XDst); + m_yDst = handler.getAttributeValue(OV_AttributeId_Link_YDst); + } +} + +CLinkProxy::CLinkProxy(Kernel::IScenario& scenario, const CIdentifier& linkID) + : m_constLink(scenario.getLinkDetails(linkID)), m_link(scenario.getLinkDetails(linkID)) +{ + if (m_constLink) + { + const TAttributeHandler handler(*m_constLink); + m_xSrc = handler.getAttributeValue(OV_AttributeId_Link_XSrc); + m_ySrc = handler.getAttributeValue(OV_AttributeId_Link_YSrc); + m_xDst = handler.getAttributeValue(OV_AttributeId_Link_XDst); + m_yDst = handler.getAttributeValue(OV_AttributeId_Link_YDst); + } +} + +CLinkProxy::~CLinkProxy() +{ + if (m_link) + { + TAttributeHandler handler(*m_link); + + if (handler.hasAttribute(OV_AttributeId_Link_XSrc)) { handler.setAttributeValue(OV_AttributeId_Link_XSrc, m_xSrc); } + else { handler.addAttribute(OV_AttributeId_Link_XSrc, m_xSrc); } + + if (handler.hasAttribute(OV_AttributeId_Link_YSrc)) { handler.setAttributeValue(OV_AttributeId_Link_YSrc, m_ySrc); } + else { handler.addAttribute(OV_AttributeId_Link_YSrc, m_ySrc); } + + if (handler.hasAttribute(OV_AttributeId_Link_XDst)) { handler.setAttributeValue(OV_AttributeId_Link_XDst, m_xDst); } + else { handler.addAttribute(OV_AttributeId_Link_XDst, m_xDst); } + + if (handler.hasAttribute(OV_AttributeId_Link_YDst)) { handler.setAttributeValue(OV_AttributeId_Link_YDst, m_yDst); } + else { handler.addAttribute(OV_AttributeId_Link_YDst, m_yDst); } + } +} + +void CLinkProxy::setSource(const int x, const int y) +{ + m_xSrc = x; + m_ySrc = y; +} + +void CLinkProxy::setTarget(const int x, const int y) +{ + m_xDst = x; + m_yDst = y; +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCLinkProxy.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCLinkProxy.h new file mode 100644 index 0000000..93c3291 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCLinkProxy.h @@ -0,0 +1,36 @@ +#pragma once + +#include "ovd_base.h" + +namespace OpenViBE { +namespace Designer { +class CLinkProxy final +{ +public: + + explicit CLinkProxy(const Kernel::ILink& link); + CLinkProxy(Kernel::IScenario& scenario, const CIdentifier& linkID); + ~CLinkProxy(); + + operator Kernel::ILink*() const { return m_link; } + operator const Kernel::ILink*() const { return m_constLink; } + + int getXSource() const { return m_xSrc; } + int getYSource() const { return m_ySrc; } + int getXTarget() const { return m_xDst; } + int getYTarget() const { return m_yDst; } + + void setSource(int x, int y); + void setTarget(int x, int y); + +protected: + + const Kernel::ILink* m_constLink; + Kernel::ILink* m_link = nullptr; + int m_xSrc = 0; + int m_ySrc = 0; + int m_xDst = 0; + int m_yDst = 0; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCLogListenerDesigner.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCLogListenerDesigner.cpp new file mode 100755 index 0000000..107ef20 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCLogListenerDesigner.cpp @@ -0,0 +1,433 @@ +#include "ovdCLogListenerDesigner.h" + +#include +#include + +#define OVD_GUI_File OpenViBE::Directories::getDataDir() + "/applications/designer/interface.ui" + +namespace { +void close_messages_alert_window_cb(GtkButton* /*button*/, gpointer data) { gtk_widget_hide(GTK_WIDGET(data)); } +void focus_message_window_cb(GtkButton* /*button*/, gpointer data) { static_cast(data)->focusMessageWindow(); } + +void refresh_search_log_entry(GtkEntry* text, gpointer data) +{ + auto* ptr = static_cast(data); + ptr->m_SearchTerm = gtk_entry_get_text(text); + ptr->searchMessages(ptr->m_SearchTerm); +} + +void focus_on_box_cidentifier_clicked(GtkWidget* widget, GdkEventButton* event, gpointer data) +{ + //log text view grab the focus so isLogAreaClicked() return true and CTRL+F will focus on the log searchEntry + gtk_widget_grab_focus(widget); + + auto* ptr = static_cast(data); + + //if left click + if (event->button == 1) + { + GtkTextView* textView = GTK_TEXT_VIEW(widget); + const GtkTextWindowType windowType = gtk_text_view_get_window_type(textView, event->window); + gint bufferX, bufferY; + //convert event coord (mouse position) in buffer coord (character in buffer) + gtk_text_view_window_to_buffer_coords(textView, windowType, gint(round(event->x)), gint(round(event->y)), &bufferX, &bufferY); + //get the text iter corresponding to that position + GtkTextIter iter; + gtk_text_view_get_iter_at_location(textView, &iter, bufferX, bufferY); + + //if this position is not tagged, exit + if (!gtk_text_iter_has_tag(&iter, ptr->m_IdTag)) { return; } + //the position is tagged, we are on a CIdentifier + GtkTextIter start = iter; + GtkTextIter end = iter; + + while (gtk_text_iter_has_tag(&end, ptr->m_IdTag)) { gtk_text_iter_forward_char(&end); } + while (gtk_text_iter_has_tag(&start, ptr->m_IdTag)) { gtk_text_iter_backward_char(&start); } + //we went one char to far for start + gtk_text_iter_forward_char(&start); + //this contains the CIdentifier + gchar* link = gtk_text_iter_get_text(&start, &end); + //std::cout << "cid is |" << link << "|" << std::endl; + OpenViBE::CIdentifier id; + id.fromString(OpenViBE::CString(link)); + ptr->m_CenterOnBoxFun(id); + } +} +} // namespace + +namespace OpenViBE { +namespace Designer { + +void CLogListenerDesigner::searchMessages(const CString& searchTerm) +{ + //clear displayed buffer + gtk_text_buffer_set_text(m_buffer, "", -1); + m_SearchTerm = searchTerm; + for (CLogObject* log : m_storedLogs) { if (log->filter(searchTerm)) { appendLog(log); } } //display the log +} + +void CLogListenerDesigner::appendLog(CLogObject* log) const +{ + GtkTextIter endIter, begin, end; + gtk_text_buffer_get_end_iter(m_buffer, &endIter); + //get log buffer bounds + gtk_text_buffer_get_start_iter(log->getTextBuffer(), &begin); + gtk_text_buffer_get_end_iter(log->getTextBuffer(), &end); + //copy at the end of the displayed buffer + gtk_text_buffer_insert_range(m_buffer, &endIter, &begin, &end); +} + +CLogListenerDesigner::CLogListenerDesigner(const Kernel::IKernelContext& ctx, GtkBuilder* builder) + : m_SearchTerm(""), m_CenterOnBoxFun([](CIdentifier& /*id*/) {}), m_builder(builder) +{ + m_textView = GTK_TEXT_VIEW(gtk_builder_get_object(m_builder, "openvibe-textview_messages")); + m_alertWindow = GTK_WINDOW(gtk_builder_get_object(m_builder, "dialog_error_popup")); + + m_buttonPopup = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "openvibe-messages_alert_on_error")); + + m_labelnMsg = GTK_LABEL(gtk_builder_get_object(m_builder, "openvibe-messages_count_message_label")); + m_labelnWarnings = GTK_LABEL(gtk_builder_get_object(m_builder, "openvibe-messages_count_warning_label")); + m_labelnErrors = GTK_LABEL(gtk_builder_get_object(m_builder, "openvibe-messages_count_error_label")); + m_labelDialognWarnings = GTK_LABEL(gtk_builder_get_object(m_builder, "dialog_error_popup-warning_count")); + m_labelDialognErrors = GTK_LABEL(gtk_builder_get_object(m_builder, "dialog_error_popup-error_count")); + + m_imageWarnings = GTK_WIDGET(gtk_builder_get_object(m_builder, "openvibe-messages_count_warning_image")); + m_imageErrors = GTK_WIDGET(gtk_builder_get_object(m_builder, "openvibe-messages_count_error_image")); + + m_buttonActiveDebug = GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_builder, "openvibe-messages_tb_debug")); + m_buttonActiveBenchmark = GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_builder, "openvibe-messages_tb_bench")); + m_buttonActiveTrace = GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_builder, "openvibe-messages_tb_trace")); + m_buttonActiveInfo = GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_builder, "openvibe-messages_tb_info")); + m_buttonActiveWarning = GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_builder, "openvibe-messages_tb_warning")); + m_buttonActiveImportantWarning = GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_builder, "openvibe-messages_tb_impwarning")); + m_buttonActiveError = GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_builder, "openvibe-messages_tb_error")); + m_buttonActiveFatal = GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_builder, "openvibe-messages_tb_fatal")); + + // set the popup-on-error checkbox according to the configuration token + gtk_toggle_button_set_active(m_buttonPopup, bool(ctx.getConfigurationManager().expandAsBoolean("${Designer_PopUpOnError}"))); + + g_signal_connect(G_OBJECT(m_alertWindow), "delete_event", G_CALLBACK(gtk_widget_hide), nullptr); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_builder, "dialog_error_popup-button_view")), "clicked", G_CALLBACK(focus_message_window_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_builder, "dialog_error_popup-button_ok")), "clicked", + G_CALLBACK(close_messages_alert_window_cb), m_alertWindow); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_builder, "searchEntry")), "changed", G_CALLBACK(refresh_search_log_entry), this); + g_signal_connect(G_OBJECT(m_textView), "button_press_event", G_CALLBACK(focus_on_box_cidentifier_clicked), this); + m_buffer = gtk_text_view_get_buffer(m_textView); + + gtk_text_buffer_create_tag(m_buffer, "f_mono", "family", "monospace", nullptr); + gtk_text_buffer_create_tag(m_buffer, "w_bold", "weight", PANGO_WEIGHT_BOLD, nullptr); + gtk_text_buffer_create_tag(m_buffer, "c_blue", "foreground", "#0000FF", nullptr); // debug + gtk_text_buffer_create_tag(m_buffer, "c_magenta", "foreground", "#FF00FF", nullptr); // benchmark + gtk_text_buffer_create_tag(m_buffer, "c_darkOrange", "foreground", "#FF9000", nullptr); // important warning + gtk_text_buffer_create_tag(m_buffer, "c_red", "foreground", "#FF0000", nullptr); // error, fatal + gtk_text_buffer_create_tag(m_buffer, "c_watercourse", "foreground", "#008238", nullptr); // trace + gtk_text_buffer_create_tag(m_buffer, "c_aqua", "foreground", "#00FFFF", nullptr); // number + gtk_text_buffer_create_tag(m_buffer, "c_darkViolet", "foreground", "#6900D7", nullptr); // warning + gtk_text_buffer_create_tag(m_buffer, "c_blueChill", "foreground", "#3d889b", nullptr); // information + gtk_text_buffer_create_tag(m_buffer, "link", "underline", PANGO_UNDERLINE_SINGLE, nullptr); // link for CIdentifier + + GtkTextTagTable* tagTable = gtk_text_buffer_get_tag_table(m_buffer); + m_IdTag = gtk_text_tag_table_lookup(tagTable, "link"); + + m_logWithHexa = ctx.getConfigurationManager().expandAsBoolean("${Designer_ConsoleLogWithHexa}", false); + m_logTimeInSecond = ctx.getConfigurationManager().expandAsBoolean("${Kernel_ConsoleLogTimeInSecond}", false); + m_logTimePrecision = size_t(ctx.getConfigurationManager().expandAsUInteger("${Designer_ConsoleLogTimePrecision}", 3)); +} + +bool CLogListenerDesigner::isActive(const Kernel::ELogLevel level) +{ + const auto it = m_activeLevels.find(level); + if (it == m_activeLevels.end()) { return true; } + return it->second; +} + +bool CLogListenerDesigner::activate(const Kernel::ELogLevel level, const bool active) +{ + m_activeLevels[level] = active; + return true; +} + +bool CLogListenerDesigner::activate(const Kernel::ELogLevel startLevel, const Kernel::ELogLevel endLevel, const bool active) +{ + for (int i = startLevel; i <= endLevel; ++i) { m_activeLevels[Kernel::ELogLevel(i)] = active; } + return true; +} + +bool CLogListenerDesigner::activate(const bool active) { return activate(Kernel::LogLevel_First, Kernel::LogLevel_Last, active); } + +void CLogListenerDesigner::log(const CTime value) +{ + if (m_ignoreMsg) { return; } + checkAppendFilterCurrentLog("c_watercourse", value.str(m_logTimeInSecond, m_logWithHexa).c_str()); +} + +void CLogListenerDesigner::log(const uint64_t value) +{ + if (m_ignoreMsg) { return; } + + std::stringstream txt; + txt << std::dec << value; + if (m_logWithHexa) { txt << " (0x" << std::hex << value << ")"; } + + checkAppendFilterCurrentLog("c_watercourse", txt.str().c_str()); +} + +void CLogListenerDesigner::log(const uint32_t value) +{ + if (m_ignoreMsg) { return; } + + std::stringstream txt; + txt << std::dec << value; + if (m_logWithHexa) { txt << " (0x" << std::hex << value << ")"; } + + checkAppendFilterCurrentLog("c_watercourse", txt.str().c_str()); +} + +void CLogListenerDesigner::log(const int64_t value) +{ + if (m_ignoreMsg) { return; } + + std::stringstream txt; + txt << std::dec << value; + if (m_logWithHexa) { txt << " (0x" << std::hex << value << ")"; } + + checkAppendFilterCurrentLog("c_watercourse", txt.str().c_str()); +} + +void CLogListenerDesigner::log(const int value) +{ + if (m_ignoreMsg) { return; } + + std::stringstream txt; + txt << std::dec << value; + if (m_logWithHexa) { txt << " (0x" << std::hex << value << ")"; } + + checkAppendFilterCurrentLog("c_watercourse", txt.str().c_str()); +} + +void CLogListenerDesigner::log(const double value) +{ + if (m_ignoreMsg) { return; } + checkAppendFilterCurrentLog("c_watercourse", std::to_string(value).c_str()); +} + +void CLogListenerDesigner::log(const bool value) +{ + if (m_ignoreMsg) { return; } + checkAppendFilterCurrentLog("c_watercourse", (value ? "true" : "false")); +} + +void CLogListenerDesigner::log(const CIdentifier& value) +{ + if (m_ignoreMsg) { return; } + checkAppendFilterCurrentLog("c_blueChill", value.str().c_str(), true); +} + +void CLogListenerDesigner::log(const CString& value) +{ + if (m_ignoreMsg) { return; } + checkAppendFilterCurrentLog("c_blueChill", value.toASCIIString()); +} + +void CLogListenerDesigner::log(const std::string& value) +{ + if (m_ignoreMsg) { return; } + checkAppendFilterCurrentLog(nullptr, value.c_str()); +} + +void CLogListenerDesigner::log(const char* value) +{ + if (m_ignoreMsg) { return; } + checkAppendFilterCurrentLog(nullptr, value); +} + +void CLogListenerDesigner::log(const Kernel::ELogLevel level) +{ + // GtkTextIter textIter; + // gtk_text_buffer_get_end_iter(m_Buffer, &l_oTextIter); + + //new log, will be deleted when m_storedLogs is cleared + m_currentLog = new CLogObject(m_buffer);//m_pNonFilteredBuffer); + + //copy this newly added content in the current log + GtkTextIter endIter; + gtk_text_buffer_get_end_iter(m_currentLog->getTextBuffer(), &endIter); + + const auto addTagName = [this, &endIter](GtkToggleToolButton* activeButton, size_t& countVariable, const char* state, const char* color) + { + m_ignoreMsg = !gtk_toggle_tool_button_get_active(activeButton); + if (m_ignoreMsg) { return; } + + countVariable++; + gtk_text_buffer_insert_with_tags_by_name(m_currentLog->getTextBuffer(), &endIter, "[ ", -1, "w_bold", "f_mono", nullptr); + gtk_text_buffer_insert_with_tags_by_name(m_currentLog->getTextBuffer(), &endIter, state, -1, "w_bold", "f_mono", color, nullptr); + gtk_text_buffer_insert_with_tags_by_name(m_currentLog->getTextBuffer(), &endIter, " ] ", -1, "w_bold", "f_mono", nullptr); + }; + + switch (level) + { + case Kernel::LogLevel_Debug: + addTagName(m_buttonActiveDebug, m_nMsg, "DEBUG", "c_blue"); + break; + + case Kernel::LogLevel_Benchmark: + addTagName(m_buttonActiveBenchmark, m_nMsg, "BENCH", "c_magenta"); + break; + + case Kernel::LogLevel_Trace: + addTagName(m_buttonActiveTrace, m_nMsg, "TRACE", "c_watercourse"); + break; + + case Kernel::LogLevel_Info: + addTagName(m_buttonActiveInfo, m_nMsg, "INF", "c_blueChill"); + break; + + case Kernel::LogLevel_Warning: + addTagName(m_buttonActiveWarning, m_nWarning, "WARNING", "c_darkViolet"); + break; + + case Kernel::LogLevel_ImportantWarning: + addTagName(m_buttonActiveImportantWarning, m_nWarning, "WARNING", "c_darkOrange"); + break; + + case Kernel::LogLevel_Error: + addTagName(m_buttonActiveError, m_nError, "ERROR", "c_red"); + break; + + case Kernel::LogLevel_Fatal: + addTagName(m_buttonActiveFatal, m_nError, "FATAL", "c_red"); + break; + + default: + addTagName(nullptr, m_nMsg, "UNKNOWN", nullptr); + break; + } + + if (gtk_toggle_button_get_active(m_buttonPopup) && (level == Kernel::LogLevel_Warning || level == Kernel::LogLevel_ImportantWarning + || level == Kernel::LogLevel_Error || level == Kernel::LogLevel_Fatal)) + { + if (!gtk_widget_get_visible(GTK_WIDGET(m_alertWindow))) + { + gtk_window_set_position(GTK_WINDOW(m_alertWindow), GTK_WIN_POS_CENTER); + gtk_window_present(GTK_WINDOW(m_alertWindow)); + gtk_window_set_keep_above(GTK_WINDOW(m_alertWindow), true); + } + } + m_storedLogs.push_back(m_currentLog); + + //see if the log passes the filter + const bool passFilter = m_currentLog->filter(m_SearchTerm); + //if it does mark this position and insert the log in the text buffer displayed + GtkTextIter endDisplayedTextIter; + gtk_text_buffer_get_end_iter(m_buffer, &endDisplayedTextIter); + gtk_text_buffer_create_mark(m_buffer, "current_log", &endDisplayedTextIter, + true); //creating a mark will erase the previous one with the same name so no worry here + if (passFilter) { displayLog(m_currentLog); } + + this->updateMessageCounts(); + + GtkTextMark mark; + mark = *(gtk_text_buffer_get_mark(gtk_text_view_get_buffer(m_textView), "insert")); + gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(m_textView), &mark, 0.0, FALSE, 0.0, 0.0); +} + +void CLogListenerDesigner::log(const Kernel::ELogColor /*color*/) { } + +void CLogListenerDesigner::updateMessageCounts() const +{ + std::stringstream ss; + ss << "" << m_nMsg << " Message"; + + if (m_nMsg > 1) { ss << "s"; } + + gtk_label_set_markup(m_labelnMsg, ss.str().data()); + + if (m_nWarning > 0) + { + ss.str(""); + ss << "" << m_nWarning << " Warning"; + if (m_nWarning > 1) { ss << "s"; } + + gtk_label_set_markup(m_labelnWarnings, ss.str().data()); + gtk_label_set_markup(m_labelDialognWarnings, ss.str().data()); + gtk_widget_set_visible(GTK_WIDGET(m_labelnWarnings), true); + gtk_widget_set_visible(GTK_WIDGET(m_imageWarnings), true); + } + + if (m_nError > 0) + { + ss.str(""); + ss << "" << m_nError << " Error"; + if (m_nError > 1) { ss << "s"; } + + gtk_label_set_markup(m_labelnErrors, ss.str().data()); + gtk_label_set_markup(m_labelDialognErrors, ss.str().data()); + gtk_widget_set_visible(GTK_WIDGET(m_labelnErrors), true); + gtk_widget_set_visible(GTK_WIDGET(m_imageErrors), true); + } +} + +void CLogListenerDesigner::clearMessages() +{ + m_nMsg = 0; + m_nWarning = 0; + m_nError = 0; + + gtk_label_set_markup(m_labelnMsg, "0 Messages"); + gtk_label_set_markup(m_labelnWarnings, "0 Warnings"); + gtk_label_set_markup(m_labelnErrors, "0 Errors"); + gtk_label_set_markup(m_labelDialognWarnings, "0 Warnings"); + gtk_label_set_markup(m_labelDialognErrors, "0 Errors"); + + gtk_widget_set_visible(m_imageWarnings, false); + gtk_widget_set_visible(GTK_WIDGET(m_labelnWarnings), false); + gtk_widget_set_visible(m_imageErrors, false); + gtk_widget_set_visible(GTK_WIDGET(m_labelnErrors), false); + + gtk_text_buffer_set_text(m_buffer, "", -1); + + std::for_each(m_storedLogs.begin(), m_storedLogs.end(), [](CLogObject* elem) { delete elem; }); + m_storedLogs.clear(); + + m_currentLog = nullptr; +} + +void CLogListenerDesigner::focusMessageWindow() const +{ + gtk_widget_hide(GTK_WIDGET(m_alertWindow)); + gtk_expander_set_expanded(GTK_EXPANDER(gtk_builder_get_object(m_builder, "openvibe-expander_messages")), true); +} + + +void CLogListenerDesigner::checkAppendFilterCurrentLog(const char* textColor, const char* logMessage, const bool isLink) const +{ + if (!m_currentLog) + { + std::cout << "Ouch, current log had been deleted before creating new, this shouldn't happen...\n"; + return; + } + m_currentLog->appendToCurrentLog(textColor, logMessage, isLink); + + if (m_currentLog->filter(m_SearchTerm)) { displayLog(m_currentLog); } +} + +void CLogListenerDesigner::displayLog(CLogObject* log) const +{ + GtkTextMark* mark = gtk_text_buffer_get_mark(m_buffer, "current_log"); + GtkTextIter iter, endIter, begin, end; + gtk_text_buffer_get_iter_at_mark(m_buffer, &iter, mark); + gtk_text_buffer_get_end_iter(m_buffer, &endIter); + + //delete what after the mark + gtk_text_buffer_delete(m_buffer, &iter, &endIter); + //get iter + gtk_text_buffer_get_iter_at_mark(m_buffer, &iter, mark); + //rewrite the log + gtk_text_buffer_get_start_iter(log->getTextBuffer(), &begin); + gtk_text_buffer_get_end_iter(log->getTextBuffer(), &end); + gtk_text_buffer_insert_range(m_buffer, &iter, &begin, &end); +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCLogListenerDesigner.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCLogListenerDesigner.h new file mode 100755 index 0000000..02f8e87 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCLogListenerDesigner.h @@ -0,0 +1,172 @@ +#pragma once + +#include "ovd_base.h" + +#include +#include + +#define OVK_ClassId_Designer_LogListener OpenViBE::CIdentifier(0x0FE155FA, 0x313C17A7) + +namespace OpenViBE { +namespace Designer { + +class CApplication; + +class CLogListenerDesigner final : public Kernel::ILogListener +{ +public: + class CLogObject + { + public: + explicit CLogObject(GtkTextBuffer* buffer) + { + m_Buffer = gtk_text_buffer_new(gtk_text_buffer_get_tag_table(buffer)); + m_PassedFilter = false;//by default the log does not pass the filter; + } + + GtkTextBuffer* getTextBuffer() const { return m_Buffer; } + + //determine if the log contains the searchTerm and tag the part with the sSerachTerm in gray + bool filter(const CString& searchTerm) + { + m_PassedFilter = false; + GtkTextIter startFind, endFind; + gtk_text_buffer_get_start_iter(m_Buffer, &startFind); + gtk_text_buffer_get_end_iter(m_Buffer, &endFind); + + //tag for highlighting the search term + GtkTextTag* tag = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(m_Buffer), "gray_bg"); + if (tag == nullptr) { gtk_text_buffer_create_tag(m_Buffer, "gray_bg", "background", "gray", nullptr); } + + //remove previous tagging + gtk_text_buffer_remove_tag_by_name(m_Buffer, "gray_bg", &startFind, &endFind); + + //no term means no research so no filter we let all pass + if (searchTerm == CString("")) + { + m_PassedFilter = true; + return m_PassedFilter; + } + + + GtkTextIter startMatch, endMatch; + const gchar* text = searchTerm.toASCIIString(); + while (gtk_text_iter_forward_search(&startFind, text, GTK_TEXT_SEARCH_TEXT_ONLY, &startMatch, &endMatch, nullptr)) + { + gtk_text_buffer_apply_tag_by_name(m_Buffer, "gray_bg", &startMatch, &endMatch); + //offset to end_match + const int offset = gtk_text_iter_get_offset(&endMatch); + //begin next search at end match + gtk_text_buffer_get_iter_at_offset(m_Buffer, &startFind, offset); + m_PassedFilter = true; + } + return m_PassedFilter; + } + + void appendToCurrentLog(const char* textColor, const char* logMessage, const bool isLink /* = false */) const + { + GtkTextIter endIter; + gtk_text_buffer_get_end_iter(m_Buffer, &endIter); + + if (isLink) { gtk_text_buffer_insert_with_tags_by_name(m_Buffer, &endIter, logMessage, -1, "f_mono", textColor, "link", nullptr); } + else { gtk_text_buffer_insert_with_tags_by_name(m_Buffer, &endIter, logMessage, -1, "f_mono", textColor, nullptr); } + } + + GtkTextBuffer* m_Buffer = nullptr; + bool m_PassedFilter = false; + }; + + CLogListenerDesigner(const Kernel::IKernelContext& ctx, GtkBuilder* builder); + + bool isActive(const Kernel::ELogLevel level) override; + bool activate(const Kernel::ELogLevel level, const bool active) override; + bool activate(const Kernel::ELogLevel startLevel, const Kernel::ELogLevel endLevel, const bool active) override; + bool activate(const bool active) override; + + void log(const CTime value) override; + + void log(const uint64_t value) override; + void log(const uint32_t value) override; + + void log(const int64_t value) override; + void log(const int value) override; + + void log(const double value) override; + + void log(const bool value) override; + + void log(const CIdentifier& value) override; + void log(const CString& value) override; + void log(const std::string& value) override; + void log(const char* value) override; + + void log(const Kernel::ELogLevel level) override; + void log(const Kernel::ELogColor color) override; + + void clearMessages(); + void focusMessageWindow() const; + + // TODO + void searchMessages(const CString& searchTerm); + void displayLog(CLogObject* log) const; + void appendLog(CLogObject* log) const; + + _IsDerivedFromClass_Final_(Kernel::ILogListener, CIdentifier::undefined()) + + CString m_SearchTerm; + GtkTextTag* m_IdTag = nullptr; + std::function m_CenterOnBoxFun; + +protected: + + std::map m_activeLevels; + + //logs + std::vector m_storedLogs; + +private: + + GtkBuilder* m_builder = nullptr; + GtkTextView* m_textView = nullptr; + GtkTextBuffer* m_buffer = nullptr; + + GtkToggleButton* m_buttonPopup = nullptr; + + GtkToggleToolButton* m_buttonActiveDebug = nullptr; + GtkToggleToolButton* m_buttonActiveBenchmark = nullptr; + GtkToggleToolButton* m_buttonActiveTrace = nullptr; + GtkToggleToolButton* m_buttonActiveInfo = nullptr; + GtkToggleToolButton* m_buttonActiveWarning = nullptr; + GtkToggleToolButton* m_buttonActiveImportantWarning = nullptr; + GtkToggleToolButton* m_buttonActiveError = nullptr; + GtkToggleToolButton* m_buttonActiveFatal = nullptr; + + GtkLabel* m_labelnMsg = nullptr; + GtkLabel* m_labelnWarnings = nullptr; + GtkLabel* m_labelnErrors = nullptr; + GtkLabel* m_labelDialognWarnings = nullptr; + GtkLabel* m_labelDialognErrors = nullptr; + + GtkWidget* m_imageWarnings = nullptr; + GtkWidget* m_imageErrors = nullptr; + + GtkWindow* m_alertWindow = nullptr; + + bool m_ignoreMsg = false; + + size_t m_nMsg = 0; + size_t m_nWarning = 0; + size_t m_nError = 0; + + bool m_logWithHexa = false; + bool m_logTimeInSecond = false; + size_t m_logTimePrecision = 0; + + CLogObject* m_currentLog = nullptr; + + void updateMessageCounts() const; + void checkAppendFilterCurrentLog(const char* textColor, const char* logMessage, bool isLink = false) const; +}; + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCPlayerVisualization.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCPlayerVisualization.cpp new file mode 100755 index 0000000..f39920f --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCPlayerVisualization.cpp @@ -0,0 +1,778 @@ +#include "ovd_base.h" +#include "ovdCApplication.h" +#include "ovdCInterfacedScenario.h" +#include "ovdCPlayerVisualization.h" + +#include + +namespace OpenViBE { +namespace Designer { + +using EVTColumn = VisualizationToolkit::EVisualizationTreeColumn; +using EVTNode = VisualizationToolkit::EVisualizationTreeNode; +using EVTWidget = VisualizationToolkit::EVisualizationWidget; +using IVTWidget = VisualizationToolkit::IVisualizationWidget; + +static GtkTargetEntry targets[] = { { static_cast("STRING"), 0, 0 }, { static_cast("text/plain"), 0, 0 }, }; + +static void delete_window_manager_window_cb(GtkWidget* widget, GdkEvent* /*event*/, gpointer data) +{ + CPlayerVisualization* visualization = reinterpret_cast(data); + CInterfacedScenario& scenario = visualization->getInterfacedScenario(); + GtkWidget* dialog = gtk_message_dialog_new(GTK_WINDOW(widget), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, + "Would you like to stop the scenario execution?"); + const gint res = gtk_dialog_run(GTK_DIALOG(dialog)); + + if (res == GTK_RESPONSE_YES) { if (visualization != nullptr) { scenario.m_Player->stop(); } } + else if (res == GTK_RESPONSE_NO) {} + + gtk_widget_destroy(dialog); +} + +CPlayerVisualization::~CPlayerVisualization() +{ + hideTopLevelWindows(); + + m_activeToolbarButton = nullptr; + + for (auto& window : m_windows) + { + g_signal_handlers_disconnect_by_func(G_OBJECT(window), G_CALLBACK2(CPlayerVisualization::configureEventCB), this); + gtk_widget_destroy(GTK_WIDGET(window)); + } + + m_visualizationTree.setTreeViewCB(nullptr); +} + +void CPlayerVisualization::init() +{ + m_windows.clear(); // empty windows vector + m_splitWidgets.clear(); // empty split widgets map + m_toolbars.clear(); // empty toolbars map + m_plugins.clear(); // empty plugin widgets map + m_activeToolbarButton = nullptr; + m_visualizationTree.setTreeViewCB(this); // register towards tree store + m_visualizationTree.reloadTree(); // rebuild widgets + m_interfacedScenario.setModifiableSettingsWidgets(); // must be called after the previous call to reload tree +} + +GtkWidget* CPlayerVisualization::loadTreeWidget(IVTWidget* widget) +{ + GtkWidget* treeWidget = nullptr; + + if (widget->getType() == EVTWidget::Panel) + { + //retrieve panel index + IVTWidget* window = m_visualizationTree.getVisualizationWidget(widget->getParentIdentifier()); + if (window != nullptr) + { + size_t index; + window->getChildIndex(widget->getIdentifier(), index); + + //create notebook if this is the first panel + if (index == 0) { treeWidget = gtk_notebook_new(); } + else //otherwise retrieve it from first panel + { + CIdentifier id; + window->getChildIdentifier(0, id); + GtkTreeIter iter; + m_visualizationTree.findChildNodeFromRoot(&iter, id); + void* notebookWidget = nullptr; + m_visualizationTree.getPointerValueFromTreeIter(&iter, notebookWidget, EVTColumn::PointerWidget); + treeWidget = static_cast(notebookWidget); + } + } + } + else if (widget->getType() == EVTWidget::VerticalSplit || widget->getType() == EVTWidget::HorizontalSplit + || widget->getType() == EVTWidget::Undefined || widget->getType() == EVTWidget::Box) + { + if (widget->getType() == EVTWidget::Box) + { + if (widget->getParentIdentifier() != CIdentifier::undefined()) + { + //dummy widget (actual one will be created at plugin initialization time) + treeWidget = gtk_button_new(); + } + else { } //widget will be added to a top level window in setWidget() + } + else if (widget->getType() == EVTWidget::Undefined) + { + treeWidget = gtk_button_new(); + gtk_button_set_label(GTK_BUTTON(treeWidget), widget->getName().toASCIIString()); + } + else if (widget->getType() == EVTWidget::HorizontalSplit || widget->getType() == EVTWidget::VerticalSplit) + { + treeWidget = (widget->getType() == EVTWidget::HorizontalSplit) ? gtk_hpaned_new() : gtk_vpaned_new(); + + //store paned widget in paned map + m_splitWidgets[GTK_PANED(treeWidget)] = widget->getIdentifier(); + + //retrieve its attributes + const int handlePos = widget->getDividerPosition(); + + //initialize paned handle position + gtk_paned_set_position(GTK_PANED(treeWidget), handlePos); + } + + //parent widget to its parent + //--------------------------- + IVTWidget* parentWidget = m_visualizationTree.getVisualizationWidget(widget->getParentIdentifier()); + + if (parentWidget != nullptr) //unparented visualization boxes don't have a parent + { + GtkTreeIter parentIter; + m_visualizationTree.findChildNodeFromRoot(&parentIter, parentWidget->getIdentifier()); + + if (parentWidget->getType() == EVTWidget::Panel) + { + //parent widget to notebook as a new page + void* notebook = nullptr; + m_visualizationTree.getPointerValueFromTreeIter(&parentIter, notebook, EVTColumn::PointerWidget); + char* name = nullptr; + m_visualizationTree.getStringValueFromTreeIter(&parentIter, name, EVTColumn::StringName); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), treeWidget, gtk_label_new(name)); + } + else if (parentWidget->getType() == EVTWidget::VerticalSplit || parentWidget->getType() == EVTWidget::HorizontalSplit) + { + //insert widget in parent paned + void* paned = nullptr; + m_visualizationTree.getPointerValueFromTreeIter(&parentIter, paned, EVTColumn::PointerWidget); + if (paned != nullptr && GTK_IS_PANED(paned)) + { + size_t index; + if (parentWidget->getChildIndex(widget->getIdentifier(), index)) + { + if (index == 0) { gtk_paned_pack1(GTK_PANED(paned), treeWidget, TRUE, TRUE); } + else { gtk_paned_pack2(GTK_PANED(paned), treeWidget, TRUE, TRUE); } + } + } + } + } + } + else if (widget->getType() == EVTWidget::Window) + { + //create this window only if it contains at least one visualization box + CIdentifier identifier = CIdentifier::undefined(); + bool createWindow = false; + + //for all visualization boxes + while (m_visualizationTree.getNextVisualizationWidgetIdentifier(identifier, EVTWidget::Box)) + { + //retrieve window containing current visualization box + CIdentifier parentID; + IVTWidget* visualizationWidget = m_visualizationTree.getVisualizationWidget(identifier); + while (visualizationWidget->getParentIdentifier() != CIdentifier::undefined()) + { + parentID = visualizationWidget->getParentIdentifier(); + visualizationWidget = m_visualizationTree.getVisualizationWidget(parentID); + } + + //if current box is parented to window passed in parameter, break and create it + if (m_visualizationTree.getVisualizationWidget(parentID) == widget) + { + createWindow = true; + break; + } + } + + if (createWindow) + { + //create new top level window + treeWidget = gtk_window_new(GTK_WINDOW_TOPLEVEL); + m_windows.push_back(GTK_WINDOW(treeWidget)); + + //retrieve its size + gtk_window_set_default_size(GTK_WINDOW(treeWidget), int(widget->getWidth()), int(widget->getHeight())); + //set its title + gtk_window_set_title(GTK_WINDOW(treeWidget), static_cast(widget->getName())); + + //set it transient for main window + //gtk_window_set_transient_for(GTK_WINDOW(treeWidget), GTK_WINDOW(m_interfacedScenario.m_rApplication.m_MainWindow)); + + //centered on the main window + if (m_kernelCtx.getConfigurationManager().expandAsBoolean("${Designer_WindowManager_Center}", false)) + { + gtk_window_set_position(GTK_WINDOW(treeWidget), GTK_WIN_POS_CENTER_ON_PARENT); + } + + //FIXME wrong spelling (-) + gtk_signal_connect(GTK_OBJECT(treeWidget), "configure_event", G_CALLBACK(configureEventCB), this); + //FIXME wrong spelling (-) + g_signal_connect(treeWidget, "delete_event", G_CALLBACK(delete_window_manager_window_cb), this); + } + } + + //show newly created widget + if (treeWidget != nullptr && widget->getType() != EVTWidget::Window) { gtk_widget_show(treeWidget); } + + return treeWidget; +} + +void CPlayerVisualization::endLoadTreeWidget(IVTWidget* widget) +{ + //retrieve tree widget + GtkTreeIter iter; + m_visualizationTree.findChildNodeFromRoot(&iter, widget->getIdentifier()); + void* treeWidget; + m_visualizationTree.getPointerValueFromTreeIter(&iter, treeWidget, EVTColumn::PointerWidget); + + if (treeWidget != nullptr && widget->getType() == EVTWidget::Window) + { + //retrieve notebook + CIdentifier id; + widget->getChildIdentifier(0, id); + GtkTreeIter childIter; + m_visualizationTree.findChildNodeFromRoot(&childIter, id); + void* childTree; + m_visualizationTree.getPointerValueFromTreeIter(&childIter, childTree, EVTColumn::PointerWidget); + + //insert notebook in window + if (childTree != nullptr && GTK_IS_NOTEBOOK(static_cast(childTree))) + { + gtk_container_add(GTK_CONTAINER(static_cast(treeWidget)), static_cast(childTree)); + } + } +} + +bool CPlayerVisualization::setToolbar(const CIdentifier& boxID, GtkWidget* widget) +{ + //retrieve visualization widget + IVTWidget* visuWidget = m_visualizationTree.getVisualizationWidgetFromBoxIdentifier(boxID); + if (visuWidget == nullptr) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "CPlayerVisualization::setToolbar FAILED : couldn't retrieve simulated box with identifier " + << boxID << "\n"; + return false; + } + + //ensure toolbar pointer is not null + if (widget == nullptr) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "CPlayerVisualization::setToolbar FAILED : toolbar pointer is nullptr for plugin " + << visuWidget->getName() << "\n"; + return false; + } + + //ensure toolbar pointer is a window + if (GTK_IS_WINDOW(widget) == 0) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "CPlayerVisualization::setToolbar FAILED : toolbar pointer is not a GtkWindow for plugin " + << visuWidget->getName() << "\n"; + return false; + } + + //retrieve identifier + const CIdentifier id = visuWidget->getIdentifier(); + + //store toolbar + m_plugins[id].m_Toolbar = widget; + + //ensure it is open at mouse position + gtk_window_set_position(GTK_WINDOW(widget), GTK_WIN_POS_MOUSE); + + //if toolbar button has been created, set it sensitive (otherwise it will be set active later) + if (m_plugins[id].m_ToolbarButton != nullptr) + { + gtk_widget_set_sensitive(GTK_WIDGET(m_plugins[id].m_ToolbarButton), 1); + + //associate toolbar button to toolbar window + m_toolbars[m_plugins[id].m_ToolbarButton] = widget; + } + + //catch delete events + g_signal_connect(G_OBJECT(widget), "delete-event", G_CALLBACK(toolbarDeleteEventCB), this); + + return true; +} + +bool CPlayerVisualization::setWidget(const CIdentifier& boxID, GtkWidget* widget) +{ + //retrieve visualization widget + IVTWidget* visuWidget = m_visualizationTree.getVisualizationWidgetFromBoxIdentifier(boxID); + if (visuWidget == nullptr) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "CPlayerVisualization::setWidget FAILED : couldn't retrieve simulated box with identifier " + << boxID << "\n"; + return false; + } + + //ensure widget pointer is not null + if (widget == nullptr) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "CPlayerVisualization::setWidget FAILED : widget pointer is nullptr for plugin " + << visuWidget->getName() << "\n"; + return false; + } + + //unparent top widget, if necessary + GtkWidget* parent = gtk_widget_get_parent(widget); + if (GTK_IS_CONTAINER(parent)) + { + gtk_object_ref(GTK_OBJECT(widget)); + gtk_container_remove(GTK_CONTAINER(parent), widget); + } + + //create a box to store toolbar button and plugin widget + GtkBox* box = GTK_BOX(gtk_vbox_new(FALSE, 0)); + //gtk_widget_set_size_request(GTK_WIDGET(vBox), 0, 0); + + //create toolbar button + GtkToggleButton* button = GTK_TOGGLE_BUTTON(gtk_toggle_button_new()); + { + //horizontal container : icon + label + GtkBox* hBox = GTK_BOX(gtk_hbox_new(FALSE, 0)); + //gtk_widget_set_size_request(GTK_WIDGET(hBox), 0, 0); + + //retrieve icon name + GtkTreeIter iter; + char* iconString = nullptr; + if (m_visualizationTree.findChildNodeFromRoot(&iter, static_cast(visuWidget->getName()), EVTNode::VisualizationBox)) + { + m_visualizationTree.getStringValueFromTreeIter(&iter, iconString, EVTColumn::StringStockIcon); + } + + //create icon + GtkWidget* icon = gtk_image_new_from_stock(iconString != nullptr ? iconString : GTK_STOCK_EXECUTE, GTK_ICON_SIZE_BUTTON); + //gtk_widget_set_size_request(icon, 0, 0); + gtk_box_pack_start(hBox, icon, TRUE, TRUE, 0); + + //create label + GtkWidget* label = gtk_label_new(static_cast(visuWidget->getName())); + //gtk_widget_set_size_request(label, 0, 0); + gtk_box_pack_start(hBox, label, TRUE, TRUE, 0); + + //add box to button + gtk_container_add(GTK_CONTAINER(button), GTK_WIDGET(hBox)); + } + + //detect toolbar button toggle events + g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(toolbarButtonToggledCB), this); + + //set up toolbar button as drag destination + gtk_drag_dest_set(GTK_WIDGET(button), GTK_DEST_DEFAULT_ALL, targets, sizeof(targets) / sizeof(GtkTargetEntry), GDK_ACTION_COPY); + g_signal_connect(G_OBJECT(button), "drag_data_received", G_CALLBACK(dragDataReceivedInWidgetCB), this); + + //set up toolbar button as drag source as well + gtk_drag_source_set(GTK_WIDGET(button), GDK_BUTTON1_MASK, targets, sizeof(targets) / sizeof(GtkTargetEntry), GDK_ACTION_COPY); + g_signal_connect(G_OBJECT(button), "drag_data_get", G_CALLBACK(dragDataGetFromWidgetCB), this); + + //store plugin widget and toolbar button + const CIdentifier id = visuWidget->getIdentifier(); + m_plugins[id].m_Widget = widget; + m_plugins[id].m_ToolbarButton = button; + + //if a toolbar was registered for this widget, set its button sensitive + if (m_plugins[id].m_Toolbar != nullptr) + { + gtk_widget_set_sensitive(GTK_WIDGET(button), 1); + + //associate toolbar button to toolbar window + m_toolbars[button] = m_plugins[id].m_Toolbar; + } + else { gtk_widget_set_sensitive(GTK_WIDGET(button), 0); } + + //vertical container : button on top, visualization box below + gtk_box_pack_start(box, GTK_WIDGET(button), FALSE, TRUE, 0); + gtk_box_pack_start(box, widget, TRUE, TRUE, 0); + + //show vbox hierarchy + gtk_widget_show_all(GTK_WIDGET(box)); + + //parent box at the appropriate location + parentWidgetBox(visuWidget, box); + + return true; +} + +bool CPlayerVisualization::parentWidgetBox(IVTWidget* widget, GtkBox* widgetBox) +{ + //if widget is unaffected, open it in its own window + if (widget->getParentIdentifier() == CIdentifier::undefined()) + { + //create a top level window + GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + m_windows.push_back(GTK_WINDOW(window)); + const uint64_t width = m_kernelCtx.getConfigurationManager().expandAsUInteger("${Designer_UnaffectedVisualizationWindowWidth}", 400); + const uint64_t height = m_kernelCtx.getConfigurationManager().expandAsUInteger("${Designer_UnaffectedVisualizationWindowHeight}", 400); + + gtk_window_set_default_size(GTK_WINDOW(window), gint(width), gint(height)); + //set its title + gtk_window_set_title(GTK_WINDOW(window), static_cast(widget->getName())); + //set it transient for main window + //gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(m_interfacedScenario.m_rApplication.m_MainWindow)); + //insert box in top level window + gtk_container_add(GTK_CONTAINER(window), reinterpret_cast(widgetBox)); + //prevent user from closing this window + g_signal_connect(window, "delete_event", G_CALLBACK(delete_window_manager_window_cb), this); + + //position: centered in the main window + if (m_kernelCtx.getConfigurationManager().expandAsBoolean("${Designer_WindowManager_Center}", false)) + { + gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ON_PARENT); + } + + //show window (and realize widget in doing so) + gtk_widget_show(window); + } + else //retrieve parent widget in which to insert current widget + { + GtkTreeIter iter; + if (m_visualizationTree.findChildNodeFromRoot(&iter, widget->getParentIdentifier())) + { + void* parent = nullptr; + m_visualizationTree.getPointerValueFromTreeIter(&iter, parent, EVTColumn::PointerWidget); + CIdentifier id; + m_visualizationTree.getIdentifierFromTreeIter(&iter, id, EVTColumn::StringIdentifier); + + //widget is to be parented to a paned widget + if (GTK_IS_PANED(parent)) + { + //retrieve index at which to insert child + IVTWidget* parentWidget = m_visualizationTree.getVisualizationWidget(id); + size_t index; + parentWidget->getChildIndex(widget->getIdentifier(), index); + //insert visualization box in paned + if (index == 0) + { + gtk_container_remove(GTK_CONTAINER(parent), gtk_paned_get_child1(GTK_PANED(parent))); + gtk_paned_pack1(GTK_PANED(parent), GTK_WIDGET(widgetBox), TRUE, TRUE); + } + else + { + gtk_container_remove(GTK_CONTAINER(parent), gtk_paned_get_child2(GTK_PANED(parent))); + gtk_paned_pack2(GTK_PANED(parent), GTK_WIDGET(widgetBox), TRUE, TRUE); + } + } + else if (GTK_IS_NOTEBOOK(parent)) //widget is to be added to a notebook page + { + //retrieve notebook page index + IVTWidget* parentWidget = m_visualizationTree.getVisualizationWidget(id); + IVTWidget* parentWindow = m_visualizationTree.getVisualizationWidget(parentWidget->getParentIdentifier()); + size_t index; + parentWindow->getChildIndex(parentWidget->getIdentifier(), index); + + //remove temporary page + gtk_notebook_remove_page(GTK_NOTEBOOK(parent), index); + + //insert final page + gtk_notebook_insert_page(GTK_NOTEBOOK(parent), GTK_WIDGET(widgetBox), gtk_label_new(parentWidget->getName().toASCIIString()), index); + } + + //resize widgets once they are allocated : this is the case when they are shown on an expose event + //FIXME : perform resizing only once (when it is done as many times as there are widgets in the tree here) + if (parent != nullptr) { gtk_signal_connect(GTK_OBJECT(parent), "expose-event", G_CALLBACK(widgetExposeEventCB), this); } + + //show window (and realize widget if it owns a 3D context) + //-------------------------------------------------------- + //get panel containing widget + GtkTreeIter panelIter = iter; + if (m_visualizationTree.findParentNode(&panelIter, EVTNode::VisualizationPanel)) + { + //get panel identifier + m_visualizationTree.getIdentifierFromTreeIter(&panelIter, id, EVTColumn::StringIdentifier); + + //get panel index in window + size_t index; + m_visualizationTree.getVisualizationWidgetIndex(id, index); + + //get notebook pointer + void* panelWidget = nullptr; + m_visualizationTree.getPointerValueFromTreeIter(&panelIter, panelWidget, EVTColumn::PointerWidget); + + //get parent window + GtkTreeIter windowIter = panelIter; + if (m_visualizationTree.findParentNode(&windowIter, EVTNode::VisualizationWindow)) + { + //get parent window pointer + void* windowWidget = nullptr; + m_visualizationTree.getPointerValueFromTreeIter(&windowIter, windowWidget, EVTColumn::PointerWidget); + + //show parent window + gtk_widget_show(GTK_WIDGET(windowWidget)); + // gtk_widget_realize(GTK_WIDGET(windowWidget)); + // gdk_flush(); + + //set panel containing widget as current (this realizes the widget) + gtk_notebook_set_current_page(GTK_NOTEBOOK(panelWidget), index); + + //then reset first panel as current + gtk_notebook_set_current_page(GTK_NOTEBOOK(panelWidget), 0); + } + } + } + } + + return true; +} + +//called upon Player start +void CPlayerVisualization::showTopLevelWindows() + +{ + for (auto& window : m_windows) { gtk_widget_show(GTK_WIDGET(window)); } + if (m_activeToolbarButton != nullptr) + { + //show active toolbar + gtk_widget_show(m_toolbars[m_activeToolbarButton]); + } + auto it = m_plugins.begin(); + while (it != m_plugins.end()) + { + if (GTK_IS_WIDGET(it->second.m_Widget)) { gtk_widget_show(it->second.m_Widget); } + ++it; + } +} + +//called upon Player stop +void CPlayerVisualization::hideTopLevelWindows() + +{ + auto it = m_plugins.begin(); + while (it != m_plugins.end()) + { + if (GTK_IS_WIDGET(it->second.m_Widget)) { gtk_widget_hide(it->second.m_Widget); } + ++it; + } + + for (auto& window : m_windows) { gtk_widget_hide(GTK_WIDGET(window)); } + + //hide active toolbar + if (m_activeToolbarButton != nullptr) { gtk_widget_hide(m_toolbars[m_activeToolbarButton]); } +} + +//event generated whenever window changes size, including when it is first created +gboolean CPlayerVisualization::configureEventCB(GtkWidget* widget, GdkEventConfigure* /*event*/, gpointer data) +{ + //paned positions aren't to be saved, they are to be read once only + g_signal_handlers_disconnect_by_func(G_OBJECT(widget), G_CALLBACK2(CPlayerVisualization::configureEventCB), data); + + if (GTK_IS_CONTAINER(widget)) { static_cast(data)->resizeCB(GTK_CONTAINER(widget)); } + + return FALSE; +} + +gboolean CPlayerVisualization::widgetExposeEventCB(GtkWidget* widget, GdkEventExpose* /*event*/, gpointer data) +{ + g_signal_handlers_disconnect_by_func(G_OBJECT(widget), G_CALLBACK2(CPlayerVisualization::widgetExposeEventCB), data); + /* + //retrieve topmost widget + while(gtk_widget_get_parent(widget) != nullptr && GTK_IS_CONTAINER(gtk_widget_get_parent(widget))) { widget = gtk_widget_get_parent(widget); } + */ + if (GTK_IS_CONTAINER(widget)) { static_cast(data)->resizeCB(GTK_CONTAINER(widget)); } + + return FALSE; +} + +void CPlayerVisualization::resizeCB(GtkContainer* container) +{ + if (GTK_IS_WINDOW(container)) + { + const gpointer data = g_list_first(gtk_container_get_children(container))->data; + + if (GTK_IS_CONTAINER(data)) { resizeCB(GTK_CONTAINER(data)); } + } + else if (GTK_IS_NOTEBOOK(container)) + { + GtkNotebook* notebook = GTK_NOTEBOOK(container); + + for (int i = 0; i < gtk_notebook_get_n_pages(notebook); ++i) + { + GtkWidget* widget = gtk_notebook_get_nth_page(notebook, i); + if (GTK_IS_CONTAINER(widget)) { resizeCB(GTK_CONTAINER(widget)); } + } + } + else if (GTK_IS_PANED(container)) + { + GtkPaned* paned = GTK_PANED(container); + + //retrieve paned identifier from paned map + CIdentifier& id = m_splitWidgets[GTK_PANED(paned)]; + + //retrieve its attributes + IVTWidget* widget = m_visualizationTree.getVisualizationWidget(id); + const int pos = widget->getDividerPosition(); + const int maxPos = widget->getMaxDividerPosition(); + + if (maxPos > 0) + { + //retrieve current maximum handle position + const int currentMaxPos = GTK_IS_VPANED(paned) ? paned->container.widget.allocation.height + : paned->container.widget.allocation.width; + + //set new paned handle position + gtk_paned_set_position(paned, pos * currentMaxPos / maxPos); + } + + //go down each child + GtkWidget* child = gtk_paned_get_child1(paned); + if (GTK_IS_CONTAINER(child)) { resizeCB(GTK_CONTAINER(child)); } + + child = gtk_paned_get_child2(paned); + if (GTK_IS_CONTAINER(child)) { resizeCB(GTK_CONTAINER(child)); } + } +} + +void CPlayerVisualization::dragDataGetFromWidgetCB(GtkWidget* srcWidget, GdkDragContext* /*dc*/, GtkSelectionData* selectionData, + guint /*info*/, guint /*time*/, gpointer /*data*/) +{ + char str[1024]; + sprintf(str, "%p", srcWidget); + gtk_selection_data_set_text(selectionData, str, gint(strlen(str))); +} + +void CPlayerVisualization::dragDataReceivedInWidgetCB(GtkWidget* dstWidget, GdkDragContext* /*dc*/, gint /*x*/, gint /*y*/, GtkSelectionData* selectionData, + guint /*info*/, guint /*time*/, gpointer /*data*/) +{ + void* srcWidget = nullptr; + sscanf(reinterpret_cast(gtk_selection_data_get_text(selectionData)), "%p", &srcWidget); + + //retrieve source box and parent widgets + GtkWidget* srcBoxWidget; + do { srcBoxWidget = gtk_widget_get_parent(GTK_WIDGET(srcWidget)); } while (srcBoxWidget != nullptr && !GTK_IS_VBOX(srcBoxWidget)); + + if (srcBoxWidget == nullptr) { return; } + + GtkWidget* srcParentWidget = gtk_widget_get_parent(srcBoxWidget); + + if (srcParentWidget == nullptr) { return; } + + //retrieve dest box and parent widgets + GtkWidget* dstBoxWidget; + do { dstBoxWidget = gtk_widget_get_parent(dstWidget); } while (dstBoxWidget != nullptr && !GTK_IS_VBOX(dstBoxWidget)); + + if (dstBoxWidget == nullptr) { return; } + + GtkWidget* dstParentWidget = gtk_widget_get_parent(dstBoxWidget); + + if (dstParentWidget == nullptr) { return; } + + //ensure src and dst widgets are different + if (srcBoxWidget == dstBoxWidget) { return; } + + //remove src box from parent + int srcIndex; + GtkWidget* srcTabLabel = nullptr; + + if (GTK_IS_WINDOW(srcParentWidget)) { srcIndex = 0; } + else if (GTK_IS_NOTEBOOK(srcParentWidget)) + { + srcIndex = gtk_notebook_page_num(GTK_NOTEBOOK(srcParentWidget), srcBoxWidget); + srcTabLabel = gtk_label_new(gtk_notebook_get_tab_label_text(GTK_NOTEBOOK(srcParentWidget), srcBoxWidget)); + } + else if (GTK_IS_PANED(srcParentWidget)) { srcIndex = reinterpret_cast(srcParentWidget)->child1 == srcBoxWidget ? 1 : 2; } + else { return; } + + //remove dst box from parent + int dstIndex; + GtkWidget* dstTabLabel = nullptr; + if (GTK_IS_WINDOW(dstParentWidget)) { dstIndex = 0; } + else if (GTK_IS_NOTEBOOK(dstParentWidget)) + { + dstIndex = gtk_notebook_page_num(GTK_NOTEBOOK(dstParentWidget), dstBoxWidget); + dstTabLabel = gtk_label_new(gtk_notebook_get_tab_label_text(GTK_NOTEBOOK(dstParentWidget), dstBoxWidget)); + } + else if (GTK_IS_PANED(dstParentWidget)) { dstIndex = reinterpret_cast(dstParentWidget)->child1 == dstBoxWidget ? 1 : 2; } + else { return; } + + gtk_object_ref(GTK_OBJECT(srcBoxWidget)); + gtk_container_remove(GTK_CONTAINER(srcParentWidget), srcBoxWidget); + + gtk_object_ref(GTK_OBJECT(dstBoxWidget)); + gtk_container_remove(GTK_CONTAINER(dstParentWidget), dstBoxWidget); + + //parent src box to dst parent + if (GTK_IS_WINDOW(dstParentWidget)) { gtk_container_add(GTK_CONTAINER(dstParentWidget), srcBoxWidget); } + else if (GTK_IS_NOTEBOOK(dstParentWidget)) { gtk_notebook_insert_page(GTK_NOTEBOOK(dstParentWidget), srcBoxWidget, dstTabLabel, dstIndex); } + else //dst parent is a paned + { + if (dstIndex == 1) { gtk_paned_pack1(GTK_PANED(dstParentWidget), srcBoxWidget, TRUE, TRUE); } + else { gtk_paned_pack2(GTK_PANED(dstParentWidget), srcBoxWidget, TRUE, TRUE); } + } + + //parent dst box to src parent + if (GTK_IS_WINDOW(srcParentWidget)) { gtk_container_add(GTK_CONTAINER(srcParentWidget), dstBoxWidget); } + else if (GTK_IS_NOTEBOOK(srcParentWidget)) { gtk_notebook_insert_page(GTK_NOTEBOOK(srcParentWidget), dstBoxWidget, srcTabLabel, srcIndex); } + else //src parent is a paned + { + if (srcIndex == 1) { gtk_paned_pack1(GTK_PANED(srcParentWidget), dstBoxWidget, TRUE, TRUE); } + else { gtk_paned_pack2(GTK_PANED(srcParentWidget), dstBoxWidget, TRUE, TRUE); } + } +} + +void CPlayerVisualization::toolbarButtonToggledCB(GtkToggleButton* button, gpointer data) { static_cast(data)->toggleToolbarCB(button); } + +bool CPlayerVisualization::toggleToolbarCB(GtkToggleButton* button) +{ + //retrieve toolbar + if (m_toolbars.find(button) == m_toolbars.end()) { return false; } + GtkWidget* toolbar = m_toolbars[button]; + + //if current toolbar is toggled on or off, update toolbar state accordingly + if (button == m_activeToolbarButton) + { + //hiding active toolbar + if (gtk_toggle_button_get_active(button) == FALSE) + { + gtk_widget_hide(toolbar); + m_activeToolbarButton = nullptr; + } + else { gtk_widget_show(toolbar); } //showing active toolbar + } + else //a new toolbar is to be shown + { + //hide previously active toolbar, if any + if (m_activeToolbarButton != nullptr) + { + gtk_widget_hide(m_toolbars[m_activeToolbarButton]); + + g_signal_handlers_disconnect_by_func(m_activeToolbarButton, G_CALLBACK2(toolbarButtonToggledCB), this); + gtk_toggle_button_set_active(m_activeToolbarButton, FALSE); + g_signal_connect(m_activeToolbarButton, "toggled", G_CALLBACK(toolbarButtonToggledCB), this); + } + /* + //set toolbar transient for plugin window + ::GtkWidget* widget = GTK_WIDGET(pToolbarButton); + while(widget!=nullptr && !GTK_IS_WINDOW(widget)) { widget = gtk_widget_get_parent(widget); } + if(widget != nullptr && GTK_IS_WINDOW(toolbar)) { gtk_window_set_transient_for(GTK_WINDOW(toolbar), GTK_WINDOW(widget)); } + */ + //show new toolbar + gtk_widget_show(toolbar); + + //update active toolbar button + m_activeToolbarButton = button; + } + + return true; +} + +gboolean CPlayerVisualization::toolbarDeleteEventCB(GtkWidget* widget, GdkEvent* /*event*/, gpointer data) +{ + if (data != nullptr) { static_cast(data)->deleteToolbarCB(widget); } + return TRUE; +} + +bool CPlayerVisualization::deleteToolbarCB(GtkWidget* widget) +{ + if (m_activeToolbarButton == nullptr || m_toolbars[m_activeToolbarButton] != widget) + { + //error : active toolbar isn't the one registered as such + gtk_widget_hide(widget); + return FALSE; + } + + //toggle toolbar button off + g_signal_handlers_disconnect_by_func(m_activeToolbarButton, G_CALLBACK2(toolbarButtonToggledCB), this); + gtk_toggle_button_set_active(m_activeToolbarButton, FALSE); + g_signal_connect(m_activeToolbarButton, "toggled", G_CALLBACK(toolbarButtonToggledCB), this); + + //hide toolbar + gtk_widget_hide(widget); + + //clear active toolbar button pointer + m_activeToolbarButton = nullptr; + + return TRUE; +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCPlayerVisualization.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCPlayerVisualization.h new file mode 100644 index 0000000..62dfff9 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCPlayerVisualization.h @@ -0,0 +1,98 @@ +#pragma once + +#include "ovd_base.h" + +#include +#include +#include + +namespace OpenViBE { +namespace Designer { +class CInterfacedScenario; + +class CPlayerVisualization final : public VisualizationToolkit::ITreeViewCB +{ +public: + CPlayerVisualization(const Kernel::IKernelContext& ctx, VisualizationToolkit::IVisualizationTree& tree, + CInterfacedScenario& interfacedScenario) + : m_kernelCtx(ctx), m_visualizationTree(tree), m_interfacedScenario(interfacedScenario) { } + + ~CPlayerVisualization() override; + + void init(); + + /** \name ITreeViewCB interface implementation */ + //@{ + GtkWidget* loadTreeWidget(VisualizationToolkit::IVisualizationWidget* widget) override; + void endLoadTreeWidget(VisualizationToolkit::IVisualizationWidget* widget) override; + bool setToolbar(const CIdentifier& boxID, GtkWidget* widget) override; + bool setWidget(const CIdentifier& boxID, GtkWidget* widget) override; + //@} + + void showTopLevelWindows(); + void hideTopLevelWindows(); + CInterfacedScenario& getInterfacedScenario() const { return m_interfacedScenario; } + +protected: + bool parentWidgetBox(VisualizationToolkit::IVisualizationWidget* widget, GtkBox* widgetBox); + + static gboolean configureEventCB(GtkWidget* widget, GdkEventConfigure* event, gpointer data); + static gboolean widgetExposeEventCB(GtkWidget* widget, GdkEventExpose* event, gpointer data); + void resizeCB(GtkContainer* container); + + //callbacks for DND + static void dragDataGetFromWidgetCB(GtkWidget* srcWidget, GdkDragContext* dc, GtkSelectionData* selectionData, guint info, guint time, gpointer data); + static void dragDataReceivedInWidgetCB(GtkWidget* dstWidget, GdkDragContext* dc, gint x, gint y, GtkSelectionData* selectionData, guint info, guint time, + gpointer data); + + //callback for toolbar + static void toolbarButtonToggledCB(GtkToggleButton* button, gpointer data); + bool toggleToolbarCB(GtkToggleButton* button); + static gboolean toolbarDeleteEventCB(GtkWidget* widget, GdkEvent* event, gpointer data); + bool deleteToolbarCB(GtkWidget* widget); + +private: + + const Kernel::IKernelContext& m_kernelCtx; + VisualizationToolkit::IVisualizationTree& m_visualizationTree; + CInterfacedScenario& m_interfacedScenario; + + /** + * \brief Vector of top level windows + */ + std::vector m_windows; + + /** + * \brief Map of split (paned) widgets associated to their identifiers + * This map is used to retrieve size properties of split widgets upon window resizing, + * so as to keep the relative sizes of a hierarchy of widgets + */ + std::map m_splitWidgets; + + /** + * \brief Map associating toolbar buttons to toolbar windows + */ + std::map m_toolbars; + + /** + * \brief Pointer to active toolbar button + */ + GtkToggleButton* m_activeToolbarButton = nullptr; + + class CPluginWidgets + { + public: + CPluginWidgets() = default; + ~CPluginWidgets() = default; + GtkWidget* m_Widget = nullptr; + GtkToggleButton* m_ToolbarButton = nullptr; + GtkWidget* m_Toolbar = nullptr; + }; + + /** + * \brief Map of visualization plugins + */ + std::map m_plugins; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCRenameDialog.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCRenameDialog.cpp new file mode 100644 index 0000000..d9859d7 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCRenameDialog.cpp @@ -0,0 +1,44 @@ +#include "ovdCRenameDialog.h" + +namespace OpenViBE { +namespace Designer { + +bool CRenameDialog::run() +{ + GtkBuilder* interface = gtk_builder_new(); // glade_xml_new(m_guiFilename.toASCIIString(), "rename", nullptr); + gtk_builder_add_from_file(interface, m_guiFilename.toASCIIString(), nullptr); + gtk_builder_connect_signals(interface, nullptr); + + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(interface, "rename")); + GtkWidget* name = GTK_WIDGET(gtk_builder_get_object(interface, "rename-entry")); + g_object_unref(interface); + + gtk_entry_set_text(GTK_ENTRY(name), m_initialName.toASCIIString()); + + bool finished = false; + bool res = false; + while (!finished) + { + const gint valid = gtk_dialog_run(GTK_DIALOG(dialog)); + if (valid == GTK_RESPONSE_APPLY) + { + m_result = gtk_entry_get_text(GTK_ENTRY(name)); + finished = true; + res = true; + } + else if (valid == 1) { gtk_entry_set_text(GTK_ENTRY(name), m_defaultName.toASCIIString()); } // default + else if (valid == 2) { gtk_entry_set_text(GTK_ENTRY(name), m_initialName.toASCIIString()); } // revert + else + { + finished = true; + res = false; + } + } + + gtk_widget_destroy(dialog); + + return res; +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCRenameDialog.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCRenameDialog.h new file mode 100644 index 0000000..76aabc3 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCRenameDialog.h @@ -0,0 +1,31 @@ +#pragma once + +#include "ovd_base.h" + +namespace OpenViBE { +namespace Designer { +class CRenameDialog final +{ +public: + + CRenameDialog(const Kernel::IKernelContext& ctx, const CString& initialName, const CString& defaultName, const char* guiFilename) + : m_kernelCtx(ctx), m_initialName(initialName), m_defaultName(defaultName), m_result(initialName), m_guiFilename(guiFilename) { } + + ~CRenameDialog() = default; + + bool run(); + CString getResult() const { return m_result; } + +protected: + + const Kernel::IKernelContext& m_kernelCtx; + CString m_initialName; + CString m_defaultName; + CString m_result; + CString m_guiFilename; + +private: + CRenameDialog() = delete; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCScenarioStateStack.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCScenarioStateStack.cpp new file mode 100644 index 0000000..27c6696 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCScenarioStateStack.cpp @@ -0,0 +1,190 @@ +#include "ovdCScenarioStateStack.h" + +#include "ovdCInterfacedScenario.h" +#include +#include + +namespace OpenViBE { +namespace Designer { + +CScenarioStateStack::CScenarioStateStack(const Kernel::IKernelContext& ctx, CInterfacedScenario& interfacedScenario, Kernel::IScenario& scenario) + : m_kernelCtx(ctx), m_interfacedScenario(interfacedScenario), m_scenario(scenario) +{ + m_currentState = m_states.begin(); + m_nMaximumState = size_t(m_kernelCtx.getConfigurationManager().expandAsUInteger("${Designer_UndoRedoStackSize}", 64)); +} + +bool CScenarioStateStack::undo() +{ + auto it = m_currentState; + if (it == m_states.begin()) { return false; } + + --it; + m_currentState = it; + + return this->restoreState(**m_currentState); +} + +bool CScenarioStateStack::isRedoPossible() +{ + auto it = m_currentState; + if (it == m_states.end()) { return false; } + + ++it; + return it != m_states.end(); +} + +bool CScenarioStateStack::redo() +{ + auto it = m_currentState; + if (it == m_states.end()) { return false; } + + ++it; + if (it == m_states.end()) { return false; } + + m_currentState = it; + + return this->restoreState(**m_currentState); +} + +bool CScenarioStateStack::snapshot() +{ + CMemoryBuffer* newState = new CMemoryBuffer(); + + if (!this->dumpState(*newState)) + { + delete newState; + return false; + } + + if (m_currentState != m_states.end()) { ++m_currentState; } + + while (m_currentState != m_states.end()) + { + delete*m_currentState; + m_currentState = m_states.erase(m_currentState); + } + + if (m_nMaximumState != 0) { while (m_states.size() >= m_nMaximumState) { m_states.erase(m_states.begin()); } } + + m_states.push_back(newState); + + m_currentState = m_states.end(); + --m_currentState; + + return true; +} + +bool CScenarioStateStack::restoreState(const IMemoryBuffer& state) +{ + CMemoryBuffer uncompressedBuffer; + + if (state.getSize() == 0) { return false; } + + const CIdentifier importerID = m_kernelCtx.getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_XMLScenarioImporter); + if (importerID == CIdentifier::undefined()) { return false; } + + Kernel::IAlgorithmProxy* importer = &m_kernelCtx.getAlgorithmManager().getAlgorithm(importerID); + if (!importer) { return false; } + + const uLongf srcSize = uLongf(state.getSize()) - sizeof(uLongf); + Bytef* srcBuffer = const_cast(state.getDirectPointer()); + + uLongf dstSize = *(uLongf*)(state.getDirectPointer() + state.getSize() - sizeof(uLongf)); + uncompressedBuffer.setSize(dstSize, true); + Bytef* dstBuffer = static_cast(uncompressedBuffer.getDirectPointer()); + + if (uncompress(dstBuffer, &dstSize, srcBuffer, srcSize) != Z_OK) { return false; } + + importer->initialize(); + + Kernel::TParameterHandler ip_buffer(importer->getInputParameter(OV_Algorithm_ScenarioImporter_InputParameterId_MemoryBuffer)); + Kernel::TParameterHandler op_scenario(importer->getOutputParameter(OV_Algorithm_ScenarioImporter_OutputParameterId_Scenario)); + + m_scenario.clear(); + + ip_buffer = &uncompressedBuffer; + op_scenario = &m_scenario; + + importer->process(); + importer->uninitialize(); + m_kernelCtx.getAlgorithmManager().releaseAlgorithm(*importer); + + // Find the VisualizationTree metadata + Kernel::IMetadata* treeMetadata = nullptr; + CIdentifier metadataID = CIdentifier::undefined(); + while ((metadataID = m_scenario.getNextMetadataIdentifier(metadataID)) != CIdentifier::undefined()) + { + treeMetadata = m_scenario.getMetadataDetails(metadataID); + if (treeMetadata && treeMetadata->getType() == OVVIZ_MetadataIdentifier_VisualizationTree) { break; } + } + + VisualizationToolkit::IVisualizationTree* visualizationTree = m_interfacedScenario.m_Tree; + if (treeMetadata && visualizationTree) { visualizationTree->deserialize(treeMetadata->getData()); } + + return true; +} + +bool CScenarioStateStack::dumpState(IMemoryBuffer& state) +{ + CMemoryBuffer uncompressedBuffer; + CMemoryBuffer compressedBuffer; + + // Update the scenario metadata according to the current state of the visualization tree + + // Remove all VisualizationTree type metadata + CIdentifier oldTreeMetadataID = CIdentifier::undefined(); + CIdentifier metadataID = CIdentifier::undefined(); + while ((metadataID = m_scenario.getNextMetadataIdentifier(metadataID)) != CIdentifier::undefined()) + { + if (m_scenario.getMetadataDetails(metadataID)->getType() == OVVIZ_MetadataIdentifier_VisualizationTree) + { + oldTreeMetadataID = metadataID; + m_scenario.removeMetadata(metadataID); + metadataID = CIdentifier::undefined(); + } + } + + // Insert new metadata + m_scenario.addMetadata(metadataID, oldTreeMetadataID); + m_scenario.getMetadataDetails(metadataID)->setType(OVVIZ_MetadataIdentifier_VisualizationTree); + m_scenario.getMetadataDetails(metadataID)->setData(m_interfacedScenario.m_Tree->serialize()); + + const CIdentifier exporterID = m_kernelCtx.getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_XMLScenarioExporter); + + if (exporterID == CIdentifier::undefined()) { return false; } + + Kernel::IAlgorithmProxy* exporter = &m_kernelCtx.getAlgorithmManager().getAlgorithm(exporterID); + if (!exporter) { return false; } + + exporter->initialize(); + + Kernel::TParameterHandler ip_scenario(exporter->getInputParameter(OV_Algorithm_ScenarioExporter_InputParameterId_Scenario)); + Kernel::TParameterHandler op_buffer(exporter->getOutputParameter(OV_Algorithm_ScenarioExporter_OutputParameterId_MemoryBuffer)); + + ip_scenario = &m_scenario; + op_buffer = &uncompressedBuffer; + + exporter->process(); + exporter->uninitialize(); + m_kernelCtx.getAlgorithmManager().releaseAlgorithm(*exporter); + + uLongf srcSize = uLongf(uncompressedBuffer.getSize()); + Bytef* srcBuffer = static_cast(uncompressedBuffer.getDirectPointer()); + + compressedBuffer.setSize(12 + uint64_t(srcSize * 1.1), true); + + uLongf dstSize = uLongf(compressedBuffer.getSize()); + Bytef* dstBuffer = static_cast(compressedBuffer.getDirectPointer()); + + if (compress(dstBuffer, &dstSize, srcBuffer, srcSize) != Z_OK) { return false; } + + state.setSize(0, true); + state.append(compressedBuffer.getDirectPointer(), dstSize); + state.append(reinterpret_cast(&srcSize), sizeof(uLongf)); + + return true; +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCScenarioStateStack.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCScenarioStateStack.h new file mode 100644 index 0000000..aa423a1 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCScenarioStateStack.h @@ -0,0 +1,43 @@ +#pragma once + +#include + +#include "ovd_base.h" + +namespace OpenViBE { +namespace Designer { +class CInterfacedScenario; + +class CScenarioStateStack +{ +public: + + CScenarioStateStack(const Kernel::IKernelContext& ctx, CInterfacedScenario& interfacedScenario, Kernel::IScenario& scenario); + virtual ~CScenarioStateStack() { for (auto& state : m_states) { delete state; } } + + virtual bool isUndoPossible() { return m_currentState != m_states.begin(); } + virtual bool undo(); + virtual bool isRedoPossible(); + virtual bool redo(); + void dropLastState() { m_states.pop_back(); } + + virtual bool snapshot(); + +private: + + virtual bool restoreState(const IMemoryBuffer& state); + virtual bool dumpState(IMemoryBuffer& state); + +protected: + + const Kernel::IKernelContext& m_kernelCtx; + CInterfacedScenario& m_interfacedScenario; + Kernel::IScenario& m_scenario; + + std::list m_states; + std::list::iterator m_currentState; + + size_t m_nMaximumState = 0; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCSettingCollectionHelper.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCSettingCollectionHelper.cpp new file mode 100644 index 0000000..c617f86 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCSettingCollectionHelper.cpp @@ -0,0 +1,805 @@ +#include "ovdCSettingCollectionHelper.h" + +#include +#include +#include +#include +#include + +#include +// ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- + +namespace OpenViBE { +namespace Designer { + +typedef struct +{ + double percent; + GdkColor color; + GtkColorButton* colorButton; + GtkSpinButton* spinButton; +} color_gradient_node_t; + +typedef struct +{ + std::string guiFilename; + GtkWidget* dialog; + GtkWidget* container; + GtkWidget* drawingArea; + std::vector colorGradient; + std::map colorButtons; + std::map spinButtons; +} color_gradient_t; + +static void gradients2Matrix(const std::vector& in, CMatrix& out) +{ + out.resize(4, in.size()); + size_t i = 0; + for (const auto& color : in) + { + out[i++] = color.percent; + out[i++] = color.color.red / 655.35; // * 100.0 / 65535.0; + out[i++] = color.color.green / 655.35; // * 100.0 / 65535.0; + out[i++] = color.color.blue / 655.35; // * 100.0 / 65535.0; + } +} + +static void CollectWidgetCB(GtkWidget* widget, gpointer data) { static_cast*>(data)->push_back(widget); } +static void RemoveWidgetCB(GtkWidget* widget, gpointer data) { gtk_container_remove(GTK_CONTAINER(data), widget); } + +// ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- + +static void OnEntrySettingBOOLEdited(GtkEntry* entry, gpointer /*data*/) +{ + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(gtk_widget_get_parent(GTK_WIDGET(entry))), CollectWidgetCB, &widgets); + GtkToggleButton* widget = GTK_TOGGLE_BUTTON(widgets[1]); + + const std::string value = gtk_entry_get_text(entry); + if (value == "true") + { + gtk_toggle_button_set_active(widget, true); + gtk_toggle_button_set_inconsistent(widget, false); + } + else if (value == "false") + { + gtk_toggle_button_set_active(widget, false); + gtk_toggle_button_set_inconsistent(widget, false); + } + else { gtk_toggle_button_set_inconsistent(widget, true); } +} + +static void OnCheckbuttonSettingBOOLPressed(GtkToggleButton* button, gpointer /*data*/) +{ + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(gtk_widget_get_parent(GTK_WIDGET(button))), CollectWidgetCB, &widgets); + GtkEntry* widget = GTK_ENTRY(widgets[0]); + + if (gtk_toggle_button_get_active(button)) { gtk_entry_set_text(widget, "true"); } + else { gtk_entry_set_text(widget, "false"); } + gtk_toggle_button_set_inconsistent(button, false); +} + +static void OnButtonSettingIntegerPressed(GtkButton* button, gpointer data, const gint iOffset) +{ + const Kernel::IKernelContext& ctx = static_cast(data)->m_KernelCtx; + + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(gtk_widget_get_parent(GTK_WIDGET(button))), CollectWidgetCB, &widgets); + GtkEntry* widget = GTK_ENTRY(widgets[0]); + + const int64_t value = ctx.getConfigurationManager().expandAsInteger(gtk_entry_get_text(widget), 0) + iOffset; + const std::string res = std::to_string(value); + gtk_entry_set_text(widget, res.c_str()); +} + +static void OnButtonSettingIntegerUpPressed(GtkButton* button, gpointer data) { OnButtonSettingIntegerPressed(button, data, 1); } +static void OnButtonSettingIntegerDownPressed(GtkButton* button, gpointer data) { OnButtonSettingIntegerPressed(button, data, -1); } + +static void OnButtonSettingFloatPressed(GtkButton* button, gpointer data, const gdouble offset) +{ + const Kernel::IKernelContext& ctx = static_cast(data)->m_KernelCtx; + + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(gtk_widget_get_parent(GTK_WIDGET(button))), CollectWidgetCB, &widgets); + GtkEntry* widget = GTK_ENTRY(widgets[0]); + + double value = ctx.getConfigurationManager().expandAsFloat(gtk_entry_get_text(widget), 0); + value += offset; + const std::string res = std::to_string(value); + gtk_entry_set_text(widget, res.c_str()); +} + +static void OnButtonSettingFloatUpPressed(GtkButton* button, gpointer data) { OnButtonSettingFloatPressed(button, data, 1); } +static void OnButtonSettingFloatDownPressed(GtkButton* button, gpointer data) { OnButtonSettingFloatPressed(button, data, -1); } + +static void OnButtonSettingFilenameBrowsePressed(GtkButton* button, gpointer data) +{ + const Kernel::IKernelContext& ctx = static_cast(data)->m_KernelCtx; + + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(gtk_widget_get_parent(GTK_WIDGET(button))), CollectWidgetCB, &widgets); + GtkEntry* widget = GTK_ENTRY(widgets[0]); + + GtkWidget* widgetDialogOpen = gtk_file_chooser_dialog_new("Select file to open...", nullptr, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nullptr); + + const CString filename = ctx.getConfigurationManager().expand(gtk_entry_get_text(widget)); + if (g_path_is_absolute(filename.toASCIIString())) { gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widgetDialogOpen), filename.toASCIIString()); } + else + { + char* fullPath = g_build_filename(g_get_current_dir(), filename.toASCIIString(), nullptr); + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widgetDialogOpen), fullPath); + g_free(fullPath); + } + + gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(widgetDialogOpen), false); + + if (gtk_dialog_run(GTK_DIALOG(widgetDialogOpen)) == GTK_RESPONSE_ACCEPT) + { + char* name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widgetDialogOpen)); + char* backslash; + while ((backslash = strchr(name, '\\')) != nullptr) { *backslash = '/'; } + gtk_entry_set_text(widget, name); + g_free(name); + } + gtk_widget_destroy(widgetDialogOpen); +} + +static void OnButtonSettingFoldernameBrowsePressed(GtkButton* button, gpointer data) +{ + const Kernel::IKernelContext& ctx = static_cast(data)->m_KernelCtx; + + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(gtk_widget_get_parent(GTK_WIDGET(button))), CollectWidgetCB, &widgets); + GtkEntry* widget = GTK_ENTRY(widgets[0]); + + GtkWidget* widgetDialogOpen = gtk_file_chooser_dialog_new("Select folder to open...", nullptr, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nullptr); + + const CString filename = ctx.getConfigurationManager().expand(gtk_entry_get_text(widget)); + if (g_path_is_absolute(filename.toASCIIString())) { gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widgetDialogOpen), filename.toASCIIString()); } + else + { + char* fullPath = g_build_filename(g_get_current_dir(), filename.toASCIIString(), nullptr); + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widgetDialogOpen), fullPath); + g_free(fullPath); + } + + gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(widgetDialogOpen), false); + + if (gtk_dialog_run(GTK_DIALOG(widgetDialogOpen)) == GTK_RESPONSE_ACCEPT) + { + char* name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widgetDialogOpen)); + char* backslash; + while ((backslash = strchr(name, '\\')) != nullptr) { *backslash = '/'; } + gtk_entry_set_text(widget, name); + g_free(name); + } + gtk_widget_destroy(widgetDialogOpen); +} +// ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- + +static void OnButtonSettingScriptEditPressed(GtkButton* button, gpointer data) +{ + const Kernel::IKernelContext& ctx = static_cast(data)->m_KernelCtx; + + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(gtk_widget_get_parent(GTK_WIDGET(button))), CollectWidgetCB, &widgets); + GtkEntry* widget = GTK_ENTRY(widgets[0]); + + const CString name = ctx.getConfigurationManager().expand(gtk_entry_get_text(widget)); + const CString cmd = ctx.getConfigurationManager().expand("${Designer_ScriptEditorCommand}"); + + if (cmd != CString("")) + { + CString fullCmd = cmd + CString(" \"") + name + CString("\""); +#if defined TARGET_OS_Windows + fullCmd = "START " + fullCmd; +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + fullCmd = fullCmd + " &"; +#else +#endif + if (system(fullCmd.toASCIIString()) < 0) { ctx.getLogManager() << Kernel::LogLevel_Warning << "Could not run command " << fullCmd << "\n"; } + } +} + +// ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- + +static void OnButtonSettingColorChoosePressed(GtkColorButton* button, gpointer /*data*/) +{ + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(gtk_widget_get_parent(GTK_WIDGET(button))), CollectWidgetCB, &widgets); + GtkEntry* widget = GTK_ENTRY(widgets[0]); + GdkColor color; + gtk_color_button_get_color(button, &color); + + const std::string res = std::to_string((color.red * 100) / 65535) + "," + std::to_string((color.green * 100) / 65535) + "," + + std::to_string((color.blue * 100) / 65535); + gtk_entry_set_text(widget, res.c_str()); +} + +// ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- + +static void OnGTKWidgetDestroy(GtkWidget* widget, gpointer /*data*/) { gtk_widget_destroy(widget); } +static void OnInitializeColorGradient(GtkWidget* widget, gpointer data); + +static void OnRefreshColorGradient(GtkWidget* /*widget*/, GdkEventExpose* /*event*/, gpointer data) +{ + auto* userData = static_cast(data); + + const size_t steps = 100; + gint sizex = 0; + gint sizey = 0; + gdk_drawable_get_size(userData->drawingArea->window, &sizex, &sizey); + + CMatrix gradient; + gradients2Matrix(userData->colorGradient, gradient); + + CMatrix interpolated; + VisualizationToolkit::ColorGradient::interpolate(interpolated, gradient, steps); + + GdkGC* gc = gdk_gc_new(userData->drawingArea->window); + GdkColor color; + + for (size_t i = 0; i < steps; ++i) + { + color.red = guint(interpolated[i * 4 + 1] * 655.35); + color.green = guint(interpolated[i * 4 + 2] * 655.35); + color.blue = guint(interpolated[i * 4 + 3] * 655.35); + gdk_gc_set_rgb_fg_color(gc, &color); + gdk_draw_rectangle(userData->drawingArea->window, gc, TRUE, (sizex * i) / steps, 0, (sizex * (i + 1)) / steps, sizey); + } + g_object_unref(gc); +} + +static void OnColorGradientSpinButtonValueChanged(GtkSpinButton* button, gpointer data) +{ + auto* userData = static_cast(data); + + gtk_spin_button_update(button); + + const size_t i = userData->spinButtons[button]; + GtkSpinButton* prevSpin = (i > 0 ? userData->colorGradient[i - 1].spinButton : nullptr); + GtkSpinButton* nextSpin = (i < userData->colorGradient.size() - 1 ? userData->colorGradient[i + 1].spinButton : nullptr); + if (!prevSpin) { gtk_spin_button_set_value(button, 0); } + if (!nextSpin) { gtk_spin_button_set_value(button, 100); } + if (prevSpin && gtk_spin_button_get_value(button) < gtk_spin_button_get_value(prevSpin)) + { + gtk_spin_button_set_value(button, gtk_spin_button_get_value(prevSpin)); + } + if (nextSpin && gtk_spin_button_get_value(button) > gtk_spin_button_get_value(nextSpin)) + { + gtk_spin_button_set_value(button, gtk_spin_button_get_value(nextSpin)); + } + + userData->colorGradient[i].percent = gtk_spin_button_get_value(button); + + OnRefreshColorGradient(nullptr, nullptr, data); +} + +static void OnColorGradientColorButtonPressed(GtkColorButton* button, gpointer data) +{ + auto* userData = static_cast(data); + + GdkColor color; + gtk_color_button_get_color(button, &color); + + userData->colorGradient[userData->colorButtons[button]].color = color; + + OnRefreshColorGradient(nullptr, nullptr, data); +} + +static void OnInitializeColorGradient(GtkWidget* /*widget*/, gpointer data) +{ + auto* userData = static_cast(data); + + gtk_widget_hide(userData->container); + + gtk_container_foreach(GTK_CONTAINER(userData->container), OnGTKWidgetDestroy, nullptr); + + const size_t count = userData->colorGradient.size(); + userData->colorButtons.clear(); + userData->spinButtons.clear(); + size_t i = 0; + for (auto& it : userData->colorGradient) + { + GtkBuilder* builder = gtk_builder_new(); // glade_xml_new(userData->guiFilename.c_str(), "setting_editor-color_gradient-hbox", nullptr); + gtk_builder_add_from_file(builder, userData->guiFilename.c_str(), nullptr); + gtk_builder_connect_signals(builder, nullptr); + + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(builder, "setting_editor-color_gradient-hbox")); + + it.colorButton = GTK_COLOR_BUTTON(gtk_builder_get_object(builder, "setting_editor-color_gradient-colorbutton")); + it.spinButton = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "setting_editor-color_gradient-spinbutton")); + + gtk_color_button_set_color(it.colorButton, &it.color); + gtk_spin_button_set_value(it.spinButton, it.percent); + + g_signal_connect(G_OBJECT(it.colorButton), "color-set", G_CALLBACK(OnColorGradientColorButtonPressed), userData); + g_signal_connect(G_OBJECT(it.spinButton), "value-changed", G_CALLBACK(OnColorGradientSpinButtonValueChanged), userData); + + g_object_ref(widget); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(widget)), widget); + gtk_container_add(GTK_CONTAINER(userData->container), widget); + g_object_unref(widget); + + g_object_unref(builder); + + userData->colorButtons[it.colorButton] = i; + userData->spinButtons[it.spinButton] = i; + i++; + } + + gtk_spin_button_set_value(userData->colorGradient[0].spinButton, 0); + gtk_spin_button_set_value(userData->colorGradient[count - 1].spinButton, 100); + + gtk_widget_show(userData->container); +} + +static void OnButtonColorGradientAddPressed(GtkButton* /*button*/, gpointer data) +{ + auto* userData = static_cast(data); + userData->colorGradient.resize(userData->colorGradient.size() + 1); + userData->colorGradient[userData->colorGradient.size() - 1].percent = 100; + OnInitializeColorGradient(nullptr, data); + OnRefreshColorGradient(nullptr, nullptr, data); +} + +static void OnButtonColorGradientRemovePressed(GtkButton* /*button*/, gpointer data) +{ + auto* userData = static_cast(data); + if (userData->colorGradient.size() > 2) + { + userData->colorGradient.resize(userData->colorGradient.size() - 1); + userData->colorGradient[userData->colorGradient.size() - 1].percent = 100; + OnInitializeColorGradient(nullptr, data); + OnRefreshColorGradient(nullptr, nullptr, data); + } +} + +static void OnButtonSettingColorGradientConfigurePressed(GtkButton* button, gpointer data) +{ + color_gradient_t userData; + + userData.guiFilename = static_cast(data)->m_GUIFilename.toASCIIString(); + + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(gtk_widget_get_parent(GTK_WIDGET(button))), CollectWidgetCB, &widgets); + GtkEntry* widget = GTK_ENTRY(widgets[0]); + + GtkBuilder* builder = gtk_builder_new(); // glade_xml_new(userData.guiFilename.c_str(), "setting_editor-color_gradient-dialog", nullptr); + gtk_builder_add_from_file(builder, userData.guiFilename.c_str(), nullptr); + gtk_builder_connect_signals(builder, nullptr); + + userData.dialog = GTK_WIDGET(gtk_builder_get_object(builder, "setting_editor-color_gradient-dialog")); + + const CString sInitialGradient = static_cast(data)->m_KernelCtx.getConfigurationManager().expand(gtk_entry_get_text(widget)); + CMatrix initialGradient; + + VisualizationToolkit::ColorGradient::parse(initialGradient, sInitialGradient); + + userData.colorGradient.resize(initialGradient.getDimensionSize(1) > 2 ? initialGradient.getDimensionSize(1) : 2); + for (size_t i = 0; i < initialGradient.getDimensionSize(1); ++i) + { + userData.colorGradient[i].percent = initialGradient[i * 4]; + userData.colorGradient[i].color.red = guint(initialGradient[i * 4 + 1] * 655.35); + userData.colorGradient[i].color.green = guint(initialGradient[i * 4 + 2] * 655.35); + userData.colorGradient[i].color.blue = guint(initialGradient[i * 4 + 3] * 655.35); + } + + userData.container = GTK_WIDGET(gtk_builder_get_object(builder, "setting_editor-color_gradient-vbox")); + userData.drawingArea = GTK_WIDGET(gtk_builder_get_object(builder, "setting_editor-color_gradient-drawingarea")); + + g_signal_connect(G_OBJECT(userData.dialog), "show", G_CALLBACK(OnInitializeColorGradient), &userData); + g_signal_connect(G_OBJECT(userData.drawingArea), "expose_event", G_CALLBACK(OnRefreshColorGradient), &userData); + g_signal_connect(G_OBJECT(gtk_builder_get_object(builder, "setting_editor-color_gradient-add_button")), "pressed", + G_CALLBACK(OnButtonColorGradientAddPressed), &userData); + g_signal_connect(G_OBJECT(gtk_builder_get_object(builder, "setting_editor-color_gradient-remove_button")), "pressed", + G_CALLBACK(OnButtonColorGradientRemovePressed), &userData); + + if (gtk_dialog_run(GTK_DIALOG(userData.dialog)) == GTK_RESPONSE_APPLY) + { + CString str; + CMatrix gradient; + gradients2Matrix(userData.colorGradient, gradient); + + VisualizationToolkit::ColorGradient::format(str, gradient); + gtk_entry_set_text(widget, str.toASCIIString()); + } + + gtk_widget_destroy(userData.dialog); + g_object_unref(builder); +} + +// ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- + +CString CSettingCollectionHelper::getSettingWidgetName(const CIdentifier& typeID) const +{ + if (typeID == OV_TypeId_Boolean) { return "settings_collection-hbox_setting_boolean"; } + if (typeID == OV_TypeId_Integer) { return "settings_collection-hbox_setting_integer"; } + if (typeID == OV_TypeId_Float) { return "settings_collection-hbox_setting_float"; } + if (typeID == OV_TypeId_String) { return "settings_collection-entry_setting_string"; } + if (typeID == OV_TypeId_Filename) { return "settings_collection-hbox_setting_filename"; } + if (typeID == OV_TypeId_Foldername) { return "settings_collection-hbox_setting_foldername"; } + if (typeID == OV_TypeId_Script) { return "settings_collection-hbox_setting_script"; } + if (typeID == OV_TypeId_Color) { return "settings_collection-hbox_setting_color"; } + if (typeID == OV_TypeId_ColorGradient) { return "settings_collection-hbox_setting_color_gradient"; } + if (m_KernelCtx.getTypeManager().isEnumeration(typeID)) { return "settings_collection-comboboxentry_setting_enumeration"; } + if (m_KernelCtx.getTypeManager().isBitMask(typeID)) { return "settings_collection-table_setting_bitmask"; } + return "settings_collection-entry_setting_string"; +} + +// ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- + +CString CSettingCollectionHelper::getSettingEntryWidgetName(const CIdentifier& typeID) const +{ + if (typeID == OV_TypeId_Boolean) { return "settings_collection-entry_setting_boolean"; } + if (typeID == OV_TypeId_Integer) { return "settings_collection-entry_setting_integer_string"; } + if (typeID == OV_TypeId_Float) { return "settings_collection-entry_setting_float_string"; } + if (typeID == OV_TypeId_String) { return "settings_collection-entry_setting_string"; } + if (typeID == OV_TypeId_Filename) { return "settings_collection-entry_setting_filename_string"; } + if (typeID == OV_TypeId_Foldername) { return "settings_collection-entry_setting_foldername_string"; } + if (typeID == OV_TypeId_Script) { return "settings_collection-entry_setting_script_string"; } + if (typeID == OV_TypeId_Color) { return "settings_collection-hbox_setting_color_string"; } + if (typeID == OV_TypeId_ColorGradient) { return "settings_collection-hbox_setting_color_gradient_string"; } + if (m_KernelCtx.getTypeManager().isEnumeration(typeID)) { return "settings_collection-comboboxentry_setting_enumeration"; } + if (m_KernelCtx.getTypeManager().isBitMask(typeID)) { return "settings_collection-table_setting_bitmask"; } + return "settings_collection-entry_setting_string"; +} + +// ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- + +CString CSettingCollectionHelper::getValue(const CIdentifier& typeID, GtkWidget* widget) const +{ + if (!widget) { return ""; } + if (typeID == OV_TypeId_Boolean) { return getValueBoolean(widget); } + if (typeID == OV_TypeId_Integer) { return getValueInteger(widget); } + if (typeID == OV_TypeId_Float) { return getValueFloat(widget); } + if (typeID == OV_TypeId_String) { return getValueString(widget); } + if (typeID == OV_TypeId_Filename) { return getValueFilename(widget); } + if (typeID == OV_TypeId_Foldername) { return getValueFoldername(widget); } + if (typeID == OV_TypeId_Script) { return getValueScript(widget); } + if (typeID == OV_TypeId_Color) { return getValueColor(widget); } + if (typeID == OV_TypeId_ColorGradient) { return getValueColorGradient(widget); } + if (m_KernelCtx.getTypeManager().isEnumeration(typeID)) { return getValueEnumeration(typeID, widget); } + if (m_KernelCtx.getTypeManager().isBitMask(typeID)) { return getValueBitMask(typeID, widget); } + return getValueString(widget); +} + +CString CSettingCollectionHelper::getValueBoolean(GtkWidget* widget) +{ + std::vector widgets; + if (!GTK_IS_CONTAINER(widget)) { return "false"; } + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); + if (!GTK_IS_ENTRY(widgets[1])) { return "false"; } + GtkEntry* entry = GTK_ENTRY(widgets[1]); + return CString(gtk_entry_get_text(entry)); +} + +CString CSettingCollectionHelper::getValueInteger(GtkWidget* widget) +{ + std::vector widgets; + if (!GTK_IS_CONTAINER(widget)) { return "0"; } + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); + if (!GTK_IS_ENTRY(widgets[0])) { return "O"; } + GtkEntry* entry = GTK_ENTRY(widgets[0]); + return CString(gtk_entry_get_text(entry)); +} + +CString CSettingCollectionHelper::getValueFloat(GtkWidget* widget) +{ + std::vector widgets; + if (!GTK_IS_CONTAINER(widget)) { return "0"; } + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); + if (!GTK_IS_ENTRY(widgets[0])) { return "O"; } + GtkEntry* entry = GTK_ENTRY(widgets[0]); + return CString(gtk_entry_get_text(entry)); +} + +CString CSettingCollectionHelper::getValueString(GtkWidget* widget) +{ + if (!GTK_IS_ENTRY(widget)) { return ""; } + GtkEntry* entry = GTK_ENTRY(widget); + return CString(gtk_entry_get_text(entry)); +} + +CString CSettingCollectionHelper::getValueFilename(GtkWidget* widget) +{ + std::vector widgets; + if (!GTK_IS_CONTAINER(widget)) { return ""; } + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); + if (!GTK_IS_ENTRY(widgets[0])) { return ""; } + GtkEntry* entry = GTK_ENTRY(widgets[0]); + return CString(gtk_entry_get_text(entry)); +} + +CString CSettingCollectionHelper::getValueFoldername(GtkWidget* widget) +{ + std::vector widgets; + if (!GTK_IS_CONTAINER(widget)) { return ""; } + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); + if (!GTK_IS_ENTRY(widgets[0])) { return ""; } + GtkEntry* entry = GTK_ENTRY(widgets[0]); + return CString(gtk_entry_get_text(entry)); +} + +CString CSettingCollectionHelper::getValueScript(GtkWidget* widget) +{ + std::vector widgets; + if (!GTK_IS_CONTAINER(widget)) { return ""; } + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); + if (!GTK_IS_ENTRY(widgets[0])) { return ""; } + GtkEntry* entry = GTK_ENTRY(widgets[0]); + return CString(gtk_entry_get_text(entry)); +} + +CString CSettingCollectionHelper::getValueColor(GtkWidget* widget) +{ + std::vector widgets; + if (!GTK_IS_CONTAINER(widget)) { return ""; } + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); + if (!GTK_IS_ENTRY(widgets[0])) { return ""; } + GtkEntry* entry = GTK_ENTRY(widgets[0]); + return CString(gtk_entry_get_text(entry)); +} + +CString CSettingCollectionHelper::getValueColorGradient(GtkWidget* widget) +{ + std::vector widgets; + if (!GTK_IS_CONTAINER(widget)) { return ""; } + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); + if (!GTK_IS_ENTRY(widgets[0])) { return ""; } + GtkEntry* entry = GTK_ENTRY(widgets[0]); + return CString(gtk_entry_get_text(entry)); +} + +CString CSettingCollectionHelper::getValueEnumeration(const CIdentifier& /*typeID*/, GtkWidget* widget) +{ + if (!GTK_IS_COMBO_BOX(widget)) { return ""; } + GtkComboBox* comboBox = GTK_COMBO_BOX(widget); + return CString(gtk_combo_box_get_active_text(comboBox)); +} + +CString CSettingCollectionHelper::getValueBitMask(const CIdentifier& /*typeID*/, GtkWidget* widget) +{ + std::vector widgets; + if (!GTK_IS_CONTAINER(widget)) { return ""; } + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); + std::string res; + + for (auto& window : widgets) + { + if (!GTK_IS_TOGGLE_BUTTON(window)) { return ""; } + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window))) + { + if (!res.empty()) { res += std::string(1, OV_Value_EnumeratedStringSeparator); } + res += gtk_button_get_label(GTK_BUTTON(window)); + } + } + return res.c_str(); +} + +// ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- + +void CSettingCollectionHelper::setValue(const CIdentifier& typeID, GtkWidget* widget, const CString& value) +{ + if (!widget) { return; } + if (typeID == OV_TypeId_Boolean) { return setValueBoolean(widget, value); } + if (typeID == OV_TypeId_Integer) { return setValueInteger(widget, value); } + if (typeID == OV_TypeId_Float) { return setValueFloat(widget, value); } + if (typeID == OV_TypeId_String) { return setValueString(widget, value); } + if (typeID == OV_TypeId_Filename) { return setValueFilename(widget, value); } + if (typeID == OV_TypeId_Foldername) { return setValueFoldername(widget, value); } + if (typeID == OV_TypeId_Script) { return setValueScript(widget, value); } + if (typeID == OV_TypeId_Color) { return setValueColor(widget, value); } + if (typeID == OV_TypeId_ColorGradient) { return setValueColorGradient(widget, value); } + if (m_KernelCtx.getTypeManager().isEnumeration(typeID)) { return setValueEnumeration(typeID, widget, value); } + if (m_KernelCtx.getTypeManager().isBitMask(typeID)) { return setValueBitMask(typeID, widget, value); } + return setValueString(widget, value); +} + +void CSettingCollectionHelper::setValueBoolean(GtkWidget* widget, const CString& value) +{ + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); + GtkEntry* entry = GTK_ENTRY(widgets[0]); + GtkToggleButton* toggleButton = GTK_TOGGLE_BUTTON(widgets[1]); + + if (value == CString("true")) { gtk_toggle_button_set_active(toggleButton, true); } + else if (value == CString("false")) { gtk_toggle_button_set_active(toggleButton, false); } + else { gtk_toggle_button_set_inconsistent(toggleButton, true); } + + gtk_entry_set_text(entry, value); + + g_signal_connect(G_OBJECT(toggleButton), "toggled", G_CALLBACK(OnCheckbuttonSettingBOOLPressed), this); + g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(OnEntrySettingBOOLEdited), this); +} + +void CSettingCollectionHelper::setValueInteger(GtkWidget* widget, const CString& value) +{ + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); + GtkEntry* entry = GTK_ENTRY(widgets[0]); + + g_signal_connect(G_OBJECT(widgets[1]), "clicked", G_CALLBACK(OnButtonSettingIntegerUpPressed), this); + g_signal_connect(G_OBJECT(widgets[2]), "clicked", G_CALLBACK(OnButtonSettingIntegerDownPressed), this); + + gtk_entry_set_text(entry, value); +} + +void CSettingCollectionHelper::setValueFloat(GtkWidget* widget, const CString& value) +{ + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); + GtkEntry* entry = GTK_ENTRY(widgets[0]); + + g_signal_connect(G_OBJECT(widgets[1]), "clicked", G_CALLBACK(OnButtonSettingFloatUpPressed), this); + g_signal_connect(G_OBJECT(widgets[2]), "clicked", G_CALLBACK(OnButtonSettingFloatDownPressed), this); + + gtk_entry_set_text(entry, value); +} + +void CSettingCollectionHelper::setValueString(GtkWidget* widget, const CString& value) +{ + GtkEntry* entry = GTK_ENTRY(widget); + gtk_entry_set_text(entry, value); +} + +void CSettingCollectionHelper::setValueFilename(GtkWidget* widget, const CString& value) +{ + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); + GtkEntry* entry = GTK_ENTRY(widgets[0]); + + g_signal_connect(G_OBJECT(widgets[1]), "clicked", G_CALLBACK(OnButtonSettingFilenameBrowsePressed), this); + + gtk_entry_set_text(entry, value); +} + +void CSettingCollectionHelper::setValueFoldername(GtkWidget* widget, const CString& value) +{ + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); + GtkEntry* entry = GTK_ENTRY(widgets[0]); + + g_signal_connect(G_OBJECT(widgets[1]), "clicked", G_CALLBACK(OnButtonSettingFoldernameBrowsePressed), this); + + gtk_entry_set_text(entry, value); +} + +void CSettingCollectionHelper::setValueScript(GtkWidget* widget, const CString& value) +{ + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); + GtkEntry* entry = GTK_ENTRY(widgets[0]); + + g_signal_connect(G_OBJECT(widgets[1]), "clicked", G_CALLBACK(OnButtonSettingScriptEditPressed), this); + g_signal_connect(G_OBJECT(widgets[2]), "clicked", G_CALLBACK(OnButtonSettingFilenameBrowsePressed), this); + + gtk_entry_set_text(entry, value); +} + +void CSettingCollectionHelper::setValueColor(GtkWidget* widget, const CString& value) +{ + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); + GtkEntry* entry = GTK_ENTRY(widgets[0]); + + g_signal_connect(G_OBJECT(widgets[1]), "color-set", G_CALLBACK(OnButtonSettingColorChoosePressed), this); + + int r = 0, g = 0, b = 0; + sscanf(m_KernelCtx.getConfigurationManager().expand(value).toASCIIString(), "%i,%i,%i", &r, &g, &b); + + GdkColor color; + color.red = (r * 65535) / 100; + color.green = (g * 65535) / 100; + color.blue = (b * 65535) / 100; + gtk_color_button_set_color(GTK_COLOR_BUTTON(widgets[1]), &color); + + gtk_entry_set_text(entry, value); +} + +void CSettingCollectionHelper::setValueColorGradient(GtkWidget* widget, const CString& value) +{ + std::vector widgets; + gtk_container_foreach(GTK_CONTAINER(widget), CollectWidgetCB, &widgets); + GtkEntry* entry = GTK_ENTRY(widgets[0]); + + g_signal_connect(G_OBJECT(widgets[1]), "clicked", G_CALLBACK(OnButtonSettingColorGradientConfigurePressed), this); + + gtk_entry_set_text(entry, value); +} + +void CSettingCollectionHelper::setValueEnumeration(const CIdentifier& typeID, GtkWidget* widget, const CString& value) const +{ + GtkTreeIter listIter; + GtkComboBox* comboBox = GTK_COMBO_BOX(widget); + GtkListStore* list = GTK_LIST_STORE(gtk_combo_box_get_model(comboBox)); + const uint64_t v = m_KernelCtx.getTypeManager().getEnumerationEntryValueFromName(typeID, value); + uint64_t i; + +#if 0 + if (typeID == OV_TypeId_Stimulation) + { +#endif + + std::map listEntries; + for (i = 0; i < m_KernelCtx.getTypeManager().getEnumerationEntryCount(typeID); ++i) + { + CString entryName; + uint64_t entryValue; + if (m_KernelCtx.getTypeManager().getEnumerationEntry(typeID, i, entryName, entryValue)) { listEntries[entryName] = entryValue; } + } + + gtk_combo_box_set_wrap_width(comboBox, 0); + gtk_list_store_clear(list); + i = 0; + for (auto it = listEntries.begin(); it != listEntries.end(); ++it, i++) + { + gtk_list_store_append(list, &listIter); + gtk_list_store_set(list, &listIter, 0, it->first.toASCIIString(), -1); + + if (v == it->second) { gtk_combo_box_set_active(comboBox, gint(i)); } + } +#if 0 + } + else + { + gtk_list_store_clear(list); + for (i = 0; i < m_kernelCtx.getTypeManager().getEnumerationEntryCount(typeID); ++i) + { + CString entryName; + uint64_t entryValue; + if (m_kernelCtx.getTypeManager().getEnumerationEntry(typeID, i, entryName, entryValue)) + { + gtk_list_store_append(list, &listIter); + gtk_list_store_set(list, &listIter, 0, entryName.toASCIIString(), -1); + + if (v == entryValue) { gtk_combo_box_set_active(l_widget, gint(i)); } + } + } + } +#endif + if (gtk_combo_box_get_active(comboBox) == -1) + { + gtk_list_store_append(list, &listIter); + gtk_list_store_set(list, &listIter, 0, value.toASCIIString(), -1); + gtk_combo_box_set_active(comboBox, gint(i)); // $$$ i should be ok :) + } +} + +void CSettingCollectionHelper::setValueBitMask(const CIdentifier& typeID, GtkWidget* widget, const CString& value) const +{ + gtk_container_foreach(GTK_CONTAINER(widget), RemoveWidgetCB, widget); + + const std::string str(value); + + const gint size = guint((m_KernelCtx.getTypeManager().getBitMaskEntryCount(typeID) + 1) >> 1); + GtkTable* bitMaskTable = GTK_TABLE(widget); + gtk_table_resize(bitMaskTable, 2, size); + + for (uint64_t i = 0; i < m_KernelCtx.getTypeManager().getBitMaskEntryCount(typeID); ++i) + { + CString entryName; + uint64_t entryValue; + if (m_KernelCtx.getTypeManager().getBitMaskEntry(typeID, i, entryName, entryValue)) + { + GtkWidget* settingButton = gtk_check_button_new(); + gtk_table_attach_defaults(bitMaskTable, settingButton, guint(i & 1), guint((i & 1) + 1), guint(i >> 1), guint((i >> 1) + 1)); + gtk_button_set_label(GTK_BUTTON(settingButton), entryName.toASCIIString()); + + if (str.find(entryName.toASCIIString()) != std::string::npos) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(settingButton), true); } + } + } + + /* + * TODO - Add an entry text somewhere to manage + * configuration through configuration manager ! + */ + + gtk_widget_show_all(GTK_WIDGET(bitMaskTable)); +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCSettingCollectionHelper.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCSettingCollectionHelper.h new file mode 100644 index 0000000..92db192 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCSettingCollectionHelper.h @@ -0,0 +1,52 @@ +#pragma once + +#include "ovd_base.h" + +#include + +namespace OpenViBE { +namespace Designer { +class CSettingCollectionHelper final +{ +public: + + CSettingCollectionHelper(const Kernel::IKernelContext& ctx, const char* guiFilename) : m_KernelCtx(ctx), m_GUIFilename(guiFilename) { } + ~CSettingCollectionHelper() = default; + + CString getSettingWidgetName(const CIdentifier& typeID) const; + CString getSettingEntryWidgetName(const CIdentifier& typeID) const; + + CString getValue(const CIdentifier& typeID, GtkWidget* widget) const; + static CString getValueBoolean(GtkWidget* widget); + static CString getValueInteger(GtkWidget* widget); + static CString getValueFloat(GtkWidget* widget); + static CString getValueString(GtkWidget* widget); + static CString getValueFilename(GtkWidget* widget); + static CString getValueFoldername(GtkWidget* widget); + static CString getValueScript(GtkWidget* widget); + static CString getValueColor(GtkWidget* widget); + static CString getValueColorGradient(GtkWidget* widget); + static CString getValueEnumeration(const CIdentifier& typeID, GtkWidget* widget); + static CString getValueBitMask(const CIdentifier& typeID, GtkWidget* widget); + + void setValue(const CIdentifier& typeID, GtkWidget* widget, const CString& value); + void setValueBoolean(GtkWidget* widget, const CString& value); + void setValueInteger(GtkWidget* widget, const CString& value); + void setValueFloat(GtkWidget* widget, const CString& value); + static void setValueString(GtkWidget* widget, const CString& value); + void setValueFilename(GtkWidget* widget, const CString& value); + void setValueFoldername(GtkWidget* widget, const CString& value); + void setValueScript(GtkWidget* widget, const CString& value); + void setValueColor(GtkWidget* widget, const CString& value); + void setValueColorGradient(GtkWidget* widget, const CString& value); + void setValueEnumeration(const CIdentifier& typeID, GtkWidget* widget, const CString& value) const; + void setValueBitMask(const CIdentifier& typeID, GtkWidget* widget, const CString& value) const; + + const Kernel::IKernelContext& m_KernelCtx; + CString m_GUIFilename; + +private: + CSettingCollectionHelper() = delete; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCSettingEditorDialog.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCSettingEditorDialog.cpp new file mode 100755 index 0000000..3d6a0a2 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCSettingEditorDialog.cpp @@ -0,0 +1,105 @@ +#include "ovdCSettingEditorDialog.h" + +namespace OpenViBE { +namespace Designer { + +static void TypeChangedCB(GtkComboBox* /*widget*/, gpointer data) { static_cast(data)->typeChangedCB(); } + +bool CSettingEditorDialog::run() +{ + GtkBuilder* builder = gtk_builder_new(); // glade_xml_new(m_guiFilename.toASCIIString(), "setting_editor", nullptr); + gtk_builder_add_from_file(builder, m_guiFilename.toASCIIString(), nullptr); + gtk_builder_connect_signals(builder, nullptr); + + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(builder, "setting_editor")); + GtkWidget* name = GTK_WIDGET(gtk_builder_get_object(builder, "setting_editor-setting_name_entry")); + m_table = GTK_WIDGET(gtk_builder_get_object(builder, "setting_editor-table")); + m_type = GTK_WIDGET(gtk_builder_get_object(builder, "setting_editor-setting_type_combobox")); + gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(m_type)))); + g_object_unref(builder); + + gtk_window_set_title(GTK_WINDOW(dialog), m_title.c_str()); + + g_signal_connect(G_OBJECT(m_type), "changed", G_CALLBACK(TypeChangedCB), this); + + CString settingName; + CIdentifier settingType; + m_box.getSettingName(m_settingIdx, settingName); + m_box.getSettingType(m_settingIdx, settingType); + + gtk_entry_set_text(GTK_ENTRY(name), settingName.toASCIIString()); + + gint active = -1; + size_t nSettings = 0; // Cannot rely on m_settingTypes.size() -- if there are any duplicates, it wont increment properly (and should be an error anyway) ... + + for (const auto& currentTypeID : m_kernelCtx.getTypeManager().getSortedTypes()) + { + if (!m_kernelCtx.getTypeManager().isStream(currentTypeID.first)) + { + gtk_combo_box_append_text(GTK_COMBO_BOX(m_type), currentTypeID.second.toASCIIString()); + if (currentTypeID.first == settingType) { active = gint(nSettings); } + m_settingTypes[currentTypeID.second.toASCIIString()] = currentTypeID.first; + nSettings++; + } + } + + if (active != -1) { gtk_combo_box_set_active(GTK_COMBO_BOX(m_type), active); } + + bool finished = false; + bool res = false; + while (!finished) + { + const gint result = gtk_dialog_run(GTK_DIALOG(dialog)); + if (result == GTK_RESPONSE_APPLY) + { + char* activeText = gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_type)); + if (activeText) + { + settingType = m_settingTypes[activeText]; + m_box.setSettingName(m_settingIdx, gtk_entry_get_text(GTK_ENTRY(name))); + m_box.setSettingType(m_settingIdx, settingType); + m_box.setSettingValue(m_settingIdx, m_helper.getValue(settingType, m_defaultValue)); + m_box.setSettingDefaultValue(m_settingIdx, m_helper.getValue(settingType, m_defaultValue)); + finished = true; + res = true; + } + } + else if (result == 2) // revert + { + gtk_entry_set_text(GTK_ENTRY(name), settingName.toASCIIString()); + if (active != -1) { gtk_combo_box_set_active(GTK_COMBO_BOX(m_type), active); } + } + else + { + finished = true; + res = false; + } + } + + gtk_widget_destroy(dialog); + return res; +} + +void CSettingEditorDialog::typeChangedCB() + +{ + const CIdentifier settingType = m_settingTypes[gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_type))]; + + const CString name = m_helper.getSettingWidgetName(settingType); + GtkBuilder* builderDummy = gtk_builder_new(); // glade_xml_new(m_guiFilename.toASCIIString(), name, nullptr); + gtk_builder_add_from_file(builderDummy, m_guiSettingsFilename.toASCIIString(), nullptr); + gtk_builder_connect_signals(builderDummy, nullptr); + + if (m_defaultValue) { gtk_container_remove(GTK_CONTAINER(m_table), m_defaultValue); } + m_defaultValue = GTK_WIDGET(gtk_builder_get_object(builderDummy, name.toASCIIString())); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(m_defaultValue)), m_defaultValue); + gtk_table_attach(GTK_TABLE(m_table), m_defaultValue, 1, 2, 2, 3, GtkAttachOptions(GTK_FILL | GTK_EXPAND), GtkAttachOptions(GTK_FILL | GTK_EXPAND), 0, 0); + g_object_unref(builderDummy); + + CString value; + m_box.getSettingDefaultValue(m_settingIdx, value); + m_helper.setValue(settingType, m_defaultValue, value); +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCSettingEditorDialog.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCSettingEditorDialog.h new file mode 100755 index 0000000..0b17fcf --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdCSettingEditorDialog.h @@ -0,0 +1,39 @@ +#pragma once + +#include "ovdCSettingCollectionHelper.h" + +#include +#include + +namespace OpenViBE { +namespace Designer { +class CSettingEditorDialog final +{ +public: + + CSettingEditorDialog(const Kernel::IKernelContext& ctx, Kernel::IBox& box, const size_t index, const char* title, + const char* guiFilename, const char* guiSettingsFilename) + : m_kernelCtx(ctx), m_box(box), m_helper(ctx, guiFilename), m_settingIdx(index), m_guiFilename(guiFilename), + m_guiSettingsFilename(guiSettingsFilename), m_title(title) { } + + ~CSettingEditorDialog() = default; + + bool run(); + void typeChangedCB(); + +protected: + + const Kernel::IKernelContext& m_kernelCtx; + Kernel::IBox& m_box; + CSettingCollectionHelper m_helper; + size_t m_settingIdx = 0; + CString m_guiFilename; + CString m_guiSettingsFilename; + std::string m_title; + GtkWidget* m_table = nullptr; + GtkWidget* m_type = nullptr; + GtkWidget* m_defaultValue = nullptr; + std::map m_settingTypes; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdTAttributeHandler.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdTAttributeHandler.cpp new file mode 100644 index 0000000..638d00e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdTAttributeHandler.cpp @@ -0,0 +1,65 @@ +#include "ovdTAttributeHandler.h" + +#include + +namespace OpenViBE { +namespace Designer { + +bool TAttributeHandler::removeAttribute(const CIdentifier& id) +{ + if (!m_attributable) { return false; } + return m_attributable->removeAttribute(id); +} + +bool TAttributeHandler::removeAllAttributes() + +{ + if (!m_attributable) { return false; } + return m_attributable->removeAllAttributes(); +} + +template <> +bool TAttributeHandler::addAttribute(const CIdentifier& id, const int& value) const +{ + if (!m_attributable) { return false; } + const std::string str = std::to_string(value); // pass directly std::to_string().c_str() with int value can return anything + return m_attributable->addAttribute(id, str.c_str()); +} + +template <> +bool TAttributeHandler::addAttribute(const CIdentifier& id, const bool& value) const +{ + if (!m_attributable) { return false; } + + return m_attributable->addAttribute(id, (value ? "true" : "false")); +} + +template <> +int TAttributeHandler::getAttributeValue(const CIdentifier& id) const { return strtol(m_constAttributable->getAttributeValue(id), nullptr, 10); } + +template <> +bool TAttributeHandler::getAttributeValue(const CIdentifier& id) const +{ + bool res = false; + const CString value(m_constAttributable->getAttributeValue(id)); + if (value == CString("true")) { res = true; } + + return res; +} + +template <> +bool TAttributeHandler::setAttributeValue(const CIdentifier& id, const int& value) +{ + if (!m_attributable) { return false; } + const std::string str = std::to_string(value); // pass directly std::to_string().c_str() with int value can return anything + return m_attributable->setAttributeValue(id, str.c_str()); +} + +template <> +bool TAttributeHandler::setAttributeValue(const CIdentifier& id, const bool& value) +{ + if (!m_attributable) { return false; } + return m_attributable->setAttributeValue(id, (value ? "true" : "false")); +} +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdTAttributeHandler.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdTAttributeHandler.h new file mode 100644 index 0000000..f1bd452 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovdTAttributeHandler.h @@ -0,0 +1,36 @@ +#pragma once + +#include "ovd_base.h" + +namespace OpenViBE { +namespace Designer { +class TAttributeHandler +{ +public: + + explicit TAttributeHandler(Kernel::IAttributable& attributable) : m_constAttributable(&attributable), m_attributable(&attributable) { } + explicit TAttributeHandler(const Kernel::IAttributable& attributable) : m_constAttributable(&attributable) { } + + template + bool addAttribute(const CIdentifier& id, const T& value) const; + + bool removeAttribute(const CIdentifier& id); + + bool removeAllAttributes(); + + template + T getAttributeValue(const CIdentifier& id) const; + + template + bool setAttributeValue(const CIdentifier& id, const T& value); + + bool hasAttribute(const CIdentifier& id) const { return m_constAttributable->hasAttribute(id); } + bool hasAttributes() const { return m_constAttributable->hasAttributes(); } + +protected: + + const Kernel::IAttributable* m_constAttributable; + Kernel::IAttributable* m_attributable = nullptr; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovd_base.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovd_base.h new file mode 100644 index 0000000..2f8301e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovd_base.h @@ -0,0 +1,44 @@ +#pragma once + +#include +#include +#include + +#include + +#include + +#include "ovd_defines.h" + +#include +#include +#include +#include + +#define MUTEX_NAME "openvibe_designer_mutex" +#define MESSAGE_NAME "openvibe_designer_message" + +#define G_CALLBACK2(x) G_CALLBACK_AUTOCAST(G_CALLBACK(x)) + +class G_CALLBACK_AUTOCAST +{ +public: + + typedef union + { + GCallback fp; + gpointer p; + } data_t; + + data_t m_Data; + + G_CALLBACK_AUTOCAST(const gpointer p) { m_Data.p = p; } + G_CALLBACK_AUTOCAST(const GCallback fp) { m_Data.fp = fp; } + + operator gpointer() const { return m_Data.p; } + operator GCallback() const { return m_Data.fp; } + +private: + + G_CALLBACK_AUTOCAST(); +}; diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovd_defines.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovd_defines.h new file mode 100644 index 0000000..f34134c --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovd_defines.h @@ -0,0 +1,115 @@ +#pragma once + +//Attributes of visualisation window : +#define OVD_AttributeId_VisualisationWindow_Width OpenViBE::CIdentifier(0x7B814CCA, 0x271DF6DD) +#define OVD_AttributeId_VisualisationWindow_Height OpenViBE::CIdentifier(0x4C90D4AD, 0x7A2554EC) + +//Attributes of visualisation paned : +#define OVD_AttributeId_VisualisationWidget_DividerPosition OpenViBE::CIdentifier(0x54E45F5B, 0x76C036E2) +#define OVD_AttributeId_VisualisationWidget_MaxDividerPosition OpenViBE::CIdentifier(0x237E56D2, 0x10CD68AE) + +#define OV_AttributeId_Box_Disabled OpenViBE::CIdentifier(0x341D3912, 0x1478DE86) + +namespace OpenViBE { +namespace Designer { +typedef enum +{ + CommandLineFlag_None = 0x00000000, + CommandLineFlag_Open = 0x00000001, + CommandLineFlag_Play = 0x00000002, + CommandLineFlag_PlayFast = 0x00000004, + CommandLineFlag_NoGui = 0x00000008, + CommandLineFlag_NoCheckColorDepth = 0x00000010, + CommandLineFlag_NoManageSession = 0x00000020, + CommandLineFlag_Define = 0x00000040, + CommandLineFlag_Config = 0x00000080, + CommandLineFlag_RandomSeed = 0x00000100, + CommandLineFlag_NoVisualization = 0x00000200 /** flag to hide visualisation widget */ +} ECommandLineFlag; + +enum class EContextMenu +{ + SelectionCopy, SelectionCut, SelectionPaste, SelectionDelete, + + BoxUpdate, BoxRemoveDeprecatedInterfacors, BoxRename, BoxDelete, + BoxAddInput, BoxEditInput, BoxRemoveInput, + BoxAddOutput, BoxEditOutput, BoxRemoveOutput, + + BoxConnectScenarioInput, BoxConnectScenarioOutput, + BoxDisconnectScenarioInput, BoxDisconnectScenarioOutput, + + BoxAddSetting, BoxRemoveSetting, BoxEditSetting, + BoxConfigure, BoxAbout, BoxEnable, BoxDisable, + + BoxAddMessageInput, BoxRemoveMessageInput, + BoxAddMessageOutput, BoxRemoveMessageOutput, + BoxEditMessageInput, BoxEditMessageOutput, + + BoxEditMetabox, + BoxDocumentation, + ScenarioAddComment, + ScenarioAbout +}; + +enum +{ + Resource_StringName, + Resource_StringShortDescription, + Resource_StringIdentifier, + Resource_StringStockIcon, + Resource_StringColor, + Resource_StringFont, + Resource_BooleanIsPlugin, + Resource_BooleanIsUnstable, + Resource_BackGroundColor, + Resource_BooleanIsGhost = 8001, + Resource_BooleanIsMensia = 8002 +}; + +enum +{ + Color_BackgroundPlayerStarted, + Color_BoxBackground, + Color_BoxBackgroundSelected, + Color_BoxBackgroundMissing, + Color_BoxBackgroundDisabled, + Color_BoxBackgroundDeprecated, + Color_BoxBackgroundUnstable, + Color_BoxBackgroundOutdated, + Color_BoxBackgroundMetabox, + Color_BoxBorder, + Color_BoxBorderSelected, + Color_BoxInputBackground, + Color_BoxInputBorder, + Color_BoxOutputBackground, + Color_BoxOutputBorder, + Color_BoxSettingBackground, + Color_BoxSettingBorder, + Color_CommentBackground, + Color_CommentBackgroundSelected, + Color_CommentBorder, + Color_CommentBorderSelected, + Color_Link, + Color_LinkSelected, + Color_LinkDownCast, + Color_LinkUpCast, + Color_LinkInvalid, + Color_SelectionArea, + Color_SelectionAreaBorder, +}; + +enum { Box_None, Box_Input, Box_Output, Box_Setting, Box_Link, Box_ScenarioInput, Box_ScenarioOutput, Box_Update }; + +enum { Mode_None, Mode_Selection, Mode_SelectionAdd, Mode_MoveScenario, Mode_MoveSelection, Mode_Connect, Mode_EditSettings }; +} // namespace Designer +} // namespace OpenViBE + +//___________________________________________________________________// +// // +// Global defines // +//___________________________________________________________________// +// // + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovd_main.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovd_main.cpp new file mode 100755 index 0000000..286acae --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/ovd_main.cpp @@ -0,0 +1,874 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include "ovd_base.h" + +#include "ovdCInterfacedObject.h" +#include "ovdCInterfacedScenario.h" +#include "ovdCApplication.h" + +#include "ovdAssert.h" +#if defined TARGET_OS_Windows +#include "Windows.h" +#include "shellapi.h" +#endif + +namespace OpenViBE { +namespace Designer { + +std::map gColors; + +class CPluginObjectDescEnum +{ +public: + + explicit CPluginObjectDescEnum(const Kernel::IKernelContext& ctx) : m_kernelCtx(ctx) { } + virtual ~CPluginObjectDescEnum() = default; + + virtual bool enumeratePluginObjectDesc() + { + CIdentifier id; + while ((id = m_kernelCtx.getPluginManager().getNextPluginObjectDescIdentifier(id)) != CIdentifier::undefined()) + { + this->callback(*m_kernelCtx.getPluginManager().getPluginObjectDesc(id)); + } + return true; + } + + virtual bool enumeratePluginObjectDesc(const CIdentifier& parentClassID) + { + CIdentifier id; + while ((id = m_kernelCtx.getPluginManager().getNextPluginObjectDescIdentifier(id, parentClassID)) != CIdentifier::undefined()) + { + this->callback(*m_kernelCtx.getPluginManager().getPluginObjectDesc(id)); + } + return true; + } + + virtual bool callback(const Plugins::IPluginObjectDesc& pod) = 0; + +protected: + + const Kernel::IKernelContext& m_kernelCtx; +}; + +// ------------------------------------------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------------------------------------------ + +class CPluginObjectDescCollector final : public CPluginObjectDescEnum +{ +public: + + explicit CPluginObjectDescCollector(const Kernel::IKernelContext& ctx) : CPluginObjectDescEnum(ctx) { } + + bool callback(const Plugins::IPluginObjectDesc& pod) override + { + const std::string name = std::string(pod.getCategory()) + "/" + std::string(pod.getName()); + const auto it = m_pods.find(name); + if (it != m_pods.end()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "Duplicate plugin object name " << name << " " + << it->second->getCreatedClass() << " and " << pod.getCreatedClass() << "\n"; + } + m_pods[name] = &pod; + return true; + } + + std::map& getPluginObjectDescMap() { return m_pods; } + +private: + + std::map m_pods; +}; + +// ------------------------------------------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------------------------------------------ + +class CPluginObjectDescLogger final : public CPluginObjectDescEnum +{ +public: + + explicit CPluginObjectDescLogger(const Kernel::IKernelContext& ctx) : CPluginObjectDescEnum(ctx) { } + + bool callback(const Plugins::IPluginObjectDesc& pod) override + { + // Outputs plugin info to console + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Plugin <" << pod.getName() << ">\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << " | Plugin category : " << pod.getCategory() << "\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << " | Class identifier : " << pod.getCreatedClass() << "\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << " | Author name : " << pod.getAuthorName() << "\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << " | Author company name : " << pod.getAuthorCompanyName() << "\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << " | Short description : " << pod.getShortDescription() << "\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << " | Detailed description : " << pod.getDetailedDescription() << "\n"; + + return true; + } +}; + +// ------------------------------------------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------------------------------------------ + +namespace { +typedef std::map> components_map_t; +// Parses a JSON encoded list of components with their versions +// We use an output variable because we want to be able to "enhance" an already existing list if necessary +void getVersionComponentsFromConfigToken(const Kernel::IKernelContext& ctx, const char* configToken, components_map_t& componentVersions) +{ + json::Object versionsObject; + // We use a lookup instead of expansion as JSON can contain { } characters + + const CString versionsJSON = ctx.getConfigurationManager().expand(CString("${") + configToken + "}"); + if (versionsJSON.length() != 0) + { + // This check is necessary because the asignemt operator would fail with an assert + if (json::Deserialize(versionsJSON.toASCIIString()).GetType() == json::ObjectVal) { versionsObject = json::Deserialize(versionsJSON.toASCIIString()); } + for (const auto& component : versionsObject) + { + int versionMajor, versionMinor, versionPatch; + sscanf(component.second, "%d.%d.%d", &versionMajor, &versionMinor, &versionPatch); + componentVersions[component.first] = std::make_tuple(versionMajor, versionMinor, versionPatch); + } + } +} +} // namespace + +static void InsertPluginObjectDescToGtkTreeStore(const Kernel::IKernelContext& ctx, std::map& pods, + GtkTreeStore* treeStore, std::vector& newBoxes, + std::vector& updatedBoxes, bool isNewVersion = false) +{ + typedef std::map> components_map_t; + components_map_t currentVersions; + getVersionComponentsFromConfigToken(ctx, "ProjectVersion_Components", currentVersions); + // By default, fix version to current version - to display the new/update boxes available since current version only + components_map_t lastUsedVersions = currentVersions; + getVersionComponentsFromConfigToken(ctx, "Designer_LastComponentVersionsUsed", lastUsedVersions); + + for (const auto& pod : pods) + { + const Plugins::IPluginObjectDesc* p = pod.second; + + CString stockItemName; + + const auto* desc = dynamic_cast(p); + if (desc != nullptr) { stockItemName = desc->getStockItemName(); } + + bool shouldShow = true; + + if (ctx.getPluginManager().isPluginObjectFlaggedAsDeprecated(p->getCreatedClass()) + && !ctx.getConfigurationManager().expandAsBoolean("${Designer_ShowDeprecated}", false)) { shouldShow = false; } + + /* + if (ctx.getPluginManager().isPluginObjectFlaggedAsUnstable(desc->getCreatedClass()) + && !ctx.getConfigurationManager().expandAsBoolean("${Designer_ShowUnstable}", false)) { shouldShow = false; } + */ + + if (shouldShow) + { + GtkStockItem stockItem; + if (gtk_stock_lookup(stockItemName, &stockItem) == 0) { stockItemName = GTK_STOCK_NEW; } + + // Splits the plugin category + std::vector categories; + std::string str = std::string(p->getCategory()); + size_t j, i = size_t(-1); + while ((j = str.find('/', i + 1)) != std::string::npos) + { + std::string subCategory = std::string(str, i + 1, j - i - 1); + if (subCategory != std::string("")) { categories.push_back(subCategory); } + i = j; + } + if (i + 1 != str.length()) { categories.emplace_back(str, i + 1, str.length() - i - 1); } + + // Fills plugin in the tree + GtkTreeIter iter1; + GtkTreeIter iter2; + GtkTreeIter* iterParent = nullptr; + GtkTreeIter* iterChild = &iter1; + for (const std::string& category : categories) + { + bool found = false; + bool valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(treeStore), iterChild, iterParent) != 0; + while (valid && !found) + { + gchar* name = nullptr; + gboolean isPlugin; + gtk_tree_model_get(GTK_TREE_MODEL(treeStore), iterChild, Resource_StringName, &name, Resource_BooleanIsPlugin, &isPlugin, -1); + if ((isPlugin == 0) && name == category) { found = true; } + else { valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(treeStore), iterChild) != 0; } + } + if (!found) + { + gtk_tree_store_append(GTK_TREE_STORE(treeStore), iterChild, iterParent); + gtk_tree_store_set(GTK_TREE_STORE(treeStore), iterChild, Resource_StringName, category.c_str(), + Resource_StringShortDescription, "", Resource_StringStockIcon, "gtk-directory", Resource_StringColor, "#000000", + Resource_StringFont, "", Resource_BooleanIsPlugin, gboolean(FALSE), -1); + } + if (iterParent == nullptr) { iterParent = &iter2; } + GtkTreeIter* iterSwap = iterChild; + iterChild = iterParent; + iterParent = iterSwap; + } + gtk_tree_store_append(GTK_TREE_STORE(treeStore), iterChild, iterParent); + + // define color of the text of the box + std::string textColor = "black"; + std::string bgColor = "white"; + std::string textFont; + str = p->getName().toASCIIString(); + + if (ctx.getPluginManager().isPluginObjectFlaggedAsDeprecated(p->getCreatedClass())) { textColor = "#3f7f7f"; } + + // If the software is launched for the first time after update, highlight new/updated boxes in tree-view + std::string boxSoftwareComponent = p->getSoftwareComponent().toASCIIString(); + + if (boxSoftwareComponent != "unknown") + { + int currentVMajor = std::get<0>(currentVersions[boxSoftwareComponent]); + int currentVMinor = std::get<1>(currentVersions[boxSoftwareComponent]); + int currentVPatch = std::get<2>(currentVersions[boxSoftwareComponent]); + int lastUsedVMajor = std::get<0>(lastUsedVersions[boxSoftwareComponent]); + int lastUsedVMinor = std::get<1>(lastUsedVersions[boxSoftwareComponent]); + int lastUsedVPatch = std::get<2>(lastUsedVersions[boxSoftwareComponent]); + int boxCompoVMajor = 0; + int boxCompoVMinor = 0; + int boxCompoVPatch = 0; + + sscanf(p->getAddedSoftwareVersion().toASCIIString(), "%d.%d.%d", &boxCompoVMajor, &boxCompoVMinor, &boxCompoVPatch); + // If this is a new version, then add in list all the updated/new boxes since last version opened + if (isNewVersion + && ((lastUsedVMajor < boxCompoVMajor && boxCompoVMajor <= currentVMajor) + || (boxCompoVMajor == currentVMajor && lastUsedVMinor < boxCompoVMinor && boxCompoVMinor <= currentVMinor) + || (boxCompoVMinor == currentVMinor && lastUsedVPatch < boxCompoVPatch && boxCompoVPatch <= currentVPatch) + // As default value for lastUsedVMinor and lastUsedVMajor are the current software version + || (boxCompoVMajor == currentVMajor && boxCompoVMinor == currentVMinor && boxCompoVPatch == currentVPatch))) + { + str += " (New)"; + bgColor = "#FFFFC4"; + newBoxes.push_back(p); + } + // Otherwise + else if (boxCompoVMajor == currentVMajor && boxCompoVMinor == currentVMinor && boxCompoVPatch == + currentVPatch) { newBoxes.push_back(p); } + else + { + int boxCompoUpdatedVMajor = 0; + int boxCompoUpdatedVMinor = 0; + int boxCompoUpdatedVPatch = 0; + sscanf(p->getUpdatedSoftwareVersion().toASCIIString(), "%d.%d.%d", &boxCompoUpdatedVMajor, + &boxCompoUpdatedVMinor, &boxCompoUpdatedVPatch); + // If this is a new version, then add in list all the updated/new boxes since last version opened + if (isNewVersion + && ((lastUsedVMajor < boxCompoUpdatedVMajor && boxCompoUpdatedVMajor <= currentVMajor) + || (boxCompoUpdatedVMajor == currentVMajor && lastUsedVMinor < boxCompoUpdatedVMinor && boxCompoUpdatedVMinor <= currentVMinor) + || (boxCompoUpdatedVMinor == currentVMinor && lastUsedVPatch < boxCompoUpdatedVPatch && boxCompoUpdatedVPatch <= currentVPatch) + // If this is a new version Designer, and last version opened was set to default value i.e. version of current software + || (boxCompoUpdatedVMajor == currentVMajor && boxCompoUpdatedVMinor == currentVMinor && boxCompoUpdatedVPatch == currentVPatch))) + { + str += " (New)"; + bgColor = "#FFFFC4"; + updatedBoxes.push_back(p); + } + // Otherwise + else if (!isNewVersion && (boxCompoUpdatedVMajor == currentVMajor && boxCompoUpdatedVMinor == currentVMinor + && boxCompoUpdatedVPatch == currentVPatch)) { updatedBoxes.push_back(p); } + } + } + + // Construct a string containing the BoxAlgorithmIdentifier concatenated with a metabox identifier if necessary + std::string boxAlgorithmDesc = p->getCreatedClass().str(); + + if (p->getCreatedClass() == OVP_ClassId_BoxAlgorithm_Metabox) + { + boxAlgorithmDesc += dynamic_cast(p)->getMetaboxDescriptor(); + textColor = "#007020"; + } + + gtk_tree_store_set(GTK_TREE_STORE(treeStore), iterChild, Resource_StringName, str.c_str(), + Resource_StringShortDescription, static_cast(p->getShortDescription()), + Resource_StringIdentifier, static_cast(boxAlgorithmDesc.c_str()), + Resource_StringStockIcon, static_cast(stockItemName), Resource_StringColor, textColor.c_str(), + Resource_StringFont, textFont.c_str(), Resource_BooleanIsPlugin, gboolean(TRUE), + Resource_BackGroundColor, static_cast(bgColor.c_str()), -1); + } + } +} + +// ------------------------------------------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------------------------------------------ + +typedef struct SConfig +{ + SConfig() = default; + + ECommandLineFlag getFlags() const { return ECommandLineFlag(noGui | noCheckColorDepth | noManageSession | noVisualization | define | randomSeed | config); } + + std::vector> flags; + ECommandLineFlag noGui = CommandLineFlag_None; + ECommandLineFlag noCheckColorDepth = CommandLineFlag_None; + ECommandLineFlag noManageSession = CommandLineFlag_None; + ECommandLineFlag noVisualization = CommandLineFlag_None; + ECommandLineFlag define = CommandLineFlag_None; + ECommandLineFlag randomSeed = CommandLineFlag_None; + ECommandLineFlag config = CommandLineFlag_None; + bool help = false; + // to resolve warning: padding struct 'SConfig' with 4 bytes to align 'tokens + int structPadding = 0; + std::map tokens; +} config_t; + +static char backslash_to_slash(const char c) { return c == '\\' ? '/' : c; } + +/** ------------------------------------------------------------------------------------------------------------------------------------ +* Use Mutex to ensure that only one instance with GUI of Designer runs at the same time +* if another instance exists, sends a message to it so that it opens a scenario or get the focus back +* \param config: play, play-fast or open +* \param logMgr: name of the scenario to open +------------------------------------------------------------------------------------------------------------------------------------**/ +#if defined NDEBUG +static bool ensureOneInstanceOfDesigner(config_t& config, Kernel::ILogManager& logMgr) +{ + try + { + // If the mutex cannot be opened, it's the first instance of Designer, go to catch + boost::interprocess::named_mutex mutex(boost::interprocess::open_only, MUTEX_NAME); + + // If the mutex was opened, then an instance of designer is already running, we send it a message before dying + // The message contains the command to send: sMode: open, play, play-fast a scenario, sScenarioPath: path of the scenario + boost::interprocess::scoped_lock lock(mutex); + std::string msg; + if (config.flags.empty()) { msg = std::to_string(int(CommandLineFlag_None)) + ": ;"; } + + for (auto& flag : config.flags) + { + std::string fileName = flag.second; + std::transform(fileName.begin(), fileName.end(), fileName.begin(), backslash_to_slash); + + msg += std::to_string(int(flag.first)) + ": <" + fileName + "> ; "; + } + + const size_t msgSize = strlen(msg.c_str()) * sizeof(char); + + boost::interprocess::message_queue messageToFirstInstance(boost::interprocess::open_or_create, MESSAGE_NAME, msgSize, msgSize); + messageToFirstInstance.send(msg.c_str(), msgSize, 0); + + return false; + } + catch (boost::interprocess::interprocess_exception&) + { + //Create the named mutex to catch the potential next instance of Designer that could open + boost::interprocess::named_mutex mutex(boost::interprocess::create_only, MUTEX_NAME); + return true; + } +} +#else +static bool ensureOneInstanceOfDesigner(config_t& /*config*/, Kernel::ILogManager& /*logMgr*/) { return true; } +#endif + +bool parse_arguments(int argc, char** argv, config_t& config) +{ + config_t tmp; + + std::vector args; +#if defined TARGET_OS_Windows + int nArg; + LPWSTR* argListUtf16 = CommandLineToArgvW(GetCommandLineW(), &nArg); + for (int i = 1; i < nArg; ++i) + { + GError* error = nullptr; + glong itemsRead, itemsWritten; + char* argUtf8 = g_utf16_to_utf8(reinterpret_cast(argListUtf16[i]), glong(wcslen(argListUtf16[i])), &itemsRead, &itemsWritten, &error); + args.emplace_back(argUtf8); + if (error != nullptr) + { + g_error_free(error); + return false; + } + } +#else + args = std::vector(argv + 1, argv + argc); +#endif + args.emplace_back(""); + + for (auto it = args.cbegin(); it != args.cend(); ++it) + { + if (*it == "") {} + else if (*it == "-h" || *it == "--help") + { + tmp.help = true; + config = tmp; + return false; + } + else if (*it == "-o" || *it == "--open") { tmp.flags.emplace_back(CommandLineFlag_Open, *++it); } + else if (*it == "-p" || *it == "--play") { tmp.flags.emplace_back(CommandLineFlag_Play, *++it); } + else if (*it == "-pf" || *it == "--play-fast") { tmp.flags.emplace_back(CommandLineFlag_PlayFast, *++it); } + else if (*it == "--no-gui") + { + tmp.noGui = CommandLineFlag_NoGui; + tmp.noCheckColorDepth = CommandLineFlag_NoCheckColorDepth; + tmp.noManageSession = CommandLineFlag_NoManageSession; + } + else if (*it == "--no-visualization") { tmp.noVisualization = CommandLineFlag_NoVisualization; } + else if (*it == "--invisible") + { + // no-gui + no-visualization + tmp.noVisualization = CommandLineFlag_NoVisualization; + tmp.noGui = CommandLineFlag_NoGui; + tmp.noCheckColorDepth = CommandLineFlag_NoCheckColorDepth; + tmp.noManageSession = CommandLineFlag_NoManageSession; + } + else if (*it == "--no-check-color-depth") { tmp.noCheckColorDepth = CommandLineFlag_NoCheckColorDepth; } + else if (*it == "--no-session-management") { tmp.noManageSession = CommandLineFlag_NoManageSession; } + else if (*it == "-c" || *it == "--config") + { + if (*++it == "") + { + std::cout << "Error: Switch --config needs an argument\n"; + return false; + } + tmp.flags.emplace_back(CommandLineFlag_Config, *it); + } + else if (*it == "-d" || *it == "--define") + { + if (*++it == "") + { + std::cout << "Error: Need two arguments after -d / --define.\n"; + return false; + } + + // Were not using = as a separator for token/value, as on Windows its a problem passing = to the cmd interpreter + // which is used to launch the actual designer exe. + const std::string& token = *it; + if (*++it == "") + { + std::cout << "Error: Need two arguments after -d / --define.\n"; + return false; + } + + const std::string& value = *it; // iterator will increment later + + tmp.tokens[token] = value; + } + else if (*it == "--random-seed") + { + if (*++it == "") + { + std::cout << "Error: Switch --random-seed needs an argument\n"; + return false; + } + tmp.flags.emplace_back(CommandLineFlag_RandomSeed, *it); + } + else if (*it == "--g-fatal-warnings") + { + // Do nothing here but accept this gtk flag + } + else + { +#if 0 + // Assumes we just open a scenario - this is for retro compatibility and should not be supported in the future + config.flags.push_back(std::make_pair(CommandLineFlag_Open, *++it)); +#endif + return false; + } + } + +#if 0 + config.flags = config.flags; + config.checkColorDepth = config.m_bCheckColorDepth; + config.showGui = config.m_bShowGui; +#else + config = tmp; +#endif + return true; +} + + +#if defined OPENVIBE_SPLASHSCREEN + +gboolean cb_remove_splashscreen(gpointer data) +{ + gtk_widget_hide(GTK_WIDGET(data)); + return false; +} +#endif + + +// ------------------------------------------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------------------------------------------ + +void message(const char* title, const char* msg, const GtkMessageType type) +{ + GtkWidget* dialog = gtk_message_dialog_new(nullptr, GtkDialogFlags(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT), type, GTK_BUTTONS_OK, "%s", title); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), "%s", msg); + ::gtk_window_set_icon_from_file(GTK_WINDOW(dialog), (Directories::getDataDir() + CString("/applications/designer/designer.ico")).toASCIIString(), + nullptr); + gtk_window_set_title(GTK_WINDOW(dialog), title); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); +} + +void user_info(char** argv, Kernel::ILogManager* logManager) +{ + const std::vector messages = + { + "Syntax : " + std::string(argv[0]) + " [ switches ]\n", + "Possible switches :\n", + " --help : displays this help message and exits\n", + " --config filename : path to config file\n", + " --define token value : specify configuration token with a given value\n", + " --open filename : opens a scenario (see also --no-session-management)\n", + " --play filename : plays the opened scenario (see also --no-session-management)\n", + " --play-fast filename : plays fast forward the opened scenario (see also --no-session-management)\n", + " --no-gui : hides the " DESIGNER_NAME " graphical user interface (assumes --no-color-depth-test)\n", + " --no-visualization : hides the visualisation widgets\n", + " --invisible : hides the designer and the visualisation widgets (assumes --no-check-color-depth and --no-session-management)\n", + " --no-check-color-depth : does not check 24/32 bits color depth\n", + " --no-session-management : neither restore last used scenarios nor saves them at exit\n", + " --random-seed uint : initialize random number generator with value, default=time(nullptr)\n" + }; + + if (logManager != nullptr) { for (const auto& m : messages) { (*logManager) << Kernel::LogLevel_Info << m; } } + else { for (const auto& m : messages) { std::cout << m; } } +} + +int go(int argc, char** argv) +{ + bool errorWhileLoadingScenario = false, playRequested = false; + /* + { 0, 0, 0, 0 }, + { 0, 16383, 16383, 16383 }, + { 0, 32767, 32767, 32767 }, + { 0, 49151, 49151, 49151 }, + { 0, 65535, 65535, 65535 }, + */ +#define GDK_COLOR_SET(c, r, g, b) { (c).pixel=0; (c).red=r; (c).green=g; (c).blue=b; } + GDK_COLOR_SET(gColors[Color_BackgroundPlayerStarted], 32767, 32767, 32767); + GDK_COLOR_SET(gColors[Color_BoxBackgroundSelected], 65535, 65535, 49151); + GDK_COLOR_SET(gColors[Color_BoxBackgroundMissing], 49151, 32767, 32767); + GDK_COLOR_SET(gColors[Color_BoxBackgroundDisabled], 46767, 46767, 59151); + GDK_COLOR_SET(gColors[Color_BoxBackgroundDeprecated], 65535, 50000, 32767); + GDK_COLOR_SET(gColors[Color_BoxBackgroundOutdated], 57343, 57343, 57343); + GDK_COLOR_SET(gColors[Color_BoxBackgroundMetabox], 58343, 65535, 62343); + GDK_COLOR_SET(gColors[Color_BoxBackgroundUnstable], 49151, 49151, 49151); + GDK_COLOR_SET(gColors[Color_BoxBackground], 65535, 65535, 65535); + GDK_COLOR_SET(gColors[Color_BoxBorderSelected], 0, 0, 0); + GDK_COLOR_SET(gColors[Color_BoxBorder], 0, 0, 0); + GDK_COLOR_SET(gColors[Color_BoxInputBackground], 65535, 49151, 32767); + GDK_COLOR_SET(gColors[Color_BoxInputBorder], 16383, 16383, 16383); + GDK_COLOR_SET(gColors[Color_BoxOutputBackground], 32767, 65535, 49151); + GDK_COLOR_SET(gColors[Color_BoxOutputBorder], 16383, 16383, 16383); + GDK_COLOR_SET(gColors[Color_BoxSettingBackground], 49151, 32767, 65535); + GDK_COLOR_SET(gColors[Color_BoxSettingBorder], 16383, 16383, 16383); + + GDK_COLOR_SET(gColors[Color_CommentBackground], 65535, 65535, 57343); + GDK_COLOR_SET(gColors[Color_CommentBackgroundSelected], 65535, 65535, 49151); + GDK_COLOR_SET(gColors[Color_CommentBorder], 32767, 32767, 32767); + GDK_COLOR_SET(gColors[Color_CommentBorderSelected], 32767, 32767, 32767); + + GDK_COLOR_SET(gColors[Color_Link], 0, 0, 0); + GDK_COLOR_SET(gColors[Color_LinkSelected], 49151, 49151, 16383); + GDK_COLOR_SET(gColors[Color_LinkUpCast], 32767, 16383, 16383); + GDK_COLOR_SET(gColors[Color_LinkDownCast], 16383, 32767, 16383); + GDK_COLOR_SET(gColors[Color_LinkInvalid], 49151, 16383, 16383); + GDK_COLOR_SET(gColors[Color_SelectionArea], 0x3f00, 0x3f00, 0x3f00); + GDK_COLOR_SET(gColors[Color_SelectionAreaBorder], 0, 0, 0); +#undef GDK_COLOR_SET + //___________________________________________________________________// + // // + + config_t config; + bool bArgParseResult = parse_arguments(argc, argv, config); + if (!bArgParseResult) + { + if (config.help) + { + user_info(argv, nullptr); + return 0; + } + } + + CKernelLoader loader; + + std::cout << "[ INF ] Created kernel loader, trying to load kernel module" << "\n"; + CString errorMsg; +#if defined TARGET_OS_Windows + CString file = Directories::getLibDir() + "/openvibe-kernel.dll"; +#elif defined TARGET_OS_Linux + CString file = Directories::getLibDir() + "/libopenvibe-kernel.so"; +#elif defined TARGET_OS_MacOS + CString file = Directories::getLibDir() + "/libopenvibe-kernel.dylib"; +#endif + if (!loader.load(file, &errorMsg)) { std::cout << "[ FAILED ] Error loading kernel (" << errorMsg << ")" << " from [" << file << "]\n"; } + else + { + std::cout << "[ INF ] Kernel module loaded, trying to get kernel descriptor" << "\n"; + Kernel::IKernelDesc* desc = nullptr; + Kernel::IKernelContext* context = nullptr; + loader.initialize(); + loader.getKernelDesc(desc); + if (desc == nullptr) { std::cout << "[ FAILED ] No kernel descriptor" << "\n"; } + else + { + std::cout << "[ INF ] Got kernel descriptor, trying to create kernel" << "\n"; + + context = desc->createKernel("designer", Directories::getDataDir() + "/kernel/openvibe.conf"); + context->initialize(); + context->getConfigurationManager().addConfigurationFromFile(Directories::getDataDir() + "/applications/designer/designer.conf"); + CString appConfigFile = context->getConfigurationManager().expand("${Designer_CustomConfigurationFile}"); + context->getConfigurationManager().addConfigurationFromFile(appConfigFile); + // add other configuration file if --config option + auto it = config.flags.begin(); + + // initialize random number generator with nullptr by default + System::Math::initializeRandomMachine(time(nullptr)); + + while (it != config.flags.end()) + { + if (it->first == CommandLineFlag_Config) + { + appConfigFile = CString(it->second.c_str()); + context->getConfigurationManager().addConfigurationFromFile(appConfigFile); + } + else if (it->first == CommandLineFlag_RandomSeed) + { + const size_t seed = size_t(strtol(it->second.c_str(), nullptr, 10)); + System::Math::initializeRandomMachine(seed); + } + ++it; + } + + + if (context == nullptr) { std::cout << "[ FAILED ] No kernel created by kernel descriptor" << "\n"; } + else + { + Toolkit::initialize(*context); + VisualizationToolkit::initialize(*context); + + //initialise Gtk before 3D context + gtk_init(&argc, &argv); + // gtk_rc_parse(Directories::getDataDir() + "/applications/designer/interface.gtkrc"); + + +#if defined OPENVIBE_SPLASHSCREEN + GtkWidget* splashScreenWindow = gtk_window_new(GTK_WINDOW_POPUP); + gtk_window_set_position(GTK_WINDOW(splashScreenWindow), GTK_WIN_POS_CENTER); + gtk_window_set_type_hint(GTK_WINDOW(splashScreenWindow), GDK_WINDOW_TYPE_HINT_SPLASHSCREEN); + gtk_window_set_default_size(GTK_WINDOW(splashScreenWindow), 600, 400); + GtkWidget* splashScreenImage = gtk_image_new_from_file(Directories::getDataDir() + "/applications/designer/splashscreen.png"); + gtk_container_add(GTK_CONTAINER(splashScreenWindow), (splashScreenImage)); + gtk_widget_show(splashScreenImage); + gtk_widget_show(splashScreenWindow); + g_timeout_add(500, cb_remove_splashscreen, splashScreenWindow); + + while (gtk_events_pending()) { gtk_main_iteration(); } +#endif + + Kernel::IConfigurationManager& configMgr = context->getConfigurationManager(); + Kernel::ILogManager& logMgr = context->getLogManager(); + + bArgParseResult = parse_arguments(argc, argv, config); + + context->getPluginManager().addPluginsFromFiles(configMgr.expand("${Kernel_Plugins}")); + + //FIXME : set locale only when needed + CString locale = configMgr.expand("${Designer_Locale}"); + if (locale == CString("")) { locale = "C"; } + setlocale(LC_ALL, locale.toASCIIString()); + + if (!(bArgParseResult || config.help)) { user_info(argv, &logMgr); } + else + { + if ((!configMgr.expandAsBoolean("${Kernel_WithGUI}", true)) && ((config.getFlags() & CommandLineFlag_NoGui) == 0)) + { + logMgr << Kernel::LogLevel_ImportantWarning << + "${Kernel_WithGUI} is set to false and --no-gui flag not set. Forcing the --no-gui flag\n"; + config.noGui = CommandLineFlag_NoGui; + config.noCheckColorDepth = CommandLineFlag_NoCheckColorDepth; + config.noManageSession = CommandLineFlag_NoManageSession; + } + + if (config.noGui != CommandLineFlag_NoGui && !ensureOneInstanceOfDesigner(config, logMgr)) + { + logMgr << Kernel::LogLevel_Trace << "An instance of Designer is already running.\n"; + return 0; + } + + { + CApplication app(*context); + app.initialize(config.getFlags()); + + // FIXME is it necessary to keep next line uncomment ? + //bool isScreenValid=true; + if (config.noCheckColorDepth == 0) + { + if (GDK_IS_DRAWABLE(GTK_WIDGET(app.m_MainWindow)->window)) + { + // FIXME is it necessary to keep next line uncomment ? + //isScreenValid=false; + switch (gdk_drawable_get_depth(GTK_WIDGET(app.m_MainWindow)->window)) + { + case 24: + case 32: + // FIXME is it necessary to keep next line uncomment ? + //isScreenValid=true; + break; + default: + logMgr << Kernel::LogLevel_Error << "Please change the color depth of your screen to either 24 or 32 bits\n"; + // TODO find a way to break + break; + } + } + } + + // Add or replace a configuration token if required in command line + for (const auto& t : config.tokens) + { + logMgr << Kernel::LogLevel_Trace << "Adding command line configuration token [" << t.first << " = " << t.second << "]\n"; + configMgr.addOrReplaceConfigurationToken(t.first.c_str(), t.second.c_str()); + } + + for (const auto& f : config.flags) + { + std::string fileName = f.second; + std::transform(fileName.begin(), fileName.end(), fileName.begin(), backslash_to_slash); + bool error; + switch (f.first) + { + case CommandLineFlag_Open: + logMgr << Kernel::LogLevel_Info << "Opening scenario [" << fileName << "]\n"; + if (!app.openScenario(fileName.c_str())) + { + logMgr << Kernel::LogLevel_Error << "Could not open scenario " << fileName << "\n"; + errorWhileLoadingScenario = config.noGui == CommandLineFlag_NoGui; + } + break; + case CommandLineFlag_Play: + logMgr << Kernel::LogLevel_Info << "Opening and playing scenario [" << fileName << "]\n"; + error = !app.openScenario(fileName.c_str()); + if (!error) + { + app.playScenarioCB(); + error = app.getCurrentInterfacedScenario()->m_PlayerStatus != Kernel::EPlayerStatus::Play; + } + if (error) + { + logMgr << Kernel::LogLevel_Error << "Scenario open or load error with --play.\n"; + errorWhileLoadingScenario = config.noGui == CommandLineFlag_NoGui; + } + break; + case CommandLineFlag_PlayFast: + logMgr << Kernel::LogLevel_Info << "Opening and fast playing scenario [" << fileName << "]\n"; + error = !app.openScenario(fileName.c_str()); + if (!error) + { + app.forwardScenarioCB(); + error = app.getCurrentInterfacedScenario()->m_PlayerStatus != Kernel::EPlayerStatus::Forward; + } + if (error) + { + logMgr << Kernel::LogLevel_Error << "Scenario open or load error with --play-fast.\n"; + errorWhileLoadingScenario = config.noGui == CommandLineFlag_NoGui; + } + playRequested = true; + break; + //case CommandLineFlag_Define: + //break; + default: + break; + } + } + + if (!playRequested && config.noGui == CommandLineFlag_NoGui) + { + logMgr << Kernel::LogLevel_Info + << "Switch --no-gui is enabled but no play operation was requested. Designer will exit automatically.\n"; + } + + if (app.m_Scenarios.empty() && config.noGui != CommandLineFlag_NoGui) { app.newScenarioCB(); } + + if (!app.m_Scenarios.empty()) + { + CPluginObjectDescCollector cbCollector1(*context); + CPluginObjectDescCollector cbCollector2(*context); + CPluginObjectDescLogger cbLogger(*context); + cbLogger.enumeratePluginObjectDesc(); + cbCollector1.enumeratePluginObjectDesc(OV_ClassId_Plugins_BoxAlgorithmDesc); + cbCollector2.enumeratePluginObjectDesc(OV_ClassId_Plugins_AlgorithmDesc); + InsertPluginObjectDescToGtkTreeStore(*context, cbCollector1.getPluginObjectDescMap(), app.m_BoxAlgorithmTreeModel, app.m_NewBoxes, + app.m_UpdatedBoxes, app.m_IsNewVersion); + InsertPluginObjectDescToGtkTreeStore(*context, cbCollector2.getPluginObjectDescMap(), app.m_AlgorithmTreeModel, app.m_NewBoxes, + app.m_UpdatedBoxes); + + std::map metaboxDescMap; + CIdentifier id; + while ((id = context->getMetaboxManager().getNextMetaboxObjectDescIdentifier(id)) != CIdentifier::undefined() + ) { metaboxDescMap[id.str()] = context->getMetaboxManager().getMetaboxObjectDesc(id); } + InsertPluginObjectDescToGtkTreeStore(*context, metaboxDescMap, app.m_BoxAlgorithmTreeModel, app.m_NewBoxes, app.m_UpdatedBoxes, + app.m_IsNewVersion); + + context->getLogManager() << Kernel::LogLevel_Info << "Initialization took " + << context->getConfigurationManager().expand("$Core{real-time}") << " ms\n"; + // If the application is a newly launched version, and not launched without GUI -> display changelog + if (app.m_IsNewVersion && config.noGui != CommandLineFlag_NoGui) { app.displayChangelogWhenAvailable(); } + try { gtk_main(); } + catch (DesignerException& ex) + { + std::cerr << "Caught designer exception" << std::endl; + GtkWidget* errorDialog = gtk_message_dialog_new(nullptr, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, + "%s", ex.getErrorString().c_str()); + gtk_window_set_title(GTK_WINDOW(errorDialog), (std::string(BRAND_NAME) + " has stopped functioning").c_str()); + gtk_dialog_run(GTK_DIALOG(errorDialog)); + } + catch (...) { std::cerr << "Caught top level exception" << std::endl; } + } + } + } + + logMgr << Kernel::LogLevel_Info << "Application terminated, releasing allocated objects\n"; + + VisualizationToolkit::uninitialize(*context); + Toolkit::uninitialize(*context); + + desc->releaseKernel(context); + + // Remove the mutex only if the application was run with a gui + if (config.noGui != CommandLineFlag_NoGui) { boost::interprocess::named_mutex::remove(MUTEX_NAME); } + } + } + loader.uninitialize(); + loader.unload(); + } + return errorWhileLoadingScenario ? -1 : 0; +} + +} // namespace Designer +} // namespace OpenViBE + +int main(const int argc, char** argv) +{ + // Remove mutex at startup, as the main loop regenerates frequently this mutex, + // if another instance is running, it should have the time to regenerate it + // Avoids that after crashing, a mutex stays blocking + boost::interprocess::named_mutex::remove(MUTEX_NAME); + try { OpenViBE::Designer::go(argc, argv); } + catch (...) { std::cout << "Caught an exception at the very top...\nLeaving application!\n"; } + //return go(argc, argv); +} + +#if defined TARGET_OS_Windows +// Should be used once we get rid of the .cmd launchers +int WINAPI WinMain(HINSTANCE /*instance*/, HINSTANCE /*prevInstance*/, LPSTR /*cmdLine*/, int /*windowStyle*/) { return main(__argc, __argv); } +#endif //defined TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationManager.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationManager.cpp new file mode 100644 index 0000000..5d56415 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationManager.cpp @@ -0,0 +1,77 @@ +#include "ovdCVisualizationTree.h" +#include "ovdCVisualizationManager.h" + +#if defined TARGET_OS_Windows +#include +#elif defined TARGET_OS_Linux +#include +#elif defined TARGET_OS_MacOS +#define Cursor XCursor +#include +#undef Cursor +#else +#endif + + +namespace OpenViBE { +namespace Designer { + +using IVTTree = VisualizationToolkit::IVisualizationTree; + +bool CVisualizationManager::createVisualizationTree(CIdentifier& treeID) +{ + IVTTree* newTree = new CVisualizationTree(m_kernelCtx); + treeID = getUnusedIdentifier(); + m_trees[treeID] = newTree; + return true; +} + +bool CVisualizationManager::releaseVisualizationTree(const CIdentifier& treeID) +{ + auto it = m_trees.find(treeID); + if (it != m_trees.end()) + { + delete it->second; + m_trees.erase(it); + return true; + } + + return false; +} + +IVTTree& CVisualizationManager::getVisualizationTree(const CIdentifier& id) +{ + const auto it = m_trees.find(id); + if (it == m_trees.end()) { m_kernelCtx.getLogManager() << Kernel::LogLevel_Fatal << "Visualization Tree " << id << " does not exist !\n"; } + return *it->second; +} + +bool CVisualizationManager::setToolbar(const CIdentifier& treeID, const CIdentifier& boxID, GtkWidget* toolbar) +{ + IVTTree& tree = getVisualizationTree(treeID); + tree.setToolbar(boxID, toolbar); + return true; +} + +bool CVisualizationManager::setWidget(const CIdentifier& treeID, const CIdentifier& boxID, GtkWidget* topmostWidget) +{ + IVTTree& tree = getVisualizationTree(treeID); + tree.setWidget(boxID, topmostWidget); + return true; +} + +CIdentifier CVisualizationManager::getUnusedIdentifier() const +{ + uint64_t id = CIdentifier::random().id(); + CIdentifier res; + std::map::const_iterator it; + do + { + res = CIdentifier(id++); + it = m_trees.find(res); + } while (it != m_trees.end() || res == CIdentifier::undefined()); + return res; +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationManager.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationManager.h new file mode 100644 index 0000000..f42ebf5 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationManager.h @@ -0,0 +1,36 @@ +#pragma once + +#include +#include + +#include +#include + +typedef struct _GtkWidget GtkWidget; + +namespace OpenViBE { +namespace Designer { +class CVisualizationManager final : public VisualizationToolkit::IVisualizationManager +{ +public: + + explicit CVisualizationManager(const Kernel::IKernelContext& ctx) : m_kernelCtx(ctx) {} + ~CVisualizationManager() override = default; + + bool createVisualizationTree(CIdentifier& treeID) override; + bool releaseVisualizationTree(const CIdentifier& treeID) override; + VisualizationToolkit::IVisualizationTree& getVisualizationTree(const CIdentifier& id) override; + + bool setToolbar(const CIdentifier& treeID, const CIdentifier& boxID, GtkWidget* toolbar) override; + bool setWidget(const CIdentifier& treeID, const CIdentifier& boxID, GtkWidget* topmostWidget) override; + +private: + + CIdentifier getUnusedIdentifier() const; + + /// Map of visualization trees (one per scenario, storing visualization widgets arrangement in space) + std::map m_trees; + const Kernel::IKernelContext& m_kernelCtx; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationTree.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationTree.cpp new file mode 100644 index 0000000..cedb21e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationTree.cpp @@ -0,0 +1,930 @@ +#include +#include +#include +#include + +#include "ovdCVisualizationTree.h" +#include "ovdCVisualizationWidget.h" +#include "../ovdAssert.h" + +namespace OpenViBE { +namespace Designer { + +using EVTColumn = VisualizationToolkit::EVisualizationTreeColumn; +using EVTNode = VisualizationToolkit::EVisualizationTreeNode; +using EVTWidget = VisualizationToolkit::EVisualizationWidget; +using IVTWidget = VisualizationToolkit::IVisualizationWidget; +using IVTTree = VisualizationToolkit::IVisualizationTree; + +namespace { +template +struct STestTrue +{ + bool operator()(typename std::map::const_iterator /*it*/) const { return true; } +}; + +struct STestEqVisualizationWidgetType +{ + STestEqVisualizationWidgetType(const EVTWidget widgetType) : type(widgetType) { } + + bool operator()(const std::map::const_iterator& it) const { return it->second->getType() == type; } + + EVTWidget type; +}; + +template +bool getNextID(const std::map& ids, CIdentifier& id, const TTest& test) +{ + typename std::map::const_iterator it; + + if (id == CIdentifier::undefined()) { it = ids.begin(); } + else + { + it = ids.find(id); + if (it == ids.end()) + { + id = CIdentifier::undefined(); + return false; + } + ++it; + } + + while (it != ids.end()) + { + if (test(it)) + { + id = it->first; + return true; + } + ++it; + } + + return false; +} +} // namespace + +CVisualizationTree::~CVisualizationTree() +{ + for (auto& widget : m_widgets) { delete widget.second; } + g_object_unref(m_treeStore); +} + +bool CVisualizationTree::init(const Kernel::IScenario* scenario) +{ + m_scenario = scenario; + //create tree store + m_treeStore = gtk_tree_store_new(5, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_ULONG, G_TYPE_STRING, G_TYPE_POINTER); + return true; +} + +bool CVisualizationTree::getNextVisualizationWidgetIdentifier(CIdentifier& id) const +{ + return getNextID>(m_widgets, id, STestTrue()); +} + +bool CVisualizationTree::getNextVisualizationWidgetIdentifier(CIdentifier& id, const EVTWidget type) const +{ + return getNextID(m_widgets, id, STestEqVisualizationWidgetType(type)); +} + +bool CVisualizationTree::isVisualizationWidget(const CIdentifier& id) const { return m_widgets.find(id) != m_widgets.end(); } + +IVTWidget* CVisualizationTree::getVisualizationWidget(const CIdentifier& id) const +{ + const auto it = m_widgets.find(id); + if (it == m_widgets.end()) { return nullptr; } + return it->second; +} + +IVTWidget* CVisualizationTree::getVisualizationWidgetFromBoxIdentifier(const CIdentifier& boxID) const +{ + for (auto& widget : m_widgets) { if (widget.second->getBoxIdentifier() == boxID) { return widget.second; } } + return nullptr; +} + +bool CVisualizationTree::addVisualizationWidget(CIdentifier& id, const CString& name, const EVTWidget type, const CIdentifier& parentID, + const size_t parentIdx, const CIdentifier& boxID, const size_t nChild, const CIdentifier& suggestedID) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "Adding new visualization widget\n"; + + //create new widget + IVTWidget* widget = new CVisualizationWidget(m_kernelCtx); + id = getUnusedIdentifier(suggestedID); + + if (!widget->initialize(id, name, type, parentID, boxID, nChild)) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to add new visualization widget (couldn't initialize it)\n"; + delete widget; + return false; + } + + // assign a parent to it + if (parentID != CIdentifier::undefined()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "Parenting visualization widget\n"; + IVTWidget* parentWidget = getVisualizationWidget(parentID); + + if (parentWidget != nullptr) + { + if (parentWidget->getType() == EVTWidget::Window) + { + //extend number of children of parent window if necessary + if (parentWidget->getNbChildren() <= parentIdx) + { + for (size_t i = parentWidget->getNbChildren(); i <= parentIdx; ++i) { parentWidget->addChild(CIdentifier::undefined()); } + } + } + + if (!parentWidget->setChildIdentifier(parentIdx, id)) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << + "Failed to add new visualization widget (couldn't set child identifier in parent window)\n"; + return false; + } + } + else + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to add new visualization widget (couldn't find parent)\n"; + return false; + } + } + + //add it to widgets map + m_widgets[id] = widget; + return true; +} + +bool CVisualizationTree::getVisualizationWidgetIndex(const CIdentifier& id, size_t& index) const +{ + IVTWidget* visualizationWidget = getVisualizationWidget(id); + if (!visualizationWidget) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to get widget.\n"; + return false; + } + + const CIdentifier& parentIdentifier = visualizationWidget->getParentIdentifier(); + if (parentIdentifier == CIdentifier::undefined()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to get parent identifier widget\n"; + return false; + } + + IVTWidget* parentVisualizationWidget = getVisualizationWidget(parentIdentifier); + if (!parentVisualizationWidget) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to unparent visualization widget (couldn't find parent)\n"; + return false; + } + + parentVisualizationWidget->getChildIndex(id, index); + + return true; +} + +bool CVisualizationTree::destroyHierarchy(const CIdentifier& id, const bool destroyVisualizationBoxes) +{ + bool res = true; + + IVTWidget* visualizationWidget = getVisualizationWidget(id); + + //is hierarchy top item a window? + if (visualizationWidget->getType() == EVTWidget::Window) + { + CIdentifier childIdentifier; + for (size_t i = 0; i < visualizationWidget->getNbChildren(); ++i) + { + visualizationWidget->getChildIdentifier(i, childIdentifier); + res &= destroyHierarchyR(childIdentifier, destroyVisualizationBoxes); + } + + //delete this window in kernel factory and erase its slot in map + delete visualizationWidget; + const auto it = m_widgets.find(id); + m_widgets.erase(it); + } + else //top item is a widget + { + size_t index; + unparentVisualizationWidget(id, index); + destroyHierarchyR(id, destroyVisualizationBoxes); + } + + return res; +} + +bool CVisualizationTree::destroyHierarchyR(const CIdentifier& id, const bool destroy) +{ + IVTWidget* widget = getVisualizationWidget(id); + if (!widget) { return false; } + + //remove children + CIdentifier childID; + const size_t nChildren = widget->getNbChildren(); + for (size_t i = 0; i < nChildren; ++i) + { + widget->getChildIdentifier(i, childID); + destroyHierarchyR(childID, destroy); + } + + //if parent widget is a window, remove this widget from it + if (widget->getType() == EVTWidget::Panel) + { + IVTWidget* window = getVisualizationWidget(widget->getParentIdentifier()); + if (window != nullptr) { window->removeChild(id); } + } + + //if this widget is a visualization box and they are to be unaffected + if (widget->getType() == EVTWidget::Box && !destroy) + { + size_t index; + unparentVisualizationWidget(id, index); + } + else + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "Deleting visualization widget\n"; + delete widget; + const auto it = m_widgets.find(id); + m_widgets.erase(it); + } + + return true; +} + +bool CVisualizationTree::unparentVisualizationWidget(const CIdentifier& id, size_t& index) +{ + //retrieve widget to be unparented + IVTWidget* widget = getVisualizationWidget(id); + if (widget == nullptr) { return false; } + + //get its parent identifier + const CIdentifier& parentID = widget->getParentIdentifier(); + if (parentID == CIdentifier::undefined()) { return true; } + + //unparent widget + widget->setParentIdentifier(CIdentifier::undefined()); + + //retrieve parent and remove widget from its children list + IVTWidget* parentWidget = getVisualizationWidget(parentID); + if (parentWidget != nullptr) + { + parentWidget->getChildIndex(id, index); + parentWidget->removeChild(id); + } + + return true; +} + +bool CVisualizationTree::parentVisualizationWidget(const CIdentifier& id, const CIdentifier& parentID, const size_t index) +{ + if (parentID == CIdentifier::undefined()) { return false; } + + //retrieve widget to be parented + IVTWidget* widget = getVisualizationWidget(id); + if (!widget) { return false; } + + widget->setParentIdentifier(parentID); + + //retrieve its parent + IVTWidget* parentWidget = getVisualizationWidget(parentID); + if (!parentWidget) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to parent visualization widget (couldn't find parent)\n"; + return false; + } + + parentWidget->setChildIdentifier(index, id); + + return true; +} + +CIdentifier CVisualizationTree::getUnusedIdentifier(const CIdentifier& suggestedID) const +{ + uint64_t id = (uint64_t(rand()) << 32) + uint64_t(rand()); + if (suggestedID != CIdentifier::undefined()) { id = suggestedID.id() - 1; } + + CIdentifier result; + std::map::const_iterator i; + do + { + id++; + result = CIdentifier(id); + i = m_widgets.find(result); + } while (i != m_widgets.end() || result == CIdentifier::undefined()); + return result; +} + +GtkTreeView* CVisualizationTree::createTreeViewWithModel() { return GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(m_treeStore))); } + +bool CVisualizationTree::setTreeViewCB(VisualizationToolkit::ITreeViewCB* callback) +{ + m_treeViewCB = callback; + return true; +} + +bool CVisualizationTree::reloadTree() +{ + if (!m_treeViewCB) { return false; } + + //clear current tree + GtkTreeIter iter; + while (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(m_treeStore), &iter, nullptr, 0) != FALSE) { gtk_tree_store_remove(m_treeStore, &iter); } + //create 'unaffected display plugins' node + gtk_tree_store_append(m_treeStore, &iter, nullptr); + gtk_tree_store_set(m_treeStore, &iter, + EVTColumn::StringName, "Unaffected display plugins", + EVTColumn::StringStockIcon, m_treeViewCB->getTreeWidgetIcon(EVTNode::Unaffected), + EVTColumn::ULongNodeType, static_cast(EVTNode::Unaffected), + EVTColumn::StringIdentifier, CIdentifier::undefined().str().c_str(), -1); + + //reload unaffected visualization boxes + CIdentifier id = CIdentifier::undefined(); + while (getNextVisualizationWidgetIdentifier(id, EVTWidget::Box)) + { + IVTWidget* widget = getVisualizationWidget(id); + //load widget if it doesn't have a parent (== is unaffected) + if (widget->getParentIdentifier() == CIdentifier::undefined()) { loadVisualizationWidget(widget, &iter); } + } + + //reload visualization windows + id = CIdentifier::undefined(); + while (getNextVisualizationWidgetIdentifier(id, EVTWidget::Window)) { loadVisualizationWidget(getVisualizationWidget(id), nullptr); } + + return true; +} + +//Tree helper functions +//--------------------- + +bool CVisualizationTree::getTreeSelection(GtkTreeView* preeView, GtkTreeIter* iter) +{ + GtkTreeSelection* treeSelection = gtk_tree_view_get_selection(preeView); + GtkTreeModel* treeModel = GTK_TREE_MODEL(m_treeStore); + return gtk_tree_selection_get_selected(treeSelection, &treeModel, iter) != 0; +} + +GtkTreePath* CVisualizationTree::getTreePath(GtkTreeIter* iter) const +{ + return (iter == nullptr) ? nullptr : gtk_tree_model_get_path(GTK_TREE_MODEL(m_treeStore), iter); +} + +size_t CVisualizationTree::getULongValueFromTreeIter(GtkTreeIter* iter, const EVTColumn colType) const +{ + size_t value = 0; + gtk_tree_model_get(GTK_TREE_MODEL(m_treeStore), iter, colType, &value, -1); + return value; +} + +bool CVisualizationTree::getStringValueFromTreeIter(GtkTreeIter* iter, char*& string, const EVTColumn colType) const +{ + gtk_tree_model_get(GTK_TREE_MODEL(m_treeStore), iter, colType, &string, -1); + return true; +} + +bool CVisualizationTree::getPointerValueFromTreeIter(GtkTreeIter* iter, void*& pointer, const EVTColumn colType) const +{ + gtk_tree_model_get(GTK_TREE_MODEL(m_treeStore), iter, colType, &pointer, -1); + return true; +} + +bool CVisualizationTree::getIdentifierFromTreeIter(GtkTreeIter* iter, CIdentifier& id, const EVTColumn colType) const +{ + char* str = nullptr; + getStringValueFromTreeIter(iter, str, colType); + id.fromString(CString(str)); + return true; +} + +//looks for a tree node named 'label' of class 'type' from tree root +bool CVisualizationTree::findChildNodeFromRoot(GtkTreeIter* iter, const char* label, const EVTNode type) +{ + if (!label) { return false; } + + //if tree is empty return false + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_treeStore), iter) == 0) { return false; } + + //look for node in the whole tree + do + { + //look for node in current subtree + if (findChildNodeFromParent(iter, label, type)) { return true; } + + //proceed with next top-level node + } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(m_treeStore), iter) != 0); + + //node wasn't found + return false; +} + +//looks for a tree node named 'label' of class 'type' from parent passed as parameter +bool CVisualizationTree::findChildNodeFromParent(GtkTreeIter* iter, const char* label, const EVTNode type) +{ + if (findChildNodeFromParentR(iter, label, type)) + { + *iter = m_internalTreeNode; + return true; + } + return false; +} + +//looks for a tree node named 'label' of class 'type' from parent passed as parameter +bool CVisualizationTree::findChildNodeFromParentR(GtkTreeIter* iter, const char* label, const EVTNode type) +{ + gchar* name; + unsigned long typeAsInt; + + //is current node the one looked for? + gtk_tree_model_get(GTK_TREE_MODEL(m_treeStore), iter, EVTColumn::StringName, &name, EVTColumn::ULongNodeType, &typeAsInt, -1); + + if (!name) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Can not get values from the model" << "\n"; + return false; + } + + if (strcmp(label, name) == 0 && type == EVTNode(typeAsInt)) + { + m_internalTreeNode = *iter; + return true; + } + + //look among current node's children + const int nChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(m_treeStore), iter); + GtkTreeIter childIter; + for (int i = 0; i < nChild; ++i) + { + gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(m_treeStore), &childIter, iter, i); + + if (findChildNodeFromParentR(&childIter, label, type)) { return true; } + } + + //node wasn't found + return false; +} + +bool CVisualizationTree::findChildNodeFromRoot(GtkTreeIter* iter, void* widget) +{ + // if tree is empty + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_treeStore), iter) == 0) { return false; } + + //look for node in the whole tree + do + { + //look for node in current subtree + if (findChildNodeFromParent(iter, widget)) { return true; } + + //proceed with next top-level node + } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(m_treeStore), iter) != 0); + + //node wasn't found + return false; +} + +bool CVisualizationTree::findChildNodeFromParent(GtkTreeIter* iter, void* widget) +{ + if (findChildNodeFromParentR(iter, widget)) + { + *iter = m_internalTreeNode; + return true; + } + return false; +} + +bool CVisualizationTree::findChildNodeFromParentR(GtkTreeIter* iter, void* widget) +{ + void* currentWidget; + + //is current node the one looked for? + gtk_tree_model_get(GTK_TREE_MODEL(m_treeStore), iter, EVTColumn::PointerWidget, ¤tWidget, -1); + if (widget == currentWidget) + { + m_internalTreeNode = *iter; + return true; + } + + //look among current node's children + const int nChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(m_treeStore), iter); + GtkTreeIter childIter; + for (int i = 0; i < nChild; ++i) + { + gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(m_treeStore), &childIter, iter, i); + + if (findChildNodeFromParentR(&childIter, widget)) { return true; } + } + + //node wasn't found + return false; +} + +bool CVisualizationTree::findChildNodeFromRoot(GtkTreeIter* iter, const CIdentifier id) +{ + //if tree is empty return false + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_treeStore), iter) == 0) { return false; } + + //look for node in the whole tree + do + { + //look for node in current subtree + if (findChildNodeFromParent(iter, id)) { return true; } + //proceed with next top-level node + } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(m_treeStore), iter) != 0); + + //node wasn't found + return false; +} + +bool CVisualizationTree::findChildNodeFromParent(GtkTreeIter* iter, const CIdentifier id) +{ + if (findChildNodeFromParentR(iter, id)) + { + *iter = m_internalTreeNode; + return true; + } + return false; +} + +bool CVisualizationTree::findChildNodeFromParentR(GtkTreeIter* iter, const CIdentifier& id) +{ + gchar* str; + CIdentifier currentID; + + //is current node the one looked for? + gtk_tree_model_get(GTK_TREE_MODEL(m_treeStore), iter, EVTColumn::StringIdentifier, &str, -1); + currentID.fromString(CString(str)); + if (id == currentID) + { + m_internalTreeNode = *iter; + return true; + } + + //look among current node's children + const int nChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(m_treeStore), iter); + GtkTreeIter childIter; + for (int i = 0; i < nChild; ++i) + { + gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(m_treeStore), &childIter, iter, i); + if (findChildNodeFromParentR(&childIter, id)) { return true; } + } + + //node wasn't found + return false; +} + +bool CVisualizationTree::findParentNode(GtkTreeIter* iter, const EVTNode type) +{ + unsigned long typeAsInt; + GtkTreeIter currentIter; + + //is current node the one looked for? + gtk_tree_model_get(GTK_TREE_MODEL(m_treeStore), iter, EVTColumn::ULongNodeType, &typeAsInt, -1); + if (type == EVTNode(typeAsInt)) { return true; } + //look one level higher + if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(m_treeStore), ¤tIter, iter) != 0) + { + *iter = currentIter; + return findParentNode(iter, type); + } + //couldn't find desired parent node + return false; +} + +bool CVisualizationTree::dragDataReceivedOutsideWidgetCB(const CIdentifier& srcWidgetID, GtkWidget* dstWidget, const VisualizationToolkit::EDragLocation location) +{ + //retrieve source widget parent + //----------------------------- + IVTWidget* srcWidget = getVisualizationWidget(srcWidgetID); + if (!srcWidget) { return false; } + + //retrieve dest widget and dest widget parent identifiers + //------------------------------------------------------- + GtkTreeIter dstIt; + if (!findChildNodeFromRoot(&dstIt, m_treeViewCB->getTreeWidget(dstWidget))) { return false; } + CIdentifier dstWidgetID; + getIdentifierFromTreeIter(&dstIt, dstWidgetID, EVTColumn::StringIdentifier); + IVTWidget* dstVisualizationWidget = getVisualizationWidget(dstWidgetID); + if (dstVisualizationWidget == nullptr) { return false; } + // dst widget is the widget already present in + const CIdentifier dstParentID = dstVisualizationWidget->getParentIdentifier(); + + //unparent source widget + size_t srcIdx = 0; + unparentVisualizationWidget(srcWidgetID, srcIdx); + + //unparent dest widget + size_t dstIdx = 0; + unparentVisualizationWidget(dstWidgetID, dstIdx); + + //create paned widget + const EVTWidget panedType = (location == VisualizationToolkit::EDragLocation::Top || location == VisualizationToolkit::EDragLocation::Bottom) + ? EVTWidget::VerticalSplit : EVTWidget::HorizontalSplit; + CIdentifier panedID; + addVisualizationWidget(panedID, CString(panedType == EVTWidget::VerticalSplit ? "Vertical split" : "Horizontal split"), panedType, + dstParentID, //parent paned to dest widget parent + dstIdx, //put it at the index occupied by dest widget + CIdentifier::undefined(), //no box algorithm for a paned + 2, //2 children + CIdentifier::undefined()); //no prefered visualization identifier + IVTWidget* panedWidget = getVisualizationWidget(panedID); + + //add attributes + if (m_treeViewCB != nullptr) { m_treeViewCB->createTreeWidget(panedWidget); } + + //reparent widgets + const size_t newSrcIdx = (location == VisualizationToolkit::EDragLocation::Top || location == VisualizationToolkit::EDragLocation::Left) ? 0 : 1; + parentVisualizationWidget(srcWidgetID, panedID, newSrcIdx); + parentVisualizationWidget(dstWidgetID, panedID, 1 - newSrcIdx); + + //update Gtk tree + reloadTree(); + + return true; +} + +bool CVisualizationTree::dragDataReceivedInWidgetCB(const CIdentifier& srcWidgetID, GtkWidget* dstWidget) +{ + //retrieve source widget parent + IVTWidget* srcWidget = getVisualizationWidget(srcWidgetID); + OV_EXCEPTION_UNLESS_D(srcWidget, "Source visualization identifier does not exist in the tree", Kernel::ErrorType::ResourceNotFound); + + const CIdentifier srcParentID = srcWidget->getParentIdentifier(); + + //retrieve dest widget and dest widget parent identifiers + GtkTreeIter dstIt; + if (!findChildNodeFromRoot(&dstIt, m_treeViewCB->getTreeWidget(dstWidget))) { return false; } + + CIdentifier dstWidgetID; + getIdentifierFromTreeIter(&dstIt, dstWidgetID, EVTColumn::StringIdentifier); + IVTWidget* dstVisualizationWidget = getVisualizationWidget(dstWidgetID); + if (!dstVisualizationWidget) { return false; } + + const CIdentifier dstParentID = dstVisualizationWidget->getParentIdentifier(); + + //unparent source widget + size_t srcIdx; + unparentVisualizationWidget(srcWidgetID, srcIdx); + + //destroy, unparent or reparent dest widget + size_t dstIdx; + + //if source widget was unaffected + if (srcParentID == CIdentifier::undefined()) + { + //if dest widget was dummy, destroy it + if (dstVisualizationWidget->getType() == EVTWidget::Undefined) + { + getVisualizationWidgetIndex(dstWidgetID, dstIdx); + destroyHierarchy(dstWidgetID, true); + } + else //dest widget becomes unaffected + { + unparentVisualizationWidget(dstWidgetID, dstIdx); + } + } + else //source widget was affected + { + //unparent dest widget + unparentVisualizationWidget(dstWidgetID, dstIdx); + + //reparent it to source widget parent + parentVisualizationWidget(dstWidgetID, srcParentID, srcIdx); + } + + //reparent source widget + parentVisualizationWidget(srcWidgetID, dstParentID, dstIdx); + + //update Gtk tree + reloadTree(); + + return true; +} + +bool CVisualizationTree::loadVisualizationWidget(IVTWidget* widget, GtkTreeIter* parentIter) +{ + //create visualization widget + //--------------------------- + GtkWidget* tmp = m_treeViewCB->loadTreeWidget(widget); + + //add visualization widget node to tree store + GtkTreeIter iter; + gtk_tree_store_append(m_treeStore, &iter, parentIter); + + //retrieve values of tree node fields + EVTNode childType; + switch (widget->getType()) + { + case EVTWidget::Window: childType = EVTNode::VisualizationWindow; + break; + case EVTWidget::Panel: childType = EVTNode::VisualizationPanel; + break; + case EVTWidget::Box: childType = EVTNode::VisualizationBox; + break; + case EVTWidget::HorizontalSplit: childType = EVTNode::HorizontalSplit; + break; + case EVTWidget::VerticalSplit: childType = EVTNode::VerticalSplit; + break; + case EVTWidget::Undefined: childType = EVTNode::Undefined; + break; + default: childType = EVTNode::Undefined; + break; + } + + CString stockIconString = m_treeViewCB->getTreeWidgetIcon(childType); + + if (widget->getType() == EVTWidget::Box) + { + const Kernel::IBox* box = m_scenario->getBoxDetails(widget->getBoxIdentifier()); + if (!box) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Box with identifier " << widget->getBoxIdentifier() << + " not found in the scenario" << "\n"; + return false; + } + const Plugins::IBoxAlgorithmDesc* boxDesc = dynamic_cast(m_kernelCtx.getPluginManager().getPluginObjectDescCreating(box->getAlgorithmClassIdentifier())); + if (boxDesc) { stockIconString = boxDesc->getStockItemName(); } + } + + //set tree node fields + gtk_tree_store_set(m_treeStore, &iter, + EVTColumn::StringName, widget->getName().toASCIIString(), + EVTColumn::StringStockIcon, stockIconString.toASCIIString(), + EVTColumn::ULongNodeType, static_cast(childType), + EVTColumn::StringIdentifier, widget->getIdentifier().str().c_str(), + EVTColumn::PointerWidget, tmp, -1); + + //load visualization widget hierarchy + //----------------------------------- + //create a dummy child for visualization panels if none exists + if (widget->getType() == EVTWidget::Panel) + { + CIdentifier id; + widget->getChildIdentifier(0, id); + if (id == CIdentifier::undefined()) + { + addVisualizationWidget(id, "Empty", EVTWidget::Undefined, widget->getIdentifier(), 0, CIdentifier::undefined(), 0, CIdentifier::undefined()); + } + } + + for (size_t i = 0; i < widget->getNbChildren(); ++i) + { + CIdentifier id; + widget->getChildIdentifier(i, id); + + loadVisualizationWidget(getVisualizationWidget(id), &iter); + } + + //complete visualization widget loading now that its hierarchy is loaded + m_treeViewCB->endLoadTreeWidget(widget); + + return true; +} + +bool CVisualizationTree::setToolbar(const CIdentifier& boxID, GtkWidget* toolbar) +{ + if (m_treeViewCB != nullptr) { return m_treeViewCB->setToolbar(boxID, toolbar); } + return false; +} + +bool CVisualizationTree::setWidget(const CIdentifier& boxID, GtkWidget* widget) +{ + if (m_treeViewCB != nullptr) { return m_treeViewCB->setWidget(boxID, widget); } + return false; +} + + +json::Object CVisualizationTree::serializeWidget(IVTWidget& widget) const +{ + json::Object representation; + + representation["identifier"] = widget.getIdentifier().str().c_str(); + + // visualization box name can be retrieved from corresponding IBox, so we can skip it for these + if (widget.getType() != EVTWidget::Box) { representation["name"] = widget.getName().toASCIIString(); } + + representation["type"] = int(widget.getType()); + representation["parentIdentifier"] = widget.getParentIdentifier().str().c_str(); + + // visualization widget index + IVTWidget* parentVisualizationWidget = this->getVisualizationWidget(widget.getParentIdentifier()); + if (parentVisualizationWidget) + { + size_t childIndex = 0; + parentVisualizationWidget->getChildIndex(widget.getIdentifier(), childIndex); + representation["index"] = int(childIndex); + } + + representation["boxIdentifier"] = widget.getBoxIdentifier().str().c_str(); + representation["childCount"] = int(widget.getNbChildren()); + + if (widget.getType() == EVTWidget::Window) + { + representation["width"] = int(widget.getWidth()); + representation["height"] = int(widget.getHeight()); + } + if (widget.getType() == EVTWidget::HorizontalSplit || widget.getType() == EVTWidget::VerticalSplit) + { + representation["dividerPosition"] = widget.getDividerPosition(); + representation["maxDividerPosition"] = widget.getMaxDividerPosition(); + } + + return representation; +} + +CString CVisualizationTree::serialize() const +{ + json::Array representation; + + std::vector widgetsToExport; + + CIdentifier widgetID; + while (this->getNextVisualizationWidgetIdentifier(widgetID)) + { + IVTWidget* widget = this->getVisualizationWidget(widgetID); + if (widget->getType() == EVTWidget::Window || widget->getParentIdentifier() == CIdentifier::undefined()) { widgetsToExport.push_back(widgetID); } + } + + for (size_t i = 0; i < widgetsToExport.size(); ++i) + { + IVTWidget* widget = this->getVisualizationWidget(widgetsToExport[i]); + + representation.push_back(this->serializeWidget(*widget)); + + for (size_t j = 0; j < widget->getNbChildren(); ++j) { if (widget->getChildIdentifier(j, widgetID)) { widgetsToExport.push_back(widgetID); } } + } + + return CString(Serialize(representation).c_str()); +} + +bool CVisualizationTree::deserialize(const CString& tree) +{ + // Empty this visualization tree + auto widgetID = CIdentifier::undefined(); + while (this->getNextVisualizationWidgetIdentifier(widgetID) && widgetID != CIdentifier::undefined()) + { + this->destroyHierarchy(widgetID, true); + widgetID = CIdentifier::undefined(); + } + + + json::Array representation = json::Deserialize(tree.toASCIIString()); + + for (auto it = representation.begin(); it != representation.end(); ++it) + { + json::Value& jsonWidget = *it; + + widgetID.fromString(jsonWidget["identifier"].ToString().c_str()); + + CIdentifier boxID; + boxID.fromString(jsonWidget["boxIdentifier"].ToString().c_str()); + + const EVTWidget widgetType = EVTWidget(jsonWidget["type"].ToInt()); + + CString name; + if (widgetType == EVTWidget::Box) + { + const Kernel::IBox* box = m_scenario->getBoxDetails(boxID); + if (!box) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "The box identifier [" << boxID << "] used in Window manager was not found in the scenario.\n"; + return false; + } + name = box->getName(); + } + else { name = jsonWidget["name"].ToString().c_str(); } + + CIdentifier id, parentID; + parentID.fromString(jsonWidget["parentIdentifier"].ToString().c_str()); + + size_t index = 0; + if (this->getVisualizationWidget(parentID)) { index = size_t(jsonWidget["index"].ToInt()); } + const size_t nChild = size_t(jsonWidget["childCount"].ToInt()); + + this->addVisualizationWidget(id, name, widgetType, parentID, index, boxID, nChild, widgetID); + + if (widgetID != id) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Visualization widget [" << widgetID << "] for box [" << boxID << "] could not be imported.\n"; + return false; + } + + IVTWidget* widget = this->getVisualizationWidget(widgetID); + + if (widget) + { + if (widget->getType() == EVTWidget::Window) + { + widget->setWidth(size_t(jsonWidget["width"].ToInt())); + widget->setHeight(size_t(jsonWidget["height"].ToInt())); + } + if (widget->getType() == EVTWidget::HorizontalSplit || widget->getType() == EVTWidget::VerticalSplit) + { + widget->setDividerPosition(jsonWidget["dividerPosition"].ToInt()); + widget->setMaxDividerPosition(jsonWidget["maxDividerPosition"].ToInt()); + } + } + } + + return true; +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationTree.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationTree.h new file mode 100644 index 0000000..354aa26 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationTree.h @@ -0,0 +1,84 @@ +#pragma once + +#include + +#include +#include + +namespace json { +class Object; +} + +namespace OpenViBE { +namespace Designer { +class CVisualizationTree final : public VisualizationToolkit::IVisualizationTree +{ +public: + CVisualizationTree(const Kernel::IKernelContext& ctx) : m_kernelCtx(ctx) {} + ~CVisualizationTree() override; + + bool init(const Kernel::IScenario* scenario) override; + + bool getNextVisualizationWidgetIdentifier(CIdentifier& id) const override; + bool getNextVisualizationWidgetIdentifier(CIdentifier& id, VisualizationToolkit::EVisualizationWidget type) const override; + bool isVisualizationWidget(const CIdentifier& id) const override; + VisualizationToolkit::IVisualizationWidget* getVisualizationWidget(const CIdentifier& id) const override; + VisualizationToolkit::IVisualizationWidget* getVisualizationWidgetFromBoxIdentifier(const CIdentifier& boxID) const override; + bool addVisualizationWidget(CIdentifier& id, const CString& name, VisualizationToolkit::EVisualizationWidget type, const CIdentifier& parentID, + size_t parentIdx, const CIdentifier& boxID, size_t nChild, const CIdentifier& suggestedID) override; + bool getVisualizationWidgetIndex(const CIdentifier& id, size_t& index) const override; + bool unparentVisualizationWidget(const CIdentifier& id, size_t& index) override; + bool parentVisualizationWidget(const CIdentifier& id, const CIdentifier& parentID, const size_t index) override; + bool destroyHierarchy(const CIdentifier& id, bool destroyVisualizationBoxes) override; + + GtkTreeView* createTreeViewWithModel() override; + bool setTreeViewCB(VisualizationToolkit::ITreeViewCB* callback) override; + + bool reloadTree() override; + + bool getTreeSelection(GtkTreeView* preeView, GtkTreeIter* iter) override; + GtkTreePath* getTreePath(GtkTreeIter* iter) const override; + size_t getULongValueFromTreeIter(GtkTreeIter* iter, VisualizationToolkit::EVisualizationTreeColumn colType) const override; + bool getStringValueFromTreeIter(GtkTreeIter* iter, char*& string, VisualizationToolkit::EVisualizationTreeColumn colType) const override; + bool getPointerValueFromTreeIter(GtkTreeIter* iter, void*& pointer, VisualizationToolkit::EVisualizationTreeColumn colType) const override; + bool getIdentifierFromTreeIter(GtkTreeIter* iter, CIdentifier& id, VisualizationToolkit::EVisualizationTreeColumn colType) const override; + + bool findChildNodeFromRoot(GtkTreeIter* iter, const char* label, VisualizationToolkit::EVisualizationTreeNode type) override; + bool findChildNodeFromParent(GtkTreeIter* iter, const char* label, VisualizationToolkit::EVisualizationTreeNode type) override; + bool findChildNodeFromRoot(GtkTreeIter* iter, void* widget) override; + bool findChildNodeFromParent(GtkTreeIter* iter, void* widget) override; + bool findChildNodeFromRoot(GtkTreeIter* iter, CIdentifier id) override; + bool findChildNodeFromParent(GtkTreeIter* iter, CIdentifier id) override; + bool findParentNode(GtkTreeIter* iter, VisualizationToolkit::EVisualizationTreeNode type) override; + + bool dragDataReceivedInWidgetCB(const CIdentifier& srcWidgetID, GtkWidget* dstWidget) override; + bool dragDataReceivedOutsideWidgetCB(const CIdentifier& srcWidgetID, GtkWidget* dstWidget, VisualizationToolkit::EDragLocation location) override; + + bool setToolbar(const CIdentifier& boxID, GtkWidget* toolbar) override; + bool setWidget(const CIdentifier& boxID, GtkWidget* widget) override; + + CString serialize() const override; + bool deserialize(const CString& tree) override; + +private: + json::Object serializeWidget(VisualizationToolkit::IVisualizationWidget& widget) const; + + bool destroyHierarchyR(const CIdentifier& id, bool destroy); + CIdentifier getUnusedIdentifier(const CIdentifier& suggestedID) const; + + bool findChildNodeFromParentR(GtkTreeIter* iter, const char* label, VisualizationToolkit::EVisualizationTreeNode type); + bool findChildNodeFromParentR(GtkTreeIter* iter, void* widget); + bool findChildNodeFromParentR(GtkTreeIter* iter, const CIdentifier& id); + + bool loadVisualizationWidget(VisualizationToolkit::IVisualizationWidget* widget, GtkTreeIter* parentIter); + + std::map m_widgets; + CIdentifier m_scenarioID = CIdentifier::undefined(); + const Kernel::IKernelContext& m_kernelCtx; + const Kernel::IScenario* m_scenario = nullptr; + GtkTreeStore* m_treeStore = nullptr; + GtkTreeIter m_internalTreeNode; + VisualizationToolkit::ITreeViewCB* m_treeViewCB = nullptr; +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationWidget.cpp b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationWidget.cpp new file mode 100644 index 0000000..9cbb4c2 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationWidget.cpp @@ -0,0 +1,72 @@ +#include + +#include "../ovdAssert.h" + +#include "ovdCVisualizationWidget.h" + +namespace OpenViBE { +namespace Designer { + +bool CVisualizationWidget::initialize(const CIdentifier& id, const CString& name, const VisualizationToolkit::EVisualizationWidget type, + const CIdentifier& parentID, const CIdentifier& boxID, const size_t nChild) +{ + m_id = id; + m_name = name; + m_type = type; + m_parentID = parentID; + m_boxID = boxID; + m_childrens.resize(nChild, CIdentifier::undefined()); + return true; +} + +bool CVisualizationWidget::getChildIndex(const CIdentifier& id, size_t& index) const +{ + for (index = 0; index < m_childrens.size(); ++index) { if (m_childrens[index] == id) { return true; } } + return false; +} + +bool CVisualizationWidget::addChild(const CIdentifier& childID) +{ + m_childrens.push_back(childID); + return true; +} + +bool CVisualizationWidget::removeChild(const CIdentifier& id) +{ + for (size_t i = 0; i < m_childrens.size(); ++i) + { + if (m_childrens[i] == id) + { + //remove tab from a window (variable number of children) + if (m_type == VisualizationToolkit::EVisualizationWidget::Window) { m_childrens.erase(m_childrens.begin() + i); } + else //clear identifier if ith child for a regular widget (fixed number of children) + { + m_childrens[i] = CIdentifier::undefined(); + } + return true; + } + } + + OV_ERROR_DRF("Trying to remove non existing visualization widget " << id.str(), Kernel::ErrorType::ResourceNotFound); +} + +bool CVisualizationWidget::getChildIdentifier(const size_t index, CIdentifier& id) const +{ + if (index >= m_childrens.size()) + { + id = CIdentifier::undefined(); + OV_ERROR_DRF("Child with index " << index << " not found", Kernel::ErrorType::ResourceNotFound); + } + id = m_childrens[index]; + return true; +} + +bool CVisualizationWidget::setChildIdentifier(const size_t index, const CIdentifier& id) +{ + if (index >= m_childrens.size()) { OV_ERROR_DRF("Child with index " << index << " not found", Kernel::ErrorType::ResourceNotFound); } + m_childrens[index] = id; + return true; +} + +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationWidget.h b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationWidget.h new file mode 100644 index 0000000..8fc0c16 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/applications/platform/designer/src/visualization/ovdCVisualizationWidget.h @@ -0,0 +1,64 @@ +#pragma once + +#include + +#include +#include + +namespace OpenViBE { +namespace Designer { +class CVisualizationWidget final : public VisualizationToolkit::IVisualizationWidget +{ +public: + explicit CVisualizationWidget(const Kernel::IKernelContext& ctx) : m_kernelCtx(ctx) { } + ~CVisualizationWidget() override = default; + + bool initialize(const CIdentifier& id, const CString& name, const VisualizationToolkit::EVisualizationWidget type, + const CIdentifier& parentID, const CIdentifier& boxID, const size_t nChild) override; + + CIdentifier getIdentifier() const override { return m_id; } + const CString& getName() const override { return m_name; } + void setName(const CString& name) override { m_name = name; } + VisualizationToolkit::EVisualizationWidget getType() const override { return m_type; } + CIdentifier getParentIdentifier() const override { return m_parentID; } + void setParentIdentifier(const CIdentifier& parentID) override { m_parentID = parentID; } + CIdentifier getBoxIdentifier() const override { return m_boxID; } + size_t getNbChildren() const override { return m_childrens.size(); } + bool getChildIndex(const CIdentifier& id, size_t& index) const override; + + //for windows, the number of children is unknown a priori + bool addChild(const CIdentifier& childID) override; + bool removeChild(const CIdentifier& id) override; + bool getChildIdentifier(const size_t index, CIdentifier& id) const override; + bool setChildIdentifier(const size_t index, const CIdentifier& id) override; + + void setWidth(const size_t width) override { m_width = width; } + void setHeight(const size_t height) override { m_height = height; } + + size_t getWidth() override { return m_width; } + size_t getHeight() override { return m_height; } + + void setDividerPosition(const int pos) override { m_dividerPosition = pos; } + void setMaxDividerPosition(const int pos) override { m_maxDividerPosition = pos; } + + int getDividerPosition() override { return m_dividerPosition; } + int getMaxDividerPosition() override { return m_maxDividerPosition; } + +private: + + const Kernel::IKernelContext& m_kernelCtx; + CIdentifier m_id = CIdentifier::undefined(); + CString m_name; + VisualizationToolkit::EVisualizationWidget m_type = VisualizationToolkit::EVisualizationWidget::Undefined; + CIdentifier m_parentID = CIdentifier::undefined(); + CIdentifier m_boxID = CIdentifier::undefined(); + std::vector m_childrens; + + // @fixme should initialize meaningfully in constructor or initialize()? + size_t m_width = 0; + size_t m_height = 0; + int m_dividerPosition = std::numeric_limits::min(); + int m_maxDividerPosition = std::numeric_limits::min(); +}; +} // namespace Designer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/FindLibMensiaAdvancedVisualisation.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/FindLibMensiaAdvancedVisualisation.cmake new file mode 100644 index 0000000..87b1072 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/FindLibMensiaAdvancedVisualisation.cmake @@ -0,0 +1,41 @@ +# --------------------------------- +# Finds libmensia-advanced-visualization +# Adds library to target +# Adds include path +# --------------------------------- +# OPTION(DYNAMIC_LINK_LIBADVVIZ "Dynamically link libmensia-advanced-visualization" ON) + +# Default is dynamic library +IF(NOT DEFINED DYNAMIC_LINK_LIBADVVIZ) + OPTION(DYNAMIC_LINK_LIBADVVIZ "Dynamically link lib mensia-advanced-visualization" OFF) +ENDIF() + +IF(DYNAMIC_LINK_LIBADVVIZ) + ADD_DEFINITIONS(-DLMAV_Shared) + SET(LIBADVVIZ_LINKING "") +ELSE() + ADD_DEFINITIONS(-DLMAV_Static) + SET(LIBADVVIZ_LINKING -static) +ENDIF() + +SET(PATH_LIBADVVIZ "PATH_LIBADVVIZ-NOTFOUND") +SET(MENSIA_SRC_DIR ${CMAKE_SOURCE_DIR}/libraries/lib-advanced-visualization/include/) + +FIND_PATH(PATH_LIBADVVIZ mensia/advanced-visualization.hpp PATHS ${MENSIA_SRC_DIR} NO_DEFAULT_PATH) +IF(PATH_LIBADVVIZ) + debug_message( " Found mensia-advanced-visualization... ${PATH_LIBADVVIZ}") + INCLUDE_DIRECTORIES(${PATH_LIBADVVIZ}/) + IF(TARGET ${PROJECT_NAME}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} mensia-advanced-visualization${LIBADVVIZ_LINKING}) + debug_message( "Linking with mensia-advanced-visualization${LIBADVVIZ_LINKING}") + + ENDIF() + IF(TARGET ${PROJECT_NAME}-static) + TARGET_LINK_LIBRARIES(${PROJECT_NAME}-static mensia-advanced-visualization${LIBADVVIZ_LINKING}) + debug_message( "Linking with mensia-advanced-visualization${LIBADVVIZ_LINKING}") + ENDIF() + + ADD_DEFINITIONS(-DTARGET_HAS_LibAdvancedVisualization) +ELSE() + MESSAGE(WARNING " FAILED to find mensia-advanced-visualization...") +ENDIF() diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/FindOVSDK.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/FindOVSDK.cmake new file mode 100755 index 0000000..25572f5 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/FindOVSDK.cmake @@ -0,0 +1,102 @@ +# --------------------------------- +# Finds OpenViBE SDK binary distribution +# --------------------------------- + + +if(NOT CMAKE_BUILD_TYPE AND CMAKE_GENERATOR MATCHES "Visual Studio*") + set(MULTI_BUILD TRUE) +elseif(CMAKE_BUILD_TYPE AND OV_PACKAGE) + set(SOLO_PACKAGE TRUE) +elseif(CMAKE_BUILD_TYPE) + set(SOLO_BUILD TRUE) +else() + message(FATAL_ERROR "Build should specify a type or use a multi-type generator (like Visual Studio)") +endif() + +if(NOT DEFINED TRIED_FIND_OVSDK) + if(MULTI_BUILD) + set(SEEK_PATHS ${OPENVIBE_SDK_PATH};${LIST_DEPENDENCIES_PATH}) + unset(OPENVIBE_SDK_PATH CACHE) + foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} ) + # set(OPENVIBE_SDK_PATH ${OPENVIBE_SDK_PATH}/$>) + string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU ) + unset(OPENVIBE_SDK_PATH_TMP CACHE) + find_path(OPENVIBE_SDK_PATH_TMP include/openvibe/ov_all.h PATHS ${SEEK_PATHS} PATH_SUFFIXES openvibe-sdk-${OUTPUTCONFIG} ${OUTPUTCONFIG} NO_DEFAULT_PATH) + set(OPENVIBE_SDK_PATH_${OUTPUTCONFIGU} ${OPENVIBE_SDK_PATH_TMP}) + if(OPENVIBE_SDK_PATH_TMP) + message("Found ${OUTPUTCONFIG} of sdk at ${OPENVIBE_SDK_PATH_TMP}") + string(CONCAT OPENVIBE_SDK_PATH ${OPENVIBE_SDK_PATH} $<$:${OPENVIBE_SDK_PATH_TMP}>) + set(AT_LEAST_ONE_OV_BUILD TRUE) + endif() + endforeach() + if(NOT DEFINED AT_LEAST_ONE_OV_BUILD) + message(FATAL_ERROR "Did not find any valid build of OpenViBE SDK") + endif() + else() # Regular build + string(TOLOWER ${CMAKE_BUILD_TYPE} OV_SDK_BUILD_TYPE) + find_path(OPENVIBE_SDK_PATH include/openvibe/ov_all.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES openvibe-sdk-${OV_SDK_BUILD_TYPE} NO_DEFAULT_PATH) + if(NOT OPENVIBE_SDK_PATH) + message(FATAL_ERROR " FAILED to find OpenViBE SDK [${OPENVIBE_SDK_PATH}]") + endif() + string(REGEX REPLACE "\\\\+" "/" OPENVIBE_SDK_PATH ${OPENVIBE_SDK_PATH}) + debug_message(" Found OpenViBE SDK... [${OPENVIBE_SDK_PATH}]") + endif() + set(TRIED_FIND_OVSDK TRUE) +endif() + +if(INSTALL_SDK) + if(MULTI_BUILD) # Replace with generator expression in CMake 3.5+ + foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU) + file(GLOB EXE_SCRIPT_LIST "${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/*.cmd" "${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/*.sh") + if(EXE_SCRIPT_LIST) + foreach(SCRIPT IN LISTS EXE_SCRIPT_LIST) + get_filename_component(base_name ${SCRIPT} NAME_WE) + if(WIN32) + set(exe_name "${base_name}.exe") + else() + set(exe_name ${base_name}) + endif() + IF(WIN32) + SET(SCRIPT_POSTFIX ".cmd") + ELSEIF(APPLE) + SET(SCRIPT_POSTFIX "-macos.sh") + ELSEIF(UNIX) + # Debian recommends that extensions such as .sh are not used; On Linux, scripts with such extensions shouldn't be packaged + SET(SCRIPT_POSTFIX ".sh") + ENDIF() + IF(WIN32) + SET(OV_CMD_EXECUTABLE "%OV_PATH_ROOT%/bin/${exe_name}") + ENDIF() + SET(SCRIPT_NAME ${base_name}${SCRIPT_POSTFIX}) + SET(OV_CMD_ARGS "") + SET(OV_PAUSE "") + + CONFIGURE_FILE(${OV_LAUNCHER_SOURCE_PATH}/openvibe-launcher${SCRIPT_POSTFIX}-base ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} @ONLY) + INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} DESTINATION ${DIST_ROOT}) + endforeach() + endif() + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/include DESTINATION ${DIST_INCLUDEDIR} CONFIGURATIONS ${OUTPUTCONFIG}) + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/bin DESTINATION ${DIST_BINDIR} CONFIGURATIONS ${OUTPUTCONFIG}) # FILES_MATCHING PATTERN "openvibe-plugins*dll") or *so* + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/lib DESTINATION ${DIST_LIBDIR} CONFIGURATIONS ${OUTPUTCONFIG}) # FILES_MATCHING PATTERN "openvibe-plugins*dll") + # install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/etc DESTINATION ${DIST_SYSCONFDIR} CONFIGURATIONS ${OUTPUTCONFIG}) + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/share DESTINATION ${DIST_DATADIR} CONFIGURATIONS ${OUTPUTCONFIG}) + endforeach() + else() + file(GLOB EXE_SCRIPT_LIST "${OPENVIBE_SDK_PATH}/*.cmd" "${OPENVIBE_SDK_PATH}/*.sh") + foreach(SCRIPT IN LISTS EXE_SCRIPT_LIST) + get_filename_component(base_name ${SCRIPT} NAME_WE) + if(WIN32) + set(exe_name "${base_name}.exe") + else() + set(exe_name ${base_name}) + endif() + OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX ${base_name} EXECUTABLE_NAME ${exe_name} NOPROJECT) + endforeach() + install(DIRECTORY ${OPENVIBE_SDK_PATH}/include DESTINATION ${DIST_INCLUDEDIR}) + install(DIRECTORY ${OPENVIBE_SDK_PATH}/bin DESTINATION ${DIST_BINDIR}) # FILES_MATCHING PATTERN "openvibe-plugins*dll") or *so* + install(DIRECTORY ${OPENVIBE_SDK_PATH}/lib DESTINATION ${DIST_LIBDIR}) # FILES_MATCHING PATTERN "openvibe-plugins*dll") + # install(DIRECTORY ${OPENVIBE_SDK_PATH}/etc DESTINATION ${DIST_SYSCONFDIR}) + install(DIRECTORY ${OPENVIBE_SDK_PATH}/share DESTINATION ${DIST_DATADIR}) + endif() +endif() \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/FindOpenViBEPluginsGlobalDefines.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/FindOpenViBEPluginsGlobalDefines.cmake new file mode 100644 index 0000000..97d83f3 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/FindOpenViBEPluginsGlobalDefines.cmake @@ -0,0 +1,18 @@ +# --------------------------------- +# Finds OpenViBEPluginsGlobalDefines +# Adds library to target +# Adds include path +# +# @deprecated Running FindOpenVibeCommon.cmake is sufficient +# +# --------------------------------- +SET(PATH_OpenViBEPluginsGlobalDefines "PATH_OpenViBEPluginsGlobalDefines-NOTFOUND") +FIND_PATH(PATH_OpenViBEPluginsGlobalDefines ovp_global_defines.h PATHS ${OV_BASE_DIR}/common/include NO_DEFAULT_PATH) +IF(PATH_OpenViBEPluginsGlobalDefines) + debug_message( " Found OpenViBE plugins global defines...") + INCLUDE_DIRECTORIES(${PATH_OpenViBEPluginsGlobalDefines}) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) +ELSE(PATH_OpenViBEPluginsGlobalDefines) + MESSAGE(WARNING " FAILED to find OpenViBE plugins global defines") +ENDIF(PATH_OpenViBEPluginsGlobalDefines) diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/FindOpenViBEVisualizationToolkit.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/FindOpenViBEVisualizationToolkit.cmake new file mode 100644 index 0000000..69f1634 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/FindOpenViBEVisualizationToolkit.cmake @@ -0,0 +1,33 @@ +# --------------------------------- +# Finds openvibe-toolkit +# Adds library to target +# Adds include path +# --------------------------------- +option(LINK_OPENVIBE_VISUALIZATION_TOOLKIT "By default, link openvibe-visualization-toolkit, otherwise only use the includes" ON) +option(DYNAMIC_LINK_OPENVIBE_VISUALIZATION_TOOLKIT "Dynamically link openvibe-visualization-toolkit" ON) + +if(DYNAMIC_LINK_OPENVIBE_VISUALIZATION_TOOLKIT) + set(OPENVIBE_VISUALIZATION_TOOLKIT_LINKING "") + add_definitions(-DOVVIZ_Shared) +else() + set(OPENVIBE_VISUALIZATION_TOOLKIT_LINKING "-static") + add_definitions(-DOVVIZ_Static) +endif() + +set(SRC_DIR ${OV_BASE_DIR}/visualization-toolkit/include) + +set(PATH_OPENVIBE_VISUALIZATION_TOOLKIT "PATH_OPENVIBE_VISUALIZATION_TOOLKIT-NOTFOUND") +find_path(PATH_OPENVIBE_VISUALIZATION_TOOLKIT visualization-toolkit/ovviz_all.h PATHS ${SRC_DIR} NO_DEFAULT_PATH) +if(PATH_OPENVIBE_VISUALIZATION_TOOLKIT) + debug_message( " Found openvibe-toolkit... ${PATH_OPENVIBE_VISUALIZATION_TOOLKIT}") + include_directories(${PATH_OPENVIBE_VISUALIZATION_TOOLKIT}/) + + if(LINK_OPENVIBE_VISUALIZATION_TOOLKIT) + target_link_libraries(${PROJECT_NAME} openvibe-visualization-toolkit${OPENVIBE_VISUALIZATION_TOOLKIT_LINKING}) + endif() + + add_definitions(-DTARGET_HAS_OpenViBEVisualizationToolkit) +else() + message(WARNING " FAILED to find openvibe-visualization-toolkit...") +endif() + diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/FindSourceDependencyJSON.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/FindSourceDependencyJSON.cmake new file mode 100644 index 0000000..5114311 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/FindSourceDependencyJSON.cmake @@ -0,0 +1,9 @@ +# --------------------------------- +# Finds JSON sources +# Sets json_source_files +# Adds appropriate include dir +# --------------------------------- + +FILE(GLOB_RECURSE json_source_files ${OV_SOURCE_DEPENDENCIES_PATH}/json/*.cpp ${OV_SOURCE_DEPENDENCIES_PATH}/json/*.c ${OV_SOURCE_DEPENDENCIES_PATH}/json/*.h) +INCLUDE_DIRECTORIES("${OV_SOURCE_DEPENDENCIES_PATH}") +SET(SRC_FILES "${SRC_FILES};${json_source_files}") diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/FindSourceRCProperties.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/FindSourceRCProperties.cmake new file mode 100644 index 0000000..2383530 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/FindSourceRCProperties.cmake @@ -0,0 +1,10 @@ +# --------------------------------- +# Configure RC file +# Sets SRC_FILES to add the path to the newly created rc file +# Adds appropriate include dir +# --------------------------------- +IF(WIN32) + OV_CONFIGURE_RC(NAME ${PROJECT_NAME}) + SET(SRC_FILES "${SRC_FILES};${CMAKE_BINARY_DIR}/resource-files/${PROJECT_NAME}.rc") +ENDIF() + diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyBoost.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyBoost.cmake new file mode 100644 index 0000000..d322343 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyBoost.cmake @@ -0,0 +1,19 @@ +# --------------------------------- +# Finds third party boost +# Adds library to target +# Adds include path +# --------------------------------- + +SET(PATH_BOOST "PATH_BOOST-NOTFOUND") +FIND_PATH(PATH_BOOST "include/boost/config/auto_link.hpp" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES boost NO_DEFAULT_PATH) +FIND_PATH(PATH_BOOST "include/boost/config/auto_link.hpp" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES boost) + + +IF(PATH_BOOST) + debug_message( " Found boost includes...") + INCLUDE_DIRECTORIES(${PATH_BOOST}/include) + + ADD_DEFINITIONS(-DTARGET_HAS_Boost) +ELSE(PATH_BOOST) + MESSAGE(WARNING " FAILED to find boost includes...") +ENDIF(PATH_BOOST) diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyBoost_Filesystem.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyBoost_Filesystem.cmake new file mode 100644 index 0000000..351fb7f --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyBoost_Filesystem.cmake @@ -0,0 +1,32 @@ +# --------------------------------- +# Finds third party boost +# Adds library to target +# Adds include path +# --------------------------------- + +IF(UNIX) + FIND_LIBRARY(LIB_Boost_Filesystem NAMES "boost_filesystem-mt" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_Filesystem NAMES "boost_filesystem-mt" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib) + FIND_LIBRARY(LIB_Boost_Filesystem NAMES "boost_filesystem" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_Filesystem NAMES "boost_filesystem" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib) + IF(LIB_Boost_Filesystem) + debug_message( " [ OK ] lib ${LIB_Boost_Filesystem}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_Boost_Filesystem} ) + ELSE(LIB_Boost_Filesystem) + MESSAGE(WARNING " [FAILED] lib boost_Filesystem-mt") + ENDIF(LIB_Boost_Filesystem) + + # For Fedora + FIND_LIBRARY(LIB_STANDARD_MODULE_PTHREAD pthread) + IF(LIB_STANDARD_MODULE_PTHREAD) + debug_message( " Found pthread...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_PTHREAD}) + ELSE(LIB_STANDARD_MODULE_PTHREAD) + MESSAGE(WARNING " FAILED to find pthread...") + ENDIF(LIB_STANDARD_MODULE_PTHREAD) +ENDIF(UNIX) + +IF(WIN32) + OV_LINK_BOOST_LIB("filesystem" ${OV_WIN32_BOOST_VERSION} ) + OV_LINK_BOOST_LIB("system" ${OV_WIN32_BOOST_VERSION} ) # filesystem depends on system +ENDIF(WIN32) diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyBoost_Regex.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyBoost_Regex.cmake new file mode 100644 index 0000000..e4edbc8 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyBoost_Regex.cmake @@ -0,0 +1,23 @@ +# --------------------------------- +# Finds third party boost +# Adds library to target +# Adds include path +# --------------------------------- + + +IF(UNIX) + FIND_LIBRARY(LIB_Boost_Regex NAMES "boost_regex-mt" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_Regex NAMES "boost_regex-mt" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib) + FIND_LIBRARY(LIB_Boost_Regex NAMES "boost_regex" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_Regex NAMES "boost_regex" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib) + IF(LIB_Boost_Regex) + debug_message( " [ OK ] lib ${LIB_Boost_Regex}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_Boost_Regex} ) + ELSE(LIB_Boost_Regex) + MESSAGE(WARNING " [FAILED] lib boost_regex-mt") + ENDIF(LIB_Boost_Regex) +ENDIF(UNIX) + +IF(WIN32) + OV_LINK_BOOST_LIB("regex" ${OV_WIN32_BOOST_VERSION}) +ENDIF(WIN32) diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyBoost_System.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyBoost_System.cmake new file mode 100644 index 0000000..9bd3813 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyBoost_System.cmake @@ -0,0 +1,23 @@ +# --------------------------------- +# Finds third party boost +# Adds library to target +# Adds include path +# --------------------------------- + + +IF(UNIX) + FIND_LIBRARY(LIB_Boost_System NAMES "boost_system-mt" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_System NAMES "boost_system-mt" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib) + FIND_LIBRARY(LIB_Boost_System NAMES "boost_system" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_System NAMES "boost_system" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib) + IF(LIB_Boost_System) + debug_message( " [ OK ] lib ${LIB_Boost_System}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_Boost_System} ) + ELSE(LIB_Boost_System) + MESSAGE(WARNING " [FAILED] lib boost_system-mt") + ENDIF(LIB_Boost_System) +ENDIF(UNIX) + +IF(WIN32) + OV_LINK_BOOST_LIB("system" ${OV_WIN32_BOOST_VERSION}) +ENDIF(WIN32) diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyBoost_Thread.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyBoost_Thread.cmake new file mode 100644 index 0000000..df7fbb8 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyBoost_Thread.cmake @@ -0,0 +1,44 @@ +# --------------------------------- +# Finds third party boost +# Adds library to target +# Adds include path +# --------------------------------- + +IF(UNIX) + FIND_LIBRARY(LIB_Boost_Thread NAMES "boost_thread-mt" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_Thread NAMES "boost_thread-mt" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib) + FIND_LIBRARY(LIB_Boost_Thread NAMES "boost_thread" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_Thread NAMES "boost_thread" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib) + IF(LIB_Boost_Thread) + debug_message( " [ OK ] lib ${LIB_Boost_Thread}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_Boost_Thread} ) + ELSE(LIB_Boost_Thread) + MESSAGE(WARNING " [FAILED] lib boost_thread-mt") + ENDIF(LIB_Boost_Thread) + + # For Fedora + FIND_LIBRARY(LIB_STANDARD_MODULE_PTHREAD pthread) + IF(LIB_STANDARD_MODULE_PTHREAD) + debug_message( " Found pthread...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_PTHREAD}) + ELSE(LIB_STANDARD_MODULE_PTHREAD) + MESSAGE(WARNING " FAILED to find pthread...") + ENDIF(LIB_STANDARD_MODULE_PTHREAD) + + # For Ubuntu 13.04 (interprocess/ipc/message_queue.hpp in ovasCPluginExternalStimulations.cpp caused dep) + IF(NOT APPLE) + FIND_LIBRARY(LIB_STANDARD_MODULE_RT rt) + IF(LIB_STANDARD_MODULE_RT) + debug_message( " Found rt...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_RT}) + ELSE(LIB_STANDARD_MODULE_RT) + MESSAGE(WARNING " FAILED to find rt...") + ENDIF(LIB_STANDARD_MODULE_RT) + ENDIF() + +ENDIF(UNIX) + +IF(WIN32) + OV_LINK_BOOST_LIB("thread" ${OV_WIN32_BOOST_VERSION}) +ENDIF(WIN32) + diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyEigen.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyEigen.cmake new file mode 100755 index 0000000..79c87f1 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyEigen.cmake @@ -0,0 +1,34 @@ +# --------------------------------- +# Finds Eigen headers +# +# Adds include path +# --------------------------------- + +IF(WIN32) + SET(PATH_EIGEN "PATH_EIGEN-NOTFOUND") + FIND_PATH(PATH_EIGEN Eigen/Eigen PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES eigen NO_DEFAULT_PATH) + IF(PATH_EIGEN) + SET(EIGEN_FOUND TRUE) + SET(EIGEN_INCLUDE_DIRS ${PATH_EIGEN}) + SET(EIGEN_CFLAGS "") + #SET(EIGEN_LIBRARIES_RELEASE EIGEN) + #SET(EIGEN_LIBRARIES_DEBUG EIGENd) + #SET(EIGEN_LIBRARY_DIRS ${PATH_EIGEN}/lib ) + ENDIF() +ENDIF() + +IF(UNIX) + INCLUDE("FindPkgConfig") + pkg_check_modules(EIGEN eigen3) +ENDIF() + +IF(EIGEN_FOUND) + debug_message(" Found eigen3...") + INCLUDE_DIRECTORIES("${EIGEN_INCLUDE_DIRS}") + ADD_DEFINITIONS(${EIGEN_CFLAGS}) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyEIGEN) +ELSE() + MESSAGE(WARNING " FAILED to find eigen3...") +ENDIF() + diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyExpat.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyExpat.cmake new file mode 100644 index 0000000..72267da --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyExpat.cmake @@ -0,0 +1,70 @@ +# --------------------------------- +# Finds EXPAT toolkit +# +# Sets EXPAT_FOUND +# Sets EXPAT_LIBRARIES +# Sets EXPAT_LIBRARY_DIRS +# Sets EXPAT_LDFLAGS +# Sets EXPAT_LDFLAGS_OTHERS +# Sets EXPAT_INCLUDE_DIRS +# Sets EXPAT_CFLAGS +# Sets EXPAT_CFLAGS_OTHERS +# --------------------------------- +IF(UNIX) + SET(EXPAT_expat_INCLUDE_PATH "EXPAT_expat_INCLUDE_PATH-NOTFOUND") + FIND_PATH(EXPAT_expat_INCLUDE_PATH "include/expat.h" + PATHS "${LIST_DEPENDENCIES_PATH}") + FIND_LIBRARY(EXPAT_expat_LIBRARY + NAMES lib/expat + PATHS "${LIST_DEPENDENCIES_PATH}") +ENDIF(UNIX) + +IF(WIN32) + SET(EXPAT_expat_INCLUDE_PATH "EXPAT_expat_INCLUDE_PATH-NOTFOUND") + FIND_PATH(EXPAT_expat_INCLUDE_PATH "expat/Source/libexpat.h" + PATHS "${LIST_DEPENDENCIES_PATH}") + FIND_LIBRARY(EXPAT_expat_LIBRARY + NAMES libexpat + PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES "expat/Libs" "expat/Bin") +ENDIF(WIN32) + +IF(EXPAT_expat_INCLUDE_PATH) +IF(EXPAT_expat_LIBRARY) + SET(EXPAT_FOUND TRUE) + SET(EXPAT_LIBRARIES ${EXPAT_expat_LIBRARY}) + SET(EXPAT_LIBRARY_DIRS "") + SET(EXPAT_LDFLAGS "") + SET(EXPAT_LDFLAGS_OTHERS "") + SET(EXPAT_INCLUDE_DIRS ${EXPAT_expat_INCLUDE_PATH}) + SET(EXPAT_CFLAGS "") + SET(EXPAT_CFLAGS_OTHERS "") +ENDIF(EXPAT_expat_LIBRARY) +ENDIF(EXPAT_expat_INCLUDE_PATH) + +MARK_AS_ADVANCED( + EXPAT_expat_INCLUDE_PATH + EXPAT_expat_LIBRARY + + EXPAT_FOUND + EXPAT_LIBRARIES + EXPAT_LIBRARY_DIRS + EXPAT_LDFLAGS + EXPAT_LDFLAGS_OTHERS + EXPAT_INCLUDE_DIRS + EXPAT_CFLAGS + EXPAT_CFLAGS_OTHERS +) + +IF(EXPAT_FOUND) + debug_message( " Found expat...") + INCLUDE_DIRECTORIES(${EXPAT_INCLUDE_DIRS}) + ADD_DEFINITIONS(${EXPAT_CFLAGS}) + ADD_DEFINITIONS(${EXPAT_CFLAGS_OTHERS}) + # LINK_DIRECTORIES(${EXPAT_LIBRARY_DIRS}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${EXPAT_LIBRARIES}) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyExpat) +ELSE(EXPAT_FOUND) + MESSAGE(WARNING " FAILED to find expat...") +ENDIF(EXPAT_FOUND) + diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyGSL.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyGSL.cmake new file mode 100644 index 0000000..bad2046 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyGSL.cmake @@ -0,0 +1,41 @@ +# --------------------------------- +# Finds GSL toolkit +# +# Sets GSL_FOUND +# Sets GSL_LIBRARIES +# Sets GSL_LIBRARY_DIRS +# Sets GSL_LDFLAGS +# Sets GSL_LDFLAGS_OTHERS +# Sets GSL_INCLUDE_DIRS +# Sets GSL_CFLAGS +# Sets GSL_CFLAGS_OTHERS +# +# Adds library to target +# Adds include path +# --------------------------------- + +INCLUDE("FindThirdPartyPkgConfig") +pkg_check_modules(GSL gsl) + +IF(GSL_FOUND) + debug_message(" Found gsl...") + INCLUDE_DIRECTORIES(${GSL_INCLUDE_DIRS}) + ADD_DEFINITIONS(${GSL_CFLAGS}) + ADD_DEFINITIONS(${GSL_CFLAGS_OTHERS}) + # LINK_DIRECTORIES(${GSL_LIBRARY_DIRS}) + FOREACH(GSL_LIB ${GSL_LIBRARIES}) + SET(GSL_LIB1 "GSL_LIB1-NOTFOUND") + FIND_LIBRARY(GSL_LIB1 NAMES ${GSL_LIB} PATHS ${GSL_LIBRARY_DIRS} ${GSL_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(GSL_LIB1 NAMES ${GSL_LIB}) + IF(GSL_LIB1) + debug_message(" [ OK ] Third party lib ${GSL_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${GSL_LIB1}) + ELSE(GSL_LIB1) + MESSAGE(WARNING " [FAILED] Third party lib ${GSL_LIB}") + ENDIF(GSL_LIB1) + ENDFOREACH(GSL_LIB) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyGSL) +ELSE(GSL_FOUND) + MESSAGE(WARNING " FAILED to find gsl...") +ENDIF(GSL_FOUND) diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyGTK.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyGTK.cmake new file mode 100644 index 0000000..fafb5e7 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyGTK.cmake @@ -0,0 +1,79 @@ +# --------------------------------- +# Finds GTK toolkit +# +# Sets GTK_FOUND +# Sets GTK_LIBRARIES +# Sets GTK_LIBRARY_DIRS +# Sets GTK_LDFLAGS +# Sets GTK_LDFLAGS_OTHERS +# Sets GTK_INCLUDE_DIRS +# Sets GTK_CFLAGS +# Sets GTK_CFLAGS_OTHERS +# --------------------------------- + +INCLUDE("FindPkgConfig") + +IF(WIN32) + pkg_check_modules(GTK gtk+-win32-2.0 gthread-2.0) +ELSE(WIN32) + pkg_check_modules(GTK "gtk+-2.0" "gthread-2.0") +ENDIF(WIN32) + +IF(${OV_DEPENDENCIES_PLATFORM_FOLDER_NAME} STREQUAL "dependencies") + SET(GTK_LIB_SUBFOLDER "2.10.0") + SET(LIB_Z_NAME "zdll") +ELSE() + SET(GTK_LIB_SUBFOLDER "i686-pc-vs10") + SET(LIB_Z_NAME "zlib1") +ENDIF() +IF(GTK_FOUND) + debug_message( " Found GTK+...") + # This is a bit convoluted way of finding zlib (because GTK_INCLUDE_DIRS + # is actually a list of folders, not a single one) + find_path(PATH_ZLIB gtk/include/zlib.h PATHS ${LIST_DEPENDENCIES_PATH} NO_DEFAULT_PATH) + INCLUDE_DIRECTORIES(${GTK_INCLUDE_DIRS} ${GTHREAD_INCLUDE_DIRS} "${PATH_ZLIB}/gtk/include") + #shouldn't add GTK_CFLAGS, this results in AdditionalIncludeDirectories becoming broken in visual studio + #ADD_DEFINITIONS(${GTK_CFLAGS} ${GTK_CFLAGS_OTHERS} ${GTHREAD_CFLAGS}${GTHREAD_CFLAGS_OTHERS}) + #LINK_DIRECTORIES(${GTK_LIBRARY_DIRS} ${GTHREAD_LIBRARY_DIRS}) + IF(WIN32) + SET( GTK_LIB_LIST ${GTK_LIBRARIES} ${GTHREAD_LIBRARIES} ${LIB_Z_NAME}) + ELSE(WIN32) + SET( GTK_LIB_LIST ${GTK_LIBRARIES} ${GTHREAD_LIBRARIES} z) + ENDIF(WIN32) + + IF(WIN32) + # gdi32.lib could be under the MS Windows SDK + INCLUDE("OvSetWindowsSDKPath") + INSTALL( + DIRECTORY ${GTK_LIBRARY_DIRS}/../bin/ + DESTINATION ${DIST_BINDIR} + FILES_MATCHING PATTERN "*.dll") + INSTALL( + DIRECTORY ${GTK_LIBRARY_DIRS}/gtk-2.0/${GTK_LIB_SUBFOLDER}/engines/ + DESTINATION ${DIST_LIBDIR}/gtk-2.0/${GTK_LIB_SUBFOLDER}/engines/ + FILES_MATCHING PATTERN "*.dll") + INSTALL( + FILES ${GTK_LIBRARY_DIRS}/..//etc/gtk-2.0/gtkrc + DESTINATION ${DIST_SYSCONFDIR}/gtk-2.0/) + ENDIF() + + FOREACH(GTK_LIB ${GTK_LIB_LIST}) + SET(GTK_LIB1 "GTK_LIB1-NOTFOUND") + FIND_LIBRARY(GTK_LIB1 NAMES ${GTK_LIB} PATHS ${GTK_LIBRARY_DIRS} ${GTK_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(GTK_LIB1 NAMES ${GTK_LIB} PATHS ${GTK_LIBRARY_DIRS} ${GTK_LIBDIR}) + IF(WIN32) + FIND_LIBRARY(GTK_LIB1 NAMES ${GTK_LIB} PATHS ${OV_MS_SDK_PATH}/lib) + ENDIF(WIN32) + IF(GTK_LIB1) + debug_message( " [ OK ] Third party lib ${GTK_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${GTK_LIB1}) + ELSE(GTK_LIB1) + MESSAGE(WARNING " [FAILED] Third party lib ${GTK_LIB}") + ENDIF(GTK_LIB1) + ENDFOREACH(GTK_LIB) +ELSE(GTK_FOUND) + MESSAGE(WARNING " FAILED to find GTK+...") + IF(NOT PKG_CONFIG_FOUND) + MESSAGE(WARNING " Did not even find pkg-config exe") + ENDIF(NOT PKG_CONFIG_FOUND) +ENDIF(GTK_FOUND) diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyOpenGL.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyOpenGL.cmake new file mode 100644 index 0000000..2e9ce09 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyOpenGL.cmake @@ -0,0 +1,54 @@ +# --------------------------------- +# Finds OpenGL toolkit +# +# Sets OpenGL_FOUND +# Sets OpenGL_LIBRARIES +# Sets OpenGL_LIBRARY_DIRS +# Sets OpenGL_LDFLAGS +# Sets OpenGL_LDFLAGS_OTHERS +# Sets OpenGL_INCLUDE_DIRS +# Sets OpenGL_CFLAGS +# Sets OpenGL_CFLAGS_OTHERS +# --------------------------------- + +IF(WIN32) + FIND_LIBRARY(LIB_STANDARD_MODULE_GL opengl32) + FIND_LIBRARY(LIB_STANDARD_MODULE_GLU glu32) + IF(LIB_STANDARD_MODULE_GL AND LIB_STANDARD_MODULE_GLU) + debug_message( " Found gl...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_GL}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_GLU}) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyOpenGL) + ELSE(LIB_STANDARD_MODULE_GL AND LIB_STANDARD_MODULE_GLU) + MESSAGE(WARNING " FAILED to find gl...") + ENDIF(LIB_STANDARD_MODULE_GL AND LIB_STANDARD_MODULE_GLU) +ELSE(WIN32) + INCLUDE("FindPkgConfig") + pkg_check_modules(OpenGL glu) + + IF(OpenGL_FOUND) + debug_message( " Found OpenGL...") + INCLUDE_DIRECTORIES(${OpenGL_INCLUDE_DIRS}) + ADD_DEFINITIONS(${OpenGL_CFLAGS}) + ADD_DEFINITIONS(${OpenGL_CFLAGS_OTHERS}) + LINK_DIRECTORIES(${OpenGL_LIBRARY_DIRS}) + IF(NOT(APPLE)) + LINK_DIRECTORIES(${OpenGL_LIBRARY_DIRS}/mesa) + ENDIF() + FOREACH(OpenGL_LIB ${OpenGL_LIBRARIES} z) + SET(OpenGL_LIB1 "OpenGL_LIB1-NOTFOUND") + FIND_LIBRARY(OpenGL_LIB1 NAMES ${OpenGL_LIB} PATHS ${OpenGL_LIBRARY_DIRS} ${OpenGL_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(OpenGL_LIB1 NAMES ${OpenGL_LIB} PATHS ${OpenGL_LIBRARY_DIRS}/mesa ${OpenGL_LIBDIR}/mesa NO_DEFAULT_PATH) + FIND_LIBRARY(OpenGL_LIB1 NAMES ${OpenGL_LIB}) + IF(OpenGL_LIB1) + debug_message( " [ OK ] Third party lib ${OpenGL_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OpenGL_LIB1}) + ELSE(OpenGL_LIB1) + MESSAGE(WARNING " [FAILED] Third party lib ${OpenGL_LIB}") + ENDIF(OpenGL_LIB1) + ENDFOREACH(OpenGL_LIB) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyOpenGL) + ELSE(OpenGL_FOUND) + MESSAGE(WARNING " FAILED to find OpenGL...") + ENDIF(OpenGL_FOUND) +ENDIF(WIN32) diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyX11.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyX11.cmake new file mode 100644 index 0000000..efc7346 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/FindThirdPartyX11.cmake @@ -0,0 +1,43 @@ +# --------------------------------- +# Finds X11 toolkit +# +# Sets X11_FOUND +# Sets X11_LIBRARIES +# Sets X11_LIBRARY_DIRS +# Sets X11_LDFLAGS +# Sets X11_LDFLAGS_OTHERS +# Sets X11_INCLUDE_DIRS +# Sets X11_CFLAGS +# Sets X11_CFLAGS_OTHERS +# --------------------------------- +IF(UNIX) + SET(OLD_CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH}) + IF(APPLE) + SET(CMAKE_PREFIX_PATH "/opt/X11") + ENDIF() + INCLUDE("FindPkgConfig") + pkg_check_modules(X11 x11) + + IF(X11_FOUND) + debug_message( " Found X11... ${X11_INCLUDE_DIRS}") + INCLUDE_DIRECTORIES(${X11_INCLUDE_DIRS}) + ADD_DEFINITIONS(${X11_CFLAGS}) + ADD_DEFINITIONS(${X11_CFLAGS_OTHERS}) + # LINK_DIRECTORIES(${X11_LIBRARY_DIRS}) + FOREACH(X11_LIB ${X11_LIBRARIES}) + SET(X11_LIB1 "X11_LIB1-NOTFOUND") + FIND_LIBRARY(X11_LIB1 NAMES ${X11_LIB} PATHS ${X11_LIBRARY_DIRS} ${X11_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(X11_LIB1 NAMES ${X11_LIB}) + IF(X11_LIB1) + debug_message( " [ OK ] Third party lib ${X11_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${X11_LIB1}) + ELSE(X11_LIB1) + MESSAGE(WARNING " [FAILED] Third party lib ${X11_LIB}") + ENDIF(X11_LIB1) + ENDFOREACH(X11_LIB) + ELSE(X11_FOUND) + MESSAGE(WARNING " FAILED to find X11...") + ENDIF(X11_FOUND) + + SET(CMAKE_PREFIX_PATH ${OLD_CMAKE_PREFIX_PATH}) +ENDIF(UNIX) diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/GenerateDocumentation.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/GenerateDocumentation.cmake new file mode 100644 index 0000000..2d95462 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/GenerateDocumentation.cmake @@ -0,0 +1,325 @@ +# Author Yann Renard / INRIA; Laurent Bonnet / Mensia Technologies +# Date 2008-10-15 +# Modified 2013-06-26 +# +# this CMake script iterates over several source documentation directories in +# order to compile it with doxygen. It has the ability to configure the +# doxyfile depending on some variables and to build documentation sources from +# computer generated templates (.dox-skeleton) and hand written documentation +# parts (.dox-part) + +IF(MENSIA_BUILD_DOC) + + # look for doxygen, if not present, no need to generate documentation + FIND_PROGRAM(doxygen_bin "doxygen" PATHS $ENV{OpenViBE_dependencies}/bin NO_DEFAULT_PATH) + FIND_PROGRAM(doxygen_bin "doxygen" PATHS $ENV{OpenViBE_dependencies}/bin "C:/Program Files/doxygen/bin" "C:/Program Files (x86)/doxygen/bin") + + IF(doxygen_bin) + debug_message( " Found doxygen...") + + #Set the project on which the documentation commands will be attached + SET(PROJECT_NAME_DOC ${PROJECT_NAME}-doc) + ADD_CUSTOM_TARGET(${PROJECT_NAME_DOC} ALL) + ADD_DEPENDENCIES(${PROJECT_NAME_DOC} ${PROJECT_NAME}) + + # intializes the variable that will be used in the doxyfile for input + # directories + # STRING(REPLACE "\\" "/" ov_doxy_input "\"$ENV{OpenViBE_base}/cmake-modules\"") + STRING(REPLACE "\\" "/" ov_doxy_input "\"${PROJECT_SOURCE_DIR}/src\"") + + # intializes the variable that will contain the list of resource files to + # copy to the target directory + SET(RESOURCE_FILES "") + SET(scenario_files "") + + # for each project, we look at its resources and store them in a list + # for each project, we look at partial documentation files (.dox-part) and + # parse them to get |ov[a-zA-Z0-9_]*_begin| or |ov[a-zA-Z0-9_]*_end| + # tokens. This tokens will later be included in the skeleton doxumentation + # files (.dox-skeleton) + SET(current_project_src "${PROJECT_SOURCE_DIR}/src") + + # updates the doxyfile variable for input directories + SET(ov_doxy_input "${ov_doxy_input} \"${current_project_src}\"") + debug_message( " [ OK ] Candidate directory found ${current_project_src}") + + # looks for resources and stores thm in a list + FILE(GLOB_RECURSE resource_files_tmp "${current_project_src}/*.png" "${current_project_src}/*.svg" "${current_project_src}/*.css" "${current_project_src}/*.php") + SET(RESOURCE_FILES ${RESOURCE_FILES} ${resource_files_tmp}) + + # looks for scenario files + FILE(GLOB_RECURSE scenario_files_tmp "${current_project_src}/*.xml") + SET(scenario_files ${scenario_files} ${scenario_files_tmp}) + + # looks for partial hand written documentation + FILE(GLOB_RECURSE doxs "${current_project_src}/*.dox-part") + FOREACH(dox ${doxs}) + GET_FILENAME_COMPONENT(dox_filename ${dox} NAME_WE) + debug_message( " Documentation part found ${dox}") + + SET(dox_tag_name NOTFOUND) + + # iterates on each line of the file to look after begin/end tags + # "dox_tag_name" stores the name of the variable + # to use to configure the skeleton file. It is computed from the + # begin tag. + FILE(READ ${dox} dox_lines) + # replaces empty cariage returns with semi colons to be compliant + # with CMake lists. note the space before and after the semi + # colon, this is for CMake not to skip empty lines + STRING(REPLACE "\n" " ; " dox_lines " ${dox_lines} ") + FOREACH(dox_line ${dox_lines}) + # this regex removes the spaces we added before the loop + STRING(REGEX REPLACE "^ (.*) $" "\\1" dox_line ${dox_line}) + + # we initialize several variables that will be used in + # this loop + SET(dox_line_processed FALSE) + SET(dox_tag_begin NOTFOUND) + SET(dox_tag_end NOTFOUND) + SET(dox_tag NOTFOUND) + + # and look for a new tag in this line + STRING(REGEX MATCH "\\|[a-zA-Z0-9_]*\\|" dox_tag "${dox_line}") + IF(dox_tag) + # a tag is found, so we want to know if it is a + # OVP_DocBegin* or OVP_DocEnd* tag + STRING(REGEX MATCH "\\|OVP_DocBegin_[a-zA-Z0-9_]*\\|" dox_tag_begin "${dox_line}") + STRING(REGEX MATCH "\\|OVP_DocEnd_[a-zA-Z0-9_]*\\|" dox_tag_end "${dox_line}") + + # in case we already have something in + # dox_tag_name, it means that begin tag has + # already been processed, so either we terminate with end + # tag, either we continue with come content to add in the + # variable + IF(dox_tag_name AND dox_tag_end) + # in case we find end tag, we just terminate cleaning + # the tag and what follows. We then terminate and + # create a new CMake variable with the content of this + # begin/end tagged things. + STRING(REGEX REPLACE ".*\\|OVP_DocEnd_([a-zA-Z0-9_]*)\\|.*" "\\1" dox_tag_name_check ${dox_line}) + STRING(REGEX REPLACE "\\|OVP_DocEnd_([a-zA-Z0-9_]*)\\|.*" "" dox_line "${dox_line}") + + debug_message( " - Completed tag pair |${dox_tag_name}|") + + SET(dox_tag_name_value "${dox_tag_name_value}\n${dox_line}") + SET("Doc_${dox_tag_name}_Content" ${dox_tag_name_value}) + SET(dox_tag_name NOTFOUND) + SET(dox_line_processed TRUE) + ENDIF(dox_tag_name AND dox_tag_end) + + # in case dox_tag_name is empty, it means + # that begin tag has not yet been found, so we just look at it + # or skip to next line + IF(NOT dox_tag_name AND dox_tag_begin) + # in case we find begin tag, we just start saving the + # CMake variable name, and clean the tag and what + # comes before. We then intialize the content of the + # begin/end tagged thing with what comes after begin + # tag. + STRING(REGEX REPLACE ".*\\|OVP_DocBegin_([a-zA-Z0-9_]*)\\|.*" "\\1" dox_tag_name ${dox_line}) + STRING(REGEX REPLACE ".*\\|OVP_DocBegin_([a-zA-Z0-9_]*)\\|" "" dox_line "${dox_line}") + SET(dox_tag_name_value "${dox_line}") + SET(dox_line_processed TRUE) + ENDIF(NOT dox_tag_name AND dox_tag_begin) + + # in case dox tag is not OVP_DocBegin* or OVP_DocEnd* + # just print a warning and continue + IF(NOT dox_line_processed) + MESSAGE(STATUS " - Unexpected tag ${dox_tag} will be ignored") + ENDIF(NOT dox_line_processed) + ENDIF(dox_tag) + + # in case this line was not processed, either because it does + # not have any tag, either because the tag was unexpected, we + # just append the whole line to the content of the current + # variable + IF(dox_tag_name AND NOT dox_line_processed) + # in case we don't find the end tag, just append this + # new line to the current content + SET(dox_tag_name_value "${dox_tag_name_value}\n${dox_line}") + ENDIF(dox_tag_name AND NOT dox_line_processed) + ENDFOREACH(dox_line) + + ENDFOREACH(dox) + + # now we have stored all the begin/end tagged things in variable, we just + # have to configure the skeleton configuration files with those variables. + # note that the skeleon files should be prepared to receive the CMake + # variables with @CMakeVariableName@ anywhere it is needed. + # + # in order to do so, we look after all the (.dox-skeleton) files and call + # the configure command to build the final documentation (.dox) file. + FILE(GLOB_RECURSE dox_skeletons "${PROJECT_SOURCE_DIR}/src/*.dox-skeleton") + FOREACH(dox_skeleton ${dox_skeletons}) + GET_FILENAME_COMPONENT(dox_skeleton_filename ${dox_skeleton} NAME_WE) + GET_FILENAME_COMPONENT(dox_skeleton_path ${dox_skeleton} PATH) + CONFIGURE_FILE( + "${dox_skeleton}" + "${dox_skeleton_path}/${dox_skeleton_filename}.dox" + @ONLY) + debug_message( " [ OK ] Configured skeleton ${dox_skeleton}") + ENDFOREACH(dox_skeleton) + + # now add post-build commands to copy resources in the target directory + IF(RESOURCE_FILES) + debug_message( " Found resources...") + FOREACH(current_resource ${RESOURCE_FILES}) + GET_FILENAME_COMPONENT(current_resource_stripped ${current_resource} NAME) + debug_message( " [ OK ] Resource file ${current_resource}") + ADD_CUSTOM_COMMAND( + TARGET ${PROJECT_NAME_DOC} + POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS -E copy_if_different "${current_resource}" "${PROJECT_SOURCE_DIR}/doc/${PROJECT_NAME}/html/${current_resource_stripped}" + COMMAND ${CMAKE_COMMAND} + ARGS -E copy_if_different "${current_resource}" "${PROJECT_SOURCE_DIR}/doc/${PROJECT_NAME}/latex/${current_resource_stripped}" + COMMENT " ---> [html/latex] Copying resource file ${current_resource_stripped}..." + VERBATIM) + ENDFOREACH(current_resource) + ENDIF(RESOURCE_FILES) + # now add post-build commands to copy scenario files in the target directory + IF(scenario_files) + debug_message( " Found scenario files...") + FOREACH(current_scenario ${scenario_files}) + GET_FILENAME_COMPONENT(current_scenario_stripped ${current_scenario} NAME) + debug_message( " [ OK ] scenario file ${current_scenario}") + ADD_CUSTOM_COMMAND( + TARGET ${PROJECT_NAME_DOC} + POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS -E copy_if_different "${current_scenario}" "${PROJECT_SOURCE_DIR}/doc/${PROJECT_NAME}/html/scenarios/${current_scenario_stripped}" + COMMAND ${CMAKE_COMMAND} + ARGS -E copy_if_different "${current_scenario}" "${PROJECT_SOURCE_DIR}/doc/${PROJECT_NAME}/latex/scenarios/${current_scenario_stripped}" + COMMENT " ---> [html/latex] Copying scenario file ${current_scenario_stripped}..." + VERBATIM) + ENDFOREACH(current_scenario) + # Saving all scenarios in a dedicated package + ADD_CUSTOM_COMMAND( + TARGET ${PROJECT_NAME_DOC} + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E tar cfz ${PROJECT_NAME_DOC}-scenarios.tar.gz scenarios + COMMAND ${CMAKE_COMMAND} ARGS -E copy ${PROJECT_NAME_DOC}-scenarios.tar.gz ${PROJECT_SOURCE_DIR}/doc/${PROJECT_NAME}/ + COMMAND ${CMAKE_COMMAND} ARGS -E remove ${PROJECT_NAME_DOC}-scenarios.tar.gz + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/doc/${PROJECT_NAME}/html" + COMMENT " ---> Packaging scenario files..." + VERBATIM) + ENDIF(scenario_files) + + # the final doxyfile filename is generated, platform compliantly + SET(ov_doxy_final "${PROJECT_SOURCE_DIR}/src/doc/doxyfile") + IF(WIN32) + STRING(REPLACE "/" "\\" ov_doxy_final ${ov_doxy_final}) + ENDIF(WIN32) + + # these lines configure the variables used to configure the doxyfile + SET(ov_doxy_strip_from_path ${ov_doxy_input}) + SET(ov_doxy_version ${PROJECT_VERSION}) + SET(ov_doxy_output_directory ../doc/${PROJECT_NAME}) + SET(ov_doxy_project_name ${PROJECT_NAME}-documentation) + + SET(ov_doxy_header_project_name ${PROJECT_NAME}-documentation) + SET(ov_doxy_header_version ${PROJECT_VERSION}) + SET(ov_doxy_header_branch ${PROJECT_BRANCH}) + SET(ov_doxy_header_hash ${PROJECT_COMMITHASH}) + IF(PROJECT_PRODUCT_NAME) + SET(ov_doxy_header_product_name ${PROJECT_PRODUCT_NAME}) + ELSE(PROJECT_PRODUCT_NAME) + SET(ov_doxy_header_product_name ${PROJECT_NAME}) + ENDIF(PROJECT_PRODUCT_NAME) + + debug_message( " Looking for additional documentation supports...") + # configure doxyfile to generate a chm if available + FIND_PROGRAM(HHC_BIN "hhc" PATHS "C:\Program Files\HTML Help Workshop" "C:\Program Files (x86)\HTML Help Workshop" NO_DEFAULT_PATH) + IF(HHC_BIN) + debug_message( " [ OK ] Found HHC, Windows help (.chm) file will be produced.") + SET(ov_doxy_generate_chm YES) + SET(ov_doxy_hhc_location "\"${HHC_BIN}\"") + SET(ov_doxy_chm_file "\"..\\${PROJECT_NAME}-doc.chm\"") + ELSE(HHC_BIN) + MESSAGE(WARNING " [FAILED] HHC not found, Windows help (.chm) file will not be produced.") + SET(ov_doxy_generate_chm NO) + ENDIF(HHC_BIN) + + # configure doxyfile to generate a latex->PDF file if available + FIND_PROGRAM(LATEX_BIN "latex") + IF(LATEX_BIN) + debug_message( " [ OK ] Found latex, a PDF file will be produced.") + SET(ov_doxy_generate_latex YES) + ELSE(LATEX_BIN) + MESSAGE(WARNING " [FAILED] Latex not found, PDF file will not be produced.") + SET(ov_doxy_generate_latex NO) + ENDIF(LATEX_BIN) + + # then the doxyfile is configured + CONFIGURE_FILE( + src/doc/doxyfile-skeleton + ${ov_doxy_final} + @ONLY) + # the latex header + CONFIGURE_FILE( + src/doc/header.tex-skeleton + ${PROJECT_SOURCE_DIR}/src/doc/header.tex + @ONLY) + # and the html header + CONFIGURE_FILE( + src/doc/header.html-skeleton + ${PROJECT_SOURCE_DIR}/src/doc/header.html + @ONLY) + + # and a post-build command is added in order to run doxygen + ADD_CUSTOM_COMMAND( + TARGET ${PROJECT_NAME_DOC} + POST_BUILD + # COMMAND ${CMAKE_COMMAND} ARGS -E make_directory ${PROJECT_NAME}/chm + COMMAND "${doxygen_bin}" -u "${ov_doxy_final}" && "${doxygen_bin}" "${ov_doxy_final}" + COMMAND ${CMAKE_COMMAND} ARGS -E tar cfz ${PROJECT_NAME}/${PROJECT_NAME_DOC}.tar.gz ${PROJECT_NAME}/html + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/doc" + COMMENT " ---> Running doxygen in [${PROJECT_SOURCE_DIR}/doc]..." + VERBATIM) + + # make the pdf from latex output + # latex2pdf.log will be actually removed only if make.bat returns successfully + # therefore any error will be readable in the log file. + IF(LATEX_BIN) + IF(WIN32) + ADD_CUSTOM_COMMAND( + TARGET ${PROJECT_NAME_DOC} + POST_BUILD + COMMAND "${PROJECT_SOURCE_DIR}/doc/${PROJECT_NAME}/latex/make.bat > ../latex2pdf.log" + COMMAND ${CMAKE_COMMAND} ARGS -E copy refman.pdf ../${PROJECT_NAME_DOC}.pdf + COMMAND ${CMAKE_COMMAND} ARGS -E remove ../latex2pdf.log + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/doc/${PROJECT_NAME}/latex" + COMMENT " ---> Latex 2 PDF..." + VERBATIM) + ELSE(WIN32) + ADD_CUSTOM_COMMAND( + TARGET ${PROJECT_NAME_DOC} + POST_BUILD + COMMAND make -C "${PROJECT_SOURCE_DIR}/doc/${PROJECT_NAME}/latex" > ../latex2pdf.log + COMMAND ${CMAKE_COMMAND} ARGS -E copy refman.pdf ../${PROJECT_NAME_DOC}.pdf + COMMAND ${CMAKE_COMMAND} ARGS -E remove ../latex2pdf.log + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/doc/${PROJECT_NAME}/latex" + COMMENT " ---> Latex 2 PDF..." + VERBATIM) + ENDIF(WIN32) + ENDIF(LATEX_BIN) + + # CLEANUP + ADD_CUSTOM_COMMAND( + TARGET ${PROJECT_NAME_DOC} + POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E remove_directory latex + COMMAND ${CMAKE_COMMAND} ARGS -E remove_directory html + COMMAND ${CMAKE_COMMAND} ARGS -E remove ../doxygen.log + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/doc/${PROJECT_NAME}" + COMMENT " ---> Cleaning up..." + VERBATIM) + + ELSE(doxygen_bin) + + MESSAGE(WARNING " FAILED to find doxygen...") + + ENDIF(doxygen_bin) + +ENDIF(MENSIA_BUILD_DOC) diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/GetCurrentVersion.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/GetCurrentVersion.cmake new file mode 100644 index 0000000..a0d0faf --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/GetCurrentVersion.cmake @@ -0,0 +1,19 @@ +# --------------------------------- +# create CMake variables that holds +# - latest git commit hash +# - branch name +# --------------------------------- + +# codename = the name of the current branch +EXECUTE_PROCESS(COMMAND git rev-parse --abbrev-ref HEAD + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + OUTPUT_VARIABLE PROJECT_BRANCH) +# command output may contain carriage return +STRING(REGEX REPLACE "\n" "" PROJECT_BRANCH "${PROJECT_BRANCH}") + +# commithash = short hash of latest revision +EXECUTE_PROCESS(COMMAND git rev-parse --short HEAD + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + OUTPUT_VARIABLE PROJECT_COMMITHASH) +# command output may contain carriage return +STRING(REGEX REPLACE "\n" "" PROJECT_COMMITHASH "${PROJECT_COMMITHASH}") diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/OvAddProjects.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/OvAddProjects.cmake new file mode 100644 index 0000000..570a4dc --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/OvAddProjects.cmake @@ -0,0 +1,134 @@ +# Adds the current project to the global properties +FUNCTION(OV_ADD_THIS_TO_PROJECT_LIST) + debug_message( "ADDING: ${CMAKE_CURRENT_SOURCE_DIR}") + + # Add the dir to be parsed for documentation later. We need to do this before adding subdir, in case the subdir is the actual docs dir + #GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS) + #SET(OV_TMP "${OV_TMP};${CMAKE_CURRENT_SOURCE_DIR}") + #SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS ${OV_TMP}) + IF(NOT MULTI_BUILD) + IF(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc AND NOT(${SKIP_DOC_OPENVIBE})) + FILE(COPY ${CMAKE_CURRENT_SOURCE_DIR}/doc/ DESTINATION ${DIST_DOCTMP}/openvibe FILES_MATCHING PATTERN "*.dox") + FILE(COPY ${CMAKE_CURRENT_SOURCE_DIR}/doc/ DESTINATION ${DIST_DOCTMP}/openvibe PATTERN "*.dox" EXCLUDE) + ENDIF() + + IF(IS_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/include) AND NOT(${SKIP_DOCUMENTATION}) AND NOT(${SKIP_DOC_OPENVIBE})) + FILE(APPEND "${DIST_DOCTMP}/openvibe/source-list.txt" "${CMAKE_CURRENT_SOURCE_DIR}/include\n") + ENDIF() + ENDIF() +ENDFUNCTION() + +FUNCTION(OV_SET_CUSTOM_DOCUMENTATION doc_project_name doc_product_name) + # skip_documentation is project-wide + IF(NOT(${SKIP_DOCUMENTATION})) + + debug_message( "CUSTOM DOCUMENTATION ENABLED FOR ${doc_project_name}") + SET(HAS_CUSTOM_DOCUMENTATION_${doc_project_name} "1" PARENT_SCOPE) + SET(CUSTOM_DOCUMENTATION_PRODUCT_NAME_${doc_project_name} "${doc_product_name}" PARENT_SCOPE) + + # if we need also the sources (e.g. the API is documented with doxygen) + SET(ADDITIONAL_FOLDERS_STRING_LIST "") + FOREACH(additional_cpp_source ${ARGN}) + SET(ADDITIONAL_FOLDERS_STRING_LIST "${ADDITIONAL_FOLDERS_STRING_LIST} ${CMAKE_CURRENT_SOURCE_DIR}/${doc_project_name}/${additional_cpp_source}") + ENDFOREACH() + SET(CUSTOM_DOCUMENTATION_CPP_SOURCES_${doc_project_name} "${ADDITIONAL_FOLDERS_STRING_LIST}" PARENT_SCOPE) + + + ENDIF() +ENDFUNCTION() + +# +# Adds all directories as subdirectories to the CMake build, using the branch specified (if any) in the root CMakeList.txt or +# trunk otherwise. +# +# The branch variable name that is checked is made up from ${CURRENT_BRANCH_PREFIX}_${DIRNAMEUPPER}. +# +# The script also adds the directory to the global list of projects. +# + +FUNCTION(OV_ADD_PROJECTS CURRENT_FOLDER_PREFIX) + + FILE(GLOB FILENAMES "*") + + FOREACH(FULLPATH ${FILENAMES}) + IF(IS_DIRECTORY ${FULLPATH} AND EXISTS "${FULLPATH}/CMakeLists.txt") + GET_FILENAME_COMPONENT(DIRNAME ${FULLPATH} NAME) + + STRING(TOUPPER ${DIRNAME} DIRNAMEUPPER) + SET(SKIP_THIS_FOLDER "SKIP_${CURRENT_FOLDER_PREFIX}_${DIRNAMEUPPER}") + SET(SKIP_THIS_CUSTOM_DOCUMENTATION "SKIP_DOC_${CURRENT_FOLDER_PREFIX}_${DIRNAMEUPPER}") + + debug_message( "Checking SKIP_${CURRENT_FOLDER_PREFIX}_${DIRNAMEUPPER} as branch var ${SKIP_THIS_FOLDER}") + + IF(${SKIP_THIS_FOLDER}) + debug_message( "Note: ${FULLPATH} has been skipped by setting SKIP_${CURRENT_FOLDER_PREFIX}_${DIRNAMEUPPER}") + ELSE() + debug_message( "Inserting folder ${FULLPATH}") + + # Add the dir to be parsed for documentation later. We need to do this before adding subdir, in case the subdir is the actual docs dir + GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS) + SET(OV_TMP "${OV_TMP};${FULLPATH}") + SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS ${OV_TMP}) + + SET(OV_CURRENT_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/${DIRNAME}") + GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS_BUILD_DIR) + SET(OV_TMP "${OV_TMP};${OV_CURRENT_BINARY_DIR}") + SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS_BUILD_DIR ${OV_TMP}) + + + SET(HAS_CUSTOM_DOCUMENTATION "HAS_CUSTOM_DOCUMENTATION_${DIRNAME}") + SET(CUSTOM_DOCUMENTATION_PRODUCT_NAME "CUSTOM_DOCUMENTATION_PRODUCT_NAME_${DIRNAME}") + SET(CUSTOM_DOCUMENTATION_CPP_SOURCES "${CUSTOM_DOCUMENTATION_CPP_SOURCES_${DIRNAME}}") + IF(NOT(${SKIP_DOCUMENTATION}) AND NOT(${SKIP_THIS_CUSTOM_DOCUMENTATION}) AND NOT MULTI_BUILD) + IF(NOT(${HAS_CUSTOM_DOCUMENTATION})) + IF(NOT(${SKIP_DOC_OPENVIBE})) + IF(IS_DIRECTORY ${FULLPATH}/doc) + debug_message( "Documentation files found in ${FULLPATH}/doc") + INSTALL(DIRECTORY ${FULLPATH}/doc/ DESTINATION ${DIST_DOCTMP}/openvibe/box-algorithm-doc/dox-part/ FILES_MATCHING PATTERN "*.dox-part") + INSTALL(DIRECTORY ${FULLPATH}/doc/ DESTINATION ${DIST_DOCTMP}/openvibe FILES_MATCHING PATTERN "*.dox") + INSTALL(DIRECTORY ${FULLPATH}/doc/ DESTINATION ${DIST_DOCTMP}/openvibe PATTERN "*.dox-part" EXCLUDE PATTERN "*.dox" EXCLUDE) + ENDIF() + + IF(IS_DIRECTORY ${FULLPATH}/include) + FILE(APPEND "${DIST_DOCTMP}/openvibe/source-list.txt" "${FULLPATH}/include\n") + ENDIF() + ENDIF() + ELSE() + debug_message( "Project ${DIRNAME} has custom documentation") + + # we copy the doc files into the temporary folder where everything is built thanks to a cmd script + IF(IS_DIRECTORY ${FULLPATH}/doc/) + FILE(COPY ${FULLPATH}/doc/ DESTINATION "${DIST_DOCTMP}/${DIRNAME}") + ENDIF() + + SET(DOC_PROJECT_NAME ${DIRNAME}) + SET(DOC_PROJECT_VERSION ${PROJECT_VERSION}) + SET(DOC_PROJECT_PRODUCT_NAME "${${CUSTOM_DOCUMENTATION_PRODUCT_NAME}}") + SET(DOC_PROJECT_COMMITHASH ${PROJECT_COMMITHASH}) + SET(DOC_PROJECT_BRANCH ${PROJECT_BRANCH}) + SET(DOC_PROJECT_CPP_SOURCES "${CUSTOM_DOCUMENTATION_CPP_SOURCES}") + + get_directory_property( DirDefs DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS ) + SET(DOC_DEFINES "") + foreach( d ${DirDefs} ) + #message( STATUS "Found Define: " ${d} ) + SET(DOC_DEFINES "${DOC_DEFINES} \\\\ \\n ${d}") + endforeach() + STRING(REPLACE "\"" "\\\"" DOC_DEFINES "${DOC_DEFINES}") + + #message( STATUS ${DOC_DEFINES} ) + + CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/documentation/src/build-documentation.cmake-skeleton" "${DIST_DOCTMP}/build-documentation-${DIRNAME}.cmake" @ONLY) + + FILE(APPEND "${DIST_DOCTMP}/build-documentation.cmd" + "cmake -P build-documentation-${DIRNAME}.cmake\n") + ENDIF() + ENDIF() + + add_subdirectory(${FULLPATH}) + + ENDIF() + ENDIF() + ENDFOREACH(FULLPATH ${FILENAMES}) + +ENDFUNCTION(OV_ADD_PROJECTS) diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/OvDelayLoad.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/OvDelayLoad.cmake new file mode 100644 index 0000000..5351775 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/OvDelayLoad.cmake @@ -0,0 +1,14 @@ +FUNCTION(OV_DELAY_LOAD TARGET DLL) + IF(WIN32) + UNSET(FN_LINK_FLAGS) + GET_TARGET_PROPERTY(FN_LINK_FLAGS ${TARGET} LINK_FLAGS) + IF(FN_LINK_FLAGS) + SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS "${FN_LINK_FLAGS} /DELAYLOAD:${DLL}") + ELSE(FN_LINK_FLAGS) + SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS "/DELAYLOAD:${DLL}") + ENDIF(FN_LINK_FLAGS) + TARGET_LINK_LIBRARIES(${TARGET} Delayimp) + ELSE(WIN32) + MESSAGE(WARNING "Ignored OV_DELAY_LOAD call on non WIN32 platform") + ENDIF(WIN32) +ENDFUNCTION(OV_DELAY_LOAD) diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/OvInstallLaunchScript.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/OvInstallLaunchScript.cmake new file mode 100644 index 0000000..60fd043 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/OvInstallLaunchScript.cmake @@ -0,0 +1,78 @@ +INCLUDE(CMakeParseArguments) +# +# Creates launch script from a common OpenViBE template (in "cmake-modules/launchers/"), but dedicated to scenarios to be executed with the Designer +# +# The mandatory 1st argument SCRIPT_PREFIX specifies what the resulting script is called. A platform specific postfix will be added. +# The mandatory 2nd argument EXECUTABLE_NAME specifies what the resulting script will called eventually. +# The optional 3nd argument ARGV1 specifies some extra argument or switch that is given to the launched executable by the script +# +FUNCTION(OV_INSTALL_LAUNCH_SCRIPT) + SET(options PAUSE NOPROJECT) + SET(oneValueArgs SCRIPT_PREFIX EXECUTABLE_NAME ICON_PATH) + SET(multiValueArgs PARAMETERS) + + CMAKE_PARSE_ARGUMENTS(OV_INSTALL_LAUNCH_SCRIPT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + OV_CONFIGURE_RC(NAME ${OV_INSTALL_LAUNCH_SCRIPT_SCRIPT_PREFIX} ICON_PATH ${OV_INSTALL_LAUNCH_SCRIPT_ICON_PATH}) + + # Install executable launcher if install_exe option is set to on, the os is WIN32, and no argument has been specified + IF(WIN32 AND INSTALL_EXE AND NOT(OV_INSTALL_LAUNCH_SCRIPT_PAUSE) AND NOT(OV_INSTALL_LAUNCH_SCRIPT_PARAMETERS)) + # Add the dir to be parsed for documentation later. We need to do this before adding subdir, in case the subdir is the actual docs dir + GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_EXE_PROJECTS_TO_INSTALL) + SET(OV_TMP "${OV_TMP};${OV_INSTALL_LAUNCH_SCRIPT_SCRIPT_PREFIX}") + SET_PROPERTY(GLOBAL PROPERTY OV_EXE_PROJECTS_TO_INSTALL ${OV_TMP}) + ELSE() + IF(WIN32) + SET(SCRIPT_POSTFIX ".cmd") + ELSEIF(APPLE) + SET(SCRIPT_POSTFIX "-macos.sh") + ELSEIF(UNIX) + # Debian recommends that extensions such as .sh are not used; On Linux, scripts with such extensions shouldn't be packaged + SET(SCRIPT_POSTFIX ".sh") + ENDIF() + # Extract the filename of the project executable, the variable in the script base will be replaced with it by CONFIGURE_FILE() + IF(NOT OV_INSTALL_LAUNCH_SCRIPT_NOPROJECT) + GET_TARGET_PROPERTY(TMP_PROJECT_TARGET_PATH ${OV_INSTALL_LAUNCH_SCRIPT_EXECUTABLE_NAME} LOCATION) + GET_FILENAME_COMPONENT(OV_CMD_EXECUTABLE ${TMP_PROJECT_TARGET_PATH} NAME) + ENDIF() + IF(${OV_CMD_EXECUTABLE} STREQUAL "TMP_PROJECT_TARGET_PATH-NOTFOUND") + SET(OV_CMD_EXECUTABLE ${OV_INSTALL_LAUNCH_SCRIPT_EXECUTABLE_NAME}) + ELSE() + IF(WIN32) + SET(OV_CMD_EXECUTABLE "%OV_PATH_ROOT%/bin/${OV_CMD_EXECUTABLE}") + ENDIF() + ENDIF() + + SET(SCRIPT_NAME ${OV_INSTALL_LAUNCH_SCRIPT_SCRIPT_PREFIX}${SCRIPT_POSTFIX}) + SET(OV_CMD_ARGS ${OV_INSTALL_LAUNCH_SCRIPT_PARAMETERS}) + + IF(OV_INSTALL_LAUNCH_SCRIPT_PAUSE) + SET(OV_PAUSE "PAUSE") + ELSE() + SET(OV_PAUSE "") + ENDIF() + + CONFIGURE_FILE(${OV_LAUNCHER_SOURCE_PATH}/openvibe-launcher${SCRIPT_POSTFIX}-base ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} @ONLY) + INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} DESTINATION ${DIST_ROOT}) + ENDIF() +ENDFUNCTION() + +FUNCTION(OV_CONFIGURE_RC) + SET(options ) + SET(oneValueArgs NAME ICON_PATH) + SET(multiValueArgs ) + CMAKE_PARSE_ARGUMENTS(OV_CONFIGURE_RC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + SET(GENERATED_RC_FILE "${CMAKE_BINARY_DIR}/resource-files/${OV_CONFIGURE_RC_NAME}.rc") + IF(OV_CONFIGURE_RC_ICON_PATH) + SET(CONFIGURE_ICON "ID_Icon ICON DISCARDABLE \"${OV_CONFIGURE_RC_ICON_PATH}\"") + ENDIF() + IF(NOT(PROJECT_PRODUCT_NAME)) + SET(PROJECT_PRODUCT_NAME "${OV_CONFIGURE_RC_NAME}") + ENDIF() + SET(FILE_DESCRIPTION "${PROJECT_PRODUCT_NAME} for Win32") + + CONFIGURE_FILE( + ${OV_LAUNCHER_SOURCE_PATH}/resource-file.rc-base + ${GENERATED_RC_FILE} + @ONLY) +ENDFUNCTION() diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/OvLinkBoostLib.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/OvLinkBoostLib.cmake new file mode 100644 index 0000000..b4e527c --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/OvLinkBoostLib.cmake @@ -0,0 +1,55 @@ +# +# Win32 only +# +# This concoction mainly exists to locate the boost libraries on WIN32 in the case where our dependency/ folder has only a +# truncated version of boost and we cannot use find_package(). The background story is that we wish to link explicitly +# instead of using automatic linking and specifying a generic boost path to linker before each project definition. +# +# The downside of this is that it assumes the boost library names to have a particular format and only works for VC90/VC100 +# +# Function: Links specified boost library defined by COMPONENT and BOOST_VERSION to PROJECT_NAME. +# + +FUNCTION(OV_LINK_BOOST_LIB BOOST_COMPONENT BOOST_VERSION) + +IF(WIN32) + IF(MSVC) + IF(MSVC_VERSION EQUAL 1500) # vc9 + SET(LIB_BOOST "libboost_${BOOST_COMPONENT}-vc90-mt-${BOOST_VERSION}.lib") + SET(LIB_BOOST_DEBUG "libboost_${BOOST_COMPONENT}-vc90-mt-gd-${BOOST_VERSION}.lib") + ELSEIF(MSVC_VERSION EQUAL 1600) # vc 10 + SET(LIB_BOOST "libboost_${BOOST_COMPONENT}-vc100-mt-${BOOST_VERSION}.lib") + SET(LIB_BOOST_DEBUG "libboost_${BOOST_COMPONENT}-vc100-mt-gd-${BOOST_VERSION}.lib") + ELSEIF(MSVC_VERSION EQUAL 1700) # vc 11 + SET(LIB_BOOST "libboost_${BOOST_COMPONENT}-vc110-mt-${BOOST_VERSION}.lib") + SET(LIB_BOOST_DEBUG "libboost_${BOOST_COMPONENT}-vc110-mt-gd-${BOOST_VERSION}.lib") + ELSEIF(MSVC_VERSION EQUAL 1800) # vc12 + SET(LIB_BOOST "libboost_${BOOST_COMPONENT}-vc120-mt-${BOOST_VERSION}.lib") + SET(LIB_BOOST_DEBUG "libboost_${BOOST_COMPONENT}-vc120-mt-gd-${BOOST_VERSION}.lib") + ENDIF(MSVC_VERSION EQUAL 1500) + ENDIF(MSVC) + + SET(LIB_BOOST_PATH "-NOTFOUND") + FIND_LIBRARY(LIB_BOOST_PATH NAMES boost/lib/${LIB_BOOST} PATHS ${LIST_DEPENDENCIES_PATH} NO_DEFAULT_PATH) + IF(LIB_BOOST_PATH) + debug_message( " [ OK ] lib ${LIB_BOOST_PATH}") + IF(TARGET ${PROJECT_NAME}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} optimized ${LIB_BOOST_PATH}) + ENDIF() + ELSE(LIB_BOOST_PATH) + MESSAGE(WARNING " Unable to find boost ${LIB_BOOST}") + ENDIF(LIB_BOOST_PATH) + + SET(LIB_BOOST_DEBUG_PATH "-NOTFOUND") + FIND_LIBRARY(LIB_BOOST_DEBUG_PATH NAMES boost/lib/${LIB_BOOST_DEBUG} PATHS ${LIST_DEPENDENCIES_PATH} NO_DEFAULT_PATH) + IF(LIB_BOOST_DEBUG_PATH) + debug_message( " [ OK ] lib ${LIB_BOOST_DEBUG_PATH}") + IF(TARGET ${PROJECT_NAME}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${LIB_BOOST_DEBUG_PATH}) + ENDIF() + ELSE(LIB_BOOST_DEBUG_PATH) + MESSAGE(WARNING " Unable to find boost ${LIB_BOOST_DEBUG}") + ENDIF(LIB_BOOST_DEBUG_PATH) +ENDIF(WIN32) + +ENDFUNCTION(OV_LINK_BOOST_LIB) diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/OvSetWindowsSDKPath.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/OvSetWindowsSDKPath.cmake new file mode 100644 index 0000000..f451ab3 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/OvSetWindowsSDKPath.cmake @@ -0,0 +1,17 @@ + +IF(NOT OV_MS_SDK_PATH) + GET_FILENAME_COMPONENT(OV_MS_SDK_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Win32SDK\\Directories;Install Dir]" ABSOLUTE CACHE) +ENDIF(NOT OV_MS_SDK_PATH) + +IF(NOT OV_MS_SDK_PATH) + GET_FILENAME_COMPONENT(OV_MS_SDK_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MicrosoftSDK\\Directories;Install Dir]" ABSOLUTE CACHE) +ENDIF(NOT OV_MS_SDK_PATH) + +IF(NOT OV_MS_SDK_PATH) + GET_FILENAME_COMPONENT(OV_MS_SDK_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]" ABSOLUTE CACHE) +ENDIF(NOT OV_MS_SDK_PATH) + +IF(NOT OV_MS_SDK_PATH) + MESSAGE(WARNING "Could not find Microsoft Windows SDK") +ENDIF(NOT OV_MS_SDK_PATH) + diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/SetProjectVersion.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/SetProjectVersion.cmake new file mode 100644 index 0000000..5cf95fc --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/SetProjectVersion.cmake @@ -0,0 +1,41 @@ +function(SET_PROJECT_VERSION) + find_file(OVSDK_DOTINSTALL NAMES .install PATHS ${OPENVIBE_SDK_PATH} NO_DEFAULT_PATH) + if(CMAKE_BUILD_TYPE) + string(TOLOWER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_LOWER) + find_file(OVSDK_DOTINSTALL NAMES .install PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES openvibe-sdk-${CMAKE_BUILD_TYPE_LOWER} NO_DEFAULT_PATH) + else() + find_file(OVSDK_DOTINSTALL NAMES .install PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES openvibe-sdk-release openvibe-sdk-debug NO_DEFAULT_PATH) + endif() + + file(STRINGS ${OVSDK_DOTINSTALL} ov_sdk_install_manifest) + foreach(NameAndValue ${ov_sdk_install_manifest}) + string(STRIP NameAndValue ${NameAndValue}) + string(REGEX MATCH "^[^=]+" Name ${NameAndValue}) + string(REPLACE "${Name}=" "" Value ${NameAndValue}) + if(${Name} STREQUAL "[Version]") + set(OV_SDK_VERSION_STRING "${Value}" PARENT_SCOPE) + endif() + endforeach() + + set(OV_GLOBAL_VERSION_MAJOR ${PROJECT_VERSION_MAJOR} PARENT_SCOPE) + set(OV_GLOBAL_VERSION_MINOR ${PROJECT_VERSION_MINOR} PARENT_SCOPE) + set(OV_GLOBAL_VERSION_PATCH ${PROJECT_VERSION_PATCH} PARENT_SCOPE) + set(OV_GLOBAL_VERSION_BUILD ${PROJECT_VERSION_BUILD} PARENT_SCOPE) + set(OV_GLOBAL_VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_BUILD}" PARENT_SCOPE) + set(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} PARENT_SCOPE) + + set(OV_PROJECT_BRANCH ${PROJECT_BRANCH} PARENT_SCOPE) + set(OV_PROJECT_COMMITHASH ${PROJECT_COMMITHASH} PARENT_SCOPE) + + # Write version to .install file + string(TIMESTAMP BUILD_DATE "%d/%m/%y %H:%M:%S") + set(INSTALL_MANIFEST_STR "[Package]=${PROJECT_NAME}\ +\n[Version]=${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_BUILD}\ +\n[BuildHash]=${PROJECT_COMMITHASH}\ +\n[BuildBranch]=${PROJECT_BRANCH}\ +\n[BuildDate]=${BUILD_DATE}" + ) + file(WRITE ${CMAKE_BINARY_DIR}/.install "${INSTALL_MANIFEST_STR}") + +endfunction(SET_PROJECT_VERSION) + diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/SkipEverything.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/SkipEverything.cmake new file mode 100644 index 0000000..2d13ae7 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/SkipEverything.cmake @@ -0,0 +1,23 @@ +# This file should be included "as is" inside a child scope of the main CMakeFiles.txt + +# By default we do not use the launcher +SET(INSTALL_EXE OFF PARENT_SCOPE) + +SET(SKIP_DOCUMENTATION ON PARENT_SCOPE) +SET(SKIP_DOC_OPENVIBE ON PARENT_SCOPE) +SET(SKIP_DOC_MODULES_EBML ON PARENT_SCOPE) + +SET(SKIP_APPLICATIONS_DEMOS_VR-DEMOS ON PARENT_SCOPE) +SET(SKIP_APPLICATIONS_DEMOS_SSVEP-DEMO ON PARENT_SCOPE) + +SET(SKIP_EXTERNALS_MENSIA_ADVANCED_SIGNAL_PROCESSING_TOOLS ON PARENT_SCOPE) + +SET(MENSIA_ADVANCED_SIGNAL_PROCESSING_TOOLS_EXPERIMENTAL OFF) + +SET(MENSIA_ADVANCED_VISUALIZATION_EXPERIMENTAL OFF) + +# OPENVIBE + +SET(SKIP_APPLICATIONS_PLATFORM_DESIGNER ON PARENT_SCOPE) + +SET(SKIP_PLUGINS_PROCESSING_SIMPLE-VISUALISATION ON PARENT_SCOPE) diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/Utilities.cmake b/Masterarbeit/openvibe/designer-master/cmake-modules/Utilities.cmake new file mode 100644 index 0000000..ead292f --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/Utilities.cmake @@ -0,0 +1,120 @@ +function(debug_message) + if(${Flag_VerboseOutput}) + message(STATUS "${ARGV}") + endif() +endfunction() + +# SET(OV_COMPILE_TESTS "true") +FUNCTION(SET_BUILD_PLATFORM) + IF("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + ADD_DEFINITIONS(-DTARGET_ARCHITECTURE_x64) + ELSEIF("${CMAKE_SIZEOF_VOID_P}" EQUAL "4") + ADD_DEFINITIONS(-DTARGET_ARCHITECTURE_i386) + ELSE() + ADD_DEFINITIONS(-DTARGET_ARCHITECTURE_Unknown) + ENDIF() + + IF(WIN32) + ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE) + ADD_DEFINITIONS(-DTARGET_OS_Windows) + ADD_DEFINITIONS(-DTARGET_COMPILER_VisualStudio) + ELSEIF(APPLE) + ADD_DEFINITIONS(-fnon-call-exceptions) + ADD_DEFINITIONS(-DTARGET_OS_MacOS) + # ADD_DEFINITIONS(-DTARGET_ARCHITECTURE_x64) + ADD_DEFINITIONS(-DTARGET_COMPILER_LLVM) + ELSEIF(UNIX) + # ADD_DEFINITIONS(-fvisibility=hidden) # This flag should be present... man gcc + ADD_DEFINITIONS(-fnon-call-exceptions) + ADD_DEFINITIONS(-DTARGET_OS_Linux) + ADD_DEFINITIONS(-DTARGET_COMPILER_GCC) + ENDIF() + +ENDFUNCTION() + +# Set version based on git tag. +# If current commit is tagged, use the tag as it is, and add build number based on content of .build file, written by Jenkins +# Else use last tag major and minor number and set patch number to 99 +# +# This function should remain generic to be usable in every projects. +function(set_version) + find_package(Git) + if(EXISTS ${CMAKE_SOURCE_DIR}/.version) + + # These versions are used by the subprojects by default. + # If you wish to maintain specific version numbers for a subproject, please do so in the projects CMakeLists.txt + file(READ ${CMAKE_SOURCE_DIR}/.version PROJECT_VERSION) + string(STRIP ${PROJECT_VERSION} PROJECT_VERSION) + string(REPLACE "." ";" VERSION_LIST ${PROJECT_VERSION}) + list(GET VERSION_LIST 0 PROJECT_VERSION_MAJOR) + list(GET VERSION_LIST 1 PROJECT_VERSION_MINOR) + list(GET VERSION_LIST 2 PROJECT_VERSION_PATCH) + + elseif(NOT GIT_FOUND) + message(WARNING "Git not found, set version to 0.0.0") + set(PROJECT_VERSION "0.0.0") + set(PROJECT_BRANCH_STRING "unknown") + set(PROJECT_COMMITHASH_STRING "0") + else() + debug_message("Found Git: ${GIT_EXECUTABLE}") + execute_process(COMMAND ${GIT_EXECUTABLE} describe + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + OUTPUT_VARIABLE PROJECT_VERSION + ERROR_VARIABLE ERROR) + if(ERROR) + message(WARNING "No tags found, set version to 0.0.0") + set(PROJECT_VERSION "0.0.0") + set(PROJECT_BRANCH_STRING "unknown") + set(PROJECT_COMMITHASH_STRING "0") + else() + # codename = the name of the current branch + execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE PROJECT_BRANCH_STRING) + # command output may contain carriage return + string(STRIP ${PROJECT_BRANCH_STRING} PROJECT_BRANCH_STRING) + + # commithash = short hash of latest revision + execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE PROJECT_COMMITHASH_STRING) + # command output may contain carriage return + string(STRIP ${PROJECT_COMMITHASH_STRING} PROJECT_COMMITHASH_STRING) + endif() + endif() + + # if current commit is not tagged result is formed as: "major.minor.patch-number of commits since last tag-hash" + string(STRIP ${PROJECT_VERSION} PROJECT_VERSION) + string(REPLACE "-" ";" version_list ${PROJECT_VERSION}) + list(LENGTH version_list version_list_length) + if(${version_list_length} EQUAL 3) # if result is formed as "major.minor.patch-number of commits since last tag-hash" set patch as 99 + list(GET version_list 0 PROJECT_VERSION) + set(PROJECT_VERSION_PATCH 99) + endif() + + string(REPLACE "." ";" version_list ${PROJECT_VERSION}) + list(GET version_list 0 PROJECT_VERSION_MAJOR) + list(GET version_list 1 PROJECT_VERSION_MINOR) + if(NOT PROJECT_VERSION_PATCH) + list(GET version_list 2 PROJECT_VERSION_PATCH) + endif() + + # These versions are used by the subprojects by default. + # If you wish to maintain specific version numbers for a subproject, please do so in the projects CMakeLists.txt + if(EXISTS ${CMAKE_SOURCE_DIR}/.build) + file(READ ${CMAKE_SOURCE_DIR}/.build PROJECT_VERSION_BUILD) + string(STRIP ${PROJECT_VERSION_BUILD} PROJECT_VERSION_BUILD) + else() + set(PROJECT_VERSION_BUILD 0) + endif() + + set(PROJECT_BRANCH ${PROJECT_BRANCH_STRING} PARENT_SCOPE) + set(PROJECT_COMMITHASH ${PROJECT_COMMITHASH_STRING} PARENT_SCOPE) + + set(PROJECT_VERSION_MAJOR ${PROJECT_VERSION_MAJOR} PARENT_SCOPE) + set(PROJECT_VERSION_MINOR ${PROJECT_VERSION_MINOR} PARENT_SCOPE) + set(PROJECT_VERSION_PATCH ${PROJECT_VERSION_PATCH} PARENT_SCOPE) + set(PROJECT_VERSION_BUILD ${PROJECT_VERSION_BUILD} PARENT_SCOPE) + set(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} PARENT_SCOPE) +endfunction() + diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/launchers/openvibe-launcher-macos.sh-base b/Masterarbeit/openvibe/designer-master/cmake-modules/launchers/openvibe-launcher-macos.sh-base new file mode 100644 index 0000000..c20944b --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/launchers/openvibe-launcher-macos.sh-base @@ -0,0 +1,63 @@ +#!/bin/bash + +## By default, paths specified by CMake install will be used to locate OpenViBE components. If defined, these ENV variables can override the CMake defines. +#export OV_PATH_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +#export OV_PATH_BIN="$OV_PATH_ROOT/bin" +#export OV_PATH_LIB="$OV_PATH_ROOT/lib" +#export OV_PATH_DATA="$OV_PATH_ROOT/share/openvibe" + +# Tries to locate matlab executable from $PATH, and set the library path to the corresponding matlab libs. +if [ "`which matlab`" != "" ] ; then + MATLAB_ROOT=`matlab -e | grep "^MATLAB=" | sed -e "s/^MATLAB=//"` + MATLAB_ARCH=`matlab -e | grep "^ARCH=" | sed -e "s/^ARCH=//"` + MATLAB_LIBPATH="$MATLAB_ROOT/bin/$MATLAB_ARCH" + # echo Matlab libs expected at $MATLAB_LIBPATH + export DYLD_LIBRARY_PATH="$MATLAB_LIBPATH:$DYLD_LIBRARY_PATH" +fi + +if [ "$OV_PATH_BIN" == "" ]; then + OV_PATH_BIN="@CMAKE_INSTALL_FULL_BINDIR@" +fi +if [ "$OV_PATH_LIB" == "" ]; then + OV_PATH_LIB="@CMAKE_INSTALL_FULL_LIBDIR@" +fi +if [ "$OV_PATH_DATA" == "" ]; then + OV_PATH_DATA="@CMAKE_INSTALL_FULL_DATADIR@" +fi +# if [ "$MENSIA_PATH_DATA" == "" ]; then +# MENSIA_PATH_DATA="@CMAKE_INSTALL_FULL_DATADIR@" +# fi + +export DYLD_LIBRARY_PATH="$OV_PATH_LIB:@CMAKE_SOURCE_DIR@/dependencies/lib:$DYLD_LIBRARY_PATH" +export LC_ALL=C + +export GTK_PATH=/usr/local/lib/gtk-2.0 + +export LUA_CPATH="$OV_PATH_LIB/lib?.dylib;`echo 'print(package.cpath)' | lua - `" +export LUA_PATH="$OV_PATH_BIN/?.lua;`echo 'print(package.path)' | lua - `" + +# The following line is there to help in cases where OpenViBE can consume excessive +# amounts of CPU or grind the swap. You can remove it if you know what you're doing. +renice 19 $$ + +ov_debugger= +if [ "$1" == "--debug" ]; then + ov_debugger="gdb --args" + shift +fi +ov_run_bg=0 +if [ "$1" == "--run-bg" ]; then + ov_run_bg=1 + shift +fi + +ret_code=0 + +if [ $ov_run_bg == 0 ]; then + eval $ov_debugger "$OV_PATH_BIN/@OV_CMD_EXECUTABLE@" @OV_CMD_ARGS@ $* + ret_code=$? +else + $ov_debugger "$OV_PATH_BIN/@OV_CMD_EXECUTABLE@" @OV_CMD_ARGS@ $* & +fi + +exit $ret_code diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/launchers/openvibe-launcher.cmd-base b/Masterarbeit/openvibe/designer-master/cmake-modules/launchers/openvibe-launcher.cmd-base new file mode 100644 index 0000000..98853a2 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/launchers/openvibe-launcher.cmd-base @@ -0,0 +1,53 @@ +@ECHO OFF +SETLOCAL EnableDelayedExpansion +SETLOCAL EnableExtensions + +REM Get the directory location of this script, assume it contains the OpenViBE dist tree. These variables will be used by OpenViBE executables. +SET "OV_PATH_ROOT=%~dp0" +SET "OV_PATH_BIN=%OV_PATH_ROOT%\bin" +SET "OV_PATH_LIB=%OV_PATH_ROOT%\bin" +SET "OV_PATH_DATA=%OV_PATH_ROOT%\share\openvibe" +SET "MENSIA_PATH_DATA=%OV_PATH_ROOT%\share\mensia" + +SET OV_PAUSE=@OV_PAUSE@ +SET OV_RUN_IN_BG= + +IF /i "%1"=="--no-pause" ( + SET OV_PAUSE= + SHIFT +) +IF /i "%1"=="--pause" ( + SET OV_PAUSE=PAUSE + SHIFT +) +IF /i "%1"=="--run-bg" ( + REM Run in background, disable pause. The first start arg is the app title. + SET OV_RUN_IN_BG=START "@OV_CMD_EXECUTABLE@" + SET OV_PAUSE= + SHIFT +) + +SET LUA_EXE_PATH= +FOR %%F IN (lua.exe) DO ( + SET LUA_EXE_PATH_FULL=%%~$PATH:F + SET LUA_EXE_PATH=!LUA_EXE_PATH_FULL:lua.exe=! +) + +SET PATH=%OV_PATH_LIB%;%PATH% +SET LUA_CPATH=%LUA_CPATH%;%LUA_EXE_PATH%\clibs\?.dll;%OV_PATH_ROOT%\bin\?.dll +SET LUA_PATH=%LUA_PATH%;%LUA_EXE_PATH%\lua\?.lua;%OV_PATH_ROOT%\bin\?.lua + +REM get the arguments +REM this allows to build the full argument list (even when # > 9) +REM %* is not modifed by SHIFT +SET "args=" +:getArgs +IF "%~1" NEQ "" ( + SET args=%args% %1 + SHIFT + goto :getArgs +) + +%OV_RUN_IN_BG% "@OV_CMD_EXECUTABLE@" @OV_CMD_ARGS@ %args% + +%OV_PAUSE% diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/launchers/openvibe-launcher.sh-base b/Masterarbeit/openvibe/designer-master/cmake-modules/launchers/openvibe-launcher.sh-base new file mode 100644 index 0000000..af37286 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/launchers/openvibe-launcher.sh-base @@ -0,0 +1,62 @@ +#!/bin/bash + +## By default, paths specified by CMake install will be used to locate OpenViBE components. If defined, these ENV variables can override the CMake defines. +#export OV_PATH_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +#export OV_PATH_BIN="$OV_PATH_ROOT/bin" +#export OV_PATH_LIB="$OV_PATH_ROOT/lib" +#export OV_PATH_DATA="$OV_PATH_ROOT/share/openvibe" +#export MENSIA_PATH_DATA="$OV_PATH_ROOT/share/mensia" + +# Tries to locate matlab executable from $PATH, and set the library path to the corresponding matlab libs. +if [ "`which matlab`" != "" ] ; then + MATLAB_ROOT=`matlab -e | grep "^MATLAB=" | sed -e "s/^MATLAB=//"` + MATLAB_ARCH=`matlab -e | grep "^ARCH=" | sed -e "s/^ARCH=//"` + MATLAB_LIBPATH="$MATLAB_ROOT/bin/$MATLAB_ARCH" + # echo Matlab libs expected at $MATLAB_LIBPATH + LD_LIBRARY_PATH="$MATLAB_LIBPATH:$LD_LIBRARY_PATH" +fi + +if [ "$OV_PATH_BIN" == "" ]; then + export OV_PATH_BIN="@CMAKE_INSTALL_FULL_BINDIR@" +fi +if [ "$OV_PATH_LIB" == "" ]; then + export OV_PATH_LIB="@CMAKE_INSTALL_FULL_LIBDIR@" +fi +if [ "$OV_PATH_DATA" == "" ]; then + export OV_PATH_DATA="@CMAKE_INSTALL_FULL_DATADIR@/openvibe" +fi +if [ "$MENSIA_PATH_DATA" == "" ]; then + export MENSIA_PATH_DATA="@CMAKE_INSTALL_FULL_DATADIR@/mensia" +fi + +export LD_LIBRARY_PATH="$OV_PATH_LIB:@CMAKE_SOURCE_DIR@/dependencies/lib:$LD_LIBRARY_PATH" +export LC_ALL=C + +export LUA_CPATH="$OV_PATH_LIB/lib?.so;`echo 'print(package.cpath)' | lua - `" +export LUA_PATH="$OV_PATH_BIN/?.lua;`echo 'print(package.path)' | lua - `" + +# The following line is there to help in cases where OpenViBE can consume excessive +# amounts of CPU or grind the swap. You can remove it if you know what you're doing. +renice 19 $$ + +ov_debugger= +if [ "$1" == "--debug" ]; then + ov_debugger="gdb --args" + shift +fi +ov_run_bg=0 +if [ "$1" == "--run-bg" ]; then + ov_run_bg=1 + shift +fi + +ret_code=0 + +if [ $ov_run_bg == 0 ]; then + eval $ov_debugger "$OV_PATH_BIN/@OV_CMD_EXECUTABLE@" @OV_CMD_ARGS@ $* + ret_code=$? +else + $ov_debugger "$OV_PATH_BIN/@OV_CMD_EXECUTABLE@" @OV_CMD_ARGS@ $* & +fi + +exit $ret_code diff --git a/Masterarbeit/openvibe/designer-master/cmake-modules/launchers/resource-file.rc-base b/Masterarbeit/openvibe/designer-master/cmake-modules/launchers/resource-file.rc-base new file mode 100644 index 0000000..215b089 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/cmake-modules/launchers/resource-file.rc-base @@ -0,0 +1,40 @@ +#include "winres.h" + +@CONFIGURE_ICON@ + +// Language is US English +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +#ifndef DEBUG +#define VER_DEBUG 0 +#else +#define VER_DEBUG VS_FF_DEBUG +#endif + +// Add version information +VS_VERSION_INFO VERSIONINFO + FILEVERSION @OV_GLOBAL_VERSION_MAJOR@,@OV_GLOBAL_VERSION_MINOR@,@OV_GLOBAL_VERSION_PATCH@,@OV_GLOBAL_VERSION_BUILD@ + PRODUCTVERSION @OV_GLOBAL_VERSION_MAJOR@,@OV_GLOBAL_VERSION_MINOR@,@OV_GLOBAL_VERSION_PATCH@,@OV_GLOBAL_VERSION_BUILD@ + FILEOS VOS__WINDOWS32 +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", "@COMPANY_NAME@" + VALUE "FileDescription", "@FILE_DESCRIPTION@" + VALUE "FileVersion", "@OV_GLOBAL_VERSION_STRING@" + VALUE "InternalName", "@PROJECT_NAME@" + VALUE "LegalCopyright", "Copyright - @COMPANY_NAME@ @COPYRIGHT_DATE@" + VALUE "OriginalFilename", "@PROJECT_NAME@" + VALUE "ProductName", "@PROJECT_PRODUCT_NAME@" + VALUE "ProductVersion", "@OV_GLOBAL_VERSION_STRING@" + END + END + BLOCK "VarFileInfo" + BEGIN + // Indicates that Software is translated in US English in the Windows ANSI codepage (1252). + VALUE "Translation", 0x409, 1252 + END +END + diff --git a/Masterarbeit/openvibe/designer-master/dependencies-source/json/json.cpp b/Masterarbeit/openvibe/designer-master/dependencies-source/json/json.cpp new file mode 100644 index 0000000..1c31711 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/dependencies-source/json/json.cpp @@ -0,0 +1,665 @@ +#include "json.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef WIN32 +# define _stricmp strcasecmp +#endif + +#ifdef _MSC_VER +# define snprintf sprintf_s +#endif + +using namespace json; + +namespace json { +enum StackDepthType +{ + InObject, + InArray +}; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Helper functions +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static std::string Trim(const std::string& str) +{ + std::string s = str; + + // remove white space in front + s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun(std::isspace)))); + + // remove trailing white space + s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun(std::isspace))).base(), s.end()); + + return s; +} + +// Finds the position of the first " character that is NOT preceeded immediately by a \ character. +// In JSON, \" is valid and has a different meaning than the escaped " character. +static size_t GetQuotePos(const std::string& str, const size_t start_pos = 0) +{ + bool found_slash = false; + for (size_t i = start_pos; i < str.length(); ++i) + { + const char c = str[i]; + if ((c == '\\') && !found_slash) + { + found_slash = true; + continue; + } + if ((c == '\"') && !found_slash) { return i; } + + found_slash = false; + } + + return std::string::npos; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Value::Value(const Value& v) : mValueType(v.mValueType) +{ + switch (mValueType) + { + case StringVal: mStringVal = v.mStringVal; + break; + case IntVal: mIntVal = v.mIntVal; + mFloatVal = float(v.mIntVal); + mDoubleVal = double(v.mIntVal); + break; + case FloatVal: mFloatVal = v.mFloatVal; + mIntVal = int(v.mFloatVal); + mDoubleVal = double(v.mDoubleVal); + break; + case DoubleVal: mDoubleVal = v.mDoubleVal; + mIntVal = int(v.mDoubleVal); + mFloatVal = float(v.mDoubleVal); + break; + case BoolVal: mBoolVal = v.mBoolVal; + break; + case ObjectVal: mObjectVal = v.mObjectVal; + break; + case ArrayVal: mArrayVal = v.mArrayVal; + break; + default: break; + } +} + +Value& Value::operator =(const Value& v) +{ + if (&v == this) { return *this; } + + mValueType = v.mValueType; + + switch (mValueType) + { + case StringVal: mStringVal = v.mStringVal; + break; + case IntVal: mIntVal = v.mIntVal; + mFloatVal = float(v.mIntVal); + mDoubleVal = double(v.mIntVal); + break; + case FloatVal: mFloatVal = v.mFloatVal; + mIntVal = int(v.mFloatVal); + mDoubleVal = double(v.mDoubleVal); + break; + case DoubleVal: mDoubleVal = v.mDoubleVal; + mIntVal = int(v.mDoubleVal); + mFloatVal = float(v.mDoubleVal); + break; + case BoolVal: mBoolVal = v.mBoolVal; + break; + case ObjectVal: mObjectVal = v.mObjectVal; + break; + case ArrayVal: mArrayVal = v.mArrayVal; + break; + default: break; + } + + return *this; +} + +Value& Value::operator [](const size_t idx) +{ + assert(mValueType == ArrayVal); + return mArrayVal[idx]; +} + +const Value& Value::operator [](const size_t idx) const +{ + assert(mValueType == ArrayVal); + return mArrayVal[idx]; +} + +Value& Value::operator [](const std::string& key) +{ + assert(mValueType == ObjectVal); + return mObjectVal[key]; +} + +Value& Value::operator [](const char* key) +{ + assert(mValueType == ObjectVal); + return mObjectVal[key]; +} + +const Value& Value::operator [](const char* key) const +{ + assert(mValueType == ObjectVal); + return mObjectVal[key]; +} + +const Value& Value::operator [](const std::string& key) const +{ + assert(mValueType == ObjectVal); + return mObjectVal[key]; +} + +size_t Value::size() const +{ + if ((mValueType != ObjectVal) && (mValueType != ArrayVal)) { return 1; } + return mValueType == ObjectVal ? mObjectVal.size() : mArrayVal.size(); +} + +bool Value::HasKey(const std::string& key) const +{ + assert(mValueType == ObjectVal); + return mObjectVal.HasKey(key); +} + +int Value::HasKeys(const std::vector& keys) const +{ + assert(mValueType == ObjectVal); + return mObjectVal.HasKeys(keys); +} + +int Value::HasKeys(const char** keys, const int key_count) const +{ + assert(mValueType == ObjectVal); + return mObjectVal.HasKeys(keys, key_count); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Array& Array::operator =(const Array& a) +{ + if (&a == this) { return *this; } + + Clear(); + mValues = a.mValues; + + return *this; +} + +Value& Array::operator [](const size_t i) { return mValues[i]; } +const Value& Array::operator [](const size_t i) const { return mValues[i]; } +Array::ValueVector::const_iterator Array::begin() const { return mValues.begin(); } +Array::ValueVector::const_iterator Array::end() const { return mValues.end(); } +Array::ValueVector::iterator Array::begin() { return mValues.begin(); } +Array::ValueVector::iterator Array::end() { return mValues.end(); } +void Array::push_back(const Value& v) { mValues.push_back(v); } +void Array::insert(const size_t index, const Value& v) { mValues.insert(mValues.begin() + index, v); } +Array::ValueVector::iterator Array::find(const Value& v) { return std::find(mValues.begin(), mValues.end(), v); } +Array::ValueVector::const_iterator Array::find(const Value& v) const { return std::find(mValues.begin(), mValues.end(), v); } +bool Array::HasValue(const Value& v) const { return find(v) != end(); } + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Object& Object::operator =(const Object& obj) +{ + if (&obj == this) { return *this; } + + Clear(); + mValues = obj.mValues; + + return *this; +} + +Value& Object::operator [](const std::string& key) { return mValues[key]; } +const Value& Object::operator [](const std::string& key) const { return mValues.find(key)->second; } +Value& Object::operator [](const char* key) { return mValues[key]; } +const Value& Object::operator [](const char* key) const { return mValues.find(key)->second; } +Object::ValueMap::const_iterator Object::begin() const { return mValues.begin(); } +Object::ValueMap::const_iterator Object::end() const { return mValues.end(); } +Object::ValueMap::iterator Object::begin() { return mValues.begin(); } +Object::ValueMap::iterator Object::end() { return mValues.end(); } +Object::ValueMap::iterator Object::find(const std::string& key) { return mValues.find(key); } +Object::ValueMap::const_iterator Object::find(const std::string& key) const { return mValues.find(key); } +bool Object::HasKey(const std::string& key) const { return find(key) != end(); } + +int Object::HasKeys(const std::vector& keys) const +{ + for (size_t i = 0; i < keys.size(); ++i) { if (!HasKey(keys[i])) { return int(i); } } + + return -1; +} + +int Object::HasKeys(const char** keys, const int key_count) const +{ + for (int i = 0; i < key_count; ++i) { if (!HasKey(keys[i])) { return i; } } + + return -1; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +std::string SerializeArray(const Array& a); + +std::string SerializeValue(const Value& v) +{ + std::string str; + + static const int BUFF_SZ = 500; + char buff[BUFF_SZ]; + switch (v.GetType()) + { + case IntVal: snprintf(buff, BUFF_SZ, "%d", int(v)); + str = buff; + break; + case FloatVal: snprintf(buff, BUFF_SZ, "%f", float(v)); + str = buff; + break; + case DoubleVal: snprintf(buff, BUFF_SZ, "%f", double(v)); + str = buff; + break; + case BoolVal: str = v ? "true" : "false"; + break; + case nullptrVal: str = "null"; + break; + case ObjectVal: str = Serialize(v); + break; + case ArrayVal: str = SerializeArray(v); + break; + case StringVal: str = std::string("\"") + v.ToString() + std::string("\""); + break; + } + + return str; +} + +std::string SerializeArray(const Array& a) +{ + std::string str = "["; + + bool first = true; + for (const auto& v : a) + { + if (!first) { str += std::string(","); } + str += SerializeValue(v); + first = false; + } + + str += "]"; + return str; +} + +std::string json::Serialize(const Value& v) +{ + std::string str; + + bool first = true; + + if (v.GetType() == ObjectVal) + { + str = "{"; + Object obj = v.ToObject(); + for (auto it = obj.begin(); it != obj.end(); ++it) + { + if (!first) { str += std::string(","); } + str += std::string("\"") + it->first + std::string("\":") + SerializeValue(it->second); + first = false; + } + + str += "}"; + } + else if (v.GetType() == ArrayVal) + { + str = "["; + Array a = v.ToArray(); + for (auto it = a.begin(); it != a.end(); ++it) + { + if (!first) { str += std::string(","); } + str += SerializeValue(*it); + first = false; + } + + str += "]"; + } + //else error + + return str; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static Value DeserializeArray(std::string& str, std::stack& depth_stack); +static Value DeserializeObj(const std::string& _str, std::stack& depth_stack); + +static Value DeserializeInternal(const std::string& _str, std::stack& depth_stack) +{ + Value v; + + if (_str.length() == 0) { return v; } + + std::string str = Trim(_str); + if (str[0] == '{') + { + // Error: Began with a { but doesn't end with one + if (str[str.length() - 1] != '}') { return Value(); } + + depth_stack.push(InObject); + v = DeserializeObj(str, depth_stack); + if ((v.GetType() == nullptrVal) || (depth_stack.top() != InObject)) { return v; } + + depth_stack.pop(); + } + else if (str[0] == '[') + { + // Error: Began with a [ but doesn't end with one + if (str[str.length() - 1] != ']') { return Value(); } + + depth_stack.push(InArray); + v = DeserializeArray(str, depth_stack); + if ((v.GetType() == nullptrVal) || (depth_stack.top() != InArray)) { return v; } + + depth_stack.pop(); + } + else { return Value(); } // Will never get here unless _str is not valid JSON + + return v; +} + +static size_t GetEndOfArrayOrObj(const std::string& str, std::stack& depth_stack) +{ + size_t i = 1; + bool in_quote = false; + const size_t original_count = depth_stack.size(); + + for (; i < str.length(); ++i) + { + if (str[i] == '\"') { if (str[i - 1] != '\\') { in_quote = !in_quote; } } + else if (!in_quote) + { + if (str[i] == '[') { depth_stack.push(InArray); } + else if (str[i] == '{') { depth_stack.push(InObject); } + else if (str[i] == ']') + { + const StackDepthType t = depth_stack.top(); + // expected to be closing an array but instead we're inside an object block. + // Example problem: {]} + if (t != InArray) { return std::string::npos; } + + const size_t count = depth_stack.size(); + depth_stack.pop(); + if (count == original_count) { break; } + } + else if (str[i] == '}') + { + const StackDepthType t = depth_stack.top(); + // expected to be closing an object but instead we're inside an array. + // Example problem: [}] + if (t != InObject) { return std::string::npos; } + + const size_t count = depth_stack.size(); + depth_stack.pop(); + if (count == original_count) { break; } + } + } + } + + return i; +} + +static std::string UnescapeJSONString(const std::string& str) +{ + std::string s; + + for (size_t i = 0; i < str.length(); ++i) + { + const char c = str[i]; + if ((c == '\\') && (i + 1 < str.length())) + { + int skip_ahead = 1; + unsigned int hex; + std::string hex_str; + + switch (str[i + 1]) + { + case '"': s.push_back('\"'); + break; + case '\\': s.push_back('\\'); + break; + case '/': s.push_back('/'); + break; + case 't': s.push_back('\t'); + break; + case 'n': s.push_back('\n'); + break; + case 'r': s.push_back('\r'); + break; + case 'b': s.push_back('\b'); + break; + case 'f': s.push_back('\f'); + break; + case 'u': skip_ahead = 5; + hex_str = str.substr(i + 4, 2); + hex = static_cast(std::strtoul(hex_str.c_str(), nullptr, 16)); + s.push_back(char(hex)); + break; + + default: break; + } + + i += skip_ahead; + } + else { s.push_back(c); } + } + + return Trim(s); +} + +static Value DeserializeValue(std::string& str, bool* had_error, std::stack& depth_stack) +{ + Value v; + + *had_error = false; + str = Trim(str); + + if (str.length() == 0) { return v; } + + if (str[0] == '[') + { + depth_stack.push(InArray); + size_t i = GetEndOfArrayOrObj(str, depth_stack); + if (i == std::string::npos) + { + *had_error = true; + return Value(); + } + + std::string array_str = str.substr(0, i + 1); + v = Value(DeserializeArray(array_str, depth_stack)); + str = str.substr(i + 1, str.length()); + } + else if (str[0] == '{') + { + depth_stack.push(InObject); + size_t i = GetEndOfArrayOrObj(str, depth_stack); + + if (i == std::string::npos) + { + *had_error = true; + return Value(); + } + + std::string obj_str = str.substr(0, i + 1); + v = Value(DeserializeInternal(obj_str, depth_stack)); + str = str.substr(i + 1, str.length()); + } + else if (str[0] == '\"') + { + size_t end_quote = GetQuotePos(str, 1); + if (end_quote == std::string::npos) + { + *had_error = true; + return Value(); + } + + v = Value(UnescapeJSONString(str.substr(1, end_quote - 1))); + str = str.substr(end_quote + 1, str.length()); + } + else + { + bool has_dot = false; + bool has_e = false; + std::string temp_val; + size_t i = 0; + for (; i < str.length(); ++i) + { + if (str[i] == '.') { has_dot = true; } + else if (str[i] == 'e') { has_e = true; } + else if (str[i] == ']') + { + if (depth_stack.top() != InArray) + { + *had_error = true; + return Value(); + } + + depth_stack.pop(); + } + else if (str[i] == '}') + { + if (depth_stack.top() != InObject) + { + *had_error = true; + return Value(); + } + depth_stack.pop(); + } + else if (str[i] == ',') { break; } + if (std::isspace(str[i]) == 0) { temp_val += str[i]; } + } + + // store all floating point as doubles. This will also set the float and int values as well. + if (_stricmp(temp_val.c_str(), "true") == 0) { v = Value(true); } + else if (_stricmp(temp_val.c_str(), "false") == 0) { v = Value(false); } + else if (has_e || has_dot) { v = Value(strtod(temp_val.c_str(), nullptr)); } + else if (_stricmp(temp_val.c_str(), "null") == 0) { v = Value(); } + else + { + // Check if the value is beyond the size of an int and if so, store it as a double + double tmp_val = strtod(temp_val.c_str(), nullptr); + if ((tmp_val >= double(INT_MIN)) && (tmp_val <= double(INT_MAX))) { v = Value(int(strtol(temp_val.c_str(), nullptr, 10))); } + else { v = Value(tmp_val); } + } + + str = str.substr(i, str.length()); + } + + return v; +} + +static Value DeserializeArray(std::string& str, std::stack& depth_stack) +{ + Array a; + bool had_error = false; + + str = Trim(str); + + if ((str[0] == '[') && (str[str.length() - 1] == ']')) { str = str.substr(1, str.length() - 2); } + else { return Value(); } + + while (str.length() > 0) + { + std::string tmp; + + size_t i = 0; + for (; i < str.length(); ++i) + { + // If we get to an object or array, parse it: + if ((str[i] == '{') || (str[i] == '[')) + { + Value v = DeserializeValue(str, &had_error, depth_stack); + if (had_error) { return Value(); } + if (v.GetType() != nullptrVal) { a.push_back(v); } + break; + } + + bool terminate_parsing = false; + + if ((str[i] == ',') || (str[i] == ']')) + { + terminate_parsing = true; // hit the end of a value, parse it in the next block + } + else + { + // keep grabbing chars to build up the value + tmp += str[i]; + if (i == str.length() - 1) { terminate_parsing = true; } // end of string, finish parsing + } + if (terminate_parsing) + { + Value v = DeserializeValue(tmp, &had_error, depth_stack); + if (had_error) { return Value(); } + + if (v.GetType() != nullptrVal) { a.push_back(v); } + + str = str.substr(i + 1, str.length()); + break; + } + } + } + + return a; +} + +static Value DeserializeObj(const std::string& _str, std::stack& depth_stack) +{ + Object obj; + + std::string str = Trim(_str); + + if ((str[0] != '{') && (str[str.length() - 1] != '}')) { return Value(); } + str = str.substr(1, str.length() - 2); + + while (str.length() > 0) + { + // Get the key name + const size_t start_quote_idx = GetQuotePos(str); + const size_t end_quote_idx = GetQuotePos(str, start_quote_idx + 1); + const size_t colon_idx = str.find(':', end_quote_idx); + + if ((start_quote_idx == std::string::npos) || (end_quote_idx == std::string::npos) || (colon_idx == std::string::npos)) + { + return Value(); // can't find key name + } + + std::string key = str.substr(start_quote_idx + 1, end_quote_idx - start_quote_idx - 1); + if (key.length() == 0) { return Value(); } + + bool had_error = false; + str = str.substr(colon_idx + 1, str.length()); + obj[key] = DeserializeValue(str, &had_error, depth_stack); + if (had_error) { return Value(); } + } + + return obj; +} + +Value json::Deserialize(const std::string& str) +{ + std::stack depth_stack; + return DeserializeInternal(str, depth_stack); +} diff --git a/Masterarbeit/openvibe/designer-master/dependencies-source/json/json.h b/Masterarbeit/openvibe/designer-master/dependencies-source/json/json.h new file mode 100644 index 0000000..3fe4827 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/dependencies-source/json/json.h @@ -0,0 +1,562 @@ +/* + SuperEasyJSON + http://www.sourceforge.net/p/supereasyjson + + The MIT License (MIT) + + Copyright (c) 2013 Jeff Weinstein (jeff.weinstein at gmail) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + CHANGELOG: + ========== + 2/8/2014: + --------- + MAJOR BUG FIXES, all courtesy of Per Rovegård, Ph.D. + * Feature request: HasKey and HasKeys added to Value for convenience and + to avoid having to make a temporary object. + * Strings should now be properly unescaped. Previously, as an example, the + string "\/Date(1390431949211+0100)\/\" would be parsed as + \/Date(1390431949211+0100)\/. The string is now properly parsed as + /Date(1390431949211+0100)/. + As per http://www.json.org the other escape characters including + \u+4 hex digits will now be properly unescaped. So for example, + \u0061 now becomes "A". + * Serialize now supports serializing a toplevel array (which is valid JSON). + The parameter it takes is now a Value, but existing code doesn't + need to be changed. + * Fixed bug with checking for proper opening/closing sequence for braces/brackets. + Previously, this code: + const char *json = "{\"arr\":[{ }}]}"; + auto val = json::Deserialize(json); + worked fine with no errors. That's a bug. I did a major overhaul so that + now improperly formatted pairs will now correctly result in an error. + * Made internal deserialize methods static + + 1/30/2014: + ---------- + * Changed #pragma once to the standard #ifndef header guard style for + better compatibility. + * Added a [] operator for Value that takes a const char* as an argument + to avoid having to explicitly (and annoyingly) cast to std::string. + Thus, my_value["asdf"] = "a string" should now work fine. + The same has been added to the Object class. + * Added non-operator methods of casting a Value to int/string/bool/etc. + Implicitly casting a Value to a std::string doesn't work as per C++ + rules. As such, previously to assign a Value to a std::string you + had to do: + my_std_string = (std::string)my_value; + You can now instead do: + my_std_string = my_value.ToString(); + If you want more information on why this can't be done, please read + this topic for more details: + http://stackoverflow.com/questions/3518145/c-overloading-conversion-operator-for-custom-type-to-stdstring + + 1/27/2014 + ---------- + * Deserialize will now return a nullptrType Value instance if there was an + error instead of asserting. This way you can handle however you want to + invalid JSON being passed in. As a top level object must be either an + array or an object, a nullptr value return indicates an invalid result. + + 1/11/2014 + --------- + * Major bug fix: Strings containing []{ } characters could cause + parsing errors under certain conditions. I've just tested + the class parsing a 300KB JSON file with all manner of bizarre + characters and permutations and it worked, so hopefully this should + be the end of "major bug" fixes. + + 1/10/2014 + --------- + Bug fixes courtesy of Gerry Beauregard: + * Pretty big bug: was using wrong string paramter in ::Deserialize + and furthermore it wasn't being trimmed. + * Object::HasKeys now casts the return value to avoid compiler warnings. + * Slight optimization to the Trim function + * Made asserts in ::Deserialize easier to read + + 1/9/2014 + -------- + * Major bug fix: for JSON strings containing \" (as in, two characters, + not the escaped " character), the lib would mess up and not parse + correctly. + * Major bug fix: I erroneously was assuming that all root JSON types + had to be an object. This was an oversight, as a root JSON + object can be an array. I have therefore changed the Deserialize + method to return a json::Value rather than a json::Object. This + will NOT impact any existing code you have, as a json::Value will + cast to a json::Object (if it is indeed an object). But for + correctness, you should be using json::Value = Deserialize... + The Value type can be checked if it's an array (or any other type), + and furthermore can even be accessed with the [] operator for + convenience. + * I've made the nullptr value type set numeric fields to 0 and bool to false. + This is for convenience for using the nullptr type as a default return + value in your code. + * asserts added to casting (Gerry Beauregard) + * Added method HasKeys to json::Object which will check if all the keys + specified are in the object, returning the index of the first key + not found or -1 if all found (hoppe). + + 1/4/2014 + -------- + * Fixed bug where bools were being parsed as doubles (Gerry Beauregard). + + 1/2/2014 v3 + ------------ + * More missing headers added for VisualStudio 2012 + * Switched to snprintf instead of sprintf (or sprintf_s in MSVC) + + 1/2/2014 v2 + ----------- + * Added yet more missing headers for compiling on GNU and Linux systems + * Made Deserialize copy the passed in string so it won't mangle it + + 1/2/2014 + -------- + * Fixed previous changelog years. Got ahead of myself and marked them + as 2014 when they were in fact done in 2013. + * Added const version of [] to Array/Object/Value + * Removed C++11 requirements, should work with older compilers + (thanks to Meng Wang for pointing that out) + * Made ValueMap and ValueVector typedefs in Object/Value public + so you can actually iterate over the class + * Added HasKey and HasValue to Object/Array for convenience + (note this could have been done comparing .find to .end) + + 12/29/2013 v2 + ------------- + * Added .size() field to Value. Returns 1 for non Array/Object types, + otherwise the number of elements contained. + * Added .find() to Object to search for a key. Returns Object::end() + if not found, otherwise the Value. + Example: bool found = my_obj.find("some key") != my_obj.end(); + * Added .find() to Array to search for a value. Just a convenience + wrapper for std::find(Array::begin(), Array::end(), Value) + * Added ==, !=, <, >, <=, >= operators to Object/Array/Value. + For Objects/Arrays, the operators function just like they do for a + std::map and std::vector, respectively. + * Added IsNumeric to Value to indicate if it's an int/float/double type. + + 12/29/2013 + ---------- + * Added the DoubleVal type which stores, you guessed it, double values. + * Bug fix for floats with an exact integer value. Now, setting any numerical + field will also set the fields for the other numerical types. So if you + have obj["value"] = 12, then the int/float/double cast methods will + return 12/12.0f/12.0. Previously, in the example above, only the int + value was set, making a cast to float return 0. + * Bug fix for deserializing JSON strings that contained large integer values. + Now if the numerical value of a key in a JSON string contains a number + less than INT_MIN or greater than INT_MAX it will be stored as a double. + Note that as mentioned above, all numerical fields are set. + * Should work fine with scientific notation values now. + + 12/28/2013 + ---------- + + * Fixed a bug where if there were spaces around values or key names in a JSON + string passed in to Deserialize, invalid results or asserts would occur. + (Fix courtesy of Gerry Beauregard) + + * Added method named "Clear()" to Object/Array/Value to reset state + + * Added license to header file for easyness (totally valid word). + */ +#pragma once + +#include +#include +#include +#include + +namespace json { +enum ValueType { nullptrVal, StringVal, IntVal, FloatVal, DoubleVal, ObjectVal, ArrayVal, BoolVal }; + +class Value; + +class Object +{ +public: + + typedef std::map ValueMap; + +protected: + + ValueMap mValues; + +public: + + Object() = default; + Object(const Object& obj) : mValues(obj.mValues) {} + + Object& operator =(const Object& obj); + + friend bool operator ==(const Object& lhs, const Object& rhs); + friend bool operator !=(const Object& lhs, const Object& rhs) { return !(lhs == rhs); } + friend bool operator <(const Object& lhs, const Object& rhs); + friend bool operator >(const Object& lhs, const Object& rhs) { return operator<(rhs, lhs); } + friend bool operator <=(const Object& lhs, const Object& rhs) { return !operator>(lhs, rhs); } + friend bool operator >=(const Object& lhs, const Object& rhs) { return !operator<(lhs, rhs); } + + Value& operator [](const std::string& key); + const Value& operator [](const std::string& key) const; + Value& operator [](const char* key); + const Value& operator [](const char* key) const; + + ValueMap::const_iterator begin() const; + ValueMap::const_iterator end() const; + ValueMap::iterator begin(); + ValueMap::iterator end(); + + // Find will return end() if the key can't be found, just like std::map does. + ValueMap::iterator find(const std::string& key); + ValueMap::const_iterator find(const std::string& key) const; + + // Convenience wrapper to find to search for a key + bool HasKey(const std::string& key) const; + + // Checks if the object contains all the keys in the array. If it does, returns -1. + // If it doesn't, returns the index of the first key it couldn't find. + int HasKeys(const std::vector& keys) const; + int HasKeys(const char** keys, int key_count) const; + + // Removes all values and resets the state back to default + void Clear() { mValues.clear(); } + + size_t size() const { return mValues.size(); } +}; + +class Array +{ +public: + + typedef std::vector ValueVector; + +protected: + + ValueVector mValues; + +public: + + Array() = default; + Array(const Array& a) : mValues(a.mValues) { } + + Array& operator =(const Array& a); + + friend bool operator ==(const Array& lhs, const Array& rhs); + friend bool operator !=(const Array& lhs, const Array& rhs) { return !(lhs == rhs); } + friend bool operator <(const Array& lhs, const Array& rhs); + friend bool operator >(const Array& lhs, const Array& rhs) { return operator<(rhs, lhs); } + friend bool operator <=(const Array& lhs, const Array& rhs) { return !operator>(lhs, rhs); } + friend bool operator >=(const Array& lhs, const Array& rhs) { return !operator<(lhs, rhs); } + + Value& operator[](size_t i); + const Value& operator[](size_t i) const; + + ValueVector::const_iterator begin() const; + ValueVector::const_iterator end() const; + ValueVector::iterator begin(); + ValueVector::iterator end(); + + // Just a convenience wrapper for doing a std::find(Array::begin(), Array::end(), Value) + ValueVector::iterator find(const Value& v); + ValueVector::const_iterator find(const Value& v) const; + + // Convenience wrapper to check if a value is in the array + bool HasValue(const Value& v) const; + + // Removes all values and resets the state back to default + void Clear() { mValues.clear(); } + + void push_back(const Value& v); + void insert(size_t index, const Value& v); + size_t size() const { return mValues.size(); } +}; + +class Value +{ +protected: + + ValueType mValueType = nullptrVal; + int mIntVal = 0; + float mFloatVal = 0; + double mDoubleVal = 0; + std::string mStringVal; + Object mObjectVal; + Array mArrayVal; + bool mBoolVal = false; + +public: + const std::string& getStringImplementation() const { return mStringVal; } + + Value() = default; + Value(const int v) : mValueType(IntVal), mIntVal(v), mFloatVal(float(v)), mDoubleVal(double(v)) { } + Value(const float v) : mValueType(FloatVal), mIntVal(int(v)), mFloatVal(v), mDoubleVal(double(v)) { } + Value(const double v) : mValueType(DoubleVal), mIntVal(int(v)), mFloatVal(float(v)), mDoubleVal(v) { } + Value(const std::string& v) : mValueType(StringVal), mStringVal(v) { } + Value(const char* v) : mValueType(StringVal), mStringVal(v) { } + Value(const Object& v) : mValueType(ObjectVal), mObjectVal(v) { } + Value(const Array& v) : mValueType(ArrayVal), mArrayVal(v) { } + Value(const bool v) : mValueType(BoolVal), mBoolVal(v) { } + Value(const Value& v); + + ValueType GetType() const { return mValueType; } + + Value& operator =(const Value& v); + + friend bool operator ==(const Value& lhs, const Value& rhs); + friend bool operator !=(const Value& lhs, const Value& rhs) { return !(lhs == rhs); } + friend bool operator <(const Value& lhs, const Value& rhs); + friend bool operator >(const Value& lhs, const Value& rhs) { return operator<(rhs, lhs); } + friend bool operator <=(const Value& lhs, const Value& rhs) { return !operator>(lhs, rhs); } + friend bool operator >=(const Value& lhs, const Value& rhs) { return !operator<(lhs, rhs); } + + + // For use with Array/ObjectVal types, respectively + Value& operator [](size_t idx); + const Value& operator [](size_t idx) const; + Value& operator [](const std::string& key); + const Value& operator [](const std::string& key) const; + Value& operator [](const char* key); + const Value& operator [](const char* key) const; + + bool HasKey(const std::string& key) const; + int HasKeys(const std::vector& keys) const; + int HasKeys(const char** keys, int key_count) const; + + + // non-operator versions + int ToInt() const + { + assert(IsNumeric()); + return mIntVal; + } + + float ToFloat() const + { + assert(IsNumeric()); + return mFloatVal; + } + + double ToDouble() const + { + assert(IsNumeric()); + return mDoubleVal; + } + + bool ToBool() const + { + assert(mValueType == BoolVal); + return mBoolVal; + } + + std::string ToString() const + { + assert(mValueType == StringVal); + return mStringVal; + } + + Object ToObject() const + { + assert(mValueType == ObjectVal); + return mObjectVal; + } + + Array ToArray() const + { + assert(mValueType == ArrayVal); + return mArrayVal; + } + + // mutable non-operator versions + Array& ToMutableArray() + { + assert(mValueType == ArrayVal); + return mArrayVal; + } + + // Please note that as per C++ rules, implicitly casting a Value to a std::string won't work. + // This is because it could use the int/float/double/bool operators as well. So to assign a + // Value to a std::string you can either do: + // my_string = (std::string)my_value + // Or you can now do: + // my_string = my_value.ToString(); + // + operator int() const + { + assert(IsNumeric()); + return mIntVal; + } + + operator float() const + { + assert(IsNumeric()); + return mFloatVal; + } + + operator double() const + { + assert(IsNumeric()); + return mDoubleVal; + } + + operator bool() const + { + assert(mValueType == BoolVal); + return mBoolVal; + } + + operator std::string const() const + { + assert(mValueType == StringVal); + return mStringVal; + } + + operator std::string() const + { + assert(mValueType == StringVal); + return mStringVal; + } + + operator const char*() const + { + assert(mValueType == StringVal); + return mStringVal.c_str(); + } + + operator Object() const + { + assert(mValueType == ObjectVal); + return mObjectVal; + } + + operator Array() const + { + assert(mValueType == ArrayVal); + return mArrayVal; + } + + bool IsNumeric() const { return (mValueType == IntVal) || (mValueType == DoubleVal) || (mValueType == FloatVal); } + + // Returns 1 for anything not an Array/ObjectVal + size_t size() const; + + // Resets the state back to default, aka nullptrVal + void Clear() { mValueType = nullptrVal; } +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Converts a JSON Object or Array instance into a JSON string representing it. +std::string Serialize(const Value& v); + +// If there is an error, Value will be nullptrType +Value Deserialize(const std::string& str); + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline bool operator ==(const Object& lhs, const Object& rhs) { return lhs.mValues == rhs.mValues; } +inline bool operator <(const Object& lhs, const Object& rhs) { return lhs.mValues < rhs.mValues; } +inline bool operator ==(const Array& lhs, const Array& rhs) { return lhs.mValues == rhs.mValues; } +inline bool operator <(const Array& lhs, const Array& rhs) { return lhs.mValues < rhs.mValues; } + +/* When comparing different numeric types, this method works the same as if you compared different numeric types + on your own. Thus it performs the same as if you, for example, did this: + + int a = 1; + float b = 1.1f; + bool equivalent = a == b; + + The same logic applies to the other comparison operators. + */ +inline bool operator ==(const Value& lhs, const Value& rhs) +{ + if ((lhs.mValueType != rhs.mValueType) && !lhs.IsNumeric() && !rhs.IsNumeric()) { return false; } + + switch (lhs.mValueType) + { + case StringVal: return lhs.mStringVal == rhs.mStringVal; + + case IntVal: + if (rhs.GetType() == FloatVal) { return float(lhs.mIntVal) == rhs.mFloatVal; } + if (rhs.GetType() == DoubleVal) { return double(lhs.mIntVal) == rhs.mDoubleVal; } + if (rhs.GetType() == IntVal) { return lhs.mIntVal == rhs.mIntVal; } + return false; + + case FloatVal: + if (rhs.GetType() == FloatVal) { return lhs.mFloatVal == rhs.mFloatVal; } + if (rhs.GetType() == DoubleVal) { return double(lhs.mFloatVal) == rhs.mDoubleVal; } + if (rhs.GetType() == IntVal) { return lhs.mFloatVal == float(rhs.mIntVal); } + return false; + + + case DoubleVal: + if (rhs.GetType() == FloatVal) { return lhs.mDoubleVal == double(rhs.mFloatVal); } + if (rhs.GetType() == DoubleVal) { return lhs.mDoubleVal == rhs.mDoubleVal; } + if (rhs.GetType() == IntVal) { return lhs.mDoubleVal == double(rhs.mIntVal); } + return false; + + case BoolVal: return lhs.mBoolVal == rhs.mBoolVal; + + case ObjectVal: return lhs.mObjectVal == rhs.mObjectVal; + + case ArrayVal: return lhs.mArrayVal == rhs.mArrayVal; + + default: return true; + } +} + +inline bool operator <(const Value& lhs, const Value& rhs) +{ + if ((lhs.mValueType != rhs.mValueType) && !lhs.IsNumeric() && !rhs.IsNumeric()) { return false; } + + switch (lhs.mValueType) + { + case StringVal: return lhs.mStringVal < rhs.mStringVal; + + case IntVal: + if (rhs.GetType() == FloatVal) { return float(lhs.mIntVal) < rhs.mFloatVal; } + if (rhs.GetType() == DoubleVal) { return double(lhs.mIntVal) < rhs.mDoubleVal; } + if (rhs.GetType() == IntVal) { return lhs.mIntVal < rhs.mIntVal; } + return false; + + case FloatVal: + if (rhs.GetType() == FloatVal) { return lhs.mFloatVal < rhs.mFloatVal; } + if (rhs.GetType() == DoubleVal) { return double(lhs.mFloatVal) < rhs.mDoubleVal; } + if (rhs.GetType() == IntVal) { return lhs.mFloatVal < float(rhs.mIntVal); } + return false; + + case DoubleVal: + if (rhs.GetType() == FloatVal) { return lhs.mDoubleVal < double(rhs.mFloatVal); } + if (rhs.GetType() == DoubleVal) { return lhs.mDoubleVal < rhs.mDoubleVal; } + if (rhs.GetType() == IntVal) { return lhs.mDoubleVal < double(rhs.mIntVal); } + return false; + + case BoolVal: return int(lhs.mBoolVal) < int(rhs.mBoolVal); + + case ObjectVal: return lhs.mObjectVal < rhs.mObjectVal; + + case ArrayVal: return lhs.mArrayVal < rhs.mArrayVal; + + default: return true; + } +} +} diff --git a/Masterarbeit/openvibe/designer-master/documentation/CMakeLists.txt b/Masterarbeit/openvibe/designer-master/documentation/CMakeLists.txt new file mode 100644 index 0000000..7bfb019 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/documentation/CMakeLists.txt @@ -0,0 +1,23 @@ +# Sphinx Documentation + +install(DIRECTORY DESTINATION "${DIST_DOCTMP}/sphinx") + +# Collect all sphinx documentation files from all projects +set(INCLUDED_OV_SDK_COMPONENTS DEPENDENCIES DEVELOPER_TOOLS) +include("AddOpenViBESDKComponents") + +add_custom_target(copy_sdk_documentation ALL COMMAND ${CMAKE_COMMAND} -E copy "${OPENVIBE_SDK_PATH}/doc-tmp/" "${CMAKE_CURRENT_BINARY_DIR}/doc-tmp") + +file(GLOB SPHINX_DOC_DIRS LIST_DIRECTORIES true LIST_FILES false + "${PROJECT_SOURCE_DIR}/plugins/visualization/*" + "${PROJECT_SOURCE_DIR}/plugins/*" + ) +foreach(DOCDIR ${SPHINX_DOC_DIRS}) + if(IS_DIRECTORY "${DOCDIR}/doc/boxes") + file(COPY "${DOCDIR}/doc/boxes" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/doc-tmp/sphinx/source) + endif() +endforeach() + +file(COPY sphinx/source DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/doc-tmp/sphinx) + +install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc-tmp/ DESTINATION ${DIST_DOCTMP}) diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/01-introduction.rst b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/01-introduction.rst new file mode 100644 index 0000000..45c06b2 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/01-introduction.rst @@ -0,0 +1,14 @@ +Introduction +============ + +The |Brand| |AuthTool| is an authoring tool dedicated to creating and executing |Brand| scenarios. It is targeted at a broad range of users, including: + +- **researchers** and students of the neuroscience and BCI community +- **neurophysiology experts** who need a tool to realize signal-processing and monitoring of EEG activity +- **clinicians** looking for a tool to conduct neurofeedback experiments + +It relies on a graphical user interface to provide signal processing tools in an intuitive way, and doesn’t require any programming skills. + +Each of these tools comes as a plugin, which communicates with the application via a generic interface hiding implementation details. As a result, it is easy for a programmer to extend the range of tools provided with the platform. Users may arrange any number of these boxes in a very flexible fashion, considering there is virtually no limit as to the number of boxes that may be included in a processing **scenario**. + +Once a scenario is created, it may be run from Studio, which provides a toolbar for playing, pausing and stepping through a scenario. A number of box algorithms are available for direct **visualization** of results, from simple 2D displays such as Spectral Analysis and Continuous Oscilloscope to 3D paradigms such as 3D Topography. The layout of these displays may be customized as desired at scenario editing time using the **window manager** module of Studio. diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/02-interface.rst b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/02-interface.rst new file mode 100644 index 0000000..6dd277e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/02-interface.rst @@ -0,0 +1,221 @@ +Interface Overview +================== + +.. figure:: images/studio-interface-annotated.png + :alt: |Brand| |AuthTool| Interface + :align: center + + |Brand| |AuthTool| Interface + + +The following sections are an overview of the main features of |AuthTool| tool, and make for a quick and easy introduction to its usage. Here are the topics covered in this overview: + +- Top Level **Menu Bar** +- **Toolbar**, which provides immediate access to the most common actions (Scenario File Edition, Window Manager, Active Logs Level, Add Comment Box, Edit Scenario Information, Scenario Control, …) +- **Available Boxes** tree view + + - **Scenario Settings** + - **Scenario I/O Controls** + +- **Status Bar**, which provides performance information when a scenario is being run +- **Message Console** which prints Info, Warning or Error messages +- **Scenario Authoring** window, where boxes may be arranged together in order to fulfill the task at hand. +- |BulletEngCtrlPanel| + +Menu Bar +-------- + + +Options available from the menu bar are presently restricted to actions involving handling and exiting the application. Scenarios can be saved to MXS (Mensia XML Scenario) or to XML files (as does OpenViBE). Several scenarios may be edited simultaneously, and the active scenario may be changed by clicking onto the corresponding tab at the top of the scenario editor window. Here is a list of options from the menu bar and their shortcuts if available: + +The File menu handles standard scenario operations such as creation, saving and closing. Note that the application won't quit as long as at least one scenario is running. + +.. figure:: images/menubar-file.png + :alt: File Menu + :align: right + + +- New – **Ctrl+n**: open a new scenario in a new tab: +- Open – **Ctrl+o**: open a file selection dialog to select an existing scenario file +- Recent Scenarios: access recently closed scenarios +- Save – **Ctrl+s**: save current scenario +- Save As: save the current scenario in another file +- Close - **Ctrl+w**: close current scenario tab +- Quit – **Alt+F4**: quit |AuthTool| + + +The Edit menu allows the user to cut/copy/paste selections (in a scenario or across scenarios). These options can also be accessed when right-clicking on a box. User actions are saved during scenario editing and can be retrieved through undo-redo. + +.. figure:: images/menubar-edit.png + :alt: Edit Menu + :align: right + + +- Find – **Ctrl+f**: direct to filter box to make a search in the list of boxes +- Undo – **Ctrl+z**: cancel the last edition operation +- Redo – **Ctrl+y**: redo the operation you just cancelled +- Cut – **Ctrl+x**: cut current selection +- Copy – **Ctrl+c**: copy current selection +- Paste – **Ctrl+v**: paste current selection +- Delete – **Del**: delete current selection +- Preferences: this item displays the Configuration Manager dialog. It contains a list of all configuration tokens and their values. This list is read only. To know more about the Configuration Manager, refer to The Configuration Manager documentation paragraph. + +The Help menu allows the user to open some various utilities applications. + +.. figure:: images/menubar-help.png + :alt: Help Menu + :align: right + +- About this scenario – allow to add a scenario description see: Adding metadata +- About |Brand| – display Credits for |AuthTool| +- Browse documentation – Open box documentation +- Register License – Open tool to add a license +- Report issue – Open the support website, see: Support +- What's new in version 3.0.x.x of |AuthTool| + +Toolbar +------- + +.. figure:: images/toolbar-annotated.png + :alt: Toolbar + :align: center + + NeuorRT |AuthTool| Toolbar + +The first section of the tools bar offers direct access to the scenario handling options that you can find in the menu *File*. + +Next section contains the Undo and Redo buttons. + +After these you have controls for various functionalities of |Brand| |AuthTool|: + +- :ref:`window-manager` +- :ref:`log-levels` +- :ref:`scenario-comments` +- :ref:`scenario-information` +- :ref:`scenario-controls` +- |BulletEngCtrlPanel| + + +.. _window-manager: + +Window Manager +-------------- + +.. image:: images/icon-window-manager.png + +The **Window Manager** button is a toggle button, allowing for displaying and hiding the **window manager**. This tool is displayed in a popup window when the button is pressed. It takes care of arranging visualization boxes in a layout. Such boxes (if any in the current scenario) initially appear under the 'Unaffected display plugins' node of the tree view in the upper left corner. A window containing one tab is also created by default and displayed on the right, as below: + +.. figure:: images/window-manager.png + :alt: Window Manager + :align: center + + Window manager popup dialog for a scenario with 4 visualization boxes, by default + +Users may create any number of windows containing any number of tabs, and then drag and drop visualization boxes onto such tabs in a tree-like structure. If the user chooses to not use the window manager all visualization boxes will be given their own window, displayed when the scenario is being played. For a more in-depth review of the window manager usage, see the Window Manager Tutorial. + +.. figure:: images/window-manager-4-panes.png + :alt: Window Manager with 4 panes + :align: center + + Window manager popup dialog for a scenario with 4 organized visualization boxes + +.. _log-levels: + +Log Levels +---------- + +.. image:: images/icon-log-levels.png + +The second button displays the log levels dialog ( ). It may be used to configure which log messages should be displayed in the console. It contains 8 levels as shown in the following figure: + +.. figure:: images/log-levels.png + :alt: Log Levels + :align: center + + Log Levels Dialog + +*Warnings* and *Errors* should always be selected. *Information* displays useful messages from signal processing boxes. *Trace* can be used to check step-by-step the processing in the boxes and the kernel. *Benchmark* and *Debug* are very verbose and should not be used with |AuthTool| console (only in log files). + +.. _scenario-comments: + +Scenario Comments +----------------- + +.. image:: images/icon-add-comment.png + +This button adds a dedicated comment box to the scenario. These boxes have of course no input and outputs. Double click on them to edit the comment they display. The syntax of the comments uses `pango style `__, the style buttons can help you format your comment. + +.. figure:: images/scenario-comment.png + :alt: Scenario Comment + :align: center + + Comment, as it appears in a scenario + +.. figure:: images/scenario-comment-editor.png + :alt: Scenario Comment Editor + :align: center + + Comment Editor Dialog + +.. _scenario-information: + +Scenario Description +-------------------- + +.. image:: images/icon-scenario-information.png + +This buttons allows editing of some information that will be saved with the scenario (name, authors, date, description, etc.). + + +.. figure:: images/scenario-information.png + :alt: Scenario Description Edit Dialog + :align: center + + Scenario Description + +.. _scenario-controls: + +Scenario Controls +----------------- + +.. image:: images/icon-scenario-controls.png + +Scenario controls work like a media player would. + +- Stop – **F5**: go back to scenario edition mode +- Step – **F6**: play scenario one step of simulation at a time +- Play/Pause – **F7**: play scenario in real time or pause it if it is already running +- Fast Forward – **F8**: play scenario as fast as possible + +Once a scenario is being played, it is not possible to modify it. Press *Stop* to go back in edition mode. Shortcuts from F5 to F8 can be used only if the focus is on |AuthTool| main window (not on visualization windows for example). + +Finally, the toolbar contains a time counter which displays the simulation time as a scenario is being run. It is reset to 0 as a scenario is stopped. + +Box Algorithms Tree View +------------------------ + + +The right-hand part of |AuthTool| window displays a list of existing box algorithms, which are the building blocks of |Brand| scenarios. + +Under the *Box algorithms* tab lies a tree view listing available box algorithms, along with a short description of their respective roles. Box algorithms are the smallest granular elements that may be manipulated by a |AuthTool| user. They act as black boxes which can be connected together by their inputs and outputs. In order to facilitate their selection, they are grouped into categories, which make up the top level nodes of the tree view. Some categories are related to signal processing, others to scenario serialization or visualization purposes. The default tree view shows only stable and fully supported boxes. + +The status of a box varies with the context, and is reflected by the color of the font used in the tree view. The box name and description will use a cyan font if the box is deprecated, and a light grey font if it is unstable. To know more about box status, see section Box status. + +Status Bar +---------- + +The status bar that lies at the bottom of the window provides performance information. When a scenario is being run, |Brand| keeps track of the time used by each box and of the overall execution time. Overall performance is displayed in a green gauge overlaid with the same information in percent. A system load 100 percent means the system is barely able to handle the computation load induced by the scenario to run in real-time. + +To identify the bottlenecks in a scenario, one can press the button to the right of the gauge as a scenario is being run. This will highlight boxes from green to red, depending on how much time is spent in each box relative to the others. + +Console +------- + +|AuthTool| console can be expanded/hidden by a simple click. You can choose the log levels you want to see in this particular window. |AuthTool| console has been developed in order to be sure to see any warning or error messages. + +.. figure:: images/console-annotated.png + :alt: |Brand| |AuthTool| Console + :align: center + + |Brand| |AuthTool| Console + diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/03-scenario-authoring.rst b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/03-scenario-authoring.rst new file mode 100644 index 0000000..a40842d --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/03-scenario-authoring.rst @@ -0,0 +1,204 @@ +.. _studio-authoring-scenarios: + +Authoring Scenarios +=================== + +This section covers the working area of |AuthTool|, which is where |Brand| scenarios are assembled by connecting box algorithms together. + +Boxes +----- + +Box algorithms are added to the active scenario by drag and dropping them from the tree view to the scenario edition window. They appear as rounded rectangles with their name inside the box, inputs (if any) on top and outputs (if any) at the bottom. These connectors are displayed as color-coded triangles. Colors vary with the connector type, and help users to make sure they connect boxes properly. See *Connector Types* for an overview of the different connector types and hierarchy. + +.. figure:: images/box.png + :alt: Generic Stream Reader Box + :align: center + + A file reading box algorithm which has 2 outputs (signal and stimulations streams) + +Additionally, if the box has **customizable settings**, they may be set by double clicking on the box (*tip*: when a box has such settings, its name is displayed in bold). The settings are listed in the popup dialog that appears, along with their default values. Settings may be overridden by directly typing in their desired values, or they may be read from a file. In the latter case, one should expand the *Override settings with configuration file* section to check the *File* button and pick a configuration file. + + +.. figure:: images/box-settings.png + :alt: Box Settings + :align: center + + Settings of a 'Generic stream reader' box: filename text entry + +Linking Boxes +~~~~~~~~~~~~~ + +The output of a box can be linked to the input of another box if the type of the output is the same type or is a derived type of the input's type. For example, a Signal output can be connected on a Streamed Matrix input as Signal's type derives from Streamed Matrix. + +The various stream types are: + +.. role:: color-stream-unidentified +.. role:: color-stream-if-else +.. role:: color-stream-ebml +.. role:: color-stream-experiment-information +.. role:: color-stream-stimulations +.. role:: color-stream-streamed-matrix +.. role:: color-stream-covariance-matrix +.. role:: color-stream-channel-localization +.. role:: color-stream-feature-vector +.. role:: color-stream-signal +.. role:: color-stream-spectrum +.. role:: color-stream-time-frequency + +- :color-stream-unidentified:`▼` Unidentified Stream +- :color-stream-if-else:`▼` If/Else Condition Controller +- :color-stream-ebml:`▼` EBML Stream + + - :color-stream-experiment-information:`▼` Experiment Information + - :color-stream-stimulations:`▼` Stimulations + - :color-stream-streamed-matrix:`▼` Streamed Matrix + + - :color-stream-covariance-matrix:`▼` Covariance Matrix + - :color-stream-channel-localization:`▼` Channel Localization + - :color-stream-feature-vector:`▼` Feature Vector + - :color-stream-signal:`▼` Signal + - :color-stream-spectrum:`▼` Spectrum + - :color-stream-time-frequency:`▼` Time/Frequency + +There are different connector types differentiated by their color, see figure above. The type "Unidentified stream" is applied on a connector type that couldn't be identified in the launched version of |AuthTool|. Some boxes that can have different connector types may also have this type of connectors by default. The type *If / Else Condition Controller* is a special type that is useful in the boxes: *If / Else Separation* and *End If / Else Concatenation*. See the documentation of these boxes for more details. + +Box Status +~~~~~~~~~~ + + +By default, the status of a box is 'normal', and the box is drawn with a white background. However, some boxes may have a different status depending on the situation. Here are the other possible status of a box: + +**Update** + +.. figure:: images/box-status-update.png + :align: right + +When a box is not up to date with the latest version used in a given distribution of |Brand|, it is drawn as this "Matrix to Signal" box. This situation arises when the prototype of a box has changed between the time the scenario it is stored in is saved and the time it is loaded again. Since scenario files contain information about box prototypes, such as the number of connectors, they may need to be updated when the |Brand| distribution used to manipulate scenarios changes. To update such a box, simply delete the box from the scenario then add it again. The new box will use the latest version. + +Tip: after such an update, one should make sure to reconfigure the box settings if needed! + +**Deprecated** + +.. figure:: images/box-status-deprecated.png + :align: right + +As |Brand| evolves with time, some boxes are added to the platform and others are deleted. It can also happen that a box is replaced with another one (maybe for performance reasons). However, the 'old' box is not necessarily deleted from the platform, but may be kept for backward compatibility with older versions (ensuring older scenarios may still be run, for example). In that case, the documentation should mention that from that time on, the new box should be preferred over the deprecated one (which may be removed from the platform at any time, and in any case which probably won't be maintained anymore). Such boxes are displayed with an orange background and the 'deprecated' label below the box name. + +**Unstable** + +.. figure:: images/box-status-unstable.png + :align: right + +A box which is under development should be flagged as 'unstable', meaning it may have only been partially implemented or tested. Consequently, it may not behave properly in all conditions, or may be updated in a future release. Such a box is drawn with a dark grey background in |AuthTool|, and the 'unstable' label appears below the box name. + +**Missing** + +.. figure:: images/box-status-missing.png + :align: right + +A box that was described in a scenario but is not present in the opened version of |AuthTool| is considered as missing and its background is drawn in red color. This means that the launched version of |AuthTool| cannot find the information regarding this box and thus cannot play it. +Note that the default tree view shows only stable and fully supported boxes. To use "unstable" boxes set Designer_ShowUnstable to TRUE or tick the corresponding box on top of the tree view. As stated in their documentation pages, unstable boxes can have unexpected behaviors. + +Box Manipulation +~~~~~~~~~~~~~~~~ + +All box algorithms may be configured in |AuthTool|. However, not all boxes offer the same configuration options. In this overview, we'll focus on functionalities that are common to all boxes. More advanced possibilities are detailed in another tutorial (Tutorial 3: Advanced box configuration). + +To illustrate box editing functionalities, let's start by creating a new scenario, and drop a couple of boxes from the box algorithms tab. Simple boxes such as *Time Signal* and (found under the 'Data Generation' category) will do for this tutorial. Drag and drop these boxes in the scenario working area, then right-click on the *Time Signal* box. A context menu should appear, listing different editing functionalities. + +Box editing functionalities appear in the lower part of the menu: + +- **Rename box (F2)** allows to rename the box. Click this option and enter a new name such as 'Dummy Box' to test this functionality. +- **Delete box (Del)** removes this box from the scenario. Note that a box may also be deleted by selecting it, then pressing the 'Delete' key. +- **About box** displays a dialog containing a summary of the box details, such as its author, version, the version of |AuthTool| in which the box was added and last updated, the class name, as well as a short and long description of its purpose. Note that the 'short description' field also appears in the second column of the box algorithms tab. + +Another option only gets listed for those boxes that offer configurable settings, such as the *Time Signal* box (this is indicated from its name displayed in bold case). Right click on this box and select: + +- **Configure box**, which displays the Box Settings dialog. Note that this dialog may also be displayed by double clicking on the box itself. + +Scenario Manipulation +--------------------- + + +Standard cut/copy/paste functionalities are supported in |AuthTool|. Select a box and right click on it to display a menu from which to select these options. + +Groups of boxes may be edited in the same way. Select several boxes at once by maintaining the **Ctrl** key pressed then clicking on the boxes you want to cut or copy. You may also draw a selection area by left clicking in the scenario editing area then drawing a selection rectangle while keeping the button pressed. **Ctrl+A** selects everything in the scenario. + +Cut/copy your selection by right clicking on it then selecting the corresponding entry, or by pressing **Ctrl+X/Ctrl+C**. + +Paste your selection by right clicking anywhere in the edition area, or pressing **Ctrl+V**. Note that you may also paste selections from one scenario to another. + +Delete your selection by selecting 'Delete boxes' in the contextual menu, or pressing the **Delete** key. + +Finally, the origin of the scenario editing area may be changed by pressing and holding the Shift key and left click then moving the mouse as desired. This allows you to explore your scenario window without using the scrolling bars. + +Scenario Settings +----------------- + +Scenarios, much like boxes, can have their own settings. To access the settings of a scenario click on the **Scenario Configuration** tab in the right pane. + +.. figure:: images/scenario-settings.png + :alt: Scenario Settings + :align: center + + Scenario Configuration Pane + +Adding Settings +~~~~~~~~~~~~~~~ + + +To add a setting to the current scenario, press the **Configure Settings** button. A new window will appear. In it you are able to modify all settings the currently open scenario has. + +Adding a setting is similar to adding a setting to a box. You can use all available types as well. + +Once you add a setting it will appear in the list. There are several actions you can do on a setting. + + +.. figure:: images/scenario-settings-annotated.png + :alt: Scenario Settings Configuration Dialog + :align: center + + Scenario Settings Configuration Dialog + + +1. Rename setting +2. Delete setting +3. Move setting up +4. Move setting down +5. Change default setting's value +6. Change setting's type + +When you close the setting configuration dialog box, your new settings will appear in the Scenario Configuration pane. + +Modifying Settings +~~~~~~~~~~~~~~~~~~ + +You can change the setting’s value inside the tab **Scenario Configuration**. + +.. figure:: images/scenario-configuration-annotated.png + :alt: Scenario Configuration with Settings + :align: center + + Scenario Configuration with Settings + +1. Modify the settings value +2. Reset setting to its default value +3. Copy the current setting identifier wrapped in ``$var{}`` (explained in next step) + + +Using Settings +~~~~~~~~~~~~~~ + + +Scenario Settings can be used in place of any setting of a box. In order to do so, right-click on the box, then click on configure box option and simply change the setting inside that box to a token named after the Scenario Setting wrapped inside a ``$var{}`` token. + +In our example for DSP: + + +.. figure:: images/box-settings-variables.png + :alt: Box Settings with Variables + :align: center + + Using scenario settings + +In order to simplify the process there is a convenience button that copies the whole string for a particular setting (Button labelled 3 in previous paragraph). diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/04-metaboxes.rst b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/04-metaboxes.rst new file mode 100644 index 0000000..26ca3de --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/04-metaboxes.rst @@ -0,0 +1,117 @@ +Metaboxes +========= + +In |Brand| |AuthTool| you can create new boxes by assembling them from parts of other boxes, they are called metaboxes. This section describes their usage. Metaboxes are loaded on start-up of the |Brand| |AuthTool|. They are loaded from the directories ``$InstallDir/share/openvibe/metaboxes`` and ``%APPDATA%/mensia/metaboxes``. These metaboxes are written under the formats ``.mxb`` or ``.mbb``. + +A Metabox behaves just like a normal box, that is: + +- It has an arbitrary number of inputs and outputs using the same types as other boxes. +- It can have an arbitrary number of settings. +- It can be inserted into a scenario. +- It can have visualizations. + +Creating Metaboxes +------------------ + +In order to create a Metabox you first have to create a scenario. + +Example: we want to make a Metabox that will apply a notch filter for 48-52Hz and then apply an arbitrary band-pass filter on the signal. + +Thus, our Metabox consists of: + +- One Signal input +- One Signal output +- Two temporal filter boxes +- Two settings + - Lower frequency bound + - Upper frequency bound + +Step 1: Adding boxes and settings +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +We create a new empty scenario and add two settings to it, we also drag two temporal filter boxes inside and set them up like so: + +.. figure:: images/metaboxes/creating-01.png + :alt: Creating a metabox - step 1 + :align: center + + Creating a metabox - step 1 + + +First Temporal filter box is renamed Band Pass, the second one is renamed Notch filter (right-click + rename box: Notch Filter). + +We set the notch filter to a band stop filter with cut off frequencies at 48 and 52Hz. + +Step 2: Adding inputs and outputs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +In order to "expose" inputs and outputs of our metabox we need to add some inputs and outputs to a scenario. + +To do so we use the Scenario I/O tab. To add an input or output simply click the appropriate add button. A setting has only a name and a type. By default, the created type is Streamed Matrix. + +- Add one **input** to the scenario, change its type to **Signal** and rename it to **Input Signal** +- Add one **output** to the scenario, change its type to **Signal** and rename it to **Filtered Signal** + + +.. figure:: images/metaboxes/creating-02.png + :alt: Adding inputs and outputs + :align: center + + Adding inputs and outputs + + +In order to associate a scenario input with a box input, right click on the box you wish to send the input to. A new context menu item will be available: **Connect scenario inputs**. In this context menu item will be a list of all box inputs which will again open a list of all scenario inputs. Clicking on the scenario input will link the box input to the scenario input. + +Right click on the **Notch filter** box. In the **connect scenario inputs** submenu you will see the single input of the box. Incidentally it is also called *Input Signal*, under this item there will be another item called *Input Signal* – this is our scenario’s input. + + +.. figure:: images/metaboxes/creating-03.png + :alt: Linking a scenario input + :align: center + + Linking a scenario input + +Now do the same for the output. A circular indicator will be displayed to represent the link between the scenario input and the box input. + +.. figure:: images/metaboxes/creating-04.png + :alt: Linked inputs and outputs + :align: center + + Linked inputs and outputs + +Each scenario input can be linked to exactly one box input. If you wish to use the same input in several boxes, use an identity box. + +Step 3: Adding Metadata +~~~~~~~~~~~~~~~~~~~~~~~ + + +The metabox reads its metadata from the scenario information. You can edit it by clicking on the star button in the toolbar. + +The most important attributes are **Name**, **Category** and **Metabox Id**. This is how your box will be identified inside the box-algorithm list. + +The **Metabox Id** serves as a unique identifier for this box. You can either specify it yourself (as a group of two 32bit hex integers) or use the refresh button to generate one. + +Save your box inside the ``%APPDATA%/mensia/metaboxes`` folder. + + +.. figure:: images/metaboxes/creating-05.png + :alt: Change about scenario + :align: center + + Change about scenario + +Using a Metabox +--------------- + +Metaboxes will appear in the sidebar just like the other boxes, except they are highlighted in a green colour. + +You can drag a metabox into the scenario as you would any other box. It will appear with a double border. + +.. figure:: images/metaboxes/using-in-scenario.png + :alt: Metabox in scenario + :align: center + + Metabox in scenario + +Double clicking on the metabox will reveal all of the settings of the scenario that represents the metabox. You can also right click on a metabox and open it in editor from the context menu *Edit this metabox in the editor*. diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/05-configuration.rst b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/05-configuration.rst new file mode 100644 index 0000000..2cca8e3 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/05-configuration.rst @@ -0,0 +1,79 @@ +.. _studio-configuration: + +Configuration Manager +===================== + +In this section, we review a component common to the whole |Brand| software platform: the **configuration manager**. We start with this component as we will mention several times in this document how specific behavior can be changed according to this configuration manager. + +The |Brand| Configuration Manager is a software component in charge of configuring |Brand| applications and modules according to the user's wishes. Configuration settings are saved in a configuration file, which is loaded at application startup. This file uses a simple syntax, where configuration tokens are listed and given a value. You can check all the configuration tokens in |AuthTool| (Menu Edit/Preferences). + +Configuration Files +------------------- + +|Brand| comes with **a default configuration file** (``share/openvibe/kernel/openvibe.conf``), automatically loaded at startup. This file lists configuration tokens used by the applications. + +Users can edit **a personal configuration file** in order to customize their |Brand| software platform, by overwriting existing token or declaring new ones. In order to do so, create a file named ``openvibe-workspace.conf`` in the folder next to the scenarios you are running. This file will impact all scenarios next to it. + +Syntax +------ + + +A configuration file basically looks like successive ``token = value`` statements. + +For example, the application can retrieve its root path (|Brand| installation path) from the Path_Root variable. The path is expressed relative to the execution directory bin, so the root path is simply: + + +.. code-block:: ini + + Path_Root = .. + +Leading and tailing spaces are allowed, and are removed automatically: + +.. code-block:: ini + + Path_Root = .. + +Comments may be stored on their own lines. They begin after the ``#`` character: + +.. code-block:: ini + + #this is a valid comment + Path_Root = .. + +Lines ending with a ``\`` character continue to the next line, the last ``\`` character of a line is automatically removed by the parser. Note that ``\`` is used as an escape character. To write a path, you should use ``/``: + +.. code:: + + #this is a line that extends\ + to the next line + Path_Root = .. + +Tokens declared anywhere in the configuration file may be used as values for other tokens. The syntax to be used is: ``${token}`` +For example, the binaries path may be declared as such: + +.. code-block:: ini + + Path_Root = .. + Path_Bin = ${Path_Root}/bin + +Configuration files can include other configuration files thanks to a simple syntax: + +.. code-block:: ini + + Include = path/to/my/config/file.conf + +All tokens are read sequentially, and thus can be overwritten during the process. + +Existing Tokens +--------------- + +Several tokens such as *Path_Root* and *Path_Bin* are defined in the default configuration file, and can be overwritten in user-defined configuration files. The token *Player_ScenarioDirectory* is useful when designing a scenario. This token is changed as the path of the scenario when playing it. This is useful to load a file in the same folder as your current scenario. To have the complete list of these tokens, and their values, you can open the window **Preferences**. + +Defining and Using Custom Tokens +-------------------------------- + +Defining your own token can be very useful as you can use them afterwards everywhere in |Brand|. For example, you can define a token ``LowPassFrequency = 40``. You can then use it as a setting in several temporal filters (``${LowPassFrequency}``). Changing the token value will automatically change the filtering frequency in every temporal filter at once, which can be very handy: modification is global and switching from one frequency to another is fast and easy. + +We will describe a concrete example that illustrates the use of custom configuration tokens, in paragraph "Appendix A: Using Configuration Tokens to Setup an Experiment Environment". + + diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/06-data-visualization.rst b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/06-data-visualization.rst new file mode 100644 index 0000000..0942d3b --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/06-data-visualization.rst @@ -0,0 +1,11 @@ +Data Visualization +================== + +.. toctree:: + :maxdepth: 2 + + data-visualization/01-index + data-visualization/02-concepts + data-visualization/03-configuration + data-visualization/04-usecases + \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/01-index.rst b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/01-index.rst new file mode 100644 index 0000000..5e0f325 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/01-index.rst @@ -0,0 +1,32 @@ +.. _Doc_Mensia_AdvViz: + +Advanced Visualization +====================== + + General information on the Advanced Visualization Toolset: + + - :ref:`Doc_Mensia_AdvViz_Generalities` : generalities about the toolset. + - :ref:`Doc_Mensia_AdvViz_Concepts` : understanding the Toolset design and the different visualization paradigms. + - :ref:`Doc_Mensia_AdvViz_Configuration` : how to configure the Advanced Visualization boxes. + - :ref:`Doc_Mensia_AdvViz_UseCases` : concrete examples of use, from spectral analysis to ERP display. + + +.. _Doc_Mensia_AdvViz_Generalities: + +Generalities +------------ + +To be able to use all the features in the Mensia Advanced Visualization +Toolset, please verify that your setup meets the following recommendations. + +OpenGL OpenGL dependency +~~~~~~~~~~~~~~~~~~~~~~~~ + +The Toolset relies on the `OpenGL `_ library +for every rendering operations, from signal display to 3D reconstruction. You +must ensure that your computer is equipped with an OpenGL-compatible graphic +card or chipset. This should be the case on any recent computer. + +You should also ensure that your graphic card drivers are up-to-date. Please +refer to the manufacturer website for more information. + diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/02-concepts.rst b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/02-concepts.rst new file mode 100644 index 0000000..c50e422 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/02-concepts.rst @@ -0,0 +1,263 @@ +.. _Doc_Mensia_AdvViz_Concepts: + +Concepts +======== + + +.. _Doc_Mensia_AdvViz_Concepts_Intro: + +Introduction +------------ + + +The **Mensia Advanced Visualization Toolset** is a collection of boxes +dedicated to the visualization of the result of electrophysiological signal +analysis, and are especially suitable for the **real-time analysis of EEG +signals**, from raw signal display to 3D source reconstruction. + +It addresses many different use-cases among users. Neurophysiologists can +observe accurately in real-time **spatial and temporal patterns** in the brain +activity (motor activity, cognitive processes). EEG signal processing +specialists can **evaluate and compare** instantly algorithms effects +(source separation, denoising techniques). BCI researchers can study how their +ERP-based system may be tuned to elicit and detect the best brain response. + + +.. figure:: images/designer-box-list.png + :align: center + + Simple integration in the graphical user interface + +.. _Doc_Mensia_AdvViz_Concepts_VisualizationParadigms: + +Visualization paradigms +----------------------- + +This Toolset has been designed to be very versatile. The main design concept +revolves around the data presentation. You basically want to display matrices +of numbers which may have temporal, and/or spatial meanings. The most adapted +data presentation may vary from one case to another, according to the type of +events or patterns on which you need to get a good contrast. + +Before choosing the right visualization box, ask yourself: + +- How do I want my data to be displayed? curves? levels? +- What will be the best way to **enhance the contrast** between the information I want to extract and the rest of the data ? +- Is my data stream **continuous** in time? or am I dealing with discontinuous epochs (e.g. ERPs) ? + +To be adapted in most situation, the Mensia Advanced Visualization Toolset has +been designed to cover different visualization paradigms. Take a look at all +the possibilities and choose what will best fit your needs. + +- :ref:`Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Oscilloscope` +- :ref:`Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Bars` +- :ref:`Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Bitmap` +- :ref:`Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Topo` +- :ref:`Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Reco` + +You can also have a look at the :ref:`Doc_Mensia_AdvViz_UseCases` "list of use-cases", showing how each box can be used on concrete, real-life examples. + +.. _Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Oscilloscope: + +The Oscilloscope view +~~~~~~~~~~~~~~~~~~~~~ + +It is the most basic paradigm, used to display temporal numerical data in the +form of **curves** (dots linked by lines). The Oscilloscope views are all +expecting **centered** values (i.e. distributed around 0). Hence it is advised +to use at least one temporal filter (e.g. band passing between 2 and 40 Hz +using a :ref:`Doc_BoxAlgorithm_TemporalFilter` box) before displaying an EEG +signal. + +Four boxes use this paradigm: + +- :ref:`Doc_BoxAlgorithm_ContinuousOscilloscope` box: displays continuous data from left to right on a defined horizontal scale (goes back to origin upon reaching the end of the scale), channels are displayed vertically one after another, but spikes may overlap. +- :ref:`Doc_BoxAlgorithm_InstantOscilloscope` box: displays each block of data received as it comes, filling all the horizontal space available. +- :ref:`Doc_BoxAlgorithm_ContinuousMultiOscilloscope` box: same as the Continuous Oscilloscope, but every input channels are displayed along the same horizontal axis with a different color, additively. +- :ref:`Doc_BoxAlgorithm_InstantMultiOscilloscope` box: same as the Instant Oscilloscope, but every input channels are displayed along the same horizontal axis with a different color, additively. + +**Example**: raw EEG signal display. + +.. figure:: /boxes/images/ContinuousOscilloscope_Display.png + :align: center + + Continuous Oscilloscope displaying 2 EEG channels + +.. _Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Bars: + +The Bar view +~~~~~~~~~~~~ + +Like histograms, this paradigm can be used to display and compare **series of +levels**. Levels are displayed one after another from left to right, within a +**color gradient**. Channels are displayed vertically, one after another with a +fixed interval (thus some "high" levels may overlap). With a high definition +(i.e. a rather high frequency display), the result can be viewed as a curve +colored below the line. + +Two boxes uses this paradigm: + +- :ref:`Doc_BoxAlgorithm_ContinuousBars` box: displays continuous data from left to right on a defined horizontal scale (goes back to origin upon reaching the end of the scale). +- :ref:`Doc_BoxAlgorithm_InstantBars` box: displays each block of data received as it comes, filling all the horizontal space. + +**Example**: spectrum display. + +.. figure:: /boxes/images/InstantBars_Display.png + :align: center + + Instant Bars displaying the signal spectrum + +.. _Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Bitmap: + +The Bitmap view +~~~~~~~~~~~~~~~ + +The bitmap paradigm displays matrices of data using a color gradient. The +result is a **2D map where each cell is given a color "bit"** . This view +using colors can enhance easily the constrast between 2 temporal or spatial +patterns, as the difference between "cold" and "hot" colors is quickly caught +by the analyst's eye. You can even add an additional dimension by using +**stacked bitmaps** : every time a new bitmap is received, it is placed on top +or left to the previous one. + +Four boxes uses this paradigm: + +- :ref:`Doc_BoxAlgorithm_ContinuousBitmap` box: displays continuous data from left to right on a defined horizontal scale (goes back to origin upon reaching the end of the scale). +- :ref:`Doc_BoxAlgorithm_InstantBitmap` box: displays each block of data received as it comes, filling all the horizontal space. +- :ref:`Doc_BoxAlgorithm_StackedBitmapVertical` box: each bitmap is placed on **top** of the previous one. +- :ref:`Doc_BoxAlgorithm_StackedBitmapHorizontal` box: each bitmap is placed **left** to the previous one. + +**Example**: Time-frequency map. + +.. figure:: /boxes/images/StackedBitmapHorz_Display.png + :align: center + + Stacked Bitmap (Horizontal) displaying the result of a Time-Frequency analysis + +.. _Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Topo: + +The Topographic view +~~~~~~~~~~~~~~~~~~~~ + +This paradigm adds a strong spatial constraint on the input data: each channel +must be **labelled with an electrode name** in a defined nomenclature, such as +the standard 10-20 system. Please see +:ref:`Doc_Mensia_AdvViz_Concepts_ChannelLocalization` for further details. + +Here again the data itself is displayed using a color gradient, mapped to a 2D or 3D model using **spherical spline interpolation**. + +For more details about the spherical spline interpolation, please check *F. +Perrin, J. Pernier, O. Bertrand, J.F. Echallier, Spherical splines for scalp +potential and current density mapping, Electroencephalography and Clinical +Neurophysiology, Volume 72, Issue 2, February 1989, Pages 184-187*. The 2D +model is a planar projection of the scalp, covering the scalp roughly from the +frontal area to the occipital area (i.e. from Fp1-Fp2 to O9-O10 sites). The +projection result takes the shape of a disk with a crescent growth at the back +for the occipital region. + +Three boxes uses this paradigm: + +- :ref:`Doc_BoxAlgorithm_2DTopography` box: maps the input (which channels are labelled in the 10-20 system standard) to a planar projection of the scalp. +- :ref:`Doc_BoxAlgorithm_3DTopography` box: maps the input (which channels are labelled in the 10-20 system standard) to a projection on a 3D model of the scalp. +- :ref:`Doc_BoxAlgorithm_3DCubes` box: an alternative view where each channel is represented by a 3D cube, positionned in space as the electrode would be on the 3D model. + +The activity is rendered by changing the size and color of the cubes. + +**Example**: Displaying the power of a specific frequency band on a 3D head model. + +.. figure:: /boxes/images/3DTopography_Display.png + :align: center + + Alpha power mapped on a head model using the 3D topography + +.. _Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Reco: + +The Reconstruction view +~~~~~~~~~~~~~~~~~~~~~~~ + +Tomographic reconstruction algorithms offer an inside look, into the brain, +from only surface measurements. Several techniques exist, including the +algorithms of the popular LORETA family which slice the brain in a stack of +little cubes called voxels, and computes the *inverse model*, a model +reconstructing the sources of the potentials acquired at the measurement site. + +One box implements the source reconstruction view: + +- :ref:`Doc_BoxAlgorithm_3DTomographicVisualization` box : displays a 3D source reconstruction using 2394 colored/translucent voxels in a 3D head model. + +This box expects 2394 input channels, produced by an inverse model (i.e. a spatial filter with N sensor inputs for 2394 sources outputs). This model must be tailor-made for the precise EEG setup being used (e.g. using sLORETA). + +.. figure:: /boxes/images/3DTomographicVisualization_Display.png + :align: center + + 3D tomographic reconstruction using the 3D Tomographic Visualization box + + +.. _Doc_Mensia_AdvViz_Concepts_ChannelLocalization: + +Channel localization +~~~~~~~~~~~~~~~~~~~~ + +Every visualization box can use the spatial information conveyed by the +electrode naming. The channels can be positionned relatively to each other as +long as you provide in the box settings a file containing the cartesian +coordinates of the electrodes. Most of the time, EEG manufacturers use the +10-20 system as an electrode naming standard. For convenience, we provide +within the Toolset a file compiling all the coordinates of the electrodes in +the 10-20 system. + +The cartesian coordinates of all the electrodes are computed in the 3D space, where the origin is at the center of [Fpz,Oz] and [T7,T8]. + +- the X axis goes from the occipital lobe to the frontal lobe +- the Y axis goes from the right temporal lobe to the left temporal lobe +- the Z axis goes from the center of the head to the top + +And as for the unit, here are some key points at the maximum of the axis: + +- Fpz (1,0,0) +- Oz (-1,0,0) +- T7 (0,1,0) +- T8 (0,-1,0) +- Cz (0,0,1) + +The following figures illustrates the cartesian coordinates of the extended 10-20 system used in the Mensia Advanced Visualization Toolset. + +.. figure:: images/CartesianCoordinates1.png + :align: center + + Cartesian coordinates of the 10-20 system, side view. + +.. figure:: images/CartesianCoordinates2.png + :align: center + + Cartesian coordinates of the 10-20 system, front view. + +For more information, please see *Oostenveld, R. & Praamstra, P. (2001). The +five percent electrode system for high-resolution EEG and ERP measurements. +Clinical Neurophysiology, 112:713-719* + +Please note that using the 10-20 system is not mandatory. To use all the Toolset features related to the spatial disposition of the electrodes, you just need to provide a file that maps electrode name with their coordinates in the space described above. + +The format of this file is simple text. You must provide: + +- the electrode names as a list of quoted labels +- the coordinate system labels +- the electrode coordinates of the electrodes, in the same order as in the electrode names + +For example: + +.. code:: + + [ + ["O1" "O2" ... ] + ["x" "y" "z" ] + ] + [ + [-0.309017 -0.951057 4.48966e-011 ] + ] + [ + [0.309017 -0.951057 4.48966e-011 ] + ] + +For a complete example, please look at the file provided with the Toolset (``../share/mensia/openvibe-plugins/cartesian.txt``) + diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/03-configuration.rst b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/03-configuration.rst new file mode 100644 index 0000000..c0ff6c5 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/03-configuration.rst @@ -0,0 +1,220 @@ +.. _Doc_Mensia_AdvViz_Configuration: + +Configuration +============= + +By design, all the boxes included in the Mensia Advanced Visualization Toolset +share a common behavior when it comes to configuring the boxes, in the scenario +edition or during its execution. In this section we describe the common +configuration parameters you find when using these boxes. + +.. _Doc_Mensia_AdvViz_Configuration_BoxSettings: + +Box settings +------------ + +You may encounter different settings, common to all or a subset of boxes, +depending on the paradigms. + +.. _Doc_Mensia_AdvViz_Configuration_ChannelLocalization: + +Channel localisation +~~~~~~~~~~~~~~~~~~~~ + +Specify here where to find the file listing the coordinates of every electrodes +by their names. Please see +:ref:`Doc_Mensia_AdvViz_Concepts_ChannelLocalization` for more details. + +For conveniency, we provide a default file +``${AdvancedViz_ChannelLocalisation}`` +(*../share/mensia/openvibe-plugins/cartesian.txt*) which contains the cartesian +coordinates of all electrodes in the extended 10-20 system. This settings is +obviously **mandatory for the Topographic views**, but can also be useful for +the other paradigms: at runtime, you can re-arrange the channels spatially by +their names (from left to right hemisphere, or from front to top). This is +useful when dealing with dense EEG (128 or more channels), which can bring a +new light, new contrast on a rather opaque data display. + +.. figure:: images/Settings_ChannelLocalisation.png + :align: center + + Spatial reorganization on a dense signal display using a Continuous Oscillator + +.. _Doc_Mensia_AdvViz_Configuration_Caption: + +Caption +~~~~~~~ + +If this field is used, this label will be displayed in the window, on top of the rendering area. + +.. _Doc_Mensia_AdvViz_Configuration_Color: + +Color +~~~~~ + +The color gradient you want to use to display the data. You can use the color picker to chose the gradient manually, or use one of the presets. + +Several presets exist in form of configuration tokens ``${AdvancedViz_ColorGradient_X}``, where X can be: + +- ``Matlab`` or ``Matlab_Discrete`` (as in `Matlab `_ / `BCILAB toolbox `_) +- ``Icon`` or ``Icon_Discrete`` (as in `ICoN `) +- ``Elan`` or ``Elan_Discrete`` (as in `Elan `_) +- ``Fire`` or ``Fire_Discrete`` +- ``IceAndFire`` or ``IceAndFire_Discrete`` + + The default values ``AdvancedViz_DefaultColorGradient`` or ``AdvancedViz_DefaultColorGradient_Discrete`` are equal to ``Matlab`` and ``Matlab_Discrete``. + +Here is an example of 2D topography rendering using these color gradients: + +.. figure:: images/2DTopography_ColorGradients.png + :align: center + + The color gradient presets available, illustrated with the 2D topography + +.. _Doc_Mensia_AdvViz_Configuration_BoxSettings_Translucency: + +Translucency +~~~~~~~~~~~~ + +This setting expects a value between 0 and 1, where 0 is complete transparency and 1 complete opacity. + +The translucency parameter is very useful when dealing with overlapping rendering, i.e. when some parts of the visualizations end up on each other. +By adding some translucency the data can still be visible, and it can also smoothen dense readings for more confort. + +.. figure:: images/Settings_Translucency-1-05.png + :align: center + + Using the translucency to allow dense yet smooth EEG reading + +.. _Doc_Mensia_AdvViz_Configuration_BoxSettings_PositiveData: + +Positive data only +~~~~~~~~~~~~~~~~~~ + +By ticking this checkbox, you shift the vertical scale of the visualization in order to have the 0 at the bottom (no negative values will be displayed) + +This setting can be activated when dealing with spectral amplitude or any kind of positive-only "levels". + +.. figure:: images/ContinuousBars_Display.png + :align: center + + Displaying a positive level (Global Field Power) using Continuous Bars + +.. _Doc_Mensia_AdvViz_Configuration_BoxSettings_Gain: + +Gain +~~~~ + +If set, all samples in the input stream are multiplied by this scalar value before display. +This can be useful when you need to display all at once different type of data on the same relative scale, with a good contrast on every view. + +.. _Doc_Mensia_AdvViz_Configuration_BoxSettings_TemporalCoherence: + +Temporal Coherence +~~~~~~~~~~~~~~~~~~ + +Tells the box whether the input stream is expected to be **Time-locked** or +**Independent**. In the first case the box should use a Time scale (in +seconds, for **continuous** data), and for the second case a Matrix count +(number of data block received, for **discontinuous** data). + +.. _Doc_Mensia_AdvViz_Configuration_BoxSettings_TimeScale: + +Time scale +~~~~~~~~~~ + +The time scale (in seconds) drives the number of values to be displayed in +continuous or stacked views before going back to the origin. Using a time +scale is meaningful only when dealing with an input stream made of continuous +epochs, e.g. signal display, time-frequency analysis. + +.. _ Doc_Mensia_AdvViz_Configuration_BoxSettings_MatrixCount: + +Matrix count +~~~~~~~~~~~~ + +The number of input epochs to display before going back to the origin. For +example in stacked bitmaps this setting is the number of bitmaps to be stacked +before going back to the bottom of the stack. + +An illustration for this setting would be the visualization of Event-Related +Potentials such as P300. In such scenario, we usually select epochs of data +uncontinuously, e.g. by extracting 600ms of signal around a target stimulation. +Setting the Temporal coherence parameter to *Independent* will make the +box display every epochs one after another, without trying to use the epoch +timings. For example, set to *Independent* when you want to stack P300 +target trials on a bitmap view, with a matrix count equal to the number of +trials you want to stack. + +.. figure:: images/StackedBitmapVert_ERPDisplay.png + :align: center + + Using a Stacked Bitmap (Vertical) to display the 3 first xDAWN components of all 99 Target trials of a P300 session + + +.. _Doc_Mensia_AdvViz_Configuration_RuntimeToolbar: + +Runtime Settings +---------------- + +This section covers the different settings available at runtime (i.e. when the +scenario is currently beeing played). Clicking on the **toolbar** will open-up +the runtime visualization settings. + +- **Sort Channels** : rearrange the channels **by their name** (alphabetically + or reversed order), or **by their position on the scalp** (left to right or + front to back). This last option is possible only if the channel are named + according to the 10-20 system, and if you provided a channel localisation + file in the box settings. + +- **Select Channels** : Select in a list the channels you want to see in the + visualization window. Use the ``Ctrl`` or ``Shift`` key to add channels to + your selection, ``Ctrl+a`` to select all channels. + +- **Show scales** : show or hide all the scales around the visualization + widget; allows nice snapshots. This setting is **global**, meaning that it + affects all the other advanced visualization windows currently running in + your scenario. Doing so preserves the widgets alignment when displaying + synchronized data. This setting can be turned on or off also by a **double + left-click** in the visualization windows itself. + +- **Positive data** : this setting is a runtime duplicate of the box setting + *Positive data only*. If checked, the vertical axis is shifted so + that 0 is at the bottom. Negative values wont be displayed. + +Depending on the temporal coherence selected in the box settings, you may find: + +- **Time scale** : this setting is a runtime duplicate of the box setting *Time scale*. + +- **Matrix count** : this setting is a runtime duplicate of the box setting *Matrix count*. + +When the visualization box implements an **Instant** paradigm for **streamed +matrices or signal input** data, a new setting is available: + +- **Epoch replay** : replays the last epoch received. + +Topographies also expose the ERP replay in adequat conditions. This feature is +**global**, meaning that the replay is performed simultaneously on every +compatible boxes. This allows for example on-demand replays of ERPs, +simultaneously on a signal display and a topography. + +.. figure:: images/3DTopography_ERPReplay.png + :align: center + + Using the ERP replay feature on a 3D topography to catch the spatial course of the potential + +.. _Doc_Mensia_AdvViz_Configuration_RuntimeControls: + +Runtime Controls +---------------- + +All the visualization boxes share common controls at runtime, for a user-friendly, natural interaction. +Using the mouse, one can: + +- Maintain **right click** and move the mouse up or down to **zoom in or out on the data scale** +- Maintain **left click** and move the mouse to **rotate** a 3D model +- Maintain **middle click** and move the mouse to **zoom in or out on a 3D model** +- **Double left click** in the vizualisation window to remove all the scales from the frame + +All these controls are **global** , meaning that if you change the scale in one visualization window, it will change the scale in every visualization windows accordingly. + diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/04-usecases.rst b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/04-usecases.rst new file mode 100644 index 0000000..3d7fb02 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/04-usecases.rst @@ -0,0 +1,138 @@ +.. _Doc_Mensia_AdvViz_UseCases: + +Use-cases +========= + +We describe in this section of the documentation several use-cases, typical and +concrete examples of EEG analysis that are enlighted by the **Mensia Advanced +Visualization Toolset**. + +.. _Doc_Mensia_AdvViz_UseCases_SignalAnalysis: + +EEG Signal analysis +------------------- + +This detailed example uses the basic OpenViBE signal processing boxes to +perform elementary real-time analysis, and the Mensia Advanced Visualization +Toolset to display the results: + +- Raw and filtered EEG +- Spectrum, time-frequency map +- 2D and 3D topographies + +You can find this scenario in the provided sample set, the scenario file name +is ``UseCase-1-EEG-signal-analysis.mxs``. + + +.. _Doc_Mensia_AdvViz_UseCases_SignalAnalysis_Intro: + +Introduction +~~~~~~~~~~~~ + +This use-case is a simple yet concrete example of real-time EEG analysis +usually performed with OpenViBE. The scenario covers the use of oscilloscope, +bitmaps, bars and topographic views to display signal, spectrum, and band +power. + +.. _Doc_Mensia_AdvViz_UseCases_SignalAnalysis_Scenario: + +The scenario +~~~~~~~~~~~~ + +The signal used is a **motor imagery** session, where the participant performed +right and left hand motor imagery trials. For more details, please refer to +the official documentation of the OpenViBE motor-imagery bci scenarios, +provided with the official release of the software. We chose these data for +demonstration purpose only as it is a file provided with the official release +of openvibe, and should be available for you anyway. + +.. _Doc_Mensia_AdvViz_UseCases_SignalAnalysis_Scenario_Filtering: + +Signal filtering +^^^^^^^^^^^^^^^^ + +We first remove artifacts using temporal filters, especially the common 50Hz +noise coming from the electrical installation. The EEG amplifier used for the +record we read here is a Mindmedia NeXuS 32b, with one reference channel put on +Nz (nose). The *Reference Channel* box applies this spatial filter to further +remove noises. + +We then use a :ref:`Doc_BoxAlgorithm_ContinuousOscilloscope` to display the +filtered signal. + +.. figure:: images/UseCase1_1.png + :align: center + + Denoising the signal before display + +.. _Doc_Mensia_AdvViz_UseCases_SignalAnalysis_Scenario_Spectrum: + +Spectral analysis +^^^^^^^^^^^^^^^^^ + +A first pipeline computes two surface Laplacian filters around C3 and C4, the +center of the two motor cortices. We then compute the spectrum using FFT, up +to 32 Hz, and display it using :ref:`Doc_BoxAlgorithm_InstantBars` (spectrum +levels) and :ref:`Doc_BoxAlgorithm_StackedBitmapHorizontal` (time-frequency +map). + +.. figure:: images/UseCase1_2.png + :align: center + + Spectral analysis over filtered data + +.. _Doc_Mensia_AdvViz_UseCases_SignalAnalysis_Scenario_Topo: + +Topographic display +^^^^^^^^^^^^^^^^^^^ + +We compute in a parallel pipeline the alpha band power, averaged over several +epochs, and visualize it over the scalp through +:ref:`Doc_BoxAlgorithm_2DTopography` and :ref:`Doc_BoxAlgorithm_3DTopography`. + +.. figure:: images/UseCase1_3.png + :align: center + + Topographic display of the alpha band power over the scalp + +.. _Doc_Mensia_AdvViz_UseCases_SignalAnalysis_Result: + +Result +~~~~~~ + +Here is the online visualization when we play this scenario on the provided +data. + +.. figure:: images/UseCase1_6.png + :align: center + + Signal display + +.. figure:: images/UseCase1_4.png + :align: center + + Spectrum visualization + +.. figure:: images/UseCase1_5.png + :align: center + + 2D and 3D Topographies + +.. _Doc_Mensia_AdvViz_UseCases_ERPAnalysis: + +Event-Related Potentials analysis +--------------------------------- + +This use-case is focused on the ERP extraction and visualization, applied to +P300 speller data. The Mensia Advanced Visualization boxes allows concurrent +and comparative displays (e.g. target versus non-target potentials), and +synchronized replay capabilities + +You can find this scenario in the provided sample set, the scenario file name +is ``UseCase-2-ERP-analysis.mxs``. + + + + + + diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/2DTopography_ColorGradients.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/2DTopography_ColorGradients.png new file mode 100644 index 0000000..39372c8 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/2DTopography_ColorGradients.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/3DTopography_ERPReplay.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/3DTopography_ERPReplay.png new file mode 100644 index 0000000..655adef Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/3DTopography_ERPReplay.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/CartesianCoordinates1.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/CartesianCoordinates1.png new file mode 100644 index 0000000..24f33db Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/CartesianCoordinates1.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/CartesianCoordinates2.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/CartesianCoordinates2.png new file mode 100644 index 0000000..e04bb30 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/CartesianCoordinates2.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/ContinuousBars_Display.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/ContinuousBars_Display.png new file mode 100644 index 0000000..e79f73e Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/ContinuousBars_Display.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/Settings_ChannelLocalisation.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/Settings_ChannelLocalisation.png new file mode 100644 index 0000000..9c84094 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/Settings_ChannelLocalisation.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/Settings_Translucency-1-05.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/Settings_Translucency-1-05.png new file mode 100644 index 0000000..bc257b4 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/Settings_Translucency-1-05.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/StackedBitmapVert_ERPDisplay.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/StackedBitmapVert_ERPDisplay.png new file mode 100644 index 0000000..b3b2e43 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/StackedBitmapVert_ERPDisplay.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_1.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_1.png new file mode 100644 index 0000000..09577ec Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_1.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_2.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_2.png new file mode 100644 index 0000000..c76d493 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_2.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_3.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_3.png new file mode 100644 index 0000000..e4f0fd9 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_3.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_4.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_4.png new file mode 100644 index 0000000..11ba0d2 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_4.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_5.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_5.png new file mode 100644 index 0000000..fc23034 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_5.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_6.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_6.png new file mode 100644 index 0000000..2c714a0 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/UseCase1_6.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/designer-box-list.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/designer-box-list.png new file mode 100644 index 0000000..a743bc1 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/data-visualization/images/designer-box-list.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-settings-variables.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-settings-variables.png new file mode 100644 index 0000000..358652c Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-settings-variables.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-settings.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-settings.png new file mode 100644 index 0000000..c759aaf Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-settings.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-status-deprecated.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-status-deprecated.png new file mode 100644 index 0000000..5f176f5 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-status-deprecated.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-status-missing.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-status-missing.png new file mode 100644 index 0000000..6b6b004 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-status-missing.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-status-unstable.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-status-unstable.png new file mode 100644 index 0000000..4edbbde Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-status-unstable.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-status-update.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-status-update.png new file mode 100644 index 0000000..bc1c982 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box-status-update.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box.png new file mode 100644 index 0000000..2664bcb Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/box.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/console-annotated.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/console-annotated.png new file mode 100644 index 0000000..d4accf5 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/console-annotated.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/icon-add-comment.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/icon-add-comment.png new file mode 100644 index 0000000..c629bae Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/icon-add-comment.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/icon-log-levels.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/icon-log-levels.png new file mode 100644 index 0000000..82b67ad Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/icon-log-levels.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/icon-scenario-controls.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/icon-scenario-controls.png new file mode 100644 index 0000000..1662a55 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/icon-scenario-controls.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/icon-scenario-information.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/icon-scenario-information.png new file mode 100644 index 0000000..44b970a Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/icon-scenario-information.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/icon-window-manager.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/icon-window-manager.png new file mode 100644 index 0000000..3fdf83b Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/icon-window-manager.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/log-levels.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/log-levels.png new file mode 100644 index 0000000..c2c930b Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/log-levels.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/menubar-edit.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/menubar-edit.png new file mode 100644 index 0000000..c677813 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/menubar-edit.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/menubar-file.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/menubar-file.png new file mode 100644 index 0000000..bc73609 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/menubar-file.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/menubar-help.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/menubar-help.png new file mode 100644 index 0000000..1574bfd Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/menubar-help.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/creating-01.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/creating-01.png new file mode 100644 index 0000000..039706c Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/creating-01.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/creating-02.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/creating-02.png new file mode 100644 index 0000000..4e10526 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/creating-02.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/creating-03.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/creating-03.png new file mode 100644 index 0000000..31bea53 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/creating-03.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/creating-04.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/creating-04.png new file mode 100644 index 0000000..faa09b5 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/creating-04.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/creating-05.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/creating-05.png new file mode 100644 index 0000000..18d51af Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/creating-05.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/using-in-scenario.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/using-in-scenario.png new file mode 100644 index 0000000..3fcaa56 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/metaboxes/using-in-scenario.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-comment-editor.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-comment-editor.png new file mode 100644 index 0000000..62967bf Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-comment-editor.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-comment.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-comment.png new file mode 100644 index 0000000..6f1ae86 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-comment.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-configuration-annotated.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-configuration-annotated.png new file mode 100644 index 0000000..2d014e6 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-configuration-annotated.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-information.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-information.png new file mode 100644 index 0000000..5288916 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-information.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-settings-annotated.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-settings-annotated.png new file mode 100644 index 0000000..48e8edd Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-settings-annotated.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-settings.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-settings.png new file mode 100644 index 0000000..8f77158 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/scenario-settings.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/studio-interface-annotated.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/studio-interface-annotated.png new file mode 100644 index 0000000..df6aa99 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/studio-interface-annotated.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/toolbar-annotated.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/toolbar-annotated.png new file mode 100644 index 0000000..d501559 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/toolbar-annotated.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/window-manager-4-panes.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/window-manager-4-panes.png new file mode 100644 index 0000000..e95692a Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/window-manager-4-panes.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/window-manager.png b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/window-manager.png new file mode 100644 index 0000000..e3d42e3 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/images/window-manager.png differ diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/index-designer.rst b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/index-designer.rst new file mode 100644 index 0000000..05050f4 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/designer/index-designer.rst @@ -0,0 +1,14 @@ +|Brand| |AuthTool| +================== + +The |Brand| |AuthTool| is an authoring tool dedicated to creating and executing |AuthTool| scenarios. + +.. toctree:: + :maxdepth: 2 + + 01-introduction + 02-interface + 03-scenario-authoring + 04-metaboxes + 05-configuration + 06-data-visualization diff --git a/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/index.rst b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/index.rst new file mode 100644 index 0000000..e0bf08b --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/documentation/sphinx/source/index.rst @@ -0,0 +1,25 @@ +OpenViBE Documentation +====================== + +OpenViBE Desginer Documentation +------------------------------- + +.. toctree:: + :maxdepth: 2 + + designer/index-designer + +Available Boxes +--------------- +.. toctree:: + :maxdepth: 1 + + boxes/index-boxes + +Data Formats Documentation +-------------------------- + +.. toctree:: + :maxdepth: 2 + + data-formats/index-data-formats diff --git a/Masterarbeit/openvibe/designer-master/libraries/CMakeLists.txt b/Masterarbeit/openvibe/designer-master/libraries/CMakeLists.txt new file mode 100644 index 0000000..b7c6373 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/CMakeLists.txt @@ -0,0 +1,2 @@ +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("LIBRARIES") diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/CMakeLists.txt b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/CMakeLists.txt new file mode 100644 index 0000000..b5d042b --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/CMakeLists.txt @@ -0,0 +1,47 @@ +PROJECT(mensia-advanced-visualization) +MESSAGE(STATUS "Now building ${PROJECT_NAME} ${PROJECT_VERSION} (${OV_PROJECT_BRANCH}~${OV_PROJECT_COMMITHASH})" ) + +INCLUDE_DIRECTORIES("include/mensia/") +INCLUDE_DIRECTORIES("include/mensia/advanced-visualization") + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.hpp include/*.hpp) +INCLUDE("FindSourceRCProperties") +ADD_LIBRARY(${PROJECT_NAME}-static STATIC ${SRC_FILES}) +ADD_LIBRARY(${PROJECT_NAME} SHARED EXCLUDE_FROM_ALL ${SRC_FILES}) + +IF(UNIX) + SET_TARGET_PROPERTIES(${PROJECT_NAME}-static PROPERTIES COMPILE_FLAGS "-fPIC") +ENDIF(UNIX) + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + COMPILE_FLAGS "-DLMAV_Exports -DLMAV_Shared") + +ADD_DEFINITIONS(-D_USE_MATH_DEFINES) # Definition for constant math as M_PI + +INCLUDE("FindThirdPartyOpenGL") +INCLUDE("FindThirdPartyEigen") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +#INSTALL(TARGETS ${PROJECT_NAME} +# RUNTIME DESTINATION ${DIST_BINDIR} +# LIBRARY DESTINATION ${DIST_LIBDIR} +# ARCHIVE DESTINATION ${DIST_LIBDIR}) +INSTALL(TARGETS ${PROJECT_NAME}-static + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + + +INSTALL(DIRECTORY include/ DESTINATION ${DIST_INCLUDEDIR} FILES_MATCHING PATTERN "*.hpp") + +ADD_SUBDIRECTORY(test) diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/include/mensia/advanced-visualization.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/include/mensia/advanced-visualization.hpp new file mode 100644 index 0000000..84c193a --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/include/mensia/advanced-visualization.hpp @@ -0,0 +1,25 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "advanced-visualization/mIRenderer.hpp" +#include "advanced-visualization/mCRendererContext.hpp" +#include "advanced-visualization/mCVertex.hpp" diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/include/mensia/advanced-visualization/mCRendererContext.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/include/mensia/advanced-visualization/mCRendererContext.hpp new file mode 100644 index 0000000..4b4fa63 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/include/mensia/advanced-visualization/mCRendererContext.hpp @@ -0,0 +1,173 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "m_defines.hpp" + +#include +#include +#include // size_t for unix +#include +#include "mCVertex.hpp" +#include + +namespace OpenViBE { +namespace AdvancedVisualization { +class LMAV_API CRendererContext +{ +public: + + enum class EDataType { Matrix, Signal, Spectrum, TimeFrequency }; + + CRendererContext() { clear(); } + explicit CRendererContext(CRendererContext* parentCtx); + + ~CRendererContext() = default; + + void clear(); + + void setParentRendererContext(CRendererContext* ctx) { m_parentCtx = ctx; } + + void clearChannelInfo(); + void addChannel(const std::string& name, float x = 0, float y = 0, float z = 0); + void selectChannel(const size_t index); + void unselectChannel(const size_t index); + void sortSelectedChannel(const size_t mode); + + void setDimensionLabel(const size_t idx1, const size_t idx2, const char* label); + size_t getDimensionLabelCount(const size_t index) const; + const char* getDimensionLabel(const size_t idx1, const size_t idx2) const; + + void clearTransformInfo(); + void scaleBy(const float scale) { m_scale *= scale; } + void setScale(const float scale) { m_scale = scale; } + void zoomBy(const float zoom) { m_zoom *= zoom; } + void rotateByX(const float rotation) { m_rotationX += rotation; } + void rotateByY(const float rotation) { m_rotationY += rotation; } + + void setTranslucency(const float translucency) { m_translucency = translucency; } + void setAspect(const float aspect) { m_aspect = aspect; } + void setSampleDuration(const uint64_t sampleDuration) { m_sampleDuration = sampleDuration; } + void setTimeScale(const size_t timeScale) { m_timeScale = timeScale; } + void setElementCount(const size_t elementCount) { m_nElement = elementCount; } + void setFlowerRingCount(const size_t flowerRingCount) { m_nFlowerRing = flowerRingCount; } + void setXYZPlotDepth(const bool hasDepth) { m_hasXYZPlotDepth = hasDepth; } + void setAxisDisplay(const bool isAxisDisplayed) { m_isAxisDisplayed = isAxisDisplayed; } + void setPositiveOnly(const bool bPositiveOnly) { m_isPositiveOnly = bPositiveOnly; } + void setTimeLocked(const bool timeLocked) { m_isTimeLocked = timeLocked; } + void setScrollModeActive(const bool scrollModeActive) { m_isScrollModeActive = scrollModeActive; } + void setScaleVisibility(const bool visibility) { m_scaleVisiblity = visibility; } + void setCheckBoardVisibility(const bool visibility) { m_checkBoardVisiblity = visibility; } + void setDataType(const EDataType type) { m_dataType = type; } + void setSpectrumFrequencyRange(const size_t range) { m_spectrumFreqRange = range; } + void setMinimumSpectrumFrequency(const size_t frequency) { m_minSpectrumFreq = frequency; } + void setMaximumSpectrumFrequency(const size_t frequency) { m_maxSpectrumFreq = frequency; } + void setStackCount(const size_t count) { m_nStack = count; } + void setStackIndex(const size_t index) { m_stackIdx = index; } + void setFaceMeshVisible(const bool visible) { m_faceMeshVisible = visible; } + void setScalpMeshVisible(const bool visible) { m_scalpMeshVisible = visible; } + + void setERPPlayerActive(const bool active) { m_erpPlayerActive = active; } + void stepERPFractionBy(const float erpFraction) { m_erpFraction += erpFraction; } + + std::string getChannelName(const size_t index) const; + bool getChannelLocalisation(const size_t index, float& x, float& y, float& z) const; + size_t getChannelCount() const { return m_channelName.size(); } + size_t getSelectedCount() const { return m_channelLookup.size(); } + size_t getSelected(const size_t index) const { return m_channelLookup[index]; } + bool isSelected(const size_t index) const; + + float getScale() const { return m_scale * (m_parentCtx ? m_parentCtx->getScale() : 1); } + float getZoom() const { return m_zoom * (m_parentCtx ? m_parentCtx->getZoom() : 1); } + float getRotationX() const { return m_rotationX + (m_parentCtx ? m_parentCtx->getRotationX() : 0); } + float getRotationY() const { return m_rotationY + (m_parentCtx ? m_parentCtx->getRotationY() : 0); } + + float getTranslucency() const { return m_translucency * (m_parentCtx ? m_parentCtx->getTranslucency() : 1); } + float getAspect() const { return m_aspect * (m_parentCtx ? m_parentCtx->getAspect() : 1); } + uint64_t getSampleDuration() const { return m_sampleDuration; } + size_t getTimeScale() const { return m_timeScale; } + size_t getElementCount() const { return m_nElement; } + size_t getFlowerRingCount() const { return m_nFlowerRing; } + bool hasXYZPlotDepth() const { return m_hasXYZPlotDepth; } + bool isAxisDisplayed() const { return m_isAxisDisplayed; } + bool isPositiveOnly() const { return m_isPositiveOnly; } + bool isTimeLocked() const { return m_isTimeLocked; } + bool isScrollModeActive() const { return m_isScrollModeActive; } + bool getScaleVisibility() const { return (m_parentCtx ? m_parentCtx->getScaleVisibility() : m_scaleVisiblity); } + bool getCheckBoardVisibility() const { return (m_parentCtx ? m_parentCtx->getCheckBoardVisibility() : m_checkBoardVisiblity); } + EDataType getDataType() const { return m_dataType; } + size_t getSpectrumFrequencyRange() const { return m_spectrumFreqRange; } + size_t getMinSpectrumFrequency() const { return m_minSpectrumFreq > m_spectrumFreqRange ? m_spectrumFreqRange : m_minSpectrumFreq; } + size_t getMaxSpectrumFrequency() const { return m_maxSpectrumFreq > m_spectrumFreqRange ? m_spectrumFreqRange : m_maxSpectrumFreq; } + size_t getStackCount() const { return m_nStack; } + size_t getStackIndex() const { return m_stackIdx; } + bool isFaceMeshVisible() const { return m_faceMeshVisible; } + bool isScalpMeshVisible() const { return m_scalpMeshVisible; } + + bool isERPPlayerActive() const { return m_erpPlayerActive || (m_parentCtx ? m_parentCtx->isERPPlayerActive() : false); } + float getERPFraction() const; + + static size_t getMaximumSampleCountPerDisplay() { return 1000; } /*500;*/ /*128*/ + +protected: + + CRendererContext* m_parentCtx = nullptr; + + std::vector m_channelLookup; + std::vector m_channelName; + std::vector m_channelPos; + std::map> m_dimLabels; + + std::map m_leftRightScore; + std::map m_frontBackScore; + + float m_scale = 1; + float m_zoom = 1; + float m_rotationX = 2; + float m_rotationY = 1; + + float m_translucency = 1; + float m_aspect = 1; + uint64_t m_sampleDuration = 0; + size_t m_timeScale = 1; + size_t m_nElement = 1; + size_t m_nFlowerRing = 1; + bool m_hasXYZPlotDepth = false; + bool m_isAxisDisplayed = false; + bool m_isPositiveOnly = false; + bool m_isTimeLocked = true; + bool m_isScrollModeActive = false; + bool m_scaleVisiblity = true; + bool m_checkBoardVisiblity = false; + EDataType m_dataType = EDataType::Matrix; + size_t m_spectrumFreqRange = 0; + size_t m_minSpectrumFreq = 0; + size_t m_maxSpectrumFreq = 0; + size_t m_nStack = 1; + size_t m_stackIdx = 1; + bool m_faceMeshVisible = true; + bool m_scalpMeshVisible = true; + + bool m_erpPlayerActive = false; + float m_erpFraction = 0; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/include/mensia/advanced-visualization/mCVertex.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/include/mensia/advanced-visualization/mCVertex.hpp new file mode 100644 index 0000000..54b472e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/include/mensia/advanced-visualization/mCVertex.hpp @@ -0,0 +1,95 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#pragma once + +#include + +#pragma pack(1) +namespace OpenViBE { +namespace AdvancedVisualization { +class CVertex +{ +public: + + explicit CVertex(const double _x = 0, const double _y = 0, const double _z = 0, const double _u = 0, const double _v = 0) + : x(float(_x)), y(float(_y)), z(float(_z)), u(float(_u)), v(float(_v)) { } + + CVertex(const CVertex& a, const CVertex& b) + : x(b.x - a.x), y(b.y - a.y), z(b.z - a.z), u(b.u - a.u), v(b.v - a.v) { } + + float x = 0; + float y = 0; + float z = 0; + float u = 0; + float v = 0; + + CVertex& normalize() + + { + const float n = this->length(); + if (n != 0) + { + const float in = 1.F / n; + this->x *= in; + this->y *= in; + this->z *= in; + } + return *this; + } + + float length() const { return sqrt(this->sqrLength()); } + + float sqrLength() const { return dot(*this, *this); } + + static float dot(const CVertex& a, const CVertex& b) { return a.x * b.x + a.y * b.y + a.z * b.z; } + + static CVertex cross(const CVertex& a, const CVertex& b) + { + CVertex r; + r.x = a.y * b.z - a.z * b.y; + r.y = a.z * b.x - a.x * b.z; + r.z = a.x * b.y - a.y * b.x; + return r; + } + + static CVertex cross(const CVertex& a1, const CVertex& b1, const CVertex& a2, const CVertex& b2) + { + const CVertex v1(a1, b1); + const CVertex v2(a2, b2); + return cross(v1, v2); + } + + static bool isOnSameSide(const CVertex& p1, const CVertex& p2, const CVertex& a, const CVertex& b) + { + const CVertex cp1 = cross(a, b, a, p1); + const CVertex cp2 = cross(a, b, a, p2); + return dot(cp1, cp2) >= 0; + } + + static bool isInTriangle(const CVertex& p, const CVertex& a, const CVertex& b, const CVertex& c) + { + return isOnSameSide(p, a, b, c) && isOnSameSide(p, b, c, a) && isOnSameSide(p, c, a, b); + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE +#pragma pack() diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/include/mensia/advanced-visualization/mIRenderer.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/include/mensia/advanced-visualization/mIRenderer.hpp new file mode 100644 index 0000000..ddef68a --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/include/mensia/advanced-visualization/mIRenderer.hpp @@ -0,0 +1,119 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "m_defines.hpp" +#include "mCRendererContext.hpp" +#include "mCVertex.hpp" + +#if defined TARGET_OS_Windows +#include +#endif // TARGET_OS_Windows + +#include +#include + +#include +#include +#include + +namespace OpenViBE { +namespace AdvancedVisualization { +enum class ERendererType +{ + Default, Topography2D, Topography3D, Bars, Bitmap, Connectivity, Cube, Flower, Line, Loreta, Mountain, MultiLine, Slice, XYZPlot, Last +}; + +class LMAV_API IRenderer +{ +public: + IRenderer(); + IRenderer(const IRenderer&) = delete; + virtual ~IRenderer(); + + static IRenderer* create(const ERendererType type, const bool stimulation); + static void release(IRenderer* renderer) { delete renderer; } + + void setChannelLocalisation(const char* filename) { m_channelPosFilename = filename; } + void setChannelCount(const size_t nChannel); + void setSampleCount(const size_t nSample); + void setHistoryDrawIndex(const size_t index); + void feed(const float* data); + void feed(const float* data, const size_t nSample); + void feed(const uint64_t stimDate, const uint64_t stimID) { m_stimulationHistory.emplace_back((stimDate >> 16) / 65536., stimID); } + void prefeed(const size_t nPreFeedSample); + + float getSuggestedScale(); + + void clear(const size_t nSampleToKeep = 0); + + size_t getChannelCount() const { return m_nChannel; } + size_t getSampleCount() const { return m_nSample; } + size_t getHistoryCount() const { return m_nHistory; } + size_t getHistoryIndex() const { return m_historyIdx; } + bool getSampleAtERPFraction(const float erpFraction, std::vector& samples) const; + + void setTimeOffset(const uint64_t offset) { m_timeOffset = offset; } + uint64_t getTimeOffset() const { return m_timeOffset; } + + static void draw2DCoordinateSystem(); + static void draw3DCoordinateSystem(); + void drawCoordinateSystem() const { this->draw3DCoordinateSystem(); } + + virtual void rebuild(const CRendererContext& /*ctx*/) { } + virtual void refresh(const CRendererContext& ctx); + virtual bool render(const CRendererContext& ctx) = 0; + + virtual void clearRegionSelection() { } + virtual size_t getRegionCategoryCount() { return 0; } + virtual size_t getRegionCount(const size_t /*category*/) { return 0; } + virtual const char* getRegionCategoryName(const size_t /*category*/) { return nullptr; } + virtual const char* getRegionName(const size_t /*category*/, const size_t /*index*/) { return nullptr; } + virtual void selectRegion(const size_t /*category*/, const char* /*name*/) { } + virtual void selectRegion(const size_t /*category*/, const size_t /*index*/) { } + + +protected: + + std::string m_channelPosFilename; + size_t m_historyIdx = 0; + size_t m_historyDrawIdx = 0; + size_t m_nHistory = 0; + size_t m_nChannel = 0; + size_t m_nSample = 1; + + float m_nInverseChannel = 1.0; + float m_nInverseSample = 1.0; + size_t m_autoDecimationFactor = 1; + + float m_erpFraction = 0.0; + size_t m_sampleIndexERP = 0; + + uint64_t m_timeOffset = 0; + + // std::map < std::string, CVertex > m_channelPos; + std::vector> m_stimulationHistory; + std::vector> m_history; + std::vector> m_vertex; + std::vector m_mesh; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/include/mensia/advanced-visualization/m_defines.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/include/mensia/advanced-visualization/m_defines.hpp new file mode 100644 index 0000000..6a1afa9 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/include/mensia/advanced-visualization/m_defines.hpp @@ -0,0 +1,52 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +//___________________________________________________________________// +// // +// API Definition // +//___________________________________________________________________// +// // + +// Taken from +// - http://people.redhat.com/drepper/dsohowto.pdf +// - http://www.nedprod.com/programs/gccvisibility.html +#if defined LMAV_Shared +#if defined TARGET_OS_Windows +#define LMAV_API_Export __declspec(dllexport) +#define LMAV_API_Import __declspec(dllimport) +#elif defined TARGET_OS_Linux +#define LMAV_API_Export __attribute__((visibility("default"))) +#define LMAV_API_Import __attribute__((visibility("default"))) +#else +#define LMAV_API_Export +#define LMAV_API_Import +#endif +#else +#define LMAV_API_Export +#define LMAV_API_Import +#endif + +#if defined LMAV_Exports +#define LMAV_API LMAV_API_Export +#else +#define LMAV_API LMAV_API_Import +#endif diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/Face.obj b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/Face.obj new file mode 100644 index 0000000..2e64e36 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/Face.obj differ diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/Face.obj.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/Face.obj.hpp new file mode 100644 index 0000000..cfd25db --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/Face.obj.hpp @@ -0,0 +1,4733 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +static const unsigned char FACE_DATA[122432] = { + 0x8a, 0x0d, 0x00, 0x00, 0x50, 0x1a, 0x00, 0x00, 0x59, 0x03, 0xfe, 0xbe, 0xe8, 0x35, 0xd7, 0xbe, 0x46, 0x1a, 0x43, 0xbf, 0xe5, 0x39, 0xfe, 0xbe, 0x2d, 0xc3, + 0xd7, 0xbe, 0x4a, 0x27, 0x43, 0xbf, 0xc5, 0xe0, 0xfe, 0xbe, 0xd0, 0x3a, 0xd8, 0xbe, 0x4d, 0xb7, 0x43, 0xbf, 0x3d, 0x5e, 0x92, 0xbe, 0xfa, 0x59, 0xf3, 0xbe, + 0x84, 0xb0, 0x53, 0xbf, 0x1d, 0xf1, 0x57, 0xbe, 0xa2, 0x72, 0xdc, 0xbe, 0x5c, 0xc9, 0x4b, 0xbf, 0x8a, 0x81, 0x92, 0xbe, 0x42, 0xc9, 0xfb, 0xbe, 0x47, 0x05, + 0x54, 0xbf, 0x41, 0x59, 0xfd, 0xbe, 0x06, 0xfd, 0xde, 0xbe, 0xf1, 0xdd, 0x45, 0xbf, 0x85, 0x6f, 0x00, 0xbf, 0x9a, 0xb8, 0xe4, 0xbe, 0x01, 0x83, 0x47, 0xbf, + 0x65, 0x16, 0x01, 0xbf, 0x20, 0x78, 0xdc, 0xbe, 0x46, 0x0a, 0x44, 0xbf, 0x1e, 0x9e, 0xff, 0xbe, 0xee, 0x65, 0xdf, 0xbe, 0xa9, 0xfb, 0x46, 0xbf, 0xcf, 0x61, + 0x01, 0xbf, 0x26, 0x3a, 0xdc, 0xbe, 0x6f, 0x8d, 0x44, 0xbf, 0xf5, 0xc2, 0x00, 0xbf, 0x19, 0x56, 0xe4, 0xbe, 0x53, 0xe0, 0x47, 0xbf, 0xc1, 0xe5, 0x93, 0xbe, + 0xc0, 0xdc, 0xfb, 0xbe, 0xe7, 0xd2, 0x55, 0xbf, 0xb7, 0x37, 0x58, 0xbe, 0x9d, 0x18, 0xdb, 0xbe, 0xca, 0x21, 0x4c, 0xbf, 0x09, 0xbc, 0x93, 0xbe, 0xa3, 0xc9, + 0xf4, 0xbe, 0x32, 0x8b, 0x55, 0xbf, 0x8e, 0xce, 0x92, 0xbe, 0x6c, 0xc7, 0xeb, 0xbe, 0x47, 0x65, 0x53, 0xbf, 0xe5, 0xa0, 0x91, 0xbe, 0x50, 0x17, 0xed, 0xbe, + 0x9f, 0x3d, 0x51, 0xbf, 0xed, 0x87, 0xfb, 0xbe, 0xe8, 0x57, 0xdd, 0xbe, 0xb2, 0x1d, 0x45, 0xbf, 0x05, 0xbe, 0xf6, 0xbe, 0x53, 0x45, 0xc2, 0xbe, 0xfd, 0x23, + 0x49, 0xbf, 0x00, 0x46, 0xfd, 0xbe, 0xae, 0xa2, 0xca, 0xbe, 0xd0, 0xbc, 0x4b, 0xbf, 0x11, 0x2d, 0xfe, 0xbe, 0xaa, 0x95, 0xc3, 0xbe, 0x62, 0x8f, 0x45, 0xbf, + 0x41, 0xce, 0xff, 0xbe, 0x0c, 0xec, 0xc2, 0xbe, 0x82, 0x5e, 0x45, 0xbf, 0x07, 0x51, 0x00, 0xbf, 0x44, 0x32, 0xc9, 0xbe, 0x8a, 0x52, 0x4b, 0xbf, 0xc2, 0x94, + 0xfb, 0xbe, 0x22, 0xbd, 0xc0, 0xbe, 0x2b, 0xd2, 0x48, 0xbf, 0x96, 0x48, 0xa9, 0xbe, 0x49, 0xaf, 0xbc, 0xbe, 0xab, 0x0d, 0x69, 0xbf, 0x65, 0x92, 0xa9, 0xbe, + 0x24, 0x93, 0xbb, 0xbe, 0x96, 0x0f, 0x6b, 0xbf, 0xc4, 0x87, 0x89, 0xbe, 0x66, 0xf1, 0xbb, 0xbe, 0xc4, 0x07, 0x64, 0xbf, 0xcb, 0x6d, 0xf6, 0xbe, 0xd9, 0x48, + 0xc2, 0xbe, 0xda, 0xd7, 0x52, 0xbf, 0xe0, 0x41, 0xf3, 0xbe, 0x8c, 0x81, 0xbc, 0xbe, 0x74, 0xbf, 0x4f, 0xbf, 0xb4, 0x78, 0xef, 0xbe, 0xc0, 0xed, 0xbe, 0xbe, + 0x58, 0x2f, 0x4f, 0xbf, 0xc9, 0xac, 0xf0, 0xbe, 0xfa, 0x78, 0xc5, 0xbe, 0x63, 0x81, 0x51, 0xbf, 0xbf, 0x25, 0x8b, 0xbe, 0x04, 0x91, 0xc1, 0xbe, 0xe6, 0xe0, + 0x64, 0xbf, 0x3b, 0x9f, 0xa9, 0xbe, 0xcd, 0x30, 0xbf, 0xbe, 0x48, 0x4e, 0x6a, 0xbf, 0x46, 0xaf, 0xa9, 0xbe, 0x50, 0x67, 0xc1, 0xbe, 0x28, 0x57, 0x68, 0xbf, + 0x41, 0x2d, 0x64, 0xbe, 0x0e, 0x17, 0xc1, 0xbe, 0xb0, 0xcc, 0x4e, 0xbf, 0x9f, 0x6b, 0x8a, 0xbe, 0xd0, 0x3e, 0xc1, 0xbe, 0xdb, 0x49, 0x5b, 0xbf, 0x53, 0xd3, + 0x87, 0xbe, 0xb5, 0x0f, 0xbf, 0xbe, 0x56, 0x4b, 0x5c, 0xbf, 0x2d, 0xae, 0x5c, 0xbe, 0x64, 0x3d, 0xc1, 0xbe, 0x1d, 0xb5, 0x4e, 0xbf, 0x02, 0x73, 0x37, 0xbe, + 0x11, 0x61, 0x83, 0xbf, 0x13, 0x97, 0x38, 0xbe, 0x98, 0x4d, 0x27, 0xbe, 0x87, 0xb6, 0x82, 0xbf, 0xd5, 0x0e, 0x3e, 0xbe, 0x88, 0x6f, 0x3b, 0xbe, 0x2f, 0x81, + 0x88, 0xbf, 0x12, 0x4c, 0x28, 0xbe, 0xfa, 0x7e, 0xf3, 0xbd, 0xfb, 0x2b, 0x82, 0xbf, 0xff, 0xbb, 0x3f, 0xbe, 0x54, 0xdc, 0x85, 0xb4, 0x30, 0x9f, 0x82, 0xbf, + 0xfb, 0xf3, 0x3f, 0xbe, 0xa7, 0x15, 0x91, 0xb4, 0x9c, 0x11, 0x8c, 0xbf, 0x1f, 0xec, 0x1d, 0xbe, 0x20, 0x80, 0xae, 0xbc, 0x30, 0x9f, 0x82, 0xbf, 0xfb, 0xf3, + 0x3f, 0xbe, 0x05, 0x62, 0x97, 0xbd, 0x44, 0x02, 0x82, 0xbf, 0xc1, 0x92, 0x3f, 0xbe, 0xbf, 0x6f, 0x3b, 0xbd, 0x9c, 0x11, 0x8c, 0xbf, 0x1f, 0xec, 0x1d, 0xbe, + 0xd6, 0xac, 0xda, 0xbd, 0x43, 0x82, 0x8b, 0xbf, 0xb4, 0x9f, 0x1f, 0xbe, 0xe5, 0xd0, 0x2b, 0xbe, 0xf1, 0x6d, 0x8a, 0xbf, 0xd3, 0xba, 0x22, 0xbe, 0xe0, 0x72, + 0x37, 0x3e, 0x11, 0x61, 0x83, 0xbf, 0x11, 0x97, 0x38, 0xbe, 0x60, 0x6f, 0x3b, 0x3e, 0x2f, 0x81, 0x88, 0xbf, 0x0c, 0x4c, 0x28, 0xbe, 0x78, 0x4d, 0x27, 0x3e, + 0x87, 0xb6, 0x82, 0xbf, 0xd3, 0x0e, 0x3e, 0xbe, 0xb9, 0x7e, 0xf3, 0x3d, 0xfb, 0x2b, 0x82, 0xbf, 0xff, 0xbb, 0x3f, 0xbe, 0x12, 0x7f, 0xae, 0x3c, 0x30, 0x9f, + 0x82, 0xbf, 0xfb, 0xf3, 0x3f, 0xbe, 0xc3, 0x61, 0x97, 0x3d, 0x44, 0x02, 0x82, 0xbf, 0xc1, 0x92, 0x3f, 0xbe, 0x2b, 0x6f, 0x3b, 0x3d, 0x9c, 0x11, 0x8c, 0xbf, + 0x1f, 0xec, 0x1d, 0xbe, 0x8e, 0xac, 0xda, 0x3d, 0x43, 0x82, 0x8b, 0xbf, 0xb4, 0x9f, 0x1f, 0xbe, 0xc4, 0xd0, 0x2b, 0x3e, 0xf0, 0x6d, 0x8a, 0xbf, 0xd1, 0xba, + 0x22, 0xbe, 0x4e, 0xab, 0x35, 0xbe, 0xe9, 0x71, 0x8e, 0xbf, 0x4c, 0xcc, 0x7f, 0xbe, 0xf3, 0x85, 0xeb, 0xbd, 0xf6, 0x92, 0x91, 0xbf, 0xef, 0x1e, 0x98, 0xbe, + 0xd8, 0x69, 0x3c, 0xbe, 0xd5, 0x89, 0x92, 0xbf, 0x8f, 0x60, 0xb3, 0xbe, 0x5c, 0xff, 0x8a, 0xbd, 0xff, 0x37, 0x98, 0xbf, 0x7d, 0x09, 0x14, 0xbf, 0x75, 0x67, + 0x0d, 0xbe, 0xa1, 0x92, 0x96, 0xbf, 0x76, 0xa6, 0x0a, 0xbf, 0x98, 0x10, 0xb4, 0xbd, 0xa9, 0x87, 0x97, 0xbf, 0xf0, 0x2e, 0x0a, 0xbf, 0x1f, 0x36, 0x2a, 0xbe, + 0xb8, 0x1d, 0x95, 0xbf, 0xd1, 0x14, 0x09, 0xbf, 0x2b, 0xd0, 0x07, 0xbe, 0x85, 0x47, 0x96, 0xbf, 0x1e, 0x7e, 0x0f, 0xbf, 0x7e, 0x81, 0x42, 0xbe, 0xac, 0xf4, + 0x93, 0xbf, 0x3c, 0xfc, 0xfe, 0xbe, 0x9b, 0x0f, 0x4d, 0xbe, 0x68, 0x53, 0x93, 0xbf, 0xe6, 0x2e, 0xe4, 0xbe, 0xd4, 0x1e, 0x36, 0xbe, 0xc4, 0xea, 0x94, 0xbf, + 0x7c, 0x6d, 0xee, 0xbe, 0x68, 0x6c, 0x0b, 0xbe, 0x97, 0xc9, 0x93, 0xbf, 0x1c, 0xd9, 0x14, 0xbf, 0xce, 0x9c, 0x2a, 0xbe, 0x81, 0x82, 0x92, 0xbf, 0xb5, 0x54, + 0x0f, 0xbf, 0x87, 0x26, 0x2f, 0xbe, 0xed, 0xe7, 0x92, 0xbf, 0xa0, 0xe5, 0x0c, 0xbf, 0xb5, 0x69, 0x3c, 0x3e, 0xd5, 0x89, 0x92, 0xbf, 0x8b, 0x60, 0xb3, 0xbe, + 0xaf, 0x85, 0xeb, 0x3d, 0xf6, 0x92, 0x91, 0xbf, 0xed, 0x1e, 0x98, 0xbe, 0x2c, 0xab, 0x35, 0x3e, 0xe9, 0x71, 0x8e, 0xbf, 0x4c, 0xcc, 0x7f, 0xbe, 0x56, 0x10, + 0xb4, 0x3d, 0xa9, 0x87, 0x97, 0xbf, 0xf0, 0x2e, 0x0a, 0xbf, 0x56, 0x67, 0x0d, 0x3e, 0xa0, 0x92, 0x96, 0xbf, 0x75, 0xa6, 0x0a, 0xbf, 0x1d, 0xff, 0x8a, 0x3d, + 0xff, 0x37, 0x98, 0xbf, 0x7c, 0x09, 0x14, 0xbf, 0x0e, 0xd0, 0x07, 0x3e, 0x85, 0x47, 0x96, 0xbf, 0x1d, 0x7e, 0x0f, 0xbf, 0x00, 0x36, 0x2a, 0x3e, 0xb8, 0x1d, + 0x95, 0xbf, 0xd0, 0x14, 0x09, 0xbf, 0xb5, 0x1e, 0x36, 0x3e, 0xc4, 0xea, 0x94, 0xbf, 0x78, 0x6d, 0xee, 0xbe, 0x7b, 0x0f, 0x4d, 0x3e, 0x67, 0x53, 0x93, 0xbf, + 0xe4, 0x2e, 0xe4, 0xbe, 0x5b, 0x81, 0x42, 0x3e, 0xac, 0xf4, 0x93, 0xbf, 0x36, 0xfc, 0xfe, 0xbe, 0x6b, 0x26, 0x2f, 0x3e, 0xed, 0xe7, 0x92, 0xbf, 0xa0, 0xe5, + 0x0c, 0xbf, 0xb4, 0x9c, 0x2a, 0x3e, 0x80, 0x82, 0x92, 0xbf, 0xb3, 0x54, 0x0f, 0xbf, 0x4a, 0x6c, 0x0b, 0x3e, 0x97, 0xc9, 0x93, 0xbf, 0x1b, 0xd9, 0x14, 0xbf, + 0xcb, 0x06, 0x64, 0xbe, 0x9f, 0x2c, 0x96, 0xbf, 0xde, 0x99, 0x26, 0xbf, 0x31, 0xf6, 0x82, 0xbe, 0x9d, 0x07, 0x93, 0xbf, 0xdc, 0x2b, 0x1c, 0xbf, 0xc1, 0xb7, + 0x69, 0xbe, 0x28, 0xf7, 0x97, 0xbf, 0x2e, 0x9b, 0x25, 0xbf, 0xa9, 0x10, 0x1a, 0xbf, 0xf8, 0x3c, 0x69, 0xbe, 0x6f, 0xa4, 0x49, 0xbf, 0x55, 0x2a, 0x1a, 0xbf, + 0x16, 0x53, 0x6b, 0xbe, 0x75, 0x76, 0x49, 0xbf, 0xc9, 0xfb, 0x19, 0xbf, 0x18, 0xc1, 0x6a, 0xbe, 0x76, 0xe5, 0x49, 0xbf, 0xf5, 0xee, 0x19, 0xbf, 0xf8, 0x15, + 0x6c, 0xbe, 0x44, 0xab, 0x49, 0xbf, 0xcc, 0x72, 0x8b, 0xbe, 0x30, 0xa0, 0x8e, 0xbf, 0x76, 0xd3, 0x17, 0xbf, 0x21, 0x19, 0x7d, 0xbe, 0x66, 0xa4, 0x8f, 0xbf, + 0xc0, 0xfa, 0x1c, 0xbf, 0x37, 0xb7, 0x13, 0xbf, 0x4c, 0x0a, 0x52, 0xbe, 0x7b, 0x54, 0x54, 0xbf, 0x21, 0x08, 0x0a, 0xbf, 0x90, 0xcc, 0x57, 0xbe, 0x86, 0xd3, + 0x5f, 0xbf, 0x75, 0x33, 0x0a, 0xbf, 0xcc, 0xe3, 0x3c, 0xbe, 0x08, 0xa3, 0x5f, 0xbf, 0xc3, 0xa8, 0xb6, 0xbe, 0x3c, 0x2b, 0x75, 0xbe, 0xf3, 0x30, 0x77, 0xbf, + 0x74, 0x0f, 0xb7, 0xbe, 0x42, 0x36, 0x65, 0xbe, 0xd4, 0x40, 0x78, 0xbf, 0xbc, 0x51, 0xea, 0xbe, 0xe2, 0xf5, 0x5b, 0xbe, 0x97, 0x83, 0x6c, 0xbf, 0x72, 0x5d, + 0xd7, 0xbd, 0x9c, 0x95, 0x6c, 0xbe, 0xb4, 0x24, 0x82, 0xbf, 0xf9, 0x0c, 0x15, 0xbe, 0xa2, 0x32, 0x4e, 0xbe, 0xb7, 0x38, 0x82, 0xbf, 0x45, 0x05, 0x1c, 0xbe, + 0xa6, 0xaa, 0x72, 0xbe, 0x2a, 0x5e, 0x81, 0xbf, 0x1f, 0xed, 0x63, 0xbe, 0x1e, 0xbc, 0x90, 0xbf, 0xd2, 0x4e, 0x24, 0xbf, 0xb6, 0x47, 0x65, 0xbe, 0x2e, 0x40, + 0x93, 0xbf, 0xa8, 0x00, 0x26, 0xbf, 0x87, 0xe8, 0x77, 0xbe, 0x44, 0xff, 0x8e, 0xbf, 0xbb, 0x63, 0x1c, 0xbf, 0x6b, 0x0f, 0x67, 0xbe, 0x3d, 0x14, 0x98, 0xbf, + 0x2e, 0xfb, 0x06, 0xbf, 0x2b, 0x1e, 0x85, 0xbe, 0xa2, 0xa5, 0x8d, 0xbf, 0xb2, 0x1f, 0x13, 0xbf, 0x9c, 0xbb, 0x77, 0xbe, 0x6c, 0xde, 0x8d, 0xbf, 0xe7, 0xdf, + 0x15, 0xbf, 0x11, 0x5c, 0x78, 0xbe, 0x6f, 0xcb, 0x8e, 0xbf, 0xdb, 0xb1, 0x1c, 0xbf, 0xa0, 0x53, 0x7e, 0xbe, 0xcc, 0x0a, 0x8f, 0xbf, 0x04, 0xdd, 0x1d, 0xbf, + 0x15, 0x74, 0x84, 0xbe, 0x24, 0x67, 0x8e, 0xbf, 0x17, 0x4b, 0x21, 0xbf, 0x43, 0x14, 0x89, 0xbe, 0x20, 0x69, 0x8d, 0xbf, 0x76, 0xac, 0x23, 0xbf, 0xde, 0x64, + 0x1b, 0xbe, 0x99, 0xa6, 0x8d, 0xbf, 0x1a, 0xe0, 0x47, 0xbf, 0x71, 0x53, 0x52, 0xbe, 0x01, 0xb0, 0x8e, 0xbf, 0x08, 0x7f, 0x3d, 0xbf, 0x80, 0x83, 0x19, 0xbe, + 0x52, 0xdb, 0x8f, 0xbf, 0x07, 0xd8, 0x43, 0xbf, 0x32, 0x56, 0xbb, 0xbc, 0x5e, 0xac, 0x93, 0xbf, 0xc7, 0x3c, 0x43, 0xbf, 0x14, 0xa0, 0x37, 0xbd, 0x2c, 0x53, + 0x93, 0xbf, 0x40, 0xe8, 0x42, 0xbf, 0x69, 0x4d, 0xaf, 0xbc, 0x30, 0x05, 0x95, 0xbf, 0x78, 0xd0, 0x3c, 0xbf, 0x32, 0x57, 0x84, 0xbe, 0xbb, 0x11, 0x85, 0xbf, + 0x41, 0xd0, 0x20, 0xbf, 0x4d, 0x22, 0x78, 0xbe, 0x97, 0xab, 0x8d, 0xbf, 0xee, 0x29, 0x16, 0xbf, 0x52, 0xfb, 0x89, 0xbe, 0xc3, 0xc5, 0x77, 0xbf, 0x8e, 0xda, + 0x1a, 0xbf, 0xa7, 0x01, 0x97, 0xbe, 0x00, 0x15, 0x88, 0xbf, 0x9a, 0x76, 0x0d, 0xbf, 0xa6, 0xbf, 0x6b, 0xbe, 0x8f, 0xb0, 0x9e, 0xbf, 0x75, 0xd2, 0xe7, 0xbe, + 0x3d, 0x26, 0x90, 0xbe, 0xa0, 0xae, 0x93, 0xbf, 0xb4, 0x7b, 0x00, 0xbf, 0xa1, 0xb7, 0x69, 0x3e, 0x28, 0xf7, 0x97, 0xbf, 0x2d, 0x9b, 0x25, 0xbf, 0x22, 0xf6, + 0x82, 0x3e, 0x9d, 0x07, 0x93, 0xbf, 0xd9, 0x2b, 0x1c, 0xbf, 0xad, 0x06, 0x64, 0x3e, 0x9e, 0x2c, 0x96, 0xbf, 0xde, 0x99, 0x26, 0xbf, 0xa8, 0x10, 0x1a, 0x3f, + 0xf4, 0x3c, 0x69, 0xbe, 0x6e, 0xa4, 0x49, 0xbf, 0xcd, 0xfb, 0x19, 0x3f, 0x14, 0xc1, 0x6a, 0xbe, 0x73, 0xe5, 0x49, 0xbf, 0x55, 0x2a, 0x1a, 0x3f, 0x14, 0x53, + 0x6b, 0xbe, 0x74, 0x76, 0x49, 0xbf, 0xf6, 0xee, 0x19, 0x3f, 0xf8, 0x15, 0x6c, 0xbe, 0x43, 0xab, 0x49, 0xbf, 0x02, 0x19, 0x7d, 0x3e, 0x65, 0xa4, 0x8f, 0xbf, + 0xbf, 0xfa, 0x1c, 0xbf, 0xbd, 0x72, 0x8b, 0x3e, 0x2f, 0xa0, 0x8e, 0xbf, 0x74, 0xd3, 0x17, 0xbf, 0x75, 0x33, 0x0a, 0x3f, 0xcc, 0xe3, 0x3c, 0xbe, 0x07, 0xa3, + 0x5f, 0xbf, 0x22, 0x08, 0x0a, 0x3f, 0x8c, 0xcc, 0x57, 0xbe, 0x84, 0xd3, 0x5f, 0xbf, 0x36, 0xb7, 0x13, 0x3f, 0x48, 0x0a, 0x52, 0xbe, 0x78, 0x54, 0x54, 0xbf, + 0xbd, 0x51, 0xea, 0x3e, 0xde, 0xf5, 0x5b, 0xbe, 0x95, 0x83, 0x6c, 0xbf, 0x76, 0x0f, 0xb7, 0x3e, 0x40, 0x36, 0x65, 0xbe, 0xd4, 0x40, 0x78, 0xbf, 0xc3, 0xa8, + 0xb6, 0x3e, 0x3a, 0x2b, 0x75, 0xbe, 0xf2, 0x30, 0x77, 0xbf, 0x4c, 0x05, 0x1c, 0x3e, 0xa6, 0xaa, 0x72, 0xbe, 0x2a, 0x5e, 0x81, 0xbf, 0x00, 0x0d, 0x15, 0x3e, + 0xa2, 0x32, 0x4e, 0xbe, 0xb7, 0x38, 0x82, 0xbf, 0x80, 0x5d, 0xd7, 0x3d, 0x9c, 0x95, 0x6c, 0xbe, 0xb4, 0x24, 0x82, 0xbf, 0x97, 0x47, 0x65, 0x3e, 0x2d, 0x40, + 0x93, 0xbf, 0xa4, 0x00, 0x26, 0xbf, 0x02, 0xed, 0x63, 0x3e, 0x1e, 0xbc, 0x90, 0xbf, 0xd0, 0x4e, 0x24, 0xbf, 0x69, 0xe8, 0x77, 0x3e, 0x44, 0xff, 0x8e, 0xbf, + 0xba, 0x63, 0x1c, 0xbf, 0x7b, 0xbb, 0x77, 0x3e, 0x6b, 0xde, 0x8d, 0xbf, 0xe3, 0xdf, 0x15, 0xbf, 0x1b, 0x1e, 0x85, 0x3e, 0xa2, 0xa5, 0x8d, 0xbf, 0xb2, 0x1f, + 0x13, 0xbf, 0x4b, 0x0f, 0x67, 0x3e, 0x3c, 0x14, 0x98, 0xbf, 0x2d, 0xfb, 0x06, 0xbf, 0x84, 0x53, 0x7e, 0x3e, 0xcc, 0x0a, 0x8f, 0xbf, 0x03, 0xdd, 0x1d, 0xbf, + 0xf3, 0x5b, 0x78, 0x3e, 0x6f, 0xcb, 0x8e, 0xbf, 0xd7, 0xb1, 0x1c, 0xbf, 0x06, 0x74, 0x84, 0x3e, 0x24, 0x67, 0x8e, 0xbf, 0x15, 0x4b, 0x21, 0xbf, 0x36, 0x14, + 0x89, 0x3e, 0x20, 0x69, 0x8d, 0xbf, 0x74, 0xac, 0x23, 0xbf, 0x67, 0x83, 0x19, 0x3e, 0x52, 0xdb, 0x8f, 0xbf, 0x07, 0xd8, 0x43, 0xbf, 0x5a, 0x53, 0x52, 0x3e, + 0x01, 0xb0, 0x8e, 0xbf, 0x08, 0x7f, 0x3d, 0xbf, 0xc8, 0x64, 0x1b, 0x3e, 0x99, 0xa6, 0x8d, 0xbf, 0x1a, 0xe0, 0x47, 0xbf, 0x8d, 0x4c, 0xaf, 0x3c, 0x30, 0x05, + 0x95, 0xbf, 0x78, 0xd0, 0x3c, 0xbf, 0xa8, 0x9f, 0x37, 0x3d, 0x2c, 0x53, 0x93, 0xbf, 0x40, 0xe8, 0x42, 0xbf, 0x5c, 0x55, 0xbb, 0x3c, 0x5e, 0xac, 0x93, 0xbf, + 0xc7, 0x3c, 0x43, 0xbf, 0x2e, 0x22, 0x78, 0x3e, 0x97, 0xab, 0x8d, 0xbf, 0xed, 0x29, 0x16, 0xbf, 0x24, 0x57, 0x84, 0x3e, 0xbb, 0x11, 0x85, 0xbf, 0x3f, 0xd0, + 0x20, 0xbf, 0x45, 0xfb, 0x89, 0x3e, 0xc3, 0xc5, 0x77, 0xbf, 0x8d, 0xda, 0x1a, 0xbf, 0x97, 0x01, 0x97, 0x3e, 0x00, 0x15, 0x88, 0xbf, 0x9a, 0x76, 0x0d, 0xbf, + 0x81, 0xbf, 0x6b, 0x3e, 0x8e, 0xb0, 0x9e, 0xbf, 0x73, 0xd2, 0xe7, 0xbe, 0x2c, 0x26, 0x90, 0x3e, 0xa0, 0xae, 0x93, 0xbf, 0xb2, 0x7b, 0x00, 0xbf, 0xc3, 0xe0, + 0xfe, 0x3e, 0xce, 0x3a, 0xd8, 0xbe, 0x4b, 0xb7, 0x43, 0xbf, 0xe3, 0x39, 0xfe, 0x3e, 0x2c, 0xc3, 0xd7, 0xbe, 0x48, 0x27, 0x43, 0xbf, 0x55, 0x03, 0xfe, 0x3e, + 0xe6, 0x35, 0xd7, 0xbe, 0x44, 0x1a, 0x43, 0xbf, 0x04, 0xbc, 0x93, 0x3e, 0xa2, 0xc9, 0xf4, 0xbe, 0x31, 0x8b, 0x55, 0xbf, 0xaf, 0x37, 0x58, 0x3e, 0x9d, 0x18, + 0xdb, 0xbe, 0xca, 0x21, 0x4c, 0xbf, 0xbd, 0xe5, 0x93, 0x3e, 0xc0, 0xdc, 0xfb, 0xbe, 0xe7, 0xd2, 0x55, 0xbf, 0x86, 0x81, 0x92, 0x3e, 0x42, 0xc9, 0xfb, 0xbe, + 0x46, 0x05, 0x54, 0xbf, 0x15, 0xf1, 0x57, 0x3e, 0xa2, 0x72, 0xdc, 0xbe, 0x5c, 0xc9, 0x4b, 0xbf, 0x39, 0x5e, 0x92, 0x3e, 0xfa, 0x59, 0xf3, 0xbe, 0x84, 0xb0, + 0x53, 0xbf, 0xe1, 0xa0, 0x91, 0x3e, 0x50, 0x17, 0xed, 0xbe, 0x9f, 0x3d, 0x51, 0xbf, 0xf3, 0xc2, 0x00, 0x3f, 0x18, 0x56, 0xe4, 0xbe, 0x52, 0xe0, 0x47, 0xbf, + 0xce, 0x61, 0x01, 0x3f, 0x26, 0x3a, 0xdc, 0xbe, 0x6e, 0x8d, 0x44, 0xbf, 0x1a, 0x9e, 0xff, 0x3e, 0xec, 0x65, 0xdf, 0xbe, 0xa6, 0xfb, 0x46, 0xbf, 0x63, 0x16, + 0x01, 0x3f, 0x20, 0x78, 0xdc, 0xbe, 0x46, 0x0a, 0x44, 0xbf, 0x83, 0x6f, 0x00, 0x3f, 0x99, 0xb8, 0xe4, 0xbe, 0x00, 0x83, 0x47, 0xbf, 0x3f, 0x59, 0xfd, 0x3e, + 0x05, 0xfd, 0xde, 0xbe, 0xf0, 0xdd, 0x45, 0xbf, 0xea, 0x87, 0xfb, 0x3e, 0xe7, 0x57, 0xdd, 0xbe, 0xb1, 0x1d, 0x45, 0xbf, 0x89, 0xce, 0x92, 0x3e, 0x6c, 0xc7, + 0xeb, 0xbe, 0x47, 0x65, 0x53, 0xbf, 0x0f, 0x2d, 0xfe, 0x3e, 0xa9, 0x95, 0xc3, 0xbe, 0x61, 0x8f, 0x45, 0xbf, 0xff, 0x45, 0xfd, 0x3e, 0xad, 0xa2, 0xca, 0xbe, + 0xcf, 0xbc, 0x4b, 0xbf, 0x04, 0xbe, 0xf6, 0x3e, 0x51, 0x45, 0xc2, 0xbe, 0xfa, 0x23, 0x49, 0xbf, 0xc1, 0x94, 0xfb, 0x3e, 0x20, 0xbd, 0xc0, 0xbe, 0x28, 0xd2, + 0x48, 0xbf, 0x06, 0x51, 0x00, 0x3f, 0x43, 0x32, 0xc9, 0xbe, 0x8a, 0x52, 0x4b, 0xbf, 0x41, 0xce, 0xff, 0x3e, 0x0c, 0xec, 0xc2, 0xbe, 0x81, 0x5e, 0x45, 0xbf, + 0xc3, 0x87, 0x89, 0x3e, 0x66, 0xf1, 0xbb, 0xbe, 0xc4, 0x07, 0x64, 0xbf, 0x64, 0x92, 0xa9, 0x3e, 0x24, 0x93, 0xbb, 0xbe, 0x96, 0x0f, 0x6b, 0xbf, 0x94, 0x48, + 0xa9, 0x3e, 0x49, 0xaf, 0xbc, 0xbe, 0xab, 0x0d, 0x69, 0xbf, 0xdf, 0x41, 0xf3, 0x3e, 0x8a, 0x81, 0xbc, 0xbe, 0x72, 0xbf, 0x4f, 0xbf, 0xcc, 0x6d, 0xf6, 0x3e, + 0xd7, 0x48, 0xc2, 0xbe, 0xd7, 0xd7, 0x52, 0xbf, 0xca, 0xac, 0xf0, 0x3e, 0xf9, 0x78, 0xc5, 0xbe, 0x62, 0x81, 0x51, 0xbf, 0xb4, 0x78, 0xef, 0x3e, 0xc0, 0xed, + 0xbe, 0xbe, 0x58, 0x2f, 0x4f, 0xbf, 0x45, 0xaf, 0xa9, 0x3e, 0x50, 0x67, 0xc1, 0xbe, 0x28, 0x57, 0x68, 0xbf, 0x3a, 0x9f, 0xa9, 0x3e, 0xcd, 0x30, 0xbf, 0xbe, + 0x48, 0x4e, 0x6a, 0xbf, 0xbe, 0x25, 0x8b, 0x3e, 0x04, 0x91, 0xc1, 0xbe, 0xe6, 0xe0, 0x64, 0xbf, 0x9d, 0x6b, 0x8a, 0x3e, 0xd0, 0x3e, 0xc1, 0xbe, 0xdb, 0x49, + 0x5b, 0xbf, 0x3b, 0x2d, 0x64, 0x3e, 0x0e, 0x17, 0xc1, 0xbe, 0xb0, 0xcc, 0x4e, 0xbf, 0x29, 0xae, 0x5c, 0x3e, 0x64, 0x3d, 0xc1, 0xbe, 0x1d, 0xb5, 0x4e, 0xbf, + 0x50, 0xd3, 0x87, 0x3e, 0xb4, 0x0f, 0xbf, 0xbe, 0x54, 0x4b, 0x5c, 0xbf, 0xf6, 0xd4, 0x35, 0xbf, 0xe2, 0x0f, 0x15, 0xbf, 0x1b, 0xe3, 0x48, 0x3d, 0xa2, 0x38, + 0x3f, 0xbf, 0x6c, 0xf4, 0xdd, 0xbe, 0x54, 0x4a, 0x74, 0x3c, 0x3c, 0x8e, 0x37, 0xbf, 0xa1, 0x25, 0x14, 0xbf, 0xf6, 0x17, 0xbe, 0x3d, 0x18, 0x09, 0x42, 0xbf, + 0x24, 0xbe, 0xd7, 0xbe, 0x4b, 0x60, 0x3d, 0x3d, 0x0d, 0xc9, 0x3f, 0xbf, 0x24, 0x37, 0xfc, 0xbe, 0x6b, 0xc7, 0xa0, 0x3d, 0xea, 0xf3, 0x3a, 0xbf, 0xf8, 0x37, + 0x0e, 0xbf, 0x2b, 0x7e, 0xe4, 0x3d, 0xb8, 0x07, 0x33, 0xbf, 0x22, 0x4c, 0x21, 0xbf, 0x74, 0x85, 0xc5, 0x3d, 0xa5, 0x79, 0x33, 0xbf, 0x4c, 0x2e, 0x1a, 0xbf, + 0x08, 0xdb, 0x17, 0x3e, 0x68, 0x14, 0xb5, 0xbe, 0x2d, 0xd5, 0x8e, 0xbe, 0xee, 0xe6, 0x71, 0xbf, 0xa1, 0x03, 0xb4, 0xbe, 0x2c, 0x45, 0x94, 0xbe, 0x00, 0xff, + 0x6d, 0xbf, 0x66, 0x3f, 0x74, 0xbe, 0x5e, 0x2c, 0x95, 0xbe, 0xc2, 0xf6, 0x71, 0xbf, 0xd1, 0x21, 0x0a, 0xbf, 0x9e, 0x04, 0x51, 0xbf, 0x13, 0x9c, 0x22, 0xbf, + 0x7c, 0x9b, 0x0e, 0xbf, 0x34, 0x6d, 0x39, 0xbf, 0xbb, 0x1f, 0x2b, 0xbf, 0x7e, 0x41, 0x10, 0xbf, 0x50, 0xc8, 0x4c, 0xbf, 0xa4, 0x38, 0x1e, 0xbf, 0x6b, 0x3e, + 0x0e, 0xbf, 0x27, 0x13, 0x5c, 0xbf, 0x64, 0xea, 0x11, 0xbf, 0x16, 0x7f, 0x93, 0xbe, 0x2a, 0xfa, 0xaa, 0xbf, 0xfc, 0xe8, 0x10, 0xbf, 0xd7, 0x36, 0x88, 0xbe, + 0x2b, 0x8c, 0xa1, 0xbf, 0xa7, 0x95, 0x12, 0xbf, 0x15, 0xd4, 0xab, 0xbe, 0xcd, 0xfe, 0xac, 0xbf, 0x8a, 0x6d, 0x02, 0xbf, 0x07, 0xf8, 0x96, 0xbe, 0x1b, 0xdc, + 0xb0, 0xbf, 0xfe, 0x20, 0x0b, 0xbf, 0xf6, 0x25, 0x94, 0xbe, 0xee, 0xbc, 0x94, 0xbf, 0xd6, 0xd7, 0x14, 0xbf, 0x10, 0xbc, 0x93, 0xbe, 0xb0, 0xa2, 0x9a, 0xbf, + 0xd4, 0x21, 0x10, 0xbf, 0x50, 0xc4, 0x84, 0xbe, 0xd6, 0xef, 0x96, 0xbf, 0xd9, 0x6a, 0x1c, 0xbf, 0x91, 0x77, 0x80, 0xbe, 0x1f, 0x10, 0x9d, 0xbf, 0x0c, 0x9c, + 0x18, 0xbf, 0x53, 0xfa, 0x75, 0xbe, 0xa9, 0x92, 0x9a, 0xbf, 0x40, 0x35, 0x1d, 0xbf, 0x14, 0x54, 0xbd, 0xbe, 0xd6, 0x3b, 0xb2, 0xbf, 0x2c, 0xd1, 0xd2, 0xbe, + 0x8f, 0x42, 0xbb, 0xbe, 0xe6, 0x65, 0xaa, 0xbf, 0x26, 0x6f, 0xf5, 0xbe, 0xe4, 0x64, 0x61, 0xbe, 0xb2, 0x30, 0xbf, 0xbf, 0x5c, 0xc6, 0x0c, 0xbf, 0x81, 0x38, + 0x7c, 0xbe, 0x1f, 0x99, 0xb4, 0xbf, 0xa1, 0x53, 0x13, 0xbf, 0x19, 0xea, 0x83, 0xbe, 0x2c, 0xb6, 0xbc, 0xbf, 0xed, 0x2c, 0x06, 0xbf, 0x0c, 0x5c, 0xd5, 0xbe, + 0xf0, 0xdc, 0xac, 0xbf, 0xe8, 0x74, 0xaf, 0xbe, 0x39, 0x5c, 0xde, 0xbe, 0xe4, 0x78, 0xaa, 0xbf, 0xe6, 0x29, 0xa2, 0xbe, 0xf5, 0x90, 0xca, 0xbe, 0x6b, 0xf1, + 0xb2, 0xbf, 0xbf, 0xf7, 0x89, 0xbe, 0xaa, 0x85, 0xe2, 0xbe, 0x30, 0xba, 0x97, 0xbf, 0xf0, 0x43, 0xea, 0xbe, 0xd5, 0x17, 0xbe, 0xbe, 0x96, 0x5e, 0x9d, 0xbf, + 0x07, 0xea, 0xff, 0xbe, 0x24, 0x07, 0xd3, 0xbe, 0x90, 0x4b, 0x97, 0xbf, 0x92, 0x89, 0xf9, 0xbe, 0x82, 0x93, 0xdf, 0xbe, 0xfa, 0x1b, 0x92, 0xbf, 0x52, 0x84, + 0xfc, 0xbe, 0x7d, 0x51, 0xee, 0xbe, 0x3d, 0x1d, 0x7d, 0xbf, 0x8c, 0x24, 0x0e, 0xbf, 0xc0, 0x7a, 0xe9, 0xbe, 0x72, 0x49, 0x79, 0xbf, 0x37, 0xd6, 0x14, 0xbf, + 0x09, 0xfc, 0xf3, 0xbe, 0x5f, 0x14, 0x76, 0xbf, 0x60, 0x38, 0x10, 0xbf, 0xb4, 0xdf, 0xeb, 0xbe, 0xa8, 0xdf, 0x83, 0xbf, 0x5a, 0xd0, 0x0b, 0xbf, 0x62, 0x1a, + 0xf6, 0xbe, 0x6c, 0x9e, 0x80, 0xbf, 0xf8, 0x88, 0x03, 0xbf, 0xee, 0xef, 0xf4, 0xbe, 0x9a, 0x33, 0x89, 0xbf, 0x84, 0x24, 0xf4, 0xbe, 0x28, 0x94, 0x04, 0xbf, + 0xcf, 0x19, 0x81, 0xbf, 0x45, 0x84, 0xe9, 0xbe, 0xe2, 0xa5, 0x3d, 0xbf, 0xc9, 0xce, 0x98, 0xbe, 0xf9, 0x8a, 0x41, 0xbe, 0x38, 0x47, 0x3d, 0xbf, 0xde, 0x7f, + 0xad, 0xbe, 0x72, 0x83, 0x3b, 0xbe, 0xec, 0xb5, 0x3d, 0xbf, 0x00, 0x3f, 0xba, 0xbe, 0xd6, 0xfc, 0x92, 0xbe, 0x85, 0x32, 0x98, 0xbe, 0xdc, 0xc6, 0x8e, 0xbf, + 0x36, 0x0b, 0x15, 0xbf, 0x58, 0xa8, 0x8e, 0xbe, 0xa8, 0x11, 0x91, 0xbf, 0x66, 0xa7, 0x16, 0xbf, 0x8d, 0x40, 0x9e, 0xbe, 0x2c, 0xc7, 0x93, 0xbf, 0x81, 0xe2, + 0x11, 0xbf, 0xae, 0x50, 0xb4, 0xbe, 0x80, 0x2e, 0x92, 0xbf, 0x70, 0x59, 0x0d, 0xbf, 0x1f, 0x3a, 0x64, 0xbe, 0x73, 0xa1, 0x6f, 0xbf, 0x92, 0x7f, 0x38, 0xbf, + 0x58, 0xd3, 0x87, 0xbe, 0x59, 0xc9, 0x7f, 0xbf, 0x80, 0x24, 0x2e, 0xbf, 0xec, 0x40, 0x53, 0xbe, 0x98, 0x43, 0x7b, 0xbf, 0xaa, 0xa6, 0x3a, 0xbf, 0x52, 0x5b, + 0x8e, 0xbe, 0x87, 0x5e, 0x82, 0xbf, 0x9c, 0x63, 0x2a, 0xbf, 0x25, 0x71, 0x80, 0xbe, 0xf3, 0x9a, 0x86, 0xbf, 0x0c, 0xcc, 0x2e, 0xbf, 0xb6, 0x5e, 0x97, 0xbe, + 0xa0, 0x68, 0x87, 0xbf, 0xfa, 0xe8, 0x24, 0xbf, 0x35, 0xce, 0xa3, 0xbe, 0x1a, 0x49, 0x82, 0xbf, 0x18, 0x7a, 0x27, 0xbf, 0x61, 0x17, 0x96, 0xbe, 0x54, 0x5b, + 0x8d, 0xbf, 0x38, 0xf2, 0x19, 0xbf, 0xae, 0x05, 0x8b, 0xbe, 0xab, 0xb2, 0x8c, 0xbf, 0xb1, 0xa7, 0x24, 0xbf, 0xdf, 0x83, 0x4e, 0xbe, 0xe3, 0x9e, 0x9f, 0xbf, + 0x50, 0xff, 0x20, 0xbf, 0x65, 0xac, 0x48, 0xbe, 0x17, 0xda, 0x9a, 0xbf, 0x66, 0xbf, 0x2d, 0xbf, 0x03, 0x40, 0x49, 0xbe, 0x1a, 0x8b, 0x9b, 0xbf, 0x5e, 0xa9, + 0x2c, 0xbf, 0x4a, 0xed, 0x83, 0xbe, 0x9a, 0x74, 0x6e, 0xbf, 0xd0, 0x0f, 0x32, 0xbf, 0x00, 0x2c, 0xa5, 0xbe, 0x1f, 0xaf, 0x6d, 0xbf, 0xa9, 0x70, 0x32, 0xbf, + 0xdb, 0xba, 0x8d, 0xbe, 0x91, 0x35, 0x76, 0xbf, 0xbc, 0x96, 0x2d, 0xbf, 0x22, 0x05, 0x36, 0xbe, 0x72, 0x9c, 0x64, 0xbf, 0x1d, 0xde, 0x41, 0xbf, 0xa0, 0x48, + 0x29, 0xbe, 0x13, 0x44, 0x70, 0xbf, 0xa6, 0x68, 0x42, 0xbf, 0x34, 0xf3, 0xae, 0xbd, 0xa1, 0x5a, 0x76, 0xbf, 0xf0, 0xc6, 0x4e, 0xbf, 0x6c, 0xbb, 0x28, 0xbe, + 0x45, 0xbd, 0x7a, 0xbf, 0x51, 0xcb, 0x43, 0xbf, 0x0a, 0xa5, 0x3e, 0xbe, 0xa8, 0x73, 0x41, 0xbf, 0x21, 0x9a, 0x53, 0xbf, 0x47, 0xad, 0x2f, 0xbe, 0x5b, 0xa2, + 0x48, 0xbf, 0x89, 0x47, 0x4f, 0xbf, 0x85, 0x73, 0x2f, 0xbe, 0xca, 0x0f, 0x44, 0xbf, 0x11, 0x2d, 0x55, 0xbf, 0x54, 0xc7, 0x41, 0xbe, 0x84, 0xe8, 0x52, 0xbf, + 0x32, 0x7a, 0x45, 0xbf, 0x58, 0xbe, 0x4f, 0xbe, 0x12, 0x83, 0x4e, 0xbf, 0x21, 0x89, 0x48, 0xbf, 0xb9, 0xd4, 0x39, 0xbe, 0x74, 0x47, 0x58, 0xbf, 0x7f, 0xc9, + 0x43, 0xbf, 0xf8, 0xb2, 0x74, 0xbe, 0x2b, 0xb4, 0x66, 0xbf, 0xa8, 0x99, 0x36, 0xbf, 0xba, 0x40, 0xa7, 0xbe, 0xf9, 0x5b, 0x8e, 0xbf, 0xae, 0xa9, 0x15, 0xbf, + 0xc7, 0x5b, 0x43, 0xbd, 0xbd, 0x34, 0x5d, 0xbf, 0x5b, 0x1d, 0x61, 0xbf, 0x4f, 0x4f, 0x32, 0xbd, 0x50, 0xca, 0x5d, 0xbf, 0x8f, 0x6e, 0x69, 0xbf, 0xf1, 0xcb, + 0xad, 0xbd, 0xda, 0x97, 0x56, 0xbf, 0x9a, 0x43, 0x68, 0xbf, 0xac, 0xfb, 0x4b, 0xbd, 0x08, 0x75, 0x5d, 0xbf, 0xce, 0x10, 0x6c, 0xbf, 0x03, 0x2f, 0x6f, 0xbd, + 0xe6, 0xc1, 0x5b, 0xbf, 0xf8, 0x93, 0x6c, 0xbf, 0x82, 0x17, 0x89, 0xbd, 0x3a, 0xa9, 0x59, 0xbf, 0x71, 0xa6, 0x6c, 0xbf, 0x8b, 0x0c, 0x63, 0xbd, 0x62, 0x4d, + 0x5a, 0xbf, 0x77, 0x6f, 0x5e, 0xbf, 0xe9, 0x7e, 0xd0, 0xbd, 0x4b, 0xbc, 0x53, 0xbf, 0x6b, 0x77, 0x62, 0xbf, 0xdc, 0x6f, 0xf0, 0xbd, 0x18, 0x23, 0x53, 0xbf, + 0x9a, 0x1c, 0x5e, 0xbf, 0xfb, 0x70, 0xbd, 0xbd, 0x28, 0x2c, 0x58, 0xbf, 0x64, 0xbc, 0x5c, 0xbf, 0x03, 0xac, 0xfc, 0xbd, 0xac, 0xba, 0x53, 0xbf, 0x4a, 0xd3, + 0x5a, 0xbf, 0x0b, 0x0f, 0xf8, 0xbd, 0xef, 0x01, 0x55, 0xbf, 0x66, 0x60, 0x58, 0xbf, 0x8c, 0x94, 0xdc, 0xbd, 0xf9, 0xda, 0x56, 0xbf, 0x5b, 0x73, 0x59, 0xbf, + 0xaf, 0xfb, 0x4b, 0xbd, 0xc0, 0xbe, 0x6d, 0xbf, 0x0b, 0x79, 0x6f, 0xbf, 0x9f, 0xbc, 0x18, 0xbd, 0x6e, 0xae, 0x6f, 0xbf, 0xd7, 0x3c, 0x69, 0xbf, 0x03, 0xb6, + 0x32, 0xbd, 0xe0, 0x29, 0x6f, 0xbf, 0x5e, 0xa1, 0x72, 0xbf, 0x40, 0x70, 0x08, 0xb4, 0xac, 0x6c, 0x70, 0xbf, 0xdf, 0xdc, 0x6f, 0xbf, 0x4d, 0xdd, 0x0e, 0xb4, + 0xc8, 0x1c, 0x71, 0xbf, 0x07, 0xfb, 0x65, 0xbf, 0xbd, 0xb5, 0x06, 0xbe, 0xb4, 0xc9, 0x66, 0xbf, 0xf8, 0xbb, 0x4e, 0xbf, 0xa3, 0xbd, 0xce, 0xbd, 0x6d, 0x80, + 0x68, 0xbf, 0xd6, 0xb1, 0x55, 0xbf, 0x46, 0x3f, 0x02, 0xbe, 0x67, 0xaf, 0x65, 0xbf, 0x77, 0xec, 0x50, 0xbf, 0x93, 0x6e, 0x0e, 0xbe, 0x55, 0x97, 0x40, 0xbf, + 0x62, 0x47, 0x64, 0xbf, 0xb9, 0xdf, 0xc8, 0xbd, 0x71, 0xb2, 0x3e, 0xbf, 0x7b, 0x2d, 0x6d, 0xbf, 0x0d, 0x1c, 0x18, 0xbe, 0x3d, 0x90, 0x3f, 0xbf, 0xd7, 0x53, + 0x5d, 0xbf, 0x39, 0x70, 0xbc, 0xbd, 0xe4, 0x5f, 0x42, 0xbf, 0xf2, 0x9d, 0x6f, 0xbf, 0xe1, 0x9b, 0xa0, 0xbd, 0xae, 0x7f, 0x39, 0xbf, 0x29, 0x82, 0x73, 0xbf, + 0x09, 0x79, 0xc8, 0xbd, 0x50, 0x1e, 0x3d, 0xbf, 0xdb, 0x18, 0x6c, 0xbf, 0x77, 0x17, 0x2c, 0xbe, 0x9d, 0x9e, 0x44, 0xbf, 0xf0, 0x72, 0x56, 0xbf, 0x42, 0xff, + 0x2d, 0xbe, 0x70, 0x45, 0x49, 0xbf, 0xac, 0xfe, 0x4f, 0xbf, 0x3b, 0x1c, 0x44, 0xbe, 0x66, 0x54, 0x4c, 0xbf, 0x55, 0xcc, 0x57, 0xbf, 0xcf, 0x7f, 0x14, 0xbe, + 0x53, 0xb7, 0x3d, 0xbf, 0xba, 0xbc, 0x5c, 0xbf, 0x40, 0xc4, 0x91, 0xbd, 0x14, 0xe4, 0x6b, 0xbf, 0xd1, 0x0a, 0x74, 0xbf, 0x09, 0x00, 0x8c, 0xbd, 0x1d, 0xb1, + 0x6b, 0xbf, 0x51, 0xf9, 0x7c, 0xbf, 0xe6, 0x26, 0xc1, 0xbd, 0x85, 0x2c, 0x67, 0xbf, 0x4b, 0xb4, 0x73, 0xbf, 0xc9, 0x25, 0xd1, 0xbd, 0xf8, 0xa5, 0x63, 0xbf, + 0x37, 0x68, 0x7a, 0xbf, 0x9d, 0x5a, 0xb0, 0xbd, 0xae, 0xbf, 0x64, 0xbf, 0x20, 0x1c, 0x80, 0xbf, 0x00, 0xd6, 0xa7, 0xb3, 0x67, 0xc2, 0x49, 0xbf, 0x08, 0x42, + 0x86, 0xbf, 0x34, 0x28, 0x93, 0xb3, 0x83, 0x00, 0x3c, 0xbf, 0xe6, 0x31, 0x84, 0xbf, 0x71, 0xa4, 0x9a, 0xbc, 0xc6, 0x90, 0x49, 0xbf, 0x55, 0x46, 0x86, 0xbf, + 0x1f, 0x0c, 0x8b, 0xbd, 0x80, 0xae, 0x4f, 0xbf, 0x59, 0x82, 0x84, 0xbf, 0xd1, 0xa5, 0x62, 0xbd, 0xab, 0xcf, 0x54, 0xbf, 0x2c, 0xa0, 0x86, 0xbf, 0x5a, 0x83, + 0x10, 0xbd, 0x28, 0x1f, 0x49, 0xbf, 0x52, 0xdc, 0x85, 0xbf, 0xc0, 0x80, 0x9e, 0xbd, 0x74, 0x1d, 0x47, 0xbf, 0x5c, 0xcf, 0x80, 0xbf, 0xdf, 0x5b, 0x29, 0xbe, + 0xba, 0x9c, 0x62, 0xbf, 0x4b, 0x30, 0x46, 0xbf, 0xfa, 0x93, 0x41, 0xbe, 0x24, 0xca, 0x4d, 0xbf, 0x41, 0x8a, 0x5d, 0xbf, 0x77, 0x17, 0x2c, 0xbe, 0x8b, 0x7a, + 0x45, 0xbf, 0xc4, 0x90, 0x5e, 0xbf, 0xbe, 0x8b, 0xad, 0xbd, 0x12, 0xe5, 0x3e, 0xbf, 0x73, 0x6b, 0x79, 0xbf, 0x6a, 0xf2, 0xd0, 0xbd, 0x80, 0x91, 0x47, 0xbf, + 0x99, 0x18, 0x77, 0xbf, 0x45, 0x9c, 0x55, 0xbd, 0xa1, 0x70, 0x37, 0xbf, 0x56, 0xa4, 0x7b, 0xbf, 0x30, 0xf7, 0xe8, 0xbd, 0xa0, 0x57, 0x47, 0xbf, 0x73, 0x4d, + 0x73, 0xbf, 0x5d, 0xe3, 0x70, 0xbe, 0xe8, 0x90, 0x36, 0xbf, 0x05, 0x6c, 0x4f, 0xbf, 0x39, 0x27, 0x53, 0xbe, 0xe5, 0xcc, 0x34, 0xbf, 0x0a, 0x1d, 0x54, 0xbf, + 0x52, 0x09, 0x79, 0xbe, 0x2b, 0x30, 0x23, 0xbf, 0x40, 0x2b, 0x51, 0xbf, 0x8a, 0xcd, 0x15, 0xbf, 0x24, 0x14, 0x4c, 0xbe, 0x77, 0xe2, 0x4f, 0xbf, 0x51, 0x0e, + 0x19, 0xbf, 0xb0, 0x56, 0x05, 0xbe, 0xe1, 0xeb, 0x48, 0xbf, 0x0d, 0x75, 0x24, 0xbf, 0x64, 0x97, 0x3c, 0xbe, 0xa4, 0x4f, 0x30, 0xbf, 0xd5, 0x6a, 0x21, 0xbf, + 0xe8, 0x75, 0x83, 0xbe, 0xe9, 0xa5, 0x37, 0xbf, 0x60, 0xb0, 0x19, 0xbe, 0xce, 0x34, 0xa1, 0xbe, 0x7e, 0xd1, 0x6e, 0xbf, 0xa0, 0xf8, 0x24, 0xbe, 0x1a, 0xbe, + 0xa6, 0xbe, 0x58, 0x3a, 0x58, 0xbf, 0x42, 0x2f, 0xde, 0xbd, 0xf5, 0xbc, 0xaa, 0xbe, 0x80, 0x41, 0x6c, 0xbf, 0xd5, 0xb1, 0xe1, 0xbe, 0xbb, 0x4e, 0x96, 0xbe, + 0xb3, 0x21, 0x63, 0xbf, 0x07, 0x6a, 0xfe, 0xbe, 0xde, 0x1f, 0x9c, 0xbe, 0x29, 0xfb, 0x57, 0xbf, 0x0e, 0x2c, 0xde, 0xbe, 0xc7, 0xf5, 0x9b, 0xbe, 0xb2, 0x13, + 0x60, 0xbf, 0x40, 0xad, 0x0c, 0xbe, 0xd8, 0x42, 0xd3, 0xbd, 0xf7, 0xbe, 0x83, 0xbf, 0x3c, 0x60, 0x0c, 0xbe, 0x8c, 0x38, 0x44, 0xbe, 0x3e, 0xdf, 0x81, 0xbf, + 0x95, 0xb3, 0x75, 0xbd, 0x58, 0xa2, 0xe5, 0xbd, 0x6c, 0x4c, 0x84, 0xbf, 0xec, 0xbd, 0xbd, 0xbd, 0x0a, 0xcc, 0x66, 0xbe, 0xc4, 0xf2, 0x81, 0xbf, 0x45, 0x6a, + 0x57, 0xbd, 0xb2, 0x2f, 0x56, 0xbe, 0x67, 0xde, 0x82, 0xbf, 0xb7, 0xe1, 0x42, 0xbe, 0xb7, 0x65, 0xcc, 0xbe, 0x64, 0xcf, 0x49, 0xbf, 0xa5, 0x7a, 0x53, 0xbe, + 0xdc, 0xcd, 0xd7, 0xbe, 0x47, 0x3d, 0x4a, 0xbf, 0xd4, 0xa4, 0x35, 0xbe, 0x18, 0xa1, 0xd7, 0xbe, 0x6f, 0x05, 0x47, 0xbf, 0xb7, 0x4d, 0x76, 0xbe, 0xf9, 0x08, + 0xe8, 0xbe, 0xbc, 0x88, 0x4a, 0xbf, 0x23, 0xf5, 0x6e, 0xbe, 0x0a, 0x13, 0xf2, 0xbe, 0x10, 0x04, 0x47, 0xbf, 0x28, 0xda, 0x01, 0xbf, 0x18, 0xd0, 0xe8, 0xbe, + 0xc3, 0x47, 0x3c, 0xbf, 0x2d, 0x5d, 0x0a, 0xbf, 0x2e, 0x83, 0xde, 0xbe, 0xef, 0x3c, 0x36, 0xbf, 0xbb, 0xa2, 0x02, 0xbf, 0x0c, 0x25, 0xec, 0xbe, 0xc2, 0x61, + 0x3b, 0xbf, 0x98, 0x88, 0x20, 0xbe, 0x2a, 0x1f, 0xcc, 0xbe, 0x52, 0x1a, 0x4a, 0xbf, 0x55, 0x0b, 0x2d, 0xbe, 0x24, 0x10, 0xc5, 0xbe, 0xb7, 0xff, 0x49, 0xbf, + 0xb2, 0x1f, 0x1d, 0xbe, 0x27, 0x5b, 0xbd, 0xbe, 0x6a, 0x2a, 0x4a, 0xbf, 0xcb, 0xbf, 0x0b, 0xbe, 0x81, 0xdd, 0xcf, 0xbe, 0x3d, 0xc9, 0x4c, 0xbf, 0xdb, 0xc7, + 0x39, 0xbe, 0xf2, 0xae, 0xaf, 0xbe, 0x9c, 0x69, 0x4b, 0xbf, 0xb5, 0x96, 0x3c, 0xbe, 0x49, 0xc5, 0xb3, 0xbe, 0x38, 0x66, 0x4c, 0xbf, 0xd0, 0x1c, 0x01, 0xbf, + 0x22, 0xfd, 0xc4, 0xbe, 0x11, 0xf4, 0x3d, 0xbf, 0x29, 0x3b, 0x03, 0xbf, 0x69, 0xac, 0xc7, 0xbe, 0x6f, 0x67, 0x3c, 0xbf, 0x64, 0x13, 0xfe, 0xbe, 0x46, 0xbd, + 0xca, 0xbe, 0x14, 0xb8, 0x3d, 0xbf, 0x1d, 0x70, 0x03, 0xbf, 0x47, 0x17, 0xb9, 0xbe, 0x2b, 0x28, 0x3c, 0xbf, 0xab, 0xc1, 0x07, 0xbf, 0x6e, 0x70, 0xc4, 0xbe, + 0xa1, 0xd8, 0x3a, 0xbf, 0xc0, 0xaa, 0x02, 0xbf, 0x16, 0xe7, 0xbd, 0xbe, 0xe8, 0xe2, 0x3c, 0xbf, 0x7d, 0x51, 0x05, 0xbf, 0x1e, 0xda, 0xd4, 0xbe, 0x8c, 0x44, + 0x3a, 0xbf, 0xcc, 0xf6, 0x90, 0xbe, 0x0e, 0x50, 0x9d, 0xbe, 0x93, 0x7f, 0x5e, 0xbf, 0xcc, 0xc1, 0xa8, 0xbe, 0xfa, 0x1d, 0xa1, 0xbe, 0x8c, 0x6b, 0x5e, 0xbf, + 0x5c, 0x2d, 0x91, 0xbe, 0x96, 0x5b, 0xa2, 0xbe, 0xda, 0xfb, 0x59, 0xbf, 0x8e, 0xa5, 0x36, 0xbe, 0xa8, 0xff, 0xae, 0xbe, 0xa4, 0x1d, 0x4e, 0xbf, 0x57, 0xf0, + 0x05, 0xbf, 0xe5, 0x72, 0xb7, 0xbe, 0xf2, 0xe3, 0x3c, 0xbf, 0xd5, 0xe4, 0x09, 0xbe, 0xd2, 0x39, 0xb8, 0xbe, 0xc7, 0xd0, 0x56, 0xbf, 0xac, 0x5f, 0xfd, 0xbd, + 0xf9, 0x55, 0xc2, 0xbe, 0x98, 0x0e, 0x57, 0xbf, 0x7f, 0x73, 0xaf, 0xbd, 0x69, 0x25, 0xb9, 0xbe, 0xcd, 0xea, 0x65, 0xbf, 0x94, 0x86, 0x03, 0xbe, 0xa0, 0xef, + 0xe2, 0xbe, 0x16, 0x21, 0x54, 0xbf, 0x04, 0xbb, 0xff, 0xbd, 0x3d, 0xd1, 0xea, 0xbe, 0x2c, 0x29, 0x57, 0xbf, 0x03, 0x9a, 0xd2, 0xbd, 0x37, 0x89, 0xdf, 0xbe, + 0xd3, 0x74, 0x5b, 0xbf, 0x82, 0x14, 0x28, 0xbe, 0x52, 0xc5, 0xe7, 0xbe, 0xbe, 0xc8, 0x49, 0xbf, 0xc4, 0x2c, 0x0e, 0xbf, 0xb8, 0x2a, 0xcd, 0xbe, 0x5e, 0x49, + 0x35, 0xbf, 0x95, 0xd7, 0x0f, 0xbf, 0xb2, 0x56, 0xbd, 0xbe, 0x11, 0xd0, 0x37, 0xbf, 0x76, 0x22, 0x18, 0xbf, 0xd4, 0x37, 0x2e, 0xbf, 0x8d, 0xee, 0x0c, 0x3f, + 0x9d, 0xc3, 0x0e, 0xbf, 0xcf, 0x06, 0x53, 0xbf, 0x6e, 0xab, 0x1d, 0x3f, 0x41, 0xe9, 0x0f, 0xbf, 0xa6, 0x7b, 0x59, 0xbf, 0x4c, 0x90, 0x14, 0x3f, 0x5b, 0x93, + 0xb3, 0xbe, 0xd6, 0x67, 0x9f, 0xbf, 0x90, 0x07, 0x63, 0x3c, 0x6f, 0x46, 0xa6, 0xbe, 0xd7, 0xae, 0xa2, 0xbf, 0x44, 0x6c, 0x09, 0x3e, 0x94, 0x6c, 0x94, 0xbe, + 0xf0, 0x26, 0xa7, 0xbf, 0x34, 0x67, 0xd6, 0x3d, 0x07, 0x32, 0x13, 0xbf, 0x68, 0x52, 0x8a, 0xbe, 0xd8, 0x8b, 0x4a, 0xbf, 0x75, 0xb4, 0x18, 0xbf, 0xef, 0xb2, + 0x99, 0xbe, 0x96, 0xda, 0x3b, 0xbf, 0x6f, 0x35, 0x9c, 0xbe, 0xd4, 0xfd, 0x4f, 0xbf, 0x1e, 0xc9, 0x45, 0xbf, 0x5f, 0x6e, 0xcb, 0xbe, 0xe0, 0x3e, 0x53, 0xbf, + 0x03, 0x0f, 0x3a, 0xbf, 0xf7, 0xd3, 0xb8, 0xbe, 0xb1, 0x71, 0x60, 0xbf, 0xa2, 0x52, 0x36, 0xbf, 0xab, 0x66, 0xd2, 0xbe, 0xfd, 0x17, 0x6e, 0xbf, 0x3f, 0x8a, + 0x27, 0xbf, 0x57, 0x60, 0xe8, 0xbe, 0x90, 0x1d, 0x54, 0xbf, 0xa9, 0x9c, 0x31, 0xbf, 0xf7, 0x54, 0xea, 0xbe, 0x8e, 0x30, 0x64, 0xbf, 0xcd, 0x97, 0x24, 0xbf, + 0x30, 0x51, 0x72, 0xbe, 0x46, 0xf2, 0x9b, 0xbe, 0x76, 0x26, 0x5e, 0xbf, 0x6b, 0x17, 0x72, 0xbe, 0x17, 0x9d, 0x99, 0xbe, 0x9a, 0xef, 0x6b, 0xbf, 0x95, 0x68, + 0x43, 0xbe, 0x70, 0x2f, 0xc5, 0xbf, 0xcc, 0x5f, 0x01, 0xbf, 0x0f, 0x6c, 0x1c, 0xbe, 0x5a, 0x4f, 0xc7, 0xbf, 0xb3, 0xf8, 0xfc, 0xbe, 0x6b, 0x8b, 0x1b, 0xbe, + 0x7e, 0x6c, 0xc5, 0xbf, 0x52, 0x4d, 0x07, 0xbf, 0x6c, 0xfb, 0x4b, 0x3d, 0xc0, 0xbe, 0x6d, 0xbf, 0x0b, 0x79, 0x6f, 0xbf, 0xbe, 0xb5, 0x32, 0x3d, 0xe0, 0x29, + 0x6f, 0xbf, 0x5e, 0xa1, 0x72, 0xbf, 0x58, 0xbc, 0x18, 0x3d, 0x6e, 0xae, 0x6f, 0xbf, 0xd7, 0x3c, 0x69, 0xbf, 0x1d, 0xa4, 0x9a, 0x3c, 0xc6, 0x90, 0x49, 0xbf, + 0x55, 0x46, 0x86, 0xbf, 0x4d, 0xe7, 0x2b, 0xbf, 0xe4, 0xea, 0xc0, 0xbe, 0xc6, 0xcf, 0x14, 0xbf, 0x4b, 0xb6, 0x2c, 0xbf, 0x88, 0xcd, 0xe7, 0xbe, 0x29, 0x58, + 0x10, 0xbf, 0x52, 0xce, 0x21, 0xbf, 0x9d, 0xd5, 0xd0, 0xbe, 0xce, 0xaf, 0x25, 0xbf, 0x08, 0x63, 0x35, 0xbf, 0xfe, 0xef, 0xd9, 0xbe, 0x49, 0x9a, 0xf0, 0xbe, + 0x07, 0x47, 0x34, 0xbf, 0x70, 0x5a, 0x02, 0xbf, 0x1a, 0x30, 0xfd, 0xbe, 0x8c, 0x8f, 0x3b, 0xbf, 0xb9, 0xbb, 0xf4, 0xbe, 0xd1, 0xa0, 0xbf, 0xbe, 0x4a, 0x60, + 0x3a, 0xbf, 0xc5, 0x53, 0xc3, 0xbe, 0x97, 0xa6, 0xc0, 0xbe, 0x7a, 0xfb, 0x35, 0xbf, 0x3c, 0x9a, 0x14, 0xbf, 0x2f, 0xe8, 0xd0, 0xbe, 0x74, 0x0f, 0xda, 0xbe, + 0xea, 0xb3, 0x29, 0xbf, 0xb0, 0x79, 0x41, 0xbf, 0xf0, 0xe7, 0xdc, 0xbe, 0xc5, 0x1e, 0x1a, 0xbf, 0xe5, 0xd9, 0x43, 0xbf, 0xde, 0xe9, 0xe3, 0xbe, 0xb8, 0xda, + 0x29, 0xbf, 0x54, 0xf3, 0x3e, 0xbf, 0x67, 0xc8, 0x85, 0xbd, 0x1e, 0x52, 0xc6, 0xbf, 0x61, 0xe6, 0xcb, 0xbe, 0x17, 0x6f, 0x17, 0xbd, 0xd8, 0x92, 0xc2, 0xbf, + 0x8a, 0xda, 0x92, 0xbe, 0xbb, 0x25, 0x1c, 0xbd, 0x92, 0x0b, 0xc7, 0xbf, 0x40, 0x4f, 0xce, 0xbe, 0x44, 0xa2, 0xe6, 0xbe, 0x2d, 0xbe, 0x72, 0xbf, 0x80, 0xea, + 0x1b, 0xbf, 0xb8, 0xac, 0xda, 0xbe, 0xf7, 0x30, 0x76, 0xbf, 0x2d, 0xe8, 0x20, 0xbf, 0x80, 0xc9, 0xe7, 0xbe, 0xfb, 0x01, 0x6d, 0xbf, 0xc7, 0xb4, 0x1e, 0xbf, + 0x2d, 0xa8, 0x33, 0xbf, 0x72, 0x65, 0x16, 0xbf, 0x8d, 0x7a, 0x59, 0xbe, 0x45, 0x9e, 0x37, 0xbf, 0x2f, 0x79, 0x0c, 0xbf, 0x13, 0x31, 0x1d, 0xbe, 0x20, 0x92, + 0x2d, 0xbf, 0xdb, 0xcd, 0x2b, 0xbf, 0x38, 0xf3, 0xe0, 0xbd, 0xc9, 0x24, 0x3c, 0xbf, 0x5b, 0xf0, 0xd8, 0xbe, 0xd4, 0x4e, 0x32, 0xbe, 0xd4, 0x79, 0x3c, 0xbf, + 0x72, 0x46, 0xe7, 0xbe, 0x80, 0x42, 0x8c, 0xbe, 0xcc, 0xcc, 0x37, 0xbf, 0x2a, 0x5a, 0x0b, 0xbf, 0xe9, 0x6d, 0x8d, 0xbe, 0xa4, 0xfd, 0x2d, 0xbf, 0xd2, 0x72, + 0x2a, 0xbf, 0x77, 0x7c, 0xa1, 0xbe, 0x6b, 0x09, 0x26, 0xbf, 0x4e, 0xfb, 0x59, 0xbf, 0x00, 0x25, 0x28, 0xbe, 0x97, 0x8d, 0x29, 0xbf, 0x42, 0xa1, 0x4e, 0xbf, + 0x32, 0xde, 0x9d, 0xbd, 0xeb, 0x13, 0x25, 0xbf, 0x5c, 0x73, 0x71, 0xbf, 0xf4, 0x76, 0x54, 0xbd, 0x90, 0x49, 0x1b, 0xbf, 0x24, 0x83, 0x6d, 0xbf, 0xbb, 0xa1, + 0x74, 0xbe, 0x80, 0x4d, 0x1c, 0xbf, 0x08, 0x22, 0x67, 0xbf, 0x1e, 0x95, 0x84, 0xbe, 0xa1, 0x46, 0x17, 0xbf, 0x06, 0xc2, 0x8b, 0xbf, 0xfe, 0x98, 0xc5, 0xbd, + 0x23, 0x27, 0x1a, 0xbf, 0xf8, 0xe9, 0x82, 0xbf, 0xb6, 0xc5, 0x25, 0xbe, 0x06, 0x1a, 0x1e, 0xbf, 0xf7, 0x77, 0x84, 0xbf, 0x58, 0x4e, 0xa4, 0xbd, 0x5c, 0xf3, + 0x42, 0xbf, 0x20, 0x33, 0xa3, 0xbe, 0x20, 0x2d, 0xbe, 0xbb, 0xa0, 0x37, 0x42, 0xbf, 0x5c, 0x20, 0xb9, 0xbe, 0x00, 0x5d, 0x6b, 0xb9, 0xa6, 0x24, 0x3e, 0xbf, + 0xf6, 0x52, 0xc6, 0xbe, 0x6f, 0x9b, 0x71, 0xbd, 0x8b, 0x82, 0x32, 0xbf, 0xf4, 0x65, 0x27, 0xbf, 0xf4, 0x65, 0x4b, 0x3c, 0xb0, 0xce, 0x33, 0xbf, 0xc3, 0xc3, + 0x19, 0xbf, 0x90, 0x5c, 0xc7, 0xba, 0x49, 0xd9, 0x25, 0xbf, 0xae, 0xe0, 0x63, 0xbf, 0x00, 0x6b, 0x75, 0x3d, 0x5f, 0x38, 0x20, 0xbf, 0x2e, 0xdb, 0x75, 0xbf, + 0xfe, 0x5d, 0x24, 0x3d, 0xde, 0xeb, 0x6a, 0xbe, 0x02, 0xa6, 0xc3, 0xbf, 0xc8, 0x8c, 0xf3, 0xbe, 0x20, 0x8a, 0x45, 0xbe, 0x9c, 0x5f, 0xc6, 0xbf, 0x75, 0x5b, + 0xed, 0xbe, 0x34, 0x55, 0x38, 0xbf, 0x24, 0x14, 0xde, 0xbe, 0x0b, 0x67, 0xc0, 0x3e, 0x53, 0xc9, 0x3b, 0xbf, 0x90, 0xbb, 0xee, 0xbe, 0xcd, 0xd9, 0x95, 0x3e, + 0xff, 0x6c, 0x3c, 0xbf, 0x6f, 0x8f, 0xcf, 0xbe, 0x3d, 0x92, 0xa9, 0x3e, 0xa6, 0xb8, 0xf3, 0xbe, 0xf2, 0x65, 0x8a, 0xbf, 0xa0, 0x6d, 0x60, 0x3e, 0xb2, 0xc2, + 0x04, 0xbf, 0x29, 0x52, 0x75, 0xbf, 0x85, 0xb7, 0xff, 0x3d, 0xe0, 0x67, 0x12, 0xbf, 0x98, 0x49, 0x60, 0xbf, 0xe4, 0x69, 0x13, 0x3e, 0xcd, 0xfb, 0x3c, 0xbf, + 0x54, 0x6f, 0x95, 0xbe, 0xcd, 0x34, 0xb7, 0x3e, 0xf2, 0xcc, 0x35, 0xbf, 0x3c, 0xd3, 0x72, 0xbe, 0xa5, 0x37, 0xee, 0x3e, 0x70, 0xdc, 0x3d, 0xbf, 0x98, 0xd7, + 0x56, 0xbe, 0x2b, 0x47, 0xb1, 0x3e, 0x2e, 0x33, 0x83, 0xbe, 0x8a, 0xbd, 0xb9, 0xbf, 0xd8, 0xe7, 0x43, 0xbe, 0x77, 0x9f, 0x8f, 0xbe, 0x83, 0x0e, 0xb2, 0xbf, + 0xc0, 0x69, 0xcd, 0xbd, 0xfa, 0xf7, 0x69, 0xbe, 0x39, 0x54, 0xb3, 0xbf, 0x60, 0xf8, 0xa1, 0xbd, 0x25, 0x60, 0x49, 0xbe, 0x46, 0x45, 0xaf, 0xbf, 0x10, 0xd9, + 0xe6, 0x3c, 0xf9, 0x42, 0x70, 0xbe, 0x45, 0x18, 0xad, 0xbf, 0xe8, 0xfb, 0x2f, 0x3d, 0xc1, 0x28, 0x78, 0xbe, 0x7e, 0x0a, 0xbf, 0xbf, 0x97, 0x16, 0x8f, 0xbe, + 0x76, 0x7b, 0x77, 0xbe, 0x1c, 0xac, 0xc2, 0xbf, 0x51, 0x17, 0xc4, 0xbe, 0xee, 0x4b, 0x9c, 0xbe, 0x02, 0x24, 0xbd, 0xbf, 0xd8, 0x50, 0x99, 0xbe, 0x86, 0x97, + 0x1a, 0xbe, 0xd6, 0x66, 0xc7, 0xbf, 0x45, 0x34, 0xea, 0xbe, 0x37, 0x70, 0x99, 0xbd, 0x55, 0x35, 0xb4, 0xbe, 0x7f, 0x83, 0x28, 0xbf, 0x65, 0xf2, 0xd0, 0xbd, + 0x7a, 0x43, 0x9c, 0xbe, 0x7a, 0x8e, 0x2c, 0xbf, 0x45, 0xd7, 0xce, 0xbd, 0x0a, 0x66, 0xc9, 0xbe, 0x1e, 0xc4, 0x24, 0xbf, 0x5b, 0x42, 0x32, 0xbe, 0x9f, 0x11, + 0xd8, 0xbe, 0x89, 0x05, 0x22, 0xbf, 0x4a, 0x7c, 0x3b, 0xbe, 0xab, 0xfb, 0x80, 0xbe, 0xa0, 0x47, 0x31, 0xbf, 0x35, 0x9b, 0x92, 0xbe, 0xb6, 0x40, 0xe6, 0xbe, + 0x4e, 0xff, 0x1f, 0xbf, 0xf5, 0x14, 0xd0, 0xbe, 0xac, 0x9a, 0xea, 0xbe, 0xfe, 0x18, 0x21, 0xbf, 0x25, 0xff, 0x97, 0xbe, 0x68, 0x00, 0x5c, 0xbe, 0x68, 0xa7, + 0x34, 0xbf, 0x54, 0xe9, 0x02, 0xbf, 0xb3, 0x91, 0xe4, 0xbe, 0xea, 0xdd, 0x23, 0xbf, 0x38, 0xb7, 0x13, 0xbf, 0x04, 0x48, 0xd5, 0xbe, 0x91, 0xd4, 0x26, 0xbf, + 0x56, 0xe5, 0x19, 0xbf, 0xdf, 0x36, 0xc1, 0xbe, 0xff, 0x48, 0x2a, 0xbf, 0x09, 0xa7, 0x15, 0xbf, 0xfc, 0x36, 0xa2, 0xbe, 0x92, 0x9d, 0x2f, 0xbf, 0x8c, 0x08, + 0x04, 0xbf, 0x18, 0xd8, 0x7f, 0xbe, 0x36, 0x8d, 0x34, 0xbf, 0xa4, 0xf0, 0xd2, 0xbe, 0xba, 0xfd, 0x57, 0xbe, 0xce, 0x17, 0x36, 0xbf, 0x0b, 0x9e, 0xa3, 0xbe, + 0xb2, 0xfa, 0xb5, 0xbe, 0xf7, 0xb6, 0x59, 0xbf, 0x91, 0x7b, 0x97, 0xbe, 0xdc, 0x7d, 0x5b, 0xbe, 0xe8, 0x92, 0x36, 0xbf, 0x72, 0xd7, 0x91, 0xbe, 0x74, 0xc8, + 0xb7, 0xbe, 0xf3, 0x4e, 0x56, 0xbf, 0x67, 0x1d, 0x4a, 0xbf, 0x40, 0x6c, 0x9d, 0xbd, 0x3a, 0x37, 0x58, 0x3d, 0xf4, 0x84, 0x49, 0xbf, 0xbc, 0xa8, 0xf1, 0xbd, + 0xba, 0x89, 0x0d, 0x3d, 0x03, 0x20, 0x47, 0xbf, 0xa0, 0xa6, 0x82, 0xbd, 0x80, 0xdf, 0xc0, 0xbb, 0x40, 0x6b, 0x3e, 0xbf, 0xe0, 0x2b, 0xcc, 0xbe, 0x5f, 0x0e, + 0x83, 0x3e, 0x5a, 0x31, 0x40, 0xbf, 0xf8, 0x54, 0xb1, 0xbe, 0xf2, 0x8b, 0x91, 0x3e, 0x80, 0x03, 0x36, 0xbf, 0x01, 0xb7, 0x10, 0xbf, 0xfd, 0x3b, 0x5a, 0x3e, + 0xd8, 0xf0, 0x38, 0xbf, 0x5c, 0xaa, 0x0f, 0xbf, 0xe6, 0x61, 0x3b, 0x3e, 0x8a, 0x42, 0x3b, 0xbf, 0x2d, 0x4a, 0x03, 0xbf, 0xa2, 0x77, 0x49, 0x3e, 0x57, 0x52, + 0x4a, 0xbf, 0x84, 0x3f, 0xa9, 0xbd, 0x7a, 0x8a, 0x5c, 0x3d, 0xf3, 0xc2, 0x46, 0xbf, 0x30, 0x4a, 0x58, 0xbe, 0xd6, 0x25, 0x1e, 0x3d, 0x69, 0x63, 0x47, 0xbf, + 0xa0, 0xce, 0x5e, 0xbe, 0x0a, 0xa8, 0x51, 0x3d, 0x42, 0x5c, 0x46, 0xbf, 0x6c, 0x25, 0x84, 0xbe, 0x72, 0x1b, 0x0d, 0x3d, 0xdb, 0x0d, 0x5a, 0xbf, 0xb2, 0xd3, + 0x50, 0xbe, 0x61, 0x73, 0x84, 0x3e, 0x4c, 0x5c, 0x51, 0xbf, 0xc4, 0x6c, 0x5c, 0xbe, 0x1d, 0xef, 0x82, 0x3e, 0x73, 0xde, 0x5a, 0xbf, 0x34, 0x2b, 0x43, 0xbe, + 0x14, 0x45, 0x75, 0x3e, 0x2b, 0x42, 0x4c, 0xbf, 0xe8, 0x56, 0x8b, 0xbe, 0x1e, 0x31, 0xa3, 0x3d, 0x64, 0xa7, 0x4a, 0xbf, 0x68, 0x56, 0x7f, 0xbe, 0x5c, 0x0f, + 0xd8, 0x3d, 0xd8, 0xcb, 0x45, 0xbf, 0x31, 0x54, 0x8a, 0xbe, 0x42, 0xd3, 0xdc, 0x3d, 0x53, 0x85, 0x5b, 0xbf, 0x08, 0x32, 0x99, 0xbd, 0x13, 0xc3, 0xbe, 0x3d, + 0xa0, 0x8e, 0x54, 0xbf, 0xe8, 0xd9, 0xb6, 0xbd, 0x26, 0x9c, 0xd0, 0x3d, 0xf3, 0x42, 0x58, 0xbf, 0xb4, 0x41, 0x97, 0xbd, 0xec, 0xc1, 0x5a, 0x3d, 0xdd, 0x78, + 0x4a, 0xbf, 0x70, 0x54, 0xd2, 0xbe, 0x8c, 0x9a, 0xfe, 0x3d, 0x86, 0x60, 0x4e, 0xbf, 0x5e, 0xc7, 0xd6, 0xbe, 0xc0, 0xb9, 0x04, 0x3e, 0x43, 0x62, 0x4c, 0xbf, + 0x36, 0xad, 0xd3, 0xbe, 0xcd, 0xe3, 0xf3, 0x3d, 0x99, 0x63, 0x50, 0xbf, 0x58, 0x66, 0xc6, 0xbe, 0x78, 0x18, 0x22, 0x3e, 0x74, 0x79, 0x4d, 0xbf, 0x78, 0x33, + 0xcb, 0xbe, 0x14, 0x9e, 0x1b, 0x3e, 0x81, 0x53, 0x45, 0xbf, 0xd7, 0x36, 0xc0, 0xbe, 0xe6, 0x06, 0x45, 0x3e, 0xb6, 0x1c, 0x54, 0xbf, 0x8c, 0xb5, 0x5b, 0xbe, + 0xe9, 0xd1, 0xc3, 0x3d, 0xf6, 0xb9, 0x54, 0xbf, 0x8e, 0x9b, 0x5e, 0xbe, 0x96, 0x4d, 0xf8, 0x3d, 0x10, 0xf0, 0x4f, 0xbf, 0x20, 0x59, 0x60, 0xbe, 0xe4, 0x3c, + 0x2f, 0x3e, 0x4f, 0x78, 0x52, 0xbf, 0x36, 0xbf, 0x51, 0xbe, 0xf0, 0xca, 0x15, 0x3e, 0xeb, 0xb4, 0x40, 0xbf, 0xe4, 0x17, 0x96, 0xbe, 0x8a, 0xcd, 0x07, 0x3e, + 0xbd, 0x8f, 0x44, 0xbf, 0x3e, 0x53, 0xa4, 0xbe, 0x2a, 0x80, 0xef, 0x3d, 0x3e, 0x85, 0x45, 0xbf, 0xdb, 0xab, 0x92, 0xbe, 0x0c, 0x41, 0xd9, 0x3d, 0xbb, 0x03, + 0x4a, 0xbf, 0x0b, 0x10, 0xce, 0xbe, 0x51, 0xdc, 0x17, 0x3e, 0x4d, 0x6c, 0x46, 0xbf, 0x89, 0xb0, 0xcc, 0xbe, 0x32, 0xaa, 0x11, 0x3e, 0x49, 0x49, 0x42, 0xbf, + 0x70, 0xc0, 0xba, 0xbe, 0x02, 0x42, 0x47, 0x3e, 0x66, 0x1c, 0x4d, 0xbf, 0x2f, 0x0e, 0x01, 0xbf, 0xf6, 0x2b, 0x11, 0x3e, 0xda, 0x46, 0x4e, 0xbf, 0x22, 0x07, + 0xda, 0xbe, 0xe4, 0x03, 0xe2, 0x3d, 0xe6, 0x72, 0x4f, 0xbf, 0x27, 0xce, 0xe1, 0xbe, 0x96, 0x71, 0x04, 0x3e, 0x79, 0x2f, 0x44, 0xbf, 0x24, 0x21, 0xde, 0xbe, + 0x31, 0x6b, 0x9d, 0x3d, 0xa6, 0x99, 0x40, 0xbf, 0x22, 0x16, 0x0a, 0xbf, 0x98, 0xe6, 0x01, 0x3e, 0x3c, 0x63, 0x3e, 0xbf, 0xe3, 0x5e, 0x0a, 0xbf, 0x2e, 0xfe, + 0x00, 0x3e, 0x21, 0xc3, 0x4f, 0xbf, 0xe9, 0xd6, 0x9d, 0xbe, 0xdf, 0xe5, 0x9b, 0x3d, 0xdc, 0xae, 0x52, 0xbf, 0x15, 0xa6, 0x9c, 0xbe, 0x22, 0x12, 0xce, 0x3d, + 0xee, 0x40, 0x5e, 0xbf, 0x17, 0x58, 0xd1, 0xbe, 0x01, 0x73, 0xb6, 0x3e, 0x16, 0x5e, 0x5a, 0xbf, 0x92, 0xa3, 0xe4, 0xbe, 0xbf, 0x2e, 0x9f, 0x3e, 0x59, 0x47, + 0x5e, 0xbf, 0x5c, 0x0f, 0xce, 0xbe, 0xe8, 0x33, 0xb2, 0x3e, 0xcc, 0xdf, 0x3b, 0xbf, 0x00, 0x63, 0x0d, 0xbf, 0x88, 0x56, 0x2c, 0x3e, 0x3a, 0x4e, 0x40, 0xbf, + 0xbe, 0xb8, 0x07, 0xbf, 0x5e, 0x36, 0x62, 0x3e, 0xe7, 0xdc, 0x42, 0xbf, 0xff, 0x60, 0x01, 0xbf, 0x0f, 0xf3, 0x4e, 0x3e, 0xdc, 0x12, 0x40, 0xbf, 0x03, 0xa6, + 0x01, 0xbf, 0xa0, 0x1e, 0x46, 0x3e, 0x61, 0x0a, 0x3b, 0xbf, 0xa0, 0x32, 0x0c, 0xbf, 0xd6, 0x29, 0x3e, 0x3e, 0x78, 0x5a, 0x3d, 0xbf, 0x98, 0xc1, 0x01, 0xbf, + 0x59, 0x2c, 0x44, 0x3e, 0xca, 0x24, 0x3c, 0xbf, 0x2d, 0x2e, 0x02, 0xbf, 0x32, 0x18, 0x44, 0x3e, 0x04, 0xab, 0x44, 0xbf, 0x51, 0xd6, 0xd4, 0xbe, 0xa6, 0x62, + 0x8d, 0x3d, 0xa7, 0x3b, 0x59, 0xbf, 0x02, 0x09, 0x2e, 0xbe, 0xde, 0x4e, 0xdb, 0x3d, 0xbb, 0xc3, 0x52, 0xbf, 0xae, 0xd2, 0x28, 0xbe, 0x14, 0x21, 0xf9, 0x3d, + 0x77, 0x1f, 0x4f, 0xbf, 0xbc, 0x8b, 0xaf, 0xbd, 0x00, 0x05, 0xf1, 0x3c, 0x44, 0x99, 0x51, 0xbf, 0x4c, 0xdf, 0xbb, 0xbd, 0x10, 0xa1, 0xa0, 0x3c, 0x34, 0x66, + 0x4d, 0xbf, 0x00, 0xd5, 0x0d, 0xbe, 0xba, 0x76, 0x0e, 0x3d, 0xfe, 0xb8, 0x62, 0xbf, 0x94, 0x9f, 0xbc, 0xbd, 0x00, 0x1a, 0x3b, 0x3e, 0xd9, 0x42, 0x65, 0xbf, + 0x68, 0x07, 0xe6, 0xbd, 0xb9, 0x85, 0x50, 0x3e, 0x3d, 0x6b, 0x61, 0xbf, 0x4c, 0x1e, 0x0f, 0xbe, 0x0b, 0x4a, 0x43, 0x3e, 0x2a, 0x38, 0x5d, 0xbf, 0xd8, 0xb5, + 0x4c, 0xbe, 0xfa, 0x1c, 0x84, 0x3e, 0x4f, 0xed, 0x54, 0xbf, 0x45, 0xb0, 0x84, 0xbe, 0x23, 0xb4, 0x8e, 0x3e, 0xaf, 0x0f, 0x4b, 0xbf, 0x9c, 0xad, 0xa9, 0xbd, + 0x48, 0xf1, 0x4e, 0x3d, 0x0e, 0x51, 0x51, 0xbf, 0x00, 0xf8, 0xbd, 0xbc, 0x42, 0x1e, 0xdb, 0x3d, 0xcb, 0x21, 0x50, 0xbf, 0xd0, 0x80, 0x09, 0xbd, 0x0c, 0xa4, + 0xb0, 0x3d, 0x0f, 0xc0, 0x4d, 0xbf, 0xd0, 0x1d, 0x24, 0xbd, 0x9a, 0xb3, 0xd8, 0x3d, 0x9b, 0x71, 0x56, 0xbf, 0xd0, 0x79, 0xc5, 0xbc, 0x5a, 0xef, 0x3d, 0x3e, + 0xc9, 0x65, 0x53, 0xbf, 0x60, 0xb8, 0x73, 0xbc, 0xbb, 0x4d, 0x13, 0x3e, 0xc7, 0x7a, 0x51, 0xbf, 0x18, 0x8b, 0x22, 0xbd, 0xf8, 0xef, 0x21, 0x3e, 0xd3, 0x69, + 0x47, 0xbf, 0x48, 0x2d, 0x35, 0xbe, 0x38, 0xc1, 0xde, 0x3c, 0x5b, 0x22, 0x48, 0xbf, 0x72, 0x20, 0x3b, 0xbe, 0xe4, 0x4c, 0x0b, 0x3d, 0x4b, 0xe1, 0x48, 0xbf, + 0x3a, 0x9c, 0x3d, 0xbe, 0x52, 0x86, 0x1e, 0x3d, 0xca, 0xca, 0x3d, 0xbf, 0xe5, 0xb5, 0x0a, 0xbf, 0xd7, 0x50, 0xff, 0x3d, 0xda, 0xdb, 0x3a, 0xbf, 0xd6, 0x6d, + 0x10, 0xbf, 0x85, 0xb6, 0x1b, 0x3e, 0x36, 0x8e, 0x37, 0x3f, 0xa0, 0x25, 0x14, 0xbf, 0x00, 0x18, 0xbe, 0x3d, 0x9d, 0x38, 0x3f, 0x3f, 0x6b, 0xf4, 0xdd, 0xbe, + 0xa8, 0x4a, 0x74, 0x3c, 0xf3, 0xd4, 0x35, 0x3f, 0xe1, 0x0f, 0x15, 0xbf, 0x30, 0xe3, 0x48, 0x3d, 0x12, 0x09, 0x42, 0x3f, 0x24, 0xbe, 0xd7, 0xbe, 0x63, 0x60, + 0x3d, 0x3d, 0x04, 0xc9, 0x3f, 0x3f, 0x23, 0x37, 0xfc, 0xbe, 0x78, 0xc7, 0xa0, 0x3d, 0xe4, 0xf3, 0x3a, 0x3f, 0xf8, 0x37, 0x0e, 0xbf, 0x36, 0x7e, 0xe4, 0x3d, + 0x9f, 0x79, 0x33, 0x3f, 0x4b, 0x2e, 0x1a, 0xbf, 0x0e, 0xdb, 0x17, 0x3e, 0xb2, 0x07, 0x33, 0x3f, 0x22, 0x4c, 0x21, 0xbf, 0x7d, 0x85, 0xc5, 0x3d, 0x66, 0x3f, + 0x74, 0x3e, 0x5e, 0x2c, 0x95, 0xbe, 0xc2, 0xf6, 0x71, 0xbf, 0xa0, 0x03, 0xb4, 0x3e, 0x2b, 0x45, 0x94, 0xbe, 0xff, 0xfe, 0x6d, 0xbf, 0x68, 0x14, 0xb5, 0x3e, + 0x2c, 0xd5, 0x8e, 0xbe, 0xed, 0xe6, 0x71, 0xbf, 0x79, 0x41, 0x10, 0x3f, 0x4e, 0xc8, 0x4c, 0xbf, 0xa0, 0x38, 0x1e, 0xbf, 0x78, 0x9b, 0x0e, 0x3f, 0x34, 0x6d, + 0x39, 0xbf, 0xba, 0x1f, 0x2b, 0xbf, 0xcb, 0x21, 0x0a, 0x3f, 0x9d, 0x04, 0x51, 0xbf, 0x11, 0x9c, 0x22, 0xbf, 0x66, 0x3e, 0x0e, 0x3f, 0x26, 0x13, 0x5c, 0xbf, + 0x62, 0xea, 0x11, 0xbf, 0x01, 0xd4, 0xab, 0x3e, 0xcd, 0xfe, 0xac, 0xbf, 0x89, 0x6d, 0x02, 0xbf, 0xc5, 0x36, 0x88, 0x3e, 0x2b, 0x8c, 0xa1, 0xbf, 0xa5, 0x95, + 0x12, 0xbf, 0x05, 0x7f, 0x93, 0x3e, 0x2a, 0xfa, 0xaa, 0xbf, 0xfb, 0xe8, 0x10, 0xbf, 0xf2, 0xf7, 0x96, 0x3e, 0x1a, 0xdc, 0xb0, 0xbf, 0xfb, 0x20, 0x0b, 0xbf, + 0xe7, 0x25, 0x94, 0x3e, 0xee, 0xbc, 0x94, 0xbf, 0xd5, 0xd7, 0x14, 0xbf, 0x40, 0xc4, 0x84, 0x3e, 0xd6, 0xef, 0x96, 0xbf, 0xd6, 0x6a, 0x1c, 0xbf, 0xfe, 0xbb, + 0x93, 0x3e, 0xb0, 0xa2, 0x9a, 0xbf, 0xd4, 0x21, 0x10, 0xbf, 0x81, 0x77, 0x80, 0x3e, 0x1f, 0x10, 0x9d, 0xbf, 0x0b, 0x9c, 0x18, 0xbf, 0x32, 0xfa, 0x75, 0x3e, + 0xa8, 0x92, 0x9a, 0xbf, 0x3f, 0x35, 0x1d, 0xbf, 0x7e, 0x42, 0xbb, 0x3e, 0xe5, 0x65, 0xaa, 0xbf, 0x20, 0x6f, 0xf5, 0xbe, 0x02, 0x54, 0xbd, 0x3e, 0xd6, 0x3b, + 0xb2, 0xbf, 0x26, 0xd1, 0xd2, 0xbe, 0x03, 0xea, 0x83, 0x3e, 0x2c, 0xb6, 0xbc, 0xbf, 0xec, 0x2c, 0x06, 0xbf, 0x5a, 0x38, 0x7c, 0x3e, 0x1f, 0x99, 0xb4, 0xbf, + 0xa0, 0x53, 0x13, 0xbf, 0xbb, 0x64, 0x61, 0x3e, 0xb1, 0x30, 0xbf, 0xbf, 0x5a, 0xc6, 0x0c, 0xbf, 0xe1, 0x90, 0xca, 0x3e, 0x6a, 0xf1, 0xb2, 0xbf, 0xb7, 0xf7, + 0x89, 0xbe, 0x29, 0x5c, 0xde, 0x3e, 0xe3, 0x78, 0xaa, 0xbf, 0xe2, 0x29, 0xa2, 0xbe, 0xfb, 0x5b, 0xd5, 0x3e, 0xef, 0xdc, 0xac, 0xbf, 0xe2, 0x74, 0xaf, 0xbe, + 0x13, 0x07, 0xd3, 0x3e, 0x8f, 0x4b, 0x97, 0xbf, 0x8e, 0x89, 0xf9, 0xbe, 0xc4, 0x17, 0xbe, 0x3e, 0x96, 0x5e, 0x9d, 0xbf, 0x05, 0xea, 0xff, 0xbe, 0x99, 0x85, + 0xe2, 0x3e, 0x30, 0xba, 0x97, 0xbf, 0xee, 0x43, 0xea, 0xbe, 0x75, 0x93, 0xdf, 0x3e, 0xfa, 0x1b, 0x92, 0xbf, 0x50, 0x84, 0xfc, 0xbe, 0xfc, 0xfb, 0xf3, 0x3e, + 0x5f, 0x14, 0x76, 0xbf, 0x5f, 0x38, 0x10, 0xbf, 0xb3, 0x7a, 0xe9, 0x3e, 0x72, 0x49, 0x79, 0xbf, 0x34, 0xd6, 0x14, 0xbf, 0x70, 0x51, 0xee, 0x3e, 0x3d, 0x1d, + 0x7d, 0xbf, 0x8c, 0x24, 0x0e, 0xbf, 0xdf, 0xef, 0xf4, 0x3e, 0x99, 0x33, 0x89, 0xbf, 0x82, 0x24, 0xf4, 0xbe, 0x55, 0x1a, 0xf6, 0x3e, 0x6c, 0x9e, 0x80, 0xbf, + 0xf7, 0x88, 0x03, 0xbf, 0xa8, 0xdf, 0xeb, 0x3e, 0xa8, 0xdf, 0x83, 0xbf, 0x58, 0xd0, 0x0b, 0xbf, 0x22, 0x94, 0x04, 0x3f, 0xcf, 0x19, 0x81, 0xbf, 0x45, 0x84, + 0xe9, 0xbe, 0xe9, 0xb5, 0x3d, 0x3f, 0xff, 0x3e, 0xba, 0xbe, 0xd3, 0xfc, 0x92, 0xbe, 0x32, 0x47, 0x3d, 0x3f, 0xdd, 0x7f, 0xad, 0xbe, 0x6c, 0x83, 0x3b, 0xbe, + 0xdc, 0xa5, 0x3d, 0x3f, 0xc9, 0xce, 0x98, 0xbe, 0xf6, 0x8a, 0x41, 0xbe, 0x9e, 0x50, 0xb4, 0x3e, 0x80, 0x2e, 0x92, 0xbf, 0x6e, 0x59, 0x0d, 0xbf, 0x76, 0x32, + 0x98, 0x3e, 0xdc, 0xc6, 0x8e, 0xbf, 0x34, 0x0b, 0x15, 0xbf, 0x7c, 0x40, 0x9e, 0x3e, 0x2b, 0xc7, 0x93, 0xbf, 0x7f, 0xe2, 0x11, 0xbf, 0x49, 0xa8, 0x8e, 0x3e, + 0xa7, 0x11, 0x91, 0xbf, 0x64, 0xa7, 0x16, 0xbf, 0xd4, 0x40, 0x53, 0x3e, 0x98, 0x43, 0x7b, 0xbf, 0xaa, 0xa6, 0x3a, 0xbf, 0x4b, 0xd3, 0x87, 0x3e, 0x58, 0xc9, + 0x7f, 0xbf, 0x7e, 0x24, 0x2e, 0xbf, 0x0b, 0x3a, 0x64, 0x3e, 0x72, 0xa1, 0x6f, 0xbf, 0x91, 0x7f, 0x38, 0xbf, 0x17, 0x71, 0x80, 0x3e, 0xf3, 0x9a, 0x86, 0xbf, + 0x0c, 0xcc, 0x2e, 0xbf, 0x45, 0x5b, 0x8e, 0x3e, 0x87, 0x5e, 0x82, 0xbf, 0x9b, 0x63, 0x2a, 0xbf, 0x27, 0xce, 0xa3, 0x3e, 0x1a, 0x49, 0x82, 0xbf, 0x16, 0x7a, + 0x27, 0xbf, 0xa9, 0x5e, 0x97, 0x3e, 0xa0, 0x68, 0x87, 0xbf, 0xf9, 0xe8, 0x24, 0xbf, 0xa1, 0x05, 0x8b, 0x3e, 0xab, 0xb2, 0x8c, 0xbf, 0xb0, 0xa7, 0x24, 0xbf, + 0x52, 0x17, 0x96, 0x3e, 0x53, 0x5b, 0x8d, 0xbf, 0x36, 0xf2, 0x19, 0xbf, 0xbd, 0x83, 0x4e, 0x3e, 0xe2, 0x9e, 0x9f, 0xbf, 0x4d, 0xff, 0x20, 0xbf, 0xe6, 0x3f, + 0x49, 0x3e, 0x1a, 0x8b, 0x9b, 0xbf, 0x5d, 0xa9, 0x2c, 0xbf, 0x47, 0xac, 0x48, 0x3e, 0x17, 0xda, 0x9a, 0xbf, 0x64, 0xbf, 0x2d, 0xbf, 0xcf, 0xba, 0x8d, 0x3e, + 0x91, 0x35, 0x76, 0xbf, 0xbc, 0x96, 0x2d, 0xbf, 0xf5, 0x2b, 0xa5, 0x3e, 0x1e, 0xaf, 0x6d, 0xbf, 0xa6, 0x70, 0x32, 0xbf, 0x3f, 0xed, 0x83, 0x3e, 0x9a, 0x74, + 0x6e, 0xbf, 0xd0, 0x0f, 0x32, 0xbf, 0x8b, 0x48, 0x29, 0x3e, 0x12, 0x44, 0x70, 0xbf, 0xa4, 0x68, 0x42, 0xbf, 0x11, 0x05, 0x36, 0x3e, 0x72, 0x9c, 0x64, 0xbf, + 0x1d, 0xde, 0x41, 0xbf, 0x56, 0xbb, 0x28, 0x3e, 0x45, 0xbd, 0x7a, 0xbf, 0x51, 0xcb, 0x43, 0xbf, 0x0c, 0xf3, 0xae, 0x3d, 0xa1, 0x5a, 0x76, 0xbf, 0xf0, 0xc6, + 0x4e, 0xbf, 0x78, 0x73, 0x2f, 0x3e, 0xca, 0x0f, 0x44, 0xbf, 0x11, 0x2d, 0x55, 0xbf, 0x3b, 0xad, 0x2f, 0x3e, 0x5b, 0xa2, 0x48, 0xbf, 0x89, 0x47, 0x4f, 0xbf, + 0xf9, 0xa4, 0x3e, 0x3e, 0xa7, 0x73, 0x41, 0xbf, 0x20, 0x9a, 0x53, 0xbf, 0x47, 0xbe, 0x4f, 0x3e, 0x12, 0x83, 0x4e, 0xbf, 0x21, 0x89, 0x48, 0xbf, 0x43, 0xc7, + 0x41, 0x3e, 0x84, 0xe8, 0x52, 0xbf, 0x32, 0x7a, 0x45, 0xbf, 0xe1, 0xb2, 0x74, 0x3e, 0x2b, 0xb4, 0x66, 0xbf, 0xa8, 0x99, 0x36, 0xbf, 0xa6, 0xd4, 0x39, 0x3e, + 0x74, 0x47, 0x58, 0xbf, 0x7f, 0xc9, 0x43, 0xbf, 0xab, 0x40, 0xa7, 0x3e, 0xf9, 0x5b, 0x8e, 0xbf, 0xae, 0xa9, 0x15, 0xbf, 0x88, 0x5b, 0x43, 0x3d, 0xbd, 0x34, + 0x5d, 0xbf, 0x5b, 0x1d, 0x61, 0xbf, 0xd2, 0xcb, 0xad, 0x3d, 0xda, 0x97, 0x56, 0xbf, 0x9a, 0x43, 0x68, 0xbf, 0x0f, 0x4f, 0x32, 0x3d, 0x50, 0xca, 0x5d, 0xbf, + 0x8f, 0x6e, 0x69, 0xbf, 0x6d, 0xfb, 0x4b, 0x3d, 0x08, 0x75, 0x5d, 0xbf, 0xce, 0x10, 0x6c, 0xbf, 0xc8, 0x2e, 0x6f, 0x3d, 0xe6, 0xc1, 0x5b, 0xbf, 0xf8, 0x93, + 0x6c, 0xbf, 0x63, 0x17, 0x89, 0x3d, 0x3a, 0xa9, 0x59, 0xbf, 0x71, 0xa6, 0x6c, 0xbf, 0x4d, 0x0c, 0x63, 0x3d, 0x62, 0x4d, 0x5a, 0xbf, 0x77, 0x6f, 0x5e, 0xbf, + 0xcc, 0x7e, 0xd0, 0x3d, 0x4b, 0xbc, 0x53, 0xbf, 0x6b, 0x77, 0x62, 0xbf, 0xdc, 0x70, 0xbd, 0x3d, 0x28, 0x2c, 0x58, 0xbf, 0x64, 0xbc, 0x5c, 0xbf, 0xc2, 0x6f, + 0xf0, 0x3d, 0x18, 0x23, 0x53, 0xbf, 0x9a, 0x1c, 0x5e, 0xbf, 0xe7, 0xab, 0xfc, 0x3d, 0xac, 0xba, 0x53, 0xbf, 0x4a, 0xd3, 0x5a, 0xbf, 0xee, 0x0e, 0xf8, 0x3d, + 0xef, 0x01, 0x55, 0xbf, 0x66, 0x60, 0x58, 0xbf, 0x6f, 0x94, 0xdc, 0x3d, 0xf8, 0xda, 0x56, 0xbf, 0x5a, 0x73, 0x59, 0xbf, 0x34, 0x3f, 0x02, 0x3e, 0x67, 0xaf, + 0x65, 0xbf, 0x77, 0xec, 0x50, 0xbf, 0x81, 0xbd, 0xce, 0x3d, 0x6d, 0x80, 0x68, 0xbf, 0xd6, 0xb1, 0x55, 0xbf, 0xab, 0xb5, 0x06, 0x3e, 0xb4, 0xc9, 0x66, 0xbf, + 0xf8, 0xbb, 0x4e, 0xbf, 0x00, 0x1c, 0x18, 0x3e, 0x3d, 0x90, 0x3f, 0xbf, 0xd7, 0x53, 0x5d, 0xbf, 0xa4, 0xdf, 0xc8, 0x3d, 0x71, 0xb2, 0x3e, 0xbf, 0x7b, 0x2d, + 0x6d, 0xbf, 0x86, 0x6e, 0x0e, 0x3e, 0x55, 0x97, 0x40, 0xbf, 0x61, 0x47, 0x64, 0xbf, 0x27, 0x70, 0xbc, 0x3d, 0xe4, 0x5f, 0x42, 0xbf, 0xf2, 0x9d, 0x6f, 0xbf, + 0xf5, 0x78, 0xc8, 0x3d, 0x50, 0x1e, 0x3d, 0xbf, 0xdb, 0x18, 0x6c, 0xbf, 0xcc, 0x9b, 0xa0, 0x3d, 0xae, 0x7f, 0x39, 0xbf, 0x29, 0x82, 0x73, 0xbf, 0x2d, 0x1c, + 0x44, 0x3e, 0x66, 0x54, 0x4c, 0xbf, 0x55, 0xcc, 0x57, 0xbf, 0x34, 0xff, 0x2d, 0x3e, 0x70, 0x45, 0x49, 0xbf, 0xac, 0xfe, 0x4f, 0xbf, 0x69, 0x17, 0x2c, 0x3e, + 0x9d, 0x9e, 0x44, 0xbf, 0xf0, 0x72, 0x56, 0xbf, 0xc4, 0x7f, 0x14, 0x3e, 0x53, 0xb7, 0x3d, 0xbf, 0xba, 0xbc, 0x5c, 0xbf, 0x21, 0xc4, 0x91, 0x3d, 0x14, 0xe4, + 0x6b, 0xbf, 0xd1, 0x0a, 0x74, 0xbf, 0xc7, 0x26, 0xc1, 0x3d, 0x85, 0x2c, 0x67, 0xbf, 0x4b, 0xb4, 0x73, 0xbf, 0xe9, 0xff, 0x8b, 0x3d, 0x1d, 0xb1, 0x6b, 0xbf, + 0x51, 0xf9, 0x7c, 0xbf, 0xab, 0x25, 0xd1, 0x3d, 0xf8, 0xa5, 0x63, 0xbf, 0x37, 0x68, 0x7a, 0xbf, 0x7f, 0x5a, 0xb0, 0x3d, 0xae, 0xbf, 0x64, 0xbf, 0x20, 0x1c, + 0x80, 0xbf, 0x30, 0x83, 0x10, 0x3d, 0x28, 0x1f, 0x49, 0xbf, 0x52, 0xdc, 0x85, 0xbf, 0xa1, 0xa5, 0x62, 0x3d, 0xab, 0xcf, 0x54, 0xbf, 0x2c, 0xa0, 0x86, 0xbf, + 0x07, 0x0c, 0x8b, 0x3d, 0x80, 0xae, 0x4f, 0xbf, 0x59, 0x82, 0x84, 0xbf, 0xa8, 0x80, 0x9e, 0x3d, 0x74, 0x1d, 0x47, 0xbf, 0x5c, 0xcf, 0x80, 0xbf, 0xcf, 0x5b, + 0x29, 0x3e, 0xba, 0x9c, 0x62, 0xbf, 0x4b, 0x30, 0x46, 0xbf, 0x69, 0x17, 0x2c, 0x3e, 0x8b, 0x7a, 0x45, 0xbf, 0xc4, 0x90, 0x5e, 0xbf, 0xeb, 0x93, 0x41, 0x3e, + 0x24, 0xca, 0x4d, 0xbf, 0x41, 0x8a, 0x5d, 0xbf, 0x57, 0xf2, 0xd0, 0x3d, 0x80, 0x91, 0x47, 0xbf, 0x97, 0x18, 0x77, 0xbf, 0xa8, 0x8b, 0xad, 0x3d, 0x12, 0xe5, + 0x3e, 0xbf, 0x73, 0x6b, 0x79, 0xbf, 0x1c, 0x9c, 0x55, 0x3d, 0xa1, 0x70, 0x37, 0xbf, 0x56, 0xa4, 0x7b, 0xbf, 0x1d, 0xf7, 0xe8, 0x3d, 0xa0, 0x57, 0x47, 0xbf, + 0x73, 0x4d, 0x73, 0xbf, 0x4a, 0x09, 0x79, 0x3e, 0x2b, 0x30, 0x23, 0xbf, 0x40, 0x2b, 0x51, 0xbf, 0x2d, 0x27, 0x53, 0x3e, 0xe5, 0xcc, 0x34, 0xbf, 0x0a, 0x1d, + 0x54, 0xbf, 0x51, 0xe3, 0x70, 0x3e, 0xe8, 0x90, 0x36, 0xbf, 0x05, 0x6c, 0x4f, 0xbf, 0x52, 0x0e, 0x19, 0x3f, 0xae, 0x56, 0x05, 0xbe, 0xdf, 0xeb, 0x48, 0xbf, + 0x8a, 0xcd, 0x15, 0x3f, 0x22, 0x14, 0x4c, 0xbe, 0x75, 0xe2, 0x4f, 0xbf, 0x0e, 0x75, 0x24, 0x3f, 0x62, 0x97, 0x3c, 0xbe, 0xa2, 0x4f, 0x30, 0xbf, 0xd6, 0x6a, + 0x21, 0x3f, 0xe8, 0x75, 0x83, 0xbe, 0xe9, 0xa5, 0x37, 0xbf, 0x44, 0x2f, 0xde, 0x3d, 0xf5, 0xbc, 0xaa, 0xbe, 0x80, 0x41, 0x6c, 0xbf, 0xa1, 0xf8, 0x24, 0x3e, + 0x1a, 0xbe, 0xa6, 0xbe, 0x58, 0x3a, 0x58, 0xbf, 0x62, 0xb0, 0x19, 0x3e, 0xce, 0x34, 0xa1, 0xbe, 0x7e, 0xd1, 0x6e, 0xbf, 0x0f, 0x2c, 0xde, 0x3e, 0xc6, 0xf5, + 0x9b, 0xbe, 0xb0, 0x13, 0x60, 0xbf, 0x09, 0x6a, 0xfe, 0x3e, 0xdd, 0x1f, 0x9c, 0xbe, 0x27, 0xfb, 0x57, 0xbf, 0xd6, 0xb1, 0xe1, 0x3e, 0xba, 0x4e, 0x96, 0xbe, + 0xb1, 0x21, 0x63, 0xbf, 0x49, 0xad, 0x0c, 0x3e, 0xd0, 0x42, 0xd3, 0xbd, 0xf6, 0xbe, 0x83, 0xbf, 0xbd, 0xb3, 0x75, 0x3d, 0x58, 0xa2, 0xe5, 0xbd, 0x6c, 0x4c, + 0x84, 0xbf, 0x42, 0x60, 0x0c, 0x3e, 0x8c, 0x38, 0x44, 0xbe, 0x3e, 0xdf, 0x81, 0xbf, 0xf8, 0xbd, 0xbd, 0x3d, 0x0a, 0xcc, 0x66, 0xbe, 0xc4, 0xf2, 0x81, 0xbf, + 0x5d, 0x6a, 0x57, 0x3d, 0xb2, 0x2f, 0x56, 0xbe, 0x67, 0xde, 0x82, 0xbf, 0xd0, 0xa4, 0x35, 0x3e, 0x18, 0xa1, 0xd7, 0xbe, 0x6f, 0x05, 0x47, 0xbf, 0x9f, 0x7a, + 0x53, 0x3e, 0xdc, 0xcd, 0xd7, 0xbe, 0x47, 0x3d, 0x4a, 0xbf, 0xb0, 0xe1, 0x42, 0x3e, 0xb7, 0x65, 0xcc, 0xbe, 0x64, 0xcf, 0x49, 0xbf, 0x1b, 0xf5, 0x6e, 0x3e, + 0x09, 0x13, 0xf2, 0xbe, 0x0f, 0x04, 0x47, 0xbf, 0xb0, 0x4d, 0x76, 0x3e, 0xf9, 0x08, 0xe8, 0xbe, 0xbc, 0x88, 0x4a, 0xbf, 0xb9, 0xa2, 0x02, 0x3f, 0x0c, 0x25, + 0xec, 0xbe, 0xc0, 0x61, 0x3b, 0xbf, 0x2b, 0x5d, 0x0a, 0x3f, 0x2c, 0x83, 0xde, 0xbe, 0xec, 0x3c, 0x36, 0xbf, 0x26, 0xda, 0x01, 0x3f, 0x16, 0xd0, 0xe8, 0xbe, + 0xc1, 0x47, 0x3c, 0xbf, 0x93, 0x88, 0x20, 0x3e, 0x2a, 0x1f, 0xcc, 0xbe, 0x52, 0x1a, 0x4a, 0xbf, 0xb1, 0x1f, 0x1d, 0x3e, 0x27, 0x5b, 0xbd, 0xbe, 0x6a, 0x2a, + 0x4a, 0xbf, 0x55, 0x0b, 0x2d, 0x3e, 0x24, 0x10, 0xc5, 0xbe, 0xb7, 0xff, 0x49, 0xbf, 0xc8, 0xbf, 0x0b, 0x3e, 0x80, 0xdd, 0xcf, 0xbe, 0x3b, 0xc9, 0x4c, 0xbf, + 0xb0, 0x96, 0x3c, 0x3e, 0x49, 0xc5, 0xb3, 0xbe, 0x38, 0x66, 0x4c, 0xbf, 0xd7, 0xc7, 0x39, 0x3e, 0xf0, 0xae, 0xaf, 0xbe, 0x9a, 0x69, 0x4b, 0xbf, 0xbf, 0xaa, + 0x02, 0x3f, 0x14, 0xe7, 0xbd, 0xbe, 0xe6, 0xe2, 0x3c, 0xbf, 0xaa, 0xc1, 0x07, 0x3f, 0x6c, 0x70, 0xc4, 0xbe, 0x9f, 0xd8, 0x3a, 0xbf, 0x1c, 0x70, 0x03, 0x3f, + 0x46, 0x17, 0xb9, 0xbe, 0x29, 0x28, 0x3c, 0xbf, 0x63, 0x13, 0xfe, 0x3e, 0x46, 0xbd, 0xca, 0xbe, 0x14, 0xb8, 0x3d, 0xbf, 0x29, 0x3b, 0x03, 0x3f, 0x68, 0xac, + 0xc7, 0xbe, 0x6d, 0x67, 0x3c, 0xbf, 0xd0, 0x1c, 0x01, 0x3f, 0x21, 0xfd, 0xc4, 0xbe, 0x10, 0xf4, 0x3d, 0xbf, 0x7c, 0x51, 0x05, 0x3f, 0x1c, 0xda, 0xd4, 0xbe, + 0x89, 0x44, 0x3a, 0xbf, 0x59, 0x2d, 0x91, 0x3e, 0x96, 0x5b, 0xa2, 0xbe, 0xda, 0xfb, 0x59, 0xbf, 0xcc, 0xc1, 0xa8, 0x3e, 0xfa, 0x1d, 0xa1, 0xbe, 0x8c, 0x6b, + 0x5e, 0xbf, 0xcc, 0xf6, 0x90, 0x3e, 0x0e, 0x50, 0x9d, 0xbe, 0x93, 0x7f, 0x5e, 0xbf, 0x8c, 0xa5, 0x36, 0x3e, 0xa8, 0xff, 0xae, 0xbe, 0xa4, 0x1d, 0x4e, 0xbf, + 0x57, 0xf0, 0x05, 0x3f, 0xe4, 0x72, 0xb7, 0xbe, 0xf1, 0xe3, 0x3c, 0xbf, 0x80, 0x73, 0xaf, 0x3d, 0x69, 0x25, 0xb9, 0xbe, 0xcd, 0xea, 0x65, 0xbf, 0xaa, 0x5f, + 0xfd, 0x3d, 0xf9, 0x55, 0xc2, 0xbe, 0x98, 0x0e, 0x57, 0xbf, 0xd5, 0xe4, 0x09, 0x3e, 0xd2, 0x39, 0xb8, 0xbe, 0xc7, 0xd0, 0x56, 0xbf, 0xfb, 0x99, 0xd2, 0x3d, + 0x37, 0x89, 0xdf, 0xbe, 0xd3, 0x74, 0x5b, 0xbf, 0xfb, 0xba, 0xff, 0x3d, 0x3d, 0xd1, 0xea, 0xbe, 0x2c, 0x29, 0x57, 0xbf, 0x90, 0x86, 0x03, 0x3e, 0xa0, 0xef, + 0xe2, 0xbe, 0x16, 0x21, 0x54, 0xbf, 0x7f, 0x14, 0x28, 0x3e, 0x52, 0xc5, 0xe7, 0xbe, 0xbe, 0xc8, 0x49, 0xbf, 0x94, 0xd7, 0x0f, 0x3f, 0xb2, 0x56, 0xbd, 0xbe, + 0x10, 0xd0, 0x37, 0xbf, 0xc2, 0x2c, 0x0e, 0x3f, 0xb8, 0x2a, 0xcd, 0xbe, 0x5d, 0x49, 0x35, 0xbf, 0x36, 0xe9, 0x0f, 0x3f, 0xa6, 0x7b, 0x59, 0xbf, 0x4e, 0x90, + 0x14, 0x3f, 0x91, 0xc3, 0x0e, 0x3f, 0xce, 0x06, 0x53, 0xbf, 0x6f, 0xab, 0x1d, 0x3f, 0x6e, 0x22, 0x18, 0x3f, 0xd4, 0x37, 0x2e, 0xbf, 0x8d, 0xee, 0x0c, 0x3f, + 0x7a, 0x6c, 0x94, 0x3e, 0xf0, 0x26, 0xa7, 0xbf, 0x34, 0x67, 0xd6, 0x3d, 0x57, 0x46, 0xa6, 0x3e, 0xd7, 0xae, 0xa2, 0xbf, 0x46, 0x6c, 0x09, 0x3e, 0x45, 0x93, + 0xb3, 0x3e, 0xd6, 0x67, 0x9f, 0xbf, 0xb0, 0x07, 0x63, 0x3c, 0x09, 0x32, 0x13, 0x3f, 0x67, 0x52, 0x8a, 0xbe, 0xd7, 0x8b, 0x4a, 0xbf, 0x76, 0xb4, 0x18, 0x3f, + 0xee, 0xb2, 0x99, 0xbe, 0x94, 0xda, 0x3b, 0xbf, 0xed, 0xd3, 0xb8, 0x3e, 0xb0, 0x71, 0x60, 0xbf, 0xa0, 0x52, 0x36, 0xbf, 0x58, 0x6e, 0xcb, 0x3e, 0xdf, 0x3e, + 0x53, 0xbf, 0x02, 0x0f, 0x3a, 0xbf, 0x67, 0x35, 0x9c, 0x3e, 0xd4, 0xfd, 0x4f, 0xbf, 0x1e, 0xc9, 0x45, 0xbf, 0xec, 0x54, 0xea, 0x3e, 0x8e, 0x30, 0x64, 0xbf, + 0xcc, 0x97, 0x24, 0xbf, 0x4d, 0x60, 0xe8, 0x3e, 0x90, 0x1d, 0x54, 0xbf, 0xa7, 0x9c, 0x31, 0xbf, 0xa1, 0x66, 0xd2, 0x3e, 0xfd, 0x17, 0x6e, 0xbf, 0x3e, 0x8a, + 0x27, 0xbf, 0x6d, 0x17, 0x72, 0x3e, 0x17, 0x9d, 0x99, 0xbe, 0x9a, 0xef, 0x6b, 0xbf, 0x30, 0x51, 0x72, 0x3e, 0x46, 0xf2, 0x9b, 0xbe, 0x75, 0x26, 0x5e, 0xbf, + 0x41, 0x8b, 0x1b, 0x3e, 0x7e, 0x6c, 0xc5, 0xbf, 0x52, 0x4d, 0x07, 0xbf, 0xe6, 0x6b, 0x1c, 0x3e, 0x5a, 0x4f, 0xc7, 0xbf, 0xb3, 0xf8, 0xfc, 0xbe, 0x67, 0x68, + 0x43, 0x3e, 0x6f, 0x2f, 0xc5, 0xbf, 0xca, 0x5f, 0x01, 0xbf, 0x4f, 0xce, 0x21, 0x3f, 0x9c, 0xd5, 0xd0, 0xbe, 0xcd, 0xaf, 0x25, 0xbf, 0x4a, 0xb6, 0x2c, 0x3f, + 0x86, 0xcd, 0xe7, 0xbe, 0x26, 0x58, 0x10, 0xbf, 0x4c, 0xe7, 0x2b, 0x3f, 0xe3, 0xea, 0xc0, 0xbe, 0xc5, 0xcf, 0x14, 0xbf, 0x02, 0x47, 0x34, 0x3f, 0x6f, 0x5a, + 0x02, 0xbf, 0x15, 0x30, 0xfd, 0xbe, 0x07, 0x63, 0x35, 0x3f, 0xfe, 0xef, 0xd9, 0xbe, 0x46, 0x9a, 0xf0, 0xbe, 0x8a, 0x8f, 0x3b, 0x3f, 0xb8, 0xbb, 0xf4, 0xbe, + 0xcf, 0xa0, 0xbf, 0xbe, 0x46, 0x60, 0x3a, 0x3f, 0xc5, 0x53, 0xc3, 0xbe, 0x97, 0xa6, 0xc0, 0xbe, 0x76, 0xfb, 0x35, 0x3f, 0x3b, 0x9a, 0x14, 0xbf, 0x2d, 0xe8, + 0xd0, 0xbe, 0xd9, 0xe9, 0xe3, 0x3e, 0xb8, 0xda, 0x29, 0xbf, 0x54, 0xf3, 0x3e, 0xbf, 0xed, 0xe7, 0xdc, 0x3e, 0xc5, 0x1e, 0x1a, 0xbf, 0xe5, 0xd9, 0x43, 0xbf, + 0x72, 0x0f, 0xda, 0x3e, 0xea, 0xb3, 0x29, 0xbf, 0xb0, 0x79, 0x41, 0xbf, 0x05, 0x25, 0x1c, 0x3d, 0x92, 0x0b, 0xc7, 0xbf, 0x40, 0x4f, 0xce, 0xbe, 0x5d, 0x6e, + 0x17, 0x3d, 0xd8, 0x92, 0xc2, 0xbf, 0x8a, 0xda, 0x92, 0xbe, 0x0c, 0xc8, 0x85, 0x3d, 0x1e, 0x52, 0xc6, 0xbf, 0x61, 0xe6, 0xcb, 0xbe, 0x77, 0xc9, 0xe7, 0x3e, + 0xfb, 0x01, 0x6d, 0xbf, 0xc6, 0xb4, 0x1e, 0xbf, 0xac, 0xac, 0xda, 0x3e, 0xf7, 0x30, 0x76, 0xbf, 0x2c, 0xe8, 0x20, 0xbf, 0x38, 0xa2, 0xe6, 0x3e, 0x2c, 0xbe, + 0x72, 0xbf, 0x7f, 0xea, 0x1b, 0xbf, 0x1c, 0x92, 0x2d, 0x3f, 0xda, 0xcd, 0x2b, 0xbf, 0x2c, 0xf3, 0xe0, 0xbd, 0x42, 0x9e, 0x37, 0x3f, 0x2f, 0x79, 0x0c, 0xbf, + 0x0d, 0x31, 0x1d, 0xbe, 0x28, 0xa8, 0x33, 0x3f, 0x72, 0x65, 0x16, 0xbf, 0x8b, 0x7a, 0x59, 0xbe, 0xc3, 0x24, 0x3c, 0x3f, 0x5a, 0xf0, 0xd8, 0xbe, 0xce, 0x4e, + 0x32, 0xbe, 0xce, 0x79, 0x3c, 0x3f, 0x71, 0x46, 0xe7, 0xbe, 0x7d, 0x42, 0x8c, 0xbe, 0xca, 0xcc, 0x37, 0x3f, 0x2a, 0x5a, 0x0b, 0xbf, 0xe8, 0x6d, 0x8d, 0xbe, + 0x9e, 0xfd, 0x2d, 0x3f, 0xd2, 0x72, 0x2a, 0xbf, 0x77, 0x7c, 0xa1, 0xbe, 0xe4, 0x13, 0x25, 0x3f, 0x5c, 0x73, 0x71, 0xbf, 0xdc, 0x76, 0x54, 0xbd, 0x91, 0x8d, + 0x29, 0x3f, 0x41, 0xa1, 0x4e, 0xbf, 0x28, 0xde, 0x9d, 0xbd, 0x65, 0x09, 0x26, 0x3f, 0x4e, 0xfb, 0x59, 0xbf, 0xfe, 0x24, 0x28, 0xbe, 0x7b, 0x4d, 0x1c, 0x3f, + 0x08, 0x22, 0x67, 0xbf, 0x1c, 0x95, 0x84, 0xbe, 0x89, 0x49, 0x1b, 0x3f, 0x25, 0x83, 0x6d, 0xbf, 0xbd, 0xa1, 0x74, 0xbe, 0xff, 0x19, 0x1e, 0x3f, 0xf7, 0x77, + 0x84, 0xbf, 0x54, 0x4e, 0xa4, 0xbd, 0x1a, 0x27, 0x1a, 0x3f, 0xf8, 0xe9, 0x82, 0xbf, 0xb2, 0xc5, 0x25, 0xbe, 0x9a, 0x46, 0x17, 0x3f, 0x06, 0xc2, 0x8b, 0xbf, + 0xfa, 0x98, 0xc5, 0xbd, 0xa1, 0x24, 0x3e, 0x3f, 0xf5, 0x52, 0xc6, 0xbe, 0x56, 0x9b, 0x71, 0xbd, 0x9b, 0x37, 0x42, 0x3f, 0x5c, 0x20, 0xb9, 0xbe, 0x00, 0x47, + 0x6b, 0xb9, 0x57, 0xf3, 0x42, 0x3f, 0x20, 0x33, 0xa3, 0xbe, 0x68, 0x2c, 0xbe, 0xbb, 0xac, 0xce, 0x33, 0x3f, 0xc3, 0xc3, 0x19, 0xbf, 0xf0, 0x59, 0xc7, 0xba, + 0x85, 0x82, 0x32, 0x3f, 0xf4, 0x65, 0x27, 0xbf, 0x30, 0x66, 0x4b, 0x3c, 0x58, 0x38, 0x20, 0x3f, 0x2d, 0xdb, 0x75, 0xbf, 0x22, 0x5e, 0x24, 0x3d, 0x42, 0xd9, + 0x25, 0x3f, 0xad, 0xe0, 0x63, 0xbf, 0x14, 0x6b, 0x75, 0x3d, 0xf4, 0x89, 0x45, 0x3e, 0x9b, 0x5f, 0xc6, 0xbf, 0x71, 0x5b, 0xed, 0xbe, 0xb1, 0xeb, 0x6a, 0x3e, + 0x02, 0xa6, 0xc3, 0xbf, 0xc4, 0x8c, 0xf3, 0xbe, 0xf7, 0x6c, 0x3c, 0x3f, 0x6e, 0x8f, 0xcf, 0xbe, 0x3e, 0x92, 0xa9, 0x3e, 0x4d, 0xc9, 0x3b, 0x3f, 0x8f, 0xbb, + 0xee, 0xbe, 0xd0, 0xd9, 0x95, 0x3e, 0x2d, 0x55, 0x38, 0x3f, 0x23, 0x14, 0xde, 0xbe, 0x10, 0x67, 0xc0, 0x3e, 0xd7, 0x67, 0x12, 0x3f, 0x98, 0x49, 0x60, 0xbf, + 0xe8, 0x69, 0x13, 0x3e, 0xa9, 0xc2, 0x04, 0x3f, 0x29, 0x52, 0x75, 0xbf, 0x8c, 0xb7, 0xff, 0x3d, 0x91, 0xb8, 0xf3, 0x3e, 0xf2, 0x65, 0x8a, 0xbf, 0xa4, 0x6d, + 0x60, 0x3e, 0xc6, 0xfb, 0x3c, 0x3f, 0x54, 0x6f, 0x95, 0xbe, 0xce, 0x34, 0xb7, 0x3e, 0x6b, 0xdc, 0x3d, 0x3f, 0x96, 0xd7, 0x56, 0xbe, 0x2d, 0x47, 0xb1, 0x3e, + 0xec, 0xcc, 0x35, 0x3f, 0x3a, 0xd3, 0x72, 0xbe, 0xa7, 0x37, 0xee, 0x3e, 0xca, 0xf7, 0x69, 0x3e, 0x38, 0x54, 0xb3, 0xbf, 0x54, 0xf8, 0xa1, 0xbd, 0x60, 0x9f, + 0x8f, 0x3e, 0x83, 0x0e, 0xb2, 0xbf, 0xb0, 0x69, 0xcd, 0xbd, 0x17, 0x33, 0x83, 0x3e, 0x8a, 0xbd, 0xb9, 0xbf, 0xd4, 0xe7, 0x43, 0xbe, 0xca, 0x42, 0x70, 0x3e, + 0x45, 0x18, 0xad, 0xbf, 0xfc, 0xfb, 0x2f, 0x3d, 0xf3, 0x5f, 0x49, 0x3e, 0x46, 0x45, 0xaf, 0xbf, 0x20, 0xd9, 0xe6, 0x3c, 0xd8, 0x4b, 0x9c, 0x3e, 0x01, 0x24, + 0xbd, 0xbf, 0xd4, 0x50, 0x99, 0xbe, 0x46, 0x7b, 0x77, 0x3e, 0x1c, 0xac, 0xc2, 0xbf, 0x4f, 0x17, 0xc4, 0xbe, 0x93, 0x28, 0x78, 0x3e, 0x7e, 0x0a, 0xbf, 0xbf, + 0x95, 0x16, 0x8f, 0xbe, 0x5a, 0x97, 0x1a, 0x3e, 0xd6, 0x66, 0xc7, 0xbf, 0x45, 0x34, 0xea, 0xbe, 0x2e, 0x70, 0x99, 0x3d, 0x55, 0x35, 0xb4, 0xbe, 0x7f, 0x83, + 0x28, 0xbf, 0x3a, 0xd7, 0xce, 0x3d, 0x0a, 0x66, 0xc9, 0xbe, 0x1e, 0xc4, 0x24, 0xbf, 0x5f, 0xf2, 0xd0, 0x3d, 0x7a, 0x43, 0x9c, 0xbe, 0x7a, 0x8e, 0x2c, 0xbf, + 0x55, 0x42, 0x32, 0x3e, 0x9f, 0x11, 0xd8, 0xbe, 0x89, 0x05, 0x22, 0xbf, 0x4b, 0x7c, 0x3b, 0x3e, 0xab, 0xfb, 0x80, 0xbe, 0xa0, 0x47, 0x31, 0xbf, 0x32, 0x9b, + 0x92, 0x3e, 0xb6, 0x40, 0xe6, 0xbe, 0x4e, 0xff, 0x1f, 0xbf, 0xf3, 0x14, 0xd0, 0x3e, 0xac, 0x9a, 0xea, 0xbe, 0xfe, 0x18, 0x21, 0xbf, 0x25, 0xff, 0x97, 0x3e, + 0x66, 0x00, 0x5c, 0xbe, 0x66, 0xa7, 0x34, 0xbf, 0x52, 0xe9, 0x02, 0x3f, 0xb3, 0x91, 0xe4, 0xbe, 0xea, 0xdd, 0x23, 0xbf, 0x35, 0xb7, 0x13, 0x3f, 0x04, 0x48, + 0xd5, 0xbe, 0x91, 0xd4, 0x26, 0xbf, 0x55, 0xe5, 0x19, 0x3f, 0xdf, 0x36, 0xc1, 0xbe, 0xff, 0x48, 0x2a, 0xbf, 0x06, 0xa7, 0x15, 0x3f, 0xfc, 0x36, 0xa2, 0xbe, + 0x91, 0x9d, 0x2f, 0xbf, 0x8b, 0x08, 0x04, 0x3f, 0x18, 0xd8, 0x7f, 0xbe, 0x36, 0x8d, 0x34, 0xbf, 0xa5, 0xf0, 0xd2, 0x3e, 0xb8, 0xfd, 0x57, 0xbe, 0xcc, 0x17, + 0x36, 0xbf, 0x71, 0xd7, 0x91, 0x3e, 0x74, 0xc8, 0xb7, 0xbe, 0xf3, 0x4e, 0x56, 0xbf, 0x92, 0x7b, 0x97, 0x3e, 0xdc, 0x7d, 0x5b, 0xbe, 0xe7, 0x92, 0x36, 0xbf, + 0x09, 0x9e, 0xa3, 0x3e, 0xb2, 0xfa, 0xb5, 0xbe, 0xf7, 0xb6, 0x59, 0xbf, 0xff, 0x1f, 0x47, 0x3f, 0x9c, 0xa6, 0x82, 0xbd, 0xe0, 0xde, 0xc0, 0xbb, 0xf2, 0x84, + 0x49, 0x3f, 0xb8, 0xa8, 0xf1, 0xbd, 0xd2, 0x89, 0x0d, 0x3d, 0x64, 0x1d, 0x4a, 0x3f, 0x38, 0x6c, 0x9d, 0xbd, 0x52, 0x37, 0x58, 0x3d, 0x53, 0x31, 0x40, 0x3f, + 0xf8, 0x54, 0xb1, 0xbe, 0xf5, 0x8b, 0x91, 0x3e, 0x39, 0x6b, 0x3e, 0x3f, 0xe0, 0x2b, 0xcc, 0xbe, 0x62, 0x0e, 0x83, 0x3e, 0x82, 0x42, 0x3b, 0x3f, 0x2c, 0x4a, + 0x03, 0xbf, 0xa8, 0x77, 0x49, 0x3e, 0xd2, 0xf0, 0x38, 0x3f, 0x5c, 0xaa, 0x0f, 0xbf, 0xec, 0x61, 0x3b, 0x3e, 0x7b, 0x03, 0x36, 0x3f, 0x01, 0xb7, 0x10, 0xbf, + 0x02, 0x3c, 0x5a, 0x3e, 0x54, 0x52, 0x4a, 0x3f, 0x80, 0x3f, 0xa9, 0xbd, 0x96, 0x8a, 0x5c, 0x3d, 0x3d, 0x5c, 0x46, 0x3f, 0x6c, 0x25, 0x84, 0xbe, 0x88, 0x1b, + 0x0d, 0x3d, 0x63, 0x63, 0x47, 0x3f, 0x9e, 0xce, 0x5e, 0xbe, 0x22, 0xa8, 0x51, 0x3d, 0xed, 0xc2, 0x46, 0x3f, 0x2e, 0x4a, 0x58, 0xbe, 0xee, 0x25, 0x1e, 0x3d, + 0x6f, 0xde, 0x5a, 0x3f, 0x32, 0x2b, 0x43, 0xbe, 0x1a, 0x45, 0x75, 0x3e, 0x47, 0x5c, 0x51, 0x3f, 0xc4, 0x6c, 0x5c, 0xbe, 0x1f, 0xef, 0x82, 0x3e, 0xd5, 0x0d, + 0x5a, 0x3f, 0xae, 0xd3, 0x50, 0xbe, 0x66, 0x73, 0x84, 0x3e, 0xd2, 0xcb, 0x45, 0x3f, 0x30, 0x54, 0x8a, 0xbe, 0x4c, 0xd3, 0xdc, 0x3d, 0x5f, 0xa7, 0x4a, 0x3f, + 0x66, 0x56, 0x7f, 0xbe, 0x68, 0x0f, 0xd8, 0x3d, 0x26, 0x42, 0x4c, 0x3f, 0xe8, 0x56, 0x8b, 0xbe, 0x2a, 0x31, 0xa3, 0x3d, 0xef, 0x42, 0x58, 0x3f, 0xb0, 0x41, + 0x97, 0xbd, 0x08, 0xc2, 0x5a, 0x3d, 0x9f, 0x8e, 0x54, 0x3f, 0xe0, 0xd9, 0xb6, 0xbd, 0x36, 0x9c, 0xd0, 0x3d, 0x51, 0x85, 0x5b, 0x3f, 0x04, 0x32, 0x99, 0xbd, + 0x1d, 0xc3, 0xbe, 0x3d, 0x3d, 0x62, 0x4c, 0x3f, 0x34, 0xad, 0xd3, 0xbe, 0xdd, 0xe3, 0xf3, 0x3d, 0x7f, 0x60, 0x4e, 0x3f, 0x5c, 0xc7, 0xd6, 0xbe, 0xc6, 0xb9, + 0x04, 0x3e, 0xd6, 0x78, 0x4a, 0x3f, 0x6f, 0x54, 0xd2, 0xbe, 0x98, 0x9a, 0xfe, 0x3d, 0x78, 0x53, 0x45, 0x3f, 0xd6, 0x36, 0xc0, 0xbe, 0xeb, 0x06, 0x45, 0x3e, + 0x6d, 0x79, 0x4d, 0x3f, 0x78, 0x33, 0xcb, 0xbe, 0x1a, 0x9e, 0x1b, 0x3e, 0x90, 0x63, 0x50, 0x3f, 0x58, 0x66, 0xc6, 0xbe, 0x7d, 0x18, 0x22, 0x3e, 0x4b, 0x78, + 0x52, 0x3f, 0x34, 0xbf, 0x51, 0xbe, 0xf8, 0xca, 0x15, 0x3e, 0xf0, 0xb9, 0x54, 0x3f, 0x8c, 0x9b, 0x5e, 0xbe, 0xa2, 0x4d, 0xf8, 0x3d, 0x08, 0xf0, 0x4f, 0x3f, + 0x1c, 0x59, 0x60, 0xbe, 0xec, 0x3c, 0x2f, 0x3e, 0xaf, 0x1c, 0x54, 0x3f, 0x8a, 0xb5, 0x5b, 0xbe, 0xf5, 0xd1, 0xc3, 0x3d, 0x39, 0x85, 0x45, 0x3f, 0xda, 0xab, + 0x92, 0xbe, 0x16, 0x41, 0xd9, 0x3d, 0xb9, 0x8f, 0x44, 0x3f, 0x3c, 0x53, 0xa4, 0xbe, 0x36, 0x80, 0xef, 0x3d, 0xe6, 0xb4, 0x40, 0x3f, 0xe4, 0x17, 0x96, 0xbe, + 0x8e, 0xcd, 0x07, 0x3e, 0x40, 0x49, 0x42, 0x3f, 0x6e, 0xc0, 0xba, 0xbe, 0x09, 0x42, 0x47, 0x3e, 0x45, 0x6c, 0x46, 0x3f, 0x88, 0xb0, 0xcc, 0xbe, 0x39, 0xaa, + 0x11, 0x3e, 0xb3, 0x03, 0x4a, 0x3f, 0x0a, 0x10, 0xce, 0xbe, 0x57, 0xdc, 0x17, 0x3e, 0xdf, 0x72, 0x4f, 0x3f, 0x26, 0xce, 0xe1, 0xbe, 0x9d, 0x71, 0x04, 0x3e, + 0xd1, 0x46, 0x4e, 0x3f, 0x21, 0x07, 0xda, 0xbe, 0xef, 0x03, 0xe2, 0x3d, 0x5f, 0x1c, 0x4d, 0x3f, 0x2e, 0x0e, 0x01, 0xbf, 0xfc, 0x2b, 0x11, 0x3e, 0x34, 0x63, + 0x3e, 0x3f, 0xe3, 0x5e, 0x0a, 0xbf, 0x33, 0xfe, 0x00, 0x3e, 0x9f, 0x99, 0x40, 0x3f, 0x21, 0x16, 0x0a, 0xbf, 0x9e, 0xe6, 0x01, 0x3e, 0x71, 0x2f, 0x44, 0x3f, + 0x23, 0x21, 0xde, 0xbe, 0x3d, 0x6b, 0x9d, 0x3d, 0xd9, 0xae, 0x52, 0x3f, 0x14, 0xa6, 0x9c, 0xbe, 0x2c, 0x12, 0xce, 0x3d, 0x1c, 0xc3, 0x4f, 0x3f, 0xe8, 0xd6, + 0x9d, 0xbe, 0xed, 0xe5, 0x9b, 0x3d, 0x51, 0x47, 0x5e, 0x3f, 0x5c, 0x0f, 0xce, 0xbe, 0xeb, 0x33, 0xb2, 0x3e, 0x0f, 0x5e, 0x5a, 0x3f, 0x90, 0xa3, 0xe4, 0xbe, + 0xc2, 0x2e, 0x9f, 0x3e, 0xe7, 0x40, 0x5e, 0x3f, 0x16, 0x58, 0xd1, 0xbe, 0x06, 0x73, 0xb6, 0x3e, 0xe0, 0xdc, 0x42, 0x3f, 0xfe, 0x60, 0x01, 0xbf, 0x16, 0xf3, + 0x4e, 0x3e, 0x33, 0x4e, 0x40, 0x3f, 0xbd, 0xb8, 0x07, 0xbf, 0x64, 0x36, 0x62, 0x3e, 0xc2, 0xdf, 0x3b, 0x3f, 0xff, 0x62, 0x0d, 0xbf, 0x8e, 0x56, 0x2c, 0x3e, + 0xd5, 0x12, 0x40, 0x3f, 0x03, 0xa6, 0x01, 0xbf, 0xa6, 0x1e, 0x46, 0x3e, 0x70, 0x5a, 0x3d, 0x3f, 0x98, 0xc1, 0x01, 0xbf, 0x60, 0x2c, 0x44, 0x3e, 0x5b, 0x0a, + 0x3b, 0x3f, 0x9f, 0x32, 0x0c, 0xbf, 0xdc, 0x29, 0x3e, 0x3e, 0xc2, 0x24, 0x3c, 0x3f, 0x2d, 0x2e, 0x02, 0xbf, 0x38, 0x18, 0x44, 0x3e, 0xff, 0xaa, 0x44, 0x3f, + 0x50, 0xd6, 0xd4, 0xbe, 0xb2, 0x62, 0x8d, 0x3d, 0xb3, 0xc3, 0x52, 0x3f, 0xac, 0xd2, 0x28, 0xbe, 0x24, 0x21, 0xf9, 0x3d, 0xa3, 0x3b, 0x59, 0x3f, 0x00, 0x09, + 0x2e, 0xbe, 0xee, 0x4e, 0xdb, 0x3d, 0x30, 0x66, 0x4d, 0x3f, 0xfe, 0xd4, 0x0d, 0xbe, 0xce, 0x76, 0x0e, 0x3d, 0x43, 0x99, 0x51, 0x3f, 0x48, 0xdf, 0xbb, 0xbd, + 0x40, 0xa1, 0xa0, 0x3c, 0x71, 0x1f, 0x4f, 0x3f, 0xb8, 0x8b, 0xaf, 0xbd, 0x30, 0x05, 0xf1, 0x3c, 0x39, 0x6b, 0x61, 0x3f, 0x4c, 0x1e, 0x0f, 0xbe, 0x11, 0x4a, + 0x43, 0x3e, 0xd3, 0x42, 0x65, 0x3f, 0x60, 0x07, 0xe6, 0xbd, 0xc1, 0x85, 0x50, 0x3e, 0xf8, 0xb8, 0x62, 0x3f, 0x90, 0x9f, 0xbc, 0xbd, 0x02, 0x1a, 0x3b, 0x3e, + 0x49, 0xed, 0x54, 0x3f, 0x44, 0xb0, 0x84, 0xbe, 0x27, 0xb4, 0x8e, 0x3e, 0x29, 0x38, 0x5d, 0x3f, 0xd4, 0xb5, 0x4c, 0xbe, 0xfd, 0x1c, 0x84, 0x3e, 0xaa, 0x0f, + 0x4b, 0x3f, 0x98, 0xad, 0xa9, 0xbd, 0x64, 0xf1, 0x4e, 0x3d, 0x0a, 0xc0, 0x4d, 0x3f, 0xc8, 0x1d, 0x24, 0xbd, 0xa2, 0xb3, 0xd8, 0x3d, 0xca, 0x21, 0x50, 0x3f, + 0xc8, 0x80, 0x09, 0xbd, 0x18, 0xa4, 0xb0, 0x3d, 0x0d, 0x51, 0x51, 0x3f, 0xe0, 0xf7, 0xbd, 0xbc, 0x54, 0x1e, 0xdb, 0x3d, 0xc5, 0x7a, 0x51, 0x3f, 0x10, 0x8b, + 0x22, 0xbd, 0xfe, 0xef, 0x21, 0x3e, 0xc7, 0x65, 0x53, 0x3f, 0x40, 0xb8, 0x73, 0xbc, 0xc3, 0x4d, 0x13, 0x3e, 0x9a, 0x71, 0x56, 0x3f, 0xc0, 0x79, 0xc5, 0xbc, + 0x5e, 0xef, 0x3d, 0x3e, 0x56, 0x22, 0x48, 0x3f, 0x70, 0x20, 0x3b, 0xbe, 0xfc, 0x4c, 0x0b, 0x3d, 0xcf, 0x69, 0x47, 0x3f, 0x46, 0x2d, 0x35, 0xbe, 0x64, 0xc1, + 0xde, 0x3c, 0x47, 0xe1, 0x48, 0x3f, 0x38, 0x9c, 0x3d, 0xbe, 0x66, 0x86, 0x1e, 0x3d, 0xc4, 0xca, 0x3d, 0x3f, 0xe4, 0xb5, 0x0a, 0xbf, 0xe3, 0x50, 0xff, 0x3d, + 0xd1, 0xdb, 0x3a, 0x3f, 0xd6, 0x6d, 0x10, 0xbf, 0x8b, 0xb6, 0x1b, 0x3e, 0x6f, 0x4b, 0xba, 0xbe, 0x39, 0x95, 0xfa, 0xbe, 0x79, 0xae, 0x57, 0xbf, 0x4c, 0xf2, + 0xba, 0xbe, 0xcc, 0x14, 0x01, 0xbf, 0x47, 0xad, 0x58, 0xbf, 0x47, 0xd0, 0xd6, 0xbe, 0xea, 0xe9, 0xf4, 0xbe, 0x16, 0xd7, 0x55, 0xbf, 0x5e, 0x65, 0xd9, 0xbe, + 0xdd, 0xb8, 0xfc, 0xbe, 0xc1, 0x0d, 0x56, 0xbf, 0x72, 0xc3, 0xd6, 0xbe, 0x6f, 0xcb, 0xf3, 0xbe, 0x16, 0x32, 0x53, 0xbf, 0x9d, 0x8c, 0xda, 0xbe, 0x39, 0x44, + 0xfc, 0xbe, 0xdd, 0xcf, 0x53, 0xbf, 0x3a, 0xbe, 0xb9, 0xbe, 0x55, 0xfe, 0xf9, 0xbe, 0x06, 0x5d, 0x55, 0xbf, 0x94, 0xc8, 0xba, 0xbe, 0xba, 0xcc, 0x00, 0xbf, + 0x23, 0x74, 0x56, 0xbf, 0xe7, 0x58, 0x6b, 0xbe, 0x5c, 0xb9, 0xdb, 0xbe, 0xf2, 0x4b, 0x4d, 0xbf, 0xf7, 0x3f, 0x6c, 0xbe, 0x5a, 0x2f, 0xdb, 0xbe, 0x5e, 0x3e, + 0x4d, 0xbf, 0x9d, 0x78, 0xfc, 0xbe, 0x4a, 0x56, 0xda, 0xbe, 0x16, 0xae, 0x45, 0xbf, 0x97, 0x40, 0xfa, 0xbe, 0xdf, 0x18, 0xd7, 0xbe, 0x30, 0xfa, 0x43, 0xbf, + 0x0f, 0xe1, 0xfa, 0xbe, 0xe6, 0xc2, 0xd8, 0xbe, 0x26, 0x1f, 0x44, 0xbf, 0xed, 0x50, 0xd3, 0xbe, 0x69, 0x02, 0xeb, 0xbe, 0xc1, 0x64, 0x51, 0xbf, 0x44, 0x23, + 0xd2, 0xbe, 0x14, 0xa2, 0xe8, 0xbe, 0x50, 0x8b, 0x51, 0xbf, 0xf6, 0x49, 0xb8, 0xbe, 0x3c, 0x49, 0xed, 0xbe, 0xf9, 0xde, 0x52, 0xbf, 0xfb, 0x0c, 0xb8, 0xbe, + 0xc2, 0x96, 0xef, 0xbe, 0x86, 0xd8, 0x52, 0xbf, 0x4d, 0x46, 0x90, 0xbe, 0x18, 0x85, 0xe8, 0xbe, 0x44, 0xa1, 0x51, 0xbf, 0x84, 0xaa, 0x91, 0xbe, 0xac, 0xd5, + 0xe6, 0xbe, 0x90, 0x6a, 0x51, 0xbf, 0x0f, 0x95, 0xd4, 0xbe, 0xa6, 0x0e, 0xed, 0xbe, 0x4a, 0x8a, 0x53, 0xbf, 0x70, 0x37, 0xb9, 0xbe, 0x14, 0xd7, 0xf1, 0xbe, + 0x5b, 0x04, 0x55, 0xbf, 0x2e, 0xae, 0xb9, 0xbe, 0xf1, 0x65, 0xf3, 0xbe, 0x67, 0xd0, 0x53, 0xbf, 0x4e, 0x32, 0xd5, 0xbe, 0x8a, 0x74, 0xee, 0xbe, 0x3d, 0x42, + 0x52, 0xbf, 0x24, 0xd7, 0xfe, 0xbe, 0x80, 0x03, 0xbf, 0xbe, 0xf4, 0x63, 0x43, 0xbf, 0xbf, 0x32, 0xfd, 0xbe, 0x16, 0xb0, 0xbf, 0xbe, 0x4e, 0x94, 0x43, 0xbf, + 0xbc, 0xe6, 0xf9, 0xbe, 0x9b, 0x20, 0xbb, 0xbe, 0x9f, 0xe3, 0x45, 0xbf, 0xde, 0x2c, 0xf5, 0xbe, 0xf6, 0x22, 0xbd, 0xbe, 0x44, 0x75, 0x46, 0xbf, 0x47, 0x71, + 0xf2, 0xbe, 0x30, 0xfd, 0xb4, 0xbe, 0x05, 0xe1, 0x4c, 0xbf, 0xe2, 0x57, 0xee, 0xbe, 0x71, 0xce, 0xb7, 0xbe, 0x89, 0x9e, 0x4c, 0xbf, 0x11, 0xed, 0xe3, 0xbe, + 0x5a, 0x79, 0xb5, 0xbe, 0x84, 0x92, 0x55, 0xbf, 0x8a, 0x04, 0xe1, 0xbe, 0xaa, 0x7f, 0xb8, 0xbe, 0x6d, 0xce, 0x54, 0xbf, 0x1c, 0xfc, 0xc3, 0xbe, 0xf2, 0xde, + 0xb3, 0xbe, 0x8a, 0x29, 0x5f, 0xbf, 0x3a, 0xdf, 0xc3, 0xbe, 0xba, 0x9c, 0xb7, 0xbe, 0x52, 0x16, 0x5e, 0xbf, 0x5d, 0x83, 0xa6, 0xbe, 0x05, 0xde, 0xb5, 0xbe, + 0xe8, 0x1d, 0x5f, 0xbf, 0x8a, 0x4d, 0xa7, 0xbe, 0x8d, 0x29, 0xb9, 0xbe, 0x93, 0xdf, 0x5d, 0xbf, 0x35, 0x7d, 0xc5, 0xbe, 0x79, 0xdd, 0xbd, 0xbe, 0x14, 0x29, + 0x61, 0xbf, 0xcb, 0x02, 0xe3, 0xbe, 0xe3, 0x34, 0xbf, 0xbe, 0xbe, 0xc9, 0x57, 0xbf, 0x1e, 0x5e, 0xe5, 0xbe, 0xb6, 0x97, 0xbf, 0xbe, 0x5e, 0x14, 0x58, 0xbf, + 0x4d, 0x9d, 0xc5, 0xbe, 0x55, 0x1a, 0xba, 0xbe, 0xd0, 0x39, 0x62, 0xbf, 0xec, 0x2e, 0x86, 0xbe, 0x9c, 0x80, 0xb8, 0xbe, 0x9c, 0x64, 0x59, 0xbf, 0x02, 0xc4, + 0x88, 0xbe, 0xd9, 0xb6, 0xba, 0xbe, 0x82, 0x5e, 0x58, 0xbf, 0x06, 0xa7, 0x5b, 0xbe, 0xd0, 0x0c, 0xbf, 0xbe, 0x5e, 0xa5, 0x4d, 0xbf, 0x1b, 0x26, 0x63, 0xbe, + 0xbe, 0xe2, 0xbe, 0xbe, 0xfa, 0xc0, 0x4d, 0xbf, 0xe4, 0xe1, 0xa8, 0xbe, 0xf1, 0x24, 0xbf, 0xbe, 0x9c, 0xeb, 0x60, 0xbf, 0xb8, 0x17, 0xa8, 0xbe, 0xc3, 0xdb, + 0xbb, 0xbe, 0xd4, 0x27, 0x62, 0xbf, 0x19, 0x06, 0xf9, 0xbe, 0x55, 0x45, 0xc9, 0xbe, 0x7a, 0xec, 0x56, 0xbf, 0xdd, 0x15, 0xfd, 0xbe, 0x9a, 0x52, 0xc6, 0xbe, + 0xb6, 0x34, 0x57, 0xbf, 0xf8, 0xa1, 0xea, 0xbe, 0x23, 0x46, 0xc5, 0xbe, 0x48, 0x64, 0x63, 0xbf, 0xf5, 0xa0, 0xed, 0xbe, 0x7e, 0xff, 0xc1, 0xbe, 0x16, 0x77, + 0x63, 0xbf, 0xdd, 0x1f, 0xc9, 0xbe, 0xa4, 0xb8, 0xbe, 0xbe, 0x31, 0xcc, 0x6a, 0xbf, 0x3c, 0xa0, 0xc9, 0xbe, 0x3d, 0xfc, 0xba, 0xbe, 0x7c, 0x5c, 0x6b, 0xbf, + 0x57, 0x23, 0xe8, 0xbe, 0x19, 0x00, 0xc2, 0xbe, 0xea, 0x8e, 0x5d, 0xbf, 0x43, 0x04, 0xe5, 0xbe, 0x87, 0x4b, 0xc4, 0xbe, 0x83, 0x8a, 0x5d, 0xbf, 0xad, 0x7e, + 0xc7, 0xbe, 0x82, 0x60, 0xbb, 0xbe, 0x48, 0xe8, 0x68, 0xbf, 0xd9, 0xe7, 0xc6, 0xbe, 0x66, 0x6a, 0xc0, 0xbe, 0x98, 0x45, 0x68, 0xbf, 0xa8, 0x4a, 0x46, 0xbe, + 0x03, 0x57, 0x86, 0xbf, 0x54, 0x05, 0x90, 0xbe, 0xa0, 0x91, 0x35, 0xbe, 0xa1, 0x4b, 0x85, 0xbf, 0xb9, 0x53, 0x98, 0xbe, 0x80, 0x41, 0x05, 0xbe, 0xea, 0x7e, + 0x84, 0xbf, 0x6d, 0x68, 0x9f, 0xbe, 0xa2, 0x9e, 0x7b, 0xbd, 0x70, 0x27, 0x84, 0xbf, 0x36, 0xe9, 0xa5, 0xbe, 0x28, 0x50, 0x78, 0xbc, 0x84, 0xf0, 0x84, 0xbf, + 0x60, 0x41, 0xa7, 0xbe, 0x54, 0x33, 0x7b, 0xb4, 0x84, 0xf0, 0x84, 0xbf, 0x60, 0x41, 0xa7, 0xbe, 0xb0, 0xe0, 0x49, 0xbd, 0xe6, 0x22, 0x92, 0xbf, 0x48, 0x55, + 0x97, 0xbe, 0x6d, 0x26, 0x8c, 0xb4, 0xe6, 0x22, 0x92, 0xbf, 0x48, 0x55, 0x97, 0xbe, 0x26, 0x38, 0x47, 0xbe, 0xa2, 0x4a, 0x8c, 0xbf, 0xf4, 0x7c, 0x83, 0xbe, + 0x21, 0xab, 0x46, 0xbd, 0x1a, 0x82, 0x96, 0xbf, 0xa2, 0x46, 0xec, 0xbe, 0x31, 0xc3, 0xe7, 0xbd, 0xc4, 0xf6, 0x95, 0xbf, 0xc0, 0xff, 0xec, 0xbe, 0x64, 0xaa, + 0x4e, 0xbe, 0x83, 0xa7, 0x90, 0xbf, 0x02, 0x05, 0xb7, 0xbe, 0xa0, 0xcf, 0x83, 0xb4, 0x1a, 0x82, 0x96, 0xbf, 0xa2, 0x46, 0xec, 0xbe, 0x5a, 0xef, 0x17, 0xbd, + 0xe6, 0xcc, 0x97, 0xbf, 0xfc, 0x27, 0x0a, 0xbf, 0x47, 0x56, 0x7e, 0xb4, 0xe6, 0xcc, 0x97, 0xbf, 0xfc, 0x27, 0x0a, 0xbf, 0xbf, 0x83, 0xb3, 0xbc, 0xed, 0x87, + 0x98, 0xbf, 0xbf, 0xd9, 0x15, 0xbf, 0x54, 0xde, 0x78, 0xb4, 0xed, 0x87, 0x98, 0xbf, 0xbf, 0xd9, 0x15, 0xbf, 0x77, 0x21, 0x85, 0xbd, 0xe5, 0xea, 0x97, 0xbf, + 0x0a, 0x41, 0x17, 0xbf, 0x66, 0x3a, 0x95, 0xbc, 0xf9, 0x85, 0x98, 0xbf, 0xbb, 0x8f, 0x19, 0xbf, 0x9f, 0xfe, 0x89, 0xbd, 0xff, 0xff, 0x95, 0xbf, 0x84, 0x27, + 0x1c, 0xbf, 0x67, 0xb0, 0x76, 0xb4, 0xf9, 0x85, 0x98, 0xbf, 0xbb, 0x8f, 0x19, 0xbf, 0x7b, 0xa5, 0x9b, 0xbc, 0x60, 0x16, 0x97, 0xbf, 0x13, 0x28, 0x1e, 0xbf, + 0x44, 0x3d, 0x4e, 0xbe, 0x00, 0x72, 0x8b, 0xbf, 0x10, 0x48, 0xc6, 0xbe, 0x0e, 0x44, 0x3d, 0xbe, 0xb6, 0x2d, 0x8a, 0xbf, 0x7d, 0xf2, 0xd5, 0xbe, 0x8d, 0x28, + 0x4c, 0xbe, 0xe1, 0xcc, 0x8f, 0xbf, 0x4e, 0x72, 0xf3, 0xbe, 0x7e, 0xb6, 0x07, 0xbe, 0xe6, 0x28, 0x89, 0xbf, 0xe2, 0x68, 0xe4, 0xbe, 0x58, 0x1b, 0x3a, 0xbe, + 0xef, 0x39, 0x8f, 0xbf, 0x0e, 0xbb, 0x03, 0xbf, 0xc1, 0x98, 0x73, 0xbd, 0x36, 0x35, 0x89, 0xbf, 0xcd, 0xc0, 0xf0, 0xbe, 0x0a, 0xec, 0x0a, 0xbe, 0x60, 0x88, + 0x8f, 0xbf, 0x30, 0x2c, 0x0e, 0xbf, 0xa8, 0x6f, 0x5d, 0xbc, 0x44, 0x23, 0x8a, 0xbf, 0x72, 0xa9, 0xf3, 0xbe, 0x13, 0xdf, 0x81, 0xbd, 0xc6, 0x2c, 0x90, 0xbf, + 0x1c, 0xda, 0x16, 0xbf, 0x54, 0x8b, 0x6e, 0xb4, 0x44, 0x23, 0x8a, 0xbf, 0x72, 0xa9, 0xf3, 0xbe, 0x88, 0x1a, 0x75, 0xbc, 0x72, 0x1d, 0x91, 0xbf, 0x82, 0x00, + 0x19, 0xbf, 0x27, 0x4f, 0x69, 0xb4, 0x72, 0x1d, 0x91, 0xbf, 0x82, 0x00, 0x19, 0xbf, 0xb6, 0x36, 0x90, 0xbc, 0x51, 0x11, 0x94, 0xbf, 0xad, 0xd4, 0x1e, 0xbf, + 0xbd, 0x57, 0x89, 0xbd, 0xb5, 0x18, 0x93, 0xbf, 0xaa, 0x9d, 0x1c, 0xbf, 0xf0, 0xdf, 0x0b, 0xbe, 0xa8, 0xde, 0x91, 0xbf, 0x04, 0xe0, 0x13, 0xbf, 0x9f, 0x91, + 0x35, 0xbe, 0x13, 0xfe, 0x90, 0xbf, 0x60, 0x28, 0x0a, 0xbf, 0x24, 0x4e, 0x42, 0xbe, 0x2a, 0x29, 0x91, 0xbf, 0x33, 0x21, 0x05, 0xbf, 0x41, 0x61, 0x6b, 0xb4, + 0x51, 0x11, 0x94, 0xbf, 0xad, 0xd4, 0x1e, 0xbf, 0xc7, 0x58, 0x71, 0xb4, 0x60, 0x16, 0x97, 0xbf, 0x13, 0x28, 0x1e, 0xbf, 0x70, 0x39, 0x95, 0x3c, 0xf9, 0x85, + 0x98, 0xbf, 0xbb, 0x8f, 0x19, 0xbf, 0x89, 0xa4, 0x9b, 0x3c, 0x60, 0x16, 0x97, 0xbf, 0x13, 0x28, 0x1e, 0xbf, 0xc6, 0x82, 0xb3, 0x3c, 0xed, 0x87, 0x98, 0xbf, + 0xbf, 0xd9, 0x15, 0xbf, 0xb6, 0x18, 0x75, 0x3c, 0x72, 0x1d, 0x91, 0xbf, 0x82, 0x00, 0x19, 0xbf, 0xc7, 0x6d, 0x5d, 0x3c, 0x44, 0x23, 0x8a, 0xbf, 0x72, 0xa9, + 0xf3, 0xbe, 0x30, 0x4e, 0x78, 0x3c, 0x84, 0xf0, 0x84, 0xbf, 0x60, 0x41, 0xa7, 0xbe, 0xca, 0x35, 0x90, 0x3c, 0x51, 0x11, 0x94, 0xbf, 0xad, 0xd4, 0x1e, 0xbf, + 0xd9, 0xee, 0x17, 0x3d, 0xe6, 0xcc, 0x97, 0xbf, 0xfc, 0x27, 0x0a, 0xbf, 0x9d, 0xaa, 0x46, 0x3d, 0x1a, 0x82, 0x96, 0xbf, 0xa2, 0x46, 0xec, 0xbe, 0x25, 0xe0, + 0x49, 0x3d, 0xe6, 0x22, 0x92, 0xbf, 0x48, 0x55, 0x97, 0xbe, 0x02, 0x38, 0x47, 0x3e, 0xa2, 0x4a, 0x8c, 0xbf, 0xf4, 0x7c, 0x83, 0xbe, 0x22, 0x9e, 0x7b, 0x3d, + 0x70, 0x27, 0x84, 0xbf, 0x36, 0xe9, 0xa5, 0xbe, 0x61, 0x41, 0x05, 0x3e, 0xea, 0x7e, 0x84, 0xbf, 0x6a, 0x68, 0x9f, 0xbe, 0x81, 0x91, 0x35, 0x3e, 0xa1, 0x4b, + 0x85, 0xbf, 0xb8, 0x53, 0x98, 0xbe, 0x87, 0x4a, 0x46, 0x3e, 0x03, 0x57, 0x86, 0xbf, 0x52, 0x05, 0x90, 0xbe, 0xef, 0xc2, 0xe7, 0x3d, 0xc4, 0xf6, 0x95, 0xbf, + 0xbe, 0xff, 0xec, 0xbe, 0x41, 0xaa, 0x4e, 0x3e, 0x83, 0xa7, 0x90, 0xbf, 0xfe, 0x04, 0xb7, 0xbe, 0x3a, 0x21, 0x85, 0x3d, 0xe5, 0xea, 0x97, 0xbf, 0x0a, 0x41, + 0x17, 0xbf, 0x62, 0xfe, 0x89, 0x3d, 0xff, 0xff, 0x95, 0xbf, 0x84, 0x27, 0x1c, 0xbf, 0x25, 0x3d, 0x4e, 0x3e, 0x00, 0x72, 0x8b, 0xbf, 0x0c, 0x48, 0xc6, 0xbe, + 0xee, 0x43, 0x3d, 0x3e, 0xb6, 0x2d, 0x8a, 0xbf, 0x7b, 0xf2, 0xd5, 0xbe, 0x6a, 0x28, 0x4c, 0x3e, 0xe0, 0xcc, 0x8f, 0xbf, 0x4c, 0x72, 0xf3, 0xbe, 0x61, 0xb6, + 0x07, 0x3e, 0xe6, 0x28, 0x89, 0xbf, 0xe2, 0x68, 0xe4, 0xbe, 0x3a, 0x1b, 0x3a, 0x3e, 0xef, 0x39, 0x8f, 0xbf, 0x0d, 0xbb, 0x03, 0xbf, 0x4b, 0x98, 0x73, 0x3d, + 0x36, 0x35, 0x89, 0xbf, 0xcd, 0xc0, 0xf0, 0xbe, 0xec, 0xeb, 0x0a, 0x3e, 0x60, 0x88, 0x8f, 0xbf, 0x30, 0x2c, 0x0e, 0xbf, 0xd9, 0xde, 0x81, 0x3d, 0xc6, 0x2c, + 0x90, 0xbf, 0x1c, 0xda, 0x16, 0xbf, 0x82, 0x57, 0x89, 0x3d, 0xb5, 0x18, 0x93, 0xbf, 0xaa, 0x9d, 0x1c, 0xbf, 0xd2, 0xdf, 0x0b, 0x3e, 0xa8, 0xde, 0x91, 0xbf, + 0x02, 0xe0, 0x13, 0xbf, 0x84, 0x91, 0x35, 0x3e, 0x12, 0xfe, 0x90, 0xbf, 0x5f, 0x28, 0x0a, 0xbf, 0x03, 0x4e, 0x42, 0x3e, 0x2a, 0x29, 0x91, 0xbf, 0x32, 0x21, + 0x05, 0xbf, 0xf4, 0x60, 0x76, 0xbe, 0xb1, 0xa2, 0x90, 0xbe, 0xf7, 0x19, 0x78, 0xbf, 0x1d, 0x54, 0x76, 0xbe, 0x95, 0x2f, 0x90, 0xbe, 0x4d, 0x95, 0x78, 0xbf, + 0x9a, 0x2b, 0xb6, 0xbe, 0xb3, 0x7b, 0x85, 0xbe, 0x5b, 0xd8, 0x75, 0xbf, 0x64, 0x28, 0xb6, 0xbe, 0x23, 0x4e, 0x86, 0xbe, 0x9e, 0x84, 0x75, 0xbf, 0xbd, 0x67, + 0xc2, 0xbd, 0xb4, 0x33, 0x8d, 0xbe, 0x53, 0xaa, 0x7e, 0xbf, 0xda, 0xaa, 0xc6, 0xbd, 0x83, 0xe8, 0x8c, 0xbe, 0x02, 0xe0, 0x7e, 0xbf, 0xbc, 0x1e, 0xfc, 0xbd, + 0x4b, 0xe7, 0x95, 0xbe, 0xb2, 0xa5, 0x79, 0xbf, 0x45, 0x1d, 0xfa, 0xbd, 0xc2, 0x62, 0x96, 0xbe, 0x7d, 0x36, 0x79, 0xbf, 0xbb, 0xcf, 0x18, 0xbe, 0x84, 0xd0, + 0x96, 0xbe, 0x42, 0xc6, 0x78, 0xbf, 0x26, 0xd6, 0x18, 0xbe, 0x20, 0x64, 0x96, 0xbe, 0x38, 0x47, 0x79, 0xbf, 0x19, 0xbf, 0x15, 0xbf, 0x18, 0x41, 0x4e, 0xbe, + 0xcb, 0x31, 0x50, 0xbf, 0xb0, 0xcd, 0xc1, 0xbd, 0x88, 0x82, 0x67, 0xbe, 0x8e, 0xf2, 0x81, 0xbf, 0xc8, 0x20, 0x0d, 0xbe, 0x24, 0x58, 0x46, 0xbe, 0x27, 0xe2, + 0x81, 0xbf, 0x1e, 0x6a, 0x71, 0xbe, 0xde, 0xf0, 0x41, 0xbe, 0x14, 0xb5, 0x80, 0xbf, 0x21, 0xb7, 0x71, 0xbe, 0x22, 0x0b, 0x44, 0xbe, 0x4f, 0xbd, 0x80, 0xbf, + 0x7d, 0xd3, 0xb3, 0xbe, 0x2e, 0x60, 0x36, 0xbe, 0xf6, 0xe6, 0x76, 0xbf, 0x5e, 0xf0, 0xb3, 0xbe, 0xb4, 0x83, 0x38, 0xbe, 0x96, 0x07, 0x77, 0xbf, 0xfc, 0xef, + 0xe7, 0xbe, 0xe0, 0x0f, 0x32, 0xbe, 0xa8, 0xfd, 0x6b, 0xbf, 0x7f, 0x16, 0xe8, 0xbe, 0x1c, 0x43, 0x34, 0xbe, 0x0b, 0x11, 0x6c, 0xbf, 0x19, 0xcf, 0x0a, 0xbf, + 0x74, 0x76, 0x35, 0xbe, 0x97, 0x49, 0x5e, 0xbf, 0xb4, 0xd0, 0x0a, 0xbf, 0x84, 0xd0, 0x37, 0xbe, 0xcc, 0x74, 0x5e, 0xbf, 0x9d, 0x6b, 0x0a, 0xbf, 0xfe, 0xb7, + 0x71, 0xbe, 0xf1, 0x3c, 0x5e, 0xbf, 0xc7, 0xa3, 0x0a, 0xbf, 0x5a, 0x96, 0x6e, 0xbe, 0xdc, 0x7c, 0x5e, 0xbf, 0xd5, 0x71, 0xea, 0xbe, 0x8e, 0x3b, 0x78, 0xbe, + 0x62, 0xd2, 0x69, 0xbf, 0x55, 0x98, 0xea, 0xbe, 0x46, 0x3a, 0x76, 0xbe, 0x6f, 0x0a, 0x6a, 0xbf, 0x27, 0x77, 0xb4, 0xbe, 0x4a, 0xe3, 0x3f, 0xbe, 0x2e, 0x03, + 0x78, 0xbf, 0x60, 0x53, 0x75, 0xbe, 0xc8, 0x8a, 0x49, 0xbe, 0x27, 0xe3, 0x80, 0xbf, 0xf5, 0xb6, 0xe8, 0xbe, 0x3a, 0x99, 0x3b, 0xbe, 0x2e, 0xc6, 0x6c, 0xbf, + 0x71, 0x22, 0x18, 0xbf, 0x8c, 0x4d, 0x67, 0xbe, 0x80, 0x43, 0x4e, 0xbf, 0x0e, 0x2d, 0xdb, 0xbd, 0x02, 0xd3, 0x8c, 0xbe, 0x79, 0xa3, 0x7f, 0xbf, 0xb9, 0x18, + 0x02, 0xbe, 0x96, 0xcc, 0x94, 0xbe, 0x4c, 0x91, 0x7b, 0xbf, 0xe0, 0xc0, 0x1e, 0xbe, 0x54, 0x98, 0x94, 0xbe, 0x57, 0x40, 0x7b, 0xbf, 0x35, 0x74, 0x76, 0xbe, + 0x43, 0xd2, 0x8e, 0xbe, 0x26, 0x5b, 0x7a, 0xbf, 0xdc, 0x3e, 0xb6, 0xbe, 0x11, 0x80, 0x82, 0xbe, 0x51, 0x2c, 0x76, 0xbf, 0x15, 0x85, 0xea, 0xbe, 0x60, 0xec, + 0x71, 0xbe, 0x37, 0x44, 0x6b, 0xbf, 0x49, 0x85, 0x0a, 0xbf, 0x78, 0x7f, 0x69, 0xbe, 0xbc, 0x15, 0x5f, 0xbf, 0x46, 0xbc, 0x78, 0xbe, 0x72, 0x1c, 0x88, 0xbe, + 0x04, 0x48, 0x7d, 0xbf, 0xc3, 0x0a, 0x7b, 0xbe, 0xa2, 0x2c, 0x6e, 0xbe, 0xdb, 0x1c, 0x80, 0xbf, 0x03, 0xdc, 0x20, 0xbe, 0xc2, 0x20, 0x8c, 0xbe, 0x74, 0xe0, + 0x7e, 0xbf, 0x11, 0x51, 0x46, 0xbe, 0x53, 0x0e, 0x98, 0xbf, 0x51, 0xe4, 0x2f, 0xbf, 0x91, 0x94, 0x16, 0xbe, 0x3c, 0x9b, 0x9a, 0xbf, 0x36, 0xd5, 0x36, 0xbf, + 0x18, 0x53, 0x1d, 0xbe, 0xc9, 0xa7, 0x9d, 0xbf, 0x75, 0xe2, 0x33, 0xbf, 0x10, 0xd4, 0x95, 0xbd, 0x84, 0xb8, 0x9b, 0xbf, 0x11, 0x89, 0x3c, 0xbf, 0xd7, 0xcd, + 0x9e, 0xbd, 0x6d, 0x9f, 0x9f, 0xbf, 0x7f, 0xf5, 0x37, 0xbf, 0x24, 0x03, 0x10, 0xbd, 0x43, 0x05, 0xa0, 0xbf, 0xfd, 0x6b, 0x39, 0xbf, 0x8b, 0x1b, 0xf7, 0xbc, + 0xcb, 0xb5, 0x9b, 0xbf, 0xc5, 0x60, 0x3d, 0xbf, 0xe1, 0x65, 0x72, 0xb4, 0x64, 0x2e, 0xa0, 0xbf, 0x00, 0x3d, 0x39, 0xbf, 0x3a, 0xae, 0x67, 0xb4, 0x42, 0x82, + 0x9b, 0xbf, 0x7c, 0xc4, 0x3c, 0xbf, 0xb2, 0xaf, 0x5e, 0xbe, 0xa8, 0x1f, 0x90, 0xbf, 0xb2, 0xbd, 0x23, 0xbf, 0x47, 0xf4, 0x41, 0xbe, 0xaa, 0xdd, 0x94, 0xbf, + 0x3b, 0x05, 0x30, 0xbf, 0x5a, 0xdd, 0x3c, 0xbe, 0x25, 0x27, 0x92, 0xbf, 0x09, 0x2a, 0x2f, 0xbf, 0x4f, 0x6d, 0x38, 0xbe, 0xe6, 0x87, 0x91, 0xbf, 0x0c, 0x5c, + 0x2e, 0xbf, 0xe5, 0x3c, 0x5f, 0xbe, 0xd6, 0xfc, 0x8e, 0xbf, 0x55, 0x78, 0x1d, 0xbf, 0xba, 0x7c, 0x07, 0xbe, 0x95, 0x1c, 0x93, 0xbf, 0xe3, 0x67, 0x36, 0xbf, + 0x3f, 0x1a, 0x04, 0xbe, 0x48, 0x74, 0x92, 0xbf, 0xf5, 0x25, 0x35, 0xbf, 0x0b, 0x6e, 0x39, 0xbe, 0x42, 0x5d, 0x90, 0xbf, 0xc2, 0x55, 0x28, 0xbf, 0x43, 0xcb, + 0x89, 0xbd, 0x62, 0x61, 0x95, 0xbf, 0xe8, 0x7a, 0x3c, 0xbf, 0x73, 0x21, 0x85, 0xbd, 0x83, 0xad, 0x94, 0xbf, 0x16, 0xec, 0x3a, 0xbf, 0x66, 0x21, 0x05, 0xbe, + 0xb4, 0x39, 0x91, 0xbf, 0x1d, 0xc3, 0x2e, 0xbf, 0xbf, 0x14, 0x0e, 0xbe, 0x79, 0xc8, 0x96, 0xbf, 0x83, 0xb5, 0x37, 0xbf, 0x92, 0xb5, 0xb1, 0xbc, 0x84, 0xe1, + 0x95, 0xbf, 0xf4, 0x49, 0x3d, 0xbf, 0x0f, 0xe3, 0xa9, 0xbc, 0xee, 0x26, 0x95, 0xbf, 0xd1, 0x9d, 0x3b, 0xbf, 0x56, 0xc8, 0x85, 0xbd, 0x21, 0x50, 0x93, 0xbf, + 0x8a, 0x3e, 0x33, 0xbf, 0xa5, 0x82, 0x8f, 0xbd, 0xa7, 0x5b, 0x98, 0xbf, 0xac, 0x90, 0x3d, 0xbf, 0x3c, 0xa3, 0xde, 0xbc, 0x3a, 0xc6, 0x98, 0xbf, 0xcc, 0x8e, + 0x3e, 0xbf, 0xa7, 0xf0, 0x5c, 0xb4, 0x8d, 0xc8, 0x95, 0xbf, 0xd0, 0xfd, 0x3c, 0xbf, 0x94, 0x84, 0x5c, 0xb4, 0x59, 0x0e, 0x95, 0xbf, 0x79, 0x67, 0x3b, 0xbf, + 0x10, 0xe3, 0xa9, 0xbc, 0x52, 0xcc, 0x93, 0xbf, 0x8b, 0xc0, 0x33, 0xbf, 0xb6, 0xb4, 0xb1, 0x3c, 0x84, 0xe1, 0x95, 0xbf, 0xf4, 0x49, 0x3d, 0xbf, 0x30, 0xe2, + 0xa9, 0x3c, 0xee, 0x26, 0x95, 0xbf, 0xd1, 0x9d, 0x3b, 0xbf, 0xc7, 0x86, 0x5e, 0xb4, 0xd4, 0xbb, 0x93, 0xbf, 0x39, 0xb9, 0x33, 0xbf, 0x34, 0x91, 0x61, 0xb4, + 0x3c, 0x9d, 0x98, 0xbf, 0x34, 0x0d, 0x3e, 0xbf, 0x58, 0xa2, 0xde, 0x3c, 0x3a, 0xc6, 0x98, 0xbf, 0xcc, 0x8e, 0x3e, 0xbf, 0xab, 0x02, 0x10, 0x3d, 0x43, 0x05, + 0xa0, 0xbf, 0xfd, 0x6b, 0x39, 0xbf, 0x9f, 0x1a, 0xf7, 0x3c, 0xcb, 0xb5, 0x9b, 0xbf, 0xc5, 0x60, 0x3d, 0xbf, 0x30, 0xe2, 0xa9, 0x3c, 0x52, 0xcc, 0x93, 0xbf, + 0x8b, 0xc0, 0x33, 0xbf, 0xf6, 0xc7, 0xca, 0xbc, 0xbe, 0x62, 0x9d, 0xbf, 0xf6, 0xcd, 0x25, 0xbf, 0x07, 0xb4, 0x78, 0xb4, 0x31, 0x4a, 0x9d, 0xbf, 0x5c, 0x3f, + 0x25, 0xbf, 0xd4, 0x96, 0x99, 0xbd, 0x5b, 0x42, 0x9d, 0xbf, 0xd5, 0x11, 0x25, 0xbf, 0x08, 0x8b, 0x09, 0xbe, 0x1a, 0x7c, 0x9c, 0xbf, 0x4d, 0x92, 0x20, 0xbf, + 0xe6, 0x7c, 0x33, 0xbe, 0x2e, 0x83, 0x9b, 0xbf, 0x71, 0xec, 0x1a, 0xbf, 0xfe, 0xc6, 0x52, 0xbe, 0x25, 0xaa, 0x99, 0xbf, 0xdc, 0x30, 0x10, 0xbf, 0x14, 0x8b, + 0x89, 0xbd, 0xa5, 0x67, 0x94, 0xbf, 0x7c, 0x9b, 0x3b, 0xbf, 0x79, 0x6e, 0x85, 0xbd, 0x4e, 0x2e, 0x94, 0xbf, 0x5a, 0xce, 0x39, 0xbf, 0x04, 0x49, 0xa9, 0xbc, + 0xb6, 0xc7, 0x94, 0xbf, 0x36, 0xf5, 0x3a, 0xbf, 0x27, 0x3f, 0x9c, 0xbd, 0x31, 0xbd, 0x92, 0xbf, 0x40, 0xb8, 0x41, 0xbf, 0xc6, 0x77, 0x09, 0xbe, 0xaf, 0x5c, + 0x92, 0xbf, 0x2b, 0xc0, 0x37, 0xbf, 0x0a, 0x02, 0x06, 0xbe, 0xb4, 0x1f, 0x92, 0xbf, 0xe7, 0x09, 0x36, 0xbf, 0x04, 0x49, 0xa9, 0xbc, 0x30, 0x92, 0x93, 0xbf, + 0x5c, 0xef, 0x33, 0xbf, 0x7a, 0x6e, 0x85, 0xbd, 0x33, 0x0e, 0x93, 0xbf, 0xea, 0x44, 0x33, 0xbf, 0xd4, 0xf9, 0x5b, 0xb4, 0xbe, 0xd4, 0x94, 0xbf, 0x6b, 0x9e, + 0x3b, 0xbf, 0x4d, 0x5d, 0x5b, 0xb4, 0xc3, 0x1c, 0x95, 0xbf, 0x73, 0x99, 0x3d, 0xbf, 0x2b, 0x9d, 0x5f, 0xbe, 0xbe, 0xe9, 0x8f, 0xbf, 0x5a, 0x4a, 0x24, 0xbf, + 0xd2, 0xb4, 0x65, 0xbe, 0x6a, 0x25, 0x90, 0xbf, 0xf7, 0x72, 0x25, 0xbf, 0x0f, 0xcf, 0x3a, 0xbe, 0x8e, 0x40, 0x91, 0xbf, 0x8e, 0xb9, 0x2f, 0xbf, 0xa5, 0xff, + 0x3f, 0xbe, 0x36, 0x7e, 0x91, 0xbf, 0xde, 0x2e, 0x31, 0xbf, 0x21, 0x59, 0x74, 0xbe, 0x19, 0x57, 0x8f, 0xbf, 0x7b, 0x4c, 0x29, 0xbf, 0x2b, 0x9d, 0x5f, 0xbe, + 0xa2, 0xc9, 0x8e, 0xbf, 0xeb, 0xc0, 0x1d, 0xbf, 0x70, 0x32, 0x48, 0xbe, 0xa1, 0xcd, 0x90, 0xbf, 0x4d, 0x70, 0x37, 0xbf, 0x0f, 0xcf, 0x3a, 0xbe, 0x74, 0x20, + 0x90, 0xbf, 0x1e, 0x30, 0x29, 0xbf, 0x7c, 0x76, 0x10, 0xbe, 0xea, 0xd2, 0x91, 0xbf, 0xee, 0xc4, 0x3d, 0xbf, 0x0a, 0x02, 0x06, 0xbe, 0x9a, 0xff, 0x90, 0xbf, + 0x76, 0x80, 0x2f, 0xbf, 0x25, 0x48, 0xa9, 0x3c, 0xb6, 0xc7, 0x94, 0xbf, 0x36, 0xf5, 0x3a, 0xbf, 0x9a, 0x60, 0x55, 0xb4, 0x7e, 0xc0, 0x93, 0xbf, 0x60, 0x80, + 0x43, 0xbf, 0x81, 0xfe, 0x5d, 0xb4, 0x50, 0x84, 0x93, 0xbf, 0x4e, 0xfc, 0x33, 0xbf, 0xa3, 0xb4, 0x7f, 0xbe, 0x4c, 0xa0, 0x8d, 0xbf, 0xb8, 0xd1, 0x2c, 0xbf, + 0xc3, 0x92, 0xa5, 0xbd, 0xc5, 0xd8, 0x8f, 0xbf, 0x01, 0xd4, 0x47, 0xbf, 0x48, 0x44, 0xa3, 0xbd, 0x68, 0x10, 0x8c, 0xbf, 0x59, 0xc1, 0x4e, 0xbf, 0x61, 0x2e, + 0x4b, 0xbd, 0xd8, 0xbf, 0x90, 0xbf, 0xfd, 0x69, 0x49, 0xbf, 0xe0, 0x0b, 0x62, 0xbd, 0xce, 0xf4, 0x8b, 0xbf, 0x09, 0xff, 0x4f, 0xbf, 0x9e, 0x15, 0xef, 0xbc, + 0xc2, 0xb6, 0x91, 0xbf, 0x63, 0x02, 0x4a, 0xbf, 0x41, 0xd7, 0xdf, 0xbc, 0x0d, 0xa7, 0x8d, 0xbf, 0x7c, 0x4c, 0x4f, 0xbf, 0x41, 0x93, 0x4e, 0xb4, 0xac, 0xda, + 0x91, 0xbf, 0x97, 0x2b, 0x49, 0xbf, 0x47, 0xd2, 0x44, 0xb4, 0x62, 0xe6, 0x8d, 0xbf, 0x98, 0x40, 0x4d, 0xbf, 0xd2, 0x14, 0xef, 0x3c, 0xc2, 0xb6, 0x91, 0xbf, + 0x63, 0x02, 0x4a, 0xbf, 0x7d, 0xd6, 0xdf, 0x3c, 0x0d, 0xa7, 0x8d, 0xbf, 0x7c, 0x4c, 0x4f, 0xbf, 0x80, 0x19, 0x6c, 0xbe, 0xac, 0x50, 0x86, 0xbf, 0x9d, 0x6e, + 0x26, 0xbf, 0x47, 0xf4, 0x41, 0xbe, 0x73, 0x04, 0x88, 0xbf, 0x5a, 0xf4, 0x31, 0xbf, 0x4e, 0x8c, 0x02, 0xbe, 0xde, 0xee, 0x88, 0xbf, 0x94, 0xd0, 0x38, 0xbf, + 0xfb, 0x8c, 0x63, 0xbd, 0xc8, 0x3e, 0x8a, 0xbf, 0xad, 0x3d, 0x3d, 0xbf, 0x1e, 0x64, 0x88, 0xbc, 0xa8, 0x70, 0x8a, 0xbf, 0xf1, 0xf7, 0x3d, 0xbf, 0x25, 0x48, + 0xa9, 0x3c, 0x30, 0x92, 0x93, 0xbf, 0x5c, 0xef, 0x33, 0xbf, 0xda, 0x49, 0x47, 0xb4, 0xc0, 0x5e, 0x8a, 0xbf, 0xdb, 0xd9, 0x3d, 0xbf, 0x9d, 0x51, 0x3e, 0xbe, + 0x94, 0xae, 0x56, 0xbf, 0x82, 0xc4, 0x67, 0xbe, 0x5e, 0x92, 0x36, 0xbe, 0xa3, 0xf1, 0x6a, 0xbf, 0x2a, 0xcc, 0x12, 0xbe, 0x1c, 0x9e, 0x00, 0xbe, 0x3e, 0x9e, + 0x6a, 0xbf, 0x02, 0x3f, 0x13, 0xbe, 0x69, 0x54, 0xff, 0xbd, 0xa3, 0x30, 0x56, 0xbf, 0xf8, 0x71, 0x68, 0xbe, 0x2b, 0x49, 0x67, 0xbe, 0xa4, 0x12, 0x57, 0xbf, + 0xb2, 0x3a, 0x67, 0xbe, 0xb6, 0x26, 0x5b, 0xbe, 0x82, 0x34, 0x6b, 0xbf, 0x10, 0x70, 0x12, 0xbe, 0x3c, 0x6c, 0x02, 0xbe, 0x19, 0xb8, 0x81, 0xbf, 0x42, 0x1f, + 0xe2, 0xbd, 0x1b, 0x34, 0x30, 0xbe, 0x3b, 0xcd, 0x81, 0xbf, 0xd6, 0xaa, 0xe1, 0xbd, 0x9b, 0x1a, 0x76, 0xbd, 0xa5, 0x17, 0x6b, 0xbf, 0xc9, 0x97, 0x12, 0xbe, + 0x19, 0xed, 0x5a, 0xbd, 0x9a, 0xe6, 0x56, 0xbf, 0x53, 0x77, 0x67, 0xbe, 0x43, 0xf2, 0x01, 0xbe, 0xa3, 0xae, 0x7f, 0xbf, 0x06, 0x9d, 0x32, 0xbf, 0x9b, 0x3b, + 0x43, 0xbe, 0x6e, 0xd6, 0x7d, 0xbf, 0x80, 0xa8, 0x2b, 0xbf, 0x94, 0xae, 0x85, 0xbe, 0xc2, 0x6e, 0x56, 0xbf, 0x69, 0x1c, 0x68, 0xbe, 0x5e, 0xe0, 0x90, 0xbe, + 0x29, 0xf8, 0x6b, 0xbf, 0x96, 0x62, 0x11, 0xbe, 0xd8, 0xab, 0x50, 0xbe, 0x0a, 0xde, 0x81, 0xbf, 0x42, 0x4e, 0xe1, 0xbd, 0x4f, 0x4e, 0x6e, 0xbe, 0x63, 0x4d, + 0x7a, 0xbf, 0x05, 0x1f, 0x20, 0xbf, 0x36, 0x18, 0x8a, 0xbe, 0x62, 0x5a, 0x82, 0xbf, 0x3c, 0xa1, 0xde, 0xbd, 0x41, 0x31, 0x89, 0xbd, 0x6a, 0xd6, 0x81, 0xbf, + 0x3e, 0x78, 0xe1, 0xbd, 0xaf, 0x70, 0x99, 0xbc, 0xb2, 0x1a, 0x6b, 0xbf, 0x96, 0x93, 0x12, 0xbe, 0xc3, 0x5f, 0x82, 0xbc, 0xa0, 0xec, 0x56, 0xbf, 0x04, 0x6f, + 0x67, 0xbe, 0x82, 0xa1, 0x5c, 0xbd, 0x9d, 0x05, 0x81, 0xbf, 0xc0, 0x29, 0x37, 0xbf, 0xba, 0x09, 0x7a, 0xb4, 0x02, 0x0d, 0x6b, 0xbf, 0x70, 0xa6, 0x12, 0xbe, + 0x34, 0xec, 0x5a, 0xb4, 0xf0, 0xd5, 0x56, 0xbf, 0x45, 0x8e, 0x67, 0xbe, 0x0b, 0x93, 0x82, 0xbc, 0x95, 0x2a, 0x81, 0xbf, 0xe6, 0xec, 0x37, 0xbf, 0x4c, 0xe8, + 0xb0, 0xbc, 0x3a, 0xd7, 0x81, 0xbf, 0xc0, 0x73, 0xe1, 0xbd, 0x07, 0xe3, 0x8a, 0xb4, 0x54, 0xd3, 0x81, 0xbf, 0x3c, 0x89, 0xe1, 0xbd, 0xb5, 0x6f, 0x99, 0x3c, + 0xb2, 0x1a, 0x6b, 0xbf, 0x96, 0x93, 0x12, 0xbe, 0xe7, 0x5e, 0x82, 0x3c, 0xa0, 0xec, 0x56, 0xbf, 0x04, 0x6f, 0x67, 0xbe, 0x47, 0x9e, 0x39, 0xb4, 0x89, 0x1a, + 0x81, 0xbf, 0x6a, 0xd9, 0x37, 0xbf, 0x58, 0x63, 0x88, 0x3c, 0xa8, 0x70, 0x8a, 0xbf, 0xf1, 0xf7, 0x3d, 0xbf, 0xff, 0xc6, 0xca, 0x3c, 0xbe, 0x62, 0x9d, 0xbf, + 0xf6, 0xcd, 0x25, 0xbf, 0x11, 0x99, 0xd0, 0xbc, 0xd0, 0x04, 0xa4, 0xbf, 0x64, 0xdd, 0x12, 0xbf, 0xdd, 0x08, 0x88, 0xb4, 0x57, 0xe8, 0xa3, 0xbf, 0x04, 0x38, + 0x12, 0xbf, 0x91, 0x0c, 0x9d, 0xbd, 0xaf, 0xe4, 0xa3, 0xbf, 0xc6, 0x22, 0x12, 0xbf, 0x7f, 0x2b, 0x0a, 0xbe, 0x7a, 0x1f, 0xa3, 0xbf, 0x50, 0xa9, 0x0d, 0xbf, + 0xff, 0x3b, 0x32, 0xbe, 0x78, 0x2a, 0xa2, 0xbf, 0x38, 0x1a, 0x08, 0xbf, 0xe9, 0x31, 0x50, 0xbe, 0xc9, 0x53, 0xa0, 0xbf, 0x8f, 0xd8, 0xfa, 0xbe, 0xfd, 0x97, + 0xd0, 0x3c, 0xd0, 0x04, 0xa4, 0xbf, 0x64, 0xdd, 0x12, 0xbf, 0x75, 0x95, 0xcb, 0xbc, 0x28, 0x54, 0x90, 0xbf, 0x80, 0xfc, 0x01, 0xbe, 0x34, 0x0c, 0x97, 0xb4, + 0x35, 0x5b, 0x90, 0xbf, 0x5e, 0xa0, 0x02, 0xbe, 0x4c, 0xd6, 0x98, 0xbd, 0x1c, 0x53, 0x90, 0xbf, 0x38, 0xe4, 0x01, 0xbe, 0xb2, 0x81, 0x05, 0xbe, 0x1c, 0x53, + 0x90, 0xbf, 0x38, 0xe4, 0x01, 0xbe, 0xa1, 0x70, 0x2b, 0xbe, 0x1c, 0x53, 0x90, 0xbf, 0x38, 0xe4, 0x01, 0xbe, 0x60, 0x12, 0x48, 0xbe, 0x1c, 0x53, 0x90, 0xbf, + 0x38, 0xe4, 0x01, 0xbe, 0x7e, 0x0c, 0x63, 0xbe, 0x1c, 0x53, 0x90, 0xbf, 0x38, 0xe4, 0x01, 0xbe, 0x51, 0x92, 0x82, 0x3c, 0x95, 0x2a, 0x81, 0xbf, 0xe6, 0xec, + 0x37, 0xbf, 0x46, 0x94, 0xcb, 0x3c, 0x28, 0x54, 0x90, 0xbf, 0x80, 0xfc, 0x01, 0xbe, 0x37, 0xe7, 0xb0, 0x3c, 0x3a, 0xd7, 0x81, 0xbf, 0xc0, 0x73, 0xe1, 0xbd, + 0x65, 0x28, 0xb6, 0x3e, 0x22, 0x4e, 0x86, 0xbe, 0x9d, 0x84, 0x75, 0xbf, 0x9a, 0x2b, 0xb6, 0x3e, 0xb1, 0x7b, 0x85, 0xbe, 0x59, 0xd8, 0x75, 0xbf, 0x1f, 0x54, + 0x76, 0x3e, 0x95, 0x2f, 0x90, 0xbe, 0x4d, 0x95, 0x78, 0xbf, 0xf7, 0x60, 0x76, 0x3e, 0xb1, 0xa2, 0x90, 0xbe, 0xf7, 0x19, 0x78, 0xbf, 0x4c, 0x1d, 0xfa, 0x3d, + 0xc2, 0x62, 0x96, 0xbe, 0x7d, 0x36, 0x79, 0xbf, 0xc4, 0x1e, 0xfc, 0x3d, 0x4b, 0xe7, 0x95, 0xbe, 0xb2, 0xa5, 0x79, 0xbf, 0xe4, 0xaa, 0xc6, 0x3d, 0x83, 0xe8, + 0x8c, 0xbe, 0x02, 0xe0, 0x7e, 0xbf, 0xc4, 0x67, 0xc2, 0x3d, 0xb4, 0x33, 0x8d, 0xbe, 0x53, 0xaa, 0x7e, 0xbf, 0x29, 0xd6, 0x18, 0x3e, 0x20, 0x64, 0x96, 0xbe, + 0x38, 0x47, 0x79, 0xbf, 0xbd, 0xcf, 0x18, 0x3e, 0x83, 0xd0, 0x96, 0xbe, 0x42, 0xc6, 0x78, 0xbf, 0x1a, 0xbf, 0x15, 0x3f, 0x18, 0x41, 0x4e, 0xbe, 0xca, 0x31, + 0x50, 0xbf, 0xbc, 0xcd, 0xc1, 0x3d, 0x88, 0x82, 0x67, 0xbe, 0x8e, 0xf2, 0x81, 0xbf, 0xcf, 0x20, 0x0d, 0x3e, 0x22, 0x58, 0x46, 0xbe, 0x26, 0xe2, 0x81, 0xbf, + 0x29, 0xb7, 0x71, 0x3e, 0x20, 0x0b, 0x44, 0xbe, 0x4f, 0xbd, 0x80, 0xbf, 0x23, 0x6a, 0x71, 0x3e, 0xde, 0xf0, 0x41, 0xbe, 0x14, 0xb5, 0x80, 0xbf, 0x61, 0xf0, + 0xb3, 0x3e, 0xb2, 0x83, 0x38, 0xbe, 0x95, 0x07, 0x77, 0xbf, 0x80, 0xd3, 0xb3, 0x3e, 0x28, 0x60, 0x36, 0xbe, 0xf2, 0xe6, 0x76, 0xbf, 0x84, 0x16, 0xe8, 0x3e, + 0x1c, 0x43, 0x34, 0xbe, 0x0b, 0x11, 0x6c, 0xbf, 0x03, 0xf0, 0xe7, 0x3e, 0xde, 0x0f, 0x32, 0xbe, 0xa6, 0xfd, 0x6b, 0xbf, 0xb5, 0xd0, 0x0a, 0x3f, 0x84, 0xd0, + 0x37, 0xbe, 0xcb, 0x74, 0x5e, 0xbf, 0x1b, 0xcf, 0x0a, 0x3f, 0x70, 0x76, 0x35, 0xbe, 0x96, 0x49, 0x5e, 0xbf, 0xc7, 0xa3, 0x0a, 0x3f, 0x58, 0x96, 0x6e, 0xbe, + 0xda, 0x7c, 0x5e, 0xbf, 0x9e, 0x6b, 0x0a, 0x3f, 0xfc, 0xb7, 0x71, 0xbe, 0xef, 0x3c, 0x5e, 0xbf, 0x59, 0x98, 0xea, 0x3e, 0x46, 0x3a, 0x76, 0xbe, 0x6e, 0x0a, + 0x6a, 0xbf, 0xd7, 0x71, 0xea, 0x3e, 0x8c, 0x3b, 0x78, 0xbe, 0x61, 0xd2, 0x69, 0xbf, 0x66, 0x53, 0x75, 0x3e, 0xc6, 0x8a, 0x49, 0xbe, 0x26, 0xe3, 0x80, 0xbf, + 0x2a, 0x77, 0xb4, 0x3e, 0x46, 0xe3, 0x3f, 0xbe, 0x2a, 0x03, 0x78, 0xbf, 0xfa, 0xb6, 0xe8, 0x3e, 0x38, 0x99, 0x3b, 0xbe, 0x2c, 0xc6, 0x6c, 0xbf, 0x72, 0x22, + 0x18, 0x3f, 0x8c, 0x4d, 0x67, 0xbe, 0x80, 0x43, 0x4e, 0xbf, 0x14, 0x2d, 0xdb, 0x3d, 0x02, 0xd3, 0x8c, 0xbe, 0x79, 0xa3, 0x7f, 0xbf, 0xbc, 0x18, 0x02, 0x3e, + 0x95, 0xcc, 0x94, 0xbe, 0x4c, 0x91, 0x7b, 0xbf, 0xe2, 0xc0, 0x1e, 0x3e, 0x54, 0x98, 0x94, 0xbe, 0x57, 0x40, 0x7b, 0xbf, 0x36, 0x74, 0x76, 0x3e, 0x43, 0xd2, + 0x8e, 0xbe, 0x26, 0x5b, 0x7a, 0xbf, 0xdd, 0x3e, 0xb6, 0x3e, 0x10, 0x80, 0x82, 0xbe, 0x50, 0x2c, 0x76, 0xbf, 0x16, 0x85, 0xea, 0x3e, 0x60, 0xec, 0x71, 0xbe, + 0x36, 0x44, 0x6b, 0xbf, 0x4a, 0x85, 0x0a, 0x3f, 0x74, 0x7f, 0x69, 0xbe, 0xbb, 0x15, 0x5f, 0xbf, 0x49, 0xbc, 0x78, 0x3e, 0x72, 0x1c, 0x88, 0xbe, 0x04, 0x48, + 0x7d, 0xbf, 0xc4, 0x0a, 0x7b, 0x3e, 0xa2, 0x2c, 0x6e, 0xbe, 0xdb, 0x1c, 0x80, 0xbf, 0x09, 0xdc, 0x20, 0x3e, 0xc2, 0x20, 0x8c, 0xbe, 0x74, 0xe0, 0x7e, 0xbf, + 0xf5, 0x50, 0x46, 0x3e, 0x53, 0x0e, 0x98, 0xbf, 0x51, 0xe4, 0x2f, 0xbf, 0xfc, 0x52, 0x1d, 0x3e, 0xc8, 0xa7, 0x9d, 0xbf, 0x72, 0xe2, 0x33, 0xbf, 0x73, 0x94, + 0x16, 0x3e, 0x3c, 0x9b, 0x9a, 0xbf, 0x35, 0xd5, 0x36, 0xbf, 0x99, 0xcd, 0x9e, 0x3d, 0x6d, 0x9f, 0x9f, 0xbf, 0x7f, 0xf5, 0x37, 0xbf, 0xd7, 0xd3, 0x95, 0x3d, + 0x84, 0xb8, 0x9b, 0xbf, 0x11, 0x89, 0x3c, 0xbf, 0x93, 0xaf, 0x5e, 0x3e, 0xa8, 0x1f, 0x90, 0xbf, 0xb0, 0xbd, 0x23, 0xbf, 0x3d, 0xdd, 0x3c, 0x3e, 0x25, 0x27, + 0x92, 0xbf, 0x08, 0x2a, 0x2f, 0xbf, 0x2b, 0xf4, 0x41, 0x3e, 0xaa, 0xdd, 0x94, 0xbf, 0x38, 0x05, 0x30, 0xbf, 0xc7, 0x3c, 0x5f, 0x3e, 0xd6, 0xfc, 0x8e, 0xbf, + 0x54, 0x78, 0x1d, 0xbf, 0x33, 0x6d, 0x38, 0x3e, 0xe6, 0x87, 0x91, 0xbf, 0x0b, 0x5c, 0x2e, 0xbf, 0xef, 0x6d, 0x39, 0x3e, 0x41, 0x5d, 0x90, 0xbf, 0xc0, 0x55, + 0x28, 0xbf, 0x25, 0x1a, 0x04, 0x3e, 0x48, 0x74, 0x92, 0xbf, 0xf5, 0x25, 0x35, 0xbf, 0x9f, 0x7c, 0x07, 0x3e, 0x95, 0x1c, 0x93, 0xbf, 0xe3, 0x67, 0x36, 0xbf, + 0x4b, 0x21, 0x05, 0x3e, 0xb4, 0x39, 0x91, 0xbf, 0x1d, 0xc3, 0x2e, 0xbf, 0x3d, 0x21, 0x85, 0x3d, 0x83, 0xad, 0x94, 0xbf, 0x16, 0xec, 0x3a, 0xbf, 0x0c, 0xcb, + 0x89, 0x3d, 0x62, 0x61, 0x95, 0xbf, 0xe8, 0x7a, 0x3c, 0xbf, 0xa4, 0x14, 0x0e, 0x3e, 0x79, 0xc8, 0x96, 0xbf, 0x83, 0xb5, 0x37, 0xbf, 0x1d, 0xc8, 0x85, 0x3d, + 0x21, 0x50, 0x93, 0xbf, 0x8a, 0x3e, 0x33, 0xbf, 0x6e, 0x82, 0x8f, 0x3d, 0xa7, 0x5b, 0x98, 0xbf, 0xac, 0x90, 0x3d, 0xbf, 0x96, 0x96, 0x99, 0x3d, 0x5b, 0x42, + 0x9d, 0xbf, 0xd5, 0x11, 0x25, 0xbf, 0xeb, 0x8a, 0x09, 0x3e, 0x1a, 0x7c, 0x9c, 0xbf, 0x4c, 0x92, 0x20, 0xbf, 0xc6, 0x7c, 0x33, 0x3e, 0x2d, 0x83, 0x9b, 0xbf, + 0x6f, 0xec, 0x1a, 0xbf, 0xdd, 0xc6, 0x52, 0x3e, 0x24, 0xaa, 0x99, 0xbf, 0xdb, 0x30, 0x10, 0xbf, 0x43, 0x6e, 0x85, 0x3d, 0x4e, 0x2e, 0x94, 0xbf, 0x5a, 0xce, + 0x39, 0xbf, 0xdf, 0x8a, 0x89, 0x3d, 0xa5, 0x67, 0x94, 0xbf, 0x7c, 0x9b, 0x3b, 0xbf, 0x42, 0x6e, 0x85, 0x3d, 0x33, 0x0e, 0x93, 0xbf, 0xea, 0x44, 0x33, 0xbf, + 0xef, 0x01, 0x06, 0x3e, 0xb4, 0x1f, 0x92, 0xbf, 0xe7, 0x09, 0x36, 0xbf, 0xac, 0x77, 0x09, 0x3e, 0xaf, 0x5c, 0x92, 0xbf, 0x2b, 0xc0, 0x37, 0xbf, 0xf3, 0x3e, + 0x9c, 0x3d, 0x31, 0xbd, 0x92, 0xbf, 0x40, 0xb8, 0x41, 0xbf, 0xb8, 0xb4, 0x65, 0x3e, 0x6a, 0x25, 0x90, 0xbf, 0xf6, 0x72, 0x25, 0xbf, 0x0c, 0x9d, 0x5f, 0x3e, + 0xbd, 0xe9, 0x8f, 0xbf, 0x59, 0x4a, 0x24, 0xbf, 0x05, 0x59, 0x74, 0x3e, 0x19, 0x57, 0x8f, 0xbf, 0x7a, 0x4c, 0x29, 0xbf, 0x8b, 0xff, 0x3f, 0x3e, 0x36, 0x7e, + 0x91, 0xbf, 0xde, 0x2e, 0x31, 0xbf, 0xf1, 0xce, 0x3a, 0x3e, 0x8e, 0x40, 0x91, 0xbf, 0x8c, 0xb9, 0x2f, 0xbf, 0x0c, 0x9d, 0x5f, 0x3e, 0xa2, 0xc9, 0x8e, 0xbf, + 0xea, 0xc0, 0x1d, 0xbf, 0x54, 0x32, 0x48, 0x3e, 0xa1, 0xcd, 0x90, 0xbf, 0x4c, 0x70, 0x37, 0xbf, 0xf1, 0xce, 0x3a, 0x3e, 0x74, 0x20, 0x90, 0xbf, 0x1c, 0x30, + 0x29, 0xbf, 0x62, 0x76, 0x10, 0x3e, 0xea, 0xd2, 0x91, 0xbf, 0xee, 0xc4, 0x3d, 0xbf, 0xef, 0x01, 0x06, 0x3e, 0x9a, 0xff, 0x90, 0xbf, 0x76, 0x80, 0x2f, 0xbf, + 0x85, 0xb4, 0x7f, 0x3e, 0x4c, 0xa0, 0x8d, 0xbf, 0xb8, 0xd1, 0x2c, 0xbf, 0x16, 0x44, 0xa3, 0x3d, 0x68, 0x10, 0x8c, 0xbf, 0x59, 0xc1, 0x4e, 0xbf, 0x92, 0x92, + 0xa5, 0x3d, 0xc5, 0xd8, 0x8f, 0xbf, 0x01, 0xd4, 0x47, 0xbf, 0x7f, 0x0b, 0x62, 0x3d, 0xce, 0xf4, 0x8b, 0xbf, 0x09, 0xff, 0x4f, 0xbf, 0xf8, 0x2d, 0x4b, 0x3d, + 0xd8, 0xbf, 0x90, 0xbf, 0xfd, 0x69, 0x49, 0xbf, 0x63, 0x19, 0x6c, 0x3e, 0xac, 0x50, 0x86, 0xbf, 0x9c, 0x6e, 0x26, 0xbf, 0x2c, 0xf4, 0x41, 0x3e, 0x72, 0x04, + 0x88, 0xbf, 0x58, 0xf4, 0x31, 0xbf, 0x36, 0x8c, 0x02, 0x3e, 0xde, 0xee, 0x88, 0xbf, 0x94, 0xd0, 0x38, 0xbf, 0x97, 0x8c, 0x63, 0x3d, 0xc8, 0x3e, 0x8a, 0xbf, + 0xad, 0x3d, 0x3d, 0xbf, 0x32, 0x54, 0xff, 0x3d, 0xa2, 0x30, 0x56, 0xbf, 0xf0, 0x71, 0x68, 0xbe, 0xfd, 0x9d, 0x00, 0x3e, 0x3e, 0x9e, 0x6a, 0xbf, 0x00, 0x3f, + 0x13, 0xbe, 0x3c, 0x92, 0x36, 0x3e, 0xa2, 0xf1, 0x6a, 0xbf, 0x24, 0xcc, 0x12, 0xbe, 0x82, 0x51, 0x3e, 0x3e, 0x94, 0xae, 0x56, 0xbf, 0x7a, 0xc4, 0x67, 0xbe, + 0xac, 0xec, 0x5a, 0x3d, 0x9a, 0xe6, 0x56, 0xbf, 0x51, 0x77, 0x67, 0xbe, 0x1e, 0x1a, 0x76, 0x3d, 0xa5, 0x17, 0x6b, 0xbf, 0xc9, 0x97, 0x12, 0xbe, 0xfc, 0x33, + 0x30, 0x3e, 0x3b, 0xcd, 0x81, 0xbf, 0xd6, 0xaa, 0xe1, 0xbd, 0x19, 0x6c, 0x02, 0x3e, 0x19, 0xb8, 0x81, 0xbf, 0x42, 0x1f, 0xe2, 0xbd, 0x95, 0x26, 0x5b, 0x3e, + 0x82, 0x34, 0x6b, 0xbf, 0x0a, 0x70, 0x12, 0xbe, 0x10, 0x49, 0x67, 0x3e, 0xa3, 0x12, 0x57, 0xbf, 0xaa, 0x3a, 0x67, 0xbe, 0x84, 0x3b, 0x43, 0x3e, 0x6e, 0xd6, + 0x7d, 0xbf, 0x80, 0xa8, 0x2b, 0xbf, 0x2d, 0xf2, 0x01, 0x3e, 0xa3, 0xae, 0x7f, 0xbf, 0x06, 0x9d, 0x32, 0xbf, 0xb5, 0xab, 0x50, 0x3e, 0x09, 0xde, 0x81, 0xbf, + 0x3e, 0x4e, 0xe1, 0xbd, 0x4e, 0xe0, 0x90, 0x3e, 0x28, 0xf8, 0x6b, 0xbf, 0x90, 0x62, 0x11, 0xbe, 0x85, 0xae, 0x85, 0x3e, 0xc2, 0x6e, 0x56, 0xbf, 0x61, 0x1c, + 0x68, 0xbe, 0x33, 0x4e, 0x6e, 0x3e, 0x63, 0x4d, 0x7a, 0xbf, 0x05, 0x1f, 0x20, 0xbf, 0x24, 0x18, 0x8a, 0x3e, 0x62, 0x5a, 0x82, 0xbf, 0x30, 0xa1, 0xde, 0xbd, + 0xfc, 0x30, 0x89, 0x3d, 0x6a, 0xd6, 0x81, 0xbf, 0x3e, 0x78, 0xe1, 0xbd, 0x23, 0xa1, 0x5c, 0x3d, 0x9d, 0x05, 0x81, 0xbf, 0xc0, 0x29, 0x37, 0xbf, 0x4d, 0x0c, + 0x9d, 0x3d, 0xaf, 0xe4, 0xa3, 0xbf, 0xc6, 0x22, 0x12, 0xbf, 0x5e, 0x2b, 0x0a, 0x3e, 0x7a, 0x1f, 0xa3, 0xbf, 0x4e, 0xa9, 0x0d, 0xbf, 0xdd, 0x3b, 0x32, 0x3e, + 0x78, 0x2a, 0xa2, 0xbf, 0x36, 0x1a, 0x08, 0xbf, 0xc2, 0x31, 0x50, 0x3e, 0xc9, 0x53, 0xa0, 0xbf, 0x8d, 0xd8, 0xfa, 0xbe, 0x01, 0xd6, 0x98, 0x3d, 0x1c, 0x53, + 0x90, 0xbf, 0x38, 0xe4, 0x01, 0xbe, 0x8c, 0x81, 0x05, 0x3e, 0x1c, 0x53, 0x90, 0xbf, 0x38, 0xe4, 0x01, 0xbe, 0x7c, 0x70, 0x2b, 0x3e, 0x1c, 0x53, 0x90, 0xbf, + 0x38, 0xe4, 0x01, 0xbe, 0x38, 0x12, 0x48, 0x3e, 0x1c, 0x53, 0x90, 0xbf, 0x38, 0xe4, 0x01, 0xbe, 0x57, 0x0c, 0x63, 0x3e, 0x1c, 0x53, 0x90, 0xbf, 0x38, 0xe4, + 0x01, 0xbe, 0x99, 0x78, 0xfc, 0x3e, 0x48, 0x56, 0xda, 0xbe, 0x13, 0xae, 0x45, 0xbf, 0x0c, 0xe1, 0xfa, 0x3e, 0xe5, 0xc2, 0xd8, 0xbe, 0x24, 0x1f, 0x44, 0xbf, + 0x95, 0x40, 0xfa, 0x3e, 0xde, 0x18, 0xd7, 0xbe, 0x2e, 0xfa, 0x43, 0xbf, 0xef, 0x3f, 0x6c, 0x3e, 0x5a, 0x2f, 0xdb, 0xbe, 0x5e, 0x3e, 0x4d, 0xbf, 0xe0, 0x58, + 0x6b, 0x3e, 0x5c, 0xb9, 0xdb, 0xbe, 0xf1, 0x4b, 0x4d, 0xbf, 0x92, 0xc8, 0xba, 0x3e, 0xb9, 0xcc, 0x00, 0xbf, 0x21, 0x74, 0x56, 0xbf, 0x4a, 0xf2, 0xba, 0x3e, + 0xcc, 0x14, 0x01, 0xbf, 0x47, 0xad, 0x58, 0xbf, 0x35, 0xbe, 0xb9, 0x3e, 0x55, 0xfe, 0xf9, 0xbe, 0x06, 0x5d, 0x55, 0xbf, 0x5b, 0x65, 0xd9, 0x3e, 0xdd, 0xb8, + 0xfc, 0xbe, 0xc0, 0x0d, 0x56, 0xbf, 0x9b, 0x8c, 0xda, 0x3e, 0x39, 0x44, 0xfc, 0xbe, 0xdd, 0xcf, 0x53, 0xbf, 0x6f, 0xc3, 0xd6, 0x3e, 0x6f, 0xcb, 0xf3, 0xbe, + 0x16, 0x32, 0x53, 0xbf, 0x6b, 0x4b, 0xba, 0x3e, 0x39, 0x95, 0xfa, 0xbe, 0x79, 0xae, 0x57, 0xbf, 0x47, 0xd0, 0xd6, 0x3e, 0xea, 0xe9, 0xf4, 0xbe, 0x16, 0xd7, + 0x55, 0xbf, 0x6c, 0x37, 0xb9, 0x3e, 0x14, 0xd7, 0xf1, 0xbe, 0x5b, 0x04, 0x55, 0xbf, 0x0b, 0x95, 0xd4, 0x3e, 0xa4, 0x0e, 0xed, 0xbe, 0x48, 0x8a, 0x53, 0xbf, + 0x4a, 0x32, 0xd5, 0x3e, 0x8a, 0x74, 0xee, 0xbe, 0x3d, 0x42, 0x52, 0xbf, 0x2b, 0xae, 0xb9, 0x3e, 0xf1, 0x65, 0xf3, 0xbe, 0x67, 0xd0, 0x53, 0xbf, 0x81, 0xaa, + 0x91, 0x3e, 0xac, 0xd5, 0xe6, 0xbe, 0x90, 0x6a, 0x51, 0xbf, 0x4a, 0x46, 0x90, 0x3e, 0x18, 0x85, 0xe8, 0xbe, 0x44, 0xa1, 0x51, 0xbf, 0x42, 0x23, 0xd2, 0x3e, + 0x14, 0xa2, 0xe8, 0xbe, 0x50, 0x8b, 0x51, 0xbf, 0xe9, 0x50, 0xd3, 0x3e, 0x69, 0x02, 0xeb, 0xbe, 0xc1, 0x64, 0x51, 0xbf, 0xfa, 0x0c, 0xb8, 0x3e, 0xc2, 0x96, + 0xef, 0xbe, 0x86, 0xd8, 0x52, 0xbf, 0xf2, 0x49, 0xb8, 0x3e, 0x3c, 0x49, 0xed, 0xbe, 0xf9, 0xde, 0x52, 0xbf, 0xbe, 0x32, 0xfd, 0x3e, 0x14, 0xb0, 0xbf, 0xbe, + 0x4b, 0x94, 0x43, 0xbf, 0x25, 0xd7, 0xfe, 0x3e, 0x7e, 0x03, 0xbf, 0xbe, 0xf1, 0x63, 0x43, 0xbf, 0xdf, 0x2c, 0xf5, 0x3e, 0xf6, 0x22, 0xbd, 0xbe, 0x43, 0x75, + 0x46, 0xbf, 0xbb, 0xe6, 0xf9, 0x3e, 0x9a, 0x20, 0xbb, 0xbe, 0x9d, 0xe3, 0x45, 0xbf, 0xe1, 0x57, 0xee, 0x3e, 0x70, 0xce, 0xb7, 0xbe, 0x88, 0x9e, 0x4c, 0xbf, + 0x46, 0x71, 0xf2, 0x3e, 0x2e, 0xfd, 0xb4, 0xbe, 0x03, 0xe1, 0x4c, 0xbf, 0x8a, 0x04, 0xe1, 0x3e, 0xa8, 0x7f, 0xb8, 0xbe, 0x6b, 0xce, 0x54, 0xbf, 0x11, 0xed, + 0xe3, 0x3e, 0x5a, 0x79, 0xb5, 0xbe, 0x84, 0x92, 0x55, 0xbf, 0x3a, 0xdf, 0xc3, 0x3e, 0xba, 0x9c, 0xb7, 0xbe, 0x52, 0x16, 0x5e, 0xbf, 0x1b, 0xfc, 0xc3, 0x3e, + 0xf0, 0xde, 0xb3, 0xbe, 0x86, 0x29, 0x5f, 0xbf, 0xca, 0x02, 0xe3, 0x3e, 0xe1, 0x34, 0xbf, 0xbe, 0xbb, 0xc9, 0x57, 0xbf, 0x35, 0x7d, 0xc5, 0x3e, 0x79, 0xdd, + 0xbd, 0xbe, 0x14, 0x29, 0x61, 0xbf, 0x86, 0x4d, 0xa7, 0x3e, 0x8d, 0x29, 0xb9, 0xbe, 0x93, 0xdf, 0x5d, 0xbf, 0x59, 0x83, 0xa6, 0x3e, 0x04, 0xde, 0xb5, 0xbe, + 0xe6, 0x1d, 0x5f, 0xbf, 0x4d, 0x9d, 0xc5, 0x3e, 0x55, 0x1a, 0xba, 0xbe, 0xce, 0x39, 0x62, 0xbf, 0x1d, 0x5e, 0xe5, 0x3e, 0xb4, 0x97, 0xbf, 0xbe, 0x5b, 0x14, + 0x58, 0xbf, 0x01, 0xc4, 0x88, 0x3e, 0xd9, 0xb6, 0xba, 0xbe, 0x82, 0x5e, 0x58, 0xbf, 0xe9, 0x2e, 0x86, 0x3e, 0x9c, 0x80, 0xb8, 0xbe, 0x9c, 0x64, 0x59, 0xbf, + 0xe3, 0xe1, 0xa8, 0x3e, 0xf0, 0x24, 0xbf, 0xbe, 0x9a, 0xeb, 0x60, 0xbf, 0x16, 0x26, 0x63, 0x3e, 0xbe, 0xe2, 0xbe, 0xbe, 0xf8, 0xc0, 0x4d, 0xbf, 0x00, 0xa7, + 0x5b, 0x3e, 0xce, 0x0c, 0xbf, 0xbe, 0x5e, 0xa5, 0x4d, 0xbf, 0xb6, 0x17, 0xa8, 0x3e, 0xc3, 0xdb, 0xbb, 0xbe, 0xd4, 0x27, 0x62, 0xbf, 0xdc, 0x15, 0xfd, 0x3e, + 0x98, 0x52, 0xc6, 0xbe, 0xb5, 0x34, 0x57, 0xbf, 0x17, 0x06, 0xf9, 0x3e, 0x54, 0x45, 0xc9, 0xbe, 0x78, 0xec, 0x56, 0xbf, 0xf7, 0xa0, 0xed, 0x3e, 0x7c, 0xff, + 0xc1, 0xbe, 0x14, 0x77, 0x63, 0xbf, 0xf7, 0xa1, 0xea, 0x3e, 0x23, 0x46, 0xc5, 0xbe, 0x48, 0x64, 0x63, 0xbf, 0x59, 0x23, 0xe8, 0x3e, 0x17, 0x00, 0xc2, 0xbe, + 0xe8, 0x8e, 0x5d, 0xbf, 0x3b, 0xa0, 0xc9, 0x3e, 0x3d, 0xfc, 0xba, 0xbe, 0x7c, 0x5c, 0x6b, 0xbf, 0xde, 0x1f, 0xc9, 0x3e, 0xa3, 0xb8, 0xbe, 0xbe, 0x31, 0xcc, + 0x6a, 0xbf, 0x42, 0x04, 0xe5, 0x3e, 0x86, 0x4b, 0xc4, 0xbe, 0x82, 0x8a, 0x5d, 0xbf, 0xad, 0x7e, 0xc7, 0x3e, 0x81, 0x60, 0xbb, 0xbe, 0x46, 0xe8, 0x68, 0xbf, + 0xd9, 0xe7, 0xc6, 0x3e, 0x66, 0x6a, 0xc0, 0xbe, 0x98, 0x45, 0x68, 0xbf, 0x7b, 0xc7, 0x4a, 0xbf, 0xa0, 0xd0, 0x3d, 0xbd, 0x6a, 0x5e, 0xe8, 0x3d, 0x81, 0xcf, + 0x4a, 0xbf, 0x60, 0xa0, 0x68, 0xbd, 0x52, 0x1d, 0x9d, 0x3d, 0xa0, 0xb3, 0x47, 0xbf, 0x80, 0xac, 0xcd, 0xbc, 0xb8, 0x37, 0x47, 0x3d, 0xf6, 0xca, 0x46, 0xbf, + 0x00, 0xe6, 0x62, 0xba, 0x4e, 0xd4, 0x02, 0x3e, 0xb2, 0xbf, 0x3b, 0xbf, 0xb9, 0x35, 0xf0, 0xbe, 0x33, 0xed, 0x29, 0xbd, 0xe9, 0xbd, 0x32, 0xbf, 0x08, 0x1d, + 0x24, 0xbf, 0x3e, 0xbb, 0x75, 0x3d, 0x08, 0x76, 0x39, 0xbf, 0x39, 0xf2, 0x10, 0xbf, 0xf5, 0x68, 0x1a, 0x3e, 0xae, 0xad, 0x29, 0xbf, 0xf2, 0x31, 0x38, 0xbf, + 0x02, 0x25, 0x30, 0x3e, 0x4b, 0x7f, 0x27, 0xbf, 0xf6, 0x40, 0x3d, 0xbf, 0xbf, 0x9e, 0xf4, 0x3d, 0xd0, 0xf1, 0x2a, 0xbf, 0x74, 0x25, 0x41, 0xbf, 0xc9, 0x5c, + 0xbc, 0x3d, 0xd6, 0x72, 0xe7, 0xbe, 0x33, 0x79, 0x8c, 0xbe, 0x7e, 0xd0, 0x67, 0xbf, 0xd8, 0x3c, 0x19, 0xbe, 0xe2, 0x9a, 0x9c, 0xbe, 0xe3, 0x52, 0x74, 0xbf, + 0xb1, 0xdf, 0x82, 0xbd, 0xe1, 0x91, 0xa0, 0xbe, 0xfa, 0x21, 0x75, 0xbf, 0x2d, 0xde, 0x69, 0xbd, 0xd1, 0x86, 0x87, 0xbe, 0xcc, 0x91, 0x7f, 0xbf, 0xcd, 0x6e, + 0x7e, 0x32, 0x94, 0x1c, 0x9e, 0xbe, 0x96, 0xbd, 0x74, 0xbf, 0x9a, 0x86, 0x02, 0x33, 0xfc, 0x58, 0x85, 0xbe, 0x4e, 0xca, 0x7d, 0xbf, 0x93, 0x92, 0xb2, 0xbe, + 0x24, 0x16, 0x9a, 0xbe, 0x60, 0x5e, 0x69, 0xbf, 0xea, 0xce, 0xea, 0xbe, 0x24, 0x45, 0x3d, 0xbf, 0x52, 0xf6, 0x39, 0xbf, 0xdc, 0x42, 0x1f, 0xbf, 0x91, 0x79, + 0x3b, 0xbf, 0xb6, 0xd6, 0x0b, 0xbf, 0x55, 0x14, 0x1f, 0xbf, 0x34, 0xa1, 0x29, 0xbf, 0xc0, 0x55, 0x19, 0xbf, 0xad, 0xb8, 0x73, 0xbe, 0x79, 0x53, 0xaa, 0xbf, + 0xb7, 0xe8, 0x18, 0xbf, 0x9b, 0xb9, 0x5a, 0xbe, 0x73, 0x31, 0xa3, 0xbf, 0xd2, 0xad, 0x1a, 0xbf, 0x04, 0x81, 0x9a, 0xbe, 0x62, 0x48, 0xa0, 0xbf, 0x56, 0xb3, + 0x0c, 0xbf, 0xfc, 0x3d, 0xac, 0xbe, 0xa5, 0xe6, 0x98, 0xbf, 0xce, 0x4a, 0x09, 0xbf, 0x6f, 0x3e, 0xd4, 0xbe, 0xba, 0x8b, 0xa5, 0xbf, 0x7b, 0xa1, 0xd7, 0xbe, + 0x3d, 0xbb, 0x9f, 0xbe, 0x05, 0xf7, 0xb7, 0xbf, 0x76, 0x79, 0xf4, 0xbe, 0x32, 0x15, 0x93, 0xbe, 0x20, 0x6a, 0xbf, 0xbf, 0x8c, 0x77, 0xd7, 0xbe, 0x66, 0x19, + 0xb3, 0xbe, 0x42, 0x84, 0xb9, 0xbf, 0xaf, 0xa1, 0xab, 0xbe, 0x49, 0xb7, 0xe4, 0xbe, 0x2a, 0x64, 0xa1, 0xbf, 0xfa, 0x5c, 0xc6, 0xbe, 0x6e, 0x54, 0xf2, 0xbe, + 0xef, 0xbb, 0xa4, 0xbf, 0x9c, 0xb2, 0x83, 0xbe, 0xb5, 0x34, 0xe1, 0xbe, 0x69, 0x65, 0xac, 0xbf, 0x57, 0x76, 0x51, 0xbe, 0xe8, 0xa1, 0xf7, 0xbe, 0x2a, 0xa0, + 0x9b, 0xbf, 0xa2, 0x2a, 0xae, 0xbe, 0xfe, 0x60, 0xf6, 0xbe, 0xa4, 0xdf, 0x92, 0xbf, 0x86, 0x15, 0xde, 0xbe, 0xbb, 0x2c, 0xc9, 0xbe, 0x7a, 0xb2, 0x95, 0xbf, + 0x33, 0x5a, 0x04, 0xbf, 0x92, 0x44, 0xd8, 0xbe, 0x2e, 0x77, 0x91, 0xbf, 0xbf, 0xc2, 0x04, 0xbf, 0xae, 0x1d, 0xe9, 0xbe, 0x38, 0x6d, 0x8f, 0xbf, 0x12, 0xa8, + 0xfa, 0xbe, 0x5d, 0xac, 0xc8, 0xbe, 0x34, 0x47, 0x8f, 0xbf, 0xdd, 0x77, 0x0f, 0xbf, 0x47, 0x03, 0xe8, 0xbe, 0x67, 0xdc, 0x8b, 0xbf, 0xa4, 0xd1, 0x01, 0xbf, + 0x55, 0x29, 0xe3, 0xbe, 0xb9, 0x4d, 0x87, 0xbf, 0xb6, 0xfc, 0x0e, 0xbf, 0x37, 0x85, 0xba, 0xbe, 0xb8, 0xc4, 0x8a, 0xbf, 0x21, 0x06, 0x19, 0xbf, 0xef, 0xd9, + 0xd6, 0xbe, 0xb1, 0x95, 0x83, 0xbf, 0xe4, 0x9d, 0x1a, 0xbf, 0x78, 0xd9, 0xf4, 0xbe, 0x9c, 0x74, 0x6d, 0xbf, 0x90, 0xd2, 0x16, 0xbf, 0x6a, 0xdf, 0xef, 0xbe, + 0x88, 0xe5, 0x6b, 0xbf, 0x27, 0xbf, 0x1a, 0xbf, 0x79, 0x70, 0xfe, 0xbe, 0xc6, 0xb2, 0x74, 0xbf, 0xb8, 0x8c, 0x09, 0xbf, 0xb7, 0x55, 0x02, 0xbf, 0xbd, 0x27, + 0x69, 0xbf, 0x31, 0x89, 0x12, 0xbf, 0x42, 0x6b, 0xe1, 0xbe, 0x43, 0xc1, 0x7d, 0xbf, 0x2c, 0xdc, 0x18, 0xbf, 0xab, 0x87, 0xff, 0xbe, 0x98, 0x66, 0x63, 0xbf, + 0xbc, 0x95, 0x1c, 0xbf, 0x01, 0x5f, 0x41, 0xbf, 0x48, 0xa9, 0x79, 0xbe, 0x39, 0x40, 0x93, 0xbd, 0x11, 0x16, 0x40, 0xbf, 0xb2, 0xf7, 0x99, 0xbe, 0xdf, 0xa6, + 0x87, 0xbd, 0xb9, 0xe3, 0x3c, 0xbf, 0x94, 0x82, 0x7a, 0xbe, 0x41, 0xf4, 0x9f, 0xbe, 0xae, 0x34, 0x3e, 0xbf, 0x54, 0x27, 0x56, 0xbe, 0x48, 0xa0, 0x54, 0xbe, + 0xc1, 0xf1, 0x42, 0xbf, 0x04, 0x0b, 0x36, 0xbe, 0x0b, 0xa6, 0xa4, 0xbd, 0x35, 0xa6, 0x44, 0xbf, 0x52, 0xf7, 0x61, 0xbe, 0x88, 0x87, 0x0f, 0xbc, 0xa2, 0x98, + 0x43, 0xbf, 0x4a, 0x17, 0x8c, 0xbe, 0x58, 0x3f, 0x00, 0xbc, 0xa1, 0x52, 0x46, 0xbf, 0x2c, 0x85, 0x26, 0xbe, 0x00, 0x6d, 0xf5, 0xbb, 0x9e, 0x5c, 0x4d, 0xbe, + 0x52, 0x34, 0x86, 0xbf, 0xe7, 0x59, 0x3c, 0xbf, 0xcc, 0x7e, 0xba, 0xbe, 0x39, 0xa5, 0x7a, 0xbf, 0x39, 0xfe, 0x29, 0xbf, 0x32, 0x8c, 0x8f, 0xbe, 0xa7, 0x8c, + 0x8a, 0xbf, 0xd0, 0xe6, 0x24, 0xbf, 0xa2, 0xea, 0x9e, 0xbe, 0x0e, 0x6b, 0x8b, 0xbf, 0xfe, 0x5f, 0x1c, 0xbf, 0xef, 0xf7, 0x80, 0xbe, 0x26, 0xd5, 0x8c, 0xbf, + 0x12, 0x77, 0x2d, 0xbf, 0xbd, 0x00, 0x53, 0xbe, 0x2e, 0xf5, 0x8d, 0xbf, 0x70, 0x60, 0x3e, 0xbf, 0x0e, 0x2e, 0x1f, 0xbe, 0x3e, 0x26, 0xa1, 0xbf, 0xcc, 0xe3, + 0x24, 0xbf, 0x64, 0x00, 0x1e, 0xbe, 0xbe, 0x38, 0x9e, 0xbf, 0xed, 0x9c, 0x32, 0xbf, 0x8f, 0x22, 0x8b, 0xbe, 0xd5, 0xdc, 0x5d, 0xbf, 0x2a, 0x89, 0x3d, 0xbf, + 0x3e, 0x30, 0x22, 0xbe, 0xdf, 0x6e, 0x85, 0xbf, 0x88, 0x27, 0x44, 0xbf, 0x29, 0x35, 0x66, 0xbe, 0x9a, 0x41, 0x45, 0xbf, 0xf5, 0x6b, 0x4f, 0xbf, 0xa5, 0x17, + 0x35, 0xbe, 0x63, 0xd0, 0x56, 0xbf, 0x65, 0xfc, 0x49, 0xbf, 0x8e, 0xef, 0x86, 0xbd, 0x26, 0x85, 0x84, 0xbf, 0x36, 0x94, 0x4c, 0xbf, 0xcd, 0xed, 0x5b, 0xbd, + 0xe4, 0x26, 0x8b, 0xbf, 0xf6, 0x80, 0x50, 0xbf, 0xcb, 0xd5, 0xdd, 0xbc, 0x37, 0xc8, 0x8c, 0xbf, 0x10, 0xa2, 0x4f, 0xbf, 0x1c, 0x71, 0x1a, 0xbd, 0x16, 0xc3, + 0x84, 0xbf, 0xd0, 0x98, 0x4b, 0xbf, 0x2d, 0xc3, 0xa1, 0xbd, 0x36, 0x42, 0x8b, 0xbf, 0xd0, 0x68, 0x4f, 0xbf, 0x3b, 0xb5, 0xb1, 0xbd, 0xcf, 0x86, 0x84, 0xbf, + 0x0b, 0x14, 0x4d, 0xbf, 0xc1, 0x09, 0x43, 0xb4, 0x34, 0xfa, 0x8c, 0xbf, 0xc2, 0x6a, 0x4d, 0xbf, 0x7a, 0xbb, 0x35, 0xb4, 0xc2, 0x18, 0x85, 0xbf, 0x82, 0x27, + 0x4b, 0xbf, 0x2a, 0x22, 0x86, 0xbd, 0xbc, 0x50, 0x77, 0xbf, 0xd7, 0xed, 0x4d, 0xbf, 0x1e, 0xea, 0x10, 0xbd, 0xc6, 0x2c, 0x7a, 0xbf, 0x8e, 0xe0, 0x4b, 0xbf, + 0x8d, 0xb4, 0x2a, 0xb4, 0x85, 0x77, 0x7f, 0xbf, 0xd6, 0x0e, 0x4d, 0xbf, 0xa1, 0x1f, 0x7d, 0xbd, 0x73, 0x3a, 0x6e, 0xbf, 0x65, 0x4e, 0x54, 0xbf, 0x06, 0x7f, + 0x0a, 0xbd, 0x22, 0xf2, 0x73, 0xbf, 0x80, 0xcb, 0x52, 0xbf, 0x33, 0x09, 0xcd, 0xbd, 0x7a, 0xec, 0x69, 0xbf, 0x02, 0x5b, 0x53, 0xbf, 0xd4, 0xb3, 0x1d, 0xb4, + 0x25, 0xcc, 0x74, 0xbf, 0xcb, 0x5c, 0x52, 0xbf, 0x1c, 0x4d, 0x75, 0xbd, 0xd2, 0x07, 0x6b, 0xbf, 0xf4, 0xaa, 0x57, 0xbf, 0x09, 0xed, 0x37, 0xbd, 0x70, 0x24, + 0x6f, 0xbf, 0xf9, 0x63, 0x5c, 0xbf, 0x1d, 0xb9, 0xb2, 0xbe, 0xbb, 0xb5, 0x86, 0xbf, 0x3f, 0x68, 0x21, 0xbf, 0xd9, 0x0f, 0xc9, 0xbe, 0x86, 0xc0, 0x80, 0xbf, + 0x03, 0xc4, 0x22, 0xbf, 0x4f, 0x44, 0x46, 0xbd, 0xc2, 0x2f, 0x60, 0xbf, 0x9d, 0x5f, 0x60, 0xbf, 0xcc, 0xb3, 0x2f, 0xbd, 0x96, 0xab, 0x60, 0xbf, 0xa1, 0x2b, + 0x6a, 0xbf, 0xfe, 0xcb, 0x50, 0xbd, 0x18, 0x9a, 0x5f, 0xbf, 0x26, 0x40, 0x6e, 0xbf, 0x6e, 0x84, 0x80, 0xbd, 0xe8, 0x4b, 0x5d, 0xbf, 0x25, 0xda, 0x6e, 0xbf, + 0x56, 0x2f, 0x98, 0xbd, 0x37, 0xa4, 0x5a, 0xbf, 0x26, 0xf5, 0x6e, 0xbf, 0x67, 0x4d, 0xc1, 0xbd, 0xa0, 0x60, 0x57, 0xbf, 0xc6, 0x05, 0x6a, 0xbf, 0x27, 0x26, + 0xe3, 0xbd, 0x18, 0x91, 0x54, 0xbf, 0xa8, 0x66, 0x64, 0xbf, 0x44, 0x3f, 0x02, 0xbe, 0x6e, 0xdc, 0x53, 0xbf, 0x5e, 0xbb, 0x5f, 0xbf, 0x54, 0x71, 0x09, 0xbe, + 0x04, 0x66, 0x54, 0xbf, 0x5d, 0x8e, 0x5b, 0xbf, 0x15, 0x74, 0x04, 0xbe, 0xa8, 0x5c, 0x56, 0xbf, 0xc7, 0x70, 0x58, 0xbf, 0xab, 0xf8, 0xea, 0xbd, 0x1a, 0xcb, + 0x58, 0xbf, 0x66, 0xf4, 0x57, 0xbf, 0xe4, 0x9b, 0xc3, 0xbd, 0xf6, 0xc2, 0x5a, 0xbf, 0x12, 0x2b, 0x5b, 0xbf, 0x5b, 0xc8, 0x4b, 0xbd, 0xb0, 0x5a, 0x6c, 0xbf, + 0xb7, 0x12, 0x5e, 0xbf, 0xfe, 0x68, 0x32, 0xbd, 0x3e, 0xf6, 0x6c, 0xbf, 0xcc, 0x6c, 0x69, 0xbf, 0xda, 0xb0, 0x71, 0xbd, 0x82, 0xed, 0x5c, 0xbf, 0x4e, 0xef, + 0x5c, 0xbf, 0xd2, 0x21, 0x5d, 0xbd, 0x08, 0xbf, 0x6b, 0xbf, 0x1f, 0x2c, 0x6e, 0xbf, 0x52, 0x4c, 0x8b, 0xbd, 0xaa, 0x1d, 0x69, 0xbf, 0x33, 0xd5, 0x6e, 0xbf, + 0x80, 0xa2, 0xa9, 0xbd, 0x34, 0x16, 0x66, 0xbf, 0xb4, 0xf7, 0x6e, 0xbf, 0xa1, 0x32, 0xd1, 0xbd, 0x5b, 0x50, 0x62, 0xbf, 0xe3, 0x0d, 0x69, 0xbf, 0xdd, 0x59, + 0xf5, 0xbd, 0x90, 0x1d, 0x5f, 0xbf, 0xec, 0x89, 0x62, 0xbf, 0x2d, 0xb5, 0x0e, 0xbe, 0xa4, 0x59, 0x5e, 0xbf, 0x0e, 0x46, 0x5d, 0xbf, 0x9d, 0x67, 0x16, 0xbe, + 0x66, 0xeb, 0x5e, 0xbf, 0x1d, 0x7a, 0x58, 0xbf, 0xb1, 0x50, 0x11, 0xbe, 0x70, 0x16, 0x61, 0xbf, 0xe8, 0xcc, 0x54, 0xbf, 0xdd, 0x24, 0x01, 0xbe, 0xed, 0xc7, + 0x63, 0xbf, 0xa7, 0xfa, 0x53, 0xbf, 0x43, 0x27, 0xd3, 0xbd, 0xe4, 0x20, 0x66, 0xbf, 0x22, 0x10, 0x58, 0xbf, 0xa5, 0x6c, 0x7d, 0xbd, 0xd0, 0x9d, 0x68, 0xbf, + 0x20, 0x1c, 0x5a, 0xbf, 0xb6, 0xa4, 0x89, 0xbd, 0x88, 0x80, 0x6a, 0xbf, 0x0d, 0x42, 0x70, 0xbf, 0x56, 0x99, 0xae, 0xbd, 0xce, 0xee, 0x66, 0xbf, 0xc7, 0x58, + 0x70, 0xbf, 0x5d, 0xdf, 0xd9, 0xbd, 0xcd, 0xf6, 0x62, 0xbf, 0x3c, 0xd8, 0x69, 0xbf, 0xa6, 0x2b, 0xfc, 0xbd, 0x04, 0xce, 0x5f, 0xbf, 0x3e, 0x7b, 0x63, 0xbf, + 0x63, 0x18, 0x13, 0xbe, 0xa2, 0xee, 0x5e, 0xbf, 0x25, 0xf6, 0x5d, 0xbf, 0x62, 0xd8, 0x1b, 0xbe, 0x5f, 0x6f, 0x5f, 0xbf, 0xac, 0x4c, 0x58, 0xbf, 0x8f, 0xe1, + 0x16, 0xbe, 0x9e, 0xcc, 0x61, 0xbf, 0x49, 0xa2, 0x53, 0xbf, 0x87, 0xa1, 0x14, 0xb4, 0x87, 0x7c, 0x71, 0xbf, 0xc0, 0xb0, 0x5c, 0xbf, 0x63, 0x21, 0xee, 0xbd, + 0x36, 0x8b, 0x63, 0xbf, 0x5a, 0x2f, 0x6d, 0xbf, 0x21, 0x6f, 0x06, 0xbe, 0xd8, 0x09, 0x60, 0xbf, 0x03, 0x0c, 0x67, 0xbf, 0x16, 0x15, 0x20, 0xbe, 0x58, 0x81, + 0x5e, 0xbf, 0xa4, 0x88, 0x5f, 0xbf, 0x1f, 0xa4, 0x34, 0xbe, 0xbe, 0x82, 0x5d, 0xbf, 0x13, 0x55, 0x58, 0xbf, 0xee, 0x77, 0x35, 0xbe, 0xce, 0x10, 0x5e, 0xbf, + 0x64, 0xea, 0x50, 0xbf, 0xe5, 0xa8, 0x29, 0xbe, 0x7b, 0xdc, 0x60, 0xbf, 0x85, 0x58, 0x4b, 0xbf, 0xbd, 0xec, 0x37, 0x3d, 0x70, 0x24, 0x6f, 0xbf, 0xf9, 0x63, + 0x5c, 0xbf, 0x81, 0x7c, 0x21, 0xbe, 0x78, 0x89, 0x46, 0xbf, 0xe9, 0xf8, 0x67, 0xbf, 0xc7, 0xe7, 0x30, 0xbe, 0x1c, 0x38, 0x50, 0xbf, 0x1a, 0xe8, 0x67, 0xbf, + 0xaa, 0xd0, 0xe8, 0xbd, 0x28, 0x61, 0x2a, 0xbf, 0xf9, 0xb5, 0x67, 0xbf, 0x18, 0xd7, 0x22, 0xbe, 0x24, 0xf1, 0x31, 0xbf, 0xbf, 0xbb, 0x5b, 0xbf, 0xa5, 0x17, + 0x35, 0xbe, 0x16, 0xfa, 0x56, 0xbf, 0xc4, 0x3f, 0x4b, 0xbf, 0xdf, 0x5b, 0x29, 0xbe, 0xbe, 0x57, 0x61, 0xbf, 0x20, 0xf4, 0x49, 0xbf, 0x59, 0x14, 0x42, 0xbe, + 0xba, 0x39, 0x56, 0xbf, 0xee, 0x66, 0x52, 0xbf, 0xd5, 0xab, 0x0a, 0xbe, 0x1a, 0x3c, 0x69, 0xbf, 0x33, 0x9e, 0x4b, 0xbf, 0xec, 0x98, 0xbf, 0xbd, 0xdc, 0xec, + 0x27, 0xbf, 0xad, 0x94, 0x6d, 0xbf, 0x9a, 0x93, 0xc9, 0xbc, 0x4a, 0x98, 0x63, 0xbf, 0x05, 0xf4, 0x85, 0xbf, 0xb4, 0x98, 0xd8, 0xb3, 0xe8, 0xb3, 0x63, 0xbf, + 0xfd, 0xfb, 0x85, 0xbf, 0xb4, 0xa8, 0xc8, 0xb3, 0x92, 0x7b, 0x5c, 0xbf, 0xb0, 0x0a, 0x87, 0xbf, 0xdf, 0xdf, 0xeb, 0xbc, 0xee, 0xee, 0x5b, 0xbf, 0xe4, 0xea, + 0x86, 0xbf, 0x81, 0x6a, 0xea, 0xb3, 0x78, 0xb8, 0x6a, 0xbf, 0xc4, 0xeb, 0x83, 0xbf, 0x6d, 0x86, 0xb7, 0xbc, 0x15, 0x25, 0x6b, 0xbf, 0x38, 0xd8, 0x83, 0xbf, + 0x7a, 0xdf, 0xeb, 0x3c, 0xee, 0xee, 0x5b, 0xbf, 0xe4, 0xea, 0x86, 0xbf, 0x2e, 0x93, 0xc9, 0x3c, 0x4a, 0x98, 0x63, 0xbf, 0x05, 0xf4, 0x85, 0xbf, 0xe7, 0x55, + 0xbc, 0xb3, 0xc0, 0x3a, 0x56, 0xbf, 0x38, 0x60, 0x87, 0xbf, 0x41, 0xa2, 0xdd, 0xbc, 0xe2, 0xde, 0x55, 0xbf, 0xdb, 0x49, 0x87, 0xbf, 0xb7, 0xcc, 0x51, 0xbd, + 0x14, 0xef, 0x64, 0xbf, 0x1b, 0xb1, 0x84, 0xbf, 0x0f, 0x16, 0x70, 0xbd, 0x48, 0xef, 0x5a, 0xbf, 0x24, 0x1f, 0x86, 0xbf, 0x0f, 0xa8, 0x1f, 0xbd, 0x54, 0x56, + 0x69, 0xbf, 0x09, 0xef, 0x83, 0xbf, 0x65, 0xac, 0xa5, 0xbd, 0x4d, 0x80, 0x57, 0xbf, 0x76, 0x99, 0x82, 0xbf, 0xe2, 0x50, 0xfa, 0xbc, 0x03, 0xed, 0x6e, 0xbf, + 0xa3, 0xdf, 0x7b, 0xbf, 0xb1, 0x50, 0xfa, 0xbd, 0x52, 0x0a, 0x60, 0xbf, 0x12, 0x51, 0x73, 0xbf, 0x8c, 0x09, 0xbc, 0xbd, 0xdc, 0x20, 0x55, 0xbf, 0x95, 0xf1, + 0x7f, 0xbf, 0xb4, 0x1c, 0xf9, 0xbc, 0xde, 0x72, 0x3c, 0xbf, 0xa1, 0x68, 0x83, 0xbf, 0x4d, 0x58, 0x63, 0xb3, 0x56, 0x9d, 0x25, 0xbf, 0x50, 0xbf, 0x80, 0xbf, + 0x6b, 0x54, 0xff, 0xbc, 0x42, 0x9f, 0x26, 0xbf, 0x4d, 0x26, 0x80, 0xbf, 0x74, 0x37, 0x00, 0xb4, 0x40, 0xc9, 0x6e, 0xbf, 0x30, 0x64, 0x7b, 0xbf, 0x63, 0x50, + 0xfa, 0x3c, 0x03, 0xed, 0x6e, 0xbf, 0xa3, 0xdf, 0x7b, 0xbf, 0x45, 0xa0, 0xec, 0xbd, 0x50, 0x63, 0x52, 0xbf, 0x85, 0xa3, 0x76, 0xbf, 0x46, 0x60, 0x0c, 0xbe, + 0x06, 0x16, 0x5d, 0xbf, 0x5a, 0x07, 0x6d, 0xbf, 0xf2, 0xb9, 0x03, 0xbe, 0x9e, 0x7b, 0x51, 0xbf, 0xd6, 0x77, 0x71, 0xbf, 0x19, 0x81, 0x30, 0xbe, 0x6a, 0xb9, + 0x5c, 0xbf, 0xc4, 0x72, 0x63, 0xbf, 0x3e, 0x08, 0x43, 0xbe, 0xbf, 0xf6, 0x58, 0xbf, 0x1c, 0x96, 0x59, 0xbf, 0xe1, 0xa1, 0xdd, 0x3c, 0xe2, 0xde, 0x55, 0xbf, + 0xdb, 0x49, 0x87, 0xbf, 0xab, 0xcc, 0x74, 0xbd, 0xd1, 0xd7, 0x23, 0xbf, 0x4c, 0x4e, 0x77, 0xbf, 0x6c, 0x1e, 0xc7, 0xbd, 0x1f, 0xd6, 0x14, 0xbf, 0xa5, 0xa8, + 0x68, 0xbf, 0xb3, 0xb3, 0x75, 0xbd, 0xfd, 0xc0, 0x0e, 0xbf, 0xd6, 0x8a, 0x72, 0xbf, 0xf3, 0x91, 0xea, 0xbd, 0xad, 0x9d, 0x17, 0xbf, 0x52, 0x24, 0x64, 0xbf, + 0x58, 0xe6, 0xf4, 0xbc, 0xae, 0x85, 0x0c, 0xbf, 0xec, 0xdd, 0x79, 0xbf, 0x82, 0x89, 0xcd, 0xbd, 0xa0, 0x0d, 0x02, 0xbf, 0x03, 0x6f, 0x64, 0xbf, 0x6e, 0xb4, + 0x76, 0xbd, 0x34, 0x64, 0xfb, 0xbe, 0x83, 0xcd, 0x6d, 0xbf, 0xa3, 0x8e, 0xf7, 0xbd, 0x30, 0x5f, 0x04, 0xbf, 0x2b, 0xc0, 0x5f, 0xbf, 0x75, 0xe0, 0xec, 0xbc, + 0xd1, 0x2b, 0xf5, 0xbe, 0x6e, 0x71, 0x75, 0xbf, 0xb9, 0xa1, 0x85, 0xbd, 0x0d, 0xd6, 0xd9, 0xbe, 0x50, 0xf4, 0x69, 0xbf, 0x1d, 0x10, 0xe8, 0xbc, 0x6c, 0xe9, + 0xd2, 0xbe, 0x72, 0xa0, 0x6e, 0xbf, 0x67, 0xa7, 0xa7, 0xbe, 0x1e, 0xfa, 0x39, 0xbf, 0xb8, 0xf1, 0x48, 0xbf, 0x9c, 0xb0, 0x0a, 0xbf, 0x30, 0x25, 0x00, 0xbe, + 0x36, 0x9a, 0x5f, 0xbf, 0x43, 0x78, 0x47, 0xbd, 0xcb, 0x4e, 0xb5, 0xbe, 0x86, 0xf4, 0x6c, 0xbf, 0x51, 0xa3, 0x05, 0xbf, 0x2e, 0x2b, 0x8a, 0xbe, 0xcc, 0xba, + 0x5c, 0xbf, 0x75, 0xb1, 0xf2, 0xbe, 0xf8, 0xc1, 0xa5, 0xbe, 0x0b, 0xb2, 0x51, 0xbf, 0xe5, 0x18, 0xd1, 0xbe, 0x2e, 0x58, 0xa1, 0xbe, 0xc4, 0x48, 0x5a, 0xbf, + 0x1a, 0xc3, 0x45, 0x33, 0xc0, 0xee, 0x4c, 0xbe, 0x28, 0x0a, 0x81, 0xbf, 0x21, 0xf7, 0x68, 0xbe, 0x74, 0xff, 0xcb, 0xbd, 0x00, 0x86, 0x82, 0xbf, 0x67, 0xb2, + 0x91, 0x33, 0x9c, 0x7e, 0xe0, 0xbd, 0x90, 0xa9, 0x82, 0xbf, 0x62, 0x52, 0xb2, 0xbe, 0x8c, 0xe5, 0xf8, 0xbd, 0x39, 0x0b, 0x78, 0xbf, 0xdf, 0x21, 0xe6, 0xbe, + 0x18, 0xc8, 0x0c, 0xbe, 0xb1, 0x6a, 0x6d, 0xbf, 0xb9, 0x18, 0xa5, 0xbe, 0x8d, 0x30, 0xbb, 0xbe, 0x8d, 0x0c, 0x5f, 0xbf, 0x2f, 0x8f, 0xcc, 0xbe, 0xc1, 0x70, + 0xb7, 0xbe, 0xab, 0x0c, 0x5d, 0xbf, 0x94, 0xd3, 0xc9, 0xbe, 0x22, 0xf7, 0xb4, 0xbe, 0x08, 0xef, 0x57, 0xbf, 0xbc, 0x8e, 0xa4, 0xbe, 0x1f, 0xa5, 0xb7, 0xbe, + 0xbe, 0x57, 0x5a, 0xbf, 0x2c, 0xe2, 0xa4, 0xbe, 0xab, 0x69, 0xaf, 0xbe, 0x08, 0x6d, 0x5f, 0xbf, 0x91, 0xe6, 0xcd, 0xbe, 0x9b, 0xf4, 0xad, 0xbe, 0x12, 0x4a, + 0x5c, 0xbf, 0x81, 0xa0, 0xe8, 0xbe, 0xb0, 0xee, 0xbb, 0xbe, 0x59, 0x66, 0x53, 0xbf, 0x8d, 0x50, 0xe4, 0xbe, 0xf2, 0xee, 0xb7, 0xbe, 0x8a, 0xff, 0x4f, 0xbf, + 0x8d, 0x10, 0xca, 0xbe, 0x40, 0x49, 0xb3, 0xbe, 0x7b, 0x3a, 0x57, 0xbf, 0x91, 0xa5, 0x93, 0xbe, 0xbf, 0x43, 0xbd, 0xbe, 0x73, 0xdc, 0x5b, 0xbf, 0xc0, 0x5b, + 0x93, 0xbe, 0x2a, 0xc5, 0xb9, 0xbe, 0x7c, 0x84, 0x57, 0xbf, 0xc8, 0x14, 0xc7, 0xbe, 0xc0, 0x59, 0xe6, 0xbe, 0x3d, 0x2c, 0x4f, 0xbf, 0xcb, 0xd6, 0xc9, 0xbe, + 0x32, 0x54, 0xe9, 0xbe, 0x1b, 0x66, 0x52, 0xbf, 0xc8, 0x89, 0xa6, 0xbe, 0x8c, 0x92, 0xeb, 0xbe, 0xd1, 0x98, 0x53, 0xbf, 0xb8, 0xb7, 0xa3, 0xbe, 0xe6, 0x9f, + 0xe7, 0xbe, 0xb5, 0x98, 0x4f, 0xbf, 0xab, 0xf3, 0xec, 0xbe, 0x1c, 0xa7, 0xde, 0xbe, 0xb7, 0x36, 0x4a, 0xbf, 0xd9, 0x5d, 0xe9, 0xbe, 0x36, 0xfc, 0xdc, 0xbe, + 0xf5, 0x76, 0x47, 0xbf, 0x37, 0xc8, 0xcb, 0xbe, 0x50, 0xe8, 0xf5, 0xbe, 0x41, 0x01, 0x4d, 0xbf, 0x3a, 0x7d, 0xa2, 0xbe, 0x79, 0xfa, 0xf4, 0xbe, 0xbd, 0x19, + 0x4f, 0xbf, 0xd1, 0xa4, 0x7b, 0xbe, 0xba, 0x25, 0xdc, 0xbe, 0x32, 0xa4, 0x4d, 0xbf, 0x78, 0x71, 0x7b, 0xbe, 0x46, 0xa9, 0xd9, 0xbe, 0x54, 0x56, 0x4a, 0xbf, + 0xc8, 0xb3, 0xa2, 0xbe, 0x42, 0x72, 0xe7, 0xbe, 0x47, 0x79, 0x4e, 0xbf, 0x74, 0x2e, 0xc7, 0xbe, 0xdb, 0x2b, 0xe6, 0xbe, 0x9f, 0x24, 0x4e, 0xbf, 0xbf, 0x9d, + 0xed, 0xbe, 0x60, 0x68, 0xb3, 0xbe, 0x70, 0x21, 0x53, 0xbf, 0x11, 0xa4, 0xfa, 0xbe, 0x9c, 0x69, 0xc5, 0xbe, 0xf4, 0x62, 0x47, 0xbf, 0xef, 0x88, 0xf8, 0xbe, + 0x7e, 0xc0, 0xc0, 0xbe, 0x04, 0x42, 0x44, 0xbf, 0x8a, 0x64, 0xe5, 0xbe, 0x05, 0x51, 0xb6, 0xbe, 0x8a, 0x0e, 0x4f, 0xbf, 0x65, 0xb3, 0xf9, 0xbe, 0x94, 0x07, + 0xd3, 0xbe, 0xec, 0xf5, 0x42, 0xbf, 0x40, 0x98, 0xf7, 0xbe, 0x3c, 0x10, 0xd1, 0xbe, 0x3b, 0x2f, 0x41, 0xbf, 0x29, 0xae, 0xff, 0xbe, 0x0a, 0x24, 0xc8, 0xbe, + 0xf5, 0x5d, 0x39, 0xbf, 0x32, 0x44, 0x00, 0xbf, 0xaa, 0x73, 0xde, 0xbe, 0x0b, 0x3d, 0x40, 0xbf, 0x2f, 0xb0, 0xf9, 0xbe, 0xea, 0x6e, 0xd0, 0xbe, 0x97, 0xbf, + 0x3f, 0xbf, 0x59, 0x06, 0x01, 0xbf, 0x26, 0x46, 0xc7, 0xbe, 0x80, 0xa0, 0x37, 0xbf, 0x5c, 0xcf, 0xef, 0xbe, 0x93, 0x9f, 0xea, 0xbe, 0x9d, 0x7e, 0x45, 0xbf, + 0xb8, 0x8e, 0xea, 0xbe, 0xaf, 0x96, 0xdc, 0xbe, 0xd4, 0x3b, 0x46, 0xbf, 0x8e, 0x5a, 0x53, 0xbe, 0x64, 0x52, 0xd5, 0xbe, 0x66, 0x0a, 0x47, 0xbf, 0x01, 0xfb, + 0x76, 0xbe, 0x36, 0x05, 0xd9, 0xbe, 0xb8, 0x05, 0x49, 0xbf, 0x75, 0xce, 0x42, 0xbe, 0xce, 0x33, 0xca, 0xbe, 0xa2, 0x06, 0x47, 0xbf, 0x2d, 0xa3, 0x4d, 0xbe, + 0x51, 0xbb, 0xd4, 0xbe, 0x2d, 0xdb, 0x45, 0xbf, 0x5d, 0x44, 0x4f, 0xbe, 0x08, 0x2b, 0xc6, 0xbe, 0x55, 0xfd, 0x4b, 0xbf, 0xb1, 0x2a, 0x4f, 0xbe, 0x3e, 0xef, + 0xc3, 0xbe, 0xa8, 0x12, 0x49, 0xbf, 0x4c, 0x90, 0x3c, 0xbe, 0x2e, 0x73, 0xc9, 0xbe, 0x7c, 0x11, 0x46, 0xbf, 0xcf, 0x62, 0x44, 0xbe, 0x4e, 0xea, 0xbb, 0xbe, + 0xe0, 0xbb, 0x4c, 0xbf, 0x32, 0x2f, 0x82, 0xbe, 0x29, 0xd9, 0xbe, 0xbe, 0xe3, 0xb5, 0x57, 0xbf, 0x92, 0x25, 0x82, 0xbe, 0xc2, 0x93, 0xbb, 0xbe, 0x68, 0xb1, + 0x53, 0xbf, 0x38, 0x53, 0x49, 0xbe, 0x75, 0xd7, 0xc2, 0xbe, 0xb7, 0xed, 0x47, 0xbf, 0x22, 0x9f, 0x7c, 0xbe, 0xfd, 0x08, 0xb5, 0xbe, 0xa3, 0x0d, 0x57, 0xbf, + 0xd8, 0x10, 0x80, 0xbe, 0xc6, 0x0c, 0xba, 0xbe, 0x83, 0xd2, 0x52, 0xbf, 0x78, 0x9a, 0x91, 0xbe, 0xe2, 0x04, 0xb2, 0xbe, 0x37, 0x47, 0x5b, 0xbf, 0x9b, 0x77, + 0xff, 0xbe, 0xfc, 0x8e, 0xbc, 0xbe, 0x21, 0x5a, 0x46, 0xbf, 0x1d, 0x3e, 0xfb, 0xbe, 0xf2, 0x96, 0xbf, 0xbe, 0x4b, 0x03, 0x43, 0xbf, 0x7a, 0x7a, 0x6d, 0xbe, + 0xea, 0x86, 0xf5, 0xbe, 0x0d, 0xf7, 0x46, 0xbf, 0x9f, 0xf8, 0x6a, 0xbe, 0x5b, 0x1b, 0x05, 0xbf, 0x75, 0xcd, 0x4b, 0xbf, 0xd5, 0x0e, 0x29, 0xbe, 0x41, 0x7a, + 0xfc, 0xbe, 0x79, 0xd8, 0x50, 0xbf, 0x5e, 0xae, 0x9f, 0xbe, 0x6e, 0x26, 0xfc, 0xbe, 0x7a, 0x22, 0x4b, 0xbf, 0x6f, 0x0b, 0xa0, 0xbe, 0x86, 0x78, 0xff, 0xbe, + 0x5c, 0x78, 0x4a, 0xbf, 0x86, 0x60, 0x08, 0xbf, 0xb4, 0xf8, 0xfe, 0xbe, 0x0a, 0x92, 0x37, 0xbf, 0x02, 0x6f, 0x13, 0xbf, 0xdd, 0x35, 0xea, 0xbe, 0x19, 0xf8, + 0x30, 0xbf, 0xf1, 0xc8, 0xef, 0xbe, 0xe6, 0x0d, 0xf5, 0xbe, 0x5d, 0x0a, 0x41, 0xbf, 0xe1, 0xcc, 0xf0, 0xbe, 0x77, 0x86, 0xf8, 0xbe, 0xe7, 0x30, 0x40, 0xbf, + 0x6d, 0x2c, 0xcd, 0xbe, 0xc3, 0xc5, 0xff, 0xbe, 0xbf, 0xac, 0x48, 0xbf, 0x0d, 0x4a, 0xce, 0xbe, 0xb9, 0xa5, 0x01, 0xbf, 0x8f, 0xef, 0x47, 0xbf, 0xca, 0x14, + 0xa4, 0xbe, 0x5d, 0x9f, 0x0a, 0xbf, 0xcb, 0xbe, 0x4a, 0xbf, 0xa9, 0x3c, 0xd6, 0xbe, 0xea, 0xe7, 0x0d, 0xbf, 0x90, 0xcd, 0x45, 0xbf, 0xbf, 0xd1, 0xfb, 0xbe, + 0x98, 0x8d, 0x07, 0xbf, 0x48, 0x62, 0x3d, 0xbf, 0xe2, 0x8d, 0x76, 0xbe, 0xdc, 0x55, 0xab, 0xbe, 0xc7, 0x7a, 0x53, 0xbf, 0x38, 0x74, 0x76, 0xbe, 0x12, 0xed, + 0xa6, 0xbe, 0x02, 0x78, 0x52, 0xbf, 0xed, 0xd9, 0x90, 0xbe, 0x4b, 0xff, 0xa6, 0xbe, 0x16, 0x40, 0x58, 0xbf, 0xe5, 0x6c, 0xa6, 0xbe, 0x28, 0x39, 0xa5, 0xbe, + 0x14, 0x96, 0x5c, 0xbf, 0xd6, 0x70, 0xa7, 0xbe, 0x2a, 0xe8, 0xa0, 0xbe, 0xb0, 0x97, 0x5b, 0xbf, 0x14, 0x57, 0x91, 0xbe, 0xda, 0xa2, 0xa2, 0xbe, 0x47, 0x40, + 0x57, 0xbf, 0xd3, 0xd0, 0xce, 0xbe, 0x19, 0x3e, 0xa4, 0xbe, 0x24, 0x15, 0x59, 0xbf, 0x75, 0xda, 0xce, 0xbe, 0x12, 0xcf, 0xa0, 0xbe, 0xca, 0xd9, 0x57, 0xbf, + 0x61, 0x1c, 0xf0, 0xbe, 0x48, 0xf5, 0xa8, 0xbe, 0xa5, 0xc7, 0x50, 0xbf, 0x2e, 0x05, 0xef, 0xbe, 0xdb, 0xa9, 0xa5, 0xbe, 0xfe, 0xeb, 0x4f, 0xbf, 0x09, 0x6d, + 0x01, 0xbf, 0x6c, 0xc1, 0xb2, 0xbe, 0xae, 0xc8, 0x43, 0xbf, 0x26, 0x1f, 0x02, 0xbf, 0xba, 0x2e, 0xae, 0xbe, 0x18, 0xa6, 0x42, 0xbf, 0x69, 0x2b, 0x73, 0xbe, + 0x4a, 0x16, 0xa6, 0xbe, 0x79, 0x1e, 0x55, 0xbf, 0xb3, 0xca, 0x04, 0xbf, 0x06, 0xbf, 0xac, 0xbe, 0x96, 0x5f, 0x43, 0xbf, 0x41, 0xc1, 0x0d, 0xbf, 0xe8, 0x49, + 0xab, 0xbe, 0xe9, 0x0a, 0x3e, 0xbf, 0x23, 0xc3, 0x09, 0xbf, 0x60, 0x4c, 0x9d, 0xbe, 0xa5, 0xea, 0x48, 0xbf, 0x84, 0x3a, 0x18, 0xbf, 0x9a, 0xc1, 0xcd, 0xbe, + 0xd0, 0xa7, 0x2e, 0xbf, 0x02, 0xea, 0x1b, 0xbf, 0x02, 0xcb, 0xf5, 0xbe, 0xcd, 0x11, 0x2a, 0xbf, 0xe0, 0xc9, 0x10, 0xbf, 0x6a, 0xd8, 0x08, 0xbf, 0xa9, 0xe3, + 0x32, 0xbf, 0x3a, 0x67, 0x27, 0xbe, 0xbb, 0x9d, 0x0a, 0xbf, 0x82, 0xee, 0x56, 0xbf, 0x9c, 0x20, 0x6d, 0xbe, 0x71, 0xe0, 0x0f, 0xbf, 0x1d, 0x83, 0x4f, 0xbf, + 0x96, 0x71, 0xa8, 0xbe, 0x00, 0xeb, 0x16, 0xbf, 0x00, 0xf4, 0x4a, 0xbf, 0x45, 0xed, 0x03, 0xbf, 0xfa, 0x7a, 0x13, 0xbf, 0xd9, 0xc9, 0x3a, 0xbf, 0x77, 0x14, + 0x1d, 0xbf, 0xb6, 0x6b, 0xb5, 0xbe, 0xbc, 0xb4, 0x32, 0xbf, 0xf0, 0xe4, 0xe5, 0xbe, 0x57, 0xbd, 0x0b, 0xbf, 0x08, 0xbd, 0x4d, 0x3f, 0xea, 0x76, 0xdb, 0xbe, + 0xa9, 0x91, 0x31, 0xbf, 0x72, 0x37, 0x56, 0x3f, 0xcd, 0xa4, 0x07, 0xbf, 0x78, 0xec, 0x38, 0xbf, 0x46, 0xd7, 0x43, 0x3f, 0x38, 0xf6, 0x0d, 0xbf, 0x25, 0x1e, + 0x16, 0xbf, 0xa7, 0xa4, 0x36, 0x3f, 0x69, 0x24, 0x9f, 0xbe, 0x72, 0x86, 0x02, 0xbf, 0x8a, 0xe9, 0x60, 0x3f, 0x92, 0xb6, 0x9d, 0xbe, 0x58, 0x07, 0x2a, 0xbf, + 0xdc, 0xdb, 0x67, 0x3f, 0x35, 0x0e, 0xe1, 0xbe, 0xa5, 0x05, 0x53, 0xbf, 0xc2, 0x27, 0x6b, 0x3f, 0x84, 0x9d, 0x08, 0xbf, 0x93, 0x9f, 0x5b, 0xbf, 0x30, 0x2e, + 0x57, 0x3f, 0x78, 0x92, 0x11, 0xbf, 0x8e, 0xe8, 0x44, 0xbf, 0x2e, 0xf0, 0x30, 0x3f, 0x2b, 0xeb, 0x16, 0xbf, 0x4a, 0x6e, 0x20, 0xbf, 0xad, 0xc2, 0x22, 0x3f, + 0xc6, 0x27, 0xee, 0xbe, 0x82, 0xdb, 0xbd, 0xbe, 0xc6, 0xde, 0x50, 0x3f, 0xd7, 0x5e, 0x15, 0xbf, 0x3c, 0xd2, 0xd8, 0xbe, 0x33, 0x0e, 0x34, 0x3f, 0x3d, 0x42, + 0x11, 0xbf, 0xf4, 0xed, 0x77, 0xbf, 0x97, 0x8a, 0x30, 0x3f, 0x64, 0x19, 0x10, 0xbf, 0xff, 0x4a, 0x81, 0xbf, 0xec, 0x2f, 0x23, 0x3f, 0xa7, 0xd2, 0x11, 0xbf, + 0xfe, 0xd1, 0x88, 0xbf, 0x64, 0xee, 0x0a, 0x3f, 0x83, 0xbd, 0x15, 0xbf, 0x14, 0x8e, 0x69, 0xbf, 0x76, 0x5e, 0xf9, 0x3e, 0x50, 0x45, 0x13, 0xbf, 0x4f, 0xd8, + 0x68, 0xbf, 0x86, 0xfe, 0x43, 0x3f, 0x91, 0x09, 0x24, 0xbf, 0x32, 0x04, 0x3e, 0xbf, 0x70, 0x90, 0xe1, 0x3e, 0xbf, 0x0a, 0x9f, 0xbe, 0xd0, 0x6c, 0xaa, 0xbf, + 0x50, 0xa8, 0x13, 0xbd, 0x36, 0x9e, 0x7f, 0xbe, 0x7e, 0x33, 0xaf, 0xbf, 0xce, 0x11, 0x16, 0x3e, 0x59, 0x94, 0xd3, 0xbe, 0x80, 0xdf, 0xa7, 0xbf, 0x00, 0xc4, + 0xe0, 0xbd, 0x4e, 0x04, 0xe5, 0xbe, 0xa3, 0xf2, 0x9e, 0xbf, 0x14, 0x16, 0x48, 0xbd, 0x3f, 0xef, 0xba, 0xbd, 0xc3, 0xda, 0xc5, 0xbf, 0x2f, 0x09, 0x0b, 0xbf, + 0xed, 0xe7, 0xb0, 0xbd, 0xde, 0x23, 0xc8, 0xbf, 0xf5, 0x9c, 0x01, 0xbf, 0x87, 0x70, 0x3c, 0xbd, 0x72, 0x44, 0xc8, 0xbf, 0x88, 0x46, 0x03, 0xbf, 0x37, 0xf8, + 0x46, 0xbd, 0xda, 0x29, 0xc6, 0xbf, 0x6c, 0x2d, 0x0e, 0xbf, 0xf0, 0x69, 0x33, 0xbd, 0x88, 0x16, 0xc8, 0xbf, 0xfa, 0xdd, 0xee, 0xbe, 0x98, 0xe0, 0xa6, 0xbd, + 0xf4, 0x1c, 0xc8, 0xbf, 0x04, 0xa9, 0xee, 0xbe, 0xd0, 0xe7, 0xad, 0xb4, 0x88, 0x27, 0xc8, 0xbf, 0x94, 0x86, 0x03, 0xbf, 0x27, 0xba, 0xa8, 0xb4, 0xc1, 0x22, + 0xc6, 0xbf, 0x88, 0xd3, 0x0e, 0xbf, 0x6d, 0x89, 0x5e, 0xbd, 0x24, 0xd2, 0xbf, 0xbf, 0xcb, 0x50, 0x1b, 0xbf, 0x8e, 0x55, 0xef, 0xbd, 0x3d, 0x90, 0xbf, 0xbf, + 0xfc, 0x5b, 0x1a, 0xbf, 0x64, 0x35, 0x29, 0xbe, 0x11, 0x1f, 0xa5, 0xbf, 0x54, 0x6e, 0x20, 0xbf, 0x36, 0x4e, 0xc2, 0xbd, 0x94, 0xea, 0xa4, 0xbf, 0xd8, 0x16, + 0x21, 0xbf, 0xa8, 0xec, 0xa5, 0xbd, 0x93, 0x74, 0xa1, 0xbf, 0xd7, 0xd6, 0x25, 0xbf, 0x89, 0xd0, 0x3c, 0xbe, 0x2c, 0xe2, 0xa9, 0xbf, 0x01, 0x41, 0x20, 0xbf, + 0x62, 0x19, 0xe3, 0xbd, 0xb6, 0x72, 0xaa, 0xbf, 0x4c, 0x5b, 0x21, 0xbf, 0x2c, 0x2f, 0x29, 0xbd, 0xb2, 0x74, 0xa4, 0xbf, 0x96, 0x25, 0x20, 0xbf, 0x50, 0x76, + 0x21, 0xbd, 0xc1, 0x2b, 0xa1, 0xbf, 0xbe, 0x6f, 0x23, 0xbf, 0xce, 0x33, 0x9e, 0xbd, 0x20, 0x25, 0xa0, 0xbf, 0x99, 0x8b, 0x36, 0xbf, 0x3b, 0x16, 0x4d, 0xbd, + 0x58, 0x02, 0xab, 0xbf, 0x50, 0x3a, 0x20, 0xbf, 0xb0, 0xe0, 0x80, 0xb4, 0xc3, 0x0c, 0xa1, 0xbf, 0x21, 0xa3, 0x21, 0xbf, 0x7d, 0xf0, 0x84, 0xb4, 0xf6, 0xae, + 0xa4, 0xbf, 0x18, 0x41, 0x1f, 0xbf, 0x98, 0xb7, 0x11, 0xbd, 0x62, 0x86, 0xa0, 0xbf, 0x28, 0x00, 0x38, 0xbf, 0xae, 0xae, 0x26, 0xbf, 0x71, 0x6c, 0x06, 0xbf, + 0x70, 0xd6, 0x1a, 0xbf, 0xb4, 0xaa, 0x1a, 0xbf, 0x6c, 0x38, 0x19, 0xbf, 0x41, 0xb5, 0x26, 0xbf, 0x56, 0x65, 0x2b, 0xbf, 0x4f, 0x1e, 0x15, 0xbf, 0xf7, 0x77, + 0x0a, 0xbf, 0x67, 0xf2, 0x0a, 0xbf, 0xfa, 0xe9, 0x26, 0xbf, 0xcc, 0x00, 0x33, 0xbf, 0x9e, 0x66, 0x24, 0xbf, 0xea, 0x47, 0xa9, 0xbe, 0x9b, 0xa5, 0x2a, 0xbf, + 0x4f, 0x72, 0xa9, 0xbe, 0x7c, 0x6c, 0x27, 0xbf, 0x51, 0xee, 0x4a, 0xbf, 0x60, 0x2e, 0x31, 0xbe, 0x5a, 0xa9, 0x1d, 0xbf, 0x38, 0x12, 0x59, 0xbf, 0xf1, 0x36, + 0x29, 0xbf, 0x3e, 0x3b, 0x94, 0xbe, 0xe6, 0xad, 0x1e, 0xbf, 0x9a, 0x49, 0xce, 0x30, 0xd7, 0x19, 0xb5, 0xbe, 0x92, 0x80, 0x6e, 0xbf, 0x00, 0xce, 0x32, 0xb2, + 0xc3, 0x32, 0xd2, 0xbe, 0xe0, 0xb0, 0x6f, 0xbf, 0xb5, 0xdf, 0x82, 0x3d, 0xe1, 0x91, 0xa0, 0xbe, 0xfa, 0x21, 0x75, 0xbf, 0x41, 0x78, 0x47, 0x3d, 0xcb, 0x4e, + 0xb5, 0xbe, 0x86, 0xf4, 0x6c, 0xbf, 0xe7, 0xfb, 0x0e, 0xb3, 0x9a, 0xf8, 0x0a, 0xbf, 0x6c, 0x5e, 0x7b, 0xbf, 0x9a, 0xdf, 0xd5, 0xbe, 0x64, 0x5b, 0x3c, 0xbf, + 0xfc, 0x42, 0x3f, 0xbf, 0x46, 0xb8, 0x1b, 0xbf, 0xa3, 0x88, 0x4f, 0xbf, 0x2e, 0x86, 0xfa, 0xbe, 0x00, 0x63, 0x2a, 0xbf, 0x88, 0xcd, 0x29, 0xbf, 0xb1, 0xdf, + 0xf4, 0xbe, 0xc1, 0x20, 0x74, 0xb4, 0x98, 0xaf, 0xa0, 0xbf, 0x61, 0xe0, 0x37, 0xbf, 0xa4, 0x26, 0x8b, 0xb4, 0xd7, 0x72, 0xab, 0xbf, 0xd4, 0x7c, 0x1f, 0xbf, + 0xa9, 0x2e, 0x29, 0x3d, 0xb2, 0x74, 0xa4, 0xbf, 0x96, 0x25, 0x20, 0xbf, 0xd0, 0x75, 0x21, 0x3d, 0xc1, 0x2b, 0xa1, 0xbf, 0xbe, 0x6f, 0x23, 0xbf, 0xca, 0xc2, + 0x32, 0xbe, 0x9b, 0x52, 0xbf, 0xbf, 0x38, 0x2b, 0x15, 0xbf, 0xdd, 0xff, 0x02, 0xbe, 0x13, 0xbb, 0xb4, 0xbf, 0x16, 0xce, 0x20, 0xbf, 0x53, 0x17, 0x46, 0xbe, + 0x76, 0xa9, 0xb4, 0xbf, 0x84, 0xd7, 0x1c, 0xbf, 0x2e, 0xf8, 0x69, 0xbd, 0xd9, 0xa6, 0xb5, 0xbf, 0x40, 0x03, 0x21, 0xbf, 0xda, 0xc8, 0x9f, 0xb4, 0xa4, 0x18, + 0xc0, 0xbf, 0x4c, 0x56, 0x1a, 0xbf, 0xea, 0x6b, 0x95, 0xb4, 0x2a, 0x86, 0xb6, 0xbf, 0x15, 0x75, 0x1f, 0xbf, 0xcf, 0x88, 0x5e, 0x3d, 0x24, 0xd2, 0xbf, 0xbf, + 0xcb, 0x50, 0x1b, 0xbf, 0x98, 0xf7, 0x69, 0x3d, 0xd9, 0xa6, 0xb5, 0xbf, 0x40, 0x03, 0x21, 0xbf, 0xb3, 0x15, 0x4d, 0x3d, 0x58, 0x02, 0xab, 0xbf, 0x4f, 0x3a, + 0x20, 0xbf, 0x1c, 0xb7, 0x11, 0x3d, 0x62, 0x86, 0xa0, 0xbf, 0x28, 0x00, 0x38, 0xbf, 0xb7, 0x7e, 0x0a, 0x3d, 0x22, 0xf2, 0x73, 0xbf, 0x80, 0xcb, 0x52, 0xbf, + 0xf6, 0x85, 0xb7, 0x3c, 0x15, 0x25, 0x6b, 0xbf, 0x38, 0xd8, 0x83, 0xbf, 0x21, 0x99, 0x30, 0xbf, 0x90, 0xd3, 0xaa, 0xbe, 0x1e, 0x66, 0x00, 0xbf, 0x1f, 0xe3, + 0x39, 0xbf, 0x22, 0x4e, 0x95, 0xbe, 0x12, 0xf7, 0xcd, 0xbe, 0x6e, 0xf5, 0x24, 0xbf, 0x83, 0x0e, 0x3e, 0xbf, 0x65, 0x09, 0xd1, 0xbe, 0x67, 0x74, 0xa5, 0xb2, + 0x7d, 0x98, 0xee, 0xbe, 0x04, 0xf2, 0x75, 0xbf, 0x5d, 0xe0, 0xec, 0x3c, 0xd1, 0x2b, 0xf5, 0xbe, 0x6e, 0x71, 0x75, 0xbf, 0x0f, 0x10, 0xe8, 0x3c, 0x6c, 0xe9, + 0xd2, 0xbe, 0x72, 0xa0, 0x6e, 0xbf, 0x3e, 0xde, 0x69, 0x3d, 0xd1, 0x86, 0x87, 0xbe, 0xcc, 0x91, 0x7f, 0xbf, 0x8c, 0x7e, 0x1b, 0xbe, 0x88, 0xd1, 0x8c, 0xbf, + 0xfc, 0x55, 0x48, 0xbf, 0xa3, 0xc6, 0x05, 0xbf, 0x4c, 0x64, 0x8a, 0xbf, 0xb8, 0x85, 0xc9, 0xbe, 0x09, 0xd5, 0xdd, 0x3c, 0x37, 0xc8, 0x8c, 0xbf, 0x10, 0xa2, + 0x4f, 0xbf, 0xc0, 0x70, 0x1a, 0x3d, 0x16, 0xc3, 0x84, 0xbf, 0xd0, 0x98, 0x4b, 0xbf, 0xcc, 0xe9, 0x10, 0x3d, 0xc6, 0x2c, 0x7a, 0xbf, 0x8e, 0xe0, 0x4b, 0xbf, + 0x92, 0xbc, 0x18, 0xbe, 0x3b, 0xee, 0xc4, 0xbf, 0x3f, 0x87, 0xc5, 0xbe, 0xa1, 0x37, 0x09, 0xbe, 0x66, 0x83, 0xc0, 0xbf, 0xb5, 0x18, 0x90, 0xbe, 0x24, 0x02, + 0xba, 0xb4, 0x12, 0x34, 0xc3, 0xbf, 0xee, 0x9f, 0x94, 0xbe, 0x90, 0x0b, 0xb5, 0xb4, 0x58, 0x1b, 0xc7, 0xbf, 0x21, 0x86, 0xcf, 0xbe, 0x4a, 0x3a, 0x15, 0xbd, + 0x9e, 0x5f, 0xbc, 0xbf, 0x4a, 0xd1, 0x1a, 0xbe, 0x9a, 0xbc, 0xbe, 0xb4, 0x70, 0x7d, 0xbc, 0xbf, 0x08, 0x20, 0x13, 0xbe, 0x47, 0x3a, 0xb1, 0xb4, 0x1d, 0xd4, + 0xc7, 0xbf, 0x20, 0x34, 0xee, 0xbe, 0x3f, 0x69, 0x33, 0x3d, 0x88, 0x16, 0xc8, 0xbf, 0xfa, 0xdd, 0xee, 0xbe, 0xb3, 0x0a, 0x09, 0xbe, 0xf2, 0x9f, 0xbb, 0xbf, + 0x5e, 0xc7, 0x35, 0xbe, 0xd9, 0x6f, 0x3c, 0x3d, 0x72, 0x44, 0xc8, 0xbf, 0x88, 0x46, 0x03, 0xbf, 0x8f, 0xf7, 0x46, 0x3d, 0xda, 0x29, 0xc6, 0xbf, 0x6c, 0x2d, + 0x0e, 0xbf, 0x66, 0x00, 0x06, 0xbf, 0x30, 0xec, 0x95, 0xbf, 0x9c, 0x77, 0x9d, 0xbe, 0xbd, 0xfc, 0x00, 0xbf, 0x96, 0x5f, 0x9e, 0xbf, 0x3d, 0xe1, 0x58, 0xbe, + 0xff, 0xa6, 0x0a, 0xbf, 0x38, 0x48, 0x6e, 0xbf, 0xfe, 0xd0, 0x02, 0xbf, 0xf2, 0xb6, 0x17, 0xbf, 0x71, 0x45, 0x62, 0xbf, 0xec, 0x65, 0xdc, 0xbe, 0xed, 0x4e, + 0x13, 0xbf, 0xe8, 0xc6, 0x76, 0xbf, 0xae, 0xd5, 0xbb, 0xbe, 0xef, 0xd9, 0x10, 0xbf, 0x3e, 0x80, 0x81, 0xbf, 0xa0, 0x51, 0xa8, 0xbe, 0x2c, 0x16, 0x10, 0xbf, + 0x48, 0x3e, 0x8d, 0xbf, 0x2e, 0x49, 0x7b, 0xbe, 0x16, 0x51, 0x0b, 0xbf, 0xca, 0x1e, 0x96, 0xbf, 0x32, 0x80, 0x1e, 0xbe, 0x7b, 0xc4, 0xf6, 0xbe, 0x61, 0xf7, + 0xa4, 0xbf, 0x26, 0xe6, 0x1f, 0xbe, 0x3e, 0xc8, 0x05, 0xbf, 0x40, 0xcf, 0x9b, 0xbf, 0x88, 0x46, 0xcf, 0xbd, 0xd9, 0x3a, 0x1f, 0xbf, 0xcf, 0xaf, 0x50, 0xbf, + 0xba, 0x65, 0xae, 0xbe, 0xce, 0xd6, 0x26, 0xbf, 0x3e, 0x9f, 0x3f, 0xbf, 0xf2, 0xa8, 0x72, 0xbe, 0x11, 0xf0, 0x2c, 0xbf, 0x3e, 0xe8, 0x45, 0xbf, 0x99, 0x37, + 0x3b, 0x3d, 0x22, 0xf7, 0x17, 0xbf, 0xdc, 0x1a, 0x86, 0xbf, 0x40, 0x94, 0xf7, 0x3b, 0x55, 0xa8, 0x0e, 0xbf, 0x76, 0xaf, 0x91, 0xbf, 0x4c, 0xb2, 0x4f, 0xbd, + 0x50, 0xce, 0x44, 0xbf, 0x3c, 0x25, 0xb7, 0xbe, 0xba, 0xc5, 0xd1, 0x3c, 0xa3, 0x37, 0x1f, 0xbf, 0x6b, 0x18, 0x62, 0xbf, 0x3c, 0xdf, 0xd9, 0x3d, 0x06, 0x5a, + 0x15, 0xbf, 0x44, 0x59, 0x75, 0xbf, 0x97, 0xa1, 0xb9, 0x3d, 0x40, 0x9f, 0x06, 0xbf, 0x57, 0x81, 0x89, 0xbf, 0x40, 0x6f, 0x44, 0x3d, 0x28, 0x54, 0xf6, 0xbe, + 0x66, 0x74, 0x95, 0xbf, 0x80, 0x3e, 0xf2, 0x3a, 0x8d, 0x40, 0xc1, 0xbe, 0x6a, 0x5f, 0xaf, 0xbf, 0xdc, 0x44, 0x27, 0xbe, 0x68, 0x44, 0xac, 0xbe, 0x0f, 0x33, + 0xb7, 0xbf, 0xe2, 0xab, 0x6a, 0xbe, 0x97, 0xa8, 0x2d, 0xbf, 0x19, 0x5b, 0xc3, 0xbe, 0xcc, 0xc1, 0xf9, 0x3e, 0xa4, 0x97, 0x23, 0xbf, 0xf2, 0xa4, 0x06, 0xbf, + 0xef, 0x48, 0x05, 0x3f, 0x2d, 0x2c, 0x2e, 0xbf, 0xc4, 0x9a, 0x16, 0xbf, 0xab, 0x52, 0xcc, 0x3e, 0xa6, 0x14, 0x26, 0xbf, 0x94, 0x1b, 0xaa, 0xbe, 0xc2, 0x96, + 0x17, 0x3f, 0xb8, 0xe1, 0x1f, 0xbf, 0x94, 0xa5, 0xf5, 0xbe, 0xa6, 0x19, 0x1a, 0x3f, 0xc8, 0xd3, 0x2f, 0xbf, 0x87, 0x9e, 0x1f, 0xbf, 0xc7, 0x29, 0xa0, 0x3e, + 0xc5, 0xf7, 0x25, 0xbf, 0x85, 0x5d, 0x47, 0xbf, 0xea, 0x61, 0xae, 0x3e, 0x1b, 0xd3, 0x16, 0xbf, 0xd2, 0x1c, 0x77, 0xbf, 0xd2, 0x56, 0xc4, 0x3e, 0x48, 0x4e, + 0x0d, 0xbf, 0x4a, 0x7e, 0x93, 0xbf, 0x10, 0x42, 0xc9, 0x3e, 0x69, 0xdd, 0x2f, 0xbf, 0xab, 0xa2, 0x2c, 0xbf, 0xda, 0x7f, 0x6e, 0x3e, 0xa3, 0xc7, 0x25, 0xbf, + 0xac, 0x2d, 0x52, 0xbf, 0xa6, 0x54, 0x85, 0x3e, 0x23, 0x67, 0x11, 0xbf, 0xae, 0x84, 0x83, 0xbf, 0x71, 0xd4, 0xa1, 0x3e, 0xd1, 0xa1, 0x1b, 0xbf, 0x58, 0xe7, + 0x5d, 0xbf, 0x31, 0xfe, 0x4d, 0x3e, 0x51, 0x86, 0x07, 0xbf, 0x94, 0x98, 0x87, 0xbf, 0x05, 0x7d, 0x88, 0x3e, 0xc1, 0x84, 0xfb, 0xbe, 0x00, 0x42, 0x9a, 0xbf, + 0x3a, 0x58, 0x9c, 0x3e, 0xf5, 0xe0, 0xfe, 0xbd, 0x11, 0x20, 0xb5, 0xbf, 0x68, 0xfe, 0x71, 0xbd, 0xe4, 0x40, 0x1e, 0xbd, 0xa7, 0x7c, 0xb5, 0xbf, 0x40, 0xcb, + 0x27, 0xbd, 0xa0, 0x61, 0x05, 0xbe, 0x04, 0x35, 0xb2, 0xbf, 0xc0, 0x40, 0x46, 0x3c, 0x43, 0xb6, 0x0f, 0xbd, 0xb8, 0xab, 0xb4, 0xbf, 0x80, 0x94, 0x64, 0xbc, + 0x41, 0xe0, 0xc0, 0xb4, 0x3c, 0x35, 0xb6, 0xbf, 0xf0, 0x87, 0x18, 0xbd, 0x8d, 0x2e, 0x24, 0xbe, 0x06, 0x0b, 0xb4, 0xbf, 0x18, 0x3d, 0x99, 0x3d, 0xc7, 0xcc, + 0xc8, 0xb4, 0xb3, 0x4c, 0xb7, 0xbf, 0xa0, 0x7f, 0x64, 0x3d, 0x37, 0xe4, 0xc2, 0xb4, 0x50, 0x1b, 0xb6, 0xbf, 0xc0, 0xed, 0x10, 0xbc, 0x8b, 0x39, 0x15, 0x3d, + 0x9e, 0x5f, 0xbc, 0xbf, 0x4a, 0xd1, 0x1a, 0xbe, 0x23, 0x40, 0x1e, 0x3d, 0xa7, 0x7c, 0xb5, 0xbf, 0x40, 0xcb, 0x27, 0xbd, 0x81, 0xb5, 0x0f, 0x3d, 0xb8, 0xab, + 0xb4, 0xbf, 0x80, 0x94, 0x64, 0xbc, 0x94, 0xa0, 0x49, 0xb4, 0xa0, 0xe5, 0x1c, 0xbc, 0xae, 0xbf, 0x79, 0x3f, 0xf4, 0xbb, 0x70, 0xb4, 0x54, 0xf3, 0x2e, 0xbe, + 0x08, 0x40, 0x7b, 0x3f, 0xfa, 0x7e, 0xad, 0xbd, 0x1a, 0x57, 0x32, 0xbe, 0x60, 0xc5, 0x78, 0x3f, 0xcb, 0xac, 0xda, 0xbd, 0xc0, 0xf9, 0xeb, 0xbb, 0x0b, 0xea, + 0x76, 0x3f, 0x9a, 0xac, 0xda, 0x3d, 0x00, 0xf9, 0xeb, 0xbb, 0x0f, 0xea, 0x76, 0x3f, 0xc1, 0x7e, 0xad, 0x3d, 0x1a, 0x57, 0x32, 0xbe, 0x60, 0xc5, 0x78, 0x3f, + 0x2a, 0xa8, 0x88, 0xb4, 0x87, 0x4f, 0xa5, 0xbe, 0x4b, 0x3f, 0x75, 0x3f, 0x07, 0xd7, 0x99, 0xbd, 0xec, 0xef, 0xa4, 0xbe, 0xbe, 0xb0, 0x72, 0x3f, 0x8f, 0x0b, + 0x59, 0xbe, 0x04, 0x85, 0x41, 0xbe, 0x4d, 0x63, 0x72, 0x3f, 0x10, 0xfd, 0x70, 0xbe, 0x00, 0xb0, 0x5f, 0xbc, 0xcc, 0xd3, 0x70, 0x3f, 0xc2, 0xd6, 0x99, 0x3d, + 0xec, 0xef, 0xa4, 0xbe, 0xbe, 0xb0, 0x72, 0x3f, 0x27, 0x14, 0x97, 0xb4, 0xcb, 0xf9, 0xef, 0xbe, 0xb5, 0x65, 0x6b, 0x3f, 0x7f, 0xa1, 0x96, 0xbd, 0x52, 0x31, + 0xf5, 0xbe, 0x72, 0x99, 0x6b, 0x3f, 0xd4, 0x9e, 0x47, 0xbe, 0xc2, 0x12, 0xa7, 0xbe, 0xa0, 0x7d, 0x6e, 0x3f, 0x31, 0xa1, 0x96, 0x3d, 0x52, 0x31, 0xf5, 0xbe, + 0x72, 0x99, 0x6b, 0x3f, 0xb7, 0x9f, 0xab, 0xb4, 0xee, 0x84, 0x20, 0xbf, 0x48, 0x75, 0x71, 0x3f, 0x20, 0xc9, 0x86, 0xbd, 0x98, 0xa0, 0x21, 0xbf, 0x22, 0x39, + 0x71, 0x3f, 0xd8, 0x5e, 0x2d, 0xbe, 0xfe, 0xc6, 0xfb, 0xbe, 0xf6, 0xd0, 0x69, 0x3f, 0xca, 0xc8, 0x86, 0x3d, 0x98, 0xa0, 0x21, 0xbf, 0x22, 0x39, 0x71, 0x3f, + 0xda, 0x20, 0xc3, 0xb4, 0xac, 0x5e, 0x47, 0xbf, 0x5d, 0x2a, 0x82, 0x3f, 0x02, 0xae, 0x84, 0xbd, 0x75, 0x03, 0x46, 0xbf, 0x8e, 0xff, 0x81, 0x3f, 0x71, 0x44, + 0x2c, 0xbe, 0x84, 0x78, 0x25, 0xbf, 0x58, 0xcd, 0x6f, 0x3f, 0xa0, 0xad, 0x84, 0x3d, 0x74, 0x03, 0x46, 0xbf, 0x90, 0xff, 0x81, 0x3f, 0xbb, 0x64, 0x35, 0xbe, + 0x82, 0x1c, 0x48, 0xbf, 0x74, 0x25, 0x81, 0x3f, 0xab, 0xda, 0xb4, 0xbe, 0xd0, 0x20, 0x4d, 0xbe, 0xfc, 0xea, 0x66, 0x3f, 0xde, 0x51, 0xba, 0xbe, 0x90, 0x00, + 0x99, 0xbc, 0x42, 0xc6, 0x64, 0x3f, 0x9b, 0x5c, 0xaa, 0xbe, 0x80, 0xb3, 0xaa, 0xbe, 0xf0, 0x3c, 0x65, 0x3f, 0x02, 0xb5, 0xa8, 0xbe, 0xd2, 0x7d, 0x4c, 0xbf, + 0xb0, 0x53, 0x79, 0x3f, 0x20, 0xa6, 0xf4, 0xbe, 0x2a, 0xa0, 0x69, 0xbe, 0x77, 0x66, 0x51, 0x3f, 0xe7, 0x17, 0xf7, 0xbe, 0xd0, 0x4e, 0x62, 0xbd, 0x87, 0xc8, + 0x50, 0x3f, 0x94, 0x7b, 0x17, 0xbf, 0x23, 0x48, 0x8b, 0xbe, 0x31, 0xb3, 0x34, 0x3f, 0x5d, 0xa8, 0x19, 0xbf, 0xd8, 0xb4, 0xd6, 0xbd, 0xc0, 0x0a, 0x34, 0x3f, + 0xc2, 0x26, 0x2b, 0xbf, 0xec, 0x3f, 0x2f, 0xbe, 0x18, 0x3b, 0x18, 0x3f, 0xbd, 0xa2, 0xeb, 0xbe, 0x7a, 0xcd, 0x88, 0xbf, 0x55, 0x2f, 0xd4, 0x3d, 0x4d, 0x44, + 0xdc, 0xbe, 0x44, 0xc5, 0x91, 0xbf, 0xfb, 0x9e, 0x50, 0x3e, 0x31, 0xb2, 0xcd, 0xbe, 0xfe, 0x49, 0x9e, 0xbf, 0x20, 0x93, 0x80, 0x3e, 0x66, 0xfd, 0x3c, 0xbf, + 0x4e, 0x78, 0xe5, 0xbe, 0xd0, 0x34, 0x65, 0x3e, 0xe8, 0x0d, 0x42, 0xbf, 0x74, 0x68, 0x5f, 0xbe, 0x54, 0x52, 0x97, 0x3e, 0xff, 0x5d, 0x44, 0xbf, 0x9a, 0x3c, + 0x24, 0xbe, 0x8e, 0xac, 0x89, 0x3e, 0x38, 0xed, 0x3e, 0xbf, 0x7a, 0x5a, 0x0b, 0xbe, 0x9a, 0x36, 0xa2, 0x3e, 0xa1, 0xb3, 0x47, 0xbf, 0x04, 0xb9, 0xf0, 0xbd, + 0x96, 0x98, 0x74, 0x3e, 0x86, 0xd7, 0x4a, 0xbf, 0x00, 0xe6, 0x92, 0xbd, 0xe4, 0xb6, 0x49, 0x3e, 0x97, 0xfe, 0x42, 0xbf, 0x20, 0x4e, 0x9a, 0xbc, 0x73, 0x74, + 0x85, 0x3e, 0x5e, 0xc3, 0x40, 0xbf, 0x00, 0xa7, 0x9f, 0xbd, 0x76, 0x77, 0x96, 0x3e, 0x0e, 0xbb, 0x44, 0xbf, 0x80, 0xf5, 0xa5, 0x3c, 0xf6, 0x37, 0x5c, 0x3e, + 0x82, 0x8a, 0x4a, 0xbf, 0x50, 0x18, 0x56, 0xbd, 0x92, 0x8d, 0x25, 0x3e, 0xdc, 0xc5, 0xbf, 0xbe, 0x2e, 0x10, 0x99, 0xbf, 0xc4, 0x7d, 0x2f, 0x3e, 0xa3, 0xe9, + 0xa1, 0xbe, 0x8c, 0xe0, 0xa8, 0xbf, 0x95, 0x80, 0x3f, 0x3e, 0x61, 0x97, 0xca, 0xbe, 0x46, 0x60, 0x95, 0xbf, 0xaa, 0x17, 0x81, 0x3d, 0x31, 0x54, 0xff, 0x3c, + 0x41, 0x9f, 0x26, 0xbf, 0x4c, 0x26, 0x80, 0xbf, 0x33, 0xe6, 0xf4, 0x3c, 0xae, 0x85, 0x0c, 0xbf, 0xec, 0xdd, 0x79, 0xbf, 0x69, 0x1c, 0xf9, 0x3c, 0xde, 0x72, + 0x3c, 0xbf, 0xa1, 0x68, 0x83, 0xbf, 0xe1, 0xdb, 0x45, 0xbf, 0x3c, 0xab, 0x9f, 0xbe, 0x32, 0x70, 0xab, 0x3c, 0xb5, 0x80, 0x41, 0xbf, 0x6e, 0x7a, 0x8c, 0xbe, + 0x3e, 0x78, 0x9c, 0x3e, 0x91, 0xf1, 0x16, 0xbf, 0xaf, 0xfe, 0xa2, 0xbe, 0x0e, 0x58, 0x31, 0xbf, 0xd1, 0xf2, 0x04, 0xbf, 0x9c, 0x03, 0x80, 0xbe, 0x1d, 0x6b, + 0x36, 0xbf, 0x58, 0x46, 0x1b, 0xbf, 0x0a, 0xa1, 0xc2, 0xbe, 0xba, 0xe0, 0x2b, 0xbf, 0x21, 0xf8, 0x14, 0xbf, 0xb6, 0x23, 0xd7, 0xbe, 0x89, 0x5f, 0x28, 0xbf, + 0xc8, 0xce, 0x03, 0xbf, 0x86, 0xc9, 0xe6, 0xbe, 0xe7, 0x64, 0x25, 0xbf, 0x0b, 0xbf, 0xd0, 0xbe, 0xb7, 0xf4, 0xec, 0xbe, 0xb4, 0x96, 0x22, 0xbf, 0xc0, 0xfa, + 0x91, 0xbe, 0x3d, 0x80, 0xe8, 0xbe, 0xfe, 0x73, 0x21, 0xbf, 0xdc, 0x92, 0x2e, 0xbe, 0xc4, 0xf9, 0xd9, 0xbe, 0x82, 0x71, 0x23, 0xbf, 0x69, 0x5c, 0xc4, 0xbd, + 0xf0, 0x06, 0xcb, 0xbe, 0x54, 0x4d, 0x26, 0xbf, 0xf3, 0xda, 0x8d, 0xbd, 0xf8, 0x66, 0xb5, 0xbe, 0xa8, 0x26, 0x2a, 0xbf, 0x87, 0x77, 0xc6, 0xbd, 0x74, 0xf5, + 0x9c, 0xbe, 0x86, 0x42, 0x2e, 0xbf, 0x24, 0x00, 0x38, 0xbe, 0x02, 0x16, 0x81, 0xbe, 0xaf, 0x10, 0x33, 0xbf, 0xc5, 0xaa, 0xd3, 0xbe, 0x58, 0x58, 0x57, 0xbe, + 0xe6, 0x02, 0x38, 0xbf, 0xb9, 0xa9, 0x4b, 0xbf, 0x20, 0x68, 0x7b, 0xbd, 0xda, 0xde, 0x9f, 0x3d, 0x6a, 0x79, 0x42, 0xbf, 0x7d, 0x4c, 0x8d, 0xbe, 0xc8, 0x78, + 0x9a, 0x3e, 0x6e, 0x50, 0x43, 0xbf, 0x72, 0x07, 0x62, 0xbe, 0x2e, 0xca, 0x94, 0x3e, 0xc6, 0xf8, 0x45, 0xbf, 0xc0, 0xc0, 0x26, 0xbe, 0xe3, 0x5c, 0x87, 0x3e, + 0xe1, 0x2f, 0x3e, 0xbf, 0x8d, 0xa3, 0xe4, 0xbe, 0x11, 0x09, 0x62, 0x3e, 0x75, 0x82, 0x3f, 0xbf, 0x12, 0x8a, 0xcb, 0xbe, 0xad, 0x75, 0x81, 0x3e, 0x97, 0x8e, + 0x49, 0xbf, 0xd8, 0x5c, 0xf5, 0xbd, 0xee, 0xc7, 0x70, 0x3e, 0xfb, 0x8b, 0x4c, 0xbf, 0xdc, 0x7f, 0x98, 0xbd, 0x11, 0x82, 0x45, 0x3e, 0x5b, 0xf8, 0x4b, 0xbf, + 0x88, 0x69, 0x65, 0xbd, 0x35, 0xfb, 0x23, 0x3e, 0x4d, 0x2d, 0x4c, 0xbf, 0x88, 0x69, 0x4e, 0xbd, 0x74, 0x87, 0xe9, 0x3d, 0x19, 0x7f, 0x41, 0xbf, 0xe2, 0xd2, + 0xb0, 0xbe, 0xea, 0x35, 0x8f, 0x3e, 0x4e, 0x68, 0x5d, 0xbf, 0xcc, 0xcc, 0x27, 0xbe, 0x7e, 0x50, 0x4f, 0x3e, 0x95, 0x62, 0x53, 0xbf, 0x4a, 0xdf, 0x26, 0xbe, + 0xc4, 0x42, 0x5d, 0x3e, 0x29, 0x37, 0x60, 0xbf, 0x60, 0x2f, 0x36, 0xbe, 0x99, 0x8b, 0x6e, 0x3e, 0x93, 0x47, 0x4f, 0xbf, 0xac, 0xf4, 0x39, 0xbe, 0x1c, 0x0d, + 0x5e, 0x3e, 0xfb, 0xa6, 0x50, 0xbf, 0xf2, 0xac, 0x0f, 0xbe, 0x02, 0x5a, 0x32, 0x3e, 0xb2, 0x75, 0x55, 0xbf, 0x60, 0x09, 0xf0, 0xbd, 0xe2, 0x69, 0x1f, 0x3e, + 0x2c, 0xe8, 0x4d, 0xbf, 0x5a, 0x80, 0x7c, 0xbe, 0x1e, 0x4b, 0x84, 0x3e, 0x05, 0xcc, 0x4e, 0xbf, 0x82, 0x34, 0x69, 0xbe, 0x2f, 0xe4, 0x54, 0x3e, 0xaf, 0x3e, + 0x50, 0xbf, 0x68, 0x9e, 0xf2, 0xbd, 0xc2, 0x8e, 0x02, 0x3e, 0x25, 0x55, 0x50, 0xbf, 0x8a, 0xc1, 0x27, 0xbe, 0xa0, 0xd9, 0x1a, 0x3e, 0x0c, 0xe9, 0x4c, 0xbf, + 0x12, 0x64, 0x92, 0xbe, 0x3c, 0x54, 0xc2, 0x3d, 0x7c, 0x6c, 0x4f, 0xbf, 0xeb, 0x64, 0x9d, 0xbe, 0xdc, 0xc5, 0xe9, 0x3d, 0x10, 0xa6, 0x46, 0xbf, 0x95, 0x83, + 0x8a, 0xbe, 0xa9, 0xed, 0x1a, 0x3e, 0x8c, 0x83, 0x52, 0xbf, 0x7e, 0x93, 0xd8, 0xbe, 0x3a, 0x27, 0x11, 0x3e, 0xd4, 0x6e, 0x50, 0xbf, 0xc0, 0x11, 0xef, 0xbe, + 0x30, 0x35, 0x22, 0x3e, 0x21, 0x37, 0x55, 0xbf, 0x9a, 0xf1, 0xd6, 0xbe, 0x0e, 0xbb, 0x23, 0x3e, 0xf6, 0xce, 0x52, 0xbf, 0x2a, 0x91, 0xf2, 0xbe, 0xd8, 0x07, + 0x43, 0x3e, 0x55, 0xef, 0x4e, 0xbf, 0x88, 0xc9, 0x07, 0xbf, 0x3a, 0x04, 0x32, 0x3e, 0xad, 0x88, 0x59, 0xbf, 0x98, 0x2b, 0x18, 0xbe, 0x23, 0x94, 0x9d, 0x3e, + 0xcd, 0x6c, 0x56, 0xbf, 0x6a, 0xb0, 0x70, 0xbe, 0xdc, 0x12, 0xa3, 0x3e, 0x61, 0x66, 0x56, 0xbf, 0x04, 0xfb, 0x6d, 0xbe, 0x9d, 0x2f, 0xb9, 0x3e, 0xaa, 0x12, + 0x5a, 0xbf, 0x90, 0xc9, 0x08, 0xbe, 0xd1, 0xe1, 0xb3, 0x3e, 0xe6, 0x8c, 0x56, 0xbf, 0xc8, 0x69, 0x23, 0xbe, 0xac, 0xfc, 0x8d, 0x3e, 0xee, 0x0b, 0x53, 0xbf, + 0xfc, 0x20, 0x6f, 0xbe, 0x6c, 0xbf, 0x97, 0x3e, 0xa0, 0xb7, 0x53, 0xbf, 0x1c, 0x4b, 0x9b, 0xbe, 0xa0, 0x12, 0xa0, 0x3e, 0xc5, 0xd3, 0x52, 0xbf, 0xf4, 0xbb, + 0xa0, 0xbe, 0xa2, 0x3d, 0xb9, 0x3e, 0x2b, 0x62, 0x59, 0xbf, 0x64, 0xeb, 0x6d, 0xbe, 0xcc, 0x34, 0xc4, 0x3e, 0x73, 0xc9, 0x5c, 0xbf, 0xe4, 0xd0, 0x03, 0xbe, + 0x25, 0x7d, 0xbf, 0x3e, 0xb9, 0x52, 0x5c, 0xbf, 0xa8, 0xab, 0xa5, 0xbd, 0xd4, 0xf1, 0x8f, 0x3e, 0x15, 0x49, 0x5c, 0xbf, 0xc0, 0x1d, 0x67, 0xbd, 0x60, 0x1e, + 0xa4, 0x3e, 0x3a, 0xb9, 0x53, 0xbf, 0x20, 0xc9, 0xf0, 0xbd, 0x39, 0x8c, 0x9d, 0x3d, 0x08, 0x7d, 0x5f, 0xbf, 0xd8, 0xd7, 0x02, 0xbe, 0x34, 0x27, 0x9c, 0x3d, + 0xac, 0xee, 0x63, 0xbf, 0x24, 0x55, 0xcc, 0xbd, 0xf2, 0xab, 0x70, 0x3d, 0x26, 0xeb, 0x5c, 0xbf, 0xe8, 0x9b, 0xce, 0xbd, 0xb4, 0xe0, 0x0c, 0x3e, 0x77, 0x46, + 0x5f, 0xbf, 0x10, 0x8d, 0x5c, 0xbd, 0xc0, 0x26, 0xcd, 0x3d, 0xc1, 0x07, 0x61, 0xbf, 0xb0, 0x49, 0xa3, 0xbd, 0x2e, 0xf2, 0x08, 0x3e, 0xf4, 0xa8, 0x3f, 0xbf, + 0x9d, 0x0f, 0xab, 0xbe, 0x12, 0xa7, 0x30, 0x3e, 0x36, 0x01, 0x40, 0xbf, 0xbe, 0x18, 0xb7, 0xbe, 0x2f, 0x82, 0x29, 0x3e, 0x38, 0xad, 0x47, 0xbf, 0x84, 0x7f, + 0xb3, 0xbe, 0x0d, 0x22, 0xfd, 0x3d, 0xe3, 0x7b, 0x41, 0xbf, 0x9e, 0x51, 0x9e, 0xbe, 0x32, 0x99, 0x41, 0x3e, 0xb7, 0x9c, 0x42, 0xbf, 0x08, 0xd1, 0xb0, 0xbe, + 0x8c, 0xb0, 0x56, 0x3e, 0x9d, 0x1a, 0x44, 0xbf, 0x3f, 0xdf, 0xc4, 0xbe, 0x00, 0xcb, 0x14, 0x3e, 0x45, 0x1e, 0x49, 0xbf, 0x00, 0x38, 0xc9, 0xbe, 0x40, 0xca, + 0xf8, 0x3d, 0xc7, 0x19, 0x50, 0xbf, 0xae, 0xb9, 0xaf, 0xbe, 0x5e, 0x5e, 0xf9, 0x3d, 0x07, 0xf6, 0x4a, 0xbf, 0xab, 0xeb, 0xc9, 0xbe, 0x22, 0xf0, 0xee, 0x3d, + 0xf6, 0xe4, 0x4d, 0xbf, 0xac, 0xfd, 0xcb, 0xbe, 0x66, 0xf4, 0xcf, 0x3d, 0x0e, 0xaa, 0x52, 0xbf, 0xe2, 0x96, 0xb0, 0xbe, 0x58, 0xd6, 0xd2, 0x3d, 0x8d, 0x9f, + 0x53, 0xbf, 0x4e, 0xdb, 0x8c, 0xbe, 0xfc, 0x47, 0x8e, 0x3e, 0xb7, 0x78, 0x4c, 0xbf, 0x27, 0x5d, 0x84, 0xbe, 0x29, 0xbf, 0x83, 0x3e, 0x9e, 0xb0, 0x50, 0xbf, + 0xae, 0x07, 0x9f, 0xbe, 0xe8, 0xe5, 0x88, 0x3e, 0x6f, 0xcc, 0x48, 0xbf, 0x59, 0x54, 0x93, 0xbe, 0x38, 0x34, 0x7e, 0x3e, 0x31, 0xc0, 0x4b, 0xbf, 0x68, 0x28, + 0x80, 0xbe, 0xc4, 0x28, 0x55, 0x3e, 0x31, 0x41, 0x5a, 0xbf, 0x0c, 0x75, 0x8a, 0xbe, 0x3d, 0x3d, 0x90, 0x3e, 0x68, 0xe3, 0x58, 0xbf, 0xf0, 0x5b, 0x92, 0xbe, + 0x31, 0xc7, 0x8f, 0x3e, 0x9c, 0x95, 0x4c, 0xbf, 0x80, 0x46, 0xb0, 0xbe, 0x56, 0xb0, 0x64, 0x3e, 0xff, 0xa2, 0x44, 0xbf, 0x5b, 0x35, 0xa5, 0xbe, 0x42, 0x36, + 0x69, 0x3e, 0x77, 0x5f, 0x46, 0xbf, 0x6a, 0xd9, 0x8c, 0xbe, 0x6e, 0xfb, 0x53, 0x3e, 0x2b, 0x02, 0x55, 0xbf, 0xcc, 0x97, 0xa3, 0xbe, 0xfb, 0x8b, 0x88, 0x3e, + 0x04, 0xa6, 0x5e, 0xbf, 0xa7, 0x8a, 0x99, 0xbe, 0x2f, 0x55, 0x94, 0x3e, 0x2b, 0x0e, 0x61, 0xbf, 0x3c, 0x41, 0x8c, 0xbe, 0x66, 0x57, 0x97, 0x3e, 0x5c, 0xbe, + 0x5a, 0xbf, 0x6c, 0xdf, 0xaa, 0xbe, 0xd7, 0x28, 0x8b, 0x3e, 0xbf, 0x36, 0x66, 0xbf, 0x50, 0x48, 0x3c, 0xbe, 0xd2, 0x92, 0x92, 0x3e, 0x74, 0x29, 0x61, 0xbf, + 0xb8, 0xc4, 0x45, 0xbe, 0xea, 0x2f, 0x87, 0x3e, 0xc0, 0xba, 0x60, 0xbf, 0x72, 0x18, 0x81, 0xbe, 0xdc, 0x18, 0xb7, 0x3e, 0x69, 0xb9, 0x5c, 0xbf, 0x72, 0x24, + 0xa4, 0xbe, 0x76, 0x3a, 0xb3, 0x3e, 0x0f, 0x9b, 0x5a, 0xbf, 0x27, 0xfa, 0xba, 0xbe, 0x1a, 0x63, 0x9e, 0x3e, 0xea, 0x94, 0x56, 0xbf, 0xef, 0x76, 0xb1, 0xbe, + 0x7a, 0x89, 0x4d, 0x3e, 0x0f, 0x6a, 0x5b, 0xbf, 0xdc, 0xb9, 0xbc, 0xbe, 0xac, 0x71, 0x5b, 0x3e, 0x8d, 0x93, 0x47, 0xbf, 0x14, 0x3b, 0xbc, 0xbe, 0xaf, 0x4b, + 0x4e, 0x3e, 0xa9, 0x80, 0x59, 0xbf, 0xd6, 0x93, 0xcd, 0xbe, 0x23, 0xf0, 0x83, 0x3e, 0xcd, 0x20, 0x53, 0xbf, 0xa0, 0xb6, 0xbf, 0xbe, 0x91, 0xe7, 0x2d, 0x3e, + 0x06, 0xd1, 0x57, 0xbf, 0xba, 0x8a, 0xce, 0xbe, 0xe6, 0xb9, 0x38, 0x3e, 0x29, 0x77, 0x57, 0xbf, 0x02, 0xa3, 0xe2, 0xbe, 0x6a, 0x7d, 0x5f, 0x3e, 0xda, 0xd2, + 0x48, 0xbf, 0xee, 0x4b, 0x85, 0xbe, 0x6a, 0x6e, 0x63, 0x3d, 0xe2, 0x95, 0x48, 0xbf, 0xb2, 0x5b, 0x6c, 0xbe, 0xe3, 0xb8, 0x92, 0x3d, 0x34, 0xc1, 0x48, 0xbf, + 0xc4, 0x1c, 0x9e, 0xbe, 0x3e, 0xdc, 0x3a, 0x3d, 0x29, 0xcc, 0x4c, 0xbf, 0xda, 0xd7, 0x50, 0xbe, 0xb7, 0xf6, 0x8a, 0x3d, 0xf1, 0x67, 0x4b, 0xbf, 0x44, 0xfc, + 0x7f, 0xbe, 0x76, 0xc2, 0x2b, 0x3e, 0x5f, 0x95, 0x5b, 0xbf, 0xa0, 0x67, 0x94, 0x3c, 0x8f, 0x3a, 0x89, 0x3e, 0x34, 0x2c, 0x5c, 0xbf, 0x00, 0x48, 0x5d, 0xbc, + 0x66, 0x2c, 0x72, 0x3e, 0xb9, 0x9e, 0x5f, 0xbf, 0xc0, 0xe8, 0x3f, 0xbd, 0xc8, 0x44, 0xac, 0x3e, 0x04, 0x07, 0x60, 0xbf, 0xb0, 0x7e, 0x03, 0x3d, 0x30, 0x29, + 0x8e, 0x3e, 0xab, 0x2e, 0x5b, 0xbf, 0x80, 0x84, 0x0d, 0x3c, 0xf8, 0xe6, 0x48, 0x3e, 0x84, 0xb1, 0x5a, 0xbf, 0xc0, 0xb8, 0x41, 0x3d, 0xef, 0x27, 0x60, 0x3e, + 0x30, 0x25, 0x59, 0xbf, 0x80, 0x69, 0x43, 0xbd, 0xbd, 0x2a, 0x5d, 0x3e, 0xd9, 0xdd, 0x57, 0xbf, 0x20, 0x56, 0xca, 0xbd, 0x05, 0xfe, 0x82, 0x3e, 0x2f, 0xf5, + 0x56, 0xbf, 0xd0, 0x3d, 0x4a, 0x3d, 0x5b, 0x2b, 0x14, 0x3e, 0xe6, 0x63, 0x57, 0xbf, 0x80, 0x39, 0x2f, 0x3c, 0x41, 0xb9, 0x0f, 0x3e, 0x32, 0xe6, 0x5e, 0xbf, + 0x10, 0xc8, 0x82, 0x3d, 0xc8, 0x99, 0x67, 0x3e, 0xc9, 0x56, 0x5b, 0xbf, 0xc8, 0xa4, 0x93, 0x3d, 0xd7, 0xcd, 0x14, 0x3e, 0xc8, 0x95, 0x55, 0xbf, 0x20, 0x94, + 0xf7, 0x3c, 0x78, 0x45, 0xb2, 0x3d, 0x6b, 0xd0, 0x54, 0xbf, 0x00, 0x06, 0x57, 0xbb, 0xd0, 0x00, 0xca, 0x3d, 0x9c, 0x8c, 0x5a, 0xbf, 0x30, 0x7b, 0x25, 0x3d, + 0xd4, 0x51, 0x91, 0x3d, 0xd0, 0xce, 0x54, 0xbf, 0x80, 0xdf, 0xc0, 0xbc, 0xe6, 0xf2, 0x9c, 0x3d, 0x61, 0x36, 0x54, 0xbf, 0x80, 0x91, 0x78, 0xbb, 0xc0, 0x11, + 0x6a, 0x3d, 0xc6, 0x4f, 0x58, 0xbf, 0x00, 0x86, 0x71, 0xba, 0x1c, 0x04, 0x19, 0x3d, 0x87, 0x22, 0x51, 0xbf, 0xf0, 0x4c, 0x4f, 0xbd, 0x34, 0x08, 0x11, 0x3d, + 0x9d, 0x6b, 0x50, 0xbf, 0x80, 0xab, 0x61, 0xbd, 0x08, 0xbd, 0x50, 0x3d, 0xde, 0xee, 0x49, 0xbf, 0x36, 0x85, 0x42, 0xbe, 0xf4, 0xa6, 0x40, 0x3d, 0xe8, 0x03, + 0x53, 0xbf, 0xf2, 0x78, 0x26, 0xbe, 0x5c, 0xf6, 0x3b, 0x3d, 0x63, 0x8b, 0x49, 0xbf, 0x2c, 0x95, 0xde, 0xbe, 0xdf, 0x58, 0xb8, 0x3d, 0x06, 0x81, 0x48, 0xbf, + 0xa1, 0x74, 0x08, 0xbf, 0x25, 0x38, 0x08, 0x3e, 0x36, 0xa9, 0x5e, 0xbf, 0xd0, 0xee, 0x9d, 0xbc, 0x1c, 0xbe, 0x69, 0x3d, 0xd1, 0x82, 0x51, 0xbf, 0x86, 0xbb, + 0x08, 0xbf, 0x39, 0xca, 0x5c, 0x3e, 0x96, 0x7d, 0x57, 0xbf, 0xb0, 0x72, 0xf7, 0xbe, 0x73, 0x64, 0x82, 0x3e, 0x0b, 0x73, 0x4d, 0xbf, 0xfc, 0xa4, 0x0f, 0xbf, + 0x05, 0x9c, 0x6e, 0x3e, 0xb1, 0x40, 0x4a, 0xbf, 0x0d, 0x9c, 0x10, 0xbf, 0xba, 0xcb, 0x2f, 0x3e, 0xbd, 0x0f, 0x56, 0xbf, 0xee, 0xc1, 0x00, 0xbf, 0x28, 0xe4, + 0x8b, 0x3e, 0xdf, 0xd3, 0x45, 0xbf, 0xd7, 0x7c, 0x11, 0xbf, 0xd5, 0xe9, 0x74, 0x3e, 0x5d, 0x08, 0x41, 0xbf, 0x6d, 0xc6, 0x12, 0xbf, 0xd2, 0x34, 0x30, 0x3e, + 0xe2, 0x80, 0x4a, 0xbf, 0x95, 0xca, 0xd1, 0xbe, 0x63, 0x86, 0xa7, 0x3d, 0x69, 0x68, 0x50, 0xbf, 0x59, 0x86, 0x02, 0xbf, 0x0b, 0x74, 0x94, 0x3e, 0xbf, 0x30, + 0x3d, 0xbf, 0xf3, 0x20, 0x11, 0xbf, 0x6d, 0xed, 0x2f, 0x3e, 0x66, 0x5d, 0x41, 0xbf, 0xde, 0xd1, 0x0d, 0xbf, 0x94, 0xdc, 0x6f, 0x3e, 0x5d, 0x09, 0x61, 0xbf, + 0xea, 0x7b, 0x0b, 0xbe, 0x3d, 0x9c, 0x8a, 0x3d, 0xf9, 0x56, 0x64, 0xbf, 0xfc, 0x59, 0xcf, 0xbd, 0x66, 0xb0, 0x5c, 0x3d, 0x40, 0x03, 0x68, 0xbf, 0xf0, 0xaa, + 0x0d, 0xbd, 0x50, 0x83, 0x5f, 0x3d, 0x39, 0x99, 0x69, 0xbf, 0x40, 0x84, 0x04, 0x3c, 0x28, 0x34, 0x99, 0x3d, 0x82, 0xe0, 0x5f, 0xbf, 0x00, 0xca, 0x9e, 0x3c, + 0xbc, 0xf5, 0xb8, 0x3d, 0xa0, 0x83, 0x68, 0xbf, 0xa0, 0x9b, 0x0b, 0xbd, 0x98, 0xec, 0x4b, 0x3d, 0xc7, 0x3f, 0x63, 0xbf, 0x64, 0x15, 0xc8, 0xbd, 0x18, 0x17, + 0x17, 0x3d, 0x08, 0x7d, 0x5f, 0xbf, 0xd8, 0x3f, 0x07, 0xbe, 0xf0, 0x33, 0x3f, 0x3d, 0xcb, 0x9c, 0x58, 0xbf, 0x34, 0xdd, 0xe8, 0xbd, 0xf0, 0x42, 0xb2, 0x3c, + 0x09, 0xaf, 0x5b, 0xbf, 0x68, 0xe7, 0x98, 0xbd, 0x80, 0x06, 0x74, 0x3c, 0x0d, 0x6a, 0x5b, 0xbf, 0x84, 0xd9, 0x2e, 0xbe, 0x9d, 0xbc, 0x8b, 0x3d, 0xf0, 0x6c, + 0x54, 0xbf, 0x68, 0xbb, 0x59, 0xbd, 0xa0, 0x64, 0x95, 0x3c, 0xbd, 0xa6, 0x5f, 0xbf, 0xe0, 0x3a, 0x42, 0xbc, 0x38, 0x1c, 0xde, 0x3c, 0x5c, 0x0f, 0x67, 0xbf, + 0xe0, 0x92, 0xe4, 0xbc, 0x0c, 0x57, 0x1d, 0x3d, 0xa0, 0x32, 0x5c, 0xbf, 0xb6, 0x4d, 0x36, 0xbe, 0x67, 0x3c, 0xc8, 0x3d, 0xf5, 0x54, 0x47, 0xbf, 0xcd, 0x67, + 0xb5, 0xbe, 0xef, 0x5e, 0x55, 0x3d, 0x99, 0x33, 0x4e, 0xbf, 0x49, 0xca, 0xb2, 0xbe, 0x1e, 0x52, 0xa2, 0x3d, 0x50, 0x6d, 0x66, 0xbf, 0x4e, 0x8b, 0x80, 0xbe, + 0xfa, 0x02, 0xbc, 0x3e, 0x00, 0xe3, 0x5e, 0xbf, 0x10, 0x2b, 0xa7, 0xbe, 0x40, 0xf5, 0xb9, 0x3e, 0x29, 0xc7, 0x66, 0xbf, 0x88, 0x60, 0x15, 0xbe, 0x5e, 0x44, + 0xae, 0x3e, 0x4e, 0x58, 0x68, 0xbf, 0x0a, 0x58, 0x80, 0xbe, 0x43, 0x05, 0xc1, 0x3e, 0x10, 0x2b, 0x61, 0xbf, 0xc0, 0xe2, 0xab, 0xbe, 0xc1, 0xd1, 0xc0, 0x3e, + 0x63, 0xb1, 0x5c, 0xbf, 0x1c, 0x67, 0xc5, 0xbe, 0xd9, 0x44, 0xa9, 0x3e, 0xd9, 0xbd, 0x6d, 0xbf, 0x44, 0x43, 0x17, 0xbe, 0x0d, 0x27, 0xb3, 0x3e, 0x92, 0x71, + 0x6e, 0xbf, 0x64, 0x54, 0x15, 0xbe, 0xda, 0x62, 0xb6, 0x3e, 0x69, 0x33, 0x68, 0xbf, 0x04, 0x6c, 0x7f, 0xbe, 0x5f, 0xd2, 0xc6, 0x3e, 0xc0, 0x91, 0x61, 0xbf, + 0x55, 0xea, 0xac, 0xbe, 0x4c, 0x25, 0xc6, 0x3e, 0xa1, 0x38, 0x62, 0xbf, 0xbe, 0x82, 0x74, 0xbe, 0xae, 0x1d, 0xcc, 0x3e, 0x32, 0x85, 0x5d, 0xbf, 0x48, 0xe6, + 0xaa, 0xbe, 0xf1, 0xb9, 0xc8, 0x3e, 0xe0, 0xc5, 0x6d, 0xbf, 0x54, 0x9a, 0x0f, 0xbe, 0x7e, 0x77, 0xbc, 0x3e, 0x6a, 0x29, 0x56, 0xbf, 0x70, 0xc3, 0xa4, 0xbe, + 0x71, 0x0f, 0xc3, 0x3e, 0x66, 0xf7, 0x59, 0xbf, 0x26, 0x24, 0xd2, 0xbe, 0x38, 0xfc, 0xb9, 0x3e, 0xe8, 0xb3, 0x66, 0xbf, 0x40, 0x5c, 0x05, 0xbe, 0x4a, 0x10, + 0xc4, 0x3e, 0x91, 0x8b, 0x52, 0xbf, 0x8a, 0x37, 0xcd, 0xbe, 0x47, 0xc5, 0xb5, 0x3e, 0x75, 0xee, 0x4f, 0xbf, 0xee, 0xfc, 0xc5, 0xbe, 0xfa, 0xd7, 0xab, 0x3e, + 0x65, 0xf2, 0x50, 0xbf, 0xd6, 0xf8, 0x97, 0xbe, 0xec, 0x28, 0x97, 0x3e, 0x61, 0xff, 0x4e, 0xbf, 0x89, 0x2d, 0xbb, 0xbe, 0x10, 0xea, 0x98, 0x3e, 0xa9, 0xd6, + 0x4b, 0xbf, 0x70, 0xf1, 0x67, 0xbe, 0x10, 0x18, 0x97, 0x3e, 0x7b, 0xab, 0x49, 0xbf, 0xea, 0x9c, 0x92, 0xbe, 0x47, 0x7a, 0x99, 0x3e, 0xa0, 0x9d, 0x4c, 0xbf, + 0x5c, 0x07, 0xb8, 0xbe, 0x77, 0x63, 0x93, 0x3e, 0x2b, 0xf7, 0x45, 0xbf, 0x20, 0x73, 0xb3, 0xbe, 0x8d, 0x18, 0x91, 0x3e, 0x6f, 0x5c, 0x4f, 0xbf, 0x2c, 0x33, + 0x25, 0xbe, 0xe8, 0xda, 0x8b, 0x3e, 0xc0, 0x01, 0x5b, 0xbf, 0x21, 0x04, 0xdc, 0xbe, 0x10, 0x07, 0x95, 0x3e, 0x7c, 0xfc, 0x55, 0xbf, 0x0c, 0xb4, 0xe9, 0xbe, + 0xea, 0xa7, 0xa8, 0x3e, 0xb7, 0x01, 0x50, 0xbf, 0x42, 0xbf, 0xe4, 0xbe, 0xb2, 0xcd, 0xa6, 0x3e, 0x71, 0xe7, 0x4c, 0xbf, 0x13, 0x34, 0xdd, 0xbe, 0xe3, 0x5c, + 0x9b, 0x3e, 0xc5, 0x6c, 0x4b, 0xbf, 0xde, 0xd6, 0xd2, 0xbe, 0x50, 0x07, 0x8d, 0x3e, 0x2f, 0x43, 0x49, 0xbf, 0xb5, 0x3b, 0xd1, 0xbe, 0xda, 0xa4, 0x88, 0x3e, + 0xde, 0x42, 0x42, 0xbf, 0xb8, 0x56, 0xcd, 0xbe, 0x11, 0x5c, 0x84, 0x3e, 0x9e, 0x20, 0x4a, 0xbf, 0xef, 0xd7, 0xff, 0xbe, 0x83, 0x5c, 0x91, 0x3e, 0x5f, 0xb4, + 0x48, 0xbf, 0x1b, 0x1b, 0xf8, 0xbe, 0x0c, 0xfd, 0x87, 0x3e, 0x28, 0xda, 0x47, 0xbf, 0x61, 0xd0, 0xef, 0xbe, 0xd3, 0x4a, 0x75, 0x3e, 0x3c, 0x24, 0x44, 0xbf, + 0x1b, 0x55, 0xeb, 0xbe, 0x9c, 0x97, 0x6d, 0x3e, 0x53, 0x6e, 0x40, 0xbf, 0x34, 0xca, 0xe6, 0xbe, 0x5c, 0x02, 0x66, 0x3e, 0xc2, 0x6c, 0x4b, 0xbf, 0x1c, 0x37, + 0x04, 0xbe, 0x34, 0xf6, 0x16, 0x3d, 0xbc, 0x94, 0x4d, 0xbf, 0x14, 0x16, 0xab, 0xbd, 0xd6, 0x8b, 0x18, 0x3d, 0xed, 0xb6, 0x5d, 0xbf, 0x70, 0x4a, 0x83, 0xbc, + 0x76, 0xee, 0xe6, 0x3d, 0xdf, 0x65, 0x69, 0xbf, 0x80, 0x19, 0xac, 0x3c, 0xae, 0x13, 0x80, 0x3d, 0x52, 0x4b, 0x6a, 0xbf, 0x40, 0x03, 0x2e, 0x3c, 0x34, 0x00, + 0x91, 0x3d, 0x3b, 0xf5, 0x61, 0xbf, 0xe0, 0xc8, 0x1b, 0x3d, 0xcc, 0x3f, 0x7d, 0x3d, 0x2b, 0x53, 0x61, 0xbf, 0x20, 0x10, 0x94, 0xbc, 0x11, 0xbb, 0x15, 0x3e, + 0x57, 0x92, 0x64, 0xbf, 0xb0, 0x32, 0x0e, 0x3d, 0x4f, 0xda, 0x10, 0x3e, 0xc5, 0x3e, 0x66, 0xbf, 0x10, 0x01, 0x2c, 0xbd, 0x68, 0xcd, 0x41, 0x3e, 0x7b, 0xf8, + 0x6c, 0xbf, 0xf0, 0x5d, 0x0a, 0x3d, 0xf3, 0x22, 0x04, 0x3e, 0xdd, 0x95, 0x6b, 0xbf, 0x30, 0xa3, 0x60, 0x3d, 0xf1, 0xb3, 0x02, 0x3e, 0x0b, 0x74, 0x6d, 0xbf, + 0x50, 0x7b, 0x18, 0x3d, 0xd1, 0xae, 0x02, 0x3e, 0x28, 0x97, 0x64, 0xbf, 0x20, 0xbf, 0x92, 0x3d, 0x5e, 0x92, 0x0b, 0x3e, 0x42, 0xbe, 0x67, 0xbf, 0xe0, 0x81, + 0xcd, 0x3c, 0xed, 0x2e, 0x5f, 0x3e, 0x72, 0x79, 0x70, 0xbf, 0x20, 0xfd, 0xe8, 0x3c, 0x05, 0xbd, 0x4c, 0x3e, 0x29, 0x87, 0x6f, 0xbf, 0x20, 0xab, 0x42, 0x3d, + 0xef, 0xd2, 0x53, 0x3e, 0x1c, 0x1d, 0x71, 0xbf, 0xe0, 0x1f, 0x00, 0x3d, 0x5d, 0x68, 0x4d, 0x3e, 0xae, 0xc4, 0x67, 0xbf, 0x90, 0xf1, 0x85, 0x3d, 0x93, 0x66, + 0x60, 0x3e, 0xf9, 0xec, 0x70, 0xbf, 0x00, 0x0b, 0x1d, 0xbb, 0x90, 0x2b, 0x80, 0x3e, 0x39, 0xae, 0x67, 0xbf, 0x00, 0x88, 0x83, 0xbb, 0x94, 0x46, 0x86, 0x3e, + 0x37, 0x7d, 0x68, 0xbf, 0x10, 0x99, 0x8a, 0xbd, 0x98, 0xa0, 0x60, 0x3e, 0xee, 0xdc, 0x70, 0xbf, 0x80, 0x53, 0x51, 0x3c, 0x62, 0x0f, 0x86, 0x3e, 0xbc, 0xb0, + 0x71, 0xbf, 0x00, 0xc0, 0x8b, 0xb8, 0x38, 0x19, 0x81, 0x3e, 0xa4, 0x9f, 0x69, 0xbf, 0x60, 0x7b, 0xfc, 0x3c, 0xae, 0x5f, 0x8e, 0x3e, 0x19, 0xe0, 0x65, 0xbf, + 0x50, 0xba, 0x22, 0xbe, 0xa0, 0xd7, 0x71, 0x3e, 0x2a, 0x6d, 0x68, 0xbf, 0x2c, 0x5b, 0xfa, 0xbd, 0x73, 0x48, 0x85, 0x3e, 0xe0, 0x7a, 0x67, 0xbf, 0x14, 0x2b, + 0x94, 0xbd, 0x28, 0xf5, 0x9e, 0x3e, 0x2f, 0x05, 0x6f, 0xbf, 0x3c, 0xe2, 0x93, 0xbd, 0x9f, 0x17, 0x9f, 0x3e, 0x1c, 0x01, 0x70, 0xbf, 0x50, 0x75, 0x78, 0xbd, + 0x4a, 0x23, 0xa6, 0x3e, 0x1c, 0x01, 0x70, 0xbf, 0x80, 0xb9, 0x8e, 0xbd, 0x33, 0x2e, 0xa1, 0x3e, 0xf3, 0x38, 0x69, 0xbf, 0xa0, 0x4a, 0x3c, 0xbd, 0x61, 0x1f, + 0xaf, 0x3e, 0xec, 0x05, 0x4d, 0xbf, 0x90, 0x0c, 0x80, 0xbd, 0xf4, 0xbe, 0x94, 0x3d, 0xb0, 0x2a, 0x4f, 0xbf, 0x50, 0x13, 0x77, 0xbd, 0x00, 0x66, 0x7e, 0x3d, + 0x42, 0x62, 0x4c, 0xbf, 0x7c, 0x05, 0xaa, 0xbd, 0x80, 0xad, 0x2f, 0x3d, 0x31, 0x80, 0x54, 0xbf, 0xb0, 0x75, 0x77, 0xbd, 0x82, 0x04, 0x4d, 0x3e, 0xe4, 0xb6, + 0x52, 0xbf, 0x68, 0x15, 0xe0, 0xbd, 0x28, 0x80, 0x79, 0x3e, 0x76, 0x7a, 0x4a, 0xbf, 0x88, 0x64, 0xfc, 0xbd, 0xf2, 0x2f, 0x14, 0x3d, 0xf6, 0xca, 0x46, 0x3f, + 0x00, 0xe4, 0x62, 0xba, 0x52, 0xd4, 0x02, 0x3e, 0x9e, 0xb3, 0x47, 0x3f, 0x60, 0xac, 0xcd, 0xbc, 0xd4, 0x37, 0x47, 0x3d, 0x7e, 0xcf, 0x4a, 0x3f, 0x58, 0xa0, + 0x68, 0xbd, 0x5c, 0x1d, 0x9d, 0x3d, 0x79, 0xc7, 0x4a, 0x3f, 0xa0, 0xd0, 0x3d, 0xbd, 0x76, 0x5e, 0xe8, 0x3d, 0xac, 0xbf, 0x3b, 0x3f, 0xb8, 0x35, 0xf0, 0xbe, + 0x1a, 0xed, 0x29, 0xbd, 0xe4, 0xbd, 0x32, 0x3f, 0x08, 0x1d, 0x24, 0xbf, 0x55, 0xbb, 0x75, 0x3d, 0x00, 0x76, 0x39, 0x3f, 0x38, 0xf2, 0x10, 0xbf, 0xfb, 0x68, + 0x1a, 0x3e, 0x41, 0x7f, 0x27, 0x3f, 0xf6, 0x40, 0x3d, 0xbf, 0xca, 0x9e, 0xf4, 0x3d, 0xa7, 0xad, 0x29, 0x3f, 0xf1, 0x31, 0x38, 0xbf, 0x07, 0x25, 0x30, 0x3e, + 0xc9, 0xf1, 0x2a, 0x3f, 0x74, 0x25, 0x41, 0xbf, 0xd1, 0x5c, 0xbc, 0x3d, 0xda, 0x3c, 0x19, 0x3e, 0xe2, 0x9a, 0x9c, 0xbe, 0xe3, 0x52, 0x74, 0xbf, 0xd9, 0x72, + 0xe7, 0x3e, 0x33, 0x79, 0x8c, 0xbe, 0x7c, 0xd0, 0x67, 0xbf, 0x94, 0x92, 0xb2, 0x3e, 0x23, 0x16, 0x9a, 0xbe, 0x60, 0x5e, 0x69, 0xbf, 0x50, 0x14, 0x1f, 0x3f, + 0x34, 0xa1, 0x29, 0xbf, 0xc0, 0x55, 0x19, 0xbf, 0xd8, 0x42, 0x1f, 0x3f, 0x92, 0x79, 0x3b, 0xbf, 0xb8, 0xd6, 0x0b, 0xbf, 0xe1, 0xce, 0xea, 0x3e, 0x22, 0x45, + 0x3d, 0xbf, 0x4f, 0xf6, 0x39, 0xbf, 0xf2, 0x80, 0x9a, 0x3e, 0x62, 0x48, 0xa0, 0xbf, 0x54, 0xb3, 0x0c, 0xbf, 0x78, 0xb9, 0x5a, 0x3e, 0x72, 0x31, 0xa3, 0xbf, + 0xce, 0xad, 0x1a, 0xbf, 0x8b, 0xb8, 0x73, 0x3e, 0x79, 0x53, 0xaa, 0xbf, 0xb6, 0xe8, 0x18, 0xbf, 0xeb, 0x3d, 0xac, 0x3e, 0xa5, 0xe6, 0x98, 0xbf, 0xcc, 0x4a, + 0x09, 0xbf, 0x5b, 0x3e, 0xd4, 0x3e, 0xba, 0x8b, 0xa5, 0xbf, 0x75, 0xa1, 0xd7, 0xbe, 0x29, 0xbb, 0x9f, 0x3e, 0x04, 0xf7, 0xb7, 0xbf, 0x72, 0x79, 0xf4, 0xbe, + 0x1b, 0x15, 0x93, 0x3e, 0x1f, 0x6a, 0xbf, 0xbf, 0x8a, 0x77, 0xd7, 0xbe, 0x51, 0x19, 0xb3, 0x3e, 0x42, 0x84, 0xb9, 0xbf, 0xad, 0xa1, 0xab, 0xbe, 0xa2, 0x34, + 0xe1, 0x3e, 0x69, 0x65, 0xac, 0xbf, 0x4d, 0x76, 0x51, 0xbe, 0x5d, 0x54, 0xf2, 0x3e, 0xee, 0xbb, 0xa4, 0xbf, 0x98, 0xb2, 0x83, 0xbe, 0x35, 0xb7, 0xe4, 0x3e, + 0x2a, 0x64, 0xa1, 0xbf, 0xf8, 0x5c, 0xc6, 0xbe, 0xd6, 0xa1, 0xf7, 0x3e, 0x2a, 0xa0, 0x9b, 0xbf, 0x9e, 0x2a, 0xae, 0xbe, 0xed, 0x60, 0xf6, 0x3e, 0xa3, 0xdf, + 0x92, 0xbf, 0x84, 0x15, 0xde, 0xbe, 0xa0, 0x1d, 0xe9, 0x3e, 0x38, 0x6d, 0x8f, 0xbf, 0x10, 0xa8, 0xfa, 0xbe, 0x84, 0x44, 0xd8, 0x3e, 0x2d, 0x77, 0x91, 0xbf, + 0xbc, 0xc2, 0x04, 0xbf, 0xaf, 0x2c, 0xc9, 0x3e, 0x7a, 0xb2, 0x95, 0xbf, 0x33, 0x5a, 0x04, 0xbf, 0x39, 0x03, 0xe8, 0x3e, 0x67, 0xdc, 0x8b, 0xbf, 0xa4, 0xd1, + 0x01, 0xbf, 0x50, 0xac, 0xc8, 0x3e, 0x34, 0x47, 0x8f, 0xbf, 0xdc, 0x77, 0x0f, 0xbf, 0x46, 0x29, 0xe3, 0x3e, 0xb8, 0x4d, 0x87, 0xbf, 0xb3, 0xfc, 0x0e, 0xbf, + 0xe1, 0xd9, 0xd6, 0x3e, 0xb0, 0x95, 0x83, 0xbf, 0xe2, 0x9d, 0x1a, 0xbf, 0x29, 0x85, 0xba, 0x3e, 0xb8, 0xc4, 0x8a, 0xbf, 0x20, 0x06, 0x19, 0xbf, 0x6c, 0xd9, + 0xf4, 0x3e, 0x9b, 0x74, 0x6d, 0xbf, 0x8d, 0xd2, 0x16, 0xbf, 0xb1, 0x55, 0x02, 0x3f, 0xbc, 0x27, 0x69, 0xbf, 0x30, 0x89, 0x12, 0xbf, 0x6d, 0x70, 0xfe, 0x3e, + 0xc6, 0xb2, 0x74, 0xbf, 0xb8, 0x8c, 0x09, 0xbf, 0x62, 0xdf, 0xef, 0x3e, 0x88, 0xe5, 0x6b, 0xbf, 0x26, 0xbf, 0x1a, 0xbf, 0x36, 0x6b, 0xe1, 0x3e, 0x42, 0xc1, + 0x7d, 0xbf, 0x2b, 0xdc, 0x18, 0xbf, 0xa1, 0x87, 0xff, 0x3e, 0x97, 0x66, 0x63, 0xbf, 0xba, 0x95, 0x1c, 0xbf, 0x0c, 0x16, 0x40, 0x3f, 0xb1, 0xf7, 0x99, 0xbe, + 0xd4, 0xa6, 0x87, 0xbd, 0xfc, 0x5e, 0x41, 0x3f, 0x46, 0xa9, 0x79, 0xbe, 0x2e, 0x40, 0x93, 0xbd, 0xac, 0x34, 0x3e, 0x3f, 0x54, 0x27, 0x56, 0xbe, 0x43, 0xa0, + 0x54, 0xbe, 0xb8, 0xe3, 0x3c, 0x3f, 0x94, 0x82, 0x7a, 0xbe, 0x3e, 0xf4, 0x9f, 0xbe, 0x9e, 0x98, 0x43, 0x3f, 0x48, 0x17, 0x8c, 0xbe, 0xf8, 0x3e, 0x00, 0xbc, + 0x2f, 0xa6, 0x44, 0x3f, 0x50, 0xf7, 0x61, 0xbe, 0x28, 0x87, 0x0f, 0xbc, 0xbd, 0xf1, 0x42, 0x3f, 0x02, 0x0b, 0x36, 0xbe, 0xff, 0xa5, 0xa4, 0xbd, 0x9c, 0x52, + 0x46, 0x3f, 0x2c, 0x85, 0x26, 0xbe, 0x50, 0x6c, 0xf5, 0xbb, 0x83, 0x5c, 0x4d, 0x3e, 0x52, 0x34, 0x86, 0xbf, 0xe7, 0x59, 0x3c, 0xbf, 0xbf, 0x7e, 0xba, 0x3e, + 0x39, 0xa5, 0x7a, 0xbf, 0x38, 0xfe, 0x29, 0xbf, 0x23, 0x8c, 0x8f, 0x3e, 0xa7, 0x8c, 0x8a, 0xbf, 0xcf, 0xe6, 0x24, 0xbf, 0x91, 0xea, 0x9e, 0x3e, 0x0d, 0x6b, + 0x8b, 0xbf, 0xfc, 0x5f, 0x1c, 0xbf, 0xe0, 0xf7, 0x80, 0x3e, 0x26, 0xd5, 0x8c, 0xbf, 0x11, 0x77, 0x2d, 0xbf, 0xa3, 0x00, 0x53, 0x3e, 0x2e, 0xf5, 0x8d, 0xbf, + 0x6e, 0x60, 0x3e, 0xbf, 0x48, 0x00, 0x1e, 0x3e, 0xbe, 0x38, 0x9e, 0xbf, 0xec, 0x9c, 0x32, 0xbf, 0xef, 0x2d, 0x1f, 0x3e, 0x3e, 0x26, 0xa1, 0xbf, 0xcc, 0xe3, + 0x24, 0xbf, 0x85, 0x22, 0x8b, 0x3e, 0xd5, 0xdc, 0x5d, 0xbf, 0x29, 0x89, 0x3d, 0xbf, 0x27, 0x30, 0x22, 0x3e, 0xdf, 0x6e, 0x85, 0xbf, 0x88, 0x27, 0x44, 0xbf, + 0x19, 0x35, 0x66, 0x3e, 0x9a, 0x41, 0x45, 0xbf, 0xf4, 0x6b, 0x4f, 0xbf, 0x95, 0x17, 0x35, 0x3e, 0x63, 0xd0, 0x56, 0xbf, 0x65, 0xfc, 0x49, 0xbf, 0x6b, 0xed, + 0x5b, 0x3d, 0xe4, 0x26, 0x8b, 0xbf, 0xf6, 0x80, 0x50, 0xbf, 0x61, 0xef, 0x86, 0x3d, 0x26, 0x85, 0x84, 0xbf, 0x36, 0x94, 0x4c, 0xbf, 0x0e, 0xb5, 0xb1, 0x3d, + 0xcf, 0x86, 0x84, 0xbf, 0x0b, 0x14, 0x4d, 0xbf, 0xfd, 0xc2, 0xa1, 0x3d, 0x36, 0x42, 0x8b, 0xbf, 0xd0, 0x68, 0x4f, 0xbf, 0x00, 0x22, 0x86, 0x3d, 0xbc, 0x50, + 0x77, 0xbf, 0xd7, 0xed, 0x4d, 0xbf, 0x56, 0x1f, 0x7d, 0x3d, 0x73, 0x3a, 0x6e, 0xbf, 0x65, 0x4e, 0x54, 0xbf, 0x10, 0x09, 0xcd, 0x3d, 0x7a, 0xec, 0x69, 0xbf, + 0x02, 0x5b, 0x53, 0xbf, 0xd4, 0x4c, 0x75, 0x3d, 0xd2, 0x07, 0x6b, 0xbf, 0xf4, 0xaa, 0x57, 0xbf, 0x0f, 0xb9, 0xb2, 0x3e, 0xba, 0xb5, 0x86, 0xbf, 0x3e, 0x68, + 0x21, 0xbf, 0xcd, 0x0f, 0xc9, 0x3e, 0x85, 0xc0, 0x80, 0xbf, 0x01, 0xc4, 0x22, 0xbf, 0x4c, 0x4d, 0xc1, 0x3d, 0xa0, 0x60, 0x57, 0xbf, 0xc3, 0x05, 0x6a, 0xbf, + 0x38, 0x2f, 0x98, 0x3d, 0x37, 0xa4, 0x5a, 0xbf, 0x26, 0xf5, 0x6e, 0xbf, 0x51, 0x84, 0x80, 0x3d, 0xe8, 0x4b, 0x5d, 0xbf, 0x25, 0xda, 0x6e, 0xbf, 0xbf, 0xcb, + 0x50, 0x3d, 0x18, 0x9a, 0x5f, 0xbf, 0x24, 0x40, 0x6e, 0xbf, 0x8e, 0xb3, 0x2f, 0x3d, 0x96, 0xab, 0x60, 0xbf, 0xa1, 0x2b, 0x6a, 0xbf, 0x09, 0x44, 0x46, 0x3d, + 0xc2, 0x2f, 0x60, 0xbf, 0x9d, 0x5f, 0x60, 0xbf, 0x8d, 0xf8, 0xea, 0x3d, 0x1a, 0xcb, 0x58, 0xbf, 0x66, 0xf4, 0x57, 0xbf, 0x06, 0x74, 0x04, 0x3e, 0xa8, 0x5c, + 0x56, 0xbf, 0xc7, 0x70, 0x58, 0xbf, 0x46, 0x71, 0x09, 0x3e, 0x04, 0x66, 0x54, 0xbf, 0x5d, 0x8e, 0x5b, 0xbf, 0x36, 0x3f, 0x02, 0x3e, 0x6c, 0xdc, 0x53, 0xbf, + 0x5b, 0xbb, 0x5f, 0xbf, 0x0a, 0x26, 0xe3, 0x3d, 0x18, 0x91, 0x54, 0xbf, 0xa8, 0x66, 0x64, 0xbf, 0xc5, 0x9b, 0xc3, 0x3d, 0xf6, 0xc2, 0x5a, 0xbf, 0x12, 0x2b, + 0x5b, 0xbf, 0xb8, 0x68, 0x32, 0x3d, 0x3e, 0xf6, 0x6c, 0xbf, 0xcc, 0x6c, 0x69, 0xbf, 0x12, 0xc8, 0x4b, 0x3d, 0xb0, 0x5a, 0x6c, 0xbf, 0xb7, 0x12, 0x5e, 0xbf, + 0x9a, 0xb0, 0x71, 0x3d, 0x82, 0xed, 0x5c, 0xbf, 0x4e, 0xef, 0x5c, 0xbf, 0x91, 0x21, 0x5d, 0x3d, 0x08, 0xbf, 0x6b, 0xbf, 0x1f, 0x2c, 0x6e, 0xbf, 0x32, 0x4c, + 0x8b, 0x3d, 0xaa, 0x1d, 0x69, 0xbf, 0x33, 0xd5, 0x6e, 0xbf, 0x61, 0xa2, 0xa9, 0x3d, 0x34, 0x16, 0x66, 0xbf, 0xb4, 0xf7, 0x6e, 0xbf, 0x83, 0x32, 0xd1, 0x3d, + 0x5b, 0x50, 0x62, 0xbf, 0xe3, 0x0d, 0x69, 0xbf, 0xbf, 0x59, 0xf5, 0x3d, 0x90, 0x1d, 0x5f, 0xbf, 0xec, 0x89, 0x62, 0xbf, 0x1f, 0xb5, 0x0e, 0x3e, 0xa4, 0x59, + 0x5e, 0xbf, 0x0e, 0x46, 0x5d, 0xbf, 0x8c, 0x67, 0x16, 0x3e, 0x66, 0xeb, 0x5e, 0xbf, 0x1d, 0x7a, 0x58, 0xbf, 0xa0, 0x50, 0x11, 0x3e, 0x70, 0x16, 0x61, 0xbf, + 0xe8, 0xcc, 0x54, 0xbf, 0xcd, 0x24, 0x01, 0x3e, 0xed, 0xc7, 0x63, 0xbf, 0xa7, 0xfa, 0x53, 0xbf, 0x24, 0x27, 0xd3, 0x3d, 0xe4, 0x20, 0x66, 0xbf, 0x22, 0x10, + 0x58, 0xbf, 0x5f, 0x6c, 0x7d, 0x3d, 0xd0, 0x9d, 0x68, 0xbf, 0x20, 0x1c, 0x5a, 0xbf, 0x95, 0xa4, 0x89, 0x3d, 0x88, 0x80, 0x6a, 0xbf, 0x0d, 0x42, 0x70, 0xbf, + 0x34, 0x99, 0xae, 0x3d, 0xce, 0xee, 0x66, 0xbf, 0xc7, 0x58, 0x70, 0xbf, 0x41, 0xdf, 0xd9, 0x3d, 0xcd, 0xf6, 0x62, 0xbf, 0x3c, 0xd8, 0x69, 0xbf, 0x87, 0x2b, + 0xfc, 0x3d, 0x04, 0xce, 0x5f, 0xbf, 0x3e, 0x7b, 0x63, 0xbf, 0x54, 0x18, 0x13, 0x3e, 0xa2, 0xee, 0x5e, 0xbf, 0x25, 0xf6, 0x5d, 0xbf, 0x52, 0xd8, 0x1b, 0x3e, + 0x5f, 0x6f, 0x5f, 0xbf, 0xac, 0x4c, 0x58, 0xbf, 0x7e, 0xe1, 0x16, 0x3e, 0x9e, 0xcc, 0x61, 0xbf, 0x48, 0xa2, 0x53, 0xbf, 0x45, 0x21, 0xee, 0x3d, 0x36, 0x8b, + 0x63, 0xbf, 0x5a, 0x2f, 0x6d, 0xbf, 0x13, 0x6f, 0x06, 0x3e, 0xd8, 0x09, 0x60, 0xbf, 0x03, 0x0c, 0x67, 0xbf, 0x07, 0x15, 0x20, 0x3e, 0x58, 0x81, 0x5e, 0xbf, + 0xa4, 0x88, 0x5f, 0xbf, 0x0d, 0xa4, 0x34, 0x3e, 0xbe, 0x82, 0x5d, 0xbf, 0x13, 0x55, 0x58, 0xbf, 0xdc, 0x77, 0x35, 0x3e, 0xce, 0x10, 0x5e, 0xbf, 0x64, 0xea, + 0x50, 0xbf, 0xd3, 0xa8, 0x29, 0x3e, 0x7b, 0xdc, 0x60, 0xbf, 0x85, 0x58, 0x4b, 0xbf, 0x74, 0x7c, 0x21, 0x3e, 0x78, 0x89, 0x46, 0xbf, 0xe9, 0xf8, 0x67, 0xbf, + 0xbc, 0xe7, 0x30, 0x3e, 0x1c, 0x38, 0x50, 0xbf, 0x1a, 0xe8, 0x67, 0xbf, 0x0d, 0xd7, 0x22, 0x3e, 0x24, 0xf1, 0x31, 0xbf, 0xbf, 0xbb, 0x5b, 0xbf, 0x9b, 0xd0, + 0xe8, 0x3d, 0x28, 0x61, 0x2a, 0xbf, 0xf9, 0xb5, 0x67, 0xbf, 0x95, 0x17, 0x35, 0x3e, 0x15, 0xfa, 0x56, 0xbf, 0xc2, 0x3f, 0x4b, 0xbf, 0x48, 0x14, 0x42, 0x3e, + 0xba, 0x39, 0x56, 0xbf, 0xee, 0x66, 0x52, 0xbf, 0xcf, 0x5b, 0x29, 0x3e, 0xbd, 0x57, 0x61, 0xbf, 0x20, 0xf4, 0x49, 0xbf, 0xc3, 0xab, 0x0a, 0x3e, 0x1a, 0x3c, + 0x69, 0xbf, 0x33, 0x9e, 0x4b, 0xbf, 0xde, 0x98, 0xbf, 0x3d, 0xdc, 0xec, 0x27, 0xbf, 0xad, 0x94, 0x6d, 0xbf, 0xda, 0x15, 0x70, 0x3d, 0x48, 0xef, 0x5a, 0xbf, + 0x24, 0x1f, 0x86, 0xbf, 0x81, 0xcc, 0x51, 0x3d, 0x14, 0xef, 0x64, 0xbf, 0x1b, 0xb1, 0x84, 0xbf, 0xd4, 0xa7, 0x1f, 0x3d, 0x54, 0x56, 0x69, 0xbf, 0x09, 0xef, + 0x83, 0xbf, 0x4c, 0xac, 0xa5, 0x3d, 0x4d, 0x80, 0x57, 0xbf, 0x76, 0x99, 0x82, 0xbf, 0x93, 0x50, 0xfa, 0x3d, 0x52, 0x0a, 0x60, 0xbf, 0x12, 0x51, 0x73, 0xbf, + 0x73, 0x09, 0xbc, 0x3d, 0xdc, 0x20, 0x55, 0xbf, 0x95, 0xf1, 0x7f, 0xbf, 0x2c, 0xa0, 0xec, 0x3d, 0x50, 0x63, 0x52, 0xbf, 0x85, 0xa3, 0x76, 0xbf, 0x37, 0x60, + 0x0c, 0x3e, 0x05, 0x16, 0x5d, 0xbf, 0x58, 0x07, 0x6d, 0xbf, 0xe5, 0xb9, 0x03, 0x3e, 0x9e, 0x7b, 0x51, 0xbf, 0xd6, 0x77, 0x71, 0xbf, 0x09, 0x81, 0x30, 0x3e, + 0x6a, 0xb9, 0x5c, 0xbf, 0xc4, 0x72, 0x63, 0xbf, 0x2f, 0x08, 0x43, 0x3e, 0xbf, 0xf6, 0x58, 0xbf, 0x1c, 0x96, 0x59, 0xbf, 0x89, 0xcc, 0x74, 0x3d, 0xd1, 0xd7, + 0x23, 0xbf, 0x4c, 0x4e, 0x77, 0xbf, 0x9f, 0xb3, 0x75, 0x3d, 0xfd, 0xc0, 0x0e, 0xbf, 0xd6, 0x8a, 0x72, 0xbf, 0x61, 0x1e, 0xc7, 0x3d, 0x1f, 0xd6, 0x14, 0xbf, + 0xa5, 0xa8, 0x68, 0xbf, 0xe5, 0x91, 0xea, 0x3d, 0xad, 0x9d, 0x17, 0xbf, 0x52, 0x24, 0x64, 0xbf, 0x5d, 0xb4, 0x76, 0x3d, 0x34, 0x64, 0xfb, 0xbe, 0x83, 0xcd, + 0x6d, 0xbf, 0x79, 0x89, 0xcd, 0x3d, 0xa0, 0x0d, 0x02, 0xbf, 0x03, 0x6f, 0x64, 0xbf, 0x97, 0x8e, 0xf7, 0x3d, 0x2f, 0x5f, 0x04, 0xbf, 0x2a, 0xc0, 0x5f, 0xbf, + 0xb4, 0xa1, 0x85, 0x3d, 0x0d, 0xd6, 0xd9, 0xbe, 0x50, 0xf4, 0x69, 0xbf, 0x61, 0xa7, 0xa7, 0x3e, 0x1e, 0xfa, 0x39, 0xbf, 0xb8, 0xf1, 0x48, 0xbf, 0x9e, 0xb0, + 0x0a, 0x3f, 0x30, 0x25, 0x00, 0xbe, 0x35, 0x9a, 0x5f, 0xbf, 0xe6, 0x18, 0xd1, 0x3e, 0x2d, 0x58, 0xa1, 0xbe, 0xc2, 0x48, 0x5a, 0xbf, 0x74, 0xb1, 0xf2, 0x3e, + 0xf7, 0xc1, 0xa5, 0xbe, 0x09, 0xb2, 0x51, 0xbf, 0x52, 0xa3, 0x05, 0x3f, 0x2c, 0x2b, 0x8a, 0xbe, 0xc9, 0xba, 0x5c, 0xbf, 0x2a, 0xf7, 0x68, 0x3e, 0x70, 0xff, + 0xcb, 0xbd, 0xff, 0x85, 0x82, 0xbf, 0x64, 0x52, 0xb2, 0x3e, 0x84, 0xe5, 0xf8, 0xbd, 0x36, 0x0b, 0x78, 0xbf, 0xe3, 0x21, 0xe6, 0x3e, 0x16, 0xc8, 0x0c, 0xbe, + 0xb0, 0x6a, 0x6d, 0xbf, 0xba, 0x8e, 0xa4, 0x3e, 0x1e, 0xa5, 0xb7, 0xbe, 0xbe, 0x57, 0x5a, 0xbf, 0x94, 0xd3, 0xc9, 0x3e, 0x1f, 0xf7, 0xb4, 0xbe, 0x04, 0xef, + 0x57, 0xbf, 0x2d, 0x8f, 0xcc, 0x3e, 0xc0, 0x70, 0xb7, 0xbe, 0xaa, 0x0c, 0x5d, 0xbf, 0xb9, 0x18, 0xa5, 0x3e, 0x8c, 0x30, 0xbb, 0xbe, 0x8c, 0x0c, 0x5f, 0xbf, + 0x8c, 0x10, 0xca, 0x3e, 0x3f, 0x49, 0xb3, 0xbe, 0x7a, 0x3a, 0x57, 0xbf, 0x8d, 0x50, 0xe4, 0x3e, 0xf1, 0xee, 0xb7, 0xbe, 0x86, 0xff, 0x4f, 0xbf, 0x80, 0xa0, + 0xe8, 0x3e, 0xae, 0xee, 0xbb, 0xbe, 0x58, 0x66, 0x53, 0xbf, 0x91, 0xe6, 0xcd, 0x3e, 0x9a, 0xf4, 0xad, 0xbe, 0x12, 0x4a, 0x5c, 0xbf, 0x2a, 0xe2, 0xa4, 0x3e, + 0xaa, 0x69, 0xaf, 0xbe, 0x07, 0x6d, 0x5f, 0xbf, 0xc0, 0x5b, 0x93, 0x3e, 0x29, 0xc5, 0xb9, 0xbe, 0x7a, 0x84, 0x57, 0xbf, 0x8f, 0xa5, 0x93, 0x3e, 0xbf, 0x43, + 0xbd, 0xbe, 0x73, 0xdc, 0x5b, 0xbf, 0xb3, 0xb7, 0xa3, 0x3e, 0xe5, 0x9f, 0xe7, 0xbe, 0xb3, 0x98, 0x4f, 0xbf, 0xc4, 0x89, 0xa6, 0x3e, 0x8c, 0x92, 0xeb, 0xbe, + 0xd1, 0x98, 0x53, 0xbf, 0xca, 0xd6, 0xc9, 0x3e, 0x32, 0x54, 0xe9, 0xbe, 0x1a, 0x66, 0x52, 0xbf, 0xc4, 0x14, 0xc7, 0x3e, 0xc0, 0x59, 0xe6, 0xbe, 0x3d, 0x2c, + 0x4f, 0xbf, 0x71, 0x71, 0x7b, 0x3e, 0x46, 0xa9, 0xd9, 0xbe, 0x54, 0x56, 0x4a, 0xbf, 0xca, 0xa4, 0x7b, 0x3e, 0xba, 0x25, 0xdc, 0xbe, 0x32, 0xa4, 0x4d, 0xbf, + 0x34, 0x7d, 0xa2, 0x3e, 0x79, 0xfa, 0xf4, 0xbe, 0xbd, 0x19, 0x4f, 0xbf, 0x35, 0xc8, 0xcb, 0x3e, 0x50, 0xe8, 0xf5, 0xbe, 0x40, 0x01, 0x4d, 0xbf, 0xd7, 0x5d, + 0xe9, 0x3e, 0x36, 0xfc, 0xdc, 0xbe, 0xf5, 0x76, 0x47, 0xbf, 0xa9, 0xf3, 0xec, 0x3e, 0x1c, 0xa7, 0xde, 0xbe, 0xb7, 0x36, 0x4a, 0xbf, 0x71, 0x2e, 0xc7, 0x3e, + 0xda, 0x2b, 0xe6, 0xbe, 0x9e, 0x24, 0x4e, 0xbf, 0xc3, 0xb3, 0xa2, 0x3e, 0x42, 0x72, 0xe7, 0xbe, 0x47, 0x79, 0x4e, 0xbf, 0xee, 0x88, 0xf8, 0x3e, 0x7c, 0xc0, + 0xc0, 0xbe, 0x02, 0x42, 0x44, 0xbf, 0x11, 0xa4, 0xfa, 0x3e, 0x9c, 0x69, 0xc5, 0xbe, 0xf3, 0x62, 0x47, 0xbf, 0xbe, 0x9d, 0xed, 0x3e, 0x5f, 0x68, 0xb3, 0xbe, + 0x6d, 0x21, 0x53, 0xbf, 0x89, 0x64, 0xe5, 0x3e, 0x04, 0x51, 0xb6, 0xbe, 0x87, 0x0e, 0x4f, 0xbf, 0x26, 0xae, 0xff, 0x3e, 0x09, 0x24, 0xc8, 0xbe, 0xf4, 0x5d, + 0x39, 0xbf, 0x3d, 0x98, 0xf7, 0x3e, 0x3a, 0x10, 0xd1, 0xbe, 0x38, 0x2f, 0x41, 0xbf, 0x62, 0xb3, 0xf9, 0x3e, 0x93, 0x07, 0xd3, 0xbe, 0xeb, 0xf5, 0x42, 0xbf, + 0x58, 0x06, 0x01, 0x3f, 0x24, 0x46, 0xc7, 0xbe, 0x7f, 0xa0, 0x37, 0xbf, 0x2c, 0xb0, 0xf9, 0x3e, 0xe8, 0x6e, 0xd0, 0xbe, 0x94, 0xbf, 0x3f, 0xbf, 0x30, 0x44, + 0x00, 0x3f, 0xa9, 0x73, 0xde, 0xbe, 0x09, 0x3d, 0x40, 0xbf, 0xb4, 0x8e, 0xea, 0x3e, 0xae, 0x96, 0xdc, 0xbe, 0xd3, 0x3b, 0x46, 0xbf, 0x59, 0xcf, 0xef, 0x3e, + 0x91, 0x9f, 0xea, 0xbe, 0x9a, 0x7e, 0x45, 0xbf, 0xfb, 0xfa, 0x76, 0x3e, 0x36, 0x05, 0xd9, 0xbe, 0xb8, 0x05, 0x49, 0xbf, 0x89, 0x5a, 0x53, 0x3e, 0x64, 0x52, + 0xd5, 0xbe, 0x66, 0x0a, 0x47, 0xbf, 0x27, 0xa3, 0x4d, 0x3e, 0x51, 0xbb, 0xd4, 0xbe, 0x2d, 0xdb, 0x45, 0xbf, 0x6f, 0xce, 0x42, 0x3e, 0xce, 0x33, 0xca, 0xbe, + 0xa2, 0x06, 0x47, 0xbf, 0x45, 0x90, 0x3c, 0x3e, 0x2e, 0x73, 0xc9, 0xbe, 0x7c, 0x11, 0x46, 0xbf, 0xad, 0x2a, 0x4f, 0x3e, 0x3e, 0xef, 0xc3, 0xbe, 0xa8, 0x12, + 0x49, 0xbf, 0x59, 0x44, 0x4f, 0x3e, 0x08, 0x2b, 0xc6, 0xbe, 0x55, 0xfd, 0x4b, 0xbf, 0x35, 0x53, 0x49, 0x3e, 0x73, 0xd7, 0xc2, 0xbe, 0xb5, 0xed, 0x47, 0xbf, + 0x91, 0x25, 0x82, 0x3e, 0xc2, 0x93, 0xbb, 0xbe, 0x66, 0xb1, 0x53, 0xbf, 0x30, 0x2f, 0x82, 0x3e, 0x29, 0xd9, 0xbe, 0xbe, 0xe3, 0xb5, 0x57, 0xbf, 0xca, 0x62, + 0x44, 0x3e, 0x4e, 0xea, 0xbb, 0xbe, 0xe0, 0xbb, 0x4c, 0xbf, 0xd6, 0x10, 0x80, 0x3e, 0xc6, 0x0c, 0xba, 0xbe, 0x83, 0xd2, 0x52, 0xbf, 0x1f, 0x9f, 0x7c, 0x3e, + 0xfc, 0x08, 0xb5, 0xbe, 0xa2, 0x0d, 0x57, 0xbf, 0x76, 0x9a, 0x91, 0x3e, 0xe2, 0x04, 0xb2, 0xbe, 0x37, 0x47, 0x5b, 0xbf, 0x1c, 0x3e, 0xfb, 0x3e, 0xf0, 0x96, + 0xbf, 0xbe, 0x48, 0x03, 0x43, 0xbf, 0x99, 0x77, 0xff, 0x3e, 0xfa, 0x8e, 0xbc, 0xbe, 0x1e, 0x5a, 0x46, 0xbf, 0x6f, 0x7a, 0x6d, 0x3e, 0xea, 0x86, 0xf5, 0xbe, + 0x0c, 0xf7, 0x46, 0xbf, 0xce, 0x0e, 0x29, 0x3e, 0x41, 0x7a, 0xfc, 0xbe, 0x79, 0xd8, 0x50, 0xbf, 0x99, 0xf8, 0x6a, 0x3e, 0x5b, 0x1b, 0x05, 0xbf, 0x75, 0xcd, + 0x4b, 0xbf, 0x6b, 0x0b, 0xa0, 0x3e, 0x86, 0x78, 0xff, 0xbe, 0x5c, 0x78, 0x4a, 0xbf, 0x59, 0xae, 0x9f, 0x3e, 0x6e, 0x26, 0xfc, 0xbe, 0x7a, 0x22, 0x4b, 0xbf, + 0x02, 0x6f, 0x13, 0x3f, 0xdc, 0x35, 0xea, 0xbe, 0x18, 0xf8, 0x30, 0xbf, 0x84, 0x60, 0x08, 0x3f, 0xb3, 0xf8, 0xfe, 0xbe, 0x08, 0x92, 0x37, 0xbf, 0xdf, 0xcc, + 0xf0, 0x3e, 0x76, 0x86, 0xf8, 0xbe, 0xe5, 0x30, 0x40, 0xbf, 0xee, 0xc8, 0xef, 0x3e, 0xe6, 0x0d, 0xf5, 0xbe, 0x5c, 0x0a, 0x41, 0xbf, 0xc6, 0x14, 0xa4, 0x3e, + 0x5c, 0x9f, 0x0a, 0xbf, 0xc9, 0xbe, 0x4a, 0xbf, 0x0a, 0x4a, 0xce, 0x3e, 0xb9, 0xa5, 0x01, 0xbf, 0x8e, 0xef, 0x47, 0xbf, 0x6b, 0x2c, 0xcd, 0x3e, 0xc2, 0xc5, + 0xff, 0xbe, 0xbd, 0xac, 0x48, 0xbf, 0xa6, 0x3c, 0xd6, 0x3e, 0xea, 0xe7, 0x0d, 0xbf, 0x8f, 0xcd, 0x45, 0xbf, 0xbb, 0xd1, 0xfb, 0x3e, 0x98, 0x8d, 0x07, 0xbf, + 0x48, 0x62, 0x3d, 0xbf, 0xe1, 0x8d, 0x76, 0x3e, 0xdc, 0x55, 0xab, 0xbe, 0xc7, 0x7a, 0x53, 0xbf, 0x33, 0x74, 0x76, 0x3e, 0x12, 0xed, 0xa6, 0xbe, 0x02, 0x78, + 0x52, 0xbf, 0xeb, 0xd9, 0x90, 0x3e, 0x4b, 0xff, 0xa6, 0xbe, 0x16, 0x40, 0x58, 0xbf, 0xe4, 0x6c, 0xa6, 0x3e, 0x28, 0x39, 0xa5, 0xbe, 0x14, 0x96, 0x5c, 0xbf, + 0x11, 0x57, 0x91, 0x3e, 0xda, 0xa2, 0xa2, 0xbe, 0x47, 0x40, 0x57, 0xbf, 0xd6, 0x70, 0xa7, 0x3e, 0x2a, 0xe8, 0xa0, 0xbe, 0xb0, 0x97, 0x5b, 0xbf, 0xd1, 0xd0, + 0xce, 0x3e, 0x18, 0x3e, 0xa4, 0xbe, 0x22, 0x15, 0x59, 0xbf, 0x75, 0xda, 0xce, 0x3e, 0x11, 0xcf, 0xa0, 0xbe, 0xc9, 0xd9, 0x57, 0xbf, 0x60, 0x1c, 0xf0, 0x3e, + 0x48, 0xf5, 0xa8, 0xbe, 0xa5, 0xc7, 0x50, 0xbf, 0x2d, 0x05, 0xef, 0x3e, 0xda, 0xa9, 0xa5, 0xbe, 0xfc, 0xeb, 0x4f, 0xbf, 0x0a, 0x6d, 0x01, 0x3f, 0x6a, 0xc1, + 0xb2, 0xbe, 0xab, 0xc8, 0x43, 0xbf, 0x25, 0x1f, 0x02, 0x3f, 0xb9, 0x2e, 0xae, 0xbe, 0x16, 0xa6, 0x42, 0xbf, 0x69, 0x2b, 0x73, 0x3e, 0x49, 0x16, 0xa6, 0xbe, + 0x77, 0x1e, 0x55, 0xbf, 0x41, 0xc1, 0x0d, 0x3f, 0xe7, 0x49, 0xab, 0xbe, 0xe7, 0x0a, 0x3e, 0xbf, 0xb3, 0xca, 0x04, 0x3f, 0x06, 0xbf, 0xac, 0xbe, 0x95, 0x5f, + 0x43, 0xbf, 0x22, 0xc3, 0x09, 0x3f, 0x5e, 0x4c, 0x9d, 0xbe, 0xa2, 0xea, 0x48, 0xbf, 0x81, 0x3a, 0x18, 0x3f, 0x9a, 0xc1, 0xcd, 0xbe, 0xd0, 0xa7, 0x2e, 0xbf, + 0xde, 0xc9, 0x10, 0x3f, 0x69, 0xd8, 0x08, 0xbf, 0xa8, 0xe3, 0x32, 0xbf, 0x00, 0xea, 0x1b, 0x3f, 0x00, 0xcb, 0xf5, 0xbe, 0xcb, 0x11, 0x2a, 0xbf, 0x32, 0x67, + 0x27, 0x3e, 0xbb, 0x9d, 0x0a, 0xbf, 0x82, 0xee, 0x56, 0xbf, 0x92, 0x20, 0x6d, 0x3e, 0x71, 0xe0, 0x0f, 0xbf, 0x1d, 0x83, 0x4f, 0xbf, 0x8e, 0x71, 0xa8, 0x3e, + 0xff, 0xea, 0x16, 0xbf, 0xff, 0xf3, 0x4a, 0xbf, 0x43, 0xed, 0x03, 0x3f, 0xfa, 0x7a, 0x13, 0xbf, 0xd7, 0xc9, 0x3a, 0xbf, 0x76, 0x14, 0x1d, 0x3f, 0xb5, 0x6b, + 0xb5, 0xbe, 0xbb, 0xb4, 0x32, 0xbf, 0x30, 0xf6, 0x0d, 0x3f, 0x25, 0x1e, 0x16, 0xbf, 0xa7, 0xa4, 0x36, 0x3f, 0xc4, 0xa4, 0x07, 0x3f, 0x77, 0xec, 0x38, 0xbf, + 0x49, 0xd7, 0x43, 0x3f, 0xd6, 0x76, 0xdb, 0x3e, 0xa8, 0x91, 0x31, 0xbf, 0x75, 0x37, 0x56, 0x3f, 0xde, 0xe4, 0xe5, 0x3e, 0x56, 0xbd, 0x0b, 0xbf, 0x0c, 0xbd, + 0x4d, 0x3f, 0x23, 0xeb, 0x16, 0x3f, 0x4a, 0x6e, 0x20, 0xbf, 0xae, 0xc2, 0x22, 0x3f, 0x6d, 0x92, 0x11, 0x3f, 0x8e, 0xe8, 0x44, 0xbf, 0x2e, 0xf0, 0x30, 0x3f, + 0x79, 0x9d, 0x08, 0x3f, 0x93, 0x9f, 0x5b, 0xbf, 0x2e, 0x2e, 0x57, 0x3f, 0x1e, 0x0e, 0xe1, 0x3e, 0xa4, 0x05, 0x53, 0xbf, 0xc6, 0x27, 0x6b, 0x3f, 0x7a, 0xb6, + 0x9d, 0x3e, 0x58, 0x07, 0x2a, 0xbf, 0xdc, 0xdb, 0x67, 0x3f, 0x53, 0x24, 0x9f, 0x3e, 0x71, 0x86, 0x02, 0xbf, 0x8d, 0xe9, 0x60, 0x3f, 0xce, 0x5e, 0x15, 0x3f, + 0x3c, 0xd2, 0xd8, 0xbe, 0x33, 0x0e, 0x34, 0x3f, 0xb8, 0x27, 0xee, 0x3e, 0x80, 0xdb, 0xbd, 0xbe, 0xc8, 0xde, 0x50, 0x3f, 0x59, 0x19, 0x10, 0x3f, 0xff, 0x4a, + 0x81, 0xbf, 0xee, 0x2f, 0x23, 0x3f, 0x31, 0x42, 0x11, 0x3f, 0xf4, 0xed, 0x77, 0xbf, 0x97, 0x8a, 0x30, 0x3f, 0x79, 0xbd, 0x15, 0x3f, 0x14, 0x8e, 0x69, 0xbf, + 0x7a, 0x5e, 0xf9, 0x3e, 0x9a, 0xd2, 0x11, 0x3f, 0xfe, 0xd1, 0x88, 0xbf, 0x65, 0xee, 0x0a, 0x3f, 0x45, 0x45, 0x13, 0x3f, 0x4e, 0xd8, 0x68, 0xbf, 0x87, 0xfe, + 0x43, 0x3f, 0x88, 0x09, 0x24, 0x3f, 0x32, 0x04, 0x3e, 0xbf, 0x73, 0x90, 0xe1, 0x3e, 0xa7, 0x0a, 0x9f, 0x3e, 0xd0, 0x6c, 0xaa, 0xbf, 0x48, 0xa8, 0x13, 0xbd, + 0x05, 0x9e, 0x7f, 0x3e, 0x7e, 0x33, 0xaf, 0xbf, 0xd1, 0x11, 0x16, 0x3e, 0x3b, 0x04, 0xe5, 0x3e, 0xa3, 0xf2, 0x9e, 0xbf, 0xfc, 0x15, 0x48, 0xbd, 0x47, 0x94, + 0xd3, 0x3e, 0x80, 0xdf, 0xa7, 0xbf, 0xf8, 0xc3, 0xe0, 0xbd, 0x97, 0xe7, 0xb0, 0x3d, 0xde, 0x23, 0xc8, 0xbf, 0xf5, 0x9c, 0x01, 0xbf, 0xeb, 0xee, 0xba, 0x3d, + 0xc3, 0xda, 0xc5, 0xbf, 0x2f, 0x09, 0x0b, 0xbf, 0x40, 0xe0, 0xa6, 0x3d, 0xf4, 0x1c, 0xc8, 0xbf, 0x04, 0xa9, 0xee, 0xbe, 0x3f, 0x55, 0xef, 0x3d, 0x3d, 0x90, + 0xbf, 0xbf, 0xfb, 0x5b, 0x1a, 0xbf, 0x67, 0xec, 0xa5, 0x3d, 0x92, 0x74, 0xa1, 0xbf, 0xd5, 0xd6, 0x25, 0xbf, 0xf4, 0x4d, 0xc2, 0x3d, 0x94, 0xea, 0xa4, 0xbf, + 0xd6, 0x16, 0x21, 0xbf, 0x44, 0x35, 0x29, 0x3e, 0x11, 0x1f, 0xa5, 0xbf, 0x52, 0x6e, 0x20, 0xbf, 0x20, 0x19, 0xe3, 0x3d, 0xb5, 0x72, 0xaa, 0xbf, 0x4b, 0x5b, + 0x21, 0xbf, 0x64, 0xd0, 0x3c, 0x3e, 0x2c, 0xe2, 0xa9, 0xbf, 0x00, 0x41, 0x20, 0xbf, 0x90, 0x33, 0x9e, 0x3d, 0x20, 0x25, 0xa0, 0xbf, 0x98, 0x8b, 0x36, 0xbf, + 0xb1, 0xaa, 0x1a, 0x3f, 0x6c, 0x38, 0x19, 0xbf, 0x40, 0xb5, 0x26, 0xbf, 0xad, 0xae, 0x26, 0x3f, 0x70, 0x6c, 0x06, 0xbf, 0x6e, 0xd6, 0x1a, 0xbf, 0x64, 0xf2, + 0x0a, 0x3f, 0xf9, 0xe9, 0x26, 0xbf, 0xcc, 0x00, 0x33, 0xbf, 0x51, 0x65, 0x2b, 0x3f, 0x4e, 0x1e, 0x15, 0xbf, 0xf5, 0x77, 0x0a, 0xbf, 0x9c, 0x66, 0x24, 0x3f, + 0xea, 0x47, 0xa9, 0xbe, 0x9b, 0xa5, 0x2a, 0xbf, 0x49, 0x72, 0xa9, 0x3e, 0x7c, 0x6c, 0x27, 0xbf, 0x51, 0xee, 0x4a, 0xbf, 0x58, 0x2e, 0x31, 0x3e, 0x5a, 0xa9, + 0x1d, 0xbf, 0x38, 0x12, 0x59, 0xbf, 0xee, 0x36, 0x29, 0x3f, 0x3c, 0x3b, 0x94, 0xbe, 0xe4, 0xad, 0x1e, 0xbf, 0x95, 0xdf, 0xd5, 0x3e, 0x63, 0x5b, 0x3c, 0xbf, + 0xfc, 0x42, 0x3f, 0xbf, 0x41, 0xb8, 0x1b, 0x3f, 0xa3, 0x88, 0x4f, 0xbf, 0x2e, 0x86, 0xfa, 0xbe, 0xfc, 0x62, 0x2a, 0x3f, 0x88, 0xcd, 0x29, 0xbf, 0xb1, 0xdf, + 0xf4, 0xbe, 0xa2, 0xc2, 0x32, 0x3e, 0x9a, 0x52, 0xbf, 0xbf, 0x37, 0x2b, 0x15, 0xbf, 0x2c, 0x17, 0x46, 0x3e, 0x76, 0xa9, 0xb4, 0xbf, 0x82, 0xd7, 0x1c, 0xbf, + 0xb8, 0xff, 0x02, 0x3e, 0x13, 0xbb, 0xb4, 0xbf, 0x14, 0xce, 0x20, 0xbf, 0x21, 0x99, 0x30, 0x3f, 0x90, 0xd3, 0xaa, 0xbe, 0x1d, 0x66, 0x00, 0xbf, 0x1e, 0xe3, + 0x39, 0x3f, 0x21, 0x4e, 0x95, 0xbe, 0x10, 0xf7, 0xcd, 0xbe, 0x6a, 0xf5, 0x24, 0x3f, 0x82, 0x0e, 0x3e, 0xbf, 0x64, 0x09, 0xd1, 0xbe, 0x74, 0x7e, 0x1b, 0x3e, + 0x88, 0xd1, 0x8c, 0xbf, 0xfc, 0x55, 0x48, 0xbf, 0x9b, 0xc6, 0x05, 0x3f, 0x4c, 0x64, 0x8a, 0xbf, 0xb6, 0x85, 0xc9, 0xbe, 0x66, 0xbc, 0x18, 0x3e, 0x3b, 0xee, + 0xc4, 0xbf, 0x3f, 0x87, 0xc5, 0xbe, 0x72, 0x37, 0x09, 0x3e, 0x66, 0x83, 0xc0, 0xbf, 0xb5, 0x18, 0x90, 0xbe, 0x86, 0x0a, 0x09, 0x3e, 0xf2, 0x9f, 0xbb, 0xbf, + 0x5e, 0xc7, 0x35, 0xbe, 0x5e, 0x00, 0x06, 0x3f, 0x30, 0xec, 0x95, 0xbf, 0x9c, 0x77, 0x9d, 0xbe, 0xb3, 0xfc, 0x00, 0x3f, 0x96, 0x5f, 0x9e, 0xbf, 0x3d, 0xe1, + 0x58, 0xbe, 0xf8, 0xa6, 0x0a, 0x3f, 0x38, 0x48, 0x6e, 0xbf, 0xfe, 0xd0, 0x02, 0xbf, 0xeb, 0xb6, 0x17, 0x3f, 0x71, 0x45, 0x62, 0xbf, 0xec, 0x65, 0xdc, 0xbe, + 0xe6, 0x4e, 0x13, 0x3f, 0xe8, 0xc6, 0x76, 0xbf, 0xae, 0xd5, 0xbb, 0xbe, 0xe7, 0xd9, 0x10, 0x3f, 0x3e, 0x80, 0x81, 0xbf, 0x9e, 0x51, 0xa8, 0xbe, 0x24, 0x16, + 0x10, 0x3f, 0x47, 0x3e, 0x8d, 0xbf, 0x2e, 0x49, 0x7b, 0xbe, 0x65, 0xc4, 0xf6, 0x3e, 0x61, 0xf7, 0xa4, 0xbf, 0x1e, 0xe6, 0x1f, 0xbe, 0x0f, 0x51, 0x0b, 0x3f, + 0xca, 0x1e, 0x96, 0xbf, 0x30, 0x80, 0x1e, 0xbe, 0x34, 0xc8, 0x05, 0x3f, 0x40, 0xcf, 0x9b, 0xbf, 0x88, 0x46, 0xcf, 0xbd, 0xd2, 0x3a, 0x1f, 0x3f, 0xce, 0xaf, + 0x50, 0xbf, 0xb6, 0x65, 0xae, 0xbe, 0xc9, 0xd6, 0x26, 0x3f, 0x3d, 0x9f, 0x3f, 0xbf, 0xea, 0xa8, 0x72, 0xbe, 0x0a, 0xf0, 0x2c, 0x3f, 0x3e, 0xe8, 0x45, 0xbf, + 0xb0, 0x37, 0x3b, 0x3d, 0x4c, 0xa8, 0x0e, 0x3f, 0x76, 0xaf, 0x91, 0xbf, 0x34, 0xb2, 0x4f, 0xbd, 0x1b, 0xf7, 0x17, 0x3f, 0xdc, 0x1a, 0x86, 0xbf, 0xc0, 0x94, + 0xf7, 0x3b, 0x4c, 0xce, 0x44, 0x3f, 0x3a, 0x25, 0xb7, 0xbe, 0xe6, 0xc5, 0xd1, 0x3c, 0x9b, 0x37, 0x1f, 0x3f, 0x6a, 0x18, 0x62, 0xbf, 0x44, 0xdf, 0xd9, 0x3d, + 0xfd, 0x59, 0x15, 0x3f, 0x43, 0x59, 0x75, 0xbf, 0x9e, 0xa1, 0xb9, 0x3d, 0x39, 0x9f, 0x06, 0x3f, 0x57, 0x81, 0x89, 0xbf, 0x50, 0x6f, 0x44, 0x3d, 0x14, 0x54, + 0xf6, 0x3e, 0x66, 0x74, 0x95, 0xbf, 0x80, 0x40, 0xf2, 0x3a, 0x79, 0x40, 0xc1, 0x3e, 0x69, 0x5f, 0xaf, 0xbf, 0xda, 0x44, 0x27, 0xbe, 0x52, 0x44, 0xac, 0x3e, + 0x0f, 0x33, 0xb7, 0xbf, 0xde, 0xab, 0x6a, 0xbe, 0x25, 0x2c, 0x2e, 0x3f, 0xc4, 0x9a, 0x16, 0xbf, 0xae, 0x52, 0xcc, 0x3e, 0x9c, 0x97, 0x23, 0x3f, 0xf1, 0xa4, + 0x06, 0xbf, 0xf0, 0x48, 0x05, 0x3f, 0x92, 0xa8, 0x2d, 0x3f, 0x18, 0x5b, 0xc3, 0xbe, 0xce, 0xc1, 0xf9, 0x3e, 0xc0, 0xd3, 0x2f, 0x3f, 0x86, 0x9e, 0x1f, 0xbf, + 0xca, 0x29, 0xa0, 0x3e, 0xb0, 0xe1, 0x1f, 0x3f, 0x94, 0xa5, 0xf5, 0xbe, 0xa7, 0x19, 0x1a, 0x3f, 0xa1, 0x14, 0x26, 0x3f, 0x92, 0x1b, 0xaa, 0xbe, 0xc6, 0x96, + 0x17, 0x3f, 0xbe, 0xf7, 0x25, 0x3f, 0x84, 0x5d, 0x47, 0xbf, 0xec, 0x61, 0xae, 0x3e, 0x10, 0xd3, 0x16, 0x3f, 0xd1, 0x1c, 0x77, 0xbf, 0xd6, 0x56, 0xc4, 0x3e, + 0x3c, 0x4e, 0x0d, 0x3f, 0x4a, 0x7e, 0x93, 0xbf, 0x12, 0x42, 0xc9, 0x3e, 0x60, 0xdd, 0x2f, 0x3f, 0xaa, 0xa2, 0x2c, 0xbf, 0xe0, 0x7f, 0x6e, 0x3e, 0x9c, 0xc7, + 0x25, 0x3f, 0xac, 0x2d, 0x52, 0xbf, 0xa8, 0x54, 0x85, 0x3e, 0x18, 0x67, 0x11, 0x3f, 0xae, 0x84, 0x83, 0xbf, 0x73, 0xd4, 0xa1, 0x3e, 0xc8, 0xa1, 0x1b, 0x3f, + 0x58, 0xe7, 0x5d, 0xbf, 0x36, 0xfe, 0x4d, 0x3e, 0x46, 0x86, 0x07, 0x3f, 0x94, 0x98, 0x87, 0xbf, 0x07, 0x7d, 0x88, 0x3e, 0xab, 0x84, 0xfb, 0x3e, 0x00, 0x42, + 0x9a, 0xbf, 0x3c, 0x58, 0x9c, 0x3e, 0x95, 0xe0, 0xfe, 0x3d, 0x10, 0x20, 0xb5, 0xbf, 0x60, 0xfe, 0x71, 0xbd, 0x70, 0x61, 0x05, 0x3e, 0x04, 0x35, 0xb2, 0xbf, + 0x00, 0x41, 0x46, 0x3c, 0x5a, 0x2e, 0x24, 0x3e, 0x06, 0x0b, 0xb4, 0xbf, 0x22, 0x3d, 0x99, 0x3d, 0xf5, 0xfc, 0x70, 0x3e, 0x00, 0xb0, 0x5f, 0xbc, 0xcc, 0xd3, + 0x70, 0x3f, 0x74, 0x0b, 0x59, 0x3e, 0x04, 0x85, 0x41, 0xbe, 0x4d, 0x63, 0x72, 0x3f, 0xb2, 0x9e, 0x47, 0x3e, 0xc1, 0x12, 0xa7, 0xbe, 0xa2, 0x7d, 0x6e, 0x3f, + 0xb2, 0x5e, 0x2d, 0x3e, 0xfe, 0xc6, 0xfb, 0xbe, 0xf6, 0xd0, 0x69, 0x3f, 0x47, 0x44, 0x2c, 0x3e, 0x83, 0x78, 0x25, 0xbf, 0x5a, 0xcd, 0x6f, 0x3f, 0x8b, 0x64, + 0x35, 0x3e, 0x82, 0x1c, 0x48, 0xbf, 0x75, 0x25, 0x81, 0x3f, 0xd1, 0x51, 0xba, 0x3e, 0x90, 0x00, 0x99, 0xbc, 0x42, 0xc6, 0x64, 0x3f, 0x9d, 0xda, 0xb4, 0x3e, + 0xd0, 0x20, 0x4d, 0xbe, 0xfc, 0xea, 0x66, 0x3f, 0x89, 0x5c, 0xaa, 0x3e, 0x80, 0xb3, 0xaa, 0xbe, 0xf0, 0x3c, 0x65, 0x3f, 0xe9, 0xb4, 0xa8, 0x3e, 0xd2, 0x7d, + 0x4c, 0xbf, 0xb0, 0x53, 0x79, 0x3f, 0xdc, 0x17, 0xf7, 0x3e, 0xd0, 0x4e, 0x62, 0xbd, 0x87, 0xc8, 0x50, 0x3f, 0x12, 0xa6, 0xf4, 0x3e, 0x28, 0xa0, 0x69, 0xbe, + 0x78, 0x66, 0x51, 0x3f, 0x57, 0xa8, 0x19, 0x3f, 0xd0, 0xb4, 0xd6, 0xbd, 0xc2, 0x0a, 0x34, 0x3f, 0x8e, 0x7b, 0x17, 0x3f, 0x23, 0x48, 0x8b, 0xbe, 0x31, 0xb3, + 0x34, 0x3f, 0xbd, 0x26, 0x2b, 0x3f, 0xe8, 0x3f, 0x2f, 0xbe, 0x1b, 0x3b, 0x18, 0x3f, 0x38, 0x44, 0xdc, 0x3e, 0x44, 0xc5, 0x91, 0xbf, 0xfe, 0x9e, 0x50, 0x3e, + 0xab, 0xa2, 0xeb, 0x3e, 0x79, 0xcd, 0x88, 0xbf, 0x5e, 0x2f, 0xd4, 0x3d, 0x19, 0xb2, 0xcd, 0x3e, 0xfd, 0x49, 0x9e, 0xbf, 0x21, 0x93, 0x80, 0x3e, 0x60, 0xfd, + 0x3c, 0x3f, 0x4c, 0x78, 0xe5, 0xbe, 0xd6, 0x34, 0x65, 0x3e, 0x32, 0xed, 0x3e, 0x3f, 0x7a, 0x5a, 0x0b, 0xbe, 0x9b, 0x36, 0xa2, 0x3e, 0xfa, 0x5d, 0x44, 0x3f, + 0x98, 0x3c, 0x24, 0xbe, 0x92, 0xac, 0x89, 0x3e, 0xe2, 0x0d, 0x42, 0x3f, 0x72, 0x68, 0x5f, 0xbe, 0x56, 0x52, 0x97, 0x3e, 0x58, 0xc3, 0x40, 0x3f, 0xfc, 0xa6, + 0x9f, 0xbd, 0x78, 0x77, 0x96, 0x3e, 0x93, 0xfe, 0x42, 0x3f, 0x00, 0x4e, 0x9a, 0xbc, 0x76, 0x74, 0x85, 0x3e, 0x82, 0xd7, 0x4a, 0x3f, 0xfc, 0xe5, 0x92, 0xbd, + 0xe6, 0xb6, 0x49, 0x3e, 0x9d, 0xb3, 0x47, 0x3f, 0x00, 0xb9, 0xf0, 0xbd, 0x98, 0x98, 0x74, 0x3e, 0x7e, 0x8a, 0x4a, 0x3f, 0x48, 0x18, 0x56, 0xbd, 0x98, 0x8d, + 0x25, 0x3e, 0x0d, 0xbb, 0x44, 0x3f, 0xa0, 0xf5, 0xa5, 0x3c, 0xf8, 0x37, 0x5c, 0x3e, 0x8c, 0xe9, 0xa1, 0x3e, 0x8c, 0xe0, 0xa8, 0xbf, 0x97, 0x80, 0x3f, 0x3e, + 0xc8, 0xc5, 0xbf, 0x3e, 0x2e, 0x10, 0x99, 0xbf, 0xc7, 0x7d, 0x2f, 0x3e, 0x4e, 0x97, 0xca, 0x3e, 0x46, 0x60, 0x95, 0xbf, 0xb0, 0x17, 0x81, 0x3d, 0xde, 0xdb, + 0x45, 0x3f, 0x3a, 0xab, 0x9f, 0xbe, 0x62, 0x70, 0xab, 0x3c, 0xad, 0x80, 0x41, 0x3f, 0x6d, 0x7a, 0x8c, 0xbe, 0x40, 0x78, 0x9c, 0x3e, 0xc7, 0xaa, 0xd3, 0x3e, + 0x58, 0x58, 0x57, 0xbe, 0xe4, 0x02, 0x38, 0xbf, 0x25, 0x00, 0x38, 0x3e, 0x02, 0x16, 0x81, 0xbe, 0xaf, 0x10, 0x33, 0xbf, 0x80, 0x77, 0xc6, 0x3d, 0x74, 0xf5, + 0x9c, 0xbe, 0x86, 0x42, 0x2e, 0xbf, 0xe7, 0xda, 0x8d, 0x3d, 0xf8, 0x66, 0xb5, 0xbe, 0xa8, 0x26, 0x2a, 0xbf, 0x5d, 0x5c, 0xc4, 0x3d, 0xf0, 0x06, 0xcb, 0xbe, + 0x54, 0x4d, 0x26, 0xbf, 0xd6, 0x92, 0x2e, 0x3e, 0xc4, 0xf9, 0xd9, 0xbe, 0x82, 0x71, 0x23, 0xbf, 0xbd, 0xfa, 0x91, 0x3e, 0x3d, 0x80, 0xe8, 0xbe, 0xfe, 0x73, + 0x21, 0xbf, 0x08, 0xbf, 0xd0, 0x3e, 0xb7, 0xf4, 0xec, 0xbe, 0xb4, 0x96, 0x22, 0xbf, 0xc7, 0xce, 0x03, 0x3f, 0x86, 0xc9, 0xe6, 0xbe, 0xe7, 0x64, 0x25, 0xbf, + 0x20, 0xf8, 0x14, 0x3f, 0xb6, 0x23, 0xd7, 0xbe, 0x89, 0x5f, 0x28, 0xbf, 0x57, 0x46, 0x1b, 0x3f, 0x0a, 0xa1, 0xc2, 0xbe, 0xba, 0xe0, 0x2b, 0xbf, 0x91, 0xf1, + 0x16, 0x3f, 0xae, 0xfe, 0xa2, 0xbe, 0x0d, 0x58, 0x31, 0xbf, 0xd0, 0xf2, 0x04, 0x3f, 0x9c, 0x03, 0x80, 0xbe, 0x1d, 0x6b, 0x36, 0xbf, 0xb7, 0xa9, 0x4b, 0x3f, + 0x18, 0x68, 0x7b, 0xbd, 0xe8, 0xde, 0x9f, 0x3d, 0x68, 0x50, 0x43, 0x3f, 0x70, 0x07, 0x62, 0xbe, 0x31, 0xca, 0x94, 0x3e, 0x65, 0x79, 0x42, 0x3f, 0x7c, 0x4c, + 0x8d, 0xbe, 0xcb, 0x78, 0x9a, 0x3e, 0xbf, 0xf8, 0x45, 0x3f, 0xc0, 0xc0, 0x26, 0xbe, 0xe5, 0x5c, 0x87, 0x3e, 0x6b, 0x82, 0x3f, 0x3f, 0x11, 0x8a, 0xcb, 0xbe, + 0xaf, 0x75, 0x81, 0x3e, 0xda, 0x2f, 0x3e, 0x3f, 0x8c, 0xa3, 0xe4, 0xbe, 0x15, 0x09, 0x62, 0x3e, 0x93, 0x8e, 0x49, 0x3f, 0xd0, 0x5c, 0xf5, 0xbd, 0xf6, 0xc7, + 0x70, 0x3e, 0xf5, 0x8b, 0x4c, 0x3f, 0xd8, 0x7f, 0x98, 0xbd, 0x15, 0x82, 0x45, 0x3e, 0x59, 0xf8, 0x4b, 0x3f, 0x88, 0x69, 0x65, 0xbd, 0x37, 0xfb, 0x23, 0x3e, + 0x4b, 0x2d, 0x4c, 0x3f, 0x80, 0x69, 0x4e, 0xbd, 0x7e, 0x87, 0xe9, 0x3d, 0x12, 0x7f, 0x41, 0x3f, 0xe1, 0xd2, 0xb0, 0xbe, 0xec, 0x35, 0x8f, 0x3e, 0x8f, 0x62, + 0x53, 0x3f, 0x48, 0xdf, 0x26, 0xbe, 0xca, 0x42, 0x5d, 0x3e, 0x48, 0x68, 0x5d, 0x3f, 0xc8, 0xcc, 0x27, 0xbe, 0x88, 0x50, 0x4f, 0x3e, 0xf5, 0xa6, 0x50, 0x3f, + 0xf0, 0xac, 0x0f, 0xbe, 0x08, 0x5a, 0x32, 0x3e, 0x8f, 0x47, 0x4f, 0x3f, 0xaa, 0xf4, 0x39, 0xbe, 0x22, 0x0d, 0x5e, 0x3e, 0x23, 0x37, 0x60, 0x3f, 0x5c, 0x2f, + 0x36, 0xbe, 0xa1, 0x8b, 0x6e, 0x3e, 0xab, 0x75, 0x55, 0x3f, 0x5c, 0x09, 0xf0, 0xbd, 0xe6, 0x69, 0x1f, 0x3e, 0x21, 0x55, 0x50, 0x3f, 0x88, 0xc1, 0x27, 0xbe, + 0xa5, 0xd9, 0x1a, 0x3e, 0xaa, 0x3e, 0x50, 0x3f, 0x68, 0x9e, 0xf2, 0xbd, 0xc8, 0x8e, 0x02, 0x3e, 0x00, 0xcc, 0x4e, 0x3f, 0x80, 0x34, 0x69, 0xbe, 0x33, 0xe4, + 0x54, 0x3e, 0x27, 0xe8, 0x4d, 0x3f, 0x58, 0x80, 0x7c, 0xbe, 0x1e, 0x4b, 0x84, 0x3e, 0x07, 0xe9, 0x4c, 0x3f, 0x11, 0x64, 0x92, 0xbe, 0x46, 0x54, 0xc2, 0x3d, + 0x0b, 0xa6, 0x46, 0x3f, 0x94, 0x83, 0x8a, 0xbe, 0xae, 0xed, 0x1a, 0x3e, 0x76, 0x6c, 0x4f, 0x3f, 0xea, 0x64, 0x9d, 0xbe, 0xea, 0xc5, 0xe9, 0x3d, 0xcd, 0x6e, + 0x50, 0x3f, 0xbf, 0x11, 0xef, 0xbe, 0x34, 0x35, 0x22, 0x3e, 0x84, 0x83, 0x52, 0x3f, 0x7c, 0x93, 0xd8, 0xbe, 0x40, 0x27, 0x11, 0x3e, 0x4c, 0xef, 0x4e, 0x3f, + 0x87, 0xc9, 0x07, 0xbf, 0x42, 0x04, 0x32, 0x3e, 0xf0, 0xce, 0x52, 0x3f, 0x29, 0x91, 0xf2, 0xbe, 0xdf, 0x07, 0x43, 0x3e, 0x19, 0x37, 0x55, 0x3f, 0x98, 0xf1, + 0xd6, 0xbe, 0x14, 0xbb, 0x23, 0x3e, 0xa4, 0x12, 0x5a, 0x3f, 0x8e, 0xc9, 0x08, 0xbe, 0xd3, 0xe1, 0xb3, 0x3e, 0x5b, 0x66, 0x56, 0x3f, 0x04, 0xfb, 0x6d, 0xbe, + 0x9f, 0x2f, 0xb9, 0x3e, 0xc7, 0x6c, 0x56, 0x3f, 0x68, 0xb0, 0x70, 0xbe, 0xe1, 0x12, 0xa3, 0x3e, 0xa7, 0x88, 0x59, 0x3f, 0x96, 0x2b, 0x18, 0xbe, 0x25, 0x94, + 0x9d, 0x3e, 0x6f, 0xc9, 0x5c, 0x3f, 0xe0, 0xd0, 0x03, 0xbe, 0x29, 0x7d, 0xbf, 0x3e, 0x22, 0x62, 0x59, 0x3f, 0x60, 0xeb, 0x6d, 0xbe, 0xd0, 0x34, 0xc4, 0x3e, + 0xbf, 0xd3, 0x52, 0x3f, 0xf3, 0xbb, 0xa0, 0xbe, 0xa6, 0x3d, 0xb9, 0x3e, 0x99, 0xb7, 0x53, 0x3f, 0x1b, 0x4b, 0x9b, 0xbe, 0xa4, 0x12, 0xa0, 0x3e, 0xe8, 0x0b, + 0x53, 0x3f, 0xfa, 0x20, 0x6f, 0xbe, 0x6e, 0xbf, 0x97, 0x3e, 0xdf, 0x8c, 0x56, 0x3f, 0xc6, 0x69, 0x23, 0xbe, 0xb0, 0xfc, 0x8d, 0x3e, 0x0f, 0x49, 0x5c, 0x3f, + 0xb0, 0x1d, 0x67, 0xbd, 0x64, 0x1e, 0xa4, 0x3e, 0xb1, 0x52, 0x5c, 0x3f, 0xa4, 0xab, 0xa5, 0xbd, 0xd8, 0xf1, 0x8f, 0x3e, 0x34, 0xb9, 0x53, 0x3f, 0x18, 0xc9, + 0xf0, 0xbd, 0x47, 0x8c, 0x9d, 0x3d, 0xa9, 0xee, 0x63, 0x3f, 0x20, 0x55, 0xcc, 0xbd, 0x0a, 0xac, 0x70, 0x3d, 0x03, 0x7d, 0x5f, 0x3f, 0xd6, 0xd7, 0x02, 0xbe, + 0x40, 0x27, 0x9c, 0x3d, 0x21, 0xeb, 0x5c, 0x3f, 0xe8, 0x9b, 0xce, 0xbd, 0xb8, 0xe0, 0x0c, 0x3e, 0xbd, 0x07, 0x61, 0x3f, 0xa8, 0x49, 0xa3, 0xbd, 0x36, 0xf2, + 0x08, 0x3e, 0x75, 0x46, 0x5f, 0x3f, 0x08, 0x8d, 0x5c, 0xbd, 0xcc, 0x26, 0xcd, 0x3d, 0x31, 0xad, 0x47, 0x3f, 0x82, 0x7f, 0xb3, 0xbe, 0x19, 0x22, 0xfd, 0x3d, + 0x31, 0x01, 0x40, 0x3f, 0xbd, 0x18, 0xb7, 0xbe, 0x36, 0x82, 0x29, 0x3e, 0xf1, 0xa8, 0x3f, 0x3f, 0x9c, 0x0f, 0xab, 0xbe, 0x18, 0xa7, 0x30, 0x3e, 0x3e, 0x1e, + 0x49, 0x3f, 0xfe, 0x37, 0xc9, 0xbe, 0x4c, 0xca, 0xf8, 0x3d, 0x95, 0x1a, 0x44, 0x3f, 0x3e, 0xdf, 0xc4, 0xbe, 0x07, 0xcb, 0x14, 0x3e, 0xb1, 0x9c, 0x42, 0x3f, + 0x08, 0xd1, 0xb0, 0xbe, 0x91, 0xb0, 0x56, 0x3e, 0xde, 0x7b, 0x41, 0x3f, 0x9d, 0x51, 0x9e, 0xbe, 0x3a, 0x99, 0x41, 0x3e, 0xc2, 0x19, 0x50, 0x3f, 0xad, 0xb9, + 0xaf, 0xbe, 0x68, 0x5e, 0xf9, 0x3d, 0xfe, 0xf5, 0x4a, 0x3f, 0xaa, 0xeb, 0xc9, 0xbe, 0x2e, 0xf0, 0xee, 0x3d, 0x09, 0xaa, 0x52, 0x3f, 0xe2, 0x96, 0xb0, 0xbe, + 0x62, 0xd6, 0xd2, 0x3d, 0xf1, 0xe4, 0x4d, 0x3f, 0xab, 0xfd, 0xcb, 0xbe, 0x74, 0xf4, 0xcf, 0x3d, 0xb2, 0x78, 0x4c, 0x3f, 0x26, 0x5d, 0x84, 0xbe, 0x2b, 0xbf, + 0x83, 0x3e, 0x87, 0x9f, 0x53, 0x3f, 0x4d, 0xdb, 0x8c, 0xbe, 0xfe, 0x47, 0x8e, 0x3e, 0x2c, 0xc0, 0x4b, 0x3f, 0x66, 0x28, 0x80, 0xbe, 0xc8, 0x28, 0x55, 0x3e, + 0x69, 0xcc, 0x48, 0x3f, 0x58, 0x54, 0x93, 0xbe, 0x40, 0x34, 0x7e, 0x3e, 0x95, 0xb0, 0x50, 0x3f, 0xac, 0x07, 0x9f, 0xbe, 0xed, 0xe5, 0x88, 0x3e, 0x62, 0xe3, + 0x58, 0x3f, 0xef, 0x5b, 0x92, 0xbe, 0x33, 0xc7, 0x8f, 0x3e, 0x2e, 0x41, 0x5a, 0x3f, 0x0b, 0x75, 0x8a, 0xbe, 0x3f, 0x3d, 0x90, 0x3e, 0x72, 0x5f, 0x46, 0x3f, + 0x6a, 0xd9, 0x8c, 0xbe, 0x72, 0xfb, 0x53, 0x3e, 0xfa, 0xa2, 0x44, 0x3f, 0x5a, 0x35, 0xa5, 0xbe, 0x48, 0x36, 0x69, 0x3e, 0x95, 0x95, 0x4c, 0x3f, 0x7f, 0x46, + 0xb0, 0xbe, 0x5c, 0xb0, 0x64, 0x3e, 0x24, 0x02, 0x55, 0x3f, 0xca, 0x97, 0xa3, 0xbe, 0x00, 0x8c, 0x88, 0x3e, 0x26, 0x0e, 0x61, 0x3f, 0x3b, 0x41, 0x8c, 0xbe, + 0x68, 0x57, 0x97, 0x3e, 0xfe, 0xa5, 0x5e, 0x3f, 0xa6, 0x8a, 0x99, 0xbe, 0x31, 0x55, 0x94, 0x3e, 0x6e, 0x29, 0x61, 0x3f, 0xb4, 0xc4, 0x45, 0xbe, 0xee, 0x2f, + 0x87, 0x3e, 0xb9, 0x36, 0x66, 0x3f, 0x4c, 0x48, 0x3c, 0xbe, 0xd6, 0x92, 0x92, 0x3e, 0x56, 0xbe, 0x5a, 0x3f, 0x6b, 0xdf, 0xaa, 0xbe, 0xd9, 0x28, 0x8b, 0x3e, + 0x63, 0xb9, 0x5c, 0x3f, 0x71, 0x24, 0xa4, 0xbe, 0x7a, 0x3a, 0xb3, 0x3e, 0xb9, 0xba, 0x60, 0x3f, 0x72, 0x18, 0x81, 0xbe, 0xdc, 0x18, 0xb7, 0x3e, 0x09, 0x9b, + 0x5a, 0x3f, 0x26, 0xfa, 0xba, 0xbe, 0x1c, 0x63, 0x9e, 0x3e, 0x07, 0x6a, 0x5b, 0x3f, 0xda, 0xb9, 0xbc, 0xbe, 0xb2, 0x71, 0x5b, 0x3e, 0xe4, 0x94, 0x56, 0x3f, + 0xee, 0x76, 0xb1, 0xbe, 0x80, 0x89, 0x4d, 0x3e, 0x83, 0x93, 0x47, 0x3f, 0x14, 0x3b, 0xbc, 0xbe, 0xb3, 0x4b, 0x4e, 0x3e, 0xa0, 0x80, 0x59, 0x3f, 0xd5, 0x93, + 0xcd, 0xbe, 0x26, 0xf0, 0x83, 0x3e, 0xff, 0xd0, 0x57, 0x3f, 0xba, 0x8a, 0xce, 0xbe, 0xec, 0xb9, 0x38, 0x3e, 0xc5, 0x20, 0x53, 0x3f, 0xa0, 0xb6, 0xbf, 0xbe, + 0x96, 0xe7, 0x2d, 0x3e, 0x22, 0x77, 0x57, 0x3f, 0x00, 0xa3, 0xe2, 0xbe, 0x70, 0x7d, 0x5f, 0x3e, 0xdb, 0x95, 0x48, 0x3f, 0xb0, 0x5b, 0x6c, 0xbe, 0xef, 0xb8, + 0x92, 0x3d, 0xd5, 0xd2, 0x48, 0x3f, 0xed, 0x4b, 0x85, 0xbe, 0x80, 0x6e, 0x63, 0x3d, 0x23, 0xcc, 0x4c, 0x3f, 0xd8, 0xd7, 0x50, 0xbe, 0xc1, 0xf6, 0x8a, 0x3d, + 0x31, 0xc1, 0x48, 0x3f, 0xc3, 0x1c, 0x9e, 0xbe, 0x58, 0xdc, 0x3a, 0x3d, 0xed, 0x67, 0x4b, 0x3f, 0x42, 0xfc, 0x7f, 0xbe, 0x7c, 0xc2, 0x2b, 0x3e, 0x2e, 0x2c, + 0x5c, 0x3f, 0xe0, 0x47, 0x5d, 0xbc, 0x68, 0x2c, 0x72, 0x3e, 0x5a, 0x95, 0x5b, 0x3f, 0xc0, 0x67, 0x94, 0x3c, 0x93, 0x3a, 0x89, 0x3e, 0xd5, 0xdd, 0x57, 0x3f, + 0x20, 0x56, 0xca, 0xbd, 0x06, 0xfe, 0x82, 0x3e, 0x2c, 0x25, 0x59, 0x3f, 0x78, 0x69, 0x43, 0xbd, 0xc1, 0x2a, 0x5d, 0x3e, 0x81, 0xb1, 0x5a, 0x3f, 0xc0, 0xb8, + 0x41, 0x3d, 0xf3, 0x27, 0x60, 0x3e, 0xa8, 0x2e, 0x5b, 0x3f, 0xc0, 0x84, 0x0d, 0x3c, 0xfc, 0xe6, 0x48, 0x3e, 0x02, 0x07, 0x60, 0x3f, 0xb0, 0x7e, 0x03, 0x3d, + 0x33, 0x29, 0x8e, 0x3e, 0xb6, 0x9e, 0x5f, 0x3f, 0xc0, 0xe8, 0x3f, 0xbd, 0xca, 0x44, 0xac, 0x3e, 0xe4, 0x63, 0x57, 0x3f, 0xc0, 0x39, 0x2f, 0x3c, 0x47, 0xb9, + 0x0f, 0x3e, 0x2d, 0xf5, 0x56, 0x3f, 0xe0, 0x3d, 0x4a, 0x3d, 0x5f, 0x2b, 0x14, 0x3e, 0x68, 0xd0, 0x54, 0x3f, 0x00, 0x05, 0x57, 0xbb, 0xe0, 0x00, 0xca, 0x3d, + 0xc6, 0x95, 0x55, 0x3f, 0x40, 0x94, 0xf7, 0x3c, 0x88, 0x45, 0xb2, 0x3d, 0xc7, 0x56, 0x5b, 0x3f, 0xc8, 0xa4, 0x93, 0x3d, 0xdb, 0xcd, 0x14, 0x3e, 0x30, 0xe6, + 0x5e, 0x3f, 0x10, 0xc8, 0x82, 0x3d, 0xd0, 0x99, 0x67, 0x3e, 0x5f, 0x36, 0x54, 0x3f, 0x00, 0x91, 0x78, 0xbb, 0xd4, 0x11, 0x6a, 0x3d, 0xcd, 0xce, 0x54, 0x3f, + 0x60, 0xdf, 0xc0, 0xbc, 0xf4, 0xf2, 0x9c, 0x3d, 0x99, 0x8c, 0x5a, 0x3f, 0x40, 0x7b, 0x25, 0x3d, 0xe0, 0x51, 0x91, 0x3d, 0xc4, 0x4f, 0x58, 0x3f, 0x00, 0x84, + 0x71, 0xba, 0x38, 0x04, 0x19, 0x3d, 0x99, 0x6b, 0x50, 0x3f, 0x78, 0xab, 0x61, 0xbd, 0x24, 0xbd, 0x50, 0x3d, 0x82, 0x22, 0x51, 0x3f, 0xe0, 0x4c, 0x4f, 0xbd, + 0x50, 0x08, 0x11, 0x3d, 0xd8, 0xee, 0x49, 0x3f, 0x34, 0x85, 0x42, 0xbe, 0x0c, 0xa7, 0x40, 0x3d, 0xe3, 0x03, 0x53, 0x3f, 0xf0, 0x78, 0x26, 0xbe, 0x74, 0xf6, + 0x3b, 0x3d, 0x00, 0x81, 0x48, 0x3f, 0xa1, 0x74, 0x08, 0xbf, 0x2a, 0x38, 0x08, 0x3e, 0x5d, 0x8b, 0x49, 0x3f, 0x2b, 0x95, 0xde, 0xbe, 0xea, 0x58, 0xb8, 0x3d, + 0x35, 0xa9, 0x5e, 0x3f, 0xc0, 0xee, 0x9d, 0xbc, 0x38, 0xbe, 0x69, 0x3d, 0xc9, 0x82, 0x51, 0x3f, 0x85, 0xbb, 0x08, 0xbf, 0x41, 0xca, 0x5c, 0x3e, 0xae, 0x40, + 0x4a, 0x3f, 0x0c, 0x9c, 0x10, 0xbf, 0xc0, 0xcb, 0x2f, 0x3e, 0x03, 0x73, 0x4d, 0x3f, 0xfb, 0xa4, 0x0f, 0xbf, 0x0c, 0x9c, 0x6e, 0x3e, 0x8f, 0x7d, 0x57, 0x3f, + 0xae, 0x72, 0xf7, 0xbe, 0x77, 0x64, 0x82, 0x3e, 0x56, 0x08, 0x41, 0x3f, 0x6c, 0xc6, 0x12, 0xbf, 0xd8, 0x34, 0x30, 0x3e, 0xd7, 0xd3, 0x45, 0x3f, 0xd6, 0x7c, + 0x11, 0xbf, 0xdc, 0xe9, 0x74, 0x3e, 0xb5, 0x0f, 0x56, 0x3f, 0xed, 0xc1, 0x00, 0xbf, 0x2c, 0xe4, 0x8b, 0x3e, 0xdf, 0x80, 0x4a, 0x3f, 0x94, 0xca, 0xd1, 0xbe, + 0x6f, 0x86, 0xa7, 0x3d, 0x60, 0x5d, 0x41, 0x3f, 0xdd, 0xd1, 0x0d, 0xbf, 0x9b, 0xdc, 0x6f, 0x3e, 0xb9, 0x30, 0x3d, 0x3f, 0xf2, 0x20, 0x11, 0xbf, 0x73, 0xed, + 0x2f, 0x3e, 0x62, 0x68, 0x50, 0x3f, 0x59, 0x86, 0x02, 0xbf, 0x0d, 0x74, 0x94, 0x3e, 0xf5, 0x56, 0x64, 0x3f, 0xf8, 0x59, 0xcf, 0xbd, 0x7e, 0xb0, 0x5c, 0x3d, + 0x57, 0x09, 0x61, 0x3f, 0xe8, 0x7b, 0x0b, 0xbe, 0x49, 0x9c, 0x8a, 0x3d, 0x3d, 0x03, 0x68, 0x3f, 0xe8, 0xaa, 0x0d, 0xbd, 0x64, 0x83, 0x5f, 0x3d, 0x80, 0xe0, + 0x5f, 0x3f, 0x20, 0xca, 0x9e, 0x3c, 0xc8, 0xf5, 0xb8, 0x3d, 0x35, 0x99, 0x69, 0x3f, 0x80, 0x84, 0x04, 0x3c, 0x34, 0x34, 0x99, 0x3d, 0x9e, 0x83, 0x68, 0x3f, + 0x98, 0x9b, 0x0b, 0xbd, 0xb0, 0xec, 0x4b, 0x3d, 0x07, 0xaf, 0x5b, 0x3f, 0x64, 0xe7, 0x98, 0xbd, 0xf0, 0x06, 0x74, 0x3c, 0xc8, 0x9c, 0x58, 0x3f, 0x30, 0xdd, + 0xe8, 0xbd, 0x28, 0x43, 0xb2, 0x3c, 0x04, 0x7d, 0x5f, 0x3f, 0xd6, 0x3f, 0x07, 0xbe, 0x0c, 0x34, 0x3f, 0x3d, 0xc2, 0x3f, 0x63, 0x3f, 0x60, 0x15, 0xc8, 0xbd, + 0x34, 0x17, 0x17, 0x3d, 0xec, 0x6c, 0x54, 0x3f, 0x60, 0xbb, 0x59, 0xbd, 0xc0, 0x64, 0x95, 0x3c, 0x09, 0x6a, 0x5b, 0x3f, 0x84, 0xd9, 0x2e, 0xbe, 0xa9, 0xbc, + 0x8b, 0x3d, 0x5b, 0x0f, 0x67, 0x3f, 0xd0, 0x92, 0xe4, 0xbc, 0x24, 0x57, 0x1d, 0x3d, 0xbb, 0xa6, 0x5f, 0x3f, 0xc0, 0x3a, 0x42, 0xbc, 0x78, 0x1c, 0xde, 0x3c, + 0x9a, 0x32, 0x5c, 0x3f, 0xb4, 0x4d, 0x36, 0xbe, 0x75, 0x3c, 0xc8, 0x3d, 0x91, 0x33, 0x4e, 0x3f, 0x48, 0xca, 0xb2, 0xbe, 0x2a, 0x52, 0xa2, 0x3d, 0xf1, 0x54, + 0x47, 0x3f, 0xcc, 0x67, 0xb5, 0xbe, 0x09, 0x5f, 0x55, 0x3d, 0xf6, 0xe2, 0x5e, 0x3f, 0x10, 0x2b, 0xa7, 0xbe, 0x42, 0xf5, 0xb9, 0x3e, 0x46, 0x6d, 0x66, 0x3f, + 0x4d, 0x8b, 0x80, 0xbe, 0xfc, 0x02, 0xbc, 0x3e, 0x25, 0xc7, 0x66, 0x3f, 0x84, 0x60, 0x15, 0xbe, 0x62, 0x44, 0xae, 0x3e, 0x5b, 0xb1, 0x5c, 0x3f, 0x1b, 0x67, + 0xc5, 0xbe, 0xdb, 0x44, 0xa9, 0x3e, 0x07, 0x2b, 0x61, 0x3f, 0xbe, 0xe2, 0xab, 0xbe, 0xc5, 0xd1, 0xc0, 0x3e, 0x4a, 0x58, 0x68, 0x3f, 0x09, 0x58, 0x80, 0xbe, + 0x46, 0x05, 0xc1, 0x3e, 0xd5, 0xbd, 0x6d, 0x3f, 0x40, 0x43, 0x17, 0xbe, 0x10, 0x27, 0xb3, 0x3e, 0xb9, 0x91, 0x61, 0x3f, 0x54, 0xea, 0xac, 0xbe, 0x4d, 0x25, + 0xc6, 0x3e, 0x60, 0x33, 0x68, 0x3f, 0x00, 0x6c, 0x7f, 0xbe, 0x64, 0xd2, 0xc6, 0x3e, 0x8c, 0x71, 0x6e, 0x3f, 0x60, 0x54, 0x15, 0xbe, 0xde, 0x62, 0xb6, 0x3e, + 0x2c, 0x85, 0x5d, 0x3f, 0x47, 0xe6, 0xaa, 0xbe, 0xf5, 0xb9, 0xc8, 0x3e, 0x99, 0x38, 0x62, 0x3f, 0xbe, 0x82, 0x74, 0xbe, 0xaf, 0x1d, 0xcc, 0x3e, 0xd9, 0xc5, + 0x6d, 0x3f, 0x50, 0x9a, 0x0f, 0xbe, 0x84, 0x77, 0xbc, 0x3e, 0x5d, 0xf7, 0x59, 0x3f, 0x26, 0x24, 0xd2, 0xbe, 0x3a, 0xfc, 0xb9, 0x3e, 0x63, 0x29, 0x56, 0x3f, + 0x6f, 0xc3, 0xa4, 0xbe, 0x74, 0x0f, 0xc3, 0x3e, 0xe3, 0xb3, 0x66, 0x3f, 0x3c, 0x5c, 0x05, 0xbe, 0x4e, 0x10, 0xc4, 0x3e, 0x89, 0x8b, 0x52, 0x3f, 0x8a, 0x37, + 0xcd, 0xbe, 0x48, 0xc5, 0xb5, 0x3e, 0x6c, 0xee, 0x4f, 0x3f, 0xed, 0xfc, 0xc5, 0xbe, 0xfd, 0xd7, 0xab, 0x3e, 0x57, 0xff, 0x4e, 0x3f, 0x88, 0x2d, 0xbb, 0xbe, + 0x13, 0xea, 0x98, 0x3e, 0x5e, 0xf2, 0x50, 0x3f, 0xd5, 0xf8, 0x97, 0xbe, 0xee, 0x28, 0x97, 0x3e, 0x9a, 0x9d, 0x4c, 0x3f, 0x5c, 0x07, 0xb8, 0xbe, 0x79, 0x63, + 0x93, 0x3e, 0x74, 0xab, 0x49, 0x3f, 0xea, 0x9c, 0x92, 0xbe, 0x49, 0x7a, 0x99, 0x3e, 0xa3, 0xd6, 0x4b, 0x3f, 0x6e, 0xf1, 0x67, 0xbe, 0x12, 0x18, 0x97, 0x3e, + 0x21, 0xf7, 0x45, 0x3f, 0x20, 0x73, 0xb3, 0xbe, 0x8e, 0x18, 0x91, 0x3e, 0x69, 0x5c, 0x4f, 0x3f, 0x2a, 0x33, 0x25, 0xbe, 0xec, 0xda, 0x8b, 0x3e, 0xba, 0x01, + 0x5b, 0x3f, 0x1f, 0x04, 0xdc, 0xbe, 0x14, 0x07, 0x95, 0x3e, 0x74, 0xfc, 0x55, 0x3f, 0x0b, 0xb4, 0xe9, 0xbe, 0xed, 0xa7, 0xa8, 0x3e, 0xaf, 0x01, 0x50, 0x3f, + 0x42, 0xbf, 0xe4, 0xbe, 0xb4, 0xcd, 0xa6, 0x3e, 0x69, 0xe7, 0x4c, 0x3f, 0x12, 0x34, 0xdd, 0xbe, 0xe6, 0x5c, 0x9b, 0x3e, 0xbb, 0x6c, 0x4b, 0x3f, 0xde, 0xd6, + 0xd2, 0xbe, 0x52, 0x07, 0x8d, 0x3e, 0x25, 0x43, 0x49, 0x3f, 0xb4, 0x3b, 0xd1, 0xbe, 0xdc, 0xa4, 0x88, 0x3e, 0xd5, 0x42, 0x42, 0x3f, 0xb6, 0x56, 0xcd, 0xbe, + 0x14, 0x5c, 0x84, 0x3e, 0x97, 0x20, 0x4a, 0x3f, 0xee, 0xd7, 0xff, 0xbe, 0x85, 0x5c, 0x91, 0x3e, 0x57, 0xb4, 0x48, 0x3f, 0x1a, 0x1b, 0xf8, 0xbe, 0x0f, 0xfd, + 0x87, 0x3e, 0x1f, 0xda, 0x47, 0x3f, 0x5f, 0xd0, 0xef, 0xbe, 0xda, 0x4a, 0x75, 0x3e, 0x35, 0x24, 0x44, 0x3f, 0x1a, 0x55, 0xeb, 0xbe, 0xa3, 0x97, 0x6d, 0x3e, + 0x4b, 0x6e, 0x40, 0x3f, 0x33, 0xca, 0xe6, 0xbe, 0x62, 0x02, 0x66, 0x3e, 0xbd, 0x6c, 0x4b, 0x3f, 0x1a, 0x37, 0x04, 0xbe, 0x50, 0xf6, 0x16, 0x3d, 0xb9, 0x94, + 0x4d, 0x3f, 0x10, 0x16, 0xab, 0xbd, 0xf2, 0x8b, 0x18, 0x3d, 0xe8, 0xb6, 0x5d, 0x3f, 0x60, 0x4a, 0x83, 0xbc, 0x86, 0xee, 0xe6, 0x3d, 0x51, 0x4b, 0x6a, 0x3f, + 0x80, 0x03, 0x2e, 0x3c, 0x40, 0x00, 0x91, 0x3d, 0xdc, 0x65, 0x69, 0x3f, 0x80, 0x19, 0xac, 0x3c, 0xbc, 0x13, 0x80, 0x3d, 0x38, 0xf5, 0x61, 0x3f, 0xf0, 0xc8, + 0x1b, 0x3d, 0xdc, 0x3f, 0x7d, 0x3d, 0x27, 0x53, 0x61, 0x3f, 0x00, 0x10, 0x94, 0xbc, 0x19, 0xbb, 0x15, 0x3e, 0xc1, 0x3e, 0x66, 0x3f, 0x08, 0x01, 0x2c, 0xbd, + 0x6e, 0xcd, 0x41, 0x3e, 0x56, 0x92, 0x64, 0x3f, 0xc0, 0x32, 0x0e, 0x3d, 0x53, 0xda, 0x10, 0x3e, 0x77, 0xf8, 0x6c, 0x3f, 0x00, 0x5e, 0x0a, 0x3d, 0xfd, 0x22, + 0x04, 0x3e, 0x07, 0x74, 0x6d, 0x3f, 0x60, 0x7b, 0x18, 0x3d, 0xd7, 0xae, 0x02, 0x3e, 0xdb, 0x95, 0x6b, 0x3f, 0x30, 0xa3, 0x60, 0x3d, 0xf5, 0xb3, 0x02, 0x3e, + 0x25, 0x97, 0x64, 0x3f, 0x20, 0xbf, 0x92, 0x3d, 0x62, 0x92, 0x0b, 0x3e, 0x40, 0xbe, 0x67, 0x3f, 0xe0, 0x81, 0xcd, 0x3c, 0xf3, 0x2e, 0x5f, 0x3e, 0x6f, 0x79, + 0x70, 0x3f, 0x20, 0xfd, 0xe8, 0x3c, 0x09, 0xbd, 0x4c, 0x3e, 0x1a, 0x1d, 0x71, 0x3f, 0xf0, 0x1f, 0x00, 0x3d, 0x61, 0x68, 0x4d, 0x3e, 0x24, 0x87, 0x6f, 0x3f, + 0x20, 0xab, 0x42, 0x3d, 0xf5, 0xd2, 0x53, 0x3e, 0xac, 0xc4, 0x67, 0x3f, 0x98, 0xf1, 0x85, 0x3d, 0x9d, 0x66, 0x60, 0x3e, 0x32, 0xae, 0x67, 0x3f, 0x00, 0x88, + 0x83, 0xbb, 0x97, 0x46, 0x86, 0x3e, 0xf5, 0xec, 0x70, 0x3f, 0x00, 0x0b, 0x1d, 0xbb, 0x92, 0x2b, 0x80, 0x3e, 0x32, 0x7d, 0x68, 0x3f, 0x08, 0x99, 0x8a, 0xbd, + 0xa0, 0xa0, 0x60, 0x3e, 0xb9, 0xb0, 0x71, 0x3f, 0x00, 0xa0, 0x8b, 0xb8, 0x3c, 0x19, 0x81, 0x3e, 0xea, 0xdc, 0x70, 0x3f, 0x80, 0x53, 0x51, 0x3c, 0x63, 0x0f, + 0x86, 0x3e, 0xa1, 0x9f, 0x69, 0x3f, 0x80, 0x7b, 0xfc, 0x3c, 0xb2, 0x5f, 0x8e, 0x3e, 0x13, 0xe0, 0x65, 0x3f, 0x4e, 0xba, 0x22, 0xbe, 0xa6, 0xd7, 0x71, 0x3e, + 0x25, 0x6d, 0x68, 0x3f, 0x28, 0x5b, 0xfa, 0xbd, 0x77, 0x48, 0x85, 0x3e, 0xd9, 0x7a, 0x67, 0x3f, 0x10, 0x2b, 0x94, 0xbd, 0x2b, 0xf5, 0x9e, 0x3e, 0x2a, 0x05, + 0x6f, 0x3f, 0x38, 0xe2, 0x93, 0xbd, 0xa1, 0x17, 0x9f, 0x3e, 0x15, 0x01, 0x70, 0x3f, 0x7c, 0xb9, 0x8e, 0xbd, 0x37, 0x2e, 0xa1, 0x3e, 0x15, 0x01, 0x70, 0x3f, + 0x40, 0x75, 0x78, 0xbd, 0x4d, 0x23, 0xa6, 0x3e, 0xed, 0x38, 0x69, 0x3f, 0x98, 0x4a, 0x3c, 0xbd, 0x65, 0x1f, 0xaf, 0x3e, 0xe8, 0x05, 0x4d, 0x3f, 0x88, 0x0c, + 0x80, 0xbd, 0x00, 0xbf, 0x94, 0x3d, 0x3f, 0x62, 0x4c, 0x3f, 0x78, 0x05, 0xaa, 0xbd, 0x94, 0xad, 0x2f, 0x3d, 0xb0, 0x2a, 0x4f, 0x3f, 0x40, 0x13, 0x77, 0xbd, + 0x20, 0x66, 0x7e, 0x3d, 0x2a, 0x80, 0x54, 0x3f, 0xa0, 0x75, 0x77, 0xbd, 0x88, 0x04, 0x4d, 0x3e, 0xde, 0xb6, 0x52, 0x3f, 0x60, 0x15, 0xe0, 0xbd, 0x2e, 0x80, + 0x79, 0x3e, 0x73, 0x7a, 0x4a, 0x3f, 0x88, 0x64, 0xfc, 0xbd, 0x06, 0x30, 0x14, 0x3d, 0xc5, 0xbe, 0xb1, 0x3e, 0x31, 0xcb, 0xcd, 0xbe, 0x84, 0x19, 0x57, 0xbf, + 0xb8, 0x98, 0xb6, 0x3e, 0xee, 0x95, 0xbe, 0xbe, 0x59, 0xad, 0x58, 0xbf, 0xb0, 0x75, 0xb2, 0x3e, 0x3c, 0x22, 0xbe, 0xbe, 0x1e, 0xde, 0x58, 0xbf, 0x24, 0x75, + 0xba, 0x3e, 0x78, 0x04, 0xc0, 0xbe, 0xb0, 0x4f, 0x58, 0xbf, 0xaa, 0x52, 0xae, 0x3e, 0x7e, 0xba, 0xbe, 0xbe, 0x71, 0xe2, 0x58, 0xbf, 0x90, 0xc7, 0xbd, 0x3e, + 0xad, 0x5a, 0xc2, 0xbe, 0xf2, 0xd0, 0x57, 0xbf, 0x08, 0x53, 0xc0, 0x3e, 0x4e, 0x72, 0xc5, 0xbe, 0x4c, 0x34, 0x57, 0xbf, 0xcd, 0xed, 0xc1, 0x3e, 0xc7, 0x11, + 0xc9, 0xbe, 0xbc, 0x88, 0x56, 0xbf, 0x01, 0x7b, 0xc2, 0x3e, 0xca, 0xfa, 0xcc, 0xbe, 0x50, 0xd7, 0x55, 0xbf, 0x02, 0xf1, 0xc1, 0x3e, 0x52, 0xed, 0xd0, 0xbe, + 0x6b, 0x2e, 0x55, 0xbf, 0x73, 0x59, 0xc0, 0x3e, 0x24, 0x9b, 0xd4, 0xbe, 0x28, 0x98, 0x54, 0xbf, 0xfd, 0xcd, 0xbd, 0x3e, 0xce, 0xca, 0xd7, 0xbe, 0x67, 0x1e, + 0x54, 0xbf, 0xc5, 0x7e, 0xba, 0x3e, 0x8c, 0x45, 0xda, 0xbe, 0x90, 0xca, 0x53, 0xbf, 0x58, 0xa2, 0xb6, 0x3e, 0xa2, 0xdb, 0xdb, 0xbe, 0x81, 0xa1, 0x53, 0xbf, + 0x52, 0x7f, 0xb2, 0x3e, 0x16, 0x75, 0xdc, 0xbe, 0x56, 0xa7, 0x53, 0xbf, 0x14, 0x59, 0xae, 0x3e, 0x49, 0x02, 0xdc, 0xbe, 0xa2, 0xd9, 0x53, 0xbf, 0xaa, 0x7c, + 0xaa, 0x3e, 0x6a, 0x92, 0xda, 0xbe, 0xd1, 0x35, 0x54, 0xbf, 0x70, 0x2d, 0xa7, 0x3e, 0x90, 0x3a, 0xd8, 0xbe, 0x8e, 0xb6, 0x54, 0xbf, 0xc5, 0x9e, 0xa4, 0x3e, + 0x02, 0x25, 0xd5, 0xbe, 0x27, 0x51, 0x55, 0xbf, 0x33, 0x07, 0xa3, 0x3e, 0x8a, 0x85, 0xd1, 0xbe, 0xb7, 0xfc, 0x55, 0xbf, 0x01, 0x7a, 0xa2, 0x3e, 0x46, 0x99, + 0xcd, 0xbe, 0xb3, 0xae, 0x56, 0xbf, 0x00, 0x04, 0xa3, 0x3e, 0xda, 0xa9, 0xc9, 0xbe, 0x0e, 0x57, 0x57, 0xbf, 0x8f, 0x9b, 0xa4, 0x3e, 0xe4, 0xfb, 0xc5, 0xbe, + 0x58, 0xed, 0x57, 0xbf, 0x04, 0x27, 0xa7, 0x3e, 0x7a, 0xcb, 0xc2, 0xbe, 0x88, 0x65, 0x58, 0xbf, 0x3e, 0x76, 0xaa, 0x3e, 0x9f, 0x51, 0xc0, 0xbe, 0xe5, 0xba, + 0x58, 0xbf, 0xa0, 0xce, 0xa8, 0x3e, 0x2c, 0x71, 0x7d, 0xbe, 0xde, 0xc2, 0x08, 0xbf, 0x56, 0xf6, 0xae, 0x3e, 0x08, 0xc3, 0x7e, 0xbe, 0xf6, 0x77, 0x08, 0xbf, + 0xe8, 0xa4, 0xa8, 0x3e, 0xf8, 0x45, 0x94, 0xbe, 0xb0, 0x75, 0x03, 0xbf, 0x21, 0xb4, 0xb4, 0x3e, 0xe2, 0x86, 0x81, 0xbe, 0x42, 0xed, 0x07, 0xbf, 0x58, 0xa1, + 0xb9, 0x3e, 0x3e, 0x04, 0x85, 0xbe, 0x1e, 0x2e, 0x07, 0xbf, 0x80, 0x6a, 0xbd, 0x3e, 0x60, 0x9e, 0x89, 0xbe, 0x70, 0x46, 0x06, 0xbf, 0x3d, 0xcc, 0xbf, 0x3e, + 0x6a, 0x01, 0x8f, 0xbe, 0x0c, 0x48, 0x05, 0xbf, 0xa0, 0x99, 0xc0, 0x3e, 0xf9, 0xd1, 0x94, 0xbe, 0xfc, 0x40, 0x04, 0xbf, 0x3d, 0xcc, 0xbf, 0x3e, 0x50, 0xab, + 0x9a, 0xbe, 0xfb, 0x45, 0x03, 0xbf, 0x80, 0x6a, 0xbd, 0x3e, 0x94, 0x24, 0xa0, 0xbe, 0x68, 0x67, 0x02, 0xbf, 0x56, 0xa1, 0xb9, 0x3e, 0xa0, 0xe0, 0xa4, 0xbe, + 0xe4, 0xb1, 0x01, 0xbf, 0x20, 0xb4, 0xb4, 0x3e, 0xf4, 0x8b, 0xa8, 0xbe, 0x81, 0x35, 0x01, 0xbf, 0x54, 0xf6, 0xae, 0x3e, 0xcc, 0xe7, 0xaa, 0xbe, 0xac, 0xf9, + 0x00, 0xbf, 0x9f, 0xce, 0xa8, 0x3e, 0x31, 0xca, 0xab, 0xbe, 0x36, 0x02, 0x01, 0xbf, 0xee, 0xa6, 0xa2, 0x3e, 0x42, 0x21, 0xab, 0xbe, 0x1c, 0x4d, 0x01, 0xbf, + 0x20, 0xe9, 0x9c, 0x3e, 0xc0, 0xfb, 0xa8, 0xbe, 0xd7, 0xd7, 0x01, 0xbf, 0xec, 0xfb, 0x97, 0x3e, 0x63, 0x7e, 0xa5, 0xbe, 0xfb, 0x96, 0x02, 0xbf, 0xf8, 0x35, + 0x94, 0x3e, 0xc8, 0xe3, 0xa0, 0xbe, 0x0c, 0x7d, 0x03, 0xbf, 0x3a, 0xd4, 0x91, 0x3e, 0x80, 0x81, 0x9b, 0xbe, 0x01, 0x7d, 0x04, 0xbf, 0xa1, 0x03, 0x91, 0x3e, + 0x84, 0xb0, 0x95, 0xbe, 0x24, 0x84, 0x05, 0xbf, 0x3a, 0xd4, 0x91, 0x3e, 0x9a, 0xd7, 0x8f, 0xbe, 0x11, 0x7f, 0x06, 0xbf, 0xf8, 0x35, 0x94, 0x3e, 0x9e, 0x5e, + 0x8a, 0xbe, 0x99, 0x5d, 0x07, 0xbf, 0xed, 0xfb, 0x97, 0x3e, 0xf7, 0xa0, 0x85, 0xbe, 0xb2, 0x11, 0x08, 0xbf, 0x21, 0xe9, 0x9c, 0x3e, 0xa2, 0xf5, 0x81, 0xbe, + 0x14, 0x8e, 0x08, 0xbf, 0xef, 0xa6, 0xa2, 0x3e, 0xf6, 0x35, 0x7f, 0xbe, 0x68, 0xcb, 0x08, 0xbf, 0xe4, 0xec, 0xb7, 0x3e, 0xe8, 0x67, 0xb9, 0xbe, 0xf1, 0x1f, + 0x59, 0xbf, 0xa5, 0x65, 0xb2, 0x3e, 0x90, 0xd4, 0xb8, 0xbe, 0xba, 0x63, 0x59, 0xbf, 0xd9, 0x13, 0xbd, 0x3e, 0x8a, 0x56, 0xbb, 0xbe, 0xc0, 0xa3, 0x58, 0xbf, + 0xb0, 0x80, 0xc1, 0x3e, 0xef, 0x7a, 0xbe, 0xbe, 0x52, 0xf7, 0x57, 0xbf, 0x2c, 0xe3, 0xc4, 0x3e, 0x7d, 0x9a, 0xc2, 0xbe, 0x24, 0x28, 0x57, 0xbf, 0xed, 0x07, + 0xc7, 0x3e, 0x2e, 0x70, 0xc7, 0xbe, 0xc6, 0x43, 0x56, 0xbf, 0x11, 0xc2, 0xc7, 0x3e, 0xfa, 0xa8, 0xcc, 0xbe, 0xd7, 0x56, 0x55, 0xbf, 0xed, 0x07, 0xc7, 0x3e, + 0x72, 0xe7, 0xd1, 0xbe, 0x80, 0x76, 0x54, 0xbf, 0x2c, 0xe3, 0xc4, 0x3e, 0xc7, 0xd2, 0xd6, 0xbe, 0xf8, 0xac, 0x53, 0xbf, 0xb0, 0x80, 0xc1, 0x3e, 0xd1, 0x11, + 0xdb, 0xbe, 0x46, 0x0b, 0x53, 0xbf, 0xd9, 0x13, 0xbd, 0x3e, 0x26, 0x60, 0xde, 0xbe, 0x82, 0x9b, 0x52, 0xbf, 0xe4, 0xec, 0xb7, 0x3e, 0x02, 0x7c, 0xe0, 0xbe, + 0x99, 0x65, 0x52, 0xbf, 0xa5, 0x65, 0xb2, 0x3e, 0xe0, 0x42, 0xe1, 0xbe, 0xc7, 0x6d, 0x52, 0xbf, 0x67, 0xde, 0xac, 0x3e, 0x34, 0xaf, 0xe0, 0xbe, 0xee, 0xaf, + 0x52, 0xbf, 0xa4, 0xba, 0xa7, 0x3e, 0x67, 0xc3, 0xde, 0xbe, 0xa2, 0x2b, 0x53, 0xbf, 0xce, 0x4d, 0xa3, 0x3e, 0xdc, 0x9e, 0xdb, 0xbe, 0x16, 0xd8, 0x53, 0xbf, + 0x20, 0xe8, 0x9f, 0x3e, 0x2c, 0x7f, 0xd7, 0xbe, 0x4e, 0xa7, 0x54, 0xbf, 0x90, 0xc6, 0x9d, 0x3e, 0xb0, 0xa7, 0xd2, 0xbe, 0xaa, 0x8d, 0x55, 0xbf, 0x70, 0x0c, + 0x9d, 0x3e, 0x88, 0x70, 0xcd, 0xbe, 0x9d, 0x78, 0x56, 0xbf, 0x90, 0xc6, 0x9d, 0x3e, 0x6c, 0x30, 0xc8, 0xbe, 0xf0, 0x5a, 0x57, 0xbf, 0x20, 0xe8, 0x9f, 0x3e, + 0xe2, 0x46, 0xc3, 0xbe, 0x7a, 0x22, 0x58, 0xbf, 0xce, 0x4d, 0xa3, 0x3e, 0xfa, 0x07, 0xbf, 0xbe, 0x22, 0xc4, 0x58, 0xbf, 0x6f, 0xb7, 0xa7, 0x3e, 0xca, 0xb9, + 0xbb, 0xbe, 0xe0, 0x33, 0x59, 0xbf, 0x67, 0xde, 0xac, 0x3e, 0x18, 0x9b, 0xb9, 0xbe, 0x46, 0x6a, 0x59, 0xbf, 0x22, 0x3f, 0xb2, 0x3e, 0xa8, 0xef, 0xad, 0xbe, + 0xd5, 0xcc, 0x59, 0xbf, 0xc5, 0x7e, 0xba, 0x3e, 0xa1, 0xd4, 0xae, 0xbe, 0xa0, 0x66, 0x59, 0xbf, 0x4c, 0xfc, 0xa9, 0x3e, 0xe6, 0x20, 0xaf, 0xbe, 0x60, 0xd5, + 0x59, 0xbf, 0x33, 0x31, 0xc2, 0x3e, 0x9c, 0xb2, 0xb1, 0xbe, 0xdd, 0xac, 0x58, 0xbf, 0x91, 0xc7, 0xbd, 0x3e, 0x58, 0xca, 0x9f, 0xbe, 0x78, 0x7d, 0x58, 0xbf, + 0x12, 0xe2, 0xb1, 0x3e, 0x9e, 0x86, 0x9e, 0xbe, 0x26, 0x0f, 0x59, 0xbf, 0x6d, 0xcc, 0xc8, 0x3e, 0x1a, 0x61, 0xb6, 0xbe, 0x4e, 0xad, 0x57, 0xbf, 0x7a, 0xdc, + 0xc8, 0x3e, 0x96, 0xef, 0xa3, 0xbe, 0xe7, 0x71, 0x57, 0xbf, 0xef, 0xdc, 0xcd, 0x3e, 0x06, 0x8b, 0xbc, 0xbe, 0x9f, 0x76, 0x56, 0xbf, 0x71, 0x63, 0xd2, 0x3e, + 0x21, 0xb0, 0xaa, 0xbe, 0x09, 0x01, 0x56, 0xbf, 0x0d, 0x0c, 0xd1, 0x3e, 0x71, 0xc3, 0xc3, 0xbe, 0xa1, 0x20, 0x55, 0xbf, 0x2c, 0xaf, 0xd9, 0x3e, 0x78, 0x92, + 0xb3, 0xbe, 0x7a, 0x41, 0x54, 0xbf, 0x43, 0x23, 0xd2, 0x3e, 0xf8, 0x90, 0xcb, 0xbe, 0x3d, 0xc0, 0x53, 0xbf, 0xf1, 0x48, 0xde, 0x3e, 0xcc, 0xfa, 0xbd, 0xbe, + 0xd5, 0x54, 0x52, 0xbf, 0x0d, 0x0c, 0xd1, 0x3e, 0xd3, 0x65, 0xd3, 0xbe, 0x90, 0x6f, 0x52, 0xbf, 0x15, 0xda, 0xdf, 0x3e, 0x40, 0x39, 0xc9, 0xbe, 0x62, 0x59, + 0x50, 0xbf, 0xef, 0xdc, 0xcd, 0x3e, 0xc4, 0xbe, 0xda, 0xbe, 0x7e, 0x43, 0x51, 0xbf, 0xf1, 0x48, 0xde, 0x3e, 0x80, 0x83, 0xd4, 0xbe, 0xac, 0x73, 0x4e, 0xbf, + 0x6d, 0xcc, 0xc8, 0x3e, 0xc2, 0x15, 0xe1, 0xbe, 0x19, 0x53, 0x50, 0xbf, 0x2c, 0xaf, 0xd9, 0x3e, 0xbf, 0x18, 0xdf, 0xbe, 0x2e, 0xc3, 0x4c, 0xbf, 0x32, 0x31, + 0xc2, 0x3e, 0xe6, 0x01, 0xe6, 0xbe, 0x0f, 0xad, 0x4f, 0xbf, 0x70, 0x63, 0xd2, 0x3e, 0x32, 0x3d, 0xe8, 0xbe, 0x3d, 0x68, 0x4b, 0xbf, 0xc4, 0x7e, 0xba, 0x3e, + 0x3d, 0x2b, 0xe9, 0xbe, 0x6d, 0x5b, 0x4f, 0xbf, 0x79, 0xdc, 0xc8, 0x3e, 0xfa, 0x55, 0xef, 0xbe, 0x6c, 0x78, 0x4a, 0xbf, 0x20, 0x3f, 0xb2, 0x3e, 0xdc, 0x56, + 0xea, 0xbe, 0xa1, 0x66, 0x4f, 0xbf, 0x8f, 0xc7, 0xbd, 0x3e, 0xf4, 0xe2, 0xf3, 0xbe, 0x05, 0x03, 0x4a, 0xbf, 0x4a, 0xfc, 0xa9, 0x3e, 0x8c, 0x78, 0xe9, 0xbe, + 0xb0, 0xcb, 0x4f, 0xbf, 0x10, 0xe2, 0xb1, 0x3e, 0x70, 0x95, 0xf5, 0xbe, 0x2a, 0x12, 0x4a, 0xbf, 0x12, 0x4d, 0xa2, 0x3e, 0x43, 0x96, 0xe6, 0xbe, 0x7f, 0x84, + 0x50, 0xbf, 0x90, 0xfc, 0xa5, 0x3e, 0xb3, 0x51, 0xf4, 0xbe, 0xd6, 0xa3, 0x4a, 0xbf, 0xd6, 0xb1, 0x9b, 0x3e, 0xc6, 0xe7, 0xe1, 0xbe, 0x0f, 0x84, 0x51, 0xbf, + 0xa9, 0xe7, 0x9a, 0x3e, 0x2a, 0x2c, 0xf0, 0xbe, 0x74, 0xaf, 0x4b, 0xbf, 0x57, 0xa1, 0x96, 0x3e, 0xd5, 0xc0, 0xdb, 0xbe, 0x3c, 0xba, 0x52, 0xbf, 0xe6, 0x63, + 0x91, 0x3e, 0x30, 0x6c, 0xe9, 0xbe, 0x37, 0x20, 0x4d, 0xbf, 0x36, 0x72, 0x93, 0x3e, 0x24, 0x85, 0xd4, 0xbe, 0xc6, 0x10, 0x54, 0xbf, 0xf7, 0x14, 0x8a, 0x3e, + 0xb2, 0x8c, 0xe0, 0xbe, 0x4a, 0xdf, 0x4e, 0xbf, 0x03, 0x5b, 0x92, 0x3e, 0xbe, 0xba, 0xcc, 0xbe, 0xa2, 0x70, 0x55, 0xbf, 0x69, 0x7e, 0x85, 0x3e, 0x3e, 0x21, + 0xd6, 0xbe, 0x78, 0xcc, 0x50, 0xbf, 0x36, 0x72, 0x93, 0x3e, 0xc2, 0xe2, 0xc4, 0xbe, 0xd7, 0xc1, 0x56, 0xbf, 0x43, 0xed, 0x83, 0x3e, 0xa0, 0xe5, 0xca, 0xbe, + 0x6e, 0xc7, 0x52, 0xbf, 0x57, 0xa1, 0x96, 0x3e, 0x17, 0x8d, 0xbd, 0xbe, 0x5c, 0xed, 0x57, 0xbf, 0x6a, 0x7e, 0x85, 0x3e, 0x8a, 0x98, 0xbf, 0xbe, 0xa1, 0xad, + 0x54, 0xbf, 0xd6, 0xb1, 0x9b, 0x3e, 0x1e, 0x33, 0xb7, 0xbe, 0x44, 0xde, 0x58, 0xbf, 0xf7, 0x14, 0x8a, 0x3e, 0x6b, 0x06, 0xb5, 0xbe, 0x96, 0x5d, 0x56, 0xbf, + 0x13, 0x4d, 0xa2, 0x3e, 0x04, 0x48, 0xb2, 0xbe, 0xd0, 0x85, 0x59, 0xbf, 0xe8, 0x63, 0x91, 0x3e, 0x1f, 0xdf, 0xab, 0xbe, 0x03, 0xb9, 0x57, 0xbf, 0xaa, 0xe7, + 0x9a, 0x3e, 0xd2, 0xc6, 0xa4, 0xbe, 0x72, 0xaa, 0x58, 0xbf, 0x93, 0xfc, 0xa5, 0x3e, 0x17, 0x39, 0xa0, 0xbe, 0x48, 0x1e, 0x59, 0xbf, 0xe4, 0x17, 0xb1, 0x3e, + 0x19, 0xee, 0x87, 0xbe, 0xf0, 0x82, 0x55, 0xbf, 0x99, 0xea, 0xc1, 0x3e, 0xb9, 0xb5, 0x89, 0xbe, 0x39, 0xb5, 0x54, 0xbf, 0x31, 0x45, 0xa0, 0x3e, 0x72, 0x52, + 0x8a, 0xbe, 0xcc, 0x98, 0x55, 0xbf, 0x44, 0x99, 0xd1, 0x3e, 0x65, 0x92, 0x8f, 0xbe, 0x5e, 0x3a, 0x53, 0xbf, 0xf4, 0x13, 0xb0, 0x3e, 0x8c, 0x3a, 0x68, 0xbe, + 0x86, 0x39, 0x4f, 0xbf, 0x9f, 0xac, 0xc4, 0x3e, 0x9c, 0x9f, 0x6c, 0xbe, 0x8d, 0x3c, 0x4e, 0xbf, 0xe8, 0x0f, 0xdf, 0x3e, 0x1c, 0x1b, 0x99, 0xbe, 0x57, 0x30, + 0x51, 0xbf, 0x0e, 0xe1, 0xd7, 0x3e, 0x54, 0xff, 0x7a, 0xbe, 0xdb, 0x6d, 0x4c, 0xbf, 0x43, 0x64, 0xe9, 0x3e, 0x10, 0xac, 0xa5, 0xbe, 0x6f, 0xb8, 0x4e, 0xbf, + 0x1d, 0x5d, 0xe8, 0x3e, 0x26, 0x2c, 0x89, 0xbe, 0x77, 0xef, 0x49, 0xbf, 0x9d, 0xe2, 0xef, 0x3e, 0x76, 0x67, 0xb4, 0xbe, 0xec, 0xfd, 0x4b, 0xbf, 0x27, 0x03, + 0xf5, 0x3e, 0x98, 0x8c, 0x98, 0xbe, 0x05, 0xe9, 0x46, 0xbf, 0xa0, 0x1a, 0xf2, 0x3e, 0x2e, 0x4c, 0xc4, 0xbe, 0x2d, 0x32, 0x49, 0xbf, 0xfb, 0xf8, 0xfc, 0x3e, + 0xca, 0x99, 0xaa, 0xbe, 0x02, 0x92, 0x43, 0xbf, 0x9d, 0xe2, 0xef, 0x3e, 0xb7, 0x40, 0xd4, 0xbe, 0x3a, 0x82, 0x46, 0xbf, 0x27, 0xae, 0xff, 0x3e, 0xb6, 0x0f, + 0xbe, 0xbe, 0xf0, 0x23, 0x40, 0xbf, 0x41, 0x64, 0xe9, 0x3e, 0x21, 0x39, 0xe3, 0xbe, 0xa3, 0x1f, 0x44, 0xbf, 0xf9, 0xf8, 0xfc, 0x3e, 0xdc, 0x9e, 0xd1, 0xbe, + 0x41, 0xda, 0x3c, 0xbf, 0xe7, 0x0f, 0xdf, 0x3e, 0xfa, 0x2a, 0xf0, 0xbe, 0xe1, 0x34, 0x42, 0xbf, 0x26, 0x03, 0xf5, 0x3e, 0xf0, 0xf1, 0xe3, 0xbe, 0x06, 0xee, + 0x39, 0xbf, 0x42, 0x99, 0xd1, 0x3e, 0xee, 0x30, 0xfa, 0xbe, 0xf2, 0xe0, 0x40, 0xbf, 0x1b, 0x5d, 0xe8, 0x3e, 0xa0, 0xc9, 0xf3, 0xbe, 0x81, 0x94, 0x37, 0xbf, + 0x97, 0xea, 0xc1, 0x3e, 0x87, 0x50, 0x00, 0xbf, 0xfc, 0x3b, 0x40, 0xbf, 0x0c, 0xe1, 0xd7, 0x3e, 0xf6, 0x08, 0x00, 0xbf, 0x10, 0xf3, 0x35, 0xbf, 0xe2, 0x17, + 0xb1, 0x3e, 0x42, 0x84, 0x01, 0xbf, 0x4b, 0x51, 0x40, 0xbf, 0x9d, 0xac, 0xc4, 0x3e, 0x2e, 0xf9, 0x03, 0xbf, 0xd8, 0x29, 0x35, 0xbf, 0x2f, 0x45, 0xa0, 0x3e, + 0xe4, 0x9e, 0x00, 0xbf, 0x8e, 0x1f, 0x41, 0xbf, 0xf2, 0x13, 0xb0, 0x3e, 0x7e, 0x72, 0x05, 0xbf, 0x0d, 0x44, 0x35, 0xbf, 0xba, 0x99, 0x90, 0x3e, 0xea, 0x5f, + 0xfb, 0xbe, 0xe9, 0x98, 0x42, 0xbf, 0x14, 0x78, 0x9b, 0x3e, 0x4d, 0x59, 0x04, 0xbf, 0x01, 0x41, 0x36, 0xbf, 0x15, 0x23, 0x83, 0x3e, 0x58, 0xd7, 0xf1, 0xbe, + 0xea, 0xa2, 0x44, 0xbf, 0xa1, 0x43, 0x88, 0x3e, 0xef, 0xc2, 0x00, 0xbf, 0x2b, 0x0f, 0x38, 0xbf, 0x74, 0x9d, 0x71, 0x3e, 0xac, 0x46, 0xe5, 0xbe, 0xc7, 0x1a, + 0x47, 0xbf, 0x27, 0x8f, 0x6f, 0x3e, 0x1e, 0xd6, 0xf5, 0xbe, 0x1f, 0x8e, 0x3a, 0xbf, 0xc4, 0xa0, 0x64, 0x3e, 0xda, 0x8a, 0xd6, 0xbe, 0x5b, 0xd5, 0x49, 0xbf, + 0x0e, 0x43, 0x56, 0x3e, 0x86, 0x75, 0xe6, 0xbe, 0x96, 0x94, 0x3d, 0xbf, 0xb9, 0x30, 0x60, 0x3e, 0x29, 0xaa, 0xc6, 0xbe, 0x1f, 0xa2, 0x4c, 0xbf, 0xd6, 0x5d, + 0x46, 0x3e, 0x98, 0x6b, 0xd4, 0xbe, 0x08, 0xeb, 0x40, 0xbf, 0xc5, 0xa0, 0x64, 0x3e, 0x98, 0xb1, 0xb6, 0xbe, 0x0e, 0x51, 0x4f, 0xbf, 0x0f, 0xed, 0x40, 0x3e, + 0x86, 0xf5, 0xc0, 0xbe, 0x20, 0x59, 0x44, 0xbf, 0x77, 0x9d, 0x71, 0x3e, 0x9a, 0xb9, 0xa7, 0xbe, 0x93, 0xb3, 0x51, 0xbf, 0xd7, 0x5d, 0x46, 0x3e, 0x86, 0x66, + 0xad, 0xbe, 0xca, 0xa2, 0x47, 0xbf, 0x17, 0x23, 0x83, 0x3e, 0x86, 0xc8, 0x9a, 0xbe, 0xe6, 0x9f, 0x53, 0xbf, 0x11, 0x43, 0x56, 0x3e, 0x2e, 0x10, 0x9b, 0xbe, + 0x94, 0x8f, 0x4a, 0xbf, 0xbc, 0x99, 0x90, 0x3e, 0x70, 0xc2, 0x90, 0xbe, 0xde, 0xf3, 0x54, 0xbf, 0x2a, 0x8f, 0x6f, 0x3e, 0xa2, 0x38, 0x8b, 0xbe, 0x12, 0xe9, + 0x4c, 0xbf, 0xa4, 0x43, 0x88, 0x3e, 0x3a, 0xe7, 0x7d, 0xbe, 0xf8, 0x89, 0x4e, 0xbf, 0x15, 0x78, 0x9b, 0x3e, 0x1a, 0x20, 0x6e, 0xbe, 0xb7, 0x53, 0x4f, 0xbf, + 0xdf, 0xdf, 0xae, 0x3e, 0x94, 0xf1, 0x48, 0xbe, 0x32, 0x9f, 0x46, 0xbf, 0x7c, 0xdd, 0xc5, 0x3e, 0x7e, 0xd9, 0x4d, 0xbe, 0xfa, 0x85, 0x45, 0xbf, 0xbe, 0x46, + 0xdb, 0x3e, 0x6c, 0xd9, 0x5d, 0xbe, 0x7c, 0x82, 0x43, 0xbf, 0x97, 0xaa, 0xed, 0x3e, 0x48, 0xe5, 0x77, 0xbe, 0x57, 0xb9, 0x40, 0xbf, 0xe5, 0xc4, 0xfb, 0x3e, + 0x30, 0x1a, 0x8d, 0xbe, 0x5e, 0x5a, 0x3d, 0xbf, 0x7e, 0x52, 0x02, 0x3f, 0x2a, 0x3c, 0xa1, 0xbe, 0xda, 0xa0, 0x39, 0xbf, 0x33, 0xd5, 0x03, 0x3f, 0x88, 0xf0, + 0xb6, 0xbe, 0x7c, 0xcc, 0x35, 0xbf, 0x7e, 0x52, 0x02, 0x3f, 0x70, 0xc2, 0xcc, 0xbe, 0x8c, 0x22, 0x32, 0xbf, 0xe3, 0xc4, 0xfb, 0x3e, 0xcc, 0x32, 0xe1, 0xbe, + 0xeb, 0xdf, 0x2e, 0xbf, 0x95, 0xaa, 0xed, 0x3e, 0xfa, 0xdd, 0xf2, 0xbe, 0x1a, 0x40, 0x2c, 0xbf, 0xbb, 0x46, 0xdb, 0x3e, 0x27, 0x48, 0x00, 0xbf, 0x4a, 0x71, + 0x2a, 0xbf, 0x78, 0xdd, 0xc5, 0x3e, 0x79, 0xad, 0x04, 0xbf, 0x07, 0x8f, 0x29, 0xbf, 0xdc, 0xdf, 0xae, 0x3e, 0x79, 0x52, 0x06, 0xbf, 0xdd, 0xac, 0x29, 0xbf, + 0x75, 0xe5, 0x97, 0x3e, 0x91, 0x18, 0x05, 0xbf, 0x0d, 0xc6, 0x2a, 0xbf, 0x34, 0x7c, 0x82, 0x3e, 0x06, 0x17, 0x01, 0xbf, 0x16, 0xca, 0x2c, 0xbf, 0xb7, 0x30, + 0x60, 0x3e, 0x1c, 0x28, 0xf5, 0xbe, 0x3a, 0x93, 0x2f, 0xbf, 0xab, 0xf5, 0x43, 0x3e, 0x94, 0x00, 0xe4, 0xbe, 0x36, 0xf2, 0x32, 0xbf, 0xec, 0x3b, 0x32, 0x3e, + 0xb8, 0xe1, 0xcf, 0xbe, 0x30, 0xab, 0x36, 0xbf, 0xaf, 0x2a, 0x2c, 0x3e, 0x10, 0x2d, 0xba, 0xbe, 0x9a, 0x7f, 0x3a, 0xbf, 0xed, 0x3b, 0x32, 0x3e, 0x70, 0x5b, + 0xa4, 0xbe, 0x7c, 0x29, 0x3e, 0xbf, 0xaf, 0xf5, 0x43, 0x3e, 0xf8, 0xe7, 0x8f, 0xbe, 0xa8, 0x6c, 0x41, 0xbf, 0xba, 0x30, 0x60, 0x3e, 0x8e, 0x79, 0x7c, 0xbe, + 0x78, 0x0c, 0x44, 0xbf, 0x37, 0x7c, 0x82, 0x3e, 0xfc, 0x16, 0x61, 0xbe, 0xcb, 0xdc, 0x45, 0xbf, 0x79, 0xe5, 0x97, 0x3e, 0xde, 0x85, 0x4f, 0xbe, 0x00, 0xbd, + 0x46, 0xbf, 0x8a, 0x98, 0xad, 0x3e, 0x18, 0x13, 0x34, 0xbe, 0xe3, 0x4c, 0x3c, 0xbf, 0x87, 0x63, 0xc5, 0x3e, 0x48, 0x28, 0x39, 0xbe, 0x00, 0x29, 0x3b, 0xbf, + 0x58, 0x8d, 0xdb, 0x3e, 0xb0, 0xb9, 0x49, 0xbe, 0xe1, 0x13, 0x39, 0xbf, 0x10, 0x98, 0xee, 0x3e, 0xa0, 0xb8, 0x64, 0xbe, 0xb9, 0x30, 0x36, 0xbf, 0xbe, 0x32, + 0xfd, 0x3e, 0xa6, 0x1c, 0x84, 0xbe, 0x0e, 0xb4, 0x32, 0xbf, 0x87, 0x31, 0x03, 0x3f, 0x80, 0xf2, 0x98, 0xbe, 0x2e, 0xd8, 0x2e, 0xbf, 0xad, 0xc2, 0x04, 0x3f, + 0x02, 0x6c, 0xaf, 0xbe, 0xdf, 0xe1, 0x2a, 0xbf, 0x87, 0x31, 0x03, 0x3f, 0x0f, 0x03, 0xc6, 0xbe, 0x01, 0x16, 0x27, 0xbf, 0xbd, 0x32, 0xfd, 0x3e, 0x76, 0x2b, + 0xdb, 0xbe, 0x10, 0xb7, 0x23, 0xbf, 0x0e, 0x98, 0xee, 0x3e, 0xc6, 0x77, 0xed, 0xbe, 0x99, 0x00, 0x21, 0xbf, 0x55, 0x8d, 0xdb, 0x3e, 0x9a, 0xa5, 0xfb, 0xbe, + 0xed, 0x1f, 0x1f, 0xbf, 0x84, 0x63, 0xc5, 0x3e, 0x26, 0x60, 0x02, 0xbf, 0xad, 0x36, 0x1e, 0xbf, 0x86, 0x98, 0xad, 0x3e, 0xc6, 0x12, 0x04, 0xbf, 0xe8, 0x54, + 0x1e, 0xbf, 0x87, 0xcd, 0x95, 0x3e, 0xe6, 0xce, 0x02, 0xbf, 0x50, 0x78, 0x1f, 0xbf, 0x72, 0x47, 0x7f, 0x3e, 0xf8, 0x51, 0xfd, 0xbe, 0xf7, 0x8d, 0x21, 0xbf, + 0xfe, 0x31, 0x59, 0x3e, 0xc4, 0xd5, 0xef, 0xbe, 0x8f, 0x70, 0x24, 0xbf, 0xa4, 0xfc, 0x3b, 0x3e, 0x52, 0x12, 0xde, 0xbe, 0xc5, 0xed, 0x27, 0xbf, 0x04, 0x9c, + 0x29, 0x3e, 0x96, 0x3f, 0xc9, 0xbe, 0x1e, 0xc9, 0x2b, 0xbf, 0x6e, 0x57, 0x23, 0x3e, 0xca, 0xc5, 0xb2, 0xbe, 0x75, 0xbf, 0x2f, 0xbf, 0x05, 0x9c, 0x29, 0x3e, + 0x07, 0x2f, 0x9c, 0xbe, 0x4a, 0x8b, 0x33, 0xbf, 0xa8, 0xfc, 0x3b, 0x3e, 0x7f, 0x03, 0x87, 0xbe, 0xc0, 0xea, 0x36, 0xbf, 0x02, 0x32, 0x59, 0x3e, 0xb0, 0x76, + 0x69, 0xbe, 0x33, 0xa2, 0x39, 0xbf, 0x78, 0x47, 0x7f, 0x3e, 0x84, 0x14, 0x4d, 0xbe, 0x70, 0x83, 0x3b, 0xbf, 0x8b, 0xcd, 0x95, 0x3e, 0x5c, 0xe5, 0x3a, 0xbe, + 0x26, 0x6c, 0x3c, 0xbf, 0x32, 0x51, 0xac, 0x3e, 0xf8, 0x19, 0x2b, 0xbe, 0x6e, 0xf4, 0x30, 0xbf, 0x9a, 0x4b, 0xc3, 0x3e, 0xe4, 0x01, 0x30, 0xbe, 0x39, 0xdb, + 0x2f, 0xbf, 0xdc, 0xb4, 0xd8, 0x3e, 0xd0, 0x01, 0x40, 0xbe, 0xba, 0xd7, 0x2d, 0xbf, 0xb4, 0x18, 0xeb, 0x3e, 0xb0, 0x0d, 0x5a, 0xbe, 0x96, 0x0e, 0x2b, 0xbf, + 0x39, 0x36, 0xf9, 0x3e, 0xc4, 0x5c, 0x7c, 0xbe, 0x9a, 0xaf, 0x27, 0xbf, 0x8d, 0x09, 0x01, 0x3f, 0x5d, 0x50, 0x92, 0xbe, 0x18, 0xf6, 0x23, 0xbf, 0xdc, 0x8d, + 0x02, 0x3f, 0xbc, 0x04, 0xa8, 0xbe, 0xbd, 0x21, 0x20, 0xbf, 0x8d, 0x09, 0x01, 0x3f, 0xa4, 0xd6, 0xbd, 0xbe, 0xcc, 0x77, 0x1c, 0xbf, 0x38, 0x36, 0xf9, 0x3e, + 0xfe, 0x46, 0xd2, 0xbe, 0x28, 0x35, 0x19, 0xbf, 0xb3, 0x18, 0xeb, 0x3e, 0x2d, 0xf2, 0xe3, 0xbe, 0x58, 0x95, 0x16, 0xbf, 0xd9, 0xb4, 0xd8, 0x3e, 0x81, 0xa4, + 0xf1, 0xbe, 0x89, 0xc6, 0x14, 0xbf, 0x97, 0x4b, 0xc3, 0x3e, 0x26, 0x6f, 0xfa, 0xbe, 0x47, 0xe4, 0x13, 0xbf, 0x30, 0x51, 0xac, 0x3e, 0x26, 0xb9, 0xfd, 0xbe, + 0x1e, 0x02, 0x14, 0xbf, 0x94, 0x53, 0x95, 0x3e, 0x55, 0x45, 0xfb, 0xbe, 0x4c, 0x1b, 0x15, 0xbf, 0xa8, 0xd4, 0x7f, 0x3e, 0x40, 0x42, 0xf3, 0xbe, 0x56, 0x1f, + 0x17, 0xbf, 0xf7, 0x0c, 0x5b, 0x3e, 0x50, 0x3c, 0xe6, 0xbe, 0x7a, 0xe8, 0x19, 0xbf, 0x55, 0xd8, 0x3e, 0x3e, 0xc8, 0x14, 0xd5, 0xbe, 0x77, 0x47, 0x1d, 0xbf, + 0x27, 0x18, 0x2d, 0x3e, 0xea, 0xf5, 0xc0, 0xbe, 0x6e, 0x00, 0x21, 0xbf, 0x58, 0x0d, 0x27, 0x3e, 0x43, 0x41, 0xab, 0xbe, 0xd8, 0xd4, 0x24, 0xbf, 0x2a, 0x18, + 0x2d, 0x3e, 0xa2, 0x6f, 0x95, 0xbe, 0xb8, 0x7e, 0x28, 0xbf, 0x58, 0xd8, 0x3e, 0x3e, 0x2b, 0xfc, 0x80, 0xbe, 0xe8, 0xc1, 0x2b, 0xbf, 0xfb, 0x0c, 0x5b, 0x3e, + 0xf4, 0xa1, 0x5e, 0xbe, 0xb7, 0x61, 0x2e, 0xbf, 0xad, 0xd4, 0x7f, 0x3e, 0x64, 0x3f, 0x43, 0xbe, 0x0b, 0x32, 0x30, 0xbf, 0x98, 0x53, 0x95, 0x3e, 0x44, 0xae, + 0x31, 0xbe, 0x3f, 0x12, 0x31, 0xbf, 0x20, 0x1d, 0xab, 0x3e, 0xa6, 0x93, 0x2e, 0xbe, 0xca, 0x5d, 0x25, 0xbf, 0xfb, 0xb8, 0xbf, 0x3e, 0xb6, 0xf8, 0x32, 0xbe, + 0xd0, 0x60, 0x24, 0xbf, 0x6f, 0xed, 0xd2, 0x3e, 0x68, 0x58, 0x41, 0xbe, 0x1b, 0x92, 0x22, 0xbf, 0x7a, 0x69, 0xe3, 0x3e, 0x64, 0xb1, 0x58, 0xbe, 0xb8, 0x13, + 0x20, 0xbf, 0x88, 0x0f, 0xf0, 0x3e, 0x86, 0x78, 0x77, 0xbe, 0xbd, 0x0c, 0x1d, 0xbf, 0x24, 0x02, 0xf8, 0x3e, 0x57, 0xc6, 0x8d, 0xbe, 0x46, 0xb6, 0x19, 0xbf, + 0x87, 0xba, 0xfa, 0x3e, 0x44, 0x3c, 0xa1, 0xbe, 0x34, 0x48, 0x16, 0xbf, 0x23, 0x02, 0xf8, 0x3e, 0x69, 0xcb, 0xb4, 0xbe, 0x85, 0xfe, 0x12, 0xbf, 0x87, 0x0f, + 0xf0, 0x3e, 0x87, 0x1f, 0xc7, 0xbe, 0xcc, 0x13, 0x10, 0xbf, 0x79, 0x69, 0xe3, 0x3e, 0x2e, 0xf6, 0xd6, 0xbe, 0xc5, 0xb8, 0x0d, 0xbf, 0x6d, 0xed, 0xd2, 0x3e, + 0x84, 0x3f, 0xe3, 0xbe, 0xd7, 0x18, 0x0c, 0xbf, 0xf8, 0xb8, 0xbf, 0x3e, 0xea, 0x1e, 0xeb, 0xbe, 0x1c, 0x4e, 0x0b, 0xbf, 0x1c, 0x1d, 0xab, 0x3e, 0x8a, 0x11, + 0xee, 0xbe, 0x50, 0x68, 0x0b, 0xbf, 0x74, 0x84, 0x96, 0x3e, 0x28, 0xdf, 0xeb, 0xbe, 0x44, 0x65, 0x0c, 0xbf, 0x02, 0x50, 0x83, 0x3e, 0x6b, 0xb2, 0xe4, 0xbe, + 0x6e, 0x33, 0x0e, 0xbf, 0xe9, 0xa7, 0x65, 0x3e, 0xb6, 0x03, 0xd9, 0xbe, 0xe6, 0xb3, 0x10, 0xbf, 0xd0, 0x5b, 0x4c, 0x3e, 0x16, 0xa2, 0xc9, 0xbe, 0xdd, 0xb8, + 0x13, 0xbf, 0x2d, 0x70, 0x3c, 0x3e, 0x26, 0x98, 0xb7, 0xbe, 0x4c, 0x0f, 0x17, 0xbf, 0xd4, 0x05, 0x37, 0x3e, 0x20, 0x23, 0xa4, 0xbe, 0xe8, 0x7e, 0x1a, 0xbf, + 0x2e, 0x70, 0x3c, 0x3e, 0x14, 0x93, 0x90, 0xbe, 0x0e, 0xc7, 0x1d, 0xbf, 0xd2, 0x5b, 0x4c, 0x3e, 0xba, 0x7f, 0x7c, 0xbe, 0x50, 0xb3, 0x20, 0xbf, 0xee, 0xa7, + 0x65, 0x3e, 0x5e, 0xca, 0x5c, 0xbe, 0x54, 0x0d, 0x23, 0xbf, 0x05, 0x50, 0x83, 0x3e, 0x52, 0x40, 0x44, 0xbe, 0x39, 0xae, 0x24, 0xbf, 0x78, 0x84, 0x96, 0x3e, + 0x30, 0x79, 0x34, 0xbe, 0xf8, 0x77, 0x25, 0xbf, 0x2d, 0x19, 0xaa, 0x3e, 0x1e, 0x53, 0x3e, 0xbe, 0xfb, 0x4f, 0x1a, 0xbf, 0xe0, 0xeb, 0xba, 0x3e, 0x5c, 0xe2, + 0x41, 0xbe, 0x42, 0x82, 0x19, 0xbf, 0x57, 0x97, 0xca, 0x3e, 0xcc, 0x9d, 0x4d, 0xbe, 0xec, 0x08, 0x18, 0xbf, 0xfb, 0x0d, 0xd8, 0x3e, 0x38, 0xaf, 0x60, 0xbe, + 0xe5, 0xfe, 0x15, 0xbf, 0x55, 0x62, 0xe2, 0x3e, 0x22, 0xd1, 0x79, 0xbe, 0xfe, 0x86, 0x13, 0xbf, 0xad, 0xe0, 0xe8, 0x3e, 0xf6, 0xa3, 0x8b, 0xbe, 0x7a, 0xcc, + 0x10, 0xbf, 0xb3, 0x18, 0xeb, 0x3e, 0xa1, 0x87, 0x9b, 0xbe, 0x33, 0xff, 0x0d, 0xbf, 0xac, 0xe0, 0xe8, 0x3e, 0x56, 0x80, 0xab, 0xbe, 0x3f, 0x50, 0x0b, 0xbf, + 0x53, 0x62, 0xe2, 0x3e, 0x9d, 0x78, 0xba, 0xbe, 0xae, 0xed, 0x08, 0xbf, 0xfa, 0x0d, 0xd8, 0x3e, 0x6e, 0x66, 0xc7, 0xbe, 0xe9, 0x01, 0x07, 0xbf, 0x56, 0x97, + 0xca, 0x3e, 0x61, 0x6c, 0xd1, 0xbe, 0xf9, 0xad, 0x05, 0xbf, 0xde, 0xeb, 0xba, 0x3e, 0x82, 0xdc, 0xd7, 0xbe, 0x04, 0x09, 0x05, 0xbf, 0x2a, 0x19, 0xaa, 0x3e, + 0x06, 0x45, 0xda, 0xbe, 0xdb, 0x1f, 0x05, 0xbf, 0x77, 0x46, 0x99, 0x3e, 0x47, 0x7a, 0xd8, 0xbe, 0x1c, 0xee, 0x05, 0xbf, 0xcc, 0x97, 0x89, 0x3e, 0x6c, 0x9c, + 0xd2, 0xbe, 0x7a, 0x67, 0x07, 0xbf, 0x50, 0x42, 0x78, 0x3e, 0xd9, 0x13, 0xc9, 0xbe, 0x79, 0x71, 0x09, 0xbf, 0x9c, 0x99, 0x63, 0x3e, 0x26, 0x86, 0xbc, 0xbe, + 0xd1, 0xe8, 0x0b, 0xbf, 0xed, 0x9c, 0x56, 0x3e, 0x79, 0xca, 0xad, 0xbe, 0x60, 0xa3, 0x0e, 0xbf, 0xe1, 0x2c, 0x52, 0x3e, 0xaa, 0xe6, 0x9d, 0xbe, 0xae, 0x70, + 0x11, 0xbf, 0xee, 0x9c, 0x56, 0x3e, 0x19, 0xee, 0x8d, 0xbe, 0x9c, 0x1f, 0x14, 0xbf, 0x9e, 0x99, 0x63, 0x3e, 0x34, 0xec, 0x7d, 0xbe, 0x20, 0x82, 0x16, 0xbf, + 0x54, 0x42, 0x78, 0x3e, 0x5a, 0x0d, 0x64, 0xbe, 0x79, 0x6c, 0x18, 0xbf, 0xce, 0x97, 0x89, 0x3e, 0xc8, 0xfb, 0x4f, 0xbe, 0xe8, 0xc0, 0x19, 0xbf, 0x44, 0x43, + 0x99, 0x3e, 0xcc, 0x1b, 0x43, 0xbe, 0xd6, 0x65, 0x1a, 0xbf, 0xfe, 0x4e, 0xa9, 0x3e, 0x70, 0x38, 0x59, 0xbe, 0x32, 0x8f, 0x10, 0xbf, 0x80, 0x34, 0xb5, 0x3e, + 0x0a, 0xc1, 0x5b, 0xbe, 0x6c, 0xfd, 0x0f, 0xbf, 0x66, 0x49, 0xc0, 0x3e, 0x40, 0x0b, 0x64, 0xbe, 0xe2, 0xf1, 0x0e, 0xbf, 0x29, 0xcd, 0xc9, 0x3e, 0x16, 0x86, + 0x71, 0xbe, 0x8c, 0x81, 0x0d, 0xbf, 0x1a, 0x1c, 0xd1, 0x3e, 0x62, 0xa5, 0x81, 0xbe, 0xfe, 0xc1, 0x0b, 0xbf, 0xa5, 0xb2, 0xd5, 0x3e, 0x42, 0x11, 0x8c, 0xbe, + 0xbd, 0xd4, 0x09, 0xbf, 0xcb, 0x43, 0xd7, 0x3e, 0x2c, 0x4c, 0x97, 0xbe, 0xe7, 0xd9, 0x07, 0xbf, 0xa5, 0xb2, 0xd5, 0x3e, 0x6a, 0x96, 0xa2, 0xbe, 0x2f, 0xf4, + 0x05, 0xbf, 0x19, 0x1c, 0xd1, 0x3e, 0xa9, 0x2b, 0xad, 0xbe, 0xb2, 0x43, 0x04, 0xbf, 0x28, 0xcd, 0xc9, 0x3e, 0x17, 0x53, 0xb6, 0xbe, 0x3d, 0xe8, 0x02, 0xbf, + 0x65, 0x49, 0xc0, 0x3e, 0xe6, 0x68, 0xbd, 0xbe, 0xf2, 0xf8, 0x01, 0xbf, 0x7f, 0x34, 0xb5, 0x3e, 0xde, 0xf5, 0xc1, 0xbe, 0x89, 0x83, 0x01, 0xbf, 0xfd, 0x4e, + 0xa9, 0x3e, 0x58, 0xa8, 0xc3, 0xbe, 0xad, 0x92, 0x01, 0xbf, 0x7f, 0x69, 0x9d, 0x3e, 0x9e, 0x64, 0xc2, 0xbe, 0x5b, 0x24, 0x02, 0xbf, 0x97, 0x54, 0x92, 0x3e, + 0x14, 0x3f, 0xbe, 0xbe, 0xf6, 0x2f, 0x03, 0xbf, 0xa0, 0xcd, 0x88, 0x3e, 0x16, 0x82, 0xb7, 0xbe, 0x39, 0xa0, 0x04, 0xbf, 0xe5, 0x81, 0x81, 0x3e, 0x9d, 0x9f, + 0xae, 0xbe, 0xcf, 0x5f, 0x06, 0xbf, 0x42, 0xd0, 0x79, 0x3e, 0x29, 0x34, 0xa4, 0xbe, 0xfc, 0x4c, 0x08, 0xbf, 0xf7, 0xad, 0x76, 0x3e, 0x8a, 0xf8, 0x98, 0xbe, + 0xf1, 0x47, 0x0a, 0xbf, 0x42, 0xd0, 0x79, 0x3e, 0x00, 0xaf, 0x8d, 0xbe, 0x89, 0x2d, 0x0c, 0xbf, 0xe6, 0x81, 0x81, 0x3e, 0x56, 0x19, 0x83, 0xbe, 0x1a, 0xde, + 0x0d, 0xbf, 0xa2, 0xcd, 0x88, 0x3e, 0x14, 0xe4, 0x73, 0xbe, 0x88, 0x39, 0x0f, 0xbf, 0x99, 0x54, 0x92, 0x3e, 0xa0, 0xb7, 0x65, 0xbe, 0xe6, 0x28, 0x10, 0xbf, + 0x80, 0x69, 0x9d, 0x3e, 0x8a, 0x9e, 0x5c, 0xbe, 0x3d, 0x9e, 0x10, 0xbf, 0xb2, 0x75, 0xb2, 0xbe, 0x3c, 0x22, 0xbe, 0xbe, 0x1e, 0xde, 0x58, 0xbf, 0xb9, 0x98, + 0xb6, 0xbe, 0xee, 0x95, 0xbe, 0xbe, 0x59, 0xad, 0x58, 0xbf, 0xc5, 0xbe, 0xb1, 0xbe, 0x31, 0xcb, 0xcd, 0xbe, 0x84, 0x19, 0x57, 0xbf, 0x24, 0x75, 0xba, 0xbe, + 0x78, 0x04, 0xc0, 0xbe, 0xb0, 0x4f, 0x58, 0xbf, 0xac, 0x52, 0xae, 0xbe, 0x80, 0xba, 0xbe, 0xbe, 0x73, 0xe2, 0x58, 0xbf, 0x91, 0xc7, 0xbd, 0xbe, 0xad, 0x5a, + 0xc2, 0xbe, 0xf2, 0xd0, 0x57, 0xbf, 0x07, 0x53, 0xc0, 0xbe, 0x4f, 0x72, 0xc5, 0xbe, 0x4d, 0x34, 0x57, 0xbf, 0xcf, 0xed, 0xc1, 0xbe, 0xc7, 0x11, 0xc9, 0xbe, + 0xbc, 0x88, 0x56, 0xbf, 0x02, 0x7b, 0xc2, 0xbe, 0xcc, 0xfa, 0xcc, 0xbe, 0x53, 0xd7, 0x55, 0xbf, 0x03, 0xf1, 0xc1, 0xbe, 0x52, 0xed, 0xd0, 0xbe, 0x6b, 0x2e, + 0x55, 0xbf, 0x74, 0x59, 0xc0, 0xbe, 0x24, 0x9b, 0xd4, 0xbe, 0x28, 0x98, 0x54, 0xbf, 0xfe, 0xcd, 0xbd, 0xbe, 0xce, 0xca, 0xd7, 0xbe, 0x67, 0x1e, 0x54, 0xbf, + 0xc6, 0x7e, 0xba, 0xbe, 0x8c, 0x45, 0xda, 0xbe, 0x90, 0xca, 0x53, 0xbf, 0x58, 0xa2, 0xb6, 0xbe, 0xa3, 0xdb, 0xdb, 0xbe, 0x83, 0xa1, 0x53, 0xbf, 0x54, 0x7f, + 0xb2, 0xbe, 0x16, 0x75, 0xdc, 0xbe, 0x56, 0xa7, 0x53, 0xbf, 0x16, 0x59, 0xae, 0xbe, 0x49, 0x02, 0xdc, 0xbe, 0xa2, 0xd9, 0x53, 0xbf, 0xab, 0x7c, 0xaa, 0xbe, + 0x6a, 0x92, 0xda, 0xbe, 0xd1, 0x35, 0x54, 0xbf, 0x73, 0x2d, 0xa7, 0xbe, 0x90, 0x3a, 0xd8, 0xbe, 0x8e, 0xb6, 0x54, 0xbf, 0xc7, 0x9e, 0xa4, 0xbe, 0x04, 0x25, + 0xd5, 0xbe, 0x28, 0x51, 0x55, 0xbf, 0x36, 0x07, 0xa3, 0xbe, 0x8a, 0x85, 0xd1, 0xbe, 0xb7, 0xfc, 0x55, 0xbf, 0x03, 0x7a, 0xa2, 0xbe, 0x46, 0x99, 0xcd, 0xbe, + 0xb4, 0xae, 0x56, 0xbf, 0x02, 0x04, 0xa3, 0xbe, 0xda, 0xa9, 0xc9, 0xbe, 0x0e, 0x57, 0x57, 0xbf, 0x90, 0x9b, 0xa4, 0xbe, 0xe6, 0xfb, 0xc5, 0xbe, 0x58, 0xed, + 0x57, 0xbf, 0x07, 0x27, 0xa7, 0xbe, 0x7a, 0xcb, 0xc2, 0xbe, 0x8a, 0x65, 0x58, 0xbf, 0x3f, 0x76, 0xaa, 0xbe, 0xa0, 0x51, 0xc0, 0xbe, 0xe5, 0xba, 0x58, 0xbf, + 0xec, 0xa4, 0xa8, 0xbe, 0xf9, 0x45, 0x94, 0xbe, 0xb0, 0x75, 0x03, 0xbf, 0x57, 0xf6, 0xae, 0xbe, 0x08, 0xc3, 0x7e, 0xbe, 0xf7, 0x77, 0x08, 0xbf, 0xa3, 0xce, + 0xa8, 0xbe, 0x2c, 0x71, 0x7d, 0xbe, 0xdf, 0xc2, 0x08, 0xbf, 0x21, 0xb4, 0xb4, 0xbe, 0xe2, 0x86, 0x81, 0xbe, 0x42, 0xed, 0x07, 0xbf, 0x56, 0xa1, 0xb9, 0xbe, + 0x40, 0x04, 0x85, 0xbe, 0x20, 0x2e, 0x07, 0xbf, 0x84, 0x6a, 0xbd, 0xbe, 0x60, 0x9e, 0x89, 0xbe, 0x71, 0x46, 0x06, 0xbf, 0x40, 0xcc, 0xbf, 0xbe, 0x6a, 0x01, + 0x8f, 0xbe, 0x0d, 0x48, 0x05, 0xbf, 0xa5, 0x99, 0xc0, 0xbe, 0xfa, 0xd1, 0x94, 0xbe, 0xfd, 0x40, 0x04, 0xbf, 0x40, 0xcc, 0xbf, 0xbe, 0x52, 0xab, 0x9a, 0xbe, + 0xfd, 0x45, 0x03, 0xbf, 0x84, 0x6a, 0xbd, 0xbe, 0x94, 0x24, 0xa0, 0xbe, 0x68, 0x67, 0x02, 0xbf, 0x58, 0xa1, 0xb9, 0xbe, 0xa0, 0xe0, 0xa4, 0xbe, 0xe5, 0xb1, + 0x01, 0xbf, 0x22, 0xb4, 0xb4, 0xbe, 0xf4, 0x8b, 0xa8, 0xbe, 0x82, 0x35, 0x01, 0xbf, 0x58, 0xf6, 0xae, 0xbe, 0xcc, 0xe7, 0xaa, 0xbe, 0xac, 0xf9, 0x00, 0xbf, + 0xa4, 0xce, 0xa8, 0xbe, 0x31, 0xca, 0xab, 0xbe, 0x36, 0x02, 0x01, 0xbf, 0xf0, 0xa6, 0xa2, 0xbe, 0x43, 0x21, 0xab, 0xbe, 0x1e, 0x4d, 0x01, 0xbf, 0x26, 0xe9, + 0x9c, 0xbe, 0xc0, 0xfb, 0xa8, 0xbe, 0xd8, 0xd7, 0x01, 0xbf, 0xf2, 0xfb, 0x97, 0xbe, 0x64, 0x7e, 0xa5, 0xbe, 0xfc, 0x96, 0x02, 0xbf, 0xfc, 0x35, 0x94, 0xbe, + 0xc8, 0xe3, 0xa0, 0xbe, 0x0c, 0x7d, 0x03, 0xbf, 0x3e, 0xd4, 0x91, 0xbe, 0x81, 0x81, 0x9b, 0xbe, 0x01, 0x7d, 0x04, 0xbf, 0xa4, 0x03, 0x91, 0xbe, 0x85, 0xb0, + 0x95, 0xbe, 0x25, 0x84, 0x05, 0xbf, 0x3e, 0xd4, 0x91, 0xbe, 0x9a, 0xd7, 0x8f, 0xbe, 0x12, 0x7f, 0x06, 0xbf, 0xfc, 0x35, 0x94, 0xbe, 0x9e, 0x5e, 0x8a, 0xbe, + 0x99, 0x5d, 0x07, 0xbf, 0xf1, 0xfb, 0x97, 0xbe, 0xf8, 0xa0, 0x85, 0xbe, 0xb2, 0x11, 0x08, 0xbf, 0x25, 0xe9, 0x9c, 0xbe, 0xa2, 0xf5, 0x81, 0xbe, 0x15, 0x8e, + 0x08, 0xbf, 0xef, 0xa6, 0xa2, 0xbe, 0xf8, 0x35, 0x7f, 0xbe, 0x69, 0xcb, 0x08, 0xbf, 0xa6, 0x65, 0xb2, 0xbe, 0x92, 0xd4, 0xb8, 0xbe, 0xbc, 0x63, 0x59, 0xbf, + 0xe5, 0xec, 0xb7, 0xbe, 0xe8, 0x67, 0xb9, 0xbe, 0xf1, 0x1f, 0x59, 0xbf, 0xda, 0x13, 0xbd, 0xbe, 0x8b, 0x56, 0xbb, 0xbe, 0xc2, 0xa3, 0x58, 0xbf, 0xb1, 0x80, + 0xc1, 0xbe, 0xf0, 0x7a, 0xbe, 0xbe, 0x52, 0xf7, 0x57, 0xbf, 0x2d, 0xe3, 0xc4, 0xbe, 0x7d, 0x9a, 0xc2, 0xbe, 0x24, 0x28, 0x57, 0xbf, 0xef, 0x07, 0xc7, 0xbe, + 0x2e, 0x70, 0xc7, 0xbe, 0xc8, 0x43, 0x56, 0xbf, 0x13, 0xc2, 0xc7, 0xbe, 0xfb, 0xa8, 0xcc, 0xbe, 0xd8, 0x56, 0x55, 0xbf, 0xef, 0x07, 0xc7, 0xbe, 0x72, 0xe7, + 0xd1, 0xbe, 0x82, 0x76, 0x54, 0xbf, 0x2d, 0xe3, 0xc4, 0xbe, 0xc7, 0xd2, 0xd6, 0xbe, 0xf8, 0xac, 0x53, 0xbf, 0xb1, 0x80, 0xc1, 0xbe, 0xd2, 0x11, 0xdb, 0xbe, + 0x47, 0x0b, 0x53, 0xbf, 0xda, 0x13, 0xbd, 0xbe, 0x28, 0x60, 0xde, 0xbe, 0x84, 0x9b, 0x52, 0xbf, 0xe5, 0xec, 0xb7, 0xbe, 0x02, 0x7c, 0xe0, 0xbe, 0x99, 0x65, + 0x52, 0xbf, 0xa6, 0x65, 0xb2, 0xbe, 0xe0, 0x42, 0xe1, 0xbe, 0xc7, 0x6d, 0x52, 0xbf, 0x6a, 0xde, 0xac, 0xbe, 0x34, 0xaf, 0xe0, 0xbe, 0xee, 0xaf, 0x52, 0xbf, + 0xa6, 0xba, 0xa7, 0xbe, 0x68, 0xc3, 0xde, 0xbe, 0xa4, 0x2b, 0x53, 0xbf, 0xd1, 0x4d, 0xa3, 0xbe, 0xde, 0x9e, 0xdb, 0xbe, 0x19, 0xd8, 0x53, 0xbf, 0x22, 0xe8, + 0x9f, 0xbe, 0x2c, 0x7f, 0xd7, 0xbe, 0x4e, 0xa7, 0x54, 0xbf, 0x92, 0xc6, 0x9d, 0xbe, 0xb0, 0xa7, 0xd2, 0xbe, 0xaa, 0x8d, 0x55, 0xbf, 0x70, 0x0c, 0x9d, 0xbe, + 0x88, 0x70, 0xcd, 0xbe, 0x9d, 0x78, 0x56, 0xbf, 0x92, 0xc6, 0x9d, 0xbe, 0x6c, 0x30, 0xc8, 0xbe, 0xf0, 0x5a, 0x57, 0xbf, 0x22, 0xe8, 0x9f, 0xbe, 0xe2, 0x46, + 0xc3, 0xbe, 0x7a, 0x22, 0x58, 0xbf, 0xd1, 0x4d, 0xa3, 0xbe, 0xfc, 0x07, 0xbf, 0xbe, 0x24, 0xc4, 0x58, 0xbf, 0x72, 0xb7, 0xa7, 0xbe, 0xcc, 0xb9, 0xbb, 0xbe, + 0xe2, 0x33, 0x59, 0xbf, 0x6a, 0xde, 0xac, 0xbe, 0x18, 0x9b, 0xb9, 0xbe, 0x46, 0x6a, 0x59, 0xbf, 0xc6, 0x7e, 0xba, 0xbe, 0xa2, 0xd4, 0xae, 0xbe, 0xa2, 0x66, + 0x59, 0xbf, 0x23, 0x3f, 0xb2, 0xbe, 0xa8, 0xef, 0xad, 0xbe, 0xd5, 0xcc, 0x59, 0xbf, 0x33, 0x31, 0xc2, 0xbe, 0x9c, 0xb2, 0xb1, 0xbe, 0xdd, 0xac, 0x58, 0xbf, + 0x4d, 0xfc, 0xa9, 0xbe, 0xe6, 0x20, 0xaf, 0xbe, 0x60, 0xd5, 0x59, 0xbf, 0x11, 0xe2, 0xb1, 0xbe, 0x9e, 0x86, 0x9e, 0xbe, 0x26, 0x0f, 0x59, 0xbf, 0x90, 0xc7, + 0xbd, 0xbe, 0x59, 0xca, 0x9f, 0xbe, 0x7a, 0x7d, 0x58, 0xbf, 0x6c, 0xcc, 0xc8, 0xbe, 0x1c, 0x61, 0xb6, 0xbe, 0x51, 0xad, 0x57, 0xbf, 0x7a, 0xdc, 0xc8, 0xbe, + 0x98, 0xef, 0xa3, 0xbe, 0xe9, 0x71, 0x57, 0xbf, 0xef, 0xdc, 0xcd, 0xbe, 0x09, 0x8b, 0xbc, 0xbe, 0xa3, 0x76, 0x56, 0xbf, 0x71, 0x63, 0xd2, 0xbe, 0x23, 0xb0, + 0xaa, 0xbe, 0x0c, 0x01, 0x56, 0xbf, 0x0f, 0x0c, 0xd1, 0xbe, 0x71, 0xc3, 0xc3, 0xbe, 0xa1, 0x20, 0x55, 0xbf, 0x2d, 0xaf, 0xd9, 0xbe, 0x78, 0x92, 0xb3, 0xbe, + 0x7a, 0x41, 0x54, 0xbf, 0x43, 0x23, 0xd2, 0xbe, 0xf8, 0x90, 0xcb, 0xbe, 0x3d, 0xc0, 0x53, 0xbf, 0xf2, 0x48, 0xde, 0xbe, 0xcd, 0xfa, 0xbd, 0xbe, 0xd6, 0x54, + 0x52, 0xbf, 0x0f, 0x0c, 0xd1, 0xbe, 0xd3, 0x65, 0xd3, 0xbe, 0x90, 0x6f, 0x52, 0xbf, 0x15, 0xda, 0xdf, 0xbe, 0x42, 0x39, 0xc9, 0xbe, 0x64, 0x59, 0x50, 0xbf, + 0xef, 0xdc, 0xcd, 0xbe, 0xc4, 0xbe, 0xda, 0xbe, 0x7e, 0x43, 0x51, 0xbf, 0xf2, 0x48, 0xde, 0xbe, 0x80, 0x83, 0xd4, 0xbe, 0xac, 0x73, 0x4e, 0xbf, 0x6c, 0xcc, + 0xc8, 0xbe, 0xc3, 0x15, 0xe1, 0xbe, 0x1a, 0x53, 0x50, 0xbf, 0x2d, 0xaf, 0xd9, 0xbe, 0xbf, 0x18, 0xdf, 0xbe, 0x2e, 0xc3, 0x4c, 0xbf, 0x34, 0x31, 0xc2, 0xbe, + 0xe8, 0x01, 0xe6, 0xbe, 0x12, 0xad, 0x4f, 0xbf, 0x73, 0x63, 0xd2, 0xbe, 0x34, 0x3d, 0xe8, 0xbe, 0x3f, 0x68, 0x4b, 0xbf, 0xc8, 0x7e, 0xba, 0xbe, 0x3e, 0x2b, + 0xe9, 0xbe, 0x6f, 0x5b, 0x4f, 0xbf, 0x7b, 0xdc, 0xc8, 0xbe, 0xfa, 0x55, 0xef, 0xbe, 0x6c, 0x78, 0x4a, 0xbf, 0x24, 0x3f, 0xb2, 0xbe, 0xdc, 0x56, 0xea, 0xbe, + 0xa1, 0x66, 0x4f, 0xbf, 0x92, 0xc7, 0xbd, 0xbe, 0xf4, 0xe2, 0xf3, 0xbe, 0x06, 0x03, 0x4a, 0xbf, 0x4e, 0xfc, 0xa9, 0xbe, 0x8e, 0x78, 0xe9, 0xbe, 0xb3, 0xcb, + 0x4f, 0xbf, 0x13, 0xe2, 0xb1, 0xbe, 0x70, 0x95, 0xf5, 0xbe, 0x2a, 0x12, 0x4a, 0xbf, 0x16, 0x4d, 0xa2, 0xbe, 0x44, 0x96, 0xe6, 0xbe, 0x80, 0x84, 0x50, 0xbf, + 0x94, 0xfc, 0xa5, 0xbe, 0xb3, 0x51, 0xf4, 0xbe, 0xd6, 0xa3, 0x4a, 0xbf, 0xd8, 0xb1, 0x9b, 0xbe, 0xc6, 0xe7, 0xe1, 0xbe, 0x0f, 0x84, 0x51, 0xbf, 0xae, 0xe7, + 0x9a, 0xbe, 0x2a, 0x2c, 0xf0, 0xbe, 0x74, 0xaf, 0x4b, 0xbf, 0x59, 0xa1, 0x96, 0xbe, 0xd6, 0xc0, 0xdb, 0xbe, 0x3c, 0xba, 0x52, 0xbf, 0xec, 0x63, 0x91, 0xbe, + 0x30, 0x6c, 0xe9, 0xbe, 0x37, 0x20, 0x4d, 0xbf, 0x38, 0x72, 0x93, 0xbe, 0x26, 0x85, 0xd4, 0xbe, 0xc8, 0x10, 0x54, 0xbf, 0xfa, 0x14, 0x8a, 0xbe, 0xb2, 0x8c, + 0xe0, 0xbe, 0x4a, 0xdf, 0x4e, 0xbf, 0x05, 0x5b, 0x92, 0xbe, 0xbe, 0xba, 0xcc, 0xbe, 0xa2, 0x70, 0x55, 0xbf, 0x6b, 0x7e, 0x85, 0xbe, 0x3e, 0x21, 0xd6, 0xbe, + 0x78, 0xcc, 0x50, 0xbf, 0x38, 0x72, 0x93, 0xbe, 0xc4, 0xe2, 0xc4, 0xbe, 0xd9, 0xc1, 0x56, 0xbf, 0x46, 0xed, 0x83, 0xbe, 0xa0, 0xe5, 0xca, 0xbe, 0x6e, 0xc7, + 0x52, 0xbf, 0x59, 0xa1, 0x96, 0xbe, 0x18, 0x8d, 0xbd, 0xbe, 0x5d, 0xed, 0x57, 0xbf, 0x6b, 0x7e, 0x85, 0xbe, 0x8a, 0x98, 0xbf, 0xbe, 0xa1, 0xad, 0x54, 0xbf, + 0xd8, 0xb1, 0x9b, 0xbe, 0x1e, 0x33, 0xb7, 0xbe, 0x44, 0xde, 0x58, 0xbf, 0xf9, 0x14, 0x8a, 0xbe, 0x6b, 0x06, 0xb5, 0xbe, 0x96, 0x5d, 0x56, 0xbf, 0x15, 0x4d, + 0xa2, 0xbe, 0x04, 0x48, 0xb2, 0xbe, 0xd1, 0x85, 0x59, 0xbf, 0xeb, 0x63, 0x91, 0xbe, 0x1f, 0xdf, 0xab, 0xbe, 0x03, 0xb9, 0x57, 0xbf, 0xad, 0xe7, 0x9a, 0xbe, + 0xd2, 0xc6, 0xa4, 0xbe, 0x72, 0xaa, 0x58, 0xbf, 0x92, 0xfc, 0xa5, 0xbe, 0x17, 0x39, 0xa0, 0xbe, 0x48, 0x1e, 0x59, 0xbf, 0x99, 0xea, 0xc1, 0xbe, 0xba, 0xb5, + 0x89, 0xbe, 0x3a, 0xb5, 0x54, 0xbf, 0xe5, 0x17, 0xb1, 0xbe, 0x1c, 0xee, 0x87, 0xbe, 0xf3, 0x82, 0x55, 0xbf, 0x43, 0x99, 0xd1, 0xbe, 0x68, 0x92, 0x8f, 0xbe, + 0x62, 0x3a, 0x53, 0xbf, 0x30, 0x45, 0xa0, 0xbe, 0x72, 0x52, 0x8a, 0xbe, 0xcc, 0x98, 0x55, 0xbf, 0x9b, 0xac, 0xc4, 0xbe, 0x9c, 0x9f, 0x6c, 0xbe, 0x8e, 0x3c, + 0x4e, 0xbf, 0xf4, 0x13, 0xb0, 0xbe, 0x8c, 0x3a, 0x68, 0xbe, 0x87, 0x39, 0x4f, 0xbf, 0xe8, 0x0f, 0xdf, 0xbe, 0x1e, 0x1b, 0x99, 0xbe, 0x5a, 0x30, 0x51, 0xbf, + 0x0d, 0xe1, 0xd7, 0xbe, 0x56, 0xff, 0x7a, 0xbe, 0xdd, 0x6d, 0x4c, 0xbf, 0x44, 0x64, 0xe9, 0xbe, 0x12, 0xac, 0xa5, 0xbe, 0x71, 0xb8, 0x4e, 0xbf, 0x1c, 0x5d, + 0xe8, 0xbe, 0x28, 0x2c, 0x89, 0xbe, 0x78, 0xef, 0x49, 0xbf, 0x9b, 0xe2, 0xef, 0xbe, 0x78, 0x67, 0xb4, 0xbe, 0xf0, 0xfd, 0x4b, 0xbf, 0x29, 0x03, 0xf5, 0xbe, + 0x98, 0x8c, 0x98, 0xbe, 0x06, 0xe9, 0x46, 0xbf, 0xa1, 0x1a, 0xf2, 0xbe, 0x2e, 0x4c, 0xc4, 0xbe, 0x2d, 0x32, 0x49, 0xbf, 0xfc, 0xf8, 0xfc, 0xbe, 0xca, 0x99, + 0xaa, 0xbe, 0x04, 0x92, 0x43, 0xbf, 0x9b, 0xe2, 0xef, 0xbe, 0xb9, 0x40, 0xd4, 0xbe, 0x3d, 0x82, 0x46, 0xbf, 0x28, 0xae, 0xff, 0xbe, 0xb7, 0x0f, 0xbe, 0xbe, + 0xf1, 0x23, 0x40, 0xbf, 0x45, 0x64, 0xe9, 0xbe, 0x22, 0x39, 0xe3, 0xbe, 0xa4, 0x1f, 0x44, 0xbf, 0xfc, 0xf8, 0xfc, 0xbe, 0xdc, 0x9e, 0xd1, 0xbe, 0x42, 0xda, + 0x3c, 0xbf, 0xe9, 0x0f, 0xdf, 0xbe, 0xfa, 0x2a, 0xf0, 0xbe, 0xe1, 0x34, 0x42, 0xbf, 0x2a, 0x03, 0xf5, 0xbe, 0xf0, 0xf1, 0xe3, 0xbe, 0x06, 0xee, 0x39, 0xbf, + 0x45, 0x99, 0xd1, 0xbe, 0xee, 0x30, 0xfa, 0xbe, 0xf2, 0xe0, 0x40, 0xbf, 0x1d, 0x5d, 0xe8, 0xbe, 0xa2, 0xc9, 0xf3, 0xbe, 0x84, 0x94, 0x37, 0xbf, 0x9a, 0xea, + 0xc1, 0xbe, 0x87, 0x50, 0x00, 0xbf, 0xfc, 0x3b, 0x40, 0xbf, 0x0f, 0xe1, 0xd7, 0xbe, 0xf6, 0x08, 0x00, 0xbf, 0x10, 0xf3, 0x35, 0xbf, 0xe7, 0x17, 0xb1, 0xbe, + 0x43, 0x84, 0x01, 0xbf, 0x4d, 0x51, 0x40, 0xbf, 0x9d, 0xac, 0xc4, 0xbe, 0x2e, 0xf9, 0x03, 0xbf, 0xd8, 0x29, 0x35, 0xbf, 0x32, 0x45, 0xa0, 0xbe, 0xe4, 0x9e, + 0x00, 0xbf, 0x8e, 0x1f, 0x41, 0xbf, 0xf6, 0x13, 0xb0, 0xbe, 0x7e, 0x72, 0x05, 0xbf, 0x0d, 0x44, 0x35, 0xbf, 0xbe, 0x99, 0x90, 0xbe, 0xeb, 0x5f, 0xfb, 0xbe, + 0xeb, 0x98, 0x42, 0xbf, 0x18, 0x78, 0x9b, 0xbe, 0x4e, 0x59, 0x04, 0xbf, 0x02, 0x41, 0x36, 0xbf, 0x19, 0x23, 0x83, 0xbe, 0x58, 0xd7, 0xf1, 0xbe, 0xea, 0xa2, + 0x44, 0xbf, 0xa6, 0x43, 0x88, 0xbe, 0xf0, 0xc2, 0x00, 0xbf, 0x2d, 0x0f, 0x38, 0xbf, 0x7e, 0x9d, 0x71, 0xbe, 0xac, 0x46, 0xe5, 0xbe, 0xc8, 0x1a, 0x47, 0xbf, + 0x30, 0x8f, 0x6f, 0xbe, 0x1e, 0xd6, 0xf5, 0xbe, 0x1f, 0x8e, 0x3a, 0xbf, 0xcb, 0xa0, 0x64, 0xbe, 0xda, 0x8a, 0xd6, 0xbe, 0x5b, 0xd5, 0x49, 0xbf, 0x17, 0x43, + 0x56, 0xbe, 0x88, 0x75, 0xe6, 0xbe, 0x98, 0x94, 0x3d, 0xbf, 0xbc, 0x30, 0x60, 0xbe, 0x29, 0xaa, 0xc6, 0xbe, 0x1f, 0xa2, 0x4c, 0xbf, 0xdc, 0x5d, 0x46, 0xbe, + 0x98, 0x6b, 0xd4, 0xbe, 0x08, 0xeb, 0x40, 0xbf, 0xca, 0xa0, 0x64, 0xbe, 0x98, 0xb1, 0xb6, 0xbe, 0x0e, 0x51, 0x4f, 0xbf, 0x15, 0xed, 0x40, 0xbe, 0x86, 0xf5, + 0xc0, 0xbe, 0x20, 0x59, 0x44, 0xbf, 0x7b, 0x9d, 0x71, 0xbe, 0x9c, 0xb9, 0xa7, 0xbe, 0x94, 0xb3, 0x51, 0xbf, 0xdb, 0x5d, 0x46, 0xbe, 0x86, 0x66, 0xad, 0xbe, + 0xca, 0xa2, 0x47, 0xbf, 0x17, 0x23, 0x83, 0xbe, 0x86, 0xc8, 0x9a, 0xbe, 0xe6, 0x9f, 0x53, 0xbf, 0x13, 0x43, 0x56, 0xbe, 0x30, 0x10, 0x9b, 0xbe, 0x97, 0x8f, + 0x4a, 0xbf, 0xbc, 0x99, 0x90, 0xbe, 0x70, 0xc2, 0x90, 0xbe, 0xde, 0xf3, 0x54, 0xbf, 0x2d, 0x8f, 0x6f, 0xbe, 0xa2, 0x38, 0x8b, 0xbe, 0x12, 0xe9, 0x4c, 0xbf, + 0xa3, 0x43, 0x88, 0xbe, 0x3a, 0xe7, 0x7d, 0xbe, 0xf8, 0x89, 0x4e, 0xbf, 0x16, 0x78, 0x9b, 0xbe, 0x1a, 0x20, 0x6e, 0xbe, 0xb7, 0x53, 0x4f, 0xbf, 0x79, 0xdd, + 0xc5, 0xbe, 0x80, 0xd9, 0x4d, 0xbe, 0xfb, 0x85, 0x45, 0xbf, 0xdd, 0xdf, 0xae, 0xbe, 0x98, 0xf1, 0x48, 0xbe, 0x34, 0x9f, 0x46, 0xbf, 0xbb, 0x46, 0xdb, 0xbe, + 0x6e, 0xd9, 0x5d, 0xbe, 0x7e, 0x82, 0x43, 0xbf, 0x96, 0xaa, 0xed, 0xbe, 0x4c, 0xe5, 0x77, 0xbe, 0x59, 0xb9, 0x40, 0xbf, 0xe6, 0xc4, 0xfb, 0xbe, 0x32, 0x1a, + 0x8d, 0xbe, 0x62, 0x5a, 0x3d, 0xbf, 0x7e, 0x52, 0x02, 0xbf, 0x2a, 0x3c, 0xa1, 0xbe, 0xda, 0xa0, 0x39, 0xbf, 0x33, 0xd5, 0x03, 0xbf, 0x8a, 0xf0, 0xb6, 0xbe, + 0x7e, 0xcc, 0x35, 0xbf, 0x7f, 0x52, 0x02, 0xbf, 0x72, 0xc2, 0xcc, 0xbe, 0x8e, 0x22, 0x32, 0xbf, 0xe7, 0xc4, 0xfb, 0xbe, 0xce, 0x32, 0xe1, 0xbe, 0xef, 0xdf, + 0x2e, 0xbf, 0x98, 0xaa, 0xed, 0xbe, 0xfb, 0xdd, 0xf2, 0xbe, 0x1a, 0x40, 0x2c, 0xbf, 0xbe, 0x46, 0xdb, 0xbe, 0x27, 0x48, 0x00, 0xbf, 0x4a, 0x71, 0x2a, 0xbf, + 0x7d, 0xdd, 0xc5, 0xbe, 0x79, 0xad, 0x04, 0xbf, 0x07, 0x8f, 0x29, 0xbf, 0xe0, 0xdf, 0xae, 0xbe, 0x79, 0x52, 0x06, 0xbf, 0xde, 0xac, 0x29, 0xbf, 0x7b, 0xe5, + 0x97, 0xbe, 0x91, 0x18, 0x05, 0xbf, 0x0d, 0xc6, 0x2a, 0xbf, 0x39, 0x7c, 0x82, 0xbe, 0x06, 0x17, 0x01, 0xbf, 0x16, 0xca, 0x2c, 0xbf, 0xbf, 0x30, 0x60, 0xbe, + 0x1c, 0x28, 0xf5, 0xbe, 0x3a, 0x93, 0x2f, 0xbf, 0xb6, 0xf5, 0x43, 0xbe, 0x94, 0x00, 0xe4, 0xbe, 0x36, 0xf2, 0x32, 0xbf, 0xef, 0x3b, 0x32, 0xbe, 0xb8, 0xe1, + 0xcf, 0xbe, 0x30, 0xab, 0x36, 0xbf, 0xb2, 0x2a, 0x2c, 0xbe, 0x10, 0x2d, 0xba, 0xbe, 0x9a, 0x7f, 0x3a, 0xbf, 0xee, 0x3b, 0x32, 0xbe, 0x70, 0x5b, 0xa4, 0xbe, + 0x7c, 0x29, 0x3e, 0xbf, 0xb3, 0xf5, 0x43, 0xbe, 0xf8, 0xe7, 0x8f, 0xbe, 0xa8, 0x6c, 0x41, 0xbf, 0xbb, 0x30, 0x60, 0xbe, 0x90, 0x79, 0x7c, 0xbe, 0x7a, 0x0c, + 0x44, 0xbf, 0x37, 0x7c, 0x82, 0xbe, 0xfc, 0x16, 0x61, 0xbe, 0xcb, 0xdc, 0x45, 0xbf, 0x78, 0xe5, 0x97, 0xbe, 0xde, 0x85, 0x4f, 0xbe, 0x00, 0xbd, 0x46, 0xbf, + 0x87, 0x63, 0xc5, 0xbe, 0x48, 0x28, 0x39, 0xbe, 0x02, 0x29, 0x3b, 0xbf, 0x89, 0x98, 0xad, 0xbe, 0x1c, 0x13, 0x34, 0xbe, 0xe5, 0x4c, 0x3c, 0xbf, 0x57, 0x8d, + 0xdb, 0xbe, 0xb0, 0xb9, 0x49, 0xbe, 0xe2, 0x13, 0x39, 0xbf, 0x0f, 0x98, 0xee, 0xbe, 0xa4, 0xb8, 0x64, 0xbe, 0xbc, 0x30, 0x36, 0xbf, 0xbf, 0x32, 0xfd, 0xbe, + 0xa4, 0x1c, 0x84, 0xbe, 0x0c, 0xb4, 0x32, 0xbf, 0x89, 0x31, 0x03, 0xbf, 0x80, 0xf2, 0x98, 0xbe, 0x2e, 0xd8, 0x2e, 0xbf, 0xae, 0xc2, 0x04, 0xbf, 0x02, 0x6c, + 0xaf, 0xbe, 0xe0, 0xe1, 0x2a, 0xbf, 0x89, 0x31, 0x03, 0xbf, 0x0f, 0x03, 0xc6, 0xbe, 0x01, 0x16, 0x27, 0xbf, 0xc1, 0x32, 0xfd, 0xbe, 0x78, 0x2b, 0xdb, 0xbe, + 0x12, 0xb7, 0x23, 0xbf, 0x11, 0x98, 0xee, 0xbe, 0xc7, 0x77, 0xed, 0xbe, 0x9a, 0x00, 0x21, 0xbf, 0x5b, 0x8d, 0xdb, 0xbe, 0x9a, 0xa5, 0xfb, 0xbe, 0xed, 0x1f, + 0x1f, 0xbf, 0x8b, 0x63, 0xc5, 0xbe, 0x26, 0x60, 0x02, 0xbf, 0xad, 0x36, 0x1e, 0xbf, 0x8c, 0x98, 0xad, 0xbe, 0xc6, 0x12, 0x04, 0xbf, 0xe8, 0x54, 0x1e, 0xbf, + 0x8d, 0xcd, 0x95, 0xbe, 0xe6, 0xce, 0x02, 0xbf, 0x50, 0x78, 0x1f, 0xbf, 0x7b, 0x47, 0x7f, 0xbe, 0xfa, 0x51, 0xfd, 0xbe, 0xf8, 0x8d, 0x21, 0xbf, 0x07, 0x32, + 0x59, 0xbe, 0xc4, 0xd5, 0xef, 0xbe, 0x8f, 0x70, 0x24, 0xbf, 0xac, 0xfc, 0x3b, 0xbe, 0x52, 0x12, 0xde, 0xbe, 0xc5, 0xed, 0x27, 0xbf, 0x07, 0x9c, 0x29, 0xbe, + 0x96, 0x3f, 0xc9, 0xbe, 0x1e, 0xc9, 0x2b, 0xbf, 0x72, 0x57, 0x23, 0xbe, 0xca, 0xc5, 0xb2, 0xbe, 0x75, 0xbf, 0x2f, 0xbf, 0x06, 0x9c, 0x29, 0xbe, 0x07, 0x2f, + 0x9c, 0xbe, 0x4a, 0x8b, 0x33, 0xbf, 0xa8, 0xfc, 0x3b, 0xbe, 0x80, 0x03, 0x87, 0xbe, 0xc1, 0xea, 0x36, 0xbf, 0x03, 0x32, 0x59, 0xbe, 0xb0, 0x76, 0x69, 0xbe, + 0x33, 0xa2, 0x39, 0xbf, 0x75, 0x47, 0x7f, 0xbe, 0x84, 0x14, 0x4d, 0xbe, 0x70, 0x83, 0x3b, 0xbf, 0x8a, 0xcd, 0x95, 0xbe, 0x5c, 0xe5, 0x3a, 0xbe, 0x28, 0x6c, + 0x3c, 0xbf, 0x99, 0x4b, 0xc3, 0xbe, 0xe6, 0x01, 0x30, 0xbe, 0x3b, 0xdb, 0x2f, 0xbf, 0x32, 0x51, 0xac, 0xbe, 0xfc, 0x19, 0x2b, 0xbe, 0x72, 0xf4, 0x30, 0xbf, + 0xdb, 0xb4, 0xd8, 0xbe, 0xd2, 0x01, 0x40, 0xbe, 0xbb, 0xd7, 0x2d, 0xbf, 0xb5, 0x18, 0xeb, 0xbe, 0xb0, 0x0d, 0x5a, 0xbe, 0x96, 0x0e, 0x2b, 0xbf, 0x3a, 0x36, + 0xf9, 0xbe, 0xc6, 0x5c, 0x7c, 0xbe, 0x9c, 0xaf, 0x27, 0xbf, 0x8e, 0x09, 0x01, 0xbf, 0x5c, 0x50, 0x92, 0xbe, 0x18, 0xf6, 0x23, 0xbf, 0xde, 0x8d, 0x02, 0xbf, + 0xbc, 0x04, 0xa8, 0xbe, 0xbc, 0x21, 0x20, 0xbf, 0x8f, 0x09, 0x01, 0xbf, 0xa4, 0xd6, 0xbd, 0xbe, 0xcc, 0x77, 0x1c, 0xbf, 0x3b, 0x36, 0xf9, 0xbe, 0xff, 0x46, + 0xd2, 0xbe, 0x2a, 0x35, 0x19, 0xbf, 0xb7, 0x18, 0xeb, 0xbe, 0x2e, 0xf2, 0xe3, 0xbe, 0x58, 0x95, 0x16, 0xbf, 0xdd, 0xb4, 0xd8, 0xbe, 0x81, 0xa4, 0xf1, 0xbe, + 0x89, 0xc6, 0x14, 0xbf, 0x9d, 0x4b, 0xc3, 0xbe, 0x26, 0x6f, 0xfa, 0xbe, 0x48, 0xe4, 0x13, 0xbf, 0x35, 0x51, 0xac, 0xbe, 0x26, 0xb9, 0xfd, 0xbe, 0x1e, 0x02, + 0x14, 0xbf, 0x9a, 0x53, 0x95, 0xbe, 0x56, 0x45, 0xfb, 0xbe, 0x4d, 0x1b, 0x15, 0xbf, 0xb1, 0xd4, 0x7f, 0xbe, 0x41, 0x42, 0xf3, 0xbe, 0x58, 0x1f, 0x17, 0xbf, + 0xff, 0x0c, 0x5b, 0xbe, 0x52, 0x3c, 0xe6, 0xbe, 0x7c, 0xe8, 0x19, 0xbf, 0x5c, 0xd8, 0x3e, 0xbe, 0xc8, 0x14, 0xd5, 0xbe, 0x77, 0x47, 0x1d, 0xbf, 0x2e, 0x18, + 0x2d, 0xbe, 0xea, 0xf5, 0xc0, 0xbe, 0x6e, 0x00, 0x21, 0xbf, 0x5d, 0x0d, 0x27, 0xbe, 0x43, 0x41, 0xab, 0xbe, 0xd8, 0xd4, 0x24, 0xbf, 0x2c, 0x18, 0x2d, 0xbe, + 0xa4, 0x6f, 0x95, 0xbe, 0xbc, 0x7e, 0x28, 0xbf, 0x5a, 0xd8, 0x3e, 0xbe, 0x2b, 0xfc, 0x80, 0xbe, 0xe8, 0xc1, 0x2b, 0xbf, 0xfa, 0x0c, 0x5b, 0xbe, 0xf4, 0xa1, + 0x5e, 0xbe, 0xb8, 0x61, 0x2e, 0xbf, 0xad, 0xd4, 0x7f, 0xbe, 0x64, 0x3f, 0x43, 0xbe, 0x0b, 0x32, 0x30, 0xbf, 0x97, 0x53, 0x95, 0xbe, 0x44, 0xae, 0x31, 0xbe, + 0x3f, 0x12, 0x31, 0xbf, 0xfb, 0xb8, 0xbf, 0xbe, 0xb8, 0xf8, 0x32, 0xbe, 0xd2, 0x60, 0x24, 0xbf, 0x1f, 0x1d, 0xab, 0xbe, 0xa8, 0x93, 0x2e, 0xbe, 0xcc, 0x5d, + 0x25, 0xbf, 0x6f, 0xed, 0xd2, 0xbe, 0x6e, 0x58, 0x41, 0xbe, 0x1e, 0x92, 0x22, 0xbf, 0x7d, 0x69, 0xe3, 0xbe, 0x68, 0xb1, 0x58, 0xbe, 0xba, 0x13, 0x20, 0xbf, + 0x89, 0x0f, 0xf0, 0xbe, 0x88, 0x78, 0x77, 0xbe, 0xbe, 0x0c, 0x1d, 0xbf, 0x25, 0x02, 0xf8, 0xbe, 0x59, 0xc6, 0x8d, 0xbe, 0x48, 0xb6, 0x19, 0xbf, 0x8b, 0xba, + 0xfa, 0xbe, 0x46, 0x3c, 0xa1, 0xbe, 0x35, 0x48, 0x16, 0xbf, 0x27, 0x02, 0xf8, 0xbe, 0x6c, 0xcb, 0xb4, 0xbe, 0x88, 0xfe, 0x12, 0xbf, 0x8b, 0x0f, 0xf0, 0xbe, + 0x88, 0x1f, 0xc7, 0xbe, 0xce, 0x13, 0x10, 0xbf, 0x7e, 0x69, 0xe3, 0xbe, 0x2e, 0xf6, 0xd6, 0xbe, 0xc5, 0xb8, 0x0d, 0xbf, 0x71, 0xed, 0xd2, 0xbe, 0x84, 0x3f, + 0xe3, 0xbe, 0xd7, 0x18, 0x0c, 0xbf, 0xff, 0xb8, 0xbf, 0xbe, 0xea, 0x1e, 0xeb, 0xbe, 0x1d, 0x4e, 0x0b, 0xbf, 0x22, 0x1d, 0xab, 0xbe, 0x8a, 0x11, 0xee, 0xbe, + 0x50, 0x68, 0x0b, 0xbf, 0x79, 0x84, 0x96, 0xbe, 0x28, 0xdf, 0xeb, 0xbe, 0x44, 0x65, 0x0c, 0xbf, 0x07, 0x50, 0x83, 0xbe, 0x6b, 0xb2, 0xe4, 0xbe, 0x6e, 0x33, + 0x0e, 0xbf, 0xf2, 0xa7, 0x65, 0xbe, 0xb6, 0x03, 0xd9, 0xbe, 0xe6, 0xb3, 0x10, 0xbf, 0xd7, 0x5b, 0x4c, 0xbe, 0x16, 0xa2, 0xc9, 0xbe, 0xdd, 0xb8, 0x13, 0xbf, + 0x33, 0x70, 0x3c, 0xbe, 0x26, 0x98, 0xb7, 0xbe, 0x4c, 0x0f, 0x17, 0xbf, 0xd6, 0x05, 0x37, 0xbe, 0x20, 0x23, 0xa4, 0xbe, 0xe8, 0x7e, 0x1a, 0xbf, 0x30, 0x70, + 0x3c, 0xbe, 0x14, 0x93, 0x90, 0xbe, 0x0e, 0xc7, 0x1d, 0xbf, 0xd5, 0x5b, 0x4c, 0xbe, 0xba, 0x7f, 0x7c, 0xbe, 0x50, 0xb3, 0x20, 0xbf, 0xee, 0xa7, 0x65, 0xbe, + 0x60, 0xca, 0x5c, 0xbe, 0x56, 0x0d, 0x23, 0xbf, 0x05, 0x50, 0x83, 0xbe, 0x52, 0x40, 0x44, 0xbe, 0x39, 0xae, 0x24, 0xbf, 0x75, 0x84, 0x96, 0xbe, 0x30, 0x79, + 0x34, 0xbe, 0xf8, 0x77, 0x25, 0xbf, 0xe2, 0xeb, 0xba, 0xbe, 0x5c, 0xe2, 0x41, 0xbe, 0x44, 0x82, 0x19, 0xbf, 0x2e, 0x19, 0xaa, 0xbe, 0x1e, 0x53, 0x3e, 0xbe, + 0xfb, 0x4f, 0x1a, 0xbf, 0x59, 0x97, 0xca, 0xbe, 0xcc, 0x9d, 0x4d, 0xbe, 0xed, 0x08, 0x18, 0xbf, 0xfc, 0x0d, 0xd8, 0xbe, 0x3a, 0xaf, 0x60, 0xbe, 0xe6, 0xfe, + 0x15, 0xbf, 0x56, 0x62, 0xe2, 0xbe, 0x24, 0xd1, 0x79, 0xbe, 0xfe, 0x86, 0x13, 0xbf, 0xb1, 0xe0, 0xe8, 0xbe, 0xf8, 0xa3, 0x8b, 0xbe, 0x7c, 0xcc, 0x10, 0xbf, + 0xb7, 0x18, 0xeb, 0xbe, 0xa2, 0x87, 0x9b, 0xbe, 0x35, 0xff, 0x0d, 0xbf, 0xb1, 0xe0, 0xe8, 0xbe, 0x58, 0x80, 0xab, 0xbe, 0x41, 0x50, 0x0b, 0xbf, 0x57, 0x62, + 0xe2, 0xbe, 0x9e, 0x78, 0xba, 0xbe, 0xaf, 0xed, 0x08, 0xbf, 0xfd, 0x0d, 0xd8, 0xbe, 0x70, 0x66, 0xc7, 0xbe, 0xeb, 0x01, 0x07, 0xbf, 0x5a, 0x97, 0xca, 0xbe, + 0x62, 0x6c, 0xd1, 0xbe, 0xfa, 0xad, 0x05, 0xbf, 0xe4, 0xeb, 0xba, 0xbe, 0x84, 0xdc, 0xd7, 0xbe, 0x06, 0x09, 0x05, 0xbf, 0x30, 0x19, 0xaa, 0xbe, 0x06, 0x45, + 0xda, 0xbe, 0xdd, 0x1f, 0x05, 0xbf, 0x7c, 0x46, 0x99, 0xbe, 0x48, 0x7a, 0xd8, 0xbe, 0x1e, 0xee, 0x05, 0xbf, 0xd1, 0x97, 0x89, 0xbe, 0x6c, 0x9c, 0xd2, 0xbe, + 0x7a, 0x67, 0x07, 0xbf, 0x5a, 0x42, 0x78, 0xbe, 0xd9, 0x13, 0xc9, 0xbe, 0x79, 0x71, 0x09, 0xbf, 0xa3, 0x99, 0x63, 0xbe, 0x26, 0x86, 0xbc, 0xbe, 0xd1, 0xe8, + 0x0b, 0xbf, 0xf3, 0x9c, 0x56, 0xbe, 0x79, 0xca, 0xad, 0xbe, 0x60, 0xa3, 0x0e, 0xbf, 0xe6, 0x2c, 0x52, 0xbe, 0xaa, 0xe6, 0x9d, 0xbe, 0xae, 0x70, 0x11, 0xbf, + 0xf1, 0x9c, 0x56, 0xbe, 0x19, 0xee, 0x8d, 0xbe, 0x9c, 0x1f, 0x14, 0xbf, 0xa1, 0x99, 0x63, 0xbe, 0x34, 0xec, 0x7d, 0xbe, 0x20, 0x82, 0x16, 0xbf, 0x56, 0x42, + 0x78, 0xbe, 0x5c, 0x0d, 0x64, 0xbe, 0x7a, 0x6c, 0x18, 0xbf, 0xcf, 0x97, 0x89, 0xbe, 0xc8, 0xfb, 0x4f, 0xbe, 0xe8, 0xc0, 0x19, 0xbf, 0x46, 0x43, 0x99, 0xbe, + 0xcc, 0x1b, 0x43, 0xbe, 0xd6, 0x65, 0x1a, 0xbf, 0x80, 0x34, 0xb5, 0xbe, 0x0c, 0xc1, 0x5b, 0xbe, 0x6d, 0xfd, 0x0f, 0xbf, 0x01, 0x4f, 0xa9, 0xbe, 0x72, 0x38, + 0x59, 0xbe, 0x32, 0x8f, 0x10, 0xbf, 0x69, 0x49, 0xc0, 0xbe, 0x42, 0x0b, 0x64, 0xbe, 0xe3, 0xf1, 0x0e, 0xbf, 0x2b, 0xcd, 0xc9, 0xbe, 0x18, 0x86, 0x71, 0xbe, + 0x8e, 0x81, 0x0d, 0xbf, 0x1b, 0x1c, 0xd1, 0xbe, 0x62, 0xa5, 0x81, 0xbe, 0xfe, 0xc1, 0x0b, 0xbf, 0xab, 0xb2, 0xd5, 0xbe, 0x42, 0x11, 0x8c, 0xbe, 0xbe, 0xd4, + 0x09, 0xbf, 0xd1, 0x43, 0xd7, 0xbe, 0x2c, 0x4c, 0x97, 0xbe, 0xe8, 0xd9, 0x07, 0xbf, 0xab, 0xb2, 0xd5, 0xbe, 0x6c, 0x96, 0xa2, 0xbe, 0x31, 0xf4, 0x05, 0xbf, + 0x1c, 0x1c, 0xd1, 0xbe, 0xaa, 0x2b, 0xad, 0xbe, 0xb3, 0x43, 0x04, 0xbf, 0x2d, 0xcd, 0xc9, 0xbe, 0x18, 0x53, 0xb6, 0xbe, 0x3f, 0xe8, 0x02, 0xbf, 0x6a, 0x49, + 0xc0, 0xbe, 0xe6, 0x68, 0xbd, 0xbe, 0xf4, 0xf8, 0x01, 0xbf, 0x81, 0x34, 0xb5, 0xbe, 0xde, 0xf5, 0xc1, 0xbe, 0x8a, 0x83, 0x01, 0xbf, 0x02, 0x4f, 0xa9, 0xbe, + 0x5a, 0xa8, 0xc3, 0xbe, 0xad, 0x92, 0x01, 0xbf, 0x82, 0x69, 0x9d, 0xbe, 0x9e, 0x64, 0xc2, 0xbe, 0x5c, 0x24, 0x02, 0xbf, 0x9b, 0x54, 0x92, 0xbe, 0x15, 0x3f, + 0xbe, 0xbe, 0xf8, 0x2f, 0x03, 0xbf, 0xa4, 0xcd, 0x88, 0xbe, 0x17, 0x82, 0xb7, 0xbe, 0x3a, 0xa0, 0x04, 0xbf, 0xe8, 0x81, 0x81, 0xbe, 0x9e, 0x9f, 0xae, 0xbe, + 0xd0, 0x5f, 0x06, 0xbf, 0x48, 0xd0, 0x79, 0xbe, 0x29, 0x34, 0xa4, 0xbe, 0xfc, 0x4c, 0x08, 0xbf, 0xfd, 0xad, 0x76, 0xbe, 0x8b, 0xf8, 0x98, 0xbe, 0xf2, 0x47, + 0x0a, 0xbf, 0x47, 0xd0, 0x79, 0xbe, 0x00, 0xaf, 0x8d, 0xbe, 0x8a, 0x2d, 0x0c, 0xbf, 0xe7, 0x81, 0x81, 0xbe, 0x56, 0x19, 0x83, 0xbe, 0x1c, 0xde, 0x0d, 0xbf, + 0xa3, 0xcd, 0x88, 0xbe, 0x14, 0xe4, 0x73, 0xbe, 0x88, 0x39, 0x0f, 0xbf, 0x9a, 0x54, 0x92, 0xbe, 0xa0, 0xb7, 0x65, 0xbe, 0xe8, 0x28, 0x10, 0xbf, 0x82, 0x69, + 0x9d, 0xbe, 0x8a, 0x9e, 0x5c, 0xbe, 0x3e, 0x9e, 0x10, 0xbf, 0x8d, 0x2e, 0x24, 0xbe, 0x06, 0x0b, 0xb4, 0xbf, 0x18, 0x3d, 0x99, 0x3d, 0x36, 0x9e, 0x7f, 0xbe, + 0x7e, 0x33, 0xaf, 0xbf, 0xce, 0x11, 0x16, 0x3e, 0x27, 0x20, 0x2f, 0xbe, 0x6e, 0x92, 0xb7, 0xbf, 0x20, 0x2c, 0xf8, 0x3d, 0xf3, 0x1f, 0x2f, 0x3e, 0x6e, 0x92, + 0xb7, 0xbf, 0x24, 0x2c, 0xf8, 0x3d, 0x05, 0x9e, 0x7f, 0x3e, 0x7e, 0x33, 0xaf, 0xbf, 0xd1, 0x11, 0x16, 0x3e, 0x5a, 0x2e, 0x24, 0x3e, 0x06, 0x0b, 0xb4, 0xbf, + 0x22, 0x3d, 0x99, 0x3d, 0x39, 0xd9, 0xb2, 0xbe, 0xbf, 0x10, 0xae, 0xbf, 0x05, 0x69, 0x92, 0x3e, 0x47, 0xe8, 0x92, 0xbe, 0xae, 0x68, 0xc2, 0xbf, 0x33, 0x22, + 0xa3, 0x3e, 0xe0, 0xee, 0x9b, 0xbe, 0xb0, 0xe3, 0xb2, 0xbf, 0x26, 0xbf, 0x7e, 0x3e, 0xc5, 0xee, 0x9b, 0x3e, 0xb0, 0xe3, 0xb2, 0xbf, 0x28, 0xbf, 0x7e, 0x3e, + 0x2a, 0xe8, 0x92, 0x3e, 0xae, 0x68, 0xc2, 0xbf, 0x34, 0x22, 0xa3, 0x3e, 0x20, 0xd9, 0xb2, 0x3e, 0xbf, 0x10, 0xae, 0xbf, 0x06, 0x69, 0x92, 0x3e, 0x30, 0x6d, + 0x0c, 0xbe, 0x05, 0x09, 0xc0, 0xbf, 0xd9, 0x16, 0x22, 0x3e, 0xa1, 0xd6, 0x07, 0xbe, 0x6a, 0xee, 0xb9, 0xbf, 0xec, 0x51, 0xda, 0x3d, 0x6d, 0xd6, 0x07, 0x3e, + 0x6a, 0xee, 0xb9, 0xbf, 0xf0, 0x51, 0xda, 0x3d, 0xfa, 0x6c, 0x0c, 0x3e, 0x05, 0x09, 0xc0, 0xbf, 0xda, 0x16, 0x22, 0x3e, 0x46, 0xb9, 0x6b, 0xbe, 0xe9, 0xba, + 0xbc, 0xbf, 0x90, 0x67, 0x5e, 0x3e, 0xca, 0xb5, 0x6f, 0xbe, 0x62, 0x57, 0xb9, 0xbf, 0x65, 0x7e, 0x4e, 0x3e, 0x94, 0xb5, 0x6f, 0x3e, 0x62, 0x57, 0xb9, 0xbf, + 0x66, 0x7e, 0x4e, 0x3e, 0x10, 0xb9, 0x6b, 0x3e, 0xe9, 0xba, 0xbc, 0xbf, 0x94, 0x67, 0x5e, 0x3e, 0xfb, 0xc8, 0x06, 0xbf, 0xf2, 0xa2, 0xa5, 0xbf, 0xc2, 0x22, + 0xd4, 0x3e, 0xc3, 0xbe, 0x03, 0xbf, 0xa8, 0xdc, 0xb9, 0xbf, 0x75, 0x9e, 0xe6, 0x3e, 0xae, 0xf0, 0xf5, 0xbe, 0x66, 0xe1, 0xbb, 0xbf, 0xcc, 0xfc, 0xda, 0x3e, + 0x95, 0xf0, 0xf5, 0x3e, 0x66, 0xe1, 0xbb, 0xbf, 0xce, 0xfc, 0xda, 0x3e, 0xb5, 0xbe, 0x03, 0x3f, 0xa8, 0xdc, 0xb9, 0xbf, 0x77, 0x9e, 0xe6, 0x3e, 0xee, 0xc8, + 0x06, 0x3f, 0xf2, 0xa2, 0xa5, 0xbf, 0xc4, 0x22, 0xd4, 0x3e, 0xb6, 0x3e, 0x3e, 0xbd, 0x88, 0xb4, 0xbb, 0xbf, 0xe4, 0xc5, 0xb9, 0x3d, 0x80, 0xc5, 0x81, 0xbd, + 0xcc, 0x00, 0xc6, 0xbf, 0x8a, 0x62, 0xe9, 0x3d, 0xca, 0x28, 0xdd, 0xb4, 0xe1, 0x63, 0xc8, 0xbf, 0x70, 0x5c, 0xed, 0x3d, 0x3a, 0x39, 0xd2, 0xb4, 0x10, 0x25, + 0xbe, 0xbf, 0x72, 0x19, 0xc6, 0x3d, 0x13, 0xc5, 0x81, 0x3d, 0xcc, 0x00, 0xc6, 0xbf, 0x8e, 0x62, 0xe9, 0x3d, 0xe7, 0x3d, 0x3e, 0x3d, 0x88, 0xb4, 0xbb, 0xbf, + 0xe4, 0xc5, 0xb9, 0x3d, 0xda, 0x20, 0xc3, 0xb4, 0xac, 0x5e, 0x47, 0xbf, 0x5d, 0x2a, 0x82, 0x3f, 0xfa, 0xa9, 0xda, 0xb4, 0xa8, 0x18, 0x6b, 0xbf, 0xfa, 0x22, + 0x8e, 0x3f, 0x73, 0x95, 0x97, 0xbd, 0x90, 0x96, 0x68, 0xbf, 0x56, 0x77, 0x8d, 0x3f, 0x02, 0xae, 0x84, 0xbd, 0x75, 0x03, 0x46, 0xbf, 0x8e, 0xff, 0x81, 0x3f, + 0xa0, 0xad, 0x84, 0x3d, 0x74, 0x03, 0x46, 0xbf, 0x90, 0xff, 0x81, 0x3f, 0x06, 0x95, 0x97, 0x3d, 0x90, 0x96, 0x68, 0xbf, 0x56, 0x77, 0x8d, 0x3f, 0xf3, 0xd8, + 0x8a, 0xbd, 0xe9, 0xfe, 0xcb, 0xbf, 0x45, 0xf8, 0x1a, 0x3e, 0x0a, 0x6a, 0xe6, 0xb4, 0x06, 0x64, 0xcf, 0xbf, 0x41, 0xf3, 0x1c, 0x3e, 0x81, 0xd8, 0x8a, 0x3d, + 0xe9, 0xfe, 0xcb, 0xbf, 0x45, 0xf8, 0x1a, 0x3e, 0xf6, 0xcd, 0x9e, 0xbd, 0x3d, 0x2c, 0xd5, 0xbf, 0x34, 0xb6, 0x86, 0x3e, 0x4d, 0xa3, 0xf5, 0xb4, 0xfd, 0xe9, + 0xd7, 0xbf, 0xe6, 0xb3, 0x80, 0x3e, 0x7b, 0xcd, 0x9e, 0x3d, 0x3d, 0x2c, 0xd5, 0xbf, 0x34, 0xb6, 0x86, 0x3e, 0xbc, 0xbc, 0x98, 0xbd, 0x2c, 0x29, 0xdf, 0xbf, + 0x41, 0x63, 0xa7, 0x3e, 0xec, 0x84, 0x01, 0xb5, 0xc3, 0x0a, 0xe1, 0xbf, 0xb2, 0x83, 0xa2, 0x3e, 0x3b, 0xbc, 0x98, 0x3d, 0x2c, 0x29, 0xdf, 0xbf, 0x41, 0x63, + 0xa7, 0x3e, 0x9d, 0xb7, 0xee, 0xb4, 0xb7, 0x5c, 0x84, 0xbf, 0x4a, 0xfb, 0x98, 0x3f, 0x95, 0x84, 0xc6, 0xbd, 0xb2, 0x4d, 0x83, 0xbf, 0xda, 0x19, 0x99, 0x3f, + 0x23, 0x84, 0xc6, 0x3d, 0xb2, 0x4d, 0x83, 0xbf, 0xda, 0x19, 0x99, 0x3f, 0x6a, 0xea, 0x01, 0xb5, 0x7c, 0xae, 0x93, 0xbf, 0x95, 0xd2, 0xa4, 0x3f, 0x10, 0x06, + 0xfd, 0xbd, 0xfa, 0xcc, 0x92, 0xbf, 0xc8, 0x31, 0xa4, 0x3f, 0x91, 0x05, 0xfd, 0x3d, 0xfa, 0xcc, 0x92, 0xbf, 0xc8, 0x31, 0xa4, 0x3f, 0xc7, 0xcc, 0xc8, 0xb4, + 0xb3, 0x4c, 0xb7, 0xbf, 0xa0, 0x7f, 0x64, 0x3d, 0xcd, 0x39, 0x17, 0xbf, 0x60, 0xfb, 0x8d, 0xbf, 0xfa, 0x23, 0x43, 0x3f, 0x80, 0xe6, 0x14, 0xbf, 0x72, 0xc8, + 0x92, 0xbf, 0x72, 0x09, 0x33, 0x3f, 0x64, 0x19, 0x10, 0xbf, 0xff, 0x4a, 0x81, 0xbf, 0xec, 0x2f, 0x23, 0x3f, 0x3d, 0x42, 0x11, 0xbf, 0xf4, 0xed, 0x77, 0xbf, + 0x97, 0x8a, 0x30, 0x3f, 0x31, 0x42, 0x11, 0x3f, 0xf4, 0xed, 0x77, 0xbf, 0x97, 0x8a, 0x30, 0x3f, 0x59, 0x19, 0x10, 0x3f, 0xff, 0x4a, 0x81, 0xbf, 0xee, 0x2f, + 0x23, 0x3f, 0x74, 0xe6, 0x14, 0x3f, 0x72, 0xc8, 0x92, 0xbf, 0x73, 0x09, 0x33, 0x3f, 0xc1, 0x39, 0x17, 0x3f, 0x60, 0xfb, 0x8d, 0xbf, 0xfc, 0x23, 0x43, 0x3f, + 0x7c, 0x24, 0x12, 0xbf, 0x61, 0xfd, 0x9a, 0xbf, 0xba, 0x94, 0x15, 0x3f, 0xa7, 0xd2, 0x11, 0xbf, 0xfe, 0xd1, 0x88, 0xbf, 0x64, 0xee, 0x0a, 0x3f, 0x9a, 0xd2, + 0x11, 0x3f, 0xfe, 0xd1, 0x88, 0xbf, 0x65, 0xee, 0x0a, 0x3f, 0x70, 0x24, 0x12, 0x3f, 0x61, 0xfd, 0x9a, 0xbf, 0xbb, 0x94, 0x15, 0x3f, 0x94, 0x14, 0x10, 0xbf, + 0x84, 0x40, 0xa2, 0xbf, 0xe0, 0xe8, 0xf5, 0x3e, 0x48, 0x4e, 0x0d, 0xbf, 0x4a, 0x7e, 0x93, 0xbf, 0x10, 0x42, 0xc9, 0x3e, 0x3c, 0x4e, 0x0d, 0x3f, 0x4a, 0x7e, + 0x93, 0xbf, 0x12, 0x42, 0xc9, 0x3e, 0x87, 0x14, 0x10, 0x3f, 0x84, 0x40, 0xa2, 0xbf, 0xe2, 0xe8, 0xf5, 0x3e, 0xbc, 0xa4, 0x4f, 0xbe, 0xca, 0xe8, 0x68, 0xbf, + 0x06, 0xe0, 0x8c, 0x3f, 0xbb, 0x64, 0x35, 0xbe, 0x82, 0x1c, 0x48, 0xbf, 0x74, 0x25, 0x81, 0x3f, 0x8b, 0x64, 0x35, 0x3e, 0x82, 0x1c, 0x48, 0xbf, 0x75, 0x25, + 0x81, 0x3f, 0x8a, 0xa4, 0x4f, 0x3e, 0xc9, 0xe8, 0x68, 0xbf, 0x07, 0xe0, 0x8c, 0x3f, 0xbf, 0x0b, 0xbf, 0xbe, 0xc8, 0x08, 0x6c, 0xbf, 0x5e, 0xcc, 0x87, 0x3f, + 0x02, 0xb5, 0xa8, 0xbe, 0xd2, 0x7d, 0x4c, 0xbf, 0xb0, 0x53, 0x79, 0x3f, 0xe9, 0xb4, 0xa8, 0x3e, 0xd2, 0x7d, 0x4c, 0xbf, 0xb0, 0x53, 0x79, 0x3f, 0xa7, 0x0b, + 0xbf, 0x3e, 0xc8, 0x08, 0x6c, 0xbf, 0x5e, 0xcc, 0x87, 0x3f, 0x65, 0x7a, 0xfa, 0xbe, 0x52, 0x56, 0x74, 0xbf, 0x72, 0x46, 0x80, 0x3f, 0x35, 0x0e, 0xe1, 0xbe, + 0xa5, 0x05, 0x53, 0xbf, 0xc2, 0x27, 0x6b, 0x3f, 0x1e, 0x0e, 0xe1, 0x3e, 0xa4, 0x05, 0x53, 0xbf, 0xc6, 0x27, 0x6b, 0x3f, 0x50, 0x7a, 0xfa, 0x3e, 0x51, 0x56, + 0x74, 0xbf, 0x73, 0x46, 0x80, 0x3f, 0x3f, 0x73, 0x10, 0xbf, 0x06, 0x3a, 0x7f, 0xbf, 0x89, 0x83, 0x6b, 0x3f, 0x84, 0x9d, 0x08, 0xbf, 0x93, 0x9f, 0x5b, 0xbf, + 0x30, 0x2e, 0x57, 0x3f, 0x79, 0x9d, 0x08, 0x3f, 0x93, 0x9f, 0x5b, 0xbf, 0x2e, 0x2e, 0x57, 0x3f, 0x33, 0x73, 0x10, 0x3f, 0x06, 0x3a, 0x7f, 0xbf, 0x8a, 0x83, + 0x6b, 0x3f, 0x6c, 0xfd, 0x19, 0xbf, 0x12, 0xd7, 0x86, 0xbf, 0xbb, 0x0f, 0x57, 0x3f, 0x50, 0x45, 0x13, 0xbf, 0x4f, 0xd8, 0x68, 0xbf, 0x86, 0xfe, 0x43, 0x3f, + 0x45, 0x45, 0x13, 0x3f, 0x4e, 0xd8, 0x68, 0xbf, 0x87, 0xfe, 0x43, 0x3f, 0x61, 0xfd, 0x19, 0x3f, 0x12, 0xd7, 0x86, 0xbf, 0xbb, 0x0f, 0x57, 0x3f, 0xa3, 0xe9, + 0xa1, 0xbe, 0x8c, 0xe0, 0xa8, 0xbf, 0x95, 0x80, 0x3f, 0x3e, 0x31, 0xb2, 0xcd, 0xbe, 0xfe, 0x49, 0x9e, 0xbf, 0x20, 0x93, 0x80, 0x3e, 0x19, 0xb2, 0xcd, 0x3e, + 0xfd, 0x49, 0x9e, 0xbf, 0x21, 0x93, 0x80, 0x3e, 0x8c, 0xe9, 0xa1, 0x3e, 0x8c, 0xe0, 0xa8, 0xbf, 0x97, 0x80, 0x3f, 0x3e, 0xea, 0xaa, 0xc6, 0xbe, 0x9c, 0xf9, + 0xad, 0xbf, 0xda, 0x95, 0x9a, 0x3e, 0xd2, 0xaa, 0xc6, 0x3e, 0x9c, 0xf9, 0xad, 0xbf, 0xdb, 0x95, 0x9a, 0x3e, 0xdb, 0x3a, 0xe5, 0xbe, 0xe0, 0x27, 0xac, 0xbf, + 0xc4, 0x0e, 0xaa, 0x3e, 0xc1, 0x84, 0xfb, 0xbe, 0x00, 0x42, 0x9a, 0xbf, 0x3a, 0x58, 0x9c, 0x3e, 0xab, 0x84, 0xfb, 0x3e, 0x00, 0x42, 0x9a, 0xbf, 0x3c, 0x58, + 0x9c, 0x3e, 0xc2, 0x3a, 0xe5, 0x3e, 0xe0, 0x27, 0xac, 0xbf, 0xc6, 0x0e, 0xaa, 0x3e, 0x99, 0x1b, 0xfc, 0xbe, 0xee, 0x3c, 0xa9, 0xbf, 0x7d, 0xd3, 0xbf, 0x3e, + 0x80, 0x1b, 0xfc, 0x3e, 0xee, 0x3c, 0xa9, 0xbf, 0x7f, 0xd3, 0xbf, 0x3e, 0x63, 0xd9, 0x6b, 0xbe, 0x63, 0x85, 0xd9, 0xbf, 0x09, 0x6c, 0xb4, 0x3e, 0xfa, 0x33, + 0x4a, 0xbe, 0x2d, 0xcd, 0xd9, 0xbf, 0x7b, 0xdc, 0xb4, 0x3e, 0xe1, 0x93, 0x5b, 0xbe, 0xa9, 0x40, 0xc9, 0xbf, 0xc8, 0xe4, 0x94, 0x3e, 0xa6, 0x93, 0x5b, 0x3e, + 0xa9, 0x40, 0xc9, 0xbf, 0xc8, 0xe4, 0x94, 0x3e, 0xbb, 0x33, 0x4a, 0x3e, 0x2d, 0xcd, 0xd9, 0xbf, 0x7b, 0xdc, 0xb4, 0x3e, 0x21, 0xd9, 0x6b, 0x3e, 0x63, 0x85, + 0xd9, 0xbf, 0x0a, 0x6c, 0xb4, 0x3e, 0x7c, 0xe8, 0x03, 0xbf, 0x13, 0x0a, 0xcf, 0xbf, 0x54, 0xfb, 0xff, 0x3e, 0xaf, 0x6e, 0xea, 0xbe, 0x74, 0x58, 0xd3, 0xbf, + 0x96, 0x0d, 0xdf, 0x3e, 0x90, 0x6e, 0xea, 0x3e, 0x74, 0x58, 0xd3, 0xbf, 0x98, 0x0d, 0xdf, 0x3e, 0x6c, 0xe8, 0x03, 0x3f, 0x13, 0x0a, 0xcf, 0xbf, 0x56, 0xfb, + 0xff, 0x3e, 0x14, 0x72, 0xad, 0xbe, 0xc9, 0xd0, 0xc2, 0xbf, 0x07, 0xf4, 0xa4, 0x3e, 0x27, 0xa4, 0x91, 0xbe, 0xe4, 0x87, 0xd9, 0xbf, 0x2a, 0xd6, 0xaa, 0x3e, + 0x09, 0xa4, 0x91, 0x3e, 0xe4, 0x87, 0xd9, 0xbf, 0x2b, 0xd6, 0xaa, 0x3e, 0xf8, 0x71, 0xad, 0x3e, 0xc9, 0xd0, 0xc2, 0xbf, 0x08, 0xf4, 0xa4, 0x3e, 0x75, 0x16, + 0x0c, 0xbf, 0xfb, 0x9f, 0x89, 0xbf, 0x59, 0x84, 0x8b, 0x3f, 0x20, 0xdd, 0x1f, 0xbf, 0x78, 0xac, 0x95, 0xbf, 0x26, 0xdf, 0x94, 0x3f, 0xee, 0x5b, 0x2b, 0xbf, + 0x0a, 0xd4, 0x9f, 0xbf, 0xb8, 0xd8, 0x83, 0x3f, 0x24, 0xe1, 0x1c, 0xbf, 0xea, 0x8b, 0x90, 0xbf, 0xbe, 0x17, 0x7b, 0x3f, 0x16, 0xe1, 0x1c, 0x3f, 0xea, 0x8b, + 0x90, 0xbf, 0xbe, 0x17, 0x7b, 0x3f, 0xbc, 0xb8, 0x2b, 0x3f, 0xea, 0xc9, 0x9f, 0xbf, 0x1e, 0xf6, 0x83, 0x3f, 0x6d, 0x58, 0x20, 0x3f, 0xe2, 0xa0, 0x95, 0xbf, + 0xcd, 0x00, 0x95, 0x3f, 0x68, 0x16, 0x0c, 0x3f, 0xfa, 0x9f, 0x89, 0xbf, 0x5a, 0x84, 0x8b, 0x3f, 0x2f, 0xea, 0xdf, 0xbe, 0x5e, 0xf9, 0x85, 0xbf, 0x2f, 0xe5, + 0x93, 0x3f, 0x77, 0x89, 0x00, 0xbf, 0xfc, 0x1c, 0x93, 0xbf, 0xdc, 0xcf, 0x9f, 0x3f, 0x5c, 0x16, 0x01, 0x3f, 0x66, 0x0d, 0x93, 0xbf, 0x20, 0xfd, 0x9f, 0x3f, + 0x12, 0xea, 0xdf, 0x3e, 0x5e, 0xf9, 0x85, 0xbf, 0x31, 0xe5, 0x93, 0x3f, 0x1c, 0xb9, 0x1c, 0xbe, 0x3d, 0xb1, 0xcf, 0xbf, 0x30, 0x63, 0x8b, 0x3e, 0x7e, 0x2e, + 0x0e, 0xbe, 0x85, 0x26, 0xdc, 0xbf, 0x52, 0x22, 0xaf, 0x3e, 0x3f, 0x2e, 0x0e, 0x3e, 0x85, 0x26, 0xdc, 0xbf, 0x52, 0x22, 0xaf, 0x3e, 0xe3, 0xb8, 0x1c, 0x3e, + 0x3d, 0xb1, 0xcf, 0xbf, 0x30, 0x63, 0x8b, 0x3e, 0x67, 0xaa, 0x13, 0xbf, 0x48, 0x4a, 0xad, 0xbf, 0x9a, 0xdb, 0x20, 0x3f, 0xe8, 0xba, 0x18, 0xbf, 0x9b, 0x09, + 0xc3, 0xbf, 0xbc, 0x8f, 0x2e, 0x3f, 0x55, 0x46, 0x10, 0xbf, 0x8c, 0xa7, 0xc9, 0xbf, 0x42, 0x8b, 0x13, 0x3f, 0x1b, 0xe2, 0x0e, 0xbf, 0x7d, 0xa7, 0xb4, 0xbf, + 0x64, 0xe9, 0x06, 0x3f, 0x0d, 0xe2, 0x0e, 0x3f, 0x7d, 0xa7, 0xb4, 0xbf, 0x65, 0xe9, 0x06, 0x3f, 0x44, 0x46, 0x10, 0x3f, 0x8c, 0xa7, 0xc9, 0xbf, 0x44, 0x8b, + 0x13, 0x3f, 0xd8, 0xba, 0x18, 0x3f, 0x9b, 0x09, 0xc3, 0xbf, 0xbe, 0x8f, 0x2e, 0x3f, 0x58, 0xaa, 0x13, 0x3f, 0x48, 0x4a, 0xad, 0xbf, 0x9b, 0xdb, 0x20, 0x3f, + 0x0b, 0xd9, 0xcc, 0xbe, 0xf2, 0x4a, 0xc1, 0xbf, 0x79, 0x24, 0xb2, 0x3e, 0xab, 0x41, 0xb1, 0xbe, 0xe4, 0x4d, 0xd8, 0xbf, 0xf8, 0x80, 0xb5, 0x3e, 0x8c, 0x41, + 0xb1, 0x3e, 0xe4, 0x4d, 0xd8, 0xbf, 0xfb, 0x80, 0xb5, 0x3e, 0xf1, 0xd8, 0xcc, 0x3e, 0xf2, 0x4a, 0xc1, 0xbf, 0x79, 0x24, 0xb2, 0x3e, 0xac, 0x51, 0x2e, 0xbf, + 0x72, 0x2d, 0xa6, 0xbf, 0xf1, 0xca, 0x73, 0x3f, 0x15, 0xba, 0x24, 0xbf, 0x96, 0x4f, 0x97, 0xbf, 0x84, 0x66, 0x65, 0x3f, 0x07, 0xba, 0x24, 0x3f, 0x96, 0x4f, + 0x97, 0xbf, 0x84, 0x66, 0x65, 0x3f, 0x75, 0x9c, 0x2e, 0x3f, 0xb2, 0x23, 0xa6, 0xbf, 0x93, 0x03, 0x74, 0x3f, 0xa8, 0xde, 0x92, 0xbe, 0xa8, 0xa2, 0x92, 0xbf, + 0xc7, 0xf8, 0xa3, 0x3f, 0xfc, 0x40, 0x76, 0xbe, 0x00, 0x2f, 0x84, 0xbf, 0x3c, 0x7d, 0x98, 0x3f, 0xc0, 0x40, 0x76, 0x3e, 0xff, 0x2e, 0x84, 0xbf, 0x3e, 0x7d, + 0x98, 0x3f, 0x88, 0xde, 0x92, 0x3e, 0xa7, 0xa2, 0x92, 0xbf, 0xc8, 0xf8, 0xa3, 0x3f, 0x41, 0x33, 0x19, 0xbf, 0x10, 0x4b, 0xa4, 0xbf, 0x65, 0x61, 0x3f, 0x3f, + 0xf0, 0xb3, 0x20, 0xbf, 0xf4, 0x29, 0xb9, 0xbf, 0x53, 0xf0, 0x4d, 0x3f, 0xe1, 0xb3, 0x20, 0x3f, 0xf4, 0x29, 0xb9, 0xbf, 0x54, 0xf0, 0x4d, 0x3f, 0x30, 0x33, + 0x19, 0x3f, 0x10, 0x4b, 0xa4, 0xbf, 0x67, 0x61, 0x3f, 0x3f, 0xee, 0x12, 0x28, 0xbf, 0xd6, 0x61, 0xb1, 0xbf, 0x92, 0x60, 0x5f, 0x3f, 0x74, 0xdb, 0x1d, 0xbf, + 0x55, 0xe1, 0x9e, 0xbf, 0xcf, 0x97, 0x4f, 0x3f, 0x67, 0xdb, 0x1d, 0x3f, 0x55, 0xe1, 0x9e, 0xbf, 0xd1, 0x97, 0x4f, 0x3f, 0xe0, 0x12, 0x28, 0x3f, 0xd6, 0x61, + 0xb1, 0xbf, 0x92, 0x60, 0x5f, 0x3f, 0xf6, 0x5a, 0xe5, 0xbe, 0x29, 0xc9, 0xbe, 0xbf, 0xe1, 0x5e, 0xc8, 0x3e, 0x7d, 0x41, 0xcb, 0xbe, 0x81, 0xe9, 0xd6, 0xbf, + 0x31, 0x4c, 0xca, 0x3e, 0x5d, 0x41, 0xcb, 0x3e, 0x81, 0xe9, 0xd6, 0xbf, 0x32, 0x4c, 0xca, 0x3e, 0xd9, 0x5a, 0xe5, 0x3e, 0x28, 0xc9, 0xbe, 0xbf, 0xe3, 0x5e, + 0xc8, 0x3e, 0x81, 0x51, 0x12, 0xbe, 0x4c, 0xda, 0xc5, 0xbf, 0x28, 0x48, 0x48, 0x3e, 0x49, 0x51, 0x12, 0x3e, 0x4c, 0xda, 0xc5, 0xbf, 0x2a, 0x48, 0x48, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1a, 0x00, + 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x24, 0x00, + 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, + 0x29, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2b, 0x00, + 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, + 0x2d, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x29, 0x00, + 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, + 0x33, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x35, 0x00, + 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, + 0x36, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x34, 0x00, + 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x41, 0x00, + 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x4e, 0x00, + 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, + 0x54, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x5a, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, + 0x5e, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x64, 0x00, + 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, + 0x6a, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x6e, 0x00, + 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, + 0x5d, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x76, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x6c, 0x00, + 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x82, 0x00, + 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, + 0x88, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, + 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, + 0x92, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x97, 0x00, + 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, + 0x9a, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x94, 0x00, + 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, + 0xa2, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xa4, 0x00, + 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, + 0xa8, 0x00, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0xae, 0x00, + 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, + 0xb3, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x00, 0x00, 0xb3, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xaa, 0x00, + 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, + 0xbc, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0xc2, 0x00, + 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, + 0xc7, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xcb, 0x00, + 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, + 0xcd, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, 0xd2, 0x00, + 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, + 0xd8, 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0xdc, 0x00, + 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, + 0xe1, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0xe2, 0x00, + 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xe5, 0x00, 0x00, 0x00, 0xe6, 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, + 0xe9, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0xee, 0x00, + 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0xf3, 0x00, 0x00, 0x00, + 0xf4, 0x00, 0x00, 0x00, 0xf5, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf3, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, 0xf5, 0x00, + 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, + 0x5d, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x5d, 0x00, + 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0xfa, 0x00, + 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x58, 0x00, + 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, 0x0d, 0x01, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x0e, 0x01, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x12, 0x01, 0x00, 0x00, 0x13, 0x01, + 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0x12, 0x01, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00, 0x16, 0x01, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, + 0xfd, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x19, 0x01, 0x00, 0x00, 0x1a, 0x01, 0x00, 0x00, 0x1b, 0x01, 0x00, 0x00, 0x1a, 0x01, + 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x1b, 0x01, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x1d, 0x01, 0x00, 0x00, 0x1b, 0x01, 0x00, 0x00, 0x1d, 0x01, 0x00, 0x00, + 0x1e, 0x01, 0x00, 0x00, 0x1b, 0x01, 0x00, 0x00, 0x1b, 0x01, 0x00, 0x00, 0x1f, 0x01, 0x00, 0x00, 0x19, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x21, 0x01, + 0x00, 0x00, 0x22, 0x01, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x23, 0x01, 0x00, 0x00, 0x22, 0x01, 0x00, 0x00, 0x23, 0x01, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, + 0x22, 0x01, 0x00, 0x00, 0x22, 0x01, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, 0x25, 0x01, 0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0x27, 0x01, 0x00, 0x00, 0x28, 0x01, + 0x00, 0x00, 0x29, 0x01, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00, 0x2a, 0x01, 0x00, 0x00, 0x27, 0x01, 0x00, 0x00, 0x2a, 0x01, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00, + 0x2b, 0x01, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x2d, 0x01, 0x00, 0x00, 0x2e, 0x01, 0x00, 0x00, 0x2f, 0x01, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0x2f, 0x01, + 0x00, 0x00, 0x2e, 0x01, 0x00, 0x00, 0x31, 0x01, 0x00, 0x00, 0x2f, 0x01, 0x00, 0x00, 0x32, 0x01, 0x00, 0x00, 0x33, 0x01, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, + 0x35, 0x01, 0x00, 0x00, 0x36, 0x01, 0x00, 0x00, 0x13, 0x01, 0x00, 0x00, 0x37, 0x01, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, 0x39, 0x01, + 0x00, 0x00, 0x3a, 0x01, 0x00, 0x00, 0x3a, 0x01, 0x00, 0x00, 0x39, 0x01, 0x00, 0x00, 0x3b, 0x01, 0x00, 0x00, 0x3b, 0x01, 0x00, 0x00, 0x39, 0x01, 0x00, 0x00, + 0x3c, 0x01, 0x00, 0x00, 0x3d, 0x01, 0x00, 0x00, 0x3e, 0x01, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x41, 0x01, 0x00, 0x00, 0x42, 0x01, + 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x43, 0x01, 0x00, 0x00, 0x0d, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x16, 0x01, 0x00, 0x00, + 0x0a, 0x01, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, 0x36, 0x01, 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, 0x46, 0x01, 0x00, 0x00, 0x47, 0x01, + 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x43, 0x01, 0x00, 0x00, 0x31, 0x01, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, + 0x43, 0x01, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x31, 0x01, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x00, 0x32, 0x01, 0x00, 0x00, 0x47, 0x01, + 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x4b, 0x01, 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0x4e, 0x01, 0x00, 0x00, 0x4f, 0x01, 0x00, 0x00, + 0x59, 0x00, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x51, 0x01, 0x00, 0x00, 0x4f, 0x01, 0x00, 0x00, 0x4f, 0x01, 0x00, 0x00, 0x51, 0x01, 0x00, 0x00, 0x59, 0x00, + 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x51, 0x01, 0x00, 0x00, 0x52, 0x01, 0x00, 0x00, 0x53, 0x01, 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, + 0x55, 0x01, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x57, 0x01, 0x00, 0x00, 0x58, 0x01, 0x00, 0x00, 0x59, 0x01, 0x00, 0x00, 0x5a, 0x01, 0x00, 0x00, 0x59, 0x01, + 0x00, 0x00, 0x5b, 0x01, 0x00, 0x00, 0x5a, 0x01, 0x00, 0x00, 0x5a, 0x01, 0x00, 0x00, 0x5b, 0x01, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x5d, 0x01, 0x00, 0x00, + 0x5e, 0x01, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x61, 0x01, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, 0x63, 0x01, + 0x00, 0x00, 0x64, 0x01, 0x00, 0x00, 0x65, 0x01, 0x00, 0x00, 0x5d, 0x01, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x66, 0x01, 0x00, 0x00, 0x65, 0x01, 0x00, 0x00, + 0x67, 0x01, 0x00, 0x00, 0x5d, 0x01, 0x00, 0x00, 0x65, 0x01, 0x00, 0x00, 0x66, 0x01, 0x00, 0x00, 0x65, 0x01, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x67, 0x01, + 0x00, 0x00, 0x67, 0x01, 0x00, 0x00, 0x69, 0x01, 0x00, 0x00, 0x6a, 0x01, 0x00, 0x00, 0x6b, 0x01, 0x00, 0x00, 0x6c, 0x01, 0x00, 0x00, 0x6d, 0x01, 0x00, 0x00, + 0x6e, 0x01, 0x00, 0x00, 0x6f, 0x01, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x71, 0x01, 0x00, 0x00, 0x6c, 0x01, 0x00, 0x00, 0x6f, 0x01, 0x00, 0x00, 0x6c, 0x01, + 0x00, 0x00, 0x71, 0x01, 0x00, 0x00, 0x6d, 0x01, 0x00, 0x00, 0x72, 0x01, 0x00, 0x00, 0x73, 0x01, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0x69, 0x01, 0x00, 0x00, + 0x67, 0x01, 0x00, 0x00, 0x75, 0x01, 0x00, 0x00, 0x6e, 0x01, 0x00, 0x00, 0x76, 0x01, 0x00, 0x00, 0x6f, 0x01, 0x00, 0x00, 0x77, 0x01, 0x00, 0x00, 0x78, 0x01, + 0x00, 0x00, 0x79, 0x01, 0x00, 0x00, 0x7a, 0x01, 0x00, 0x00, 0x7b, 0x01, 0x00, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x7d, 0x01, 0x00, 0x00, 0x7a, 0x01, 0x00, 0x00, + 0x68, 0x01, 0x00, 0x00, 0x7e, 0x01, 0x00, 0x00, 0x6f, 0x01, 0x00, 0x00, 0x7f, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x81, 0x01, 0x00, 0x00, 0x82, 0x01, + 0x00, 0x00, 0x83, 0x01, 0x00, 0x00, 0x84, 0x01, 0x00, 0x00, 0x85, 0x01, 0x00, 0x00, 0x86, 0x01, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x87, 0x01, 0x00, 0x00, + 0x51, 0x01, 0x00, 0x00, 0x87, 0x01, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x87, 0x01, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x88, 0x01, + 0x00, 0x00, 0x89, 0x01, 0x00, 0x00, 0x8a, 0x01, 0x00, 0x00, 0x8b, 0x01, 0x00, 0x00, 0x8c, 0x01, 0x00, 0x00, 0x8d, 0x01, 0x00, 0x00, 0x72, 0x01, 0x00, 0x00, + 0x8e, 0x01, 0x00, 0x00, 0x8f, 0x01, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x91, 0x01, 0x00, 0x00, 0x92, 0x01, 0x00, 0x00, 0x93, 0x01, 0x00, 0x00, 0x94, 0x01, + 0x00, 0x00, 0x95, 0x01, 0x00, 0x00, 0x29, 0x01, 0x00, 0x00, 0x2a, 0x01, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0x2a, 0x01, 0x00, 0x00, + 0x95, 0x01, 0x00, 0x00, 0x96, 0x01, 0x00, 0x00, 0x3e, 0x01, 0x00, 0x00, 0x3d, 0x01, 0x00, 0x00, 0x97, 0x01, 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0x99, 0x01, + 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0x9a, 0x01, 0x00, 0x00, 0x9b, 0x01, 0x00, 0x00, 0x9b, 0x01, 0x00, 0x00, 0x9a, 0x01, 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00, + 0x9a, 0x01, 0x00, 0x00, 0x9d, 0x01, 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00, 0x9e, 0x01, 0x00, 0x00, 0x9b, 0x01, 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00, 0x9f, 0x01, + 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0xa1, 0x01, 0x00, 0x00, 0xa2, 0x01, 0x00, 0x00, 0xa3, 0x01, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x00, 0xa5, 0x01, 0x00, 0x00, + 0xa6, 0x01, 0x00, 0x00, 0xa7, 0x01, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x00, 0xa9, 0x01, 0x00, 0x00, 0xaa, 0x01, 0x00, 0x00, 0xab, 0x01, 0x00, 0x00, 0xa9, 0x01, + 0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 0xa9, 0x01, 0x00, 0x00, 0xad, 0x01, 0x00, 0x00, 0xa9, 0x01, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x00, + 0xad, 0x01, 0x00, 0x00, 0xad, 0x01, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x00, 0xae, 0x01, 0x00, 0x00, 0xaf, 0x01, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0xb1, 0x01, + 0x00, 0x00, 0xb2, 0x01, 0x00, 0x00, 0xb3, 0x01, 0x00, 0x00, 0xaf, 0x01, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, 0xb5, 0x01, 0x00, 0x00, 0xb6, 0x01, 0x00, 0x00, + 0xb1, 0x01, 0x00, 0x00, 0xb6, 0x01, 0x00, 0x00, 0xb5, 0x01, 0x00, 0x00, 0xad, 0x01, 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 0xb7, 0x01, + 0x00, 0x00, 0xb8, 0x01, 0x00, 0x00, 0xb9, 0x01, 0x00, 0x00, 0xba, 0x01, 0x00, 0x00, 0xaa, 0x01, 0x00, 0x00, 0xbb, 0x01, 0x00, 0x00, 0xbc, 0x01, 0x00, 0x00, + 0xbd, 0x01, 0x00, 0x00, 0xb1, 0x01, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0xbe, 0x01, 0x00, 0x00, 0xbf, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc1, 0x01, + 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0xc3, 0x01, 0x00, 0x00, 0xc4, 0x01, 0x00, 0x00, 0xc5, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, + 0xc6, 0x01, 0x00, 0x00, 0xc7, 0x01, 0x00, 0x00, 0xc6, 0x01, 0x00, 0x00, 0xc8, 0x01, 0x00, 0x00, 0xc9, 0x01, 0x00, 0x00, 0xca, 0x01, 0x00, 0x00, 0xcb, 0x01, + 0x00, 0x00, 0xcc, 0x01, 0x00, 0x00, 0xcb, 0x01, 0x00, 0x00, 0xcd, 0x01, 0x00, 0x00, 0xce, 0x01, 0x00, 0x00, 0xcf, 0x01, 0x00, 0x00, 0xd0, 0x01, 0x00, 0x00, + 0x91, 0x01, 0x00, 0x00, 0xbf, 0x01, 0x00, 0x00, 0xd1, 0x01, 0x00, 0x00, 0x91, 0x01, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0xbf, 0x01, 0x00, 0x00, 0xd2, 0x01, + 0x00, 0x00, 0xd3, 0x01, 0x00, 0x00, 0xd4, 0x01, 0x00, 0x00, 0xd4, 0x01, 0x00, 0x00, 0xd3, 0x01, 0x00, 0x00, 0xd5, 0x01, 0x00, 0x00, 0xd3, 0x01, 0x00, 0x00, + 0xd6, 0x01, 0x00, 0x00, 0xd5, 0x01, 0x00, 0x00, 0xd5, 0x01, 0x00, 0x00, 0xd6, 0x01, 0x00, 0x00, 0xd7, 0x01, 0x00, 0x00, 0xd7, 0x01, 0x00, 0x00, 0xd6, 0x01, + 0x00, 0x00, 0xd8, 0x01, 0x00, 0x00, 0xd6, 0x01, 0x00, 0x00, 0xd9, 0x01, 0x00, 0x00, 0xd8, 0x01, 0x00, 0x00, 0xd8, 0x01, 0x00, 0x00, 0xd9, 0x01, 0x00, 0x00, + 0xda, 0x01, 0x00, 0x00, 0xda, 0x01, 0x00, 0x00, 0xd9, 0x01, 0x00, 0x00, 0xdb, 0x01, 0x00, 0x00, 0xdb, 0x01, 0x00, 0x00, 0xd9, 0x01, 0x00, 0x00, 0xdc, 0x01, + 0x00, 0x00, 0xdc, 0x01, 0x00, 0x00, 0xd9, 0x01, 0x00, 0x00, 0xdd, 0x01, 0x00, 0x00, 0xdd, 0x01, 0x00, 0x00, 0xd9, 0x01, 0x00, 0x00, 0xde, 0x01, 0x00, 0x00, + 0xde, 0x01, 0x00, 0x00, 0xd9, 0x01, 0x00, 0x00, 0xdf, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe1, 0x01, 0x00, 0x00, 0xe2, 0x01, 0x00, 0x00, 0xe3, 0x01, + 0x00, 0x00, 0xe4, 0x01, 0x00, 0x00, 0xe5, 0x01, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0xe6, 0x01, 0x00, 0x00, 0xe7, 0x01, 0x00, 0x00, 0xe8, 0x01, 0x00, 0x00, + 0xe9, 0x01, 0x00, 0x00, 0xea, 0x01, 0x00, 0x00, 0xe4, 0x01, 0x00, 0x00, 0xe3, 0x01, 0x00, 0x00, 0xeb, 0x01, 0x00, 0x00, 0xec, 0x01, 0x00, 0x00, 0xed, 0x01, + 0x00, 0x00, 0xee, 0x01, 0x00, 0x00, 0xef, 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf1, 0x01, 0x00, 0x00, 0xf2, 0x01, 0x00, 0x00, 0xf3, 0x01, 0x00, 0x00, + 0xf4, 0x01, 0x00, 0x00, 0xf5, 0x01, 0x00, 0x00, 0xf6, 0x01, 0x00, 0x00, 0xf7, 0x01, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0xf9, 0x01, 0x00, 0x00, 0xfa, 0x01, + 0x00, 0x00, 0xfb, 0x01, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0xfd, 0x01, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xf3, 0x01, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x05, 0x02, + 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x09, 0x02, 0x00, 0x00, 0x0a, 0x02, 0x00, 0x00, 0x0b, 0x02, 0x00, 0x00, + 0x0c, 0x02, 0x00, 0x00, 0x0d, 0x02, 0x00, 0x00, 0x0e, 0x02, 0x00, 0x00, 0xf2, 0x01, 0x00, 0x00, 0x0f, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x11, 0x02, + 0x00, 0x00, 0x12, 0x02, 0x00, 0x00, 0x13, 0x02, 0x00, 0x00, 0x14, 0x02, 0x00, 0x00, 0x15, 0x02, 0x00, 0x00, 0x13, 0x02, 0x00, 0x00, 0x15, 0x02, 0x00, 0x00, + 0x16, 0x02, 0x00, 0x00, 0x17, 0x02, 0x00, 0x00, 0x16, 0x02, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0x17, 0x02, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0x19, 0x02, + 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0x1a, 0x02, 0x00, 0x00, 0x0b, 0x02, 0x00, 0x00, 0x1b, 0x02, 0x00, 0x00, 0x1c, 0x02, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, + 0x1d, 0x02, 0x00, 0x00, 0x1e, 0x02, 0x00, 0x00, 0x1f, 0x02, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, 0x22, 0x02, 0x00, 0x00, 0x23, 0x02, + 0x00, 0x00, 0x24, 0x02, 0x00, 0x00, 0xef, 0x01, 0x00, 0x00, 0xeb, 0x01, 0x00, 0x00, 0x25, 0x02, 0x00, 0x00, 0xe4, 0x01, 0x00, 0x00, 0x26, 0x02, 0x00, 0x00, + 0x27, 0x02, 0x00, 0x00, 0x28, 0x02, 0x00, 0x00, 0x29, 0x02, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x2b, 0x02, 0x00, 0x00, 0x2c, 0x02, 0x00, 0x00, 0x2d, 0x02, + 0x00, 0x00, 0xec, 0x01, 0x00, 0x00, 0x2d, 0x02, 0x00, 0x00, 0x2e, 0x02, 0x00, 0x00, 0xec, 0x01, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0x0b, 0x02, 0x00, 0x00, + 0xd0, 0x00, 0x00, 0x00, 0x0d, 0x02, 0x00, 0x00, 0x2f, 0x02, 0x00, 0x00, 0x0b, 0x02, 0x00, 0x00, 0x0b, 0x02, 0x00, 0x00, 0x2f, 0x02, 0x00, 0x00, 0xd0, 0x00, + 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x2f, 0x02, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0x2f, 0x02, 0x00, 0x00, 0x13, 0x02, 0x00, 0x00, 0x30, 0x02, 0x00, 0x00, + 0x16, 0x02, 0x00, 0x00, 0x17, 0x02, 0x00, 0x00, 0x13, 0x02, 0x00, 0x00, 0x30, 0x02, 0x00, 0x00, 0x13, 0x02, 0x00, 0x00, 0x17, 0x02, 0x00, 0x00, 0x31, 0x02, + 0x00, 0x00, 0x32, 0x02, 0x00, 0x00, 0x33, 0x02, 0x00, 0x00, 0x34, 0x02, 0x00, 0x00, 0x32, 0x02, 0x00, 0x00, 0x35, 0x02, 0x00, 0x00, 0x32, 0x02, 0x00, 0x00, + 0x31, 0x02, 0x00, 0x00, 0x35, 0x02, 0x00, 0x00, 0x31, 0x02, 0x00, 0x00, 0x36, 0x02, 0x00, 0x00, 0x35, 0x02, 0x00, 0x00, 0x37, 0x02, 0x00, 0x00, 0x31, 0x02, + 0x00, 0x00, 0x38, 0x02, 0x00, 0x00, 0x39, 0x02, 0x00, 0x00, 0x3a, 0x02, 0x00, 0x00, 0x3b, 0x02, 0x00, 0x00, 0x3c, 0x02, 0x00, 0x00, 0x3d, 0x02, 0x00, 0x00, + 0x3e, 0x02, 0x00, 0x00, 0x3e, 0x02, 0x00, 0x00, 0x3f, 0x02, 0x00, 0x00, 0x3c, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x41, 0x02, 0x00, 0x00, 0x42, 0x02, + 0x00, 0x00, 0x42, 0x02, 0x00, 0x00, 0x43, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x44, 0x02, 0x00, 0x00, 0x45, 0x02, 0x00, 0x00, 0x46, 0x02, 0x00, 0x00, + 0x46, 0x02, 0x00, 0x00, 0x45, 0x02, 0x00, 0x00, 0x47, 0x02, 0x00, 0x00, 0x47, 0x02, 0x00, 0x00, 0x45, 0x02, 0x00, 0x00, 0x48, 0x02, 0x00, 0x00, 0x49, 0x02, + 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x4a, 0x02, 0x00, 0x00, 0x4b, 0x02, 0x00, 0x00, 0x4c, 0x02, 0x00, 0x00, 0x4d, 0x02, 0x00, 0x00, 0x4e, 0x02, 0x00, 0x00, + 0x4f, 0x02, 0x00, 0x00, 0x50, 0x02, 0x00, 0x00, 0x51, 0x02, 0x00, 0x00, 0x52, 0x02, 0x00, 0x00, 0x53, 0x02, 0x00, 0x00, 0x53, 0x02, 0x00, 0x00, 0x54, 0x02, + 0x00, 0x00, 0x51, 0x02, 0x00, 0x00, 0x55, 0x02, 0x00, 0x00, 0x56, 0x02, 0x00, 0x00, 0x57, 0x02, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x59, 0x02, 0x00, 0x00, + 0x5a, 0x02, 0x00, 0x00, 0x59, 0x02, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x5b, 0x02, 0x00, 0x00, 0x57, 0x02, 0x00, 0x00, 0x5a, 0x02, 0x00, 0x00, 0x59, 0x02, + 0x00, 0x00, 0x5c, 0x02, 0x00, 0x00, 0x5d, 0x02, 0x00, 0x00, 0x5e, 0x02, 0x00, 0x00, 0x5f, 0x02, 0x00, 0x00, 0x60, 0x02, 0x00, 0x00, 0x61, 0x02, 0x00, 0x00, + 0x86, 0x00, 0x00, 0x00, 0x62, 0x02, 0x00, 0x00, 0x60, 0x02, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x62, 0x02, 0x00, 0x00, 0x45, 0x02, + 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x63, 0x02, 0x00, 0x00, 0x64, 0x02, 0x00, 0x00, 0x65, 0x02, 0x00, 0x00, 0x66, 0x02, 0x00, 0x00, + 0x67, 0x02, 0x00, 0x00, 0x64, 0x02, 0x00, 0x00, 0x68, 0x02, 0x00, 0x00, 0x67, 0x02, 0x00, 0x00, 0x69, 0x02, 0x00, 0x00, 0x6a, 0x02, 0x00, 0x00, 0x99, 0x00, + 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x60, 0x02, 0x00, 0x00, 0x45, 0x02, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x48, 0x02, 0x00, 0x00, 0x47, 0x02, 0x00, 0x00, 0x48, 0x02, 0x00, 0x00, 0x6c, 0x02, 0x00, 0x00, 0x6d, 0x02, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x6e, 0x02, + 0x00, 0x00, 0x6f, 0x02, 0x00, 0x00, 0x70, 0x02, 0x00, 0x00, 0x71, 0x02, 0x00, 0x00, 0x72, 0x02, 0x00, 0x00, 0x65, 0x02, 0x00, 0x00, 0x73, 0x02, 0x00, 0x00, + 0x74, 0x02, 0x00, 0x00, 0x72, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, 0x76, 0x02, 0x00, 0x00, 0x77, 0x02, 0x00, 0x00, 0x78, 0x02, 0x00, 0x00, 0x79, 0x02, + 0x00, 0x00, 0x77, 0x02, 0x00, 0x00, 0x7a, 0x02, 0x00, 0x00, 0x7b, 0x02, 0x00, 0x00, 0x7a, 0x02, 0x00, 0x00, 0x7c, 0x02, 0x00, 0x00, 0x7d, 0x02, 0x00, 0x00, + 0x60, 0x02, 0x00, 0x00, 0x5f, 0x02, 0x00, 0x00, 0x7e, 0x02, 0x00, 0x00, 0x7f, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x7f, 0x02, + 0x00, 0x00, 0x81, 0x02, 0x00, 0x00, 0x81, 0x02, 0x00, 0x00, 0x7f, 0x02, 0x00, 0x00, 0x82, 0x02, 0x00, 0x00, 0x7f, 0x02, 0x00, 0x00, 0x83, 0x02, 0x00, 0x00, + 0x82, 0x02, 0x00, 0x00, 0x7e, 0x02, 0x00, 0x00, 0x84, 0x02, 0x00, 0x00, 0x7f, 0x02, 0x00, 0x00, 0x85, 0x02, 0x00, 0x00, 0x86, 0x02, 0x00, 0x00, 0x87, 0x02, + 0x00, 0x00, 0x87, 0x02, 0x00, 0x00, 0x86, 0x02, 0x00, 0x00, 0x88, 0x02, 0x00, 0x00, 0x88, 0x02, 0x00, 0x00, 0x86, 0x02, 0x00, 0x00, 0x89, 0x02, 0x00, 0x00, + 0x8a, 0x02, 0x00, 0x00, 0x89, 0x02, 0x00, 0x00, 0x86, 0x02, 0x00, 0x00, 0x8b, 0x02, 0x00, 0x00, 0x8c, 0x02, 0x00, 0x00, 0x8d, 0x02, 0x00, 0x00, 0x8e, 0x02, + 0x00, 0x00, 0x8f, 0x02, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, 0x91, 0x02, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, 0x8f, 0x02, 0x00, 0x00, 0x92, 0x02, 0x00, 0x00, + 0x93, 0x02, 0x00, 0x00, 0x8f, 0x02, 0x00, 0x00, 0x94, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x96, 0x02, 0x00, 0x00, 0x78, 0x02, 0x00, 0x00, 0x97, 0x02, + 0x00, 0x00, 0x76, 0x02, 0x00, 0x00, 0x98, 0x02, 0x00, 0x00, 0x99, 0x02, 0x00, 0x00, 0x9a, 0x02, 0x00, 0x00, 0x99, 0x02, 0x00, 0x00, 0x9b, 0x02, 0x00, 0x00, + 0x9a, 0x02, 0x00, 0x00, 0x9c, 0x02, 0x00, 0x00, 0x9a, 0x02, 0x00, 0x00, 0x9b, 0x02, 0x00, 0x00, 0x9d, 0x02, 0x00, 0x00, 0x9e, 0x02, 0x00, 0x00, 0x9f, 0x02, + 0x00, 0x00, 0xa0, 0x02, 0x00, 0x00, 0x9d, 0x02, 0x00, 0x00, 0x9f, 0x02, 0x00, 0x00, 0x7c, 0x02, 0x00, 0x00, 0xa1, 0x02, 0x00, 0x00, 0x73, 0x02, 0x00, 0x00, + 0x7b, 0x02, 0x00, 0x00, 0x65, 0x02, 0x00, 0x00, 0x71, 0x02, 0x00, 0x00, 0xa2, 0x02, 0x00, 0x00, 0xa3, 0x02, 0x00, 0x00, 0x94, 0x02, 0x00, 0x00, 0xa0, 0x02, + 0x00, 0x00, 0xa4, 0x02, 0x00, 0x00, 0xa5, 0x02, 0x00, 0x00, 0xa5, 0x02, 0x00, 0x00, 0xa4, 0x02, 0x00, 0x00, 0x91, 0x02, 0x00, 0x00, 0xa6, 0x02, 0x00, 0x00, + 0xa0, 0x02, 0x00, 0x00, 0xa5, 0x02, 0x00, 0x00, 0xa7, 0x02, 0x00, 0x00, 0x91, 0x02, 0x00, 0x00, 0xa4, 0x02, 0x00, 0x00, 0xa6, 0x02, 0x00, 0x00, 0xa5, 0x02, + 0x00, 0x00, 0x93, 0x02, 0x00, 0x00, 0xa8, 0x02, 0x00, 0x00, 0xa9, 0x02, 0x00, 0x00, 0xaa, 0x02, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0xab, 0x02, 0x00, 0x00, + 0xac, 0x02, 0x00, 0x00, 0xad, 0x02, 0x00, 0x00, 0xab, 0x02, 0x00, 0x00, 0xae, 0x02, 0x00, 0x00, 0xab, 0x02, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0xae, 0x02, + 0x00, 0x00, 0xae, 0x02, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0xaf, 0x02, 0x00, 0x00, 0xb0, 0x02, 0x00, 0x00, 0xb1, 0x02, 0x00, 0x00, + 0xb2, 0x02, 0x00, 0x00, 0xb3, 0x02, 0x00, 0x00, 0xb4, 0x02, 0x00, 0x00, 0xb5, 0x02, 0x00, 0x00, 0xb6, 0x02, 0x00, 0x00, 0xb7, 0x02, 0x00, 0x00, 0xb7, 0x02, + 0x00, 0x00, 0xb6, 0x02, 0x00, 0x00, 0xb8, 0x02, 0x00, 0x00, 0xb9, 0x02, 0x00, 0x00, 0xb8, 0x02, 0x00, 0x00, 0xb6, 0x02, 0x00, 0x00, 0xba, 0x02, 0x00, 0x00, + 0xbb, 0x02, 0x00, 0x00, 0xbc, 0x02, 0x00, 0x00, 0xbd, 0x02, 0x00, 0x00, 0xbe, 0x02, 0x00, 0x00, 0xba, 0x02, 0x00, 0x00, 0xbf, 0x02, 0x00, 0x00, 0xc0, 0x02, + 0x00, 0x00, 0xc1, 0x02, 0x00, 0x00, 0xba, 0x02, 0x00, 0x00, 0xbc, 0x02, 0x00, 0x00, 0xc2, 0x02, 0x00, 0x00, 0xc3, 0x02, 0x00, 0x00, 0xc2, 0x02, 0x00, 0x00, + 0xc4, 0x02, 0x00, 0x00, 0xc3, 0x02, 0x00, 0x00, 0xc5, 0x02, 0x00, 0x00, 0xc2, 0x02, 0x00, 0x00, 0xc4, 0x02, 0x00, 0x00, 0xc2, 0x02, 0x00, 0x00, 0xbc, 0x02, + 0x00, 0x00, 0xc6, 0x02, 0x00, 0x00, 0xc7, 0x02, 0x00, 0x00, 0xc3, 0x02, 0x00, 0x00, 0xc8, 0x02, 0x00, 0x00, 0xc9, 0x02, 0x00, 0x00, 0xca, 0x02, 0x00, 0x00, + 0xcb, 0x02, 0x00, 0x00, 0xcc, 0x02, 0x00, 0x00, 0xcd, 0x02, 0x00, 0x00, 0xc9, 0x02, 0x00, 0x00, 0xcc, 0x02, 0x00, 0x00, 0xce, 0x02, 0x00, 0x00, 0xcb, 0x02, + 0x00, 0x00, 0xce, 0x02, 0x00, 0x00, 0xcc, 0x02, 0x00, 0x00, 0xcf, 0x02, 0x00, 0x00, 0xd0, 0x02, 0x00, 0x00, 0xd1, 0x02, 0x00, 0x00, 0xd2, 0x02, 0x00, 0x00, + 0xc3, 0x02, 0x00, 0x00, 0xc7, 0x02, 0x00, 0x00, 0xc9, 0x02, 0x00, 0x00, 0xd3, 0x02, 0x00, 0x00, 0xca, 0x02, 0x00, 0x00, 0xd4, 0x02, 0x00, 0x00, 0xd5, 0x02, + 0x00, 0x00, 0xd6, 0x02, 0x00, 0x00, 0xd7, 0x02, 0x00, 0x00, 0xd8, 0x02, 0x00, 0x00, 0xd9, 0x02, 0x00, 0x00, 0xc5, 0x02, 0x00, 0x00, 0xd9, 0x02, 0x00, 0x00, + 0xda, 0x02, 0x00, 0x00, 0xdb, 0x02, 0x00, 0x00, 0xc9, 0x02, 0x00, 0x00, 0xdc, 0x02, 0x00, 0x00, 0xdd, 0x02, 0x00, 0x00, 0xde, 0x02, 0x00, 0x00, 0xdf, 0x02, + 0x00, 0x00, 0xe0, 0x02, 0x00, 0x00, 0xe1, 0x02, 0x00, 0x00, 0xe2, 0x02, 0x00, 0x00, 0xe3, 0x02, 0x00, 0x00, 0xe4, 0x02, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, + 0xae, 0x02, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0xe4, 0x02, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0xe4, 0x02, 0x00, 0x00, 0xe5, 0x02, + 0x00, 0x00, 0xe6, 0x02, 0x00, 0x00, 0xe7, 0x02, 0x00, 0x00, 0xe8, 0x02, 0x00, 0x00, 0xe9, 0x02, 0x00, 0x00, 0xea, 0x02, 0x00, 0x00, 0xeb, 0x02, 0x00, 0x00, + 0xec, 0x02, 0x00, 0x00, 0xd1, 0x02, 0x00, 0x00, 0xed, 0x02, 0x00, 0x00, 0xee, 0x02, 0x00, 0x00, 0xef, 0x02, 0x00, 0x00, 0xf0, 0x02, 0x00, 0x00, 0xf1, 0x02, + 0x00, 0x00, 0xf2, 0x02, 0x00, 0x00, 0xf3, 0x02, 0x00, 0x00, 0xf4, 0x02, 0x00, 0x00, 0xf1, 0x02, 0x00, 0x00, 0xf5, 0x02, 0x00, 0x00, 0xf4, 0x02, 0x00, 0x00, + 0xf3, 0x02, 0x00, 0x00, 0xf5, 0x02, 0x00, 0x00, 0xf6, 0x02, 0x00, 0x00, 0xf4, 0x02, 0x00, 0x00, 0xf5, 0x02, 0x00, 0x00, 0xf3, 0x02, 0x00, 0x00, 0xf7, 0x02, + 0x00, 0x00, 0xf8, 0x02, 0x00, 0x00, 0xf9, 0x02, 0x00, 0x00, 0xfa, 0x02, 0x00, 0x00, 0xfb, 0x02, 0x00, 0x00, 0xfc, 0x02, 0x00, 0x00, 0xfd, 0x02, 0x00, 0x00, + 0xfe, 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x00, 0x05, 0x03, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, 0x05, 0x03, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, + 0x03, 0x03, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, 0x07, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x09, 0x03, + 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x0b, 0x03, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x0d, 0x03, 0x00, 0x00, 0x0e, 0x03, 0x00, 0x00, + 0x0f, 0x03, 0x00, 0x00, 0x0e, 0x03, 0x00, 0x00, 0x0d, 0x03, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x05, 0x03, 0x00, 0x00, 0xf5, 0x02, 0x00, 0x00, 0x06, 0x03, + 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x11, 0x03, 0x00, 0x00, 0x12, 0x03, 0x00, 0x00, 0x13, 0x03, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x14, 0x03, 0x00, 0x00, + 0x08, 0x03, 0x00, 0x00, 0x15, 0x03, 0x00, 0x00, 0x16, 0x03, 0x00, 0x00, 0x17, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0xef, 0x02, 0x00, 0x00, 0x19, 0x03, + 0x00, 0x00, 0x1a, 0x03, 0x00, 0x00, 0x1b, 0x03, 0x00, 0x00, 0x1c, 0x03, 0x00, 0x00, 0x1d, 0x03, 0x00, 0x00, 0x1e, 0x03, 0x00, 0x00, 0x1f, 0x03, 0x00, 0x00, + 0x19, 0x03, 0x00, 0x00, 0x1b, 0x03, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0x1f, 0x03, 0x00, 0x00, 0x21, 0x03, 0x00, 0x00, 0x22, 0x03, 0x00, 0x00, 0x23, 0x03, + 0x00, 0x00, 0x24, 0x03, 0x00, 0x00, 0x25, 0x03, 0x00, 0x00, 0x22, 0x03, 0x00, 0x00, 0x26, 0x03, 0x00, 0x00, 0x27, 0x03, 0x00, 0x00, 0x28, 0x03, 0x00, 0x00, + 0x29, 0x03, 0x00, 0x00, 0x2a, 0x03, 0x00, 0x00, 0x17, 0x03, 0x00, 0x00, 0xee, 0x02, 0x00, 0x00, 0x17, 0x03, 0x00, 0x00, 0xef, 0x02, 0x00, 0x00, 0xee, 0x02, + 0x00, 0x00, 0x2b, 0x03, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x00, 0x2d, 0x03, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x00, 0x2e, 0x03, 0x00, 0x00, 0x2d, 0x03, 0x00, 0x00, + 0x2d, 0x03, 0x00, 0x00, 0x2e, 0x03, 0x00, 0x00, 0x2f, 0x03, 0x00, 0x00, 0x2e, 0x03, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, 0x2f, 0x03, 0x00, 0x00, 0x30, 0x03, + 0x00, 0x00, 0x31, 0x03, 0x00, 0x00, 0x2f, 0x03, 0x00, 0x00, 0x2f, 0x03, 0x00, 0x00, 0x31, 0x03, 0x00, 0x00, 0x32, 0x03, 0x00, 0x00, 0x31, 0x03, 0x00, 0x00, + 0x33, 0x03, 0x00, 0x00, 0x32, 0x03, 0x00, 0x00, 0x33, 0x03, 0x00, 0x00, 0x34, 0x03, 0x00, 0x00, 0x32, 0x03, 0x00, 0x00, 0x34, 0x03, 0x00, 0x00, 0x35, 0x03, + 0x00, 0x00, 0x32, 0x03, 0x00, 0x00, 0x35, 0x03, 0x00, 0x00, 0x36, 0x03, 0x00, 0x00, 0x32, 0x03, 0x00, 0x00, 0x36, 0x03, 0x00, 0x00, 0x37, 0x03, 0x00, 0x00, + 0x32, 0x03, 0x00, 0x00, 0x38, 0x03, 0x00, 0x00, 0x32, 0x03, 0x00, 0x00, 0x37, 0x03, 0x00, 0x00, 0x39, 0x03, 0x00, 0x00, 0x3a, 0x03, 0x00, 0x00, 0x3b, 0x03, + 0x00, 0x00, 0x3c, 0x03, 0x00, 0x00, 0x3d, 0x03, 0x00, 0x00, 0x3e, 0x03, 0x00, 0x00, 0x3f, 0x03, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, 0x19, 0x03, 0x00, 0x00, + 0x41, 0x03, 0x00, 0x00, 0x42, 0x03, 0x00, 0x00, 0x43, 0x03, 0x00, 0x00, 0x44, 0x03, 0x00, 0x00, 0x3e, 0x03, 0x00, 0x00, 0x3d, 0x03, 0x00, 0x00, 0x45, 0x03, + 0x00, 0x00, 0x46, 0x03, 0x00, 0x00, 0x47, 0x03, 0x00, 0x00, 0x48, 0x03, 0x00, 0x00, 0x49, 0x03, 0x00, 0x00, 0x4a, 0x03, 0x00, 0x00, 0x4b, 0x03, 0x00, 0x00, + 0x4c, 0x03, 0x00, 0x00, 0x4d, 0x03, 0x00, 0x00, 0x4e, 0x03, 0x00, 0x00, 0x4f, 0x03, 0x00, 0x00, 0x50, 0x03, 0x00, 0x00, 0x51, 0x03, 0x00, 0x00, 0x52, 0x03, + 0x00, 0x00, 0x53, 0x03, 0x00, 0x00, 0x54, 0x03, 0x00, 0x00, 0x55, 0x03, 0x00, 0x00, 0x56, 0x03, 0x00, 0x00, 0x57, 0x03, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00, + 0x59, 0x03, 0x00, 0x00, 0x4c, 0x03, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00, 0x5a, 0x03, 0x00, 0x00, 0x5b, 0x03, 0x00, 0x00, 0x5c, 0x03, 0x00, 0x00, 0x5d, 0x03, + 0x00, 0x00, 0x5e, 0x03, 0x00, 0x00, 0x5f, 0x03, 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, 0x61, 0x03, 0x00, 0x00, 0x62, 0x03, 0x00, 0x00, 0x63, 0x03, 0x00, 0x00, + 0x64, 0x03, 0x00, 0x00, 0x65, 0x03, 0x00, 0x00, 0x66, 0x03, 0x00, 0x00, 0x67, 0x03, 0x00, 0x00, 0x4d, 0x03, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0x69, 0x03, + 0x00, 0x00, 0x6a, 0x03, 0x00, 0x00, 0x6b, 0x03, 0x00, 0x00, 0x6c, 0x03, 0x00, 0x00, 0x6d, 0x03, 0x00, 0x00, 0x6e, 0x03, 0x00, 0x00, 0x6f, 0x03, 0x00, 0x00, + 0x6c, 0x03, 0x00, 0x00, 0x6e, 0x03, 0x00, 0x00, 0x70, 0x03, 0x00, 0x00, 0x6f, 0x03, 0x00, 0x00, 0x71, 0x03, 0x00, 0x00, 0x72, 0x03, 0x00, 0x00, 0x70, 0x03, + 0x00, 0x00, 0x71, 0x03, 0x00, 0x00, 0x66, 0x03, 0x00, 0x00, 0x73, 0x03, 0x00, 0x00, 0x34, 0x02, 0x00, 0x00, 0x57, 0x03, 0x00, 0x00, 0x74, 0x03, 0x00, 0x00, + 0x75, 0x03, 0x00, 0x00, 0x76, 0x03, 0x00, 0x00, 0x77, 0x03, 0x00, 0x00, 0x78, 0x03, 0x00, 0x00, 0x79, 0x03, 0x00, 0x00, 0x7a, 0x03, 0x00, 0x00, 0x7b, 0x03, + 0x00, 0x00, 0x4a, 0x03, 0x00, 0x00, 0x7c, 0x03, 0x00, 0x00, 0x7d, 0x03, 0x00, 0x00, 0x3d, 0x03, 0x00, 0x00, 0x7e, 0x03, 0x00, 0x00, 0x44, 0x03, 0x00, 0x00, + 0x7f, 0x03, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x81, 0x03, 0x00, 0x00, 0x82, 0x03, 0x00, 0x00, 0x83, 0x03, 0x00, 0x00, 0x84, 0x03, 0x00, 0x00, 0x47, 0x03, + 0x00, 0x00, 0x85, 0x03, 0x00, 0x00, 0x86, 0x03, 0x00, 0x00, 0x47, 0x03, 0x00, 0x00, 0x87, 0x03, 0x00, 0x00, 0x85, 0x03, 0x00, 0x00, 0x34, 0x02, 0x00, 0x00, + 0x35, 0x02, 0x00, 0x00, 0x66, 0x03, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x66, 0x03, 0x00, 0x00, 0x88, 0x03, 0x00, 0x00, 0x35, 0x02, 0x00, 0x00, 0x88, 0x03, + 0x00, 0x00, 0x66, 0x03, 0x00, 0x00, 0x36, 0x02, 0x00, 0x00, 0x88, 0x03, 0x00, 0x00, 0x35, 0x02, 0x00, 0x00, 0x89, 0x03, 0x00, 0x00, 0x6e, 0x03, 0x00, 0x00, + 0x88, 0x03, 0x00, 0x00, 0x6e, 0x03, 0x00, 0x00, 0x71, 0x03, 0x00, 0x00, 0x6f, 0x03, 0x00, 0x00, 0x71, 0x03, 0x00, 0x00, 0x6e, 0x03, 0x00, 0x00, 0x89, 0x03, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x8a, 0x03, 0x00, 0x00, 0x8b, 0x03, 0x00, 0x00, 0x8b, 0x03, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x8a, 0x03, 0x00, 0x00, + 0x8c, 0x03, 0x00, 0x00, 0x8d, 0x03, 0x00, 0x00, 0x8d, 0x03, 0x00, 0x00, 0x8b, 0x03, 0x00, 0x00, 0x8a, 0x03, 0x00, 0x00, 0x8c, 0x03, 0x00, 0x00, 0x09, 0x00, + 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x8d, 0x03, 0x00, 0x00, 0x8c, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x8e, 0x03, 0x00, 0x00, + 0x8f, 0x03, 0x00, 0x00, 0x8f, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x8e, 0x03, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x91, 0x03, + 0x00, 0x00, 0x91, 0x03, 0x00, 0x00, 0x8f, 0x03, 0x00, 0x00, 0x8e, 0x03, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x91, 0x03, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x92, 0x03, 0x00, 0x00, 0x93, 0x03, 0x00, 0x00, 0x93, 0x03, + 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x94, 0x03, 0x00, 0x00, 0x95, 0x03, 0x00, 0x00, 0x95, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x95, 0x03, 0x00, 0x00, 0x96, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x95, 0x03, 0x00, 0x00, 0x97, 0x03, 0x00, 0x00, 0x98, 0x03, 0x00, 0x00, 0x99, 0x03, 0x00, 0x00, 0x99, 0x03, 0x00, 0x00, 0x9a, 0x03, 0x00, 0x00, + 0x97, 0x03, 0x00, 0x00, 0x98, 0x03, 0x00, 0x00, 0x97, 0x03, 0x00, 0x00, 0x96, 0x03, 0x00, 0x00, 0x96, 0x03, 0x00, 0x00, 0x95, 0x03, 0x00, 0x00, 0x98, 0x03, + 0x00, 0x00, 0x9b, 0x03, 0x00, 0x00, 0x9c, 0x03, 0x00, 0x00, 0x93, 0x03, 0x00, 0x00, 0x93, 0x03, 0x00, 0x00, 0x92, 0x03, 0x00, 0x00, 0x9b, 0x03, 0x00, 0x00, + 0x9a, 0x03, 0x00, 0x00, 0x99, 0x03, 0x00, 0x00, 0x9c, 0x03, 0x00, 0x00, 0x9c, 0x03, 0x00, 0x00, 0x9b, 0x03, 0x00, 0x00, 0x9a, 0x03, 0x00, 0x00, 0x9d, 0x03, + 0x00, 0x00, 0x98, 0x03, 0x00, 0x00, 0x95, 0x03, 0x00, 0x00, 0x95, 0x03, 0x00, 0x00, 0x94, 0x03, 0x00, 0x00, 0x9d, 0x03, 0x00, 0x00, 0x9e, 0x03, 0x00, 0x00, + 0x99, 0x03, 0x00, 0x00, 0x98, 0x03, 0x00, 0x00, 0x98, 0x03, 0x00, 0x00, 0x9d, 0x03, 0x00, 0x00, 0x9e, 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x9c, 0x03, + 0x00, 0x00, 0x99, 0x03, 0x00, 0x00, 0x99, 0x03, 0x00, 0x00, 0x9e, 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x93, 0x03, 0x00, 0x00, + 0x9c, 0x03, 0x00, 0x00, 0x9c, 0x03, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x9b, 0x03, 0x00, 0x00, 0x92, 0x03, + 0x00, 0x00, 0x92, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x9f, 0x03, 0x00, 0x00, 0x9a, 0x03, 0x00, 0x00, 0x9b, 0x03, 0x00, 0x00, + 0x9b, 0x03, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x9f, 0x03, 0x00, 0x00, 0xa0, 0x03, 0x00, 0x00, 0x97, 0x03, 0x00, 0x00, 0x9a, 0x03, 0x00, 0x00, 0x9a, 0x03, + 0x00, 0x00, 0x9f, 0x03, 0x00, 0x00, 0xa0, 0x03, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x96, 0x03, 0x00, 0x00, 0x97, 0x03, 0x00, 0x00, 0x97, 0x03, 0x00, 0x00, + 0xa0, 0x03, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x96, 0x03, 0x00, 0x00, 0x96, 0x03, 0x00, 0x00, 0x11, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x94, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x8c, 0x03, 0x00, 0x00, 0x9d, 0x03, 0x00, 0x00, 0x94, 0x03, 0x00, 0x00, 0x94, 0x03, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x8c, 0x03, + 0x00, 0x00, 0x8a, 0x03, 0x00, 0x00, 0x9e, 0x03, 0x00, 0x00, 0x9d, 0x03, 0x00, 0x00, 0x9d, 0x03, 0x00, 0x00, 0x8c, 0x03, 0x00, 0x00, 0x8a, 0x03, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x9e, 0x03, 0x00, 0x00, 0x9e, 0x03, 0x00, 0x00, 0x8a, 0x03, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x90, 0x03, + 0x00, 0x00, 0x9f, 0x03, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x8e, 0x03, 0x00, 0x00, + 0xa0, 0x03, 0x00, 0x00, 0x9f, 0x03, 0x00, 0x00, 0x9f, 0x03, 0x00, 0x00, 0x90, 0x03, 0x00, 0x00, 0x8e, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x11, 0x00, + 0x00, 0x00, 0xa0, 0x03, 0x00, 0x00, 0xa0, 0x03, 0x00, 0x00, 0x8e, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x8f, 0x03, 0x00, 0x00, 0x91, 0x03, 0x00, 0x00, + 0x8b, 0x03, 0x00, 0x00, 0x8b, 0x03, 0x00, 0x00, 0x8d, 0x03, 0x00, 0x00, 0x8f, 0x03, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x8b, 0x03, 0x00, 0x00, 0x91, 0x03, + 0x00, 0x00, 0x91, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x8f, 0x03, 0x00, 0x00, 0x8d, 0x03, 0x00, 0x00, + 0x8d, 0x03, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0xa1, 0x03, 0x00, 0x00, 0xa2, 0x03, 0x00, 0x00, 0xa2, 0x03, + 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0xa3, 0x03, 0x00, 0x00, 0xa3, 0x03, 0x00, 0x00, + 0xa1, 0x03, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0xa2, 0x03, 0x00, 0x00, 0xa1, 0x03, 0x00, 0x00, 0xa3, 0x03, 0x00, 0x00, 0xa3, 0x03, 0x00, 0x00, 0xa4, 0x03, + 0x00, 0x00, 0xa2, 0x03, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xa2, 0x03, 0x00, 0x00, 0xa2, 0x03, 0x00, 0x00, 0xa4, 0x03, 0x00, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x15, 0x00, + 0x00, 0x00, 0xa5, 0x03, 0x00, 0x00, 0xa6, 0x03, 0x00, 0x00, 0xa4, 0x03, 0x00, 0x00, 0xa4, 0x03, 0x00, 0x00, 0xa3, 0x03, 0x00, 0x00, 0xa5, 0x03, 0x00, 0x00, + 0xa6, 0x03, 0x00, 0x00, 0xa5, 0x03, 0x00, 0x00, 0xa7, 0x03, 0x00, 0x00, 0xa7, 0x03, 0x00, 0x00, 0xa8, 0x03, 0x00, 0x00, 0xa6, 0x03, 0x00, 0x00, 0x1d, 0x00, + 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xa4, 0x03, 0x00, 0x00, 0xa4, 0x03, 0x00, 0x00, 0xa6, 0x03, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0xa5, 0x03, 0x00, 0x00, 0xa5, 0x03, 0x00, 0x00, 0xa3, 0x03, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0xa9, 0x03, 0x00, 0x00, 0xaa, 0x03, + 0x00, 0x00, 0xa8, 0x03, 0x00, 0x00, 0xa8, 0x03, 0x00, 0x00, 0xa7, 0x03, 0x00, 0x00, 0xa9, 0x03, 0x00, 0x00, 0xaa, 0x03, 0x00, 0x00, 0xa9, 0x03, 0x00, 0x00, + 0xab, 0x03, 0x00, 0x00, 0xab, 0x03, 0x00, 0x00, 0xac, 0x03, 0x00, 0x00, 0xaa, 0x03, 0x00, 0x00, 0xad, 0x03, 0x00, 0x00, 0xae, 0x03, 0x00, 0x00, 0xa8, 0x03, + 0x00, 0x00, 0xa8, 0x03, 0x00, 0x00, 0xaa, 0x03, 0x00, 0x00, 0xad, 0x03, 0x00, 0x00, 0xaf, 0x03, 0x00, 0x00, 0xb0, 0x03, 0x00, 0x00, 0xa9, 0x03, 0x00, 0x00, + 0xa9, 0x03, 0x00, 0x00, 0xa7, 0x03, 0x00, 0x00, 0xaf, 0x03, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xaf, 0x03, 0x00, 0x00, 0xa7, 0x03, 0x00, 0x00, 0xa7, 0x03, + 0x00, 0x00, 0xa5, 0x03, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xae, 0x03, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0xa6, 0x03, 0x00, 0x00, 0xa6, 0x03, 0x00, 0x00, + 0xa8, 0x03, 0x00, 0x00, 0xae, 0x03, 0x00, 0x00, 0xb1, 0x03, 0x00, 0x00, 0xb2, 0x03, 0x00, 0x00, 0xac, 0x03, 0x00, 0x00, 0xac, 0x03, 0x00, 0x00, 0xab, 0x03, + 0x00, 0x00, 0xb1, 0x03, 0x00, 0x00, 0xb3, 0x03, 0x00, 0x00, 0xb4, 0x03, 0x00, 0x00, 0xb2, 0x03, 0x00, 0x00, 0xb2, 0x03, 0x00, 0x00, 0xb1, 0x03, 0x00, 0x00, + 0xb3, 0x03, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0xb5, 0x03, 0x00, 0x00, 0xac, 0x03, 0x00, 0x00, 0xac, 0x03, 0x00, 0x00, 0xb2, 0x03, 0x00, 0x00, 0x23, 0x00, + 0x00, 0x00, 0xb6, 0x03, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0xb1, 0x03, 0x00, 0x00, 0xb1, 0x03, 0x00, 0x00, 0xab, 0x03, 0x00, 0x00, 0xb6, 0x03, 0x00, 0x00, + 0xb0, 0x03, 0x00, 0x00, 0xb6, 0x03, 0x00, 0x00, 0xab, 0x03, 0x00, 0x00, 0xab, 0x03, 0x00, 0x00, 0xa9, 0x03, 0x00, 0x00, 0xb0, 0x03, 0x00, 0x00, 0xb5, 0x03, + 0x00, 0x00, 0xad, 0x03, 0x00, 0x00, 0xaa, 0x03, 0x00, 0x00, 0xaa, 0x03, 0x00, 0x00, 0xac, 0x03, 0x00, 0x00, 0xb5, 0x03, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, + 0x22, 0x00, 0x00, 0x00, 0xb4, 0x03, 0x00, 0x00, 0xb4, 0x03, 0x00, 0x00, 0xb3, 0x03, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x23, 0x00, + 0x00, 0x00, 0xb2, 0x03, 0x00, 0x00, 0xb2, 0x03, 0x00, 0x00, 0xb4, 0x03, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, + 0xb3, 0x03, 0x00, 0x00, 0xb3, 0x03, 0x00, 0x00, 0xb1, 0x03, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xb7, 0x03, + 0x00, 0x00, 0xb7, 0x03, 0x00, 0x00, 0xb8, 0x03, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xb9, 0x03, 0x00, 0x00, 0xba, 0x03, 0x00, 0x00, 0xb8, 0x03, 0x00, 0x00, + 0xb8, 0x03, 0x00, 0x00, 0xb7, 0x03, 0x00, 0x00, 0xb9, 0x03, 0x00, 0x00, 0xba, 0x03, 0x00, 0x00, 0xb9, 0x03, 0x00, 0x00, 0xbb, 0x03, 0x00, 0x00, 0xbb, 0x03, + 0x00, 0x00, 0xbc, 0x03, 0x00, 0x00, 0xba, 0x03, 0x00, 0x00, 0xb8, 0x03, 0x00, 0x00, 0xba, 0x03, 0x00, 0x00, 0xbd, 0x03, 0x00, 0x00, 0xbd, 0x03, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0xb8, 0x03, 0x00, 0x00, 0xb9, 0x03, 0x00, 0x00, 0xb7, 0x03, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xbe, 0x03, + 0x00, 0x00, 0xb9, 0x03, 0x00, 0x00, 0xb7, 0x03, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0xb7, 0x03, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0xb8, 0x03, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x16, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0xbc, 0x03, 0x00, 0x00, 0xbc, 0x03, 0x00, 0x00, 0xbb, 0x03, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0xbc, 0x03, + 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xbf, 0x03, 0x00, 0x00, 0xbc, 0x03, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xbb, 0x03, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xbb, 0x03, 0x00, 0x00, 0xb9, 0x03, + 0x00, 0x00, 0xbe, 0x03, 0x00, 0x00, 0xbe, 0x03, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0xbb, 0x03, 0x00, 0x00, 0xba, 0x03, 0x00, 0x00, 0xbc, 0x03, 0x00, 0x00, + 0xbf, 0x03, 0x00, 0x00, 0xbf, 0x03, 0x00, 0x00, 0xbd, 0x03, 0x00, 0x00, 0xba, 0x03, 0x00, 0x00, 0xbf, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xb6, 0x03, + 0x00, 0x00, 0xb6, 0x03, 0x00, 0x00, 0xb0, 0x03, 0x00, 0x00, 0xbf, 0x03, 0x00, 0x00, 0xbd, 0x03, 0x00, 0x00, 0xbf, 0x03, 0x00, 0x00, 0xb0, 0x03, 0x00, 0x00, + 0xb0, 0x03, 0x00, 0x00, 0xaf, 0x03, 0x00, 0x00, 0xbd, 0x03, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0xbd, 0x03, 0x00, 0x00, 0xaf, 0x03, 0x00, 0x00, 0xaf, 0x03, + 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0xbe, 0x03, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, + 0xae, 0x03, 0x00, 0x00, 0xbe, 0x03, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0xbe, 0x03, 0x00, 0x00, 0xae, 0x03, 0x00, 0x00, 0xae, 0x03, 0x00, 0x00, 0xad, 0x03, + 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0xad, 0x03, 0x00, 0x00, 0xad, 0x03, 0x00, 0x00, 0xb5, 0x03, 0x00, 0x00, + 0x21, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0xb5, 0x03, 0x00, 0x00, 0xb5, 0x03, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x1f, 0x00, + 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0xb6, 0x03, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x27, 0x00, + 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0xc1, 0x03, 0x00, 0x00, 0xc1, 0x03, 0x00, 0x00, 0xc2, 0x03, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, + 0x27, 0x00, 0x00, 0x00, 0xc2, 0x03, 0x00, 0x00, 0xc2, 0x03, 0x00, 0x00, 0xc3, 0x03, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0xc4, 0x03, 0x00, 0x00, 0x2d, 0x00, + 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0xc3, 0x03, 0x00, 0x00, 0xc4, 0x03, 0x00, 0x00, 0xc5, 0x03, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x2d, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0xc4, 0x03, 0x00, 0x00, 0xc5, 0x03, 0x00, 0x00, 0xc5, 0x03, 0x00, 0x00, 0xc6, 0x03, 0x00, 0x00, 0x2a, 0x00, + 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0xc5, 0x03, 0x00, 0x00, 0xc7, 0x03, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0xc8, 0x03, 0x00, 0x00, 0xc7, 0x03, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0xc7, 0x03, 0x00, 0x00, 0xc7, 0x03, + 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0xc9, 0x03, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x3a, 0x00, + 0x00, 0x00, 0xc9, 0x03, 0x00, 0x00, 0xc1, 0x03, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0xc9, 0x03, 0x00, 0x00, + 0xc1, 0x03, 0x00, 0x00, 0xc7, 0x03, 0x00, 0x00, 0xca, 0x03, 0x00, 0x00, 0xcb, 0x03, 0x00, 0x00, 0xcb, 0x03, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0xc7, 0x03, + 0x00, 0x00, 0xcb, 0x03, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0xcb, 0x03, 0x00, 0x00, + 0xcc, 0x03, 0x00, 0x00, 0xc9, 0x03, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0xcc, 0x03, 0x00, 0x00, 0xca, 0x03, + 0x00, 0x00, 0xc7, 0x03, 0x00, 0x00, 0xc8, 0x03, 0x00, 0x00, 0xc8, 0x03, 0x00, 0x00, 0xcd, 0x03, 0x00, 0x00, 0xca, 0x03, 0x00, 0x00, 0xca, 0x03, 0x00, 0x00, + 0xce, 0x03, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0xcb, 0x03, 0x00, 0x00, 0xca, 0x03, 0x00, 0x00, 0xcb, 0x03, 0x00, 0x00, 0x3f, 0x00, + 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0xcb, 0x03, 0x00, 0x00, 0xcc, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0xcc, 0x03, 0x00, 0x00, 0xce, 0x03, 0x00, 0x00, 0xca, 0x03, 0x00, 0x00, 0xcd, 0x03, + 0x00, 0x00, 0xcd, 0x03, 0x00, 0x00, 0xcf, 0x03, 0x00, 0x00, 0xce, 0x03, 0x00, 0x00, 0xce, 0x03, 0x00, 0x00, 0xd0, 0x03, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0xce, 0x03, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3e, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0xd0, 0x03, 0x00, 0x00, 0xce, 0x03, 0x00, 0x00, 0xcf, 0x03, 0x00, 0x00, 0xcf, 0x03, 0x00, 0x00, + 0xd1, 0x03, 0x00, 0x00, 0xd0, 0x03, 0x00, 0x00, 0xd2, 0x03, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0xd0, 0x03, 0x00, 0x00, 0xd0, 0x03, 0x00, 0x00, 0xd3, 0x03, + 0x00, 0x00, 0xd2, 0x03, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0xd2, 0x03, 0x00, 0x00, 0xd2, 0x03, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0x00, 0x00, 0xd4, 0x03, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0xd2, 0x03, 0x00, 0x00, 0xd4, 0x03, + 0x00, 0x00, 0xd3, 0x03, 0x00, 0x00, 0xd0, 0x03, 0x00, 0x00, 0xd1, 0x03, 0x00, 0x00, 0xd1, 0x03, 0x00, 0x00, 0xd5, 0x03, 0x00, 0x00, 0xd3, 0x03, 0x00, 0x00, + 0xd6, 0x03, 0x00, 0x00, 0xd4, 0x03, 0x00, 0x00, 0xd2, 0x03, 0x00, 0x00, 0xd2, 0x03, 0x00, 0x00, 0xd3, 0x03, 0x00, 0x00, 0xd6, 0x03, 0x00, 0x00, 0xd7, 0x03, + 0x00, 0x00, 0xc1, 0x03, 0x00, 0x00, 0xc9, 0x03, 0x00, 0x00, 0xc9, 0x03, 0x00, 0x00, 0xcc, 0x03, 0x00, 0x00, 0xd7, 0x03, 0x00, 0x00, 0xd8, 0x03, 0x00, 0x00, + 0xc2, 0x03, 0x00, 0x00, 0xc1, 0x03, 0x00, 0x00, 0xc1, 0x03, 0x00, 0x00, 0xd7, 0x03, 0x00, 0x00, 0xd8, 0x03, 0x00, 0x00, 0xd9, 0x03, 0x00, 0x00, 0xd7, 0x03, + 0x00, 0x00, 0xcc, 0x03, 0x00, 0x00, 0xcc, 0x03, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0xd9, 0x03, 0x00, 0x00, 0xda, 0x03, 0x00, 0x00, 0xc3, 0x03, 0x00, 0x00, + 0xc2, 0x03, 0x00, 0x00, 0xc2, 0x03, 0x00, 0x00, 0xd8, 0x03, 0x00, 0x00, 0xda, 0x03, 0x00, 0x00, 0xdb, 0x03, 0x00, 0x00, 0xd8, 0x03, 0x00, 0x00, 0xd7, 0x03, + 0x00, 0x00, 0xd7, 0x03, 0x00, 0x00, 0xd9, 0x03, 0x00, 0x00, 0xdb, 0x03, 0x00, 0x00, 0xdc, 0x03, 0x00, 0x00, 0xc4, 0x03, 0x00, 0x00, 0xc3, 0x03, 0x00, 0x00, + 0xc3, 0x03, 0x00, 0x00, 0xda, 0x03, 0x00, 0x00, 0xdc, 0x03, 0x00, 0x00, 0xda, 0x03, 0x00, 0x00, 0xd8, 0x03, 0x00, 0x00, 0xdb, 0x03, 0x00, 0x00, 0xdb, 0x03, + 0x00, 0x00, 0xdd, 0x03, 0x00, 0x00, 0xda, 0x03, 0x00, 0x00, 0xde, 0x03, 0x00, 0x00, 0xc5, 0x03, 0x00, 0x00, 0xc4, 0x03, 0x00, 0x00, 0xc4, 0x03, 0x00, 0x00, + 0xdc, 0x03, 0x00, 0x00, 0xde, 0x03, 0x00, 0x00, 0xdf, 0x03, 0x00, 0x00, 0xdc, 0x03, 0x00, 0x00, 0xda, 0x03, 0x00, 0x00, 0xda, 0x03, 0x00, 0x00, 0xdd, 0x03, + 0x00, 0x00, 0xdf, 0x03, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xc6, 0x03, 0x00, 0x00, 0xc5, 0x03, 0x00, 0x00, 0xc5, 0x03, 0x00, 0x00, 0xde, 0x03, 0x00, 0x00, + 0xe0, 0x03, 0x00, 0x00, 0xe1, 0x03, 0x00, 0x00, 0xde, 0x03, 0x00, 0x00, 0xdc, 0x03, 0x00, 0x00, 0xdc, 0x03, 0x00, 0x00, 0xdf, 0x03, 0x00, 0x00, 0xe1, 0x03, + 0x00, 0x00, 0xde, 0x03, 0x00, 0x00, 0xe1, 0x03, 0x00, 0x00, 0xe2, 0x03, 0x00, 0x00, 0xe2, 0x03, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xde, 0x03, 0x00, 0x00, + 0xe3, 0x03, 0x00, 0x00, 0xe1, 0x03, 0x00, 0x00, 0xdf, 0x03, 0x00, 0x00, 0xdf, 0x03, 0x00, 0x00, 0xe4, 0x03, 0x00, 0x00, 0xe3, 0x03, 0x00, 0x00, 0xe5, 0x03, + 0x00, 0x00, 0xe4, 0x03, 0x00, 0x00, 0xdf, 0x03, 0x00, 0x00, 0xdf, 0x03, 0x00, 0x00, 0xdd, 0x03, 0x00, 0x00, 0xe5, 0x03, 0x00, 0x00, 0xe5, 0x03, 0x00, 0x00, + 0xdd, 0x03, 0x00, 0x00, 0xdb, 0x03, 0x00, 0x00, 0xdb, 0x03, 0x00, 0x00, 0xe6, 0x03, 0x00, 0x00, 0xe5, 0x03, 0x00, 0x00, 0xd9, 0x03, 0x00, 0x00, 0x43, 0x00, + 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0xe7, 0x03, 0x00, 0x00, 0xd9, 0x03, 0x00, 0x00, 0xe7, 0x03, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0xe7, 0x03, 0x00, 0x00, 0xe4, 0x03, 0x00, 0x00, 0xe5, 0x03, 0x00, 0x00, 0x45, 0x00, + 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0xd4, 0x03, 0x00, 0x00, 0xe4, 0x03, 0x00, 0x00, 0xe1, 0x03, 0x00, 0x00, 0xe3, 0x03, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0x00, 0xe2, 0x03, 0x00, 0x00, 0xe1, 0x03, 0x00, 0x00, 0xd6, 0x03, 0x00, 0x00, 0xe3, 0x03, 0x00, 0x00, 0xe4, 0x03, 0x00, 0x00, 0xe4, 0x03, + 0x00, 0x00, 0xd4, 0x03, 0x00, 0x00, 0xd6, 0x03, 0x00, 0x00, 0xe3, 0x03, 0x00, 0x00, 0xd6, 0x03, 0x00, 0x00, 0xe9, 0x03, 0x00, 0x00, 0xe9, 0x03, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0x00, 0xe3, 0x03, 0x00, 0x00, 0xd6, 0x03, 0x00, 0x00, 0xd3, 0x03, 0x00, 0x00, 0xd5, 0x03, 0x00, 0x00, 0xd5, 0x03, 0x00, 0x00, 0xe9, 0x03, + 0x00, 0x00, 0xd6, 0x03, 0x00, 0x00, 0xe5, 0x03, 0x00, 0x00, 0xe6, 0x03, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, + 0xe5, 0x03, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x47, 0x00, + 0x00, 0x00, 0xe6, 0x03, 0x00, 0x00, 0xe7, 0x03, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0xe6, 0x03, 0x00, 0x00, + 0xdb, 0x03, 0x00, 0x00, 0xd9, 0x03, 0x00, 0x00, 0xe7, 0x03, 0x00, 0x00, 0xe7, 0x03, 0x00, 0x00, 0xe6, 0x03, 0x00, 0x00, 0xdb, 0x03, 0x00, 0x00, 0xe9, 0x03, + 0x00, 0x00, 0xd5, 0x03, 0x00, 0x00, 0xea, 0x03, 0x00, 0x00, 0xea, 0x03, 0x00, 0x00, 0xeb, 0x03, 0x00, 0x00, 0xe9, 0x03, 0x00, 0x00, 0xd5, 0x03, 0x00, 0x00, + 0xd1, 0x03, 0x00, 0x00, 0xec, 0x03, 0x00, 0x00, 0xec, 0x03, 0x00, 0x00, 0xea, 0x03, 0x00, 0x00, 0xd5, 0x03, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xe2, 0x03, + 0x00, 0x00, 0xed, 0x03, 0x00, 0x00, 0xed, 0x03, 0x00, 0x00, 0xee, 0x03, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xee, 0x03, 0x00, 0x00, 0xef, 0x03, 0x00, 0x00, + 0xc6, 0x03, 0x00, 0x00, 0xc6, 0x03, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xee, 0x03, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0xc6, 0x03, + 0x00, 0x00, 0xc6, 0x03, 0x00, 0x00, 0xef, 0x03, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0xe2, 0x03, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, + 0xf0, 0x03, 0x00, 0x00, 0xed, 0x03, 0x00, 0x00, 0xe2, 0x03, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0xe9, 0x03, 0x00, 0x00, 0xeb, 0x03, 0x00, 0x00, 0xeb, 0x03, + 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0xd1, 0x03, 0x00, 0x00, 0xcf, 0x03, 0x00, 0x00, 0xf1, 0x03, 0x00, 0x00, 0xf1, 0x03, 0x00, 0x00, + 0xec, 0x03, 0x00, 0x00, 0xd1, 0x03, 0x00, 0x00, 0xcf, 0x03, 0x00, 0x00, 0xcd, 0x03, 0x00, 0x00, 0xf2, 0x03, 0x00, 0x00, 0xf2, 0x03, 0x00, 0x00, 0xf1, 0x03, + 0x00, 0x00, 0xcf, 0x03, 0x00, 0x00, 0xcd, 0x03, 0x00, 0x00, 0xc8, 0x03, 0x00, 0x00, 0xf3, 0x03, 0x00, 0x00, 0xf3, 0x03, 0x00, 0x00, 0xf2, 0x03, 0x00, 0x00, + 0xcd, 0x03, 0x00, 0x00, 0xc8, 0x03, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0xf3, 0x03, 0x00, 0x00, 0xc8, 0x03, + 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0xf4, 0x03, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x49, 0x00, + 0x00, 0x00, 0xf3, 0x03, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0xf5, 0x03, 0x00, 0x00, + 0x36, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0xef, 0x03, 0x00, 0x00, 0xf5, 0x03, 0x00, 0x00, 0xf6, 0x03, 0x00, 0x00, 0x34, 0x00, + 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0xf5, 0x03, 0x00, 0x00, 0xf6, 0x03, 0x00, 0x00, 0xf6, 0x03, 0x00, 0x00, 0xf7, 0x03, 0x00, 0x00, + 0x33, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0xf6, 0x03, 0x00, 0x00, 0xf7, 0x03, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x31, 0x00, + 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0xf7, 0x03, 0x00, 0x00, 0xf4, 0x03, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x31, 0x00, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0xf4, 0x03, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0xf9, 0x03, 0x00, 0x00, 0xf2, 0x03, 0x00, 0x00, 0xf2, 0x03, + 0x00, 0x00, 0xf3, 0x03, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0xf9, 0x03, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0xf4, 0x03, 0x00, 0x00, 0xf4, 0x03, 0x00, 0x00, 0xfa, 0x03, + 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0xf9, 0x03, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0xf1, 0x03, 0x00, 0x00, 0xf1, 0x03, 0x00, 0x00, 0xf2, 0x03, 0x00, 0x00, + 0xf9, 0x03, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0xfa, 0x03, 0x00, 0x00, 0x51, 0x00, + 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0xf9, 0x03, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x4b, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0xec, 0x03, 0x00, 0x00, 0xec, 0x03, 0x00, 0x00, 0xf1, 0x03, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x4f, 0x00, + 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0xea, 0x03, 0x00, 0x00, + 0xec, 0x03, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0xfb, 0x03, 0x00, 0x00, 0xea, 0x03, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0xfb, 0x03, + 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0xfb, 0x03, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, + 0x55, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0xfb, 0x03, 0x00, 0x00, 0xea, 0x03, 0x00, 0x00, 0xfb, 0x03, 0x00, 0x00, 0xfc, 0x03, + 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0xeb, 0x03, 0x00, 0x00, 0xea, 0x03, 0x00, 0x00, 0xfa, 0x03, 0x00, 0x00, 0xf4, 0x03, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, + 0xf8, 0x03, 0x00, 0x00, 0xfd, 0x03, 0x00, 0x00, 0xfa, 0x03, 0x00, 0x00, 0xfd, 0x03, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0xf7, 0x03, 0x00, 0x00, 0xf7, 0x03, + 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xfd, 0x03, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0xfa, 0x03, 0x00, 0x00, 0xfd, 0x03, 0x00, 0x00, 0xfd, 0x03, 0x00, 0x00, + 0xff, 0x03, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xf7, 0x03, 0x00, 0x00, 0xf6, 0x03, 0x00, 0x00, 0xf6, 0x03, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xfd, 0x03, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xf6, 0x03, 0x00, 0x00, 0xf5, 0x03, 0x00, 0x00, 0xf5, 0x03, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, + 0x02, 0x04, 0x00, 0x00, 0xf5, 0x03, 0x00, 0x00, 0xef, 0x03, 0x00, 0x00, 0xef, 0x03, 0x00, 0x00, 0xee, 0x03, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x03, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, + 0x02, 0x04, 0x00, 0x00, 0xee, 0x03, 0x00, 0x00, 0xee, 0x03, 0x00, 0x00, 0xed, 0x03, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x04, 0x04, + 0x00, 0x00, 0xed, 0x03, 0x00, 0x00, 0xed, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, + 0x05, 0x04, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x03, 0x04, + 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, + 0x51, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, + 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, + 0x05, 0x04, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xeb, 0x03, + 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, + 0x55, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x55, 0x00, + 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, + 0x07, 0x04, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x09, 0x04, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0b, 0x04, 0x00, 0x00, 0x0b, 0x04, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x0d, 0x04, 0x00, 0x00, + 0x0e, 0x04, 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x0d, 0x04, 0x00, 0x00, 0x11, 0x04, 0x00, 0x00, 0x12, 0x04, + 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x11, 0x04, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, + 0x12, 0x04, 0x00, 0x00, 0x12, 0x04, 0x00, 0x00, 0x11, 0x04, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x13, 0x04, + 0x00, 0x00, 0x13, 0x04, 0x00, 0x00, 0x4e, 0x01, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x5b, 0x01, 0x00, 0x00, 0x14, 0x04, 0x00, 0x00, 0x0e, 0x04, 0x00, 0x00, + 0x0e, 0x04, 0x00, 0x00, 0x0d, 0x04, 0x00, 0x00, 0x5b, 0x01, 0x00, 0x00, 0x59, 0x01, 0x00, 0x00, 0x15, 0x04, 0x00, 0x00, 0x14, 0x04, 0x00, 0x00, 0x14, 0x04, + 0x00, 0x00, 0x5b, 0x01, 0x00, 0x00, 0x59, 0x01, 0x00, 0x00, 0x16, 0x04, 0x00, 0x00, 0x17, 0x04, 0x00, 0x00, 0x15, 0x04, 0x00, 0x00, 0x15, 0x04, 0x00, 0x00, + 0x59, 0x01, 0x00, 0x00, 0x16, 0x04, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, 0x19, 0x04, 0x00, 0x00, 0x17, 0x04, 0x00, 0x00, 0x17, 0x04, 0x00, 0x00, 0x16, 0x04, + 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, 0x1a, 0x04, 0x00, 0x00, 0x1b, 0x04, 0x00, 0x00, 0x19, 0x04, 0x00, 0x00, 0x19, 0x04, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, + 0x1a, 0x04, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x00, 0x1d, 0x04, 0x00, 0x00, 0x1b, 0x04, 0x00, 0x00, 0x1b, 0x04, 0x00, 0x00, 0x1a, 0x04, 0x00, 0x00, 0x1c, 0x04, + 0x00, 0x00, 0x4e, 0x01, 0x00, 0x00, 0x13, 0x04, 0x00, 0x00, 0x1d, 0x04, 0x00, 0x00, 0x1d, 0x04, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x00, 0x4e, 0x01, 0x00, 0x00, + 0x1e, 0x04, 0x00, 0x00, 0x1f, 0x04, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1e, 0x04, 0x00, 0x00, 0x20, 0x04, + 0x00, 0x00, 0x21, 0x04, 0x00, 0x00, 0x1f, 0x04, 0x00, 0x00, 0x1f, 0x04, 0x00, 0x00, 0x1e, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00, + 0x0b, 0x04, 0x00, 0x00, 0x21, 0x04, 0x00, 0x00, 0x21, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00, 0x19, 0x04, 0x00, 0x00, 0x22, 0x04, + 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x17, 0x04, 0x00, 0x00, 0x19, 0x04, 0x00, 0x00, 0x1b, 0x04, 0x00, 0x00, 0x24, 0x04, 0x00, 0x00, + 0x22, 0x04, 0x00, 0x00, 0x22, 0x04, 0x00, 0x00, 0x19, 0x04, 0x00, 0x00, 0x1b, 0x04, 0x00, 0x00, 0x1d, 0x04, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x24, 0x04, + 0x00, 0x00, 0x24, 0x04, 0x00, 0x00, 0x1b, 0x04, 0x00, 0x00, 0x1d, 0x04, 0x00, 0x00, 0x13, 0x04, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, + 0x61, 0x00, 0x00, 0x00, 0x1d, 0x04, 0x00, 0x00, 0x13, 0x04, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x25, 0x04, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x5f, 0x00, + 0x00, 0x00, 0x13, 0x04, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x17, 0x04, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, + 0x15, 0x04, 0x00, 0x00, 0x17, 0x04, 0x00, 0x00, 0x15, 0x04, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x14, 0x04, + 0x00, 0x00, 0x15, 0x04, 0x00, 0x00, 0x14, 0x04, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x26, 0x04, 0x00, 0x00, 0x26, 0x04, 0x00, 0x00, 0x0e, 0x04, 0x00, 0x00, + 0x14, 0x04, 0x00, 0x00, 0x0e, 0x04, 0x00, 0x00, 0x26, 0x04, 0x00, 0x00, 0x27, 0x04, 0x00, 0x00, 0x27, 0x04, 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x0e, 0x04, + 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x27, 0x04, 0x00, 0x00, 0x28, 0x04, 0x00, 0x00, 0x28, 0x04, 0x00, 0x00, 0x12, 0x04, 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, + 0x12, 0x04, 0x00, 0x00, 0x28, 0x04, 0x00, 0x00, 0x29, 0x04, 0x00, 0x00, 0x29, 0x04, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x12, 0x04, 0x00, 0x00, 0x0a, 0x04, + 0x00, 0x00, 0x29, 0x04, 0x00, 0x00, 0x2a, 0x04, 0x00, 0x00, 0x2a, 0x04, 0x00, 0x00, 0x0b, 0x04, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x0b, 0x04, 0x00, 0x00, + 0x2a, 0x04, 0x00, 0x00, 0x2b, 0x04, 0x00, 0x00, 0x2b, 0x04, 0x00, 0x00, 0x21, 0x04, 0x00, 0x00, 0x0b, 0x04, 0x00, 0x00, 0x21, 0x04, 0x00, 0x00, 0x2b, 0x04, + 0x00, 0x00, 0x2c, 0x04, 0x00, 0x00, 0x2c, 0x04, 0x00, 0x00, 0x1f, 0x04, 0x00, 0x00, 0x21, 0x04, 0x00, 0x00, 0x1f, 0x04, 0x00, 0x00, 0x2c, 0x04, 0x00, 0x00, + 0x25, 0x04, 0x00, 0x00, 0x25, 0x04, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x1f, 0x04, 0x00, 0x00, 0x2d, 0x04, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x2a, 0x04, + 0x00, 0x00, 0x2a, 0x04, 0x00, 0x00, 0x29, 0x04, 0x00, 0x00, 0x2d, 0x04, 0x00, 0x00, 0x2d, 0x04, 0x00, 0x00, 0x2e, 0x04, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, + 0x63, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x2d, 0x04, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x2b, 0x04, 0x00, 0x00, 0x2b, 0x04, + 0x00, 0x00, 0x2a, 0x04, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x2d, 0x04, 0x00, 0x00, 0x29, 0x04, 0x00, 0x00, 0x28, 0x04, 0x00, 0x00, 0x28, 0x04, 0x00, 0x00, + 0x2f, 0x04, 0x00, 0x00, 0x2d, 0x04, 0x00, 0x00, 0x28, 0x04, 0x00, 0x00, 0x27, 0x04, 0x00, 0x00, 0x26, 0x04, 0x00, 0x00, 0x26, 0x04, 0x00, 0x00, 0x2f, 0x04, + 0x00, 0x00, 0x28, 0x04, 0x00, 0x00, 0x26, 0x04, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x2f, 0x04, 0x00, 0x00, + 0x26, 0x04, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x25, 0x04, 0x00, 0x00, 0x25, 0x04, 0x00, 0x00, 0x2c, 0x04, 0x00, 0x00, 0x60, 0x00, + 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x2c, 0x04, 0x00, 0x00, 0x2c, 0x04, 0x00, 0x00, 0x2b, 0x04, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x24, 0x04, 0x00, 0x00, 0x24, 0x04, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x64, 0x00, + 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x22, 0x04, 0x00, 0x00, 0x22, 0x04, 0x00, 0x00, 0x24, 0x04, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x2d, 0x04, 0x00, 0x00, + 0x2f, 0x04, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x2e, 0x04, 0x00, 0x00, 0x2d, 0x04, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x2e, 0x04, + 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x22, 0x04, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x2e, 0x04, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x23, 0x04, 0x00, 0x00, 0x2e, 0x04, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x30, 0x04, 0x00, 0x00, 0x56, 0x00, + 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x31, 0x04, 0x00, 0x00, 0x30, 0x04, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, + 0x08, 0x01, 0x00, 0x00, 0x32, 0x04, 0x00, 0x00, 0x31, 0x04, 0x00, 0x00, 0x33, 0x04, 0x00, 0x00, 0x31, 0x04, 0x00, 0x00, 0x32, 0x04, 0x00, 0x00, 0x32, 0x04, + 0x00, 0x00, 0x34, 0x04, 0x00, 0x00, 0x33, 0x04, 0x00, 0x00, 0x33, 0x04, 0x00, 0x00, 0x34, 0x04, 0x00, 0x00, 0x35, 0x04, 0x00, 0x00, 0x35, 0x04, 0x00, 0x00, + 0x36, 0x04, 0x00, 0x00, 0x33, 0x04, 0x00, 0x00, 0x37, 0x04, 0x00, 0x00, 0x38, 0x04, 0x00, 0x00, 0x36, 0x04, 0x00, 0x00, 0x36, 0x04, 0x00, 0x00, 0x35, 0x04, + 0x00, 0x00, 0x37, 0x04, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x39, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, + 0x68, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x57, 0x00, + 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x3a, 0x04, 0x00, 0x00, 0x3b, 0x04, 0x00, 0x00, 0x3b, 0x04, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, + 0x6c, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x3b, 0x04, + 0x00, 0x00, 0x3c, 0x04, 0x00, 0x00, 0x39, 0x04, 0x00, 0x00, 0x39, 0x04, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x3b, 0x04, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, + 0x6a, 0x00, 0x00, 0x00, 0x39, 0x04, 0x00, 0x00, 0x39, 0x04, 0x00, 0x00, 0x3d, 0x04, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x3e, 0x04, 0x00, 0x00, 0x3f, 0x04, + 0x00, 0x00, 0x3c, 0x04, 0x00, 0x00, 0x3c, 0x04, 0x00, 0x00, 0x3b, 0x04, 0x00, 0x00, 0x3e, 0x04, 0x00, 0x00, 0x3d, 0x04, 0x00, 0x00, 0x39, 0x04, 0x00, 0x00, + 0x3c, 0x04, 0x00, 0x00, 0x3c, 0x04, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x3d, 0x04, 0x00, 0x00, 0x41, 0x04, 0x00, 0x00, 0x42, 0x04, 0x00, 0x00, 0x3f, 0x04, + 0x00, 0x00, 0x3f, 0x04, 0x00, 0x00, 0x3e, 0x04, 0x00, 0x00, 0x41, 0x04, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x3c, 0x04, 0x00, 0x00, 0x3f, 0x04, 0x00, 0x00, + 0x3f, 0x04, 0x00, 0x00, 0x43, 0x04, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x3a, 0x04, 0x00, 0x00, 0x44, 0x04, 0x00, 0x00, 0x3e, 0x04, 0x00, 0x00, 0x3e, 0x04, + 0x00, 0x00, 0x3b, 0x04, 0x00, 0x00, 0x3a, 0x04, 0x00, 0x00, 0x42, 0x04, 0x00, 0x00, 0x41, 0x04, 0x00, 0x00, 0x45, 0x04, 0x00, 0x00, 0x45, 0x04, 0x00, 0x00, + 0x46, 0x04, 0x00, 0x00, 0x42, 0x04, 0x00, 0x00, 0x43, 0x04, 0x00, 0x00, 0x3f, 0x04, 0x00, 0x00, 0x42, 0x04, 0x00, 0x00, 0x42, 0x04, 0x00, 0x00, 0x47, 0x04, + 0x00, 0x00, 0x43, 0x04, 0x00, 0x00, 0x44, 0x04, 0x00, 0x00, 0x48, 0x04, 0x00, 0x00, 0x41, 0x04, 0x00, 0x00, 0x41, 0x04, 0x00, 0x00, 0x3e, 0x04, 0x00, 0x00, + 0x44, 0x04, 0x00, 0x00, 0x48, 0x04, 0x00, 0x00, 0x49, 0x04, 0x00, 0x00, 0x45, 0x04, 0x00, 0x00, 0x45, 0x04, 0x00, 0x00, 0x41, 0x04, 0x00, 0x00, 0x48, 0x04, + 0x00, 0x00, 0x4a, 0x04, 0x00, 0x00, 0x4b, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x45, 0x04, 0x00, 0x00, 0x4a, 0x04, 0x00, 0x00, + 0x47, 0x04, 0x00, 0x00, 0x42, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x46, 0x04, 0x00, 0x00, 0x4c, 0x04, 0x00, 0x00, 0x47, 0x04, 0x00, 0x00, 0x4d, 0x04, + 0x00, 0x00, 0x4e, 0x04, 0x00, 0x00, 0x4b, 0x04, 0x00, 0x00, 0x4b, 0x04, 0x00, 0x00, 0x4a, 0x04, 0x00, 0x00, 0x4d, 0x04, 0x00, 0x00, 0x4c, 0x04, 0x00, 0x00, + 0x46, 0x04, 0x00, 0x00, 0x4b, 0x04, 0x00, 0x00, 0x4b, 0x04, 0x00, 0x00, 0x4f, 0x04, 0x00, 0x00, 0x4c, 0x04, 0x00, 0x00, 0x49, 0x04, 0x00, 0x00, 0x50, 0x04, + 0x00, 0x00, 0x4a, 0x04, 0x00, 0x00, 0x4a, 0x04, 0x00, 0x00, 0x45, 0x04, 0x00, 0x00, 0x49, 0x04, 0x00, 0x00, 0x36, 0x04, 0x00, 0x00, 0x38, 0x04, 0x00, 0x00, + 0x50, 0x04, 0x00, 0x00, 0x50, 0x04, 0x00, 0x00, 0x49, 0x04, 0x00, 0x00, 0x36, 0x04, 0x00, 0x00, 0x4d, 0x04, 0x00, 0x00, 0x4a, 0x04, 0x00, 0x00, 0x50, 0x04, + 0x00, 0x00, 0x50, 0x04, 0x00, 0x00, 0x51, 0x04, 0x00, 0x00, 0x4d, 0x04, 0x00, 0x00, 0x33, 0x04, 0x00, 0x00, 0x36, 0x04, 0x00, 0x00, 0x49, 0x04, 0x00, 0x00, + 0x49, 0x04, 0x00, 0x00, 0x48, 0x04, 0x00, 0x00, 0x33, 0x04, 0x00, 0x00, 0x31, 0x04, 0x00, 0x00, 0x33, 0x04, 0x00, 0x00, 0x48, 0x04, 0x00, 0x00, 0x48, 0x04, + 0x00, 0x00, 0x44, 0x04, 0x00, 0x00, 0x31, 0x04, 0x00, 0x00, 0x30, 0x04, 0x00, 0x00, 0x31, 0x04, 0x00, 0x00, 0x44, 0x04, 0x00, 0x00, 0x44, 0x04, 0x00, 0x00, + 0x3a, 0x04, 0x00, 0x00, 0x30, 0x04, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x30, 0x04, 0x00, 0x00, 0x3a, 0x04, 0x00, 0x00, 0x3a, 0x04, 0x00, 0x00, 0x69, 0x00, + 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x52, 0x04, 0x00, 0x00, 0x53, 0x04, 0x00, 0x00, 0x38, 0x04, 0x00, 0x00, 0x38, 0x04, 0x00, 0x00, 0x37, 0x04, 0x00, 0x00, + 0x52, 0x04, 0x00, 0x00, 0x51, 0x04, 0x00, 0x00, 0x50, 0x04, 0x00, 0x00, 0x38, 0x04, 0x00, 0x00, 0x38, 0x04, 0x00, 0x00, 0x53, 0x04, 0x00, 0x00, 0x51, 0x04, + 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, + 0x4f, 0x04, 0x00, 0x00, 0x4b, 0x04, 0x00, 0x00, 0x4e, 0x04, 0x00, 0x00, 0x4e, 0x04, 0x00, 0x00, 0x54, 0x04, 0x00, 0x00, 0x4f, 0x04, 0x00, 0x00, 0x55, 0x04, + 0x00, 0x00, 0x4c, 0x04, 0x00, 0x00, 0x4f, 0x04, 0x00, 0x00, 0x4f, 0x04, 0x00, 0x00, 0x56, 0x04, 0x00, 0x00, 0x55, 0x04, 0x00, 0x00, 0x57, 0x04, 0x00, 0x00, + 0x47, 0x04, 0x00, 0x00, 0x4c, 0x04, 0x00, 0x00, 0x4c, 0x04, 0x00, 0x00, 0x55, 0x04, 0x00, 0x00, 0x57, 0x04, 0x00, 0x00, 0x58, 0x04, 0x00, 0x00, 0x43, 0x04, + 0x00, 0x00, 0x47, 0x04, 0x00, 0x00, 0x47, 0x04, 0x00, 0x00, 0x57, 0x04, 0x00, 0x00, 0x58, 0x04, 0x00, 0x00, 0x59, 0x04, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, + 0x43, 0x04, 0x00, 0x00, 0x43, 0x04, 0x00, 0x00, 0x58, 0x04, 0x00, 0x00, 0x59, 0x04, 0x00, 0x00, 0x5a, 0x04, 0x00, 0x00, 0x3d, 0x04, 0x00, 0x00, 0x40, 0x04, + 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x59, 0x04, 0x00, 0x00, 0x5a, 0x04, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x3d, 0x04, 0x00, 0x00, + 0x3d, 0x04, 0x00, 0x00, 0x5a, 0x04, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x5b, 0x04, 0x00, 0x00, 0x5c, 0x04, 0x00, 0x00, 0x5c, 0x04, + 0x00, 0x00, 0x5d, 0x04, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x5e, 0x04, 0x00, 0x00, 0x5b, 0x04, 0x00, 0x00, 0x5b, 0x04, 0x00, 0x00, + 0x77, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x5c, 0x04, 0x00, 0x00, 0x5b, 0x04, 0x00, 0x00, 0x5f, 0x04, 0x00, 0x00, 0x5f, 0x04, 0x00, 0x00, 0x60, 0x04, + 0x00, 0x00, 0x5c, 0x04, 0x00, 0x00, 0x61, 0x04, 0x00, 0x00, 0x5d, 0x04, 0x00, 0x00, 0x5c, 0x04, 0x00, 0x00, 0x5c, 0x04, 0x00, 0x00, 0x62, 0x04, 0x00, 0x00, + 0x61, 0x04, 0x00, 0x00, 0x63, 0x04, 0x00, 0x00, 0x64, 0x04, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x5d, 0x04, 0x00, 0x00, 0x63, 0x04, + 0x00, 0x00, 0x65, 0x04, 0x00, 0x00, 0x66, 0x04, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x65, 0x04, 0x00, 0x00, + 0x67, 0x04, 0x00, 0x00, 0x68, 0x04, 0x00, 0x00, 0x66, 0x04, 0x00, 0x00, 0x66, 0x04, 0x00, 0x00, 0x65, 0x04, 0x00, 0x00, 0x67, 0x04, 0x00, 0x00, 0x69, 0x04, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x66, 0x04, 0x00, 0x00, 0x69, 0x04, 0x00, 0x00, 0x6a, 0x04, 0x00, 0x00, + 0x65, 0x04, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x6a, 0x04, 0x00, 0x00, 0x60, 0x04, 0x00, 0x00, 0x5f, 0x04, + 0x00, 0x00, 0x68, 0x04, 0x00, 0x00, 0x68, 0x04, 0x00, 0x00, 0x67, 0x04, 0x00, 0x00, 0x60, 0x04, 0x00, 0x00, 0x6b, 0x04, 0x00, 0x00, 0x69, 0x04, 0x00, 0x00, + 0x66, 0x04, 0x00, 0x00, 0x66, 0x04, 0x00, 0x00, 0x68, 0x04, 0x00, 0x00, 0x6b, 0x04, 0x00, 0x00, 0x6c, 0x04, 0x00, 0x00, 0x67, 0x04, 0x00, 0x00, 0x65, 0x04, + 0x00, 0x00, 0x65, 0x04, 0x00, 0x00, 0x6a, 0x04, 0x00, 0x00, 0x6c, 0x04, 0x00, 0x00, 0x6d, 0x04, 0x00, 0x00, 0x6b, 0x04, 0x00, 0x00, 0x68, 0x04, 0x00, 0x00, + 0x68, 0x04, 0x00, 0x00, 0x5f, 0x04, 0x00, 0x00, 0x6d, 0x04, 0x00, 0x00, 0x6e, 0x04, 0x00, 0x00, 0x60, 0x04, 0x00, 0x00, 0x67, 0x04, 0x00, 0x00, 0x67, 0x04, + 0x00, 0x00, 0x6c, 0x04, 0x00, 0x00, 0x6e, 0x04, 0x00, 0x00, 0x5e, 0x04, 0x00, 0x00, 0x6d, 0x04, 0x00, 0x00, 0x5f, 0x04, 0x00, 0x00, 0x5f, 0x04, 0x00, 0x00, + 0x5b, 0x04, 0x00, 0x00, 0x5e, 0x04, 0x00, 0x00, 0x62, 0x04, 0x00, 0x00, 0x5c, 0x04, 0x00, 0x00, 0x60, 0x04, 0x00, 0x00, 0x60, 0x04, 0x00, 0x00, 0x6e, 0x04, + 0x00, 0x00, 0x62, 0x04, 0x00, 0x00, 0x6f, 0x04, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x64, 0x04, 0x00, 0x00, 0x64, 0x04, 0x00, 0x00, 0x63, 0x04, 0x00, 0x00, + 0x6f, 0x04, 0x00, 0x00, 0x70, 0x04, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x64, 0x04, 0x00, 0x00, 0x70, 0x04, + 0x00, 0x00, 0x71, 0x04, 0x00, 0x00, 0x63, 0x04, 0x00, 0x00, 0x5d, 0x04, 0x00, 0x00, 0x5d, 0x04, 0x00, 0x00, 0x61, 0x04, 0x00, 0x00, 0x71, 0x04, 0x00, 0x00, + 0x72, 0x04, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x69, 0x04, 0x00, 0x00, 0x72, 0x04, 0x00, 0x00, 0x69, 0x04, + 0x00, 0x00, 0x6b, 0x04, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x72, 0x04, 0x00, 0x00, 0x69, 0x04, 0x00, 0x00, 0x6b, 0x04, 0x00, 0x00, + 0x6d, 0x04, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x6b, 0x04, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x73, 0x04, + 0x00, 0x00, 0x74, 0x04, 0x00, 0x00, 0x74, 0x04, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x73, 0x04, 0x00, 0x00, 0x75, 0x04, 0x00, 0x00, + 0x76, 0x04, 0x00, 0x00, 0x76, 0x04, 0x00, 0x00, 0x74, 0x04, 0x00, 0x00, 0x73, 0x04, 0x00, 0x00, 0x76, 0x04, 0x00, 0x00, 0x75, 0x04, 0x00, 0x00, 0x77, 0x04, + 0x00, 0x00, 0x77, 0x04, 0x00, 0x00, 0x78, 0x04, 0x00, 0x00, 0x76, 0x04, 0x00, 0x00, 0x77, 0x04, 0x00, 0x00, 0x79, 0x04, 0x00, 0x00, 0x7a, 0x04, 0x00, 0x00, + 0x7a, 0x04, 0x00, 0x00, 0x78, 0x04, 0x00, 0x00, 0x77, 0x04, 0x00, 0x00, 0x6d, 0x04, 0x00, 0x00, 0x5e, 0x04, 0x00, 0x00, 0x73, 0x04, 0x00, 0x00, 0x73, 0x04, + 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x6d, 0x04, 0x00, 0x00, 0x5e, 0x04, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x75, 0x04, 0x00, 0x00, 0x75, 0x04, 0x00, 0x00, + 0x73, 0x04, 0x00, 0x00, 0x5e, 0x04, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x77, 0x04, 0x00, 0x00, 0x77, 0x04, 0x00, 0x00, 0x75, 0x04, + 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x70, 0x04, 0x00, 0x00, 0x79, 0x04, 0x00, 0x00, 0x79, 0x04, 0x00, 0x00, 0x77, 0x04, 0x00, 0x00, + 0x75, 0x00, 0x00, 0x00, 0x64, 0x04, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x70, 0x04, 0x00, 0x00, 0x64, 0x04, + 0x00, 0x00, 0x7b, 0x04, 0x00, 0x00, 0x79, 0x04, 0x00, 0x00, 0x70, 0x04, 0x00, 0x00, 0x70, 0x04, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x7b, 0x04, 0x00, 0x00, + 0x7c, 0x04, 0x00, 0x00, 0x7a, 0x04, 0x00, 0x00, 0x79, 0x04, 0x00, 0x00, 0x79, 0x04, 0x00, 0x00, 0x7b, 0x04, 0x00, 0x00, 0x7c, 0x04, 0x00, 0x00, 0x7d, 0x04, + 0x00, 0x00, 0x6a, 0x04, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x7d, 0x04, 0x00, 0x00, 0x7e, 0x04, 0x00, 0x00, + 0x6c, 0x04, 0x00, 0x00, 0x6a, 0x04, 0x00, 0x00, 0x6a, 0x04, 0x00, 0x00, 0x7d, 0x04, 0x00, 0x00, 0x7e, 0x04, 0x00, 0x00, 0x7f, 0x04, 0x00, 0x00, 0x6e, 0x04, + 0x00, 0x00, 0x6c, 0x04, 0x00, 0x00, 0x6c, 0x04, 0x00, 0x00, 0x7e, 0x04, 0x00, 0x00, 0x7f, 0x04, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x62, 0x04, 0x00, 0x00, + 0x6e, 0x04, 0x00, 0x00, 0x6e, 0x04, 0x00, 0x00, 0x7f, 0x04, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x81, 0x04, 0x00, 0x00, 0x61, 0x04, 0x00, 0x00, 0x62, 0x04, + 0x00, 0x00, 0x62, 0x04, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x81, 0x04, 0x00, 0x00, 0x82, 0x04, 0x00, 0x00, 0x6f, 0x04, 0x00, 0x00, 0x63, 0x04, 0x00, 0x00, + 0x63, 0x04, 0x00, 0x00, 0x71, 0x04, 0x00, 0x00, 0x82, 0x04, 0x00, 0x00, 0x83, 0x04, 0x00, 0x00, 0x71, 0x04, 0x00, 0x00, 0x61, 0x04, 0x00, 0x00, 0x61, 0x04, + 0x00, 0x00, 0x81, 0x04, 0x00, 0x00, 0x83, 0x04, 0x00, 0x00, 0x84, 0x04, 0x00, 0x00, 0x85, 0x04, 0x00, 0x00, 0x86, 0x04, 0x00, 0x00, 0x86, 0x04, 0x00, 0x00, + 0x87, 0x04, 0x00, 0x00, 0x84, 0x04, 0x00, 0x00, 0x88, 0x04, 0x00, 0x00, 0x89, 0x04, 0x00, 0x00, 0x85, 0x04, 0x00, 0x00, 0x85, 0x04, 0x00, 0x00, 0x84, 0x04, + 0x00, 0x00, 0x88, 0x04, 0x00, 0x00, 0x8a, 0x04, 0x00, 0x00, 0x86, 0x04, 0x00, 0x00, 0x85, 0x04, 0x00, 0x00, 0x85, 0x04, 0x00, 0x00, 0x8b, 0x04, 0x00, 0x00, + 0x8a, 0x04, 0x00, 0x00, 0x87, 0x04, 0x00, 0x00, 0x86, 0x04, 0x00, 0x00, 0x8c, 0x04, 0x00, 0x00, 0x8c, 0x04, 0x00, 0x00, 0x8d, 0x04, 0x00, 0x00, 0x87, 0x04, + 0x00, 0x00, 0x87, 0x04, 0x00, 0x00, 0x8e, 0x04, 0x00, 0x00, 0x8f, 0x04, 0x00, 0x00, 0x8f, 0x04, 0x00, 0x00, 0x84, 0x04, 0x00, 0x00, 0x87, 0x04, 0x00, 0x00, + 0x90, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, 0x89, 0x04, 0x00, 0x00, 0x89, 0x04, 0x00, 0x00, 0x88, 0x04, 0x00, 0x00, 0x90, 0x04, 0x00, 0x00, 0x8b, 0x04, + 0x00, 0x00, 0x85, 0x04, 0x00, 0x00, 0x89, 0x04, 0x00, 0x00, 0x89, 0x04, 0x00, 0x00, 0x92, 0x04, 0x00, 0x00, 0x8b, 0x04, 0x00, 0x00, 0x84, 0x04, 0x00, 0x00, + 0x8f, 0x04, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, 0x88, 0x04, 0x00, 0x00, 0x84, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, 0x90, 0x04, + 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, 0x92, 0x04, 0x00, 0x00, 0x89, 0x04, 0x00, 0x00, + 0x91, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, 0x94, 0x04, 0x00, 0x00, 0x92, 0x04, 0x00, 0x00, 0x88, 0x04, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, 0x7a, 0x00, + 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x90, 0x04, 0x00, 0x00, 0x88, 0x04, 0x00, 0x00, 0x95, 0x04, 0x00, 0x00, 0x8c, 0x04, 0x00, 0x00, 0x86, 0x04, 0x00, 0x00, + 0x86, 0x04, 0x00, 0x00, 0x8a, 0x04, 0x00, 0x00, 0x95, 0x04, 0x00, 0x00, 0x96, 0x04, 0x00, 0x00, 0x97, 0x04, 0x00, 0x00, 0x8d, 0x04, 0x00, 0x00, 0x8d, 0x04, + 0x00, 0x00, 0x8c, 0x04, 0x00, 0x00, 0x96, 0x04, 0x00, 0x00, 0x8d, 0x04, 0x00, 0x00, 0x98, 0x04, 0x00, 0x00, 0x8e, 0x04, 0x00, 0x00, 0x8e, 0x04, 0x00, 0x00, + 0x87, 0x04, 0x00, 0x00, 0x8d, 0x04, 0x00, 0x00, 0x97, 0x04, 0x00, 0x00, 0x96, 0x04, 0x00, 0x00, 0x99, 0x04, 0x00, 0x00, 0x99, 0x04, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0x97, 0x04, 0x00, 0x00, 0x97, 0x04, 0x00, 0x00, 0x9b, 0x04, 0x00, 0x00, 0x98, 0x04, 0x00, 0x00, 0x98, 0x04, 0x00, 0x00, 0x8d, 0x04, 0x00, 0x00, + 0x97, 0x04, 0x00, 0x00, 0x9c, 0x04, 0x00, 0x00, 0x96, 0x04, 0x00, 0x00, 0x8c, 0x04, 0x00, 0x00, 0x8c, 0x04, 0x00, 0x00, 0x95, 0x04, 0x00, 0x00, 0x9c, 0x04, + 0x00, 0x00, 0x9d, 0x04, 0x00, 0x00, 0x99, 0x04, 0x00, 0x00, 0x96, 0x04, 0x00, 0x00, 0x96, 0x04, 0x00, 0x00, 0x9c, 0x04, 0x00, 0x00, 0x9d, 0x04, 0x00, 0x00, + 0x9a, 0x04, 0x00, 0x00, 0x99, 0x04, 0x00, 0x00, 0x9e, 0x04, 0x00, 0x00, 0x9e, 0x04, 0x00, 0x00, 0x9f, 0x04, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x9a, 0x04, + 0x00, 0x00, 0xa0, 0x04, 0x00, 0x00, 0x9b, 0x04, 0x00, 0x00, 0x9b, 0x04, 0x00, 0x00, 0x97, 0x04, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, + 0x7d, 0x04, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, 0x8f, 0x04, 0x00, 0x00, 0x7e, 0x04, + 0x00, 0x00, 0x7d, 0x04, 0x00, 0x00, 0x7d, 0x04, 0x00, 0x00, 0x93, 0x04, 0x00, 0x00, 0x8f, 0x04, 0x00, 0x00, 0x8e, 0x04, 0x00, 0x00, 0x7f, 0x04, 0x00, 0x00, + 0x7e, 0x04, 0x00, 0x00, 0x7e, 0x04, 0x00, 0x00, 0x8f, 0x04, 0x00, 0x00, 0x8e, 0x04, 0x00, 0x00, 0x98, 0x04, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x7f, 0x04, + 0x00, 0x00, 0x7f, 0x04, 0x00, 0x00, 0x8e, 0x04, 0x00, 0x00, 0x98, 0x04, 0x00, 0x00, 0x9b, 0x04, 0x00, 0x00, 0x81, 0x04, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, + 0x80, 0x04, 0x00, 0x00, 0x98, 0x04, 0x00, 0x00, 0x9b, 0x04, 0x00, 0x00, 0xa1, 0x04, 0x00, 0x00, 0x82, 0x04, 0x00, 0x00, 0x71, 0x04, 0x00, 0x00, 0x71, 0x04, + 0x00, 0x00, 0x83, 0x04, 0x00, 0x00, 0xa1, 0x04, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x00, 0x83, 0x04, 0x00, 0x00, 0x81, 0x04, 0x00, 0x00, 0x81, 0x04, 0x00, 0x00, + 0x9b, 0x04, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x00, 0x56, 0x04, 0x00, 0x00, 0x4f, 0x04, 0x00, 0x00, 0x54, 0x04, 0x00, 0x00, 0x54, 0x04, 0x00, 0x00, 0xa2, 0x04, + 0x00, 0x00, 0x56, 0x04, 0x00, 0x00, 0xa3, 0x04, 0x00, 0x00, 0x55, 0x04, 0x00, 0x00, 0x56, 0x04, 0x00, 0x00, 0x56, 0x04, 0x00, 0x00, 0xa4, 0x04, 0x00, 0x00, + 0xa3, 0x04, 0x00, 0x00, 0xa5, 0x04, 0x00, 0x00, 0x57, 0x04, 0x00, 0x00, 0x55, 0x04, 0x00, 0x00, 0x55, 0x04, 0x00, 0x00, 0xa3, 0x04, 0x00, 0x00, 0xa5, 0x04, + 0x00, 0x00, 0xa6, 0x04, 0x00, 0x00, 0x58, 0x04, 0x00, 0x00, 0x57, 0x04, 0x00, 0x00, 0x57, 0x04, 0x00, 0x00, 0xa5, 0x04, 0x00, 0x00, 0xa6, 0x04, 0x00, 0x00, + 0xa7, 0x04, 0x00, 0x00, 0x59, 0x04, 0x00, 0x00, 0x58, 0x04, 0x00, 0x00, 0x58, 0x04, 0x00, 0x00, 0xa6, 0x04, 0x00, 0x00, 0xa7, 0x04, 0x00, 0x00, 0xa8, 0x04, + 0x00, 0x00, 0x5a, 0x04, 0x00, 0x00, 0x59, 0x04, 0x00, 0x00, 0x59, 0x04, 0x00, 0x00, 0xa7, 0x04, 0x00, 0x00, 0xa8, 0x04, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, + 0x6b, 0x00, 0x00, 0x00, 0x5a, 0x04, 0x00, 0x00, 0x5a, 0x04, 0x00, 0x00, 0xa8, 0x04, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0xa4, 0x04, 0x00, 0x00, 0x56, 0x04, + 0x00, 0x00, 0xa2, 0x04, 0x00, 0x00, 0xa2, 0x04, 0x00, 0x00, 0xa9, 0x04, 0x00, 0x00, 0xa4, 0x04, 0x00, 0x00, 0xaa, 0x04, 0x00, 0x00, 0xa3, 0x04, 0x00, 0x00, + 0xa4, 0x04, 0x00, 0x00, 0xa4, 0x04, 0x00, 0x00, 0xab, 0x04, 0x00, 0x00, 0xaa, 0x04, 0x00, 0x00, 0xac, 0x04, 0x00, 0x00, 0xa5, 0x04, 0x00, 0x00, 0xa3, 0x04, + 0x00, 0x00, 0xa3, 0x04, 0x00, 0x00, 0xaa, 0x04, 0x00, 0x00, 0xac, 0x04, 0x00, 0x00, 0xad, 0x04, 0x00, 0x00, 0xa6, 0x04, 0x00, 0x00, 0xa5, 0x04, 0x00, 0x00, + 0xa5, 0x04, 0x00, 0x00, 0xac, 0x04, 0x00, 0x00, 0xad, 0x04, 0x00, 0x00, 0xae, 0x04, 0x00, 0x00, 0xa7, 0x04, 0x00, 0x00, 0xa6, 0x04, 0x00, 0x00, 0xa6, 0x04, + 0x00, 0x00, 0xad, 0x04, 0x00, 0x00, 0xae, 0x04, 0x00, 0x00, 0xaf, 0x04, 0x00, 0x00, 0xa8, 0x04, 0x00, 0x00, 0xa7, 0x04, 0x00, 0x00, 0xa7, 0x04, 0x00, 0x00, + 0xae, 0x04, 0x00, 0x00, 0xaf, 0x04, 0x00, 0x00, 0xb0, 0x04, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0xa8, 0x04, 0x00, 0x00, 0xa8, 0x04, 0x00, 0x00, 0xaf, 0x04, + 0x00, 0x00, 0xb0, 0x04, 0x00, 0x00, 0xb1, 0x04, 0x00, 0x00, 0xa1, 0x04, 0x00, 0x00, 0x83, 0x04, 0x00, 0x00, 0x83, 0x04, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x00, + 0xb1, 0x04, 0x00, 0x00, 0x9f, 0x04, 0x00, 0x00, 0xb1, 0x04, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x00, 0xa0, 0x04, 0x00, 0x00, 0x9a, 0x04, 0x00, 0x00, 0x9f, 0x04, + 0x00, 0x00, 0xab, 0x04, 0x00, 0x00, 0xa4, 0x04, 0x00, 0x00, 0xa9, 0x04, 0x00, 0x00, 0xa9, 0x04, 0x00, 0x00, 0xb2, 0x04, 0x00, 0x00, 0xab, 0x04, 0x00, 0x00, + 0x9c, 0x04, 0x00, 0x00, 0xaa, 0x04, 0x00, 0x00, 0xab, 0x04, 0x00, 0x00, 0xab, 0x04, 0x00, 0x00, 0x9d, 0x04, 0x00, 0x00, 0x9c, 0x04, 0x00, 0x00, 0x95, 0x04, + 0x00, 0x00, 0xac, 0x04, 0x00, 0x00, 0xaa, 0x04, 0x00, 0x00, 0xaa, 0x04, 0x00, 0x00, 0x9c, 0x04, 0x00, 0x00, 0x95, 0x04, 0x00, 0x00, 0x8a, 0x04, 0x00, 0x00, + 0xad, 0x04, 0x00, 0x00, 0xac, 0x04, 0x00, 0x00, 0xac, 0x04, 0x00, 0x00, 0x95, 0x04, 0x00, 0x00, 0x8a, 0x04, 0x00, 0x00, 0x8b, 0x04, 0x00, 0x00, 0xae, 0x04, + 0x00, 0x00, 0xad, 0x04, 0x00, 0x00, 0xad, 0x04, 0x00, 0x00, 0x8a, 0x04, 0x00, 0x00, 0x8b, 0x04, 0x00, 0x00, 0x92, 0x04, 0x00, 0x00, 0xaf, 0x04, 0x00, 0x00, + 0xae, 0x04, 0x00, 0x00, 0xae, 0x04, 0x00, 0x00, 0x8b, 0x04, 0x00, 0x00, 0x92, 0x04, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0xb0, 0x04, + 0x00, 0x00, 0xb0, 0x04, 0x00, 0x00, 0x94, 0x04, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x94, 0x04, 0x00, 0x00, 0xb0, 0x04, 0x00, 0x00, 0xaf, 0x04, 0x00, 0x00, + 0xaf, 0x04, 0x00, 0x00, 0x92, 0x04, 0x00, 0x00, 0x94, 0x04, 0x00, 0x00, 0x94, 0x04, 0x00, 0x00, 0x91, 0x04, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x7b, 0x00, + 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x94, 0x04, 0x00, 0x00, 0x9d, 0x04, 0x00, 0x00, 0xab, 0x04, 0x00, 0x00, 0xb2, 0x04, 0x00, 0x00, 0xb2, 0x04, 0x00, 0x00, + 0xb3, 0x04, 0x00, 0x00, 0x9d, 0x04, 0x00, 0x00, 0xb3, 0x04, 0x00, 0x00, 0x9e, 0x04, 0x00, 0x00, 0x99, 0x04, 0x00, 0x00, 0x99, 0x04, 0x00, 0x00, 0x9d, 0x04, + 0x00, 0x00, 0xb3, 0x04, 0x00, 0x00, 0xb4, 0x04, 0x00, 0x00, 0xb5, 0x04, 0x00, 0x00, 0xb6, 0x04, 0x00, 0x00, 0xb6, 0x04, 0x00, 0x00, 0xb7, 0x04, 0x00, 0x00, + 0xb4, 0x04, 0x00, 0x00, 0xb8, 0x04, 0x00, 0x00, 0xb9, 0x04, 0x00, 0x00, 0xba, 0x04, 0x00, 0x00, 0xba, 0x04, 0x00, 0x00, 0xbb, 0x04, 0x00, 0x00, 0xb8, 0x04, + 0x00, 0x00, 0xb7, 0x04, 0x00, 0x00, 0xb6, 0x04, 0x00, 0x00, 0xbc, 0x04, 0x00, 0x00, 0xbc, 0x04, 0x00, 0x00, 0xbd, 0x04, 0x00, 0x00, 0xb7, 0x04, 0x00, 0x00, + 0xbd, 0x04, 0x00, 0x00, 0xbc, 0x04, 0x00, 0x00, 0xb9, 0x04, 0x00, 0x00, 0xb9, 0x04, 0x00, 0x00, 0xb8, 0x04, 0x00, 0x00, 0xbd, 0x04, 0x00, 0x00, 0xac, 0x02, + 0x00, 0x00, 0xbe, 0x04, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0xac, 0x02, 0x00, 0x00, 0xbb, 0x04, 0x00, 0x00, + 0xba, 0x04, 0x00, 0x00, 0xbf, 0x04, 0x00, 0x00, 0xbf, 0x04, 0x00, 0x00, 0xb8, 0x02, 0x00, 0x00, 0xbb, 0x04, 0x00, 0x00, 0xb8, 0x02, 0x00, 0x00, 0xbf, 0x04, + 0x00, 0x00, 0xc0, 0x04, 0x00, 0x00, 0xc0, 0x04, 0x00, 0x00, 0xb7, 0x02, 0x00, 0x00, 0xb8, 0x02, 0x00, 0x00, 0xb7, 0x02, 0x00, 0x00, 0xc0, 0x04, 0x00, 0x00, + 0xc1, 0x04, 0x00, 0x00, 0xc1, 0x04, 0x00, 0x00, 0xc2, 0x04, 0x00, 0x00, 0xb7, 0x02, 0x00, 0x00, 0xc2, 0x04, 0x00, 0x00, 0xc1, 0x04, 0x00, 0x00, 0xc3, 0x04, + 0x00, 0x00, 0xc3, 0x04, 0x00, 0x00, 0xc4, 0x04, 0x00, 0x00, 0xc2, 0x04, 0x00, 0x00, 0xc4, 0x04, 0x00, 0x00, 0xc3, 0x04, 0x00, 0x00, 0xc5, 0x04, 0x00, 0x00, + 0xc5, 0x04, 0x00, 0x00, 0xc6, 0x04, 0x00, 0x00, 0xc4, 0x04, 0x00, 0x00, 0xc6, 0x04, 0x00, 0x00, 0xc5, 0x04, 0x00, 0x00, 0xc7, 0x04, 0x00, 0x00, 0xc7, 0x04, + 0x00, 0x00, 0xc8, 0x04, 0x00, 0x00, 0xc6, 0x04, 0x00, 0x00, 0xc8, 0x04, 0x00, 0x00, 0xc7, 0x04, 0x00, 0x00, 0xbe, 0x04, 0x00, 0x00, 0xbe, 0x04, 0x00, 0x00, + 0xac, 0x02, 0x00, 0x00, 0xc8, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0xc9, 0x04, 0x00, 0x00, 0xc9, 0x04, 0x00, 0x00, 0xca, 0x04, + 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0xca, 0x04, 0x00, 0x00, 0xc9, 0x04, 0x00, 0x00, 0xcb, 0x04, 0x00, 0x00, 0xcb, 0x04, 0x00, 0x00, 0xcc, 0x04, 0x00, 0x00, + 0xca, 0x04, 0x00, 0x00, 0xcc, 0x04, 0x00, 0x00, 0xcb, 0x04, 0x00, 0x00, 0xb5, 0x04, 0x00, 0x00, 0xb5, 0x04, 0x00, 0x00, 0xb4, 0x04, 0x00, 0x00, 0xcc, 0x04, + 0x00, 0x00, 0xc1, 0x04, 0x00, 0x00, 0xcd, 0x04, 0x00, 0x00, 0xce, 0x04, 0x00, 0x00, 0xce, 0x04, 0x00, 0x00, 0xc3, 0x04, 0x00, 0x00, 0xc1, 0x04, 0x00, 0x00, + 0xc3, 0x04, 0x00, 0x00, 0xce, 0x04, 0x00, 0x00, 0xcf, 0x04, 0x00, 0x00, 0xcf, 0x04, 0x00, 0x00, 0xc5, 0x04, 0x00, 0x00, 0xc3, 0x04, 0x00, 0x00, 0xc5, 0x04, + 0x00, 0x00, 0xcf, 0x04, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0xc7, 0x04, 0x00, 0x00, 0xc5, 0x04, 0x00, 0x00, 0xc7, 0x04, 0x00, 0x00, + 0x87, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0xbe, 0x04, 0x00, 0x00, 0xc7, 0x04, 0x00, 0x00, 0xbe, 0x04, 0x00, 0x00, 0x89, 0x00, + 0x00, 0x00, 0xd0, 0x04, 0x00, 0x00, 0xd0, 0x04, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0xbe, 0x04, 0x00, 0x00, 0xc0, 0x04, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, + 0xcd, 0x04, 0x00, 0x00, 0xcd, 0x04, 0x00, 0x00, 0xc1, 0x04, 0x00, 0x00, 0xc0, 0x04, 0x00, 0x00, 0xbf, 0x04, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x8e, 0x00, + 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0xc0, 0x04, 0x00, 0x00, 0xbf, 0x04, 0x00, 0x00, 0xba, 0x04, 0x00, 0x00, 0xd1, 0x04, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, + 0x8f, 0x00, 0x00, 0x00, 0xbf, 0x04, 0x00, 0x00, 0xba, 0x04, 0x00, 0x00, 0xb9, 0x04, 0x00, 0x00, 0xd2, 0x04, 0x00, 0x00, 0xd1, 0x04, 0x00, 0x00, 0xd1, 0x04, + 0x00, 0x00, 0xba, 0x04, 0x00, 0x00, 0xb9, 0x04, 0x00, 0x00, 0xbc, 0x04, 0x00, 0x00, 0xd3, 0x04, 0x00, 0x00, 0xd2, 0x04, 0x00, 0x00, 0xd2, 0x04, 0x00, 0x00, + 0xb9, 0x04, 0x00, 0x00, 0xbc, 0x04, 0x00, 0x00, 0xb6, 0x04, 0x00, 0x00, 0xd4, 0x04, 0x00, 0x00, 0xd3, 0x04, 0x00, 0x00, 0xd3, 0x04, 0x00, 0x00, 0xbc, 0x04, + 0x00, 0x00, 0xb6, 0x04, 0x00, 0x00, 0xb5, 0x04, 0x00, 0x00, 0xd5, 0x04, 0x00, 0x00, 0xd4, 0x04, 0x00, 0x00, 0xd4, 0x04, 0x00, 0x00, 0xb6, 0x04, 0x00, 0x00, + 0xb5, 0x04, 0x00, 0x00, 0xcb, 0x04, 0x00, 0x00, 0xd6, 0x04, 0x00, 0x00, 0xd5, 0x04, 0x00, 0x00, 0xd5, 0x04, 0x00, 0x00, 0xb5, 0x04, 0x00, 0x00, 0xcb, 0x04, + 0x00, 0x00, 0xc9, 0x04, 0x00, 0x00, 0xd7, 0x04, 0x00, 0x00, 0xd6, 0x04, 0x00, 0x00, 0xd6, 0x04, 0x00, 0x00, 0xcb, 0x04, 0x00, 0x00, 0xc9, 0x04, 0x00, 0x00, + 0x82, 0x00, 0x00, 0x00, 0xd0, 0x04, 0x00, 0x00, 0xd7, 0x04, 0x00, 0x00, 0xd7, 0x04, 0x00, 0x00, 0xc9, 0x04, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0xd4, 0x04, + 0x00, 0x00, 0xd5, 0x04, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0xd8, 0x04, 0x00, 0x00, 0xd4, 0x04, 0x00, 0x00, 0xd5, 0x04, 0x00, 0x00, + 0xd6, 0x04, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0xd5, 0x04, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x8b, 0x00, + 0x00, 0x00, 0xd9, 0x04, 0x00, 0x00, 0xd9, 0x04, 0x00, 0x00, 0xd8, 0x04, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0xda, 0x04, 0x00, 0x00, 0xd3, 0x04, 0x00, 0x00, + 0xd4, 0x04, 0x00, 0x00, 0xd4, 0x04, 0x00, 0x00, 0xd8, 0x04, 0x00, 0x00, 0xda, 0x04, 0x00, 0x00, 0xda, 0x04, 0x00, 0x00, 0xd1, 0x04, 0x00, 0x00, 0xd2, 0x04, + 0x00, 0x00, 0xd2, 0x04, 0x00, 0x00, 0xd3, 0x04, 0x00, 0x00, 0xda, 0x04, 0x00, 0x00, 0xda, 0x04, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, + 0x8f, 0x00, 0x00, 0x00, 0xd1, 0x04, 0x00, 0x00, 0xda, 0x04, 0x00, 0x00, 0xd7, 0x04, 0x00, 0x00, 0xd0, 0x04, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x89, 0x00, + 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0xd7, 0x04, 0x00, 0x00, 0xd6, 0x04, 0x00, 0x00, 0xd7, 0x04, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, + 0x8a, 0x00, 0x00, 0x00, 0xd6, 0x04, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0xcf, 0x04, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x88, 0x00, + 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0xcf, 0x04, 0x00, 0x00, 0xce, 0x04, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, + 0xcf, 0x04, 0x00, 0x00, 0xd9, 0x04, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, 0xda, 0x04, 0x00, 0x00, 0xda, 0x04, 0x00, 0x00, 0xd8, 0x04, 0x00, 0x00, 0xd9, 0x04, + 0x00, 0x00, 0xce, 0x04, 0x00, 0x00, 0xcd, 0x04, 0x00, 0x00, 0xd9, 0x04, 0x00, 0x00, 0xd9, 0x04, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0xce, 0x04, 0x00, 0x00, + 0xcd, 0x04, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, 0xd9, 0x04, 0x00, 0x00, 0xcd, 0x04, 0x00, 0x00, 0x7e, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xdb, 0x04, 0x00, 0x00, 0xdb, 0x04, 0x00, 0x00, 0x6e, 0x02, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0xdc, 0x04, 0x00, 0x00, + 0x6e, 0x02, 0x00, 0x00, 0xdb, 0x04, 0x00, 0x00, 0xdb, 0x04, 0x00, 0x00, 0xdd, 0x04, 0x00, 0x00, 0xdc, 0x04, 0x00, 0x00, 0xde, 0x04, 0x00, 0x00, 0xdc, 0x04, + 0x00, 0x00, 0xdd, 0x04, 0x00, 0x00, 0xdd, 0x04, 0x00, 0x00, 0xdf, 0x04, 0x00, 0x00, 0xde, 0x04, 0x00, 0x00, 0x53, 0x04, 0x00, 0x00, 0x52, 0x04, 0x00, 0x00, + 0xde, 0x04, 0x00, 0x00, 0xde, 0x04, 0x00, 0x00, 0xdf, 0x04, 0x00, 0x00, 0x53, 0x04, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0xe0, 0x04, 0x00, 0x00, + 0xe0, 0x04, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0xe1, 0x04, 0x00, 0x00, 0xe2, 0x04, 0x00, 0x00, 0xe2, 0x04, + 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, + 0x94, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0xe3, 0x04, 0x00, 0x00, 0xe0, 0x04, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x93, 0x00, + 0x00, 0x00, 0xe3, 0x04, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0xe0, 0x04, 0x00, 0x00, 0xe4, 0x04, 0x00, 0x00, 0xe4, 0x04, 0x00, 0x00, 0xe1, 0x04, 0x00, 0x00, + 0x91, 0x00, 0x00, 0x00, 0xe5, 0x04, 0x00, 0x00, 0xe4, 0x04, 0x00, 0x00, 0xe0, 0x04, 0x00, 0x00, 0xe0, 0x04, 0x00, 0x00, 0xe3, 0x04, 0x00, 0x00, 0xe5, 0x04, + 0x00, 0x00, 0xe1, 0x04, 0x00, 0x00, 0xe4, 0x04, 0x00, 0x00, 0xe6, 0x04, 0x00, 0x00, 0xe6, 0x04, 0x00, 0x00, 0xe7, 0x04, 0x00, 0x00, 0xe1, 0x04, 0x00, 0x00, + 0xe8, 0x04, 0x00, 0x00, 0xe6, 0x04, 0x00, 0x00, 0xe4, 0x04, 0x00, 0x00, 0xe4, 0x04, 0x00, 0x00, 0xe5, 0x04, 0x00, 0x00, 0xe8, 0x04, 0x00, 0x00, 0xe7, 0x04, + 0x00, 0x00, 0xe6, 0x04, 0x00, 0x00, 0xe9, 0x04, 0x00, 0x00, 0xe9, 0x04, 0x00, 0x00, 0xea, 0x04, 0x00, 0x00, 0xe7, 0x04, 0x00, 0x00, 0xe1, 0x04, 0x00, 0x00, + 0xe7, 0x04, 0x00, 0x00, 0xeb, 0x04, 0x00, 0x00, 0xeb, 0x04, 0x00, 0x00, 0xe2, 0x04, 0x00, 0x00, 0xe1, 0x04, 0x00, 0x00, 0xec, 0x04, 0x00, 0x00, 0xe9, 0x04, + 0x00, 0x00, 0xe6, 0x04, 0x00, 0x00, 0xe6, 0x04, 0x00, 0x00, 0xe8, 0x04, 0x00, 0x00, 0xec, 0x04, 0x00, 0x00, 0x4e, 0x04, 0x00, 0x00, 0x4d, 0x04, 0x00, 0x00, + 0xea, 0x04, 0x00, 0x00, 0xea, 0x04, 0x00, 0x00, 0xe9, 0x04, 0x00, 0x00, 0x4e, 0x04, 0x00, 0x00, 0xe7, 0x04, 0x00, 0x00, 0xea, 0x04, 0x00, 0x00, 0xed, 0x04, + 0x00, 0x00, 0xed, 0x04, 0x00, 0x00, 0xeb, 0x04, 0x00, 0x00, 0xe7, 0x04, 0x00, 0x00, 0xea, 0x04, 0x00, 0x00, 0x4d, 0x04, 0x00, 0x00, 0x51, 0x04, 0x00, 0x00, + 0x51, 0x04, 0x00, 0x00, 0xed, 0x04, 0x00, 0x00, 0xea, 0x04, 0x00, 0x00, 0x54, 0x04, 0x00, 0x00, 0x4e, 0x04, 0x00, 0x00, 0xe9, 0x04, 0x00, 0x00, 0xe9, 0x04, + 0x00, 0x00, 0xec, 0x04, 0x00, 0x00, 0x54, 0x04, 0x00, 0x00, 0xed, 0x04, 0x00, 0x00, 0x51, 0x04, 0x00, 0x00, 0x53, 0x04, 0x00, 0x00, 0x53, 0x04, 0x00, 0x00, + 0xdf, 0x04, 0x00, 0x00, 0xed, 0x04, 0x00, 0x00, 0xeb, 0x04, 0x00, 0x00, 0xed, 0x04, 0x00, 0x00, 0xdf, 0x04, 0x00, 0x00, 0xdf, 0x04, 0x00, 0x00, 0xdd, 0x04, + 0x00, 0x00, 0xeb, 0x04, 0x00, 0x00, 0xe2, 0x04, 0x00, 0x00, 0xeb, 0x04, 0x00, 0x00, 0xdd, 0x04, 0x00, 0x00, 0xdd, 0x04, 0x00, 0x00, 0xdb, 0x04, 0x00, 0x00, + 0xe2, 0x04, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xe2, 0x04, 0x00, 0x00, 0xdb, 0x04, 0x00, 0x00, 0xdb, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x90, 0x00, + 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, + 0xa2, 0x04, 0x00, 0x00, 0x54, 0x04, 0x00, 0x00, 0xec, 0x04, 0x00, 0x00, 0xec, 0x04, 0x00, 0x00, 0xee, 0x04, 0x00, 0x00, 0xa2, 0x04, 0x00, 0x00, 0xee, 0x04, + 0x00, 0x00, 0xec, 0x04, 0x00, 0x00, 0xe8, 0x04, 0x00, 0x00, 0xe8, 0x04, 0x00, 0x00, 0xef, 0x04, 0x00, 0x00, 0xee, 0x04, 0x00, 0x00, 0xef, 0x04, 0x00, 0x00, + 0xe8, 0x04, 0x00, 0x00, 0xe5, 0x04, 0x00, 0x00, 0xe5, 0x04, 0x00, 0x00, 0xf0, 0x04, 0x00, 0x00, 0xef, 0x04, 0x00, 0x00, 0xf0, 0x04, 0x00, 0x00, 0xe5, 0x04, + 0x00, 0x00, 0xe3, 0x04, 0x00, 0x00, 0xe3, 0x04, 0x00, 0x00, 0xf1, 0x04, 0x00, 0x00, 0xf0, 0x04, 0x00, 0x00, 0xf1, 0x04, 0x00, 0x00, 0xe3, 0x04, 0x00, 0x00, + 0x93, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0xf1, 0x04, 0x00, 0x00, 0x6f, 0x04, 0x00, 0x00, 0xf2, 0x04, 0x00, 0x00, 0xf3, 0x04, + 0x00, 0x00, 0xf3, 0x04, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x6f, 0x04, 0x00, 0x00, 0xf4, 0x04, 0x00, 0x00, 0xf2, 0x04, 0x00, 0x00, 0x6f, 0x04, 0x00, 0x00, + 0x6f, 0x04, 0x00, 0x00, 0x82, 0x04, 0x00, 0x00, 0xf4, 0x04, 0x00, 0x00, 0xf5, 0x04, 0x00, 0x00, 0xf6, 0x04, 0x00, 0x00, 0xf3, 0x04, 0x00, 0x00, 0xf3, 0x04, + 0x00, 0x00, 0xf2, 0x04, 0x00, 0x00, 0xf5, 0x04, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0xf3, 0x04, 0x00, 0x00, 0xf7, 0x04, 0x00, 0x00, 0xf7, 0x04, 0x00, 0x00, + 0x9e, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0xf8, 0x04, 0x00, 0x00, 0xf8, 0x04, 0x00, 0x00, 0xf9, 0x04, + 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0xf8, 0x04, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0xfa, 0x04, 0x00, 0x00, + 0xf8, 0x04, 0x00, 0x00, 0xf9, 0x04, 0x00, 0x00, 0xf8, 0x04, 0x00, 0x00, 0xfb, 0x04, 0x00, 0x00, 0xfb, 0x04, 0x00, 0x00, 0xfc, 0x04, 0x00, 0x00, 0xf9, 0x04, + 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0xf9, 0x04, 0x00, 0x00, 0xf9, 0x04, 0x00, 0x00, 0xfd, 0x04, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, + 0xfb, 0x04, 0x00, 0x00, 0xf8, 0x04, 0x00, 0x00, 0xfa, 0x04, 0x00, 0x00, 0xfa, 0x04, 0x00, 0x00, 0xfe, 0x04, 0x00, 0x00, 0xfb, 0x04, 0x00, 0x00, 0xfc, 0x04, + 0x00, 0x00, 0xfb, 0x04, 0x00, 0x00, 0xf6, 0x04, 0x00, 0x00, 0xf6, 0x04, 0x00, 0x00, 0xf5, 0x04, 0x00, 0x00, 0xfc, 0x04, 0x00, 0x00, 0xfd, 0x04, 0x00, 0x00, + 0xf9, 0x04, 0x00, 0x00, 0xfc, 0x04, 0x00, 0x00, 0xfc, 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xfd, 0x04, 0x00, 0x00, 0xf6, 0x04, 0x00, 0x00, 0xfb, 0x04, + 0x00, 0x00, 0xfe, 0x04, 0x00, 0x00, 0xfe, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf6, 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xfc, 0x04, 0x00, 0x00, + 0xf5, 0x04, 0x00, 0x00, 0xf5, 0x04, 0x00, 0x00, 0x01, 0x05, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xf3, 0x04, 0x00, 0x00, 0xf6, 0x04, 0x00, 0x00, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xf7, 0x04, 0x00, 0x00, 0xf3, 0x04, 0x00, 0x00, 0x01, 0x05, 0x00, 0x00, 0xf5, 0x04, 0x00, 0x00, 0xf2, 0x04, 0x00, 0x00, + 0xf2, 0x04, 0x00, 0x00, 0xf4, 0x04, 0x00, 0x00, 0x01, 0x05, 0x00, 0x00, 0xfa, 0x04, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x99, 0x00, + 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0xfa, 0x04, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0xfe, 0x04, 0x00, 0x00, 0xfe, 0x04, 0x00, 0x00, + 0xfa, 0x04, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0xfe, 0x04, + 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x04, 0x05, 0x00, 0x00, 0x04, 0x05, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, + 0x9c, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x05, 0x05, 0x00, 0x00, 0x06, 0x05, 0x00, 0x00, 0x06, 0x05, 0x00, 0x00, 0x04, 0x05, 0x00, 0x00, 0x03, 0x05, + 0x00, 0x00, 0x7c, 0x04, 0x00, 0x00, 0x7b, 0x04, 0x00, 0x00, 0x06, 0x05, 0x00, 0x00, 0x06, 0x05, 0x00, 0x00, 0x05, 0x05, 0x00, 0x00, 0x7c, 0x04, 0x00, 0x00, + 0x9a, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, 0x00, 0xf7, 0x04, 0x00, 0x00, 0xf7, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x04, 0x05, + 0x00, 0x00, 0x06, 0x05, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0xf7, 0x04, 0x00, 0x00, 0x04, 0x05, 0x00, 0x00, 0x06, 0x05, 0x00, 0x00, + 0x7b, 0x04, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x06, 0x05, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0xa0, 0x00, + 0x00, 0x00, 0xfd, 0x04, 0x00, 0x00, 0xfd, 0x04, 0x00, 0x00, 0x07, 0x05, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x07, 0x05, 0x00, 0x00, 0xfd, 0x04, 0x00, 0x00, + 0xff, 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0x08, 0x05, 0x00, 0x00, 0x07, 0x05, 0x00, 0x00, 0x08, 0x05, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0x01, 0x05, + 0x00, 0x00, 0x01, 0x05, 0x00, 0x00, 0x09, 0x05, 0x00, 0x00, 0x08, 0x05, 0x00, 0x00, 0x09, 0x05, 0x00, 0x00, 0x01, 0x05, 0x00, 0x00, 0xf4, 0x04, 0x00, 0x00, + 0xf4, 0x04, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x09, 0x05, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0xf4, 0x04, 0x00, 0x00, 0x82, 0x04, 0x00, 0x00, 0x82, 0x04, + 0x00, 0x00, 0xa1, 0x04, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0b, 0x05, 0x00, 0x00, 0x0c, 0x05, 0x00, 0x00, 0x0d, 0x05, 0x00, 0x00, 0x0d, 0x05, 0x00, 0x00, + 0x0e, 0x05, 0x00, 0x00, 0x0b, 0x05, 0x00, 0x00, 0x0f, 0x05, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x0c, 0x05, 0x00, 0x00, 0x0c, 0x05, 0x00, 0x00, 0x0b, 0x05, + 0x00, 0x00, 0x0f, 0x05, 0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x0d, 0x05, 0x00, 0x00, 0x0c, 0x05, 0x00, 0x00, 0x0c, 0x05, 0x00, 0x00, 0x12, 0x05, 0x00, 0x00, + 0x11, 0x05, 0x00, 0x00, 0x0e, 0x05, 0x00, 0x00, 0x0d, 0x05, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x14, 0x05, 0x00, 0x00, 0x0e, 0x05, + 0x00, 0x00, 0x0e, 0x05, 0x00, 0x00, 0x15, 0x05, 0x00, 0x00, 0x16, 0x05, 0x00, 0x00, 0x16, 0x05, 0x00, 0x00, 0x0b, 0x05, 0x00, 0x00, 0x0e, 0x05, 0x00, 0x00, + 0x17, 0x05, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x0d, 0x05, 0x00, 0x00, 0x0d, 0x05, 0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x17, 0x05, 0x00, 0x00, 0x14, 0x05, + 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x18, 0x05, 0x00, 0x00, 0x18, 0x05, 0x00, 0x00, 0x19, 0x05, 0x00, 0x00, 0x14, 0x05, 0x00, 0x00, 0x14, 0x05, 0x00, 0x00, + 0x1a, 0x05, 0x00, 0x00, 0x15, 0x05, 0x00, 0x00, 0x15, 0x05, 0x00, 0x00, 0x0e, 0x05, 0x00, 0x00, 0x14, 0x05, 0x00, 0x00, 0x1b, 0x05, 0x00, 0x00, 0x18, 0x05, + 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x13, 0x05, 0x00, 0x00, 0x17, 0x05, 0x00, 0x00, 0x1b, 0x05, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, + 0x19, 0x05, 0x00, 0x00, 0x19, 0x05, 0x00, 0x00, 0x18, 0x05, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x19, 0x05, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0x1a, 0x05, + 0x00, 0x00, 0x1a, 0x05, 0x00, 0x00, 0x14, 0x05, 0x00, 0x00, 0x19, 0x05, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x0f, 0x05, 0x00, 0x00, 0x9f, 0x04, 0x00, 0x00, + 0x9f, 0x04, 0x00, 0x00, 0x9e, 0x04, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x12, 0x05, 0x00, 0x00, 0x0c, 0x05, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x10, 0x05, + 0x00, 0x00, 0x1c, 0x05, 0x00, 0x00, 0x12, 0x05, 0x00, 0x00, 0x0b, 0x05, 0x00, 0x00, 0x16, 0x05, 0x00, 0x00, 0x1d, 0x05, 0x00, 0x00, 0x1d, 0x05, 0x00, 0x00, + 0x0f, 0x05, 0x00, 0x00, 0x0b, 0x05, 0x00, 0x00, 0x0f, 0x05, 0x00, 0x00, 0x1d, 0x05, 0x00, 0x00, 0xb1, 0x04, 0x00, 0x00, 0xb1, 0x04, 0x00, 0x00, 0x9f, 0x04, + 0x00, 0x00, 0x0f, 0x05, 0x00, 0x00, 0x1c, 0x05, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x9e, 0x04, 0x00, 0x00, 0x9e, 0x04, 0x00, 0x00, 0xb3, 0x04, 0x00, 0x00, + 0x1c, 0x05, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x07, 0x05, 0x00, 0x00, 0x07, 0x05, 0x00, 0x00, 0x1a, 0x05, 0x00, 0x00, 0xa2, 0x00, + 0x00, 0x00, 0x1a, 0x05, 0x00, 0x00, 0x07, 0x05, 0x00, 0x00, 0x08, 0x05, 0x00, 0x00, 0x08, 0x05, 0x00, 0x00, 0x15, 0x05, 0x00, 0x00, 0x1a, 0x05, 0x00, 0x00, + 0x15, 0x05, 0x00, 0x00, 0x08, 0x05, 0x00, 0x00, 0x09, 0x05, 0x00, 0x00, 0x09, 0x05, 0x00, 0x00, 0x16, 0x05, 0x00, 0x00, 0x15, 0x05, 0x00, 0x00, 0x16, 0x05, + 0x00, 0x00, 0x09, 0x05, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x0a, 0x05, 0x00, 0x00, 0x1d, 0x05, 0x00, 0x00, 0x16, 0x05, 0x00, 0x00, 0x1d, 0x05, 0x00, 0x00, + 0x0a, 0x05, 0x00, 0x00, 0xa1, 0x04, 0x00, 0x00, 0xa1, 0x04, 0x00, 0x00, 0xb1, 0x04, 0x00, 0x00, 0x1d, 0x05, 0x00, 0x00, 0xa9, 0x04, 0x00, 0x00, 0xa2, 0x04, + 0x00, 0x00, 0xee, 0x04, 0x00, 0x00, 0xee, 0x04, 0x00, 0x00, 0x1e, 0x05, 0x00, 0x00, 0xa9, 0x04, 0x00, 0x00, 0x1e, 0x05, 0x00, 0x00, 0xee, 0x04, 0x00, 0x00, + 0xef, 0x04, 0x00, 0x00, 0xef, 0x04, 0x00, 0x00, 0x1f, 0x05, 0x00, 0x00, 0x1e, 0x05, 0x00, 0x00, 0x1f, 0x05, 0x00, 0x00, 0xef, 0x04, 0x00, 0x00, 0xf0, 0x04, + 0x00, 0x00, 0xf0, 0x04, 0x00, 0x00, 0x20, 0x05, 0x00, 0x00, 0x1f, 0x05, 0x00, 0x00, 0x20, 0x05, 0x00, 0x00, 0xf0, 0x04, 0x00, 0x00, 0xf1, 0x04, 0x00, 0x00, + 0xf1, 0x04, 0x00, 0x00, 0x21, 0x05, 0x00, 0x00, 0x20, 0x05, 0x00, 0x00, 0x21, 0x05, 0x00, 0x00, 0xf1, 0x04, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x95, 0x00, + 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x21, 0x05, 0x00, 0x00, 0xb2, 0x04, 0x00, 0x00, 0xa9, 0x04, 0x00, 0x00, 0x1e, 0x05, 0x00, 0x00, 0x1e, 0x05, 0x00, 0x00, + 0x22, 0x05, 0x00, 0x00, 0xb2, 0x04, 0x00, 0x00, 0x22, 0x05, 0x00, 0x00, 0x1e, 0x05, 0x00, 0x00, 0x1f, 0x05, 0x00, 0x00, 0x1f, 0x05, 0x00, 0x00, 0x23, 0x05, + 0x00, 0x00, 0x22, 0x05, 0x00, 0x00, 0x23, 0x05, 0x00, 0x00, 0x1f, 0x05, 0x00, 0x00, 0x20, 0x05, 0x00, 0x00, 0x20, 0x05, 0x00, 0x00, 0x24, 0x05, 0x00, 0x00, + 0x23, 0x05, 0x00, 0x00, 0x24, 0x05, 0x00, 0x00, 0x20, 0x05, 0x00, 0x00, 0x21, 0x05, 0x00, 0x00, 0x21, 0x05, 0x00, 0x00, 0x25, 0x05, 0x00, 0x00, 0x24, 0x05, + 0x00, 0x00, 0x25, 0x05, 0x00, 0x00, 0x21, 0x05, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x26, 0x05, 0x00, 0x00, 0x25, 0x05, 0x00, 0x00, + 0xb3, 0x04, 0x00, 0x00, 0xb2, 0x04, 0x00, 0x00, 0x22, 0x05, 0x00, 0x00, 0x22, 0x05, 0x00, 0x00, 0x1c, 0x05, 0x00, 0x00, 0xb3, 0x04, 0x00, 0x00, 0x1c, 0x05, + 0x00, 0x00, 0x22, 0x05, 0x00, 0x00, 0x23, 0x05, 0x00, 0x00, 0x23, 0x05, 0x00, 0x00, 0x12, 0x05, 0x00, 0x00, 0x1c, 0x05, 0x00, 0x00, 0x12, 0x05, 0x00, 0x00, + 0x23, 0x05, 0x00, 0x00, 0x24, 0x05, 0x00, 0x00, 0x24, 0x05, 0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x12, 0x05, 0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x24, 0x05, + 0x00, 0x00, 0x25, 0x05, 0x00, 0x00, 0x25, 0x05, 0x00, 0x00, 0x17, 0x05, 0x00, 0x00, 0x11, 0x05, 0x00, 0x00, 0x1b, 0x05, 0x00, 0x00, 0x26, 0x05, 0x00, 0x00, + 0xa4, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x1b, 0x05, 0x00, 0x00, 0x17, 0x05, 0x00, 0x00, 0x25, 0x05, 0x00, 0x00, 0x26, 0x05, + 0x00, 0x00, 0x26, 0x05, 0x00, 0x00, 0x1b, 0x05, 0x00, 0x00, 0x17, 0x05, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x18, 0x05, 0x00, 0x00, + 0x18, 0x05, 0x00, 0x00, 0x1b, 0x05, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, 0xb3, 0x00, 0x00, 0x00, 0xb3, 0x00, + 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0x27, 0x05, 0x00, 0x00, 0x27, 0x05, 0x00, 0x00, + 0xb2, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb3, 0x00, + 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0x28, 0x05, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0xb3, 0x00, 0x00, 0x00, + 0xb6, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x28, 0x05, 0x00, 0x00, 0x28, 0x05, 0x00, 0x00, 0x29, 0x05, 0x00, 0x00, 0xa8, 0x00, + 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x29, 0x05, 0x00, 0x00, 0x27, 0x05, 0x00, 0x00, 0x27, 0x05, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, + 0xab, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0xaa, 0x00, + 0x00, 0x00, 0x2a, 0x05, 0x00, 0x00, 0x2b, 0x05, 0x00, 0x00, 0x2b, 0x05, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, + 0x2c, 0x05, 0x00, 0x00, 0x2d, 0x05, 0x00, 0x00, 0x2d, 0x05, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0x2c, 0x05, 0x00, 0x00, 0xac, 0x00, + 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x2e, 0x05, 0x00, 0x00, 0x2c, 0x05, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x2f, 0x05, 0x00, 0x00, + 0x30, 0x05, 0x00, 0x00, 0x30, 0x05, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x30, 0x05, 0x00, 0x00, 0x31, 0x05, + 0x00, 0x00, 0x31, 0x05, 0x00, 0x00, 0xb5, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0x2d, 0x05, 0x00, 0x00, 0x32, 0x05, 0x00, 0x00, + 0x32, 0x05, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0x2d, 0x05, 0x00, 0x00, 0x2f, 0x05, 0x00, 0x00, 0x33, 0x05, 0x00, 0x00, 0x33, 0x05, + 0x00, 0x00, 0x32, 0x05, 0x00, 0x00, 0x2d, 0x05, 0x00, 0x00, 0x32, 0x05, 0x00, 0x00, 0x34, 0x05, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, + 0xa9, 0x00, 0x00, 0x00, 0x32, 0x05, 0x00, 0x00, 0x2f, 0x05, 0x00, 0x00, 0x2d, 0x05, 0x00, 0x00, 0x2c, 0x05, 0x00, 0x00, 0x2c, 0x05, 0x00, 0x00, 0x30, 0x05, + 0x00, 0x00, 0x2f, 0x05, 0x00, 0x00, 0x2f, 0x05, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x33, 0x05, 0x00, 0x00, + 0x2f, 0x05, 0x00, 0x00, 0x33, 0x05, 0x00, 0x00, 0x35, 0x05, 0x00, 0x00, 0x34, 0x05, 0x00, 0x00, 0x34, 0x05, 0x00, 0x00, 0x32, 0x05, 0x00, 0x00, 0x33, 0x05, + 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x27, 0x05, 0x00, 0x00, 0x35, 0x05, 0x00, 0x00, 0x35, 0x05, 0x00, 0x00, 0x33, 0x05, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, + 0x30, 0x05, 0x00, 0x00, 0x2c, 0x05, 0x00, 0x00, 0x2e, 0x05, 0x00, 0x00, 0x2e, 0x05, 0x00, 0x00, 0x31, 0x05, 0x00, 0x00, 0x30, 0x05, 0x00, 0x00, 0x31, 0x05, + 0x00, 0x00, 0x36, 0x05, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x00, 0x00, 0x31, 0x05, 0x00, 0x00, 0x2e, 0x05, 0x00, 0x00, + 0x37, 0x05, 0x00, 0x00, 0x36, 0x05, 0x00, 0x00, 0x36, 0x05, 0x00, 0x00, 0x31, 0x05, 0x00, 0x00, 0x2e, 0x05, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0xaf, 0x00, + 0x00, 0x00, 0x37, 0x05, 0x00, 0x00, 0x37, 0x05, 0x00, 0x00, 0x2e, 0x05, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x38, 0x05, 0x00, 0x00, + 0x2a, 0x05, 0x00, 0x00, 0x2a, 0x05, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x2b, 0x05, 0x00, 0x00, 0x2a, 0x05, 0x00, 0x00, 0x38, 0x05, + 0x00, 0x00, 0x38, 0x05, 0x00, 0x00, 0x39, 0x05, 0x00, 0x00, 0x2b, 0x05, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0x2b, 0x05, 0x00, 0x00, 0x39, 0x05, 0x00, 0x00, + 0x39, 0x05, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0x27, 0x05, 0x00, 0x00, 0x29, 0x05, 0x00, 0x00, 0x3a, 0x05, 0x00, 0x00, 0x3a, 0x05, + 0x00, 0x00, 0x35, 0x05, 0x00, 0x00, 0x27, 0x05, 0x00, 0x00, 0x29, 0x05, 0x00, 0x00, 0x28, 0x05, 0x00, 0x00, 0x3b, 0x05, 0x00, 0x00, 0x3b, 0x05, 0x00, 0x00, + 0x3a, 0x05, 0x00, 0x00, 0x29, 0x05, 0x00, 0x00, 0x3c, 0x05, 0x00, 0x00, 0x3d, 0x05, 0x00, 0x00, 0x3a, 0x05, 0x00, 0x00, 0x3a, 0x05, 0x00, 0x00, 0x3b, 0x05, + 0x00, 0x00, 0x3c, 0x05, 0x00, 0x00, 0x39, 0x05, 0x00, 0x00, 0x38, 0x05, 0x00, 0x00, 0x3d, 0x05, 0x00, 0x00, 0x3d, 0x05, 0x00, 0x00, 0x3c, 0x05, 0x00, 0x00, + 0x39, 0x05, 0x00, 0x00, 0x35, 0x05, 0x00, 0x00, 0x3a, 0x05, 0x00, 0x00, 0x3d, 0x05, 0x00, 0x00, 0x3d, 0x05, 0x00, 0x00, 0x34, 0x05, 0x00, 0x00, 0x35, 0x05, + 0x00, 0x00, 0x37, 0x05, 0x00, 0x00, 0x3c, 0x05, 0x00, 0x00, 0x3b, 0x05, 0x00, 0x00, 0x3b, 0x05, 0x00, 0x00, 0x36, 0x05, 0x00, 0x00, 0x37, 0x05, 0x00, 0x00, + 0x36, 0x05, 0x00, 0x00, 0x3b, 0x05, 0x00, 0x00, 0x28, 0x05, 0x00, 0x00, 0x28, 0x05, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0x36, 0x05, 0x00, 0x00, 0x34, 0x05, + 0x00, 0x00, 0x3d, 0x05, 0x00, 0x00, 0x38, 0x05, 0x00, 0x00, 0x38, 0x05, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x34, 0x05, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, + 0x39, 0x05, 0x00, 0x00, 0x3c, 0x05, 0x00, 0x00, 0x3c, 0x05, 0x00, 0x00, 0x37, 0x05, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x3e, 0x05, + 0x00, 0x00, 0x3f, 0x05, 0x00, 0x00, 0x3f, 0x05, 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x40, 0x05, 0x00, 0x00, 0x3e, 0x05, 0x00, 0x00, + 0xb8, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x40, 0x05, 0x00, 0x00, 0x40, 0x05, 0x00, 0x00, 0x41, 0x05, 0x00, 0x00, 0x3f, 0x05, + 0x00, 0x00, 0x3f, 0x05, 0x00, 0x00, 0x3e, 0x05, 0x00, 0x00, 0x40, 0x05, 0x00, 0x00, 0x3f, 0x05, 0x00, 0x00, 0x41, 0x05, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, + 0xbb, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, 0x3f, 0x05, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0xb8, 0x00, + 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x41, 0x05, 0x00, 0x00, 0x40, 0x05, 0x00, 0x00, 0x42, 0x05, 0x00, 0x00, 0x42, 0x05, 0x00, 0x00, + 0x43, 0x05, 0x00, 0x00, 0x41, 0x05, 0x00, 0x00, 0x42, 0x05, 0x00, 0x00, 0x40, 0x05, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xc4, 0x00, + 0x00, 0x00, 0x42, 0x05, 0x00, 0x00, 0x44, 0x05, 0x00, 0x00, 0x45, 0x05, 0x00, 0x00, 0x43, 0x05, 0x00, 0x00, 0x43, 0x05, 0x00, 0x00, 0x42, 0x05, 0x00, 0x00, + 0x44, 0x05, 0x00, 0x00, 0x41, 0x05, 0x00, 0x00, 0x43, 0x05, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x41, 0x05, + 0x00, 0x00, 0x45, 0x05, 0x00, 0x00, 0x44, 0x05, 0x00, 0x00, 0x46, 0x05, 0x00, 0x00, 0x46, 0x05, 0x00, 0x00, 0x47, 0x05, 0x00, 0x00, 0x45, 0x05, 0x00, 0x00, + 0x46, 0x05, 0x00, 0x00, 0x44, 0x05, 0x00, 0x00, 0x48, 0x05, 0x00, 0x00, 0x48, 0x05, 0x00, 0x00, 0x49, 0x05, 0x00, 0x00, 0x46, 0x05, 0x00, 0x00, 0x4a, 0x05, + 0x00, 0x00, 0x4b, 0x05, 0x00, 0x00, 0x47, 0x05, 0x00, 0x00, 0x47, 0x05, 0x00, 0x00, 0x46, 0x05, 0x00, 0x00, 0x4a, 0x05, 0x00, 0x00, 0x45, 0x05, 0x00, 0x00, + 0x47, 0x05, 0x00, 0x00, 0x4c, 0x05, 0x00, 0x00, 0x4c, 0x05, 0x00, 0x00, 0x4d, 0x05, 0x00, 0x00, 0x45, 0x05, 0x00, 0x00, 0x43, 0x05, 0x00, 0x00, 0x45, 0x05, + 0x00, 0x00, 0x4d, 0x05, 0x00, 0x00, 0x4d, 0x05, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x43, 0x05, 0x00, 0x00, 0x44, 0x05, 0x00, 0x00, 0x42, 0x05, 0x00, 0x00, + 0xc4, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x48, 0x05, 0x00, 0x00, 0x44, 0x05, 0x00, 0x00, 0x4b, 0x05, 0x00, 0x00, 0x4a, 0x05, 0x00, 0x00, 0x4e, 0x05, + 0x00, 0x00, 0x4e, 0x05, 0x00, 0x00, 0x4f, 0x05, 0x00, 0x00, 0x4b, 0x05, 0x00, 0x00, 0x4e, 0x05, 0x00, 0x00, 0x4a, 0x05, 0x00, 0x00, 0x50, 0x05, 0x00, 0x00, + 0x50, 0x05, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x4e, 0x05, 0x00, 0x00, 0x4f, 0x05, 0x00, 0x00, 0x4e, 0x05, 0x00, 0x00, 0x51, 0x05, 0x00, 0x00, 0x51, 0x05, + 0x00, 0x00, 0x52, 0x05, 0x00, 0x00, 0x4f, 0x05, 0x00, 0x00, 0x4b, 0x05, 0x00, 0x00, 0x4f, 0x05, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, + 0x53, 0x05, 0x00, 0x00, 0x4b, 0x05, 0x00, 0x00, 0x47, 0x05, 0x00, 0x00, 0x4b, 0x05, 0x00, 0x00, 0x53, 0x05, 0x00, 0x00, 0x53, 0x05, 0x00, 0x00, 0x4c, 0x05, + 0x00, 0x00, 0x47, 0x05, 0x00, 0x00, 0x4a, 0x05, 0x00, 0x00, 0x46, 0x05, 0x00, 0x00, 0x49, 0x05, 0x00, 0x00, 0x49, 0x05, 0x00, 0x00, 0x50, 0x05, 0x00, 0x00, + 0x4a, 0x05, 0x00, 0x00, 0x51, 0x05, 0x00, 0x00, 0x4e, 0x05, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0x51, 0x05, + 0x00, 0x00, 0x52, 0x05, 0x00, 0x00, 0x51, 0x05, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0x52, 0x05, 0x00, 0x00, + 0x4f, 0x05, 0x00, 0x00, 0x52, 0x05, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0x4f, 0x05, 0x00, 0x00, 0x54, 0x05, + 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x54, 0x05, 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, + 0x54, 0x05, 0x00, 0x00, 0x56, 0x05, 0x00, 0x00, 0x56, 0x05, 0x00, 0x00, 0x57, 0x05, 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x58, 0x05, + 0x00, 0x00, 0x56, 0x05, 0x00, 0x00, 0x56, 0x05, 0x00, 0x00, 0x54, 0x05, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x59, 0x05, 0x00, 0x00, 0x5a, 0x05, 0x00, 0x00, + 0x57, 0x05, 0x00, 0x00, 0x57, 0x05, 0x00, 0x00, 0x56, 0x05, 0x00, 0x00, 0x59, 0x05, 0x00, 0x00, 0x5b, 0x05, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x55, 0x05, + 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0x57, 0x05, 0x00, 0x00, 0x5b, 0x05, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, + 0xb9, 0x00, 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0x54, 0x05, 0x00, 0x00, 0x54, 0x05, + 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x5a, 0x05, 0x00, 0x00, 0x59, 0x05, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, + 0xc6, 0x00, 0x00, 0x00, 0x5a, 0x05, 0x00, 0x00, 0x5c, 0x05, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x59, 0x05, + 0x00, 0x00, 0x5c, 0x05, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, + 0xbe, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x5d, 0x05, 0x00, 0x00, 0x5a, 0x05, 0x00, 0x00, 0x5a, 0x05, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0xc5, 0x00, + 0x00, 0x00, 0x5d, 0x05, 0x00, 0x00, 0x5b, 0x05, 0x00, 0x00, 0x57, 0x05, 0x00, 0x00, 0x57, 0x05, 0x00, 0x00, 0x5a, 0x05, 0x00, 0x00, 0x5d, 0x05, 0x00, 0x00, + 0x58, 0x05, 0x00, 0x00, 0x5c, 0x05, 0x00, 0x00, 0x59, 0x05, 0x00, 0x00, 0x59, 0x05, 0x00, 0x00, 0x56, 0x05, 0x00, 0x00, 0x58, 0x05, 0x00, 0x00, 0x4c, 0x05, + 0x00, 0x00, 0x53, 0x05, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x5c, 0x05, 0x00, 0x00, 0x4c, 0x05, 0x00, 0x00, 0x4d, 0x05, 0x00, 0x00, + 0x4c, 0x05, 0x00, 0x00, 0x5c, 0x05, 0x00, 0x00, 0x5c, 0x05, 0x00, 0x00, 0x58, 0x05, 0x00, 0x00, 0x4d, 0x05, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x4d, 0x05, + 0x00, 0x00, 0x58, 0x05, 0x00, 0x00, 0x58, 0x05, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x48, 0x05, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, + 0xc3, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x5b, 0x05, 0x00, 0x00, 0x48, 0x05, 0x00, 0x00, 0x49, 0x05, 0x00, 0x00, 0x48, 0x05, 0x00, 0x00, 0x5b, 0x05, + 0x00, 0x00, 0x5b, 0x05, 0x00, 0x00, 0x5d, 0x05, 0x00, 0x00, 0x49, 0x05, 0x00, 0x00, 0x50, 0x05, 0x00, 0x00, 0x49, 0x05, 0x00, 0x00, 0x5d, 0x05, 0x00, 0x00, + 0x5d, 0x05, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x50, 0x05, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x50, 0x05, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0xc5, 0x00, + 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, + 0xbe, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0x53, 0x05, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x53, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x5e, 0x05, 0x00, 0x00, 0x5f, 0x05, 0x00, 0x00, 0x60, 0x05, 0x00, 0x00, 0x60, 0x05, 0x00, 0x00, 0x61, 0x05, 0x00, 0x00, 0x5e, 0x05, + 0x00, 0x00, 0xbb, 0x01, 0x00, 0x00, 0x62, 0x05, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0xbb, 0x01, 0x00, 0x00, + 0xce, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x63, 0x05, 0x00, 0x00, 0x63, 0x05, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, 0xd1, 0x00, + 0x00, 0x00, 0x64, 0x05, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0x65, 0x05, 0x00, 0x00, + 0x66, 0x05, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0x65, 0x05, 0x00, 0x00, 0x66, 0x05, 0x00, 0x00, 0x67, 0x05, + 0x00, 0x00, 0x63, 0x05, 0x00, 0x00, 0x63, 0x05, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x66, 0x05, 0x00, 0x00, 0xba, 0x01, 0x00, 0x00, 0xbb, 0x01, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x63, 0x05, 0x00, 0x00, 0xba, 0x01, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0xd6, 0x00, + 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x68, 0x05, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, + 0xd4, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x11, 0x04, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0xd6, 0x00, + 0x00, 0x00, 0x69, 0x05, 0x00, 0x00, 0x11, 0x04, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x6a, 0x05, 0x00, 0x00, 0x6b, 0x05, 0x00, 0x00, 0x6b, 0x05, 0x00, 0x00, + 0x0d, 0x04, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x11, 0x04, 0x00, 0x00, 0x69, 0x05, 0x00, 0x00, 0x69, 0x05, 0x00, 0x00, 0x6a, 0x05, + 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x6c, 0x05, 0x00, 0x00, 0x6d, 0x05, 0x00, 0x00, 0x6b, 0x05, 0x00, 0x00, 0x6b, 0x05, 0x00, 0x00, 0x6a, 0x05, 0x00, 0x00, + 0x6c, 0x05, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x5b, 0x01, 0x00, 0x00, 0x0d, 0x04, 0x00, 0x00, 0x0d, 0x04, 0x00, 0x00, 0x6b, 0x05, 0x00, 0x00, 0x5c, 0x01, + 0x00, 0x00, 0x68, 0x05, 0x00, 0x00, 0x55, 0x01, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x68, 0x05, 0x00, 0x00, + 0xd6, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x6e, 0x05, 0x00, 0x00, 0x6e, 0x05, 0x00, 0x00, 0x8f, 0x01, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x69, 0x05, + 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x8f, 0x01, 0x00, 0x00, 0x8f, 0x01, 0x00, 0x00, 0x52, 0x01, 0x00, 0x00, 0x69, 0x05, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, + 0x8c, 0x01, 0x00, 0x00, 0x6f, 0x05, 0x00, 0x00, 0x6f, 0x05, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x70, 0x05, 0x00, 0x00, 0xd9, 0x00, + 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x71, 0x05, 0x00, 0x00, 0x70, 0x05, 0x00, 0x00, 0x72, 0x05, 0x00, 0x00, 0x73, 0x05, 0x00, 0x00, + 0xdc, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x72, 0x05, 0x00, 0x00, 0x74, 0x05, 0x00, 0x00, 0xe5, 0x00, 0x00, 0x00, 0xdd, 0x00, + 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x74, 0x05, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x74, 0x05, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, + 0xdc, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0x74, 0x05, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0x00, 0x00, 0x75, 0x05, 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0x73, 0x05, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, + 0xdc, 0x00, 0x00, 0x00, 0x73, 0x05, 0x00, 0x00, 0x74, 0x05, 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0x76, 0x05, 0x00, 0x00, 0x76, 0x05, 0x00, 0x00, 0xe5, 0x00, + 0x00, 0x00, 0x74, 0x05, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0x77, 0x05, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, + 0xde, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x77, 0x05, 0x00, 0x00, 0x77, 0x05, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0xdd, 0x00, + 0x00, 0x00, 0x77, 0x05, 0x00, 0x00, 0x78, 0x05, 0x00, 0x00, 0xbe, 0x01, 0x00, 0x00, 0xbe, 0x01, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0x77, 0x05, 0x00, 0x00, + 0xe7, 0x00, 0x00, 0x00, 0x72, 0x05, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0x79, 0x05, + 0x00, 0x00, 0x78, 0x05, 0x00, 0x00, 0x77, 0x05, 0x00, 0x00, 0x77, 0x05, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x79, 0x05, 0x00, 0x00, 0xcf, 0x01, 0x00, 0x00, + 0xbf, 0x01, 0x00, 0x00, 0xbe, 0x01, 0x00, 0x00, 0xbe, 0x01, 0x00, 0x00, 0x78, 0x05, 0x00, 0x00, 0xcf, 0x01, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0xbe, 0x01, + 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0xe6, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0x76, 0x05, 0x00, 0x00, + 0x7a, 0x05, 0x00, 0x00, 0x7a, 0x05, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0x7b, 0x05, 0x00, 0x00, 0x7c, 0x05, 0x00, 0x00, 0xeb, 0x00, + 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0x7b, 0x05, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, 0x79, 0x05, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, + 0xe4, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0xe5, 0x00, 0x00, 0x00, 0x76, 0x05, 0x00, 0x00, 0x76, 0x05, + 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x76, 0x05, 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, + 0x7a, 0x05, 0x00, 0x00, 0x76, 0x05, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0x7a, 0x05, 0x00, 0x00, 0x7d, 0x05, 0x00, 0x00, 0x7d, 0x05, 0x00, 0x00, 0x7b, 0x05, + 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0x7e, 0x05, 0x00, 0x00, 0x7d, 0x05, 0x00, 0x00, 0x7a, 0x05, 0x00, 0x00, 0x7a, 0x05, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, + 0x7e, 0x05, 0x00, 0x00, 0x7f, 0x05, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x7f, 0x05, + 0x00, 0x00, 0x81, 0x05, 0x00, 0x00, 0x7e, 0x05, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0x81, 0x05, 0x00, 0x00, + 0x7f, 0x05, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x82, 0x05, 0x00, 0x00, 0x82, 0x05, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x7f, 0x05, 0x00, 0x00, 0x81, 0x05, + 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x83, 0x05, 0x00, 0x00, 0x81, 0x05, 0x00, 0x00, 0x75, 0x05, 0x00, 0x00, + 0x7f, 0x05, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0x75, 0x05, 0x00, 0x00, 0x82, 0x05, 0x00, 0x00, 0x84, 0x05, + 0x00, 0x00, 0x83, 0x05, 0x00, 0x00, 0x83, 0x05, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x82, 0x05, 0x00, 0x00, 0x82, 0x05, 0x00, 0x00, 0x85, 0x05, 0x00, 0x00, + 0x86, 0x05, 0x00, 0x00, 0x86, 0x05, 0x00, 0x00, 0x84, 0x05, 0x00, 0x00, 0x82, 0x05, 0x00, 0x00, 0x83, 0x05, 0x00, 0x00, 0x84, 0x05, 0x00, 0x00, 0xf3, 0x00, + 0x00, 0x00, 0xf3, 0x00, 0x00, 0x00, 0xf5, 0x00, 0x00, 0x00, 0x83, 0x05, 0x00, 0x00, 0xa5, 0x01, 0x00, 0x00, 0x87, 0x05, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, + 0xf2, 0x00, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0xa5, 0x01, 0x00, 0x00, 0xa7, 0x01, 0x00, 0x00, 0x88, 0x05, 0x00, 0x00, 0x87, 0x05, 0x00, 0x00, 0x87, 0x05, + 0x00, 0x00, 0xa5, 0x01, 0x00, 0x00, 0xa7, 0x01, 0x00, 0x00, 0x89, 0x05, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x87, 0x05, 0x00, 0x00, 0x87, 0x05, 0x00, 0x00, + 0x8a, 0x05, 0x00, 0x00, 0x89, 0x05, 0x00, 0x00, 0x8b, 0x05, 0x00, 0x00, 0xa6, 0x01, 0x00, 0x00, 0xa5, 0x01, 0x00, 0x00, 0xa5, 0x01, 0x00, 0x00, 0xf1, 0x00, + 0x00, 0x00, 0x8b, 0x05, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf3, 0x00, 0x00, 0x00, 0xf3, 0x00, 0x00, 0x00, 0x8b, 0x05, 0x00, 0x00, + 0xf1, 0x00, 0x00, 0x00, 0x89, 0x05, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x89, 0x05, + 0x00, 0x00, 0xa7, 0x01, 0x00, 0x00, 0x8d, 0x01, 0x00, 0x00, 0x8c, 0x05, 0x00, 0x00, 0x8c, 0x05, 0x00, 0x00, 0x88, 0x05, 0x00, 0x00, 0xa7, 0x01, 0x00, 0x00, + 0x8b, 0x01, 0x00, 0x00, 0x8d, 0x01, 0x00, 0x00, 0xa7, 0x01, 0x00, 0x00, 0xa7, 0x01, 0x00, 0x00, 0xa6, 0x01, 0x00, 0x00, 0x8b, 0x01, 0x00, 0x00, 0x8d, 0x01, + 0x00, 0x00, 0x8c, 0x01, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x8c, 0x05, 0x00, 0x00, 0x8d, 0x01, 0x00, 0x00, 0x8a, 0x05, 0x00, 0x00, + 0x87, 0x05, 0x00, 0x00, 0x88, 0x05, 0x00, 0x00, 0x88, 0x05, 0x00, 0x00, 0x8c, 0x05, 0x00, 0x00, 0x8a, 0x05, 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, 0x8d, 0x05, + 0x00, 0x00, 0x8e, 0x05, 0x00, 0x00, 0x8e, 0x05, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xab, 0x01, 0x00, 0x00, + 0xac, 0x01, 0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x8f, 0x05, 0x00, 0x00, 0x90, 0x05, + 0x00, 0x00, 0x90, 0x05, 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x91, 0x05, 0x00, 0x00, 0x8d, 0x05, 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, + 0xf7, 0x00, 0x00, 0x00, 0x90, 0x05, 0x00, 0x00, 0x91, 0x05, 0x00, 0x00, 0x8d, 0x05, 0x00, 0x00, 0x92, 0x05, 0x00, 0x00, 0x93, 0x05, 0x00, 0x00, 0x93, 0x05, + 0x00, 0x00, 0x8e, 0x05, 0x00, 0x00, 0x8d, 0x05, 0x00, 0x00, 0x8e, 0x05, 0x00, 0x00, 0xb9, 0x01, 0x00, 0x00, 0xab, 0x01, 0x00, 0x00, 0xab, 0x01, 0x00, 0x00, + 0xf8, 0x00, 0x00, 0x00, 0x8e, 0x05, 0x00, 0x00, 0x8d, 0x05, 0x00, 0x00, 0x91, 0x05, 0x00, 0x00, 0x94, 0x05, 0x00, 0x00, 0x94, 0x05, 0x00, 0x00, 0x92, 0x05, + 0x00, 0x00, 0x8d, 0x05, 0x00, 0x00, 0x93, 0x05, 0x00, 0x00, 0x92, 0x05, 0x00, 0x00, 0xec, 0x01, 0x00, 0x00, 0xec, 0x01, 0x00, 0x00, 0xee, 0x01, 0x00, 0x00, + 0x93, 0x05, 0x00, 0x00, 0x8e, 0x05, 0x00, 0x00, 0x93, 0x05, 0x00, 0x00, 0xb7, 0x01, 0x00, 0x00, 0xb7, 0x01, 0x00, 0x00, 0xb9, 0x01, 0x00, 0x00, 0x8e, 0x05, + 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, + 0x57, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x75, 0x05, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x7f, 0x05, 0x00, 0x00, + 0x75, 0x05, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x7f, 0x05, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, 0x95, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x95, 0x05, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, + 0x0c, 0x01, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, 0x96, 0x05, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x04, 0x01, + 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, + 0x97, 0x05, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x97, 0x05, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x06, 0x01, + 0x00, 0x00, 0x97, 0x05, 0x00, 0x00, 0x98, 0x05, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x97, 0x05, 0x00, 0x00, 0x97, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, + 0x98, 0x05, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x97, 0x05, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x99, 0x05, 0x00, 0x00, 0x02, 0x01, + 0x00, 0x00, 0x99, 0x05, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x72, 0x04, 0x00, 0x00, 0x99, 0x05, 0x00, 0x00, + 0x9a, 0x05, 0x00, 0x00, 0x95, 0x05, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x99, 0x05, 0x00, 0x00, 0x9a, 0x05, 0x00, 0x00, 0x58, 0x00, + 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, + 0x9b, 0x05, 0x00, 0x00, 0x9c, 0x05, 0x00, 0x00, 0x9c, 0x05, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, 0x0a, 0x01, + 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, 0x9d, 0x05, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, 0x9e, 0x05, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x95, 0x05, 0x00, 0x00, 0x9e, 0x05, 0x00, 0x00, 0x12, 0x01, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x9f, 0x05, + 0x00, 0x00, 0x9f, 0x05, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00, 0x12, 0x01, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x4b, 0x01, 0x00, 0x00, + 0x4b, 0x01, 0x00, 0x00, 0x9f, 0x05, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00, 0x9f, 0x05, 0x00, 0x00, 0x88, 0x01, 0x00, 0x00, 0x88, 0x01, + 0x00, 0x00, 0x9d, 0x05, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00, 0x16, 0x01, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0x12, 0x01, 0x00, 0x00, 0x12, 0x01, 0x00, 0x00, + 0x14, 0x01, 0x00, 0x00, 0x16, 0x01, 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00, 0x9d, 0x05, + 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, 0xa1, 0x05, 0x00, 0x00, 0xa2, 0x05, 0x00, 0x00, 0xa3, 0x05, 0x00, 0x00, 0xa3, 0x05, 0x00, 0x00, 0xa4, 0x05, 0x00, 0x00, + 0xa1, 0x05, 0x00, 0x00, 0xa5, 0x05, 0x00, 0x00, 0xa2, 0x05, 0x00, 0x00, 0xa1, 0x05, 0x00, 0x00, 0xa1, 0x05, 0x00, 0x00, 0xa6, 0x05, 0x00, 0x00, 0xa5, 0x05, + 0x00, 0x00, 0xa3, 0x05, 0x00, 0x00, 0xa2, 0x05, 0x00, 0x00, 0x76, 0x04, 0x00, 0x00, 0x76, 0x04, 0x00, 0x00, 0x78, 0x04, 0x00, 0x00, 0xa3, 0x05, 0x00, 0x00, + 0xa7, 0x05, 0x00, 0x00, 0xa8, 0x05, 0x00, 0x00, 0xa4, 0x05, 0x00, 0x00, 0xa4, 0x05, 0x00, 0x00, 0xa3, 0x05, 0x00, 0x00, 0xa7, 0x05, 0x00, 0x00, 0xa9, 0x05, + 0x00, 0x00, 0xa1, 0x05, 0x00, 0x00, 0xa4, 0x05, 0x00, 0x00, 0xa4, 0x05, 0x00, 0x00, 0xaa, 0x05, 0x00, 0x00, 0xa9, 0x05, 0x00, 0x00, 0xa1, 0x05, 0x00, 0x00, + 0xa9, 0x05, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0xa6, 0x05, 0x00, 0x00, 0xa1, 0x05, 0x00, 0x00, 0xa8, 0x05, 0x00, 0x00, 0xab, 0x05, + 0x00, 0x00, 0xaa, 0x05, 0x00, 0x00, 0xaa, 0x05, 0x00, 0x00, 0xa4, 0x05, 0x00, 0x00, 0xa8, 0x05, 0x00, 0x00, 0xac, 0x05, 0x00, 0x00, 0xa9, 0x05, 0x00, 0x00, + 0xaa, 0x05, 0x00, 0x00, 0xaa, 0x05, 0x00, 0x00, 0xad, 0x05, 0x00, 0x00, 0xac, 0x05, 0x00, 0x00, 0xae, 0x05, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0xa9, 0x05, + 0x00, 0x00, 0xa9, 0x05, 0x00, 0x00, 0xac, 0x05, 0x00, 0x00, 0xae, 0x05, 0x00, 0x00, 0xab, 0x05, 0x00, 0x00, 0xaf, 0x05, 0x00, 0x00, 0xad, 0x05, 0x00, 0x00, + 0xad, 0x05, 0x00, 0x00, 0xaa, 0x05, 0x00, 0x00, 0xab, 0x05, 0x00, 0x00, 0xb0, 0x05, 0x00, 0x00, 0xac, 0x05, 0x00, 0x00, 0xad, 0x05, 0x00, 0x00, 0xad, 0x05, + 0x00, 0x00, 0xb1, 0x05, 0x00, 0x00, 0xb0, 0x05, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, + 0x98, 0x05, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0xb2, 0x05, 0x00, 0x00, 0x85, 0x05, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x98, 0x05, + 0x00, 0x00, 0xb2, 0x05, 0x00, 0x00, 0xb2, 0x05, 0x00, 0x00, 0x98, 0x05, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, + 0xb2, 0x05, 0x00, 0x00, 0x96, 0x05, 0x00, 0x00, 0xb3, 0x05, 0x00, 0x00, 0xb2, 0x05, 0x00, 0x00, 0xb2, 0x05, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x96, 0x05, + 0x00, 0x00, 0x85, 0x05, 0x00, 0x00, 0x82, 0x05, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x85, 0x05, 0x00, 0x00, + 0x85, 0x05, 0x00, 0x00, 0xb2, 0x05, 0x00, 0x00, 0xb3, 0x05, 0x00, 0x00, 0xb3, 0x05, 0x00, 0x00, 0x86, 0x05, 0x00, 0x00, 0x85, 0x05, 0x00, 0x00, 0xb4, 0x05, + 0x00, 0x00, 0xb5, 0x05, 0x00, 0x00, 0x1a, 0x01, 0x00, 0x00, 0x1a, 0x01, 0x00, 0x00, 0x19, 0x01, 0x00, 0x00, 0xb4, 0x05, 0x00, 0x00, 0xb5, 0x05, 0x00, 0x00, + 0xb6, 0x05, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x1a, 0x01, 0x00, 0x00, 0xb5, 0x05, 0x00, 0x00, 0xb6, 0x05, 0x00, 0x00, 0xb7, 0x05, + 0x00, 0x00, 0x1d, 0x01, 0x00, 0x00, 0x1d, 0x01, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0xb6, 0x05, 0x00, 0x00, 0xb7, 0x05, 0x00, 0x00, 0xb8, 0x05, 0x00, 0x00, + 0x1e, 0x01, 0x00, 0x00, 0x1e, 0x01, 0x00, 0x00, 0x1d, 0x01, 0x00, 0x00, 0xb7, 0x05, 0x00, 0x00, 0xb8, 0x05, 0x00, 0x00, 0xb9, 0x05, 0x00, 0x00, 0x1b, 0x01, + 0x00, 0x00, 0x1b, 0x01, 0x00, 0x00, 0x1e, 0x01, 0x00, 0x00, 0xb8, 0x05, 0x00, 0x00, 0x22, 0x01, 0x00, 0x00, 0x1f, 0x01, 0x00, 0x00, 0x1b, 0x01, 0x00, 0x00, + 0x1b, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x22, 0x01, 0x00, 0x00, 0xba, 0x05, 0x00, 0x00, 0xbb, 0x05, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x21, 0x01, + 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0xba, 0x05, 0x00, 0x00, 0xbb, 0x05, 0x00, 0x00, 0xbc, 0x05, 0x00, 0x00, 0x23, 0x01, 0x00, 0x00, 0x23, 0x01, 0x00, 0x00, + 0x21, 0x01, 0x00, 0x00, 0xbb, 0x05, 0x00, 0x00, 0xbc, 0x05, 0x00, 0x00, 0xbd, 0x05, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, 0x23, 0x01, + 0x00, 0x00, 0xbc, 0x05, 0x00, 0x00, 0xbd, 0x05, 0x00, 0x00, 0xbe, 0x05, 0x00, 0x00, 0x25, 0x01, 0x00, 0x00, 0x25, 0x01, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, + 0xbd, 0x05, 0x00, 0x00, 0xbe, 0x05, 0x00, 0x00, 0xbf, 0x05, 0x00, 0x00, 0x22, 0x01, 0x00, 0x00, 0x22, 0x01, 0x00, 0x00, 0x25, 0x01, 0x00, 0x00, 0xbe, 0x05, + 0x00, 0x00, 0xc0, 0x05, 0x00, 0x00, 0xc1, 0x05, 0x00, 0x00, 0xb5, 0x05, 0x00, 0x00, 0xb5, 0x05, 0x00, 0x00, 0xb4, 0x05, 0x00, 0x00, 0xc0, 0x05, 0x00, 0x00, + 0xc2, 0x05, 0x00, 0x00, 0xb4, 0x05, 0x00, 0x00, 0x19, 0x01, 0x00, 0x00, 0x19, 0x01, 0x00, 0x00, 0x1f, 0x01, 0x00, 0x00, 0xc2, 0x05, 0x00, 0x00, 0xc1, 0x05, + 0x00, 0x00, 0xc3, 0x05, 0x00, 0x00, 0xb6, 0x05, 0x00, 0x00, 0xb6, 0x05, 0x00, 0x00, 0xb5, 0x05, 0x00, 0x00, 0xc1, 0x05, 0x00, 0x00, 0xc3, 0x05, 0x00, 0x00, + 0xc4, 0x05, 0x00, 0x00, 0xb7, 0x05, 0x00, 0x00, 0xb7, 0x05, 0x00, 0x00, 0xb6, 0x05, 0x00, 0x00, 0xc3, 0x05, 0x00, 0x00, 0xc4, 0x05, 0x00, 0x00, 0xc5, 0x05, + 0x00, 0x00, 0xb8, 0x05, 0x00, 0x00, 0xb8, 0x05, 0x00, 0x00, 0xb7, 0x05, 0x00, 0x00, 0xc4, 0x05, 0x00, 0x00, 0xc5, 0x05, 0x00, 0x00, 0xc6, 0x05, 0x00, 0x00, + 0xb9, 0x05, 0x00, 0x00, 0xb9, 0x05, 0x00, 0x00, 0xb8, 0x05, 0x00, 0x00, 0xc5, 0x05, 0x00, 0x00, 0xb9, 0x05, 0x00, 0x00, 0xba, 0x05, 0x00, 0x00, 0x20, 0x01, + 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x1b, 0x01, 0x00, 0x00, 0xb9, 0x05, 0x00, 0x00, 0xc6, 0x05, 0x00, 0x00, 0xc7, 0x05, 0x00, 0x00, 0xba, 0x05, 0x00, 0x00, + 0xba, 0x05, 0x00, 0x00, 0xb9, 0x05, 0x00, 0x00, 0xc6, 0x05, 0x00, 0x00, 0xc7, 0x05, 0x00, 0x00, 0xc8, 0x05, 0x00, 0x00, 0xbb, 0x05, 0x00, 0x00, 0xbb, 0x05, + 0x00, 0x00, 0xba, 0x05, 0x00, 0x00, 0xc7, 0x05, 0x00, 0x00, 0xc8, 0x05, 0x00, 0x00, 0xc9, 0x05, 0x00, 0x00, 0xbc, 0x05, 0x00, 0x00, 0xbc, 0x05, 0x00, 0x00, + 0xbb, 0x05, 0x00, 0x00, 0xc8, 0x05, 0x00, 0x00, 0xc9, 0x05, 0x00, 0x00, 0xca, 0x05, 0x00, 0x00, 0xbd, 0x05, 0x00, 0x00, 0xbd, 0x05, 0x00, 0x00, 0xbc, 0x05, + 0x00, 0x00, 0xc9, 0x05, 0x00, 0x00, 0xca, 0x05, 0x00, 0x00, 0xcb, 0x05, 0x00, 0x00, 0xbe, 0x05, 0x00, 0x00, 0xbe, 0x05, 0x00, 0x00, 0xbd, 0x05, 0x00, 0x00, + 0xca, 0x05, 0x00, 0x00, 0xcb, 0x05, 0x00, 0x00, 0xcc, 0x05, 0x00, 0x00, 0xbf, 0x05, 0x00, 0x00, 0xbf, 0x05, 0x00, 0x00, 0xbe, 0x05, 0x00, 0x00, 0xcb, 0x05, + 0x00, 0x00, 0xbf, 0x05, 0x00, 0x00, 0xc2, 0x05, 0x00, 0x00, 0x1f, 0x01, 0x00, 0x00, 0x1f, 0x01, 0x00, 0x00, 0x22, 0x01, 0x00, 0x00, 0xbf, 0x05, 0x00, 0x00, + 0xcc, 0x05, 0x00, 0x00, 0xcd, 0x05, 0x00, 0x00, 0xc2, 0x05, 0x00, 0x00, 0xc2, 0x05, 0x00, 0x00, 0xbf, 0x05, 0x00, 0x00, 0xcc, 0x05, 0x00, 0x00, 0xcd, 0x05, + 0x00, 0x00, 0xc0, 0x05, 0x00, 0x00, 0xb4, 0x05, 0x00, 0x00, 0xb4, 0x05, 0x00, 0x00, 0xc2, 0x05, 0x00, 0x00, 0xcd, 0x05, 0x00, 0x00, 0xb1, 0x05, 0x00, 0x00, + 0x27, 0x01, 0x00, 0x00, 0xc1, 0x05, 0x00, 0x00, 0xc1, 0x05, 0x00, 0x00, 0xc0, 0x05, 0x00, 0x00, 0xb1, 0x05, 0x00, 0x00, 0x27, 0x01, 0x00, 0x00, 0x26, 0x01, + 0x00, 0x00, 0xc3, 0x05, 0x00, 0x00, 0xc3, 0x05, 0x00, 0x00, 0xc1, 0x05, 0x00, 0x00, 0x27, 0x01, 0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0xce, 0x05, 0x00, 0x00, + 0xc4, 0x05, 0x00, 0x00, 0xc4, 0x05, 0x00, 0x00, 0xc3, 0x05, 0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0xce, 0x05, 0x00, 0x00, 0xcf, 0x05, 0x00, 0x00, 0xc5, 0x05, + 0x00, 0x00, 0xc5, 0x05, 0x00, 0x00, 0xc4, 0x05, 0x00, 0x00, 0xce, 0x05, 0x00, 0x00, 0xcf, 0x05, 0x00, 0x00, 0xd0, 0x05, 0x00, 0x00, 0xc6, 0x05, 0x00, 0x00, + 0xc6, 0x05, 0x00, 0x00, 0xc5, 0x05, 0x00, 0x00, 0xcf, 0x05, 0x00, 0x00, 0xd0, 0x05, 0x00, 0x00, 0xd1, 0x05, 0x00, 0x00, 0xc7, 0x05, 0x00, 0x00, 0xc7, 0x05, + 0x00, 0x00, 0xc6, 0x05, 0x00, 0x00, 0xd0, 0x05, 0x00, 0x00, 0xd1, 0x05, 0x00, 0x00, 0xd2, 0x05, 0x00, 0x00, 0xc8, 0x05, 0x00, 0x00, 0xc8, 0x05, 0x00, 0x00, + 0xc7, 0x05, 0x00, 0x00, 0xd1, 0x05, 0x00, 0x00, 0xd2, 0x05, 0x00, 0x00, 0xd3, 0x05, 0x00, 0x00, 0xc9, 0x05, 0x00, 0x00, 0xc9, 0x05, 0x00, 0x00, 0xc8, 0x05, + 0x00, 0x00, 0xd2, 0x05, 0x00, 0x00, 0xd3, 0x05, 0x00, 0x00, 0xd4, 0x05, 0x00, 0x00, 0xca, 0x05, 0x00, 0x00, 0xca, 0x05, 0x00, 0x00, 0xc9, 0x05, 0x00, 0x00, + 0xd3, 0x05, 0x00, 0x00, 0xd4, 0x05, 0x00, 0x00, 0x2d, 0x01, 0x00, 0x00, 0xcb, 0x05, 0x00, 0x00, 0xcb, 0x05, 0x00, 0x00, 0xca, 0x05, 0x00, 0x00, 0xd4, 0x05, + 0x00, 0x00, 0x2d, 0x01, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0xcc, 0x05, 0x00, 0x00, 0xcc, 0x05, 0x00, 0x00, 0xcb, 0x05, 0x00, 0x00, 0x2d, 0x01, 0x00, 0x00, + 0x2c, 0x01, 0x00, 0x00, 0xb0, 0x05, 0x00, 0x00, 0xcd, 0x05, 0x00, 0x00, 0xcd, 0x05, 0x00, 0x00, 0xcc, 0x05, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0xb0, 0x05, + 0x00, 0x00, 0xb1, 0x05, 0x00, 0x00, 0xc0, 0x05, 0x00, 0x00, 0xc0, 0x05, 0x00, 0x00, 0xcd, 0x05, 0x00, 0x00, 0xb0, 0x05, 0x00, 0x00, 0xb1, 0x05, 0x00, 0x00, + 0xd5, 0x05, 0x00, 0x00, 0x2a, 0x01, 0x00, 0x00, 0x2a, 0x01, 0x00, 0x00, 0x27, 0x01, 0x00, 0x00, 0xb1, 0x05, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00, 0x38, 0x01, + 0x00, 0x00, 0xce, 0x05, 0x00, 0x00, 0xce, 0x05, 0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00, 0xce, 0x05, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, + 0x3a, 0x01, 0x00, 0x00, 0x3a, 0x01, 0x00, 0x00, 0xcf, 0x05, 0x00, 0x00, 0xce, 0x05, 0x00, 0x00, 0xd6, 0x05, 0x00, 0x00, 0xd0, 0x05, 0x00, 0x00, 0xcf, 0x05, + 0x00, 0x00, 0xcf, 0x05, 0x00, 0x00, 0x3a, 0x01, 0x00, 0x00, 0xd6, 0x05, 0x00, 0x00, 0xd0, 0x05, 0x00, 0x00, 0xd6, 0x05, 0x00, 0x00, 0xd7, 0x05, 0x00, 0x00, + 0xd7, 0x05, 0x00, 0x00, 0xd1, 0x05, 0x00, 0x00, 0xd0, 0x05, 0x00, 0x00, 0xd7, 0x05, 0x00, 0x00, 0xd8, 0x05, 0x00, 0x00, 0xd2, 0x05, 0x00, 0x00, 0xd2, 0x05, + 0x00, 0x00, 0xd1, 0x05, 0x00, 0x00, 0xd7, 0x05, 0x00, 0x00, 0xd3, 0x05, 0x00, 0x00, 0xd2, 0x05, 0x00, 0x00, 0xd8, 0x05, 0x00, 0x00, 0xd8, 0x05, 0x00, 0x00, + 0xd9, 0x05, 0x00, 0x00, 0xd3, 0x05, 0x00, 0x00, 0xd9, 0x05, 0x00, 0x00, 0xda, 0x05, 0x00, 0x00, 0xd4, 0x05, 0x00, 0x00, 0xd4, 0x05, 0x00, 0x00, 0xd3, 0x05, + 0x00, 0x00, 0xd9, 0x05, 0x00, 0x00, 0xdb, 0x05, 0x00, 0x00, 0x2d, 0x01, 0x00, 0x00, 0xd4, 0x05, 0x00, 0x00, 0xd4, 0x05, 0x00, 0x00, 0xda, 0x05, 0x00, 0x00, + 0xdb, 0x05, 0x00, 0x00, 0xae, 0x05, 0x00, 0x00, 0xac, 0x05, 0x00, 0x00, 0xb0, 0x05, 0x00, 0x00, 0xb0, 0x05, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0xae, 0x05, + 0x00, 0x00, 0xaf, 0x05, 0x00, 0x00, 0xd5, 0x05, 0x00, 0x00, 0xb1, 0x05, 0x00, 0x00, 0xb1, 0x05, 0x00, 0x00, 0xad, 0x05, 0x00, 0x00, 0xaf, 0x05, 0x00, 0x00, + 0x95, 0x01, 0x00, 0x00, 0x2a, 0x01, 0x00, 0x00, 0xd5, 0x05, 0x00, 0x00, 0xd5, 0x05, 0x00, 0x00, 0xdc, 0x05, 0x00, 0x00, 0x95, 0x01, 0x00, 0x00, 0x30, 0x01, + 0x00, 0x00, 0x46, 0x01, 0x00, 0x00, 0xdd, 0x05, 0x00, 0x00, 0xdd, 0x05, 0x00, 0x00, 0x2e, 0x01, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0x36, 0x01, 0x00, 0x00, + 0x46, 0x01, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x36, 0x01, 0x00, 0x00, 0xdd, 0x05, 0x00, 0x00, 0x46, 0x01, + 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, 0xde, 0x05, 0x00, 0x00, 0xdd, 0x05, 0x00, 0x00, 0xdd, 0x05, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x00, + 0x31, 0x01, 0x00, 0x00, 0x31, 0x01, 0x00, 0x00, 0x2e, 0x01, 0x00, 0x00, 0xdd, 0x05, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x32, 0x01, 0x00, 0x00, 0x2f, 0x01, + 0x00, 0x00, 0x2f, 0x01, 0x00, 0x00, 0x31, 0x01, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0x2f, 0x01, 0x00, 0x00, 0x33, 0x01, 0x00, 0x00, + 0x33, 0x01, 0x00, 0x00, 0x37, 0x01, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0x37, 0x01, 0x00, 0x00, 0x33, 0x01, 0x00, 0x00, 0xdf, 0x05, 0x00, 0x00, 0xdf, 0x05, + 0x00, 0x00, 0xe0, 0x05, 0x00, 0x00, 0x37, 0x01, 0x00, 0x00, 0x37, 0x01, 0x00, 0x00, 0x13, 0x01, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, + 0x30, 0x01, 0x00, 0x00, 0x37, 0x01, 0x00, 0x00, 0x35, 0x01, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x13, 0x01, 0x00, 0x00, 0x13, 0x01, 0x00, 0x00, 0x12, 0x01, + 0x00, 0x00, 0x35, 0x01, 0x00, 0x00, 0x12, 0x01, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xe1, 0x05, 0x00, 0x00, 0xe1, 0x05, 0x00, 0x00, 0x35, 0x01, 0x00, 0x00, + 0x12, 0x01, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0xe2, 0x05, 0x00, 0x00, 0xdb, 0x05, 0x00, 0x00, 0xdb, 0x05, 0x00, 0x00, 0xe1, 0x05, 0x00, 0x00, 0xa0, 0x05, + 0x00, 0x00, 0x35, 0x01, 0x00, 0x00, 0xe1, 0x05, 0x00, 0x00, 0xe3, 0x05, 0x00, 0x00, 0xe3, 0x05, 0x00, 0x00, 0x36, 0x01, 0x00, 0x00, 0x35, 0x01, 0x00, 0x00, + 0xae, 0x05, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x2b, 0x01, 0x00, 0x00, 0x2b, 0x01, 0x00, 0x00, 0xe4, 0x05, 0x00, 0x00, 0xae, 0x05, 0x00, 0x00, 0xe2, 0x05, + 0x00, 0x00, 0x2b, 0x01, 0x00, 0x00, 0x2d, 0x01, 0x00, 0x00, 0x2d, 0x01, 0x00, 0x00, 0xdb, 0x05, 0x00, 0x00, 0xe2, 0x05, 0x00, 0x00, 0x32, 0x01, 0x00, 0x00, + 0xe5, 0x05, 0x00, 0x00, 0xdf, 0x05, 0x00, 0x00, 0xdf, 0x05, 0x00, 0x00, 0x33, 0x01, 0x00, 0x00, 0x32, 0x01, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x37, 0x01, + 0x00, 0x00, 0xe0, 0x05, 0x00, 0x00, 0xe0, 0x05, 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0xe2, 0x05, 0x00, 0x00, + 0xa0, 0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0x16, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0xdb, 0x05, 0x00, 0x00, 0xda, 0x05, 0x00, 0x00, 0xe3, 0x05, + 0x00, 0x00, 0xe3, 0x05, 0x00, 0x00, 0xe1, 0x05, 0x00, 0x00, 0xdb, 0x05, 0x00, 0x00, 0x2b, 0x01, 0x00, 0x00, 0xe2, 0x05, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, + 0x44, 0x01, 0x00, 0x00, 0xe4, 0x05, 0x00, 0x00, 0x2b, 0x01, 0x00, 0x00, 0xe6, 0x05, 0x00, 0x00, 0xe7, 0x05, 0x00, 0x00, 0xe8, 0x05, 0x00, 0x00, 0xe8, 0x05, + 0x00, 0x00, 0xe9, 0x05, 0x00, 0x00, 0xe6, 0x05, 0x00, 0x00, 0xea, 0x05, 0x00, 0x00, 0xe7, 0x05, 0x00, 0x00, 0xe6, 0x05, 0x00, 0x00, 0xe6, 0x05, 0x00, 0x00, + 0xeb, 0x05, 0x00, 0x00, 0xea, 0x05, 0x00, 0x00, 0xec, 0x05, 0x00, 0x00, 0xe8, 0x05, 0x00, 0x00, 0xe7, 0x05, 0x00, 0x00, 0xe7, 0x05, 0x00, 0x00, 0xed, 0x05, + 0x00, 0x00, 0xec, 0x05, 0x00, 0x00, 0xe8, 0x05, 0x00, 0x00, 0xee, 0x05, 0x00, 0x00, 0xef, 0x05, 0x00, 0x00, 0xef, 0x05, 0x00, 0x00, 0xe9, 0x05, 0x00, 0x00, + 0xe8, 0x05, 0x00, 0x00, 0xf0, 0x05, 0x00, 0x00, 0xe6, 0x05, 0x00, 0x00, 0xe9, 0x05, 0x00, 0x00, 0xe9, 0x05, 0x00, 0x00, 0xf1, 0x05, 0x00, 0x00, 0xf0, 0x05, + 0x00, 0x00, 0xe6, 0x05, 0x00, 0x00, 0xf0, 0x05, 0x00, 0x00, 0xf2, 0x05, 0x00, 0x00, 0xf2, 0x05, 0x00, 0x00, 0xeb, 0x05, 0x00, 0x00, 0xe6, 0x05, 0x00, 0x00, + 0xe9, 0x05, 0x00, 0x00, 0xef, 0x05, 0x00, 0x00, 0x41, 0x01, 0x00, 0x00, 0x41, 0x01, 0x00, 0x00, 0xf1, 0x05, 0x00, 0x00, 0xe9, 0x05, 0x00, 0x00, 0xf3, 0x05, + 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0xf0, 0x05, 0x00, 0x00, 0xf0, 0x05, 0x00, 0x00, 0xf1, 0x05, 0x00, 0x00, 0xf3, 0x05, 0x00, 0x00, 0x39, 0x01, 0x00, 0x00, + 0xf2, 0x05, 0x00, 0x00, 0xf0, 0x05, 0x00, 0x00, 0xf0, 0x05, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0x39, 0x01, 0x00, 0x00, 0xf2, 0x05, 0x00, 0x00, 0x39, 0x01, + 0x00, 0x00, 0xf4, 0x05, 0x00, 0x00, 0xf4, 0x05, 0x00, 0x00, 0xeb, 0x05, 0x00, 0x00, 0xf2, 0x05, 0x00, 0x00, 0xd6, 0x05, 0x00, 0x00, 0x3a, 0x01, 0x00, 0x00, + 0x3b, 0x01, 0x00, 0x00, 0x3b, 0x01, 0x00, 0x00, 0xf5, 0x05, 0x00, 0x00, 0xd6, 0x05, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00, 0xf4, 0x05, + 0x00, 0x00, 0xf4, 0x05, 0x00, 0x00, 0x39, 0x01, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0xf3, 0x05, 0x00, 0x00, 0xf6, 0x05, 0x00, 0x00, + 0xf6, 0x05, 0x00, 0x00, 0x3b, 0x01, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0x3e, 0x01, 0x00, 0x00, 0xf7, 0x05, 0x00, 0x00, 0xf7, 0x05, + 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0x3e, 0x01, 0x00, 0x00, 0xf8, 0x05, 0x00, 0x00, 0xf9, 0x05, 0x00, 0x00, 0xf9, 0x05, 0x00, 0x00, + 0xf7, 0x05, 0x00, 0x00, 0x3e, 0x01, 0x00, 0x00, 0xf7, 0x05, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x43, 0x01, 0x00, 0x00, 0x43, 0x01, 0x00, 0x00, 0x42, 0x01, + 0x00, 0x00, 0xf7, 0x05, 0x00, 0x00, 0xef, 0x05, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x41, 0x01, 0x00, 0x00, + 0xef, 0x05, 0x00, 0x00, 0xef, 0x05, 0x00, 0x00, 0xee, 0x05, 0x00, 0x00, 0x3d, 0x01, 0x00, 0x00, 0x3d, 0x01, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0xef, 0x05, + 0x00, 0x00, 0x41, 0x01, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xf3, 0x05, 0x00, 0x00, 0xf3, 0x05, 0x00, 0x00, 0xf1, 0x05, 0x00, 0x00, 0x41, 0x01, 0x00, 0x00, + 0x28, 0x01, 0x00, 0x00, 0x29, 0x01, 0x00, 0x00, 0xfa, 0x05, 0x00, 0x00, 0xfa, 0x05, 0x00, 0x00, 0xf4, 0x05, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00, 0xfb, 0x05, + 0x00, 0x00, 0xfa, 0x05, 0x00, 0x00, 0x29, 0x01, 0x00, 0x00, 0x29, 0x01, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0xfb, 0x05, 0x00, 0x00, 0xfa, 0x05, 0x00, 0x00, + 0xea, 0x05, 0x00, 0x00, 0xeb, 0x05, 0x00, 0x00, 0xeb, 0x05, 0x00, 0x00, 0xf4, 0x05, 0x00, 0x00, 0xfa, 0x05, 0x00, 0x00, 0xfc, 0x05, 0x00, 0x00, 0xf5, 0x05, + 0x00, 0x00, 0x3b, 0x01, 0x00, 0x00, 0x3b, 0x01, 0x00, 0x00, 0xf6, 0x05, 0x00, 0x00, 0xfc, 0x05, 0x00, 0x00, 0xd7, 0x05, 0x00, 0x00, 0xd6, 0x05, 0x00, 0x00, + 0xf5, 0x05, 0x00, 0x00, 0xf5, 0x05, 0x00, 0x00, 0xfd, 0x05, 0x00, 0x00, 0xd7, 0x05, 0x00, 0x00, 0xf5, 0x05, 0x00, 0x00, 0xfc, 0x05, 0x00, 0x00, 0xfe, 0x05, + 0x00, 0x00, 0xfe, 0x05, 0x00, 0x00, 0xfd, 0x05, 0x00, 0x00, 0xf5, 0x05, 0x00, 0x00, 0xd8, 0x05, 0x00, 0x00, 0xd7, 0x05, 0x00, 0x00, 0xfd, 0x05, 0x00, 0x00, + 0xfd, 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xd8, 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xfd, 0x05, 0x00, 0x00, 0xfe, 0x05, 0x00, 0x00, 0xfe, 0x05, + 0x00, 0x00, 0xde, 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xd9, 0x05, 0x00, 0x00, 0xd8, 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0xd9, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xde, 0x05, 0x00, 0x00, 0xde, 0x05, 0x00, 0x00, 0x45, 0x01, + 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xda, 0x05, 0x00, 0x00, 0xd9, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xe3, 0x05, 0x00, 0x00, + 0xda, 0x05, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0xae, 0x05, 0x00, 0x00, 0xae, 0x05, 0x00, 0x00, 0xe4, 0x05, 0x00, 0x00, 0x0e, 0x01, + 0x00, 0x00, 0x96, 0x01, 0x00, 0x00, 0x3d, 0x01, 0x00, 0x00, 0xee, 0x05, 0x00, 0x00, 0xee, 0x05, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x96, 0x01, 0x00, 0x00, + 0x40, 0x01, 0x00, 0x00, 0x43, 0x01, 0x00, 0x00, 0xf6, 0x05, 0x00, 0x00, 0xf6, 0x05, 0x00, 0x00, 0xf3, 0x05, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x48, 0x01, + 0x00, 0x00, 0xfc, 0x05, 0x00, 0x00, 0xf6, 0x05, 0x00, 0x00, 0xf6, 0x05, 0x00, 0x00, 0x43, 0x01, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0xe3, 0x05, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, 0x36, 0x01, 0x00, 0x00, 0xe3, 0x05, 0x00, 0x00, 0x0d, 0x01, 0x00, 0x00, 0x0e, 0x01, + 0x00, 0x00, 0xe4, 0x05, 0x00, 0x00, 0xe4, 0x05, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x0d, 0x01, 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, + 0x0d, 0x01, 0x00, 0x00, 0x0d, 0x01, 0x00, 0x00, 0x16, 0x01, 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x00, 0xfe, 0x05, 0x00, 0x00, 0xfc, 0x05, + 0x00, 0x00, 0xfc, 0x05, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x00, 0xe5, 0x05, 0x00, 0x00, 0x32, 0x01, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, + 0x49, 0x01, 0x00, 0x00, 0x02, 0x06, 0x00, 0x00, 0xe5, 0x05, 0x00, 0x00, 0xf7, 0x05, 0x00, 0x00, 0xf9, 0x05, 0x00, 0x00, 0x02, 0x06, 0x00, 0x00, 0x02, 0x06, + 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0xf7, 0x05, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0xe5, 0x05, 0x00, 0x00, 0x02, 0x06, 0x00, 0x00, 0x02, 0x06, 0x00, 0x00, + 0x04, 0x06, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0xdf, 0x05, 0x00, 0x00, 0xe5, 0x05, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x05, 0x06, + 0x00, 0x00, 0xdf, 0x05, 0x00, 0x00, 0x02, 0x06, 0x00, 0x00, 0xf9, 0x05, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x04, 0x06, 0x00, 0x00, + 0x02, 0x06, 0x00, 0x00, 0x07, 0x06, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x04, 0x06, 0x00, 0x00, 0x04, 0x06, 0x00, 0x00, 0x08, 0x06, 0x00, 0x00, 0x07, 0x06, + 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x07, 0x06, 0x00, 0x00, 0x09, 0x06, 0x00, 0x00, 0x09, 0x06, 0x00, 0x00, 0x05, 0x06, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, + 0x08, 0x06, 0x00, 0x00, 0x04, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x0a, 0x06, 0x00, 0x00, 0x08, 0x06, 0x00, 0x00, 0x7c, 0x01, + 0x00, 0x00, 0x07, 0x06, 0x00, 0x00, 0x08, 0x06, 0x00, 0x00, 0x08, 0x06, 0x00, 0x00, 0x0b, 0x06, 0x00, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x07, 0x06, 0x00, 0x00, + 0x7c, 0x01, 0x00, 0x00, 0x7b, 0x01, 0x00, 0x00, 0x7b, 0x01, 0x00, 0x00, 0x09, 0x06, 0x00, 0x00, 0x07, 0x06, 0x00, 0x00, 0x0b, 0x06, 0x00, 0x00, 0x08, 0x06, + 0x00, 0x00, 0x0a, 0x06, 0x00, 0x00, 0x0a, 0x06, 0x00, 0x00, 0x0c, 0x06, 0x00, 0x00, 0x0b, 0x06, 0x00, 0x00, 0x79, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, + 0x7c, 0x01, 0x00, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x0b, 0x06, 0x00, 0x00, 0x79, 0x01, 0x00, 0x00, 0x88, 0x01, 0x00, 0x00, 0x9f, 0x05, 0x00, 0x00, 0x4b, 0x01, + 0x00, 0x00, 0x4b, 0x01, 0x00, 0x00, 0x0d, 0x06, 0x00, 0x00, 0x88, 0x01, 0x00, 0x00, 0x6a, 0x05, 0x00, 0x00, 0x69, 0x05, 0x00, 0x00, 0x52, 0x01, 0x00, 0x00, + 0x52, 0x01, 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, 0x6a, 0x05, 0x00, 0x00, 0x4e, 0x01, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x00, 0x0e, 0x06, 0x00, 0x00, 0x0e, 0x06, + 0x00, 0x00, 0x4f, 0x01, 0x00, 0x00, 0x4e, 0x01, 0x00, 0x00, 0x53, 0x01, 0x00, 0x00, 0x52, 0x01, 0x00, 0x00, 0x8f, 0x01, 0x00, 0x00, 0x8f, 0x01, 0x00, 0x00, + 0x8e, 0x01, 0x00, 0x00, 0x53, 0x01, 0x00, 0x00, 0x0f, 0x06, 0x00, 0x00, 0x6a, 0x05, 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, 0x79, 0x01, + 0x00, 0x00, 0x0f, 0x06, 0x00, 0x00, 0x10, 0x06, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x55, 0x01, 0x00, 0x00, 0x55, 0x01, 0x00, 0x00, 0x68, 0x05, 0x00, 0x00, + 0x10, 0x06, 0x00, 0x00, 0x57, 0x01, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x11, 0x06, 0x00, 0x00, 0x11, 0x06, 0x00, 0x00, 0x12, 0x06, 0x00, 0x00, 0x57, 0x01, + 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0x55, 0x01, 0x00, 0x00, 0x57, 0x01, 0x00, 0x00, 0x57, 0x01, 0x00, 0x00, 0x6e, 0x05, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, + 0x6e, 0x05, 0x00, 0x00, 0x57, 0x01, 0x00, 0x00, 0x12, 0x06, 0x00, 0x00, 0x12, 0x06, 0x00, 0x00, 0x73, 0x01, 0x00, 0x00, 0x6e, 0x05, 0x00, 0x00, 0x8f, 0x01, + 0x00, 0x00, 0x6e, 0x05, 0x00, 0x00, 0x73, 0x01, 0x00, 0x00, 0x73, 0x01, 0x00, 0x00, 0x72, 0x01, 0x00, 0x00, 0x8f, 0x01, 0x00, 0x00, 0x6d, 0x05, 0x00, 0x00, + 0x13, 0x06, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x6b, 0x05, 0x00, 0x00, 0x6d, 0x05, 0x00, 0x00, 0x16, 0x04, 0x00, 0x00, 0x59, 0x01, + 0x00, 0x00, 0x58, 0x01, 0x00, 0x00, 0x58, 0x01, 0x00, 0x00, 0x14, 0x06, 0x00, 0x00, 0x16, 0x04, 0x00, 0x00, 0x13, 0x06, 0x00, 0x00, 0x15, 0x06, 0x00, 0x00, + 0x5a, 0x01, 0x00, 0x00, 0x5a, 0x01, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x13, 0x06, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, 0x16, 0x04, 0x00, 0x00, 0x14, 0x06, + 0x00, 0x00, 0x14, 0x06, 0x00, 0x00, 0x16, 0x06, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, 0x1a, 0x04, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, 0x16, 0x06, 0x00, 0x00, + 0x16, 0x06, 0x00, 0x00, 0x17, 0x06, 0x00, 0x00, 0x1a, 0x04, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x00, 0x1a, 0x04, 0x00, 0x00, 0x17, 0x06, 0x00, 0x00, 0x17, 0x06, + 0x00, 0x00, 0x0e, 0x06, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x19, 0x06, 0x00, 0x00, 0x1a, 0x06, 0x00, 0x00, 0x1a, 0x06, 0x00, 0x00, + 0x1b, 0x06, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x19, 0x06, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x1c, 0x06, 0x00, 0x00, 0x1c, 0x06, 0x00, 0x00, 0x1d, 0x06, + 0x00, 0x00, 0x19, 0x06, 0x00, 0x00, 0x1a, 0x06, 0x00, 0x00, 0x19, 0x06, 0x00, 0x00, 0x1e, 0x06, 0x00, 0x00, 0x1e, 0x06, 0x00, 0x00, 0x1f, 0x06, 0x00, 0x00, + 0x1a, 0x06, 0x00, 0x00, 0x1a, 0x06, 0x00, 0x00, 0x20, 0x06, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x1b, 0x06, 0x00, 0x00, 0x1a, 0x06, + 0x00, 0x00, 0x21, 0x06, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x1b, 0x06, 0x00, 0x00, 0x1b, 0x06, 0x00, 0x00, 0x22, 0x06, 0x00, 0x00, 0x21, 0x06, 0x00, 0x00, + 0x23, 0x06, 0x00, 0x00, 0x24, 0x06, 0x00, 0x00, 0x25, 0x06, 0x00, 0x00, 0x25, 0x06, 0x00, 0x00, 0x26, 0x06, 0x00, 0x00, 0x23, 0x06, 0x00, 0x00, 0x27, 0x06, + 0x00, 0x00, 0x24, 0x06, 0x00, 0x00, 0x23, 0x06, 0x00, 0x00, 0x23, 0x06, 0x00, 0x00, 0x28, 0x06, 0x00, 0x00, 0x27, 0x06, 0x00, 0x00, 0x29, 0x06, 0x00, 0x00, + 0x2a, 0x06, 0x00, 0x00, 0x25, 0x06, 0x00, 0x00, 0x25, 0x06, 0x00, 0x00, 0x24, 0x06, 0x00, 0x00, 0x29, 0x06, 0x00, 0x00, 0x25, 0x06, 0x00, 0x00, 0x2b, 0x06, + 0x00, 0x00, 0x2c, 0x06, 0x00, 0x00, 0x2c, 0x06, 0x00, 0x00, 0x26, 0x06, 0x00, 0x00, 0x25, 0x06, 0x00, 0x00, 0x26, 0x06, 0x00, 0x00, 0x2d, 0x06, 0x00, 0x00, + 0x2e, 0x06, 0x00, 0x00, 0x2e, 0x06, 0x00, 0x00, 0x23, 0x06, 0x00, 0x00, 0x26, 0x06, 0x00, 0x00, 0x1e, 0x06, 0x00, 0x00, 0x19, 0x06, 0x00, 0x00, 0x1d, 0x06, + 0x00, 0x00, 0x1d, 0x06, 0x00, 0x00, 0x2f, 0x06, 0x00, 0x00, 0x1e, 0x06, 0x00, 0x00, 0x1e, 0x06, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 0x31, 0x06, 0x00, 0x00, + 0x31, 0x06, 0x00, 0x00, 0x1f, 0x06, 0x00, 0x00, 0x1e, 0x06, 0x00, 0x00, 0x1f, 0x06, 0x00, 0x00, 0x32, 0x06, 0x00, 0x00, 0x20, 0x06, 0x00, 0x00, 0x20, 0x06, + 0x00, 0x00, 0x1a, 0x06, 0x00, 0x00, 0x1f, 0x06, 0x00, 0x00, 0x6d, 0x01, 0x00, 0x00, 0x33, 0x06, 0x00, 0x00, 0x34, 0x06, 0x00, 0x00, 0x34, 0x06, 0x00, 0x00, + 0x35, 0x06, 0x00, 0x00, 0x6d, 0x01, 0x00, 0x00, 0x36, 0x06, 0x00, 0x00, 0x33, 0x06, 0x00, 0x00, 0x6d, 0x01, 0x00, 0x00, 0x6d, 0x01, 0x00, 0x00, 0x71, 0x01, + 0x00, 0x00, 0x36, 0x06, 0x00, 0x00, 0x33, 0x06, 0x00, 0x00, 0x27, 0x06, 0x00, 0x00, 0x28, 0x06, 0x00, 0x00, 0x28, 0x06, 0x00, 0x00, 0x34, 0x06, 0x00, 0x00, + 0x33, 0x06, 0x00, 0x00, 0x34, 0x06, 0x00, 0x00, 0x37, 0x06, 0x00, 0x00, 0x38, 0x06, 0x00, 0x00, 0x38, 0x06, 0x00, 0x00, 0x35, 0x06, 0x00, 0x00, 0x34, 0x06, + 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 0x6d, 0x01, 0x00, 0x00, 0x35, 0x06, 0x00, 0x00, 0x35, 0x06, 0x00, 0x00, 0x31, 0x06, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, + 0x36, 0x06, 0x00, 0x00, 0x39, 0x06, 0x00, 0x00, 0x27, 0x06, 0x00, 0x00, 0x27, 0x06, 0x00, 0x00, 0x33, 0x06, 0x00, 0x00, 0x36, 0x06, 0x00, 0x00, 0x28, 0x06, + 0x00, 0x00, 0x3a, 0x06, 0x00, 0x00, 0x37, 0x06, 0x00, 0x00, 0x37, 0x06, 0x00, 0x00, 0x34, 0x06, 0x00, 0x00, 0x28, 0x06, 0x00, 0x00, 0x39, 0x06, 0x00, 0x00, + 0x29, 0x06, 0x00, 0x00, 0x24, 0x06, 0x00, 0x00, 0x24, 0x06, 0x00, 0x00, 0x27, 0x06, 0x00, 0x00, 0x39, 0x06, 0x00, 0x00, 0x23, 0x06, 0x00, 0x00, 0x2e, 0x06, + 0x00, 0x00, 0x3a, 0x06, 0x00, 0x00, 0x3a, 0x06, 0x00, 0x00, 0x28, 0x06, 0x00, 0x00, 0x23, 0x06, 0x00, 0x00, 0x2a, 0x06, 0x00, 0x00, 0x60, 0x01, 0x00, 0x00, + 0x2b, 0x06, 0x00, 0x00, 0x2b, 0x06, 0x00, 0x00, 0x25, 0x06, 0x00, 0x00, 0x2a, 0x06, 0x00, 0x00, 0x2b, 0x06, 0x00, 0x00, 0x5e, 0x01, 0x00, 0x00, 0x3b, 0x06, + 0x00, 0x00, 0x3b, 0x06, 0x00, 0x00, 0x2c, 0x06, 0x00, 0x00, 0x2b, 0x06, 0x00, 0x00, 0x2c, 0x06, 0x00, 0x00, 0x3c, 0x06, 0x00, 0x00, 0x2d, 0x06, 0x00, 0x00, + 0x2d, 0x06, 0x00, 0x00, 0x26, 0x06, 0x00, 0x00, 0x2c, 0x06, 0x00, 0x00, 0x2b, 0x06, 0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x5f, 0x01, + 0x00, 0x00, 0x5e, 0x01, 0x00, 0x00, 0x2b, 0x06, 0x00, 0x00, 0x5e, 0x01, 0x00, 0x00, 0x5d, 0x01, 0x00, 0x00, 0x3d, 0x06, 0x00, 0x00, 0x3d, 0x06, 0x00, 0x00, + 0x3b, 0x06, 0x00, 0x00, 0x5e, 0x01, 0x00, 0x00, 0x3b, 0x06, 0x00, 0x00, 0x3e, 0x06, 0x00, 0x00, 0x3c, 0x06, 0x00, 0x00, 0x3c, 0x06, 0x00, 0x00, 0x2c, 0x06, + 0x00, 0x00, 0x3b, 0x06, 0x00, 0x00, 0x5d, 0x01, 0x00, 0x00, 0x3f, 0x06, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00, 0x3d, 0x06, 0x00, 0x00, + 0x5d, 0x01, 0x00, 0x00, 0x3d, 0x06, 0x00, 0x00, 0x41, 0x06, 0x00, 0x00, 0x3e, 0x06, 0x00, 0x00, 0x3e, 0x06, 0x00, 0x00, 0x3b, 0x06, 0x00, 0x00, 0x3d, 0x06, + 0x00, 0x00, 0x66, 0x01, 0x00, 0x00, 0x42, 0x06, 0x00, 0x00, 0x3f, 0x06, 0x00, 0x00, 0x3f, 0x06, 0x00, 0x00, 0x5d, 0x01, 0x00, 0x00, 0x66, 0x01, 0x00, 0x00, + 0x3f, 0x06, 0x00, 0x00, 0x43, 0x06, 0x00, 0x00, 0x44, 0x06, 0x00, 0x00, 0x44, 0x06, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00, 0x3f, 0x06, 0x00, 0x00, 0x40, 0x06, + 0x00, 0x00, 0x45, 0x06, 0x00, 0x00, 0x41, 0x06, 0x00, 0x00, 0x41, 0x06, 0x00, 0x00, 0x3d, 0x06, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00, 0x43, 0x06, 0x00, 0x00, + 0x3f, 0x06, 0x00, 0x00, 0x42, 0x06, 0x00, 0x00, 0x42, 0x06, 0x00, 0x00, 0x46, 0x06, 0x00, 0x00, 0x43, 0x06, 0x00, 0x00, 0x22, 0x06, 0x00, 0x00, 0x44, 0x06, + 0x00, 0x00, 0x43, 0x06, 0x00, 0x00, 0x43, 0x06, 0x00, 0x00, 0x21, 0x06, 0x00, 0x00, 0x22, 0x06, 0x00, 0x00, 0x44, 0x06, 0x00, 0x00, 0x47, 0x06, 0x00, 0x00, + 0x45, 0x06, 0x00, 0x00, 0x45, 0x06, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00, 0x44, 0x06, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x21, 0x06, 0x00, 0x00, 0x48, 0x06, + 0x00, 0x00, 0x48, 0x06, 0x00, 0x00, 0x1c, 0x06, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x1b, 0x06, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe2, 0x01, 0x00, 0x00, + 0xe2, 0x01, 0x00, 0x00, 0x22, 0x06, 0x00, 0x00, 0x1b, 0x06, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 0x1e, 0x06, 0x00, 0x00, 0x2f, 0x06, 0x00, 0x00, 0x2f, 0x06, + 0x00, 0x00, 0x49, 0x06, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 0x31, 0x06, 0x00, 0x00, 0x4a, 0x06, 0x00, 0x00, 0x32, 0x06, 0x00, 0x00, 0x32, 0x06, 0x00, 0x00, + 0x1f, 0x06, 0x00, 0x00, 0x31, 0x06, 0x00, 0x00, 0x6d, 0x01, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 0x49, 0x06, 0x00, 0x00, 0x49, 0x06, 0x00, 0x00, 0x6b, 0x01, + 0x00, 0x00, 0x6d, 0x01, 0x00, 0x00, 0x35, 0x06, 0x00, 0x00, 0x38, 0x06, 0x00, 0x00, 0x4a, 0x06, 0x00, 0x00, 0x4a, 0x06, 0x00, 0x00, 0x31, 0x06, 0x00, 0x00, + 0x35, 0x06, 0x00, 0x00, 0x4b, 0x06, 0x00, 0x00, 0x7d, 0x01, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x61, 0x01, 0x00, 0x00, 0x4b, 0x06, + 0x00, 0x00, 0x4c, 0x06, 0x00, 0x00, 0x4d, 0x06, 0x00, 0x00, 0x7d, 0x01, 0x00, 0x00, 0x7d, 0x01, 0x00, 0x00, 0x4b, 0x06, 0x00, 0x00, 0x4c, 0x06, 0x00, 0x00, + 0x5f, 0x01, 0x00, 0x00, 0x7d, 0x01, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x65, 0x01, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x61, 0x01, + 0x00, 0x00, 0x4e, 0x06, 0x00, 0x00, 0x4f, 0x06, 0x00, 0x00, 0x4f, 0x06, 0x00, 0x00, 0x4b, 0x06, 0x00, 0x00, 0x61, 0x01, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, + 0x36, 0x06, 0x00, 0x00, 0x71, 0x01, 0x00, 0x00, 0x71, 0x01, 0x00, 0x00, 0x63, 0x01, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, 0x50, 0x06, 0x00, 0x00, 0x64, 0x01, + 0x00, 0x00, 0x63, 0x01, 0x00, 0x00, 0x63, 0x01, 0x00, 0x00, 0x51, 0x06, 0x00, 0x00, 0x50, 0x06, 0x00, 0x00, 0x52, 0x06, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, + 0x64, 0x01, 0x00, 0x00, 0x64, 0x01, 0x00, 0x00, 0x53, 0x06, 0x00, 0x00, 0x52, 0x06, 0x00, 0x00, 0x2a, 0x06, 0x00, 0x00, 0x4e, 0x06, 0x00, 0x00, 0x61, 0x01, + 0x00, 0x00, 0x61, 0x01, 0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x2a, 0x06, 0x00, 0x00, 0x4e, 0x06, 0x00, 0x00, 0x54, 0x06, 0x00, 0x00, 0x55, 0x06, 0x00, 0x00, + 0x55, 0x06, 0x00, 0x00, 0x4f, 0x06, 0x00, 0x00, 0x4e, 0x06, 0x00, 0x00, 0x56, 0x06, 0x00, 0x00, 0x4c, 0x06, 0x00, 0x00, 0x4b, 0x06, 0x00, 0x00, 0x4b, 0x06, + 0x00, 0x00, 0x4f, 0x06, 0x00, 0x00, 0x56, 0x06, 0x00, 0x00, 0x54, 0x06, 0x00, 0x00, 0x4e, 0x06, 0x00, 0x00, 0x2a, 0x06, 0x00, 0x00, 0x2a, 0x06, 0x00, 0x00, + 0x29, 0x06, 0x00, 0x00, 0x54, 0x06, 0x00, 0x00, 0x54, 0x06, 0x00, 0x00, 0x52, 0x06, 0x00, 0x00, 0x53, 0x06, 0x00, 0x00, 0x53, 0x06, 0x00, 0x00, 0x55, 0x06, + 0x00, 0x00, 0x54, 0x06, 0x00, 0x00, 0x57, 0x06, 0x00, 0x00, 0x56, 0x06, 0x00, 0x00, 0x4f, 0x06, 0x00, 0x00, 0x4f, 0x06, 0x00, 0x00, 0x55, 0x06, 0x00, 0x00, + 0x57, 0x06, 0x00, 0x00, 0x52, 0x06, 0x00, 0x00, 0x54, 0x06, 0x00, 0x00, 0x29, 0x06, 0x00, 0x00, 0x29, 0x06, 0x00, 0x00, 0x39, 0x06, 0x00, 0x00, 0x52, 0x06, + 0x00, 0x00, 0x58, 0x06, 0x00, 0x00, 0x57, 0x06, 0x00, 0x00, 0x55, 0x06, 0x00, 0x00, 0x55, 0x06, 0x00, 0x00, 0x53, 0x06, 0x00, 0x00, 0x58, 0x06, 0x00, 0x00, + 0x52, 0x06, 0x00, 0x00, 0x39, 0x06, 0x00, 0x00, 0x36, 0x06, 0x00, 0x00, 0x36, 0x06, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, 0x52, 0x06, 0x00, 0x00, 0x64, 0x01, + 0x00, 0x00, 0x50, 0x06, 0x00, 0x00, 0x58, 0x06, 0x00, 0x00, 0x58, 0x06, 0x00, 0x00, 0x53, 0x06, 0x00, 0x00, 0x64, 0x01, 0x00, 0x00, 0x42, 0x06, 0x00, 0x00, + 0x66, 0x01, 0x00, 0x00, 0x67, 0x01, 0x00, 0x00, 0x67, 0x01, 0x00, 0x00, 0x6a, 0x01, 0x00, 0x00, 0x42, 0x06, 0x00, 0x00, 0x46, 0x06, 0x00, 0x00, 0x42, 0x06, + 0x00, 0x00, 0x6a, 0x01, 0x00, 0x00, 0x6a, 0x01, 0x00, 0x00, 0x59, 0x06, 0x00, 0x00, 0x46, 0x06, 0x00, 0x00, 0x5a, 0x06, 0x00, 0x00, 0x59, 0x06, 0x00, 0x00, + 0x6a, 0x01, 0x00, 0x00, 0x6a, 0x01, 0x00, 0x00, 0x69, 0x01, 0x00, 0x00, 0x5a, 0x06, 0x00, 0x00, 0x48, 0x06, 0x00, 0x00, 0x46, 0x06, 0x00, 0x00, 0x59, 0x06, + 0x00, 0x00, 0x59, 0x06, 0x00, 0x00, 0x5b, 0x06, 0x00, 0x00, 0x48, 0x06, 0x00, 0x00, 0x1c, 0x06, 0x00, 0x00, 0x48, 0x06, 0x00, 0x00, 0x5b, 0x06, 0x00, 0x00, + 0x5b, 0x06, 0x00, 0x00, 0x5c, 0x06, 0x00, 0x00, 0x1c, 0x06, 0x00, 0x00, 0x5d, 0x06, 0x00, 0x00, 0x5c, 0x06, 0x00, 0x00, 0x5b, 0x06, 0x00, 0x00, 0x5b, 0x06, + 0x00, 0x00, 0x5e, 0x06, 0x00, 0x00, 0x5d, 0x06, 0x00, 0x00, 0x1d, 0x06, 0x00, 0x00, 0x1c, 0x06, 0x00, 0x00, 0x5c, 0x06, 0x00, 0x00, 0x5c, 0x06, 0x00, 0x00, + 0x5f, 0x06, 0x00, 0x00, 0x1d, 0x06, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x5f, 0x06, 0x00, 0x00, 0x5c, 0x06, 0x00, 0x00, 0x5c, 0x06, 0x00, 0x00, 0x5d, 0x06, + 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x2f, 0x06, 0x00, 0x00, 0x1d, 0x06, 0x00, 0x00, 0x5f, 0x06, 0x00, 0x00, 0x5f, 0x06, 0x00, 0x00, 0x61, 0x06, 0x00, 0x00, + 0x2f, 0x06, 0x00, 0x00, 0x62, 0x06, 0x00, 0x00, 0x61, 0x06, 0x00, 0x00, 0x5f, 0x06, 0x00, 0x00, 0x5f, 0x06, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x62, 0x06, + 0x00, 0x00, 0x49, 0x06, 0x00, 0x00, 0x2f, 0x06, 0x00, 0x00, 0x61, 0x06, 0x00, 0x00, 0x61, 0x06, 0x00, 0x00, 0x63, 0x06, 0x00, 0x00, 0x49, 0x06, 0x00, 0x00, + 0x64, 0x06, 0x00, 0x00, 0x63, 0x06, 0x00, 0x00, 0x61, 0x06, 0x00, 0x00, 0x61, 0x06, 0x00, 0x00, 0x62, 0x06, 0x00, 0x00, 0x64, 0x06, 0x00, 0x00, 0x6b, 0x01, + 0x00, 0x00, 0x49, 0x06, 0x00, 0x00, 0x63, 0x06, 0x00, 0x00, 0x63, 0x06, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x6b, 0x01, 0x00, 0x00, 0x6e, 0x01, 0x00, 0x00, + 0x70, 0x01, 0x00, 0x00, 0x63, 0x06, 0x00, 0x00, 0x63, 0x06, 0x00, 0x00, 0x64, 0x06, 0x00, 0x00, 0x6e, 0x01, 0x00, 0x00, 0x6c, 0x01, 0x00, 0x00, 0x6b, 0x01, + 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x6f, 0x01, 0x00, 0x00, 0x6c, 0x01, 0x00, 0x00, 0x7e, 0x01, 0x00, 0x00, 0x63, 0x01, 0x00, 0x00, + 0x71, 0x01, 0x00, 0x00, 0x71, 0x01, 0x00, 0x00, 0x6f, 0x01, 0x00, 0x00, 0x7e, 0x01, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0x73, 0x01, 0x00, 0x00, 0x5d, 0x06, + 0x00, 0x00, 0x5d, 0x06, 0x00, 0x00, 0x5e, 0x06, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0x12, 0x06, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x5d, 0x06, 0x00, 0x00, + 0x5d, 0x06, 0x00, 0x00, 0x73, 0x01, 0x00, 0x00, 0x12, 0x06, 0x00, 0x00, 0x5e, 0x06, 0x00, 0x00, 0x5a, 0x06, 0x00, 0x00, 0x65, 0x06, 0x00, 0x00, 0x65, 0x06, + 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0x5e, 0x06, 0x00, 0x00, 0x76, 0x01, 0x00, 0x00, 0x6e, 0x01, 0x00, 0x00, 0x64, 0x06, 0x00, 0x00, 0x64, 0x06, 0x00, 0x00, + 0x66, 0x06, 0x00, 0x00, 0x76, 0x01, 0x00, 0x00, 0x7f, 0x01, 0x00, 0x00, 0x6f, 0x01, 0x00, 0x00, 0x76, 0x01, 0x00, 0x00, 0x76, 0x01, 0x00, 0x00, 0x67, 0x06, + 0x00, 0x00, 0x7f, 0x01, 0x00, 0x00, 0x67, 0x01, 0x00, 0x00, 0x77, 0x01, 0x00, 0x00, 0x53, 0x01, 0x00, 0x00, 0x53, 0x01, 0x00, 0x00, 0x75, 0x01, 0x00, 0x00, + 0x67, 0x01, 0x00, 0x00, 0x65, 0x06, 0x00, 0x00, 0x5a, 0x06, 0x00, 0x00, 0x69, 0x01, 0x00, 0x00, 0x69, 0x01, 0x00, 0x00, 0x75, 0x01, 0x00, 0x00, 0x65, 0x06, + 0x00, 0x00, 0x66, 0x06, 0x00, 0x00, 0x64, 0x06, 0x00, 0x00, 0x62, 0x06, 0x00, 0x00, 0x62, 0x06, 0x00, 0x00, 0x11, 0x06, 0x00, 0x00, 0x66, 0x06, 0x00, 0x00, + 0x68, 0x06, 0x00, 0x00, 0x67, 0x06, 0x00, 0x00, 0x76, 0x01, 0x00, 0x00, 0x76, 0x01, 0x00, 0x00, 0x66, 0x06, 0x00, 0x00, 0x68, 0x06, 0x00, 0x00, 0x75, 0x01, + 0x00, 0x00, 0x53, 0x01, 0x00, 0x00, 0x8e, 0x01, 0x00, 0x00, 0x8e, 0x01, 0x00, 0x00, 0x65, 0x06, 0x00, 0x00, 0x75, 0x01, 0x00, 0x00, 0x5b, 0x06, 0x00, 0x00, + 0x59, 0x06, 0x00, 0x00, 0x5a, 0x06, 0x00, 0x00, 0x5a, 0x06, 0x00, 0x00, 0x5e, 0x06, 0x00, 0x00, 0x5b, 0x06, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0x65, 0x06, + 0x00, 0x00, 0x8e, 0x01, 0x00, 0x00, 0x8e, 0x01, 0x00, 0x00, 0x72, 0x01, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0x11, 0x06, 0x00, 0x00, 0x62, 0x06, 0x00, 0x00, + 0x60, 0x06, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x12, 0x06, 0x00, 0x00, 0x11, 0x06, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x68, 0x06, 0x00, 0x00, 0x66, 0x06, + 0x00, 0x00, 0x66, 0x06, 0x00, 0x00, 0x11, 0x06, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x77, 0x01, 0x00, 0x00, 0x67, 0x01, 0x00, 0x00, + 0x67, 0x01, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x77, 0x01, 0x00, 0x00, 0x79, 0x01, 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, 0x54, 0x01, + 0x00, 0x00, 0x53, 0x01, 0x00, 0x00, 0x77, 0x01, 0x00, 0x00, 0x69, 0x06, 0x00, 0x00, 0x51, 0x06, 0x00, 0x00, 0x63, 0x01, 0x00, 0x00, 0x63, 0x01, 0x00, 0x00, + 0x7e, 0x01, 0x00, 0x00, 0x69, 0x06, 0x00, 0x00, 0x6a, 0x06, 0x00, 0x00, 0x6b, 0x06, 0x00, 0x00, 0x50, 0x06, 0x00, 0x00, 0x50, 0x06, 0x00, 0x00, 0x51, 0x06, + 0x00, 0x00, 0x6a, 0x06, 0x00, 0x00, 0x7b, 0x01, 0x00, 0x00, 0x7a, 0x01, 0x00, 0x00, 0x7d, 0x01, 0x00, 0x00, 0x7d, 0x01, 0x00, 0x00, 0x4d, 0x06, 0x00, 0x00, + 0x7b, 0x01, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x7a, 0x01, 0x00, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x68, 0x01, + 0x00, 0x00, 0x09, 0x06, 0x00, 0x00, 0x7b, 0x01, 0x00, 0x00, 0x4d, 0x06, 0x00, 0x00, 0x4d, 0x06, 0x00, 0x00, 0x6c, 0x06, 0x00, 0x00, 0x09, 0x06, 0x00, 0x00, + 0x4d, 0x06, 0x00, 0x00, 0x4c, 0x06, 0x00, 0x00, 0x6d, 0x06, 0x00, 0x00, 0x6d, 0x06, 0x00, 0x00, 0x6c, 0x06, 0x00, 0x00, 0x4d, 0x06, 0x00, 0x00, 0x6e, 0x06, + 0x00, 0x00, 0x6d, 0x06, 0x00, 0x00, 0x4c, 0x06, 0x00, 0x00, 0x4c, 0x06, 0x00, 0x00, 0x56, 0x06, 0x00, 0x00, 0x6e, 0x06, 0x00, 0x00, 0x56, 0x06, 0x00, 0x00, + 0x57, 0x06, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x6e, 0x06, 0x00, 0x00, 0x56, 0x06, 0x00, 0x00, 0x57, 0x06, 0x00, 0x00, 0x58, 0x06, + 0x00, 0x00, 0x6f, 0x06, 0x00, 0x00, 0x6f, 0x06, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x57, 0x06, 0x00, 0x00, 0x58, 0x06, 0x00, 0x00, 0x50, 0x06, 0x00, 0x00, + 0x6b, 0x06, 0x00, 0x00, 0x6b, 0x06, 0x00, 0x00, 0x6f, 0x06, 0x00, 0x00, 0x58, 0x06, 0x00, 0x00, 0x99, 0x01, 0x00, 0x00, 0x6a, 0x06, 0x00, 0x00, 0x51, 0x06, + 0x00, 0x00, 0x51, 0x06, 0x00, 0x00, 0x69, 0x06, 0x00, 0x00, 0x99, 0x01, 0x00, 0x00, 0x70, 0x06, 0x00, 0x00, 0x69, 0x06, 0x00, 0x00, 0x7e, 0x01, 0x00, 0x00, + 0x7e, 0x01, 0x00, 0x00, 0x7f, 0x01, 0x00, 0x00, 0x70, 0x06, 0x00, 0x00, 0x71, 0x06, 0x00, 0x00, 0x72, 0x06, 0x00, 0x00, 0x73, 0x06, 0x00, 0x00, 0x73, 0x06, + 0x00, 0x00, 0x74, 0x06, 0x00, 0x00, 0x71, 0x06, 0x00, 0x00, 0x75, 0x06, 0x00, 0x00, 0x76, 0x06, 0x00, 0x00, 0x72, 0x06, 0x00, 0x00, 0x72, 0x06, 0x00, 0x00, + 0x71, 0x06, 0x00, 0x00, 0x75, 0x06, 0x00, 0x00, 0x72, 0x06, 0x00, 0x00, 0x77, 0x06, 0x00, 0x00, 0x78, 0x06, 0x00, 0x00, 0x78, 0x06, 0x00, 0x00, 0x73, 0x06, + 0x00, 0x00, 0x72, 0x06, 0x00, 0x00, 0x74, 0x06, 0x00, 0x00, 0x73, 0x06, 0x00, 0x00, 0x79, 0x06, 0x00, 0x00, 0x79, 0x06, 0x00, 0x00, 0x7a, 0x06, 0x00, 0x00, + 0x74, 0x06, 0x00, 0x00, 0x7b, 0x06, 0x00, 0x00, 0x71, 0x06, 0x00, 0x00, 0x74, 0x06, 0x00, 0x00, 0x74, 0x06, 0x00, 0x00, 0x7c, 0x06, 0x00, 0x00, 0x7b, 0x06, + 0x00, 0x00, 0x7d, 0x06, 0x00, 0x00, 0x7e, 0x06, 0x00, 0x00, 0x82, 0x01, 0x00, 0x00, 0x82, 0x01, 0x00, 0x00, 0x81, 0x01, 0x00, 0x00, 0x7d, 0x06, 0x00, 0x00, + 0x82, 0x01, 0x00, 0x00, 0x7e, 0x06, 0x00, 0x00, 0x7f, 0x06, 0x00, 0x00, 0x7f, 0x06, 0x00, 0x00, 0x80, 0x06, 0x00, 0x00, 0x82, 0x01, 0x00, 0x00, 0x79, 0x06, + 0x00, 0x00, 0x81, 0x06, 0x00, 0x00, 0x7d, 0x06, 0x00, 0x00, 0x7d, 0x06, 0x00, 0x00, 0x81, 0x01, 0x00, 0x00, 0x79, 0x06, 0x00, 0x00, 0x7a, 0x06, 0x00, 0x00, + 0x79, 0x06, 0x00, 0x00, 0x81, 0x01, 0x00, 0x00, 0x81, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x7a, 0x06, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x82, 0x01, + 0x00, 0x00, 0x80, 0x06, 0x00, 0x00, 0x80, 0x06, 0x00, 0x00, 0x82, 0x06, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x83, 0x01, 0x00, 0x00, 0x85, 0x01, 0x00, 0x00, + 0xcd, 0x01, 0x00, 0x00, 0xcd, 0x01, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x83, 0x01, 0x00, 0x00, 0x84, 0x06, 0x00, 0x00, 0xcd, 0x01, 0x00, 0x00, 0x85, 0x01, + 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0xcd, 0x01, 0x00, 0x00, 0xcb, 0x01, 0x00, 0x00, 0xcb, 0x01, 0x00, 0x00, 0xca, 0x01, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, + 0x83, 0x01, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0x85, 0x06, 0x00, 0x00, 0x85, 0x06, 0x00, 0x00, 0x86, 0x06, 0x00, 0x00, 0x83, 0x01, 0x00, 0x00, 0x87, 0x06, + 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x89, 0x06, 0x00, 0x00, 0x89, 0x06, 0x00, 0x00, 0x8a, 0x06, 0x00, 0x00, 0x87, 0x06, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, + 0x87, 0x06, 0x00, 0x00, 0x92, 0x01, 0x00, 0x00, 0x92, 0x01, 0x00, 0x00, 0x91, 0x01, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x8b, 0x06, 0x00, 0x00, 0x89, 0x06, + 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x8c, 0x06, 0x00, 0x00, 0x8b, 0x06, 0x00, 0x00, 0x8d, 0x06, 0x00, 0x00, 0x8e, 0x06, 0x00, 0x00, + 0x8a, 0x06, 0x00, 0x00, 0x8a, 0x06, 0x00, 0x00, 0x89, 0x06, 0x00, 0x00, 0x8d, 0x06, 0x00, 0x00, 0x8a, 0x06, 0x00, 0x00, 0x8f, 0x06, 0x00, 0x00, 0x90, 0x06, + 0x00, 0x00, 0x90, 0x06, 0x00, 0x00, 0x87, 0x06, 0x00, 0x00, 0x8a, 0x06, 0x00, 0x00, 0x9b, 0x05, 0x00, 0x00, 0x91, 0x06, 0x00, 0x00, 0x92, 0x06, 0x00, 0x00, + 0x92, 0x06, 0x00, 0x00, 0x93, 0x06, 0x00, 0x00, 0x9b, 0x05, 0x00, 0x00, 0x91, 0x06, 0x00, 0x00, 0x9b, 0x05, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x07, 0x01, + 0x00, 0x00, 0x73, 0x05, 0x00, 0x00, 0x91, 0x06, 0x00, 0x00, 0x92, 0x06, 0x00, 0x00, 0x91, 0x06, 0x00, 0x00, 0x94, 0x06, 0x00, 0x00, 0x94, 0x06, 0x00, 0x00, + 0x95, 0x06, 0x00, 0x00, 0x92, 0x06, 0x00, 0x00, 0x92, 0x06, 0x00, 0x00, 0x96, 0x06, 0x00, 0x00, 0x97, 0x06, 0x00, 0x00, 0x97, 0x06, 0x00, 0x00, 0x93, 0x06, + 0x00, 0x00, 0x92, 0x06, 0x00, 0x00, 0x9b, 0x05, 0x00, 0x00, 0x93, 0x06, 0x00, 0x00, 0x98, 0x06, 0x00, 0x00, 0x98, 0x06, 0x00, 0x00, 0x9c, 0x05, 0x00, 0x00, + 0x9b, 0x05, 0x00, 0x00, 0x96, 0x06, 0x00, 0x00, 0x92, 0x06, 0x00, 0x00, 0x95, 0x06, 0x00, 0x00, 0x95, 0x06, 0x00, 0x00, 0x99, 0x06, 0x00, 0x00, 0x96, 0x06, + 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0x97, 0x06, 0x00, 0x00, 0x96, 0x06, 0x00, 0x00, 0x96, 0x06, 0x00, 0x00, 0x9b, 0x06, 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, + 0x93, 0x06, 0x00, 0x00, 0x97, 0x06, 0x00, 0x00, 0x9c, 0x06, 0x00, 0x00, 0x9c, 0x06, 0x00, 0x00, 0x98, 0x06, 0x00, 0x00, 0x93, 0x06, 0x00, 0x00, 0x9d, 0x06, + 0x00, 0x00, 0x9e, 0x06, 0x00, 0x00, 0x6b, 0x06, 0x00, 0x00, 0x6b, 0x06, 0x00, 0x00, 0x6a, 0x06, 0x00, 0x00, 0x9d, 0x06, 0x00, 0x00, 0x9e, 0x06, 0x00, 0x00, + 0x9d, 0x06, 0x00, 0x00, 0x9f, 0x06, 0x00, 0x00, 0x9f, 0x06, 0x00, 0x00, 0x71, 0x05, 0x00, 0x00, 0x9e, 0x06, 0x00, 0x00, 0x6f, 0x06, 0x00, 0x00, 0x6b, 0x06, + 0x00, 0x00, 0x9e, 0x06, 0x00, 0x00, 0x9e, 0x06, 0x00, 0x00, 0xa0, 0x06, 0x00, 0x00, 0x6f, 0x06, 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0x9d, 0x06, 0x00, 0x00, + 0x6a, 0x06, 0x00, 0x00, 0x6a, 0x06, 0x00, 0x00, 0x99, 0x01, 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0x99, 0x01, 0x00, 0x00, 0x69, 0x06, 0x00, 0x00, 0x70, 0x06, + 0x00, 0x00, 0x70, 0x06, 0x00, 0x00, 0xa1, 0x06, 0x00, 0x00, 0x99, 0x01, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x6f, 0x06, 0x00, 0x00, 0xa0, 0x06, 0x00, 0x00, + 0xa0, 0x06, 0x00, 0x00, 0xa1, 0x01, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x6e, 0x06, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x9f, 0x01, 0x00, 0x00, 0x9f, 0x01, + 0x00, 0x00, 0xa2, 0x06, 0x00, 0x00, 0x6e, 0x06, 0x00, 0x00, 0x6d, 0x06, 0x00, 0x00, 0x6e, 0x06, 0x00, 0x00, 0xa2, 0x06, 0x00, 0x00, 0xa2, 0x06, 0x00, 0x00, + 0x4d, 0x01, 0x00, 0x00, 0x6d, 0x06, 0x00, 0x00, 0x6c, 0x06, 0x00, 0x00, 0x6d, 0x06, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0xa3, 0x06, + 0x00, 0x00, 0x6c, 0x06, 0x00, 0x00, 0x09, 0x06, 0x00, 0x00, 0x6c, 0x06, 0x00, 0x00, 0xa3, 0x06, 0x00, 0x00, 0xa3, 0x06, 0x00, 0x00, 0x05, 0x06, 0x00, 0x00, + 0x09, 0x06, 0x00, 0x00, 0xa1, 0x06, 0x00, 0x00, 0x70, 0x06, 0x00, 0x00, 0x87, 0x01, 0x00, 0x00, 0x87, 0x01, 0x00, 0x00, 0x51, 0x01, 0x00, 0x00, 0xa1, 0x06, + 0x00, 0x00, 0x99, 0x01, 0x00, 0x00, 0xa1, 0x06, 0x00, 0x00, 0xa4, 0x06, 0x00, 0x00, 0xa4, 0x06, 0x00, 0x00, 0x97, 0x01, 0x00, 0x00, 0x99, 0x01, 0x00, 0x00, + 0x70, 0x06, 0x00, 0x00, 0x7f, 0x01, 0x00, 0x00, 0x67, 0x06, 0x00, 0x00, 0x67, 0x06, 0x00, 0x00, 0x87, 0x01, 0x00, 0x00, 0x70, 0x06, 0x00, 0x00, 0x87, 0x01, + 0x00, 0x00, 0x67, 0x06, 0x00, 0x00, 0x68, 0x06, 0x00, 0x00, 0x68, 0x06, 0x00, 0x00, 0x86, 0x01, 0x00, 0x00, 0x87, 0x01, 0x00, 0x00, 0x86, 0x01, 0x00, 0x00, + 0x68, 0x06, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x10, 0x06, 0x00, 0x00, 0x86, 0x01, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x86, 0x01, + 0x00, 0x00, 0x10, 0x06, 0x00, 0x00, 0x10, 0x06, 0x00, 0x00, 0x1e, 0x04, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1e, 0x04, 0x00, 0x00, 0x10, 0x06, 0x00, 0x00, + 0x68, 0x05, 0x00, 0x00, 0x68, 0x05, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x1e, 0x04, 0x00, 0x00, 0x0f, 0x06, 0x00, 0x00, 0xa5, 0x06, 0x00, 0x00, 0x6c, 0x05, + 0x00, 0x00, 0x6c, 0x05, 0x00, 0x00, 0x6a, 0x05, 0x00, 0x00, 0x0f, 0x06, 0x00, 0x00, 0xa6, 0x06, 0x00, 0x00, 0xa5, 0x06, 0x00, 0x00, 0x0f, 0x06, 0x00, 0x00, + 0x0f, 0x06, 0x00, 0x00, 0x0c, 0x06, 0x00, 0x00, 0xa6, 0x06, 0x00, 0x00, 0xa7, 0x06, 0x00, 0x00, 0x6c, 0x05, 0x00, 0x00, 0xa5, 0x06, 0x00, 0x00, 0xa5, 0x06, + 0x00, 0x00, 0xa8, 0x06, 0x00, 0x00, 0xa7, 0x06, 0x00, 0x00, 0xa9, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0xf9, 0x05, 0x00, 0x00, 0xf9, 0x05, 0x00, 0x00, + 0xf8, 0x05, 0x00, 0x00, 0xa9, 0x06, 0x00, 0x00, 0xe0, 0x05, 0x00, 0x00, 0xdf, 0x05, 0x00, 0x00, 0x05, 0x06, 0x00, 0x00, 0x05, 0x06, 0x00, 0x00, 0xa3, 0x06, + 0x00, 0x00, 0xe0, 0x05, 0x00, 0x00, 0x0d, 0x06, 0x00, 0x00, 0x4b, 0x01, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0xa2, 0x06, 0x00, 0x00, + 0x0d, 0x06, 0x00, 0x00, 0x89, 0x01, 0x00, 0x00, 0x88, 0x01, 0x00, 0x00, 0x0d, 0x06, 0x00, 0x00, 0x0d, 0x06, 0x00, 0x00, 0xaa, 0x06, 0x00, 0x00, 0x89, 0x01, + 0x00, 0x00, 0xaa, 0x06, 0x00, 0x00, 0x0d, 0x06, 0x00, 0x00, 0xa2, 0x06, 0x00, 0x00, 0xa2, 0x06, 0x00, 0x00, 0x9f, 0x01, 0x00, 0x00, 0xaa, 0x06, 0x00, 0x00, + 0x8c, 0x01, 0x00, 0x00, 0x89, 0x01, 0x00, 0x00, 0xaa, 0x06, 0x00, 0x00, 0xaa, 0x06, 0x00, 0x00, 0x6f, 0x05, 0x00, 0x00, 0x8c, 0x01, 0x00, 0x00, 0x8c, 0x01, + 0x00, 0x00, 0x8b, 0x01, 0x00, 0x00, 0x8a, 0x01, 0x00, 0x00, 0x8a, 0x01, 0x00, 0x00, 0x89, 0x01, 0x00, 0x00, 0x8c, 0x01, 0x00, 0x00, 0x6f, 0x05, 0x00, 0x00, + 0xaa, 0x06, 0x00, 0x00, 0x9f, 0x01, 0x00, 0x00, 0x9f, 0x01, 0x00, 0x00, 0xa1, 0x01, 0x00, 0x00, 0x6f, 0x05, 0x00, 0x00, 0xa1, 0x01, 0x00, 0x00, 0xa0, 0x06, + 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x6f, 0x05, 0x00, 0x00, 0xa1, 0x01, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0x70, 0x05, 0x00, 0x00, + 0xab, 0x06, 0x00, 0x00, 0xab, 0x06, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0x71, 0x05, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0xa0, 0x06, + 0x00, 0x00, 0xa0, 0x06, 0x00, 0x00, 0x9e, 0x06, 0x00, 0x00, 0x71, 0x05, 0x00, 0x00, 0xac, 0x06, 0x00, 0x00, 0x70, 0x05, 0x00, 0x00, 0x71, 0x05, 0x00, 0x00, + 0x71, 0x05, 0x00, 0x00, 0x9f, 0x06, 0x00, 0x00, 0xac, 0x06, 0x00, 0x00, 0x96, 0x05, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, 0x8a, 0x01, 0x00, 0x00, 0x8a, 0x01, + 0x00, 0x00, 0x8b, 0x01, 0x00, 0x00, 0x96, 0x05, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x8a, 0x05, 0x00, 0x00, 0x8c, 0x05, 0x00, 0x00, 0x8c, 0x05, 0x00, 0x00, + 0xd7, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x21, 0x06, 0x00, 0x00, 0x43, 0x06, 0x00, 0x00, 0x46, 0x06, 0x00, 0x00, 0x46, 0x06, 0x00, 0x00, 0x48, 0x06, + 0x00, 0x00, 0x21, 0x06, 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0xad, 0x06, 0x00, 0x00, 0x9c, 0x06, 0x00, 0x00, 0x9c, 0x06, 0x00, 0x00, 0x97, 0x06, 0x00, 0x00, + 0x9a, 0x06, 0x00, 0x00, 0xae, 0x06, 0x00, 0x00, 0x9b, 0x06, 0x00, 0x00, 0x96, 0x06, 0x00, 0x00, 0x96, 0x06, 0x00, 0x00, 0x99, 0x06, 0x00, 0x00, 0xae, 0x06, + 0x00, 0x00, 0x9b, 0x06, 0x00, 0x00, 0xaf, 0x06, 0x00, 0x00, 0xb0, 0x06, 0x00, 0x00, 0xb0, 0x06, 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0x9b, 0x06, 0x00, 0x00, + 0x87, 0x06, 0x00, 0x00, 0x90, 0x06, 0x00, 0x00, 0xb1, 0x06, 0x00, 0x00, 0xb1, 0x06, 0x00, 0x00, 0x92, 0x01, 0x00, 0x00, 0x87, 0x06, 0x00, 0x00, 0x8c, 0x06, + 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x91, 0x01, 0x00, 0x00, 0x91, 0x01, 0x00, 0x00, 0xd1, 0x01, 0x00, 0x00, 0x8c, 0x06, 0x00, 0x00, 0x90, 0x06, 0x00, 0x00, + 0xb2, 0x06, 0x00, 0x00, 0xb3, 0x06, 0x00, 0x00, 0xb3, 0x06, 0x00, 0x00, 0xb1, 0x06, 0x00, 0x00, 0x90, 0x06, 0x00, 0x00, 0xb1, 0x06, 0x00, 0x00, 0xe6, 0x00, + 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x92, 0x01, 0x00, 0x00, 0xb1, 0x06, 0x00, 0x00, 0x8f, 0x06, 0x00, 0x00, 0xb4, 0x06, 0x00, 0x00, + 0xb2, 0x06, 0x00, 0x00, 0xb2, 0x06, 0x00, 0x00, 0x90, 0x06, 0x00, 0x00, 0x8f, 0x06, 0x00, 0x00, 0xb3, 0x06, 0x00, 0x00, 0xb2, 0x06, 0x00, 0x00, 0x95, 0x06, + 0x00, 0x00, 0x95, 0x06, 0x00, 0x00, 0x94, 0x06, 0x00, 0x00, 0xb3, 0x06, 0x00, 0x00, 0xb3, 0x06, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0xe6, 0x00, 0x00, 0x00, + 0xe6, 0x00, 0x00, 0x00, 0xb1, 0x06, 0x00, 0x00, 0xb3, 0x06, 0x00, 0x00, 0xb4, 0x06, 0x00, 0x00, 0x99, 0x06, 0x00, 0x00, 0x95, 0x06, 0x00, 0x00, 0x95, 0x06, + 0x00, 0x00, 0xb2, 0x06, 0x00, 0x00, 0xb4, 0x06, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0xb3, 0x06, 0x00, 0x00, 0x94, 0x06, 0x00, 0x00, 0x94, 0x06, 0x00, 0x00, + 0x72, 0x05, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0xb5, 0x06, 0x00, 0x00, 0xb6, 0x06, 0x00, 0x00, 0xb4, 0x06, 0x00, 0x00, 0xb4, 0x06, 0x00, 0x00, 0x8f, 0x06, + 0x00, 0x00, 0xb5, 0x06, 0x00, 0x00, 0xb7, 0x06, 0x00, 0x00, 0xb8, 0x06, 0x00, 0x00, 0xb6, 0x06, 0x00, 0x00, 0xb6, 0x06, 0x00, 0x00, 0xb5, 0x06, 0x00, 0x00, + 0xb7, 0x06, 0x00, 0x00, 0xb6, 0x06, 0x00, 0x00, 0xae, 0x06, 0x00, 0x00, 0x99, 0x06, 0x00, 0x00, 0x99, 0x06, 0x00, 0x00, 0xb4, 0x06, 0x00, 0x00, 0xb6, 0x06, + 0x00, 0x00, 0x8e, 0x06, 0x00, 0x00, 0xb5, 0x06, 0x00, 0x00, 0x8f, 0x06, 0x00, 0x00, 0x8f, 0x06, 0x00, 0x00, 0x8a, 0x06, 0x00, 0x00, 0x8e, 0x06, 0x00, 0x00, + 0xb8, 0x06, 0x00, 0x00, 0xb9, 0x06, 0x00, 0x00, 0xae, 0x06, 0x00, 0x00, 0xae, 0x06, 0x00, 0x00, 0xb6, 0x06, 0x00, 0x00, 0xb8, 0x06, 0x00, 0x00, 0xb9, 0x06, + 0x00, 0x00, 0xaf, 0x06, 0x00, 0x00, 0x9b, 0x06, 0x00, 0x00, 0x9b, 0x06, 0x00, 0x00, 0xae, 0x06, 0x00, 0x00, 0xb9, 0x06, 0x00, 0x00, 0x91, 0x06, 0x00, 0x00, + 0x73, 0x05, 0x00, 0x00, 0x72, 0x05, 0x00, 0x00, 0x72, 0x05, 0x00, 0x00, 0x94, 0x06, 0x00, 0x00, 0x91, 0x06, 0x00, 0x00, 0x32, 0x04, 0x00, 0x00, 0x08, 0x01, + 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x9c, 0x05, 0x00, 0x00, 0x32, 0x04, 0x00, 0x00, 0x34, 0x04, 0x00, 0x00, 0x32, 0x04, 0x00, 0x00, + 0x9c, 0x05, 0x00, 0x00, 0x9c, 0x05, 0x00, 0x00, 0x98, 0x06, 0x00, 0x00, 0x34, 0x04, 0x00, 0x00, 0x98, 0x06, 0x00, 0x00, 0x9c, 0x06, 0x00, 0x00, 0x35, 0x04, + 0x00, 0x00, 0x35, 0x04, 0x00, 0x00, 0x34, 0x04, 0x00, 0x00, 0x98, 0x06, 0x00, 0x00, 0xb0, 0x06, 0x00, 0x00, 0xba, 0x06, 0x00, 0x00, 0xad, 0x06, 0x00, 0x00, + 0xad, 0x06, 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0xb0, 0x06, 0x00, 0x00, 0x37, 0x04, 0x00, 0x00, 0x35, 0x04, 0x00, 0x00, 0x9c, 0x06, 0x00, 0x00, 0x9c, 0x06, + 0x00, 0x00, 0xad, 0x06, 0x00, 0x00, 0x37, 0x04, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x00, 0xdd, 0x05, 0x00, 0x00, 0xde, 0x05, 0x00, 0x00, 0xde, 0x05, 0x00, 0x00, + 0xfe, 0x05, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x00, 0xbb, 0x06, 0x00, 0x00, 0xdc, 0x05, 0x00, 0x00, 0xd5, 0x05, 0x00, 0x00, 0xd5, 0x05, 0x00, 0x00, 0xaf, 0x05, + 0x00, 0x00, 0xbb, 0x06, 0x00, 0x00, 0xfb, 0x05, 0x00, 0x00, 0xbc, 0x06, 0x00, 0x00, 0xea, 0x05, 0x00, 0x00, 0xea, 0x05, 0x00, 0x00, 0xfa, 0x05, 0x00, 0x00, + 0xfb, 0x05, 0x00, 0x00, 0xbc, 0x06, 0x00, 0x00, 0xed, 0x05, 0x00, 0x00, 0xe7, 0x05, 0x00, 0x00, 0xe7, 0x05, 0x00, 0x00, 0xea, 0x05, 0x00, 0x00, 0xbc, 0x06, + 0x00, 0x00, 0xec, 0x05, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0xee, 0x05, 0x00, 0x00, 0xee, 0x05, 0x00, 0x00, 0xe8, 0x05, 0x00, 0x00, 0xec, 0x05, 0x00, 0x00, + 0xbd, 0x06, 0x00, 0x00, 0x9a, 0x01, 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0x97, 0x01, 0x00, 0x00, 0xbd, 0x06, 0x00, 0x00, 0x9d, 0x06, + 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0x9b, 0x01, 0x00, 0x00, 0x9b, 0x01, 0x00, 0x00, 0x9f, 0x06, 0x00, 0x00, 0x9d, 0x06, 0x00, 0x00, 0xbe, 0x06, 0x00, 0x00, + 0x9d, 0x01, 0x00, 0x00, 0x9a, 0x01, 0x00, 0x00, 0x9a, 0x01, 0x00, 0x00, 0xbd, 0x06, 0x00, 0x00, 0xbe, 0x06, 0x00, 0x00, 0x9f, 0x06, 0x00, 0x00, 0x9b, 0x01, + 0x00, 0x00, 0x9e, 0x01, 0x00, 0x00, 0x9e, 0x01, 0x00, 0x00, 0xac, 0x06, 0x00, 0x00, 0x9f, 0x06, 0x00, 0x00, 0xbf, 0x06, 0x00, 0x00, 0xac, 0x06, 0x00, 0x00, + 0x9e, 0x01, 0x00, 0x00, 0x9e, 0x01, 0x00, 0x00, 0xae, 0x01, 0x00, 0x00, 0xbf, 0x06, 0x00, 0x00, 0x9e, 0x01, 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00, 0xad, 0x01, + 0x00, 0x00, 0xad, 0x01, 0x00, 0x00, 0xae, 0x01, 0x00, 0x00, 0x9e, 0x01, 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0xe0, 0x05, 0x00, 0x00, 0xa3, 0x06, 0x00, 0x00, + 0xa3, 0x06, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x79, 0x01, 0x00, 0x00, 0x0b, 0x06, 0x00, 0x00, 0x0c, 0x06, 0x00, 0x00, 0x0c, 0x06, + 0x00, 0x00, 0x0f, 0x06, 0x00, 0x00, 0x79, 0x01, 0x00, 0x00, 0xc0, 0x06, 0x00, 0x00, 0xa6, 0x06, 0x00, 0x00, 0x0c, 0x06, 0x00, 0x00, 0x0c, 0x06, 0x00, 0x00, + 0x0a, 0x06, 0x00, 0x00, 0xc0, 0x06, 0x00, 0x00, 0xc1, 0x06, 0x00, 0x00, 0xc2, 0x06, 0x00, 0x00, 0xa6, 0x06, 0x00, 0x00, 0xa6, 0x06, 0x00, 0x00, 0xc0, 0x06, + 0x00, 0x00, 0xc1, 0x06, 0x00, 0x00, 0x0a, 0x06, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0xa9, 0x06, 0x00, 0x00, 0xa9, 0x06, 0x00, 0x00, 0xc0, 0x06, 0x00, 0x00, + 0x0a, 0x06, 0x00, 0x00, 0xc2, 0x06, 0x00, 0x00, 0xa8, 0x06, 0x00, 0x00, 0xa5, 0x06, 0x00, 0x00, 0xa5, 0x06, 0x00, 0x00, 0xa6, 0x06, 0x00, 0x00, 0xc2, 0x06, + 0x00, 0x00, 0xa4, 0x06, 0x00, 0x00, 0xa1, 0x06, 0x00, 0x00, 0x51, 0x01, 0x00, 0x00, 0x51, 0x01, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0xa4, 0x06, 0x00, 0x00, + 0xa7, 0x06, 0x00, 0x00, 0xc3, 0x06, 0x00, 0x00, 0x6d, 0x05, 0x00, 0x00, 0x6d, 0x05, 0x00, 0x00, 0x6c, 0x05, 0x00, 0x00, 0xa7, 0x06, 0x00, 0x00, 0xc3, 0x06, + 0x00, 0x00, 0xb9, 0x02, 0x00, 0x00, 0x13, 0x06, 0x00, 0x00, 0x13, 0x06, 0x00, 0x00, 0x6d, 0x05, 0x00, 0x00, 0xc3, 0x06, 0x00, 0x00, 0xb9, 0x02, 0x00, 0x00, + 0xb6, 0x02, 0x00, 0x00, 0x15, 0x06, 0x00, 0x00, 0x15, 0x06, 0x00, 0x00, 0x13, 0x06, 0x00, 0x00, 0xb9, 0x02, 0x00, 0x00, 0xbe, 0x06, 0x00, 0x00, 0x8f, 0x05, + 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x9d, 0x01, 0x00, 0x00, 0xbe, 0x06, 0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00, + 0x9d, 0x01, 0x00, 0x00, 0x9d, 0x01, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 0xab, 0x06, 0x00, 0x00, 0x70, 0x05, 0x00, 0x00, 0xac, 0x06, + 0x00, 0x00, 0xac, 0x06, 0x00, 0x00, 0xbf, 0x06, 0x00, 0x00, 0xab, 0x06, 0x00, 0x00, 0xc4, 0x06, 0x00, 0x00, 0xa5, 0x05, 0x00, 0x00, 0xa6, 0x05, 0x00, 0x00, + 0xa6, 0x05, 0x00, 0x00, 0x9e, 0x05, 0x00, 0x00, 0xc4, 0x06, 0x00, 0x00, 0xa5, 0x05, 0x00, 0x00, 0xc4, 0x06, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x72, 0x00, + 0x00, 0x00, 0x74, 0x04, 0x00, 0x00, 0xa5, 0x05, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x9e, 0x05, 0x00, 0x00, 0xa6, 0x05, 0x00, 0x00, 0xa6, 0x05, 0x00, 0x00, + 0x0f, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x9a, 0x05, 0x00, 0x00, 0xc4, 0x06, 0x00, 0x00, 0x9e, 0x05, 0x00, 0x00, 0x9e, 0x05, 0x00, 0x00, 0x95, 0x05, + 0x00, 0x00, 0x9a, 0x05, 0x00, 0x00, 0x9a, 0x05, 0x00, 0x00, 0x99, 0x05, 0x00, 0x00, 0x72, 0x04, 0x00, 0x00, 0x72, 0x04, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, + 0x9a, 0x05, 0x00, 0x00, 0x8b, 0x01, 0x00, 0x00, 0xa6, 0x01, 0x00, 0x00, 0xb3, 0x05, 0x00, 0x00, 0xb3, 0x05, 0x00, 0x00, 0x96, 0x05, 0x00, 0x00, 0x8b, 0x01, + 0x00, 0x00, 0x81, 0x05, 0x00, 0x00, 0x83, 0x05, 0x00, 0x00, 0xf5, 0x00, 0x00, 0x00, 0xf5, 0x00, 0x00, 0x00, 0x7e, 0x05, 0x00, 0x00, 0x81, 0x05, 0x00, 0x00, + 0xf6, 0x00, 0x00, 0x00, 0xc5, 0x06, 0x00, 0x00, 0x7e, 0x05, 0x00, 0x00, 0x7e, 0x05, 0x00, 0x00, 0xf5, 0x00, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, 0x84, 0x05, + 0x00, 0x00, 0x86, 0x05, 0x00, 0x00, 0x8b, 0x05, 0x00, 0x00, 0x8b, 0x05, 0x00, 0x00, 0xf3, 0x00, 0x00, 0x00, 0x84, 0x05, 0x00, 0x00, 0x8b, 0x05, 0x00, 0x00, + 0x86, 0x05, 0x00, 0x00, 0xb3, 0x05, 0x00, 0x00, 0xb3, 0x05, 0x00, 0x00, 0xa6, 0x01, 0x00, 0x00, 0x8b, 0x05, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, 0x9d, 0x05, + 0x00, 0x00, 0x88, 0x01, 0x00, 0x00, 0x88, 0x01, 0x00, 0x00, 0x8a, 0x01, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, 0xa2, 0x05, 0x00, 0x00, 0xa5, 0x05, 0x00, 0x00, + 0x74, 0x04, 0x00, 0x00, 0x74, 0x04, 0x00, 0x00, 0x76, 0x04, 0x00, 0x00, 0xa2, 0x05, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0xc4, 0x06, + 0x00, 0x00, 0xc4, 0x06, 0x00, 0x00, 0x9a, 0x05, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0xc6, 0x06, 0x00, 0x00, 0xc7, 0x06, 0x00, 0x00, 0xa8, 0x05, 0x00, 0x00, + 0xa8, 0x05, 0x00, 0x00, 0xa7, 0x05, 0x00, 0x00, 0xc6, 0x06, 0x00, 0x00, 0xa7, 0x05, 0x00, 0x00, 0xa3, 0x05, 0x00, 0x00, 0x78, 0x04, 0x00, 0x00, 0x78, 0x04, + 0x00, 0x00, 0x7a, 0x04, 0x00, 0x00, 0xa7, 0x05, 0x00, 0x00, 0xc7, 0x06, 0x00, 0x00, 0xc8, 0x06, 0x00, 0x00, 0xab, 0x05, 0x00, 0x00, 0xab, 0x05, 0x00, 0x00, + 0xa8, 0x05, 0x00, 0x00, 0xc7, 0x06, 0x00, 0x00, 0xc8, 0x06, 0x00, 0x00, 0xbb, 0x06, 0x00, 0x00, 0xaf, 0x05, 0x00, 0x00, 0xaf, 0x05, 0x00, 0x00, 0xab, 0x05, + 0x00, 0x00, 0xc8, 0x06, 0x00, 0x00, 0xa2, 0x01, 0x00, 0x00, 0x8c, 0x06, 0x00, 0x00, 0xd1, 0x01, 0x00, 0x00, 0xd1, 0x01, 0x00, 0x00, 0xc9, 0x06, 0x00, 0x00, + 0xa2, 0x01, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x00, 0x8b, 0x06, 0x00, 0x00, 0x8c, 0x06, 0x00, 0x00, 0x8c, 0x06, 0x00, 0x00, 0xa2, 0x01, 0x00, 0x00, 0xa4, 0x01, + 0x00, 0x00, 0xc9, 0x06, 0x00, 0x00, 0xd1, 0x01, 0x00, 0x00, 0xbf, 0x01, 0x00, 0x00, 0xbf, 0x01, 0x00, 0x00, 0xcf, 0x01, 0x00, 0x00, 0xc9, 0x06, 0x00, 0x00, + 0xa3, 0x01, 0x00, 0x00, 0xa2, 0x01, 0x00, 0x00, 0xc9, 0x06, 0x00, 0x00, 0xc9, 0x06, 0x00, 0x00, 0xca, 0x06, 0x00, 0x00, 0xa3, 0x01, 0x00, 0x00, 0xa3, 0x01, + 0x00, 0x00, 0xcb, 0x06, 0x00, 0x00, 0xcc, 0x06, 0x00, 0x00, 0xcc, 0x06, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x00, 0xa3, 0x01, 0x00, 0x00, 0xa3, 0x01, 0x00, 0x00, + 0xcd, 0x06, 0x00, 0x00, 0xce, 0x06, 0x00, 0x00, 0xce, 0x06, 0x00, 0x00, 0xcb, 0x06, 0x00, 0x00, 0xa3, 0x01, 0x00, 0x00, 0xfb, 0x02, 0x00, 0x00, 0xcc, 0x06, + 0x00, 0x00, 0xcb, 0x06, 0x00, 0x00, 0xcb, 0x06, 0x00, 0x00, 0xfc, 0x02, 0x00, 0x00, 0xfb, 0x02, 0x00, 0x00, 0x8b, 0x06, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x00, + 0xcc, 0x06, 0x00, 0x00, 0xcc, 0x06, 0x00, 0x00, 0xcf, 0x06, 0x00, 0x00, 0x8b, 0x06, 0x00, 0x00, 0xcf, 0x06, 0x00, 0x00, 0xcc, 0x06, 0x00, 0x00, 0xfb, 0x02, + 0x00, 0x00, 0xfb, 0x02, 0x00, 0x00, 0xd0, 0x06, 0x00, 0x00, 0xcf, 0x06, 0x00, 0x00, 0xcf, 0x06, 0x00, 0x00, 0x8d, 0x06, 0x00, 0x00, 0x89, 0x06, 0x00, 0x00, + 0x89, 0x06, 0x00, 0x00, 0x8b, 0x06, 0x00, 0x00, 0xcf, 0x06, 0x00, 0x00, 0xca, 0x06, 0x00, 0x00, 0xc9, 0x06, 0x00, 0x00, 0xcf, 0x01, 0x00, 0x00, 0xcf, 0x01, + 0x00, 0x00, 0xce, 0x01, 0x00, 0x00, 0xca, 0x06, 0x00, 0x00, 0xca, 0x06, 0x00, 0x00, 0xd1, 0x06, 0x00, 0x00, 0xcd, 0x06, 0x00, 0x00, 0xcd, 0x06, 0x00, 0x00, + 0xa3, 0x01, 0x00, 0x00, 0xca, 0x06, 0x00, 0x00, 0xd2, 0x06, 0x00, 0x00, 0xd3, 0x06, 0x00, 0x00, 0x8e, 0x06, 0x00, 0x00, 0x8e, 0x06, 0x00, 0x00, 0x8d, 0x06, + 0x00, 0x00, 0xd2, 0x06, 0x00, 0x00, 0xd3, 0x06, 0x00, 0x00, 0xb7, 0x06, 0x00, 0x00, 0xb5, 0x06, 0x00, 0x00, 0xb5, 0x06, 0x00, 0x00, 0x8e, 0x06, 0x00, 0x00, + 0xd3, 0x06, 0x00, 0x00, 0xc5, 0x06, 0x00, 0x00, 0xd4, 0x06, 0x00, 0x00, 0x7d, 0x05, 0x00, 0x00, 0x7d, 0x05, 0x00, 0x00, 0x7e, 0x05, 0x00, 0x00, 0xc5, 0x06, + 0x00, 0x00, 0x7d, 0x05, 0x00, 0x00, 0xd4, 0x06, 0x00, 0x00, 0xd5, 0x06, 0x00, 0x00, 0xd5, 0x06, 0x00, 0x00, 0x7b, 0x05, 0x00, 0x00, 0x7d, 0x05, 0x00, 0x00, + 0xd6, 0x06, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0x89, 0x05, 0x00, 0x00, 0xd6, 0x06, 0x00, 0x00, 0xda, 0x00, + 0x00, 0x00, 0xd6, 0x06, 0x00, 0x00, 0x89, 0x05, 0x00, 0x00, 0x89, 0x05, 0x00, 0x00, 0x8a, 0x05, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0xd6, 0x06, 0x00, 0x00, + 0xda, 0x00, 0x00, 0x00, 0xab, 0x06, 0x00, 0x00, 0xab, 0x06, 0x00, 0x00, 0xd7, 0x06, 0x00, 0x00, 0xd6, 0x06, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, 0xd6, 0x06, + 0x00, 0x00, 0xd7, 0x06, 0x00, 0x00, 0xd7, 0x06, 0x00, 0x00, 0xd8, 0x06, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, 0xc5, 0x06, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, + 0xd8, 0x06, 0x00, 0x00, 0xd8, 0x06, 0x00, 0x00, 0xd9, 0x06, 0x00, 0x00, 0xc5, 0x06, 0x00, 0x00, 0xd4, 0x06, 0x00, 0x00, 0xc5, 0x06, 0x00, 0x00, 0xd9, 0x06, + 0x00, 0x00, 0xd9, 0x06, 0x00, 0x00, 0xda, 0x06, 0x00, 0x00, 0xd4, 0x06, 0x00, 0x00, 0xd5, 0x06, 0x00, 0x00, 0xd4, 0x06, 0x00, 0x00, 0xda, 0x06, 0x00, 0x00, + 0xda, 0x06, 0x00, 0x00, 0xdb, 0x06, 0x00, 0x00, 0xd5, 0x06, 0x00, 0x00, 0xdc, 0x06, 0x00, 0x00, 0x7c, 0x05, 0x00, 0x00, 0x7b, 0x05, 0x00, 0x00, 0x7b, 0x05, + 0x00, 0x00, 0xd5, 0x06, 0x00, 0x00, 0xdc, 0x06, 0x00, 0x00, 0xdb, 0x06, 0x00, 0x00, 0xda, 0x06, 0x00, 0x00, 0xb5, 0x01, 0x00, 0x00, 0xb5, 0x01, 0x00, 0x00, + 0xb4, 0x01, 0x00, 0x00, 0xdb, 0x06, 0x00, 0x00, 0xdd, 0x06, 0x00, 0x00, 0xdc, 0x06, 0x00, 0x00, 0xd5, 0x06, 0x00, 0x00, 0xd5, 0x06, 0x00, 0x00, 0xdb, 0x06, + 0x00, 0x00, 0xdd, 0x06, 0x00, 0x00, 0xda, 0x06, 0x00, 0x00, 0xd9, 0x06, 0x00, 0x00, 0xb2, 0x01, 0x00, 0x00, 0xb2, 0x01, 0x00, 0x00, 0xb5, 0x01, 0x00, 0x00, + 0xda, 0x06, 0x00, 0x00, 0xd9, 0x06, 0x00, 0x00, 0xd8, 0x06, 0x00, 0x00, 0xb3, 0x01, 0x00, 0x00, 0xb3, 0x01, 0x00, 0x00, 0xb2, 0x01, 0x00, 0x00, 0xd9, 0x06, + 0x00, 0x00, 0xd8, 0x06, 0x00, 0x00, 0xd7, 0x06, 0x00, 0x00, 0xde, 0x06, 0x00, 0x00, 0xde, 0x06, 0x00, 0x00, 0xb3, 0x01, 0x00, 0x00, 0xd8, 0x06, 0x00, 0x00, + 0xd7, 0x06, 0x00, 0x00, 0xab, 0x06, 0x00, 0x00, 0xbf, 0x06, 0x00, 0x00, 0xbf, 0x06, 0x00, 0x00, 0xde, 0x06, 0x00, 0x00, 0xd7, 0x06, 0x00, 0x00, 0x62, 0x05, + 0x00, 0x00, 0xbb, 0x01, 0x00, 0x00, 0xaa, 0x01, 0x00, 0x00, 0xaa, 0x01, 0x00, 0x00, 0xa9, 0x01, 0x00, 0x00, 0x62, 0x05, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x00, + 0xaa, 0x01, 0x00, 0x00, 0xdf, 0x06, 0x00, 0x00, 0xdf, 0x06, 0x00, 0x00, 0xae, 0x01, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x00, 0xaa, 0x01, 0x00, 0x00, 0xb0, 0x01, + 0x00, 0x00, 0xaf, 0x01, 0x00, 0x00, 0xaf, 0x01, 0x00, 0x00, 0xdf, 0x06, 0x00, 0x00, 0xaa, 0x01, 0x00, 0x00, 0xde, 0x06, 0x00, 0x00, 0xbf, 0x06, 0x00, 0x00, + 0xae, 0x01, 0x00, 0x00, 0xae, 0x01, 0x00, 0x00, 0xdf, 0x06, 0x00, 0x00, 0xde, 0x06, 0x00, 0x00, 0xba, 0x01, 0x00, 0x00, 0xe0, 0x06, 0x00, 0x00, 0xb0, 0x01, + 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0xaa, 0x01, 0x00, 0x00, 0xba, 0x01, 0x00, 0x00, 0xb3, 0x01, 0x00, 0x00, 0xde, 0x06, 0x00, 0x00, 0xdf, 0x06, 0x00, 0x00, + 0xdf, 0x06, 0x00, 0x00, 0xaf, 0x01, 0x00, 0x00, 0xb3, 0x01, 0x00, 0x00, 0xb5, 0x01, 0x00, 0x00, 0xb2, 0x01, 0x00, 0x00, 0xaf, 0x01, 0x00, 0x00, 0xaf, 0x01, + 0x00, 0x00, 0xb1, 0x01, 0x00, 0x00, 0xb5, 0x01, 0x00, 0x00, 0xe0, 0x06, 0x00, 0x00, 0xbc, 0x01, 0x00, 0x00, 0xb1, 0x01, 0x00, 0x00, 0xb1, 0x01, 0x00, 0x00, + 0xb0, 0x01, 0x00, 0x00, 0xe0, 0x06, 0x00, 0x00, 0xe1, 0x06, 0x00, 0x00, 0xe2, 0x06, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, 0xb6, 0x01, + 0x00, 0x00, 0xe1, 0x06, 0x00, 0x00, 0xe2, 0x06, 0x00, 0x00, 0xdd, 0x06, 0x00, 0x00, 0xdb, 0x06, 0x00, 0x00, 0xdb, 0x06, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, + 0xe2, 0x06, 0x00, 0x00, 0xb9, 0x01, 0x00, 0x00, 0x62, 0x05, 0x00, 0x00, 0xa9, 0x01, 0x00, 0x00, 0xa9, 0x01, 0x00, 0x00, 0xab, 0x01, 0x00, 0x00, 0xb9, 0x01, + 0x00, 0x00, 0x62, 0x05, 0x00, 0x00, 0xb9, 0x01, 0x00, 0x00, 0xb8, 0x01, 0x00, 0x00, 0xb8, 0x01, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0x62, 0x05, 0x00, 0x00, + 0xcf, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0xb8, 0x01, 0x00, 0x00, 0xb8, 0x01, 0x00, 0x00, 0xe3, 0x06, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0xec, 0x01, + 0x00, 0x00, 0x92, 0x05, 0x00, 0x00, 0x94, 0x05, 0x00, 0x00, 0x94, 0x05, 0x00, 0x00, 0x2c, 0x02, 0x00, 0x00, 0xec, 0x01, 0x00, 0x00, 0x94, 0x05, 0x00, 0x00, + 0xe5, 0x01, 0x00, 0x00, 0xe4, 0x01, 0x00, 0x00, 0xe4, 0x01, 0x00, 0x00, 0x2c, 0x02, 0x00, 0x00, 0x94, 0x05, 0x00, 0x00, 0xe4, 0x06, 0x00, 0x00, 0xbc, 0x01, + 0x00, 0x00, 0xe0, 0x06, 0x00, 0x00, 0xe0, 0x06, 0x00, 0x00, 0x67, 0x05, 0x00, 0x00, 0xe4, 0x06, 0x00, 0x00, 0xe5, 0x06, 0x00, 0x00, 0xbd, 0x01, 0x00, 0x00, + 0xbc, 0x01, 0x00, 0x00, 0xbc, 0x01, 0x00, 0x00, 0xe4, 0x06, 0x00, 0x00, 0xe5, 0x06, 0x00, 0x00, 0x67, 0x05, 0x00, 0x00, 0xe0, 0x06, 0x00, 0x00, 0xba, 0x01, + 0x00, 0x00, 0xba, 0x01, 0x00, 0x00, 0x63, 0x05, 0x00, 0x00, 0x67, 0x05, 0x00, 0x00, 0xc5, 0x01, 0x00, 0x00, 0xe4, 0x06, 0x00, 0x00, 0x67, 0x05, 0x00, 0x00, + 0x67, 0x05, 0x00, 0x00, 0x66, 0x05, 0x00, 0x00, 0xc5, 0x01, 0x00, 0x00, 0xbd, 0x01, 0x00, 0x00, 0xe1, 0x06, 0x00, 0x00, 0xb6, 0x01, 0x00, 0x00, 0xb6, 0x01, + 0x00, 0x00, 0xb1, 0x01, 0x00, 0x00, 0xbd, 0x01, 0x00, 0x00, 0xe6, 0x06, 0x00, 0x00, 0xe1, 0x06, 0x00, 0x00, 0xbd, 0x01, 0x00, 0x00, 0xbd, 0x01, 0x00, 0x00, + 0xe5, 0x06, 0x00, 0x00, 0xe6, 0x06, 0x00, 0x00, 0xe2, 0x06, 0x00, 0x00, 0xe1, 0x06, 0x00, 0x00, 0xe6, 0x06, 0x00, 0x00, 0xe6, 0x06, 0x00, 0x00, 0xe7, 0x06, + 0x00, 0x00, 0xe2, 0x06, 0x00, 0x00, 0xdd, 0x06, 0x00, 0x00, 0xe2, 0x06, 0x00, 0x00, 0xe7, 0x06, 0x00, 0x00, 0xe7, 0x06, 0x00, 0x00, 0x86, 0x06, 0x00, 0x00, + 0xdd, 0x06, 0x00, 0x00, 0xdc, 0x06, 0x00, 0x00, 0xdd, 0x06, 0x00, 0x00, 0x86, 0x06, 0x00, 0x00, 0x86, 0x06, 0x00, 0x00, 0x85, 0x06, 0x00, 0x00, 0xdc, 0x06, + 0x00, 0x00, 0x7c, 0x05, 0x00, 0x00, 0xdc, 0x06, 0x00, 0x00, 0x85, 0x06, 0x00, 0x00, 0x85, 0x06, 0x00, 0x00, 0xe8, 0x06, 0x00, 0x00, 0x7c, 0x05, 0x00, 0x00, + 0xeb, 0x00, 0x00, 0x00, 0x7c, 0x05, 0x00, 0x00, 0xe8, 0x06, 0x00, 0x00, 0xe8, 0x06, 0x00, 0x00, 0xe9, 0x06, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, 0xd0, 0x01, + 0x00, 0x00, 0x79, 0x05, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, 0xe9, 0x06, 0x00, 0x00, 0xd0, 0x01, 0x00, 0x00, 0x78, 0x05, 0x00, 0x00, + 0x79, 0x05, 0x00, 0x00, 0xd0, 0x01, 0x00, 0x00, 0xd0, 0x01, 0x00, 0x00, 0xcf, 0x01, 0x00, 0x00, 0x78, 0x05, 0x00, 0x00, 0xea, 0x06, 0x00, 0x00, 0xeb, 0x06, + 0x00, 0x00, 0xec, 0x06, 0x00, 0x00, 0xec, 0x06, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xea, 0x06, 0x00, 0x00, 0xed, 0x06, 0x00, 0x00, 0xee, 0x06, 0x00, 0x00, + 0xeb, 0x06, 0x00, 0x00, 0xeb, 0x06, 0x00, 0x00, 0xea, 0x06, 0x00, 0x00, 0xed, 0x06, 0x00, 0x00, 0xeb, 0x06, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x82, 0x06, + 0x00, 0x00, 0x82, 0x06, 0x00, 0x00, 0xec, 0x06, 0x00, 0x00, 0xeb, 0x06, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xec, 0x06, 0x00, 0x00, 0xef, 0x06, 0x00, 0x00, + 0xef, 0x06, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc7, 0x01, 0x00, 0x00, 0xea, 0x06, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, + 0x00, 0x00, 0xc6, 0x01, 0x00, 0x00, 0xc7, 0x01, 0x00, 0x00, 0xee, 0x06, 0x00, 0x00, 0x7a, 0x06, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, + 0xeb, 0x06, 0x00, 0x00, 0xee, 0x06, 0x00, 0x00, 0xec, 0x06, 0x00, 0x00, 0x82, 0x06, 0x00, 0x00, 0xf0, 0x06, 0x00, 0x00, 0xf0, 0x06, 0x00, 0x00, 0xef, 0x06, + 0x00, 0x00, 0xec, 0x06, 0x00, 0x00, 0x82, 0x06, 0x00, 0x00, 0x80, 0x06, 0x00, 0x00, 0xf1, 0x06, 0x00, 0x00, 0xf1, 0x06, 0x00, 0x00, 0xf0, 0x06, 0x00, 0x00, + 0x82, 0x06, 0x00, 0x00, 0x80, 0x06, 0x00, 0x00, 0x7f, 0x06, 0x00, 0x00, 0xf2, 0x06, 0x00, 0x00, 0xf2, 0x06, 0x00, 0x00, 0xf1, 0x06, 0x00, 0x00, 0x80, 0x06, + 0x00, 0x00, 0xf3, 0x06, 0x00, 0x00, 0xe8, 0x01, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x00, 0xef, 0x06, 0x00, 0x00, 0xf3, 0x06, 0x00, 0x00, + 0xef, 0x06, 0x00, 0x00, 0xf0, 0x06, 0x00, 0x00, 0xf4, 0x06, 0x00, 0x00, 0xf4, 0x06, 0x00, 0x00, 0xf3, 0x06, 0x00, 0x00, 0xef, 0x06, 0x00, 0x00, 0xf0, 0x06, + 0x00, 0x00, 0xf1, 0x06, 0x00, 0x00, 0xf5, 0x06, 0x00, 0x00, 0xf5, 0x06, 0x00, 0x00, 0xf4, 0x06, 0x00, 0x00, 0xf0, 0x06, 0x00, 0x00, 0xf3, 0x06, 0x00, 0x00, + 0xf4, 0x06, 0x00, 0x00, 0xf6, 0x06, 0x00, 0x00, 0xf6, 0x06, 0x00, 0x00, 0x65, 0x05, 0x00, 0x00, 0xf3, 0x06, 0x00, 0x00, 0xf5, 0x06, 0x00, 0x00, 0xf1, 0x06, + 0x00, 0x00, 0xf2, 0x06, 0x00, 0x00, 0xf4, 0x06, 0x00, 0x00, 0xf5, 0x06, 0x00, 0x00, 0xf7, 0x06, 0x00, 0x00, 0xf7, 0x06, 0x00, 0x00, 0xf6, 0x06, 0x00, 0x00, + 0xf4, 0x06, 0x00, 0x00, 0xe8, 0x01, 0x00, 0x00, 0xf3, 0x06, 0x00, 0x00, 0x65, 0x05, 0x00, 0x00, 0x65, 0x05, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0xe8, 0x01, + 0x00, 0x00, 0xe8, 0x01, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0x64, 0x05, 0x00, 0x00, 0x64, 0x05, 0x00, 0x00, 0xe9, 0x01, 0x00, 0x00, 0xe8, 0x01, 0x00, 0x00, + 0xc5, 0x01, 0x00, 0x00, 0x66, 0x05, 0x00, 0x00, 0x65, 0x05, 0x00, 0x00, 0x65, 0x05, 0x00, 0x00, 0xf6, 0x06, 0x00, 0x00, 0xc5, 0x01, 0x00, 0x00, 0xf2, 0x06, + 0x00, 0x00, 0xf8, 0x06, 0x00, 0x00, 0xf7, 0x06, 0x00, 0x00, 0xf7, 0x06, 0x00, 0x00, 0xf5, 0x06, 0x00, 0x00, 0xf2, 0x06, 0x00, 0x00, 0xc3, 0x01, 0x00, 0x00, + 0xc5, 0x01, 0x00, 0x00, 0xf6, 0x06, 0x00, 0x00, 0xf6, 0x06, 0x00, 0x00, 0xf7, 0x06, 0x00, 0x00, 0xc3, 0x01, 0x00, 0x00, 0xd1, 0x06, 0x00, 0x00, 0xca, 0x06, + 0x00, 0x00, 0xce, 0x01, 0x00, 0x00, 0xce, 0x01, 0x00, 0x00, 0xc9, 0x01, 0x00, 0x00, 0xd1, 0x06, 0x00, 0x00, 0xd1, 0x06, 0x00, 0x00, 0xf9, 0x06, 0x00, 0x00, + 0xfa, 0x06, 0x00, 0x00, 0xfa, 0x06, 0x00, 0x00, 0xcd, 0x06, 0x00, 0x00, 0xd1, 0x06, 0x00, 0x00, 0xf9, 0x06, 0x00, 0x00, 0xd1, 0x06, 0x00, 0x00, 0xc9, 0x01, + 0x00, 0x00, 0xc9, 0x01, 0x00, 0x00, 0xcb, 0x01, 0x00, 0x00, 0xf9, 0x06, 0x00, 0x00, 0xf9, 0x06, 0x00, 0x00, 0xfb, 0x06, 0x00, 0x00, 0xfc, 0x06, 0x00, 0x00, + 0xfc, 0x06, 0x00, 0x00, 0xfa, 0x06, 0x00, 0x00, 0xf9, 0x06, 0x00, 0x00, 0xcd, 0x06, 0x00, 0x00, 0xfa, 0x06, 0x00, 0x00, 0xfd, 0x06, 0x00, 0x00, 0xfd, 0x06, + 0x00, 0x00, 0xce, 0x06, 0x00, 0x00, 0xcd, 0x06, 0x00, 0x00, 0xf9, 0x06, 0x00, 0x00, 0xcb, 0x01, 0x00, 0x00, 0xcc, 0x01, 0x00, 0x00, 0xcc, 0x01, 0x00, 0x00, + 0xfb, 0x06, 0x00, 0x00, 0xf9, 0x06, 0x00, 0x00, 0xfb, 0x06, 0x00, 0x00, 0xfe, 0x06, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xfc, 0x06, + 0x00, 0x00, 0xfb, 0x06, 0x00, 0x00, 0xfa, 0x06, 0x00, 0x00, 0xfc, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xfd, 0x06, 0x00, 0x00, + 0xfa, 0x06, 0x00, 0x00, 0xfb, 0x06, 0x00, 0x00, 0xcc, 0x01, 0x00, 0x00, 0xfe, 0x06, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xfc, 0x06, + 0x00, 0x00, 0xcb, 0x06, 0x00, 0x00, 0xce, 0x06, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0xfc, 0x02, 0x00, 0x00, 0xcb, 0x06, 0x00, 0x00, + 0xce, 0x06, 0x00, 0x00, 0xfd, 0x06, 0x00, 0x00, 0x02, 0x07, 0x00, 0x00, 0x02, 0x07, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0xce, 0x06, 0x00, 0x00, 0xfd, 0x06, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x02, 0x07, 0x00, 0x00, 0xfd, 0x06, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, + 0x03, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, 0x05, 0x07, 0x00, 0x00, 0x06, 0x07, 0x00, 0x00, 0x06, 0x07, 0x00, 0x00, 0x07, 0x07, + 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, 0x08, 0x07, 0x00, 0x00, 0x09, 0x07, 0x00, 0x00, 0x05, 0x07, 0x00, 0x00, 0x05, 0x07, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, + 0x08, 0x07, 0x00, 0x00, 0x05, 0x07, 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x0b, 0x07, 0x00, 0x00, 0x0b, 0x07, 0x00, 0x00, 0x06, 0x07, 0x00, 0x00, 0x05, 0x07, + 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x06, 0x07, 0x00, 0x00, 0x0c, 0x07, 0x00, 0x00, 0x0c, 0x07, 0x00, 0x00, 0x0d, 0x07, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, + 0x09, 0x07, 0x00, 0x00, 0x0e, 0x07, 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x05, 0x07, 0x00, 0x00, 0x09, 0x07, 0x00, 0x00, 0x0a, 0x07, + 0x00, 0x00, 0x0f, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x0b, 0x07, 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x06, 0x07, 0x00, 0x00, + 0x0b, 0x07, 0x00, 0x00, 0x11, 0x07, 0x00, 0x00, 0x11, 0x07, 0x00, 0x00, 0x0c, 0x07, 0x00, 0x00, 0x06, 0x07, 0x00, 0x00, 0x0e, 0x07, 0x00, 0x00, 0x12, 0x07, + 0x00, 0x00, 0x0f, 0x07, 0x00, 0x00, 0x0f, 0x07, 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x0e, 0x07, 0x00, 0x00, 0x0f, 0x07, 0x00, 0x00, 0x13, 0x07, 0x00, 0x00, + 0x14, 0x07, 0x00, 0x00, 0x14, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x0f, 0x07, 0x00, 0x00, 0x0b, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x15, 0x07, + 0x00, 0x00, 0x15, 0x07, 0x00, 0x00, 0x11, 0x07, 0x00, 0x00, 0x0b, 0x07, 0x00, 0x00, 0x12, 0x07, 0x00, 0x00, 0x16, 0x07, 0x00, 0x00, 0x13, 0x07, 0x00, 0x00, + 0x13, 0x07, 0x00, 0x00, 0x0f, 0x07, 0x00, 0x00, 0x12, 0x07, 0x00, 0x00, 0x13, 0x07, 0x00, 0x00, 0x17, 0x07, 0x00, 0x00, 0x18, 0x07, 0x00, 0x00, 0x18, 0x07, + 0x00, 0x00, 0x14, 0x07, 0x00, 0x00, 0x13, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x14, 0x07, 0x00, 0x00, 0x19, 0x07, 0x00, 0x00, 0x19, 0x07, 0x00, 0x00, + 0x15, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x16, 0x07, 0x00, 0x00, 0x1a, 0x07, 0x00, 0x00, 0x17, 0x07, 0x00, 0x00, 0x17, 0x07, 0x00, 0x00, 0x13, 0x07, + 0x00, 0x00, 0x16, 0x07, 0x00, 0x00, 0x14, 0x07, 0x00, 0x00, 0x18, 0x07, 0x00, 0x00, 0x1b, 0x07, 0x00, 0x00, 0x1b, 0x07, 0x00, 0x00, 0x19, 0x07, 0x00, 0x00, + 0x14, 0x07, 0x00, 0x00, 0x0d, 0x07, 0x00, 0x00, 0x0c, 0x07, 0x00, 0x00, 0x1c, 0x07, 0x00, 0x00, 0x1c, 0x07, 0x00, 0x00, 0x1d, 0x07, 0x00, 0x00, 0x0d, 0x07, + 0x00, 0x00, 0x0c, 0x07, 0x00, 0x00, 0x11, 0x07, 0x00, 0x00, 0x1e, 0x07, 0x00, 0x00, 0x1e, 0x07, 0x00, 0x00, 0x1c, 0x07, 0x00, 0x00, 0x0c, 0x07, 0x00, 0x00, + 0x11, 0x07, 0x00, 0x00, 0x15, 0x07, 0x00, 0x00, 0x75, 0x06, 0x00, 0x00, 0x75, 0x06, 0x00, 0x00, 0x1e, 0x07, 0x00, 0x00, 0x11, 0x07, 0x00, 0x00, 0x15, 0x07, + 0x00, 0x00, 0x19, 0x07, 0x00, 0x00, 0x76, 0x06, 0x00, 0x00, 0x76, 0x06, 0x00, 0x00, 0x75, 0x06, 0x00, 0x00, 0x15, 0x07, 0x00, 0x00, 0x19, 0x07, 0x00, 0x00, + 0x1b, 0x07, 0x00, 0x00, 0x1f, 0x07, 0x00, 0x00, 0x1f, 0x07, 0x00, 0x00, 0x76, 0x06, 0x00, 0x00, 0x19, 0x07, 0x00, 0x00, 0x1d, 0x07, 0x00, 0x00, 0x1c, 0x07, + 0x00, 0x00, 0x20, 0x07, 0x00, 0x00, 0x20, 0x07, 0x00, 0x00, 0x21, 0x07, 0x00, 0x00, 0x1d, 0x07, 0x00, 0x00, 0x1c, 0x07, 0x00, 0x00, 0x1e, 0x07, 0x00, 0x00, + 0x7b, 0x06, 0x00, 0x00, 0x7b, 0x06, 0x00, 0x00, 0x20, 0x07, 0x00, 0x00, 0x1c, 0x07, 0x00, 0x00, 0x1e, 0x07, 0x00, 0x00, 0x75, 0x06, 0x00, 0x00, 0x71, 0x06, + 0x00, 0x00, 0x71, 0x06, 0x00, 0x00, 0x7b, 0x06, 0x00, 0x00, 0x1e, 0x07, 0x00, 0x00, 0x76, 0x06, 0x00, 0x00, 0x1f, 0x07, 0x00, 0x00, 0x77, 0x06, 0x00, 0x00, + 0x77, 0x06, 0x00, 0x00, 0x72, 0x06, 0x00, 0x00, 0x76, 0x06, 0x00, 0x00, 0x21, 0x07, 0x00, 0x00, 0x20, 0x07, 0x00, 0x00, 0x22, 0x07, 0x00, 0x00, 0x22, 0x07, + 0x00, 0x00, 0x23, 0x07, 0x00, 0x00, 0x21, 0x07, 0x00, 0x00, 0x20, 0x07, 0x00, 0x00, 0x7b, 0x06, 0x00, 0x00, 0x7c, 0x06, 0x00, 0x00, 0x7c, 0x06, 0x00, 0x00, + 0x22, 0x07, 0x00, 0x00, 0x20, 0x07, 0x00, 0x00, 0x23, 0x07, 0x00, 0x00, 0x22, 0x07, 0x00, 0x00, 0xed, 0x06, 0x00, 0x00, 0xed, 0x06, 0x00, 0x00, 0x24, 0x07, + 0x00, 0x00, 0x23, 0x07, 0x00, 0x00, 0x22, 0x07, 0x00, 0x00, 0x7c, 0x06, 0x00, 0x00, 0xee, 0x06, 0x00, 0x00, 0xee, 0x06, 0x00, 0x00, 0xed, 0x06, 0x00, 0x00, + 0x22, 0x07, 0x00, 0x00, 0x7c, 0x06, 0x00, 0x00, 0x74, 0x06, 0x00, 0x00, 0x7a, 0x06, 0x00, 0x00, 0x7a, 0x06, 0x00, 0x00, 0xee, 0x06, 0x00, 0x00, 0x7c, 0x06, + 0x00, 0x00, 0x73, 0x06, 0x00, 0x00, 0x78, 0x06, 0x00, 0x00, 0x81, 0x06, 0x00, 0x00, 0x81, 0x06, 0x00, 0x00, 0x79, 0x06, 0x00, 0x00, 0x73, 0x06, 0x00, 0x00, + 0x24, 0x07, 0x00, 0x00, 0xed, 0x06, 0x00, 0x00, 0xea, 0x06, 0x00, 0x00, 0xea, 0x06, 0x00, 0x00, 0xc7, 0x01, 0x00, 0x00, 0x24, 0x07, 0x00, 0x00, 0x25, 0x07, + 0x00, 0x00, 0xc4, 0x01, 0x00, 0x00, 0xc3, 0x01, 0x00, 0x00, 0xc3, 0x01, 0x00, 0x00, 0x26, 0x07, 0x00, 0x00, 0x25, 0x07, 0x00, 0x00, 0xc4, 0x01, 0x00, 0x00, + 0xe5, 0x06, 0x00, 0x00, 0xe4, 0x06, 0x00, 0x00, 0xe4, 0x06, 0x00, 0x00, 0xc5, 0x01, 0x00, 0x00, 0xc4, 0x01, 0x00, 0x00, 0xc4, 0x01, 0x00, 0x00, 0x25, 0x07, + 0x00, 0x00, 0xe6, 0x06, 0x00, 0x00, 0xe6, 0x06, 0x00, 0x00, 0xe5, 0x06, 0x00, 0x00, 0xc4, 0x01, 0x00, 0x00, 0xf8, 0x06, 0x00, 0x00, 0x27, 0x07, 0x00, 0x00, + 0xc3, 0x01, 0x00, 0x00, 0xc3, 0x01, 0x00, 0x00, 0xf7, 0x06, 0x00, 0x00, 0xf8, 0x06, 0x00, 0x00, 0x5f, 0x05, 0x00, 0x00, 0xe3, 0x01, 0x00, 0x00, 0xe5, 0x01, + 0x00, 0x00, 0xe5, 0x01, 0x00, 0x00, 0x60, 0x05, 0x00, 0x00, 0x5f, 0x05, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x00, 0x28, 0x07, 0x00, 0x00, + 0x28, 0x07, 0x00, 0x00, 0xe6, 0x01, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x29, 0x07, 0x00, 0x00, 0x2a, 0x07, 0x00, 0x00, 0x2b, 0x07, 0x00, 0x00, 0x2b, 0x07, + 0x00, 0x00, 0xc8, 0x01, 0x00, 0x00, 0x29, 0x07, 0x00, 0x00, 0x2c, 0x07, 0x00, 0x00, 0x2d, 0x07, 0x00, 0x00, 0x2e, 0x07, 0x00, 0x00, 0x2e, 0x07, 0x00, 0x00, + 0x2f, 0x07, 0x00, 0x00, 0x2c, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, 0x2e, 0x07, 0x00, 0x00, 0x2d, 0x07, 0x00, 0x00, 0x2d, 0x07, 0x00, 0x00, 0x31, 0x07, + 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, 0x84, 0x01, 0x00, 0x00, 0x32, 0x07, 0x00, 0x00, 0x27, 0x07, 0x00, 0x00, 0x27, 0x07, 0x00, 0x00, 0x33, 0x07, 0x00, 0x00, + 0x84, 0x01, 0x00, 0x00, 0x32, 0x07, 0x00, 0x00, 0x84, 0x01, 0x00, 0x00, 0x83, 0x01, 0x00, 0x00, 0x83, 0x01, 0x00, 0x00, 0x34, 0x07, 0x00, 0x00, 0x32, 0x07, + 0x00, 0x00, 0x32, 0x07, 0x00, 0x00, 0x26, 0x07, 0x00, 0x00, 0x27, 0x07, 0x00, 0x00, 0x85, 0x01, 0x00, 0x00, 0x84, 0x01, 0x00, 0x00, 0x33, 0x07, 0x00, 0x00, + 0x33, 0x07, 0x00, 0x00, 0x84, 0x06, 0x00, 0x00, 0x85, 0x01, 0x00, 0x00, 0x27, 0x07, 0x00, 0x00, 0x26, 0x07, 0x00, 0x00, 0xc3, 0x01, 0x00, 0x00, 0x34, 0x07, + 0x00, 0x00, 0x25, 0x07, 0x00, 0x00, 0x26, 0x07, 0x00, 0x00, 0x26, 0x07, 0x00, 0x00, 0x32, 0x07, 0x00, 0x00, 0x34, 0x07, 0x00, 0x00, 0x34, 0x07, 0x00, 0x00, + 0x83, 0x01, 0x00, 0x00, 0x86, 0x06, 0x00, 0x00, 0x86, 0x06, 0x00, 0x00, 0xe7, 0x06, 0x00, 0x00, 0x34, 0x07, 0x00, 0x00, 0xca, 0x01, 0x00, 0x00, 0xc9, 0x01, + 0x00, 0x00, 0xe9, 0x06, 0x00, 0x00, 0xe9, 0x06, 0x00, 0x00, 0xe8, 0x06, 0x00, 0x00, 0xca, 0x01, 0x00, 0x00, 0x84, 0x06, 0x00, 0x00, 0xfe, 0x06, 0x00, 0x00, + 0xcc, 0x01, 0x00, 0x00, 0xcc, 0x01, 0x00, 0x00, 0xcd, 0x01, 0x00, 0x00, 0x84, 0x06, 0x00, 0x00, 0xc9, 0x01, 0x00, 0x00, 0xce, 0x01, 0x00, 0x00, 0xd0, 0x01, + 0x00, 0x00, 0xd0, 0x01, 0x00, 0x00, 0xe9, 0x06, 0x00, 0x00, 0xc9, 0x01, 0x00, 0x00, 0x25, 0x07, 0x00, 0x00, 0x34, 0x07, 0x00, 0x00, 0xe7, 0x06, 0x00, 0x00, + 0xe7, 0x06, 0x00, 0x00, 0xe6, 0x06, 0x00, 0x00, 0x25, 0x07, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0xca, 0x01, 0x00, 0x00, 0xe8, 0x06, 0x00, 0x00, 0xe8, 0x06, + 0x00, 0x00, 0x85, 0x06, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, 0xf8, 0x05, 0x00, 0x00, 0x35, 0x07, 0x00, 0x00, 0x36, 0x07, 0x00, 0x00, 0x36, 0x07, 0x00, 0x00, + 0xa9, 0x06, 0x00, 0x00, 0xf8, 0x05, 0x00, 0x00, 0xc0, 0x06, 0x00, 0x00, 0xa9, 0x06, 0x00, 0x00, 0x36, 0x07, 0x00, 0x00, 0x36, 0x07, 0x00, 0x00, 0xc1, 0x06, + 0x00, 0x00, 0xc0, 0x06, 0x00, 0x00, 0x37, 0x07, 0x00, 0x00, 0x35, 0x07, 0x00, 0x00, 0xf8, 0x05, 0x00, 0x00, 0xf8, 0x05, 0x00, 0x00, 0x3e, 0x01, 0x00, 0x00, + 0x37, 0x07, 0x00, 0x00, 0xe3, 0x06, 0x00, 0x00, 0xb8, 0x01, 0x00, 0x00, 0xb7, 0x01, 0x00, 0x00, 0xb7, 0x01, 0x00, 0x00, 0x38, 0x07, 0x00, 0x00, 0xe3, 0x06, + 0x00, 0x00, 0x38, 0x07, 0x00, 0x00, 0xb7, 0x01, 0x00, 0x00, 0x93, 0x05, 0x00, 0x00, 0x93, 0x05, 0x00, 0x00, 0xee, 0x01, 0x00, 0x00, 0x38, 0x07, 0x00, 0x00, + 0x2f, 0x07, 0x00, 0x00, 0x2b, 0x07, 0x00, 0x00, 0x2a, 0x07, 0x00, 0x00, 0x2a, 0x07, 0x00, 0x00, 0x2c, 0x07, 0x00, 0x00, 0x2f, 0x07, 0x00, 0x00, 0xc1, 0x01, + 0x00, 0x00, 0xe8, 0x01, 0x00, 0x00, 0xea, 0x01, 0x00, 0x00, 0xea, 0x01, 0x00, 0x00, 0x28, 0x07, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x00, 0xe7, 0x01, 0x00, 0x00, + 0x39, 0x07, 0x00, 0x00, 0xc6, 0x01, 0x00, 0x00, 0xc6, 0x01, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0xe7, 0x01, 0x00, 0x00, 0x31, 0x07, 0x00, 0x00, 0x5e, 0x05, + 0x00, 0x00, 0x61, 0x05, 0x00, 0x00, 0x61, 0x05, 0x00, 0x00, 0x30, 0x07, 0x00, 0x00, 0x31, 0x07, 0x00, 0x00, 0xd0, 0x06, 0x00, 0x00, 0xd2, 0x06, 0x00, 0x00, + 0x8d, 0x06, 0x00, 0x00, 0x8d, 0x06, 0x00, 0x00, 0xcf, 0x06, 0x00, 0x00, 0xd0, 0x06, 0x00, 0x00, 0x3a, 0x07, 0x00, 0x00, 0xdd, 0x01, 0x00, 0x00, 0xde, 0x01, + 0x00, 0x00, 0xde, 0x01, 0x00, 0x00, 0x3b, 0x07, 0x00, 0x00, 0x3a, 0x07, 0x00, 0x00, 0x3c, 0x07, 0x00, 0x00, 0xdc, 0x01, 0x00, 0x00, 0xdd, 0x01, 0x00, 0x00, + 0xdd, 0x01, 0x00, 0x00, 0x3a, 0x07, 0x00, 0x00, 0x3c, 0x07, 0x00, 0x00, 0x3d, 0x07, 0x00, 0x00, 0xdb, 0x01, 0x00, 0x00, 0xdc, 0x01, 0x00, 0x00, 0xdc, 0x01, + 0x00, 0x00, 0x3c, 0x07, 0x00, 0x00, 0x3d, 0x07, 0x00, 0x00, 0x3e, 0x07, 0x00, 0x00, 0xda, 0x01, 0x00, 0x00, 0xdb, 0x01, 0x00, 0x00, 0xdb, 0x01, 0x00, 0x00, + 0x3d, 0x07, 0x00, 0x00, 0x3e, 0x07, 0x00, 0x00, 0x3f, 0x07, 0x00, 0x00, 0xd8, 0x01, 0x00, 0x00, 0xda, 0x01, 0x00, 0x00, 0xda, 0x01, 0x00, 0x00, 0x3e, 0x07, + 0x00, 0x00, 0x3f, 0x07, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, 0xd7, 0x01, 0x00, 0x00, 0xd8, 0x01, 0x00, 0x00, 0xd8, 0x01, 0x00, 0x00, 0x3f, 0x07, 0x00, 0x00, + 0x40, 0x07, 0x00, 0x00, 0x41, 0x07, 0x00, 0x00, 0xd5, 0x01, 0x00, 0x00, 0xd7, 0x01, 0x00, 0x00, 0xd7, 0x01, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, 0x41, 0x07, + 0x00, 0x00, 0x42, 0x07, 0x00, 0x00, 0xd4, 0x01, 0x00, 0x00, 0xd5, 0x01, 0x00, 0x00, 0xd5, 0x01, 0x00, 0x00, 0x41, 0x07, 0x00, 0x00, 0x42, 0x07, 0x00, 0x00, + 0x43, 0x07, 0x00, 0x00, 0xd2, 0x01, 0x00, 0x00, 0xd4, 0x01, 0x00, 0x00, 0xd4, 0x01, 0x00, 0x00, 0x42, 0x07, 0x00, 0x00, 0x43, 0x07, 0x00, 0x00, 0x44, 0x07, + 0x00, 0x00, 0xd3, 0x01, 0x00, 0x00, 0xd2, 0x01, 0x00, 0x00, 0xd2, 0x01, 0x00, 0x00, 0x43, 0x07, 0x00, 0x00, 0x44, 0x07, 0x00, 0x00, 0x45, 0x07, 0x00, 0x00, + 0xd6, 0x01, 0x00, 0x00, 0xd3, 0x01, 0x00, 0x00, 0xd3, 0x01, 0x00, 0x00, 0x44, 0x07, 0x00, 0x00, 0x45, 0x07, 0x00, 0x00, 0xe1, 0x01, 0x00, 0x00, 0xd9, 0x01, + 0x00, 0x00, 0xd6, 0x01, 0x00, 0x00, 0xd6, 0x01, 0x00, 0x00, 0x45, 0x07, 0x00, 0x00, 0xe1, 0x01, 0x00, 0x00, 0x46, 0x07, 0x00, 0x00, 0xdf, 0x01, 0x00, 0x00, + 0xd9, 0x01, 0x00, 0x00, 0xd9, 0x01, 0x00, 0x00, 0xe1, 0x01, 0x00, 0x00, 0x46, 0x07, 0x00, 0x00, 0x3b, 0x07, 0x00, 0x00, 0xde, 0x01, 0x00, 0x00, 0xdf, 0x01, + 0x00, 0x00, 0xdf, 0x01, 0x00, 0x00, 0x46, 0x07, 0x00, 0x00, 0x3b, 0x07, 0x00, 0x00, 0x20, 0x06, 0x00, 0x00, 0x46, 0x07, 0x00, 0x00, 0xe1, 0x01, 0x00, 0x00, + 0xe1, 0x01, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x20, 0x06, 0x00, 0x00, 0x32, 0x06, 0x00, 0x00, 0x3b, 0x07, 0x00, 0x00, 0x46, 0x07, 0x00, 0x00, 0x46, 0x07, + 0x00, 0x00, 0x20, 0x06, 0x00, 0x00, 0x32, 0x06, 0x00, 0x00, 0x4a, 0x06, 0x00, 0x00, 0x3a, 0x07, 0x00, 0x00, 0x3b, 0x07, 0x00, 0x00, 0x3b, 0x07, 0x00, 0x00, + 0x32, 0x06, 0x00, 0x00, 0x4a, 0x06, 0x00, 0x00, 0x38, 0x06, 0x00, 0x00, 0x3c, 0x07, 0x00, 0x00, 0x3a, 0x07, 0x00, 0x00, 0x3a, 0x07, 0x00, 0x00, 0x4a, 0x06, + 0x00, 0x00, 0x38, 0x06, 0x00, 0x00, 0x37, 0x06, 0x00, 0x00, 0x3d, 0x07, 0x00, 0x00, 0x3c, 0x07, 0x00, 0x00, 0x3c, 0x07, 0x00, 0x00, 0x38, 0x06, 0x00, 0x00, + 0x37, 0x06, 0x00, 0x00, 0x3a, 0x06, 0x00, 0x00, 0x3e, 0x07, 0x00, 0x00, 0x3d, 0x07, 0x00, 0x00, 0x3d, 0x07, 0x00, 0x00, 0x37, 0x06, 0x00, 0x00, 0x3a, 0x06, + 0x00, 0x00, 0x2e, 0x06, 0x00, 0x00, 0x3f, 0x07, 0x00, 0x00, 0x3e, 0x07, 0x00, 0x00, 0x3e, 0x07, 0x00, 0x00, 0x3a, 0x06, 0x00, 0x00, 0x2e, 0x06, 0x00, 0x00, + 0x2d, 0x06, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, 0x3f, 0x07, 0x00, 0x00, 0x3f, 0x07, 0x00, 0x00, 0x2e, 0x06, 0x00, 0x00, 0x2d, 0x06, 0x00, 0x00, 0x3c, 0x06, + 0x00, 0x00, 0x41, 0x07, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, 0x2d, 0x06, 0x00, 0x00, 0x3c, 0x06, 0x00, 0x00, 0x3e, 0x06, 0x00, 0x00, + 0x42, 0x07, 0x00, 0x00, 0x41, 0x07, 0x00, 0x00, 0x41, 0x07, 0x00, 0x00, 0x3c, 0x06, 0x00, 0x00, 0x3e, 0x06, 0x00, 0x00, 0x41, 0x06, 0x00, 0x00, 0x43, 0x07, + 0x00, 0x00, 0x42, 0x07, 0x00, 0x00, 0x42, 0x07, 0x00, 0x00, 0x3e, 0x06, 0x00, 0x00, 0x41, 0x06, 0x00, 0x00, 0x45, 0x06, 0x00, 0x00, 0x44, 0x07, 0x00, 0x00, + 0x43, 0x07, 0x00, 0x00, 0x43, 0x07, 0x00, 0x00, 0x41, 0x06, 0x00, 0x00, 0x45, 0x06, 0x00, 0x00, 0xe2, 0x01, 0x00, 0x00, 0x47, 0x06, 0x00, 0x00, 0x44, 0x06, + 0x00, 0x00, 0x44, 0x06, 0x00, 0x00, 0x22, 0x06, 0x00, 0x00, 0xe2, 0x01, 0x00, 0x00, 0x47, 0x06, 0x00, 0x00, 0x45, 0x07, 0x00, 0x00, 0x44, 0x07, 0x00, 0x00, + 0x44, 0x07, 0x00, 0x00, 0x45, 0x06, 0x00, 0x00, 0x47, 0x06, 0x00, 0x00, 0xe1, 0x01, 0x00, 0x00, 0x45, 0x07, 0x00, 0x00, 0x47, 0x06, 0x00, 0x00, 0x47, 0x06, + 0x00, 0x00, 0xe2, 0x01, 0x00, 0x00, 0xe1, 0x01, 0x00, 0x00, 0xc6, 0x01, 0x00, 0x00, 0x39, 0x07, 0x00, 0x00, 0x29, 0x07, 0x00, 0x00, 0x29, 0x07, 0x00, 0x00, + 0xc8, 0x01, 0x00, 0x00, 0xc6, 0x01, 0x00, 0x00, 0xeb, 0x01, 0x00, 0x00, 0xe3, 0x01, 0x00, 0x00, 0x5f, 0x05, 0x00, 0x00, 0x5f, 0x05, 0x00, 0x00, 0x47, 0x07, + 0x00, 0x00, 0xeb, 0x01, 0x00, 0x00, 0x48, 0x07, 0x00, 0x00, 0x49, 0x07, 0x00, 0x00, 0x29, 0x07, 0x00, 0x00, 0x29, 0x07, 0x00, 0x00, 0x39, 0x07, 0x00, 0x00, + 0x48, 0x07, 0x00, 0x00, 0x4a, 0x07, 0x00, 0x00, 0x2a, 0x07, 0x00, 0x00, 0x29, 0x07, 0x00, 0x00, 0x29, 0x07, 0x00, 0x00, 0x49, 0x07, 0x00, 0x00, 0x4a, 0x07, + 0x00, 0x00, 0x28, 0x07, 0x00, 0x00, 0x4b, 0x07, 0x00, 0x00, 0x4c, 0x07, 0x00, 0x00, 0x4c, 0x07, 0x00, 0x00, 0xe6, 0x01, 0x00, 0x00, 0x28, 0x07, 0x00, 0x00, + 0xea, 0x01, 0x00, 0x00, 0x19, 0x02, 0x00, 0x00, 0x4b, 0x07, 0x00, 0x00, 0x4b, 0x07, 0x00, 0x00, 0x28, 0x07, 0x00, 0x00, 0xea, 0x01, 0x00, 0x00, 0x19, 0x02, + 0x00, 0x00, 0xea, 0x01, 0x00, 0x00, 0xe9, 0x01, 0x00, 0x00, 0xe9, 0x01, 0x00, 0x00, 0x17, 0x02, 0x00, 0x00, 0x19, 0x02, 0x00, 0x00, 0x4d, 0x07, 0x00, 0x00, + 0x2c, 0x07, 0x00, 0x00, 0x2a, 0x07, 0x00, 0x00, 0x2a, 0x07, 0x00, 0x00, 0x4a, 0x07, 0x00, 0x00, 0x4d, 0x07, 0x00, 0x00, 0x4e, 0x07, 0x00, 0x00, 0x2d, 0x07, + 0x00, 0x00, 0x2c, 0x07, 0x00, 0x00, 0x2c, 0x07, 0x00, 0x00, 0x4d, 0x07, 0x00, 0x00, 0x4e, 0x07, 0x00, 0x00, 0x4f, 0x07, 0x00, 0x00, 0x31, 0x07, 0x00, 0x00, + 0x2d, 0x07, 0x00, 0x00, 0x2d, 0x07, 0x00, 0x00, 0x4e, 0x07, 0x00, 0x00, 0x4f, 0x07, 0x00, 0x00, 0x50, 0x07, 0x00, 0x00, 0x5e, 0x05, 0x00, 0x00, 0x31, 0x07, + 0x00, 0x00, 0x31, 0x07, 0x00, 0x00, 0x4f, 0x07, 0x00, 0x00, 0x50, 0x07, 0x00, 0x00, 0x47, 0x07, 0x00, 0x00, 0x5f, 0x05, 0x00, 0x00, 0x5e, 0x05, 0x00, 0x00, + 0x5e, 0x05, 0x00, 0x00, 0x50, 0x07, 0x00, 0x00, 0x47, 0x07, 0x00, 0x00, 0xe7, 0x01, 0x00, 0x00, 0x51, 0x07, 0x00, 0x00, 0x48, 0x07, 0x00, 0x00, 0x48, 0x07, + 0x00, 0x00, 0x39, 0x07, 0x00, 0x00, 0xe7, 0x01, 0x00, 0x00, 0x52, 0x07, 0x00, 0x00, 0xf1, 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, + 0x53, 0x07, 0x00, 0x00, 0x52, 0x07, 0x00, 0x00, 0x22, 0x02, 0x00, 0x00, 0x54, 0x07, 0x00, 0x00, 0xf1, 0x01, 0x00, 0x00, 0xf1, 0x01, 0x00, 0x00, 0x52, 0x07, + 0x00, 0x00, 0x22, 0x02, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x55, 0x07, 0x00, 0x00, 0x56, 0x07, 0x00, 0x00, 0x56, 0x07, 0x00, 0x00, 0x53, 0x07, 0x00, 0x00, + 0xf0, 0x01, 0x00, 0x00, 0x53, 0x07, 0x00, 0x00, 0x56, 0x07, 0x00, 0x00, 0x57, 0x07, 0x00, 0x00, 0x57, 0x07, 0x00, 0x00, 0x52, 0x07, 0x00, 0x00, 0x53, 0x07, + 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x58, 0x07, 0x00, 0x00, 0x59, 0x07, 0x00, 0x00, 0x59, 0x07, 0x00, 0x00, 0x55, 0x07, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, + 0x5a, 0x07, 0x00, 0x00, 0x56, 0x07, 0x00, 0x00, 0x55, 0x07, 0x00, 0x00, 0x55, 0x07, 0x00, 0x00, 0x5b, 0x07, 0x00, 0x00, 0x5a, 0x07, 0x00, 0x00, 0x5c, 0x07, + 0x00, 0x00, 0xf2, 0x01, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x5c, 0x07, 0x00, 0x00, 0x0f, 0x02, 0x00, 0x00, + 0xf2, 0x01, 0x00, 0x00, 0x5c, 0x07, 0x00, 0x00, 0x5c, 0x07, 0x00, 0x00, 0x5d, 0x07, 0x00, 0x00, 0x0f, 0x02, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0xf4, 0x01, + 0x00, 0x00, 0x5e, 0x07, 0x00, 0x00, 0x5e, 0x07, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, + 0x5d, 0x07, 0x00, 0x00, 0x5d, 0x07, 0x00, 0x00, 0x5c, 0x07, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x5f, 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0x00, 0x0a, 0x02, + 0x00, 0x00, 0x0a, 0x02, 0x00, 0x00, 0xf9, 0x01, 0x00, 0x00, 0x5f, 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0x00, 0x5f, 0x07, 0x00, 0x00, 0x61, 0x07, 0x00, 0x00, + 0x61, 0x07, 0x00, 0x00, 0x62, 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0x00, 0x63, 0x07, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x0a, 0x02, 0x00, 0x00, 0x0a, 0x02, + 0x00, 0x00, 0x60, 0x07, 0x00, 0x00, 0x63, 0x07, 0x00, 0x00, 0x09, 0x02, 0x00, 0x00, 0xfa, 0x01, 0x00, 0x00, 0xf9, 0x01, 0x00, 0x00, 0xf9, 0x01, 0x00, 0x00, + 0x0a, 0x02, 0x00, 0x00, 0x09, 0x02, 0x00, 0x00, 0x05, 0x02, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0x5f, 0x07, 0x00, 0x00, 0x5f, 0x07, 0x00, 0x00, 0xf9, 0x01, + 0x00, 0x00, 0x05, 0x02, 0x00, 0x00, 0xfd, 0x01, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0x05, 0x02, 0x00, 0x00, 0x05, 0x02, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, + 0xfd, 0x01, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0xfb, 0x01, 0x00, 0x00, 0x61, 0x07, 0x00, 0x00, 0x61, 0x07, 0x00, 0x00, 0x5f, 0x07, 0x00, 0x00, 0xfc, 0x01, + 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x05, 0x02, 0x00, 0x00, 0x05, 0x02, 0x00, 0x00, 0xf9, 0x01, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, + 0x64, 0x07, 0x00, 0x00, 0x65, 0x07, 0x00, 0x00, 0x66, 0x07, 0x00, 0x00, 0x66, 0x07, 0x00, 0x00, 0x67, 0x07, 0x00, 0x00, 0x64, 0x07, 0x00, 0x00, 0x64, 0x07, + 0x00, 0x00, 0x68, 0x07, 0x00, 0x00, 0x69, 0x07, 0x00, 0x00, 0x69, 0x07, 0x00, 0x00, 0x65, 0x07, 0x00, 0x00, 0x64, 0x07, 0x00, 0x00, 0x65, 0x07, 0x00, 0x00, + 0x6a, 0x07, 0x00, 0x00, 0x6b, 0x07, 0x00, 0x00, 0x6b, 0x07, 0x00, 0x00, 0x66, 0x07, 0x00, 0x00, 0x65, 0x07, 0x00, 0x00, 0x67, 0x07, 0x00, 0x00, 0x66, 0x07, + 0x00, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x6c, 0x07, 0x00, 0x00, 0x6d, 0x07, 0x00, 0x00, 0x67, 0x07, 0x00, 0x00, 0x6e, 0x07, 0x00, 0x00, 0x64, 0x07, 0x00, 0x00, + 0x67, 0x07, 0x00, 0x00, 0x67, 0x07, 0x00, 0x00, 0x6f, 0x07, 0x00, 0x00, 0x6e, 0x07, 0x00, 0x00, 0x5a, 0x07, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0xf7, 0x01, + 0x00, 0x00, 0xf7, 0x01, 0x00, 0x00, 0xf6, 0x01, 0x00, 0x00, 0x5a, 0x07, 0x00, 0x00, 0x5b, 0x07, 0x00, 0x00, 0x1c, 0x02, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, + 0x70, 0x07, 0x00, 0x00, 0x5a, 0x07, 0x00, 0x00, 0x5b, 0x07, 0x00, 0x00, 0xf7, 0x01, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x71, 0x07, 0x00, 0x00, 0x71, 0x07, + 0x00, 0x00, 0x72, 0x07, 0x00, 0x00, 0xf7, 0x01, 0x00, 0x00, 0x5a, 0x07, 0x00, 0x00, 0xf6, 0x01, 0x00, 0x00, 0x57, 0x07, 0x00, 0x00, 0x57, 0x07, 0x00, 0x00, + 0x56, 0x07, 0x00, 0x00, 0x5a, 0x07, 0x00, 0x00, 0xf5, 0x01, 0x00, 0x00, 0x73, 0x07, 0x00, 0x00, 0x57, 0x07, 0x00, 0x00, 0x57, 0x07, 0x00, 0x00, 0xf6, 0x01, + 0x00, 0x00, 0xf5, 0x01, 0x00, 0x00, 0xf5, 0x01, 0x00, 0x00, 0x74, 0x07, 0x00, 0x00, 0x75, 0x07, 0x00, 0x00, 0x75, 0x07, 0x00, 0x00, 0x73, 0x07, 0x00, 0x00, + 0xf5, 0x01, 0x00, 0x00, 0x57, 0x07, 0x00, 0x00, 0x73, 0x07, 0x00, 0x00, 0x22, 0x02, 0x00, 0x00, 0x22, 0x02, 0x00, 0x00, 0x52, 0x07, 0x00, 0x00, 0x57, 0x07, + 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x76, 0x07, 0x00, 0x00, 0x77, 0x07, 0x00, 0x00, 0x77, 0x07, 0x00, 0x00, 0x78, 0x07, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, + 0x79, 0x07, 0x00, 0x00, 0x76, 0x07, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x79, 0x07, 0x00, 0x00, 0x07, 0x02, + 0x00, 0x00, 0x77, 0x07, 0x00, 0x00, 0x76, 0x07, 0x00, 0x00, 0x76, 0x07, 0x00, 0x00, 0x7a, 0x07, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x77, 0x07, 0x00, 0x00, + 0x7b, 0x07, 0x00, 0x00, 0x7c, 0x07, 0x00, 0x00, 0x7c, 0x07, 0x00, 0x00, 0x78, 0x07, 0x00, 0x00, 0x77, 0x07, 0x00, 0x00, 0x7d, 0x07, 0x00, 0x00, 0x5d, 0x07, + 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x78, 0x07, 0x00, 0x00, 0x7d, 0x07, 0x00, 0x00, 0x7c, 0x07, 0x00, 0x00, 0x7e, 0x07, 0x00, 0x00, + 0x7d, 0x07, 0x00, 0x00, 0x7d, 0x07, 0x00, 0x00, 0x78, 0x07, 0x00, 0x00, 0x7c, 0x07, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0xfa, 0x01, 0x00, 0x00, 0x7e, 0x07, + 0x00, 0x00, 0x7e, 0x07, 0x00, 0x00, 0x7c, 0x07, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0x7d, 0x07, 0x00, 0x00, 0x7e, 0x07, 0x00, 0x00, 0x7f, 0x07, 0x00, 0x00, + 0x7f, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x7d, 0x07, 0x00, 0x00, 0x09, 0x02, 0x00, 0x00, 0x7f, 0x07, 0x00, 0x00, 0x7e, 0x07, 0x00, 0x00, 0x7e, 0x07, + 0x00, 0x00, 0xfa, 0x01, 0x00, 0x00, 0x09, 0x02, 0x00, 0x00, 0x7b, 0x07, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, + 0x7c, 0x07, 0x00, 0x00, 0x7b, 0x07, 0x00, 0x00, 0x81, 0x07, 0x00, 0x00, 0x82, 0x07, 0x00, 0x00, 0x58, 0x07, 0x00, 0x00, 0x58, 0x07, 0x00, 0x00, 0x24, 0x02, + 0x00, 0x00, 0x81, 0x07, 0x00, 0x00, 0x83, 0x07, 0x00, 0x00, 0x84, 0x07, 0x00, 0x00, 0x82, 0x07, 0x00, 0x00, 0x82, 0x07, 0x00, 0x00, 0x81, 0x07, 0x00, 0x00, + 0x83, 0x07, 0x00, 0x00, 0x85, 0x07, 0x00, 0x00, 0x59, 0x07, 0x00, 0x00, 0x58, 0x07, 0x00, 0x00, 0x58, 0x07, 0x00, 0x00, 0x82, 0x07, 0x00, 0x00, 0x85, 0x07, + 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xef, 0x01, 0x00, 0x00, 0x24, 0x02, 0x00, 0x00, 0x24, 0x02, 0x00, 0x00, 0x58, 0x07, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, + 0x86, 0x07, 0x00, 0x00, 0x87, 0x07, 0x00, 0x00, 0x81, 0x07, 0x00, 0x00, 0x81, 0x07, 0x00, 0x00, 0x24, 0x02, 0x00, 0x00, 0x86, 0x07, 0x00, 0x00, 0x88, 0x07, + 0x00, 0x00, 0x89, 0x07, 0x00, 0x00, 0x84, 0x07, 0x00, 0x00, 0x84, 0x07, 0x00, 0x00, 0x83, 0x07, 0x00, 0x00, 0x88, 0x07, 0x00, 0x00, 0x8a, 0x07, 0x00, 0x00, + 0x85, 0x07, 0x00, 0x00, 0x82, 0x07, 0x00, 0x00, 0x82, 0x07, 0x00, 0x00, 0x84, 0x07, 0x00, 0x00, 0x8a, 0x07, 0x00, 0x00, 0x81, 0x07, 0x00, 0x00, 0x87, 0x07, + 0x00, 0x00, 0x8b, 0x07, 0x00, 0x00, 0x8b, 0x07, 0x00, 0x00, 0x83, 0x07, 0x00, 0x00, 0x81, 0x07, 0x00, 0x00, 0x8c, 0x07, 0x00, 0x00, 0x87, 0x07, 0x00, 0x00, + 0x86, 0x07, 0x00, 0x00, 0x86, 0x07, 0x00, 0x00, 0x8d, 0x07, 0x00, 0x00, 0x8c, 0x07, 0x00, 0x00, 0x8b, 0x07, 0x00, 0x00, 0x87, 0x07, 0x00, 0x00, 0x8c, 0x07, + 0x00, 0x00, 0x8c, 0x07, 0x00, 0x00, 0x8e, 0x07, 0x00, 0x00, 0x8b, 0x07, 0x00, 0x00, 0x8f, 0x07, 0x00, 0x00, 0x8d, 0x07, 0x00, 0x00, 0x86, 0x07, 0x00, 0x00, + 0x86, 0x07, 0x00, 0x00, 0x90, 0x07, 0x00, 0x00, 0x8f, 0x07, 0x00, 0x00, 0x91, 0x07, 0x00, 0x00, 0x92, 0x07, 0x00, 0x00, 0x8c, 0x07, 0x00, 0x00, 0x8c, 0x07, + 0x00, 0x00, 0x8d, 0x07, 0x00, 0x00, 0x91, 0x07, 0x00, 0x00, 0x92, 0x07, 0x00, 0x00, 0x93, 0x07, 0x00, 0x00, 0x8e, 0x07, 0x00, 0x00, 0x8e, 0x07, 0x00, 0x00, + 0x8c, 0x07, 0x00, 0x00, 0x92, 0x07, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, 0x8b, 0x07, 0x00, 0x00, 0x8e, 0x07, 0x00, 0x00, 0x8e, 0x07, 0x00, 0x00, 0x95, 0x07, + 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, 0x7a, 0x07, 0x00, 0x00, 0x89, 0x07, 0x00, 0x00, 0x88, 0x07, 0x00, 0x00, 0x88, 0x07, 0x00, 0x00, 0x96, 0x07, 0x00, 0x00, + 0x7a, 0x07, 0x00, 0x00, 0x84, 0x07, 0x00, 0x00, 0x89, 0x07, 0x00, 0x00, 0x79, 0x07, 0x00, 0x00, 0x79, 0x07, 0x00, 0x00, 0x8a, 0x07, 0x00, 0x00, 0x84, 0x07, + 0x00, 0x00, 0x8b, 0x07, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, 0x88, 0x07, 0x00, 0x00, 0x88, 0x07, 0x00, 0x00, 0x83, 0x07, 0x00, 0x00, 0x8b, 0x07, 0x00, 0x00, + 0x97, 0x07, 0x00, 0x00, 0x95, 0x07, 0x00, 0x00, 0x8e, 0x07, 0x00, 0x00, 0x8e, 0x07, 0x00, 0x00, 0x93, 0x07, 0x00, 0x00, 0x97, 0x07, 0x00, 0x00, 0x98, 0x07, + 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, 0x95, 0x07, 0x00, 0x00, 0x95, 0x07, 0x00, 0x00, 0x99, 0x07, 0x00, 0x00, 0x98, 0x07, 0x00, 0x00, 0x96, 0x07, 0x00, 0x00, + 0x88, 0x07, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, 0x94, 0x07, 0x00, 0x00, 0x98, 0x07, 0x00, 0x00, 0x96, 0x07, 0x00, 0x00, 0x9a, 0x07, 0x00, 0x00, 0x99, 0x07, + 0x00, 0x00, 0x95, 0x07, 0x00, 0x00, 0x95, 0x07, 0x00, 0x00, 0x97, 0x07, 0x00, 0x00, 0x9a, 0x07, 0x00, 0x00, 0xfb, 0x01, 0x00, 0x00, 0x98, 0x07, 0x00, 0x00, + 0x99, 0x07, 0x00, 0x00, 0x99, 0x07, 0x00, 0x00, 0x61, 0x07, 0x00, 0x00, 0xfb, 0x01, 0x00, 0x00, 0xfd, 0x01, 0x00, 0x00, 0x96, 0x07, 0x00, 0x00, 0x98, 0x07, + 0x00, 0x00, 0x98, 0x07, 0x00, 0x00, 0xfb, 0x01, 0x00, 0x00, 0xfd, 0x01, 0x00, 0x00, 0x62, 0x07, 0x00, 0x00, 0x61, 0x07, 0x00, 0x00, 0x99, 0x07, 0x00, 0x00, + 0x99, 0x07, 0x00, 0x00, 0x9a, 0x07, 0x00, 0x00, 0x62, 0x07, 0x00, 0x00, 0xf2, 0x01, 0x00, 0x00, 0x9b, 0x07, 0x00, 0x00, 0x9c, 0x07, 0x00, 0x00, 0x9c, 0x07, + 0x00, 0x00, 0xf3, 0x01, 0x00, 0x00, 0xf2, 0x01, 0x00, 0x00, 0xf2, 0x01, 0x00, 0x00, 0x0e, 0x02, 0x00, 0x00, 0x9d, 0x07, 0x00, 0x00, 0x9d, 0x07, 0x00, 0x00, + 0x9b, 0x07, 0x00, 0x00, 0xf2, 0x01, 0x00, 0x00, 0xee, 0x01, 0x00, 0x00, 0xed, 0x01, 0x00, 0x00, 0x9c, 0x07, 0x00, 0x00, 0x9c, 0x07, 0x00, 0x00, 0x9b, 0x07, + 0x00, 0x00, 0xee, 0x01, 0x00, 0x00, 0x9c, 0x07, 0x00, 0x00, 0x9e, 0x07, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0xf3, 0x01, 0x00, 0x00, + 0x9c, 0x07, 0x00, 0x00, 0xf3, 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x9f, 0x07, 0x00, 0x00, 0xf3, 0x01, + 0x00, 0x00, 0x59, 0x07, 0x00, 0x00, 0x85, 0x07, 0x00, 0x00, 0x9f, 0x07, 0x00, 0x00, 0x9f, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x59, 0x07, 0x00, 0x00, + 0xf4, 0x01, 0x00, 0x00, 0xf3, 0x01, 0x00, 0x00, 0x9f, 0x07, 0x00, 0x00, 0x9f, 0x07, 0x00, 0x00, 0x5e, 0x07, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, 0x9f, 0x07, + 0x00, 0x00, 0x85, 0x07, 0x00, 0x00, 0x8a, 0x07, 0x00, 0x00, 0x8a, 0x07, 0x00, 0x00, 0x5e, 0x07, 0x00, 0x00, 0x9f, 0x07, 0x00, 0x00, 0x8a, 0x07, 0x00, 0x00, + 0x79, 0x07, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x5e, 0x07, 0x00, 0x00, 0x8a, 0x07, 0x00, 0x00, 0x59, 0x07, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x5b, 0x07, 0x00, 0x00, 0x5b, 0x07, 0x00, 0x00, 0x55, 0x07, 0x00, 0x00, 0x59, 0x07, 0x00, 0x00, 0x79, 0x07, 0x00, 0x00, 0x89, 0x07, 0x00, 0x00, + 0x7a, 0x07, 0x00, 0x00, 0x7a, 0x07, 0x00, 0x00, 0x76, 0x07, 0x00, 0x00, 0x79, 0x07, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x7b, 0x07, + 0x00, 0x00, 0x7b, 0x07, 0x00, 0x00, 0x77, 0x07, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x7a, 0x07, 0x00, 0x00, 0x96, 0x07, 0x00, 0x00, 0xfd, 0x01, 0x00, 0x00, + 0xfd, 0x01, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x7a, 0x07, 0x00, 0x00, 0x5b, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x01, 0x02, + 0x00, 0x00, 0x1c, 0x02, 0x00, 0x00, 0x5b, 0x07, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x1c, 0x02, 0x00, 0x00, 0x1b, 0x02, 0x00, 0x00, 0x1b, 0x02, 0x00, 0x00, + 0x71, 0x07, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0x6f, 0x07, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x00, 0xa1, 0x07, 0x00, 0x00, 0xa1, 0x07, 0x00, 0x00, 0x6e, 0x07, + 0x00, 0x00, 0x6f, 0x07, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x00, 0x6f, 0x07, 0x00, 0x00, 0xa2, 0x07, 0x00, 0x00, 0xa2, 0x07, 0x00, 0x00, 0xa3, 0x07, 0x00, 0x00, + 0xa0, 0x07, 0x00, 0x00, 0xa4, 0x07, 0x00, 0x00, 0xa1, 0x07, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x00, 0xa5, 0x07, 0x00, 0x00, 0xa4, 0x07, + 0x00, 0x00, 0xa1, 0x07, 0x00, 0x00, 0xa6, 0x07, 0x00, 0x00, 0xa7, 0x07, 0x00, 0x00, 0xa7, 0x07, 0x00, 0x00, 0x6e, 0x07, 0x00, 0x00, 0xa1, 0x07, 0x00, 0x00, + 0x64, 0x07, 0x00, 0x00, 0x6e, 0x07, 0x00, 0x00, 0xa7, 0x07, 0x00, 0x00, 0xa7, 0x07, 0x00, 0x00, 0x68, 0x07, 0x00, 0x00, 0x64, 0x07, 0x00, 0x00, 0x6f, 0x07, + 0x00, 0x00, 0x67, 0x07, 0x00, 0x00, 0x6d, 0x07, 0x00, 0x00, 0x6d, 0x07, 0x00, 0x00, 0xa2, 0x07, 0x00, 0x00, 0x6f, 0x07, 0x00, 0x00, 0xa5, 0x07, 0x00, 0x00, + 0xa8, 0x07, 0x00, 0x00, 0xa9, 0x07, 0x00, 0x00, 0xa9, 0x07, 0x00, 0x00, 0xa4, 0x07, 0x00, 0x00, 0xa5, 0x07, 0x00, 0x00, 0xa8, 0x07, 0x00, 0x00, 0xa5, 0x07, + 0x00, 0x00, 0xaa, 0x07, 0x00, 0x00, 0xaa, 0x07, 0x00, 0x00, 0xab, 0x07, 0x00, 0x00, 0xa8, 0x07, 0x00, 0x00, 0xa8, 0x07, 0x00, 0x00, 0xac, 0x07, 0x00, 0x00, + 0xad, 0x07, 0x00, 0x00, 0xad, 0x07, 0x00, 0x00, 0xa9, 0x07, 0x00, 0x00, 0xa8, 0x07, 0x00, 0x00, 0xa4, 0x07, 0x00, 0x00, 0xa9, 0x07, 0x00, 0x00, 0x2a, 0x02, + 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x29, 0x02, 0x00, 0x00, 0xa4, 0x07, 0x00, 0x00, 0xa1, 0x07, 0x00, 0x00, 0xa4, 0x07, 0x00, 0x00, 0x29, 0x02, 0x00, 0x00, + 0x29, 0x02, 0x00, 0x00, 0xa6, 0x07, 0x00, 0x00, 0xa1, 0x07, 0x00, 0x00, 0xa5, 0x07, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x00, 0xa3, 0x07, 0x00, 0x00, 0xa3, 0x07, + 0x00, 0x00, 0xaa, 0x07, 0x00, 0x00, 0xa5, 0x07, 0x00, 0x00, 0xac, 0x07, 0x00, 0x00, 0xa8, 0x07, 0x00, 0x00, 0xab, 0x07, 0x00, 0x00, 0xab, 0x07, 0x00, 0x00, + 0xae, 0x07, 0x00, 0x00, 0xac, 0x07, 0x00, 0x00, 0xaf, 0x07, 0x00, 0x00, 0xad, 0x07, 0x00, 0x00, 0xac, 0x07, 0x00, 0x00, 0xac, 0x07, 0x00, 0x00, 0xb0, 0x07, + 0x00, 0x00, 0xaf, 0x07, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0xa9, 0x07, 0x00, 0x00, 0xad, 0x07, 0x00, 0x00, 0xad, 0x07, 0x00, 0x00, 0x26, 0x02, 0x00, 0x00, + 0x2a, 0x02, 0x00, 0x00, 0x26, 0x02, 0x00, 0x00, 0xad, 0x07, 0x00, 0x00, 0xaf, 0x07, 0x00, 0x00, 0xaf, 0x07, 0x00, 0x00, 0x27, 0x02, 0x00, 0x00, 0x26, 0x02, + 0x00, 0x00, 0xb0, 0x07, 0x00, 0x00, 0xac, 0x07, 0x00, 0x00, 0xae, 0x07, 0x00, 0x00, 0xae, 0x07, 0x00, 0x00, 0xb1, 0x07, 0x00, 0x00, 0xb0, 0x07, 0x00, 0x00, + 0xaf, 0x07, 0x00, 0x00, 0xb0, 0x07, 0x00, 0x00, 0xb2, 0x07, 0x00, 0x00, 0xb2, 0x07, 0x00, 0x00, 0xb3, 0x07, 0x00, 0x00, 0xaf, 0x07, 0x00, 0x00, 0xed, 0x01, + 0x00, 0x00, 0xb4, 0x07, 0x00, 0x00, 0x9e, 0x07, 0x00, 0x00, 0x9e, 0x07, 0x00, 0x00, 0x9c, 0x07, 0x00, 0x00, 0xed, 0x01, 0x00, 0x00, 0x2e, 0x02, 0x00, 0x00, + 0xb4, 0x07, 0x00, 0x00, 0xed, 0x01, 0x00, 0x00, 0xed, 0x01, 0x00, 0x00, 0xec, 0x01, 0x00, 0x00, 0x2e, 0x02, 0x00, 0x00, 0xb5, 0x07, 0x00, 0x00, 0x9e, 0x07, + 0x00, 0x00, 0xb4, 0x07, 0x00, 0x00, 0xb4, 0x07, 0x00, 0x00, 0x1f, 0x02, 0x00, 0x00, 0xb5, 0x07, 0x00, 0x00, 0xb6, 0x07, 0x00, 0x00, 0x09, 0x02, 0x00, 0x00, + 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0xb7, 0x07, 0x00, 0x00, 0xb6, 0x07, 0x00, 0x00, 0xf7, 0x01, 0x00, 0x00, 0xb8, 0x07, 0x00, 0x00, 0x74, 0x07, + 0x00, 0x00, 0x74, 0x07, 0x00, 0x00, 0xf5, 0x01, 0x00, 0x00, 0xf7, 0x01, 0x00, 0x00, 0x60, 0x07, 0x00, 0x00, 0x62, 0x07, 0x00, 0x00, 0xb9, 0x07, 0x00, 0x00, + 0xb9, 0x07, 0x00, 0x00, 0x63, 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0x00, 0x9a, 0x07, 0x00, 0x00, 0xba, 0x07, 0x00, 0x00, 0xb9, 0x07, 0x00, 0x00, 0xb9, 0x07, + 0x00, 0x00, 0x62, 0x07, 0x00, 0x00, 0x9a, 0x07, 0x00, 0x00, 0x63, 0x07, 0x00, 0x00, 0xb9, 0x07, 0x00, 0x00, 0xbb, 0x07, 0x00, 0x00, 0xbb, 0x07, 0x00, 0x00, + 0xbc, 0x07, 0x00, 0x00, 0x63, 0x07, 0x00, 0x00, 0xba, 0x07, 0x00, 0x00, 0xbd, 0x07, 0x00, 0x00, 0xbb, 0x07, 0x00, 0x00, 0xbb, 0x07, 0x00, 0x00, 0xb9, 0x07, + 0x00, 0x00, 0xba, 0x07, 0x00, 0x00, 0xbc, 0x07, 0x00, 0x00, 0xbb, 0x07, 0x00, 0x00, 0xbe, 0x07, 0x00, 0x00, 0xbe, 0x07, 0x00, 0x00, 0xbf, 0x07, 0x00, 0x00, + 0xbc, 0x07, 0x00, 0x00, 0xbc, 0x07, 0x00, 0x00, 0xb7, 0x07, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x63, 0x07, 0x00, 0x00, 0xbc, 0x07, + 0x00, 0x00, 0xb7, 0x07, 0x00, 0x00, 0x0c, 0x02, 0x00, 0x00, 0x0b, 0x02, 0x00, 0x00, 0x0b, 0x02, 0x00, 0x00, 0xb6, 0x07, 0x00, 0x00, 0xb7, 0x07, 0x00, 0x00, + 0xbf, 0x07, 0x00, 0x00, 0x0c, 0x02, 0x00, 0x00, 0xb7, 0x07, 0x00, 0x00, 0xb7, 0x07, 0x00, 0x00, 0xbc, 0x07, 0x00, 0x00, 0xbf, 0x07, 0x00, 0x00, 0x0b, 0x02, + 0x00, 0x00, 0x1a, 0x02, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xb6, 0x07, 0x00, 0x00, 0x0b, 0x02, 0x00, 0x00, 0x09, 0x02, 0x00, 0x00, + 0xb6, 0x07, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x7f, 0x07, 0x00, 0x00, 0x09, 0x02, 0x00, 0x00, 0xbd, 0x07, 0x00, 0x00, 0xc1, 0x07, + 0x00, 0x00, 0xbe, 0x07, 0x00, 0x00, 0xbe, 0x07, 0x00, 0x00, 0xbb, 0x07, 0x00, 0x00, 0xbd, 0x07, 0x00, 0x00, 0xc2, 0x07, 0x00, 0x00, 0xbf, 0x07, 0x00, 0x00, + 0xbe, 0x07, 0x00, 0x00, 0xbe, 0x07, 0x00, 0x00, 0xc3, 0x07, 0x00, 0x00, 0xc2, 0x07, 0x00, 0x00, 0x71, 0x07, 0x00, 0x00, 0xc4, 0x07, 0x00, 0x00, 0xc5, 0x07, + 0x00, 0x00, 0xc5, 0x07, 0x00, 0x00, 0x72, 0x07, 0x00, 0x00, 0x71, 0x07, 0x00, 0x00, 0xc6, 0x07, 0x00, 0x00, 0xb8, 0x07, 0x00, 0x00, 0xf7, 0x01, 0x00, 0x00, + 0xf7, 0x01, 0x00, 0x00, 0x72, 0x07, 0x00, 0x00, 0xc6, 0x07, 0x00, 0x00, 0xc6, 0x07, 0x00, 0x00, 0xc7, 0x07, 0x00, 0x00, 0xc8, 0x07, 0x00, 0x00, 0xc8, 0x07, + 0x00, 0x00, 0xb8, 0x07, 0x00, 0x00, 0xc6, 0x07, 0x00, 0x00, 0xc9, 0x07, 0x00, 0x00, 0xc6, 0x07, 0x00, 0x00, 0x72, 0x07, 0x00, 0x00, 0x72, 0x07, 0x00, 0x00, + 0xc5, 0x07, 0x00, 0x00, 0xc9, 0x07, 0x00, 0x00, 0xca, 0x07, 0x00, 0x00, 0xcb, 0x07, 0x00, 0x00, 0xcc, 0x07, 0x00, 0x00, 0xcc, 0x07, 0x00, 0x00, 0xcd, 0x07, + 0x00, 0x00, 0xca, 0x07, 0x00, 0x00, 0xc5, 0x07, 0x00, 0x00, 0xc4, 0x07, 0x00, 0x00, 0xcb, 0x07, 0x00, 0x00, 0xcb, 0x07, 0x00, 0x00, 0xca, 0x07, 0x00, 0x00, + 0xc5, 0x07, 0x00, 0x00, 0xb5, 0x07, 0x00, 0x00, 0xcc, 0x07, 0x00, 0x00, 0xcb, 0x07, 0x00, 0x00, 0xcb, 0x07, 0x00, 0x00, 0xce, 0x07, 0x00, 0x00, 0xb5, 0x07, + 0x00, 0x00, 0xcd, 0x07, 0x00, 0x00, 0xcc, 0x07, 0x00, 0x00, 0x1e, 0x02, 0x00, 0x00, 0x1e, 0x02, 0x00, 0x00, 0xcf, 0x07, 0x00, 0x00, 0xcd, 0x07, 0x00, 0x00, + 0xcd, 0x07, 0x00, 0x00, 0xd0, 0x07, 0x00, 0x00, 0xd1, 0x07, 0x00, 0x00, 0xd1, 0x07, 0x00, 0x00, 0xca, 0x07, 0x00, 0x00, 0xcd, 0x07, 0x00, 0x00, 0x1f, 0x02, + 0x00, 0x00, 0x1e, 0x02, 0x00, 0x00, 0xcc, 0x07, 0x00, 0x00, 0xcc, 0x07, 0x00, 0x00, 0xb5, 0x07, 0x00, 0x00, 0x1f, 0x02, 0x00, 0x00, 0x1d, 0x02, 0x00, 0x00, + 0xb2, 0x07, 0x00, 0x00, 0xcf, 0x07, 0x00, 0x00, 0xcf, 0x07, 0x00, 0x00, 0x1e, 0x02, 0x00, 0x00, 0x1d, 0x02, 0x00, 0x00, 0xcf, 0x07, 0x00, 0x00, 0xb1, 0x07, + 0x00, 0x00, 0xd0, 0x07, 0x00, 0x00, 0xd0, 0x07, 0x00, 0x00, 0xcd, 0x07, 0x00, 0x00, 0xcf, 0x07, 0x00, 0x00, 0xce, 0x07, 0x00, 0x00, 0xcb, 0x07, 0x00, 0x00, + 0xc4, 0x07, 0x00, 0x00, 0xc4, 0x07, 0x00, 0x00, 0xd2, 0x07, 0x00, 0x00, 0xce, 0x07, 0x00, 0x00, 0xca, 0x07, 0x00, 0x00, 0xd1, 0x07, 0x00, 0x00, 0xc9, 0x07, + 0x00, 0x00, 0xc9, 0x07, 0x00, 0x00, 0xc5, 0x07, 0x00, 0x00, 0xca, 0x07, 0x00, 0x00, 0xee, 0x01, 0x00, 0x00, 0x9b, 0x07, 0x00, 0x00, 0x9d, 0x07, 0x00, 0x00, + 0x9d, 0x07, 0x00, 0x00, 0x38, 0x07, 0x00, 0x00, 0xee, 0x01, 0x00, 0x00, 0xd3, 0x07, 0x00, 0x00, 0x9d, 0x07, 0x00, 0x00, 0x0e, 0x02, 0x00, 0x00, 0x0e, 0x02, + 0x00, 0x00, 0xd4, 0x07, 0x00, 0x00, 0xd3, 0x07, 0x00, 0x00, 0xd5, 0x07, 0x00, 0x00, 0xd6, 0x07, 0x00, 0x00, 0x92, 0x07, 0x00, 0x00, 0x92, 0x07, 0x00, 0x00, + 0x91, 0x07, 0x00, 0x00, 0xd5, 0x07, 0x00, 0x00, 0xd7, 0x07, 0x00, 0x00, 0x91, 0x07, 0x00, 0x00, 0x8d, 0x07, 0x00, 0x00, 0x8d, 0x07, 0x00, 0x00, 0x8f, 0x07, + 0x00, 0x00, 0xd7, 0x07, 0x00, 0x00, 0xd6, 0x07, 0x00, 0x00, 0xd5, 0x07, 0x00, 0x00, 0xd8, 0x07, 0x00, 0x00, 0xd8, 0x07, 0x00, 0x00, 0xd9, 0x07, 0x00, 0x00, + 0xd6, 0x07, 0x00, 0x00, 0xd6, 0x07, 0x00, 0x00, 0xda, 0x07, 0x00, 0x00, 0x93, 0x07, 0x00, 0x00, 0x93, 0x07, 0x00, 0x00, 0x92, 0x07, 0x00, 0x00, 0xd6, 0x07, + 0x00, 0x00, 0xdb, 0x07, 0x00, 0x00, 0xd5, 0x07, 0x00, 0x00, 0x91, 0x07, 0x00, 0x00, 0x91, 0x07, 0x00, 0x00, 0xd7, 0x07, 0x00, 0x00, 0xdb, 0x07, 0x00, 0x00, + 0xd5, 0x07, 0x00, 0x00, 0xdb, 0x07, 0x00, 0x00, 0xdc, 0x07, 0x00, 0x00, 0xdc, 0x07, 0x00, 0x00, 0xd8, 0x07, 0x00, 0x00, 0xd5, 0x07, 0x00, 0x00, 0xdd, 0x07, + 0x00, 0x00, 0xde, 0x07, 0x00, 0x00, 0xd9, 0x07, 0x00, 0x00, 0xd9, 0x07, 0x00, 0x00, 0xd8, 0x07, 0x00, 0x00, 0xdd, 0x07, 0x00, 0x00, 0xd9, 0x07, 0x00, 0x00, + 0x12, 0x02, 0x00, 0x00, 0xda, 0x07, 0x00, 0x00, 0xda, 0x07, 0x00, 0x00, 0xd6, 0x07, 0x00, 0x00, 0xd9, 0x07, 0x00, 0x00, 0xdf, 0x07, 0x00, 0x00, 0xe0, 0x07, + 0x00, 0x00, 0xde, 0x07, 0x00, 0x00, 0xde, 0x07, 0x00, 0x00, 0xdd, 0x07, 0x00, 0x00, 0xdf, 0x07, 0x00, 0x00, 0xde, 0x07, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, + 0x12, 0x02, 0x00, 0x00, 0x12, 0x02, 0x00, 0x00, 0xd9, 0x07, 0x00, 0x00, 0xde, 0x07, 0x00, 0x00, 0xe1, 0x07, 0x00, 0x00, 0xdd, 0x07, 0x00, 0x00, 0xd8, 0x07, + 0x00, 0x00, 0xd8, 0x07, 0x00, 0x00, 0xdc, 0x07, 0x00, 0x00, 0xe1, 0x07, 0x00, 0x00, 0x6c, 0x07, 0x00, 0x00, 0xe2, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, + 0xe0, 0x07, 0x00, 0x00, 0xdf, 0x07, 0x00, 0x00, 0x6c, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe3, 0x07, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x10, 0x02, + 0x00, 0x00, 0xde, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe4, 0x07, 0x00, 0x00, 0xdf, 0x07, 0x00, 0x00, 0xdd, 0x07, 0x00, 0x00, 0xdd, 0x07, 0x00, 0x00, + 0xe1, 0x07, 0x00, 0x00, 0xe4, 0x07, 0x00, 0x00, 0x66, 0x07, 0x00, 0x00, 0x6b, 0x07, 0x00, 0x00, 0xe2, 0x07, 0x00, 0x00, 0xe2, 0x07, 0x00, 0x00, 0x6c, 0x07, + 0x00, 0x00, 0x66, 0x07, 0x00, 0x00, 0xe2, 0x07, 0x00, 0x00, 0xe5, 0x07, 0x00, 0x00, 0xe3, 0x07, 0x00, 0x00, 0xe3, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, + 0xe2, 0x07, 0x00, 0x00, 0x6d, 0x07, 0x00, 0x00, 0x6c, 0x07, 0x00, 0x00, 0xdf, 0x07, 0x00, 0x00, 0xdf, 0x07, 0x00, 0x00, 0xe4, 0x07, 0x00, 0x00, 0x6d, 0x07, + 0x00, 0x00, 0x6b, 0x07, 0x00, 0x00, 0xe6, 0x07, 0x00, 0x00, 0xe5, 0x07, 0x00, 0x00, 0xe5, 0x07, 0x00, 0x00, 0xe2, 0x07, 0x00, 0x00, 0x6b, 0x07, 0x00, 0x00, + 0x69, 0x07, 0x00, 0x00, 0xe7, 0x07, 0x00, 0x00, 0x6a, 0x07, 0x00, 0x00, 0x6a, 0x07, 0x00, 0x00, 0x65, 0x07, 0x00, 0x00, 0x69, 0x07, 0x00, 0x00, 0x6a, 0x07, + 0x00, 0x00, 0xe8, 0x07, 0x00, 0x00, 0xe6, 0x07, 0x00, 0x00, 0xe6, 0x07, 0x00, 0x00, 0x6b, 0x07, 0x00, 0x00, 0x6a, 0x07, 0x00, 0x00, 0xe9, 0x07, 0x00, 0x00, + 0xea, 0x07, 0x00, 0x00, 0xe7, 0x07, 0x00, 0x00, 0xe7, 0x07, 0x00, 0x00, 0x69, 0x07, 0x00, 0x00, 0xe9, 0x07, 0x00, 0x00, 0xe7, 0x07, 0x00, 0x00, 0xeb, 0x07, + 0x00, 0x00, 0xe8, 0x07, 0x00, 0x00, 0xe8, 0x07, 0x00, 0x00, 0x6a, 0x07, 0x00, 0x00, 0xe7, 0x07, 0x00, 0x00, 0x49, 0x07, 0x00, 0x00, 0x48, 0x07, 0x00, 0x00, + 0xea, 0x07, 0x00, 0x00, 0xea, 0x07, 0x00, 0x00, 0xe9, 0x07, 0x00, 0x00, 0x49, 0x07, 0x00, 0x00, 0xea, 0x07, 0x00, 0x00, 0xec, 0x07, 0x00, 0x00, 0xeb, 0x07, + 0x00, 0x00, 0xeb, 0x07, 0x00, 0x00, 0xe7, 0x07, 0x00, 0x00, 0xea, 0x07, 0x00, 0x00, 0xe9, 0x07, 0x00, 0x00, 0x69, 0x07, 0x00, 0x00, 0x68, 0x07, 0x00, 0x00, + 0x68, 0x07, 0x00, 0x00, 0xed, 0x07, 0x00, 0x00, 0xe9, 0x07, 0x00, 0x00, 0x48, 0x07, 0x00, 0x00, 0x51, 0x07, 0x00, 0x00, 0xec, 0x07, 0x00, 0x00, 0xec, 0x07, + 0x00, 0x00, 0xea, 0x07, 0x00, 0x00, 0x48, 0x07, 0x00, 0x00, 0x49, 0x07, 0x00, 0x00, 0xe9, 0x07, 0x00, 0x00, 0xed, 0x07, 0x00, 0x00, 0xed, 0x07, 0x00, 0x00, + 0x4a, 0x07, 0x00, 0x00, 0x49, 0x07, 0x00, 0x00, 0x90, 0x07, 0x00, 0x00, 0x86, 0x07, 0x00, 0x00, 0x24, 0x02, 0x00, 0x00, 0x24, 0x02, 0x00, 0x00, 0x23, 0x02, + 0x00, 0x00, 0x90, 0x07, 0x00, 0x00, 0x93, 0x07, 0x00, 0x00, 0xda, 0x07, 0x00, 0x00, 0xee, 0x07, 0x00, 0x00, 0xee, 0x07, 0x00, 0x00, 0x97, 0x07, 0x00, 0x00, + 0x93, 0x07, 0x00, 0x00, 0x12, 0x02, 0x00, 0x00, 0x11, 0x02, 0x00, 0x00, 0xee, 0x07, 0x00, 0x00, 0xee, 0x07, 0x00, 0x00, 0xda, 0x07, 0x00, 0x00, 0x12, 0x02, + 0x00, 0x00, 0xe3, 0x07, 0x00, 0x00, 0xef, 0x07, 0x00, 0x00, 0x11, 0x02, 0x00, 0x00, 0x11, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0xe3, 0x07, 0x00, 0x00, + 0xe5, 0x07, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xef, 0x07, 0x00, 0x00, 0xef, 0x07, 0x00, 0x00, 0xe3, 0x07, 0x00, 0x00, 0xe5, 0x07, 0x00, 0x00, 0xe6, 0x07, + 0x00, 0x00, 0xf1, 0x07, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xe5, 0x07, 0x00, 0x00, 0xe6, 0x07, 0x00, 0x00, 0xe8, 0x07, 0x00, 0x00, + 0xf2, 0x07, 0x00, 0x00, 0xf1, 0x07, 0x00, 0x00, 0xf1, 0x07, 0x00, 0x00, 0xe6, 0x07, 0x00, 0x00, 0xe8, 0x07, 0x00, 0x00, 0xeb, 0x07, 0x00, 0x00, 0xf3, 0x07, + 0x00, 0x00, 0xf2, 0x07, 0x00, 0x00, 0xf2, 0x07, 0x00, 0x00, 0xe8, 0x07, 0x00, 0x00, 0xeb, 0x07, 0x00, 0x00, 0xec, 0x07, 0x00, 0x00, 0xf4, 0x07, 0x00, 0x00, + 0xf3, 0x07, 0x00, 0x00, 0xf3, 0x07, 0x00, 0x00, 0xeb, 0x07, 0x00, 0x00, 0xec, 0x07, 0x00, 0x00, 0x51, 0x07, 0x00, 0x00, 0x4c, 0x07, 0x00, 0x00, 0xf4, 0x07, + 0x00, 0x00, 0xf4, 0x07, 0x00, 0x00, 0xec, 0x07, 0x00, 0x00, 0x51, 0x07, 0x00, 0x00, 0xee, 0x07, 0x00, 0x00, 0xba, 0x07, 0x00, 0x00, 0x9a, 0x07, 0x00, 0x00, + 0x9a, 0x07, 0x00, 0x00, 0x97, 0x07, 0x00, 0x00, 0xee, 0x07, 0x00, 0x00, 0x11, 0x02, 0x00, 0x00, 0xbd, 0x07, 0x00, 0x00, 0xba, 0x07, 0x00, 0x00, 0xba, 0x07, + 0x00, 0x00, 0xee, 0x07, 0x00, 0x00, 0x11, 0x02, 0x00, 0x00, 0xef, 0x07, 0x00, 0x00, 0xc1, 0x07, 0x00, 0x00, 0xbd, 0x07, 0x00, 0x00, 0xbd, 0x07, 0x00, 0x00, + 0x11, 0x02, 0x00, 0x00, 0xef, 0x07, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xf5, 0x07, 0x00, 0x00, 0xc1, 0x07, 0x00, 0x00, 0xc1, 0x07, 0x00, 0x00, 0xef, 0x07, + 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0xf1, 0x07, 0x00, 0x00, 0xf6, 0x07, 0x00, 0x00, 0xf5, 0x07, 0x00, 0x00, 0xf5, 0x07, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, + 0xf1, 0x07, 0x00, 0x00, 0xf2, 0x07, 0x00, 0x00, 0xf7, 0x07, 0x00, 0x00, 0xf6, 0x07, 0x00, 0x00, 0xf6, 0x07, 0x00, 0x00, 0xf1, 0x07, 0x00, 0x00, 0xf2, 0x07, + 0x00, 0x00, 0xf3, 0x07, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0xf7, 0x07, 0x00, 0x00, 0xf7, 0x07, 0x00, 0x00, 0xf2, 0x07, 0x00, 0x00, 0xf3, 0x07, 0x00, 0x00, + 0xf4, 0x07, 0x00, 0x00, 0xf9, 0x07, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0xf3, 0x07, 0x00, 0x00, 0xf4, 0x07, 0x00, 0x00, 0x4c, 0x07, + 0x00, 0x00, 0x51, 0x07, 0x00, 0x00, 0xe7, 0x01, 0x00, 0x00, 0xe7, 0x01, 0x00, 0x00, 0xe6, 0x01, 0x00, 0x00, 0x4c, 0x07, 0x00, 0x00, 0x4c, 0x07, 0x00, 0x00, + 0x4b, 0x07, 0x00, 0x00, 0xf9, 0x07, 0x00, 0x00, 0xf9, 0x07, 0x00, 0x00, 0xf4, 0x07, 0x00, 0x00, 0x4c, 0x07, 0x00, 0x00, 0xc1, 0x07, 0x00, 0x00, 0xf5, 0x07, + 0x00, 0x00, 0xc3, 0x07, 0x00, 0x00, 0xc3, 0x07, 0x00, 0x00, 0xbe, 0x07, 0x00, 0x00, 0xc1, 0x07, 0x00, 0x00, 0xf5, 0x07, 0x00, 0x00, 0xf6, 0x07, 0x00, 0x00, + 0x14, 0x02, 0x00, 0x00, 0x14, 0x02, 0x00, 0x00, 0xc3, 0x07, 0x00, 0x00, 0xf5, 0x07, 0x00, 0x00, 0xf6, 0x07, 0x00, 0x00, 0xf7, 0x07, 0x00, 0x00, 0x15, 0x02, + 0x00, 0x00, 0x15, 0x02, 0x00, 0x00, 0x14, 0x02, 0x00, 0x00, 0xf6, 0x07, 0x00, 0x00, 0xf7, 0x07, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x16, 0x02, 0x00, 0x00, + 0x16, 0x02, 0x00, 0x00, 0x15, 0x02, 0x00, 0x00, 0xf7, 0x07, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0xf9, 0x07, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0x18, 0x02, + 0x00, 0x00, 0x16, 0x02, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0xf9, 0x07, 0x00, 0x00, 0x4b, 0x07, 0x00, 0x00, 0x19, 0x02, 0x00, 0x00, 0x19, 0x02, 0x00, 0x00, + 0x18, 0x02, 0x00, 0x00, 0xf9, 0x07, 0x00, 0x00, 0x13, 0x02, 0x00, 0x00, 0xc2, 0x07, 0x00, 0x00, 0xc3, 0x07, 0x00, 0x00, 0xc3, 0x07, 0x00, 0x00, 0x14, 0x02, + 0x00, 0x00, 0x13, 0x02, 0x00, 0x00, 0x0d, 0x02, 0x00, 0x00, 0x0c, 0x02, 0x00, 0x00, 0xbf, 0x07, 0x00, 0x00, 0xbf, 0x07, 0x00, 0x00, 0xc2, 0x07, 0x00, 0x00, + 0x0d, 0x02, 0x00, 0x00, 0x7f, 0x07, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0xd4, 0x07, 0x00, 0x00, 0xd4, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x7f, 0x07, + 0x00, 0x00, 0x1a, 0x02, 0x00, 0x00, 0xd3, 0x07, 0x00, 0x00, 0xd4, 0x07, 0x00, 0x00, 0xd4, 0x07, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x1a, 0x02, 0x00, 0x00, + 0xd4, 0x07, 0x00, 0x00, 0x0e, 0x02, 0x00, 0x00, 0x0f, 0x02, 0x00, 0x00, 0x0f, 0x02, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xd4, 0x07, 0x00, 0x00, 0xd3, 0x07, + 0x00, 0x00, 0x1a, 0x02, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0xe3, 0x06, 0x00, 0x00, 0xd3, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, + 0x0f, 0x02, 0x00, 0x00, 0x5d, 0x07, 0x00, 0x00, 0x5d, 0x07, 0x00, 0x00, 0x7d, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x38, 0x07, 0x00, 0x00, 0x9d, 0x07, + 0x00, 0x00, 0xd3, 0x07, 0x00, 0x00, 0xd3, 0x07, 0x00, 0x00, 0xe3, 0x06, 0x00, 0x00, 0x38, 0x07, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0xce, 0x07, 0x00, 0x00, + 0xd2, 0x07, 0x00, 0x00, 0xd2, 0x07, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0x9e, 0x07, 0x00, 0x00, 0xb5, 0x07, 0x00, 0x00, 0xce, 0x07, + 0x00, 0x00, 0xce, 0x07, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0x9e, 0x07, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xd2, 0x07, 0x00, 0x00, 0x1b, 0x02, 0x00, 0x00, + 0x1b, 0x02, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xd2, 0x07, 0x00, 0x00, 0xc4, 0x07, 0x00, 0x00, 0x71, 0x07, 0x00, 0x00, 0x71, 0x07, + 0x00, 0x00, 0x1b, 0x02, 0x00, 0x00, 0xd2, 0x07, 0x00, 0x00, 0xb4, 0x07, 0x00, 0x00, 0x2e, 0x02, 0x00, 0x00, 0xfa, 0x07, 0x00, 0x00, 0xfa, 0x07, 0x00, 0x00, + 0x1f, 0x02, 0x00, 0x00, 0xb4, 0x07, 0x00, 0x00, 0x1d, 0x02, 0x00, 0x00, 0xfb, 0x07, 0x00, 0x00, 0xb3, 0x07, 0x00, 0x00, 0xb3, 0x07, 0x00, 0x00, 0xb2, 0x07, + 0x00, 0x00, 0x1d, 0x02, 0x00, 0x00, 0xcf, 0x07, 0x00, 0x00, 0xb2, 0x07, 0x00, 0x00, 0xb0, 0x07, 0x00, 0x00, 0xb0, 0x07, 0x00, 0x00, 0xb1, 0x07, 0x00, 0x00, + 0xcf, 0x07, 0x00, 0x00, 0xb8, 0x07, 0x00, 0x00, 0xc8, 0x07, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0x74, 0x07, 0x00, 0x00, 0xb8, 0x07, + 0x00, 0x00, 0xd1, 0x07, 0x00, 0x00, 0xfd, 0x07, 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0xc9, 0x07, 0x00, 0x00, 0xd1, 0x07, 0x00, 0x00, + 0xd0, 0x07, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xfd, 0x07, 0x00, 0x00, 0xfd, 0x07, 0x00, 0x00, 0xd1, 0x07, 0x00, 0x00, 0xd0, 0x07, 0x00, 0x00, 0xb1, 0x07, + 0x00, 0x00, 0xae, 0x07, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xd0, 0x07, 0x00, 0x00, 0xb1, 0x07, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x75, 0x07, 0x00, 0x00, 0x75, 0x07, 0x00, 0x00, 0x74, 0x07, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0x73, 0x07, 0x00, 0x00, 0x75, 0x07, + 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x22, 0x02, 0x00, 0x00, 0x73, 0x07, 0x00, 0x00, 0xc8, 0x07, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xc8, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x20, 0x02, + 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x75, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0xc7, 0x07, 0x00, 0x00, 0xc6, 0x07, 0x00, 0x00, + 0xc6, 0x07, 0x00, 0x00, 0xc9, 0x07, 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0xc7, 0x07, 0x00, 0x00, 0x03, 0x08, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x01, 0x08, + 0x00, 0x00, 0xc8, 0x07, 0x00, 0x00, 0xc7, 0x07, 0x00, 0x00, 0xfd, 0x07, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x05, 0x08, 0x00, 0x00, 0x05, 0x08, 0x00, 0x00, + 0xfe, 0x07, 0x00, 0x00, 0xfd, 0x07, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0xfd, 0x07, + 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xae, 0x07, 0x00, 0x00, 0xab, 0x07, 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, + 0xae, 0x07, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x07, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x08, + 0x00, 0x00, 0x05, 0x08, 0x00, 0x00, 0x03, 0x08, 0x00, 0x00, 0xc7, 0x07, 0x00, 0x00, 0xc7, 0x07, 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0x05, 0x08, 0x00, 0x00, + 0x03, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x07, 0x08, 0x00, 0x00, 0x07, 0x08, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x03, 0x08, 0x00, 0x00, 0x04, 0x08, + 0x00, 0x00, 0x09, 0x08, 0x00, 0x00, 0x0a, 0x08, 0x00, 0x00, 0x0a, 0x08, 0x00, 0x00, 0x05, 0x08, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, + 0x0b, 0x08, 0x00, 0x00, 0x09, 0x08, 0x00, 0x00, 0x09, 0x08, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0xab, 0x07, 0x00, 0x00, 0xaa, 0x07, + 0x00, 0x00, 0x0b, 0x08, 0x00, 0x00, 0x0b, 0x08, 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0xab, 0x07, 0x00, 0x00, 0x0a, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, + 0x03, 0x08, 0x00, 0x00, 0x03, 0x08, 0x00, 0x00, 0x05, 0x08, 0x00, 0x00, 0x0a, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x0c, 0x08, 0x00, 0x00, 0x0d, 0x08, + 0x00, 0x00, 0x0d, 0x08, 0x00, 0x00, 0x07, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x0e, 0x08, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, + 0x21, 0x02, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x07, 0x08, 0x00, 0x00, 0x0d, 0x08, 0x00, 0x00, 0x0d, 0x08, + 0x00, 0x00, 0x0e, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x09, 0x08, 0x00, 0x00, 0x0f, 0x08, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, + 0x0a, 0x08, 0x00, 0x00, 0x09, 0x08, 0x00, 0x00, 0x0b, 0x08, 0x00, 0x00, 0x11, 0x08, 0x00, 0x00, 0x0f, 0x08, 0x00, 0x00, 0x0f, 0x08, 0x00, 0x00, 0x09, 0x08, + 0x00, 0x00, 0x0b, 0x08, 0x00, 0x00, 0xaa, 0x07, 0x00, 0x00, 0xa3, 0x07, 0x00, 0x00, 0x11, 0x08, 0x00, 0x00, 0x11, 0x08, 0x00, 0x00, 0x0b, 0x08, 0x00, 0x00, + 0xaa, 0x07, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, 0x12, 0x08, 0x00, 0x00, 0x54, 0x07, 0x00, 0x00, 0x54, 0x07, 0x00, 0x00, 0x22, 0x02, 0x00, 0x00, 0x21, 0x02, + 0x00, 0x00, 0x54, 0x07, 0x00, 0x00, 0x23, 0x02, 0x00, 0x00, 0xef, 0x01, 0x00, 0x00, 0xef, 0x01, 0x00, 0x00, 0xf1, 0x01, 0x00, 0x00, 0x54, 0x07, 0x00, 0x00, + 0x0e, 0x08, 0x00, 0x00, 0x13, 0x08, 0x00, 0x00, 0x12, 0x08, 0x00, 0x00, 0x12, 0x08, 0x00, 0x00, 0x21, 0x02, 0x00, 0x00, 0x0e, 0x08, 0x00, 0x00, 0x0e, 0x08, + 0x00, 0x00, 0x0d, 0x08, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x13, 0x08, 0x00, 0x00, 0x0e, 0x08, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, + 0x0c, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x0a, 0x08, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x0c, 0x08, 0x00, 0x00, 0x15, 0x08, + 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x0d, 0x08, 0x00, 0x00, 0x0c, 0x08, 0x00, 0x00, 0x0f, 0x08, 0x00, 0x00, 0x16, 0x08, 0x00, 0x00, + 0x17, 0x08, 0x00, 0x00, 0x17, 0x08, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x0f, 0x08, 0x00, 0x00, 0x11, 0x08, 0x00, 0x00, 0x18, 0x08, 0x00, 0x00, 0x16, 0x08, + 0x00, 0x00, 0x16, 0x08, 0x00, 0x00, 0x0f, 0x08, 0x00, 0x00, 0x11, 0x08, 0x00, 0x00, 0xa3, 0x07, 0x00, 0x00, 0xa2, 0x07, 0x00, 0x00, 0x18, 0x08, 0x00, 0x00, + 0x18, 0x08, 0x00, 0x00, 0x11, 0x08, 0x00, 0x00, 0xa3, 0x07, 0x00, 0x00, 0x12, 0x08, 0x00, 0x00, 0x90, 0x07, 0x00, 0x00, 0x23, 0x02, 0x00, 0x00, 0x23, 0x02, + 0x00, 0x00, 0x54, 0x07, 0x00, 0x00, 0x12, 0x08, 0x00, 0x00, 0x13, 0x08, 0x00, 0x00, 0x8f, 0x07, 0x00, 0x00, 0x90, 0x07, 0x00, 0x00, 0x90, 0x07, 0x00, 0x00, + 0x12, 0x08, 0x00, 0x00, 0x13, 0x08, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0xd7, 0x07, 0x00, 0x00, 0x8f, 0x07, 0x00, 0x00, 0x8f, 0x07, 0x00, 0x00, 0x13, 0x08, + 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x17, 0x08, 0x00, 0x00, 0x15, 0x08, 0x00, 0x00, 0x0c, 0x08, 0x00, 0x00, 0x0c, 0x08, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, + 0x17, 0x08, 0x00, 0x00, 0x15, 0x08, 0x00, 0x00, 0xdb, 0x07, 0x00, 0x00, 0xd7, 0x07, 0x00, 0x00, 0xd7, 0x07, 0x00, 0x00, 0x14, 0x08, 0x00, 0x00, 0x15, 0x08, + 0x00, 0x00, 0x16, 0x08, 0x00, 0x00, 0xe1, 0x07, 0x00, 0x00, 0xdc, 0x07, 0x00, 0x00, 0xdc, 0x07, 0x00, 0x00, 0x17, 0x08, 0x00, 0x00, 0x16, 0x08, 0x00, 0x00, + 0x18, 0x08, 0x00, 0x00, 0xe4, 0x07, 0x00, 0x00, 0xe1, 0x07, 0x00, 0x00, 0xe1, 0x07, 0x00, 0x00, 0x16, 0x08, 0x00, 0x00, 0x18, 0x08, 0x00, 0x00, 0xa2, 0x07, + 0x00, 0x00, 0x6d, 0x07, 0x00, 0x00, 0xe4, 0x07, 0x00, 0x00, 0xe4, 0x07, 0x00, 0x00, 0x18, 0x08, 0x00, 0x00, 0xa2, 0x07, 0x00, 0x00, 0xdc, 0x07, 0x00, 0x00, + 0xdb, 0x07, 0x00, 0x00, 0x15, 0x08, 0x00, 0x00, 0x15, 0x08, 0x00, 0x00, 0x17, 0x08, 0x00, 0x00, 0xdc, 0x07, 0x00, 0x00, 0x47, 0x07, 0x00, 0x00, 0x19, 0x08, + 0x00, 0x00, 0x25, 0x02, 0x00, 0x00, 0x25, 0x02, 0x00, 0x00, 0xeb, 0x01, 0x00, 0x00, 0x47, 0x07, 0x00, 0x00, 0x47, 0x07, 0x00, 0x00, 0x50, 0x07, 0x00, 0x00, + 0x28, 0x02, 0x00, 0x00, 0x28, 0x02, 0x00, 0x00, 0x19, 0x08, 0x00, 0x00, 0x47, 0x07, 0x00, 0x00, 0x19, 0x08, 0x00, 0x00, 0x1a, 0x08, 0x00, 0x00, 0x1b, 0x08, + 0x00, 0x00, 0x1b, 0x08, 0x00, 0x00, 0x25, 0x02, 0x00, 0x00, 0x19, 0x08, 0x00, 0x00, 0x4f, 0x07, 0x00, 0x00, 0x2b, 0x02, 0x00, 0x00, 0x28, 0x02, 0x00, 0x00, + 0x28, 0x02, 0x00, 0x00, 0x50, 0x07, 0x00, 0x00, 0x4f, 0x07, 0x00, 0x00, 0x28, 0x02, 0x00, 0x00, 0x27, 0x02, 0x00, 0x00, 0x1a, 0x08, 0x00, 0x00, 0x1a, 0x08, + 0x00, 0x00, 0x19, 0x08, 0x00, 0x00, 0x28, 0x02, 0x00, 0x00, 0x4e, 0x07, 0x00, 0x00, 0x1c, 0x08, 0x00, 0x00, 0x2b, 0x02, 0x00, 0x00, 0x2b, 0x02, 0x00, 0x00, + 0x4f, 0x07, 0x00, 0x00, 0x4e, 0x07, 0x00, 0x00, 0x2b, 0x02, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x26, 0x02, 0x00, 0x00, 0x26, 0x02, 0x00, 0x00, 0x28, 0x02, + 0x00, 0x00, 0x2b, 0x02, 0x00, 0x00, 0x4d, 0x07, 0x00, 0x00, 0x1d, 0x08, 0x00, 0x00, 0x1c, 0x08, 0x00, 0x00, 0x1c, 0x08, 0x00, 0x00, 0x4e, 0x07, 0x00, 0x00, + 0x4d, 0x07, 0x00, 0x00, 0x1c, 0x08, 0x00, 0x00, 0xa6, 0x07, 0x00, 0x00, 0x29, 0x02, 0x00, 0x00, 0x29, 0x02, 0x00, 0x00, 0x2b, 0x02, 0x00, 0x00, 0x1c, 0x08, + 0x00, 0x00, 0x4d, 0x07, 0x00, 0x00, 0x4a, 0x07, 0x00, 0x00, 0xed, 0x07, 0x00, 0x00, 0xed, 0x07, 0x00, 0x00, 0x1d, 0x08, 0x00, 0x00, 0x4d, 0x07, 0x00, 0x00, + 0x1d, 0x08, 0x00, 0x00, 0xa7, 0x07, 0x00, 0x00, 0xa6, 0x07, 0x00, 0x00, 0xa6, 0x07, 0x00, 0x00, 0x1c, 0x08, 0x00, 0x00, 0x1d, 0x08, 0x00, 0x00, 0xed, 0x07, + 0x00, 0x00, 0x68, 0x07, 0x00, 0x00, 0xa7, 0x07, 0x00, 0x00, 0xa7, 0x07, 0x00, 0x00, 0x1d, 0x08, 0x00, 0x00, 0xed, 0x07, 0x00, 0x00, 0x1a, 0x08, 0x00, 0x00, + 0xb3, 0x07, 0x00, 0x00, 0xfb, 0x07, 0x00, 0x00, 0xfb, 0x07, 0x00, 0x00, 0x1b, 0x08, 0x00, 0x00, 0x1a, 0x08, 0x00, 0x00, 0x25, 0x02, 0x00, 0x00, 0x1b, 0x08, + 0x00, 0x00, 0x1e, 0x08, 0x00, 0x00, 0x1e, 0x08, 0x00, 0x00, 0xe4, 0x01, 0x00, 0x00, 0x25, 0x02, 0x00, 0x00, 0x27, 0x02, 0x00, 0x00, 0xaf, 0x07, 0x00, 0x00, + 0xb3, 0x07, 0x00, 0x00, 0xb3, 0x07, 0x00, 0x00, 0x1a, 0x08, 0x00, 0x00, 0x27, 0x02, 0x00, 0x00, 0xfa, 0x07, 0x00, 0x00, 0x1e, 0x08, 0x00, 0x00, 0x1b, 0x08, + 0x00, 0x00, 0x1b, 0x08, 0x00, 0x00, 0xfb, 0x07, 0x00, 0x00, 0xfa, 0x07, 0x00, 0x00, 0xfb, 0x07, 0x00, 0x00, 0x1d, 0x02, 0x00, 0x00, 0x1f, 0x02, 0x00, 0x00, + 0x1f, 0x02, 0x00, 0x00, 0xfa, 0x07, 0x00, 0x00, 0xfb, 0x07, 0x00, 0x00, 0x1e, 0x08, 0x00, 0x00, 0xfa, 0x07, 0x00, 0x00, 0x2e, 0x02, 0x00, 0x00, 0x2e, 0x02, + 0x00, 0x00, 0x2d, 0x02, 0x00, 0x00, 0x1e, 0x08, 0x00, 0x00, 0x1e, 0x08, 0x00, 0x00, 0x2d, 0x02, 0x00, 0x00, 0x2c, 0x02, 0x00, 0x00, 0x2c, 0x02, 0x00, 0x00, + 0xe4, 0x01, 0x00, 0x00, 0x1e, 0x08, 0x00, 0x00, 0x13, 0x02, 0x00, 0x00, 0x2f, 0x02, 0x00, 0x00, 0x0d, 0x02, 0x00, 0x00, 0x0d, 0x02, 0x00, 0x00, 0xc2, 0x07, + 0x00, 0x00, 0x13, 0x02, 0x00, 0x00, 0x2f, 0x02, 0x00, 0x00, 0x30, 0x02, 0x00, 0x00, 0x64, 0x05, 0x00, 0x00, 0x64, 0x05, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, + 0x2f, 0x02, 0x00, 0x00, 0xe9, 0x01, 0x00, 0x00, 0x64, 0x05, 0x00, 0x00, 0x30, 0x02, 0x00, 0x00, 0x30, 0x02, 0x00, 0x00, 0x17, 0x02, 0x00, 0x00, 0xe9, 0x01, + 0x00, 0x00, 0xad, 0x06, 0x00, 0x00, 0xba, 0x06, 0x00, 0x00, 0x52, 0x04, 0x00, 0x00, 0x52, 0x04, 0x00, 0x00, 0x37, 0x04, 0x00, 0x00, 0xad, 0x06, 0x00, 0x00, + 0x7a, 0x04, 0x00, 0x00, 0x7c, 0x04, 0x00, 0x00, 0xc6, 0x06, 0x00, 0x00, 0xc6, 0x06, 0x00, 0x00, 0xa7, 0x05, 0x00, 0x00, 0x7a, 0x04, 0x00, 0x00, 0x1f, 0x08, + 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x21, 0x08, 0x00, 0x00, 0x21, 0x08, 0x00, 0x00, 0x22, 0x08, 0x00, 0x00, 0x1f, 0x08, 0x00, 0x00, 0x33, 0x02, 0x00, 0x00, + 0x32, 0x02, 0x00, 0x00, 0x23, 0x08, 0x00, 0x00, 0x23, 0x08, 0x00, 0x00, 0x13, 0x03, 0x00, 0x00, 0x33, 0x02, 0x00, 0x00, 0x33, 0x02, 0x00, 0x00, 0x24, 0x08, + 0x00, 0x00, 0x38, 0x02, 0x00, 0x00, 0x38, 0x02, 0x00, 0x00, 0x31, 0x02, 0x00, 0x00, 0x33, 0x02, 0x00, 0x00, 0x31, 0x02, 0x00, 0x00, 0x37, 0x02, 0x00, 0x00, + 0x25, 0x08, 0x00, 0x00, 0x25, 0x08, 0x00, 0x00, 0x36, 0x02, 0x00, 0x00, 0x31, 0x02, 0x00, 0x00, 0x37, 0x02, 0x00, 0x00, 0x38, 0x02, 0x00, 0x00, 0x26, 0x08, + 0x00, 0x00, 0x26, 0x08, 0x00, 0x00, 0x27, 0x08, 0x00, 0x00, 0x37, 0x02, 0x00, 0x00, 0x24, 0x08, 0x00, 0x00, 0x33, 0x02, 0x00, 0x00, 0x13, 0x03, 0x00, 0x00, + 0x13, 0x03, 0x00, 0x00, 0x14, 0x03, 0x00, 0x00, 0x24, 0x08, 0x00, 0x00, 0x38, 0x02, 0x00, 0x00, 0x24, 0x08, 0x00, 0x00, 0x28, 0x08, 0x00, 0x00, 0x28, 0x08, + 0x00, 0x00, 0x26, 0x08, 0x00, 0x00, 0x38, 0x02, 0x00, 0x00, 0xb7, 0x04, 0x00, 0x00, 0x39, 0x02, 0x00, 0x00, 0x3b, 0x02, 0x00, 0x00, 0x3b, 0x02, 0x00, 0x00, + 0xb4, 0x04, 0x00, 0x00, 0xb7, 0x04, 0x00, 0x00, 0x29, 0x08, 0x00, 0x00, 0x39, 0x02, 0x00, 0x00, 0xb7, 0x04, 0x00, 0x00, 0xb7, 0x04, 0x00, 0x00, 0xbd, 0x04, + 0x00, 0x00, 0x29, 0x08, 0x00, 0x00, 0xb4, 0x04, 0x00, 0x00, 0x3b, 0x02, 0x00, 0x00, 0x2a, 0x08, 0x00, 0x00, 0x2a, 0x08, 0x00, 0x00, 0xcc, 0x04, 0x00, 0x00, + 0xb4, 0x04, 0x00, 0x00, 0xbb, 0x04, 0x00, 0x00, 0xc3, 0x06, 0x00, 0x00, 0xa7, 0x06, 0x00, 0x00, 0xa7, 0x06, 0x00, 0x00, 0xb8, 0x04, 0x00, 0x00, 0xbb, 0x04, + 0x00, 0x00, 0xc3, 0x06, 0x00, 0x00, 0xbb, 0x04, 0x00, 0x00, 0xb8, 0x02, 0x00, 0x00, 0xb8, 0x02, 0x00, 0x00, 0xb9, 0x02, 0x00, 0x00, 0xc3, 0x06, 0x00, 0x00, + 0xa7, 0x06, 0x00, 0x00, 0x29, 0x08, 0x00, 0x00, 0xbd, 0x04, 0x00, 0x00, 0xbd, 0x04, 0x00, 0x00, 0xb8, 0x04, 0x00, 0x00, 0xa7, 0x06, 0x00, 0x00, 0xeb, 0x02, + 0x00, 0x00, 0x2b, 0x08, 0x00, 0x00, 0x3a, 0x02, 0x00, 0x00, 0x3a, 0x02, 0x00, 0x00, 0x39, 0x02, 0x00, 0x00, 0xeb, 0x02, 0x00, 0x00, 0x3b, 0x02, 0x00, 0x00, + 0x3a, 0x02, 0x00, 0x00, 0xb4, 0x02, 0x00, 0x00, 0xb4, 0x02, 0x00, 0x00, 0x2a, 0x08, 0x00, 0x00, 0x3b, 0x02, 0x00, 0x00, 0xb1, 0x02, 0x00, 0x00, 0xeb, 0x02, + 0x00, 0x00, 0x39, 0x02, 0x00, 0x00, 0x39, 0x02, 0x00, 0x00, 0x29, 0x08, 0x00, 0x00, 0xb1, 0x02, 0x00, 0x00, 0x2c, 0x08, 0x00, 0x00, 0x3d, 0x02, 0x00, 0x00, + 0x3c, 0x02, 0x00, 0x00, 0x3c, 0x02, 0x00, 0x00, 0x2d, 0x08, 0x00, 0x00, 0x2c, 0x08, 0x00, 0x00, 0x3d, 0x02, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x00, 0xe9, 0x02, + 0x00, 0x00, 0xe9, 0x02, 0x00, 0x00, 0x3e, 0x02, 0x00, 0x00, 0x3d, 0x02, 0x00, 0x00, 0x41, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x49, 0x02, 0x00, 0x00, + 0x49, 0x02, 0x00, 0x00, 0x2f, 0x08, 0x00, 0x00, 0x41, 0x02, 0x00, 0x00, 0x42, 0x02, 0x00, 0x00, 0x41, 0x02, 0x00, 0x00, 0x30, 0x08, 0x00, 0x00, 0x30, 0x08, + 0x00, 0x00, 0x31, 0x08, 0x00, 0x00, 0x42, 0x02, 0x00, 0x00, 0x47, 0x02, 0x00, 0x00, 0x41, 0x02, 0x00, 0x00, 0x2f, 0x08, 0x00, 0x00, 0x2f, 0x08, 0x00, 0x00, + 0x46, 0x02, 0x00, 0x00, 0x47, 0x02, 0x00, 0x00, 0x41, 0x02, 0x00, 0x00, 0x47, 0x02, 0x00, 0x00, 0x6c, 0x02, 0x00, 0x00, 0x6c, 0x02, 0x00, 0x00, 0x30, 0x08, + 0x00, 0x00, 0x41, 0x02, 0x00, 0x00, 0x32, 0x08, 0x00, 0x00, 0x46, 0x02, 0x00, 0x00, 0x2f, 0x08, 0x00, 0x00, 0x2f, 0x08, 0x00, 0x00, 0x52, 0x02, 0x00, 0x00, + 0x32, 0x08, 0x00, 0x00, 0x49, 0x02, 0x00, 0x00, 0x33, 0x08, 0x00, 0x00, 0x52, 0x02, 0x00, 0x00, 0x52, 0x02, 0x00, 0x00, 0x2f, 0x08, 0x00, 0x00, 0x49, 0x02, + 0x00, 0x00, 0x4c, 0x02, 0x00, 0x00, 0x4b, 0x02, 0x00, 0x00, 0x34, 0x08, 0x00, 0x00, 0x34, 0x08, 0x00, 0x00, 0x43, 0x02, 0x00, 0x00, 0x4c, 0x02, 0x00, 0x00, + 0x4b, 0x02, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x35, 0x08, 0x00, 0x00, 0x35, 0x08, 0x00, 0x00, 0x34, 0x08, 0x00, 0x00, 0x4b, 0x02, 0x00, 0x00, 0x43, 0x02, + 0x00, 0x00, 0x34, 0x08, 0x00, 0x00, 0x4a, 0x02, 0x00, 0x00, 0x4a, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x43, 0x02, 0x00, 0x00, 0x43, 0x02, 0x00, 0x00, + 0x42, 0x02, 0x00, 0x00, 0x31, 0x08, 0x00, 0x00, 0x31, 0x08, 0x00, 0x00, 0x4c, 0x02, 0x00, 0x00, 0x43, 0x02, 0x00, 0x00, 0x4d, 0x02, 0x00, 0x00, 0xef, 0x02, + 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0x4b, 0x02, 0x00, 0x00, 0x4d, 0x02, 0x00, 0x00, 0x35, 0x08, 0x00, 0x00, 0x18, 0x03, 0x00, 0x00, + 0x17, 0x03, 0x00, 0x00, 0x17, 0x03, 0x00, 0x00, 0x28, 0x03, 0x00, 0x00, 0x35, 0x08, 0x00, 0x00, 0x4a, 0x02, 0x00, 0x00, 0x34, 0x08, 0x00, 0x00, 0x35, 0x08, + 0x00, 0x00, 0x35, 0x08, 0x00, 0x00, 0x36, 0x08, 0x00, 0x00, 0x4a, 0x02, 0x00, 0x00, 0x4f, 0x02, 0x00, 0x00, 0x4e, 0x02, 0x00, 0x00, 0x37, 0x08, 0x00, 0x00, + 0x37, 0x08, 0x00, 0x00, 0x38, 0x08, 0x00, 0x00, 0x4f, 0x02, 0x00, 0x00, 0x4f, 0x02, 0x00, 0x00, 0x39, 0x08, 0x00, 0x00, 0x33, 0x08, 0x00, 0x00, 0x33, 0x08, + 0x00, 0x00, 0x50, 0x02, 0x00, 0x00, 0x4f, 0x02, 0x00, 0x00, 0x50, 0x02, 0x00, 0x00, 0x4a, 0x02, 0x00, 0x00, 0x36, 0x08, 0x00, 0x00, 0x36, 0x08, 0x00, 0x00, + 0x4e, 0x02, 0x00, 0x00, 0x50, 0x02, 0x00, 0x00, 0x38, 0x08, 0x00, 0x00, 0x3a, 0x08, 0x00, 0x00, 0x39, 0x08, 0x00, 0x00, 0x39, 0x08, 0x00, 0x00, 0x4f, 0x02, + 0x00, 0x00, 0x38, 0x08, 0x00, 0x00, 0x39, 0x08, 0x00, 0x00, 0x53, 0x02, 0x00, 0x00, 0x52, 0x02, 0x00, 0x00, 0x52, 0x02, 0x00, 0x00, 0x33, 0x08, 0x00, 0x00, + 0x39, 0x08, 0x00, 0x00, 0x50, 0x02, 0x00, 0x00, 0x33, 0x08, 0x00, 0x00, 0x49, 0x02, 0x00, 0x00, 0x49, 0x02, 0x00, 0x00, 0x4a, 0x02, 0x00, 0x00, 0x50, 0x02, + 0x00, 0x00, 0x53, 0x02, 0x00, 0x00, 0x39, 0x08, 0x00, 0x00, 0x3a, 0x08, 0x00, 0x00, 0x3a, 0x08, 0x00, 0x00, 0x3b, 0x08, 0x00, 0x00, 0x53, 0x02, 0x00, 0x00, + 0x54, 0x02, 0x00, 0x00, 0x53, 0x02, 0x00, 0x00, 0x3b, 0x08, 0x00, 0x00, 0x3b, 0x08, 0x00, 0x00, 0x3c, 0x08, 0x00, 0x00, 0x54, 0x02, 0x00, 0x00, 0x51, 0x02, + 0x00, 0x00, 0x54, 0x02, 0x00, 0x00, 0x3d, 0x08, 0x00, 0x00, 0x3d, 0x08, 0x00, 0x00, 0x3e, 0x08, 0x00, 0x00, 0x51, 0x02, 0x00, 0x00, 0x3f, 0x08, 0x00, 0x00, + 0x3d, 0x08, 0x00, 0x00, 0x54, 0x02, 0x00, 0x00, 0x54, 0x02, 0x00, 0x00, 0x3c, 0x08, 0x00, 0x00, 0x3f, 0x08, 0x00, 0x00, 0x3d, 0x08, 0x00, 0x00, 0x40, 0x08, + 0x00, 0x00, 0x5f, 0x02, 0x00, 0x00, 0x5f, 0x02, 0x00, 0x00, 0x3e, 0x08, 0x00, 0x00, 0x3d, 0x08, 0x00, 0x00, 0x52, 0x02, 0x00, 0x00, 0x51, 0x02, 0x00, 0x00, + 0x3e, 0x08, 0x00, 0x00, 0x3e, 0x08, 0x00, 0x00, 0x32, 0x08, 0x00, 0x00, 0x52, 0x02, 0x00, 0x00, 0x3d, 0x08, 0x00, 0x00, 0x3f, 0x08, 0x00, 0x00, 0x41, 0x08, + 0x00, 0x00, 0x41, 0x08, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, 0x3d, 0x08, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x5a, 0x02, 0x00, 0x00, 0x41, 0x08, 0x00, 0x00, + 0x41, 0x08, 0x00, 0x00, 0x3f, 0x08, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x41, 0x08, 0x00, 0x00, 0x42, 0x08, 0x00, 0x00, 0x43, 0x08, 0x00, 0x00, 0x43, 0x08, + 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, 0x41, 0x08, 0x00, 0x00, 0x56, 0x02, 0x00, 0x00, 0x55, 0x02, 0x00, 0x00, 0x44, 0x08, 0x00, 0x00, 0x44, 0x08, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x56, 0x02, 0x00, 0x00, 0x45, 0x08, 0x00, 0x00, 0x44, 0x08, 0x00, 0x00, 0x55, 0x02, 0x00, 0x00, 0x55, 0x02, 0x00, 0x00, 0x46, 0x08, + 0x00, 0x00, 0x45, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x44, 0x08, 0x00, 0x00, 0x47, 0x08, 0x00, 0x00, 0x47, 0x08, 0x00, 0x00, 0xfe, 0x02, 0x00, 0x00, + 0x00, 0x03, 0x00, 0x00, 0x56, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0x48, 0x08, 0x00, 0x00, 0x56, 0x02, + 0x00, 0x00, 0x48, 0x08, 0x00, 0x00, 0x5a, 0x02, 0x00, 0x00, 0x57, 0x02, 0x00, 0x00, 0x57, 0x02, 0x00, 0x00, 0x56, 0x02, 0x00, 0x00, 0x48, 0x08, 0x00, 0x00, + 0x55, 0x02, 0x00, 0x00, 0x57, 0x02, 0x00, 0x00, 0x59, 0x02, 0x00, 0x00, 0x59, 0x02, 0x00, 0x00, 0x46, 0x08, 0x00, 0x00, 0x55, 0x02, 0x00, 0x00, 0x47, 0x08, + 0x00, 0x00, 0x49, 0x08, 0x00, 0x00, 0xe8, 0x02, 0x00, 0x00, 0xe8, 0x02, 0x00, 0x00, 0xfe, 0x02, 0x00, 0x00, 0x47, 0x08, 0x00, 0x00, 0x49, 0x08, 0x00, 0x00, + 0x47, 0x08, 0x00, 0x00, 0x44, 0x08, 0x00, 0x00, 0x44, 0x08, 0x00, 0x00, 0x45, 0x08, 0x00, 0x00, 0x49, 0x08, 0x00, 0x00, 0x49, 0x08, 0x00, 0x00, 0x3e, 0x02, + 0x00, 0x00, 0xe9, 0x02, 0x00, 0x00, 0xe9, 0x02, 0x00, 0x00, 0xe8, 0x02, 0x00, 0x00, 0x49, 0x08, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xfe, 0x02, 0x00, 0x00, + 0xe8, 0x02, 0x00, 0x00, 0xe8, 0x02, 0x00, 0x00, 0xea, 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0x5c, 0x02, 0x00, 0x00, 0x05, 0x03, 0x00, 0x00, 0x04, 0x03, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x5d, 0x02, 0x00, 0x00, 0x5c, 0x02, 0x00, 0x00, 0x5d, 0x02, 0x00, 0x00, 0x4a, 0x08, 0x00, 0x00, 0x4b, 0x08, 0x00, 0x00, + 0x4b, 0x08, 0x00, 0x00, 0x5e, 0x02, 0x00, 0x00, 0x5d, 0x02, 0x00, 0x00, 0x5e, 0x02, 0x00, 0x00, 0x4c, 0x08, 0x00, 0x00, 0x4d, 0x08, 0x00, 0x00, 0x4d, 0x08, + 0x00, 0x00, 0x5c, 0x02, 0x00, 0x00, 0x5e, 0x02, 0x00, 0x00, 0x5d, 0x02, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, + 0x4a, 0x08, 0x00, 0x00, 0x5d, 0x02, 0x00, 0x00, 0x4a, 0x08, 0x00, 0x00, 0x4e, 0x08, 0x00, 0x00, 0x4f, 0x08, 0x00, 0x00, 0x4f, 0x08, 0x00, 0x00, 0x4b, 0x08, + 0x00, 0x00, 0x4a, 0x08, 0x00, 0x00, 0x4c, 0x08, 0x00, 0x00, 0x5e, 0x02, 0x00, 0x00, 0x4b, 0x08, 0x00, 0x00, 0x4b, 0x08, 0x00, 0x00, 0x50, 0x08, 0x00, 0x00, + 0x4c, 0x08, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x12, 0x03, 0x00, 0x00, 0x4e, 0x08, 0x00, 0x00, 0x4e, 0x08, 0x00, 0x00, 0x4a, 0x08, 0x00, 0x00, 0x10, 0x03, + 0x00, 0x00, 0x45, 0x03, 0x00, 0x00, 0x47, 0x03, 0x00, 0x00, 0x4f, 0x08, 0x00, 0x00, 0x4f, 0x08, 0x00, 0x00, 0x4e, 0x08, 0x00, 0x00, 0x45, 0x03, 0x00, 0x00, + 0x4f, 0x08, 0x00, 0x00, 0x51, 0x08, 0x00, 0x00, 0x50, 0x08, 0x00, 0x00, 0x50, 0x08, 0x00, 0x00, 0x4b, 0x08, 0x00, 0x00, 0x4f, 0x08, 0x00, 0x00, 0x61, 0x02, + 0x00, 0x00, 0x60, 0x02, 0x00, 0x00, 0x62, 0x02, 0x00, 0x00, 0x62, 0x02, 0x00, 0x00, 0x44, 0x02, 0x00, 0x00, 0x61, 0x02, 0x00, 0x00, 0x45, 0x02, 0x00, 0x00, + 0x44, 0x02, 0x00, 0x00, 0x62, 0x02, 0x00, 0x00, 0x62, 0x02, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x45, 0x02, 0x00, 0x00, 0x32, 0x08, 0x00, 0x00, 0x61, 0x02, + 0x00, 0x00, 0x44, 0x02, 0x00, 0x00, 0x44, 0x02, 0x00, 0x00, 0x46, 0x02, 0x00, 0x00, 0x32, 0x08, 0x00, 0x00, 0x5f, 0x02, 0x00, 0x00, 0x61, 0x02, 0x00, 0x00, + 0x32, 0x08, 0x00, 0x00, 0x32, 0x08, 0x00, 0x00, 0x3e, 0x08, 0x00, 0x00, 0x5f, 0x02, 0x00, 0x00, 0x66, 0x02, 0x00, 0x00, 0x64, 0x02, 0x00, 0x00, 0x63, 0x02, + 0x00, 0x00, 0x63, 0x02, 0x00, 0x00, 0x52, 0x08, 0x00, 0x00, 0x66, 0x02, 0x00, 0x00, 0x71, 0x02, 0x00, 0x00, 0x65, 0x02, 0x00, 0x00, 0x64, 0x02, 0x00, 0x00, + 0x64, 0x02, 0x00, 0x00, 0x6f, 0x02, 0x00, 0x00, 0x71, 0x02, 0x00, 0x00, 0x74, 0x02, 0x00, 0x00, 0x63, 0x02, 0x00, 0x00, 0x65, 0x02, 0x00, 0x00, 0x65, 0x02, + 0x00, 0x00, 0x72, 0x02, 0x00, 0x00, 0x74, 0x02, 0x00, 0x00, 0x68, 0x02, 0x00, 0x00, 0x6f, 0x02, 0x00, 0x00, 0x64, 0x02, 0x00, 0x00, 0x64, 0x02, 0x00, 0x00, + 0x67, 0x02, 0x00, 0x00, 0x68, 0x02, 0x00, 0x00, 0x6f, 0x02, 0x00, 0x00, 0x68, 0x02, 0x00, 0x00, 0x53, 0x08, 0x00, 0x00, 0x53, 0x08, 0x00, 0x00, 0x70, 0x02, + 0x00, 0x00, 0x6f, 0x02, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x69, 0x02, 0x00, 0x00, 0x67, 0x02, 0x00, 0x00, 0x67, 0x02, 0x00, 0x00, 0x66, 0x02, 0x00, 0x00, + 0x54, 0x08, 0x00, 0x00, 0x6a, 0x02, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x6a, 0x02, + 0x00, 0x00, 0x69, 0x02, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x55, 0x08, 0x00, 0x00, 0x69, 0x02, 0x00, 0x00, + 0x56, 0x08, 0x00, 0x00, 0x6a, 0x02, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0x66, 0x02, 0x00, 0x00, 0x56, 0x08, 0x00, 0x00, 0x02, 0x05, + 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x6a, 0x02, 0x00, 0x00, 0x6a, 0x02, 0x00, 0x00, 0x56, 0x08, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x56, 0x08, 0x00, 0x00, + 0x66, 0x02, 0x00, 0x00, 0x52, 0x08, 0x00, 0x00, 0x52, 0x08, 0x00, 0x00, 0x57, 0x08, 0x00, 0x00, 0x56, 0x08, 0x00, 0x00, 0x6d, 0x02, 0x00, 0x00, 0x6c, 0x02, + 0x00, 0x00, 0x48, 0x02, 0x00, 0x00, 0x48, 0x02, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x6d, 0x02, 0x00, 0x00, 0x6d, 0x02, 0x00, 0x00, 0x58, 0x08, 0x00, 0x00, + 0x59, 0x08, 0x00, 0x00, 0x59, 0x08, 0x00, 0x00, 0x6c, 0x02, 0x00, 0x00, 0x6d, 0x02, 0x00, 0x00, 0x5a, 0x08, 0x00, 0x00, 0x7b, 0x02, 0x00, 0x00, 0x71, 0x02, + 0x00, 0x00, 0x71, 0x02, 0x00, 0x00, 0x70, 0x02, 0x00, 0x00, 0x5a, 0x08, 0x00, 0x00, 0x52, 0x08, 0x00, 0x00, 0x63, 0x02, 0x00, 0x00, 0x74, 0x02, 0x00, 0x00, + 0x74, 0x02, 0x00, 0x00, 0x5b, 0x08, 0x00, 0x00, 0x52, 0x08, 0x00, 0x00, 0x79, 0x02, 0x00, 0x00, 0x5c, 0x08, 0x00, 0x00, 0x78, 0x02, 0x00, 0x00, 0x78, 0x02, + 0x00, 0x00, 0x77, 0x02, 0x00, 0x00, 0x79, 0x02, 0x00, 0x00, 0x5a, 0x08, 0x00, 0x00, 0xe7, 0x02, 0x00, 0x00, 0x5c, 0x08, 0x00, 0x00, 0x5c, 0x08, 0x00, 0x00, + 0x79, 0x02, 0x00, 0x00, 0x5a, 0x08, 0x00, 0x00, 0x5c, 0x08, 0x00, 0x00, 0xaa, 0x02, 0x00, 0x00, 0xa9, 0x02, 0x00, 0x00, 0xa9, 0x02, 0x00, 0x00, 0x78, 0x02, + 0x00, 0x00, 0x5c, 0x08, 0x00, 0x00, 0x7a, 0x02, 0x00, 0x00, 0x77, 0x02, 0x00, 0x00, 0x5d, 0x08, 0x00, 0x00, 0x5d, 0x08, 0x00, 0x00, 0x7c, 0x02, 0x00, 0x00, + 0x7a, 0x02, 0x00, 0x00, 0x5a, 0x08, 0x00, 0x00, 0x79, 0x02, 0x00, 0x00, 0x7a, 0x02, 0x00, 0x00, 0x7a, 0x02, 0x00, 0x00, 0x7b, 0x02, 0x00, 0x00, 0x5a, 0x08, + 0x00, 0x00, 0xc7, 0x06, 0x00, 0x00, 0xc6, 0x06, 0x00, 0x00, 0x5e, 0x08, 0x00, 0x00, 0x5e, 0x08, 0x00, 0x00, 0x5f, 0x08, 0x00, 0x00, 0xc7, 0x06, 0x00, 0x00, + 0x7c, 0x04, 0x00, 0x00, 0x05, 0x05, 0x00, 0x00, 0x5e, 0x08, 0x00, 0x00, 0x5e, 0x08, 0x00, 0x00, 0xc6, 0x06, 0x00, 0x00, 0x7c, 0x04, 0x00, 0x00, 0x60, 0x08, + 0x00, 0x00, 0x5f, 0x08, 0x00, 0x00, 0x5e, 0x08, 0x00, 0x00, 0x5e, 0x08, 0x00, 0x00, 0x61, 0x08, 0x00, 0x00, 0x60, 0x08, 0x00, 0x00, 0xc8, 0x06, 0x00, 0x00, + 0xc7, 0x06, 0x00, 0x00, 0x5f, 0x08, 0x00, 0x00, 0x5f, 0x08, 0x00, 0x00, 0x62, 0x08, 0x00, 0x00, 0xc8, 0x06, 0x00, 0x00, 0x60, 0x08, 0x00, 0x00, 0x75, 0x02, + 0x00, 0x00, 0x62, 0x08, 0x00, 0x00, 0x62, 0x08, 0x00, 0x00, 0x5f, 0x08, 0x00, 0x00, 0x60, 0x08, 0x00, 0x00, 0xbb, 0x06, 0x00, 0x00, 0xc8, 0x06, 0x00, 0x00, + 0x62, 0x08, 0x00, 0x00, 0x62, 0x08, 0x00, 0x00, 0x63, 0x08, 0x00, 0x00, 0xbb, 0x06, 0x00, 0x00, 0x63, 0x08, 0x00, 0x00, 0x62, 0x08, 0x00, 0x00, 0x75, 0x02, + 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, 0x64, 0x08, 0x00, 0x00, 0x63, 0x08, 0x00, 0x00, 0xdc, 0x05, 0x00, 0x00, 0xbb, 0x06, 0x00, 0x00, 0x63, 0x08, 0x00, 0x00, + 0x63, 0x08, 0x00, 0x00, 0x65, 0x08, 0x00, 0x00, 0xdc, 0x05, 0x00, 0x00, 0x55, 0x08, 0x00, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x60, 0x02, 0x00, 0x00, 0x60, 0x02, + 0x00, 0x00, 0x7d, 0x02, 0x00, 0x00, 0x55, 0x08, 0x00, 0x00, 0x55, 0x08, 0x00, 0x00, 0x7d, 0x02, 0x00, 0x00, 0x43, 0x08, 0x00, 0x00, 0x43, 0x08, 0x00, 0x00, + 0x66, 0x08, 0x00, 0x00, 0x55, 0x08, 0x00, 0x00, 0x68, 0x02, 0x00, 0x00, 0x69, 0x02, 0x00, 0x00, 0x55, 0x08, 0x00, 0x00, 0x55, 0x08, 0x00, 0x00, 0x66, 0x08, + 0x00, 0x00, 0x68, 0x02, 0x00, 0x00, 0x68, 0x02, 0x00, 0x00, 0x66, 0x08, 0x00, 0x00, 0x67, 0x08, 0x00, 0x00, 0x67, 0x08, 0x00, 0x00, 0x53, 0x08, 0x00, 0x00, + 0x68, 0x02, 0x00, 0x00, 0x7d, 0x02, 0x00, 0x00, 0x5f, 0x02, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, 0x43, 0x08, 0x00, 0x00, 0x7d, 0x02, + 0x00, 0x00, 0x42, 0x08, 0x00, 0x00, 0x67, 0x08, 0x00, 0x00, 0x66, 0x08, 0x00, 0x00, 0x66, 0x08, 0x00, 0x00, 0x43, 0x08, 0x00, 0x00, 0x42, 0x08, 0x00, 0x00, + 0x83, 0x02, 0x00, 0x00, 0x7f, 0x02, 0x00, 0x00, 0x68, 0x08, 0x00, 0x00, 0x68, 0x08, 0x00, 0x00, 0x69, 0x08, 0x00, 0x00, 0x83, 0x02, 0x00, 0x00, 0x82, 0x02, + 0x00, 0x00, 0x83, 0x02, 0x00, 0x00, 0x69, 0x08, 0x00, 0x00, 0x69, 0x08, 0x00, 0x00, 0x6a, 0x08, 0x00, 0x00, 0x82, 0x02, 0x00, 0x00, 0x81, 0x02, 0x00, 0x00, + 0x82, 0x02, 0x00, 0x00, 0x6a, 0x08, 0x00, 0x00, 0x6a, 0x08, 0x00, 0x00, 0x6b, 0x08, 0x00, 0x00, 0x81, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x81, 0x02, + 0x00, 0x00, 0x6b, 0x08, 0x00, 0x00, 0x6b, 0x08, 0x00, 0x00, 0x6c, 0x08, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x7e, 0x02, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, + 0x6c, 0x08, 0x00, 0x00, 0x6c, 0x08, 0x00, 0x00, 0x6d, 0x08, 0x00, 0x00, 0x7e, 0x02, 0x00, 0x00, 0x89, 0x02, 0x00, 0x00, 0x8a, 0x02, 0x00, 0x00, 0x6e, 0x08, + 0x00, 0x00, 0x6e, 0x08, 0x00, 0x00, 0x6f, 0x08, 0x00, 0x00, 0x89, 0x02, 0x00, 0x00, 0x88, 0x02, 0x00, 0x00, 0x89, 0x02, 0x00, 0x00, 0x6f, 0x08, 0x00, 0x00, + 0x6f, 0x08, 0x00, 0x00, 0x70, 0x08, 0x00, 0x00, 0x88, 0x02, 0x00, 0x00, 0x87, 0x02, 0x00, 0x00, 0x88, 0x02, 0x00, 0x00, 0x70, 0x08, 0x00, 0x00, 0x70, 0x08, + 0x00, 0x00, 0x71, 0x08, 0x00, 0x00, 0x87, 0x02, 0x00, 0x00, 0x85, 0x02, 0x00, 0x00, 0x87, 0x02, 0x00, 0x00, 0x71, 0x08, 0x00, 0x00, 0x71, 0x08, 0x00, 0x00, + 0x72, 0x08, 0x00, 0x00, 0x85, 0x02, 0x00, 0x00, 0x85, 0x02, 0x00, 0x00, 0x7f, 0x02, 0x00, 0x00, 0x84, 0x02, 0x00, 0x00, 0x84, 0x02, 0x00, 0x00, 0x86, 0x02, + 0x00, 0x00, 0x85, 0x02, 0x00, 0x00, 0x8a, 0x02, 0x00, 0x00, 0x86, 0x02, 0x00, 0x00, 0x73, 0x08, 0x00, 0x00, 0x73, 0x08, 0x00, 0x00, 0x6e, 0x08, 0x00, 0x00, + 0x8a, 0x02, 0x00, 0x00, 0x6d, 0x08, 0x00, 0x00, 0x6c, 0x08, 0x00, 0x00, 0x74, 0x08, 0x00, 0x00, 0x74, 0x08, 0x00, 0x00, 0x75, 0x08, 0x00, 0x00, 0x6d, 0x08, + 0x00, 0x00, 0x84, 0x02, 0x00, 0x00, 0x7e, 0x02, 0x00, 0x00, 0x6d, 0x08, 0x00, 0x00, 0x6d, 0x08, 0x00, 0x00, 0x76, 0x08, 0x00, 0x00, 0x84, 0x02, 0x00, 0x00, + 0x6c, 0x08, 0x00, 0x00, 0x6b, 0x08, 0x00, 0x00, 0x77, 0x08, 0x00, 0x00, 0x77, 0x08, 0x00, 0x00, 0x74, 0x08, 0x00, 0x00, 0x6c, 0x08, 0x00, 0x00, 0x6b, 0x08, + 0x00, 0x00, 0x6a, 0x08, 0x00, 0x00, 0x78, 0x08, 0x00, 0x00, 0x78, 0x08, 0x00, 0x00, 0x77, 0x08, 0x00, 0x00, 0x6b, 0x08, 0x00, 0x00, 0x6a, 0x08, 0x00, 0x00, + 0x69, 0x08, 0x00, 0x00, 0x79, 0x08, 0x00, 0x00, 0x79, 0x08, 0x00, 0x00, 0x78, 0x08, 0x00, 0x00, 0x6a, 0x08, 0x00, 0x00, 0x7f, 0x02, 0x00, 0x00, 0x85, 0x02, + 0x00, 0x00, 0x72, 0x08, 0x00, 0x00, 0x72, 0x08, 0x00, 0x00, 0x68, 0x08, 0x00, 0x00, 0x7f, 0x02, 0x00, 0x00, 0x69, 0x08, 0x00, 0x00, 0x68, 0x08, 0x00, 0x00, + 0x7a, 0x08, 0x00, 0x00, 0x7a, 0x08, 0x00, 0x00, 0x79, 0x08, 0x00, 0x00, 0x69, 0x08, 0x00, 0x00, 0x68, 0x08, 0x00, 0x00, 0x72, 0x08, 0x00, 0x00, 0x7b, 0x08, + 0x00, 0x00, 0x7b, 0x08, 0x00, 0x00, 0x7a, 0x08, 0x00, 0x00, 0x68, 0x08, 0x00, 0x00, 0x72, 0x08, 0x00, 0x00, 0x71, 0x08, 0x00, 0x00, 0x7c, 0x08, 0x00, 0x00, + 0x7c, 0x08, 0x00, 0x00, 0x7b, 0x08, 0x00, 0x00, 0x72, 0x08, 0x00, 0x00, 0x71, 0x08, 0x00, 0x00, 0x70, 0x08, 0x00, 0x00, 0x7d, 0x08, 0x00, 0x00, 0x7d, 0x08, + 0x00, 0x00, 0x7c, 0x08, 0x00, 0x00, 0x71, 0x08, 0x00, 0x00, 0x70, 0x08, 0x00, 0x00, 0x6f, 0x08, 0x00, 0x00, 0x7e, 0x08, 0x00, 0x00, 0x7e, 0x08, 0x00, 0x00, + 0x7d, 0x08, 0x00, 0x00, 0x70, 0x08, 0x00, 0x00, 0x6f, 0x08, 0x00, 0x00, 0x6e, 0x08, 0x00, 0x00, 0x7f, 0x08, 0x00, 0x00, 0x7f, 0x08, 0x00, 0x00, 0x7e, 0x08, + 0x00, 0x00, 0x6f, 0x08, 0x00, 0x00, 0x86, 0x02, 0x00, 0x00, 0x84, 0x02, 0x00, 0x00, 0x76, 0x08, 0x00, 0x00, 0x76, 0x08, 0x00, 0x00, 0x73, 0x08, 0x00, 0x00, + 0x86, 0x02, 0x00, 0x00, 0x6e, 0x08, 0x00, 0x00, 0x73, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x7f, 0x08, 0x00, 0x00, 0x6e, 0x08, + 0x00, 0x00, 0x73, 0x08, 0x00, 0x00, 0x76, 0x08, 0x00, 0x00, 0x81, 0x08, 0x00, 0x00, 0x81, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x73, 0x08, 0x00, 0x00, + 0x76, 0x08, 0x00, 0x00, 0x6d, 0x08, 0x00, 0x00, 0x75, 0x08, 0x00, 0x00, 0x75, 0x08, 0x00, 0x00, 0x81, 0x08, 0x00, 0x00, 0x76, 0x08, 0x00, 0x00, 0x75, 0x08, + 0x00, 0x00, 0x74, 0x08, 0x00, 0x00, 0x95, 0x01, 0x00, 0x00, 0x95, 0x01, 0x00, 0x00, 0xdc, 0x05, 0x00, 0x00, 0x75, 0x08, 0x00, 0x00, 0x74, 0x08, 0x00, 0x00, + 0x77, 0x08, 0x00, 0x00, 0x93, 0x01, 0x00, 0x00, 0x93, 0x01, 0x00, 0x00, 0x95, 0x01, 0x00, 0x00, 0x74, 0x08, 0x00, 0x00, 0x77, 0x08, 0x00, 0x00, 0x78, 0x08, + 0x00, 0x00, 0x82, 0x08, 0x00, 0x00, 0x82, 0x08, 0x00, 0x00, 0x93, 0x01, 0x00, 0x00, 0x77, 0x08, 0x00, 0x00, 0x78, 0x08, 0x00, 0x00, 0x79, 0x08, 0x00, 0x00, + 0x83, 0x08, 0x00, 0x00, 0x83, 0x08, 0x00, 0x00, 0x82, 0x08, 0x00, 0x00, 0x78, 0x08, 0x00, 0x00, 0x79, 0x08, 0x00, 0x00, 0x7a, 0x08, 0x00, 0x00, 0x84, 0x08, + 0x00, 0x00, 0x84, 0x08, 0x00, 0x00, 0x83, 0x08, 0x00, 0x00, 0x79, 0x08, 0x00, 0x00, 0x7a, 0x08, 0x00, 0x00, 0x7b, 0x08, 0x00, 0x00, 0x85, 0x08, 0x00, 0x00, + 0x85, 0x08, 0x00, 0x00, 0x84, 0x08, 0x00, 0x00, 0x7a, 0x08, 0x00, 0x00, 0x7b, 0x08, 0x00, 0x00, 0x7c, 0x08, 0x00, 0x00, 0x86, 0x08, 0x00, 0x00, 0x86, 0x08, + 0x00, 0x00, 0x85, 0x08, 0x00, 0x00, 0x7b, 0x08, 0x00, 0x00, 0x7c, 0x08, 0x00, 0x00, 0x7d, 0x08, 0x00, 0x00, 0x87, 0x08, 0x00, 0x00, 0x87, 0x08, 0x00, 0x00, + 0x86, 0x08, 0x00, 0x00, 0x7c, 0x08, 0x00, 0x00, 0x7d, 0x08, 0x00, 0x00, 0x7e, 0x08, 0x00, 0x00, 0x88, 0x08, 0x00, 0x00, 0x88, 0x08, 0x00, 0x00, 0x87, 0x08, + 0x00, 0x00, 0x7d, 0x08, 0x00, 0x00, 0x7e, 0x08, 0x00, 0x00, 0x7f, 0x08, 0x00, 0x00, 0x8b, 0x02, 0x00, 0x00, 0x8b, 0x02, 0x00, 0x00, 0x88, 0x08, 0x00, 0x00, + 0x7e, 0x08, 0x00, 0x00, 0x7f, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x8c, 0x02, 0x00, 0x00, 0x8c, 0x02, 0x00, 0x00, 0x8b, 0x02, 0x00, 0x00, 0x7f, 0x08, + 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x81, 0x08, 0x00, 0x00, 0x65, 0x08, 0x00, 0x00, 0x65, 0x08, 0x00, 0x00, 0x8c, 0x02, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, + 0x81, 0x08, 0x00, 0x00, 0x75, 0x08, 0x00, 0x00, 0xdc, 0x05, 0x00, 0x00, 0xdc, 0x05, 0x00, 0x00, 0x65, 0x08, 0x00, 0x00, 0x81, 0x08, 0x00, 0x00, 0x93, 0x01, + 0x00, 0x00, 0x82, 0x08, 0x00, 0x00, 0x98, 0x02, 0x00, 0x00, 0x98, 0x02, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0x93, 0x01, 0x00, 0x00, 0x83, 0x08, 0x00, 0x00, + 0x99, 0x02, 0x00, 0x00, 0x98, 0x02, 0x00, 0x00, 0x98, 0x02, 0x00, 0x00, 0x82, 0x08, 0x00, 0x00, 0x83, 0x08, 0x00, 0x00, 0x99, 0x02, 0x00, 0x00, 0x83, 0x08, + 0x00, 0x00, 0x84, 0x08, 0x00, 0x00, 0x84, 0x08, 0x00, 0x00, 0x89, 0x08, 0x00, 0x00, 0x99, 0x02, 0x00, 0x00, 0x85, 0x08, 0x00, 0x00, 0x8a, 0x08, 0x00, 0x00, + 0x89, 0x08, 0x00, 0x00, 0x89, 0x08, 0x00, 0x00, 0x84, 0x08, 0x00, 0x00, 0x85, 0x08, 0x00, 0x00, 0x85, 0x08, 0x00, 0x00, 0x86, 0x08, 0x00, 0x00, 0x8b, 0x08, + 0x00, 0x00, 0x8b, 0x08, 0x00, 0x00, 0x8a, 0x08, 0x00, 0x00, 0x85, 0x08, 0x00, 0x00, 0x8c, 0x08, 0x00, 0x00, 0x8b, 0x08, 0x00, 0x00, 0x86, 0x08, 0x00, 0x00, + 0x86, 0x08, 0x00, 0x00, 0x87, 0x08, 0x00, 0x00, 0x8c, 0x08, 0x00, 0x00, 0x87, 0x08, 0x00, 0x00, 0x88, 0x08, 0x00, 0x00, 0x8d, 0x08, 0x00, 0x00, 0x8d, 0x08, + 0x00, 0x00, 0x8c, 0x08, 0x00, 0x00, 0x87, 0x08, 0x00, 0x00, 0x8d, 0x08, 0x00, 0x00, 0x88, 0x08, 0x00, 0x00, 0x8b, 0x02, 0x00, 0x00, 0x8b, 0x02, 0x00, 0x00, + 0x8e, 0x08, 0x00, 0x00, 0x8d, 0x08, 0x00, 0x00, 0x8c, 0x02, 0x00, 0x00, 0x65, 0x08, 0x00, 0x00, 0x63, 0x08, 0x00, 0x00, 0x63, 0x08, 0x00, 0x00, 0x64, 0x08, + 0x00, 0x00, 0x8c, 0x02, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, 0x8f, 0x08, 0x00, 0x00, 0xa2, 0x02, 0x00, 0x00, 0xa2, 0x02, 0x00, 0x00, 0x8e, 0x02, 0x00, 0x00, + 0x90, 0x02, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, 0x91, 0x02, 0x00, 0x00, 0xa7, 0x02, 0x00, 0x00, 0xa7, 0x02, 0x00, 0x00, 0x8f, 0x08, 0x00, 0x00, 0x90, 0x02, + 0x00, 0x00, 0x90, 0x08, 0x00, 0x00, 0xa3, 0x02, 0x00, 0x00, 0xa2, 0x02, 0x00, 0x00, 0xa2, 0x02, 0x00, 0x00, 0x8f, 0x08, 0x00, 0x00, 0x90, 0x08, 0x00, 0x00, + 0x96, 0x02, 0x00, 0x00, 0x8e, 0x02, 0x00, 0x00, 0xa2, 0x02, 0x00, 0x00, 0xa2, 0x02, 0x00, 0x00, 0x94, 0x02, 0x00, 0x00, 0x96, 0x02, 0x00, 0x00, 0x91, 0x02, + 0x00, 0x00, 0x8f, 0x02, 0x00, 0x00, 0x93, 0x02, 0x00, 0x00, 0x93, 0x02, 0x00, 0x00, 0xa5, 0x02, 0x00, 0x00, 0x91, 0x02, 0x00, 0x00, 0x97, 0x02, 0x00, 0x00, + 0x92, 0x02, 0x00, 0x00, 0x8f, 0x02, 0x00, 0x00, 0x8f, 0x02, 0x00, 0x00, 0x8e, 0x02, 0x00, 0x00, 0x97, 0x02, 0x00, 0x00, 0x91, 0x08, 0x00, 0x00, 0x92, 0x08, + 0x00, 0x00, 0x92, 0x02, 0x00, 0x00, 0x92, 0x02, 0x00, 0x00, 0x97, 0x02, 0x00, 0x00, 0x91, 0x08, 0x00, 0x00, 0x8e, 0x02, 0x00, 0x00, 0x96, 0x02, 0x00, 0x00, + 0x76, 0x02, 0x00, 0x00, 0x76, 0x02, 0x00, 0x00, 0x97, 0x02, 0x00, 0x00, 0x8e, 0x02, 0x00, 0x00, 0x77, 0x02, 0x00, 0x00, 0x76, 0x02, 0x00, 0x00, 0x96, 0x02, + 0x00, 0x00, 0x96, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x77, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x93, 0x08, 0x00, 0x00, 0x5d, 0x08, 0x00, 0x00, + 0x5d, 0x08, 0x00, 0x00, 0x77, 0x02, 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x94, 0x02, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x93, 0x08, 0x00, 0x00, 0x93, 0x08, + 0x00, 0x00, 0x95, 0x02, 0x00, 0x00, 0x94, 0x02, 0x00, 0x00, 0x93, 0x08, 0x00, 0x00, 0x8e, 0x08, 0x00, 0x00, 0x95, 0x08, 0x00, 0x00, 0x95, 0x08, 0x00, 0x00, + 0x5d, 0x08, 0x00, 0x00, 0x93, 0x08, 0x00, 0x00, 0x96, 0x08, 0x00, 0x00, 0x8d, 0x02, 0x00, 0x00, 0x8c, 0x02, 0x00, 0x00, 0x8c, 0x02, 0x00, 0x00, 0x64, 0x08, + 0x00, 0x00, 0x96, 0x08, 0x00, 0x00, 0x8e, 0x08, 0x00, 0x00, 0x8b, 0x02, 0x00, 0x00, 0x8d, 0x02, 0x00, 0x00, 0x8d, 0x02, 0x00, 0x00, 0x95, 0x08, 0x00, 0x00, + 0x8e, 0x08, 0x00, 0x00, 0x92, 0x02, 0x00, 0x00, 0x92, 0x08, 0x00, 0x00, 0x97, 0x08, 0x00, 0x00, 0x97, 0x08, 0x00, 0x00, 0x93, 0x02, 0x00, 0x00, 0x92, 0x02, + 0x00, 0x00, 0xa9, 0x02, 0x00, 0x00, 0x91, 0x08, 0x00, 0x00, 0x97, 0x02, 0x00, 0x00, 0x97, 0x02, 0x00, 0x00, 0x78, 0x02, 0x00, 0x00, 0xa9, 0x02, 0x00, 0x00, + 0x93, 0x08, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x8d, 0x08, 0x00, 0x00, 0x8d, 0x08, 0x00, 0x00, 0x8e, 0x08, 0x00, 0x00, 0x93, 0x08, 0x00, 0x00, 0x7c, 0x02, + 0x00, 0x00, 0x5d, 0x08, 0x00, 0x00, 0x95, 0x08, 0x00, 0x00, 0x95, 0x08, 0x00, 0x00, 0xa1, 0x02, 0x00, 0x00, 0x7c, 0x02, 0x00, 0x00, 0x96, 0x08, 0x00, 0x00, + 0xa1, 0x02, 0x00, 0x00, 0x95, 0x08, 0x00, 0x00, 0x95, 0x08, 0x00, 0x00, 0x8d, 0x02, 0x00, 0x00, 0x96, 0x08, 0x00, 0x00, 0x98, 0x08, 0x00, 0x00, 0xec, 0x05, + 0x00, 0x00, 0xed, 0x05, 0x00, 0x00, 0xed, 0x05, 0x00, 0x00, 0x99, 0x08, 0x00, 0x00, 0x98, 0x08, 0x00, 0x00, 0x98, 0x08, 0x00, 0x00, 0x9e, 0x02, 0x00, 0x00, + 0x01, 0x06, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0xec, 0x05, 0x00, 0x00, 0x98, 0x08, 0x00, 0x00, 0xbc, 0x06, 0x00, 0x00, 0x9a, 0x08, 0x00, 0x00, 0x99, 0x08, + 0x00, 0x00, 0x99, 0x08, 0x00, 0x00, 0xed, 0x05, 0x00, 0x00, 0xbc, 0x06, 0x00, 0x00, 0x98, 0x08, 0x00, 0x00, 0x99, 0x08, 0x00, 0x00, 0x9c, 0x02, 0x00, 0x00, + 0x9c, 0x02, 0x00, 0x00, 0x9b, 0x08, 0x00, 0x00, 0x98, 0x08, 0x00, 0x00, 0x9c, 0x02, 0x00, 0x00, 0x99, 0x08, 0x00, 0x00, 0x9a, 0x08, 0x00, 0x00, 0x9a, 0x08, + 0x00, 0x00, 0x9a, 0x02, 0x00, 0x00, 0x9c, 0x02, 0x00, 0x00, 0xbc, 0x06, 0x00, 0x00, 0xfb, 0x05, 0x00, 0x00, 0x9a, 0x02, 0x00, 0x00, 0x9a, 0x02, 0x00, 0x00, + 0x9a, 0x08, 0x00, 0x00, 0xbc, 0x06, 0x00, 0x00, 0x9a, 0x02, 0x00, 0x00, 0xfb, 0x05, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0x98, 0x02, + 0x00, 0x00, 0x9a, 0x02, 0x00, 0x00, 0x9c, 0x08, 0x00, 0x00, 0x9b, 0x02, 0x00, 0x00, 0x99, 0x02, 0x00, 0x00, 0x99, 0x02, 0x00, 0x00, 0x89, 0x08, 0x00, 0x00, + 0x9c, 0x08, 0x00, 0x00, 0x9b, 0x02, 0x00, 0x00, 0x9d, 0x08, 0x00, 0x00, 0x9b, 0x08, 0x00, 0x00, 0x9b, 0x08, 0x00, 0x00, 0x9c, 0x02, 0x00, 0x00, 0x9b, 0x02, + 0x00, 0x00, 0x9d, 0x02, 0x00, 0x00, 0x37, 0x07, 0x00, 0x00, 0x3e, 0x01, 0x00, 0x00, 0x3e, 0x01, 0x00, 0x00, 0x96, 0x01, 0x00, 0x00, 0x9d, 0x02, 0x00, 0x00, + 0x9d, 0x02, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x00, 0xa6, 0x02, 0x00, 0x00, 0xa6, 0x02, 0x00, 0x00, 0x37, 0x07, 0x00, 0x00, 0x9d, 0x02, 0x00, 0x00, 0x9e, 0x02, + 0x00, 0x00, 0x9d, 0x02, 0x00, 0x00, 0x96, 0x01, 0x00, 0x00, 0x96, 0x01, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x9e, 0x02, 0x00, 0x00, 0x98, 0x08, 0x00, 0x00, + 0x9b, 0x08, 0x00, 0x00, 0x9f, 0x02, 0x00, 0x00, 0x9f, 0x02, 0x00, 0x00, 0x9e, 0x02, 0x00, 0x00, 0x98, 0x08, 0x00, 0x00, 0x9d, 0x08, 0x00, 0x00, 0x9b, 0x02, + 0x00, 0x00, 0x9c, 0x08, 0x00, 0x00, 0x9c, 0x08, 0x00, 0x00, 0x9e, 0x08, 0x00, 0x00, 0x9d, 0x08, 0x00, 0x00, 0x9f, 0x08, 0x00, 0x00, 0x9c, 0x08, 0x00, 0x00, + 0x89, 0x08, 0x00, 0x00, 0x89, 0x08, 0x00, 0x00, 0x8a, 0x08, 0x00, 0x00, 0x9f, 0x08, 0x00, 0x00, 0x9f, 0x08, 0x00, 0x00, 0xa0, 0x08, 0x00, 0x00, 0x9e, 0x08, + 0x00, 0x00, 0x9e, 0x08, 0x00, 0x00, 0x9c, 0x08, 0x00, 0x00, 0x9f, 0x08, 0x00, 0x00, 0xa1, 0x08, 0x00, 0x00, 0x9f, 0x08, 0x00, 0x00, 0x8a, 0x08, 0x00, 0x00, + 0x8a, 0x08, 0x00, 0x00, 0x8b, 0x08, 0x00, 0x00, 0xa1, 0x08, 0x00, 0x00, 0x90, 0x08, 0x00, 0x00, 0xa0, 0x08, 0x00, 0x00, 0x9f, 0x08, 0x00, 0x00, 0x9f, 0x08, + 0x00, 0x00, 0xa1, 0x08, 0x00, 0x00, 0x90, 0x08, 0x00, 0x00, 0xa2, 0x08, 0x00, 0x00, 0xa1, 0x08, 0x00, 0x00, 0x8b, 0x08, 0x00, 0x00, 0x8b, 0x08, 0x00, 0x00, + 0x8c, 0x08, 0x00, 0x00, 0xa2, 0x08, 0x00, 0x00, 0xa3, 0x02, 0x00, 0x00, 0x90, 0x08, 0x00, 0x00, 0xa1, 0x08, 0x00, 0x00, 0xa1, 0x08, 0x00, 0x00, 0xa2, 0x08, + 0x00, 0x00, 0xa3, 0x02, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0xa2, 0x08, 0x00, 0x00, 0x8c, 0x08, 0x00, 0x00, 0x8c, 0x08, 0x00, 0x00, 0x8d, 0x08, 0x00, 0x00, + 0x94, 0x08, 0x00, 0x00, 0x96, 0x08, 0x00, 0x00, 0x64, 0x08, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, 0x72, 0x02, 0x00, 0x00, 0x96, 0x08, + 0x00, 0x00, 0x9b, 0x08, 0x00, 0x00, 0x9d, 0x08, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x00, 0x9f, 0x02, 0x00, 0x00, 0x9b, 0x08, 0x00, 0x00, + 0xa0, 0x02, 0x00, 0x00, 0x9d, 0x08, 0x00, 0x00, 0x9e, 0x08, 0x00, 0x00, 0x9e, 0x08, 0x00, 0x00, 0xa4, 0x02, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x00, 0x94, 0x02, + 0x00, 0x00, 0xa3, 0x02, 0x00, 0x00, 0xa2, 0x08, 0x00, 0x00, 0xa2, 0x08, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x94, 0x02, 0x00, 0x00, 0xa1, 0x02, 0x00, 0x00, + 0x96, 0x08, 0x00, 0x00, 0x72, 0x02, 0x00, 0x00, 0x72, 0x02, 0x00, 0x00, 0x73, 0x02, 0x00, 0x00, 0xa1, 0x02, 0x00, 0x00, 0x7c, 0x02, 0x00, 0x00, 0x73, 0x02, + 0x00, 0x00, 0x65, 0x02, 0x00, 0x00, 0x65, 0x02, 0x00, 0x00, 0x7b, 0x02, 0x00, 0x00, 0x7c, 0x02, 0x00, 0x00, 0xa4, 0x02, 0x00, 0x00, 0x9e, 0x08, 0x00, 0x00, + 0xa0, 0x08, 0x00, 0x00, 0xa0, 0x08, 0x00, 0x00, 0xa7, 0x02, 0x00, 0x00, 0xa4, 0x02, 0x00, 0x00, 0xa3, 0x08, 0x00, 0x00, 0xa6, 0x02, 0x00, 0x00, 0x93, 0x02, + 0x00, 0x00, 0x93, 0x02, 0x00, 0x00, 0x97, 0x08, 0x00, 0x00, 0xa3, 0x08, 0x00, 0x00, 0xa6, 0x02, 0x00, 0x00, 0xa3, 0x08, 0x00, 0x00, 0x35, 0x07, 0x00, 0x00, + 0x35, 0x07, 0x00, 0x00, 0x37, 0x07, 0x00, 0x00, 0xa6, 0x02, 0x00, 0x00, 0xa4, 0x08, 0x00, 0x00, 0xa3, 0x08, 0x00, 0x00, 0x97, 0x08, 0x00, 0x00, 0x97, 0x08, + 0x00, 0x00, 0xa5, 0x08, 0x00, 0x00, 0xa4, 0x08, 0x00, 0x00, 0xa4, 0x08, 0x00, 0x00, 0x36, 0x07, 0x00, 0x00, 0x35, 0x07, 0x00, 0x00, 0x35, 0x07, 0x00, 0x00, + 0xa3, 0x08, 0x00, 0x00, 0xa4, 0x08, 0x00, 0x00, 0xa6, 0x08, 0x00, 0x00, 0xa5, 0x08, 0x00, 0x00, 0x97, 0x08, 0x00, 0x00, 0x97, 0x08, 0x00, 0x00, 0x92, 0x08, + 0x00, 0x00, 0xa6, 0x08, 0x00, 0x00, 0xa7, 0x08, 0x00, 0x00, 0xa4, 0x08, 0x00, 0x00, 0xa5, 0x08, 0x00, 0x00, 0xa5, 0x08, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x00, + 0xa7, 0x08, 0x00, 0x00, 0xc1, 0x06, 0x00, 0x00, 0x36, 0x07, 0x00, 0x00, 0xa4, 0x08, 0x00, 0x00, 0xa4, 0x08, 0x00, 0x00, 0xa7, 0x08, 0x00, 0x00, 0xc1, 0x06, + 0x00, 0x00, 0xa6, 0x08, 0x00, 0x00, 0xa9, 0x08, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x00, 0xa5, 0x08, 0x00, 0x00, 0xa6, 0x08, 0x00, 0x00, + 0xaa, 0x08, 0x00, 0x00, 0xa7, 0x08, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x00, 0xd7, 0x02, 0x00, 0x00, 0xaa, 0x08, 0x00, 0x00, 0xc2, 0x06, + 0x00, 0x00, 0xc1, 0x06, 0x00, 0x00, 0xa7, 0x08, 0x00, 0x00, 0xa7, 0x08, 0x00, 0x00, 0xaa, 0x08, 0x00, 0x00, 0xc2, 0x06, 0x00, 0x00, 0xa9, 0x08, 0x00, 0x00, + 0xd8, 0x02, 0x00, 0x00, 0xd7, 0x02, 0x00, 0x00, 0xd7, 0x02, 0x00, 0x00, 0xa8, 0x08, 0x00, 0x00, 0xa9, 0x08, 0x00, 0x00, 0xaa, 0x08, 0x00, 0x00, 0xd7, 0x02, + 0x00, 0x00, 0xd5, 0x02, 0x00, 0x00, 0xd5, 0x02, 0x00, 0x00, 0xd4, 0x02, 0x00, 0x00, 0xaa, 0x08, 0x00, 0x00, 0xab, 0x08, 0x00, 0x00, 0xaa, 0x02, 0x00, 0x00, + 0x5c, 0x08, 0x00, 0x00, 0x5c, 0x08, 0x00, 0x00, 0xe7, 0x02, 0x00, 0x00, 0xab, 0x08, 0x00, 0x00, 0xaf, 0x02, 0x00, 0x00, 0xb1, 0x02, 0x00, 0x00, 0x29, 0x08, + 0x00, 0x00, 0x29, 0x08, 0x00, 0x00, 0xa7, 0x06, 0x00, 0x00, 0xaf, 0x02, 0x00, 0x00, 0xab, 0x02, 0x00, 0x00, 0xac, 0x08, 0x00, 0x00, 0xc8, 0x04, 0x00, 0x00, + 0xc8, 0x04, 0x00, 0x00, 0xac, 0x02, 0x00, 0x00, 0xab, 0x02, 0x00, 0x00, 0xec, 0x02, 0x00, 0x00, 0xeb, 0x02, 0x00, 0x00, 0xb1, 0x02, 0x00, 0x00, 0xb1, 0x02, + 0x00, 0x00, 0xb0, 0x02, 0x00, 0x00, 0xec, 0x02, 0x00, 0x00, 0xd4, 0x02, 0x00, 0x00, 0xaf, 0x02, 0x00, 0x00, 0xa7, 0x06, 0x00, 0x00, 0xa7, 0x06, 0x00, 0x00, + 0xa8, 0x06, 0x00, 0x00, 0xd4, 0x02, 0x00, 0x00, 0xad, 0x08, 0x00, 0x00, 0xae, 0x08, 0x00, 0x00, 0xb3, 0x02, 0x00, 0x00, 0xb3, 0x02, 0x00, 0x00, 0xb2, 0x02, + 0x00, 0x00, 0xad, 0x08, 0x00, 0x00, 0x2a, 0x08, 0x00, 0x00, 0xb4, 0x02, 0x00, 0x00, 0xb3, 0x02, 0x00, 0x00, 0xb3, 0x02, 0x00, 0x00, 0xaf, 0x08, 0x00, 0x00, + 0x2a, 0x08, 0x00, 0x00, 0x2b, 0x08, 0x00, 0x00, 0xb2, 0x02, 0x00, 0x00, 0xb4, 0x02, 0x00, 0x00, 0xb4, 0x02, 0x00, 0x00, 0x3a, 0x02, 0x00, 0x00, 0x2b, 0x08, + 0x00, 0x00, 0xd0, 0x02, 0x00, 0x00, 0xad, 0x08, 0x00, 0x00, 0xb2, 0x02, 0x00, 0x00, 0xb2, 0x02, 0x00, 0x00, 0x2b, 0x08, 0x00, 0x00, 0xd0, 0x02, 0x00, 0x00, + 0xd1, 0x02, 0x00, 0x00, 0xd0, 0x02, 0x00, 0x00, 0x2b, 0x08, 0x00, 0x00, 0x2b, 0x08, 0x00, 0x00, 0xeb, 0x02, 0x00, 0x00, 0xd1, 0x02, 0x00, 0x00, 0xb0, 0x08, + 0x00, 0x00, 0xb5, 0x02, 0x00, 0x00, 0xb7, 0x02, 0x00, 0x00, 0xb7, 0x02, 0x00, 0x00, 0xc2, 0x04, 0x00, 0x00, 0xb0, 0x08, 0x00, 0x00, 0xb1, 0x08, 0x00, 0x00, + 0xb0, 0x08, 0x00, 0x00, 0xc2, 0x04, 0x00, 0x00, 0xc2, 0x04, 0x00, 0x00, 0xc4, 0x04, 0x00, 0x00, 0xb1, 0x08, 0x00, 0x00, 0xb2, 0x08, 0x00, 0x00, 0xb1, 0x08, + 0x00, 0x00, 0xc4, 0x04, 0x00, 0x00, 0xc4, 0x04, 0x00, 0x00, 0xc6, 0x04, 0x00, 0x00, 0xb2, 0x08, 0x00, 0x00, 0xac, 0x08, 0x00, 0x00, 0xb2, 0x08, 0x00, 0x00, + 0xc6, 0x04, 0x00, 0x00, 0xc6, 0x04, 0x00, 0x00, 0xc8, 0x04, 0x00, 0x00, 0xac, 0x08, 0x00, 0x00, 0xb3, 0x08, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x00, 0xb5, 0x08, + 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xb6, 0x08, 0x00, 0x00, 0xb3, 0x08, 0x00, 0x00, 0xb3, 0x08, 0x00, 0x00, 0x3b, 0x03, 0x00, 0x00, 0xb7, 0x08, 0x00, 0x00, + 0xb7, 0x08, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x00, 0xb3, 0x08, 0x00, 0x00, 0xb8, 0x08, 0x00, 0x00, 0xb9, 0x08, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xb5, 0x08, + 0x00, 0x00, 0xb4, 0x08, 0x00, 0x00, 0xb8, 0x08, 0x00, 0x00, 0xba, 0x08, 0x00, 0x00, 0xbb, 0x08, 0x00, 0x00, 0xb6, 0x08, 0x00, 0x00, 0xb6, 0x08, 0x00, 0x00, + 0xb5, 0x08, 0x00, 0x00, 0xba, 0x08, 0x00, 0x00, 0xbc, 0x08, 0x00, 0x00, 0xb3, 0x08, 0x00, 0x00, 0xb6, 0x08, 0x00, 0x00, 0xb6, 0x08, 0x00, 0x00, 0xbd, 0x08, + 0x00, 0x00, 0xbc, 0x08, 0x00, 0x00, 0xbe, 0x08, 0x00, 0x00, 0xbf, 0x08, 0x00, 0x00, 0xc0, 0x08, 0x00, 0x00, 0xc0, 0x08, 0x00, 0x00, 0xc1, 0x08, 0x00, 0x00, + 0xbe, 0x08, 0x00, 0x00, 0xbe, 0x08, 0x00, 0x00, 0xc2, 0x08, 0x00, 0x00, 0xc3, 0x08, 0x00, 0x00, 0xc3, 0x08, 0x00, 0x00, 0xbf, 0x08, 0x00, 0x00, 0xbe, 0x08, + 0x00, 0x00, 0xc0, 0x08, 0x00, 0x00, 0xbf, 0x08, 0x00, 0x00, 0xc4, 0x08, 0x00, 0x00, 0xc4, 0x08, 0x00, 0x00, 0xc5, 0x08, 0x00, 0x00, 0xc0, 0x08, 0x00, 0x00, + 0xc6, 0x08, 0x00, 0x00, 0xc1, 0x08, 0x00, 0x00, 0xc0, 0x08, 0x00, 0x00, 0xc0, 0x08, 0x00, 0x00, 0xc7, 0x08, 0x00, 0x00, 0xc6, 0x08, 0x00, 0x00, 0xc1, 0x08, + 0x00, 0x00, 0xc8, 0x08, 0x00, 0x00, 0xc9, 0x08, 0x00, 0x00, 0xc9, 0x08, 0x00, 0x00, 0xbe, 0x08, 0x00, 0x00, 0xc1, 0x08, 0x00, 0x00, 0xb8, 0x08, 0x00, 0x00, + 0xca, 0x08, 0x00, 0x00, 0xcb, 0x08, 0x00, 0x00, 0xcb, 0x08, 0x00, 0x00, 0xb9, 0x08, 0x00, 0x00, 0xb8, 0x08, 0x00, 0x00, 0xcc, 0x08, 0x00, 0x00, 0xba, 0x08, + 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xb9, 0x08, 0x00, 0x00, 0xcc, 0x08, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x00, 0xb7, 0x08, 0x00, 0x00, + 0xcd, 0x08, 0x00, 0x00, 0xcd, 0x08, 0x00, 0x00, 0xb8, 0x08, 0x00, 0x00, 0xb4, 0x08, 0x00, 0x00, 0xce, 0x08, 0x00, 0x00, 0xcf, 0x08, 0x00, 0x00, 0xd0, 0x08, + 0x00, 0x00, 0xd0, 0x08, 0x00, 0x00, 0xcb, 0x02, 0x00, 0x00, 0xce, 0x08, 0x00, 0x00, 0xce, 0x08, 0x00, 0x00, 0xd1, 0x08, 0x00, 0x00, 0xd2, 0x08, 0x00, 0x00, + 0xd2, 0x08, 0x00, 0x00, 0xcf, 0x08, 0x00, 0x00, 0xce, 0x08, 0x00, 0x00, 0xcf, 0x08, 0x00, 0x00, 0xc6, 0x08, 0x00, 0x00, 0xc7, 0x08, 0x00, 0x00, 0xc7, 0x08, + 0x00, 0x00, 0xd0, 0x08, 0x00, 0x00, 0xcf, 0x08, 0x00, 0x00, 0xce, 0x02, 0x00, 0x00, 0xcb, 0x02, 0x00, 0x00, 0xd0, 0x08, 0x00, 0x00, 0xd0, 0x08, 0x00, 0x00, + 0xd3, 0x08, 0x00, 0x00, 0xce, 0x02, 0x00, 0x00, 0xca, 0x08, 0x00, 0x00, 0xce, 0x08, 0x00, 0x00, 0xcb, 0x02, 0x00, 0x00, 0xcb, 0x02, 0x00, 0x00, 0xcb, 0x08, + 0x00, 0x00, 0xca, 0x08, 0x00, 0x00, 0xcf, 0x08, 0x00, 0x00, 0xd2, 0x08, 0x00, 0x00, 0xd4, 0x08, 0x00, 0x00, 0xd4, 0x08, 0x00, 0x00, 0xc6, 0x08, 0x00, 0x00, + 0xcf, 0x08, 0x00, 0x00, 0xd0, 0x08, 0x00, 0x00, 0xc7, 0x08, 0x00, 0x00, 0xd5, 0x08, 0x00, 0x00, 0xd5, 0x08, 0x00, 0x00, 0xd3, 0x08, 0x00, 0x00, 0xd0, 0x08, + 0x00, 0x00, 0xc6, 0x08, 0x00, 0x00, 0xd4, 0x08, 0x00, 0x00, 0xc8, 0x08, 0x00, 0x00, 0xc8, 0x08, 0x00, 0x00, 0xc1, 0x08, 0x00, 0x00, 0xc6, 0x08, 0x00, 0x00, + 0xc7, 0x08, 0x00, 0x00, 0xc0, 0x08, 0x00, 0x00, 0xc5, 0x08, 0x00, 0x00, 0xc5, 0x08, 0x00, 0x00, 0xd5, 0x08, 0x00, 0x00, 0xc7, 0x08, 0x00, 0x00, 0xbe, 0x08, + 0x00, 0x00, 0xc9, 0x08, 0x00, 0x00, 0xd6, 0x08, 0x00, 0x00, 0xd6, 0x08, 0x00, 0x00, 0xc2, 0x08, 0x00, 0x00, 0xbe, 0x08, 0x00, 0x00, 0xc2, 0x08, 0x00, 0x00, + 0xd7, 0x08, 0x00, 0x00, 0xbb, 0x02, 0x00, 0x00, 0xbb, 0x02, 0x00, 0x00, 0xc3, 0x08, 0x00, 0x00, 0xc2, 0x08, 0x00, 0x00, 0xbf, 0x08, 0x00, 0x00, 0xc3, 0x08, + 0x00, 0x00, 0xbe, 0x02, 0x00, 0x00, 0xbe, 0x02, 0x00, 0x00, 0xc4, 0x08, 0x00, 0x00, 0xbf, 0x08, 0x00, 0x00, 0xc2, 0x08, 0x00, 0x00, 0xd6, 0x08, 0x00, 0x00, + 0xd8, 0x08, 0x00, 0x00, 0xd8, 0x08, 0x00, 0x00, 0xd7, 0x08, 0x00, 0x00, 0xc2, 0x08, 0x00, 0x00, 0xd7, 0x08, 0x00, 0x00, 0xd9, 0x08, 0x00, 0x00, 0xbc, 0x02, + 0x00, 0x00, 0xbc, 0x02, 0x00, 0x00, 0xbb, 0x02, 0x00, 0x00, 0xd7, 0x08, 0x00, 0x00, 0xbb, 0x02, 0x00, 0x00, 0xba, 0x02, 0x00, 0x00, 0xbe, 0x02, 0x00, 0x00, + 0xbe, 0x02, 0x00, 0x00, 0xc3, 0x08, 0x00, 0x00, 0xbb, 0x02, 0x00, 0x00, 0xd7, 0x08, 0x00, 0x00, 0xd8, 0x08, 0x00, 0x00, 0xda, 0x08, 0x00, 0x00, 0xda, 0x08, + 0x00, 0x00, 0xd9, 0x08, 0x00, 0x00, 0xd7, 0x08, 0x00, 0x00, 0xd9, 0x08, 0x00, 0x00, 0xdb, 0x08, 0x00, 0x00, 0xdc, 0x08, 0x00, 0x00, 0xdc, 0x08, 0x00, 0x00, + 0xbc, 0x02, 0x00, 0x00, 0xd9, 0x08, 0x00, 0x00, 0xd9, 0x08, 0x00, 0x00, 0xda, 0x08, 0x00, 0x00, 0xdd, 0x08, 0x00, 0x00, 0xdd, 0x08, 0x00, 0x00, 0xdb, 0x08, + 0x00, 0x00, 0xd9, 0x08, 0x00, 0x00, 0xdb, 0x08, 0x00, 0x00, 0xde, 0x08, 0x00, 0x00, 0xdf, 0x08, 0x00, 0x00, 0xdf, 0x08, 0x00, 0x00, 0xdc, 0x08, 0x00, 0x00, + 0xdb, 0x08, 0x00, 0x00, 0xbc, 0x02, 0x00, 0x00, 0xdc, 0x08, 0x00, 0x00, 0xe0, 0x08, 0x00, 0x00, 0xe0, 0x08, 0x00, 0x00, 0xc4, 0x02, 0x00, 0x00, 0xbc, 0x02, + 0x00, 0x00, 0xdb, 0x08, 0x00, 0x00, 0xdd, 0x08, 0x00, 0x00, 0xe1, 0x08, 0x00, 0x00, 0xe1, 0x08, 0x00, 0x00, 0xde, 0x08, 0x00, 0x00, 0xdb, 0x08, 0x00, 0x00, + 0xbd, 0x08, 0x00, 0x00, 0xdf, 0x08, 0x00, 0x00, 0xde, 0x08, 0x00, 0x00, 0xde, 0x08, 0x00, 0x00, 0xbc, 0x08, 0x00, 0x00, 0xbd, 0x08, 0x00, 0x00, 0xe2, 0x08, + 0x00, 0x00, 0xe0, 0x08, 0x00, 0x00, 0xdc, 0x08, 0x00, 0x00, 0xdc, 0x08, 0x00, 0x00, 0xdf, 0x08, 0x00, 0x00, 0xe2, 0x08, 0x00, 0x00, 0xbc, 0x08, 0x00, 0x00, + 0x39, 0x03, 0x00, 0x00, 0x3b, 0x03, 0x00, 0x00, 0x3b, 0x03, 0x00, 0x00, 0xb3, 0x08, 0x00, 0x00, 0xbc, 0x08, 0x00, 0x00, 0xbb, 0x08, 0x00, 0x00, 0xe3, 0x08, + 0x00, 0x00, 0xbd, 0x08, 0x00, 0x00, 0xbd, 0x08, 0x00, 0x00, 0xb6, 0x08, 0x00, 0x00, 0xbb, 0x08, 0x00, 0x00, 0xb8, 0x08, 0x00, 0x00, 0xcd, 0x08, 0x00, 0x00, + 0xe4, 0x08, 0x00, 0x00, 0xe4, 0x08, 0x00, 0x00, 0xca, 0x08, 0x00, 0x00, 0xb8, 0x08, 0x00, 0x00, 0xe5, 0x08, 0x00, 0x00, 0xcc, 0x08, 0x00, 0x00, 0xb9, 0x08, + 0x00, 0x00, 0xb9, 0x08, 0x00, 0x00, 0xcb, 0x08, 0x00, 0x00, 0xe5, 0x08, 0x00, 0x00, 0xca, 0x08, 0x00, 0x00, 0xe4, 0x08, 0x00, 0x00, 0xd1, 0x08, 0x00, 0x00, + 0xd1, 0x08, 0x00, 0x00, 0xce, 0x08, 0x00, 0x00, 0xca, 0x08, 0x00, 0x00, 0xcd, 0x02, 0x00, 0x00, 0xe5, 0x08, 0x00, 0x00, 0xcb, 0x08, 0x00, 0x00, 0xcb, 0x08, + 0x00, 0x00, 0xcb, 0x02, 0x00, 0x00, 0xcd, 0x02, 0x00, 0x00, 0xbd, 0x02, 0x00, 0x00, 0xba, 0x02, 0x00, 0x00, 0xda, 0x02, 0x00, 0x00, 0xda, 0x02, 0x00, 0x00, + 0xe6, 0x08, 0x00, 0x00, 0xbd, 0x02, 0x00, 0x00, 0xc2, 0x02, 0x00, 0x00, 0xc5, 0x02, 0x00, 0x00, 0xda, 0x02, 0x00, 0x00, 0xda, 0x02, 0x00, 0x00, 0xba, 0x02, + 0x00, 0x00, 0xc2, 0x02, 0x00, 0x00, 0xe6, 0x08, 0x00, 0x00, 0xda, 0x02, 0x00, 0x00, 0xe7, 0x08, 0x00, 0x00, 0xe7, 0x08, 0x00, 0x00, 0xe8, 0x08, 0x00, 0x00, + 0xe6, 0x08, 0x00, 0x00, 0xe6, 0x08, 0x00, 0x00, 0xe9, 0x08, 0x00, 0x00, 0xea, 0x08, 0x00, 0x00, 0xea, 0x08, 0x00, 0x00, 0xbd, 0x02, 0x00, 0x00, 0xe6, 0x08, + 0x00, 0x00, 0xeb, 0x08, 0x00, 0x00, 0xc0, 0x02, 0x00, 0x00, 0xbf, 0x02, 0x00, 0x00, 0xbf, 0x02, 0x00, 0x00, 0xec, 0x08, 0x00, 0x00, 0xeb, 0x08, 0x00, 0x00, + 0xc0, 0x02, 0x00, 0x00, 0xce, 0x02, 0x00, 0x00, 0xd3, 0x08, 0x00, 0x00, 0xd3, 0x08, 0x00, 0x00, 0xc1, 0x02, 0x00, 0x00, 0xc0, 0x02, 0x00, 0x00, 0xed, 0x08, + 0x00, 0x00, 0xbf, 0x02, 0x00, 0x00, 0xc1, 0x02, 0x00, 0x00, 0xc1, 0x02, 0x00, 0x00, 0xee, 0x08, 0x00, 0x00, 0xed, 0x08, 0x00, 0x00, 0xe9, 0x08, 0x00, 0x00, + 0xe6, 0x08, 0x00, 0x00, 0xe8, 0x08, 0x00, 0x00, 0xe8, 0x08, 0x00, 0x00, 0xef, 0x08, 0x00, 0x00, 0xe9, 0x08, 0x00, 0x00, 0xe9, 0x08, 0x00, 0x00, 0xf0, 0x08, + 0x00, 0x00, 0xf1, 0x08, 0x00, 0x00, 0xf1, 0x08, 0x00, 0x00, 0xea, 0x08, 0x00, 0x00, 0xe9, 0x08, 0x00, 0x00, 0xbe, 0x02, 0x00, 0x00, 0xbd, 0x02, 0x00, 0x00, + 0xea, 0x08, 0x00, 0x00, 0xea, 0x08, 0x00, 0x00, 0xc4, 0x08, 0x00, 0x00, 0xbe, 0x02, 0x00, 0x00, 0xf0, 0x08, 0x00, 0x00, 0xe9, 0x08, 0x00, 0x00, 0xef, 0x08, + 0x00, 0x00, 0xef, 0x08, 0x00, 0x00, 0xf2, 0x08, 0x00, 0x00, 0xf0, 0x08, 0x00, 0x00, 0xf0, 0x08, 0x00, 0x00, 0xed, 0x08, 0x00, 0x00, 0xee, 0x08, 0x00, 0x00, + 0xee, 0x08, 0x00, 0x00, 0xf1, 0x08, 0x00, 0x00, 0xf0, 0x08, 0x00, 0x00, 0xc5, 0x08, 0x00, 0x00, 0xc4, 0x08, 0x00, 0x00, 0xea, 0x08, 0x00, 0x00, 0xea, 0x08, + 0x00, 0x00, 0xf1, 0x08, 0x00, 0x00, 0xc5, 0x08, 0x00, 0x00, 0xed, 0x08, 0x00, 0x00, 0xf0, 0x08, 0x00, 0x00, 0xf2, 0x08, 0x00, 0x00, 0xf2, 0x08, 0x00, 0x00, + 0xf3, 0x08, 0x00, 0x00, 0xed, 0x08, 0x00, 0x00, 0xd5, 0x08, 0x00, 0x00, 0xc5, 0x08, 0x00, 0x00, 0xf1, 0x08, 0x00, 0x00, 0xf1, 0x08, 0x00, 0x00, 0xee, 0x08, + 0x00, 0x00, 0xd5, 0x08, 0x00, 0x00, 0xed, 0x08, 0x00, 0x00, 0xf3, 0x08, 0x00, 0x00, 0xec, 0x08, 0x00, 0x00, 0xec, 0x08, 0x00, 0x00, 0xbf, 0x02, 0x00, 0x00, + 0xed, 0x08, 0x00, 0x00, 0xc1, 0x02, 0x00, 0x00, 0xd3, 0x08, 0x00, 0x00, 0xd5, 0x08, 0x00, 0x00, 0xd5, 0x08, 0x00, 0x00, 0xee, 0x08, 0x00, 0x00, 0xc1, 0x02, + 0x00, 0x00, 0xc6, 0x02, 0x00, 0x00, 0xc3, 0x02, 0x00, 0x00, 0xc4, 0x02, 0x00, 0x00, 0xc4, 0x02, 0x00, 0x00, 0xe0, 0x08, 0x00, 0x00, 0xc6, 0x02, 0x00, 0x00, + 0xf4, 0x08, 0x00, 0x00, 0xc6, 0x02, 0x00, 0x00, 0xe0, 0x08, 0x00, 0x00, 0xe0, 0x08, 0x00, 0x00, 0xe2, 0x08, 0x00, 0x00, 0xf4, 0x08, 0x00, 0x00, 0xc7, 0x02, + 0x00, 0x00, 0xc6, 0x02, 0x00, 0x00, 0xf4, 0x08, 0x00, 0x00, 0xf4, 0x08, 0x00, 0x00, 0xf5, 0x08, 0x00, 0x00, 0xc7, 0x02, 0x00, 0x00, 0xf6, 0x08, 0x00, 0x00, + 0xf4, 0x08, 0x00, 0x00, 0xe2, 0x08, 0x00, 0x00, 0xe2, 0x08, 0x00, 0x00, 0xe3, 0x08, 0x00, 0x00, 0xf6, 0x08, 0x00, 0x00, 0xf7, 0x08, 0x00, 0x00, 0xf6, 0x08, + 0x00, 0x00, 0xe3, 0x08, 0x00, 0x00, 0xe3, 0x08, 0x00, 0x00, 0xbb, 0x08, 0x00, 0x00, 0xf7, 0x08, 0x00, 0x00, 0xf8, 0x08, 0x00, 0x00, 0xf6, 0x08, 0x00, 0x00, + 0xf7, 0x08, 0x00, 0x00, 0xf7, 0x08, 0x00, 0x00, 0xf9, 0x08, 0x00, 0x00, 0xf8, 0x08, 0x00, 0x00, 0xfa, 0x08, 0x00, 0x00, 0xf7, 0x08, 0x00, 0x00, 0xbb, 0x08, + 0x00, 0x00, 0xbb, 0x08, 0x00, 0x00, 0xba, 0x08, 0x00, 0x00, 0xfa, 0x08, 0x00, 0x00, 0xf9, 0x08, 0x00, 0x00, 0xf7, 0x08, 0x00, 0x00, 0xfa, 0x08, 0x00, 0x00, + 0xfa, 0x08, 0x00, 0x00, 0xfb, 0x08, 0x00, 0x00, 0xf9, 0x08, 0x00, 0x00, 0xfc, 0x08, 0x00, 0x00, 0xfa, 0x08, 0x00, 0x00, 0xba, 0x08, 0x00, 0x00, 0xba, 0x08, + 0x00, 0x00, 0xcc, 0x08, 0x00, 0x00, 0xfc, 0x08, 0x00, 0x00, 0xfb, 0x08, 0x00, 0x00, 0xfa, 0x08, 0x00, 0x00, 0xfc, 0x08, 0x00, 0x00, 0xfc, 0x08, 0x00, 0x00, + 0xfd, 0x08, 0x00, 0x00, 0xfb, 0x08, 0x00, 0x00, 0xfe, 0x08, 0x00, 0x00, 0xfc, 0x08, 0x00, 0x00, 0xcc, 0x08, 0x00, 0x00, 0xcc, 0x08, 0x00, 0x00, 0xe5, 0x08, + 0x00, 0x00, 0xfe, 0x08, 0x00, 0x00, 0xfd, 0x08, 0x00, 0x00, 0xfc, 0x08, 0x00, 0x00, 0xfe, 0x08, 0x00, 0x00, 0xfe, 0x08, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, + 0xfd, 0x08, 0x00, 0x00, 0xc8, 0x02, 0x00, 0x00, 0xfe, 0x08, 0x00, 0x00, 0xe5, 0x08, 0x00, 0x00, 0xe5, 0x08, 0x00, 0x00, 0xcd, 0x02, 0x00, 0x00, 0xc8, 0x02, + 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xfe, 0x08, 0x00, 0x00, 0xc8, 0x02, 0x00, 0x00, 0xc8, 0x02, 0x00, 0x00, 0xca, 0x02, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, + 0xc9, 0x02, 0x00, 0x00, 0xc8, 0x02, 0x00, 0x00, 0xcd, 0x02, 0x00, 0x00, 0xcd, 0x02, 0x00, 0x00, 0xcc, 0x02, 0x00, 0x00, 0xc9, 0x02, 0x00, 0x00, 0xc9, 0x02, + 0x00, 0x00, 0xce, 0x02, 0x00, 0x00, 0xc0, 0x02, 0x00, 0x00, 0xc0, 0x02, 0x00, 0x00, 0xdc, 0x02, 0x00, 0x00, 0xc9, 0x02, 0x00, 0x00, 0xf8, 0x08, 0x00, 0x00, + 0xf9, 0x08, 0x00, 0x00, 0xd0, 0x02, 0x00, 0x00, 0xd0, 0x02, 0x00, 0x00, 0xcf, 0x02, 0x00, 0x00, 0xf8, 0x08, 0x00, 0x00, 0xd0, 0x02, 0x00, 0x00, 0xf9, 0x08, + 0x00, 0x00, 0xfb, 0x08, 0x00, 0x00, 0xfb, 0x08, 0x00, 0x00, 0xad, 0x08, 0x00, 0x00, 0xd0, 0x02, 0x00, 0x00, 0xcf, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, + 0xf5, 0x08, 0x00, 0x00, 0xf5, 0x08, 0x00, 0x00, 0xf8, 0x08, 0x00, 0x00, 0xcf, 0x02, 0x00, 0x00, 0x01, 0x09, 0x00, 0x00, 0xd3, 0x02, 0x00, 0x00, 0xc9, 0x02, + 0x00, 0x00, 0xc9, 0x02, 0x00, 0x00, 0xdb, 0x02, 0x00, 0x00, 0x01, 0x09, 0x00, 0x00, 0x02, 0x09, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xca, 0x02, 0x00, 0x00, + 0xca, 0x02, 0x00, 0x00, 0xd3, 0x02, 0x00, 0x00, 0x02, 0x09, 0x00, 0x00, 0xd2, 0x02, 0x00, 0x00, 0xb0, 0x02, 0x00, 0x00, 0xd6, 0x02, 0x00, 0x00, 0xd6, 0x02, + 0x00, 0x00, 0xc3, 0x02, 0x00, 0x00, 0xd2, 0x02, 0x00, 0x00, 0xd2, 0x02, 0x00, 0x00, 0xc7, 0x02, 0x00, 0x00, 0xf5, 0x08, 0x00, 0x00, 0xf5, 0x08, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x00, 0xd2, 0x02, 0x00, 0x00, 0xae, 0x08, 0x00, 0x00, 0xfd, 0x08, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0x02, 0x09, + 0x00, 0x00, 0xae, 0x08, 0x00, 0x00, 0x02, 0x09, 0x00, 0x00, 0xd3, 0x02, 0x00, 0x00, 0x01, 0x09, 0x00, 0x00, 0x01, 0x09, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, + 0x02, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0xec, 0x02, 0x00, 0x00, 0xb0, 0x02, 0x00, 0x00, 0xb0, 0x02, 0x00, 0x00, 0xd2, 0x02, 0x00, 0x00, 0x00, 0x09, + 0x00, 0x00, 0xf8, 0x08, 0x00, 0x00, 0xf5, 0x08, 0x00, 0x00, 0xf4, 0x08, 0x00, 0x00, 0xf4, 0x08, 0x00, 0x00, 0xf6, 0x08, 0x00, 0x00, 0xf8, 0x08, 0x00, 0x00, + 0xd1, 0x02, 0x00, 0x00, 0xec, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0xcf, 0x02, 0x00, 0x00, 0xd1, 0x02, 0x00, 0x00, 0xad, 0x08, + 0x00, 0x00, 0xfb, 0x08, 0x00, 0x00, 0xfd, 0x08, 0x00, 0x00, 0xfd, 0x08, 0x00, 0x00, 0xae, 0x08, 0x00, 0x00, 0xad, 0x08, 0x00, 0x00, 0xae, 0x08, 0x00, 0x00, + 0x02, 0x09, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0xb3, 0x02, 0x00, 0x00, 0xae, 0x08, 0x00, 0x00, 0xc5, 0x02, 0x00, 0x00, 0xc3, 0x02, + 0x00, 0x00, 0xd6, 0x02, 0x00, 0x00, 0xd6, 0x02, 0x00, 0x00, 0xd5, 0x02, 0x00, 0x00, 0xc5, 0x02, 0x00, 0x00, 0xb0, 0x02, 0x00, 0x00, 0xaf, 0x02, 0x00, 0x00, + 0xd4, 0x02, 0x00, 0x00, 0xd4, 0x02, 0x00, 0x00, 0xd6, 0x02, 0x00, 0x00, 0xb0, 0x02, 0x00, 0x00, 0xdc, 0x02, 0x00, 0x00, 0xc0, 0x02, 0x00, 0x00, 0xeb, 0x08, + 0x00, 0x00, 0xeb, 0x08, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0xdc, 0x02, 0x00, 0x00, 0xeb, 0x08, 0x00, 0x00, 0xec, 0x08, 0x00, 0x00, 0x05, 0x09, 0x00, 0x00, + 0x05, 0x09, 0x00, 0x00, 0x06, 0x09, 0x00, 0x00, 0xeb, 0x08, 0x00, 0x00, 0xe7, 0x08, 0x00, 0x00, 0xda, 0x02, 0x00, 0x00, 0xd9, 0x02, 0x00, 0x00, 0xd9, 0x02, + 0x00, 0x00, 0xd8, 0x02, 0x00, 0x00, 0xe7, 0x08, 0x00, 0x00, 0xd5, 0x02, 0x00, 0x00, 0xd7, 0x02, 0x00, 0x00, 0xd9, 0x02, 0x00, 0x00, 0xd9, 0x02, 0x00, 0x00, + 0xc5, 0x02, 0x00, 0x00, 0xd5, 0x02, 0x00, 0x00, 0x07, 0x09, 0x00, 0x00, 0xe7, 0x08, 0x00, 0x00, 0xd8, 0x02, 0x00, 0x00, 0xd8, 0x02, 0x00, 0x00, 0xa9, 0x08, + 0x00, 0x00, 0x07, 0x09, 0x00, 0x00, 0x07, 0x09, 0x00, 0x00, 0x08, 0x09, 0x00, 0x00, 0xe8, 0x08, 0x00, 0x00, 0xe8, 0x08, 0x00, 0x00, 0xe7, 0x08, 0x00, 0x00, + 0x07, 0x09, 0x00, 0x00, 0xef, 0x08, 0x00, 0x00, 0xe8, 0x08, 0x00, 0x00, 0x08, 0x09, 0x00, 0x00, 0x08, 0x09, 0x00, 0x00, 0x09, 0x09, 0x00, 0x00, 0xef, 0x08, + 0x00, 0x00, 0x09, 0x09, 0x00, 0x00, 0xf9, 0x02, 0x00, 0x00, 0xf2, 0x08, 0x00, 0x00, 0xf2, 0x08, 0x00, 0x00, 0xef, 0x08, 0x00, 0x00, 0x09, 0x09, 0x00, 0x00, + 0xf9, 0x02, 0x00, 0x00, 0x0a, 0x09, 0x00, 0x00, 0xf3, 0x08, 0x00, 0x00, 0xf3, 0x08, 0x00, 0x00, 0xf2, 0x08, 0x00, 0x00, 0xf9, 0x02, 0x00, 0x00, 0x0a, 0x09, + 0x00, 0x00, 0x05, 0x09, 0x00, 0x00, 0xec, 0x08, 0x00, 0x00, 0xec, 0x08, 0x00, 0x00, 0xf3, 0x08, 0x00, 0x00, 0x0a, 0x09, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00, + 0xeb, 0x08, 0x00, 0x00, 0x06, 0x09, 0x00, 0x00, 0x06, 0x09, 0x00, 0x00, 0xf0, 0x02, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0xdb, 0x02, 0x00, 0x00, 0xdc, 0x02, + 0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0x0b, 0x09, 0x00, 0x00, 0xdb, 0x02, 0x00, 0x00, 0x0c, 0x09, 0x00, 0x00, 0x0d, 0x09, 0x00, 0x00, + 0x0e, 0x09, 0x00, 0x00, 0x0e, 0x09, 0x00, 0x00, 0x0f, 0x09, 0x00, 0x00, 0x0c, 0x09, 0x00, 0x00, 0x10, 0x09, 0x00, 0x00, 0x11, 0x09, 0x00, 0x00, 0x0d, 0x09, + 0x00, 0x00, 0x0d, 0x09, 0x00, 0x00, 0x0c, 0x09, 0x00, 0x00, 0x10, 0x09, 0x00, 0x00, 0x0d, 0x09, 0x00, 0x00, 0x12, 0x09, 0x00, 0x00, 0x13, 0x09, 0x00, 0x00, + 0x13, 0x09, 0x00, 0x00, 0x0e, 0x09, 0x00, 0x00, 0x0d, 0x09, 0x00, 0x00, 0x0f, 0x09, 0x00, 0x00, 0x0e, 0x09, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x14, 0x09, + 0x00, 0x00, 0x15, 0x09, 0x00, 0x00, 0x0f, 0x09, 0x00, 0x00, 0x16, 0x09, 0x00, 0x00, 0x0c, 0x09, 0x00, 0x00, 0x0f, 0x09, 0x00, 0x00, 0x0f, 0x09, 0x00, 0x00, + 0x17, 0x09, 0x00, 0x00, 0x16, 0x09, 0x00, 0x00, 0xde, 0x02, 0x00, 0x00, 0xdd, 0x02, 0x00, 0x00, 0x18, 0x09, 0x00, 0x00, 0x18, 0x09, 0x00, 0x00, 0x19, 0x09, + 0x00, 0x00, 0xde, 0x02, 0x00, 0x00, 0x1a, 0x09, 0x00, 0x00, 0x1b, 0x09, 0x00, 0x00, 0x18, 0x09, 0x00, 0x00, 0x18, 0x09, 0x00, 0x00, 0xdd, 0x02, 0x00, 0x00, + 0x1a, 0x09, 0x00, 0x00, 0xde, 0x02, 0x00, 0x00, 0x19, 0x09, 0x00, 0x00, 0x1c, 0x09, 0x00, 0x00, 0x1c, 0x09, 0x00, 0x00, 0x11, 0x09, 0x00, 0x00, 0xde, 0x02, + 0x00, 0x00, 0xdf, 0x02, 0x00, 0x00, 0xde, 0x02, 0x00, 0x00, 0x11, 0x09, 0x00, 0x00, 0x11, 0x09, 0x00, 0x00, 0x10, 0x09, 0x00, 0x00, 0xdf, 0x02, 0x00, 0x00, + 0x1d, 0x09, 0x00, 0x00, 0x1a, 0x09, 0x00, 0x00, 0xdd, 0x02, 0x00, 0x00, 0xdd, 0x02, 0x00, 0x00, 0xdf, 0x02, 0x00, 0x00, 0x1d, 0x09, 0x00, 0x00, 0x1e, 0x09, + 0x00, 0x00, 0x25, 0x03, 0x00, 0x00, 0xe0, 0x02, 0x00, 0x00, 0xe0, 0x02, 0x00, 0x00, 0xe2, 0x02, 0x00, 0x00, 0x1e, 0x09, 0x00, 0x00, 0x23, 0x03, 0x00, 0x00, + 0x22, 0x03, 0x00, 0x00, 0x25, 0x03, 0x00, 0x00, 0x25, 0x03, 0x00, 0x00, 0x1e, 0x09, 0x00, 0x00, 0x23, 0x03, 0x00, 0x00, 0x1f, 0x09, 0x00, 0x00, 0xe0, 0x02, + 0x00, 0x00, 0x25, 0x03, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0x21, 0x09, 0x00, 0x00, 0x1e, 0x09, 0x00, 0x00, 0x1e, 0x09, 0x00, 0x00, 0xe2, 0x02, 0x00, 0x00, + 0x20, 0x09, 0x00, 0x00, 0xd3, 0x06, 0x00, 0x00, 0xd2, 0x06, 0x00, 0x00, 0x22, 0x09, 0x00, 0x00, 0x22, 0x09, 0x00, 0x00, 0x23, 0x09, 0x00, 0x00, 0xd3, 0x06, + 0x00, 0x00, 0x24, 0x09, 0x00, 0x00, 0x22, 0x09, 0x00, 0x00, 0xd2, 0x06, 0x00, 0x00, 0xd2, 0x06, 0x00, 0x00, 0xd0, 0x06, 0x00, 0x00, 0x24, 0x09, 0x00, 0x00, + 0xee, 0x02, 0x00, 0x00, 0xed, 0x02, 0x00, 0x00, 0x23, 0x09, 0x00, 0x00, 0x23, 0x09, 0x00, 0x00, 0x22, 0x09, 0x00, 0x00, 0xee, 0x02, 0x00, 0x00, 0x23, 0x09, + 0x00, 0x00, 0x25, 0x09, 0x00, 0x00, 0xb7, 0x06, 0x00, 0x00, 0xb7, 0x06, 0x00, 0x00, 0xd3, 0x06, 0x00, 0x00, 0x23, 0x09, 0x00, 0x00, 0x26, 0x09, 0x00, 0x00, + 0x27, 0x09, 0x00, 0x00, 0x28, 0x09, 0x00, 0x00, 0x28, 0x09, 0x00, 0x00, 0x59, 0x08, 0x00, 0x00, 0x26, 0x09, 0x00, 0x00, 0x26, 0x09, 0x00, 0x00, 0xb0, 0x06, + 0x00, 0x00, 0xaf, 0x06, 0x00, 0x00, 0xaf, 0x06, 0x00, 0x00, 0x27, 0x09, 0x00, 0x00, 0x26, 0x09, 0x00, 0x00, 0x29, 0x09, 0x00, 0x00, 0x2a, 0x09, 0x00, 0x00, + 0x28, 0x09, 0x00, 0x00, 0x28, 0x09, 0x00, 0x00, 0x27, 0x09, 0x00, 0x00, 0x29, 0x09, 0x00, 0x00, 0x30, 0x08, 0x00, 0x00, 0x6c, 0x02, 0x00, 0x00, 0x59, 0x08, + 0x00, 0x00, 0x59, 0x08, 0x00, 0x00, 0x28, 0x09, 0x00, 0x00, 0x30, 0x08, 0x00, 0x00, 0x58, 0x08, 0x00, 0x00, 0x2b, 0x09, 0x00, 0x00, 0x26, 0x09, 0x00, 0x00, + 0x26, 0x09, 0x00, 0x00, 0x59, 0x08, 0x00, 0x00, 0x58, 0x08, 0x00, 0x00, 0x2b, 0x09, 0x00, 0x00, 0xba, 0x06, 0x00, 0x00, 0xb0, 0x06, 0x00, 0x00, 0xb0, 0x06, + 0x00, 0x00, 0x26, 0x09, 0x00, 0x00, 0x2b, 0x09, 0x00, 0x00, 0xb9, 0x06, 0x00, 0x00, 0x29, 0x09, 0x00, 0x00, 0x27, 0x09, 0x00, 0x00, 0x27, 0x09, 0x00, 0x00, + 0xaf, 0x06, 0x00, 0x00, 0xb9, 0x06, 0x00, 0x00, 0x06, 0x09, 0x00, 0x00, 0x05, 0x09, 0x00, 0x00, 0x2c, 0x09, 0x00, 0x00, 0x2c, 0x09, 0x00, 0x00, 0x2d, 0x09, + 0x00, 0x00, 0x06, 0x09, 0x00, 0x00, 0x2e, 0x09, 0x00, 0x00, 0x2c, 0x09, 0x00, 0x00, 0x05, 0x09, 0x00, 0x00, 0x05, 0x09, 0x00, 0x00, 0x0a, 0x09, 0x00, 0x00, + 0x2e, 0x09, 0x00, 0x00, 0x2c, 0x08, 0x00, 0x00, 0x2f, 0x09, 0x00, 0x00, 0x2d, 0x09, 0x00, 0x00, 0x2d, 0x09, 0x00, 0x00, 0x2c, 0x09, 0x00, 0x00, 0x2c, 0x08, + 0x00, 0x00, 0xf0, 0x02, 0x00, 0x00, 0x06, 0x09, 0x00, 0x00, 0x2d, 0x09, 0x00, 0x00, 0x2d, 0x09, 0x00, 0x00, 0xf1, 0x02, 0x00, 0x00, 0xf0, 0x02, 0x00, 0x00, + 0x30, 0x09, 0x00, 0x00, 0x0b, 0x09, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0xf0, 0x02, 0x00, 0x00, 0x30, 0x09, 0x00, 0x00, 0xf8, 0x02, + 0x00, 0x00, 0x2e, 0x09, 0x00, 0x00, 0x0a, 0x09, 0x00, 0x00, 0x0a, 0x09, 0x00, 0x00, 0xf9, 0x02, 0x00, 0x00, 0xf8, 0x02, 0x00, 0x00, 0x31, 0x09, 0x00, 0x00, + 0xfa, 0x02, 0x00, 0x00, 0xf9, 0x02, 0x00, 0x00, 0xf9, 0x02, 0x00, 0x00, 0x09, 0x09, 0x00, 0x00, 0x31, 0x09, 0x00, 0x00, 0xa8, 0x02, 0x00, 0x00, 0x31, 0x09, + 0x00, 0x00, 0x09, 0x09, 0x00, 0x00, 0x09, 0x09, 0x00, 0x00, 0x08, 0x09, 0x00, 0x00, 0xa8, 0x02, 0x00, 0x00, 0x32, 0x09, 0x00, 0x00, 0xa8, 0x02, 0x00, 0x00, + 0x08, 0x09, 0x00, 0x00, 0x08, 0x09, 0x00, 0x00, 0x07, 0x09, 0x00, 0x00, 0x32, 0x09, 0x00, 0x00, 0xa6, 0x08, 0x00, 0x00, 0x32, 0x09, 0x00, 0x00, 0x07, 0x09, + 0x00, 0x00, 0x07, 0x09, 0x00, 0x00, 0xa9, 0x08, 0x00, 0x00, 0xa6, 0x08, 0x00, 0x00, 0xae, 0x02, 0x00, 0x00, 0xe4, 0x02, 0x00, 0x00, 0x0b, 0x09, 0x00, 0x00, + 0x0b, 0x09, 0x00, 0x00, 0x30, 0x09, 0x00, 0x00, 0xae, 0x02, 0x00, 0x00, 0xf2, 0x02, 0x00, 0x00, 0x33, 0x09, 0x00, 0x00, 0x30, 0x09, 0x00, 0x00, 0x30, 0x09, + 0x00, 0x00, 0xf0, 0x02, 0x00, 0x00, 0xf2, 0x02, 0x00, 0x00, 0xe4, 0x02, 0x00, 0x00, 0x01, 0x09, 0x00, 0x00, 0xdb, 0x02, 0x00, 0x00, 0xdb, 0x02, 0x00, 0x00, + 0x0b, 0x09, 0x00, 0x00, 0xe4, 0x02, 0x00, 0x00, 0xe3, 0x02, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x01, 0x09, 0x00, 0x00, 0x01, 0x09, 0x00, 0x00, 0xe4, 0x02, + 0x00, 0x00, 0xe3, 0x02, 0x00, 0x00, 0xaf, 0x08, 0x00, 0x00, 0xb3, 0x02, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0xe3, 0x02, 0x00, 0x00, + 0xaf, 0x08, 0x00, 0x00, 0xca, 0x04, 0x00, 0x00, 0xaf, 0x08, 0x00, 0x00, 0xe3, 0x02, 0x00, 0x00, 0xe3, 0x02, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0xca, 0x04, + 0x00, 0x00, 0xcc, 0x04, 0x00, 0x00, 0x2a, 0x08, 0x00, 0x00, 0xaf, 0x08, 0x00, 0x00, 0xaf, 0x08, 0x00, 0x00, 0xca, 0x04, 0x00, 0x00, 0xcc, 0x04, 0x00, 0x00, + 0x32, 0x09, 0x00, 0x00, 0xa6, 0x08, 0x00, 0x00, 0x92, 0x08, 0x00, 0x00, 0x92, 0x08, 0x00, 0x00, 0x91, 0x08, 0x00, 0x00, 0x32, 0x09, 0x00, 0x00, 0x31, 0x09, + 0x00, 0x00, 0xa8, 0x02, 0x00, 0x00, 0xaa, 0x02, 0x00, 0x00, 0xaa, 0x02, 0x00, 0x00, 0xab, 0x08, 0x00, 0x00, 0x31, 0x09, 0x00, 0x00, 0x34, 0x09, 0x00, 0x00, + 0xab, 0x08, 0x00, 0x00, 0xe7, 0x02, 0x00, 0x00, 0xe7, 0x02, 0x00, 0x00, 0xe6, 0x02, 0x00, 0x00, 0x34, 0x09, 0x00, 0x00, 0xfa, 0x02, 0x00, 0x00, 0x31, 0x09, + 0x00, 0x00, 0xab, 0x08, 0x00, 0x00, 0xab, 0x08, 0x00, 0x00, 0x34, 0x09, 0x00, 0x00, 0xfa, 0x02, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x00, 0x34, 0x09, 0x00, 0x00, + 0xe6, 0x02, 0x00, 0x00, 0xe6, 0x02, 0x00, 0x00, 0xe9, 0x02, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x00, 0xf8, 0x02, 0x00, 0x00, 0xfa, 0x02, 0x00, 0x00, 0x34, 0x09, + 0x00, 0x00, 0x34, 0x09, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x00, 0xf8, 0x02, 0x00, 0x00, 0xe6, 0x02, 0x00, 0x00, 0xe5, 0x02, 0x00, 0x00, 0xea, 0x02, 0x00, 0x00, + 0xea, 0x02, 0x00, 0x00, 0xe9, 0x02, 0x00, 0x00, 0xe6, 0x02, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x00, 0x3d, 0x02, 0x00, 0x00, 0x2e, 0x09, 0x00, 0x00, 0x2e, 0x09, + 0x00, 0x00, 0xf8, 0x02, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x00, 0x2c, 0x09, 0x00, 0x00, 0x2e, 0x09, 0x00, 0x00, 0x3d, 0x02, 0x00, 0x00, 0x3d, 0x02, 0x00, 0x00, + 0x2c, 0x08, 0x00, 0x00, 0x2c, 0x09, 0x00, 0x00, 0x3f, 0x02, 0x00, 0x00, 0x35, 0x09, 0x00, 0x00, 0x2d, 0x08, 0x00, 0x00, 0x2d, 0x08, 0x00, 0x00, 0x3c, 0x02, + 0x00, 0x00, 0x3f, 0x02, 0x00, 0x00, 0x2f, 0x09, 0x00, 0x00, 0x2c, 0x08, 0x00, 0x00, 0x2d, 0x08, 0x00, 0x00, 0x2d, 0x08, 0x00, 0x00, 0x36, 0x09, 0x00, 0x00, + 0x2f, 0x09, 0x00, 0x00, 0xea, 0x02, 0x00, 0x00, 0xe5, 0x02, 0x00, 0x00, 0x70, 0x02, 0x00, 0x00, 0x70, 0x02, 0x00, 0x00, 0x53, 0x08, 0x00, 0x00, 0xea, 0x02, + 0x00, 0x00, 0x3e, 0x02, 0x00, 0x00, 0x49, 0x08, 0x00, 0x00, 0x45, 0x08, 0x00, 0x00, 0x45, 0x08, 0x00, 0x00, 0x3f, 0x02, 0x00, 0x00, 0x3e, 0x02, 0x00, 0x00, + 0xe3, 0x08, 0x00, 0x00, 0xe2, 0x08, 0x00, 0x00, 0xdf, 0x08, 0x00, 0x00, 0xdf, 0x08, 0x00, 0x00, 0xbd, 0x08, 0x00, 0x00, 0xe3, 0x08, 0x00, 0x00, 0xed, 0x02, + 0x00, 0x00, 0x37, 0x09, 0x00, 0x00, 0x25, 0x09, 0x00, 0x00, 0x25, 0x09, 0x00, 0x00, 0x23, 0x09, 0x00, 0x00, 0xed, 0x02, 0x00, 0x00, 0x2a, 0x03, 0x00, 0x00, + 0xee, 0x02, 0x00, 0x00, 0x22, 0x09, 0x00, 0x00, 0x22, 0x09, 0x00, 0x00, 0x24, 0x09, 0x00, 0x00, 0x2a, 0x03, 0x00, 0x00, 0xed, 0x02, 0x00, 0x00, 0xef, 0x02, + 0x00, 0x00, 0x4d, 0x02, 0x00, 0x00, 0x4d, 0x02, 0x00, 0x00, 0x37, 0x09, 0x00, 0x00, 0xed, 0x02, 0x00, 0x00, 0x37, 0x09, 0x00, 0x00, 0x38, 0x09, 0x00, 0x00, + 0x39, 0x09, 0x00, 0x00, 0x39, 0x09, 0x00, 0x00, 0x25, 0x09, 0x00, 0x00, 0x37, 0x09, 0x00, 0x00, 0x37, 0x09, 0x00, 0x00, 0x4d, 0x02, 0x00, 0x00, 0x4c, 0x02, + 0x00, 0x00, 0x4c, 0x02, 0x00, 0x00, 0x38, 0x09, 0x00, 0x00, 0x37, 0x09, 0x00, 0x00, 0x2a, 0x09, 0x00, 0x00, 0x29, 0x09, 0x00, 0x00, 0x39, 0x09, 0x00, 0x00, + 0x39, 0x09, 0x00, 0x00, 0x38, 0x09, 0x00, 0x00, 0x2a, 0x09, 0x00, 0x00, 0x25, 0x09, 0x00, 0x00, 0x39, 0x09, 0x00, 0x00, 0xb8, 0x06, 0x00, 0x00, 0xb8, 0x06, + 0x00, 0x00, 0xb7, 0x06, 0x00, 0x00, 0x25, 0x09, 0x00, 0x00, 0x39, 0x09, 0x00, 0x00, 0x29, 0x09, 0x00, 0x00, 0xb9, 0x06, 0x00, 0x00, 0xb9, 0x06, 0x00, 0x00, + 0xb8, 0x06, 0x00, 0x00, 0x39, 0x09, 0x00, 0x00, 0x31, 0x08, 0x00, 0x00, 0x2a, 0x09, 0x00, 0x00, 0x38, 0x09, 0x00, 0x00, 0x38, 0x09, 0x00, 0x00, 0x4c, 0x02, + 0x00, 0x00, 0x31, 0x08, 0x00, 0x00, 0x2a, 0x09, 0x00, 0x00, 0x31, 0x08, 0x00, 0x00, 0x30, 0x08, 0x00, 0x00, 0x30, 0x08, 0x00, 0x00, 0x28, 0x09, 0x00, 0x00, + 0x2a, 0x09, 0x00, 0x00, 0x58, 0x08, 0x00, 0x00, 0x6d, 0x02, 0x00, 0x00, 0x6e, 0x02, 0x00, 0x00, 0x6e, 0x02, 0x00, 0x00, 0xdc, 0x04, 0x00, 0x00, 0x58, 0x08, + 0x00, 0x00, 0x2b, 0x09, 0x00, 0x00, 0x58, 0x08, 0x00, 0x00, 0xdc, 0x04, 0x00, 0x00, 0xdc, 0x04, 0x00, 0x00, 0xde, 0x04, 0x00, 0x00, 0x2b, 0x09, 0x00, 0x00, + 0xde, 0x04, 0x00, 0x00, 0x52, 0x04, 0x00, 0x00, 0xba, 0x06, 0x00, 0x00, 0xba, 0x06, 0x00, 0x00, 0x2b, 0x09, 0x00, 0x00, 0xde, 0x04, 0x00, 0x00, 0xa0, 0x08, + 0x00, 0x00, 0x90, 0x08, 0x00, 0x00, 0x8f, 0x08, 0x00, 0x00, 0x8f, 0x08, 0x00, 0x00, 0xa7, 0x02, 0x00, 0x00, 0xa0, 0x08, 0x00, 0x00, 0xf2, 0x02, 0x00, 0x00, + 0xf1, 0x02, 0x00, 0x00, 0xf4, 0x02, 0x00, 0x00, 0xf4, 0x02, 0x00, 0x00, 0x3a, 0x09, 0x00, 0x00, 0xf2, 0x02, 0x00, 0x00, 0x2f, 0x09, 0x00, 0x00, 0xf3, 0x02, + 0x00, 0x00, 0xf1, 0x02, 0x00, 0x00, 0xf1, 0x02, 0x00, 0x00, 0x2d, 0x09, 0x00, 0x00, 0x2f, 0x09, 0x00, 0x00, 0x3a, 0x09, 0x00, 0x00, 0xf4, 0x02, 0x00, 0x00, + 0xf6, 0x02, 0x00, 0x00, 0xf6, 0x02, 0x00, 0x00, 0x3b, 0x09, 0x00, 0x00, 0x3a, 0x09, 0x00, 0x00, 0x36, 0x09, 0x00, 0x00, 0xf7, 0x02, 0x00, 0x00, 0xf3, 0x02, + 0x00, 0x00, 0xf3, 0x02, 0x00, 0x00, 0x2f, 0x09, 0x00, 0x00, 0x36, 0x09, 0x00, 0x00, 0x07, 0x03, 0x00, 0x00, 0xf7, 0x02, 0x00, 0x00, 0x36, 0x09, 0x00, 0x00, + 0x36, 0x09, 0x00, 0x00, 0x3c, 0x09, 0x00, 0x00, 0x07, 0x03, 0x00, 0x00, 0x07, 0x03, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0xf5, 0x02, 0x00, 0x00, 0xf5, 0x02, + 0x00, 0x00, 0xf7, 0x02, 0x00, 0x00, 0x07, 0x03, 0x00, 0x00, 0xa8, 0x02, 0x00, 0x00, 0x32, 0x09, 0x00, 0x00, 0x91, 0x08, 0x00, 0x00, 0x91, 0x08, 0x00, 0x00, + 0xa9, 0x02, 0x00, 0x00, 0xa8, 0x02, 0x00, 0x00, 0xa8, 0x06, 0x00, 0x00, 0xc2, 0x06, 0x00, 0x00, 0xaa, 0x08, 0x00, 0x00, 0xaa, 0x08, 0x00, 0x00, 0xd4, 0x02, + 0x00, 0x00, 0xa8, 0x06, 0x00, 0x00, 0xad, 0x02, 0x00, 0x00, 0xae, 0x02, 0x00, 0x00, 0x30, 0x09, 0x00, 0x00, 0x30, 0x09, 0x00, 0x00, 0x33, 0x09, 0x00, 0x00, + 0xad, 0x02, 0x00, 0x00, 0xf6, 0x02, 0x00, 0x00, 0x5c, 0x02, 0x00, 0x00, 0x4d, 0x08, 0x00, 0x00, 0x4d, 0x08, 0x00, 0x00, 0x3b, 0x09, 0x00, 0x00, 0xf6, 0x02, + 0x00, 0x00, 0x5c, 0x02, 0x00, 0x00, 0xf6, 0x02, 0x00, 0x00, 0xf5, 0x02, 0x00, 0x00, 0xf5, 0x02, 0x00, 0x00, 0x05, 0x03, 0x00, 0x00, 0x5c, 0x02, 0x00, 0x00, + 0x3c, 0x09, 0x00, 0x00, 0x36, 0x09, 0x00, 0x00, 0x2d, 0x08, 0x00, 0x00, 0x2d, 0x08, 0x00, 0x00, 0x35, 0x09, 0x00, 0x00, 0x3c, 0x09, 0x00, 0x00, 0x5b, 0x08, + 0x00, 0x00, 0x60, 0x08, 0x00, 0x00, 0x61, 0x08, 0x00, 0x00, 0x61, 0x08, 0x00, 0x00, 0x3d, 0x09, 0x00, 0x00, 0x5b, 0x08, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, + 0x60, 0x08, 0x00, 0x00, 0x5b, 0x08, 0x00, 0x00, 0x5b, 0x08, 0x00, 0x00, 0x74, 0x02, 0x00, 0x00, 0x75, 0x02, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x9c, 0x00, + 0x00, 0x00, 0x3d, 0x09, 0x00, 0x00, 0x3d, 0x09, 0x00, 0x00, 0x61, 0x08, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x52, 0x08, 0x00, 0x00, 0x5b, 0x08, 0x00, 0x00, + 0x3d, 0x09, 0x00, 0x00, 0x3d, 0x09, 0x00, 0x00, 0x57, 0x08, 0x00, 0x00, 0x52, 0x08, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x56, 0x08, + 0x00, 0x00, 0x56, 0x08, 0x00, 0x00, 0x57, 0x08, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x53, 0x08, 0x00, 0x00, 0x67, 0x08, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, + 0xff, 0x02, 0x00, 0x00, 0xea, 0x02, 0x00, 0x00, 0x53, 0x08, 0x00, 0x00, 0x3b, 0x08, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x3f, 0x08, 0x00, 0x00, 0x3f, 0x08, + 0x00, 0x00, 0x3c, 0x08, 0x00, 0x00, 0x3b, 0x08, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x3b, 0x08, 0x00, 0x00, 0x3e, 0x09, 0x00, 0x00, 0x3e, 0x09, 0x00, 0x00, + 0x5b, 0x02, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x5a, 0x02, 0x00, 0x00, 0x48, 0x08, 0x00, 0x00, 0x42, 0x08, 0x00, 0x00, 0x42, 0x08, 0x00, 0x00, 0x41, 0x08, + 0x00, 0x00, 0x5a, 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0x67, 0x08, 0x00, 0x00, 0x42, 0x08, 0x00, 0x00, 0x42, 0x08, 0x00, 0x00, 0x48, 0x08, 0x00, 0x00, + 0xff, 0x02, 0x00, 0x00, 0xe5, 0x02, 0x00, 0x00, 0xe7, 0x02, 0x00, 0x00, 0x5a, 0x08, 0x00, 0x00, 0x5a, 0x08, 0x00, 0x00, 0x70, 0x02, 0x00, 0x00, 0xe5, 0x02, + 0x00, 0x00, 0x05, 0x05, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x61, 0x08, 0x00, 0x00, 0x61, 0x08, 0x00, 0x00, 0x5e, 0x08, 0x00, 0x00, 0x05, 0x05, 0x00, 0x00, + 0x57, 0x08, 0x00, 0x00, 0x3d, 0x09, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x57, 0x08, 0x00, 0x00, 0x3f, 0x09, + 0x00, 0x00, 0x2a, 0x03, 0x00, 0x00, 0x24, 0x09, 0x00, 0x00, 0x24, 0x09, 0x00, 0x00, 0xfd, 0x02, 0x00, 0x00, 0x3f, 0x09, 0x00, 0x00, 0x28, 0x03, 0x00, 0x00, + 0x17, 0x03, 0x00, 0x00, 0x2a, 0x03, 0x00, 0x00, 0x2a, 0x03, 0x00, 0x00, 0x3f, 0x09, 0x00, 0x00, 0x28, 0x03, 0x00, 0x00, 0xfd, 0x02, 0x00, 0x00, 0x24, 0x09, + 0x00, 0x00, 0xd0, 0x06, 0x00, 0x00, 0xd0, 0x06, 0x00, 0x00, 0xfb, 0x02, 0x00, 0x00, 0xfd, 0x02, 0x00, 0x00, 0x40, 0x09, 0x00, 0x00, 0x3f, 0x09, 0x00, 0x00, + 0xfd, 0x02, 0x00, 0x00, 0xfd, 0x02, 0x00, 0x00, 0xfc, 0x02, 0x00, 0x00, 0x40, 0x09, 0x00, 0x00, 0x29, 0x03, 0x00, 0x00, 0x28, 0x03, 0x00, 0x00, 0x3f, 0x09, + 0x00, 0x00, 0x3f, 0x09, 0x00, 0x00, 0x40, 0x09, 0x00, 0x00, 0x29, 0x03, 0x00, 0x00, 0xfc, 0x02, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x41, 0x09, 0x00, 0x00, + 0x41, 0x09, 0x00, 0x00, 0x40, 0x09, 0x00, 0x00, 0xfc, 0x02, 0x00, 0x00, 0x3b, 0x08, 0x00, 0x00, 0x3a, 0x08, 0x00, 0x00, 0x42, 0x09, 0x00, 0x00, 0x42, 0x09, + 0x00, 0x00, 0x3e, 0x09, 0x00, 0x00, 0x3b, 0x08, 0x00, 0x00, 0x38, 0x08, 0x00, 0x00, 0x43, 0x09, 0x00, 0x00, 0x42, 0x09, 0x00, 0x00, 0x42, 0x09, 0x00, 0x00, + 0x3a, 0x08, 0x00, 0x00, 0x38, 0x08, 0x00, 0x00, 0x46, 0x08, 0x00, 0x00, 0x59, 0x02, 0x00, 0x00, 0x5b, 0x02, 0x00, 0x00, 0x5b, 0x02, 0x00, 0x00, 0x44, 0x09, + 0x00, 0x00, 0x46, 0x08, 0x00, 0x00, 0x45, 0x08, 0x00, 0x00, 0x46, 0x08, 0x00, 0x00, 0x44, 0x09, 0x00, 0x00, 0x44, 0x09, 0x00, 0x00, 0x3f, 0x02, 0x00, 0x00, + 0x45, 0x08, 0x00, 0x00, 0x45, 0x09, 0x00, 0x00, 0x35, 0x09, 0x00, 0x00, 0x3f, 0x02, 0x00, 0x00, 0x3f, 0x02, 0x00, 0x00, 0x44, 0x09, 0x00, 0x00, 0x45, 0x09, + 0x00, 0x00, 0x46, 0x09, 0x00, 0x00, 0x45, 0x09, 0x00, 0x00, 0x44, 0x09, 0x00, 0x00, 0x44, 0x09, 0x00, 0x00, 0x5b, 0x02, 0x00, 0x00, 0x46, 0x09, 0x00, 0x00, + 0x47, 0x09, 0x00, 0x00, 0x46, 0x09, 0x00, 0x00, 0x5b, 0x02, 0x00, 0x00, 0x5b, 0x02, 0x00, 0x00, 0x3e, 0x09, 0x00, 0x00, 0x47, 0x09, 0x00, 0x00, 0x48, 0x09, + 0x00, 0x00, 0x47, 0x09, 0x00, 0x00, 0x3e, 0x09, 0x00, 0x00, 0x3e, 0x09, 0x00, 0x00, 0x42, 0x09, 0x00, 0x00, 0x48, 0x09, 0x00, 0x00, 0x43, 0x09, 0x00, 0x00, + 0x38, 0x08, 0x00, 0x00, 0x37, 0x08, 0x00, 0x00, 0x37, 0x08, 0x00, 0x00, 0x49, 0x09, 0x00, 0x00, 0x43, 0x09, 0x00, 0x00, 0x4a, 0x09, 0x00, 0x00, 0x48, 0x09, + 0x00, 0x00, 0x42, 0x09, 0x00, 0x00, 0x42, 0x09, 0x00, 0x00, 0x43, 0x09, 0x00, 0x00, 0x4a, 0x09, 0x00, 0x00, 0x0f, 0x03, 0x00, 0x00, 0x0e, 0x03, 0x00, 0x00, + 0x48, 0x09, 0x00, 0x00, 0x48, 0x09, 0x00, 0x00, 0x4a, 0x09, 0x00, 0x00, 0x0f, 0x03, 0x00, 0x00, 0x4a, 0x09, 0x00, 0x00, 0x43, 0x09, 0x00, 0x00, 0x49, 0x09, + 0x00, 0x00, 0x49, 0x09, 0x00, 0x00, 0x4b, 0x09, 0x00, 0x00, 0x4a, 0x09, 0x00, 0x00, 0x0e, 0x03, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x47, 0x09, 0x00, 0x00, + 0x47, 0x09, 0x00, 0x00, 0x48, 0x09, 0x00, 0x00, 0x0e, 0x03, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x0b, 0x03, 0x00, 0x00, 0x46, 0x09, 0x00, 0x00, 0x46, 0x09, + 0x00, 0x00, 0x47, 0x09, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x0b, 0x03, 0x00, 0x00, 0x4c, 0x09, 0x00, 0x00, 0x45, 0x09, 0x00, 0x00, 0x45, 0x09, 0x00, 0x00, + 0x46, 0x09, 0x00, 0x00, 0x0b, 0x03, 0x00, 0x00, 0x4c, 0x09, 0x00, 0x00, 0x3c, 0x09, 0x00, 0x00, 0x35, 0x09, 0x00, 0x00, 0x35, 0x09, 0x00, 0x00, 0x45, 0x09, + 0x00, 0x00, 0x4c, 0x09, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x13, 0x03, 0x00, 0x00, 0x13, 0x03, 0x00, 0x00, 0x23, 0x08, 0x00, 0x00, + 0x02, 0x03, 0x00, 0x00, 0x07, 0x03, 0x00, 0x00, 0x4d, 0x09, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x07, 0x03, + 0x00, 0x00, 0x4d, 0x09, 0x00, 0x00, 0x07, 0x03, 0x00, 0x00, 0x3c, 0x09, 0x00, 0x00, 0x3c, 0x09, 0x00, 0x00, 0x4c, 0x09, 0x00, 0x00, 0x4d, 0x09, 0x00, 0x00, + 0x4d, 0x09, 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x4d, 0x09, 0x00, 0x00, 0x0a, 0x03, + 0x00, 0x00, 0x4d, 0x09, 0x00, 0x00, 0x4c, 0x09, 0x00, 0x00, 0x4c, 0x09, 0x00, 0x00, 0x0b, 0x03, 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, + 0x09, 0x03, 0x00, 0x00, 0x4e, 0x09, 0x00, 0x00, 0x4e, 0x09, 0x00, 0x00, 0x14, 0x03, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x0a, 0x03, + 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x0e, 0x03, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, + 0x16, 0x03, 0x00, 0x00, 0x16, 0x03, 0x00, 0x00, 0x4e, 0x09, 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0x0d, 0x03, 0x00, 0x00, 0x0f, 0x03, 0x00, 0x00, 0x4f, 0x09, + 0x00, 0x00, 0x4f, 0x09, 0x00, 0x00, 0x50, 0x09, 0x00, 0x00, 0x0d, 0x03, 0x00, 0x00, 0x0f, 0x03, 0x00, 0x00, 0x4a, 0x09, 0x00, 0x00, 0x4b, 0x09, 0x00, 0x00, + 0x4b, 0x09, 0x00, 0x00, 0x4f, 0x09, 0x00, 0x00, 0x0f, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, 0x23, 0x08, 0x00, 0x00, 0x23, 0x08, + 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, 0x32, 0x02, 0x00, 0x00, 0x11, 0x03, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, + 0x23, 0x08, 0x00, 0x00, 0x32, 0x02, 0x00, 0x00, 0x51, 0x09, 0x00, 0x00, 0x11, 0x03, 0x00, 0x00, 0x32, 0x02, 0x00, 0x00, 0x32, 0x02, 0x00, 0x00, 0x34, 0x02, + 0x00, 0x00, 0x51, 0x09, 0x00, 0x00, 0x86, 0x03, 0x00, 0x00, 0x51, 0x08, 0x00, 0x00, 0x4f, 0x08, 0x00, 0x00, 0x4f, 0x08, 0x00, 0x00, 0x47, 0x03, 0x00, 0x00, + 0x86, 0x03, 0x00, 0x00, 0x86, 0x03, 0x00, 0x00, 0x3d, 0x03, 0x00, 0x00, 0x3c, 0x03, 0x00, 0x00, 0x3c, 0x03, 0x00, 0x00, 0x51, 0x08, 0x00, 0x00, 0x86, 0x03, + 0x00, 0x00, 0x28, 0x08, 0x00, 0x00, 0x4e, 0x09, 0x00, 0x00, 0x16, 0x03, 0x00, 0x00, 0x16, 0x03, 0x00, 0x00, 0x52, 0x09, 0x00, 0x00, 0x28, 0x08, 0x00, 0x00, + 0x24, 0x08, 0x00, 0x00, 0x14, 0x03, 0x00, 0x00, 0x4e, 0x09, 0x00, 0x00, 0x4e, 0x09, 0x00, 0x00, 0x28, 0x08, 0x00, 0x00, 0x24, 0x08, 0x00, 0x00, 0x52, 0x09, + 0x00, 0x00, 0x16, 0x03, 0x00, 0x00, 0x15, 0x03, 0x00, 0x00, 0x15, 0x03, 0x00, 0x00, 0x53, 0x09, 0x00, 0x00, 0x52, 0x09, 0x00, 0x00, 0x26, 0x08, 0x00, 0x00, + 0x28, 0x08, 0x00, 0x00, 0x52, 0x09, 0x00, 0x00, 0x52, 0x09, 0x00, 0x00, 0x1c, 0x03, 0x00, 0x00, 0x26, 0x08, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x0d, 0x03, + 0x00, 0x00, 0x50, 0x09, 0x00, 0x00, 0x50, 0x09, 0x00, 0x00, 0x15, 0x03, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x53, 0x09, 0x00, 0x00, 0x15, 0x03, 0x00, 0x00, + 0x50, 0x09, 0x00, 0x00, 0x50, 0x09, 0x00, 0x00, 0x54, 0x09, 0x00, 0x00, 0x53, 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0x54, 0x09, 0x00, 0x00, 0x50, 0x09, + 0x00, 0x00, 0x50, 0x09, 0x00, 0x00, 0x4f, 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0x4f, 0x09, 0x00, 0x00, + 0x4f, 0x09, 0x00, 0x00, 0x4b, 0x09, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0x21, 0x09, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0x4b, 0x09, 0x00, 0x00, 0x4b, 0x09, + 0x00, 0x00, 0x49, 0x09, 0x00, 0x00, 0x21, 0x09, 0x00, 0x00, 0x56, 0x09, 0x00, 0x00, 0x21, 0x09, 0x00, 0x00, 0x49, 0x09, 0x00, 0x00, 0x49, 0x09, 0x00, 0x00, + 0x37, 0x08, 0x00, 0x00, 0x56, 0x09, 0x00, 0x00, 0x57, 0x09, 0x00, 0x00, 0x56, 0x09, 0x00, 0x00, 0x37, 0x08, 0x00, 0x00, 0x37, 0x08, 0x00, 0x00, 0x4e, 0x02, + 0x00, 0x00, 0x57, 0x09, 0x00, 0x00, 0x57, 0x09, 0x00, 0x00, 0x4e, 0x02, 0x00, 0x00, 0x36, 0x08, 0x00, 0x00, 0x36, 0x08, 0x00, 0x00, 0x27, 0x03, 0x00, 0x00, + 0x57, 0x09, 0x00, 0x00, 0x28, 0x03, 0x00, 0x00, 0x27, 0x03, 0x00, 0x00, 0x36, 0x08, 0x00, 0x00, 0x36, 0x08, 0x00, 0x00, 0x35, 0x08, 0x00, 0x00, 0x28, 0x03, + 0x00, 0x00, 0x1b, 0x03, 0x00, 0x00, 0x58, 0x09, 0x00, 0x00, 0x59, 0x09, 0x00, 0x00, 0x59, 0x09, 0x00, 0x00, 0x5a, 0x09, 0x00, 0x00, 0x1b, 0x03, 0x00, 0x00, + 0x1a, 0x03, 0x00, 0x00, 0x5b, 0x09, 0x00, 0x00, 0x58, 0x09, 0x00, 0x00, 0x58, 0x09, 0x00, 0x00, 0x1b, 0x03, 0x00, 0x00, 0x1a, 0x03, 0x00, 0x00, 0x58, 0x09, + 0x00, 0x00, 0x1d, 0x09, 0x00, 0x00, 0xdf, 0x02, 0x00, 0x00, 0xdf, 0x02, 0x00, 0x00, 0x59, 0x09, 0x00, 0x00, 0x58, 0x09, 0x00, 0x00, 0x5a, 0x09, 0x00, 0x00, + 0x59, 0x09, 0x00, 0x00, 0x5c, 0x09, 0x00, 0x00, 0x5c, 0x09, 0x00, 0x00, 0x5d, 0x09, 0x00, 0x00, 0x5a, 0x09, 0x00, 0x00, 0x1f, 0x03, 0x00, 0x00, 0x1b, 0x03, + 0x00, 0x00, 0x5a, 0x09, 0x00, 0x00, 0x5a, 0x09, 0x00, 0x00, 0x21, 0x03, 0x00, 0x00, 0x1f, 0x03, 0x00, 0x00, 0x5b, 0x09, 0x00, 0x00, 0x5e, 0x09, 0x00, 0x00, + 0x1d, 0x09, 0x00, 0x00, 0x1d, 0x09, 0x00, 0x00, 0x58, 0x09, 0x00, 0x00, 0x5b, 0x09, 0x00, 0x00, 0x59, 0x09, 0x00, 0x00, 0xdf, 0x02, 0x00, 0x00, 0x10, 0x09, + 0x00, 0x00, 0x10, 0x09, 0x00, 0x00, 0x5c, 0x09, 0x00, 0x00, 0x59, 0x09, 0x00, 0x00, 0x5e, 0x09, 0x00, 0x00, 0x5f, 0x09, 0x00, 0x00, 0x1a, 0x09, 0x00, 0x00, + 0x1a, 0x09, 0x00, 0x00, 0x1d, 0x09, 0x00, 0x00, 0x5e, 0x09, 0x00, 0x00, 0x5f, 0x09, 0x00, 0x00, 0x60, 0x09, 0x00, 0x00, 0x1b, 0x09, 0x00, 0x00, 0x1b, 0x09, + 0x00, 0x00, 0x1a, 0x09, 0x00, 0x00, 0x5f, 0x09, 0x00, 0x00, 0x5b, 0x09, 0x00, 0x00, 0x1a, 0x03, 0x00, 0x00, 0x43, 0x03, 0x00, 0x00, 0x43, 0x03, 0x00, 0x00, + 0x61, 0x09, 0x00, 0x00, 0x5b, 0x09, 0x00, 0x00, 0x61, 0x09, 0x00, 0x00, 0x62, 0x09, 0x00, 0x00, 0x5e, 0x09, 0x00, 0x00, 0x5e, 0x09, 0x00, 0x00, 0x5b, 0x09, + 0x00, 0x00, 0x61, 0x09, 0x00, 0x00, 0x62, 0x09, 0x00, 0x00, 0x63, 0x09, 0x00, 0x00, 0x5f, 0x09, 0x00, 0x00, 0x5f, 0x09, 0x00, 0x00, 0x5e, 0x09, 0x00, 0x00, + 0x62, 0x09, 0x00, 0x00, 0x27, 0x08, 0x00, 0x00, 0x64, 0x09, 0x00, 0x00, 0x62, 0x09, 0x00, 0x00, 0x62, 0x09, 0x00, 0x00, 0x61, 0x09, 0x00, 0x00, 0x27, 0x08, + 0x00, 0x00, 0x64, 0x09, 0x00, 0x00, 0x65, 0x09, 0x00, 0x00, 0x63, 0x09, 0x00, 0x00, 0x63, 0x09, 0x00, 0x00, 0x62, 0x09, 0x00, 0x00, 0x64, 0x09, 0x00, 0x00, + 0x5f, 0x09, 0x00, 0x00, 0x63, 0x09, 0x00, 0x00, 0x60, 0x09, 0x00, 0x00, 0x37, 0x02, 0x00, 0x00, 0x27, 0x08, 0x00, 0x00, 0x61, 0x09, 0x00, 0x00, 0x61, 0x09, + 0x00, 0x00, 0x43, 0x03, 0x00, 0x00, 0x37, 0x02, 0x00, 0x00, 0x42, 0x03, 0x00, 0x00, 0x25, 0x08, 0x00, 0x00, 0x37, 0x02, 0x00, 0x00, 0x37, 0x02, 0x00, 0x00, + 0x43, 0x03, 0x00, 0x00, 0x42, 0x03, 0x00, 0x00, 0x64, 0x09, 0x00, 0x00, 0x27, 0x08, 0x00, 0x00, 0x26, 0x08, 0x00, 0x00, 0x26, 0x08, 0x00, 0x00, 0x1c, 0x03, + 0x00, 0x00, 0x64, 0x09, 0x00, 0x00, 0x65, 0x09, 0x00, 0x00, 0x64, 0x09, 0x00, 0x00, 0x1c, 0x03, 0x00, 0x00, 0x1c, 0x03, 0x00, 0x00, 0x1e, 0x03, 0x00, 0x00, + 0x65, 0x09, 0x00, 0x00, 0x63, 0x09, 0x00, 0x00, 0x65, 0x09, 0x00, 0x00, 0x66, 0x09, 0x00, 0x00, 0x66, 0x09, 0x00, 0x00, 0x60, 0x09, 0x00, 0x00, 0x63, 0x09, + 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x02, 0x07, 0x00, 0x00, 0x67, 0x09, 0x00, 0x00, 0x67, 0x09, 0x00, 0x00, 0x41, 0x09, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, + 0x24, 0x03, 0x00, 0x00, 0x29, 0x03, 0x00, 0x00, 0x40, 0x09, 0x00, 0x00, 0x40, 0x09, 0x00, 0x00, 0x41, 0x09, 0x00, 0x00, 0x24, 0x03, 0x00, 0x00, 0x02, 0x07, + 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x68, 0x09, 0x00, 0x00, 0x68, 0x09, 0x00, 0x00, 0x67, 0x09, 0x00, 0x00, 0x02, 0x07, 0x00, 0x00, 0x22, 0x03, 0x00, 0x00, + 0x24, 0x03, 0x00, 0x00, 0x41, 0x09, 0x00, 0x00, 0x41, 0x09, 0x00, 0x00, 0x67, 0x09, 0x00, 0x00, 0x22, 0x03, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0xff, 0x06, + 0x00, 0x00, 0x69, 0x09, 0x00, 0x00, 0x69, 0x09, 0x00, 0x00, 0x68, 0x09, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x68, 0x09, 0x00, 0x00, 0x26, 0x03, 0x00, 0x00, + 0x22, 0x03, 0x00, 0x00, 0x22, 0x03, 0x00, 0x00, 0x67, 0x09, 0x00, 0x00, 0x68, 0x09, 0x00, 0x00, 0x26, 0x03, 0x00, 0x00, 0x68, 0x09, 0x00, 0x00, 0x69, 0x09, + 0x00, 0x00, 0x6a, 0x09, 0x00, 0x00, 0x6b, 0x09, 0x00, 0x00, 0x09, 0x07, 0x00, 0x00, 0x09, 0x07, 0x00, 0x00, 0x08, 0x07, 0x00, 0x00, 0x6a, 0x09, 0x00, 0x00, + 0x6b, 0x09, 0x00, 0x00, 0x6c, 0x09, 0x00, 0x00, 0x0e, 0x07, 0x00, 0x00, 0x0e, 0x07, 0x00, 0x00, 0x09, 0x07, 0x00, 0x00, 0x6b, 0x09, 0x00, 0x00, 0x6c, 0x09, + 0x00, 0x00, 0x6d, 0x09, 0x00, 0x00, 0x12, 0x07, 0x00, 0x00, 0x12, 0x07, 0x00, 0x00, 0x0e, 0x07, 0x00, 0x00, 0x6c, 0x09, 0x00, 0x00, 0x6d, 0x09, 0x00, 0x00, + 0x6e, 0x09, 0x00, 0x00, 0x16, 0x07, 0x00, 0x00, 0x16, 0x07, 0x00, 0x00, 0x12, 0x07, 0x00, 0x00, 0x6d, 0x09, 0x00, 0x00, 0x6e, 0x09, 0x00, 0x00, 0x6f, 0x09, + 0x00, 0x00, 0x1a, 0x07, 0x00, 0x00, 0x1a, 0x07, 0x00, 0x00, 0x16, 0x07, 0x00, 0x00, 0x6e, 0x09, 0x00, 0x00, 0x70, 0x09, 0x00, 0x00, 0x71, 0x09, 0x00, 0x00, + 0x6b, 0x09, 0x00, 0x00, 0x6b, 0x09, 0x00, 0x00, 0x6a, 0x09, 0x00, 0x00, 0x70, 0x09, 0x00, 0x00, 0x71, 0x09, 0x00, 0x00, 0x72, 0x09, 0x00, 0x00, 0x6c, 0x09, + 0x00, 0x00, 0x6c, 0x09, 0x00, 0x00, 0x6b, 0x09, 0x00, 0x00, 0x71, 0x09, 0x00, 0x00, 0x72, 0x09, 0x00, 0x00, 0x15, 0x09, 0x00, 0x00, 0x6d, 0x09, 0x00, 0x00, + 0x6d, 0x09, 0x00, 0x00, 0x6c, 0x09, 0x00, 0x00, 0x72, 0x09, 0x00, 0x00, 0x15, 0x09, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x6e, 0x09, 0x00, 0x00, 0x6e, 0x09, + 0x00, 0x00, 0x6d, 0x09, 0x00, 0x00, 0x15, 0x09, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x73, 0x09, 0x00, 0x00, 0x6f, 0x09, 0x00, 0x00, 0x6f, 0x09, 0x00, 0x00, + 0x6e, 0x09, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x74, 0x09, 0x00, 0x00, 0x75, 0x09, 0x00, 0x00, 0x71, 0x09, 0x00, 0x00, 0x71, 0x09, 0x00, 0x00, 0x70, 0x09, + 0x00, 0x00, 0x74, 0x09, 0x00, 0x00, 0x75, 0x09, 0x00, 0x00, 0x17, 0x09, 0x00, 0x00, 0x72, 0x09, 0x00, 0x00, 0x72, 0x09, 0x00, 0x00, 0x71, 0x09, 0x00, 0x00, + 0x75, 0x09, 0x00, 0x00, 0x17, 0x09, 0x00, 0x00, 0x0f, 0x09, 0x00, 0x00, 0x15, 0x09, 0x00, 0x00, 0x15, 0x09, 0x00, 0x00, 0x72, 0x09, 0x00, 0x00, 0x17, 0x09, + 0x00, 0x00, 0x0e, 0x09, 0x00, 0x00, 0x13, 0x09, 0x00, 0x00, 0x73, 0x09, 0x00, 0x00, 0x73, 0x09, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x0e, 0x09, 0x00, 0x00, + 0x76, 0x09, 0x00, 0x00, 0x77, 0x09, 0x00, 0x00, 0x75, 0x09, 0x00, 0x00, 0x75, 0x09, 0x00, 0x00, 0x74, 0x09, 0x00, 0x00, 0x76, 0x09, 0x00, 0x00, 0x77, 0x09, + 0x00, 0x00, 0x16, 0x09, 0x00, 0x00, 0x17, 0x09, 0x00, 0x00, 0x17, 0x09, 0x00, 0x00, 0x75, 0x09, 0x00, 0x00, 0x77, 0x09, 0x00, 0x00, 0x78, 0x09, 0x00, 0x00, + 0x5d, 0x09, 0x00, 0x00, 0x77, 0x09, 0x00, 0x00, 0x77, 0x09, 0x00, 0x00, 0x76, 0x09, 0x00, 0x00, 0x78, 0x09, 0x00, 0x00, 0x5d, 0x09, 0x00, 0x00, 0x5c, 0x09, + 0x00, 0x00, 0x16, 0x09, 0x00, 0x00, 0x16, 0x09, 0x00, 0x00, 0x77, 0x09, 0x00, 0x00, 0x5d, 0x09, 0x00, 0x00, 0x5c, 0x09, 0x00, 0x00, 0x10, 0x09, 0x00, 0x00, + 0x0c, 0x09, 0x00, 0x00, 0x0c, 0x09, 0x00, 0x00, 0x16, 0x09, 0x00, 0x00, 0x5c, 0x09, 0x00, 0x00, 0x11, 0x09, 0x00, 0x00, 0x1c, 0x09, 0x00, 0x00, 0x12, 0x09, + 0x00, 0x00, 0x12, 0x09, 0x00, 0x00, 0x0d, 0x09, 0x00, 0x00, 0x11, 0x09, 0x00, 0x00, 0x21, 0x03, 0x00, 0x00, 0x5a, 0x09, 0x00, 0x00, 0x5d, 0x09, 0x00, 0x00, + 0x5d, 0x09, 0x00, 0x00, 0x78, 0x09, 0x00, 0x00, 0x21, 0x03, 0x00, 0x00, 0x1c, 0x03, 0x00, 0x00, 0x52, 0x09, 0x00, 0x00, 0x53, 0x09, 0x00, 0x00, 0x53, 0x09, + 0x00, 0x00, 0x1d, 0x03, 0x00, 0x00, 0x1c, 0x03, 0x00, 0x00, 0x79, 0x09, 0x00, 0x00, 0x1e, 0x03, 0x00, 0x00, 0x1d, 0x03, 0x00, 0x00, 0x1d, 0x03, 0x00, 0x00, + 0x7a, 0x09, 0x00, 0x00, 0x79, 0x09, 0x00, 0x00, 0x53, 0x09, 0x00, 0x00, 0x54, 0x09, 0x00, 0x00, 0x7a, 0x09, 0x00, 0x00, 0x7a, 0x09, 0x00, 0x00, 0x1d, 0x03, + 0x00, 0x00, 0x53, 0x09, 0x00, 0x00, 0x65, 0x09, 0x00, 0x00, 0x1e, 0x03, 0x00, 0x00, 0x7b, 0x09, 0x00, 0x00, 0x7b, 0x09, 0x00, 0x00, 0x66, 0x09, 0x00, 0x00, + 0x65, 0x09, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x3c, 0x03, 0x00, 0x00, 0x3e, 0x03, 0x00, 0x00, 0x3e, 0x03, 0x00, 0x00, 0x21, 0x08, 0x00, 0x00, 0x20, 0x08, + 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, 0x7c, 0x09, 0x00, 0x00, 0x1a, 0x03, 0x00, 0x00, 0x1a, 0x03, 0x00, 0x00, 0x19, 0x03, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, + 0x20, 0x03, 0x00, 0x00, 0x7d, 0x09, 0x00, 0x00, 0x7e, 0x09, 0x00, 0x00, 0x7e, 0x09, 0x00, 0x00, 0x7f, 0x09, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0x80, 0x09, + 0x00, 0x00, 0x81, 0x09, 0x00, 0x00, 0x82, 0x09, 0x00, 0x00, 0x82, 0x09, 0x00, 0x00, 0x83, 0x09, 0x00, 0x00, 0x80, 0x09, 0x00, 0x00, 0x84, 0x09, 0x00, 0x00, + 0x82, 0x09, 0x00, 0x00, 0x81, 0x09, 0x00, 0x00, 0x81, 0x09, 0x00, 0x00, 0x85, 0x09, 0x00, 0x00, 0x84, 0x09, 0x00, 0x00, 0x86, 0x09, 0x00, 0x00, 0x7b, 0x09, + 0x00, 0x00, 0x87, 0x09, 0x00, 0x00, 0x87, 0x09, 0x00, 0x00, 0xe1, 0x02, 0x00, 0x00, 0x86, 0x09, 0x00, 0x00, 0x79, 0x09, 0x00, 0x00, 0x87, 0x09, 0x00, 0x00, + 0x7b, 0x09, 0x00, 0x00, 0x88, 0x09, 0x00, 0x00, 0xe2, 0x02, 0x00, 0x00, 0xe1, 0x02, 0x00, 0x00, 0xe1, 0x02, 0x00, 0x00, 0x87, 0x09, 0x00, 0x00, 0x88, 0x09, + 0x00, 0x00, 0x1f, 0x09, 0x00, 0x00, 0x86, 0x09, 0x00, 0x00, 0xe1, 0x02, 0x00, 0x00, 0xe1, 0x02, 0x00, 0x00, 0xe0, 0x02, 0x00, 0x00, 0x1f, 0x09, 0x00, 0x00, + 0x7b, 0x09, 0x00, 0x00, 0x1e, 0x03, 0x00, 0x00, 0x79, 0x09, 0x00, 0x00, 0x87, 0x09, 0x00, 0x00, 0x79, 0x09, 0x00, 0x00, 0x7a, 0x09, 0x00, 0x00, 0x7a, 0x09, + 0x00, 0x00, 0x88, 0x09, 0x00, 0x00, 0x87, 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0xe2, 0x02, 0x00, 0x00, 0xe2, 0x02, 0x00, 0x00, + 0x88, 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0x56, 0x09, 0x00, 0x00, 0x57, 0x09, 0x00, 0x00, 0x24, 0x03, 0x00, 0x00, 0x24, 0x03, 0x00, 0x00, 0x23, 0x03, + 0x00, 0x00, 0x56, 0x09, 0x00, 0x00, 0x25, 0x03, 0x00, 0x00, 0x26, 0x03, 0x00, 0x00, 0x69, 0x09, 0x00, 0x00, 0x69, 0x09, 0x00, 0x00, 0x1f, 0x09, 0x00, 0x00, + 0x25, 0x03, 0x00, 0x00, 0x57, 0x09, 0x00, 0x00, 0x27, 0x03, 0x00, 0x00, 0x29, 0x03, 0x00, 0x00, 0x29, 0x03, 0x00, 0x00, 0x24, 0x03, 0x00, 0x00, 0x57, 0x09, + 0x00, 0x00, 0x54, 0x09, 0x00, 0x00, 0x55, 0x09, 0x00, 0x00, 0x88, 0x09, 0x00, 0x00, 0x88, 0x09, 0x00, 0x00, 0x7a, 0x09, 0x00, 0x00, 0x54, 0x09, 0x00, 0x00, + 0x21, 0x09, 0x00, 0x00, 0x56, 0x09, 0x00, 0x00, 0x23, 0x03, 0x00, 0x00, 0x23, 0x03, 0x00, 0x00, 0x1e, 0x09, 0x00, 0x00, 0x21, 0x09, 0x00, 0x00, 0x89, 0x09, + 0x00, 0x00, 0x12, 0x03, 0x00, 0x00, 0x11, 0x03, 0x00, 0x00, 0x11, 0x03, 0x00, 0x00, 0x51, 0x09, 0x00, 0x00, 0x89, 0x09, 0x00, 0x00, 0x45, 0x03, 0x00, 0x00, + 0x4e, 0x08, 0x00, 0x00, 0x12, 0x03, 0x00, 0x00, 0x12, 0x03, 0x00, 0x00, 0x89, 0x09, 0x00, 0x00, 0x45, 0x03, 0x00, 0x00, 0x83, 0x09, 0x00, 0x00, 0x7e, 0x09, + 0x00, 0x00, 0x7d, 0x09, 0x00, 0x00, 0x7d, 0x09, 0x00, 0x00, 0x80, 0x09, 0x00, 0x00, 0x83, 0x09, 0x00, 0x00, 0x7c, 0x09, 0x00, 0x00, 0x41, 0x03, 0x00, 0x00, + 0x43, 0x03, 0x00, 0x00, 0x43, 0x03, 0x00, 0x00, 0x1a, 0x03, 0x00, 0x00, 0x7c, 0x09, 0x00, 0x00, 0x19, 0x03, 0x00, 0x00, 0x1f, 0x03, 0x00, 0x00, 0x8a, 0x09, + 0x00, 0x00, 0x8a, 0x09, 0x00, 0x00, 0x3f, 0x03, 0x00, 0x00, 0x19, 0x03, 0x00, 0x00, 0x85, 0x09, 0x00, 0x00, 0x1f, 0x08, 0x00, 0x00, 0x22, 0x08, 0x00, 0x00, + 0x22, 0x08, 0x00, 0x00, 0x84, 0x09, 0x00, 0x00, 0x85, 0x09, 0x00, 0x00, 0x3a, 0x03, 0x00, 0x00, 0x32, 0x03, 0x00, 0x00, 0x38, 0x03, 0x00, 0x00, 0x38, 0x03, + 0x00, 0x00, 0x8b, 0x09, 0x00, 0x00, 0x3a, 0x03, 0x00, 0x00, 0x8c, 0x09, 0x00, 0x00, 0x2f, 0x03, 0x00, 0x00, 0x32, 0x03, 0x00, 0x00, 0x32, 0x03, 0x00, 0x00, + 0x3a, 0x03, 0x00, 0x00, 0x8c, 0x09, 0x00, 0x00, 0x8d, 0x09, 0x00, 0x00, 0x2d, 0x03, 0x00, 0x00, 0x2f, 0x03, 0x00, 0x00, 0x2f, 0x03, 0x00, 0x00, 0x8c, 0x09, + 0x00, 0x00, 0x8d, 0x09, 0x00, 0x00, 0x8e, 0x09, 0x00, 0x00, 0x2b, 0x03, 0x00, 0x00, 0x2d, 0x03, 0x00, 0x00, 0x2d, 0x03, 0x00, 0x00, 0x8d, 0x09, 0x00, 0x00, + 0x8e, 0x09, 0x00, 0x00, 0x8f, 0x09, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x00, 0x2b, 0x03, 0x00, 0x00, 0x2b, 0x03, 0x00, 0x00, 0x8e, 0x09, 0x00, 0x00, 0x8f, 0x09, + 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x2e, 0x03, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x00, 0x2c, 0x03, 0x00, 0x00, 0x8f, 0x09, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, + 0x91, 0x09, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, 0x2e, 0x03, 0x00, 0x00, 0x2e, 0x03, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x91, 0x09, 0x00, 0x00, 0x92, 0x09, + 0x00, 0x00, 0x31, 0x03, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, 0x91, 0x09, 0x00, 0x00, 0x92, 0x09, 0x00, 0x00, 0x93, 0x09, 0x00, 0x00, + 0x33, 0x03, 0x00, 0x00, 0x31, 0x03, 0x00, 0x00, 0x31, 0x03, 0x00, 0x00, 0x92, 0x09, 0x00, 0x00, 0x93, 0x09, 0x00, 0x00, 0x94, 0x09, 0x00, 0x00, 0x34, 0x03, + 0x00, 0x00, 0x33, 0x03, 0x00, 0x00, 0x33, 0x03, 0x00, 0x00, 0x93, 0x09, 0x00, 0x00, 0x94, 0x09, 0x00, 0x00, 0x95, 0x09, 0x00, 0x00, 0x35, 0x03, 0x00, 0x00, + 0x34, 0x03, 0x00, 0x00, 0x34, 0x03, 0x00, 0x00, 0x94, 0x09, 0x00, 0x00, 0x95, 0x09, 0x00, 0x00, 0x96, 0x09, 0x00, 0x00, 0x36, 0x03, 0x00, 0x00, 0x35, 0x03, + 0x00, 0x00, 0x35, 0x03, 0x00, 0x00, 0x95, 0x09, 0x00, 0x00, 0x96, 0x09, 0x00, 0x00, 0x97, 0x09, 0x00, 0x00, 0x37, 0x03, 0x00, 0x00, 0x36, 0x03, 0x00, 0x00, + 0x36, 0x03, 0x00, 0x00, 0x96, 0x09, 0x00, 0x00, 0x97, 0x09, 0x00, 0x00, 0x8b, 0x09, 0x00, 0x00, 0x38, 0x03, 0x00, 0x00, 0x37, 0x03, 0x00, 0x00, 0x37, 0x03, + 0x00, 0x00, 0x97, 0x09, 0x00, 0x00, 0x8b, 0x09, 0x00, 0x00, 0x3b, 0x03, 0x00, 0x00, 0x3a, 0x03, 0x00, 0x00, 0x8b, 0x09, 0x00, 0x00, 0x8b, 0x09, 0x00, 0x00, + 0xb7, 0x08, 0x00, 0x00, 0x3b, 0x03, 0x00, 0x00, 0xb7, 0x08, 0x00, 0x00, 0x8b, 0x09, 0x00, 0x00, 0x97, 0x09, 0x00, 0x00, 0x97, 0x09, 0x00, 0x00, 0xcd, 0x08, + 0x00, 0x00, 0xb7, 0x08, 0x00, 0x00, 0xcd, 0x08, 0x00, 0x00, 0x97, 0x09, 0x00, 0x00, 0x96, 0x09, 0x00, 0x00, 0x96, 0x09, 0x00, 0x00, 0xe4, 0x08, 0x00, 0x00, + 0xcd, 0x08, 0x00, 0x00, 0xe4, 0x08, 0x00, 0x00, 0x96, 0x09, 0x00, 0x00, 0x95, 0x09, 0x00, 0x00, 0x95, 0x09, 0x00, 0x00, 0xd1, 0x08, 0x00, 0x00, 0xe4, 0x08, + 0x00, 0x00, 0xd1, 0x08, 0x00, 0x00, 0x95, 0x09, 0x00, 0x00, 0x94, 0x09, 0x00, 0x00, 0x94, 0x09, 0x00, 0x00, 0xd2, 0x08, 0x00, 0x00, 0xd1, 0x08, 0x00, 0x00, + 0xd2, 0x08, 0x00, 0x00, 0x94, 0x09, 0x00, 0x00, 0x93, 0x09, 0x00, 0x00, 0x93, 0x09, 0x00, 0x00, 0xd4, 0x08, 0x00, 0x00, 0xd2, 0x08, 0x00, 0x00, 0xd4, 0x08, + 0x00, 0x00, 0x93, 0x09, 0x00, 0x00, 0x92, 0x09, 0x00, 0x00, 0x92, 0x09, 0x00, 0x00, 0xc8, 0x08, 0x00, 0x00, 0xd4, 0x08, 0x00, 0x00, 0xc8, 0x08, 0x00, 0x00, + 0x92, 0x09, 0x00, 0x00, 0x91, 0x09, 0x00, 0x00, 0x91, 0x09, 0x00, 0x00, 0xc9, 0x08, 0x00, 0x00, 0xc8, 0x08, 0x00, 0x00, 0xc9, 0x08, 0x00, 0x00, 0x91, 0x09, + 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, 0xd6, 0x08, 0x00, 0x00, 0xc9, 0x08, 0x00, 0x00, 0xd6, 0x08, 0x00, 0x00, 0x90, 0x09, 0x00, 0x00, + 0x8f, 0x09, 0x00, 0x00, 0x8f, 0x09, 0x00, 0x00, 0xd8, 0x08, 0x00, 0x00, 0xd6, 0x08, 0x00, 0x00, 0xd8, 0x08, 0x00, 0x00, 0x8f, 0x09, 0x00, 0x00, 0x8e, 0x09, + 0x00, 0x00, 0x8e, 0x09, 0x00, 0x00, 0xda, 0x08, 0x00, 0x00, 0xd8, 0x08, 0x00, 0x00, 0xda, 0x08, 0x00, 0x00, 0x8e, 0x09, 0x00, 0x00, 0x8d, 0x09, 0x00, 0x00, + 0x8d, 0x09, 0x00, 0x00, 0xdd, 0x08, 0x00, 0x00, 0xda, 0x08, 0x00, 0x00, 0xdd, 0x08, 0x00, 0x00, 0x8d, 0x09, 0x00, 0x00, 0x8c, 0x09, 0x00, 0x00, 0x8c, 0x09, + 0x00, 0x00, 0xe1, 0x08, 0x00, 0x00, 0xdd, 0x08, 0x00, 0x00, 0xbc, 0x08, 0x00, 0x00, 0xde, 0x08, 0x00, 0x00, 0xe1, 0x08, 0x00, 0x00, 0xe1, 0x08, 0x00, 0x00, + 0x39, 0x03, 0x00, 0x00, 0xbc, 0x08, 0x00, 0x00, 0x39, 0x03, 0x00, 0x00, 0xe1, 0x08, 0x00, 0x00, 0x8c, 0x09, 0x00, 0x00, 0x8c, 0x09, 0x00, 0x00, 0x3a, 0x03, + 0x00, 0x00, 0x39, 0x03, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0x7f, 0x09, 0x00, 0x00, 0x8a, 0x09, 0x00, 0x00, 0x8a, 0x09, 0x00, 0x00, 0x1f, 0x03, 0x00, 0x00, + 0x20, 0x03, 0x00, 0x00, 0x98, 0x09, 0x00, 0x00, 0x21, 0x08, 0x00, 0x00, 0x3e, 0x03, 0x00, 0x00, 0x3e, 0x03, 0x00, 0x00, 0x44, 0x03, 0x00, 0x00, 0x98, 0x09, + 0x00, 0x00, 0x8a, 0x09, 0x00, 0x00, 0x7f, 0x09, 0x00, 0x00, 0x99, 0x09, 0x00, 0x00, 0x99, 0x09, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x8a, 0x09, 0x00, 0x00, + 0x99, 0x09, 0x00, 0x00, 0x7f, 0x09, 0x00, 0x00, 0x7e, 0x09, 0x00, 0x00, 0x7e, 0x09, 0x00, 0x00, 0x9b, 0x09, 0x00, 0x00, 0x99, 0x09, 0x00, 0x00, 0x40, 0x03, + 0x00, 0x00, 0x9c, 0x09, 0x00, 0x00, 0x9d, 0x09, 0x00, 0x00, 0x9d, 0x09, 0x00, 0x00, 0x7c, 0x09, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, 0x7c, 0x09, 0x00, 0x00, + 0x9d, 0x09, 0x00, 0x00, 0x72, 0x03, 0x00, 0x00, 0x72, 0x03, 0x00, 0x00, 0x41, 0x03, 0x00, 0x00, 0x7c, 0x09, 0x00, 0x00, 0x71, 0x03, 0x00, 0x00, 0x42, 0x03, + 0x00, 0x00, 0x41, 0x03, 0x00, 0x00, 0x41, 0x03, 0x00, 0x00, 0x72, 0x03, 0x00, 0x00, 0x71, 0x03, 0x00, 0x00, 0x9b, 0x09, 0x00, 0x00, 0x7e, 0x09, 0x00, 0x00, + 0x83, 0x09, 0x00, 0x00, 0x83, 0x09, 0x00, 0x00, 0x9e, 0x09, 0x00, 0x00, 0x9b, 0x09, 0x00, 0x00, 0x9e, 0x09, 0x00, 0x00, 0x83, 0x09, 0x00, 0x00, 0x82, 0x09, + 0x00, 0x00, 0x82, 0x09, 0x00, 0x00, 0x9f, 0x09, 0x00, 0x00, 0x9e, 0x09, 0x00, 0x00, 0x9f, 0x09, 0x00, 0x00, 0x82, 0x09, 0x00, 0x00, 0x84, 0x09, 0x00, 0x00, + 0x84, 0x09, 0x00, 0x00, 0xa0, 0x09, 0x00, 0x00, 0x9f, 0x09, 0x00, 0x00, 0xa0, 0x09, 0x00, 0x00, 0x84, 0x09, 0x00, 0x00, 0x22, 0x08, 0x00, 0x00, 0x22, 0x08, + 0x00, 0x00, 0xa1, 0x09, 0x00, 0x00, 0xa0, 0x09, 0x00, 0x00, 0xa1, 0x09, 0x00, 0x00, 0x22, 0x08, 0x00, 0x00, 0x21, 0x08, 0x00, 0x00, 0x21, 0x08, 0x00, 0x00, + 0x98, 0x09, 0x00, 0x00, 0xa1, 0x09, 0x00, 0x00, 0x8a, 0x09, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0xa2, 0x09, 0x00, 0x00, 0xa2, 0x09, 0x00, 0x00, 0x3f, 0x03, + 0x00, 0x00, 0x8a, 0x09, 0x00, 0x00, 0xa3, 0x09, 0x00, 0x00, 0x49, 0x03, 0x00, 0x00, 0x48, 0x03, 0x00, 0x00, 0x48, 0x03, 0x00, 0x00, 0xa4, 0x09, 0x00, 0x00, + 0xa3, 0x09, 0x00, 0x00, 0xa3, 0x09, 0x00, 0x00, 0xa5, 0x09, 0x00, 0x00, 0xa6, 0x09, 0x00, 0x00, 0xa6, 0x09, 0x00, 0x00, 0x49, 0x03, 0x00, 0x00, 0xa3, 0x09, + 0x00, 0x00, 0xa4, 0x09, 0x00, 0x00, 0x48, 0x03, 0x00, 0x00, 0xa7, 0x09, 0x00, 0x00, 0xa7, 0x09, 0x00, 0x00, 0x79, 0x03, 0x00, 0x00, 0xa4, 0x09, 0x00, 0x00, + 0xa4, 0x09, 0x00, 0x00, 0xa8, 0x09, 0x00, 0x00, 0xa5, 0x09, 0x00, 0x00, 0xa5, 0x09, 0x00, 0x00, 0xa3, 0x09, 0x00, 0x00, 0xa4, 0x09, 0x00, 0x00, 0xa9, 0x09, + 0x00, 0x00, 0xa6, 0x09, 0x00, 0x00, 0xa5, 0x09, 0x00, 0x00, 0xa5, 0x09, 0x00, 0x00, 0xaa, 0x09, 0x00, 0x00, 0xa9, 0x09, 0x00, 0x00, 0xa6, 0x09, 0x00, 0x00, + 0xab, 0x09, 0x00, 0x00, 0xac, 0x09, 0x00, 0x00, 0xac, 0x09, 0x00, 0x00, 0x49, 0x03, 0x00, 0x00, 0xa6, 0x09, 0x00, 0x00, 0x5b, 0x03, 0x00, 0x00, 0x4b, 0x03, + 0x00, 0x00, 0x4d, 0x03, 0x00, 0x00, 0x4d, 0x03, 0x00, 0x00, 0xad, 0x09, 0x00, 0x00, 0x5b, 0x03, 0x00, 0x00, 0x5d, 0x03, 0x00, 0x00, 0xae, 0x09, 0x00, 0x00, + 0x4b, 0x03, 0x00, 0x00, 0x4b, 0x03, 0x00, 0x00, 0x5b, 0x03, 0x00, 0x00, 0x5d, 0x03, 0x00, 0x00, 0xaf, 0x09, 0x00, 0x00, 0xad, 0x09, 0x00, 0x00, 0x4d, 0x03, + 0x00, 0x00, 0x4d, 0x03, 0x00, 0x00, 0x67, 0x03, 0x00, 0x00, 0xaf, 0x09, 0x00, 0x00, 0xad, 0x09, 0x00, 0x00, 0xaf, 0x09, 0x00, 0x00, 0x5c, 0x03, 0x00, 0x00, + 0x5c, 0x03, 0x00, 0x00, 0x5b, 0x03, 0x00, 0x00, 0xad, 0x09, 0x00, 0x00, 0x52, 0x03, 0x00, 0x00, 0x61, 0x03, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x00, 0xb0, 0x09, + 0x00, 0x00, 0xb1, 0x09, 0x00, 0x00, 0x52, 0x03, 0x00, 0x00, 0x61, 0x03, 0x00, 0x00, 0x52, 0x03, 0x00, 0x00, 0x51, 0x03, 0x00, 0x00, 0x51, 0x03, 0x00, 0x00, + 0x62, 0x03, 0x00, 0x00, 0x61, 0x03, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x00, 0x61, 0x03, 0x00, 0x00, 0x63, 0x03, 0x00, 0x00, 0x63, 0x03, 0x00, 0x00, 0xb2, 0x09, + 0x00, 0x00, 0xb0, 0x09, 0x00, 0x00, 0xb3, 0x09, 0x00, 0x00, 0xb4, 0x09, 0x00, 0x00, 0xb1, 0x09, 0x00, 0x00, 0xb1, 0x09, 0x00, 0x00, 0xb0, 0x09, 0x00, 0x00, + 0xb3, 0x09, 0x00, 0x00, 0x52, 0x03, 0x00, 0x00, 0xb1, 0x09, 0x00, 0x00, 0x55, 0x03, 0x00, 0x00, 0x55, 0x03, 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, 0x52, 0x03, + 0x00, 0x00, 0xb1, 0x09, 0x00, 0x00, 0xb4, 0x09, 0x00, 0x00, 0x56, 0x03, 0x00, 0x00, 0x56, 0x03, 0x00, 0x00, 0x55, 0x03, 0x00, 0x00, 0xb1, 0x09, 0x00, 0x00, + 0x5e, 0x03, 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, 0x55, 0x03, 0x00, 0x00, 0x55, 0x03, 0x00, 0x00, 0x54, 0x03, 0x00, 0x00, 0x5e, 0x03, 0x00, 0x00, 0x52, 0x03, + 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, 0x5f, 0x03, 0x00, 0x00, 0x5f, 0x03, 0x00, 0x00, 0x53, 0x03, 0x00, 0x00, 0x52, 0x03, 0x00, 0x00, 0xb5, 0x09, 0x00, 0x00, + 0xb6, 0x09, 0x00, 0x00, 0xb7, 0x09, 0x00, 0x00, 0xb7, 0x09, 0x00, 0x00, 0xb8, 0x09, 0x00, 0x00, 0xb5, 0x09, 0x00, 0x00, 0xb9, 0x09, 0x00, 0x00, 0xba, 0x09, + 0x00, 0x00, 0xb6, 0x09, 0x00, 0x00, 0xb6, 0x09, 0x00, 0x00, 0xb5, 0x09, 0x00, 0x00, 0xb9, 0x09, 0x00, 0x00, 0xb6, 0x09, 0x00, 0x00, 0xbb, 0x09, 0x00, 0x00, + 0xbc, 0x09, 0x00, 0x00, 0xbc, 0x09, 0x00, 0x00, 0xb7, 0x09, 0x00, 0x00, 0xb6, 0x09, 0x00, 0x00, 0xb7, 0x09, 0x00, 0x00, 0xbd, 0x09, 0x00, 0x00, 0xbe, 0x09, + 0x00, 0x00, 0xbe, 0x09, 0x00, 0x00, 0xb8, 0x09, 0x00, 0x00, 0xb7, 0x09, 0x00, 0x00, 0xbf, 0x09, 0x00, 0x00, 0xb5, 0x09, 0x00, 0x00, 0xb8, 0x09, 0x00, 0x00, + 0xb8, 0x09, 0x00, 0x00, 0xc0, 0x09, 0x00, 0x00, 0xbf, 0x09, 0x00, 0x00, 0x4f, 0x03, 0x00, 0x00, 0x4e, 0x03, 0x00, 0x00, 0xc1, 0x09, 0x00, 0x00, 0xc1, 0x09, + 0x00, 0x00, 0xaa, 0x09, 0x00, 0x00, 0x4f, 0x03, 0x00, 0x00, 0xc2, 0x09, 0x00, 0x00, 0xc3, 0x09, 0x00, 0x00, 0xc1, 0x09, 0x00, 0x00, 0xc1, 0x09, 0x00, 0x00, + 0x4e, 0x03, 0x00, 0x00, 0xc2, 0x09, 0x00, 0x00, 0xaa, 0x09, 0x00, 0x00, 0xc1, 0x09, 0x00, 0x00, 0x74, 0x03, 0x00, 0x00, 0x74, 0x03, 0x00, 0x00, 0xa9, 0x09, + 0x00, 0x00, 0xaa, 0x09, 0x00, 0x00, 0xa5, 0x09, 0x00, 0x00, 0xa8, 0x09, 0x00, 0x00, 0x4f, 0x03, 0x00, 0x00, 0x4f, 0x03, 0x00, 0x00, 0xaa, 0x09, 0x00, 0x00, + 0xa5, 0x09, 0x00, 0x00, 0x4f, 0x03, 0x00, 0x00, 0xa8, 0x09, 0x00, 0x00, 0xc4, 0x09, 0x00, 0x00, 0xc4, 0x09, 0x00, 0x00, 0x50, 0x03, 0x00, 0x00, 0x4f, 0x03, + 0x00, 0x00, 0xa4, 0x09, 0x00, 0x00, 0x79, 0x03, 0x00, 0x00, 0xc4, 0x09, 0x00, 0x00, 0xc4, 0x09, 0x00, 0x00, 0xa8, 0x09, 0x00, 0x00, 0xa4, 0x09, 0x00, 0x00, + 0xc4, 0x09, 0x00, 0x00, 0xc5, 0x09, 0x00, 0x00, 0xc6, 0x09, 0x00, 0x00, 0xc6, 0x09, 0x00, 0x00, 0x50, 0x03, 0x00, 0x00, 0xc4, 0x09, 0x00, 0x00, 0xc7, 0x09, + 0x00, 0x00, 0xc8, 0x09, 0x00, 0x00, 0xc9, 0x09, 0x00, 0x00, 0xc9, 0x09, 0x00, 0x00, 0x5c, 0x03, 0x00, 0x00, 0xc7, 0x09, 0x00, 0x00, 0xc7, 0x09, 0x00, 0x00, + 0xca, 0x09, 0x00, 0x00, 0xcb, 0x09, 0x00, 0x00, 0xcb, 0x09, 0x00, 0x00, 0xc8, 0x09, 0x00, 0x00, 0xc7, 0x09, 0x00, 0x00, 0xcc, 0x09, 0x00, 0x00, 0xc9, 0x09, + 0x00, 0x00, 0xc8, 0x09, 0x00, 0x00, 0xc8, 0x09, 0x00, 0x00, 0x5e, 0x03, 0x00, 0x00, 0xcc, 0x09, 0x00, 0x00, 0x5d, 0x03, 0x00, 0x00, 0x5c, 0x03, 0x00, 0x00, + 0xc9, 0x09, 0x00, 0x00, 0xc9, 0x09, 0x00, 0x00, 0xcd, 0x09, 0x00, 0x00, 0x5d, 0x03, 0x00, 0x00, 0xc7, 0x09, 0x00, 0x00, 0x5c, 0x03, 0x00, 0x00, 0xaf, 0x09, + 0x00, 0x00, 0xaf, 0x09, 0x00, 0x00, 0xce, 0x09, 0x00, 0x00, 0xc7, 0x09, 0x00, 0x00, 0xc7, 0x09, 0x00, 0x00, 0xce, 0x09, 0x00, 0x00, 0xcf, 0x09, 0x00, 0x00, + 0xcf, 0x09, 0x00, 0x00, 0xca, 0x09, 0x00, 0x00, 0xc7, 0x09, 0x00, 0x00, 0xd0, 0x09, 0x00, 0x00, 0xd1, 0x09, 0x00, 0x00, 0xcf, 0x09, 0x00, 0x00, 0xcf, 0x09, + 0x00, 0x00, 0xce, 0x09, 0x00, 0x00, 0xd0, 0x09, 0x00, 0x00, 0xca, 0x09, 0x00, 0x00, 0xcf, 0x09, 0x00, 0x00, 0x51, 0x03, 0x00, 0x00, 0x51, 0x03, 0x00, 0x00, + 0x53, 0x03, 0x00, 0x00, 0xca, 0x09, 0x00, 0x00, 0x51, 0x03, 0x00, 0x00, 0xcf, 0x09, 0x00, 0x00, 0xd1, 0x09, 0x00, 0x00, 0xd1, 0x09, 0x00, 0x00, 0x62, 0x03, + 0x00, 0x00, 0x51, 0x03, 0x00, 0x00, 0xca, 0x09, 0x00, 0x00, 0x53, 0x03, 0x00, 0x00, 0x5f, 0x03, 0x00, 0x00, 0x5f, 0x03, 0x00, 0x00, 0xcb, 0x09, 0x00, 0x00, + 0xca, 0x09, 0x00, 0x00, 0x7c, 0x03, 0x00, 0x00, 0xac, 0x09, 0x00, 0x00, 0xd2, 0x09, 0x00, 0x00, 0xd2, 0x09, 0x00, 0x00, 0xd3, 0x09, 0x00, 0x00, 0x7c, 0x03, + 0x00, 0x00, 0xac, 0x09, 0x00, 0x00, 0x7c, 0x03, 0x00, 0x00, 0x4a, 0x03, 0x00, 0x00, 0x4a, 0x03, 0x00, 0x00, 0x49, 0x03, 0x00, 0x00, 0xac, 0x09, 0x00, 0x00, + 0xd2, 0x09, 0x00, 0x00, 0xac, 0x09, 0x00, 0x00, 0xab, 0x09, 0x00, 0x00, 0xab, 0x09, 0x00, 0x00, 0xd4, 0x09, 0x00, 0x00, 0xd2, 0x09, 0x00, 0x00, 0xd3, 0x09, + 0x00, 0x00, 0xd2, 0x09, 0x00, 0x00, 0xd5, 0x09, 0x00, 0x00, 0xd5, 0x09, 0x00, 0x00, 0xd6, 0x09, 0x00, 0x00, 0xd3, 0x09, 0x00, 0x00, 0x7c, 0x03, 0x00, 0x00, + 0xd3, 0x09, 0x00, 0x00, 0xd7, 0x09, 0x00, 0x00, 0xd7, 0x09, 0x00, 0x00, 0xd8, 0x09, 0x00, 0x00, 0x7c, 0x03, 0x00, 0x00, 0xd5, 0x09, 0x00, 0x00, 0xd2, 0x09, + 0x00, 0x00, 0xd4, 0x09, 0x00, 0x00, 0xd4, 0x09, 0x00, 0x00, 0xd9, 0x09, 0x00, 0x00, 0xd5, 0x09, 0x00, 0x00, 0xd6, 0x09, 0x00, 0x00, 0xd5, 0x09, 0x00, 0x00, + 0xda, 0x09, 0x00, 0x00, 0xda, 0x09, 0x00, 0x00, 0xdb, 0x09, 0x00, 0x00, 0xd6, 0x09, 0x00, 0x00, 0xd6, 0x09, 0x00, 0x00, 0xdc, 0x09, 0x00, 0x00, 0xd7, 0x09, + 0x00, 0x00, 0xd7, 0x09, 0x00, 0x00, 0xd3, 0x09, 0x00, 0x00, 0xd6, 0x09, 0x00, 0x00, 0xdd, 0x09, 0x00, 0x00, 0xd8, 0x09, 0x00, 0x00, 0xd7, 0x09, 0x00, 0x00, + 0xd7, 0x09, 0x00, 0x00, 0xde, 0x09, 0x00, 0x00, 0xdd, 0x09, 0x00, 0x00, 0xdf, 0x09, 0x00, 0x00, 0xd8, 0x09, 0x00, 0x00, 0xdd, 0x09, 0x00, 0x00, 0xdd, 0x09, + 0x00, 0x00, 0xe0, 0x09, 0x00, 0x00, 0xdf, 0x09, 0x00, 0x00, 0xe1, 0x09, 0x00, 0x00, 0xde, 0x09, 0x00, 0x00, 0xd7, 0x09, 0x00, 0x00, 0xd7, 0x09, 0x00, 0x00, + 0xdc, 0x09, 0x00, 0x00, 0xe1, 0x09, 0x00, 0x00, 0xdd, 0x09, 0x00, 0x00, 0xde, 0x09, 0x00, 0x00, 0xe2, 0x09, 0x00, 0x00, 0xe2, 0x09, 0x00, 0x00, 0xe3, 0x09, + 0x00, 0x00, 0xdd, 0x09, 0x00, 0x00, 0xde, 0x09, 0x00, 0x00, 0xe1, 0x09, 0x00, 0x00, 0xe4, 0x09, 0x00, 0x00, 0xe4, 0x09, 0x00, 0x00, 0xe2, 0x09, 0x00, 0x00, + 0xde, 0x09, 0x00, 0x00, 0xe5, 0x09, 0x00, 0x00, 0xe1, 0x09, 0x00, 0x00, 0xdc, 0x09, 0x00, 0x00, 0xdc, 0x09, 0x00, 0x00, 0xe6, 0x09, 0x00, 0x00, 0xe5, 0x09, + 0x00, 0x00, 0xd9, 0x09, 0x00, 0x00, 0xcd, 0x09, 0x00, 0x00, 0xda, 0x09, 0x00, 0x00, 0xda, 0x09, 0x00, 0x00, 0xd5, 0x09, 0x00, 0x00, 0xd9, 0x09, 0x00, 0x00, + 0xe7, 0x09, 0x00, 0x00, 0xdb, 0x09, 0x00, 0x00, 0xda, 0x09, 0x00, 0x00, 0xda, 0x09, 0x00, 0x00, 0xcc, 0x09, 0x00, 0x00, 0xe7, 0x09, 0x00, 0x00, 0xd6, 0x09, + 0x00, 0x00, 0xdb, 0x09, 0x00, 0x00, 0xe6, 0x09, 0x00, 0x00, 0xe6, 0x09, 0x00, 0x00, 0xdc, 0x09, 0x00, 0x00, 0xd6, 0x09, 0x00, 0x00, 0xe4, 0x09, 0x00, 0x00, + 0xe1, 0x09, 0x00, 0x00, 0xe5, 0x09, 0x00, 0x00, 0xe5, 0x09, 0x00, 0x00, 0xe8, 0x09, 0x00, 0x00, 0xe4, 0x09, 0x00, 0x00, 0xe9, 0x09, 0x00, 0x00, 0xe5, 0x09, + 0x00, 0x00, 0xe6, 0x09, 0x00, 0x00, 0xe6, 0x09, 0x00, 0x00, 0xea, 0x09, 0x00, 0x00, 0xe9, 0x09, 0x00, 0x00, 0xe8, 0x09, 0x00, 0x00, 0xe5, 0x09, 0x00, 0x00, + 0xe9, 0x09, 0x00, 0x00, 0xe9, 0x09, 0x00, 0x00, 0xeb, 0x09, 0x00, 0x00, 0xe8, 0x09, 0x00, 0x00, 0xea, 0x09, 0x00, 0x00, 0xe6, 0x09, 0x00, 0x00, 0xdb, 0x09, + 0x00, 0x00, 0xdb, 0x09, 0x00, 0x00, 0xe7, 0x09, 0x00, 0x00, 0xea, 0x09, 0x00, 0x00, 0xb4, 0x09, 0x00, 0x00, 0xe9, 0x09, 0x00, 0x00, 0xea, 0x09, 0x00, 0x00, + 0xea, 0x09, 0x00, 0x00, 0x56, 0x03, 0x00, 0x00, 0xb4, 0x09, 0x00, 0x00, 0x56, 0x03, 0x00, 0x00, 0xea, 0x09, 0x00, 0x00, 0xe7, 0x09, 0x00, 0x00, 0xe7, 0x09, + 0x00, 0x00, 0x54, 0x03, 0x00, 0x00, 0x56, 0x03, 0x00, 0x00, 0xeb, 0x09, 0x00, 0x00, 0xe9, 0x09, 0x00, 0x00, 0xb4, 0x09, 0x00, 0x00, 0xb4, 0x09, 0x00, 0x00, + 0xb3, 0x09, 0x00, 0x00, 0xeb, 0x09, 0x00, 0x00, 0x4c, 0x03, 0x00, 0x00, 0xec, 0x09, 0x00, 0x00, 0xed, 0x09, 0x00, 0x00, 0xed, 0x09, 0x00, 0x00, 0x4d, 0x03, + 0x00, 0x00, 0x4c, 0x03, 0x00, 0x00, 0x4c, 0x03, 0x00, 0x00, 0x5a, 0x03, 0x00, 0x00, 0xee, 0x09, 0x00, 0x00, 0xee, 0x09, 0x00, 0x00, 0xec, 0x09, 0x00, 0x00, + 0x4c, 0x03, 0x00, 0x00, 0xed, 0x09, 0x00, 0x00, 0xec, 0x09, 0x00, 0x00, 0x46, 0x03, 0x00, 0x00, 0x46, 0x03, 0x00, 0x00, 0x45, 0x03, 0x00, 0x00, 0xed, 0x09, + 0x00, 0x00, 0xed, 0x09, 0x00, 0x00, 0xef, 0x09, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0x4d, 0x03, 0x00, 0x00, 0xed, 0x09, 0x00, 0x00, + 0xf0, 0x09, 0x00, 0x00, 0x59, 0x03, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00, 0x4c, 0x03, 0x00, 0x00, 0xf0, 0x09, 0x00, 0x00, 0x59, 0x03, + 0x00, 0x00, 0xf0, 0x09, 0x00, 0x00, 0xd4, 0x09, 0x00, 0x00, 0xd4, 0x09, 0x00, 0x00, 0xab, 0x09, 0x00, 0x00, 0x59, 0x03, 0x00, 0x00, 0xae, 0x09, 0x00, 0x00, + 0xf0, 0x09, 0x00, 0x00, 0x4c, 0x03, 0x00, 0x00, 0x4c, 0x03, 0x00, 0x00, 0x4b, 0x03, 0x00, 0x00, 0xae, 0x09, 0x00, 0x00, 0xae, 0x09, 0x00, 0x00, 0xd9, 0x09, + 0x00, 0x00, 0xd4, 0x09, 0x00, 0x00, 0xd4, 0x09, 0x00, 0x00, 0xf0, 0x09, 0x00, 0x00, 0xae, 0x09, 0x00, 0x00, 0xae, 0x09, 0x00, 0x00, 0x5d, 0x03, 0x00, 0x00, + 0xcd, 0x09, 0x00, 0x00, 0xcd, 0x09, 0x00, 0x00, 0xd9, 0x09, 0x00, 0x00, 0xae, 0x09, 0x00, 0x00, 0xa6, 0x09, 0x00, 0x00, 0xa9, 0x09, 0x00, 0x00, 0x59, 0x03, + 0x00, 0x00, 0x59, 0x03, 0x00, 0x00, 0xab, 0x09, 0x00, 0x00, 0xa6, 0x09, 0x00, 0x00, 0xc9, 0x09, 0x00, 0x00, 0xcc, 0x09, 0x00, 0x00, 0xda, 0x09, 0x00, 0x00, + 0xda, 0x09, 0x00, 0x00, 0xcd, 0x09, 0x00, 0x00, 0xc9, 0x09, 0x00, 0x00, 0xc8, 0x09, 0x00, 0x00, 0xcb, 0x09, 0x00, 0x00, 0x5f, 0x03, 0x00, 0x00, 0x5f, 0x03, + 0x00, 0x00, 0x5e, 0x03, 0x00, 0x00, 0xc8, 0x09, 0x00, 0x00, 0x5e, 0x03, 0x00, 0x00, 0x54, 0x03, 0x00, 0x00, 0xe7, 0x09, 0x00, 0x00, 0xe7, 0x09, 0x00, 0x00, + 0xcc, 0x09, 0x00, 0x00, 0x5e, 0x03, 0x00, 0x00, 0xc3, 0x09, 0x00, 0x00, 0x75, 0x03, 0x00, 0x00, 0x74, 0x03, 0x00, 0x00, 0x74, 0x03, 0x00, 0x00, 0xc1, 0x09, + 0x00, 0x00, 0xc3, 0x09, 0x00, 0x00, 0x74, 0x03, 0x00, 0x00, 0x57, 0x03, 0x00, 0x00, 0x59, 0x03, 0x00, 0x00, 0x59, 0x03, 0x00, 0x00, 0xa9, 0x09, 0x00, 0x00, + 0x74, 0x03, 0x00, 0x00, 0xc0, 0x09, 0x00, 0x00, 0xf1, 0x09, 0x00, 0x00, 0xf2, 0x09, 0x00, 0x00, 0xf2, 0x09, 0x00, 0x00, 0xbf, 0x09, 0x00, 0x00, 0xc0, 0x09, + 0x00, 0x00, 0xc0, 0x09, 0x00, 0x00, 0xf3, 0x09, 0x00, 0x00, 0xf4, 0x09, 0x00, 0x00, 0xf4, 0x09, 0x00, 0x00, 0xf1, 0x09, 0x00, 0x00, 0xc0, 0x09, 0x00, 0x00, + 0xf5, 0x09, 0x00, 0x00, 0xf2, 0x09, 0x00, 0x00, 0xf1, 0x09, 0x00, 0x00, 0xf1, 0x09, 0x00, 0x00, 0xf6, 0x09, 0x00, 0x00, 0xf5, 0x09, 0x00, 0x00, 0xf7, 0x09, + 0x00, 0x00, 0xf8, 0x09, 0x00, 0x00, 0xbf, 0x09, 0x00, 0x00, 0xbf, 0x09, 0x00, 0x00, 0xf2, 0x09, 0x00, 0x00, 0xf7, 0x09, 0x00, 0x00, 0xf8, 0x09, 0x00, 0x00, + 0xb9, 0x09, 0x00, 0x00, 0xb5, 0x09, 0x00, 0x00, 0xb5, 0x09, 0x00, 0x00, 0xbf, 0x09, 0x00, 0x00, 0xf8, 0x09, 0x00, 0x00, 0xbe, 0x09, 0x00, 0x00, 0xf3, 0x09, + 0x00, 0x00, 0xc0, 0x09, 0x00, 0x00, 0xc0, 0x09, 0x00, 0x00, 0xb8, 0x09, 0x00, 0x00, 0xbe, 0x09, 0x00, 0x00, 0xf6, 0x09, 0x00, 0x00, 0xf9, 0x09, 0x00, 0x00, + 0xfa, 0x09, 0x00, 0x00, 0xfa, 0x09, 0x00, 0x00, 0xf5, 0x09, 0x00, 0x00, 0xf6, 0x09, 0x00, 0x00, 0x84, 0x03, 0x00, 0x00, 0x83, 0x03, 0x00, 0x00, 0xf9, 0x09, + 0x00, 0x00, 0xf9, 0x09, 0x00, 0x00, 0xf6, 0x09, 0x00, 0x00, 0x84, 0x03, 0x00, 0x00, 0xf9, 0x09, 0x00, 0x00, 0xfb, 0x09, 0x00, 0x00, 0xfc, 0x09, 0x00, 0x00, + 0xfc, 0x09, 0x00, 0x00, 0xfa, 0x09, 0x00, 0x00, 0xf9, 0x09, 0x00, 0x00, 0xfd, 0x09, 0x00, 0x00, 0xfe, 0x09, 0x00, 0x00, 0xf5, 0x09, 0x00, 0x00, 0xf5, 0x09, + 0x00, 0x00, 0xfa, 0x09, 0x00, 0x00, 0xfd, 0x09, 0x00, 0x00, 0xfe, 0x09, 0x00, 0x00, 0xf7, 0x09, 0x00, 0x00, 0xf2, 0x09, 0x00, 0x00, 0xf2, 0x09, 0x00, 0x00, + 0xf5, 0x09, 0x00, 0x00, 0xfe, 0x09, 0x00, 0x00, 0xf4, 0x09, 0x00, 0x00, 0x84, 0x03, 0x00, 0x00, 0xf6, 0x09, 0x00, 0x00, 0xf6, 0x09, 0x00, 0x00, 0xf1, 0x09, + 0x00, 0x00, 0xf4, 0x09, 0x00, 0x00, 0x81, 0x03, 0x00, 0x00, 0xfb, 0x09, 0x00, 0x00, 0xf9, 0x09, 0x00, 0x00, 0xf9, 0x09, 0x00, 0x00, 0x83, 0x03, 0x00, 0x00, + 0x81, 0x03, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xfc, 0x09, 0x00, 0x00, 0xfb, 0x09, 0x00, 0x00, 0xfb, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xff, 0x09, + 0x00, 0x00, 0x01, 0x0a, 0x00, 0x00, 0xfd, 0x09, 0x00, 0x00, 0xfa, 0x09, 0x00, 0x00, 0xfa, 0x09, 0x00, 0x00, 0xfc, 0x09, 0x00, 0x00, 0x01, 0x0a, 0x00, 0x00, + 0x02, 0x0a, 0x00, 0x00, 0x01, 0x0a, 0x00, 0x00, 0xfc, 0x09, 0x00, 0x00, 0xfc, 0x09, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x03, + 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xfb, 0x09, 0x00, 0x00, 0xfb, 0x09, 0x00, 0x00, 0x81, 0x03, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x03, 0x0a, 0x00, 0x00, + 0x04, 0x0a, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x03, 0x0a, 0x00, 0x00, 0xec, 0x09, 0x00, 0x00, 0xee, 0x09, + 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, 0x46, 0x03, 0x00, 0x00, 0xec, 0x09, 0x00, 0x00, 0x76, 0x03, 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, + 0xee, 0x09, 0x00, 0x00, 0xee, 0x09, 0x00, 0x00, 0x06, 0x0a, 0x00, 0x00, 0x76, 0x03, 0x00, 0x00, 0x47, 0x03, 0x00, 0x00, 0x46, 0x03, 0x00, 0x00, 0x05, 0x0a, + 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, 0x87, 0x03, 0x00, 0x00, 0x47, 0x03, 0x00, 0x00, 0x07, 0x0a, 0x00, 0x00, 0x63, 0x03, 0x00, 0x00, 0x62, 0x03, 0x00, 0x00, + 0x62, 0x03, 0x00, 0x00, 0x08, 0x0a, 0x00, 0x00, 0x07, 0x0a, 0x00, 0x00, 0x50, 0x03, 0x00, 0x00, 0xc6, 0x09, 0x00, 0x00, 0x09, 0x0a, 0x00, 0x00, 0x09, 0x0a, + 0x00, 0x00, 0x4e, 0x03, 0x00, 0x00, 0x50, 0x03, 0x00, 0x00, 0xb2, 0x09, 0x00, 0x00, 0x0a, 0x0a, 0x00, 0x00, 0xb3, 0x09, 0x00, 0x00, 0xb3, 0x09, 0x00, 0x00, + 0xb0, 0x09, 0x00, 0x00, 0xb2, 0x09, 0x00, 0x00, 0x0b, 0x0a, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x0a, 0x0a, 0x00, 0x00, 0x0a, 0x0a, 0x00, 0x00, 0xb2, 0x09, + 0x00, 0x00, 0x0b, 0x0a, 0x00, 0x00, 0xb3, 0x09, 0x00, 0x00, 0x0a, 0x0a, 0x00, 0x00, 0x0d, 0x0a, 0x00, 0x00, 0x0d, 0x0a, 0x00, 0x00, 0xeb, 0x09, 0x00, 0x00, + 0xb3, 0x09, 0x00, 0x00, 0x0e, 0x0a, 0x00, 0x00, 0x0f, 0x0a, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x0b, 0x0a, 0x00, 0x00, 0x0e, 0x0a, + 0x00, 0x00, 0x0a, 0x0a, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x10, 0x0a, 0x00, 0x00, 0x10, 0x0a, 0x00, 0x00, 0x0d, 0x0a, 0x00, 0x00, 0x0a, 0x0a, 0x00, 0x00, + 0xb2, 0x09, 0x00, 0x00, 0x63, 0x03, 0x00, 0x00, 0x07, 0x0a, 0x00, 0x00, 0x07, 0x0a, 0x00, 0x00, 0x0b, 0x0a, 0x00, 0x00, 0xb2, 0x09, 0x00, 0x00, 0x08, 0x0a, + 0x00, 0x00, 0x66, 0x03, 0x00, 0x00, 0x65, 0x03, 0x00, 0x00, 0x65, 0x03, 0x00, 0x00, 0x07, 0x0a, 0x00, 0x00, 0x08, 0x0a, 0x00, 0x00, 0x08, 0x0a, 0x00, 0x00, + 0x11, 0x0a, 0x00, 0x00, 0x73, 0x03, 0x00, 0x00, 0x73, 0x03, 0x00, 0x00, 0x66, 0x03, 0x00, 0x00, 0x08, 0x0a, 0x00, 0x00, 0x0b, 0x0a, 0x00, 0x00, 0x07, 0x0a, + 0x00, 0x00, 0x65, 0x03, 0x00, 0x00, 0x65, 0x03, 0x00, 0x00, 0x0e, 0x0a, 0x00, 0x00, 0x0b, 0x0a, 0x00, 0x00, 0xd1, 0x09, 0x00, 0x00, 0x11, 0x0a, 0x00, 0x00, + 0x08, 0x0a, 0x00, 0x00, 0x08, 0x0a, 0x00, 0x00, 0x62, 0x03, 0x00, 0x00, 0xd1, 0x09, 0x00, 0x00, 0x12, 0x0a, 0x00, 0x00, 0x0f, 0x0a, 0x00, 0x00, 0x0e, 0x0a, + 0x00, 0x00, 0x0e, 0x0a, 0x00, 0x00, 0x13, 0x0a, 0x00, 0x00, 0x12, 0x0a, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0x0f, 0x0a, 0x00, 0x00, 0x14, 0x0a, 0x00, 0x00, + 0x14, 0x0a, 0x00, 0x00, 0x10, 0x0a, 0x00, 0x00, 0x0c, 0x0a, 0x00, 0x00, 0xc2, 0x09, 0x00, 0x00, 0x15, 0x0a, 0x00, 0x00, 0x16, 0x0a, 0x00, 0x00, 0x16, 0x0a, + 0x00, 0x00, 0xc3, 0x09, 0x00, 0x00, 0xc2, 0x09, 0x00, 0x00, 0xc2, 0x09, 0x00, 0x00, 0x4e, 0x03, 0x00, 0x00, 0x09, 0x0a, 0x00, 0x00, 0x09, 0x0a, 0x00, 0x00, + 0x17, 0x0a, 0x00, 0x00, 0xc2, 0x09, 0x00, 0x00, 0x09, 0x0a, 0x00, 0x00, 0x18, 0x0a, 0x00, 0x00, 0x19, 0x0a, 0x00, 0x00, 0x19, 0x0a, 0x00, 0x00, 0x17, 0x0a, + 0x00, 0x00, 0x09, 0x0a, 0x00, 0x00, 0x15, 0x0a, 0x00, 0x00, 0xc2, 0x09, 0x00, 0x00, 0x17, 0x0a, 0x00, 0x00, 0x17, 0x0a, 0x00, 0x00, 0x1a, 0x0a, 0x00, 0x00, + 0x15, 0x0a, 0x00, 0x00, 0x1b, 0x0a, 0x00, 0x00, 0x1c, 0x0a, 0x00, 0x00, 0x1d, 0x0a, 0x00, 0x00, 0x1d, 0x0a, 0x00, 0x00, 0x1e, 0x0a, 0x00, 0x00, 0x1b, 0x0a, + 0x00, 0x00, 0x1f, 0x0a, 0x00, 0x00, 0x77, 0x03, 0x00, 0x00, 0x1c, 0x0a, 0x00, 0x00, 0x1c, 0x0a, 0x00, 0x00, 0x1b, 0x0a, 0x00, 0x00, 0x1f, 0x0a, 0x00, 0x00, + 0x20, 0x0a, 0x00, 0x00, 0x1d, 0x0a, 0x00, 0x00, 0x1c, 0x0a, 0x00, 0x00, 0x1c, 0x0a, 0x00, 0x00, 0x06, 0x0a, 0x00, 0x00, 0x20, 0x0a, 0x00, 0x00, 0x1e, 0x0a, + 0x00, 0x00, 0x1d, 0x0a, 0x00, 0x00, 0x16, 0x0a, 0x00, 0x00, 0x16, 0x0a, 0x00, 0x00, 0x15, 0x0a, 0x00, 0x00, 0x1e, 0x0a, 0x00, 0x00, 0x1e, 0x0a, 0x00, 0x00, + 0x21, 0x0a, 0x00, 0x00, 0x22, 0x0a, 0x00, 0x00, 0x22, 0x0a, 0x00, 0x00, 0x1b, 0x0a, 0x00, 0x00, 0x1e, 0x0a, 0x00, 0x00, 0x77, 0x03, 0x00, 0x00, 0x1f, 0x0a, + 0x00, 0x00, 0x04, 0x0a, 0x00, 0x00, 0x04, 0x0a, 0x00, 0x00, 0x78, 0x03, 0x00, 0x00, 0x77, 0x03, 0x00, 0x00, 0x06, 0x0a, 0x00, 0x00, 0x1c, 0x0a, 0x00, 0x00, + 0x77, 0x03, 0x00, 0x00, 0x77, 0x03, 0x00, 0x00, 0x76, 0x03, 0x00, 0x00, 0x06, 0x0a, 0x00, 0x00, 0x1b, 0x0a, 0x00, 0x00, 0x22, 0x0a, 0x00, 0x00, 0x02, 0x0a, + 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x1f, 0x0a, 0x00, 0x00, 0x1b, 0x0a, 0x00, 0x00, 0x23, 0x0a, 0x00, 0x00, 0x16, 0x0a, 0x00, 0x00, 0x1d, 0x0a, 0x00, 0x00, + 0x1d, 0x0a, 0x00, 0x00, 0x20, 0x0a, 0x00, 0x00, 0x23, 0x0a, 0x00, 0x00, 0x15, 0x0a, 0x00, 0x00, 0x1a, 0x0a, 0x00, 0x00, 0x21, 0x0a, 0x00, 0x00, 0x21, 0x0a, + 0x00, 0x00, 0x1e, 0x0a, 0x00, 0x00, 0x15, 0x0a, 0x00, 0x00, 0x89, 0x09, 0x00, 0x00, 0xef, 0x09, 0x00, 0x00, 0xed, 0x09, 0x00, 0x00, 0xed, 0x09, 0x00, 0x00, + 0x45, 0x03, 0x00, 0x00, 0x89, 0x09, 0x00, 0x00, 0x24, 0x0a, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0xef, 0x09, 0x00, 0x00, 0xef, 0x09, 0x00, 0x00, 0x25, 0x0a, + 0x00, 0x00, 0x24, 0x0a, 0x00, 0x00, 0xe3, 0x09, 0x00, 0x00, 0xe2, 0x09, 0x00, 0x00, 0x26, 0x0a, 0x00, 0x00, 0x26, 0x0a, 0x00, 0x00, 0x27, 0x0a, 0x00, 0x00, + 0xe3, 0x09, 0x00, 0x00, 0xe0, 0x09, 0x00, 0x00, 0xdd, 0x09, 0x00, 0x00, 0xe3, 0x09, 0x00, 0x00, 0xe3, 0x09, 0x00, 0x00, 0x28, 0x0a, 0x00, 0x00, 0xe0, 0x09, + 0x00, 0x00, 0xe2, 0x09, 0x00, 0x00, 0xe4, 0x09, 0x00, 0x00, 0x29, 0x0a, 0x00, 0x00, 0x29, 0x0a, 0x00, 0x00, 0x26, 0x0a, 0x00, 0x00, 0xe2, 0x09, 0x00, 0x00, + 0x2a, 0x0a, 0x00, 0x00, 0x2b, 0x0a, 0x00, 0x00, 0x27, 0x0a, 0x00, 0x00, 0x27, 0x0a, 0x00, 0x00, 0x26, 0x0a, 0x00, 0x00, 0x2a, 0x0a, 0x00, 0x00, 0x28, 0x0a, + 0x00, 0x00, 0xe3, 0x09, 0x00, 0x00, 0x27, 0x0a, 0x00, 0x00, 0x27, 0x0a, 0x00, 0x00, 0x2c, 0x0a, 0x00, 0x00, 0x28, 0x0a, 0x00, 0x00, 0x2b, 0x0a, 0x00, 0x00, + 0x2a, 0x0a, 0x00, 0x00, 0x2d, 0x0a, 0x00, 0x00, 0x2d, 0x0a, 0x00, 0x00, 0x2e, 0x0a, 0x00, 0x00, 0x2b, 0x0a, 0x00, 0x00, 0x2b, 0x0a, 0x00, 0x00, 0x2f, 0x0a, + 0x00, 0x00, 0x2c, 0x0a, 0x00, 0x00, 0x2c, 0x0a, 0x00, 0x00, 0x27, 0x0a, 0x00, 0x00, 0x2b, 0x0a, 0x00, 0x00, 0x26, 0x0a, 0x00, 0x00, 0x29, 0x0a, 0x00, 0x00, + 0x69, 0x03, 0x00, 0x00, 0x69, 0x03, 0x00, 0x00, 0x2a, 0x0a, 0x00, 0x00, 0x26, 0x0a, 0x00, 0x00, 0x2a, 0x0a, 0x00, 0x00, 0x69, 0x03, 0x00, 0x00, 0x6b, 0x03, + 0x00, 0x00, 0x6b, 0x03, 0x00, 0x00, 0x2d, 0x0a, 0x00, 0x00, 0x2a, 0x0a, 0x00, 0x00, 0x2e, 0x0a, 0x00, 0x00, 0x2d, 0x0a, 0x00, 0x00, 0x30, 0x0a, 0x00, 0x00, + 0x30, 0x0a, 0x00, 0x00, 0x31, 0x0a, 0x00, 0x00, 0x2e, 0x0a, 0x00, 0x00, 0x2f, 0x0a, 0x00, 0x00, 0x2b, 0x0a, 0x00, 0x00, 0x2e, 0x0a, 0x00, 0x00, 0x2e, 0x0a, + 0x00, 0x00, 0x32, 0x0a, 0x00, 0x00, 0x2f, 0x0a, 0x00, 0x00, 0x2d, 0x0a, 0x00, 0x00, 0x6b, 0x03, 0x00, 0x00, 0x33, 0x0a, 0x00, 0x00, 0x33, 0x0a, 0x00, 0x00, + 0x30, 0x0a, 0x00, 0x00, 0x2d, 0x0a, 0x00, 0x00, 0x31, 0x0a, 0x00, 0x00, 0x30, 0x0a, 0x00, 0x00, 0x34, 0x0a, 0x00, 0x00, 0x34, 0x0a, 0x00, 0x00, 0xba, 0x09, + 0x00, 0x00, 0x31, 0x0a, 0x00, 0x00, 0x32, 0x0a, 0x00, 0x00, 0x2e, 0x0a, 0x00, 0x00, 0x31, 0x0a, 0x00, 0x00, 0x31, 0x0a, 0x00, 0x00, 0x35, 0x0a, 0x00, 0x00, + 0x32, 0x0a, 0x00, 0x00, 0x30, 0x0a, 0x00, 0x00, 0x33, 0x0a, 0x00, 0x00, 0x36, 0x0a, 0x00, 0x00, 0x36, 0x0a, 0x00, 0x00, 0x34, 0x0a, 0x00, 0x00, 0x30, 0x0a, + 0x00, 0x00, 0xba, 0x09, 0x00, 0x00, 0x34, 0x0a, 0x00, 0x00, 0xbb, 0x09, 0x00, 0x00, 0xbb, 0x09, 0x00, 0x00, 0xb6, 0x09, 0x00, 0x00, 0xba, 0x09, 0x00, 0x00, + 0x35, 0x0a, 0x00, 0x00, 0x31, 0x0a, 0x00, 0x00, 0xba, 0x09, 0x00, 0x00, 0xba, 0x09, 0x00, 0x00, 0xb9, 0x09, 0x00, 0x00, 0x35, 0x0a, 0x00, 0x00, 0x34, 0x0a, + 0x00, 0x00, 0x36, 0x0a, 0x00, 0x00, 0x37, 0x0a, 0x00, 0x00, 0x37, 0x0a, 0x00, 0x00, 0xbb, 0x09, 0x00, 0x00, 0x34, 0x0a, 0x00, 0x00, 0xbb, 0x09, 0x00, 0x00, + 0x37, 0x0a, 0x00, 0x00, 0x38, 0x0a, 0x00, 0x00, 0x38, 0x0a, 0x00, 0x00, 0xbc, 0x09, 0x00, 0x00, 0xbb, 0x09, 0x00, 0x00, 0xb7, 0x09, 0x00, 0x00, 0xbc, 0x09, + 0x00, 0x00, 0x39, 0x0a, 0x00, 0x00, 0x39, 0x0a, 0x00, 0x00, 0xbd, 0x09, 0x00, 0x00, 0xb7, 0x09, 0x00, 0x00, 0xbc, 0x09, 0x00, 0x00, 0x38, 0x0a, 0x00, 0x00, + 0x3a, 0x0a, 0x00, 0x00, 0x3a, 0x0a, 0x00, 0x00, 0x39, 0x0a, 0x00, 0x00, 0xbc, 0x09, 0x00, 0x00, 0xbd, 0x09, 0x00, 0x00, 0x39, 0x0a, 0x00, 0x00, 0x3b, 0x0a, + 0x00, 0x00, 0x3b, 0x0a, 0x00, 0x00, 0x3c, 0x0a, 0x00, 0x00, 0xbd, 0x09, 0x00, 0x00, 0x39, 0x0a, 0x00, 0x00, 0x3a, 0x0a, 0x00, 0x00, 0x3d, 0x0a, 0x00, 0x00, + 0x3d, 0x0a, 0x00, 0x00, 0x3b, 0x0a, 0x00, 0x00, 0x39, 0x0a, 0x00, 0x00, 0x3c, 0x0a, 0x00, 0x00, 0x3b, 0x0a, 0x00, 0x00, 0x9a, 0x09, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x99, 0x09, 0x00, 0x00, 0x3c, 0x0a, 0x00, 0x00, 0x3e, 0x0a, 0x00, 0x00, 0xbe, 0x09, 0x00, 0x00, 0xbd, 0x09, 0x00, 0x00, 0xbd, 0x09, 0x00, 0x00, + 0x3c, 0x0a, 0x00, 0x00, 0x3e, 0x0a, 0x00, 0x00, 0x3b, 0x0a, 0x00, 0x00, 0x3d, 0x0a, 0x00, 0x00, 0xa2, 0x09, 0x00, 0x00, 0xa2, 0x09, 0x00, 0x00, 0x9a, 0x09, + 0x00, 0x00, 0x3b, 0x0a, 0x00, 0x00, 0x9b, 0x09, 0x00, 0x00, 0x3e, 0x0a, 0x00, 0x00, 0x3c, 0x0a, 0x00, 0x00, 0x3c, 0x0a, 0x00, 0x00, 0x99, 0x09, 0x00, 0x00, + 0x9b, 0x09, 0x00, 0x00, 0x7d, 0x03, 0x00, 0x00, 0x7c, 0x03, 0x00, 0x00, 0xd8, 0x09, 0x00, 0x00, 0xd8, 0x09, 0x00, 0x00, 0xdf, 0x09, 0x00, 0x00, 0x7d, 0x03, + 0x00, 0x00, 0xe8, 0x09, 0x00, 0x00, 0x3f, 0x0a, 0x00, 0x00, 0x29, 0x0a, 0x00, 0x00, 0x29, 0x0a, 0x00, 0x00, 0xe4, 0x09, 0x00, 0x00, 0xe8, 0x09, 0x00, 0x00, + 0x29, 0x0a, 0x00, 0x00, 0x3f, 0x0a, 0x00, 0x00, 0x6a, 0x03, 0x00, 0x00, 0x6a, 0x03, 0x00, 0x00, 0x69, 0x03, 0x00, 0x00, 0x29, 0x0a, 0x00, 0x00, 0x6b, 0x03, + 0x00, 0x00, 0x6a, 0x03, 0x00, 0x00, 0x40, 0x0a, 0x00, 0x00, 0x40, 0x0a, 0x00, 0x00, 0x33, 0x0a, 0x00, 0x00, 0x6b, 0x03, 0x00, 0x00, 0x33, 0x0a, 0x00, 0x00, + 0x40, 0x0a, 0x00, 0x00, 0x41, 0x0a, 0x00, 0x00, 0x41, 0x0a, 0x00, 0x00, 0x36, 0x0a, 0x00, 0x00, 0x33, 0x0a, 0x00, 0x00, 0x36, 0x0a, 0x00, 0x00, 0x41, 0x0a, + 0x00, 0x00, 0x42, 0x0a, 0x00, 0x00, 0x42, 0x0a, 0x00, 0x00, 0x37, 0x0a, 0x00, 0x00, 0x36, 0x0a, 0x00, 0x00, 0x37, 0x0a, 0x00, 0x00, 0x42, 0x0a, 0x00, 0x00, + 0x43, 0x0a, 0x00, 0x00, 0x43, 0x0a, 0x00, 0x00, 0x38, 0x0a, 0x00, 0x00, 0x37, 0x0a, 0x00, 0x00, 0x38, 0x0a, 0x00, 0x00, 0x43, 0x0a, 0x00, 0x00, 0x44, 0x0a, + 0x00, 0x00, 0x44, 0x0a, 0x00, 0x00, 0x3a, 0x0a, 0x00, 0x00, 0x38, 0x0a, 0x00, 0x00, 0x3a, 0x0a, 0x00, 0x00, 0x44, 0x0a, 0x00, 0x00, 0x45, 0x0a, 0x00, 0x00, + 0x45, 0x0a, 0x00, 0x00, 0x3d, 0x0a, 0x00, 0x00, 0x3a, 0x0a, 0x00, 0x00, 0x3d, 0x0a, 0x00, 0x00, 0x45, 0x0a, 0x00, 0x00, 0x9c, 0x09, 0x00, 0x00, 0x9c, 0x09, + 0x00, 0x00, 0xa2, 0x09, 0x00, 0x00, 0x3d, 0x0a, 0x00, 0x00, 0xe8, 0x09, 0x00, 0x00, 0xeb, 0x09, 0x00, 0x00, 0x0d, 0x0a, 0x00, 0x00, 0x0d, 0x0a, 0x00, 0x00, + 0x3f, 0x0a, 0x00, 0x00, 0xe8, 0x09, 0x00, 0x00, 0x3f, 0x0a, 0x00, 0x00, 0x0d, 0x0a, 0x00, 0x00, 0x10, 0x0a, 0x00, 0x00, 0x10, 0x0a, 0x00, 0x00, 0x6a, 0x03, + 0x00, 0x00, 0x3f, 0x0a, 0x00, 0x00, 0x6a, 0x03, 0x00, 0x00, 0x10, 0x0a, 0x00, 0x00, 0x14, 0x0a, 0x00, 0x00, 0x14, 0x0a, 0x00, 0x00, 0x40, 0x0a, 0x00, 0x00, + 0x6a, 0x03, 0x00, 0x00, 0x40, 0x0a, 0x00, 0x00, 0x14, 0x0a, 0x00, 0x00, 0x46, 0x0a, 0x00, 0x00, 0x46, 0x0a, 0x00, 0x00, 0x41, 0x0a, 0x00, 0x00, 0x40, 0x0a, + 0x00, 0x00, 0x41, 0x0a, 0x00, 0x00, 0x46, 0x0a, 0x00, 0x00, 0x47, 0x0a, 0x00, 0x00, 0x47, 0x0a, 0x00, 0x00, 0x42, 0x0a, 0x00, 0x00, 0x41, 0x0a, 0x00, 0x00, + 0x42, 0x0a, 0x00, 0x00, 0x47, 0x0a, 0x00, 0x00, 0x48, 0x0a, 0x00, 0x00, 0x48, 0x0a, 0x00, 0x00, 0x43, 0x0a, 0x00, 0x00, 0x42, 0x0a, 0x00, 0x00, 0x43, 0x0a, + 0x00, 0x00, 0x48, 0x0a, 0x00, 0x00, 0x49, 0x0a, 0x00, 0x00, 0x49, 0x0a, 0x00, 0x00, 0x44, 0x0a, 0x00, 0x00, 0x43, 0x0a, 0x00, 0x00, 0x44, 0x0a, 0x00, 0x00, + 0x49, 0x0a, 0x00, 0x00, 0x4a, 0x0a, 0x00, 0x00, 0x4a, 0x0a, 0x00, 0x00, 0x45, 0x0a, 0x00, 0x00, 0x44, 0x0a, 0x00, 0x00, 0x45, 0x0a, 0x00, 0x00, 0x4a, 0x0a, + 0x00, 0x00, 0x9d, 0x09, 0x00, 0x00, 0x9d, 0x09, 0x00, 0x00, 0x9c, 0x09, 0x00, 0x00, 0x45, 0x0a, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, 0x3f, 0x03, 0x00, 0x00, + 0xa2, 0x09, 0x00, 0x00, 0xa2, 0x09, 0x00, 0x00, 0x9c, 0x09, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, 0x0f, 0x0a, 0x00, 0x00, 0x12, 0x0a, 0x00, 0x00, 0x46, 0x0a, + 0x00, 0x00, 0x46, 0x0a, 0x00, 0x00, 0x14, 0x0a, 0x00, 0x00, 0x0f, 0x0a, 0x00, 0x00, 0x12, 0x0a, 0x00, 0x00, 0x6d, 0x03, 0x00, 0x00, 0x47, 0x0a, 0x00, 0x00, + 0x47, 0x0a, 0x00, 0x00, 0x46, 0x0a, 0x00, 0x00, 0x12, 0x0a, 0x00, 0x00, 0x6d, 0x03, 0x00, 0x00, 0x6c, 0x03, 0x00, 0x00, 0x48, 0x0a, 0x00, 0x00, 0x48, 0x0a, + 0x00, 0x00, 0x47, 0x0a, 0x00, 0x00, 0x6d, 0x03, 0x00, 0x00, 0x6c, 0x03, 0x00, 0x00, 0x6f, 0x03, 0x00, 0x00, 0x49, 0x0a, 0x00, 0x00, 0x49, 0x0a, 0x00, 0x00, + 0x48, 0x0a, 0x00, 0x00, 0x6c, 0x03, 0x00, 0x00, 0x6f, 0x03, 0x00, 0x00, 0x70, 0x03, 0x00, 0x00, 0x4a, 0x0a, 0x00, 0x00, 0x4a, 0x0a, 0x00, 0x00, 0x49, 0x0a, + 0x00, 0x00, 0x6f, 0x03, 0x00, 0x00, 0x70, 0x03, 0x00, 0x00, 0x72, 0x03, 0x00, 0x00, 0x9d, 0x09, 0x00, 0x00, 0x9d, 0x09, 0x00, 0x00, 0x4a, 0x0a, 0x00, 0x00, + 0x70, 0x03, 0x00, 0x00, 0x6d, 0x03, 0x00, 0x00, 0x12, 0x0a, 0x00, 0x00, 0x13, 0x0a, 0x00, 0x00, 0x13, 0x0a, 0x00, 0x00, 0x6e, 0x03, 0x00, 0x00, 0x6d, 0x03, + 0x00, 0x00, 0x13, 0x0a, 0x00, 0x00, 0x0e, 0x0a, 0x00, 0x00, 0x65, 0x03, 0x00, 0x00, 0x65, 0x03, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x13, 0x0a, 0x00, 0x00, + 0xd0, 0x09, 0x00, 0x00, 0x24, 0x0a, 0x00, 0x00, 0x11, 0x0a, 0x00, 0x00, 0x11, 0x0a, 0x00, 0x00, 0xd1, 0x09, 0x00, 0x00, 0xd0, 0x09, 0x00, 0x00, 0x11, 0x0a, + 0x00, 0x00, 0x24, 0x0a, 0x00, 0x00, 0x25, 0x0a, 0x00, 0x00, 0x25, 0x0a, 0x00, 0x00, 0x73, 0x03, 0x00, 0x00, 0x11, 0x0a, 0x00, 0x00, 0xd0, 0x09, 0x00, 0x00, + 0x67, 0x03, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0x24, 0x0a, 0x00, 0x00, 0xd0, 0x09, 0x00, 0x00, 0x51, 0x09, 0x00, 0x00, 0x34, 0x02, + 0x00, 0x00, 0x73, 0x03, 0x00, 0x00, 0x73, 0x03, 0x00, 0x00, 0x25, 0x0a, 0x00, 0x00, 0x51, 0x09, 0x00, 0x00, 0xce, 0x09, 0x00, 0x00, 0xaf, 0x09, 0x00, 0x00, + 0x67, 0x03, 0x00, 0x00, 0x67, 0x03, 0x00, 0x00, 0xd0, 0x09, 0x00, 0x00, 0xce, 0x09, 0x00, 0x00, 0x51, 0x09, 0x00, 0x00, 0x25, 0x0a, 0x00, 0x00, 0xef, 0x09, + 0x00, 0x00, 0xef, 0x09, 0x00, 0x00, 0x89, 0x09, 0x00, 0x00, 0x51, 0x09, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00, 0x23, 0x0a, 0x00, 0x00, 0x20, 0x0a, 0x00, 0x00, + 0x20, 0x0a, 0x00, 0x00, 0x5a, 0x03, 0x00, 0x00, 0x58, 0x03, 0x00, 0x00, 0x5a, 0x03, 0x00, 0x00, 0x20, 0x0a, 0x00, 0x00, 0x06, 0x0a, 0x00, 0x00, 0x06, 0x0a, + 0x00, 0x00, 0xee, 0x09, 0x00, 0x00, 0x5a, 0x03, 0x00, 0x00, 0x57, 0x03, 0x00, 0x00, 0x75, 0x03, 0x00, 0x00, 0x23, 0x0a, 0x00, 0x00, 0x23, 0x0a, 0x00, 0x00, + 0x58, 0x03, 0x00, 0x00, 0x57, 0x03, 0x00, 0x00, 0x75, 0x03, 0x00, 0x00, 0xc3, 0x09, 0x00, 0x00, 0x16, 0x0a, 0x00, 0x00, 0x16, 0x0a, 0x00, 0x00, 0x23, 0x0a, + 0x00, 0x00, 0x75, 0x03, 0x00, 0x00, 0x76, 0x03, 0x00, 0x00, 0x4b, 0x0a, 0x00, 0x00, 0x87, 0x03, 0x00, 0x00, 0x87, 0x03, 0x00, 0x00, 0x05, 0x0a, 0x00, 0x00, + 0x76, 0x03, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0x04, 0x0a, 0x00, 0x00, 0x04, 0x0a, 0x00, 0x00, 0x1f, 0x0a, 0x00, 0x00, 0x02, 0x0a, + 0x00, 0x00, 0x04, 0x0a, 0x00, 0x00, 0x03, 0x0a, 0x00, 0x00, 0x4c, 0x0a, 0x00, 0x00, 0x4c, 0x0a, 0x00, 0x00, 0x78, 0x03, 0x00, 0x00, 0x04, 0x0a, 0x00, 0x00, + 0xc6, 0x09, 0x00, 0x00, 0x4d, 0x0a, 0x00, 0x00, 0x18, 0x0a, 0x00, 0x00, 0x18, 0x0a, 0x00, 0x00, 0x09, 0x0a, 0x00, 0x00, 0xc6, 0x09, 0x00, 0x00, 0x1a, 0x0a, + 0x00, 0x00, 0x4e, 0x0a, 0x00, 0x00, 0x4f, 0x0a, 0x00, 0x00, 0x4f, 0x0a, 0x00, 0x00, 0x21, 0x0a, 0x00, 0x00, 0x1a, 0x0a, 0x00, 0x00, 0x21, 0x0a, 0x00, 0x00, + 0x4f, 0x0a, 0x00, 0x00, 0x50, 0x0a, 0x00, 0x00, 0x50, 0x0a, 0x00, 0x00, 0x22, 0x0a, 0x00, 0x00, 0x21, 0x0a, 0x00, 0x00, 0x22, 0x0a, 0x00, 0x00, 0x50, 0x0a, + 0x00, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x22, 0x0a, 0x00, 0x00, 0x79, 0x03, 0x00, 0x00, 0x7b, 0x03, 0x00, 0x00, + 0xc5, 0x09, 0x00, 0x00, 0xc5, 0x09, 0x00, 0x00, 0xc4, 0x09, 0x00, 0x00, 0x79, 0x03, 0x00, 0x00, 0xc6, 0x09, 0x00, 0x00, 0xc5, 0x09, 0x00, 0x00, 0x51, 0x0a, + 0x00, 0x00, 0x51, 0x0a, 0x00, 0x00, 0x4d, 0x0a, 0x00, 0x00, 0xc6, 0x09, 0x00, 0x00, 0xc5, 0x09, 0x00, 0x00, 0x7b, 0x03, 0x00, 0x00, 0x52, 0x0a, 0x00, 0x00, + 0x52, 0x0a, 0x00, 0x00, 0x51, 0x0a, 0x00, 0x00, 0xc5, 0x09, 0x00, 0x00, 0x4d, 0x0a, 0x00, 0x00, 0x51, 0x0a, 0x00, 0x00, 0x53, 0x0a, 0x00, 0x00, 0x53, 0x0a, + 0x00, 0x00, 0x18, 0x0a, 0x00, 0x00, 0x4d, 0x0a, 0x00, 0x00, 0x18, 0x0a, 0x00, 0x00, 0x53, 0x0a, 0x00, 0x00, 0x54, 0x0a, 0x00, 0x00, 0x54, 0x0a, 0x00, 0x00, + 0x19, 0x0a, 0x00, 0x00, 0x18, 0x0a, 0x00, 0x00, 0x1a, 0x0a, 0x00, 0x00, 0x17, 0x0a, 0x00, 0x00, 0x19, 0x0a, 0x00, 0x00, 0x19, 0x0a, 0x00, 0x00, 0x4e, 0x0a, + 0x00, 0x00, 0x1a, 0x0a, 0x00, 0x00, 0x4e, 0x0a, 0x00, 0x00, 0x55, 0x0a, 0x00, 0x00, 0x56, 0x0a, 0x00, 0x00, 0x56, 0x0a, 0x00, 0x00, 0x4f, 0x0a, 0x00, 0x00, + 0x4e, 0x0a, 0x00, 0x00, 0x4f, 0x0a, 0x00, 0x00, 0x56, 0x0a, 0x00, 0x00, 0x57, 0x0a, 0x00, 0x00, 0x57, 0x0a, 0x00, 0x00, 0x50, 0x0a, 0x00, 0x00, 0x4f, 0x0a, + 0x00, 0x00, 0x50, 0x0a, 0x00, 0x00, 0x57, 0x0a, 0x00, 0x00, 0xfd, 0x09, 0x00, 0x00, 0xfd, 0x09, 0x00, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x50, 0x0a, 0x00, 0x00, + 0x51, 0x0a, 0x00, 0x00, 0x52, 0x0a, 0x00, 0x00, 0x58, 0x0a, 0x00, 0x00, 0x58, 0x0a, 0x00, 0x00, 0x53, 0x0a, 0x00, 0x00, 0x51, 0x0a, 0x00, 0x00, 0x53, 0x0a, + 0x00, 0x00, 0x58, 0x0a, 0x00, 0x00, 0x59, 0x0a, 0x00, 0x00, 0x59, 0x0a, 0x00, 0x00, 0x54, 0x0a, 0x00, 0x00, 0x53, 0x0a, 0x00, 0x00, 0x4e, 0x0a, 0x00, 0x00, + 0x19, 0x0a, 0x00, 0x00, 0x54, 0x0a, 0x00, 0x00, 0x54, 0x0a, 0x00, 0x00, 0x55, 0x0a, 0x00, 0x00, 0x4e, 0x0a, 0x00, 0x00, 0x55, 0x0a, 0x00, 0x00, 0x5a, 0x0a, + 0x00, 0x00, 0x5b, 0x0a, 0x00, 0x00, 0x5b, 0x0a, 0x00, 0x00, 0x56, 0x0a, 0x00, 0x00, 0x55, 0x0a, 0x00, 0x00, 0x56, 0x0a, 0x00, 0x00, 0x5b, 0x0a, 0x00, 0x00, + 0x5c, 0x0a, 0x00, 0x00, 0x5c, 0x0a, 0x00, 0x00, 0x57, 0x0a, 0x00, 0x00, 0x56, 0x0a, 0x00, 0x00, 0x57, 0x0a, 0x00, 0x00, 0x5c, 0x0a, 0x00, 0x00, 0xfe, 0x09, + 0x00, 0x00, 0xfe, 0x09, 0x00, 0x00, 0xfd, 0x09, 0x00, 0x00, 0x57, 0x0a, 0x00, 0x00, 0x58, 0x0a, 0x00, 0x00, 0x5d, 0x0a, 0x00, 0x00, 0x5e, 0x0a, 0x00, 0x00, + 0x5e, 0x0a, 0x00, 0x00, 0x59, 0x0a, 0x00, 0x00, 0x58, 0x0a, 0x00, 0x00, 0x55, 0x0a, 0x00, 0x00, 0x54, 0x0a, 0x00, 0x00, 0x59, 0x0a, 0x00, 0x00, 0x59, 0x0a, + 0x00, 0x00, 0x5a, 0x0a, 0x00, 0x00, 0x55, 0x0a, 0x00, 0x00, 0x7b, 0x03, 0x00, 0x00, 0x7a, 0x03, 0x00, 0x00, 0x5f, 0x0a, 0x00, 0x00, 0x5f, 0x0a, 0x00, 0x00, + 0x52, 0x0a, 0x00, 0x00, 0x7b, 0x03, 0x00, 0x00, 0x5f, 0x0a, 0x00, 0x00, 0x5d, 0x0a, 0x00, 0x00, 0x58, 0x0a, 0x00, 0x00, 0x58, 0x0a, 0x00, 0x00, 0x52, 0x0a, + 0x00, 0x00, 0x5f, 0x0a, 0x00, 0x00, 0x5a, 0x0a, 0x00, 0x00, 0x60, 0x0a, 0x00, 0x00, 0x61, 0x0a, 0x00, 0x00, 0x61, 0x0a, 0x00, 0x00, 0x5b, 0x0a, 0x00, 0x00, + 0x5a, 0x0a, 0x00, 0x00, 0x5b, 0x0a, 0x00, 0x00, 0x61, 0x0a, 0x00, 0x00, 0x62, 0x0a, 0x00, 0x00, 0x62, 0x0a, 0x00, 0x00, 0x5c, 0x0a, 0x00, 0x00, 0x5b, 0x0a, + 0x00, 0x00, 0x5c, 0x0a, 0x00, 0x00, 0x62, 0x0a, 0x00, 0x00, 0xf7, 0x09, 0x00, 0x00, 0xf7, 0x09, 0x00, 0x00, 0xfe, 0x09, 0x00, 0x00, 0x5c, 0x0a, 0x00, 0x00, + 0x48, 0x03, 0x00, 0x00, 0x4a, 0x03, 0x00, 0x00, 0x7d, 0x03, 0x00, 0x00, 0x7d, 0x03, 0x00, 0x00, 0xa7, 0x09, 0x00, 0x00, 0x48, 0x03, 0x00, 0x00, 0x79, 0x03, + 0x00, 0x00, 0xa7, 0x09, 0x00, 0x00, 0x63, 0x0a, 0x00, 0x00, 0x63, 0x0a, 0x00, 0x00, 0x7a, 0x03, 0x00, 0x00, 0x79, 0x03, 0x00, 0x00, 0x7a, 0x03, 0x00, 0x00, + 0x63, 0x0a, 0x00, 0x00, 0x64, 0x0a, 0x00, 0x00, 0x64, 0x0a, 0x00, 0x00, 0x5f, 0x0a, 0x00, 0x00, 0x7a, 0x03, 0x00, 0x00, 0x64, 0x0a, 0x00, 0x00, 0x65, 0x0a, + 0x00, 0x00, 0x5d, 0x0a, 0x00, 0x00, 0x5d, 0x0a, 0x00, 0x00, 0x5f, 0x0a, 0x00, 0x00, 0x64, 0x0a, 0x00, 0x00, 0x5d, 0x0a, 0x00, 0x00, 0x65, 0x0a, 0x00, 0x00, + 0x66, 0x0a, 0x00, 0x00, 0x66, 0x0a, 0x00, 0x00, 0x5e, 0x0a, 0x00, 0x00, 0x5d, 0x0a, 0x00, 0x00, 0x5a, 0x0a, 0x00, 0x00, 0x59, 0x0a, 0x00, 0x00, 0x5e, 0x0a, + 0x00, 0x00, 0x5e, 0x0a, 0x00, 0x00, 0x60, 0x0a, 0x00, 0x00, 0x5a, 0x0a, 0x00, 0x00, 0x60, 0x0a, 0x00, 0x00, 0x67, 0x0a, 0x00, 0x00, 0x68, 0x0a, 0x00, 0x00, + 0x68, 0x0a, 0x00, 0x00, 0x61, 0x0a, 0x00, 0x00, 0x60, 0x0a, 0x00, 0x00, 0x61, 0x0a, 0x00, 0x00, 0x68, 0x0a, 0x00, 0x00, 0x69, 0x0a, 0x00, 0x00, 0x69, 0x0a, + 0x00, 0x00, 0x62, 0x0a, 0x00, 0x00, 0x61, 0x0a, 0x00, 0x00, 0x62, 0x0a, 0x00, 0x00, 0x69, 0x0a, 0x00, 0x00, 0xf8, 0x09, 0x00, 0x00, 0xf8, 0x09, 0x00, 0x00, + 0xf7, 0x09, 0x00, 0x00, 0x62, 0x0a, 0x00, 0x00, 0xa7, 0x09, 0x00, 0x00, 0x7d, 0x03, 0x00, 0x00, 0xdf, 0x09, 0x00, 0x00, 0xdf, 0x09, 0x00, 0x00, 0x63, 0x0a, + 0x00, 0x00, 0xa7, 0x09, 0x00, 0x00, 0x63, 0x0a, 0x00, 0x00, 0xdf, 0x09, 0x00, 0x00, 0xe0, 0x09, 0x00, 0x00, 0xe0, 0x09, 0x00, 0x00, 0x64, 0x0a, 0x00, 0x00, + 0x63, 0x0a, 0x00, 0x00, 0x64, 0x0a, 0x00, 0x00, 0xe0, 0x09, 0x00, 0x00, 0x28, 0x0a, 0x00, 0x00, 0x28, 0x0a, 0x00, 0x00, 0x65, 0x0a, 0x00, 0x00, 0x64, 0x0a, + 0x00, 0x00, 0x65, 0x0a, 0x00, 0x00, 0x28, 0x0a, 0x00, 0x00, 0x2c, 0x0a, 0x00, 0x00, 0x2c, 0x0a, 0x00, 0x00, 0x66, 0x0a, 0x00, 0x00, 0x65, 0x0a, 0x00, 0x00, + 0x60, 0x0a, 0x00, 0x00, 0x5e, 0x0a, 0x00, 0x00, 0x66, 0x0a, 0x00, 0x00, 0x66, 0x0a, 0x00, 0x00, 0x67, 0x0a, 0x00, 0x00, 0x60, 0x0a, 0x00, 0x00, 0x67, 0x0a, + 0x00, 0x00, 0x2f, 0x0a, 0x00, 0x00, 0x32, 0x0a, 0x00, 0x00, 0x32, 0x0a, 0x00, 0x00, 0x68, 0x0a, 0x00, 0x00, 0x67, 0x0a, 0x00, 0x00, 0x68, 0x0a, 0x00, 0x00, + 0x32, 0x0a, 0x00, 0x00, 0x35, 0x0a, 0x00, 0x00, 0x35, 0x0a, 0x00, 0x00, 0x69, 0x0a, 0x00, 0x00, 0x68, 0x0a, 0x00, 0x00, 0x69, 0x0a, 0x00, 0x00, 0x35, 0x0a, + 0x00, 0x00, 0xb9, 0x09, 0x00, 0x00, 0xb9, 0x09, 0x00, 0x00, 0xf8, 0x09, 0x00, 0x00, 0x69, 0x0a, 0x00, 0x00, 0x67, 0x0a, 0x00, 0x00, 0x66, 0x0a, 0x00, 0x00, + 0x2c, 0x0a, 0x00, 0x00, 0x2c, 0x0a, 0x00, 0x00, 0x2f, 0x0a, 0x00, 0x00, 0x67, 0x0a, 0x00, 0x00, 0x44, 0x03, 0x00, 0x00, 0x7e, 0x03, 0x00, 0x00, 0x6a, 0x0a, + 0x00, 0x00, 0x6a, 0x0a, 0x00, 0x00, 0x98, 0x09, 0x00, 0x00, 0x44, 0x03, 0x00, 0x00, 0x7e, 0x03, 0x00, 0x00, 0x6b, 0x0a, 0x00, 0x00, 0x6c, 0x0a, 0x00, 0x00, + 0x6c, 0x0a, 0x00, 0x00, 0x6a, 0x0a, 0x00, 0x00, 0x7e, 0x03, 0x00, 0x00, 0x6a, 0x0a, 0x00, 0x00, 0x7f, 0x03, 0x00, 0x00, 0xa1, 0x09, 0x00, 0x00, 0xa1, 0x09, + 0x00, 0x00, 0x98, 0x09, 0x00, 0x00, 0x6a, 0x0a, 0x00, 0x00, 0x6a, 0x0a, 0x00, 0x00, 0x6c, 0x0a, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, + 0x7f, 0x03, 0x00, 0x00, 0x6a, 0x0a, 0x00, 0x00, 0xa1, 0x09, 0x00, 0x00, 0x7f, 0x03, 0x00, 0x00, 0x82, 0x03, 0x00, 0x00, 0x82, 0x03, 0x00, 0x00, 0xa0, 0x09, + 0x00, 0x00, 0xa1, 0x09, 0x00, 0x00, 0x7f, 0x03, 0x00, 0x00, 0x81, 0x03, 0x00, 0x00, 0x83, 0x03, 0x00, 0x00, 0x83, 0x03, 0x00, 0x00, 0x82, 0x03, 0x00, 0x00, + 0x7f, 0x03, 0x00, 0x00, 0xa0, 0x09, 0x00, 0x00, 0x82, 0x03, 0x00, 0x00, 0x6d, 0x0a, 0x00, 0x00, 0x6d, 0x0a, 0x00, 0x00, 0x9f, 0x09, 0x00, 0x00, 0xa0, 0x09, + 0x00, 0x00, 0x82, 0x03, 0x00, 0x00, 0x84, 0x03, 0x00, 0x00, 0xf4, 0x09, 0x00, 0x00, 0xf4, 0x09, 0x00, 0x00, 0x6d, 0x0a, 0x00, 0x00, 0x82, 0x03, 0x00, 0x00, + 0x9f, 0x09, 0x00, 0x00, 0x6d, 0x0a, 0x00, 0x00, 0x6e, 0x0a, 0x00, 0x00, 0x6e, 0x0a, 0x00, 0x00, 0x9e, 0x09, 0x00, 0x00, 0x9f, 0x09, 0x00, 0x00, 0x6d, 0x0a, + 0x00, 0x00, 0xf4, 0x09, 0x00, 0x00, 0xf3, 0x09, 0x00, 0x00, 0xf3, 0x09, 0x00, 0x00, 0x6e, 0x0a, 0x00, 0x00, 0x6d, 0x0a, 0x00, 0x00, 0x6e, 0x0a, 0x00, 0x00, + 0x3e, 0x0a, 0x00, 0x00, 0x9b, 0x09, 0x00, 0x00, 0x9b, 0x09, 0x00, 0x00, 0x9e, 0x09, 0x00, 0x00, 0x6e, 0x0a, 0x00, 0x00, 0x6e, 0x0a, 0x00, 0x00, 0xf3, 0x09, + 0x00, 0x00, 0xbe, 0x09, 0x00, 0x00, 0xbe, 0x09, 0x00, 0x00, 0x3e, 0x0a, 0x00, 0x00, 0x6e, 0x0a, 0x00, 0x00, 0x3d, 0x03, 0x00, 0x00, 0x6f, 0x0a, 0x00, 0x00, + 0x6b, 0x0a, 0x00, 0x00, 0x6b, 0x0a, 0x00, 0x00, 0x7e, 0x03, 0x00, 0x00, 0x3d, 0x03, 0x00, 0x00, 0x6b, 0x0a, 0x00, 0x00, 0x4c, 0x0a, 0x00, 0x00, 0x03, 0x0a, + 0x00, 0x00, 0x03, 0x0a, 0x00, 0x00, 0x6c, 0x0a, 0x00, 0x00, 0x6b, 0x0a, 0x00, 0x00, 0x6c, 0x0a, 0x00, 0x00, 0x03, 0x0a, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, + 0x00, 0x0a, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x6c, 0x0a, 0x00, 0x00, 0x4c, 0x0a, 0x00, 0x00, 0x6b, 0x0a, 0x00, 0x00, 0x6f, 0x0a, 0x00, 0x00, 0x6f, 0x0a, + 0x00, 0x00, 0x4b, 0x0a, 0x00, 0x00, 0x4c, 0x0a, 0x00, 0x00, 0x4b, 0x0a, 0x00, 0x00, 0x76, 0x03, 0x00, 0x00, 0x78, 0x03, 0x00, 0x00, 0x78, 0x03, 0x00, 0x00, + 0x4c, 0x0a, 0x00, 0x00, 0x4b, 0x0a, 0x00, 0x00, 0x85, 0x03, 0x00, 0x00, 0x87, 0x03, 0x00, 0x00, 0x4b, 0x0a, 0x00, 0x00, 0x4b, 0x0a, 0x00, 0x00, 0x6f, 0x0a, + 0x00, 0x00, 0x85, 0x03, 0x00, 0x00, 0x3d, 0x03, 0x00, 0x00, 0x86, 0x03, 0x00, 0x00, 0x85, 0x03, 0x00, 0x00, 0x85, 0x03, 0x00, 0x00, 0x6f, 0x0a, 0x00, 0x00, + 0x3d, 0x03, 0x00, 0x00, 0x13, 0x0a, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x88, 0x03, 0x00, 0x00, 0x88, 0x03, 0x00, 0x00, 0x6e, 0x03, 0x00, 0x00, 0x13, 0x0a, + 0x00, 0x00, 0x36, 0x02, 0x00, 0x00, 0x25, 0x08, 0x00, 0x00, 0x89, 0x03, 0x00, 0x00, 0x89, 0x03, 0x00, 0x00, 0x88, 0x03, 0x00, 0x00, 0x36, 0x02, 0x00, 0x00, + 0x71, 0x03, 0x00, 0x00, 0x89, 0x03, 0x00, 0x00, 0x25, 0x08, 0x00, 0x00, 0x25, 0x08, 0x00, 0x00, 0x42, 0x03, 0x00, 0x00, 0x71, 0x03, 0x00, 0x00, 0x70, 0x0a, + 0x00, 0x00, 0x71, 0x0a, 0x00, 0x00, 0x72, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x73, 0x0a, 0x00, 0x00, 0x71, 0x0a, 0x00, 0x00, 0x72, 0x0a, 0x00, 0x00, + 0x74, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x75, 0x0a, 0x00, 0x00, 0x73, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x76, 0x0a, + 0x00, 0x00, 0x75, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x77, 0x0a, 0x00, 0x00, 0x76, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x78, 0x0a, 0x00, 0x00, + 0x77, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x79, 0x0a, 0x00, 0x00, 0x78, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x7a, 0x0a, 0x00, 0x00, 0x79, 0x0a, + 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x7b, 0x0a, 0x00, 0x00, 0x7a, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x7c, 0x0a, 0x00, 0x00, 0x7b, 0x0a, 0x00, 0x00, + 0x70, 0x0a, 0x00, 0x00, 0x7d, 0x0a, 0x00, 0x00, 0x7c, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x7e, 0x0a, 0x00, 0x00, 0x7d, 0x0a, 0x00, 0x00, 0x70, 0x0a, + 0x00, 0x00, 0x7f, 0x0a, 0x00, 0x00, 0x7e, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x80, 0x0a, 0x00, 0x00, 0x7f, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, + 0x81, 0x0a, 0x00, 0x00, 0x80, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x82, 0x0a, 0x00, 0x00, 0x81, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x83, 0x0a, + 0x00, 0x00, 0x82, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x84, 0x0a, 0x00, 0x00, 0x83, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x85, 0x0a, 0x00, 0x00, + 0x84, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x86, 0x0a, 0x00, 0x00, 0x85, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x87, 0x0a, 0x00, 0x00, 0x86, 0x0a, + 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x88, 0x0a, 0x00, 0x00, 0x87, 0x0a, 0x00, 0x00, 0x70, 0x0a, 0x00, 0x00, 0x74, 0x0a, 0x00, 0x00, 0x88, 0x0a, 0x00, 0x00, + 0x89, 0x0a, 0x00, 0x00, 0x8a, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x8a, 0x0a, 0x00, 0x00, 0x8c, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x8c, 0x0a, + 0x00, 0x00, 0x8d, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x8d, 0x0a, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, + 0x8f, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x8f, 0x0a, 0x00, 0x00, 0x90, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x90, 0x0a, 0x00, 0x00, 0x91, 0x0a, + 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x91, 0x0a, 0x00, 0x00, 0x92, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x92, 0x0a, 0x00, 0x00, 0x93, 0x0a, 0x00, 0x00, + 0x8b, 0x0a, 0x00, 0x00, 0x93, 0x0a, 0x00, 0x00, 0x94, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x94, 0x0a, 0x00, 0x00, 0x95, 0x0a, 0x00, 0x00, 0x8b, 0x0a, + 0x00, 0x00, 0x95, 0x0a, 0x00, 0x00, 0x96, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x96, 0x0a, 0x00, 0x00, 0x97, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, + 0x97, 0x0a, 0x00, 0x00, 0x98, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x98, 0x0a, 0x00, 0x00, 0x99, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x99, 0x0a, + 0x00, 0x00, 0x9a, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x9a, 0x0a, 0x00, 0x00, 0x9b, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x9b, 0x0a, 0x00, 0x00, + 0x9c, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x9c, 0x0a, 0x00, 0x00, 0x9d, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x9d, 0x0a, 0x00, 0x00, 0x9e, 0x0a, + 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x9e, 0x0a, 0x00, 0x00, 0x9f, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0x9f, 0x0a, 0x00, 0x00, 0xa0, 0x0a, 0x00, 0x00, + 0x8b, 0x0a, 0x00, 0x00, 0xa0, 0x0a, 0x00, 0x00, 0xa1, 0x0a, 0x00, 0x00, 0x8b, 0x0a, 0x00, 0x00, 0xa1, 0x0a, 0x00, 0x00, 0x89, 0x0a, 0x00, 0x00, 0x8b, 0x0a, + 0x00, 0x00, 0x71, 0x0a, 0x00, 0x00, 0xa2, 0x0a, 0x00, 0x00, 0xa3, 0x0a, 0x00, 0x00, 0xa3, 0x0a, 0x00, 0x00, 0x72, 0x0a, 0x00, 0x00, 0x71, 0x0a, 0x00, 0x00, + 0x73, 0x0a, 0x00, 0x00, 0xa4, 0x0a, 0x00, 0x00, 0xa2, 0x0a, 0x00, 0x00, 0xa2, 0x0a, 0x00, 0x00, 0x71, 0x0a, 0x00, 0x00, 0x73, 0x0a, 0x00, 0x00, 0x75, 0x0a, + 0x00, 0x00, 0xa5, 0x0a, 0x00, 0x00, 0xa4, 0x0a, 0x00, 0x00, 0xa4, 0x0a, 0x00, 0x00, 0x73, 0x0a, 0x00, 0x00, 0x75, 0x0a, 0x00, 0x00, 0x76, 0x0a, 0x00, 0x00, + 0xa6, 0x0a, 0x00, 0x00, 0xa5, 0x0a, 0x00, 0x00, 0xa5, 0x0a, 0x00, 0x00, 0x75, 0x0a, 0x00, 0x00, 0x76, 0x0a, 0x00, 0x00, 0x77, 0x0a, 0x00, 0x00, 0xa7, 0x0a, + 0x00, 0x00, 0xa6, 0x0a, 0x00, 0x00, 0xa6, 0x0a, 0x00, 0x00, 0x76, 0x0a, 0x00, 0x00, 0x77, 0x0a, 0x00, 0x00, 0x78, 0x0a, 0x00, 0x00, 0xa8, 0x0a, 0x00, 0x00, + 0xa7, 0x0a, 0x00, 0x00, 0xa7, 0x0a, 0x00, 0x00, 0x77, 0x0a, 0x00, 0x00, 0x78, 0x0a, 0x00, 0x00, 0x79, 0x0a, 0x00, 0x00, 0xa9, 0x0a, 0x00, 0x00, 0xa8, 0x0a, + 0x00, 0x00, 0xa8, 0x0a, 0x00, 0x00, 0x78, 0x0a, 0x00, 0x00, 0x79, 0x0a, 0x00, 0x00, 0x7a, 0x0a, 0x00, 0x00, 0xaa, 0x0a, 0x00, 0x00, 0xa9, 0x0a, 0x00, 0x00, + 0xa9, 0x0a, 0x00, 0x00, 0x79, 0x0a, 0x00, 0x00, 0x7a, 0x0a, 0x00, 0x00, 0x7b, 0x0a, 0x00, 0x00, 0xab, 0x0a, 0x00, 0x00, 0xaa, 0x0a, 0x00, 0x00, 0xaa, 0x0a, + 0x00, 0x00, 0x7a, 0x0a, 0x00, 0x00, 0x7b, 0x0a, 0x00, 0x00, 0x7c, 0x0a, 0x00, 0x00, 0xac, 0x0a, 0x00, 0x00, 0xab, 0x0a, 0x00, 0x00, 0xab, 0x0a, 0x00, 0x00, + 0x7b, 0x0a, 0x00, 0x00, 0x7c, 0x0a, 0x00, 0x00, 0x7d, 0x0a, 0x00, 0x00, 0xad, 0x0a, 0x00, 0x00, 0xac, 0x0a, 0x00, 0x00, 0xac, 0x0a, 0x00, 0x00, 0x7c, 0x0a, + 0x00, 0x00, 0x7d, 0x0a, 0x00, 0x00, 0x7e, 0x0a, 0x00, 0x00, 0xae, 0x0a, 0x00, 0x00, 0xad, 0x0a, 0x00, 0x00, 0xad, 0x0a, 0x00, 0x00, 0x7d, 0x0a, 0x00, 0x00, + 0x7e, 0x0a, 0x00, 0x00, 0x7f, 0x0a, 0x00, 0x00, 0xaf, 0x0a, 0x00, 0x00, 0xae, 0x0a, 0x00, 0x00, 0xae, 0x0a, 0x00, 0x00, 0x7e, 0x0a, 0x00, 0x00, 0x7f, 0x0a, + 0x00, 0x00, 0x80, 0x0a, 0x00, 0x00, 0xb0, 0x0a, 0x00, 0x00, 0xaf, 0x0a, 0x00, 0x00, 0xaf, 0x0a, 0x00, 0x00, 0x7f, 0x0a, 0x00, 0x00, 0x80, 0x0a, 0x00, 0x00, + 0x81, 0x0a, 0x00, 0x00, 0xb1, 0x0a, 0x00, 0x00, 0xb0, 0x0a, 0x00, 0x00, 0xb0, 0x0a, 0x00, 0x00, 0x80, 0x0a, 0x00, 0x00, 0x81, 0x0a, 0x00, 0x00, 0x82, 0x0a, + 0x00, 0x00, 0xb2, 0x0a, 0x00, 0x00, 0xb1, 0x0a, 0x00, 0x00, 0xb1, 0x0a, 0x00, 0x00, 0x81, 0x0a, 0x00, 0x00, 0x82, 0x0a, 0x00, 0x00, 0x83, 0x0a, 0x00, 0x00, + 0xb3, 0x0a, 0x00, 0x00, 0xb2, 0x0a, 0x00, 0x00, 0xb2, 0x0a, 0x00, 0x00, 0x82, 0x0a, 0x00, 0x00, 0x83, 0x0a, 0x00, 0x00, 0x84, 0x0a, 0x00, 0x00, 0xb4, 0x0a, + 0x00, 0x00, 0xb3, 0x0a, 0x00, 0x00, 0xb3, 0x0a, 0x00, 0x00, 0x83, 0x0a, 0x00, 0x00, 0x84, 0x0a, 0x00, 0x00, 0x85, 0x0a, 0x00, 0x00, 0xb5, 0x0a, 0x00, 0x00, + 0xb4, 0x0a, 0x00, 0x00, 0xb4, 0x0a, 0x00, 0x00, 0x84, 0x0a, 0x00, 0x00, 0x85, 0x0a, 0x00, 0x00, 0x86, 0x0a, 0x00, 0x00, 0xb6, 0x0a, 0x00, 0x00, 0xb5, 0x0a, + 0x00, 0x00, 0xb5, 0x0a, 0x00, 0x00, 0x85, 0x0a, 0x00, 0x00, 0x86, 0x0a, 0x00, 0x00, 0x87, 0x0a, 0x00, 0x00, 0xb7, 0x0a, 0x00, 0x00, 0xb6, 0x0a, 0x00, 0x00, + 0xb6, 0x0a, 0x00, 0x00, 0x86, 0x0a, 0x00, 0x00, 0x87, 0x0a, 0x00, 0x00, 0x88, 0x0a, 0x00, 0x00, 0xb8, 0x0a, 0x00, 0x00, 0xb7, 0x0a, 0x00, 0x00, 0xb7, 0x0a, + 0x00, 0x00, 0x87, 0x0a, 0x00, 0x00, 0x88, 0x0a, 0x00, 0x00, 0x74, 0x0a, 0x00, 0x00, 0xb9, 0x0a, 0x00, 0x00, 0xb8, 0x0a, 0x00, 0x00, 0xb8, 0x0a, 0x00, 0x00, + 0x88, 0x0a, 0x00, 0x00, 0x74, 0x0a, 0x00, 0x00, 0x72, 0x0a, 0x00, 0x00, 0xa3, 0x0a, 0x00, 0x00, 0xb9, 0x0a, 0x00, 0x00, 0xb9, 0x0a, 0x00, 0x00, 0x74, 0x0a, + 0x00, 0x00, 0x72, 0x0a, 0x00, 0x00, 0xba, 0x0a, 0x00, 0x00, 0xa3, 0x0a, 0x00, 0x00, 0xa2, 0x0a, 0x00, 0x00, 0xa2, 0x0a, 0x00, 0x00, 0xbb, 0x0a, 0x00, 0x00, + 0xba, 0x0a, 0x00, 0x00, 0xba, 0x0a, 0x00, 0x00, 0xbc, 0x0a, 0x00, 0x00, 0xb9, 0x0a, 0x00, 0x00, 0xb9, 0x0a, 0x00, 0x00, 0xa3, 0x0a, 0x00, 0x00, 0xba, 0x0a, + 0x00, 0x00, 0xbb, 0x0a, 0x00, 0x00, 0xa2, 0x0a, 0x00, 0x00, 0xa4, 0x0a, 0x00, 0x00, 0xa4, 0x0a, 0x00, 0x00, 0xbd, 0x0a, 0x00, 0x00, 0xbb, 0x0a, 0x00, 0x00, + 0xbb, 0x0a, 0x00, 0x00, 0xbe, 0x0a, 0x00, 0x00, 0xbf, 0x0a, 0x00, 0x00, 0xbf, 0x0a, 0x00, 0x00, 0xba, 0x0a, 0x00, 0x00, 0xbb, 0x0a, 0x00, 0x00, 0xbd, 0x0a, + 0x00, 0x00, 0xa4, 0x0a, 0x00, 0x00, 0xa5, 0x0a, 0x00, 0x00, 0xa5, 0x0a, 0x00, 0x00, 0xc0, 0x0a, 0x00, 0x00, 0xbd, 0x0a, 0x00, 0x00, 0xbd, 0x0a, 0x00, 0x00, + 0xc1, 0x0a, 0x00, 0x00, 0xbe, 0x0a, 0x00, 0x00, 0xbe, 0x0a, 0x00, 0x00, 0xbb, 0x0a, 0x00, 0x00, 0xbd, 0x0a, 0x00, 0x00, 0xc0, 0x0a, 0x00, 0x00, 0xa5, 0x0a, + 0x00, 0x00, 0xa6, 0x0a, 0x00, 0x00, 0xa6, 0x0a, 0x00, 0x00, 0xc2, 0x0a, 0x00, 0x00, 0xc0, 0x0a, 0x00, 0x00, 0xc0, 0x0a, 0x00, 0x00, 0xc3, 0x0a, 0x00, 0x00, + 0xc1, 0x0a, 0x00, 0x00, 0xc1, 0x0a, 0x00, 0x00, 0xbd, 0x0a, 0x00, 0x00, 0xc0, 0x0a, 0x00, 0x00, 0xc2, 0x0a, 0x00, 0x00, 0xa6, 0x0a, 0x00, 0x00, 0xa7, 0x0a, + 0x00, 0x00, 0xa7, 0x0a, 0x00, 0x00, 0xc4, 0x0a, 0x00, 0x00, 0xc2, 0x0a, 0x00, 0x00, 0xc2, 0x0a, 0x00, 0x00, 0xc5, 0x0a, 0x00, 0x00, 0xc3, 0x0a, 0x00, 0x00, + 0xc3, 0x0a, 0x00, 0x00, 0xc0, 0x0a, 0x00, 0x00, 0xc2, 0x0a, 0x00, 0x00, 0xc4, 0x0a, 0x00, 0x00, 0xa7, 0x0a, 0x00, 0x00, 0xa8, 0x0a, 0x00, 0x00, 0xa8, 0x0a, + 0x00, 0x00, 0xc6, 0x0a, 0x00, 0x00, 0xc4, 0x0a, 0x00, 0x00, 0xc4, 0x0a, 0x00, 0x00, 0xc7, 0x0a, 0x00, 0x00, 0xc5, 0x0a, 0x00, 0x00, 0xc5, 0x0a, 0x00, 0x00, + 0xc2, 0x0a, 0x00, 0x00, 0xc4, 0x0a, 0x00, 0x00, 0xc6, 0x0a, 0x00, 0x00, 0xa8, 0x0a, 0x00, 0x00, 0xa9, 0x0a, 0x00, 0x00, 0xa9, 0x0a, 0x00, 0x00, 0xc8, 0x0a, + 0x00, 0x00, 0xc6, 0x0a, 0x00, 0x00, 0xc6, 0x0a, 0x00, 0x00, 0xc9, 0x0a, 0x00, 0x00, 0xc7, 0x0a, 0x00, 0x00, 0xc7, 0x0a, 0x00, 0x00, 0xc4, 0x0a, 0x00, 0x00, + 0xc6, 0x0a, 0x00, 0x00, 0xc8, 0x0a, 0x00, 0x00, 0xa9, 0x0a, 0x00, 0x00, 0xaa, 0x0a, 0x00, 0x00, 0xaa, 0x0a, 0x00, 0x00, 0xca, 0x0a, 0x00, 0x00, 0xc8, 0x0a, + 0x00, 0x00, 0xc8, 0x0a, 0x00, 0x00, 0xcb, 0x0a, 0x00, 0x00, 0xc9, 0x0a, 0x00, 0x00, 0xc9, 0x0a, 0x00, 0x00, 0xc6, 0x0a, 0x00, 0x00, 0xc8, 0x0a, 0x00, 0x00, + 0xca, 0x0a, 0x00, 0x00, 0xaa, 0x0a, 0x00, 0x00, 0xab, 0x0a, 0x00, 0x00, 0xab, 0x0a, 0x00, 0x00, 0xcc, 0x0a, 0x00, 0x00, 0xca, 0x0a, 0x00, 0x00, 0xca, 0x0a, + 0x00, 0x00, 0xcd, 0x0a, 0x00, 0x00, 0xcb, 0x0a, 0x00, 0x00, 0xcb, 0x0a, 0x00, 0x00, 0xc8, 0x0a, 0x00, 0x00, 0xca, 0x0a, 0x00, 0x00, 0xcc, 0x0a, 0x00, 0x00, + 0xab, 0x0a, 0x00, 0x00, 0xac, 0x0a, 0x00, 0x00, 0xac, 0x0a, 0x00, 0x00, 0xce, 0x0a, 0x00, 0x00, 0xcc, 0x0a, 0x00, 0x00, 0xcc, 0x0a, 0x00, 0x00, 0xcf, 0x0a, + 0x00, 0x00, 0xcd, 0x0a, 0x00, 0x00, 0xcd, 0x0a, 0x00, 0x00, 0xca, 0x0a, 0x00, 0x00, 0xcc, 0x0a, 0x00, 0x00, 0xce, 0x0a, 0x00, 0x00, 0xac, 0x0a, 0x00, 0x00, + 0xad, 0x0a, 0x00, 0x00, 0xad, 0x0a, 0x00, 0x00, 0xd0, 0x0a, 0x00, 0x00, 0xce, 0x0a, 0x00, 0x00, 0xce, 0x0a, 0x00, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0xcf, 0x0a, + 0x00, 0x00, 0xcf, 0x0a, 0x00, 0x00, 0xcc, 0x0a, 0x00, 0x00, 0xce, 0x0a, 0x00, 0x00, 0xd0, 0x0a, 0x00, 0x00, 0xad, 0x0a, 0x00, 0x00, 0xae, 0x0a, 0x00, 0x00, + 0xae, 0x0a, 0x00, 0x00, 0xd2, 0x0a, 0x00, 0x00, 0xd0, 0x0a, 0x00, 0x00, 0xd0, 0x0a, 0x00, 0x00, 0xd3, 0x0a, 0x00, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0xd1, 0x0a, + 0x00, 0x00, 0xce, 0x0a, 0x00, 0x00, 0xd0, 0x0a, 0x00, 0x00, 0xd2, 0x0a, 0x00, 0x00, 0xae, 0x0a, 0x00, 0x00, 0xaf, 0x0a, 0x00, 0x00, 0xaf, 0x0a, 0x00, 0x00, + 0xd4, 0x0a, 0x00, 0x00, 0xd2, 0x0a, 0x00, 0x00, 0xd2, 0x0a, 0x00, 0x00, 0xd5, 0x0a, 0x00, 0x00, 0xd3, 0x0a, 0x00, 0x00, 0xd3, 0x0a, 0x00, 0x00, 0xd0, 0x0a, + 0x00, 0x00, 0xd2, 0x0a, 0x00, 0x00, 0xd4, 0x0a, 0x00, 0x00, 0xaf, 0x0a, 0x00, 0x00, 0xb0, 0x0a, 0x00, 0x00, 0xb0, 0x0a, 0x00, 0x00, 0xd6, 0x0a, 0x00, 0x00, + 0xd4, 0x0a, 0x00, 0x00, 0xd4, 0x0a, 0x00, 0x00, 0xd7, 0x0a, 0x00, 0x00, 0xd5, 0x0a, 0x00, 0x00, 0xd5, 0x0a, 0x00, 0x00, 0xd2, 0x0a, 0x00, 0x00, 0xd4, 0x0a, + 0x00, 0x00, 0xd6, 0x0a, 0x00, 0x00, 0xb0, 0x0a, 0x00, 0x00, 0xb1, 0x0a, 0x00, 0x00, 0xb1, 0x0a, 0x00, 0x00, 0xd8, 0x0a, 0x00, 0x00, 0xd6, 0x0a, 0x00, 0x00, + 0xd6, 0x0a, 0x00, 0x00, 0xd9, 0x0a, 0x00, 0x00, 0xd7, 0x0a, 0x00, 0x00, 0xd7, 0x0a, 0x00, 0x00, 0xd4, 0x0a, 0x00, 0x00, 0xd6, 0x0a, 0x00, 0x00, 0xd8, 0x0a, + 0x00, 0x00, 0xb1, 0x0a, 0x00, 0x00, 0xb2, 0x0a, 0x00, 0x00, 0xb2, 0x0a, 0x00, 0x00, 0xda, 0x0a, 0x00, 0x00, 0xd8, 0x0a, 0x00, 0x00, 0xd8, 0x0a, 0x00, 0x00, + 0xdb, 0x0a, 0x00, 0x00, 0xd9, 0x0a, 0x00, 0x00, 0xd9, 0x0a, 0x00, 0x00, 0xd6, 0x0a, 0x00, 0x00, 0xd8, 0x0a, 0x00, 0x00, 0xda, 0x0a, 0x00, 0x00, 0xb2, 0x0a, + 0x00, 0x00, 0xb3, 0x0a, 0x00, 0x00, 0xb3, 0x0a, 0x00, 0x00, 0xdc, 0x0a, 0x00, 0x00, 0xda, 0x0a, 0x00, 0x00, 0xda, 0x0a, 0x00, 0x00, 0xdd, 0x0a, 0x00, 0x00, + 0xdb, 0x0a, 0x00, 0x00, 0xdb, 0x0a, 0x00, 0x00, 0xd8, 0x0a, 0x00, 0x00, 0xda, 0x0a, 0x00, 0x00, 0xdc, 0x0a, 0x00, 0x00, 0xb3, 0x0a, 0x00, 0x00, 0xb4, 0x0a, + 0x00, 0x00, 0xb4, 0x0a, 0x00, 0x00, 0xde, 0x0a, 0x00, 0x00, 0xdc, 0x0a, 0x00, 0x00, 0xdc, 0x0a, 0x00, 0x00, 0xdf, 0x0a, 0x00, 0x00, 0xdd, 0x0a, 0x00, 0x00, + 0xdd, 0x0a, 0x00, 0x00, 0xda, 0x0a, 0x00, 0x00, 0xdc, 0x0a, 0x00, 0x00, 0xde, 0x0a, 0x00, 0x00, 0xb4, 0x0a, 0x00, 0x00, 0xb5, 0x0a, 0x00, 0x00, 0xb5, 0x0a, + 0x00, 0x00, 0xe0, 0x0a, 0x00, 0x00, 0xde, 0x0a, 0x00, 0x00, 0xde, 0x0a, 0x00, 0x00, 0xe1, 0x0a, 0x00, 0x00, 0xdf, 0x0a, 0x00, 0x00, 0xdf, 0x0a, 0x00, 0x00, + 0xdc, 0x0a, 0x00, 0x00, 0xde, 0x0a, 0x00, 0x00, 0xe0, 0x0a, 0x00, 0x00, 0xb5, 0x0a, 0x00, 0x00, 0xb6, 0x0a, 0x00, 0x00, 0xb6, 0x0a, 0x00, 0x00, 0xe2, 0x0a, + 0x00, 0x00, 0xe0, 0x0a, 0x00, 0x00, 0xe0, 0x0a, 0x00, 0x00, 0xe3, 0x0a, 0x00, 0x00, 0xe1, 0x0a, 0x00, 0x00, 0xe1, 0x0a, 0x00, 0x00, 0xde, 0x0a, 0x00, 0x00, + 0xe0, 0x0a, 0x00, 0x00, 0xe2, 0x0a, 0x00, 0x00, 0xb6, 0x0a, 0x00, 0x00, 0xb7, 0x0a, 0x00, 0x00, 0xb7, 0x0a, 0x00, 0x00, 0xe4, 0x0a, 0x00, 0x00, 0xe2, 0x0a, + 0x00, 0x00, 0xe2, 0x0a, 0x00, 0x00, 0xe5, 0x0a, 0x00, 0x00, 0xe3, 0x0a, 0x00, 0x00, 0xe3, 0x0a, 0x00, 0x00, 0xe0, 0x0a, 0x00, 0x00, 0xe2, 0x0a, 0x00, 0x00, + 0xe4, 0x0a, 0x00, 0x00, 0xb7, 0x0a, 0x00, 0x00, 0xb8, 0x0a, 0x00, 0x00, 0xb8, 0x0a, 0x00, 0x00, 0xe6, 0x0a, 0x00, 0x00, 0xe4, 0x0a, 0x00, 0x00, 0xe4, 0x0a, + 0x00, 0x00, 0xe7, 0x0a, 0x00, 0x00, 0xe5, 0x0a, 0x00, 0x00, 0xe5, 0x0a, 0x00, 0x00, 0xe2, 0x0a, 0x00, 0x00, 0xe4, 0x0a, 0x00, 0x00, 0xe6, 0x0a, 0x00, 0x00, + 0xb8, 0x0a, 0x00, 0x00, 0xb9, 0x0a, 0x00, 0x00, 0xb9, 0x0a, 0x00, 0x00, 0xbc, 0x0a, 0x00, 0x00, 0xe6, 0x0a, 0x00, 0x00, 0xe6, 0x0a, 0x00, 0x00, 0xe8, 0x0a, + 0x00, 0x00, 0xe7, 0x0a, 0x00, 0x00, 0xe7, 0x0a, 0x00, 0x00, 0xe4, 0x0a, 0x00, 0x00, 0xe6, 0x0a, 0x00, 0x00, 0xbc, 0x0a, 0x00, 0x00, 0xe9, 0x0a, 0x00, 0x00, + 0xe8, 0x0a, 0x00, 0x00, 0xe8, 0x0a, 0x00, 0x00, 0xe6, 0x0a, 0x00, 0x00, 0xbc, 0x0a, 0x00, 0x00, 0xba, 0x0a, 0x00, 0x00, 0xbf, 0x0a, 0x00, 0x00, 0xe9, 0x0a, + 0x00, 0x00, 0xe9, 0x0a, 0x00, 0x00, 0xbc, 0x0a, 0x00, 0x00, 0xba, 0x0a, 0x00, 0x00, 0xea, 0x0a, 0x00, 0x00, 0xbf, 0x0a, 0x00, 0x00, 0xbe, 0x0a, 0x00, 0x00, + 0xbe, 0x0a, 0x00, 0x00, 0xeb, 0x0a, 0x00, 0x00, 0xea, 0x0a, 0x00, 0x00, 0xec, 0x0a, 0x00, 0x00, 0xe9, 0x0a, 0x00, 0x00, 0xbf, 0x0a, 0x00, 0x00, 0xbf, 0x0a, + 0x00, 0x00, 0xea, 0x0a, 0x00, 0x00, 0xec, 0x0a, 0x00, 0x00, 0xeb, 0x0a, 0x00, 0x00, 0xbe, 0x0a, 0x00, 0x00, 0xc1, 0x0a, 0x00, 0x00, 0xc1, 0x0a, 0x00, 0x00, + 0xed, 0x0a, 0x00, 0x00, 0xeb, 0x0a, 0x00, 0x00, 0xee, 0x0a, 0x00, 0x00, 0xea, 0x0a, 0x00, 0x00, 0xeb, 0x0a, 0x00, 0x00, 0xeb, 0x0a, 0x00, 0x00, 0xef, 0x0a, + 0x00, 0x00, 0xee, 0x0a, 0x00, 0x00, 0xed, 0x0a, 0x00, 0x00, 0xc1, 0x0a, 0x00, 0x00, 0xc3, 0x0a, 0x00, 0x00, 0xc3, 0x0a, 0x00, 0x00, 0xf0, 0x0a, 0x00, 0x00, + 0xed, 0x0a, 0x00, 0x00, 0xef, 0x0a, 0x00, 0x00, 0xeb, 0x0a, 0x00, 0x00, 0xed, 0x0a, 0x00, 0x00, 0xed, 0x0a, 0x00, 0x00, 0xf1, 0x0a, 0x00, 0x00, 0xef, 0x0a, + 0x00, 0x00, 0xf0, 0x0a, 0x00, 0x00, 0xc3, 0x0a, 0x00, 0x00, 0xc5, 0x0a, 0x00, 0x00, 0xc5, 0x0a, 0x00, 0x00, 0xf2, 0x0a, 0x00, 0x00, 0xf0, 0x0a, 0x00, 0x00, + 0xf1, 0x0a, 0x00, 0x00, 0xed, 0x0a, 0x00, 0x00, 0xf0, 0x0a, 0x00, 0x00, 0xf0, 0x0a, 0x00, 0x00, 0xf3, 0x0a, 0x00, 0x00, 0xf1, 0x0a, 0x00, 0x00, 0xf2, 0x0a, + 0x00, 0x00, 0xc5, 0x0a, 0x00, 0x00, 0xc7, 0x0a, 0x00, 0x00, 0xc7, 0x0a, 0x00, 0x00, 0xf4, 0x0a, 0x00, 0x00, 0xf2, 0x0a, 0x00, 0x00, 0xf3, 0x0a, 0x00, 0x00, + 0xf0, 0x0a, 0x00, 0x00, 0xf2, 0x0a, 0x00, 0x00, 0xf2, 0x0a, 0x00, 0x00, 0xf5, 0x0a, 0x00, 0x00, 0xf3, 0x0a, 0x00, 0x00, 0xf4, 0x0a, 0x00, 0x00, 0xc7, 0x0a, + 0x00, 0x00, 0xc9, 0x0a, 0x00, 0x00, 0xc9, 0x0a, 0x00, 0x00, 0xf6, 0x0a, 0x00, 0x00, 0xf4, 0x0a, 0x00, 0x00, 0xf5, 0x0a, 0x00, 0x00, 0xf2, 0x0a, 0x00, 0x00, + 0xf4, 0x0a, 0x00, 0x00, 0xf4, 0x0a, 0x00, 0x00, 0xf7, 0x0a, 0x00, 0x00, 0xf5, 0x0a, 0x00, 0x00, 0xf6, 0x0a, 0x00, 0x00, 0xc9, 0x0a, 0x00, 0x00, 0xcb, 0x0a, + 0x00, 0x00, 0xcb, 0x0a, 0x00, 0x00, 0xf8, 0x0a, 0x00, 0x00, 0xf6, 0x0a, 0x00, 0x00, 0xf7, 0x0a, 0x00, 0x00, 0xf4, 0x0a, 0x00, 0x00, 0xf6, 0x0a, 0x00, 0x00, + 0xf6, 0x0a, 0x00, 0x00, 0xf9, 0x0a, 0x00, 0x00, 0xf7, 0x0a, 0x00, 0x00, 0xf8, 0x0a, 0x00, 0x00, 0xcb, 0x0a, 0x00, 0x00, 0xcd, 0x0a, 0x00, 0x00, 0xcd, 0x0a, + 0x00, 0x00, 0xfa, 0x0a, 0x00, 0x00, 0xf8, 0x0a, 0x00, 0x00, 0xf9, 0x0a, 0x00, 0x00, 0xf6, 0x0a, 0x00, 0x00, 0xf8, 0x0a, 0x00, 0x00, 0xf8, 0x0a, 0x00, 0x00, + 0xfb, 0x0a, 0x00, 0x00, 0xf9, 0x0a, 0x00, 0x00, 0xfa, 0x0a, 0x00, 0x00, 0xcd, 0x0a, 0x00, 0x00, 0xcf, 0x0a, 0x00, 0x00, 0xcf, 0x0a, 0x00, 0x00, 0xfc, 0x0a, + 0x00, 0x00, 0xfa, 0x0a, 0x00, 0x00, 0xfb, 0x0a, 0x00, 0x00, 0xf8, 0x0a, 0x00, 0x00, 0xfa, 0x0a, 0x00, 0x00, 0xfa, 0x0a, 0x00, 0x00, 0xfd, 0x0a, 0x00, 0x00, + 0xfb, 0x0a, 0x00, 0x00, 0xfc, 0x0a, 0x00, 0x00, 0xcf, 0x0a, 0x00, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0xfe, 0x0a, 0x00, 0x00, 0xfc, 0x0a, + 0x00, 0x00, 0xfd, 0x0a, 0x00, 0x00, 0xfa, 0x0a, 0x00, 0x00, 0xfc, 0x0a, 0x00, 0x00, 0xfc, 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xfd, 0x0a, 0x00, 0x00, + 0xfe, 0x0a, 0x00, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0xd3, 0x0a, 0x00, 0x00, 0xd3, 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0xfe, 0x0a, 0x00, 0x00, 0xff, 0x0a, + 0x00, 0x00, 0xfc, 0x0a, 0x00, 0x00, 0xfe, 0x0a, 0x00, 0x00, 0xfe, 0x0a, 0x00, 0x00, 0x01, 0x0b, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, + 0xd3, 0x0a, 0x00, 0x00, 0xd5, 0x0a, 0x00, 0x00, 0xd5, 0x0a, 0x00, 0x00, 0x02, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x0b, 0x00, 0x00, 0xfe, 0x0a, + 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x03, 0x0b, 0x00, 0x00, 0x01, 0x0b, 0x00, 0x00, 0x02, 0x0b, 0x00, 0x00, 0xd5, 0x0a, 0x00, 0x00, + 0xd7, 0x0a, 0x00, 0x00, 0xd7, 0x0a, 0x00, 0x00, 0x04, 0x0b, 0x00, 0x00, 0x02, 0x0b, 0x00, 0x00, 0x03, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x02, 0x0b, + 0x00, 0x00, 0x02, 0x0b, 0x00, 0x00, 0x05, 0x0b, 0x00, 0x00, 0x03, 0x0b, 0x00, 0x00, 0x04, 0x0b, 0x00, 0x00, 0xd7, 0x0a, 0x00, 0x00, 0xd9, 0x0a, 0x00, 0x00, + 0xd9, 0x0a, 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00, 0x04, 0x0b, 0x00, 0x00, 0x05, 0x0b, 0x00, 0x00, 0x02, 0x0b, 0x00, 0x00, 0x04, 0x0b, 0x00, 0x00, 0x04, 0x0b, + 0x00, 0x00, 0x07, 0x0b, 0x00, 0x00, 0x05, 0x0b, 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00, 0xd9, 0x0a, 0x00, 0x00, 0xdb, 0x0a, 0x00, 0x00, 0xdb, 0x0a, 0x00, 0x00, + 0x08, 0x0b, 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00, 0x07, 0x0b, 0x00, 0x00, 0x04, 0x0b, 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00, 0x09, 0x0b, + 0x00, 0x00, 0x07, 0x0b, 0x00, 0x00, 0x08, 0x0b, 0x00, 0x00, 0xdb, 0x0a, 0x00, 0x00, 0xdd, 0x0a, 0x00, 0x00, 0xdd, 0x0a, 0x00, 0x00, 0x0a, 0x0b, 0x00, 0x00, + 0x08, 0x0b, 0x00, 0x00, 0x09, 0x0b, 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00, 0x08, 0x0b, 0x00, 0x00, 0x08, 0x0b, 0x00, 0x00, 0x0b, 0x0b, 0x00, 0x00, 0x09, 0x0b, + 0x00, 0x00, 0x0a, 0x0b, 0x00, 0x00, 0xdd, 0x0a, 0x00, 0x00, 0xdf, 0x0a, 0x00, 0x00, 0xdf, 0x0a, 0x00, 0x00, 0x0c, 0x0b, 0x00, 0x00, 0x0a, 0x0b, 0x00, 0x00, + 0x0b, 0x0b, 0x00, 0x00, 0x08, 0x0b, 0x00, 0x00, 0x0a, 0x0b, 0x00, 0x00, 0x0a, 0x0b, 0x00, 0x00, 0x0d, 0x0b, 0x00, 0x00, 0x0b, 0x0b, 0x00, 0x00, 0x0c, 0x0b, + 0x00, 0x00, 0xdf, 0x0a, 0x00, 0x00, 0xe1, 0x0a, 0x00, 0x00, 0xe1, 0x0a, 0x00, 0x00, 0x0e, 0x0b, 0x00, 0x00, 0x0c, 0x0b, 0x00, 0x00, 0x0d, 0x0b, 0x00, 0x00, + 0x0a, 0x0b, 0x00, 0x00, 0x0c, 0x0b, 0x00, 0x00, 0x0c, 0x0b, 0x00, 0x00, 0x0f, 0x0b, 0x00, 0x00, 0x0d, 0x0b, 0x00, 0x00, 0x0e, 0x0b, 0x00, 0x00, 0xe1, 0x0a, + 0x00, 0x00, 0xe3, 0x0a, 0x00, 0x00, 0xe3, 0x0a, 0x00, 0x00, 0x10, 0x0b, 0x00, 0x00, 0x0e, 0x0b, 0x00, 0x00, 0x0f, 0x0b, 0x00, 0x00, 0x0c, 0x0b, 0x00, 0x00, + 0x0e, 0x0b, 0x00, 0x00, 0x0e, 0x0b, 0x00, 0x00, 0x11, 0x0b, 0x00, 0x00, 0x0f, 0x0b, 0x00, 0x00, 0x10, 0x0b, 0x00, 0x00, 0xe3, 0x0a, 0x00, 0x00, 0xe5, 0x0a, + 0x00, 0x00, 0xe5, 0x0a, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x10, 0x0b, 0x00, 0x00, 0x11, 0x0b, 0x00, 0x00, 0x0e, 0x0b, 0x00, 0x00, 0x10, 0x0b, 0x00, 0x00, + 0x10, 0x0b, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x11, 0x0b, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0xe5, 0x0a, 0x00, 0x00, 0xe7, 0x0a, 0x00, 0x00, 0xe7, 0x0a, + 0x00, 0x00, 0x14, 0x0b, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x10, 0x0b, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, + 0x15, 0x0b, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x14, 0x0b, 0x00, 0x00, 0xe7, 0x0a, 0x00, 0x00, 0xe8, 0x0a, 0x00, 0x00, 0xe8, 0x0a, 0x00, 0x00, 0x16, 0x0b, + 0x00, 0x00, 0x14, 0x0b, 0x00, 0x00, 0x15, 0x0b, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x14, 0x0b, 0x00, 0x00, 0x14, 0x0b, 0x00, 0x00, 0x17, 0x0b, 0x00, 0x00, + 0x15, 0x0b, 0x00, 0x00, 0x16, 0x0b, 0x00, 0x00, 0xe8, 0x0a, 0x00, 0x00, 0xe9, 0x0a, 0x00, 0x00, 0xe9, 0x0a, 0x00, 0x00, 0xec, 0x0a, 0x00, 0x00, 0x16, 0x0b, + 0x00, 0x00, 0x17, 0x0b, 0x00, 0x00, 0x14, 0x0b, 0x00, 0x00, 0x16, 0x0b, 0x00, 0x00, 0x16, 0x0b, 0x00, 0x00, 0x18, 0x0b, 0x00, 0x00, 0x17, 0x0b, 0x00, 0x00, + 0x18, 0x0b, 0x00, 0x00, 0x16, 0x0b, 0x00, 0x00, 0xec, 0x0a, 0x00, 0x00, 0xec, 0x0a, 0x00, 0x00, 0x19, 0x0b, 0x00, 0x00, 0x18, 0x0b, 0x00, 0x00, 0x19, 0x0b, + 0x00, 0x00, 0xec, 0x0a, 0x00, 0x00, 0xea, 0x0a, 0x00, 0x00, 0xea, 0x0a, 0x00, 0x00, 0xee, 0x0a, 0x00, 0x00, 0x19, 0x0b, 0x00, 0x00, 0x1a, 0x0b, 0x00, 0x00, + 0xee, 0x0a, 0x00, 0x00, 0xef, 0x0a, 0x00, 0x00, 0xef, 0x0a, 0x00, 0x00, 0x1b, 0x0b, 0x00, 0x00, 0x1a, 0x0b, 0x00, 0x00, 0x1b, 0x0b, 0x00, 0x00, 0xef, 0x0a, + 0x00, 0x00, 0xf1, 0x0a, 0x00, 0x00, 0xf1, 0x0a, 0x00, 0x00, 0x1c, 0x0b, 0x00, 0x00, 0x1b, 0x0b, 0x00, 0x00, 0x1c, 0x0b, 0x00, 0x00, 0xf1, 0x0a, 0x00, 0x00, + 0xf3, 0x0a, 0x00, 0x00, 0xf3, 0x0a, 0x00, 0x00, 0x1d, 0x0b, 0x00, 0x00, 0x1c, 0x0b, 0x00, 0x00, 0x1d, 0x0b, 0x00, 0x00, 0xf3, 0x0a, 0x00, 0x00, 0xf5, 0x0a, + 0x00, 0x00, 0xf5, 0x0a, 0x00, 0x00, 0x1e, 0x0b, 0x00, 0x00, 0x1d, 0x0b, 0x00, 0x00, 0x1e, 0x0b, 0x00, 0x00, 0xf5, 0x0a, 0x00, 0x00, 0xf7, 0x0a, 0x00, 0x00, + 0xf7, 0x0a, 0x00, 0x00, 0x1f, 0x0b, 0x00, 0x00, 0x1e, 0x0b, 0x00, 0x00, 0x1f, 0x0b, 0x00, 0x00, 0xf7, 0x0a, 0x00, 0x00, 0xf9, 0x0a, 0x00, 0x00, 0xf9, 0x0a, + 0x00, 0x00, 0x20, 0x0b, 0x00, 0x00, 0x1f, 0x0b, 0x00, 0x00, 0x20, 0x0b, 0x00, 0x00, 0xf9, 0x0a, 0x00, 0x00, 0xfb, 0x0a, 0x00, 0x00, 0xfb, 0x0a, 0x00, 0x00, + 0x21, 0x0b, 0x00, 0x00, 0x20, 0x0b, 0x00, 0x00, 0x21, 0x0b, 0x00, 0x00, 0xfb, 0x0a, 0x00, 0x00, 0xfd, 0x0a, 0x00, 0x00, 0xfd, 0x0a, 0x00, 0x00, 0x22, 0x0b, + 0x00, 0x00, 0x21, 0x0b, 0x00, 0x00, 0x22, 0x0b, 0x00, 0x00, 0xfd, 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0x23, 0x0b, 0x00, 0x00, + 0x22, 0x0b, 0x00, 0x00, 0x23, 0x0b, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0x01, 0x0b, 0x00, 0x00, 0x01, 0x0b, 0x00, 0x00, 0x24, 0x0b, 0x00, 0x00, 0x23, 0x0b, + 0x00, 0x00, 0x24, 0x0b, 0x00, 0x00, 0x01, 0x0b, 0x00, 0x00, 0x03, 0x0b, 0x00, 0x00, 0x03, 0x0b, 0x00, 0x00, 0x25, 0x0b, 0x00, 0x00, 0x24, 0x0b, 0x00, 0x00, + 0x25, 0x0b, 0x00, 0x00, 0x03, 0x0b, 0x00, 0x00, 0x05, 0x0b, 0x00, 0x00, 0x05, 0x0b, 0x00, 0x00, 0x26, 0x0b, 0x00, 0x00, 0x25, 0x0b, 0x00, 0x00, 0x26, 0x0b, + 0x00, 0x00, 0x05, 0x0b, 0x00, 0x00, 0x07, 0x0b, 0x00, 0x00, 0x07, 0x0b, 0x00, 0x00, 0x27, 0x0b, 0x00, 0x00, 0x26, 0x0b, 0x00, 0x00, 0x27, 0x0b, 0x00, 0x00, + 0x07, 0x0b, 0x00, 0x00, 0x09, 0x0b, 0x00, 0x00, 0x09, 0x0b, 0x00, 0x00, 0x28, 0x0b, 0x00, 0x00, 0x27, 0x0b, 0x00, 0x00, 0x28, 0x0b, 0x00, 0x00, 0x09, 0x0b, + 0x00, 0x00, 0x0b, 0x0b, 0x00, 0x00, 0x0b, 0x0b, 0x00, 0x00, 0x29, 0x0b, 0x00, 0x00, 0x28, 0x0b, 0x00, 0x00, 0x29, 0x0b, 0x00, 0x00, 0x0b, 0x0b, 0x00, 0x00, + 0x0d, 0x0b, 0x00, 0x00, 0x0d, 0x0b, 0x00, 0x00, 0x2a, 0x0b, 0x00, 0x00, 0x29, 0x0b, 0x00, 0x00, 0x2a, 0x0b, 0x00, 0x00, 0x0d, 0x0b, 0x00, 0x00, 0x0f, 0x0b, + 0x00, 0x00, 0x0f, 0x0b, 0x00, 0x00, 0x2b, 0x0b, 0x00, 0x00, 0x2a, 0x0b, 0x00, 0x00, 0x2b, 0x0b, 0x00, 0x00, 0x0f, 0x0b, 0x00, 0x00, 0x11, 0x0b, 0x00, 0x00, + 0x11, 0x0b, 0x00, 0x00, 0x2c, 0x0b, 0x00, 0x00, 0x2b, 0x0b, 0x00, 0x00, 0x2c, 0x0b, 0x00, 0x00, 0x11, 0x0b, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x13, 0x0b, + 0x00, 0x00, 0x2d, 0x0b, 0x00, 0x00, 0x2c, 0x0b, 0x00, 0x00, 0x2d, 0x0b, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x15, 0x0b, 0x00, 0x00, 0x15, 0x0b, 0x00, 0x00, + 0x2e, 0x0b, 0x00, 0x00, 0x2d, 0x0b, 0x00, 0x00, 0x2e, 0x0b, 0x00, 0x00, 0x15, 0x0b, 0x00, 0x00, 0x17, 0x0b, 0x00, 0x00, 0x17, 0x0b, 0x00, 0x00, 0x2f, 0x0b, + 0x00, 0x00, 0x2e, 0x0b, 0x00, 0x00, 0x2f, 0x0b, 0x00, 0x00, 0x17, 0x0b, 0x00, 0x00, 0x18, 0x0b, 0x00, 0x00, 0x18, 0x0b, 0x00, 0x00, 0x30, 0x0b, 0x00, 0x00, + 0x2f, 0x0b, 0x00, 0x00, 0x30, 0x0b, 0x00, 0x00, 0x18, 0x0b, 0x00, 0x00, 0x19, 0x0b, 0x00, 0x00, 0x19, 0x0b, 0x00, 0x00, 0x31, 0x0b, 0x00, 0x00, 0x30, 0x0b, + 0x00, 0x00, 0x31, 0x0b, 0x00, 0x00, 0x19, 0x0b, 0x00, 0x00, 0xee, 0x0a, 0x00, 0x00, 0xee, 0x0a, 0x00, 0x00, 0x1a, 0x0b, 0x00, 0x00, 0x31, 0x0b, 0x00, 0x00, + 0x32, 0x0b, 0x00, 0x00, 0x1a, 0x0b, 0x00, 0x00, 0x1b, 0x0b, 0x00, 0x00, 0x1b, 0x0b, 0x00, 0x00, 0x33, 0x0b, 0x00, 0x00, 0x32, 0x0b, 0x00, 0x00, 0x33, 0x0b, + 0x00, 0x00, 0x1b, 0x0b, 0x00, 0x00, 0x1c, 0x0b, 0x00, 0x00, 0x1c, 0x0b, 0x00, 0x00, 0x34, 0x0b, 0x00, 0x00, 0x33, 0x0b, 0x00, 0x00, 0x34, 0x0b, 0x00, 0x00, + 0x1c, 0x0b, 0x00, 0x00, 0x1d, 0x0b, 0x00, 0x00, 0x1d, 0x0b, 0x00, 0x00, 0x35, 0x0b, 0x00, 0x00, 0x34, 0x0b, 0x00, 0x00, 0x35, 0x0b, 0x00, 0x00, 0x1d, 0x0b, + 0x00, 0x00, 0x1e, 0x0b, 0x00, 0x00, 0x1e, 0x0b, 0x00, 0x00, 0x36, 0x0b, 0x00, 0x00, 0x35, 0x0b, 0x00, 0x00, 0x36, 0x0b, 0x00, 0x00, 0x1e, 0x0b, 0x00, 0x00, + 0x1f, 0x0b, 0x00, 0x00, 0x1f, 0x0b, 0x00, 0x00, 0x37, 0x0b, 0x00, 0x00, 0x36, 0x0b, 0x00, 0x00, 0x37, 0x0b, 0x00, 0x00, 0x1f, 0x0b, 0x00, 0x00, 0x20, 0x0b, + 0x00, 0x00, 0x20, 0x0b, 0x00, 0x00, 0x38, 0x0b, 0x00, 0x00, 0x37, 0x0b, 0x00, 0x00, 0x38, 0x0b, 0x00, 0x00, 0x20, 0x0b, 0x00, 0x00, 0x21, 0x0b, 0x00, 0x00, + 0x21, 0x0b, 0x00, 0x00, 0x39, 0x0b, 0x00, 0x00, 0x38, 0x0b, 0x00, 0x00, 0x39, 0x0b, 0x00, 0x00, 0x21, 0x0b, 0x00, 0x00, 0x22, 0x0b, 0x00, 0x00, 0x22, 0x0b, + 0x00, 0x00, 0x3a, 0x0b, 0x00, 0x00, 0x39, 0x0b, 0x00, 0x00, 0x3a, 0x0b, 0x00, 0x00, 0x22, 0x0b, 0x00, 0x00, 0x23, 0x0b, 0x00, 0x00, 0x23, 0x0b, 0x00, 0x00, + 0x3b, 0x0b, 0x00, 0x00, 0x3a, 0x0b, 0x00, 0x00, 0x3b, 0x0b, 0x00, 0x00, 0x23, 0x0b, 0x00, 0x00, 0x24, 0x0b, 0x00, 0x00, 0x24, 0x0b, 0x00, 0x00, 0x3c, 0x0b, + 0x00, 0x00, 0x3b, 0x0b, 0x00, 0x00, 0x3c, 0x0b, 0x00, 0x00, 0x24, 0x0b, 0x00, 0x00, 0x25, 0x0b, 0x00, 0x00, 0x25, 0x0b, 0x00, 0x00, 0x3d, 0x0b, 0x00, 0x00, + 0x3c, 0x0b, 0x00, 0x00, 0x3d, 0x0b, 0x00, 0x00, 0x25, 0x0b, 0x00, 0x00, 0x26, 0x0b, 0x00, 0x00, 0x26, 0x0b, 0x00, 0x00, 0x3e, 0x0b, 0x00, 0x00, 0x3d, 0x0b, + 0x00, 0x00, 0x3e, 0x0b, 0x00, 0x00, 0x26, 0x0b, 0x00, 0x00, 0x27, 0x0b, 0x00, 0x00, 0x27, 0x0b, 0x00, 0x00, 0x3f, 0x0b, 0x00, 0x00, 0x3e, 0x0b, 0x00, 0x00, + 0x3f, 0x0b, 0x00, 0x00, 0x27, 0x0b, 0x00, 0x00, 0x28, 0x0b, 0x00, 0x00, 0x28, 0x0b, 0x00, 0x00, 0x40, 0x0b, 0x00, 0x00, 0x3f, 0x0b, 0x00, 0x00, 0x40, 0x0b, + 0x00, 0x00, 0x28, 0x0b, 0x00, 0x00, 0x29, 0x0b, 0x00, 0x00, 0x29, 0x0b, 0x00, 0x00, 0x41, 0x0b, 0x00, 0x00, 0x40, 0x0b, 0x00, 0x00, 0x41, 0x0b, 0x00, 0x00, + 0x29, 0x0b, 0x00, 0x00, 0x2a, 0x0b, 0x00, 0x00, 0x2a, 0x0b, 0x00, 0x00, 0x42, 0x0b, 0x00, 0x00, 0x41, 0x0b, 0x00, 0x00, 0x42, 0x0b, 0x00, 0x00, 0x2a, 0x0b, + 0x00, 0x00, 0x2b, 0x0b, 0x00, 0x00, 0x2b, 0x0b, 0x00, 0x00, 0x43, 0x0b, 0x00, 0x00, 0x42, 0x0b, 0x00, 0x00, 0x43, 0x0b, 0x00, 0x00, 0x2b, 0x0b, 0x00, 0x00, + 0x2c, 0x0b, 0x00, 0x00, 0x2c, 0x0b, 0x00, 0x00, 0x44, 0x0b, 0x00, 0x00, 0x43, 0x0b, 0x00, 0x00, 0x44, 0x0b, 0x00, 0x00, 0x2c, 0x0b, 0x00, 0x00, 0x2d, 0x0b, + 0x00, 0x00, 0x2d, 0x0b, 0x00, 0x00, 0x45, 0x0b, 0x00, 0x00, 0x44, 0x0b, 0x00, 0x00, 0x45, 0x0b, 0x00, 0x00, 0x2d, 0x0b, 0x00, 0x00, 0x2e, 0x0b, 0x00, 0x00, + 0x2e, 0x0b, 0x00, 0x00, 0x46, 0x0b, 0x00, 0x00, 0x45, 0x0b, 0x00, 0x00, 0x46, 0x0b, 0x00, 0x00, 0x2e, 0x0b, 0x00, 0x00, 0x2f, 0x0b, 0x00, 0x00, 0x2f, 0x0b, + 0x00, 0x00, 0x47, 0x0b, 0x00, 0x00, 0x46, 0x0b, 0x00, 0x00, 0x47, 0x0b, 0x00, 0x00, 0x2f, 0x0b, 0x00, 0x00, 0x30, 0x0b, 0x00, 0x00, 0x30, 0x0b, 0x00, 0x00, + 0x48, 0x0b, 0x00, 0x00, 0x47, 0x0b, 0x00, 0x00, 0x48, 0x0b, 0x00, 0x00, 0x30, 0x0b, 0x00, 0x00, 0x31, 0x0b, 0x00, 0x00, 0x31, 0x0b, 0x00, 0x00, 0x49, 0x0b, + 0x00, 0x00, 0x48, 0x0b, 0x00, 0x00, 0x49, 0x0b, 0x00, 0x00, 0x31, 0x0b, 0x00, 0x00, 0x1a, 0x0b, 0x00, 0x00, 0x1a, 0x0b, 0x00, 0x00, 0x32, 0x0b, 0x00, 0x00, + 0x49, 0x0b, 0x00, 0x00, 0x4a, 0x0b, 0x00, 0x00, 0x32, 0x0b, 0x00, 0x00, 0x33, 0x0b, 0x00, 0x00, 0x33, 0x0b, 0x00, 0x00, 0x4b, 0x0b, 0x00, 0x00, 0x4a, 0x0b, + 0x00, 0x00, 0x4b, 0x0b, 0x00, 0x00, 0x33, 0x0b, 0x00, 0x00, 0x34, 0x0b, 0x00, 0x00, 0x34, 0x0b, 0x00, 0x00, 0x4c, 0x0b, 0x00, 0x00, 0x4b, 0x0b, 0x00, 0x00, + 0x4c, 0x0b, 0x00, 0x00, 0x34, 0x0b, 0x00, 0x00, 0x35, 0x0b, 0x00, 0x00, 0x35, 0x0b, 0x00, 0x00, 0x4d, 0x0b, 0x00, 0x00, 0x4c, 0x0b, 0x00, 0x00, 0x4d, 0x0b, + 0x00, 0x00, 0x35, 0x0b, 0x00, 0x00, 0x36, 0x0b, 0x00, 0x00, 0x36, 0x0b, 0x00, 0x00, 0x4e, 0x0b, 0x00, 0x00, 0x4d, 0x0b, 0x00, 0x00, 0x4e, 0x0b, 0x00, 0x00, + 0x36, 0x0b, 0x00, 0x00, 0x37, 0x0b, 0x00, 0x00, 0x37, 0x0b, 0x00, 0x00, 0x4f, 0x0b, 0x00, 0x00, 0x4e, 0x0b, 0x00, 0x00, 0x4f, 0x0b, 0x00, 0x00, 0x37, 0x0b, + 0x00, 0x00, 0x38, 0x0b, 0x00, 0x00, 0x38, 0x0b, 0x00, 0x00, 0x50, 0x0b, 0x00, 0x00, 0x4f, 0x0b, 0x00, 0x00, 0x50, 0x0b, 0x00, 0x00, 0x38, 0x0b, 0x00, 0x00, + 0x39, 0x0b, 0x00, 0x00, 0x39, 0x0b, 0x00, 0x00, 0x51, 0x0b, 0x00, 0x00, 0x50, 0x0b, 0x00, 0x00, 0x51, 0x0b, 0x00, 0x00, 0x39, 0x0b, 0x00, 0x00, 0x3a, 0x0b, + 0x00, 0x00, 0x3a, 0x0b, 0x00, 0x00, 0x52, 0x0b, 0x00, 0x00, 0x51, 0x0b, 0x00, 0x00, 0x52, 0x0b, 0x00, 0x00, 0x3a, 0x0b, 0x00, 0x00, 0x3b, 0x0b, 0x00, 0x00, + 0x3b, 0x0b, 0x00, 0x00, 0x53, 0x0b, 0x00, 0x00, 0x52, 0x0b, 0x00, 0x00, 0x53, 0x0b, 0x00, 0x00, 0x3b, 0x0b, 0x00, 0x00, 0x3c, 0x0b, 0x00, 0x00, 0x3c, 0x0b, + 0x00, 0x00, 0x54, 0x0b, 0x00, 0x00, 0x53, 0x0b, 0x00, 0x00, 0x54, 0x0b, 0x00, 0x00, 0x3c, 0x0b, 0x00, 0x00, 0x3d, 0x0b, 0x00, 0x00, 0x3d, 0x0b, 0x00, 0x00, + 0x55, 0x0b, 0x00, 0x00, 0x54, 0x0b, 0x00, 0x00, 0x55, 0x0b, 0x00, 0x00, 0x3d, 0x0b, 0x00, 0x00, 0x3e, 0x0b, 0x00, 0x00, 0x3e, 0x0b, 0x00, 0x00, 0x56, 0x0b, + 0x00, 0x00, 0x55, 0x0b, 0x00, 0x00, 0x56, 0x0b, 0x00, 0x00, 0x3e, 0x0b, 0x00, 0x00, 0x3f, 0x0b, 0x00, 0x00, 0x3f, 0x0b, 0x00, 0x00, 0x57, 0x0b, 0x00, 0x00, + 0x56, 0x0b, 0x00, 0x00, 0x57, 0x0b, 0x00, 0x00, 0x3f, 0x0b, 0x00, 0x00, 0x40, 0x0b, 0x00, 0x00, 0x40, 0x0b, 0x00, 0x00, 0x58, 0x0b, 0x00, 0x00, 0x57, 0x0b, + 0x00, 0x00, 0x58, 0x0b, 0x00, 0x00, 0x40, 0x0b, 0x00, 0x00, 0x41, 0x0b, 0x00, 0x00, 0x41, 0x0b, 0x00, 0x00, 0x59, 0x0b, 0x00, 0x00, 0x58, 0x0b, 0x00, 0x00, + 0x59, 0x0b, 0x00, 0x00, 0x41, 0x0b, 0x00, 0x00, 0x42, 0x0b, 0x00, 0x00, 0x42, 0x0b, 0x00, 0x00, 0x5a, 0x0b, 0x00, 0x00, 0x59, 0x0b, 0x00, 0x00, 0x5a, 0x0b, + 0x00, 0x00, 0x42, 0x0b, 0x00, 0x00, 0x43, 0x0b, 0x00, 0x00, 0x43, 0x0b, 0x00, 0x00, 0x5b, 0x0b, 0x00, 0x00, 0x5a, 0x0b, 0x00, 0x00, 0x5b, 0x0b, 0x00, 0x00, + 0x43, 0x0b, 0x00, 0x00, 0x44, 0x0b, 0x00, 0x00, 0x44, 0x0b, 0x00, 0x00, 0x5c, 0x0b, 0x00, 0x00, 0x5b, 0x0b, 0x00, 0x00, 0x5c, 0x0b, 0x00, 0x00, 0x44, 0x0b, + 0x00, 0x00, 0x45, 0x0b, 0x00, 0x00, 0x45, 0x0b, 0x00, 0x00, 0x5d, 0x0b, 0x00, 0x00, 0x5c, 0x0b, 0x00, 0x00, 0x5d, 0x0b, 0x00, 0x00, 0x45, 0x0b, 0x00, 0x00, + 0x46, 0x0b, 0x00, 0x00, 0x46, 0x0b, 0x00, 0x00, 0x5e, 0x0b, 0x00, 0x00, 0x5d, 0x0b, 0x00, 0x00, 0x5e, 0x0b, 0x00, 0x00, 0x46, 0x0b, 0x00, 0x00, 0x47, 0x0b, + 0x00, 0x00, 0x47, 0x0b, 0x00, 0x00, 0x5f, 0x0b, 0x00, 0x00, 0x5e, 0x0b, 0x00, 0x00, 0x5f, 0x0b, 0x00, 0x00, 0x47, 0x0b, 0x00, 0x00, 0x48, 0x0b, 0x00, 0x00, + 0x48, 0x0b, 0x00, 0x00, 0x60, 0x0b, 0x00, 0x00, 0x5f, 0x0b, 0x00, 0x00, 0x60, 0x0b, 0x00, 0x00, 0x48, 0x0b, 0x00, 0x00, 0x49, 0x0b, 0x00, 0x00, 0x49, 0x0b, + 0x00, 0x00, 0x61, 0x0b, 0x00, 0x00, 0x60, 0x0b, 0x00, 0x00, 0x61, 0x0b, 0x00, 0x00, 0x49, 0x0b, 0x00, 0x00, 0x32, 0x0b, 0x00, 0x00, 0x32, 0x0b, 0x00, 0x00, + 0x4a, 0x0b, 0x00, 0x00, 0x61, 0x0b, 0x00, 0x00, 0x62, 0x0b, 0x00, 0x00, 0x4a, 0x0b, 0x00, 0x00, 0x4b, 0x0b, 0x00, 0x00, 0x4b, 0x0b, 0x00, 0x00, 0x63, 0x0b, + 0x00, 0x00, 0x62, 0x0b, 0x00, 0x00, 0x63, 0x0b, 0x00, 0x00, 0x4b, 0x0b, 0x00, 0x00, 0x4c, 0x0b, 0x00, 0x00, 0x4c, 0x0b, 0x00, 0x00, 0x64, 0x0b, 0x00, 0x00, + 0x63, 0x0b, 0x00, 0x00, 0x64, 0x0b, 0x00, 0x00, 0x4c, 0x0b, 0x00, 0x00, 0x4d, 0x0b, 0x00, 0x00, 0x4d, 0x0b, 0x00, 0x00, 0x65, 0x0b, 0x00, 0x00, 0x64, 0x0b, + 0x00, 0x00, 0x65, 0x0b, 0x00, 0x00, 0x4d, 0x0b, 0x00, 0x00, 0x4e, 0x0b, 0x00, 0x00, 0x4e, 0x0b, 0x00, 0x00, 0x66, 0x0b, 0x00, 0x00, 0x65, 0x0b, 0x00, 0x00, + 0x66, 0x0b, 0x00, 0x00, 0x4e, 0x0b, 0x00, 0x00, 0x4f, 0x0b, 0x00, 0x00, 0x4f, 0x0b, 0x00, 0x00, 0x67, 0x0b, 0x00, 0x00, 0x66, 0x0b, 0x00, 0x00, 0x67, 0x0b, + 0x00, 0x00, 0x4f, 0x0b, 0x00, 0x00, 0x50, 0x0b, 0x00, 0x00, 0x50, 0x0b, 0x00, 0x00, 0x68, 0x0b, 0x00, 0x00, 0x67, 0x0b, 0x00, 0x00, 0x68, 0x0b, 0x00, 0x00, + 0x50, 0x0b, 0x00, 0x00, 0x51, 0x0b, 0x00, 0x00, 0x51, 0x0b, 0x00, 0x00, 0x69, 0x0b, 0x00, 0x00, 0x68, 0x0b, 0x00, 0x00, 0x69, 0x0b, 0x00, 0x00, 0x51, 0x0b, + 0x00, 0x00, 0x52, 0x0b, 0x00, 0x00, 0x52, 0x0b, 0x00, 0x00, 0x6a, 0x0b, 0x00, 0x00, 0x69, 0x0b, 0x00, 0x00, 0x6a, 0x0b, 0x00, 0x00, 0x52, 0x0b, 0x00, 0x00, + 0x53, 0x0b, 0x00, 0x00, 0x53, 0x0b, 0x00, 0x00, 0x6b, 0x0b, 0x00, 0x00, 0x6a, 0x0b, 0x00, 0x00, 0x6b, 0x0b, 0x00, 0x00, 0x53, 0x0b, 0x00, 0x00, 0x54, 0x0b, + 0x00, 0x00, 0x54, 0x0b, 0x00, 0x00, 0x6c, 0x0b, 0x00, 0x00, 0x6b, 0x0b, 0x00, 0x00, 0x6c, 0x0b, 0x00, 0x00, 0x54, 0x0b, 0x00, 0x00, 0x55, 0x0b, 0x00, 0x00, + 0x55, 0x0b, 0x00, 0x00, 0x6d, 0x0b, 0x00, 0x00, 0x6c, 0x0b, 0x00, 0x00, 0x6d, 0x0b, 0x00, 0x00, 0x55, 0x0b, 0x00, 0x00, 0x56, 0x0b, 0x00, 0x00, 0x56, 0x0b, + 0x00, 0x00, 0x6e, 0x0b, 0x00, 0x00, 0x6d, 0x0b, 0x00, 0x00, 0x6e, 0x0b, 0x00, 0x00, 0x56, 0x0b, 0x00, 0x00, 0x57, 0x0b, 0x00, 0x00, 0x57, 0x0b, 0x00, 0x00, + 0x6f, 0x0b, 0x00, 0x00, 0x6e, 0x0b, 0x00, 0x00, 0x6f, 0x0b, 0x00, 0x00, 0x57, 0x0b, 0x00, 0x00, 0x58, 0x0b, 0x00, 0x00, 0x58, 0x0b, 0x00, 0x00, 0x70, 0x0b, + 0x00, 0x00, 0x6f, 0x0b, 0x00, 0x00, 0x70, 0x0b, 0x00, 0x00, 0x58, 0x0b, 0x00, 0x00, 0x59, 0x0b, 0x00, 0x00, 0x59, 0x0b, 0x00, 0x00, 0x71, 0x0b, 0x00, 0x00, + 0x70, 0x0b, 0x00, 0x00, 0x71, 0x0b, 0x00, 0x00, 0x59, 0x0b, 0x00, 0x00, 0x5a, 0x0b, 0x00, 0x00, 0x5a, 0x0b, 0x00, 0x00, 0x72, 0x0b, 0x00, 0x00, 0x71, 0x0b, + 0x00, 0x00, 0x72, 0x0b, 0x00, 0x00, 0x5a, 0x0b, 0x00, 0x00, 0x5b, 0x0b, 0x00, 0x00, 0x5b, 0x0b, 0x00, 0x00, 0x73, 0x0b, 0x00, 0x00, 0x72, 0x0b, 0x00, 0x00, + 0x73, 0x0b, 0x00, 0x00, 0x5b, 0x0b, 0x00, 0x00, 0x5c, 0x0b, 0x00, 0x00, 0x5c, 0x0b, 0x00, 0x00, 0x74, 0x0b, 0x00, 0x00, 0x73, 0x0b, 0x00, 0x00, 0x74, 0x0b, + 0x00, 0x00, 0x5c, 0x0b, 0x00, 0x00, 0x5d, 0x0b, 0x00, 0x00, 0x5d, 0x0b, 0x00, 0x00, 0x75, 0x0b, 0x00, 0x00, 0x74, 0x0b, 0x00, 0x00, 0x75, 0x0b, 0x00, 0x00, + 0x5d, 0x0b, 0x00, 0x00, 0x5e, 0x0b, 0x00, 0x00, 0x5e, 0x0b, 0x00, 0x00, 0x76, 0x0b, 0x00, 0x00, 0x75, 0x0b, 0x00, 0x00, 0x76, 0x0b, 0x00, 0x00, 0x5e, 0x0b, + 0x00, 0x00, 0x5f, 0x0b, 0x00, 0x00, 0x5f, 0x0b, 0x00, 0x00, 0x77, 0x0b, 0x00, 0x00, 0x76, 0x0b, 0x00, 0x00, 0x77, 0x0b, 0x00, 0x00, 0x5f, 0x0b, 0x00, 0x00, + 0x60, 0x0b, 0x00, 0x00, 0x60, 0x0b, 0x00, 0x00, 0x78, 0x0b, 0x00, 0x00, 0x77, 0x0b, 0x00, 0x00, 0x78, 0x0b, 0x00, 0x00, 0x60, 0x0b, 0x00, 0x00, 0x61, 0x0b, + 0x00, 0x00, 0x61, 0x0b, 0x00, 0x00, 0x79, 0x0b, 0x00, 0x00, 0x78, 0x0b, 0x00, 0x00, 0x79, 0x0b, 0x00, 0x00, 0x61, 0x0b, 0x00, 0x00, 0x4a, 0x0b, 0x00, 0x00, + 0x4a, 0x0b, 0x00, 0x00, 0x62, 0x0b, 0x00, 0x00, 0x79, 0x0b, 0x00, 0x00, 0x7a, 0x0b, 0x00, 0x00, 0x62, 0x0b, 0x00, 0x00, 0x63, 0x0b, 0x00, 0x00, 0x63, 0x0b, + 0x00, 0x00, 0x7b, 0x0b, 0x00, 0x00, 0x7a, 0x0b, 0x00, 0x00, 0x7b, 0x0b, 0x00, 0x00, 0x63, 0x0b, 0x00, 0x00, 0x64, 0x0b, 0x00, 0x00, 0x64, 0x0b, 0x00, 0x00, + 0x7c, 0x0b, 0x00, 0x00, 0x7b, 0x0b, 0x00, 0x00, 0x7c, 0x0b, 0x00, 0x00, 0x64, 0x0b, 0x00, 0x00, 0x65, 0x0b, 0x00, 0x00, 0x65, 0x0b, 0x00, 0x00, 0x7d, 0x0b, + 0x00, 0x00, 0x7c, 0x0b, 0x00, 0x00, 0x7d, 0x0b, 0x00, 0x00, 0x65, 0x0b, 0x00, 0x00, 0x66, 0x0b, 0x00, 0x00, 0x66, 0x0b, 0x00, 0x00, 0x7e, 0x0b, 0x00, 0x00, + 0x7d, 0x0b, 0x00, 0x00, 0x7e, 0x0b, 0x00, 0x00, 0x66, 0x0b, 0x00, 0x00, 0x67, 0x0b, 0x00, 0x00, 0x67, 0x0b, 0x00, 0x00, 0x7f, 0x0b, 0x00, 0x00, 0x7e, 0x0b, + 0x00, 0x00, 0x7f, 0x0b, 0x00, 0x00, 0x67, 0x0b, 0x00, 0x00, 0x68, 0x0b, 0x00, 0x00, 0x68, 0x0b, 0x00, 0x00, 0x80, 0x0b, 0x00, 0x00, 0x7f, 0x0b, 0x00, 0x00, + 0x80, 0x0b, 0x00, 0x00, 0x68, 0x0b, 0x00, 0x00, 0x69, 0x0b, 0x00, 0x00, 0x69, 0x0b, 0x00, 0x00, 0x81, 0x0b, 0x00, 0x00, 0x80, 0x0b, 0x00, 0x00, 0x81, 0x0b, + 0x00, 0x00, 0x69, 0x0b, 0x00, 0x00, 0x6a, 0x0b, 0x00, 0x00, 0x6a, 0x0b, 0x00, 0x00, 0x82, 0x0b, 0x00, 0x00, 0x81, 0x0b, 0x00, 0x00, 0x82, 0x0b, 0x00, 0x00, + 0x6a, 0x0b, 0x00, 0x00, 0x6b, 0x0b, 0x00, 0x00, 0x6b, 0x0b, 0x00, 0x00, 0x83, 0x0b, 0x00, 0x00, 0x82, 0x0b, 0x00, 0x00, 0x83, 0x0b, 0x00, 0x00, 0x6b, 0x0b, + 0x00, 0x00, 0x6c, 0x0b, 0x00, 0x00, 0x6c, 0x0b, 0x00, 0x00, 0x84, 0x0b, 0x00, 0x00, 0x83, 0x0b, 0x00, 0x00, 0x84, 0x0b, 0x00, 0x00, 0x6c, 0x0b, 0x00, 0x00, + 0x6d, 0x0b, 0x00, 0x00, 0x6d, 0x0b, 0x00, 0x00, 0x85, 0x0b, 0x00, 0x00, 0x84, 0x0b, 0x00, 0x00, 0x85, 0x0b, 0x00, 0x00, 0x6d, 0x0b, 0x00, 0x00, 0x6e, 0x0b, + 0x00, 0x00, 0x6e, 0x0b, 0x00, 0x00, 0x86, 0x0b, 0x00, 0x00, 0x85, 0x0b, 0x00, 0x00, 0x86, 0x0b, 0x00, 0x00, 0x6e, 0x0b, 0x00, 0x00, 0x6f, 0x0b, 0x00, 0x00, + 0x6f, 0x0b, 0x00, 0x00, 0x87, 0x0b, 0x00, 0x00, 0x86, 0x0b, 0x00, 0x00, 0x87, 0x0b, 0x00, 0x00, 0x6f, 0x0b, 0x00, 0x00, 0x70, 0x0b, 0x00, 0x00, 0x70, 0x0b, + 0x00, 0x00, 0x88, 0x0b, 0x00, 0x00, 0x87, 0x0b, 0x00, 0x00, 0x88, 0x0b, 0x00, 0x00, 0x70, 0x0b, 0x00, 0x00, 0x71, 0x0b, 0x00, 0x00, 0x71, 0x0b, 0x00, 0x00, + 0x89, 0x0b, 0x00, 0x00, 0x88, 0x0b, 0x00, 0x00, 0x89, 0x0b, 0x00, 0x00, 0x71, 0x0b, 0x00, 0x00, 0x72, 0x0b, 0x00, 0x00, 0x72, 0x0b, 0x00, 0x00, 0x8a, 0x0b, + 0x00, 0x00, 0x89, 0x0b, 0x00, 0x00, 0x8a, 0x0b, 0x00, 0x00, 0x72, 0x0b, 0x00, 0x00, 0x73, 0x0b, 0x00, 0x00, 0x73, 0x0b, 0x00, 0x00, 0x8b, 0x0b, 0x00, 0x00, + 0x8a, 0x0b, 0x00, 0x00, 0x8b, 0x0b, 0x00, 0x00, 0x73, 0x0b, 0x00, 0x00, 0x74, 0x0b, 0x00, 0x00, 0x74, 0x0b, 0x00, 0x00, 0x8c, 0x0b, 0x00, 0x00, 0x8b, 0x0b, + 0x00, 0x00, 0x8c, 0x0b, 0x00, 0x00, 0x74, 0x0b, 0x00, 0x00, 0x75, 0x0b, 0x00, 0x00, 0x75, 0x0b, 0x00, 0x00, 0x8d, 0x0b, 0x00, 0x00, 0x8c, 0x0b, 0x00, 0x00, + 0x8d, 0x0b, 0x00, 0x00, 0x75, 0x0b, 0x00, 0x00, 0x76, 0x0b, 0x00, 0x00, 0x76, 0x0b, 0x00, 0x00, 0x8e, 0x0b, 0x00, 0x00, 0x8d, 0x0b, 0x00, 0x00, 0x8e, 0x0b, + 0x00, 0x00, 0x76, 0x0b, 0x00, 0x00, 0x77, 0x0b, 0x00, 0x00, 0x77, 0x0b, 0x00, 0x00, 0x8f, 0x0b, 0x00, 0x00, 0x8e, 0x0b, 0x00, 0x00, 0x8f, 0x0b, 0x00, 0x00, + 0x77, 0x0b, 0x00, 0x00, 0x78, 0x0b, 0x00, 0x00, 0x78, 0x0b, 0x00, 0x00, 0x90, 0x0b, 0x00, 0x00, 0x8f, 0x0b, 0x00, 0x00, 0x90, 0x0b, 0x00, 0x00, 0x78, 0x0b, + 0x00, 0x00, 0x79, 0x0b, 0x00, 0x00, 0x79, 0x0b, 0x00, 0x00, 0x91, 0x0b, 0x00, 0x00, 0x90, 0x0b, 0x00, 0x00, 0x91, 0x0b, 0x00, 0x00, 0x79, 0x0b, 0x00, 0x00, + 0x62, 0x0b, 0x00, 0x00, 0x62, 0x0b, 0x00, 0x00, 0x7a, 0x0b, 0x00, 0x00, 0x91, 0x0b, 0x00, 0x00, 0x92, 0x0b, 0x00, 0x00, 0x7a, 0x0b, 0x00, 0x00, 0x7b, 0x0b, + 0x00, 0x00, 0x7b, 0x0b, 0x00, 0x00, 0x93, 0x0b, 0x00, 0x00, 0x92, 0x0b, 0x00, 0x00, 0x93, 0x0b, 0x00, 0x00, 0x7b, 0x0b, 0x00, 0x00, 0x7c, 0x0b, 0x00, 0x00, + 0x7c, 0x0b, 0x00, 0x00, 0x94, 0x0b, 0x00, 0x00, 0x93, 0x0b, 0x00, 0x00, 0x94, 0x0b, 0x00, 0x00, 0x7c, 0x0b, 0x00, 0x00, 0x7d, 0x0b, 0x00, 0x00, 0x7d, 0x0b, + 0x00, 0x00, 0x95, 0x0b, 0x00, 0x00, 0x94, 0x0b, 0x00, 0x00, 0x95, 0x0b, 0x00, 0x00, 0x7d, 0x0b, 0x00, 0x00, 0x7e, 0x0b, 0x00, 0x00, 0x7e, 0x0b, 0x00, 0x00, + 0x96, 0x0b, 0x00, 0x00, 0x95, 0x0b, 0x00, 0x00, 0x96, 0x0b, 0x00, 0x00, 0x7e, 0x0b, 0x00, 0x00, 0x7f, 0x0b, 0x00, 0x00, 0x7f, 0x0b, 0x00, 0x00, 0x97, 0x0b, + 0x00, 0x00, 0x96, 0x0b, 0x00, 0x00, 0x97, 0x0b, 0x00, 0x00, 0x7f, 0x0b, 0x00, 0x00, 0x80, 0x0b, 0x00, 0x00, 0x80, 0x0b, 0x00, 0x00, 0x98, 0x0b, 0x00, 0x00, + 0x97, 0x0b, 0x00, 0x00, 0x98, 0x0b, 0x00, 0x00, 0x80, 0x0b, 0x00, 0x00, 0x81, 0x0b, 0x00, 0x00, 0x81, 0x0b, 0x00, 0x00, 0x99, 0x0b, 0x00, 0x00, 0x98, 0x0b, + 0x00, 0x00, 0x99, 0x0b, 0x00, 0x00, 0x81, 0x0b, 0x00, 0x00, 0x82, 0x0b, 0x00, 0x00, 0x82, 0x0b, 0x00, 0x00, 0x9a, 0x0b, 0x00, 0x00, 0x99, 0x0b, 0x00, 0x00, + 0x9a, 0x0b, 0x00, 0x00, 0x82, 0x0b, 0x00, 0x00, 0x83, 0x0b, 0x00, 0x00, 0x83, 0x0b, 0x00, 0x00, 0x9b, 0x0b, 0x00, 0x00, 0x9a, 0x0b, 0x00, 0x00, 0x9b, 0x0b, + 0x00, 0x00, 0x83, 0x0b, 0x00, 0x00, 0x84, 0x0b, 0x00, 0x00, 0x84, 0x0b, 0x00, 0x00, 0x9c, 0x0b, 0x00, 0x00, 0x9b, 0x0b, 0x00, 0x00, 0x9c, 0x0b, 0x00, 0x00, + 0x84, 0x0b, 0x00, 0x00, 0x85, 0x0b, 0x00, 0x00, 0x85, 0x0b, 0x00, 0x00, 0x9d, 0x0b, 0x00, 0x00, 0x9c, 0x0b, 0x00, 0x00, 0x9d, 0x0b, 0x00, 0x00, 0x85, 0x0b, + 0x00, 0x00, 0x86, 0x0b, 0x00, 0x00, 0x86, 0x0b, 0x00, 0x00, 0x9e, 0x0b, 0x00, 0x00, 0x9d, 0x0b, 0x00, 0x00, 0x9e, 0x0b, 0x00, 0x00, 0x86, 0x0b, 0x00, 0x00, + 0x87, 0x0b, 0x00, 0x00, 0x87, 0x0b, 0x00, 0x00, 0x9f, 0x0b, 0x00, 0x00, 0x9e, 0x0b, 0x00, 0x00, 0x9f, 0x0b, 0x00, 0x00, 0x87, 0x0b, 0x00, 0x00, 0x88, 0x0b, + 0x00, 0x00, 0x88, 0x0b, 0x00, 0x00, 0xa0, 0x0b, 0x00, 0x00, 0x9f, 0x0b, 0x00, 0x00, 0xa0, 0x0b, 0x00, 0x00, 0x88, 0x0b, 0x00, 0x00, 0x89, 0x0b, 0x00, 0x00, + 0x89, 0x0b, 0x00, 0x00, 0xa1, 0x0b, 0x00, 0x00, 0xa0, 0x0b, 0x00, 0x00, 0xa1, 0x0b, 0x00, 0x00, 0x89, 0x0b, 0x00, 0x00, 0x8a, 0x0b, 0x00, 0x00, 0x8a, 0x0b, + 0x00, 0x00, 0xa2, 0x0b, 0x00, 0x00, 0xa1, 0x0b, 0x00, 0x00, 0xa2, 0x0b, 0x00, 0x00, 0x8a, 0x0b, 0x00, 0x00, 0x8b, 0x0b, 0x00, 0x00, 0x8b, 0x0b, 0x00, 0x00, + 0xa3, 0x0b, 0x00, 0x00, 0xa2, 0x0b, 0x00, 0x00, 0xa3, 0x0b, 0x00, 0x00, 0x8b, 0x0b, 0x00, 0x00, 0x8c, 0x0b, 0x00, 0x00, 0x8c, 0x0b, 0x00, 0x00, 0xa4, 0x0b, + 0x00, 0x00, 0xa3, 0x0b, 0x00, 0x00, 0xa4, 0x0b, 0x00, 0x00, 0x8c, 0x0b, 0x00, 0x00, 0x8d, 0x0b, 0x00, 0x00, 0x8d, 0x0b, 0x00, 0x00, 0xa5, 0x0b, 0x00, 0x00, + 0xa4, 0x0b, 0x00, 0x00, 0xa5, 0x0b, 0x00, 0x00, 0x8d, 0x0b, 0x00, 0x00, 0x8e, 0x0b, 0x00, 0x00, 0x8e, 0x0b, 0x00, 0x00, 0xa6, 0x0b, 0x00, 0x00, 0xa5, 0x0b, + 0x00, 0x00, 0xa6, 0x0b, 0x00, 0x00, 0x8e, 0x0b, 0x00, 0x00, 0x8f, 0x0b, 0x00, 0x00, 0x8f, 0x0b, 0x00, 0x00, 0xa7, 0x0b, 0x00, 0x00, 0xa6, 0x0b, 0x00, 0x00, + 0xa7, 0x0b, 0x00, 0x00, 0x8f, 0x0b, 0x00, 0x00, 0x90, 0x0b, 0x00, 0x00, 0x90, 0x0b, 0x00, 0x00, 0xa8, 0x0b, 0x00, 0x00, 0xa7, 0x0b, 0x00, 0x00, 0xa8, 0x0b, + 0x00, 0x00, 0x90, 0x0b, 0x00, 0x00, 0x91, 0x0b, 0x00, 0x00, 0x91, 0x0b, 0x00, 0x00, 0xa9, 0x0b, 0x00, 0x00, 0xa8, 0x0b, 0x00, 0x00, 0xa9, 0x0b, 0x00, 0x00, + 0x91, 0x0b, 0x00, 0x00, 0x7a, 0x0b, 0x00, 0x00, 0x7a, 0x0b, 0x00, 0x00, 0x92, 0x0b, 0x00, 0x00, 0xa9, 0x0b, 0x00, 0x00, 0x89, 0x0a, 0x00, 0x00, 0x92, 0x0b, + 0x00, 0x00, 0x93, 0x0b, 0x00, 0x00, 0x93, 0x0b, 0x00, 0x00, 0x8a, 0x0a, 0x00, 0x00, 0x89, 0x0a, 0x00, 0x00, 0x8a, 0x0a, 0x00, 0x00, 0x93, 0x0b, 0x00, 0x00, + 0x94, 0x0b, 0x00, 0x00, 0x94, 0x0b, 0x00, 0x00, 0x8c, 0x0a, 0x00, 0x00, 0x8a, 0x0a, 0x00, 0x00, 0x8c, 0x0a, 0x00, 0x00, 0x94, 0x0b, 0x00, 0x00, 0x95, 0x0b, + 0x00, 0x00, 0x95, 0x0b, 0x00, 0x00, 0x8d, 0x0a, 0x00, 0x00, 0x8c, 0x0a, 0x00, 0x00, 0x8d, 0x0a, 0x00, 0x00, 0x95, 0x0b, 0x00, 0x00, 0x96, 0x0b, 0x00, 0x00, + 0x96, 0x0b, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, 0x8d, 0x0a, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, 0x96, 0x0b, 0x00, 0x00, 0x97, 0x0b, 0x00, 0x00, 0x97, 0x0b, + 0x00, 0x00, 0x8f, 0x0a, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, 0x8f, 0x0a, 0x00, 0x00, 0x97, 0x0b, 0x00, 0x00, 0x98, 0x0b, 0x00, 0x00, 0x98, 0x0b, 0x00, 0x00, + 0x90, 0x0a, 0x00, 0x00, 0x8f, 0x0a, 0x00, 0x00, 0x90, 0x0a, 0x00, 0x00, 0x98, 0x0b, 0x00, 0x00, 0x99, 0x0b, 0x00, 0x00, 0x99, 0x0b, 0x00, 0x00, 0x91, 0x0a, + 0x00, 0x00, 0x90, 0x0a, 0x00, 0x00, 0x91, 0x0a, 0x00, 0x00, 0x99, 0x0b, 0x00, 0x00, 0x9a, 0x0b, 0x00, 0x00, 0x9a, 0x0b, 0x00, 0x00, 0x92, 0x0a, 0x00, 0x00, + 0x91, 0x0a, 0x00, 0x00, 0x92, 0x0a, 0x00, 0x00, 0x9a, 0x0b, 0x00, 0x00, 0x9b, 0x0b, 0x00, 0x00, 0x9b, 0x0b, 0x00, 0x00, 0x93, 0x0a, 0x00, 0x00, 0x92, 0x0a, + 0x00, 0x00, 0x93, 0x0a, 0x00, 0x00, 0x9b, 0x0b, 0x00, 0x00, 0x9c, 0x0b, 0x00, 0x00, 0x9c, 0x0b, 0x00, 0x00, 0x94, 0x0a, 0x00, 0x00, 0x93, 0x0a, 0x00, 0x00, + 0x94, 0x0a, 0x00, 0x00, 0x9c, 0x0b, 0x00, 0x00, 0x9d, 0x0b, 0x00, 0x00, 0x9d, 0x0b, 0x00, 0x00, 0x95, 0x0a, 0x00, 0x00, 0x94, 0x0a, 0x00, 0x00, 0x95, 0x0a, + 0x00, 0x00, 0x9d, 0x0b, 0x00, 0x00, 0x9e, 0x0b, 0x00, 0x00, 0x9e, 0x0b, 0x00, 0x00, 0x96, 0x0a, 0x00, 0x00, 0x95, 0x0a, 0x00, 0x00, 0x96, 0x0a, 0x00, 0x00, + 0x9e, 0x0b, 0x00, 0x00, 0x9f, 0x0b, 0x00, 0x00, 0x9f, 0x0b, 0x00, 0x00, 0x97, 0x0a, 0x00, 0x00, 0x96, 0x0a, 0x00, 0x00, 0x97, 0x0a, 0x00, 0x00, 0x9f, 0x0b, + 0x00, 0x00, 0xa0, 0x0b, 0x00, 0x00, 0xa0, 0x0b, 0x00, 0x00, 0x98, 0x0a, 0x00, 0x00, 0x97, 0x0a, 0x00, 0x00, 0x98, 0x0a, 0x00, 0x00, 0xa0, 0x0b, 0x00, 0x00, + 0xa1, 0x0b, 0x00, 0x00, 0xa1, 0x0b, 0x00, 0x00, 0x99, 0x0a, 0x00, 0x00, 0x98, 0x0a, 0x00, 0x00, 0x99, 0x0a, 0x00, 0x00, 0xa1, 0x0b, 0x00, 0x00, 0xa2, 0x0b, + 0x00, 0x00, 0xa2, 0x0b, 0x00, 0x00, 0x9a, 0x0a, 0x00, 0x00, 0x99, 0x0a, 0x00, 0x00, 0x9a, 0x0a, 0x00, 0x00, 0xa2, 0x0b, 0x00, 0x00, 0xa3, 0x0b, 0x00, 0x00, + 0xa3, 0x0b, 0x00, 0x00, 0x9b, 0x0a, 0x00, 0x00, 0x9a, 0x0a, 0x00, 0x00, 0x9b, 0x0a, 0x00, 0x00, 0xa3, 0x0b, 0x00, 0x00, 0xa4, 0x0b, 0x00, 0x00, 0xa4, 0x0b, + 0x00, 0x00, 0x9c, 0x0a, 0x00, 0x00, 0x9b, 0x0a, 0x00, 0x00, 0x9c, 0x0a, 0x00, 0x00, 0xa4, 0x0b, 0x00, 0x00, 0xa5, 0x0b, 0x00, 0x00, 0xa5, 0x0b, 0x00, 0x00, + 0x9d, 0x0a, 0x00, 0x00, 0x9c, 0x0a, 0x00, 0x00, 0x9d, 0x0a, 0x00, 0x00, 0xa5, 0x0b, 0x00, 0x00, 0xa6, 0x0b, 0x00, 0x00, 0xa6, 0x0b, 0x00, 0x00, 0x9e, 0x0a, + 0x00, 0x00, 0x9d, 0x0a, 0x00, 0x00, 0x9e, 0x0a, 0x00, 0x00, 0xa6, 0x0b, 0x00, 0x00, 0xa7, 0x0b, 0x00, 0x00, 0xa7, 0x0b, 0x00, 0x00, 0x9f, 0x0a, 0x00, 0x00, + 0x9e, 0x0a, 0x00, 0x00, 0x9f, 0x0a, 0x00, 0x00, 0xa7, 0x0b, 0x00, 0x00, 0xa8, 0x0b, 0x00, 0x00, 0xa8, 0x0b, 0x00, 0x00, 0xa0, 0x0a, 0x00, 0x00, 0x9f, 0x0a, + 0x00, 0x00, 0xa0, 0x0a, 0x00, 0x00, 0xa8, 0x0b, 0x00, 0x00, 0xa9, 0x0b, 0x00, 0x00, 0xa9, 0x0b, 0x00, 0x00, 0xa1, 0x0a, 0x00, 0x00, 0xa0, 0x0a, 0x00, 0x00, + 0xa1, 0x0a, 0x00, 0x00, 0xa9, 0x0b, 0x00, 0x00, 0x92, 0x0b, 0x00, 0x00, 0x92, 0x0b, 0x00, 0x00, 0x89, 0x0a, 0x00, 0x00, 0xa1, 0x0a, 0x00, 0x00, 0xaa, 0x0b, + 0x00, 0x00, 0xab, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xab, 0x0b, 0x00, 0x00, 0xad, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, + 0xae, 0x0b, 0x00, 0x00, 0xaa, 0x0b, 0x00, 0x00, 0xad, 0x0b, 0x00, 0x00, 0xaf, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xaf, 0x0b, 0x00, 0x00, 0xb0, 0x0b, + 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xb0, 0x0b, 0x00, 0x00, 0xb1, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xb1, 0x0b, 0x00, 0x00, 0xb2, 0x0b, 0x00, 0x00, + 0xac, 0x0b, 0x00, 0x00, 0xb2, 0x0b, 0x00, 0x00, 0xb3, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xb3, 0x0b, 0x00, 0x00, 0xb4, 0x0b, 0x00, 0x00, 0xac, 0x0b, + 0x00, 0x00, 0xb4, 0x0b, 0x00, 0x00, 0xb5, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xb5, 0x0b, 0x00, 0x00, 0xb6, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, + 0xb6, 0x0b, 0x00, 0x00, 0xb7, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xb7, 0x0b, 0x00, 0x00, 0xb8, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xb8, 0x0b, + 0x00, 0x00, 0xb9, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xb9, 0x0b, 0x00, 0x00, 0xba, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xba, 0x0b, 0x00, 0x00, + 0xbb, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xbb, 0x0b, 0x00, 0x00, 0xbc, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xbc, 0x0b, 0x00, 0x00, 0xbd, 0x0b, + 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xbd, 0x0b, 0x00, 0x00, 0xbe, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xbe, 0x0b, 0x00, 0x00, 0xbf, 0x0b, 0x00, 0x00, + 0xac, 0x0b, 0x00, 0x00, 0xbf, 0x0b, 0x00, 0x00, 0xc0, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xc0, 0x0b, 0x00, 0x00, 0xc1, 0x0b, 0x00, 0x00, 0xac, 0x0b, + 0x00, 0x00, 0xc1, 0x0b, 0x00, 0x00, 0xc2, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xc2, 0x0b, 0x00, 0x00, 0xae, 0x0b, 0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, + 0xc3, 0x0b, 0x00, 0x00, 0xc4, 0x0b, 0x00, 0x00, 0xc5, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xc6, 0x0b, 0x00, 0x00, 0xc4, 0x0b, 0x00, 0x00, 0xc3, 0x0b, + 0x00, 0x00, 0xc7, 0x0b, 0x00, 0x00, 0xc6, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xc8, 0x0b, 0x00, 0x00, 0xc7, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, + 0xc9, 0x0b, 0x00, 0x00, 0xc8, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xca, 0x0b, 0x00, 0x00, 0xc9, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xcb, 0x0b, + 0x00, 0x00, 0xca, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xcc, 0x0b, 0x00, 0x00, 0xcb, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xcd, 0x0b, 0x00, 0x00, + 0xcc, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xce, 0x0b, 0x00, 0x00, 0xcd, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xcf, 0x0b, 0x00, 0x00, 0xce, 0x0b, + 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xd0, 0x0b, 0x00, 0x00, 0xcf, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xd1, 0x0b, 0x00, 0x00, 0xd0, 0x0b, 0x00, 0x00, + 0xc3, 0x0b, 0x00, 0x00, 0xd2, 0x0b, 0x00, 0x00, 0xd1, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xd3, 0x0b, 0x00, 0x00, 0xd2, 0x0b, 0x00, 0x00, 0xc3, 0x0b, + 0x00, 0x00, 0xd4, 0x0b, 0x00, 0x00, 0xd3, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xd5, 0x0b, 0x00, 0x00, 0xd4, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, + 0xd6, 0x0b, 0x00, 0x00, 0xd5, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xd7, 0x0b, 0x00, 0x00, 0xd6, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xd8, 0x0b, + 0x00, 0x00, 0xd7, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xd9, 0x0b, 0x00, 0x00, 0xd8, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xda, 0x0b, 0x00, 0x00, + 0xd9, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xdb, 0x0b, 0x00, 0x00, 0xda, 0x0b, 0x00, 0x00, 0xc3, 0x0b, 0x00, 0x00, 0xc5, 0x0b, 0x00, 0x00, 0xdb, 0x0b, + 0x00, 0x00, 0xaa, 0x0b, 0x00, 0x00, 0xdc, 0x0b, 0x00, 0x00, 0xdd, 0x0b, 0x00, 0x00, 0xdd, 0x0b, 0x00, 0x00, 0xab, 0x0b, 0x00, 0x00, 0xaa, 0x0b, 0x00, 0x00, + 0xab, 0x0b, 0x00, 0x00, 0xdd, 0x0b, 0x00, 0x00, 0xde, 0x0b, 0x00, 0x00, 0xde, 0x0b, 0x00, 0x00, 0xad, 0x0b, 0x00, 0x00, 0xab, 0x0b, 0x00, 0x00, 0xad, 0x0b, + 0x00, 0x00, 0xde, 0x0b, 0x00, 0x00, 0xdf, 0x0b, 0x00, 0x00, 0xdf, 0x0b, 0x00, 0x00, 0xaf, 0x0b, 0x00, 0x00, 0xad, 0x0b, 0x00, 0x00, 0xaf, 0x0b, 0x00, 0x00, + 0xdf, 0x0b, 0x00, 0x00, 0xe0, 0x0b, 0x00, 0x00, 0xe0, 0x0b, 0x00, 0x00, 0xb0, 0x0b, 0x00, 0x00, 0xaf, 0x0b, 0x00, 0x00, 0xb0, 0x0b, 0x00, 0x00, 0xe0, 0x0b, + 0x00, 0x00, 0xe1, 0x0b, 0x00, 0x00, 0xe1, 0x0b, 0x00, 0x00, 0xb1, 0x0b, 0x00, 0x00, 0xb0, 0x0b, 0x00, 0x00, 0xb1, 0x0b, 0x00, 0x00, 0xe1, 0x0b, 0x00, 0x00, + 0xe2, 0x0b, 0x00, 0x00, 0xe2, 0x0b, 0x00, 0x00, 0xb2, 0x0b, 0x00, 0x00, 0xb1, 0x0b, 0x00, 0x00, 0xb2, 0x0b, 0x00, 0x00, 0xe2, 0x0b, 0x00, 0x00, 0xe3, 0x0b, + 0x00, 0x00, 0xe3, 0x0b, 0x00, 0x00, 0xb3, 0x0b, 0x00, 0x00, 0xb2, 0x0b, 0x00, 0x00, 0xb3, 0x0b, 0x00, 0x00, 0xe3, 0x0b, 0x00, 0x00, 0xe4, 0x0b, 0x00, 0x00, + 0xe4, 0x0b, 0x00, 0x00, 0xb4, 0x0b, 0x00, 0x00, 0xb3, 0x0b, 0x00, 0x00, 0xb4, 0x0b, 0x00, 0x00, 0xe4, 0x0b, 0x00, 0x00, 0xe5, 0x0b, 0x00, 0x00, 0xe5, 0x0b, + 0x00, 0x00, 0xb5, 0x0b, 0x00, 0x00, 0xb4, 0x0b, 0x00, 0x00, 0xb5, 0x0b, 0x00, 0x00, 0xe5, 0x0b, 0x00, 0x00, 0xe6, 0x0b, 0x00, 0x00, 0xe6, 0x0b, 0x00, 0x00, + 0xb6, 0x0b, 0x00, 0x00, 0xb5, 0x0b, 0x00, 0x00, 0xb6, 0x0b, 0x00, 0x00, 0xe6, 0x0b, 0x00, 0x00, 0xe7, 0x0b, 0x00, 0x00, 0xe7, 0x0b, 0x00, 0x00, 0xb7, 0x0b, + 0x00, 0x00, 0xb6, 0x0b, 0x00, 0x00, 0xb7, 0x0b, 0x00, 0x00, 0xe7, 0x0b, 0x00, 0x00, 0xe8, 0x0b, 0x00, 0x00, 0xe8, 0x0b, 0x00, 0x00, 0xb8, 0x0b, 0x00, 0x00, + 0xb7, 0x0b, 0x00, 0x00, 0xb8, 0x0b, 0x00, 0x00, 0xe8, 0x0b, 0x00, 0x00, 0xe9, 0x0b, 0x00, 0x00, 0xe9, 0x0b, 0x00, 0x00, 0xb9, 0x0b, 0x00, 0x00, 0xb8, 0x0b, + 0x00, 0x00, 0xb9, 0x0b, 0x00, 0x00, 0xe9, 0x0b, 0x00, 0x00, 0xea, 0x0b, 0x00, 0x00, 0xea, 0x0b, 0x00, 0x00, 0xba, 0x0b, 0x00, 0x00, 0xb9, 0x0b, 0x00, 0x00, + 0xba, 0x0b, 0x00, 0x00, 0xea, 0x0b, 0x00, 0x00, 0xeb, 0x0b, 0x00, 0x00, 0xeb, 0x0b, 0x00, 0x00, 0xbb, 0x0b, 0x00, 0x00, 0xba, 0x0b, 0x00, 0x00, 0xbb, 0x0b, + 0x00, 0x00, 0xeb, 0x0b, 0x00, 0x00, 0xec, 0x0b, 0x00, 0x00, 0xec, 0x0b, 0x00, 0x00, 0xbc, 0x0b, 0x00, 0x00, 0xbb, 0x0b, 0x00, 0x00, 0xbc, 0x0b, 0x00, 0x00, + 0xec, 0x0b, 0x00, 0x00, 0xed, 0x0b, 0x00, 0x00, 0xed, 0x0b, 0x00, 0x00, 0xbd, 0x0b, 0x00, 0x00, 0xbc, 0x0b, 0x00, 0x00, 0xbd, 0x0b, 0x00, 0x00, 0xed, 0x0b, + 0x00, 0x00, 0xee, 0x0b, 0x00, 0x00, 0xee, 0x0b, 0x00, 0x00, 0xbe, 0x0b, 0x00, 0x00, 0xbd, 0x0b, 0x00, 0x00, 0xbe, 0x0b, 0x00, 0x00, 0xee, 0x0b, 0x00, 0x00, + 0xef, 0x0b, 0x00, 0x00, 0xef, 0x0b, 0x00, 0x00, 0xbf, 0x0b, 0x00, 0x00, 0xbe, 0x0b, 0x00, 0x00, 0xbf, 0x0b, 0x00, 0x00, 0xef, 0x0b, 0x00, 0x00, 0xf0, 0x0b, + 0x00, 0x00, 0xf0, 0x0b, 0x00, 0x00, 0xc0, 0x0b, 0x00, 0x00, 0xbf, 0x0b, 0x00, 0x00, 0xc0, 0x0b, 0x00, 0x00, 0xf0, 0x0b, 0x00, 0x00, 0xf1, 0x0b, 0x00, 0x00, + 0xf1, 0x0b, 0x00, 0x00, 0xc1, 0x0b, 0x00, 0x00, 0xc0, 0x0b, 0x00, 0x00, 0xc1, 0x0b, 0x00, 0x00, 0xf1, 0x0b, 0x00, 0x00, 0xf2, 0x0b, 0x00, 0x00, 0xf2, 0x0b, + 0x00, 0x00, 0xc2, 0x0b, 0x00, 0x00, 0xc1, 0x0b, 0x00, 0x00, 0xc2, 0x0b, 0x00, 0x00, 0xf2, 0x0b, 0x00, 0x00, 0xf3, 0x0b, 0x00, 0x00, 0xf3, 0x0b, 0x00, 0x00, + 0xae, 0x0b, 0x00, 0x00, 0xc2, 0x0b, 0x00, 0x00, 0xae, 0x0b, 0x00, 0x00, 0xf3, 0x0b, 0x00, 0x00, 0xdc, 0x0b, 0x00, 0x00, 0xdc, 0x0b, 0x00, 0x00, 0xaa, 0x0b, + 0x00, 0x00, 0xae, 0x0b, 0x00, 0x00, 0xf4, 0x0b, 0x00, 0x00, 0xdd, 0x0b, 0x00, 0x00, 0xdc, 0x0b, 0x00, 0x00, 0xdc, 0x0b, 0x00, 0x00, 0xf5, 0x0b, 0x00, 0x00, + 0xf4, 0x0b, 0x00, 0x00, 0xf6, 0x0b, 0x00, 0x00, 0xde, 0x0b, 0x00, 0x00, 0xdd, 0x0b, 0x00, 0x00, 0xdd, 0x0b, 0x00, 0x00, 0xf4, 0x0b, 0x00, 0x00, 0xf6, 0x0b, + 0x00, 0x00, 0xdc, 0x0b, 0x00, 0x00, 0xf3, 0x0b, 0x00, 0x00, 0xf7, 0x0b, 0x00, 0x00, 0xf7, 0x0b, 0x00, 0x00, 0xf5, 0x0b, 0x00, 0x00, 0xdc, 0x0b, 0x00, 0x00, + 0xf5, 0x0b, 0x00, 0x00, 0xf8, 0x0b, 0x00, 0x00, 0xf9, 0x0b, 0x00, 0x00, 0xf9, 0x0b, 0x00, 0x00, 0xf4, 0x0b, 0x00, 0x00, 0xf5, 0x0b, 0x00, 0x00, 0xfa, 0x0b, + 0x00, 0x00, 0xdf, 0x0b, 0x00, 0x00, 0xde, 0x0b, 0x00, 0x00, 0xde, 0x0b, 0x00, 0x00, 0xf6, 0x0b, 0x00, 0x00, 0xfa, 0x0b, 0x00, 0x00, 0xf4, 0x0b, 0x00, 0x00, + 0xf9, 0x0b, 0x00, 0x00, 0xfb, 0x0b, 0x00, 0x00, 0xfb, 0x0b, 0x00, 0x00, 0xf6, 0x0b, 0x00, 0x00, 0xf4, 0x0b, 0x00, 0x00, 0xfc, 0x0b, 0x00, 0x00, 0xe0, 0x0b, + 0x00, 0x00, 0xdf, 0x0b, 0x00, 0x00, 0xdf, 0x0b, 0x00, 0x00, 0xfa, 0x0b, 0x00, 0x00, 0xfc, 0x0b, 0x00, 0x00, 0xf6, 0x0b, 0x00, 0x00, 0xfb, 0x0b, 0x00, 0x00, + 0xfd, 0x0b, 0x00, 0x00, 0xfd, 0x0b, 0x00, 0x00, 0xfa, 0x0b, 0x00, 0x00, 0xf6, 0x0b, 0x00, 0x00, 0xfe, 0x0b, 0x00, 0x00, 0xe1, 0x0b, 0x00, 0x00, 0xe0, 0x0b, + 0x00, 0x00, 0xe0, 0x0b, 0x00, 0x00, 0xfc, 0x0b, 0x00, 0x00, 0xfe, 0x0b, 0x00, 0x00, 0xfa, 0x0b, 0x00, 0x00, 0xfd, 0x0b, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, + 0xff, 0x0b, 0x00, 0x00, 0xfc, 0x0b, 0x00, 0x00, 0xfa, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xe2, 0x0b, 0x00, 0x00, 0xe1, 0x0b, 0x00, 0x00, 0xe1, 0x0b, + 0x00, 0x00, 0xfe, 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0xfc, 0x0b, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x0c, 0x00, 0x00, + 0xfe, 0x0b, 0x00, 0x00, 0xfc, 0x0b, 0x00, 0x00, 0x02, 0x0c, 0x00, 0x00, 0xe3, 0x0b, 0x00, 0x00, 0xe2, 0x0b, 0x00, 0x00, 0xe2, 0x0b, 0x00, 0x00, 0x00, 0x0c, + 0x00, 0x00, 0x02, 0x0c, 0x00, 0x00, 0xfe, 0x0b, 0x00, 0x00, 0x01, 0x0c, 0x00, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0xfe, 0x0b, 0x00, 0x00, 0x04, 0x0c, 0x00, 0x00, 0xe4, 0x0b, 0x00, 0x00, 0xe3, 0x0b, 0x00, 0x00, 0xe3, 0x0b, 0x00, 0x00, 0x02, 0x0c, 0x00, 0x00, 0x04, 0x0c, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x05, 0x0c, 0x00, 0x00, 0x05, 0x0c, 0x00, 0x00, 0x02, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, + 0x06, 0x0c, 0x00, 0x00, 0xe5, 0x0b, 0x00, 0x00, 0xe4, 0x0b, 0x00, 0x00, 0xe4, 0x0b, 0x00, 0x00, 0x04, 0x0c, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x00, 0x02, 0x0c, + 0x00, 0x00, 0x05, 0x0c, 0x00, 0x00, 0x07, 0x0c, 0x00, 0x00, 0x07, 0x0c, 0x00, 0x00, 0x04, 0x0c, 0x00, 0x00, 0x02, 0x0c, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x00, + 0xe6, 0x0b, 0x00, 0x00, 0xe5, 0x0b, 0x00, 0x00, 0xe5, 0x0b, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x00, 0x04, 0x0c, 0x00, 0x00, 0x07, 0x0c, + 0x00, 0x00, 0x09, 0x0c, 0x00, 0x00, 0x09, 0x0c, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x00, 0x04, 0x0c, 0x00, 0x00, 0x0a, 0x0c, 0x00, 0x00, 0xe7, 0x0b, 0x00, 0x00, + 0xe6, 0x0b, 0x00, 0x00, 0xe6, 0x0b, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x00, 0x0a, 0x0c, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x00, 0x09, 0x0c, 0x00, 0x00, 0x0b, 0x0c, + 0x00, 0x00, 0x0b, 0x0c, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0xe8, 0x0b, 0x00, 0x00, 0xe7, 0x0b, 0x00, 0x00, + 0xe7, 0x0b, 0x00, 0x00, 0x0a, 0x0c, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x00, 0x0b, 0x0c, 0x00, 0x00, 0x0d, 0x0c, 0x00, 0x00, 0x0d, 0x0c, + 0x00, 0x00, 0x0a, 0x0c, 0x00, 0x00, 0x08, 0x0c, 0x00, 0x00, 0x0e, 0x0c, 0x00, 0x00, 0xe9, 0x0b, 0x00, 0x00, 0xe8, 0x0b, 0x00, 0x00, 0xe8, 0x0b, 0x00, 0x00, + 0x0c, 0x0c, 0x00, 0x00, 0x0e, 0x0c, 0x00, 0x00, 0x0a, 0x0c, 0x00, 0x00, 0x0d, 0x0c, 0x00, 0x00, 0x0f, 0x0c, 0x00, 0x00, 0x0f, 0x0c, 0x00, 0x00, 0x0c, 0x0c, + 0x00, 0x00, 0x0a, 0x0c, 0x00, 0x00, 0x10, 0x0c, 0x00, 0x00, 0xea, 0x0b, 0x00, 0x00, 0xe9, 0x0b, 0x00, 0x00, 0xe9, 0x0b, 0x00, 0x00, 0x0e, 0x0c, 0x00, 0x00, + 0x10, 0x0c, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x0f, 0x0c, 0x00, 0x00, 0x11, 0x0c, 0x00, 0x00, 0x11, 0x0c, 0x00, 0x00, 0x0e, 0x0c, 0x00, 0x00, 0x0c, 0x0c, + 0x00, 0x00, 0x12, 0x0c, 0x00, 0x00, 0xeb, 0x0b, 0x00, 0x00, 0xea, 0x0b, 0x00, 0x00, 0xea, 0x0b, 0x00, 0x00, 0x10, 0x0c, 0x00, 0x00, 0x12, 0x0c, 0x00, 0x00, + 0x0e, 0x0c, 0x00, 0x00, 0x11, 0x0c, 0x00, 0x00, 0x13, 0x0c, 0x00, 0x00, 0x13, 0x0c, 0x00, 0x00, 0x10, 0x0c, 0x00, 0x00, 0x0e, 0x0c, 0x00, 0x00, 0x14, 0x0c, + 0x00, 0x00, 0xec, 0x0b, 0x00, 0x00, 0xeb, 0x0b, 0x00, 0x00, 0xeb, 0x0b, 0x00, 0x00, 0x12, 0x0c, 0x00, 0x00, 0x14, 0x0c, 0x00, 0x00, 0x10, 0x0c, 0x00, 0x00, + 0x13, 0x0c, 0x00, 0x00, 0x15, 0x0c, 0x00, 0x00, 0x15, 0x0c, 0x00, 0x00, 0x12, 0x0c, 0x00, 0x00, 0x10, 0x0c, 0x00, 0x00, 0x16, 0x0c, 0x00, 0x00, 0xed, 0x0b, + 0x00, 0x00, 0xec, 0x0b, 0x00, 0x00, 0xec, 0x0b, 0x00, 0x00, 0x14, 0x0c, 0x00, 0x00, 0x16, 0x0c, 0x00, 0x00, 0x12, 0x0c, 0x00, 0x00, 0x15, 0x0c, 0x00, 0x00, + 0x17, 0x0c, 0x00, 0x00, 0x17, 0x0c, 0x00, 0x00, 0x14, 0x0c, 0x00, 0x00, 0x12, 0x0c, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, 0xee, 0x0b, 0x00, 0x00, 0xed, 0x0b, + 0x00, 0x00, 0xed, 0x0b, 0x00, 0x00, 0x16, 0x0c, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, 0x14, 0x0c, 0x00, 0x00, 0x17, 0x0c, 0x00, 0x00, 0x19, 0x0c, 0x00, 0x00, + 0x19, 0x0c, 0x00, 0x00, 0x16, 0x0c, 0x00, 0x00, 0x14, 0x0c, 0x00, 0x00, 0x1a, 0x0c, 0x00, 0x00, 0xef, 0x0b, 0x00, 0x00, 0xee, 0x0b, 0x00, 0x00, 0xee, 0x0b, + 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, 0x1a, 0x0c, 0x00, 0x00, 0x16, 0x0c, 0x00, 0x00, 0x19, 0x0c, 0x00, 0x00, 0x1b, 0x0c, 0x00, 0x00, 0x1b, 0x0c, 0x00, 0x00, + 0x18, 0x0c, 0x00, 0x00, 0x16, 0x0c, 0x00, 0x00, 0x1c, 0x0c, 0x00, 0x00, 0xf0, 0x0b, 0x00, 0x00, 0xef, 0x0b, 0x00, 0x00, 0xef, 0x0b, 0x00, 0x00, 0x1a, 0x0c, + 0x00, 0x00, 0x1c, 0x0c, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, 0x1b, 0x0c, 0x00, 0x00, 0x1d, 0x0c, 0x00, 0x00, 0x1d, 0x0c, 0x00, 0x00, 0x1a, 0x0c, 0x00, 0x00, + 0x18, 0x0c, 0x00, 0x00, 0x1e, 0x0c, 0x00, 0x00, 0xf1, 0x0b, 0x00, 0x00, 0xf0, 0x0b, 0x00, 0x00, 0xf0, 0x0b, 0x00, 0x00, 0x1c, 0x0c, 0x00, 0x00, 0x1e, 0x0c, + 0x00, 0x00, 0x1a, 0x0c, 0x00, 0x00, 0x1d, 0x0c, 0x00, 0x00, 0x1f, 0x0c, 0x00, 0x00, 0x1f, 0x0c, 0x00, 0x00, 0x1c, 0x0c, 0x00, 0x00, 0x1a, 0x0c, 0x00, 0x00, + 0x20, 0x0c, 0x00, 0x00, 0xf2, 0x0b, 0x00, 0x00, 0xf1, 0x0b, 0x00, 0x00, 0xf1, 0x0b, 0x00, 0x00, 0x1e, 0x0c, 0x00, 0x00, 0x20, 0x0c, 0x00, 0x00, 0x1c, 0x0c, + 0x00, 0x00, 0x1f, 0x0c, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x1e, 0x0c, 0x00, 0x00, 0x1c, 0x0c, 0x00, 0x00, 0xf7, 0x0b, 0x00, 0x00, + 0xf3, 0x0b, 0x00, 0x00, 0xf2, 0x0b, 0x00, 0x00, 0xf2, 0x0b, 0x00, 0x00, 0x20, 0x0c, 0x00, 0x00, 0xf7, 0x0b, 0x00, 0x00, 0x1e, 0x0c, 0x00, 0x00, 0x21, 0x0c, + 0x00, 0x00, 0x22, 0x0c, 0x00, 0x00, 0x22, 0x0c, 0x00, 0x00, 0x20, 0x0c, 0x00, 0x00, 0x1e, 0x0c, 0x00, 0x00, 0x20, 0x0c, 0x00, 0x00, 0x22, 0x0c, 0x00, 0x00, + 0x23, 0x0c, 0x00, 0x00, 0x23, 0x0c, 0x00, 0x00, 0xf7, 0x0b, 0x00, 0x00, 0x20, 0x0c, 0x00, 0x00, 0xf7, 0x0b, 0x00, 0x00, 0x23, 0x0c, 0x00, 0x00, 0xf8, 0x0b, + 0x00, 0x00, 0xf8, 0x0b, 0x00, 0x00, 0xf5, 0x0b, 0x00, 0x00, 0xf7, 0x0b, 0x00, 0x00, 0x24, 0x0c, 0x00, 0x00, 0xf9, 0x0b, 0x00, 0x00, 0xf8, 0x0b, 0x00, 0x00, + 0xf8, 0x0b, 0x00, 0x00, 0x25, 0x0c, 0x00, 0x00, 0x24, 0x0c, 0x00, 0x00, 0x26, 0x0c, 0x00, 0x00, 0xfb, 0x0b, 0x00, 0x00, 0xf9, 0x0b, 0x00, 0x00, 0xf9, 0x0b, + 0x00, 0x00, 0x24, 0x0c, 0x00, 0x00, 0x26, 0x0c, 0x00, 0x00, 0x25, 0x0c, 0x00, 0x00, 0xf8, 0x0b, 0x00, 0x00, 0x23, 0x0c, 0x00, 0x00, 0x23, 0x0c, 0x00, 0x00, + 0x27, 0x0c, 0x00, 0x00, 0x25, 0x0c, 0x00, 0x00, 0x28, 0x0c, 0x00, 0x00, 0x24, 0x0c, 0x00, 0x00, 0x25, 0x0c, 0x00, 0x00, 0x25, 0x0c, 0x00, 0x00, 0x29, 0x0c, + 0x00, 0x00, 0x28, 0x0c, 0x00, 0x00, 0x2a, 0x0c, 0x00, 0x00, 0xfd, 0x0b, 0x00, 0x00, 0xfb, 0x0b, 0x00, 0x00, 0xfb, 0x0b, 0x00, 0x00, 0x26, 0x0c, 0x00, 0x00, + 0x2a, 0x0c, 0x00, 0x00, 0x2b, 0x0c, 0x00, 0x00, 0x26, 0x0c, 0x00, 0x00, 0x24, 0x0c, 0x00, 0x00, 0x24, 0x0c, 0x00, 0x00, 0x28, 0x0c, 0x00, 0x00, 0x2b, 0x0c, + 0x00, 0x00, 0x2c, 0x0c, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xfd, 0x0b, 0x00, 0x00, 0xfd, 0x0b, 0x00, 0x00, 0x2a, 0x0c, 0x00, 0x00, 0x2c, 0x0c, 0x00, 0x00, + 0x2d, 0x0c, 0x00, 0x00, 0x2a, 0x0c, 0x00, 0x00, 0x26, 0x0c, 0x00, 0x00, 0x26, 0x0c, 0x00, 0x00, 0x2b, 0x0c, 0x00, 0x00, 0x2d, 0x0c, 0x00, 0x00, 0x2e, 0x0c, + 0x00, 0x00, 0x01, 0x0c, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0x2c, 0x0c, 0x00, 0x00, 0x2e, 0x0c, 0x00, 0x00, 0x2f, 0x0c, 0x00, 0x00, + 0x2c, 0x0c, 0x00, 0x00, 0x2a, 0x0c, 0x00, 0x00, 0x2a, 0x0c, 0x00, 0x00, 0x2d, 0x0c, 0x00, 0x00, 0x2f, 0x0c, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x03, 0x0c, + 0x00, 0x00, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x0c, 0x00, 0x00, 0x2e, 0x0c, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x31, 0x0c, 0x00, 0x00, 0x2e, 0x0c, 0x00, 0x00, + 0x2c, 0x0c, 0x00, 0x00, 0x2c, 0x0c, 0x00, 0x00, 0x2f, 0x0c, 0x00, 0x00, 0x31, 0x0c, 0x00, 0x00, 0x32, 0x0c, 0x00, 0x00, 0x05, 0x0c, 0x00, 0x00, 0x03, 0x0c, + 0x00, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x32, 0x0c, 0x00, 0x00, 0x33, 0x0c, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x2e, 0x0c, 0x00, 0x00, + 0x2e, 0x0c, 0x00, 0x00, 0x31, 0x0c, 0x00, 0x00, 0x33, 0x0c, 0x00, 0x00, 0x34, 0x0c, 0x00, 0x00, 0x07, 0x0c, 0x00, 0x00, 0x05, 0x0c, 0x00, 0x00, 0x05, 0x0c, + 0x00, 0x00, 0x32, 0x0c, 0x00, 0x00, 0x34, 0x0c, 0x00, 0x00, 0x35, 0x0c, 0x00, 0x00, 0x32, 0x0c, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, + 0x33, 0x0c, 0x00, 0x00, 0x35, 0x0c, 0x00, 0x00, 0x36, 0x0c, 0x00, 0x00, 0x09, 0x0c, 0x00, 0x00, 0x07, 0x0c, 0x00, 0x00, 0x07, 0x0c, 0x00, 0x00, 0x34, 0x0c, + 0x00, 0x00, 0x36, 0x0c, 0x00, 0x00, 0x37, 0x0c, 0x00, 0x00, 0x34, 0x0c, 0x00, 0x00, 0x32, 0x0c, 0x00, 0x00, 0x32, 0x0c, 0x00, 0x00, 0x35, 0x0c, 0x00, 0x00, + 0x37, 0x0c, 0x00, 0x00, 0x38, 0x0c, 0x00, 0x00, 0x0b, 0x0c, 0x00, 0x00, 0x09, 0x0c, 0x00, 0x00, 0x09, 0x0c, 0x00, 0x00, 0x36, 0x0c, 0x00, 0x00, 0x38, 0x0c, + 0x00, 0x00, 0x39, 0x0c, 0x00, 0x00, 0x36, 0x0c, 0x00, 0x00, 0x34, 0x0c, 0x00, 0x00, 0x34, 0x0c, 0x00, 0x00, 0x37, 0x0c, 0x00, 0x00, 0x39, 0x0c, 0x00, 0x00, + 0x3a, 0x0c, 0x00, 0x00, 0x0d, 0x0c, 0x00, 0x00, 0x0b, 0x0c, 0x00, 0x00, 0x0b, 0x0c, 0x00, 0x00, 0x38, 0x0c, 0x00, 0x00, 0x3a, 0x0c, 0x00, 0x00, 0x3b, 0x0c, + 0x00, 0x00, 0x38, 0x0c, 0x00, 0x00, 0x36, 0x0c, 0x00, 0x00, 0x36, 0x0c, 0x00, 0x00, 0x39, 0x0c, 0x00, 0x00, 0x3b, 0x0c, 0x00, 0x00, 0x3c, 0x0c, 0x00, 0x00, + 0x0f, 0x0c, 0x00, 0x00, 0x0d, 0x0c, 0x00, 0x00, 0x0d, 0x0c, 0x00, 0x00, 0x3a, 0x0c, 0x00, 0x00, 0x3c, 0x0c, 0x00, 0x00, 0x3d, 0x0c, 0x00, 0x00, 0x3a, 0x0c, + 0x00, 0x00, 0x38, 0x0c, 0x00, 0x00, 0x38, 0x0c, 0x00, 0x00, 0x3b, 0x0c, 0x00, 0x00, 0x3d, 0x0c, 0x00, 0x00, 0x3e, 0x0c, 0x00, 0x00, 0x11, 0x0c, 0x00, 0x00, + 0x0f, 0x0c, 0x00, 0x00, 0x0f, 0x0c, 0x00, 0x00, 0x3c, 0x0c, 0x00, 0x00, 0x3e, 0x0c, 0x00, 0x00, 0x3f, 0x0c, 0x00, 0x00, 0x3c, 0x0c, 0x00, 0x00, 0x3a, 0x0c, + 0x00, 0x00, 0x3a, 0x0c, 0x00, 0x00, 0x3d, 0x0c, 0x00, 0x00, 0x3f, 0x0c, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x13, 0x0c, 0x00, 0x00, 0x11, 0x0c, 0x00, 0x00, + 0x11, 0x0c, 0x00, 0x00, 0x3e, 0x0c, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x41, 0x0c, 0x00, 0x00, 0x3e, 0x0c, 0x00, 0x00, 0x3c, 0x0c, 0x00, 0x00, 0x3c, 0x0c, + 0x00, 0x00, 0x3f, 0x0c, 0x00, 0x00, 0x41, 0x0c, 0x00, 0x00, 0x42, 0x0c, 0x00, 0x00, 0x15, 0x0c, 0x00, 0x00, 0x13, 0x0c, 0x00, 0x00, 0x13, 0x0c, 0x00, 0x00, + 0x40, 0x0c, 0x00, 0x00, 0x42, 0x0c, 0x00, 0x00, 0x43, 0x0c, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x3e, 0x0c, 0x00, 0x00, 0x3e, 0x0c, 0x00, 0x00, 0x41, 0x0c, + 0x00, 0x00, 0x43, 0x0c, 0x00, 0x00, 0x44, 0x0c, 0x00, 0x00, 0x17, 0x0c, 0x00, 0x00, 0x15, 0x0c, 0x00, 0x00, 0x15, 0x0c, 0x00, 0x00, 0x42, 0x0c, 0x00, 0x00, + 0x44, 0x0c, 0x00, 0x00, 0x45, 0x0c, 0x00, 0x00, 0x42, 0x0c, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x43, 0x0c, 0x00, 0x00, 0x45, 0x0c, + 0x00, 0x00, 0x46, 0x0c, 0x00, 0x00, 0x19, 0x0c, 0x00, 0x00, 0x17, 0x0c, 0x00, 0x00, 0x17, 0x0c, 0x00, 0x00, 0x44, 0x0c, 0x00, 0x00, 0x46, 0x0c, 0x00, 0x00, + 0x47, 0x0c, 0x00, 0x00, 0x44, 0x0c, 0x00, 0x00, 0x42, 0x0c, 0x00, 0x00, 0x42, 0x0c, 0x00, 0x00, 0x45, 0x0c, 0x00, 0x00, 0x47, 0x0c, 0x00, 0x00, 0x48, 0x0c, + 0x00, 0x00, 0x1b, 0x0c, 0x00, 0x00, 0x19, 0x0c, 0x00, 0x00, 0x19, 0x0c, 0x00, 0x00, 0x46, 0x0c, 0x00, 0x00, 0x48, 0x0c, 0x00, 0x00, 0x49, 0x0c, 0x00, 0x00, + 0x46, 0x0c, 0x00, 0x00, 0x44, 0x0c, 0x00, 0x00, 0x44, 0x0c, 0x00, 0x00, 0x47, 0x0c, 0x00, 0x00, 0x49, 0x0c, 0x00, 0x00, 0x4a, 0x0c, 0x00, 0x00, 0x1d, 0x0c, + 0x00, 0x00, 0x1b, 0x0c, 0x00, 0x00, 0x1b, 0x0c, 0x00, 0x00, 0x48, 0x0c, 0x00, 0x00, 0x4a, 0x0c, 0x00, 0x00, 0x4b, 0x0c, 0x00, 0x00, 0x48, 0x0c, 0x00, 0x00, + 0x46, 0x0c, 0x00, 0x00, 0x46, 0x0c, 0x00, 0x00, 0x49, 0x0c, 0x00, 0x00, 0x4b, 0x0c, 0x00, 0x00, 0x4c, 0x0c, 0x00, 0x00, 0x1f, 0x0c, 0x00, 0x00, 0x1d, 0x0c, + 0x00, 0x00, 0x1d, 0x0c, 0x00, 0x00, 0x4a, 0x0c, 0x00, 0x00, 0x4c, 0x0c, 0x00, 0x00, 0x4d, 0x0c, 0x00, 0x00, 0x4a, 0x0c, 0x00, 0x00, 0x48, 0x0c, 0x00, 0x00, + 0x48, 0x0c, 0x00, 0x00, 0x4b, 0x0c, 0x00, 0x00, 0x4d, 0x0c, 0x00, 0x00, 0x4e, 0x0c, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x1f, 0x0c, 0x00, 0x00, 0x1f, 0x0c, + 0x00, 0x00, 0x4c, 0x0c, 0x00, 0x00, 0x4e, 0x0c, 0x00, 0x00, 0x4f, 0x0c, 0x00, 0x00, 0x4c, 0x0c, 0x00, 0x00, 0x4a, 0x0c, 0x00, 0x00, 0x4a, 0x0c, 0x00, 0x00, + 0x4d, 0x0c, 0x00, 0x00, 0x4f, 0x0c, 0x00, 0x00, 0x50, 0x0c, 0x00, 0x00, 0x22, 0x0c, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x21, 0x0c, 0x00, 0x00, 0x4e, 0x0c, + 0x00, 0x00, 0x50, 0x0c, 0x00, 0x00, 0x51, 0x0c, 0x00, 0x00, 0x4e, 0x0c, 0x00, 0x00, 0x4c, 0x0c, 0x00, 0x00, 0x4c, 0x0c, 0x00, 0x00, 0x4f, 0x0c, 0x00, 0x00, + 0x51, 0x0c, 0x00, 0x00, 0x27, 0x0c, 0x00, 0x00, 0x23, 0x0c, 0x00, 0x00, 0x22, 0x0c, 0x00, 0x00, 0x22, 0x0c, 0x00, 0x00, 0x50, 0x0c, 0x00, 0x00, 0x27, 0x0c, + 0x00, 0x00, 0x52, 0x0c, 0x00, 0x00, 0x50, 0x0c, 0x00, 0x00, 0x4e, 0x0c, 0x00, 0x00, 0x4e, 0x0c, 0x00, 0x00, 0x51, 0x0c, 0x00, 0x00, 0x52, 0x0c, 0x00, 0x00, + 0x53, 0x0c, 0x00, 0x00, 0x27, 0x0c, 0x00, 0x00, 0x50, 0x0c, 0x00, 0x00, 0x50, 0x0c, 0x00, 0x00, 0x52, 0x0c, 0x00, 0x00, 0x53, 0x0c, 0x00, 0x00, 0x29, 0x0c, + 0x00, 0x00, 0x25, 0x0c, 0x00, 0x00, 0x27, 0x0c, 0x00, 0x00, 0x27, 0x0c, 0x00, 0x00, 0x53, 0x0c, 0x00, 0x00, 0x29, 0x0c, 0x00, 0x00, 0x54, 0x0c, 0x00, 0x00, + 0x28, 0x0c, 0x00, 0x00, 0x29, 0x0c, 0x00, 0x00, 0x29, 0x0c, 0x00, 0x00, 0x55, 0x0c, 0x00, 0x00, 0x54, 0x0c, 0x00, 0x00, 0x56, 0x0c, 0x00, 0x00, 0x2b, 0x0c, + 0x00, 0x00, 0x28, 0x0c, 0x00, 0x00, 0x28, 0x0c, 0x00, 0x00, 0x54, 0x0c, 0x00, 0x00, 0x56, 0x0c, 0x00, 0x00, 0x57, 0x0c, 0x00, 0x00, 0x2d, 0x0c, 0x00, 0x00, + 0x2b, 0x0c, 0x00, 0x00, 0x2b, 0x0c, 0x00, 0x00, 0x56, 0x0c, 0x00, 0x00, 0x57, 0x0c, 0x00, 0x00, 0x58, 0x0c, 0x00, 0x00, 0x2f, 0x0c, 0x00, 0x00, 0x2d, 0x0c, + 0x00, 0x00, 0x2d, 0x0c, 0x00, 0x00, 0x57, 0x0c, 0x00, 0x00, 0x58, 0x0c, 0x00, 0x00, 0x59, 0x0c, 0x00, 0x00, 0x31, 0x0c, 0x00, 0x00, 0x2f, 0x0c, 0x00, 0x00, + 0x2f, 0x0c, 0x00, 0x00, 0x58, 0x0c, 0x00, 0x00, 0x59, 0x0c, 0x00, 0x00, 0x5a, 0x0c, 0x00, 0x00, 0x33, 0x0c, 0x00, 0x00, 0x31, 0x0c, 0x00, 0x00, 0x31, 0x0c, + 0x00, 0x00, 0x59, 0x0c, 0x00, 0x00, 0x5a, 0x0c, 0x00, 0x00, 0x5b, 0x0c, 0x00, 0x00, 0x35, 0x0c, 0x00, 0x00, 0x33, 0x0c, 0x00, 0x00, 0x33, 0x0c, 0x00, 0x00, + 0x5a, 0x0c, 0x00, 0x00, 0x5b, 0x0c, 0x00, 0x00, 0x5c, 0x0c, 0x00, 0x00, 0x37, 0x0c, 0x00, 0x00, 0x35, 0x0c, 0x00, 0x00, 0x35, 0x0c, 0x00, 0x00, 0x5b, 0x0c, + 0x00, 0x00, 0x5c, 0x0c, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x39, 0x0c, 0x00, 0x00, 0x37, 0x0c, 0x00, 0x00, 0x37, 0x0c, 0x00, 0x00, 0x5c, 0x0c, 0x00, 0x00, + 0x5d, 0x0c, 0x00, 0x00, 0x5e, 0x0c, 0x00, 0x00, 0x3b, 0x0c, 0x00, 0x00, 0x39, 0x0c, 0x00, 0x00, 0x39, 0x0c, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x5e, 0x0c, + 0x00, 0x00, 0x5f, 0x0c, 0x00, 0x00, 0x3d, 0x0c, 0x00, 0x00, 0x3b, 0x0c, 0x00, 0x00, 0x3b, 0x0c, 0x00, 0x00, 0x5e, 0x0c, 0x00, 0x00, 0x5f, 0x0c, 0x00, 0x00, + 0x60, 0x0c, 0x00, 0x00, 0x3f, 0x0c, 0x00, 0x00, 0x3d, 0x0c, 0x00, 0x00, 0x3d, 0x0c, 0x00, 0x00, 0x5f, 0x0c, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x61, 0x0c, + 0x00, 0x00, 0x41, 0x0c, 0x00, 0x00, 0x3f, 0x0c, 0x00, 0x00, 0x3f, 0x0c, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x61, 0x0c, 0x00, 0x00, 0x62, 0x0c, 0x00, 0x00, + 0x43, 0x0c, 0x00, 0x00, 0x41, 0x0c, 0x00, 0x00, 0x41, 0x0c, 0x00, 0x00, 0x61, 0x0c, 0x00, 0x00, 0x62, 0x0c, 0x00, 0x00, 0x63, 0x0c, 0x00, 0x00, 0x45, 0x0c, + 0x00, 0x00, 0x43, 0x0c, 0x00, 0x00, 0x43, 0x0c, 0x00, 0x00, 0x62, 0x0c, 0x00, 0x00, 0x63, 0x0c, 0x00, 0x00, 0x64, 0x0c, 0x00, 0x00, 0x47, 0x0c, 0x00, 0x00, + 0x45, 0x0c, 0x00, 0x00, 0x45, 0x0c, 0x00, 0x00, 0x63, 0x0c, 0x00, 0x00, 0x64, 0x0c, 0x00, 0x00, 0x65, 0x0c, 0x00, 0x00, 0x49, 0x0c, 0x00, 0x00, 0x47, 0x0c, + 0x00, 0x00, 0x47, 0x0c, 0x00, 0x00, 0x64, 0x0c, 0x00, 0x00, 0x65, 0x0c, 0x00, 0x00, 0x66, 0x0c, 0x00, 0x00, 0x4b, 0x0c, 0x00, 0x00, 0x49, 0x0c, 0x00, 0x00, + 0x49, 0x0c, 0x00, 0x00, 0x65, 0x0c, 0x00, 0x00, 0x66, 0x0c, 0x00, 0x00, 0x67, 0x0c, 0x00, 0x00, 0x4d, 0x0c, 0x00, 0x00, 0x4b, 0x0c, 0x00, 0x00, 0x4b, 0x0c, + 0x00, 0x00, 0x66, 0x0c, 0x00, 0x00, 0x67, 0x0c, 0x00, 0x00, 0x68, 0x0c, 0x00, 0x00, 0x4f, 0x0c, 0x00, 0x00, 0x4d, 0x0c, 0x00, 0x00, 0x4d, 0x0c, 0x00, 0x00, + 0x67, 0x0c, 0x00, 0x00, 0x68, 0x0c, 0x00, 0x00, 0x69, 0x0c, 0x00, 0x00, 0x51, 0x0c, 0x00, 0x00, 0x4f, 0x0c, 0x00, 0x00, 0x4f, 0x0c, 0x00, 0x00, 0x68, 0x0c, + 0x00, 0x00, 0x69, 0x0c, 0x00, 0x00, 0x6a, 0x0c, 0x00, 0x00, 0x52, 0x0c, 0x00, 0x00, 0x51, 0x0c, 0x00, 0x00, 0x51, 0x0c, 0x00, 0x00, 0x69, 0x0c, 0x00, 0x00, + 0x6a, 0x0c, 0x00, 0x00, 0x6b, 0x0c, 0x00, 0x00, 0x53, 0x0c, 0x00, 0x00, 0x52, 0x0c, 0x00, 0x00, 0x52, 0x0c, 0x00, 0x00, 0x6a, 0x0c, 0x00, 0x00, 0x6b, 0x0c, + 0x00, 0x00, 0x55, 0x0c, 0x00, 0x00, 0x29, 0x0c, 0x00, 0x00, 0x53, 0x0c, 0x00, 0x00, 0x53, 0x0c, 0x00, 0x00, 0x6b, 0x0c, 0x00, 0x00, 0x55, 0x0c, 0x00, 0x00, + 0x6c, 0x0c, 0x00, 0x00, 0x54, 0x0c, 0x00, 0x00, 0x55, 0x0c, 0x00, 0x00, 0x55, 0x0c, 0x00, 0x00, 0x6d, 0x0c, 0x00, 0x00, 0x6c, 0x0c, 0x00, 0x00, 0x6e, 0x0c, + 0x00, 0x00, 0x56, 0x0c, 0x00, 0x00, 0x54, 0x0c, 0x00, 0x00, 0x54, 0x0c, 0x00, 0x00, 0x6c, 0x0c, 0x00, 0x00, 0x6e, 0x0c, 0x00, 0x00, 0x6f, 0x0c, 0x00, 0x00, + 0x57, 0x0c, 0x00, 0x00, 0x56, 0x0c, 0x00, 0x00, 0x56, 0x0c, 0x00, 0x00, 0x6e, 0x0c, 0x00, 0x00, 0x6f, 0x0c, 0x00, 0x00, 0x70, 0x0c, 0x00, 0x00, 0x58, 0x0c, + 0x00, 0x00, 0x57, 0x0c, 0x00, 0x00, 0x57, 0x0c, 0x00, 0x00, 0x6f, 0x0c, 0x00, 0x00, 0x70, 0x0c, 0x00, 0x00, 0x71, 0x0c, 0x00, 0x00, 0x59, 0x0c, 0x00, 0x00, + 0x58, 0x0c, 0x00, 0x00, 0x58, 0x0c, 0x00, 0x00, 0x70, 0x0c, 0x00, 0x00, 0x71, 0x0c, 0x00, 0x00, 0x72, 0x0c, 0x00, 0x00, 0x5a, 0x0c, 0x00, 0x00, 0x59, 0x0c, + 0x00, 0x00, 0x59, 0x0c, 0x00, 0x00, 0x71, 0x0c, 0x00, 0x00, 0x72, 0x0c, 0x00, 0x00, 0x73, 0x0c, 0x00, 0x00, 0x5b, 0x0c, 0x00, 0x00, 0x5a, 0x0c, 0x00, 0x00, + 0x5a, 0x0c, 0x00, 0x00, 0x72, 0x0c, 0x00, 0x00, 0x73, 0x0c, 0x00, 0x00, 0x74, 0x0c, 0x00, 0x00, 0x5c, 0x0c, 0x00, 0x00, 0x5b, 0x0c, 0x00, 0x00, 0x5b, 0x0c, + 0x00, 0x00, 0x73, 0x0c, 0x00, 0x00, 0x74, 0x0c, 0x00, 0x00, 0x75, 0x0c, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x5c, 0x0c, 0x00, 0x00, 0x5c, 0x0c, 0x00, 0x00, + 0x74, 0x0c, 0x00, 0x00, 0x75, 0x0c, 0x00, 0x00, 0x76, 0x0c, 0x00, 0x00, 0x5e, 0x0c, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x5d, 0x0c, 0x00, 0x00, 0x75, 0x0c, + 0x00, 0x00, 0x76, 0x0c, 0x00, 0x00, 0x77, 0x0c, 0x00, 0x00, 0x5f, 0x0c, 0x00, 0x00, 0x5e, 0x0c, 0x00, 0x00, 0x5e, 0x0c, 0x00, 0x00, 0x76, 0x0c, 0x00, 0x00, + 0x77, 0x0c, 0x00, 0x00, 0x78, 0x0c, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x5f, 0x0c, 0x00, 0x00, 0x5f, 0x0c, 0x00, 0x00, 0x77, 0x0c, 0x00, 0x00, 0x78, 0x0c, + 0x00, 0x00, 0x79, 0x0c, 0x00, 0x00, 0x61, 0x0c, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x78, 0x0c, 0x00, 0x00, 0x79, 0x0c, 0x00, 0x00, + 0x7a, 0x0c, 0x00, 0x00, 0x62, 0x0c, 0x00, 0x00, 0x61, 0x0c, 0x00, 0x00, 0x61, 0x0c, 0x00, 0x00, 0x79, 0x0c, 0x00, 0x00, 0x7a, 0x0c, 0x00, 0x00, 0x7b, 0x0c, + 0x00, 0x00, 0x63, 0x0c, 0x00, 0x00, 0x62, 0x0c, 0x00, 0x00, 0x62, 0x0c, 0x00, 0x00, 0x7a, 0x0c, 0x00, 0x00, 0x7b, 0x0c, 0x00, 0x00, 0x7c, 0x0c, 0x00, 0x00, + 0x64, 0x0c, 0x00, 0x00, 0x63, 0x0c, 0x00, 0x00, 0x63, 0x0c, 0x00, 0x00, 0x7b, 0x0c, 0x00, 0x00, 0x7c, 0x0c, 0x00, 0x00, 0x7d, 0x0c, 0x00, 0x00, 0x65, 0x0c, + 0x00, 0x00, 0x64, 0x0c, 0x00, 0x00, 0x64, 0x0c, 0x00, 0x00, 0x7c, 0x0c, 0x00, 0x00, 0x7d, 0x0c, 0x00, 0x00, 0x7e, 0x0c, 0x00, 0x00, 0x66, 0x0c, 0x00, 0x00, + 0x65, 0x0c, 0x00, 0x00, 0x65, 0x0c, 0x00, 0x00, 0x7d, 0x0c, 0x00, 0x00, 0x7e, 0x0c, 0x00, 0x00, 0x7f, 0x0c, 0x00, 0x00, 0x67, 0x0c, 0x00, 0x00, 0x66, 0x0c, + 0x00, 0x00, 0x66, 0x0c, 0x00, 0x00, 0x7e, 0x0c, 0x00, 0x00, 0x7f, 0x0c, 0x00, 0x00, 0x80, 0x0c, 0x00, 0x00, 0x68, 0x0c, 0x00, 0x00, 0x67, 0x0c, 0x00, 0x00, + 0x67, 0x0c, 0x00, 0x00, 0x7f, 0x0c, 0x00, 0x00, 0x80, 0x0c, 0x00, 0x00, 0x81, 0x0c, 0x00, 0x00, 0x69, 0x0c, 0x00, 0x00, 0x68, 0x0c, 0x00, 0x00, 0x68, 0x0c, + 0x00, 0x00, 0x80, 0x0c, 0x00, 0x00, 0x81, 0x0c, 0x00, 0x00, 0x82, 0x0c, 0x00, 0x00, 0x6a, 0x0c, 0x00, 0x00, 0x69, 0x0c, 0x00, 0x00, 0x69, 0x0c, 0x00, 0x00, + 0x81, 0x0c, 0x00, 0x00, 0x82, 0x0c, 0x00, 0x00, 0x83, 0x0c, 0x00, 0x00, 0x6b, 0x0c, 0x00, 0x00, 0x6a, 0x0c, 0x00, 0x00, 0x6a, 0x0c, 0x00, 0x00, 0x82, 0x0c, + 0x00, 0x00, 0x83, 0x0c, 0x00, 0x00, 0x6d, 0x0c, 0x00, 0x00, 0x55, 0x0c, 0x00, 0x00, 0x6b, 0x0c, 0x00, 0x00, 0x6b, 0x0c, 0x00, 0x00, 0x83, 0x0c, 0x00, 0x00, + 0x6d, 0x0c, 0x00, 0x00, 0x84, 0x0c, 0x00, 0x00, 0x6c, 0x0c, 0x00, 0x00, 0x6d, 0x0c, 0x00, 0x00, 0x6d, 0x0c, 0x00, 0x00, 0x85, 0x0c, 0x00, 0x00, 0x84, 0x0c, + 0x00, 0x00, 0x86, 0x0c, 0x00, 0x00, 0x6e, 0x0c, 0x00, 0x00, 0x6c, 0x0c, 0x00, 0x00, 0x6c, 0x0c, 0x00, 0x00, 0x84, 0x0c, 0x00, 0x00, 0x86, 0x0c, 0x00, 0x00, + 0x87, 0x0c, 0x00, 0x00, 0x6f, 0x0c, 0x00, 0x00, 0x6e, 0x0c, 0x00, 0x00, 0x6e, 0x0c, 0x00, 0x00, 0x86, 0x0c, 0x00, 0x00, 0x87, 0x0c, 0x00, 0x00, 0x88, 0x0c, + 0x00, 0x00, 0x70, 0x0c, 0x00, 0x00, 0x6f, 0x0c, 0x00, 0x00, 0x6f, 0x0c, 0x00, 0x00, 0x87, 0x0c, 0x00, 0x00, 0x88, 0x0c, 0x00, 0x00, 0x89, 0x0c, 0x00, 0x00, + 0x71, 0x0c, 0x00, 0x00, 0x70, 0x0c, 0x00, 0x00, 0x70, 0x0c, 0x00, 0x00, 0x88, 0x0c, 0x00, 0x00, 0x89, 0x0c, 0x00, 0x00, 0x8a, 0x0c, 0x00, 0x00, 0x72, 0x0c, + 0x00, 0x00, 0x71, 0x0c, 0x00, 0x00, 0x71, 0x0c, 0x00, 0x00, 0x89, 0x0c, 0x00, 0x00, 0x8a, 0x0c, 0x00, 0x00, 0x8b, 0x0c, 0x00, 0x00, 0x73, 0x0c, 0x00, 0x00, + 0x72, 0x0c, 0x00, 0x00, 0x72, 0x0c, 0x00, 0x00, 0x8a, 0x0c, 0x00, 0x00, 0x8b, 0x0c, 0x00, 0x00, 0x8c, 0x0c, 0x00, 0x00, 0x74, 0x0c, 0x00, 0x00, 0x73, 0x0c, + 0x00, 0x00, 0x73, 0x0c, 0x00, 0x00, 0x8b, 0x0c, 0x00, 0x00, 0x8c, 0x0c, 0x00, 0x00, 0x8d, 0x0c, 0x00, 0x00, 0x75, 0x0c, 0x00, 0x00, 0x74, 0x0c, 0x00, 0x00, + 0x74, 0x0c, 0x00, 0x00, 0x8c, 0x0c, 0x00, 0x00, 0x8d, 0x0c, 0x00, 0x00, 0x8e, 0x0c, 0x00, 0x00, 0x76, 0x0c, 0x00, 0x00, 0x75, 0x0c, 0x00, 0x00, 0x75, 0x0c, + 0x00, 0x00, 0x8d, 0x0c, 0x00, 0x00, 0x8e, 0x0c, 0x00, 0x00, 0x8f, 0x0c, 0x00, 0x00, 0x77, 0x0c, 0x00, 0x00, 0x76, 0x0c, 0x00, 0x00, 0x76, 0x0c, 0x00, 0x00, + 0x8e, 0x0c, 0x00, 0x00, 0x8f, 0x0c, 0x00, 0x00, 0x90, 0x0c, 0x00, 0x00, 0x78, 0x0c, 0x00, 0x00, 0x77, 0x0c, 0x00, 0x00, 0x77, 0x0c, 0x00, 0x00, 0x8f, 0x0c, + 0x00, 0x00, 0x90, 0x0c, 0x00, 0x00, 0x91, 0x0c, 0x00, 0x00, 0x79, 0x0c, 0x00, 0x00, 0x78, 0x0c, 0x00, 0x00, 0x78, 0x0c, 0x00, 0x00, 0x90, 0x0c, 0x00, 0x00, + 0x91, 0x0c, 0x00, 0x00, 0x92, 0x0c, 0x00, 0x00, 0x7a, 0x0c, 0x00, 0x00, 0x79, 0x0c, 0x00, 0x00, 0x79, 0x0c, 0x00, 0x00, 0x91, 0x0c, 0x00, 0x00, 0x92, 0x0c, + 0x00, 0x00, 0x93, 0x0c, 0x00, 0x00, 0x7b, 0x0c, 0x00, 0x00, 0x7a, 0x0c, 0x00, 0x00, 0x7a, 0x0c, 0x00, 0x00, 0x92, 0x0c, 0x00, 0x00, 0x93, 0x0c, 0x00, 0x00, + 0x94, 0x0c, 0x00, 0x00, 0x7c, 0x0c, 0x00, 0x00, 0x7b, 0x0c, 0x00, 0x00, 0x7b, 0x0c, 0x00, 0x00, 0x93, 0x0c, 0x00, 0x00, 0x94, 0x0c, 0x00, 0x00, 0x95, 0x0c, + 0x00, 0x00, 0x7d, 0x0c, 0x00, 0x00, 0x7c, 0x0c, 0x00, 0x00, 0x7c, 0x0c, 0x00, 0x00, 0x94, 0x0c, 0x00, 0x00, 0x95, 0x0c, 0x00, 0x00, 0x96, 0x0c, 0x00, 0x00, + 0x7e, 0x0c, 0x00, 0x00, 0x7d, 0x0c, 0x00, 0x00, 0x7d, 0x0c, 0x00, 0x00, 0x95, 0x0c, 0x00, 0x00, 0x96, 0x0c, 0x00, 0x00, 0x97, 0x0c, 0x00, 0x00, 0x7f, 0x0c, + 0x00, 0x00, 0x7e, 0x0c, 0x00, 0x00, 0x7e, 0x0c, 0x00, 0x00, 0x96, 0x0c, 0x00, 0x00, 0x97, 0x0c, 0x00, 0x00, 0x98, 0x0c, 0x00, 0x00, 0x80, 0x0c, 0x00, 0x00, + 0x7f, 0x0c, 0x00, 0x00, 0x7f, 0x0c, 0x00, 0x00, 0x97, 0x0c, 0x00, 0x00, 0x98, 0x0c, 0x00, 0x00, 0x99, 0x0c, 0x00, 0x00, 0x81, 0x0c, 0x00, 0x00, 0x80, 0x0c, + 0x00, 0x00, 0x80, 0x0c, 0x00, 0x00, 0x98, 0x0c, 0x00, 0x00, 0x99, 0x0c, 0x00, 0x00, 0x9a, 0x0c, 0x00, 0x00, 0x82, 0x0c, 0x00, 0x00, 0x81, 0x0c, 0x00, 0x00, + 0x81, 0x0c, 0x00, 0x00, 0x99, 0x0c, 0x00, 0x00, 0x9a, 0x0c, 0x00, 0x00, 0x9b, 0x0c, 0x00, 0x00, 0x83, 0x0c, 0x00, 0x00, 0x82, 0x0c, 0x00, 0x00, 0x82, 0x0c, + 0x00, 0x00, 0x9a, 0x0c, 0x00, 0x00, 0x9b, 0x0c, 0x00, 0x00, 0x85, 0x0c, 0x00, 0x00, 0x6d, 0x0c, 0x00, 0x00, 0x83, 0x0c, 0x00, 0x00, 0x83, 0x0c, 0x00, 0x00, + 0x9b, 0x0c, 0x00, 0x00, 0x85, 0x0c, 0x00, 0x00, 0x9c, 0x0c, 0x00, 0x00, 0x84, 0x0c, 0x00, 0x00, 0x85, 0x0c, 0x00, 0x00, 0x85, 0x0c, 0x00, 0x00, 0x9d, 0x0c, + 0x00, 0x00, 0x9c, 0x0c, 0x00, 0x00, 0x9e, 0x0c, 0x00, 0x00, 0x86, 0x0c, 0x00, 0x00, 0x84, 0x0c, 0x00, 0x00, 0x84, 0x0c, 0x00, 0x00, 0x9c, 0x0c, 0x00, 0x00, + 0x9e, 0x0c, 0x00, 0x00, 0x9f, 0x0c, 0x00, 0x00, 0x87, 0x0c, 0x00, 0x00, 0x86, 0x0c, 0x00, 0x00, 0x86, 0x0c, 0x00, 0x00, 0x9e, 0x0c, 0x00, 0x00, 0x9f, 0x0c, + 0x00, 0x00, 0xa0, 0x0c, 0x00, 0x00, 0x88, 0x0c, 0x00, 0x00, 0x87, 0x0c, 0x00, 0x00, 0x87, 0x0c, 0x00, 0x00, 0x9f, 0x0c, 0x00, 0x00, 0xa0, 0x0c, 0x00, 0x00, + 0xa1, 0x0c, 0x00, 0x00, 0x89, 0x0c, 0x00, 0x00, 0x88, 0x0c, 0x00, 0x00, 0x88, 0x0c, 0x00, 0x00, 0xa0, 0x0c, 0x00, 0x00, 0xa1, 0x0c, 0x00, 0x00, 0xa2, 0x0c, + 0x00, 0x00, 0x8a, 0x0c, 0x00, 0x00, 0x89, 0x0c, 0x00, 0x00, 0x89, 0x0c, 0x00, 0x00, 0xa1, 0x0c, 0x00, 0x00, 0xa2, 0x0c, 0x00, 0x00, 0xa3, 0x0c, 0x00, 0x00, + 0x8b, 0x0c, 0x00, 0x00, 0x8a, 0x0c, 0x00, 0x00, 0x8a, 0x0c, 0x00, 0x00, 0xa2, 0x0c, 0x00, 0x00, 0xa3, 0x0c, 0x00, 0x00, 0xa4, 0x0c, 0x00, 0x00, 0x8c, 0x0c, + 0x00, 0x00, 0x8b, 0x0c, 0x00, 0x00, 0x8b, 0x0c, 0x00, 0x00, 0xa3, 0x0c, 0x00, 0x00, 0xa4, 0x0c, 0x00, 0x00, 0xa5, 0x0c, 0x00, 0x00, 0x8d, 0x0c, 0x00, 0x00, + 0x8c, 0x0c, 0x00, 0x00, 0x8c, 0x0c, 0x00, 0x00, 0xa4, 0x0c, 0x00, 0x00, 0xa5, 0x0c, 0x00, 0x00, 0xa6, 0x0c, 0x00, 0x00, 0x8e, 0x0c, 0x00, 0x00, 0x8d, 0x0c, + 0x00, 0x00, 0x8d, 0x0c, 0x00, 0x00, 0xa5, 0x0c, 0x00, 0x00, 0xa6, 0x0c, 0x00, 0x00, 0xa7, 0x0c, 0x00, 0x00, 0x8f, 0x0c, 0x00, 0x00, 0x8e, 0x0c, 0x00, 0x00, + 0x8e, 0x0c, 0x00, 0x00, 0xa6, 0x0c, 0x00, 0x00, 0xa7, 0x0c, 0x00, 0x00, 0xa8, 0x0c, 0x00, 0x00, 0x90, 0x0c, 0x00, 0x00, 0x8f, 0x0c, 0x00, 0x00, 0x8f, 0x0c, + 0x00, 0x00, 0xa7, 0x0c, 0x00, 0x00, 0xa8, 0x0c, 0x00, 0x00, 0xa9, 0x0c, 0x00, 0x00, 0x91, 0x0c, 0x00, 0x00, 0x90, 0x0c, 0x00, 0x00, 0x90, 0x0c, 0x00, 0x00, + 0xa8, 0x0c, 0x00, 0x00, 0xa9, 0x0c, 0x00, 0x00, 0xaa, 0x0c, 0x00, 0x00, 0x92, 0x0c, 0x00, 0x00, 0x91, 0x0c, 0x00, 0x00, 0x91, 0x0c, 0x00, 0x00, 0xa9, 0x0c, + 0x00, 0x00, 0xaa, 0x0c, 0x00, 0x00, 0xab, 0x0c, 0x00, 0x00, 0x93, 0x0c, 0x00, 0x00, 0x92, 0x0c, 0x00, 0x00, 0x92, 0x0c, 0x00, 0x00, 0xaa, 0x0c, 0x00, 0x00, + 0xab, 0x0c, 0x00, 0x00, 0xac, 0x0c, 0x00, 0x00, 0x94, 0x0c, 0x00, 0x00, 0x93, 0x0c, 0x00, 0x00, 0x93, 0x0c, 0x00, 0x00, 0xab, 0x0c, 0x00, 0x00, 0xac, 0x0c, + 0x00, 0x00, 0xad, 0x0c, 0x00, 0x00, 0x95, 0x0c, 0x00, 0x00, 0x94, 0x0c, 0x00, 0x00, 0x94, 0x0c, 0x00, 0x00, 0xac, 0x0c, 0x00, 0x00, 0xad, 0x0c, 0x00, 0x00, + 0xae, 0x0c, 0x00, 0x00, 0x96, 0x0c, 0x00, 0x00, 0x95, 0x0c, 0x00, 0x00, 0x95, 0x0c, 0x00, 0x00, 0xad, 0x0c, 0x00, 0x00, 0xae, 0x0c, 0x00, 0x00, 0xaf, 0x0c, + 0x00, 0x00, 0x97, 0x0c, 0x00, 0x00, 0x96, 0x0c, 0x00, 0x00, 0x96, 0x0c, 0x00, 0x00, 0xae, 0x0c, 0x00, 0x00, 0xaf, 0x0c, 0x00, 0x00, 0xb0, 0x0c, 0x00, 0x00, + 0x98, 0x0c, 0x00, 0x00, 0x97, 0x0c, 0x00, 0x00, 0x97, 0x0c, 0x00, 0x00, 0xaf, 0x0c, 0x00, 0x00, 0xb0, 0x0c, 0x00, 0x00, 0xb1, 0x0c, 0x00, 0x00, 0x99, 0x0c, + 0x00, 0x00, 0x98, 0x0c, 0x00, 0x00, 0x98, 0x0c, 0x00, 0x00, 0xb0, 0x0c, 0x00, 0x00, 0xb1, 0x0c, 0x00, 0x00, 0xb2, 0x0c, 0x00, 0x00, 0x9a, 0x0c, 0x00, 0x00, + 0x99, 0x0c, 0x00, 0x00, 0x99, 0x0c, 0x00, 0x00, 0xb1, 0x0c, 0x00, 0x00, 0xb2, 0x0c, 0x00, 0x00, 0xb3, 0x0c, 0x00, 0x00, 0x9b, 0x0c, 0x00, 0x00, 0x9a, 0x0c, + 0x00, 0x00, 0x9a, 0x0c, 0x00, 0x00, 0xb2, 0x0c, 0x00, 0x00, 0xb3, 0x0c, 0x00, 0x00, 0x9d, 0x0c, 0x00, 0x00, 0x85, 0x0c, 0x00, 0x00, 0x9b, 0x0c, 0x00, 0x00, + 0x9b, 0x0c, 0x00, 0x00, 0xb3, 0x0c, 0x00, 0x00, 0x9d, 0x0c, 0x00, 0x00, 0xb4, 0x0c, 0x00, 0x00, 0x9c, 0x0c, 0x00, 0x00, 0x9d, 0x0c, 0x00, 0x00, 0x9d, 0x0c, + 0x00, 0x00, 0xb5, 0x0c, 0x00, 0x00, 0xb4, 0x0c, 0x00, 0x00, 0xb6, 0x0c, 0x00, 0x00, 0x9e, 0x0c, 0x00, 0x00, 0x9c, 0x0c, 0x00, 0x00, 0x9c, 0x0c, 0x00, 0x00, + 0xb4, 0x0c, 0x00, 0x00, 0xb6, 0x0c, 0x00, 0x00, 0xb7, 0x0c, 0x00, 0x00, 0x9f, 0x0c, 0x00, 0x00, 0x9e, 0x0c, 0x00, 0x00, 0x9e, 0x0c, 0x00, 0x00, 0xb6, 0x0c, + 0x00, 0x00, 0xb7, 0x0c, 0x00, 0x00, 0xb8, 0x0c, 0x00, 0x00, 0xa0, 0x0c, 0x00, 0x00, 0x9f, 0x0c, 0x00, 0x00, 0x9f, 0x0c, 0x00, 0x00, 0xb7, 0x0c, 0x00, 0x00, + 0xb8, 0x0c, 0x00, 0x00, 0xb9, 0x0c, 0x00, 0x00, 0xa1, 0x0c, 0x00, 0x00, 0xa0, 0x0c, 0x00, 0x00, 0xa0, 0x0c, 0x00, 0x00, 0xb8, 0x0c, 0x00, 0x00, 0xb9, 0x0c, + 0x00, 0x00, 0xba, 0x0c, 0x00, 0x00, 0xa2, 0x0c, 0x00, 0x00, 0xa1, 0x0c, 0x00, 0x00, 0xa1, 0x0c, 0x00, 0x00, 0xb9, 0x0c, 0x00, 0x00, 0xba, 0x0c, 0x00, 0x00, + 0xbb, 0x0c, 0x00, 0x00, 0xa3, 0x0c, 0x00, 0x00, 0xa2, 0x0c, 0x00, 0x00, 0xa2, 0x0c, 0x00, 0x00, 0xba, 0x0c, 0x00, 0x00, 0xbb, 0x0c, 0x00, 0x00, 0xbc, 0x0c, + 0x00, 0x00, 0xa4, 0x0c, 0x00, 0x00, 0xa3, 0x0c, 0x00, 0x00, 0xa3, 0x0c, 0x00, 0x00, 0xbb, 0x0c, 0x00, 0x00, 0xbc, 0x0c, 0x00, 0x00, 0xbd, 0x0c, 0x00, 0x00, + 0xa5, 0x0c, 0x00, 0x00, 0xa4, 0x0c, 0x00, 0x00, 0xa4, 0x0c, 0x00, 0x00, 0xbc, 0x0c, 0x00, 0x00, 0xbd, 0x0c, 0x00, 0x00, 0xbe, 0x0c, 0x00, 0x00, 0xa6, 0x0c, + 0x00, 0x00, 0xa5, 0x0c, 0x00, 0x00, 0xa5, 0x0c, 0x00, 0x00, 0xbd, 0x0c, 0x00, 0x00, 0xbe, 0x0c, 0x00, 0x00, 0xbf, 0x0c, 0x00, 0x00, 0xa7, 0x0c, 0x00, 0x00, + 0xa6, 0x0c, 0x00, 0x00, 0xa6, 0x0c, 0x00, 0x00, 0xbe, 0x0c, 0x00, 0x00, 0xbf, 0x0c, 0x00, 0x00, 0xc0, 0x0c, 0x00, 0x00, 0xa8, 0x0c, 0x00, 0x00, 0xa7, 0x0c, + 0x00, 0x00, 0xa7, 0x0c, 0x00, 0x00, 0xbf, 0x0c, 0x00, 0x00, 0xc0, 0x0c, 0x00, 0x00, 0xc1, 0x0c, 0x00, 0x00, 0xa9, 0x0c, 0x00, 0x00, 0xa8, 0x0c, 0x00, 0x00, + 0xa8, 0x0c, 0x00, 0x00, 0xc0, 0x0c, 0x00, 0x00, 0xc1, 0x0c, 0x00, 0x00, 0xc2, 0x0c, 0x00, 0x00, 0xaa, 0x0c, 0x00, 0x00, 0xa9, 0x0c, 0x00, 0x00, 0xa9, 0x0c, + 0x00, 0x00, 0xc1, 0x0c, 0x00, 0x00, 0xc2, 0x0c, 0x00, 0x00, 0xc3, 0x0c, 0x00, 0x00, 0xab, 0x0c, 0x00, 0x00, 0xaa, 0x0c, 0x00, 0x00, 0xaa, 0x0c, 0x00, 0x00, + 0xc2, 0x0c, 0x00, 0x00, 0xc3, 0x0c, 0x00, 0x00, 0xc4, 0x0c, 0x00, 0x00, 0xac, 0x0c, 0x00, 0x00, 0xab, 0x0c, 0x00, 0x00, 0xab, 0x0c, 0x00, 0x00, 0xc3, 0x0c, + 0x00, 0x00, 0xc4, 0x0c, 0x00, 0x00, 0xc5, 0x0c, 0x00, 0x00, 0xad, 0x0c, 0x00, 0x00, 0xac, 0x0c, 0x00, 0x00, 0xac, 0x0c, 0x00, 0x00, 0xc4, 0x0c, 0x00, 0x00, + 0xc5, 0x0c, 0x00, 0x00, 0xc6, 0x0c, 0x00, 0x00, 0xae, 0x0c, 0x00, 0x00, 0xad, 0x0c, 0x00, 0x00, 0xad, 0x0c, 0x00, 0x00, 0xc5, 0x0c, 0x00, 0x00, 0xc6, 0x0c, + 0x00, 0x00, 0xc7, 0x0c, 0x00, 0x00, 0xaf, 0x0c, 0x00, 0x00, 0xae, 0x0c, 0x00, 0x00, 0xae, 0x0c, 0x00, 0x00, 0xc6, 0x0c, 0x00, 0x00, 0xc7, 0x0c, 0x00, 0x00, + 0xc8, 0x0c, 0x00, 0x00, 0xb0, 0x0c, 0x00, 0x00, 0xaf, 0x0c, 0x00, 0x00, 0xaf, 0x0c, 0x00, 0x00, 0xc7, 0x0c, 0x00, 0x00, 0xc8, 0x0c, 0x00, 0x00, 0xc9, 0x0c, + 0x00, 0x00, 0xb1, 0x0c, 0x00, 0x00, 0xb0, 0x0c, 0x00, 0x00, 0xb0, 0x0c, 0x00, 0x00, 0xc8, 0x0c, 0x00, 0x00, 0xc9, 0x0c, 0x00, 0x00, 0xca, 0x0c, 0x00, 0x00, + 0xb2, 0x0c, 0x00, 0x00, 0xb1, 0x0c, 0x00, 0x00, 0xb1, 0x0c, 0x00, 0x00, 0xc9, 0x0c, 0x00, 0x00, 0xca, 0x0c, 0x00, 0x00, 0xcb, 0x0c, 0x00, 0x00, 0xb3, 0x0c, + 0x00, 0x00, 0xb2, 0x0c, 0x00, 0x00, 0xb2, 0x0c, 0x00, 0x00, 0xca, 0x0c, 0x00, 0x00, 0xcb, 0x0c, 0x00, 0x00, 0xb5, 0x0c, 0x00, 0x00, 0x9d, 0x0c, 0x00, 0x00, + 0xb3, 0x0c, 0x00, 0x00, 0xb3, 0x0c, 0x00, 0x00, 0xcb, 0x0c, 0x00, 0x00, 0xb5, 0x0c, 0x00, 0x00, 0xcc, 0x0c, 0x00, 0x00, 0xb4, 0x0c, 0x00, 0x00, 0xb5, 0x0c, + 0x00, 0x00, 0xb5, 0x0c, 0x00, 0x00, 0xcd, 0x0c, 0x00, 0x00, 0xcc, 0x0c, 0x00, 0x00, 0xce, 0x0c, 0x00, 0x00, 0xb6, 0x0c, 0x00, 0x00, 0xb4, 0x0c, 0x00, 0x00, + 0xb4, 0x0c, 0x00, 0x00, 0xcc, 0x0c, 0x00, 0x00, 0xce, 0x0c, 0x00, 0x00, 0xcf, 0x0c, 0x00, 0x00, 0xb7, 0x0c, 0x00, 0x00, 0xb6, 0x0c, 0x00, 0x00, 0xb6, 0x0c, + 0x00, 0x00, 0xce, 0x0c, 0x00, 0x00, 0xcf, 0x0c, 0x00, 0x00, 0xd0, 0x0c, 0x00, 0x00, 0xb8, 0x0c, 0x00, 0x00, 0xb7, 0x0c, 0x00, 0x00, 0xb7, 0x0c, 0x00, 0x00, + 0xcf, 0x0c, 0x00, 0x00, 0xd0, 0x0c, 0x00, 0x00, 0xd1, 0x0c, 0x00, 0x00, 0xb9, 0x0c, 0x00, 0x00, 0xb8, 0x0c, 0x00, 0x00, 0xb8, 0x0c, 0x00, 0x00, 0xd0, 0x0c, + 0x00, 0x00, 0xd1, 0x0c, 0x00, 0x00, 0xd2, 0x0c, 0x00, 0x00, 0xba, 0x0c, 0x00, 0x00, 0xb9, 0x0c, 0x00, 0x00, 0xb9, 0x0c, 0x00, 0x00, 0xd1, 0x0c, 0x00, 0x00, + 0xd2, 0x0c, 0x00, 0x00, 0xd3, 0x0c, 0x00, 0x00, 0xbb, 0x0c, 0x00, 0x00, 0xba, 0x0c, 0x00, 0x00, 0xba, 0x0c, 0x00, 0x00, 0xd2, 0x0c, 0x00, 0x00, 0xd3, 0x0c, + 0x00, 0x00, 0xd4, 0x0c, 0x00, 0x00, 0xbc, 0x0c, 0x00, 0x00, 0xbb, 0x0c, 0x00, 0x00, 0xbb, 0x0c, 0x00, 0x00, 0xd3, 0x0c, 0x00, 0x00, 0xd4, 0x0c, 0x00, 0x00, + 0xd5, 0x0c, 0x00, 0x00, 0xbd, 0x0c, 0x00, 0x00, 0xbc, 0x0c, 0x00, 0x00, 0xbc, 0x0c, 0x00, 0x00, 0xd4, 0x0c, 0x00, 0x00, 0xd5, 0x0c, 0x00, 0x00, 0xd6, 0x0c, + 0x00, 0x00, 0xbe, 0x0c, 0x00, 0x00, 0xbd, 0x0c, 0x00, 0x00, 0xbd, 0x0c, 0x00, 0x00, 0xd5, 0x0c, 0x00, 0x00, 0xd6, 0x0c, 0x00, 0x00, 0xd7, 0x0c, 0x00, 0x00, + 0xbf, 0x0c, 0x00, 0x00, 0xbe, 0x0c, 0x00, 0x00, 0xbe, 0x0c, 0x00, 0x00, 0xd6, 0x0c, 0x00, 0x00, 0xd7, 0x0c, 0x00, 0x00, 0xd8, 0x0c, 0x00, 0x00, 0xc0, 0x0c, + 0x00, 0x00, 0xbf, 0x0c, 0x00, 0x00, 0xbf, 0x0c, 0x00, 0x00, 0xd7, 0x0c, 0x00, 0x00, 0xd8, 0x0c, 0x00, 0x00, 0xd9, 0x0c, 0x00, 0x00, 0xc1, 0x0c, 0x00, 0x00, + 0xc0, 0x0c, 0x00, 0x00, 0xc0, 0x0c, 0x00, 0x00, 0xd8, 0x0c, 0x00, 0x00, 0xd9, 0x0c, 0x00, 0x00, 0xda, 0x0c, 0x00, 0x00, 0xc2, 0x0c, 0x00, 0x00, 0xc1, 0x0c, + 0x00, 0x00, 0xc1, 0x0c, 0x00, 0x00, 0xd9, 0x0c, 0x00, 0x00, 0xda, 0x0c, 0x00, 0x00, 0xdb, 0x0c, 0x00, 0x00, 0xc3, 0x0c, 0x00, 0x00, 0xc2, 0x0c, 0x00, 0x00, + 0xc2, 0x0c, 0x00, 0x00, 0xda, 0x0c, 0x00, 0x00, 0xdb, 0x0c, 0x00, 0x00, 0xdc, 0x0c, 0x00, 0x00, 0xc4, 0x0c, 0x00, 0x00, 0xc3, 0x0c, 0x00, 0x00, 0xc3, 0x0c, + 0x00, 0x00, 0xdb, 0x0c, 0x00, 0x00, 0xdc, 0x0c, 0x00, 0x00, 0xdd, 0x0c, 0x00, 0x00, 0xc5, 0x0c, 0x00, 0x00, 0xc4, 0x0c, 0x00, 0x00, 0xc4, 0x0c, 0x00, 0x00, + 0xdc, 0x0c, 0x00, 0x00, 0xdd, 0x0c, 0x00, 0x00, 0xde, 0x0c, 0x00, 0x00, 0xc6, 0x0c, 0x00, 0x00, 0xc5, 0x0c, 0x00, 0x00, 0xc5, 0x0c, 0x00, 0x00, 0xdd, 0x0c, + 0x00, 0x00, 0xde, 0x0c, 0x00, 0x00, 0xdf, 0x0c, 0x00, 0x00, 0xc7, 0x0c, 0x00, 0x00, 0xc6, 0x0c, 0x00, 0x00, 0xc6, 0x0c, 0x00, 0x00, 0xde, 0x0c, 0x00, 0x00, + 0xdf, 0x0c, 0x00, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0xc8, 0x0c, 0x00, 0x00, 0xc7, 0x0c, 0x00, 0x00, 0xc7, 0x0c, 0x00, 0x00, 0xdf, 0x0c, 0x00, 0x00, 0xe0, 0x0c, + 0x00, 0x00, 0xe1, 0x0c, 0x00, 0x00, 0xc9, 0x0c, 0x00, 0x00, 0xc8, 0x0c, 0x00, 0x00, 0xc8, 0x0c, 0x00, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0xe1, 0x0c, 0x00, 0x00, + 0xe2, 0x0c, 0x00, 0x00, 0xca, 0x0c, 0x00, 0x00, 0xc9, 0x0c, 0x00, 0x00, 0xc9, 0x0c, 0x00, 0x00, 0xe1, 0x0c, 0x00, 0x00, 0xe2, 0x0c, 0x00, 0x00, 0xe3, 0x0c, + 0x00, 0x00, 0xcb, 0x0c, 0x00, 0x00, 0xca, 0x0c, 0x00, 0x00, 0xca, 0x0c, 0x00, 0x00, 0xe2, 0x0c, 0x00, 0x00, 0xe3, 0x0c, 0x00, 0x00, 0xcd, 0x0c, 0x00, 0x00, + 0xb5, 0x0c, 0x00, 0x00, 0xcb, 0x0c, 0x00, 0x00, 0xcb, 0x0c, 0x00, 0x00, 0xe3, 0x0c, 0x00, 0x00, 0xcd, 0x0c, 0x00, 0x00, 0xc4, 0x0b, 0x00, 0x00, 0xcc, 0x0c, + 0x00, 0x00, 0xcd, 0x0c, 0x00, 0x00, 0xcd, 0x0c, 0x00, 0x00, 0xc5, 0x0b, 0x00, 0x00, 0xc4, 0x0b, 0x00, 0x00, 0xc6, 0x0b, 0x00, 0x00, 0xce, 0x0c, 0x00, 0x00, + 0xcc, 0x0c, 0x00, 0x00, 0xcc, 0x0c, 0x00, 0x00, 0xc4, 0x0b, 0x00, 0x00, 0xc6, 0x0b, 0x00, 0x00, 0xc7, 0x0b, 0x00, 0x00, 0xcf, 0x0c, 0x00, 0x00, 0xce, 0x0c, + 0x00, 0x00, 0xce, 0x0c, 0x00, 0x00, 0xc6, 0x0b, 0x00, 0x00, 0xc7, 0x0b, 0x00, 0x00, 0xc8, 0x0b, 0x00, 0x00, 0xd0, 0x0c, 0x00, 0x00, 0xcf, 0x0c, 0x00, 0x00, + 0xcf, 0x0c, 0x00, 0x00, 0xc7, 0x0b, 0x00, 0x00, 0xc8, 0x0b, 0x00, 0x00, 0xc9, 0x0b, 0x00, 0x00, 0xd1, 0x0c, 0x00, 0x00, 0xd0, 0x0c, 0x00, 0x00, 0xd0, 0x0c, + 0x00, 0x00, 0xc8, 0x0b, 0x00, 0x00, 0xc9, 0x0b, 0x00, 0x00, 0xca, 0x0b, 0x00, 0x00, 0xd2, 0x0c, 0x00, 0x00, 0xd1, 0x0c, 0x00, 0x00, 0xd1, 0x0c, 0x00, 0x00, + 0xc9, 0x0b, 0x00, 0x00, 0xca, 0x0b, 0x00, 0x00, 0xcb, 0x0b, 0x00, 0x00, 0xd3, 0x0c, 0x00, 0x00, 0xd2, 0x0c, 0x00, 0x00, 0xd2, 0x0c, 0x00, 0x00, 0xca, 0x0b, + 0x00, 0x00, 0xcb, 0x0b, 0x00, 0x00, 0xcc, 0x0b, 0x00, 0x00, 0xd4, 0x0c, 0x00, 0x00, 0xd3, 0x0c, 0x00, 0x00, 0xd3, 0x0c, 0x00, 0x00, 0xcb, 0x0b, 0x00, 0x00, + 0xcc, 0x0b, 0x00, 0x00, 0xcd, 0x0b, 0x00, 0x00, 0xd5, 0x0c, 0x00, 0x00, 0xd4, 0x0c, 0x00, 0x00, 0xd4, 0x0c, 0x00, 0x00, 0xcc, 0x0b, 0x00, 0x00, 0xcd, 0x0b, + 0x00, 0x00, 0xce, 0x0b, 0x00, 0x00, 0xd6, 0x0c, 0x00, 0x00, 0xd5, 0x0c, 0x00, 0x00, 0xd5, 0x0c, 0x00, 0x00, 0xcd, 0x0b, 0x00, 0x00, 0xce, 0x0b, 0x00, 0x00, + 0xcf, 0x0b, 0x00, 0x00, 0xd7, 0x0c, 0x00, 0x00, 0xd6, 0x0c, 0x00, 0x00, 0xd6, 0x0c, 0x00, 0x00, 0xce, 0x0b, 0x00, 0x00, 0xcf, 0x0b, 0x00, 0x00, 0xd0, 0x0b, + 0x00, 0x00, 0xd8, 0x0c, 0x00, 0x00, 0xd7, 0x0c, 0x00, 0x00, 0xd7, 0x0c, 0x00, 0x00, 0xcf, 0x0b, 0x00, 0x00, 0xd0, 0x0b, 0x00, 0x00, 0xd1, 0x0b, 0x00, 0x00, + 0xd9, 0x0c, 0x00, 0x00, 0xd8, 0x0c, 0x00, 0x00, 0xd8, 0x0c, 0x00, 0x00, 0xd0, 0x0b, 0x00, 0x00, 0xd1, 0x0b, 0x00, 0x00, 0xd2, 0x0b, 0x00, 0x00, 0xda, 0x0c, + 0x00, 0x00, 0xd9, 0x0c, 0x00, 0x00, 0xd9, 0x0c, 0x00, 0x00, 0xd1, 0x0b, 0x00, 0x00, 0xd2, 0x0b, 0x00, 0x00, 0xd3, 0x0b, 0x00, 0x00, 0xdb, 0x0c, 0x00, 0x00, + 0xda, 0x0c, 0x00, 0x00, 0xda, 0x0c, 0x00, 0x00, 0xd2, 0x0b, 0x00, 0x00, 0xd3, 0x0b, 0x00, 0x00, 0xd4, 0x0b, 0x00, 0x00, 0xdc, 0x0c, 0x00, 0x00, 0xdb, 0x0c, + 0x00, 0x00, 0xdb, 0x0c, 0x00, 0x00, 0xd3, 0x0b, 0x00, 0x00, 0xd4, 0x0b, 0x00, 0x00, 0xd5, 0x0b, 0x00, 0x00, 0xdd, 0x0c, 0x00, 0x00, 0xdc, 0x0c, 0x00, 0x00, + 0xdc, 0x0c, 0x00, 0x00, 0xd4, 0x0b, 0x00, 0x00, 0xd5, 0x0b, 0x00, 0x00, 0xd6, 0x0b, 0x00, 0x00, 0xde, 0x0c, 0x00, 0x00, 0xdd, 0x0c, 0x00, 0x00, 0xdd, 0x0c, + 0x00, 0x00, 0xd5, 0x0b, 0x00, 0x00, 0xd6, 0x0b, 0x00, 0x00, 0xd7, 0x0b, 0x00, 0x00, 0xdf, 0x0c, 0x00, 0x00, 0xde, 0x0c, 0x00, 0x00, 0xde, 0x0c, 0x00, 0x00, + 0xd6, 0x0b, 0x00, 0x00, 0xd7, 0x0b, 0x00, 0x00, 0xd8, 0x0b, 0x00, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0xdf, 0x0c, 0x00, 0x00, 0xdf, 0x0c, 0x00, 0x00, 0xd7, 0x0b, + 0x00, 0x00, 0xd8, 0x0b, 0x00, 0x00, 0xd9, 0x0b, 0x00, 0x00, 0xe1, 0x0c, 0x00, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0xd8, 0x0b, 0x00, 0x00, + 0xd9, 0x0b, 0x00, 0x00, 0xda, 0x0b, 0x00, 0x00, 0xe2, 0x0c, 0x00, 0x00, 0xe1, 0x0c, 0x00, 0x00, 0xe1, 0x0c, 0x00, 0x00, 0xd9, 0x0b, 0x00, 0x00, 0xda, 0x0b, + 0x00, 0x00, 0xdb, 0x0b, 0x00, 0x00, 0xe3, 0x0c, 0x00, 0x00, 0xe2, 0x0c, 0x00, 0x00, 0xe2, 0x0c, 0x00, 0x00, 0xda, 0x0b, 0x00, 0x00, 0xdb, 0x0b, 0x00, 0x00, + 0xc5, 0x0b, 0x00, 0x00, 0xcd, 0x0c, 0x00, 0x00, 0xe3, 0x0c, 0x00, 0x00, 0xe3, 0x0c, 0x00, 0x00, 0xdb, 0x0b, 0x00, 0x00, 0xc5, 0x0b, 0x00, 0x00, 0xe4, 0x0c, + 0x00, 0x00, 0xe5, 0x0c, 0x00, 0x00, 0xe6, 0x0c, 0x00, 0x00, 0xe7, 0x0c, 0x00, 0x00, 0xe8, 0x0c, 0x00, 0x00, 0xe9, 0x0c, 0x00, 0x00, 0xea, 0x0c, 0x00, 0x00, + 0xeb, 0x0c, 0x00, 0x00, 0xec, 0x0c, 0x00, 0x00, 0xed, 0x0c, 0x00, 0x00, 0xee, 0x0c, 0x00, 0x00, 0xef, 0x0c, 0x00, 0x00, 0xe6, 0x0c, 0x00, 0x00, 0xf0, 0x0c, + 0x00, 0x00, 0xf1, 0x0c, 0x00, 0x00, 0xf2, 0x0c, 0x00, 0x00, 0xf3, 0x0c, 0x00, 0x00, 0xe7, 0x0c, 0x00, 0x00, 0xec, 0x0c, 0x00, 0x00, 0xf4, 0x0c, 0x00, 0x00, + 0xf5, 0x0c, 0x00, 0x00, 0xf6, 0x0c, 0x00, 0x00, 0xf7, 0x0c, 0x00, 0x00, 0xed, 0x0c, 0x00, 0x00, 0xf8, 0x0c, 0x00, 0x00, 0xf9, 0x0c, 0x00, 0x00, 0xfa, 0x0c, + 0x00, 0x00, 0xfb, 0x0c, 0x00, 0x00, 0xfc, 0x0c, 0x00, 0x00, 0xfd, 0x0c, 0x00, 0x00, 0xfe, 0x0c, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0x00, 0x0d, 0x00, 0x00, 0x01, 0x0d, 0x00, 0x00, 0xfe, 0x0c, 0x00, 0x00, 0x01, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x02, 0x0d, 0x00, 0x00, 0x02, 0x0d, + 0x00, 0x00, 0x03, 0x0d, 0x00, 0x00, 0x01, 0x0d, 0x00, 0x00, 0x04, 0x0d, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0x06, 0x0d, 0x00, 0x00, 0x06, 0x0d, 0x00, 0x00, + 0x07, 0x0d, 0x00, 0x00, 0x04, 0x0d, 0x00, 0x00, 0x08, 0x0d, 0x00, 0x00, 0x09, 0x0d, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0x04, 0x0d, + 0x00, 0x00, 0x08, 0x0d, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0x0a, 0x0d, 0x00, 0x00, 0x0b, 0x0d, 0x00, 0x00, 0x0b, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, + 0xff, 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x0b, 0x0d, 0x00, 0x00, 0x0c, 0x0d, 0x00, 0x00, 0x0c, 0x0d, 0x00, 0x00, 0x02, 0x0d, 0x00, 0x00, 0x00, 0x0d, + 0x00, 0x00, 0x0a, 0x0d, 0x00, 0x00, 0x0d, 0x0d, 0x00, 0x00, 0x0e, 0x0d, 0x00, 0x00, 0x0e, 0x0d, 0x00, 0x00, 0x0b, 0x0d, 0x00, 0x00, 0x0a, 0x0d, 0x00, 0x00, + 0x0b, 0x0d, 0x00, 0x00, 0x0e, 0x0d, 0x00, 0x00, 0x0f, 0x0d, 0x00, 0x00, 0x0f, 0x0d, 0x00, 0x00, 0x0c, 0x0d, 0x00, 0x00, 0x0b, 0x0d, 0x00, 0x00, 0x0d, 0x0d, + 0x00, 0x00, 0x10, 0x0d, 0x00, 0x00, 0x11, 0x0d, 0x00, 0x00, 0x11, 0x0d, 0x00, 0x00, 0x0e, 0x0d, 0x00, 0x00, 0x0d, 0x0d, 0x00, 0x00, 0x0e, 0x0d, 0x00, 0x00, + 0x11, 0x0d, 0x00, 0x00, 0x12, 0x0d, 0x00, 0x00, 0x12, 0x0d, 0x00, 0x00, 0x0f, 0x0d, 0x00, 0x00, 0x0e, 0x0d, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0x13, 0x0d, + 0x00, 0x00, 0x14, 0x0d, 0x00, 0x00, 0x14, 0x0d, 0x00, 0x00, 0x06, 0x0d, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0x09, 0x0d, 0x00, 0x00, 0x15, 0x0d, 0x00, 0x00, + 0x13, 0x0d, 0x00, 0x00, 0x13, 0x0d, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0x09, 0x0d, 0x00, 0x00, 0x13, 0x0d, 0x00, 0x00, 0x16, 0x0d, 0x00, 0x00, 0x17, 0x0d, + 0x00, 0x00, 0x17, 0x0d, 0x00, 0x00, 0x14, 0x0d, 0x00, 0x00, 0x13, 0x0d, 0x00, 0x00, 0x15, 0x0d, 0x00, 0x00, 0x18, 0x0d, 0x00, 0x00, 0x16, 0x0d, 0x00, 0x00, + 0x16, 0x0d, 0x00, 0x00, 0x13, 0x0d, 0x00, 0x00, 0x15, 0x0d, 0x00, 0x00, 0x19, 0x0d, 0x00, 0x00, 0xfe, 0x0c, 0x00, 0x00, 0x01, 0x0d, 0x00, 0x00, 0x19, 0x0d, + 0x00, 0x00, 0x01, 0x0d, 0x00, 0x00, 0x03, 0x0d, 0x00, 0x00, 0x1a, 0x0d, 0x00, 0x00, 0x1b, 0x0d, 0x00, 0x00, 0x1c, 0x0d, 0x00, 0x00, 0x1c, 0x0d, 0x00, 0x00, + 0x1d, 0x0d, 0x00, 0x00, 0x1a, 0x0d, 0x00, 0x00, 0x1e, 0x0d, 0x00, 0x00, 0x1f, 0x0d, 0x00, 0x00, 0x20, 0x0d, 0x00, 0x00, 0x20, 0x0d, 0x00, 0x00, 0x21, 0x0d, + 0x00, 0x00, 0x1e, 0x0d, 0x00, 0x00, 0x1c, 0x0d, 0x00, 0x00, 0x1b, 0x0d, 0x00, 0x00, 0x22, 0x0d, 0x00, 0x00, 0x22, 0x0d, 0x00, 0x00, 0x23, 0x0d, 0x00, 0x00, + 0x1c, 0x0d, 0x00, 0x00, 0x24, 0x0d, 0x00, 0x00, 0x25, 0x0d, 0x00, 0x00, 0x20, 0x0d, 0x00, 0x00, 0x20, 0x0d, 0x00, 0x00, 0x1f, 0x0d, 0x00, 0x00, 0x24, 0x0d, + 0x00, 0x00, 0x23, 0x0d, 0x00, 0x00, 0x22, 0x0d, 0x00, 0x00, 0x26, 0x0d, 0x00, 0x00, 0x26, 0x0d, 0x00, 0x00, 0x27, 0x0d, 0x00, 0x00, 0x23, 0x0d, 0x00, 0x00, + 0x28, 0x0d, 0x00, 0x00, 0x29, 0x0d, 0x00, 0x00, 0x25, 0x0d, 0x00, 0x00, 0x25, 0x0d, 0x00, 0x00, 0x24, 0x0d, 0x00, 0x00, 0x28, 0x0d, 0x00, 0x00, 0x27, 0x0d, + 0x00, 0x00, 0x26, 0x0d, 0x00, 0x00, 0xf8, 0x0c, 0x00, 0x00, 0x28, 0x0d, 0x00, 0x00, 0xfd, 0x0c, 0x00, 0x00, 0x29, 0x0d, 0x00, 0x00, 0xfe, 0x0c, 0x00, 0x00, + 0x19, 0x0d, 0x00, 0x00, 0xe4, 0x0c, 0x00, 0x00, 0xe4, 0x0c, 0x00, 0x00, 0xf1, 0x0c, 0x00, 0x00, 0xfe, 0x0c, 0x00, 0x00, 0xf2, 0x0c, 0x00, 0x00, 0xe9, 0x0c, + 0x00, 0x00, 0x19, 0x0d, 0x00, 0x00, 0x19, 0x0d, 0x00, 0x00, 0x03, 0x0d, 0x00, 0x00, 0xf2, 0x0c, 0x00, 0x00, 0x07, 0x0d, 0x00, 0x00, 0x06, 0x0d, 0x00, 0x00, + 0x2a, 0x0d, 0x00, 0x00, 0x2a, 0x0d, 0x00, 0x00, 0x2b, 0x0d, 0x00, 0x00, 0x07, 0x0d, 0x00, 0x00, 0x2c, 0x0d, 0x00, 0x00, 0x2d, 0x0d, 0x00, 0x00, 0x09, 0x0d, + 0x00, 0x00, 0x09, 0x0d, 0x00, 0x00, 0x08, 0x0d, 0x00, 0x00, 0x2c, 0x0d, 0x00, 0x00, 0x2b, 0x0d, 0x00, 0x00, 0x2a, 0x0d, 0x00, 0x00, 0x2e, 0x0d, 0x00, 0x00, + 0x2e, 0x0d, 0x00, 0x00, 0x2f, 0x0d, 0x00, 0x00, 0x2b, 0x0d, 0x00, 0x00, 0x30, 0x0d, 0x00, 0x00, 0x31, 0x0d, 0x00, 0x00, 0x2d, 0x0d, 0x00, 0x00, 0x2d, 0x0d, + 0x00, 0x00, 0x2c, 0x0d, 0x00, 0x00, 0x30, 0x0d, 0x00, 0x00, 0x2f, 0x0d, 0x00, 0x00, 0x2e, 0x0d, 0x00, 0x00, 0x32, 0x0d, 0x00, 0x00, 0x32, 0x0d, 0x00, 0x00, + 0x33, 0x0d, 0x00, 0x00, 0x2f, 0x0d, 0x00, 0x00, 0x34, 0x0d, 0x00, 0x00, 0x35, 0x0d, 0x00, 0x00, 0x31, 0x0d, 0x00, 0x00, 0x31, 0x0d, 0x00, 0x00, 0x30, 0x0d, + 0x00, 0x00, 0x34, 0x0d, 0x00, 0x00, 0x33, 0x0d, 0x00, 0x00, 0x32, 0x0d, 0x00, 0x00, 0x36, 0x0d, 0x00, 0x00, 0x36, 0x0d, 0x00, 0x00, 0x37, 0x0d, 0x00, 0x00, + 0x33, 0x0d, 0x00, 0x00, 0x38, 0x0d, 0x00, 0x00, 0x39, 0x0d, 0x00, 0x00, 0x35, 0x0d, 0x00, 0x00, 0x35, 0x0d, 0x00, 0x00, 0x34, 0x0d, 0x00, 0x00, 0x38, 0x0d, + 0x00, 0x00, 0x37, 0x0d, 0x00, 0x00, 0x36, 0x0d, 0x00, 0x00, 0x3a, 0x0d, 0x00, 0x00, 0x3a, 0x0d, 0x00, 0x00, 0x3b, 0x0d, 0x00, 0x00, 0x37, 0x0d, 0x00, 0x00, + 0x3c, 0x0d, 0x00, 0x00, 0x3d, 0x0d, 0x00, 0x00, 0x39, 0x0d, 0x00, 0x00, 0x39, 0x0d, 0x00, 0x00, 0x38, 0x0d, 0x00, 0x00, 0x3c, 0x0d, 0x00, 0x00, 0x3b, 0x0d, + 0x00, 0x00, 0x3a, 0x0d, 0x00, 0x00, 0x1a, 0x0d, 0x00, 0x00, 0x1a, 0x0d, 0x00, 0x00, 0x1d, 0x0d, 0x00, 0x00, 0x3b, 0x0d, 0x00, 0x00, 0x1e, 0x0d, 0x00, 0x00, + 0x21, 0x0d, 0x00, 0x00, 0x3d, 0x0d, 0x00, 0x00, 0x3d, 0x0d, 0x00, 0x00, 0x3c, 0x0d, 0x00, 0x00, 0x1e, 0x0d, 0x00, 0x00, 0x3e, 0x0d, 0x00, 0x00, 0x3f, 0x0d, + 0x00, 0x00, 0xea, 0x0c, 0x00, 0x00, 0xea, 0x0c, 0x00, 0x00, 0xec, 0x0c, 0x00, 0x00, 0x3e, 0x0d, 0x00, 0x00, 0xed, 0x0c, 0x00, 0x00, 0xef, 0x0c, 0x00, 0x00, + 0x40, 0x0d, 0x00, 0x00, 0x40, 0x0d, 0x00, 0x00, 0x41, 0x0d, 0x00, 0x00, 0xed, 0x0c, 0x00, 0x00, 0x3f, 0x0d, 0x00, 0x00, 0x42, 0x0d, 0x00, 0x00, 0xea, 0x0c, + 0x00, 0x00, 0x40, 0x0d, 0x00, 0x00, 0xef, 0x0c, 0x00, 0x00, 0x43, 0x0d, 0x00, 0x00, 0x3e, 0x0d, 0x00, 0x00, 0xec, 0x0c, 0x00, 0x00, 0xf5, 0x0c, 0x00, 0x00, + 0xf5, 0x0c, 0x00, 0x00, 0xe5, 0x0c, 0x00, 0x00, 0x3e, 0x0d, 0x00, 0x00, 0xe8, 0x0c, 0x00, 0x00, 0xf6, 0x0c, 0x00, 0x00, 0xed, 0x0c, 0x00, 0x00, 0xed, 0x0c, + 0x00, 0x00, 0x41, 0x0d, 0x00, 0x00, 0xe8, 0x0c, 0x00, 0x00, 0xe4, 0x0c, 0x00, 0x00, 0xe6, 0x0c, 0x00, 0x00, 0xf1, 0x0c, 0x00, 0x00, 0xe9, 0x0c, 0x00, 0x00, + 0xf2, 0x0c, 0x00, 0x00, 0xe7, 0x0c, 0x00, 0x00, 0x44, 0x0d, 0x00, 0x00, 0x42, 0x0d, 0x00, 0x00, 0x3f, 0x0d, 0x00, 0x00, 0x3f, 0x0d, 0x00, 0x00, 0x45, 0x0d, + 0x00, 0x00, 0x44, 0x0d, 0x00, 0x00, 0x46, 0x0d, 0x00, 0x00, 0x40, 0x0d, 0x00, 0x00, 0x43, 0x0d, 0x00, 0x00, 0x43, 0x0d, 0x00, 0x00, 0x47, 0x0d, 0x00, 0x00, + 0x46, 0x0d, 0x00, 0x00, 0x27, 0x0d, 0x00, 0x00, 0x48, 0x0d, 0x00, 0x00, 0x44, 0x0d, 0x00, 0x00, 0x44, 0x0d, 0x00, 0x00, 0x45, 0x0d, 0x00, 0x00, 0x27, 0x0d, + 0x00, 0x00, 0x46, 0x0d, 0x00, 0x00, 0x47, 0x0d, 0x00, 0x00, 0x49, 0x0d, 0x00, 0x00, 0x49, 0x0d, 0x00, 0x00, 0x28, 0x0d, 0x00, 0x00, 0x46, 0x0d, 0x00, 0x00, + 0x27, 0x0d, 0x00, 0x00, 0xf8, 0x0c, 0x00, 0x00, 0x48, 0x0d, 0x00, 0x00, 0x28, 0x0d, 0x00, 0x00, 0x49, 0x0d, 0x00, 0x00, 0xfd, 0x0c, 0x00, 0x00, 0xeb, 0x0c, + 0x00, 0x00, 0x4a, 0x0d, 0x00, 0x00, 0x4b, 0x0d, 0x00, 0x00, 0x4b, 0x0d, 0x00, 0x00, 0x4c, 0x0d, 0x00, 0x00, 0xeb, 0x0c, 0x00, 0x00, 0x4d, 0x0d, 0x00, 0x00, + 0x4e, 0x0d, 0x00, 0x00, 0x4f, 0x0d, 0x00, 0x00, 0x4f, 0x0d, 0x00, 0x00, 0xee, 0x0c, 0x00, 0x00, 0x4d, 0x0d, 0x00, 0x00, 0xf9, 0x0c, 0x00, 0x00, 0x50, 0x0d, + 0x00, 0x00, 0x51, 0x0d, 0x00, 0x00, 0x51, 0x0d, 0x00, 0x00, 0xfa, 0x0c, 0x00, 0x00, 0xf9, 0x0c, 0x00, 0x00, 0xfb, 0x0c, 0x00, 0x00, 0x52, 0x0d, 0x00, 0x00, + 0x53, 0x0d, 0x00, 0x00, 0x53, 0x0d, 0x00, 0x00, 0xfc, 0x0c, 0x00, 0x00, 0xfb, 0x0c, 0x00, 0x00, 0x4a, 0x0d, 0x00, 0x00, 0xeb, 0x0c, 0x00, 0x00, 0x54, 0x0d, + 0x00, 0x00, 0x54, 0x0d, 0x00, 0x00, 0x55, 0x0d, 0x00, 0x00, 0x4a, 0x0d, 0x00, 0x00, 0x56, 0x0d, 0x00, 0x00, 0x57, 0x0d, 0x00, 0x00, 0xee, 0x0c, 0x00, 0x00, + 0xee, 0x0c, 0x00, 0x00, 0x4f, 0x0d, 0x00, 0x00, 0x56, 0x0d, 0x00, 0x00, 0x58, 0x0d, 0x00, 0x00, 0x59, 0x0d, 0x00, 0x00, 0x5a, 0x0d, 0x00, 0x00, 0x5a, 0x0d, + 0x00, 0x00, 0x5b, 0x0d, 0x00, 0x00, 0x58, 0x0d, 0x00, 0x00, 0x5c, 0x0d, 0x00, 0x00, 0x5d, 0x0d, 0x00, 0x00, 0x5e, 0x0d, 0x00, 0x00, 0x5e, 0x0d, 0x00, 0x00, + 0x5f, 0x0d, 0x00, 0x00, 0x5c, 0x0d, 0x00, 0x00, 0x60, 0x0d, 0x00, 0x00, 0x61, 0x0d, 0x00, 0x00, 0x59, 0x0d, 0x00, 0x00, 0x59, 0x0d, 0x00, 0x00, 0x58, 0x0d, + 0x00, 0x00, 0x60, 0x0d, 0x00, 0x00, 0x5f, 0x0d, 0x00, 0x00, 0x5e, 0x0d, 0x00, 0x00, 0x62, 0x0d, 0x00, 0x00, 0x62, 0x0d, 0x00, 0x00, 0x63, 0x0d, 0x00, 0x00, + 0x5f, 0x0d, 0x00, 0x00, 0x64, 0x0d, 0x00, 0x00, 0x4c, 0x0d, 0x00, 0x00, 0x4b, 0x0d, 0x00, 0x00, 0x4b, 0x0d, 0x00, 0x00, 0x65, 0x0d, 0x00, 0x00, 0x64, 0x0d, + 0x00, 0x00, 0x66, 0x0d, 0x00, 0x00, 0x4e, 0x0d, 0x00, 0x00, 0x4d, 0x0d, 0x00, 0x00, 0x4d, 0x0d, 0x00, 0x00, 0x67, 0x0d, 0x00, 0x00, 0x66, 0x0d, 0x00, 0x00, + 0x68, 0x0d, 0x00, 0x00, 0x69, 0x0d, 0x00, 0x00, 0x6a, 0x0d, 0x00, 0x00, 0x6a, 0x0d, 0x00, 0x00, 0x6b, 0x0d, 0x00, 0x00, 0x68, 0x0d, 0x00, 0x00, 0x6c, 0x0d, + 0x00, 0x00, 0x6d, 0x0d, 0x00, 0x00, 0x6e, 0x0d, 0x00, 0x00, 0x6e, 0x0d, 0x00, 0x00, 0x6f, 0x0d, 0x00, 0x00, 0x6c, 0x0d, 0x00, 0x00, 0x64, 0x0d, 0x00, 0x00, + 0x65, 0x0d, 0x00, 0x00, 0x10, 0x0d, 0x00, 0x00, 0x10, 0x0d, 0x00, 0x00, 0x0d, 0x0d, 0x00, 0x00, 0x64, 0x0d, 0x00, 0x00, 0x0f, 0x0d, 0x00, 0x00, 0x12, 0x0d, + 0x00, 0x00, 0x66, 0x0d, 0x00, 0x00, 0x66, 0x0d, 0x00, 0x00, 0x67, 0x0d, 0x00, 0x00, 0x0f, 0x0d, 0x00, 0x00, 0x54, 0x0d, 0x00, 0x00, 0x70, 0x0d, 0x00, 0x00, + 0x71, 0x0d, 0x00, 0x00, 0x71, 0x0d, 0x00, 0x00, 0x55, 0x0d, 0x00, 0x00, 0x54, 0x0d, 0x00, 0x00, 0x56, 0x0d, 0x00, 0x00, 0x72, 0x0d, 0x00, 0x00, 0x73, 0x0d, + 0x00, 0x00, 0x73, 0x0d, 0x00, 0x00, 0x57, 0x0d, 0x00, 0x00, 0x56, 0x0d, 0x00, 0x00, 0x6b, 0x0d, 0x00, 0x00, 0x6a, 0x0d, 0x00, 0x00, 0x50, 0x0d, 0x00, 0x00, + 0x50, 0x0d, 0x00, 0x00, 0xf9, 0x0c, 0x00, 0x00, 0x6b, 0x0d, 0x00, 0x00, 0xfc, 0x0c, 0x00, 0x00, 0x53, 0x0d, 0x00, 0x00, 0x6d, 0x0d, 0x00, 0x00, 0x6d, 0x0d, + 0x00, 0x00, 0x6c, 0x0d, 0x00, 0x00, 0xfc, 0x0c, 0x00, 0x00, 0x5b, 0x0d, 0x00, 0x00, 0x5a, 0x0d, 0x00, 0x00, 0x74, 0x0d, 0x00, 0x00, 0x74, 0x0d, 0x00, 0x00, + 0x75, 0x0d, 0x00, 0x00, 0x5b, 0x0d, 0x00, 0x00, 0x76, 0x0d, 0x00, 0x00, 0x77, 0x0d, 0x00, 0x00, 0x5d, 0x0d, 0x00, 0x00, 0x5d, 0x0d, 0x00, 0x00, 0x5c, 0x0d, + 0x00, 0x00, 0x76, 0x0d, 0x00, 0x00, 0x14, 0x0d, 0x00, 0x00, 0x17, 0x0d, 0x00, 0x00, 0x78, 0x0d, 0x00, 0x00, 0x78, 0x0d, 0x00, 0x00, 0x79, 0x0d, 0x00, 0x00, + 0x14, 0x0d, 0x00, 0x00, 0x7a, 0x0d, 0x00, 0x00, 0x7b, 0x0d, 0x00, 0x00, 0x18, 0x0d, 0x00, 0x00, 0x18, 0x0d, 0x00, 0x00, 0x15, 0x0d, 0x00, 0x00, 0x7a, 0x0d, + 0x00, 0x00, 0x79, 0x0d, 0x00, 0x00, 0x78, 0x0d, 0x00, 0x00, 0x61, 0x0d, 0x00, 0x00, 0x61, 0x0d, 0x00, 0x00, 0x60, 0x0d, 0x00, 0x00, 0x79, 0x0d, 0x00, 0x00, + 0x63, 0x0d, 0x00, 0x00, 0x62, 0x0d, 0x00, 0x00, 0x7b, 0x0d, 0x00, 0x00, 0x7b, 0x0d, 0x00, 0x00, 0x7a, 0x0d, 0x00, 0x00, 0x63, 0x0d, 0x00, 0x00, 0x7c, 0x0d, + 0x00, 0x00, 0x7d, 0x0d, 0x00, 0x00, 0x69, 0x0d, 0x00, 0x00, 0x69, 0x0d, 0x00, 0x00, 0x68, 0x0d, 0x00, 0x00, 0x7c, 0x0d, 0x00, 0x00, 0x6f, 0x0d, 0x00, 0x00, + 0x6e, 0x0d, 0x00, 0x00, 0x7e, 0x0d, 0x00, 0x00, 0x7e, 0x0d, 0x00, 0x00, 0x7f, 0x0d, 0x00, 0x00, 0x6f, 0x0d, 0x00, 0x00, 0x80, 0x0d, 0x00, 0x00, 0x7d, 0x0d, + 0x00, 0x00, 0x7c, 0x0d, 0x00, 0x00, 0x7c, 0x0d, 0x00, 0x00, 0x81, 0x0d, 0x00, 0x00, 0x80, 0x0d, 0x00, 0x00, 0x82, 0x0d, 0x00, 0x00, 0x7f, 0x0d, 0x00, 0x00, + 0x7e, 0x0d, 0x00, 0x00, 0x7e, 0x0d, 0x00, 0x00, 0x83, 0x0d, 0x00, 0x00, 0x82, 0x0d, 0x00, 0x00, 0x75, 0x0d, 0x00, 0x00, 0x74, 0x0d, 0x00, 0x00, 0x80, 0x0d, + 0x00, 0x00, 0x80, 0x0d, 0x00, 0x00, 0x81, 0x0d, 0x00, 0x00, 0x75, 0x0d, 0x00, 0x00, 0x82, 0x0d, 0x00, 0x00, 0x83, 0x0d, 0x00, 0x00, 0x77, 0x0d, 0x00, 0x00, + 0x77, 0x0d, 0x00, 0x00, 0x76, 0x0d, 0x00, 0x00, 0x82, 0x0d, 0x00, 0x00, 0x70, 0x0d, 0x00, 0x00, 0x84, 0x0d, 0x00, 0x00, 0x85, 0x0d, 0x00, 0x00, 0x85, 0x0d, + 0x00, 0x00, 0x71, 0x0d, 0x00, 0x00, 0x70, 0x0d, 0x00, 0x00, 0x72, 0x0d, 0x00, 0x00, 0x86, 0x0d, 0x00, 0x00, 0x87, 0x0d, 0x00, 0x00, 0x87, 0x0d, 0x00, 0x00, + 0x73, 0x0d, 0x00, 0x00, 0x72, 0x0d, 0x00, 0x00, 0x51, 0x0d, 0x00, 0x00, 0x85, 0x0d, 0x00, 0x00, 0x84, 0x0d, 0x00, 0x00, 0x84, 0x0d, 0x00, 0x00, 0xfa, 0x0c, + 0x00, 0x00, 0x51, 0x0d, 0x00, 0x00, 0xfb, 0x0c, 0x00, 0x00, 0x87, 0x0d, 0x00, 0x00, 0x86, 0x0d, 0x00, 0x00, 0x86, 0x0d, 0x00, 0x00, 0x52, 0x0d, 0x00, 0x00, + 0xfb, 0x0c, 0x00, 0x00, 0x42, 0x0d, 0x00, 0x00, 0x54, 0x0d, 0x00, 0x00, 0xeb, 0x0c, 0x00, 0x00, 0xeb, 0x0c, 0x00, 0x00, 0xea, 0x0c, 0x00, 0x00, 0x42, 0x0d, + 0x00, 0x00, 0xef, 0x0c, 0x00, 0x00, 0xee, 0x0c, 0x00, 0x00, 0x57, 0x0d, 0x00, 0x00, 0x57, 0x0d, 0x00, 0x00, 0x43, 0x0d, 0x00, 0x00, 0xef, 0x0c, 0x00, 0x00, + 0x1a, 0x0d, 0x00, 0x00, 0x81, 0x0d, 0x00, 0x00, 0x7c, 0x0d, 0x00, 0x00, 0x7c, 0x0d, 0x00, 0x00, 0x1b, 0x0d, 0x00, 0x00, 0x1a, 0x0d, 0x00, 0x00, 0x20, 0x0d, + 0x00, 0x00, 0x7f, 0x0d, 0x00, 0x00, 0x82, 0x0d, 0x00, 0x00, 0x82, 0x0d, 0x00, 0x00, 0x21, 0x0d, 0x00, 0x00, 0x20, 0x0d, 0x00, 0x00, 0x1b, 0x0d, 0x00, 0x00, + 0x7c, 0x0d, 0x00, 0x00, 0x68, 0x0d, 0x00, 0x00, 0x68, 0x0d, 0x00, 0x00, 0x22, 0x0d, 0x00, 0x00, 0x1b, 0x0d, 0x00, 0x00, 0x25, 0x0d, 0x00, 0x00, 0x6f, 0x0d, + 0x00, 0x00, 0x7f, 0x0d, 0x00, 0x00, 0x7f, 0x0d, 0x00, 0x00, 0x20, 0x0d, 0x00, 0x00, 0x25, 0x0d, 0x00, 0x00, 0x22, 0x0d, 0x00, 0x00, 0x68, 0x0d, 0x00, 0x00, + 0x6b, 0x0d, 0x00, 0x00, 0x6b, 0x0d, 0x00, 0x00, 0x26, 0x0d, 0x00, 0x00, 0x22, 0x0d, 0x00, 0x00, 0x29, 0x0d, 0x00, 0x00, 0x6c, 0x0d, 0x00, 0x00, 0x6f, 0x0d, + 0x00, 0x00, 0x6f, 0x0d, 0x00, 0x00, 0x25, 0x0d, 0x00, 0x00, 0x29, 0x0d, 0x00, 0x00, 0x26, 0x0d, 0x00, 0x00, 0x6b, 0x0d, 0x00, 0x00, 0xf9, 0x0c, 0x00, 0x00, + 0xf9, 0x0c, 0x00, 0x00, 0xf8, 0x0c, 0x00, 0x00, 0x26, 0x0d, 0x00, 0x00, 0xfd, 0x0c, 0x00, 0x00, 0xfc, 0x0c, 0x00, 0x00, 0x6c, 0x0d, 0x00, 0x00, 0x6c, 0x0d, + 0x00, 0x00, 0x29, 0x0d, 0x00, 0x00, 0xfd, 0x0c, 0x00, 0x00, 0xfa, 0x0c, 0x00, 0x00, 0x84, 0x0d, 0x00, 0x00, 0x48, 0x0d, 0x00, 0x00, 0x48, 0x0d, 0x00, 0x00, + 0xf8, 0x0c, 0x00, 0x00, 0xfa, 0x0c, 0x00, 0x00, 0xfd, 0x0c, 0x00, 0x00, 0x49, 0x0d, 0x00, 0x00, 0x87, 0x0d, 0x00, 0x00, 0x87, 0x0d, 0x00, 0x00, 0xfb, 0x0c, + 0x00, 0x00, 0xfd, 0x0c, 0x00, 0x00, 0xf1, 0x0c, 0x00, 0x00, 0xf0, 0x0c, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xfe, 0x0c, 0x00, 0x00, + 0xf1, 0x0c, 0x00, 0x00, 0x03, 0x0d, 0x00, 0x00, 0x02, 0x0d, 0x00, 0x00, 0xf3, 0x0c, 0x00, 0x00, 0xf3, 0x0c, 0x00, 0x00, 0xf2, 0x0c, 0x00, 0x00, 0x03, 0x0d, + 0x00, 0x00, 0xf0, 0x0c, 0x00, 0x00, 0x88, 0x0d, 0x00, 0x00, 0x0a, 0x0d, 0x00, 0x00, 0x0a, 0x0d, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xf0, 0x0c, 0x00, 0x00, + 0x02, 0x0d, 0x00, 0x00, 0x0c, 0x0d, 0x00, 0x00, 0x89, 0x0d, 0x00, 0x00, 0x89, 0x0d, 0x00, 0x00, 0xf3, 0x0c, 0x00, 0x00, 0x02, 0x0d, 0x00, 0x00, 0x06, 0x0d, + 0x00, 0x00, 0x14, 0x0d, 0x00, 0x00, 0x79, 0x0d, 0x00, 0x00, 0x79, 0x0d, 0x00, 0x00, 0x2a, 0x0d, 0x00, 0x00, 0x06, 0x0d, 0x00, 0x00, 0x2d, 0x0d, 0x00, 0x00, + 0x7a, 0x0d, 0x00, 0x00, 0x15, 0x0d, 0x00, 0x00, 0x15, 0x0d, 0x00, 0x00, 0x09, 0x0d, 0x00, 0x00, 0x2d, 0x0d, 0x00, 0x00, 0x2a, 0x0d, 0x00, 0x00, 0x79, 0x0d, + 0x00, 0x00, 0x60, 0x0d, 0x00, 0x00, 0x60, 0x0d, 0x00, 0x00, 0x2e, 0x0d, 0x00, 0x00, 0x2a, 0x0d, 0x00, 0x00, 0x31, 0x0d, 0x00, 0x00, 0x63, 0x0d, 0x00, 0x00, + 0x7a, 0x0d, 0x00, 0x00, 0x7a, 0x0d, 0x00, 0x00, 0x2d, 0x0d, 0x00, 0x00, 0x31, 0x0d, 0x00, 0x00, 0x2e, 0x0d, 0x00, 0x00, 0x60, 0x0d, 0x00, 0x00, 0x58, 0x0d, + 0x00, 0x00, 0x58, 0x0d, 0x00, 0x00, 0x32, 0x0d, 0x00, 0x00, 0x2e, 0x0d, 0x00, 0x00, 0x35, 0x0d, 0x00, 0x00, 0x5f, 0x0d, 0x00, 0x00, 0x63, 0x0d, 0x00, 0x00, + 0x63, 0x0d, 0x00, 0x00, 0x31, 0x0d, 0x00, 0x00, 0x35, 0x0d, 0x00, 0x00, 0x32, 0x0d, 0x00, 0x00, 0x58, 0x0d, 0x00, 0x00, 0x5b, 0x0d, 0x00, 0x00, 0x5b, 0x0d, + 0x00, 0x00, 0x36, 0x0d, 0x00, 0x00, 0x32, 0x0d, 0x00, 0x00, 0x39, 0x0d, 0x00, 0x00, 0x5c, 0x0d, 0x00, 0x00, 0x5f, 0x0d, 0x00, 0x00, 0x5f, 0x0d, 0x00, 0x00, + 0x35, 0x0d, 0x00, 0x00, 0x39, 0x0d, 0x00, 0x00, 0x36, 0x0d, 0x00, 0x00, 0x5b, 0x0d, 0x00, 0x00, 0x75, 0x0d, 0x00, 0x00, 0x75, 0x0d, 0x00, 0x00, 0x3a, 0x0d, + 0x00, 0x00, 0x36, 0x0d, 0x00, 0x00, 0x3d, 0x0d, 0x00, 0x00, 0x76, 0x0d, 0x00, 0x00, 0x5c, 0x0d, 0x00, 0x00, 0x5c, 0x0d, 0x00, 0x00, 0x39, 0x0d, 0x00, 0x00, + 0x3d, 0x0d, 0x00, 0x00, 0x3a, 0x0d, 0x00, 0x00, 0x75, 0x0d, 0x00, 0x00, 0x81, 0x0d, 0x00, 0x00, 0x81, 0x0d, 0x00, 0x00, 0x1a, 0x0d, 0x00, 0x00, 0x3a, 0x0d, + 0x00, 0x00, 0x21, 0x0d, 0x00, 0x00, 0x82, 0x0d, 0x00, 0x00, 0x76, 0x0d, 0x00, 0x00, 0x76, 0x0d, 0x00, 0x00, 0x3d, 0x0d, 0x00, 0x00, 0x21, 0x0d, 0x00, 0x00, + 0x44, 0x0d, 0x00, 0x00, 0x48, 0x0d, 0x00, 0x00, 0x84, 0x0d, 0x00, 0x00, 0x84, 0x0d, 0x00, 0x00, 0x70, 0x0d, 0x00, 0x00, 0x44, 0x0d, 0x00, 0x00, 0x73, 0x0d, + 0x00, 0x00, 0x87, 0x0d, 0x00, 0x00, 0x49, 0x0d, 0x00, 0x00, 0x49, 0x0d, 0x00, 0x00, 0x47, 0x0d, 0x00, 0x00, 0x73, 0x0d, 0x00, 0x00, 0xf5, 0x0c, 0x00, 0x00, + 0xf0, 0x0c, 0x00, 0x00, 0xe6, 0x0c, 0x00, 0x00, 0xe6, 0x0c, 0x00, 0x00, 0xe5, 0x0c, 0x00, 0x00, 0xf5, 0x0c, 0x00, 0x00, 0xe8, 0x0c, 0x00, 0x00, 0xe7, 0x0c, + 0x00, 0x00, 0xf3, 0x0c, 0x00, 0x00, 0xf3, 0x0c, 0x00, 0x00, 0xf6, 0x0c, 0x00, 0x00, 0xe8, 0x0c, 0x00, 0x00, 0xf5, 0x0c, 0x00, 0x00, 0xf4, 0x0c, 0x00, 0x00, + 0x88, 0x0d, 0x00, 0x00, 0x88, 0x0d, 0x00, 0x00, 0xf0, 0x0c, 0x00, 0x00, 0xf5, 0x0c, 0x00, 0x00, 0xf3, 0x0c, 0x00, 0x00, 0x89, 0x0d, 0x00, 0x00, 0xf7, 0x0c, + 0x00, 0x00, 0xf7, 0x0c, 0x00, 0x00, 0xf6, 0x0c, 0x00, 0x00, 0xf3, 0x0c, 0x00, 0x00, 0x70, 0x0d, 0x00, 0x00, 0x54, 0x0d, 0x00, 0x00, 0x42, 0x0d, 0x00, 0x00, + 0x42, 0x0d, 0x00, 0x00, 0x44, 0x0d, 0x00, 0x00, 0x70, 0x0d, 0x00, 0x00, 0x47, 0x0d, 0x00, 0x00, 0x43, 0x0d, 0x00, 0x00, 0x57, 0x0d, 0x00, 0x00, 0x57, 0x0d, + 0x00, 0x00, 0x73, 0x0d, 0x00, 0x00, 0x47, 0x0d, 0x00, 0x00, 0xf4, 0x0c, 0x00, 0x00, 0xec, 0x0c, 0x00, 0x00, 0xeb, 0x0c, 0x00, 0x00, 0xeb, 0x0c, 0x00, 0x00, + 0x4c, 0x0d, 0x00, 0x00, 0xf4, 0x0c, 0x00, 0x00, 0x4d, 0x0d, 0x00, 0x00, 0xee, 0x0c, 0x00, 0x00, 0xed, 0x0c, 0x00, 0x00, 0xed, 0x0c, 0x00, 0x00, 0xf7, 0x0c, + 0x00, 0x00, 0x4d, 0x0d, 0x00, 0x00, 0x88, 0x0d, 0x00, 0x00, 0x64, 0x0d, 0x00, 0x00, 0x0d, 0x0d, 0x00, 0x00, 0x0d, 0x0d, 0x00, 0x00, 0x0a, 0x0d, 0x00, 0x00, + 0x88, 0x0d, 0x00, 0x00, 0x0c, 0x0d, 0x00, 0x00, 0x0f, 0x0d, 0x00, 0x00, 0x67, 0x0d, 0x00, 0x00, 0x67, 0x0d, 0x00, 0x00, 0x89, 0x0d, 0x00, 0x00, 0x0c, 0x0d, + 0x00, 0x00, 0x64, 0x0d, 0x00, 0x00, 0x88, 0x0d, 0x00, 0x00, 0xf4, 0x0c, 0x00, 0x00, 0xf4, 0x0c, 0x00, 0x00, 0x4c, 0x0d, 0x00, 0x00, 0x64, 0x0d, 0x00, 0x00, + 0x4d, 0x0d, 0x00, 0x00, 0xf7, 0x0c, 0x00, 0x00, 0x89, 0x0d, 0x00, 0x00, 0x89, 0x0d, 0x00, 0x00, 0x67, 0x0d, 0x00, 0x00, 0x4d, 0x0d, 0x00, 0x00, +}; diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/Scalp.obj b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/Scalp.obj new file mode 100644 index 0000000..ad89c6b Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/Scalp.obj differ diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/Scalp.obj.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/Scalp.obj.hpp new file mode 100644 index 0000000..2df23e0 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/Scalp.obj.hpp @@ -0,0 +1,494 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +static const unsigned char SCALP_DATA[12212] = { + 0x69, 0x01, 0x00, 0x00, 0x90, 0x02, 0x00, 0x00, 0xfb, 0xb6, 0x45, 0xbf, 0xc8, 0xc7, 0x80, 0x3d, 0x7c, 0xbc, 0xe3, 0x3d, 0xfa, 0x71, 0x45, 0xbf, 0x40, 0x1f, + 0x70, 0x3c, 0x68, 0xc2, 0xfc, 0x3c, 0x87, 0xa8, 0x45, 0xbf, 0x88, 0x5b, 0x92, 0x3d, 0xf0, 0x57, 0x45, 0x3c, 0xb3, 0xe1, 0x1f, 0xbf, 0x28, 0x69, 0x8e, 0x3d, + 0x68, 0x5f, 0x2e, 0xbf, 0xd4, 0xaf, 0x21, 0xbf, 0xc0, 0x51, 0xfb, 0x3c, 0x3b, 0x42, 0x24, 0xbf, 0x55, 0xeb, 0x1f, 0xbf, 0x80, 0x9e, 0xd4, 0xbb, 0x63, 0xbd, + 0x30, 0xbf, 0x7f, 0xf9, 0x23, 0xbf, 0xec, 0xef, 0x14, 0xbe, 0xa9, 0x8e, 0x24, 0xbf, 0xc6, 0x53, 0x1e, 0xbf, 0x80, 0xa0, 0xc1, 0xbc, 0x89, 0xe3, 0x3a, 0xbf, + 0x3b, 0xc4, 0x1c, 0xbf, 0x60, 0xfe, 0x28, 0xbd, 0xcc, 0xbc, 0x44, 0xbf, 0x0c, 0xfa, 0x1b, 0xbf, 0x90, 0x9e, 0xd3, 0x3d, 0x73, 0x38, 0x40, 0xbf, 0xd3, 0xe5, + 0x29, 0xbf, 0x54, 0x05, 0x96, 0xbd, 0x98, 0xd6, 0x0c, 0xbf, 0x60, 0xd6, 0x2c, 0xbf, 0x70, 0x07, 0x6b, 0xbd, 0x1a, 0x9e, 0x03, 0xbf, 0x27, 0xd1, 0x32, 0xbf, + 0xde, 0xc8, 0x41, 0xbe, 0xf6, 0xae, 0xef, 0xbe, 0x0d, 0x75, 0x24, 0xbf, 0x64, 0x97, 0x3c, 0xbe, 0xa4, 0x4f, 0x30, 0xbf, 0x51, 0x0e, 0x19, 0xbf, 0xb0, 0x56, + 0x05, 0xbe, 0xe1, 0xeb, 0x48, 0xbf, 0x74, 0xbc, 0x3b, 0xbe, 0x34, 0x0b, 0x4a, 0x3e, 0x26, 0x05, 0x82, 0xbf, 0x1b, 0xf7, 0x68, 0xbe, 0x56, 0x2b, 0xbf, 0x3e, + 0x43, 0x55, 0x7d, 0xbf, 0x25, 0xf0, 0x70, 0xbe, 0x2c, 0x67, 0x44, 0x3e, 0xb7, 0x2b, 0x81, 0xbf, 0xbe, 0x9b, 0xd0, 0xbe, 0x8c, 0x99, 0x11, 0x3f, 0xe9, 0x36, + 0x2c, 0x3f, 0xe0, 0x74, 0x9b, 0xbe, 0xae, 0xa9, 0x20, 0x3f, 0x88, 0xe6, 0x32, 0x3f, 0x62, 0xc5, 0x97, 0xbe, 0x4c, 0xc1, 0x19, 0x3f, 0xf4, 0x7f, 0x37, 0x3f, + 0xa6, 0x2a, 0x21, 0xbf, 0x68, 0x02, 0xde, 0x3e, 0x1c, 0x9e, 0x03, 0x3f, 0x5e, 0xb9, 0x0b, 0xbf, 0x22, 0x1f, 0x0c, 0x3f, 0x52, 0x1e, 0x11, 0x3f, 0x23, 0x4e, + 0x07, 0xbf, 0x40, 0x5f, 0xfd, 0x3e, 0x09, 0xec, 0x1a, 0x3f, 0x4a, 0x30, 0x38, 0xbf, 0xb6, 0xf1, 0xc5, 0x3e, 0x7b, 0x88, 0xbd, 0x3e, 0xc4, 0x78, 0x34, 0xbf, + 0xfe, 0x34, 0xab, 0x3e, 0x68, 0xb0, 0xd6, 0x3e, 0xb5, 0x9c, 0x42, 0xbf, 0x18, 0x2c, 0x59, 0x3e, 0xd1, 0xe4, 0xa2, 0x3e, 0x5e, 0xc3, 0x40, 0xbf, 0x00, 0xa7, + 0x9f, 0xbd, 0x76, 0x77, 0x96, 0x3e, 0x97, 0xfe, 0x42, 0xbf, 0x20, 0x4e, 0x9a, 0xbc, 0x73, 0x74, 0x85, 0x3e, 0x8c, 0xa3, 0x3c, 0xbf, 0xc0, 0x35, 0xb8, 0x3d, + 0xd0, 0x99, 0xc8, 0x3e, 0xf1, 0x67, 0x05, 0xbe, 0xc8, 0x40, 0x32, 0x3f, 0x82, 0x1a, 0x35, 0x3f, 0xeb, 0x39, 0x15, 0xbe, 0x80, 0xb0, 0x21, 0x3f, 0x06, 0x91, + 0x3f, 0x3f, 0xbf, 0x3b, 0x29, 0xbe, 0xda, 0xa1, 0x2e, 0x3f, 0x60, 0x0b, 0x35, 0x3f, 0xd6, 0x71, 0x24, 0xbf, 0xc4, 0x00, 0xcb, 0x3e, 0xae, 0x34, 0x15, 0xbf, + 0x70, 0xee, 0x2c, 0xbf, 0x54, 0xc5, 0x8c, 0x3e, 0x43, 0x16, 0x03, 0xbf, 0x36, 0x23, 0x24, 0xbf, 0x56, 0x3e, 0xbf, 0x3e, 0x66, 0xb1, 0x1b, 0xbf, 0x12, 0xe8, + 0x37, 0xbf, 0x40, 0xc5, 0x5e, 0xbc, 0xd6, 0xb4, 0xc2, 0xbe, 0x1a, 0x65, 0x3a, 0xbf, 0x9e, 0x00, 0x08, 0xbe, 0x64, 0xaf, 0xb0, 0xbe, 0x14, 0xe9, 0x34, 0xbf, + 0xb0, 0xe1, 0xa8, 0xbc, 0x4f, 0x57, 0xd3, 0xbe, 0x85, 0xa8, 0x45, 0x3f, 0x90, 0x5b, 0x92, 0x3d, 0x50, 0x58, 0x45, 0x3c, 0xf9, 0x71, 0x45, 0x3f, 0x40, 0x1f, + 0x70, 0x3c, 0x98, 0xc2, 0xfc, 0x3c, 0xf9, 0xb6, 0x45, 0x3f, 0xd0, 0xc7, 0x80, 0x3d, 0x88, 0xbc, 0xe3, 0x3d, 0xc5, 0x53, 0x1e, 0x3f, 0x60, 0xa0, 0xc1, 0xbc, + 0x88, 0xe3, 0x3a, 0xbf, 0x0f, 0xfa, 0x1b, 0x3f, 0x90, 0x9e, 0xd3, 0x3d, 0x73, 0x38, 0x40, 0xbf, 0x3b, 0xc4, 0x1c, 0x3f, 0x60, 0xfe, 0x28, 0xbd, 0xcc, 0xbc, + 0x44, 0xbf, 0x80, 0xf9, 0x23, 0x3f, 0xe8, 0xef, 0x14, 0xbe, 0xa8, 0x8e, 0x24, 0xbf, 0x56, 0xeb, 0x1f, 0x3f, 0x80, 0x9e, 0xd4, 0xbb, 0x63, 0xbd, 0x30, 0xbf, + 0xd5, 0xaf, 0x21, 0x3f, 0xe0, 0x51, 0xfb, 0x3c, 0x3a, 0x42, 0x24, 0xbf, 0xb7, 0xe1, 0x1f, 0x3f, 0x30, 0x69, 0x8e, 0x3d, 0x67, 0x5f, 0x2e, 0xbf, 0x27, 0xd1, + 0x32, 0x3f, 0xdc, 0xc8, 0x41, 0xbe, 0xf2, 0xae, 0xef, 0xbe, 0x61, 0xd6, 0x2c, 0x3f, 0x70, 0x07, 0x6b, 0xbd, 0x1a, 0x9e, 0x03, 0xbf, 0xd6, 0xe5, 0x29, 0x3f, + 0x50, 0x05, 0x96, 0xbd, 0x98, 0xd6, 0x0c, 0xbf, 0x52, 0x0e, 0x19, 0x3f, 0xae, 0x56, 0x05, 0xbe, 0xdf, 0xeb, 0x48, 0xbf, 0x0e, 0x75, 0x24, 0x3f, 0x62, 0x97, + 0x3c, 0xbe, 0xa2, 0x4f, 0x30, 0xbf, 0x35, 0xf0, 0x70, 0x3e, 0x30, 0x67, 0x44, 0x3e, 0xb7, 0x2b, 0x81, 0xbf, 0x31, 0xf7, 0x68, 0x3e, 0x58, 0x2b, 0xbf, 0x3e, + 0x41, 0x55, 0x7d, 0xbf, 0x81, 0xbc, 0x3b, 0x3e, 0x34, 0x0b, 0x4a, 0x3e, 0x26, 0x05, 0x82, 0xbf, 0x5f, 0xc5, 0x97, 0x3e, 0x4c, 0xc1, 0x19, 0x3f, 0xf6, 0x7f, + 0x37, 0x3f, 0xde, 0x74, 0x9b, 0x3e, 0xb0, 0xa9, 0x20, 0x3f, 0x8a, 0xe6, 0x32, 0x3f, 0xbd, 0x9b, 0xd0, 0x3e, 0x8c, 0x99, 0x11, 0x3f, 0xea, 0x36, 0x2c, 0x3f, + 0x23, 0x4e, 0x07, 0x3f, 0x40, 0x5f, 0xfd, 0x3e, 0x0b, 0xec, 0x1a, 0x3f, 0x5e, 0xb9, 0x0b, 0x3f, 0x22, 0x1f, 0x0c, 0x3f, 0x55, 0x1e, 0x11, 0x3f, 0xa4, 0x2a, + 0x21, 0x3f, 0x68, 0x02, 0xde, 0x3e, 0x1e, 0x9e, 0x03, 0x3f, 0xb4, 0x9c, 0x42, 0x3f, 0x1c, 0x2c, 0x59, 0x3e, 0xd3, 0xe4, 0xa2, 0x3e, 0xc3, 0x78, 0x34, 0x3f, + 0xfe, 0x34, 0xab, 0x3e, 0x68, 0xb0, 0xd6, 0x3e, 0x49, 0x30, 0x38, 0x3f, 0xb8, 0xf1, 0xc5, 0x3e, 0x7f, 0x88, 0xbd, 0x3e, 0x89, 0xa3, 0x3c, 0x3f, 0xc8, 0x35, + 0xb8, 0x3d, 0xd2, 0x99, 0xc8, 0x3e, 0x93, 0xfe, 0x42, 0x3f, 0x00, 0x4e, 0x9a, 0xbc, 0x76, 0x74, 0x85, 0x3e, 0x58, 0xc3, 0x40, 0x3f, 0xfc, 0xa6, 0x9f, 0xbd, + 0x78, 0x77, 0x96, 0x3e, 0xbf, 0x3b, 0x29, 0x3e, 0xda, 0xa1, 0x2e, 0x3f, 0x60, 0x0b, 0x35, 0x3f, 0xea, 0x39, 0x15, 0x3e, 0x82, 0xb0, 0x21, 0x3f, 0x08, 0x91, + 0x3f, 0x3f, 0xf3, 0x67, 0x05, 0x3e, 0xc8, 0x40, 0x32, 0x3f, 0x84, 0x1a, 0x35, 0x3f, 0x3b, 0x23, 0x24, 0x3f, 0x58, 0x3e, 0xbf, 0x3e, 0x65, 0xb1, 0x1b, 0xbf, + 0x74, 0xee, 0x2c, 0x3f, 0x54, 0xc5, 0x8c, 0x3e, 0x43, 0x16, 0x03, 0xbf, 0xda, 0x71, 0x24, 0x3f, 0xc4, 0x00, 0xcb, 0x3e, 0xad, 0x34, 0x15, 0xbf, 0x16, 0xe9, + 0x34, 0x3f, 0xa0, 0xe1, 0xa8, 0xbc, 0x4a, 0x57, 0xd3, 0xbe, 0x18, 0x65, 0x3a, 0x3f, 0x9c, 0x00, 0x08, 0xbe, 0x60, 0xaf, 0xb0, 0xbe, 0x13, 0xe8, 0x37, 0x3f, + 0x20, 0xc5, 0x5e, 0xbc, 0xd4, 0xb4, 0xc2, 0xbe, 0xf6, 0xca, 0x46, 0xbf, 0x00, 0xe6, 0x62, 0xba, 0x4e, 0xd4, 0x02, 0x3e, 0xa0, 0xb3, 0x47, 0xbf, 0x80, 0xac, + 0xcd, 0xbc, 0xb8, 0x37, 0x47, 0x3d, 0x8c, 0x94, 0x44, 0xbf, 0x10, 0xe6, 0x75, 0x3d, 0xa5, 0xcf, 0x41, 0x3e, 0x0e, 0xbb, 0x44, 0xbf, 0x80, 0xf5, 0xa5, 0x3c, + 0xf6, 0x37, 0x5c, 0x3e, 0x03, 0x20, 0x47, 0xbf, 0xa0, 0xa6, 0x82, 0xbd, 0x80, 0xdf, 0xc0, 0xbb, 0x3b, 0x55, 0x43, 0xbf, 0xf0, 0x8b, 0x74, 0xbd, 0x62, 0x91, + 0xbc, 0xbd, 0xe2, 0x36, 0x1e, 0xbf, 0xd0, 0x2b, 0x4c, 0x3e, 0x4e, 0x6a, 0x3a, 0xbf, 0x70, 0xe2, 0x20, 0xbf, 0x4c, 0xbf, 0x11, 0x3e, 0x23, 0x04, 0x29, 0xbf, + 0x23, 0x94, 0x27, 0xbf, 0xc0, 0xe5, 0x6f, 0x3d, 0xce, 0x1a, 0x16, 0xbf, 0x45, 0x39, 0x2a, 0xbf, 0x50, 0xb2, 0x79, 0xbe, 0xec, 0xaf, 0x10, 0xbf, 0xa6, 0x96, + 0x31, 0xbf, 0xc0, 0xbd, 0xbc, 0x3d, 0xab, 0x3b, 0x00, 0xbf, 0xf6, 0xa0, 0x27, 0xbf, 0x20, 0x2b, 0x51, 0x3e, 0xd2, 0x36, 0x17, 0xbf, 0x26, 0xe3, 0x21, 0xbe, + 0xa0, 0x95, 0x3f, 0x3d, 0xf2, 0x68, 0x83, 0xbf, 0x40, 0xad, 0x0c, 0xbe, 0xd8, 0x42, 0xd3, 0xbd, 0xf7, 0xbe, 0x83, 0xbf, 0x95, 0xb3, 0x75, 0xbd, 0x58, 0xa2, + 0xe5, 0xbd, 0x6c, 0x4c, 0x84, 0xbf, 0x5a, 0x08, 0x86, 0xbd, 0x80, 0x14, 0x36, 0x3d, 0xae, 0xf1, 0x83, 0xbf, 0x1f, 0xf7, 0x68, 0xbe, 0xa0, 0x1a, 0x19, 0x3d, + 0xd9, 0x51, 0x82, 0xbf, 0x21, 0xf7, 0x68, 0xbe, 0x74, 0xff, 0xcb, 0xbd, 0x00, 0x86, 0x82, 0xbf, 0xea, 0x50, 0xb0, 0xbe, 0x20, 0x42, 0x04, 0x3d, 0xfc, 0x40, + 0x7a, 0xbf, 0x62, 0x52, 0xb2, 0xbe, 0x8c, 0xe5, 0xf8, 0xbd, 0x39, 0x0b, 0x78, 0xbf, 0x3b, 0x2d, 0xe4, 0xbe, 0xc0, 0xd7, 0xb2, 0x3c, 0x78, 0x29, 0x6e, 0xbf, + 0xdf, 0x21, 0xe6, 0xbe, 0x18, 0xc8, 0x0c, 0xbe, 0xb1, 0x6a, 0x6d, 0xbf, 0xa7, 0x05, 0x0b, 0xbf, 0x60, 0x86, 0x4d, 0xbc, 0xfc, 0xf5, 0x5e, 0xbf, 0x9c, 0xb0, + 0x0a, 0xbf, 0x30, 0x25, 0x00, 0xbe, 0x36, 0x9a, 0x5f, 0xbf, 0x01, 0x1f, 0x04, 0xbf, 0x58, 0xb2, 0x59, 0x3f, 0xae, 0x78, 0x90, 0x3e, 0x7e, 0x6e, 0x03, 0xbf, + 0xe6, 0xda, 0x5e, 0x3f, 0x18, 0xb9, 0x73, 0x3d, 0xb5, 0x19, 0xc5, 0xbe, 0xec, 0x70, 0x78, 0x3f, 0xe8, 0x1d, 0x4d, 0x3d, 0x0c, 0xa1, 0xbd, 0xbe, 0x8e, 0x83, + 0x72, 0x3f, 0x1e, 0x92, 0x8a, 0x3e, 0x98, 0x8a, 0x1a, 0xbf, 0x50, 0x80, 0x3c, 0x3f, 0x3f, 0x09, 0x8c, 0x3e, 0x34, 0xa7, 0x1e, 0xbf, 0xe8, 0x7f, 0x41, 0x3f, + 0xc8, 0x3c, 0x91, 0x3d, 0x88, 0xb0, 0xc5, 0xbe, 0x9c, 0xc7, 0x71, 0x3f, 0xa0, 0xa1, 0x1f, 0xbe, 0x08, 0x58, 0x03, 0xbf, 0xc0, 0xa1, 0x56, 0x3f, 0xb0, 0xde, + 0x0e, 0xbe, 0xca, 0x7c, 0x79, 0xbe, 0xba, 0x37, 0x82, 0x3f, 0xf8, 0xa8, 0x33, 0x3d, 0x58, 0x1c, 0x70, 0xbe, 0x24, 0x34, 0x7d, 0x3f, 0x7b, 0xab, 0x8d, 0x3e, + 0xe5, 0xee, 0xb1, 0xbe, 0x18, 0xdd, 0x5d, 0x3f, 0x76, 0x0d, 0xe5, 0x3e, 0x00, 0x5c, 0xf8, 0xbe, 0x90, 0x11, 0x48, 0x3f, 0xa6, 0xbe, 0xe0, 0x3e, 0x2a, 0x1b, + 0xc7, 0xbe, 0x78, 0x03, 0x44, 0x3f, 0x35, 0xcb, 0x12, 0xbf, 0xe4, 0x45, 0xc4, 0xbe, 0x82, 0x11, 0x27, 0x3f, 0x89, 0x1e, 0x3f, 0xbf, 0x0d, 0xc7, 0x5b, 0xbe, + 0x86, 0xdd, 0x36, 0x3f, 0x62, 0x83, 0x45, 0xbf, 0x14, 0x75, 0x5d, 0xbe, 0x92, 0xbd, 0x54, 0x3f, 0xc6, 0x81, 0x18, 0xbf, 0x52, 0x64, 0xff, 0xbe, 0x2c, 0x9b, + 0x2c, 0x3f, 0x95, 0xf4, 0x06, 0xbf, 0x43, 0x08, 0xfc, 0xbe, 0x8a, 0x63, 0x13, 0x3f, 0x9c, 0x54, 0x32, 0xbf, 0xe7, 0x45, 0xc4, 0xbe, 0x96, 0x58, 0x13, 0x3f, + 0x18, 0xcc, 0x51, 0xbf, 0xcc, 0x73, 0x64, 0xbe, 0x72, 0xff, 0x1c, 0x3f, 0xae, 0x0f, 0x5c, 0xbf, 0x4b, 0x3f, 0xae, 0xbd, 0xc4, 0xe8, 0x3d, 0x3f, 0xde, 0x2c, + 0x46, 0xbf, 0xa0, 0xb0, 0xab, 0xbd, 0x6c, 0xef, 0x5b, 0x3f, 0xfe, 0x21, 0x17, 0xbf, 0xf7, 0xdd, 0x60, 0xbe, 0x18, 0xdc, 0x6d, 0x3f, 0x98, 0x50, 0xcc, 0xbe, + 0x1b, 0x34, 0xc6, 0xbe, 0x00, 0x87, 0x5c, 0x3f, 0x49, 0xe7, 0xc1, 0xbe, 0xa3, 0x80, 0x36, 0xbf, 0x30, 0x42, 0xf4, 0x3d, 0x4e, 0xef, 0xdd, 0xbe, 0xa4, 0x5b, + 0x20, 0xbf, 0xa6, 0x46, 0x94, 0x3e, 0x4e, 0xd8, 0x2e, 0xbf, 0xb0, 0x60, 0x34, 0xbf, 0x88, 0xfb, 0xac, 0x3e, 0x6e, 0x28, 0xc6, 0xbe, 0x8e, 0xab, 0x3c, 0xbf, + 0xcc, 0x6c, 0x31, 0x3e, 0x81, 0xf8, 0xa3, 0xbe, 0xc1, 0xf1, 0x42, 0xbf, 0x04, 0x0b, 0x36, 0xbe, 0x0b, 0xa6, 0xa4, 0xbd, 0xae, 0x34, 0x3e, 0xbf, 0x54, 0x27, + 0x56, 0xbe, 0x48, 0xa0, 0x54, 0xbe, 0x55, 0xd0, 0x3e, 0xbf, 0xdc, 0x77, 0xb0, 0xbd, 0x90, 0x5b, 0x68, 0xbe, 0xe9, 0x50, 0xb0, 0xbe, 0xe4, 0x82, 0x3f, 0x3e, + 0x84, 0x74, 0x79, 0xbf, 0xf4, 0x2c, 0xe8, 0xbe, 0x1c, 0x6a, 0x1d, 0x3e, 0x30, 0x7f, 0x6c, 0xbf, 0x67, 0xb2, 0x91, 0x33, 0x9c, 0x7e, 0xe0, 0xbd, 0x90, 0xa9, + 0x82, 0xbf, 0x81, 0x31, 0xd8, 0x33, 0x40, 0x67, 0x16, 0x3d, 0x7a, 0x24, 0x83, 0xbf, 0xe0, 0xbd, 0x9a, 0xbd, 0x10, 0x4c, 0x57, 0x3e, 0x7a, 0x25, 0x82, 0xbf, + 0x21, 0x99, 0x30, 0xbf, 0x90, 0xd3, 0xaa, 0xbe, 0x1e, 0x66, 0x00, 0xbf, 0x4d, 0xe7, 0x2b, 0xbf, 0xe4, 0xea, 0xc0, 0xbe, 0xc6, 0xcf, 0x14, 0xbf, 0xf1, 0x36, + 0x29, 0xbf, 0x3e, 0x3b, 0x94, 0xbe, 0xe6, 0xad, 0x1e, 0xbf, 0x1f, 0xe3, 0x39, 0xbf, 0x22, 0x4e, 0x95, 0xbe, 0x12, 0xf7, 0xcd, 0xbe, 0x85, 0x06, 0x0a, 0xbf, + 0x0c, 0x49, 0x0d, 0x3e, 0x4e, 0xd3, 0x58, 0xbf, 0x76, 0x08, 0x86, 0x3d, 0x80, 0x14, 0x36, 0x3d, 0xae, 0xf1, 0x83, 0xbf, 0xbd, 0xb3, 0x75, 0x3d, 0x58, 0xa2, + 0xe5, 0xbd, 0x6c, 0x4c, 0x84, 0xbf, 0x3a, 0x64, 0x12, 0x34, 0x5c, 0x97, 0x4a, 0x3e, 0x1b, 0x3a, 0x83, 0xbf, 0xa5, 0x9a, 0xb0, 0xbd, 0xf0, 0x4b, 0xc5, 0x3e, + 0xad, 0x65, 0x80, 0xbf, 0xc0, 0xef, 0x3b, 0x34, 0x58, 0x64, 0xc3, 0x3e, 0xf5, 0x73, 0x81, 0xbf, 0x07, 0xbe, 0x9a, 0x3d, 0x14, 0x4c, 0x57, 0x3e, 0x79, 0x25, + 0x82, 0xbf, 0x9c, 0xc3, 0xbc, 0xbe, 0x04, 0xfc, 0xaf, 0x3e, 0x3f, 0x75, 0x71, 0xbf, 0x7f, 0x22, 0xf4, 0xbe, 0x24, 0x60, 0x9a, 0x3e, 0xde, 0x97, 0x61, 0xbf, + 0x07, 0x02, 0x11, 0xbf, 0x10, 0x05, 0x81, 0x3e, 0x06, 0x77, 0x4e, 0xbf, 0xb9, 0xe3, 0x3c, 0xbf, 0x94, 0x82, 0x7a, 0xbe, 0x41, 0xf4, 0x9f, 0xbe, 0xa1, 0x52, + 0x46, 0xbf, 0x2c, 0x85, 0x26, 0xbe, 0x00, 0x6d, 0xf5, 0xbb, 0x06, 0xac, 0x41, 0xbf, 0xe8, 0xd2, 0x87, 0x3d, 0x33, 0x81, 0xf4, 0xbd, 0x17, 0xda, 0x3c, 0xbf, + 0x40, 0x4e, 0xea, 0x3c, 0x7c, 0xa7, 0x85, 0xbe, 0x9e, 0xad, 0x41, 0xbf, 0xf0, 0x66, 0x5c, 0x3e, 0xdd, 0x88, 0x1b, 0xbe, 0x67, 0x5e, 0x20, 0xb2, 0x68, 0x63, + 0x28, 0x3f, 0x70, 0xa7, 0x40, 0x3f, 0x80, 0xf3, 0x9d, 0xb3, 0x0c, 0x9b, 0xdf, 0x3e, 0x7c, 0xf9, 0x5c, 0x3f, 0xb3, 0x9d, 0xfa, 0xbd, 0x40, 0x56, 0xdb, 0x3e, + 0x10, 0x96, 0x59, 0x3f, 0x9d, 0x9d, 0xfa, 0x3d, 0x40, 0x56, 0xdb, 0x3e, 0x10, 0x96, 0x59, 0x3f, 0x00, 0x51, 0x13, 0xb4, 0xf8, 0x2b, 0x4a, 0x3e, 0x61, 0xd2, + 0x70, 0x3f, 0xa9, 0xab, 0xea, 0xbd, 0x88, 0x76, 0x51, 0x3e, 0x08, 0x16, 0x6e, 0x3f, 0xd4, 0x98, 0x86, 0xbe, 0x30, 0xa9, 0xd1, 0x3e, 0xd6, 0xca, 0x51, 0x3f, + 0xcd, 0xf4, 0x7c, 0x32, 0x26, 0x86, 0x3b, 0x3f, 0x38, 0xc4, 0x32, 0x3f, 0x86, 0xab, 0xea, 0x3d, 0x88, 0x76, 0x51, 0x3e, 0x08, 0x16, 0x6e, 0x3f, 0xc4, 0x7a, + 0x80, 0xbe, 0xa8, 0x2c, 0x50, 0x3e, 0x10, 0x5a, 0x63, 0x3f, 0x35, 0x31, 0xc2, 0xbe, 0x82, 0x5d, 0xc0, 0x3e, 0xe7, 0xce, 0x45, 0x3f, 0x5f, 0x4e, 0xbe, 0xbe, + 0x8c, 0x3a, 0x41, 0x3e, 0xd0, 0x22, 0x58, 0x3f, 0x83, 0xf9, 0x00, 0xbf, 0x0a, 0x38, 0xa5, 0x3e, 0xb8, 0xc6, 0x32, 0x3f, 0xd9, 0x3d, 0xff, 0xbe, 0x38, 0x54, + 0x09, 0x3e, 0x73, 0x88, 0x44, 0x3f, 0x7c, 0x76, 0x1b, 0xbf, 0x30, 0x61, 0x8d, 0x3e, 0xe7, 0xff, 0x1b, 0x3f, 0x5b, 0xaf, 0xe2, 0xbe, 0x2c, 0x7c, 0x2a, 0x3f, + 0x05, 0xa2, 0x16, 0x3f, 0xf7, 0xee, 0x19, 0xbf, 0xe0, 0x7a, 0xc2, 0x3d, 0x1a, 0x9b, 0x2c, 0x3f, 0x30, 0xda, 0x2f, 0xbf, 0x40, 0xc7, 0x53, 0x3e, 0x88, 0xc2, + 0x01, 0x3f, 0x30, 0xaa, 0x2d, 0xbf, 0xe0, 0x29, 0xa2, 0x3c, 0x82, 0xf7, 0x11, 0x3f, 0xab, 0x68, 0x29, 0xbf, 0x66, 0xb1, 0x07, 0x3f, 0xf4, 0x88, 0xd1, 0x3e, + 0xaf, 0x73, 0x38, 0xbf, 0xe0, 0x41, 0x5f, 0xbd, 0xd6, 0x1d, 0xe5, 0x3e, 0x38, 0xed, 0x3e, 0xbf, 0x7a, 0x5a, 0x0b, 0xbe, 0x9a, 0x36, 0xa2, 0x3e, 0xe8, 0x9e, + 0x45, 0xbf, 0x8c, 0xb2, 0x7f, 0x3e, 0x83, 0x75, 0x78, 0x3e, 0x17, 0x85, 0x47, 0xbf, 0xc0, 0xb8, 0x7c, 0x3e, 0xdc, 0x0f, 0xe9, 0x3d, 0x05, 0x52, 0x43, 0xbf, + 0x50, 0xc7, 0x76, 0x3e, 0xa8, 0xd2, 0x8b, 0xbc, 0xd0, 0x33, 0x3f, 0xbf, 0xb2, 0x6b, 0xdf, 0x3e, 0x48, 0x4f, 0xd7, 0x3d, 0x88, 0x42, 0x3b, 0xbf, 0x12, 0x73, + 0xe1, 0x3e, 0x42, 0xa5, 0x85, 0x3e, 0xa6, 0x86, 0x3c, 0xbf, 0x30, 0xb3, 0xdb, 0x3e, 0xfc, 0x24, 0x50, 0xbd, 0x81, 0xc1, 0x64, 0x33, 0x7c, 0x2e, 0x58, 0x3f, + 0x8a, 0x5a, 0x19, 0x3f, 0xa1, 0xb3, 0xf5, 0xbd, 0x4a, 0x17, 0x53, 0x3f, 0x8f, 0x91, 0x19, 0x3f, 0x69, 0xff, 0x13, 0xbf, 0x68, 0x8a, 0xb5, 0x3e, 0x22, 0xc0, + 0x41, 0xbf, 0xde, 0x4d, 0xff, 0xbe, 0xf8, 0xc1, 0xda, 0x3e, 0xdd, 0x0d, 0x51, 0xbf, 0xa3, 0x47, 0xc2, 0xbe, 0x22, 0xf2, 0xfc, 0x3e, 0x2c, 0x94, 0x60, 0xbf, + 0x5a, 0x6f, 0xbb, 0xbd, 0x70, 0xcf, 0x09, 0x3f, 0x48, 0x48, 0x70, 0xbf, 0x18, 0xf7, 0x68, 0xbe, 0x26, 0xad, 0x06, 0x3f, 0xd1, 0xc1, 0x6c, 0xbf, 0xd4, 0x9a, + 0xb0, 0x3d, 0xf0, 0x4b, 0xc5, 0x3e, 0xad, 0x65, 0x80, 0xbf, 0x8d, 0x6c, 0x57, 0x34, 0xbe, 0xf0, 0x08, 0x3f, 0x1f, 0xbc, 0x73, 0xbf, 0xf7, 0xdb, 0x15, 0xbf, + 0xea, 0xaa, 0xe0, 0x3e, 0xec, 0x22, 0x2f, 0xbf, 0x9f, 0x0d, 0x00, 0xbf, 0xf8, 0x05, 0x02, 0x3f, 0x8c, 0x5b, 0x40, 0xbf, 0x63, 0xfe, 0xac, 0xbd, 0x82, 0x3c, + 0x22, 0x3f, 0x00, 0x55, 0x61, 0xbf, 0x90, 0x6f, 0xbb, 0x3d, 0x70, 0xcf, 0x09, 0x3f, 0x48, 0x48, 0x70, 0xbf, 0x4d, 0x75, 0x67, 0x34, 0xa8, 0xae, 0x24, 0x3f, + 0x46, 0x1f, 0x63, 0xbf, 0xce, 0xe8, 0x15, 0xbf, 0xf8, 0xf6, 0xf9, 0x3e, 0x61, 0xdf, 0x22, 0xbf, 0x9b, 0xfe, 0xac, 0x3d, 0x84, 0x3c, 0x22, 0x3f, 0xfe, 0x54, + 0x61, 0xbf, 0xb4, 0xc5, 0x70, 0x34, 0x64, 0x8b, 0x40, 0x3f, 0x8e, 0xe0, 0x46, 0xbf, 0xde, 0xcf, 0x16, 0xbf, 0x24, 0xfd, 0x15, 0x3f, 0x6a, 0xe1, 0xf9, 0xbe, + 0x2c, 0xe9, 0x27, 0xbf, 0x06, 0xc4, 0xf1, 0x3e, 0xe1, 0x4d, 0xe3, 0xbe, 0x88, 0x3f, 0xae, 0x3d, 0xc4, 0xe8, 0x3d, 0x3f, 0xdd, 0x2c, 0x46, 0xbf, 0xe7, 0xe0, + 0x71, 0x34, 0x0e, 0x7a, 0x5f, 0x3f, 0x48, 0xa6, 0x17, 0xbf, 0xdb, 0xb0, 0xab, 0x3d, 0x6c, 0xef, 0x5b, 0x3f, 0xfe, 0x21, 0x17, 0xbf, 0x01, 0xda, 0x68, 0x34, + 0xc0, 0x4b, 0x75, 0x3f, 0xa2, 0xfa, 0xca, 0xbe, 0xb5, 0x85, 0xc8, 0xbd, 0x52, 0xc6, 0x73, 0x3f, 0xd0, 0x43, 0xcc, 0xbe, 0xf2, 0x85, 0xc8, 0x3d, 0x52, 0xc6, + 0x73, 0x3f, 0xd0, 0x43, 0xcc, 0xbe, 0x34, 0xbe, 0x55, 0x34, 0x69, 0xd5, 0x82, 0x3f, 0x28, 0xf4, 0x2a, 0xbe, 0x6e, 0x4f, 0xc4, 0xbd, 0xc2, 0x00, 0x82, 0x3f, + 0x84, 0x26, 0x2a, 0xbe, 0xa7, 0x4f, 0xc4, 0x3d, 0xc2, 0x00, 0x82, 0x3f, 0x82, 0x26, 0x2a, 0xbe, 0xe7, 0x95, 0x3b, 0x34, 0x15, 0x14, 0x86, 0x3f, 0x38, 0xca, + 0x45, 0x3d, 0x07, 0x9f, 0xd9, 0xbd, 0x6c, 0x00, 0x85, 0x3f, 0x78, 0x23, 0x3e, 0x3d, 0x0c, 0x5b, 0x6e, 0xbe, 0x0c, 0x51, 0x7f, 0x3f, 0x1c, 0xf3, 0x29, 0xbe, + 0x39, 0x9f, 0xd9, 0x3d, 0x6c, 0x00, 0x85, 0x3f, 0x78, 0x23, 0x3e, 0x3d, 0x54, 0xce, 0x13, 0x34, 0xfb, 0xc2, 0x82, 0x3f, 0x21, 0x17, 0x8c, 0x3e, 0x34, 0x5b, + 0xd4, 0xbd, 0x17, 0x39, 0x82, 0x3f, 0xa8, 0x2f, 0x89, 0x3e, 0x5b, 0x5b, 0xd4, 0x3d, 0x17, 0x39, 0x82, 0x3f, 0xa8, 0x2f, 0x89, 0x3e, 0x74, 0xc7, 0xce, 0x33, + 0xf4, 0x93, 0x73, 0x3f, 0x0b, 0x5a, 0xeb, 0x3e, 0xf3, 0xba, 0xdc, 0xbd, 0x6a, 0xd6, 0x71, 0x3f, 0xbb, 0x8e, 0xe6, 0x3e, 0x0e, 0xbb, 0xdc, 0x3d, 0x6a, 0xd6, + 0x71, 0x3f, 0xbb, 0x8e, 0xe6, 0x3e, 0x82, 0x2e, 0x5d, 0xbe, 0xe8, 0x88, 0x6c, 0x3f, 0x39, 0xbf, 0xe4, 0x3e, 0xb2, 0xb3, 0xf5, 0x3d, 0x4a, 0x17, 0x53, 0x3f, + 0x90, 0x91, 0x19, 0x3f, 0xd5, 0x12, 0x40, 0xbe, 0xd2, 0xf2, 0x4c, 0x3f, 0x0a, 0x5d, 0x19, 0x3f, 0xf7, 0x3f, 0xa6, 0xbe, 0xd0, 0xd0, 0x3d, 0x3f, 0x46, 0x0f, + 0x1a, 0x3f, 0x95, 0xe8, 0x01, 0xbf, 0x2c, 0x50, 0x44, 0x3f, 0xf0, 0x68, 0xad, 0xbe, 0x19, 0xb1, 0x1a, 0xbf, 0x16, 0x3b, 0x2b, 0x3f, 0x12, 0xe0, 0x98, 0xbe, + 0x79, 0xd7, 0x1c, 0xbf, 0x7c, 0xca, 0x3a, 0x3f, 0x9c, 0xce, 0xe1, 0xbd, 0xd1, 0xa3, 0x15, 0xbf, 0xc4, 0x64, 0x2c, 0x3f, 0xca, 0x3f, 0xdb, 0x3e, 0x80, 0xea, + 0x2b, 0xbf, 0xbc, 0xc4, 0x0b, 0x3f, 0xa4, 0x3d, 0x82, 0xbe, 0x50, 0x64, 0x2e, 0xbf, 0x74, 0xc3, 0x17, 0x3f, 0x58, 0x35, 0xb8, 0xbd, 0x77, 0xb0, 0x2f, 0xbf, + 0xcc, 0x06, 0x1b, 0x3f, 0x54, 0x36, 0xa0, 0x3d, 0x22, 0xdf, 0x2d, 0xbf, 0xd4, 0x26, 0x16, 0x3f, 0xe5, 0x7e, 0x88, 0x3e, 0x51, 0xca, 0x38, 0xbf, 0x56, 0x2c, + 0xc9, 0x3e, 0xe4, 0x8c, 0x56, 0xbe, 0x9e, 0xb3, 0x47, 0x3f, 0x60, 0xac, 0xcd, 0xbc, 0xd4, 0x37, 0x47, 0x3d, 0xf6, 0xca, 0x46, 0x3f, 0x00, 0xe4, 0x62, 0xba, + 0x52, 0xd4, 0x02, 0x3e, 0x0d, 0xbb, 0x44, 0x3f, 0xa0, 0xf5, 0xa5, 0x3c, 0xf8, 0x37, 0x5c, 0x3e, 0x8a, 0x94, 0x44, 0x3f, 0x10, 0xe6, 0x75, 0x3d, 0xa9, 0xcf, + 0x41, 0x3e, 0x3b, 0x55, 0x43, 0x3f, 0xe8, 0x8b, 0x74, 0xbd, 0x58, 0x91, 0xbc, 0xbd, 0xff, 0x1f, 0x47, 0x3f, 0x9c, 0xa6, 0x82, 0xbd, 0xe0, 0xde, 0xc0, 0xbb, + 0x74, 0xe2, 0x20, 0x3f, 0x50, 0xbf, 0x11, 0x3e, 0x22, 0x04, 0x29, 0xbf, 0xe6, 0x36, 0x1e, 0x3f, 0xd0, 0x2b, 0x4c, 0x3e, 0x4e, 0x6a, 0x3a, 0xbf, 0x24, 0x94, + 0x27, 0x3f, 0xc0, 0xe5, 0x6f, 0x3d, 0xce, 0x1a, 0x16, 0xbf, 0x45, 0x39, 0x2a, 0x3f, 0x50, 0xb2, 0x79, 0xbe, 0xec, 0xaf, 0x10, 0xbf, 0xa8, 0x96, 0x31, 0x3f, + 0xc0, 0xbd, 0xbc, 0x3d, 0xaa, 0x3b, 0x00, 0xbf, 0xfb, 0xa0, 0x27, 0x3f, 0x20, 0x2b, 0x51, 0x3e, 0xd2, 0x36, 0x17, 0xbf, 0x49, 0xad, 0x0c, 0x3e, 0xd0, 0x42, + 0xd3, 0xbd, 0xf6, 0xbe, 0x83, 0xbf, 0x34, 0xe3, 0x21, 0x3e, 0xb0, 0x95, 0x3f, 0x3d, 0xf1, 0x68, 0x83, 0xbf, 0x2a, 0xf7, 0x68, 0x3e, 0x70, 0xff, 0xcb, 0xbd, + 0xff, 0x85, 0x82, 0xbf, 0x2c, 0xf7, 0x68, 0x3e, 0xa0, 0x1a, 0x19, 0x3d, 0xd9, 0x51, 0x82, 0xbf, 0x64, 0x52, 0xb2, 0x3e, 0x84, 0xe5, 0xf8, 0xbd, 0x36, 0x0b, + 0x78, 0xbf, 0xef, 0x50, 0xb0, 0x3e, 0x20, 0x42, 0x04, 0x3d, 0xfc, 0x40, 0x7a, 0xbf, 0xe3, 0x21, 0xe6, 0x3e, 0x16, 0xc8, 0x0c, 0xbe, 0xb0, 0x6a, 0x6d, 0xbf, + 0x41, 0x2d, 0xe4, 0x3e, 0xe0, 0xd7, 0xb2, 0x3c, 0x75, 0x29, 0x6e, 0xbf, 0x9e, 0xb0, 0x0a, 0x3f, 0x30, 0x25, 0x00, 0xbe, 0x35, 0x9a, 0x5f, 0xbf, 0xa9, 0x05, + 0x0b, 0x3f, 0x40, 0x86, 0x4d, 0xbc, 0xfa, 0xf5, 0x5e, 0xbf, 0x14, 0xa1, 0xbd, 0x3e, 0x90, 0x83, 0x72, 0x3f, 0x22, 0x92, 0x8a, 0x3e, 0xbe, 0x19, 0xc5, 0x3e, + 0xec, 0x70, 0x78, 0x3f, 0xe8, 0x1d, 0x4d, 0x3d, 0x83, 0x6e, 0x03, 0x3f, 0xe6, 0xda, 0x5e, 0x3f, 0x18, 0xb9, 0x73, 0x3d, 0x05, 0x1f, 0x04, 0x3f, 0x58, 0xb2, + 0x59, 0x3f, 0xb0, 0x78, 0x90, 0x3e, 0x69, 0x1c, 0x70, 0x3e, 0x24, 0x34, 0x7d, 0x3f, 0x7b, 0xab, 0x8d, 0x3e, 0xdf, 0x7c, 0x79, 0x3e, 0xba, 0x37, 0x82, 0x3f, + 0xf8, 0xa8, 0x33, 0x3d, 0x0d, 0x58, 0x03, 0x3f, 0xc0, 0xa1, 0x56, 0x3f, 0xae, 0xde, 0x0e, 0xbe, 0x95, 0xb0, 0xc5, 0x3e, 0x9e, 0xc7, 0x71, 0x3f, 0x9a, 0xa1, + 0x1f, 0xbe, 0x37, 0xa7, 0x1e, 0x3f, 0xe8, 0x7f, 0x41, 0x3f, 0xd4, 0x3c, 0x91, 0x3d, 0x9c, 0x8a, 0x1a, 0x3f, 0x52, 0x80, 0x3c, 0x3f, 0x45, 0x09, 0x8c, 0x3e, + 0x04, 0x5c, 0xf8, 0x3e, 0x90, 0x11, 0x48, 0x3f, 0xaa, 0xbe, 0xe0, 0x3e, 0xec, 0xee, 0xb1, 0x3e, 0x18, 0xdd, 0x5d, 0x3f, 0x78, 0x0d, 0xe5, 0x3e, 0x30, 0x75, + 0x5d, 0x3e, 0x92, 0xbd, 0x54, 0x3f, 0xc6, 0x81, 0x18, 0xbf, 0x28, 0xc7, 0x5b, 0x3e, 0x86, 0xdd, 0x36, 0x3f, 0x60, 0x83, 0x45, 0xbf, 0xf3, 0x45, 0xc4, 0x3e, + 0x82, 0x11, 0x27, 0x3f, 0x88, 0x1e, 0x3f, 0xbf, 0x37, 0x1b, 0xc7, 0x3e, 0x78, 0x03, 0x44, 0x3f, 0x35, 0xcb, 0x12, 0xbf, 0xe8, 0x73, 0x64, 0x3e, 0x72, 0xff, + 0x1c, 0x3f, 0xae, 0x0f, 0x5c, 0xbf, 0xf0, 0x45, 0xc4, 0x3e, 0x98, 0x58, 0x13, 0x3f, 0x17, 0xcc, 0x51, 0xbf, 0x53, 0x08, 0xfc, 0x3e, 0x8a, 0x63, 0x13, 0x3f, + 0x9c, 0x54, 0x32, 0xbf, 0x60, 0x64, 0xff, 0x3e, 0x2c, 0x9b, 0x2c, 0x3f, 0x94, 0xf4, 0x06, 0xbf, 0x29, 0x34, 0xc6, 0x3e, 0x00, 0x87, 0x5c, 0x3f, 0x48, 0xe7, + 0xc1, 0xbe, 0x14, 0xde, 0x60, 0x3e, 0x18, 0xdc, 0x6d, 0x3f, 0x98, 0x50, 0xcc, 0xbe, 0xa7, 0x80, 0x36, 0x3f, 0x38, 0x42, 0xf4, 0x3d, 0x4a, 0xef, 0xdd, 0xbe, + 0xaa, 0x5b, 0x20, 0x3f, 0xa8, 0x46, 0x94, 0x3e, 0x4e, 0xd8, 0x2e, 0xbf, 0x8e, 0xab, 0x3c, 0x3f, 0xcc, 0x6c, 0x31, 0x3e, 0x7f, 0xf8, 0xa3, 0xbe, 0xb3, 0x60, + 0x34, 0x3f, 0x8a, 0xfb, 0xac, 0x3e, 0x6a, 0x28, 0xc6, 0xbe, 0x51, 0xd0, 0x3e, 0x3f, 0xd8, 0x77, 0xb0, 0xbd, 0x8a, 0x5b, 0x68, 0xbe, 0xac, 0x34, 0x3e, 0x3f, + 0x54, 0x27, 0x56, 0xbe, 0x43, 0xa0, 0x54, 0xbe, 0xbd, 0xf1, 0x42, 0x3f, 0x02, 0x0b, 0x36, 0xbe, 0xfe, 0xa5, 0xa4, 0xbd, 0xfe, 0x2c, 0xe8, 0x3e, 0x1c, 0x6a, + 0x1d, 0x3e, 0x30, 0x7f, 0x6c, 0xbf, 0xf0, 0x50, 0xb0, 0x3e, 0xe8, 0x82, 0x3f, 0x3e, 0x82, 0x74, 0x79, 0xbf, 0xee, 0x36, 0x29, 0x3f, 0x3c, 0x3b, 0x94, 0xbe, + 0xe4, 0xad, 0x1e, 0xbf, 0x4c, 0xe7, 0x2b, 0x3f, 0xe3, 0xea, 0xc0, 0xbe, 0xc5, 0xcf, 0x14, 0xbf, 0x21, 0x99, 0x30, 0x3f, 0x90, 0xd3, 0xaa, 0xbe, 0x1d, 0x66, + 0x00, 0xbf, 0x1e, 0xe3, 0x39, 0x3f, 0x21, 0x4e, 0x95, 0xbe, 0x10, 0xf7, 0xcd, 0xbe, 0x88, 0x06, 0x0a, 0x3f, 0x08, 0x49, 0x0d, 0x3e, 0x50, 0xd3, 0x58, 0xbf, + 0xa5, 0xc3, 0xbc, 0x3e, 0x04, 0xfc, 0xaf, 0x3e, 0x3e, 0x75, 0x71, 0xbf, 0x89, 0x22, 0xf4, 0x3e, 0x26, 0x60, 0x9a, 0x3e, 0xde, 0x97, 0x61, 0xbf, 0x0b, 0x02, + 0x11, 0x3f, 0x10, 0x05, 0x81, 0x3e, 0x06, 0x77, 0x4e, 0xbf, 0xb8, 0xe3, 0x3c, 0x3f, 0x94, 0x82, 0x7a, 0xbe, 0x3e, 0xf4, 0x9f, 0xbe, 0x9c, 0x52, 0x46, 0x3f, + 0x2c, 0x85, 0x26, 0xbe, 0x50, 0x6c, 0xf5, 0xbb, 0x18, 0xda, 0x3c, 0x3f, 0x40, 0x4e, 0xea, 0x3c, 0x78, 0xa7, 0x85, 0xbe, 0x02, 0xac, 0x41, 0x3f, 0xe8, 0xd2, + 0x87, 0x3d, 0x26, 0x81, 0xf4, 0xbd, 0x9e, 0xad, 0x41, 0x3f, 0xf4, 0x66, 0x5c, 0x3e, 0xd8, 0x88, 0x1b, 0xbe, 0xcf, 0x98, 0x86, 0x3e, 0x30, 0xa9, 0xd1, 0x3e, + 0xd8, 0xca, 0x51, 0x3f, 0xb9, 0x7a, 0x80, 0x3e, 0xa8, 0x2c, 0x50, 0x3e, 0x12, 0x5a, 0x63, 0x3f, 0x31, 0x31, 0xc2, 0x3e, 0x84, 0x5d, 0xc0, 0x3e, 0xe8, 0xce, + 0x45, 0x3f, 0x58, 0x4e, 0xbe, 0x3e, 0x8c, 0x3a, 0x41, 0x3e, 0xd0, 0x22, 0x58, 0x3f, 0x81, 0xf9, 0x00, 0x3f, 0x0c, 0x38, 0xa5, 0x3e, 0xba, 0xc6, 0x32, 0x3f, + 0xd3, 0x3d, 0xff, 0x3e, 0x3c, 0x54, 0x09, 0x3e, 0x74, 0x88, 0x44, 0x3f, 0x7a, 0x76, 0x1b, 0x3f, 0x30, 0x61, 0x8d, 0x3e, 0xe8, 0xff, 0x1b, 0x3f, 0x5d, 0xaf, + 0xe2, 0x3e, 0x2e, 0x7c, 0x2a, 0x3f, 0x08, 0xa2, 0x16, 0x3f, 0xf4, 0xee, 0x19, 0x3f, 0xe0, 0x7a, 0xc2, 0x3d, 0x1c, 0x9b, 0x2c, 0x3f, 0x30, 0xda, 0x2f, 0x3f, + 0x40, 0xc7, 0x53, 0x3e, 0x89, 0xc2, 0x01, 0x3f, 0x2f, 0xaa, 0x2d, 0x3f, 0x00, 0x2a, 0xa2, 0x3c, 0x83, 0xf7, 0x11, 0x3f, 0xad, 0x68, 0x29, 0x3f, 0x66, 0xb1, + 0x07, 0x3f, 0xf6, 0x88, 0xd1, 0x3e, 0xa9, 0x73, 0x38, 0x3f, 0xe0, 0x41, 0x5f, 0xbd, 0xd8, 0x1d, 0xe5, 0x3e, 0x32, 0xed, 0x3e, 0x3f, 0x7a, 0x5a, 0x0b, 0xbe, + 0x9b, 0x36, 0xa2, 0x3e, 0xe3, 0x9e, 0x45, 0x3f, 0x90, 0xb2, 0x7f, 0x3e, 0x85, 0x75, 0x78, 0x3e, 0x17, 0x85, 0x47, 0x3f, 0xc0, 0xb8, 0x7c, 0x3e, 0xe4, 0x0f, + 0xe9, 0x3d, 0x85, 0x42, 0x3b, 0x3f, 0x12, 0x73, 0xe1, 0x3e, 0x44, 0xa5, 0x85, 0x3e, 0xd0, 0x33, 0x3f, 0x3f, 0xb4, 0x6b, 0xdf, 0x3e, 0x50, 0x4f, 0xd7, 0x3d, + 0x05, 0x52, 0x43, 0x3f, 0x54, 0xc7, 0x76, 0x3e, 0x78, 0xd2, 0x8b, 0xbc, 0xa7, 0x86, 0x3c, 0x3f, 0x30, 0xb3, 0xdb, 0x3e, 0xec, 0x24, 0x50, 0xbd, 0x6e, 0xff, + 0x13, 0x3f, 0x6a, 0x8a, 0xb5, 0x3e, 0x20, 0xc0, 0x41, 0xbf, 0xe6, 0x4d, 0xff, 0x3e, 0xf8, 0xc1, 0xda, 0x3e, 0xdd, 0x0d, 0x51, 0xbf, 0xaf, 0x47, 0xc2, 0x3e, + 0x24, 0xf2, 0xfc, 0x3e, 0x2a, 0x94, 0x60, 0xbf, 0x35, 0xf7, 0x68, 0x3e, 0x26, 0xad, 0x06, 0x3f, 0xd1, 0xc1, 0x6c, 0xbf, 0xff, 0xdb, 0x15, 0x3f, 0xec, 0xaa, + 0xe0, 0x3e, 0xea, 0x22, 0x2f, 0xbf, 0xa5, 0x0d, 0x00, 0x3f, 0xf8, 0x05, 0x02, 0x3f, 0x8c, 0x5b, 0x40, 0xbf, 0xd4, 0xe8, 0x15, 0x3f, 0xf8, 0xf6, 0xf9, 0x3e, + 0x60, 0xdf, 0x22, 0xbf, 0x30, 0xe9, 0x27, 0x3f, 0x06, 0xc4, 0xf1, 0x3e, 0xde, 0x4d, 0xe3, 0xbe, 0xe3, 0xcf, 0x16, 0x3f, 0x24, 0xfd, 0x15, 0x3f, 0x67, 0xe1, + 0xf9, 0xbe, 0x24, 0x5b, 0x6e, 0x3e, 0x0c, 0x51, 0x7f, 0x3f, 0x1a, 0xf3, 0x29, 0xbe, 0x8f, 0x2e, 0x5d, 0x3e, 0xe8, 0x88, 0x6c, 0x3f, 0x3f, 0xbf, 0xe4, 0x3e, + 0xdc, 0x12, 0x40, 0x3e, 0xd4, 0xf2, 0x4c, 0x3f, 0x0c, 0x5d, 0x19, 0x3f, 0xf7, 0x3f, 0xa6, 0x3e, 0xd0, 0xd0, 0x3d, 0x3f, 0x48, 0x0f, 0x1a, 0x3f, 0x9a, 0xe8, + 0x01, 0x3f, 0x2c, 0x50, 0x44, 0x3f, 0xee, 0x68, 0xad, 0xbe, 0x1f, 0xb1, 0x1a, 0x3f, 0x16, 0x3b, 0x2b, 0x3f, 0x10, 0xe0, 0x98, 0xbe, 0x7f, 0xd7, 0x1c, 0x3f, + 0x7c, 0xca, 0x3a, 0x3f, 0x90, 0xce, 0xe1, 0xbd, 0xd2, 0xa3, 0x15, 0x3f, 0xc4, 0x64, 0x2c, 0x3f, 0xcc, 0x3f, 0xdb, 0x3e, 0x83, 0xea, 0x2b, 0x3f, 0xbc, 0xc4, + 0x0b, 0x3f, 0xa2, 0x3d, 0x82, 0xbe, 0x53, 0x64, 0x2e, 0x3f, 0x74, 0xc3, 0x17, 0x3f, 0x4c, 0x35, 0xb8, 0xbd, 0x78, 0xb0, 0x2f, 0x3f, 0xce, 0x06, 0x1b, 0x3f, + 0x5c, 0x36, 0xa0, 0x3d, 0x24, 0xdf, 0x2d, 0x3f, 0xd4, 0x26, 0x16, 0x3f, 0xe5, 0x7e, 0x88, 0x3e, 0x55, 0xca, 0x38, 0x3f, 0x58, 0x2c, 0xc9, 0x3e, 0xde, 0x8c, + 0x56, 0xbe, 0x94, 0xa0, 0x49, 0xb4, 0xa0, 0xe5, 0x1c, 0xbc, 0xae, 0xbf, 0x79, 0x3f, 0xcb, 0xac, 0xda, 0xbd, 0xc0, 0xf9, 0xeb, 0xbb, 0x0b, 0xea, 0x76, 0x3f, + 0x9a, 0xac, 0xda, 0x3d, 0x00, 0xf9, 0xeb, 0xbb, 0x0f, 0xea, 0x76, 0x3f, 0x10, 0xfd, 0x70, 0xbe, 0x00, 0xb0, 0x5f, 0xbc, 0xcc, 0xd3, 0x70, 0x3f, 0xde, 0x51, + 0xba, 0xbe, 0x90, 0x00, 0x99, 0xbc, 0x42, 0xc6, 0x64, 0x3f, 0xe7, 0x17, 0xf7, 0xbe, 0xd0, 0x4e, 0x62, 0xbd, 0x87, 0xc8, 0x50, 0x3f, 0x5d, 0xa8, 0x19, 0xbf, + 0xd8, 0xb4, 0xd6, 0xbd, 0xc0, 0x0a, 0x34, 0x3f, 0xc2, 0x26, 0x2b, 0xbf, 0xec, 0x3f, 0x2f, 0xbe, 0x18, 0x3b, 0x18, 0x3f, 0xf2, 0xcc, 0x35, 0xbf, 0x3c, 0xd3, + 0x72, 0xbe, 0xa5, 0x37, 0xee, 0x3e, 0x70, 0xdc, 0x3d, 0xbf, 0x98, 0xd7, 0x56, 0xbe, 0x2b, 0x47, 0xb1, 0x3e, 0xf5, 0xfc, 0x70, 0x3e, 0x00, 0xb0, 0x5f, 0xbc, + 0xcc, 0xd3, 0x70, 0x3f, 0xd1, 0x51, 0xba, 0x3e, 0x90, 0x00, 0x99, 0xbc, 0x42, 0xc6, 0x64, 0x3f, 0xdc, 0x17, 0xf7, 0x3e, 0xd0, 0x4e, 0x62, 0xbd, 0x87, 0xc8, + 0x50, 0x3f, 0x57, 0xa8, 0x19, 0x3f, 0xd0, 0xb4, 0xd6, 0xbd, 0xc2, 0x0a, 0x34, 0x3f, 0xbd, 0x26, 0x2b, 0x3f, 0xe8, 0x3f, 0x2f, 0xbe, 0x1b, 0x3b, 0x18, 0x3f, + 0xec, 0xcc, 0x35, 0x3f, 0x3a, 0xd3, 0x72, 0xbe, 0xa7, 0x37, 0xee, 0x3e, 0x6b, 0xdc, 0x3d, 0x3f, 0x96, 0xd7, 0x56, 0xbe, 0x2d, 0x47, 0xb1, 0x3e, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x17, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x24, 0x00, + 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x2f, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x35, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x3b, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, + 0x42, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x48, 0x00, + 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x51, 0x00, + 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, + 0x55, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x0b, 0x00, + 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x59, 0x00, + 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x5f, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x61, 0x00, + 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, + 0x64, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x65, 0x00, + 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, + 0x69, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x6b, 0x00, + 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, + 0x6c, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x6e, 0x00, + 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, + 0x72, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x73, 0x00, + 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, + 0x79, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x7b, 0x00, + 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, + 0x7d, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x59, 0x00, + 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x22, 0x00, + 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, + 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x85, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x11, 0x00, + 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x89, 0x00, + 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, + 0x8a, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x8d, 0x00, + 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, + 0x87, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x5d, 0x00, + 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, + 0x93, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x91, 0x00, + 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, + 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, + 0x86, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x97, 0x00, + 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x25, 0x00, + 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, + 0x25, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x52, 0x00, + 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, + 0x84, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x53, 0x00, + 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x9c, 0x00, + 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0x9d, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x46, 0x00, + 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x00, + 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, + 0xa5, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0xa2, 0x00, + 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, + 0xa7, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x00, + 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, + 0xa8, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, 0xa9, 0x00, + 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, + 0xa9, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0x15, 0x00, + 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, + 0xac, 0x00, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0xa9, 0x00, + 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, + 0xab, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0xab, 0x00, 0x00, 0x00, 0x1d, 0x00, + 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0xaf, 0x00, + 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, + 0x1a, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x1d, 0x00, + 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, + 0x51, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb4, 0x00, + 0x00, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xb5, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb3, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xb7, 0x00, + 0x00, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x9a, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb5, 0x00, + 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, + 0x9d, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x54, 0x00, + 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, + 0x96, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x95, 0x00, + 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, + 0xbe, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x94, 0x00, + 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, + 0xc1, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0xc2, 0x00, + 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, 0x59, 0x00, 0x00, 0x00, + 0x55, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xc2, 0x00, + 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, + 0x95, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xbc, 0x00, + 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, + 0xbf, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0x00, 0xc5, 0x00, + 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, + 0xc1, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0xc2, 0x00, + 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, + 0x77, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x73, 0x00, + 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, + 0x7a, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0xc1, 0x00, + 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, + 0x7a, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0xcb, 0x00, + 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0xc7, 0x00, 0x00, 0x00, + 0x77, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xcc, 0x00, + 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0xc9, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0xcd, 0x00, + 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, + 0xd1, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0xcd, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0xd2, 0x00, + 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, + 0x7c, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0xd2, 0x00, + 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, + 0xd6, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0xd7, 0x00, + 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, + 0xd2, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0xd6, 0x00, + 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, + 0xd3, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0xd8, 0x00, + 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, + 0xd6, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0xdb, 0x00, + 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, + 0xb9, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0xdd, 0x00, + 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, + 0xb9, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xe1, 0x00, + 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, + 0xa4, 0x00, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, + 0x7d, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x6c, 0x00, + 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, + 0x6f, 0x00, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xdf, 0x00, + 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, + 0x72, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x7d, 0x00, + 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0xe2, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x13, 0x00, + 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, + 0xe4, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0xe5, 0x00, + 0x00, 0x00, 0xe5, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0xe3, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, + 0x6b, 0x00, 0x00, 0x00, 0xe5, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0xe6, 0x00, 0x00, 0x00, 0xe6, 0x00, + 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, + 0xe6, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0xe7, 0x00, + 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0xe5, 0x00, 0x00, 0x00, 0xe5, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, + 0xe7, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0xe5, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0xe8, 0x00, + 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, + 0xea, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0xe6, 0x00, 0x00, 0x00, 0xe6, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0xb0, 0x00, + 0x00, 0x00, 0xe6, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, + 0xcb, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0xe7, 0x00, + 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, + 0xb8, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0xb6, 0x00, + 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, + 0xb7, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xe9, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, + 0x9c, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0xb5, 0x00, + 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0xb3, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0xb3, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x9b, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x7e, 0x00, + 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, + 0x29, 0x00, 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0xf0, 0x00, + 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xf2, 0x00, + 0x00, 0x00, 0xf3, 0x00, 0x00, 0x00, 0xf3, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x33, 0x00, + 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, + 0x4b, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x2f, 0x00, + 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0xf5, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, + 0x33, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0xf6, 0x00, + 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, + 0xf4, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, 0xf2, 0x00, + 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, + 0xf9, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xfb, 0x00, + 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x04, 0x01, + 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, + 0x06, 0x01, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x03, 0x01, + 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, + 0x04, 0x01, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, 0x0d, 0x01, 0x00, 0x00, 0x0d, 0x01, 0x00, 0x00, 0x02, 0x01, + 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, + 0x0e, 0x01, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0x0f, 0x01, + 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x12, 0x01, 0x00, 0x00, 0x12, 0x01, 0x00, 0x00, 0x13, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, + 0x14, 0x01, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0x11, 0x01, + 0x00, 0x00, 0x16, 0x01, 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, + 0xf7, 0x00, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, 0x49, 0x00, + 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x19, 0x01, 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, + 0x18, 0x01, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x1a, 0x01, 0x00, 0x00, 0x1b, 0x01, 0x00, 0x00, 0x49, 0x00, + 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x1a, 0x01, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x1d, 0x01, 0x00, 0x00, 0x1e, 0x01, 0x00, 0x00, + 0x1e, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x1f, 0x01, 0x00, 0x00, 0x1f, 0x01, + 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, + 0x36, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x8f, 0x00, 0x00, 0x00, 0xf9, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, + 0x8f, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x22, 0x01, 0x00, 0x00, 0x23, 0x01, 0x00, 0x00, 0x23, 0x01, 0x00, 0x00, 0xf5, 0x00, 0x00, 0x00, 0x21, 0x01, + 0x00, 0x00, 0xf5, 0x00, 0x00, 0x00, 0x23, 0x01, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0xf5, 0x00, 0x00, 0x00, + 0x2d, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0x21, 0x01, 0x00, 0x00, 0xf5, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x25, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x94, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0x37, 0x00, + 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x25, 0x01, 0x00, 0x00, 0x25, 0x01, 0x00, 0x00, 0x1f, 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x1f, 0x01, + 0x00, 0x00, 0x1f, 0x01, 0x00, 0x00, 0x27, 0x01, 0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0x27, 0x01, 0x00, 0x00, 0x1f, 0x01, 0x00, 0x00, 0x25, 0x01, 0x00, 0x00, + 0x25, 0x01, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00, 0x27, 0x01, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00, 0x25, 0x01, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x2b, 0x00, + 0x00, 0x00, 0xf3, 0x00, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, 0x29, 0x01, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x29, 0x01, 0x00, 0x00, 0x29, 0x01, 0x00, 0x00, 0x1d, 0x01, + 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x2a, 0x01, 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x1e, 0x01, 0x00, 0x00, + 0x2a, 0x01, 0x00, 0x00, 0x2b, 0x01, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x2b, 0x01, + 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x2b, 0x01, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, + 0x2c, 0x01, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x2d, 0x01, + 0x00, 0x00, 0x1a, 0x01, 0x00, 0x00, 0x2b, 0x01, 0x00, 0x00, 0x2b, 0x01, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x2d, 0x01, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, + 0x2e, 0x01, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x2e, 0x01, 0x00, 0x00, 0x2f, 0x01, + 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x2e, 0x01, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, + 0x2e, 0x01, 0x00, 0x00, 0x2e, 0x01, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x39, 0x00, + 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0x31, 0x01, 0x00, 0x00, 0x2f, 0x01, 0x00, 0x00, + 0x2f, 0x01, 0x00, 0x00, 0x2e, 0x01, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x32, 0x01, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0x30, 0x01, + 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x32, 0x01, 0x00, 0x00, 0x33, 0x01, 0x00, 0x00, 0x31, 0x01, 0x00, 0x00, 0x31, 0x01, 0x00, 0x00, + 0x30, 0x01, 0x00, 0x00, 0x32, 0x01, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x32, 0x01, 0x00, 0x00, 0x32, 0x01, 0x00, 0x00, 0x3c, 0x00, + 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x35, 0x01, 0x00, 0x00, + 0x3d, 0x00, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x36, 0x01, 0x00, 0x00, 0x33, 0x01, 0x00, 0x00, 0x33, 0x01, 0x00, 0x00, 0x32, 0x01, 0x00, 0x00, 0x34, 0x01, + 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x37, 0x01, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, + 0x37, 0x01, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, 0x36, 0x01, 0x00, 0x00, 0x36, 0x01, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x37, 0x01, 0x00, 0x00, 0x41, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x39, 0x01, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x37, 0x01, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x37, 0x01, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x3a, 0x01, + 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, 0x37, 0x01, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0xee, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x3a, 0x01, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x44, 0x00, + 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x3b, 0x01, 0x00, 0x00, 0x3a, 0x01, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x3f, 0x00, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0x3d, 0x01, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x29, 0x00, + 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0x3e, 0x01, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0x3d, 0x01, 0x00, 0x00, 0x3d, 0x01, 0x00, 0x00, + 0x3c, 0x01, 0x00, 0x00, 0x3e, 0x01, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x3d, 0x01, + 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x2d, 0x01, 0x00, 0x00, 0x2d, 0x01, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, + 0x27, 0x00, 0x00, 0x00, 0x3d, 0x01, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0x41, 0x01, 0x00, 0x00, 0x41, 0x01, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x3d, 0x01, + 0x00, 0x00, 0x19, 0x01, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00, 0xf3, 0x00, 0x00, 0x00, 0x19, 0x01, 0x00, 0x00, + 0x42, 0x01, 0x00, 0x00, 0x43, 0x01, 0x00, 0x00, 0x27, 0x01, 0x00, 0x00, 0x27, 0x01, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x43, 0x01, + 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0x27, 0x01, 0x00, 0x00, 0x43, 0x01, 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, + 0xc5, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x46, 0x01, + 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x19, 0x01, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0xf7, 0x00, 0x00, 0x00, + 0x19, 0x01, 0x00, 0x00, 0x19, 0x01, 0x00, 0x00, 0xf3, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x43, 0x01, + 0x00, 0x00, 0x43, 0x01, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x46, 0x01, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x13, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, + 0x44, 0x01, 0x00, 0x00, 0x43, 0x01, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x37, 0x00, + 0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x13, 0x01, 0x00, 0x00, 0x12, 0x01, 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, 0x45, 0x01, 0x00, 0x00, + 0x44, 0x01, 0x00, 0x00, 0x13, 0x01, 0x00, 0x00, 0x12, 0x01, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x45, 0x01, + 0x00, 0x00, 0x12, 0x01, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x46, 0x01, 0x00, 0x00, 0x46, 0x01, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x4a, 0x00, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x46, 0x01, 0x00, 0x00, 0x48, 0x01, + 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x13, 0x01, 0x00, 0x00, 0x13, 0x01, 0x00, 0x00, 0x47, 0x01, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, + 0x0f, 0x01, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x12, 0x01, 0x00, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x49, 0x01, + 0x00, 0x00, 0x4a, 0x01, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, + 0x4a, 0x01, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0x48, 0x01, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x00, 0x17, 0x01, + 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, 0x4b, 0x01, 0x00, 0x00, + 0xd4, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, 0x4b, 0x01, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0xd8, 0x00, + 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x4b, 0x01, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, + 0xdb, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0xde, 0x00, 0x00, 0x00, 0xde, 0x00, + 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, + 0xde, 0x00, 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0x16, 0x01, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x4b, 0x01, 0x00, 0x00, 0x4b, 0x01, 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, + 0x16, 0x01, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x4b, 0x01, 0x00, 0x00, 0x09, 0x01, + 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x0d, 0x01, 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, + 0x0d, 0x01, 0x00, 0x00, 0x4e, 0x01, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x0d, 0x01, 0x00, 0x00, 0x4e, 0x01, + 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, 0x4e, 0x01, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00, + 0x4f, 0x01, 0x00, 0x00, 0x16, 0x01, 0x00, 0x00, 0x16, 0x01, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00, 0x4f, 0x01, 0x00, 0x00, 0x08, 0x01, + 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x16, 0x01, 0x00, 0x00, 0x4f, 0x01, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, 0x35, 0x01, 0x00, 0x00, + 0x4e, 0x01, 0x00, 0x00, 0x4e, 0x01, 0x00, 0x00, 0x0d, 0x01, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, 0x35, 0x01, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x3a, 0x00, + 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x00, 0x00, 0x35, 0x01, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x4f, 0x01, 0x00, 0x00, + 0x4f, 0x01, 0x00, 0x00, 0x15, 0x01, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x51, 0x01, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x08, 0x01, + 0x00, 0x00, 0x4f, 0x01, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x51, 0x01, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, + 0x08, 0x01, 0x00, 0x00, 0x51, 0x01, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, 0x52, 0x01, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, 0x05, 0x01, + 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, 0x52, 0x01, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x35, 0x01, 0x00, 0x00, 0x35, 0x01, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, + 0x52, 0x01, 0x00, 0x00, 0x53, 0x01, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x53, 0x01, + 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, 0x51, 0x01, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x53, 0x01, 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, + 0x55, 0x01, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x51, 0x01, 0x00, 0x00, 0x51, 0x01, 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, 0x55, 0x01, 0x00, 0x00, 0x56, 0x01, + 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x55, 0x01, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x39, 0x01, 0x00, 0x00, + 0x52, 0x01, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, 0x0b, 0x01, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x39, 0x01, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3d, 0x00, + 0x00, 0x00, 0x52, 0x01, 0x00, 0x00, 0x52, 0x01, 0x00, 0x00, 0x39, 0x01, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x1b, 0x01, 0x00, 0x00, + 0x49, 0x01, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x1b, 0x01, 0x00, 0x00, 0x57, 0x01, 0x00, 0x00, 0x53, 0x01, + 0x00, 0x00, 0x53, 0x01, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x1b, 0x01, 0x00, 0x00, 0x57, 0x01, 0x00, 0x00, 0x41, 0x01, 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, + 0x54, 0x01, 0x00, 0x00, 0x53, 0x01, 0x00, 0x00, 0x57, 0x01, 0x00, 0x00, 0x41, 0x01, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0x55, 0x01, 0x00, 0x00, 0x55, 0x01, + 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, 0x41, 0x01, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0x3e, 0x01, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, 0x56, 0x01, 0x00, 0x00, + 0x55, 0x01, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0x3e, 0x01, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x39, 0x01, 0x00, 0x00, 0x39, 0x01, 0x00, 0x00, 0x56, 0x01, + 0x00, 0x00, 0x3e, 0x01, 0x00, 0x00, 0x2d, 0x01, 0x00, 0x00, 0x57, 0x01, 0x00, 0x00, 0x1b, 0x01, 0x00, 0x00, 0x1b, 0x01, 0x00, 0x00, 0x1a, 0x01, 0x00, 0x00, + 0x2d, 0x01, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x41, 0x01, 0x00, 0x00, 0x57, 0x01, 0x00, 0x00, 0x57, 0x01, 0x00, 0x00, 0x2d, 0x01, 0x00, 0x00, 0x40, 0x01, + 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x3e, 0x01, 0x00, 0x00, 0x3e, 0x01, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, + 0x4d, 0x00, 0x00, 0x00, 0x2b, 0x01, 0x00, 0x00, 0x1a, 0x01, 0x00, 0x00, 0x1a, 0x01, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x4d, 0x00, 0x00, 0x00, 0xa1, 0x00, + 0x00, 0x00, 0x58, 0x01, 0x00, 0x00, 0x59, 0x01, 0x00, 0x00, 0x59, 0x01, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, + 0x5a, 0x01, 0x00, 0x00, 0x58, 0x01, 0x00, 0x00, 0x58, 0x01, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0x59, 0x01, + 0x00, 0x00, 0x5b, 0x01, 0x00, 0x00, 0x5b, 0x01, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0x5b, 0x01, 0x00, 0x00, + 0x5c, 0x01, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x5d, 0x01, + 0x00, 0x00, 0x5d, 0x01, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x5d, 0x01, 0x00, 0x00, 0x5e, 0x01, 0x00, 0x00, + 0x5e, 0x01, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0x5e, 0x01, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x5f, 0x01, + 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0x5f, 0x01, 0x00, 0x00, 0x60, 0x01, 0x00, 0x00, 0x60, 0x01, 0x00, 0x00, + 0xb1, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0x61, 0x01, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x00, 0x60, 0x01, + 0x00, 0x00, 0x61, 0x01, 0x00, 0x00, 0x2f, 0x01, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, 0x5a, 0x01, 0x00, 0x00, 0x5a, 0x01, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x00, + 0x2f, 0x01, 0x00, 0x00, 0x31, 0x01, 0x00, 0x00, 0x63, 0x01, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, 0x2f, 0x01, 0x00, 0x00, 0x31, 0x01, + 0x00, 0x00, 0x33, 0x01, 0x00, 0x00, 0x64, 0x01, 0x00, 0x00, 0x63, 0x01, 0x00, 0x00, 0x63, 0x01, 0x00, 0x00, 0x31, 0x01, 0x00, 0x00, 0x33, 0x01, 0x00, 0x00, + 0x36, 0x01, 0x00, 0x00, 0x65, 0x01, 0x00, 0x00, 0x64, 0x01, 0x00, 0x00, 0x64, 0x01, 0x00, 0x00, 0x33, 0x01, 0x00, 0x00, 0x36, 0x01, 0x00, 0x00, 0x38, 0x01, + 0x00, 0x00, 0x66, 0x01, 0x00, 0x00, 0x65, 0x01, 0x00, 0x00, 0x65, 0x01, 0x00, 0x00, 0x36, 0x01, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, 0x3a, 0x01, 0x00, 0x00, + 0x67, 0x01, 0x00, 0x00, 0x66, 0x01, 0x00, 0x00, 0x66, 0x01, 0x00, 0x00, 0x38, 0x01, 0x00, 0x00, 0x3a, 0x01, 0x00, 0x00, 0x67, 0x01, 0x00, 0x00, 0x3a, 0x01, + 0x00, 0x00, 0x3b, 0x01, 0x00, 0x00, 0x3b, 0x01, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x67, 0x01, 0x00, 0x00, +}; diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/loreta_anatomic_voxels.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/loreta_anatomic_voxels.hpp new file mode 100644 index 0000000..cfb1aa1 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/loreta_anatomic_voxels.hpp @@ -0,0 +1,1285 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +namespace LoretaRegions { +#ifndef LoretaRegions_VoxelCount +# define LoretaRegions_VoxelCount 2394 +#endif + +static const std::vector BRODMANN_AREAS_VOXELS_0 = { 155, 156, 159, 160, 291, 292, 294, 295, 296, 304, 486, 489, 497, 498, 502 }; +static const std::vector BRODMANN_AREAS_VOXELS_0_R = { 159, 160, 294, 295, 296, 304, 489, 502 }; +static const std::vector BRODMANN_AREAS_VOXELS_0_L = { 155, 156, 291, 292, 486, 497, 498 }; +static const std::vector BRODMANN_AREAS_VOXELS_1 = { 1606, 1611, 1766, 1772, 2118, 2227, 2230 }; +static const std::vector BRODMANN_AREAS_VOXELS_1_R = { 1611, 1772, 2118, 2230 }; +static const std::vector BRODMANN_AREAS_VOXELS_1_L = { 1606, 1766, 2227 }; +static const std::vector BRODMANN_AREAS_VOXELS_2 = { 1610, 1767, 1768, 1771, 1934, 1943, 1944, 1946, 1952, 2112, 2113, 2114, 2226, 2317 }; +static const std::vector BRODMANN_AREAS_VOXELS_2_R = { 1610, 1771, 1943, 1944, 1952, 2112, 2113, 2114, 2226, 2317 }; +static const std::vector BRODMANN_AREAS_VOXELS_2_L = { 1767, 1768, 1934, 1946 }; +static const std::vector BRODMANN_AREAS_VOXELS_3 = { 1460, 1463, 1607, 1612, 1774, 1780, 1945, 1951, 1953, 1955, 1962, 2223, 2231, 2232, 2235 }; +static const std::vector BRODMANN_AREAS_VOXELS_3_R = { 1463, 1780, 1951, 1953, 1962, 2235 }; +static const std::vector BRODMANN_AREAS_VOXELS_3_L = { 1460, 1607, 1612, 1774, 1945, 1955, 2223, 2231, 2232 }; +static const std::vector BRODMANN_AREAS_VOXELS_4 = { + 1307, 1310, 1311, 1467, 1468, 1613, 1616, 1622, 1773, 1775, 1778, 1779, 1781, 1785, 1956, 1957, 1965, 1970, 2115, 2119, 2124, 2125, 2315, 2316, 2368, 2369 +}; +static const std::vector BRODMANN_AREAS_VOXELS_4_R = { 1310, 1311, 1468, 1616, 1622, 1778, 1779, 1785, 1970, 2124, 2125, 2316, 2369 }; +static const std::vector BRODMANN_AREAS_VOXELS_4_L = { 1307, 1467, 1613, 1773, 1775, 1781, 1956, 1957, 1965, 2115, 2119, 2315, 2368 }; +static const std::vector BRODMANN_AREAS_VOXELS_5 = { + 2091, 2094, 2105, 2213, 2214, 2216, 2220, 2221, 2309, 2310, 2311, 2312, 2313, 2314, 2364, 2365, 2366, 2367 +}; +static const std::vector BRODMANN_AREAS_VOXELS_5_R = { 2094, 2105, 2214, 2216, 2221, 2312, 2313, 2314, 2365, 2366, 2367 }; +static const std::vector BRODMANN_AREAS_VOXELS_5_L = { 2091, 2213, 2220, 2309, 2310, 2311, 2364 }; +static const std::vector BRODMANN_AREAS_VOXELS_6 = { + 1107, 1111, 1112, 1114, 1119, 1120, 1312, 1314, 1469, 1470, 1617, 1618, 1619, 1623, 1625, 1630, 1784, 1786, 1787, 1790, 1791, 1800, 1844, 1845, 1954, + 1963, 1964, 1971, 1972, 1977, 1978, 1979, 1984, 1985, 1986, 2028, 2029, 2120, 2122, 2126, 2127, 2128, 2129, 2133, 2134, 2135, 2136, 2137, 2138, 2141, + 2142, 2143, 2146, 2147, 2148, 2224, 2225, 2228, 2229, 2233, 2234, 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249, + 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2269, 2272, 2279, 2283, 2286, 2318, 2319, + 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, + 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, + 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393 +}; +static const std::vector BRODMANN_AREAS_VOXELS_6_R = { + 1111, 1112, 1119, 1120, 1314, 1469, 1617, 1630, 1784, 1790, 1800, 1845, 1963, 1971, 1977, 1984, 1985, 1986, 2029, 2133, 2134, 2135, 2141, 2142, 2143, + 2147, 2148, 2225, 2229, 2234, 2240, 2241, 2242, 2247, 2248, 2249, 2250, 2251, 2257, 2258, 2259, 2260, 2264, 2265, 2266, 2267, 2272, 2279, 2286, 2319, + 2321, 2323, 2328, 2329, 2332, 2333, 2334, 2338, 2339, 2340, 2341, 2344, 2345, 2346, 2347, 2352, 2353, 2354, 2355, 2357, 2374, 2379, 2380, 2384, 2385, + 2386, 2390, 2391, 2392 +}; +static const std::vector BRODMANN_AREAS_VOXELS_6_L = { + 1107, 1114, 1312, 1470, 1618, 1619, 1623, 1625, 1786, 1787, 1791, 1844, 1954, 1964, 1972, 1978, 1979, 2028, 2120, 2122, 2126, 2127, 2128, 2129, 2136, + 2137, 2138, 2146, 2224, 2228, 2233, 2236, 2237, 2238, 2239, 2243, 2244, 2245, 2246, 2252, 2253, 2254, 2255, 2256, 2261, 2262, 2263, 2269, 2283, 2318, + 2320, 2322, 2324, 2325, 2326, 2327, 2330, 2331, 2335, 2336, 2337, 2342, 2343, 2348, 2349, 2350, 2351, 2356, 2370, 2371, 2372, 2373, 2375, 2376, 2377, + 2378, 2381, 2382, 2383, 2387, 2388, 2389, 2393 +}; +static const std::vector BRODMANN_AREAS_VOXELS_7 = { + 1558, 1559, 1561, 1706, 1707, 1708, 1713, 1714, 1715, 1716, 1717, 1722, 1723, 1724, 1725, 1732, 1733, 1734, 1740, 1741, 1742, 1743, 1858, 1859, 1860, + 1861, 1862, 1863, 1867, 1869, 1870, 1871, 1872, 1873, 1874, 1876, 1882, 1883, 1884, 1885, 1887, 1892, 1893, 1894, 1900, 1901, 1902, 1903, 1904, 2035, + 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2060, 2061, 2062, 2063, + 2068, 2069, 2070, 2071, 2079, 2080, 2081, 2082, 2092, 2093, 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, 2187, 2188, 2189, 2190, 2191, 2192, + 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2202, 2203, 2204, 2205, 2212, 2215, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, 2298, 2299, 2300, + 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2358, 2359, 2360, 2361, 2362, 2363 +}; +static const std::vector BRODMANN_AREAS_VOXELS_7_R = { + 1559, 1561, 1707, 1708, 1715, 1716, 1717, 1724, 1725, 1734, 1742, 1743, 1862, 1863, 1872, 1873, 1874, 1876, 1884, 1885, 1887, 1894, 1903, 1904, 2042, + 2043, 2044, 2045, 2046, 2053, 2054, 2055, 2056, 2057, 2062, 2063, 2070, 2071, 2081, 2082, 2093, 2180, 2181, 2187, 2188, 2189, 2190, 2196, 2197, 2198, + 2199, 2205, 2215, 2292, 2293, 2299, 2300, 2301, 2306, 2307, 2308, 2361, 2362, 2363 +}; +static const std::vector BRODMANN_AREAS_VOXELS_7_L = { + 1558, 1706, 1713, 1714, 1722, 1723, 1732, 1733, 1740, 1741, 1858, 1859, 1860, 1861, 1867, 1869, 1870, 1871, 1882, 1883, 1892, 1893, 1900, 1901, 1902, + 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2048, 2049, 2050, 2051, 2052, 2060, 2061, 2068, 2069, 2079, 2080, 2092, 2178, 2179, 2182, 2183, 2184, 2185, + 2186, 2191, 2192, 2193, 2194, 2195, 2202, 2203, 2204, 2212, 2289, 2290, 2291, 2294, 2295, 2296, 2297, 2298, 2302, 2303, 2304, 2305, 2358, 2359, 2360 +}; +static const std::vector BRODMANN_AREAS_VOXELS_8 = { + 1987, 1988, 1992, 1993, 1995, 1999, 2001, 2002, 2003, 2004, 2007, 2009, 2010, 2012, 2013, 2014, 2015, 2017, 2018, 2019, 2020, 2021, 2023, 2024, 2027, + 2034, 2144, 2145, 2149, 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, + 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2268, 2270, 2271, 2273, 2274, 2275, 2276, 2277, 2278, 2280, 2281, 2282, 2284, 2285, 2287, 2288 +}; +static const std::vector BRODMANN_AREAS_VOXELS_8_R = { + 1992, 1993, 1999, 2001, 2007, 2009, 2014, 2015, 2017, 2021, 2023, 2024, 2034, 2151, 2152, 2153, 2154, 2159, 2160, 2161, 2165, 2166, 2167, 2168, 2173, + 2174, 2175, 2271, 2273, 2274, 2278, 2280, 2281, 2285, 2287 +}; +static const std::vector BRODMANN_AREAS_VOXELS_8_L = { + 1987, 1988, 1995, 2002, 2003, 2004, 2010, 2012, 2013, 2018, 2019, 2020, 2027, 2144, 2145, 2149, 2150, 2155, 2156, 2157, 2158, 2162, 2163, 2164, 2169, + 2170, 2171, 2172, 2176, 2177, 2268, 2270, 2275, 2276, 2277, 2282, 2284, 2288 +}; +static const std::vector BRODMANN_AREAS_VOXELS_9 = { + 1471, 1474, 1499, 1502, 1508, 1509, 1510, 1511, 1519, 1520, 1624, 1628, 1629, 1631, 1632, 1633, 1636, 1637, 1638, 1639, 1640, 1642, 1646, 1648, 1664, + 1665, 1666, 1669, 1674, 1675, 1682, 1683, 1689, 1690, 1792, 1793, 1794, 1797, 1798, 1799, 1801, 1802, 1807, 1808, 1809, 1810, 1815, 1816, 1817, 1821, + 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1846, 1847, 1848, + 1849, 1850, 1851, 1852, 1853, 1854, 1855, 1994, 2000, 2008, 2011, 2016, 2022, 2025, 2026, 2030, 2031, 2032, 2033 +}; +static const std::vector BRODMANN_AREAS_VOXELS_9_R = { + 1502, 1510, 1511, 1520, 1628, 1629, 1636, 1637, 1638, 1639, 1646, 1648, 1669, 1675, 1683, 1690, 1797, 1798, 1799, 1807, 1808, 1809, 1815, 1816, 1821, + 1822, 1823, 1829, 1830, 1831, 1832, 1837, 1838, 1839, 1840, 1846, 1847, 1851, 1852, 1853, 1855, 2000, 2008, 2016, 2022, 2030, 2031, 2033 +}; +static const std::vector BRODMANN_AREAS_VOXELS_9_L = { + 1471, 1474, 1499, 1508, 1509, 1519, 1624, 1631, 1632, 1633, 1640, 1642, 1664, 1665, 1666, 1674, 1682, 1689, 1792, 1793, 1794, 1801, 1802, 1810, 1817, + 1824, 1825, 1826, 1827, 1828, 1833, 1834, 1835, 1836, 1841, 1842, 1843, 1848, 1849, 1850, 1854, 1994, 2011, 2025, 2026, 2032 +}; +static const std::vector BRODMANN_AREAS_VOXELS_10 = { + 569, 579, 775, 778, 782, 783, 786, 788, 789, 790, 791, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 959, + 960, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, + 994, 1159, 1162, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, + 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1332, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, + 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1505, 1506, 1507, 1512, 1513, 1514, 1516, 1517, 1518, 1521, 1522, + 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1663, 1671, 1672, 1673, 1676, 1677, 1678, 1679, 1680, 1681, 1684, 1685, 1686, 1687, 1688, + 1691, 1692, 1693 +}; +static const std::vector BRODMANN_AREAS_VOXELS_10_R = { + 778, 783, 790, 791, 793, 798, 799, 800, 801, 806, 807, 808, 809, 810, 965, 966, 972, 973, 974, 975, 976, 977, 983, 984, 985, 986, 991, 992, 993, 994, + 1162, 1171, 1172, 1173, 1174, 1175, 1176, 1182, 1183, 1184, 1185, 1186, 1190, 1191, 1192, 1193, 1344, 1345, 1346, 1352, 1353, 1354, 1355, 1356, 1360, + 1361, 1362, 1363, 1366, 1367, 1368, 1369, 1512, 1513, 1514, 1521, 1522, 1523, 1527, 1528, 1529, 1531, 1532, 1676, 1677, 1678, 1684, 1685, 1686, 1691, + 1692, 1693 +}; +static const std::vector BRODMANN_AREAS_VOXELS_10_L = { + 569, 579, 775, 782, 786, 788, 789, 794, 795, 796, 797, 802, 803, 804, 805, 959, 960, 967, 968, 969, 970, 971, 978, 979, 980, 981, 982, 987, 988, 989, + 990, 1159, 1165, 1166, 1167, 1168, 1169, 1170, 1177, 1178, 1179, 1180, 1181, 1187, 1188, 1189, 1332, 1339, 1340, 1341, 1342, 1343, 1347, 1348, 1349, + 1350, 1351, 1357, 1358, 1359, 1364, 1365, 1505, 1506, 1507, 1516, 1517, 1518, 1524, 1525, 1526, 1530, 1663, 1671, 1672, 1673, 1679, 1680, 1681, 1687, + 1688 +}; +static const std::vector BRODMANN_AREAS_VOXELS_11 = { + 186, 187, 188, 189, 190, 191, 192, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 327, 328, 329, 330, 340, 341, 350, 356, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 561, 562, 566, 567, 568, 570, 571, 572, 573, 574, + 576, 577, 578, 580, 581, 582, 583, 584, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 787, 792 +}; +static const std::vector BRODMANN_AREAS_VOXELS_11_R = { + 188, 189, 192, 196, 197, 200, 201, 204, 205, 329, 330, 356, 362, 363, 364, 365, 369, 370, 371, 372, 375, 376, 379, 380, 381, 562, 571, 572, 573, 574, + 581, 582, 583, 584, 590, 591, 592, 593, 598, 599, 600, 601, 602, 606, 607, 608, 609, 792 +}; +static const std::vector BRODMANN_AREAS_VOXELS_11_L = { + 186, 187, 190, 191, 194, 195, 198, 199, 202, 203, 327, 328, 340, 341, 350, 359, 360, 361, 366, 367, 368, 373, 374, 377, 378, 561, 566, 567, 568, 570, + 576, 577, 578, 580, 586, 587, 588, 589, 594, 595, 596, 597, 603, 604, 605, 787 +}; +static const std::vector BRODMANN_AREAS_VOXELS_12 = { + 526, 527, 529, 534, 536, 537, 712, 728, 731, 737, 740, 744, 747, 752, 755, 893, 898, 899, 900, 901, 906, 907, 908, 913, 914, 915, 920, 921, 922, 923, + 927, 928, 929, 930, 934, 937, 943, 944, 1083, 1084, 1091, 1092, 1093, 1094, 1100, 1101, 1102, 1103, 1108, 1109, 1110, 1116, 1117, 1123, 1124, 1125, + 1126, 1132, 1133, 1134, 1135, 1140, 1143, 1256, 1263, 1281, 1282, 1283, 1291, 1292, 1293, 1294, 1300, 1301, 1302, 1303, 1308, 1309, 1313, 1426, 1429, + 1435, 1436, 1439, 1444, 1445, 1446, 1452, 1453, 1454, 1455, 1461 +}; +static const std::vector BRODMANN_AREAS_VOXELS_12_R = { + 534, 536, 537, 731, 740, 747, 755, 901, 908, 915, 922, 923, 929, 930, 937, 944, 1093, 1094, 1102, 1103, 1110, 1117, 1125, 1126, 1134, 1135, 1143, 1256, + 1263, 1282, 1283, 1293, 1294, 1302, 1303, 1309, 1313, 1429, 1439, 1445, 1446, 1454, 1455, 1461 +}; +static const std::vector BRODMANN_AREAS_VOXELS_12_L = { + 526, 527, 529, 712, 728, 737, 744, 752, 893, 898, 899, 900, 906, 907, 913, 914, 920, 921, 927, 928, 934, 943, 1083, 1084, 1091, 1092, 1100, 1101, 1108, + 1109, 1116, 1123, 1124, 1132, 1133, 1140, 1281, 1291, 1292, 1300, 1301, 1308, 1426, 1435, 1436, 1444, 1452, 1453 +}; +static const std::vector BRODMANN_AREAS_VOXELS_13 = { 382, 384, 385, 612, 613, 614, 818, 819, 820, 821, 1007, 1008, 1009, 1010 }; +static const std::vector BRODMANN_AREAS_VOXELS_13_R = { 820, 821, 1009, 1010 }; +static const std::vector BRODMANN_AREAS_VOXELS_13_L = { 382, 384, 385, 612, 613, 614, 818, 819, 1007, 1008 }; +static const std::vector BRODMANN_AREAS_VOXELS_14 = { + 383, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 409, 412, 610, 611, 615, 616, 617, + 618, 619, 620, 621, 623, 624, 628, 629, 630, 631, 640, 641, 811, 813, 816, 817, 822, 823, 825, 826, 827, 828, 832, 833, 841, 842, 848, 849, 856, 995, + 996, 997, 999, 1001, 1002, 1003, 1005, 1195, 1196, 1199, 1200, 1204, 1205, 1211, 1212, 1213, 1374, 1375, 1381, 1382, 1389 +}; +static const std::vector BRODMANN_AREAS_VOXELS_14_R = { + 387, 392, 393, 394, 395, 396, 397, 405, 406, 407, 409, 412, 615, 620, 621, 624, 630, 631, 641, 822, 823, 827, 828, 833, 842, 849, 996, 997, 1002, 1003, + 1005, 1200, 1205, 1212, 1213, 1375, 1382 +}; +static const std::vector BRODMANN_AREAS_VOXELS_14_L = { + 383, 386, 388, 389, 390, 391, 398, 399, 400, 401, 402, 403, 404, 610, 611, 616, 617, 618, 619, 623, 628, 629, 640, 811, 813, 816, 817, 825, 826, 832, + 841, 848, 856, 995, 999, 1001, 1195, 1196, 1199, 1204, 1211, 1374, 1381, 1389 +}; +static const std::vector BRODMANN_AREAS_VOXELS_15 = { + 408, 410, 411, 413, 414, 417, 418, 425, 622, 625, 626, 627, 632, 634, 635, 636, 638, 639, 642, 643, 645, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 661, 662, 663, 664, 665, 675, 677, 812, 814, 815, 824, 829, 830, 831, 834, 839, 840, 847, 857, 858, 868, 998, 1000, 1004, 1006, 1011, 1012, 1194, + 1197, 1198, 1201, 1202, 1203, 1206, 1207, 1217, 1218, 1220, 1228, 1370, 1371, 1372, 1373, 1376, 1377, 1379, 1383, 1384, 1392, 1533, 1534, 1535, 1536, + 1537, 1538, 1539, 1541, 1542, 1543, 1544, 1547, 1553, 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1709, 1711, 1712, 1718, + 1856, 1857, 1864, 1865, 1866, 1868, 1875, 1881, 1886 +}; +static const std::vector BRODMANN_AREAS_VOXELS_15_R = { + 408, 413, 414, 418, 625, 632, 634, 642, 643, 645, 652, 653, 654, 655, 656, 664, 665, 677, 814, 829, 834, 858, 868, 1004, 1011, 1012, 1201, 1206, 1207, + 1228, 1376, 1377, 1383, 1384, 1392, 1537, 1538, 1542, 1543, 1544, 1553, 1699, 1700, 1701, 1709, 1718, 1856, 1864, 1865, 1875, 1886 +}; +static const std::vector BRODMANN_AREAS_VOXELS_15_L = { + 410, 411, 417, 425, 622, 626, 627, 635, 636, 638, 639, 647, 648, 649, 650, 651, 661, 662, 663, 675, 812, 815, 824, 830, 831, 839, 840, 847, 857, 998, + 1000, 1006, 1194, 1197, 1198, 1202, 1203, 1217, 1218, 1220, 1370, 1371, 1372, 1373, 1379, 1533, 1534, 1535, 1536, 1539, 1541, 1547, 1694, 1695, 1696, + 1697, 1698, 1702, 1703, 1704, 1705, 1711, 1712, 1857, 1866, 1868, 1881 +}; +static const std::vector BRODMANN_AREAS_VOXELS_16 = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 20, 21, 25, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 57, 58, 59, 60, 61, 62, + 63, 64, 69, 71, 72, 73, 101, 102, 104, 105, 107, 108, 109, 110, 111, 116, 117, 118, 119, 120, 121, 122, 127, 128, 129, 130, 131, 132, 133, 134, 137, + 138, 139, 140, 141, 142, 143, 144, 150, 151, 152, 153, 161, 221, 222, 231, 233, 236, 237, 240, 241, 244, 246, 247, 248, 249, 254, 255, 256, 257, 259, + 260, 266, 267, 268, 269, 270, 277, 278 +}; +static const std::vector BRODMANN_AREAS_VOXELS_16_R = { + 4, 5, 6, 7, 14, 15, 16, 17, 25, 45, 46, 47, 48, 49, 57, 58, 59, 60, 61, 69, 71, 72, 73, 105, 107, 108, 116, 117, 118, 127, 128, 129, 130, 137, 138, 139, + 140, 150, 151, 152, 161, 221, 231, 240, 241, 244, 254, 255, 256, 257, 266, 267, 277, 278 +}; +static const std::vector BRODMANN_AREAS_VOXELS_16_L = { + 0, 1, 2, 3, 8, 9, 10, 11, 20, 21, 40, 41, 42, 43, 44, 50, 51, 52, 53, 54, 62, 63, 64, 101, 102, 104, 109, 110, 111, 119, 120, 121, 122, 131, 132, 133, + 134, 141, 142, 143, 144, 153, 222, 233, 236, 237, 246, 247, 248, 249, 259, 260, 268, 269, 270 +}; +static const std::vector BRODMANN_AREAS_VOXELS_17 = { + 18, 27, 28, 29, 35, 70, 74, 75, 79, 80, 81, 82, 89, 90, 154, 162, 163, 170, 171, 172, 179, 232, 245, 258, 279, 280, 287, 288, 289, 290, 297, 298, 299, + 300, 301, 307, 308, 309, 310, 320, 447, 448, 454, 455, 456, 457, 463, 464, 465, 466, 473, 474, 475, 476, 477, 481, 482, 483, 484, 485, 490, 491, 492, + 493, 494, 495, 496, 503, 504, 505, 506, 507, 508, 522, 523, 524, 658, 671, 672, 680, 681, 682, 683, 688, 689, 690, 691, 692, 699, 700, 701, 702, 703, + 704, 706, 707, 708, 709, 710, 713, 714, 715, 716, 719, 722, 725, 726, 727, 734, 735, 845, 852, 853, 865, 884, 885, 886, 887, 888, 889, 890, 910, 1047, + 1048, 1060, 1061, 1063 +}; +static const std::vector BRODMANN_AREAS_VOXELS_17_R = { + 27, 28, 35, 70, 79, 80, 89, 90, 170, 171, 179, 258, 287, 288, 297, 298, 307, 308, 309, 320, 454, 455, 463, 464, 473, 474, 481, 482, 490, 491, 492, 503, + 504, 505, 506, 522, 523, 524, 680, 681, 688, 689, 699, 700, 701, 706, 707, 708, 713, 714, 715, 722, 725, 726, 734, 852, 887, 888, 889, 890, 910, 1047, + 1063 +}; +static const std::vector BRODMANN_AREAS_VOXELS_17_L = { + 18, 29, 74, 75, 81, 82, 154, 162, 163, 172, 232, 245, 279, 280, 289, 290, 299, 300, 301, 310, 447, 448, 456, 457, 465, 466, 475, 476, 477, 483, 484, + 485, 493, 494, 495, 496, 507, 508, 658, 671, 672, 682, 683, 690, 691, 692, 702, 703, 704, 709, 710, 716, 719, 727, 735, 845, 853, 865, 884, 885, 886, + 1048, 1060, 1061 +}; +static const std::vector BRODMANN_AREAS_VOXELS_18 = { + 705, 711, 717, 718, 723, 724, 732, 733, 742, 743, 748, 749, 750, 863, 864, 869, 870, 871, 872, 873, 880, 881, 882, 883, 891, 892, 894, 895, 896, 897, + 902, 903, 904, 905, 909, 911, 912, 916, 917, 918, 919, 924, 925, 926, 931, 1049, 1058, 1059, 1064, 1065, 1066, 1067, 1068, 1070, 1071, 1072, 1073, 1078, + 1090, 1095, 1098, 1099, 1104, 1105, 1106, 1113, 1229, 1230, 1231, 1238, 1239, 1240, 1241, 1250, 1251, 1252, 1253, 1257, 1258, 1259, 1260, 1261, 1264, + 1265, 1433, 1434, 1440, 1441 +}; +static const std::vector BRODMANN_AREAS_VOXELS_18_R = { + 705, 723, 724, 732, 733, 742, 748, 749, 750, 869, 870, 880, 881, 882, 883, 894, 895, 896, 902, 903, 909, 916, 917, 924, 925, 931, 1058, 1064, 1065, + 1070, 1071, 1072, 1078, 1095, 1104, 1105, 1113, 1238, 1239, 1240, 1250, 1257, 1258, 1259, 1264, 1265, 1440, 1441 +}; +static const std::vector BRODMANN_AREAS_VOXELS_18_L = { + 711, 717, 718, 743, 863, 864, 871, 872, 873, 891, 892, 897, 904, 905, 911, 912, 918, 919, 926, 1049, 1059, 1066, 1067, 1068, 1073, 1090, 1098, 1099, + 1106, 1229, 1230, 1231, 1241, 1251, 1252, 1253, 1260, 1261, 1433, 1434 +}; +static const std::vector BRODMANN_AREAS_VOXELS_19 = { + 1015, 1016, 1017, 1018, 1233, 1234, 1235, 1236, 1419, 1420, 1596, 1597, 1602, 1603, 1608, 1609 +}; +static const std::vector BRODMANN_AREAS_VOXELS_19_R = { 1017, 1018, 1235, 1236, 1420, 1597, 1603, 1609 }; +static const std::vector BRODMANN_AREAS_VOXELS_19_L = { 1015, 1016, 1233, 1234, 1419, 1596, 1602, 1608 }; +static const std::vector BRODMANN_AREAS_VOXELS_20 = { + 761, 762, 956, 1151, 1152, 1326, 1327, 1487, 1488, 1493, 1494, 1614, 1615, 1620, 1621, 1626, 1627, 1644, 1645, 1652, 1653, 1776, 1777, 1782, 1783, 1788, + 1789, 1795, 1796, 1804, 1805, 1958, 1959, 1960, 1961, 1966, 1967, 1968, 1969, 1973, 1974, 1975, 1976, 1980, 1981, 1982, 1983, 2121, 2130, 2131, 2132, + 2139, 2140 +}; +static const std::vector BRODMANN_AREAS_VOXELS_20_R = { + 762, 956, 1152, 1327, 1488, 1494, 1615, 1621, 1627, 1645, 1653, 1777, 1783, 1789, 1796, 1805, 1960, 1961, 1968, 1969, 1975, 1976, 1982, 1983, 2131, + 2132, 2140 +}; +static const std::vector BRODMANN_AREAS_VOXELS_20_L = { + 761, 1151, 1326, 1487, 1493, 1614, 1620, 1626, 1644, 1652, 1776, 1782, 1788, 1795, 1804, 1958, 1959, 1966, 1967, 1973, 1974, 1980, 1981, 2121, 2130, + 2139 +}; +static const std::vector BRODMANN_AREAS_VOXELS_21 = { + 314, 315, 316, 342, 343, 351, 352, 353, 354, 515, 516, 530, 531, 532, 533, 544, 545, 546, 552, 553, 720, 729, 730, 738, 739, 745, 746, 753, 754 +}; +static const std::vector BRODMANN_AREAS_VOXELS_21_R = { 315, 316, 342, 343, 353, 354, 516, 532, 533, 545, 546, 553, 730, 739, 746, 754 }; +static const std::vector BRODMANN_AREAS_VOXELS_21_L = { 314, 351, 352, 515, 530, 531, 544, 552, 720, 729, 738, 745, 753 }; +static const std::vector BRODMANN_AREAS_VOXELS_22 = { 694, 697 }; +static const std::vector BRODMANN_AREAS_VOXELS_22_R = { 697 }; +static const std::vector BRODMANN_AREAS_VOXELS_22_L = { 694 }; +static const std::vector BRODMANN_AREAS_VOXELS_23 = { 55, 56, 76, 77, 146, 147, 157, 158, 164, 165, 166, 167, 168, 169, 272, 273, 274, 275 }; +static const std::vector BRODMANN_AREAS_VOXELS_23_R = { 56, 77, 147, 158, 167, 168, 169, 274, 275 }; +static const std::vector BRODMANN_AREAS_VOXELS_23_L = { 55, 76, 146, 157, 164, 165, 166, 272, 273 }; +static const std::vector BRODMANN_AREAS_VOXELS_24 = { 1052, 1062, 1254, 1255, 1262, 1268, 1269, 1270, 1271, 1272, 1273, 1279, 1284, 1437, 1438 }; +static const std::vector BRODMANN_AREAS_VOXELS_24_R = { 1052, 1062, 1255, 1271, 1272, 1273, 1284, 1438 }; +static const std::vector BRODMANN_AREAS_VOXELS_24_L = { 1254, 1262, 1268, 1269, 1270, 1279, 1437 }; +static const std::vector BRODMANN_AREAS_VOXELS_25 = { + 666, 676, 686, 695, 696, 855, 859, 860, 861, 866, 867, 875, 876, 877, 878, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1037, 1038, 1039, 1040, 1041, + 1042, 1043, 1044, 1051, 1053, 1054, 1055, 1232, 1237, 1244, 1245, 1246, 1247, 1427, 1428 +}; +static const std::vector BRODMANN_AREAS_VOXELS_25_R = { + 666, 676, 686, 696, 859, 860, 861, 867, 877, 878, 1028, 1029, 1030, 1031, 1041, 1042, 1043, 1044, 1053, 1054, 1055, 1237, 1245, 1246, 1247, 1428 +}; +static const std::vector BRODMANN_AREAS_VOXELS_25_L = { + 695, 855, 866, 875, 876, 1024, 1025, 1026, 1027, 1037, 1038, 1039, 1040, 1051, 1232, 1244, 1427 +}; +static const std::vector BRODMANN_AREAS_VOXELS_26 = { + 1221, 1222, 1223, 1224, 1225, 1226, 1380, 1390, 1391, 1397, 1398, 1399, 1400, 1401, 1402, 1408, 1409, 1410, 1411, 1412, 1540, 1548, 1549, 1550, 1551, + 1552, 1557, 1560, 1568, 1569, 1570, 1576, 1577, 1578, 1582, 1583, 1589, 1590, 1747, 1748, 1749, 1750, 1754, 1755, 1756, 1757, 1763, 1764, 1769, 1770, + 1913, 1914, 1915, 1916, 1926, 1927, 1928, 1929, 1938, 1939, 1940, 1941, 1947, 1948, 1949, 1950, 2102, 2103, 2104, 2110, 2111, 2116, 2117, 2123 +}; +static const std::vector BRODMANN_AREAS_VOXELS_26_R = { + 1224, 1225, 1226, 1391, 1400, 1401, 1402, 1410, 1411, 1412, 1550, 1551, 1552, 1560, 1569, 1570, 1578, 1583, 1590, 1749, 1750, 1756, 1757, 1764, 1770, + 1915, 1916, 1928, 1929, 1940, 1941, 1949, 1950, 2104, 2111, 2117, 2123 +}; +static const std::vector BRODMANN_AREAS_VOXELS_26_L = { + 1221, 1222, 1223, 1380, 1390, 1397, 1398, 1399, 1408, 1409, 1540, 1548, 1549, 1557, 1568, 1576, 1577, 1582, 1589, 1747, 1748, 1754, 1755, 1763, 1769, + 1913, 1914, 1926, 1927, 1938, 1939, 1947, 1948, 2102, 2103, 2110, 2116 +}; +static const std::vector BRODMANN_AREAS_VOXELS_27 = { + 769, 770, 776, 777, 781, 784, 955, 961, 962, 963, 964, 1153, 1160, 1161, 1333, 1334, 1335, 1336, 1492, 1495, 1500, 1501, 1643, 1651, 1654, 1657, 1658, + 1659, 1660, 1667, 1668, 1803, 1806, 1811, 1812, 1813, 1814, 1818, 1819, 1820, 1989, 1990, 1991, 1996, 1997, 1998, 2005, 2006 +}; +static const std::vector BRODMANN_AREAS_VOXELS_27_R = { + 770, 777, 784, 963, 964, 1153, 1161, 1335, 1336, 1495, 1501, 1654, 1659, 1660, 1668, 1806, 1813, 1814, 1819, 1820, 1990, 1991, 1998, 2006 +}; +static const std::vector BRODMANN_AREAS_VOXELS_27_L = { + 769, 776, 781, 955, 961, 962, 1160, 1333, 1334, 1492, 1500, 1643, 1651, 1657, 1658, 1667, 1803, 1811, 1812, 1818, 1989, 1996, 1997, 2005 +}; +static const std::vector BRODMANN_AREAS_VOXELS_28 = { 1480, 1481, 1634, 1635 }; +static const std::vector BRODMANN_AREAS_VOXELS_28_R = { 1481, 1635 }; +static const std::vector BRODMANN_AREAS_VOXELS_28_L = { 1480, 1634 }; +static const std::vector BRODMANN_AREAS_VOXELS_29 = { 283, 284, 293, 303, 500, 512, 513, 514, 517, 518, 519 }; +static const std::vector BRODMANN_AREAS_VOXELS_29_R = { 284, 517, 518, 519 }; +static const std::vector BRODMANN_AREAS_VOXELS_29_L = { 283, 293, 303, 500, 512, 513, 514 }; +static const std::vector BRODMANN_AREAS_VOXELS_30 = { 123, 124, 125, 145, 148, 263, 460, 461, 469, 470, 479 }; +static const std::vector BRODMANN_AREAS_VOXELS_30_R = { 125, 148, 263, 461, 470 }; +static const std::vector BRODMANN_AREAS_VOXELS_30_L = { 123, 124, 145, 460, 469, 479 }; +static const std::vector BRODMANN_AREAS_VOXELS_31 = { + 12, 13, 23, 65, 66, 67, 68, 78, 103, 106, 112, 113, 114, 115, 126, 135, 136, 250, 251, 252, 253, 261, 262, 264, 265, 450, 451, 452, 458, 459, 462 +}; +static const std::vector BRODMANN_AREAS_VOXELS_31_R = { 13, 23, 67, 68, 78, 106, 114, 115, 126, 136, 252, 253, 264, 265, 452, 462 }; +static const std::vector BRODMANN_AREAS_VOXELS_31_L = { 12, 65, 66, 103, 112, 113, 135, 250, 251, 261, 262, 450, 451, 458, 459 }; +static const std::vector BRODMANN_AREAS_VOXELS_32 = { + 97, 98, 99, 100, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 223, 224, 225, 226, 227, 228, 229, 230, 234, 235, 238, 239, + 242, 243, 415, 416, 419, 420, 421, 422, 423, 424, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 449, 453, 487, 488, 499, 501, 633, 637, 644, 646, 657, 659, 660, 667, 668, 669, 670, 673, 674, 678, 679, 721, 835, 836, 837, 838, 843, 844, 846, + 850, 851, 854, 862, 1023, 1032 +}; +static const std::vector BRODMANN_AREAS_VOXELS_32_R = { + 99, 100, 209, 210, 211, 217, 218, 219, 220, 227, 228, 229, 230, 239, 242, 243, 419, 420, 426, 427, 428, 429, 434, 435, 436, 443, 444, 445, 446, 453, + 488, 501, 633, 644, 657, 667, 668, 669, 670, 678, 679, 721, 835, 843, 844, 850, 851, 862, 1032 +}; +static const std::vector BRODMANN_AREAS_VOXELS_32_L = { + 97, 98, 206, 207, 208, 212, 213, 214, 215, 216, 223, 224, 225, 226, 234, 235, 238, 415, 416, 421, 422, 423, 424, 430, 431, 432, 433, 437, 438, 439, 440, + 441, 442, 449, 487, 499, 637, 646, 659, 660, 673, 674, 836, 837, 838, 846, 854, 1023 +}; +static const std::vector BRODMANN_AREAS_VOXELS_33 = { + 19, 22, 24, 26, 30, 31, 32, 33, 34, 36, 37, 38, 39, 83, 84, 85, 86, 87, 88, 91, 92, 93, 94, 95, 96, 173, 174, 175, 176, 177, 178, 180, 181, 182, 183, + 184, 185, 302, 305, 306, 311, 319, 321, 322, 334, 335, 509, 510, 511, 520, 521, 525, 538, 539, 540, 541, 549, 550, 736, 741 +}; +static const std::vector BRODMANN_AREAS_VOXELS_33_R = { + 24, 26, 32, 33, 34, 38, 39, 86, 87, 88, 94, 95, 96, 176, 177, 178, 183, 184, 185, 305, 306, 319, 334, 335, 520, 521, 538, 539, 549, 550, 741 +}; +static const std::vector BRODMANN_AREAS_VOXELS_33_L = { + 19, 22, 30, 31, 36, 37, 83, 84, 85, 91, 92, 93, 173, 174, 175, 180, 181, 182, 302, 311, 321, 322, 509, 510, 511, 525, 540, 541, 736 +}; +static const std::vector BRODMANN_AREAS_VOXELS_34 = { + 1013, 1014, 1019, 1020, 1021, 1022, 1033, 1034, 1035, 1036, 1045, 1046, 1050, 1056, 1057, 1208, 1209, 1210, 1214, 1215, 1216, 1219, 1227, 1242, 1243, + 1248, 1249, 1378, 1385, 1386, 1387, 1388, 1393, 1394, 1395, 1396, 1403, 1404, 1405, 1406, 1407, 1413, 1414, 1415, 1416, 1545, 1546, 1554, 1555, 1556, + 1562, 1563, 1564, 1565, 1566, 1567, 1571, 1572, 1573, 1710, 1719, 1720, 1721, 1726, 1727, 1728, 1877, 1878, 1880 +}; +static const std::vector BRODMANN_AREAS_VOXELS_34_R = { + 1019, 1020, 1033, 1045, 1046, 1056, 1057, 1214, 1215, 1216, 1227, 1248, 1249, 1385, 1393, 1394, 1403, 1404, 1413, 1414, 1415, 1416, 1554, 1562, 1563, + 1564, 1571, 1572, 1573, 1719, 1726, 1727, 1728, 1877 +}; +static const std::vector BRODMANN_AREAS_VOXELS_34_L = { + 1013, 1014, 1021, 1022, 1034, 1035, 1036, 1050, 1208, 1209, 1210, 1219, 1242, 1243, 1378, 1386, 1387, 1388, 1395, 1396, 1405, 1406, 1407, 1545, 1546, + 1555, 1556, 1565, 1566, 1567, 1710, 1720, 1721, 1878, 1880 +}; +static const std::vector BRODMANN_AREAS_VOXELS_35 = { + 1277, 1278, 1285, 1286, 1417, 1418, 1421, 1422, 1423, 1424, 1425, 1430, 1431, 1432, 1442, 1443, 1447, 1448, 1449, 1450, 1451, 1456, 1457, 1458, 1574, + 1575, 1579, 1580, 1581, 1584, 1585, 1586, 1587, 1588, 1591, 1592, 1593, 1594, 1595, 1598, 1599, 1600, 1601, 1604, 1605, 1729, 1730, 1731, 1735, 1736, + 1737, 1738, 1739, 1744, 1745, 1746, 1751, 1752, 1753, 1758, 1759, 1760, 1761, 1762, 1765, 1879, 1888, 1889, 1890, 1891, 1895, 1896, 1897, 1898, 1899, + 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1930, 1931, 1932, 1933, 1935, 1936, 1937, 1942, + 2047, 2058, 2059, 2064, 2065, 2066, 2067, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2095, 2096, 2097, + 2098, 2099, 2100, 2101, 2106, 2107, 2108, 2109, 2200, 2201, 2206, 2207, 2208, 2209, 2210, 2211, 2217, 2218, 2219, 2222 +}; +static const std::vector BRODMANN_AREAS_VOXELS_35_R = { + 1285, 1286, 1421, 1422, 1423, 1430, 1431, 1432, 1447, 1448, 1456, 1457, 1458, 1579, 1580, 1584, 1585, 1591, 1592, 1593, 1598, 1599, 1604, 1605, 1735, + 1736, 1737, 1744, 1745, 1751, 1752, 1758, 1759, 1760, 1765, 1888, 1895, 1896, 1905, 1906, 1907, 1917, 1918, 1919, 1920, 1930, 1931, 1932, 1933, 1942, + 2064, 2072, 2073, 2074, 2083, 2084, 2085, 2086, 2095, 2096, 2097, 2098, 2106, 2107, 2108, 2109, 2206, 2207, 2208, 2217, 2222 +}; +static const std::vector BRODMANN_AREAS_VOXELS_35_L = { + 1277, 1278, 1417, 1418, 1424, 1425, 1442, 1443, 1449, 1450, 1451, 1574, 1575, 1581, 1586, 1587, 1588, 1594, 1595, 1600, 1601, 1729, 1730, 1731, 1738, + 1739, 1746, 1753, 1761, 1762, 1879, 1889, 1890, 1891, 1897, 1898, 1899, 1908, 1909, 1910, 1911, 1912, 1921, 1922, 1923, 1924, 1925, 1935, 1936, 1937, + 2047, 2058, 2059, 2065, 2066, 2067, 2075, 2076, 2077, 2078, 2087, 2088, 2089, 2090, 2099, 2100, 2101, 2200, 2201, 2209, 2210, 2211, 2218, 2219 +}; +static const std::vector BRODMANN_AREAS_VOXELS_36 = { 1069, 1075, 1076, 1080, 1081, 1082, 1085, 1089, 1096, 1280 }; +static const std::vector BRODMANN_AREAS_VOXELS_36_R = { 1069, 1085, 1096 }; +static const std::vector BRODMANN_AREAS_VOXELS_36_L = { 1075, 1076, 1080, 1081, 1082, 1089, 1280 }; +static const std::vector BRODMANN_AREAS_VOXELS_37 = { + 1074, 1077, 1079, 1086, 1087, 1088, 1097, 1266, 1267, 1274, 1275, 1276, 1287, 1289, 1296, 1298, 1305, 1306 +}; +static const std::vector BRODMANN_AREAS_VOXELS_37_R = { 1077, 1086, 1087, 1097, 1274, 1275, 1287, 1296, 1305, 1306 }; +static const std::vector BRODMANN_AREAS_VOXELS_37_L = { 1074, 1079, 1088, 1266, 1267, 1276, 1289, 1298 }; +static const std::vector BRODMANN_AREAS_VOXELS_38 = { 1288, 1290, 1295, 1297, 1299, 1304, 1459, 1462, 1464, 1465, 1466 }; +static const std::vector BRODMANN_AREAS_VOXELS_38_R = { 1295, 1297, 1304, 1462, 1464, 1466 }; +static const std::vector BRODMANN_AREAS_VOXELS_38_L = { 1288, 1290, 1299, 1459, 1465 }; +static const std::vector BRODMANN_AREAS_VOXELS_39 = { + 954, 958, 1115, 1118, 1121, 1122, 1127, 1128, 1129, 1130, 1131, 1136, 1137, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1475, 1483 +}; +static const std::vector BRODMANN_AREAS_VOXELS_39_R = { 958, 1118, 1127, 1128, 1129, 1136, 1137, 1317, 1318, 1321, 1322, 1475, 1483 }; +static const std::vector BRODMANN_AREAS_VOXELS_39_L = { 954, 1115, 1121, 1122, 1130, 1131, 1315, 1316, 1319, 1320 }; +static const std::vector BRODMANN_AREAS_VOXELS_40 = { + 948, 953, 1138, 1139, 1141, 1142, 1144, 1145, 1146, 1147, 1148, 1156, 1323, 1472, 1473, 1476, 1477, 1478, 1479, 1482, 1484, 1485, 1489, 1490 +}; +static const std::vector BRODMANN_AREAS_VOXELS_40_R = { 953, 1138, 1142, 1144, 1145, 1147, 1156, 1323, 1476, 1477, 1482, 1484, 1489, 1490 }; +static const std::vector BRODMANN_AREAS_VOXELS_40_L = { 948, 1139, 1141, 1146, 1148, 1472, 1473, 1478, 1479, 1485 }; +static const std::vector BRODMANN_AREAS_VOXELS_41 = { + 1149, 1150, 1154, 1155, 1157, 1158, 1163, 1164, 1324, 1325, 1328, 1329, 1330, 1331, 1337, 1338, 1486, 1491, 1496, 1497, 1498, 1503, 1504, 1515, 1641, + 1647, 1649, 1650, 1655, 1656, 1661, 1662, 1670 +}; +static const std::vector BRODMANN_AREAS_VOXELS_41_R = { + 1154, 1155, 1163, 1164, 1328, 1329, 1330, 1337, 1338, 1496, 1497, 1503, 1515, 1647, 1655, 1661, 1670 +}; +static const std::vector BRODMANN_AREAS_VOXELS_41_L = { + 1149, 1150, 1157, 1158, 1324, 1325, 1331, 1486, 1491, 1498, 1504, 1641, 1649, 1650, 1656, 1662 +}; +static const std::vector BRODMANN_AREAS_VOXELS_42 = { + 193, 312, 313, 317, 318, 323, 324, 325, 326, 331, 332, 333, 336, 337, 338, 339, 344, 345, 346, 347, 348, 349, 355, 357, 358, 528, 535, 542, 543, 547, + 548, 551, 554, 555, 556, 557, 558, 559, 560, 563, 564, 565, 575, 585, 751, 756, 757, 758, 759, 760, 763, 764, 765, 766, 767, 768, 771, 772, 773, 774, + 779, 780, 785, 932, 933, 935, 936, 938, 939, 940, 941, 942, 945, 946, 947, 949, 950, 951, 952, 957 +}; +static const std::vector BRODMANN_AREAS_VOXELS_42_R = { + 193, 317, 318, 331, 332, 333, 344, 345, 346, 347, 355, 357, 358, 535, 547, 548, 554, 555, 556, 563, 564, 585, 756, 763, 764, 765, 766, 771, 772, 779, + 785, 936, 938, 939, 945, 946, 947, 951, 952, 957 +}; +static const std::vector BRODMANN_AREAS_VOXELS_42_L = { + 312, 313, 323, 324, 325, 326, 336, 337, 338, 339, 348, 349, 528, 542, 543, 551, 557, 558, 559, 560, 565, 575, 751, 757, 758, 759, 760, 767, 768, 773, + 774, 780, 932, 933, 935, 940, 941, 942, 949, 950 +}; +static const std::vector BRODMANN_AREAS_VOXELS_43 = { + 149, 271, 276, 281, 282, 285, 286, 467, 468, 471, 472, 478, 480, 684, 685, 687, 693, 698, 874, 879 +}; +static const std::vector BRODMANN_AREAS_VOXELS_43_R = { 149, 276, 285, 286, 471, 472, 480, 687, 698, 879 }; +static const std::vector BRODMANN_AREAS_VOXELS_43_L = { 271, 281, 282, 467, 468, 478, 684, 685, 693, 874 }; + +static const std::map> BRODMANNS = +{ + { "Amygdala", BRODMANN_AREAS_VOXELS_0 }, + { "Amygdala R", BRODMANN_AREAS_VOXELS_0_R }, + { "Amygdala L", BRODMANN_AREAS_VOXELS_0_L }, + { "Brodmann area 01", BRODMANN_AREAS_VOXELS_1 }, + { "Brodmann area 01 R", BRODMANN_AREAS_VOXELS_1_R }, + { "Brodmann area 01 L", BRODMANN_AREAS_VOXELS_1_L }, + { "Brodmann area 02", BRODMANN_AREAS_VOXELS_2 }, + { "Brodmann area 02 R", BRODMANN_AREAS_VOXELS_2_R }, + { "Brodmann area 02 L", BRODMANN_AREAS_VOXELS_2_L }, + { "Brodmann area 03", BRODMANN_AREAS_VOXELS_3 }, + { "Brodmann area 03 R", BRODMANN_AREAS_VOXELS_3_R }, + { "Brodmann area 03 L", BRODMANN_AREAS_VOXELS_3_L }, + { "Brodmann area 04", BRODMANN_AREAS_VOXELS_4 }, + { "Brodmann area 04 R", BRODMANN_AREAS_VOXELS_4_R }, + { "Brodmann area 04 L", BRODMANN_AREAS_VOXELS_4_L }, + { "Brodmann area 05", BRODMANN_AREAS_VOXELS_5 }, + { "Brodmann area 05 R", BRODMANN_AREAS_VOXELS_5_R }, + { "Brodmann area 05 L", BRODMANN_AREAS_VOXELS_5_L }, + { "Brodmann area 06", BRODMANN_AREAS_VOXELS_6 }, + { "Brodmann area 06 R", BRODMANN_AREAS_VOXELS_6_R }, + { "Brodmann area 06 L", BRODMANN_AREAS_VOXELS_6_L }, + { "Brodmann area 07", BRODMANN_AREAS_VOXELS_7 }, + { "Brodmann area 07 R", BRODMANN_AREAS_VOXELS_7_R }, + { "Brodmann area 07 L", BRODMANN_AREAS_VOXELS_7_L }, + { "Brodmann area 08", BRODMANN_AREAS_VOXELS_8 }, + { "Brodmann area 08 R", BRODMANN_AREAS_VOXELS_8_R }, + { "Brodmann area 08 L", BRODMANN_AREAS_VOXELS_8_L }, + { "Brodmann area 09", BRODMANN_AREAS_VOXELS_9 }, + { "Brodmann area 09 R", BRODMANN_AREAS_VOXELS_9_R }, + { "Brodmann area 09 L", BRODMANN_AREAS_VOXELS_9_L }, + { "Brodmann area 10", BRODMANN_AREAS_VOXELS_10 }, + { "Brodmann area 10 R", BRODMANN_AREAS_VOXELS_10_R }, + { "Brodmann area 10 L", BRODMANN_AREAS_VOXELS_10_L }, + { "Brodmann area 11", BRODMANN_AREAS_VOXELS_11 }, + { "Brodmann area 11 R", BRODMANN_AREAS_VOXELS_11_R }, + { "Brodmann area 11 L", BRODMANN_AREAS_VOXELS_11_L }, + { "Brodmann area 13", BRODMANN_AREAS_VOXELS_12 }, + { "Brodmann area 13 R", BRODMANN_AREAS_VOXELS_12_R }, + { "Brodmann area 13 L", BRODMANN_AREAS_VOXELS_12_L }, + { "Brodmann area 17", BRODMANN_AREAS_VOXELS_13 }, + { "Brodmann area 17 R", BRODMANN_AREAS_VOXELS_13_R }, + { "Brodmann area 17 L", BRODMANN_AREAS_VOXELS_13_L }, + { "Brodmann area 18", BRODMANN_AREAS_VOXELS_14 }, + { "Brodmann area 18 R", BRODMANN_AREAS_VOXELS_14_R }, + { "Brodmann area 18 L", BRODMANN_AREAS_VOXELS_14_L }, + { "Brodmann area 19", BRODMANN_AREAS_VOXELS_15 }, + { "Brodmann area 19 R", BRODMANN_AREAS_VOXELS_15_R }, + { "Brodmann area 19 L", BRODMANN_AREAS_VOXELS_15_L }, + { "Brodmann area 20", BRODMANN_AREAS_VOXELS_16 }, + { "Brodmann area 20 R", BRODMANN_AREAS_VOXELS_16_R }, + { "Brodmann area 20 L", BRODMANN_AREAS_VOXELS_16_L }, + { "Brodmann area 21", BRODMANN_AREAS_VOXELS_17 }, + { "Brodmann area 21 R", BRODMANN_AREAS_VOXELS_17_R }, + { "Brodmann area 21 L", BRODMANN_AREAS_VOXELS_17_L }, + { "Brodmann area 22", BRODMANN_AREAS_VOXELS_18 }, + { "Brodmann area 22 R", BRODMANN_AREAS_VOXELS_18_R }, + { "Brodmann area 22 L", BRODMANN_AREAS_VOXELS_18_L }, + { "Brodmann area 23", BRODMANN_AREAS_VOXELS_19 }, + { "Brodmann area 23 R", BRODMANN_AREAS_VOXELS_19_R }, + { "Brodmann area 23 L", BRODMANN_AREAS_VOXELS_19_L }, + { "Brodmann area 24", BRODMANN_AREAS_VOXELS_20 }, + { "Brodmann area 24 R", BRODMANN_AREAS_VOXELS_20_R }, + { "Brodmann area 24 L", BRODMANN_AREAS_VOXELS_20_L }, + { "Brodmann area 25", BRODMANN_AREAS_VOXELS_21 }, + { "Brodmann area 25 R", BRODMANN_AREAS_VOXELS_21_R }, + { "Brodmann area 25 L", BRODMANN_AREAS_VOXELS_21_L }, + { "Brodmann area 27", BRODMANN_AREAS_VOXELS_22 }, + { "Brodmann area 27 R", BRODMANN_AREAS_VOXELS_22_R }, + { "Brodmann area 27 L", BRODMANN_AREAS_VOXELS_22_L }, + { "Brodmann area 28", BRODMANN_AREAS_VOXELS_23 }, + { "Brodmann area 28 R", BRODMANN_AREAS_VOXELS_23_R }, + { "Brodmann area 28 L", BRODMANN_AREAS_VOXELS_23_L }, + { "Brodmann area 29", BRODMANN_AREAS_VOXELS_24 }, + { "Brodmann area 29 R", BRODMANN_AREAS_VOXELS_24_R }, + { "Brodmann area 29 L", BRODMANN_AREAS_VOXELS_24_L }, + { "Brodmann area 30", BRODMANN_AREAS_VOXELS_25 }, + { "Brodmann area 30 R", BRODMANN_AREAS_VOXELS_25_R }, + { "Brodmann area 30 L", BRODMANN_AREAS_VOXELS_25_L }, + { "Brodmann area 31", BRODMANN_AREAS_VOXELS_26 }, + { "Brodmann area 31 R", BRODMANN_AREAS_VOXELS_26_R }, + { "Brodmann area 31 L", BRODMANN_AREAS_VOXELS_26_L }, + { "Brodmann area 32", BRODMANN_AREAS_VOXELS_27 }, + { "Brodmann area 32 R", BRODMANN_AREAS_VOXELS_27_R }, + { "Brodmann area 32 L", BRODMANN_AREAS_VOXELS_27_L }, + { "Brodmann area 33", BRODMANN_AREAS_VOXELS_28 }, + { "Brodmann area 33 R", BRODMANN_AREAS_VOXELS_28_R }, + { "Brodmann area 33 L", BRODMANN_AREAS_VOXELS_28_L }, + { "Brodmann area 34", BRODMANN_AREAS_VOXELS_29 }, + { "Brodmann area 34 R", BRODMANN_AREAS_VOXELS_29_R }, + { "Brodmann area 34 L", BRODMANN_AREAS_VOXELS_29_L }, + { "Brodmann area 35", BRODMANN_AREAS_VOXELS_30 }, + { "Brodmann area 35 R", BRODMANN_AREAS_VOXELS_30_R }, + { "Brodmann area 35 L", BRODMANN_AREAS_VOXELS_30_L }, + { "Brodmann area 36", BRODMANN_AREAS_VOXELS_31 }, + { "Brodmann area 36 R", BRODMANN_AREAS_VOXELS_31_R }, + { "Brodmann area 36 L", BRODMANN_AREAS_VOXELS_31_L }, + { "Brodmann area 37", BRODMANN_AREAS_VOXELS_32 }, + { "Brodmann area 37 R", BRODMANN_AREAS_VOXELS_32_R }, + { "Brodmann area 37 L", BRODMANN_AREAS_VOXELS_32_L }, + { "Brodmann area 38", BRODMANN_AREAS_VOXELS_33 }, + { "Brodmann area 38 R", BRODMANN_AREAS_VOXELS_33_R }, + { "Brodmann area 38 L", BRODMANN_AREAS_VOXELS_33_L }, + { "Brodmann area 39", BRODMANN_AREAS_VOXELS_34 }, + { "Brodmann area 39 R", BRODMANN_AREAS_VOXELS_34_R }, + { "Brodmann area 39 L", BRODMANN_AREAS_VOXELS_34_L }, + { "Brodmann area 40", BRODMANN_AREAS_VOXELS_35 }, + { "Brodmann area 40 R", BRODMANN_AREAS_VOXELS_35_R }, + { "Brodmann area 40 L", BRODMANN_AREAS_VOXELS_35_L }, + { "Brodmann area 41", BRODMANN_AREAS_VOXELS_36 }, + { "Brodmann area 41 R", BRODMANN_AREAS_VOXELS_36_R }, + { "Brodmann area 41 L", BRODMANN_AREAS_VOXELS_36_L }, + { "Brodmann area 42", BRODMANN_AREAS_VOXELS_37 }, + { "Brodmann area 42 R", BRODMANN_AREAS_VOXELS_37_R }, + { "Brodmann area 42 L", BRODMANN_AREAS_VOXELS_37_L }, + { "Brodmann area 43", BRODMANN_AREAS_VOXELS_38 }, + { "Brodmann area 43 R", BRODMANN_AREAS_VOXELS_38_R }, + { "Brodmann area 43 L", BRODMANN_AREAS_VOXELS_38_L }, + { "Brodmann area 44", BRODMANN_AREAS_VOXELS_39 }, + { "Brodmann area 44 R", BRODMANN_AREAS_VOXELS_39_R }, + { "Brodmann area 44 L", BRODMANN_AREAS_VOXELS_39_L }, + { "Brodmann area 45", BRODMANN_AREAS_VOXELS_40 }, + { "Brodmann area 45 R", BRODMANN_AREAS_VOXELS_40_R }, + { "Brodmann area 45 L", BRODMANN_AREAS_VOXELS_40_L }, + { "Brodmann area 46", BRODMANN_AREAS_VOXELS_41 }, + { "Brodmann area 46 R", BRODMANN_AREAS_VOXELS_41_R }, + { "Brodmann area 46 L", BRODMANN_AREAS_VOXELS_41_L }, + { "Brodmann area 47", BRODMANN_AREAS_VOXELS_42 }, + { "Brodmann area 47 R", BRODMANN_AREAS_VOXELS_42_R }, + { "Brodmann area 47 L", BRODMANN_AREAS_VOXELS_42_L }, + { "Hippocampus", BRODMANN_AREAS_VOXELS_43 }, + { "Hippocampus R", BRODMANN_AREAS_VOXELS_43_R }, + { "Hippocampus L", BRODMANN_AREAS_VOXELS_43_L } +}; + +static const std::vector ANATOMICAL_AREAS_VOXELS_0 = { 1546, 1554, 1555, 1556, 1563, 1564, 1719, 1720, 1721, 1726, 1727, 1728 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_0_R = { 1554, 1563, 1564, 1719, 1726, 1727, 1728 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_0_L = { 1546, 1555, 1556, 1720, 1721 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_1 = { + 720, 729, 730, 738, 739, 745, 746, 753, 754, 761, 762, 769, 770, 776, 777, 781, 784, 955, 956, 961, 962, 963, 964, 970, 971, 972, 973, 1151, 1152, 1153, + 1160, 1161, 1326, 1327, 1333, 1334, 1335, 1336, 1480, 1481, 1487, 1488, 1492, 1493, 1494, 1495, 1500, 1501, 1634, 1635, 1651, 1652, 1653, 1654, 1657, + 1658, 1659, 1667, 1668 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_1_R = { + 730, 739, 746, 754, 762, 770, 777, 784, 956, 963, 964, 972, 973, 1152, 1153, 1161, 1327, 1335, 1336, 1481, 1488, 1494, 1495, 1501, 1635, 1653, 1654, + 1659, 1668 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_1_L = { + 720, 729, 738, 745, 753, 761, 769, 776, 781, 955, 961, 962, 970, 971, 1151, 1160, 1326, 1333, 1334, 1480, 1487, 1492, 1493, 1500, 1634, 1651, 1652, + 1657, 1658, 1667 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_2 = { + 1408, 1412, 1568, 1569, 1576, 1582, 1583, 1589, 1590, 1596, 1597, 1602, 1603, 1608, 1609, 1614, 1615, 1620, 1621, 1626, 1627, 1643, 1644, 1645, 1660, + 1747, 1748, 1749, 1754, 1755, 1756, 1757, 1763, 1764, 1769, 1770, 1776, 1777, 1782, 1783, 1788, 1789, 1795, 1796, 1803, 1804, 1805, 1806, 1811, 1812, + 1813, 1814, 1818, 1819, 1820, 1913, 1914, 1915, 1916, 1926, 1927, 1928, 1929, 1938, 1939, 1940, 1941, 1947, 1948, 1949, 1950, 1958, 1959, 1960, 1961, + 1966, 1967, 1968, 1969, 1973, 1974, 1975, 1976, 1980, 1981, 1982, 1983, 1989, 1990, 1991, 1996, 1997, 1998, 2005, 2006, 2121, 2130, 2131, 2132, 2139, + 2140 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_2_R = { + 1412, 1569, 1583, 1590, 1597, 1603, 1609, 1615, 1621, 1627, 1645, 1660, 1749, 1756, 1757, 1764, 1770, 1777, 1783, 1789, 1796, 1805, 1806, 1813, 1814, + 1819, 1820, 1915, 1916, 1928, 1929, 1940, 1941, 1949, 1950, 1960, 1961, 1968, 1969, 1975, 1976, 1982, 1983, 1990, 1991, 1998, 2006, 2131, 2132, 2140 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_2_L = { + 1408, 1568, 1576, 1582, 1589, 1596, 1602, 1608, 1614, 1620, 1626, 1643, 1644, 1747, 1748, 1754, 1755, 1763, 1769, 1776, 1782, 1788, 1795, 1803, 1804, + 1811, 1812, 1818, 1913, 1914, 1926, 1927, 1938, 1939, 1947, 1948, 1958, 1959, 1966, 1967, 1973, 1974, 1980, 1981, 1989, 1996, 1997, 2005, 2121, 2130, + 2139 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_3 = { + 610, 611, 612, 813, 996, 1001, 1002, 1007, 1008, 1009, 1010, 1015, 1016, 1017, 1018, 1039, 1042, 1196, 1199, 1200, 1204, 1205, 1211, 1212, 1213, 1370, + 1371, 1374, 1375, 1381, 1382, 1389, 1534, 1535, 1536, 1537, 1541, 1542, 1543, 1558, 1559 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_3_R = { + 996, 1002, 1009, 1010, 1017, 1018, 1042, 1200, 1205, 1212, 1213, 1375, 1382, 1537, 1542, 1543, 1559 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_3_L = { + 610, 611, 612, 813, 1001, 1007, 1008, 1015, 1016, 1039, 1196, 1199, 1204, 1211, 1370, 1371, 1374, 1381, 1389, 1534, 1535, 1536, 1541, 1558 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_4 = { 526, 537, 737, 744, 747, 935, 936 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_4_R = { 537, 747, 936 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_4_L = { 526, 737, 744, 935 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_5 = { + 40, 49, 73, 97, 99, 100, 102, 103, 104, 105, 106, 107, 109, 110, 111, 116, 117, 121, 122, 127, 128, 131, 132, 133, 138, 139, 140, 141, 152, 153, 161, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 223, 225, 226, 227, 228, 229, 230, 235, 236, 237, 238, 239, 240, 241, 247, + 248, 249, 254, 255, 256, 389, 394, 416, 417, 418, 419, 423, 424, 425, 426, 427, 432, 433, 434, 439, 441, 444, 660, 661, 667, 673, 679 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_5_R = { + 49, 73, 99, 100, 105, 106, 107, 116, 117, 127, 128, 138, 139, 140, 152, 161, 209, 210, 211, 217, 218, 219, 220, 227, 228, 229, 230, 239, 240, 241, 254, + 255, 256, 394, 418, 419, 426, 427, 434, 444, 667, 679 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_5_L = { + 40, 97, 102, 103, 104, 109, 110, 111, 121, 122, 131, 132, 133, 141, 153, 206, 207, 208, 212, 213, 214, 215, 216, 223, 225, 226, 235, 236, 237, 238, 247, + 248, 249, 389, 416, 417, 423, 424, 425, 432, 433, 439, 441, 660, 661, 673 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_6 = { + 312, 313, 317, 318, 323, 324, 325, 326, 331, 332, 333, 336, 337, 338, 339, 344, 345, 346, 347, 348, 349, 355, 357, 358, 359, 360, 363, 364, 365, 527, + 528, 535, 536, 542, 543, 547, 548, 551, 554, 555, 556, 557, 558, 559, 560, 563, 564, 565, 575, 585, 751, 756, 757, 758, 759, 760, 763, 764, 765, 766, + 767, 768, 771, 772, 773, 779, 785, 932, 933, 938, 939, 940, 941, 942, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 957, 958, 959, 960, 965, 966, + 968, 976, 1122, 1128, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1154, 1155, 1156, 1158, 1163, 1175, 1316, 1317, + 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1328, 1329, 1330, 1331, 1337, 1338, 1471, 1472, 1473, 1475, 1476, 1477, 1478, 1479, 1482, 1483, 1484, 1485, + 1489, 1490, 1624, 1628, 1629, 1631, 1638, 1639, 1640, 1793, 1798, 1799, 1801 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_6_R = { + 317, 318, 331, 332, 333, 344, 345, 346, 347, 355, 357, 358, 363, 364, 365, 535, 536, 547, 548, 554, 555, 556, 563, 564, 585, 756, 763, 764, 765, 766, + 771, 772, 779, 785, 938, 939, 945, 946, 947, 951, 952, 953, 957, 958, 965, 966, 976, 1128, 1138, 1142, 1143, 1144, 1145, 1147, 1154, 1155, 1156, 1163, + 1175, 1317, 1321, 1322, 1323, 1328, 1329, 1330, 1337, 1338, 1475, 1476, 1477, 1482, 1483, 1484, 1489, 1490, 1628, 1629, 1638, 1639, 1798, 1799 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_6_L = { + 312, 313, 323, 324, 325, 326, 336, 337, 338, 339, 348, 349, 359, 360, 527, 528, 542, 543, 551, 557, 558, 559, 560, 565, 575, 751, 757, 758, 759, 760, + 767, 768, 773, 932, 933, 940, 941, 942, 948, 949, 950, 954, 959, 960, 968, 1122, 1139, 1140, 1141, 1146, 1148, 1149, 1150, 1158, 1316, 1319, 1320, 1324, + 1325, 1331, 1471, 1472, 1473, 1478, 1479, 1485, 1624, 1631, 1640, 1793, 1801 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_7 = { 384, 385, 387, 388, 395, 396, 397, 398, 408, 409, 410, 411, 413, 615, 616, 621, 622, 627 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_7_R = { 387, 395, 396, 397, 408, 409, 413, 615, 621 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_7_L = { 384, 385, 388, 398, 410, 411, 616, 622, 627 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_8 = { + 1418, 1421, 1422, 1430, 1442, 1443, 1447, 1448, 1586, 1587, 1588, 1591, 1592, 1593, 1594, 1595, 1598, 1599, 1600, 1601, 1604, 1605, 1730, 1731, 1735, + 1736, 1751, 1758, 1759, 1760, 1761, 1762, 1765, 1877, 1878, 1879, 1880, 1887, 1888, 1889, 1890, 1891, 1892, 1895, 1896, 1897, 1898, 1899, 1905, 1906, + 1907, 1908, 1909, 1910, 1911, 1912, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1930, 1931, 1932, 1933, 1935, 1936, 1937, 1942, 2047, 2057, + 2058, 2059, 2064, 2065, 2066, 2067, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2095, 2096, 2097, 2098, + 2099, 2100, 2108, 2109, 2200, 2201, 2206, 2207, 2208, 2209, 2210, 2217, 2218 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_8_R = { + 1421, 1422, 1430, 1447, 1448, 1591, 1592, 1593, 1598, 1599, 1604, 1605, 1735, 1736, 1751, 1758, 1759, 1760, 1765, 1877, 1887, 1888, 1895, 1896, 1905, + 1906, 1907, 1917, 1918, 1919, 1920, 1930, 1931, 1932, 1933, 1942, 2057, 2064, 2072, 2073, 2074, 2083, 2084, 2085, 2086, 2095, 2096, 2097, 2098, 2108, + 2109, 2206, 2207, 2208, 2217 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_8_L = { + 1418, 1442, 1443, 1586, 1587, 1588, 1594, 1595, 1600, 1601, 1730, 1731, 1761, 1762, 1878, 1879, 1880, 1889, 1890, 1891, 1892, 1897, 1898, 1899, 1908, + 1909, 1910, 1911, 1912, 1921, 1922, 1923, 1924, 1925, 1935, 1936, 1937, 2047, 2058, 2059, 2065, 2066, 2067, 2075, 2076, 2077, 2078, 2087, 2088, 2089, + 2090, 2099, 2100, 2200, 2201, 2209, 2210, 2218 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_9 = { + 0, 1, 5, 6, 7, 8, 9, 10, 15, 16, 17, 20, 21, 41, 42, 43, 46, 47, 48, 50, 51, 52, 59, 60, 61, 62, 63, 71, 72, 98, 101, 108, 118, 119, 120, 129, 130, 142, + 151, 221, 222, 224, 233, 234, 242, 243, 244, 246, 257, 259, 260, 266, 267, 268, 269, 277, 278, 279, 280, 287, 288, 289, 298, 421, 429, 430, 436, 437, + 446, 626, 633, 634, 636, 637, 644, 645, 646, 648, 655 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_9_R = { + 5, 6, 7, 15, 16, 17, 46, 47, 48, 59, 60, 61, 71, 72, 108, 118, 129, 130, 151, 221, 242, 243, 244, 257, 266, 267, 277, 278, 287, 288, 298, 429, 436, 446, + 633, 634, 644, 645, 655 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_9_L = { + 0, 1, 8, 9, 10, 20, 21, 41, 42, 43, 50, 51, 52, 62, 63, 98, 101, 119, 120, 142, 222, 224, 233, 234, 246, 259, 260, 268, 269, 279, 280, 289, 421, 430, + 437, 626, 636, 637, 646, 648 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_10 = { + 712, 728, 731, 740, 752, 755, 893, 898, 899, 900, 901, 906, 907, 908, 913, 914, 915, 920, 921, 922, 923, 927, 928, 929, 930, 934, 937, 943, 944, 1083, + 1084, 1092, 1093, 1100, 1101, 1102, 1103, 1108, 1109, 1110, 1116, 1117, 1123, 1124, 1125, 1126, 1132, 1133, 1134, 1135, 1263, 1281, 1282, 1283, 1291, + 1292, 1293, 1294, 1300, 1301, 1302, 1303, 1308, 1309, 1313, 1435, 1436, 1439, 1444, 1445, 1446, 1452, 1453, 1454, 1455, 1461 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_10_R = { + 731, 740, 755, 901, 908, 915, 922, 923, 929, 930, 937, 944, 1093, 1102, 1103, 1110, 1117, 1125, 1126, 1134, 1135, 1263, 1282, 1283, 1293, 1294, 1302, + 1303, 1309, 1313, 1439, 1445, 1446, 1454, 1455, 1461 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_10_L = { + 712, 728, 752, 893, 898, 899, 900, 906, 907, 913, 914, 920, 921, 927, 928, 934, 943, 1083, 1084, 1092, 1100, 1101, 1108, 1109, 1116, 1123, 1124, 1132, + 1133, 1281, 1291, 1292, 1300, 1301, 1308, 1435, 1436, 1444, 1452, 1453 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_11 = { + 382, 383, 386, 390, 391, 392, 393, 401, 402, 403, 404, 405, 406, 407, 412, 613, 614, 619, 620, 623, 624, 628, 629, 630, 631, 632, 638, 639, 640, 641, + 642, 643, 649, 650, 651, 652, 653, 654, 663, 664, 675, 818, 819, 820, 821, 825, 826, 827, 828, 832, 833, 839, 840, 841, 842, 847, 848, 849, 856, 857, + 858, 868 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_11_R = { + 392, 393, 405, 406, 407, 412, 620, 624, 630, 631, 632, 641, 642, 643, 652, 653, 654, 664, 820, 821, 827, 828, 833, 842, 849, 858, 868 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_11_L = { + 382, 383, 386, 390, 391, 401, 402, 403, 404, 613, 614, 619, 623, 628, 629, 638, 639, 640, 649, 650, 651, 663, 675, 818, 819, 825, 826, 832, 839, 840, + 841, 847, 848, 856, 857 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_12 = { + 314, 315, 316, 342, 343, 351, 352, 353, 354, 361, 362, 530, 533, 546, 561, 562, 569, 570, 571, 579, 580, 581, 589, 590, 597, 598, 604, 605, 606, 607, + 775, 778, 782, 783, 788, 789, 790, 791, 797, 798, 982, 983, 992, 1159, 1162, 1169, 1170, 1171, 1172, 1180, 1181, 1182, 1183, 1188, 1189, 1190, 1191, + 1192, 1341, 1342, 1343, 1344, 1345, 1350, 1351, 1352, 1353, 1359, 1360, 1365, 1366, 1499, 1502, 1508, 1509, 1510, 1511, 1519, 1520, 1526, 1527, 1666, + 1674, 1675, 1682, 1683, 1828, 1829, 1836, 1837, 1844, 1845, 2013, 2014, 2020, 2021, 2028, 2029, 2033, 2122, 2146, 2147, 2150, 2151, 2158, 2159, 2172, + 2228, 2229, 2233, 2234, 2239, 2240, 2246, 2247, 2318, 2319, 2320, 2321, 2322, 2323, 2326, 2327, 2328, 2331, 2332, 2337, 2338, 2370, 2372, 2373, 2374, + 2379 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_12_R = { + 315, 316, 342, 343, 353, 354, 362, 533, 546, 562, 571, 581, 590, 598, 606, 607, 778, 783, 790, 791, 798, 983, 992, 1162, 1171, 1172, 1182, 1183, 1190, + 1191, 1192, 1344, 1345, 1352, 1353, 1360, 1366, 1502, 1510, 1511, 1520, 1527, 1675, 1683, 1829, 1837, 1845, 2014, 2021, 2029, 2033, 2147, 2151, 2159, + 2229, 2234, 2240, 2247, 2319, 2321, 2323, 2328, 2332, 2338, 2374, 2379 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_12_L = { + 314, 351, 352, 361, 530, 561, 569, 570, 579, 580, 589, 597, 604, 605, 775, 782, 788, 789, 797, 982, 1159, 1169, 1170, 1180, 1181, 1188, 1189, 1341, + 1342, 1343, 1350, 1351, 1359, 1365, 1499, 1508, 1509, 1519, 1526, 1666, 1674, 1682, 1828, 1836, 1844, 2013, 2020, 2028, 2122, 2146, 2150, 2158, 2172, + 2228, 2233, 2239, 2246, 2318, 2320, 2322, 2326, 2327, 2331, 2337, 2370, 2372, 2373 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_13 = { + 350, 356, 366, 566, 567, 568, 572, 573, 574, 576, 577, 582, 583, 584, 586, 588, 591, 593, 594, 602, 774, 780, 786, 787, 792, 793, 794, 795, 800, 801, + 967, 975, 977, 978, 986, 1157, 1164, 1165, 1166, 1167, 1168, 1173, 1174, 1176, 1177, 1178, 1185, 1186, 1332, 1339, 1340, 1346, 1347, 1348, 1349, 1354, + 1355, 1356, 1357, 1358, 1361, 1362, 1363, 1474, 1486, 1491, 1496, 1497, 1498, 1503, 1504, 1505, 1506, 1507, 1512, 1513, 1514, 1515, 1518, 1521, 1632, + 1633, 1636, 1637, 1641, 1642, 1646, 1647, 1648, 1649, 1650, 1655, 1656, 1661, 1662, 1663, 1664, 1665, 1669, 1670, 1671, 1672, 1677, 1678, 1792, 1802, + 1808, 1809, 1810, 1815, 1816, 1817, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1830, 1831, 1832, 1834, 1835, 1838, 1841, 1847, 1978, 1979, 1984, 1985, + 1986, 1987, 1988, 1992, 1993, 1995, 1999, 2001, 2002, 2003, 2004, 2007, 2009, 2010, 2011, 2012, 2015, 2016, 2017, 2018, 2024, 2120, 2128, 2129, 2133, + 2134, 2136, 2137, 2138, 2141, 2142, 2143, 2144, 2148, 2149, 2152, 2153, 2154, 2155, 2156, 2157, 2160, 2161, 2162, 2166, 2167, 2168, 2169, 2175, 2244, + 2249, 2250, 2252, 2253, 2254, 2259, 2260, 2261, 2266, 2267, 2269, 2272, 2324, 2325, 2329, 2330, 2333, 2334, 2335, 2341, 2346, 2347 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_13_R = { + 356, 572, 573, 574, 582, 583, 584, 591, 593, 602, 792, 793, 800, 801, 975, 977, 986, 1164, 1173, 1174, 1176, 1185, 1186, 1346, 1354, 1355, 1356, 1361, + 1362, 1363, 1496, 1497, 1503, 1512, 1513, 1514, 1515, 1521, 1636, 1637, 1646, 1647, 1648, 1655, 1661, 1669, 1670, 1677, 1678, 1808, 1809, 1815, 1816, + 1821, 1822, 1823, 1830, 1831, 1832, 1838, 1847, 1984, 1985, 1986, 1992, 1993, 1999, 2001, 2007, 2009, 2015, 2016, 2017, 2024, 2133, 2134, 2141, 2142, + 2143, 2148, 2152, 2153, 2154, 2160, 2161, 2166, 2167, 2168, 2175, 2249, 2250, 2259, 2260, 2266, 2267, 2272, 2329, 2333, 2334, 2341, 2346, 2347 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_13_L = { + 350, 366, 566, 567, 568, 576, 577, 586, 588, 594, 774, 780, 786, 787, 794, 795, 967, 978, 1157, 1165, 1166, 1167, 1168, 1177, 1178, 1332, 1339, 1340, + 1347, 1348, 1349, 1357, 1358, 1474, 1486, 1491, 1498, 1504, 1505, 1506, 1507, 1518, 1632, 1633, 1641, 1642, 1649, 1650, 1656, 1662, 1663, 1664, 1665, + 1671, 1672, 1792, 1802, 1810, 1817, 1824, 1825, 1826, 1827, 1834, 1835, 1841, 1978, 1979, 1987, 1988, 1995, 2002, 2003, 2004, 2010, 2011, 2012, 2018, + 2120, 2128, 2129, 2136, 2137, 2138, 2144, 2149, 2155, 2156, 2157, 2162, 2169, 2244, 2252, 2253, 2254, 2261, 2269, 2324, 2325, 2330, 2335 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_14 = { + 399, 400, 414, 415, 420, 617, 618, 625, 635, 647, 656, 811, 812, 814, 815, 816, 817, 822, 823, 824, 829, 830, 831, 834, 835, 843, 995, 997, 998, 999, + 1000, 1003, 1004, 1005, 1006, 1011, 1012, 1194, 1195, 1197, 1198, 1201, 1203, 1206, 1207, 1379, 1383, 1392 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_14_R = { + 414, 420, 625, 656, 814, 822, 823, 829, 834, 835, 843, 997, 1003, 1004, 1005, 1011, 1012, 1201, 1206, 1207, 1383, 1392 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_14_L = { + 399, 400, 415, 617, 618, 635, 647, 811, 812, 815, 816, 817, 824, 830, 831, 995, 998, 999, 1000, 1006, 1194, 1195, 1197, 1198, 1203, 1379 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_15 = { + 18, 19, 25, 26, 27, 28, 29, 30, 34, 35, 70, 74, 75, 79, 80, 81, 82, 89, 90, 154, 162, 163, 170, 171, 172, 179, 231, 232, 245, 258, 290, 297, 299, 300, + 301, 307, 308, 309, 310, 320, 422, 428, 431, 435, 438, 445, 447, 448, 454, 455, 456, 457, 463, 464, 465, 466, 473, 474, 475, 476, 477, 481, 482, 483, + 484, 485, 490, 491, 492, 493, 494, 505, 506, 507, 508, 522, 523, 524, 657, 658, 659, 668, 669, 670, 671, 672, 680, 681, 682, 683, 688, 689, 690, 691, + 692, 699, 700, 701, 702, 703, 704, 706, 707, 708, 709, 713, 715, 716, 726, 727, 734, 735, 836, 837, 838, 844, 845, 846, 850, 851, 852, 853, 854, 862, + 863, 864, 865, 869, 870, 871, 872, 873, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 1013, 1014, 1019, 1020, 1021, 1022, 1023, 1032, 1033, + 1034, 1035, 1045, 1046, 1047, 1048, 1056, 1060, 1061, 1063, 1068, 1070, 1202, 1208, 1209, 1210, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1227, 1228, + 1243, 1248, 1378, 1384, 1385, 1386, 1387, 1388, 1393, 1394, 1395, 1396, 1403, 1404, 1407, 1414, 1545, 1562 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_15_R = { + 25, 26, 27, 28, 34, 35, 70, 79, 80, 89, 90, 170, 171, 179, 231, 258, 297, 307, 308, 309, 320, 428, 435, 445, 454, 455, 463, 464, 473, 474, 481, 482, + 490, 491, 492, 505, 506, 522, 523, 524, 657, 668, 669, 670, 680, 681, 688, 689, 699, 700, 701, 706, 707, 708, 713, 715, 726, 734, 844, 850, 851, 852, + 862, 869, 870, 880, 881, 882, 883, 887, 888, 889, 890, 1019, 1020, 1032, 1033, 1045, 1046, 1047, 1056, 1063, 1070, 1214, 1215, 1216, 1227, 1228, 1248, + 1384, 1385, 1393, 1394, 1403, 1404, 1414, 1562 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_15_L = { + 18, 19, 29, 30, 74, 75, 81, 82, 154, 162, 163, 172, 232, 245, 290, 299, 300, 301, 310, 422, 431, 438, 447, 448, 456, 457, 465, 466, 475, 476, 477, 483, + 484, 485, 493, 494, 507, 508, 658, 659, 671, 672, 682, 683, 690, 691, 692, 702, 703, 704, 709, 716, 727, 735, 836, 837, 838, 845, 846, 853, 854, 863, + 864, 865, 871, 872, 873, 884, 885, 886, 1013, 1014, 1021, 1022, 1023, 1034, 1035, 1048, 1060, 1061, 1068, 1202, 1208, 1209, 1210, 1217, 1218, 1219, + 1220, 1243, 1378, 1386, 1387, 1388, 1395, 1396, 1407, 1545 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_16 = { 193, 202, 205, 368, 369, 374, 375, 377 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_16_R = { 193, 205, 369, 375 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_16_L = { 202, 368, 374, 377 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_17 = { + 2091, 2094, 2102, 2103, 2104, 2105, 2110, 2111, 2116, 2117, 2123, 2213, 2214, 2220, 2221, 2224, 2225, 2310, 2311, 2312, 2313, 2315, 2316, 2368, 2369, + 2371 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_17_R = { 2094, 2104, 2105, 2111, 2117, 2123, 2214, 2221, 2225, 2312, 2313, 2316, 2369 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_17_L = { 2091, 2102, 2103, 2110, 2116, 2213, 2220, 2224, 2310, 2311, 2315, 2368, 2371 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_18 = { + 112, 113, 114, 115, 123, 124, 125, 126, 135, 136, 145, 146, 147, 148, 149, 250, 251, 252, 253, 261, 262, 263, 264, 265, 271, 272, 273, 274, 275, 276, + 281, 282, 283, 284, 285, 286, 291, 292, 293, 294, 295, 296, 303, 304, 442, 449, 450, 451, 452, 453, 458, 459, 460, 461, 462, 467, 469, 470, 472, 478, + 479, 480, 486, 487, 488, 489, 497, 498, 499, 500, 501, 502, 662, 665, 666, 674, 676, 677, 678, 686, 694, 695, 696, 697, 721, 855, 859, 860, 861, 866, + 867, 875, 876, 877, 878, 1055 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_18_R = { + 114, 115, 125, 126, 136, 147, 148, 149, 252, 253, 263, 264, 265, 274, 275, 276, 284, 285, 286, 294, 295, 296, 304, 452, 453, 461, 462, 470, 472, 480, + 488, 489, 501, 502, 665, 666, 676, 677, 678, 686, 696, 697, 721, 859, 860, 861, 867, 877, 878, 1055 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_18_L = { + 112, 113, 123, 124, 135, 145, 146, 250, 251, 261, 262, 271, 272, 273, 281, 282, 283, 291, 292, 293, 303, 442, 449, 450, 451, 458, 459, 460, 467, 469, + 478, 479, 486, 487, 497, 498, 499, 500, 662, 674, 694, 695, 855, 866, 875, 876 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_19 = { + 1277, 1278, 1285, 1286, 1288, 1290, 1295, 1297, 1449, 1450, 1451, 1456, 1457, 1458, 1459, 1460, 1462, 1463, 1464, 1465, 1466, 1606, 1607, 1610, 1611, + 1612, 1766, 1767, 1768, 1771, 1772, 1774, 1780, 1934, 1943, 1944, 1945, 1946, 1951, 1952, 1953, 1955, 1962, 2101, 2106, 2107, 2112, 2113, 2114, 2118, + 2216, 2219, 2222, 2223, 2226, 2227, 2230, 2231, 2232, 2235, 2309, 2314, 2317, 2358, 2359, 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_19_R = { + 1285, 1286, 1295, 1297, 1456, 1457, 1458, 1462, 1463, 1464, 1466, 1610, 1611, 1771, 1772, 1780, 1943, 1944, 1951, 1952, 1953, 1962, 2106, 2107, 2112, + 2113, 2114, 2118, 2216, 2222, 2226, 2230, 2235, 2314, 2317, 2361, 2362, 2363, 2365, 2366, 2367 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_19_L = { + 1277, 1278, 1288, 1290, 1449, 1450, 1451, 1459, 1460, 1465, 1606, 1607, 1612, 1766, 1767, 1768, 1774, 1934, 1945, 1946, 1955, 2101, 2219, 2223, 2227, + 2231, 2232, 2309, 2358, 2359, 2360, 2364 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_20 = { + 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1037, 1038, 1040, 1041, 1043, 1044, 1051, 1052, 1053, 1054, 1062, 1221, 1222, 1223, 1224, 1225, 1226, + 1232, 1233, 1234, 1235, 1236, 1237, 1244, 1245, 1246, 1247, 1254, 1255, 1409, 1410, 1411, 1419, 1420, 1427, 1428, 1437, 1438 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_20_R = { + 1028, 1029, 1030, 1031, 1041, 1043, 1044, 1052, 1053, 1054, 1062, 1224, 1225, 1226, 1235, 1236, 1237, 1245, 1246, 1247, 1255, 1410, 1411, 1420, 1428, + 1438 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_20_L = { + 1024, 1025, 1026, 1027, 1037, 1038, 1040, 1051, 1221, 1222, 1223, 1232, 1233, 1234, 1244, 1254, 1409, 1419, 1427, 1437 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_21 = { + 1107, 1111, 1112, 1114, 1115, 1118, 1119, 1120, 1121, 1127, 1129, 1130, 1131, 1136, 1137, 1299, 1304, 1307, 1310, 1311, 1312, 1314, 1315, 1318, 1467, + 1468, 1469, 1470, 1613, 1616, 1617, 1618, 1619, 1622, 1623, 1625, 1630, 1773, 1775, 1778, 1779, 1781, 1784, 1785, 1786, 1787, 1790, 1791, 1794, 1797, + 1800, 1807, 1954, 1956, 1957, 1963, 1964, 1965, 1970, 1971, 1972, 1977, 1994, 2000, 2008, 2115, 2119, 2124, 2125, 2126, 2127, 2135, 2236, 2237, 2238, + 2241, 2242, 2243, 2251 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_21_R = { + 1111, 1112, 1118, 1119, 1120, 1127, 1129, 1136, 1137, 1304, 1310, 1311, 1314, 1318, 1468, 1469, 1616, 1617, 1622, 1630, 1778, 1779, 1784, 1785, 1790, + 1797, 1800, 1807, 1963, 1970, 1971, 1977, 2000, 2008, 2124, 2125, 2135, 2241, 2242, 2251 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_21_L = { + 1107, 1114, 1115, 1121, 1130, 1131, 1299, 1307, 1312, 1315, 1467, 1470, 1613, 1618, 1619, 1623, 1625, 1773, 1775, 1781, 1786, 1787, 1791, 1794, 1954, + 1956, 1957, 1964, 1965, 1972, 1994, 2115, 2119, 2126, 2127, 2236, 2237, 2238, 2243 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_22 = { + 1380, 1390, 1391, 1397, 1398, 1399, 1400, 1401, 1402, 1540, 1547, 1548, 1549, 1550, 1551, 1552, 1553, 1557, 1560, 1561, 1570, 1577, 1578, 1694, 1695, + 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1722, 1723, + 1724, 1725, 1732, 1733, 1734, 1740, 1741, 1742, 1743, 1750, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1868, 1869, 1870, 1871, + 1872, 1873, 1874, 1875, 1881, 1883, 1884, 1886, 1893, 1894, 1900, 1901, 1902, 1903, 1904, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, + 2045, 2050, 2051, 2052, 2053, 2054, 2055, 2061, 2062, 2069, 2070, 2079, 2080, 2081, 2082, 2092, 2093, 2186, 2187, 2193, 2194, 2195, 2196, 2197, 2202, + 2203, 2204, 2205, 2212, 2215, 2291, 2292, 2297, 2298, 2299, 2300, 2304, 2305, 2306 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_22_R = { + 1391, 1400, 1401, 1402, 1550, 1551, 1552, 1553, 1560, 1561, 1570, 1578, 1699, 1700, 1701, 1707, 1708, 1709, 1715, 1716, 1717, 1718, 1724, 1725, 1734, + 1742, 1743, 1750, 1856, 1862, 1863, 1864, 1865, 1872, 1873, 1874, 1875, 1884, 1886, 1894, 1903, 1904, 2042, 2043, 2044, 2045, 2053, 2054, 2055, 2062, + 2070, 2081, 2082, 2093, 2187, 2196, 2197, 2205, 2215, 2292, 2299, 2300, 2306 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_22_L = { + 1380, 1390, 1397, 1398, 1399, 1540, 1547, 1548, 1549, 1557, 1577, 1694, 1695, 1696, 1697, 1698, 1702, 1703, 1704, 1705, 1706, 1710, 1711, 1712, 1713, + 1714, 1722, 1723, 1732, 1733, 1740, 1741, 1857, 1858, 1859, 1860, 1861, 1866, 1868, 1869, 1870, 1871, 1881, 1883, 1893, 1900, 1901, 1902, 2035, 2036, + 2037, 2038, 2039, 2040, 2041, 2050, 2051, 2052, 2061, 2069, 2079, 2080, 2092, 2186, 2193, 2194, 2195, 2202, 2203, 2204, 2212, 2291, 2297, 2298, 2304, + 2305 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_23 = { + 186, 187, 188, 189, 190, 191, 192, 194, 195, 196, 197, 198, 199, 200, 201, 203, 204, 327, 328, 329, 330, 340, 341, 367, 370 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_23_R = { 188, 189, 192, 196, 197, 200, 201, 204, 329, 330, 370 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_23_L = { 186, 187, 190, 191, 194, 195, 198, 199, 203, 327, 328, 340, 341, 367 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_24 = { + 134, 137, 143, 150, 270, 440, 443, 468, 471, 495, 496, 503, 504, 684, 685, 687, 693, 698, 719, 722, 874, 879, 2211, 2245, 2248 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_24_R = { 137, 150, 443, 471, 503, 504, 687, 698, 722, 879, 2248 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_24_L = { 134, 143, 270, 440, 468, 495, 496, 684, 685, 693, 719, 874, 2211, 2245 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_25 = { 512, 513, 514, 515, 516, 517, 518, 519, 529, 531, 532, 534, 544, 545, 552, 553 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_25_R = { 516, 517, 518, 519, 532, 534, 545, 553 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_25_L = { 512, 513, 514, 515, 529, 531, 544, 552 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_26 = { + 371, 372, 373, 376, 378, 379, 380, 381, 578, 587, 592, 595, 596, 599, 600, 601, 603, 608, 609, 796, 799, 802, 803, 804, 805, 806, 807, 808, 809, 810, + 969, 974, 979, 980, 981, 984, 985, 987, 988, 989, 990, 991, 993, 994, 1179, 1184, 1187, 1193, 1364, 1367, 1368, 1369, 1516, 1517, 1522, 1523, 1524, + 1525, 1528, 1529, 1530, 1531, 1532, 1673, 1676, 1679, 1680, 1681, 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1833, 1839, 1840, 1842, + 1843, 1846, 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, 2019, 2022, 2023, 2025, 2026, 2027, 2030, 2031, 2032, 2034, 2145, 2163, 2164, 2165, 2170, + 2171, 2173, 2174, 2176, 2177, 2255, 2256, 2257, 2258, 2262, 2263, 2264, 2265, 2268, 2270, 2271, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, + 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2336, 2339, 2340, 2342, 2343, 2344, 2345, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, 2375, + 2376, 2377, 2378, 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_26_R = { + 371, 372, 376, 379, 380, 381, 592, 599, 600, 601, 608, 609, 799, 806, 807, 808, 809, 810, 974, 984, 985, 991, 993, 994, 1184, 1193, 1367, 1368, 1369, + 1522, 1523, 1528, 1529, 1531, 1532, 1676, 1684, 1685, 1686, 1690, 1691, 1692, 1693, 1839, 1840, 1846, 1851, 1852, 1853, 1855, 2022, 2023, 2030, 2031, + 2034, 2165, 2173, 2174, 2257, 2258, 2264, 2265, 2271, 2273, 2274, 2278, 2279, 2280, 2281, 2285, 2286, 2287, 2339, 2340, 2344, 2345, 2352, 2353, 2354, + 2355, 2357, 2380, 2384, 2385, 2386, 2390, 2391, 2392 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_26_L = { + 373, 378, 578, 587, 595, 596, 603, 796, 802, 803, 804, 805, 969, 979, 980, 981, 987, 988, 989, 990, 1179, 1187, 1364, 1516, 1517, 1524, 1525, 1530, + 1673, 1679, 1680, 1681, 1687, 1688, 1689, 1833, 1842, 1843, 1848, 1849, 1850, 1854, 2019, 2025, 2026, 2027, 2032, 2145, 2163, 2164, 2170, 2171, 2176, + 2177, 2255, 2256, 2262, 2263, 2268, 2270, 2275, 2276, 2277, 2282, 2283, 2284, 2288, 2336, 2342, 2343, 2348, 2349, 2350, 2351, 2356, 2375, 2376, 2377, + 2378, 2381, 2382, 2383, 2387, 2388, 2389, 2393 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_27 = { 1372, 1373, 1376, 1377, 1533, 1538, 1539, 1544 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_27_R = { 1376, 1377, 1538, 1544 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_27_L = { 1372, 1373, 1533, 1539 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_28 = { + 1867, 1876, 1882, 1885, 2046, 2048, 2049, 2056, 2060, 2063, 2068, 2071, 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2188, 2189, 2190, 2191, 2192, + 2198, 2199, 2289, 2290, 2293, 2294, 2295, 2296, 2301, 2302, 2303, 2307, 2308 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_28_R = { + 1876, 1885, 2046, 2056, 2063, 2071, 2180, 2181, 2188, 2189, 2190, 2198, 2199, 2293, 2301, 2307, 2308 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_28_L = { + 1867, 1882, 2048, 2049, 2060, 2068, 2178, 2179, 2182, 2183, 2184, 2185, 2191, 2192, 2289, 2290, 2294, 2295, 2296, 2302, 2303 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_29 = { + 31, 32, 33, 36, 37, 38, 39, 83, 84, 87, 88, 91, 92, 93, 94, 95, 96, 173, 174, 175, 176, 177, 178, 180, 181, 182, 183, 184, 185, 302, 305, 306, 311, 319, + 321, 322, 334, 335, 509, 510, 511, 520, 521, 525, 538, 539, 540, 541, 549, 550, 705, 710, 711, 714, 717, 718, 723, 724, 725, 732, 733, 736, 741, 742, + 743, 748, 749, 750, 891, 892, 894, 895, 896, 897, 902, 903, 904, 905, 909, 910, 911, 912, 916, 917, 918, 919, 924, 925, 926, 931, 1036, 1049, 1050, + 1057, 1058, 1059, 1064, 1065, 1066, 1067, 1069, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1081, 1082, 1085, 1086, 1087, 1088, 1089, 1090, + 1091, 1094, 1095, 1096, 1097, 1098, 1099, 1104, 1105, 1106, 1113, 1229, 1230, 1231, 1238, 1239, 1240, 1241, 1242, 1249, 1250, 1251, 1252, 1253, 1256, + 1257, 1258, 1259, 1260, 1261, 1262, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1279, 1284, 1287, 1405, 1406, 1413, + 1415, 1416, 1426, 1429, 1433, 1434, 1440, 1441, 1565, 1566, 1567, 1571, 1572, 1573 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_29_R = { + 32, 33, 38, 39, 87, 88, 94, 95, 96, 176, 177, 178, 183, 184, 185, 305, 306, 319, 334, 335, 520, 521, 538, 539, 549, 550, 705, 714, 723, 724, 725, 732, + 733, 741, 742, 748, 749, 750, 894, 895, 896, 902, 903, 909, 910, 916, 917, 924, 925, 931, 1057, 1058, 1064, 1065, 1069, 1071, 1072, 1077, 1078, 1085, + 1086, 1087, 1094, 1095, 1096, 1097, 1104, 1105, 1113, 1238, 1239, 1240, 1249, 1250, 1256, 1257, 1258, 1259, 1264, 1265, 1271, 1272, 1273, 1274, 1275, + 1284, 1287, 1413, 1415, 1416, 1429, 1440, 1441, 1571, 1572, 1573 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_29_L = { + 31, 36, 37, 83, 84, 91, 92, 93, 173, 174, 175, 180, 181, 182, 302, 311, 321, 322, 509, 510, 511, 525, 540, 541, 710, 711, 717, 718, 736, 743, 891, 892, + 897, 904, 905, 911, 912, 918, 919, 926, 1036, 1049, 1050, 1059, 1066, 1067, 1073, 1074, 1075, 1076, 1079, 1081, 1082, 1088, 1089, 1090, 1091, 1098, + 1099, 1106, 1229, 1230, 1231, 1241, 1242, 1251, 1252, 1253, 1260, 1261, 1262, 1266, 1267, 1268, 1269, 1270, 1276, 1279, 1405, 1406, 1426, 1433, 1434, + 1565, 1566, 1567 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_30 = { + 1417, 1423, 1424, 1425, 1431, 1432, 1574, 1575, 1579, 1580, 1581, 1584, 1585, 1729, 1737, 1738, 1739, 1744, 1745, 1746, 1752, 1753 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_30_R = { 1423, 1431, 1432, 1579, 1580, 1584, 1585, 1737, 1744, 1745, 1752 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_30_L = { 1417, 1424, 1425, 1574, 1575, 1581, 1729, 1738, 1739, 1746, 1753 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_31 = { 1080, 1280, 1289, 1296, 1298, 1305, 1306 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_31_R = { 1296, 1305, 1306 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_31_L = { 1080, 1280, 1289, 1298 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_32 = { + 2, 3, 4, 11, 12, 13, 14, 22, 23, 24, 44, 45, 53, 54, 55, 56, 57, 58, 64, 65, 66, 67, 68, 69, 76, 77, 78, 85, 86, 144, 155, 156, 157, 158, 159, 160, 164, + 165, 166, 167, 168, 169 +}; +static const std::vector ANATOMICAL_AREAS_VOXELS_32_R = { 4, 13, 14, 23, 24, 45, 56, 57, 58, 67, 68, 69, 77, 78, 86, 158, 159, 160, 167, 168, 169 }; +static const std::vector ANATOMICAL_AREAS_VOXELS_32_L = { 2, 3, 11, 12, 22, 44, 53, 54, 55, 64, 65, 66, 76, 85, 144, 155, 156, 157, 164, 165, 166 }; + +static const std::map> ANATOMICALS = +{ + { "Angular Gyrus", ANATOMICAL_AREAS_VOXELS_0 }, + { "Angular Gyrus R", ANATOMICAL_AREAS_VOXELS_0_R }, + { "Angular Gyrus L", ANATOMICAL_AREAS_VOXELS_0_L }, + { "Anterior Cingulate", ANATOMICAL_AREAS_VOXELS_1 }, + { "Anterior Cingulate R", ANATOMICAL_AREAS_VOXELS_1_R }, + { "Anterior Cingulate L", ANATOMICAL_AREAS_VOXELS_1_L }, + { "Cingulate Gyrus", ANATOMICAL_AREAS_VOXELS_2 }, + { "Cingulate Gyrus R", ANATOMICAL_AREAS_VOXELS_2_R }, + { "Cingulate Gyrus L", ANATOMICAL_AREAS_VOXELS_2_L }, + { "Cuneus", ANATOMICAL_AREAS_VOXELS_3 }, + { "Cuneus R", ANATOMICAL_AREAS_VOXELS_3_R }, + { "Cuneus L", ANATOMICAL_AREAS_VOXELS_3_L }, + { "Extra-Nuclear", ANATOMICAL_AREAS_VOXELS_4 }, + { "Extra-Nuclear R", ANATOMICAL_AREAS_VOXELS_4_R }, + { "Extra-Nuclear L", ANATOMICAL_AREAS_VOXELS_4_L }, + { "Fusiform Gyrus", ANATOMICAL_AREAS_VOXELS_5 }, + { "Fusiform Gyrus R", ANATOMICAL_AREAS_VOXELS_5_R }, + { "Fusiform Gyrus L", ANATOMICAL_AREAS_VOXELS_5_L }, + { "Inferior Frontal Gyrus", ANATOMICAL_AREAS_VOXELS_6 }, + { "Inferior Frontal Gyrus R", ANATOMICAL_AREAS_VOXELS_6_R }, + { "Inferior Frontal Gyrus L", ANATOMICAL_AREAS_VOXELS_6_L }, + { "Inferior Occipital Gyrus", ANATOMICAL_AREAS_VOXELS_7 }, + { "Inferior Occipital Gyrus R", ANATOMICAL_AREAS_VOXELS_7_R }, + { "Inferior Occipital Gyrus L", ANATOMICAL_AREAS_VOXELS_7_L }, + { "Inferior Parietal Lobule", ANATOMICAL_AREAS_VOXELS_8 }, + { "Inferior Parietal Lobule R", ANATOMICAL_AREAS_VOXELS_8_R }, + { "Inferior Parietal Lobule L", ANATOMICAL_AREAS_VOXELS_8_L }, + { "Inferior Temporal Gyrus", ANATOMICAL_AREAS_VOXELS_9 }, + { "Inferior Temporal Gyrus R", ANATOMICAL_AREAS_VOXELS_9_R }, + { "Inferior Temporal Gyrus L", ANATOMICAL_AREAS_VOXELS_9_L }, + { "Insula", ANATOMICAL_AREAS_VOXELS_10 }, + { "Insula R", ANATOMICAL_AREAS_VOXELS_10_R }, + { "Insula L", ANATOMICAL_AREAS_VOXELS_10_L }, + { "Lingual Gyrus", ANATOMICAL_AREAS_VOXELS_11 }, + { "Lingual Gyrus R", ANATOMICAL_AREAS_VOXELS_11_R }, + { "Lingual Gyrus L", ANATOMICAL_AREAS_VOXELS_11_L }, + { "Medial Frontal Gyrus", ANATOMICAL_AREAS_VOXELS_12 }, + { "Medial Frontal Gyrus R", ANATOMICAL_AREAS_VOXELS_12_R }, + { "Medial Frontal Gyrus L", ANATOMICAL_AREAS_VOXELS_12_L }, + { "Middle Frontal Gyrus", ANATOMICAL_AREAS_VOXELS_13 }, + { "Middle Frontal Gyrus R", ANATOMICAL_AREAS_VOXELS_13_R }, + { "Middle Frontal Gyrus L", ANATOMICAL_AREAS_VOXELS_13_L }, + { "Middle Occipital Gyrus", ANATOMICAL_AREAS_VOXELS_14 }, + { "Middle Occipital Gyrus R", ANATOMICAL_AREAS_VOXELS_14_R }, + { "Middle Occipital Gyrus L", ANATOMICAL_AREAS_VOXELS_14_L }, + { "Middle Temporal Gyrus", ANATOMICAL_AREAS_VOXELS_15 }, + { "Middle Temporal Gyrus R", ANATOMICAL_AREAS_VOXELS_15_R }, + { "Middle Temporal Gyrus L", ANATOMICAL_AREAS_VOXELS_15_L }, + { "Orbital Gyrus", ANATOMICAL_AREAS_VOXELS_16 }, + { "Orbital Gyrus R", ANATOMICAL_AREAS_VOXELS_16_R }, + { "Orbital Gyrus L", ANATOMICAL_AREAS_VOXELS_16_L }, + { "Paracentral Lobule", ANATOMICAL_AREAS_VOXELS_17 }, + { "Paracentral Lobule R", ANATOMICAL_AREAS_VOXELS_17_R }, + { "Paracentral Lobule L", ANATOMICAL_AREAS_VOXELS_17_L }, + { "Parahippocampal Gyrus", ANATOMICAL_AREAS_VOXELS_18 }, + { "Parahippocampal Gyrus R", ANATOMICAL_AREAS_VOXELS_18_R }, + { "Parahippocampal Gyrus L", ANATOMICAL_AREAS_VOXELS_18_L }, + { "Postcentral Gyrus", ANATOMICAL_AREAS_VOXELS_19 }, + { "Postcentral Gyrus R", ANATOMICAL_AREAS_VOXELS_19_R }, + { "Postcentral Gyrus L", ANATOMICAL_AREAS_VOXELS_19_L }, + { "Posterior Cingulate", ANATOMICAL_AREAS_VOXELS_20 }, + { "Posterior Cingulate R", ANATOMICAL_AREAS_VOXELS_20_R }, + { "Posterior Cingulate L", ANATOMICAL_AREAS_VOXELS_20_L }, + { "Precentral Gyrus", ANATOMICAL_AREAS_VOXELS_21 }, + { "Precentral Gyrus R", ANATOMICAL_AREAS_VOXELS_21_R }, + { "Precentral Gyrus L", ANATOMICAL_AREAS_VOXELS_21_L }, + { "Precuneus", ANATOMICAL_AREAS_VOXELS_22 }, + { "Precuneus R", ANATOMICAL_AREAS_VOXELS_22_R }, + { "Precuneus L", ANATOMICAL_AREAS_VOXELS_22_L }, + { "Rectal Gyrus", ANATOMICAL_AREAS_VOXELS_23 }, + { "Rectal Gyrus R", ANATOMICAL_AREAS_VOXELS_23_R }, + { "Rectal Gyrus L", ANATOMICAL_AREAS_VOXELS_23_L }, + { "Sub-Gyral", ANATOMICAL_AREAS_VOXELS_24 }, + { "Sub-Gyral R", ANATOMICAL_AREAS_VOXELS_24_R }, + { "Sub-Gyral L", ANATOMICAL_AREAS_VOXELS_24_L }, + { "Subcallosal Gyrus", ANATOMICAL_AREAS_VOXELS_25 }, + { "Subcallosal Gyrus R", ANATOMICAL_AREAS_VOXELS_25_R }, + { "Subcallosal Gyrus L", ANATOMICAL_AREAS_VOXELS_25_L }, + { "Superior Frontal Gyrus", ANATOMICAL_AREAS_VOXELS_26 }, + { "Superior Frontal Gyrus R", ANATOMICAL_AREAS_VOXELS_26_R }, + { "Superior Frontal Gyrus L", ANATOMICAL_AREAS_VOXELS_26_L }, + { "Superior Occipital Gyrus", ANATOMICAL_AREAS_VOXELS_27 }, + { "Superior Occipital Gyrus R", ANATOMICAL_AREAS_VOXELS_27_R }, + { "Superior Occipital Gyrus L", ANATOMICAL_AREAS_VOXELS_27_L }, + { "Superior Parietal Lobule", ANATOMICAL_AREAS_VOXELS_28 }, + { "Superior Parietal Lobule R", ANATOMICAL_AREAS_VOXELS_28_R }, + { "Superior Parietal Lobule L", ANATOMICAL_AREAS_VOXELS_28_L }, + { "Superior Temporal Gyrus", ANATOMICAL_AREAS_VOXELS_29 }, + { "Superior Temporal Gyrus R", ANATOMICAL_AREAS_VOXELS_29_R }, + { "Superior Temporal Gyrus L", ANATOMICAL_AREAS_VOXELS_29_L }, + { "Supramarginal Gyrus", ANATOMICAL_AREAS_VOXELS_30 }, + { "Supramarginal Gyrus R", ANATOMICAL_AREAS_VOXELS_30_R }, + { "Supramarginal Gyrus L", ANATOMICAL_AREAS_VOXELS_30_L }, + { "Transverse Temporal Gyrus", ANATOMICAL_AREAS_VOXELS_31 }, + { "Transverse Temporal Gyrus R", ANATOMICAL_AREAS_VOXELS_31_R }, + { "Transverse Temporal Gyrus L", ANATOMICAL_AREAS_VOXELS_31_L }, + { "Uncus", ANATOMICAL_AREAS_VOXELS_32 }, + { "Uncus R", ANATOMICAL_AREAS_VOXELS_32_R }, + { "Uncus L", ANATOMICAL_AREAS_VOXELS_32_L } +}; + +static const std::vector LOBES_VOXELS_0 = { + 610, 612, 614, 617, 618, 619, 620, 623, 624, 625, 629, 631, 633, 637, 638, 643, 644, 649, 651, 652, 654, 663, 664, 666, 672, 676, 680, 683, 688, 815, + 816, 817, 818, 819, 820, 821, 822, 823, 825, 826, 827, 828, 832, 833, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, + 851, 852, 853, 855, 856, 857, 858, 859, 860, 861, 863, 864, 866, 867, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, + 885, 886, 888, 889, 890, 891, 892, 894, 895, 896, 897, 898, 899, 901, 902, 903, 904, 906, 907, 908, 912, 916, 917, 918, 919, 921, 922, 924, 925, 929, + 937, 940, 943, 944, 945, 947, 948, 953, 954, 958, 968, 975, 976, 1055, 1068, 1070, 1141, 1142, 1146, 1147, 1148, 1152, 1153, 1156, 1159, 1160, 1161, + 1162, 1165, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, + 1190, 1191, 1192, 1193, 1349, 1354 +}; +static const std::vector LOBES_VOXELS_0_R = { + 620, 624, 625, 631, 633, 643, 644, 652, 654, 664, 666, 676, 680, 688, 820, 821, 822, 823, 827, 828, 833, 835, 842, 843, 844, 849, 850, 851, 852, 858, + 859, 860, 861, 867, 869, 870, 877, 878, 879, 880, 881, 882, 883, 888, 889, 890, 894, 895, 896, 901, 902, 903, 908, 916, 917, 922, 924, 925, 929, 937, + 944, 945, 947, 953, 958, 975, 976, 1055, 1070, 1142, 1147, 1152, 1153, 1156, 1161, 1162, 1171, 1172, 1173, 1174, 1175, 1176, 1182, 1183, 1184, 1185, + 1186, 1190, 1191, 1192, 1193, 1354 +}; +static const std::vector LOBES_VOXELS_0_L = { + 610, 612, 614, 617, 618, 619, 623, 629, 637, 638, 649, 651, 663, 672, 683, 815, 816, 817, 818, 819, 825, 826, 832, 836, 837, 838, 839, 840, 841, 845, + 846, 847, 848, 853, 855, 856, 857, 863, 864, 866, 871, 872, 873, 874, 875, 876, 884, 885, 886, 891, 892, 897, 898, 899, 904, 906, 907, 912, 918, 919, + 921, 940, 943, 948, 954, 968, 1068, 1141, 1146, 1148, 1159, 1160, 1165, 1167, 1168, 1169, 1170, 1177, 1178, 1179, 1180, 1181, 1187, 1188, 1189, 1349 +}; +static const std::vector LOBES_VOXELS_1 = { + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 312, 313, 314, 315, 316, 317, 318, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 512, 513, 514, 515, 516, 517, + 518, 519, 528, 529, 530, 531, 532, 533, 534, 535, 542, 543, 544, 545, 546, 547, 548, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 751, 756, 757, 758, 759, 760, 763, 764, 765, 766, 767, 768, 771, 772, + 773, 774, 775, 778, 779, 780, 782, 783, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, + 807, 808, 809, 810, 932, 933, 938, 939, 941, 942, 946, 949, 950, 951, 952, 957, 959, 960, 965, 966, 967, 969, 974, 977, 978, 979, 980, 981, 982, 983, + 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 1107, 1111, 1112, 1114, 1115, 1118, 1119, 1120, 1121, 1122, 1127, 1128, 1129, 1130, 1131, 1136, + 1137, 1138, 1139, 1140, 1143, 1144, 1145, 1149, 1150, 1154, 1155, 1157, 1158, 1163, 1164, 1166, 1299, 1304, 1307, 1310, 1311, 1312, 1314, 1315, 1316, + 1317, 1318, 1319, 1320, 1321, 1322, 1323, 1324, 1325, 1328, 1329, 1330, 1331, 1332, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, + 1348, 1350, 1351, 1352, 1353, 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1467, 1468, 1469, 1470, 1471, + 1472, 1473, 1474, 1475, 1476, 1477, 1478, 1479, 1482, 1483, 1484, 1485, 1486, 1489, 1490, 1491, 1496, 1497, 1498, 1499, 1502, 1503, 1504, 1505, 1506, + 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, + 1532, 1613, 1616, 1617, 1618, 1619, 1622, 1623, 1624, 1625, 1628, 1629, 1630, 1631, 1632, 1633, 1636, 1637, 1638, 1639, 1640, 1641, 1642, 1646, 1647, + 1648, 1649, 1650, 1655, 1656, 1661, 1662, 1663, 1664, 1665, 1666, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, + 1683, 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1773, 1775, 1778, 1779, 1781, 1784, 1785, 1786, 1787, 1790, 1791, 1792, 1793, 1794, + 1797, 1798, 1799, 1800, 1801, 1802, 1803, 1806, 1807, 1808, 1809, 1810, 1815, 1816, 1817, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, + 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, 1854, 1855, + 1954, 1956, 1957, 1963, 1964, 1965, 1970, 1971, 1972, 1977, 1978, 1979, 1984, 1985, 1986, 1987, 1988, 1992, 1993, 1994, 1995, 1999, 2000, 2001, 2002, + 2003, 2004, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, + 2030, 2031, 2032, 2033, 2034, 2091, 2094, 2102, 2103, 2104, 2105, 2110, 2111, 2115, 2116, 2117, 2119, 2120, 2122, 2123, 2124, 2125, 2126, 2127, 2128, + 2129, 2133, 2134, 2135, 2136, 2137, 2138, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, + 2159, 2160, 2161, 2162, 2163, 2164, 2165, 2166, 2167, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2213, 2214, 2220, 2221, 2224, 2225, + 2228, 2229, 2233, 2234, 2236, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254, 2255, 2256, + 2257, 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, + 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2310, 2311, 2312, 2313, 2315, 2316, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329, + 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, 2354, + 2355, 2356, 2357, 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, + 2392, 2393 +}; +static const std::vector LOBES_VOXELS_1_R = { + 188, 189, 192, 193, 196, 197, 200, 201, 204, 205, 315, 316, 317, 318, 329, 330, 331, 332, 333, 342, 343, 344, 345, 346, 347, 353, 354, 355, 356, 357, + 358, 362, 363, 364, 365, 369, 370, 371, 372, 375, 376, 379, 380, 381, 516, 517, 518, 519, 532, 533, 534, 535, 545, 546, 547, 548, 553, 554, 555, 556, + 562, 563, 564, 571, 572, 573, 574, 581, 582, 583, 584, 585, 590, 591, 592, 593, 598, 599, 600, 601, 602, 606, 607, 608, 609, 756, 763, 764, 765, 766, + 771, 772, 778, 779, 783, 785, 790, 791, 792, 793, 798, 799, 800, 801, 806, 807, 808, 809, 810, 938, 939, 946, 951, 952, 957, 965, 966, 974, 977, 983, + 984, 985, 986, 991, 992, 993, 994, 1111, 1112, 1118, 1119, 1120, 1127, 1128, 1129, 1136, 1137, 1138, 1143, 1144, 1145, 1154, 1155, 1163, 1164, 1304, + 1310, 1311, 1314, 1317, 1318, 1321, 1322, 1323, 1328, 1329, 1330, 1337, 1338, 1344, 1345, 1346, 1352, 1353, 1355, 1356, 1360, 1361, 1362, 1363, 1366, + 1367, 1368, 1369, 1468, 1469, 1475, 1476, 1477, 1482, 1483, 1484, 1489, 1490, 1496, 1497, 1502, 1503, 1510, 1511, 1512, 1513, 1514, 1515, 1520, 1521, + 1522, 1523, 1527, 1528, 1529, 1531, 1532, 1616, 1617, 1622, 1628, 1629, 1630, 1636, 1637, 1638, 1639, 1646, 1647, 1648, 1655, 1661, 1669, 1670, 1675, + 1676, 1677, 1678, 1683, 1684, 1685, 1686, 1690, 1691, 1692, 1693, 1778, 1779, 1784, 1785, 1790, 1797, 1798, 1799, 1800, 1806, 1807, 1808, 1809, 1815, + 1816, 1821, 1822, 1823, 1829, 1830, 1831, 1832, 1837, 1838, 1839, 1840, 1845, 1846, 1847, 1851, 1852, 1853, 1855, 1963, 1970, 1971, 1977, 1984, 1985, + 1986, 1992, 1993, 1999, 2000, 2001, 2007, 2008, 2009, 2014, 2015, 2016, 2017, 2021, 2022, 2023, 2024, 2029, 2030, 2031, 2033, 2034, 2094, 2104, 2105, + 2111, 2117, 2123, 2124, 2125, 2133, 2134, 2135, 2141, 2142, 2143, 2147, 2148, 2151, 2152, 2153, 2154, 2159, 2160, 2161, 2165, 2166, 2167, 2168, 2173, + 2174, 2175, 2214, 2221, 2225, 2229, 2234, 2240, 2241, 2242, 2247, 2248, 2249, 2250, 2251, 2257, 2258, 2259, 2260, 2264, 2265, 2266, 2267, 2271, 2272, + 2273, 2274, 2278, 2279, 2280, 2281, 2285, 2286, 2287, 2312, 2313, 2316, 2319, 2321, 2323, 2328, 2329, 2332, 2333, 2334, 2338, 2339, 2340, 2341, 2344, + 2345, 2346, 2347, 2352, 2353, 2354, 2355, 2357, 2374, 2379, 2380, 2384, 2385, 2386, 2390, 2391, 2392 +}; +static const std::vector LOBES_VOXELS_1_L = { + 186, 187, 190, 191, 194, 195, 198, 199, 202, 203, 312, 313, 314, 323, 324, 325, 326, 327, 328, 336, 337, 338, 339, 340, 341, 348, 349, 350, 351, 352, + 359, 360, 361, 366, 367, 368, 373, 374, 377, 378, 512, 513, 514, 515, 528, 529, 530, 531, 542, 543, 544, 551, 552, 557, 558, 559, 560, 561, 565, 566, + 567, 568, 569, 570, 575, 576, 577, 578, 579, 580, 586, 587, 588, 589, 594, 595, 596, 597, 603, 604, 605, 751, 757, 758, 759, 760, 767, 768, 773, 774, + 775, 780, 782, 786, 787, 788, 789, 794, 795, 796, 797, 802, 803, 804, 805, 932, 933, 941, 942, 949, 950, 959, 960, 967, 969, 978, 979, 980, 981, 982, + 987, 988, 989, 990, 1107, 1114, 1115, 1121, 1122, 1130, 1131, 1139, 1140, 1149, 1150, 1157, 1158, 1166, 1299, 1307, 1312, 1315, 1316, 1319, 1320, 1324, + 1325, 1331, 1332, 1339, 1340, 1341, 1342, 1343, 1347, 1348, 1350, 1351, 1357, 1358, 1359, 1364, 1365, 1467, 1470, 1471, 1472, 1473, 1474, 1478, 1479, + 1485, 1486, 1491, 1498, 1499, 1504, 1505, 1506, 1507, 1508, 1509, 1516, 1517, 1518, 1519, 1524, 1525, 1526, 1530, 1613, 1618, 1619, 1623, 1624, 1625, + 1631, 1632, 1633, 1640, 1641, 1642, 1649, 1650, 1656, 1662, 1663, 1664, 1665, 1666, 1671, 1672, 1673, 1674, 1679, 1680, 1681, 1682, 1687, 1688, 1689, + 1773, 1775, 1781, 1786, 1787, 1791, 1792, 1793, 1794, 1801, 1802, 1803, 1810, 1817, 1824, 1825, 1826, 1827, 1828, 1833, 1834, 1835, 1836, 1841, 1842, + 1843, 1844, 1848, 1849, 1850, 1854, 1954, 1956, 1957, 1964, 1965, 1972, 1978, 1979, 1987, 1988, 1994, 1995, 2002, 2003, 2004, 2010, 2011, 2012, 2013, + 2018, 2019, 2020, 2025, 2026, 2027, 2028, 2032, 2091, 2102, 2103, 2110, 2115, 2116, 2119, 2120, 2122, 2126, 2127, 2128, 2129, 2136, 2137, 2138, 2144, + 2145, 2146, 2149, 2150, 2155, 2156, 2157, 2158, 2162, 2163, 2164, 2169, 2170, 2171, 2172, 2176, 2177, 2213, 2220, 2224, 2228, 2233, 2236, 2237, 2238, + 2239, 2243, 2244, 2245, 2246, 2252, 2253, 2254, 2255, 2256, 2261, 2262, 2263, 2268, 2269, 2270, 2275, 2276, 2277, 2282, 2283, 2284, 2288, 2310, 2311, + 2315, 2318, 2320, 2322, 2324, 2325, 2326, 2327, 2330, 2331, 2335, 2336, 2337, 2342, 2343, 2348, 2349, 2350, 2351, 2356, 2370, 2371, 2372, 2373, 2375, + 2376, 2377, 2378, 2381, 2382, 2383, 2387, 2388, 2389, 2393 +}; +static const std::vector LOBES_VOXELS_2 = { + 2, 3, 4, 11, 12, 13, 14, 21, 22, 23, 24, 44, 45, 53, 54, 55, 56, 57, 58, 64, 65, 66, 67, 68, 69, 76, 77, 78, 85, 86, 112, 113, 114, 115, 123, 124, 125, + 126, 135, 136, 144, 145, 146, 147, 148, 149, 155, 156, 157, 158, 159, 160, 164, 165, 166, 167, 168, 169, 250, 251, 252, 253, 261, 262, 263, 264, 265, + 271, 272, 273, 274, 275, 276, 281, 282, 283, 284, 285, 286, 291, 292, 293, 294, 295, 296, 303, 304, 442, 449, 450, 451, 452, 453, 458, 459, 460, 461, + 462, 467, 469, 470, 472, 478, 479, 480, 486, 487, 488, 489, 497, 498, 499, 500, 501, 502, 662, 665, 674, 677, 678, 684, 686, 687, 694, 695, 696, 697, + 720, 721, 729, 730, 738, 739, 745, 746, 753, 754, 761, 762, 769, 770, 776, 777, 781, 784, 955, 956, 961, 962, 963, 964, 970, 971, 972, 973, 1024, 1025, + 1026, 1027, 1028, 1029, 1030, 1031, 1037, 1038, 1040, 1041, 1043, 1044, 1051, 1052, 1053, 1054, 1062, 1151, 1221, 1222, 1223, 1224, 1225, 1226, 1232, + 1233, 1234, 1235, 1236, 1237, 1244, 1245, 1246, 1247, 1254, 1255, 1326, 1327, 1333, 1334, 1335, 1336, 1408, 1409, 1410, 1411, 1412, 1419, 1420, 1427, + 1428, 1437, 1438, 1480, 1481, 1487, 1488, 1492, 1493, 1494, 1495, 1500, 1501, 1568, 1569, 1576, 1582, 1583, 1589, 1590, 1596, 1597, 1602, 1603, 1608, + 1609, 1614, 1615, 1620, 1621, 1626, 1627, 1634, 1635, 1643, 1644, 1645, 1651, 1652, 1653, 1654, 1657, 1658, 1659, 1660, 1667, 1668, 1747, 1748, 1749, + 1754, 1755, 1756, 1757, 1763, 1764, 1769, 1770, 1776, 1777, 1782, 1783, 1788, 1789, 1795, 1796, 1804, 1805, 1811, 1812, 1813, 1814, 1818, 1819, 1820, + 1913, 1914, 1915, 1916, 1926, 1927, 1928, 1929, 1938, 1939, 1940, 1941, 1947, 1948, 1949, 1950, 1958, 1959, 1960, 1961, 1966, 1967, 1968, 1969, 1973, + 1974, 1975, 1976, 1980, 1981, 1982, 1983, 1989, 1990, 1991, 1996, 1997, 1998, 2005, 2006, 2121, 2130, 2131, 2132, 2139, 2140 +}; +static const std::vector LOBES_VOXELS_2_R = { + 4, 13, 14, 23, 24, 45, 56, 57, 58, 67, 68, 69, 77, 78, 86, 114, 115, 125, 126, 136, 147, 148, 149, 158, 159, 160, 167, 168, 169, 252, 253, 263, 264, + 265, 274, 275, 276, 284, 285, 286, 294, 295, 296, 304, 452, 453, 461, 462, 470, 472, 480, 488, 489, 501, 502, 665, 677, 678, 686, 687, 696, 697, 721, + 730, 739, 746, 754, 762, 770, 777, 784, 956, 963, 964, 972, 973, 1028, 1029, 1030, 1031, 1041, 1043, 1044, 1052, 1053, 1054, 1062, 1224, 1225, 1226, + 1235, 1236, 1237, 1245, 1246, 1247, 1255, 1327, 1335, 1336, 1410, 1411, 1412, 1420, 1428, 1438, 1481, 1488, 1494, 1495, 1501, 1569, 1583, 1590, 1597, + 1603, 1609, 1615, 1621, 1627, 1635, 1645, 1653, 1654, 1659, 1660, 1668, 1749, 1756, 1757, 1764, 1770, 1777, 1783, 1789, 1796, 1805, 1813, 1814, 1819, + 1820, 1915, 1916, 1928, 1929, 1940, 1941, 1949, 1950, 1960, 1961, 1968, 1969, 1975, 1976, 1982, 1983, 1990, 1991, 1998, 2006, 2131, 2132, 2140 +}; +static const std::vector LOBES_VOXELS_2_L = { + 2, 3, 11, 12, 21, 22, 44, 53, 54, 55, 64, 65, 66, 76, 85, 112, 113, 123, 124, 135, 144, 145, 146, 155, 156, 157, 164, 165, 166, 250, 251, 261, 262, 271, + 272, 273, 281, 282, 283, 291, 292, 293, 303, 442, 449, 450, 451, 458, 459, 460, 467, 469, 478, 479, 486, 487, 497, 498, 499, 500, 662, 674, 684, 694, + 695, 720, 729, 738, 745, 753, 761, 769, 776, 781, 955, 961, 962, 970, 971, 1024, 1025, 1026, 1027, 1037, 1038, 1040, 1051, 1151, 1221, 1222, 1223, 1232, + 1233, 1234, 1244, 1254, 1326, 1333, 1334, 1408, 1409, 1419, 1427, 1437, 1480, 1487, 1492, 1493, 1500, 1568, 1576, 1582, 1589, 1596, 1602, 1608, 1614, + 1620, 1626, 1634, 1643, 1644, 1651, 1652, 1657, 1658, 1667, 1747, 1748, 1754, 1755, 1763, 1769, 1776, 1782, 1788, 1795, 1804, 1811, 1812, 1818, 1913, + 1914, 1926, 1927, 1938, 1939, 1947, 1948, 1958, 1959, 1966, 1967, 1973, 1974, 1980, 1981, 1989, 1996, 1997, 2005, 2121, 2130, 2139 +}; +static const std::vector LOBES_VOXELS_3 = { + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 417, 418, 420, 425, 441, 611, 613, 615, 616, 621, 622, 627, 628, 630, 632, 635, 639, 640, 641, 642, 647, 650, 653, 656, 660, 661, + 667, 673, 675, 679, 811, 812, 813, 814, 824, 829, 830, 831, 834, 868, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, + 1009, 1010, 1011, 1012, 1015, 1016, 1017, 1018, 1039, 1042, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1204, 1205, 1207, 1211, 1212, 1213, 1217, + 1218, 1220, 1228, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1379, 1380, 1381, 1382, 1383, 1389, 1392, 1397, 1398, 1401, 1402, 1533, 1534, 1535, + 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1548, 1549, 1550, 1551, 1552, 1557, 1558, 1559, 1560, 1570 +}; +static const std::vector LOBES_VOXELS_3_R = { + 387, 392, 393, 394, 395, 396, 397, 405, 406, 407, 408, 409, 412, 413, 414, 418, 420, 615, 621, 630, 632, 641, 642, 653, 656, 667, 679, 814, 829, 834, + 868, 996, 997, 1002, 1003, 1004, 1005, 1009, 1010, 1011, 1012, 1017, 1018, 1042, 1200, 1201, 1205, 1207, 1212, 1213, 1228, 1375, 1376, 1377, 1382, 1383, + 1392, 1401, 1402, 1537, 1538, 1542, 1543, 1544, 1550, 1551, 1552, 1559, 1560, 1570 +}; +static const std::vector LOBES_VOXELS_3_L = { + 382, 383, 384, 385, 386, 388, 389, 390, 391, 398, 399, 400, 401, 402, 403, 404, 410, 411, 415, 417, 425, 441, 611, 613, 616, 622, 627, 628, 635, 639, + 640, 647, 650, 660, 661, 673, 675, 811, 812, 813, 824, 830, 831, 995, 998, 999, 1000, 1001, 1006, 1007, 1008, 1015, 1016, 1039, 1194, 1195, 1196, 1197, + 1198, 1199, 1204, 1211, 1217, 1218, 1220, 1370, 1371, 1372, 1373, 1374, 1379, 1380, 1381, 1389, 1397, 1398, 1533, 1534, 1535, 1536, 1539, 1540, 1541, + 1548, 1549, 1557, 1558 +}; +static const std::vector LOBES_VOXELS_4 = { + 1277, 1278, 1285, 1286, 1288, 1290, 1295, 1297, 1390, 1391, 1399, 1400, 1430, 1442, 1443, 1447, 1448, 1449, 1450, 1451, 1456, 1457, 1458, 1459, 1460, + 1462, 1463, 1464, 1465, 1466, 1547, 1553, 1555, 1556, 1561, 1563, 1564, 1574, 1575, 1577, 1578, 1579, 1580, 1581, 1584, 1585, 1586, 1587, 1588, 1591, + 1592, 1593, 1594, 1595, 1598, 1599, 1600, 1601, 1604, 1605, 1606, 1607, 1610, 1611, 1612, 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, + 1704, 1705, 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, + 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1750, 1751, 1752, 1753, 1758, 1759, 1760, + 1761, 1762, 1765, 1766, 1767, 1768, 1771, 1772, 1774, 1780, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, + 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, + 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, + 1925, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1942, 1943, 1944, 1945, 1946, 1951, 1952, 1953, 1955, 1962, 2035, 2036, 2037, 2038, 2039, 2040, + 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, + 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, + 2092, 2093, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2106, 2107, 2108, 2109, 2112, 2113, 2114, 2118, 2178, 2179, 2180, 2181, 2182, 2183, 2184, 2185, + 2186, 2187, 2188, 2189, 2190, 2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210, + 2211, 2212, 2215, 2216, 2217, 2218, 2219, 2222, 2223, 2226, 2227, 2230, 2231, 2232, 2235, 2289, 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, 2298, + 2299, 2300, 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, 2309, 2314, 2317, 2358, 2359, 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369 +}; +static const std::vector LOBES_VOXELS_4_R = { + 1285, 1286, 1295, 1297, 1391, 1400, 1430, 1447, 1448, 1456, 1457, 1458, 1462, 1463, 1464, 1466, 1553, 1561, 1563, 1564, 1578, 1579, 1580, 1584, 1585, + 1591, 1592, 1593, 1598, 1599, 1604, 1605, 1610, 1611, 1699, 1700, 1701, 1707, 1708, 1709, 1715, 1716, 1717, 1718, 1719, 1724, 1725, 1726, 1727, 1728, + 1734, 1735, 1736, 1737, 1742, 1743, 1744, 1745, 1750, 1751, 1752, 1758, 1759, 1760, 1765, 1771, 1772, 1780, 1856, 1862, 1863, 1864, 1865, 1872, 1873, + 1874, 1875, 1876, 1877, 1884, 1885, 1886, 1887, 1888, 1894, 1895, 1896, 1903, 1904, 1905, 1906, 1907, 1917, 1918, 1919, 1920, 1930, 1931, 1932, 1933, + 1942, 1943, 1944, 1951, 1952, 1953, 1962, 2042, 2043, 2044, 2045, 2046, 2053, 2054, 2055, 2056, 2057, 2062, 2063, 2064, 2070, 2071, 2072, 2073, 2074, + 2081, 2082, 2083, 2084, 2085, 2086, 2093, 2095, 2096, 2097, 2098, 2106, 2107, 2108, 2109, 2112, 2113, 2114, 2118, 2180, 2181, 2187, 2188, 2189, 2190, + 2196, 2197, 2198, 2199, 2205, 2206, 2207, 2208, 2215, 2216, 2217, 2222, 2226, 2230, 2235, 2292, 2293, 2299, 2300, 2301, 2306, 2307, 2308, 2314, 2317, + 2361, 2362, 2363, 2365, 2366, 2367, 2369 +}; +static const std::vector LOBES_VOXELS_4_L = { + 1277, 1278, 1288, 1290, 1390, 1399, 1442, 1443, 1449, 1450, 1451, 1459, 1460, 1465, 1547, 1555, 1556, 1574, 1575, 1577, 1581, 1586, 1587, 1588, 1594, + 1595, 1600, 1601, 1606, 1607, 1612, 1694, 1695, 1696, 1697, 1698, 1702, 1703, 1704, 1705, 1706, 1710, 1711, 1712, 1713, 1714, 1720, 1721, 1722, 1723, + 1729, 1730, 1731, 1732, 1733, 1738, 1739, 1740, 1741, 1746, 1753, 1761, 1762, 1766, 1767, 1768, 1774, 1857, 1858, 1859, 1860, 1861, 1866, 1867, 1868, + 1869, 1870, 1871, 1878, 1879, 1880, 1881, 1882, 1883, 1889, 1890, 1891, 1892, 1893, 1897, 1898, 1899, 1900, 1901, 1902, 1908, 1909, 1910, 1911, 1912, + 1921, 1922, 1923, 1924, 1925, 1934, 1935, 1936, 1937, 1945, 1946, 1955, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2047, 2048, 2049, 2050, 2051, 2052, + 2058, 2059, 2060, 2061, 2065, 2066, 2067, 2068, 2069, 2075, 2076, 2077, 2078, 2079, 2080, 2087, 2088, 2089, 2090, 2092, 2099, 2100, 2101, 2178, 2179, + 2182, 2183, 2184, 2185, 2186, 2191, 2192, 2193, 2194, 2195, 2200, 2201, 2202, 2203, 2204, 2209, 2210, 2211, 2212, 2218, 2219, 2223, 2227, 2231, 2232, + 2289, 2290, 2291, 2294, 2295, 2296, 2297, 2298, 2302, 2303, 2304, 2305, 2309, 2358, 2359, 2360, 2364, 2368 +}; +static const std::vector LOBES_VOXELS_5 = { + 526, 537, 712, 728, 731, 737, 740, 744, 747, 752, 755, 893, 900, 913, 914, 915, 920, 923, 927, 928, 930, 934, 935, 936, 1083, 1084, 1092, 1093, 1100, + 1101, 1102, 1103, 1108, 1109, 1110, 1116, 1117, 1123, 1124, 1125, 1126, 1132, 1133, 1134, 1135, 1263, 1281, 1282, 1283, 1291, 1292, 1293, 1294, 1300, + 1301, 1302, 1303, 1308, 1309, 1313, 1435, 1436, 1439, 1444, 1445, 1446, 1452, 1453, 1454, 1455, 1461 +}; +static const std::vector LOBES_VOXELS_5_R = { + 537, 731, 740, 747, 755, 915, 923, 930, 936, 1093, 1102, 1103, 1110, 1117, 1125, 1126, 1134, 1135, 1263, 1282, 1283, 1293, 1294, 1302, 1303, 1309, 1313, + 1439, 1445, 1446, 1454, 1455, 1461 +}; +static const std::vector LOBES_VOXELS_5_L = { + 526, 712, 728, 737, 744, 752, 893, 900, 913, 914, 920, 927, 928, 934, 935, 1083, 1084, 1092, 1100, 1101, 1108, 1109, 1116, 1123, 1124, 1132, 1133, 1281, + 1291, 1292, 1300, 1301, 1308, 1435, 1436, 1444, 1452, 1453 +}; +static const std::vector LOBES_VOXELS_6 = { + 0, 1, 5, 6, 7, 8, 9, 10, 15, 16, 17, 18, 19, 20, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 46, 47, 48, 49, 50, 51, 52, + 59, 60, 61, 62, 63, 70, 71, 72, 73, 74, 75, 79, 80, 81, 82, 83, 84, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 116, 117, 118, 119, 120, 121, 122, 127, 128, 129, 130, 131, 132, 133, 134, 137, 138, 139, 140, 141, 142, 143, 150, 151, + 152, 153, 154, 161, 162, 163, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 254, 255, 256, 257, 258, 259, 260, 266, 267, 268, 269, 270, 277, 278, 279, 280, 287, 288, 289, 290, 297, 298, 299, 300, + 301, 302, 305, 306, 307, 308, 309, 310, 311, 319, 320, 321, 322, 334, 335, 416, 419, 421, 422, 423, 424, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 443, 444, 445, 446, 447, 448, 454, 455, 456, 457, 463, 464, 465, 466, 468, 471, 473, 474, 475, 476, 477, 481, 482, 483, + 484, 485, 490, 491, 492, 493, 494, 495, 496, 503, 504, 505, 506, 507, 508, 509, 510, 511, 520, 521, 522, 523, 524, 525, 527, 536, 538, 539, 540, 541, + 549, 550, 626, 634, 636, 645, 646, 648, 655, 657, 658, 659, 668, 669, 670, 671, 681, 682, 685, 689, 690, 691, 692, 693, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 713, 714, 715, 716, 717, 718, 719, 722, 723, 724, 725, 726, 727, 732, 733, 734, 735, 736, 741, 742, 743, 748, + 749, 750, 854, 862, 865, 887, 905, 909, 910, 911, 926, 931, 1013, 1014, 1019, 1020, 1021, 1022, 1023, 1032, 1033, 1034, 1035, 1036, 1045, 1046, 1047, + 1048, 1049, 1050, 1056, 1057, 1058, 1059, 1060, 1061, 1063, 1064, 1065, 1066, 1067, 1069, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, + 1081, 1082, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1094, 1095, 1096, 1097, 1098, 1099, 1104, 1105, 1106, 1113, 1202, 1203, 1206, 1208, 1209, 1210, + 1214, 1215, 1216, 1219, 1227, 1229, 1230, 1231, 1238, 1239, 1240, 1241, 1242, 1243, 1248, 1249, 1250, 1251, 1252, 1253, 1256, 1257, 1258, 1259, 1260, + 1261, 1262, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1279, 1280, 1284, 1287, 1289, 1296, 1298, 1305, 1306, 1378, + 1384, 1385, 1386, 1387, 1388, 1393, 1394, 1395, 1396, 1403, 1404, 1405, 1406, 1407, 1413, 1414, 1415, 1416, 1417, 1418, 1421, 1422, 1423, 1424, 1425, + 1426, 1429, 1431, 1432, 1433, 1434, 1440, 1441, 1545, 1546, 1554, 1562, 1565, 1566, 1567, 1571, 1572, 1573 +}; +static const std::vector LOBES_VOXELS_6_R = { + 5, 6, 7, 15, 16, 17, 25, 26, 27, 28, 32, 33, 34, 35, 38, 39, 46, 47, 48, 49, 59, 60, 61, 70, 71, 72, 73, 79, 80, 87, 88, 89, 90, 94, 95, 96, 99, 100, + 105, 106, 107, 108, 116, 117, 118, 127, 128, 129, 130, 137, 138, 139, 140, 150, 151, 152, 161, 170, 171, 176, 177, 178, 179, 183, 184, 185, 209, 210, + 211, 217, 218, 219, 220, 221, 227, 228, 229, 230, 231, 239, 240, 241, 242, 243, 244, 254, 255, 256, 257, 258, 266, 267, 277, 278, 287, 288, 297, 298, + 305, 306, 307, 308, 309, 319, 320, 334, 335, 419, 426, 427, 428, 429, 434, 435, 436, 443, 444, 445, 446, 454, 455, 463, 464, 471, 473, 474, 481, 482, + 490, 491, 492, 503, 504, 505, 506, 520, 521, 522, 523, 524, 536, 538, 539, 549, 550, 634, 645, 655, 657, 668, 669, 670, 681, 689, 698, 699, 700, 701, + 705, 706, 707, 708, 713, 714, 715, 722, 723, 724, 725, 726, 732, 733, 734, 741, 742, 748, 749, 750, 862, 887, 909, 910, 931, 1019, 1020, 1032, 1033, + 1045, 1046, 1047, 1056, 1057, 1058, 1063, 1064, 1065, 1069, 1071, 1072, 1077, 1078, 1085, 1086, 1087, 1094, 1095, 1096, 1097, 1104, 1105, 1113, 1206, + 1214, 1215, 1216, 1227, 1238, 1239, 1240, 1248, 1249, 1250, 1256, 1257, 1258, 1259, 1264, 1265, 1271, 1272, 1273, 1274, 1275, 1284, 1287, 1296, 1305, + 1306, 1384, 1385, 1393, 1394, 1403, 1404, 1413, 1414, 1415, 1416, 1421, 1422, 1423, 1429, 1431, 1432, 1440, 1441, 1554, 1562, 1571, 1572, 1573 +}; +static const std::vector LOBES_VOXELS_6_L = { + 0, 1, 8, 9, 10, 18, 19, 20, 29, 30, 31, 36, 37, 40, 41, 42, 43, 50, 51, 52, 62, 63, 74, 75, 81, 82, 83, 84, 91, 92, 93, 97, 98, 101, 102, 103, 104, 109, + 110, 111, 119, 120, 121, 122, 131, 132, 133, 134, 141, 142, 143, 153, 154, 162, 163, 172, 173, 174, 175, 180, 181, 182, 206, 207, 208, 212, 213, 214, + 215, 216, 222, 223, 224, 225, 226, 232, 233, 234, 235, 236, 237, 238, 245, 246, 247, 248, 249, 259, 260, 268, 269, 270, 279, 280, 289, 290, 299, 300, + 301, 302, 310, 311, 321, 322, 416, 421, 422, 423, 424, 430, 431, 432, 433, 437, 438, 439, 440, 447, 448, 456, 457, 465, 466, 468, 475, 476, 477, 483, + 484, 485, 493, 494, 495, 496, 507, 508, 509, 510, 511, 525, 527, 540, 541, 626, 636, 646, 648, 658, 659, 671, 682, 685, 690, 691, 692, 693, 702, 703, + 704, 709, 710, 711, 716, 717, 718, 719, 727, 735, 736, 743, 854, 865, 905, 911, 926, 1013, 1014, 1021, 1022, 1023, 1034, 1035, 1036, 1048, 1049, 1050, + 1059, 1060, 1061, 1066, 1067, 1073, 1074, 1075, 1076, 1079, 1080, 1081, 1082, 1088, 1089, 1090, 1091, 1098, 1099, 1106, 1202, 1203, 1208, 1209, 1210, + 1219, 1229, 1230, 1231, 1241, 1242, 1243, 1251, 1252, 1253, 1260, 1261, 1262, 1266, 1267, 1268, 1269, 1270, 1276, 1279, 1280, 1289, 1298, 1378, 1386, + 1387, 1388, 1395, 1396, 1405, 1406, 1407, 1417, 1418, 1424, 1425, 1426, 1433, 1434, 1545, 1546, 1565, 1566, 1567 +}; + +static const std::map> LOBES = +{ + { "*", LOBES_VOXELS_0 }, + { "* R", LOBES_VOXELS_0_R }, + { "* L", LOBES_VOXELS_0_L }, + { "Frontal Lobe", LOBES_VOXELS_1 }, + { "Frontal Lobe R", LOBES_VOXELS_1_R }, + { "Frontal Lobe L", LOBES_VOXELS_1_L }, + { "Limbic Lobe", LOBES_VOXELS_2 }, + { "Limbic Lobe R", LOBES_VOXELS_2_R }, + { "Limbic Lobe L", LOBES_VOXELS_2_L }, + { "Occipital Lobe", LOBES_VOXELS_3 }, + { "Occipital Lobe R", LOBES_VOXELS_3_R }, + { "Occipital Lobe L", LOBES_VOXELS_3_L }, + { "Parietal Lobe", LOBES_VOXELS_4 }, + { "Parietal Lobe R", LOBES_VOXELS_4_R }, + { "Parietal Lobe L", LOBES_VOXELS_4_L }, + { "Sub-lobar", LOBES_VOXELS_5 }, + { "Sub-lobar R", LOBES_VOXELS_5_R }, + { "Sub-lobar L", LOBES_VOXELS_5_L }, + { "Temporal Lobe", LOBES_VOXELS_6 }, + { "Temporal Lobe R", LOBES_VOXELS_6_R }, + { "Temporal Lobe L", LOBES_VOXELS_6_L } +}; +} // namespace LoretaRegions diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/loreta_roi_voxels.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/loreta_roi_voxels.hpp new file mode 100644 index 0000000..c5f49b4 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/content/loreta_roi_voxels.hpp @@ -0,0 +1,1328 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +namespace LoretaRegions { +#ifndef LoretaRegions_VoxelCount +#define LoretaRegions_VoxelCount 2394 +#endif + +static const std::vector ROI_VOXELS_0 = { + 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2049, 2051, 2053, 2055, 2057, 2059, 2061, 2063, 2065, 2067, 2069, 2071, 2073, + 2075, 2077, 2079, 2081, 2083, 2085, 2087, 2089, 2091, 2093, 2095, 2097, 2099, 2101, 2107, 2109, 2113, 2115, 2119, 2121, 2125, 2127, 2129, 2131, 2133, + 2135, 2137, 2139, 2141, 2143, 2145, 2147, 2149, 1077, 2155, 2157, 2163, 2169, 1086, 1087, 2177, 2179, 2181, 2183, 2185, 2187, 2189, 2191, 2193, 2195, + 2197, 2199, 2201, 2203, 2205, 2207, 2209, 2211, 2213, 2215, 2217, 2219, 1111, 2223, 2225, 1114, 2229, 2231, 2233, 2237, 2239, 2241, 2243, 2245, 2247, + 2249, 2251, 2253, 2255, 2257, 2259, 2261, 2263, 2265, 2267, 2269, 2275, 2277, 2279, 2283, 2289, 2291, 2293, 2295, 2297, 2299, 2301, 1152, 2305, 2307, + 2309, 2311, 2315, 2317, 2319, 2321, 2323, 2325, 2327, 2329, 2331, 2333, 2335, 2337, 2339, 2341, 2343, 2345, 2347, 2349, 2351, 2353, 2355, 2357, 2359, + 2361, 2363, 2369, 2371, 2373, 2375, 2377, 2379, 2381, 2383, 2385, 2387, 2389, 2391, 2393, 1274, 1275, 1277, 1278, 1285, 1286, 1287, 1295, 1296, 1297, + 1304, 1305, 1306, 1307, 1310, 1311, 1312, 1314, 1326, 1327, 1417, 1418, 1421, 1422, 1423, 1424, 1425, 1430, 1431, 1432, 1442, 1443, 1447, 1448, 1449, + 1450, 1451, 1456, 1457, 1458, 1460, 1462, 1464, 1466, 1467, 1468, 1469, 1470, 1487, 1488, 1493, 1494, 1502, 1510, 1511, 1520, 761, 762, 2048, 2050, + 2052, 2054, 2056, 2058, 2060, 2062, 2064, 2066, 2068, 2070, 2072, 2074, 2076, 2078, 2080, 2082, 2084, 2086, 2088, 2090, 1558, 1559, 2096, 2098, 2100, + 2106, 2108, 2112, 2114, 2120, 2122, 2124, 2126, 2128, 2130, 2132, 2134, 1580, 2138, 2140, 2142, 1584, 2146, 2148, 2150, 1588, 2156, 1591, 1592, 1593, + 2164, 1595, 2170, 1598, 1599, 2176, 2178, 2180, 2182, 1604, 1605, 2188, 2190, 2192, 2194, 2196, 2198, 1612, 1613, 2204, 1615, 2208, 1617, 1618, 1619, + 1620, 1621, 1622, 1623, 2224, 2226, 2228, 1627, 1628, 2234, 1630, 2238, 2240, 2242, 2244, 2246, 2248, 2250, 2252, 2254, 2256, 2258, 2260, 2262, 2264, + 2266, 1646, 2270, 2272, 2276, 1652, 1653, 2284, 2286, 2288, 2290, 2292, 2294, 2296, 2298, 2300, 2302, 2304, 2306, 2308, 2310, 1669, 2316, 2318, 2320, + 2322, 2324, 1675, 2328, 2330, 2332, 2334, 2336, 2338, 2340, 2342, 2344, 2346, 2348, 2350, 2352, 2354, 1690, 2358, 2360, 2362, 2364, 2368, 2370, 2372, + 2374, 2376, 2378, 2380, 2382, 2384, 2386, 2388, 1707, 2392, 1713, 1714, 1715, 1716, 1717, 1722, 1723, 1724, 1725, 1729, 1730, 1731, 1732, 1733, 1734, + 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1751, 1752, 1753, 1758, 1759, 1760, 1761, 1762, 1765, 1766, 1767, 1768, 1771, + 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1781, 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1795, 1796, 1797, 1798, 1799, 1800, 1804, + 1805, 1807, 1808, 1809, 1815, 1816, 1821, 1822, 1823, 1829, 1830, 1831, 1832, 1837, 1838, 1839, 1840, 1844, 1845, 1846, 1847, 2218, 2210, 2200, 1851, + 1852, 1853, 1151, 1855, 1614, 1626, 1858, 1859, 1860, 1861, 1862, 1863, 2356, 1561, 2092, 1867, 1683, 1869, 1870, 1871, 1872, 1873, 1874, 2303, 1876, + 1912, 1587, 1879, 1594, 1600, 1882, 1883, 1884, 1885, 1601, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, + 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 956, 1586, 1581, 1575, 1574, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1607, + 2206, 1112, 1644, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 2282, 2268, 2172, 2171, 1942, 1943, 1944, 1945, 1946, 2162, 2158, 2144, 1637, 2227, + 1952, 2222, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1610, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, + 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 2212, 1638, 1639, 1645, 1648, 2202, 1995, 1606, 2232, 2390, 2186, 2000, 2184, + 2002, 2003, 2004, 1579, 2136, 1585, 2008, 1706, 2010, 1097, 2012, 2013, 1107, 1625, 2016, 2220, 2018, 2019, 2020, 1629, 2022, 1119, 2236, 1120, 1636, + 2027, 2028, 2029, 2030, 2031, 2326, 2033, 1708, 2035, 1616 +}; +static const std::vector ROI_VOXELS_1 = { + 1800, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 1613, 2327, 2328, 2329, 2330, 2331, 2332, 1616, 2333, 2334, 1617, 2335, 2336, 1618, 2337, 2338, + 1619, 2339, 2340, 2341, 2342, 1111, 2343, 2344, 1112, 2345, 2346, 1623, 2347, 2348, 1114, 2349, 2350, 1625, 2351, 2224, 2352, 2225, 2353, 2354, 2355, + 2228, 2356, 2229, 2357, 1310, 1119, 1311, 1120, 2234, 1312, 2235, 2236, 2237, 1951, 2238, 1314, 2239, 2240, 2368, 2241, 2369, 2242, 2115, 2243, 1954, + 2244, 2372, 2245, 2373, 2246, 2374, 2247, 1956, 2248, 2376, 2249, 1957, 2250, 2378, 2251, 2124, 2252, 2380, 2253, 2126, 2254, 2127, 2255, 2128, 2256, + 2384, 2257, 2385, 2258, 2386, 2259, 1962, 2260, 2133, 2261, 1963, 2262, 2390, 2263, 2391, 2264, 2392, 2265, 1965, 2266, 2267, 1775, 2141, 2269, 2142, + 2143, 2272, 2146, 1778, 2147, 1970, 1779, 1971, 1780, 1844, 2279, 1972, 1781, 1845, 1463, 2283, 2286, 1785, 1977, 1786, 1468, 1787, 1979, 2393, 1470, + 2389, 2388, 2387, 2383, 1790, 2382, 2381, 2377, 1791, 2375, 2371, 2370, 2318, 2233, 2138, 1984, 2137, 2136, 2129, 1985, 2122, 2120, 2028, 1986, 1978, + 1964, 1622, 2125, 1953, 2148, 2119, 1773, 1307, 1784, 2379, 1467, 2134, 1630, 2315, 1469, 2316, 2135, 1107, 2029 +}; +static const std::vector ROI_VOXELS_2 = { + 1530, 1532, 1540, 1548, 1558, 1568, 1574, 1576, 1580, 1582, 1584, 1586, 1588, 1592, 1594, 1598, 1600, 1604, 1610, 1612, 1614, 1618, 1620, 1626, 1628, + 1630, 1636, 1638, 1644, 1646, 1648, 1650, 1652, 1656, 1662, 1672, 1676, 1678, 1680, 1684, 1686, 1688, 1690, 1692, 1706, 1708, 1714, 1716, 1722, 1724, + 1730, 1732, 1734, 1736, 1738, 1740, 1742, 1744, 1746, 1748, 1752, 1754, 1758, 1760, 1762, 1774, 1776, 1780, 1782, 1784, 1786, 1788, 1790, 448, 1796, + 1798, 1800, 1804, 1808, 1816, 1822, 456, 1830, 1832, 1838, 1840, 1844, 1846, 1852, 1858, 1860, 1862, 466, 1870, 1872, 1874, 1876, 1882, 1884, 1888, + 1890, 1892, 1894, 1896, 1898, 1900, 1902, 1904, 1906, 1908, 477, 1912, 1914, 29, 1918, 1920, 1922, 1924, 1926, 1930, 1932, 483, 1936, 484, 1942, 1944, + 1948, 1952, 1954, 1958, 1960, 1962, 1964, 1966, 1968, 1972, 493, 1976, 1978, 1980, 1982, 1984, 1986, 1992, 2000, 2008, 2014, 2016, 2022, 2024, 2028, + 2030, 2034, 2036, 2038, 2040, 2042, 2044, 2046, 2049, 2053, 2057, 2061, 2065, 2069, 2073, 2077, 2081, 2085, 2089, 2093, 2097, 2101, 526, 527, 2113, 529, + 2121, 2129, 2133, 534, 2141, 536, 537, 2153, 2161, 2165, 2173, 2181, 2185, 2189, 2193, 2197, 2201, 2205, 2209, 2217, 2225, 2229, 2233, 2237, 2241, 2245, + 2249, 2253, 2257, 2261, 2265, 2269, 2273, 569, 2281, 2285, 2289, 2293, 2297, 2301, 2305, 2317, 2321, 2325, 2329, 2333, 2337, 2341, 2345, 2349, 2353, + 2357, 2361, 2373, 2377, 2381, 2385, 2389, 2393, 658, 671, 672, 682, 683, 690, 691, 692, 702, 703, 704, 705, 709, 710, 711, 712, 716, 717, 718, 719, 723, + 724, 727, 728, 731, 732, 733, 735, 737, 740, 742, 743, 744, 747, 748, 749, 750, 752, 755, 761, 762, 775, 778, 782, 783, 786, 788, 789, 790, 791, 793, + 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 845, 853, 863, 864, 865, 869, 870, 871, 872, 873, 880, 881, 882, + 883, 884, 885, 886, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 911, 912, 913, 914, 915, 916, 917, + 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 934, 937, 943, 944, 948, 953, 954, 956, 958, 959, 960, 965, 966, 967, 968, 969, + 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 2050, 2054, 2058, 2062, + 2066, 2070, 2074, 2078, 2082, 2086, 2090, 2098, 2102, 2106, 2110, 2114, 1059, 2122, 2126, 2130, 2134, 2138, 2142, 2146, 2154, 2166, 2174, 2178, 2182, + 2186, 2190, 2194, 2198, 2202, 2206, 1105, 1107, 1109, 2222, 1113, 1115, 2234, 2238, 2242, 2246, 2250, 2254, 1129, 2262, 2266, 1135, 2274, 2278, 1141, + 1143, 2290, 1147, 2298, 2302, 2306, 1157, 2318, 2322, 2326, 2330, 2334, 2338, 2342, 2346, 2350, 2354, 2358, 2362, 1183, 2370, 2374, 2378, 2382, 2386, + 2390, 74, 75, 1221, 1223, 1229, 1231, 1239, 1241, 1251, 1253, 1257, 1259, 1261, 1263, 1265, 1277, 1281, 1283, 1285, 1291, 1293, 1301, 1303, 1309, 1313, + 1315, 1317, 1319, 1321, 1323, 82, 1327, 1331, 1339, 1341, 1343, 1345, 1347, 1349, 1351, 1353, 1355, 1357, 1359, 1361, 1363, 1365, 1367, 1369, 1397, + 1399, 1409, 1417, 1421, 1423, 1425, 1429, 1431, 1433, 1435, 1439, 1441, 1443, 1445, 1447, 1449, 1451, 1453, 1455, 1457, 1461, 1463, 1469, 1473, 1475, + 1477, 1479, 1483, 1485, 1487, 1489, 1491, 1493, 1505, 1507, 1511, 1513, 1517, 1521, 1523, 1525, 1527, 1529, 1531, 1549, 1557, 1559, 1561, 1575, 1577, + 1579, 1581, 1585, 1587, 1589, 1591, 1593, 1595, 1599, 1601, 1605, 1607, 1615, 1617, 1619, 1621, 1623, 1625, 1627, 1629, 1637, 1639, 1641, 1645, 1649, + 1653, 1663, 1669, 1671, 1673, 1675, 1677, 1679, 1681, 1683, 1685, 1687, 1691, 1693, 1707, 1713, 1715, 1717, 1723, 1725, 1729, 1731, 1733, 1735, 1737, + 1739, 1741, 1743, 1745, 1747, 1751, 1753, 1755, 1759, 1761, 1763, 1765, 1769, 1771, 1777, 1783, 1787, 1789, 1791, 1795, 1797, 1799, 1805, 1807, 1809, + 1815, 1821, 1823, 1829, 1831, 1837, 1839, 1845, 1847, 1851, 1853, 1855, 1859, 1861, 1863, 1867, 1869, 1871, 1873, 1879, 1883, 1885, 1887, 1889, 1891, + 1893, 1895, 1897, 1899, 1901, 1903, 1905, 1907, 1909, 1911, 1913, 1917, 1919, 1921, 1923, 1925, 1927, 1931, 1933, 1935, 1937, 1939, 1943, 1945, 1947, + 1951, 1953, 1955, 1959, 1961, 1963, 1967, 1969, 1971, 1973, 1975, 1977, 1979, 1981, 1983, 1985, 1993, 1999, 2001, 2007, 2009, 2015, 2017, 2021, 2023, + 2029, 2031, 2033, 2035, 2037, 2039, 2041, 2043, 2045, 2047, 2051, 2055, 2059, 2063, 2067, 2071, 2075, 2079, 2083, 2087, 2095, 2099, 2103, 2107, 2127, + 2131, 2135, 2139, 2143, 2147, 2151, 2159, 2167, 2175, 2179, 2183, 2187, 2191, 2195, 2199, 2203, 2207, 2211, 2215, 2219, 2223, 2231, 2235, 2239, 2243, + 2247, 2251, 2255, 2259, 2263, 2267, 2271, 2279, 2283, 2287, 2291, 2295, 2299, 2303, 2307, 2319, 2323, 2327, 2331, 2335, 2339, 2343, 2347, 2351, 2355, + 2359, 2363, 2371, 2375, 2379, 2383, 2387, 2391, 154, 162, 163, 172, 232, 245, 1169, 495, 1167, 1325, 2360, 1158, 1150, 1149, 1170, 1166, 1148, 1146, + 1139, 1162, 1095, 1131, 1130, 1122, 1121, 2218, 2210, 2200, 290, 1071, 1070, 1910, 1177, 1179, 1116, 1123, 2109, 1132, 1058, 1060, 1061, 1133, 1064, + 1065, 2137, 2048, 2052, 2056, 2060, 2064, 2068, 2072, 2076, 2080, 2084, 2088, 2092, 2096, 2100, 1073, 2108, 2112, 2116, 2120, 279, 2128, 2132, 2136, + 2140, 1072, 2148, 2152, 1078, 2160, 1181, 2168, 1093, 1094, 2180, 1092, 2188, 2192, 2196, 1100, 2204, 2208, 2212, 1108, 1110, 2224, 2228, 2232, 2236, + 2240, 2244, 2248, 2252, 2256, 2260, 2264, 1134, 1136, 1138, 2280, 1142, 1144, 2292, 2296, 2300, 2304, 2308, 1156, 289, 2320, 2324, 2328, 2332, 2336, + 2340, 2344, 2348, 2352, 2356, 1180, 1182, 1184, 2372, 2376, 2380, 2384, 2388, 2392, 299, 1101, 300, 1102, 301, 1104, 1106, 18, 1111, 1112, 1114, 1117, + 1222, 1118, 1119, 1120, 1230, 1125, 1126, 1127, 1238, 1240, 310, 1128, 1137, 1187, 1250, 1252, 1145, 1256, 1258, 1260, 1152, 1264, 579, 1171, 1172, + 1173, 1174, 1175, 1278, 1176, 1282, 1185, 1286, 1186, 1190, 1292, 1294, 1191, 1192, 1300, 1302, 1193, 1188, 1308, 1938, 1312, 1314, 1316, 1318, 1320, + 1322, 1324, 1326, 1159, 507, 1332, 494, 1090, 1178, 1340, 1342, 1344, 1346, 1348, 1350, 1352, 1354, 1356, 1358, 1360, 1362, 1364, 1366, 1368, 1974, + 1151, 1124, 1099, 1098, 1380, 1068, 1067, 1066, 1049, 1390, 81, 1048, 2184, 1398, 1140, 457, 476, 508, 1408, 496, 475, 465, 447, 1418, 280, 1422, 1424, + 1426, 1084, 1430, 1432, 1434, 1436, 1091, 1440, 1442, 1444, 1446, 1448, 1450, 1452, 1454, 1456, 1458, 1460, 1083, 2272, 2294, 1168, 1470, 1472, 2286, + 1476, 1478, 2226, 1482, 1484, 1486, 1488, 1490, 1165, 1494, 485, 1498, 1189, 1502, 1504, 1506, 2258, 1510, 1512, 1514, 1516, 1518, 1520, 1522, 1524, + 1526, 1528, 1103 +}; +static const std::vector ROI_VOXELS_3 = { + 1530, 1532, 383, 1538, 1542, 1544, 386, 387, 1554, 1558, 1562, 1564, 391, 392, 1572, 393, 394, 1580, 395, 1584, 396, 1588, 397, 1592, 398, 1598, 1600, + 400, 1604, 401, 402, 403, 1618, 405, 1624, 406, 1628, 1630, 1632, 408, 1636, 1638, 1640, 1642, 1646, 1648, 412, 1654, 1656, 414, 1660, 415, 1664, 1666, + 1668, 1670, 1672, 418, 1676, 1678, 1680, 1682, 1684, 1686, 1688, 1690, 1692, 423, 424, 1700, 1706, 1708, 1714, 1716, 1718, 1722, 1724, 1726, 1728, 432, + 1732, 1734, 1736, 1738, 1740, 1742, 1744, 1746, 437, 1752, 438, 1758, 1760, 440, 441, 442, 1784, 1786, 1790, 1792, 1794, 1796, 1798, 1800, 1802, 1806, + 1808, 1810, 1814, 1816, 1820, 1822, 1824, 1826, 1828, 1830, 1832, 1834, 1836, 1838, 1840, 1842, 1844, 1846, 1848, 1850, 1852, 1854, 1856, 1858, 1860, + 1862, 1864, 1870, 1872, 1874, 1876, 1882, 1884, 1886, 1888, 1890, 1892, 1894, 1896, 1898, 1900, 1902, 1904, 1906, 1908, 1910, 1912, 1918, 1920, 1922, + 1924, 1930, 1932, 1936, 1942, 487, 1954, 1960, 1964, 1968, 1972, 1976, 1978, 1982, 1984, 1986, 1990, 1994, 1998, 2000, 2006, 2008, 2016, 2022, 2026, + 2028, 2030, 2032, 2036, 2038, 2040, 2042, 2044, 2046, 2049, 2053, 2057, 2061, 2065, 2069, 2073, 2077, 2081, 2085, 2089, 2093, 2097, 2101, 526, 527, 529, + 2129, 2133, 2137, 2141, 536, 537, 2181, 2185, 2189, 2193, 2197, 2201, 2205, 2209, 2217, 2225, 2229, 2233, 2237, 2241, 561, 2249, 2253, 2257, 2261, 566, + 2269, 568, 569, 570, 2289, 2293, 2297, 2301, 576, 577, 578, 579, 2321, 2325, 2329, 2333, 2337, 2341, 2345, 2349, 588, 589, 2361, 2373, 594, 2381, 2385, + 597, 2393, 603, 604, 605, 610, 611, 615, 616, 617, 618, 619, 620, 621, 623, 624, 625, 628, 629, 630, 631, 632, 634, 637, 640, 641, 642, 643, 645, 646, + 652, 653, 654, 655, 656, 659, 660, 664, 665, 673, 674, 677, 712, 728, 731, 737, 740, 744, 747, 752, 755, 762, 770, 775, 777, 778, 782, 783, 784, 786, + 787, 788, 789, 790, 791, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 813, 814, 816, 817, 822, 823, + 825, 826, 827, 828, 829, 832, 833, 834, 836, 837, 838, 841, 842, 846, 848, 849, 854, 856, 858, 868, 893, 898, 899, 900, 901, 906, 907, 908, 913, 914, + 915, 920, 921, 922, 923, 927, 928, 929, 930, 934, 937, 943, 944, 953, 956, 958, 959, 960, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, + 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 999, 1001, 1002, 1003, 1004, 1005, + 1011, 1012, 1019, 1020, 1023, 2050, 2054, 2058, 2062, 1033, 2070, 2074, 2078, 2082, 2086, 1045, 2098, 2106, 1057, 2122, 2126, 2134, 2138, 2142, 2146, + 1083, 2178, 2182, 2186, 2190, 2194, 2198, 2202, 2206, 2210, 1107, 1109, 2222, 2234, 2238, 2242, 2246, 2250, 2254, 2258, 2262, 2266, 1135, 1137, 2286, + 2290, 2294, 2298, 2302, 2306, 1155, 1157, 2318, 2322, 2326, 2330, 2334, 2338, 2342, 2346, 2350, 2354, 2358, 2362, 1183, 2370, 2374, 2378, 2382, 2386, + 2390, 1199, 1201, 1205, 1207, 1211, 1213, 1215, 1227, 1249, 1263, 1277, 1281, 1283, 1285, 1291, 1293, 1301, 1303, 1309, 1313, 1317, 1321, 1323, 1325, + 1327, 1329, 1331, 1335, 1337, 1339, 1341, 1343, 1345, 1347, 1349, 1351, 1353, 1355, 1357, 1359, 1361, 1363, 1365, 1367, 1369, 1375, 1377, 1381, 1383, + 1385, 1389, 1393, 1403, 1413, 1415, 1417, 1421, 1423, 1425, 1429, 1431, 1435, 1439, 1443, 1445, 1447, 1449, 1451, 1453, 1455, 1457, 1461, 1469, 1471, + 1475, 1477, 1483, 1489, 1491, 1495, 1497, 1499, 1501, 1503, 1505, 1507, 1509, 1511, 1513, 1515, 1517, 1519, 1521, 1523, 1525, 1527, 1529, 1531, 1537, + 1543, 1553, 1559, 1561, 1563, 97, 1571, 1573, 1575, 1579, 98, 1585, 1587, 1591, 1593, 1595, 1599, 1601, 1605, 1615, 1617, 1619, 1621, 1623, 1625, 1627, + 1629, 1631, 1633, 1637, 1639, 1641, 1645, 1647, 1649, 1653, 1655, 1659, 1661, 1663, 1665, 1669, 1671, 1673, 1675, 1677, 1679, 1681, 1683, 1685, 1687, + 1689, 1691, 1693, 1699, 1701, 1707, 1709, 1713, 1715, 1717, 1719, 1723, 1725, 1727, 1729, 1731, 1733, 1735, 1737, 1739, 1741, 1743, 1745, 1751, 1753, + 1759, 1761, 1765, 1777, 1783, 1787, 1789, 1791, 1793, 1797, 1799, 1801, 1805, 1807, 1809, 1813, 1815, 1817, 1819, 1821, 1823, 1825, 1827, 1829, 1831, + 1833, 1835, 1837, 1839, 1841, 1843, 1845, 1847, 1849, 1851, 1853, 1855, 1859, 1861, 1863, 1865, 1867, 1869, 1871, 1873, 1875, 1877, 1879, 1883, 1885, + 1887, 1889, 1891, 1893, 1895, 1897, 1899, 1901, 1903, 1905, 1907, 1909, 1911, 1917, 1919, 1921, 1923, 1925, 1931, 1933, 1935, 1937, 1961, 1963, 1969, + 1971, 1975, 1977, 1979, 1983, 1985, 1991, 2011, 2025, 2029, 2031, 2033, 2035, 2037, 2039, 2041, 2043, 2045, 2047, 2051, 2055, 2059, 2063, 2067, 2071, + 2075, 2079, 2083, 2087, 2095, 2099, 2107, 2127, 2131, 2135, 2143, 2147, 135, 2179, 2183, 2187, 2191, 2195, 2199, 2203, 2207, 2211, 2215, 2219, 2239, + 2243, 2247, 2251, 2255, 2259, 2263, 2267, 2279, 2283, 2291, 2295, 2299, 2303, 2307, 2319, 2323, 2327, 2331, 2335, 2339, 2343, 2347, 2351, 2355, 2359, + 2363, 2371, 2375, 2379, 2383, 2387, 2391, 186, 187, 190, 191, 194, 195, 198, 199, 202, 203, 206, 12, 207, 208, 212, 213, 214, 215, 216, 223, 224, 225, + 226, 234, 235, 238, 1662, 1650, 399, 1498, 368, 389, 1111, 1150, 1149, 2218, 2200, 2100, 2090, 2109, 2305, 2066, 1762, 1730, 1594, 1586, 1581, 1574, + 1181, 1442, 340, 1674, 2353, 499, 449, 439, 433, 431, 430, 250, 422, 421, 416, 251, 459, 458, 451, 450, 587, 261, 113, 112, 103, 66, 65, 1092, 390, + 1196, 1195, 1046, 2048, 2052, 2056, 2060, 2064, 2068, 2072, 2076, 2080, 2084, 2088, 2092, 2096, 262, 534, 2108, 1056, 1103, 2120, 1124, 2128, 2132, + 2136, 2140, 1094, 2148, 1133, 2389, 404, 1093, 1084, 1101, 1102, 2180, 2184, 2188, 2192, 2196, 1100, 2204, 2208, 2212, 1108, 1110, 2224, 2228, 1116, + 2236, 2240, 2244, 2248, 2252, 2256, 2260, 2264, 1134, 2272, 1138, 1140, 1142, 1144, 2292, 2296, 2300, 2304, 2308, 1156, 1158, 2320, 2324, 2328, 2332, + 2336, 2340, 2344, 2348, 2352, 1178, 2360, 1182, 1184, 2372, 2376, 2380, 2384, 2388, 2392, 1112, 1200, 1114, 1204, 1206, 1117, 1118, 1212, 1214, 1216, + 1119, 1120, 2245, 1125, 1126, 1228, 1127, 1128, 1129, 2265, 1136, 1143, 1145, 1147, 1152, 1248, 1153, 1154, 1159, 1256, 1161, 1162, 1163, 1164, 1171, + 1172, 1173, 1174, 1175, 1176, 1278, 2357, 1282, 1185, 1286, 1186, 2377, 1292, 1294, 1190, 1191, 1300, 1302, 1192, 1193, 1308, 327, 1312, 328, 388, 1318, + 1169, 1322, 1324, 377, 1328, 1330, 1332, 586, 1336, 1338, 1340, 1342, 1344, 1346, 1348, 1350, 1352, 1354, 1356, 1358, 1360, 1362, 1364, 1366, 1368, + 1132, 1123, 1374, 1376, 1091, 1177, 1382, 1384, 2356, 596, 595, 1392, 1394, 580, 567, 378, 350, 1404, 413, 367, 1314, 361, 1414, 1416, 1418, 341, 1422, + 1424, 1426, 1189, 1430, 1432, 1188, 1436, 359, 1187, 360, 1444, 1446, 1448, 1450, 1452, 1454, 1456, 1458, 1180, 1179, 1170, 366, 1168, 1470, 1167, 1474, + 1476, 1166, 1165, 1482, 1484, 1486, 1488, 1490, 373, 1494, 1496, 374, 407, 1502, 1504, 1506, 1508, 1510, 1512, 1514, 1516, 1518, 1520, 1522, 1524, 1526, + 1528, 409 +}; +static const std::vector ROI_VOXELS_4 = { + 885, 886, 507, 1773, 1774, 2030, 1775, 2031, 1777, 2033, 762, 2035, 2036, 1781, 2037, 2038, 1783, 2039, 2040, 2041, 447, 1789, 448, 2048, 2049, 2050, + 2051, 2052, 1796, 1797, 1798, 2061, 1799, 2064, 2068, 2069, 2072, 2073, 2074, 1807, 2079, 2080, 1809, 2083, 2084, 2085, 2086, 1558, 2092, 1048, 1815, + 2095, 1816, 2097, 2098, 1307, 2106, 2107, 1822, 2109, 1823, 2115, 658, 1060, 457, 2119, 1829, 1830, 1831, 1832, 2131, 2132, 1579, 1580, 1837, 1838, + 1839, 1584, 1840, 1585, 1846, 1591, 1847, 1592, 1593, 1851, 1852, 1853, 1598, 672, 1599, 1855, 2178, 2179, 1858, 1859, 1604, 1860, 1605, 2186, 1607, + 466, 2191, 2192, 2193, 2194, 2195, 1867, 1612, 1613, 2202, 2203, 1870, 1615, 2206, 2207, 2208, 2212, 683, 2217, 2222, 2223, 279, 1882, 1627, 1883, 2231, + 2232, 1629, 280, 1888, 690, 1636, 1892, 1637, 1893, 1638, 692, 1639, 1895, 1896, 475, 1900, 1645, 1901, 1646, 1902, 476, 1648, 1905, 1906, 1907, 1653, + 956, 2289, 2290, 2291, 702, 2294, 2295, 2296, 2297, 2298, 1918, 1152, 2302, 2303, 1920, 2305, 289, 1669, 2315, 709, 1930, 1675, 1931, 1932, 1933, 1423, + 484, 1683, 485, 1430, 1942, 1432, 845, 1945, 1690, 2358, 2359, 2360, 2368, 1955, 1956, 1957, 74, 1447, 1448, 1960, 853, 1961, 1706, 727, 1965, 300, + 1456, 1968, 1713, 1969, 1714, 1460, 75, 1975, 1976, 1061, 1722, 1467, 1723, 495, 1422, 735, 691, 719, 716, 1982, 710, 1983, 704, 703, 865, 682, 671, + 508, 496, 494, 1732, 493, 1733, 483, 477, 465, 1735, 456, 1736, 2304, 1737, 301, 299, 290, 162, 245, 1740, 232, 1741, 163, 1805, 1869, 154, 1488, 1744, + 2000, 1745, 82, 1871, 81, 1808, 29, 18, 1621, 1431, 1494, 310, 2140, 1751, 2096, 1752, 2008, 172, 1628, 2204, 2184, 1821, 2183, 2185, 2108, 2182, 1502, + 1758, 2060, 1759, 1917, 1760, 2016, 1421, 1511, 1285, 1286, 1327, 1520, 1457, 1458, 1765, 1510, 1919, 2022, 884, 1861 +}; +static const std::vector ROI_VOXELS_5 = { + 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2049, 2051, 2053, 2055, 2057, 2059, 2061, 1032, 258, 2067, 2069, 2071, 2073, + 2075, 2077, 2079, 2081, 2083, 2085, 522, 2089, 523, 1047, 2095, 2097, 2099, 2101, 2107, 2109, 2113, 1063, 2127, 2129, 2133, 2135, 2137, 2141, 2143, 537, + 2179, 2181, 2183, 1093, 1094, 2189, 2191, 2193, 2195, 2197, 2199, 2201, 1102, 2205, 2207, 2209, 2211, 1107, 2215, 2217, 1110, 1111, 1112, 2225, 1114, + 2229, 1117, 1118, 1119, 1120, 2241, 2243, 2245, 2247, 1125, 1126, 1127, 1128, 2257, 2259, 70, 2263, 2265, 1134, 1135, 1136, 1137, 1138, 1139, 2279, + 1141, 1142, 1143, 1144, 1145, 35, 2293, 2295, 287, 2299, 2301, 2303, 288, 2307, 1156, 2317, 2319, 2321, 2323, 2325, 2327, 2329, 2331, 2333, 2335, 2337, + 2339, 2341, 2343, 2345, 2347, 2349, 2351, 2353, 2355, 2357, 2359, 2361, 2363, 2371, 2373, 2375, 297, 2379, 2381, 2383, 2385, 2387, 2389, 2391, 2393, + 1201, 1206, 1207, 1228, 307, 308, 309, 625, 1256, 1263, 632, 633, 634, 79, 1277, 1278, 320, 1282, 1283, 642, 1285, 643, 644, 645, 80, 1293, 1294, 1302, + 1303, 652, 653, 654, 1309, 655, 656, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, 664, 665, 1333, 667, 668, 669, 670, 677, 678, + 679, 680, 681, 170, 171, 1376, 1377, 689, 1383, 1384, 1392, 699, 700, 701, 706, 707, 708, 1417, 1418, 1421, 1422, 1423, 1424, 1425, 713, 714, 1429, + 1430, 1431, 1432, 89, 179, 1439, 721, 1443, 722, 1445, 1446, 1447, 1448, 1449, 725, 90, 726, 1454, 1455, 1456, 1457, 1458, 1461, 731, 1463, 734, 1469, + 1470, 1472, 1473, 1475, 1476, 1477, 1478, 1479, 740, 1482, 1483, 1484, 1485, 1489, 1490, 1492, 747, 1500, 1502, 755, 1511, 1520, 1148, 1146, 948, 1131, + 1130, 1122, 1121, 1115, 2048, 1537, 1538, 2054, 2056, 2058, 1542, 2062, 2064, 2066, 2068, 2070, 2072, 2074, 2076, 2078, 2080, 2082, 2084, 2086, 2088, + 2090, 1558, 1559, 2096, 2098, 781, 954, 2219, 2106, 2108, 1922, 2112, 2114, 2210, 1924, 2120, 2122, 1574, 2126, 2128, 2100, 2087, 2134, 1580, 2138, + 2065, 2142, 1584, 1585, 2148, 1587, 1588, 2374, 536, 1591, 1592, 1593, 1594, 99, 1312, 1925, 1598, 1599, 1600, 2178, 2180, 2182, 1604, 1605, 2188, 2190, + 2192, 2194, 2196, 2198, 2200, 2202, 2204, 2206, 2208, 1617, 1618, 1619, 1544, 2218, 2272, 2222, 2224, 2226, 2228, 2146, 1628, 1629, 1630, 2238, 2240, + 2242, 2244, 2246, 2248, 2250, 1638, 1639, 2256, 2258, 2260, 2262, 2264, 2266, 1646, 2233, 1648, 1910, 2237, 1651, 2239, 413, 2255, 2286, 2261, 414, + 2292, 2294, 2296, 2298, 2300, 2302, 2304, 2306, 2308, 1667, 834, 1669, 835, 2318, 2320, 418, 2324, 1675, 209, 419, 2332, 2334, 2336, 420, 2340, 1683, + 210, 2346, 843, 2350, 844, 2354, 1690, 2358, 211, 2362, 1897, 2283, 2322, 2370, 2372, 1699, 1700, 1701, 851, 2382, 852, 426, 2388, 1707, 2392, 1709, + 2326, 2376, 2060, 428, 1714, 1715, 858, 429, 1718, 2251, 1442, 1581, 1722, 1723, 1724, 1725, 1586, 1595, 1601, 1729, 1730, 1731, 1732, 1733, 1734, 1735, + 1736, 1737, 1738, 1739, 217, 435, 1742, 1743, 1744, 1745, 1746, 1575, 218, 1451, 1450, 1751, 1752, 1753, 2005, 1610, 219, 100, 1758, 1759, 1760, 1761, + 1762, 2184, 220, 1765, 2185, 1767, 1768, 2290, 1658, 1771, 1657, 443, 887, 1643, 888, 444, 889, 1334, 890, 445, 1160, 1780, 1784, 446, 1786, 1787, 524, + 2236, 1790, 1791, 776, 769, 2360, 2305, 2297, 1797, 1798, 1799, 1800, 2291, 901, 1803, 2289, 2212, 2203, 1807, 1808, 1809, 2186, 1811, 1812, 453, 2092, + 1815, 1816, 454, 1818, 2052, 910, 455, 1822, 1823, 2050, 436, 2252, 2253, 228, 1829, 915, 1831, 1832, 2254, 1893, 2269, 229, 1837, 1838, 1839, 1840, + 2330, 2342, 1706, 922, 1845, 1846, 1847, 1713, 28, 1740, 1851, 1852, 1853, 1858, 1855, 1856, 464, 929, 1859, 930, 1861, 1862, 1863, 1864, 1865, 1860, + 1867, 1741, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 2378, 2377, 1879, 2356, 2348, 1882, 1883, 1884, 1885, 1886, 1887, 944, 1889, 1890, 1891, + 1892, 473, 1894, 1895, 1896, 474, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 955, 1911, 1912, 2136, 427, 2267, 958, 1917, + 1918, 1919, 1920, 1921, 961, 1923, 962, 481, 1844, 1625, 1623, 482, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1561, 1543, 242, 1708, 1942, 1943, + 1944, 1510, 1946, 862, 243, 2235, 27, 1951, 1952, 1953, 1954, 2390, 1636, 1637, 2384, 2380, 1286, 490, 1962, 1963, 1964, 491, 2352, 2344, 1553, 492, + 2338, 1971, 1972, 227, 2022, 2328, 657, 1977, 1978, 1979, 1830, 2093, 534, 1579, 1984, 1985, 1986, 230, 2147, 1989, 923, 2249, 953, 463, 2234, 2187, + 1996, 1997, 1103, 937, 2000, 814, 688, 408, 1888, 501, 908, 1129, 2008, 2063, 829, 239, 1147, 503, 1717, 1716, 2016, 504, 715, 1821, 488, 505, 1011, + 850, 1012, 506, 298, 2386, 2028, 2029, 2030, 2031, 434, 2033, 868, 2035, 1004 +}; +static const std::vector ROI_VOXELS_6 = { + 1530, 1532, 1534, 1536, 1538, 1542, 1544, 1546, 387, 1552, 1556, 1558, 1560, 1566, 1570, 393, 1578, 1580, 395, 1584, 396, 1588, 1590, 1592, 1594, 1598, + 1600, 1604, 1610, 1618, 405, 1624, 406, 1628, 407, 1632, 408, 1636, 1638, 1640, 1642, 411, 1648, 412, 1654, 1656, 414, 1660, 1662, 1664, 1666, 1668, + 1670, 1672, 418, 1676, 1678, 1680, 1682, 1684, 1686, 1688, 1690, 1692, 1694, 1696, 1698, 1700, 425, 1704, 1706, 1708, 427, 1712, 1714, 1716, 1718, 1720, + 1722, 1724, 1730, 1732, 1734, 1736, 434, 1740, 1742, 1744, 436, 1750, 1752, 1756, 1758, 1760, 1762, 1764, 1770, 443, 444, 445, 1786, 1792, 1794, 1798, + 1802, 1806, 1808, 1810, 1812, 1814, 1816, 1818, 1820, 1822, 1824, 1826, 1828, 1830, 1832, 1834, 1836, 1838, 1840, 1842, 1844, 1846, 1848, 1850, 1852, + 1854, 1856, 1858, 1860, 1862, 1864, 1866, 1868, 1870, 1872, 1874, 1876, 1878, 1880, 1882, 1884, 1886, 1888, 1890, 1892, 1894, 1896, 1898, 1900, 1902, + 1904, 1906, 1908, 1910, 1912, 1916, 1918, 1920, 1922, 1924, 1928, 1930, 1932, 1936, 1940, 1942, 1944, 1950, 1952, 488, 1964, 1972, 1978, 1988, 1990, + 1994, 1996, 1998, 2000, 2002, 2004, 2006, 2008, 2010, 2012, 2016, 2018, 2020, 2022, 2026, 2028, 2030, 2032, 2036, 2038, 2040, 2042, 2044, 2046, 2049, + 2053, 2057, 2061, 2065, 2069, 2073, 2077, 2081, 2085, 2089, 2093, 2097, 2101, 2109, 2113, 2117, 2129, 2137, 535, 2145, 2149, 2157, 2169, 543, 2177, + 2181, 2185, 2189, 2193, 2197, 2201, 2205, 2209, 2217, 555, 556, 557, 2233, 2237, 560, 2245, 563, 564, 2261, 2269, 569, 2289, 2293, 2297, 2301, 2305, + 2317, 2325, 2337, 585, 2349, 2361, 2373, 2377, 2381, 2389, 2393, 615, 620, 621, 622, 624, 625, 626, 627, 630, 631, 632, 633, 634, 635, 636, 638, 639, + 641, 642, 643, 644, 645, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 661, 662, 663, 664, 665, 667, 668, 669, 670, 675, 677, 678, 679, 721, + 731, 740, 747, 751, 755, 756, 757, 758, 759, 760, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, + 783, 784, 785, 786, 788, 789, 790, 791, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 812, 814, 815, 822, + 823, 824, 827, 828, 829, 830, 831, 833, 834, 835, 839, 840, 842, 843, 844, 847, 849, 850, 851, 857, 858, 862, 868, 901, 908, 915, 922, 923, 929, 930, + 932, 933, 935, 936, 937, 938, 939, 940, 941, 942, 944, 945, 946, 947, 949, 950, 951, 952, 955, 957, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, + 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 996, 997, 998, 1000, + 1002, 1003, 1004, 1005, 1006, 1011, 1012, 1013, 1014, 1017, 1018, 1021, 1022, 2050, 2054, 2058, 2062, 2066, 2070, 2074, 2078, 2082, 2086, 2090, 2098, + 2106, 2114, 2122, 2126, 2138, 2146, 2150, 2158, 2162, 2170, 2178, 2182, 2186, 2190, 2194, 2198, 2202, 2206, 2210, 1107, 2218, 2222, 2226, 1117, 2238, + 2246, 1125, 2254, 2262, 2270, 2282, 1143, 2290, 2294, 2298, 2302, 2306, 1155, 1157, 2318, 2322, 2326, 2330, 1167, 1169, 2342, 1173, 2350, 1177, 2358, + 2362, 1183, 2370, 1187, 2378, 2382, 1193, 1197, 1201, 1203, 1205, 1207, 1209, 1213, 1217, 1219, 1225, 1235, 1243, 1263, 1277, 1283, 1285, 1293, 1303, + 1309, 1313, 1325, 1329, 1331, 1333, 1335, 1337, 1339, 1341, 1343, 1345, 1347, 1349, 1351, 1353, 1355, 1357, 1359, 1361, 1363, 1365, 1367, 1369, 1371, + 1373, 1375, 1377, 1379, 1383, 1387, 1391, 1395, 1401, 1405, 1407, 1411, 1417, 1421, 1423, 1425, 1429, 1431, 1439, 1443, 1445, 1447, 1449, 1451, 1455, + 1457, 1461, 1471, 1491, 1495, 1497, 1499, 1501, 1503, 1505, 1507, 1509, 1511, 1513, 1515, 1517, 1519, 1521, 1523, 1525, 1527, 1529, 1531, 1533, 1535, + 1537, 1539, 1541, 1543, 1545, 1547, 1551, 1553, 1555, 1559, 1561, 1565, 1567, 1569, 1575, 1579, 1581, 1583, 1585, 1587, 1591, 1593, 1595, 1597, 1599, + 1601, 1603, 1605, 1609, 100, 1619, 1623, 1625, 1629, 1631, 1633, 1637, 1639, 1641, 1643, 1647, 1649, 1651, 1655, 1657, 1659, 1661, 1663, 1665, 1667, + 1669, 1671, 1673, 1675, 1677, 1679, 1681, 1683, 1685, 1687, 1689, 1691, 1693, 1695, 1697, 1699, 1701, 1703, 1705, 1707, 1709, 1711, 1713, 1715, 1717, + 1721, 1723, 1725, 1729, 1731, 1733, 1735, 1737, 1739, 1741, 1743, 1745, 1749, 1751, 1753, 1757, 1759, 1761, 1765, 1771, 1787, 1791, 1793, 1797, 1799, + 1801, 1803, 1807, 1809, 1811, 1813, 1815, 1817, 1819, 1821, 1823, 1825, 1827, 1829, 1831, 1833, 1835, 1837, 1839, 1841, 1843, 1847, 1849, 1851, 1853, + 1855, 1857, 1859, 1861, 1863, 1865, 1867, 1869, 1871, 1873, 1875, 1879, 1881, 1883, 1885, 1887, 1889, 1891, 1893, 1895, 1897, 1899, 1901, 1903, 1905, + 1907, 1909, 1911, 1915, 1917, 1919, 1921, 1923, 1925, 1929, 1931, 1933, 1935, 1937, 1941, 1943, 1949, 1979, 1987, 1989, 1991, 1995, 1997, 2003, 2005, + 2011, 2013, 2019, 2025, 2027, 2031, 2033, 2035, 2037, 2039, 2041, 2043, 2045, 2047, 2051, 2055, 2059, 2063, 2067, 2071, 2075, 2079, 2083, 2087, 2095, + 2099, 2107, 2111, 2123, 2127, 2155, 2163, 2171, 2179, 2183, 2187, 2191, 2195, 2199, 2203, 2207, 2211, 2215, 2219, 2239, 2243, 2255, 2263, 2275, 2283, + 2291, 2295, 2299, 2303, 2307, 2327, 2331, 2335, 2343, 2351, 2359, 2363, 2371, 2375, 2383, 2387, 193, 209, 210, 211, 217, 218, 219, 220, 227, 228, 229, + 230, 239, 242, 243, 575, 565, 559, 558, 551, 542, 528, 1186, 1185, 339, 338, 337, 336, 2048, 2052, 2056, 2060, 2064, 2068, 2072, 2076, 2080, 2084, 2088, + 2092, 2096, 1050, 2104, 2108, 2112, 419, 2120, 325, 2128, 1334, 2136, 323, 2144, 536, 1175, 2156, 1650, 2164, 99, 2172, 2176, 2180, 2184, 2188, 2192, + 2196, 2200, 2204, 2208, 2212, 392, 1110, 2224, 2228, 426, 2236, 1174, 2244, 1586, 1126, 2256, 1150, 1149, 2268, 2100, 2276, 1746, 2284, 2288, 2292, + 2296, 2300, 2304, 2308, 1738, 1158, 2320, 2324, 1164, 1166, 2336, 1170, 1172, 2348, 1176, 2356, 2360, 1182, 1184, 2372, 2376, 1190, 1192, 2388, 1574, + 1198, 1200, 1202, 453, 1206, 1208, 1210, 1212, 1168, 344, 1218, 1220, 417, 1224, 1226, 1228, 554, 1710, 1032, 1236, 1034, 1658, 1242, 1159, 1180, 1181, + 312, 534, 313, 1256, 537, 1036, 1035, 1093, 547, 548, 317, 1102, 318, 1103, 1278, 2252, 1282, 1114, 1286, 2253, 1134, 1135, 1294, 2277, 324, 1153, 1302, + 1154, 326, 579, 1160, 1312, 1161, 1162, 1163, 1165, 1171, 1324, 331, 1328, 332, 1332, 333, 1336, 1338, 1340, 1342, 1344, 1346, 1348, 1350, 1352, 1354, + 1356, 1358, 1360, 1362, 1364, 1366, 1368, 1370, 1372, 1178, 1376, 1378, 1179, 1382, 1384, 1386, 1388, 347, 1392, 348, 1396, 349, 1400, 1402, 1191, 1406, + 1702, 1410, 1412, 1189, 1194, 1418, 1420, 355, 1424, 446, 1330, 1430, 1432, 358, 1188, 345, 346, 1442, 1646, 1446, 1448, 1450, 1422, 1454, 1456, 1458, + 357, 1094, 435, 394, 1674, 1470, 1550, 1474, 397, 409, 410, 413, 420, 1486, 428, 429, 1492, 1954, 1496, 1498, 1500, 1502, 1504, 1506, 1508, 1510, 1512, + 1514, 1516, 1518, 1520, 1522, 1524, 1526, 1528, 501 +}; +static const std::vector ROI_VOXELS_7 = { + 1530, 1532, 383, 1536, 1538, 1542, 1544, 386, 1550, 1552, 388, 1558, 1560, 390, 391, 1570, 1574, 1578, 1580, 1584, 1586, 1588, 1590, 1592, 398, 1598, + 1600, 400, 1604, 401, 402, 1612, 403, 1618, 1624, 1628, 1630, 1632, 408, 1636, 1638, 1640, 1642, 1646, 1648, 1650, 413, 1656, 414, 1660, 415, 1664, + 1666, 1668, 1670, 1672, 418, 1676, 419, 1680, 420, 1684, 1686, 1688, 1690, 1692, 1694, 1696, 1698, 1700, 425, 1704, 426, 1708, 427, 1712, 1714, 1716, + 1718, 1722, 1724, 431, 432, 1732, 1734, 1736, 434, 1740, 1742, 1744, 436, 1750, 1752, 438, 1756, 1758, 1760, 440, 1764, 441, 1770, 1774, 444, 445, 1784, + 1786, 1790, 1792, 1794, 1796, 1798, 1800, 1802, 1806, 1808, 1810, 1812, 1814, 1816, 1818, 1820, 1822, 1824, 1826, 1828, 1830, 1832, 1834, 1836, 1838, + 1840, 1842, 1844, 1846, 1848, 1850, 1852, 1854, 1856, 1858, 1860, 1862, 1864, 1866, 1868, 1870, 1872, 1874, 1876, 1882, 1884, 1886, 1888, 1890, 1892, + 1894, 1896, 1898, 1900, 1902, 1904, 1906, 1908, 1910, 1912, 1916, 1918, 1920, 1922, 1924, 1928, 1930, 1932, 1936, 1940, 1942, 1950, 488, 1956, 1960, + 1964, 1968, 1972, 1976, 1978, 1982, 1984, 1986, 1990, 1992, 1994, 1996, 1998, 2000, 2006, 2008, 2014, 2016, 2022, 2024, 2026, 2028, 2030, 2032, 2034, + 2036, 2038, 2040, 2042, 2044, 2046, 2049, 2053, 2057, 2061, 2065, 2069, 2073, 2077, 2081, 2085, 2089, 2093, 2097, 2101, 526, 527, 529, 2129, 2133, 2137, + 2141, 536, 537, 2153, 2161, 2165, 2173, 2181, 2185, 2189, 2193, 2197, 2201, 2205, 2209, 2217, 2225, 2229, 2233, 2237, 2241, 2245, 2249, 2253, 2257, + 2261, 2265, 2269, 2273, 569, 2281, 2285, 2289, 2293, 2297, 2301, 2305, 579, 2321, 2325, 2329, 2333, 2337, 2341, 2345, 2349, 2353, 2357, 2361, 2373, + 2377, 2381, 2385, 2389, 2393, 610, 611, 616, 617, 618, 619, 622, 623, 625, 626, 627, 628, 629, 632, 633, 634, 635, 636, 637, 638, 639, 640, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 659, 660, 661, 662, 663, 664, 665, 667, 668, 669, 670, 673, 674, 675, 677, 678, + 679, 705, 711, 712, 717, 718, 721, 723, 724, 728, 731, 732, 733, 737, 740, 742, 743, 744, 747, 748, 749, 750, 752, 755, 762, 769, 770, 775, 776, 777, + 778, 781, 782, 783, 784, 786, 788, 789, 790, 791, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, + 813, 814, 815, 816, 817, 824, 825, 826, 829, 830, 831, 832, 834, 835, 836, 837, 838, 839, 840, 841, 843, 844, 846, 847, 848, 850, 851, 854, 856, 857, + 858, 862, 863, 864, 868, 869, 870, 871, 872, 873, 880, 881, 882, 883, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, + 907, 908, 909, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 934, 937, 943, 944, 955, 956, + 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, + 989, 990, 991, 992, 993, 994, 995, 998, 999, 1000, 1001, 1004, 1006, 1011, 1012, 1023, 2050, 2054, 2058, 2062, 2066, 2070, 2074, 2078, 2082, 2086, 2090, + 2098, 2106, 1059, 2122, 2126, 1065, 2134, 2138, 2142, 2146, 2154, 2166, 2174, 2178, 2182, 2186, 2190, 2194, 2198, 2202, 2206, 1105, 1107, 1109, 2222, + 1113, 2234, 2238, 2242, 2246, 2250, 2254, 2258, 2262, 2266, 1135, 2274, 2278, 2286, 2290, 2294, 2298, 2302, 2306, 1155, 1157, 2318, 2322, 2326, 1165, + 2334, 2338, 2342, 2346, 2350, 2354, 2358, 2362, 1183, 2370, 2374, 1189, 2382, 2386, 2390, 1197, 1199, 1201, 1203, 1207, 1211, 1217, 1225, 1229, 1231, + 1239, 1241, 1251, 1253, 1257, 1259, 1261, 1263, 1265, 1277, 1281, 1283, 1285, 1291, 1293, 1301, 1303, 1307, 1309, 1313, 1325, 1327, 1329, 1331, 1333, + 1335, 1337, 1339, 1341, 1343, 1345, 1347, 1349, 1351, 1353, 1355, 1357, 1359, 1361, 1363, 1365, 1367, 1369, 1371, 1373, 1377, 1379, 1381, 1383, 1389, + 1391, 1401, 1411, 1417, 1421, 1423, 1425, 1429, 1431, 1433, 1435, 1439, 1441, 1443, 1445, 1447, 1449, 1451, 1453, 1455, 1457, 1461, 1467, 1469, 1471, + 1491, 1495, 1497, 1499, 1501, 1503, 1505, 1507, 1509, 1511, 1513, 1515, 1517, 1519, 1521, 1523, 1525, 1527, 1529, 1531, 1533, 1535, 1537, 1539, 1541, + 1543, 1547, 1551, 1553, 1559, 1561, 97, 1569, 1575, 1579, 98, 1583, 1585, 1587, 1591, 1593, 1595, 99, 1599, 1601, 1605, 1607, 1613, 1615, 1617, 1619, + 1621, 1623, 1625, 1627, 1629, 1631, 1633, 1637, 1639, 1641, 1643, 1645, 1647, 1649, 1651, 1653, 1655, 1657, 1659, 1661, 1663, 1665, 1667, 1669, 1671, + 1673, 1675, 1677, 1679, 1681, 1683, 1685, 1687, 1689, 1691, 1693, 1695, 1697, 1699, 1701, 1703, 1705, 1707, 1709, 1711, 1713, 1715, 1717, 1723, 1725, + 1729, 1731, 1733, 1735, 1737, 1739, 1741, 1743, 1745, 1749, 1751, 1753, 1757, 1759, 1761, 1765, 1773, 1775, 1777, 1781, 1783, 1787, 1789, 1791, 1793, + 1797, 1799, 1801, 1803, 1805, 1807, 1809, 1811, 1813, 1815, 1817, 1819, 1821, 1823, 1825, 1827, 1829, 1831, 1833, 1835, 1837, 1839, 1841, 1843, 1845, + 1847, 1849, 1851, 1853, 1855, 1857, 1859, 1861, 1863, 1865, 1867, 1869, 1871, 1873, 1875, 1879, 1881, 1883, 1885, 1887, 1889, 1891, 1893, 1895, 1897, + 1899, 1901, 1903, 1905, 1907, 1909, 1911, 1915, 1917, 1919, 1921, 1923, 1925, 1929, 1931, 1933, 1935, 1937, 1941, 1945, 1949, 1955, 1957, 1961, 1963, + 1965, 1969, 1971, 1975, 1977, 1979, 1983, 1985, 1989, 1991, 1993, 1997, 1999, 2001, 2005, 2007, 2009, 2011, 2015, 2017, 2021, 2023, 2025, 2029, 2031, + 2033, 2035, 2037, 2039, 2041, 2043, 2045, 2047, 2051, 2055, 2059, 2063, 2067, 2071, 2075, 2079, 2083, 2087, 2095, 2099, 2107, 2111, 2115, 2119, 2123, + 2127, 2131, 2135, 2143, 2147, 2151, 2159, 2167, 2175, 2179, 2183, 2187, 2191, 2195, 2199, 2203, 2207, 2211, 2215, 2219, 2223, 2231, 2239, 2243, 2247, + 2251, 2255, 2259, 2263, 2267, 2271, 2279, 2283, 2287, 2291, 2295, 2299, 2303, 2307, 2315, 2319, 2323, 2327, 2331, 2335, 2339, 2343, 2347, 2351, 2355, + 2359, 2363, 2371, 2375, 2379, 2383, 2387, 2391, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 223, 224, 225, 226, 227, 228, + 229, 230, 234, 235, 238, 239, 1662, 446, 428, 435, 242, 1152, 410, 1150, 243, 1149, 2218, 2210, 2200, 1534, 1702, 1049, 1762, 1746, 1738, 1730, 1594, + 1581, 1178, 1180, 2378, 1193, 1094, 499, 487, 449, 442, 439, 437, 433, 430, 424, 423, 422, 421, 416, 1658, 429, 100, 1154, 1160, 1188, 534, 2117, 1032, + 1106, 1099, 1098, 1090, 1073, 1068, 1067, 1066, 2048, 2052, 2056, 2060, 2064, 2068, 2072, 2076, 2080, 2084, 2088, 2092, 2096, 2100, 2104, 2108, 1161, + 1058, 2120, 1159, 2128, 2132, 2136, 2140, 1072, 2148, 2152, 1078, 2160, 2330, 2168, 1187, 1196, 2180, 2184, 2188, 2192, 2196, 1100, 2204, 2208, 2212, + 1108, 1110, 2224, 2228, 2232, 2236, 2240, 2244, 2248, 2252, 2256, 2260, 2264, 1134, 2272, 1162, 2280, 1194, 417, 2292, 2296, 2300, 2304, 2308, 411, + 1158, 2320, 2324, 2328, 2332, 2336, 2340, 2344, 2348, 2352, 2356, 2360, 1182, 2368, 2372, 2376, 2380, 2384, 2388, 2392, 1198, 1195, 1202, 1204, 1206, + 404, 399, 389, 1177, 1179, 1218, 1220, 1117, 1224, 1226, 1228, 1230, 1140, 1133, 1132, 1238, 1240, 1124, 1123, 1116, 2109, 1250, 1252, 1064, 1256, 1258, + 1260, 1070, 1264, 1071, 1092, 1091, 1084, 1083, 1093, 1278, 1095, 1282, 1101, 1286, 1102, 1103, 1292, 1294, 1104, 1111, 1300, 1302, 1112, 1114, 1308, + 1119, 1312, 1314, 1120, 1125, 1126, 1143, 1324, 1153, 1328, 1330, 1332, 1334, 1336, 1338, 1340, 1342, 1344, 1346, 1348, 1350, 1352, 1354, 1356, 1358, + 1360, 1362, 1364, 1366, 1368, 1370, 1372, 1374, 1376, 1163, 1164, 1171, 1384, 1172, 1173, 1174, 1392, 1175, 1176, 1184, 1400, 1402, 1185, 1186, 1190, + 1410, 1412, 1191, 1192, 1418, 443, 1422, 1424, 1426, 1706, 1430, 1432, 1434, 1436, 1181, 1440, 1442, 1444, 1446, 1448, 1450, 1452, 1454, 1456, 1458, + 1460, 1170, 1169, 1168, 1167, 1470, 1166, 1474, 1682, 1674, 453, 1654, 1678, 1486, 1488, 1954, 1492, 1494, 1496, 1498, 1500, 1502, 1504, 1506, 1508, + 1510, 1512, 1514, 1516, 1518, 1520, 1522, 1524, 1526, 1528, 501 +}; +static const std::vector ROI_VOXELS_8 = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 71, 72, 73, 74, 75, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 107, 108, 109, 110, 111, 112, 113, 116, 117, 118, 119, 120, 121, 122, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 137, 138, 139, 140, 141, 142, 143, 144, 150, 151, 152, 153, 154, 161, 162, 163, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 193, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 266, 267, 268, 269, 270, 277, 278, 279, 280, 287, 288, 289, 290, 297, 298, 299, 300, 301, 302, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 331, 332, 333, 334, 335, 336, 337, 338, 339, 344, 345, 346, 347, 348, 349, + 355, 357, 358, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 453, 454, 455, 456, 457, 458, 459, 463, 464, 465, 466, 473, 474, 475, 476, 477, 481, + 482, 483, 484, 485, 487, 488, 490, 491, 492, 493, 494, 495, 496, 499, 501, 503, 504, 505, 506, 507, 508, 509, 510, 511, 520, 521, 522, 523, 524, 525, + 528, 535, 538, 539, 540, 541, 542, 543, 547, 548, 549, 550, 551, 554, 555, 556, 557, 558, 559, 560, 563, 564, 565, 569, 575, 579, 585, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 677, 678, 679, 680, 681, 682, 683, 688, 689, 690, 691, 692, 699, 700, 701, 702, 703, 704, 706, 707, 708, 709, 710, 713, 714, 715, 716, 719, + 721, 722, 725, 726, 727, 734, 735, 736, 741, 751, 756, 757, 758, 759, 760, 763, 764, 765, 766, 767, 768, 771, 772, 773, 774, 775, 779, 780, 782, 785, + 786, 788, 789, 794, 795, 796, 797, 802, 803, 804, 805, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, + 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 856, 857, 858, 862, 865, + 868, 884, 885, 886, 887, 888, 889, 890, 910, 932, 933, 935, 936, 938, 939, 940, 941, 942, 945, 946, 947, 949, 950, 951, 952, 954, 957, 959, 960, 967, + 968, 969, 970, 971, 978, 979, 980, 981, 982, 987, 988, 989, 990, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, + 1010, 1011, 1012, 1013, 1014, 1021, 1022, 1023, 1032, 1034, 1035, 1036, 1047, 1048, 1050, 1060, 1061, 1063, 1077, 1086, 1087, 1097, 1115, 1121, 1122, + 1130, 1131, 1149, 1150, 1157, 1158, 1159, 1165, 1166, 1167, 1168, 1169, 1170, 1177, 1178, 1179, 1180, 1181, 1187, 1188, 1189, 1194, 1195, 1196, 1197, + 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1228, 1242, + 1243, 1274, 1275, 1277, 1278, 1287, 1296, 1305, 1306, 1310, 1311, 1315, 1316, 1319, 1320, 1324, 1325, 1331, 1332, 1339, 1340, 1341, 1342, 1343, 1347, + 1348, 1349, 1350, 1351, 1357, 1358, 1359, 1364, 1365, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1386, + 1387, 1388, 1389, 1390, 1392, 1395, 1396, 1397, 1398, 1399, 1405, 1406, 1407, 1408, 1409, 1417, 1418, 1424, 1425, 1442, 1443, 1449, 1450, 1451, 1463, + 1468, 1471, 1474, 1486, 1491, 1498, 1499, 1502, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1516, 1517, 1518, 1519, 1520, 1524, 1525, 1526, 1530, + 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1553, 1555, 1556, 1557, 1558, 1565, 1566, 1567, + 1568, 1574, 1575, 1576, 1577, 1581, 1582, 1586, 1587, 1588, 1589, 1594, 1595, 1600, 1601, 1610, 1616, 1622, 1624, 1628, 1629, 1631, 1632, 1633, 1636, + 1637, 1638, 1639, 1640, 1641, 1642, 1646, 1648, 1649, 1650, 1656, 1662, 1663, 1664, 1665, 1666, 1669, 1671, 1672, 1673, 1674, 1675, 1679, 1680, 1681, + 1682, 1683, 1687, 1688, 1689, 1690, 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1709, 1710, 1711, 1712, 1713, 1714, + 1718, 1720, 1721, 1722, 1723, 1729, 1730, 1731, 1732, 1733, 1738, 1739, 1740, 1741, 1746, 1747, 1748, 1753, 1754, 1755, 1761, 1762, 1763, 1769, 1771, + 1778, 1779, 1780, 1785, 1792, 1793, 1794, 1797, 1798, 1799, 1801, 1802, 1807, 1808, 1809, 1810, 1815, 1816, 1817, 1821, 1822, 1823, 1824, 1825, 1826, + 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, + 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1875, 1878, 1879, 1880, 1881, 1882, 1883, 1886, 1889, + 1890, 1891, 1892, 1893, 1897, 1898, 1899, 1900, 1901, 1902, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1935, + 1936, 1937, 1938, 1939, 1943, 1944, 1947, 1948, 1951, 1952, 1953, 1962, 1970, 1987, 1988, 1992, 1993, 1994, 1995, 1999, 2000, 2001, 2002, 2003, 2004, + 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2030, 2031, 2032, 2033, + 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2047, 2172, 2204, 2219, 2268, 2173, 2078, 2110, 2059, 2174, 2079, 2271, 2270, 2302, 2080, 2112, 2144, + 2176, 2285, 2113, 2145, 2050, 2209, 2114, 2273, 2305, 2210, 2369, 2274, 2052, 2211, 2116, 2275, 2167, 2212, 2164, 2276, 2099, 2066, 2075, 2150, 2182, + 2087, 2077, 2278, 2183, 2088, 2076, 2152, 2184, 2089, 2067, 2280, 2185, 2090, 2065, 2281, 2186, 2218, 2058, 2282, 2060, 2092, 2124, 2156, 2061, 2161, + 2125, 2284, 2316, 2160, 2048, 2158, 2317, 2179, 2051, 2159, 2191, 2068, 2149, 2287, 2192, 2153, 2154, 2288, 2193, 2155, 2157, 2162, 2194, 2226, 2163, + 2290, 2195, 2100, 2177, 2291, 2069, 2101, 2175, 2165, 2178, 2102, 2298, 2166, 2049, 2103, 2303, 2294, 2151, 2358, 2169, 2168, 2200, 2359, 2277, 2296, + 2201, 2360, 2289, 2170, 2202, 2295, 2297, 2171, 2203, 2235, 2304 +}; +static const std::vector ROI_VOXELS_9 = { + 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2049, 2051, 2053, 2055, 2057, 2059, 2061, 2063, 2065, 1034, 2069, 2071, 2075, + 2077, 2079, 2081, 2087, 2089, 2091, 2093, 1050, 2101, 1052, 2105, 2111, 2117, 2123, 2127, 2129, 2137, 535, 2145, 950, 2149, 2151, 2153, 2155, 2157, + 2159, 2161, 2163, 2165, 2167, 2169, 2171, 2173, 2175, 2177, 2179, 2181, 2183, 2185, 2187, 2189, 2191, 2193, 2195, 2197, 2199, 2201, 2203, 2205, 949, + 2209, 2211, 2213, 2215, 942, 555, 2221, 556, 941, 1114, 1115, 558, 2233, 559, 2237, 2239, 1121, 2243, 2245, 940, 935, 563, 2253, 2255, 933, 1130, 2261, + 2263, 1187, 567, 2269, 2271, 2273, 2275, 2277, 570, 2281, 2283, 2285, 2287, 2289, 2291, 2293, 2295, 2297, 2299, 2301, 2303, 1153, 2307, 2309, 2311, + 2313, 579, 1159, 580, 1161, 780, 2325, 2327, 1165, 2331, 1167, 2335, 2337, 585, 774, 2343, 773, 587, 2349, 2351, 1177, 1178, 1179, 2359, 2361, 2363, + 2365, 2367, 768, 2371, 2373, 2375, 2377, 595, 2381, 2383, 767, 2387, 2389, 1196, 2393, 1198, 1199, 1200, 214, 1202, 1203, 1204, 1205, 603, 759, 604, + 1209, 605, 1211, 1212, 1213, 758, 215, 594, 1217, 1218, 1219, 610, 575, 611, 565, 1224, 1225, 1226, 560, 557, 551, 615, 543, 616, 542, 617, 528, 618, + 1696, 619, 1539, 620, 339, 621, 1243, 622, 1922, 623, 337, 624, 312, 1924, 2218, 626, 313, 627, 1255, 628, 1122, 629, 2078, 630, 2066, 631, 1662, 1656, + 1650, 1649, 1641, 399, 317, 635, 1271, 1272, 1273, 637, 226, 638, 1277, 639, 235, 640, 422, 641, 1155, 1284, 1325, 1324, 1158, 1157, 1150, 1149, 1320, + 646, 323, 647, 2076, 648, 324, 649, 1131, 650, 325, 651, 954, 2219, 326, 2210, 596, 2100, 327, 2099, 2090, 1312, 328, 2088, 1315, 1316, 2067, 659, 1319, + 660, 2058, 661, 1164, 662, 331, 663, 1936, 1328, 1329, 1330, 1331, 1332, 333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 775, 336, 673, + 1347, 1348, 1349, 1350, 1351, 786, 338, 789, 803, 804, 1357, 1358, 1359, 1910, 340, 796, 1908, 1364, 1365, 970, 412, 1640, 1559, 1370, 1371, 1372, 1373, + 1374, 1375, 1890, 344, 1378, 1379, 982, 345, 1382, 1166, 831, 346, 1386, 1387, 1388, 347, 1761, 1391, 1753, 348, 1695, 1395, 1396, 349, 1712, 1188, + 1400, 1401, 1402, 1729, 1601, 1405, 1406, 1407, 1600, 1595, 1410, 1411, 1412, 1594, 1588, 1587, 577, 1417, 1418, 1581, 1575, 355, 1574, 1208, 1424, + 1425, 1210, 1242, 1565, 357, 2296, 1278, 936, 358, 1878, 1721, 805, 359, 1438, 1160, 1996, 360, 1442, 1443, 1556, 361, 1904, 1546, 1545, 1449, 1450, + 1451, 1036, 1035, 1022, 1021, 1014, 1013, 1023, 854, 846, 1643, 837, 836, 674, 366, 499, 487, 398, 367, 1470, 1471, 425, 368, 1474, 815, 840, 439, 1194, + 437, 433, 1180, 431, 776, 424, 423, 1486, 1500, 416, 415, 794, 1491, 186, 373, 234, 1495, 1496, 1497, 1498, 1499, 187, 1501, 751, 1503, 1504, 1505, + 1506, 1507, 1508, 1509, 403, 216, 756, 378, 757, 1515, 1516, 1517, 1518, 1519, 760, 213, 212, 208, 1524, 1525, 763, 207, 764, 206, 765, 561, 766, 383, + 1534, 1535, 2048, 2050, 2052, 2054, 770, 1541, 771, 2062, 772, 386, 2068, 2070, 193, 387, 1550, 1551, 2080, 2082, 777, 1555, 194, 389, 1558, 2094, 1560, + 1561, 781, 97, 2104, 391, 1566, 1567, 784, 392, 1570, 2305, 2120, 2122, 787, 2126, 2128, 394, 1578, 98, 2136, 2138, 576, 1583, 2144, 396, 1586, 2150, + 2152, 2154, 1590, 2158, 2160, 2162, 2164, 2166, 2168, 2170, 2172, 2174, 2176, 2178, 2180, 2182, 2184, 2186, 2188, 2190, 2192, 2194, 2196, 2198, 2200, + 2202, 2204, 1667, 1658, 404, 1618, 2214, 2216, 405, 2220, 1623, 2224, 1625, 2228, 1657, 203, 407, 2236, 2238, 1632, 1633, 2244, 2246, 1651, 409, 2252, + 2254, 2256, 410, 1642, 2262, 822, 411, 823, 1647, 824, 2274, 2276, 2278, 2280, 2282, 2284, 1655, 828, 2290, 2292, 1659, 1660, 2298, 2300, 2302, 2304, + 2306, 833, 2310, 2312, 2314, 1670, 2318, 2320, 2322, 2324, 2326, 838, 2330, 839, 1679, 2336, 1681, 1682, 2342, 842, 421, 2348, 2350, 1688, 1689, 2356, + 2358, 2360, 2362, 2364, 2366, 848, 2370, 2372, 1492, 2376, 2378, 1702, 2382, 1704, 1705, 2388, 1707, 1708, 1333, 1710, 1711, 856, 1713, 1714, 1715, + 1716, 1717, 782, 788, 1720, 430, 1722, 1723, 1724, 1725, 769, 989, 1170, 432, 1730, 1731, 1732, 1733, 1734, 1703, 1698, 1697, 1738, 1739, 1740, 1741, + 1742, 1743, 1694, 1547, 1746, 1536, 1533, 1749, 1750, 1220, 1197, 438, 1006, 951, 1756, 1757, 564, 857, 847, 440, 1762, 830, 1764, 441, 812, 675, 636, + 442, 1770, 417, 1389, 1381, 1195, 1001, 999, 995, 841, 832, 826, 825, 817, 816, 813, 811, 1786, 1787, 223, 402, 401, 1791, 1792, 1793, 1794, 400, 224, + 449, 390, 388, 597, 1801, 1802, 1803, 225, 589, 1806, 588, 586, 578, 1810, 1811, 1812, 1813, 1814, 568, 566, 1817, 1818, 1819, 1820, 377, 374, 350, + 1824, 1825, 1826, 1827, 1828, 341, 202, 199, 198, 1833, 1834, 1835, 1836, 195, 191, 190, 1687, 1841, 1842, 1843, 1844, 1680, 1673, 1672, 1848, 1849, + 1850, 1671, 1663, 1530, 1854, 1526, 1189, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 932, 1181, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, + 1169, 1876, 1168, 939, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 548, 1887, 397, 1889, 945, 1891, 1892, 1893, 1894, 2288, 1619, 1897, 1898, 1899, 1900, + 1901, 1902, 1903, 952, 849, 1668, 1994, 238, 1909, 955, 1911, 1912, 802, 957, 1915, 1916, 797, 959, 795, 960, 1921, 961, 1923, 962, 1925, 963, 569, + 1928, 1929, 2308, 1163, 964, 827, 967, 1935, 968, 1937, 969, 318, 1940, 1941, 971, 947, 1654, 1002, 1003, 1674, 2056, 1949, 1950, 1666, 1665, 2060, + 1954, 1664, 978, 1631, 979, 1552, 980, 779, 981, 2270, 1964, 2268, 785, 1569, 393, 1062, 395, 332, 1972, 2156, 987, 547, 988, 2294, 1978, 1979, 990, + 554, 938, 946, 406, 2092, 1624, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 997, 1995, 998, 1997, 1998, 1999, 1000, 2001, 2002, 2003, 2004, 2005, 2006, + 2007, 2212, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 1661, 2017, 2018, 2019, 2020, 2021, 1154, 2023, 2024, 2025, 2026, 2027, 2028, 1706, 2146, 1107, + 2032, 996, 2034, 2035, 1005 +}; +static const std::vector ROI_VOXELS_10 = { + 1530, 1532, 1534, 1536, 386, 388, 1558, 390, 391, 1574, 1586, 1588, 398, 399, 1600, 400, 401, 402, 403, 404, 1624, 1628, 1630, 1632, 1636, 1638, 1640, + 1642, 1646, 1648, 1650, 1656, 415, 1664, 1666, 417, 1672, 1674, 1676, 1678, 1680, 1682, 1684, 1686, 1688, 422, 1692, 1694, 1696, 1698, 1702, 1704, 1706, + 1712, 1714, 1722, 431, 1730, 1732, 433, 1738, 1740, 1746, 437, 438, 439, 1762, 441, 442, 1784, 1786, 1790, 1792, 1794, 1798, 1800, 1802, 1808, 1810, + 1816, 1822, 1824, 1826, 1828, 1830, 1832, 1834, 1836, 1838, 1840, 1842, 1844, 1846, 1848, 1850, 1852, 1854, 1858, 1860, 1866, 1868, 1870, 1882, 1890, + 1892, 1898, 1900, 1902, 1908, 1910, 1912, 1922, 1924, 1936, 487, 1954, 1956, 1964, 1972, 1978, 1984, 1986, 1988, 1992, 1994, 499, 2000, 2002, 2004, + 2008, 2010, 2012, 2014, 2016, 2018, 2020, 2022, 2024, 2026, 2028, 2030, 2032, 2034, 2036, 2038, 2040, 2049, 2061, 2065, 2069, 2077, 2089, 2101, 526, + 527, 528, 529, 2129, 2133, 2137, 2141, 2145, 2149, 2153, 2157, 2161, 2165, 2169, 2173, 2177, 2185, 547, 548, 2201, 551, 2209, 554, 555, 556, 2229, 2233, + 2237, 2241, 561, 2249, 2253, 2257, 2261, 566, 567, 568, 569, 570, 2285, 2289, 2297, 575, 576, 577, 578, 579, 580, 2325, 2329, 2333, 2337, 585, 2345, + 587, 588, 589, 2373, 594, 2381, 596, 597, 2393, 603, 604, 605, 610, 611, 616, 617, 618, 619, 622, 623, 626, 627, 628, 629, 635, 636, 637, 638, 639, 640, + 646, 647, 648, 649, 650, 651, 659, 660, 661, 662, 663, 673, 674, 675, 711, 712, 717, 718, 728, 737, 743, 744, 751, 752, 756, 757, 758, 759, 760, 763, + 764, 765, 766, 767, 768, 771, 772, 773, 774, 775, 778, 779, 780, 782, 783, 785, 786, 787, 788, 789, 790, 791, 793, 794, 795, 796, 797, 798, 799, 800, + 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 815, 816, 817, 824, 825, 826, 830, 831, 832, 836, 837, 838, 839, 840, 841, 846, 847, + 848, 854, 856, 857, 863, 864, 871, 872, 873, 891, 892, 893, 897, 898, 899, 900, 904, 905, 906, 907, 911, 912, 913, 914, 918, 919, 920, 921, 926, 927, + 928, 932, 933, 934, 935, 936, 938, 939, 940, 941, 942, 943, 945, 946, 947, 948, 949, 950, 951, 952, 954, 957, 959, 960, 965, 966, 967, 968, 969, 970, + 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 998, 999, 1000, 1001, 1006, + 1023, 2050, 2058, 2066, 2078, 2090, 1049, 1059, 2122, 2126, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 2162, 1083, 2170, 2174, 2178, 2182, 2186, 2194, + 1099, 2202, 2210, 1107, 2218, 1111, 1115, 2234, 1119, 2242, 2246, 2250, 2254, 2258, 2262, 1133, 2270, 2274, 2278, 2282, 2286, 2290, 2294, 2298, 2302, + 1157, 2318, 2322, 2326, 1165, 1167, 1169, 2342, 2346, 2350, 1177, 2358, 1181, 1183, 2370, 2374, 1189, 2382, 2386, 2390, 1197, 1199, 1203, 1211, 1217, + 1229, 1231, 1241, 1251, 1253, 1261, 1277, 1281, 1291, 1301, 1307, 1315, 1319, 1325, 1331, 1339, 1341, 1343, 1345, 1347, 1349, 1351, 1353, 1355, 1357, + 1359, 1361, 1363, 1365, 1367, 1369, 1371, 1373, 1379, 1381, 1389, 1417, 1425, 1433, 1435, 1443, 1449, 1451, 1453, 1467, 1469, 1471, 1473, 1479, 1485, + 1491, 1499, 1505, 1507, 1509, 1511, 1513, 1517, 1519, 1521, 1523, 1525, 1527, 1529, 1531, 1533, 1535, 1539, 1541, 1547, 97, 1575, 98, 1587, 1595, 1601, + 1613, 1617, 1619, 1623, 1625, 1629, 1631, 1633, 1637, 1639, 1641, 1649, 1663, 1665, 1669, 1671, 1673, 1675, 1677, 1679, 1681, 1683, 1685, 1687, 1689, + 1691, 1693, 1695, 1697, 1703, 1705, 1711, 1713, 1723, 1729, 1731, 1733, 1739, 1741, 1753, 1761, 1773, 1775, 1781, 1787, 1791, 1793, 1797, 1799, 1801, + 1807, 1809, 1815, 1817, 1821, 1823, 1825, 1827, 1829, 1831, 1833, 1835, 1837, 1839, 1841, 1843, 1845, 1847, 1849, 1851, 1853, 1855, 1857, 1859, 1861, + 1867, 1869, 1871, 1879, 1881, 1883, 1889, 1891, 1893, 1897, 1899, 1901, 1909, 1911, 1921, 1923, 1925, 1935, 1937, 1957, 1963, 1965, 1971, 1977, 1979, + 1985, 1987, 1993, 1995, 1999, 2001, 2003, 2007, 2009, 2011, 2013, 2015, 2017, 2019, 2021, 2023, 2025, 2027, 2029, 2031, 2033, 2035, 2037, 2039, 2041, + 2047, 2051, 2059, 2067, 2075, 2079, 2087, 2099, 2115, 2119, 2127, 2135, 2143, 2147, 2151, 2155, 2159, 2163, 2167, 2171, 2175, 2179, 2183, 2191, 2195, + 2203, 2211, 2219, 2239, 2243, 2247, 2251, 2255, 2259, 2263, 2267, 2271, 2275, 2279, 2283, 2287, 2291, 2295, 2303, 2315, 2319, 2323, 2327, 2331, 2335, + 2339, 2343, 2347, 2351, 2355, 2359, 2371, 2375, 2379, 2383, 2387, 2391, 186, 187, 190, 191, 193, 194, 195, 198, 199, 202, 203, 206, 207, 208, 212, 213, + 214, 215, 216, 223, 224, 225, 226, 234, 235, 238, 565, 560, 559, 558, 557, 543, 542, 1140, 1068, 339, 338, 337, 336, 449, 421, 424, 440, 2377, 1662, + 2356, 1171, 2240, 1073, 1193, 1131, 1185, 1149, 2048, 2052, 2281, 2060, 425, 2068, 411, 2076, 2080, 1148, 2088, 2092, 1101, 2100, 535, 1091, 1112, 2193, + 2120, 1100, 2128, 1066, 2136, 1141, 2144, 2148, 2152, 2156, 2160, 2164, 1084, 2172, 2176, 1090, 2184, 1139, 2192, 1098, 2200, 2204, 1106, 2212, 1108, + 1109, 2224, 2228, 1116, 2236, 1120, 2244, 2248, 2252, 2256, 2260, 1132, 2268, 2272, 2276, 2280, 2284, 2288, 1146, 2296, 1150, 2304, 2225, 1114, 1158, + 2320, 1162, 2328, 2332, 1168, 2340, 2344, 1174, 2352, 1178, 1180, 1182, 2368, 1186, 1188, 2380, 2384, 2388, 2392, 1198, 2245, 1202, 1204, 563, 564, + 2265, 2269, 2273, 2277, 1218, 1220, 1434, 389, 2305, 1067, 1230, 1159, 2321, 2341, 1172, 1173, 1175, 2353, 2357, 1184, 312, 1252, 313, 1190, 1191, 1260, + 1192, 2385, 2389, 1130, 317, 1122, 318, 1121, 1278, 2349, 1690, 1176, 1166, 1594, 1581, 1292, 323, 2330, 324, 1300, 325, 328, 326, 1308, 327, 1312, + 1314, 1316, 1362, 1320, 1366, 1324, 331, 423, 332, 1332, 333, 1187, 377, 1340, 1342, 1344, 1346, 1348, 1350, 1352, 1354, 1356, 1358, 1360, 340, 1364, + 341, 1368, 1370, 1372, 1374, 416, 344, 1170, 345, 1092, 346, 1124, 347, 1470, 348, 368, 349, 1194, 350, 374, 360, 2354, 2360, 2372, 1514, 2378, 1418, + 410, 355, 1424, 1426, 1195, 357, 2166, 358, 1436, 359, 2336, 1442, 1444, 361, 2376, 1450, 1452, 430, 432, 595, 586, 1179, 383, 366, 1196, 367, 1472, + 1474, 1123, 1478, 2168, 1618, 2238, 1486, 2264, 2266, 2324, 373, 2334, 1498, 2338, 1502, 1504, 1506, 1508, 1510, 1512, 378, 1516, 1518, 1520, 1522, + 1524, 1526, 1528, 2348 +}; +static const std::vector ROI_VOXELS_11 = { + 1534, 1536, 1538, 1542, 1544, 386, 387, 388, 1556, 1558, 390, 1566, 392, 393, 394, 395, 396, 1588, 397, 398, 399, 1600, 400, 401, 402, 403, 1618, 405, + 1624, 406, 1628, 1630, 1632, 408, 1636, 409, 1640, 1642, 1646, 1648, 412, 413, 1656, 414, 415, 1664, 1666, 1670, 418, 1682, 421, 1690, 423, 1696, 424, + 1700, 425, 1704, 1706, 1710, 1712, 1714, 1718, 1720, 1722, 431, 432, 1732, 433, 1738, 1740, 1746, 437, 438, 439, 440, 441, 442, 1772, 1784, 1786, 1790, + 1792, 1794, 1798, 1800, 1802, 1808, 1810, 1812, 1816, 1818, 1822, 1824, 1826, 1828, 1830, 1832, 1834, 1836, 1838, 1840, 1842, 1844, 1846, 1848, 1850, + 1852, 1854, 1856, 1858, 1860, 465, 1864, 1866, 1868, 1870, 1878, 1880, 1882, 1886, 1890, 1892, 1898, 1900, 1902, 476, 1908, 477, 1912, 29, 1922, 1924, + 483, 1936, 484, 485, 487, 1954, 1964, 1972, 493, 1978, 495, 1984, 1986, 1988, 1994, 1996, 499, 2000, 2002, 2004, 2008, 2010, 2012, 2016, 2018, 2020, + 2022, 2026, 2028, 2030, 2032, 508, 2036, 2038, 2040, 2049, 2061, 2065, 2069, 2077, 2089, 2101, 526, 527, 528, 529, 2129, 2133, 534, 2141, 2145, 537, + 2157, 2169, 543, 2177, 2185, 547, 548, 2201, 551, 2209, 554, 555, 2225, 2229, 2233, 2237, 2241, 561, 2249, 2253, 2257, 2261, 566, 567, 568, 2277, 570, + 2289, 2297, 575, 576, 577, 578, 580, 2325, 2329, 2333, 2337, 585, 586, 587, 588, 589, 2373, 594, 595, 596, 597, 2393, 603, 604, 605, 610, 611, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 658, 659, 660, 661, 662, 663, 664, 665, 671, 672, 673, 674, 675, 677, 682, 683, 690, 691, 692, 695, 702, 703, + 704, 709, 710, 711, 712, 716, 717, 718, 719, 727, 728, 731, 735, 737, 740, 743, 744, 747, 751, 752, 755, 756, 757, 758, 759, 760, 763, 764, 765, 766, + 767, 768, 769, 771, 772, 773, 774, 776, 779, 780, 781, 785, 787, 811, 812, 813, 814, 815, 816, 817, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, + 830, 831, 832, 833, 834, 836, 837, 838, 839, 840, 841, 842, 845, 846, 847, 848, 849, 853, 854, 855, 856, 857, 858, 863, 864, 865, 866, 868, 871, 872, + 873, 875, 876, 884, 885, 886, 891, 892, 893, 897, 898, 899, 900, 901, 904, 905, 906, 907, 908, 911, 912, 913, 914, 915, 918, 919, 920, 921, 922, 923, + 926, 927, 928, 929, 930, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 954, 955, 957, 961, + 962, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1009, 1010, 1011, 1012, 1013, 1014, 1021, 1022, 1023, 1025, 1027, 2058, 2066, + 1035, 1037, 1039, 2090, 1049, 1051, 2118, 2122, 2126, 2134, 1069, 2142, 2146, 2150, 2158, 2162, 1083, 1085, 2178, 2182, 2186, 2194, 1099, 2202, 1103, + 2210, 1107, 1109, 1111, 2230, 2234, 2238, 2242, 1123, 2250, 2254, 2258, 2262, 1133, 1135, 1139, 2282, 2286, 2290, 2294, 2298, 2302, 1155, 1157, 2318, + 2322, 2326, 2330, 2334, 2338, 2342, 2346, 2350, 2354, 2358, 2370, 2374, 2378, 2382, 2386, 1195, 1197, 1199, 1201, 1203, 1205, 1207, 1209, 1211, 75, + 1217, 1219, 1229, 1231, 1241, 1243, 1251, 1253, 1261, 1263, 1277, 1281, 1283, 1291, 1293, 1301, 1303, 1309, 1313, 1315, 1319, 82, 1329, 1331, 1333, + 1337, 1371, 1373, 1375, 1377, 1379, 1381, 1383, 1387, 1389, 1395, 1405, 1407, 1417, 1425, 1427, 1429, 1433, 1435, 1439, 1443, 1445, 1449, 1451, 1453, + 1455, 1461, 1469, 1471, 1473, 1479, 1485, 1491, 1497, 1499, 1503, 1509, 1511, 1515, 1519, 1533, 1535, 1537, 1539, 1541, 1543, 1545, 1547, 1553, 1555, + 97, 1567, 1575, 98, 1587, 1595, 1601, 1611, 1617, 1619, 1623, 1625, 1629, 1631, 1633, 1637, 1639, 1641, 1643, 1647, 1649, 1651, 1655, 1657, 1661, 1665, + 1667, 1669, 1675, 1683, 1689, 1695, 1697, 1699, 1701, 1703, 1705, 1709, 1711, 1713, 1721, 1723, 1729, 1731, 1733, 1739, 1741, 1753, 1761, 1787, 1791, + 1793, 1797, 1799, 1801, 1803, 1807, 1809, 1811, 1815, 1817, 1821, 1823, 1825, 1827, 1829, 1831, 1833, 1835, 1837, 1839, 1841, 1843, 1845, 1847, 1849, + 1851, 1853, 1855, 1857, 1859, 1861, 1865, 1867, 1869, 1871, 1875, 1879, 1881, 1883, 1889, 1891, 1893, 1897, 1899, 1901, 1909, 1911, 1921, 1923, 1925, + 1935, 1937, 1963, 1971, 1977, 1979, 1985, 1987, 1989, 1995, 1997, 2003, 2005, 2011, 2013, 2019, 2025, 2027, 2029, 2031, 2033, 2035, 2037, 2039, 2041, + 2047, 2051, 2059, 2067, 2075, 2079, 2087, 2099, 2127, 2135, 2143, 2147, 2155, 2163, 2171, 2179, 2183, 2191, 2195, 2203, 2211, 2219, 2239, 2243, 2247, + 2251, 2255, 2259, 2263, 2267, 2275, 2279, 2283, 2291, 2295, 2303, 2319, 2323, 2327, 2331, 2335, 2339, 2343, 2347, 2351, 2355, 2359, 2371, 2375, 2379, + 2383, 2387, 2391, 154, 162, 163, 172, 186, 187, 190, 191, 193, 194, 195, 198, 199, 202, 203, 206, 207, 208, 212, 213, 214, 215, 216, 223, 224, 225, 226, + 232, 234, 235, 238, 565, 560, 559, 558, 557, 542, 404, 1026, 2192, 1194, 1658, 333, 18, 325, 1202, 323, 2321, 2305, 1662, 1650, 245, 407, 1498, 391, + 1325, 1092, 1158, 1114, 1149, 279, 2392, 1148, 556, 1141, 1132, 1213, 1131, 1130, 1122, 1121, 1115, 2218, 2200, 2100, 1073, 2078, 2076, 1910, 1762, + 1730, 1024, 1698, 1594, 1034, 1060, 1061, 1586, 1581, 1574, 1091, 2137, 2048, 2052, 494, 2060, 1059, 2068, 1036, 1038, 2080, 290, 2088, 2092, 1048, + 1050, 535, 536, 2149, 2270, 2120, 1102, 2128, 1066, 2136, 1093, 2144, 2148, 1101, 2156, 2193, 2164, 1084, 2172, 2176, 1090, 2184, 1094, 1096, 1098, + 1100, 2204, 1106, 2212, 1108, 1110, 1112, 2228, 1116, 2236, 1120, 2244, 1124, 2252, 2256, 2260, 2264, 2268, 2272, 2276, 1140, 2284, 2288, 1146, 2296, + 1150, 2304, 1154, 1117, 289, 2320, 2324, 2328, 2332, 2336, 2340, 2344, 2348, 2352, 2356, 2360, 1565, 1119, 2372, 2376, 2380, 2384, 2388, 1196, 299, + 1200, 300, 1204, 301, 1208, 1210, 1212, 2245, 1125, 1218, 1220, 563, 564, 2265, 1228, 1230, 1232, 1134, 2269, 2050, 1143, 310, 1244, 1546, 1067, 312, + 1252, 313, 1256, 1163, 1260, 1164, 2341, 2345, 2349, 317, 2353, 318, 2357, 1278, 1160, 1282, 2377, 2381, 2385, 2389, 1292, 1294, 1198, 324, 1300, 1302, + 1206, 326, 1308, 327, 1312, 328, 1316, 1242, 1320, 449, 1324, 331, 1328, 1330, 411, 1334, 422, 1338, 81, 416, 1314, 336, 367, 337, 344, 338, 345, 339, + 2170, 340, 1040, 341, 1068, 1370, 1372, 1374, 1376, 1378, 346, 1382, 1384, 1386, 1388, 347, 1392, 348, 1396, 349, 1434, 350, 1446, 1406, 1126, 2246, + 410, 448, 360, 1418, 507, 355, 1424, 1426, 1694, 357, 417, 358, 1436, 359, 368, 1442, 1444, 361, 496, 1450, 1452, 1454, 475, 466, 2224, 457, 456, 366, + 1638, 1470, 1472, 1474, 280, 1478, 383, 74, 389, 1486, 2138, 1702, 1492, 373, 1496, 374, 1500, 1502, 1504, 2240, 1508, 1510, 2248, 378, 2266, 2390, + 1520, 430, 447, 377, 1674, 332 +}; +static const std::vector ROI_VOXELS_12 = { + 0, 1, 2, 3, 382, 1534, 1536, 1538, 1542, 1544, 386, 387, 388, 1556, 1558, 390, 391, 392, 393, 394, 395, 396, 1588, 397, 398, 399, 1600, 400, 401, 402, + 403, 1618, 405, 1624, 406, 1628, 407, 1632, 408, 1636, 1638, 1640, 1642, 1646, 1648, 412, 413, 414, 415, 1664, 1666, 1670, 1674, 419, 420, 421, 1690, + 1694, 1696, 1698, 1700, 425, 1704, 426, 1708, 427, 1712, 1714, 1716, 429, 1720, 1722, 1724, 431, 432, 1732, 1734, 434, 1740, 1742, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 1780, 445, 1784, 446, 27, 1790, 1792, 1794, 1798, 1800, 1802, 1808, 1810, 453, 1816, 454, 1822, 1824, 1826, 1828, 1830, 1832, + 1834, 1836, 1838, 1840, 1842, 1844, 1846, 1848, 1850, 1852, 1854, 1856, 1858, 1860, 1862, 1864, 1866, 1868, 1870, 1872, 1874, 1876, 1878, 1880, 1882, + 1884, 1886, 1890, 1892, 1894, 474, 1900, 1902, 1904, 476, 1908, 477, 1912, 29, 1922, 1924, 481, 482, 483, 1936, 484, 485, 487, 488, 1956, 1962, 1964, + 491, 492, 1972, 493, 1978, 495, 1984, 1986, 1994, 499, 2000, 501, 2008, 503, 2016, 504, 505, 2026, 2028, 2030, 2032, 508, 2036, 2038, 2040, 2042, 2044, + 2046, 2049, 2053, 2057, 2061, 2065, 2069, 2077, 2081, 522, 2093, 524, 2101, 526, 527, 529, 2129, 2133, 2137, 2141, 2181, 2185, 2189, 548, 2197, 2201, + 2205, 2209, 554, 555, 2225, 2229, 2233, 2237, 2241, 2245, 2249, 563, 564, 2261, 2265, 2269, 2289, 2293, 35, 2301, 2305, 2321, 2325, 2329, 2333, 2337, + 2341, 2345, 2349, 2353, 2357, 2361, 2373, 2377, 2381, 2385, 2389, 2393, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 667, 668, 669, 41, 671, 672, 673, 674, 675, 677, 678, 679, 680, 681, 682, 683, 42, 688, 689, 690, 691, + 692, 699, 700, 701, 43, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 44, 719, 721, 722, 723, 724, 725, 726, 727, 728, 732, + 733, 734, 735, 737, 742, 743, 744, 748, 749, 750, 752, 756, 763, 764, 765, 766, 771, 772, 779, 785, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, + 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 52, 847, 848, 849, 850, + 851, 852, 853, 854, 856, 857, 858, 862, 863, 864, 865, 868, 869, 870, 871, 872, 873, 54, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, + 892, 893, 894, 895, 896, 897, 898, 899, 900, 902, 903, 904, 905, 906, 907, 909, 910, 911, 912, 913, 914, 916, 917, 918, 919, 920, 921, 924, 925, 926, + 927, 928, 931, 934, 936, 938, 939, 943, 945, 946, 947, 951, 952, 957, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, + 1009, 1010, 1011, 1012, 1013, 1014, 1021, 63, 1023, 2050, 2054, 2058, 2062, 2066, 2070, 64, 2078, 2082, 2090, 1047, 1049, 1059, 2122, 2126, 1065, 2134, + 2138, 2142, 2146, 1083, 2178, 2182, 2186, 2190, 2194, 2198, 1101, 1105, 1107, 1109, 1111, 1113, 2234, 2238, 2242, 2246, 2250, 2254, 2258, 2262, 2266, + 2286, 2290, 2294, 2298, 2302, 2306, 1155, 2318, 2322, 2326, 2330, 2334, 2338, 2342, 2346, 2350, 2354, 2358, 2362, 2370, 2374, 2378, 2382, 2386, 2390, + 74, 1199, 1201, 1203, 1205, 1207, 1209, 1211, 1213, 1217, 1219, 1229, 1231, 1239, 1241, 1243, 1251, 1253, 1257, 1259, 1261, 1265, 79, 1281, 1291, 80, + 1295, 1297, 1299, 1301, 1307, 81, 82, 1329, 1337, 1371, 1373, 1375, 1377, 1379, 1381, 1383, 1387, 1389, 1395, 1405, 1407, 1417, 1425, 1433, 1435, 89, + 1441, 1443, 1449, 1451, 1453, 1459, 1463, 1465, 1467, 1469, 1471, 1497, 1499, 1503, 1509, 1511, 1515, 1519, 1533, 1535, 1537, 1539, 1541, 1543, 1545, + 1547, 1553, 1555, 1559, 1561, 97, 1567, 1575, 98, 1587, 1595, 99, 1601, 1613, 1617, 1619, 1623, 1625, 1629, 1631, 1633, 1637, 1639, 102, 1647, 1655, + 1661, 1665, 1669, 1675, 104, 1683, 1689, 1695, 1697, 1699, 1701, 1703, 1705, 1707, 1709, 1711, 1713, 1715, 1717, 1721, 1723, 1725, 1729, 1731, 1733, + 1739, 1741, 1743, 1753, 109, 1761, 1773, 1775, 1781, 1787, 111, 1791, 1793, 1797, 1799, 1801, 1807, 1809, 1815, 1817, 1821, 1823, 1825, 1827, 1829, + 1831, 1833, 1835, 1837, 1839, 1841, 1843, 1845, 1847, 1849, 1851, 1853, 1855, 1857, 1859, 1861, 1863, 1865, 1867, 1869, 1871, 1873, 1875, 1879, 1881, + 1883, 1885, 1887, 1889, 1891, 1893, 1897, 1899, 1901, 1903, 1909, 1911, 119, 1921, 1923, 1925, 120, 1935, 1937, 121, 1951, 1953, 1957, 1963, 1965, 1971, + 1977, 1979, 1985, 2011, 2025, 2029, 2031, 2033, 2035, 2037, 2039, 2041, 2043, 2045, 2047, 2051, 2055, 2059, 2063, 2067, 2071, 2075, 2079, 2087, 2099, + 131, 2115, 2119, 132, 2127, 2135, 133, 2143, 2147, 134, 2179, 2183, 2187, 2191, 2195, 2199, 2203, 2211, 2215, 2219, 2235, 2239, 2243, 2247, 2251, 2255, + 2259, 2263, 141, 2279, 142, 2291, 2295, 2299, 2303, 2307, 2315, 2319, 2323, 2327, 2331, 2335, 2339, 2343, 2347, 2351, 2355, 2359, 2363, 2371, 2375, + 2379, 2383, 2387, 2391, 153, 154, 9, 162, 163, 170, 171, 172, 10, 179, 11, 193, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 234, 235, 236, 237, 238, 239, 242, 2267, 243, 1133, 2218, 2210, 2200, 2100, 2089, 430, 245, + 2076, 1910, 1898, 246, 1762, 1746, 1738, 247, 1730, 1594, 1586, 248, 1581, 1574, 110, 249, 100, 456, 465, 1124, 1277, 1710, 1566, 1565, 1546, 494, 496, + 288, 1386, 1378, 1242, 718, 523, 424, 433, 1035, 1034, 1022, 846, 449, 2048, 2052, 2056, 2060, 1032, 2068, 1036, 259, 2080, 260, 2088, 2092, 1048, 1050, + 423, 422, 416, 1058, 2120, 1434, 2128, 1066, 2136, 1070, 1072, 2148, 2193, 1078, 1092, 270, 1084, 1230, 1106, 2180, 2184, 2188, 2192, 2196, 1100, 2204, + 1104, 2212, 1108, 1099, 2224, 2228, 1116, 2236, 2240, 2244, 2248, 2252, 2256, 2260, 2264, 1098, 2272, 1090, 1140, 1073, 1068, 2292, 2296, 2300, 2304, + 2308, 1067, 289, 2320, 2324, 2328, 2332, 2336, 2340, 2344, 2348, 2352, 2356, 2360, 258, 2368, 2372, 2376, 2380, 2384, 2388, 2392, 299, 1200, 1202, 1204, + 1206, 1208, 1210, 1212, 507, 1061, 1218, 1220, 1063, 535, 1071, 1228, 307, 268, 308, 1060, 1238, 1240, 310, 269, 2202, 1091, 1250, 1252, 547, 1095, + 1258, 1260, 556, 1264, 1114, 279, 317, 280, 318, 1123, 1278, 2253, 320, 2257, 1132, 1288, 1290, 1292, 1064, 2283, 8, 1300, 143, 1304, 2297, 1308, 144, + 1312, 1314, 290, 585, 298, 1194, 1195, 331, 1328, 1330, 1196, 333, 1197, 1338, 20, 1198, 300, 301, 90, 18, 1706, 75, 1702, 309, 1112, 1119, 1120, 70, + 40, 1370, 1372, 1374, 1376, 344, 287, 345, 1384, 346, 1388, 347, 1392, 1154, 1396, 1163, 1164, 332, 21, 1406, 463, 670, 297, 475, 466, 1418, 457, 355, + 1424, 1426, 1382, 357, 448, 358, 1436, 702, 1440, 1442, 1444, 122, 1682, 1450, 1452, 62, 53, 51, 50, 1462, 1464, 1466, 1718, 1470, 1786, 1474, 2022, + 383, 385, 389, 417, 411, 410, 101, 409, 418, 1496, 404, 428, 1502, 384, 435, 1508, 1510, 447, 455, 28, 464, 1520, 473, 1630, 1954, 490, 506 +}; +static const std::vector ROI_VOXELS_13 = { + 509, 31, 511, 512, 513, 1028, 1029, 1030, 1031, 520, 1041, 521, 1043, 1044, 261, 1048, 1049, 32, 65, 1052, 1053, 1054, 1055, 1058, 1059, 1060, 1061, + 1062, 2125, 1064, 1065, 1066, 1067, 534, 1069, 1070, 1071, 1072, 1073, 537, 1075, 538, 1078, 1079, 540, 1081, 33, 1083, 1084, 1085, 544, 1089, 1090, + 1091, 1092, 1093, 1094, 1095, 1096, 549, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1108, 1109, 1110, 1113, 34, 1115, 1116, 1117, 280, 1122, 1123, + 1124, 1125, 1126, 1130, 1131, 1132, 1133, 1134, 1135, 1138, 1140, 1142, 1143, 1144, 1145, 1147, 1149, 1150, 1156, 289, 579, 1159, 290, 1162, 1165, 1166, + 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, + 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 300, 1202, 1203, 1204, 1205, 18, 37, 1211, 1212, 1213, 1217, 1218, 610, 305, 611, 612, 306, 613, + 614, 1229, 615, 1231, 616, 617, 618, 1237, 1238, 1239, 1240, 310, 621, 622, 1245, 1246, 1247, 624, 1250, 1251, 626, 1253, 627, 1255, 1256, 1257, 1258, + 1259, 630, 1261, 631, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 635, 1271, 1272, 1273, 39, 638, 319, 639, 1279, 640, 1281, 1282, 1283, 1284, 321, 322, + 1291, 1292, 1293, 1294, 648, 649, 1300, 1301, 1302, 1303, 81, 1308, 1309, 1310, 1311, 1313, 1315, 658, 1319, 1320, 661, 1323, 662, 1325, 663, 1331, + 1332, 334, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, + 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 686, 1373, 1374, 1375, 1379, 172, 1381, 1382, 692, 86, 694, 1389, 696, 174, 87, 702, 351, + 703, 704, 352, 705, 176, 709, 88, 177, 711, 712, 1426, 1428, 1429, 716, 1433, 717, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1444, 1445, 1446, 724, + 1452, 1453, 1454, 1455, 728, 729, 182, 1461, 731, 732, 22, 733, 91, 183, 735, 1471, 736, 1474, 1476, 1477, 740, 1482, 92, 185, 743, 744, 1489, 1490, + 1491, 747, 748, 749, 1499, 750, 752, 1505, 1506, 1507, 1508, 1509, 755, 1512, 1513, 1514, 94, 1516, 1517, 1518, 1519, 1521, 1522, 1523, 1524, 1525, + 1526, 1527, 1528, 382, 1530, 1531, 1532, 383, 1534, 1535, 1536, 384, 1539, 385, 386, 96, 387, 775, 388, 778, 389, 390, 782, 391, 783, 392, 786, 393, + 2124, 788, 394, 789, 790, 395, 791, 396, 793, 794, 397, 795, 796, 24, 797, 798, 399, 799, 800, 400, 801, 802, 401, 803, 804, 402, 805, 806, 403, 807, + 1616, 404, 809, 810, 405, 1622, 1624, 406, 813, 407, 815, 1631, 1632, 1633, 817, 818, 409, 819, 1640, 410, 1642, 822, 411, 823, 824, 412, 825, 826, 827, + 828, 103, 830, 831, 1663, 1664, 1665, 1666, 417, 2316, 1671, 1672, 1673, 1674, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1684, 1685, 1686, 1687, 1688, + 1689, 845, 1691, 1692, 1693, 847, 1695, 848, 1697, 849, 425, 1702, 1703, 1704, 1705, 853, 1711, 856, 857, 859, 860, 26, 861, 1662, 1656, 863, 1650, 864, + 1649, 865, 1641, 1504, 1498, 867, 1486, 1324, 1158, 869, 1157, 870, 1316, 871, 1121, 872, 456, 873, 1298, 1289, 1276, 1088, 1074, 1280, 1082, 877, 1080, + 878, 1076, 541, 525, 880, 510, 881, 311, 882, 302, 883, 181, 884, 180, 885, 175, 886, 173, 93, 85, 84, 83, 1778, 1779, 36, 30, 891, 19, 892, 1785, 893, + 1270, 894, 447, 895, 458, 1792, 1793, 1794, 251, 898, 450, 899, 262, 900, 1801, 1802, 112, 902, 451, 903, 250, 904, 135, 1810, 514, 906, 66, 907, 12, + 908, 1817, 909, 113, 536, 303, 911, 293, 1824, 1825, 913, 1827, 914, 457, 915, 283, 916, 1833, 1834, 1835, 1836, 459, 919, 1262, 920, 1841, 1842, 1843, + 922, 1254, 923, 753, 1848, 1849, 1850, 745, 926, 738, 927, 720, 928, 1857, 929, 552, 930, 465, 931, 531, 530, 466, 1866, 515, 934, 314, 1434, 1260, + 1252, 1241, 937, 1230, 1098, 1068, 918, 912, 905, 1881, 897, 718, 727, 719, 943, 710, 944, 691, 690, 683, 682, 672, 671, 741, 985, 95, 623, 178, 811, + 475, 917, 1220, 1533, 476, 953, 448, 954, 477, 301, 299, 279, 29, 245, 232, 163, 162, 959, 154, 960, 82, 75, 74, 1868, 1712, 1698, 1696, 1694, 1547, + 965, 1541, 966, 483, 967, 1372, 968, 484, 969, 676, 970, 485, 971, 526, 972, 840, 973, 839, 974, 812, 975, 675, 976, 651, 977, 650, 978, 647, 979, 636, + 980, 666, 981, 1826, 982, 641, 983, 841, 984, 832, 1970, 816, 986, 493, 987, 629, 988, 494, 989, 628, 990, 495, 991, 619, 992, 496, 993, 1529, 994, 896, + 995, 398, 996, 901, 997, 1042, 998, 529, 999, 1828, 1000, 500, 1001, 539, 1002, 924, 1003, 925, 335, 1854, 1005, 2011, 1006, 550, 1007, 808, 1008, 921, + 842, 737, 527, 569, 2369, 1994, 833, 2025, 2026, 38, 723, 507, 1468, 184, 2032, 508, 742, 1484, 620 +}; +static const std::vector ROI_VOXELS_14 = { + 1530, 23, 1534, 1536, 386, 1550, 1552, 1554, 1558, 1560, 1562, 1564, 391, 1570, 1572, 393, 1578, 395, 396, 397, 398, 399, 400, 401, 402, 403, 1616, + 1618, 1622, 1624, 406, 1628, 1630, 1632, 1636, 1638, 1640, 1642, 1646, 1648, 412, 1654, 1660, 1664, 1666, 1668, 1670, 1672, 1674, 1676, 1678, 1680, + 1682, 1684, 1686, 1688, 1690, 1692, 1694, 1696, 1698, 425, 1704, 1706, 1708, 1712, 1714, 1716, 1722, 1724, 1726, 1728, 1732, 1734, 1740, 1742, 1750, + 1756, 1764, 1770, 1778, 1784, 1786, 27, 1790, 1792, 1794, 1798, 1800, 1802, 1806, 1808, 1810, 1814, 1816, 454, 1820, 1822, 1824, 1826, 1828, 1830, 1832, + 1834, 1836, 1838, 1840, 1842, 1844, 1846, 1848, 462, 1852, 1854, 1858, 1860, 1862, 1866, 1868, 1870, 1872, 1874, 1876, 469, 1882, 1884, 1892, 1894, 474, + 1900, 1902, 1904, 1916, 479, 481, 1928, 482, 1940, 1950, 1954, 490, 1964, 491, 492, 1972, 1978, 1984, 1986, 1988, 1990, 1992, 1994, 1998, 2000, 2002, + 2004, 2006, 2008, 2010, 2012, 2014, 2016, 2018, 2020, 2022, 2024, 2026, 2028, 2030, 2032, 2034, 2036, 2038, 2040, 2042, 2044, 2046, 2049, 2053, 2057, + 2061, 2069, 2081, 522, 523, 524, 528, 2117, 2125, 2129, 2133, 2137, 2141, 2145, 2149, 2153, 2157, 2161, 2165, 2169, 2173, 2177, 2181, 2185, 2189, 2193, + 2197, 2205, 554, 555, 2225, 2229, 2233, 2237, 2241, 2245, 2249, 2253, 2257, 2261, 2265, 2269, 2273, 569, 2281, 2285, 2289, 2293, 2297, 2301, 2305, 579, + 2321, 2325, 2329, 2333, 2337, 2341, 2345, 2349, 2353, 2357, 2361, 2369, 2373, 2377, 2381, 2385, 2389, 2393, 610, 611, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 626, 627, 628, 629, 630, 631, 635, 636, 638, 639, 640, 641, 647, 648, 649, 650, 651, 40, 661, 662, 663, 41, 675, 680, 681, 42, 688, 689, + 695, 699, 700, 701, 43, 706, 707, 708, 711, 713, 714, 715, 717, 44, 722, 725, 726, 734, 743, 751, 756, 757, 758, 759, 760, 763, 764, 765, 766, 767, 768, + 770, 771, 772, 773, 774, 775, 777, 778, 779, 780, 782, 783, 784, 785, 786, 788, 789, 790, 791, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, + 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 50, 815, 816, 817, 822, 823, 824, 825, 826, 827, 828, 830, 831, 832, 833, 839, 840, 841, 842, 52, 847, + 848, 849, 852, 855, 856, 857, 53, 863, 864, 866, 871, 872, 873, 875, 876, 54, 887, 888, 889, 890, 891, 892, 55, 897, 904, 905, 910, 911, 912, 918, 919, + 926, 932, 933, 935, 936, 938, 939, 940, 941, 942, 945, 946, 947, 949, 950, 951, 952, 954, 957, 959, 960, 963, 964, 965, 966, 967, 968, 969, 970, 971, + 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, + 1002, 1003, 1005, 1006, 1017, 1018, 1019, 1020, 3, 63, 2050, 2054, 2062, 1033, 2070, 64, 1039, 2082, 1045, 1047, 1049, 1051, 65, 1057, 1059, 2122, 2126, + 2134, 2138, 2142, 2146, 2150, 2154, 2158, 2162, 2166, 2170, 2174, 2178, 2182, 2186, 2190, 2194, 2198, 2202, 1107, 1111, 1115, 2234, 2238, 2242, 2246, + 2250, 2254, 2258, 2262, 2266, 2270, 2274, 2278, 2282, 2286, 2290, 2294, 2298, 2302, 2306, 1155, 2318, 2322, 2326, 2330, 2334, 2338, 2342, 2346, 2350, + 2354, 2358, 2362, 1183, 2370, 2374, 2378, 2382, 2386, 2390, 1197, 1199, 1203, 1205, 1211, 1213, 1215, 1217, 1225, 1227, 1229, 1231, 1235, 1241, 1249, + 1251, 1253, 1255, 78, 1269, 1271, 1273, 79, 1279, 80, 1311, 1315, 1319, 1329, 1335, 1337, 1339, 1341, 1343, 1345, 1347, 1349, 1351, 1353, 1355, 1357, + 1359, 1361, 1363, 1365, 1367, 1369, 1371, 1373, 1375, 1379, 1381, 1385, 1389, 1391, 1393, 1401, 1403, 1411, 1413, 1415, 1427, 1433, 89, 90, 1469, 1471, + 1495, 1497, 1499, 1501, 1503, 1505, 1507, 1509, 1511, 1513, 1515, 1517, 1519, 1521, 1523, 1525, 1527, 1529, 1531, 1533, 1535, 1539, 1541, 1547, 1551, + 1559, 1561, 1563, 1569, 1571, 1573, 1583, 1597, 1603, 1609, 1617, 1619, 1623, 1625, 1629, 1631, 1633, 1637, 1639, 102, 1647, 1655, 1659, 1661, 1663, + 1665, 1669, 1671, 1673, 1675, 1677, 1679, 1681, 1683, 1685, 1687, 1689, 1691, 1693, 1695, 1697, 1703, 1705, 1707, 106, 1711, 1713, 1715, 1717, 1719, + 1723, 1725, 1727, 1733, 1741, 1743, 1749, 1757, 110, 1779, 1785, 1787, 111, 1791, 1793, 1797, 1799, 1801, 112, 1807, 1809, 1813, 1815, 1817, 1819, 1821, + 1823, 1825, 1827, 1829, 1831, 1833, 1835, 1837, 1839, 1841, 1843, 1845, 1847, 1849, 1851, 1853, 1855, 1857, 1859, 1861, 1863, 1867, 1869, 1871, 1873, + 1877, 1881, 1883, 1885, 1887, 1893, 1901, 1903, 1915, 119, 1929, 120, 1941, 1949, 1963, 122, 1971, 1977, 1979, 123, 1985, 1987, 1991, 1993, 1995, 124, + 1999, 2001, 2003, 2007, 2009, 2011, 125, 2015, 2017, 2019, 2021, 2023, 2025, 2027, 2029, 2031, 2033, 2035, 2037, 2039, 2041, 2043, 2045, 2051, 2055, + 2063, 2071, 2079, 131, 2111, 2123, 2127, 2135, 133, 2143, 2147, 2151, 2155, 2159, 2163, 2167, 2171, 2175, 2179, 2183, 2187, 2191, 2195, 2199, 2203, + 2215, 2239, 2243, 2247, 2251, 2255, 2259, 2263, 2267, 2271, 2275, 2279, 2283, 2287, 2291, 2295, 2299, 2303, 2307, 144, 2319, 2323, 2327, 2331, 2335, + 2339, 2343, 2347, 2351, 2355, 2359, 2363, 2371, 2375, 2379, 2383, 2387, 2391, 153, 157, 9, 164, 165, 166, 170, 171, 10, 179, 11, 193, 12, 222, 13, 575, + 565, 560, 559, 558, 557, 551, 543, 542, 1179, 348, 339, 338, 337, 336, 1193, 1191, 297, 233, 1186, 313, 35, 1168, 410, 1131, 1130, 1122, 1121, 459, 458, + 236, 451, 450, 1181, 237, 261, 121, 142, 135, 113, 103, 66, 460, 145, 70, 1120, 1040, 1038, 1037, 1027, 1026, 1025, 1024, 1437, 1270, 585, 1162, 1153, + 273, 272, 146, 76, 1434, 1261, 1161, 287, 1230, 1106, 1099, 1098, 246, 1090, 1073, 1068, 247, 1067, 1052, 718, 248, 270, 269, 268, 249, 556, 1177, 143, + 250, 141, 134, 132, 251, 109, 104, 101, 252, 62, 51, 21, 253, 20, 8, 2, 1, 1702, 0, 1167, 1169, 2048, 2052, 2056, 2060, 1196, 2068, 1170, 259, 2080, + 260, 1046, 2092, 2013, 262, 2104, 263, 1056, 264, 2120, 1062, 2128, 1066, 2136, 1194, 2144, 2148, 2152, 2156, 2160, 2164, 2168, 2172, 2176, 2180, 2184, + 2188, 2192, 2196, 265, 2204, 1063, 2212, 535, 67, 1112, 2228, 136, 2236, 2240, 2244, 2248, 2252, 2256, 2260, 2264, 2268, 2272, 2276, 2280, 2284, 2288, + 2292, 2296, 2300, 2304, 288, 547, 2316, 2320, 2324, 2328, 2332, 2336, 2340, 2344, 2348, 2352, 2356, 2360, 1182, 1184, 2372, 2376, 2380, 2384, 298, 2392, + 1198, 1200, 1202, 1204, 548, 68, 409, 1212, 1214, 1216, 1218, 1220, 1114, 1224, 1226, 1119, 307, 1232, 308, 1236, 309, 563, 564, 1244, 2277, 1248, 312, + 1252, 1254, 1154, 1159, 1260, 1262, 1163, 1164, 1268, 317, 1272, 318, 1171, 1172, 1173, 320, 1284, 1174, 1175, 1176, 1185, 323, 148, 324, 1190, 325, + 1192, 326, 1180, 1310, 1312, 1314, 1316, 1195, 1320, 417, 411, 331, 1328, 332, 1332, 333, 1336, 1338, 1340, 1342, 1344, 1346, 1348, 1350, 1352, 1354, + 1356, 1358, 1360, 1362, 1364, 1366, 1368, 1370, 1372, 1374, 404, 344, 390, 1382, 388, 346, 505, 347, 407, 1394, 1178, 349, 1400, 1402, 1404, 1187, 1330, + 1410, 1412, 1414, 1416, 1188, 1420, 355, 1189, 1166, 345, 357, 1165, 358, 463, 1438, 115, 452, 258, 2093, 470, 1970, 473, 503, 405, 455, 461, 28, 1850, + 464, 1468, 1470, 2308, 1474, 504, 506, 1532, 383, 387, 389, 392, 2124, 394, 1590, 1496, 2224, 2388, 1502, 114, 1506, 1508, 1510, 1512, 1514, 1516, 1518, + 1520, 1522, 1524, 1526, 1528, 126 +}; +static const std::vector ROI_VOXELS_15 = { + 1530, 1532, 383, 1536, 1538, 1542, 1544, 386, 387, 388, 1558, 390, 391, 392, 393, 394, 1580, 395, 1584, 396, 1588, 397, 1592, 398, 1598, 1600, 400, + 1604, 401, 402, 403, 1618, 405, 1624, 406, 1628, 1630, 1632, 408, 1636, 1638, 1640, 1642, 1646, 1648, 412, 1654, 1656, 414, 1660, 415, 1664, 1666, 1668, + 1670, 1672, 418, 1676, 1678, 1680, 420, 1684, 1686, 1688, 1690, 1692, 1694, 1696, 1698, 1700, 425, 1704, 1706, 1708, 427, 1712, 1714, 1716, 1718, 1722, + 1724, 431, 432, 1732, 1734, 1736, 434, 1740, 1742, 1744, 436, 437, 1752, 438, 1758, 1760, 440, 441, 442, 443, 444, 445, 1784, 1786, 1790, 1792, 1794, + 1798, 1800, 1802, 1806, 1808, 1810, 1812, 1814, 1816, 1818, 1820, 1822, 1824, 1826, 1828, 1830, 1832, 1834, 1836, 1838, 1840, 1842, 1844, 1846, 1848, + 1850, 1852, 1854, 1856, 1858, 1860, 1862, 1864, 1866, 1868, 1870, 1872, 1874, 1876, 1882, 1884, 1886, 1888, 1890, 1892, 1894, 1896, 1898, 1900, 1902, + 1904, 1906, 1908, 1910, 1912, 1918, 1920, 1922, 1924, 1930, 1932, 1936, 1942, 487, 488, 1964, 1972, 1978, 1984, 1986, 1990, 1992, 1994, 1996, 1998, + 2000, 2006, 2008, 2014, 2016, 2022, 2024, 2026, 2028, 2030, 2032, 2034, 2036, 2038, 2040, 2042, 2044, 2046, 2049, 2053, 2057, 2061, 2065, 2069, 2073, + 2077, 2081, 2085, 2089, 2093, 2097, 2101, 526, 527, 529, 2129, 2133, 2137, 2141, 536, 537, 2153, 2161, 2165, 2173, 2181, 2185, 2189, 2193, 2197, 2201, + 2205, 2209, 2217, 2225, 2229, 2233, 2237, 2241, 2245, 2249, 2253, 2257, 2261, 2265, 2269, 2273, 569, 2281, 2285, 2289, 2293, 2297, 2301, 2305, 579, + 2321, 2325, 2329, 2333, 2337, 2341, 2345, 2349, 2353, 2357, 2361, 2373, 2377, 2381, 2385, 2389, 2393, 610, 611, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 659, 660, 661, 662, 663, 664, 665, 667, 668, 669, 670, 673, 674, 675, 677, 678, 679, 697, 712, 721, 728, 731, 737, 740, 744, + 747, 752, 755, 769, 770, 775, 776, 777, 778, 781, 782, 783, 784, 786, 788, 789, 790, 791, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, + 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, + 839, 840, 841, 842, 843, 844, 846, 847, 848, 849, 850, 851, 854, 856, 857, 858, 862, 868, 893, 898, 899, 900, 901, 906, 907, 908, 913, 914, 915, 920, + 921, 922, 923, 927, 928, 929, 930, 934, 937, 943, 944, 955, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, + 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, + 1006, 1011, 1012, 1023, 2050, 2054, 2058, 2062, 2066, 2070, 2074, 2078, 2082, 2086, 2090, 2098, 2106, 2122, 2126, 2134, 2138, 2142, 2146, 2154, 2166, + 2174, 2178, 2182, 2186, 2190, 2194, 2198, 2202, 2206, 2210, 1107, 1109, 2222, 2234, 2238, 2242, 2246, 2250, 2254, 2258, 2262, 2266, 1135, 2274, 2278, + 2286, 2290, 2294, 2298, 2302, 2306, 1155, 1157, 2318, 2322, 2326, 2330, 2334, 2338, 2342, 2346, 2350, 2354, 2358, 2362, 1183, 2370, 2374, 2378, 2382, + 2386, 2390, 1197, 1199, 1201, 1203, 1205, 1207, 1211, 1213, 1217, 1263, 1277, 1281, 1283, 1285, 1291, 1293, 1301, 1303, 1309, 1313, 1325, 1329, 1331, + 1333, 1335, 1337, 1339, 1341, 1343, 1345, 1347, 1349, 1351, 1353, 1355, 1357, 1359, 1361, 1363, 1365, 1367, 1369, 1371, 1373, 1375, 1377, 1379, 1381, + 1383, 1389, 1417, 1421, 1423, 1425, 1429, 1431, 1435, 1439, 1443, 1445, 1447, 1449, 1451, 1453, 1455, 1457, 1461, 1469, 1471, 1491, 1495, 1497, 1499, + 1501, 1503, 1505, 1507, 1509, 1511, 1513, 1515, 1517, 1519, 1521, 1523, 1525, 1527, 1529, 1531, 1533, 1535, 1537, 1539, 1541, 1543, 1547, 1553, 1559, + 1561, 97, 1575, 1579, 98, 1585, 1587, 1591, 1593, 1595, 99, 1599, 1601, 1605, 100, 1617, 1619, 1623, 1625, 1629, 1631, 1633, 1637, 1639, 1641, 1643, + 1647, 1649, 1651, 1655, 1657, 1659, 1661, 1663, 1665, 1667, 1669, 1671, 1673, 1675, 1677, 1679, 1681, 1683, 1685, 1687, 1689, 1691, 1693, 1695, 1697, + 1699, 1701, 1703, 1705, 1707, 1709, 1711, 1713, 1715, 1717, 1723, 1725, 1729, 1731, 1733, 1735, 1737, 1739, 1741, 1743, 1745, 1751, 1753, 1759, 1761, + 1765, 1787, 1791, 1793, 1797, 1799, 1801, 1803, 1807, 1809, 1811, 1813, 1815, 1817, 1819, 1821, 1823, 1825, 1827, 1829, 1831, 1833, 1835, 1837, 1839, + 1841, 1843, 1845, 1847, 1849, 1851, 1853, 1855, 1857, 1859, 1861, 1863, 1865, 1867, 1869, 1871, 1873, 1875, 1879, 1881, 1883, 1885, 1887, 1889, 1891, + 1893, 1895, 1897, 1899, 1901, 1903, 1905, 1907, 1909, 1911, 1917, 1919, 1921, 1923, 1925, 1931, 1933, 1935, 1937, 1963, 1971, 1977, 1979, 1985, 1989, + 1991, 1993, 1997, 1999, 2001, 2005, 2007, 2009, 2011, 2015, 2017, 2021, 2023, 2025, 2029, 2031, 2033, 2035, 2037, 2039, 2041, 2043, 2045, 2047, 2051, + 2055, 2059, 2063, 2067, 2071, 2075, 2079, 2083, 2087, 2095, 2099, 2107, 2127, 2135, 2143, 2147, 2151, 2159, 2167, 2175, 2179, 2183, 2187, 2191, 2195, + 2199, 2203, 2207, 2211, 2215, 2219, 2239, 2243, 2247, 2251, 2255, 2259, 2263, 2267, 2271, 2279, 2283, 2287, 2291, 2295, 2299, 2303, 2307, 2319, 2323, + 2327, 2331, 2335, 2339, 2343, 2347, 2351, 2355, 2359, 2363, 2371, 2375, 2379, 2383, 2387, 2391, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 223, 224, 225, 226, 227, 228, 229, 230, 234, 235, 238, 239, 242, 243, 1662, 1650, 389, 446, 407, 1175, 424, 1150, 1149, 2218, 2200, + 1738, 1746, 1762, 2048, 2052, 2056, 2060, 2064, 2068, 2072, 2076, 2080, 2084, 2088, 2092, 2096, 2100, 1730, 2108, 1594, 1586, 2120, 1581, 2128, 1574, + 2136, 1177, 1178, 2148, 2152, 1188, 2160, 1682, 2168, 1125, 499, 2180, 1092, 1094, 2192, 2196, 1100, 2204, 2208, 2212, 1108, 1110, 2224, 2228, 1116, + 2236, 2240, 2244, 2248, 2252, 2256, 2260, 2264, 1134, 2272, 449, 2280, 439, 433, 2292, 2296, 2300, 2304, 2308, 430, 1158, 2320, 2324, 2328, 2332, 2336, + 2340, 2344, 2348, 2352, 2356, 2360, 1182, 1184, 2372, 2376, 2380, 2384, 2388, 2392, 1198, 1200, 1202, 1204, 1206, 423, 422, 1212, 421, 416, 1218, 1220, + 1658, 1954, 428, 1228, 1185, 1160, 1702, 1534, 1186, 1032, 410, 2184, 2109, 1194, 409, 534, 1164, 1256, 1093, 1101, 1102, 1103, 1111, 1112, 1114, 1117, + 1119, 1120, 1278, 1126, 1282, 1124, 1286, 1143, 1153, 1292, 1294, 1154, 1162, 1300, 1302, 1159, 1161, 1308, 1163, 1312, 1314, 1171, 1172, 1173, 1174, + 1324, 1176, 1328, 1330, 1332, 1334, 1336, 1338, 1340, 1342, 1344, 1346, 1348, 1350, 1352, 1354, 1356, 1358, 1360, 1362, 1364, 1366, 1368, 1370, 1372, + 1374, 1376, 1190, 1191, 1382, 1384, 1192, 1193, 404, 1392, 417, 411, 1196, 1195, 1133, 1140, 1132, 1123, 1091, 1084, 1083, 1674, 1418, 1189, 1422, 1424, + 1426, 1187, 1430, 1432, 1181, 1436, 1180, 1179, 1442, 1444, 1446, 1448, 1450, 1452, 1454, 1456, 1458, 1170, 1169, 1168, 1167, 1166, 1470, 1165, 1474, + 419, 435, 453, 399, 2188, 1486, 413, 426, 1492, 429, 1496, 1498, 1500, 1502, 1504, 1506, 1508, 1510, 1512, 1514, 1516, 1518, 1520, 1522, 1524, 1526, + 1528, 501 +}; +static const std::vector ROI_VOXELS_16 = { + 2036, 2037, 1019, 2039, 1020, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2049, 2051, 2053, 2055, 2057, 2059, 2061, 2063, 1033, 2067, 2069, 2071, 2073, + 2075, 2077, 2079, 2081, 2083, 2085, 2087, 1045, 1046, 2093, 2095, 2097, 2099, 2101, 526, 2107, 2109, 1056, 1057, 2115, 1059, 2119, 2121, 2127, 2129, + 1066, 2133, 2135, 2137, 1070, 2141, 536, 1073, 2147, 1075, 1076, 1078, 1080, 1081, 1082, 1083, 1084, 1085, 1089, 2179, 2181, 2183, 1093, 1094, 1095, + 1096, 2193, 2195, 2197, 2199, 1101, 1102, 2205, 2207, 1105, 1106, 1107, 2215, 2217, 1110, 1111, 2223, 2225, 1114, 2229, 2231, 1117, 1118, 1119, 2239, + 2241, 2243, 2245, 2247, 1125, 1126, 1127, 1128, 2257, 2259, 2261, 2263, 2265, 1134, 1135, 1136, 1137, 2279, 2283, 1143, 2289, 2291, 2293, 2295, 2297, + 2299, 2301, 2303, 2305, 2307, 2315, 2319, 2321, 2323, 2325, 2327, 2329, 2331, 2333, 2335, 2337, 2339, 2341, 2343, 2345, 2347, 2349, 2351, 2353, 2355, + 2357, 2359, 2361, 2363, 2371, 2373, 2375, 2377, 2379, 2381, 2383, 2385, 2387, 2389, 2391, 2393, 1214, 1215, 1216, 1227, 1229, 1230, 1231, 1238, 1239, + 1240, 1241, 1248, 1249, 1250, 1251, 1252, 1253, 1256, 1257, 1258, 1259, 1260, 1261, 1263, 1264, 1265, 1277, 1278, 1280, 1281, 1282, 1283, 1285, 1286, + 1291, 1292, 1293, 1294, 1300, 1301, 1302, 1303, 1307, 1308, 1309, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1326, 1333, 1334, + 1385, 1393, 1394, 1403, 1404, 1131, 1130, 705, 1122, 1121, 1413, 1414, 1415, 1416, 1417, 1418, 1115, 954, 1421, 1422, 1423, 712, 1425, 1426, 2219, 1160, + 1429, 1430, 1431, 1432, 1433, 717, 1435, 1436, 2211, 2210, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 723, 1447, 724, 1449, 1450, 1451, 1452, 1453, 1454, + 1455, 1456, 1457, 1458, 2209, 1460, 1461, 731, 2201, 732, 2200, 733, 1467, 2100, 1469, 1470, 1471, 1575, 2089, 1474, 1475, 1581, 1586, 1812, 1108, 740, + 2065, 1658, 1483, 742, 2203, 743, 1487, 744, 2212, 1624, 1664, 1492, 1493, 747, 1924, 748, 1666, 749, 1499, 750, 1922, 1502, 1682, 752, 1834, 1848, + 1910, 1508, 1509, 1510, 1511, 1069, 1103, 2187, 2390, 1448, 527, 529, 1519, 1520, 728, 761, 900, 1762, 912, 1067, 1746, 1434, 1738, 1151, 1614, 1626, + 1601, 1500, 1657, 2048, 2050, 2052, 2054, 2056, 2058, 2060, 2062, 2064, 2066, 2068, 2070, 2072, 2074, 2076, 2078, 2080, 2082, 1554, 2086, 2088, 2090, + 1558, 1559, 2096, 1561, 1562, 1563, 1564, 2106, 2108, 1071, 1424, 2252, 1072, 1571, 2120, 2122, 1574, 2126, 2128, 2130, 916, 2134, 1580, 2138, 1818, + 2142, 1584, 2146, 2148, 1587, 1588, 1116, 2326, 1591, 1592, 1593, 1594, 1595, 769, 1643, 1598, 1599, 1600, 2178, 2180, 2182, 1604, 1605, 2188, 1607, + 2192, 2194, 2196, 2198, 1612, 1613, 2204, 2206, 2208, 1617, 1618, 1619, 1620, 2218, 1665, 2222, 2224, 1625, 2228, 1674, 2232, 2234, 2236, 2238, 2240, + 2242, 2244, 2246, 1636, 1637, 1638, 1639, 2256, 2258, 2260, 2262, 2264, 2266, 1646, 1850, 1648, 781, 776, 1651, 1652, 2139, 2269, 2286, 2098, 2290, + 2292, 2294, 2296, 2298, 2300, 2302, 2304, 2306, 2308, 1667, 2251, 1669, 1573, 2318, 2320, 2322, 2324, 1675, 2328, 2330, 2332, 2334, 2336, 2338, 2340, + 2342, 2344, 2346, 2348, 2350, 2352, 2354, 2356, 2358, 2360, 2362, 1630, 1690, 2368, 2370, 2372, 2374, 2376, 2378, 2380, 2382, 2384, 2386, 2388, 1707, + 2392, 2190, 1804, 1123, 1788, 1713, 1714, 1715, 1716, 1717, 1782, 1719, 871, 1644, 1722, 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, + 1733, 1734, 1735, 1736, 1737, 869, 1739, 870, 1741, 1742, 1743, 1744, 1745, 873, 1099, 1098, 1090, 1068, 1751, 1752, 1753, 1049, 926, 919, 918, 1758, + 1759, 1760, 1761, 881, 911, 882, 1765, 883, 905, 904, 897, 892, 1140, 872, 1773, 1774, 1775, 1776, 864, 863, 718, 711, 1781, 891, 1133, 1784, 1132, + 1786, 1787, 894, 1124, 1790, 1791, 896, 1793, 1794, 1795, 898, 1797, 1798, 1799, 1800, 1801, 901, 1803, 902, 1109, 903, 1807, 1808, 1809, 1810, 1811, + 906, 1100, 907, 1815, 908, 1817, 909, 1092, 1091, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 915, 1831, 1832, 1833, 917, 1835, 1836, 1837, + 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 924, 1849, 925, 1851, 1852, 1853, 1854, 1855, 928, 737, 929, 1859, 930, 1861, 1862, 1863, + 920, 927, 921, 1867, 934, 1869, 1870, 1871, 1872, 1873, 1874, 914, 1876, 1877, 913, 1879, 899, 893, 1882, 1883, 1884, 1885, 943, 1887, 1888, 1889, 1890, + 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 955, 1911, 1912, 1802, 1792, 1689, + 958, 1917, 1918, 1919, 1920, 1921, 961, 1923, 962, 1925, 1642, 1640, 1633, 1632, 1930, 1931, 1932, 1933, 1631, 1935, 1936, 1937, 2202, 2191, 2186, 2185, + 1942, 2184, 2092, 1945, 2040, 2038, 880, 1860, 1858, 1740, 1706, 2189, 1954, 1955, 1956, 1957, 1958, 1959, 2143, 1446, 1708, 1963, 1964, 1965, 1966, + 1967, 2267, 2272, 895, 1971, 1972, 1973, 1974, 2249, 2084, 1977, 1978, 1979, 1980, 1981, 1058, 1572, 1984, 1985, 1986, 1830, 1064, 1989, 1065, 534, + 2255, 1579, 1994, 2136, 1996, 1997, 537, 1585, 2000, 2254, 922, 2253, 923, 2005, 2237, 1623, 2008, 2233, 931, 2011, 2248, 1104, 937, 1112, 2016, 1113, + 1628, 1629, 1120, 944, 2022, 2250, 1129, 2025, 2026, 1683, 2028, 2029, 2030, 2031, 2032, 2033, 1816, 2035, 755 +}; +static const std::vector ROI_VOXELS_17 = { + 1018, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2049, 2051, 2053, 2055, 2057, 2059, 2061, 2063, 2065, 2067, 2069, 2071, 2073, + 2075, 2077, 2079, 2081, 2083, 2085, 2087, 2089, 2093, 2095, 2097, 2099, 2101, 2103, 2107, 2109, 2127, 2129, 2133, 534, 2137, 535, 2141, 536, 2145, 537, + 2149, 2151, 2153, 2155, 2157, 2159, 2161, 2163, 2165, 2167, 2169, 2171, 2173, 2175, 2177, 2179, 2181, 2183, 1093, 547, 2189, 548, 2193, 2195, 2197, + 2199, 2201, 1102, 1103, 2207, 2209, 2211, 1107, 554, 2217, 1110, 1111, 556, 2225, 1114, 2229, 1117, 1119, 1120, 2241, 2243, 2245, 2247, 1125, 1126, + 2253, 564, 2257, 2259, 2261, 2263, 2265, 1134, 1135, 2271, 2273, 2275, 2277, 2279, 2281, 2283, 2285, 2287, 2289, 2291, 2293, 2295, 2297, 2299, 2301, + 2303, 1153, 2307, 1157, 1158, 2319, 1161, 1162, 2325, 2327, 2329, 2331, 2333, 2335, 2337, 585, 1171, 1172, 1173, 1174, 1175, 1176, 2353, 2355, 2357, + 2359, 2361, 1182, 1183, 1184, 1185, 1186, 2373, 2375, 2377, 1190, 1191, 1192, 1193, 2387, 2389, 2391, 2393, 1662, 1199, 1200, 1201, 1656, 1650, 1204, + 1205, 1206, 1207, 1649, 1641, 1631, 1211, 1212, 1213, 1640, 1674, 2239, 816, 1325, 618, 610, 1221, 611, 1223, 1150, 1149, 2219, 2218, 1228, 2210, 615, + 2200, 616, 1233, 617, 1235, 1236, 2020, 619, 2090, 620, 2088, 621, 2144, 1904, 2066, 623, 2158, 624, 766, 625, 2205, 2215, 1637, 842, 1646, 1256, 2362, + 629, 2363, 630, 1874, 631, 1263, 632, 396, 1598, 1984, 634, 317, 2274, 2134, 2135, 318, 2143, 2148, 1890, 1277, 1278, 2234, 640, 2251, 1282, 1283, 642, + 1285, 1286, 2332, 2323, 2242, 645, 1902, 1003, 1293, 1294, 2036, 2050, 2052, 2060, 1601, 1600, 1595, 1302, 1303, 652, 1594, 653, 1588, 654, 1309, 655, + 1587, 656, 1313, 1314, 1586, 1581, 1575, 2010, 965, 1510, 772, 1629, 388, 1324, 331, 628, 813, 664, 332, 665, 1331, 2116, 333, 1512, 1335, 1336, 827, + 1948, 193, 641, 2187, 643, 1926, 1344, 1345, 1346, 1914, 1012, 2383, 1860, 2264, 1352, 1353, 1354, 1355, 1356, 2248, 357, 1986, 1360, 1361, 1362, 1363, + 1589, 1582, 1366, 1367, 1368, 1369, 1577, 1576, 1568, 1557, 1374, 1375, 1376, 1377, 1549, 1548, 1380, 345, 1382, 1383, 1384, 346, 1540, 995, 999, 347, + 1390, 1988, 1392, 1596, 1602, 1222, 1608, 1397, 1398, 1399, 1234, 1016, 1015, 1389, 1381, 1196, 1195, 1001, 1408, 1409, 2194, 2212, 841, 832, 826, 825, + 817, 1417, 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 404, 403, 402, 1429, 1430, 1431, 1432, 358, 401, 400, 399, 398, 391, 1439, 390, 355, 1442, + 1443, 2170, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 563, 1994, 1454, 1455, 1456, 1457, 1458, 2344, 2345, 1461, 731, 2346, 2347, 2374, 2379, 2385, + 2390, 1469, 1470, 1471, 2392, 1312, 1474, 1618, 1623, 1625, 1844, 1954, 740, 915, 1143, 2122, 1802, 2233, 1486, 2252, 2254, 1689, 1682, 1491, 1666, + 1665, 747, 1495, 1664, 1642, 1498, 1499, 1633, 1501, 1502, 1632, 1504, 1624, 2268, 2288, 1508, 1509, 755, 1511, 756, 1513, 1514, 2284, 2282, 2358, 2360, + 1519, 1520, 1521, 1522, 1523, 2176, 2172, 763, 1527, 1528, 1529, 765, 1531, 1532, 383, 1876, 2162, 2048, 1537, 1538, 2054, 2056, 2058, 1542, 2062, 2064, + 386, 2068, 2070, 2072, 2074, 2076, 2078, 2080, 1553, 777, 2086, 778, 389, 779, 1559, 2096, 2098, 2100, 2102, 2018, 2106, 2108, 2110, 784, 392, 785, 996, + 2120, 393, 1574, 2126, 2128, 394, 2004, 1579, 790, 395, 791, 2142, 1584, 1585, 793, 2150, 2152, 2154, 2156, 1591, 2160, 1593, 2164, 2166, 798, 1597, + 799, 2174, 800, 2178, 2180, 1603, 1604, 1605, 2188, 2190, 2192, 1609, 2196, 2198, 806, 2202, 807, 2206, 2208, 1617, 809, 1619, 810, 405, 811, 2222, + 2224, 406, 2228, 808, 1628, 407, 1630, 2238, 2240, 408, 2244, 2246, 1636, 409, 1638, 1639, 820, 2258, 821, 2262, 822, 2266, 823, 2270, 1648, 412, 2276, + 2278, 2280, 413, 1654, 2286, 828, 414, 2292, 1659, 1660, 2298, 2300, 2302, 2304, 2306, 2308, 2305, 1668, 1669, 2296, 2318, 2320, 418, 2324, 1675, 1676, + 1677, 1678, 2334, 2336, 2338, 2340, 1683, 1684, 1685, 1686, 2350, 2352, 2354, 1690, 1691, 1692, 1693, 2294, 2290, 848, 2370, 849, 1699, 1700, 1701, + 2380, 2382, 2384, 2386, 2388, 1707, 1708, 1709, 2204, 2203, 856, 1713, 1714, 1715, 858, 1717, 1718, 2191, 2186, 2185, 1722, 1723, 1724, 1725, 2184, + 2182, 2092, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 868, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, 1748, 2147, 1892, 1751, + 1752, 1753, 1754, 1755, 2267, 2272, 1758, 1759, 1760, 1761, 1762, 1763, 2339, 1765, 1858, 1706, 1558, 1769, 2381, 2378, 2376, 2372, 2371, 2356, 2351, + 2349, 2348, 2343, 2342, 2330, 2326, 2322, 1784, 2269, 1786, 1787, 2256, 2255, 1790, 1791, 1792, 1793, 1794, 2237, 2236, 1797, 1798, 1799, 1800, 1801, + 901, 2146, 2138, 2136, 1806, 1807, 1808, 1809, 1810, 1932, 1599, 1813, 1814, 1815, 1816, 1817, 1972, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, + 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 922, 1845, 1846, 1847, 1848, 1849, 1850, 1851, + 1852, 1853, 1854, 1855, 1856, 2341, 929, 1859, 930, 1861, 1862, 1863, 1864, 1865, 2328, 1867, 2321, 1869, 1870, 1871, 936, 1873, 937, 1875, 938, 2260, + 939, 1879, 2250, 2249, 1882, 1883, 1884, 1885, 1886, 1887, 944, 1889, 945, 1891, 946, 1893, 947, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 951, 1903, + 952, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 957, 829, 1112, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 963, 1927, 964, 1017, + 1930, 1931, 966, 1933, 764, 1935, 1936, 1937, 1938, 1939, 770, 771, 1942, 1543, 972, 1544, 973, 1947, 974, 1561, 975, 387, 976, 2082, 977, 2084, 908, + 783, 2022, 1894, 833, 834, 2168, 1963, 1964, 1872, 983, 344, 984, 1580, 985, 1971, 986, 397, 923, 1592, 1716, 1977, 1978, 1979, 801, 1094, 991, 677, + 992, 1985, 993, 1987, 994, 555, 1990, 1991, 1992, 1993, 997, 1995, 814, 1736, 1998, 1999, 2000, 2001, 2002, 2003, 1002, 1888, 2006, 2007, 2008, 2009, + 1005, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 1009, 2019, 1010, 2021, 1011, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, + 2035, 1004 +}; +static const std::vector ROI_VOXELS_18 = { + 2036, 2037, 1019, 2039, 1020, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2049, 2051, 2053, 2055, 2057, 1030, 1031, 2063, 1033, 2067, 2069, 2071, 2073, + 2075, 2077, 2079, 2081, 2083, 1043, 1044, 1045, 2091, 2093, 2095, 2097, 2099, 2101, 131, 1053, 2107, 2109, 1056, 1057, 132, 265, 2127, 2129, 2133, 2135, + 2137, 2141, 2143, 268, 2147, 2151, 2153, 2159, 2161, 2165, 2167, 2173, 2175, 2179, 2181, 136, 2185, 2187, 2189, 2191, 2193, 2195, 2197, 2199, 2201, + 2203, 2205, 2207, 2209, 2211, 1107, 2215, 2217, 2219, 1111, 1112, 2225, 1114, 2229, 2233, 1119, 1120, 2241, 2243, 2245, 2247, 2249, 2251, 2253, 2255, + 2257, 2259, 2261, 2263, 2265, 2267, 2269, 2271, 2273, 2279, 2281, 2283, 2285, 2287, 2289, 2291, 2293, 2295, 2297, 2299, 2301, 2303, 1153, 1154, 1155, + 2311, 2319, 2321, 2323, 1163, 1164, 2329, 2331, 2333, 2335, 2337, 2339, 2341, 2343, 2345, 2347, 2349, 2351, 2353, 2355, 2357, 2359, 2361, 2363, 2371, + 2373, 2375, 2377, 2379, 2381, 2383, 2385, 2387, 2389, 2391, 2393, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 2218, 2210, 832, 1211, + 1212, 1213, 1214, 1215, 1216, 1217, 1218, 2100, 610, 2090, 611, 2089, 411, 2087, 417, 1227, 1228, 425, 615, 2066, 616, 2065, 617, 2059, 618, 1237, 619, + 2058, 620, 1718, 621, 1708, 622, 1245, 1246, 1247, 1248, 1249, 625, 643, 626, 1055, 627, 1623, 628, 1625, 629, 78, 630, 452, 631, 2272, 632, 2120, 2122, + 2136, 634, 2138, 635, 1908, 636, 2252, 637, 2254, 638, 1277, 639, 2322, 640, 2327, 641, 2342, 642, 1285, 1286, 2356, 1722, 1849, 645, 1761, 646, 1753, + 647, 390, 648, 391, 649, 398, 650, 400, 651, 401, 652, 1729, 653, 1601, 654, 841, 655, 1595, 656, 813, 1314, 1588, 995, 1586, 659, 1581, 660, 1575, 661, + 1195, 662, 111, 663, 842, 1328, 1329, 665, 120, 666, 134, 141, 1335, 1336, 1337, 1338, 249, 259, 270, 97, 1278, 1023, 854, 673, 846, 674, 838, 675, 837, + 676, 836, 677, 822, 1029, 449, 1835, 441, 2237, 2239, 1655, 2022, 433, 402, 431, 403, 424, 423, 1370, 1371, 686, 1373, 1374, 1375, 1376, 1377, 422, + 1379, 421, 1381, 1382, 1383, 1384, 1385, 416, 415, 2146, 1389, 235, 234, 1392, 1393, 1394, 2294, 1624, 1640, 1682, 216, 10, 21, 43, 1403, 1404, 215, + 214, 213, 212, 208, 207, 206, 98, 1413, 1414, 1415, 1416, 1417, 1418, 269, 260, 1421, 1422, 1423, 1424, 1425, 834, 68, 1428, 246, 1430, 1431, 1432, 237, + 44, 236, 233, 1633, 153, 144, 143, 142, 1442, 1443, 133, 122, 2274, 1447, 1448, 1449, 1450, 1451, 2060, 1994, 104, 102, 1456, 1457, 1458, 817, 64, 63, + 62, 54, 53, 52, 51, 50, 42, 1469, 1470, 1471, 41, 40, 1474, 20, 840, 9, 8, 3, 857, 1, 0, 2378, 2372, 2326, 2325, 1712, 623, 1705, 1704, 1703, 1702, + 1698, 1697, 1495, 1496, 1497, 1696, 1499, 816, 1501, 1502, 1503, 1694, 1547, 812, 1539, 1508, 1509, 1510, 1511, 1536, 815, 824, 1515, 1533, 1372, 1220, + 1519, 1520, 1197, 1194, 2056, 1000, 1636, 2, 847, 11, 23, 839, 831, 830, 383, 1534, 1535, 2048, 1537, 1538, 2054, 770, 1541, 1542, 2062, 2064, 386, + 2068, 2070, 2072, 2074, 2076, 2078, 2080, 2082, 777, 2086, 2088, 389, 1558, 1559, 2096, 2098, 1562, 1563, 1564, 2106, 2108, 410, 784, 392, 1196, 1571, + 1572, 393, 1574, 2126, 2128, 394, 823, 2134, 1580, 395, 999, 2142, 1584, 1585, 2148, 1587, 2152, 2154, 404, 1591, 2160, 1593, 1594, 2166, 2168, 399, + 1598, 1599, 1600, 2178, 2180, 2182, 1604, 1605, 2188, 2190, 2192, 2194, 2196, 2198, 2200, 2202, 2204, 2206, 2208, 1617, 1618, 1619, 826, 405, 2220, + 2222, 2224, 406, 2228, 101, 1628, 1629, 1630, 2238, 2240, 2242, 2244, 2246, 2248, 1637, 1638, 1639, 2256, 2258, 2260, 2262, 2264, 2266, 1646, 1647, + 1648, 412, 825, 2278, 2280, 413, 1654, 2286, 828, 414, 829, 1659, 1660, 1661, 2300, 2302, 2304, 2306, 833, 2310, 1668, 1669, 1670, 2318, 2320, 418, + 2324, 1675, 2328, 2330, 2332, 2334, 2336, 2338, 2340, 1683, 2344, 2346, 2348, 2350, 2352, 2354, 1690, 2358, 2360, 2362, 2364, 1695, 848, 2370, 849, + 2374, 1700, 1701, 2380, 2382, 2384, 2386, 2388, 1707, 2392, 1709, 811, 1711, 856, 1713, 1714, 1715, 858, 1717, 859, 1719, 860, 430, 861, 1723, 1724, + 1725, 1726, 1727, 1728, 432, 1730, 1731, 1732, 1733, 1734, 1735, 868, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 388, 1554, 437, 1699, + 1751, 1752, 438, 877, 109, 878, 439, 1758, 1759, 1760, 440, 1762, 2236, 1736, 1765, 2038, 2040, 2050, 442, 2052, 110, 2061, 2092, 2183, 2184, 2186, + 2290, 2298, 1632, 222, 1664, 1665, 1666, 1784, 1689, 1786, 1787, 223, 1674, 1790, 1791, 1792, 1793, 1794, 1642, 224, 1797, 1798, 1799, 1800, 1801, 1802, + 1631, 225, 2305, 1806, 1807, 1808, 1809, 1810, 2296, 226, 1813, 1814, 1815, 1816, 1817, 2212, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, + 1828, 1829, 1830, 1831, 1832, 1833, 1834, 114, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 1848, 462, 1850, 1851, 1852, + 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, + 2376, 1879, 1706, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, + 1903, 1904, 1905, 1906, 1907, 238, 1909, 1910, 1911, 1912, 2028, 2234, 119, 67, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 963, 1312, 964, + 2024, 1930, 1931, 1932, 1933, 106, 1935, 1936, 1937, 2309, 2213, 13, 624, 1942, 2390, 2008, 996, 2174, 121, 1028, 487, 1543, 1544, 1561, 387, 1954, + 1041, 1042, 2084, 1046, 1054, 264, 407, 1573, 1963, 1964, 1579, 2292, 664, 396, 1330, 397, 1971, 1972, 115, 1592, 2307, 2250, 1977, 1978, 1979, 247, + 1553, 2085, 814, 1984, 1985, 1986, 408, 248, 409, 1990, 1991, 1992, 1993, 997, 1716, 998, 499, 1998, 1999, 2000, 2001, 1001, 696, 1002, 827, 2006, 2007, + 1004, 2009, 1005, 2011, 1006, 2308, 2014, 2015, 2016, 2017, 1161, 867, 252, 2021, 1011, 2023, 1012, 2025, 2026, 126, 253, 2029, 2030, 2031, 2032, 2033, + 2034, 2035, 1003 +}; +static const std::vector ROI_VOXELS_19 = { + 2318, 2191, 2192, 2320, 2193, 1674, 2194, 2322, 2195, 2068, 1994, 2324, 1867, 2325, 1740, 2326, 2327, 1741, 325, 1869, 2202, 2330, 1870, 2331, 2204, + 1871, 2079, 1107, 2335, 2336, 1618, 2337, 1810, 1619, 2212, 950, 949, 2342, 557, 2343, 774, 1558, 940, 941, 935, 2069, 1623, 2092, 932, 2348, 1114, + 2349, 780, 2350, 1625, 2351, 2224, 1817, 942, 2126, 1499, 528, 1882, 768, 2228, 2356, 1883, 767, 2011, 2358, 760, 2359, 313, 2360, 2233, 759, 758, 1312, + 1631, 1689, 2236, 751, 2237, 1633, 2238, 1824, 2239, 565, 560, 1825, 559, 558, 551, 2370, 2243, 2371, 2244, 2372, 2245, 2373, 2246, 1828, 1892, 2375, + 543, 2376, 1893, 2377, 757, 2378, 349, 348, 2252, 339, 2253, 2381, 2254, 2127, 2255, 2383, 2256, 2129, 1642, 1706, 2025, 1834, 2179, 2387, 2026, 2388, + 2261, 2389, 2262, 1836, 2263, 2136, 2028, 2137, 1901, 2393, 1519, 2305, 1902, 336, 326, 324, 2269, 2120, 312, 1509, 2303, 1713, 2032, 1841, 1624, 2146, + 1640, 1842, 1827, 1835, 1833, 1843, 1826, 1802, 2035, 1844, 1801, 1972, 2036, 1794, 1793, 1792, 2037, 542, 2283, 1682, 2038, 1666, 1665, 2382, 2039, + 1848, 575, 1632, 2040, 1849, 2289, 1722, 1786, 1850, 2291, 1978, 1787, 1508, 2182, 1979, 2294, 2304, 2295, 1470, 2296, 337, 2297, 1471, 2298, 1854, + 2184, 2290, 1791, 2203, 1664, 2185, 2302, 2183, 2048, 1474, 2049, 338, 2050, 2178, 2051, 1858, 2052, 2080, 1714, 1859, 1954, 1732, 2041, 1860, 1900, + 1733, 323, 1861, 2122, 2186, 773, 1723, 2060, 2128, 2061, 933, 1964, 2138 +}; +static const std::vector ROI_VOXELS_20 = { + 254, 7, 15, 127, 255, 256, 128, 257, 1032, 129, 130, 1048, 526, 527, 528, 529, 1060, 1061, 266, 2131, 2133, 534, 267, 2141, 2143, 2147, 16, 1083, 1084, + 543, 1091, 1092, 1093, 1094, 137, 1101, 1102, 1103, 138, 277, 1110, 1111, 1112, 278, 557, 69, 139, 1117, 559, 1119, 1120, 2241, 561, 1123, 2247, 2249, + 2251, 2257, 2259, 566, 2265, 1134, 1135, 568, 569, 2279, 1143, 17, 71, 1149, 1150, 1152, 1153, 577, 578, 289, 579, 1159, 2319, 1161, 1162, 72, 2329, + 1166, 2333, 1168, 1169, 2339, 1171, 1172, 1173, 1174, 1175, 1176, 2353, 2355, 73, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, + 1191, 1192, 2385, 597, 74, 2391, 299, 1201, 150, 301, 1206, 1207, 604, 18, 605, 75, 151, 152, 1221, 1222, 1223, 612, 613, 1228, 154, 310, 312, 625, 313, + 1254, 1256, 1262, 1263, 632, 633, 634, 1269, 1270, 4, 1279, 1281, 1282, 1283, 642, 643, 644, 645, 1291, 161, 1293, 1294, 324, 1300, 1301, 1302, 1303, + 652, 326, 653, 81, 654, 1309, 655, 656, 1313, 657, 658, 82, 1324, 1325, 1327, 664, 665, 1331, 1332, 667, 1335, 1336, 669, 1339, 670, 1341, 1342, 1343, + 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 679, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, + 1369, 1376, 1377, 172, 691, 1383, 1384, 1390, 1392, 348, 1397, 1398, 1399, 350, 702, 703, 704, 1409, 709, 710, 243, 797, 2338, 712, 941, 1426, 988, + 1179, 1429, 1524, 932, 716, 899, 774, 1435, 1436, 359, 719, 1439, 789, 360, 721, 2357, 1444, 1445, 1446, 920, 760, 759, 758, 757, 1452, 1453, 1454, + 1455, 728, 751, 575, 565, 560, 1461, 731, 558, 551, 366, 45, 542, 349, 1469, 735, 1471, 339, 368, 1474, 338, 337, 336, 325, 323, 740, 456, 1679, 444, + 2354, 1641, 1486, 1504, 1488, 1498, 1158, 1491, 186, 373, 1494, 1495, 1157, 374, 46, 1499, 187, 1501, 1502, 1576, 752, 1505, 1506, 1507, 1508, 1509, + 755, 1511, 1512, 1513, 1514, 1582, 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, 762, 1525, 1526, 1527, 1528, 1529, 47, 1531, 1532, 2103, 767, 1948, + 768, 1537, 1538, 923, 770, 385, 1542, 1543, 1544, 1938, 773, 1926, 1548, 1549, 775, 1914, 1913, 1553, 777, 580, 778, 1557, 594, 898, 780, 1748, 48, + 2102, 782, 586, 783, 2110, 784, 1380, 2116, 1568, 786, 1540, 787, 1408, 788, 1577, 2132, 2134, 790, 1437, 2140, 2142, 1268, 886, 2148, 576, 794, 1589, + 795, 1132, 796, 232, 49, 99, 798, 845, 799, 727, 800, 692, 801, 690, 802, 683, 803, 682, 804, 672, 805, 100, 806, 671, 807, 1615, 808, 1617, 809, 508, + 810, 1621, 507, 496, 1624, 140, 494, 1627, 1628, 2234, 1630, 1631, 2240, 2242, 2321, 668, 2248, 1637, 1638, 1639, 1640, 2258, 2260, 230, 2264, 2266, + 1646, 791, 2272, 1649, 1650, 2386, 466, 1653, 1654, 2286, 1656, 25, 829, 1659, 1660, 457, 1662, 1663, 1664, 1665, 1666, 448, 1668, 1669, 835, 1671, + 1672, 418, 1674, 1675, 2328, 1677, 2332, 2334, 1680, 420, 2340, 1683, 210, 1685, 843, 1687, 2352, 1689, 1690, 105, 1692, 1693, 447, 300, 290, 280, 279, + 2374, 850, 1701, 851, 245, 2384, 426, 853, 2390, 2392, 1709, 163, 162, 453, 428, 1008, 241, 858, 429, 1718, 819, 818, 614, 384, 107, 862, 382, 1308, + 1292, 1140, 1133, 865, 1124, 1116, 1109, 1108, 1100, 868, 434, 943, 108, 217, 435, 1358, 928, 927, 436, 921, 1747, 218, 914, 913, 907, 191, 900, 1754, + 1755, 219, 328, 744, 737, 603, 596, 595, 1763, 220, 589, 588, 587, 884, 1769, 885, 570, 221, 443, 567, 378, 377, 1777, 367, 361, 341, 445, 340, 6, 1784, + 446, 893, 327, 203, 1789, 1790, 202, 1792, 1793, 1794, 199, 1796, 1797, 1798, 1799, 1800, 1801, 1802, 198, 195, 1805, 1806, 1807, 1808, 1809, 1810, 194, + 906, 1813, 1814, 1815, 1816, 1817, 190, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, + 1837, 1838, 1839, 1840, 1841, 1842, 1843, 922, 1845, 1846, 1847, 1848, 1849, 57, 1851, 1852, 1853, 1854, 1855, 1856, 1688, 929, 1681, 930, 465, 1673, + 1530, 1864, 1865, 933, 116, 934, 1340, 935, 1178, 1177, 1170, 937, 1875, 1167, 1165, 408, 989, 940, 814, 58, 117, 942, 677, 1886, 980, 944, 2344, 978, + 1686, 970, 1684, 793, 536, 2229, 227, 949, 118, 950, 475, 1510, 2380, 5, 476, 984, 1691, 1783, 477, 1850, 901, 956, 29, 59, 1682, 239, 908, 959, 1642, + 960, 1633, 1632, 228, 240, 915, 963, 1927, 964, 229, 965, 2135, 966, 483, 967, 537, 968, 484, 969, 1939, 242, 485, 971, 2379, 972, 231, 973, 1947, 974, + 1636, 975, 2347, 976, 488, 977, 2346, 244, 2345, 979, 2341, 1960, 1961, 981, 1963, 982, 678, 983, 2225, 1968, 1969, 985, 1971, 986, 493, 987, 1975, + 1976, 1977, 61, 1629, 990, 495, 1982, 1983, 1984, 1985, 1986, 2267, 994, 1125, 1990, 1991, 1126, 2250, 1994, 1645, 1648, 14, 1998, 413, 2000, 992, 414, + 1314, 991, 501, 2006, 427, 2008, 1193, 2022, 2011, 834, 209, 1007, 2323, 2016, 419, 1676, 1678, 60, 844, 1011, 211, 1012, 2025, 2026, 1699, 1700, 2029, + 2030, 2031, 2032, 2033, 993, 747, 1004 +}; +static const std::vector ROI_VOXELS_21 = { + 1012, 757, 2025, 1770, 2026, 1260, 631, 759, 632, 2030, 1520, 2032, 2033, 634, 891, 892, 637, 223, 767, 1023, 768, 641, 1537, 1793, 1538, 1794, 449, + 643, 1797, 1542, 1798, 1543, 1799, 1544, 645, 773, 1801, 1802, 387, 1550, 324, 1551, 1807, 1552, 1808, 1553, 905, 1810, 652, 97, 1815, 1560, 1816, 1817, + 654, 2104, 1821, 528, 1822, 392, 1823, 2111, 1824, 1569, 1825, 1570, 1826, 2117, 1827, 1828, 1829, 2123, 1830, 394, 1831, 1832, 1066, 1833, 1578, 1834, + 395, 1835, 1836, 1837, 1838, 1583, 1839, 1073, 1840, 1841, 1842, 397, 1843, 1590, 1846, 1847, 1848, 1849, 542, 1850, 1851, 543, 1852, 1853, 1854, 1855, + 1856, 1090, 674, 338, 932, 677, 1098, 1865, 1099, 339, 551, 935, 1106, 234, 405, 1875, 406, 940, 1624, 235, 558, 814, 942, 1628, 1629, 560, 1886, 1631, + 1376, 1632, 1377, 1633, 409, 1636, 1637, 1382, 1638, 1383, 1639, 1384, 1640, 949, 1642, 822, 950, 823, 1646, 1391, 412, 1392, 1648, 206, 238, 349, 413, + 827, 414, 1400, 1401, 829, 1402, 415, 1915, 575, 1916, 416, 1664, 833, 1410, 1666, 1411, 834, 1412, 1669, 418, 1928, 837, 1929, 1674, 1675, 711, 1682, + 1683, 1940, 1941, 422, 717, 1689, 1434, 1690, 718, 423, 487, 1949, 1950, 424, 941, 933, 780, 849, 774, 760, 758, 1699, 393, 1700, 565, 1701, 559, 557, + 348, 337, 336, 326, 325, 213, 323, 313, 312, 854, 846, 838, 836, 1709, 673, 660, 659, 1200, 646, 1201, 842, 214, 642, 441, 1792, 858, 630, 1205, 897, + 1206, 408, 1718, 1059, 430, 432, 431, 421, 215, 226, 225, 224, 1212, 620, 1213, 212, 863, 208, 207, 1471, 864, 98, 1433, 1261, 216, 1474, 1864, 615, + 433, 1253, 1067, 664, 904, 1230, 911, 919, 868, 996, 1225, 1068, 1226, 997, 918, 1994, 1228, 499, 1229, 743, 871, 1809, 1231, 1049, 872, 926, 1519, + 2000, 873, 621, 653, 912, 437, 1002, 407, 1375, 1749, 1003, 1750, 655, 438, 1004, 1241, 2008, 1207, 1005, 656, 1499, 439, 2011, 1756, 751, 1757, 1502, + 624, 2031, 440, 1510, 625, 2016, 1665, 396, 1251, 665, 1252, 1508, 1764, 1509, 828, 1011, 2022, 1511, 442, 1224 +}; +static const std::vector ROI_VOXELS_22 = { + 836, 487, 499, 757, 646, 543, 551, 559, 416, 837, 424, 432, 313, 758, 325, 528, 337, 933, 560, 349, 838, 846, 854, 751, 759, 767, 942, 207, 421, 213, + 215, 433, 437, 441, 223, 225, 326, 673, 235, 1023, 674, 422, 950, 430, 949, 438, 442, 941, 323, 940, 659, 935, 339, 932, 440, 774, 773, 768, 760, 575, + 565, 226, 423, 415, 97, 98, 660, 312, 542, 557, 206, 208, 449, 212, 214, 431, 216, 439, 348, 637, 324, 780, 224, 336, 234, 558, 238, 338 +}; +static const std::vector ROI_VOXELS_23 = { + 1018, 1023, 512, 513, 514, 2059, 2065, 2067, 2073, 2075, 2077, 2083, 2085, 2087, 2089, 2095, 2097, 2099, 2101, 526, 263, 2107, 2109, 1058, 1059, 1060, + 1061, 1064, 1065, 1066, 1067, 534, 1069, 1070, 1071, 536, 1073, 537, 1075, 1076, 1077, 1078, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 272, 1090, + 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 2207, 1105, 1106, 1108, 2217, 1110, 1113, 1116, 1117, 280, 1123, 1124, + 1125, 1126, 1132, 1133, 1134, 1135, 1140, 1143, 289, 290, 146, 293, 148, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, + 1207, 18, 1211, 1212, 1213, 1217, 1218, 1220, 1221, 611, 1223, 76, 1228, 1229, 615, 1231, 616, 1233, 617, 1235, 1236, 1238, 1239, 1240, 310, 621, 622, + 623, 624, 625, 1251, 626, 1253, 627, 1256, 1257, 629, 1259, 630, 1261, 631, 1263, 1264, 1265, 634, 635, 636, 1274, 1275, 638, 1277, 639, 640, 1281, + 1282, 1283, 642, 1285, 643, 1287, 1288, 645, 1291, 1292, 1293, 1294, 1296, 649, 1299, 650, 1301, 651, 1303, 652, 1305, 1306, 81, 163, 1309, 655, 656, + 1313, 658, 659, 660, 661, 82, 662, 663, 664, 665, 166, 671, 672, 673, 674, 675, 677, 682, 683, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1379, + 172, 1381, 1382, 1383, 1384, 1389, 1390, 1392, 1397, 1398, 1399, 702, 703, 704, 1409, 705, 1417, 709, 1419, 1420, 1421, 1422, 1423, 712, 1425, 1426, + 1429, 1430, 1431, 1432, 1433, 717, 1435, 1436, 719, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1446, 1447, 724, 1449, 1450, 1451, 1452, 1453, 1454, 1455, + 728, 1457, 1458, 1459, 1461, 731, 732, 1465, 733, 735, 737, 740, 742, 743, 744, 747, 748, 749, 750, 752, 755, 1533, 1534, 1535, 1536, 1537, 1538, 1539, + 1540, 1541, 1542, 1543, 1544, 386, 1547, 2072, 2074, 2076, 2078, 1553, 2084, 2086, 2088, 389, 2096, 2098, 2100, 2102, 2106, 2108, 2110, 1568, 392, 2116, + 393, 1574, 1575, 1576, 394, 1579, 1580, 395, 1582, 1584, 396, 1586, 1587, 1588, 397, 1591, 1592, 398, 1594, 1595, 1596, 399, 1598, 1599, 1600, 400, + 1602, 1603, 1604, 401, 1608, 1609, 2200, 403, 2206, 2208, 404, 405, 811, 2222, 812, 406, 813, 814, 407, 815, 816, 408, 817, 409, 410, 822, 411, 823, + 824, 412, 825, 826, 413, 827, 828, 414, 829, 830, 415, 831, 832, 416, 833, 834, 417, 836, 418, 837, 838, 839, 840, 841, 842, 421, 422, 845, 846, 423, + 1694, 1695, 848, 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, 853, 213, 1709, 1711, 856, 857, 858, 1718, 430, 215, 431, 863, 864, 432, 865, + 1731, 216, 433, 1290, 1735, 868, 1737, 869, 1739, 870, 1280, 871, 1089, 1744, 1745, 873, 1747, 1748, 437, 2219, 1751, 1752, 438, 1754, 1755, 2218, 439, + 1758, 1759, 1760, 440, 881, 1763, 882, 1765, 883, 2211, 884, 1769, 885, 2210, 886, 2209, 2201, 2090, 2066, 2058, 2047, 1937, 1252, 1260, 891, 157, 892, + 164, 893, 165, 894, 447, 895, 273, 896, 448, 897, 1222, 898, 449, 899, 1549, 900, 1557, 901, 1577, 902, 1909, 903, 1908, 904, 1241, 905, 1230, 906, + 1448, 907, 303, 908, 74, 909, 97, 223, 1762, 911, 1761, 912, 456, 913, 1753, 914, 457, 915, 1746, 916, 1738, 917, 1730, 918, 1729, 919, 1601, 920, 1581, + 921, 1424, 922, 461, 923, 1418, 924, 1278, 925, 854, 926, 646, 927, 637, 1856, 1857, 929, 466, 930, 465, 931, 632, 1864, 1865, 1866, 442, 1868, 441, + 424, 1589, 207, 226, 937, 1875, 234, 225, 224, 1879, 214, 470, 212, 208, 235, 206, 1886, 98, 944, 1889, 1890, 1891, 283, 2103, 653, 1895, 1896, 1897, + 1898, 1899, 1234, 475, 55, 1548, 1913, 1905, 1906, 1907, 238, 477, 1910, 1911, 1912, 29, 1914, 1408, 1380, 1917, 1918, 1919, 1920, 1921, 1922, 1923, + 1924, 1925, 1926, 1927, 1736, 1456, 1930, 1931, 1932, 1933, 1434, 1935, 1936, 484, 1938, 1939, 1068, 485, 1942, 1049, 425, 1258, 232, 1947, 1948, 487, + 2064, 620, 872, 718, 711, 1048, 383, 641, 727, 1286, 402, 716, 387, 710, 245, 648, 388, 692, 1302, 691, 390, 654, 391, 493, 1308, 527, 690, 494, 529, + 1072, 1585, 495, 1250, 483, 476, 496, 1593, 299, 1597, 928, 995, 301, 996, 1605, 997, 300, 998, 499, 999, 934, 1000, 500, 1001, 1104, 1002, 75, 1003, + 1109, 1004, 162, 1005, 125, 1006, 154, 279, 943, 1888, 1881, 1712, 1300, 1696, 880, 1011, 647, 1012, 618, 847, 849, 723, 507, 1015, 610, 1016, 508, + 1017, 619, 628 +}; +static const std::vector ROI_VOXELS_24 = { + 1021, 1022, 1023, 1024, 1025, 1026, 1027, 514, 1032, 258, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 522, 523, 1047, 524, 1050, 1051, 528, 1063, 2131, + 534, 536, 1074, 1079, 542, 543, 1088, 272, 273, 1094, 1102, 1103, 1110, 557, 558, 1117, 559, 560, 1125, 1126, 565, 70, 283, 1134, 1135, 569, 1139, 1141, + 1143, 35, 1148, 287, 575, 1152, 1153, 579, 1159, 1161, 1165, 1166, 1167, 1168, 1169, 1170, 146, 293, 1177, 1178, 1179, 1180, 1181, 1187, 1188, 1189, + 298, 1201, 1206, 1207, 1208, 1209, 1210, 303, 1219, 76, 1228, 307, 1232, 1233, 1234, 309, 1242, 1243, 1244, 312, 625, 313, 1256, 157, 1263, 632, 1266, + 1267, 634, 637, 79, 1276, 320, 1282, 1283, 642, 643, 644, 1289, 645, 80, 646, 323, 1294, 324, 1298, 325, 1302, 1303, 652, 326, 653, 654, 1309, 655, 656, + 1313, 657, 164, 659, 660, 165, 1327, 664, 665, 166, 667, 1335, 1336, 669, 1339, 1340, 1341, 1342, 1343, 336, 673, 1347, 1348, 1349, 1350, 1351, 338, + 677, 678, 1357, 1358, 1359, 680, 681, 170, 1365, 171, 688, 1377, 689, 1383, 1384, 1386, 1387, 1388, 695, 1392, 348, 1395, 1396, 349, 699, 700, 701, + 1405, 1406, 1407, 706, 707, 708, 1419, 713, 1427, 714, 1429, 715, 89, 179, 1439, 721, 722, 1445, 1446, 725, 90, 726, 1454, 1455, 1461, 731, 734, 1472, + 1473, 1478, 1479, 740, 1485, 1488, 1494, 1495, 1501, 751, 1505, 1506, 1507, 755, 757, 1516, 1517, 759, 760, 1524, 1525, 1526, 1530, 767, 768, 1537, + 1538, 770, 1542, 1543, 1544, 1545, 1546, 774, 775, 1553, 777, 1555, 1556, 780, 97, 782, 1565, 1566, 1567, 784, 786, 788, 2132, 98, 2140, 794, 795, 796, + 797, 99, 1596, 1602, 802, 803, 804, 805, 100, 1615, 1621, 1627, 814, 408, 1645, 206, 1653, 1654, 414, 829, 1659, 1660, 415, 1663, 416, 1668, 835, 1671, + 1672, 1673, 837, 209, 419, 1679, 1680, 1681, 210, 421, 843, 1687, 844, 422, 211, 423, 424, 1699, 1700, 1701, 851, 852, 426, 213, 1709, 1710, 428, 858, + 429, 1718, 1720, 430, 862, 431, 432, 866, 433, 868, 434, 217, 435, 436, 218, 437, 875, 876, 438, 219, 439, 440, 220, 441, 442, 443, 887, 888, 1777, 889, + 890, 445, 1783, 446, 55, 223, 1789, 224, 449, 901, 225, 1805, 1806, 226, 1813, 1814, 908, 454, 1819, 1820, 455, 228, 915, 229, 922, 923, 28, 463, 1856, + 464, 929, 930, 1864, 1865, 933, 935, 937, 1875, 234, 1878, 1880, 941, 235, 1886, 944, 473, 948, 474, 949, 950, 238, 956, 239, 959, 960, 481, 963, 964, + 482, 942, 967, 940, 968, 932, 969, 212, 970, 297, 971, 773, 758, 1518, 214, 633, 243, 487, 762, 27, 512, 488, 1796, 339, 978, 1293, 979, 337, 980, 1961, + 981, 453, 982, 491, 227, 1146, 1968, 1969, 789, 1378, 1721, 537, 987, 1975, 1976, 230, 989, 668, 990, 670, 1982, 1983, 513, 988, 1093, 1608, 551, 679, + 1990, 1991, 1364, 854, 846, 838, 836, 499, 1998, 674, 1376, 500, 444, 1332, 207, 501, 2006, 413, 1004, 850, 288, 208, 910, 503, 834, 418, 855, 504, 420, + 242, 427, 505, 1011, 1688, 1012, 506, 1013, 490, 1014, 1960, 1015, 492, 1016, 215, 216, 308, 747 +}; +static const std::vector ROI_VOXELS_25 = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63, 64, 69, 71, 72, 73, 74, 75, 76, 81, 82, 83, 84, 85, 86, 87, 88, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 104, 105, 107, 108, 109, 110, 111, 116, 117, 118, 119, 120, 121, 122, 125, 127, 128, 129, 130, 131, 132, 133, 134, 137, + 138, 139, 140, 141, 142, 143, 144, 146, 148, 150, 151, 152, 153, 154, 157, 161, 162, 163, 164, 165, 166, 172, 173, 174, 175, 176, 177, 178, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 254, 255, 256, 257, 259, 260, 263, 266, 267, 268, 269, 270, 272, 273, 277, 278, 279, 280, 289, 290, 299, 300, 301, + 302, 305, 306, 310, 311, 314, 315, 316, 319, 321, 322, 327, 328, 329, 330, 334, 335, 340, 341, 342, 343, 350, 351, 352, 353, 354, 356, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 387, 392, 393, 394, 395, 396, 397, 405, 406, 407, + 408, 409, 412, 413, 414, 415, 416, 418, 419, 420, 421, 422, 423, 424, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 453, 456, 457, 461, 465, 466, 470, 475, 476, 477, 483, 484, 485, 487, 488, 493, 494, 495, 496, 499, 501, 507, + 508, 509, 510, 511, 515, 516, 520, 521, 525, 526, 527, 529, 530, 531, 532, 533, 538, 539, 540, 541, 544, 545, 546, 549, 550, 552, 553, 561, 562, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 576, 577, 578, 579, 580, 581, 582, 583, 584, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 615, 620, 621, 624, 625, 630, 631, 632, 633, 634, 637, 641, 642, 643, 644, 645, 646, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 676, 677, 678, 679, 682, 683, 686, 690, 691, 692, 695, 696, + 702, 703, 704, 705, 709, 710, 712, 716, 719, 720, 721, 723, 724, 727, 728, 729, 730, 732, 733, 735, 736, 737, 738, 739, 741, 742, 744, 745, 746, 748, + 749, 750, 752, 753, 754, 770, 775, 777, 782, 784, 786, 787, 788, 789, 792, 794, 795, 796, 797, 802, 803, 804, 805, 814, 822, 823, 827, 828, 829, 833, + 834, 835, 836, 837, 838, 842, 843, 844, 845, 846, 849, 850, 851, 853, 854, 855, 858, 859, 860, 861, 862, 865, 866, 867, 868, 869, 870, 875, 876, 877, + 878, 880, 881, 882, 883, 884, 885, 886, 893, 894, 895, 896, 898, 899, 900, 902, 903, 906, 907, 909, 913, 914, 916, 917, 920, 921, 924, 925, 927, 928, + 931, 934, 943, 959, 960, 963, 964, 967, 968, 969, 970, 971, 978, 979, 980, 981, 982, 987, 988, 989, 990, 996, 997, 1002, 1003, 1004, 1005, 1011, 1012, + 1017, 1018, 1023, 1257, 1258, 1770, 2027, 2028, 1518, 1264, 1265, 1524, 1525, 1526, 1530, 1786, 1787, 1277, 1278, 1024, 1791, 1025, 1281, 1537, 1538, + 1028, 1029, 1030, 2058, 1542, 1032, 1544, 2065, 2066, 2067, 1291, 1292, 1037, 1038, 1550, 1806, 1551, 2078, 1552, 1042, 1043, 1044, 1300, 2087, 1301, + 2089, 1813, 1814, 1048, 1560, 1051, 2100, 2101, 1819, 1053, 1820, 1054, 1055, 1312, 2111, 1569, 1570, 1060, 1061, 2120, 2122, 1574, 1064, 2126, 2127, + 2128, 2129, 1578, 1324, 2136, 1581, 2138, 1071, 1583, 2144, 2145, 2146, 1586, 1331, 1587, 1332, 1588, 1844, 1078, 2155, 2156, 2157, 1336, 2162, 1594, + 1339, 1595, 1340, 1341, 1597, 2170, 2171, 2172, 1600, 1856, 1601, 1091, 1347, 1603, 1348, 1349, 1350, 1095, 1351, 1864, 1609, 1865, 2169, 1100, 1070, + 1101, 1357, 2201, 1358, 1650, 1359, 1104, 1058, 1105, 1027, 2209, 2210, 1618, 1679, 1108, 1875, 1109, 1365, 2176, 2218, 2219, 1491, 1623, 1879, 1113, + 2224, 1625, 1412, 1325, 2228, 1116, 1114, 1157, 1083, 2233, 1149, 2211, 1886, 2237, 2238, 2239, 1377, 2200, 1889, 1123, 1890, 1124, 1891, 2099, 2090, + 2088, 1382, 1026, 2252, 2253, 2254, 2255, 2256, 1641, 1897, 1031, 1898, 1132, 2262, 1133, 1039, 1041, 2077, 2076, 2268, 2269, 1392, 2075, 2059, 1649, + 2117, 2275, 2276, 1140, 2123, 1065, 1908, 2047, 2282, 2283, 1910, 2137, 1911, 1656, 2288, 1072, 1402, 1937, 2149, 1659, 1915, 1660, 1916, 1150, 1084, + 1662, 1936, 1663, 2177, 1153, 2236, 1107, 1410, 1912, 1922, 1507, 1923, 1668, 1924, 1158, 1925, 1159, 1909, 1671, 2318, 1672, 1928, 1673, 2322, 2243, + 2324, 2325, 2326, 2327, 2245, 1166, 2330, 2331, 1899, 1168, 1935, 1680, 2336, 1681, 1426, 2163, 1427, 2164, 2342, 2343, 1940, 2261, 1941, 2263, 2348, + 1687, 2350, 1688, 2277, 1178, 1453, 1179, 2356, 1180, 1436, 1181, 1761, 2158, 1949, 1161, 1950, 1165, 1440, 1167, 1441, 2335, 2370, 1187, 1954, 1188, + 1444, 2375, 2376, 1701, 2378, 2337, 1170, 2381, 2382, 2383, 1449, 1739, 1450, 2387, 2388, 2389, 1452, 2349, 1964, 1709, 2351, 1177, 1384, 1200, 2371, + 1201, 2373, 2377, 1418, 2393, 1425, 1207, 1238, 1205, 1972, 1206, 1364, 1718, 1092, 1376, 1400, 1428, 1575, 1235, 1501, 1700, 1978, 1212, 1979, 1213, + 1239, 1553, 1470, 1040, 2244, 1245, 1246, 2270, 1442, 1729, 1424, 1730, 1259, 1731, 1987, 1417, 1988, 1335, 1342, 1343, 1990, 1224, 1991, 1225, 1375, + 1226, 1383, 1738, 1391, 1228, 1995, 1401, 2372, 1411, 1486, 1420, 1998, 1232, 1435, 1443, 1451, 1308, 1495, 1746, 2002, 1236, 2003, 1237, 2004, 1749, + 1543, 1750, 2006, 1240, 2104, 2150, 1590, 1753, 1498, 1619, 2010, 1244, 2246, 1756, 2012, 1757, 2013, 1247, 1654, 2320, 1504, 1699, 1505, 1250, 1506, + 1762, 2018, 1169, 2019, 1764, 2020, 1517, 1516, 1189, 2284, 1921, 1929 +}; +static const std::vector ROI_VOXELS_26 = { + 254, 7, 15, 127, 255, 512, 256, 513, 128, 257, 516, 258, 517, 129, 519, 522, 523, 1047, 524, 1049, 263, 528, 1059, 1060, 1061, 1063, 532, 266, 2131, + 1067, 1068, 267, 535, 1073, 1074, 1075, 2151, 2153, 1079, 2159, 2161, 1082, 2165, 2167, 1085, 543, 2173, 2175, 1089, 545, 546, 547, 1096, 274, 1098, + 1099, 137, 275, 551, 553, 138, 277, 555, 556, 278, 557, 69, 139, 279, 559, 560, 280, 561, 562, 563, 564, 565, 70, 566, 283, 567, 2271, 2273, 1138, 570, + 2281, 571, 2285, 572, 1145, 573, 1147, 574, 287, 1150, 1152, 288, 577, 1156, 289, 1158, 580, 290, 581, 72, 582, 583, 584, 585, 586, 293, 587, 588, 589, + 73, 590, 591, 592, 593, 148, 297, 595, 596, 298, 597, 1195, 598, 299, 599, 1199, 600, 300, 601, 602, 301, 603, 604, 18, 605, 1211, 606, 303, 607, 608, + 609, 610, 611, 307, 1230, 1231, 616, 308, 617, 154, 309, 619, 310, 77, 623, 312, 1251, 1252, 1253, 628, 629, 1260, 315, 316, 633, 1267, 158, 317, 4, + 318, 79, 1276, 640, 320, 644, 1289, 80, 161, 323, 324, 1298, 162, 325, 326, 81, 163, 327, 328, 657, 658, 329, 330, 1323, 1324, 331, 1327, 332, 1331, + 333, 667, 668, 669, 167, 671, 672, 336, 168, 337, 338, 678, 339, 679, 680, 340, 681, 170, 341, 683, 342, 171, 343, 1374, 688, 344, 689, 172, 1381, 691, + 692, 346, 1389, 348, 349, 699, 700, 350, 701, 702, 703, 704, 706, 353, 707, 708, 354, 709, 710, 355, 711, 356, 713, 714, 357, 715, 716, 358, 717, 89, + 179, 359, 719, 360, 721, 722, 361, 362, 725, 90, 726, 363, 727, 364, 730, 365, 366, 45, 734, 367, 735, 1471, 368, 1474, 1476, 1477, 739, 370, 1482, + 1484, 371, 743, 1488, 1489, 1490, 1491, 746, 373, 1494, 374, 46, 1499, 187, 375, 751, 1504, 376, 754, 1509, 756, 378, 757, 189, 379, 759, 1519, 760, + 380, 190, 381, 763, 5, 764, 47, 191, 383, 767, 768, 769, 192, 771, 772, 386, 773, 193, 776, 388, 194, 389, 779, 780, 390, 48, 195, 391, 785, 196, 787, + 2132, 197, 2140, 792, 2152, 2154, 2160, 398, 49, 2166, 199, 399, 2174, 400, 200, 401, 402, 100, 201, 403, 1615, 404, 202, 1621, 811, 1624, 813, 1627, + 203, 1631, 1632, 1633, 817, 204, 1640, 1641, 1642, 1643, 205, 1645, 2274, 825, 2278, 2280, 1653, 1656, 25, 1658, 1662, 1664, 1665, 1666, 1667, 835, + 1674, 209, 419, 420, 1682, 210, 843, 844, 1689, 845, 105, 211, 848, 850, 851, 852, 426, 853, 427, 856, 428, 429, 107, 862, 863, 864, 865, 434, 108, 217, + 435, 871, 872, 436, 873, 218, 219, 220, 884, 885, 221, 443, 887, 718, 888, 1777, 889, 897, 890, 445, 891, 6, 892, 446, 1241, 941, 1261, 1789, 1160, + 1492, 1792, 1793, 1794, 1500, 1796, 774, 758, 575, 558, 1801, 1802, 1803, 542, 1805, 313, 1650, 904, 1649, 1810, 1811, 1812, 453, 1498, 1486, 1325, + 1817, 56, 1157, 910, 455, 911, 1149, 1824, 1825, 1826, 1827, 1828, 457, 1266, 1088, 1280, 1833, 1834, 1835, 1836, 1081, 919, 1080, 1076, 1841, 1842, + 1843, 230, 461, 514, 500, 1848, 28, 1850, 2005, 231, 463, 1854, 186, 554, 464, 548, 1818, 232, 465, 1657, 1651, 932, 466, 933, 116, 1334, 1333, 935, + 962, 936, 369, 682, 781, 938, 1434, 939, 1433, 940, 470, 58, 117, 942, 1229, 1106, 1090, 1066, 926, 945, 918, 946, 473, 947, 912, 905, 474, 949, 118, + 950, 475, 951, 1048, 952, 476, 953, 886, 690, 477, 955, 372, 14, 29, 957, 150, 239, 2168, 578, 16, 594, 75, 961, 2287, 240, 481, 456, 448, 447, 482, + 454, 506, 241, 483, 618, 82, 444, 484, 762, 27, 242, 485, 74, 1783, 765, 504, 60, 766, 243, 1849, 1204, 1196, 2011, 488, 1032, 518, 244, 841, 832, 826, + 1960, 1961, 816, 130, 245, 491, 227, 228, 1968, 1969, 533, 229, 1069, 493, 198, 1975, 1976, 494, 61, 57, 99, 495, 1982, 1983, 670, 496, 576, 568, 377, + 1989, 995, 169, 1992, 1993, 1994, 59, 1996, 1997, 999, 1999, 147, 2001, 1001, 140, 345, 501, 347, 2007, 284, 2009, 17, 125, 35, 503, 2014, 2015, 71, + 2017, 1144, 956, 1142, 2021, 1508, 2023, 2024, 2025, 2026, 490, 492, 507, 151, 152, 2032, 508, 2034, 188, 505 +}; +static const std::vector ROI_VOXELS_27 = { + 997, 615, 1291, 934, 998, 1292, 1101, 839, 616, 648, 712, 744, 776, 1868, 840, 617, 1295, 1000, 389, 405, 841, 618, 1297, 1001, 842, 619, 906, 1108, + 1002, 390, 1109, 620, 907, 1003, 1812, 812, 621, 2005, 526, 407, 622, 1997, 1996, 1989, 1005, 527, 1370, 1818, 623, 1811, 1116, 1435, 1006, 1308, 815, + 1436, 624, 1803, 943, 392, 1007, 529, 816, 848, 649, 1657, 1375, 1694, 1008, 393, 817, 849, 626, 913, 1651, 1696, 1643, 1500, 1123, 1697, 627, 914, + 1124, 1698, 1492, 394, 819, 1444, 628, 1304, 1381, 1379, 823, 388, 1382, 999, 629, 661, 1373, 1702, 781, 395, 411, 1703, 630, 662, 769, 1194, 1881, + 1866, 822, 1195, 631, 663, 1132, 1196, 1857, 396, 1133, 1452, 1712, 1711, 1389, 1453, 1705, 1704, 824, 856, 1695, 920, 1547, 1200, 811, 397, 825, 857, + 1539, 921, 1536, 1202, 1535, 1534, 826, 1203, 635, 417, 1140, 1204, 382, 398, 827, 1205, 636, 1333, 955, 1372, 1371, 1334, 828, 1462, 412, 1217, 1198, + 1197, 383, 399, 847, 1464, 893, 647, 650, 675, 651, 1083, 830, 1466, 639, 1084, 1658, 1212, 384, 400, 831, 1213, 640, 927, 638, 425, 1533, 410, 832, + 1374, 641, 928, 1211, 737, 385, 401, 833, 610, 1281, 1199, 961, 1218, 1100, 1091, 1300, 611, 898, 1092, 962, 1220, 386, 402, 1667, 612, 899, 404, 813, + 995, 1541, 391, 728, 613, 900, 409, 1160, 996, 387, 403, 752, 614, 818, 1426, 406, 1301 +}; +static const std::vector ROI_VOXELS_28 = { + 1019, 1020, 2042, 2043, 2044, 2045, 2046, 512, 513, 2053, 2055, 2057, 2059, 2063, 1033, 517, 1035, 2071, 519, 2077, 520, 2081, 521, 2087, 1045, 1046, + 2093, 32, 2101, 526, 527, 1056, 1057, 1058, 2121, 1064, 1065, 1070, 1071, 1072, 538, 539, 33, 1083, 1084, 543, 2181, 1092, 2187, 1095, 548, 274, 549, + 2197, 2199, 275, 551, 2205, 1104, 1105, 2211, 2215, 1109, 555, 556, 1113, 34, 1116, 559, 560, 1123, 1124, 563, 564, 565, 1132, 1133, 284, 569, 1140, + 2293, 2299, 2301, 2307, 579, 1159, 1162, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 147, 2361, 1182, + 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1201, 1206, 1207, 1208, 1209, 1210, 303, 1214, 1215, 1216, 1219, 305, 1222, 1223, 306, + 1227, 1228, 1238, 1239, 1240, 38, 77, 1248, 1249, 625, 313, 1257, 1258, 1259, 1264, 1265, 158, 317, 318, 39, 319, 1278, 1281, 642, 643, 645, 1291, 1292, + 323, 324, 1300, 1301, 652, 326, 653, 1308, 655, 656, 659, 660, 331, 1326, 664, 332, 665, 1332, 333, 334, 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, + 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 169, 1357, 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1376, 344, + 1378, 1380, 345, 1383, 1384, 1385, 1386, 86, 1388, 347, 1390, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1403, 1404, 1405, 1406, 1407, 1408, 1409, + 705, 176, 1413, 1414, 1415, 1416, 1417, 1418, 88, 177, 355, 712, 1425, 1426, 178, 357, 358, 1435, 1436, 1440, 1441, 1442, 1443, 1444, 723, 724, 1449, + 1450, 1451, 1452, 1453, 728, 732, 733, 183, 737, 184, 1480, 1481, 741, 185, 1487, 744, 1493, 748, 749, 750, 751, 752, 1505, 1506, 1507, 756, 1513, 1514, + 94, 1516, 1517, 1518, 760, 1521, 761, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 767, 768, 1537, 1538, 2054, 2056, 2058, 1542, 1543, + 1544, 1545, 1546, 96, 193, 1549, 775, 2078, 2082, 1554, 1555, 778, 1557, 779, 1559, 780, 1561, 1562, 1563, 782, 1565, 783, 2110, 1568, 785, 1571, 786, + 1573, 1574, 1575, 788, 2130, 789, 98, 790, 1581, 791, 793, 1587, 794, 1589, 795, 796, 24, 797, 1595, 798, 799, 800, 1601, 2180, 802, 2188, 2190, 804, + 2196, 2198, 806, 1614, 808, 2210, 809, 810, 2218, 1626, 814, 408, 1634, 1635, 1644, 1652, 413, 414, 2292, 207, 415, 2300, 1663, 2306, 2308, 834, 1671, + 1672, 418, 837, 1676, 1677, 1678, 1679, 1680, 1681, 1684, 1685, 1686, 1687, 1688, 422, 213, 1691, 1692, 1693, 949, 942, 421, 424, 940, 1699, 1700, 1701, + 1966, 646, 932, 774, 773, 1707, 1708, 1709, 1710, 759, 758, 757, 575, 1715, 1716, 1717, 1718, 1719, 1720, 26, 558, 557, 1724, 1725, 1726, 1727, 1728, + 432, 1730, 1731, 216, 433, 1734, 542, 868, 528, 869, 1739, 870, 349, 1742, 1743, 348, 339, 1746, 1747, 1748, 437, 338, 337, 336, 438, 1754, 1755, 325, + 439, 312, 2219, 880, 440, 881, 1763, 882, 441, 883, 2209, 2201, 1769, 2200, 2100, 2099, 2090, 2089, 2088, 1776, 2076, 2075, 2067, 2066, 2065, 1782, + 2047, 1151, 1936, 893, 2139, 1788, 1914, 895, 1582, 896, 1577, 1938, 1795, 898, 449, 899, 1980, 900, 2116, 283, 293, 1804, 335, 903, 1908, 214, 215, + 223, 234, 906, 1890, 907, 235, 431, 1762, 909, 1761, 1753, 1738, 1729, 1600, 1594, 1588, 913, 1586, 914, 1424, 1277, 430, 916, 1878, 917, 1721, 1567, + 1566, 1556, 1387, 920, 1243, 921, 1242, 1050, 1036, 1034, 1022, 924, 1021, 925, 2363, 952, 1023, 927, 854, 1856, 846, 838, 836, 674, 673, 1862, 1863, + 1864, 1865, 933, 637, 934, 943, 935, 442, 1872, 1873, 1874, 1875, 938, 1877, 939, 1879, 1880, 423, 941, 416, 1884, 1885, 1886, 1887, 514, 1889, 945, + 1891, 946, 226, 1894, 225, 224, 1897, 1898, 1899, 950, 212, 951, 1903, 1904, 208, 206, 97, 238, 1909, 1910, 1911, 1912, 1913, 957, 2103, 2102, 1948, + 959, 1181, 960, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1576, 1548, 965, 1540, 966, 1221, 967, 1935, 968, 1937, 969, 1939, 970, 1974, 971, 529, 972, + 765, 973, 1947, 974, 487, 975, 1522, 976, 1958, 977, 632, 978, 1620, 979, 1959, 980, 634, 981, 763, 982, 764, 983, 1967, 984, 766, 985, 894, 986, 1973, + 987, 771, 988, 772, 989, 2062, 990, 1981, 991, 518, 992, 902, 993, 1553, 994, 56, 654, 1564, 1572, 1108, 1101, 1100, 535, 499, 928, 1078, 167, 500, 168, + 801, 1091, 547, 803, 931, 1004, 2189, 677, 805, 550, 1356, 807, 936, 554, 1876, 1673, 1377, 95, 947, 1011, 346, 1012, 1180, 1013, 87, 1014, 829, 585, + 2362, 2070, 858, 1512, 742, 1250 +}; +static const std::vector ROI_VOXELS_29 = { + 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2049, 2051, 2053, 2055, 2057, 515, 2061, 2063, 2065, 2067, 2069, 2071, 2073, + 2075, 2077, 2079, 2081, 2083, 2085, 2087, 2089, 2091, 2093, 2095, 2097, 2099, 2101, 526, 2107, 2109, 2113, 1058, 1059, 530, 531, 2125, 2127, 2129, 533, + 2133, 2135, 2137, 1070, 1071, 2143, 1073, 2147, 1075, 1076, 1077, 1078, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 544, 1089, 545, 2181, 546, 1093, + 1094, 2189, 1096, 1097, 2195, 2197, 2199, 1101, 1102, 1103, 2207, 1105, 553, 2213, 2215, 2217, 1110, 1111, 1112, 2225, 2227, 2229, 1116, 1117, 1118, + 1119, 2239, 2241, 2243, 2245, 2247, 1125, 1126, 1127, 1128, 2257, 2259, 2261, 2263, 2265, 1134, 1135, 1136, 1137, 2279, 2283, 1143, 2289, 2291, 2293, + 2295, 2297, 2299, 2301, 2303, 2305, 2307, 2309, 2311, 2317, 2319, 2321, 2323, 2325, 2327, 2329, 2331, 2333, 2335, 2337, 2339, 2341, 2343, 2345, 2347, + 2349, 2351, 2353, 2355, 2357, 2359, 2361, 2363, 2369, 2371, 2373, 2375, 2377, 2379, 2381, 2383, 2385, 2387, 2389, 2391, 2393, 1229, 1230, 1231, 1238, + 1239, 1240, 1241, 1250, 1251, 1252, 1253, 1256, 1257, 1258, 1259, 1260, 315, 1263, 1264, 316, 1274, 1275, 1277, 1278, 1280, 1281, 1282, 1283, 1285, + 1286, 1287, 1291, 1292, 1293, 1294, 1296, 1300, 1301, 1302, 1303, 1305, 1306, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1317, 1318, 1321, 1322, 1333, + 1334, 342, 343, 351, 352, 705, 353, 354, 1418, 1421, 1422, 1423, 712, 1425, 1426, 1429, 1430, 1431, 1432, 1433, 717, 1435, 1436, 1439, 1440, 1441, 1442, + 1443, 1444, 1445, 723, 1447, 724, 1449, 1450, 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 730, 1461, 731, 732, 733, 1468, 1469, 1470, 1471, 2219, + 1474, 1475, 738, 1683, 739, 2211, 740, 2210, 2209, 1483, 742, 2201, 743, 1818, 744, 2100, 745, 1106, 746, 1099, 747, 1098, 748, 1738, 749, 1499, 750, + 1090, 1502, 2059, 752, 1746, 753, 2185, 754, 1509, 1510, 1511, 2186, 2191, 1631, 1924, 1633, 1922, 1642, 1519, 1520, 1674, 1682, 1910, 1792, 1802, 1834, + 1848, 1850, 1069, 1107, 2390, 529, 1762, 905, 926, 2048, 2050, 2052, 2054, 2056, 2058, 2060, 2062, 2064, 2066, 2068, 2070, 2072, 2074, 2076, 2078, 2080, + 2082, 2084, 2086, 2088, 2090, 1558, 1559, 2096, 1561, 781, 1601, 1064, 2106, 2108, 1610, 2112, 2114, 1417, 2118, 2120, 2122, 2124, 2126, 2128, 1575, + 1581, 2134, 1580, 2138, 1586, 2142, 1584, 2146, 2148, 1587, 1588, 1574, 1424, 1591, 1592, 1593, 1594, 1595, 1072, 536, 1598, 1599, 1600, 2178, 2180, + 2182, 1604, 1605, 2188, 2190, 2192, 2194, 2196, 1611, 2200, 2202, 2204, 2206, 1616, 1617, 1618, 1619, 1812, 2218, 1622, 2222, 2224, 2226, 2228, 2230, + 1628, 2234, 1630, 2238, 2240, 2242, 2244, 2246, 2248, 2250, 1638, 1639, 2256, 2258, 2260, 2262, 2264, 2266, 1646, 1092, 1648, 1667, 1658, 1651, 1657, + 1643, 1500, 2286, 1492, 2290, 2292, 2294, 2296, 2298, 2300, 2302, 2304, 2306, 2308, 2310, 1160, 1669, 2316, 2318, 2320, 2322, 2324, 1675, 2328, 2330, + 2332, 2334, 2336, 2338, 2340, 2342, 2344, 2346, 2348, 2350, 2352, 2354, 2356, 2358, 2360, 2362, 2364, 1632, 1640, 2370, 2372, 2374, 2376, 2378, 2380, + 2382, 2384, 2386, 2388, 1707, 2392, 1689, 776, 769, 729, 1713, 1714, 1715, 1716, 1717, 720, 552, 314, 1434, 1722, 1723, 1724, 1725, 863, 1261, 864, + 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 869, 1739, 870, 1741, 1742, 1743, 1744, 1745, 873, 1068, 1067, 1066, 1049, 1751, 1752, 1753, 919, + 918, 912, 911, 1758, 1759, 1760, 1761, 881, 904, 882, 1765, 1766, 897, 892, 1123, 872, 1771, 1772, 871, 718, 711, 1140, 1133, 1778, 1779, 1132, 1124, + 891, 1109, 1784, 1785, 1786, 1787, 894, 1108, 1790, 1791, 896, 1793, 1794, 1100, 898, 1797, 1798, 1799, 1800, 1801, 901, 1803, 902, 1091, 903, 1807, + 1808, 1809, 1810, 1811, 906, 899, 907, 1815, 908, 1817, 909, 921, 927, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, + 917, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847, 924, 1849, 925, 1851, 1852, 1853, 1854, 1855, 928, 920, 929, 1859, + 930, 1861, 1862, 1863, 914, 913, 900, 1867, 934, 1869, 1870, 1871, 1872, 1873, 1874, 893, 1876, 737, 728, 1879, 527, 1708, 1882, 1883, 1884, 1885, 943, + 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 955, 1911, + 1912, 1666, 1665, 1664, 958, 1917, 1918, 1919, 1920, 1921, 961, 1923, 962, 1925, 1624, 1508, 2212, 2203, 1930, 1931, 1932, 1933, 2193, 1935, 1936, 1937, + 2184, 2183, 2179, 2092, 1942, 1943, 1944, 883, 1860, 1858, 1740, 1706, 2251, 2249, 1952, 1446, 1954, 1448, 1265, 2187, 2141, 2267, 2272, 895, 2233, + 1963, 1964, 2326, 516, 2098, 2269, 2220, 1970, 1971, 1972, 2255, 1816, 2254, 2253, 1977, 1978, 1979, 2252, 2205, 1114, 2237, 1984, 1985, 1986, 915, 532, + 1989, 916, 1065, 534, 1579, 1994, 2136, 1996, 1997, 537, 1585, 2000, 922, 923, 931, 1095, 2005, 2198, 1104, 2008, 2208, 937, 2011, 1625, 1623, 1113, + 1629, 2016, 2236, 1120, 944, 1636, 1637, 2022, 1129, 1606, 2025, 2026, 1690, 2028, 2029, 2030, 2031, 2032, 2033, 880, 2035, 755 +}; +static const std::vector ROI_VOXELS_30 = { + 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2049, 2051, 2053, 2055, 2057, 515, 2061, 2063, 517, 2069, 2071, 519, 2079, 2081, 261, + 2093, 1049, 65, 1052, 527, 2111, 264, 1058, 2117, 530, 265, 2123, 532, 1065, 533, 1067, 534, 1070, 1071, 536, 1073, 537, 1078, 67, 1084, 543, 544, 272, + 545, 2181, 136, 1093, 2187, 1095, 2191, 274, 2195, 68, 2199, 275, 2203, 2205, 1104, 1105, 553, 2215, 1109, 1110, 556, 1113, 557, 1115, 1116, 1117, 559, + 560, 1121, 1122, 1123, 1124, 1125, 1126, 564, 1130, 1131, 1132, 1133, 1134, 1135, 284, 569, 1140, 1143, 2289, 2291, 2293, 2295, 2297, 2299, 2301, 2303, + 2305, 2307, 579, 1159, 1160, 1161, 1162, 1165, 1166, 1167, 1168, 1169, 585, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 147, 2361, 1182, 1183, + 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1221, 1222, 1223, 1224, 1225, 1226, 76, 1229, 1230, 1231, 1238, 1239, 1240, 1241, 77, 312, + 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 78, 1260, 315, 1262, 1263, 1264, 1265, 158, 317, 1270, 1271, 1272, 318, 637, 1279, 1281, 1282, + 1283, 1284, 1291, 1292, 1293, 1294, 324, 1300, 1301, 1302, 1303, 326, 1308, 1309, 1313, 1315, 164, 659, 1319, 660, 165, 331, 1326, 332, 1332, 333, 1334, + 1335, 1336, 1339, 167, 1341, 1342, 1343, 1344, 1345, 1346, 1347, 168, 1349, 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1360, 1361, + 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 950, 516, 942, 343, 941, 1180, 935, 344, 1530, 526, 1380, 345, 780, 774, 773, 346, 768, 226, 694, 347, + 1390, 1391, 235, 348, 759, 758, 757, 1397, 1398, 1399, 1400, 1401, 1402, 421, 575, 351, 565, 558, 1408, 352, 1410, 1411, 1412, 353, 551, 542, 528, 354, + 349, 339, 338, 355, 711, 337, 712, 336, 1426, 325, 323, 1429, 313, 1320, 1316, 358, 717, 1435, 1436, 1437, 1438, 1439, 1440, 1441, 954, 1023, 1444, + 1445, 1446, 854, 724, 846, 838, 837, 1452, 1453, 1454, 1455, 728, 836, 729, 674, 730, 1461, 731, 673, 732, 646, 733, 499, 487, 1100, 442, 1471, 1788, + 1804, 1474, 439, 738, 1558, 739, 437, 740, 433, 146, 431, 742, 166, 743, 1487, 744, 1620, 745, 423, 746, 1493, 747, 1495, 748, 422, 749, 1499, 750, + 1501, 751, 416, 752, 1505, 1506, 1507, 1508, 1509, 755, 415, 756, 1513, 1514, 316, 1516, 1517, 1518, 1519, 760, 1521, 1522, 1523, 1524, 1525, 763, 1527, + 1528, 1529, 765, 1531, 1532, 234, 767, 225, 2048, 2050, 2052, 2054, 2056, 224, 2060, 2062, 772, 223, 2068, 2070, 193, 1549, 1550, 1551, 2080, 2082, 777, + 216, 778, 1557, 2092, 1559, 1560, 1561, 781, 2102, 2104, 215, 783, 2110, 784, 1569, 1570, 214, 786, 213, 1552, 208, 788, 2130, 1578, 98, 790, 207, 791, + 1583, 206, 97, 793, 1072, 794, 1589, 1590, 458, 796, 897, 797, 450, 798, 262, 799, 937, 800, 2178, 2180, 2182, 2184, 2186, 2188, 2190, 2192, 2194, 2196, + 2198, 806, 2202, 807, 169, 808, 135, 809, 113, 810, 112, 103, 66, 1624, 2116, 1626, 2193, 930, 546, 2294, 1631, 1632, 1633, 1818, 1812, 718, 871, 2103, + 1658, 1640, 1657, 1642, 1643, 1644, 801, 1500, 1492, 1333, 1512, 782, 1651, 1652, 776, 1654, 769, 12, 2290, 2292, 1659, 1660, 2298, 2300, 2302, 2304, + 2306, 2308, 1667, 1668, 1948, 764, 1671, 1672, 1673, 1674, 1848, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1938, 1684, 1685, 1686, 1687, 1688, 1689, + 357, 1691, 2360, 1693, 1926, 1914, 805, 424, 912, 1966, 212, 2359, 2121, 1582, 1577, 1576, 1706, 1707, 1708, 1568, 1548, 1540, 1409, 1713, 1714, 1715, + 1716, 1717, 1269, 1268, 273, 430, 1722, 1723, 1724, 1725, 863, 157, 864, 432, 55, 753, 1732, 1733, 1734, 720, 552, 531, 869, 314, 1740, 1741, 1742, + 1743, 872, 2139, 873, 1747, 1748, 1749, 1750, 1980, 1974, 438, 1754, 1755, 1756, 1757, 771, 1958, 880, 440, 881, 1763, 1764, 441, 883, 1782, 1261, 1769, + 1770, 1614, 1151, 761, 1434, 1433, 1776, 1106, 1099, 1098, 1090, 1068, 891, 1066, 13, 1059, 893, 914, 894, 1526, 895, 918, 1792, 1793, 1794, 1795, 898, + 449, 899, 905, 900, 1801, 1802, 1803, 902, 451, 1806, 892, 904, 452, 1810, 1811, 906, 1813, 1814, 1108, 908, 1817, 909, 1819, 1820, 1101, 911, 1092, + 1824, 1825, 1826, 1827, 1828, 1091, 915, 1083, 916, 1833, 917, 114, 1836, 459, 919, 737, 920, 1841, 1842, 1843, 922, 927, 923, 921, 924, 462, 1850, 115, + 926, 913, 1854, 907, 928, 529, 1858, 1859, 1860, 1861, 1862, 1863, 932, 1663, 933, 1867, 934, 1869, 1870, 1871, 1872, 1873, 1874, 1348, 1876, 1340, 939, + 1181, 940, 1170, 1882, 1883, 1884, 1885, 943, 1887, 944, 1835, 945, 2183, 1892, 1893, 947, 1666, 1665, 901, 949, 770, 1900, 1901, 951, 1903, 1904, 896, + 23, 970, 238, 2296, 955, 795, 803, 1913, 957, 1915, 1916, 804, 959, 802, 960, 789, 961, 775, 962, 964, 963, 1927, 1928, 1929, 965, 2197, 966, 705, 967, + 2212, 968, 1849, 969, 1939, 1940, 1941, 971, 754, 972, 1894, 973, 1947, 974, 1949, 1950, 1273, 976, 766, 977, 1834, 978, 2179, 979, 1959, 980, 1664, + 981, 518, 982, 903, 983, 1967, 984, 779, 985, 56, 986, 1973, 987, 1062, 988, 1064, 989, 535, 990, 1981, 991, 2358, 992, 925, 993, 2362, 994, 1989, 1990, + 1991, 2363, 975, 1994, 929, 1996, 1997, 1998, 547, 1094, 931, 548, 2189, 250, 2005, 2006, 2204, 1102, 1103, 936, 2011, 251, 554, 938, 555, 342, 2185, + 946, 563, 252, 1902, 952, 785, 1153, 2025, 2026, 126, 253, 1692, 723, 106, 2032, 870, 1259, 2035, 882 +}; +static const std::vector ROI_VOXELS_31 = { + 1736, 2064, 1737, 1291, 934, 2066, 1738, 1292, 1101, 1930, 1739, 1612, 1931, 744, 1613, 2072, 2200, 2073, 2201, 2074, 2075, 1934, 2077, 1425, 1744, + 2207, 1426, 2208, 906, 1108, 1937, 1746, 2083, 1109, 2084, 2085, 2086, 2087, 1430, 2089, 2217, 1431, 2218, 526, 2219, 1942, 1751, 1879, 2222, 2095, + 2223, 2096, 1753, 1307, 1116, 1945, 1308, 2227, 1946, 2101, 943, 752, 529, 2231, 2232, 2106, 1758, 2107, 2108, 1759, 913, 1760, 1888, 1442, 1761, 914, + 1124, 1443, 1762, 2115, 1890, 1444, 1891, 1955, 2119, 1956, 1765, 1574, 1957, 1766, 1575, 1448, 1767, 1895, 1449, 1768, 1896, 1450, 2211, 2210, 1132, + 1451, 2209, 1579, 1133, 1452, 2100, 1580, 1899, 728, 2099, 1581, 2090, 2088, 1773, 920, 2078, 1965, 1774, 2076, 2067, 1456, 1775, 921, 2065, 1457, 928, + 1585, 2058, 1458, 1745, 1586, 1905, 1936, 1935, 1587, 1906, 1460, 2097, 1588, 1907, 1421, 1447, 1584, 1908, 1083, 1781, 2206, 1909, 1889, 1898, 1591, + 1910, 1897, 893, 1592, 1911, 1432, 2098, 1593, 1912, 1601, 1100, 1084, 1424, 1467, 1594, 1595, 1418, 1932, 1277, 927, 1436, 1453, 1278, 1435, 1301, + 1300, 2109, 1598, 1917, 737, 1140, 1599, 1918, 1123, 1281, 1600, 1919, 1285, 2047, 1091, 1920, 1729, 898, 1092, 1921, 1730, 907, 2368, 1922, 1731, 899, + 1604, 1923, 1752, 1286, 1605, 1924, 712, 900, 1606, 1925, 527, 2059, 1607, 2315, 1735, 1422, 1423, 1417, 1933 +}; +static const std::vector ROI_VOXELS_32 = { + 1530, 1532, 1540, 1548, 1558, 1568, 1574, 1576, 1580, 1582, 1584, 1586, 1588, 1592, 1594, 24, 1598, 1600, 1602, 1604, 1608, 1610, 1612, 1614, 1616, + 1618, 1620, 1622, 1626, 1630, 1634, 1644, 1652, 1654, 1658, 1660, 1668, 1670, 1672, 1676, 1678, 1680, 1684, 1686, 1688, 1692, 1706, 1714, 1722, 26, + 1730, 1732, 1736, 1738, 1740, 1744, 1746, 1748, 1752, 1754, 1758, 1760, 1762, 1774, 1776, 1778, 1780, 1782, 1784, 1786, 1788, 1790, 1796, 1800, 1804, + 1806, 1812, 1814, 1818, 1820, 460, 1844, 1858, 1860, 1870, 469, 1882, 1888, 1890, 1892, 1896, 1898, 1900, 1902, 1906, 1908, 1910, 1912, 1914, 1918, + 1920, 1922, 1924, 1926, 1930, 1932, 1936, 1938, 1942, 1944, 1948, 1952, 1954, 1956, 1958, 1960, 1962, 1964, 1966, 1968, 1970, 1972, 1974, 1976, 1978, + 1980, 1982, 1984, 1986, 1988, 1990, 1992, 1996, 1998, 2002, 2004, 2006, 2010, 2012, 2014, 2018, 2020, 2024, 2028, 2034, 2036, 2038, 2040, 510, 31, 511, + 2049, 2061, 516, 2069, 2073, 2077, 520, 2085, 2089, 2097, 525, 526, 527, 2113, 529, 2121, 2125, 2129, 533, 2137, 2141, 2145, 2149, 2153, 2157, 2161, + 2165, 2169, 2173, 2177, 545, 2185, 2193, 549, 550, 2209, 553, 2217, 2225, 2229, 2233, 2237, 2241, 2245, 2249, 2253, 2257, 2261, 2265, 2269, 2273, 569, + 2281, 2285, 2289, 573, 2297, 2305, 2317, 2321, 2325, 2329, 2333, 2337, 2341, 2345, 2349, 2353, 2357, 590, 591, 2369, 593, 2377, 2381, 2385, 2389, 2393, + 599, 600, 601, 602, 606, 607, 608, 609, 38, 39, 666, 676, 686, 696, 711, 712, 717, 718, 728, 730, 731, 45, 736, 737, 739, 740, 741, 743, 744, 746, 747, + 46, 752, 754, 755, 761, 762, 47, 769, 770, 775, 776, 777, 778, 781, 782, 783, 784, 786, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, + 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 859, 860, 861, 863, 864, 867, 871, 872, 873, 877, 878, 891, 892, 893, 55, 897, 898, 899, 900, 901, + 904, 905, 906, 907, 908, 56, 911, 912, 913, 914, 915, 918, 919, 920, 921, 922, 923, 57, 927, 928, 929, 930, 934, 937, 58, 943, 944, 955, 956, 59, 959, + 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 60, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, + 990, 991, 992, 993, 994, 1015, 1016, 2050, 1029, 1031, 2066, 2074, 2078, 1041, 2086, 2090, 2098, 2102, 2106, 1055, 2114, 1059, 2122, 2126, 2130, 2134, + 2138, 2142, 2146, 2150, 2154, 2158, 2162, 2166, 2170, 2174, 2178, 2182, 2186, 2194, 1099, 2202, 2206, 2210, 1107, 1109, 2222, 2226, 2234, 2238, 2242, + 2246, 2250, 2254, 2258, 2262, 2266, 2270, 2274, 2278, 2282, 2286, 2290, 2294, 2298, 2302, 1153, 1155, 2318, 2322, 2326, 2330, 2334, 2338, 2342, 2346, + 2350, 2354, 2358, 1181, 1183, 2370, 2374, 2378, 2382, 2386, 2390, 1221, 1223, 1229, 1231, 1233, 1237, 1241, 1245, 1247, 1251, 1253, 1255, 1261, 1263, + 1267, 1271, 1273, 1275, 1277, 1281, 1283, 1285, 1287, 1289, 1291, 1293, 1295, 1297, 1301, 1303, 1305, 1307, 1309, 1311, 1313, 1327, 1329, 1333, 1335, + 1337, 1339, 1341, 1343, 1345, 1347, 1349, 1351, 1353, 1355, 1357, 1359, 1361, 1363, 1365, 1367, 1369, 85, 86, 1397, 1399, 87, 1409, 1417, 1419, 1421, + 1423, 1425, 1429, 1431, 1433, 1435, 1439, 1443, 1445, 1447, 1449, 1451, 1453, 1455, 1457, 1461, 1463, 1467, 1469, 92, 1487, 1493, 1495, 1497, 1501, + 1503, 1505, 1507, 1513, 1515, 94, 1521, 1523, 1525, 1527, 1529, 5, 95, 96, 1557, 1575, 1577, 1579, 1581, 1585, 1587, 1589, 1591, 1593, 1595, 1599, 1601, + 1605, 1607, 1613, 1615, 1617, 1619, 1621, 1623, 1625, 1627, 1643, 1645, 1647, 1651, 1653, 1655, 1657, 1659, 1661, 1663, 1667, 1671, 1673, 1677, 1679, + 1681, 1685, 1687, 1691, 105, 1713, 1723, 107, 1729, 1731, 1733, 1735, 1737, 1739, 1741, 1745, 1747, 1751, 1753, 1755, 1759, 1761, 1763, 1765, 1769, + 1771, 1773, 1775, 1777, 1779, 1781, 1783, 1785, 6, 1789, 1791, 1795, 1803, 1805, 1811, 1813, 1819, 1845, 1859, 1861, 1867, 1869, 1871, 1879, 1883, 117, + 1889, 1891, 1893, 1895, 1897, 1899, 1901, 1905, 1907, 1909, 1911, 1913, 1917, 1919, 1921, 1923, 1925, 1927, 1931, 1933, 1935, 1937, 1939, 1943, 1945, + 1947, 1951, 1953, 1955, 1957, 1959, 1961, 1963, 1965, 1967, 1969, 1971, 1973, 1975, 1977, 1979, 1981, 1983, 1985, 1987, 1989, 1991, 1993, 1995, 1997, + 1999, 2001, 2003, 2005, 2007, 2009, 2013, 2015, 2017, 2019, 2021, 2023, 2027, 2029, 2035, 2037, 2039, 2041, 7, 127, 2047, 2051, 128, 2067, 129, 2079, + 2083, 2087, 130, 2095, 2099, 2103, 2107, 2115, 2119, 2127, 2131, 2135, 2139, 2143, 2147, 2151, 2155, 2159, 2163, 2167, 2171, 2175, 2179, 2183, 2191, + 2195, 2203, 2207, 2211, 138, 2223, 2231, 2235, 2239, 2243, 2247, 140, 2255, 2259, 2263, 2267, 2271, 2275, 2279, 2283, 2287, 2291, 2295, 2303, 2315, + 2319, 2323, 2327, 2331, 2335, 2339, 2343, 2347, 2351, 2355, 2359, 147, 2371, 2375, 2379, 2383, 2387, 2391, 150, 151, 152, 157, 158, 161, 164, 165, 166, + 167, 168, 169, 173, 174, 175, 176, 177, 178, 180, 181, 182, 183, 184, 185, 188, 189, 192, 196, 197, 200, 201, 204, 205, 221, 1069, 1276, 1266, 1088, + 1079, 1074, 2219, 2218, 2201, 2200, 2101, 584, 2088, 582, 2075, 2065, 2059, 2058, 1450, 2084, 363, 1418, 1278, 541, 540, 509, 2251, 321, 311, 1192, 93, + 91, 84, 83, 37, 36, 30, 22, 231, 1116, 479, 145, 124, 123, 49, 592, 381, 1517, 1160, 1172, 2110, 1549, 72, 1166, 1169, 1180, 1222, 273, 272, 146, 76, + 1152, 1161, 581, 256, 1163, 1030, 579, 521, 14, 1043, 583, 32, 1596, 240, 1171, 1053, 2109, 241, 1062, 532, 266, 2133, 534, 267, 536, 537, 538, 1077, + 539, 244, 16, 33, 1085, 1086, 1087, 1091, 546, 1093, 1173, 1096, 1097, 137, 275, 1102, 1103, 1110, 1111, 1112, 278, 34, 69, 139, 1117, 1119, 1120, 562, + 1125, 1126, 1134, 1135, 2277, 571, 1143, 572, 17, 71, 574, 108, 1151, 254, 1176, 334, 15, 255, 2048, 2052, 1028, 2060, 2064, 2068, 2072, 2076, 2080, + 1042, 1044, 2092, 2096, 2100, 1052, 1054, 2112, 2116, 2120, 2124, 2128, 2132, 2136, 2140, 2144, 2148, 2152, 2156, 2160, 2164, 2168, 2172, 2176, 1090, + 2184, 1094, 2192, 274, 1100, 2204, 2208, 2212, 1108, 277, 2224, 2228, 2232, 2236, 2240, 2244, 2248, 2252, 2256, 2260, 2264, 2268, 2272, 2276, 2280, + 2284, 2288, 1174, 2296, 1175, 2304, 1154, 73, 2316, 2320, 2324, 2328, 2332, 2336, 2340, 2344, 2348, 2352, 2356, 2360, 1182, 2368, 2372, 2376, 2380, + 2384, 2388, 2392, 1184, 1185, 1186, 2373, 1190, 1191, 302, 1193, 598, 1106, 1098, 1073, 305, 1068, 306, 1067, 1230, 1066, 1234, 1049, 926, 1114, 77, + 1133, 1246, 1101, 1140, 1252, 1083, 1256, 1124, 1260, 315, 1132, 316, 4, 1123, 1272, 1274, 19, 319, 1092, 1282, 1284, 1286, 1084, 322, 1292, 1294, 1296, + 1298, 1300, 1302, 1304, 1306, 1308, 1310, 1312, 1314, 335, 329, 116, 330, 1189, 1326, 1328, 1330, 1332, 1334, 1336, 1338, 1340, 1342, 1344, 1346, 1348, + 1350, 1352, 1354, 1356, 1358, 1360, 1362, 1364, 1366, 1368, 342, 1693, 343, 1188, 1187, 1380, 1179, 1178, 1177, 1170, 1390, 1168, 1458, 1167, 1398, + 1165, 25, 1159, 88, 1408, 356, 257, 353, 365, 354, 380, 1422, 1424, 1426, 1428, 1430, 1432, 1434, 1436, 1438, 2108, 1442, 1444, 1446, 1448, 362, 1452, + 1454, 1456, 364, 1460, 1462, 1464, 1466, 1468, 1470, 118, 974, 376, 369, 1480, 370, 379, 371, 1488, 372, 1492, 1494, 1496, 1531, 1500, 375, 1164, 1506, + 1162, 48, 1512, 1514, 1516, 1518, 1787, 1522, 1524, 1526, 1528, 61 +}; +static const std::vector ROI_VOXELS_33 = { + 1018, 2037, 1019, 2039, 1020, 2041, 2042, 2043, 2044, 2045, 2046, 2049, 2051, 2053, 2055, 2057, 2061, 2063, 1033, 2069, 2071, 2079, 2081, 1045, 1046, + 2093, 526, 527, 1056, 1057, 1058, 265, 2127, 2129, 2133, 2135, 2137, 1070, 2141, 2143, 2147, 1078, 67, 1084, 2179, 2181, 136, 2185, 2187, 1095, 2191, + 2193, 2195, 68, 2199, 1101, 2203, 2205, 1104, 1105, 1107, 2215, 1109, 1111, 1112, 2225, 1114, 2229, 1116, 2233, 1119, 2239, 2241, 2243, 2245, 2247, + 2249, 2251, 2253, 2255, 2257, 2259, 2261, 2263, 2265, 2267, 2269, 2279, 2283, 2289, 2291, 2293, 2295, 2297, 2299, 2301, 2303, 2305, 2307, 2319, 2321, + 2323, 2325, 2327, 2329, 2331, 2333, 2335, 2337, 2339, 2341, 2343, 2345, 2347, 2349, 2351, 2353, 2355, 2357, 2359, 2361, 2363, 2371, 2373, 2375, 2377, + 2379, 2381, 2383, 2385, 2387, 2389, 2391, 2393, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1211, 1212, 1213, 1214, 1215, 1216, 1217, + 1218, 610, 611, 612, 613, 1227, 1228, 615, 616, 617, 1235, 1236, 1238, 1239, 1240, 621, 622, 623, 624, 1249, 1250, 626, 627, 628, 1257, 1258, 78, 630, + 631, 1264, 1265, 633, 634, 635, 636, 637, 638, 639, 640, 1281, 641, 642, 643, 644, 645, 1291, 1292, 647, 648, 649, 1300, 1301, 651, 652, 653, 654, 655, + 1312, 657, 659, 660, 661, 662, 663, 664, 665, 667, 668, 669, 670, 673, 674, 675, 677, 678, 679, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1379, + 1381, 1382, 1383, 1384, 1385, 1389, 1392, 1393, 1394, 1403, 1404, 705, 1413, 1414, 1415, 1416, 1420, 712, 1426, 1023, 854, 1435, 1436, 846, 838, 837, + 1440, 1441, 721, 836, 1444, 646, 723, 2234, 724, 393, 449, 913, 1452, 1453, 921, 928, 728, 1083, 1100, 1132, 433, 819, 431, 1700, 732, 424, 733, 423, + 422, 1469, 1470, 1471, 421, 416, 1474, 415, 2092, 235, 234, 226, 225, 224, 223, 216, 742, 215, 214, 213, 744, 212, 208, 207, 206, 98, 97, 1664, 748, + 1868, 749, 1499, 750, 1689, 1502, 1792, 752, 1712, 390, 1705, 1508, 1509, 1510, 1511, 1704, 1703, 1702, 1698, 1697, 1696, 401, 1519, 1520, 1694, 1547, + 1541, 1539, 1536, 1000, 1690, 1533, 23, 1220, 1197, 1194, 383, 1534, 1535, 2048, 1537, 1538, 2054, 2056, 385, 1542, 1543, 1544, 386, 2068, 2070, 829, + 387, 857, 402, 2080, 1553, 1554, 840, 839, 389, 1558, 1559, 831, 1561, 1562, 1563, 1564, 391, 830, 824, 815, 392, 812, 1571, 2120, 2122, 650, 2126, + 2128, 394, 425, 2134, 2136, 2138, 417, 2142, 411, 396, 2148, 410, 1196, 397, 1195, 419, 833, 398, 823, 99, 388, 1597, 400, 841, 832, 2178, 2180, 1603, + 2184, 2186, 2188, 2190, 2192, 1609, 2196, 2198, 404, 2202, 2204, 619, 817, 1617, 1618, 1619, 816, 405, 811, 1623, 2224, 406, 2228, 813, 1628, 407, 1630, + 2238, 2240, 2242, 2244, 2246, 2248, 2250, 1638, 1639, 820, 2258, 2260, 2262, 2264, 2266, 1646, 629, 2272, 412, 825, 618, 826, 413, 827, 2286, 828, 414, + 2292, 2294, 2296, 2298, 2300, 2302, 2304, 2306, 2308, 403, 834, 1669, 835, 2318, 2320, 2322, 2324, 1675, 2328, 2330, 2332, 2334, 2336, 420, 2340, 2342, + 2344, 2346, 2348, 2350, 2352, 2354, 2356, 2358, 211, 2362, 847, 1695, 848, 2370, 849, 2374, 850, 1701, 851, 2382, 2384, 2386, 2388, 106, 2392, 1709, + 399, 1711, 856, 428, 1714, 1715, 858, 429, 1718, 1719, 1008, 430, 1722, 1723, 862, 1725, 1726, 1727, 1728, 432, 818, 614, 1732, 1733, 1734, 384, 868, + 434, 869, 382, 217, 435, 1742, 1743, 1308, 436, 1140, 1133, 218, 437, 1124, 1123, 1108, 438, 1092, 1091, 219, 439, 943, 1682, 880, 440, 881, 927, 882, + 441, 883, 920, 914, 442, 1835, 1834, 900, 443, 899, 1828, 893, 444, 737, 529, 1248, 445, 220, 1707, 1784, 446, 1786, 1787, 894, 844, 1790, 1791, 896, + 1793, 1794, 1994, 898, 1797, 1798, 1799, 1800, 1801, 1802, 1850, 902, 1849, 903, 1807, 1808, 1809, 1810, 1848, 906, 453, 907, 1815, 1816, 1817, 909, + 1836, 227, 1821, 1822, 1823, 1824, 1825, 1826, 1827, 228, 1829, 1830, 1831, 1832, 1833, 917, 114, 229, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, + 1845, 1846, 1847, 924, 462, 925, 115, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, 1867, 934, 1869, 1870, + 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1674, 1666, 1665, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1642, 1640, 1633, 1632, 1892, 1893, 1894, 1631, + 1624, 2360, 2290, 2212, 1900, 1901, 1902, 1903, 1904, 2194, 2183, 2182, 238, 2060, 2052, 2050, 2040, 2038, 2036, 625, 239, 1741, 1740, 1713, 1706, 2378, + 1716, 2376, 253, 1259, 870, 2372, 2022, 632, 2008, 13, 620, 2082, 2189, 1120, 1314, 895, 916, 1032, 242, 2326, 452, 2256, 2254, 264, 656, 2252, 243, + 487, 1572, 1573, 1064, 488, 1954, 1065, 2380, 395, 1071, 1072, 230, 2237, 2236, 1963, 1964, 2390, 1851, 2146, 931, 100, 2197, 1971, 1972, 1625, 1113, + 1724, 814, 1977, 1978, 1979, 1629, 408, 409, 1636, 1984, 1985, 1986, 1637, 821, 822, 995, 1648, 996, 1683, 997, 2338, 998, 499, 999, 418, 2000, 209, + 1001, 210, 1002, 501, 1003, 842, 1004, 843, 1005, 2011, 1006, 1699, 1007, 2062, 2016, 426, 1009, 427, 1010, 1708, 1011, 1717, 1012, 2025, 2026, 126, + 2028, 2029, 2030, 2031, 2032, 2033, 1017, 2035, 252 +}; +static const std::vector ROI_VOXELS_34 = { + 2036, 2037, 1019, 2039, 1020, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2049, 2051, 2053, 2055, 2057, 2059, 2061, 2063, 1033, 1034, 2069, 2071, 2073, + 2075, 2077, 2079, 2081, 2083, 2085, 2087, 1045, 1046, 2093, 2095, 2097, 1050, 2101, 526, 2107, 2109, 1056, 1057, 2115, 2119, 2127, 2129, 2133, 2135, + 2137, 2141, 2143, 2089, 2147, 2218, 2151, 2153, 2090, 2210, 2159, 2161, 2099, 2165, 2167, 2201, 425, 2173, 2175, 2100, 2179, 2181, 2183, 2185, 2187, + 2189, 2191, 2193, 2195, 2197, 2199, 1101, 2203, 2205, 2207, 2209, 2211, 1107, 2215, 2217, 2219, 1111, 1112, 2225, 1114, 2229, 1116, 2233, 1118, 1119, + 2239, 2241, 2243, 2245, 2247, 2249, 2251, 1127, 1128, 2257, 2259, 2261, 2263, 2265, 2267, 2269, 1136, 2273, 2088, 2338, 2279, 2281, 2283, 2285, 2287, + 2289, 2291, 2293, 2295, 2297, 2299, 2301, 2303, 2305, 2307, 1129, 2067, 2066, 2315, 2065, 2319, 2321, 2323, 2325, 2327, 2329, 2331, 2333, 2335, 2337, + 2339, 2341, 2343, 2345, 2347, 2349, 2351, 2353, 2355, 2357, 2359, 2361, 2363, 2058, 210, 2234, 2371, 2373, 2375, 2377, 2379, 2381, 2383, 2385, 2387, + 2389, 2391, 2393, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, + 610, 1221, 611, 1223, 612, 445, 613, 1227, 1228, 100, 615, 842, 616, 1717, 617, 1012, 618, 2348, 619, 1706, 620, 1713, 621, 1243, 622, 1740, 623, 1741, + 1248, 1249, 625, 1908, 626, 2038, 627, 2040, 628, 2050, 629, 2052, 630, 2060, 631, 2092, 632, 2202, 633, 1007, 634, 1761, 635, 1753, 636, 403, 637, 404, + 638, 1277, 639, 813, 640, 1281, 641, 816, 642, 1285, 643, 817, 644, 1729, 645, 1291, 1292, 1601, 647, 650, 648, 1595, 649, 661, 1300, 1301, 651, 1588, + 652, 815, 653, 1307, 654, 1586, 655, 1581, 1312, 1575, 1314, 831, 1084, 1317, 1318, 224, 660, 1321, 1322, 921, 662, 235, 663, 1442, 664, 433, 665, 1424, + 388, 833, 667, 1278, 668, 2186, 669, 2212, 670, 1721, 841, 1599, 1567, 1566, 673, 1565, 674, 857, 675, 1555, 1546, 1545, 677, 387, 678, 1120, 679, 646, + 838, 846, 1023, 1013, 1014, 1021, 1242, 1036, 1035, 1022, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, + 1385, 1386, 1387, 1388, 1389, 1390, 854, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 837, 836, 659, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 2290, + 442, 441, 1413, 1414, 1415, 1416, 1417, 1418, 398, 401, 1421, 1422, 1423, 712, 1425, 1426, 826, 431, 832, 1430, 1431, 1432, 424, 423, 1435, 1436, 422, + 421, 416, 415, 1736, 721, 1443, 1444, 234, 226, 1447, 1448, 1449, 1450, 1451, 1452, 1453, 216, 215, 1456, 1457, 1458, 214, 213, 212, 208, 207, 206, 98, + 97, 1467, 839, 1469, 1470, 1471, 821, 2103, 1474, 1475, 2102, 1948, 1544, 2256, 2274, 426, 443, 1483, 2376, 2378, 1308, 819, 744, 390, 391, 1748, 402, + 1589, 824, 1577, 1576, 840, 1557, 1499, 1549, 1548, 1540, 1222, 752, 2184, 1868, 2360, 1508, 1509, 1624, 1712, 848, 1705, 1704, 1703, 1702, 1698, 1697, + 1519, 1696, 408, 1694, 1547, 1541, 1539, 1536, 829, 1194, 382, 1533, 1220, 1197, 383, 1534, 1535, 2048, 1537, 1538, 2054, 2056, 385, 1542, 1543, 2064, + 386, 2068, 2070, 2072, 2074, 2076, 2078, 2080, 2082, 1554, 2086, 1556, 389, 1558, 1559, 2096, 2098, 1562, 1563, 1564, 2106, 2108, 2110, 1568, 392, 2116, + 1571, 2120, 393, 1574, 2126, 2128, 394, 830, 2134, 2136, 395, 1582, 2142, 1584, 1585, 2148, 1587, 2152, 2154, 812, 1591, 2160, 1593, 1594, 99, 2168, + 399, 1598, 2174, 1600, 2178, 2180, 2182, 1604, 1605, 2188, 2190, 2192, 2194, 2196, 2198, 2200, 1613, 2204, 2206, 2208, 1617, 1618, 1619, 1195, 405, 811, + 2222, 2224, 406, 2228, 411, 814, 407, 1630, 2238, 2240, 2242, 2244, 2246, 2248, 409, 2252, 2254, 820, 2258, 2260, 2262, 2264, 2266, 823, 410, 2272, 412, + 825, 2278, 2280, 413, 827, 2286, 828, 414, 2292, 2294, 2296, 2298, 2300, 2302, 2304, 2306, 2308, 1196, 834, 417, 835, 2318, 2320, 2322, 2324, 2326, 209, + 419, 2332, 2334, 2336, 420, 2340, 2342, 2344, 2346, 843, 2350, 2352, 2354, 2356, 2358, 211, 2362, 847, 1695, 2368, 2370, 849, 2374, 850, 1701, 851, + 2382, 2384, 2386, 2388, 1707, 2392, 1709, 1710, 1711, 856, 428, 1714, 1715, 858, 429, 1718, 1719, 1720, 430, 1722, 1723, 1724, 1725, 1726, 1727, 1728, + 432, 1730, 1731, 1732, 1733, 1734, 1735, 868, 434, 1738, 1739, 217, 435, 1742, 1743, 1744, 1745, 1746, 1747, 218, 437, 400, 1751, 1752, 438, 1754, 1755, + 219, 439, 1758, 1759, 1760, 440, 1762, 1763, 220, 1765, 818, 614, 384, 1769, 1140, 1133, 1132, 1773, 1124, 1775, 1123, 444, 1109, 1108, 1100, 1781, + 1092, 1091, 1784, 446, 1786, 1787, 223, 1083, 1790, 1791, 1792, 1793, 1794, 943, 898, 449, 899, 928, 1800, 1801, 1802, 927, 225, 1836, 914, 913, 737, + 893, 1810, 900, 906, 453, 907, 728, 529, 1817, 527, 624, 227, 1699, 844, 2328, 1824, 1825, 1826, 1827, 228, 1994, 1632, 1664, 1665, 1833, 1834, 1835, + 229, 1666, 1689, 1828, 920, 1841, 1842, 1843, 230, 1845, 1682, 1674, 1848, 1849, 1850, 1642, 1640, 1633, 1854, 1631, 1856, 1857, 1858, 1859, 1860, 1861, + 1862, 1863, 1864, 1865, 1866, 1867, 934, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, + 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 238, 1909, 1910, 1911, + 1912, 1913, 1914, 2372, 958, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 427, 2330, 1930, 1931, 1932, 1933, 996, 1935, 1936, 1937, + 1938, 1939, 242, 2255, 1942, 2253, 1286, 1032, 2062, 1947, 243, 487, 2237, 2236, 1553, 488, 1954, 2084, 1956, 1957, 2146, 1625, 1844, 656, 657, 1963, + 1964, 1965, 1623, 862, 1572, 1573, 2122, 1971, 1972, 2271, 1579, 1580, 2138, 1977, 1978, 1979, 396, 397, 1137, 1592, 1984, 1985, 1986, 2380, 2166, 2250, + 995, 2390, 1992, 1993, 997, 1716, 998, 499, 999, 1999, 1000, 2001, 1001, 822, 1002, 501, 1003, 2007, 1004, 2009, 1005, 2011, 1006, 239, 2014, 2015, + 1008, 2017, 1009, 418, 1010, 2021, 1011, 2023, 2024, 2025, 2026, 1700, 2028, 2029, 1708, 1561, 2032, 1737, 2034, 2035, 436 +}; +static const std::vector ROI_VOXELS_35 = { + 2036, 2037, 1019, 2039, 1020, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2049, 2051, 2053, 2055, 2057, 2059, 2061, 2063, 1033, 1034, 2069, 2071, 2073, + 2075, 2077, 2079, 2081, 2083, 2085, 2087, 1045, 1046, 2093, 2095, 2097, 1050, 2101, 2103, 2107, 2109, 1056, 1057, 2115, 2117, 2119, 2123, 2127, 2129, + 2133, 2135, 2137, 2141, 2143, 2147, 2179, 2181, 2183, 2185, 2187, 2189, 2191, 2193, 2195, 2197, 2199, 2201, 2203, 2205, 2207, 2209, 2211, 1107, 2215, + 2217, 2219, 1111, 1112, 2225, 1114, 2229, 2233, 1119, 1120, 2241, 2243, 2245, 2247, 2249, 2251, 2253, 2255, 2257, 2259, 2261, 2263, 2265, 2267, 2269, + 2279, 2283, 2289, 2291, 2293, 2295, 2297, 2299, 2301, 2303, 2305, 2307, 2315, 2319, 2321, 2323, 2325, 2327, 2329, 2331, 2333, 2335, 2337, 2339, 2341, + 2343, 2345, 2347, 2349, 2351, 2353, 2355, 2357, 2359, 2361, 2363, 2371, 2373, 2375, 2377, 2379, 2381, 2383, 2385, 2387, 2389, 2391, 2393, 1198, 1199, + 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 610, 1221, 611, 1223, 1224, + 1225, 1226, 1227, 1228, 615, 616, 617, 618, 619, 620, 621, 1243, 622, 623, 1248, 1249, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 1277, 639, 640, 641, 642, 1285, 643, 644, 645, 2218, 646, 2210, 647, 1712, 648, 2100, 649, 2099, 650, 2090, 651, 2089, 652, 2088, 653, 1307, 654, + 2078, 655, 2076, 656, 2067, 1314, 2066, 2065, 2058, 659, 443, 660, 2390, 661, 2022, 662, 2146, 663, 2236, 664, 2237, 665, 2239, 2252, 2322, 667, 2326, + 668, 2330, 669, 2342, 670, 1908, 2378, 1706, 1713, 1741, 673, 1740, 674, 2376, 675, 219, 857, 1761, 677, 1753, 678, 1220, 679, 1533, 1536, 1539, 1541, + 1729, 1601, 2052, 1595, 2040, 2372, 1222, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, + 1388, 1389, 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, + 1413, 1414, 1415, 1416, 1417, 1418, 1586, 1581, 1421, 1422, 1423, 1424, 1425, 1575, 1548, 1545, 1546, 1430, 1431, 1432, 1555, 1567, 1442, 1278, 2356, + 2038, 1721, 1696, 1698, 721, 1443, 1566, 1565, 1549, 1447, 1448, 1449, 1450, 1451, 1242, 1036, 1035, 1022, 1456, 1457, 1458, 1021, 1014, 2374, 1023, + 854, 846, 838, 837, 1467, 836, 1469, 1470, 2272, 487, 449, 442, 441, 2328, 439, 1194, 437, 433, 1547, 431, 1694, 424, 423, 422, 421, 416, 415, 2348, + 235, 234, 390, 402, 816, 2234, 216, 215, 214, 213, 212, 1502, 208, 207, 206, 98, 97, 2116, 1557, 1510, 1511, 2102, 1948, 445, 427, 2122, 2062, 2138, + 2254, 1520, 2256, 824, 840, 1000, 822, 1748, 1197, 1589, 382, 1540, 1577, 1576, 383, 1534, 1535, 2048, 1537, 1538, 2054, 2056, 385, 1542, 1543, 2064, + 386, 2068, 2070, 2072, 2074, 1550, 1551, 1552, 2082, 1554, 2086, 1556, 389, 1558, 1559, 1560, 2098, 1562, 1563, 2104, 2106, 2108, 2110, 1568, 392, 1570, + 1571, 2120, 393, 1574, 2126, 2128, 394, 1578, 2134, 2136, 395, 1582, 2142, 1584, 396, 2148, 1587, 1588, 397, 1590, 1591, 1592, 1593, 1594, 99, 2050, + 399, 1598, 1599, 1600, 2178, 2180, 2182, 1604, 1605, 2188, 2190, 2192, 2194, 2196, 2198, 2200, 1613, 2204, 2206, 2208, 1617, 1618, 1619, 1697, 405, 811, + 2222, 2224, 406, 2228, 1705, 1628, 407, 1630, 2238, 2240, 2242, 2244, 2246, 2248, 1637, 1638, 1639, 820, 2258, 2260, 2262, 2264, 2266, 1646, 1704, 1648, + 412, 825, 1703, 826, 413, 827, 2286, 828, 414, 2292, 2294, 2296, 2298, 2300, 2302, 2304, 2306, 833, 1702, 834, 1669, 835, 2318, 2320, 418, 2324, 1675, + 209, 419, 2332, 2334, 2336, 420, 2340, 1683, 842, 2346, 843, 2350, 2352, 2354, 1690, 2358, 211, 2362, 847, 1695, 2368, 2370, 849, 1699, 1700, 1701, 851, + 2382, 2384, 2386, 2388, 1707, 2392, 1709, 1710, 1711, 856, 428, 1714, 1715, 1716, 429, 1718, 1719, 1720, 430, 1722, 1723, 862, 1725, 1726, 1727, 1728, + 432, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 434, 1738, 1739, 217, 435, 1742, 1743, 1744, 1745, 1746, 1747, 218, 1749, 1750, 1751, 1752, 438, 1754, + 1755, 1756, 1757, 1758, 1759, 1760, 440, 1762, 1763, 1764, 1765, 839, 831, 830, 1769, 1770, 815, 812, 1773, 425, 1775, 417, 444, 411, 410, 1196, 1781, + 1195, 408, 1784, 446, 1786, 1787, 223, 2344, 1790, 1791, 848, 841, 832, 817, 224, 1797, 1798, 1799, 1800, 813, 404, 403, 225, 401, 400, 1807, 1808, + 1809, 398, 391, 226, 453, 388, 1815, 1816, 1008, 2111, 819, 227, 1821, 1822, 1823, 818, 614, 613, 612, 228, 1829, 1830, 1831, 1832, 384, 2360, 2290, + 229, 1837, 1838, 1839, 1840, 2212, 2202, 2186, 230, 1845, 1846, 1847, 2184, 2092, 2080, 1851, 1852, 1853, 2060, 1855, 1856, 1857, 1858, 1859, 1860, + 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, + 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 238, 1909, 1910, + 1911, 1912, 1913, 1914, 1915, 239, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1561, 1935, + 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1708, 868, 436, 1573, 1947, 243, 1949, 1950, 1032, 1724, 488, 1954, 1844, 1956, 1957, 1312, 1623, 1625, 858, + 1286, 1963, 1964, 1965, 1544, 387, 1553, 2084, 2096, 1971, 1972, 1564, 657, 1569, 1572, 1977, 1978, 1979, 624, 1579, 1580, 2380, 1984, 1985, 1986, 1583, + 1585, 1717, 995, 2338, 996, 100, 997, 2308, 998, 499, 999, 814, 2000, 1629, 1001, 409, 1002, 501, 1003, 2250, 2008, 1636, 1005, 821, 1006, 823, 1007, + 829, 2016, 1916, 1009, 210, 1010, 242, 1011, 844, 1012, 850, 1013, 426, 2028, 2029, 2030, 2031, 1737, 2033, 1004, 2035, 220 +}; +static const std::vector ROI_VOXELS_36 = { + 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2049, 2051, 2053, 2055, 2057, 2059, 2061, 1032, 2065, 2067, 2069, 2071, 2073, + 2075, 2077, 2079, 2081, 2083, 2085, 2087, 2089, 2093, 2095, 2097, 2099, 2101, 2107, 2109, 264, 265, 2127, 2129, 2133, 2135, 2137, 2141, 2143, 2147, 67, + 2179, 2181, 136, 2185, 2187, 2189, 2191, 2193, 2195, 2197, 2199, 2201, 2203, 2205, 2207, 2209, 2211, 1107, 2215, 2217, 2219, 1111, 1112, 2225, 1114, + 2229, 2233, 1119, 2239, 2241, 2243, 2245, 2247, 2249, 2251, 2253, 2255, 2257, 2259, 2261, 2263, 2265, 2267, 2269, 2279, 2283, 2289, 2291, 2293, 2295, + 2297, 2299, 2301, 2303, 2305, 2307, 2319, 2321, 2323, 2325, 2327, 2329, 2331, 2333, 2335, 2337, 2339, 2341, 2343, 2345, 2347, 2349, 2351, 2353, 2355, + 2357, 2359, 2361, 2363, 2371, 2373, 2375, 2377, 2379, 2381, 2383, 2385, 2387, 2389, 2391, 2393, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, + 1207, 1211, 1212, 1213, 1217, 1218, 610, 611, 1228, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 78, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 1277, 639, 640, 641, 642, 1285, 1286, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 1312, 1314, 659, 660, 661, + 662, 663, 664, 665, 667, 668, 669, 670, 673, 674, 675, 677, 678, 679, 1370, 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1379, 1381, 1382, 1383, 1384, + 1389, 1392, 1417, 1418, 1421, 1422, 1423, 1424, 1425, 1430, 1431, 1432, 721, 1443, 1447, 1448, 1449, 1450, 1451, 1456, 1457, 1458, 1469, 1470, 2218, + 2210, 837, 838, 2090, 1601, 1729, 431, 2066, 2058, 1724, 1502, 1713, 1740, 427, 436, 2050, 2052, 2060, 1510, 1511, 2186, 2212, 2290, 2360, 1908, 390, + 391, 398, 1520, 400, 401, 402, 813, 1703, 1761, 1753, 421, 23, 422, 423, 424, 383, 1534, 1535, 2048, 1537, 1538, 2054, 2056, 1541, 1542, 1543, 2064, + 386, 2068, 2070, 2072, 2074, 2076, 2078, 2080, 2082, 2084, 2086, 2088, 389, 1558, 1559, 2096, 2098, 2100, 97, 1595, 2106, 2108, 854, 1278, 392, 1442, + 1586, 2120, 2122, 1574, 2126, 2128, 394, 1581, 2134, 2136, 395, 1575, 2142, 1584, 2146, 2148, 1587, 1588, 397, 1023, 1591, 1592, 1593, 1594, 99, 846, + 399, 1598, 1599, 1600, 2178, 2180, 2182, 1604, 1605, 2188, 2190, 2192, 2194, 2196, 2198, 2200, 2202, 2204, 2206, 2208, 1617, 1618, 1619, 836, 405, 811, + 2222, 2224, 406, 2228, 1629, 1628, 407, 2236, 2238, 2240, 2242, 2244, 2246, 2248, 1637, 1638, 1639, 2256, 2258, 2260, 2262, 2264, 2266, 1646, 1561, + 1648, 412, 825, 449, 826, 413, 827, 2286, 828, 414, 2292, 2294, 2296, 2298, 2300, 2302, 2304, 2306, 2308, 212, 834, 1669, 835, 2318, 2320, 2322, 2324, + 1675, 209, 419, 2332, 2334, 2336, 420, 2340, 1683, 2344, 2346, 843, 2350, 2352, 2354, 2356, 2358, 211, 2362, 847, 1695, 848, 2370, 849, 1699, 2376, + 1701, 851, 2382, 2384, 426, 2388, 106, 2392, 1709, 441, 1711, 856, 428, 1714, 1715, 858, 429, 1718, 1547, 1220, 430, 1722, 1723, 862, 1725, 235, 415, + 433, 432, 1730, 1731, 1732, 1733, 1734, 1735, 868, 434, 1738, 1739, 217, 1741, 1742, 1743, 1744, 1745, 1746, 416, 218, 437, 388, 1751, 1752, 438, 234, + 814, 219, 439, 1758, 1759, 1760, 440, 1762, 216, 220, 1765, 215, 214, 213, 442, 208, 207, 206, 443, 98, 403, 832, 444, 841, 68, 1712, 445, 1705, 1704, + 1784, 446, 1786, 1787, 223, 1702, 1790, 1791, 1698, 1697, 1696, 1694, 224, 1797, 1798, 1799, 1800, 1539, 1536, 1533, 225, 1197, 1194, 1807, 1808, 1809, + 418, 1000, 226, 453, 857, 1815, 1816, 840, 839, 831, 227, 1821, 1822, 1823, 830, 824, 815, 812, 228, 1829, 1830, 1831, 1832, 425, 417, 114, 229, 1837, + 1838, 1839, 1840, 411, 410, 1196, 1844, 1845, 1846, 1847, 1195, 462, 822, 1851, 1852, 1853, 408, 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, + 1864, 1865, 1866, 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, 817, 816, 1879, 404, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, + 1890, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 238, 1909, 1910, 1911, 1912, 2184, 2183, + 2092, 239, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 2237, 1625, 253, 2390, 1930, 1931, 1932, 1933, 1708, 1935, 1936, 1937, 452, 13, 242, + 1736, 1942, 1716, 2062, 2063, 1706, 1120, 243, 487, 643, 1544, 1630, 488, 1954, 387, 2372, 1717, 1553, 2234, 2348, 2250, 2272, 1963, 1964, 2328, 656, + 2330, 657, 2326, 393, 1971, 1972, 2338, 1579, 1580, 396, 1977, 1978, 1979, 1585, 230, 115, 2022, 1984, 1985, 1986, 2254, 2252, 1623, 995, 100, 996, + 2138, 997, 1707, 998, 499, 999, 409, 2000, 1636, 1001, 823, 1002, 501, 1003, 2380, 2008, 829, 1005, 833, 1006, 210, 842, 2342, 2016, 844, 1690, 850, + 252, 2374, 1011, 1700, 1012, 2378, 2386, 126, 2028, 2029, 2030, 2031, 1737, 2033, 435, 2035, 1004 +}; + +static const std::map> REGIONS_OF_INTEREST = +{ + { "Action.Execution", ROI_VOXELS_0 }, + { "Action.Execution.Speech", ROI_VOXELS_1 }, + { "Action.Imagination", ROI_VOXELS_2 }, + { "Action.Inhibition", ROI_VOXELS_3 }, + { "Action.Motor.Learning", ROI_VOXELS_4 }, + { "Action.Observation", ROI_VOXELS_5 }, + { "Cognition", ROI_VOXELS_6 }, + { "Cognition.Attention", ROI_VOXELS_7 }, + { "Cognition.Language", ROI_VOXELS_8 }, + { "Cognition.Language.Orthography", ROI_VOXELS_9 }, + { "Cognition.Language.Phonology", ROI_VOXELS_10 }, + { "Cognition.Language.Semantics", ROI_VOXELS_11 }, + { "Cognition.Language.Speech", ROI_VOXELS_12 }, + { "Cognition.Language.Syntax", ROI_VOXELS_13 }, + { "Cognition.Memory.Explicit", ROI_VOXELS_14 }, + { "Cognition.Memory.Working", ROI_VOXELS_15 }, + { "Cognition.Music", ROI_VOXELS_16 }, + { "Cognition.Reasoning", ROI_VOXELS_17 }, + { "Cognition.Space", ROI_VOXELS_18 }, + { "Cognition.Time", ROI_VOXELS_19 }, + { "Emotion", ROI_VOXELS_20 }, + { "Emotion.Anger", ROI_VOXELS_21 }, + { "Emotion.Anxiety", ROI_VOXELS_22 }, + { "Emotion.Disgust", ROI_VOXELS_23 }, + { "Emotion.Fear", ROI_VOXELS_24 }, + { "Emotion.Happiness", ROI_VOXELS_25 }, + { "Emotion.Sadness", ROI_VOXELS_26 }, + { "Interoception.Hunger", ROI_VOXELS_27 }, + { "Interoception.Sexuality", ROI_VOXELS_28 }, + { "Perception.Audition", ROI_VOXELS_29 }, + { "Perception.Olfaction", ROI_VOXELS_30 }, + { "Perception.Somesthesis", ROI_VOXELS_31 }, + { "Perception.Somesthesis.Pain", ROI_VOXELS_32 }, + { "Perception.Vision", ROI_VOXELS_33 }, + { "Perception.Vision.Color", ROI_VOXELS_34 }, + { "Perception.Vision.Motion", ROI_VOXELS_35 }, + { "Perception.Vision.Shape", ROI_VOXELS_36 } +}; +} // namespace LoretaRegions diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mC3DMesh.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mC3DMesh.cpp new file mode 100644 index 0000000..220ef89 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mC3DMesh.cpp @@ -0,0 +1,153 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#if defined TARGET_HAS_ThirdPartyOpenGL + +#include "mC3DMesh.hpp" + +#include + +namespace OpenViBE { +namespace AdvancedVisualization { + +namespace { +template +bool littleEndianToHost(const uint8_t* buffer, T* value) +{ + if (!buffer || !value) { return false; } + memset(value, 0, sizeof(T)); + for (uint32_t i = 0; i < sizeof(T); ++i) { reinterpret_cast(value)[i] = buffer[i]; } + return true; +} +} // namespace + + +void C3DMesh::clear() +{ + m_Color.fill(1.0); + + m_Vertices.clear(); + m_Normals.clear(); + m_Triangles.clear(); +} + +bool C3DMesh::load(const void* buffer) +{ + const auto* tmp = reinterpret_cast(buffer); + + uint32_t nVertex; + uint32_t nTriangle; + + littleEndianToHost(reinterpret_cast(&tmp[0]), &nVertex); + littleEndianToHost(reinterpret_cast(&tmp[1]), &nTriangle); + + m_Vertices.resize(nVertex); + m_Triangles.resize(size_t(nTriangle) * 3); + + size_t j = 2; + + for (size_t i = 0; i < nVertex; ++i) + { + littleEndianToHost(reinterpret_cast(&tmp[j++]), &m_Vertices[i].x); + littleEndianToHost(reinterpret_cast(&tmp[j++]), &m_Vertices[i].y); + littleEndianToHost(reinterpret_cast(&tmp[j++]), &m_Vertices[i].z); + } + + for (size_t i = 0; i < nTriangle * 3; ++i) { littleEndianToHost(reinterpret_cast(&tmp[j++]), &m_Triangles[i]); } + + this->compile(); + + return true; +} + +bool C3DMesh::compile() +{ + m_Normals.clear(); + m_Normals.resize(m_Vertices.size()); + for (size_t i = 0; i < m_Triangles.size(); i += 3) + { + const uint32_t i1 = m_Triangles[i]; + const uint32_t i2 = m_Triangles[i + 1]; + const uint32_t i3 = m_Triangles[i + 2]; + CVertex v1 = m_Vertices[i1]; + CVertex v2 = m_Vertices[i2]; + CVertex v3 = m_Vertices[i3]; + v2.x -= v1.x; + v2.y -= v1.y; + v2.z -= v1.z; + v3.x -= v1.x; + v3.y -= v1.y; + v3.z -= v1.z; + v1 = CVertex::cross(v2, v3); + v1.normalize(); + m_Normals[i1].x += v1.x; + m_Normals[i1].y += v1.y; + m_Normals[i1].z += v1.z; + m_Normals[i2].x += v1.x; + m_Normals[i2].y += v1.y; + m_Normals[i2].z += v1.z; + m_Normals[i3].x += v1.x; + m_Normals[i3].y += v1.y; + m_Normals[i3].z += v1.z; + } + + for (auto& normal : m_Normals) { normal.normalize(); } + return true; +} + +bool C3DMesh::project(std::vector& out, const std::vector& in) +{ + out.resize(in.size()); + for (size_t i = 0; i < in.size(); ++i) + { + CVertex p, q; + p = in[i]; + // q = vChannelCoordinate[i]; + for (size_t j = 0; j < this->m_Triangles.size(); j += 3) + { + const uint32_t i1 = this->m_Triangles[j]; + const uint32_t i2 = this->m_Triangles[j + 1]; + const uint32_t i3 = this->m_Triangles[j + 2]; + + CVertex v1, v2, v3; + v1 = this->m_Vertices[i1]; + v2 = this->m_Vertices[i2]; + v3 = this->m_Vertices[i3]; + + CVertex e1(v1, v2); + CVertex e2(v1, v3); + CVertex n = CVertex::cross(e1, e2).normalize(); + + const float t = CVertex::dot(v1, n) / CVertex::dot(p, n); + q.x = t * p.x; + q.y = t * p.y; + q.z = t * p.z; + + if (CVertex::isInTriangle(q, v1, v2, v3) && t >= 0) { out[i] = q; } + } + // if (q.x == 0 && q.y == 0 && q.z == 0) { ::printf("Could not project coordinates on mesh for channel %i [%s]\n", i+1, ctx.getChannelName(i).c_str()); } + } + return true; +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyOpenGL diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mC3DMesh.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mC3DMesh.hpp new file mode 100644 index 0000000..cb3aec2 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mC3DMesh.hpp @@ -0,0 +1,58 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#pragma once + +#if defined TARGET_HAS_ThirdPartyOpenGL + +#include +#include +#include +#include // size_t for unix + +#include "mCVertex.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class C3DMesh final +{ +public: + + C3DMesh() { m_Color.fill(1.0); } + //C3DMesh(const char* filename); + ~C3DMesh() = default; + + void clear(); + bool load(const void* buffer); + bool compile(); + + bool project(std::vector& out, const std::vector& in); + + std::vector m_Vertices; + std::vector m_Normals; + std::vector m_Triangles; + std::array m_Color; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE + + +#endif // TARGET_HAS_ThirdPartyOpenGL diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererBars.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererBars.cpp new file mode 100644 index 0000000..29c31d3 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererBars.cpp @@ -0,0 +1,134 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include "mCRendererBars.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { + +void CRendererBars::rebuild(const CRendererContext& ctx) +{ + IRenderer::rebuild(ctx); + + m_vertex.resize(m_nChannel); + for (size_t i = 0; i < m_nChannel; ++i) + { + m_vertex[i].resize(size_t(m_nSample) * 4); + for (size_t j = 0; j < m_nSample; ++j) + { + const size_t id = j * 4; + const float value = j * m_nInverseSample; + m_vertex[i][id].x = value; + m_vertex[i][id + 1].x = value + m_nInverseSample; + m_vertex[i][id + 2].x = value + m_nInverseSample; + m_vertex[i][id + 3].x = value; + + m_vertex[i][id].u = value; + m_vertex[i][id + 1].u = value; + m_vertex[i][id + 2].u = value; + m_vertex[i][id + 3].u = value; + } + } + + m_historyIdx = 0; +} + +void CRendererBars::refresh(const CRendererContext& ctx) +{ + IRenderer::refresh(ctx); + + if (!m_nHistory) { return; } + + for (size_t i = 0; i < m_nChannel; ++i) + { + size_t k = ((m_nHistory - 1) / m_nSample) * m_nSample; + std::vector& history = m_history[i]; + CVertex* vertex = &m_vertex[i][0]; + for (size_t j = 0; j < m_nSample; j++, k++) + { + if (k >= m_historyIdx && k < m_nHistory) + { + const float value = history[k]; + vertex++->y = 0; + vertex++->y = 0; + vertex++->y = value; + vertex++->y = value; + } + else { vertex += 4; } + } + } + m_historyIdx = m_nHistory; +} + +bool CRendererBars::render(const CRendererContext& ctx) +{ + if (!ctx.getSelectedCount() || m_vertex.empty() || !m_nHistory) { return false; } + + size_t i; + + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glLoadIdentity(); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glScalef(1, 1.F / ctx.getSelectedCount(), 1); + glTranslatef(0, ctx.isPositiveOnly() ? 0 : 0.5F, 0); + + glPushAttrib(GL_CURRENT_BIT); + glDisable(GL_TEXTURE_1D); + glColor3f(.2F, .2F, .2F); + glBegin(GL_LINES); + for (i = 0; i < ctx.getSelectedCount(); ++i) + { + glVertex2f(0, float(i)); + glVertex2f(1, float(i)); + } + glEnd(); + glEnable(GL_TEXTURE_1D); + glPopAttrib(); + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + for (i = 0; i < ctx.getSelectedCount(); ++i) + { + glPushMatrix(); + glTranslatef(0, float(ctx.getSelectedCount()) - i - 1.F, 0); + glScalef(1, ctx.getScale(), 1); + glVertexPointer(2, GL_FLOAT, sizeof(CVertex), &m_vertex[ctx.getSelected(i)][0].x); + glTexCoordPointer(1, GL_FLOAT, sizeof(CVertex), &m_vertex[ctx.getSelected(i)][0].u); + glDrawArrays(GL_QUADS, 0, GLsizei(m_nSample * 4)); + glPopMatrix(); + } + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); + glPopMatrix(); + + glMatrixMode(GL_TEXTURE); + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + + return true; +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererBars.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererBars.hpp new file mode 100644 index 0000000..9e09633 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererBars.hpp @@ -0,0 +1,36 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "mIRenderer.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRendererBars : public IRenderer +{ +public: + + void rebuild(const CRendererContext& ctx) override; + void refresh(const CRendererContext& ctx) override; + bool render(const CRendererContext& ctx) override; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererBitmap.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererBitmap.cpp new file mode 100644 index 0000000..69bf31f --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererBitmap.cpp @@ -0,0 +1,123 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include "mCRendererBitmap.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { + +void CRendererBitmap::rebuild(const CRendererContext& ctx) +{ + IRenderer::rebuild(ctx); + + m_autoDecimationFactor = 1 + size_t((m_nSample - 1) / ctx.getMaximumSampleCountPerDisplay()); + + m_vertex.clear(); + m_vertex.resize(m_nChannel); + for (size_t i = 0; i < m_nChannel; ++i) + { + m_vertex[i].resize((m_nSample / m_autoDecimationFactor) * 4); + for (size_t j = 0; j < m_nSample - m_autoDecimationFactor + 1; j += m_autoDecimationFactor) + { + const size_t l = j / m_autoDecimationFactor; + const size_t id = l * 4; + const float factor = m_autoDecimationFactor * m_nInverseSample; + const float value = l * factor; + m_vertex[i][id].x = value; + m_vertex[i][id].y = 0; + + m_vertex[i][id + 1].x = value + factor; + m_vertex[i][id + 1].y = 0; + + m_vertex[i][id + 2].x = value + factor; + m_vertex[i][id + 2].y = 1; + + m_vertex[i][id + 3].x = value; + m_vertex[i][id + 3].y = 1; + } + } + + m_historyIdx = 0; +} + +void CRendererBitmap::refresh(const CRendererContext& ctx) +{ + IRenderer::refresh(ctx); + + if (!m_nHistory) { return; } + if (m_vertex.empty()) { return; } + + for (size_t i = 0; i < m_nChannel; ++i) + { + size_t k = ((m_nHistory - 1) / m_nSample) * m_nSample; + std::vector& history = m_history[i]; + CVertex* vertex = &m_vertex[i][0]; + for (size_t j = 0; j < m_nSample - m_autoDecimationFactor + 1; j += m_autoDecimationFactor, k += m_autoDecimationFactor) + { + if (k >= m_historyIdx && k < m_nHistory) + { + const float value = history[k]; + vertex++->u = value; + vertex++->u = value; + vertex++->u = value; + vertex++->u = value; + } + else { vertex += 4; } + } + } + m_historyIdx = m_nHistory; +} + +bool CRendererBitmap::render(const CRendererContext& ctx) +{ + if (!ctx.getSelectedCount() || m_vertex.empty() || !m_nHistory) { return false; } + + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glScalef(ctx.getScale(), 1, 1); + glMatrixMode(GL_MODELVIEW); + + glPushMatrix(); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glScalef(1, 1.F / ctx.getSelectedCount(), 1); + for (size_t i = 0; i < ctx.getSelectedCount(); ++i) + { + glPushMatrix(); + glTranslatef(0, float(ctx.getSelectedCount() - i) - 1.F, 0); + glVertexPointer(3, GL_FLOAT, sizeof(CVertex), &m_vertex[ctx.getSelected(i)][0].x); + glTexCoordPointer(1, GL_FLOAT, sizeof(CVertex), &m_vertex[ctx.getSelected(i)][0].u); + glDrawArrays(GL_QUADS, 0, GLsizei((m_nSample / m_autoDecimationFactor) * 4)); + glPopMatrix(); + } + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); + glPopMatrix(); + + glMatrixMode(GL_TEXTURE); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + return true; +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererBitmap.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererBitmap.hpp new file mode 100644 index 0000000..dc62758 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererBitmap.hpp @@ -0,0 +1,36 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "mIRenderer.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRendererBitmap : public IRenderer +{ +public: + + void rebuild(const CRendererContext& ctx) override; + void refresh(const CRendererContext& ctx) override; + bool render(const CRendererContext& ctx) override; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererConnectivity.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererConnectivity.cpp new file mode 100644 index 0000000..045cd28 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererConnectivity.cpp @@ -0,0 +1,205 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include "mCRendererConnectivity.hpp" +#include "mC3DMesh.hpp" + +// #include "content/Face.obj.hpp" +#include "content/Scalp.obj.hpp" + +#include + +//constexpr size_t COUNT = 16; //Macro modernization, Not yet with jenkins (not the last visual 2013 which it works) +#define COUNT 16 + +namespace OpenViBE { +namespace AdvancedVisualization { + +static void q_rotate(Eigen::VectorXd& dst, const Eigen::VectorXd& src, const Eigen::Quaterniond& q) { dst = q.matrix() * src; } + +static void q_from_polar(Eigen::Quaterniond& q, Eigen::VectorXd& v1, Eigen::VectorXd& v2, const CVertex& cv1, const CVertex& cv2) +{ + v1(0) = cv1.x; + v1(1) = cv1.y; + v1(2) = cv1.z; + + v2(0) = cv2.x; + v2(1) = cv2.y; + v2(2) = cv2.z; + + q.setFromTwoVectors(v1, v2); +} + +void CRendererConnectivity::rebuild(const CRendererContext& ctx) +{ + IRenderer::rebuild(ctx); + + + Eigen::Quaterniond q = Eigen::Quaterniond::Identity(); + const Eigen::Quaterniond qId = Eigen::Quaterniond::Identity(); + Eigen::Quaterniond qDiff = Eigen::Quaterniond::Identity(); + Eigen::VectorXd v(3); + Eigen::VectorXd v1(3); + Eigen::VectorXd v2(3); + + C3DMesh scalp; + scalp.load(SCALP_DATA); + + // Projects electrode coordinates to 3D mesh + + std::vector projectedChannelPos; + std::vector channelPos; + channelPos.resize(ctx.getChannelCount()); + for (size_t i = 0; i < ctx.getChannelCount(); ++i) { ctx.getChannelLocalisation(i, channelPos[i].x, channelPos[i].y, channelPos[i].z); } + scalp.project(projectedChannelPos, channelPos); + + // Generates arcs + + m_vertex.clear(); + m_vertex.resize(m_nChannel * (m_nChannel - 1) / 2); + size_t l = 0; + for (size_t i = 0; i < m_nChannel; ++i) + { + for (size_t j = 0; j < i; ++j) + { + m_vertex[l].resize(COUNT); + + CVertex vi, vj; + vi = channelPos[i]; + vj = channelPos[j]; + + const float viLen = projectedChannelPos[i].length(); + const float vjLen = projectedChannelPos[j].length(); + + q_from_polar(qDiff, v1, v2, vi, vj); + + const double alpha = 0; + const double dot = (1 - CVertex::dot(vi, vj)) * .5; + + for (size_t k = 0; k < COUNT; ++k) + { + const float t = float(k * 1. / (COUNT - 1)); + auto s = float((t - .5) * 2); + s = float(1 + .5 * (1 - s * s) * dot); + + q = qId.slerp(t, qDiff); + + q_rotate(v, v1, q); + + const float len = (viLen * (1 - t) + vjLen * t); + m_vertex[l][k].x = float(s * v[0] * len); + m_vertex[l][k].y = float(s * v[1] * len); + m_vertex[l][k].z = float(s * v[2] * len); + m_vertex[l][k].u = float(alpha); + } + + l++; + } + } + + m_historyIdx = 0; +} + +void CRendererConnectivity::refresh(const CRendererContext& ctx) +{ + IRenderer::refresh(ctx); + + if (!m_nHistory) { return; } + if (m_nHistory < m_nChannel) { return; } + + size_t l = 0; + for (size_t i = 0; i < m_nChannel; ++i) + { + for (size_t j = 0; j < i; ++j) + { + for (size_t k = 0; k < COUNT; ++k) { m_vertex[l][k].u = m_history[i][m_nHistory - 1 - j]; } + l++; + } + } + + m_historyIdx = m_nHistory; +} + +bool CRendererConnectivity::render(const CRendererContext& ctx) +{ + if (!ctx.getSelectedCount() || m_vertex.empty() || !m_nHistory) { return false; } + + const float d = 3.5; + + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluPerspective(60, ctx.getAspect(), .01, 100); + glTranslatef(0, 0, -d); + glRotatef(ctx.getRotationX() * 10, 1, 0, 0); + glRotatef(ctx.getRotationY() * 10, 0, 1, 0); + + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glScalef(ctx.getScale(), 1, 1); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glScalef(ctx.getZoom(), ctx.getZoom(), ctx.getZoom()); + + const float rgb = 1.F; + glColor4f(rgb, rgb, rgb, ctx.getTranslucency()); + glPushMatrix(); + + glTranslatef(0, .5F, 0); + glRotatef(19, 1, 0, 0); + glTranslatef(0, -.2F, .35F); + // ::glScalef(1.8f, 1.8f, 1.8f); + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + for (size_t i = 0; i < m_nChannel * (m_nChannel - 1) / 2; ++i) + { + glVertexPointer(3, GL_FLOAT, sizeof(CVertex), &m_vertex[i][0].x); + glTexCoordPointer(1, GL_FLOAT, sizeof(CVertex), &m_vertex[i][0].u); + glDrawArrays(GL_LINE_STRIP, 0, COUNT); + } + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); + + glPopMatrix(); + + if (ctx.getCheckBoardVisibility()) { this->drawCoordinateSystem(); } + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + + glMatrixMode(GL_TEXTURE); + glPopMatrix(); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + + return true; +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererConnectivity.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererConnectivity.hpp new file mode 100644 index 0000000..3785228 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererConnectivity.hpp @@ -0,0 +1,40 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +// #if defined TARGET_HAS_ThirdPartyVRPN + +#include "mIRenderer.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRendererConnectivity : public IRenderer +{ +public: + + void rebuild(const CRendererContext& ctx) override; + void refresh(const CRendererContext& ctx) override; + bool render(const CRendererContext& ctx) override; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE + +// #endif // TARGET_HAS_ThirdPartyVRPN diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererContext.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererContext.cpp new file mode 100644 index 0000000..fd8f87f --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererContext.cpp @@ -0,0 +1,263 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include "mCRendererContext.hpp" + +#include +#include +#include +#include +#include + +namespace OpenViBE { +namespace AdvancedVisualization { + +namespace { +void getLeftRightScore(std::map& scores, const std::vector& names, const std::vector& positions) +{ + for (size_t i = 0; i < names.size() && i < positions.size(); ++i) + { + std::string name = std::string(",") + names[i] + std::string(","); + std::transform(name.begin(), name.end(), name.begin(), tolower); + scores[name] = float(positions[i].x * 1E-0 + positions[i].y * 1E-10 + positions[i].z * 1E-5); + } +} + +void getFrontBackScore(std::map& scores, const std::vector& names, const std::vector& positions) +{ + for (size_t i = 0; i < names.size() && i < positions.size(); ++i) + { + std::string name = std::string(",") + names[i] + std::string(","); + std::transform(name.begin(), name.end(), name.begin(), tolower); + scores[name] = float(positions[i].x * 1E-5 + positions[i].y * 1E-10 + positions[i].z * 1E-0); + } +} + +struct SSortAlpha +{ + explicit SSortAlpha(const std::vector& channels) : names(channels) { } + + bool operator()(const size_t i, const size_t j) const + { + std::string nameI = names[i]; + std::string nameJ = names[j]; + std::transform(nameI.begin(), nameI.end(), nameI.begin(), tolower); + std::transform(nameJ.begin(), nameJ.end(), nameJ.begin(), tolower); + + return nameI < nameJ; + } + + const std::vector& names; +}; + +struct SSortSpecial +{ + SSortSpecial(const std::vector& channels, const std::map& scoreMap) + : names(channels), scores(scoreMap) { } + + bool operator()(const size_t i, const size_t j) const + { + float scoreI = 0; + float scoreJ = 0; + + std::string nameI = std::string(",") + names[i] + std::string(","); + std::string nameJ = std::string(",") + names[j] + std::string(","); + std::transform(nameI.begin(), nameI.end(), nameI.begin(), tolower); + std::transform(nameJ.begin(), nameJ.end(), nameJ.begin(), tolower); + + for (auto it = scores.begin(); it != scores.end(); ++it) + { + if (it->first == nameI) { scoreI = it->second; } + if (it->first == nameJ) { scoreJ = it->second; } + } + + return scoreI < scoreJ; + } + + const std::vector& names; + const std::map& scores; +}; +} // namespace + +CRendererContext::CRendererContext(CRendererContext* parentCtx) +{ + clear(); + setParentRendererContext(parentCtx); +} + +void CRendererContext::clear() +{ + this->clearChannelInfo(); + this->clearTransformInfo(); + m_dimLabels.clear(); +} + +void CRendererContext::clearChannelInfo() +{ + m_channelLookup.clear(); + m_channelName.clear(); + m_channelPos.clear(); + + m_leftRightScore.clear(); + m_frontBackScore.clear(); +} + +void CRendererContext::addChannel(const std::string& name, const float x, const float y, const float z) +{ + const auto norm = float(sqrt(x * x + y * y + z * z)); + const float invNorm = (norm != 0 ? 1.F / norm : 0); + CVertex pos; + pos.x = x * invNorm; + pos.y = y * invNorm; + pos.z = z * invNorm; + m_channelLookup.push_back(m_channelName.size()); + m_channelName.push_back(name); + m_channelPos.push_back(pos); +} + +void CRendererContext::selectChannel(const size_t index) +{ + for (auto& i : m_channelLookup) { if (i == index) { return; } } + m_channelLookup.push_back(index); +} + +void CRendererContext::unselectChannel(const size_t index) +{ + for (size_t i = 0; i < m_channelLookup.size(); ++i) + { + if (m_channelLookup[i] == index) + { + m_channelLookup.erase(m_channelLookup.begin() + i); + return; + } + } +} + +void CRendererContext::sortSelectedChannel(const size_t mode) +{ + if (m_leftRightScore.empty()) { getLeftRightScore(m_leftRightScore, m_channelName, m_channelPos); } + if (m_frontBackScore.empty()) { getFrontBackScore(m_frontBackScore, m_channelName, m_channelPos); } + + switch (mode) + { + case 0: break; + + case 1: std::stable_sort(m_channelLookup.begin(), m_channelLookup.end()); + break; + + case 2: std::stable_sort(m_channelLookup.begin(), m_channelLookup.end(), SSortAlpha(m_channelName)); + break; + + case 3: std::reverse(m_channelLookup.begin(), m_channelLookup.end()); + break; + + case 4: std::stable_sort(m_channelLookup.begin(), m_channelLookup.end(), SSortSpecial(m_channelName, m_leftRightScore)); + break; + + case 5: std::stable_sort(m_channelLookup.begin(), m_channelLookup.end(), SSortSpecial(m_channelName, m_frontBackScore)); + break; + + default: break; + } +} + +///------------------------------------------------------------------------------------------------- +void CRendererContext::setDimensionLabel(const size_t idx1, const size_t idx2, const char* label) +{ + if (m_dimLabels[idx1].size() <= idx2) { m_dimLabels[idx1].resize(idx2 + 1); } + m_dimLabels[idx1][idx2] = label; +} + +size_t CRendererContext::getDimensionLabelCount(const size_t index) const +{ + if (m_dimLabels.count(index) == 0) { return 0; } + return m_dimLabels.at(index).size(); +} + +const char* CRendererContext::getDimensionLabel(const size_t idx1, const size_t idx2) const +{ + if (m_dimLabels.count(idx1) == 0 || m_dimLabels.at(idx1).size() <= idx2) { return nullptr; } + return m_dimLabels.at(idx1)[idx2].c_str(); +} + +///------------------------------------------------------------------------------------------------- +void CRendererContext::clearTransformInfo() +{ + m_parentCtx = nullptr; + m_scale = 1; + m_zoom = 1; + m_rotationX = 2; + m_rotationY = 1; + m_translucency = 1; + m_aspect = 1; + m_sampleDuration = 0; + m_timeScale = 1; + m_nElement = 1; + m_nFlowerRing = 1; + m_hasXYZPlotDepth = false; + m_isAxisDisplayed = false; + m_isPositiveOnly = false; + m_isTimeLocked = true; + m_isScrollModeActive = false; + m_checkBoardVisiblity = false; + m_scaleVisiblity = true; + m_dataType = EDataType::Matrix; + m_spectrumFreqRange = 0; + m_minSpectrumFreq = 0; + m_maxSpectrumFreq = 0; + m_erpPlayerActive = false; + m_erpFraction = 0; + m_nStack = 1; + m_stackIdx = 1; + m_faceMeshVisible = true; + m_scalpMeshVisible = true; +} + +std::string CRendererContext::getChannelName(const size_t index) const +{ + if (index < m_channelName.size()) { return m_channelName[index]; } + std::cout << "No name for channel " << index << std::endl; + return std::string(); +} + +bool CRendererContext::getChannelLocalisation(const size_t index, float& x, float& y, float& z) const +{ + const CVertex& tmp = m_channelPos[index]; + x = tmp.x; + y = tmp.y; + z = tmp.z; + return true; +} + +bool CRendererContext::isSelected(const size_t index) const +{ + for (auto& i : m_channelLookup) { if (i == index) { return true; } } + return false; +} + +float CRendererContext::getERPFraction() const +{ + const float erpFraction = m_erpFraction + (m_parentCtx ? m_parentCtx->getERPFraction() : 0); + return erpFraction - floorf(erpFraction); +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererCube.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererCube.cpp new file mode 100644 index 0000000..f89a6a7 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererCube.cpp @@ -0,0 +1,131 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#include "mCRendererCube.hpp" +#include "m_RendererTools.hpp" + +#include + +namespace OpenViBE { +namespace AdvancedVisualization { + +CRendererCube::CRendererCube() = default; + +void CRendererCube::rebuild(const CRendererContext& ctx) +{ + IRenderer::rebuild(ctx); + + m_vertices.clear(); + m_vertices.resize(ctx.getChannelCount()); + + m_historyIdx = 0; +} + +void CRendererCube::refresh(const CRendererContext& ctx) +{ + IRenderer::refresh(ctx); + + if (!m_nHistory) { return; } + + const float indexERP = (m_erpFraction * float(m_nSample - 1)); + const float alpha = indexERP - std::floor(indexERP); + const size_t indexERP1 = size_t(indexERP) % m_nSample; + const size_t indexERP2 = size_t(indexERP + 1) % m_nSample; + + for (size_t i = 0; i < m_vertices.size(); ++i) + { + m_vertices[i].u = m_history[i][m_nHistory - m_nSample + indexERP1] * (1 - alpha) + m_history[i][m_nHistory - m_nSample + indexERP2] * (alpha); + } + + m_historyIdx = m_nHistory; +} + +bool CRendererCube::render(const CRendererContext& ctx) +{ + if (!ctx.getSelectedCount() || m_vertices.empty() || !m_nHistory) { return false; } + + const float d = 3.5; + + glEnable(GL_DEPTH_TEST); + glDisable(GL_BLEND); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluPerspective(60, ctx.getAspect(), .01, 100); + glTranslatef(0, 0, -d); + glRotatef(ctx.getRotationX() * 10, 1, 0, 0); + glRotatef(ctx.getRotationY() * 10, 0, 1, 0); + + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glScalef(ctx.getScale(), 1, 1); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glScalef(ctx.getZoom(), ctx.getZoom(), ctx.getZoom()); + + glPushMatrix(); + glRotatef(19, 1, 0, 0); + for (size_t j = 0; j < ctx.getSelectedCount(); ++j) + { + CVertex v; + const size_t k = ctx.getSelected(j); + ctx.getChannelLocalisation(k, v.x, v.y, v.z); + const float scale = .1F * (.25F + fabs(m_vertices[k].u * ctx.getScale())); + + glPushMatrix(); + glTranslatef(v.x, v.y, v.z); + glTexCoord1f(m_vertices[k].u); + glScalef(scale, scale, scale); + + glColor3f(1, 1, 1); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + cube(); + + glColor3f(0, 0, 0); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + cube(); + + glPopMatrix(); + } + glPopMatrix(); + + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + if (ctx.getCheckBoardVisibility()) { this->drawCoordinateSystem(); } + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + + glMatrixMode(GL_TEXTURE); + glPopMatrix(); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + + return true; +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererCube.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererCube.hpp new file mode 100644 index 0000000..1233d7d --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererCube.hpp @@ -0,0 +1,41 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "mIRenderer.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRendererCube : public IRenderer +{ +public: + + CRendererCube(); + + void rebuild(const CRendererContext& ctx) override; + void refresh(const CRendererContext& ctx) override; + bool render(const CRendererContext& ctx) override; + +protected: + std::vector m_vertices; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererFlower.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererFlower.cpp new file mode 100644 index 0000000..bf8ffa8 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererFlower.cpp @@ -0,0 +1,171 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#define _USE_MATH_DEFINES +#include + +#include "mCRendererFlower.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { + +CRendererFlower::CRendererFlower(const size_t multiCount) { m_muliVertices.resize(multiCount); } + +void CRendererFlower::rebuild(const CRendererContext& ctx) +{ + IRenderer::rebuild(ctx); + + m_autoDecimationFactor = 1 + size_t((m_nSample - 1) / ctx.getMaximumSampleCountPerDisplay()); + + const size_t n = m_nSample / m_autoDecimationFactor; + + for (auto& multivertex : m_muliVertices) + { + multivertex.clear(); + multivertex.resize(m_nChannel); + for (size_t i = 0; i < m_nChannel; ++i) + { + multivertex[i].resize(n); + for (size_t j = 0; j < m_nSample - m_autoDecimationFactor + 1; j += m_autoDecimationFactor) + { + multivertex[i][j / m_autoDecimationFactor].u = j * m_nInverseSample; + } + } + } + + m_circles.clear(); + m_circles.resize(n); + for (size_t i = 0; i < n; ++i) + { + m_circles[i].x = cosf(float(ctx.getFlowerRingCount()) * i * float(M_PI) * 2.F / n); + m_circles[i].y = sinf(float(ctx.getFlowerRingCount()) * i * float(M_PI) * 2.F / n); + m_circles[i].z = 0; + } + + m_historyIdx = 0; +} + +void CRendererFlower::refresh(const CRendererContext& ctx) +{ + IRenderer::refresh(ctx); + + if (!m_nHistory) { return; } + + for (size_t z = 0; z < m_muliVertices.size(); ++z) + { + for (size_t i = 0; i < m_nChannel; ++i) + { + size_t k = ((m_nHistory - 1 - z * m_muliVertices[z][i].size()) / m_nSample) * m_nSample; + std::vector& history = m_history[i]; + CVertex* vertex = &m_muliVertices[z][i][0]; + CVertex* circleVertex = &m_circles[0]; + for (size_t j = 0; j < m_nSample - m_autoDecimationFactor + 1; j += m_autoDecimationFactor, k += m_autoDecimationFactor) + { + float sum = 0; + size_t count = 0; + + for (size_t l = 0; l < m_autoDecimationFactor; ++l) + { + if (/*k+l>=m_historyIdx && */k + l < m_nHistory) + { + sum += history[k + l]; + count++; + } + } + + if (count) + { + const float v = sum / count; + vertex->x = circleVertex->x * v; + vertex->y = circleVertex->y * v; + vertex->z = circleVertex->z * v; + vertex++; + circleVertex++; + } + else + { + vertex++; + circleVertex++; + } + } + } + } + + m_historyIdx = m_nHistory; +} + +bool CRendererFlower::render(const CRendererContext& ctx) +{ + if (!ctx.getSelectedCount() || m_muliVertices.empty() || !m_nHistory) { return false; } + + const size_t n = m_nSample / m_autoDecimationFactor; + const size_t d = (m_historyIdx % m_nSample) / m_autoDecimationFactor; + + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glLoadIdentity(); + + glMatrixMode(GL_MODELVIEW); + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + for (size_t i = 0; i < ctx.getSelectedCount(); ++i) + { + glPushMatrix(); + glTranslatef(.5F, .5F, 0); + glScalef(ctx.getScale(), ctx.getScale(), ctx.getScale()); + + for (auto& multi : m_muliVertices) + { + if (!multi.empty()) + { + std::vector& vertices = multi[ctx.getSelected(i)]; + + glVertexPointer(3, GL_FLOAT, sizeof(CVertex), &vertices[0].x); + glTexCoordPointer(1, GL_FLOAT, sizeof(CVertex), &vertices[n - d].u); + glDrawArrays(GL_LINE_STRIP, 0, GLsizei(d)); + + glVertexPointer(3, GL_FLOAT, sizeof(CVertex), &vertices[d].x); + glTexCoordPointer(1, GL_FLOAT, sizeof(CVertex), &vertices[0].u); + glDrawArrays(GL_LINE_STRIP, 0, GLsizei(n - d)); + + glBegin(GL_LINES); + glTexCoord1fv(&vertices[n - d].u); + glVertex2fv(&vertices[n - 1].x); + glVertex2fv(&vertices[0].x); + glEnd(); + } + } + glPopMatrix(); + } + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); + + glMatrixMode(GL_TEXTURE); + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + + return true; +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererFlower.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererFlower.hpp new file mode 100644 index 0000000..d41124e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererFlower.hpp @@ -0,0 +1,42 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "mIRenderer.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRendererFlower : public IRenderer +{ +public: + + explicit CRendererFlower(size_t multiCount = 1); + + void rebuild(const CRendererContext& ctx) override; + void refresh(const CRendererContext& ctx) override; + bool render(const CRendererContext& ctx) override; + +protected: + std::vector>> m_muliVertices; + std::vector m_circles; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererLine.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererLine.cpp new file mode 100644 index 0000000..46aa439 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererLine.cpp @@ -0,0 +1,166 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include +#include "mCRendererLine.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { + +void CRendererLine::rebuild(const CRendererContext& ctx) +{ + IRenderer::rebuild(ctx); + + m_vertices.clear(); + m_vertices.resize(m_nChannel); + + for (size_t i = 0; i < m_nChannel; ++i) + { + m_vertices[i].resize(m_nSample); + for (size_t j = 0; j < m_nSample; ++j) { m_vertices[i][j].x = j * m_nInverseSample; } + } + + m_historyIdx = 0; +} + +void CRendererLine::refresh(const CRendererContext& ctx) +{ + IRenderer::refresh(ctx); + + if (!m_nHistory) { return; } + + size_t maxIdx; + + if (m_historyDrawIdx == 0) { maxIdx = m_nHistory; } // Draw real-time + else { maxIdx = m_historyDrawIdx; } // stay at the m_historyDrawIdx + + for (size_t i = 0; i < m_nChannel; ++i) + { + const size_t firstIdx = ((maxIdx - 1) / m_nSample) * m_nSample; + std::vector& history = m_history[i]; + CVertex* vertex = &m_vertices[i][0]; + + for (size_t j = 0; j < m_nSample; ++j) + { + const size_t idx = firstIdx + j; + + if (idx < maxIdx) { vertex->y = history[idx]; } + else if (idx >= m_nSample) { vertex->y = history[idx - m_nSample]; } + + vertex++; + } + } + + m_historyIdx = maxIdx; +} + +bool CRendererLine::render(const CRendererContext& ctx) +{ + if (!ctx.getSelectedCount() || !m_nHistory) { return false; } + + const auto nSample = int(m_nSample); + + + // When the display is in continuous mode, there will be n1 samples + // displayed until the 'cursor' and n2 samples will be displayed to + // complete the whole window. + // For example at 25s with a display size of 20s + // <- n1 samples -><------------ n2 samples ----------------> + // | ____ | ___ | + // |/ \ | ___ / \ ____ | + // |------\------/|-----/---\--------/-----\___/----\-------| + // | \____/ | / \______/ \______| + // | |___/ | + // Time 25s 10s 20s + + const auto n1 = int(m_historyIdx % m_nSample); + const auto n2 = int(nSample - n1); + + if (!nSample) { return false; } + + const float t1 = n2 * 1.F / nSample; + const float t2 = -n1 * 1.F / nSample; + + glDisable(GL_TEXTURE_1D); + + glPushMatrix(); + glScalef(1, 1.F / ctx.getSelectedCount(), 1); + glTranslatef(0, ctx.isPositiveOnly() ? 0 : 0.5F, 0); + + glPushAttrib(GL_CURRENT_BIT); + glColor3f(.2F, .2F, .2F); + glBegin(GL_LINES); + for (size_t i = 0; i < ctx.getSelectedCount(); ++i) + { + glVertex2f(0, float(i)); + glVertex2f(1, float(i)); + } + glEnd(); + glPopAttrib(); + + glEnableClientState(GL_VERTEX_ARRAY); + for (size_t i = 0; i < ctx.getSelectedCount(); ++i) + { + glPushMatrix(); + glTranslatef(0, float(ctx.getSelectedCount() - i) - 1.F, 0); + glScalef(1, ctx.getScale(), 1); + + std::vector& vertices = m_vertices[ctx.getSelected(i)]; + if (ctx.isScrollModeActive()) + { + glPushMatrix(); + glTranslatef(t1, 0, 0); + glVertexPointer(3, GL_FLOAT, sizeof(CVertex), &vertices[0].x); + glDrawArrays(GL_LINE_STRIP, 0, n1); + glPopMatrix(); + if (n2 > 0) + { + glPushMatrix(); + glTranslatef(t2, 0, 0); + glVertexPointer(3, GL_FLOAT, sizeof(CVertex), &vertices[n1].x); + glDrawArrays(GL_LINE_STRIP, 0, n2); + glPopMatrix(); + + if (n1 > 0) + { + glBegin(GL_LINES); + glVertex2f(vertices[nSample - 1].x + t2, vertices[nSample - 1].y); + glVertex2f(vertices[0].x + t1, vertices[0].y); + glEnd(); + } + } + } + else + { + glVertexPointer(3, GL_FLOAT, sizeof(CVertex), &vertices[0].x); + glDrawArrays(GL_LINE_STRIP, 0, nSample); + } + glPopMatrix(); + } + glDisableClientState(GL_VERTEX_ARRAY); + + glPopMatrix(); + + return true; +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererLine.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererLine.hpp new file mode 100644 index 0000000..4ed7eac --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererLine.hpp @@ -0,0 +1,40 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "mIRenderer.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRendererLine : public IRenderer +{ +public: + CRendererLine() = default; + + void rebuild(const CRendererContext& ctx) override; + void refresh(const CRendererContext& ctx) override; + bool render(const CRendererContext& ctx) override; + +protected: + std::vector> m_vertices; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererLoreta.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererLoreta.cpp new file mode 100644 index 0000000..568e44e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererLoreta.cpp @@ -0,0 +1,664 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#if defined TARGET_HAS_ThirdPartyOpenGL + +#include "mCRendererLoreta.hpp" + +#include "content/loreta_anatomic_voxels.hpp" +#include "content/loreta_roi_voxels.hpp" +#include "content/Face.obj.hpp" +#include "content/Scalp.obj.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { + +namespace { +//-32,8,-40, +int loretaVoxel[2394][3] = { + { 52, -41, -11 }, { 45, -41, -11 }, { 38, -41, -11 }, { 31, -41, -11 }, { -32, -41, -11 }, { -39, -41, -11 }, { -46, -41, -11 }, { -53, -41, -11 }, + { 52, -41, -4 }, { 45, -41, -4 }, { 38, -41, -4 }, { 31, -41, -4 }, { 24, -41, -4 }, { -25, -41, -4 }, { -32, -41, -4 }, { -39, -41, -4 }, + { -46, -41, -4 }, { -53, -41, -4 }, { 52, -41, 3 }, { 45, -41, 3 }, { 38, -41, 3 }, { 31, -41, 3 }, { 24, -41, 3 }, { -18, -41, 3 }, { -25, -41, 3 }, + { -32, -41, 3 }, { -39, -41, 3 }, { -46, -41, 3 }, { -53, -41, 3 }, { 45, -41, 10 }, { 38, -41, 10 }, { 31, -41, 10 }, { -25, -41, 10 }, + { -32, -41, 10 }, { -39, -41, 10 }, { -46, -41, 10 }, { 38, -41, 17 }, { 31, -41, 17 }, { -32, -41, 17 }, { -39, -41, 17 }, { 59, -34, -18 }, + { 52, -34, -18 }, { 45, -34, -18 }, { 38, -34, -18 }, { 31, -34, -18 }, { -32, -34, -18 }, { -39, -34, -18 }, { -46, -34, -18 }, { -53, -34, -18 }, + { -60, -34, -18 }, { 59, -34, -11 }, { 52, -34, -11 }, { 45, -34, -11 }, { 38, -34, -11 }, { 31, -34, -11 }, { 24, -34, -11 }, { -25, -34, -11 }, + { -32, -34, -11 }, { -39, -34, -11 }, { -46, -34, -11 }, { -53, -34, -11 }, { -60, -34, -11 }, { 59, -34, -4 }, { 52, -34, -4 }, { 31, -34, -4 }, + { 24, -34, -4 }, { 17, -34, -4 }, { -18, -34, -4 }, { -25, -34, -4 }, { -32, -34, -4 }, { -39, -34, -4 }, { -46, -34, -4 }, { -53, -34, -4 }, + { -60, -34, -4 }, { 52, -34, 3 }, { 45, -34, 3 }, { 24, -34, 3 }, { -18, -34, 3 }, { -25, -34, 3 }, { -46, -34, 3 }, { -53, -34, 3 }, { 52, -34, 10 }, + { 45, -34, 10 }, { 38, -34, 10 }, { 31, -34, 10 }, { 24, -34, 10 }, { -25, -34, 10 }, { -32, -34, 10 }, { -39, -34, 10 }, { -46, -34, 10 }, + { -53, -34, 10 }, { 45, -34, 17 }, { 38, -34, 17 }, { 31, -34, 17 }, { -32, -34, 17 }, { -39, -34, 17 }, { -46, -34, 17 }, { 52, -27, -46 }, + { 45, -27, -46 }, { -46, -27, -46 }, { -53, -27, -46 }, { 59, -27, -39 }, { 52, -27, -39 }, { 45, -27, -39 }, { 38, -27, -39 }, { -39, -27, -39 }, + { -46, -27, -39 }, { -53, -27, -39 }, { -60, -27, -39 }, { 59, -27, -32 }, { 52, -27, -32 }, { 45, -27, -32 }, { 38, -27, -32 }, { 31, -27, -32 }, + { -32, -27, -32 }, { -39, -27, -32 }, { -46, -27, -32 }, { -53, -27, -32 }, { -60, -27, -32 }, { 59, -27, -25 }, { 52, -27, -25 }, { 45, -27, -25 }, + { 38, -27, -25 }, { 31, -27, -25 }, { 24, -27, -25 }, { -25, -27, -25 }, { -32, -27, -25 }, { -39, -27, -25 }, { -46, -27, -25 }, { -53, -27, -25 }, + { -60, -27, -25 }, { 59, -27, -18 }, { 52, -27, -18 }, { 45, -27, -18 }, { 38, -27, -18 }, { 31, -27, -18 }, { -32, -27, -18 }, { -39, -27, -18 }, + { -46, -27, -18 }, { -53, -27, -18 }, { -60, -27, -18 }, { 59, -27, -11 }, { 52, -27, -11 }, { 38, -27, -11 }, { 31, -27, -11 }, { 24, -27, -11 }, + { 17, -27, -11 }, { -18, -27, -11 }, { -25, -27, -11 }, { -32, -27, -11 }, { -39, -27, -11 }, { -53, -27, -11 }, { -60, -27, -11 }, { 59, -27, -4 }, + { 52, -27, -4 }, { 31, -27, -4 }, { 24, -27, -4 }, { 17, -27, -4 }, { -18, -27, -4 }, { -25, -27, -4 }, { -32, -27, -4 }, { -60, -27, -4 }, + { 59, -27, 3 }, { 52, -27, 3 }, { 31, -27, 3 }, { 24, -27, 3 }, { 17, -27, 3 }, { -18, -27, 3 }, { -25, -27, 3 }, { -32, -27, 3 }, { -53, -27, 3 }, + { -60, -27, 3 }, { 52, -27, 10 }, { 45, -27, 10 }, { 38, -27, 10 }, { 31, -27, 10 }, { -32, -27, 10 }, { -39, -27, 10 }, { -46, -27, 10 }, + { -53, -27, 10 }, { 45, -27, 17 }, { 38, -27, 17 }, { 31, -27, 17 }, { -32, -27, 17 }, { -39, -27, 17 }, { -46, -27, 17 }, { 10, -27, 24 }, + { 3, -27, 24 }, { -4, -27, 24 }, { -11, -27, 24 }, { 10, -27, 31 }, { 3, -27, 31 }, { -4, -27, 31 }, { -11, -27, 31 }, { 10, -27, 38 }, { 3, -27, 38 }, + { -4, -27, 38 }, { -11, -27, 38 }, { 10, -27, 45 }, { 3, -27, 45 }, { -4, -27, 45 }, { -11, -27, 45 }, { 10, -27, 52 }, { 3, -27, 52 }, { -4, -27, 52 }, + { -11, -27, 52 }, { 52, -20, -60 }, { 45, -20, -60 }, { 38, -20, -60 }, { -39, -20, -60 }, { -46, -20, -60 }, { -53, -20, -60 }, { 59, -20, -53 }, + { 52, -20, -53 }, { 45, -20, -53 }, { 38, -20, -53 }, { 31, -20, -53 }, { -32, -20, -53 }, { -39, -20, -53 }, { -46, -20, -53 }, { -53, -20, -53 }, + { -60, -20, -53 }, { 59, -20, -46 }, { 52, -20, -46 }, { 45, -20, -46 }, { 38, -20, -46 }, { 31, -20, -46 }, { -32, -20, -46 }, { -39, -20, -46 }, + { -46, -20, -46 }, { -53, -20, -46 }, { -60, -20, -46 }, { 66, -20, -39 }, { 59, -20, -39 }, { 52, -20, -39 }, { 45, -20, -39 }, { 38, -20, -39 }, + { 31, -20, -39 }, { 24, -20, -39 }, { -25, -20, -39 }, { -32, -20, -39 }, { -39, -20, -39 }, { -46, -20, -39 }, { -53, -20, -39 }, { -60, -20, -39 }, + { 66, -20, -32 }, { 59, -20, -32 }, { 52, -20, -32 }, { 45, -20, -32 }, { 38, -20, -32 }, { 31, -20, -32 }, { 24, -20, -32 }, { -25, -20, -32 }, + { -32, -20, -32 }, { -39, -20, -32 }, { -46, -20, -32 }, { -53, -20, -32 }, { -60, -20, -32 }, { -67, -20, -32 }, { 66, -20, -25 }, { 59, -20, -25 }, + { 38, -20, -25 }, { 31, -20, -25 }, { -25, -20, -25 }, { -32, -20, -25 }, { -39, -20, -25 }, { -60, -20, -25 }, { -67, -20, -25 }, { 66, -20, -18 }, + { 59, -20, -18 }, { 38, -20, -18 }, { 31, -20, -18 }, { 24, -20, -18 }, { 17, -20, -18 }, { -18, -20, -18 }, { -25, -20, -18 }, { -32, -20, -18 }, + { -60, -20, -18 }, { -67, -20, -18 }, { 66, -20, -11 }, { 59, -20, -11 }, { 31, -20, -11 }, { 24, -20, -11 }, { 17, -20, -11 }, { -18, -20, -11 }, + { -25, -20, -11 }, { -32, -20, -11 }, { -60, -20, -11 }, { -67, -20, -11 }, { 59, -20, -4 }, { 52, -20, -4 }, { 31, -20, -4 }, { 24, -20, -4 }, + { 17, -20, -4 }, { -18, -20, -4 }, { -25, -20, -4 }, { -32, -20, -4 }, { -53, -20, -4 }, { -60, -20, -4 }, { 59, -20, 3 }, { 52, -20, 3 }, + { 45, -20, 3 }, { 38, -20, 3 }, { 31, -20, 3 }, { -25, -20, 3 }, { -32, -20, 3 }, { -39, -20, 3 }, { -46, -20, 3 }, { -53, -20, 3 }, { -60, -20, 3 }, + { 52, -20, 10 }, { 45, -20, 10 }, { 24, -20, 10 }, { 17, -20, 10 }, { 10, -20, 10 }, { -4, -20, 10 }, { -11, -20, 10 }, { -18, -20, 10 }, + { -25, -20, 10 }, { -46, -20, 10 }, { -53, -20, 10 }, { 52, -20, 17 }, { 45, -20, 17 }, { 38, -20, 17 }, { 31, -20, 17 }, { 24, -20, 17 }, + { 17, -20, 17 }, { 10, -20, 17 }, { 3, -20, 17 }, { -4, -20, 17 }, { -11, -20, 17 }, { -18, -20, 17 }, { -25, -20, 17 }, { -32, -20, 17 }, + { -46, -20, 17 }, { -53, -20, 17 }, { 38, -20, 24 }, { 31, -20, 24 }, { 24, -20, 24 }, { 17, -20, 24 }, { 10, -20, 24 }, { 3, -20, 24 }, + { -4, -20, 24 }, { -11, -20, 24 }, { -18, -20, 24 }, { -25, -20, 24 }, { -32, -20, 24 }, { -39, -20, 24 }, { 38, -20, 31 }, { 31, -20, 31 }, + { 24, -20, 31 }, { 10, -20, 31 }, { 3, -20, 31 }, { -4, -20, 31 }, { -11, -20, 31 }, { -18, -20, 31 }, { -25, -20, 31 }, { -32, -20, 31 }, + { -39, -20, 31 }, { 24, -20, 38 }, { 10, -20, 38 }, { 3, -20, 38 }, { -4, -20, 38 }, { -11, -20, 38 }, { -18, -20, 38 }, { -25, -20, 38 }, + { 17, -20, 45 }, { 10, -20, 45 }, { 3, -20, 45 }, { -4, -20, 45 }, { -11, -20, 45 }, { -18, -20, 45 }, { -25, -20, 45 }, { 17, -20, 52 }, + { 3, -20, 52 }, { -4, -20, 52 }, { -18, -20, 52 }, { 10, -20, 59 }, { 3, -20, 59 }, { -4, -20, 59 }, { -11, -20, 59 }, { -18, -20, 59 }, + { 17, -13, -102 }, { 10, -13, -102 }, { 17, -13, -95 }, { 10, -13, -95 }, { 3, -13, -95 }, { -32, -13, -95 }, { 38, -13, -88 }, { 17, -13, -88 }, + { 10, -13, -88 }, { 3, -13, -88 }, { -4, -13, -88 }, { -11, -13, -88 }, { -18, -13, -88 }, { -25, -13, -88 }, { -32, -13, -88 }, { -39, -13, -88 }, + { 45, -13, -81 }, { 38, -13, -81 }, { 31, -13, -81 }, { 24, -13, -81 }, { 17, -13, -81 }, { 10, -13, -81 }, { 3, -13, -81 }, { -4, -13, -81 }, + { -11, -13, -81 }, { -18, -13, -81 }, { -39, -13, -81 }, { -46, -13, -81 }, { 45, -13, -74 }, { 38, -13, -74 }, { -32, -13, -74 }, { -39, -13, -74 }, + { -46, -13, -74 }, { 52, -13, -67 }, { 45, -13, -67 }, { 38, -13, -67 }, { -39, -13, -67 }, { -46, -13, -67 }, { -53, -13, -67 }, { 59, -13, -60 }, + { 52, -13, -60 }, { 45, -13, -60 }, { 38, -13, -60 }, { 31, -13, -60 }, { -39, -13, -60 }, { -46, -13, -60 }, { -53, -13, -60 }, { -60, -13, -60 }, + { 59, -13, -53 }, { 52, -13, -53 }, { 45, -13, -53 }, { 38, -13, -53 }, { -46, -13, -53 }, { -53, -13, -53 }, { -60, -13, -53 }, { 66, -13, -46 }, + { 59, -13, -46 }, { 52, -13, -46 }, { 45, -13, -46 }, { 31, -13, -46 }, { 24, -13, -46 }, { -46, -13, -46 }, { -53, -13, -46 }, { -60, -13, -46 }, + { -67, -13, -46 }, { 66, -13, -39 }, { 59, -13, -39 }, { 31, -13, -39 }, { 24, -13, -39 }, { 17, -13, -39 }, { -25, -13, -39 }, { -32, -13, -39 }, + { -60, -13, -39 }, { -67, -13, -39 }, { 66, -13, -32 }, { 59, -13, -32 }, { 31, -13, -32 }, { 24, -13, -32 }, { 17, -13, -32 }, { -18, -13, -32 }, + { -32, -13, -32 }, { -60, -13, -32 }, { -67, -13, -32 }, { 66, -13, -25 }, { 59, -13, -25 }, { 38, -13, -25 }, { 31, -13, -25 }, { 24, -13, -25 }, + { -25, -13, -25 }, { -32, -13, -25 }, { -39, -13, -25 }, { -60, -13, -25 }, { -67, -13, -25 }, { 66, -13, -18 }, { 59, -13, -18 }, { 52, -13, -18 }, + { 31, -13, -18 }, { 24, -13, -18 }, { -32, -13, -18 }, { -53, -13, -18 }, { -67, -13, -18 }, { 66, -13, -11 }, { 59, -13, -11 }, { 52, -13, -11 }, + { 24, -13, -11 }, { 17, -13, -11 }, { -18, -13, -11 }, { -25, -13, -11 }, { -53, -13, -11 }, { -60, -13, -11 }, { -67, -13, -11 }, { 59, -13, -4 }, + { 52, -13, -4 }, { 45, -13, -4 }, { 38, -13, -4 }, { 31, -13, -4 }, { 24, -13, -4 }, { 17, -13, -4 }, { 10, -13, -4 }, { -18, -13, -4 }, + { -25, -13, -4 }, { -39, -13, -4 }, { -46, -13, -4 }, { -53, -13, -4 }, { -60, -13, -4 }, { 59, -13, 3 }, { 52, -13, 3 }, { 45, -13, 3 }, + { 38, -13, 3 }, { 31, -13, 3 }, { 24, -13, 3 }, { 17, -13, 3 }, { 10, -13, 3 }, { 3, -13, 3 }, { -4, -13, 3 }, { -11, -13, 3 }, { -18, -13, 3 }, + { -25, -13, 3 }, { -32, -13, 3 }, { -39, -13, 3 }, { -46, -13, 3 }, { -53, -13, 3 }, { -60, -13, 3 }, { 52, -13, 10 }, { 38, -13, 10 }, { 31, -13, 10 }, + { 24, -13, 10 }, { 17, -13, 10 }, { 10, -13, 10 }, { 3, -13, 10 }, { -4, -13, 10 }, { -11, -13, 10 }, { -18, -13, 10 }, { -25, -13, 10 }, + { -32, -13, 10 }, { -39, -13, 10 }, { -46, -13, 10 }, { -53, -13, 10 }, { 52, -13, 17 }, { 45, -13, 17 }, { 38, -13, 17 }, { 31, -13, 17 }, + { 3, -13, 17 }, { -4, -13, 17 }, { -11, -13, 17 }, { -32, -13, 17 }, { -39, -13, 17 }, { -46, -13, 17 }, { -53, -13, 17 }, { 45, -13, 24 }, + { 3, -13, 24 }, { -4, -13, 24 }, { -32, -13, 24 }, { -39, -13, 24 }, { -46, -13, 24 }, { 45, -13, 31 }, { 38, -13, 31 }, { 31, -13, 31 }, + { 24, -13, 31 }, { 3, -13, 31 }, { -4, -13, 31 }, { -25, -13, 31 }, { -46, -13, 31 }, { 52, -13, 38 }, { 38, -13, 38 }, { 31, -13, 38 }, + { 24, -13, 38 }, { 10, -13, 38 }, { 3, -13, 38 }, { -4, -13, 38 }, { -25, -13, 38 }, { -32, -13, 38 }, { -39, -13, 38 }, { 45, -13, 45 }, + { 38, -13, 45 }, { 31, -13, 45 }, { 24, -13, 45 }, { 10, -13, 45 }, { 3, -13, 45 }, { -4, -13, 45 }, { -25, -13, 45 }, { -32, -13, 45 }, + { -39, -13, 45 }, { -46, -13, 45 }, { 38, -13, 52 }, { 31, -13, 52 }, { 24, -13, 52 }, { 3, -13, 52 }, { -4, -13, 52 }, { -25, -13, 52 }, + { -32, -13, 52 }, { -39, -13, 52 }, { 38, -13, 59 }, { 31, -13, 59 }, { 24, -13, 59 }, { 3, -13, 59 }, { -4, -13, 59 }, { -18, -13, 59 }, + { -25, -13, 59 }, { -32, -13, 59 }, { -39, -13, 59 }, { 17, -13, 66 }, { 10, -13, 66 }, { 3, -13, 66 }, { -4, -13, 66 }, { -11, -13, 66 }, + { -18, -13, 66 }, { -25, -13, 66 }, { 24, -6, -102 }, { 17, -6, -102 }, { 10, -6, -102 }, { 10, -6, -95 }, { 3, -6, -95 }, { -32, -6, -95 }, + { 45, -6, -88 }, { 38, -6, -88 }, { 31, -6, -88 }, { 3, -6, -88 }, { -4, -6, -88 }, { -39, -6, -88 }, { 45, -6, -81 }, { 3, -6, -81 }, { -4, -6, -81 }, + { -46, -6, -81 }, { 52, -6, -74 }, { 45, -6, -74 }, { 10, -6, -74 }, { 3, -6, -74 }, { -4, -6, -74 }, { -11, -6, -74 }, { -25, -6, -74 }, + { -46, -6, -74 }, { -53, -6, -74 }, { 59, -6, -67 }, { 52, -6, -67 }, { 45, -6, -67 }, { 24, -6, -67 }, { 17, -6, -67 }, { 10, -6, -67 }, + { -11, -6, -67 }, { -18, -6, -67 }, { -25, -6, -67 }, { -46, -6, -67 }, { -53, -6, -67 }, { 59, -6, -60 }, { 52, -6, -60 }, { 45, -6, -60 }, + { 24, -6, -60 }, { 17, -6, -60 }, { 10, -6, -60 }, { -11, -6, -60 }, { -18, -6, -60 }, { -25, -6, -60 }, { -46, -6, -60 }, { -53, -6, -60 }, + { -60, -6, -60 }, { 66, -6, -53 }, { 59, -6, -53 }, { 31, -6, -53 }, { 24, -6, -53 }, { 17, -6, -53 }, { 10, -6, -53 }, { -11, -6, -53 }, + { -18, -6, -53 }, { -25, -6, -53 }, { -32, -6, -53 }, { -46, -6, -53 }, { -53, -6, -53 }, { -60, -6, -53 }, { 66, -6, -46 }, { 59, -6, -46 }, + { 31, -6, -46 }, { 24, -6, -46 }, { 17, -6, -46 }, { -11, -6, -46 }, { -18, -6, -46 }, { -25, -6, -46 }, { -32, -6, -46 }, { -60, -6, -46 }, + { -67, -6, -46 }, { 66, -6, -39 }, { 59, -6, -39 }, { 31, -6, -39 }, { 24, -6, -39 }, { -18, -6, -39 }, { -32, -6, -39 }, { -60, -6, -39 }, + { -67, -6, -39 }, { 66, -6, -32 }, { 59, -6, -32 }, { 52, -6, -32 }, { 31, -6, -32 }, { 24, -6, -32 }, { 17, -6, -32 }, { -18, -6, -32 }, + { -25, -6, -32 }, { -32, -6, -32 }, { -53, -6, -32 }, { -60, -6, -32 }, { -67, -6, -32 }, { 66, -6, -25 }, { 59, -6, -25 }, { 52, -6, -25 }, + { -46, -6, -25 }, { -53, -6, -25 }, { -60, -6, -25 }, { -67, -6, -25 }, { 66, -6, -18 }, { 59, -6, -18 }, { 52, -6, -18 }, { 38, -6, -18 }, + { -53, -6, -18 }, { -60, -6, -18 }, { -67, -6, -18 }, { 59, -6, -11 }, { 52, -6, -11 }, { 45, -6, -11 }, { 38, -6, -11 }, { 3, -6, -11 }, + { -4, -6, -11 }, { -39, -6, -11 }, { -46, -6, -11 }, { -53, -6, -11 }, { -60, -6, -11 }, { -67, -6, -11 }, { 59, -6, -4 }, { 38, -6, -4 }, + { 3, -6, -4 }, { -4, -6, -4 }, { -39, -6, -4 }, { -46, -6, -4 }, { -53, -6, -4 }, { -60, -6, -4 }, { 59, -6, 3 }, { 52, -6, 3 }, { 38, -6, 3 }, + { 3, -6, 3 }, { -4, -6, 3 }, { -39, -6, 3 }, { -53, -6, 3 }, { -60, -6, 3 }, { 52, -6, 10 }, { 38, -6, 10 }, { 3, -6, 10 }, { -4, -6, 10 }, + { -39, -6, 10 }, { -46, -6, 10 }, { -53, -6, 10 }, { -60, -6, 10 }, { 38, -6, 17 }, { 31, -6, 17 }, { 3, -6, 17 }, { -4, -6, 17 }, { -32, -6, 17 }, + { -39, -6, 17 }, { 52, -6, 24 }, { 45, -6, 24 }, { 38, -6, 24 }, { 31, -6, 24 }, { 3, -6, 24 }, { -4, -6, 24 }, { -32, -6, 24 }, { -39, -6, 24 }, + { -46, -6, 24 }, { -53, -6, 24 }, { 52, -6, 31 }, { 45, -6, 31 }, { 3, -6, 31 }, { -4, -6, 31 }, { -46, -6, 31 }, { -53, -6, 31 }, { 52, -6, 38 }, + { 45, -6, 38 }, { 10, -6, 38 }, { 3, -6, 38 }, { -4, -6, 38 }, { -11, -6, 38 }, { -53, -6, 38 }, { 45, -6, 45 }, { 10, -6, 45 }, { 3, -6, 45 }, + { -4, -6, 45 }, { -11, -6, 45 }, { -46, -6, 45 }, { 45, -6, 52 }, { 38, -6, 52 }, { 10, -6, 52 }, { 3, -6, 52 }, { -4, -6, 52 }, { -11, -6, 52 }, + { -39, -6, 52 }, { -46, -6, 52 }, { 38, -6, 59 }, { 31, -6, 59 }, { 24, -6, 59 }, { 3, -6, 59 }, { -4, -6, 59 }, { -25, -6, 59 }, { -32, -6, 59 }, + { -39, -6, 59 }, { 24, -6, 66 }, { 17, -6, 66 }, { 10, -6, 66 }, { 3, -6, 66 }, { -4, -6, 66 }, { -11, -6, 66 }, { -18, -6, 66 }, { -25, -6, 66 }, + { -32, -6, 66 }, { 24, 1, -102 }, { 31, 1, -95 }, { 3, 1, -95 }, { -32, 1, -95 }, { 45, 1, -88 }, { 38, 1, -88 }, { 31, 1, -88 }, { 10, 1, -88 }, + { 3, 1, -88 }, { -4, 1, -88 }, { -11, 1, -88 }, { -32, 1, -88 }, { -39, 1, -88 }, { 45, 1, -81 }, { 10, 1, -81 }, { 3, 1, -81 }, { -4, 1, -81 }, + { -11, 1, -81 }, { -46, 1, -81 }, { 52, 1, -74 }, { 45, 1, -74 }, { 3, 1, -74 }, { -4, 1, -74 }, { -46, 1, -74 }, { -53, 1, -74 }, { 59, 1, -67 }, + { 52, 1, -67 }, { 45, 1, -67 }, { 17, 1, -67 }, { 10, 1, -67 }, { 3, 1, -67 }, { -4, 1, -67 }, { -46, 1, -67 }, { -53, 1, -67 }, { 59, 1, -60 }, + { 52, 1, -60 }, { 17, 1, -60 }, { 10, 1, -60 }, { -11, 1, -60 }, { -46, 1, -60 }, { -53, 1, -60 }, { -60, 1, -60 }, { 66, 1, -53 }, { 59, 1, -53 }, + { 24, 1, -53 }, { 17, 1, -53 }, { 10, 1, -53 }, { -11, 1, -53 }, { -18, 1, -53 }, { -25, 1, -53 }, { -32, 1, -53 }, { -60, 1, -53 }, { 66, 1, -46 }, + { 59, 1, -46 }, { 52, 1, -46 }, { 10, 1, -46 }, { -11, 1, -46 }, { -18, 1, -46 }, { -60, 1, -46 }, { -67, 1, -46 }, { 66, 1, -39 }, { 59, 1, -39 }, + { 52, 1, -39 }, { 31, 1, -39 }, { 24, 1, -39 }, { 17, 1, -39 }, { -11, 1, -39 }, { -18, 1, -39 }, { -25, 1, -39 }, { -46, 1, -39 }, { -53, 1, -39 }, + { -60, 1, -39 }, { -67, 1, -39 }, { 66, 1, -32 }, { 59, 1, -32 }, { 52, 1, -32 }, { -46, 1, -32 }, { -53, 1, -32 }, { -60, 1, -32 }, { -67, 1, -32 }, + { 66, 1, -25 }, { 59, 1, -25 }, { 38, 1, -25 }, { -53, 1, -25 }, { -60, 1, -25 }, { -67, 1, -25 }, { 66, 1, -18 }, { 45, 1, -18 }, { 38, 1, -18 }, + { 31, 1, -18 }, { -39, 1, -18 }, { -46, 1, -18 }, { -67, 1, -18 }, { 59, 1, -11 }, { 52, 1, -11 }, { 38, 1, -11 }, { 31, 1, -11 }, { -39, 1, -11 }, + { -46, 1, -11 }, { -67, 1, -11 }, { 59, 1, -4 }, { 52, 1, -4 }, { 45, 1, -4 }, { 38, 1, -4 }, { -39, 1, -4 }, { -53, 1, -4 }, { -60, 1, -4 }, + { 59, 1, 3 }, { 52, 1, 3 }, { 45, 1, 3 }, { 38, 1, 3 }, { -39, 1, 3 }, { -46, 1, 3 }, { -53, 1, 3 }, { -60, 1, 3 }, { 52, 1, 10 }, { 45, 1, 10 }, + { 38, 1, 10 }, { -39, 1, 10 }, { -46, 1, 10 }, { -53, 1, 10 }, { 52, 1, 17 }, { 45, 1, 17 }, { 38, 1, 17 }, { 31, 1, 17 }, { -32, 1, 17 }, + { -39, 1, 17 }, { -46, 1, 17 }, { -53, 1, 17 }, { 52, 1, 24 }, { 45, 1, 24 }, { 38, 1, 24 }, { 31, 1, 24 }, { -32, 1, 24 }, { -39, 1, 24 }, + { -46, 1, 24 }, { -53, 1, 24 }, { 52, 1, 31 }, { 38, 1, 31 }, { 31, 1, 31 }, { -32, 1, 31 }, { -39, 1, 31 }, { -53, 1, 31 }, { 52, 1, 38 }, + { 3, 1, 38 }, { -4, 1, 38 }, { -46, 1, 38 }, { -53, 1, 38 }, { 45, 1, 45 }, { 38, 1, 45 }, { 10, 1, 45 }, { 3, 1, 45 }, { -4, 1, 45 }, { -11, 1, 45 }, + { -39, 1, 45 }, { -46, 1, 45 }, { 45, 1, 52 }, { 38, 1, 52 }, { 24, 1, 52 }, { 10, 1, 52 }, { 3, 1, 52 }, { -4, 1, 52 }, { -11, 1, 52 }, { -25, 1, 52 }, + { -32, 1, 52 }, { -39, 1, 52 }, { -46, 1, 52 }, { 38, 1, 59 }, { 31, 1, 59 }, { 24, 1, 59 }, { 10, 1, 59 }, { 3, 1, 59 }, { -4, 1, 59 }, { -25, 1, 59 }, + { -32, 1, 59 }, { -39, 1, 59 }, { 24, 1, 66 }, { 17, 1, 66 }, { 10, 1, 66 }, { 3, 1, 66 }, { -4, 1, 66 }, { -11, 1, 66 }, { -18, 1, 66 }, + { -25, 1, 66 }, { 31, 8, -95 }, { -4, 8, -95 }, { -32, 8, -95 }, { 45, 8, -88 }, { 38, 8, -88 }, { 31, 8, -88 }, { 3, 8, -88 }, { -4, 8, -88 }, + { -11, 8, -88 }, { -32, 8, -88 }, { -39, 8, -88 }, { 45, 8, -81 }, { 10, 8, -81 }, { 3, 8, -81 }, { -4, 8, -81 }, { -11, 8, -81 }, { -39, 8, -81 }, + { -46, 8, -81 }, { 52, 8, -74 }, { 45, 8, -74 }, { 10, 8, -74 }, { 3, 8, -74 }, { -4, 8, -74 }, { -11, 8, -74 }, { -46, 8, -74 }, { -53, 8, -74 }, + { 59, 8, -67 }, { 52, 8, -67 }, { 45, 8, -67 }, { 24, 8, -67 }, { 17, 8, -67 }, { 10, 8, -67 }, { 3, 8, -67 }, { -4, 8, -67 }, { -11, 8, -67 }, + { -18, 8, -67 }, { -25, 8, -67 }, { -46, 8, -67 }, { -53, 8, -67 }, { 59, 8, -60 }, { 52, 8, -60 }, { 45, 8, -60 }, { 24, 8, -60 }, { 17, 8, -60 }, + { 10, 8, -60 }, { 3, 8, -60 }, { -4, 8, -60 }, { -11, 8, -60 }, { -18, 8, -60 }, { -25, 8, -60 }, { -46, 8, -60 }, { -53, 8, -60 }, { -60, 8, -60 }, + { 66, 8, -53 }, { 59, 8, -53 }, { 52, 8, -53 }, { 10, 8, -53 }, { -4, 8, -53 }, { -11, 8, -53 }, { -18, 8, -53 }, { -25, 8, -53 }, { -46, 8, -53 }, + { -53, 8, -53 }, { -60, 8, -53 }, { 66, 8, -46 }, { 59, 8, -46 }, { 52, 8, -46 }, { -4, 8, -46 }, { -53, 8, -46 }, { -60, 8, -46 }, { -67, 8, -46 }, + { 66, 8, -39 }, { 59, 8, -39 }, { 52, 8, -39 }, { -46, 8, -39 }, { -53, 8, -39 }, { -60, 8, -39 }, { -67, 8, -39 }, { 66, 8, -32 }, { 59, 8, -32 }, + { 52, 8, -32 }, { 45, 8, -32 }, { -60, 8, -32 }, { -67, 8, -32 }, { 66, 8, -25 }, { 59, 8, -25 }, { 52, 8, -25 }, { 45, 8, -25 }, { 38, 8, -25 }, + { 31, 8, -25 }, { -46, 8, -25 }, { -60, 8, -25 }, { -67, 8, -25 }, { 66, 8, -18 }, { 59, 8, -18 }, { 52, 8, -18 }, { 45, 8, -18 }, { 38, 8, -18 }, + { -39, 8, -18 }, { -46, 8, -18 }, { -53, 8, -18 }, { -60, 8, -18 }, { -67, 8, -18 }, { 59, 8, -11 }, { 52, 8, -11 }, { 45, 8, -11 }, { 38, 8, -11 }, + { -39, 8, -11 }, { -46, 8, -11 }, { -53, 8, -11 }, { -60, 8, -11 }, { 59, 8, -4 }, { 52, 8, -4 }, { 45, 8, -4 }, { 38, 8, -4 }, { -39, 8, -4 }, + { -46, 8, -4 }, { -53, 8, -4 }, { -60, 8, -4 }, { 59, 8, 3 }, { 45, 8, 3 }, { 38, 8, 3 }, { -39, 8, 3 }, { -46, 8, 3 }, { -53, 8, 3 }, { -60, 8, 3 }, + { 59, 8, 10 }, { 52, 8, 10 }, { 38, 8, 10 }, { 31, 8, 10 }, { -32, 8, 10 }, { -39, 8, 10 }, { -46, 8, 10 }, { -53, 8, 10 }, { -60, 8, 10 }, + { 52, 8, 17 }, { 45, 8, 17 }, { 38, 8, 17 }, { 31, 8, 17 }, { -32, 8, 17 }, { -39, 8, 17 }, { -46, 8, 17 }, { -53, 8, 17 }, { -60, 8, 17 }, + { 52, 8, 24 }, { 38, 8, 24 }, { 31, 8, 24 }, { -32, 8, 24 }, { -39, 8, 24 }, { -46, 8, 24 }, { -53, 8, 24 }, { 52, 8, 31 }, { -53, 8, 31 }, + { 52, 8, 38 }, { 45, 8, 38 }, { 38, 8, 38 }, { 3, 8, 38 }, { -4, 8, 38 }, { -11, 8, 38 }, { -39, 8, 38 }, { -46, 8, 38 }, { -53, 8, 38 }, { 45, 8, 45 }, + { 38, 8, 45 }, { 10, 8, 45 }, { 3, 8, 45 }, { -4, 8, 45 }, { -11, 8, 45 }, { -39, 8, 45 }, { -46, 8, 45 }, { 45, 8, 52 }, { 38, 8, 52 }, { 31, 8, 52 }, + { 24, 8, 52 }, { 10, 8, 52 }, { 3, 8, 52 }, { -4, 8, 52 }, { -11, 8, 52 }, { -25, 8, 52 }, { -32, 8, 52 }, { -39, 8, 52 }, { -46, 8, 52 }, + { 38, 8, 59 }, { 31, 8, 59 }, { 24, 8, 59 }, { 10, 8, 59 }, { 3, 8, 59 }, { -4, 8, 59 }, { -11, 8, 59 }, { -25, 8, 59 }, { -32, 8, 59 }, { -39, 8, 59 }, + { 24, 8, 66 }, { 17, 8, 66 }, { 10, 8, 66 }, { -4, 8, 66 }, { -11, 8, 66 }, { -18, 8, 66 }, { -25, 8, 66 }, { 31, 15, -95 }, { 24, 15, -95 }, + { 3, 15, -95 }, { 38, 15, -88 }, { 31, 15, -88 }, { 3, 15, -88 }, { -4, 15, -88 }, { -39, 15, -88 }, { 45, 15, -81 }, { 38, 15, -81 }, { 3, 15, -81 }, + { -4, 15, -81 }, { -39, 15, -81 }, { -46, 15, -81 }, { 52, 15, -74 }, { 45, 15, -74 }, { 38, 15, -74 }, { 3, 15, -74 }, { -4, 15, -74 }, + { -11, 15, -74 }, { -39, 15, -74 }, { -46, 15, -74 }, { -53, 15, -74 }, { 59, 15, -67 }, { 52, 15, -67 }, { 45, 15, -67 }, { 38, 15, -67 }, + { 17, 15, -67 }, { 10, 15, -67 }, { 3, 15, -67 }, { -4, 15, -67 }, { -11, 15, -67 }, { -18, 15, -67 }, { -46, 15, -67 }, { -53, 15, -67 }, + { 59, 15, -60 }, { 52, 15, -60 }, { 45, 15, -60 }, { 17, 15, -60 }, { 10, 15, -60 }, { 3, 15, -60 }, { -4, 15, -60 }, { -11, 15, -60 }, + { -18, 15, -60 }, { -46, 15, -60 }, { -53, 15, -60 }, { -60, 15, -60 }, { 59, 15, -53 }, { 52, 15, -53 }, { 45, 15, -53 }, { 3, 15, -53 }, + { -4, 15, -53 }, { -11, 15, -53 }, { -18, 15, -53 }, { -46, 15, -53 }, { -53, 15, -53 }, { -60, 15, -53 }, { 66, 15, -46 }, { 59, 15, -46 }, + { 52, 15, -46 }, { 3, 15, -46 }, { -4, 15, -46 }, { -46, 15, -46 }, { -53, 15, -46 }, { -60, 15, -46 }, { -67, 15, -46 }, { 66, 15, -39 }, + { 59, 15, -39 }, { 45, 15, -39 }, { -53, 15, -39 }, { -60, 15, -39 }, { -67, 15, -39 }, { 66, 15, -32 }, { 59, 15, -32 }, { 52, 15, -32 }, + { 45, 15, -32 }, { 38, 15, -32 }, { -39, 15, -32 }, { -46, 15, -32 }, { -53, 15, -32 }, { -60, 15, -32 }, { -67, 15, -32 }, { 66, 15, -25 }, + { 59, 15, -25 }, { 52, 15, -25 }, { 45, 15, -25 }, { 38, 15, -25 }, { 31, 15, -25 }, { -32, 15, -25 }, { -39, 15, -25 }, { -46, 15, -25 }, + { -53, 15, -25 }, { -60, 15, -25 }, { -67, 15, -25 }, { 66, 15, -18 }, { 59, 15, -18 }, { 52, 15, -18 }, { 45, 15, -18 }, { 38, 15, -18 }, + { -39, 15, -18 }, { -46, 15, -18 }, { -53, 15, -18 }, { -60, 15, -18 }, { -67, 15, -18 }, { 66, 15, -11 }, { 52, 15, -11 }, { 45, 15, -11 }, + { 38, 15, -11 }, { -39, 15, -11 }, { -46, 15, -11 }, { -53, 15, -11 }, { -60, 15, -11 }, { -67, 15, -11 }, { 59, 15, -4 }, { 38, 15, -4 }, + { -39, 15, -4 }, { -60, 15, -4 }, { -67, 15, -4 }, { 59, 15, 3 }, { -39, 15, 3 }, { -60, 15, 3 }, { 59, 15, 10 }, { 52, 15, 10 }, { -53, 15, 10 }, + { -60, 15, 10 }, { 59, 15, 17 }, { 52, 15, 17 }, { -53, 15, 17 }, { -60, 15, 17 }, { -53, 15, 24 }, { 52, 15, 31 }, { 45, 15, 31 }, { 3, 15, 31 }, + { -4, 15, 31 }, { -39, 15, 31 }, { -46, 15, 31 }, { -53, 15, 31 }, { 45, 15, 38 }, { 38, 15, 38 }, { 10, 15, 38 }, { 3, 15, 38 }, { -4, 15, 38 }, + { -11, 15, 38 }, { -46, 15, 38 }, { -53, 15, 38 }, { 45, 15, 45 }, { 38, 15, 45 }, { 24, 15, 45 }, { 10, 15, 45 }, { 3, 15, 45 }, { -4, 15, 45 }, + { -11, 15, 45 }, { -46, 15, 45 }, { 38, 15, 52 }, { 31, 15, 52 }, { 24, 15, 52 }, { 10, 15, 52 }, { 3, 15, 52 }, { -4, 15, 52 }, { -11, 15, 52 }, + { -25, 15, 52 }, { -32, 15, 52 }, { -39, 15, 52 }, { 31, 15, 59 }, { 24, 15, 59 }, { 3, 15, 59 }, { -4, 15, 59 }, { -18, 15, 59 }, { -25, 15, 59 }, + { -32, 15, 59 }, { 17, 15, 66 }, { 10, 15, 66 }, { -4, 15, 66 }, { -11, 15, 66 }, { -18, 15, 66 }, { -25, 15, 66 }, { 24, 22, -95 }, { 3, 22, -95 }, + { 38, 22, -88 }, { 31, 22, -88 }, { 24, 22, -88 }, { -4, 22, -88 }, { -32, 22, -88 }, { -39, 22, -88 }, { 45, 22, -81 }, { 31, 22, -81 }, + { 24, 22, -81 }, { 3, 22, -81 }, { -4, 22, -81 }, { -32, 22, -81 }, { -39, 22, -81 }, { -46, 22, -81 }, { 52, 22, -74 }, { 45, 22, -74 }, + { 38, 22, -74 }, { 10, 22, -74 }, { 3, 22, -74 }, { -4, 22, -74 }, { -32, 22, -74 }, { -46, 22, -74 }, { -53, 22, -74 }, { 52, 22, -67 }, + { 45, 22, -67 }, { 17, 22, -67 }, { 10, 22, -67 }, { 3, 22, -67 }, { -4, 22, -67 }, { -11, 22, -67 }, { -18, 22, -67 }, { -46, 22, -67 }, + { -53, 22, -67 }, { 59, 22, -60 }, { 52, 22, -60 }, { 45, 22, -60 }, { 17, 22, -60 }, { 3, 22, -60 }, { -4, 22, -60 }, { -11, 22, -60 }, + { -18, 22, -60 }, { -25, 22, -60 }, { -46, 22, -60 }, { -53, 22, -60 }, { -60, 22, -60 }, { 59, 22, -53 }, { 45, 22, -53 }, { 3, 22, -53 }, + { -4, 22, -53 }, { -46, 22, -53 }, { -53, 22, -53 }, { -60, 22, -53 }, { 66, 22, -46 }, { 59, 22, -46 }, { 52, 22, -46 }, { 3, 22, -46 }, + { -4, 22, -46 }, { -46, 22, -46 }, { -53, 22, -46 }, { -60, 22, -46 }, { -67, 22, -46 }, { 66, 22, -39 }, { 59, 22, -39 }, { 52, 22, -39 }, + { 45, 22, -39 }, { 3, 22, -39 }, { -4, 22, -39 }, { -53, 22, -39 }, { -60, 22, -39 }, { -67, 22, -39 }, { 66, 22, -32 }, { 59, 22, -32 }, + { 52, 22, -32 }, { -46, 22, -32 }, { -53, 22, -32 }, { -60, 22, -32 }, { -67, 22, -32 }, { 66, 22, -25 }, { 59, 22, -25 }, { 52, 22, -25 }, + { 45, 22, -25 }, { 38, 22, -25 }, { -39, 22, -25 }, { -46, 22, -25 }, { -53, 22, -25 }, { -60, 22, -25 }, { -67, 22, -25 }, { 66, 22, -18 }, + { 59, 22, -18 }, { -39, 22, -18 }, { -53, 22, -18 }, { -60, 22, -18 }, { -67, 22, -18 }, { 66, 22, -11 }, { -67, 22, -11 }, { 59, 22, -4 }, + { -60, 22, -4 }, { -67, 22, -4 }, { 59, 22, 3 }, { 45, 22, 3 }, { 59, 22, 10 }, { 52, 22, 10 }, { 45, 22, 10 }, { -46, 22, 10 }, { -53, 22, 10 }, + { -60, 22, 10 }, { 52, 22, 17 }, { 45, 22, 17 }, { 3, 22, 17 }, { -4, 22, 17 }, { -46, 22, 17 }, { -53, 22, 17 }, { -60, 22, 17 }, { 52, 22, 24 }, + { 45, 22, 24 }, { 3, 22, 24 }, { -4, 22, 24 }, { -46, 22, 24 }, { -53, 22, 24 }, { 52, 22, 31 }, { 10, 22, 31 }, { 3, 22, 31 }, { -4, 22, 31 }, + { -11, 22, 31 }, { -46, 22, 31 }, { -53, 22, 31 }, { 45, 22, 38 }, { 10, 22, 38 }, { 3, 22, 38 }, { -4, 22, 38 }, { -11, 22, 38 }, { -46, 22, 38 }, + { 45, 22, 45 }, { 38, 22, 45 }, { 31, 22, 45 }, { 24, 22, 45 }, { 10, 22, 45 }, { 3, 22, 45 }, { -4, 22, 45 }, { -11, 22, 45 }, { -25, 22, 45 }, + { -32, 22, 45 }, { -39, 22, 45 }, { -46, 22, 45 }, { 38, 22, 52 }, { 31, 22, 52 }, { 24, 22, 52 }, { 3, 22, 52 }, { -4, 22, 52 }, { -25, 22, 52 }, + { -32, 22, 52 }, { -39, 22, 52 }, { 24, 22, 59 }, { 17, 22, 59 }, { 3, 22, 59 }, { -4, 22, 59 }, { -18, 22, 59 }, { -25, 22, 59 }, { 10, 22, 66 }, + { -11, 22, 66 }, { -18, 22, 66 }, { 31, 29, -88 }, { 24, 29, -88 }, { 17, 29, -88 }, { 3, 29, -88 }, { -25, 29, -88 }, { -32, 29, -88 }, + { 45, 29, -81 }, { 24, 29, -81 }, { 3, 29, -81 }, { -4, 29, -81 }, { -32, 29, -81 }, { -39, 29, -81 }, { 52, 29, -74 }, { 45, 29, -74 }, + { 24, 29, -74 }, { 10, 29, -74 }, { 3, 29, -74 }, { -4, 29, -74 }, { -11, 29, -74 }, { -18, 29, -74 }, { -32, 29, -74 }, { -46, 29, -74 }, + { 52, 29, -67 }, { 45, 29, -67 }, { 10, 29, -67 }, { 3, 29, -67 }, { -4, 29, -67 }, { -11, 29, -67 }, { -18, 29, -67 }, { -32, 29, -67 }, + { -46, 29, -67 }, { -53, 29, -67 }, { 59, 29, -60 }, { 52, 29, -60 }, { 45, 29, -60 }, { 3, 29, -60 }, { -4, 29, -60 }, { -11, 29, -60 }, + { -46, 29, -60 }, { -53, 29, -60 }, { -60, 29, -60 }, { 59, 29, -53 }, { 52, 29, -53 }, { 10, 29, -53 }, { 3, 29, -53 }, { -4, 29, -53 }, + { -53, 29, -53 }, { -60, 29, -53 }, { 59, 29, -46 }, { 3, 29, -46 }, { -4, 29, -46 }, { -53, 29, -46 }, { -60, 29, -46 }, { 66, 29, -39 }, + { 59, 29, -39 }, { 52, 29, -39 }, { 3, 29, -39 }, { -4, 29, -39 }, { -53, 29, -39 }, { -60, 29, -39 }, { -67, 29, -39 }, { 66, 29, -32 }, + { 59, 29, -32 }, { 3, 29, -32 }, { -4, 29, -32 }, { -60, 29, -32 }, { -67, 29, -32 }, { 66, 29, -25 }, { 59, 29, -25 }, { 3, 29, -25 }, { -4, 29, -25 }, + { -60, 29, -25 }, { -67, 29, -25 }, { 66, 29, -18 }, { 59, 29, -18 }, { 3, 29, -18 }, { -4, 29, -18 }, { -60, 29, -18 }, { -67, 29, -18 }, + { 66, 29, -11 }, { 59, 29, -11 }, { 3, 29, -11 }, { -4, 29, -11 }, { -60, 29, -11 }, { -67, 29, -11 }, { 59, 29, -4 }, { 52, 29, -4 }, { 3, 29, -4 }, + { -4, 29, -4 }, { -60, 29, -4 }, { 59, 29, 3 }, { 45, 29, 3 }, { 38, 29, 3 }, { 3, 29, 3 }, { -4, 29, 3 }, { -39, 29, 3 }, { -46, 29, 3 }, + { -60, 29, 3 }, { 52, 29, 10 }, { 45, 29, 10 }, { 38, 29, 10 }, { 3, 29, 10 }, { -4, 29, 10 }, { -39, 29, 10 }, { -46, 29, 10 }, { -53, 29, 10 }, + { -60, 29, 10 }, { 52, 29, 17 }, { 45, 29, 17 }, { 38, 29, 17 }, { 10, 29, 17 }, { 3, 29, 17 }, { -4, 29, 17 }, { -39, 29, 17 }, { -46, 29, 17 }, + { -53, 29, 17 }, { 52, 29, 24 }, { 45, 29, 24 }, { 10, 29, 24 }, { 3, 29, 24 }, { -4, 29, 24 }, { -11, 29, 24 }, { -53, 29, 24 }, { 45, 29, 31 }, + { 10, 29, 31 }, { 3, 29, 31 }, { -4, 29, 31 }, { -11, 29, 31 }, { -53, 29, 31 }, { 45, 29, 38 }, { 38, 29, 38 }, { 31, 29, 38 }, { 24, 29, 38 }, + { 10, 29, 38 }, { 3, 29, 38 }, { -4, 29, 38 }, { -32, 29, 38 }, { -46, 29, 38 }, { 38, 29, 45 }, { 31, 29, 45 }, { 24, 29, 45 }, { 3, 29, 45 }, + { -4, 29, 45 }, { -25, 29, 45 }, { -32, 29, 45 }, { -39, 29, 45 }, { 31, 29, 52 }, { 24, 29, 52 }, { 17, 29, 52 }, { 3, 29, 52 }, { -4, 29, 52 }, + { -18, 29, 52 }, { -25, 29, 52 }, { -32, 29, 52 }, { 17, 29, 59 }, { 10, 29, 59 }, { 3, 29, 59 }, { -4, 29, 59 }, { -11, 29, 59 }, { -18, 29, 59 }, + { -25, 29, 59 }, { 31, 36, -88 }, { 24, 36, -88 }, { 17, 36, -88 }, { 10, 36, -88 }, { 3, 36, -88 }, { -11, 36, -88 }, { -18, 36, -88 }, + { -25, 36, -88 }, { 38, 36, -81 }, { 31, 36, -81 }, { 24, 36, -81 }, { 10, 36, -81 }, { 3, 36, -81 }, { -4, 36, -81 }, { -11, 36, -81 }, + { -39, 36, -81 }, { 45, 36, -74 }, { 38, 36, -74 }, { 24, 36, -74 }, { 10, 36, -74 }, { 3, 36, -74 }, { -4, 36, -74 }, { -11, 36, -74 }, + { -18, 36, -74 }, { -32, 36, -74 }, { -46, 36, -74 }, { 52, 36, -67 }, { 45, 36, -67 }, { 24, 36, -67 }, { 3, 36, -67 }, { -4, 36, -67 }, + { -11, 36, -67 }, { -32, 36, -67 }, { -46, 36, -67 }, { -53, 36, -67 }, { 59, 36, -60 }, { 52, 36, -60 }, { 45, 36, -60 }, { 10, 36, -60 }, + { 3, 36, -60 }, { -4, 36, -60 }, { -46, 36, -60 }, { -53, 36, -60 }, { -60, 36, -60 }, { 59, 36, -53 }, { 52, 36, -53 }, { 10, 36, -53 }, + { 3, 36, -53 }, { -4, 36, -53 }, { -11, 36, -53 }, { -53, 36, -53 }, { -60, 36, -53 }, { 59, 36, -46 }, { 10, 36, -46 }, { 3, 36, -46 }, + { -4, 36, -46 }, { -11, 36, -46 }, { -53, 36, -46 }, { -60, 36, -46 }, { 59, 36, -39 }, { 10, 36, -39 }, { 3, 36, -39 }, { -4, 36, -39 }, + { -11, 36, -39 }, { -53, 36, -39 }, { -60, 36, -39 }, { -67, 36, -39 }, { 66, 36, -32 }, { 59, 36, -32 }, { 3, 36, -32 }, { -4, 36, -32 }, + { -67, 36, -32 }, { 66, 36, -25 }, { 59, 36, -25 }, { 45, 36, -25 }, { 3, 36, -25 }, { -4, 36, -25 }, { -60, 36, -25 }, { -67, 36, -25 }, + { 59, 36, -18 }, { 52, 36, -18 }, { 45, 36, -18 }, { 3, 36, -18 }, { -4, 36, -18 }, { -53, 36, -18 }, { -60, 36, -18 }, { -67, 36, -18 }, + { 59, 36, -11 }, { 3, 36, -11 }, { -4, 36, -11 }, { -46, 36, -11 }, { -53, 36, -11 }, { 59, 36, -4 }, { 52, 36, -4 }, { 3, 36, -4 }, { -4, 36, -4 }, + { -60, 36, -4 }, { 59, 36, 3 }, { 52, 36, 3 }, { 45, 36, 3 }, { 38, 36, 3 }, { 3, 36, 3 }, { -4, 36, 3 }, { -39, 36, 3 }, { -46, 36, 3 }, + { -53, 36, 3 }, { -60, 36, 3 }, { 52, 36, 10 }, { 45, 36, 10 }, { 10, 36, 10 }, { 3, 36, 10 }, { -4, 36, 10 }, { -11, 36, 10 }, { -39, 36, 10 }, + { -46, 36, 10 }, { -53, 36, 10 }, { 52, 36, 17 }, { 10, 36, 17 }, { 3, 36, 17 }, { -4, 36, 17 }, { -11, 36, 17 }, { -46, 36, 17 }, { -53, 36, 17 }, + { 24, 36, 24 }, { 3, 36, 24 }, { -4, 36, 24 }, { -11, 36, 24 }, { -39, 36, 24 }, { -46, 36, 24 }, { -53, 36, 24 }, { 45, 36, 31 }, { 38, 36, 31 }, + { 31, 36, 31 }, { 24, 36, 31 }, { 3, 36, 31 }, { -4, 36, 31 }, { -25, 36, 31 }, { -39, 36, 31 }, { -46, 36, 31 }, { 38, 36, 38 }, { 31, 36, 38 }, + { 24, 36, 38 }, { 3, 36, 38 }, { -4, 36, 38 }, { -25, 36, 38 }, { -32, 36, 38 }, { -39, 36, 38 }, { 31, 36, 45 }, { 24, 36, 45 }, { 17, 36, 45 }, + { 3, 36, 45 }, { -4, 36, 45 }, { -25, 36, 45 }, { -32, 36, 45 }, { 24, 36, 52 }, { 17, 36, 52 }, { 3, 36, 52 }, { -4, 36, 52 }, { -18, 36, 52 }, + { -25, 36, 52 }, { 10, 36, 59 }, { -11, 36, 59 }, { -18, 43, -88 }, { 31, 43, -81 }, { 24, 43, -81 }, { 17, 43, -81 }, { 10, 43, -81 }, { 3, 43, -81 }, + { -11, 43, -81 }, { -18, 43, -81 }, { -25, 43, -81 }, { -32, 43, -81 }, { 45, 43, -74 }, { 38, 43, -74 }, { 31, 43, -74 }, { 24, 43, -74 }, + { 10, 43, -74 }, { 3, 43, -74 }, { -4, 43, -74 }, { -11, 43, -74 }, { -25, 43, -74 }, { -32, 43, -74 }, { -39, 43, -74 }, { -46, 43, -74 }, + { 52, 43, -67 }, { 45, 43, -67 }, { 38, 43, -67 }, { 31, 43, -67 }, { 24, 43, -67 }, { 3, 43, -67 }, { -4, 43, -67 }, { -25, 43, -67 }, + { -32, 43, -67 }, { -39, 43, -67 }, { -46, 43, -67 }, { 52, 43, -60 }, { 45, 43, -60 }, { 38, 43, -60 }, { 31, 43, -60 }, { 3, 43, -60 }, + { -4, 43, -60 }, { -46, 43, -60 }, { -53, 43, -60 }, { 59, 43, -53 }, { 52, 43, -53 }, { 38, 43, -53 }, { 31, 43, -53 }, { 10, 43, -53 }, + { 3, 43, -53 }, { -4, 43, -53 }, { -11, 43, -53 }, { -39, 43, -53 }, { -53, 43, -53 }, { -60, 43, -53 }, { 59, 43, -46 }, { 52, 43, -46 }, + { 45, 43, -46 }, { 38, 43, -46 }, { 31, 43, -46 }, { 10, 43, -46 }, { 3, 43, -46 }, { -4, 43, -46 }, { -11, 43, -46 }, { -32, 43, -46 }, + { -39, 43, -46 }, { -46, 43, -46 }, { -60, 43, -46 }, { 59, 43, -39 }, { 52, 43, -39 }, { 45, 43, -39 }, { 38, 43, -39 }, { 31, 43, -39 }, + { 10, 43, -39 }, { 3, 43, -39 }, { -4, 43, -39 }, { -11, 43, -39 }, { -39, 43, -39 }, { -46, 43, -39 }, { -53, 43, -39 }, { -60, 43, -39 }, + { 59, 43, -32 }, { 52, 43, -32 }, { 45, 43, -32 }, { 38, 43, -32 }, { 10, 43, -32 }, { 3, 43, -32 }, { -4, 43, -32 }, { -11, 43, -32 }, + { -39, 43, -32 }, { -46, 43, -32 }, { -60, 43, -32 }, { 59, 43, -25 }, { 52, 43, -25 }, { 10, 43, -25 }, { 3, 43, -25 }, { -4, 43, -25 }, + { -11, 43, -25 }, { -46, 43, -25 }, { -53, 43, -25 }, { -60, 43, -25 }, { 59, 43, -18 }, { 52, 43, -18 }, { 45, 43, -18 }, { 38, 43, -18 }, + { 10, 43, -18 }, { 3, 43, -18 }, { -4, 43, -18 }, { -11, 43, -18 }, { -53, 43, -18 }, { -60, 43, -18 }, { 59, 43, -11 }, { 52, 43, -11 }, + { 10, 43, -11 }, { 3, 43, -11 }, { -4, 43, -11 }, { -11, 43, -11 }, { -53, 43, -11 }, { -60, 43, -11 }, { 45, 43, -4 }, { 10, 43, -4 }, { 3, 43, -4 }, + { -4, 43, -4 }, { -11, 43, -4 }, { -53, 43, -4 }, { 52, 43, 3 }, { 45, 43, 3 }, { 10, 43, 3 }, { 3, 43, 3 }, { -4, 43, 3 }, { -11, 43, 3 }, + { -39, 43, 3 }, { -46, 43, 3 }, { -53, 43, 3 }, { 52, 43, 10 }, { 45, 43, 10 }, { 3, 43, 10 }, { -4, 43, 10 }, { -11, 43, 10 }, { -46, 43, 10 }, + { -53, 43, 10 }, { 45, 43, 17 }, { 24, 43, 17 }, { 10, 43, 17 }, { 3, 43, 17 }, { -4, 43, 17 }, { -25, 43, 17 }, { -39, 43, 17 }, { -46, 43, 17 }, + { 45, 43, 24 }, { 31, 43, 24 }, { 24, 43, 24 }, { 3, 43, 24 }, { -4, 43, 24 }, { -25, 43, 24 }, { -39, 43, 24 }, { -46, 43, 24 }, { 38, 43, 31 }, + { 31, 43, 31 }, { 24, 43, 31 }, { 3, 43, 31 }, { -4, 43, 31 }, { -25, 43, 31 }, { -32, 43, 31 }, { -39, 43, 31 }, { 31, 43, 38 }, { 24, 43, 38 }, + { 3, 43, 38 }, { -4, 43, 38 }, { -18, 43, 38 }, { -25, 43, 38 }, { -32, 43, 38 }, { 24, 43, 45 }, { 17, 43, 45 }, { 10, 43, 45 }, { 3, 43, 45 }, + { -4, 43, 45 }, { -18, 43, 45 }, { -25, 43, 45 }, { 10, 43, 52 }, { -4, 43, 52 }, { -11, 43, 52 }, { 17, 50, -81 }, { 10, 50, -81 }, { 31, 50, -74 }, + { 24, 50, -74 }, { 17, 50, -74 }, { 10, 50, -74 }, { 3, 50, -74 }, { -4, 50, -74 }, { -11, 50, -74 }, { -18, 50, -74 }, { -25, 50, -74 }, + { -32, 50, -74 }, { 45, 50, -67 }, { 38, 50, -67 }, { 31, 50, -67 }, { 24, 50, -67 }, { 17, 50, -67 }, { 3, 50, -67 }, { -4, 50, -67 }, + { -18, 50, -67 }, { -25, 50, -67 }, { -32, 50, -67 }, { -39, 50, -67 }, { 52, 50, -60 }, { 45, 50, -60 }, { 38, 50, -60 }, { 3, 50, -60 }, + { -4, 50, -60 }, { -39, 50, -60 }, { -46, 50, -60 }, { 52, 50, -53 }, { 45, 50, -53 }, { 38, 50, -53 }, { 31, 50, -53 }, { 3, 50, -53 }, + { -4, 50, -53 }, { -32, 50, -53 }, { -39, 50, -53 }, { -46, 50, -53 }, { -53, 50, -53 }, { 52, 50, -46 }, { 45, 50, -46 }, { 38, 50, -46 }, + { 31, 50, -46 }, { 10, 50, -46 }, { 3, 50, -46 }, { -4, 50, -46 }, { -11, 50, -46 }, { -32, 50, -46 }, { -39, 50, -46 }, { -46, 50, -46 }, + { -53, 50, -46 }, { 59, 50, -39 }, { 52, 50, -39 }, { 45, 50, -39 }, { 38, 50, -39 }, { 10, 50, -39 }, { 3, 50, -39 }, { -4, 50, -39 }, + { -11, 50, -39 }, { -39, 50, -39 }, { -46, 50, -39 }, { -53, 50, -39 }, { -60, 50, -39 }, { 59, 50, -32 }, { 52, 50, -32 }, { 45, 50, -32 }, + { 10, 50, -32 }, { 3, 50, -32 }, { -4, 50, -32 }, { -11, 50, -32 }, { -39, 50, -32 }, { -46, 50, -32 }, { -53, 50, -32 }, { -60, 50, -32 }, + { 3, 50, -25 }, { -4, 50, -25 }, { -46, 50, -25 }, { -53, 50, -25 }, { -60, 50, -25 }, { 45, 50, -18 }, { 3, 50, -18 }, { -4, 50, -18 }, + { -60, 50, -18 }, { 52, 50, -11 }, { 24, 50, -11 }, { 10, 50, -11 }, { 3, 50, -11 }, { -4, 50, -11 }, { -46, 50, -11 }, { -53, 50, -11 }, + { 52, 50, -4 }, { 45, 50, -4 }, { 31, 50, -4 }, { 24, 50, -4 }, { 3, 50, -4 }, { -4, 50, -4 }, { -11, 50, -4 }, { -25, 50, -4 }, { -32, 50, -4 }, + { -53, 50, -4 }, { 52, 50, 3 }, { 45, 50, 3 }, { 24, 50, 3 }, { 3, 50, 3 }, { -4, 50, 3 }, { -25, 50, 3 }, { -39, 50, 3 }, { -46, 50, 3 }, + { 45, 50, 10 }, { 24, 50, 10 }, { 3, 50, 10 }, { -4, 50, 10 }, { -46, 50, 10 }, { 24, 50, 17 }, { 3, 50, 17 }, { -4, 50, 17 }, { -25, 50, 17 }, + { -32, 50, 17 }, { -46, 50, 17 }, { 38, 50, 24 }, { 31, 50, 24 }, { 24, 50, 24 }, { 3, 50, 24 }, { -4, 50, 24 }, { -25, 50, 24 }, { -39, 50, 24 }, + { 31, 50, 31 }, { 24, 50, 31 }, { 3, 50, 31 }, { -4, 50, 31 }, { -18, 50, 31 }, { -25, 50, 31 }, { -32, 50, 31 }, { 24, 50, 38 }, { 17, 50, 38 }, + { 10, 50, 38 }, { 3, 50, 38 }, { -4, 50, 38 }, { -18, 50, 38 }, { -25, 50, 38 }, { 10, 50, 45 }, { 3, 50, 45 }, { 17, 57, -74 }, { 10, 57, -74 }, + { -11, 57, -74 }, { -18, 57, -74 }, { 31, 57, -67 }, { 24, 57, -67 }, { 17, 57, -67 }, { 10, 57, -67 }, { 3, 57, -67 }, { -4, 57, -67 }, + { -11, 57, -67 }, { -25, 57, -67 }, { -32, 57, -67 }, { 38, 57, -60 }, { 31, 57, -60 }, { 24, 57, -60 }, { 10, 57, -60 }, { 3, 57, -60 }, + { -4, 57, -60 }, { -11, 57, -60 }, { -32, 57, -60 }, { -39, 57, -60 }, { 45, 57, -53 }, { 38, 57, -53 }, { 17, 57, -53 }, { 10, 57, -53 }, + { 3, 57, -53 }, { -4, 57, -53 }, { -32, 57, -53 }, { -39, 57, -53 }, { -46, 57, -53 }, { 45, 57, -46 }, { 38, 57, -46 }, { 31, 57, -46 }, + { 10, 57, -46 }, { 3, 57, -46 }, { -4, 57, -46 }, { -11, 57, -46 }, { -32, 57, -46 }, { -39, 57, -46 }, { 45, 57, -39 }, { 38, 57, -39 }, + { 3, 57, -39 }, { -4, 57, -39 }, { -39, 57, -39 }, { 38, 57, -32 }, { 3, 57, -32 }, { -4, 57, -32 }, { -46, 57, -32 }, { 52, 57, -25 }, { 3, 57, -25 }, + { -4, 57, -25 }, { -53, 57, -25 }, { 52, 57, -18 }, { 45, 57, -18 }, { 3, 57, -18 }, { -4, 57, -18 }, { -53, 57, -18 }, { 45, 57, -11 }, + { 31, 57, -11 }, { 24, 57, -11 }, { 3, 57, -11 }, { -4, 57, -11 }, { -25, 57, -11 }, { -46, 57, -11 }, { 45, 57, -4 }, { 31, 57, -4 }, { 24, 57, -4 }, + { 3, 57, -4 }, { -4, 57, -4 }, { -25, 57, -4 }, { -32, 57, -4 }, { -39, 57, -4 }, { -46, 57, -4 }, { 45, 57, 3 }, { 38, 57, 3 }, { 31, 57, 3 }, + { 24, 57, 3 }, { 3, 57, 3 }, { -4, 57, 3 }, { -25, 57, 3 }, { -32, 57, 3 }, { -39, 57, 3 }, { 38, 57, 10 }, { 24, 57, 10 }, { 3, 57, 10 }, + { -4, 57, 10 }, { -25, 57, 10 }, { -32, 57, 10 }, { -39, 57, 10 }, { 38, 57, 17 }, { 24, 57, 17 }, { 3, 57, 17 }, { -4, 57, 17 }, { -25, 57, 17 }, + { -32, 57, 17 }, { -39, 57, 17 }, { 31, 57, 24 }, { 24, 57, 24 }, { 3, 57, 24 }, { -4, 57, 24 }, { -11, 57, 24 }, { -25, 57, 24 }, { -32, 57, 24 }, + { 17, 57, 31 }, { 10, 57, 31 }, { 3, 57, 31 }, { -4, 57, 31 }, { -11, 57, 31 }, { -18, 57, 31 }, { 10, 57, 38 }, { 24, 64, -67 }, { 17, 64, -67 }, + { 10, 64, -67 }, { -11, 64, -67 }, { -18, 64, -67 }, { 31, 64, -60 }, { 24, 64, -60 }, { 17, 64, -60 }, { 10, 64, -60 }, { 3, 64, -60 }, + { -4, 64, -60 }, { -11, 64, -60 }, { -18, 64, -60 }, { 24, 64, -53 }, { 17, 64, -53 }, { 10, 64, -53 }, { 3, 64, -53 }, { -4, 64, -53 }, + { -25, 64, -53 }, { -32, 64, -53 }, { 31, 64, -46 }, { 10, 64, -46 }, { 3, 64, -46 }, { -4, 64, -46 }, { -11, 64, -46 }, { -39, 64, -46 }, + { 3, 64, -39 }, { -4, 64, -39 }, { -39, 64, -39 }, { 3, 64, -32 }, { -4, 64, -32 }, { 3, 64, -25 }, { -4, 64, -25 }, { 3, 64, -18 }, { -4, 64, -18 }, + { 24, 64, -11 }, { 17, 64, -11 }, { 10, 64, -11 }, { 3, 64, -11 }, { -4, 64, -11 }, { -25, 64, -11 }, { 24, 64, -4 }, { 3, 64, -4 }, { -4, 64, -4 }, + { -25, 64, -4 }, { -32, 64, -4 }, { 31, 64, 3 }, { 24, 64, 3 }, { 3, 64, 3 }, { -4, 64, 3 }, { -18, 64, 3 }, { -25, 64, 3 }, { -32, 64, 3 }, + { 24, 64, 10 }, { 3, 64, 10 }, { -4, 64, 10 }, { -11, 64, 10 }, { -18, 64, 10 }, { -25, 64, 10 }, { 24, 64, 17 }, { 17, 64, 17 }, { 10, 64, 17 }, + { 3, 64, 17 }, { -4, 64, 17 }, { -11, 64, 17 }, { -18, 64, 17 }, { -25, 64, 17 }, { 10, 64, 24 }, { -11, 64, 24 }, { 17, 71, -60 }, { 17, 71, -53 }, + { 10, 71, -53 }, { -11, 71, -53 }, { -18, 71, -53 }, { -25, 71, -53 }, { 10, 71, -46 }, { -11, 71, -46 }, { -18, 71, -46 }, { -25, 71, -46 }, + { 3, 71, -39 }, { -4, 71, -39 }, { 10, 71, -32 }, { 3, 71, -32 }, { 3, 71, -25 }, { 3, 71, -18 }, { -4, 71, -18 }, { 24, 71, -11 }, { 17, 71, -11 }, + { 10, 71, -11 }, { 3, 71, -11 }, { -4, 71, -11 }, { -18, 71, -11 }, { 17, 71, -4 }, { 10, 71, -4 }, { 3, 71, -4 }, { -4, 71, -4 }, { -11, 71, -4 }, + { -18, 71, -4 }, { 17, 71, 3 }, { 10, 71, 3 }, { 3, 71, 3 }, { -4, 71, 3 }, { -11, 71, 3 }, { -18, 71, 3 }, { 17, 71, 10 }, +}; + +void insertLoretaVoxelInMesh(C3DMesh& mesh, const float x, const float y, const float z, const float s) +{ + const size_t i = mesh.m_Vertices.size(); + + // Insert the 8 vertices of the cube + mesh.m_Vertices.emplace_back(x - s, y - s, z - s); // i+0 + mesh.m_Vertices.emplace_back(x + s, y - s, z - s); // i+1 + mesh.m_Vertices.emplace_back(x + s, y + s, z - s); // i+2 + mesh.m_Vertices.emplace_back(x - s, y + s, z - s); // i+3 + + mesh.m_Vertices.emplace_back(x - s, y - s, z + s); // i+4 + mesh.m_Vertices.emplace_back(x + s, y - s, z + s); // i+5 + mesh.m_Vertices.emplace_back(x + s, y + s, z + s); // i+6 + mesh.m_Vertices.emplace_back(x - s, y + s, z + s); // i+7 + + // Insert the 12 triangles of the cube + mesh.m_Triangles.push_back(i + 0); + mesh.m_Triangles.push_back(i + 1); + mesh.m_Triangles.push_back(i + 2); + mesh.m_Triangles.push_back(i + 0); + mesh.m_Triangles.push_back(i + 2); + mesh.m_Triangles.push_back(i + 3); + + mesh.m_Triangles.push_back(i + 1); + mesh.m_Triangles.push_back(i + 5); + mesh.m_Triangles.push_back(i + 6); + mesh.m_Triangles.push_back(i + 1); + mesh.m_Triangles.push_back(i + 6); + mesh.m_Triangles.push_back(i + 2); + + mesh.m_Triangles.push_back(i + 5); + mesh.m_Triangles.push_back(i + 4); + mesh.m_Triangles.push_back(i + 7); + mesh.m_Triangles.push_back(i + 5); + mesh.m_Triangles.push_back(i + 7); + mesh.m_Triangles.push_back(i + 6); + + mesh.m_Triangles.push_back(i + 4); + mesh.m_Triangles.push_back(i + 0); + mesh.m_Triangles.push_back(i + 3); + mesh.m_Triangles.push_back(i + 4); + mesh.m_Triangles.push_back(i + 3); + mesh.m_Triangles.push_back(i + 7); + + mesh.m_Triangles.push_back(i + 4); + mesh.m_Triangles.push_back(i + 5); + mesh.m_Triangles.push_back(i + 1); + mesh.m_Triangles.push_back(i + 4); + mesh.m_Triangles.push_back(i + 1); + mesh.m_Triangles.push_back(i + 0); + + mesh.m_Triangles.push_back(i + 3); + mesh.m_Triangles.push_back(i + 2); + mesh.m_Triangles.push_back(i + 6); + mesh.m_Triangles.push_back(i + 3); + mesh.m_Triangles.push_back(i + 6); + mesh.m_Triangles.push_back(i + 7); +} +} // namespace + +CRendererLoreta::CRendererLoreta() + +{ + m_face.load(FACE_DATA); + m_scalp.load(SCALP_DATA); + + m_brain.clear(); + for (auto& voxel : loretaVoxel) { insertLoretaVoxelInMesh(m_brain, float(-voxel[0]), float(voxel[1]), float(-voxel[2]), 3.5); } + + m_lookups.clear(); + //const size_t idxBrodmanns = 0, idxAnatomicals = 1, idxLobes = 2, idxRoi = 3; + m_lookups.reserve(4); + m_lookups.emplace_back(LoretaRegions::BRODMANNS); + m_lookups.emplace_back(LoretaRegions::ANATOMICALS); + m_lookups.emplace_back(LoretaRegions::LOBES); + m_lookups.emplace_back(LoretaRegions::REGIONS_OF_INTEREST); + m_selecteds.resize(2394, true); + + this->refreshBrainSubset(); +} + +#define __Rendering_VertexBuffer__ + +bool CRendererLoreta::render(const CRendererContext& ctx) +{ + // if(!m_nHistory) return false; + // if(m_history.size()!=2394) return false; + + const float d = 3.5; + + // ::glDisable(GL_TEXTURE_1D); + + glEnable(GL_DEPTH_TEST); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluPerspective(60, ctx.getAspect(), .01, 100); + glTranslatef(0, 0, -d); + glRotatef(ctx.getRotationX() * 10, 1, 0, 0); + glRotatef(ctx.getRotationY() * 10, 0, 1, 0); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glScalef(ctx.getZoom(), ctx.getZoom(), ctx.getZoom()); + + glPushMatrix(); + glTranslatef(0, .5, 0); + glScalef(.00944F, .00944F, .00944F); + glRotatef(19, 1, 0, 0); + glTranslatef(0, -10, 15); + glDisable(GL_DEPTH_TEST); + + if (m_nHistory && m_history.size() == 2394) + { + std::vector samples; + this->getSampleAtERPFraction(m_erpFraction, samples); + +#if defined __Rendering_VertexBuffer__ + for (size_t i = 0, j = 0; i < 2394; ++i) + { + // Apply texture coordinate to each of the 8 vertices of this voxel + const float power = samples[i] * ctx.getScale(); + m_brain.m_Vertices[j++].u = power; + m_brain.m_Vertices[j++].u = power; + m_brain.m_Vertices[j++].u = power; + m_brain.m_Vertices[j++].u = power; + m_brain.m_Vertices[j++].u = power; + m_brain.m_Vertices[j++].u = power; + m_brain.m_Vertices[j++].u = power; + m_brain.m_Vertices[j++].u = power; + } +#else + for (size_t i = 0; i < 2394; ++i) + { + if (m_selecteds[i]) + { + float power = samples[i] * ctx.getScale(); + // m_history[i][m_nHistory-m_nSample+m_sampleIndexERP]*ctx.getScale(); + ::glColor4f(.1f, .1f, .1f, ctx.getTranslucency()); + ::glPushMatrix(); + ::glTexCoord1f(power); + ::glTranslatef(float(-loretaVoxel[i][0]), float(loretaVoxel[i][1]), float(-loretaVoxel[i][2])); + ::glScalef(3.5, 3.5, 3.5); + cube(); + ::glPopMatrix(); + } + } +#endif + } + else + { +#if defined __Rendering_VertexBuffer__ + for (size_t i = 0, j = 0; i < 2394; ++i) + { + // Apply texture coordinate to each of the 8 vertices of this voxel + const float power = 0; + m_brain.m_Vertices[j++].u = power; + m_brain.m_Vertices[j++].u = power; + m_brain.m_Vertices[j++].u = power; + m_brain.m_Vertices[j++].u = power; + m_brain.m_Vertices[j++].u = power; + m_brain.m_Vertices[j++].u = power; + m_brain.m_Vertices[j++].u = power; + m_brain.m_Vertices[j++].u = power; + } +#else + for (size_t i = 0; i < 2394; ++i) + { + if (m_selecteds[i]) + { + // float power=m_history[i][m_nHistory-m_nSample+m_sampleIndexERP]*ctx.getScale(); + ::glColor4f(.1f, .1f, .1f, ctx.getTranslucency()); + ::glPushMatrix(); + ::glTexCoord1f(0); + ::glTranslatef(float(-loretaVoxel[i][0]), float(loretaVoxel[i][1]), float(-loretaVoxel[i][2])); + ::glScalef(3.5, 3.5, 3.5); + cube(); + ::glPopMatrix(); + } + } +#endif + } + +#if defined __Rendering_VertexBuffer__ + glEnable(GL_TEXTURE_1D); + glDisable(GL_LIGHTING); + glColor4f(.1F, .1F, .1F, ctx.getTranslucency()); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glVertexPointer(3, GL_FLOAT, sizeof(CVertex), &m_brain.m_Vertices[0].x); + glTexCoordPointer(1, GL_FLOAT, sizeof(CVertex), &m_brain.m_Vertices[0].u); + // ::glDrawElements(GL_TRIANGLES, m_brain.m_Triangles.size(), GL_UNSIGNED_INT, &m_brain.m_Triangles[0]); + if (!m_brainSubsetTriangles.empty()) { glDrawElements(GL_TRIANGLES, GLsizei(m_brainSubsetTriangles.size()), GL_UNSIGNED_INT, &m_brainSubsetTriangles[0]); } + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); +#endif + + glPopMatrix(); + + glEnable(GL_LIGHTING); + glDisable(GL_TEXTURE_1D); + glPushMatrix(); + glTranslatef(0, .5F, 0); + glRotatef(19, 1, 0, 0); + glTranslatef(0, -.2F, .35F); + // ::glScalef(1.8f, 1.8f, 1.8f); + + if (ctx.isScalpMeshVisible()) + { + glColor4f(.8F, .6F, .5F, .1F); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + glVertexPointer(3, GL_FLOAT, sizeof(CVertex), &m_scalp.m_Vertices[0].x); + glNormalPointer(GL_FLOAT, sizeof(CVertex), &m_scalp.m_Normals[0].x); + glDrawElements(GL_TRIANGLES, GLsizei(m_scalp.m_Triangles.size()), GL_UNSIGNED_INT, &m_scalp.m_Triangles[0]); + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); + } + if (ctx.isFaceMeshVisible()) + { + glColor4f(.8F, .6F, .5F, .1F); + glDisable(GL_TEXTURE_1D); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + glVertexPointer(3, GL_FLOAT, sizeof(CVertex), &m_face.m_Vertices[0].x); + glNormalPointer(GL_FLOAT, sizeof(CVertex), &m_face.m_Normals[0].x); + glDrawElements(GL_TRIANGLES, GLsizei(m_face.m_Triangles.size()), GL_UNSIGNED_INT, &m_face.m_Triangles[0]); + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); + } + + glDisable(GL_LIGHTING); + glPopMatrix(); + + if (ctx.getCheckBoardVisibility()) { this->drawCoordinateSystem(); } + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + + return true; +} + +void CRendererLoreta::clearRegionSelection() +{ + for (auto it = m_selecteds.begin(); it != m_selecteds.end(); ++it) { *it = false; } + this->refreshBrainSubset(); +} + +size_t CRendererLoreta::getRegionCount(const size_t category) +{ + if (category >= m_lookups.size()) { return 0; } + return size_t(m_lookups[category].size()); +} + +const char* CRendererLoreta::getRegionCategoryName(const size_t category) +{ + switch (category) + { + case 0: return "Brodmann"; + case 1: return "Anatomic"; + case 2: return "Lobe"; + case 3: return "Function"; + default: return nullptr; + } +} + +const char* CRendererLoreta::getRegionName(const size_t category, const size_t index) +{ + if (category >= m_lookups.size()) { return nullptr; } + + auto& lookup = m_lookups[category]; + auto it = lookup.begin(); + + for (size_t j = 0; j < index && it != lookup.end(); ++j) { ++it; } + + if (it != lookup.end()) { return it->first.c_str(); } + + return nullptr; +} + +void CRendererLoreta::selectRegion(const size_t category, const char* name) +{ + if (category >= m_lookups.size()) { return; } + + auto& lookup = m_lookups[category]; + + auto it = lookup.find(name); + if (it != lookup.end()) + { + std::vector& list = it->second; + for (auto& i : list) { m_selecteds[i] = true; } + } + + this->refreshBrainSubset(); +} + +void CRendererLoreta::selectRegion(const size_t category, const size_t index) +{ + if (category >= m_lookups.size()) { return; } + + auto& lookup = m_lookups[category]; + auto it = lookup.begin(); + + for (size_t j = 0; j < index && it != lookup.end(); ++j) { ++it; } + + if (it != lookup.end()) + { + std::vector& list = it->second; + for (auto& i : list) { m_selecteds[i] = true; } + } + + this->refreshBrainSubset(); +} + +void CRendererLoreta::refreshBrainSubset() + +{ + // Initializes look up to its maximum size + m_brainSubsetTriangles = m_brain.m_Triangles; + + // Inserts selected voxels in look up + const size_t trianglePerVoxel = 12; + const size_t vertexPerVoxel = trianglePerVoxel * 3; + size_t i, j, k; + for (i = 0, j = 0, k = 0; i < 2394; i++, k += vertexPerVoxel) + { + if (m_selecteds[i]) { for (size_t l = 0; l < vertexPerVoxel; ++l) { m_brainSubsetTriangles[j++] = m_brain.m_Triangles[k + l]; } } + } + // Crops look up to the subset size + + m_brainSubsetTriangles.resize(j); +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyOpenGL diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererLoreta.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererLoreta.hpp new file mode 100644 index 0000000..02c7239 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererLoreta.hpp @@ -0,0 +1,65 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#if defined TARGET_HAS_ThirdPartyOpenGL + +#include "mIRenderer.hpp" +#include "mC3DMesh.hpp" +#include +#include +#include + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRendererLoreta : public IRenderer +{ +public: + + CRendererLoreta(); + + void rebuild(const CRendererContext& ctx) override { IRenderer::rebuild(ctx); } + void refresh(const CRendererContext& ctx) override { IRenderer::refresh(ctx); } + bool render(const CRendererContext& ctx) override; + + void clearRegionSelection() override; + size_t getRegionCategoryCount() override { return m_lookups.size(); } + size_t getRegionCount(const size_t category) override; + const char* getRegionCategoryName(const size_t category) override; + const char* getRegionName(const size_t category, const size_t index) override; + void selectRegion(const size_t category, const char* name) override; + void selectRegion(const size_t category, const size_t index) override; + + void refreshBrainSubset(); + +protected: + + std::vector>> m_lookups; + std::vector m_selecteds; + + C3DMesh m_face, m_scalp, m_brain; + + std::vector m_brainSubsetTriangles; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenGL diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererMountain.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererMountain.cpp new file mode 100644 index 0000000..6dfcb16 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererMountain.cpp @@ -0,0 +1,161 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include "mCRendererMountain.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { + +void CRendererMountain::rebuild(const CRendererContext& ctx) +{ + IRenderer::rebuild(ctx); + + + m_mountain.m_Vertices.clear(); + m_mountain.m_Vertices.resize(m_nChannel * m_nSample); + for (size_t i = 0, k = 0; i < m_nChannel; ++i) + { + for (size_t j = 0; j < m_nSample; ++j) + { + const float a = i * 1.F / float(m_nChannel - 1); + const float b = 1 - j * 1.F / float(m_nSample - 1); + m_mountain.m_Vertices[k].x = a; + m_mountain.m_Vertices[k].y = 0; + m_mountain.m_Vertices[k].z = b; + m_mountain.m_Vertices[k].u = 0; + k++; + } + } + + m_mountain.m_Triangles.clear(); + m_mountain.m_Triangles.resize((m_nChannel - 1) * (m_nSample - 1) * 6); + size_t id = 0; + for (size_t i = 0; i < m_nChannel - 1; ++i) + { + for (size_t j = 0; j < m_nSample - 1; ++j) + { + const size_t v1 = i * m_nSample + j; + const size_t v2 = v1 + m_nSample; + m_mountain.m_Triangles[id++] = v1; + m_mountain.m_Triangles[id++] = v2; + m_mountain.m_Triangles[id++] = v2 + 1; + m_mountain.m_Triangles[id++] = v1; + m_mountain.m_Triangles[id++] = v2 + 1; + m_mountain.m_Triangles[id++] = v1 + 1; + } + } + + m_historyIdx = 0; +} + +void CRendererMountain::refresh(const CRendererContext& ctx) +{ + IRenderer::refresh(ctx); + + if (!m_nHistory) { return; } + + + for (size_t i = 0; i < ctx.getSelectedCount(); ++i) + { + size_t k = ((m_nHistory - 1) / m_nSample) * m_nSample; + std::vector& history = m_history[ctx.getSelected(i)]; + CVertex* vertex = &m_mountain.m_Vertices[i * m_nSample]; + for (size_t j = 0; j < m_nSample; ++j, ++k) + { + if (/*k>=m_historyIdx && */k < m_nHistory) + { + vertex[j].u = history[k]; + vertex[j].y = history[k] / 2; + } + } + } + + m_mountain.compile(); + + m_historyIdx = m_nHistory; +} + +bool CRendererMountain::render(const CRendererContext& ctx) +{ + if (m_mountain.m_Vertices.empty() || !m_nHistory) { return false; } + + const float d = 2.5F; + + glEnable(GL_LIGHTING); + + glEnable(GL_DEPTH_TEST); + glDisable(GL_BLEND); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluPerspective(60, ctx.getAspect(), .01, 100); + glTranslatef(0, -.2F, -d); + glRotatef(ctx.getRotationX() * 10, 1, 0, 0); + glRotatef(ctx.getRotationY() * 10, 0, 1, 0); + + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glScalef(ctx.getScale(), 1, 1); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glScalef(3 * ctx.getZoom(), 3 * ctx.getZoom(), 3 * ctx.getZoom()); + glTranslatef(-.5F, 0, -.5F); + glScalef(m_nChannel * 1.F / ctx.getSelectedCount(), ctx.getScale(), 1); + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glVertexPointer(3, GL_FLOAT, sizeof(CVertex), &m_mountain.m_Vertices[0].x); + glNormalPointer(GL_FLOAT, sizeof(CVertex), &m_mountain.m_Normals[0].x); + glTexCoordPointer(1, GL_FLOAT, sizeof(CVertex), &m_mountain.m_Vertices[0].u); + + glColor3f(ctx.getTranslucency(), ctx.getTranslucency(), ctx.getTranslucency()); + glDrawElements(GL_TRIANGLES, GLsizei((ctx.getSelectedCount() - 1) * (m_nSample - 1) * 6), GL_UNSIGNED_INT, &m_mountain.m_Triangles[0]); + /* + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + glColor3f(0, 0, 0); + glDrawElements(GL_TRIANGLES, m_mountain.m_Triangles.size(), GL_UNSIGNED_INT, &m_mountain.m_Triangles[0]); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + */ + + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + + glMatrixMode(GL_TEXTURE); + glPopMatrix(); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + + return true; +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererMountain.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererMountain.hpp new file mode 100644 index 0000000..1aa5644 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererMountain.hpp @@ -0,0 +1,40 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "mIRenderer.hpp" +#include "mC3DMesh.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRendererMountain : public IRenderer +{ +public: + + void rebuild(const CRendererContext& ctx) override; + void refresh(const CRendererContext& ctx) override; + bool render(const CRendererContext& ctx) override; + +protected: + C3DMesh m_mountain; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererMultiLine.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererMultiLine.cpp new file mode 100644 index 0000000..f4fdcd8 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererMultiLine.cpp @@ -0,0 +1,103 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include +#include "mCRendererMultiLine.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { + +bool CRendererMultiLine::render(const CRendererContext& ctx) +{ + if (!ctx.getSelectedCount() || !m_nHistory) { return false; } + + const auto nSample = int(m_nSample); + const auto n1 = int(m_historyIdx % m_nSample); + const auto n2 = int(nSample - n1); + + if (!nSample) { return false; } + + const float t1 = n2 * 1.F / nSample; + const float t2 = -n1 * 1.F / nSample; + + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glLoadIdentity(); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glTranslatef(0, ctx.isPositiveOnly() ? 0 : 0.5F, 0); + glScalef(1, ctx.getScale(), 1); + glEnableClientState(GL_VERTEX_ARRAY); + for (size_t i = 0; i < ctx.getSelectedCount(); ++i) + { + std::vector& vertices = m_vertices[ctx.getSelected(i)]; + glTexCoord1f(1 - (i + .5F) / ctx.getSelectedCount()); + if (ctx.isScrollModeActive()) + { + glPushMatrix(); + glTranslatef(t1, 0, 0); + glVertexPointer(3, GL_FLOAT, sizeof(CVertex), &vertices[0].x); + glDrawArrays(GL_LINE_STRIP, 0, n1); + glPopMatrix(); + if (n2 > 0) + { + glPushMatrix(); + glTranslatef(t2, 0, 0); + glVertexPointer(3, GL_FLOAT, sizeof(CVertex), &vertices[n1].x); + glDrawArrays(GL_LINE_STRIP, 0, n2); + glPopMatrix(); + + if (n1 > 0) + { + glBegin(GL_LINES); + glVertex2f(vertices[nSample - 1].x + t2, vertices[nSample - 1].y); + glVertex2f(vertices[0].x + t1, vertices[0].y); + glEnd(); + } + } + } + else + { + glVertexPointer(3, GL_FLOAT, sizeof(CVertex), &vertices[0].x); + glDrawArrays(GL_LINE_STRIP, 0, nSample); + } + } + glDisableClientState(GL_VERTEX_ARRAY); + glPopMatrix(); + + glMatrixMode(GL_TEXTURE); + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + + glDisable(GL_TEXTURE_1D); + glColor3f(.2F, .2F, .2F); + glBegin(GL_LINES); + glVertex2f(0, ctx.isPositiveOnly() ? 0 : 0.5F); + glVertex2f(1, ctx.isPositiveOnly() ? 0 : 0.5F); + glEnd(); + + return true; +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererMultiLine.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererMultiLine.hpp new file mode 100644 index 0000000..e5e54e3 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererMultiLine.hpp @@ -0,0 +1,34 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "mCRendererLine.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRendererMultiLine : public CRendererLine +{ +public: + + bool render(const CRendererContext& ctx) override; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererSlice.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererSlice.cpp new file mode 100644 index 0000000..d674797 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererSlice.cpp @@ -0,0 +1,247 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include "mCRendererSlice.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { + +void CRendererSlice::rebuild(const CRendererContext& ctx) +{ + IRenderer::rebuild(ctx); + + + m_vertices.clear(); + m_vertices.resize(m_nSample * m_nChannel * 8); + + m_quads.clear(); + m_quads.resize(m_nSample * m_nChannel * 6 * 4); + + size_t k = 0, l = 0; + for (size_t i = 0; i < m_nSample; ++i) + { + for (size_t j = 0; j < m_nChannel; ++j) + { + const float size = .5; + + m_quads[l++] = k + 0; + m_quads[l++] = k + 1; // q0 + m_quads[l++] = k + 2; + m_quads[l++] = k + 3; + + m_quads[l++] = k + 4; + m_quads[l++] = k + 7; // q1 + m_quads[l++] = k + 6; + m_quads[l++] = k + 5; + + m_quads[l++] = k + 5; + m_quads[l++] = k + 1; // q2 + m_quads[l++] = k + 2; + m_quads[l++] = k + 6; + + m_quads[l++] = k + 4; + m_quads[l++] = k + 7; // q3 + m_quads[l++] = k + 3; + m_quads[l++] = k + 0; + + m_quads[l++] = k + 5; + m_quads[l++] = k + 4; // q4 + m_quads[l++] = k + 0; + m_quads[l++] = k + 1; + + m_quads[l++] = k + 6; + m_quads[l++] = k + 7; // q5 + m_quads[l++] = k + 3; + m_quads[l++] = k + 2; + + const float ox = 0; + const float oy = 0.5F * float(m_nChannel - 1) - j; + const float oz = 0.5F * float(m_nSample - 1) - i; + + m_vertices[k].x = ox + size; + m_vertices[k].y = oy - size; // v0 + m_vertices[k].z = oz + size; + k++; + + m_vertices[k].x = ox + size; + m_vertices[k].y = oy + size; // v1 + m_vertices[k].z = oz + size; + k++; + + m_vertices[k].x = ox + size; + m_vertices[k].y = oy + size; // v2 + m_vertices[k].z = oz - size; + k++; + + m_vertices[k].x = ox + size; + m_vertices[k].y = oy - size; // v3 + m_vertices[k].z = oz - size; + k++; + + m_vertices[k].x = ox - size; + m_vertices[k].y = oy - size; // v4 + m_vertices[k].z = oz + size; + k++; + + m_vertices[k].x = ox - size; + m_vertices[k].y = oy + size; // v5 + m_vertices[k].z = oz + size; + k++; + + m_vertices[k].x = ox - size; + m_vertices[k].y = oy + size; // v6 + m_vertices[k].z = oz - size; + k++; + + m_vertices[k].x = ox - size; + m_vertices[k].y = oy - size; // v7 + m_vertices[k].z = oz - size; + k++; + } + } + m_historyIdx = 0; +} + +void CRendererSlice::refresh(const CRendererContext& ctx) +{ + IRenderer::refresh(ctx); + + for (size_t i = m_historyIdx; i < m_nHistory; ++i) + { + size_t k = (i % m_nSample) * m_nChannel * 8; + for (size_t j = 0; j < m_nChannel; ++j) { for (size_t l = 0; l < 8; ++l) { m_vertices[k++].u = m_history[j][i]; } } + } + + m_historyIdx = m_nHistory; +} + +bool CRendererSlice::render(const CRendererContext& ctx) +{ + // size_t i, j; + const float d = 3.5; + + if (!ctx.getSelectedCount() || !m_nHistory) { return false; } + + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + // ::glEnable(GL_CULL_FACE); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluPerspective(60, ctx.getAspect(), .01, 100); + glTranslatef(0, 0, -d); + glRotatef(ctx.getRotationX() * 10, 1, 0, 0); + glRotatef(ctx.getRotationY() * 10, 0, 1, 0); + + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glScalef(ctx.getScale(), 1, 1); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glScalef(ctx.getZoom(), ctx.getZoom(), ctx.getZoom()); + glScalef(1., 1., 3.); + + glPushMatrix(); + glScalef(1.F / ctx.getStackCount(), 1.F / m_nChannel, 1.F / m_nSample); + glTranslatef(ctx.getStackIndex() - 0.5F * float(ctx.getStackCount() - 1), 0, 0); + glColor4f(.1F, .1F, .1F, ctx.getTranslucency()); + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + + glVertexPointer(3, GL_FLOAT, sizeof(CVertex), &m_vertices[0].x); + glTexCoordPointer(1, GL_FLOAT, sizeof(CVertex), &m_vertices[0].u); + glDrawElements(GL_QUADS, GLsizei(m_quads.size()), GL_UNSIGNED_INT, &m_quads[0]); + + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); + glPopMatrix(); + + glDisable(GL_TEXTURE_1D); + + const float progress = 1 - 2.0F * float(m_historyIdx % m_nSample) / m_nSample; + glScalef(.5, .5, .5); + glBegin(GL_LINE_LOOP); + glColor3f(1, 1, 1); + glVertex3f(-1, -1, -1); + glVertex3f(-1, 1, -1); + glVertex3f(1, 1, -1); + glVertex3f(1, -1, -1); + glEnd(); + glBegin(GL_LINE_LOOP); + glColor3f(1, 1, 1); + glVertex3f(-1, -1, 1); + glVertex3f(-1, 1, 1); + glVertex3f(1, 1, 1); + glVertex3f(1, -1, 1); + glEnd(); + glBegin(GL_LINE_LOOP); + glColor3f(1, 1, 1); + glVertex3f(-1, -1, -1); + glVertex3f(-1, 1, -1); + glVertex3f(-1, 1, 1); + glVertex3f(-1, -1, 1); + glEnd(); + glBegin(GL_LINE_LOOP); + glColor3f(1, 1, 1); + glVertex3f(1, -1, -1); + glVertex3f(1, 1, -1); + glVertex3f(1, 1, 1); + glVertex3f(1, -1, 1); + glEnd(); + glBegin(GL_LINE_LOOP); + glColor4f(0.25F, 1, 0.25F, .9F / ctx.getStackCount()); + glVertex3f(-1, -1, progress); + glVertex3f(-1, 1, progress); + glVertex3f(1, 1, progress); + glVertex3f(1, -1, progress); + glEnd(); + glBegin(GL_QUADS); + glColor4f(0.25F, 1, 0.25F, .1F / ctx.getStackCount()); + glVertex3f(-1, -1, progress); + glVertex3f(-1, 1, progress); + glVertex3f(1, 1, progress); + glVertex3f(1, -1, progress); + glEnd(); + + glEnable(GL_TEXTURE_1D); + + if (ctx.getCheckBoardVisibility()) { this->drawCoordinateSystem(); } + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + + glMatrixMode(GL_TEXTURE); + glPopMatrix(); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + + return true; +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererSlice.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererSlice.hpp new file mode 100644 index 0000000..26b4057 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererSlice.hpp @@ -0,0 +1,40 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "mIRenderer.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRendererSlice : public IRenderer +{ +public: + + void rebuild(const CRendererContext& ctx) override; + void refresh(const CRendererContext& ctx) override; + bool render(const CRendererContext& ctx) override; + +protected: + std::vector m_vertices; + std::vector m_quads; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo.cpp new file mode 100644 index 0000000..11e4c8b --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo.cpp @@ -0,0 +1,438 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include "mCRendererTopo.hpp" +#include "m_RendererTools.hpp" + +#include + +namespace OpenViBE { +namespace AdvancedVisualization { + +const bool MULTI_SLICE = false; + +namespace { +const size_t S = 1000; + +// Legendre polynomials +// http://en.wikipedia.org/wiki/Legendre_polynomials + +void legendre(const size_t n, const double x, std::vector& legendres) +{ + legendres.resize(n + 1); + legendres[0] = 1; + legendres[1] = x; + for (size_t i = 2; i <= n; ++i) + { + const double invi = 1. / i; + legendres[i] = (2 - invi) * x * legendres[i - 1] - (1 - invi) * legendres[i - 2]; + } +} + +// G function : +// Spherical splines for scalp potential and current density mapping +// http://www.sciencedirect.com/science/article/pii/0013469489901806 + +double g(const size_t n, const size_t m, const std::vector& legendres) +{ + double result = 0; + for (size_t i = 1; i <= n; ++i) { result += (2 * i + 1) / pow(double(i * (i + 1)), int(m)) * legendres[i]; } + return result / (4 * M_PI); +} + +// H function : +// Spherical splines for scalp potential and current density mapping +// http://www.sciencedirect.com/science/article/pii/0013469489901806 + +double h(const size_t n, const size_t m, const std::vector& legendres) +{ + double result = 0; + for (size_t i = 1; i <= n; ++i) { result += (2 * i + 1) / pow(double(i * (i + 1)), int(m - 1)) * legendres[i]; } + return result / (4 * M_PI); +} + +// Caching system + +void build(const size_t n, const size_t m, std::vector& gCache, std::vector& hCache) +{ + gCache.resize(2 * S + 1); + hCache.resize(2 * S + 1); + for (size_t i = 0; i <= 2 * S; ++i) + { + std::vector legendres; + const double cosine = (double(i) - S) / S; + + legendre(n, cosine, legendres); + gCache[i] = g(n, m, legendres); + hCache[i] = h(n, m, legendres); + } + gCache.push_back(gCache.back()); + hCache.push_back(hCache.back()); +} + +double cache(const double x, std::vector& rCache) +{ + if (x < -1) { return rCache[0]; } + if (x > 1) { return rCache[2 * S]; } + double t = (x + 1) * S; + const int i1 = int(t); + const int i2 = int(t + 1); + t -= i1; + return rCache[i1] * (1 - t) + rCache[i2] * t; +} +} // namespace + +void CRendererTopo::rebuild(const CRendererContext& ctx) +{ + IRenderer::rebuild(ctx); + + this->rebuild3DMeshesPre(ctx); + + // Projects electrode coordinates to 3D mesh + + std::vector projectedPositions; + std::vector positions; + positions.resize(ctx.getChannelCount()); + for (size_t i = 0; i < ctx.getChannelCount(); ++i) { ctx.getChannelLocalisation(i, positions[i].x, positions[i].y, positions[i].z); } + m_scalp.project(projectedPositions, positions); + m_projectedPositions = projectedPositions; + +#if 0 + + m_projectedPositions.resize(ctx.getChannelCount()); + for (size_t i = 0; i < ctx.getChannelCount(); ++i) + { + CVertex p, q; + ctx.getChannelLocalisation(i, p.x, p.y, p.z); + for (size_t j = 0; j < m_scalp.m_Triangles.size(); j += 3) + { + size_t i1, i2, i3; + i1 = m_scalp.m_Triangles[j]; + i2 = m_scalp.m_Triangles[j + 1]; + i3 = m_scalp.m_Triangles[j + 2]; + + CVertex v1, v2, v3; + v1 = m_scalp.m_vertex[i1]; + v2 = m_scalp.m_vertex[i2]; + v3 = m_scalp.m_vertex[i3]; + + CVertex e1(v1, v2); + CVertex e2(v1, v3); + CVertex n = CVertex::cross(e1, e2).normalize(); + + float t = CVertex::dot(v1, n) / CVertex::dot(p, n); + q.x = t * p.x; + q.y = t * p.y; + q.z = t * p.z; + + if (CVertex::isInTriangle(q, v1, v2, v3) && t >= 0) + { + m_projectedPositions[i].x = q.x; + m_projectedPositions[i].y = q.y; + m_projectedPositions[i].z = q.z; + } + } + if (m_projectedPositions[i].x == 0 && m_projectedPositions[i].y == 0 && m_projectedPositions[i].z == 0) + { + // ::printf("Could not project coordinates on mesh for channel %i [%s]\n", i+1, rContext.getChannelName(i).c_str()); + } + } + +#endif + + // Generates transformation matrices based spherical spline interpolations + + const size_t m = 3; + const auto n = size_t(pow(10., 10. / (2 * m - 2))); + + std::vector gCaches; + std::vector hCaches; + build(n, m, gCaches, hCaches); + + const size_t nc = ctx.getChannelCount(); + const size_t vc = m_scalp.m_Vertices.size(); + + A = Eigen::MatrixXd(nc + 1, nc + 1); + A(nc, nc) = 0; + for (size_t i = 0; i < nc; ++i) + { + A(i, nc) = 1; + A(nc, i) = 1; + for (size_t j = 0; j <= i; ++j) + { + CVertex v1, v2; + ctx.getChannelLocalisation(i, v1.x, v1.y, v1.z); + ctx.getChannelLocalisation(j, v2.x, v2.y, v2.z); + + const double cosine = CVertex::dot(v1, v2); + A(i, j) = cache(cosine, gCaches); + A(j, i) = cache(cosine, gCaches); + } + } + + B = Eigen::MatrixXd(vc + 1, nc + 1); + D = Eigen::MatrixXd(vc + 1, nc + 1); + B(vc, nc) = 0; + D(vc, nc) = 0; + for (size_t i = 0; i < vc; ++i) + { + B(i, nc) = 1; + D(i, nc) = 1; + for (size_t j = 0; j < nc; ++j) + { + B(vc, j) = 1; + D(vc, j) = 1; + CVertex v1, v2; + v1 = m_scalp.m_Vertices[i]; + v1.normalize(); + ctx.getChannelLocalisation(j, v2.x, v2.y, v2.z); + + const double cosine = CVertex::dot(v1, v2); + B(i, j) = cache(cosine, gCaches); + D(i, j) = cache(cosine, hCaches); + } + } + + Ai = A.inverse(); + + // Post processed 3D meshes when needed + + this->rebuild3DMeshesPost(ctx); + + // Rebuilds texture coordinates array + + if (MULTI_SLICE) + { + m_interpolatedSamples.clear(); + m_interpolatedSamples.resize(m_nSample, Eigen::VectorXd::Zero(m_scalp.m_Vertices.size())); + } + + // Finalizes + + m_historyIdx = 0; +} + +// V has sensor potentials +// W has interpolated potentials +// Z has interpolated current densities +void CRendererTopo::interpolate(const Eigen::VectorXd& v, Eigen::VectorXd& w, Eigen::VectorXd& z) const +{ + Eigen::VectorXd c = Ai * v; + w = B * c; + c[v.size() - 1] = 0; + z = D * c; +} + +void CRendererTopo::refresh(const CRendererContext& ctx) +{ + IRenderer::refresh(ctx); + + if (!m_nHistory) { return; } + + size_t nc = ctx.getChannelCount(); + const size_t vc = m_scalp.m_Vertices.size(); + + std::vector samples; + Eigen::VectorXd v = Eigen::VectorXd::Zero(nc + 1); + Eigen::VectorXd w; + Eigen::VectorXd z; + + if (!MULTI_SLICE) + { + this->getSampleAtERPFraction(m_erpFraction, samples); + for (size_t i = 0; i < nc; ++i) { v(i) = samples[i]; } + this->interpolate(v, w, z); + for (size_t j = 0; j < vc; ++j) { m_scalp.m_Vertices[j].u = float(w(j)); } + } + else + { + if (m_nHistory >= m_nSample) + { + for (size_t k = 0; k < m_nSample; ++k) + { + for (size_t i = 0; i < nc; ++i) { v(i) = m_history[i][m_nHistory - m_nSample + k]; } + this->interpolate(v, w, z); + m_interpolatedSamples[k] = w; + } + } + } + + m_historyIdx = m_nHistory; +} + +bool CRendererTopo::render(const CRendererContext& ctx) +{ + if (!ctx.getSelectedCount() || m_scalp.m_Vertices.empty() || !m_nHistory) { return false; } + + const float d = 3.5; + + // ::glEnable(GL_DEPTH_TEST); + // ::glDisable(GL_BLEND); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluPerspective(60, ctx.getAspect(), .01, 100); + glTranslatef(0, 0, -d); + glRotatef(ctx.getRotationX() * 10, 1, 0, 0); + glRotatef(ctx.getRotationY() * 10, 0, 1, 0); + + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glScalef(ctx.getScale(), 1, 1); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glScalef(ctx.getZoom(), ctx.getZoom(), ctx.getZoom()); + + // Now renders + + glPushMatrix(); +#if 1 + glTranslatef(0, .5F, 0); + glRotatef(19, 1, 0, 0); + glTranslatef(0, -.2F, .35F); + // ::glScalef(1.8f, 1.8f, 1.8f); +#else + ::glRotatef(19, 1, 0, 0); + ::glTranslatef(0, -.2f, .35f); + // ::glScalef(1.8f, 1.8f, 1.8f); +#endif + + if (ctx.isFaceMeshVisible()) + { + glEnable(GL_DEPTH_TEST); + glDisable(GL_BLEND); + glDisable(GL_TEXTURE_1D); + if (!m_face.m_Triangles.empty()) + { + if (!m_face.m_Normals.empty()) + { + glEnable(GL_LIGHTING); + glEnableClientState(GL_NORMAL_ARRAY); + } + glColor3f(m_face.m_Color[0], m_face.m_Color[1], m_face.m_Color[2]); + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, sizeof(CVertex), &m_face.m_Vertices[0].x); + if (!m_face.m_Normals.empty()) { glNormalPointer(GL_FLOAT, sizeof(CVertex), &m_face.m_Normals[0].x); } + glDrawElements(GL_TRIANGLES, GLsizei(m_face.m_Triangles.size()), GL_UNSIGNED_INT, &m_face.m_Triangles[0]); + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); + glDisable(GL_LIGHTING); + } + } + + if (ctx.isScalpMeshVisible()) + { + glEnable(GL_TEXTURE_1D); + if (!m_scalp.m_Triangles.empty()) + { + if (!m_scalp.m_Normals.empty()) + { + glEnable(GL_LIGHTING); + glEnableClientState(GL_NORMAL_ARRAY); + } + glColor3f(m_scalp.m_Color[0], m_scalp.m_Color[1], m_scalp.m_Color[2]); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glVertexPointer(3, GL_FLOAT, sizeof(CVertex), &m_scalp.m_Vertices[0].x); + if (!m_scalp.m_Normals.empty()) { glNormalPointer(GL_FLOAT, sizeof(CVertex), &m_scalp.m_Normals[0].x); } + + if (!MULTI_SLICE) + { + glColor3f(1, 1, 1); + glEnable(GL_DEPTH_TEST); + glDisable(GL_BLEND); + glTexCoordPointer(1, GL_FLOAT, sizeof(CVertex), &m_scalp.m_Vertices[0].u); + glDrawElements(GL_TRIANGLES, GLsizei(m_scalp.m_Triangles.size()), GL_UNSIGNED_INT, &m_scalp.m_Triangles[0]); + } + else + { + glColor4f(1.F, 1.F, 1.F, 4.F / m_nSample); + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + for (size_t i = 0; i < m_nSample; ++i) + { + float scale = 1.F + i * 0.25F / m_nSample; + glPushMatrix(); + glScalef(scale, scale, scale); + glTexCoordPointer(1, GL_DOUBLE, 0, &m_interpolatedSamples[i][0]); + glDrawElements(GL_TRIANGLES, GLsizei(m_scalp.m_Triangles.size()), GL_UNSIGNED_INT, &m_scalp.m_Triangles[0]); + glPopMatrix(); + } + } + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); + glDisable(GL_LIGHTING); + } + } + + glEnable(GL_DEPTH_TEST); + glDisable(GL_BLEND); + glDisable(GL_TEXTURE_1D); + + glLineWidth(3); + for (size_t j = 0; j < ctx.getChannelCount(); ++j) + { + const float scale = .025F; + const CVertex v = m_projectedPositions[j]; + //ctx.getChannelLocalisation(j, v.x, v.y, v.z); + + glPushMatrix(); + glTranslatef(v.x, v.y, v.z); + glScalef(scale, scale, scale); + + const float value = ctx.isSelected(j) ? 1.0F : 0.2F; + const std::array color = { value, value, value }; + glColor3fv(color.data()); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + cube(); + + glColor3f(0, 0, 0); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + cube(); + + glPopMatrix(); + } + glPopMatrix(); + + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + if (ctx.getCheckBoardVisibility()) { this->drawCoordinateSystem(); } + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + + glMatrixMode(GL_TEXTURE); + glPopMatrix(); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + + return true; +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo.hpp new file mode 100644 index 0000000..a8f00c8 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo.hpp @@ -0,0 +1,61 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#pragma once + +#include "mIRenderer.hpp" +#include "mC3DMesh.hpp" + +#include + +#include + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRendererTopo : public IRenderer +{ +public: + + void rebuild(const CRendererContext& ctx) override; + void refresh(const CRendererContext& ctx) override; + bool render(const CRendererContext& ctx) override; + + // Called before electrode projections and spherical interpolation parameters generations and might be used to load a mesh or generate a sphere for instance + virtual void rebuild3DMeshesPre(const CRendererContext& ctx) = 0; + // Called after electrode projections and spherical interpolation parameters generations and might be used to unfold previously loaded mesh for instance + virtual void rebuild3DMeshesPost(const CRendererContext& ctx) = 0; + +private: + + void interpolate(const Eigen::VectorXd& v, Eigen::VectorXd& w, Eigen::VectorXd& z) const; + +protected: + + std::vector m_projectedPositions; + + C3DMesh m_face; + C3DMesh m_scalp; + std::vector m_interpolatedSamples; + + Eigen::MatrixXd A, B, D, Ai; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo2D.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo2D.cpp new file mode 100644 index 0000000..da0a4a0 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo2D.cpp @@ -0,0 +1,144 @@ +#include "mCRendererTopo2D.hpp" +#include + +namespace OpenViBE { +namespace AdvancedVisualization { + +// constexpr constexpr float OFFSET = 0.0001f; //Macro modernization, Not yet with jenkins (not the last visual 2013 which it works) +#define OFFSET 0.0001f + +void CRendererTopo2D::rebuild3DMeshesPre(const CRendererContext& /*rContext*/) +{ + const size_t nVertex1 = 32; + const size_t nVertex2 = 32; + const size_t nCircleVertex = 128; + + { // Scalp + m_scalp.clear(); + + std::vector& vertices = m_scalp.m_Vertices; + std::vector& triangles = m_scalp.m_Triangles; + + vertices.resize(nVertex1 * nVertex2); + for (size_t i = 0, k = 0; i < nVertex1; ++i) + { + for (size_t j = 0; j < nVertex2; j++, k++) + { + const auto a = float(i * M_PI / (nVertex1 - 1)); + const auto b = float(j * 1.25 * M_PI / (nVertex2 - 1) - M_PI * .2); + vertices[k].x = cosf(a); + vertices[k].y = sinf(a) * sinf(b) - OFFSET; + vertices[k].z = sinf(a) * cosf(b); + vertices[k].u = k * 200.F / (nVertex1 * nVertex2); + } + } + + triangles.resize((nVertex1 - 1) * (nVertex2 - 1) * 6); + for (size_t i = 0, k = 0; i < nVertex1 - 1; ++i) + { + for (size_t j = 0; j < nVertex2 - 1; j++, k += 6) + { + triangles[k] = (i) * nVertex2 + (j); + triangles[k + 1] = (i + 1) * nVertex2 + (j); + triangles[k + 2] = (i + 1) * nVertex2 + (j + 1); + + triangles[k + 3] = triangles[k]; + triangles[k + 4] = triangles[k + 2]; + triangles[k + 5] = (i) * nVertex2 + (j + 1); + } + } + + m_scalp.m_Color.fill(1.0); + // m_scalp.compile(); + } + + { // Face + m_face.clear(); + + std::vector& vertices = m_face.m_Vertices; + std::vector& triangles = m_face.m_Triangles; + + // Ribbon mesh + + vertices.resize(nCircleVertex * 2/*+6*/); + for (size_t i = 0, k = 0; i < nCircleVertex; ++i, ++k) + { + const auto a = float(i * 4 * M_PI / nCircleVertex); + + vertices[k].x = cosf(a); + vertices[k].y = .01F; + vertices[k].z = sinf(a); + k++; + vertices[k].x = cosf(a); + vertices[k].y = -.01F; + vertices[k].z = sinf(a); + } + + // Nose mesh + /* + vertices[k].x=-1; vertices[k].y=.01; vertices[k].z=-.5; + k++; + vertices[k].x=-1; vertices[k].y=-.01; vertices[k].z=-.5; + k++; + vertices[k].x=0; vertices[k].y=.01; vertices[k].z=-1.5; + k++; + vertices[k].x=0; vertices[k].y=-.01; vertices[k].z=-1.5; + k++; + vertices[k].x=1; vertices[k].y=.01; vertices[k].z=-.5; + k++; + vertices[k].x=1; vertices[k].y=-.01; vertices[k].z=-.5; + */ + // Ribon mesh + + triangles.resize(nCircleVertex * 6/*+12*/); + const size_t mod = nCircleVertex * 2; + for (size_t i = 0, k = 0; i < nCircleVertex; ++i) + { + triangles[k++] = (i) % mod; + triangles[k++] = (i + 1) % mod; + triangles[k++] = (i + 2) % mod; + + triangles[k++] = (i + 1) % mod; + triangles[k++] = (i + 2) % mod; + triangles[k++] = (i + 3) % mod; + } + + // Nose mesh + /* + triangles[k++] = mod; triangles[k++] = mod + 1; triangles[k++] = mod + 2; + triangles[k++] = mod + 1; triangles[k++] = mod + 2; triangles[k++] = mod + 3; + triangles[k++] = mod + 2; triangles[k++] = mod + 3; triangles[k++] = mod + 4; + triangles[k++] = mod + 3; triangles[k++] = mod + 4; triangles[k++] = mod + 5; + */ + m_face.m_Color.fill(1.15F); + // m_face.compile(); + } +} + +namespace { +void unfold(std::vector& vertices, const float layer = 0) +{ + for (auto& v : vertices) + { + v.y += OFFSET; + const float phi = float(M_PI) * .5F - asinf(v.y); + const float psi = atan2f(v.z, v.x); + + v.x = phi * cos(psi); + v.y = layer; + v.z = phi * sin(psi); + } +} +} // namespace + +void CRendererTopo2D::rebuild3DMeshesPost(const CRendererContext& /*ctx*/) +{ + const float layer = 1E-3F; + + unfold(m_scalp.m_Vertices, -layer); + unfold(m_face.m_Vertices, layer); + unfold(m_projectedPositions); +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo2D.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo2D.hpp new file mode 100644 index 0000000..ea0da44 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo2D.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "mCRendererTopo.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRendererTopo2D : public CRendererTopo +{ +public: + + void rebuild3DMeshesPre(const CRendererContext& ctx) override; + void rebuild3DMeshesPost(const CRendererContext& ctx) override; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo3D.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo3D.cpp new file mode 100644 index 0000000..a84494d --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo3D.cpp @@ -0,0 +1,25 @@ +#include "mCRendererTopo3D.hpp" + +#include "content/Face.obj.hpp" +#include "content/Scalp.obj.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { + +void CRendererTopo3D::rebuild3DMeshesPre(const CRendererContext& /*ctx*/) +{ + m_face.clear(); + m_scalp.clear(); + + //m_face.load(OpenViBE::Directories::getDataDir() + "/content/Face.obj"); + //m_scalp.load(OpenViBE::Directories::getDataDir() + "/content/Scalp.obj"); + m_face.load(FACE_DATA); + m_scalp.load(SCALP_DATA); + + m_face.m_Color[0] = .8F; + m_face.m_Color[1] = .6F; + m_face.m_Color[2] = .5F; +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo3D.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo3D.hpp new file mode 100644 index 0000000..975cc07 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererTopo3D.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "mCRendererTopo.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRendererTopo3D : public CRendererTopo +{ +public: + + void rebuild3DMeshesPre(const CRendererContext& ctx) override; + void rebuild3DMeshesPost(const CRendererContext& /*ctx*/) override { } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererXYZPlot.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererXYZPlot.cpp new file mode 100644 index 0000000..90a9723 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererXYZPlot.cpp @@ -0,0 +1,145 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include "mCRendererXYZPlot.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { + +void CRendererXYZPlot::rebuild(const CRendererContext& ctx) +{ + IRenderer::rebuild(ctx); + + m_hasDepth = ctx.hasXYZPlotDepth(); + m_plotDim = (m_hasDepth ? 3 : 2); + m_nPlot = (ctx.getChannelCount() + m_plotDim - 1) / m_plotDim; + m_vertex.resize(m_nPlot); + const float inverseSampleCount = 1.0F / float(m_nSample < 2 ? 1 : (m_nSample - 1)); + for (size_t i = 0; i < m_nPlot; ++i) + { + m_vertex[i].resize(this->m_nSample); + for (size_t j = 0; j < this->m_nSample; ++j) { m_vertex[i][j].u = j * inverseSampleCount; } + } + + m_historyIdx = 0; +} + +void CRendererXYZPlot::refresh(const CRendererContext& ctx) +{ + IRenderer::refresh(ctx); + + if (!m_nHistory) { return; } + + while (m_historyIdx < m_nHistory) + { + const size_t j = m_historyIdx % this->m_nSample; + for (size_t i = 0; i < m_nPlot; ++i) + { + if (m_hasDepth) + { + const size_t i3 = i * 3; + m_vertex[i][j].x = (i3 < m_history.size() ? m_history[i3][m_historyIdx] : 0); + m_vertex[i][j].y = (i3 + 1 < m_history.size() ? m_history[i3 + 1][m_historyIdx] : 0); + m_vertex[i][j].z = (i3 + 2 < m_history.size() ? m_history[i3 + 2][m_historyIdx] : 0); + } + else + { + const size_t i3 = i * 2; + m_vertex[i][j].x = (i3 < m_history.size() ? m_history[i3][m_historyIdx] : 0); + m_vertex[i][j].y = (i3 + 1 < m_history.size() ? m_history[i3 + 1][m_historyIdx] : 0); + } + } + m_historyIdx++; + } +} + +bool CRendererXYZPlot::render(const CRendererContext& ctx) +{ + if (!ctx.getSelectedCount() || m_vertex.empty() || !m_nHistory) { return false; } + + glPointSize(5); + + if (m_hasDepth) + { + const float d = 3.5; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluPerspective(60, ctx.getAspect(), .01, 100); + glTranslatef(0, 0, -d); + glRotatef(ctx.getRotationX() * 10, 1, 0, 0); + glRotatef(ctx.getRotationY() * 10, 0, 1, 0); + } + + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glLoadIdentity(); + + glMatrixMode(GL_MODELVIEW); + glTranslatef(m_hasDepth ? 0 : 0.5F, m_hasDepth ? 0 : 0.5F, 0); + glScalef(ctx.getZoom(), ctx.getZoom(), ctx.getZoom()); + + if (ctx.isAxisDisplayed()) + { + if (m_hasDepth) { this->draw3DCoordinateSystem(); } + else { this->draw2DCoordinateSystem(); } + } + + size_t n = m_nSample; + const size_t d = (m_historyIdx % m_nSample); + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + for (size_t i = 0; i < m_nPlot; ++i) + { + glPushMatrix(); + glScalef(ctx.getScale(), ctx.getScale(), ctx.getScale()); + + glVertexPointer(GLint(m_plotDim), GL_FLOAT, sizeof(CVertex), &m_vertex[i][0].x); + glTexCoordPointer(1, GL_FLOAT, sizeof(CVertex), &m_vertex[i][n - d].u); + glDrawArrays(GL_POINTS, 0, GLsizei(d)); + + glVertexPointer(GLint(m_plotDim), GL_FLOAT, sizeof(CVertex), &m_vertex[i][d].x); + glTexCoordPointer(1, GL_FLOAT, sizeof(CVertex), &m_vertex[i][0].u); + glDrawArrays(GL_POINTS, 0, GLsizei((m_historyIdx > n ? n : m_historyIdx) - d)); + + glPopMatrix(); + } + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); + + glMatrixMode(GL_TEXTURE); + glPopMatrix(); + + if (m_hasDepth) + { + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + } + + glMatrixMode(GL_MODELVIEW); + + return true; +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererXYZPlot.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererXYZPlot.hpp new file mode 100644 index 0000000..123f21b --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mCRendererXYZPlot.hpp @@ -0,0 +1,42 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "mIRenderer.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRendererXYZPlot : public IRenderer +{ +public: + + void rebuild(const CRendererContext& ctx) override; + void refresh(const CRendererContext& ctx) override; + bool render(const CRendererContext& ctx) override; + +protected: + bool m_hasDepth = false; + size_t m_plotDim = 0; + size_t m_nPlot = 0; + std::vector> m_vertex; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mIRenderer.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mIRenderer.cpp new file mode 100644 index 0000000..3ed8cf2 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mIRenderer.cpp @@ -0,0 +1,319 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include "mIRenderer.hpp" + +#include "mCRendererBars.hpp" +#include "mCRendererBitmap.hpp" +#include "mCRendererConnectivity.hpp" +#include "mCRendererCube.hpp" +#include "mCRendererFlower.hpp" +#include "mCRendererLine.hpp" +#include "mCRendererLoreta.hpp" +#include "mCRendererMountain.hpp" +#include "mCRendererMultiLine.hpp" +#include "mCRendererSlice.hpp" +#include "mTRendererStimulation.hpp" +#include "mCRendererTopo2D.hpp" +#include "mCRendererTopo3D.hpp" +#include "mCRendererXYZPlot.hpp" + +#include +#include // std::min_element, std::max_element + +namespace OpenViBE { +namespace AdvancedVisualization { + +static int iCount = 0; + +IRenderer* IRenderer::create(const ERendererType type, const bool stimulation) +{ + switch (type) + { + case ERendererType::Topography2D: return (stimulation ? nullptr : new CRendererTopo2D); + case ERendererType::Topography3D: return (stimulation ? nullptr : new CRendererTopo3D); + case ERendererType::Bars: return (stimulation ? new TRendererStimulation : new CRendererBars); + case ERendererType::Bitmap: return (stimulation ? new TRendererStimulation : new CRendererBitmap); + case ERendererType::Connectivity: return (stimulation ? nullptr : new CRendererConnectivity); + case ERendererType::Cube: return (stimulation ? nullptr : new CRendererCube); + case ERendererType::Flower: return (stimulation ? nullptr : new CRendererFlower); + case ERendererType::Line: return (stimulation ? new TRendererStimulation : new CRendererLine); + case ERendererType::Loreta: return (stimulation ? nullptr : new CRendererLoreta); + case ERendererType::Mountain: return (stimulation ? nullptr : new CRendererMountain); + case ERendererType::MultiLine: return (stimulation ? new TRendererStimulation : new CRendererMultiLine); + case ERendererType::Slice: return (stimulation ? nullptr : new CRendererSlice); + case ERendererType::XYZPlot: return (stimulation ? nullptr : new CRendererXYZPlot); + // case ERendererType::Default: return (stimulation ? new TRendererStimulation : new CRenderer); + default: return nullptr; + } +} + + +IRenderer::IRenderer() { iCount++; } +IRenderer::~IRenderer() { iCount--; } + +void IRenderer::setChannelCount(const size_t nChannel) +{ + m_nChannel = nChannel; + m_nInverseChannel = (nChannel ? 1.F / nChannel : 1); + m_vertex.clear(); + m_mesh.clear(); + + m_historyIdx = 0; + m_nHistory = 0; + m_history.clear(); + m_history.resize(nChannel); +} + +void IRenderer::setSampleCount(const size_t nSample) +{ + m_nSample = nSample == 0 ? 1 : nSample; + m_nInverseSample = (m_nSample ? 1.F / m_nSample : 1); + m_vertex.clear(); + m_mesh.clear(); +} + +void IRenderer::feed(const float* data) +{ + for (size_t i = 0; i < m_nChannel; ++i) { m_history[i].push_back(data[i]); } + m_nHistory++; +} + +void IRenderer::feed(const float* data, const size_t nSample) +{ + for (size_t i = 0; i < m_nChannel; ++i) + { + for (size_t j = 0; j < nSample; ++j) { m_history[i].push_back(data[j]); } + data += nSample; + } + m_nHistory += nSample; +} + +void IRenderer::prefeed(const size_t nPreFeedSample) +{ + for (size_t i = 0; i < m_nChannel; ++i) { m_history[i].insert(m_history[i].begin(), nPreFeedSample, 0.F); } + m_nHistory += nPreFeedSample; + m_historyIdx = 0; +} + +float IRenderer::getSuggestedScale() +{ + if (m_nChannel != 0) + { + std::vector averages; + + for (size_t i = 0; i < m_nChannel; ++i) + { + averages.push_back(0); + + const size_t n = (m_history[i].size() < m_nSample) ? m_history[i].size() : m_nSample; + + for (size_t j = m_history[i].size(); j > (m_history[i].size() - n); --j) { averages.back() += m_history[i][j - 1]; } + + averages.back() /= float(n); + } + + return (1 / *std::max_element(averages.begin(), averages.end())); + } + return 0; +} + +void IRenderer::clear(const size_t nSampleToKeep) +{ + if (!m_history.empty()) + { + if (nSampleToKeep == 0) + { + for (auto& vec : m_history) { vec.clear(); } + m_nHistory = 0; + } + else if (nSampleToKeep < m_history[0].size()) + { + const size_t sampleToDelete = m_history[0].size() - nSampleToKeep; + + if (sampleToDelete > 1) + { + for (auto& vec : m_history) { std::vector(vec.begin() + sampleToDelete, vec.end()).swap(vec); } + m_nHistory -= size_t(sampleToDelete); + } + } + } + // We always delete all of the stimulations, ideally we would know the time + // scale so we can keep the stimulations according to the kept samples + m_stimulationHistory.clear(); + m_historyIdx = 0; +} + +void IRenderer::setHistoryDrawIndex(const size_t index) +{ + m_historyDrawIdx = index; + m_historyIdx = 0; +} + +bool IRenderer::getSampleAtERPFraction(const float erpFraction, std::vector& samples) const +{ + samples.resize(m_nChannel); + + if (m_nSample > m_nHistory) { return false; } + + const float sampleIndexERP = (erpFraction * float(m_nSample - 1)); + const float alpha = sampleIndexERP - std::floor(sampleIndexERP); + const size_t sampleIndexERP1 = size_t(sampleIndexERP) % m_nSample; + const size_t sampleIndexERP2 = size_t(sampleIndexERP + 1) % m_nSample; + + for (size_t i = 0; i < m_nChannel; ++i) + { + samples[i] = m_history[i][m_nHistory - m_nSample + sampleIndexERP1] * (1 - alpha) + + m_history[i][m_nHistory - m_nSample + sampleIndexERP2] * (alpha); + } + + return true; +} + +void IRenderer::refresh(const CRendererContext& ctx) +{ + if (!m_nSample) + { + m_erpFraction = 0; + m_sampleIndexERP = 0; + return; + } + + m_erpFraction = ctx.getERPFraction(); + m_sampleIndexERP = size_t(m_erpFraction * float(m_nSample - 1)) % m_nSample; +} + +/* +bool IRenderer::render(const CRendererContext & ctx) +{ + ::glLineWidth(7); + ::glColor3f(1.f, 0.9f, 0.1f); + ::glDisable(GL_TEXTURE_1D); + ::glBegin(GL_LINES); + ::glVertex2f(0, 0); + ::glVertex2f(1, 1); + ::glVertex2f(0, 1); + ::glVertex2f(1, 0); + ::glEnd(); + ::glBegin(GL_LINE_LOOP); + ::glVertex2f(0, 0); + ::glVertex2f(0, 1); + ::glVertex2f(1, 1); + ::glVertex2f(1, 0); + ::glEnd(); +} +*/ + +void IRenderer::draw3DCoordinateSystem() + +{ + glPushAttrib(GL_ALL_ATTRIB_BITS); + glEnable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glDisable(GL_TEXTURE_1D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glLineWidth(2); + + glPushMatrix(); + glColor3f(.2F, .2F, .2F); + glScalef(.2F, .2F, .2F); + glBegin(GL_LINES); + for (int x = -10; x <= 10; ++x) + { + for (int z = -10; z <= 10; ++z) + { + if (x != 0) + { + glVertex3f(float(x), 0, 10.F); + glVertex3f(float(x), 0, -10.F); + } + if (z != 0) + { + glVertex3f(10.F, 0, float(z)); + glVertex3f(-10.F, 0, float(z)); + } + } + } + glEnd(); + glPopMatrix(); + + glBegin(GL_LINES); + glColor3f(0, 0, 1); + glVertex3f(0, 0, 2.F); + glVertex3f(0, 0, -3.F); + glColor3f(0, 1, 0); + glVertex3f(0, 1.25F, 0); + glVertex3f(0, -1.25F, 0); + glColor3f(1, 0, 0); + glVertex3f(2.F, 0, 0); + glVertex3f(-2.F, 0, 0); + glEnd(); + + glPopAttrib(); +} + +void IRenderer::draw2DCoordinateSystem() + +{ + glPushAttrib(GL_ALL_ATTRIB_BITS); + glEnable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glDisable(GL_TEXTURE_1D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glLineWidth(2); + + glPushMatrix(); + glColor3f(.2F, .2F, .2F); + glScalef(.2F, .2F, .2F); + glBegin(GL_LINES); + for (int x = -10; x <= 10; ++x) + { + for (int y = -10; y <= 10; ++y) + { + if (x != 0) + { + glVertex2f(float(x), 10.F); + glVertex2f(float(x), -10.F); + } + if (y != 0) + { + glVertex2f(10.F, float(y)); + glVertex2f(-10.F, float(y)); + } + } + } + glEnd(); + glPopMatrix(); + + glBegin(GL_LINES); + glColor3f(0, 1, 0); + glVertex2f(0, 2.0F); + glVertex2f(0, -2.0F); + glColor3f(1, 0, 0); + glVertex2f(2.F, 0); + glVertex2f(-2.F, 0); + glEnd(); + + glPopAttrib(); +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mTRendererStimulation.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mTRendererStimulation.hpp new file mode 100644 index 0000000..06999fc --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/mTRendererStimulation.hpp @@ -0,0 +1,194 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "mIRenderer.hpp" + +#include +#include +#include + +namespace OpenViBE { +namespace AdvancedVisualization { +static const int STIMULATION_INDICATOR_SMOOTHNESS = 10; +static const float STIMULATION_INDICATOR_RADIUS = 0.01F; +static const float STIMULATION_INDICATOR_SPACING = 0.03F; + +template +class TRendererStimulation : public T +{ +public: + std::vector> m_Circles; + std::map m_Stimulations; + + TRendererStimulation() + { + // Render a circle into a buffer so we don't have to do this each time + + for (int i = 0; i < STIMULATION_INDICATOR_SMOOTHNESS; ++i) + { + m_Circles.push_back(std::make_pair( + STIMULATION_INDICATOR_RADIUS * cosf(float(i) / float(STIMULATION_INDICATOR_SMOOTHNESS - 1) * 2 * float(M_PI)), + STIMULATION_INDICATOR_RADIUS * sinf(float(i) / float(STIMULATION_INDICATOR_SMOOTHNESS - 1) * 2 * float(M_PI)) + )); + } + } + + bool render(const CRendererContext& ctx) override + { + bool res = true; + + if (TPreRender) + { + glPushAttrib(GL_ALL_ATTRIB_BITS); + res = T::render(ctx); + glPopAttrib(); + } + + bool ok = true; + ok &= (IRenderer::getSampleCount() != 0); + ok &= (IRenderer::getHistoryCount() != 0); + ok &= (IRenderer::getHistoryIndex() != 0); + + if (ok) + { + glPushAttrib(GL_ALL_ATTRIB_BITS); + + const size_t nSample = IRenderer::getSampleCount(); + const size_t historyIndex = IRenderer::getHistoryIndex(); + const uint64_t sampleDuration = ctx.getSampleDuration(); + + glDisable(GL_TEXTURE_1D); + glDisable(GL_BLEND); + glDisable(GL_LINE_SMOOTH); + + const size_t leftIndex = historyIndex - historyIndex % nSample; + const size_t midIndex = historyIndex; + const double startTime = ((leftIndex * sampleDuration) >> 16) / 65536.; + const double midTime = ((midIndex * sampleDuration) >> 16) / 65536.; + const double duration = ((nSample * sampleDuration) >> 16) / 65536.; + + m_Stimulations.clear(); + for (const auto& stim : IRenderer::m_stimulationHistory) + { + if (m_Stimulations.count(stim.second) == 0) + { + // we store the "position" of the indicator for each new encountered stimulation + // if there are too many of them, we loop over to the beginning. + m_Stimulations[stim.second] = m_Stimulations.size() % int(1.0F / STIMULATION_INDICATOR_SPACING); + } + + if (midTime - duration < stim.first && stim.first < midTime) + { + float progress; + if (stim.first > startTime) { progress = float((stim.first - startTime) / duration); } + else { progress = float((stim.first + duration - startTime) / duration); } + + /* + ::glLineWidth(3); + ::glColor3f(0, 0, 0); + ::glBegin(GL_LINES); + ::glVertex2f(progress, 0); + ::glVertex2f(progress, 1); + ::glEnd(); + */ + + // draw a vertical line representing the stimulation + glLineWidth(1); + glColor3fv(getMarkerColor(stim.second)); + glBegin(GL_LINES); + glVertex2f(progress, 0); + glVertex2f(progress, 1); + glEnd(); + + + // draw a (ugly) disc representing a stimulation + glBegin(GL_TRIANGLE_FAN); + for (const auto& circle : m_Circles) + { + glVertex2f(float(circle.first / ctx.getAspect() + progress), + float(circle.second + 0.95F - m_Stimulations[stim.second] * STIMULATION_INDICATOR_SPACING)); + } + glEnd(); + + + // now draw + glLineWidth(2); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_LINE_SMOOTH); + glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + glBegin(GL_LINE_LOOP); + for (const auto& circle : m_Circles) + { + glVertex2f(float(circle.first / ctx.getAspect() + progress), + float(circle.second + 0.95F - m_Stimulations[stim.second] * STIMULATION_INDICATOR_SPACING)); + } + glEnd(); + glDisable(GL_LINE_SMOOTH); + + glDisable(GL_BLEND); + } + } + + glEnable(GL_LINE_SMOOTH); + glEnable(GL_BLEND); + glEnable(GL_TEXTURE_1D); + + glPopAttrib(); + } + + if (!TPreRender) + { + glPushAttrib(GL_ALL_ATTRIB_BITS); + res = T::render(ctx); + glPopAttrib(); + } + + return res && ok; + } + + float* getMarkerColor(const uint64_t id) + { + static float color[4]; + const float alpha = reverse<>(uint8_t(id & 255)) * 3.F / 255.F; + const auto alphai = int(alpha); + color[(alphai + 0) % 3] = 1 - alpha / 3.F; + color[(alphai + 1) % 3] = alpha / 3.F; + color[(alphai + 2) % 3] = 0; + color[3] = .75F; + return color; + } + + template + Tvector reverse(Tvector v) + { + Tvector res = 0; + for (Tvector i = 0; i < sizeof(Tvector) * 8; ++i) + { + res <<= 1; + res |= ((v & (1 << i)) ? 1 : 0); + } + return res; + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/m_RendererTools.hpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/m_RendererTools.hpp new file mode 100644 index 0000000..cd566ca --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/src/m_RendererTools.hpp @@ -0,0 +1,58 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +inline void cube(const float size = 1) +{ + glBegin(GL_QUADS); + + glVertex3f(size, -size, size); + glVertex3f(size, size, size); + glVertex3f(size, size, -size); + glVertex3f(size, -size, -size); + + glVertex3f(-size, -size, size); + glVertex3f(-size, -size, -size); + glVertex3f(-size, size, -size); + glVertex3f(-size, size, size); + + glVertex3f(-size, size, size); + glVertex3f(size, size, size); + glVertex3f(size, size, -size); + glVertex3f(-size, size, -size); + + glVertex3f(-size, -size, size); + glVertex3f(-size, -size, -size); + glVertex3f(size, -size, -size); + glVertex3f(size, -size, size); + + glVertex3f(-size, size, size); + glVertex3f(-size, -size, size); + glVertex3f(size, -size, size); + glVertex3f(size, size, size); + + glVertex3f(-size, size, -size); + glVertex3f(-size, -size, -size); + glVertex3f(size, -size, -size); + glVertex3f(size, size, -size); + + glEnd(); +} diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/test/CMakeLists.txt b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/test/CMakeLists.txt new file mode 100644 index 0000000..0adec65 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/test/CMakeLists.txt @@ -0,0 +1 @@ +OV_ADD_PROJECTS("LIBRARIES_LIB-ADVANCED-VISUALIZATION_TEST") diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/test/renderer/CMakeLists.txt b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/test/renderer/CMakeLists.txt new file mode 100644 index 0000000..132db98 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/test/renderer/CMakeLists.txt @@ -0,0 +1,12 @@ +PROJECT(openvibe-lib-adv-viz-test-renderer) +MESSAGE(STATUS "Now building ${PROJECT_NAME} ${PROJECT_VERSION} (${PROJECT_BRANCH}/${PROJECT_COMMITHASH})" ) + +ADD_EXECUTABLE(${PROJECT_NAME} main_test_renderer.cpp) + +INCLUDE("FindLibMensiaAdvancedVisualisation") +INCLUDE("FindThirdPartyOpenGL") + +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}) diff --git a/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/test/renderer/main_test_renderer.cpp b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/test/renderer/main_test_renderer.cpp new file mode 100644 index 0000000..5565d11 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/libraries/lib-advanced-visualization/test/renderer/main_test_renderer.cpp @@ -0,0 +1,18 @@ +#include + +namespace OAV = OpenViBE::AdvancedVisualization; + +int main() +{ + OAV::CRendererContext context; + context.clear(); + + context.setDataType(OAV::CRendererContext::EDataType::Matrix); + + OAV::IRenderer* rend = OAV::IRenderer::create(OAV::ERendererType::Bitmap, false); + + rend->setChannelCount(10); + auto* tmp = new float[666]; + rend->feed(tmp); + rend->refresh(context); +} diff --git a/Masterarbeit/openvibe/designer-master/plugins/CMakeLists.txt b/Masterarbeit/openvibe/designer-master/plugins/CMakeLists.txt new file mode 100644 index 0000000..63294b2 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/CMakeLists.txt @@ -0,0 +1 @@ +OV_ADD_PROJECTS("PLUGINS") diff --git a/Masterarbeit/openvibe/designer-master/plugins/examples/CMakeLists.txt b/Masterarbeit/openvibe/designer-master/plugins/examples/CMakeLists.txt new file mode 100755 index 0000000..e25cede --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/examples/CMakeLists.txt @@ -0,0 +1,30 @@ +PROJECT(openvibe-plugins-designer-examples) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +SET(INCLUDED_OV_SDK_COMPONENTS MAIN COMMON TOOLKIT EBML SYSTEM XML) +INCLUDE("AddOpenViBESDKComponents") +INCLUDE("FindOpenViBEVisualizationToolkit") +INCLUDE("FindThirdPartyGTK") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) diff --git a/Masterarbeit/openvibe/designer-master/plugins/examples/box-tutorials/modifiable-settings.xml b/Masterarbeit/openvibe/designer-master/plugins/examples/box-tutorials/modifiable-settings.xml new file mode 100644 index 0000000..ea3ba78 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/examples/box-tutorials/modifiable-settings.xml @@ -0,0 +1,174 @@ + + 1 + openvibe + 2.0 + + + (0x00002e59, 0x00005225) + Modifiable Settings example + (0x4ab0dd05, 0x32155d41) + + + (0x007deef9, 0x2f3e95c6) + Int + 1 + 1 + true + + + (0x512a166f, 0x5c3ef83f) + Float + 1.3 + 1.3 + true + + + (0x2cdb2f0b, 0x12f231ea) + Bool + false + false + true + + + (0x79a9edeb, 0x245d83fc) + String + string + string + true + + + (0x330306dd, 0x74a95f98) + filename + somefile.txt + somefile.txt + true + + + (0xb0d0db45, 0x49cbc34a) + script + somescript.lua + somescript.lua + true + + + (0x7f45a2a9, 0x7db12219) + color + 20,65,90 + 20,65,90 + true + + + (0x3d3c7c7f, 0xef0e7129) + colorgradient + 0:0,0,0; 100:60,40,40 + 0:0,0,0; 100:60,40,40 + true + + + (0x2f3563a4, 0x571e194d) + unit + V + V + true + + + (0x501f79fa, 0x7e1f6680) + factor + 1e-01 + 1e-01 + true + + + + + (0x1fa7a38f, 0x54edbe0b) + 144.000000 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 432.000000 + + + (0x4e7b798a, 0x183beafb) + (0x905adcea, 0xd88c907d) + + + (0xad100179, 0xa3c984ab) + 222 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 10 + + + + + + + + (0x00004034, 0x00002caa) + This box has a setting of each type and each is + marked as a modifiable parameter. It means + that during run, a widget will appear where + you can modify the value of these settings. As +you do that, you will notice that the +values displayed in the log (every 5 seconds) +chanfes accordingly. + + + (0x473d9a43, 0x97fc0a97) + 112 + + + (0x7234b86b, 0x2b8651a5) + 144 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":477,"identifier":"(0x00002cca, 0x000017dc)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":614},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00002075, 0x000044ac)","index":0,"name":"config","parentIdentifier":"(0x00002cca, 0x000017dc)","type":2},{"boxIdentifier":"(0x00002e59, 0x00005225)","childCount":0,"identifier":"(0x0000463a, 0x00002105)","index":0,"parentIdentifier":"(0x00002075, 0x000044ac)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Loic Mahe + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Modifiable Settings example + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/modifiable-box-settings/ + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/examples/doc/Doc_BoxAlgorithm_ModifiableSettings.dox-part b/Masterarbeit/openvibe/designer-master/plugins/examples/doc/Doc_BoxAlgorithm_ModifiableSettings.dox-part new file mode 100755 index 0000000..8a5610c --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/examples/doc/Doc_BoxAlgorithm_ModifiableSettings.dox-part @@ -0,0 +1,67 @@ +/** + * \page BoxAlgorithm_ModifiableSettings Modifiable Settings +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ModifiableSettings_Description| +This box purpose is to test and demonstrate the modifiable settings feature. +It has a setting of each type and all are modifiable during scenario playback. +Values are displayed in log (LogLevel_Info) every 5 seconds. + * |OVP_DocEnd_BoxAlgorithm_ModifiableSettings_Description| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ModifiableSettings_Settings| + * |OVP_DocEnd_BoxAlgorithm_ModifiableSettings_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ModifiableSettings_Setting1| +An integer. + * |OVP_DocEnd_BoxAlgorithm_ModifiableSettings_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_ModifiableSettings_Setting2| +A float. + * |OVP_DocEnd_BoxAlgorithm_ModifiableSettings_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_ModifiableSettings_Setting3| +A boolean. + * |OVP_DocEnd_BoxAlgorithm_ModifiableSettings_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_ModifiableSettings_Setting4| +A string. + * |OVP_DocEnd_BoxAlgorithm_ModifiableSettings_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_ModifiableSettings_Setting5| +A filename. + * |OVP_DocEnd_BoxAlgorithm_ModifiableSettings_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_ModifiableSettings_Setting6| +A script. + * |OVP_DocEnd_BoxAlgorithm_ModifiableSettings_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_ModifiableSettings_Setting7| +A color. + * |OVP_DocEnd_BoxAlgorithm_ModifiableSettings_Setting7| + + * |OVP_DocBegin_BoxAlgorithm_ModifiableSettings_Setting8| +A color gradient. + * |OVP_DocEnd_BoxAlgorithm_ModifiableSettings_Setting8| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ModifiableSettings_Examples| + * |OVP_DocEnd_BoxAlgorithm_ModifiableSettings_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ModifiableSettings_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_ModifiableSettings_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/examples/doc/boxes/Doc_BoxAlgorithm_ModifiableSettingsExample.rst b/Masterarbeit/openvibe/designer-master/plugins/examples/doc/boxes/Doc_BoxAlgorithm_ModifiableSettingsExample.rst new file mode 100644 index 0000000..d56e2e2 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/examples/doc/boxes/Doc_BoxAlgorithm_ModifiableSettingsExample.rst @@ -0,0 +1,135 @@ +.. _Doc_BoxAlgorithm_ModifiableSettingsExample: + +Modifiable Settings example +=========================== + + +.. todo:: Write general box description... + + +.. _Doc_BoxAlgorithm_ModifiableSettingsExample_Settings: + +Settings +-------- + +.. todo:: Write settings general description... + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Int", "Integer", "1" + "Float", "Float", "1.3" + "Bool", "Boolean", "false" + "String", "String", "string" + "filename", "Filename", "somefile.txt" + "script", "Script", "somescript.lua" + "color", "", "20,65,90" + "colorgradient", "", "0:0,0,0; 100:60,40,40" + "unit", "Measurement unit", "V" + "factor", "Factor", "1e-01" + +.. _Doc_BoxAlgorithm_ModifiableSettingsExample_Setting_1: + +Int +~~~ + +.. todo:: Write setting description... + + + +.. _Doc_BoxAlgorithm_ModifiableSettingsExample_Setting_2: + +Float +~~~~~ + +.. todo:: Write setting description... + + + +.. _Doc_BoxAlgorithm_ModifiableSettingsExample_Setting_3: + +Bool +~~~~ + +.. todo:: Write setting description... + + + +.. _Doc_BoxAlgorithm_ModifiableSettingsExample_Setting_4: + +String +~~~~~~ + +.. todo:: Write setting description... + + + +.. _Doc_BoxAlgorithm_ModifiableSettingsExample_Setting_5: + +filename +~~~~~~~~ + +.. todo:: Write setting description... + + + +.. _Doc_BoxAlgorithm_ModifiableSettingsExample_Setting_6: + +script +~~~~~~ + +.. todo:: Write setting description... + + + +.. _Doc_BoxAlgorithm_ModifiableSettingsExample_Setting_7: + +color +~~~~~ + +.. todo:: Write setting description... + + + +.. _Doc_BoxAlgorithm_ModifiableSettingsExample_Setting_8: + +colorgradient +~~~~~~~~~~~~~ + +.. todo:: Write setting description... + + + +.. _Doc_BoxAlgorithm_ModifiableSettingsExample_Setting_9: + +unit +~~~~ + +.. todo:: Write setting description... + + + +.. _Doc_BoxAlgorithm_ModifiableSettingsExample_Setting_10: + +factor +~~~~~~ + +.. todo:: Write setting description... + + +.. _Doc_BoxAlgorithm_ModifiableSettingsExample_Examples: + +Examples +-------- + +.. todo:: Write example of use... + + +.. _Doc_BoxAlgorithm_ModifiableSettingsExample_Miscellaneous: + +Miscellaneous +------------- + +.. todo:: Write any miscellaneous information... + + diff --git a/Masterarbeit/openvibe/designer-master/plugins/examples/src/box-algorithms/ovpCBoxAlgorithmModifiableSettings.cpp b/Masterarbeit/openvibe/designer-master/plugins/examples/src/box-algorithms/ovpCBoxAlgorithmModifiableSettings.cpp new file mode 100755 index 0000000..ae8d19c --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/examples/src/box-algorithms/ovpCBoxAlgorithmModifiableSettings.cpp @@ -0,0 +1,35 @@ +#include "ovpCBoxAlgorithmModifiableSettings.h" + +namespace OpenViBE { +namespace Plugins { +namespace Examples { +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmModifiableSettings::processClock(Kernel::CMessageClock& /*msg*/) +{ + updateSettings(); + //print settings values + for (size_t i = 0; i < m_SettingsValue.size(); ++i) + { + this->getLogManager() << Kernel::LogLevel_Info << "Setting " << i << " value is " << m_SettingsValue[i] << "\n"; + } + this->getLogManager() << Kernel::LogLevel_Info << "\n"; + + return true; +} + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmModifiableSettings::updateSettings() +{ + m_SettingsValue.clear(); + const size_t nSetting = this->getStaticBoxContext().getSettingCount(); + for (size_t i = 0; i < nSetting; ++i) + { + CString value = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i); + m_SettingsValue.push_back(value); + } + return true; +} + +} // namespace Examples +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/examples/src/box-algorithms/ovpCBoxAlgorithmModifiableSettings.h b/Masterarbeit/openvibe/designer-master/plugins/examples/src/box-algorithms/ovpCBoxAlgorithmModifiableSettings.h new file mode 100755 index 0000000..859a45d --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/examples/src/box-algorithms/ovpCBoxAlgorithmModifiableSettings.h @@ -0,0 +1,99 @@ +#pragma once + +#include "../ovp_defines.h" + +#include +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Examples { +/** + * \class CBoxAlgorithmModifiableSettings + * \author lmahe (Inria) + * \date Mon Oct 14 16:35:48 2013 + * \brief The class CBoxAlgorithmModifiableSettings describes the box ModifiableSettings. + * + */ +class CBoxAlgorithmModifiableSettings final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override { return true; } + bool uninitialize() override { return true; } + bool processClock(Kernel::CMessageClock& msg) override; + uint64_t getClockFrequency() override { return 0x1ULL << 30; } // 4Hz + + bool process() override { return true; } + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_ModifiableSettings) + +protected: + bool updateSettings(); + + std::vector m_SettingsValue; +}; + +/** + * \class CBoxAlgorithmModifiableSettingsDesc + * \author lmahe (Inria) + * \date Mon Oct 14 16:35:48 2013 + * \brief Descriptor of the box ModifiableSettings. + * + */ +class CBoxAlgorithmModifiableSettingsDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Modifiable Settings example"); } + CString getAuthorName() const override { return CString("lmahe"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + + CString getShortDescription() const override + { + return CString("Settings of this box are modifiable during playback. Values are displayed in log every 5 seconds"); + } + + CString getDetailedDescription() const override + { + return CString( + "This box purpose is to test and demonstrate the modifiable settings feature.\n It has a setting of each type and all are modifiable during scenario playback.\n"); + } + + CString getCategory() const override { return CString("Examples/Basic"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString(""); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ModifiableSettings; } + IPluginObject* create() override { return new CBoxAlgorithmModifiableSettings; } + + bool hasFunctionality(const EPluginFunctionality functionality) const override { return functionality == EPluginFunctionality::Visualization; } + + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("Int", OV_TypeId_Integer, "1", true); + prototype.addSetting("Float", OV_TypeId_Float, "1.3", true); + prototype.addSetting("Bool", OV_TypeId_Boolean, "false", true); + prototype.addSetting("String", OV_TypeId_String, "string", true); + prototype.addSetting("filename", OV_TypeId_Filename, "somefile.txt", true); + prototype.addSetting("script", OV_TypeId_Script, "somescript.lua", true); + prototype.addSetting("color", OV_TypeId_Color, "20,65,90", true); + prototype.addSetting("colorgradient", OV_TypeId_ColorGradient, "0:0,0,0; 100:60,40,40", true); + prototype.addSetting("unit", OV_TypeId_MeasurementUnit, "V", true); + prototype.addSetting("factor", OV_TypeId_Factor, "1e-01", true); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ModifiableSettingsDesc) +}; +} // namespace Examples +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/examples/src/ovp_defines.h b/Masterarbeit/openvibe/designer-master/plugins/examples/src/ovp_defines.h new file mode 100755 index 0000000..b599b90 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/examples/src/ovp_defines.h @@ -0,0 +1,14 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_ModifiableSettings OpenViBE::CIdentifier(0x4AB0DD05, 0x32155D41) +#define OVP_ClassId_BoxAlgorithm_ModifiableSettingsDesc OpenViBE::CIdentifier(0x3808515D, 0x97C7F9B6) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) diff --git a/Masterarbeit/openvibe/designer-master/plugins/examples/src/ovp_main.cpp b/Masterarbeit/openvibe/designer-master/plugins/examples/src/ovp_main.cpp new file mode 100755 index 0000000..73ea4b7 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/examples/src/ovp_main.cpp @@ -0,0 +1,10 @@ +#include "ovp_defines.h" + +#include "box-algorithms/ovpCBoxAlgorithmModifiableSettings.h" + +OVP_Declare_Begin() + context.getTypeManager().registerEnumerationEntry(OV_TypeId_BoxAlgorithmFlag, OV_AttributeId_Box_FlagIsUnstable.toString(), + OV_AttributeId_Box_FlagIsUnstable.id()); + + OVP_Declare_New(OpenViBE::Plugins::Examples::CBoxAlgorithmModifiableSettingsDesc); +OVP_Declare_End() diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/CMakeLists.txt b/Masterarbeit/openvibe/designer-master/plugins/visualization/CMakeLists.txt new file mode 100644 index 0000000..e3d1911 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/CMakeLists.txt @@ -0,0 +1 @@ +OV_ADD_PROJECTS("PLUGINS_VISUALIZATION") diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/CMakeLists.txt b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/CMakeLists.txt new file mode 100644 index 0000000..407cf28 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/CMakeLists.txt @@ -0,0 +1,46 @@ +PROJECT(openvibe-plugins-designer-advanced-visualization) +SET(PROJECT_PRODUCT_NAME "Mensia Advanced Visualization Toolset") +MESSAGE(STATUS "Now building ${PROJECT_NAME} ${PROJECT_VERSION} (${OV_PROJECT_BRANCH}~${OV_PROJECT_COMMITHASH})" ) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl include/*.h include/*.hpp) + +INCLUDE("FindSourceRCProperties") + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${RLM_LIB_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +IF(MENSIA_ADVANCED_VISUALIZATION_EXPERIMENTAL) + MESSAGE(STATUS " MENSIA_ADVANCED_VISUALIZATION_EXPERIMENTAL is set, experimental visualization will be built.") + ADD_DEFINITIONS(-DTARGET_Has_Experimental) +ENDIF() + +INCLUDE("AddOpenViBESDKComponents") +INCLUDE("FindOpenViBEVisualizationToolkit") +INCLUDE("FindThirdPartyGTK") + +INCLUDE("FindLibMensiaAdvancedVisualisation") +INCLUDE("FindThirdPartyOpenGL") + +INCLUDE("GenerateDocumentation") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/plugins) +INSTALL(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials/advanced-visualization) diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/2DTopography.mxs b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/2DTopography.mxs new file mode 100644 index 0000000..df90768 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/2DTopography.mxs @@ -0,0 +1,771 @@ + + 1 + OpenVIBE + 0.0.0 + + + (0x0000138a, 0x0000295a) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000015e3, 0x000042e6) + 2D Topography + (0x7c3a05b8, 0xc45386f8) + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.02 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xa291db4a, 0x5f4fcbfc) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 123 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003b97, 0x00004028) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 177 + + + + + (0x000045c5, 0x00003961) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Moving epoch average (Immediate) + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000520b, 0x000068f6) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -64 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 74 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005e76, 0x0000282e) + 8-15 Hz + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000069d0, 0x00007ac3) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000d6a, 0x000040a6) + + (0x000069d0, 0x00007ac3) + 0 + + + (0x000045c5, 0x00003961) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 19 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 40 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00001d11, 0x00002529) + + (0x0000138a, 0x0000295a) + 0 + + + (0x00005e76, 0x0000282e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -205 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -168 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00003f0b, 0x00003088) + + (0x00003b97, 0x00004028) + 0 + + + (0x0000138a, 0x0000295a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -279 + + + (0x358ae8b5, 0x0f8bacd1) + 120 + + + (0x3f0a3b27, 0x570913d2) + -241 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00003f97, 0x0000658d) + + (0x00005e76, 0x0000282e) + 0 + + + (0x0000520b, 0x000068f6) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -119 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -94 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x000075c1, 0x0000468d) + + (0x0000520b, 0x000068f6) + 0 + + + (0x000069d0, 0x00007ac3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -32 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -17 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00007c6b, 0x00002226) + + (0x000045c5, 0x00003961) + 0 + + + (0x000015e3, 0x000042e6) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 89 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 136 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + + + (0x00000940, 0x00007015) + <b>Epoch Average</b> +Moving average over the last 32 epochs + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 64 + + + + + (0x00001049, 0x0000086b) + <b>Advanced Visualization</b>: +<i>2D Topography</i> + +Maps the alpha power onto a 2D model of the scalp + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 160 + + + + + (0x00002668, 0x000078d5) + <b>Temporal Filter</b> +Filter in the alpha band + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -144 + + + + + (0x00004e08, 0x00007a62) + <b>File Reader</b> +10 (+1 ref) channels, 512 Hz, 32 samples per block +Hand Motor Imagery session + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -304 + + + + + (0x000053b1, 0x0000293c) + <b>Band Power</b> +Average of the squared signal +on blocks of 32 samples + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -48 + + + + + (0x00006fc9, 0x00005cce) + <b>Reference Channel</b> +The reference channel is 'Nz' + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -224 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x000015e3, 0x000042e6)","childCount":0,"identifier":"(0x000017ea, 0x000031ee)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00005815, 0x0000441d)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004d9a, 0x00003295)","index":0,"name":"Default tab","parentIdentifier":"(0x00005815, 0x0000441d)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000000c1, 0x00005a9b)","index":0,"name":"Empty","parentIdentifier":"(0x00004d9a, 0x00003295)","type":0}] + + + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/3DCubes.mxs b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/3DCubes.mxs new file mode 100644 index 0000000..844be88 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/3DCubes.mxs @@ -0,0 +1,778 @@ + + 1 + OpenVIBE + 0.0.0 + + + (0x000001e1, 0x00001031) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Moving epoch average (Immediate) + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000390, 0x00002a39) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 74 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000728, 0x000051d2) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 177 + + + + + (0x0000512d, 0x00000e9f) + 3D Cubes + (0xe028305d, 0x4acf9d1a) + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.25 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + 0:100,100,100; 49:100,100,100; 50:0,0,100; 75:0,83,4; 100:100,1,0 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xa291db4a, 0x5f4fcbfc) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 81 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005c5e, 0x00006d4f) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006ea1, 0x00004c67) + 8-15 Hz + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -176 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000079d1, 0x00004e56) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000878, 0x000036c3) + + (0x000079d1, 0x00004e56) + 0 + + + (0x00006ea1, 0x00004c67) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -237 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -200 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x0000098c, 0x000077f5) + + (0x000001e1, 0x00001031) + 0 + + + (0x0000512d, 0x00000e9f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 57 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 104 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00001289, 0x000050aa) + + (0x00005c5e, 0x00006d4f) + 0 + + + (0x000001e1, 0x00001031) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -13 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 8 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00003382, 0x0000207a) + + (0x00006ea1, 0x00004c67) + 0 + + + (0x00000390, 0x00002a39) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -151 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -126 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00004963, 0x000026b2) + + (0x00000728, 0x000051d2) + 0 + + + (0x000079d1, 0x00004e56) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -311 + + + (0x358ae8b5, 0x0f8bacd1) + 120 + + + (0x3f0a3b27, 0x570913d2) + -273 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x0000662a, 0x00007347) + + (0x00000390, 0x00002a39) + 0 + + + (0x00005c5e, 0x00006d4f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -64 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -49 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + + + (0x0000159f, 0x00004fe3) + <b>Reference Channel</b> +The reference channel is 'Nz' + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -256 + + + + + (0x00001bd9, 0x00000872) + <b>Advanced Visualization</b>: +<i>3D Cube</i> + +The Alpha power of each channel is represented +as a cube, whose size and color depends on the value. +Note that this pipeline only produce positive values, +thus only the [50-100%] part of the gradient will be used. + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 144 + + + + + (0x00002ba5, 0x000028e3) + <b>File Reader</b> +10 (+1 ref) channels, 512 Hz, 32 samples per block +Hand Motor Imagery session + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -336 + + + + + (0x00002f0c, 0x0000549c) + <b>Band Power</b> +Average of the squared signal +on blocks of 32 samples + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -80 + + + + + (0x00004365, 0x00004e39) + <b>Epoch Average</b> +Moving average over the last 32 epochs + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + (0x00005a9c, 0x00004eff) + <b>Temporal Filter</b> +Filter in the alpha band + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -176 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x0000512d, 0x00000e9f)","childCount":0,"identifier":"(0x0000239e, 0x00000b54)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x000027da, 0x00000e29)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000676d, 0x0000113e)","index":0,"name":"Default tab","parentIdentifier":"(0x000027da, 0x00000e29)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00002462, 0x000064e0)","index":0,"name":"Empty","parentIdentifier":"(0x0000676d, 0x0000113e)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/3DTopography.mxs b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/3DTopography.mxs new file mode 100644 index 0000000..4cfa6f6 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/3DTopography.mxs @@ -0,0 +1,797 @@ + + 1 + OpenVIBE + 0.0.0 + + + (0x00002f34, 0x00005835) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Moving epoch average (Immediate) + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000031ec, 0x00001a4b) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -368 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 177 + + + + + (0x0000324d, 0x0000433b) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 74 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000050d9, 0x00004e88) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -288 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000643d, 0x0000110a) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + -64 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000659d, 0x000029b3) + 8-15 Hz + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -208 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007ada, 0x00004ca9) + 3D Topography + (0xc709ea84, 0xb577d910) + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.025 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xa291db4a, 0x5f4fcbfc) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 123 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000f29, 0x00003a6f) + + (0x0000643d, 0x0000110a) + 0 + + + (0x00002f34, 0x00005835) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -45 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -24 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00001744, 0x00006eca) + + (0x000050d9, 0x00004e88) + 0 + + + (0x0000659d, 0x000029b3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -269 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -232 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00001801, 0x000039ce) + + (0x000031ec, 0x00001a4b) + 0 + + + (0x000050d9, 0x00004e88) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -343 + + + (0x358ae8b5, 0x0f8bacd1) + 120 + + + (0x3f0a3b27, 0x570913d2) + -305 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00002294, 0x00003fe3) + + (0x0000324d, 0x0000433b) + 0 + + + (0x0000643d, 0x0000110a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -96 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -81 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00002e55, 0x000024a9) + + (0x0000659d, 0x000029b3) + 0 + + + (0x0000324d, 0x0000433b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -183 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -158 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00004d5d, 0x00007851) + + (0x00002f34, 0x00005835) + 0 + + + (0x00007ada, 0x00004ca9) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 25 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 88 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + + + (0x00000386, 0x0000356c) + <b>Epoch Average</b> +Moving average over the last 32 epochs + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 0 + + + + + (0x00000998, 0x000034ad) + <b>File Reader</b> +10 (+1 ref) channels, 512 Hz, 32 samples per block +Hand Motor Imagery session + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -368 + + + + + (0x000018bf, 0x00006660) + <b>Advanced Visualization</b>: +<i>3D Topography</i> + +Maps the alpha power onto a 3D model of the scalp + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 112 + + + + + (0x0000584e, 0x00004a1d) + <b>Reference Channel</b> +The reference channel is 'Nz' + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -288 + + + + + (0x000070b7, 0x0000528d) + <b>Band Power</b> +Average of the squared signal +on blocks of 32 samples + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -112 + + + + + (0x00007654, 0x00002555) + <b>Temporal Filter</b> +Filter in the alpha band + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -208 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x000060e0, 0x00003dd1)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0x00007ada, 0x00004ca9)","childCount":0,"identifier":"(0x000064a2, 0x00001ff6)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000648f, 0x00006132)","index":0,"name":"Default tab","parentIdentifier":"(0x000060e0, 0x00003dd1)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000416e, 0x00003e00)","index":0,"name":"Empty","parentIdentifier":"(0x0000648f, 0x00006132)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/ContinuousBars.mxs b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/ContinuousBars.mxs new file mode 100644 index 0000000..dcbcdd5 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/ContinuousBars.mxs @@ -0,0 +1,1174 @@ + + 1 + OpenVIBE + 0.0.0 + + + (0x000002a9, 0x00006ff5) + C3 - C4 + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + A-B + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -208 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 74 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001e77, 0x000048f3) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -352 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005023, 0x0000452f) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000502d, 0x00000bcd) + C3 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + C3 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -288 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 32 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 106 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005759, 0x0000149f) + C4 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + C4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -288 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 160 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 106 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005dc0, 0x00000407) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 74 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006a6f, 0x0000454f) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Moving epoch average (Immediate) + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 16 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006df1, 0x00001629) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -400 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 177 + + + + + (0x00007557, 0x000047cd) + 8-15 Hz + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000782a, 0x0000798f) + Continuous Bars + (0x24510f3e, 0xfcbe83a2) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + true + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.05 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Tranlucency + 1 + 1 + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x4e7b798a, 0x183beafb) + (0x6640d485, 0xe92d22ae) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 130 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + + + (0x0000024b, 0x00005f8e) + + (0x00007557, 0x000047cd) + 0 + + + (0x00005dc0, 0x00000407) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -103 + + + (0x358ae8b5, 0x0f8bacd1) + 96 + + + (0x3f0a3b27, 0x570913d2) + -78 + + + (0x6267b5c5, 0x676e3e42) + 96 + + + + + (0x00000416, 0x00002dcc) + + (0x00001e77, 0x000048f3) + 0 + + + (0x0000502d, 0x00000bcd) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -333 + + + (0x358ae8b5, 0x0f8bacd1) + 96 + + + (0x3f0a3b27, 0x570913d2) + -318 + + + (0x6267b5c5, 0x676e3e42) + 32 + + + + + (0x00002d7c, 0x00000a1a) + + (0x00001e77, 0x000048f3) + 0 + + + (0x00005759, 0x0000149f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -333 + + + (0x358ae8b5, 0x0f8bacd1) + 96 + + + (0x3f0a3b27, 0x570913d2) + -318 + + + (0x6267b5c5, 0x676e3e42) + 160 + + + + + (0x0000358b, 0x000066b2) + + (0x00005023, 0x0000452f) + 0 + + + (0x00006a6f, 0x0000454f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 35 + + + (0x358ae8b5, 0x0f8bacd1) + 96 + + + (0x3f0a3b27, 0x570913d2) + 56 + + + (0x6267b5c5, 0x676e3e42) + 96 + + + + + (0x00003e07, 0x00002b5e) + + (0x00005759, 0x0000149f) + 0 + + + (0x000002a9, 0x00006ff5) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -256 + + + (0x358ae8b5, 0x0f8bacd1) + 160 + + + (0x3f0a3b27, 0x570913d2) + -238 + + + (0x6267b5c5, 0x676e3e42) + 103 + + + + + (0x0000583a, 0x00007a8a) + + (0x000002a9, 0x00006ff5) + 0 + + + (0x00007557, 0x000047cd) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -176 + + + (0x358ae8b5, 0x0f8bacd1) + 96 + + + (0x3f0a3b27, 0x570913d2) + -152 + + + (0x6267b5c5, 0x676e3e42) + 96 + + + + + (0x00005cda, 0x00004e4a) + + (0x00006a6f, 0x0000454f) + 0 + + + (0x0000782a, 0x0000798f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 105 + + + (0x358ae8b5, 0x0f8bacd1) + 96 + + + (0x3f0a3b27, 0x570913d2) + 136 + + + (0x6267b5c5, 0x676e3e42) + 88 + + + + + (0x000065d9, 0x00005746) + + (0x00005dc0, 0x00000407) + 0 + + + (0x00005023, 0x0000452f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -16 + + + (0x358ae8b5, 0x0f8bacd1) + 96 + + + (0x3f0a3b27, 0x570913d2) + -1 + + + (0x6267b5c5, 0x676e3e42) + 96 + + + + + (0x0000758d, 0x000009dd) + + (0x0000502d, 0x00000bcd) + 0 + + + (0x000002a9, 0x00006ff5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -256 + + + (0x358ae8b5, 0x0f8bacd1) + 32 + + + (0x3f0a3b27, 0x570913d2) + -238 + + + (0x6267b5c5, 0x676e3e42) + 88 + + + + + (0x00007bf0, 0x00006445) + + (0x00006df1, 0x00001629) + 0 + + + (0x00001e77, 0x000048f3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -375 + + + (0x358ae8b5, 0x0f8bacd1) + 88 + + + (0x3f0a3b27, 0x570913d2) + -369 + + + (0x6267b5c5, 0x676e3e42) + 96 + + + + + + + (0x000000dc, 0x000030fa) + <b>Advanced Visualization</b>: +<i>Continuous Bars</i> + +Displays the alpha band power level continuously +in form of a colored vertical bar series. + +The power being a positive value, we ticked the +corresponding box in the settings. + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 176 + + + + + (0x000012c7, 0x00007d24) + <b>Bipolar</b> +We compute the bipolar channel C3 - C4 + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -288 + + + + + (0x000023b6, 0x0000636d) + <b>Band Power</b> +Average of the squared signal +on blocks of 32 samples + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -48 + + + + + (0x000038f6, 0x00002507) + <b>Epoch Average</b> +Moving average over the last 32 epochs + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 48 + + + + + (0x00005ab9, 0x00004c29) + <b>File Reader</b> +10 (+1 ref) channels, 512 Hz, 32 samples per block +Hand Motor Imagery session + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + (0x00007fb1, 0x00004f4a) + <b>Temporal Filter</b> +Filter in the alpha band + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -160 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000758f, 0x000051f9)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0x0000782a, 0x0000798f)","childCount":0,"identifier":"(0x00007b48, 0x000020a7)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006cc6, 0x000007f0)","index":0,"name":"Default tab","parentIdentifier":"(0x0000758f, 0x000051f9)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000040b7, 0x000050c4)","index":0,"name":"Empty","parentIdentifier":"(0x00006cc6, 0x000007f0)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/ContinuousBitmap.mxs b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/ContinuousBitmap.mxs new file mode 100644 index 0000000..538aad5 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/ContinuousBitmap.mxs @@ -0,0 +1,801 @@ + + 1 + OpenVIBE + 0.0.0 + + + (0x0000008b, 0x00001edb) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Moving epoch average (Immediate) + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001776, 0x0000585d) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 177 + + + + + (0x00004b05, 0x000011ad) + 8-15 Hz + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -176 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004e05, 0x0000586f) + Continuous Bitmap + (0x9e1cd345, 0x86569e7e) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.025 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xafb1edd5, 0x68e1da05) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 150 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000055e0, 0x00003156) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000061f6, 0x00002e0c) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 74 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007f9e, 0x00001eaa) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000c8f, 0x00003006) + + (0x000061f6, 0x00002e0c) + 0 + + + (0x000055e0, 0x00003156) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -64 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -49 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00001971, 0x0000660f) + + (0x00007f9e, 0x00001eaa) + 0 + + + (0x00004b05, 0x000011ad) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -237 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -200 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00002e24, 0x00000cb9) + + (0x000055e0, 0x00003156) + 0 + + + (0x0000008b, 0x00001edb) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -13 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 8 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00003dba, 0x000005a9) + + (0x00004b05, 0x000011ad) + 0 + + + (0x000061f6, 0x00002e0c) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -151 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -126 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00004841, 0x000069b9) + + (0x00001776, 0x0000585d) + 0 + + + (0x00007f9e, 0x00001eaa) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -311 + + + (0x358ae8b5, 0x0f8bacd1) + 120 + + + (0x3f0a3b27, 0x570913d2) + -273 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00006e4b, 0x00005afb) + + (0x0000008b, 0x00001edb) + 0 + + + (0x00004e05, 0x0000586f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 57 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 104 + + + (0x6267b5c5, 0x676e3e42) + 120 + + + + + + + (0x00000ee7, 0x0000520b) + <b>Band Power</b> +Average of the squared signal +on blocks of 32 samples + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -80 + + + + + (0x00003ad7, 0x000056c4) + <b>Reference Channel</b> +The reference channel is 'Nz' + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -256 + + + + + (0x00004e62, 0x0000498c) + <b>Advanced Visualization</b>: +<i>Continuous Bitmap</i> + +Displays the alpha power of every channel +in form of a color map. + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 128 + + + + + (0x00005de9, 0x00005fa6) + <b>Temporal Filter</b> +Filter in the alpha band + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -176 + + + + + (0x000067c5, 0x00002f33) + <b>Epoch Average</b> +Moving average over the last 32 epochs + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + (0x00006d4e, 0x00002280) + <b>File Reader</b> +10 (+1 ref) channels, 512 Hz, 32 samples per block +Hand Motor Imagery session + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -336 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00004e05, 0x0000586f)","childCount":0,"identifier":"(0x000047f2, 0x00003fd2)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00007ca3, 0x000020f5)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00005798, 0x00000046)","index":0,"name":"Default tab","parentIdentifier":"(0x00007ca3, 0x000020f5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00002baf, 0x000018c9)","index":0,"name":"Empty","parentIdentifier":"(0x00005798, 0x00000046)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/ContinuousMultiOscilloscope.mxs b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/ContinuousMultiOscilloscope.mxs new file mode 100644 index 0000000..93d71ba --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/ContinuousMultiOscilloscope.mxs @@ -0,0 +1,811 @@ + + 1 + OpenVIBE + 0.0.0 + + + (0x000019eb, 0x0000540e) + Continuous Multi Oscilloscope + (0xa927fb20, 0xc4089f99) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + true + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.015 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Tranlucency + 1 + 1 + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x6640d485, 0xe92d22ae) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 230 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000384d, 0x00005e1b) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Moving epoch average (Immediate) + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003c36, 0x000065b1) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 177 + + + + + (0x0000481d, 0x00000085) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 74 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005985, 0x00002d6f) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000062e6, 0x00003091) + 8-15 Hz + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -176 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006815, 0x0000246a) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000003d3, 0x00007a86) + + (0x00005985, 0x00002d6f) + 0 + + + (0x000062e6, 0x00003091) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -237 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -200 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x0000056e, 0x00004925) + + (0x00003c36, 0x000065b1) + 0 + + + (0x00005985, 0x00002d6f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -311 + + + (0x358ae8b5, 0x0f8bacd1) + 120 + + + (0x3f0a3b27, 0x570913d2) + -273 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x000036c6, 0x000016d5) + + (0x0000481d, 0x00000085) + 0 + + + (0x00006815, 0x0000246a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -64 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -49 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x000039a2, 0x00000c64) + + (0x0000384d, 0x00005e1b) + 0 + + + (0x000019eb, 0x0000540e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 57 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 104 + + + (0x6267b5c5, 0x676e3e42) + 120 + + + + + (0x00004b36, 0x0000766f) + + (0x00006815, 0x0000246a) + 0 + + + (0x0000384d, 0x00005e1b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -13 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 8 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00004e52, 0x00003933) + + (0x000062e6, 0x00003091) + 0 + + + (0x0000481d, 0x00000085) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -151 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -126 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + + + (0x0000071a, 0x0000552e) + <b>Epoch Average</b> +Moving average over the last 32 epochs + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + (0x000010ed, 0x00001272) + <b>Temporal Filter</b> +Filter in the alpha band + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -176 + + + + + (0x0000162b, 0x000000ce) + <b>Band Power</b> +Average of the squared signal +on blocks of 32 samples + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -80 + + + + + (0x00002283, 0x00005062) + <b>Reference Channel</b> +The reference channel is 'Nz' + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -256 + + + + + (0x00003b8e, 0x0000136b) + <b>File Reader</b> +10 (+1 ref) channels, 512 Hz, 32 samples per block +Hand Motor Imagery session + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -336 + + + + + (0x00003dac, 0x0000671b) + <b>Advanced Visualization</b>: +<i>Continuous Multi-Oscilloscope</i> + +Displays the alpha power of all channels +on the same vertical axis. + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 128 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x000019eb, 0x0000540e)","childCount":0,"identifier":"(0x0000096a, 0x00002e60)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00004373, 0x000057ed)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000040a8, 0x00003e02)","index":0,"name":"Default tab","parentIdentifier":"(0x00004373, 0x000057ed)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00004251, 0x00003581)","index":0,"name":"Empty","parentIdentifier":"(0x000040a8, 0x00003e02)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/ContinuousOscilloscope.mxs b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/ContinuousOscilloscope.mxs new file mode 100644 index 0000000..595807d --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/ContinuousOscilloscope.mxs @@ -0,0 +1,502 @@ + + 1 + OpenVIBE + 0.0.0 + + + (0x000010e4, 0x00001957) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -288 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000016bd, 0x00007c5a) + Continuous Oscilloscope + (0x0842bcd1, 0xd53c1c89) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.025 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Tranlucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x35390ab5, 0x7b926078) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 189 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004cdd, 0x00003e62) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -368 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 177 + + + + + (0x00007db6, 0x00005d31) + 8-15 Hz + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -208 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x0000191f, 0x0000237f) + + (0x00007db6, 0x00005d31) + 0 + + + (0x000016bd, 0x00007c5a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -183 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -136 + + + (0x6267b5c5, 0x676e3e42) + 120 + + + + + (0x000029c9, 0x000044cd) + + (0x000010e4, 0x00001957) + 0 + + + (0x00007db6, 0x00005d31) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -269 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -232 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x000072f2, 0x00003e00) + + (0x00004cdd, 0x00003e62) + 0 + + + (0x000010e4, 0x00001957) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -343 + + + (0x358ae8b5, 0x0f8bacd1) + 120 + + + (0x3f0a3b27, 0x570913d2) + -305 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + + + (0x00002d7b, 0x00001d6f) + <b>Advanced Visualization</b>: +<i>Continuous Oscilloscope</i> + +Displays the filtered signal + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -112 + + + + + (0x00003d3d, 0x0000588d) + <b>File Reader</b> +10 (+1 ref) channels, 512 Hz, 32 samples per block +Hand Motor Imagery session + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -368 + + + + + (0x000041bc, 0x00001e30) + <b>Temporal Filter</b> +Filter in the alpha band + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -208 + + + + + (0x00007dc4, 0x00001e68) + <b>Reference Channel</b> +The reference channel is 'Nz' + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -288 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00002524, 0x00001c11)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0x000016bd, 0x00007c5a)","childCount":0,"identifier":"(0x00003f6b, 0x0000282f)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000761e, 0x00005ead)","index":0,"name":"Default tab","parentIdentifier":"(0x00002524, 0x00001c11)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000674b, 0x00005341)","index":0,"name":"Empty","parentIdentifier":"(0x0000761e, 0x00005ead)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/InstantBars.mxs b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/InstantBars.mxs new file mode 100644 index 0000000..4501957 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/InstantBars.mxs @@ -0,0 +1,1047 @@ + + 1 + OpenVIBE + 0.0.0 + + + (0x00000815, 0x00004fe5) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -320 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000a30, 0x00004e07) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.0625 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -176 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xad100179, 0xa3c984ab) + 169 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002683, 0x0000589f) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Moving epoch average (Immediate) + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003400, 0x000029ca) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 32 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0xad100179, 0xa3c984ab) + 143 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003e90, 0x00003bd4) + Instant Bars + (0xecb46081, 0x96da0d49) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.02 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Tranlucency + 1 + 1 + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x6b60e2b2, 0xf4839b7d) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 99 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000041c6, 0x0000777d) + 2-48 Hz + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 48 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004278, 0x000048e9) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -400 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 177 + + + + + (0x000060eb, 0x0000741a) + 8-30 Hz + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -288 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 32 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000062f3, 0x00000798) + Spectral Analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imaginary Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x0000150a, 0x000051d1) + + (0x000060eb, 0x0000741a) + 0 + + + (0x00000815, 0x00004fe5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -263 + + + (0x358ae8b5, 0x0f8bacd1) + 32 + + + (0x3f0a3b27, 0x570913d2) + -337 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00001ba9, 0x00000494) + + (0x000062f3, 0x00000798) + 0 + + + (0x00003e90, 0x00003bd4) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -13 + + + (0x358ae8b5, 0x0f8bacd1) + 105 + + + (0x3f0a3b27, 0x570913d2) + 40 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00002586, 0x00002e4d) + + (0x00004278, 0x000048e9) + 0 + + + (0x00003400, 0x000029ca) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -375 + + + (0x358ae8b5, 0x0f8bacd1) + 120 + + + (0x3f0a3b27, 0x570913d2) + -353 + + + (0x6267b5c5, 0x676e3e42) + 32 + + + + + (0x000025c7, 0x00003371) + + (0x00002683, 0x0000589f) + 0 + + + (0x000062f3, 0x00000798) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -87 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -49 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00002e53, 0x000036f9) + + (0x00003400, 0x000029ca) + 0 + + + (0x000060eb, 0x0000741a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -317 + + + (0x358ae8b5, 0x0f8bacd1) + 32 + + + (0x3f0a3b27, 0x570913d2) + -312 + + + (0x6267b5c5, 0x676e3e42) + 32 + + + + + (0x0000354d, 0x000057b2) + + (0x000041c6, 0x0000777d) + 0 + + + (0x00000a30, 0x00004e07) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -215 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -200 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00003559, 0x00002dc7) + + (0x00000815, 0x00004fe5) + 0 + + + (0x000041c6, 0x0000777d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -301 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -264 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00003cff, 0x00004d06) + + (0x00000a30, 0x00004e07) + 0 + + + (0x00002683, 0x0000589f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -151 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -136 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + + + (0x0000088c, 0x00002335) + <b>Epoching</b> +We slice the signal into 1s epochs +every 1/16th second. +We then average the last 32 epochs + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -144 + + + + + (0x00002a78, 0x000047aa) + <b>Spectral Analysis</b> +Apply a FFT to the input signal +We only take the amplitude output + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -32 + + + + + (0x00002ad3, 0x00005b51) + <b>File Reader</b> +10 (+1 ref) channels, 512 Hz, 32 samples per block +Hand Motor Imagery session + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + (0x00004877, 0x000071a0) + <b>Temporal Filter</b> +Filter below 50Hz + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -240 + + + + + (0x000070d9, 0x00006421) + <b>Advanced Visualization</b>: +<i>Instant Bars</i> + +Displays the spectrum +As all input values are positive, we activate +the corresponding box setting + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 80 + + + + + (0x00007363, 0x00003a8f) + <b>Reference Channel</b> +The reference channel is 'Nz' + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -320 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00003e90, 0x00003bd4)","childCount":0,"identifier":"(0x00002be8, 0x00000213)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000512a, 0x0000324f)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00001a11, 0x00001deb)","index":0,"name":"Default tab","parentIdentifier":"(0x0000512a, 0x0000324f)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00000ae8, 0x00001c82)","index":0,"name":"Empty","parentIdentifier":"(0x00001a11, 0x00001deb)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/InstantBitmap.mxs b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/InstantBitmap.mxs new file mode 100644 index 0000000..6ed816e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/InstantBitmap.mxs @@ -0,0 +1,815 @@ + + 1 + OpenVIBE + 0.0.0 + + + (0x000023d0, 0x000045f3) + Instant Bitmap + (0xf8627658, 0x45247823) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.025 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xa291db4a, 0x5f4fcbfc) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 119 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002ec1, 0x00007133) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -400 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 177 + + + + + (0x000040f2, 0x00000e65) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Moving epoch average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005471, 0x00000fb0) + Spectral Analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imaginary Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006548, 0x00002f42) + 2-48 Hz + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 48 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006dd6, 0x00005f47) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.0625 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -176 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xad100179, 0xa3c984ab) + 169 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000759d, 0x00004641) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -320 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00001108, 0x000045a4) + + (0x00006dd6, 0x00005f47) + 0 + + + (0x000040f2, 0x00000e65) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -151 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -136 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00001bf0, 0x00007640) + + (0x00005471, 0x00000fb0) + 0 + + + (0x000023d0, 0x000045f3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -13 + + + (0x358ae8b5, 0x0f8bacd1) + 105 + + + (0x3f0a3b27, 0x570913d2) + 40 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00004dad, 0x00000152) + + (0x00006548, 0x00002f42) + 0 + + + (0x00006dd6, 0x00005f47) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -215 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -200 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00005a92, 0x000038ac) + + (0x0000759d, 0x00004641) + 0 + + + (0x00006548, 0x00002f42) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -301 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -264 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00007a4f, 0x000044c5) + + (0x000040f2, 0x00000e65) + 0 + + + (0x00005471, 0x00000fb0) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -87 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -49 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00007b9f, 0x00000c6e) + + (0x00002ec1, 0x00007133) + 0 + + + (0x0000759d, 0x00004641) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -375 + + + (0x358ae8b5, 0x0f8bacd1) + 120 + + + (0x3f0a3b27, 0x570913d2) + -337 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + + + (0x0000013e, 0x00000dfd) + <b>File Reader</b> +10 (+1 ref) channels, 512 Hz, 32 samples per block +Hand Motor Imagery session + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + (0x00000533, 0x00001c64) + <b>Spectral Analysis</b> +Apply a FFT to the input signal +We only take the amplitude output + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -32 + + + + + (0x000020c3, 0x00003485) + <b>Temporal Filter</b> +Filter below 50Hz + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -240 + + + + + (0x00003084, 0x000050e7) + <b>Reference Channel</b> +The reference channel is 'Nz' + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -320 + + + + + (0x0000475f, 0x00003dc6) + <b>Epoching</b> +We slice the signal into 1s epochs +every 1/16th second. +We then average the last 32 epochs + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + -144 + + + + + (0x00006b17, 0x000017c6) + <b>Advanced Visualization</b>: +<i>Instant Bitmap</i> + +Displays the spectrum in form of +2D color map + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 80 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x000023d0, 0x000045f3)","childCount":0,"identifier":"(0x00001e58, 0x0000715e)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00003185, 0x00000196)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004bd5, 0x00001388)","index":0,"name":"Default tab","parentIdentifier":"(0x00003185, 0x00000196)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000021e, 0x00004481)","index":0,"name":"Empty","parentIdentifier":"(0x00004bd5, 0x00001388)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/InstantBitmap3DStream.mxs b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/InstantBitmap3DStream.mxs new file mode 100644 index 0000000..598442f --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/InstantBitmap3DStream.mxs @@ -0,0 +1,488 @@ + + 1 + OpenVIBE + 0.0.0 + + + + + + (0x0b4d1813, 0x72678d31) + cos(2πt + 100 x 2π(1 - cos(k))) + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + cos(2*M_PI*1*a + 2*M_PI*100*(1 - cos(b))) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x213b87d1, 0x4b51bb63) + Time signal (512Hz) + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 8 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x21be968a, 0x678d4f55) + Time based epoching (10s) + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 10 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x3a56e295, 0x1e35c220) + k = cos(2πt x 0.05) + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + cos(2*M_PI*0.05*x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x6d31f980, 0x6bf37a82) + Instant Bitmap (3D Stream) + (0xc3cc8b43, 0xee985c1d) + + + (0x5a90816b, 0xff2aff72) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0xc33e727b, 0xc5d0a383) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6e32749f, 0x3286ab3f) + Continuous Wavelet Analysis + (0x0a43133d, 0x6eaf25a7) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5a90816b, 0xff2aff72) + Amplitude + + + (0x5a90816b, 0xff2aff72) + Phase + + + (0x5a90816b, 0xff2aff72) + Real Part + + + (0x5a90816b, 0xff2aff72) + Imaginary Part + + + + + (0x09177469, 0x52404583) + Wavelet type + Morlet wavelet + Morlet wavelet + false + + + (0x512a166f, 0x5c3ef83f) + Wavelet parameter + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of frequencies + 60 + 32 + false + + + (0x512a166f, 0x5c3ef83f) + Highest frequency + 35 + 128 + false + + + (0x512a166f, 0x5c3ef83f) + Frequency spacing + 12.5 + 2 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0xf21c1fda, 0xc7de65fc) + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000044b5, 0x00002683) + + (0x0b4d1813, 0x72678d31) + 0 + + + (0x21be968a, 0x678d4f55) + 0 + + + + (0x0ac99808, 0x391c3ac1) + + (0x6e32749f, 0x3286ab3f) + 0 + + + (0x6d31f980, 0x6bf37a82) + 0 + + + + (0x45ab1ddc, 0x65357a40) + + (0x213b87d1, 0x4b51bb63) + 0 + + + (0x3a56e295, 0x1e35c220) + 0 + + + + (0x6292f484, 0x1df338ac) + + (0x3a56e295, 0x1e35c220) + 0 + + + (0x0b4d1813, 0x72678d31) + 1 + + + + (0x67b4dbfc, 0x12d6b296) + + (0x213b87d1, 0x4b51bb63) + 0 + + + (0x0b4d1813, 0x72678d31) + 0 + + + + (0x6fef59fa, 0x4afc6580) + + (0x21be968a, 0x678d4f55) + 0 + + + (0x6e32749f, 0x3286ab3f) + 0 + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x000068b7, 0x0000338b)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0x6d31f980, 0x6bf37a82)","childCount":0,"identifier":"(0x6d31f980, 0x6bf37a82)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00001b63, 0x000049e2)","index":0,"name":"Default tab","parentIdentifier":"(0x000068b7, 0x0000338b)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00001a25, 0x00004cd1)","index":0,"name":"Empty","parentIdentifier":"(0x00001b63, 0x000049e2)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/InstantMultiOscilloscope.mxs b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/InstantMultiOscilloscope.mxs new file mode 100644 index 0000000..2711f8f --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/InstantMultiOscilloscope.mxs @@ -0,0 +1,1315 @@ + + 1 + OpenVIBE + 0.0.0 + + + (0x00001926, 0x000050b1) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -480 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 177 + + + + + (0x00002aad, 0x00004f9d) + Surface Laplacian + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Fitler Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 4;0;-1;0;-1;-1;0;0;-1;0;0;4;0;-1;0;0;-1;-1;0;-1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 2 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 10 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 141 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002bdf, 0x000059fb) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Cumulative average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000033d1, 0x00006a65) + Spectral Analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imaginary Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004144, 0x00003520) + Channel Rename + (0x1fe50479, 0x39040f40) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + New channel names + Channel 1;Channel 2 + L.C3;L.C4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -64 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x74d8d30c, 0xfa7bdf43) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0x30a4e5c9, 0x83502953) + + + + (0x527ad68d, 0x16d746a0) + + + + + + (0x00005142, 0x00003555) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005ad8, 0x00006c53) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000637f, 0x0000350d) + 8-30 Hz + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 48 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006f35, 0x00004dd5) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 8 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -432 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 48 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0xad100179, 0xa3c984ab) + 143 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006f55, 0x00005e6c) + Instant Multi Oscilloscope + (0x072b75a9, 0xc28d588a) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + true + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.0125 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Tranlucency + 1 + 1 + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x6b60e2b2, 0xf4839b7d) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 199 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000076b2, 0x00004a1d) + Right hand trials + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_GDF_Right + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -320 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 166 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + + + (0x0000102b, 0x00006930) + + (0x00005142, 0x00003555) + 0 + + + (0x00005ad8, 0x00006c53) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -237 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -216 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x000012cd, 0x000004a0) + + (0x000033d1, 0x00006a65) + 0 + + + (0x00006f55, 0x00005e6c) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 99 + + + (0x358ae8b5, 0x0f8bacd1) + 105 + + + (0x3f0a3b27, 0x570913d2) + 152 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x000013bd, 0x00003c1a) + + (0x00006f35, 0x00004dd5) + 0 + + + (0x0000637f, 0x0000350d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -413 + + + (0x358ae8b5, 0x0f8bacd1) + 48 + + + (0x3f0a3b27, 0x570913d2) + -408 + + + (0x6267b5c5, 0x676e3e42) + 48 + + + + + (0x00002897, 0x00000095) + + (0x00005ad8, 0x00006c53) + 0 + + + (0x00002aad, 0x00004f9d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -167 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -158 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x0000298e, 0x00001128) + + (0x00004144, 0x00003520) + 0 + + + (0x00002bdf, 0x000059fb) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -45 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -24 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00002c28, 0x00003821) + + (0x00001926, 0x000050b1) + 0 + + + (0x00006f35, 0x00004dd5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -455 + + + (0x358ae8b5, 0x0f8bacd1) + 120 + + + (0x3f0a3b27, 0x570913d2) + -449 + + + (0x6267b5c5, 0x676e3e42) + 48 + + + + + (0x00003028, 0x00006746) + + (0x00002aad, 0x00004f9d) + 0 + + + (0x00004144, 0x00003520) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -96 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -81 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x0000468c, 0x0000082f) + + (0x000076b2, 0x00004a1d) + 0 + + + (0x00005142, 0x00003555) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -295 + + + (0x358ae8b5, 0x0f8bacd1) + 120 + + + (0x3f0a3b27, 0x570913d2) + -273 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00006504, 0x00002825) + + (0x00001926, 0x000050b1) + 1 + + + (0x000076b2, 0x00004a1d) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -455 + + + (0x358ae8b5, 0x0f8bacd1) + 135 + + + (0x3f0a3b27, 0x570913d2) + -344 + + + (0x6267b5c5, 0x676e3e42) + 135 + + + + + (0x0000671c, 0x000032b0) + + (0x0000637f, 0x0000350d) + 0 + + + (0x000076b2, 0x00004a1d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -359 + + + (0x358ae8b5, 0x0f8bacd1) + 48 + + + (0x3f0a3b27, 0x570913d2) + -344 + + + (0x6267b5c5, 0x676e3e42) + 120 + + + + + (0x00006868, 0x00006e25) + + (0x00002bdf, 0x000059fb) + 0 + + + (0x000033d1, 0x00006a65) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 25 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 63 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + + + (0x00000089, 0x0000650c) + <b>Reference Channel</b> +The reference channel is 'Nz' + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -240 + + + + + (0x00000a74, 0x0000661d) + <b>Temporal Filter</b> +Filter in a large alpha-beta band + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + (0x00002922, 0x00006fd7) + <b>File Reader</b> +10 (+1 ref) channels, 512 Hz, 32 samples per block +Hand Motor Imagery session + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -480 + + + + + (0x00004ce8, 0x0000004e) + <b>Advanced Visualization</b>: +<i>Instant Multi-Oscilloscope</i> + +Displays the spectrum of the average +of all right-hand trials + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + 176 + + + + + (0x00006a9d, 0x00003943) + <b>Epoch Average</b> +Cumulative (infinite) average + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + 0 + + + + + (0x00007038, 0x00003dc5) + <b>Epoching</b> +We select the right hand trials: +4 second epoch, 0.5s after the +instruction + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -320 + + + + + (0x00007377, 0x000032a0) + <b>Spatial filter</b> +We compute the 2 surface Laplacians +around C3 and C4. + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -128 + + + + + (0x00007c57, 0x00002da5) + <b>Spectral Analysis</b> +Apply a FFT to the input signal. +We only take the amplitude output + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + 80 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00000de7, 0x00004ab7)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0x00006f55, 0x00005e6c)","childCount":0,"identifier":"(0x00005c5e, 0x00004f6d)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00002dfd, 0x00006fb9)","index":0,"name":"Default tab","parentIdentifier":"(0x00000de7, 0x00004ab7)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00007dcf, 0x000057df)","index":0,"name":"Empty","parentIdentifier":"(0x00002dfd, 0x00006fb9)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/InstantOscilloscope.mxs b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/InstantOscilloscope.mxs new file mode 100644 index 0000000..3db20cb --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/InstantOscilloscope.mxs @@ -0,0 +1,1319 @@ + + 1 + OpenVIBE + 0.0.0 + + + (0x000004b7, 0x00002ee5) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Cumulative average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000062d, 0x00004daa) + Spectral Analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imaginary Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001ce1, 0x00005bfc) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -512 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 177 + + + + + (0x00003d7f, 0x000047bb) + Instant Oscilloscope + (0x997b654d, 0x0cdb3102) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.01 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Tranlucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x3f494638, 0xc9589121) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 158 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004c27, 0x00001836) + Channel Rename + (0x1fe50479, 0x39040f40) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + New channel names + Channel 1;Channel 2 + L.C3;L.C4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x74d8d30c, 0xfa7bdf43) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0x30a4e5c9, 0x83502953) + + + + (0x527ad68d, 0x16d746a0) + + + + + + (0x0000512b, 0x00007618) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -288 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000587f, 0x00000aa9) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006254, 0x00006d4f) + Right hand trials + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_GDF_Right + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -352 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 166 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000069fc, 0x000054dd) + 8-30 Hz + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -416 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 48 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007066, 0x00000174) + Surface Laplacian + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Fitler Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 4;0;-1;0;-1;-1;0;0;-1;0;0;4;0;-1;0;0;-1;-1;0;-1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 2 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 10 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 141 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007b44, 0x00002ae7) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 8 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -464 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 48 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0xad100179, 0xa3c984ab) + 143 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x0000161b, 0x000001e1) + + (0x00006254, 0x00006d4f) + 0 + + + (0x0000512b, 0x00007618) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -327 + + + (0x358ae8b5, 0x0f8bacd1) + 120 + + + (0x3f0a3b27, 0x570913d2) + -305 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00001bf3, 0x00005db0) + + (0x00004c27, 0x00001836) + 0 + + + (0x000004b7, 0x00002ee5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -77 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -56 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00002139, 0x00006e19) + + (0x00007b44, 0x00002ae7) + 0 + + + (0x000069fc, 0x000054dd) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -445 + + + (0x358ae8b5, 0x0f8bacd1) + 48 + + + (0x3f0a3b27, 0x570913d2) + -440 + + + (0x6267b5c5, 0x676e3e42) + 48 + + + + + (0x00002412, 0x00001a2b) + + (0x000069fc, 0x000054dd) + 0 + + + (0x00006254, 0x00006d4f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -391 + + + (0x358ae8b5, 0x0f8bacd1) + 48 + + + (0x3f0a3b27, 0x570913d2) + -376 + + + (0x6267b5c5, 0x676e3e42) + 120 + + + + + (0x00002a23, 0x00000a80) + + (0x000004b7, 0x00002ee5) + 0 + + + (0x0000062d, 0x00004daa) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -7 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 31 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00003a4f, 0x00004945) + + (0x0000512b, 0x00007618) + 0 + + + (0x0000587f, 0x00000aa9) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -269 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -248 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00004d20, 0x00005c0e) + + (0x00001ce1, 0x00005bfc) + 0 + + + (0x00007b44, 0x00002ae7) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -487 + + + (0x358ae8b5, 0x0f8bacd1) + 120 + + + (0x3f0a3b27, 0x570913d2) + -481 + + + (0x6267b5c5, 0x676e3e42) + 48 + + + + + (0x000065f4, 0x000078ea) + + (0x0000062d, 0x00004daa) + 0 + + + (0x00003d7f, 0x000047bb) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 67 + + + (0x358ae8b5, 0x0f8bacd1) + 105 + + + (0x3f0a3b27, 0x570913d2) + 104 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00007002, 0x000074fd) + + (0x00001ce1, 0x00005bfc) + 1 + + + (0x00006254, 0x00006d4f) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -487 + + + (0x358ae8b5, 0x0f8bacd1) + 135 + + + (0x3f0a3b27, 0x570913d2) + -376 + + + (0x6267b5c5, 0x676e3e42) + 135 + + + + + (0x000078ad, 0x0000016c) + + (0x0000587f, 0x00000aa9) + 0 + + + (0x00007066, 0x00000174) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -199 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -190 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00007c54, 0x000022fb) + + (0x00007066, 0x00000174) + 0 + + + (0x00004c27, 0x00001836) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -128 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -113 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + + + (0x000006c6, 0x000001b0) + <b>Temporal Filter</b> +Filter in a large alpha-beta band + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -432 + + + + + (0x00000da2, 0x0000276e) + <b>Epoch Average</b> +Cumulative (infinite) average + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -32 + + + + + (0x00001a99, 0x00006cac) + <b>Advanced Visualization</b>: +<i>Instant Oscilloscope</i> + +Displays the spectrum of the average +of all right-hand trials + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + 144 + + + + + (0x00004c82, 0x000033e0) + <b>File Reader</b> +10 (+1 ref) channels, 512 Hz, 32 samples per block +Hand Motor Imagery session + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -512 + + + + + (0x00005d6c, 0x000004fb) + <b>Epoching</b> +We select the right hand trials: +4 second epoch, 0.5s after the +instruction + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -352 + + + + + (0x000069a6, 0x0000461f) + <b>Reference Channel</b> +The reference channel is 'Nz' + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -272 + + + + + (0x00007344, 0x000057c0) + <b>Spectral Analysis</b> +Apply a FFT to the input signal. +We only take the amplitude output + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + 48 + + + + + (0x0000769c, 0x00005a08) + <b>Spatial filter</b> +We compute the 2 surface Laplacians +around C3 and C4. + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -160 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00003d7f, 0x000047bb)","childCount":0,"identifier":"(0x000008aa, 0x000037b5)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x000020b0, 0x00007617)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00002cc7, 0x00006c3c)","index":0,"name":"Default tab","parentIdentifier":"(0x000020b0, 0x00007617)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00002ac4, 0x00004227)","index":0,"name":"Empty","parentIdentifier":"(0x00002cc7, 0x00006c3c)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/StackedBitmapHorz.mxs b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/StackedBitmapHorz.mxs new file mode 100644 index 0000000..9098688 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/StackedBitmapHorz.mxs @@ -0,0 +1,1154 @@ + + 1 + OpenVIBE + 0.0.0 + + + (0x00001688, 0x00006d2a) + Surface Laplacian + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Fitler Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 4;0;-1;0;-1;-1;0;0;-1;0;0;4;0;-1;0;0;-1;-1;0;-1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 2 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 10 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 112 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 141 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001a3d, 0x00006b76) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.06250 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 112 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xad100179, 0xa3c984ab) + 169 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0075b800) + + + + + (0x00001a41, 0x00000016) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 112 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000370e, 0x00003f9c) + Channel Rename + (0x1fe50479, 0x39040f40) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + New channel names + Channel 1;Channel 2 + L.C3;L.C4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -176 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 112 + + + (0x4e7b798a, 0x183beafb) + (0x74d8d30c, 0xfa7bdf43) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0x30a4e5c9, 0x83502953) + + + + (0x527ad68d, 0x16d746a0) + + + + + + (0x00004348, 0x00002b7a) + Spectral Analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imaginary Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 112 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004fdf, 0x0000640f) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 112 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000533c, 0x0000320e) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 112 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0xad100179, 0xa3c984ab) + 143 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005361, 0x00005e13) + Stacked Bitmap (Horizontal) + (0x7b0ddb65, 0xfdc51488) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 17 + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.01 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 112 + + + (0x4e7b798a, 0x183beafb) + (0xafb1edd5, 0x68e1da05) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 220 + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000059ce, 0x00005a77) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -464 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 112 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 177 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01b25f63) + + + + + (0x00007c29, 0x000005bf) + Temporal filter - GPL + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 48 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 112 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 163 + + + + + + + (0x00000709, 0x00006fa8) + + (0x00004fdf, 0x0000640f) + 0 + + + (0x00001a41, 0x00000016) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -365 + + + (0x358ae8b5, 0x0f8bacd1) + 112 + + + (0x3f0a3b27, 0x570913d2) + -328 + + + (0x6267b5c5, 0x676e3e42) + 112 + + + + + (0x00001b2b, 0x00002905) + + (0x00004348, 0x00002b7a) + 0 + + + (0x00005361, 0x00005e13) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 99 + + + (0x358ae8b5, 0x0f8bacd1) + 89 + + + (0x3f0a3b27, 0x570913d2) + 168 + + + (0x6267b5c5, 0x676e3e42) + 104 + + + + + (0x0000276b, 0x00005291) + + (0x00007c29, 0x000005bf) + 0 + + + (0x0000533c, 0x0000320e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -109 + + + (0x358ae8b5, 0x0f8bacd1) + 112 + + + (0x3f0a3b27, 0x570913d2) + -97 + + + (0x6267b5c5, 0x676e3e42) + 112 + + + + + (0x00002b94, 0x00006558) + + (0x000059ce, 0x00005a77) + 1 + + + (0x00004fdf, 0x0000640f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -439 + + + (0x358ae8b5, 0x0f8bacd1) + 112 + + + (0x3f0a3b27, 0x570913d2) + -401 + + + (0x6267b5c5, 0x676e3e42) + 112 + + + + + (0x00004382, 0x0000293e) + + (0x00001a3d, 0x00006b76) + 0 + + + (0x00004348, 0x00002b7a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 9 + + + (0x358ae8b5, 0x0f8bacd1) + 112 + + + (0x3f0a3b27, 0x570913d2) + 63 + + + (0x6267b5c5, 0x676e3e42) + 112 + + + + + (0x0000514c, 0x00000615) + + (0x0000370e, 0x00003f9c) + 0 + + + (0x00007c29, 0x000005bf) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -157 + + + (0x358ae8b5, 0x0f8bacd1) + 112 + + + (0x3f0a3b27, 0x570913d2) + -145 + + + (0x6267b5c5, 0x676e3e42) + 112 + + + + + (0x0000516b, 0x0000543f) + + (0x00001688, 0x00006d2a) + 0 + + + (0x0000370e, 0x00003f9c) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -208 + + + (0x358ae8b5, 0x0f8bacd1) + 112 + + + (0x3f0a3b27, 0x570913d2) + -193 + + + (0x6267b5c5, 0x676e3e42) + 112 + + + + + (0x00005f4d, 0x00001487) + + (0x0000533c, 0x0000320e) + 0 + + + (0x00001a3d, 0x00006b76) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -61 + + + (0x358ae8b5, 0x0f8bacd1) + 112 + + + (0x3f0a3b27, 0x570913d2) + -40 + + + (0x6267b5c5, 0x676e3e42) + 112 + + + + + (0x00006172, 0x00001bcb) + + (0x00001a41, 0x00000016) + 0 + + + (0x00001688, 0x00006d2a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -279 + + + (0x358ae8b5, 0x0f8bacd1) + 112 + + + (0x3f0a3b27, 0x570913d2) + -270 + + + (0x6267b5c5, 0x676e3e42) + 112 + + + + + + + (0x00001f97, 0x0000349d) + <b>Spatial filter</b> +We compute the 2 surface Laplacians +around C3 and C4. + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -256 + + + + + (0x00002cae, 0x000072c6) + <b>Epoching</b> +We slice the signal into 1s epochs +every 1/16th second. + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -16 + + + + + (0x00002f66, 0x000037e8) + <b>Advanced Visualization</b>: +<i>Stacked Bitmap (Horizontal)</i> + +Displays the spectrum as a <b>time-frequency map</b>. + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + 192 + + + + + (0x000049dc, 0x00002d75) + <b>File Reader</b> +10 (+1 ref) channels, 512 Hz, 32 samples per block +Hand Motor Imagery session + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -464 + + + + + (0x00006649, 0x00007741) + <b>Reference Channel</b> +The reference channel is 'Nz' + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -384 + + + + + (0x00007a2d, 0x000035ae) + <b>Downsampling</b> +Temporal Filter + factor 4 decimation +To compute our FFT up to 64 Hz. + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -96 + + + + + (0x00007b23, 0x0000060f) + <b>Spectral Analysis</b> +Apply a FFT to the input signal. +We only take the amplitude output + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + 80 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00001604, 0x0000690c)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0x00005361, 0x00005e13)","childCount":0,"identifier":"(0x00007e5b, 0x00000e6f)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003ca0, 0x00006b74)","index":0,"name":"Default tab","parentIdentifier":"(0x00001604, 0x0000690c)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000074b2, 0x000011fd)","index":0,"name":"Empty","parentIdentifier":"(0x00003ca0, 0x00006b74)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/StackedBitmapVert.mxs b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/StackedBitmapVert.mxs new file mode 100644 index 0000000..f4aed5c --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/StackedBitmapVert.mxs @@ -0,0 +1,1207 @@ + + 1 + OpenVIBE + 0.0.0 + + + (0x0000112b, 0x000001ff) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -320 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001afe, 0x00006229) + Stacked Bitmap (Vertical) + (0x9926a761, 0xba82d233) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Independant + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.01 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xafb1edd5, 0x68e1da05) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 201 + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000202c, 0x000011c6) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000023c9, 0x00007e46) + Channel Rename + (0x1fe50479, 0x39040f40) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + New channel names + Channel 1;Channel 2 + L.C3;L.C4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x74d8d30c, 0xfa7bdf43) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0x30a4e5c9, 0x83502953) + + + + (0x527ad68d, 0x16d746a0) + + + + + + (0x000029f2, 0x00002b6a) + 8-30 Hz + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002cb6, 0x00002dca) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -480 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 177 + + + + + (0x00003bf3, 0x00004578) + Surface Laplacian + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Fitler Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 4;0;-1;0;-1;-1;0;0;-1;0;0;4;0;-1;0;0;-1;-1;0;-1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 2 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 10 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 141 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000477d, 0x00001e7e) + Right hand trials + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_GDF_Right + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 166 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00005c7a, 0x00000e8f) + Spectral Analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imaginary Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007bf4, 0x00000a32) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 8 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0xad100179, 0xa3c984ab) + 143 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x0000120f, 0x00000559) + + (0x00005c7a, 0x00000e8f) + 0 + + + (0x00001afe, 0x00006229) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 51 + + + (0x358ae8b5, 0x0f8bacd1) + 105 + + + (0x3f0a3b27, 0x570913d2) + 72 + + + (0x6267b5c5, 0x676e3e42) + 120 + + + + + (0x00001587, 0x00007037) + + (0x00007bf4, 0x00000a32) + 0 + + + (0x00005c7a, 0x00000e8f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -13 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 15 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x000021d7, 0x0000195e) + + (0x00002cb6, 0x00002dca) + 1 + + + (0x0000477d, 0x00001e7e) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -455 + + + (0x358ae8b5, 0x0f8bacd1) + 135 + + + (0x3f0a3b27, 0x570913d2) + -408 + + + (0x6267b5c5, 0x676e3e42) + 135 + + + + + (0x00003e27, 0x00004816) + + (0x000023c9, 0x00007e46) + 0 + + + (0x000029f2, 0x00002b6a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -109 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -104 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x0000424c, 0x00000a9c) + + (0x0000202c, 0x000011c6) + 0 + + + (0x00003bf3, 0x00004578) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -231 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -222 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x0000558d, 0x000043f4) + + (0x00002cb6, 0x00002dca) + 0 + + + (0x0000477d, 0x00001e7e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -455 + + + (0x358ae8b5, 0x0f8bacd1) + 120 + + + (0x3f0a3b27, 0x570913d2) + -408 + + + (0x6267b5c5, 0x676e3e42) + 120 + + + + + (0x000058e4, 0x0000275f) + + (0x000029f2, 0x00002b6a) + 0 + + + (0x00007bf4, 0x00000a32) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -55 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -49 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x000061cc, 0x00007e39) + + (0x00003bf3, 0x00004578) + 0 + + + (0x000023c9, 0x00007e46) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -160 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -145 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00006d01, 0x000060cb) + + (0x0000112b, 0x000001ff) + 0 + + + (0x0000202c, 0x000011c6) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -301 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + -280 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x0000766b, 0x00001436) + + (0x0000477d, 0x00001e7e) + 0 + + + (0x0000112b, 0x000001ff) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -359 + + + (0x358ae8b5, 0x0f8bacd1) + 120 + + + (0x3f0a3b27, 0x570913d2) + -337 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + + + (0x000007d2, 0x0000297e) + <b>Reference Channel</b> +The reference channel is 'Nz' + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -320 + + + + + (0x00002dd8, 0x000039d2) + <b>Advanced Visualization</b>: +<i>Stacked Bitmap (Vertical) </i> + +Displays the spectrum of every right-hand trials + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + 128 + + + + + (0x00004d6b, 0x00004a07) + <b>Spectral Analysis</b> +Apply a FFT to the input signal. +We only take the amplitude output + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + (0x00004d94, 0x000014ee) + <b>Epoching</b> +We select the right hand trials: +4 second epoch, 0.5s after the +instruction + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + (0x00005b9a, 0x00007a99) + <b>Downsampling</b> +Temporal Filter + factor 4 decimation +To compute our FFT up to 64 Hz. + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -64 + + + + + (0x000076bd, 0x00000e99) + <b>Spatial filter</b> +We compute the 2 surface Laplacians +around C3 and C4. + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -192 + + + + + (0x00007f91, 0x00005ee6) + <b>File Reader</b> +10 (+1 ref) channels, 512 Hz, 32 samples per block +Hand Motor Imagery session + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -496 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x000039e5, 0x00004253)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0x00001afe, 0x00006229)","childCount":0,"identifier":"(0x0000608c, 0x00006785)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000551f, 0x00004e6e)","index":0,"name":"Default tab","parentIdentifier":"(0x000039e5, 0x00004253)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00007f1c, 0x00002e6f)","index":0,"name":"Empty","parentIdentifier":"(0x0000551f, 0x00004e6e)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/UseCase-1-EEG-signal-analysis.mxs b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/UseCase-1-EEG-signal-analysis.mxs new file mode 100644 index 0000000..c3246e9 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/box-tutorials/UseCase-1-EEG-signal-analysis.mxs @@ -0,0 +1,2385 @@ + + 1 + OpenVIBE + 0.0.0 + + + (0x00000d98, 0x00002f3b) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -432 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 177 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01b25f63) + + + + + (0x00001054, 0x00004516) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 8 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0xad100179, 0xa3c984ab) + 143 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001283, 0x00007e1b) + 8-15 Hz + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001476, 0x000036f5) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x1f261c0a, 0x593bf6bd) + Input epochs + + + + + (0x1f261c0a, 0x593bf6bd) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Moving epoch average (Immediate) + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001a08, 0x00007d57) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001f2f, 0x00005bd4) + Signal + (0x0842bcd1, 0xd53c1c89) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.01 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Tranlucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x35390ab5, 0x7b926078) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 147 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000023e6, 0x00002051) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002ff2, 0x000034ab) + T/F Analysis + (0x7b0ddb65, 0xfdc51488) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.01 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 464 + + + (0x4e7b798a, 0x183beafb) + (0xafb1edd5, 0x68e1da05) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 167 + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00003292, 0x00002601) + 3D Topography + (0xc709ea84, 0xb577d910) + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.03 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xa291db4a, 0x5f4fcbfc) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 123 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003959, 0x0000295f) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003c42, 0x00006a98) + Channel Rename + (0x1fe50479, 0x39040f40) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + New channel names + Channel 1;Channel 2 + L.C3;L.C4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0x74d8d30c, 0xfa7bdf43) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0x30a4e5c9, 0x83502953) + + + + (0x527ad68d, 0x16d746a0) + + + + + + (0x0000464f, 0x00003bcc) + Spectrum + (0xecb46081, 0x96da0d49) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.01 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Tranlucency + 1 + 1.000000 + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x4e7b798a, 0x183beafb) + (0x6b60e2b2, 0xf4839b7d) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 81 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000496d, 0x0000371b) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + .0625 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xad100179, 0xa3c984ab) + 169 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004ba0, 0x00006638) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Moving epoch average (Immediate) + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000556c, 0x00006c6d) + Surface Laplacian + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Fitler Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 4;0;-1;0;-1;-1;0;0;-1;0;0;4;0;-1;0;0;-1;-1;0;-1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 2 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 10 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 141 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005737, 0x00006c23) + 2D Topography + (0x7c3a05b8, 0xc45386f8) + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.025 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0xa291db4a, 0x5f4fcbfc) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 123 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005c99, 0x00003ada) + Spectral Analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imag Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000623b, 0x00007b4e) + 8-30 Hz + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000626d, 0x00007c58) + Notch 50Hz + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band stop + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 49 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 51 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -368 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007488, 0x00003113) + 1-40 Hz + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 40 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007bd1, 0x00004b68) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 74 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00000873, 0x000075d4) + + (0x00003c42, 0x00006a98) + 0 + + + (0x0000623b, 0x00007b4e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -13 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 8 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x0000204c, 0x00007248) + + (0x0000626d, 0x00007c58) + 0 + + + (0x00007488, 0x00003113) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -343 + + + (0x358ae8b5, 0x0f8bacd1) + 400 + + + (0x3f0a3b27, 0x570913d2) + -328 + + + (0x6267b5c5, 0x676e3e42) + 400 + + + + + (0x00002ad0, 0x00004f4b) + + (0x000023e6, 0x00002051) + 0 + + + (0x00004ba0, 0x00006638) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -13 + + + (0x358ae8b5, 0x0f8bacd1) + 800 + + + (0x3f0a3b27, 0x570913d2) + 8 + + + (0x6267b5c5, 0x676e3e42) + 800 + + + + + (0x00003368, 0x00000fec) + + (0x00003959, 0x0000295f) + 0 + + + (0x00001283, 0x00007e1b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -221 + + + (0x358ae8b5, 0x0f8bacd1) + 400 + + + (0x3f0a3b27, 0x570913d2) + -184 + + + (0x6267b5c5, 0x676e3e42) + 800 + + + + + (0x0000373f, 0x00005b5f) + + (0x0000556c, 0x00006c6d) + 0 + + + (0x00003c42, 0x00006a98) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -64 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + -49 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x000039a0, 0x0000044b) + + (0x00001476, 0x000036f5) + 0 + + + (0x00002ff2, 0x000034ab) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 297 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 322 + + + (0x6267b5c5, 0x676e3e42) + 456 + + + + + (0x00003b34, 0x00003dd0) + + (0x00000d98, 0x00002f3b) + 1 + + + (0x0000626d, 0x00007c58) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -407 + + + (0x358ae8b5, 0x0f8bacd1) + 400 + + + (0x3f0a3b27, 0x570913d2) + -392 + + + (0x6267b5c5, 0x676e3e42) + 400 + + + + + (0x00003e6d, 0x000038e6) + + (0x00003959, 0x0000295f) + 0 + + + (0x00001a08, 0x00007d57) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -221 + + + (0x358ae8b5, 0x0f8bacd1) + 400 + + + (0x3f0a3b27, 0x570913d2) + -184 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x00003f13, 0x00004bc3) + + (0x0000496d, 0x0000371b) + 0 + + + (0x00005c99, 0x00003ada) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 185 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 191 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x000046db, 0x00002550) + + (0x00001a08, 0x00007d57) + 0 + + + (0x0000556c, 0x00006c6d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -135 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + -126 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x00004842, 0x00000911) + + (0x00001476, 0x000036f5) + 0 + + + (0x0000464f, 0x00003bcc) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 297 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 322 + + + (0x6267b5c5, 0x676e3e42) + 624 + + + + + (0x00004868, 0x00001051) + + (0x00007488, 0x00003113) + 0 + + + (0x00003959, 0x0000295f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -279 + + + (0x358ae8b5, 0x0f8bacd1) + 400 + + + (0x3f0a3b27, 0x570913d2) + -257 + + + (0x6267b5c5, 0x676e3e42) + 400 + + + + + (0x00004c92, 0x00003fab) + + (0x00005c99, 0x00003ada) + 0 + + + (0x00001476, 0x000036f5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 227 + + + (0x358ae8b5, 0x0f8bacd1) + 505 + + + (0x3f0a3b27, 0x570913d2) + 248 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x0000589a, 0x00006074) + + (0x00001283, 0x00007e1b) + 0 + + + (0x00007bd1, 0x00004b68) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -135 + + + (0x358ae8b5, 0x0f8bacd1) + 800 + + + (0x3f0a3b27, 0x570913d2) + -126 + + + (0x6267b5c5, 0x676e3e42) + 800 + + + + + (0x0000589b, 0x00006819) + + (0x00001054, 0x00004516) + 0 + + + (0x0000496d, 0x0000371b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 115 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 136 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x0000691b, 0x000061ac) + + (0x0000623b, 0x00007b4e) + 0 + + + (0x00001054, 0x00004516) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 57 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 79 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x00006ea1, 0x00000c29) + + (0x00004ba0, 0x00006638) + 0 + + + (0x00005737, 0x00006c23) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 57 + + + (0x358ae8b5, 0x0f8bacd1) + 800 + + + (0x3f0a3b27, 0x570913d2) + 72 + + + (0x6267b5c5, 0x676e3e42) + 736 + + + + + (0x00007752, 0x00000885) + + (0x00004ba0, 0x00006638) + 0 + + + (0x00003292, 0x00002601) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 57 + + + (0x358ae8b5, 0x0f8bacd1) + 800 + + + (0x3f0a3b27, 0x570913d2) + 72 + + + (0x6267b5c5, 0x676e3e42) + 864 + + + + + (0x000077f0, 0x00003dd7) + + (0x00003959, 0x0000295f) + 0 + + + (0x00001f2f, 0x00005bd4) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -221 + + + (0x358ae8b5, 0x0f8bacd1) + 400 + + + (0x3f0a3b27, 0x570913d2) + -174 + + + (0x6267b5c5, 0x676e3e42) + 200 + + + + + (0x00007aae, 0x000011df) + + (0x00007bd1, 0x00004b68) + 0 + + + (0x000023e6, 0x00002051) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -64 + + + (0x358ae8b5, 0x0f8bacd1) + 800 + + + (0x3f0a3b27, 0x570913d2) + -49 + + + (0x6267b5c5, 0x676e3e42) + 800 + + + + + + + (0x00000aed, 0x00006b19) + <b>File Reader</b> +10 (+1 ref) channels, 512 Hz, 32 samples per block +Hand Motor Imagery session + + + (0x473d9a43, 0x97fc0a97) + 720 + + + (0x7234b86b, 0x2b8651a5) + -432 + + + + + (0x0000370b, 0x00002da3) + <b>Spatial filter</b> +We compute the surface Laplacians +around C3 and C4. + + + (0x473d9a43, 0x97fc0a97) + 352 + + + (0x7234b86b, 0x2b8651a5) + -64 + + + + + (0x0000429f, 0x0000406d) + <b>Reference Channel</b> +The reference channel is 'Nz' + + + (0x473d9a43, 0x97fc0a97) + 720 + + + (0x7234b86b, 0x2b8651a5) + -240 + + + + + (0x00004a87, 0x00007563) + <b>Topographies</b> +We display the alpha band power +on a 2D and a 3D map + + + (0x473d9a43, 0x97fc0a97) + 1008 + + + (0x7234b86b, 0x2b8651a5) + -144 + + + + + (0x00006454, 0x0000410c) + <b>Temporal filtering</b> +We remove the 50 Hz noise with a notch filter +and select only the frequency range between +1 and 40 Hz. + + + (0x473d9a43, 0x97fc0a97) + 720 + + + (0x7234b86b, 0x2b8651a5) + -320 + + + + + (0x00007d86, 0x00000a1f) + <b>Spectral analysis</b> +The decimation downsamples the +signal from 512 Hz to 64 Hz. +The spectrum is thus computed up to 32Hz + + + (0x473d9a43, 0x97fc0a97) + 256 + + + (0x7234b86b, 0x2b8651a5) + 192 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":3,"height":430,"identifier":"(0x00006b10, 0x00002f8f)","index":0,"name":"EEG analysis","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":687},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006761, 0x0000752c)","index":0,"name":"Signal","parentIdentifier":"(0x00006b10, 0x00002f8f)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00001c78, 0x0000233f)","index":1,"name":"Spectral analysis","parentIdentifier":"(0x00006b10, 0x00002f8f)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00000cd5, 0x00003a81)","index":2,"name":"Topography","parentIdentifier":"(0x00006b10, 0x00002f8f)","type":2},{"boxIdentifier":"(0x00001f2f, 0x00005bd4)","childCount":0,"identifier":"(0x000005a4, 0x00002d7a)","index":0,"parentIdentifier":"(0x00006761, 0x0000752c)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":330,"identifier":"(0x0000492a, 0x00006fb0)","index":0,"maxDividerPosition":665,"name":"Horizontal split","parentIdentifier":"(0x00001c78, 0x0000233f)","type":5},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":333,"identifier":"(0x000035ca, 0x00000329)","index":0,"maxDividerPosition":671,"name":"Horizontal split","parentIdentifier":"(0x00000cd5, 0x00003a81)","type":5},{"boxIdentifier":"(0x0000464f, 0x00003bcc)","childCount":0,"identifier":"(0x000015f3, 0x00001f12)","index":0,"parentIdentifier":"(0x0000492a, 0x00006fb0)","type":3},{"boxIdentifier":"(0x00002ff2, 0x000034ab)","childCount":0,"identifier":"(0x000068b2, 0x00002089)","index":1,"parentIdentifier":"(0x0000492a, 0x00006fb0)","type":3},{"boxIdentifier":"(0x00005737, 0x00006c23)","childCount":0,"identifier":"(0x00002fcb, 0x00003ee3)","index":0,"parentIdentifier":"(0x000035ca, 0x00000329)","type":3},{"boxIdentifier":"(0x00003292, 0x00002601)","childCount":0,"identifier":"(0x00007776, 0x000006dc)","index":1,"parentIdentifier":"(0x000035ca, 0x00000329)","type":3}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/2DTopography_ColorGradients.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/2DTopography_ColorGradients.png new file mode 100644 index 0000000..39372c8 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/2DTopography_ColorGradients.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/2DTopography_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/2DTopography_Example.png new file mode 100644 index 0000000..2ccbabc Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/2DTopography_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DCubes_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DCubes_Example.png new file mode 100644 index 0000000..c662250 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DCubes_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DTomographicVisualization_Display.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DTomographicVisualization_Display.png new file mode 100644 index 0000000..c42348e Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DTomographicVisualization_Display.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DTomographicVisualization_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DTomographicVisualization_Example.png new file mode 100644 index 0000000..1eca308 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DTomographicVisualization_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DTopography_Display.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DTopography_Display.png new file mode 100644 index 0000000..5825ef8 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DTopography_Display.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DTopography_ERPReplay.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DTopography_ERPReplay.png new file mode 100644 index 0000000..655adef Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DTopography_ERPReplay.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DTopography_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DTopography_Example.png new file mode 100644 index 0000000..c53aa68 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/3DTopography_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/CartesianCoordinates1.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/CartesianCoordinates1.png new file mode 100644 index 0000000..24f33db Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/CartesianCoordinates1.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/CartesianCoordinates2.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/CartesianCoordinates2.png new file mode 100644 index 0000000..e04bb30 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/CartesianCoordinates2.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousBars_Display.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousBars_Display.png new file mode 100644 index 0000000..e79f73e Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousBars_Display.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousBars_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousBars_Example.png new file mode 100644 index 0000000..0f9b02a Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousBars_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousBitmap_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousBitmap_Example.png new file mode 100644 index 0000000..6dc9453 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousBitmap_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousMultiOscilloscope_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousMultiOscilloscope_Example.png new file mode 100644 index 0000000..ae2b35c Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousMultiOscilloscope_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousOscilloscope_Display.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousOscilloscope_Display.png new file mode 100644 index 0000000..bcefb1d Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousOscilloscope_Display.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousOscilloscope_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousOscilloscope_Example.png new file mode 100644 index 0000000..138de8a Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/ContinuousOscilloscope_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_2DTopography.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_2DTopography.dox-part new file mode 100644 index 0000000..70714c0 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_2DTopography.dox-part @@ -0,0 +1,96 @@ +/** + * \page BoxAlgorithm_2DTopography 2D Topography +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_2DTopography_Description| +The 2D Topography box combines EEG measures with topological information. + The input, being signal, spectrum, or any other metric, is mapped to a 2 dimensional plane model of the scalp surface, rendered in a 3D context. + This box is provided with a preconfigured channel localisation file that contains the cartesian coordinates of every electrode positions of the extended 10-20 system. + The mapping is done according to these coordinates using spherical spline interpolation. + A color gradient is used to display the information, and can be customized at will to easily enhance or smooth the contrasts. + Several presets are available, to match the gradients you may be already familiar with when using existing softwares such as Matlab or Elan. + The color gradient is mapped to the current data scale, centered around 0. + + The 2D Topography box shares common concepts and settings with the other boxes in the Mensia Advanced Visualization Toolset. + Additional information are available in the dedicated documentation pages: + - \ref Doc_Mensia_AdvViz_Concepts + - \ref Doc_Mensia_AdvViz_Configuration + + * |OVP_DocEnd_BoxAlgorithm_2DTopography_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_2DTopography_Inputs| + * |OVP_DocEnd_BoxAlgorithm_2DTopography_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_2DTopography_Input1| + The box input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). + Please set the input type according to the actual stream type connected. + * |OVP_DocEnd_BoxAlgorithm_2DTopography_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_2DTopography_Settings| + * |OVP_DocEnd_BoxAlgorithm_2DTopography_Settings| + + * |OVP_DocBegin_BoxAlgorithm_2DTopography_Setting1| + The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. + A default configuration file is provided, and its path stored in the configuration token ${AdvancedViz_ChannelLocalisation}. + * |OVP_DocEnd_BoxAlgorithm_2DTopography_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_2DTopography_Setting2| + Gain (floating-point scalar factor) to apply to the input signal before display. + * |OVP_DocEnd_BoxAlgorithm_2DTopography_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_2DTopography_Setting3| +Label to be displayed on top of the visualization window. + * |OVP_DocEnd_BoxAlgorithm_2DTopography_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_2DTopography_Setting4| + Color gradient to use. This setting can be set manually using the color gradient editor. + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete + - Icon or Icon_Discrete + - Elan or Elan_Discrete + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + + An example of topography rendering using these color gradients can be found \ref Doc_Mensia_AdvViz_Configuration "here". + * |OVP_DocEnd_BoxAlgorithm_2DTopography_Setting4| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_2DTopography_OnlineVisualizationSettings| + At runtime, all the advanced visualization shared settings are exposed, as described in \ref Doc_Mensia_AdvViz_Configuration_RuntimeToolbar. + + For the 2D topography, please note that: + - Select Channels : the selected channel are symbolized with a small white cube, which turns grey when unselected. + + Note that if the box receives a discontinuous data stream, such as a re-epoched signal through stimulation based epoching, the ERP replay features is exposed. + Using the ERP replay allows you to slowly visualize the last epoch received. + * |OVP_DocEnd_BoxAlgorithm_2DTopography_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_2DTopography_Examples| + In the following example, we compute the band power of the signal in the 8-15 Hz frequency range, and average it over the last 32 epochs received. + + You can find a commented scenario in the provided sample set, the scenario file name is \textit{2DTopography.mxs}. + + \image html 2DTopography_Example.png "Example of scenario using the 2D topography" + \image latex 2DTopography_Example.png "Example of scenario using the 2D topography" width=\textwidth + * |OVP_DocEnd_BoxAlgorithm_2DTopography_Examples| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_3DCubes.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_3DCubes.dox-part new file mode 100644 index 0000000..0e32a15 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_3DCubes.dox-part @@ -0,0 +1,93 @@ +/** + * \page BoxAlgorithm_3DCubes 3D Cubes +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DCubes_Description| + The 3D Cubes box displays the data in a topographic view, where each channel (correctly identified and positionned thanks to a channel localisation file) is associated with a cube. + All the cubes are positionned in a 3D space according to the corresponding positions of the electrodes on the scalp. + The input data is displayed through 2 modalities: + - the cubes color + - the cubes size + + The cube size varies according to the same - absolute - range as the color, i.e. high negative or positive values will be + displayed as big cube while values close to zero with be displayed as small cubes. + + The 3D Cubes box shares common concepts and settings with the other boxes in the Mensia Advanced Visualization Toolset. + Additional information are available in the dedicated documentation pages: + - \ref Doc_Mensia_AdvViz_Concepts + - \ref Doc_Mensia_AdvViz_Configuration + + * |OVP_DocEnd_BoxAlgorithm_3DCubes_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DCubes_Inputs| + * |OVP_DocEnd_BoxAlgorithm_3DCubes_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_3DCubes_Input1| + The box input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). + Please set the input type according to the actual stream type connected. + * |OVP_DocEnd_BoxAlgorithm_3DCubes_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DCubes_Settings| + * |OVP_DocEnd_BoxAlgorithm_3DCubes_Settings| + + * |OVP_DocBegin_BoxAlgorithm_3DCubes_Setting1| + The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. + A default configuration file is provided, and its path stored in the configuration token ${AdvancedViz_ChannelLocalisation}. + * |OVP_DocEnd_BoxAlgorithm_3DCubes_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_3DCubes_Setting2| + Gain (floating-point scalar factor) to apply to the input values before display. + * |OVP_DocEnd_BoxAlgorithm_3DCubes_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_3DCubes_Setting3| + Label to be displayed on top of the visualization window. + * |OVP_DocEnd_BoxAlgorithm_3DCubes_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_3DCubes_Setting4| + Color gradient to use. This setting can be set manually using the color gradient editor. + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete + - Icon or Icon_Discrete + - Elan or Elan_Discrete + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + + An example of topography rendering using these color gradients can be found \ref Doc_Mensia_AdvViz_Configuration "here". + * |OVP_DocEnd_BoxAlgorithm_3DCubes_Setting4| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DCubes_OnlineVisualizationSettings| + At runtime, all the advanced visualization shared settings are exposed, as described in \ref Doc_Mensia_AdvViz_Configuration_RuntimeToolbar. + Note that if the box receives a discontinuous data stream, such as a re-epoched signal through stimulation based epoching, the ERP replay features is exposed. + Using the ERP replay allows you to slowly visualize the last epoch received. + * |OVP_DocEnd_BoxAlgorithm_3DCubes_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DCubes_Examples| + In the following example, we compute the band power of the signal in the 8-15 Hz frequency range, and average it over the last 32 epochs received. + + You can find a commented scenario in the provided sample set, the scenario file name is \textit{3DCubes.mxs}. + + \image html 3DCubes_Example.png "Example of scenario using the 3D cubes" + \image latex 3DCubes_Example.png "Example of scenario using the 3D cubes" width=\textwidth + * |OVP_DocEnd_BoxAlgorithm_3DCubes_Examples| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_3DTomographicVisualization.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_3DTomographicVisualization.dox-part new file mode 100644 index 0000000..223a06c --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_3DTomographicVisualization.dox-part @@ -0,0 +1,86 @@ +/** + * \page BoxAlgorithm_3DTomographicVisualization 3D Tomographic Visualization +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DTomographicVisualization_Description| + The 3D Tomographic Visualization is designed to display the output of a signal filtered using the a tomographic reconstruction algorithm such as \ref Doc_BoxAlgorithm_XLORETA. + \ref Doc_BoxAlgorithm_XLORETA computes the spatial filter that transforms an input signal with \f$ C \f$ channels/sensors to \f$ V =\f$ 2394 sources. + These sources form a subdivision of the brain in 3 dimensions, each source being encoded as a small cube (7mm resolution) called voxel. + + The 3D Tomographic Visualization box shares common concepts and settings with the other boxes in the Mensia Advanced Visualization Toolset. + Additional information are available in the dedicated documentation pages: + - \ref Doc_Mensia_AdvViz_Concepts + - \ref Doc_Mensia_AdvViz_Configuration + * |OVP_DocEnd_BoxAlgorithm_3DTomographicVisualization_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DTomographicVisualization_Inputs| + * |OVP_DocEnd_BoxAlgorithm_3DTomographicVisualization_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_3DTomographicVisualization_Input1| + This box expects a source current density power stream coming from \ref Doc_BoxAlgorithm_XLORETA, ie matrices of \f$ V =\f$ 2394 channels, one value per voxel of the reconstruction. + * |OVP_DocEnd_BoxAlgorithm_3DTomographicVisualization_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DTomographicVisualization_Settings| + * |OVP_DocEnd_BoxAlgorithm_3DTomographicVisualization_Settings| + + * |OVP_DocBegin_BoxAlgorithm_3DTomographicVisualization_Setting1| + Gain (floating-point scalar factor) to apply to the input values before display. + * |OVP_DocEnd_BoxAlgorithm_3DTomographicVisualization_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_3DTomographicVisualization_Setting2| + Label to be displayed on top of the visualization window. + * |OVP_DocEnd_BoxAlgorithm_3DTomographicVisualization_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_3DTomographicVisualization_Setting3| + This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + * |OVP_DocEnd_BoxAlgorithm_3DTomographicVisualization_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_3DTomographicVisualization_Setting4| + Color gradient to use. This setting can be set manually using the color gradient editor. + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete + - Icon or Icon_Discrete + - Elan or Elan_Discrete + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + + An example of topography rendering using these color gradients can be found \ref Doc_Mensia_AdvViz_Configuration "here". + * |OVP_DocEnd_BoxAlgorithm_3DTomographicVisualization_Setting4| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DTomographicVisualization_OnlineVisualizationSettings| + At runtime, all the advanced visualization shared settings are exposed, as described in \ref Doc_Mensia_AdvViz_Configuration_RuntimeToolbar. + Note that if the box receives a discontinuous data stream, such as a re-epoched signal through stimulation based epoching, the ERP replay features is exposed. + Using the ERP replay allows you to slowly visualize the last epoch received. + * |OVP_DocEnd_BoxAlgorithm_3DTomographicVisualization_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DTomographicVisualization_Examples| + In the following example, we compute the alpha band power of the signal, and deduce the corresponding sources activity using + an inverse model of the headset (eLORETA), that outputs the source components along x, y and z axis and the source current density power. + + You can find a commented scenario in the provided sample set, the scenario file name is \textit{3DTomographicVisualization.mxs}. + + \image html 3DTomographicVisualization_Example.png "Example of scenario using the 3D Tomographic Visualization" + \image latex 3DTomographicVisualization_Example.png "Example of scenario using the 3D Tomographic Visualization" width=\textwidth + * |OVP_DocEnd_BoxAlgorithm_3DTomographicVisualization_Examples| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_3DTopography.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_3DTopography.dox-part new file mode 100644 index 0000000..c2da63a --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_3DTopography.dox-part @@ -0,0 +1,95 @@ +/** + * \page BoxAlgorithm_3DTopography 3D Topography +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DTopography_Description| + The 3D Topography box combines EEG measures with topological information. + The input, being signal, spectrum, or any other metric, is mapped to a 3D model of the scalp. + This box is provided with a preconfigured channel localisation file that contains the cartesian coordinates of every electrode positions of the extended 10-20 system. + The mapping is done according to these coordinates using spherical spline interpolation. + A color gradient is used to display the information, and can be customized at will to easily enhance or smooth the contrasts. + Several presets are available, to match the gradients you may be already familiar with when using existing softwares such as Matlab or Elan. + The color gradient is mapped to the current data scale, centered around 0. + + The 3D Topography box shares common concepts and settings with the other boxes in the Mensia Advanced Visualization Toolset. + Additional information are available in the dedicated documentation pages: + - \ref Doc_Mensia_AdvViz_Concepts + - \ref Doc_Mensia_AdvViz_Configuration + * |OVP_DocEnd_BoxAlgorithm_3DTopography_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DTopography_Inputs| + * |OVP_DocEnd_BoxAlgorithm_3DTopography_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_3DTopography_Input1| + The box input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). + Please set the input type according to the actual stream type connected. + * |OVP_DocEnd_BoxAlgorithm_3DTopography_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DTopography_Settings| + * |OVP_DocEnd_BoxAlgorithm_3DTopography_Settings| + + * |OVP_DocBegin_BoxAlgorithm_3DTopography_Setting1| + The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. + A default configuration file is provided, and its path stored in the configuration token ${AdvancedViz_ChannelLocalisation}. + * |OVP_DocEnd_BoxAlgorithm_3DTopography_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_3DTopography_Setting2| + Gain (floating-point scalar factor) to apply to the input signal before display. + * |OVP_DocEnd_BoxAlgorithm_3DTopography_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_3DTopography_Setting3| +Label to be displayed on top of the visualization window. + * |OVP_DocEnd_BoxAlgorithm_3DTopography_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_3DTopography_Setting4| + Color gradient to use. This setting can be set manually using the color gradient editor. + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete + - Icon or Icon_Discrete + - Elan or Elan_Discrete + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + + An example of topography rendering using these color gradients can be found \ref Doc_Mensia_AdvViz_Configuration "here". + * |OVP_DocEnd_BoxAlgorithm_3DTopography_Setting4| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DTopography_OnlineVisualizationSettings| + At runtime, all the advanced visualization shared settings are exposed, as described in \ref Doc_Mensia_AdvViz_Configuration_RuntimeToolbar. + + For the 3D topography, please note that: + - Select Channels : the selected channel are symbolized with a small white cube, which turns grey when unselected. + + Note that if the box receives a discontinuous data stream, such as a re-epoched signal through stimulation based epoching, the ERP replay features is exposed. + Using the ERP replay allows you to slowly visualize the last epoch received. + * |OVP_DocEnd_BoxAlgorithm_3DTopography_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DTopography_Examples| + In the following example, we compute the band power of the signal in the 8-15 Hz frequency range, and average it over the last 32 epochs received. + + You can find a commented scenario in the provided sample set, the scenario file name is \textit{3DTopography.mxs}. + + \image html 3DTopography_Example.png "Example of scenario using the 3D topography" + \image latex 3DTopography_Example.png "Example of scenario using the 3D topography" width=\textwidth + * |OVP_DocEnd_BoxAlgorithm_3DTopography_Examples| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_ContinuousBars.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_ContinuousBars.dox-part new file mode 100644 index 0000000..19a36eb --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_ContinuousBars.dox-part @@ -0,0 +1,110 @@ +/** + * \page BoxAlgorithm_ContinuousBars Continuous Bars +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBars_Description| + The Continuous Bars displays input data in form of vertical level bars , one bar per value, one bar series for each channel. + The display is done continuously , meaning that once the end of the horizontal scale is reached, it goes back to the origin. + For lisibility (and esthetical) purpose, the bars are colored in a custom gradient (from left to right). + + The Continuous Bars box shares common concepts and settings with the other boxes in the Mensia Advanced Visualization Toolset . + Additional information are available in the dedicated documentation pages: + - \ref Doc_Mensia_AdvViz_Concepts + - \ref Doc_Mensia_AdvViz_Configuration + * |OVP_DocEnd_BoxAlgorithm_ContinuousBars_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBars_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ContinuousBars_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBars_Input1| + The first input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). + Please set the input type according to the actual stream type connected. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBars_Input1| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBars_Input2| + The second input expect stimulations. They will be displayed as colored vertical lines . + * |OVP_DocEnd_BoxAlgorithm_ContinuousBars_Input2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBars_Settings| + * |OVP_DocEnd_BoxAlgorithm_ContinuousBars_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBars_Setting1| + The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. + A default configuration file is provided, and its path stored in the configuration token ${AdvancedViz_ChannelLocalisation}. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBars_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBars_Setting2| + Select Time Locked for a continuous data stream, and specify the time scale below. + Select Independent for a discontinuous data stream, and specify the matrix count below. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBars_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBars_Setting3| + The time scale in seconds, before the displays goes back to the origin. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBars_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBars_Setting4| + The number of input matrices to receive before the displays goes back to the origin. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBars_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBars_Setting5| + If this checkbox is ticked, the vertical scale is shifted so that 0 is at the bottom. Only positive values will be displayed. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBars_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBars_Setting6| + Gain (floating-point scalar factor) to apply to the input values before display. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBars_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBars_Setting7| + Label to be displayed on top of the visualization window. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBars_Setting7| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBars_Setting8| + This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + * |OVP_DocEnd_BoxAlgorithm_ContinuousBars_Setting8| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBars_Setting9| + Color gradient to use. This setting can be set manually using the color gradient editor. + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete + - Icon or Icon_Discrete + - Elan or Elan_Discrete + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + + An example of topography rendering using these color gradients can be found \ref Doc_Mensia_AdvViz_Configuration "here". + * |OVP_DocEnd_BoxAlgorithm_ContinuousBars_Setting9| +_________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBars_OnlineVisualizationSettings| + At runtime, all the advanced visualization shared settings are exposed, as described in \ref Doc_Mensia_AdvViz_Configuration_RuntimeToolbar. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBars_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBars_Examples| + In the following example, we compute the band power of the bipolar channel C3-C4 in the 8-15 Hz frequency range, and average it over the last 32 epochs received. + + You can find a commented scenario in the provided sample set, the scenario file name is \textit{ContinuousBars.mxs}. + + \image html ContinuousBars_Example.png "Example of scenario using the Continuous Bars" + \image latex ContinuousBars_Example.png "Example of scenario using the Continuous Bars" width=\textwidth + * |OVP_DocEnd_BoxAlgorithm_ContinuousBars_Examples| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_ContinuousBitmap.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_ContinuousBitmap.dox-part new file mode 100644 index 0000000..a31a7dd --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_ContinuousBitmap.dox-part @@ -0,0 +1,109 @@ +/** + * \page BoxAlgorithm_ContinuousBitmap Continuous Bitmap +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBitmap_Description| + The Continuous Bitmap displays input data in form of a 2D map of colored blocks (or bitmap). + The display is done continuously , meaning that once the end of the horizontal scale is reached, it goes back to the origin. + + The Continuous Bitmap box shares common concepts and settings with the other boxes in the Mensia Advanced Visualization Toolset . + Additional information are available in the dedicated documentation pages: + - \ref Doc_Mensia_AdvViz_Concepts + - \ref Doc_Mensia_AdvViz_Configuration + * |OVP_DocEnd_BoxAlgorithm_ContinuousBitmap_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBitmap_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ContinuousBitmap_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBitmap_Input1| + The first input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). + Please set the input type according to the actual stream type connected. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBitmap_Input1| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBitmap_Input2| + The second input expect stimulations. They will be displayed as red vertical lines . + * |OVP_DocEnd_BoxAlgorithm_ContinuousBitmap_Input2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBitmap_Settings| + * |OVP_DocEnd_BoxAlgorithm_ContinuousBitmap_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBitmap_Setting1| + The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. + A default configuration file is provided, and its path stored in the configuration token ${AdvancedViz_ChannelLocalisation}. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBitmap_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBitmap_Setting2| + Select Time Locked for a continuous data stream, and specify the time scale below. + Select Independent for a discontinuous data stream, and specify the matrix count below. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBitmap_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBitmap_Setting3| + The time scale in seconds, before the displays goes back to the origin. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBitmap_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBitmap_Setting4| + The number of input matrices to receive before the displays goes back to the origin. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBitmap_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBitmap_Setting5| + If this checkbox is ticked, the vertical scale is shifted so that 0 is at the bottom. Only positive values will be displayed. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBitmap_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBitmap_Setting6| + Gain (floating-point scalar factor) to apply to the input values before display. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBitmap_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBitmap_Setting7| + Label to be displayed on top of the visualization window. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBitmap_Setting7| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBitmap_Setting8| + This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + * |OVP_DocEnd_BoxAlgorithm_ContinuousBitmap_Setting8| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBitmap_Setting9| + Color gradient to use. This setting can be set manually using the color gradient editor. + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete + - Icon or Icon_Discrete + - Elan or Elan_Discrete + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + + An example of topography rendering using these color gradients can be found \ref Doc_Mensia_AdvViz_Configuration "here". + * |OVP_DocEnd_BoxAlgorithm_ContinuousBitmap_Setting9| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBitmap_OnlineVisualizationSettings| + At runtime, all the advanced visualization shared settings are exposed, as described in \ref Doc_Mensia_AdvViz_Configuration_RuntimeToolbar. + * |OVP_DocEnd_BoxAlgorithm_ContinuousBitmap_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousBitmap_Examples| + In the following example, we compute the band power of the input signal in the 8-15 Hz frequency range, and average it over the last 32 epochs received. + + You can find a commented scenario in the provided sample set, the scenario file name is \textit{ContinuousBitmap.mxs}. + + \image html ContinuousBitmap_Example.png "Example of scenario using the Continuous Bitmap" + \image latex ContinuousBitmap_Example.png "Example of scenario using the Continuous Bitmap" width=\textwidth + * |OVP_DocEnd_BoxAlgorithm_ContinuousBitmap_Examples| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_ContinuousMultiOscilloscope.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_ContinuousMultiOscilloscope.dox-part new file mode 100644 index 0000000..c5f300a --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_ContinuousMultiOscilloscope.dox-part @@ -0,0 +1,110 @@ +/** + * \page BoxAlgorithm_ContinuousMultiOscilloscope Continuous Multi Oscilloscope +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousMultiOscilloscope_Description| + The Continuous Multi-Oscilloscope displays temporal numerical data in the form of curves, on the same vertical axis. + Each channel is given a color according to a color gradient, rendered additively. + The display is done continuously , meaning that once the end of the horizontal scale is reached, it goes back to the origin. + + The Continuous Multi-Oscilloscope box shares common concepts and settings with the other boxes in the Mensia Advanced Visualization Toolset . + Additional information are available in the dedicated documentation pages: + - \ref Doc_Mensia_AdvViz_Concepts + - \ref Doc_Mensia_AdvViz_Configuration + * |OVP_DocEnd_BoxAlgorithm_ContinuousMultiOscilloscope_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousMultiOscilloscope_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ContinuousMultiOscilloscope_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousMultiOscilloscope_Input1| + The first input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). + Please set the input type according to the actual stream type connected. + * |OVP_DocEnd_BoxAlgorithm_ContinuousMultiOscilloscope_Input1| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousMultiOscilloscope_Input2| + The second input expect stimulations. They will be displayed as red vertical lines . + * |OVP_DocEnd_BoxAlgorithm_ContinuousMultiOscilloscope_Input2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousMultiOscilloscope_Settings| + * |OVP_DocEnd_BoxAlgorithm_ContinuousMultiOscilloscope_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousMultiOscilloscope_Setting1| + The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. + A default configuration file is provided, and its path stored in the configuration token ${AdvancedViz_ChannelLocalisation}. + * |OVP_DocEnd_BoxAlgorithm_ContinuousMultiOscilloscope_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousMultiOscilloscope_Setting2| + Select Time Locked for a continuous data stream, and specify the time scale below. + Select Independent for a discontinuous data stream, and specify the matrix count below. + * |OVP_DocEnd_BoxAlgorithm_ContinuousMultiOscilloscope_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousMultiOscilloscope_Setting3| + The time scale in seconds, before the displays goes back to the origin. + * |OVP_DocEnd_BoxAlgorithm_ContinuousMultiOscilloscope_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousMultiOscilloscope_Setting4| + The number of input matrices to receive before the displays goes back to the origin. + * |OVP_DocEnd_BoxAlgorithm_ContinuousMultiOscilloscope_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousMultiOscilloscope_Setting5| + If this checkbox is ticked, the vertical scale is shifted so that 0 is at the bottom. Only positive values will be displayed. + * |OVP_DocEnd_BoxAlgorithm_ContinuousMultiOscilloscope_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousMultiOscilloscope_Setting6| + Gain (floating-point scalar factor) to apply to the input values before display. + * |OVP_DocEnd_BoxAlgorithm_ContinuousMultiOscilloscope_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousMultiOscilloscope_Setting7| + Label to be displayed on top of the visualization window. + * |OVP_DocEnd_BoxAlgorithm_ContinuousMultiOscilloscope_Setting7| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousMultiOscilloscope_Setting8| + This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + * |OVP_DocEnd_BoxAlgorithm_ContinuousMultiOscilloscope_Setting8| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousMultiOscilloscope_Setting9| + Color gradient to use. This setting can be set manually using the color gradient editor. + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete + - Icon or Icon_Discrete + - Elan or Elan_Discrete + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + + An example of topography rendering using these color gradients can be found \ref Doc_Mensia_AdvViz_Configuration "here". + * |OVP_DocEnd_BoxAlgorithm_ContinuousMultiOscilloscope_Setting9| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousMultiOscilloscope_OnlineVisualizationSettings| + At runtime, all the advanced visualization shared settings are exposed, as described in \ref Doc_Mensia_AdvViz_Configuration_RuntimeToolbar. + * |OVP_DocEnd_BoxAlgorithm_ContinuousMultiOscilloscope_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousMultiOscilloscope_Examples| + In the following example, we compute the band power of the input signal in the 8-15 Hz frequency range, and average it over the last 32 epochs received. + + You can find a commented scenario in the provided sample set, the scenario file name is \textit{ContinuousMultiOscilloscope.mxs}. + + \image html ContinuousMultiOscilloscope_Example.png "Example of scenario using the Continuous Multi-Oscilloscope" + \image latex ContinuousMultiOscilloscope_Example.png "Example of scenario using the Continuous Multi-Oscilloscope" width=\textwidth + * |OVP_DocEnd_BoxAlgorithm_ContinuousMultiOscilloscope_Examples| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_ContinuousOscilloscope.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_ContinuousOscilloscope.dox-part new file mode 100644 index 0000000..1c8e603 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_ContinuousOscilloscope.dox-part @@ -0,0 +1,110 @@ +/** + * \page BoxAlgorithm_ContinuousOscilloscope Continuous Oscilloscope +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousOscilloscope_Description| + The Continuous Oscilloscope displays temporal numerical data in the form of curves, all the channels being distributed vertically, each one with its own horizontal axis. + Channel are given a color, overlaps are rendered additively. + The display is done continuously , meaning that once the end of the horizontal scale is reached, it goes back to the origin. + + The Continuous Oscilloscope box shares common concepts and settings with the other boxes in the Mensia Advanced Visualization Toolset . + Additional information are available in the dedicated documentation pages: + - \ref Doc_Mensia_AdvViz_Concepts + - \ref Doc_Mensia_AdvViz_Configuration + * |OVP_DocEnd_BoxAlgorithm_ContinuousOscilloscope_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousOscilloscope_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ContinuousOscilloscope_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousOscilloscope_Input1| + The first input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). + Please set the input type according to the actual stream type connected. + * |OVP_DocEnd_BoxAlgorithm_ContinuousOscilloscope_Input1| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousOscilloscope_Input2| + The second input expect stimulations. They will be displayed as red vertical lines . + * |OVP_DocEnd_BoxAlgorithm_ContinuousOscilloscope_Input2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousOscilloscope_Settings| + * |OVP_DocEnd_BoxAlgorithm_ContinuousOscilloscope_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousOscilloscope_Setting1| + The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. + A default configuration file is provided, and its path stored in the configuration token ${AdvancedViz_ChannelLocalisation}. + * |OVP_DocEnd_BoxAlgorithm_ContinuousOscilloscope_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousOscilloscope_Setting2| + Select Time Locked for a continuous data stream, and specify the time scale below. + Select Independent for a discontinuous data stream, and specify the matrix count below. + * |OVP_DocEnd_BoxAlgorithm_ContinuousOscilloscope_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousOscilloscope_Setting3| + The time scale in seconds, before the displays goes back to the origin. + * |OVP_DocEnd_BoxAlgorithm_ContinuousOscilloscope_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousOscilloscope_Setting4| + The number of input matrices to receive before the displays goes back to the origin. + * |OVP_DocEnd_BoxAlgorithm_ContinuousOscilloscope_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousOscilloscope_Setting5| + If this checkbox is ticked, the vertical scale is shifted so that 0 is at the bottom. Only positive values will be displayed. + * |OVP_DocEnd_BoxAlgorithm_ContinuousOscilloscope_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousOscilloscope_Setting6| + Gain (floating-point scalar factor) to apply to the input values before display. + * |OVP_DocEnd_BoxAlgorithm_ContinuousOscilloscope_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousOscilloscope_Setting7| + Label to be displayed on top of the visualization window. + * |OVP_DocEnd_BoxAlgorithm_ContinuousOscilloscope_Setting7| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousOscilloscope_Setting8| + This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + * |OVP_DocEnd_BoxAlgorithm_ContinuousOscilloscope_Setting8| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousOscilloscope_Setting9| + Color gradient to use. This setting can be set manually using the color gradient editor. + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete + - Icon or Icon_Discrete + - Elan or Elan_Discrete + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + + An example of topography rendering using these color gradients can be found \ref Doc_Mensia_AdvViz_Configuration "here". + * |OVP_DocEnd_BoxAlgorithm_ContinuousOscilloscope_Setting9| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousOscilloscope_OnlineVisualizationSettings| + At runtime, all the advanced visualization shared settings are exposed, as described in \ref Doc_Mensia_AdvViz_Configuration_RuntimeToolbar. + * |OVP_DocEnd_BoxAlgorithm_ContinuousOscilloscope_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousOscilloscope_Examples| + In the following example, we filter the input signal in the 8-15 Hz frequency range and simply display it. + + You can find a commented scenario in the provided sample set, the scenario file name is \textit{ContinuousOscilloscope.mxs}. + + \image html ContinuousOscilloscope_Example.png "Example of scenario using the Continuous Oscilloscope" + \image latex ContinuousOscilloscope_Example.png "Example of scenario using the Continuous Oscilloscope" width=\textwidth + * |OVP_DocEnd_BoxAlgorithm_ContinuousOscilloscope_Examples| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_ContinuousXYZPlot.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_ContinuousXYZPlot.dox-part new file mode 100644 index 0000000..4b755a4 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_ContinuousXYZPlot.dox-part @@ -0,0 +1,103 @@ +/** + * \page BoxAlgorithm_ContinuousXYZPlot Continuous XYZ Plot +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousXYZPlot_Description| + The Continuous XYZ Plot displays temporal numerical data in a 2D (resp. 3D) space, consecutive rows of the input matrix being grouped by 2 (resp. 3) to form the 2D (resp. 3D) trajectories. + The display is done continuously, meaning that trajectories are persitent along time. Moreover, colors change as a function of time (samples order). + + The Continuous XYZ Plot box shares common concepts and settings with the other boxes in the Mensia Advanced Visualization Toolset . + Additional information are available in the dedicated documentation pages: + - \ref Doc_Mensia_AdvViz_Concepts + - \ref Doc_Mensia_AdvViz_Configuration + * |OVP_DocEnd_BoxAlgorithm_ContinuousXYZPlot_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousXYZPlot_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ContinuousXYZPlot_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousXYZPlot_Input1| + The first input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). + Please set the input type according to the actual stream type connected. + * |OVP_DocEnd_BoxAlgorithm_ContinuousXYZPlot_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousXYZPlot_Settings| + * |OVP_DocEnd_BoxAlgorithm_ContinuousXYZPlot_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousXYZPlot_Setting1| + Select Time Locked for a continuous data stream, and specify the time scale below. + Select Independent for a discontinuous data stream, and specify the matrix count below. + * |OVP_DocEnd_BoxAlgorithm_ContinuousXYZPlot_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousXYZPlot_Setting2| + The time scale in seconds, before the displays goes back to the origin. + * |OVP_DocEnd_BoxAlgorithm_ContinuousXYZPlot_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousXYZPlot_Setting3| + The number of input matrices to receive before the displays goes back to the origin. + * |OVP_DocEnd_BoxAlgorithm_ContinuousXYZPlot_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousXYZPlot_Setting4| + Gain (floating-point scalar factor) to apply to the input values before display. + * |OVP_DocEnd_BoxAlgorithm_ContinuousXYZPlot_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousXYZPlot_Setting5| + Label to be displayed on top of the visualization window. + * |OVP_DocEnd_BoxAlgorithm_ContinuousXYZPlot_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousXYZPlot_Setting6| + This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + * |OVP_DocEnd_BoxAlgorithm_ContinuousXYZPlot_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousXYZPlot_Setting7| + If this checkbox is ticked, the axis and the grid are displayed. + * |OVP_DocEnd_BoxAlgorithm_ContinuousXYZPlot_Setting7| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousXYZPlot_Setting8| + If this checkbox is ticked, trajectories are plotted in a 3D space, otherwise in a 2D space. + * |OVP_DocEnd_BoxAlgorithm_ContinuousXYZPlot_Setting8| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousXYZPlot_Setting9| + Color gradient to use. This setting can be set manually using the color gradient editor. + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete + - Icon or Icon_Discrete + - Elan or Elan_Discrete + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + * |OVP_DocEnd_BoxAlgorithm_ContinuousXYZPlot_Setting9| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousXYZPlot_OnlineVisualizationSettings| + At runtime, all the advanced visualization shared settings are exposed, as described in \ref Doc_Mensia_AdvViz_Configuration_RuntimeToolbar. + * |OVP_DocEnd_BoxAlgorithm_ContinuousXYZPlot_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousXYZPlot_Examples| + * |OVP_DocEnd_BoxAlgorithm_ContinuousXYZPlot_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousXYZPlot_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_ContinuousXYZPlot_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantBars.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantBars.dox-part new file mode 100644 index 0000000..71d134d --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantBars.dox-part @@ -0,0 +1,95 @@ +/** + * \page BoxAlgorithm_InstantBars Instant Bars +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantBars_Description| + The Instant Bars box displays input data in form of vertical level bars , one bar per value, one series of bar for each channel. + The display is done instantly , meaning that whenever a new data block arrives, it is displayed in the visualization windows, filling all the vertical space. + For lisibility (and esthetical) purpose, the bars are colored in a custom gradient (from left to right). + + This box is especially suitable for displaying spectrum . + + The Instant Bars box shares common concepts and settings with the other boxes of the Mensia Advanced Visualization Toolset . + Additional information are available in the dedicated documentation pages: + - \ref Doc_Mensia_AdvViz_Concepts + - \ref Doc_Mensia_AdvViz_Configuration + * |OVP_DocEnd_BoxAlgorithm_InstantBars_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantBars_Inputs| + * |OVP_DocEnd_BoxAlgorithm_InstantBars_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_InstantBars_Input1| + The input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). + Please set the input type according to the actual stream type connected. + * |OVP_DocEnd_BoxAlgorithm_InstantBars_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantBars_Settings| + * |OVP_DocEnd_BoxAlgorithm_InstantBars_Settings| + + * |OVP_DocBegin_BoxAlgorithm_InstantBars_Setting1| + The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. + A default configuration file is provided, and its path stored in the configuration token ${AdvancedViz_ChannelLocalisation}. + * |OVP_DocEnd_BoxAlgorithm_InstantBars_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_InstantBars_Setting2| + If this checkbox is ticked, the vertical scale is shifted so that 0 is at the bottom. Only positive values will be displayed. + * |OVP_DocEnd_BoxAlgorithm_InstantBars_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_InstantBars_Setting3| + Gain (floating-point scalar factor) to apply to the input values before display. + * |OVP_DocEnd_BoxAlgorithm_InstantBars_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_InstantBars_Setting4| + Label to be displayed on top of the visualization window. + * |OVP_DocEnd_BoxAlgorithm_InstantBars_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_InstantBars_Setting5| + This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + * |OVP_DocEnd_BoxAlgorithm_InstantBars_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_InstantBars_Setting6| + Color gradient to use. This setting can be set manually using the color gradient editor. + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete + - Icon or Icon_Discrete + - Elan or Elan_Discrete + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + + An example of topography rendering using these color gradients can be found \ref Doc_Mensia_AdvViz_Configuration "here". + * |OVP_DocEnd_BoxAlgorithm_InstantBars_Setting6| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantBars_OnlineVisualizationSettings| + At runtime, all the advanced visualization shared settings are exposed, as described in \ref Doc_Mensia_AdvViz_Configuration_RuntimeToolbar. + * |OVP_DocEnd_BoxAlgorithm_InstantBars_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantBars_Examples| + In the following example, we compute the FFT of the input EEG signal and display it. + + You can find a commented scenario in the provided sample set, the scenario file name is \textit{InstantBars.mxs}. + + \image html InstantBars_Example.png "Example of scenario using the Instant Bars to display spectrum" + \image latex InstantBars_Example.png "Example of scenario using the Instant Bars to display spectrum" width=\textwidth + * |OVP_DocEnd_BoxAlgorithm_InstantBars_Examples| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantBitmap.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantBitmap.dox-part new file mode 100644 index 0000000..40136f4 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantBitmap.dox-part @@ -0,0 +1,85 @@ +/** + * \page BoxAlgorithm_InstantBitmap Instant Bitmap +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap_Description| + The Instant Bitmap box displays input data in form of a 2D map of colored blocks (or bitmap). + The display is done instantly , meaning that whenever a new data block arrives, it is displayed in the visualization windows, filling all the horizontal space. + The bitmap colors are chosen according to a custom gradient. + + The Instant Bitmap box shares common concepts and settings with the other boxes of the Mensia Advanced Visualization Toolset . + Additional information are available in the dedicated documentation pages: + - \ref Doc_Mensia_AdvViz_Concepts + - \ref Doc_Mensia_AdvViz_Configuration + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap_Inputs| + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap_Input1| + The input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). + Please set the input type according to the actual stream type connected. + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap_Settings| + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap_Settings| + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap_Setting1| + The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. + A default configuration file is provided, and its path stored in the configuration token ${AdvancedViz_ChannelLocalisation}. + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap_Setting2| + Gain (floating-point scalar factor) to apply to the input values before display. + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap_Setting3| + Label to be displayed on top of the visualization window. + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap_Setting4| + Color gradient to use. This setting can be set manually using the color gradient editor. + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete + - Icon or Icon_Discrete + - Elan or Elan_Discrete + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + + An example of topography rendering using these color gradients can be found \ref Doc_Mensia_AdvViz_Configuration "here". + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap_Setting4| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap_OnlineVisualizationSettings| + At runtime, all the advanced visualization shared settings are exposed, as described in \ref Doc_Mensia_AdvViz_Configuration_RuntimeToolbar. + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap_Examples| + In the following example, we compute the FFT of the input EEG signal and display it. + + You can find a commented scenario in the provided sample set, the scenario file name is \textit{InstantBitmap.mxs}. + + \image html InstantBitmap_Example.png "Example of scenario using the Instant Bitmap to display spectrum" + \image latex InstantBitmap_Example.png "Example of scenario using the Instant Bitmap to display spectrum" width=\textwidth + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap_Examples| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantBitmap3DStream.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantBitmap3DStream.dox-part new file mode 100644 index 0000000..6c2b5b9 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantBitmap3DStream.dox-part @@ -0,0 +1,83 @@ +/** + * \page BoxAlgorithm_InstantBitmap3DStream Instant Bitmap (3D Stream) +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap3DStream_Description| + The Instant Bitmap (3D Stream) box displays input data in form of 2D maps of colored blocks (or bitmap). + Each time a matrix is received, its contents are displayed to fill the visualization. Depending on the input type, the three dimensions of the matrix will be ordonned differently. + The bitmap colors are chosen according to a custom gradient. + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap3DStream_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap3DStream_Inputs| + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap3DStream_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap3DStream_Input1| + The input matrices to be displayed. Currently this box supports only the Time-Frequency stream. + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap3DStream_Input1| + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap3DStream_Input2| + The second input expects stimulations. They will be displayed as colored vertical lines. + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap3DStream_Input2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap3DStream_Settings| + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap3DStream_Settings| + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap3DStream_Setting1| + The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. + A default configuration file is provided, and its path stored in the configuration token ${AdvancedViz_ChannelLocalisation}. + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap3DStream_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap3DStream_Setting2| + Gain (floating-point scalar factor) to apply to the input values before display. + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap3DStream_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap3DStream_Setting3| + Label to be displayed on top of the visualization window. + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap3DStream_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap3DStream_Setting4| + Color gradient to use. This setting can be set manually using the color gradient editor. + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete + - Icon or Icon_Discrete + - Elan or Elan_Discrete + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + + An example of topography rendering using these color gradients can be found \ref Doc_Mensia_AdvViz_Configuration "here". + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap3DStream_Setting4| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap3DStream_OnlineVisualizationSettings| + At runtime, all the advanced visualization shared settings are exposed, as described in \ref Doc_Mensia_AdvViz_Configuration_RuntimeToolbar. + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap3DStream_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantBitmap3DStream_Examples| + In the following example, we compute the Time-Frequency Analysis for a generated signal. + You can find a commented scenario in the provided sample set, the scenario file name is InstantBitmap3DStream.mxs. + + + \image html InstantBitmap3DStream_Example.png "Example of scenario using the Instant Bitmap (3D Stream)" + \image latex InstantBitmap3DStream_Example.png "Example of scenario using the Instant Bitmap (3D Stream)" width=\textwidth + * |OVP_DocEnd_BoxAlgorithm_InstantBitmap3DStream_Examples| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantMultiOscilloscope.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantMultiOscilloscope.dox-part new file mode 100644 index 0000000..12cce89 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantMultiOscilloscope.dox-part @@ -0,0 +1,94 @@ +/** + * \page BoxAlgorithm_InstantMultiOscilloscope Instant Multi Oscilloscope +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantMultiOscilloscope_Description| + The Instant Multi-Oscilloscope displays temporal numerical data in the form of curves, on the same vertical axis. + Each channel is given a color according to a color gradient, rendered additively. + The display is done instantly , meaning that whenever a new data block arrives, it is displayed in the visualization windows, filling all the horizontal space. + + The Instant Multi-Oscilloscope box shares common concepts and settings with the other boxes in the Mensia Advanced Visualization Toolset . + Additional information are available in the dedicated documentation pages: + - \ref Doc_Mensia_AdvViz_Concepts + - \ref Doc_Mensia_AdvViz_Configuration + * |OVP_DocEnd_BoxAlgorithm_InstantMultiOscilloscope_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantMultiOscilloscope_Inputs| + * |OVP_DocEnd_BoxAlgorithm_InstantMultiOscilloscope_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_InstantMultiOscilloscope_Input1| + The input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). + Please set the input type according to the actual stream type connected. + * |OVP_DocEnd_BoxAlgorithm_InstantMultiOscilloscope_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantMultiOscilloscope_Settings| + * |OVP_DocEnd_BoxAlgorithm_InstantMultiOscilloscope_Settings| + + * |OVP_DocBegin_BoxAlgorithm_InstantMultiOscilloscope_Setting1| + The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. + A default configuration file is provided, and its path stored in the configuration token ${AdvancedViz_ChannelLocalisation}. + * |OVP_DocEnd_BoxAlgorithm_InstantMultiOscilloscope_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_InstantMultiOscilloscope_Setting2| + If this checkbox is ticked, the vertical scale is shifted so that 0 is at the bottom. Only positive values will be displayed. + * |OVP_DocEnd_BoxAlgorithm_InstantMultiOscilloscope_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_InstantMultiOscilloscope_Setting3| + Gain (floating-point scalar factor) to apply to the input values before display. + * |OVP_DocEnd_BoxAlgorithm_InstantMultiOscilloscope_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_InstantMultiOscilloscope_Setting4| + Label to be displayed on top of the visualization window. + * |OVP_DocEnd_BoxAlgorithm_InstantMultiOscilloscope_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_InstantMultiOscilloscope_Setting5| + This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + * |OVP_DocEnd_BoxAlgorithm_InstantMultiOscilloscope_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_InstantMultiOscilloscope_Setting6| + Color gradient to use. This setting can be set manually using the color gradient editor. + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete + - Icon or Icon_Discrete + - Elan or Elan_Discrete + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + + An example of topography rendering using these color gradients can be found \ref Doc_Mensia_AdvViz_Configuration "here". + * |OVP_DocEnd_BoxAlgorithm_InstantMultiOscilloscope_Setting6| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantMultiOscilloscope_OnlineVisualizationSettings| + At runtime, all the advanced visualization shared settings are exposed, as described in \ref Doc_Mensia_AdvViz_Configuration_RuntimeToolbar. + * |OVP_DocEnd_BoxAlgorithm_InstantMultiOscilloscope_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantMultiOscilloscope_Examples| + In the following example, we compute the FFT of the average right hand trial in a Motor Imagery session, + and visualize the spectrum around left and right motor cortices through 2 Laplacian filters around C3 and C4. + + You can find a commented scenario in the provided sample set, the scenario file name is \textit{InstantMultiOscilloscope.mxs}. + + \image html InstantMultiOscilloscope_Example.png "Example of scenario using the Instant Multi-Oscilloscope" + \image latex InstantMultiOscilloscope_Example.png "Example of scenario using the Instant Multi-Oscilloscope" width=\textwidth + * |OVP_DocEnd_BoxAlgorithm_InstantMultiOscilloscope_Examples| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantOscilloscope.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantOscilloscope.dox-part new file mode 100644 index 0000000..18e71c0 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantOscilloscope.dox-part @@ -0,0 +1,94 @@ +/** + * \page BoxAlgorithm_InstantOscilloscope Instant Oscilloscope +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantOscilloscope_Description| + The Instant Oscilloscope displays temporal numerical data in the form of curves. + The display is done instantly , meaning that whenever a new data block arrives, it is displayed in the visualization windows, filling all the horizontal space. + + The Instant Oscilloscope box shares common concepts and settings with the other boxes in the Mensia Advanced Visualization Toolset . + Additional information are available in the dedicated documentation pages: + - \ref Doc_Mensia_AdvViz_Concepts + - \ref Doc_Mensia_AdvViz_Configuration + * |OVP_DocEnd_BoxAlgorithm_InstantOscilloscope_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantOscilloscope_Inputs| + This box supports input modification: you can add or remove inputs at will. + * |OVP_DocEnd_BoxAlgorithm_InstantOscilloscope_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_InstantOscilloscope_Input1| + The input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). + Please set the input type according to the actual stream type connected. + * |OVP_DocEnd_BoxAlgorithm_InstantOscilloscope_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantOscilloscope_Settings| + * |OVP_DocEnd_BoxAlgorithm_InstantOscilloscope_Settings| + + * |OVP_DocBegin_BoxAlgorithm_InstantOscilloscope_Setting1| + The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. + A default configuration file is provided, and its path stored in the configuration token ${AdvancedViz_ChannelLocalisation}. + * |OVP_DocEnd_BoxAlgorithm_InstantOscilloscope_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_InstantOscilloscope_Setting2| + If this checkbox is ticked, the vertical scale is shifted so that 0 is at the bottom. Only positive values will be displayed. + * |OVP_DocEnd_BoxAlgorithm_InstantOscilloscope_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_InstantOscilloscope_Setting3| + Gain (floating-point scalar factor) to apply to the input values before display. + * |OVP_DocEnd_BoxAlgorithm_InstantOscilloscope_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_InstantOscilloscope_Setting4| + Label to be displayed on top of the visualization window. + * |OVP_DocEnd_BoxAlgorithm_InstantOscilloscope_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_InstantOscilloscope_Setting5| + This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + * |OVP_DocEnd_BoxAlgorithm_InstantOscilloscope_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_InstantOscilloscope_Setting6| + Color gradient to use. This setting can be set manually using the color gradient editor. + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete + - Icon or Icon_Discrete + - Elan or Elan_Discrete + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + + An example of topography rendering using these color gradients can be found \ref Doc_Mensia_AdvViz_Configuration "here". + * |OVP_DocEnd_BoxAlgorithm_InstantOscilloscope_Setting6| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantOscilloscope_OnlineVisualizationSettings| + At runtime, all the advanced visualization shared settings are exposed, as described in \ref Doc_Mensia_AdvViz_Configuration_RuntimeToolbar. + * |OVP_DocEnd_BoxAlgorithm_InstantOscilloscope_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantOscilloscope_Examples| + In the following example, we compute the FFT of the average right hand trial in a Motor Imagery session, + and visualize the spectrum around left and right motor cortices through 2 Laplacian filters around C3 and C4. + + You can find a commented scenario in the provided sample set, the scenario file name is \textit{InstantOscilloscope.mxs}. + + \image html InstantOscilloscope_Example.png "Example of scenario using the Instant Oscilloscope" + \image latex InstantOscilloscope_Example.png "Example of scenario using the Instant Oscilloscope" width=\textwidth + * |OVP_DocEnd_BoxAlgorithm_InstantOscilloscope_Examples| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantXYZPlot.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantXYZPlot.dox-part new file mode 100644 index 0000000..333ca78 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_InstantXYZPlot.dox-part @@ -0,0 +1,90 @@ +/** + * \page BoxAlgorithm_InstantXYZPlot Instant XYZ Plot +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantXYZPlot_Description| + The Instant XYZ Plot displays temporal numerical data in a 2D (resp. 3D) space, consecutive rows of the input matrix being grouped by 2 (resp. 3) to form the 2D (resp. 3D) trajectories. + The display is done instantly, meaning that whenever a new data block arrives, it is displayed in the visualization windows, without previous trajectories. Moreover, colors change as a function of time (samples order). + + The Instant XYZ Plot box shares common concepts and settings with the other boxes in the Mensia Advanced Visualization Toolset . + Additional information are available in the dedicated documentation pages: + - \ref Doc_Mensia_AdvViz_Concepts + - \ref Doc_Mensia_AdvViz_Configuration + * |OVP_DocEnd_BoxAlgorithm_InstantXYZPlot_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantXYZPlot_Inputs| + * |OVP_DocEnd_BoxAlgorithm_InstantXYZPlot_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_InstantXYZPlot_Input1| + The input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). + Please set the input type according to the actual stream type connected. + * |OVP_DocEnd_BoxAlgorithm_InstantXYZPlot_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantXYZPlot_Settings| + * |OVP_DocEnd_BoxAlgorithm_InstantXYZPlot_Settings| + + * |OVP_DocBegin_BoxAlgorithm_InstantXYZPlot_Setting1| + Gain (floating-point scalar factor) to apply to the input values before display. + * |OVP_DocEnd_BoxAlgorithm_InstantXYZPlot_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_InstantXYZPlot_Setting2| + Label to be displayed on top of the visualization window. + * |OVP_DocEnd_BoxAlgorithm_InstantXYZPlot_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_InstantXYZPlot_Setting3| + This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + * |OVP_DocEnd_BoxAlgorithm_InstantXYZPlot_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_InstantXYZPlot_Setting4| + If this checkbox is ticked, the axis and the grid are displayed. + * |OVP_DocEnd_BoxAlgorithm_InstantXYZPlot_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_InstantXYZPlot_Setting5| + If this checkbox is ticked, trajectories are plotted in a 3D space, otherwise in a 2D space. + * |OVP_DocEnd_BoxAlgorithm_InstantXYZPlot_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_InstantXYZPlot_Setting6| + Color gradient to use. This setting can be set manually using the color gradient editor. + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete + - Icon or Icon_Discrete + - Elan or Elan_Discrete + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + * |OVP_DocEnd_BoxAlgorithm_InstantXYZPlot_Setting6| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantXYZPlot_OnlineVisualizationSettings| + At runtime, all the advanced visualization shared settings are exposed, as described in \ref Doc_Mensia_AdvViz_Configuration_RuntimeToolbar. + * |OVP_DocEnd_BoxAlgorithm_InstantXYZPlot_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantXYZPlot_Examples| + * |OVP_DocEnd_BoxAlgorithm_InstantXYZPlot_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InstantXYZPlot_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_InstantXYZPlot_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_StackedBitmapHorizontal.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_StackedBitmapHorizontal.dox-part new file mode 100644 index 0000000..86c317e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_StackedBitmapHorizontal.dox-part @@ -0,0 +1,104 @@ +/** + * \page BoxAlgorithm_StackedBitmapHorizontal Stacked Bitmap (Horizontal) +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapHorizontal_Description| + The Stacked Bitmap (Horizontal) box displays input data in form of 2D maps of colored blocks (or bitmap). + All the bitmaps are stacked horizontally, starting from the left edge of the window. + Whenever a new data block arrives, it is added to the visualization windows. If the end of the matrix count scale is reached, it goes back to the origin. + The bitmap colors are chosen according to a custom gradient. + + The Stacked Bitmap (Horizontal) box shares common concepts and settings with the other boxes of the Mensia Advanced Visualization Toolset . + Additional information are available in the dedicated documentation pages: + - \ref Doc_Mensia_AdvViz_Concepts + - \ref Doc_Mensia_AdvViz_Configuration + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapHorizontal_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapHorizontal_Inputs| + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapHorizontal_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapHorizontal_Input1| + The first input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). + Please set the input type according to the actual stream type connected. + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapHorizontal_Input1| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapHorizontal_Input2| + The second input expect stimulations. They will be displayed as colored vertical lines . + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapHorizontal_Input2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapHorizontal_Settings| + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapHorizontal_Settings| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapHorizontal_Setting1| + The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. + A default configuration file is provided, and its path stored in the configuration token ${AdvancedViz_ChannelLocalisation}. + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapHorizontal_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapHorizontal_Setting2| + Select Time Locked for a continuous data stream, and specify the time scale below. + Select Independent for a discontinuous data stream, and specify the matrix count below. + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapHorizontal_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapHorizontal_Setting3| + The time scale in seconds, before the displays goes back to the origin. + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapHorizontal_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapHorizontal_Setting4| + The number of input matrices to receive before the displays goes back to the origin. + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapHorizontal_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapHorizontal_Setting5| + Gain (floating-point scalar factor) to apply to the input values before display. + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapHorizontal_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapHorizontal_Setting6| + Label to be displayed on top of the visualization window. + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapHorizontal_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapHorizontal_Setting7| + Color gradient to use. This setting can be set manually using the color gradient editor. + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete + - Icon or Icon_Discrete + - Elan or Elan_Discrete + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + + An example of topography rendering using these color gradients can be found \ref Doc_Mensia_AdvViz_Configuration "here". + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapHorizontal_Setting7| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapHorizontal_OnlineVisualizationSettings| + At runtime, all the advanced visualization shared settings are exposed, as described in \ref Doc_Mensia_AdvViz_Configuration_RuntimeToolbar. + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapHorizontal_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapHorizontal_Examples| + In the following example, we compute the FFT of every right-hand trial in a Motor Imagery session, filtered spatially around the two motor cortices. + All the spectra are stacked on top of each other. + + You can find a commented scenario in the provided sample set, the scenario file name is \textit{StackedBitmapHorz.mxs}. + + \image html StackedBitmapHorz_Example.png "Example of scenario using the Stacked Bitmap (Horizontal)" + \image latex StackedBitmapHorz_Example.png "Example of scenario using the Stacked Bitmap (Horizontal)" width=\textwidth + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapHorizontal_Examples| + */ \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_StackedBitmapVertical.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_StackedBitmapVertical.dox-part new file mode 100644 index 0000000..04d6ce9 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Doc_BoxAlgorithm_StackedBitmapVertical.dox-part @@ -0,0 +1,104 @@ +/** + * \page BoxAlgorithm_StackedBitmapVertical Stacked Bitmap (Vertical) +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapVertical_Description| + The Stacked Bitmap (Vertical) box displays input data in form of 2D maps of colored blocks (or bitmap). + All the bitmaps are stacked vertically, starting from the bottom edge of the window. + Whenever a new data block arrives, it is added to the visualization windows. If the end of the matrix count scale is reached, it goes back to the origin. + The bitmap colors are chosen according to a custom gradient. + + The Stacked Bitmap (Vertical) box shares common concepts and settings with the other boxes of the Mensia Advanced Visualization Toolset . + Additional information are available in the dedicated documentation pages: + - \ref Doc_Mensia_AdvViz_Concepts + - \ref Doc_Mensia_AdvViz_Configuration + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapVertical_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapVertical_Inputs| + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapVertical_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapVertical_Input1| + The first input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). + Please set the input type according to the actual stream type connected. + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapVertical_Input1| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapVertical_Input2| + The second input expect stimulations. They will be displayed as colored vertical lines . + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapVertical_Input2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapVertical_Settings| + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapVertical_Settings| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapVertical_Setting1| + The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. + A default configuration file is provided, and its path stored in the configuration token ${AdvancedViz_ChannelLocalisation}. + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapVertical_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapVertical_Setting2| + Select Time Locked for a continuous data stream, and specify the time scale below. + Select Independent for a discontinuous data stream, and specify the matrix count below. + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapVertical_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapVertical_Setting3| + The time scale in seconds, before the displays goes back to the origin. + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapVertical_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapVertical_Setting4| + The number of input matrices to receive before the displays goes back to the origin. + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapVertical_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapVertical_Setting5| + Gain (floating-point scalar factor) to apply to the input values before display. + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapVertical_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapVertical_Setting6| + Label to be displayed on top of the visualization window. + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapVertical_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapVertical_Setting7| + Color gradient to use. This setting can be set manually using the color gradient editor. + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete + - Icon or Icon_Discrete + - Elan or Elan_Discrete + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + + An example of topography rendering using these color gradients can be found \ref Doc_Mensia_AdvViz_Configuration "here". + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapVertical_Setting7| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapVertical_OnlineVisualizationSettings| + At runtime, all the advanced visualization shared settings are exposed, as described in \ref Doc_Mensia_AdvViz_Configuration_RuntimeToolbar. + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapVertical_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StackedBitmapVertical_Examples| + In the following example, we compute the FFT of every right-hand trial in a Motor Imagery session, filtered spatially around the two motor cortices. + All the spectra are stacked on top of each other. + + You can find a commented scenario in the provided sample set, the scenario file name is \textit{StackedBitmapVert.mxs}. + + \image html StackedBitmapVert_Example.png "Example of scenario using the Stacked Bitmap (Vertical)" + \image latex StackedBitmapVert_Example.png "Example of scenario using the Stacked Bitmap (Vertical)" width=\textwidth + * |OVP_DocEnd_BoxAlgorithm_StackedBitmapVertical_Examples| + */ \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantBars_Display.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantBars_Display.png new file mode 100644 index 0000000..ead9e67 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantBars_Display.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantBars_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantBars_Example.png new file mode 100644 index 0000000..a52fb47 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantBars_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantBitmap3DStream_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantBitmap3DStream_Example.png new file mode 100644 index 0000000..18cb699 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantBitmap3DStream_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantBitmap_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantBitmap_Example.png new file mode 100644 index 0000000..9f5ba80 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantBitmap_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantMultiOscilloscope_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantMultiOscilloscope_Example.png new file mode 100644 index 0000000..4f6e0c9 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantMultiOscilloscope_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantOscilloscope_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantOscilloscope_Example.png new file mode 100644 index 0000000..33215a4 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/InstantOscilloscope_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Settings_ChannelLocalisation.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Settings_ChannelLocalisation.png new file mode 100644 index 0000000..9c84094 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Settings_ChannelLocalisation.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Settings_Translucency-1-05.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Settings_Translucency-1-05.png new file mode 100644 index 0000000..bc257b4 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/Settings_Translucency-1-05.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/StackedBitmapHorz_Display.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/StackedBitmapHorz_Display.png new file mode 100644 index 0000000..5ba0b60 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/StackedBitmapHorz_Display.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/StackedBitmapHorz_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/StackedBitmapHorz_Example.png new file mode 100644 index 0000000..c3bb57a Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/StackedBitmapHorz_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/StackedBitmapVert_Display.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/StackedBitmapVert_Display.png new file mode 100644 index 0000000..7c0ec9b Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/StackedBitmapVert_Display.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/StackedBitmapVert_ERPDisplay.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/StackedBitmapVert_ERPDisplay.png new file mode 100644 index 0000000..b3b2e43 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/StackedBitmapVert_ERPDisplay.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/StackedBitmapVert_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/StackedBitmapVert_Example.png new file mode 100644 index 0000000..7c0ec9b Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/StackedBitmapVert_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_1.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_1.png new file mode 100644 index 0000000..09577ec Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_1.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_2.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_2.png new file mode 100644 index 0000000..c76d493 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_2.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_3.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_3.png new file mode 100644 index 0000000..e4f0fd9 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_3.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_4.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_4.png new file mode 100644 index 0000000..11ba0d2 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_4.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_5.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_5.png new file mode 100644 index 0000000..fc23034 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_5.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_6.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_6.png new file mode 100644 index 0000000..2c714a0 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/UseCase1_6.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/advviz-1-generalities.dox b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/advviz-1-generalities.dox new file mode 100644 index 0000000..54c01e7 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/advviz-1-generalities.dox @@ -0,0 +1,21 @@ +/** + \page Doc_Mensia_AdvViz Advanced Visualization Boxes + + General information on the Advanced Visualization Toolset: + - \subpage Doc_Mensia_AdvViz_Generalities : generalities about the toolset. + - \subpage Doc_Mensia_AdvViz_Concepts : understanding the Toolset design and the different visualization paradigms. + - \subpage Doc_Mensia_AdvViz_Configuration : how to configure the Advanced Visualization boxes. + - \subpage Doc_Mensia_AdvViz_UseCases : concrete examples of use, from spectral analysis to ERP display. + + + \page Doc_Mensia_AdvViz_Generalities Generalities + To be able to use all the features in the Mensia Advanced Visualization Toolset, please verify that your setup meets the following recommendations. + + \section OpenGL OpenGL dependency + The Toolset relies on the OpenGL library for every rendering operations, from signal display to 3D reconstruction. + You must ensure that your computer is equipped with an OpenGL-compatible graphic card or chipset. + This should be the case on any recent computer. + + You should also ensure that your graphic card drivers are up-to-date. + Please refer to the manufacturer website for more information. + **/ \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/advviz-2-concepts.dox b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/advviz-2-concepts.dox new file mode 100644 index 0000000..2642c80 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/advviz-2-concepts.dox @@ -0,0 +1,172 @@ +/** + \page Doc_Mensia_AdvViz_Concepts Concepts + + \section Doc_Mensia_AdvViz_Concepts_Intro Introduction + The Mensia Advanced Visualization Toolset is a collection of boxes dedicated to + the visualization of the result of electrophysiological signal analysis, and are especially suitable for the real-time + analysis of EEG signals , from raw signal display to 3D source reconstruction. + + It addresses many different use-cases among users. + Neurophysiologists can observe accurately in real-time spatial and + temporal patterns in the brain activity (motor activity, cognitive processes). EEG signal + processing specialists can evaluate and compare instantly algorithms effects (source + separation, denoising techniques). BCI researchers can study how their ERP-based system may + be tuned to elicit and detect the best brain response. + + + \image html designer-box-list.png "Simple integration in the graphical user interface" + \image latex designer-box-list.png "Simple integration in the graphical user interface" width=\textwidth + + \section Doc_Mensia_AdvViz_Concepts_VisualizationParadigms Visualization paradigms + This Toolset has been designed to be very versatile. The main design concept revolves around + the data presentation. You basically want to display matrices of numbers which may have temporal, + and/or spatial meanings. The most adapted data presentation may vary from one case to another, + according to the type of events or patterns on which you need to get a good contrast. + + Before choosing the right visualization box, ask yourself: + - How do I want my data to be displayed ? curves ? levels ? + - What will be the best way to enhance the contrast between the information I want to extract and the rest of the data ? + - Is my data stream continuous in time ? or am I dealing with discontinuous epochs (e.g. ERPs) ? + + To be adapted in most situation, the Mensia Advanced Visualization Toolset has been designed to cover + different visualization paradigms. Take a look at all the possibilities and choose what will best fit your needs. + - \ref Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Oscilloscope + - \ref Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Bars + - \ref Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Bitmap + - \ref Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Topo + - \ref Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Reco + + You can also have a look at the \ref Doc_Mensia_AdvViz_UseCases "list of use-cases", showing how each box can be used on concrete, real-life examples. + + \subsection Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Oscilloscope The Oscilloscope view + It is the most basic paradigm, used to display temporal numerical data in the form of curves (dots linked by lines). + The Oscilloscope views are all expecting centered values (i.e. distributed around 0). + Hence it is advised to use at least one temporal filter (e.g. band passing between 2 and 40 Hz using a \ref Doc_BoxAlgorithm_TemporalFilter box) before displaying an EEG signal. + + Four boxes use this paradigm: + - \ref Doc_BoxAlgorithm_ContinuousOscilloscope box: displays continuous data from left to right on a defined horizontal scale (goes back to origin upon reaching the end of the scale), + channels are displayed vertically one after another, but spikes may overlap. + - \ref Doc_BoxAlgorithm_InstantOscilloscope box: displays each block of data received as it comes, filling all the horizontal space available. + - \ref Doc_BoxAlgorithm_ContinuousMultiOscilloscope box: same as the Continuous Oscilloscope, but every input channels are displayed along the same horizontal axis with a different color, additively. + - \ref Doc_BoxAlgorithm_InstantMultiOscilloscope box: same as the Instant Oscilloscope, but every input channels are displayed along the same horizontal axis with a different color, additively. + + Example: raw EEG signal display. + \image html ContinuousOscilloscope_Display.png "Continuous Oscilloscope displaying 2 EEG channels" + \image latex ContinuousOscilloscope_Display.png "Continuous Oscilloscope displaying 2 EEG channels" width=10cm + + \subsection Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Bars The Bar view + Like histograms, this paradigm can be used to display and compare series of levels . Levels are displayed one after another from left to right, within a color gradient . + Channels are displayed vertically, one after another with a fixed interval (thus some "high" levels may overlap). + With a high definition (i.e. a rather high frequency display), the result can be viewed as a curve colored below the line. + + Two boxes uses this paradigm: + - \ref Doc_BoxAlgorithm_ContinuousBars box: displays continuous data from left to right on a defined horizontal scale (goes back to origin upon reaching the end of the scale). + - \ref Doc_BoxAlgorithm_InstantBars box: displays each block of data received as it comes, filling all the horizontal space. + + Example: spectrum display. + \image html InstantBars_Display.png "Instant Bars displaying the signal spectrum" + \image latex InstantBars_Display.png "Instant Bars displaying the signal spectrum" width=10cm + + \subsection Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Bitmap The Bitmap view + The bitmap paradigm displays matrices of data using a color gradient. The result is a 2D map where each cell is given a color "bit" . + This view using colors can enhance easily the constrast between 2 temporal or spatial patterns, as the difference + between "cold" and "hot" colors is quickly caught by the analyst's eye. + You can even add an additional dimension by using stacked bitmaps : every time a new bitmap is received, it is placed on top or left to the previous one. + + Four boxes uses this paradigm: + - \ref Doc_BoxAlgorithm_ContinuousBitmap box: displays continuous data from left to right on a defined horizontal scale (goes back to origin upon reaching the end of the scale). + - \ref Doc_BoxAlgorithm_InstantBitmap box: displays each block of data received as it comes, filling all the horizontal space. + - \ref Doc_BoxAlgorithm_StackedBitmapVertical box: each bitmap is placed on top of the previous one. + - \ref Doc_BoxAlgorithm_StackedBitmapHorizontal box: each bitmap is placed left to the previous one. + + Example: Time-frequency map. + \image html StackedBitmapHorz_Display.png "Stacked Bitmap (Horizontal) displaying the result of a Time-Frequency analysis" + \image latex StackedBitmapHorz_Display.png "Stacked Bitmap (Horizontal) displaying the result of a Time-Frequency analysis" width=10cm + + \subsection Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Topo The Topographic view + This paradigm adds a strong spatial constraint on the input data: each channel must be labelled + with an electrode name in a defined nomenclature, such as the standard 10-20 system. + Please see \ref Doc_Mensia_AdvViz_Concepts_ChannelLocalization for further details. + + Here again the data itself is displayed using a color gradient, mapped to a 2D or 3D model using spherical spline interpolation. + For more details about the spherical spline interpolation, please check F. Perrin, J. Pernier, O. Bertrand, J.F. Echallier, + Spherical splines for scalp potential and current density mapping, Electroencephalography and Clinical Neurophysiology, Volume 72, Issue 2, February 1989, Pages 184-187. + + The 2D model is a planar projection of the scalp, covering the scalp roughly from the frontal area to the occipital area (i.e. from Fp1-Fp2 to O9-O10 sites). + The projection result takes the shape of a disk with a crescent growth at the back for the occipital region. + + Three boxes uses this paradigm: + - \ref Doc_BoxAlgorithm_2DTopography box: maps the input (which channels are labelled in the 10-20 system standard) to a planar projection of the scalp. + - \ref Doc_BoxAlgorithm_3DTopography box: maps the input (which channels are labelled in the 10-20 system standard) to a projection on a 3D model of the scalp. + - \ref Doc_BoxAlgorithm_3DCubes box: an alternative view where each channel is represented by a 3D cube, positionned in space as the electrode would be on the 3D model. + The activity is rendered by changing the size and color of the cubes. + + Example: Displaying the power of a specific frequency band on a 3D head model. + \image html 3DTopography_Display.png "Alpha power mapped on a head model using the 3D topography" + \image latex 3DTopography_Display.png "Alpha power mapped on a head model using the 3D topography" width=10cm + + \subsection Doc_Mensia_AdvViz_Concepts_VisualizationParadigms_Reco The Reconstruction view + Tomographic reconstruction algorithms offer an inside look, into the brain, from only surface measurements. + Several techniques exist, including the algorithms of the popular LORETA family which slice the brain in a stack of little cubes called voxels, + and computes the inverse model, a model reconstructing the sources of the potentials acquired at the measurement site. + + One box implements the source reconstruction view: + - \ref Doc_BoxAlgorithm_3DSourceVisualization box : displays a 3D source reconstruction using 2394 colored/translucent voxels in a 3D head model. + This box expects 2394 input channels, produced by an inverse model (i.e. a spatial filter with N sensor inputs for 2394 sources outputs). This model must be + tailor-made for the precise EEG setup being used (e.g. using sLORETA). + + \image html 3DTomographicVisualization_Display.png "3D tomographic reconstruction using the 3D Tomographic Visualization box" + \image latex 3DTomographicVisualization_Display.png "3D tomographic reconstruction using the 3D Tomographic Visualization box" width=10cm + + \section Doc_Mensia_AdvViz_Concepts_ChannelLocalization Channel localization + Every visualization box can use the spatial information conveyed by the electrode naming. The channels can be positionned relatively to each + other as long as you provide in the box settings a file containing the cartesian coordinates of the electrodes. + Most of the time, EEG manufacturers use the 10-20 system as an electrode naming standard. For convenience, we provide within the Toolset a file compiling all the + coordinates of the electrodes in the 10-20 system. + + The cartesian coordinates of all the electrodes are computed in the 3D space, where the origin is at the center of [Fpz,Oz] and [T7,T8]. + - the X axis goes from the occipital lobe to the frontal lobe + - the Y axis goes from the right temporal lobe to the left temporal lobe + - the Z axis goes from the center of the head to the top + + And as for the unit, here are some key points at the maximum of the axis: + - Fpz (1,0,0) + - Oz (-1,0,0) + - T7 (0,1,0) + - T8 (0,-1,0) + - Cz (0,0,1) + + The following figures illustrates the cartesian coordinates of the extended 10-20 system used in the Mensia Advanced Visualization Toolset. + \image html CartesianCoordinates1.png "Cartesian coordinates of the 10-20 system, side view." + \image latex CartesianCoordinates1.png "Cartesian coordinates of the 10-20 system, side view." width=8cm + \image html CartesianCoordinates2.png "Cartesian coordinates of the 10-20 system, front view." + \image latex CartesianCoordinates2.png "Cartesian coordinates of the 10-20 system, front view." width=8cm + + For more information, please see Oostenveld, R. & Praamstra, P. (2001). The five percent electrode system + for high-resolution EEG and ERP measurements. Clinical Neurophysiology, 112:713-719 + + Please note that using the 10-20 system is not mandatory. To use all the Toolset features related to the spatial disposition of the electrodes, you + just need to provide a file that maps electrode name with their coordinates in the space described above. + + The format of this file is simple text. You must provide: + - the electrode names as a list of quoted labels + - the coordinate system labels + - the electrode coordinates of the electrodes, in the same order as in the electrode names + + For example: + \code +[ + ["O1" "O2" ... ] + ["x" "y" "z" ] +] +[ + [-0.309017 -0.951057 4.48966e-011 ] +] +[ + [0.309017 -0.951057 4.48966e-011 ] +] +... + \endcode + + For a complete example, please look at the file provided with the Toolset (../share/mensia /openvibe-plugins/cartesian.txt) + */ \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/advviz-3-configuration.dox b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/advviz-3-configuration.dox new file mode 100644 index 0000000..c5240e8 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/advviz-3-configuration.dox @@ -0,0 +1,125 @@ +/** + \page Doc_Mensia_AdvViz_Configuration Configuration + By design, all the boxes included in the Mensia Advanced Visualization Toolset share a common behavior + when it comes to configuring the boxes, in the scenario edition or during its execution. + In this section we describe the common configuration parameters you find when using these boxes. + + \section Doc_Mensia_AdvViz_Configuration_BoxSettings Box settings + You may encounter different settings, common to all or a subset of boxes, depending on the paradigms. + + \subsection Doc_Mensia_AdvViz_Configuration_ChannelLocalization Channel localisation + Specify here where to find the file listing the coordinates of every electrodes by their names. + Please see \ref Doc_Mensia_AdvViz_Concepts_ChannelLocalization for more details. + + For conveniency, we provide a default file ${AdvancedViz_ChannelLocalisation} (../share/mensia /openvibe-plugins/cartesian.txt) which contains + the cartesian coordinates of all electrodes in the extended 10-20 system. + This settings is obviously mandatory for the Topographic views , + but can also be useful for the other paradigms: at runtime, you can re-arrange the channels spatially by their names (from left to right hemisphere, or from front to top). + This is useful when dealing with dense EEG (128 or more channels), which can bring a new light, new contrast on a rather opaque data display. + + \image html Settings_ChannelLocalisation.png "Spatial reorganization on a dense signal display using a Continuous Oscillator" + \image latex Settings_ChannelLocalisation.png "Spatial reorganization on a dense signal display using a Continuous Oscillator" width=\textwidth + + \subsection Doc_Mensia_AdvViz_Configuration_Caption Caption + If this field is used, this label will be displayed in the window, on top of the rendering area. + + \subsection Doc_Mensia_AdvViz_Configuration_Color Color + The color gradient you want to use to display the data. You can use the color picker to chose the gradient manually, or use one of the presets. + + Several presets exist in form of configuration tokens ${AdvancedViz_ColorGradient_X}, where X can be: + - Matlab or Matlab_Discrete (as in Matlab / BCILAB toolbox) + - Icon or Icon_Discrete (as in ICoN ) + - Elan or Elan_Discrete (as in Elan ) + - Fire or Fire_Discrete + - IceAndFire or IceAndFire_Discrete + + The default values AdvancedViz_DefaultColorGradient or AdvancedViz_DefaultColorGradient_Discrete are equal to Matlab and Matlab_Discrete. + + Here is an example of 2D topography rendering using these color gradients: + \image html 2DTopography_ColorGradients.png "The color gradient presets available, illustrated with the 2D topography" + \image latex 2DTopography_ColorGradients.png "The color gradient presets available, illustrated with the 2D topography" width=\textwidth + + \subsection Doc_Mensia_AdvViz_Configuration_BoxSettings_Translucency Translucency + This setting expects a value between 0 and 1, where 0 is complete transparency and 1 complete opacity. + + The translucency parameter is very useful when dealing with overlapping rendering, i.e. when some parts of the visualizations end up on each other. + By adding some translucency the data can still be visible, and it can also smoothen dense readings for more confort. + \image html Settings_Translucency-1-05.png "Using the translucency to allow dense yet smooth EEG reading" + \image latex Settings_Translucency-1-05.png "Using the translucency to allow dense yet smooth EEG reading" width=\textwidth + + \subsection Doc_Mensia_AdvViz_Configuration_BoxSettings_PositiveData Positive data only + By ticking this checkbox, you shift the vertical scale of the visualization in order to have the 0 at the bottom (no negative values will be displayed) + + This setting can be activated when dealing with spectral amplitude or any kind of positive-only "levels". + \image html ContinuousBars_Display.png "Displaying a positive level (Global Field Power) using Continuous Bars" + \image latex ContinuousBars_Display.png "Displaying a positive level (Global Field Power) using Continuous Bars" width=10cm + + \subsection Doc_Mensia_AdvViz_Configuration_BoxSettings_Gain Gain + If set, all samples in the input stream are multiplied by this scalar value before display. + This can be useful when you need to display all at once different type of data on the same relative scale, with a good contrast on every view. + + \subsection Doc_Mensia_AdvViz_Configuration_BoxSettings_TemporalCoherence Temporal Coherence + Tells the box whether the input stream is expected to be Time-locked or Independent. + In the first case the box should use a Time scale (in seconds, for continuous data), and for the second case a Matrix count (number of data block received, for discontinuous data). + + \subsection Doc_Mensia_AdvViz_Configuration_BoxSettings_TimeScale Time scale + The time scale (in seconds) drives the number of values to be displayed in continuous or stacked views before going back to the origin. + Using a time scale is meaningful only when dealing with an input stream made of continuous epochs, e.g. signal display, time-frequency analysis. + + \subsection Doc_Mensia_AdvViz_Configuration_BoxSettings_MatrixCount Matrix count + The number of input epochs to display before going back to the origin. For example in stacked bitmaps this setting is the number of bitmaps to be stacked before going back to the bottom of the stack. + + An illustration for this setting would be the visualization of Event-Related Potentials such as P300. + In such scenario, we usually select epochs of data uncontinuously, e.g. by extracting 600ms of signal around a target stimulation. + Setting the Temporal coherence parameter to Independent will make the box display every epochs one after another, without trying to use the epoch timings. + For example, set to Independent when you want to stack P300 target trials on a bitmap view, with a matrix count equal to the number of trials you want to stack. + \image html StackedBitmapVert_ERPDisplay.png "Using a Stacked Bitmap (Vertical) to display the 3 first xDAWN components of all 99 Target trials of a P300 session" + \image latex StackedBitmapVert_ERPDisplay.png "Using a Stacked Bitmap (Vertical) to display the 3 first xDAWN components of all 99 Target trials of a P300 session" width=10cm + + + \section Doc_Mensia_AdvViz_Configuration_RuntimeToolbar Runtime Settings + This section covers the different settings available at runtime (i.e. when the scenario is currently beeing played). + Clicking on the toolbar will open-up the runtime visualization settings. + + - Sort Channels : rearrange the channels by their name (alphabetically or reversed order), or by their position on the scalp (left to right or front to back). + This last option is possible only if the channel are named according to the 10-20 system, and if you provided a channel localisation file in the box settings. + + - Select Channels : Select in a list the channels you want to see in the visualization window. + Use the Ctrl or Shift key to add channels to your selection, Ctrl+a to select all channels. + + - Show scales : show or hide all the scales around the visualization widget; allows nice snapshots. + This setting is global , meaning that it affects all the other advanced visualization windows currently running in your scenario. + Doing so preserves the widgets alignment when displaying synchronized data. + This setting can be turned on or off also by a double left-click in the visualization windows itself. + + - Positive data : this setting is a runtime duplicate of the box setting Positive data only . + If checked, the vertical axis is shifted so that 0 is at the bottom. Negative values wont be displayed. + + Depending on the temporal coherence selected in the box settings, you may find: + + - Time scale : this setting is a runtime duplicate of the box setting Time scale . + + - Matrix count : this setting is a runtime duplicate of the box setting Matrix count . + + When the visualization box implements an Instant paradigm for streamed matrices or signal input data, a new setting is available: + - Epoch replay : replays the last epoch received. + + Topographies also expose the ERP replay in adequat conditions. + This feature is global , meaning that the replay is performed simultaneously on every compatible boxes. + This allows for example on-demand replays of ERPs, simultaneously on a signal display and a topography. + + \image html 3DTopography_ERPReplay.png "Using the ERP replay feature on a 3D topography to catch the spatial course of the potential" + \image latex 3DTopography_ERPReplay.png "Using the ERP replay feature on a 3D topography to catch the spatial course of the potential" width=10cm + + \section Doc_Mensia_AdvViz_Configuration_RuntimeControls Runtime Controls + All the visualization boxes share common controls at runtime, for a user-friendly, natural interaction. + Using the mouse, one can: + + - Maintain right click and move the mouse up or down to zoom in or out on the data scale + - Maintain left click and move the mouse to rotate a 3D model + - Maintain middle click and move the mouse to zoom in or out on a 3D model + - Double left click in the vizualisation window to remove all the scales from the frame + + All these controls are global , meaning that if you change the scale in one visualization window, it will change the scale in every visualization windows accordingly. + + */ \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/advviz-4-usecases.dox b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/advviz-4-usecases.dox new file mode 100644 index 0000000..13529fd --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/advviz-4-usecases.dox @@ -0,0 +1,67 @@ +/** + \page Doc_Mensia_AdvViz_UseCases Use-cases + We describe in this section of the documentation several use-cases, typical and concrete examples of EEG analysis + that are enlighted by the Mensia Advanced Visualization Toolset. + + \section Doc_Mensia_AdvViz_UseCases_1 EEG Signal analysis + This detailed example uses the basic OpenViBE signal processing boxes to perform elementary real-time analysis, and the Mensia Advanced Visualization Toolset + to display the results: + - Raw and filtered EEG + - Spectrum, time-frequency map + - 2D and 3D topographies + + You can find this scenario in the provided sample set, the scenario file name is \textit{UseCase-1-EEG-signal-analysis.mxs}. + + \subpage Doc_Mensia_AdvViz_UseCases_SignalAnalysis + + \section Doc_Mensia_AdvViz_UseCases_2 Event-Related Potentials analysis + This use-case is focused on the ERP extraction and visualization, applied to P300 speller data. + The Mensia Advanced Visualization boxes allows concurrent and comparative displays (e.g. target versus non-target potentials), and synchronized replay capabilities + + You can find this scenario in the provided sample set, the scenario file name is \textit{UseCase-2-ERP-analysis.mxs}. + + \subpage Doc_Mensia_AdvViz_UseCases_ERPAnalysis + + \page Doc_Mensia_AdvViz_UseCases_SignalAnalysis Use-case 1: EEG Signal analysis + \section Doc_Mensia_AdvViz_UseCases_SignalAnalysis_Intro Introduction + This use-case is a simple yet concrete example of real-time EEG analysis usually performed with OpenViBE. + The scenario covers the use of oscilloscope, bitmaps, bars and topographic views to display signal, spectrum, and band power. + + \section Doc_Mensia_AdvViz_UseCases_SignalAnalysis_Scenario The scenario + The signal used is a motor imagery session, where the participant performed right and left hand motor imagery trials. + For more details, please refer to the official documentation of the OpenViBE motor-imagery bci scenarios, provided with the official release of the software. + We chose these data for demonstration purpose only as it is a file provided with the official release of openvibe, and should be available for you anyway. + + \subsection Doc_Mensia_AdvViz_UseCases_SignalAnalysis_Scenario_Filtering Signal filtering + We first remove artifacts using temporal filters, especially the common 50Hz noise coming from the electrical installation. + The EEG amplifier used for the record we read here is a Mindmedia NeXuS 32b, with one reference channel put on Nz (nose). + The Reference Channel box applies this spatial filter to further remove noises. + + We then use a \ref Doc_BoxAlgorithm_ContinuousOscilloscope to display the filtered signal. + \image html UseCase1_1.png "Denoising the signal before display" + \image latex UseCase1_1.png "Denoising the signal before display" width=8cm + + \subsection Doc_Mensia_AdvViz_UseCases_SignalAnalysis_Scenario_Spectrum Spectral analysis + A first pipeline computes two surface Laplacian filters around C3 and C4, the center of the two motor cortices. + We then compute the spectrum using FFT, up to 32 Hz, and display it using \ref Doc_BoxAlgorithm_InstantBars (spectrum levels) + and \ref Doc_BoxAlgorithm_StackedBitmapHorizontal (time-frequency map). + \image html UseCase1_2.png "Spectral analysis over filtered data" + \image latex UseCase1_2.png "Spectral analysis over filtered data" width=8cm + + \subsection Doc_Mensia_AdvViz_UseCases_SignalAnalysis_Scenario_Topo Topographic display + We compute in a parallel pipeline the alpha band power, averaged over several epochs, and visualize it over the scalp + through \ref Doc_BoxAlgorithm_2DTopography and \ref Doc_BoxAlgorithm_3DTopography. + \image html UseCase1_3.png "Topographic display of the alpha band power over the scalp" + \image latex UseCase1_3.png "Topographic display of the alpha band power over the scalp" width=8cm + + \section Doc_Mensia_AdvViz_UseCases_SignalAnalysis_Result Result + Here is the online visualization when we play this scenario on the provided data. + + \image html UseCase1_6.png "Signal display" + \image latex UseCase1_6.png "Signal display" width=10cm + \image html UseCase1_4.png "Spectrum visualization" + \image latex UseCase1_4.png "Spectrum visualization" width=10cm + \image html UseCase1_5.png "2D and 3D Topographies" + \image latex UseCase1_5.png "2D and 3D Topographies" width=10cm + + */ \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_2DTopography.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_2DTopography.rst new file mode 100644 index 0000000..b6ef44e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_2DTopography.rst @@ -0,0 +1,120 @@ +.. _Doc_BoxAlgorithm_2DTopography: + +2D Topography +============= + +.. container:: attribution + + :Author: + Yann Renard + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_2DTopography.png + +The *2D Topography* box combines EEG measures with topological information. +The input, being signal, spectrum, or any other metric, is mapped to a 2 dimensional plane model of the scalp surface, rendered in a 3D context. +This box is provided with a preconfigured channel localisation file that contains the cartesian coordinates of every electrode positions of the extended 10-20 system. +The mapping is done according to these coordinates using spherical spline interpolation. +A color gradient is used to display the information, and can be customized at will to easily enhance or smooth the contrasts. +Several presets are available, to match the gradients you may be already familiar with when using existing softwares such as Matlab or Elan. +The color gradient is mapped to the current data scale, centered around 0. + +The *2D Topography* box shares common concepts and settings with the other boxes in the **Mensia Advanced Visualization Toolset**. +Additional information are available in the dedicated documentation pages: + +- :ref:`Doc_Mensia_AdvViz_Concepts` +- :ref:`Doc_Mensia_AdvViz_Configuration` + + + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Signal" + +Matrix +~~~~~~ + +The box input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). +Please set the input type according to the actual stream type connected. + +.. _Doc_BoxAlgorithm_2DTopography_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Channel Localisation", "Filename", "${AdvancedViz_ChannelLocalisation}" + "Gain", "Float", "1" + "Caption", "String", "" + "Color", "Color Gradient", "${AdvancedViz_DefaultColorGradient}" + +Channel Localisation +~~~~~~~~~~~~~~~~~~~~ + +The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. +A default configuration file is provided, and its path stored in the configuration token ``${AdvancedViz_ChannelLocalisation}``. + +Gain +~~~~ + +Gain (floating-point scalar factor) to apply to the input signal before display. + +Caption +~~~~~~~ + +Label to be displayed on top of the visualization window. + +Color +~~~~~ + +Color gradient to use. This setting can be set manually using the color gradient editor. +Several presets exist in form of configuration tokens ``${AdvancedViz_ColorGradient_X}``, where X can be: + +- ``Matlab`` or ``Matlab_Discrete`` +- ``Icon`` or ``Icon_Discrete`` +- ``Elan`` or ``Elan_Discrete`` +- ``Fire`` or ``Fire_Discrete`` +- ``IceAndFire`` or ``IceAndFire_Discrete`` + + +The default values ``AdvancedViz_DefaultColorGradient`` or ``AdvancedViz_DefaultColorGradient_Discrete`` are equal to Matlab and ``Matlab_Discrete``. + +An example of topography rendering using these color gradients can be found :ref:`Doc_Mensia_AdvViz_Configuration` "here". + +.. _Doc_BoxAlgorithm_2DTopography_VizSettings: + +Visualization Settings +---------------------- + +At runtime, all the advanced visualization shared settings are exposed, as described in :ref:`Doc_Mensia_AdvViz_Configuration_RuntimeToolbar`. + +For the 2D topography, please note that: + +- **Select Channels** : the selected channel are symbolized with a small white cube, which turns grey when unselected. + + +Note that if the box receives a discontinuous data stream, such as a re-epoched signal through stimulation based epoching, the ERP replay features is exposed. +Using the ERP replay allows you to slowly visualize the last epoch received. + +.. _Doc_BoxAlgorithm_2DTopography_Examples: + +Examples +-------- + +In the following example, we compute the band power of the signal in the 8-15 Hz frequency range, and average it over the last 32 epochs received. + +You can find a commented scenario in the provided sample set, the scenario file name is \textit{2DTopography.mxs}. + +.. figure:: images/2DTopography_Example.png + :alt: Example of scenario using the 2D topography + :align: center + + Example of scenario using the 2D topography + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_3DCubes.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_3DCubes.rst new file mode 100644 index 0000000..e6fa579 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_3DCubes.rst @@ -0,0 +1,117 @@ +.. _Doc_BoxAlgorithm_3DCubes: + +3D Cubes +======== + +.. container:: attribution + + :Author: + Yann Renard + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_3DCubes.png + +The *3D Cubes* box displays the data in a topographic view, where each channel (correctly identified and positionned thanks to a channel localisation file) is associated with a cube. +All the cubes are positionned in a 3D space according to the corresponding positions of the electrodes on the scalp. +The input data is displayed through 2 modalities: + +- the **cubes color** +- the **cubes size** + + +The cube size varies according to the same - absolute - range as the color, i.e. high negative or positive values will be +displayed as big cube while values close to zero with be displayed as small cubes. + +The *3D Cubes* box shares common concepts and settings with the other boxes in the **Mensia Advanced Visualization Toolset**. +Additional information are available in the dedicated documentation pages: + +- :ref:`Doc_Mensia_AdvViz_Concepts` +- :ref:`Doc_Mensia_AdvViz_Configuration` + + + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Signal" + +Matrix +~~~~~~ + +The box input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). +Please set the input type according to the actual stream type connected. + +.. _Doc_BoxAlgorithm_3DCubes_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Channel Localisation", "Filename", "${AdvancedViz_ChannelLocalisation}" + "Gain", "Float", "1" + "Caption", "String", "" + "Color", "Color Gradient", "${AdvancedViz_DefaultColorGradient}" + +Channel Localisation +~~~~~~~~~~~~~~~~~~~~ + +The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. +A default configuration file is provided, and its path stored in the configuration token ``${AdvancedViz_ChannelLocalisation}``. + +Gain +~~~~ + +Gain (floating-point scalar factor) to apply to the input values before display. + +Caption +~~~~~~~ + +Label to be displayed on top of the visualization window. + +Color +~~~~~ + +Color gradient to use. This setting can be set manually using the color gradient editor. +Several presets exist in form of configuration tokens ``${AdvancedViz_ColorGradient_X}``, where X can be: + +- ``Matlab`` or ``Matlab_Discrete`` +- ``Icon`` or ``Icon_Discrete`` +- ``Elan`` or ``Elan_Discrete`` +- ``Fire`` or ``Fire_Discrete`` +- ``IceAndFire`` or ``IceAndFire_Discrete`` + + +The default values ``AdvancedViz_DefaultColorGradient`` or ``AdvancedViz_DefaultColorGradient_Discrete`` are equal to Matlab and ``Matlab_Discrete``. + +An example of topography rendering using these color gradients can be found :ref:`Doc_Mensia_AdvViz_Configuration` "here". + +.. _Doc_BoxAlgorithm_3DCubes_VizSettings: + +Visualization Settings +---------------------- + +At runtime, all the advanced visualization shared settings are exposed, as described in :ref:`Doc_Mensia_AdvViz_Configuration_RuntimeToolbar`. +Note that if the box receives a discontinuous data stream, such as a re-epoched signal through stimulation based epoching, the ERP replay features is exposed. +Using the ERP replay allows you to slowly visualize the last epoch received. + +.. _Doc_BoxAlgorithm_3DCubes_Examples: + +Examples +-------- + +In the following example, we compute the band power of the signal in the 8-15 Hz frequency range, and average it over the last 32 epochs received. + +You can find a commented scenario in the provided sample set, the scenario file name is \textit{3DCubes.mxs}. + +.. figure:: images/3DCubes_Example.png + :alt: Example of scenario using the 3D cubes + :align: center + + Example of scenario using the 3D cubes + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_3DTomographicVisualization.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_3DTomographicVisualization.rst new file mode 100644 index 0000000..138568c --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_3DTomographicVisualization.rst @@ -0,0 +1,109 @@ +.. _Doc_BoxAlgorithm_3DTomographicVisualization: + +3D Tomographic Visualization +============================ + +.. container:: attribution + + :Author: + Yann Renard + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_3DTomographicVisualization.png + +The *3D Tomographic Visualization* is designed to display the output of a signal filtered using the a tomographic reconstruction algorithm such as LORETA. +LORETA computes the spatial filter that transforms an input signal with :math:`C` channels/sensors to :math:`V =` 2394 sources. +These sources form a subdivision of the brain in 3 dimensions, each source being encoded as a small cube (7mm resolution) called *voxel*. The input to the box should thus be a matrix of 2394x3 values. + +The *3D Tomographic Visualization* box shares common concepts and settings with the other boxes in the **Mensia Advanced Visualization Toolset**. +Additional information are available in the dedicated documentation pages: + +- :ref:`Doc_Mensia_AdvViz_Concepts` +- :ref:`Doc_Mensia_AdvViz_Configuration` + + + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Signal" + +Matrix +~~~~~~ + +This box expects a source current density power stream coming from a LORETA transformation, ie matrices of :math:`V =` 2394 channels, one value per voxel of the reconstruction. + +.. _Doc_BoxAlgorithm_3DTomographicVisualization_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Gain", "Float", "1" + "Caption", "String", "" + "Translucency", "Float", "1" + "Color", "Color Gradient", "${AdvancedViz_DefaultColorGradient}" + +Gain +~~~~ + +Gain (floating-point scalar factor) to apply to the input values before display. + +Caption +~~~~~~~ + +Label to be displayed on top of the visualization window. + +Translucency +~~~~~~~~~~~~ + +This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + +Color +~~~~~ + +Color gradient to use. This setting can be set manually using the color gradient editor. +Several presets exist in form of configuration tokens ``${AdvancedViz_ColorGradient_X}``, where X can be: + +- ``Matlab`` or ``Matlab_Discrete`` +- ``Icon`` or ``Icon_Discrete`` +- ``Elan`` or ``Elan_Discrete`` +- ``Fire`` or ``Fire_Discrete`` +- ``IceAndFire`` or ``IceAndFire_Discrete`` + + +The default values ``AdvancedViz_DefaultColorGradient`` or ``AdvancedViz_DefaultColorGradient_Discrete`` are equal to Matlab and ``Matlab_Discrete``. + +An example of topography rendering using these color gradients can be found :ref:`Doc_Mensia_AdvViz_Configuration` "here". + +.. _Doc_BoxAlgorithm_3DTomographicVisualization_VizSettings: + +Visualization Settings +---------------------- + +At runtime, all the advanced visualization shared settings are exposed, as described in :ref:`Doc_Mensia_AdvViz_Configuration_RuntimeToolbar`. +Note that if the box receives a discontinuous data stream, such as a re-epoched signal through stimulation based epoching, the ERP replay features is exposed. +Using the ERP replay allows you to slowly visualize the last epoch received. + +.. _Doc_BoxAlgorithm_3DTomographicVisualization_Examples: + +Examples +-------- + +In the following example, we compute the alpha band power of the signal, and deduce the corresponding sources activity using +an inverse model of the headset (eLORETA), that outputs the source components along x, y and z axis and the source current density power. + +You can find a commented scenario in the provided sample set, the scenario file name is \textit{3DTomographicVisualization.mxs}. + +.. figure:: images/3DTomographicVisualization_Example.png + :alt: Example of scenario using the 3D Tomographic Visualization + :align: center + + Example of scenario using the 3D Tomographic Visualization + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_3DTopography.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_3DTopography.rst new file mode 100644 index 0000000..10a9817 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_3DTopography.rst @@ -0,0 +1,120 @@ +.. _Doc_BoxAlgorithm_3DTopography: + +3D Topography +============= + +.. container:: attribution + + :Author: + Yann Renard + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_3DTopography.png + +The *3D Topography* box combines EEG measures with topological information. +The input, being signal, spectrum, or any other metric, is mapped to a 3D model of the scalp. +This box is provided with a preconfigured channel localisation file that contains the cartesian coordinates of every electrode positions of the extended 10-20 system. +The mapping is done according to these coordinates using spherical spline interpolation. +A color gradient is used to display the information, and can be customized at will to easily enhance or smooth the contrasts. +Several presets are available, to match the gradients you may be already familiar with when using existing softwares such as Matlab or Elan. +The color gradient is mapped to the current data scale, centered around 0. + +The *3D Topography* box shares common concepts and settings with the other boxes in the **Mensia Advanced Visualization Toolset**. +Additional information are available in the dedicated documentation pages: + +- :ref:`Doc_Mensia_AdvViz_Concepts` +- :ref:`Doc_Mensia_AdvViz_Configuration` + + + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Signal" + +Matrix +~~~~~~ + +The box input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). +Please set the input type according to the actual stream type connected. + +.. _Doc_BoxAlgorithm_3DTopography_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Channel Localisation", "Filename", "${AdvancedViz_ChannelLocalisation}" + "Gain", "Float", "1" + "Caption", "String", "" + "Color", "Color Gradient", "${AdvancedViz_DefaultColorGradient}" + +Channel Localisation +~~~~~~~~~~~~~~~~~~~~ + +The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. +A default configuration file is provided, and its path stored in the configuration token ``${AdvancedViz_ChannelLocalisation}``. + +Gain +~~~~ + +Gain (floating-point scalar factor) to apply to the input signal before display. + +Caption +~~~~~~~ + +Label to be displayed on top of the visualization window. + +Color +~~~~~ + +Color gradient to use. This setting can be set manually using the color gradient editor. +Several presets exist in form of configuration tokens ``${AdvancedViz_ColorGradient_X}``, where X can be: + +- ``Matlab`` or ``Matlab_Discrete`` +- ``Icon`` or ``Icon_Discrete`` +- ``Elan`` or ``Elan_Discrete`` +- ``Fire`` or ``Fire_Discrete`` +- ``IceAndFire`` or ``IceAndFire_Discrete`` + + +The default values ``AdvancedViz_DefaultColorGradient`` or ``AdvancedViz_DefaultColorGradient_Discrete`` are equal to Matlab and ``Matlab_Discrete``. + +An example of topography rendering using these color gradients can be found :ref:`Doc_Mensia_AdvViz_Configuration` "here". + +.. _Doc_BoxAlgorithm_3DTopography_VizSettings: + +Visualization Settings +---------------------- + +At runtime, all the advanced visualization shared settings are exposed, as described in :ref:`Doc_Mensia_AdvViz_Configuration_RuntimeToolbar`. + +For the 3D topography, please note that: + +- **Select Channels** : the selected channel are symbolized with a small white cube, which turns grey when unselected. + + +Note that if the box receives a discontinuous data stream, such as a re-epoched signal through stimulation based epoching, the ERP replay features is exposed. +Using the ERP replay allows you to slowly visualize the last epoch received. + +.. _Doc_BoxAlgorithm_3DTopography_Examples: + +Examples +-------- + +In the following example, we compute the band power of the signal in the 8-15 Hz frequency range, and average it over the last 32 epochs received. + +You can find a commented scenario in the provided sample set, the scenario file name is \textit{3DTopography.mxs}. + +.. figure:: images/3DTopography_Example.png + :alt: Example of scenario using the 3D topography + :align: center + + Example of scenario using the 3D topography + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_ContinuousBars.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_ContinuousBars.rst new file mode 100644 index 0000000..eb0b4da --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_ContinuousBars.rst @@ -0,0 +1,145 @@ +.. _Doc_BoxAlgorithm_ContinuousBars: + +Continuous Bars +=============== + +.. container:: attribution + + :Author: + Yann Renard + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_ContinuousBars.png + +The Continuous Bars displays input data in form of **vertical level bars**, one bar per value, one bar series for each channel. +The display is done **continuously** , meaning that once the end of the horizontal scale is reached, it goes back to the origin. +For lisibility (and esthetical) purpose, the bars are colored in a custom gradient (from left to right). + +The *Continuous Bars* box shares common concepts and settings with the other boxes in the **Mensia Advanced Visualization Toolset**. +Additional information are available in the dedicated documentation pages: + +- :ref:`Doc_Mensia_AdvViz_Concepts` +- :ref:`Doc_Mensia_AdvViz_Configuration` + + + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Streamed matrix" + "Markers", "Stimulations" + +Matrix +~~~~~~ + +The first input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). +Please set the input type according to the actual stream type connected. + +Markers +~~~~~~~ + +The second input expect stimulations. They will be displayed as **colored vertical lines**. + +.. _Doc_BoxAlgorithm_ContinuousBars_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Channel Localisation", "Filename", "${AdvancedViz_ChannelLocalisation}" + "Temporal Coherence", "Temporal Coherence", "Time Locked" + "Time Scale", "Float", "20" + "Matrix Count", "Integer", "50" + "Positive Data Only ?", "Boolean", "false" + "Gain", "Float", "1" + "Caption", "String", "" + "Translucency", "Float", "1" + "Color", "Color Gradient", "${AdvancedViz_DefaultColorGradient}" + +Channel Localisation +~~~~~~~~~~~~~~~~~~~~ + +The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. +A default configuration file is provided, and its path stored in the configuration token ``${AdvancedViz_ChannelLocalisation}``. + +Temporal Coherence +~~~~~~~~~~~~~~~~~~ + +Select *Time Locked* for a continuous data stream, and specify the *time scale* below. +Select *Independent* for a discontinuous data stream, and specify the *matrix count* below. + +Time Scale +~~~~~~~~~~ + +The time scale in seconds, before the displays goes back to the origin. + +Matrix Count +~~~~~~~~~~~~ + +The number of input matrices to receive before the displays goes back to the origin. + +Positive Data Only ? +~~~~~~~~~~~~~~~~~~~~ + +If this checkbox is ticked, the vertical scale is shifted so that 0 is at the bottom. Only positive values will be displayed. + +Gain +~~~~ + +Gain (floating-point scalar factor) to apply to the input values before display. + +Caption +~~~~~~~ + +Label to be displayed on top of the visualization window. + +Translucency +~~~~~~~~~~~~ + +This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + +Color +~~~~~ + +Color gradient to use. This setting can be set manually using the color gradient editor. +Several presets exist in form of configuration tokens ``${AdvancedViz_ColorGradient_X}``, where X can be: + +- ``Matlab`` or ``Matlab_Discrete`` +- ``Icon`` or ``Icon_Discrete`` +- ``Elan`` or ``Elan_Discrete`` +- ``Fire`` or ``Fire_Discrete`` +- ``IceAndFire`` or ``IceAndFire_Discrete`` + + +The default values ``AdvancedViz_DefaultColorGradient`` or ``AdvancedViz_DefaultColorGradient_Discrete`` are equal to Matlab and ``Matlab_Discrete``. + +An example of topography rendering using these color gradients can be found :ref:`Doc_Mensia_AdvViz_Configuration` "here". + +.. _Doc_BoxAlgorithm_ContinuousBars_VizSettings: + +Visualization Settings +---------------------- + +At runtime, all the advanced visualization shared settings are exposed, as described in :ref:`Doc_Mensia_AdvViz_Configuration_RuntimeToolbar`. + +.. _Doc_BoxAlgorithm_ContinuousBars_Examples: + +Examples +-------- + +In the following example, we compute the band power of the bipolar channel C3-C4 in the 8-15 Hz frequency range, and average it over the last 32 epochs received. + +You can find a commented scenario in the provided sample set, the scenario file name is \textit{ContinuousBars.mxs}. + +.. figure:: images/ContinuousBars_Example.png + :alt: Example of scenario using the Continuous Bars + :align: center + + Example of scenario using the Continuous Bars + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_ContinuousBitmap.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_ContinuousBitmap.rst new file mode 100644 index 0000000..515d479 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_ContinuousBitmap.rst @@ -0,0 +1,120 @@ +.. _Doc_BoxAlgorithm_ContinuousBitmap: + +Continuous Bitmap +================= + +.. container:: attribution + + :Author: + Yann Renard + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_ContinuousBitmap.png + +The *Continuous Bitmap* displays input data in form of a 2D map of colored blocks (or *bitmap*). +The display is done **continuously** , meaning that once the end of the horizontal scale is reached, it goes back to the origin. + +The *Continuous Bitmap* box shares common concepts and settings with the other boxes in the **Mensia Advanced Visualization Toolset**. +Additional information are available in the dedicated documentation pages: + +- :ref:`Doc_Mensia_AdvViz_Concepts` +- :ref:`Doc_Mensia_AdvViz_Configuration` + + + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Streamed matrix" + "Markers", "Stimulations" + +Matrix +~~~~~~ + +The first input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). +Please set the input type according to the actual stream type connected. + +Markers +~~~~~~~ + +The second input expect stimulations. They will be displayed as **red vertical lines**. + +.. _Doc_BoxAlgorithm_ContinuousBitmap_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Channel Localisation", "Filename", "${AdvancedViz_ChannelLocalisation}" + "Temporal Coherence", "Temporal Coherence", "Time Locked" + "Time Scale", "Float", "20" + "Matrix Count", "Integer", "50" + "Gain", "Float", "1" + "Caption", "String", "" + "Color", "Color Gradient", "${AdvancedViz_DefaultColorGradient}" + +Channel Localisation +~~~~~~~~~~~~~~~~~~~~ + +The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. +A default configuration file is provided, and its path stored in the configuration token ``${AdvancedViz_ChannelLocalisation}``. + +Temporal Coherence +~~~~~~~~~~~~~~~~~~ + +Select *Time Locked* for a continuous data stream, and specify the *time scale* below. +Select *Independent* for a discontinuous data stream, and specify the *matrix count* below. + +Time Scale +~~~~~~~~~~ + +The time scale in seconds, before the displays goes back to the origin. + +Matrix Count +~~~~~~~~~~~~ + +The number of input matrices to receive before the displays goes back to the origin. + +Gain +~~~~ + +If this checkbox is ticked, the vertical scale is shifted so that 0 is at the bottom. Only positive values will be displayed. + +Caption +~~~~~~~ + +Gain (floating-point scalar factor) to apply to the input values before display. + +Color +~~~~~ + +Label to be displayed on top of the visualization window. + +.. _Doc_BoxAlgorithm_ContinuousBitmap_VizSettings: + +Visualization Settings +---------------------- + +At runtime, all the advanced visualization shared settings are exposed, as described in :ref:`Doc_Mensia_AdvViz_Configuration_RuntimeToolbar`. + +.. _Doc_BoxAlgorithm_ContinuousBitmap_Examples: + +Examples +-------- + +In the following example, we compute the band power of the input signal in the 8-15 Hz frequency range, and average it over the last 32 epochs received. + +You can find a commented scenario in the provided sample set, the scenario file name is \textit{ContinuousBitmap.mxs}. + +.. figure:: images/ContinuousBitmap_Example.png + :alt: Example of scenario using the Continuous Bitmap + :align: center + + Example of scenario using the Continuous Bitmap + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_ContinuousMultiOscilloscope.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_ContinuousMultiOscilloscope.rst new file mode 100644 index 0000000..4d0307c --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_ContinuousMultiOscilloscope.rst @@ -0,0 +1,145 @@ +.. _Doc_BoxAlgorithm_ContinuousMultiOscilloscope: + +Continuous Multi Oscilloscope +============================= + +.. container:: attribution + + :Author: + Yann Renard + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_ContinuousMultiOscilloscope.png + +The *Continuous Multi-Oscilloscope* displays temporal numerical data in the form of curves, on the same vertical axis. +Each channel is given a color according to a color gradient, rendered additively. +The display is done **continuously** , meaning that once the end of the horizontal scale is reached, it goes back to the origin. + +The *Continuous Multi-Oscilloscope* box shares common concepts and settings with the other boxes in the **Mensia Advanced Visualization Toolset**. +Additional information are available in the dedicated documentation pages: + +- :ref:`Doc_Mensia_AdvViz_Concepts` +- :ref:`Doc_Mensia_AdvViz_Configuration` + + + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Signal" + "Markers", "Stimulations" + +Matrix +~~~~~~ + +The first input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). +Please set the input type according to the actual stream type connected. + +Markers +~~~~~~~ + +The second input expect stimulations. They will be displayed as **red vertical lines**. + +.. _Doc_BoxAlgorithm_ContinuousMultiOscilloscope_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Channel Localisation", "Filename", "${AdvancedViz_ChannelLocalisation}" + "Temporal Coherence", "Temporal Coherence", "Time Locked" + "Time Scale", "Float", "20" + "Matrix Count", "Integer", "50" + "Positive Data Only ?", "Boolean", "false" + "Gain", "Float", "1" + "Caption", "String", "" + "Translucency", "Float", "1" + "Color", "Color Gradient", "${AdvancedViz_DefaultColorGradient}" + +Channel Localisation +~~~~~~~~~~~~~~~~~~~~ + +The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. +A default configuration file is provided, and its path stored in the configuration token ``${AdvancedViz_ChannelLocalisation}``. + +Temporal Coherence +~~~~~~~~~~~~~~~~~~ + +Select *Time Locked* for a continuous data stream, and specify the *time scale* below. +Select *Independent* for a discontinuous data stream, and specify the *matrix count* below. + +Time Scale +~~~~~~~~~~ + +The time scale in seconds, before the displays goes back to the origin. + +Matrix Count +~~~~~~~~~~~~ + +The number of input matrices to receive before the displays goes back to the origin. + +Positive Data Only ? +~~~~~~~~~~~~~~~~~~~~ + +If this checkbox is ticked, the vertical scale is shifted so that 0 is at the bottom. Only positive values will be displayed. + +Gain +~~~~ + +Gain (floating-point scalar factor) to apply to the input values before display. + +Caption +~~~~~~~ + +Label to be displayed on top of the visualization window. + +Translucency +~~~~~~~~~~~~ + +This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + +Color +~~~~~ + +Color gradient to use. This setting can be set manually using the color gradient editor. +Several presets exist in form of configuration tokens ``${AdvancedViz_ColorGradient_X}``, where X can be: + +- ``Matlab`` or ``Matlab_Discrete`` +- ``Icon`` or ``Icon_Discrete`` +- ``Elan`` or ``Elan_Discrete`` +- ``Fire`` or ``Fire_Discrete`` +- ``IceAndFire`` or ``IceAndFire_Discrete`` + + +The default values ``AdvancedViz_DefaultColorGradient`` or ``AdvancedViz_DefaultColorGradient_Discrete`` are equal to Matlab and ``Matlab_Discrete``. + +An example of topography rendering using these color gradients can be found :ref:`Doc_Mensia_AdvViz_Configuration` "here". + +.. _Doc_BoxAlgorithm_ContinuousMultiOscilloscope_VizSettings: + +Visualization Settings +---------------------- + +At runtime, all the advanced visualization shared settings are exposed, as described in :ref:`Doc_Mensia_AdvViz_Configuration_RuntimeToolbar`. + +.. _Doc_BoxAlgorithm_ContinuousMultiOscilloscope_Examples: + +Examples +-------- + +In the following example, we compute the band power of the input signal in the 8-15 Hz frequency range, and average it over the last 32 epochs received. + +You can find a commented scenario in the provided sample set, the scenario file name is \textit{ContinuousMultiOscilloscope.mxs}. + +.. figure:: images/ContinuousMultiOscilloscope_Example.png + :alt: Example of scenario using the Continuous Multi-Oscilloscope + :align: center + + Example of scenario using the Continuous Multi-Oscilloscope + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_ContinuousOscilloscope.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_ContinuousOscilloscope.rst new file mode 100644 index 0000000..88dd88c --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_ContinuousOscilloscope.rst @@ -0,0 +1,145 @@ +.. _Doc_BoxAlgorithm_ContinuousOscilloscope: + +Continuous Oscilloscope +======================= + +.. container:: attribution + + :Author: + Yann Renard + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_ContinuousOscilloscope.png + +The *Continuous Oscilloscope* displays temporal numerical data in the form of curves, all the channels being distributed vertically, each one with its own horizontal axis. +Channel are given a color, overlaps are rendered additively. +The display is done **continuously** , meaning that once the end of the horizontal scale is reached, it goes back to the origin. + +The *Continuous Oscilloscope* box shares common concepts and settings with the other boxes in the **Mensia Advanced Visualization Toolset**. +Additional information are available in the dedicated documentation pages: + +- :ref:`Doc_Mensia_AdvViz_Concepts` +- :ref:`Doc_Mensia_AdvViz_Configuration` + + + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Signal" + "Markers", "Stimulations" + +Matrix +~~~~~~ + +The first input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). +Please set the input type according to the actual stream type connected. + +Markers +~~~~~~~ + +The second input expect stimulations. They will be displayed as **red vertical lines**. + +.. _Doc_BoxAlgorithm_ContinuousOscilloscope_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Channel Localisation", "Filename", "${AdvancedViz_ChannelLocalisation}" + "Temporal Coherence", "Temporal Coherence", "Time Locked" + "Time Scale", "Float", "20" + "Matrix Count", "Integer", "50" + "Positive Data Only ?", "Boolean", "false" + "Gain", "Float", "1" + "Caption", "String", "" + "Translucency", "Float", "1" + "Color", "Color", "${AdvancedViz_DefaultColor}" + +Channel Localisation +~~~~~~~~~~~~~~~~~~~~ + +The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. +A default configuration file is provided, and its path stored in the configuration token ``${AdvancedViz_ChannelLocalisation}``. + +Temporal Coherence +~~~~~~~~~~~~~~~~~~ + +Select *Time Locked* for a continuous data stream, and specify the *time scale* below. +Select *Independent* for a discontinuous data stream, and specify the *matrix count* below. + +Time Scale +~~~~~~~~~~ + +The time scale in seconds, before the displays goes back to the origin. + +Matrix Count +~~~~~~~~~~~~ + +The number of input matrices to receive before the displays goes back to the origin. + +Positive Data Only ? +~~~~~~~~~~~~~~~~~~~~ + +If this checkbox is ticked, the vertical scale is shifted so that 0 is at the bottom. Only positive values will be displayed. + +Gain +~~~~ + +Gain (floating-point scalar factor) to apply to the input values before display. + +Caption +~~~~~~~ + +Label to be displayed on top of the visualization window. + +Translucency +~~~~~~~~~~~~ + +This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + +Color +~~~~~ + +Color gradient to use. This setting can be set manually using the color gradient editor. +Several presets exist in form of configuration tokens ``${AdvancedViz_ColorGradient_X}``, where X can be: + +- ``Matlab`` or ``Matlab_Discrete`` +- ``Icon`` or ``Icon_Discrete`` +- ``Elan`` or ``Elan_Discrete`` +- ``Fire`` or ``Fire_Discrete`` +- ``IceAndFire`` or ``IceAndFire_Discrete`` + + +The default values ``AdvancedViz_DefaultColorGradient`` or ``AdvancedViz_DefaultColorGradient_Discrete`` are equal to Matlab and ``Matlab_Discrete``. + +An example of topography rendering using these color gradients can be found :ref:`Doc_Mensia_AdvViz_Configuration` "here". + +.. _Doc_BoxAlgorithm_ContinuousOscilloscope_VizSettings: + +Visualization Settings +---------------------- + +At runtime, all the advanced visualization shared settings are exposed, as described in :ref:`Doc_Mensia_AdvViz_Configuration_RuntimeToolbar`. + +.. _Doc_BoxAlgorithm_ContinuousOscilloscope_Examples: + +Examples +-------- + +In the following example, we filter the input signal in the 8-15 Hz frequency range and simply display it. + +You can find a commented scenario in the provided sample set, the scenario file name is \textit{ContinuousOscilloscope.mxs}. + +.. figure:: images/ContinuousOscilloscope_Example.png + :alt: Example of scenario using the Continuous Oscilloscope + :align: center + + Example of scenario using the Continuous Oscilloscope + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_ContinuousXYZPlot.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_ContinuousXYZPlot.rst new file mode 100644 index 0000000..0b214ca --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_ContinuousXYZPlot.rst @@ -0,0 +1,120 @@ +.. _Doc_BoxAlgorithm_ContinuousXYZPlot: + +Continuous XYZ Plot +=================== + +.. container:: attribution + + :Author: + Yann Renard + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_ContinuousXYZPlot.png + +The *Continuous XYZ Plot* displays temporal numerical data in a 2D (*resp.* 3D) space, consecutive rows of the input matrix being grouped by 2 (*resp.* 3) to form the 2D (*resp.* 3D) trajectories. +The display is done **continuously**, meaning that trajectories are persitent along time. Moreover, colors change as a function of time (samples order). + +The *Continuous XYZ Plot* box shares common concepts and settings with the other boxes in the **Mensia Advanced Visualization Toolset**. +Additional information are available in the dedicated documentation pages: + +- :ref:`Doc_Mensia_AdvViz_Concepts` +- :ref:`Doc_Mensia_AdvViz_Configuration` + + + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Signal" + +Matrix +~~~~~~ + +The first input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). +Please set the input type according to the actual stream type connected. + +.. _Doc_BoxAlgorithm_ContinuousXYZPlot_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Temporal Coherence", "Temporal Coherence", "Time Locked" + "Time Scale", "Float", "20" + "Matrix Count", "Integer", "50" + "Gain", "Float", "1" + "Caption", "String", "" + "Translucency", "Float", "1" + "Show Axis", "Boolean", "true" + "Use third channel as depth", "Boolean", "false" + "Color", "Color Gradient", "${AdvancedViz_DefaultColorGradient}" + +Temporal Coherence +~~~~~~~~~~~~~~~~~~ + +Select *Time Locked* for a continuous data stream, and specify the *time scale* below. +Select *Independent* for a discontinuous data stream, and specify the *matrix count* below. + +Time Scale +~~~~~~~~~~ + +The time scale in seconds, before the displays goes back to the origin. + +Matrix Count +~~~~~~~~~~~~ + +The number of input matrices to receive before the displays goes back to the origin. + +Gain +~~~~ + +Gain (floating-point scalar factor) to apply to the input values before display. + +Caption +~~~~~~~ + +Label to be displayed on top of the visualization window. + +Translucency +~~~~~~~~~~~~ + +This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + +Show Axis +~~~~~~~~~ + +If this checkbox is ticked, the axis and the grid are displayed. + +Use third channel as depth +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If this checkbox is ticked, trajectories are plotted in a 3D space, otherwise in a 2D space. + +Color +~~~~~ + +Color gradient to use. This setting can be set manually using the color gradient editor. +Several presets exist in form of configuration tokens ``${AdvancedViz_ColorGradient_X}``, where X can be: + +- ``Matlab`` or ``Matlab_Discrete`` +- ``Icon`` or ``Icon_Discrete`` +- ``Elan`` or ``Elan_Discrete`` +- ``Fire`` or ``Fire_Discrete`` +- ``IceAndFire`` or ``IceAndFire_Discrete`` + + +The default values ``AdvancedViz_DefaultColorGradient`` or ``AdvancedViz_DefaultColorGradient_Discrete`` are equal to Matlab and ``Matlab_Discrete``. + +.. _Doc_BoxAlgorithm_ContinuousXYZPlot_VizSettings: + +Visualization Settings +---------------------- + +At runtime, all the advanced visualization shared settings are exposed, as described in :ref:`Doc_Mensia_AdvViz_Configuration_RuntimeToolbar`. + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantBars.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantBars.rst new file mode 100644 index 0000000..f4c068e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantBars.rst @@ -0,0 +1,122 @@ +.. _Doc_BoxAlgorithm_InstantBars: + +Instant Bars +============ + +.. container:: attribution + + :Author: + Yann Renard + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_InstantBars.png + +The *Instant Bars* box displays input data in form of **vertical level bars**, one bar per value, one series of bar for each channel. +The display is done **instantly** , meaning that whenever a new data block arrives, it is displayed in the visualization windows, filling all the vertical space. +For lisibility (and esthetical) purpose, the bars are colored in a custom gradient (from left to right). + +This box is especially suitable for displaying **spectrum**. + +The *Instant Bars* box shares common concepts and settings with the other boxes of the **Mensia Advanced Visualization Toolset**. +Additional information are available in the dedicated documentation pages: + +- :ref:`Doc_Mensia_AdvViz_Concepts` +- :ref:`Doc_Mensia_AdvViz_Configuration` + + + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Spectrum" + +Matrix +~~~~~~ + +The input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). +Please set the input type according to the actual stream type connected. + +.. _Doc_BoxAlgorithm_InstantBars_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Channel Localisation", "Filename", "${AdvancedViz_ChannelLocalisation}" + "Positive Data Only ?", "Boolean", "false" + "Gain", "Float", "1" + "Caption", "String", "" + "Translucency", "Float", "1" + "Color", "Color Gradient", "${AdvancedViz_DefaultColorGradient}" + +Channel Localisation +~~~~~~~~~~~~~~~~~~~~ + +The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. +A default configuration file is provided, and its path stored in the configuration token ``${AdvancedViz_ChannelLocalisation}``. + +Positive Data Only ? +~~~~~~~~~~~~~~~~~~~~ + +If this checkbox is ticked, the vertical scale is shifted so that 0 is at the bottom. Only positive values will be displayed. + +Gain +~~~~ + +Gain (floating-point scalar factor) to apply to the input values before display. + +Caption +~~~~~~~ + +Label to be displayed on top of the visualization window. + +Translucency +~~~~~~~~~~~~ + +This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + +Color +~~~~~ + +Color gradient to use. This setting can be set manually using the color gradient editor. +Several presets exist in form of configuration tokens ``${AdvancedViz_ColorGradient_X}``, where X can be: + +- ``Matlab`` or ``Matlab_Discrete`` +- ``Icon`` or ``Icon_Discrete`` +- ``Elan`` or ``Elan_Discrete`` +- ``Fire`` or ``Fire_Discrete`` +- ``IceAndFire`` or ``IceAndFire_Discrete`` + + +The default values ``AdvancedViz_DefaultColorGradient`` or ``AdvancedViz_DefaultColorGradient_Discrete`` are equal to Matlab and ``Matlab_Discrete``. + +An example of topography rendering using these color gradients can be found :ref:`Doc_Mensia_AdvViz_Configuration` "here". + +.. _Doc_BoxAlgorithm_InstantBars_VizSettings: + +Visualization Settings +---------------------- + +At runtime, all the advanced visualization shared settings are exposed, as described in :ref:`Doc_Mensia_AdvViz_Configuration_RuntimeToolbar`. + +.. _Doc_BoxAlgorithm_InstantBars_Examples: + +Examples +-------- + +In the following example, we compute the FFT of the input EEG signal and display it. + +You can find a commented scenario in the provided sample set, the scenario file name is \textit{InstantBars.mxs}. + +.. figure:: images/InstantBars_Example.png + :alt: Example of scenario using the Instant Bars to display spectrum + :align: center + + Example of scenario using the Instant Bars to display spectrum + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantBitmap.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantBitmap.rst new file mode 100644 index 0000000..a4e3d51 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantBitmap.rst @@ -0,0 +1,102 @@ +.. _Doc_BoxAlgorithm_InstantBitmap: + +Instant Bitmap +============== + + +.. image:: images/Doc_BoxAlgorithm_InstantBitmap.png + +The *Instant Bitmap* box displays input data in form of a 2D map of colored blocks (or *bitmap*). +The display is done **instantly** , meaning that whenever a new data block arrives, it is displayed in the visualization windows, filling all the horizontal space. +The bitmap colors are chosen according to a custom gradient. + +The *Instant Bitmap* box shares common concepts and settings with the other boxes of the **Mensia Advanced Visualization Toolset**. +Additional information are available in the dedicated documentation pages: + +- :ref:`Doc_Mensia_AdvViz_Concepts` +- :ref:`Doc_Mensia_AdvViz_Configuration` + + + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Spectrum" + +Matrix +~~~~~~ + +The input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). +Please set the input type according to the actual stream type connected. + +.. _Doc_BoxAlgorithm_InstantBitmap_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Channel Localisation", "Filename", "${AdvancedViz_ChannelLocalisation}" + "Gain", "Float", "1" + "Caption", "String", "" + "Color", "Color Gradient", "${AdvancedViz_DefaultColorGradient}" + +Channel Localisation +~~~~~~~~~~~~~~~~~~~~ + +The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. +A default configuration file is provided, and its path stored in the configuration token ``${AdvancedViz_ChannelLocalisation}``. + +Gain +~~~~ + +Gain (floating-point scalar factor) to apply to the input values before display. + +Caption +~~~~~~~ + +Label to be displayed on top of the visualization window. + +Color +~~~~~ + +Color gradient to use. This setting can be set manually using the color gradient editor. +Several presets exist in form of configuration tokens ``${AdvancedViz_ColorGradient_X}``, where X can be: + +- ``Matlab`` or ``Matlab_Discrete`` +- ``Icon`` or ``Icon_Discrete`` +- ``Elan`` or ``Elan_Discrete`` +- ``Fire`` or ``Fire_Discrete`` +- ``IceAndFire`` or ``IceAndFire_Discrete`` + + +The default values ``AdvancedViz_DefaultColorGradient`` or ``AdvancedViz_DefaultColorGradient_Discrete`` are equal to Matlab and ``Matlab_Discrete``. + +An example of topography rendering using these color gradients can be found :ref:`Doc_Mensia_AdvViz_Configuration` "here". + +.. _Doc_BoxAlgorithm_InstantBitmap_VizSettings: + +Visualization Settings +---------------------- + +At runtime, all the advanced visualization shared settings are exposed, as described in :ref:`Doc_Mensia_AdvViz_Configuration_RuntimeToolbar`. + +.. _Doc_BoxAlgorithm_InstantBitmap_Examples: + +Examples +-------- + +In the following example, we compute the FFT of the input EEG signal and display it. + +You can find a commented scenario in the provided sample set, the scenario file name is \textit{InstantBitmap.mxs}. + +.. figure:: images/InstantBitmap_Example.png + :alt: Example of scenario using the Instant Bitmap to display spectrum + :align: center + + Example of scenario using the Instant Bitmap to display spectrum + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantBitmap3DStream.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantBitmap3DStream.rst new file mode 100644 index 0000000..2c13a0e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantBitmap3DStream.rst @@ -0,0 +1,104 @@ +.. _Doc_BoxAlgorithm_InstantBitmap3DStream: + +Instant Bitmap (3D Stream) +========================== + +.. container:: attribution + + :Author: + Yann Renard + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_InstantBitmap3DStream.png + +The *Instant Bitmap (3D Stream)* box displays input data in form of 2D maps of colored blocks (or *bitmap*). +Each time a matrix is received, its contents are displayed to fill the visualization. Depending on the input type, the three dimensions of the matrix will be ordonned differently. +The bitmap colors are chosen according to a custom gradient. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Time-frequency" + "Markers", "Stimulations" + +Matrix +~~~~~~ + +The input matrices to be displayed. Currently this box supports only the Time-Frequency stream. + +Markers +~~~~~~~ + +The second input expects stimulations. They will be displayed as **colored vertical lines**. + +.. _Doc_BoxAlgorithm_InstantBitmap3DStream_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Channel Localisation", "Filename", "${AdvancedViz_ChannelLocalisation}" + "Gain", "Float", "1" + "Caption", "String", "" + "Color", "Color Gradient", "${AdvancedViz_DefaultColorGradient}" + +Channel Localisation +~~~~~~~~~~~~~~~~~~~~ + +The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. +A default configuration file is provided, and its path stored in the configuration token ``${AdvancedViz_ChannelLocalisation}``. + +Gain +~~~~ + +Gain (floating-point scalar factor) to apply to the input values before display. + +Caption +~~~~~~~ + +Label to be displayed on top of the visualization window. + +Color +~~~~~ + +Color gradient to use. This setting can be set manually using the color gradient editor. +Several presets exist in form of configuration tokens ``${AdvancedViz_ColorGradient_X}``, where X can be: + +- ``Matlab`` or ``Matlab_Discrete`` +- ``Icon`` or ``Icon_Discrete`` +- ``Elan`` or ``Elan_Discrete`` +- ``Fire`` or ``Fire_Discrete`` +- ``IceAndFire`` or ``IceAndFire_Discrete`` + + +The default values ``AdvancedViz_DefaultColorGradient`` or ``AdvancedViz_DefaultColorGradient_Discrete`` are equal to ``Matlab`` and ``Matlab_Discrete``. + +An example of topography rendering using these color gradients can be found :ref:`Doc_Mensia_AdvViz_Configuration` "here". + +.. _Doc_BoxAlgorithm_InstantBitmap3DStream_VizSettings: + +Visualization Settings +---------------------- + +At runtime, all the advanced visualization shared settings are exposed, as described in :ref:`Doc_Mensia_AdvViz_Configuration_RuntimeToolbar`. + +.. _Doc_BoxAlgorithm_InstantBitmap3DStream_Examples: + +Examples +-------- + +In the following example, we compute the Time-Frequency Analysis for a generated signal. +You can find a commented scenario in the provided sample set, the scenario file name is InstantBitmap3DStream.mxs. + +.. figure:: images/InstantBitmap3DStream_Example.png + :alt: Example of scenario using the Instant Bitmap (3D Stream) + :align: center + + Example of scenario using the Instant Bitmap (3D Stream) + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantMultiOscilloscope.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantMultiOscilloscope.rst new file mode 100644 index 0000000..d415e53 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantMultiOscilloscope.rst @@ -0,0 +1,121 @@ +.. _Doc_BoxAlgorithm_InstantMultiOscilloscope: + +Instant Multi Oscilloscope +========================== + +.. container:: attribution + + :Author: + Yann Renard + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_InstantMultiOscilloscope.png + +The *Instant Multi-Oscilloscope* displays temporal numerical data in the form of curves, on the same vertical axis. +Each channel is given a color according to a color gradient, rendered additively. +The display is done **instantly** , meaning that whenever a new data block arrives, it is displayed in the visualization windows, filling all the horizontal space. + +The *Instant Multi-Oscilloscope* box shares common concepts and settings with the other boxes in the **Mensia Advanced Visualization Toolset**. +Additional information are available in the dedicated documentation pages: + +- :ref:`Doc_Mensia_AdvViz_Concepts` +- :ref:`Doc_Mensia_AdvViz_Configuration` + + + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Signal" + +Matrix +~~~~~~ + +The input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). +Please set the input type according to the actual stream type connected. + +.. _Doc_BoxAlgorithm_InstantMultiOscilloscope_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Channel Localisation", "Filename", "${AdvancedViz_ChannelLocalisation}" + "Positive Data Only ?", "Boolean", "false" + "Gain", "Float", "1" + "Caption", "String", "" + "Translucency", "Float", "1" + "Color", "Color Gradient", "${AdvancedViz_DefaultColorGradient}" + +Channel Localisation +~~~~~~~~~~~~~~~~~~~~ + +The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. +A default configuration file is provided, and its path stored in the configuration token ``${AdvancedViz_ChannelLocalisation}``. + +Positive Data Only ? +~~~~~~~~~~~~~~~~~~~~ + +If this checkbox is ticked, the vertical scale is shifted so that 0 is at the bottom. Only positive values will be displayed. + +Gain +~~~~ + +Gain (floating-point scalar factor) to apply to the input values before display. + +Caption +~~~~~~~ + +Label to be displayed on top of the visualization window. + +Translucency +~~~~~~~~~~~~ + +This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + +Color +~~~~~ + +Color gradient to use. This setting can be set manually using the color gradient editor. +Several presets exist in form of configuration tokens ``${AdvancedViz_ColorGradient_X}``, where X can be: + +- ``Matlab`` or ``Matlab_Discrete`` +- ``Icon`` or ``Icon_Discrete`` +- ``Elan`` or ``Elan_Discrete`` +- ``Fire`` or ``Fire_Discrete`` +- ``IceAndFire`` or ``IceAndFire_Discrete`` + + +The default values ``AdvancedViz_DefaultColorGradient`` or ``AdvancedViz_DefaultColorGradient_Discrete`` are equal to Matlab and ``Matlab_Discrete``. + +An example of topography rendering using these color gradients can be found :ref:`Doc_Mensia_AdvViz_Configuration` "here". + +.. _Doc_BoxAlgorithm_InstantMultiOscilloscope_VizSettings: + +Visualization Settings +---------------------- + +At runtime, all the advanced visualization shared settings are exposed, as described in :ref:`Doc_Mensia_AdvViz_Configuration_RuntimeToolbar`. + +.. _Doc_BoxAlgorithm_InstantMultiOscilloscope_Examples: + +Examples +-------- + +In the following example, we compute the FFT of the average right hand trial in a Motor Imagery session, +and visualize the spectrum around left and right motor cortices through 2 Laplacian filters around C3 and C4. + +You can find a commented scenario in the provided sample set, the scenario file name is \textit{InstantMultiOscilloscope.mxs}. + +.. figure:: images/InstantMultiOscilloscope_Example.png + :alt: Example of scenario using the Instant Multi-Oscilloscope + :align: center + + Example of scenario using the Instant Multi-Oscilloscope + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantOscilloscope.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantOscilloscope.rst new file mode 100644 index 0000000..c491f40 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantOscilloscope.rst @@ -0,0 +1,122 @@ +.. _Doc_BoxAlgorithm_InstantOscilloscope: + +Instant Oscilloscope +==================== + +.. container:: attribution + + :Author: + Yann Renard + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_InstantOscilloscope.png + +The *Instant Oscilloscope* displays temporal numerical data in the form of curves. +The display is done **instantly** , meaning that whenever a new data block arrives, it is displayed in the visualization windows, filling all the horizontal space. + +The *Instant Oscilloscope* box shares common concepts and settings with the other boxes in the **Mensia Advanced Visualization Toolset**. +Additional information are available in the dedicated documentation pages: + +- :ref:`Doc_Mensia_AdvViz_Concepts` +- :ref:`Doc_Mensia_AdvViz_Configuration` + + + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Signal" + +This box supports input modification: you can add or remove inputs at will. + +Matrix +~~~~~~ + +The input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). +Please set the input type according to the actual stream type connected. + +.. _Doc_BoxAlgorithm_InstantOscilloscope_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Channel Localisation", "Filename", "${AdvancedViz_ChannelLocalisation}" + "Positive Data Only ?", "Boolean", "false" + "Gain", "Float", "1" + "Caption", "String", "" + "Translucency", "Float", "1" + "Color", "Color", "${AdvancedViz_DefaultColor}" + +Channel Localisation +~~~~~~~~~~~~~~~~~~~~ + +The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. +A default configuration file is provided, and its path stored in the configuration token ``${AdvancedViz_ChannelLocalisation}``. + +Positive Data Only ? +~~~~~~~~~~~~~~~~~~~~ + +If this checkbox is ticked, the vertical scale is shifted so that 0 is at the bottom. Only positive values will be displayed. + +Gain +~~~~ + +Gain (floating-point scalar factor) to apply to the input values before display. + +Caption +~~~~~~~ + +Label to be displayed on top of the visualization window. + +Translucency +~~~~~~~~~~~~ + +This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + +Color +~~~~~ + +Color gradient to use. This setting can be set manually using the color gradient editor. +Several presets exist in form of configuration tokens ``${AdvancedViz_ColorGradient_X}``, where X can be: + +- ``Matlab`` or ``Matlab_Discrete`` +- ``Icon`` or ``Icon_Discrete`` +- ``Elan`` or ``Elan_Discrete`` +- ``Fire`` or ``Fire_Discrete`` +- ``IceAndFire`` or ``IceAndFire_Discrete`` + + +The default values ``AdvancedViz_DefaultColorGradient`` or ``AdvancedViz_DefaultColorGradient_Discrete`` are equal to Matlab and ``Matlab_Discrete``. + +An example of topography rendering using these color gradients can be found :ref:`Doc_Mensia_AdvViz_Configuration` "here". + +.. _Doc_BoxAlgorithm_InstantOscilloscope_VizSettings: + +Visualization Settings +---------------------- + +At runtime, all the advanced visualization shared settings are exposed, as described in :ref:`Doc_Mensia_AdvViz_Configuration_RuntimeToolbar`. + +.. _Doc_BoxAlgorithm_InstantOscilloscope_Examples: + +Examples +-------- + +In the following example, we compute the FFT of the average right hand trial in a Motor Imagery session, +and visualize the spectrum around left and right motor cortices through 2 Laplacian filters around C3 and C4. + +You can find a commented scenario in the provided sample set, the scenario file name is \textit{InstantOscilloscope.mxs}. + +.. figure:: images/InstantOscilloscope_Example.png + :alt: Example of scenario using the Instant Oscilloscope + :align: center + + Example of scenario using the Instant Oscilloscope + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantXYZPlot.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantXYZPlot.rst new file mode 100644 index 0000000..dacb2b2 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_InstantXYZPlot.rst @@ -0,0 +1,101 @@ +.. _Doc_BoxAlgorithm_InstantXYZPlot: + +Instant XYZ Plot +================ + +.. container:: attribution + + :Author: + Yann Renard + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_InstantXYZPlot.png + +The *Instant XYZ Plot* displays temporal numerical data in a 2D (*resp.* 3D) space, consecutive rows of the input matrix being grouped by 2 (*resp.* 3) to form the 2D (*resp.* 3D) trajectories. +The display is done **instantly**, meaning that whenever a new data block arrives, it is displayed in the visualization windows, without previous trajectories. Moreover, colors change as a function of time (samples order). + +The *Instant XYZ Plot* box shares common concepts and settings with the other boxes in the **Mensia Advanced Visualization Toolset**. +Additional information are available in the dedicated documentation pages: + +- :ref:`Doc_Mensia_AdvViz_Concepts` +- :ref:`Doc_Mensia_AdvViz_Configuration` + + + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Signal" + +Matrix +~~~~~~ + +The input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). +Please set the input type according to the actual stream type connected. + +.. _Doc_BoxAlgorithm_InstantXYZPlot_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Gain", "Float", "1" + "Caption", "String", "" + "Translucency", "Float", "1" + "Show Axis", "Boolean", "true" + "Use third channel as depth", "Boolean", "false" + "Color", "Color Gradient", "${AdvancedViz_DefaultColorGradient}" + +Gain +~~~~ + +Gain (floating-point scalar factor) to apply to the input values before display. + +Caption +~~~~~~~ + +Label to be displayed on top of the visualization window. + +Translucency +~~~~~~~~~~~~ + +This setting expect a value between 0 and 1, from transparent to opaque color rendering (nb: this value is the alpha component of the color). + +Show Axis +~~~~~~~~~ + +If this checkbox is ticked, the axis and the grid are displayed. + +Use third channel as depth +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If this checkbox is ticked, trajectories are plotted in a 3D space, otherwise in a 2D space. + +Color +~~~~~ + +Color gradient to use. This setting can be set manually using the color gradient editor. +Several presets exist in form of configuration tokens ``${AdvancedViz_ColorGradient_X}``, where X can be: + +- ``Matlab`` or ``Matlab_Discrete`` +- ``Icon`` or ``Icon_Discrete`` +- ``Elan`` or ``Elan_Discrete`` +- ``Fire`` or ``Fire_Discrete`` +- ``IceAndFire`` or ``IceAndFire_Discrete`` + + +The default values ``AdvancedViz_DefaultColorGradient`` or ``AdvancedViz_DefaultColorGradient_Discrete`` are equal to Matlab and ``Matlab_Discrete``. + +.. _Doc_BoxAlgorithm_InstantXYZPlot_VizSettings: + +Visualization Settings +---------------------- + +At runtime, all the advanced visualization shared settings are exposed, as described in :ref:`Doc_Mensia_AdvViz_Configuration_RuntimeToolbar`. + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_StackedBitmapHorizontal.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_StackedBitmapHorizontal.rst new file mode 100644 index 0000000..9214b24 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_StackedBitmapHorizontal.rst @@ -0,0 +1,135 @@ +.. _Doc_BoxAlgorithm_StackedBitmapHorizontal: + +Stacked Bitmap (Horizontal) +=========================== + +.. container:: attribution + + :Author: + Yann Renard + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_StackedBitmapHorizontal.png + +The *Stacked Bitmap (Horizontal)* box displays input data in form of 2D maps of colored blocks (or *bitmap*). +All the bitmaps are stacked horizontally, starting from the left edge of the window. +Whenever a new data block arrives, it is added to the visualization windows. If the end of the matrix count scale is reached, it goes back to the origin. +The bitmap colors are chosen according to a custom gradient. + +The *Stacked Bitmap (Horizontal)* box shares common concepts and settings with the other boxes of the **Mensia Advanced Visualization Toolset**. +Additional information are available in the dedicated documentation pages: + +- :ref:`Doc_Mensia_AdvViz_Concepts` +- :ref:`Doc_Mensia_AdvViz_Configuration` + + + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Streamed matrix" + "Markers", "Stimulations" + +Matrix +~~~~~~ + +The first input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). +Please set the input type according to the actual stream type connected. + +Markers +~~~~~~~ + +The second input expect stimulations. They will be displayed as **colored vertical lines**. + +.. _Doc_BoxAlgorithm_StackedBitmapHorizontal_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Channel Localisation", "Filename", "${AdvancedViz_ChannelLocalisation}" + "Temporal Coherence", "Temporal Coherence", "Time Locked" + "Time Scale", "Float", "20" + "Matrix Count", "Integer", "50" + "Gain", "Float", "1" + "Caption", "String", "" + "Color", "Color Gradient", "${AdvancedViz_DefaultColorGradient}" + +Channel Localisation +~~~~~~~~~~~~~~~~~~~~ + +The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. +A default configuration file is provided, and its path stored in the configuration token ``${AdvancedViz_ChannelLocalisation}``. + +Temporal Coherence +~~~~~~~~~~~~~~~~~~ + +Select *Time Locked* for a continuous data stream, and specify the *time scale* below. +Select *Independent* for a discontinuous data stream, and specify the *matrix count* below. + +Time Scale +~~~~~~~~~~ + +The time scale in seconds, before the displays goes back to the origin. + +Matrix Count +~~~~~~~~~~~~ + +The number of input matrices to receive before the displays goes back to the origin. + +Gain +~~~~ + +Gain (floating-point scalar factor) to apply to the input values before display. + +Caption +~~~~~~~ + +Label to be displayed on top of the visualization window. + +Color +~~~~~ + +Color gradient to use. This setting can be set manually using the color gradient editor. +Several presets exist in form of configuration tokens ``${AdvancedViz_ColorGradient_X}``, where X can be: + +- ``Matlab`` or ``Matlab_Discrete`` +- ``Icon`` or ``Icon_Discrete`` +- ``Elan`` or ``Elan_Discrete`` +- ``Fire`` or ``Fire_Discrete`` +- ``IceAndFire`` or ``IceAndFire_Discrete`` + + +The default values ``AdvancedViz_DefaultColorGradient`` or ``AdvancedViz_DefaultColorGradient_Discrete`` are equal to Matlab and ``Matlab_Discrete``. + +An example of topography rendering using these color gradients can be found :ref:`Doc_Mensia_AdvViz_Configuration` "here". + +.. _Doc_BoxAlgorithm_StackedBitmapHorizontal_VizSettings: + +Visualization Settings +---------------------- + +At runtime, all the advanced visualization shared settings are exposed, as described in :ref:`Doc_Mensia_AdvViz_Configuration_RuntimeToolbar`. + +.. _Doc_BoxAlgorithm_StackedBitmapHorizontal_Examples: + +Examples +-------- + +In the following example, we compute the FFT of every right-hand trial in a Motor Imagery session, filtered spatially around the two motor cortices. +All the spectra are stacked on top of each other. + +You can find a commented scenario in the provided sample set, the scenario file name is \textit{StackedBitmapHorz.mxs}. + +.. figure:: images/StackedBitmapHorz_Example.png + :alt: Example of scenario using the Stacked Bitmap (Horizontal) + :align: center + + Example of scenario using the Stacked Bitmap (Horizontal) + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_StackedBitmapVertical.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_StackedBitmapVertical.rst new file mode 100644 index 0000000..235c3cb --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/Doc_BoxAlgorithm_StackedBitmapVertical.rst @@ -0,0 +1,135 @@ +.. _Doc_BoxAlgorithm_StackedBitmapVertical: + +Stacked Bitmap (Vertical) +========================= + +.. container:: attribution + + :Author: + Yann Renard + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_StackedBitmapVertical.png + +The *Stacked Bitmap (Vertical)* box displays input data in form of 2D maps of colored blocks (or *bitmap*). +All the bitmaps are stacked vertically, starting from the bottom edge of the window. +Whenever a new data block arrives, it is added to the visualization windows. If the end of the matrix count scale is reached, it goes back to the origin. +The bitmap colors are chosen according to a custom gradient. + +The *Stacked Bitmap (Vertical)* box shares common concepts and settings with the other boxes of the **Mensia Advanced Visualization Toolset**. +Additional information are available in the dedicated documentation pages: + +- :ref:`Doc_Mensia_AdvViz_Concepts` +- :ref:`Doc_Mensia_AdvViz_Configuration` + + + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Streamed matrix" + "Markers", "Stimulations" + +Matrix +~~~~~~ + +The first input can be a streamed matrix or any derived stream (Signal, Spectrum, Feature Vector). +Please set the input type according to the actual stream type connected. + +Markers +~~~~~~~ + +The second input expect stimulations. They will be displayed as **colored vertical lines**. + +.. _Doc_BoxAlgorithm_StackedBitmapVertical_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Channel Localisation", "Filename", "${AdvancedViz_ChannelLocalisation}" + "Temporal Coherence", "Temporal Coherence", "Time Locked" + "Time Scale", "Float", "20" + "Matrix Count", "Integer", "50" + "Gain", "Float", "1" + "Caption", "String", "" + "Color", "Color Gradient", "${AdvancedViz_DefaultColorGradient}" + +Channel Localisation +~~~~~~~~~~~~~~~~~~~~ + +The channel localisation file containing the cartesian coordinates of the electrodes to be displayed. +A default configuration file is provided, and its path stored in the configuration token ``${AdvancedViz_ChannelLocalisation}``. + +Temporal Coherence +~~~~~~~~~~~~~~~~~~ + +Select *Time Locked* for a continuous data stream, and specify the *time scale* below. +Select *Independent* for a discontinuous data stream, and specify the *matrix count* below. + +Time Scale +~~~~~~~~~~ + +The time scale in seconds, before the displays goes back to the origin. + +Matrix Count +~~~~~~~~~~~~ + +The number of input matrices to receive before the displays goes back to the origin. + +Gain +~~~~ + +Gain (floating-point scalar factor) to apply to the input values before display. + +Caption +~~~~~~~ + +Label to be displayed on top of the visualization window. + +Color +~~~~~ + +Color gradient to use. This setting can be set manually using the color gradient editor. +Several presets exist in form of configuration tokens ``${AdvancedViz_ColorGradient_X}``, where X can be: + +- ``Matlab`` or ``Matlab_Discrete`` +- ``Icon`` or ``Icon_Discrete`` +- ``Elan`` or ``Elan_Discrete`` +- ``Fire`` or ``Fire_Discrete`` +- ``IceAndFire`` or ``IceAndFire_Discrete`` + + +The default values ``AdvancedViz_DefaultColorGradient`` or ``AdvancedViz_DefaultColorGradient_Discrete`` are equal to Matlab and ``Matlab_Discrete``. + +An example of topography rendering using these color gradients can be found :ref:`Doc_Mensia_AdvViz_Configuration` "here". + +.. _Doc_BoxAlgorithm_StackedBitmapVertical_VizSettings: + +Visualization Settings +---------------------- + +At runtime, all the advanced visualization shared settings are exposed, as described in :ref:`Doc_Mensia_AdvViz_Configuration_RuntimeToolbar`. + +.. _Doc_BoxAlgorithm_StackedBitmapVertical_Examples: + +Examples +-------- + +In the following example, we compute the FFT of every right-hand trial in a Motor Imagery session, filtered spatially around the two motor cortices. +All the spectra are stacked on top of each other. + +You can find a commented scenario in the provided sample set, the scenario file name is \textit{StackedBitmapVert.mxs}. + +.. figure:: images/StackedBitmapVert_Example.png + :alt: Example of scenario using the Stacked Bitmap (Vertical) + :align: center + + Example of scenario using the Stacked Bitmap (Vertical) + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/2DTopography_ColorGradients.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/2DTopography_ColorGradients.png new file mode 100644 index 0000000..39372c8 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/2DTopography_ColorGradients.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/2DTopography_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/2DTopography_Example.png new file mode 100644 index 0000000..2ccbabc Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/2DTopography_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DCubes_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DCubes_Example.png new file mode 100644 index 0000000..c662250 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DCubes_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DTomographicVisualization_Display.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DTomographicVisualization_Display.png new file mode 100644 index 0000000..c42348e Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DTomographicVisualization_Display.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DTomographicVisualization_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DTomographicVisualization_Example.png new file mode 100644 index 0000000..1eca308 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DTomographicVisualization_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DTopography_Display.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DTopography_Display.png new file mode 100644 index 0000000..5825ef8 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DTopography_Display.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DTopography_ERPReplay.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DTopography_ERPReplay.png new file mode 100644 index 0000000..655adef Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DTopography_ERPReplay.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DTopography_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DTopography_Example.png new file mode 100644 index 0000000..c53aa68 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/3DTopography_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/CartesianCoordinates1.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/CartesianCoordinates1.png new file mode 100644 index 0000000..24f33db Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/CartesianCoordinates1.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/CartesianCoordinates2.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/CartesianCoordinates2.png new file mode 100644 index 0000000..e04bb30 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/CartesianCoordinates2.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousBars_Display.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousBars_Display.png new file mode 100644 index 0000000..e79f73e Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousBars_Display.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousBars_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousBars_Example.png new file mode 100644 index 0000000..0f9b02a Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousBars_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousBitmap_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousBitmap_Example.png new file mode 100644 index 0000000..6dc9453 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousBitmap_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousMultiOscilloscope_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousMultiOscilloscope_Example.png new file mode 100644 index 0000000..ae2b35c Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousMultiOscilloscope_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousOscilloscope_Display.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousOscilloscope_Display.png new file mode 100644 index 0000000..bcefb1d Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousOscilloscope_Display.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousOscilloscope_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousOscilloscope_Example.png new file mode 100644 index 0000000..138de8a Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/ContinuousOscilloscope_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_2DTopography.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_2DTopography.png new file mode 100644 index 0000000..cae6409 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_2DTopography.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_3DCubes.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_3DCubes.png new file mode 100644 index 0000000..3c76819 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_3DCubes.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_3DTomographicVisualization.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_3DTomographicVisualization.png new file mode 100644 index 0000000..639dee6 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_3DTomographicVisualization.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_3DTopography.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_3DTopography.png new file mode 100644 index 0000000..eb205d8 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_3DTopography.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_ContinuousBars.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_ContinuousBars.png new file mode 100644 index 0000000..f081bd9 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_ContinuousBars.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_ContinuousBitmap.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_ContinuousBitmap.png new file mode 100644 index 0000000..81fa8b4 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_ContinuousBitmap.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_ContinuousMultiOscilloscope.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_ContinuousMultiOscilloscope.png new file mode 100644 index 0000000..0a6dbe6 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_ContinuousMultiOscilloscope.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_ContinuousOscilloscope.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_ContinuousOscilloscope.png new file mode 100644 index 0000000..5f6b814 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_ContinuousOscilloscope.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_ContinuousXYZPlot.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_ContinuousXYZPlot.png new file mode 100644 index 0000000..f6bbbc3 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_ContinuousXYZPlot.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantBars.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantBars.png new file mode 100644 index 0000000..f4a8bbd Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantBars.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantBitmap.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantBitmap.png new file mode 100644 index 0000000..448fe28 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantBitmap.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantBitmap3DStream.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantBitmap3DStream.png new file mode 100644 index 0000000..e15fd6e Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantBitmap3DStream.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantMultiOscilloscope.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantMultiOscilloscope.png new file mode 100644 index 0000000..a5ce377 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantMultiOscilloscope.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantOscilloscope.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantOscilloscope.png new file mode 100644 index 0000000..4b62556 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantOscilloscope.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantXYZPlot.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantXYZPlot.png new file mode 100644 index 0000000..7f7a449 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_InstantXYZPlot.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_StackedBitmapHorizontal.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_StackedBitmapHorizontal.png new file mode 100644 index 0000000..de88598 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_StackedBitmapHorizontal.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_StackedBitmapVertical.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_StackedBitmapVertical.png new file mode 100644 index 0000000..d56e5d9 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Doc_BoxAlgorithm_StackedBitmapVertical.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantBars_Display.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantBars_Display.png new file mode 100644 index 0000000..ead9e67 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantBars_Display.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantBars_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantBars_Example.png new file mode 100644 index 0000000..a52fb47 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantBars_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantBitmap3DStream_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantBitmap3DStream_Example.png new file mode 100644 index 0000000..18cb699 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantBitmap3DStream_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantBitmap_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantBitmap_Example.png new file mode 100644 index 0000000..9f5ba80 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantBitmap_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantMultiOscilloscope_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantMultiOscilloscope_Example.png new file mode 100644 index 0000000..4f6e0c9 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantMultiOscilloscope_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantOscilloscope_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantOscilloscope_Example.png new file mode 100644 index 0000000..33215a4 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/InstantOscilloscope_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Settings_ChannelLocalisation.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Settings_ChannelLocalisation.png new file mode 100644 index 0000000..9c84094 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Settings_ChannelLocalisation.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Settings_Translucency-1-05.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Settings_Translucency-1-05.png new file mode 100644 index 0000000..bc257b4 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/Settings_Translucency-1-05.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/StackedBitmapHorz_Display.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/StackedBitmapHorz_Display.png new file mode 100644 index 0000000..5ba0b60 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/StackedBitmapHorz_Display.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/StackedBitmapHorz_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/StackedBitmapHorz_Example.png new file mode 100644 index 0000000..c3bb57a Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/StackedBitmapHorz_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/StackedBitmapVert_Display.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/StackedBitmapVert_Display.png new file mode 100644 index 0000000..7c0ec9b Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/StackedBitmapVert_Display.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/StackedBitmapVert_ERPDisplay.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/StackedBitmapVert_ERPDisplay.png new file mode 100644 index 0000000..b3b2e43 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/StackedBitmapVert_ERPDisplay.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/StackedBitmapVert_Example.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/StackedBitmapVert_Example.png new file mode 100644 index 0000000..7c0ec9b Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/StackedBitmapVert_Example.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_1.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_1.png new file mode 100644 index 0000000..09577ec Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_1.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_2.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_2.png new file mode 100644 index 0000000..c76d493 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_2.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_3.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_3.png new file mode 100644 index 0000000..e4f0fd9 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_3.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_4.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_4.png new file mode 100644 index 0000000..11ba0d2 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_4.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_5.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_5.png new file mode 100644 index 0000000..fc23034 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_5.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_6.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_6.png new file mode 100644 index 0000000..2c714a0 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/UseCase1_6.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/designer-box-list.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/designer-box-list.png new file mode 100644 index 0000000..a743bc1 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/designer-box-list.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/leaving.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/leaving.png new file mode 100644 index 0000000..78ae1fc Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/leaving.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/tick.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/tick.png new file mode 100644 index 0000000..e80333f Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/boxes/images/tick.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/designer-box-list.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/designer-box-list.png new file mode 100644 index 0000000..a743bc1 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/designer-box-list.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/leaving.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/leaving.png new file mode 100644 index 0000000..78ae1fc Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/leaving.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/tick.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/tick.png new file mode 100644 index 0000000..e80333f Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/doc/tick.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/LORETA-Talairach-BAs.csv b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/LORETA-Talairach-BAs.csv new file mode 100644 index 0000000..7bb3cf9 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/LORETA-Talairach-BAs.csv @@ -0,0 +1,2395 @@ +x-min,y-mni,z-mni,x-tal,y-tal,z-tal,dist1,BA1,AnatA1,AnatB1,dist2,BA2,AnatA2,AnatB2,dist3,BA3,AnatA3,AnatB3 +-52,-11,-41,-51,-12,-34,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,14,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,16,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +-45,-11,-41,-45,-12,-34,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,10,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,13,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +-38,-11,-41,-38,-12,-34,3,Brodmann area 20,Uncus,Limbic Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,12,Brodmann area 28,Uncus,Limbic Lobe +-31,-11,-41,-31,-12,-34,5,Brodmann area 20,Uncus,Limbic Lobe,7,Brodmann area 28,Uncus,Limbic Lobe,7,Brodmann area 36,Uncus,Limbic Lobe +32,-11,-41,32,-12,-34,5,Brodmann area 20,Uncus,Limbic Lobe,7,Brodmann area 28,Uncus,Limbic Lobe,8,Brodmann area 36,Uncus,Limbic Lobe +39,-11,-41,39,-12,-34,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,13,Brodmann area 28,Uncus,Limbic Lobe +46,-11,-41,46,-12,-34,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,10,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,14,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +53,-11,-41,52,-12,-34,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,14,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,17,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +-52,-4,-41,-51,-6,-34,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,9,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,12,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +-45,-4,-41,-45,-6,-34,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +-38,-4,-41,-38,-6,-34,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +-31,-4,-41,-31,-6,-34,2,Brodmann area 20,Uncus,Limbic Lobe,4,Brodmann area 36,Uncus,Limbic Lobe,8,Brodmann area 28,Uncus,Limbic Lobe +-24,-4,-41,-24,-6,-34,3,Brodmann area 36,Uncus,Limbic Lobe,5,Brodmann area 20,Uncus,Limbic Lobe,7,Brodmann area 28,Uncus,Limbic Lobe +25,-4,-41,25,-6,-34,3,Brodmann area 36,Uncus,Limbic Lobe,5,Brodmann area 20,Uncus,Limbic Lobe,7,Brodmann area 28,Uncus,Limbic Lobe +32,-4,-41,32,-6,-34,3,Brodmann area 20,Uncus,Limbic Lobe,5,Brodmann area 36,Uncus,Limbic Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +39,-4,-41,39,-6,-34,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +46,-4,-41,46,-6,-34,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,7,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +53,-4,-41,52,-6,-34,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,9,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,12,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +-52,3,-41,-51,1,-35,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,9,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +-45,3,-41,-45,1,-35,3,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-38,3,-41,-38,1,-35,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-31,3,-41,-31,1,-35,5,Brodmann area 20,Inferior Temporal Gyrus,Limbic Lobe,7,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 36,Uncus,Limbic Lobe +-24,3,-41,-24,1,-35,2,Brodmann area 38,Uncus,Limbic Lobe,4,Brodmann area 36,Uncus,Limbic Lobe,4,Brodmann area 20,Uncus,Limbic Lobe +18,3,-41,18,1,-35,5,Brodmann area 36,Uncus,Limbic Lobe,5,Brodmann area 38,Uncus,Limbic Lobe,8,Brodmann area 28,Uncus,Limbic Lobe +25,3,-41,25,1,-35,2,Brodmann area 38,Uncus,Limbic Lobe,3,Brodmann area 20,Uncus,Limbic Lobe,4,Brodmann area 36,Uncus,Limbic Lobe +32,3,-41,32,1,-35,5,Brodmann area 20,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 36,Uncus,Limbic Lobe +39,3,-41,39,1,-35,3,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +46,3,-41,46,1,-35,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +53,3,-41,52,1,-35,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,10,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +-45,10,-41,-45,8,-35,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe,11,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-38,10,-41,-38,8,-35,2,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 20,Middle Temporal Gyrus,Temporal Lobe +-31,10,-41,-31,8,-35,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 20,Middle Temporal Gyrus,Temporal Lobe +25,10,-41,25,8,-35,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 28,Uncus,Limbic Lobe,8,Brodmann area 36,Uncus,Limbic Lobe +32,10,-41,32,8,-35,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 20,Middle Temporal Gyrus,Temporal Lobe +39,10,-41,39,8,-35,1,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 20,Middle Temporal Gyrus,Temporal Lobe +46,10,-41,46,8,-35,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe,12,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-38,17,-41,-38,15,-35,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,15,Brodmann area 20,Middle Temporal Gyrus,Temporal Lobe +-31,17,-41,-31,15,-35,1,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,12,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,15,Brodmann area 28,Uncus,Limbic Lobe +32,17,-41,32,15,-35,2,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,11,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,15,Brodmann area 20,Middle Temporal Gyrus,Temporal Lobe +39,17,-41,39,15,-35,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,16,Brodmann area 20,Middle Temporal Gyrus,Temporal Lobe +-59,-18,-34,-58,-19,-28,5,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,13,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,23,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +-52,-18,-34,-51,-19,-28,1,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,14,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,18,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +-45,-18,-34,-45,-19,-28,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,12,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,16,Hippocampus,Parahippocampal Gyrus,Limbic Lobe +-38,-18,-34,-38,-19,-28,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,13,Brodmann area 28,Uncus,Limbic Lobe +-31,-18,-34,-31,-19,-28,4,Brodmann area 20,Uncus,Limbic Lobe,5,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,9,Brodmann area 28,Uncus,Limbic Lobe +32,-18,-34,32,-19,-28,4,Brodmann area 20,Uncus,Limbic Lobe,5,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,9,Brodmann area 28,Uncus,Limbic Lobe +39,-18,-34,39,-19,-28,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,7,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,13,Hippocampus,Parahippocampal Gyrus,Limbic Lobe +46,-18,-34,46,-19,-28,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,13,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,16,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe +53,-18,-34,52,-19,-28,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,13,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,19,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +60,-18,-34,59,-19,-28,5,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,14,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,24,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +-59,-11,-34,-58,-12,-28,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,12,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,22,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +-52,-11,-34,-51,-12,-28,1,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,18,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +-45,-11,-34,-45,-12,-28,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,9,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,15,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +-38,-11,-34,-38,-12,-28,2,Brodmann area 20,Uncus,Limbic Lobe,9,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 28,Uncus,Limbic Lobe +-31,-11,-34,-31,-12,-28,1,Brodmann area 20,Uncus,Limbic Lobe,3,Brodmann area 28,Uncus,Limbic Lobe,8,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +-24,-11,-34,-24,-12,-28,1,Brodmann area 28,Uncus,Limbic Lobe,4,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 20,Uncus,Limbic Lobe +25,-11,-34,25,-12,-28,1,Brodmann area 28,Uncus,Limbic Lobe,5,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 20,Uncus,Limbic Lobe +32,-11,-34,32,-12,-28,2,Brodmann area 20,Uncus,Limbic Lobe,4,Brodmann area 28,Uncus,Limbic Lobe,8,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +39,-11,-34,39,-12,-28,3,Brodmann area 20,Uncus,Limbic Lobe,9,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,11,Brodmann area 28,Uncus,Limbic Lobe +46,-11,-34,46,-12,-28,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,10,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,16,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +53,-11,-34,52,-12,-28,1,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,18,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +60,-11,-34,59,-12,-28,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,12,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,23,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +-59,-4,-34,-58,-5,-28,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,7,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,18,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-52,-4,-34,-51,-5,-28,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,13,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +-31,-4,-34,-31,-5,-28,5,Brodmann area 20,Uncus,Limbic Lobe,6,Brodmann area 36,Uncus,Limbic Lobe,7,Brodmann area 28,Uncus,Limbic Lobe +-24,-4,-34,-24,-5,-28,4,Brodmann area 36,Uncus,Limbic Lobe,5,Brodmann area 28,Uncus,Limbic Lobe,6,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe +-17,-4,-34,-17,-5,-28,2,Brodmann area 36,Uncus,Limbic Lobe,4,Brodmann area 28,Uncus,Limbic Lobe,6,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe +18,-4,-34,18,-5,-28,1,Brodmann area 36,Uncus,Limbic Lobe,4,Brodmann area 28,Uncus,Limbic Lobe,5,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe +25,-4,-34,25,-5,-28,4,Brodmann area 36,Uncus,Limbic Lobe,5,Brodmann area 28,Uncus,Limbic Lobe,7,Brodmann area 20,Uncus,Limbic Lobe +32,-4,-34,32,-5,-28,5,Brodmann area 20,Uncus,Limbic Lobe,6,Brodmann area 36,Uncus,Limbic Lobe,7,Brodmann area 28,Uncus,Limbic Lobe +39,-4,-34,39,-5,-28,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,10,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +46,-4,-34,46,-5,-28,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,11,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +53,-4,-34,52,-5,-28,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,14,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +60,-4,-34,59,-5,-28,5,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,19,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-52,3,-34,-51,1,-29,1,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-45,3,-34,-45,1,-29,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,8,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +-24,3,-34,-24,1,-29,3,Brodmann area 28,Uncus,Limbic Lobe,4,Brodmann area 36,Uncus,Limbic Lobe,5,Brodmann area 38,Uncus,Limbic Lobe +18,3,-34,18,1,-29,3,Brodmann area 28,Uncus,Limbic Lobe,3,Brodmann area 36,Uncus,Limbic Lobe,5,Brodmann area 38,Uncus,Limbic Lobe +25,3,-34,25,1,-29,4,Brodmann area 36,Uncus,Limbic Lobe,4,Brodmann area 28,Uncus,Limbic Lobe,6,Brodmann area 38,Uncus,Limbic Lobe +46,3,-34,46,1,-29,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,8,Brodmann area 38,Middle Temporal Gyrus,Temporal Lobe +53,3,-34,52,1,-29,1,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-52,10,-34,-51,8,-29,1,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,11,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-45,10,-34,-45,8,-29,1,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,11,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-38,10,-34,-38,8,-29,2,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,12,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-31,10,-34,-31,8,-29,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 28,Uncus,Limbic Lobe +-24,10,-34,-24,8,-29,1,Brodmann area 38,Uncus,Limbic Lobe,3,Brodmann area 28,Uncus,Limbic Lobe,8,Brodmann area 36,Uncus,Limbic Lobe +25,10,-34,25,8,-29,2,Brodmann area 38,Uncus,Limbic Lobe,4,Brodmann area 28,Uncus,Limbic Lobe,8,Brodmann area 36,Uncus,Limbic Lobe +32,10,-34,32,8,-29,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 28,Uncus,Limbic Lobe +39,10,-34,39,8,-29,2,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,12,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +46,10,-34,46,8,-29,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,11,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +53,10,-34,52,8,-29,1,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,11,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-45,17,-34,-45,15,-29,2,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,16,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +-38,17,-34,-38,15,-29,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,12,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +-31,17,-34,-31,15,-29,1,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,12,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +32,17,-34,32,15,-29,2,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,11,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +39,17,-34,39,15,-29,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,13,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +46,17,-34,46,15,-29,2,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,16,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +-52,-46,-27,-51,-46,-20,4,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,6,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,7,Brodmann area 36,Fusiform Gyrus,Temporal Lobe +-45,-46,-27,-45,-46,-20,5,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,7,Brodmann area 36,Fusiform Gyrus,Temporal Lobe,8,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +46,-46,-27,46,-46,-20,5,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,6,Brodmann area 36,Fusiform Gyrus,Temporal Lobe,8,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +53,-46,-27,52,-46,-20,5,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,6,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,7,Brodmann area 36,Fusiform Gyrus,Temporal Lobe +-59,-39,-27,-58,-39,-21,5,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,7,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,10,Brodmann area 36,Fusiform Gyrus,Temporal Lobe +-52,-39,-27,-51,-39,-21,1,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,3,Brodmann area 36,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +-45,-39,-27,-45,-39,-21,2,Brodmann area 36,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +-38,-39,-27,-38,-39,-21,5,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,6,Brodmann area 36,Fusiform Gyrus,Temporal Lobe,7,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +39,-39,-27,39,-39,-21,5,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 36,Fusiform Gyrus,Temporal Lobe,6,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +46,-39,-27,46,-39,-21,1,Brodmann area 36,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +53,-39,-27,52,-39,-21,2,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,4,Brodmann area 36,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +60,-39,-27,59,-39,-21,5,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,8,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,10,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-59,-32,-27,-58,-32,-21,5,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,10,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,11,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +-52,-32,-27,-51,-32,-21,3,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,8,Brodmann area 36,Fusiform Gyrus,Temporal Lobe,9,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +-45,-32,-27,-45,-32,-21,2,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,4,Brodmann area 36,Fusiform Gyrus,Temporal Lobe,9,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +-38,-32,-27,-38,-32,-21,2,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,10,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +-31,-32,-27,-31,-32,-21,3,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +32,-32,-27,32,-32,-21,3,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,6,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe +39,-32,-27,39,-32,-21,2,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,9,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +46,-32,-27,46,-32,-21,2,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 36,Fusiform Gyrus,Temporal Lobe,9,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +53,-32,-27,52,-32,-21,3,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,9,Brodmann area 36,Fusiform Gyrus,Temporal Lobe,9,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +60,-32,-27,59,-32,-21,5,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,10,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,12,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +-59,-25,-27,-58,-25,-21,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,9,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,16,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +-52,-25,-27,-51,-25,-21,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,13,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +-45,-25,-27,-45,-25,-21,3,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,8,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,14,Hippocampus,Parahippocampal Gyrus,Limbic Lobe +-38,-25,-27,-38,-25,-21,4,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,10,Hippocampus,Parahippocampal Gyrus,Limbic Lobe +-31,-25,-27,-31,-25,-21,4,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,4,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,8,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +-24,-25,-27,-24,-25,-21,2,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe +25,-25,-27,25,-25,-21,1,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,8,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe +32,-25,-27,32,-25,-21,4,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +39,-25,-27,39,-25,-21,4,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,10,Hippocampus,Parahippocampal Gyrus,Limbic Lobe +46,-25,-27,46,-25,-21,4,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,9,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,14,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +53,-25,-27,52,-25,-21,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,10,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,13,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +60,-25,-27,59,-25,-21,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,9,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,17,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +-59,-18,-27,-58,-19,-22,3,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,8,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,22,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +-52,-18,-27,-51,-19,-22,3,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,9,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,16,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +-45,-18,-27,-45,-19,-22,4,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,12,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,12,Hippocampus,Parahippocampal Gyrus,Limbic Lobe +-38,-18,-27,-38,-19,-22,3,Brodmann area 20,Sub-Gyral,Temporal Lobe,5,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,8,Hippocampus,Parahippocampal Gyrus,Limbic Lobe +-31,-18,-27,-31,-19,-22,4,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,7,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 20,Uncus,Limbic Lobe +32,-18,-27,32,-19,-22,4,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,7,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 20,Uncus,Limbic Lobe +39,-18,-27,39,-19,-22,3,Brodmann area 20,Sub-Gyral,Temporal Lobe,6,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,8,Hippocampus,Parahippocampal Gyrus,Limbic Lobe +46,-18,-27,46,-19,-22,4,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,12,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,13,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +53,-18,-27,52,-19,-22,3,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,8,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,17,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +60,-18,-27,59,-19,-22,3,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,9,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,22,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +-59,-11,-27,-58,-12,-22,3,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,7,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,20,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-52,-11,-27,-51,-12,-22,5,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,17,Hippocampus,Parahippocampal Gyrus,Limbic Lobe +-38,-11,-27,-38,-12,-22,2,Brodmann area 20,Sub-Gyral,Temporal Lobe,7,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,11,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +-31,-11,-27,-31,-12,-22,6,Brodmann area 20,Uncus,Limbic Lobe,6,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +-24,-11,-27,-24,-12,-22,2,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +-17,-11,-27,-17,-12,-22,3,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe,4,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 34,Uncus,Limbic Lobe +18,-11,-27,18,-12,-22,3,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe,3,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 34,Uncus,Limbic Lobe +25,-11,-27,25,-12,-22,3,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe +32,-11,-27,32,-12,-22,6,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 20,Uncus,Limbic Lobe,7,Brodmann area 28,Uncus,Limbic Lobe +39,-11,-27,39,-12,-22,2,Brodmann area 20,Sub-Gyral,Temporal Lobe,8,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,11,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +53,-11,-27,52,-12,-22,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,18,Hippocampus,Parahippocampal Gyrus,Limbic Lobe +60,-11,-27,59,-12,-22,2,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,7,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,20,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-59,-4,-27,-58,-5,-22,3,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,17,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-52,-4,-27,-51,-5,-22,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,13,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-31,-4,-27,-31,-5,-22,6,Amygdala,Uncus,Limbic Lobe,7,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,9,Brodmann area 28,Uncus,Limbic Lobe +-24,-4,-27,-24,-5,-22,2,Amygdala,Uncus,Limbic Lobe,5,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 28,Uncus,Limbic Lobe +-17,-4,-27,-17,-5,-22,2,Brodmann area 28,Uncus,Limbic Lobe,3,Brodmann area 34,Uncus,Limbic Lobe,4,Amygdala,Uncus,Limbic Lobe +18,-4,-27,18,-5,-22,2,Brodmann area 28,Uncus,Limbic Lobe,3,Amygdala,Uncus,Limbic Lobe,3,Brodmann area 34,Uncus,Limbic Lobe +25,-4,-27,25,-5,-22,3,Amygdala,Uncus,Limbic Lobe,6,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 28,Uncus,Limbic Lobe +32,-4,-27,32,-5,-22,7,Amygdala,Uncus,Limbic Lobe,7,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,9,Brodmann area 28,Uncus,Limbic Lobe +60,-4,-27,59,-5,-22,3,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,17,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-59,3,-27,-58,2,-23,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,11,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-52,3,-27,-51,2,-23,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,7,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-31,3,-27,-31,2,-23,4,Brodmann area 28,Uncus,Limbic Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe +-24,3,-27,-24,2,-23,4,Brodmann area 28,Uncus,Limbic Lobe,5,Amygdala,Uncus,Limbic Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-17,3,-27,-17,2,-23,1,Brodmann area 28,Uncus,Limbic Lobe,3,Brodmann area 34,Uncus,Limbic Lobe,7,Brodmann area 36,Uncus,Limbic Lobe +18,3,-27,18,2,-23,1,Brodmann area 28,Uncus,Limbic Lobe,3,Brodmann area 34,Uncus,Limbic Lobe,6,Brodmann area 36,Uncus,Limbic Lobe +25,3,-27,25,2,-23,4,Brodmann area 28,Uncus,Limbic Lobe,5,Amygdala,Uncus,Limbic Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +32,3,-27,32,2,-23,5,Brodmann area 28,Uncus,Limbic Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe +53,3,-27,52,2,-23,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,8,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +60,3,-27,59,2,-23,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,11,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-52,10,-27,-51,9,-23,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,11,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +-45,10,-27,-45,9,-23,1,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,12,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +-38,10,-27,-38,9,-23,5,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 28,Uncus,Limbic Lobe +-31,10,-27,-31,9,-23,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 28,Uncus,Limbic Lobe,7,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +32,10,-27,32,9,-23,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 28,Uncus,Limbic Lobe,8,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +39,10,-27,39,9,-23,5,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 28,Uncus,Limbic Lobe +46,10,-27,46,9,-23,1,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,11,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +53,10,-27,52,9,-23,1,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,11,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +-45,17,-27,-45,15,-23,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,11,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +-38,17,-27,-38,15,-23,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,12,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-31,17,-27,-31,15,-23,2,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,10,Brodmann area 28,Uncus,Limbic Lobe +32,17,-27,32,15,-23,1,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,11,Brodmann area 28,Uncus,Limbic Lobe +39,17,-27,39,15,-23,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,11,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +46,17,-27,46,15,-23,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,12,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +-10,24,-27,-10,22,-24,2,Brodmann area 11,Rectal Gyrus,Frontal Lobe,4,Brodmann area 47,Orbital Gyrus,Frontal Lobe,8,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +-3,24,-27,-3,22,-24,1,Brodmann area 11,Rectal Gyrus,Frontal Lobe,8,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,11,Brodmann area 47,Orbital Gyrus,Frontal Lobe +4,24,-27,4,22,-24,1,Brodmann area 11,Rectal Gyrus,Frontal Lobe,8,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 47,Orbital Gyrus,Frontal Lobe +11,24,-27,11,22,-24,3,Brodmann area 11,Rectal Gyrus,Frontal Lobe,3,Brodmann area 47,Orbital Gyrus,Frontal Lobe,8,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +-10,31,-27,-10,29,-24,2,Brodmann area 11,Rectal Gyrus,Frontal Lobe,3,Brodmann area 47,Orbital Gyrus,Frontal Lobe,8,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +-3,31,-27,-3,29,-24,0,Brodmann area 11,Rectal Gyrus,Frontal Lobe,8,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 47,Orbital Gyrus,Frontal Lobe +4,31,-27,4,29,-24,1,Brodmann area 11,Rectal Gyrus,Frontal Lobe,8,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 47,Orbital Gyrus,Frontal Lobe +11,31,-27,11,29,-24,2,Brodmann area 47,Orbital Gyrus,Frontal Lobe,3,Brodmann area 11,Rectal Gyrus,Frontal Lobe,8,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +-10,38,-27,-10,36,-24,1,Brodmann area 11,Rectal Gyrus,Frontal Lobe,5,Brodmann area 47,Orbital Gyrus,Frontal Lobe,11,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +-3,38,-27,-3,36,-24,2,Brodmann area 11,Rectal Gyrus,Frontal Lobe,11,Brodmann area 47,Orbital Gyrus,Frontal Lobe,12,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +4,38,-27,4,36,-24,2,Brodmann area 11,Rectal Gyrus,Frontal Lobe,10,Brodmann area 47,Orbital Gyrus,Frontal Lobe,12,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +11,38,-27,11,36,-24,2,Brodmann area 11,Rectal Gyrus,Frontal Lobe,4,Brodmann area 47,Orbital Gyrus,Frontal Lobe,11,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +-10,45,-27,-10,42,-25,1,Brodmann area 11,Rectal Gyrus,Frontal Lobe,10,Brodmann area 47,Orbital Gyrus,Frontal Lobe,17,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +-3,45,-27,-3,42,-25,2,Brodmann area 11,Rectal Gyrus,Frontal Lobe,14,Brodmann area 47,Orbital Gyrus,Frontal Lobe,17,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe +4,45,-27,4,42,-25,3,Brodmann area 11,Rectal Gyrus,Frontal Lobe,13,Brodmann area 47,Orbital Gyrus,Frontal Lobe,17,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe +11,45,-27,11,42,-25,1,Brodmann area 11,Rectal Gyrus,Frontal Lobe,10,Brodmann area 47,Orbital Gyrus,Frontal Lobe,17,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +-10,52,-27,-10,49,-25,2,Brodmann area 11,Orbital Gyrus,Frontal Lobe,17,Brodmann area 47,Orbital Gyrus,Frontal Lobe,18,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe +-3,52,-27,-3,49,-25,2,Brodmann area 11,Rectal Gyrus,Frontal Lobe,17,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,20,Brodmann area 47,Orbital Gyrus,Frontal Lobe +4,52,-27,4,49,-25,2,Brodmann area 11,Rectal Gyrus,Frontal Lobe,17,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,19,Brodmann area 47,Orbital Gyrus,Frontal Lobe +11,52,-27,11,49,-25,2,Brodmann area 11,Orbital Gyrus,Frontal Lobe,17,Brodmann area 47,Orbital Gyrus,Frontal Lobe,18,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe +-52,-60,-20,-51,-59,-14,2,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,8,Brodmann area 19,Fusiform Gyrus,Temporal Lobe +-45,-60,-20,-45,-59,-14,2,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,8,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,9,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-38,-60,-20,-38,-59,-14,2,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,8,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,15,Brodmann area 18,Lingual Gyrus,Occipital Lobe +39,-60,-20,39,-59,-14,2,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,8,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,14,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +46,-60,-20,46,-59,-14,2,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,8,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,8,Brodmann area 19,Fusiform Gyrus,Occipital Lobe +53,-60,-20,52,-59,-14,3,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,8,Brodmann area 19,Fusiform Gyrus,Temporal Lobe +-59,-53,-20,-58,-52,-14,3,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-52,-53,-20,-51,-52,-14,2,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +-45,-53,-20,-45,-52,-14,3,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,8,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,13,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +-38,-53,-20,-38,-52,-14,2,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,13,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,14,Brodmann area 19,Fusiform Gyrus,Occipital Lobe +-31,-53,-20,-31,-52,-14,6,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,9,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,12,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +32,-53,-20,32,-52,-14,5,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,10,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,12,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +39,-53,-20,39,-52,-14,2,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,13,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,14,Brodmann area 19,Fusiform Gyrus,Occipital Lobe +46,-53,-20,46,-52,-14,2,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,7,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,12,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +53,-53,-20,52,-52,-14,2,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +60,-53,-20,59,-52,-14,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,11,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-59,-46,-20,-58,-45,-15,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,9,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-52,-46,-20,-51,-45,-15,2,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,8,Brodmann area 36,Fusiform Gyrus,Temporal Lobe +-45,-46,-20,-45,-45,-15,2,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,8,Brodmann area 36,Fusiform Gyrus,Temporal Lobe,9,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-38,-46,-20,-38,-45,-15,2,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,6,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,10,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +-31,-46,-20,-31,-45,-15,3,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,9,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +32,-46,-20,32,-45,-15,3,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,10,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +39,-46,-20,39,-45,-15,2,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,7,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,11,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +46,-46,-20,46,-45,-15,2,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,7,Brodmann area 36,Fusiform Gyrus,Temporal Lobe,8,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +53,-46,-20,52,-45,-15,2,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,8,Brodmann area 36,Fusiform Gyrus,Temporal Lobe +60,-46,-20,59,-45,-15,4,Brodmann area 20,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,9,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-66,-39,-20,-65,-39,-15,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-59,-39,-20,-58,-39,-15,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,5,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,7,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-52,-39,-20,-51,-39,-15,1,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 20,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 36,Fusiform Gyrus,Temporal Lobe +-45,-39,-20,-45,-39,-15,2,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 36,Fusiform Gyrus,Temporal Lobe +-38,-39,-20,-38,-39,-15,1,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +-31,-39,-20,-31,-39,-15,2,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,4,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,6,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +-24,-39,-20,-24,-39,-15,5,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +25,-39,-20,25,-39,-15,4,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +32,-39,-20,32,-39,-15,1,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,6,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +39,-39,-20,39,-39,-15,2,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,4,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +46,-39,-20,46,-39,-15,2,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,5,Brodmann area 36,Fusiform Gyrus,Temporal Lobe,6,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +53,-39,-20,52,-39,-15,1,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,3,Brodmann area 20,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 36,Fusiform Gyrus,Temporal Lobe +60,-39,-20,59,-39,-15,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +-66,-32,-20,-65,-32,-15,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,15,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +-59,-32,-20,-58,-32,-15,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +-52,-32,-20,-51,-32,-15,6,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,7,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,9,Brodmann area 36,Fusiform Gyrus,Temporal Lobe +-45,-32,-20,-45,-32,-15,4,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,6,Brodmann area 36,Fusiform Gyrus,Temporal Lobe,7,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +-38,-32,-20,-38,-32,-15,2,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,3,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +-31,-32,-20,-31,-32,-15,3,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,4,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +-24,-32,-20,-24,-32,-15,3,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +25,-32,-20,25,-32,-15,3,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +32,-32,-20,32,-32,-15,3,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,3,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +39,-32,-20,39,-32,-15,1,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,3,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +46,-32,-20,46,-32,-15,5,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,7,Brodmann area 36,Fusiform Gyrus,Temporal Lobe,8,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +53,-32,-20,52,-32,-15,6,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,7,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,9,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +60,-32,-20,59,-32,-15,2,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,11,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +67,-32,-20,66,-32,-15,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,16,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +-66,-25,-20,-65,-25,-16,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,17,Brodmann area 22,Superior Temporal Gyrus,* +-59,-25,-20,-58,-25,-16,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,16,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +-38,-25,-20,-38,-25,-16,1,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,3,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,6,Hippocampus,Parahippocampal Gyrus,Limbic Lobe +-31,-25,-20,-31,-25,-16,4,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,5,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe +25,-25,-20,25,-25,-16,2,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,4,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,8,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe +32,-25,-20,32,-25,-16,4,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,5,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe +39,-25,-20,39,-25,-16,2,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,2,Brodmann area 20,Fusiform Gyrus,Temporal Lobe,6,Hippocampus,Parahippocampal Gyrus,Limbic Lobe +60,-25,-20,59,-25,-16,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,16,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +67,-25,-20,66,-25,-16,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,17,Brodmann area 22,Superior Temporal Gyrus,* +-66,-18,-20,-65,-18,-16,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,17,Brodmann area 22,Superior Temporal Gyrus,* +-59,-18,-20,-58,-18,-16,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,17,Brodmann area 22,Superior Temporal Gyrus,* +-38,-18,-20,-38,-18,-16,4,Brodmann area 20,Sub-Gyral,Temporal Lobe,4,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,8,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +-31,-18,-20,-31,-18,-16,2,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,9,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,9,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe +-24,-18,-20,-24,-18,-16,4,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe,4,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,6,Hippocampus,Parahippocampal Gyrus,Limbic Lobe +-17,-18,-20,-17,-18,-16,2,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +18,-18,-20,18,-18,-16,1,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +25,-18,-20,25,-18,-16,5,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,5,Hippocampus,Parahippocampal Gyrus,Limbic Lobe +32,-18,-20,32,-18,-16,2,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,8,Brodmann area 20,Sub-Gyral,Temporal Lobe,9,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +60,-18,-20,59,-18,-16,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,17,Brodmann area 22,Superior Temporal Gyrus,* +67,-18,-20,66,-18,-16,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,17,Brodmann area 22,Superior Temporal Gyrus,* +-66,-11,-20,-65,-11,-16,4,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,17,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-59,-11,-20,-58,-11,-16,3,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,5,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,14,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-31,-11,-20,-31,-11,-16,1,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,6,Amygdala,Parahippocampal Gyrus,Limbic Lobe,9,Brodmann area 20,Sub-Gyral,Temporal Lobe +-24,-11,-20,-24,-11,-16,4,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,4,Amygdala,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe +-17,-11,-20,-17,-11,-16,2,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe,4,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe,4,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +18,-11,-20,18,-11,-16,1,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe,4,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +25,-11,-20,25,-11,-16,3,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,4,Amygdala,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe +32,-11,-20,32,-11,-16,1,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,6,Amygdala,Parahippocampal Gyrus,Limbic Lobe,8,Brodmann area 20,Sub-Gyral,Temporal Lobe +60,-11,-20,59,-11,-16,3,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,14,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +67,-11,-20,66,-11,-16,4,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,18,Brodmann area 22,Superior Temporal Gyrus,* +-59,-4,-20,-58,-5,-17,3,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,5,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,13,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-52,-4,-20,-51,-5,-17,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-31,-4,-20,-31,-5,-17,4,Amygdala,Parahippocampal Gyrus,Limbic Lobe,4,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,9,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe +-24,-4,-20,-24,-5,-17,2,Amygdala,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe,7,Hippocampus,Parahippocampal Gyrus,Limbic Lobe +-17,-4,-20,-17,-5,-17,3,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe,3,Amygdala,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +18,-4,-20,18,-5,-17,2,Amygdala,Parahippocampal Gyrus,Limbic Lobe,3,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe +25,-4,-20,25,-5,-17,2,Amygdala,Parahippocampal Gyrus,Limbic Lobe,6,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,8,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe +32,-4,-20,32,-5,-17,5,Amygdala,Parahippocampal Gyrus,Limbic Lobe,5,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,10,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe +53,-4,-20,52,-5,-17,1,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +60,-4,-20,59,-5,-17,2,Brodmann area 21,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,13,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-59,3,-20,-58,2,-17,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,11,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +-52,3,-20,-51,2,-17,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +-45,3,-20,-45,2,-17,7,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +-38,3,-20,-38,2,-17,5,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 13,Inferior Frontal Gyrus,Temporal Lobe,9,Brodmann area 28,Uncus,Limbic Lobe +-31,3,-20,-31,2,-17,3,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 28,Uncus,Limbic Lobe +25,3,-20,25,2,-17,2,Amygdala,Parahippocampal Gyrus,Limbic Lobe,3,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe,4,Brodmann area 28,Uncus,Limbic Lobe +32,3,-20,32,2,-17,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 28,Uncus,Limbic Lobe +39,3,-20,39,2,-17,5,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 13,Inferior Frontal Gyrus,Temporal Lobe,9,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +46,3,-20,46,2,-17,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +53,3,-20,52,2,-17,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +60,3,-20,59,2,-17,1,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,11,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +-52,10,-20,-51,9,-17,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,2,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,13,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +-45,10,-20,-45,9,-17,2,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,11,Brodmann area 13,Extra-Nuclear,Sub-lobar +-24,10,-20,-24,9,-17,1,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 28,Uncus,Limbic Lobe,5,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe +-17,10,-20,-17,9,-17,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 34,Uncus,Limbic Lobe +-10,10,-20,-10,9,-17,1,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 11,Rectal Gyrus,Frontal Lobe,7,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe +4,10,-20,4,9,-17,2,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 11,Rectal Gyrus,Frontal Lobe,9,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe +11,10,-20,11,9,-17,2,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 11,Rectal Gyrus,Frontal Lobe,7,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +18,10,-20,18,9,-17,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 34,Uncus,Limbic Lobe,6,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +25,10,-20,25,9,-17,1,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 28,Uncus,Limbic Lobe,5,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe +46,10,-20,46,9,-17,1,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,11,Brodmann area 13,Extra-Nuclear,Sub-lobar +53,10,-20,52,9,-17,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,13,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +-52,17,-20,-51,16,-18,2,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +-45,17,-20,-45,16,-18,2,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,11,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-38,17,-20,-38,16,-18,3,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe +-31,17,-20,-31,16,-18,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe +-24,17,-20,-24,16,-18,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe +-17,17,-20,-17,16,-18,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 13,Subcallosal Gyrus,Frontal Lobe +-10,17,-20,-10,16,-18,2,Brodmann area 11,Rectal Gyrus,Frontal Lobe,3,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +-3,17,-20,-3,16,-18,2,Brodmann area 11,Rectal Gyrus,Frontal Lobe,3,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,11,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,17,-20,4,16,-18,2,Brodmann area 11,Rectal Gyrus,Frontal Lobe,3,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +11,17,-20,11,16,-18,2,Brodmann area 11,Rectal Gyrus,Frontal Lobe,2,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +18,17,-20,18,16,-18,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 13,Subcallosal Gyrus,Frontal Lobe +25,17,-20,25,16,-18,3,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe +32,17,-20,32,16,-18,3,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe +46,17,-20,46,16,-18,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,11,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +53,17,-20,52,16,-18,2,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,11,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +-38,24,-20,-38,22,-18,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,12,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe +-31,24,-20,-31,22,-18,3,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-24,24,-20,-24,22,-18,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 13,Extra-Nuclear,Sub-lobar +-17,24,-20,-17,22,-18,3,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 11,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +-10,24,-20,-10,22,-18,2,Brodmann area 11,Rectal Gyrus,Frontal Lobe,2,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +-3,24,-20,-3,22,-18,3,Brodmann area 11,Rectal Gyrus,Frontal Lobe,3,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +4,24,-20,4,22,-18,3,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,3,Brodmann area 11,Rectal Gyrus,Frontal Lobe,9,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +11,24,-20,11,22,-18,2,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,2,Brodmann area 11,Rectal Gyrus,Frontal Lobe,3,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +18,24,-20,18,22,-18,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,3,Brodmann area 11,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +25,24,-20,25,22,-18,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 11,Inferior Frontal Gyrus,Frontal Lobe,12,Brodmann area 13,Extra-Nuclear,Sub-lobar +32,24,-20,32,22,-18,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe +39,24,-20,39,22,-18,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,13,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe +-38,31,-20,-38,29,-18,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-31,31,-20,-31,29,-18,3,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-24,31,-20,-24,29,-18,3,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,13,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +-10,31,-20,-10,29,-18,2,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,3,Brodmann area 11,Rectal Gyrus,Frontal Lobe,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +-3,31,-20,-3,29,-18,3,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 11,Rectal Gyrus,Frontal Lobe,10,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,31,-20,4,29,-18,3,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +11,31,-20,11,29,-18,2,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,3,Brodmann area 11,Rectal Gyrus,Frontal Lobe,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +18,31,-20,18,29,-18,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 11,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +25,31,-20,25,29,-18,3,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,14,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +32,31,-20,32,29,-18,3,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +39,31,-20,39,29,-18,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-24,38,-20,-24,36,-19,2,Brodmann area 11,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 47,Orbital Gyrus,Frontal Lobe,16,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +-10,38,-20,-10,36,-19,2,Brodmann area 11,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 47,Orbital Gyrus,Frontal Lobe,9,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +-3,38,-20,-3,36,-19,4,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,11,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,38,-20,4,36,-19,4,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,11,Brodmann area 47,Orbital Gyrus,Frontal Lobe +11,38,-20,11,36,-19,1,Brodmann area 11,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 47,Orbital Gyrus,Frontal Lobe,9,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +18,38,-20,18,36,-19,2,Brodmann area 11,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 47,Orbital Gyrus,Frontal Lobe,11,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +25,38,-20,25,36,-19,2,Brodmann area 11,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,16,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe +-17,45,-20,-17,43,-19,3,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 47,Orbital Gyrus,Frontal Lobe,14,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe +-10,45,-20,-10,43,-19,5,Brodmann area 11,Rectal Gyrus,Frontal Lobe,12,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,12,Brodmann area 47,Orbital Gyrus,Frontal Lobe +-3,45,-20,-3,43,-19,3,Brodmann area 11,Orbital Gyrus,Frontal Lobe,11,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,12,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,45,-20,4,43,-19,3,Brodmann area 11,Orbital Gyrus,Frontal Lobe,11,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,12,Brodmann area 32,Anterior Cingulate,Limbic Lobe +11,45,-20,11,43,-19,5,Brodmann area 11,Rectal Gyrus,Frontal Lobe,12,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,12,Brodmann area 47,Orbital Gyrus,Frontal Lobe +18,45,-20,18,43,-19,2,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 47,Orbital Gyrus,Frontal Lobe,15,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe +25,45,-20,25,43,-19,3,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe,16,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +-17,52,-20,-17,50,-19,3,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-3,52,-20,-3,50,-19,2,Brodmann area 11,Orbital Gyrus,Frontal Lobe,11,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,52,-20,4,50,-19,1,Brodmann area 11,Orbital Gyrus,Frontal Lobe,11,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Anterior Cingulate,Limbic Lobe +18,52,-20,18,50,-19,2,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-10,59,-20,-10,56,-20,4,Brodmann area 11,Orbital Gyrus,Frontal Lobe,12,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,19,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-3,59,-20,-3,56,-20,2,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,12,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,20,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,59,-20,4,56,-20,1,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,12,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,20,Brodmann area 32,Anterior Cingulate,Limbic Lobe +11,59,-20,11,56,-20,4,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,12,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 32,Anterior Cingulate,Limbic Lobe +18,59,-20,18,56,-20,3,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,19,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-17,-102,-13,-17,-99,-6,2,Brodmann area 17,Lingual Gyrus,Occipital Lobe,4,Brodmann area 18,Lingual Gyrus,Occipital Lobe,18,Brodmann area 19,Fusiform Gyrus,Occipital Lobe +-10,-102,-13,-10,-99,-6,2,Brodmann area 18,Lingual Gyrus,Occipital Lobe,5,Brodmann area 17,Lingual Gyrus,Occipital Lobe,21,Brodmann area 19,Fusiform Gyrus,Occipital Lobe +-17,-95,-13,-17,-93,-6,2,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe,6,Brodmann area 18,Lingual Gyrus,Occipital Lobe,13,Brodmann area 19,Fusiform Gyrus,Occipital Lobe +-10,-95,-13,-10,-93,-6,3,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe,6,Brodmann area 18,Lingual Gyrus,Occipital Lobe,17,Brodmann area 19,Fusiform Gyrus,Occipital Lobe +-3,-95,-13,-3,-93,-6,2,Brodmann area 18,Lingual Gyrus,Occipital Lobe,4,Brodmann area 17,Lingual Gyrus,Occipital Lobe,23,Brodmann area 19,Fusiform Gyrus,Occipital Lobe +32,-95,-13,32,-93,-6,2,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe,6,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe,13,Brodmann area 19,Middle Occipital Gyrus,* +-38,-88,-13,-38,-86,-7,3,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe,8,Brodmann area 19,Inferior Occipital Gyrus,Occipital Lobe,14,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe +-17,-88,-13,-17,-86,-7,5,Brodmann area 18,Fusiform Gyrus,Occipital Lobe,6,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe,8,Brodmann area 19,Fusiform Gyrus,Occipital Lobe +-10,-88,-13,-10,-86,-7,5,Brodmann area 18,Lingual Gyrus,Occipital Lobe,5,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe,14,Brodmann area 19,Fusiform Gyrus,Occipital Lobe +-3,-88,-13,-3,-86,-7,2,Brodmann area 18,Lingual Gyrus,Occipital Lobe,5,Brodmann area 17,Lingual Gyrus,Occipital Lobe,20,Brodmann area 19,Fusiform Gyrus,Occipital Lobe +4,-88,-13,4,-86,-7,2,Brodmann area 18,Lingual Gyrus,Occipital Lobe,5,Brodmann area 17,Lingual Gyrus,Occipital Lobe,19,Brodmann area 19,Fusiform Gyrus,Occipital Lobe +11,-88,-13,11,-86,-7,5,Brodmann area 18,Lingual Gyrus,Occipital Lobe,5,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe,13,Brodmann area 19,Fusiform Gyrus,Occipital Lobe +18,-88,-13,18,-86,-7,5,Brodmann area 18,Fusiform Gyrus,Occipital Lobe,6,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe,8,Brodmann area 19,Fusiform Gyrus,Occipital Lobe +25,-88,-13,25,-86,-7,2,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe,6,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,9,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe +32,-88,-13,32,-86,-7,2,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe,7,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,10,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe +39,-88,-13,39,-86,-7,3,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe,8,Brodmann area 19,Inferior Occipital Gyrus,Occipital Lobe,15,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe +-45,-81,-13,-45,-79,-7,1,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe,4,Brodmann area 19,Inferior Occipital Gyrus,Occipital Lobe,14,Brodmann area 37,Inferior Temporal Gyrus,* +-38,-81,-13,-38,-79,-7,3,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,3,Brodmann area 19,Inferior Occipital Gyrus,Occipital Lobe,16,Brodmann area 37,Inferior Temporal Gyrus,* +-31,-81,-13,-31,-79,-7,2,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,5,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,17,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe +-24,-81,-13,-24,-79,-7,3,Brodmann area 18,Lingual Gyrus,Occipital Lobe,6,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,14,Brodmann area 17,Lingual Gyrus,* +-17,-81,-13,-17,-79,-7,2,Brodmann area 18,Lingual Gyrus,Occipital Lobe,6,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,12,Brodmann area 17,Lingual Gyrus,* +-10,-81,-13,-10,-79,-7,2,Brodmann area 18,Lingual Gyrus,Occipital Lobe,12,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,12,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe +-3,-81,-13,-3,-79,-7,4,Brodmann area 18,Lingual Gyrus,Occipital Lobe,11,Brodmann area 17,Lingual Gyrus,Occipital Lobe,17,Brodmann area 30,Cuneus,Occipital Lobe +4,-81,-13,4,-79,-7,3,Brodmann area 18,Lingual Gyrus,Occipital Lobe,11,Brodmann area 17,Lingual Gyrus,Occipital Lobe,17,Brodmann area 30,Cuneus,Occipital Lobe +11,-81,-13,11,-79,-7,2,Brodmann area 18,Lingual Gyrus,Occipital Lobe,11,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,12,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe +18,-81,-13,18,-79,-7,3,Brodmann area 18,Lingual Gyrus,Occipital Lobe,6,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,12,Brodmann area 17,Lingual Gyrus,* +39,-81,-13,39,-79,-7,3,Brodmann area 19,Inferior Occipital Gyrus,Occipital Lobe,4,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,16,Brodmann area 37,Inferior Temporal Gyrus,* +46,-81,-13,46,-79,-7,2,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe,4,Brodmann area 19,Inferior Occipital Gyrus,Occipital Lobe,14,Brodmann area 37,Inferior Temporal Gyrus,* +-45,-74,-13,-45,-72,-7,4,Brodmann area 19,Inferior Occipital Gyrus,Occipital Lobe,5,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,9,Brodmann area 37,Inferior Temporal Gyrus,* +-38,-74,-13,-38,-72,-7,5,Brodmann area 19,Inferior Occipital Gyrus,Occipital Lobe,6,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,12,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +32,-74,-13,32,-72,-7,3,Brodmann area 18,Lingual Gyrus,Occipital Lobe,5,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,15,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +39,-74,-13,39,-72,-7,4,Brodmann area 19,Inferior Occipital Gyrus,Occipital Lobe,6,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,12,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +46,-74,-13,46,-72,-7,4,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,5,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,9,Brodmann area 37,Inferior Temporal Gyrus,* +-52,-67,-13,-51,-65,-8,3,Brodmann area 37,Middle Occipital Gyrus,Occipital Lobe,3,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,10,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-45,-67,-13,-45,-65,-8,4,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,11,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +-38,-67,-13,-38,-65,-8,5,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,6,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,9,Brodmann area 18,Lingual Gyrus,Occipital Lobe +39,-67,-13,39,-65,-8,5,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,6,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,10,Brodmann area 18,Lingual Gyrus,Occipital Lobe +46,-67,-13,46,-65,-8,5,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,11,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +53,-67,-13,52,-65,-8,3,Brodmann area 37,Middle Occipital Gyrus,Occipital Lobe,3,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,10,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-59,-60,-13,-58,-59,-8,3,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +-52,-60,-13,-51,-59,-8,2,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,5,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-45,-60,-13,-45,-59,-8,6,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,7,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,9,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-38,-60,-13,-38,-59,-8,4,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,9,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,14,Brodmann area 18,Lingual Gyrus,Occipital Lobe +-31,-60,-13,-31,-59,-8,8,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,8,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,11,Brodmann area 18,Lingual Gyrus,Occipital Lobe +39,-60,-13,39,-59,-8,4,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,8,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,14,Brodmann area 18,Lingual Gyrus,Occipital Lobe +46,-60,-13,46,-59,-8,6,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,7,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,9,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +53,-60,-13,52,-59,-8,2,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,5,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +60,-60,-13,59,-59,-8,4,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,7,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +-59,-53,-13,-58,-52,-8,1,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,5,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,7,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-52,-53,-13,-51,-52,-8,4,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +-45,-53,-13,-45,-52,-8,5,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,8,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,9,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +-38,-53,-13,-38,-52,-8,4,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,14,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,15,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +46,-53,-13,46,-52,-8,4,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,7,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,8,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +53,-53,-13,52,-52,-8,3,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +60,-53,-13,59,-52,-8,0,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-66,-46,-13,-65,-45,-9,4,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-59,-46,-13,-58,-45,-9,2,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,3,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-52,-46,-13,-51,-45,-9,4,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,5,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,12,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-45,-46,-13,-45,-45,-9,2,Brodmann area 37,Sub-Gyral,Temporal Lobe,9,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,12,Brodmann area 36,Fusiform Gyrus,Temporal Lobe +-31,-46,-13,-31,-45,-9,1,Brodmann area 37,Fusiform Gyrus,Occipital Lobe,6,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,9,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +-24,-46,-13,-24,-45,-9,2,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe,4,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,8,Brodmann area 19,Fusiform Gyrus,Occipital Lobe +46,-46,-13,46,-45,-9,2,Brodmann area 37,Sub-Gyral,Temporal Lobe,8,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,12,Brodmann area 36,Fusiform Gyrus,Temporal Lobe +53,-46,-13,52,-45,-9,4,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,4,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +60,-46,-13,59,-45,-9,2,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 20,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +67,-46,-13,66,-45,-9,4,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-66,-39,-13,-65,-38,-9,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 20,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-59,-39,-13,-58,-38,-9,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 20,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-31,-39,-13,-31,-38,-9,2,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe,3,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,6,Hippocampus,Sub-Gyral,Limbic Lobe +-24,-39,-13,-24,-38,-9,3,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,6,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe +-17,-39,-13,-17,-38,-9,3,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 30,Parahippocampal Gyrus,Limbic Lobe +25,-39,-13,25,-38,-9,3,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,4,Brodmann area 37,Fusiform Gyrus,Temporal Lobe,7,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe +32,-39,-13,32,-38,-9,2,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe,4,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,7,Hippocampus,Sub-Gyral,Limbic Lobe +60,-39,-13,59,-38,-9,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 20,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +67,-39,-13,66,-38,-9,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 20,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-66,-32,-13,-65,-32,-9,1,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,13,Brodmann area 22,Superior Temporal Gyrus,* +-59,-32,-13,-58,-32,-9,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,12,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe +-31,-32,-13,-31,-32,-9,4,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,4,Hippocampus,Sub-Gyral,Temporal Lobe,5,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +-24,-32,-13,-24,-32,-9,3,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 27,Parahippocampal Gyrus,Limbic Lobe +-17,-32,-13,-17,-32,-9,1,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 30,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe +18,-32,-13,18,-32,-9,2,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 30,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe +32,-32,-13,32,-32,-9,4,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,5,Hippocampus,Sub-Gyral,Temporal Lobe,5,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +60,-32,-13,59,-32,-9,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,12,Brodmann area 22,Superior Temporal Gyrus,* +67,-32,-13,66,-32,-9,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,13,Brodmann area 22,Superior Temporal Gyrus,* +-66,-25,-13,-65,-25,-10,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 22,Superior Temporal Gyrus,* +-59,-25,-13,-58,-25,-10,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 22,Superior Temporal Gyrus,* +-38,-25,-13,-38,-25,-10,5,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +-31,-25,-13,-31,-25,-10,2,Hippocampus,Sub-Gyral,Temporal Lobe,7,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,9,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe +-24,-25,-13,-24,-25,-10,4,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,4,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe,5,Hippocampus,Sub-Gyral,Temporal Lobe +25,-25,-13,25,-25,-10,4,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,4,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe,4,Hippocampus,Sub-Gyral,Temporal Lobe +32,-25,-13,32,-25,-10,2,Hippocampus,Sub-Gyral,Temporal Lobe,7,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,10,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe +39,-25,-13,39,-25,-10,5,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 20,Fusiform Gyrus,Temporal Lobe +60,-25,-13,59,-25,-10,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 22,Superior Temporal Gyrus,* +67,-25,-13,66,-25,-10,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 22,Superior Temporal Gyrus,* +-66,-18,-13,-65,-18,-10,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,12,Brodmann area 22,Superior Temporal Gyrus,* +-59,-18,-13,-58,-18,-10,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 22,Superior Temporal Gyrus,* +-52,-18,-13,-51,-18,-10,7,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,12,Brodmann area 13,Insula,Sub-lobar +-31,-18,-13,-31,-18,-10,3,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,9,Amygdala,Parahippocampal Gyrus,Limbic Lobe,9,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe +-24,-18,-13,-24,-18,-10,5,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe,5,Hippocampus,Parahippocampal Gyrus,Limbic Lobe +32,-18,-13,32,-18,-10,2,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,10,Amygdala,Parahippocampal Gyrus,Limbic Lobe,10,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe +53,-18,-13,52,-18,-10,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,12,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +67,-18,-13,66,-18,-10,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,11,Brodmann area 22,Superior Temporal Gyrus,* +-66,-11,-13,-65,-11,-10,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,12,Brodmann area 22,Superior Temporal Gyrus,* +-59,-11,-13,-58,-11,-10,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-52,-11,-13,-51,-11,-10,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 13,Insula,Sub-lobar +-24,-11,-13,-24,-11,-10,4,Amygdala,Parahippocampal Gyrus,Limbic Lobe,7,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,8,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe +-17,-11,-13,-17,-11,-10,2,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe,5,Amygdala,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe +18,-11,-13,18,-11,-10,3,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe,4,Amygdala,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe +25,-11,-13,25,-11,-10,3,Amygdala,Parahippocampal Gyrus,Limbic Lobe,7,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,8,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe +53,-11,-13,52,-11,-10,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +60,-11,-13,59,-11,-10,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,10,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +67,-11,-13,66,-11,-10,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe,12,Brodmann area 22,Superior Temporal Gyrus,* +-59,-4,-13,-58,-4,-11,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-52,-4,-13,-51,-4,-11,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-45,-4,-13,-45,-4,-11,4,Brodmann area 21,Sub-Gyral,Temporal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 13,Insula,Sub-lobar +-38,-4,-13,-38,-4,-11,5,Brodmann area 21,Sub-Gyral,Temporal Lobe,7,Brodmann area 13,Sub-Gyral,Temporal Lobe,8,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-31,-4,-13,-31,-4,-11,5,Amygdala,Parahippocampal Gyrus,Limbic Lobe,7,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,9,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-24,-4,-13,-24,-4,-11,1,Amygdala,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +-17,-4,-13,-17,-4,-11,2,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe,3,Amygdala,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe +-10,-4,-13,-10,-4,-11,6,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe,7,Amygdala,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +18,-4,-13,18,-4,-11,2,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe,3,Amygdala,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe +25,-4,-13,25,-4,-11,2,Amygdala,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe,8,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +39,-4,-13,39,-4,-11,4,Brodmann area 21,Sub-Gyral,Temporal Lobe,7,Brodmann area 13,Sub-Gyral,Temporal Lobe,9,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +46,-4,-13,46,-4,-11,5,Brodmann area 21,Sub-Gyral,Temporal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +53,-4,-13,52,-4,-11,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +60,-4,-13,59,-4,-11,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-59,3,-13,-58,2,-11,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-52,3,-13,-51,2,-11,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-45,3,-13,-45,2,-11,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 13,Sub-Gyral,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-38,3,-13,-38,2,-11,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 13,Sub-Gyral,Temporal Lobe,7,Brodmann area 21,Sub-Gyral,Temporal Lobe +-31,3,-13,-31,2,-11,5,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 13,Inferior Frontal Gyrus,Temporal Lobe +-24,3,-13,-24,2,-11,2,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,5,Amygdala,Parahippocampal Gyrus,Limbic Lobe,8,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +-17,3,-13,-17,2,-11,3,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,4,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe,8,Amygdala,Parahippocampal Gyrus,Limbic Lobe +-10,3,-13,-10,2,-11,2,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,6,Brodmann area 25,Subcallosal Gyrus,Frontal Lobe,8,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +-3,3,-13,-3,2,-11,4,Brodmann area 25,Subcallosal Gyrus,Frontal Lobe,6,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,15,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +4,3,-13,4,2,-11,3,Brodmann area 25,Subcallosal Gyrus,Frontal Lobe,5,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,14,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +11,3,-13,11,2,-11,3,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,7,Brodmann area 25,Subcallosal Gyrus,Frontal Lobe,7,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +18,3,-13,18,2,-11,4,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,4,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe,8,Amygdala,Parahippocampal Gyrus,Limbic Lobe +25,3,-13,25,2,-11,2,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,5,Amygdala,Parahippocampal Gyrus,Limbic Lobe,9,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +32,3,-13,32,2,-11,5,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 34,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 13,Inferior Frontal Gyrus,Temporal Lobe +39,3,-13,39,2,-11,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 13,Sub-Gyral,Temporal Lobe,7,Brodmann area 21,Sub-Gyral,Temporal Lobe +46,3,-13,46,2,-11,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 13,Sub-Gyral,Temporal Lobe +53,3,-13,52,2,-11,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +60,3,-13,59,2,-11,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-52,10,-13,-51,9,-11,1,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-38,10,-13,-38,9,-11,3,Brodmann area 13,Extra-Nuclear,Sub-lobar,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +-31,10,-13,-31,9,-11,4,Brodmann area 13,Inferior Frontal Gyrus,Temporal Lobe,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-24,10,-13,-24,9,-11,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,7,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe +-17,10,-13,-17,9,-11,4,Brodmann area 13,Subcallosal Gyrus,Frontal Lobe,4,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +-10,10,-13,-10,9,-11,5,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,8,Brodmann area 13,Subcallosal Gyrus,Frontal Lobe +-3,10,-13,-3,9,-11,2,Brodmann area 25,Subcallosal Gyrus,Frontal Lobe,8,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,11,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,10,-13,4,9,-11,2,Brodmann area 25,Subcallosal Gyrus,Frontal Lobe,7,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,10,Brodmann area 32,Anterior Cingulate,Limbic Lobe +11,10,-13,11,9,-11,5,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,7,Brodmann area 13,Subcallosal Gyrus,Frontal Lobe +18,10,-13,18,9,-11,4,Brodmann area 13,Subcallosal Gyrus,Frontal Lobe,5,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +25,10,-13,25,9,-11,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,6,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe +32,10,-13,32,9,-11,3,Brodmann area 13,Inferior Frontal Gyrus,Temporal Lobe,6,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +39,10,-13,39,9,-11,3,Brodmann area 13,Extra-Nuclear,Sub-lobar,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +46,10,-13,46,9,-11,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +53,10,-13,52,9,-11,1,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-52,17,-13,-51,16,-12,1,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-45,17,-13,-45,16,-12,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,10,Brodmann area 13,Extra-Nuclear,Sub-lobar +-38,17,-13,-38,16,-12,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-31,17,-13,-31,16,-12,1,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,3,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe,10,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-3,17,-13,-3,16,-12,3,Brodmann area 25,Subcallosal Gyrus,Frontal Lobe,5,Brodmann area 32,Anterior Cingulate,Limbic Lobe,8,Brodmann area 11,Rectal Gyrus,Frontal Lobe +4,17,-13,4,16,-12,3,Brodmann area 25,Subcallosal Gyrus,Frontal Lobe,5,Brodmann area 32,Anterior Cingulate,Limbic Lobe,8,Brodmann area 11,Rectal Gyrus,Frontal Lobe +11,17,-13,11,16,-12,4,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 47,Subcallosal Gyrus,Frontal Lobe,7,Brodmann area 13,Subcallosal Gyrus,Frontal Lobe +32,17,-13,32,16,-12,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +39,17,-13,39,16,-12,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +46,17,-13,46,16,-12,2,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,10,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +53,17,-13,52,16,-12,1,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-45,24,-13,-45,23,-12,1,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe +-3,24,-13,-3,23,-12,3,Brodmann area 25,Subcallosal Gyrus,Frontal Lobe,4,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,24,-13,4,23,-12,2,Brodmann area 25,Subcallosal Gyrus,Frontal Lobe,4,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 32,Anterior Cingulate,Limbic Lobe +32,24,-13,32,23,-12,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 13,Extra-Nuclear,Sub-lobar,9,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe +39,24,-13,39,23,-12,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,10,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe +46,24,-13,46,23,-12,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,11,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe +-45,31,-13,-45,29,-12,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-38,31,-13,-38,29,-12,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,14,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-31,31,-13,-31,29,-12,1,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 13,Extra-Nuclear,Sub-lobar +-24,31,-13,-24,29,-12,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 13,Extra-Nuclear,Sub-lobar +-3,31,-13,-3,29,-12,2,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,31,-13,4,29,-12,2,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 25,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 32,Anterior Cingulate,Limbic Lobe +25,31,-13,25,29,-12,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 13,Extra-Nuclear,Sub-lobar +46,31,-13,46,29,-12,3,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-52,38,-13,-51,36,-13,3,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 10,Inferior Frontal Gyrus,Frontal Lobe +-38,38,-13,-38,36,-13,3,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,16,Brodmann area 10,Inferior Frontal Gyrus,Frontal Lobe +-31,38,-13,-31,36,-13,2,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe,16,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +-24,38,-13,-24,36,-13,3,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,14,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe +-10,38,-13,-10,36,-13,5,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 32,Anterior Cingulate,Limbic Lobe,7,Brodmann area 11,Inferior Frontal Gyrus,Frontal Lobe +-3,38,-13,-3,36,-13,3,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 32,Anterior Cingulate,Limbic Lobe,8,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe +4,38,-13,4,36,-13,3,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 32,Anterior Cingulate,Limbic Lobe,7,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe +25,38,-13,25,36,-13,3,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe +32,38,-13,32,36,-13,2,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,17,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +39,38,-13,39,36,-13,3,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe,16,Brodmann area 10,Inferior Frontal Gyrus,Frontal Lobe +-45,45,-13,-45,43,-13,3,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,3,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +-38,45,-13,-38,43,-13,7,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +-31,45,-13,-31,43,-13,1,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +-24,45,-13,-24,43,-13,3,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +-10,45,-13,-10,43,-13,7,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-3,45,-13,-3,43,-13,1,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,45,-13,4,43,-13,1,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 32,Anterior Cingulate,Limbic Lobe +25,45,-13,25,43,-13,2,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +32,45,-13,32,43,-13,2,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +39,45,-13,39,43,-13,6,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +46,45,-13,46,43,-13,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +-38,52,-13,-38,50,-13,5,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +-31,52,-13,-31,50,-13,4,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,8,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,14,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +-24,52,-13,-24,50,-13,1,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-3,52,-13,-3,50,-13,1,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,11,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,52,-13,4,50,-13,1,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,11,Brodmann area 32,Anterior Cingulate,Limbic Lobe +25,52,-13,25,50,-13,1,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,14,Brodmann area 32,Anterior Cingulate,Limbic Lobe +32,52,-13,32,50,-13,4,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,8,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,14,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +39,52,-13,39,50,-13,4,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +-38,59,-13,-38,57,-14,3,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,14,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +-31,59,-13,-31,57,-14,2,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,20,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +-24,59,-13,-24,57,-14,2,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-3,59,-13,-3,57,-14,3,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,59,-13,4,57,-14,2,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Anterior Cingulate,Limbic Lobe +18,59,-13,18,57,-14,3,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,15,Brodmann area 32,Anterior Cingulate,Limbic Lobe +25,59,-13,25,57,-14,3,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,19,Brodmann area 32,Anterior Cingulate,Limbic Lobe +32,59,-13,32,57,-14,3,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,19,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +39,59,-13,39,57,-14,4,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +-17,66,-13,-17,63,-14,3,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,19,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-10,66,-13,-10,63,-14,2,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,19,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-3,66,-13,-3,63,-14,5,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,21,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,66,-13,4,63,-14,4,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,21,Brodmann area 32,Anterior Cingulate,Limbic Lobe +11,66,-13,11,63,-14,3,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,19,Brodmann area 32,Anterior Cingulate,Limbic Lobe +18,66,-13,18,63,-14,2,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 32,Anterior Cingulate,Limbic Lobe +25,66,-13,25,63,-14,6,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,22,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-24,-102,-6,-24,-99,0,1,Brodmann area 18,Cuneus,*,8,Brodmann area 17,Cuneus,Occipital Lobe,13,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +-17,-102,-6,-17,-99,0,1,Brodmann area 18,Cuneus,Occipital Lobe,6,Brodmann area 17,Cuneus,Occipital Lobe,17,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +-10,-102,-6,-10,-99,0,2,Brodmann area 17,Cuneus,*,4,Brodmann area 18,Cuneus,*,21,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +-10,-95,-6,-10,-92,0,2,Brodmann area 17,Lingual Gyrus,Occipital Lobe,8,Brodmann area 18,Lingual Gyrus,Occipital Lobe,19,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +-3,-95,-6,-3,-92,0,2,Brodmann area 17,Lingual Gyrus,*,3,Brodmann area 18,Lingual Gyrus,Occipital Lobe,22,Brodmann area 30,Cuneus,Occipital Lobe +32,-95,-6,32,-92,0,2,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe,8,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,10,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe +-45,-88,-6,-45,-86,-1,2,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe,4,Brodmann area 19,Inferior Occipital Gyrus,Occipital Lobe,17,Brodmann area 37,Middle Occipital Gyrus,* +-38,-88,-6,-38,-86,-1,4,Brodmann area 18,Middle Occipital Gyrus,*,7,Brodmann area 19,Middle Occipital Gyrus,*,16,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe +-31,-88,-6,-31,-86,-1,2,Brodmann area 18,Middle Occipital Gyrus,*,10,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,12,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe +-3,-88,-6,-3,-86,-1,2,Brodmann area 18,Lingual Gyrus,*,4,Brodmann area 17,Lingual Gyrus,*,17,Brodmann area 30,Cuneus,Occipital Lobe +4,-88,-6,4,-86,-1,3,Brodmann area 18,Lingual Gyrus,*,5,Brodmann area 17,Lingual Gyrus,*,18,Brodmann area 30,Cuneus,Occipital Lobe +39,-88,-6,39,-86,-1,4,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe,7,Brodmann area 19,Middle Occipital Gyrus,*,17,Brodmann area 17,Inferior Occipital Gyrus,Occipital Lobe +-45,-81,-6,-45,-79,-1,4,Brodmann area 19,Inferior Occipital Gyrus,Occipital Lobe,5,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe,11,Brodmann area 37,Inferior Temporal Gyrus,* +-3,-81,-6,-3,-79,-1,3,Brodmann area 18,Lingual Gyrus,*,9,Brodmann area 17,Lingual Gyrus,*,12,Brodmann area 30,Cuneus,Occipital Lobe +4,-81,-6,4,-79,-1,3,Brodmann area 18,Lingual Gyrus,*,9,Brodmann area 17,Lingual Gyrus,*,12,Brodmann area 30,Cuneus,Occipital Lobe +46,-81,-6,46,-79,-1,4,Brodmann area 19,Middle Occipital Gyrus,*,5,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe,11,Brodmann area 37,Inferior Temporal Gyrus,* +-52,-74,-6,-51,-72,-1,1,Brodmann area 19,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 37,Inferior Temporal Gyrus,*,5,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe +-45,-74,-6,-45,-72,-1,4,Brodmann area 19,Inferior Occipital Gyrus,Occipital Lobe,5,Brodmann area 37,Inferior Temporal Gyrus,*,8,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe +-10,-74,-6,-10,-72,-1,2,Brodmann area 18,Lingual Gyrus,Occipital Lobe,9,Brodmann area 19,Lingual Gyrus,*,11,Brodmann area 30,Cuneus,Occipital Lobe +-3,-74,-6,-3,-72,-1,5,Brodmann area 18,Lingual Gyrus,*,9,Brodmann area 30,Cuneus,Occipital Lobe,10,Brodmann area 19,Lingual Gyrus,* +4,-74,-6,4,-72,-1,4,Brodmann area 18,Lingual Gyrus,Occipital Lobe,9,Brodmann area 30,Cuneus,Occipital Lobe,10,Brodmann area 19,Lingual Gyrus,* +11,-74,-6,11,-72,-1,2,Brodmann area 18,Lingual Gyrus,*,9,Brodmann area 19,Lingual Gyrus,Occipital Lobe,12,Brodmann area 30,Cuneus,Occipital Lobe +25,-74,-6,25,-72,-1,3,Brodmann area 19,Lingual Gyrus,Occipital Lobe,5,Brodmann area 18,Lingual Gyrus,Occipital Lobe,13,Brodmann area 30,Posterior Cingulate,Limbic Lobe +46,-74,-6,46,-72,-1,5,Brodmann area 37,Inferior Temporal Gyrus,*,5,Brodmann area 19,Inferior Occipital Gyrus,Occipital Lobe,7,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe +53,-74,-6,52,-72,-1,1,Brodmann area 19,Inferior Temporal Gyrus,Temporal Lobe,3,Brodmann area 37,Inferior Temporal Gyrus,*,5,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe +-59,-67,-6,-58,-65,-2,3,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,3,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 21,Middle Temporal Gyrus,* +-52,-67,-6,-51,-65,-2,3,Brodmann area 19,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 37,Inferior Temporal Gyrus,*,12,Brodmann area 21,Middle Temporal Gyrus,* +-45,-67,-6,-45,-65,-2,5,Brodmann area 37,Inferior Temporal Gyrus,*,7,Brodmann area 19,Inferior Temporal Gyrus,Temporal Lobe,13,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +-24,-67,-6,-24,-65,-2,4,Brodmann area 19,Lingual Gyrus,*,7,Brodmann area 18,Lingual Gyrus,Occipital Lobe,14,Brodmann area 30,Posterior Cingulate,Limbic Lobe +-17,-67,-6,-17,-65,-2,2,Brodmann area 19,Lingual Gyrus,Occipital Lobe,2,Brodmann area 18,Lingual Gyrus,Occipital Lobe,14,Brodmann area 30,Posterior Cingulate,Limbic Lobe +-10,-67,-6,-10,-65,-2,2,Brodmann area 18,Lingual Gyrus,Occipital Lobe,4,Brodmann area 19,Lingual Gyrus,*,11,Brodmann area 30,Cuneus,Occipital Lobe +11,-67,-6,11,-65,-2,1,Brodmann area 18,Lingual Gyrus,Occipital Lobe,5,Brodmann area 19,Lingual Gyrus,Occipital Lobe,11,Brodmann area 30,Cuneus,Occipital Lobe +18,-67,-6,18,-65,-2,2,Brodmann area 19,Lingual Gyrus,Occipital Lobe,2,Brodmann area 18,Lingual Gyrus,Occipital Lobe,14,Brodmann area 30,Posterior Cingulate,Limbic Lobe +25,-67,-6,25,-65,-2,4,Brodmann area 19,Lingual Gyrus,*,8,Brodmann area 18,Lingual Gyrus,Occipital Lobe,14,Brodmann area 30,Parahippocampal Gyrus,* +46,-67,-6,46,-65,-2,4,Brodmann area 37,Inferior Temporal Gyrus,*,7,Brodmann area 19,Inferior Temporal Gyrus,Temporal Lobe,13,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +53,-67,-6,52,-65,-2,2,Brodmann area 19,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 37,Inferior Temporal Gyrus,*,11,Brodmann area 21,Middle Temporal Gyrus,* +-59,-60,-6,-58,-58,-2,3,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,*,6,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +-52,-60,-6,-51,-58,-2,2,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,2,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-45,-60,-6,-45,-58,-2,4,Brodmann area 19,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 37,Middle Temporal Gyrus,*,13,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-24,-60,-6,-24,-58,-2,5,Brodmann area 19,Lingual Gyrus,*,8,Brodmann area 18,Lingual Gyrus,*,9,Brodmann area 30,Parahippocampal Gyrus,* +-17,-60,-6,-17,-58,-2,2,Brodmann area 19,Lingual Gyrus,Occipital Lobe,5,Brodmann area 18,Lingual Gyrus,Occipital Lobe,11,Brodmann area 30,Parahippocampal Gyrus,* +-10,-60,-6,-10,-58,-2,3,Brodmann area 19,Lingual Gyrus,*,6,Brodmann area 18,Lingual Gyrus,*,10,Brodmann area 30,Cuneus,Occipital Lobe +11,-60,-6,11,-58,-2,3,Brodmann area 19,Lingual Gyrus,*,7,Brodmann area 18,Lingual Gyrus,*,10,Brodmann area 30,Cuneus,Occipital Lobe +18,-60,-6,18,-58,-2,2,Brodmann area 19,Lingual Gyrus,Occipital Lobe,5,Brodmann area 18,Lingual Gyrus,Occipital Lobe,11,Brodmann area 30,Parahippocampal Gyrus,* +25,-60,-6,25,-58,-2,4,Brodmann area 19,Lingual Gyrus,*,8,Brodmann area 18,Lingual Gyrus,*,8,Brodmann area 30,Parahippocampal Gyrus,* +46,-60,-6,46,-58,-2,3,Brodmann area 19,Inferior Temporal Gyrus,Temporal Lobe,4,Brodmann area 37,Middle Temporal Gyrus,*,12,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +53,-60,-6,52,-58,-2,2,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,2,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 21,Middle Temporal Gyrus,* +60,-60,-6,59,-58,-2,2,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 21,Middle Temporal Gyrus,*,7,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +-66,-53,-6,-65,-52,-2,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 22,Middle Temporal Gyrus,* +-59,-53,-6,-58,-52,-2,3,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +-31,-53,-6,-31,-52,-2,8,Brodmann area 37,Fusiform Gyrus,Occipital Lobe,8,Brodmann area 30,Parahippocampal Gyrus,*,9,Brodmann area 19,Fusiform Gyrus,Occipital Lobe +-24,-53,-6,-24,-52,-2,6,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,6,Brodmann area 30,Parahippocampal Gyrus,*,7,Brodmann area 37,Fusiform Gyrus,Occipital Lobe +-17,-53,-6,-17,-52,-2,3,Brodmann area 19,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 18,Lingual Gyrus,*,7,Brodmann area 30,Parahippocampal Gyrus,* +-10,-53,-6,-10,-52,-2,4,Brodmann area 19,Lingual Gyrus,*,7,Brodmann area 18,Lingual Gyrus,*,8,Brodmann area 30,Parahippocampal Gyrus,* +11,-53,-6,11,-52,-2,3,Brodmann area 19,Lingual Gyrus,*,6,Brodmann area 18,Lingual Gyrus,*,8,Brodmann area 30,Parahippocampal Gyrus,* +18,-53,-6,18,-52,-2,3,Brodmann area 19,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 18,Lingual Gyrus,*,7,Brodmann area 30,Parahippocampal Gyrus,* +25,-53,-6,25,-52,-2,6,Brodmann area 30,Parahippocampal Gyrus,*,6,Brodmann area 19,Fusiform Gyrus,Occipital Lobe,7,Brodmann area 37,Fusiform Gyrus,Occipital Lobe +32,-53,-6,32,-52,-2,8,Brodmann area 37,Fusiform Gyrus,Occipital Lobe,9,Brodmann area 30,Parahippocampal Gyrus,*,10,Brodmann area 19,Lingual Gyrus,* +46,-53,-6,46,-52,-2,6,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,12,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +53,-53,-6,52,-52,-2,4,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,10,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +60,-53,-6,59,-52,-2,2,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 22,Middle Temporal Gyrus,* +-66,-46,-6,-65,-45,-3,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Middle Temporal Gyrus,* +-59,-46,-6,-58,-45,-3,5,Brodmann area 21,Middle Temporal Gyrus,*,5,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Middle Temporal Gyrus,* +-31,-46,-6,-31,-45,-3,5,Brodmann area 37,Fusiform Gyrus,Occipital Lobe,8,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,9,Hippocampus,Sub-Gyral,* +-24,-46,-6,-24,-45,-3,5,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 19,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +-17,-46,-6,-17,-45,-3,2,Brodmann area 19,Lingual Gyrus,Occipital Lobe,5,Brodmann area 30,Lingual Gyrus,Occipital Lobe,8,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +11,-46,-6,11,-45,-3,5,Brodmann area 30,Parahippocampal Gyrus,*,5,Brodmann area 19,Lingual Gyrus,Occipital Lobe,10,Brodmann area 18,Lingual Gyrus,* +18,-46,-6,18,-45,-3,2,Brodmann area 19,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 30,Lingual Gyrus,Occipital Lobe,7,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +25,-46,-6,25,-45,-3,5,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 19,Parahippocampal Gyrus,Limbic Lobe +32,-46,-6,32,-45,-3,5,Brodmann area 37,Fusiform Gyrus,Occipital Lobe,9,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,9,Hippocampus,Sub-Gyral,* +60,-46,-6,59,-45,-3,5,Brodmann area 21,Middle Temporal Gyrus,*,5,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Middle Temporal Gyrus,* +67,-46,-6,66,-45,-3,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 37,Inferior Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Middle Temporal Gyrus,* +-66,-39,-6,-65,-38,-3,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Middle Temporal Gyrus,*,11,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-59,-39,-6,-58,-38,-3,5,Brodmann area 21,Middle Temporal Gyrus,*,7,Brodmann area 22,Middle Temporal Gyrus,*,10,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-31,-39,-6,-31,-38,-3,4,Hippocampus,Sub-Gyral,Limbic Lobe,5,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +-24,-39,-6,-24,-38,-3,4,Hippocampus,Sub-Gyral,Temporal Lobe,6,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 30,Parahippocampal Gyrus,Limbic Lobe +18,-39,-6,18,-38,-3,2,Brodmann area 30,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 19,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +32,-39,-6,32,-38,-3,5,Hippocampus,Sub-Gyral,Limbic Lobe,5,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe,6,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +60,-39,-6,59,-38,-3,5,Brodmann area 21,Middle Temporal Gyrus,*,7,Brodmann area 22,Middle Temporal Gyrus,*,9,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +67,-39,-6,66,-38,-3,1,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Middle Temporal Gyrus,*,11,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-66,-32,-6,-65,-31,-3,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,*,11,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-59,-32,-6,-58,-31,-3,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,*,11,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-52,-32,-6,-51,-31,-3,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,*,12,Brodmann area 37,Fusiform Gyrus,Temporal Lobe +-31,-32,-6,-31,-31,-3,1,Hippocampus,Sub-Gyral,Temporal Lobe,7,Brodmann area 27,Parahippocampal Gyrus,Limbic Lobe,9,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +-24,-32,-6,-24,-31,-3,1,Brodmann area 27,Parahippocampal Gyrus,Limbic Lobe,5,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,7,Brodmann area 30,Parahippocampal Gyrus,Limbic Lobe +-17,-32,-6,-17,-31,-3,2,Brodmann area 30,Parahippocampal Gyrus,Limbic Lobe,3,Brodmann area 27,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe +18,-32,-6,18,-31,-3,2,Brodmann area 30,Parahippocampal Gyrus,Limbic Lobe,3,Brodmann area 27,Parahippocampal Gyrus,Limbic Lobe,5,Brodmann area 35,Parahippocampal Gyrus,Limbic Lobe +25,-32,-6,25,-31,-3,2,Brodmann area 27,Parahippocampal Gyrus,Limbic Lobe,4,Hippocampus,Parahippocampal Gyrus,Limbic Lobe,8,Brodmann area 28,Parahippocampal Gyrus,Limbic Lobe +32,-32,-6,32,-31,-3,2,Hippocampus,Sub-Gyral,Temporal Lobe,8,Brodmann area 27,Parahippocampal Gyrus,Limbic Lobe,10,Brodmann area 36,Parahippocampal Gyrus,Limbic Lobe +53,-32,-6,52,-31,-3,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,*,13,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +60,-32,-6,59,-31,-3,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,*,11,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +67,-32,-6,66,-31,-3,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,*,11,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-66,-25,-6,-65,-24,-4,1,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,*,13,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-59,-25,-6,-58,-24,-4,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,*,13,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-52,-25,-6,-51,-24,-4,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,*,10,Brodmann area 13,Insula,Sub-lobar +46,-25,-6,46,-24,-4,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 13,Insula,Sub-lobar,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +53,-25,-6,52,-24,-4,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,*,11,Brodmann area 13,Insula,Sub-lobar +60,-25,-6,59,-24,-4,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,*,13,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +67,-25,-6,66,-24,-4,1,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,*,12,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-66,-18,-6,-65,-18,-4,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,*,12,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-59,-18,-6,-58,-18,-4,4,Brodmann area 21,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,*,12,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe +-52,-18,-6,-51,-18,-4,6,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 13,Insula,* +-38,-18,-6,-38,-18,-4,3,Brodmann area 13,Insula,Sub-lobar,6,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 21,Sub-Gyral,Temporal Lobe +53,-18,-6,52,-18,-4,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 13,Insula,* +60,-18,-6,59,-18,-4,3,Brodmann area 21,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,*,12,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe +67,-18,-6,66,-18,-4,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,*,12,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-59,-11,-6,-58,-11,-5,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,14,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +-52,-11,-6,-51,-11,-5,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 13,Insula,Sub-lobar +-45,-11,-6,-45,-11,-5,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 13,Insula,Sub-lobar,5,Brodmann area 21,Sub-Gyral,Temporal Lobe +-38,-11,-6,-38,-11,-5,4,Brodmann area 21,Sub-Gyral,Temporal Lobe,5,Brodmann area 13,Insula,Sub-lobar,8,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-3,-11,-6,-3,-11,-5,14,Brodmann area 25,Anterior Cingulate,Limbic Lobe,15,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe,15,Amygdala,Parahippocampal Gyrus,Limbic Lobe +4,-11,-6,4,-11,-5,14,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe,14,Brodmann area 25,Anterior Cingulate,Limbic Lobe,14,Amygdala,Parahippocampal Gyrus,Limbic Lobe +39,-11,-6,39,-11,-5,3,Brodmann area 21,Sub-Gyral,Temporal Lobe,5,Brodmann area 13,Insula,Sub-lobar,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +46,-11,-6,46,-11,-5,1,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 13,Insula,Sub-lobar,5,Brodmann area 21,Sub-Gyral,Temporal Lobe +53,-11,-6,52,-11,-5,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 13,Insula,Sub-lobar +60,-11,-6,59,-11,-5,5,Brodmann area 21,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,*,13,Brodmann area 20,Inferior Temporal Gyrus,Temporal Lobe +67,-11,-6,66,-11,-5,2,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,*,13,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-59,-4,-6,-58,-4,-5,1,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-38,-4,-6,-38,-4,-5,4,Brodmann area 13,Insula,Sub-lobar,5,Brodmann area 21,Sub-Gyral,Temporal Lobe,8,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-3,-4,-6,-3,-4,-5,7,Brodmann area 25,Anterior Cingulate,Limbic Lobe,12,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,15,Amygdala,Parahippocampal Gyrus,Limbic Lobe +4,-4,-6,4,-4,-5,7,Brodmann area 25,Anterior Cingulate,Limbic Lobe,12,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,14,Amygdala,Parahippocampal Gyrus,Limbic Lobe +39,-4,-6,39,-4,-5,3,Brodmann area 13,Insula,Sub-lobar,4,Brodmann area 21,Sub-Gyral,Temporal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +46,-4,-6,46,-4,-5,1,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 13,Insula,Sub-lobar,5,Brodmann area 21,Sub-Gyral,Temporal Lobe +53,-4,-6,52,-4,-5,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +60,-4,-6,59,-4,-5,1,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-59,3,-6,-58,3,-5,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-52,3,-6,-51,3,-5,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-38,3,-6,-38,3,-5,4,Brodmann area 13,Extra-Nuclear,Sub-lobar,7,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Sub-Gyral,Temporal Lobe +-3,3,-6,-3,3,-5,1,Brodmann area 25,Anterior Cingulate,Limbic Lobe,9,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,16,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,3,-6,4,3,-5,1,Brodmann area 25,Anterior Cingulate,Limbic Lobe,9,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,16,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +39,3,-6,39,3,-5,3,Brodmann area 13,Insula,Sub-lobar,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +53,3,-6,52,3,-5,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +60,3,-6,59,3,-5,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-52,10,-6,-51,9,-6,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-38,10,-6,-38,9,-6,2,Brodmann area 13,Extra-Nuclear,Sub-lobar,7,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-3,10,-6,-3,9,-6,2,Brodmann area 25,Anterior Cingulate,Limbic Lobe,10,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,10,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,10,-6,4,9,-6,2,Brodmann area 25,Anterior Cingulate,Limbic Lobe,9,Brodmann area 34,Subcallosal Gyrus,Frontal Lobe,10,Brodmann area 32,Anterior Cingulate,Limbic Lobe +39,10,-6,39,9,-6,2,Brodmann area 13,Extra-Nuclear,Sub-lobar,7,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +46,10,-6,46,9,-6,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 13,Insula,Sub-lobar +53,10,-6,52,9,-6,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +60,10,-6,59,9,-6,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-38,17,-6,-38,16,-6,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 13,Insula,Sub-lobar,9,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-31,17,-6,-31,16,-6,2,Brodmann area 13,Insula,Sub-lobar,3,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,14,Brodmann area 45,Inferior Frontal Gyrus,* +-3,17,-6,-3,16,-6,3,Brodmann area 25,Anterior Cingulate,Limbic Lobe,4,Brodmann area 32,Anterior Cingulate,Limbic Lobe,6,Brodmann area 24,Anterior Cingulate,Limbic Lobe +4,17,-6,4,16,-6,2,Brodmann area 25,Anterior Cingulate,Limbic Lobe,4,Brodmann area 32,Anterior Cingulate,Limbic Lobe,6,Brodmann area 24,Anterior Cingulate,Limbic Lobe +32,17,-6,32,16,-6,2,Brodmann area 13,Insula,Sub-lobar,3,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,14,Brodmann area 45,Inferior Frontal Gyrus,* +39,17,-6,39,16,-6,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 13,Insula,Sub-lobar,8,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-52,24,-6,-51,23,-6,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 45,Inferior Frontal Gyrus,* +-45,24,-6,-45,23,-6,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 45,Inferior Frontal Gyrus,* +-38,24,-6,-38,23,-6,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 13,Insula,Sub-lobar,11,Brodmann area 45,Inferior Frontal Gyrus,* +-31,24,-6,-31,23,-6,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 13,Extra-Nuclear,Sub-lobar,11,Brodmann area 45,Inferior Frontal Gyrus,* +-3,24,-6,-3,23,-6,2,Brodmann area 24,Anterior Cingulate,Limbic Lobe,3,Brodmann area 32,Anterior Cingulate,Limbic Lobe,5,Brodmann area 25,Anterior Cingulate,Limbic Lobe +4,24,-6,4,23,-6,2,Brodmann area 24,Anterior Cingulate,Limbic Lobe,3,Brodmann area 32,Anterior Cingulate,Limbic Lobe,4,Brodmann area 25,Anterior Cingulate,Limbic Lobe +32,24,-6,32,23,-6,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 13,Insula,Sub-lobar,10,Brodmann area 45,Inferior Frontal Gyrus,* +39,24,-6,39,23,-6,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 13,Insula,Sub-lobar,10,Brodmann area 45,Inferior Frontal Gyrus,* +46,24,-6,46,23,-6,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 45,Inferior Frontal Gyrus,* +53,24,-6,52,23,-6,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 45,Inferior Frontal Gyrus,* +-52,31,-6,-51,30,-7,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 45,Inferior Frontal Gyrus,*,11,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe +-45,31,-6,-45,30,-7,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 45,Inferior Frontal Gyrus,* +-3,31,-6,-3,30,-7,2,Brodmann area 32,Anterior Cingulate,Limbic Lobe,4,Brodmann area 24,Anterior Cingulate,Limbic Lobe,6,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe +4,31,-6,4,30,-7,2,Brodmann area 32,Anterior Cingulate,Limbic Lobe,3,Brodmann area 24,Anterior Cingulate,Limbic Lobe,6,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe +46,31,-6,46,30,-7,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 45,Inferior Frontal Gyrus,* +53,31,-6,52,30,-7,3,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 45,Inferior Frontal Gyrus,*,12,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe +-52,38,-6,-51,37,-7,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 44,Inferior Frontal Gyrus,* +-45,38,-6,-45,37,-7,2,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 10,Inferior Frontal Gyrus,Frontal Lobe +-10,38,-6,-10,37,-7,2,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 32,Anterior Cingulate,Limbic Lobe,8,Brodmann area 24,Anterior Cingulate,Limbic Lobe +-3,38,-6,-3,37,-7,2,Brodmann area 32,Anterior Cingulate,Limbic Lobe,5,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe +4,38,-6,4,37,-7,1,Brodmann area 32,Anterior Cingulate,Limbic Lobe,5,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 24,Anterior Cingulate,Limbic Lobe +11,38,-6,11,37,-7,1,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 32,Anterior Cingulate,Limbic Lobe,9,Brodmann area 24,Anterior Cingulate,Limbic Lobe +53,38,-6,52,37,-7,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 44,Inferior Frontal Gyrus,* +-45,45,-6,-45,43,-7,5,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Inferior Frontal Gyrus,Frontal Lobe +-10,45,-6,-10,43,-7,4,Brodmann area 32,Anterior Cingulate,Limbic Lobe,5,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe +-3,45,-6,-3,43,-7,2,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 32,Anterior Cingulate,Limbic Lobe,5,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe +4,45,-6,4,43,-7,1,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,3,Brodmann area 32,Anterior Cingulate,Limbic Lobe,5,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe +11,45,-6,11,43,-7,4,Brodmann area 32,Anterior Cingulate,Limbic Lobe,5,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe +46,45,-6,46,43,-7,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Inferior Frontal Gyrus,Frontal Lobe +-45,52,-6,-45,50,-8,1,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,3,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe +-38,52,-6,-38,50,-8,6,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +-10,52,-6,-10,50,-8,4,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 32,Anterior Cingulate,Limbic Lobe,7,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe +-3,52,-6,-3,50,-8,2,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,52,-6,4,50,-8,2,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 32,Anterior Cingulate,Limbic Lobe +11,52,-6,11,50,-8,4,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 32,Anterior Cingulate,Limbic Lobe,8,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe +39,52,-6,39,50,-8,6,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +46,52,-6,46,50,-8,1,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,2,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe +-38,59,-6,-38,57,-8,3,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +-31,59,-6,-31,57,-8,1,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,19,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +-24,59,-6,-24,57,-8,1,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,4,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,15,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-3,59,-6,-3,57,-8,2,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,12,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,59,-6,4,57,-8,2,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,12,Brodmann area 32,Anterior Cingulate,Limbic Lobe +25,59,-6,25,57,-8,1,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,5,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Anterior Cingulate,Limbic Lobe +32,59,-6,32,57,-8,2,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +39,59,-6,39,57,-8,3,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +-24,66,-6,-24,64,-8,2,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,21,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-17,66,-6,-17,64,-8,1,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,4,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-10,66,-6,-10,64,-8,1,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,4,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-3,66,-6,-3,64,-8,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,18,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,66,-6,4,64,-8,3,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,18,Brodmann area 32,Anterior Cingulate,Limbic Lobe +11,66,-6,11,64,-8,1,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,4,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 32,Anterior Cingulate,Limbic Lobe +18,66,-6,18,64,-8,1,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,4,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 32,Anterior Cingulate,Limbic Lobe +25,66,-6,25,64,-8,1,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,7,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,21,Brodmann area 32,Anterior Cingulate,Limbic Lobe +32,66,-6,32,64,-8,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,8,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,22,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +-24,-102,1,-24,-99,6,3,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,10,Brodmann area 17,Cuneus,Occipital Lobe,10,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +-31,-95,1,-31,-92,6,2,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,4,Brodmann area 18,Middle Occipital Gyrus,*,14,Brodmann area 17,Cuneus,Occipital Lobe +-3,-95,1,-3,-92,6,2,Brodmann area 18,Cuneus,Occipital Lobe,3,Brodmann area 17,Cuneus,*,18,Brodmann area 19,Cuneus,Occipital Lobe +32,-95,1,32,-92,6,2,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,3,Brodmann area 18,Middle Occipital Gyrus,*,15,Brodmann area 17,Cuneus,Occipital Lobe +-45,-88,1,-45,-85,5,3,Brodmann area 19,Middle Occipital Gyrus,*,4,Brodmann area 18,Middle Occipital Gyrus,*,12,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-38,-88,1,-38,-85,5,2,Brodmann area 18,Middle Occipital Gyrus,*,3,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,13,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-31,-88,1,-31,-85,5,2,Brodmann area 18,Middle Occipital Gyrus,*,4,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,13,Brodmann area 17,Cuneus,Occipital Lobe +-10,-88,1,-10,-85,5,2,Brodmann area 17,Lingual Gyrus,*,8,Brodmann area 18,Cuneus,Occipital Lobe,13,Brodmann area 23,Cuneus,Occipital Lobe +-3,-88,1,-3,-85,5,2,Brodmann area 17,Lingual Gyrus,*,4,Brodmann area 18,Lingual Gyrus,*,14,Brodmann area 23,Cuneus,Occipital Lobe +4,-88,1,4,-85,5,2,Brodmann area 17,Lingual Gyrus,*,5,Brodmann area 18,Lingual Gyrus,*,14,Brodmann area 23,Cuneus,Occipital Lobe +11,-88,1,11,-85,5,2,Brodmann area 17,Lingual Gyrus,*,8,Brodmann area 18,Lingual Gyrus,*,13,Brodmann area 23,Cuneus,Occipital Lobe +32,-88,1,32,-85,5,2,Brodmann area 18,Middle Occipital Gyrus,*,4,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,14,Brodmann area 17,Cuneus,Occipital Lobe +39,-88,1,39,-85,5,2,Brodmann area 18,Middle Occipital Gyrus,*,4,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,13,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-45,-81,1,-45,-78,5,3,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,8,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe +-10,-81,1,-10,-78,5,2,Brodmann area 18,Lingual Gyrus,*,5,Brodmann area 17,Cuneus,Occipital Lobe,8,Brodmann area 23,Cuneus,Occipital Lobe +-3,-81,1,-3,-78,5,2,Brodmann area 18,Lingual Gyrus,*,4,Brodmann area 17,Cuneus,Occipital Lobe,8,Brodmann area 30,Cuneus,Occipital Lobe +4,-81,1,4,-78,5,2,Brodmann area 18,Lingual Gyrus,*,4,Brodmann area 17,Cuneus,Occipital Lobe,8,Brodmann area 30,Cuneus,Occipital Lobe +11,-81,1,11,-78,5,2,Brodmann area 18,Lingual Gyrus,*,5,Brodmann area 17,Cuneus,Occipital Lobe,8,Brodmann area 23,Cuneus,Occipital Lobe +46,-81,1,46,-78,5,4,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,8,Brodmann area 18,Inferior Occipital Gyrus,Occipital Lobe,8,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-52,-74,1,-51,-72,5,4,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,5,Brodmann area 37,Inferior Temporal Gyrus,*,7,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-45,-74,1,-45,-72,5,3,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,5,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-3,-74,1,-3,-72,5,2,Brodmann area 18,Lingual Gyrus,*,3,Brodmann area 30,Cuneus,Occipital Lobe,7,Brodmann area 23,Cuneus,Occipital Lobe +4,-74,1,4,-72,5,1,Brodmann area 18,Lingual Gyrus,*,3,Brodmann area 30,Cuneus,Occipital Lobe,7,Brodmann area 23,Cuneus,Occipital Lobe +46,-74,1,46,-72,5,3,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,5,Brodmann area 37,Middle Occipital Gyrus,*,7,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +53,-74,1,52,-72,5,4,Brodmann area 37,Middle Occipital Gyrus,*,4,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,7,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-59,-67,1,-58,-65,4,1,Brodmann area 37,Middle Temporal Gyrus,*,6,Brodmann area 19,Inferior Temporal Gyrus,Temporal Lobe,7,Brodmann area 21,Middle Temporal Gyrus,* +-52,-67,1,-51,-65,4,1,Brodmann area 37,Middle Temporal Gyrus,*,6,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,8,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-45,-67,1,-45,-65,4,2,Brodmann area 37,Middle Temporal Gyrus,*,6,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,9,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-17,-67,1,-17,-65,4,4,Brodmann area 19,Lingual Gyrus,*,5,Brodmann area 18,Lingual Gyrus,*,8,Brodmann area 30,Posterior Cingulate,Limbic Lobe +-10,-67,1,-10,-65,4,4,Brodmann area 19,Lingual Gyrus,*,4,Brodmann area 18,Lingual Gyrus,*,6,Brodmann area 30,Cuneus,Occipital Lobe +-3,-67,1,-3,-65,4,4,Brodmann area 18,Lingual Gyrus,*,5,Brodmann area 30,Cuneus,Occipital Lobe,6,Brodmann area 19,Lingual Gyrus,* +4,-67,1,4,-65,4,3,Brodmann area 18,Lingual Gyrus,*,5,Brodmann area 30,Cuneus,Occipital Lobe,5,Brodmann area 19,Lingual Gyrus,* +46,-67,1,46,-65,4,2,Brodmann area 37,Middle Occipital Gyrus,*,7,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,9,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +53,-67,1,52,-65,4,1,Brodmann area 37,Middle Temporal Gyrus,*,5,Brodmann area 19,Inferior Temporal Gyrus,Temporal Lobe,8,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-59,-60,1,-58,-58,4,3,Brodmann area 21,Middle Temporal Gyrus,*,5,Brodmann area 37,Middle Temporal Gyrus,*,9,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-52,-60,1,-51,-58,4,5,Brodmann area 37,Middle Temporal Gyrus,*,5,Brodmann area 19,Inferior Temporal Gyrus,Temporal Lobe,8,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-17,-60,1,-17,-58,4,5,Brodmann area 19,Lingual Gyrus,*,5,Brodmann area 18,Lingual Gyrus,*,8,Brodmann area 30,Posterior Cingulate,Limbic Lobe +-10,-60,1,-10,-58,4,2,Brodmann area 18,Lingual Gyrus,*,3,Brodmann area 19,Lingual Gyrus,*,5,Brodmann area 30,Cuneus,Occipital Lobe +11,-60,1,11,-58,4,3,Brodmann area 18,Lingual Gyrus,*,3,Brodmann area 19,Lingual Gyrus,*,5,Brodmann area 30,Cuneus,Occipital Lobe +46,-60,1,46,-58,4,4,Brodmann area 37,Middle Temporal Gyrus,*,6,Brodmann area 19,Inferior Temporal Gyrus,Temporal Lobe,9,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +53,-60,1,52,-58,4,4,Brodmann area 37,Middle Temporal Gyrus,*,6,Brodmann area 19,Inferior Temporal Gyrus,Temporal Lobe,8,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +60,-60,1,59,-58,4,2,Brodmann area 21,Middle Temporal Gyrus,*,5,Brodmann area 37,Middle Temporal Gyrus,*,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-66,-53,1,-65,-51,3,2,Brodmann area 21,Middle Temporal Gyrus,*,6,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Middle Temporal Gyrus,* +-59,-53,1,-58,-51,3,5,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 21,Middle Temporal Gyrus,*,6,Brodmann area 22,Middle Temporal Gyrus,* +-24,-53,1,-24,-51,3,2,Brodmann area 30,Parahippocampal Gyrus,*,4,Brodmann area 18,Lingual Gyrus,*,9,Brodmann area 19,Parahippocampal Gyrus,Limbic Lobe +-17,-53,1,-17,-51,3,2,Brodmann area 18,Lingual Gyrus,*,4,Brodmann area 30,Parahippocampal Gyrus,*,4,Brodmann area 19,Lingual Gyrus,* +-10,-53,1,-10,-51,3,3,Brodmann area 19,Lingual Gyrus,*,3,Brodmann area 18,Lingual Gyrus,*,5,Brodmann area 30,Parahippocampal Gyrus,* +11,-53,1,11,-51,3,2,Brodmann area 19,Lingual Gyrus,*,2,Brodmann area 18,Lingual Gyrus,*,4,Brodmann area 30,Parahippocampal Gyrus,* +18,-53,1,18,-51,3,3,Brodmann area 30,Parahippocampal Gyrus,*,3,Brodmann area 18,Lingual Gyrus,*,5,Brodmann area 19,Lingual Gyrus,* +25,-53,1,25,-51,3,1,Brodmann area 30,Parahippocampal Gyrus,*,5,Brodmann area 18,Lingual Gyrus,*,9,Brodmann area 19,Lingual Gyrus,* +32,-53,1,32,-51,3,7,Brodmann area 30,Parahippocampal Gyrus,*,10,Brodmann area 19,Lingual Gyrus,*,11,Brodmann area 18,Lingual Gyrus,* +60,-53,1,59,-51,3,5,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,*,6,Brodmann area 22,Middle Temporal Gyrus,* +-66,-46,1,-65,-45,3,1,Brodmann area 22,Middle Temporal Gyrus,*,4,Brodmann area 21,Middle Temporal Gyrus,*,9,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-59,-46,1,-58,-45,3,1,Brodmann area 22,Middle Temporal Gyrus,*,4,Brodmann area 21,Middle Temporal Gyrus,*,9,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-52,-46,1,-51,-45,3,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Middle Temporal Gyrus,*,12,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe +-10,-46,1,-10,-45,3,3,Brodmann area 30,Parahippocampal Gyrus,*,5,Brodmann area 29,Posterior Cingulate,Limbic Lobe,5,Brodmann area 19,Lingual Gyrus,* +11,-46,1,11,-45,3,2,Brodmann area 30,Parahippocampal Gyrus,*,5,Brodmann area 19,Lingual Gyrus,*,5,Brodmann area 29,Posterior Cingulate,Limbic Lobe +18,-46,1,18,-45,3,4,Brodmann area 19,Lingual Gyrus,Occipital Lobe,4,Brodmann area 30,Parahippocampal Gyrus,*,8,Brodmann area 18,Lingual Gyrus,* +60,-46,1,59,-45,3,2,Brodmann area 22,Middle Temporal Gyrus,*,3,Brodmann area 21,Middle Temporal Gyrus,*,8,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +67,-46,1,66,-45,3,2,Brodmann area 22,Middle Temporal Gyrus,*,4,Brodmann area 21,Middle Temporal Gyrus,*,9,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-66,-39,1,-65,-38,3,2,Brodmann area 22,Middle Temporal Gyrus,*,2,Brodmann area 21,Middle Temporal Gyrus,*,10,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-59,-39,1,-58,-38,3,2,Brodmann area 22,Middle Temporal Gyrus,*,3,Brodmann area 21,Middle Temporal Gyrus,*,9,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-52,-39,1,-51,-38,3,3,Brodmann area 22,Middle Temporal Gyrus,*,8,Brodmann area 21,Middle Temporal Gyrus,*,11,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-31,-39,1,-31,-38,3,4,Hippocampus,Sub-Gyral,*,10,Brodmann area 30,Parahippocampal Gyrus,*,11,Brodmann area 37,Parahippocampal Gyrus,Limbic Lobe +-24,-39,1,-24,-38,3,4,Brodmann area 30,Parahippocampal Gyrus,*,4,Hippocampus,Sub-Gyral,*,9,Brodmann area 27,Parahippocampal Gyrus,Limbic Lobe +-17,-39,1,-17,-38,3,2,Brodmann area 30,Parahippocampal Gyrus,*,5,Brodmann area 27,Parahippocampal Gyrus,*,8,Brodmann area 19,Lingual Gyrus,Occipital Lobe +11,-39,1,11,-38,3,3,Brodmann area 30,Parahippocampal Gyrus,*,4,Brodmann area 27,Parahippocampal Gyrus,*,8,Brodmann area 29,Posterior Cingulate,Limbic Lobe +18,-39,1,18,-38,3,3,Brodmann area 30,Parahippocampal Gyrus,*,6,Brodmann area 27,Parahippocampal Gyrus,*,8,Brodmann area 19,Lingual Gyrus,Occipital Lobe +25,-39,1,25,-38,3,4,Hippocampus,Sub-Gyral,*,5,Brodmann area 30,Parahippocampal Gyrus,*,10,Brodmann area 27,Parahippocampal Gyrus,Limbic Lobe +46,-39,1,46,-38,3,8,Brodmann area 22,Middle Temporal Gyrus,*,10,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 21,Middle Temporal Gyrus,* +53,-39,1,52,-38,3,2,Brodmann area 22,Middle Temporal Gyrus,*,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +60,-39,1,59,-38,3,1,Brodmann area 22,Middle Temporal Gyrus,*,3,Brodmann area 21,Middle Temporal Gyrus,*,9,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +67,-39,1,66,-38,3,1,Brodmann area 22,Middle Temporal Gyrus,*,3,Brodmann area 21,Middle Temporal Gyrus,*,10,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-66,-32,1,-65,-31,2,2,Brodmann area 21,Middle Temporal Gyrus,*,6,Brodmann area 22,Superior Temporal Gyrus,*,6,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-59,-32,1,-58,-31,2,2,Brodmann area 21,Middle Temporal Gyrus,*,6,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,* +-52,-32,1,-51,-31,2,2,Brodmann area 21,Middle Temporal Gyrus,*,4,Brodmann area 22,Superior Temporal Gyrus,*,9,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +46,-32,1,46,-31,2,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,*,7,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe +53,-32,1,52,-31,2,1,Brodmann area 21,Middle Temporal Gyrus,*,4,Brodmann area 22,Superior Temporal Gyrus,*,8,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +60,-32,1,59,-31,2,2,Brodmann area 21,Middle Temporal Gyrus,*,6,Brodmann area 22,Superior Temporal Gyrus,*,6,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +67,-32,1,66,-31,2,1,Brodmann area 21,Middle Temporal Gyrus,*,6,Brodmann area 22,Superior Temporal Gyrus,*,7,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-66,-25,1,-65,-24,2,1,Brodmann area 22,Superior Temporal Gyrus,*,3,Brodmann area 21,Middle Temporal Gyrus,*,7,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-59,-25,1,-58,-24,2,2,Brodmann area 22,Superior Temporal Gyrus,*,3,Brodmann area 21,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe +-38,-25,1,-38,-24,2,6,Brodmann area 13,Insula,Sub-lobar,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe +53,-25,1,52,-24,2,3,Brodmann area 22,Superior Temporal Gyrus,*,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe +60,-25,1,59,-24,2,1,Brodmann area 22,Superior Temporal Gyrus,*,4,Brodmann area 21,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +67,-25,1,66,-24,2,2,Brodmann area 22,Superior Temporal Gyrus,*,3,Brodmann area 21,Middle Temporal Gyrus,*,7,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-66,-18,1,-65,-17,2,3,Brodmann area 22,Superior Temporal Gyrus,*,4,Brodmann area 21,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-45,-18,1,-45,-17,2,2,Brodmann area 13,Insula,*,2,Brodmann area 22,Superior Temporal Gyrus,*,10,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe +-38,-18,1,-38,-17,2,5,Brodmann area 13,Insula,*,7,Brodmann area 22,Superior Temporal Gyrus,*,11,Brodmann area 21,Sub-Gyral,Temporal Lobe +-31,-18,1,-31,-17,2,11,Brodmann area 13,Insula,Sub-lobar,11,Hippocampus,Sub-Gyral,Temporal Lobe,13,Brodmann area 22,Superior Temporal Gyrus,* +39,-18,1,39,-17,2,4,Brodmann area 13,Insula,*,6,Brodmann area 22,Superior Temporal Gyrus,*,11,Brodmann area 21,Sub-Gyral,Temporal Lobe +46,-18,1,46,-17,2,2,Brodmann area 22,Superior Temporal Gyrus,*,2,Brodmann area 13,Insula,*,9,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe +67,-18,1,66,-17,2,2,Brodmann area 22,Superior Temporal Gyrus,*,5,Brodmann area 21,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-59,-11,1,-58,-11,1,1,Brodmann area 22,Superior Temporal Gyrus,*,3,Brodmann area 21,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe +-52,-11,1,-51,-11,1,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 13,Insula,* +-38,-11,1,-38,-11,1,5,Brodmann area 13,Insula,*,9,Brodmann area 21,Sub-Gyral,Temporal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-31,-11,1,-31,-11,1,11,Brodmann area 13,Insula,*,13,Brodmann area 21,Sub-Gyral,Temporal Lobe,13,Hippocampus,Parahippocampal Gyrus,Limbic Lobe +39,-11,1,39,-11,1,4,Brodmann area 13,Insula,*,8,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 21,Sub-Gyral,Temporal Lobe +46,-11,1,46,-11,1,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 13,Insula,*,8,Brodmann area 6,Precentral Gyrus,Frontal Lobe +67,-11,1,66,-11,1,4,Brodmann area 21,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 22,Superior Temporal Gyrus,*,7,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-59,-4,1,-58,-4,1,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-52,-4,1,-51,-4,1,3,Brodmann area 22,Superior Temporal Gyrus,*,7,Brodmann area 6,Precentral Gyrus,Frontal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-45,-4,1,-45,-4,1,3,Brodmann area 13,Insula,Sub-lobar,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-38,-4,1,-38,-4,1,5,Brodmann area 13,Insula,Sub-lobar,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 21,Sub-Gyral,Temporal Lobe +39,-4,1,39,-4,1,4,Brodmann area 13,Insula,Sub-lobar,8,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 21,Sub-Gyral,Temporal Lobe +53,-4,1,52,-4,1,3,Brodmann area 22,Superior Temporal Gyrus,*,7,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 6,Precentral Gyrus,Frontal Lobe +60,-4,1,59,-4,1,2,Brodmann area 22,Superior Temporal Gyrus,*,5,Brodmann area 21,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-59,3,1,-58,3,1,3,Brodmann area 22,Superior Temporal Gyrus,*,8,Brodmann area 6,Precentral Gyrus,Frontal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-52,3,1,-51,3,1,1,Brodmann area 22,Superior Temporal Gyrus,*,7,Brodmann area 13,Insula,Sub-lobar,9,Brodmann area 44,Precentral Gyrus,Frontal Lobe +-45,3,1,-45,3,1,2,Brodmann area 13,Insula,Sub-lobar,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 44,Precentral Gyrus,Frontal Lobe +-38,3,1,-38,3,1,5,Brodmann area 13,Insula,*,9,Brodmann area 44,Precentral Gyrus,Frontal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +39,3,1,39,3,1,4,Brodmann area 13,Insula,*,9,Brodmann area 44,Precentral Gyrus,Frontal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +46,3,1,46,3,1,3,Brodmann area 13,Insula,Sub-lobar,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 44,Precentral Gyrus,Frontal Lobe +53,3,1,52,3,1,2,Brodmann area 22,Superior Temporal Gyrus,*,8,Brodmann area 13,Insula,Sub-lobar,9,Brodmann area 6,Precentral Gyrus,Frontal Lobe +60,3,1,59,3,1,2,Brodmann area 22,Superior Temporal Gyrus,*,7,Brodmann area 6,Precentral Gyrus,Frontal Lobe,7,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-52,10,1,-51,10,0,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 13,Insula,Sub-lobar,8,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +-45,10,1,-45,10,0,2,Brodmann area 13,Insula,Sub-lobar,6,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-38,10,1,-38,10,0,5,Brodmann area 13,Insula,Sub-lobar,7,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 44,Precentral Gyrus,Frontal Lobe +39,10,1,39,10,0,4,Brodmann area 13,Insula,*,7,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 44,Precentral Gyrus,Frontal Lobe +46,10,1,46,10,0,2,Brodmann area 13,Insula,Sub-lobar,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +53,10,1,52,10,0,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 13,Insula,Sub-lobar,8,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +-52,17,1,-51,17,0,3,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 45,Inferior Frontal Gyrus,*,6,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-45,17,1,-45,17,0,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 13,Insula,*,5,Brodmann area 45,Inferior Frontal Gyrus,* +-38,17,1,-38,17,0,1,Brodmann area 13,Insula,Sub-lobar,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 45,Inferior Frontal Gyrus,* +-31,17,1,-31,17,0,4,Brodmann area 47,Extra-Nuclear,Sub-lobar,4,Brodmann area 13,Insula,Sub-lobar,9,Brodmann area 45,Inferior Frontal Gyrus,* +32,17,1,32,17,0,3,Brodmann area 47,Extra-Nuclear,Sub-lobar,3,Brodmann area 13,Insula,Sub-lobar,9,Brodmann area 45,Inferior Frontal Gyrus,* +39,17,1,39,17,0,1,Brodmann area 13,Insula,*,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 45,Inferior Frontal Gyrus,* +46,17,1,46,17,0,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 45,Inferior Frontal Gyrus,*,5,Brodmann area 13,Insula,* +53,17,1,52,17,0,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 45,Inferior Frontal Gyrus,*,6,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-52,24,1,-51,23,0,1,Brodmann area 47,Inferior Frontal Gyrus,*,3,Brodmann area 45,Inferior Frontal Gyrus,*,10,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-45,24,1,-45,23,0,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 45,Inferior Frontal Gyrus,*,8,Brodmann area 13,Insula,* +-38,24,1,-38,23,0,2,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 13,Insula,*,5,Brodmann area 45,Inferior Frontal Gyrus,* +-31,24,1,-31,23,0,3,Brodmann area 13,Insula,*,4,Brodmann area 47,Inferior Frontal Gyrus,*,5,Brodmann area 45,Inferior Frontal Gyrus,* +32,24,1,32,23,0,2,Brodmann area 13,Insula,*,3,Brodmann area 47,Inferior Frontal Gyrus,*,5,Brodmann area 45,Inferior Frontal Gyrus,* +39,24,1,39,23,0,1,Brodmann area 47,Inferior Frontal Gyrus,*,5,Brodmann area 45,Inferior Frontal Gyrus,*,5,Brodmann area 13,Insula,* +46,24,1,46,23,0,1,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 45,Inferior Frontal Gyrus,*,8,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe +53,24,1,52,23,0,2,Brodmann area 47,Inferior Frontal Gyrus,*,2,Brodmann area 45,Inferior Frontal Gyrus,*,10,Brodmann area 38,Superior Temporal Gyrus,Temporal Lobe +-52,31,1,-51,30,-1,4,Brodmann area 45,Inferior Frontal Gyrus,*,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 44,Inferior Frontal Gyrus,* +-38,31,1,-38,30,-1,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 45,Inferior Frontal Gyrus,*,9,Brodmann area 13,Insula,* +-31,31,1,-31,30,-1,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 45,Inferior Frontal Gyrus,*,9,Brodmann area 13,Insula,* +32,31,1,32,30,-1,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 45,Inferior Frontal Gyrus,*,8,Brodmann area 13,Insula,* +39,31,1,39,30,-1,6,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 45,Inferior Frontal Gyrus,*,10,Brodmann area 13,Insula,* +53,31,1,52,30,-1,5,Brodmann area 45,Inferior Frontal Gyrus,*,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 44,Inferior Frontal Gyrus,* +-52,38,1,-51,37,-1,3,Brodmann area 44,Inferior Frontal Gyrus,*,4,Brodmann area 10,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +-3,38,1,-3,37,-1,2,Brodmann area 32,Anterior Cingulate,Limbic Lobe,2,Brodmann area 24,Anterior Cingulate,Limbic Lobe,9,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe +4,38,1,4,37,-1,1,Brodmann area 24,Anterior Cingulate,Limbic Lobe,2,Brodmann area 32,Anterior Cingulate,Limbic Lobe,8,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe +46,38,1,46,37,-1,5,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 44,Inferior Frontal Gyrus,*,6,Brodmann area 10,Inferior Frontal Gyrus,Frontal Lobe +53,38,1,52,37,-1,3,Brodmann area 44,Inferior Frontal Gyrus,*,3,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe,3,Brodmann area 45,Inferior Frontal Gyrus,* +-45,45,1,-45,44,-1,2,Brodmann area 10,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 44,Inferior Frontal Gyrus,*,8,Brodmann area 46,Inferior Frontal Gyrus,* +-38,45,1,-38,44,-1,5,Brodmann area 10,Inferior Frontal Gyrus,Frontal Lobe,10,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,10,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +-10,45,1,-10,44,-1,4,Brodmann area 32,Anterior Cingulate,Limbic Lobe,5,Brodmann area 10,Anterior Cingulate,Limbic Lobe,9,Brodmann area 42,Anterior Cingulate,Limbic Lobe +-3,45,1,-3,44,-1,1,Brodmann area 32,Anterior Cingulate,Limbic Lobe,6,Brodmann area 10,Medial Frontal Gyrus,*,8,Brodmann area 24,Anterior Cingulate,Limbic Lobe +4,45,1,4,44,-1,1,Brodmann area 32,Anterior Cingulate,Limbic Lobe,6,Brodmann area 10,Medial Frontal Gyrus,*,8,Brodmann area 24,Anterior Cingulate,Limbic Lobe +11,45,1,11,44,-1,4,Brodmann area 32,Anterior Cingulate,Limbic Lobe,5,Brodmann area 10,Anterior Cingulate,Limbic Lobe,9,Brodmann area 42,Anterior Cingulate,Limbic Lobe +39,45,1,39,44,-1,4,Brodmann area 10,Inferior Frontal Gyrus,Frontal Lobe,10,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,10,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +46,45,1,46,44,-1,3,Brodmann area 10,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 44,Inferior Frontal Gyrus,*,7,Brodmann area 46,Inferior Frontal Gyrus,* +-45,52,1,-45,50,-2,1,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 44,Inferior Frontal Gyrus,*,7,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +-38,52,1,-38,50,-2,3,Brodmann area 10,Inferior Frontal Gyrus,*,11,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +-24,52,1,-24,50,-2,2,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,8,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-10,52,1,-10,50,-2,1,Brodmann area 10,Anterior Cingulate,Limbic Lobe,5,Brodmann area 32,Anterior Cingulate,Limbic Lobe,12,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe +-3,52,1,-3,50,-2,2,Brodmann area 10,Anterior Cingulate,Limbic Lobe,3,Brodmann area 32,Anterior Cingulate,Limbic Lobe,10,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe +4,52,1,4,50,-2,2,Brodmann area 10,Anterior Cingulate,Limbic Lobe,3,Brodmann area 32,Anterior Cingulate,Limbic Lobe,10,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe +11,52,1,11,50,-2,2,Brodmann area 10,Anterior Cingulate,Limbic Lobe,4,Brodmann area 32,Anterior Cingulate,Limbic Lobe,12,Brodmann area 42,Anterior Cingulate,Limbic Lobe +25,52,1,25,50,-2,2,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 32,Anterior Cingulate,Limbic Lobe +32,52,1,32,50,-2,3,Brodmann area 10,Middle Frontal Gyrus,*,11,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +39,52,1,39,50,-2,3,Brodmann area 10,Inferior Frontal Gyrus,*,11,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +46,52,1,46,50,-2,2,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 44,Inferior Frontal Gyrus,*,6,Brodmann area 47,Middle Frontal Gyrus,Frontal Lobe +-38,59,1,-38,57,-2,3,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-31,59,1,-31,57,-2,3,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-24,59,1,-24,57,-2,3,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,15,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-10,59,1,-10,57,-2,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 32,Anterior Cingulate,Limbic Lobe,11,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe +-3,59,1,-3,57,-2,3,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 32,Anterior Cingulate,Limbic Lobe,11,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe +4,59,1,4,57,-2,3,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 32,Anterior Cingulate,Limbic Lobe,11,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe +25,59,1,25,57,-2,2,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Anterior Cingulate,Limbic Lobe +32,59,1,32,57,-2,2,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +39,59,1,39,57,-2,2,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-24,66,1,-24,64,-2,2,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-17,66,1,-17,64,-2,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-10,66,1,-10,64,-2,3,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-3,66,1,-3,64,-2,3,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,17,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,66,1,4,64,-2,2,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,17,Brodmann area 32,Anterior Cingulate,Limbic Lobe +11,66,1,11,64,-2,3,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 32,Anterior Cingulate,Limbic Lobe +18,66,1,18,64,-2,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 32,Anterior Cingulate,Limbic Lobe +25,66,1,25,64,-2,2,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,12,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,21,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-31,-95,8,-31,-92,12,2,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,4,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,15,Brodmann area 17,Cuneus,Occipital Lobe +4,-95,8,4,-92,12,2,Brodmann area 18,Cuneus,Occipital Lobe,6,Brodmann area 17,Cuneus,Occipital Lobe,12,Brodmann area 19,Cuneus,Occipital Lobe +32,-95,8,32,-92,12,2,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,4,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,16,Brodmann area 17,Cuneus,Occipital Lobe +-45,-88,8,-45,-85,12,2,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,4,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,10,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-38,-88,8,-38,-85,12,1,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,3,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,11,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-31,-88,8,-31,-85,12,5,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,7,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,14,Brodmann area 17,Cuneus,Occipital Lobe +-3,-88,8,-3,-85,12,3,Brodmann area 18,Cuneus,Occipital Lobe,4,Brodmann area 17,Cuneus,Occipital Lobe,12,Brodmann area 23,Cuneus,Occipital Lobe +4,-88,8,4,-85,12,2,Brodmann area 18,Cuneus,Occipital Lobe,3,Brodmann area 17,Cuneus,Occipital Lobe,12,Brodmann area 23,Cuneus,Occipital Lobe +11,-88,8,11,-85,12,4,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,5,Brodmann area 17,Cuneus,Occipital Lobe,11,Brodmann area 23,Cuneus,Occipital Lobe +32,-88,8,32,-85,12,5,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,7,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,15,Brodmann area 17,Cuneus,Occipital Lobe +39,-88,8,39,-85,12,1,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,3,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,11,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-45,-81,8,-45,-78,11,1,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +-10,-81,8,-10,-78,11,1,Brodmann area 17,Cuneus,Occipital Lobe,4,Brodmann area 23,Cuneus,Occipital Lobe,6,Brodmann area 18,Cuneus,Occipital Lobe +-3,-81,8,-3,-78,11,2,Brodmann area 17,Cuneus,Occipital Lobe,3,Brodmann area 18,Cuneus,Occipital Lobe,5,Brodmann area 23,Cuneus,Occipital Lobe +4,-81,8,4,-78,11,2,Brodmann area 17,Cuneus,Occipital Lobe,3,Brodmann area 18,Cuneus,Occipital Lobe,5,Brodmann area 23,Cuneus,Occipital Lobe +11,-81,8,11,-78,11,1,Brodmann area 17,Cuneus,Occipital Lobe,4,Brodmann area 23,Cuneus,Occipital Lobe,5,Brodmann area 18,Cuneus,Occipital Lobe +39,-81,8,39,-78,11,3,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,5,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +46,-81,8,46,-78,11,1,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +-52,-74,8,-51,-71,11,1,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,7,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-45,-74,8,-45,-71,11,2,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,3,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,4,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-10,-74,8,-10,-71,11,1,Brodmann area 23,Cuneus,Occipital Lobe,3,Brodmann area 30,Cuneus,Occipital Lobe,5,Brodmann area 18,Cuneus,Occipital Lobe +-3,-74,8,-3,-71,11,2,Brodmann area 23,Cuneus,Occipital Lobe,3,Brodmann area 30,Cuneus,Occipital Lobe,5,Brodmann area 18,Cuneus,Occipital Lobe +4,-74,8,4,-71,11,2,Brodmann area 23,Cuneus,Occipital Lobe,3,Brodmann area 30,Cuneus,Occipital Lobe,5,Brodmann area 18,Cuneus,Occipital Lobe +11,-74,8,11,-71,11,1,Brodmann area 23,Cuneus,Occipital Lobe,3,Brodmann area 30,Cuneus,Occipital Lobe,5,Brodmann area 17,Cuneus,Occipital Lobe +46,-74,8,46,-71,11,2,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,3,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,5,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +53,-74,8,52,-71,11,1,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,6,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-59,-67,8,-58,-65,11,2,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe +-52,-67,8,-51,-65,11,2,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +-45,-67,8,-45,-65,11,3,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +-24,-67,8,-24,-65,11,3,Brodmann area 30,Posterior Cingulate,Limbic Lobe,5,Brodmann area 31,Posterior Cingulate,Limbic Lobe,6,Brodmann area 18,Cuneus,Occipital Lobe +-17,-67,8,-17,-65,11,1,Brodmann area 30,Posterior Cingulate,Limbic Lobe,5,Brodmann area 23,Cuneus,Occipital Lobe,6,Brodmann area 18,Cuneus,Occipital Lobe +-10,-67,8,-10,-65,11,1,Brodmann area 30,Posterior Cingulate,Limbic Lobe,5,Brodmann area 31,Posterior Cingulate,Limbic Lobe,6,Brodmann area 23,Cuneus,Occipital Lobe +-3,-67,8,-3,-65,11,2,Brodmann area 30,Posterior Cingulate,Limbic Lobe,5,Brodmann area 31,Posterior Cingulate,Limbic Lobe,6,Brodmann area 23,Posterior Cingulate,Limbic Lobe +4,-67,8,4,-65,11,2,Brodmann area 30,Posterior Cingulate,Limbic Lobe,5,Brodmann area 31,Posterior Cingulate,Limbic Lobe,7,Brodmann area 23,Posterior Cingulate,Limbic Lobe +11,-67,8,11,-65,11,1,Brodmann area 30,Posterior Cingulate,Limbic Lobe,5,Brodmann area 31,Posterior Cingulate,Limbic Lobe,6,Brodmann area 23,Cuneus,Occipital Lobe +18,-67,8,18,-65,11,1,Brodmann area 30,Posterior Cingulate,Limbic Lobe,5,Brodmann area 18,Cuneus,Occipital Lobe,6,Brodmann area 31,Posterior Cingulate,Limbic Lobe +25,-67,8,25,-65,11,4,Brodmann area 30,Posterior Cingulate,Limbic Lobe,5,Brodmann area 31,Posterior Cingulate,Limbic Lobe,6,Brodmann area 18,Cuneus,Occipital Lobe +46,-67,8,46,-65,11,4,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +53,-67,8,52,-65,11,2,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,3,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe +-59,-60,8,-58,-58,10,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-52,-60,8,-51,-58,10,3,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe +-45,-60,8,-45,-58,10,5,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe +-24,-60,8,-24,-58,10,7,Brodmann area 30,Posterior Cingulate,Limbic Lobe,8,Brodmann area 18,Lingual Gyrus,*,9,Brodmann area 31,Posterior Cingulate,Limbic Lobe +-17,-60,8,-17,-58,10,3,Brodmann area 30,Posterior Cingulate,Limbic Lobe,8,Brodmann area 18,Lingual Gyrus,*,8,Brodmann area 31,Posterior Cingulate,Limbic Lobe +-10,-60,8,-10,-58,10,3,Brodmann area 30,Cuneus,Occipital Lobe,6,Brodmann area 18,Lingual Gyrus,*,8,Brodmann area 29,Posterior Cingulate,Limbic Lobe +-3,-60,8,-3,-58,10,3,Brodmann area 30,Posterior Cingulate,Limbic Lobe,3,Brodmann area 29,Posterior Cingulate,Limbic Lobe,6,Brodmann area 23,Posterior Cingulate,Limbic Lobe +4,-60,8,4,-58,10,2,Brodmann area 30,Posterior Cingulate,Limbic Lobe,3,Brodmann area 29,Posterior Cingulate,Limbic Lobe,6,Brodmann area 23,Posterior Cingulate,Limbic Lobe +11,-60,8,11,-58,10,4,Brodmann area 30,Cuneus,Occipital Lobe,7,Brodmann area 18,Lingual Gyrus,*,8,Brodmann area 29,Posterior Cingulate,Limbic Lobe +18,-60,8,18,-58,10,3,Brodmann area 30,Posterior Cingulate,Limbic Lobe,8,Brodmann area 18,Lingual Gyrus,*,8,Brodmann area 31,Posterior Cingulate,Limbic Lobe +25,-60,8,25,-58,10,8,Brodmann area 30,Posterior Cingulate,Limbic Lobe,8,Brodmann area 18,Lingual Gyrus,*,9,Brodmann area 31,Posterior Cingulate,Limbic Lobe +46,-60,8,46,-58,10,5,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe +53,-60,8,52,-58,10,3,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +60,-60,8,59,-58,10,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-66,-53,8,-65,-51,10,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-59,-53,8,-58,-51,10,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-52,-53,8,-51,-51,10,3,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-10,-53,8,-10,-51,10,5,Brodmann area 30,Posterior Cingulate,Limbic Lobe,5,Brodmann area 29,Posterior Cingulate,Limbic Lobe,7,Brodmann area 18,Lingual Gyrus,* +4,-53,8,4,-51,10,3,Brodmann area 29,Posterior Cingulate,Limbic Lobe,3,Brodmann area 30,Posterior Cingulate,Limbic Lobe,7,Brodmann area 23,Posterior Cingulate,Limbic Lobe +11,-53,8,11,-51,10,5,Brodmann area 30,Posterior Cingulate,Limbic Lobe,6,Brodmann area 29,Posterior Cingulate,Limbic Lobe,6,Brodmann area 18,Lingual Gyrus,* +18,-53,8,18,-51,10,5,Brodmann area 30,Posterior Cingulate,Limbic Lobe,7,Brodmann area 18,Lingual Gyrus,*,10,Brodmann area 19,Lingual Gyrus,* +25,-53,8,25,-51,10,6,Brodmann area 30,Parahippocampal Gyrus,*,8,Brodmann area 18,Lingual Gyrus,*,13,Brodmann area 19,Lingual Gyrus,* +46,-53,8,46,-51,10,3,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,11,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe +53,-53,8,52,-51,10,2,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +60,-53,8,59,-51,10,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-66,-46,8,-65,-44,10,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,13,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-59,-46,8,-58,-44,10,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe +-52,-46,8,-51,-44,10,4,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe +4,-46,8,4,-44,10,3,Brodmann area 29,Posterior Cingulate,Limbic Lobe,7,Brodmann area 30,Posterior Cingulate,Limbic Lobe,13,Brodmann area 23,Posterior Cingulate,Limbic Lobe +53,-46,8,52,-44,10,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe +60,-46,8,59,-44,10,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe +67,-46,8,66,-44,10,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,14,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-66,-39,8,-65,-37,9,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,*,8,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-59,-39,8,-58,-37,9,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-52,-39,8,-51,-37,9,6,Brodmann area 22,Middle Temporal Gyrus,*,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe +46,-39,8,46,-37,9,5,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 22,Middle Temporal Gyrus,* +53,-39,8,52,-37,9,5,Brodmann area 22,Middle Temporal Gyrus,*,7,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +60,-39,8,59,-37,9,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,* +67,-39,8,66,-37,9,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,*,8,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-66,-32,8,-65,-31,9,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,2,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,* +-59,-32,8,-58,-31,9,1,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe +-52,-32,8,-51,-31,9,5,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe +-45,-32,8,-45,-31,9,2,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 13,Insula,Sub-lobar +60,-32,8,59,-31,9,1,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe +67,-32,8,66,-31,9,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,* +-66,-25,8,-65,-24,9,4,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,*,9,Brodmann area 21,Middle Temporal Gyrus,* +-59,-25,8,-58,-24,9,4,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,5,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 40,Postcentral Gyrus,Parietal Lobe +-52,-25,8,-51,-24,9,2,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,* +-45,-25,8,-45,-24,9,3,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,* +-38,-25,8,-38,-24,9,1,Brodmann area 13,Insula,Sub-lobar,3,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,* +-31,-25,8,-31,-24,9,5,Brodmann area 13,Insula,Sub-lobar,7,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,11,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe +46,-25,8,46,-24,9,3,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,* +60,-25,8,59,-24,9,5,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,7,Brodmann area 40,Postcentral Gyrus,Parietal Lobe +67,-25,8,66,-24,9,3,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,*,9,Brodmann area 21,Middle Temporal Gyrus,* +-66,-18,8,-65,-17,8,4,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 22,Superior Temporal Gyrus,*,8,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe +-59,-18,8,-58,-17,8,1,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 42,Transverse Temporal Gyrus,Temporal Lobe,8,Brodmann area 22,Superior Temporal Gyrus,* +-52,-18,8,-51,-17,8,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,5,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe +-45,-18,8,-45,-17,8,1,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe +-38,-18,8,-38,-17,8,3,Brodmann area 13,Insula,Sub-lobar,8,Brodmann area 22,Superior Temporal Gyrus,*,8,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe +39,-18,8,39,-17,8,2,Brodmann area 13,Insula,Sub-lobar,7,Brodmann area 22,Superior Temporal Gyrus,*,7,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe +46,-18,8,46,-17,8,0,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe +53,-18,8,52,-17,8,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,6,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe +60,-18,8,59,-17,8,2,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 42,Transverse Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,* +67,-18,8,66,-17,8,3,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 22,Superior Temporal Gyrus,*,8,Brodmann area 43,Postcentral Gyrus,Parietal Lobe +-59,-11,8,-58,-10,8,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 42,Transverse Temporal Gyrus,Temporal Lobe,4,Brodmann area 43,Precentral Gyrus,Frontal Lobe +-52,-11,8,-51,-10,8,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 6,Precentral Gyrus,Frontal Lobe,4,Brodmann area 43,Precentral Gyrus,Frontal Lobe +-45,-11,8,-45,-10,8,2,Brodmann area 13,Insula,Sub-lobar,4,Brodmann area 6,Precentral Gyrus,Frontal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-38,-11,8,-38,-10,8,4,Brodmann area 13,Insula,Sub-lobar,10,Brodmann area 6,Precentral Gyrus,Frontal Lobe,11,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +39,-11,8,39,-10,8,3,Brodmann area 13,Insula,Sub-lobar,9,Brodmann area 6,Precentral Gyrus,Frontal Lobe,10,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +46,-11,8,46,-10,8,3,Brodmann area 13,Insula,Sub-lobar,3,Brodmann area 6,Precentral Gyrus,Frontal Lobe,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +53,-11,8,52,-10,8,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 6,Precentral Gyrus,Frontal Lobe,4,Brodmann area 43,Precentral Gyrus,Frontal Lobe +60,-11,8,59,-10,8,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 42,Transverse Temporal Gyrus,Temporal Lobe,5,Brodmann area 43,Precentral Gyrus,Frontal Lobe +-59,-4,8,-58,-4,8,0,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,5,Brodmann area 43,Precentral Gyrus,Frontal Lobe +-52,-4,8,-51,-4,8,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,4,Brodmann area 22,Superior Temporal Gyrus,*,6,Brodmann area 44,Precentral Gyrus,Frontal Lobe +-45,-4,8,-45,-4,8,2,Brodmann area 13,Insula,Sub-lobar,3,Brodmann area 6,Precentral Gyrus,Frontal Lobe,4,Brodmann area 44,Precentral Gyrus,Frontal Lobe +-38,-4,8,-38,-4,8,4,Brodmann area 13,Insula,Sub-lobar,9,Brodmann area 44,Precentral Gyrus,Frontal Lobe,9,Brodmann area 6,Precentral Gyrus,Frontal Lobe +39,-4,8,39,-4,8,4,Brodmann area 13,Insula,Sub-lobar,8,Brodmann area 6,Precentral Gyrus,Frontal Lobe,9,Brodmann area 44,Precentral Gyrus,Frontal Lobe +46,-4,8,46,-4,8,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,3,Brodmann area 13,Insula,Sub-lobar,4,Brodmann area 44,Precentral Gyrus,Frontal Lobe +53,-4,8,52,-4,8,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,4,Brodmann area 22,Superior Temporal Gyrus,*,5,Brodmann area 43,Precentral Gyrus,Frontal Lobe +60,-4,8,59,-4,8,1,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 6,Precentral Gyrus,Frontal Lobe,5,Brodmann area 43,Precentral Gyrus,Frontal Lobe +-59,3,8,-58,3,7,3,Brodmann area 6,Precentral Gyrus,Frontal Lobe,3,Brodmann area 22,Superior Temporal Gyrus,*,6,Brodmann area 44,Precentral Gyrus,Frontal Lobe +-45,3,8,-45,3,7,1,Brodmann area 44,Precentral Gyrus,Frontal Lobe,4,Brodmann area 13,Insula,Sub-lobar,6,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-38,3,8,-38,3,7,3,Brodmann area 13,Insula,Sub-lobar,6,Brodmann area 44,Precentral Gyrus,Frontal Lobe,11,Brodmann area 6,Precentral Gyrus,Frontal Lobe +39,3,8,39,3,7,2,Brodmann area 13,Insula,Sub-lobar,5,Brodmann area 44,Precentral Gyrus,Frontal Lobe,10,Brodmann area 6,Precentral Gyrus,Frontal Lobe +46,3,8,46,3,7,2,Brodmann area 44,Precentral Gyrus,Frontal Lobe,5,Brodmann area 13,Insula,Sub-lobar,5,Brodmann area 6,Precentral Gyrus,Frontal Lobe +53,3,8,52,3,7,5,Brodmann area 6,Precentral Gyrus,Frontal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,*,6,Brodmann area 44,Precentral Gyrus,Frontal Lobe +60,3,8,59,3,7,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,4,Brodmann area 22,Superior Temporal Gyrus,*,6,Brodmann area 44,Precentral Gyrus,Frontal Lobe +-59,10,8,-58,10,7,5,Brodmann area 44,Precentral Gyrus,Frontal Lobe,8,Brodmann area 6,Precentral Gyrus,Frontal Lobe,8,Brodmann area 22,Superior Temporal Gyrus,* +-52,10,8,-51,10,7,5,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 13,Insula,*,8,Brodmann area 22,Superior Temporal Gyrus,* +-38,10,8,-38,10,7,2,Brodmann area 13,Insula,Sub-lobar,4,Brodmann area 44,Precentral Gyrus,Frontal Lobe,12,Brodmann area 47,Inferior Frontal Gyrus,* +-31,10,8,-31,10,7,7,Brodmann area 13,Insula,Sub-lobar,10,Brodmann area 44,Precentral Gyrus,Frontal Lobe,12,Brodmann area 47,Extra-Nuclear,Sub-lobar +32,10,8,32,10,7,6,Brodmann area 13,Insula,Sub-lobar,9,Brodmann area 44,Precentral Gyrus,Frontal Lobe,12,Brodmann area 47,Extra-Nuclear,Sub-lobar +39,10,8,39,10,7,2,Brodmann area 13,Insula,Sub-lobar,3,Brodmann area 44,Precentral Gyrus,Frontal Lobe,11,Brodmann area 47,Inferior Frontal Gyrus,* +46,10,8,46,10,7,3,Brodmann area 44,Precentral Gyrus,Frontal Lobe,4,Brodmann area 13,Insula,*,9,Brodmann area 45,Inferior Frontal Gyrus,* +53,10,8,52,10,7,5,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,*,9,Brodmann area 13,Insula,* +60,10,8,59,10,7,5,Brodmann area 44,Precentral Gyrus,Frontal Lobe,7,Brodmann area 6,Precentral Gyrus,Frontal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-52,17,8,-51,17,7,1,Brodmann area 44,Precentral Gyrus,Frontal Lobe,4,Brodmann area 45,Inferior Frontal Gyrus,*,7,Brodmann area 47,Inferior Frontal Gyrus,* +-45,17,8,-45,17,7,1,Brodmann area 44,Precentral Gyrus,Frontal Lobe,4,Brodmann area 45,Inferior Frontal Gyrus,*,6,Brodmann area 47,Inferior Frontal Gyrus,* +-38,17,8,-38,17,7,2,Brodmann area 13,Insula,Sub-lobar,6,Brodmann area 45,Inferior Frontal Gyrus,*,6,Brodmann area 44,Precentral Gyrus,Frontal Lobe +-31,17,8,-31,17,7,5,Brodmann area 13,Insula,Sub-lobar,9,Brodmann area 47,Extra-Nuclear,Sub-lobar,9,Brodmann area 45,Inferior Frontal Gyrus,* +32,17,8,32,17,7,4,Brodmann area 13,Insula,Sub-lobar,8,Brodmann area 47,Extra-Nuclear,Sub-lobar,9,Brodmann area 45,Inferior Frontal Gyrus,* +39,17,8,39,17,7,2,Brodmann area 13,Insula,Sub-lobar,5,Brodmann area 44,Precentral Gyrus,Frontal Lobe,5,Brodmann area 45,Inferior Frontal Gyrus,* +46,17,8,46,17,7,2,Brodmann area 44,Precentral Gyrus,Frontal Lobe,4,Brodmann area 45,Inferior Frontal Gyrus,*,6,Brodmann area 47,Inferior Frontal Gyrus,* +53,17,8,52,17,7,2,Brodmann area 44,Precentral Gyrus,Frontal Lobe,3,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 47,Inferior Frontal Gyrus,* +60,17,8,59,17,7,3,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 47,Inferior Frontal Gyrus,* +-52,24,8,-51,24,6,2,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 47,Inferior Frontal Gyrus,*,7,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe +-38,24,8,-38,24,6,2,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 45,Inferior Frontal Gyrus,*,5,Brodmann area 47,Inferior Frontal Gyrus,* +-31,24,8,-31,24,6,4,Brodmann area 45,Inferior Frontal Gyrus,*,4,Brodmann area 13,Insula,*,6,Brodmann area 47,Inferior Frontal Gyrus,* +32,24,8,32,24,6,3,Brodmann area 45,Inferior Frontal Gyrus,*,3,Brodmann area 13,Insula,*,5,Brodmann area 47,Inferior Frontal Gyrus,* +39,24,8,39,24,6,3,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 45,Inferior Frontal Gyrus,*,5,Brodmann area 47,Inferior Frontal Gyrus,* +46,24,8,46,24,6,3,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,3,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +53,24,8,52,24,6,2,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 47,Inferior Frontal Gyrus,*,7,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe +-52,31,8,-51,30,6,4,Brodmann area 45,Inferior Frontal Gyrus,*,7,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +53,31,8,52,30,6,3,Brodmann area 45,Inferior Frontal Gyrus,*,6,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 47,Inferior Frontal Gyrus,Frontal Lobe +-52,38,8,-51,37,6,3,Brodmann area 45,Inferior Frontal Gyrus,*,4,Brodmann area 46,Inferior Frontal Gyrus,*,5,Brodmann area 44,Inferior Frontal Gyrus,* +-45,38,8,-45,37,6,5,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 44,Inferior Frontal Gyrus,* +-38,38,8,-38,37,6,6,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 45,Inferior Frontal Gyrus,* +-3,38,8,-3,37,6,2,Brodmann area 24,Anterior Cingulate,Limbic Lobe,4,Brodmann area 42,Anterior Cingulate,Limbic Lobe,5,Brodmann area 32,Anterior Cingulate,* +4,38,8,4,37,6,2,Brodmann area 24,Anterior Cingulate,*,5,Brodmann area 42,Anterior Cingulate,Limbic Lobe,5,Brodmann area 32,Anterior Cingulate,* +11,38,8,11,37,6,6,Brodmann area 32,Anterior Cingulate,*,7,Brodmann area 24,Anterior Cingulate,*,7,Brodmann area 42,Anterior Cingulate,Limbic Lobe +39,38,8,39,37,6,6,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 44,Inferior Frontal Gyrus,* +46,38,8,46,37,6,6,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 44,Inferior Frontal Gyrus,*,8,Brodmann area 45,Inferior Frontal Gyrus,* +53,38,8,52,37,6,3,Brodmann area 45,Inferior Frontal Gyrus,*,5,Brodmann area 46,Inferior Frontal Gyrus,*,5,Brodmann area 44,Inferior Frontal Gyrus,* +-45,45,8,-45,44,5,4,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 10,Inferior Frontal Gyrus,*,7,Brodmann area 44,Inferior Frontal Gyrus,* +-38,45,8,-38,44,5,5,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Inferior Frontal Gyrus,*,13,Brodmann area 44,Inferior Frontal Gyrus,* +-10,45,8,-10,44,5,2,Brodmann area 10,Medial Frontal Gyrus,*,2,Brodmann area 32,Anterior Cingulate,*,4,Brodmann area 42,Anterior Cingulate,Limbic Lobe +-3,45,8,-3,44,5,2,Brodmann area 32,Anterior Cingulate,*,3,Brodmann area 42,Anterior Cingulate,Limbic Lobe,6,Brodmann area 10,Medial Frontal Gyrus,* +4,45,8,4,44,5,2,Brodmann area 32,Anterior Cingulate,*,3,Brodmann area 42,Anterior Cingulate,Limbic Lobe,5,Brodmann area 10,Medial Frontal Gyrus,* +11,45,8,11,44,5,3,Brodmann area 10,Medial Frontal Gyrus,*,3,Brodmann area 32,Anterior Cingulate,*,3,Brodmann area 42,Anterior Cingulate,Limbic Lobe +39,45,8,39,44,5,4,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Inferior Frontal Gyrus,*,12,Brodmann area 44,Inferior Frontal Gyrus,* +46,45,8,46,44,5,3,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 10,Inferior Frontal Gyrus,*,6,Brodmann area 44,Inferior Frontal Gyrus,* +-45,52,8,-45,51,5,1,Brodmann area 10,Middle Frontal Gyrus,*,4,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 44,Inferior Frontal Gyrus,* +-38,52,8,-38,51,5,4,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 44,Inferior Frontal Gyrus,* +-31,52,8,-31,51,5,4,Brodmann area 10,Middle Frontal Gyrus,*,13,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,16,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe +-24,52,8,-24,51,5,2,Brodmann area 10,Middle Frontal Gyrus,*,11,Brodmann area 42,Anterior Cingulate,Limbic Lobe,13,Brodmann area 32,Anterior Cingulate,* +-10,52,8,-10,51,5,4,Brodmann area 10,Medial Frontal Gyrus,*,8,Brodmann area 32,Anterior Cingulate,*,8,Brodmann area 42,Anterior Cingulate,Limbic Lobe +-3,52,8,-3,51,5,1,Brodmann area 10,Medial Frontal Gyrus,*,5,Brodmann area 32,Anterior Cingulate,*,6,Brodmann area 42,Anterior Cingulate,Limbic Lobe +4,52,8,4,51,5,2,Brodmann area 10,Medial Frontal Gyrus,*,5,Brodmann area 32,Anterior Cingulate,*,6,Brodmann area 42,Anterior Cingulate,Limbic Lobe +11,52,8,11,51,5,4,Brodmann area 10,Medial Frontal Gyrus,*,8,Brodmann area 42,Anterior Cingulate,Limbic Lobe,8,Brodmann area 32,Anterior Cingulate,* +25,52,8,25,51,5,1,Brodmann area 10,Middle Frontal Gyrus,*,12,Brodmann area 42,Anterior Cingulate,Limbic Lobe,14,Brodmann area 32,Anterior Cingulate,* +32,52,8,32,51,5,4,Brodmann area 10,Middle Frontal Gyrus,*,12,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,17,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe +39,52,8,39,51,5,4,Brodmann area 10,Inferior Frontal Gyrus,*,7,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 44,Inferior Frontal Gyrus,* +46,52,8,46,51,5,1,Brodmann area 10,Middle Frontal Gyrus,*,4,Brodmann area 46,Inferior Frontal Gyrus,*,7,Brodmann area 44,Inferior Frontal Gyrus,* +-38,59,8,-38,58,4,4,Brodmann area 10,Middle Frontal Gyrus,*,9,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,16,Brodmann area 11,Middle Frontal Gyrus,Frontal Lobe +-31,59,8,-31,58,4,4,Brodmann area 10,Middle Frontal Gyrus,*,15,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,16,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe +-24,59,8,-24,58,4,5,Brodmann area 10,Superior Frontal Gyrus,*,16,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 42,Anterior Cingulate,Limbic Lobe +-10,59,8,-10,58,4,4,Brodmann area 10,Medial Frontal Gyrus,*,13,Brodmann area 32,Anterior Cingulate,*,14,Brodmann area 42,Anterior Cingulate,Limbic Lobe +-3,59,8,-3,58,4,3,Brodmann area 10,Medial Frontal Gyrus,*,12,Brodmann area 32,Anterior Cingulate,*,13,Brodmann area 42,Anterior Cingulate,Limbic Lobe +4,59,8,4,58,4,3,Brodmann area 10,Medial Frontal Gyrus,*,12,Brodmann area 32,Anterior Cingulate,*,13,Brodmann area 42,Anterior Cingulate,Limbic Lobe +11,59,8,11,58,4,4,Brodmann area 10,Medial Frontal Gyrus,*,13,Brodmann area 32,Anterior Cingulate,*,14,Brodmann area 42,Anterior Cingulate,Limbic Lobe +25,59,8,25,58,4,4,Brodmann area 10,Superior Frontal Gyrus,*,16,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 42,Anterior Cingulate,Limbic Lobe +32,59,8,32,58,4,4,Brodmann area 10,Middle Frontal Gyrus,*,14,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,16,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe +39,59,8,39,58,4,3,Brodmann area 10,Middle Frontal Gyrus,*,8,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,16,Brodmann area 44,Inferior Frontal Gyrus,* +-24,66,8,-24,64,4,3,Brodmann area 10,Superior Frontal Gyrus,*,17,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,22,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-17,66,8,-17,64,4,3,Brodmann area 10,Medial Frontal Gyrus,*,16,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,19,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-10,66,8,-10,64,4,2,Brodmann area 10,Medial Frontal Gyrus,*,16,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +4,66,8,4,64,4,1,Brodmann area 10,Medial Frontal Gyrus,*,17,Brodmann area 11,Medial Frontal Gyrus,Frontal Lobe,17,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +11,66,8,11,64,4,2,Brodmann area 10,Medial Frontal Gyrus,*,16,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +18,66,8,18,64,4,2,Brodmann area 10,Medial Frontal Gyrus,*,16,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,19,Brodmann area 32,Anterior Cingulate,Limbic Lobe +25,66,8,25,64,4,2,Brodmann area 10,Superior Frontal Gyrus,*,17,Brodmann area 11,Superior Frontal Gyrus,Frontal Lobe,22,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-31,-95,15,-31,-91,18,2,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,6,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,17,Brodmann area 17,Cuneus,Occipital Lobe +-24,-95,15,-24,-91,18,3,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,4,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,13,Brodmann area 17,Cuneus,Occipital Lobe +-3,-95,15,-3,-91,18,2,Brodmann area 18,Cuneus,Occipital Lobe,7,Brodmann area 19,Cuneus,Occipital Lobe,10,Brodmann area 17,Cuneus,Occipital Lobe +-38,-88,15,-38,-85,18,3,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,6,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,13,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-31,-88,15,-31,-85,18,3,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,9,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,13,Brodmann area 31,Precuneus,Occipital Lobe +-3,-88,15,-3,-85,18,2,Brodmann area 18,Cuneus,Occipital Lobe,7,Brodmann area 17,Cuneus,Occipital Lobe,10,Brodmann area 19,Cuneus,Occipital Lobe +4,-88,15,4,-85,18,2,Brodmann area 18,Cuneus,Occipital Lobe,7,Brodmann area 17,Cuneus,Occipital Lobe,9,Brodmann area 19,Cuneus,Occipital Lobe +39,-88,15,39,-85,18,2,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,6,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,12,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-45,-81,15,-45,-78,18,4,Brodmann area 19,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,11,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +-38,-81,15,-38,-78,18,5,Brodmann area 19,Middle Occipital Gyrus,Temporal Lobe,8,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +-3,-81,15,-3,-78,18,3,Brodmann area 18,Cuneus,Occipital Lobe,6,Brodmann area 17,Cuneus,Occipital Lobe,8,Brodmann area 23,Cuneus,Occipital Lobe +4,-81,15,4,-78,18,3,Brodmann area 18,Cuneus,Occipital Lobe,6,Brodmann area 17,Cuneus,Occipital Lobe,8,Brodmann area 23,Cuneus,Occipital Lobe +39,-81,15,39,-78,18,5,Brodmann area 19,Middle Occipital Gyrus,Temporal Lobe,8,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +46,-81,15,46,-78,18,5,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,6,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,12,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +-52,-74,15,-51,-71,17,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 19,Middle Temporal Gyrus,Temporal Lobe,11,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-45,-74,15,-45,-71,17,5,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,10,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-38,-74,15,-38,-71,17,8,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,11,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-3,-74,15,-3,-71,17,1,Brodmann area 18,Cuneus,Occipital Lobe,4,Brodmann area 31,Precuneus,Occipital Lobe,5,Brodmann area 23,Cuneus,Occipital Lobe +4,-74,15,4,-71,17,1,Brodmann area 18,Cuneus,Occipital Lobe,5,Brodmann area 31,Precuneus,Occipital Lobe,5,Brodmann area 23,Cuneus,Occipital Lobe +11,-74,15,11,-71,17,3,Brodmann area 18,Cuneus,Occipital Lobe,5,Brodmann area 23,Cuneus,Occipital Lobe,5,Brodmann area 31,Posterior Cingulate,Limbic Lobe +39,-74,15,39,-71,17,8,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,11,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +46,-74,15,46,-71,17,5,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe,10,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +53,-74,15,52,-71,17,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe,10,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-59,-67,15,-58,-64,17,1,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-52,-67,15,-51,-64,17,2,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-45,-67,15,-45,-64,17,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe,8,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-38,-67,15,-38,-64,17,6,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +-17,-67,15,-17,-64,17,3,Brodmann area 31,Posterior Cingulate,Limbic Lobe,4,Brodmann area 18,Cuneus,Occipital Lobe,5,Brodmann area 30,Posterior Cingulate,Limbic Lobe +-10,-67,15,-10,-64,17,3,Brodmann area 31,Posterior Cingulate,Limbic Lobe,5,Brodmann area 30,Posterior Cingulate,Limbic Lobe,5,Brodmann area 18,Cuneus,Occipital Lobe +-3,-67,15,-3,-64,17,1,Brodmann area 31,Posterior Cingulate,Limbic Lobe,3,Brodmann area 23,Posterior Cingulate,Limbic Lobe,5,Brodmann area 30,Posterior Cingulate,Limbic Lobe +4,-67,15,4,-64,17,2,Brodmann area 31,Posterior Cingulate,Limbic Lobe,4,Brodmann area 23,Posterior Cingulate,Limbic Lobe,5,Brodmann area 30,Posterior Cingulate,Limbic Lobe +11,-67,15,11,-64,17,2,Brodmann area 31,Posterior Cingulate,Limbic Lobe,5,Brodmann area 18,Cuneus,Occipital Lobe,5,Brodmann area 30,Posterior Cingulate,Limbic Lobe +18,-67,15,18,-64,17,2,Brodmann area 31,Posterior Cingulate,Limbic Lobe,3,Brodmann area 18,Cuneus,Occipital Lobe,5,Brodmann area 30,Posterior Cingulate,Limbic Lobe +46,-67,15,46,-64,17,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe,8,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +53,-67,15,52,-64,17,3,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe,3,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-59,-60,15,-58,-57,17,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe +-52,-60,15,-51,-57,17,1,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe +-45,-60,15,-45,-57,17,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe,5,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe +-17,-60,15,-17,-57,17,5,Brodmann area 30,Posterior Cingulate,Limbic Lobe,7,Brodmann area 31,Posterior Cingulate,Limbic Lobe,10,Brodmann area 18,Cuneus,Occipital Lobe +-10,-60,15,-10,-57,17,6,Brodmann area 23,Posterior Cingulate,Limbic Lobe,7,Brodmann area 31,Posterior Cingulate,Limbic Lobe,8,Brodmann area 30,Posterior Cingulate,Limbic Lobe +-3,-60,15,-3,-57,17,2,Brodmann area 23,Posterior Cingulate,Limbic Lobe,5,Brodmann area 29,Posterior Cingulate,Limbic Lobe,6,Brodmann area 30,Posterior Cingulate,Limbic Lobe +4,-60,15,4,-57,17,2,Brodmann area 23,Posterior Cingulate,Limbic Lobe,5,Brodmann area 29,Posterior Cingulate,Limbic Lobe,6,Brodmann area 30,Posterior Cingulate,Limbic Lobe +11,-60,15,11,-57,17,7,Brodmann area 23,Posterior Cingulate,Limbic Lobe,7,Brodmann area 31,Posterior Cingulate,Limbic Lobe,8,Brodmann area 30,Posterior Cingulate,Limbic Lobe +18,-60,15,18,-57,17,5,Brodmann area 30,Posterior Cingulate,Limbic Lobe,6,Brodmann area 31,Posterior Cingulate,Limbic Lobe,10,Brodmann area 18,Cuneus,Occipital Lobe +46,-60,15,46,-57,17,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe +53,-60,15,52,-57,17,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe +60,-60,15,59,-57,17,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe +-59,-53,15,-58,-51,16,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 40,Supramarginal Gyrus,Temporal Lobe +-52,-53,15,-51,-51,16,5,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 40,Inferior Parietal Lobule,Temporal Lobe +-45,-53,15,-45,-51,16,5,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe +-3,-53,15,-3,-51,16,1,Brodmann area 30,Posterior Cingulate,Limbic Lobe,4,Brodmann area 23,Posterior Cingulate,Limbic Lobe,5,Brodmann area 29,Posterior Cingulate,Limbic Lobe +4,-53,15,4,-51,16,1,Brodmann area 30,Posterior Cingulate,Limbic Lobe,4,Brodmann area 23,Posterior Cingulate,Limbic Lobe,4,Brodmann area 29,Posterior Cingulate,Limbic Lobe +11,-53,15,11,-51,16,7,Brodmann area 30,Posterior Cingulate,Limbic Lobe,8,Brodmann area 29,Posterior Cingulate,Limbic Lobe,8,Brodmann area 23,Posterior Cingulate,Limbic Lobe +18,-53,15,18,-51,16,6,Brodmann area 30,Posterior Cingulate,Limbic Lobe,12,Brodmann area 31,Posterior Cingulate,Limbic Lobe,12,Brodmann area 18,Lingual Gyrus,* +46,-53,15,46,-51,16,5,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe +53,-53,15,52,-51,16,4,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 40,Inferior Parietal Lobule,Temporal Lobe +60,-53,15,59,-51,16,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 40,Supramarginal Gyrus,Temporal Lobe +-66,-46,15,-65,-44,16,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 40,Supramarginal Gyrus,Temporal Lobe,9,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-59,-46,15,-58,-44,16,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 40,Supramarginal Gyrus,Temporal Lobe +-52,-46,15,-51,-44,16,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-3,-46,15,-3,-44,16,2,Brodmann area 29,Posterior Cingulate,Limbic Lobe,4,Brodmann area 30,Posterior Cingulate,Limbic Lobe,10,Brodmann area 23,Posterior Cingulate,Limbic Lobe +4,-46,15,4,-44,16,1,Brodmann area 29,Posterior Cingulate,Limbic Lobe,4,Brodmann area 30,Posterior Cingulate,Limbic Lobe,10,Brodmann area 23,Posterior Cingulate,Limbic Lobe +46,-46,15,46,-44,16,5,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 40,Inferior Parietal Lobule,Temporal Lobe +53,-46,15,52,-44,16,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +60,-46,15,59,-44,16,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 40,Supramarginal Gyrus,Temporal Lobe +67,-46,15,66,-44,16,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 40,Supramarginal Gyrus,Temporal Lobe,10,Brodmann area 21,Middle Temporal Gyrus,Temporal Lobe +-66,-39,15,-65,-37,16,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe +-59,-39,15,-58,-37,16,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe +-45,-39,15,-45,-37,16,3,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 13,Insula,Sub-lobar,6,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe +53,-39,15,52,-37,16,5,Brodmann area 13,Insula,Sub-lobar,7,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +60,-39,15,59,-37,16,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe +67,-39,15,66,-37,16,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe +-66,-32,15,-65,-30,15,3,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 40,Postcentral Gyrus,Parietal Lobe +-59,-32,15,-58,-30,15,3,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe +-52,-32,15,-51,-30,15,1,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe +-45,-32,15,-45,-30,15,3,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,5,Brodmann area 13,Insula,Sub-lobar +-38,-32,15,-38,-30,15,2,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 13,Insula,Sub-lobar,4,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe +39,-32,15,39,-30,15,2,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 13,Insula,Sub-lobar,4,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe +46,-32,15,46,-30,15,2,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,6,Brodmann area 13,Insula,Sub-lobar +53,-32,15,52,-30,15,2,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe,2,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 41,Superior Temporal Gyrus,Temporal Lobe +60,-32,15,59,-30,15,3,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +67,-32,15,66,-30,15,2,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 40,Postcentral Gyrus,Parietal Lobe +-66,-25,15,-65,-24,15,3,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 43,Postcentral Gyrus,Parietal Lobe +-59,-25,15,-58,-24,15,2,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,3,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe +-52,-25,15,-51,-24,15,1,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,3,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,6,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-45,-25,15,-45,-24,15,3,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,5,Brodmann area 13,Insula,Sub-lobar +-38,-25,15,-38,-24,15,3,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,4,Brodmann area 13,Insula,Sub-lobar,7,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe +-31,-25,15,-31,-24,15,3,Brodmann area 13,Insula,Sub-lobar,7,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,9,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe +32,-25,15,32,-24,15,2,Brodmann area 13,Insula,Sub-lobar,6,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,8,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe +39,-25,15,39,-24,15,3,Brodmann area 13,Insula,Sub-lobar,4,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,6,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe +46,-25,15,46,-24,15,3,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 40,Insula,Sub-lobar,5,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe +53,-25,15,52,-24,15,1,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,5,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +60,-25,15,59,-24,15,2,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,3,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe +67,-25,15,66,-24,15,4,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 43,Postcentral Gyrus,Parietal Lobe +-66,-18,15,-65,-17,15,1,Brodmann area 43,Postcentral Gyrus,Parietal Lobe,2,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,3,Brodmann area 42,Transverse Temporal Gyrus,Temporal Lobe +-59,-18,15,-58,-17,15,4,Brodmann area 42,Transverse Temporal Gyrus,Temporal Lobe,4,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,5,Brodmann area 40,Postcentral Gyrus,Parietal Lobe +-52,-18,15,-51,-17,15,2,Brodmann area 43,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,5,Brodmann area 40,Insula,Sub-lobar +-45,-18,15,-45,-17,15,1,Brodmann area 13,Insula,Sub-lobar,5,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,5,Brodmann area 43,Postcentral Gyrus,Parietal Lobe +-38,-18,15,-38,-17,15,2,Brodmann area 13,Insula,Sub-lobar,7,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,12,Brodmann area 43,Postcentral Gyrus,Parietal Lobe +39,-18,15,39,-17,15,1,Brodmann area 13,Insula,Sub-lobar,7,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,11,Brodmann area 43,Postcentral Gyrus,Parietal Lobe +46,-18,15,46,-17,15,1,Brodmann area 13,Insula,Sub-lobar,4,Brodmann area 43,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe +53,-18,15,52,-17,15,2,Brodmann area 43,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,5,Brodmann area 40,Insula,Sub-lobar +60,-18,15,59,-17,15,4,Brodmann area 42,Transverse Temporal Gyrus,Temporal Lobe,4,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,5,Brodmann area 40,Postcentral Gyrus,Parietal Lobe +67,-18,15,66,-17,15,2,Brodmann area 43,Postcentral Gyrus,Parietal Lobe,2,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,3,Brodmann area 42,Transverse Temporal Gyrus,Temporal Lobe +-66,-11,15,-65,-10,14,2,Brodmann area 42,Transverse Temporal Gyrus,Temporal Lobe,2,Brodmann area 43,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-52,-11,15,-51,-10,14,2,Brodmann area 43,Precentral Gyrus,Frontal Lobe,3,Brodmann area 13,Precentral Gyrus,Frontal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-45,-11,15,-45,-10,14,4,Brodmann area 13,Insula,Sub-lobar,7,Brodmann area 6,Precentral Gyrus,Frontal Lobe,7,Brodmann area 43,Precentral Gyrus,Frontal Lobe +-38,-11,15,-38,-10,14,3,Brodmann area 13,Insula,Sub-lobar,12,Brodmann area 6,Precentral Gyrus,Frontal Lobe,13,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +39,-11,15,39,-10,14,3,Brodmann area 13,Insula,Sub-lobar,11,Brodmann area 6,Precentral Gyrus,Frontal Lobe,12,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +46,-11,15,46,-10,14,4,Brodmann area 13,Insula,Sub-lobar,6,Brodmann area 43,Precentral Gyrus,Frontal Lobe,7,Brodmann area 6,Precentral Gyrus,Frontal Lobe +53,-11,15,52,-10,14,2,Brodmann area 43,Precentral Gyrus,Frontal Lobe,4,Brodmann area 13,Precentral Gyrus,Frontal Lobe,6,Brodmann area 42,Transverse Temporal Gyrus,Temporal Lobe +60,-11,15,59,-10,14,2,Brodmann area 42,Transverse Temporal Gyrus,Temporal Lobe,3,Brodmann area 43,Precentral Gyrus,Frontal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +67,-11,15,66,-10,14,3,Brodmann area 42,Transverse Temporal Gyrus,Temporal Lobe,3,Brodmann area 43,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-59,-4,15,-58,-3,14,2,Brodmann area 4,Precentral Gyrus,Frontal Lobe,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,4,Brodmann area 43,Postcentral Gyrus,Parietal Lobe +-38,-4,15,-38,-3,14,2,Brodmann area 13,Insula,Sub-lobar,10,Brodmann area 44,Precentral Gyrus,Frontal Lobe,11,Brodmann area 6,Precentral Gyrus,Frontal Lobe +39,-4,15,39,-3,14,2,Brodmann area 13,Insula,Sub-lobar,10,Brodmann area 44,Precentral Gyrus,Frontal Lobe,10,Brodmann area 6,Precentral Gyrus,Frontal Lobe +60,-4,15,59,-3,14,2,Brodmann area 4,Precentral Gyrus,Frontal Lobe,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,4,Brodmann area 43,Postcentral Gyrus,Parietal Lobe +67,-4,15,66,-3,14,5,Brodmann area 4,Precentral Gyrus,Frontal Lobe,5,Brodmann area 6,Precentral Gyrus,Frontal Lobe,6,Brodmann area 43,Postcentral Gyrus,Parietal Lobe +-59,3,15,-58,4,14,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,3,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 4,Precentral Gyrus,Frontal Lobe +39,3,15,39,4,14,2,Brodmann area 13,Insula,Sub-lobar,7,Brodmann area 44,Precentral Gyrus,Frontal Lobe,12,Brodmann area 6,Precentral Gyrus,Frontal Lobe +60,3,15,59,4,14,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,4,Brodmann area 44,Precentral Gyrus,Frontal Lobe,7,Brodmann area 4,Precentral Gyrus,Frontal Lobe +-59,10,15,-58,10,13,1,Brodmann area 44,Precentral Gyrus,Frontal Lobe,6,Brodmann area 6,Precentral Gyrus,Frontal Lobe,7,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe +-52,10,15,-51,10,13,2,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,10,Brodmann area 6,Precentral Gyrus,Frontal Lobe +53,10,15,52,10,13,1,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 6,Precentral Gyrus,Frontal Lobe +60,10,15,59,10,13,2,Brodmann area 44,Precentral Gyrus,Frontal Lobe,6,Brodmann area 6,Precentral Gyrus,Frontal Lobe,7,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe +-59,17,15,-58,17,13,2,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,2,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,11,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +-52,17,15,-51,17,13,2,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,3,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,10,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe +53,17,15,52,17,13,1,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,3,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,11,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe +60,17,15,59,17,13,2,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,3,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,11,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +53,24,15,52,24,13,4,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe +-52,31,15,-51,31,12,4,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,11,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe +-45,31,15,-45,31,12,1,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe +-3,31,15,-3,31,12,0,Brodmann area 24,Anterior Cingulate,Limbic Lobe,6,Brodmann area 32,Anterior Cingulate,Limbic Lobe,11,Brodmann area 42,Anterior Cingulate,Limbic Lobe +4,31,15,4,31,12,1,Brodmann area 24,Anterior Cingulate,Limbic Lobe,5,Brodmann area 32,Anterior Cingulate,Limbic Lobe,11,Brodmann area 42,Anterior Cingulate,Limbic Lobe +39,31,15,39,31,12,5,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe +46,31,15,46,31,12,0,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe +53,31,15,52,31,12,4,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,12,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe +-45,38,15,-45,38,12,1,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 45,Inferior Frontal Gyrus,* +-38,38,15,-38,38,12,1,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,3,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,15,Brodmann area 13,Inferior Frontal Gyrus,Frontal Lobe +-10,38,15,-10,38,12,1,Brodmann area 32,Anterior Cingulate,Limbic Lobe,5,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe +-3,38,15,-3,38,12,0,Brodmann area 32,Anterior Cingulate,Limbic Lobe,4,Brodmann area 24,Anterior Cingulate,Limbic Lobe,5,Brodmann area 42,Anterior Cingulate,Limbic Lobe +4,38,15,4,38,12,1,Brodmann area 32,Anterior Cingulate,Limbic Lobe,5,Brodmann area 24,Anterior Cingulate,Limbic Lobe,5,Brodmann area 42,Anterior Cingulate,Limbic Lobe +11,38,15,11,38,12,1,Brodmann area 32,Anterior Cingulate,Limbic Lobe,4,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe +46,38,15,46,38,12,1,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 45,Inferior Frontal Gyrus,* +53,38,15,52,38,12,3,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 45,Inferior Frontal Gyrus,*,10,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +-45,45,15,-45,44,12,1,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,3,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,12,Brodmann area 45,Inferior Frontal Gyrus,* +-38,45,15,-38,44,12,2,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,16,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-24,45,15,-24,44,12,9,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 42,Anterior Cingulate,Limbic Lobe +-10,45,15,-10,44,12,1,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,3,Brodmann area 32,Anterior Cingulate,Limbic Lobe,4,Brodmann area 42,Anterior Cingulate,Limbic Lobe +-3,45,15,-3,44,12,2,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,2,Brodmann area 32,Anterior Cingulate,Limbic Lobe,4,Brodmann area 42,Anterior Cingulate,Limbic Lobe +4,45,15,4,44,12,2,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,2,Brodmann area 32,Anterior Cingulate,Limbic Lobe,4,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +11,45,15,11,44,12,1,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 32,Anterior Cingulate,Limbic Lobe,4,Brodmann area 42,Anterior Cingulate,Limbic Lobe +46,45,15,46,44,12,2,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,2,Brodmann area 46,Inferior Frontal Gyrus,Frontal Lobe,12,Brodmann area 45,Inferior Frontal Gyrus,* +-38,52,15,-38,51,11,2,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,16,Brodmann area 44,Inferior Frontal Gyrus,* +-31,52,15,-31,51,11,4,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,17,Brodmann area 42,Anterior Cingulate,Limbic Lobe +-24,52,15,-24,51,11,7,Brodmann area 10,Middle Frontal Gyrus,*,11,Brodmann area 42,Anterior Cingulate,Limbic Lobe,13,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +-10,52,15,-10,51,11,2,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,8,Brodmann area 42,Anterior Cingulate,Limbic Lobe,8,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +-3,52,15,-3,51,11,2,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 42,Anterior Cingulate,Limbic Lobe +4,52,15,4,51,11,1,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 42,Anterior Cingulate,Limbic Lobe +11,52,15,11,51,11,2,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,8,Brodmann area 42,Anterior Cingulate,Limbic Lobe,9,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +25,52,15,25,51,11,7,Brodmann area 10,Middle Frontal Gyrus,*,12,Brodmann area 42,Anterior Cingulate,Limbic Lobe,14,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +32,52,15,32,51,11,4,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,17,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe +39,52,15,39,51,11,1,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 44,Inferior Frontal Gyrus,* +-31,59,15,-31,58,11,4,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,18,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe +-24,59,15,-24,58,11,2,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,16,Brodmann area 42,Anterior Cingulate,Limbic Lobe,17,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe +-3,59,15,-3,58,11,2,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,12,Brodmann area 42,Anterior Cingulate,Limbic Lobe +4,59,15,4,58,11,1,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,12,Brodmann area 42,Anterior Cingulate,Limbic Lobe +18,59,15,18,58,11,6,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,14,Brodmann area 42,Anterior Cingulate,Limbic Lobe,16,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +25,59,15,25,58,11,2,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,17,Brodmann area 42,Anterior Cingulate,Limbic Lobe,17,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe +32,59,15,32,58,11,4,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,14,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,18,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe +-17,66,15,-17,65,11,2,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,21,Brodmann area 42,Anterior Cingulate,Limbic Lobe +-10,66,15,-10,65,11,3,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,15,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,20,Brodmann area 42,Anterior Cingulate,Limbic Lobe +4,66,15,4,65,11,3,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,14,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,19,Brodmann area 42,Anterior Cingulate,Limbic Lobe +11,66,15,11,65,11,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,20,Brodmann area 42,Anterior Cingulate,Limbic Lobe +18,66,15,18,65,11,1,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,21,Brodmann area 42,Anterior Cingulate,Limbic Lobe +25,66,15,25,65,11,2,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,19,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,23,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-24,-95,22,-24,-91,25,1,Brodmann area 19,Cuneus,Occipital Lobe,5,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe,13,Brodmann area 31,Precuneus,Occipital Lobe +-3,-95,22,-3,-91,25,3,Brodmann area 19,Cuneus,Occipital Lobe,6,Brodmann area 18,Cuneus,Occipital Lobe,16,Brodmann area 17,Cuneus,Occipital Lobe +-38,-88,22,-38,-84,24,3,Brodmann area 19,Superior Occipital Gyrus,Occipital Lobe,11,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,12,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +-31,-88,22,-31,-84,24,1,Brodmann area 19,Superior Occipital Gyrus,Occipital Lobe,11,Brodmann area 31,Precuneus,Occipital Lobe,11,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +-24,-88,22,-24,-84,24,4,Brodmann area 18,Cuneus,Occipital Lobe,6,Brodmann area 19,Cuneus,Occipital Lobe,7,Brodmann area 31,Precuneus,Occipital Lobe +4,-88,22,4,-84,24,1,Brodmann area 18,Cuneus,Occipital Lobe,5,Brodmann area 19,Cuneus,Occipital Lobe,12,Brodmann area 17,Cuneus,Occipital Lobe +32,-88,22,32,-84,24,2,Brodmann area 19,Superior Occipital Gyrus,Occipital Lobe,12,Brodmann area 31,Precuneus,Occipital Lobe,12,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +39,-88,22,39,-84,24,2,Brodmann area 19,Superior Occipital Gyrus,Occipital Lobe,10,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,12,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +-45,-81,22,-45,-77,24,2,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,4,Brodmann area 19,Superior Occipital Gyrus,Occipital Lobe,16,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +-31,-81,22,-31,-77,24,4,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,9,Brodmann area 31,Precuneus,Occipital Lobe,10,Brodmann area 18,Cuneus,Occipital Lobe +-24,-81,22,-24,-77,24,4,Brodmann area 31,Precuneus,Occipital Lobe,5,Brodmann area 18,Cuneus,Occipital Lobe,6,Brodmann area 19,Superior Occipital Gyrus,Occipital Lobe +-3,-81,22,-3,-77,24,4,Brodmann area 18,Cuneus,Occipital Lobe,6,Brodmann area 31,Precuneus,Parietal Lobe,8,Brodmann area 19,Cuneus,Occipital Lobe +4,-81,22,4,-77,24,3,Brodmann area 18,Cuneus,Occipital Lobe,6,Brodmann area 31,Precuneus,Parietal Lobe,7,Brodmann area 19,Cuneus,Occipital Lobe +32,-81,22,32,-77,24,5,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,9,Brodmann area 31,Precuneus,Occipital Lobe,11,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe +39,-81,22,39,-77,24,2,Brodmann area 19,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,15,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +46,-81,22,46,-77,24,1,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 19,Superior Occipital Gyrus,Occipital Lobe,16,Brodmann area 18,Middle Occipital Gyrus,Occipital Lobe +-52,-74,22,-51,-71,24,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 19,Middle Temporal Gyrus,Temporal Lobe,15,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-45,-74,22,-45,-71,24,5,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 19,Superior Occipital Gyrus,Occipital Lobe,16,Brodmann area 37,Middle Temporal Gyrus,Temporal Lobe +-38,-74,22,-38,-71,24,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,6,Brodmann area 19,Superior Occipital Gyrus,Occipital Lobe,15,Brodmann area 31,Precuneus,Occipital Lobe +-10,-74,22,-10,-71,24,3,Brodmann area 18,Cuneus,Occipital Lobe,4,Brodmann area 31,Precuneus,Occipital Lobe,9,Brodmann area 7,Cuneus,Occipital Lobe +-3,-74,22,-3,-71,24,2,Brodmann area 31,Precuneus,Parietal Lobe,4,Brodmann area 18,Cuneus,Occipital Lobe,8,Brodmann area 7,Cuneus,Occipital Lobe +4,-74,22,4,-71,24,1,Brodmann area 31,Precuneus,Parietal Lobe,3,Brodmann area 18,Cuneus,Occipital Lobe,8,Brodmann area 7,Cuneus,Occipital Lobe +32,-74,22,32,-71,24,8,Brodmann area 19,Middle Occipital Gyrus,Occipital Lobe,9,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 31,Precuneus,Occipital Lobe +46,-74,22,46,-71,24,5,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 19,Superior Occipital Gyrus,Occipital Lobe,16,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +53,-74,22,52,-71,24,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,5,Brodmann area 19,Middle Temporal Gyrus,Temporal Lobe,15,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe +-52,-67,22,-51,-64,23,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-45,-67,22,-45,-64,23,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe,11,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-17,-67,22,-17,-64,23,4,Brodmann area 31,Precuneus,Occipital Lobe,7,Brodmann area 18,Cuneus,Occipital Lobe,10,Brodmann area 7,Precuneus,Parietal Lobe +-10,-67,22,-10,-64,23,5,Brodmann area 31,Precuneus,Occipital Lobe,7,Brodmann area 18,Cuneus,Occipital Lobe,9,Brodmann area 23,Precuneus,Occipital Lobe +-3,-67,22,-3,-64,23,2,Brodmann area 31,Precuneus,Parietal Lobe,4,Brodmann area 23,Precuneus,Occipital Lobe,9,Brodmann area 7,Cuneus,Occipital Lobe +4,-67,22,4,-64,23,2,Brodmann area 31,Precuneus,Parietal Lobe,4,Brodmann area 23,Precuneus,Occipital Lobe,9,Brodmann area 7,Cuneus,Occipital Lobe +11,-67,22,11,-64,23,4,Brodmann area 31,Precuneus,Occipital Lobe,6,Brodmann area 18,Cuneus,Occipital Lobe,10,Brodmann area 23,Precuneus,Occipital Lobe +18,-67,22,18,-64,23,5,Brodmann area 31,Precuneus,Occipital Lobe,8,Brodmann area 18,Cuneus,Occipital Lobe,10,Brodmann area 7,Precuneus,Parietal Lobe +46,-67,22,46,-64,23,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe,10,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +53,-67,22,52,-64,23,3,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,8,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-59,-60,22,-58,-57,23,2,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 40,Supramarginal Gyrus,Temporal Lobe +-52,-60,22,-51,-57,23,2,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe +-45,-60,22,-45,-57,23,3,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe +-17,-60,22,-17,-57,23,6,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,11,Brodmann area 7,Precuneus,Parietal Lobe,11,Brodmann area 30,Posterior Cingulate,Limbic Lobe +-3,-60,22,-3,-57,23,2,Brodmann area 31,Posterior Cingulate,Limbic Lobe,3,Brodmann area 23,Posterior Cingulate,Limbic Lobe,9,Brodmann area 7,Precuneus,Parietal Lobe +4,-60,22,4,-57,23,1,Brodmann area 31,Posterior Cingulate,Limbic Lobe,3,Brodmann area 23,Posterior Cingulate,Limbic Lobe,9,Brodmann area 7,Precuneus,Parietal Lobe +11,-60,22,11,-57,23,2,Brodmann area 31,Posterior Cingulate,Limbic Lobe,9,Brodmann area 23,Posterior Cingulate,Limbic Lobe,10,Brodmann area 7,Precuneus,Parietal Lobe +18,-60,22,18,-57,23,7,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,11,Brodmann area 7,Precuneus,Parietal Lobe,11,Brodmann area 30,Posterior Cingulate,Limbic Lobe +25,-60,22,25,-57,23,9,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 31,Posterior Cingulate,Limbic Lobe,11,Brodmann area 7,Precuneus,Parietal Lobe +46,-60,22,46,-57,23,2,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 19,Middle Temporal Gyrus,Occipital Lobe +53,-60,22,52,-57,23,2,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 40,Supramarginal Gyrus,Temporal Lobe +60,-60,22,59,-57,23,2,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 40,Supramarginal Gyrus,Temporal Lobe +-59,-53,22,-58,-50,23,2,Brodmann area 40,Supramarginal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe +-45,-53,22,-45,-50,23,5,Brodmann area 40,Inferior Parietal Lobule,Temporal Lobe,8,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-3,-53,22,-3,-50,23,1,Brodmann area 23,Posterior Cingulate,Limbic Lobe,4,Brodmann area 31,Posterior Cingulate,Limbic Lobe,5,Brodmann area 30,Posterior Cingulate,Limbic Lobe +4,-53,22,4,-50,23,1,Brodmann area 23,Posterior Cingulate,Limbic Lobe,4,Brodmann area 31,Posterior Cingulate,Limbic Lobe,5,Brodmann area 30,Posterior Cingulate,Limbic Lobe +46,-53,22,46,-50,23,4,Brodmann area 40,Inferior Parietal Lobule,Temporal Lobe,7,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe +53,-53,22,52,-50,23,4,Brodmann area 40,Inferior Parietal Lobule,Temporal Lobe,6,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe +60,-53,22,59,-50,23,2,Brodmann area 40,Supramarginal Gyrus,Temporal Lobe,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe +-66,-46,22,-65,-44,22,3,Brodmann area 40,Supramarginal Gyrus,Temporal Lobe,4,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,11,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe +-59,-46,22,-58,-44,22,2,Brodmann area 40,Supramarginal Gyrus,Temporal Lobe,5,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-52,-46,22,-51,-44,22,4,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe,4,Brodmann area 40,Inferior Parietal Lobule,Temporal Lobe,10,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-3,-46,22,-3,-44,22,3,Brodmann area 30,Posterior Cingulate,Limbic Lobe,4,Brodmann area 29,Posterior Cingulate,Limbic Lobe,6,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +4,-46,22,4,-44,22,3,Brodmann area 30,Posterior Cingulate,Limbic Lobe,4,Brodmann area 29,Posterior Cingulate,Limbic Lobe,6,Brodmann area 23,Posterior Cingulate,Limbic Lobe +46,-46,22,46,-44,22,3,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 40,Inferior Parietal Lobule,Temporal Lobe,12,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe +53,-46,22,52,-44,22,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +60,-46,22,59,-44,22,2,Brodmann area 40,Supramarginal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe +67,-46,22,66,-44,22,3,Brodmann area 40,Supramarginal Gyrus,Temporal Lobe,5,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,11,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-66,-39,22,-65,-37,22,2,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,4,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-59,-39,22,-58,-37,22,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe +-52,-39,22,-51,-37,22,5,Brodmann area 13,Insula,Sub-lobar,7,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe +-45,-39,22,-45,-37,22,3,Brodmann area 13,Insula,Sub-lobar,7,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe +-3,-39,22,-3,-37,22,5,Brodmann area 29,Posterior Cingulate,Limbic Lobe,6,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,8,Brodmann area 23,Cingulate Gyrus,Limbic Lobe +4,-39,22,4,-37,22,5,Brodmann area 29,Posterior Cingulate,Limbic Lobe,6,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,8,Brodmann area 23,Cingulate Gyrus,Limbic Lobe +53,-39,22,52,-37,22,4,Brodmann area 13,Insula,Sub-lobar,7,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,8,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +60,-39,22,59,-37,22,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,5,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe +67,-39,22,66,-37,22,3,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-66,-32,22,-65,-30,22,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,3,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-59,-32,22,-58,-30,22,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,4,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 13,Insula,Sub-lobar +-52,-32,22,-51,-30,22,2,Brodmann area 13,Insula,Sub-lobar,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,6,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe +46,-32,22,46,-30,22,4,Brodmann area 13,Insula,Sub-lobar,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,6,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe +53,-32,22,52,-30,22,2,Brodmann area 13,Insula,Sub-lobar,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,6,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe +60,-32,22,59,-30,22,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,4,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 13,Insula,Sub-lobar +67,-32,22,66,-30,22,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,4,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-66,-25,22,-65,-23,21,2,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 43,Postcentral Gyrus,Parietal Lobe +-59,-25,22,-58,-23,21,4,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,8,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-52,-25,22,-51,-23,21,4,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 13,Insula,Sub-lobar,8,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe +-45,-25,22,-45,-23,21,2,Brodmann area 13,Insula,Sub-lobar,6,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 40,Insula,Sub-lobar +-38,-25,22,-38,-23,21,3,Brodmann area 13,Insula,Sub-lobar,9,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe +39,-25,22,39,-23,21,3,Brodmann area 13,Insula,Sub-lobar,9,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe +46,-25,22,46,-23,21,1,Brodmann area 13,Insula,Sub-lobar,6,Brodmann area 29,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 40,Insula,Sub-lobar +53,-25,22,52,-23,21,4,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 13,Insula,Sub-lobar,8,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +60,-25,22,59,-23,21,4,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +67,-25,22,66,-23,21,2,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 43,Postcentral Gyrus,Parietal Lobe +-66,-18,22,-65,-16,21,2,Brodmann area 43,Postcentral Gyrus,Parietal Lobe,3,Brodmann area 1,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-59,-18,22,-58,-16,21,6,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 43,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +39,-18,22,39,-16,21,3,Brodmann area 13,Insula,Sub-lobar,11,Brodmann area 41,Transverse Temporal Gyrus,Temporal Lobe,12,Brodmann area 43,Postcentral Gyrus,Parietal Lobe +53,-18,22,52,-16,21,5,Brodmann area 43,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 40,Insula,Sub-lobar,8,Brodmann area 13,Insula,Sub-lobar +60,-18,22,59,-16,21,6,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 1,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 43,Postcentral Gyrus,Parietal Lobe +67,-18,22,66,-16,21,2,Brodmann area 43,Postcentral Gyrus,Parietal Lobe,3,Brodmann area 1,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-66,-11,22,-65,-10,21,2,Brodmann area 43,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +67,-11,22,66,-10,21,2,Brodmann area 43,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-59,-4,22,-58,-3,20,1,Brodmann area 4,Precentral Gyrus,Frontal Lobe,4,Brodmann area 43,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 6,Precentral Gyrus,Frontal Lobe +60,-4,22,59,-3,20,2,Brodmann area 4,Precentral Gyrus,Frontal Lobe,4,Brodmann area 43,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 6,Precentral Gyrus,Frontal Lobe +67,-4,22,66,-3,20,4,Brodmann area 6,Precentral Gyrus,Frontal Lobe,5,Brodmann area 4,Precentral Gyrus,Frontal Lobe,6,Brodmann area 43,Postcentral Gyrus,Parietal Lobe +-59,3,22,-58,4,20,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,3,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +-45,3,22,-45,4,20,6,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-59,10,22,-58,11,20,1,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +-52,10,22,-51,11,20,4,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +-45,10,22,-45,11,20,8,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 13,Insula,Sub-lobar,9,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe +46,10,22,46,11,20,8,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe +53,10,22,52,11,20,3,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +60,10,22,59,11,20,1,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +-52,17,22,-51,17,19,3,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +-45,17,22,-45,17,19,6,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +-3,17,22,-3,17,19,3,Brodmann area 33,Anterior Cingulate,Limbic Lobe,5,Brodmann area 24,Anterior Cingulate,Limbic Lobe,10,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,17,22,4,17,19,3,Brodmann area 33,Anterior Cingulate,Limbic Lobe,5,Brodmann area 24,Anterior Cingulate,Limbic Lobe,9,Brodmann area 32,Anterior Cingulate,Limbic Lobe +46,17,22,46,17,19,5,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +53,17,22,52,17,19,4,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +60,17,22,59,17,19,1,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,3,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +-52,24,22,-51,24,19,1,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +-45,24,22,-45,24,19,5,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +-3,24,22,-3,24,19,1,Brodmann area 24,Anterior Cingulate,Limbic Lobe,4,Brodmann area 33,Anterior Cingulate,Limbic Lobe,8,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,24,22,4,24,19,2,Brodmann area 24,Anterior Cingulate,Limbic Lobe,4,Brodmann area 33,Anterior Cingulate,Limbic Lobe,7,Brodmann area 32,Anterior Cingulate,Limbic Lobe +46,24,22,46,24,19,4,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +53,24,22,52,24,19,1,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +-52,31,22,-51,31,19,2,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,13,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +-10,31,22,-10,31,19,5,Brodmann area 32,Anterior Cingulate,Limbic Lobe,6,Brodmann area 24,Anterior Cingulate,Limbic Lobe,8,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +-3,31,22,-3,31,19,2,Brodmann area 24,Anterior Cingulate,Limbic Lobe,3,Brodmann area 32,Anterior Cingulate,Limbic Lobe,11,Brodmann area 33,Anterior Cingulate,Limbic Lobe +4,31,22,4,31,19,3,Brodmann area 24,Anterior Cingulate,Limbic Lobe,3,Brodmann area 32,Anterior Cingulate,Limbic Lobe,11,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +11,31,22,11,31,19,5,Brodmann area 32,Anterior Cingulate,Limbic Lobe,7,Brodmann area 24,Anterior Cingulate,Limbic Lobe,8,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +46,31,22,46,31,19,1,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,12,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +53,31,22,52,31,19,2,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,12,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +-45,38,22,-45,38,18,2,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-10,38,22,-10,38,18,2,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,3,Brodmann area 32,Anterior Cingulate,Limbic Lobe,7,Brodmann area 24,Anterior Cingulate,Limbic Lobe +-3,38,22,-3,38,18,2,Brodmann area 32,Anterior Cingulate,Limbic Lobe,6,Brodmann area 24,Anterior Cingulate,Limbic Lobe,6,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +4,38,22,4,38,18,2,Brodmann area 32,Anterior Cingulate,Limbic Lobe,5,Brodmann area 24,Anterior Cingulate,Limbic Lobe,6,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +11,38,22,11,38,18,2,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,2,Brodmann area 32,Anterior Cingulate,Limbic Lobe,8,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe +46,38,22,46,38,18,3,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-45,45,22,-45,45,18,3,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-38,45,22,-38,45,18,5,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-31,45,22,-31,45,18,6,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-24,45,22,-24,45,18,4,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-10,45,22,-10,45,18,5,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-3,45,22,-3,45,18,2,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,45,22,4,45,18,2,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 32,Anterior Cingulate,Limbic Lobe +11,45,22,11,45,18,5,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 32,Anterior Cingulate,Limbic Lobe +25,45,22,25,45,18,5,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,11,Brodmann area 32,Anterior Cingulate,Limbic Lobe +32,45,22,32,45,18,5,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +39,45,22,39,45,18,4,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +46,45,22,46,45,18,3,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-38,52,22,-38,51,18,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,5,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-31,52,22,-31,51,18,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,12,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-24,52,22,-24,51,18,3,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,15,Brodmann area 42,Anterior Cingulate,Limbic Lobe +-3,52,22,-3,51,18,2,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,11,Brodmann area 32,Anterior Cingulate,Limbic Lobe +4,52,22,4,51,18,2,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,11,Brodmann area 32,Anterior Cingulate,Limbic Lobe +25,52,22,25,51,18,3,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,15,Brodmann area 42,Anterior Cingulate,Limbic Lobe +32,52,22,32,51,18,5,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +39,52,22,39,51,18,3,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,4,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-24,59,22,-24,58,17,1,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 42,Anterior Cingulate,Limbic Lobe +-17,59,22,-17,58,17,5,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 42,Anterior Cingulate,Limbic Lobe +-3,59,22,-3,58,17,1,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,15,Brodmann area 42,Anterior Cingulate,Limbic Lobe +4,59,22,4,58,17,1,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,15,Brodmann area 42,Anterior Cingulate,Limbic Lobe +18,59,22,18,58,17,5,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 42,Anterior Cingulate,Limbic Lobe +25,59,22,25,58,17,1,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,12,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,19,Brodmann area 42,Anterior Cingulate,Limbic Lobe +-10,66,22,-10,65,17,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,22,Brodmann area 42,Anterior Cingulate,Limbic Lobe +11,66,22,11,65,17,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,22,Brodmann area 42,Anterior Cingulate,Limbic Lobe +18,66,22,18,65,17,1,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,23,Brodmann area 42,Anterior Cingulate,Limbic Lobe +-31,-88,29,-31,-84,31,3,Brodmann area 19,Superior Occipital Gyrus,Occipital Lobe,10,Brodmann area 31,Precuneus,Occipital Lobe,13,Brodmann area 7,Cuneus,Occipital Lobe +-24,-88,29,-24,-84,31,4,Brodmann area 19,Cuneus,Occipital Lobe,7,Brodmann area 31,Precuneus,Occipital Lobe,7,Brodmann area 7,Cuneus,Occipital Lobe +-17,-88,29,-17,-84,31,4,Brodmann area 19,Cuneus,Occipital Lobe,4,Brodmann area 18,Cuneus,Occipital Lobe,7,Brodmann area 7,Cuneus,Occipital Lobe +-3,-88,29,-3,-84,31,3,Brodmann area 19,Cuneus,Occipital Lobe,7,Brodmann area 18,Cuneus,Occipital Lobe,12,Brodmann area 7,Precuneus,Parietal Lobe +25,-88,29,25,-84,31,3,Brodmann area 19,Cuneus,Occipital Lobe,7,Brodmann area 31,Precuneus,Occipital Lobe,8,Brodmann area 7,Cuneus,Occipital Lobe +32,-88,29,32,-84,31,3,Brodmann area 19,Superior Occipital Gyrus,Occipital Lobe,11,Brodmann area 31,Precuneus,Occipital Lobe,13,Brodmann area 39,Angular Gyrus,Temporal Lobe +-45,-81,29,-45,-77,31,4,Brodmann area 19,Superior Occipital Gyrus,Occipital Lobe,4,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,18,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe +-24,-81,29,-24,-77,31,3,Brodmann area 31,Precuneus,Occipital Lobe,4,Brodmann area 7,Cuneus,Occipital Lobe,5,Brodmann area 19,Precuneus,Parietal Lobe +-3,-81,29,-3,-77,31,2,Brodmann area 19,Cuneus,Occipital Lobe,3,Brodmann area 18,Cuneus,Occipital Lobe,6,Brodmann area 7,Cuneus,Occipital Lobe +4,-81,29,4,-77,31,2,Brodmann area 19,Cuneus,Occipital Lobe,3,Brodmann area 18,Cuneus,Occipital Lobe,6,Brodmann area 7,Precuneus,Parietal Lobe +32,-81,29,32,-77,31,4,Brodmann area 19,Cuneus,Occipital Lobe,9,Brodmann area 39,Angular Gyrus,Temporal Lobe,10,Brodmann area 31,Precuneus,Occipital Lobe +39,-81,29,39,-77,31,2,Brodmann area 19,Superior Occipital Gyrus,Occipital Lobe,3,Brodmann area 39,Angular Gyrus,Temporal Lobe,16,Brodmann area 31,Precuneus,Occipital Lobe +-52,-74,29,-51,-70,30,2,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,11,Brodmann area 19,Superior Occipital Gyrus,Occipital Lobe,13,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe +-45,-74,29,-45,-70,30,3,Brodmann area 39,Angular Gyrus,Temporal Lobe,8,Brodmann area 19,Superior Occipital Gyrus,Occipital Lobe,15,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe +-24,-74,29,-24,-70,30,5,Brodmann area 19,Precuneus,Parietal Lobe,6,Brodmann area 7,Precuneus,Parietal Lobe,8,Brodmann area 31,Precuneus,Occipital Lobe +-10,-74,29,-10,-70,30,3,Brodmann area 31,Precuneus,Occipital Lobe,4,Brodmann area 18,Cuneus,Occipital Lobe,4,Brodmann area 7,Cuneus,Occipital Lobe +-3,-74,29,-3,-70,30,2,Brodmann area 31,Precuneus,Occipital Lobe,2,Brodmann area 7,Cuneus,Occipital Lobe,6,Brodmann area 18,Cuneus,Occipital Lobe +4,-74,29,4,-70,30,2,Brodmann area 31,Precuneus,Occipital Lobe,2,Brodmann area 7,Cuneus,Occipital Lobe,6,Brodmann area 18,Cuneus,Occipital Lobe +11,-74,29,11,-70,30,2,Brodmann area 31,Precuneus,Occipital Lobe,3,Brodmann area 7,Cuneus,Occipital Lobe,4,Brodmann area 18,Cuneus,Occipital Lobe +18,-74,29,18,-70,30,5,Brodmann area 31,Precuneus,Occipital Lobe,6,Brodmann area 7,Cuneus,Occipital Lobe,7,Brodmann area 18,Cuneus,Occipital Lobe +32,-74,29,32,-70,30,6,Brodmann area 19,Precuneus,Parietal Lobe,8,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,10,Brodmann area 7,Precuneus,Parietal Lobe +46,-74,29,46,-70,30,2,Brodmann area 39,Angular Gyrus,Temporal Lobe,8,Brodmann area 19,Superior Occipital Gyrus,Occipital Lobe,15,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe +-52,-67,29,-51,-64,30,4,Brodmann area 39,Angular Gyrus,Parietal Lobe,8,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,14,Brodmann area 19,Middle Temporal Gyrus,Temporal Lobe +-45,-67,29,-45,-64,30,3,Brodmann area 39,Angular Gyrus,Parietal Lobe,11,Brodmann area 19,Precuneus,Parietal Lobe,12,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe +-10,-67,29,-10,-64,30,4,Brodmann area 31,Precuneus,Occipital Lobe,5,Brodmann area 7,Precuneus,Occipital Lobe,9,Brodmann area 18,Cuneus,Occipital Lobe +-3,-67,29,-3,-64,30,2,Brodmann area 7,Cuneus,Occipital Lobe,2,Brodmann area 31,Precuneus,Occipital Lobe,10,Brodmann area 23,Precuneus,Occipital Lobe +4,-67,29,4,-64,30,2,Brodmann area 7,Cuneus,Occipital Lobe,3,Brodmann area 31,Precuneus,Occipital Lobe,10,Brodmann area 23,Precuneus,Occipital Lobe +11,-67,29,11,-64,30,3,Brodmann area 31,Precuneus,Occipital Lobe,4,Brodmann area 7,Precuneus,Occipital Lobe,9,Brodmann area 18,Cuneus,Occipital Lobe +18,-67,29,18,-64,30,4,Brodmann area 7,Precuneus,Parietal Lobe,5,Brodmann area 31,Precuneus,Occipital Lobe,11,Brodmann area 18,Cuneus,Occipital Lobe +32,-67,29,32,-64,30,5,Brodmann area 39,Middle Temporal Gyrus,Temporal Lobe,9,Brodmann area 19,Precuneus,Parietal Lobe,10,Brodmann area 7,Precuneus,Parietal Lobe +46,-67,29,46,-64,30,3,Brodmann area 39,Angular Gyrus,Parietal Lobe,11,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,12,Brodmann area 19,Precuneus,Parietal Lobe +53,-67,29,52,-64,30,3,Brodmann area 39,Angular Gyrus,Parietal Lobe,7,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,14,Brodmann area 19,Middle Temporal Gyrus,Temporal Lobe +-59,-60,29,-58,-57,30,2,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,10,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-52,-60,29,-51,-57,30,4,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,7,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,13,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-45,-60,29,-45,-57,30,3,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,11,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,13,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-3,-60,29,-3,-57,30,2,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,2,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 23,Posterior Cingulate,Limbic Lobe +4,-60,29,4,-57,30,2,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,3,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 23,Posterior Cingulate,Limbic Lobe +11,-60,29,11,-57,30,2,Brodmann area 31,Precuneus,Occipital Lobe,5,Brodmann area 7,Precuneus,Parietal Lobe,12,Brodmann area 23,Posterior Cingulate,Limbic Lobe +46,-60,29,46,-57,30,2,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,13,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +53,-60,29,52,-57,30,4,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,6,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,12,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +60,-60,29,59,-57,30,2,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,3,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,10,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-59,-53,29,-58,-50,29,3,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,6,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-52,-53,29,-51,-50,29,4,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,8,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,12,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe +-10,-53,29,-10,-50,29,4,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,8,Brodmann area 23,Posterior Cingulate,Limbic Lobe,9,Brodmann area 7,Precuneus,Parietal Lobe +-3,-53,29,-3,-50,29,3,Brodmann area 31,Precuneus,Parietal Lobe,5,Brodmann area 23,Posterior Cingulate,Limbic Lobe,6,Brodmann area 7,Precuneus,Parietal Lobe +4,-53,29,4,-50,29,3,Brodmann area 31,Precuneus,Parietal Lobe,5,Brodmann area 23,Posterior Cingulate,Limbic Lobe,6,Brodmann area 7,Precuneus,Parietal Lobe +53,-53,29,52,-50,29,3,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,8,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,13,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe +60,-53,29,59,-50,29,3,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,6,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-59,-46,29,-58,-43,29,1,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,10,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-3,-46,29,-3,-43,29,2,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 23,Posterior Cingulate,Limbic Lobe,9,Brodmann area 29,Posterior Cingulate,Limbic Lobe +4,-46,29,4,-43,29,2,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 23,Posterior Cingulate,Limbic Lobe,9,Brodmann area 29,Posterior Cingulate,Limbic Lobe +53,-46,29,52,-43,29,2,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,10,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe,13,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +60,-46,29,59,-43,29,2,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,10,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe +-66,-39,29,-65,-36,29,1,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-59,-39,29,-58,-36,29,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,10,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-52,-39,29,-51,-36,29,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,10,Brodmann area 13,Insula,Sub-lobar,10,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-3,-39,29,-3,-36,29,1,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 29,Posterior Cingulate,Limbic Lobe +4,-39,29,4,-36,29,1,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 29,Posterior Cingulate,Limbic Lobe +53,-39,29,52,-36,29,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 13,Insula,Sub-lobar,10,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +60,-39,29,59,-36,29,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +67,-39,29,66,-36,29,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe +-66,-32,29,-65,-30,28,1,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,8,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-59,-32,29,-58,-30,28,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-3,-32,29,-3,-30,28,1,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,12,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +4,-32,29,4,-30,28,1,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,12,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +60,-32,29,59,-30,28,1,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,9,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +67,-32,29,66,-30,28,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 42,Superior Temporal Gyrus,Temporal Lobe,10,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-66,-25,29,-65,-23,28,1,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-59,-25,29,-58,-23,28,1,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-3,-25,29,-3,-23,28,2,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,7,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,8,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +4,-25,29,4,-23,28,2,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,7,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,8,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +60,-25,29,59,-23,28,1,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +67,-25,29,66,-23,28,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-66,-18,29,-65,-16,28,1,Brodmann area 1,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-59,-18,29,-58,-16,28,4,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 4,Precentral Gyrus,Frontal Lobe +-3,-18,29,-3,-16,28,3,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,7,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,11,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +4,-18,29,4,-16,28,3,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,7,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,11,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +60,-18,29,59,-16,28,4,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +67,-18,29,66,-16,28,2,Brodmann area 1,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-66,-11,29,-65,-9,27,5,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 4,Precentral Gyrus,Frontal Lobe,5,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-59,-11,29,-58,-9,27,2,Brodmann area 4,Precentral Gyrus,Frontal Lobe,4,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-3,-11,29,-3,-9,27,2,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,18,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +4,-11,29,4,-9,27,2,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,18,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +60,-11,29,59,-9,27,2,Brodmann area 4,Precentral Gyrus,Frontal Lobe,4,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 6,Precentral Gyrus,Frontal Lobe +67,-11,29,66,-9,27,5,Brodmann area 6,Precentral Gyrus,Frontal Lobe,6,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 4,Precentral Gyrus,Frontal Lobe +-59,-4,29,-58,-3,27,5,Brodmann area 6,Precentral Gyrus,Frontal Lobe,5,Brodmann area 4,Precentral Gyrus,Frontal Lobe,8,Brodmann area 43,Postcentral Gyrus,Parietal Lobe +-52,-4,29,-51,-3,27,4,Brodmann area 6,Precentral Gyrus,Frontal Lobe,5,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe +-3,-4,29,-3,-3,27,4,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,15,Brodmann area 33,Anterior Cingulate,Limbic Lobe +4,-4,29,4,-3,27,4,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,15,Brodmann area 33,Anterior Cingulate,Limbic Lobe +60,-4,29,59,-3,27,5,Brodmann area 4,Precentral Gyrus,Frontal Lobe,5,Brodmann area 6,Precentral Gyrus,Frontal Lobe,8,Brodmann area 43,Postcentral Gyrus,Parietal Lobe +-59,3,29,-58,4,27,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,4,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe +-45,3,29,-45,4,27,1,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 6,Precentral Gyrus,Frontal Lobe,10,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe +-38,3,29,-38,4,27,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,2,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,11,Brodmann area 13,Insula,Sub-lobar +-3,3,29,-3,4,27,1,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 33,Anterior Cingulate,Limbic Lobe,12,Brodmann area 32,Cingulate Gyrus,Frontal Lobe +4,3,29,4,4,27,2,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 33,Anterior Cingulate,Limbic Lobe,11,Brodmann area 32,Cingulate Gyrus,Frontal Lobe +39,3,29,39,4,27,1,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,11,Brodmann area 13,Insula,Sub-lobar +46,3,29,46,4,27,2,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 6,Precentral Gyrus,Frontal Lobe,9,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe +60,3,29,59,4,27,1,Brodmann area 6,Precentral Gyrus,Frontal Lobe,5,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe +-52,10,29,-51,11,26,3,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe +-45,10,29,-45,11,26,2,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-38,10,29,-38,11,26,6,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 6,Precentral Gyrus,Frontal Lobe,12,Brodmann area 13,Insula,Sub-lobar +-3,10,29,-3,11,26,2,Brodmann area 33,Anterior Cingulate,Limbic Lobe,5,Brodmann area 24,Anterior Cingulate,Limbic Lobe,8,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +4,10,29,4,11,26,2,Brodmann area 33,Anterior Cingulate,Limbic Lobe,5,Brodmann area 24,Anterior Cingulate,Limbic Lobe,9,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +39,10,29,39,11,26,5,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 6,Precentral Gyrus,Frontal Lobe,12,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +46,10,29,46,11,26,3,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 6,Precentral Gyrus,Frontal Lobe +53,10,29,52,11,26,3,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 44,Inferior Frontal Gyrus,Frontal Lobe +60,10,29,59,11,26,3,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-52,17,29,-51,18,26,3,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,5,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe +-45,17,29,-45,18,26,3,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,10,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe +-38,17,29,-38,18,26,6,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,14,Brodmann area 13,Insula,Sub-lobar +-10,17,29,-10,18,26,2,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 33,Anterior Cingulate,Limbic Lobe +-3,17,29,-3,18,26,2,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 33,Anterior Cingulate,Limbic Lobe +4,17,29,4,18,26,2,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,3,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 33,Anterior Cingulate,Limbic Lobe +39,17,29,39,18,26,6,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,14,Brodmann area 13,Insula,Sub-lobar +46,17,29,46,18,26,3,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,10,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe +53,17,29,52,18,26,3,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe +-52,24,29,-51,25,25,1,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-45,24,29,-45,25,25,5,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +-10,24,29,-10,25,25,2,Brodmann area 32,Anterior Cingulate,Limbic Lobe,4,Brodmann area 24,Anterior Cingulate,Limbic Lobe,7,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +-3,24,29,-3,25,25,1,Brodmann area 24,Anterior Cingulate,Limbic Lobe,3,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,7,Brodmann area 33,Anterior Cingulate,Limbic Lobe +4,24,29,4,25,25,1,Brodmann area 24,Anterior Cingulate,Limbic Lobe,3,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,7,Brodmann area 33,Anterior Cingulate,Limbic Lobe +11,24,29,11,25,25,3,Brodmann area 32,Anterior Cingulate,Limbic Lobe,5,Brodmann area 24,Anterior Cingulate,Limbic Lobe,7,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +53,24,29,52,25,25,2,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,6,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-45,31,29,-45,31,25,5,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe +-10,31,29,-10,31,25,5,Brodmann area 32,Anterior Cingulate,Limbic Lobe,6,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 24,Anterior Cingulate,Limbic Lobe +-3,31,29,-3,31,25,4,Brodmann area 32,Anterior Cingulate,Limbic Lobe,5,Brodmann area 24,Anterior Cingulate,Limbic Lobe,7,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +4,31,29,4,31,25,3,Brodmann area 32,Anterior Cingulate,Limbic Lobe,6,Brodmann area 24,Anterior Cingulate,Limbic Lobe,7,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +11,31,29,11,31,25,4,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 24,Anterior Cingulate,Limbic Lobe +53,31,29,52,31,25,4,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 45,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-45,38,29,-45,38,25,5,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-38,38,29,-38,38,25,7,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe +-31,38,29,-31,38,25,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-24,38,29,-24,38,25,6,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-10,38,29,-10,38,25,2,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,2,Brodmann area 32,Anterior Cingulate,Limbic Lobe,11,Brodmann area 24,Anterior Cingulate,Limbic Lobe +-3,38,29,-3,38,25,2,Brodmann area 32,Anterior Cingulate,Limbic Lobe,3,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +4,38,29,4,38,25,2,Brodmann area 32,Anterior Cingulate,Limbic Lobe,3,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +32,38,29,32,38,25,5,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +46,38,29,46,38,25,5,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +-38,45,29,-38,45,24,0,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-31,45,29,-31,45,24,1,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-24,45,29,-24,45,24,1,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-3,45,29,-3,45,24,4,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 32,Anterior Cingulate,Limbic Lobe,11,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +4,45,29,4,45,24,4,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 32,Anterior Cingulate,Limbic Lobe,11,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +25,45,29,25,45,24,2,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,7,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 32,Anterior Cingulate,Limbic Lobe +32,45,29,32,45,24,1,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +39,45,29,39,45,24,1,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-31,52,29,-31,52,24,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,14,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-24,52,29,-24,52,24,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,7,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +-17,52,29,-17,52,24,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Anterior Cingulate,Limbic Lobe +-3,52,29,-3,52,24,3,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,13,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +4,52,29,4,52,24,3,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,13,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +18,52,29,18,52,24,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Anterior Cingulate,Limbic Lobe +25,52,29,25,52,24,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +32,52,29,32,52,24,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,4,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-17,59,29,-17,58,24,3,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +-10,59,29,-10,58,24,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +-3,59,29,-3,58,24,2,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,4,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,16,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +4,59,29,4,58,24,2,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,4,Brodmann area 10,Medial Frontal Gyrus,Frontal Lobe,16,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +11,59,29,11,58,24,4,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +18,59,29,18,58,24,2,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +25,59,29,25,58,24,2,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +-31,-88,36,-31,-84,37,5,Brodmann area 19,Precuneus,Parietal Lobe,13,Brodmann area 31,Precuneus,Occipital Lobe,13,Brodmann area 7,Cuneus,Occipital Lobe +-24,-88,36,-24,-84,37,5,Brodmann area 19,Precuneus,Parietal Lobe,9,Brodmann area 7,Cuneus,Occipital Lobe,11,Brodmann area 31,Precuneus,Occipital Lobe +-17,-88,36,-17,-84,37,4,Brodmann area 19,Precuneus,Parietal Lobe,8,Brodmann area 7,Precuneus,Parietal Lobe,10,Brodmann area 18,Cuneus,Occipital Lobe +-10,-88,36,-10,-84,37,3,Brodmann area 19,Precuneus,Parietal Lobe,9,Brodmann area 7,Precuneus,Parietal Lobe,10,Brodmann area 18,Cuneus,Occipital Lobe +-3,-88,36,-3,-84,37,6,Brodmann area 19,Precuneus,Parietal Lobe,9,Brodmann area 7,Precuneus,Parietal Lobe,11,Brodmann area 18,Cuneus,Occipital Lobe +11,-88,36,11,-84,37,3,Brodmann area 19,Precuneus,Parietal Lobe,9,Brodmann area 7,Precuneus,Parietal Lobe,10,Brodmann area 18,Cuneus,Occipital Lobe +18,-88,36,18,-84,37,4,Brodmann area 19,Precuneus,Parietal Lobe,8,Brodmann area 7,Cuneus,Occipital Lobe,9,Brodmann area 18,Cuneus,Occipital Lobe +25,-88,36,25,-84,37,5,Brodmann area 19,Precuneus,Parietal Lobe,9,Brodmann area 7,Cuneus,Occipital Lobe,11,Brodmann area 31,Precuneus,Occipital Lobe +-38,-81,36,-38,-77,37,5,Brodmann area 19,Precuneus,Parietal Lobe,6,Brodmann area 39,Angular Gyrus,Temporal Lobe,12,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe +-31,-81,36,-31,-77,37,3,Brodmann area 19,Precuneus,Parietal Lobe,9,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,11,Brodmann area 39,Angular Gyrus,Temporal Lobe +-24,-81,36,-24,-77,37,3,Brodmann area 19,Precuneus,Parietal Lobe,6,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 31,Precuneus,Occipital Lobe +-10,-81,36,-10,-77,37,3,Brodmann area 19,Precuneus,Parietal Lobe,3,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 18,Cuneus,Occipital Lobe +-3,-81,36,-3,-77,37,3,Brodmann area 7,Precuneus,Parietal Lobe,5,Brodmann area 19,Precuneus,Parietal Lobe,9,Brodmann area 18,Cuneus,Occipital Lobe +4,-81,36,4,-77,37,3,Brodmann area 7,Precuneus,Parietal Lobe,5,Brodmann area 19,Precuneus,Parietal Lobe,9,Brodmann area 18,Cuneus,Occipital Lobe +11,-81,36,11,-77,37,3,Brodmann area 7,Precuneus,Parietal Lobe,3,Brodmann area 19,Precuneus,Parietal Lobe,9,Brodmann area 18,Cuneus,Occipital Lobe +39,-81,36,39,-77,37,5,Brodmann area 19,Precuneus,Parietal Lobe,6,Brodmann area 39,Angular Gyrus,Temporal Lobe,12,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe +-45,-74,36,-45,-70,37,2,Brodmann area 39,Precuneus,Parietal Lobe,5,Brodmann area 19,Precuneus,Parietal Lobe,10,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe +-38,-74,36,-38,-70,37,4,Brodmann area 19,Precuneus,Parietal Lobe,5,Brodmann area 39,Precuneus,Parietal Lobe,8,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe +-24,-74,36,-24,-70,37,3,Brodmann area 19,Precuneus,Parietal Lobe,3,Brodmann area 7,Precuneus,Parietal Lobe,12,Brodmann area 31,Precuneus,Occipital Lobe +-10,-74,36,-10,-70,37,4,Brodmann area 7,Precuneus,Parietal Lobe,8,Brodmann area 19,Cuneus,Occipital Lobe,9,Brodmann area 31,Precuneus,Occipital Lobe +-3,-74,36,-3,-70,37,2,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 31,Precuneus,Occipital Lobe,10,Brodmann area 19,Cuneus,Occipital Lobe +4,-74,36,4,-70,37,2,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 31,Precuneus,Occipital Lobe,9,Brodmann area 19,Cuneus,Occipital Lobe +11,-74,36,11,-70,37,3,Brodmann area 7,Precuneus,Parietal Lobe,8,Brodmann area 19,Cuneus,Occipital Lobe,9,Brodmann area 31,Precuneus,Occipital Lobe +18,-74,36,18,-70,37,4,Brodmann area 7,Precuneus,Parietal Lobe,7,Brodmann area 19,Precuneus,Parietal Lobe,10,Brodmann area 31,Precuneus,Occipital Lobe +32,-74,36,32,-70,37,3,Brodmann area 19,Precuneus,Parietal Lobe,8,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 7,Precuneus,Parietal Lobe +46,-74,36,46,-70,37,2,Brodmann area 39,Angular Gyrus,Parietal Lobe,6,Brodmann area 19,Precuneus,Parietal Lobe,11,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe +-52,-67,36,-51,-63,36,2,Brodmann area 39,Angular Gyrus,Parietal Lobe,6,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,13,Brodmann area 19,Precuneus,Parietal Lobe +-45,-67,36,-45,-63,36,3,Brodmann area 39,Angular Gyrus,Parietal Lobe,6,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,10,Brodmann area 19,Precuneus,Parietal Lobe +-24,-67,36,-24,-63,36,3,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 19,Precuneus,Parietal Lobe,10,Brodmann area 39,Angular Gyrus,Parietal Lobe +-3,-67,36,-3,-63,36,1,Brodmann area 7,Precuneus,Parietal Lobe,8,Brodmann area 31,Precuneus,Occipital Lobe,15,Brodmann area 18,Cuneus,Occipital Lobe +4,-67,36,4,-63,36,1,Brodmann area 7,Precuneus,Parietal Lobe,8,Brodmann area 31,Precuneus,Occipital Lobe,15,Brodmann area 18,Cuneus,Occipital Lobe +11,-67,36,11,-63,36,1,Brodmann area 7,Precuneus,Parietal Lobe,8,Brodmann area 31,Precuneus,Occipital Lobe,13,Brodmann area 18,Cuneus,Occipital Lobe +32,-67,36,32,-63,36,3,Brodmann area 39,Angular Gyrus,Parietal Lobe,4,Brodmann area 19,Precuneus,Parietal Lobe,9,Brodmann area 7,Precuneus,Parietal Lobe +46,-67,36,46,-63,36,4,Brodmann area 39,Angular Gyrus,Parietal Lobe,6,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,10,Brodmann area 19,Precuneus,Parietal Lobe +53,-67,36,52,-63,36,2,Brodmann area 39,Angular Gyrus,Parietal Lobe,7,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,14,Brodmann area 19,Precuneus,Parietal Lobe +-59,-60,36,-58,-56,36,1,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,4,Brodmann area 39,Angular Gyrus,Parietal Lobe,16,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-52,-60,36,-51,-56,36,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,6,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,16,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe +-45,-60,36,-45,-56,36,6,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,7,Brodmann area 39,Angular Gyrus,Parietal Lobe,13,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe +-10,-60,36,-10,-56,36,5,Brodmann area 7,Precuneus,Parietal Lobe,5,Brodmann area 31,Precuneus,Parietal Lobe,15,Brodmann area 23,Posterior Cingulate,Limbic Lobe +-3,-60,36,-3,-56,36,2,Brodmann area 7,Precuneus,Parietal Lobe,6,Brodmann area 31,Precuneus,Parietal Lobe,13,Brodmann area 23,Posterior Cingulate,Limbic Lobe +4,-60,36,4,-56,36,2,Brodmann area 7,Precuneus,Parietal Lobe,6,Brodmann area 31,Precuneus,Parietal Lobe,13,Brodmann area 23,Posterior Cingulate,Limbic Lobe +46,-60,36,46,-56,36,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,7,Brodmann area 39,Angular Gyrus,Parietal Lobe,14,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe +53,-60,36,52,-56,36,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,6,Brodmann area 39,Angular Gyrus,Parietal Lobe,17,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe +60,-60,36,59,-56,36,2,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,5,Brodmann area 39,Angular Gyrus,Parietal Lobe,16,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-59,-53,36,-58,-50,36,2,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,10,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,17,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-52,-53,36,-51,-50,36,4,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,12,Brodmann area 39,Angular Gyrus,Parietal Lobe,18,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe +-10,-53,36,-10,-50,36,4,Brodmann area 7,Precuneus,Parietal Lobe,5,Brodmann area 31,Precuneus,Parietal Lobe,13,Brodmann area 23,Posterior Cingulate,Limbic Lobe +-3,-53,36,-3,-50,36,1,Brodmann area 7,Precuneus,Parietal Lobe,3,Brodmann area 31,Precuneus,Parietal Lobe,12,Brodmann area 23,Posterior Cingulate,Limbic Lobe +4,-53,36,4,-50,36,2,Brodmann area 7,Precuneus,Parietal Lobe,3,Brodmann area 31,Precuneus,Parietal Lobe,12,Brodmann area 23,Posterior Cingulate,Limbic Lobe +11,-53,36,11,-50,36,4,Brodmann area 7,Precuneus,Parietal Lobe,5,Brodmann area 31,Precuneus,Parietal Lobe,14,Brodmann area 23,Posterior Cingulate,Limbic Lobe +53,-53,36,52,-50,36,4,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,11,Brodmann area 39,Angular Gyrus,Parietal Lobe,18,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe +60,-53,36,59,-50,36,2,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,10,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,16,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-59,-46,36,-58,-43,35,4,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,15,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,15,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe +-10,-46,36,-10,-43,35,2,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,7,Brodmann area 7,Precuneus,Parietal Lobe,14,Brodmann area 23,Posterior Cingulate,Limbic Lobe +-3,-46,36,-3,-43,35,1,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,8,Brodmann area 7,Precuneus,Parietal Lobe,13,Brodmann area 23,Cingulate Gyrus,Limbic Lobe +4,-46,36,4,-43,35,1,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,8,Brodmann area 7,Precuneus,Parietal Lobe,13,Brodmann area 23,Posterior Cingulate,Limbic Lobe +11,-46,36,11,-43,35,1,Brodmann area 31,Precuneus,Parietal Lobe,6,Brodmann area 7,Precuneus,Parietal Lobe,15,Brodmann area 23,Posterior Cingulate,Limbic Lobe +53,-46,36,52,-43,35,7,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,15,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,15,Brodmann area 13,Superior Temporal Gyrus,Temporal Lobe +60,-46,36,59,-43,35,3,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,15,Brodmann area 39,Superior Temporal Gyrus,Temporal Lobe,16,Brodmann area 22,Superior Temporal Gyrus,Temporal Lobe +-59,-39,36,-58,-36,35,3,Brodmann area 40,Supramarginal Gyrus,Parietal Lobe,10,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,12,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-10,-39,36,-10,-36,35,4,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,12,Brodmann area 7,Precuneus,Parietal Lobe +-3,-39,36,-3,-36,35,2,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,8,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 7,Precuneus,Parietal Lobe +4,-39,36,4,-36,35,2,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,8,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 7,Precuneus,Parietal Lobe +11,-39,36,11,-36,35,4,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,11,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,11,Brodmann area 7,Precuneus,Parietal Lobe +53,-39,36,52,-36,35,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,8,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,13,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +60,-39,36,59,-36,35,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,10,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,12,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +67,-39,36,66,-36,35,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,13,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,14,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-66,-32,36,-65,-29,35,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,6,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-59,-32,36,-58,-29,35,0,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,4,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-3,-32,36,-3,-29,35,2,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +4,-32,36,4,-29,35,2,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +67,-32,36,66,-29,35,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,7,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-66,-25,36,-65,-23,34,2,Brodmann area 1,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-59,-25,36,-58,-23,34,2,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-45,-25,36,-45,-23,34,4,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe +-3,-25,36,-3,-23,34,2,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,3,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 23,Cingulate Gyrus,Limbic Lobe +4,-25,36,4,-23,34,2,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,3,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 23,Cingulate Gyrus,Limbic Lobe +60,-25,36,59,-23,34,2,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,4,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +67,-25,36,66,-23,34,3,Brodmann area 1,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,6,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-59,-18,36,-58,-16,34,1,Brodmann area 4,Precentral Gyrus,Frontal Lobe,2,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-52,-18,36,-51,-16,34,6,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 4,Precentral Gyrus,Frontal Lobe,7,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-45,-18,36,-45,-16,34,6,Brodmann area 4,Precentral Gyrus,Frontal Lobe,7,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-3,-18,36,-3,-16,34,1,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,3,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +4,-18,36,4,-16,34,2,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,3,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +53,-18,36,52,-16,34,5,Brodmann area 4,Precentral Gyrus,Frontal Lobe,5,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +60,-18,36,59,-16,34,2,Brodmann area 4,Precentral Gyrus,Frontal Lobe,2,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +67,-18,36,66,-16,34,4,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 1,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 4,Precentral Gyrus,Frontal Lobe +-59,-11,36,-58,-9,34,4,Brodmann area 4,Precentral Gyrus,Frontal Lobe,5,Brodmann area 6,Precentral Gyrus,Frontal Lobe,7,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-3,-11,36,-3,-9,34,2,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,12,Brodmann area 31,Paracentral Lobule,Frontal Lobe +4,-11,36,4,-9,34,2,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,5,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,11,Brodmann area 31,Paracentral Lobule,Frontal Lobe +46,-11,36,46,-9,34,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,8,Brodmann area 4,Precentral Gyrus,Frontal Lobe,11,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +53,-11,36,52,-9,34,5,Brodmann area 4,Precentral Gyrus,Frontal Lobe,5,Brodmann area 6,Precentral Gyrus,Frontal Lobe,9,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-59,-4,36,-58,-2,33,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,9,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,10,Brodmann area 4,Precentral Gyrus,Frontal Lobe +-52,-4,36,-51,-2,33,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,9,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,11,Brodmann area 4,Precentral Gyrus,Frontal Lobe +-3,-4,36,-3,-2,33,2,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,11,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,13,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +4,-4,36,4,-2,33,2,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,11,Brodmann area 23,Cingulate Gyrus,Limbic Lobe,13,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +60,-4,36,59,-2,33,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,9,Brodmann area 4,Precentral Gyrus,Frontal Lobe,10,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe +-59,3,36,-58,5,33,1,Brodmann area 6,Precentral Gyrus,Frontal Lobe,5,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +-52,3,36,-51,5,33,3,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 6,Precentral Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +-45,3,36,-45,5,33,2,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,3,Brodmann area 6,Precentral Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +-38,3,36,-38,5,33,4,Brodmann area 9,Precentral Gyrus,Frontal Lobe,5,Brodmann area 6,Precentral Gyrus,Frontal Lobe,12,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +-3,3,36,-3,5,33,3,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,8,Brodmann area 32,Cingulate Gyrus,Frontal Lobe,11,Brodmann area 33,Anterior Cingulate,Limbic Lobe +4,3,36,4,5,33,3,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,8,Brodmann area 32,Cingulate Gyrus,Frontal Lobe,11,Brodmann area 33,Anterior Cingulate,Limbic Lobe +39,3,36,39,5,33,3,Brodmann area 9,Precentral Gyrus,Frontal Lobe,5,Brodmann area 6,Precentral Gyrus,Frontal Lobe,11,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +46,3,36,46,5,33,1,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,3,Brodmann area 6,Precentral Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +53,3,36,52,5,33,3,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,4,Brodmann area 6,Precentral Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +60,3,36,59,5,33,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,5,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,10,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +-52,10,36,-51,11,33,1,Brodmann area 9,Inferior Frontal Gyrus,Frontal Lobe,7,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-45,10,36,-45,11,33,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-10,10,36,-10,11,33,2,Brodmann area 32,Cingulate Gyrus,Frontal Lobe,4,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,11,Brodmann area 33,Anterior Cingulate,Limbic Lobe +-3,10,36,-3,11,33,1,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 32,Cingulate Gyrus,Frontal Lobe,9,Brodmann area 33,Anterior Cingulate,Limbic Lobe +4,10,36,4,11,33,2,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,3,Brodmann area 32,Cingulate Gyrus,Frontal Lobe,9,Brodmann area 33,Anterior Cingulate,Limbic Lobe +11,10,36,11,11,33,3,Brodmann area 32,Cingulate Gyrus,Frontal Lobe,3,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,11,Brodmann area 33,Anterior Cingulate,Limbic Lobe +39,10,36,39,11,33,3,Brodmann area 9,Precentral Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 6,Precentral Gyrus,Frontal Lobe +46,10,36,46,11,33,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 6,Precentral Gyrus,Frontal Lobe +53,10,36,52,11,33,2,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-52,17,36,-51,18,32,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-10,17,36,-10,18,32,2,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +-3,17,36,-3,18,32,1,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 33,Anterior Cingulate,Limbic Lobe +4,17,36,4,18,32,1,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 33,Anterior Cingulate,Limbic Lobe +11,17,36,11,18,32,2,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +46,17,36,46,18,32,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +53,17,36,52,18,32,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-24,24,36,-24,25,32,7,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +-3,24,36,-3,25,32,2,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,5,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +4,24,36,4,25,32,2,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,5,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +11,24,36,11,25,32,1,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,2,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +39,24,36,39,25,32,1,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +46,24,36,46,25,32,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +53,24,36,52,25,32,5,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +-45,31,36,-45,32,32,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +-38,31,36,-38,32,32,1,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-31,31,36,-31,32,32,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +-24,31,36,-24,32,32,3,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +-3,31,36,-3,32,32,2,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +4,31,36,4,32,32,1,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +25,31,36,25,32,32,2,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +39,31,36,39,32,32,1,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +46,31,36,46,32,32,3,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +-38,38,36,-38,38,31,4,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +-31,38,36,-31,38,31,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +-24,38,36,-24,38,31,5,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +-3,38,36,-3,38,31,3,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +4,38,36,4,38,31,4,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +25,38,36,25,38,31,5,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +32,38,36,32,38,31,4,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +39,38,36,39,38,31,4,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,8,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +-31,45,36,-31,45,31,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +-24,45,36,-24,45,31,4,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +-17,45,36,-17,45,31,5,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +-3,45,36,-3,45,31,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe +4,45,36,4,45,31,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe +25,45,36,25,45,31,5,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +32,45,36,32,45,31,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +-24,52,36,-24,52,31,4,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,8,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +-17,52,36,-17,52,31,2,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,8,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +-3,52,36,-3,52,31,2,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,7,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe +4,52,36,4,52,31,2,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,7,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe +18,52,36,18,52,31,2,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,8,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +25,52,36,25,52,31,5,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,8,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +-10,59,36,-10,59,30,2,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +11,59,36,11,59,30,2,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,7,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +18,-88,43,18,-83,44,4,Brodmann area 19,Precuneus,Parietal Lobe,6,Brodmann area 7,Precuneus,Parietal Lobe,16,Brodmann area 18,Cuneus,Occipital Lobe +-31,-81,43,-31,-76,43,3,Brodmann area 19,Precuneus,Parietal Lobe,5,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,13,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-24,-81,43,-24,-76,43,4,Brodmann area 7,Precuneus,Parietal Lobe,5,Brodmann area 19,Precuneus,Parietal Lobe,15,Brodmann area 31,Precuneus,Occipital Lobe +-17,-81,43,-17,-76,43,3,Brodmann area 7,Precuneus,Parietal Lobe,6,Brodmann area 19,Precuneus,Parietal Lobe,15,Brodmann area 31,Precuneus,Occipital Lobe +-10,-81,43,-10,-76,43,3,Brodmann area 7,Precuneus,Parietal Lobe,4,Brodmann area 19,Precuneus,Parietal Lobe,15,Brodmann area 18,Cuneus,Occipital Lobe +-3,-81,43,-3,-76,43,2,Brodmann area 7,Precuneus,Parietal Lobe,6,Brodmann area 19,Precuneus,Parietal Lobe,15,Brodmann area 18,Cuneus,Occipital Lobe +11,-81,43,11,-76,43,3,Brodmann area 7,Precuneus,Parietal Lobe,4,Brodmann area 19,Precuneus,Parietal Lobe,15,Brodmann area 18,Cuneus,Occipital Lobe +18,-81,43,18,-76,43,2,Brodmann area 7,Precuneus,Parietal Lobe,6,Brodmann area 19,Precuneus,Parietal Lobe,15,Brodmann area 31,Precuneus,Occipital Lobe +25,-81,43,25,-76,43,4,Brodmann area 19,Precuneus,Parietal Lobe,5,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,15,Brodmann area 31,Precuneus,Occipital Lobe +32,-81,43,32,-76,43,3,Brodmann area 19,Precuneus,Parietal Lobe,5,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,13,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-45,-74,43,-45,-70,43,5,Brodmann area 19,Precuneus,Parietal Lobe,5,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,7,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe +-38,-74,43,-38,-70,43,3,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,4,Brodmann area 19,Precuneus,Parietal Lobe,6,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-31,-74,43,-31,-70,43,3,Brodmann area 19,Precuneus,Parietal Lobe,5,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,9,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-24,-74,43,-24,-70,43,3,Brodmann area 7,Precuneus,Parietal Lobe,5,Brodmann area 19,Precuneus,Parietal Lobe,14,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-10,-74,43,-10,-70,43,4,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 19,Precuneus,Parietal Lobe,15,Brodmann area 31,Precuneus,Occipital Lobe +-3,-74,43,-3,-70,43,4,Brodmann area 7,Precuneus,Parietal Lobe,11,Brodmann area 19,Precuneus,Parietal Lobe,15,Brodmann area 31,Precuneus,Occipital Lobe +4,-74,43,4,-70,43,4,Brodmann area 7,Precuneus,Parietal Lobe,10,Brodmann area 19,Precuneus,Parietal Lobe,15,Brodmann area 31,Precuneus,Occipital Lobe +11,-74,43,11,-70,43,4,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 19,Precuneus,Parietal Lobe,15,Brodmann area 31,Precuneus,Occipital Lobe +25,-74,43,25,-70,43,4,Brodmann area 7,Precuneus,Parietal Lobe,4,Brodmann area 19,Precuneus,Parietal Lobe,13,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +32,-74,43,32,-70,43,4,Brodmann area 19,Precuneus,Parietal Lobe,5,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,8,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +39,-74,43,39,-70,43,3,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,4,Brodmann area 19,Precuneus,Parietal Lobe,6,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +46,-74,43,46,-70,43,5,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,6,Brodmann area 19,Precuneus,Parietal Lobe,7,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe +-52,-67,43,-51,-63,43,4,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,6,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,10,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe +-45,-67,43,-45,-63,43,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,4,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe +-38,-67,43,-38,-63,43,4,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,4,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 19,Precuneus,Parietal Lobe +-31,-67,43,-31,-63,43,4,Brodmann area 19,Precuneus,Parietal Lobe,5,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe +-24,-67,43,-24,-63,43,5,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,9,Brodmann area 19,Precuneus,Parietal Lobe,11,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-3,-67,43,-3,-63,43,2,Brodmann area 7,Precuneus,Parietal Lobe,15,Brodmann area 31,Precuneus,Occipital Lobe,17,Brodmann area 19,Precuneus,Parietal Lobe +4,-67,43,4,-63,43,2,Brodmann area 7,Precuneus,Parietal Lobe,15,Brodmann area 31,Precuneus,Occipital Lobe,16,Brodmann area 19,Precuneus,Parietal Lobe +25,-67,43,25,-63,43,6,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,9,Brodmann area 19,Precuneus,Parietal Lobe,10,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +32,-67,43,32,-63,43,3,Brodmann area 19,Precuneus,Parietal Lobe,4,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe +39,-67,43,39,-63,43,3,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe,4,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 19,Precuneus,Parietal Lobe +46,-67,43,46,-63,43,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,4,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,6,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe +-52,-60,43,-51,-56,42,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,12,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe +-45,-60,43,-45,-56,42,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,7,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe +-38,-60,43,-38,-56,42,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,7,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,7,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe +-31,-60,43,-31,-56,42,4,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,7,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-3,-60,43,-3,-56,42,2,Brodmann area 7,Precuneus,Parietal Lobe,10,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,19,Brodmann area 23,Posterior Cingulate,Limbic Lobe +4,-60,43,4,-56,42,2,Brodmann area 7,Precuneus,Parietal Lobe,10,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,19,Brodmann area 23,Posterior Cingulate,Limbic Lobe +46,-60,43,46,-56,42,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,7,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe +53,-60,43,52,-56,42,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,6,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,13,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe +-59,-53,43,-58,-49,42,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,13,Brodmann area 39,Angular Gyrus,Parietal Lobe,20,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe +-52,-53,43,-51,-49,42,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,12,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,15,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe +-38,-53,43,-38,-49,42,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,11,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,13,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-31,-53,43,-31,-49,42,6,Brodmann area 7,Precuneus,Parietal Lobe,6,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,13,Brodmann area 39,Angular Gyrus,Parietal Lobe +-10,-53,43,-10,-49,42,2,Brodmann area 7,Precuneus,Parietal Lobe,4,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,15,Brodmann area 5,Paracentral Lobule,Frontal Lobe +-3,-53,43,-3,-49,42,3,Brodmann area 7,Precuneus,Parietal Lobe,4,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,14,Brodmann area 5,Paracentral Lobule,Frontal Lobe +4,-53,43,4,-49,42,3,Brodmann area 7,Precuneus,Parietal Lobe,4,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,14,Brodmann area 5,Paracentral Lobule,Frontal Lobe +11,-53,43,11,-49,42,2,Brodmann area 7,Precuneus,Parietal Lobe,4,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,15,Brodmann area 5,Paracentral Lobule,Frontal Lobe +39,-53,43,39,-49,42,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,11,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,14,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +53,-53,43,52,-49,42,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,12,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe,16,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe +60,-53,43,59,-49,42,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,13,Brodmann area 39,Angular Gyrus,Parietal Lobe,21,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe +-59,-46,43,-58,-43,42,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,16,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,18,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-52,-46,43,-51,-43,42,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,16,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,18,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-45,-46,43,-45,-43,42,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,15,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,16,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe +-38,-46,43,-38,-43,42,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,12,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,17,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-31,-46,43,-31,-43,42,7,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,8,Brodmann area 7,Precuneus,Parietal Lobe,15,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-10,-46,43,-10,-43,42,3,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,5,Brodmann area 7,Precuneus,Parietal Lobe,11,Brodmann area 5,Paracentral Lobule,Frontal Lobe +-3,-46,43,-3,-43,42,2,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 5,Paracentral Lobule,Frontal Lobe +4,-46,43,4,-43,42,2,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 5,Paracentral Lobule,Frontal Lobe +11,-46,43,11,-43,42,2,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 7,Precuneus,Parietal Lobe,11,Brodmann area 5,Paracentral Lobule,Frontal Lobe +32,-46,43,32,-43,42,6,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,8,Brodmann area 7,Precuneus,Parietal Lobe,15,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +39,-46,43,39,-43,42,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,13,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,17,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +46,-46,43,46,-43,42,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,15,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,17,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe +60,-46,43,59,-43,42,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,16,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,18,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-59,-39,43,-58,-36,41,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,11,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-52,-39,43,-51,-36,41,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,13,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-45,-39,43,-45,-36,41,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,8,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,16,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-38,-39,43,-38,-36,41,1,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,10,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,13,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-31,-39,43,-31,-36,41,7,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,10,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,12,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-10,-39,43,-10,-36,41,5,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,7,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 5,Paracentral Lobule,Frontal Lobe +-3,-39,43,-3,-36,41,2,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 5,Paracentral Lobule,Frontal Lobe +4,-39,43,4,-36,41,2,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 5,Paracentral Lobule,Frontal Lobe +11,-39,43,11,-36,41,6,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,8,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 5,Paracentral Lobule,Frontal Lobe +39,-39,43,39,-36,41,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,10,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,13,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +46,-39,43,46,-36,41,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,8,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,16,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +53,-39,43,52,-36,41,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,13,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +60,-39,43,59,-36,41,1,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,11,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-59,-32,43,-58,-29,41,2,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,4,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-52,-32,43,-51,-29,41,1,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,2,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-45,-32,43,-45,-29,41,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,2,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,10,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-38,-32,43,-38,-29,41,1,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,3,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,9,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-10,-32,43,-10,-29,41,3,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 7,Precuneus,Parietal Lobe,11,Brodmann area 5,Paracentral Lobule,Frontal Lobe +-3,-32,43,-3,-29,41,3,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 5,Paracentral Lobule,Frontal Lobe +4,-32,43,4,-29,41,3,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 5,Paracentral Lobule,Frontal Lobe +11,-32,43,11,-29,41,4,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 7,Precuneus,Parietal Lobe,10,Brodmann area 5,Paracentral Lobule,Frontal Lobe +39,-32,43,39,-29,41,1,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,4,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,9,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +46,-32,43,46,-29,41,2,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,10,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +60,-32,43,59,-29,41,2,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,4,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-59,-25,43,-58,-22,41,2,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,3,Brodmann area 1,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-52,-25,43,-51,-22,41,4,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe +-10,-25,43,-10,-22,41,4,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,5,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 6,Paracentral Lobule,Frontal Lobe +-3,-25,43,-3,-22,41,3,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +4,-25,43,4,-22,41,3,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +11,-25,43,11,-22,41,4,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,5,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 6,Paracentral Lobule,Frontal Lobe +46,-25,43,46,-22,41,3,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 4,Precentral Gyrus,Frontal Lobe +53,-25,43,52,-22,41,4,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +60,-25,43,59,-22,41,2,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,3,Brodmann area 1,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-59,-18,43,-58,-15,40,1,Brodmann area 6,Precentral Gyrus,Frontal Lobe,2,Brodmann area 4,Precentral Gyrus,Frontal Lobe,4,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-52,-18,43,-51,-15,40,1,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,2,Brodmann area 4,Precentral Gyrus,Frontal Lobe,6,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-45,-18,43,-45,-15,40,1,Brodmann area 4,Precentral Gyrus,Frontal Lobe,4,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-38,-18,43,-38,-15,40,4,Brodmann area 4,Precentral Gyrus,Frontal Lobe,6,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-10,-18,43,-10,-15,40,2,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 31,Paracentral Lobule,Limbic Lobe,11,Brodmann area 23,Cingulate Gyrus,Limbic Lobe +-3,-18,43,-3,-15,40,1,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,5,Brodmann area 31,Paracentral Lobule,Frontal Lobe,8,Brodmann area 23,Cingulate Gyrus,Limbic Lobe +4,-18,43,4,-15,40,0,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,5,Brodmann area 31,Paracentral Lobule,Frontal Lobe,8,Brodmann area 23,Cingulate Gyrus,Limbic Lobe +11,-18,43,11,-15,40,2,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 31,Paracentral Lobule,Limbic Lobe,11,Brodmann area 23,Cingulate Gyrus,Limbic Lobe +53,-18,43,52,-15,40,1,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,3,Brodmann area 4,Precentral Gyrus,Frontal Lobe,5,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +60,-18,43,59,-15,40,1,Brodmann area 6,Precentral Gyrus,Frontal Lobe,3,Brodmann area 4,Precentral Gyrus,Frontal Lobe,5,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-59,-11,43,-58,-9,40,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,6,Brodmann area 4,Precentral Gyrus,Frontal Lobe,7,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-52,-11,43,-51,-9,40,3,Brodmann area 4,Precentral Gyrus,Frontal Lobe,7,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-10,-11,43,-10,-9,40,1,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,5,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,11,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +-3,-11,43,-3,-9,40,3,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 31,Paracentral Lobule,Frontal Lobe,9,Brodmann area 23,Cingulate Gyrus,Limbic Lobe +4,-11,43,4,-9,40,3,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 31,Paracentral Lobule,Frontal Lobe,9,Brodmann area 23,Cingulate Gyrus,Limbic Lobe +11,-11,43,11,-9,40,1,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,5,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +53,-11,43,52,-9,40,3,Brodmann area 4,Precentral Gyrus,Frontal Lobe,6,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 6,Precentral Gyrus,Frontal Lobe +60,-11,43,59,-9,40,1,Brodmann area 6,Precentral Gyrus,Frontal Lobe,6,Brodmann area 4,Precentral Gyrus,Frontal Lobe,8,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-45,-4,43,-45,-2,40,3,Brodmann area 6,Precentral Gyrus,Frontal Lobe,9,Brodmann area 4,Precentral Gyrus,Frontal Lobe,11,Brodmann area 9,Precentral Gyrus,Frontal Lobe +-10,-4,43,-10,-2,40,5,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +-3,-4,43,-3,-2,40,0,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe,11,Brodmann area 31,Paracentral Lobule,Frontal Lobe +4,-4,43,4,-2,40,1,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 31,Paracentral Lobule,Frontal Lobe +11,-4,43,11,-2,40,5,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +53,-4,43,52,-2,40,3,Brodmann area 6,Precentral Gyrus,Frontal Lobe,7,Brodmann area 4,Precentral Gyrus,Frontal Lobe,10,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-52,3,43,-51,5,39,2,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +-45,3,43,-45,5,39,3,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +-10,3,43,-10,5,39,3,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,3,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,11,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +-3,3,43,-3,5,39,2,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +4,3,43,4,5,39,1,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +11,3,43,11,5,39,3,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,3,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,12,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +39,3,43,39,5,39,3,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Precentral Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +46,3,43,46,5,39,4,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +53,3,43,52,5,39,2,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe +-52,10,43,-51,12,39,1,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe +-45,10,43,-45,12,39,1,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe +-3,10,43,-3,12,39,3,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +4,10,43,4,12,39,3,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +11,10,43,11,12,39,4,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +46,10,43,46,12,39,2,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe +53,10,43,52,12,39,2,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe +-45,17,43,-45,18,39,4,Brodmann area 9,Precentral Gyrus,Frontal Lobe,4,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe +-24,17,43,-24,18,39,4,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 9,Precentral Gyrus,Frontal Lobe +-10,17,43,-10,18,39,2,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,8,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,8,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe +-3,17,43,-3,18,39,2,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe +4,17,43,4,18,39,2,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +25,17,43,25,18,39,5,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 9,Precentral Gyrus,Frontal Lobe +39,17,43,39,18,39,6,Brodmann area 9,Precentral Gyrus,Frontal Lobe,7,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe +46,17,43,46,18,39,3,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Precentral Gyrus,Frontal Lobe,10,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe +-45,24,43,-45,25,38,3,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,14,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-31,24,43,-31,25,38,2,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 9,Precentral Gyrus,Frontal Lobe,14,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe +-24,24,43,-24,25,38,3,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 9,Precentral Gyrus,Frontal Lobe,10,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +-3,24,43,-3,25,38,3,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +4,24,43,4,25,38,3,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +25,24,43,25,25,38,3,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Precentral Gyrus,Frontal Lobe,11,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +39,24,43,39,25,38,4,Brodmann area 9,Precentral Gyrus,Frontal Lobe,4,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,16,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe +46,24,43,46,25,38,2,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,14,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-38,31,43,-38,32,38,4,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,16,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-31,31,43,-31,32,38,5,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,17,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +-24,31,43,-24,32,38,4,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +-3,31,43,-3,32,38,2,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +4,31,43,4,32,38,2,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +25,31,43,25,32,38,5,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +32,31,43,32,32,38,5,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,18,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +39,31,43,39,32,38,3,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 46,Middle Frontal Gyrus,Frontal Lobe +-31,38,43,-31,39,38,3,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +-24,38,43,-24,39,38,3,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +-3,38,43,-3,39,38,2,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +4,38,43,4,39,38,2,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +18,38,43,18,39,38,3,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,4,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +25,38,43,25,39,38,3,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +32,38,43,32,39,38,2,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,4,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,16,Brodmann area 10,Middle Frontal Gyrus,Frontal Lobe +-24,45,43,-24,46,37,3,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,3,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe +-17,45,43,-17,46,37,5,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,14,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +-10,45,43,-10,46,37,6,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,7,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,8,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe +-3,45,43,-3,46,37,2,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +4,45,43,4,46,37,2,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +18,45,43,18,46,37,5,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,14,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe +25,45,43,25,46,37,4,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,4,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 10,Superior Frontal Gyrus,Frontal Lobe +-10,52,43,-10,52,37,4,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,4,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +4,52,43,4,52,37,2,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +11,52,43,11,52,37,4,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,4,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +-17,-81,50,-17,-76,50,5,Brodmann area 7,Precuneus,Parietal Lobe,11,Brodmann area 19,Precuneus,Parietal Lobe,22,Brodmann area 31,Precuneus,Occipital Lobe +-10,-81,50,-10,-76,50,3,Brodmann area 7,Precuneus,Parietal Lobe,10,Brodmann area 19,Precuneus,Parietal Lobe,22,Brodmann area 18,Cuneus,Occipital Lobe +-31,-74,50,-31,-69,50,5,Brodmann area 7,Precuneus,Parietal Lobe,10,Brodmann area 19,Precuneus,Parietal Lobe,13,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-24,-74,50,-24,-69,50,2,Brodmann area 7,Precuneus,Parietal Lobe,11,Brodmann area 19,Precuneus,Parietal Lobe,16,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-17,-74,50,-17,-69,50,2,Brodmann area 7,Precuneus,Parietal Lobe,15,Brodmann area 19,Precuneus,Parietal Lobe,22,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-10,-74,50,-10,-69,50,4,Brodmann area 7,Precuneus,Parietal Lobe,13,Brodmann area 19,Precuneus,Parietal Lobe,22,Brodmann area 31,Precuneus,Occipital Lobe +-3,-74,50,-3,-69,50,4,Brodmann area 7,Precuneus,Parietal Lobe,15,Brodmann area 19,Precuneus,Parietal Lobe,22,Brodmann area 31,Precuneus,Occipital Lobe +4,-74,50,4,-69,50,4,Brodmann area 7,Precuneus,Parietal Lobe,15,Brodmann area 19,Precuneus,Parietal Lobe,22,Brodmann area 31,Precuneus,Occipital Lobe +11,-74,50,11,-69,50,4,Brodmann area 7,Precuneus,Parietal Lobe,13,Brodmann area 19,Precuneus,Parietal Lobe,22,Brodmann area 31,Precuneus,Occipital Lobe +18,-74,50,18,-69,50,3,Brodmann area 7,Precuneus,Parietal Lobe,14,Brodmann area 19,Precuneus,Parietal Lobe,21,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +25,-74,50,25,-69,50,1,Brodmann area 7,Precuneus,Parietal Lobe,11,Brodmann area 19,Precuneus,Parietal Lobe,16,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +32,-74,50,32,-69,50,5,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,10,Brodmann area 19,Precuneus,Parietal Lobe,12,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-45,-67,50,-45,-63,49,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,6,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,10,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-38,-67,50,-38,-63,49,4,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,7,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-31,-67,50,-31,-63,49,3,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,9,Brodmann area 19,Precuneus,Parietal Lobe,10,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-24,-67,50,-24,-63,49,3,Brodmann area 7,Precuneus,Parietal Lobe,13,Brodmann area 19,Precuneus,Parietal Lobe,14,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-17,-67,50,-17,-63,49,5,Brodmann area 7,Precuneus,Parietal Lobe,16,Brodmann area 19,Precuneus,Parietal Lobe,20,Brodmann area 31,Precuneus,Parietal Lobe +-3,-67,50,-3,-63,49,2,Brodmann area 7,Precuneus,Parietal Lobe,19,Brodmann area 19,Precuneus,Parietal Lobe,19,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +4,-67,50,4,-63,49,2,Brodmann area 7,Precuneus,Parietal Lobe,18,Brodmann area 19,Precuneus,Parietal Lobe,19,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +18,-67,50,18,-63,49,5,Brodmann area 7,Precuneus,Parietal Lobe,16,Brodmann area 19,Precuneus,Parietal Lobe,19,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +25,-67,50,25,-63,49,4,Brodmann area 7,Precuneus,Parietal Lobe,12,Brodmann area 19,Precuneus,Parietal Lobe,13,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +32,-67,50,32,-63,49,2,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,9,Brodmann area 19,Precuneus,Parietal Lobe,10,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +39,-67,50,39,-63,49,5,Brodmann area 7,Inferior Parietal Lobule,Parietal Lobe,7,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-52,-60,50,-51,-56,49,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,10,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-45,-60,50,-45,-56,49,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,4,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,11,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-38,-60,50,-38,-56,49,1,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,11,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-3,-60,50,-3,-56,49,2,Brodmann area 7,Precuneus,Parietal Lobe,13,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,16,Brodmann area 5,Paracentral Lobule,Frontal Lobe +4,-60,50,4,-56,49,2,Brodmann area 7,Precuneus,Parietal Lobe,13,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,16,Brodmann area 5,Paracentral Lobule,Frontal Lobe +39,-60,50,39,-56,49,1,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,12,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +46,-60,50,46,-56,49,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,11,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-52,-53,50,-51,-49,49,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,13,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,15,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-45,-53,50,-45,-49,49,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,14,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +-38,-53,50,-38,-49,49,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,7,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,13,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +-31,-53,50,-31,-49,49,1,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,6,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,13,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +-3,-53,50,-3,-49,49,1,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 5,Paracentral Lobule,Frontal Lobe +4,-53,50,4,-49,49,1,Brodmann area 7,Precuneus,Parietal Lobe,10,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 5,Paracentral Lobule,Frontal Lobe +32,-53,50,32,-49,49,1,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,6,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,13,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +39,-53,50,39,-49,49,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,7,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,13,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +46,-53,50,46,-49,49,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,10,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,15,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +53,-53,50,52,-49,49,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,13,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,15,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-52,-46,50,-51,-42,48,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,16,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,17,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +-45,-46,50,-45,-42,48,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,13,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,15,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-38,-46,50,-38,-42,48,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,10,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,12,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +-31,-46,50,-31,-42,48,6,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,7,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,11,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-10,-46,50,-10,-42,48,2,Brodmann area 7,Precuneus,Parietal Lobe,6,Brodmann area 5,Paracentral Lobule,Frontal Lobe,8,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +-3,-46,50,-3,-42,48,4,Brodmann area 7,Precuneus,Parietal Lobe,4,Brodmann area 5,Paracentral Lobule,Frontal Lobe,8,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +4,-46,50,4,-42,48,4,Brodmann area 7,Precuneus,Parietal Lobe,5,Brodmann area 5,Paracentral Lobule,Frontal Lobe,8,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +11,-46,50,11,-42,48,3,Brodmann area 7,Precuneus,Parietal Lobe,6,Brodmann area 5,Paracentral Lobule,Frontal Lobe,8,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +32,-46,50,32,-42,48,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,7,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,12,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +39,-46,50,39,-42,48,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,11,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,12,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +46,-46,50,46,-42,48,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,14,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,15,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +53,-46,50,52,-42,48,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,16,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,18,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +-59,-39,50,-58,-35,48,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,10,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,13,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-52,-39,50,-51,-35,48,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,15,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-45,-39,50,-45,-35,48,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,12,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-38,-39,50,-38,-35,48,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,10,Brodmann area 4,Precentral Gyrus,Frontal Lobe +-10,-39,50,-10,-35,48,2,Brodmann area 5,Paracentral Lobule,Frontal Lobe,5,Brodmann area 7,Precuneus,Parietal Lobe,8,Brodmann area 31,Paracentral Lobule,Frontal Lobe +-3,-39,50,-3,-35,48,3,Brodmann area 7,Precuneus,Parietal Lobe,4,Brodmann area 5,Paracentral Lobule,Frontal Lobe,6,Brodmann area 31,Paracentral Lobule,Frontal Lobe +4,-39,50,4,-35,48,3,Brodmann area 7,Precuneus,Parietal Lobe,4,Brodmann area 5,Paracentral Lobule,Frontal Lobe,6,Brodmann area 31,Paracentral Lobule,Frontal Lobe +11,-39,50,11,-35,48,2,Brodmann area 5,Paracentral Lobule,Frontal Lobe,5,Brodmann area 7,Precuneus,Parietal Lobe,8,Brodmann area 4,Paracentral Lobule,Frontal Lobe +39,-39,50,39,-35,48,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,11,Brodmann area 4,Precentral Gyrus,Frontal Lobe +46,-39,50,46,-35,48,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,13,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +53,-39,50,52,-35,48,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,9,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,14,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +60,-39,50,59,-35,48,6,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,10,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,13,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-59,-32,50,-58,-29,47,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-52,-32,50,-51,-29,47,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,11,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-45,-32,50,-45,-29,47,2,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,9,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-10,-32,50,-10,-29,47,5,Brodmann area 31,Paracentral Lobule,Frontal Lobe,6,Brodmann area 5,Paracentral Lobule,Frontal Lobe,7,Brodmann area 6,Paracentral Lobule,Frontal Lobe +-3,-32,50,-3,-29,47,2,Brodmann area 31,Paracentral Lobule,Frontal Lobe,3,Brodmann area 5,Paracentral Lobule,Frontal Lobe,5,Brodmann area 6,Paracentral Lobule,Frontal Lobe +4,-32,50,4,-29,47,2,Brodmann area 31,Paracentral Lobule,Frontal Lobe,3,Brodmann area 5,Paracentral Lobule,Frontal Lobe,5,Brodmann area 6,Paracentral Lobule,Frontal Lobe +11,-32,50,11,-29,47,6,Brodmann area 5,Paracentral Lobule,Frontal Lobe,6,Brodmann area 31,Paracentral Lobule,Frontal Lobe,7,Brodmann area 6,Paracentral Lobule,Frontal Lobe +39,-32,50,39,-29,47,3,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +46,-32,50,46,-29,47,3,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,10,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +53,-32,50,52,-29,47,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,4,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,10,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +60,-32,50,59,-29,47,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-3,-25,50,-3,-22,47,2,Brodmann area 31,Paracentral Lobule,Frontal Lobe,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 5,Paracentral Lobule,Frontal Lobe +4,-25,50,4,-22,47,2,Brodmann area 31,Paracentral Lobule,Frontal Lobe,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 5,Paracentral Lobule,Frontal Lobe +46,-25,50,46,-22,47,4,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe +53,-25,50,52,-22,47,2,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 1,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe +60,-25,50,59,-22,47,3,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-45,-18,50,-45,-15,47,3,Brodmann area 4,Precentral Gyrus,Frontal Lobe,4,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-3,-18,50,-3,-15,47,3,Brodmann area 31,Paracentral Lobule,Frontal Lobe,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +4,-18,50,4,-15,47,3,Brodmann area 31,Paracentral Lobule,Frontal Lobe,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +60,-18,50,59,-15,47,5,Brodmann area 1,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-52,-11,50,-51,-8,46,1,Brodmann area 4,Precentral Gyrus,Frontal Lobe,5,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-24,-11,50,-24,-8,46,2,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,13,Brodmann area 4,Precentral Gyrus,Frontal Lobe +-10,-11,50,-10,-8,46,2,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,2,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +-3,-11,50,-3,-8,46,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 31,Paracentral Lobule,Frontal Lobe,5,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +4,-11,50,4,-8,46,4,Brodmann area 31,Paracentral Lobule,Frontal Lobe,4,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +46,-11,50,46,-8,46,2,Brodmann area 4,Precentral Gyrus,Frontal Lobe,6,Brodmann area 6,Precentral Gyrus,Frontal Lobe,8,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +53,-11,50,52,-8,46,2,Brodmann area 4,Precentral Gyrus,Frontal Lobe,5,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-52,-4,50,-51,-2,46,3,Brodmann area 6,Precentral Gyrus,Frontal Lobe,5,Brodmann area 4,Precentral Gyrus,Frontal Lobe,10,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-45,-4,50,-45,-2,46,1,Brodmann area 6,Precentral Gyrus,Frontal Lobe,8,Brodmann area 4,Precentral Gyrus,Frontal Lobe,13,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-31,-4,50,-31,-2,46,4,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,14,Brodmann area 4,Precentral Gyrus,Frontal Lobe,16,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +-24,-4,50,-24,-2,46,3,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,13,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +-3,-4,50,-3,-2,46,1,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +4,-4,50,4,-2,46,1,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,6,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +11,-4,50,11,-2,46,1,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,8,Brodmann area 31,Cingulate Gyrus,Limbic Lobe,9,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +25,-4,50,25,-2,46,2,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,13,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +32,-4,50,32,-2,46,4,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,14,Brodmann area 4,Precentral Gyrus,Frontal Lobe,17,Brodmann area 9,Precentral Gyrus,Frontal Lobe +53,-4,50,52,-2,46,3,Brodmann area 6,Precentral Gyrus,Frontal Lobe,5,Brodmann area 4,Precentral Gyrus,Frontal Lobe,10,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-52,3,50,-51,5,46,2,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-45,3,50,-45,5,46,3,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-24,3,50,-24,5,46,4,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +-3,3,50,-3,5,46,2,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,2,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe +4,3,50,4,5,46,1,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,2,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe +25,3,50,25,5,46,3,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +39,3,50,39,5,46,5,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 9,Precentral Gyrus,Frontal Lobe +46,3,50,46,5,46,2,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-45,10,50,-45,12,45,5,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-24,10,50,-24,12,45,4,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +-3,10,50,-3,12,45,1,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe,8,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +4,10,50,4,12,45,1,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,5,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +46,10,50,46,12,45,5,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe +-24,17,50,-24,19,45,3,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +-3,17,50,-3,19,45,1,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe,3,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +4,17,50,4,19,45,1,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe,3,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +25,17,50,25,19,45,3,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +32,17,50,32,19,45,1,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 9,Precentral Gyrus,Frontal Lobe +46,17,50,46,19,45,4,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,8,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 9,Precentral Gyrus,Frontal Lobe +-38,24,50,-38,26,45,4,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 9,Precentral Gyrus,Frontal Lobe,13,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe +-31,24,50,-31,26,45,3,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 9,Precentral Gyrus,Frontal Lobe,11,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe +-24,24,50,-24,26,45,4,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 9,Precentral Gyrus,Frontal Lobe +-3,24,50,-3,26,45,1,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +4,24,50,4,26,45,1,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe,6,Brodmann area 32,Cingulate Gyrus,Limbic Lobe,10,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe +25,24,50,25,26,45,4,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 9,Precentral Gyrus,Frontal Lobe +39,24,50,39,26,45,4,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 9,Precentral Gyrus,Frontal Lobe,13,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe +-31,31,50,-31,32,44,4,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe +-24,31,50,-24,32,44,2,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe +-3,31,50,-3,32,44,2,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +4,31,50,4,32,44,2,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +18,31,50,18,32,44,5,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,11,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe +25,31,50,25,32,44,2,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe +32,31,50,32,32,44,3,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,10,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe +-24,38,50,-24,39,44,4,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe +-17,38,50,-17,39,44,6,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,14,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe +-10,38,50,-10,39,44,3,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,12,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,13,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe +-3,38,50,-3,39,44,4,Brodmann area 8,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,12,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +4,38,50,4,39,44,3,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,12,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +18,38,50,18,39,44,5,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe,14,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe +25,38,50,25,39,44,3,Brodmann area 8,Middle Frontal Gyrus,Frontal Lobe,9,Brodmann area 9,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe +-10,45,50,-10,46,44,4,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,12,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe +-3,45,50,-3,46,44,3,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,10,Brodmann area 9,Medial Frontal Gyrus,Frontal Lobe +-17,-74,57,-17,-69,56,5,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,20,Brodmann area 19,Precuneus,Parietal Lobe,25,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-10,-74,57,-10,-69,56,4,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,18,Brodmann area 19,Precuneus,Parietal Lobe,26,Brodmann area 5,Paracentral Lobule,Frontal Lobe +11,-74,57,11,-69,56,4,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,18,Brodmann area 19,Precuneus,Parietal Lobe,26,Brodmann area 5,Paracentral Lobule,Frontal Lobe +18,-74,57,18,-69,56,6,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,19,Brodmann area 19,Precuneus,Parietal Lobe,24,Brodmann area 39,Inferior Parietal Lobule,Parietal Lobe +-31,-67,57,-31,-62,56,2,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,13,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,16,Brodmann area 19,Precuneus,Parietal Lobe +-24,-67,57,-24,-62,56,3,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,16,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,18,Brodmann area 19,Precuneus,Parietal Lobe +-17,-67,57,-17,-62,56,4,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,20,Brodmann area 5,Superior Parietal Lobule,Parietal Lobe,21,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe +-10,-67,57,-10,-62,56,3,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,19,Brodmann area 5,Paracentral Lobule,Frontal Lobe,23,Brodmann area 19,Precuneus,Parietal Lobe +-3,-67,57,-3,-62,56,3,Brodmann area 7,Precuneus,Parietal Lobe,18,Brodmann area 5,Paracentral Lobule,Frontal Lobe,23,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +4,-67,57,4,-62,56,2,Brodmann area 7,Precuneus,Parietal Lobe,18,Brodmann area 5,Paracentral Lobule,Frontal Lobe,23,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +11,-67,57,11,-62,56,2,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,19,Brodmann area 5,Paracentral Lobule,Frontal Lobe,23,Brodmann area 19,Precuneus,Parietal Lobe +25,-67,57,25,-62,56,4,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,15,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,18,Brodmann area 19,Precuneus,Parietal Lobe +32,-67,57,32,-62,56,3,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,13,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,16,Brodmann area 19,Precuneus,Parietal Lobe +-38,-60,57,-38,-56,55,3,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,14,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +-31,-60,57,-31,-56,55,2,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,7,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,14,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +-24,-60,57,-24,-56,55,5,Brodmann area 7,Precuneus,Parietal Lobe,11,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,14,Brodmann area 5,Superior Parietal Lobule,Parietal Lobe +-10,-60,57,-10,-56,55,3,Brodmann area 7,Precuneus,Parietal Lobe,14,Brodmann area 5,Paracentral Lobule,Frontal Lobe,18,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +-3,-60,57,-3,-56,55,3,Brodmann area 7,Precuneus,Parietal Lobe,13,Brodmann area 5,Paracentral Lobule,Frontal Lobe,18,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +4,-60,57,4,-56,55,3,Brodmann area 7,Precuneus,Parietal Lobe,13,Brodmann area 5,Paracentral Lobule,Frontal Lobe,18,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +11,-60,57,11,-56,55,2,Brodmann area 7,Precuneus,Parietal Lobe,14,Brodmann area 5,Paracentral Lobule,Frontal Lobe,18,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +32,-60,57,32,-56,55,2,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,7,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,14,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +39,-60,57,39,-56,55,4,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,14,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +-45,-53,57,-45,-49,55,3,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,10,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,10,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +-38,-53,57,-38,-49,55,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,8,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +-17,-53,57,-17,-49,55,2,Brodmann area 7,Precuneus,Parietal Lobe,7,Brodmann area 5,Paracentral Lobule,Frontal Lobe,11,Brodmann area 40,Sub-Gyral,Parietal Lobe +-10,-53,57,-10,-49,55,5,Brodmann area 7,Precuneus,Parietal Lobe,8,Brodmann area 5,Paracentral Lobule,Frontal Lobe,15,Brodmann area 4,Paracentral Lobule,Frontal Lobe +-3,-53,57,-3,-49,55,2,Brodmann area 7,Precuneus,Parietal Lobe,7,Brodmann area 5,Paracentral Lobule,Frontal Lobe,14,Brodmann area 4,Paracentral Lobule,Frontal Lobe +4,-53,57,4,-49,55,2,Brodmann area 7,Precuneus,Parietal Lobe,7,Brodmann area 5,Paracentral Lobule,Frontal Lobe,14,Brodmann area 4,Paracentral Lobule,Frontal Lobe +32,-53,57,32,-49,55,1,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,4,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,8,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +39,-53,57,39,-49,55,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,6,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,9,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +46,-53,57,46,-49,55,4,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,11,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,11,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +-45,-46,57,-45,-42,55,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,8,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,10,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-38,-46,57,-38,-42,55,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-31,-46,57,-31,-42,55,5,Brodmann area 40,Sub-Gyral,Parietal Lobe,5,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe +-10,-46,57,-10,-42,55,2,Brodmann area 7,Precuneus,Parietal Lobe,5,Brodmann area 5,Paracentral Lobule,Frontal Lobe,8,Brodmann area 4,Paracentral Lobule,Frontal Lobe +-3,-46,57,-3,-42,55,1,Brodmann area 5,Paracentral Lobule,Frontal Lobe,5,Brodmann area 7,Precuneus,Parietal Lobe,8,Brodmann area 4,Paracentral Lobule,Frontal Lobe +4,-46,57,4,-42,55,1,Brodmann area 5,Paracentral Lobule,Frontal Lobe,4,Brodmann area 7,Precuneus,Parietal Lobe,8,Brodmann area 4,Paracentral Lobule,Frontal Lobe +11,-46,57,11,-42,55,2,Brodmann area 7,Precuneus,Parietal Lobe,4,Brodmann area 5,Paracentral Lobule,Frontal Lobe,8,Brodmann area 4,Paracentral Lobule,Frontal Lobe +32,-46,57,32,-42,55,5,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,8,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe +39,-46,57,39,-42,55,1,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,5,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-45,-39,57,-45,-35,54,2,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,6,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,9,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-38,-39,57,-38,-35,54,2,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-3,-39,57,-3,-35,54,1,Brodmann area 5,Paracentral Lobule,Frontal Lobe,6,Brodmann area 4,Paracentral Lobule,Frontal Lobe,7,Brodmann area 6,Paracentral Lobule,Frontal Lobe +4,-39,57,4,-35,54,2,Brodmann area 5,Paracentral Lobule,Frontal Lobe,6,Brodmann area 4,Paracentral Lobule,Frontal Lobe,7,Brodmann area 6,Paracentral Lobule,Frontal Lobe +39,-39,57,39,-35,54,1,Brodmann area 40,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-38,-32,57,-38,-28,54,2,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 4,Precentral Gyrus,Frontal Lobe,6,Brodmann area 40,Postcentral Gyrus,Parietal Lobe +-3,-32,57,-3,-28,54,2,Brodmann area 6,Paracentral Lobule,Frontal Lobe,4,Brodmann area 5,Paracentral Lobule,Frontal Lobe,9,Brodmann area 31,Paracentral Lobule,Frontal Lobe +4,-32,57,4,-28,54,1,Brodmann area 6,Paracentral Lobule,Frontal Lobe,5,Brodmann area 5,Paracentral Lobule,Frontal Lobe,9,Brodmann area 31,Paracentral Lobule,Frontal Lobe +46,-32,57,46,-28,54,2,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,6,Brodmann area 1,Postcentral Gyrus,Parietal Lobe +-52,-25,57,-51,-22,54,1,Brodmann area 1,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-3,-25,57,-3,-22,54,1,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 5,Paracentral Lobule,Frontal Lobe,9,Brodmann area 31,Paracentral Lobule,Frontal Lobe +4,-25,57,4,-22,54,1,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 5,Paracentral Lobule,Frontal Lobe,9,Brodmann area 31,Paracentral Lobule,Frontal Lobe +53,-25,57,52,-22,54,1,Brodmann area 1,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-52,-18,57,-51,-15,53,3,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 1,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 4,Precentral Gyrus,Frontal Lobe +-45,-18,57,-45,-15,53,3,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 4,Precentral Gyrus,Frontal Lobe,8,Brodmann area 6,Precentral Gyrus,Frontal Lobe +-3,-18,57,-3,-15,53,2,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,8,Brodmann area 31,Paracentral Lobule,Frontal Lobe,13,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +4,-18,57,4,-15,53,2,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,8,Brodmann area 31,Paracentral Lobule,Frontal Lobe,13,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +53,-18,57,52,-15,53,3,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,4,Brodmann area 1,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 4,Precentral Gyrus,Frontal Lobe +-45,-11,57,-45,-8,53,3,Brodmann area 6,Precentral Gyrus,Frontal Lobe,4,Brodmann area 4,Precentral Gyrus,Frontal Lobe,9,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-31,-11,57,-31,-8,53,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,8,Brodmann area 4,Precentral Gyrus,Frontal Lobe,15,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-24,-11,57,-24,-8,53,4,Brodmann area 6,Precentral Gyrus,Frontal Lobe,13,Brodmann area 4,Precentral Gyrus,Frontal Lobe,13,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +-3,-11,57,-3,-8,53,2,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 31,Paracentral Lobule,Frontal Lobe,9,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +4,-11,57,4,-8,53,2,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,9,Brodmann area 31,Paracentral Lobule,Frontal Lobe,9,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +25,-11,57,25,-8,53,4,Brodmann area 6,Precentral Gyrus,Frontal Lobe,12,Brodmann area 4,Precentral Gyrus,Frontal Lobe,14,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +46,-11,57,46,-8,53,2,Brodmann area 6,Precentral Gyrus,Frontal Lobe,4,Brodmann area 4,Precentral Gyrus,Frontal Lobe,8,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-45,-4,57,-45,-1,53,4,Brodmann area 6,Precentral Gyrus,Frontal Lobe,8,Brodmann area 4,Precentral Gyrus,Frontal Lobe,13,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-31,-4,57,-31,-1,53,3,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 4,Precentral Gyrus,Frontal Lobe,18,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +-24,-4,57,-24,-1,53,2,Brodmann area 6,Sub-Gyral,Frontal Lobe,12,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,15,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +-3,-4,57,-3,-1,53,3,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,8,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,11,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +4,-4,57,4,-1,53,3,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,8,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,11,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +25,-4,57,25,-1,53,2,Brodmann area 6,Sub-Gyral,Frontal Lobe,13,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,15,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +32,-4,57,32,-1,53,3,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,14,Brodmann area 4,Precentral Gyrus,Frontal Lobe,19,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +39,-4,57,39,-1,53,4,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 4,Precentral Gyrus,Frontal Lobe,17,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +46,-4,57,46,-1,53,4,Brodmann area 6,Precentral Gyrus,Frontal Lobe,8,Brodmann area 4,Precentral Gyrus,Frontal Lobe,13,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-45,3,57,-45,6,52,5,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,14,Brodmann area 4,Precentral Gyrus,Frontal Lobe +-38,3,57,-38,6,52,5,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 9,Precentral Gyrus,Frontal Lobe +-31,3,57,-31,6,52,3,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,15,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +-24,3,57,-24,6,52,3,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe,12,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +-3,3,57,-3,6,52,3,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,7,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +4,3,57,4,6,52,3,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,7,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe,7,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +25,3,57,25,6,52,3,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe,12,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +32,3,57,32,6,52,3,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,12,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +39,3,57,39,6,52,5,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,11,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 9,Precentral Gyrus,Frontal Lobe +-38,10,57,-38,12,52,2,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 9,Precentral Gyrus,Frontal Lobe +-24,10,57,-24,12,52,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,8,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +-3,10,57,-3,12,52,2,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +4,10,57,4,12,52,2,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +25,10,57,25,12,52,5,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,8,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +32,10,57,32,12,52,3,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,7,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +39,10,57,39,12,52,3,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 9,Precentral Gyrus,Frontal Lobe +-38,17,57,-38,19,52,3,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,18,Brodmann area 9,Precentral Gyrus,Frontal Lobe +-24,17,57,-24,19,52,4,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,5,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +-3,17,57,-3,19,52,2,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,12,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +4,17,57,4,19,52,2,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,12,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +25,17,57,25,19,52,5,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,6,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +32,17,57,32,19,52,3,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,5,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,17,Brodmann area 9,Precentral Gyrus,Frontal Lobe +39,17,57,39,19,52,3,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,18,Brodmann area 9,Precentral Gyrus,Frontal Lobe +-31,24,57,-31,26,51,4,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,16,Brodmann area 9,Precentral Gyrus,Frontal Lobe +-24,24,57,-24,26,51,2,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,7,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +-3,24,57,-3,26,51,2,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +4,24,57,4,26,51,2,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +11,24,57,11,26,51,5,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,8,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,12,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +25,24,57,25,26,51,3,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,7,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,18,Brodmann area 9,Precentral Gyrus,Frontal Lobe +32,24,57,32,26,51,4,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,16,Brodmann area 9,Precentral Gyrus,Frontal Lobe +-17,31,57,-17,33,51,2,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +-10,31,57,-10,33,51,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +-3,31,57,-3,33,51,2,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,7,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,15,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +4,31,57,4,33,51,2,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,7,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,15,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +11,31,57,11,33,51,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,6,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +18,31,57,18,33,51,1,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,5,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe +-10,38,57,-10,39,51,1,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,8,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 9,Superior Frontal Gyrus,Frontal Lobe +-24,-67,64,-24,-62,62,5,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,17,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,19,Brodmann area 5,Superior Parietal Lobule,Parietal Lobe +-17,-67,64,-17,-62,62,3,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,20,Brodmann area 5,Superior Parietal Lobule,Parietal Lobe,22,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe +-10,-67,64,-10,-62,62,4,Brodmann area 7,Precuneus,Parietal Lobe,19,Brodmann area 5,Paracentral Lobule,Frontal Lobe,27,Brodmann area 40,Sub-Gyral,Parietal Lobe +11,-67,64,11,-62,62,5,Brodmann area 7,Precuneus,Parietal Lobe,19,Brodmann area 5,Paracentral Lobule,Frontal Lobe,26,Brodmann area 40,Sub-Gyral,Parietal Lobe +18,-67,64,18,-62,62,4,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,20,Brodmann area 5,Superior Parietal Lobule,Parietal Lobe,21,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe +-31,-60,64,-31,-55,62,4,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,9,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,13,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +-24,-60,64,-24,-55,62,4,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,12,Brodmann area 5,Superior Parietal Lobule,Parietal Lobe,13,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe +-17,-60,64,-17,-55,62,3,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,13,Brodmann area 5,Superior Parietal Lobule,Parietal Lobe,17,Brodmann area 40,Sub-Gyral,Parietal Lobe +-10,-60,64,-10,-55,62,3,Brodmann area 7,Precuneus,Parietal Lobe,12,Brodmann area 5,Paracentral Lobule,Frontal Lobe,20,Brodmann area 4,Paracentral Lobule,Frontal Lobe +-3,-60,64,-3,-55,62,6,Brodmann area 7,Precuneus,Parietal Lobe,11,Brodmann area 5,Paracentral Lobule,Frontal Lobe,19,Brodmann area 4,Paracentral Lobule,Frontal Lobe +4,-60,64,4,-55,62,6,Brodmann area 7,Precuneus,Parietal Lobe,11,Brodmann area 5,Paracentral Lobule,Frontal Lobe,19,Brodmann area 4,Paracentral Lobule,Frontal Lobe +11,-60,64,11,-55,62,2,Brodmann area 7,Precuneus,Parietal Lobe,12,Brodmann area 5,Paracentral Lobule,Frontal Lobe,20,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +18,-60,64,18,-55,62,3,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,13,Brodmann area 5,Superior Parietal Lobule,Parietal Lobe,17,Brodmann area 40,Sub-Gyral,Parietal Lobe +-24,-53,64,-24,-48,61,2,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,5,Brodmann area 5,Superior Parietal Lobule,Parietal Lobe,9,Brodmann area 40,Sub-Gyral,Parietal Lobe +-17,-53,64,-17,-48,61,2,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,7,Brodmann area 5,Superior Parietal Lobule,Parietal Lobe,12,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-10,-53,64,-10,-48,61,4,Brodmann area 7,Precuneus,Parietal Lobe,6,Brodmann area 5,Paracentral Lobule,Frontal Lobe,14,Brodmann area 4,Paracentral Lobule,Frontal Lobe +-3,-53,64,-3,-48,61,1,Brodmann area 7,Precuneus,Parietal Lobe,4,Brodmann area 5,Paracentral Lobule,Frontal Lobe,12,Brodmann area 4,Paracentral Lobule,Frontal Lobe +4,-53,64,4,-48,61,2,Brodmann area 7,Precuneus,Parietal Lobe,4,Brodmann area 5,Paracentral Lobule,Frontal Lobe,12,Brodmann area 4,Paracentral Lobule,Frontal Lobe +25,-53,64,25,-48,61,2,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,6,Brodmann area 5,Superior Parietal Lobule,Parietal Lobe,9,Brodmann area 40,Sub-Gyral,Parietal Lobe +32,-53,64,32,-48,61,2,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,6,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe +-31,-46,64,-31,-42,61,1,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,5,Brodmann area 7,Superior Parietal Lobule,Parietal Lobe,6,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-10,-46,64,-10,-42,61,5,Brodmann area 5,Paracentral Lobule,Frontal Lobe,6,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-3,-46,64,-3,-42,61,2,Brodmann area 5,Paracentral Lobule,Frontal Lobe,6,Brodmann area 7,Precuneus,Parietal Lobe,6,Brodmann area 4,Paracentral Lobule,Frontal Lobe +4,-46,64,4,-42,61,2,Brodmann area 5,Paracentral Lobule,Frontal Lobe,5,Brodmann area 7,Precuneus,Parietal Lobe,6,Brodmann area 4,Paracentral Lobule,Frontal Lobe +11,-46,64,11,-42,61,5,Brodmann area 5,Paracentral Lobule,Frontal Lobe,6,Brodmann area 7,Precuneus,Parietal Lobe,9,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +39,-46,64,39,-42,61,1,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 40,Inferior Parietal Lobule,Parietal Lobe,7,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-3,-39,64,-3,-35,61,1,Brodmann area 4,Paracentral Lobule,Frontal Lobe,4,Brodmann area 6,Paracentral Lobule,Frontal Lobe,5,Brodmann area 5,Paracentral Lobule,Frontal Lobe +4,-39,64,4,-35,61,2,Brodmann area 4,Paracentral Lobule,Frontal Lobe,5,Brodmann area 6,Paracentral Lobule,Frontal Lobe,5,Brodmann area 5,Paracentral Lobule,Frontal Lobe +39,-39,64,39,-35,61,1,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 40,Postcentral Gyrus,Parietal Lobe +-3,-32,64,-3,-28,60,3,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,8,Brodmann area 5,Paracentral Lobule,Frontal Lobe,8,Brodmann area 4,Paracentral Lobule,Frontal Lobe +4,-32,64,4,-28,60,2,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,8,Brodmann area 5,Paracentral Lobule,Frontal Lobe,8,Brodmann area 4,Paracentral Lobule,Frontal Lobe +-3,-25,64,-3,-21,60,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,13,Brodmann area 5,Paracentral Lobule,Frontal Lobe,14,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +4,-25,64,4,-21,60,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,13,Brodmann area 5,Paracentral Lobule,Frontal Lobe,13,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-3,-18,64,-3,-14,60,1,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,15,Brodmann area 31,Paracentral Lobule,Frontal Lobe,18,Brodmann area 4,Precentral Gyrus,Frontal Lobe +4,-18,64,4,-14,60,1,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,15,Brodmann area 31,Paracentral Lobule,Frontal Lobe,17,Brodmann area 4,Precentral Gyrus,Frontal Lobe +-24,-11,64,-24,-8,59,4,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 4,Precentral Gyrus,Frontal Lobe,17,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +-17,-11,64,-17,-8,59,2,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,16,Brodmann area 4,Precentral Gyrus,Frontal Lobe +-10,-11,64,-10,-8,59,2,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,14,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,14,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +-3,-11,64,-3,-8,59,2,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,15,Brodmann area 31,Paracentral Lobule,Frontal Lobe,15,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +4,-11,64,4,-8,59,2,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,14,Brodmann area 31,Paracentral Lobule,Frontal Lobe,15,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +25,-11,64,25,-8,59,4,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 4,Precentral Gyrus,Frontal Lobe,18,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +-24,-4,64,-24,-1,59,2,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,17,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,19,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +-3,-4,64,-3,-1,59,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,14,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,16,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +4,-4,64,4,-1,59,5,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,14,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,16,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +25,-4,64,25,-1,59,2,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,17,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,19,Brodmann area 4,Precentral Gyrus,Frontal Lobe +32,-4,64,32,-1,59,3,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 4,Precentral Gyrus,Frontal Lobe,21,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +-31,3,64,-31,6,59,4,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +-24,3,64,-24,6,59,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe,17,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +-3,3,64,-3,6,59,3,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,14,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe,14,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +4,3,64,4,6,59,2,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,14,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe,14,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +18,3,64,18,6,59,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,14,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,15,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +25,3,64,25,6,59,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe,17,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +32,3,64,32,6,59,3,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,15,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +-24,10,64,-24,13,58,5,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,15,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +-3,10,64,-3,13,58,3,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,14,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +4,10,64,4,13,58,3,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,14,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +11,10,64,11,13,58,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,12,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,13,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +18,10,64,18,13,58,3,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe,14,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +25,10,64,25,13,58,5,Brodmann area 6,Middle Frontal Gyrus,Frontal Lobe,13,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,15,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +-24,17,64,-24,19,58,3,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,9,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +-17,17,64,-17,19,58,3,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +-10,17,64,-10,19,58,3,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,15,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +-3,17,64,-3,19,58,5,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,8,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +4,17,64,4,19,58,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,8,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +11,17,64,11,19,58,3,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,15,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +18,17,64,18,19,58,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +25,17,64,25,19,58,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,10,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +-10,24,64,-10,26,58,5,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +11,24,64,11,26,58,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,11,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 32,Cingulate Gyrus,Limbic Lobe +-17,-60,71,-17,-55,68,7,Brodmann area 7,Postcentral Gyrus,Parietal Lobe,14,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,20,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-17,-53,71,-17,-48,68,4,Brodmann area 7,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,13,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-10,-53,71,-10,-48,68,4,Brodmann area 7,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,14,Brodmann area 4,Paracentral Lobule,Parietal Lobe +11,-53,71,11,-48,68,4,Brodmann area 7,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,14,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +18,-53,71,18,-48,68,4,Brodmann area 7,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,13,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +25,-53,71,25,-48,68,4,Brodmann area 7,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,13,Brodmann area 2,Postcentral Gyrus,Parietal Lobe +-10,-46,71,-10,-41,67,5,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 7,Postcentral Gyrus,Parietal Lobe,8,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +11,-46,71,11,-41,67,5,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 7,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +18,-46,71,18,-41,67,6,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 7,Postcentral Gyrus,Parietal Lobe +25,-46,71,25,-41,67,2,Brodmann area 5,Postcentral Gyrus,Parietal Lobe,6,Brodmann area 2,Postcentral Gyrus,Parietal Lobe,7,Brodmann area 7,Postcentral Gyrus,Parietal Lobe +-3,-39,71,-3,-35,67,3,Brodmann area 4,Paracentral Lobule,Parietal Lobe,5,Brodmann area 6,Paracentral Lobule,Frontal Lobe,8,Brodmann area 5,Postcentral Gyrus,Parietal Lobe +4,-39,71,4,-35,67,2,Brodmann area 4,Paracentral Lobule,Parietal Lobe,5,Brodmann area 6,Paracentral Lobule,Frontal Lobe,7,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-10,-32,71,-10,-28,67,4,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,4,Brodmann area 4,Precentral Gyrus,Frontal Lobe,4,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-3,-32,71,-3,-28,67,4,Brodmann area 6,Paracentral Lobule,Frontal Lobe,8,Brodmann area 4,Paracentral Lobule,Parietal Lobe,8,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-3,-25,71,-3,-21,66,2,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,13,Brodmann area 3,Postcentral Gyrus,Parietal Lobe,13,Brodmann area 4,Precentral Gyrus,Frontal Lobe +-3,-18,71,-3,-14,66,3,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,18,Brodmann area 4,Precentral Gyrus,Frontal Lobe,19,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +4,-18,71,4,-14,66,3,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,17,Brodmann area 4,Precentral Gyrus,Frontal Lobe,19,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-24,-11,71,-24,-7,66,2,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,17,Brodmann area 4,Precentral Gyrus,Frontal Lobe,21,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-17,-11,71,-17,-7,66,2,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 4,Precentral Gyrus,Frontal Lobe,21,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-10,-11,71,-10,-7,66,2,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,18,Brodmann area 4,Precentral Gyrus,Frontal Lobe,21,Brodmann area 24,Cingulate Gyrus,Limbic Lobe +-3,-11,71,-3,-7,66,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,21,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,22,Brodmann area 31,Paracentral Lobule,Frontal Lobe +4,-11,71,4,-7,66,3,Brodmann area 6,Medial Frontal Gyrus,Frontal Lobe,21,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,21,Brodmann area 4,Precentral Gyrus,Frontal Lobe +18,-11,71,18,-7,66,2,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,16,Brodmann area 4,Precentral Gyrus,Frontal Lobe,21,Brodmann area 3,Postcentral Gyrus,Parietal Lobe +-17,-4,71,-17,-1,65,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,22,Brodmann area 4,Precentral Gyrus,Frontal Lobe +-10,-4,71,-10,-1,65,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,22,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +-3,-4,71,-3,-1,65,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,22,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +4,-4,71,4,-1,65,3,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,22,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +11,-4,71,11,-1,65,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,22,Brodmann area 31,Cingulate Gyrus,Limbic Lobe +18,-4,71,18,-1,65,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,22,Brodmann area 4,Precentral Gyrus,Frontal Lobe +-17,3,71,-17,6,65,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,20,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +-10,3,71,-10,6,65,6,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,20,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe +-3,3,71,-3,6,65,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,19,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +4,3,71,4,6,65,4,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,19,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +11,3,71,11,6,65,6,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,21,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +18,3,71,18,6,65,3,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 24,Cingulate Gyrus,Limbic Lobe,20,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe +-17,10,71,-17,13,65,3,Brodmann area 6,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 8,Superior Frontal Gyrus,Frontal Lobe,20,Brodmann area 32,Medial Frontal Gyrus,Frontal Lobe diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/advanced-visualization.conf b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/advanced-visualization.conf new file mode 100644 index 0000000..9cbe094 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/advanced-visualization.conf @@ -0,0 +1,30 @@ +AdvancedViz_ColorGradient_IceAndFire = 0:100,100,100; 12:50,100,100; 25:0,50,100; 38:0,0,50; 50:0,0,0; 62:50,0,0; 75:100,50,0; 88:100,100,50; 100:100,100,100 +AdvancedViz_ColorGradient_IceAndFire_Discrete = 0:100,100,100; 10:100,100,100; 11:50,100,100; 20:50,100,100; 21:0,50,100; 30:0,50,100; 31:0,0,50; 40:0,0,50; 41:0,0,0; 60:0,0,0; 61:50,0,0; 70:50,0,0; 71:100,50,0; 80:100,50,0; 81:100,100,50; 90:100,100,50; 91:100,100,100; 100:100,100,100 + +AdvancedViz_ColorGradient_Elan = 0:100,100,0; 5:74,100,0; 10:54,100,0; 20:0,84,5; 30:0,60,35; 40:0,34,43; 50:0,0,55; 60:27,0,66; 70:42,0,66; 80:60,0,66; 90:80,0,36; 95:88,0,0; 100:100,0,0 +AdvancedViz_ColorGradient_Elan_Discrete = 0:100,100,0; 7:100,100,0; 8:74,100,0; 15:74,100,0; 16:54,100,0; 23:54,100,0; 24:0,84,5; 31:0,84,5; 32:0,60,35; 39:0,60,35; 40:0,34,43; 47:0,34,43; 48:0,0,55; 52:0,0,55; 53:27,0,66; 60:27,0,66; 61:42,0,66; 68:42,0,66; 69:60,0,66; 76:60,0,66; 77:80,0,36; 84:80,0,36; 85:88,0,0; 92:88,0,0; 93:100,0,0; 100:100,0,0 + +AdvancedViz_ColorGradient_Fire = 0:0,0,0; 25:50,0,0; 50:100,50,0; 75:100,100,50; 100:100,100,100 +AdvancedViz_ColorGradient_Fire_Positive = 0:0,0,0; 50:0,0,0; 62:50,0,0; 75:100,50,0; 88:100,100,50; 100:100,100,100 +AdvancedViz_ColorGradient_Fire_Discrete = 0:0,0,0; 20:0,0,0; 21:50,0,0; 40:50,0,0; 41:100,50,0; 60:100,50,0; 61:100,100,50; 80:100,100,50; 81:100,100,100 100:100,100,100 + +AdvancedViz_ColorGradient_Icon = 0:0,0,25; 25:25,50,100; 50:100,100,100; 75:100,50,25; 100:25,0,0 +AdvancedViz_ColorGradient_Icon_Positive = 0:0,0,25; 50:0,0,25; 62:25,50,100; 75:100,100,100; 88:100,50,25; 100:25,0,0 +AdvancedViz_ColorGradient_Icon_Discrete = 0:0,0,25; 20:0,0,25; 21:25,50,100; 40:25,50,100; 41:100,100,100; 60:100,100,100; 61:100,50,25; 80:100,50,25; 81:25,0,0; 100:25,0,0 + +AdvancedViz_ColorGradient_Matlab = 0:0,0,50; 25:0,100,100; 50:0,50,0; 75:100,100,0; 100:75,0,0 +AdvancedViz_ColorGradient_Matlab_Positive = 0:0,0,50; 50:0,0,50; 62:0,100,100; 75:0,50,0; 88:100,100,0; 100:75,0,0 +AdvancedViz_ColorGradient_Matlab_Discrete = 0:0,0,49; 9:0,0,49; 10:0,49,100; 19:0,49,100; 20:0,100,100; 29:0,100,100; 30:0,100,49; 39:0,100,49; 40:0,74,24; 49:0,74,24; 50:0,49,0; 51:24,74,0; 60:24,74,0; 61:49,100,0; 70:49,100,0; 71:100,100,0; 80:100,100,0; 81:100,49,0; 90:100,49,0; 91:49,0,0; 100:49,0,0 + +AdvancedViz_DefaultKind = Matlab +AdvancedViz_DefaultColor = 90, 90, 90 +AdvancedViz_DefaultColorGradient = ${AdvancedViz_ColorGradient_${AdvancedViz_DefaultKind}} +AdvancedViz_DefaultColorGradient_Discrete = ${AdvancedViz_ColorGradient_${AdvancedViz_DefaultKind}_Discrete} + +AdvancedViz_ChannelLocalisation = ${Path_Data}/plugins/cartesian.txt + +AdvancedViz_WarnIfSuspiciousSettings = true + +AdvancedViz_HighDefinition_FastForwardFactor = 5 +AdvancedViz_LowDefinition_FastForwardFactor = 20 + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/advanced-visualization.ui b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/advanced-visualization.ui new file mode 100644 index 0000000..065c25c --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/advanced-visualization.ui @@ -0,0 +1,933 @@ + + + + + + 100000 + 1 + 1 + 10 + + + 2 + 1024 + 1 + 25 + + + 1 + + + 8192 + 1 + 10 + + + 8192 + 1 + 10 + + + 10000000 + 10 + 0.10000000000000001 + 1 + + + True + False + gtk-spell-check + + + True + False + gtk-spell-check + + + True + False + gtk-close + + + True + False + gtk-close + + + True + False + gtk-go-down + + + True + False + gtk-go-down + + + True + False + gtk-go-forward + + + True + False + gtk-go-forward + + + True + False + gtk-undo + + + True + False + gtk-undo + + + + + + + + + + + 1 + dummy + + + + + + + + + + + dummy + + + + + + + + + + + dummy + + + + + + + + + + + dummy + + + + + + + + + + + + + Sort Channels... + + + + Default + gtk-close + + + Alphabetically + gtk-spell-check + + + Reversed + gtk-undo + + + Left to Right + gtk-go-back + + + Front to Bottom + gtk-go-down + + + + + False + Configure Settings... + mouse + dialog + + + True + False + 4 + 4 + + + True + True + + + True + False + 5 + True + + + Default + True + True + True + False + expander_sort_image_default + + + + + Alphabetically + True + True + True + False + expander_sort_image_alpha + + + 1 + 2 + + + + + Reversed + True + True + True + False + expander_sort_image_reversed + + + 2 + 3 + + + + + Left to Right + True + True + True + False + expander_sort_image_left_right + + + 3 + 4 + + + + + Front to Back + True + True + True + False + expander_sort_image_front_back + + + 4 + 5 + + + + + + + True + False + Sort Channels... + + + + + False + True + 0 + + + + + True + True + + + True + True + automatic + automatic + + + 240 + True + True + liststore_select + True + 1 + True + True + + + fixed + Channel + True + + + 32 + + + 0 + + + + + + 1 + + + + + + + + + + + True + False + Select Channels... + + + + + False + True + 1 + + + + + True + + + True + False + 4 + + + True + True + automatic + automatic + + + 240 + True + True + liststore_select_broadmann + True + 1 + True + True + + + fixed + Broadmann Area + True + + + + 0 + + + + + + + + + True + True + 0 + + + + + True + True + automatic + automatic + + + 240 + True + True + liststore_select_neuro_1 + True + 1 + True + True + + + fixed + Neuro Anatomical Region 1 + True + + + + 0 + + + + + + + + + True + True + 1 + + + + + True + True + automatic + automatic + + + 240 + True + True + liststore_select_neuro_2 + True + 1 + True + True + + + fixed + Neuro Anatomical Region 2 + True + + + + 0 + + + + + + + + + True + True + 2 + + + + + + + True + False + Select Regions... + + + + + False + True + 2 + + + + + True + + + True + False + 2 + 2 + True + + + True + False + Lower Boundary : + + + + + True + False + Higher Boundary : + + + 1 + 2 + + + + + True + True + + True + False + False + True + True + adjustment_freq_band_min + 3 + + + 1 + 2 + + + + + True + True + + True + False + False + True + True + adjustment_freq_band_max + 3 + + + 1 + 2 + 1 + 2 + + + + + + + True + False + Select Spectrum Boundaries... + + + + + True + True + 3 + + + + + True + False + 2 + 3 + + + True + False + + + True + False + Time Scale : + + + True + True + 0 + + + + + True + True + + True + False + False + True + True + adjustment_time_scale + 3 + + + True + True + 1 + + + + + 2 + GTK_FILL + GTK_FILL + + + + + Show Scales + True + True + False + False + True + + + 2 + 3 + GTK_FILL + GTK_FILL + + + + + Positive Data + True + True + False + False + True + + + 2 + 3 + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + False + + + True + False + Element Count : + + + True + True + 0 + + + + + True + True + + True + False + False + True + True + adjustment_element_count + + + True + True + 1 + + + + + 1 + 2 + 2 + GTK_FILL + GTK_FILL + + + + + True + True + 4 + + + + + True + False + + + False + True + 5 + + + + + True + False + 4 + 4 + + + gtk-media-play + True + True + True + False + True + + + 3 + 4 + + + + + + + True + False + 0% + + + 2 + 3 + GTK_FILL + GTK_FILL + + + + + 250 + True + True + adjustment_erp + 3 + False + right + + + 1 + 2 + + + + + + True + False + ERP player : + + + GTK_FILL + GTK_FILL + + + + + True + True + 6 + + + + + False + 4 + + + True + False + Video will save to : + + + False + False + 0 + + + + + True + False + + + True + True + 1 + + + + + gtk-media-record + True + True + True + False + True + + + False + False + 2 + + + + + True + True + 7 + + + + + + + + + + + + + + + + + + + 640 + 480 + False + Test window + + + True + False + 3 + 3 + + + 32 + True + False + + + 1 + 2 + 2 + 3 + GTK_FILL + GTK_FILL + + + + + True + False + + + 2 + 3 + + + + + + + True + False + + + 2 + 3 + 2 + 3 + + + + + + + 64 + True + False + + + 2 + 3 + 1 + 2 + GTK_FILL + GTK_FILL + + + + + 64 + True + False + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + False + + + 3 + + + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_SUBSTRUCTURE_MASK + False + + + 1 + 2 + 1 + 2 + + + + + + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/cartesian.txt b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/cartesian.txt new file mode 100644 index 0000000..63c1269 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/cartesian.txt @@ -0,0 +1,697 @@ +[ + ["LPA" "RPA" "Nz" "Fp1" "Fpz" "Fp2" "AF9" "AF7" "AF5" "AF3" "AF1" "AFz" "AF2" "AF4" "AF6" "AF8" "AF10" "F9" "F7" "F5" "F3" "F1" "Fz" "F2" "F4" "F6" "F8" "F10" "FT9" "FT7" "FC5" "FC3" "FC1" "FCz" "FC2" "FC4" "FC6" "FT8" "FT10" "T9" "T7" "C5" "C3" "C1" "Cz" "C2" "C4" "C6" "T8" "T10" "TP9" "TP7" "CP5" "CP3" "CP1" "CPz" "CP2" "CP4" "CP6" "TP8" "TP10" "P9" "P7" "P5" "P3" "P1" "Pz" "P2" "P4" "P6" "P8" "P10" "PO9" "PO7" "PO5" "PO3" "PO1" "POz" "PO2" "PO4" "PO6" "PO8" "PO10" "O1" "Oz" "O2" "I1" "Iz" "I2" "AFp9h" "AFp7h" "AFp5h" "AFp3h" "AFp1h" "AFp2h" "AFp4h" "AFp6h" "AFp8h" "AFp10h" "AFF9h" "AFF7h" "AFF5h" "AFF3h" "AFF1h" "AFF2h" "AFF4h" "AFF6h" "AFF8h" "AFF10h" "FFT9h" "FFT7h" "FFC5h" "FFC3h" "FFC1h" "FFC2h" "FFC4h" "FFC6h" "FFT8h" "FFT10h" "FTT9h" "FTT7h" "FCC5h" "FCC3h" "FCC1h" "FCC2h" "FCC4h" "FCC6h" "FTT8h" "FTT10h" "TTP9h" "TTP7h" "CCP5h" "CCP3h" "CCP1h" "CCP2h" "CCP4h" "CCP6h" "TTP8h" "TTP10h" "TPP9h" "TPP7h" "CPP5h" "CPP3h" "CPP1h" "CPP2h" "CPP4h" "CPP6h" "TPP8h" "TPP10h" "PPO9h" "PPO7h" "PPO5h" "PPO3h" "PPO1h" "PPO2h" "PPO4h" "PPO6h" "PPO8h" "PPO10h" "POO9h" "POO7h" "POO5h" "POO3h" "POO1h" "POO2h" "POO4h" "POO6h" "POO8h" "POO10h" "OI1h" "OI2h" "Fp1h" "Fp2h" "AF9h" "AF7h" "AF5h" "AF3h" "AF1h" "AF2h" "AF4h" "AF6h" "AF8h" "AF10h" "F9h" "F7h" "F5h" "F3h" "F1h" "F2h" "F4h" "F6h" "F8h" "F10h" "FT9h" "FT7h" "FC5h" "FC3h" "FC1h" "FC2h" "FC4h" "FC6h" "FT8h" "FT10h" "T9h" "T7h" "C5h" "C3h" "C1h" "C2h" "C4h" "C6h" "T8h" "T10h" "TP9h" "TP7h" "CP5h" "CP3h" "CP1h" "CP2h" "CP4h" "CP6h" "TP8h" "TP10h" "P9h" "P7h" "P5h" "P3h" "P1h" "P2h" "P4h" "P6h" "P8h" "P10h" "PO9h" "PO7h" "PO5h" "PO3h" "PO1h" "PO2h" "PO4h" "PO6h" "PO8h" "PO10h" "O1h" "O2h" "I1h" "I2h" "AFp9" "AFp7" "AFp5" "AFp3" "AFp1" "AFpz" "AFp2" "AFp4" "AFp6" "AFp8" "AFp10" "AFF9" "AFF7" "AFF5" "AFF3" "AFF1" "AFFz" "AFF2" "AFF4" "AFF6" "AFF8" "AFF10" "FFT9" "FFT7" "FFC5" "FFC3" "FFC1" "FFCz" "FFC2" "FFC4" "FFC6" "FFT8" "FFT10" "FTT9" "FTT7" "FCC5" "FCC3" "FCC1" "FCCz" "FCC2" "FCC4" "FCC6" "FTT8" "FTT10" "TTP9" "TTP7" "CCP5" "CCP3" "CCP1" "CCPz" "CCP2" "CCP4" "CCP6" "TTP8" "TTP10" "TPP9" "TPP7" "CPP5" "CPP3" "CPP1" "CPPz" "CPP2" "CPP4" "CPP6" "TPP8" "TPP10" "PPO9" "PPO7" "PPO5" "PPO3" "PPO1" "PPOz" "PPO2" "PPO4" "PPO6" "PPO8" "PPO10" "POO9" "POO7" "POO5" "POO3" "POO1" "POOz" "POO2" "POO4" "POO6" "POO8" "POO10" "OI1" "OIz" "OI2" "T3" "T5" "T4" "T6" "O9" "O10" "AFF11h" "F11" "FFT11h" "FT11" "TP11" "TPP11h" "P11" "PPO11h" "PO11" "POO11h" "I11" "OI11h" "Iz" "IIz" "OI12h" "I12" "POO12h" "PO12" "PPO12h" "P12" "TPP12h" "TP12" "FT12" "FFT12h" "F12" "AFF12h" "EGI-GES300-256-1" "EGI-GES300-256-2" "EGI-GES300-256-3" "EGI-GES300-256-4" "EGI-GES300-256-5" "EGI-GES300-256-6" "EGI-GES300-256-7" "EGI-GES300-256-8" "EGI-GES300-256-9" "EGI-GES300-256-10" "EGI-GES300-256-11" "EGI-GES300-256-12" "EGI-GES300-256-13" "EGI-GES300-256-14" "EGI-GES300-256-15" "EGI-GES300-256-16" "EGI-GES300-256-17" "EGI-GES300-256-18" "EGI-GES300-256-19" "EGI-GES300-256-20" "EGI-GES300-256-21" "EGI-GES300-256-22" "EGI-GES300-256-23" "EGI-GES300-256-24" "EGI-GES300-256-25" "EGI-GES300-256-26" "EGI-GES300-256-27" "EGI-GES300-256-28" "EGI-GES300-256-29" "EGI-GES300-256-30" "EGI-GES300-256-31" "EGI-GES300-256-32" "EGI-GES300-256-33" "EGI-GES300-256-34" "EGI-GES300-256-35" "EGI-GES300-256-36" "EGI-GES300-256-37" "EGI-GES300-256-38" "EGI-GES300-256-39" "EGI-GES300-256-40" "EGI-GES300-256-41" "EGI-GES300-256-42" "EGI-GES300-256-43" "EGI-GES300-256-44" "EGI-GES300-256-45" "EGI-GES300-256-46" "EGI-GES300-256-47" "EGI-GES300-256-48" "EGI-GES300-256-49" "EGI-GES300-256-50" "EGI-GES300-256-51" "EGI-GES300-256-52" "EGI-GES300-256-53" "EGI-GES300-256-54" "EGI-GES300-256-55" "EGI-GES300-256-56" "EGI-GES300-256-57" "EGI-GES300-256-58" "EGI-GES300-256-59" "EGI-GES300-256-60" "EGI-GES300-256-61" "EGI-GES300-256-62" "EGI-GES300-256-63" "EGI-GES300-256-64" "EGI-GES300-256-65" "EGI-GES300-256-66" "EGI-GES300-256-67" "EGI-GES300-256-68" "EGI-GES300-256-69" "EGI-GES300-256-70" "EGI-GES300-256-71" "EGI-GES300-256-72" "EGI-GES300-256-73" "EGI-GES300-256-74" "EGI-GES300-256-75" "EGI-GES300-256-76" "EGI-GES300-256-77" "EGI-GES300-256-78" "EGI-GES300-256-79" "EGI-GES300-256-80" "EGI-GES300-256-81" "EGI-GES300-256-82" "EGI-GES300-256-83" "EGI-GES300-256-84" "EGI-GES300-256-85" "EGI-GES300-256-86" "EGI-GES300-256-87" "EGI-GES300-256-88" "EGI-GES300-256-89" "EGI-GES300-256-90" "EGI-GES300-256-91" "EGI-GES300-256-92" "EGI-GES300-256-93" "EGI-GES300-256-94" "EGI-GES300-256-95" "EGI-GES300-256-96" "EGI-GES300-256-97" "EGI-GES300-256-98" "EGI-GES300-256-99" "EGI-GES300-256-100" "EGI-GES300-256-101" "EGI-GES300-256-102" "EGI-GES300-256-103" "EGI-GES300-256-104" "EGI-GES300-256-105" "EGI-GES300-256-106" "EGI-GES300-256-107" "EGI-GES300-256-108" "EGI-GES300-256-109" "EGI-GES300-256-110" "EGI-GES300-256-111" "EGI-GES300-256-112" "EGI-GES300-256-113" "EGI-GES300-256-114" "EGI-GES300-256-115" "EGI-GES300-256-116" "EGI-GES300-256-117" "EGI-GES300-256-118" "EGI-GES300-256-119" "EGI-GES300-256-120" "EGI-GES300-256-121" "EGI-GES300-256-122" "EGI-GES300-256-123" "EGI-GES300-256-124" "EGI-GES300-256-125" "EGI-GES300-256-126" "EGI-GES300-256-127" "EGI-GES300-256-128" "EGI-GES300-256-129" "EGI-GES300-256-130" "EGI-GES300-256-131" "EGI-GES300-256-132" "EGI-GES300-256-133" "EGI-GES300-256-134" "EGI-GES300-256-135" "EGI-GES300-256-136" "EGI-GES300-256-137" "EGI-GES300-256-138" "EGI-GES300-256-139" "EGI-GES300-256-140" "EGI-GES300-256-141" "EGI-GES300-256-142" "EGI-GES300-256-143" "EGI-GES300-256-144" "EGI-GES300-256-145" "EGI-GES300-256-146" "EGI-GES300-256-147" "EGI-GES300-256-148" "EGI-GES300-256-149" "EGI-GES300-256-150" "EGI-GES300-256-151" "EGI-GES300-256-152" "EGI-GES300-256-153" "EGI-GES300-256-154" "EGI-GES300-256-155" "EGI-GES300-256-156" "EGI-GES300-256-157" "EGI-GES300-256-158" "EGI-GES300-256-159" "EGI-GES300-256-160" "EGI-GES300-256-161" "EGI-GES300-256-162" "EGI-GES300-256-163" "EGI-GES300-256-164" "EGI-GES300-256-165" "EGI-GES300-256-166" "EGI-GES300-256-167" "EGI-GES300-256-168" "EGI-GES300-256-169" "EGI-GES300-256-170" "EGI-GES300-256-171" "EGI-GES300-256-172" "EGI-GES300-256-173" "EGI-GES300-256-174" "EGI-GES300-256-175" "EGI-GES300-256-176" "EGI-GES300-256-177" "EGI-GES300-256-178" "EGI-GES300-256-179" "EGI-GES300-256-180" "EGI-GES300-256-181" "EGI-GES300-256-182" "EGI-GES300-256-183" "EGI-GES300-256-184" "EGI-GES300-256-185" "EGI-GES300-256-186" "EGI-GES300-256-187" "EGI-GES300-256-188" "EGI-GES300-256-189" "EGI-GES300-256-190" "EGI-GES300-256-191" "EGI-GES300-256-192" "EGI-GES300-256-193" "EGI-GES300-256-194" "EGI-GES300-256-195" "EGI-GES300-256-196" "EGI-GES300-256-197" "EGI-GES300-256-198" "EGI-GES300-256-199" "EGI-GES300-256-200" "EGI-GES300-256-201" "EGI-GES300-256-202" "EGI-GES300-256-203" "EGI-GES300-256-204" "EGI-GES300-256-205" "EGI-GES300-256-206" "EGI-GES300-256-207" "EGI-GES300-256-208" "EGI-GES300-256-209" "EGI-GES300-256-210" "EGI-GES300-256-211" "EGI-GES300-256-212" "EGI-GES300-256-213" "EGI-GES300-256-214" "EGI-GES300-256-215" "EGI-GES300-256-216" "EGI-GES300-256-217" "EGI-GES300-256-218" "EGI-GES300-256-219" "EGI-GES300-256-220" "EGI-GES300-256-221" "EGI-GES300-256-222" "EGI-GES300-256-223" "EGI-GES300-256-224" "EGI-GES300-256-225" "EGI-GES300-256-226" "EGI-GES300-256-227" "EGI-GES300-256-228" "EGI-GES300-256-229" "EGI-GES300-256-230" "EGI-GES300-256-231" "EGI-GES300-256-232" "EGI-GES300-256-233" "EGI-GES300-256-234" "EGI-GES300-256-235" "EGI-GES300-256-236" "EGI-GES300-256-237" "EGI-GES300-256-238" "EGI-GES300-256-239" "EGI-GES300-256-240" "EGI-GES300-256-241" "EGI-GES300-256-242" "EGI-GES300-256-243" "EGI-GES300-256-244" "EGI-GES300-256-245" "EGI-GES300-256-246" "EGI-GES300-256-247" "EGI-GES300-256-248" "EGI-GES300-256-249" "EGI-GES300-256-250" "EGI-GES300-256-251" "EGI-GES300-256-252" "EGI-GES300-256-253" "EGI-GES300-256-254" "EGI-GES300-256-255" "EGI-GES300-256-256" "EGI-GES300-64-1" "EGI-GES300-64-2" "EGI-GES300-64-3" "EGI-GES300-64-4" "EGI-GES300-64-5" "EGI-GES300-64-6" "EGI-GES300-64-7" "EGI-GES300-64-8" "EGI-GES300-64-9" "EGI-GES300-64-10" "EGI-GES300-64-11" "EGI-GES300-64-12" "EGI-GES300-64-13" "EGI-GES300-64-14" "EGI-GES300-64-15" "EGI-GES300-64-16" "EGI-GES300-64-17" "EGI-GES300-64-18" "EGI-GES300-64-19" "EGI-GES300-64-20" "EGI-GES300-64-21" "EGI-GES300-64-22" "EGI-GES300-64-23" "EGI-GES300-64-24" "EGI-GES300-64-25" "EGI-GES300-64-26" "EGI-GES300-64-27" "EGI-GES300-64-28" "EGI-GES300-64-29" "EGI-GES300-64-30" "EGI-GES300-64-31" "EGI-GES300-64-32" "EGI-GES300-64-33" "EGI-GES300-64-34" "EGI-GES300-64-35" "EGI-GES300-64-36" "EGI-GES300-64-37" "EGI-GES300-64-38" "EGI-GES300-64-39" "EGI-GES300-64-40" "EGI-GES300-64-41" "EGI-GES300-64-42" "EGI-GES300-64-43" "EGI-GES300-64-44" "EGI-GES300-64-45" "EGI-GES300-64-46" "EGI-GES300-64-47" "EGI-GES300-64-48" "EGI-GES300-64-49" "EGI-GES300-64-50" "EGI-GES300-64-51" "EGI-GES300-64-52" "EGI-GES300-64-53" "EGI-GES300-64-54" "EGI-GES300-64-55" "EGI-GES300-64-56" "EGI-GES300-64-57" "EGI-GES300-64-58" "EGI-GES300-64-59" "EGI-GES300-64-60" "EGI-GES300-64-61" "EGI-GES300-64-62" "EGI-GES300-64-63" "EGI-GES300-64-64"] + ["x" "y" "z" ] +] + +[ [ 0.0000 0.9237 -0.3826 ] ] +[ [ 0.0000 -0.9237 -0.3826 ] ] +[ [ 0.9230 0.0000 -0.3824 ] ] +[ [ 0.9511 0.3090 0.0001 ] ] +[ [ 1.0000 -0.0000 0.0001 ] ] +[ [ 0.9511 -0.3091 0.0000 ] ] +[ [ 0.7467 0.5425 -0.3825 ] ] +[ [ 0.8090 0.5878 0.0000 ] ] +[ [ 0.8553 0.4926 0.1552 ] ] +[ [ 0.8920 0.3554 0.2782 ] ] +[ [ 0.9150 0.1857 0.3558 ] ] +[ [ 0.9230 0.0000 0.3824 ] ] +[ [ 0.9150 -0.1857 0.3558 ] ] +[ [ 0.8919 -0.3553 0.2783 ] ] +[ [ 0.8553 -0.4926 0.1552 ] ] +[ [ 0.8090 -0.5878 0.0000 ] ] +[ [ 0.7467 -0.5425 -0.3825 ] ] +[ [ 0.5430 0.7472 -0.3826 ] ] +[ [ 0.5878 0.8090 0.0000 ] ] +[ [ 0.6343 0.7210 0.2764 ] ] +[ [ 0.6726 0.5399 0.5043 ] ] +[ [ 0.6979 0.2888 0.6542 ] ] +[ [ 0.7067 0.0000 0.7067 ] ] +[ [ 0.6979 -0.2888 0.6542 ] ] +[ [ 0.6726 -0.5399 0.5043 ] ] +[ [ 0.6343 -0.7210 0.2764 ] ] +[ [ 0.5878 -0.8090 0.0000 ] ] +[ [ 0.5429 -0.7472 -0.3826 ] ] +[ [ 0.2852 0.8777 -0.3826 ] ] +[ [ 0.3090 0.9511 0.0000 ] ] +[ [ 0.3373 0.8709 0.3549 ] ] +[ [ 0.3612 0.6638 0.6545 ] ] +[ [ 0.3770 0.3581 0.8532 ] ] +[ [ 0.3826 0.0000 0.9233 ] ] +[ [ 0.3770 -0.3581 0.8532 ] ] +[ [ 0.3612 -0.6638 0.6545 ] ] +[ [ 0.3373 -0.8709 0.3549 ] ] +[ [ 0.3090 -0.9511 0.0000 ] ] +[ [ 0.2852 -0.8777 -0.3826 ] ] +[ [ -0.0001 0.9237 -0.3826 ] ] +[ [ 0.0000 1.0000 0.0000 ] ] +[ [ 0.0001 0.9237 0.3826 ] ] +[ [ 0.0001 0.7066 0.7066 ] ] +[ [ 0.0002 0.3824 0.9231 ] ] +[ [ 0.0002 0.0000 1.0000 ] ] +[ [ 0.0001 -0.3824 0.9231 ] ] +[ [ 0.0001 -0.7066 0.7066 ] ] +[ [ 0.0001 -0.9237 0.3826 ] ] +[ [ 0.0000 -1.0000 0.0000 ] ] +[ [ 0.0000 -0.9237 -0.3826 ] ] +[ [ -0.2852 0.8777 -0.3826 ] ] +[ [ -0.3090 0.9511 -0.0001 ] ] +[ [ -0.3372 0.8712 0.3552 ] ] +[ [ -0.3609 0.6635 0.6543 ] ] +[ [ -0.3767 0.3580 0.8534 ] ] +[ [ -0.3822 0.0000 0.9231 ] ] +[ [ -0.3767 -0.3580 0.8534 ] ] +[ [ -0.3608 -0.6635 0.6543 ] ] +[ [ -0.3372 -0.8712 0.3552 ] ] +[ [ -0.3090 -0.9511 -0.0001 ] ] +[ [ -0.2853 -0.8777 -0.3826 ] ] +[ [ -0.5429 0.7472 -0.3826 ] ] +[ [ -0.5878 0.8090 -0.0001 ] ] +[ [ -0.6342 0.7211 0.2764 ] ] +[ [ -0.6724 0.5401 0.5045 ] ] +[ [ -0.6975 0.2889 0.6545 ] ] +[ [ -0.7063 0.0000 0.7065 ] ] +[ [ -0.6975 -0.2889 0.6545 ] ] +[ [ -0.6724 -0.5401 0.5045 ] ] +[ [ -0.6342 -0.7211 0.2764 ] ] +[ [ -0.5878 -0.8090 -0.0001 ] ] +[ [ -0.5429 -0.7472 -0.3826 ] ] +[ [ -0.7467 0.5425 -0.3825 ] ] +[ [ -0.8090 0.5878 0.0000 ] ] +[ [ -0.8553 0.4929 0.1555 ] ] +[ [ -0.8918 0.3549 0.2776 ] ] +[ [ -0.9151 0.1858 0.3559 ] ] +[ [ -0.9230 -0.0000 0.3824 ] ] +[ [ -0.9151 -0.1859 0.3559 ] ] +[ [ -0.8918 -0.3549 0.2776 ] ] +[ [ -0.8553 -0.4929 0.1555 ] ] +[ [ -0.8090 -0.5878 0.0000 ] ] +[ [ -0.7467 -0.5425 -0.3825 ] ] +[ [ -0.9511 0.3090 0.0000 ] ] +[ [ -1.0000 0.0000 0.0000 ] ] +[ [ -0.9511 -0.3090 0.0000 ] ] +[ [ -0.8785 0.2854 -0.3824 ] ] +[ [ -0.9230 0.0000 -0.3823 ] ] +[ [ -0.8785 -0.2854 -0.3824 ] ] +[ [ 0.8732 0.4449 -0.1949 ] ] +[ [ 0.9105 0.4093 0.0428 ] ] +[ [ 0.9438 0.3079 0.1159 ] ] +[ [ 0.9669 0.1910 0.1666 ] ] +[ [ 0.9785 0.0647 0.1919 ] ] +[ [ 0.9785 -0.0647 0.1919 ] ] +[ [ 0.9669 -0.1910 0.1666 ] ] +[ [ 0.9438 -0.3079 0.1159 ] ] +[ [ 0.9105 -0.4093 0.0428 ] ] +[ [ 0.8732 -0.4449 -0.1949 ] ] +[ [ 0.6929 0.6929 -0.1949 ] ] +[ [ 0.7325 0.6697 0.1137 ] ] +[ [ 0.7777 0.5417 0.3163 ] ] +[ [ 0.8111 0.3520 0.4658 ] ] +[ [ 0.8289 0.1220 0.5452 ] ] +[ [ 0.8289 -0.1220 0.5452 ] ] +[ [ 0.8111 -0.3520 0.4658 ] ] +[ [ 0.7777 -0.5417 0.3163 ] ] +[ [ 0.7325 -0.6697 0.1138 ] ] +[ [ 0.6929 -0.6929 -0.1949 ] ] +[ [ 0.4448 0.8730 -0.1950 ] ] +[ [ 0.4741 0.8642 0.1647 ] ] +[ [ 0.5107 0.7218 0.4651 ] ] +[ [ 0.5384 0.4782 0.6925 ] ] +[ [ 0.5533 0.1672 0.8148 ] ] +[ [ 0.5533 -0.1672 0.8148 ] ] +[ [ 0.5384 -0.4782 0.6925 ] ] +[ [ 0.5107 -0.7218 0.4651 ] ] +[ [ 0.4741 -0.8642 0.1647 ] ] +[ [ 0.4448 -0.8730 -0.1950 ] ] +[ [ 0.1533 0.9678 -0.1950 ] ] +[ [ 0.1640 0.9669 0.1915 ] ] +[ [ 0.1779 0.8184 0.5448 ] ] +[ [ 0.1887 0.5466 0.8154 ] ] +[ [ 0.1944 0.1919 0.9615 ] ] +[ [ 0.1944 -0.1919 0.9615 ] ] +[ [ 0.1887 -0.5466 0.8154 ] ] +[ [ 0.1779 -0.8184 0.5448 ] ] +[ [ 0.1640 -0.9669 0.1915 ] ] +[ [ 0.1533 -0.9678 -0.1950 ] ] +[ [ -0.1532 0.9678 -0.1950 ] ] +[ [ -0.1639 0.9669 0.1915 ] ] +[ [ -0.1778 0.8185 0.5449 ] ] +[ [ -0.1883 0.5465 0.8153 ] ] +[ [ -0.1940 0.1918 0.9611 ] ] +[ [ -0.1940 -0.1918 0.9611 ] ] +[ [ -0.1884 -0.5465 0.8153 ] ] +[ [ -0.1778 -0.8185 0.5449 ] ] +[ [ -0.1639 -0.9669 0.1915 ] ] +[ [ -0.1533 -0.9678 -0.1950 ] ] +[ [ -0.4448 0.8731 -0.1950 ] ] +[ [ -0.4740 0.8639 0.1646 ] ] +[ [ -0.5106 0.7220 0.4653 ] ] +[ [ -0.5384 0.4786 0.6933 ] ] +[ [ -0.5532 0.1673 0.8155 ] ] +[ [ -0.5532 -0.1673 0.8155 ] ] +[ [ -0.5384 -0.4786 0.6933 ] ] +[ [ -0.5106 -0.7220 0.4653 ] ] +[ [ -0.4740 -0.8638 0.1646 ] ] +[ [ -0.4449 -0.8731 -0.1950 ] ] +[ [ -0.6928 0.6928 -0.1950 ] ] +[ [ -0.7324 0.6700 0.1139 ] ] +[ [ -0.7776 0.5420 0.3167 ] ] +[ [ -0.8108 0.3520 0.4659 ] ] +[ [ -0.8284 0.1220 0.5453 ] ] +[ [ -0.8284 -0.1220 0.5453 ] ] +[ [ -0.8108 -0.3519 0.4659 ] ] +[ [ -0.7775 -0.5421 0.3167 ] ] +[ [ -0.7324 -0.6700 0.1139 ] ] +[ [ -0.6928 -0.6928 -0.1950 ] ] +[ [ -0.8730 0.4448 -0.1950 ] ] +[ [ -0.9106 0.4097 0.0430 ] ] +[ [ -0.9438 0.3080 0.1160 ] ] +[ [ -0.9665 0.1908 0.1657 ] ] +[ [ -0.9783 0.0647 0.1918 ] ] +[ [ -0.9783 -0.0647 0.1918 ] ] +[ [ -0.9665 -0.1908 0.1657 ] ] +[ [ -0.9438 -0.3080 0.1160 ] ] +[ [ -0.9106 -0.4097 0.0430 ] ] +[ [ -0.8730 -0.4448 -0.1950 ] ] +[ [ -0.9679 0.1533 -0.1950 ] ] +[ [ -0.9679 -0.1533 -0.1950 ] ] +[ [ 0.9877 0.1564 0.0001 ] ] +[ [ 0.9877 -0.1564 0.0001 ] ] +[ [ 0.7928 0.5759 -0.1949 ] ] +[ [ 0.8332 0.5463 0.0810 ] ] +[ [ 0.8750 0.4284 0.2213 ] ] +[ [ 0.9053 0.2735 0.3231 ] ] +[ [ 0.9211 0.0939 0.3758 ] ] +[ [ 0.9210 -0.0939 0.3758 ] ] +[ [ 0.9053 -0.2735 0.3231 ] ] +[ [ 0.8750 -0.4284 0.2212 ] ] +[ [ 0.8332 -0.5463 0.0810 ] ] +[ [ 0.7927 -0.5759 -0.1949 ] ] +[ [ 0.5761 0.7929 -0.1949 ] ] +[ [ 0.6117 0.7772 0.1420 ] ] +[ [ 0.6549 0.6412 0.3987 ] ] +[ [ 0.6872 0.4214 0.5906 ] ] +[ [ 0.7045 0.1468 0.6933 ] ] +[ [ 0.7045 -0.1468 0.6933 ] ] +[ [ 0.6872 -0.4214 0.5906 ] ] +[ [ 0.6549 -0.6412 0.3987 ] ] +[ [ 0.6117 -0.7772 0.1420 ] ] +[ [ 0.5761 -0.7929 -0.1949 ] ] +[ [ 0.3027 0.9317 -0.1950 ] ] +[ [ 0.3235 0.9280 0.1813 ] ] +[ [ 0.3500 0.7817 0.5146 ] ] +[ [ 0.3703 0.5207 0.7687 ] ] +[ [ 0.3811 0.1824 0.9054 ] ] +[ [ 0.3811 -0.1824 0.9054 ] ] +[ [ 0.3703 -0.5207 0.7687 ] ] +[ [ 0.3500 -0.7817 0.5146 ] ] +[ [ 0.3235 -0.9280 0.1813 ] ] +[ [ 0.3028 -0.9317 -0.1950 ] ] +[ [ 0.0000 0.9801 -0.1950 ] ] +[ [ 0.0000 0.9801 0.1949 ] ] +[ [ 0.0001 0.8311 0.5552 ] ] +[ [ 0.0002 0.5550 0.8306 ] ] +[ [ 0.0001 0.1950 0.9801 ] ] +[ [ 0.0002 -0.1950 0.9801 ] ] +[ [ 0.0002 -0.5550 0.8306 ] ] +[ [ 0.0001 -0.8311 0.5552 ] ] +[ [ 0.0000 -0.9801 0.1949 ] ] +[ [ 0.0000 -0.9801 -0.1950 ] ] +[ [ -0.3028 0.9319 -0.1949 ] ] +[ [ -0.3234 0.9278 0.1813 ] ] +[ [ -0.3498 0.7818 0.5148 ] ] +[ [ -0.3699 0.5206 0.7688 ] ] +[ [ -0.3808 0.1825 0.9059 ] ] +[ [ -0.3808 -0.1825 0.9059 ] ] +[ [ -0.3699 -0.5206 0.7688 ] ] +[ [ -0.3498 -0.7818 0.5148 ] ] +[ [ -0.3234 -0.9278 0.1813 ] ] +[ [ -0.3028 -0.9319 -0.1949 ] ] +[ [ -0.5761 0.7929 -0.1950 ] ] +[ [ -0.6116 0.7771 0.1420 ] ] +[ [ -0.6546 0.6411 0.3985 ] ] +[ [ -0.6869 0.4217 0.5912 ] ] +[ [ -0.7041 0.1469 0.6934 ] ] +[ [ -0.7041 -0.1469 0.6934 ] ] +[ [ -0.6870 -0.4216 0.5912 ] ] +[ [ -0.6546 -0.6411 0.3985 ] ] +[ [ -0.6116 -0.7771 0.1420 ] ] +[ [ -0.5761 -0.7929 -0.1950 ] ] +[ [ -0.7926 0.5759 -0.1950 ] ] +[ [ -0.8331 0.5459 0.0809 ] ] +[ [ -0.8752 0.4292 0.2219 ] ] +[ [ -0.9054 0.2737 0.3233 ] ] +[ [ -0.9210 0.0939 0.3757 ] ] +[ [ -0.9210 -0.0940 0.3757 ] ] +[ [ -0.9054 -0.2737 0.3233 ] ] +[ [ -0.8752 -0.4292 0.2219 ] ] +[ [ -0.8331 -0.5459 0.0809 ] ] +[ [ -0.7926 -0.5758 -0.1950 ] ] +[ [ -0.9877 0.1564 0.0000 ] ] +[ [ -0.9877 -0.1564 0.0000 ] ] +[ [ -0.9118 0.1444 -0.3824 ] ] +[ [ -0.9118 -0.1444 -0.3824 ] ] +[ [ 0.8225 0.4190 -0.3825 ] ] +[ [ 0.8910 0.4540 0.0000 ] ] +[ [ 0.9282 0.3606 0.0817 ] ] +[ [ 0.9565 0.2508 0.1438 ] ] +[ [ 0.9743 0.1287 0.1828 ] ] +[ [ 0.9799 -0.0000 0.1949 ] ] +[ [ 0.9743 -0.1287 0.1828 ] ] +[ [ 0.9565 -0.2508 0.1437 ] ] +[ [ 0.9282 -0.3606 0.0817 ] ] +[ [ 0.8910 -0.4540 0.0000 ] ] +[ [ 0.8225 -0.4191 -0.3825 ] ] +[ [ 0.6527 0.6527 -0.3825 ] ] +[ [ 0.7071 0.7071 0.0000 ] ] +[ [ 0.7564 0.6149 0.2206 ] ] +[ [ 0.7962 0.4535 0.3990 ] ] +[ [ 0.8221 0.2404 0.5148 ] ] +[ [ 0.8312 0.0000 0.5554 ] ] +[ [ 0.8221 -0.2404 0.5148 ] ] +[ [ 0.7962 -0.4535 0.3990 ] ] +[ [ 0.7564 -0.6149 0.2206 ] ] +[ [ 0.7071 -0.7071 0.0000 ] ] +[ [ 0.6527 -0.6527 -0.3825 ] ] +[ [ 0.4192 0.8226 -0.3826 ] ] +[ [ 0.4540 0.8910 0.0000 ] ] +[ [ 0.4932 0.8072 0.3215 ] ] +[ [ 0.5260 0.6110 0.5905 ] ] +[ [ 0.5477 0.3286 0.7685 ] ] +[ [ 0.5553 0.0000 0.8310 ] ] +[ [ 0.5477 -0.3286 0.7685 ] ] +[ [ 0.5260 -0.6110 0.5905 ] ] +[ [ 0.4932 -0.8072 0.3216 ] ] +[ [ 0.4540 -0.8910 0.0000 ] ] +[ [ 0.4192 -0.8226 -0.3826 ] ] +[ [ 0.1444 0.9119 -0.3826 ] ] +[ [ 0.1565 0.9877 0.0000 ] ] +[ [ 0.1713 0.9099 0.3754 ] ] +[ [ 0.1838 0.6957 0.6933 ] ] +[ [ 0.1922 0.3764 0.9059 ] ] +[ [ 0.1951 0.0000 0.9804 ] ] +[ [ 0.1922 -0.3764 0.9059 ] ] +[ [ 0.1838 -0.6957 0.6933 ] ] +[ [ 0.1713 -0.9099 0.3754 ] ] +[ [ 0.1564 -0.9877 0.0000 ] ] +[ [ 0.1444 -0.9119 -0.3826 ] ] +[ [ -0.1444 0.9117 -0.3826 ] ] +[ [ -0.1564 0.9877 -0.0001 ] ] +[ [ -0.1711 0.9100 0.3754 ] ] +[ [ -0.1836 0.6959 0.6936 ] ] +[ [ -0.1918 0.3763 0.9056 ] ] +[ [ -0.1948 0.0000 0.9800 ] ] +[ [ -0.1919 -0.3763 0.9056 ] ] +[ [ -0.1836 -0.6959 0.6936 ] ] +[ [ -0.1711 -0.9100 0.3754 ] ] +[ [ -0.1564 -0.9877 -0.0001 ] ] +[ [ -0.1444 -0.9117 -0.3826 ] ] +[ [ -0.4191 0.8225 -0.3826 ] ] +[ [ -0.4540 0.8910 -0.0001 ] ] +[ [ -0.4931 0.8073 0.3216 ] ] +[ [ -0.5259 0.6109 0.5904 ] ] +[ [ -0.5476 0.3285 0.7685 ] ] +[ [ -0.5551 0.0000 0.8311 ] ] +[ [ -0.5475 -0.3286 0.7685 ] ] +[ [ -0.5258 -0.6109 0.5904 ] ] +[ [ -0.4931 -0.8073 0.3216 ] ] +[ [ -0.4540 -0.8910 -0.0001 ] ] +[ [ -0.4191 -0.8225 -0.3826 ] ] +[ [ -0.6529 0.6529 -0.3825 ] ] +[ [ -0.7071 0.7071 0.0000 ] ] +[ [ -0.7561 0.6147 0.2205 ] ] +[ [ -0.7960 0.4537 0.3995 ] ] +[ [ -0.8218 0.2405 0.5152 ] ] +[ [ -0.8306 0.0000 0.5551 ] ] +[ [ -0.8218 -0.2405 0.5152 ] ] +[ [ -0.7960 -0.4537 0.3995 ] ] +[ [ -0.7562 -0.6147 0.2205 ] ] +[ [ -0.7071 -0.7071 0.0000 ] ] +[ [ -0.6529 -0.6529 -0.3825 ] ] +[ [ -0.8228 0.4191 -0.3824 ] ] +[ [ -0.8910 0.4540 0.0000 ] ] +[ [ -0.9283 0.3608 0.0818 ] ] +[ [ -0.9567 0.2511 0.1442 ] ] +[ [ -0.9739 0.1285 0.1822 ] ] +[ [ -0.9797 -0.0000 0.1949 ] ] +[ [ -0.9739 -0.1286 0.1822 ] ] +[ [ -0.9567 -0.2511 0.1442 ] ] +[ [ -0.9283 -0.3608 0.0818 ] ] +[ [ -0.8910 -0.4540 0.0000 ] ] +[ [ -0.8228 -0.4191 -0.3824 ] ] +[ [ -0.9322 0.3029 -0.1949 ] ] +[ [ -0.9799 0.0000 -0.1949 ] ] +[ [ -0.9322 -0.3029 -0.1949 ] ] +[ [ 0.0000 1.0000 0.0000 ] ] +[ [ -0.5878 0.8090 -0.0001 ] ] +[ [ 0.0000 -1.0000 0.0000 ] ] +[ [ -0.5878 -0.8090 -0.0001 ] ] +[ [ -0.8818 0.2865 -0.3746 ] ] +[ [ -0.8818 -0.2865 -0.3746 ] ] +[ [ 0.5862 0.5862 -0.5592 ] ] +[ [ 0.4156 0.5721 -0.7071 ] ] +[ [ 0.3764 0.7387 -0.5592 ] ] +[ [ 0.2185 0.6725 -0.7071 ] ] +[ [ -0.2185 0.6725 -0.7071 ] ] +[ [ -0.3764 0.7387 -0.5592 ] ] +[ [ -0.4156 0.5721 -0.7071 ] ] +[ [ -0.5862 0.5862 -0.5592 ] ] +[ [ -0.5721 0.4156 -0.7071 ] ] +[ [ -0.7387 0.3764 -0.5592 ] ] +[ [ -0.6725 0.2185 -0.7071 ] ] +[ [ -0.8188 0.1297 -0.5592 ] ] +[ [ -0.9272 0.0000 -0.3746 ] ] +[ [ -0.7071 0.0000 -0.7071 ] ] +[ [ -0.8188 -0.1297 -0.5592 ] ] +[ [ -0.6725 -0.2185 -0.7071 ] ] +[ [ -0.7387 -0.3764 -0.5592 ] ] +[ [ -0.5721 -0.4156 -0.7071 ] ] +[ [ -0.5862 -0.5862 -0.5592 ] ] +[ [ -0.4156 -0.5721 -0.7071 ] ] +[ [ -0.3764 -0.7387 -0.5592 ] ] +[ [ -0.2185 -0.6725 -0.7071 ] ] +[ [ 0.2185 -0.6725 -0.7071 ] ] +[ [ 0.3764 -0.7387 -0.5592 ] ] +[ [ 0.4156 -0.5721 -0.7071 ] ] +[ [ 0.5862 -0.5862 -0.5592 ] ] + +[ [0.493036 -0.845192 -0.206315 ] ] +[ [0.597512 -0.801748 -0.013434 ] ] +[ [0.679881 -0.712459 0.173681 ] ] +[ [0.724358 -0.594140 0.349718 ] ] +[ [0.709707 -0.455275 0.537625 ] ] +[ [0.640037 -0.295728 0.709152 ] ] +[ [0.522688 -0.157829 0.837787 ] ] +[ [0.371126 -0.000000 0.928582 ] ] +[ [0.156055 0.157588 0.975096 ] ] +[ [0.677071 -0.721919 -0.142855 ] ] +[ [0.778948 -0.625885 0.038831 ] ] +[ [0.843449 -0.479905 0.241425 ] ] +[ [0.844860 -0.325172 0.424823 ] ] +[ [0.783190 -0.157748 0.601440 ] ] +[ [0.672968 -0.000000 0.739672 ] ] +[ [0.522688 0.157829 0.837787 ] ] +[ [0.298673 0.311852 0.901966 ] ] +[ [0.864664 -0.495241 -0.084216 ] ] +[ [0.931822 -0.353641 0.081521 ] ] +[ [0.945029 -0.176918 0.274991 ] ] +[ [0.891074 -0.000000 0.453859 ] ] +[ [0.783190 0.157748 0.601440 ] ] +[ [0.640037 0.295728 0.709152 ] ] +[ [0.438015 0.440370 0.783720 ] ] +[ [0.983602 -0.170758 -0.058041 ] ] +[ [0.995357 -0.000000 0.096253 ] ] +[ [0.945029 0.176918 0.274991 ] ] +[ [0.844860 0.325172 0.424823 ] ] +[ [0.709707 0.455275 0.537625 ] ] +[ [0.536716 0.571978 0.620304 ] ] +[ [0.980650 -0.000000 -0.195768 ] ] +[ [0.983602 0.170758 -0.058041 ] ] +[ [0.931822 0.353641 0.081521 ] ] +[ [0.843449 0.479905 0.241425 ] ] +[ [0.724358 0.594140 0.349718 ] ] +[ [0.608789 0.641926 0.466162 ] ] +[ [0.864664 0.495241 -0.084216 ] ] +[ [0.778948 0.625885 0.038831 ] ] +[ [0.679881 0.712459 0.173681 ] ] +[ [0.568276 0.760136 0.315049 ] ] +[ [0.464888 0.750251 0.470110 ] ] +[ [0.367843 0.684587 0.629311 ] ] +[ [0.252165 0.603000 0.756838 ] ] +[ [0.107650 0.471076 0.875499 ] ] +[ [-0.061439 0.266249 0.961944 ] ] +[ [0.677071 0.721919 -0.142855 ] ] +[ [0.597512 0.801748 -0.013434 ] ] +[ [0.497066 0.858682 0.124862 ] ] +[ [0.393944 0.875684 0.279257 ] ] +[ [0.292585 0.841828 0.453563 ] ] +[ [0.184702 0.770569 0.610007 ] ] +[ [0.057486 0.673822 0.736654 ] ] +[ [-0.112557 0.484806 0.867349 ] ] +[ [0.493036 0.845192 -0.206315 ] ] +[ [0.410305 0.910038 -0.058990 ] ] +[ [0.307136 0.946394 0.100034 ] ] +[ [0.213934 0.939006 0.269259 ] ] +[ [0.122917 0.892969 0.433011 ] ] +[ [0.005479 0.810665 0.585484 ] ] +[ [-0.151736 0.673901 0.723072 ] ] +[ [0.283596 0.928270 -0.240599 ] ] +[ [0.195835 0.977467 -0.078784 ] ] +[ [0.113086 0.989155 0.093727 ] ] +[ [0.036218 0.965298 0.258629 ] ] +[ [-0.050974 0.904182 0.424095 ] ] +[ [-0.175716 0.815924 0.550810 ] ] +[ [0.155380 0.910235 -0.383834 ] ] +[ [0.099090 0.965936 -0.239058 ] ] +[ [0.006833 0.995513 -0.094374 ] ] +[ [-0.070625 0.994185 0.081287 ] ] +[ [-0.134731 0.957487 0.255081 ] ] +[ [-0.206393 0.895163 0.395077 ] ] +[ [0.062318 0.850387 -0.522455 ] ] +[ [-0.175349 0.980312 -0.090784 ] ] +[ [-0.254293 0.961376 0.105313 ] ] +[ [-0.319869 0.905566 0.278630 ] ] +[ [-0.342699 0.822209 0.454455 ] ] +[ [-0.357299 0.695961 0.622877 ] ] +[ [-0.339292 0.522737 0.782066 ] ] +[ [-0.293276 0.293857 0.909746 ] ] +[ [-0.195468 -0.000000 0.980710 ] ] +[ [-0.040626 0.780264 -0.624129 ] ] +[ [-0.329113 0.920352 -0.211276 ] ] +[ [-0.347579 0.936334 -0.049671 ] ] +[ [-0.440340 0.885907 0.145839 ] ] +[ [-0.484620 0.807838 0.335473 ] ] +[ [-0.508099 0.681838 0.526243 ] ] +[ [-0.502783 0.513679 0.695229 ] ] +[ [-0.475193 0.296291 0.828495 ] ] +[ [-0.373892 -0.000000 0.927472 ] ] +[ [-0.145039 0.703789 -0.695446 ] ] +[ [-0.244216 0.765895 -0.594780 ] ] +[ [-0.361419 0.808718 -0.464061 ] ] +[ [-0.406290 0.850872 -0.333084 ] ] +[ [-0.468307 0.864784 -0.181210 ] ] +[ [-0.543989 0.839033 0.009979 ] ] +[ [-0.623733 0.755698 0.199693 ] ] +[ [-0.650544 0.652514 0.388610 ] ] +[ [-0.658233 0.490190 0.571352 ] ] +[ [-0.625431 0.283066 0.727124 ] ] +[ [-0.707115 -0.000000 0.707098 ] ] +[ [-0.305164 0.673556 -0.673199 ] ] +[ [-0.398662 0.713612 -0.576043 ] ] +[ [-0.512372 0.737894 -0.439304 ] ] +[ [-0.554919 0.772286 -0.309255 ] ] +[ [-0.641865 0.754437 -0.137239 ] ] +[ [-0.736460 0.674873 0.046615 ] ] +[ [-0.794904 0.557165 0.240198 ] ] +[ [-0.800356 0.421883 0.425964 ] ] +[ [-0.772064 0.231981 0.591694 ] ] +[ [-0.469292 0.603952 -0.644210 ] ] +[ [-0.559860 0.619536 -0.550211 ] ] +[ [-0.672202 0.618047 -0.407630 ] ] +[ [-0.701375 0.656479 -0.277685 ] ] +[ [-0.838981 0.534000 -0.104671 ] ] +[ [-0.907198 0.412317 0.083592 ] ] +[ [-0.927233 0.258836 0.270634 ] ] +[ [-0.889324 0.147390 0.432873 ] ] +[ [-0.827443 -0.000000 0.561550 ] ] +[ [-0.587617 0.507623 -0.630100 ] ] +[ [-0.690009 0.492157 -0.530726 ] ] +[ [-0.804255 0.449289 -0.388989 ] ] +[ [-0.903322 0.383343 -0.192502 ] ] +[ [-0.955698 0.287189 -0.064524 ] ] +[ [-0.985598 0.136690 0.099565 ] ] +[ [-0.962053 -0.000000 0.272863 ] ] +[ [-0.889324 -0.147390 0.432873 ] ] +[ [-0.772064 -0.231981 0.591694 ] ] +[ [-0.625431 -0.283066 0.727124 ] ] +[ [-0.475193 -0.296291 0.828495 ] ] +[ [-0.293276 -0.293857 0.909746 ] ] +[ [-0.061439 -0.266249 0.961944 ] ] +[ [-0.715066 0.382047 -0.585424 ] ] +[ [-0.798298 0.321096 -0.509526 ] ] +[ [-0.906494 0.255313 -0.336281 ] ] +[ [-0.965956 0.122179 -0.228039 ] ] +[ [-0.995511 -0.000000 -0.094641 ] ] +[ [-0.985598 -0.136690 0.099565 ] ] +[ [-0.927233 -0.258836 0.270634 ] ] +[ [-0.800356 -0.421883 0.425964 ] ] +[ [-0.658233 -0.490190 0.571352 ] ] +[ [-0.502783 -0.513679 0.695229 ] ] +[ [-0.339292 -0.522737 0.782066 ] ] +[ [-0.112557 -0.484806 0.867349 ] ] +[ [-0.778916 0.211076 -0.590539 ] ] +[ [-0.855097 0.126131 -0.502892 ] ] +[ [-0.923115 -0.000000 -0.384524 ] ] +[ [-0.965956 -0.122179 -0.228039 ] ] +[ [-0.955698 -0.287189 -0.064524 ] ] +[ [-0.907198 -0.412317 0.083592 ] ] +[ [-0.794904 -0.557165 0.240198 ] ] +[ [-0.650544 -0.652514 0.388610 ] ] +[ [-0.508099 -0.681838 0.526243 ] ] +[ [-0.357299 -0.695961 0.622877 ] ] +[ [-0.151736 -0.673901 0.723072 ] ] +[ [-0.855097 -0.126131 -0.502892 ] ] +[ [-0.906494 -0.255313 -0.336281 ] ] +[ [-0.903322 -0.383343 -0.192502 ] ] +[ [-0.838981 -0.534000 -0.104671 ] ] +[ [-0.736460 -0.674873 0.046615 ] ] +[ [-0.623733 -0.755698 0.199693 ] ] +[ [-0.484620 -0.807838 0.335473 ] ] +[ [-0.342699 -0.822209 0.454455 ] ] +[ [-0.175716 -0.815924 0.550810 ] ] +[ [-0.778916 -0.211076 -0.590539 ] ] +[ [-0.798298 -0.321096 -0.509526 ] ] +[ [-0.804255 -0.449289 -0.388989 ] ] +[ [-0.701375 -0.656479 -0.277685 ] ] +[ [-0.641865 -0.754437 -0.137239 ] ] +[ [-0.543989 -0.839033 0.009979 ] ] +[ [-0.440340 -0.885907 0.145839 ] ] +[ [-0.319869 -0.905566 0.278630 ] ] +[ [-0.206393 -0.895163 0.395077 ] ] +[ [-0.715066 -0.382047 -0.585424 ] ] +[ [-0.690009 -0.492157 -0.530726 ] ] +[ [-0.672202 -0.618047 -0.407630 ] ] +[ [-0.554919 -0.772286 -0.309255 ] ] +[ [-0.468307 -0.864784 -0.181210 ] ] +[ [-0.347579 -0.936334 -0.049671 ] ] +[ [-0.254293 -0.961376 0.105313 ] ] +[ [-0.134731 -0.957487 0.255081 ] ] +[ [-0.050974 -0.904182 0.424095 ] ] +[ [0.005479 -0.810665 0.585484 ] ] +[ [0.057486 -0.673822 0.736654 ] ] +[ [0.107650 -0.471076 0.875499 ] ] +[ [0.156055 -0.157588 0.975096 ] ] +[ [-0.587617 -0.507623 -0.630100 ] ] +[ [-0.559860 -0.619536 -0.550211 ] ] +[ [-0.512372 -0.737894 -0.439304 ] ] +[ [-0.406290 -0.850872 -0.333084 ] ] +[ [-0.329113 -0.920352 -0.211276 ] ] +[ [-0.175349 -0.980312 -0.090784 ] ] +[ [-0.070625 -0.994185 0.081287 ] ] +[ [0.036218 -0.965298 0.258629 ] ] +[ [0.122917 -0.892969 0.433011 ] ] +[ [0.184702 -0.770569 0.610007 ] ] +[ [0.252165 -0.603000 0.756838 ] ] +[ [0.298673 -0.311852 0.901966 ] ] +[ [-0.469292 -0.603952 -0.644210 ] ] +[ [-0.398662 -0.713612 -0.576043 ] ] +[ [-0.361419 -0.808718 -0.464061 ] ] +[ [0.006833 -0.995513 -0.094374 ] ] +[ [0.113086 -0.989155 0.093727 ] ] +[ [0.213934 -0.939006 0.269259 ] ] +[ [0.292585 -0.841828 0.453563 ] ] +[ [0.367843 -0.684587 0.629311 ] ] +[ [0.438015 -0.440370 0.783720 ] ] +[ [-0.305164 -0.673556 -0.673199 ] ] +[ [-0.244216 -0.765895 -0.594780 ] ] +[ [0.099090 -0.965936 -0.239058 ] ] +[ [0.195835 -0.977467 -0.078784 ] ] +[ [0.307136 -0.946394 0.100034 ] ] +[ [0.393944 -0.875684 0.279257 ] ] +[ [0.464888 -0.750251 0.470110 ] ] +[ [0.536716 -0.571978 0.620304 ] ] +[ [-0.145039 -0.703789 -0.695446 ] ] +[ [-0.040626 -0.780264 -0.624129 ] ] +[ [0.062318 -0.850387 -0.522455 ] ] +[ [0.155380 -0.910235 -0.383834 ] ] +[ [0.283596 -0.928270 -0.240599 ] ] +[ [0.410305 -0.910038 -0.058990 ] ] +[ [0.497066 -0.858682 0.124862 ] ] +[ [0.568276 -0.760136 0.315049 ] ] +[ [0.608789 -0.641926 0.466162 ] ] +[ [0.281392 -0.875696 -0.392396 ] ] +[ [0.406826 -0.813413 -0.415754 ] ] +[ [0.207525 -0.822538 -0.529495 ] ] +[ [0.106439 -0.766941 -0.632828 ] ] +[ [-0.010819 -0.694960 -0.718967 ] ] +[ [0.486435 -0.725452 -0.486929 ] ] +[ [0.328944 -0.759181 -0.561641 ] ] +[ [0.238562 -0.723446 -0.647854 ] ] +[ [0.120291 -0.678108 -0.725052 ] ] +[ [0.574161 -0.619910 -0.534838 ] ] +[ [0.430480 -0.673544 -0.600854 ] ] +[ [0.337571 -0.653161 -0.677810 ] ] +[ [0.235131 -0.614410 -0.753136 ] ] +[ [0.660877 -0.499438 -0.560181 ] ] +[ [0.478986 -0.574758 -0.663495 ] ] +[ [0.384784 -0.573859 -0.722929 ] ] +[ [0.660877 0.499438 -0.560181 ] ] +[ [0.478986 0.574758 -0.663495 ] ] +[ [0.384784 0.573859 -0.722929 ] ] +[ [0.574161 0.619910 -0.534838 ] ] +[ [0.430480 0.673544 -0.600854 ] ] +[ [0.337571 0.653161 -0.677810 ] ] +[ [0.235131 0.614410 -0.753136 ] ] +[ [0.486435 0.725452 -0.486929 ] ] +[ [0.328944 0.759181 -0.561641 ] ] +[ [0.238562 0.723446 -0.647854 ] ] +[ [0.120291 0.678108 -0.725052 ] ] +[ [0.406826 0.813413 -0.415754 ] ] +[ [0.281392 0.875696 -0.392396 ] ] +[ [0.207525 0.822538 -0.529495 ] ] +[ [0.106439 0.766941 -0.632828 ] ] +[ [-0.010819 0.694960 -0.718967 ] ] + +[ [ 0.5429 -0.7472 -0.3826 ] ] +[ [ 0.8919 -0.3553 0.2783 ] ] +[ [ 0.6979 -0.2888 0.6542 ] ] +[ [ 0.3826 0.0000 0.9233 ] ] +[ [ 0.9511 -0.3091 0.0000 ] ] +[ [ 0.7067 0.0000 0.7067 ] ] +[ [ 0.3770 0.3581 0.8532 ] ] +[ [ 0.9230 0.0000 0.3824 ] ] +[ [ 0.6979 0.2888 0.6542 ] ] +[ [ 0.9511 0.3090 0.0001 ] ] +[ [ 0.8919 0.3553 0.2783 ] ] +[ [ 0.6726 0.5399 0.5043 ] ] +[ [ 0.6343 0.7210 0.2764 ] ] +[ [ 0.3373 0.8709 0.3549 ] ] +[ [ 0.3612 0.6638 0.6545 ] ] +[ [ 0.0002 0.3824 0.9231 ] ] +[ [ 0.5429 0.7472 -0.3826 ] ] +[ [ 0.5878 0.8090 0.0000 ] ] +[ [ 0.3090 0.9511 0.0000 ] ] +[ [ 0.0001 0.7066 0.7066 ] ] +[ [ -0.3767 0.3580 0.8534 ] ] +[ [ 0.0001 0.9237 0.3826 ] ] +[ [ -0.0001 0.9237 -0.3826 ] ] +[ [ 0.0000 1.0000 0.0000 ] ] +[ [ -0.3090 0.9511 -0.0001 ] ] +[ [-0.206393 0.895163 0.395077 ] ] +[ [ -0.6342 0.7211 0.2764 ] ] +[ [ -0.6724 0.5401 0.5045 ] ] +[ [ -0.2852 0.8777 -0.3826 ] ] +[ [ -0.5878 0.8090 -0.0001 ] ] +[ [ -0.6975 0.2889 0.6545 ] ] +[ [ -0.5429 0.7472 -0.3826 ] ] +[ [ -0.8918 0.3549 0.2776 ] ] +[ [ -0.7063 0.0000 0.7065 ] ] +[ [ -0.9511 0.3090 0.0000 ] ] +[ [-0.827443 -0.000000 0.561550 ] ] +[ [ -1.0000 0.0000 0.0000 ] ] +[ [ -0.8918 -0.3549 0.2776 ] ] +[ [ -0.9511 -0.3090 0.0000 ] ] +[ [ -0.6975 -0.2889 0.6545 ] ] +[ [ -0.3767 -0.3580 0.8534 ] ] +[ [ -0.6724 -0.5401 0.5045 ] ] +[ [ -0.5429 -0.7472 -0.3826 ] ] +[ [ -0.5878 -0.8090 -0.0001 ] ] +[ [ -0.6342 -0.7211 0.2764 ] ] +[ [-0.206393 -0.895163 0.395077 ] ] +[ [ -0.2852 -0.8777 -0.3826 ] ] +[ [ -0.3090 -0.9511 -0.0001 ] ] +[ [ 0.0001 -0.9237 0.3826 ] ] +[ [ 0.0001 -0.7066 0.7066 ] ] +[ [ 0.0002 -0.3824 0.9231 ] ] +[ [ 0.0000 -1.0000 0.0000 ] ] +[ [ 0.3612 -0.6638 0.6545 ] ] +[ [ 0.3770 -0.3581 0.8532 ] ] +[ [ -0.0001 -0.9237 -0.3826 ] ] +[ [ 0.3090 -0.9511 0.0000 ] ] +[ [ 0.3373 -0.8709 0.3549 ] ] +[ [ 0.5878 -0.8090 0.0000 ] ] +[ [ 0.6343 -0.7210 0.2764 ] ] +[ [ 0.6726 -0.5399 0.5043 ] ] +[ [ 0.486435 -0.725452 -0.486929 ] ] +[ [ 0.660877 -0.499438 -0.560181 ] ] +[ [ 0.660877 0.499438 -0.560181 ] ] +[ [ 0.486435 0.725452 -0.486929 ] ] diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/generate-loreta-epoch.sh b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/generate-loreta-epoch.sh new file mode 100644 index 0000000..f365e2b --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/generate-loreta-epoch.sh @@ -0,0 +1 @@ +./loreta.sh loreta-epoc.cfg AF3 F7 F3 FC5 T7/T3 P7/T5 O1 O2 P8/T6 T8/T4 FC6 F4 F8 AF4 diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/loreta-braincap-32.cfg b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/loreta-braincap-32.cfg new file mode 100644 index 0000000..95d439a --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/share/loreta-braincap-32.cfg @@ -0,0 +1,5 @@ + + 0.00010334046237404;1.9333696400281e-05;-0.00065965246176347;-6.639800267294e-05;-0.00032087875297293;-0.00015837796672713;8.6842019300093e-06;-0.00015511398669332;0.00010179345554207;9.3945509433979e-06;0.00091446767328307;-0.00010418820602354;-3.5370096156839e-05;-0.00028016677242704;-0.00040523216011934;-2.9102051485097e-05;-2.5156274205074e-05;-0.00047369848471135;-7.6330703450367e-05;0.00075276626739651;5.9262256399961e-05;0.0001365519274259;0.00030959551804699;-3.7053210689919e-05;0.00021870818454772;0.0002670117537491;0.00017666644998826;-0.0010885015362874;0.00016637839144096;0.00058647408150136;8.4791863628197e-05;-0.00013154320186004;2.0442364984774e-05;0.00011456904758234;-9.2895361376577e-06;0.00041327619692311;5.451254764921e-05;-0.00035270082298666;-7.5995638326276e-05;-9.9698801932391e-05;7.5737487350125e-05;0.00022542441729456;1.3538566236093e-05;0.00010051730350824;-1.2029700883431e-05;0.00071848841616884;-3.4433938708389e-05;3.2375672162743e-05;-7.4544557719491e-05;0.00022961938520893;-0.00010615887003951;5.453880658024e-05;4.6151548303897e-05;-0.0001338652218692;-0.00056716211838648;-3.5454249882605e-05;-0.00021819210087415;5.2601801144192e-05;0.00055306707508862;-1.2337039152044e-05;-0.00086225772975013;2.0802950530197e-05;-0.00021381852275226;0.00014065833238419;-0.00026387491379865;-0.00017133816436399;0.00087719288421795;-0.00026314347633161;0.00042705069063231;-0.00014121161075309;-4.0005548385125e-07;5.5305630667135e-05;0.0013313246890903;-0.00011067208833992;0.0010741309961304;-0.00013168880832382;-2.8908625608892e-05;-1.1484700735309e-05;0.000128459505504;-0.00031574242166243;-0.00021738844225183;9.920314187184e-05;0.00011383027595002;-0.00032726439530961;0.00051070743938908;-0.0011298053432256;0.00023797292669769;-0.00080119573976845;8.3070539403707e-05;-0.0011780939530581;7.3145121859852e-05;0.000111086977995;4.2892173951259e-05;0.00011753943545045;2.6206051188638e-05;-0.00061098381411284;-8.268282545032e-05;-0.0002834718034137;-0.00020848552230746;3.0343611797434e-05;-0.00017315166769549;0.00010146595013794;2.7357846192899e-05;0.00087875657482073;-0.00012236915063113;9.9047094408888e-05;-0.00033355245250277;-0.00037084610085003;-5.2117211453151e-05;-6.1047190683894e-05;-0.0005184433539398;-0.00010945172834909;0.00075732421828434;0.00010867491073441;0.00016580191731919;0.00034842864261009;-0.00010883561481023;0.00026173831429332;0.00017150763596874;0.00022292129870038;-0.0011065874714404;0.0001934984466061;0.00052234769100323;0.00010906628449447;-0.000100452285551;9.0809653556789e-06;0.0001101863454096;1.0746181942523e-05;0.00044438656186685;5.8280344092054e-05;-0.00033265637466684;-8.4541643445846e-05;-0.0001189288450405;7.6784584962297e-05;0.00023284238704946;1.7500758985989e-05;0.00013730218051933;-9.3975040726946e-06;0.00072957435622811;-2.5875066057779e-05;-8.1069820225821e-06;-8.3522267232183e-05;0.00025687966262922;-6.3564533775207e-05;6.9466885179281e-05;6.0949395219723e-07;-0.00014175463002175;-0.00061641342472285;-5.339060589904e-05;-0.00024112539540511;5.3648949688068e-05;0.00054623640608042;-4.9433920139563e-06;-0.00087914528558031;1.0292173101334e-05;-0.00022114193416201;0.0001403225469403;-0.00023019920627121;-0.00016550117288716;0.00092278327792883;-0.00024514013784938;0.00043184429523535;-0.00013438839232549;-5.9991157286277e-06;5.8030855143443e-05;0.0013378581497818;-9.5366252935492e-05;0.0010981111554429;-0.00010447262320668;-3.7492700357689e-06;-7.0446362769871e-06;0.0001173179334728;-0.00031100941123441;-0.00021699651551899;7.4508367106318e-05;0.0001204322616104;-0.00033903334406205;0.00050268956692889;-0.0011674849083647;0.00021108191867825;-0.00083459872985259;6.3543368014507e-05;-0.0011803522938862;5.6102238886524e-05;9.1161142336205e-05;3.6690791603178e-05;0.00013315575779416;2.8516387828859e-05;-0.00048424463602714;-9.0495319454931e-05;-0.00026025460101664;-0.00023868642165326;2.9504730264307e-05;-0.00017566536553204;9.1747897386085e-05;4.7747893404448e-05;0.00070434220833704;-0.0001302710006712;0.0002082022401737;-0.0003717054205481;-0.00029043058748357;-7.8070661402307e-05;-0.00010954772733385;-0.00052140816114843;-0.00013134241453372;0.00069937889929861;0.00015869908384047;0.00021312880562618;0.00034072564449161;-0.00013585838314611;0.0002845827548299;7.6760319643654e-05;0.00026082558906637;-0.00099137937650084;0.00021072491654195;0.00038976181531325;0.00013155513443053;-5.8253936003894e-05;-1.6378801319661e-06;8.2405429566279e-05;3.5185228625778e-05;0.00043360263225622;6.2378072470892e-05;-0.00027328889700584;-8.663791231811e-05;-0.00013397028669715;6.7890257923864e-05;0.00025110490969382;1.7638702047407e-05;0.00016018911264837;-4.6253135224106e-06;0.00066801178036258;-7.7284757935558e-06;-5.6233257055283e-05;-8.3084749348927e-05;0.00027467258041725;7.0651822170475e-06;7.682778959861e-05;-6.5264190197922e-05;-0.00014512269990519;-0.00062267854809761;-7.0432426582556e-05;-0.00023766381491441;4.6217421186157e-05;0.00047491907025687;7.5853440648643e-06;-0.00081134919309989;-7.7218701335369e-06;-0.00020578455587383;0.00012687371054199;-0.00017701284377836;-0.00014408974675462;0.00088371051242575;-0.00020082281844225;0.00040359227568842;-0.0001129006705014;-1.220937610924e-05;5.8586472732713e-05;0.001224601874128;-6.4740954258014e-05;0.0010427918750793;-5.8214001910528e-05;3.1329327612184e-05;-1.5554328456346e-06;8.8371154561173e-05;-0.00029248706414364;-0.00020751245028805;4.8767953558126e-05;0.0001252415968338;-0.00030944281024858;0.00045538382255472;-0.0010875648586079;0.0001550872111693;-0.00081387616228312;3.1032763217809e-05;-0.0010978118516505;2.7500600481289e-05;5.696387597709e-05;2.6190502467216e-05;0.00014007838035468;2.7093312382931e-05;-0.0003580879420042;-8.7663262092974e-05;-0.00024528105859645;-0.00023739911557641;2.3879414584371e-05;-0.00016332035011146;7.7801021689083e-05;5.7895376812667e-05;0.00051520054694265;-0.00012650826829486;0.00025537956389599;-0.00037592614535242;-0.00022160047956277;-9.0305300545879e-05;-0.00014165266475175;-0.00048335149767809;-0.00013370820670389;0.00061605253722519;0.00018123474728782;0.00023610709467903;0.00030145156779326;-0.00012771626643371;0.00027961973682977;2.0767665773747e-05;0.00026951485779136;-0.00083837658166885;0.00021149404346943;0.00027873125509359;0.0001385960058542;-2.6563155188342e-05;-6.732393103448e-06;4.5963410229888e-05;5.0171365728602e-05;0.00039317773189396;6.3917694205884e-05;-0.00021339193335734;-8.2472608482931e-05;-0.00013515316823032;5.3785195632372e-05;0.00027455590316094;1.5489828001591e-05;0.0001578451046953;2.6683403575589e-07;0.00057307782117277;9.9980161394342e-06;-8.62176384544e-05;-7.8903678513598e-05;0.00027438314282335;6.7940512963105e-05;7.5524374551605e-05;-0.0001125684575527;-0.00014026138524059;-0.00059116556076333;-7.8544304415118e-05;-0.00021095521515235;3.4879842132796e-05;0.00037596927722916;1.7303476852248e-05;-0.00069795100716874;-2.3369007976726e-05;-0.00018103640468325;0.00010924488015007;-0.00013213725469541;-0.00011862285464304;0.00078839645721018;-0.00015379623800982;0.00036263139918447;-8.8281973148696e-05;-1.4757446479052e-05;5.5057680583559e-05;0.0010679647093639;-3.6650664696936e-05;0.00093614112120122;-1.7557502360432e-05;4.6423443563981e-05;3.2706664114812e-06;6.0091773775639e-05;-0.00026418149354868;-0.00019265268929303;3.3935251849471e-05;0.00012105931091355;-0.00026477963547222;0.00039465943700634;-0.00094684807118028;0.00010178917727899;-0.00074638542719185;1.8585800489745e-06;-0.00098291330505162;2.6436159714649e-06;3.8866546674399e-05;1.6566858903388e-05;-6.3924155256245e-05;-0.00011665228521451;0.00021013176592533;0.00044609015458263;0.00033629484823905;0.00019691055058502;0.00018917115812656;2.6043750040117e-05;-3.3023574360413e-05;-0.00012685895489994;0.00018055536202155;-0.00066802924266085;0.00050312036182731;-0.00032092304900289;7.4144525569864e-05;0.00025517062749714;6.2340652220882e-05;0.00056901253992692;0.00012954670819454;-0.00023972387134563;-0.00062832044204697;-0.00034740584669635;-0.00029305534553714;-0.0004479211056605;0.00021315379126463;-0.00033494440140203;-1.4825855942036e-05;-0.00028845015913248;0.00099255715031177;-0.00013991673768032;-0.00032026891130954;-1.9240587789682e-05;1.9391800378799e-05;5.5696145864204e-05;8.2653175923042e-05;6.659309292445e-05;0.00033043336588889;-9.6123229013756e-05;-0.0003676823398564;7.2682261816226e-05;-0.00014748172543477;6.5946027461905e-05;5.3030737035442e-05;-1.6299636627082e-05;0.00013247776951175;-2.0406967450981e-05;0.00077607261482626;-0.00014732849376742;-0.0001466804969823;0.00032740840106271;0.00016803290054668;6.1907383496873e-05;-0.00019058336329181;1.37373990583e-05;-0.00014010469021741;-0.0004125063715037;8.207749488065e-05;-0.0002447530569043;7.8154380389606e-07;0.00056242960272357;7.3362969033042e-07;-0.00092289439635351;0.00012783432612196;-0.00017675157869235;-0.00015324608830269;-8.8924512965605e-05;-0.00022181271924637;0.0009349316242151;-7.8976489021443e-05;0.00043784751323983;5.705740841222e-05;-1.9372042515897e-05;-4.700992940343e-05;0.0010861676419154;-3.4101780329365e-05;0.0011147320037708;-7.1168674367073e-06;7.6218690082897e-05;2.5927134629455e-05;-0.00031550604035147;-0.00023140388657339;0.00019541390065569;2.9239088689792e-05;0.00044798766612075;-0.00031966474489309;0.00015825594891794;-0.00110705033876;9.1281826826162e-06;-0.00087046652333811;-6.2229173636297e-06;-0.0010470362612978;3.3327567507513e-05;-9.4058641479933e-06;-6.7227840190753e-05;-0.00012162721395725;0.00022013962734491;0.00058333849301562;0.0003573301655706;0.00019591570890043;0.00020988713367842;1.0954606295854e-05;-2.536518877605e-05;-0.00014611970982514;0.00019547868578229;-0.00087359431199729;0.00052056839922443;-0.00030915200477466;6.6186941694468e-05;0.00033727000118233;3.943637420889e-05;0.00063504365971312;0.00013727555051446;-0.00023140630219132;-0.00073856062954292;-0.00040935463039204;-0.00027065930771641;-0.00047451618593186;0.00025066261878237;-0.00034135111491196;-5.4532258218387e-05;-0.00030131803941913;0.001191827468574;-0.00013923172082286;-0.00044729906949215;-1.8719743820839e-05;-6.0263332670729e-06;4.6239070798038e-05;0.00012360728578642;7.143932452891e-05;0.00037187361158431;-0.00010114883480128;-0.00047062672092579;8.5569168732036e-05;-0.00014500755059998;7.0157475420274e-05;1.7471258615842e-05;-2.3604025045643e-05;0.00013432520790957;-3.8003156078048e-05;0.00092002068413422;-0.00012892603990622;-0.00016585146659054;0.00034488787059672;0.00017911488248501;8.1107809819514e-06;-0.00021015538368374;8.5297251644079e-05;-0.00013805573689751;-0.00044561622780748;9.5787472673692e-05;-0.0002760689239949;-7.407078101096e-06;0.00069663091562688;1.7294587451033e-05;-0.001092609600164;0.00015369484026451;-0.00020592458895408;-0.00018808792810887;-0.00012939980661031;-0.00029067700961605;0.0010723151499406;-0.00010870262485696;0.000508290133439;6.318111991277e-05;-1.9448003513389e-05;-8.5270803538151e-05;0.0012706218985841;-8.0887286458164e-05;0.0012715280754492;-1.1102639291494e-05;6.1511287640315e-05;4.7763402108103e-05;-0.00035626810858957;-0.00025731400819495;0.00021553650731221;4.4329368392937e-05;0.00053417432354763;-0.00038922348176129;0.00022899753821548;-0.0012869641650468;4.3316398659954e-05;-0.000979058095254;2.4690227292012e-05;-0.0012032447848469;4.1758750739973e-05;9.8643477031146e-06;-6.0636128182523e-05;-0.00011065838771174;0.00019822141621262;0.00067236315226182;0.00031930414843373;0.00018158211605623;0.00020222726743668;-7.63435036788e-06;-1.0081410437124e-05;-0.00014703533088323;0.00018233369337395;-0.00099616998340935;0.00046308015589602;-0.00022636084759142;4.3368061596993e-05;0.0004012651334051;2.585924903542e-06;0.00061466998886317;0.00011999417620245;-0.00017799677152652;-0.00077049946412444;-0.00041438351036049;-0.00020080886315554;-0.00043226094567217;0.00024387873418164;-0.00029409272246994;-0.00011580179125303;-0.00027294983738102;0.0012639372143894;-0.00011551778152352;-0.000555923092179;-1.2837703252444e-05;-3.8464786484838e-05;2.6200839783996e-05;0.00015106546925381;6.8979279603809e-05;0.00036276128957979;-9.1601519670803e-05;-0.00053430575644597;8.6343352450058e-05;-0.0001183056665468;6.5555810579099e-05;-1.7687641957309e-05;-2.7538982976694e-05;0.00010839101014426;-5.1896884542657e-05;0.00096093199681491;-8.6179381469265e-05;-0.00016731876530685;0.00031846691854298;0.00016710053023417;-5.5281929235207e-05;-0.00020599998242687;0.00016426539514214;-0.0001163971319329;-0.0004190482723061;9.6327763458248e-05;-0.00026719106244855;-1.7254915292142e-05;0.00075405108509585;3.3636650186963e-05;-0.0011367669794708;0.00016376553685404;-0.00021215128072072;-0.00020349996339064;-0.00016339153808076;-0.00033373100450262;0.0010817294241861;-0.00012850247730967;0.00052746012806892;6.1278202338144e-05;-1.533094291517e-05;-0.00011979495320702;0.0013194304192439;-0.00012595171574503;0.0012846641475335;-1.4340618690767e-05;2.5681354600238e-05;6.6583721491043e-05;-0.00035775569267571;-0.00025656245998107;0.00020929452148266;6.20416685706e-05;0.00056635175133124;-0.00041800749022514;0.00028335067327134;-0.0013193448539823;7.7456039434765e-05;-0.00097168097272515;5.7856748753693e-05;-0.0012346515432;4.6715067583136e-05;4.1038074414246e-05;-4.6347384341061e-05;-8.5002269770484e-05;0.00015366326260846;0.00062549987342209;0.00023385233362205;0.00016866976511665;0.00016417367442045;7.9439523688052e-06;1.5089733551577e-06;-0.0001265255123144;0.00014287314843386;-0.00090522377286106;0.00035539915552363;-0.00010473210568307;2.2637606889475e-05;0.00036907370667905;-2.546183168306e-05;0.00050482281949371;8.1445621617604e-05;-0.00011097728565801;-0.00067182100610808;-0.00033735384931788;-0.00014581113646273;-0.00033453851938248;0.00017603114247322;-0.00021725134865846;-0.00016192620387301;-0.00021203851792961;0.0010900582419708;-8.3877828728873e-05;-0.00052876479458064;-5.5433574743802e-06;-5.3595016652253e-05;9.6577750809956e-06;0.00015488582721446;5.8448244089959e-05;0.00028898863820359;-6.8906898377463e-05;-0.00049594597658142;7.3530587542336e-05;-8.4612671344075e-05;5.278756361804e-05;-5.7165772886947e-05;-2.5152465241263e-05;7.1947164542507e-05;-5.2847564802505e-05;0.0008475900394842;-4.9808182666311e-05;-0.00013892937568016;0.00025384494801983;0.00013700922136195;-9.1941816208418e-05;-0.00017951858171728;0.00019682689162437;-8.6587897385471e-05;-0.00032226787880063;8.1497855717316e-05;-0.00022109302517492;-2.0942263290635e-05;0.0006945148925297;3.8403733924497e-05;-0.0010050747077912;0.00014442444080487;-0.00018032285152003;-0.00018386838200968;-0.00015785775030963;-0.00031308940378949;0.00092609488638118;-0.00012154742580606;0.00045766794937663;5.2732611948159e-05;-1.0666594789654e-05;-0.0001215802913066;0.0011419730726629;-0.00013577108620666;0.0011139238486066;-1.597570553713e-05;1.1404438737372e-05;6.3953943026718e-05;-0.00031509707332589;-0.00022192600590643;0.00018254465248901;6.5136431658175e-05;0.00050462945364416;-0.00036290666321293;0.00027414155192673;-0.0011387954000384;8.8438537204638e-05;-0.00083358172560111;6.9077832449693e-05;-0.0010679215192795;4.4282634917181e-05;4.0481634641765e-05;0.0001433774450561;1.0599327652017e-05;-0.00069877220084891;-5.4792610171717e-05;-0.00034117276663892;-0.00017829195712693;8.3661732787732e-05;-0.00015972135588527;0.00010702521103667;1.403164446856e-06;0.00094502081628889;-0.00010911228309851;7.2297671067645e-06;-0.00028985357494093;-0.00051155936671421;-2.1094221665408e-05;-6.0009791923221e-05;-0.00049082865007222;-9.7655800345819e-05;0.00082168378867209;6.8384208134376e-05;9.2599373601843e-05;0.00034639681689441;-3.1175630283542e-05;0.00022390292724594;0.00026776720187627;0.00018044783791993;-0.0012240257347003;0.00017995125381276;0.00070910213980824;7.9512952652294e-05;-0.00015900128346402;2.7879865228897e-05;1.4789639863011e-05;-1.4217806892702e-05;0.00048907898599282;5.9412981499918e-05;-0.00034995161695406;-9.779760875972e-05;-9.2205897090025e-05;6.8045847001486e-05;0.00048663758207113;7.0139758463483e-06;9.0094566985499e-05;-1.5373259884655e-05;0.00066579948179424;-2.0746238078573e-05;6.8825589551125e-05;-0.00010058208135888;0.00025606871349737;-3.8451944419648e-05;2.4321494493051e-05;-2.1024427041993e-05;-0.00010159853263758;-0.00071904208743945;-2.5831608581939e-05;-0.00018044294847641;4.7730758524267e-05;0.00039529675268568;-8.3000004451605e-06;-0.00077199010411277;1.5561210602755e-05;-0.00024386279983446;0.00015565851936117;-0.00031822026357986;-0.00017995997040998;0.00087256188271567;-0.00026552195777185;0.00046743152779527;-0.00014201944577508;8.4359871834749e-06;4.6901324822102e-05;0.0014778896002099;-0.00012317439541221;0.0010638978565112;-0.00013599368685391;-0.00011017119686585;-3.2653804282745e-06;0.00015722207899671;-0.00030681202770211;-0.00022736951359548;0.00012521204189397;8.6559011833742e-05;-0.00036417663795874;0.00053125520935282;-0.0011565481545404;0.000256165250903;-0.00077519763726741;7.5841300713364e-05;-0.0013029139954597;7.8307624789886e-05;0.00021104309416842;4.0824867028277e-05;0.00015931598318275;1.6850812244229e-05;-0.00061569741228595;-6.870071956655e-05;-0.00029374324367382;-0.00022467430972029;0.00012021770089632;-0.00016687471361365;0.00010030351404566;1.7139869669336e-05;0.00084159657126293;-0.0001234616356669;0.00015648413682356;-0.0003280786331743;-0.00046380786807276;-4.0487862861482e-05;-9.9107463029213e-05;-0.00051094620721415;-0.00013447097444441;0.00078749476233497;0.00011966474994551;0.00011330304550938;0.00037306486046873;-8.3059203461744e-05;0.00025716467644088;0.00014562028809451;0.00021608207316604;-0.001191895455122;0.00020047838916071;0.00062363169854507;9.6592586487532e-05;-0.00010862536146306;9.5041168606258e-06;-1.4651810488431e-05;9.3487542471848e-06;0.0005037528462708;5.7331715652253e-05;-0.00030675929156132;-0.00010580232628854;-0.00010135565389646;6.364948785631e-05;0.00049978541210294;1.4159287275106e-05;0.00013198904343881;-1.090147816285e-05;0.00062680256087333;-8.9701170509215e-06;2.243725975859e-05;-0.00012135787983425;0.00026694877305999;3.1373860110762e-05;3.9068512705853e-05;-7.1866845246404e-05;-8.8946566393133e-05;-0.00075140025001019;-4.532059392659e-05;-0.00019309303024784;4.5973200030858e-05;0.00033236228046007;-1.7353352177452e-06;-0.00072706595528871;3.3654200706223e-06;-0.00024442721041851;0.00014822503726464;-0.00026499360683374;-0.00016305407916661;0.0008714369032532;-0.00023012718884274;0.00044904282549396;-0.00012595563021023;4.5044575927022e-06;4.4489825086202e-05;0.0014244684716687;-0.00010123016545549;0.0010200985707343;-0.00010017159365816;-9.5142000645865e-05;2.4441753794235e-06;0.00014101904525887;-0.00027431678608991;-0.00021142017794773;8.9844506874215e-05;8.0881349276751e-05;-0.00036582502070814;0.00049005181062967;-0.0011431183665991;0.00021512796229217;-0.00075247196946293;5.0147140427725e-05;-0.0012446072651073;5.5630538554396e-05;0.00019704214355443;3.2406456739409e-05;0.00016756790864747;2.2049513063394e-05;-0.00048401652020402;-7.8801305789966e-05;-0.00027092348318547;-0.00024802153347991;0.0001122090179706;-0.00016419570602011;8.7885928223841e-05;3.5125958675053e-05;0.00065238226670772;-0.00013057426258456;0.00024949226644821;-0.00035759987076744;-0.00037023905315436;-6.2885257648304e-05;-0.00013845355715603;-0.00050217570969835;-0.00015115443966351;0.00071090005803853;0.00016544086975046;0.00016149187285919;0.00035428020055406;-9.2950540420134e-05;0.00027597005828284;5.2705359848915e-05;0.00024634908186272;-0.0010511248838156;0.00021415969240479;0.00048082711873576;0.00011427892604843;-5.4365613323171e-05;-5.4972033467493e-06;-3.6745597753907e-05;3.3689073461574e-05;0.00047121304669417;5.8038800489157e-05;-0.00025007166550495;-0.00010422245395603;-0.00011122602882097;5.4926829761826e-05;0.00047202105633914;1.8415052181808e-05;0.00015633435396012;-3.7463532862603e-06;0.00056775048142299;6.6777720348909e-06;-3.1521736673312e-05;-0.00012871412036475;0.00027164339553565;0.00010015157022281;5.4425752750831e-05;-0.00011440756497905;-8.8257322204299e-05;-0.00072247325442731;-6.5217514929827e-05;-0.00019377333228476;3.8558075175388e-05;0.00027676086756401;7.3956571213785e-06;-0.00066442048409954;-1.3341586964088e-05;-0.00022366749180946;0.00013107869017404;-0.00020280011813156;-0.00013833372213412;0.00081971473991871;-0.00018359265231993;0.00041167307063006;-0.00010274363012286;-1.2048604958181e-06;4.4404561776901e-05;0.0012838301481679;-6.8142726377118e-05;0.00095104915089905;-5.4254622227745e-05;-5.8489891671343e-05;6.1440932768164e-06;0.00010901171481237;-0.0002491956402082;-0.00019772998348344;5.9561181842582e-05;8.4510043961927e-05;-0.00033017690293491;0.00043361488496885;-0.0010501795914024;0.00015620124759153;-0.00071914657019079;1.9384282495594e-05;-0.0011370859574527;2.5775783797144e-05;0.0001575397036504;2.3251115635503e-05;0.00018039255519398;2.7547295758268e-05;-0.00036915155942552;-9.0339730377309e-05;-0.00027912785299122;-0.00026885021361522;8.6267027654685e-05;-0.00016836788563523;7.9606004874222e-05;5.5193897424033e-05;0.00048732233699411;-0.00014164588355925;0.00031952874269336;-0.00040748598985374;-0.00028939399635419;-8.9242952526547e-05;-0.00018336869834457;-0.0005104107549414;-0.00016176313511096;0.00066972838249058;0.0002108430780936;0.00022828324290458;0.00033226740197279;-9.9694858363364e-05;0.00030422391137108;-5.8746700233314e-06;0.00028840894810855;-0.00093968823784962;0.00023939601669554;0.00035521856625564;0.00014017896319274;-1.2925463124702e-05;-1.3314874195203e-05;-4.7746540076332e-05;5.7647706853459e-05;0.00044689918286167;6.6702319600154e-05;-0.00021087224013172;-0.00010323395690648;-0.00013038865290582;4.6644807298435e-05;0.00046233856119215;1.9800509107881e-05;0.00017277774168178;4.1121052163362e-06;0.0005445143324323;2.5776118491194e-05;-8.7808039097581e-05;-0.00012954424892087;0.00029804301448166;0.00016344866889995;7.2675378760323e-05;-0.00016020485782064;-0.0001093313403544;-0.00071384868351743;-8.7591324700043e-05;-0.00019701079872902;2.9988272217452e-05;0.0002521438873373;1.9330340364831e-05;-0.00064487819327042;-3.4143755328842e-05;-0.00020824777311645;0.00011964633449679;-0.00015390868065879;-0.0001207170644193;0.00080273387720808;-0.0001465115492465;0.00039966980693862;-8.392446761718e-05;-8.029121090658e-06;4.9463720642962e-05;0.0011934550711885;-3.5206849133829e-05;0.00094585563056171;-6.7764058258035e-06;-1.5870906281634e-05;9.6389567261213e-06;7.5402924267109e-05;-0.00025248940801248;-0.00020380153728183;4.1517014324199e-05;0.00010199609823758;-0.00029879866633564;0.00040682396502234;-0.00099032209254801;0.00010053560254164;-0.00074029434472322;-1.3365776794672e-05;-0.0010956877376884;-5.7052056945395e-06;0.00011778292537201;1.5135658031795e-05;0.0001498378260294;2.4147962903953e-05;-0.0002306952374056;-7.4650379247032e-05;-0.0002276128216181;-0.00021598751482088;6.3295468862634e-05;-0.00013063687947579;5.7027875300264e-05;5.0092010496883e-05;0.00029212908702902;-0.00011618605640251;0.00028175112674944;-0.00034203281393275;-0.00019960678764619;-7.9186203947756e-05;-0.00016747433983255;-0.00039501782157458;-0.00013026439410169;0.00050359981833026;0.00018374144565314;0.0002034461213043;0.00024335140187759;-7.3479604907334e-05;0.00024991115787998;-2.873327684938e-05;0.00024250765272882;-0.00068596034543589;0.00020166940521449;0.00023157356190495;0.00011944257857976;9.7457623269293e-06;-1.2453713679861e-05;-5.8113244449487e-05;5.5530941608595e-05;0.00033681752393022;5.6841148762032e-05;-0.00014481451944448;-8.1427453551441e-05;-0.00010762558667921;2.8736098101945e-05;0.00038768179365434;1.5779667592142e-05;0.00013799153384753;8.302033165819e-06;0.00040066507062875;3.3665288356133e-05;-9.4304101367015e-05;-0.00010786200436996;0.00024750179727562;0.00017253019905183;6.4768493757583e-05;-0.00015233452722896;-9.1491063358262e-05;-0.00056314939865842;-7.9208315582946e-05;-0.0001462597574573;1.6482974388055e-05;0.00015807624731679;2.1386047592387e-05;-0.00047366847866215;-3.9790444134269e-05;-0.00015697150956839;8.8108608906623e-05;-9.9576282082126e-05;-8.4015067841392e-05;0.0006078538717702;-9.1801848611794e-05;0.00030988428625278;-5.3622588893631e-05;-7.8174671216402e-06;3.9370770537062e-05;0.00089481467148289;-9.627966392145e-06;0.00072665116749704;2.1884861780563e-05;-5.4523325161426e-06;1.063420677383e-05;4.3538966565393e-05;-0.00019539150525816;-0.00016366153431591;2.7501793738338e-05;8.3540086052381e-05;-0.0002190913510276;0.00030275809695013;-0.0007354867993854;4.8257737944368e-05;-0.00057835970073938;-3.099000241491e-05;-0.00084562750998884;-2.2824900952401e-05;8.8246226368938e-05;7.273000846908e-06;-6.5720181737561e-05;-0.00012170268746559;0.00020014200708829;0.0003123382339254;0.0003164627996739;0.00020245590712875;0.00016222700651269;-2.9215807444416e-05;-3.2334435672965e-05;-9.6950971055776e-05;0.00016988205607049;-0.00045395674533211;0.00047893825103529;-0.00034718943061307;6.7393317294773e-05;0.00024033055524342;9.4930961495265e-05;0.00047804522910155;0.00012893641542178;-0.00024632472195663;-0.00052252720342949;-0.00028839390142821;-0.00026203723973595;-0.00041943372343667;0.00015658073243685;-0.00031709150061943;3.0671471904498e-05;-0.00028470673714764;0.00085100799333304;-0.00012452174269129;-0.00027823590789922;-2.1397459931904e-05;5.8017463743454e-05;5.9323603636585e-05;-3.5526074498193e-05;5.8293175243307e-05;0.00029696786077693;-9.8105578217655e-05;-0.00026260339654982;4.8721594794188e-05;-0.00013004412176087;6.7490225774236e-05;0.00020169124763925;-9.5219763807108e-07;0.00012337182124611;8.9526001829654e-06;0.0005799982463941;-0.0001567525905557;-0.00017168933118228;0.00030424908618443;0.00015798749518581;0.00018057398847304;-0.00013621638936456;-6.7037566623185e-05;-0.00014446429850068;-0.00041862385114655;5.8512017858448e-05;-0.00018756053759716;3.7551403693215e-06;0.00031644481350668;-2.3010752556729e-05;-0.00067036622203887;0.00010223634308204;-0.00015652633737773;-0.00010928051051451;-6.4113446569536e-05;-0.00013877425226383;0.00076144776539877;-4.2262650822522e-05;0.0003872353117913;4.3134983570781e-05;-1.1612702110142e-05;-4.6495988499373e-06;0.0009440565481782;2.0980813133065e-05;0.00091418024385348;4.4733388904206e-07;1.8797793018166e-05;1.5086210623849e-05;-0.00024528996436857;-0.00020535443036351;0.00014269823441282;2.6509153030929e-05;0.00035369978286326;-0.00027305458206683;8.2419843238313e-05;-0.00091111840447411;-3.6667748645414e-05;-0.00070935860276222;-4.6171157009667e-05;-0.00093373242998496;2.5381537852809e-05;4.9654889153317e-05;-7.5385854870547e-05;-0.00014847582497168;0.00023733469424769;0.00048321584472433;0.00039222394116223;0.00022793436073698;0.00020830919675063;-4.2652471165638e-05;-3.3508349588374e-05;-0.00013189330638852;0.00020943686831743;-0.00070997187867761;0.00056884763762355;-0.00040002097375691;7.5719952292275e-05;0.00034205135307275;9.3476126494352e-05;0.00062134506879374;0.00016098952619359;-0.00028277828823775;-0.00070561276515946;-0.00039798248326406;-0.00028980927891098;-0.00050911388825625;0.0002227984223282;-0.00037634366890416;7.5531411312113e-06;-0.00033664872171357;0.001156601938419;-0.00014741694030818;-0.00042022342677228;-2.5998864657595e-05;3.9572933019372e-05;6.3371575379279e-05;2.0164231955278e-06;7.2425973485224e-05;0.00038963719271123;-0.00011903591075679;-0.0003872980887536;7.1256217779592e-05;-0.00015352728951257;7.845732034184e-05;0.00019839097512886;-1.1742282367777e-05;0.00014802310033701;-8.3737704699161e-06;0.00079924665624276;-0.00016070510901045;-0.00020341920026112;0.00036838572123088;0.00018316874047741;0.00015092256944627;-0.00017656850104686;-2.4939812647062e-05;-0.00016148450959008;-0.00051856209756806;8.2944949099328e-05;-0.00024932585074566;-5.6014066274201e-08;0.00049204914830625;-9.0852245193673e-06;-0.00092974695144221;0.00014221365563571;-0.00020623074669857;-0.00016019718896132;-0.00011185314360773;-0.00022597612405661;0.0010076282778755;-7.8556899097748e-05;0.00050507124979049;5.6157939980039e-05;-1.5119420822884e-05;-4.4048494601157e-05;0.001251294510439;-2.2257563614403e-05;0.0011962973512709;-2.6803343189385e-06;2.0408206182765e-05;3.754841236514e-05;-0.0003229905560147;-0.00025724055012688;0.00018666688993108;4.2415686039021e-05;0.00048689811956137;-0.00037622559466399;0.00016274831432384;-0.0012146214721724;-7.372000709438e-06;-0.00091994757531211;-1.9676226656884e-05;-0.0012081499444321;3.5363391361898e-05;6.2431892729364e-05;-7.1832531830296e-05;-0.00015633799193893;0.0002335588214919;0.00064090493833646;0.00040331549826078;0.00021872360957786;0.00022506054665428;-7.8115386713762e-05;-2.1811598344357e-05;-0.0001502217783127;0.0002169211365981;-0.00094207306392491;0.0005619156290777;-0.00037297018570825;6.1463440943044e-05;0.00045255731674843;6.6791995777749e-05;0.00067609938560054;0.00016849419625942;-0.00025839492445812;-0.00082409480819479;-0.00046529356040992;-0.00023574208898935;-0.00051616755081341;0.00026088178856298;-0.0003659084031824;-4.4070660806028e-05;-0.00033582080504857;0.0013758536661044;-0.00013882757048123;-0.00058485905174166;-2.292688259331e-05;-1.4519922615364e-06;4.8908794269664e-05;3.5187666071579e-05;7.6607335358858e-05;0.00044005931704305;-0.00012384442379698;-0.00049187149852514;8.3292463386897e-05;-0.00014320797345135;7.7021970355418e-05;0.00019287978648208;-2.2677557353745e-05;0.0001399234024575;-2.840872912202e-05;0.00092584785306826;-0.00012002472067252;-0.00021572080731858;0.00037787680048496;0.0001762948668329;8.5567000496667e-05;-0.00018690001161303;4.5735876483377e-05;-0.00014717417070642;-0.00056207150919363;9.594456787454e-05;-0.00026893234462477;-8.396548764722e-06;0.0006045667687431;1.219129171659e-05;-0.001074296538718;0.00017107387247961;-0.00023743133351672;-0.00019803966279142;-0.00016792381939013;-0.00030379515374079;0.0011314289877191;-0.00011369553976692;0.00057700049364939;5.9867965319427e-05;-1.3521232176572e-05;-9.5295268693008e-05;0.001444982830435;-8.2675462181214e-05;0.0013321181759238;-5.6000608310569e-06;-1.3085508726363e-05;6.7688240960706e-05;-0.00035751442192122;-0.00027809359016828;0.00019822278409265;6.5744912717491e-05;0.00057658221339807;-0.00045416358625516;0.00024966330965981;-0.0013858508318663;3.6113386158831e-05;-0.0010063200024888;2.3992271962925e-05;-0.0013645851286128;4.2919014958898e-05;0.00010019210458267;-6.1889113567304e-05;-0.00015342611004598;0.00020955290528946;0.00075624330202118;0.00037260426324792;0.00020576085080393;0.00022316921968013;-0.00011052478657803;-5.8174719015369e-06;-0.00015592278214172;0.0002053460048046;-0.0011061623226851;0.00051117385737598;-0.0002970710338559;3.8527454307768e-05;0.00054808182176203;3.309933890705e-05;0.00066980050178245;0.00015610895934515;-0.00020410731667653;-0.00088682275963947;-0.00048714620061219;-0.00015545777569059;-0.00047925740364008;0.00026886045816354;-0.00032318162266165;-0.00011384800018277;-0.00031093502184376;0.0015006908215582;-0.00011695793364197;-0.00073049211641774;-1.3088826563035e-05;-4.810274913325e-05;2.7790447347797e-05;5.7402809034102e-05;7.7824959589634e-05;0.00045458186650649;-0.00011919628741452;-0.00056543585378677;8.5748972196598e-05;-0.00011960475239903;6.8873290729243e-05;0.00019835744751617;-3.0129420338199e-05;0.00010924352682196;-4.2737341573229e-05;0.00097743736114353;-6.6935645008925e-05;-0.00021333628683351;0.00036416592774913;0.00015506536874454;1.9787792552961e-05;-0.00018572057888377;0.00011174243263667;-0.0001217399185407;-0.00056797807337716;9.8522650660016e-05;-0.00025708539760672;-1.6419284293079e-05;0.00065780925797299;3.0023786166566e-05;-0.001126867486164;0.00018846285820473;-0.00025208067381755;-0.00022132352751214;-0.00021776018547826;-0.00035905558615923;0.0011649364605546;-0.00013890252739657;0.00061543704941869;5.858361691935e-05;-9.196184691973e-06;-0.00013930434943177;0.0015426387544721;-0.00013540918007493;0.001373233506456;-7.5970424404659e-06;-5.900688120164e-05;9.2653273895849e-05;-0.00036902914871462;-0.00028460321482271;0.00019414503185544;9.2424626927823e-05;0.00062841601902619;-0.00049893162213266;0.00031880996539257;-0.0014498975360766;7.3951596277766e-05;-0.0010182777186856;6.3991712522693e-05;-0.0014403051463887;4.7813657147344e-05;0.0001451824355172;-4.4890002754983e-05;-0.00011466146679595;0.00015435156819876;0.00066893675830215;0.00026953950873576;0.00016645391588099;0.00017639482393861;-8.5791245510336e-05;4.758338945976e-06;-0.00012835422239732;0.00015607297245879;-0.0009752216283232;0.00037952756974846;-0.0001679694687482;1.7542666682857e-05;0.00048248557141051;5.8812378256334e-07;0.00052657892229035;0.00010765810293378;-0.00012469061766751;-0.0007402990013361;-0.00038815062725917;-8.8210581452586e-05;-0.0003594005247578;0.00021033312077634;-0.0002321439969819;-0.00014984376321081;-0.00023374972806778;0.0012514506233856;-8.1686965131667e-05;-0.00065760884899646;-2.2219487618713e-06;-6.6487620642874e-05;9.0858393377857e-06;7.1625421696808e-05;6.5056279709097e-05;0.0003556408919394;-8.8872933702078e-05;-0.00049957481678575;6.9851339503657e-05;-8.3703474956565e-05;5.0218128308188e-05;0.00013449242396746;-2.7009187760996e-05;6.2687482568435e-05;-4.2484658479225e-05;0.0008210577070713;-2.6754660211736e-05;-0.00016428553499281;0.00028387131169438;0.00011585591710173;-3.0652303394163e-05;-0.00015761192480568;0.00013868765381631;-8.4364342910703e-05;-0.00043514595017768;7.9186749644578e-05;-0.00019810195954051;-1.7937720258487e-05;0.0005805324180983;3.3441141567891e-05;-0.00094608165090904;0.00015907663328107;-0.00020548194879666;-0.00019085500389338;-0.00020055027562194;-0.00031954614678398;0.00094953301595524;-0.00012478628195822;0.00051179400179535;4.7642421122873e-05;-5.1944280130556e-06;-0.00013382564065978;0.0012761640828103;-0.00013748448691331;0.0011320598423481;-8.5275505625759e-06;-6.2808372604195e-05;8.4212231740821e-05;-0.00031035713618621;-0.00023526849690825;0.00016012247942854;9.0597248345148e-05;0.00053400720935315;-0.00041460792999715;0.00029224209720269;-0.0011899688979611;8.0742633144837e-05;-0.00083156977780163;7.2301663749386e-05;-0.0011910982429981;4.2035833757836e-05;0.00012939923908561;0.00018085079500452;-6.551314072567e-06;-0.00060033838963136;-3.1187631975627e-05;-0.00034519226755947;-0.0001718352723401;0.00012958461593371;-0.00013513916928787;9.5140625489876e-05;-2.4569628749305e-06;0.00073578546289355;-9.1787755081896e-05;4.6354482037714e-05;-0.00025727576576173;-0.00051027600420639;-1.6859676179592e-05;-0.00010621077672113;-0.00043834713869728;-0.00011072320921812;0.00075670314254239;8.4123981650919e-05;7.3748211434577e-05;0.00031808667699806;3.2178075343836e-05;0.0001886247046059;0.00022062187781557;0.00016239714750554;-0.0011126790195704;0.00016487178800162;0.00068137492053211;6.6413798776921e-05;-0.00015417815302499;2.71585486189e-05;-9.5995448646136e-05;-1.0400794963061e-05;0.00050171877956018;5.2967607189203e-05;-0.00027730662259273;-0.00010789770021802;-7.0900445280131e-05;4.8639391025063e-05;0.00069833506131545;1.4407483206469e-07;8.3782448200509e-05;-1.7145534002339e-05;0.00049270957242697;-1.5979619547579e-06;8.5247469542082e-05;-0.0001138021616498;0.00024489845964126;5.3292849770514e-05;-9.6316307462985e-06;-0.00010581042442936;-4.6985423978185e-05;-0.00078762631164864;-1.4823197489022e-05;-0.00011792930308729;3.6317491321824e-05;0.00015047693159431;-1.219995624524e-06;-0.00054900074610487;6.5631311372272e-06;-0.00023633378441446;0.00014629717043135;-0.00031178173958324;-0.00015947164501995;0.00073195353616029;-0.00022489466937259;0.0004318505525589;-0.00011906972940778;1.4139458471618e-05;3.3150612580357e-05;0.0013877408346161;-0.00011381789227016;0.0008922548731789;-0.00011586458276724;-0.00016355818661395;4.1191929085471e-06;0.00015566694492009;-0.00025056829326786;-0.00020291087275837;0.00012485403567553;5.1411363529041e-05;-0.00033804829581641;0.00046555433073081;-0.00099973380565643;0.00022974301828071;-0.00063502823468298;5.5695276387269e-05;-0.0012239890638739;6.8789318902418e-05;0.00026912437169813;3.2725878554629e-05;0.00025042431661859;-8.0397830970469e-06;-0.00062814995180815;-4.3827763875015e-05;-0.00040846559568308;-0.00024290886358358;0.00019439116294961;-0.00015820426051505;0.00010597093933029;8.5005267465021e-06;0.00070528307696804;-0.00011705869837897;0.00017828725685831;-0.00033207196975127;-0.00057102856226265;-3.5105902497889e-05;-0.00017782425857149;-0.00053489772835746;-0.00017172543448396;0.000869877403602;0.00015393125067931;0.00012050257646479;0.0003928835503757;5.7106703025056e-05;0.00024396476510447;0.00015641067875549;0.0002192635438405;-0.0012685463298112;0.00021196689340286;0.00073949276702479;8.9597706391942e-05;-0.00012748957669828;9.476617378823e-06;-0.0001789899833966;1.3192924598115e-05;0.00061613018624485;5.8774778153747e-05;-0.00027831408078782;-0.00014080604887567;-8.524683653377e-05;5.0474056479288e-05;0.00090085598640144;1.0059789929073e-05;0.00014387597911991;-1.5698688002885e-05;0.00051615771371871;1.1746355085052e-05;6.0354028391885e-05;-0.00017068053421099;0.00029687909409404;0.00016241533739958;-3.3166929824802e-06;-0.00018629200349096;-2.48976120929e-05;-0.00099235365632921;-3.7439971492859e-05;-0.00014141490100883;4.0409915527562e-05;6.1350212490652e-05;3.0192820759112e-06;-0.0005685452488251;-3.6864798858005e-06;-0.00028593462775461;0.00016813170805108;-0.0003218638303224;-0.00017235850100406;0.00085271405987442;-0.00023284970666282;0.00049766228767112;-0.00012431973300409;1.5700954463682e-05;3.4631852031453e-05;0.0016139028593898;-0.00011630519293249;0.0010024765506387;-0.00010577206558082;-0.00019999007054139;1.0220365766145e-05;0.00017209639190696;-0.00025698612444103;-0.0002251786791021;0.00011488817108329;4.9014368414646e-05;-0.00040568978874944;0.00050971243763342;-0.0011672963155434;0.00023642953601666;-0.00071339757414535;4.2158015276073e-05;-0.0014138555852696;6.1135178839322e-05;0.00032897209166549;3.1950927223079e-05;0.00023534486535937;3.0573503408959e-06;-0.00047278829151765;-5.6993769248948e-05;-0.00035998219391331;-0.00025074466248043;0.00017462640244048;-0.00014492505579256;8.7740678281989e-05;2.3183743905975e-05;0.0004936657496728;-0.00011986116442131;0.00025247829034925;-0.00033763141254894;-0.00044483214151114;-5.120368587086e-05;-0.00019471666018944;-0.00049418280832469;-0.00017742424097378;0.00074008427327499;0.00018677997286431;0.00015883085143287;0.00035268772626296;4.8573860112811e-05;0.0002508845354896;5.6516611948609e-05;0.00023103982675821;-0.0010607793228701;0.00021217729954515;0.0005604840698652;9.7909280157182e-05;-5.1593535317807e-05;-1.2747233995469e-05;-0.00018270005239174;3.7797595723532e-05;0.00052977260202169;5.3337451390689e-05;-0.00021479887072928;-0.00012850367056672;-8.7426786194555e-05;4.1779152525123e-05;0.00076612189877778;2.0142460925854e-05;0.0001632596104173;-5.2694285841426e-06;0.00044420489575714;2.1430778360809e-05;-3.7346728731791e-06;-0.00017856915656012;0.00027334230253473;0.00021832763741259;2.1875759557588e-05;-0.00019001924374606;-2.047692942142e-05;-0.00087243597954512;-6.0234913689783e-05;-0.0001431487762602;3.2710082450649e-05;3.2757405278971e-05;6.734922862961e-06;-0.00049519672757015;-1.6738638805691e-05;-0.00024795095669106;0.00014006630226504;-0.00023286399664357;-0.00013707418111153;0.00076083990279585;-0.00017614486569073;0.00042946703615598;-9.5275958301499e-05;9.3345233835862e-06;3.2551961339777e-05;0.0013761509908363;-7.7118471381254e-05;0.0008804933167994;-5.7822591770673e-05;-0.00014998808910605;1.1203659596504e-05;0.00012977633741684;-0.00021231731807347;-0.00019566934497561;7.1181646490004e-05;4.9549042159924e-05;-0.00035069117438979;0.0004224393342156;-0.0010218675015494;0.00016642632544972;-0.0006397845572792;1.3484540431818e-05;-0.0012155886506662;2.8859560188721e-05;0.00026517221704125;2.3161021090345e-05;0.00020767305977643;1.25710366774e-05;-0.00033687555696815;-6.4927022322081e-05;-0.00031204870902002;-0.00023969865287654;0.00013598396617454;-0.00013176616630517;7.0966918428894e-05;3.4365009923931e-05;0.0003318568051327;-0.0001181294574053;0.00027859947294928;-0.00033520703436807;-0.00032876915065572;-6.2827013607603e-05;-0.00019602618704084;-0.00044186867307872;-0.00016420184692834;0.00061599392211065;0.00019780165166594;0.00018510832160246;0.00029861024813727;2.9153981813579e-05;0.00024805471184663;-2.9956720482005e-07;0.0002341242361581;-0.00086008972721174;0.00020734671852551;0.00040078582242131;0.00010373882832937;-3.9316651054833e-06;-2.1132984329597e-05;-0.00016212377522606;5.1324153901078e-05;0.00043680111411959;5.1371196605032e-05;-0.00016663172573317;-0.00011078096576966;-9.0213645307813e-05;3.2874220778467e-05;0.0006250127335079;2.273240534123e-05;0.00015968778461684;3.2900320547924e-06;0.00038848392432556;3.0065102691879e-05;-5.1321236242075e-05;-0.00016605904966127;0.00025338912382722;0.00023706139472779;4.143110345467e-05;-0.00018192907737102;-3.2483669201611e-05;-0.00073847675230354;-7.3262919613626e-05;-0.00013668749306817;2.3530661565019e-05;3.5452725569485e-05;1.1699592505465e-05;-0.00044036179315299;-2.881058571802e-05;-0.00020607643818948;0.00011357998300809;-0.00016297327238135;-0.00010695696983021;0.00066412455635145;-0.00012805369624402;0.00036724246456288;-7.0173889980651e-05;3.2163741252589e-06;3.2384446967626e-05;0.0011411666637287;-4.2329360439908e-05;0.00077471497934312;-1.6652080375934e-05;-9.7993470262736e-05;1.1253428965574e-05;8.9551773271523e-05;-0.00018575268040877;-0.00017472598119639;4.3864929466508e-05;5.5825072195148e-05;-0.00028788941563107;0.00035000217030756;-0.00086614233441651;0.0001050457576639;-0.00058011367218569;-1.0711269169406e-05;-0.0010316766565666;1.3502705087376e-06;0.00019926734967157;1.5630950656487e-05;0.0001513633178547;1.8474531316315e-05;-0.00021021417342126;-6.223761010915e-05;-0.00022750275093131;-0.00019474339205772;8.1162681453861e-05;-0.00010989821021212;5.1279290346429e-05;3.8400030462071e-05;0.0002230319660157;-0.0001021610078169;0.00025095441378653;-0.00029567538877018;-0.00020748208044097;-6.3466002757195e-05;-0.00016200284881052;-0.00034881907049567;-0.00012487251660787;0.00045761655201204;0.0001693034573691;0.0001739170984365;0.00022000299941283;-1.9161348973284e-05;0.00021629402181134;-2.5050641852431e-05;0.00020803508232348;-0.00062582816462964;0.00017923199629877;0.00024233733711299;9.7710428235587e-05;1.4464329979091e-05;-1.5641964637325e-05;-0.00010063684021588;4.9480411689728e-05;0.00031471354304813;4.6889606892364e-05;-0.00012257201888133;-8.051853365032e-05;-8.5379593656398e-05;2.2723204892827e-05;0.00042715371819213;1.7132331777248e-05;0.00012692841119133;7.9837282100925e-06;0.00032213490339927;3.2512532925466e-05;-7.5147479947191e-05;-0.0001204053114634;0.00021510451915674;0.00019303934823256;5.096593304188e-05;-0.00014798530901317;-5.4407588322647e-05;-0.00054225214989856;-6.976740405662e-05;-0.00011654224363156;1.3616625437862e-05;6.8257562816143e-05;1.5978870578692e-05;-0.00037303636781871;-3.4786749893101e-05;-0.0001489038404543;8.1518257502466e-05;-9.8548160167411e-05;-7.4860552558675e-05;0.00052412075456232;-8.1256672274321e-05;0.00028199612279423;-4.5981349103386e-05;-2.7200433123653e-06;3.0517971026711e-05;0.00083290983457118;-1.2582409908646e-05;0.00062370061641559;1.5133186025196e-05;-3.9126724004745e-05;1.0122021194547e-05;4.8292353312718e-05;-0.00015798103413545;-0.00014371042198036;2.6121255359612e-05;6.0201964515727e-05;-0.00020528353343252;0.0002655346179381;-0.00065342028392479;4.9371003115084e-05;-0.00048574566608295;-2.6921356038656e-05;-0.00077952712308615;-1.8293167158845e-05;0.00011738041212084;7.9419769463129e-06;-4.9444333853899e-05;-8.4645194874611e-05;0.00014090485638008;0.00016677094390616;0.00021406495943666;0.00014910299796611;0.00010415120777907;-3.4464359487174e-05;-2.2023306883057e-05;-5.8064306358574e-05;0.00011647203064058;-0.00023506564320996;0.00033217435702682;-0.00025178070063703;4.4400207116269e-05;0.00015853857621551;7.7275290095713e-05;0.00030297943158075;8.900034299586e-05;-0.00017698296869639;-0.00032538385130465;-0.00017691888206173;-0.00018031209765468;-0.00028724601725116;8.5058483819012e-05;-0.00021801731782034;3.6676676245406e-05;-0.00020234879048076;0.00054098374675959;-8.1953818153124e-05;-0.00017390253196936;-1.493432046118e-05;5.8771045587491e-05;4.1944247641368e-05;-6.6311171394773e-05;3.6878067476209e-05;0.00019181448442396;-6.934825796634e-05;-0.00014740102051292;2.5343610104755e-05;-8.5283354565036e-05;4.9962724006036e-05;0.0001870568812592;6.7411197051115e-06;8.586384501541e-05;1.7657368516666e-05;0.00033959044958465;-0.00011955847003264;-0.00013470988778863;0.00020559533732012;0.00011486413131934;0.00017394091992173;-7.670574268559e-05;-7.2462018579245e-05;-0.00010584594565444;-0.00029233368695714;3.2220821594819e-05;-0.00011273367272224;2.3959976260812e-06;0.00013830298848916;-2.6020899895229e-05;-0.00038529559969902;6.1683458625339e-05;-0.00010248339094687;-6.0117024986539e-05;-3.1903004128253e-05;-6.539722380694e-05;0.00047688526683487;-1.4721083061886e-05;0.00025440246099606;2.5952975192922e-05;-5.5866685215733e-06;1.6286387108266e-05;0.00061190861742944;3.7991823774064e-05;0.00057769304839894;2.0259728898964e-06;-3.6088049455429e-06;5.2978293751949e-06;-0.00014800432836637;-0.00013686719466932;8.2642771303654e-05;1.5056711163197e-05;0.00021386051957961;-0.00017345472588204;2.6647370759747e-05;-0.00057450780877843;-4.459120464162e-05;-0.00044687232002616;-5.143738235347e-05;-0.00061722105601802;1.6335163309122e-05;5.2102866902715e-05;-6.8377448769752e-05;-0.0001352688705083;0.00019943229563069;0.00028943279176019;0.00032132441992871;0.00022050544794183;0.00015345147403423;-7.5112679041922e-05;-2.7789217710961e-05;-8.9587811089586e-05;0.00017099341494031;-0.00039300418575294;0.00047041330253705;-0.00036154262488708;5.9614281781251e-05;0.00027295720065013;0.00011414373148;0.00045951717766002;0.00014054177154321;-0.00025826413184404;-0.00051152217201889;-0.00028586739790626;-0.0002423935366096;-0.00041406298987567;0.00011769928823924;-0.00030970308580436;4.3541876948439e-05;-0.00028822934837081;0.00085289520211518;-0.00011320404155413;-0.00031253413180821;-2.7454841983854e-05;7.72969215177e-05;5.9517766203498e-05;-0.00011015372001566;5.2309816965135e-05;0.00030299520585686;-0.00010557276254985;-0.00023596356913913;4.1079587390414e-05;-0.00011666455975501;7.2167975304183e-05;0.00030144915217534;4.6788245526841e-06;0.00012689425784629;1.8050666767522e-05;0.00051121774595231;-0.00015332666225731;-0.00020596222020686;0.00029430669383146;0.00015431526117027;0.00024775127531029;-9.8734264611267e-05;-9.278126526624e-05;-0.00014591896615457;-0.00045302690705284;5.1515700761229e-05;-0.00016634006169625;3.174210405632e-07;0.00020170561037958;-2.8311085770838e-05;-0.00057735905284062;9.9611846962944e-05;-0.00016036859597079;-9.913418762153e-05;-6.9093162892386e-05;-0.00012257909111213;0.0007213766220957;-3.4823373425752e-05;0.0003910897357855;3.712240504683e-05;-6.6896454882226e-06;1.5515379345743e-06;0.0009563016355969;2.9207449188107e-05;0.00086344033479691;2.3744321424601e-06;-2.813813262037e-05;2.1598030798486e-05;-0.0002159065916203;-0.00020014327310491;0.0001162864282378;2.8968948754482e-05;0.00033643515780568;-0.00028256402583793;7.2552793426439e-05;-0.00088164478074759;-4.5695345761487e-05;-0.00065801438177004;-5.4206288041314e-05;-0.00094579602591693;2.5594510589144e-05;0.00010128501162399;-6.1511767853517e-05;-0.00015997604350559;0.00019473907013889;0.00040061166509986;0.00034381219302304;0.00023280344612431;0.00016521467478015;-0.00011805720714619;-2.0602521544788e-05;-0.00010386773647042;0.00017727667000145;-0.00053032621508464;0.00046812274376862;-0.00035913483588956;5.21770780324e-05;0.00036638326128013;0.00011369110870874;0.00051124405581504;0.00016031060658861;-0.0002578012063168;-0.00061036966508254;-0.00034654515911825;-0.00021134263079148;-0.0004215782682877;0.00012374902144074;-0.000307701760903;1.6212659829762e-05;-0.00028887661756016;0.0010216643568128;-0.0001082456074073;-0.00044207536848262;-3.2276366255246e-05;5.3102026868146e-05;5.5808257457102e-05;-0.00012077225983376;5.4892025218578e-05;0.00036246501258574;-0.00011689004168147;-0.00029589436599053;5.0124737754231e-05;-0.0001096872438211;7.2018410719465e-05;0.0003589075349737;-5.6146391216316e-06;0.00012991558469366;5.0082658162864e-06;0.00057919917162508;-0.00011945066944463;-0.00022254853683989;0.00030454434454441;0.00013765263429377;0.0002293752040714;-9.0969653683715e-05;-7.0519381552003e-05;-0.00013585538545158;-0.0005229600938037;6.2370636442211e-05;-0.00017767783720046;-4.2268034121662e-06;0.00023309493553825;-1.2502551726357e-05;-0.00065063295187429;0.0001236014359165;-0.00018879053823184;-0.00012747885193676;-0.00011646621715045;-0.00018079165602103;0.00081307301297784;-6.1784514400642e-05;0.00045017071533948;3.8585585571127e-05;-4.7799699132156e-06;-4.0049439121503e-05;0.001124378410168;-1.7206813936355e-05;0.00095775816589594;1.7377126368956e-06;-6.6365588281769e-05;4.7434004954994e-05;-0.00023560324916616;-0.00021448257029988;0.00011918407108169;4.740934309666e-05;0.00040407330379821;-0.00034974855952896;0.00014004857803229;-0.0010135499760509;-1.3321877304406e-05;-0.00071387324715033;-1.8888737031375e-05;-0.0010810337262228;3.0020080885151e-05;0.00014674116391689;-5.128471457283e-05;-0.00018113887927029;0.0001847771636676;0.00053258240222931;0.00035370280966163;0.00024072267115116;0.00017836710321717;-0.00015899531717878;-1.0885733900068e-05;-0.00011946043377975;0.00017910408496391;-0.00070740334922448;0.00046231577289291;-0.00033786310814321;4.1119157685898e-05;0.00047653843648732;0.00010334325634176;0.00055801961570978;0.00017097646195907;-0.00023982903803699;-0.00072158180410042;-0.00040387053741142;-0.00016543753736187;-0.00042234701686539;0.00014263090270106;-0.00030007548048161;-3.2097141229315e-05;-0.00028744136216119;0.0012137948069721;-0.00010180449316977;-0.00059647869784385;-2.7761127057602e-05;1.0774715519801e-05;4.5714463340119e-05;-0.00011491501209093;6.0365433455445e-05;0.00042518667760305;-0.00012632420111913;-0.00037250271998346;5.8291148889111e-05;-0.00010157316137338;6.7489134380594e-05;0.00041932082967833;-1.7196849512402e-05;0.00012080084707122;-8.2001106420648e-06;0.0006619433988817;-7.7066200901754e-05;-0.00022943917429075;0.00032080727396533;0.00011849253496621;0.00018971845565829;-9.3631169875152e-05;-4.1225375753129e-05;-0.00012072928802809;-0.0005960845737718;7.2653892857488e-05;-0.00018388172611594;-8.181479643099e-06;0.00028274636133574;3.8558086998819e-06;-0.00073944876203313;0.00015095753769856;-0.00021922613086645;-0.00016039598267525;-0.00017302237392869;-0.00024642419884913;0.00091199402231723;-9.1336754849181e-05;0.00051815045299008;4.0749753679847e-05;-2.5199824449373e-06;-8.6746760644019e-05;0.0013071008725092;-6.8122462835163e-05;0.0010678576072678;1.22334927255e-06;-0.00010801279131556;7.4975243478548e-05;-0.00026553749921732;-0.00023458997020498;0.00012601868365891;7.4516872700769e-05;0.00048337384941988;-0.00041952953324653;0.00021620957704727;-0.0011541208950803;2.1230491256574e-05;-0.00078130047768354;1.976025669137e-05;-0.0012340139364824;3.4974578738911e-05;0.00019580675871111;-3.9309863495873e-05;-0.00019513316510711;0.00016961549408734;0.00067045621108264;0.00034713375498541;0.00024664591182955;0.00019095851166639;-0.00018847640603781;9.7672807441995e-07;-0.00013463386858348;0.00017643631144892;-0.00090374477440491;0.00045107444748282;-0.0002873819321394;2.6814212105819e-05;0.0005920899566263;8.3873390394729e-05;0.00059179140953347;0.00016754986427259;-0.00020456724450924;-0.00083180807996541;-0.00044781397446059;-0.00010909567208728;-0.00041397692984901;0.00016656785737723;-0.00028595791081898;-0.00010545481927693;-0.00028320495039225;0.0014036676147953;-9.3355767603498e-05;-0.00076173635898158;-1.3033295545029e-05;-4.7531852032989e-05;2.8764343369403e-05;-9.5049646915868e-05;6.8912828282919e-05;0.00047989262384363;-0.00013209751341492;-0.00045998126734048;6.4573978306726e-05;-9.235979814548e-05;5.763904118794e-05;0.00047780759632587;-2.8405853299773e-05;9.5155017334037e-05;-2.0051231331308e-05;0.000750306120608;-2.8094569643144e-05;-0.00022595730843022;0.00034047386725433;9.7545867902227e-05;0.00013267375470605;-0.0001068388010026;-4.1860384953907e-06;-0.00010052816651296;-0.00066000508377329;8.0190329754259e-05;-0.00018063107563648;-1.1179788089066e-05;0.00034651430905797;1.90311420738e-05;-0.00083354953676462;0.00017880703671835;-0.00024679335183464;-0.00019561442604754;-0.0002372856833972;-0.00031475778087042;0.0010018282337114;-0.00012084159243386;0.00058919441653416;4.3479663872859e-05;3.1333527772404e-07;-0.00013436070003081;0.001484758220613;-0.00012038804561598;0.0011826121481135;4.3736611132772e-07;-0.00015083537437022;0.00010185931023443;-0.00030483023147099;-0.00026038367650472;0.00013677382958122;0.00011060056567658;0.00056815589778125;-0.0004818084416911;0.00029514005291276;-0.0012817768147215;5.5981825425988e-05;-0.00085295521421358;5.9062971558888e-05;-0.001392564503476;4.0440980228595e-05;0.0002457500086166;-2.5553463274264e-05;-0.00013928955013398;0.00011827491107397;0.00056816847063601;0.00024219167244155;0.00018046563491225;0.00014821364311501;-0.00013241863052826;7.4063955253223e-06;-0.00010786662460305;0.00012872643128503;-0.00078605697490275;0.00032590850605629;-0.00016067380784079;1.1530830306583e-05;0.00048595233238302;4.0876555431169e-05;0.00044845894444734;0.00010899875633186;-0.00012229598360136;-0.00066518335370347;-0.00034223246620968;-5.2841649448965e-05;-0.00029949363670312;0.00014245130296331;-0.0002011919132201;-0.00013408459199127;-0.00020567316096276;0.0011217718711123;-6.4740961533971e-05;-0.00063979951664805;2.5217220809282e-06;-7.0474969106726e-05;9.0009307314176e-06;-3.7977213651175e-05;5.7800803915597e-05;0.00036231693229638;-9.5003349997569e-05;-0.00039726140676066;5.1659037126228e-05;-6.4932348323055e-05;3.6074179661227e-05;0.00034134590532631;-2.552203295636e-05;4.5888587919762e-05;-2.2509118934977e-05;0.00061931589152664;2.9821471798641e-06;-0.00015781585534569;0.00026096033980139;6.619407213293e-05;4.940465441905e-05;-9.9123586551286e-05;3.7248562875902e-05;-6.3608924392611e-05;-0.00048902136040851;6.2155755585991e-05;-0.0001317461283179;-1.0354729056417e-05;0.00032850838033482;2.2115582396509e-05;-0.00069014250766486;0.00014445035776589;-0.00019029615214095;-0.00016391345707234;-0.00020888612198178;-0.00026994597283192;0.00078264507465065;-0.00010455132724019;0.0004684757150244;3.5208304325351e-05;1.0759769111246e-06;-0.00012187254469609;0.0011696969158947;-0.00011665191414068;0.00094162300229073;-1.6277125496345e-06;-0.00012121789768571;8.5786989075132e-05;-0.00025521864881739;-0.00020929824677296;0.00011409410944907;0.00010297254630132;0.00046584219671786;-0.00037648365832865;0.00025799139984883;-0.0010017979657277;6.0823440435342e-05;-0.00067728891735896;6.3520463299938e-05;-0.0011017200304195;3.3730702853063e-05;0.00019283335132059;0.00029682443710044;-3.1246469006874e-05;-0.00046846573241055;-1.5764013369335e-05;-0.00046154024312273;-0.00021461441065185;0.00018977394211106;-0.00011644509504549;8.7451880972367e-05;7.7610357038793e-06;0.00033097207779065;-8.5295738244895e-05;0.00016526099352632;-0.00027986397617497;-0.00049712572945282;-3.5265140468255e-05;-0.00023311843688134;-0.00046071980614215;-0.00017550907796249;0.00075248279608786;0.00017835569451563;0.00015856637037359;0.00031614233739674;0.00021766823192593;0.00018443929729983;0.00011922849807888;0.00019137001072522;-0.0010003114584833;0.0001819205499487;0.00062228774186224;7.4779454735108e-05;-9.3262453447096e-05;-3.6046033073944e-06;-0.00027599494205788;2.7596281142905e-05;0.00058131309924647;4.8827027057996e-05;-0.00018976964929607;-0.00014227283827495;-6.044364272384e-05;3.0519495339831e-05;0.001031436608173;1.1437265129643e-05;0.00014391947479453;-1.3778285392618e-05;0.00032552322954871;2.7012683858629e-05;5.362558295019e-05;-0.00018246230320074;0.00026651119696908;0.00025829565129243;-2.7460697310744e-05;-0.00025031977565959;2.8749420380336e-05;-0.00099576497450471;-3.6762317904504e-05;-8.1548394518904e-05;2.9353084755712e-05;-0.00016858943854459;6.0327479332045e-06;-0.00033727241680026;-1.0846177247004e-05;-0.00026004013489;0.00014884640404489;-0.00027737888740376;-0.00014170796202961;0.00066776107996702;-0.00018518776050769;0.00043635457404889;-9.3773371190764e-05;1.8478756828699e-05;2.3212989617605e-05;0.0014211928937584;-9.8363983852323e-05;0.00080054171849042;-8.093386713881e-05;-0.00022701019770466;1.2058401807735e-05;0.00014879307127558;-0.00019112863810733;-0.00019587922724895;9.7010066383518e-05;2.4990980818984e-05;-0.00034610088914633;0.00041765326750465;-0.00094357109628618;0.0001949890574906;-0.0005569513887167;2.3888707801234e-05;-0.0012645628303289;4.7143821575446e-05;0.00035416407627054;2.5510276827845e-05;0.00034908537054434;-2.7383806809667e-05;-0.00043803127482533;-3.0511911973008e-05;-0.0005331935826689;-0.00026168290060014;0.0002154578542104;-0.00012433918891475;9.0678593551274e-05;1.8086144336849e-05;0.00020170131756458;-0.00010403449414298;0.00024815867072903;-0.00033435237128288;-0.0005023202393204;-5.1579925639089e-05;-0.00029557142988779;-0.00051838997751474;-0.00021780065435451;0.00079964753240347;0.00024248090630863;0.00022545501997229;0.00034384781611152;0.0002848508884199;0.00022413255646825;6.8287539761513e-05;0.00023315004364122;-0.0010269116610289;0.00021680659847334;0.00061220559291542;9.2070986283943e-05;-3.7157700717216e-05;-2.935339762189e-05;-0.00035160541301593;5.6538716307841e-05;0.00061768747400492;5.2765335567528e-05;-0.00017560664855409;-0.00016184101696126;-7.0150483225007e-05;2.9616943720612e-05;0.0011319144396111;2.7391861294745e-05;0.0001896938047139;-6.1599175751326e-06;0.00032370697590522;3.876382834278e-05;9.3073686002754e-06;-0.00023857111227699;0.00029436103068292;0.00037392278318293;-1.1103985343652e-05;-0.00029593275394291;4.7228964831447e-05;-0.0010912418365479;-6.7189721448813e-05;-9.6073890745174e-05;2.9291169994394e-05;-0.00024072639644146;6.2576132222603e-06;-0.00033395236823708;-2.1781634131912e-05;-0.00028341781580821;0.00015605520457029;-0.00025601833476685;-0.00014024398114998;0.00072336912853643;-0.00017750459664967;0.00047013896983117;-8.8296343164984e-05;1.8261973309563e-05;2.5083645596169e-05;0.001518240547739;-8.7514192273375e-05;0.00085736316395923;-6.0863319959026e-05;-0.00024143268819898;1.4134819139144e-05;0.0001445665693609;-0.00018530913803261;-0.00021039848797955;7.658070535399e-05;2.7236023015575e-05;-0.00037432607496157;0.0004278230771888;-0.0010160754900426;0.00017932787886821;-0.00060123321600258;7.447518328263e-06;-0.0013623692793772;3.1257954105968e-05;0.00038305242196657;2.5063387511182e-05;0.00029661660664715;-1.3724519703828e-05;-0.00032020438811742;-3.8764475903008e-05;-0.00045363389654085;-0.0002359679347137;0.00017391817527823;-0.00010685699089663;7.3355047788937e-05;2.2951366190682e-05;9.6562980616e-05;-9.8220327345189e-05;0.00024735878105275;-0.00030734509346075;-0.00038796802982688;-5.3358839068096e-05;-0.00026683462783694;-0.00044546878780238;-0.00019210769096389;0.00065502751385793;0.00023042169050314;0.00022226187866181;0.00028509416733868;0.00024228438269347;0.00020990357734263;2.4201453925343e-05;0.00021597677550744;-0.00082387612201273;0.00019790582882706;0.0004630574840121;8.7434011220466e-05;6.5602430368017e-06;-3.6466277379077e-05;-0.00030635079019703;6.2192651967052e-05;0.00049652997404337;4.6312790800584e-05;-0.00013575360935647;-0.00013608227891382;-6.6388784034643e-05;2.3442122255801e-05;0.00091882736887783;3.0687908292748e-05;0.00017376091273036;1.7447398477088e-06;0.0002733072033152;3.8528261939064e-05;-2.839244370989e-05;-0.00021787149307784;0.00025371444644406;0.00035720079904422;9.0421972345212e-06;-0.00025204109260812;3.5267905332148e-05;-0.00089822307927534;-7.4187562859152e-05;-8.9386157924309e-05;2.2030000764062e-05;-0.00020108865282964;5.9649833019648e-06;-0.00028650343301706;-2.6378897018731e-05;-0.00023352071002591;0.00012582218914758;-0.00018389226170257;-0.00010895153536694;0.00061002746224403;-0.00013348434004001;0.00039262266363949;-6.5282292780466e-05;1.2626959687623e-05;2.3340124243987e-05;0.0012426710454747;-5.7546163588995e-05;0.00072623539017513;-3.0268090995378e-05;-0.000186167715583;1.1839278158732e-05;0.00010605078568915;-0.00015092348621693;-0.00017959349497687;4.759967487189e-05;2.9654494937859e-05;-0.00030618644086644;0.00034635566407815;-0.00084271328523755;0.00012541451724246;-0.00051880459068343;-7.2542957241239e-06;-0.0011317401658744;1.0611766811053e-05;0.00030611996771768;1.9336954210303e-05;-4.9482918257127e-05;-0.00013977654452901;0.00015439843991771;0.00024601217592135;0.00026586517924443;0.00022223521955311;0.00011657856521197;-0.00010054930316983;-1.6456451703561e-05;-7.2957751399372e-05;0.00013402056356426;-0.00027581921312958;0.00036602321779355;-0.00028693184140138;4.0995200834004e-05;0.00027328144642524;0.00011653314868454;0.00037654058542103;0.00013060701894574;-0.00022312981309369;-0.0004401576006785;-0.00024111825041473;-0.00018899758288171;-0.00032267140340991;3.4690852771746e-05;-0.00024073955137283;2.514988045732e-05;-0.00022950100537855;0.0007223745342344;-8.1368438259233e-05;-0.00031564844539389;-3.1710220355308e-05;7.0216410676949e-05;5.1421666285023e-05;-0.00015990091196727;3.8461937947432e-05;0.00027357091312297;-9.6709867648315e-05;-0.00018310842278879;3.0543793400284e-05;-8.1405116361566e-05;6.2451632402372e-05;0.0003632765437942;3.1548142942484e-06;0.00010686010500649;1.6112417142722e-05;0.00036969859502278;-0.00010815729183378;-0.00019594137847889;0.00023423445236403;0.00010881516936934;0.00025388729409315;-4.4693391828332e-05;-9.8614735179581e-05;-0.00011550694762263;-0.00042818987276405;4.1192291973857e-05;-0.00011699264723575;-4.4927851376997e-06;6.5934284066316e-05;-1.9570259610191e-05;-0.00040483844350092;8.8093860540539e-05;-0.0001432499702787;-8.2471196947154e-05;-7.4390285590198e-05;-0.00011056262883358;0.00057884765556082;-3.2262767490465e-05;0.00034092136775143;2.6258794605383e-05;-1.1884144441865e-06;-1.2368066563795e-05;0.00084113056072965;1.0121603736479e-05;0.00069090042961761;2.4494268018316e-06;-7.359547453234e-05;2.9414617529255e-05;-0.00015857962716836;-0.00016418742598034;7.6796633948106e-05;3.1062460038811e-05;0.00028305151499808;-0.00025694092619233;7.8407036198769e-05;-0.00072895077755675;-2.9716236895183e-05;-0.00051132001681253;-3.4038035664707e-05;-0.00082667614333332;2.2663225536235e-05;0.00014037880464457;-4.5760632929159e-05;-0.00021423924772535;0.00017464678967372;0.00036533272941597;0.00033538369461894;0.00032140826806426;0.00014123754226603;-0.00016982424131129;-1.2430190508894e-05;-9.6926283731591e-05;0.00015771540347487;-0.00036012555938214;0.00043237529462203;-0.0003369931364432;4.2365045374027e-05;0.00042047101305798;0.00016461935592815;0.00048918998800218;0.00018112103862222;-0.00028082123026252;-0.00061175326118246;-0.00032760854810476;-0.00021560775348917;-0.00038109978777356;-1.1248514056206e-05;-0.00028476308216341;2.1038465547463e-06;-0.0002742821816355;0.00098334474023432;-9.0695371909533e-05;-0.0004971357411705;-4.6945217036409e-05;7.2142174758483e-05;6.5257292590104e-05;-0.00025337564875372;4.7645138693042e-05;0.00039413903141394;-0.00013346584455576;-0.00024544823099859;3.9177233702503e-05;-8.7010594143067e-05;7.7311378845479e-05;0.00058297283248976;-3.7850945773243e-06;0.00013272730575409;1.5010919923952e-05;0.0004470877465792;-9.8803771834355e-05;-0.00026090725441463;0.00029313383856788;0.00010446809028508;0.00033754177275114;-2.6750638426165e-05;-0.00013890009722672;-0.00013276822573971;-0.00061851850477979;5.5793581850594e-05;-0.00013135976041667;-9.3325916168396e-06;1.3741437214776e-05;-1.3501778084901e-05;-0.00047727653873153;0.0001270131469937;-0.00020051204774063;-0.00011811811418738;-0.00013101514196023;-0.00017516509979032;0.00074719177791849;-5.6666485761525e-05;0.00046656743506901;3.0201957997633e-05;2.6063305540447e-06;-4.9354217480868e-05;0.0011658945586532;-2.2623191398452e-05;0.00088676187442616;3.6723192806676e-06;-0.00014849942817818;5.6904755183496e-05;-0.00019527319818735;-0.00021136859140825;8.4850798884872e-05;5.6248314649565e-05;0.00039084631134756;-0.00036738958442584;0.00014744764484931;-0.00096480769570917;-1.4037064829608e-05;-0.00063829921418801;-1.3894039511797e-05;-0.0011304161744192;3.0569579394069e-05;0.00024066255718935;-2.8932181521668e-05;-0.00024857252719812;0.00015924740000628;0.00046478214790113;0.00034337872057222;0.00035030450089835;0.00014987355098128;-0.00020829640561715;-5.0995195124415e-06;-0.00010901003406616;0.00015367126616184;-0.00046710460446775;0.00042835113708861;-0.00031803446472622;3.5219534765929e-05;0.00051832548342645;0.00017135999223683;0.00052714190678671;0.00019345243345015;-0.00027205335209146;-0.00070862419670448;-0.00037003678153269;-0.00018624727090355;-0.00037477145087905;-2.1196021407377e-05;-0.00028101436328143;-4.1323364712298e-05;-0.00027306634001434;0.0011333321454003;-8.6425592598971e-05;-0.00062863173661754;-4.1564242565073e-05;3.1445419153897e-05;5.9151763707632e-05;-0.00027208757819608;5.3539639338851e-05;0.00046577851753682;-0.00014684024790768;-0.00029519028612413;4.3423075112514e-05;-8.0272067862097e-05;7.0858586695977e-05;0.00069847295526415;-1.4969822586863e-05;0.00012540572788566;8.8065535237547e-06;0.00048929656622931;-5.7995028328151e-05;-0.00026554754003882;0.00031398472492583;7.7468452218454e-05;0.00032354486756958;-2.1347126676119e-05;-0.00014550646301359;-0.00011835012992378;-0.0007164150592871;6.3110979681369e-05;-0.00012690495350398;-9.3548951554112e-06;6.8299573285913e-06;-2.7004459752789e-06;-0.00051607191562653;0.00015169607650023;-0.00022862310288474;-0.0001456941536162;-0.00018619187176228;-0.00022748178162146;0.00081928342115134;-7.9838180681691e-05;0.00052844343008474;3.1097933970159e-05;5.4675342653354e-06;-8.88633512659e-05;0.0013327503111213;-6.2847495428286e-05;0.00097148038912565;4.837657797907e-06;-0.00019558811618481;8.0918631283566e-05;-0.00022063171491027;-0.00023084056738298;8.7888940470293e-05;8.5695719462819e-05;0.00045798855717294;-0.00042584261973388;0.00021046983601991;-0.0010725696338341;1.1273622476438e-05;-0.00068731914507225;1.7787371689337e-05;-0.0012764220591635;3.3596876164665e-05;0.00029807741520926;-1.2496696399467e-05;-0.00021880498388782;0.00012052374222549;0.00048117846017703;0.00028371158987284;0.00029226893093437;0.00013726197357755;-0.00018518519937061;1.8896986375694e-06;-0.0001026626341627;0.00012573537242133;-0.00053047871915624;0.00035687978379428;-0.00023336494632531;2.3007478375803e-05;0.00050521199591458;0.00013178355584387;0.00046748726163059;0.00015639430785086;-0.00020350395061541;-0.00067001167917624;-0.00033918232657015;-0.00012140892795287;-0.00030891364440322;9.9742846941808e-06;-0.00023140085977502;-8.542158320779e-05;-0.00022734135563951;0.0010767529020086;-7.0505317125935e-05;-0.00062937854090706;-1.8861719581764e-05;-2.5028310119524e-05;3.6373512557475e-05;-0.00020198749552947;5.2606170356739e-05;0.00043625896796584;-0.00012734133633785;-0.00030829204479232;4.1150298784487e-05;-6.4924868638627e-05;4.7992038162192e-05;0.00063035526545718;-2.2157535568113e-05;8.5640342149418e-05;2.5339366516164e-07;0.00047733070096001;-1.3409331586445e-05;-0.000209522084333;0.000283666071482;4.8298861656804e-05;0.00022007824736647;-3.4530479751993e-05;-0.00010470158304088;-8.2390375609975e-05;-0.00065369845833629;5.8542638726067e-05;-0.00010498993651709;-6.3883298935252e-06;5.8636607718654e-05;6.8558474595193e-06;-0.00050581502728164;0.00014686383656226;-0.00020912909531035;-0.00014847940474283;-0.00020388983830344;-0.00023775307636242;0.00074769865022972;-8.7162690761033e-05;0.00049075047718361;2.9036385967629e-05;5.5833556871221e-06;-0.00010651267075446;0.0012354352511466;-8.7057414930314e-05;0.00089783006114885;3.9284404920181e-06;-0.00018553546397015;8.4893974417355e-05;-0.00022039137547836;-0.00021373851632234;8.6444306361955e-05;0.00010046288662124;0.00044475274626166;-0.00039331294829026;0.00022968485427555;-0.00098087079823017;3.2047773856902e-05;-0.00063264375785366;4.1558789234841e-05;-0.0011788870906457;3.1094474252313e-05;0.00027729786233976;0.00031224198755808;-3.3118874853244e-05;-0.00028423665207811;-1.3184837371227e-05;-0.00047932920278981;-0.00019895871810149;0.00016608423902653;-8.0384052125737e-05;6.6416621848475e-05;1.4149009075481e-05;-3.2377618481405e-05;-6.9138368417043e-05;0.00018485479813535;-0.00024797359947115;-0.0003724726557266;-4.224896474625e-05;-0.00027006867458113;-0.00039413513150066;-0.0001803560735425;0.00060360343195498;0.00021330731397029;0.00021575712889899;0.00024172053963412;0.00033244577934965;0.00015420302224811;4.6201290388126e-05;0.00017658241267782;-0.00070262915687636;0.00016227569722105;0.00044260316644795;6.8166118580848e-05;-4.1632119973656e-06;-3.6194898711983e-05;-0.00033142862957902;5.7510806072969e-05;0.00048031687038019;3.9065183955245e-05;-0.00010712497169152;-0.00013232705532573;-4.5998160203453e-05;1.6669693650329e-05;0.00096900074277073;2.8112495783716e-05;0.00015704131510574;-2.4887663130357e-06;0.00018491770606488;3.5931694583269e-05;-2.2636193079961e-06;-0.00020501660765149;0.0002248940145364;0.00035426052636467;-1.6493315342814e-05;-0.00026155143859796;6.181126809679e-05;-0.00088476052042097;-6.0687405493809e-05;-5.3530849982053e-05;2.028797098319e-05;-0.00029197835829109;3.2701530017221e-06;-0.00017791845311876;-1.9164235709468e-05;-0.00022085719683673;0.0001194206342916;-0.00018007197650149;-0.00010076285980176;0.00051033665658906;-0.00012745978892781;0.00035985044087283;-5.8407866163179e-05;1.5928409993649e-05;1.6335614418495e-05;0.0011534832883626;-6.4445790485479e-05;0.00061892124358565;-4.0915008867159e-05;-0.00020872593449894;1.04457976704e-05;0.00010406958608655;-0.00012018509733025;-0.0001615440560272;4.8301455535693e-05;1.5021892977529e-05;-0.0002786768891383;0.00030932034133002;-0.00073228258406743;0.0001297002309002;-0.00042811114690267;6.2441426962323e-07;-0.0010526697151363;2.0214605683577e-05;0.00032395025482401;1.919109672599e-05;0.00028599478537217;-2.3161686840467e-05;-0.00024110380036291;-2.127182779077e-05;-0.00044151153997518;-0.00019238001550548;0.00015091836394276;-7.5810778071173e-05;6.031463999534e-05;1.6228330423473e-05;-5.6302927987417e-05;-7.1037989982869e-05;0.00019067520042881;-0.00024252336879726;-0.00032914747134782;-4.2891868361039e-05;-0.00025534507585689;-0.00036888741306029;-0.00017072948685382;0.00054856232600287;0.00020947204029653;0.00021267270494718;0.00022280048870016;0.00030301377410069;0.00015572196571156;2.6241521482007e-05;0.00017238280270249;-0.00063502485863864;0.00015841433196329;0.00038645975291729;6.725712592015e-05;1.8366086806054e-05;-4.0331684431294e-05;-0.00031111817224883;6.0477435908979e-05;0.00042701346683316;3.6640063626692e-05;-9.4872048066463e-05;-0.00012162423809059;-4.6030036173761e-05;1.5203987459245e-05;0.00086822657613084;3.0906310712453e-05;0.00015175947919488;1.9124374830426e-06;0.00017457846843172;3.5314085835125e-05;-2.192390638811e-05;-0.00020059780217707;0.00020914009655826;0.00034958042670041;-3.777487336265e-06;-0.00023753161076456;5.494304059539e-05;-0.00079964415635914;-6.5892199927475e-05;-5.4731321142754e-05;1.7568310795468e-05;-0.0002634585252963;2.2308047391562e-06;-0.00017106471932493;-2.1263145754347e-05;-0.00020155277161393;0.00010733027011156;-0.0001488272100687;-8.8269705884159e-05;0.00047444083611481;-0.00011005018313881;0.00033126983908005;-4.9507325456943e-05;1.337545018032e-05;1.6236588635365e-05;0.0010478622280061;-5.1314742449904e-05;0.00057589565403759;-2.7576959837461e-05;-0.00018417344836053;9.2688405857189e-06;8.8423512352165e-05;-0.00010752167145256;-0.00015037746925373;3.467101851129e-05;1.6896514352993e-05;-0.00025419247685932;0.00027884624432772;-0.0006733083864674;0.00010712121002143;-0.00040300478576683;-5.8076025197806e-06;-0.00096456427127123;1.0620678040141e-05;0.00029051880119368;1.727132803353e-05;-2.3925609639264e-05;-0.00019502452050801;0.00012129198148614;0.00026432954473421;0.0002495659282431;0.0002979161508847;9.512707038084e-05;-0.00014568155165762;-5.7859706430463e-06;-7.2285351052415e-05;0.00010719388956204;-0.00018223370716441;0.00030978786526248;-0.00023815406893846;2.8911426852574e-05;0.0003423789748922;0.00015226533287205;0.0003676836786326;0.00014835881302133;-0.00022683486167807;-0.00047209058539011;-0.00023910654999781;-0.00017709987878334;-0.00026674271794036;-8.5617990407627e-05;-0.00020520748512354;-1.099107976188e-05;-0.00019837777654175;0.0007234156364575;-6.1940532759763e-05;-0.00040112604619935;-4.5204389607534e-05;6.3348976254929e-05;5.7132834626827e-05;-0.00025129501591437;3.3775377232814e-05;0.00031823696917854;-0.00010973300959449;-0.00016646239964757;2.5949428163585e-05;-5.6077322369674e-05;6.2434141000267e-05;0.00054914579959586;-3.3494907256681e-06;0.00010330170334782;1.3812867109664e-05;0.00028372023371048;-6.4943975303322e-05;-0.0002130122447852;0.00021919618302491;6.0883408877999e-05;0.00030322646489367;7.4524614319671e-06;-0.00013752798258793;-0.00010062290675705;-0.00052041705930606;4.1393199353479e-05;-7.9266203101724e-05;-1.0138638572244e-05;-8.676816651132e-05;-8.4135936049279e-06;-0.00028977761394344;0.0001003880679491;-0.00016000644245651;-8.7707019702066e-05;-0.00010455091978656;-0.00013723286974709;0.00054384174291044;-4.2779065552168e-05;0.00036631512921304;1.9885486835847e-05;4.9952477638726e-06;-4.6519417082891e-05;0.00091322790831327;-2.4660179406055e-05;0.00065151473972946;2.9433288091241e-06;-0.00014988590555731;4.6636996557936e-05;-0.00013206421863288;-0.00016147340647876;5.2457457059063e-05;4.5242177293403e-05;0.00029620216810144;-0.00028950622072443;0.00012185490777483;-0.00071823061443865;-6.9476245698752e-06;-0.00045827450230718;-3.9936762732395e-06;-0.00089181697694585;2.3986289306777e-05;0.00022615744092036;-1.3815573765896e-05;-0.00021293062309269;0.00011161108704982;0.00030208809766918;0.0002512774663046;0.00031470780959353;9.7611424280331e-05;-0.00016155090997927;-3.1206450330501e-06;-7.6508724305313e-05;0.00010317550913896;-0.00021519901929423;0.00030650713597424;-0.00022826161875855;2.6582940336084e-05;0.00038159766700119;0.00015813995560165;0.00038108404260129;0.00015364706632681;-0.00022313105000649;-0.00051076483214274;-0.00025394806289114;-0.00016688820323907;-0.00026022241218016;-9.7204516350757e-05;-0.00020337609748822;-2.9475297196768e-05;-0.00019671280460898;0.00077856029383838;-6.0224560002098e-05;-0.00045325548853725;-4.209331018501e-05;4.388923116494e-05;5.4589054343523e-05;-0.00026326481020078;3.6504410672933e-05;0.00035222806036472;-0.00011619353608694;-0.00018249654385727;2.6958352464135e-05;-5.3060717618791e-05;5.8506775530986e-05;0.00060992373619229;-8.6144009401323e-06;0.00010020114132203;1.2508180589066e-05;0.00029347866075113;-4.5567168854177e-05;-0.00021325539273676;0.00022845687635709;4.6176366595319e-05;0.00029974745120853;1.1728282515833e-05;-0.00014771379937883;-9.3324204499368e-05;-0.00056780641898513;4.3884669139516e-05;-7.5276439019945e-05;-8.8706356109469e-06;-0.00010028862743638;-4.72958345199e-06;-0.00029622565489262;0.00011057278607041;-0.00017136907263193;-9.9138291261625e-05;-0.00013065549137536;-0.00015765854914207;0.00056937668705359;-5.213932308834e-05;0.0003911055973731;1.9911462004529e-05;6.4076148191816e-06;-6.2755927501712e-05;0.000982855563052;-4.0778770198813e-05;0.00068182009272277;3.9711298995826e-06;-0.00017139651754405;5.7182096497854e-05;-0.00014282528718468;-0.00016908872930799;5.2789459004998e-05;5.9928315749858e-05;0.00032325292704627;-0.00031265121651813;0.0001474136224715;-0.00075837143231183;2.7683038297255e-06;-0.00047451624413952;9.1408428488648e-06;-0.00095238583162427;2.4726688934606e-05;0.00025250753969885;7.2034890763462e-05;5.8139225984633e-06;-0.00069647980853915;-5.3970288718119e-05;-0.00060217775171623;-2.4183829737012e-05;-0.00025816998095252;-0.00010839522292372;0.00010848656529561;-1.4793678246861e-06;0.00072435132460669;-5.8118959714193e-05;-0.00050757091958076;-0.00020363049407024;-0.00024872153881006;-2.1212559659034e-05;5.4100546549307e-05;-0.000421285192715;9.8109876489616e-06;0.00070475443499163;-1.223087656399e-05;0.00033753187744878;0.00013499180204235;0.00035953553742729;0.00013321118603926;0.00055053899995983;0.00011431767779868;-0.00072507152799517;0.00011087901657447;0.0004514041938819;7.0935362600721e-05;-0.000131204695208;2.3226466510096e-05;0.00026300793979317;-2.0582245269907e-05;0.00028099524206482;3.6209083191352e-05;-0.00036407663719729;-3.7631321902154e-05;-8.1696111010388e-05;8.6122905486263e-05;-0.00014253197878134;1.6048597899498e-05;0.00012961511674803;-1.5614177755197e-05;0.00079330417793244;-6.4326930441894e-05;2.0308916646172e-05;-3.3624142815825e-05;0.00015164063370321;-0.00023980998957995;8.2883831055369e-05;0.0001898290211102;-0.00016182671242859;-0.00033090796205215;-2.5238074158551e-05;-0.00028065862716176;6.2060338677838e-05;0.00082174927229062;-2.4771190510364e-05;-0.0010458565084264;4.3355732486816e-05;-0.000158672730322;0.00012507165956777;-0.00023557880194858;-0.00018481948063709;0.00088224868522957;-0.00031668160227127;0.00035852854489349;-0.00016631642938592;-9.3063608801458e-06;8.3373946836218e-05;0.001163141685538;-0.00011287877714494;0.0012053595855832;-0.00017961570119951;0.00013548663991969;-4.5018136006547e-05;8.7946238636505e-05;-0.00041115915519185;-0.00023347778187599;0.00010568505967967;0.00019683346909005;-0.00021857363753952;0.00054214091505855;-0.0011068478925154;0.00026114852516912;-0.00090527726570144;0.0001413273421349;-0.0010726127075031;9.2019574367441e-05;-9.2443820904009e-05;6.8968300183769e-05;9.3631875643041e-05;1.3296327779244e-05;-0.00075406424002722;-7.6543467002921e-05;-0.0005869924207218;-9.4712770078331e-05;-0.00024212828429881;-0.00015191471902654;0.00012901217269246;1.5997289665393e-05;0.00086834310786799;-8.6274703789968e-05;-0.00036974984686822;-0.00028727957396768;-0.00027585346833803;-4.609340976458e-05;2.1618930986733e-05;-0.00054038938833401;-3.1196872441797e-05;0.00082248885883018;4.0161154174712e-05;0.00037629078724422;0.00022779691789765;0.00024051927903201;0.00020024065452162;0.00049755320651457;0.00018041055591311;-0.00091510196216404;0.00015344827261288;0.00047197213280015;0.00010551362356637;-0.00014021640527062;2.1470021238201e-05;0.00030715341563337;-8.3648010331672e-06;0.00037739166873507;4.8534100642428e-05;-0.00041165872244164;-5.5565971706528e-05;-0.00011901115067303;0.00010410983668407;-0.00012069817603333;1.9322227672092e-05;0.00016769711510278;-1.759133010637e-05;0.00092811085050926;-6.9173496740405e-05;-3.8077369026723e-06;-3.5564778954722e-05;0.00021453635417856;-0.00025121986982413;0.00010100589133799;0.00016109572607093;-0.00020015191694256;-0.00046406700857915;-4.1952247556765e-05;-0.00032873803866096;7.5258016295265e-05;0.00093075359473005;-2.1960251615383e-05;-0.0012095350539312;4.2838077206397e-05;-0.00020048378792126;0.00014938648382667;-0.00024648441467434;-0.00021071513765492;0.0010828686645254;-0.00035318016307428;0.0004385908250697;-0.00018726973212324;-1.9017164959223e-05;9.6773357654456e-05;0.0013824771158397;-0.00012426395551302;0.0014116588281468;-0.00018567052029539;0.00016373123798985;-4.4806380174123e-05;0.00010056640894618;-0.00045793908066116;-0.00026772677665576;9.4985349278431e-05;0.00022380906739272;-0.00028970980201848;0.00062319845892489;-0.0013384544290602;0.00028627665597014;-0.0010830308310688;0.00014535465743393;-0.0012573616113514;9.5756680821069e-05;-0.00010053347068606;7.121340604499e-05;9.9388351372909e-05;1.8236598407384e-05;-0.00058379274560139;-8.6704218119849e-05;-0.0004566345596686;-0.00015308837464545;-0.00019992816669401;-0.0001635806838749;0.00011951736814808;4.3436582927825e-05;0.00072335411095992;-9.7058516985271e-05;-0.00013082954683341;-0.0003285029088147;-0.0001856764574768;-7.8369906987064e-05;-3.5820557968691e-05;-0.00054719886975363;-7.352554530371e-05;0.00073356047505513;0.00010593780461932;0.00038294540718198;0.0002580980071798;7.7893710113131e-05;0.00023315659200307;0.00031075731385499;0.00022800857550465;-0.0008149926434271;0.00016823792248033;0.00030027292086743;0.00013290197239257;-9.6396724984515e-05;9.4692277343711e-06;0.00028699997346848;2.0758687242051e-05;0.00037685880670324;5.2801984566031e-05;-0.00032950669992715;-5.9014073485741e-05;-0.00014371061115526;9.7204167104792e-05;-0.00010219636897091;1.73399457708e-05;0.00018704954709392;-1.5047099623189e-05;0.0008340424974449;-5.2246999985073e-05;-5.6527151173213e-05;-1.5779523891979e-05;0.00023860107467044;-0.00018441020802129;0.00010052533616545;6.1831298808102e-05;-0.00020565019804053;-0.00047630560584366;-5.8070745581063e-05;-0.00031321731512435;6.9870671723038e-05;0.00083051819819957;-6.7349815253692e-06;-0.0010945199755952;2.5462788471486e-05;-0.00018387775344308;0.00013212443445809;-0.00016894853615668;-0.00018055809778161;0.0010343452449888;-0.00029244308825582;0.00039684606599621;-0.00015851369244047;-2.9983910280862e-05;9.3279842985794e-05;0.0012158835306764;-9.1096291725989e-05;0.0012988446978852;-0.00012841113493778;0.00020473735639825;-3.4492171835154e-05;6.9220215664245e-05;-0.00040857578278519;-0.00023911314201541;4.8073285142891e-05;0.00021692493464798;-0.00026871953741647;0.00054577382979915;-0.0012347133597359;0.00021801184630021;-0.0010302949231118;0.0001042208969011;-0.001105752424337;6.4375264628325e-05;-0.000140745396493;5.3577736252919e-05;0.0001197889650939;2.0257421056158e-05;-0.00043504050699994;-9.394547669217e-05;-0.00038847417454235;-0.00020440560183488;-0.00016881384362932;-0.0001774484408088;0.00011083811114077;7.2178438131232e-05;0.00057211064267904;-0.000109619111754;5.9506932302611e-05;-0.00038395030423999;-0.00012211344437674;-0.00011303346400382;-0.000103946600575;-0.00056372414110228;-0.00011041048855986;0.00068561796797439;0.00016915745800361;0.00041018897900358;0.00027802883414552;-3.3838663512142e-05;0.00026922742836177;0.00017375305469614;0.0002828442666214;-0.00073811534093693;0.00019242487906013;0.00016566496924497;0.00016529133426957;-6.1042970628478e-05;1.4817487681285e-06;0.00024530140217394;5.0737842684612e-05;0.00038626164314337;6.5436986915302e-05;-0.00025419236044399;-6.5280408307444e-05;-0.00017462696996517;8.8073713413905e-05;-2.6823878215509e-05;1.3026611668465e-05;0.00019706237071659;-1.2248494385858e-05;0.00075395917519927;-2.9079639716656e-05;-0.00010470000415808;2.1244768504403e-06;0.0002814258041326;-0.000100460696558;9.5248215075117e-05;-5.0903319788631e-05;-0.00022139570501167;-0.00051366403931752;-7.5935742643196e-05;-0.00029595743399113;6.1170248955023e-05;0.00072140945121646;1.1796355465776e-05;-0.00099165760912001;3.4532251902419e-06;-0.00017238753207494;0.00011996690591332;-0.00011440303933341;-0.0001558758522151;0.00099948793649673;-0.00023701637110207;0.00037724041612819;-0.00013220403343439;-3.8234808016568e-05;9.1682806669269e-05;0.0011048921151087;-5.8390334743308e-05;0.0012288936413825;-6.9321824412327e-05;0.00023473109467886;-2.2490245100926e-05;3.9341448427876e-05;-0.0003825182793662;-0.00022810119844507;1.9985511244158e-05;0.00021680166537408;-0.00025018063024618;0.0004931238363497;-0.0011467632139102;0.00015229769633152;-0.0010072777513415;5.9005924413214e-05;-0.0010250372579321;3.1978659535525e-05;-0.00016528577543795;3.6058438126929e-05;0.00012899655848742;1.8683431335376e-05;-0.0003142952627968;-8.7749467638787e-05;-0.0003340647672303;-0.00021172629203647;-0.00012772990157828;-0.00016791661619209;9.3585753347725e-05;8.0695484939497e-05;0.0004231859347783;-0.00010829352686414;0.00015354953939095;-0.00038602401036769;-9.3676491815131e-05;-0.00012101574247936;-0.00014042720431462;-0.00051897327648476;-0.00011961959535256;0.00060880993260071;0.00018851563800126;0.00038593431236222;0.00025805275072344;-7.5718860898633e-05;0.00026655627880245;9.248276182916e-05;0.00028924518846907;-0.00064302503596991;0.00019452489505056;9.8924763733521e-05;0.00016851285181474;-3.5973698686576e-05;-1.8906745253844e-06;0.00017765921074897;6.3623665482737e-05;0.00036035539233126;6.9986337621231e-05;-0.0001907426485559;-6.503181066364e-05;-0.00017490173922852;7.048935367493e-05;6.4882602600846e-05;9.0414760052226e-06;0.00017845783440862;-8.0657755461289e-06;0.00063413882162422;-7.1725407906342e-06;-0.0001212535353261;3.9772685340722e-06;0.00028814340475947;-2.3566006348119e-05;8.2204103819095e-05;-0.0001184361462947;-0.00020949506142642;-0.00050647417083383;-8.0930258263834e-05;-0.00025177985662594;4.7061112127267e-05;0.00056534417672083;2.2848582375445e-05;-0.00082868081517518;-1.3818630577589e-05;-0.00015366928710137;0.00010384790220996;-8.1779151514638e-05;-0.00012706320558209;0.00088141503510997;-0.00018044245371129;0.0003423435264267;-0.00010294327512383;-3.6793739127461e-05;8.0956240708474e-05;0.00096385792130604;-3.2780055335024e-05;0.0010782813187689;-2.4121221940732e-05;0.00021146658400539;-1.1225732123421e-05;1.9521708964021e-05;-0.00033502589212731;-0.00020733757992275;1.1112275387859e-05;0.00019402102043387;-0.00021969189401716;0.00042297129402868;-0.00098738970700651;9.8006530606654e-05;-0.00089976069284603;2.1574485799647e-05;-0.00091665313811973;7.3233795774286e-06;-0.00014165684115142;2.1634739823639e-05;-4.6107037633192e-05;-0.00010001836199081;0.00019202087423764;0.00036440882831812;0.00027463448350318;0.00027275894535705;0.00016794996918179;0.00020470020535868;-3.9552061934955e-05;-0.00014649319928139;0.00014316824672278;-0.00049575779121369;0.00046761275734752;-0.00019895502191503;9.1307854745537e-05;9.3560636742041e-05;5.1851664466085e-05;0.00055630784481764;0.0001006514794426;-0.00022589141735807;-0.00055496481945738;-0.00026279437588528;-0.00044146535219625;-0.00039392083999701;0.00011912653280888;-0.0003173628647346;-7.9050747444853e-05;-0.00024507316993549;0.00070125446654856;-0.00015490227087867;-9.9005483207293e-05;-1.4379885215021e-05;9.5915456768125e-06;6.7187909735367e-05;0.00019208947196603;6.0233251133468e-05;0.00026965577853844;-7.8152945206966e-05;-0.00030189950484782;8.3762992289849e-05;-0.00017100304830819;5.4620228183921e-05;-0.0001236167299794;-2.6455614715815e-05;0.00014753408322576;-3.6001587432111e-05;0.00074797676643357;-0.0001711486838758;-6.1770399042871e-05;0.00030733141466044;0.00015867500042077;-1.5445546523551e-05;-0.00022550733410753;-3.7318079648685e-07;-0.00012969881936442;-0.00031512937857769;9.2259513621684e-05;-0.00025611917953938;6.6930570028489e-06;0.00066637009149417;1.0793926776387e-05;-0.00094807316781953;0.00011317744792905;-0.00014205218758434;-0.00015348012675531;-2.8687823942164e-05;-0.00022513368458021;0.00092421763110906;-7.8791330452077e-05;0.00035701299202628;7.1729577030055e-05;-3.4978893381776e-05;-3.9123679016484e-05;0.00089611922157928;-3.9643655327382e-05;0.0011259182356298;-2.0228329958627e-05;0.0002332400472369;-1.0289240890415e-05;-0.00035270999069326;-0.00022012226691004;0.00025396561250091;-6.3891402533045e-06;0.00041930031147785;-0.00022767559858039;0.00014245360216592;-0.0010394537821412;2.6910465749097e-05;-0.00091788172721863;-1.0325685479984e-06;-0.00087813660502434;3.64809675375e-05;-0.00018471566727385;-4.7747718781466e-05;-9.8795404483099e-05;0.00019950761634391;0.00047610150068067;0.0002753678127192;0.0002949902554974;0.00017822315567173;0.00023844015959185;-3.0249393603299e-05;-0.00016636138025206;0.00014921771071386;-0.00063541549025103;0.00047023096703924;-0.00014159892452881;8.3481274486985e-05;0.00012255542969797;2.2929087208468e-05;0.00060973106883466;9.6562245744281e-05;-0.00021503945754375;-0.00063125300221145;-0.00029265097691678;-0.00045735784806311;-0.000402621953981;0.00010686702444218;-0.00031365649192594;-0.00013414991553873;-0.00024766268325038;0.00080914003774524;-0.00015224373782985;-0.0001665409799898;-1.4837058188277e-05;-9.1265528681106e-06;5.7174926041625e-05;0.00025430752430111;5.8201934734825e-05;0.00028485854272731;-7.6548582001124e-05;-0.00039539590943605;9.5343515567947e-05;-0.00016117896302603;5.8989211538574e-05;-0.00021332496544346;-3.2381154596806e-05;0.00016077197506092;-5.5314401834039e-05;0.00088234443683177;-0.00016172292816918;-7.8662000305485e-05;0.00030574697302654;0.00017784387455322;-8.0338453699369e-05;-0.00024154904531315;9.039492579177e-05;-0.00012608359975275;-0.00031612601014785;0.00010529180144658;-0.00029180361889303;-2.8888578071928e-06;0.00082243810174987;2.8167190976092e-05;-0.0011245927307755;0.0001327902864432;-0.0001607566664461;-0.00018621799245011;-5.2167153626215e-05;-0.00029309443198144;0.0010452939895913;-0.00010746247426141;0.00040107971290126;8.0593090387993e-05;-3.6727353290189e-05;-7.1412978286389e-05;0.0010269701015204;-8.8225468061864e-05;0.0012748158769682;-2.9448498025886e-05;0.00025018863379955;3.6589171941159e-06;-0.00039661157643422;-0.00024107478384394;0.0002841328678187;-1.5683308447478e-06;0.00049310340546072;-0.0002702061610762;0.00020717389998026;-0.0011939391260967;6.6936772782356e-05;-0.0010250945342705;2.8004231353407e-05;-0.00098727690055966;4.8304857045878e-05;-0.00020176218822598;-4.1350784158567e-05;-8.5719075286761e-05;0.00017954433860723;0.00057552178623155;0.0002196971909143;0.0003170054696966;0.00016369728837162;0.00026288296794519;-1.097631684388e-05;-0.00016867771046236;0.00013194044004194;-0.00073017459362745;0.00040445505874231;5.1311673132659e-07;5.7514473155607e-05;0.00015618775796611;-2.5607752832002e-05;0.00058934435946867;6.7071516241413e-05;-0.00015715768677182;-0.00065694033401087;-0.0002742268552538;-0.00042229914106429;-0.00034995365422219;3.8358855817933e-05;-0.00025783819728531;-0.00022545161482412;-0.00021574689890258;0.00083972048014402;-0.00012485652405303;-0.00025647788424976;-1.146219256043e-05;-3.4827819035854e-05;3.4033277188428e-05;0.00030180648900568;4.9293652409688e-05;0.00025892761186697;-6.1986756918486e-05;-0.00047848102985881;9.4966759206727e-05;-0.00012183831859147;5.8091776736546e-05;-0.00030197924934328;-3.4790475183399e-05;0.0001499929203419;-7.2223105235025e-05;0.00094917963724583;-0.00012611242709681;-9.4594543043058e-05;0.00026325238286518;0.00018200367048848;-0.00015565665671602;-0.00023398175835609;0.00021107889187988;-0.00010527425183682;-0.00026838638586923;0.00010651647608029;-0.00029673150856979;-1.6804133338155e-05;0.00092442613095045;4.7137942601694e-05;-0.001215577009134;0.00014242927136365;-0.00016429452807643;-0.00020652264356613;-8.0379169958178e-05;-0.000349355279468;0.0010680853156373;-0.00013192082406022;0.00041350640822202;8.2025202573277e-05;-3.2207753974944e-05;-0.00010641446715454;0.0010752408998087;-0.00014355561870616;0.0013184465933591;-3.8610098272329e-05;0.00023237931600306;1.9789154976024e-05;-0.00041035120375454;-0.00024352806212846;0.00029034118051641;1.2484741091612e-05;0.00053393858252093;-0.00028965619276278;0.00026980551774614;-0.0012455976102501;0.00011236668069614;-0.0010384391061962;6.3427854911424e-05;-0.001020641066134;5.9255769883748e-05;-0.00019204895943403;-3.2241972803604e-05;-7.2480186645407e-05;0.00015395133232232;0.00065262487623841;0.00014350163110066;0.00036635115975514;0.0001423843059456;0.00029999637627043;6.5218900999753e-06;-0.00016268223407678;0.00010768041101983;-0.0007716593099758;0.0003318743838463;0.00018190877744928;3.1974439480109e-05;0.0001806127402233;-7.3648763645906e-05;0.00054322759388015;2.4775588826742e-05;-8.8101609435398e-05;-0.00066395581234246;-0.00022456508304458;-0.00039497209945694;-0.00028402116731741;-6.9369983975776e-05;-0.00019618030637503;-0.00033973369863816;-0.0001797916193027;0.0008182373130694;-9.653019515099e-05;-0.00033568876096979;-6.102053248469e-06;-5.6961067457451e-05;1.2061505003658e-05;0.00033329907455482;4.3617103074212e-05;0.00021514664695133;-4.4479642383521e-05;-0.00054167659254745;8.9456763816997e-05;-8.3713537605945e-05;5.6013126595644e-05;-0.00037658092333004;-3.4656997740967e-05;0.00012713299656752;-8.2680693594739e-05;0.00098515721037984;-9.1698384494521e-05;-0.0001047233454301;0.00022066304518376;0.00018153687415179;-0.00021600585023407;-0.00022806151537225;0.00031776298419572;-8.5997839050833e-05;-0.00020120525732636;0.00010188895248575;-0.00029070087475702;-2.8326436222414e-05;0.00099506555125117;6.0599068092415e-05;-0.0012658298946917;0.00014593427476939;-0.00015884226013441;-0.00021898372506257;-0.00010685937741073;-0.00038935444899835;0.0010512416483834;-0.00014836974150967;0.00041399241308682;8.1324738857802e-05;-2.4811624825816e-05;-0.00013183341070544;0.0010847894009203;-0.00018668023403734;0.0013312069931999;-4.5829139708076e-05;0.00020953515195288;2.9309087040019e-05;-0.00042232708074152;-0.00024594052229077;0.0002937026147265;3.2848525734153e-05;0.00055963190970942;-0.00028835629927926;0.00031543185468763;-0.0012479735305533;0.00014724279753864;-0.0010265262098983;9.0893023298122e-05;-0.0010322318412364;6.8000219471287e-05;-0.00018016528338194;-1.7287335140281e-05;-5.5019758292474e-05;0.00010673244833015;0.0005679918685928;5.6613520428073e-05;0.00036732081207447;9.8323253041599e-05;0.0002924096188508;1.5364370483439e-05;-0.00012871765648015;6.7682238295674e-05;-0.00060723134083673;0.00022496098245028;0.00030221926863305;1.2303108633205e-05;0.00015000606072135;-8.7155640358105e-05;0.00040648464346305;-1.3417098671198e-05;-2.5848230507108e-05;-0.00054009148152545;-0.00012965554196853;-0.00033157307188958;-0.00018304129480384;-0.00016985600814223;-0.00012088402581867;-0.00037492319825105;-0.00012266867270228;0.00060878065414727;-6.2871076806914e-05;-0.00030695140594617;-5.7337479120179e-07;-5.8290650486015e-05;-1.1473387075966e-06;0.00028095350717194;3.2860836654436e-05;0.00014019919035491;-2.5210614694515e-05;-0.00046190436114557;6.7446439061314e-05;-4.6513818233507e-05;4.2720061173895e-05;-0.00034090812550858;-2.8189084332553e-05;8.9670757006388e-05;-7.0277150371112e-05;0.00080401974264532;-5.6089524150593e-05;-8.6623447714373e-05;0.00015385914593935;0.00014357664622366;-0.0002007802540902;-0.00018176232697442;0.0003094220883213;-5.8399858971825e-05;-0.00011725589865819;7.814378477633e-05;-0.00022963389346842;-2.7713738745661e-05;0.00083786732284352;5.4845972044859e-05;-0.0010443120263517;0.0001178420643555;-0.00011985968740191;-0.00018436672689859;-0.00010261608258588;-0.00033577717840672;0.00082767446292564;-0.00012754593626596;0.00032540014944971;6.6434455220588e-05;-1.4215737792256e-05;-0.00011705364886438;0.00086787593318149;-0.00017377259791829;0.0010875824373215;-4.2394927731948e-05;0.0001677900145296;2.4472255972796e-05;-0.00035987375304103;-0.00020412556477822;0.00024716279585846;4.2813055188162e-05;0.00046649001887999;-0.00021371761977207;0.00027660134946927;-0.00099258776754141;0.00013781258894596;-0.00082482484867796;8.6833431851119e-05;-0.00083811668446288;6.1120415921323e-05;-0.00015305665147025;9.6844203653745e-05;5.3965773076925e-06;-0.00080832763342187;-4.870615521213e-05;-0.00060047151055187;-5.123622395331e-05;-0.00017556041711941;-0.00013327554916032;0.00011773419100791;-1.0330423720006e-05;0.00093297538114712;-7.5814961746801e-05;-0.00047015663585626;-0.00023383359075524;-0.00041369325481355;-1.0215525435342e-05;3.4853277611546e-05;-0.00046459582517855;2.4449650481984e-06;0.00083846267079934;-1.7437270798837e-05;0.00025588812422939;0.00019986099505331;0.00028623305843212;0.00015901733422652;0.00059031462296844;0.00012854083615821;-0.0010052552679554;0.00013823017070536;0.00066285760840401;6.9256406277418e-05;-0.00018633855506778;4.0256851207232e-05;0.00018573353008833;-3.5776694858214e-05;0.00035543253761716;5.8182966313325e-05;-0.00042664897046052;-5.7694440329215e-05;-9.1132591478527e-05;8.8068634795491e-05;9.9177130323369e-05;9.5214309112635e-06;7.0138812588993e-05;-1.6248844985967e-05;0.00084360712207854;-5.6607375881867e-05;7.6330368756317e-05;-5.2828567277174e-05;0.00020608480554074;-0.00021230053971522;5.372286614147e-05;0.00016442345804535;-0.00016930660058279;-0.00046654875040986;-1.8470007489668e-05;-0.00024464962189086;5.804724059999e-05;0.00076171412365511;-2.439469062665e-05;-0.0010516013717279;4.0105780499289e-05;-0.00020231230882928;0.0001520453079138;-0.000343099294696;-0.00020917366782669;0.00093759596347809;-0.00034401277662255;0.00045753765152767;-0.00017908558947966;2.2850433651911e-06;7.6058451668359e-05;0.0014352562138811;-0.00013866033987142;0.0012809818144888;-0.00019719924603123;2.0103838323848e-05;-3.3689189876895e-05;0.00013561543892138;-0.00043197389459237;-0.00027085962938145;0.0001608578604646;0.00017027273133863;-0.0002920446859207;0.00061803671997041;-0.0012072185054421;0.00030558276921511;-0.00094565661856905;0.00013876182492822;-0.0013246283633634;0.00010713667143136;5.3513289458351e-05;6.7972468968946e-05;0.00013786836643703;1.448993498343e-05;-0.00096128549193963;-7.8006749390624e-05;-0.00061951496172696;-0.00014523927529808;-0.00013163562107366;-0.00019538709602784;0.00014879915397614;5.0376916078676e-06;0.0012037826236337;-0.00011863802501466;-0.00032461545197293;-0.00035105968709104;-0.00051690451800823;-3.4267141018063e-05;-2.7683220196195e-06;-0.00063995964592323;-5.2705890993821e-05;0.0010588403092697;4.0844643081073e-05;0.00029018221539445;0.00033979216823354;0.00016380756278522;0.00025423054466955;0.0005618660361506;0.00021369812020566;-0.0013672551140189;0.00020399557251949;0.0007917785551399;0.00011022944090655;-0.00021279463544488;4.067993722856e-05;0.00022154378530104;-2.6646228434402e-05;0.00052084540948272;7.5366238888819e-05;-0.00051857676589862;-8.9383589511272e-05;-0.00013415935973171;0.00011229511437705;0.0001981426612474;1.4679967534903e-05;0.00012423939188011;-1.9974688257207e-05;0.0010554930195212;-6.2626866565552e-05;6.3242077885661e-05;-7.6244024967309e-05;0.0002970592759084;-0.00022224968415685;7.5939169619232e-05;0.00013364739425015;-0.00021112362446729;-0.00070012267678976;-3.772849595407e-05;-0.00031698940438218;7.6619275205303e-05;0.00090145802823827;-2.3193768356577e-05;-0.0013005955843255;4.1158578824252e-05;-0.00027715394389816;0.00019594829063863;-0.00039514745003544;-0.00025585456751287;0.0012341570109129;-0.00040965710650198;0.00059299869462848;-0.00021582997578662;-3.3646508654783e-06;9.2139067419339e-05;0.0018429514020681;-0.00016559510549996;0.0015997576992959;-0.00021918266429566;1.8155522411689e-05;-3.2300580642186e-05;0.00017080712132156;-0.00050805660430342;-0.00032955224742182;0.00016663732822053;0.00020051996398252;-0.00041142175905406;0.00075919966911897;-0.0015767224831507;0.00036209408426657;-0.0011972819920629;0.00015011825598776;-0.0016703577712178;0.00011999950947938;8.7367327068932e-05;7.4627976573538e-05;0.00011391237785574;2.3346865418716e-05;-0.00065099232597277;-8.7175802036654e-05;-0.00039372630999424;-0.00018553533300292;-8.3955346781295e-05;-0.00017898782971315;0.00011500714026624;3.4613680327311e-05;0.00088022189447656;-0.00011636809358606;-3.4744723961921e-05;-0.00034800797584467;-0.00031709016184323;-6.4755091443658e-05;-4.7311477828771e-05;-0.00055911426898092;-8.8694985606708e-05;0.00080198654904962;0.00010428767564008;0.00027299881912768;0.00031895388383418;-1.7994829249801e-05;0.00025962383369915;0.0002749202249106;0.00023453769972548;-0.0010482214856893;0.00019216831424274;0.00047130935126916;0.00012478773714975;-0.00011475566134322;1.3996384041093e-05;0.0002025857247645;1.145349961007e-05;0.00043320079566911;6.272470636759e-05;-0.00036592272226699;-7.5562536949292e-05;-0.00013809754454996;9.1372647148091e-05;9.0424517111387e-05;1.7333597497782e-05;0.00015307748981286;-1.2225352293171e-05;0.00084001640789211;-4.0597242332296e-05;-2.2279995391727e-05;-5.3936775657348e-05;0.0002664718485903;-0.0001356017019134;8.6309846665245e-05;4.2709110857686e-05;-0.00018819929391611;-0.00057740625925362;-5.6968587159645e-05;-0.00028638512594625;6.3443032559007e-05;0.00072903872933239;-6.9881971285213e-06;-0.0010478693293408;1.8638003894011e-05;-0.00021708486019634;0.00014686018403154;-0.00023191013315227;-0.00018589707906358;0.0010296346154064;-0.00028830411611125;0.00045223123743199;-0.0001562462275615;-1.577372495376e-05;7.8030323493294e-05;0.0013813772238791;-0.00010256290988764;0.0012711443705484;-0.00012665573740378;8.2484191807453e-05;-2.0162073269603e-05;0.00010535476758378;-0.00038469207356684;-0.00024786984431557;7.8682744060643e-05;0.00017347362881992;-0.00032786524388939;0.00056550599401817;-0.0012692214222625;0.0002338783669984;-0.00098443997558206;8.8633154518902e-05;-0.0012440434657037;6.6564905864652e-05;1.2179257282696e-06;4.7655132220825e-05;0.00014175442629494;2.6869794965023e-05;-0.0004914395394735;-0.00010180568642681;-0.00035724396002479;-0.00024392566410825;-8.1230748037342e-05;-0.00019591432646848;0.00010884015500778;6.9124565925449e-05;0.00068695953814313;-0.00013311825750861;0.00015291624004021;-0.00042455835500732;-0.00021969142835587;-0.0001089535508072;-0.00012494047405198;-0.00059749151114374;-0.00013022834900767;0.00076129782246426;0.00018464188906364;0.00034841589513235;0.00033451456693001;-0.00010085158282891;0.00030809972668067;0.0001359153247904;0.00030574447009712;-0.0009434848325327;0.0002263798378408;0.00029560024267994;0.00016780376608949;-6.5033622377086e-05;1.1928103731407e-06;0.00017994025256485;4.9633974413155e-05;0.00044648520997725;7.4383788160048e-05;-0.00029137713136151;-8.261670882348e-05;-0.00017394428141415;8.3907492808066e-05;0.00013028446119279;1.6165828128578e-05;0.0001900756615214;-7.8701259553782e-06;0.00078719685552642;-1.6538748241146e-05;-9.4066330348141e-05;-4.1835941374302e-05;0.00031482687336393;-4.5926601160318e-05;9.6368428785354e-05;-6.8551809818018e-05;-0.00021115185518283;-0.00062391243409365;-8.3777325926349e-05;-0.00029160451958887;5.6894896260928e-05;0.00065808393992484;1.2903492461191e-05;-0.00099387345835567;-6.2630265347252e-06;-0.00020601262804121;0.00013506339746527;-0.00015982126933523;-0.00016301912546623;0.0010306988842785;-0.00023620642605238;0.00043423406896181;-0.00013209377357271;-2.8037116862833e-05;8.3182807429694e-05;0.0012753059854731;-6.3571889768355e-05;0.0012516113929451;-6.241980008781e-05;0.00014529238978866;-1.1659642041195e-05;6.544217467308e-05;-0.00037574276211672;-0.00024458832922392;4.125510531594e-05;0.00019105042156298;-0.00030408866587095;0.0005228606169112;-0.001214343123138;0.00016154925106093;-0.0010078015038744;4.3160660425201e-05;-0.0011759886983782;2.8245825888007e-05;-5.5880191212054e-05;3.2321873732144e-05;0.00018441709107719;2.818717257469e-05;-0.0003808967594523;-0.0001098694774555;-0.00036538441781886;-0.00028741883579642;-5.3316663979786e-05;-0.000208007870242;0.00010130804002983;9.1143141617067e-05;0.00052673305617645;-0.00015135439753067;0.0002918585378211;-0.00049825897440314;-0.00019547849660739;-0.00013836665311828;-0.00020372886501718;-0.00062649784376845;-0.00016156013589352;0.00076516199624166;0.00024766745627858;0.00039484084118158;0.00034165807301179;-0.000134485293529;0.0003515514836181;5.0200782425236e-05;0.00036425623693503;-0.00091893365606666;0.00026843388332054;0.0002263900678372;0.00019975045870524;-3.0351375244209e-05;-5.3364024097391e-06;0.00010940650099656;7.902696961537e-05;0.00047234090743586;9.0444867964834e-05;-0.00024494758690707;-9.5528455858584e-05;-0.00019716935639735;6.9302615884226e-05;0.00028217933140695;1.4969143194321e-05;0.00020410081197042;-7.9775560379858e-07;0.00073651655111462;1.5328441804741e-05;-0.00014389235002454;-5.5797245295253e-05;0.00037157261976972;7.144679693738e-05;0.00010081592336064;-0.0001720661384752;-0.00022381939925253;-0.00071597949136049;-0.00010830484825419;-0.00027637757011689;4.4440806959756e-05;0.00053439888870344;3.0728282581549e-05;-0.00092147570103407;-3.5175729863113e-05;-0.00020970379409846;0.0001319560687989;-0.00012933820835315;-0.00014604795433115;0.0010200683027506;-0.00019100117788184;0.000450364430435;-0.0001094437102438;-3.1146373657975e-05;8.3483959315345e-05;0.0012648397823796;-3.1728395697428e-05;0.0012427011970431;-3.4766660519381e-06;0.0001433667348465;1.3224413919488e-07;4.076966069988e-05;-0.00037240408710204;-0.00025780659052543;3.310693136882e-05;0.00019527025870048;-0.00029821970383637;0.0005046091391705;-0.0011703127529472;0.00010317877604393;-0.0010219120886177;-4.9345867410011e-06;-0.001209247042425;-7.7000931923976e-06;-3.8157773815328e-05;1.8733489923761e-05;0.00016087836411316;2.138130912499e-05;-0.00022071239072829;-8.3191560406704e-05;-0.00028417145949788;-0.00022421967878472;-1.8269687643624e-05;-0.00015397700190078;6.8045257648919e-05;7.429259858327e-05;0.00029000296490267;-0.00012011909711873;0.00027660818886943;-0.0004034494922962;-0.00014462732360698;-0.00011208456999157;-0.00019217132648919;-0.00046380271669477;-0.00013034346920904;0.00056452740682289;0.0002090029156534;0.00030751395388506;0.00024205696536228;-0.00010131311137229;0.00027788130682893;2.6504812922212e-06;0.00029242181335576;-0.00066610740032047;0.00022211008763406;0.00014927469601389;0.00015991201507859;-3.0651228826173e-06;-5.499845428858e-06;2.8117290639784e-05;7.238176476676e-05;0.00035431201104075;7.5781950727105e-05;-0.00015930100926198;-7.7195007179398e-05;-0.00015142765187193;3.7918012822047e-05;0.00031679551466368;1.0976567864418e-05;0.0001497308985563;5.4527868087462e-06;0.00050414947327226;3.331092375447e-05;-0.00013197408406995;-5.7448043662589e-05;0.00030458078254014;0.00012987857917324;7.8193290391937e-05;-0.00017950162873603;-0.00016851640248206;-0.00057952565839514;-9.388097532792e-05;-0.00018482722225599;2.2411659301724e-05;0.00030183649505489;3.1950941774994e-05;-0.00062055833404884;-4.5057906390866e-05;-0.000157326227054;9.5185358077288e-05;-8.2017373642884e-05;-9.5560011686757e-05;0.00072898023063317;-0.00011094170622528;0.00034482919727452;-6.4929285144899e-05;-2.2115755200502e-05;5.9597259678412e-05;0.00092921761097386;-3.7380418689281e-06;0.00089841650333256;3.4353655792074e-05;8.6122861830518e-05;7.9580204328522e-06;1.6223717466346e-05;-0.00026960473041981;-0.00019973798771389;2.6636816983228e-05;0.00014135685341898;-0.00021603218920063;0.00035999310784973;-0.00082295871106908;4.0186816477217e-05;-0.00074735435191542;-3.5169330658391e-05;-0.00092020787997171;-2.9073989935569e-05;1.7904837932292e-06;5.9190851970925e-06;-5.785456232843e-05;-0.00012352621706668;0.00020953174680471;0.00030427888850681;0.00030654028523713;0.00025591783924028;0.00017235246195924;8.5379761003423e-05;-4.4078449718654e-05;-0.00011612787784543;0.00016146569396369;-0.00042946124449372;0.00051897339290008;-0.00031296498491429;8.9911693066824e-05;0.00016437342856079;9.338263043901e-05;0.00052428973140195;0.00011508743045852;-0.00025520907365717;-0.00054438301594928;-0.00026368896942586;-0.00037632574094459;-0.00043464975897223;0.00015047087799758;-0.00034679271630011;-9.2082655100967e-06;-0.00028938933974132;0.0007809015805833;-0.00015517881547567;-0.00017401843797415;-1.5027374502097e-05;4.4605618313653e-05;7.4623989348765e-05;5.7047047448577e-05;6.9905872805975e-05;0.00029291477403603;-9.4487339083571e-05;-0.00027073023375124;6.0343158111209e-05;-0.00016700648120604;6.6226624767296e-05;9.9686323665082e-05;-8.8593733380549e-06;0.00012906617484987;5.8809933989323e-07;0.00066004821565002;-0.00018922559684142;-0.0001172983829747;0.00034401178709231;0.00016804834012873;0.00012531905667856;-0.00020064177806489;-8.0970232374966e-05;-0.00015740089293104;-0.00039743905654177;7.2004419052973e-05;-0.00021659176854882;1.0676327292458e-05;0.00045162104652263;-2.0396193576744e-05;-0.00079066219041124;0.00010625684080878;-0.00015210013953038;-0.00012156967568444;-3.5630539059639e-05;-0.00015499592700507;0.00084157485980541;-4.531321246759e-05;0.00038830147241242;5.7374287280254e-05;-2.280822263856e-05;-2.0329898688942e-06;0.00092816958203912;2.582678644103e-05;0.0010320582659915;-4.3579793782555e-06;0.00011655374692054;-1.1663104487525e-05;-0.0003074406995438;-0.0002280259213876;0.00020204736210871;1.6293684893753e-05;0.00038164894795045;-0.00024376831424888;7.9425029980484e-05;-0.00096381711773574;-3.6305016692495e-05;-0.0008296359446831;-4.8518504627282e-05;-0.00094348291167989;2.6394125598017e-05;-5.0458795158193e-05;-7.2595430538058e-05;-0.00014965049922466;0.00026592193171382;0.00049763359129429;0.00040114659350365;0.00031199149088934;0.00023271175450645;0.00013387970102485;-5.0432128773537e-05;-0.00016943477385212;0.00021211621060502;-0.00071380467852578;0.00064920686418191;-0.00036132239620201;0.00011049179011025;0.00023199840507004;8.9321525592823e-05;0.00072269613156095;0.00014945810835343;-0.00031283416319638;-0.00076214206637815;-0.00038580124964938;-0.00047676189569756;-0.00055679603246972;0.00021639141777996;-0.00043545683729462;-4.7846315283095e-05;-0.00035893518361263;0.0010982627281919;-0.00019553913443815;-0.00027387557202019;-2.0724719433929e-05;2.7789074010798e-05;8.4691884694621e-05;0.00014648833894171;8.7183965661097e-05;0.0003929175727535;-0.00011733681458281;-0.00042210522224195;9.5012386736926e-05;-0.00021035769896116;8.125353633659e-05;1.5274612451321e-05;-2.3025348127703e-05;0.00017435816698708;-2.5500599804218e-05;0.00096561474492773;-0.00021700233628508;-0.00014343387738336;0.00042860678513534;0.00021484243916348;6.9077432272024e-05;-0.0002710034023039;-2.1493349777302e-05;-0.0001854570582509;-0.00049339263932779;0.00010788888903335;-0.00031362168374471;7.3164769673895e-06;0.00074156577466056;-2.5241999992431e-06;-0.0011729031102732;0.00015376284136437;-0.00020749721443281;-0.00018947594799101;-7.385469507426e-05;-0.00026819494087249;0.0011822413653135;-9.0966168500017e-05;0.00052316073561087;8.0923848145176e-05;-3.2894044124987e-05;-4.2676281736931e-05;0.0012846793979406;-2.528101686039e-05;0.001433604862541;-1.3516491890186e-05;0.0001774613338057;4.3338395698811e-06;-0.00042770375148393;-0.00029864243697375;0.00028376467525959;2.1279774955474e-05;0.00055187579710037;-0.00035117278457619;0.00017252066754736;-0.0013634024653584;2.6343288936914e-06;-0.0011446957942098;-2.0742818378494e-05;-0.0012665869435295;4.2093561205547e-05;-9.7033291240223e-05;-7.064086094033e-05;-0.00014012685278431;0.00025687908055261;0.00064198952168226;0.00039051700150594;0.00029589384212159;0.00023886017152108;0.00012918101856485;-3.5143963032169e-05;-0.00018464522145223;0.0002126754989149;-0.00091996748233214;0.00061270210426301;-0.00029102966072969;9.1129782958888e-05;0.0003002495795954;4.5625423808815e-05;0.00075436953920871;0.0001433522120351;-0.00027493867673911;-0.00084045151015744;-0.00042975784162991;-0.00042741873767227;-0.00054068234749138;0.0002273947611684;-0.00040463762707077;-0.00010831084364327;-0.00034186261473224;0.0012453579111025;-0.00017799089255277;-0.00039857235969976;-1.9136097762384e-05;-8.4675239122589e-06;6.3586026953999e-05;0.00020608885097317;8.3365273894742e-05;0.00040744661237113;-0.00011154112144141;-0.00052844983292744;0.00010672511416487;-0.00018749682931229;7.961671508383e-05;-7.2203874879051e-05;-3.1824933103053e-05;0.00016967054398265;-5.0885231758002e-05;0.0010899542830884;-0.00017561897402629;-0.00015590529073961;0.00040728235035203;0.00021549938537646;-2.3104330466595e-05;-0.00027475281967781;9.2950496764388e-05;-0.00016484677325934;-0.00048087301547639;0.00011910843750229;-0.00033737244666554;-5.1930142035417e-06;0.00089104118524119;2.2869729946251e-05;-0.001327532925643;0.00017523605492897;-0.00022644574346486;-0.00022456856095232;-0.00011920224642381;-0.00034691361361183;0.0012783157872036;-0.00012724979023915;0.00056656665401533;8.4814884758089e-05;-3.1580577342538e-05;-9.2222027888056e-05;0.0014176993863657;-9.3942391686141e-05;0.0015399999683723;-2.1052932424936e-05;0.0001625303120818;3.2871368603082e-05;-0.00045391428284347;-0.00030783089459874;0.00029536223155446;3.511563045322e-05;0.00062541360966861;-0.00040889933006838;0.00025922947679646;-0.0015013131778687;5.6941204093164e-05;-0.001208673347719;2.6491656171856e-05;-0.0013601016253233;5.2559011237463e-05;-8.5236752056517e-05;-5.9823592891917e-05;-0.00012267116107978;0.0002183051983593;0.00075489497976378;0.00032219698186964;0.00027941999724135;0.0002186259807786;9.9012366263196e-05;-1.061128659785e-05;-0.00017763278447092;0.00018841949349735;-0.0010572979226708;0.00051003653788939;-0.00014789836131968;5.3462725190911e-05;0.00038431541179307;-8.9459181253915e-06;0.0006994329742156;0.00011186266783625;-0.00019058970792685;-0.0008606847259216;-0.00041891122236848;-0.0003160105261486;-0.0004620494437404;0.0001854729198385;-0.00032273167744279;-0.00020010172738694;-0.00029265898047015;0.0013106886763126;-0.00013540970394388;-0.00055211823200807;-1.1462865586509e-05;-5.0735878176056e-05;3.0784784030402e-05;0.00022702672868036;7.5885800470132e-05;0.00038098241202533;-9.487599163549e-05;-0.00060966197634116;0.00010249544720864;-0.00013690326886717;7.2049828304444e-05;-0.00011192438978469;-3.4715194487944e-05;0.00012974707351532;-6.7419190600049e-05;0.0011163636809215;-0.00010734918760136;-0.00016667429008521;0.0003521001781337;0.00019514843006618;-0.00010354565165471;-0.00025262773851864;0.00021326156274881;-0.00012916578270961;-0.00043039571028203;0.00011423334944993;-0.00031492847483605;-2.0338011381682e-05;0.00093888427363709;4.4506472477224e-05;-0.001350746373646;0.00018466672918294;-0.00022948623518459;-0.00024075453984551;-0.00017076278163586;-0.0004001795896329;0.001251001143828;-0.00015258732310031;0.00058071844978258;7.8662909800187e-05;-2.2443191483035e-05;-0.00013867685629521;0.0014599554706365;-0.0001578825613251;0.0015150397084653;-2.5474777430645e-05;9.4776711193845e-05;6.211367144715e-05;-0.00044169931788929;-0.00029920769156888;0.00027410723851062;6.3305807998404e-05;0.000656139687635;-0.00044091927702539;0.00033199455356225;-0.0015073865652084;0.00010543708049227;-0.0011581345461309;7.3014911322389e-05;-0.0013791365781799;5.9550686273724e-05;-2.5752795409062e-05;-4.669724512496e-05;-0.00010378513252363;0.00018435629317537;0.00084252032684162;0.00022642078693025;0.00034311311901547;0.00019398152653594;0.00016382712055929;9.8218170023756e-06;-0.00017705975915305;0.00015631917631254;-0.0011088972678408;0.00042197739821859;8.0081757914741e-05;2.5256600565626e-05;0.00040726424776949;-6.6176813561469e-05;0.0006473166286014;5.7778121117735e-05;-0.00010486562678125;-0.00087063160026446;-0.00035592270432971;-0.00029563994030468;-0.00037953446735628;6.3687679357827e-05;-0.00024920183932409;-0.00035214703530073;-0.0002455351059325;0.001267866929993;-0.0001047301266226;-0.00063076493097469;-1.1286125527477e-06;-8.6790008936077e-05;5.4376646403398e-06;0.00027688851696439;7.3196679295506e-05;0.00032091559842229;-7.2911367169581e-05;-0.00067997054429725;9.9732140370179e-05;-0.00010026439849753;6.5747575717978e-05;-0.00021196766465437;-3.6459830880631e-05;9.0690919023473e-05;-8.2668273535091e-05;0.0011591358343139;-6.3387655245606e-05;-0.00016052102728281;0.00030676019378006;0.0001861469791038;-0.00018779843230732;-0.00025693487259559;0.0003331225598231;-0.00010370614472777;-0.0003384153242223;0.00011017810174963;-0.00030082589364611;-3.2599669793854e-05;0.0010400551836938;6.2236613302957e-05;-0.0014138948172331;0.00018923728202935;-0.00021973723778501;-0.00025900127366185;-0.00020451980526559;-0.00045298231998459;0.0012368517927825;-0.00017404749814887;0.00058120209723711;8.0278754467145e-05;-1.6506339306943e-05;-0.00017140830459539;0.0014624554896727;-0.00021280415239744;0.0015430609928444;-3.5085908166366e-05;8.537028770661e-05;7.1674927312415e-05;-0.00046628911513835;-0.00030516914557666;0.00028671461041085;8.8574735855218e-05;0.00069186341715977;-0.0004328218055889;0.0003899137082044;-0.0015074776019901;0.00015033238742035;-0.0011610550573096;0.00010933828161797;-0.0013887211680412;7.0004214649089e-05;-2.9246331905597e-05;-2.1701789592043e-05;-7.1050140832085e-05;0.00011050019384129;0.00065856805304065;8.9219181973021e-05;0.00034337356919423;0.00012249931751285;0.00019897083984688;1.9064265870838e-05;-0.00012960798630957;8.8464556029066e-05;-0.00078761531040072;0.00025647864094935;0.00025987628032453;3.7207003060757e-06;0.00029814706067555;-7.8394245065283e-05;0.00043523899512365;-4.8677247832529e-06;-2.1396106603788e-05;-0.00064216105965897;-0.00019066128879786;-0.00024064180615824;-0.00021761791140307;-8.8938519184012e-05;-0.00013794106780551;-0.0003956186119467;-0.00015049822104629;0.00085076317191124;-6.0285099607427e-05;-0.00049588794354349;8.3610511865118e-06;-8.6864631157368e-05;-9.3750322776032e-06;0.00021878207917325;5.6282809964614e-05;0.00018406580784358;-3.9784499676898e-05;-0.00052949588280171;6.943337211851e-05;-5.423365655588e-05;4.2495546949795e-05;-0.00019693035574164;-2.6972740670317e-05;3.3081203582697e-05;-6.5608786826488e-05;0.00086132233263925;-2.0338553440524e-05;-0.00010980480146827;0.00020170748757664;0.00012556478031911;-0.00017320021288469;-0.00019503125804476;0.00030600506579503;-6.1926766647957e-05;-0.00018229435954709;7.5184594606981e-05;-0.00020366020908114;-2.900527761085e-05;0.00081126351142302;5.2835948736174e-05;-0.0010618586093187;0.00013872762792744;-0.00014738089521416;-0.0002012139884755;-0.00017839834617916;-0.00036113301757723;0.0008775350288488;-0.00013751786900684;0.00042105131433345;6.119270256022e-05;-6.7762111939373e-06;-0.00013957291957922;0.0010600019013509;-0.00018564669881016;0.001153543475084;-3.2576353987679e-05;6.4970059611369e-05;5.3289793868316e-05;-0.00037276864168234;-0.00023576284002047;0.00022653298219666;9.0731817181222e-05;0.00053048721747473;-0.00028945895610377;0.00031459887395613;-0.0010747837368399;0.00013415624562185;-0.00085743644740433;9.8328797321301e-05;-0.0010318930726498;5.8776968216989e-05;-3.1604857213097e-05;0.00011991002975265;-5.7222423492931e-06;-0.0007234305376187;-2.4498609491275e-05;-0.0005181422457099;-5.9579815570032e-05;-7.9964847827796e-05;-0.00012200244964333;0.00010508287232369;-1.6984744434012e-05;0.00085087202023715;-6.8274828663561e-05;-0.00036907746107318;-0.00020855967886746;-0.00047027796972543;-2.3091462253433e-07;-1.0067234143207e-05;-0.00040750487823971;-6.3393013078894e-06;0.00078723271144554;-9.7409165391582e-06;0.0001568306615809;0.00020268534717616;0.00022067679674365;0.00013667362509295;0.00052335747750476;0.00011421327508288;-0.0010047489777207;0.00013092711742502;0.00070282409433275;5.3861705964664e-05;-0.00020991498604417;5.2228104323149e-05;5.3062085498823e-05;-4.2396652133903e-05;0.00037049411912449;6.3220250012819e-05;-0.00037486667861231;-6.9356305175461e-05;-7.5102980190422e-05;6.73549293424e-05;0.00038255500840023;-4.3825548345922e-06;1.3007181223657e-05;-1.7083020793507e-05;0.00067327206488699;-3.2911091693677e-05;0.00011942166020162;-5.8291745517636e-05;0.00021413453214336;-0.00012334143684711;3.7778677324241e-06;7.4047064117622e-05;-0.00012668696581386;-0.00054583244491369;-7.0869407409191e-07;-0.00014936561638024;4.1146609873977e-05;0.00049096759175882;-1.5291361705749e-05;-0.00080077809980139;2.7621565095615e-05;-0.00019833096303046;0.00014552556967828;-0.00037834275281057;-0.00018951298261527;0.00076717097545043;-0.00029784324578941;0.00044518866343424;-0.00015299605729524;1.1695976354531e-05;5.5742671975167e-05;0.0013802758185193;-0.00013339289580472;0.0010762517340481;-0.00017415339243598;-8.2398844824638e-05;-1.8668977645575e-05;0.00014998560072854;-0.00036925706081092;-0.00025191035820171;0.00018483283929527;0.00011485834693303;-0.00027968719950877;0.0005580258439295;-0.001016118680127;0.00028305541491136;-0.00078021321678534;0.00010944336099783;-0.0012848862679675;9.9391385447234e-05;0.00017158304399345;5.4685693612555e-05;0.00019500292546581;-9.4847946456866e-06;-0.00091416691429913;-3.6792731407331e-05;-0.00060366123216227;-0.00014315074076876;-8.656127647555e-06;-0.00017672959074844;0.00013865645451006;-1.2576299923239e-05;0.0011027716100216;-0.00010435045260238;-0.00027443855651654;-0.00031338166445494;-0.0006476201233454;-1.2825532394345e-05;-6.7250977735966e-05;-0.00057850161101669;-6.2050414271653e-05;0.0010552839376032;4.106166670681e-05;0.0001757094723871;0.0003390786878299;0.00018218584591523;0.0002141540608136;0.00054742221254855;0.00018622272182256;-0.0014201805461198;0.00019599897495937;0.00092860317090526;8.3666636783164e-05;-0.00026397150941193;6.0704678617185e-05;1.454966422898e-05;-4.1841180063784e-05;0.0005795523757115;8.1850150309037e-05;-0.00046744375140406;-0.0001138710140367;-0.00010465667583048;8.4584178694058e-05;0.00067268905695528;-4.9045979721996e-06;5.4161195294e-05;-2.4128954464686e-05;0.00084131269250065;-3.0810293537797e-05;0.00014358249609359;-9.9821139883716e-05;0.00031323567964137;-9.3089416623116e-05;1.8688902514441e-07;8.9312161435373e-06;-0.00014061563706491;-0.00087515788618475;-7.874103175709e-06;-0.00019128186977468;5.5511096434202e-05;0.00051595026161522;-1.3161015885998e-05;-0.00098191958386451;2.7747018975788e-05;-0.00028922577621415;0.00019944753148593;-0.00048055421211757;-0.00024430299527012;0.0010338004212826;-0.00037153429002501;0.00060395686887205;-0.00019197561778128;1.4862991520204e-05;6.6206470364705e-05;0.0018827691674232;-0.00017255928833038;0.0013828688533977;-0.0002080404519802;-0.00014622652088292;-1.4407043636311e-05;0.00020570092601702;-0.00044663972221315;-0.00032121111871675;0.00022006966173649;0.00012841353600379;-0.00041015705210157;0.00071697914972901;-0.0013775567058474;0.00035963661503047;-0.0010031103156507;0.0001227151369676;-0.0017220211448148;0.00012065204646206;0.00027829679311253;6.3145991589408e-05;0.00018501524755266;2.1700376237277e-05;-0.00027489959029481;-8.6804866441526e-05;-0.0003088666126132;-0.00024992134422064;1.3055702765996e-05;-0.00016523916565347;7.6316107879393e-05;7.0650930865668e-05;0.00034377269912511;-0.00013128147111274;0.00029825526871718;-0.00042386981658638;-0.00020220283477101;-0.00010963570093736;-0.0002087479660986;-0.00050498929340392;-0.00014721449406352;0.0006323519628495;0.00022553623421118;0.00030238521867432;0.00028129617567174;-8.9476248831488e-05;0.00029667347553186;6.0058100643801e-06;0.00030563285690732;-0.00078216864494607;0.00023884001711849;0.00022750362404622;0.00016032635176089;-8.000484740478e-06;-8.7017342593754e-06;-4.8596466513118e-06;7.1956739702728e-05;0.00040572526631877;7.6420605182648e-05;-0.0001847777311923;-9.1807385615539e-05;-0.00015043467283249;4.2620758904377e-05;0.00041034788591787;1.4935642866476e-05;0.00016403131303377;5.4400647968578e-06;0.00053689599735662;3.2661166187609e-05;-0.00012270154547878;-8.7782718765084e-05;0.00031888103694655;0.0001560520613566;7.8288336226251e-05;-0.00018551066750661;-0.00015385402366519;-0.00066892727045342;-9.6824507636484e-05;-0.00019300520943943;2.6280018573743e-05;0.00028300468693487;2.8442667826312e-05;-0.00065152283059433;-4.3273765186314e-05;-0.00018288858700544;0.00010917349572992;-0.00011197423009435;-0.00010919493797701;0.00077847280772403;-0.00013070066052023;0.00038352052797563;-7.4040173785761e-05;-1.8369390090811e-05;5.949867045274e-05;0.0010655511869118;-1.560523196531e-05;0.0009554477292113;2.0486006178544e-05;5.0514256145107e-05;7.7524455264211e-06;3.5742759791901e-05;-0.00027740822406486;-0.00021419794938993;3.450063377386e-05;0.00013627279258799;-0.00025125464890152;0.0003947980585508;-0.00090433866716921;6.427793414332e-05;-0.0007802668842487;-2.8158698114567e-05;-0.0010360019514337;-2.1810537873534e-05;4.9777190724853e-05;1.0424251740915e-05;0.00019831563986372;2.5712475689943e-05;-0.00022602108947467;-9.2180853243917e-05;-0.00031795090762898;-0.00025976216420531;2.9665205147467e-05;-0.00016448448877782;7.0240981585812e-05;7.5546449807007e-05;0.0002665730426088;-0.00014034761989024;0.00034794182283804;-0.00045298066106625;-0.00019717712712009;-0.0001165578578366;-0.00023583724396303;-0.00050201907288283;-0.00015611949493177;0.00062311411602423;0.00024501205189154;0.00031550080166198;0.00027145378408022;-8.8132932432927e-05;0.00031451231916435;-2.5920142434188e-05;0.00032368881511502;-0.00076856330269948;0.00025958832702599;0.00020801534992643;0.0001691737852525;1.4629652469011e-05;-1.1246622307226e-05;-4.5329241402214e-05;8.2616032159422e-05;0.00040360123966821;8.1861740909517e-05;-0.00016712138312869;-9.6195319201797e-05;-0.00015347900625784;3.1854626286076e-05;0.00047371862456203;1.6360170775442e-05;0.00016749373753555;1.182353207696e-05;0.00050641474081203;5.0542159442557e-05;-0.00014760260819457;-0.00010620107059367;0.00033832318149507;0.000219655528781;8.6674925114494e-05;-0.00021994387498125;-0.00015375802468043;-0.00069668015930802;-0.00010939186176984;-0.0001811672700569;1.7364845916745e-05;0.00021729450963903;3.5051016311627e-05;-0.00060766318347305;-5.9500565839699e-05;-0.00018439990526531;0.00010595443018246;-9.6478157502133e-05;-9.8285541753285e-05;0.00076322729000822;-0.00010386498615844;0.00039004522841424;-6.0370410210453e-05;-1.7357919205097e-05;5.7629586081021e-05;0.0010589443845674;2.9202853966126e-06;0.00094145734328777;5.1955143135274e-05;3.7636142224073e-05;1.3662204764842e-05;2.5293897124357e-05;-0.00027020261040889;-0.0002198732981924;3.2251733500743e-05;0.00013239031250123;-0.00024809018941596;0.00038120316457935;-0.00088060804409906;3.2617128454149e-05;-0.00077369261998683;-5.4462379921461e-05;-0.001049704500474;-4.3127285607625e-05;6.86602506903e-05;4.6692748583155e-06;0.00013221756671555;1.684287963144e-05;-0.00011702266783686;-6.0809292335762e-05;-0.00021325754642021;-0.00016486953245476;1.1067554623878e-05;-0.0001062919254764;4.3196185288252e-05;5.3370888053905e-05;0.00013378530275077;-9.1721980425064e-05;0.00023917912039906;-0.00030881122802384;-0.00011377094051568;-8.1484962720424e-05;-0.00016444090579171;-0.00032372513669543;-0.00010006347292801;0.0003986245719716;0.00016424649220426;0.0002210642414866;0.00016191432951018;-6.4618405303918e-05;0.00020912125182804;-2.214485539298e-05;0.00021905635367148;-0.00047344577615149;0.00017630550428294;0.00010884981020354;0.00011763659131248;1.4606942386308e-05;-5.0435023695172e-06;-2.8900873076054e-05;5.9447906096466e-05;0.00025411738897674;5.8064215409104e-05;-0.00010053329606308;-6.1022998124827e-05;-0.00010562871466391;1.5463152521988e-05;0.00031797029078007;9.5199457064155e-06;0.00010575033229543;9.8941682153963e-06;0.00032186906901188;4.0974311559694e-05;-0.00011110887135146;-6.3463812693954e-05;0.00023403849627357;0.00015777819498908;6.0797752666986e-05;-0.00015998983872123;-0.00011364910460543;-0.000453758839285;-7.7059907198418e-05;-0.00011266360525042;7.3062869887508e-06;0.00013052720169071;2.7407968445914e-05;-0.00038601880078204;-4.6691500756424e-05;-0.00011606969928835;6.6045700805262e-05;-4.9701087846188e-05;-5.7722088968148e-05;0.00049170589772984;-5.4765208915342e-05;0.0002551369543653;-3.2872303563636e-05;-1.3112812666805e-05;3.9010417822283e-05;0.00066423777025193;1.2257032722118e-05;0.00061465665930882;5.1710361731239e-05;3.3559939765837e-05;1.1358685696905e-05;4.3842146624229e-06;-0.00018125752103515;-0.00014820198703092;2.1162280972931e-05;9.2499234597199e-05;-0.00015277547936421;0.00024365424178541;-0.00055275397608057;2.3653699372517e-06;-0.00051361101213843;-4.9125563236885e-05;-0.00067901209695265;-3.9401613321388e-05;3.7184065149631e-05;-5.4634074331261e-07;-5.2856001275359e-05;-0.00010363683395553;0.00017371530702803;0.00018573668785393;0.00024539188598283;0.00020754596334882;0.00013014442811254;2.4187640519813e-05;-3.4517594031058e-05;-7.7259443060029e-05;0.00013138413487468;-0.00025733531219885;0.00042588575161062;-0.00028705943259411;6.7661851062439e-05;0.00014397784252651;9.2655209300574e-05;0.00038284971378744;9.4696784799453e-05;-0.00021392255439423;-0.00039822785765864;-0.00018879170238506;-0.00028051086701453;-0.00035283406032249;0.000105999999505;-0.00028020588797517;2.2883497877046e-05;-0.00024630015832372;0.00060130952624604;-0.00011880188685609;-0.00014376663602889;-1.1669259038172e-05;6.1221697251312e-05;6.1275954067241e-05;-2.4056273105089e-05;5.4065250878921e-05;0.00022606858692598;-8.0315418017562e-05;-0.00017892115283757;3.3982403692789e-05;-0.00012565843644552;5.9281544963596e-05;0.00017629031208344;4.5664969547943e-06;9.9907221738249e-05;2.0107536329306e-05;0.00044796412112191;-0.00016568126739003;-0.0001231917849509;0.00027737181517296;0.00014299957547337;0.00017811420548242;-0.00013693618529942;-0.00010506709804758;-0.00013787079660688;-0.00034030980896205;4.4639222323895e-05;-0.00014672099496238;8.5050978668733e-06;0.00023397474433295;-3.3284122764599e-05;-0.00052065320778638;7.4651368777268e-05;-0.00011913253547391;-7.4402261816431e-05;-1.6988433344522e-05;-7.8317083534785e-05;0.00060549000045285;-1.4449247828452e-05;0.00030480130226351;3.8616726669716e-05;-1.2787939340342e-05;2.5417963115615e-05;0.00071061553899199;5.8147732488578e-05;0.0007504461100325;1.6514882190677e-06;4.8608988436172e-05;-1.4165169886837e-05;-0.00021315694903024;-0.00017888717411552;0.00013291905634105;1.4810197171755e-05;0.00026650869403966;-0.00018464779714122;2.0344656149973e-05;-0.00070123065961525;-6.2091603467707e-05;-0.00059947260888293;-6.8879329774063e-05;-0.00074154610047117;1.8015045498032e-05;9.1101337602595e-06;-7.5224474130664e-05;-0.00015579727187287;0.00025130703579634;0.00033578439615667;0.0003730395110324;0.00029591354541481;0.00019862929184455;3.2970456231851e-05;-4.7601701226085e-05;-0.00012389640323818;0.00019765069009736;-0.00046826296602376;0.00061533285770565;-0.00040814394014888;9.6899319032673e-05;0.00023867763229646;0.00012777427036781;0.00059446605155244;0.0001458031765651;-0.00031240252428688;-0.00062984199030325;-0.00031346018658951;-0.0003997634339612;-0.00051875336794183;0.00016826910723466;-0.00040771820931695;1.7818778360379e-05;-0.00035492682945915;0.00095494085690007;-0.00017163749726024;-0.00025784620083869;-2.0924671844114e-05;7.3257971962448e-05;8.5926978499629e-05;-1.2935862287122e-05;7.8946774010547e-05;0.0003522276529111;-0.00011919886310352;-0.00030267267720774;5.9777263231808e-05;-0.00018144537170883;8.4230458014645e-05;0.00023109611356631;-9.5024842039493e-07;0.00014983833534643;1.5268899005605e-05;0.00071574049070477;-0.00022267892200034;-0.00018085187184624;0.00040202753734775;0.00020159773703199;0.00022199224622454;-0.00020183861488476;-0.00011793301382568;-0.00019183130643796;-0.00050811964320019;7.4283139838371e-05;-0.0002313894656254;9.5546456577722e-06;0.00040911213727668;-3.4891465475084e-05;-0.00083721638657153;0.00012166289525339;-0.00018480156722944;-0.00012890454672743;-4.8448633606313e-05;-0.00015639068442397;0.00094106013420969;-4.1055915062316e-05;0.00046782972640358;5.9380228776718e-05;-1.9693625290529e-05;1.0230995030724e-05;0.0011113438522443;4.9245336413151e-05;0.001154848607257;-6.8171419798091e-07;7.1427646616939e-05;-6.7766986830975e-06;-0.00032743028714322;-0.00026585781597532;0.00020397598564159;2.5983525119955e-05;0.0004288180207368;-0.0003001612785738;7.4382478487678e-05;-0.0010974454926327;-6.1961713072378e-05;-0.00091569742653519;-7.3570845415816e-05;-0.0011348815169185;2.9977376470924e-05;1.3593024959846e-05;-7.1783848397899e-05;-0.00015908353088889;0.00025094437296502;0.00046150057460181;0.00039043941069394;0.00028897193260491;0.00021666439715773;4.2761032091221e-05;-4.2527804907877e-05;-0.00014606225886382;0.00020613262313418;-0.00065554224420339;0.00061537796864286;-0.00038126730942167;9.3741480668541e-05;0.00028919402393512;0.00010535774345044;0.00066030299058184;0.00015216019528452;-0.00030324846738949;-0.00072515476495028;-0.00037312932545319;-0.00039083897718228;-0.00053010345436633;0.0002016537473537;-0.00040873553371057;-2.2858490410727e-05;-0.00035210759961046;0.0011035237694159;-0.00017253571422771;-0.00034374700044282;-2.1468144041137e-05;3.8530921301572e-05;7.8005148679949e-05;4.8391921154689e-05;8.2212012785021e-05;0.00039001632831059;-0.00012103457993362;-0.0003898699360434;7.7356868132483e-05;-0.00018243874364998;8.1416772445664e-05;0.00016446226800326;-1.3906572348787e-05;0.00015362474368885;-8.735525625525e-06;0.00085033802315593;-0.00019562525267247;-0.00017661633319221;0.00040860040462576;0.00019793040701188;0.00014137315156404;-0.00022211224131752;-4.9887243221747e-05;-0.00017956960073207;-0.00052436633268371;9.1174755652901e-05;-0.00026574620278552;4.597136467055e-06;0.00056154606863856;-1.2586457160069e-05;-0.0010056137107313;0.00014542289136443;-0.0002057024394162;-0.00016661325935274;-8.7647480540909e-05;-0.00023143687576521;0.0010651124175638;-7.5392723374534e-05;0.00051626225467771;6.6984539444093e-05;-2.2583823010791e-05;-3.423311500228e-05;0.0012539612362161;-8.4030434663873e-06;0.0012928417418152;-6.3145021158562e-06;8.3292368799448e-05;1.3877622222935e-05;-0.00037050477112643;-0.00028242068947293;0.00023100712860469;3.6252877180232e-05;0.00050841632764786;-0.00035385688534006;0.00015112309483811;-0.0012514339759946;-1.6211119145737e-05;-0.0010161760728806;-3.1395276891999e-05;-0.0012441360158846;3.7273865018506e-05;2.6336483642808e-06;-6.3743340433575e-05;-0.00014338146138471;0.00022200476087164;0.00059613300254568;0.00036351344897412;0.00023996723757591;0.00021279798238538;6.2671188061358e-07;-2.4186523660319e-05;-0.00015040503058117;0.00019678634998854;-0.00086109875701368;0.00053882552310824;-0.00030533992685378;6.6407403210178e-05;0.00037545061786659;5.6747630878817e-05;0.00065057445317507;0.00014332274440676;-0.00024179597676266;-0.00077518069883808;-0.00041236597462557;-0.00028449299861677;-0.00048327626427636;0.00022191708558239;-0.00035172462230548;-7.588312291773e-05;-0.00031379269785248;0.0012330686440691;-0.00014200789155439;-0.00048946833703667;-1.6851299733389e-05;-9.0738103608601e-06;4.9681941163726e-05;8.5972023953218e-05;7.6002070272807e-05;0.0003986326046288;-0.00011133653606521;-0.00047221852582879;8.3686878497247e-05;-0.00014793561422266;7.1238340751734e-05;0.00011007110151695;-2.3869497454143e-05;0.00013190090248827;-3.2007421395974e-05;0.00091296201571822;-0.00012754916679114;-0.00017807082622312;0.00036642458871938;0.00017401210789103;4.5415719796438e-05;-0.00020646936900448;5.3790157835465e-05;-0.00014249676314648;-0.00050107814604416;9.5574017905165e-05;-0.00026607120526023;-6.2209255702328e-06;0.00064931396627799;1.3638059499499e-05;-0.0010770674562082;0.0001615209330339;-0.00021741878299508;-0.00019353468087502;-0.00014474218187388;-0.00029752528644167;0.0010960444342345;-0.0001094699910027;0.00053893629228696;6.3922416302375e-05;-1.7840658983914e-05;-8.8252352725249e-05;0.0013404814526439;-7.9947974882089e-05;0.001310973893851;-9.8933023764403e-06;3.9417849620804e-05;5.0521659431979e-05;-0.000368812790839;-0.00027315286570229;0.00021776865469292;5.7030065363506e-05;0.00055633008014411;-0.00040587774128653;0.00023622371372767;-0.0013209965545684;3.8861533539603e-05;-0.0010049591073766;2.2854761482449e-05;-0.0012814647052437;4.3041083699791e-05;3.9960010326467e-05;-5.2132192649879e-05;-0.00016210738976952;0.00020092440536246;0.0007663729484193;0.00034730258630589;0.00026191127835773;0.00021821001428179;-5.5579756008228e-05;-3.8236221371335e-06;-0.00016242726997007;0.00019231579790358;-0.0010739825665951;0.0005027613369748;-0.00022119666391518;3.921435927623e-05;0.00053243723232299;3.2056519557955e-05;0.00067348120501265;0.00013996360939927;-0.00019537885964382;-0.00089891679817811;-0.0004585858550854;-0.00019917816098314;-0.00045902124838904;0.00020622213196475;-0.00031673107878305;-0.00017160846618935;-0.00030236926977523;0.0014578356640413;-0.00011820669169538;-0.00071976328035817;-7.2918519435916e-06;-6.3926170696504e-05;2.611141280795e-05;7.5042866228614e-05;8.0909558164421e-05;0.00045065325684845;-0.00011746718519134;-0.00058026338228956;8.7454747699667e-05;-0.00012007226905553;6.53540409985e-05;0.00019390277157072;-3.2950651075225e-05;0.00010074429155793;-4.6024077164475e-05;0.0009968017693609;-6.1431528592948e-05;-0.0002018684608629;0.00036898118560202;0.00015029577480163;1.3419158904071e-06;-0.00019767800404225;0.00012124008935643;-0.00011783959052991;-0.00056692725047469;0.00010043509246316;-0.00025411797105335;-1.6537980627618e-05;0.00069020176306367;3.3576441637706e-05;-0.0011586506152526;0.00019334019452799;-0.00025122426450253;-0.00023221316223498;-0.00022842006001156;-0.00038044643588364;0.0011821854859591;-0.00014555770030711;0.00062611920293421;6.3162398873828e-05;-1.0110224138771e-05;-0.00014811294386163;0.0015632250579074;-0.00014980579726398;0.0014215697301552;-1.1597595403146e-05;-4.4621774577536e-05;9.0238645498175e-05;-0.00039631410618313;-0.00029859459027648;0.00021359306992963;0.00010204027785221;0.00065260985866189;-0.00049113988643512;0.00033673894358799;-0.0014660694869235;8.5670508269686e-05;-0.0010572264436632;7.3031806095969e-05;-0.0014756903983653;5.1822215027642e-05;0.00013179751113057;-3.6347380955704e-05;-0.00013800831220578;0.00015557193546556;0.00077457120642066;0.00025466180522926;0.00027075645630248;0.00018703826935962;-2.3455571863451e-05;1.1741745765903e-05;-0.00014972320059314;0.00015443911252078;-0.0010565604316071;0.00040016413549893;-5.1071641792078e-05;1.465399418521e-05;0.00053410592954606;-6.7492446760298e-06;0.00058109033852816;9.0089808509219e-05;-0.00011475602514111;-0.00084649381460622;-0.00038686237530783;-0.00014326586097013;-0.00036343911779113;0.00013143473188393;-0.00023975869407877;-0.00026976599474438;-0.00024524866603315;0.0013462631031871;-8.6290259787347e-05;-0.00074878602754325;7.2588777584315e-06;-0.00010031266720034;2.9079353680572e-06;9.2880880401935e-05;7.778425788274e-05;0.00038238911656663;-9.5101408078335e-05;-0.00058724154951051;7.8262615716085e-05;-8.6910986283328e-05;5.0158461817773e-05;0.0001535576157039;-3.2889944122871e-05;4.680794882006e-05;-5.1382306992309e-05;0.00094033818459138;-1.172725478682e-05;-0.00017390762513969;0.00031732834759168;0.00011885158892255;-5.802836312796e-05;-0.00018782533879858;0.00018238113261759;-8.5033141658641e-05;-0.00047446211101487;8.7880544015206e-05;-0.00020889627921861;-2.1834501239937e-05;0.00068651104811579;4.2814484913833e-05;-0.0010925595415756;0.00018433958757669;-0.00022662182163913;-0.00022924278164282;-0.00025270492187701;-0.00039008315070532;0.0010700599523261;-0.00015026280016173;0.00058969808742404;5.7963046856457e-05;-4.3107611418236e-06;-0.0001648492179811;0.0014611191581935;-0.00017920974642038;0.0013235039077699;-1.5024044841994e-05;-6.6528380557429e-05;9.544259228278e-05;-0.00038416020106524;-0.00028335303068161;0.00020039503579028;0.00012441130820662;0.00063378375489265;-0.00045331686851569;0.00035752941039391;-0.0013408246450126;0.00010979192302329;-0.00097046984592453;9.6892916189972e-05;-0.0013893321156502;5.3397321607918e-05;0.00014196634583641;-1.3348326319829e-05;-8.3667669969145e-05;8.2592574472073e-05;0.00056793913245201;9.6018360636663e-05;0.00027007996686734;0.00011147880286444;8.2472935901023e-05;1.8958266082336e-05;-0.00010499473864911;8.0176832852885e-05;-0.00071102491347119;0.0002248532109661;0.00017474660126027;-2.736640681178e-06;0.000354444317054;-3.6012042983202e-05;0.0003620391653385;6.6004276959575e-06;-2.276604391227e-05;-0.00058251072186977;-0.00019113840244245;-0.00012788624735549;-0.00018992452532984;-2.9971546609886e-05;-0.00012288452126086;-0.00033171882387251;-0.00013885475345887;0.00083676521899179;-4.5488548494177e-05;-0.0005342373624444;1.7913067495101e-05;-9.9053802841809e-05;-1.2477658856369e-05;9.3062481028028e-05;6.0305672377581e-05;0.00019854039419442;-4.9191330617759e-05;-0.00044306038762443;5.2426166803343e-05;-4.5666452933801e-05;2.6849489586311e-05;4.3118980102008e-05;-2.2701387933921e-05;-1.4122483662504e-05;-4.2064693843713e-05;0.00067358737578616;1.8693612219067e-05;-0.00010290204227204;0.00019924802472815;7.0123984187376e-05;-8.7664695456624e-05;-0.00014830227883067;0.0001966745039681;-4.4410429836717e-05;-0.00024121337628458;5.4943357099546e-05;-0.000123872057884;-1.9716297174455e-05;0.0005486024892889;3.7096193409525e-05;-0.00079476647078991;0.00012561041512527;-0.00013700863928534;-0.00017078286327887;-0.00020792853320017;-0.00029942416585982;0.00070323667023331;-0.00011360220378265;0.00040129499393515;4.3965650547761e-05;6.3550885442964e-07;-0.00012650158896577;0.000981833669357;-0.00015359773533419;0.00093963014660403;-1.797565164452e-05;-3.3590808016015e-05;6.5003623603843e-05;-0.00030434085056186;-0.00021108711371198;0.00016006184159778;0.0001155917198048;0.00046288364683278;-0.00027555818087421;0.00027465532184578;-0.00087856984464452;0.00010042321082437;-0.00068512075813487;8.5459658293985e-05;-0.0009686243138276;4.4335782149574e-05;7.9091405496001e-05;0.00027712606242858;-3.9779166399967e-05;-0.00072914577322081;5.3309204162133e-08;-0.00057085108710453;-0.0001655149681028;0.00010689030750655;-0.0001463607623009;0.00011879695375683;-1.2078588952136e-05;0.00074508273974061;-8.2611346442718e-05;-0.00010688498150557;-0.00028290087357163;-0.0006511127576232;-1.4734847354703e-05;-0.00017345881497022;-0.0005169995711185;-0.00010775482951431;0.00095883343601599;9.7064839792438e-05;0.00013517352635972;0.00032685967744328;0.00023028859868646;0.00017371425929014;0.00040036748396233;0.00017851425218396;-0.0012797941453755;0.00018400575208943;0.00087608135072514;7.1129907155409e-05;-0.00025250282487832;5.6289096391993e-05;-0.00018303957767785;-2.821361158567e-05;0.00064663775265217;7.2529415774625e-05;-0.00034257193328813;-0.00014053928316571;-7.5401912909001e-05;5.1918203098467e-05;0.0010936743346974;-1.5640664059902e-05;5.995700485073e-05;-2.743868935795e-05;0.00055035291006789;5.947450063104e-06;0.0001615869696252;-0.00012840324779972;0.00031482279882766;8.2183323684148e-05;-5.555166353588e-05;-0.00016990693984553;-4.6393357479246e-05;-0.0010649169562384;5.1198321671109e-06;-8.9198991190642e-05;3.8034006138332e-05;6.8623536208179e-05;1.908319973154e-06;-0.00059853022685274;8.6649115473847e-06;-0.00028934102738276;0.00018826733867172;-0.00046182857477106;-0.00020883558318019;0.00081119773676619;-0.00029632754740305;0.00055747042642906;-0.00014929594181012;2.3493657863582e-05;4.1140636312775e-05;0.0017638721037656;-0.00015542237088084;0.0010908062104136;-0.00016411632532254;-0.00025047021335922;2.287969664394e-06;0.00020480630337261;-0.00033910584170371;-0.00028026106883772;0.00020925780700054;6.3392784795724e-05;-0.00038347480585799;0.00060336745809764;-0.0011315213050693;0.0003096243890468;-0.00076857762178406;7.9041310527828e-05;-0.0016136072808877;9.9921096989419e-05;0.00039870908949524;4.5529151975643e-05;0.00028417821158655;-3.6069435736863e-05;-0.00056854332797229;-6.9286902544263e-06;-0.00048702477943152;-0.00019147618149873;0.00016033623251133;-0.00012678783969022;9.8474323749542e-05;-7.7668101994277e-07;0.00050252064829692;-8.1125486758538e-05;6.224794924492e-05;-0.0002733678848017;-0.00055498041911051;-2.5671488401713e-05;-0.00020382256479934;-0.00047421106137335;-0.00014655408449471;0.00082267238758504;0.00014011449820828;0.00013747552293353;0.00031917029991746;0.0002072177012451;0.000174581509782;0.00022403606271837;0.00018122483743355;-0.0011038819793612;0.00017759866022971;0.00071814254624769;7.1230577304959e-05;-0.00016228169261012;2.2794911274104e-05;-0.00023007355048321;2.722288854784e-06;0.0006073487456888;5.6986587878782e-05;-0.00024792505428195;-0.0001396694133291;-6.4552063122392e-05;3.8235029933276e-05;0.0010493574663997;-1.4158582644086e-06;0.00010718743578764;-2.0377225155244e-05;0.0004066217225045;1.7920892787515e-05;0.00010081529035233;-0.00015271561278496;0.00028235264471732;0.00017515655781608;-4.1349212551722e-05;-0.00021927867783234;-1.4163606465445e-06;-0.0010178564116359;-1.6285006495309e-05;-8.1151469203178e-05;3.2765685318736e-05;-7.6202733907849e-05;4.9056393436331e-06;-0.00043045057100244;-2.1699952412746e-06;-0.0002696723677218;0.00016339430294465;-0.00034739784314297;-0.00016697851242498;0.00071388069773093;-0.00022729173360858;0.00047768393415026;-0.00011481050023576;2.0517170923995e-05;2.9007946068305e-05;0.0015380008844659;-0.00012196651368868;0.00089771253988147;-0.00011447060387582;-0.0002368095156271;8.7455809989478e-06;0.00017074917559512;-0.00024426783784293;-0.000224522096687;0.00014009585720487;3.7705765862484e-05;-0.00035849385312758;0.00048435089411214;-0.0010054910089821;0.0002404177794233;-0.00062694225925952;4.6127654059092e-05;-0.0013813443947583;6.9318106397986e-05;0.00037026728386991;3.2483480026713e-05;0.0001746712368913;1.4196102711139e-05;-0.00016801861056592;-6.1411192291416e-05;-0.00027167960070074;-0.00019471211999189;5.7520155678503e-05;-0.00011064914724557;5.1729894039454e-05;4.6194429160096e-05;0.00012753305782098;-0.0001008660037769;0.00025595663464628;-0.00031974850571714;-0.00018578114395496;-7.5304473284632e-05;-0.0001950354926521;-0.00036389674642123;-0.00012743327533826;0.00046875991392881;0.00019094490562566;0.00022286108287517;0.0002022852859227;9.2948557721684e-06;0.00022123256349005;-1.9855877326336e-05;0.00022648289450444;-0.00058003095909953;0.00019050436094403;0.00020301619952079;0.00011123958393;2.129500353476e-05;-1.5805353541509e-05;-0.00010694875527406;6.1365077272058e-05;0.00031739220139571;5.4546144383494e-05;-0.0001144275884144;-8.2605780335143e-05;-9.6338451839983e-05;1.8884829842136e-05;0.0004723533638753;1.7377622498316e-05;0.00012907871860079;1.0377242688264e-05;0.00032021277002059;4.1131763282465e-05;-9.6938798378687e-05;-0.00011592968076002;0.00024049806233961;0.00022206825087778;5.4855787311681e-05;-0.00017844029935077;-7.2375485615339e-05;-0.00057424244005233;-8.0434496339876e-05;-0.00011165245086886;1.0946489965136e-05;4.9269598093815e-05;2.0639196009142e-05;-0.00037305153091438;-4.3101037590532e-05;-0.00014911542530172;8.2361832028255e-05;-8.2877610111609e-05;-7.1717440732755e-05;0.00052856095135212;-7.5093172199558e-05;0.00029593714862131;-4.0483533666702e-05;-6.1761502365698e-06;3.5445595131023e-05;0.00082787848077714;-3.2985017242027e-06;0.00065360276494175;3.2204767194344e-05;-2.5925482987077e-05;1.0598681910778e-05;3.1767249311088e-05;-0.00017246013158001;-0.00015958698350005;2.4352251784876e-05;7.6015247032046e-05;-0.000195098851691;0.00027219986077398;-0.00063687772490084;3.2736625144025e-05;-0.00052244524704292;-3.9317790651694e-05;-0.00081147678429261;-2.928483991127e-05;0.00011164462921442;5.9296380641172e-06;-5.382658491726e-05;-0.00010017117892858;0.00016476490418427;0.00016852843691595;0.00023654704273213;0.00019280011474621;0.00011939565592911;-5.9324365793145e-06;-2.9157930839574e-05;-6.8580906372517e-05;0.00012723026156891;-0.00022821970924269;0.00039581276359968;-0.00028122976073064;5.7917070080293e-05;0.00015490622899961;9.329345630249e-05;0.00035079702502117;9.4877301307861e-05;-0.00020667475473601;-0.00036827189614996;-0.00018175947479904;-0.00024407838645857;-0.00033161725150421;8.9299472165294e-05;-0.00025939376791939;3.2296135032084e-05;-0.00023502374824602;0.00057894439669326;-0.00010388898954261;-0.00015958349104039;-1.3687977116206e-05;6.761997792637e-05;5.4705305956304e-05;-5.822241291753e-05;4.6635868784506e-05;0.00021399215620477;-7.86029122537e-05;-0.000161913674674;2.8537027901621e-05;-0.0001087559867301;5.8370453189127e-05;0.00020663376199082;8.1309945016983e-06;9.6204064902849e-05;2.2700838599121e-05;0.00039409491000697;-0.00015287369024009;-0.00013843933993485;0.00025204734993167;0.00013631480396725;0.00019778485875577;-0.00010779216972878;-0.00010038352047559;-0.00012956331192981;-0.00033322820672765;3.8090500311228e-05;-0.00012933734979015;5.0104886213376e-06;0.00017062074039131;-3.3502008591313e-05;-0.00045119153219275;6.8952853325754e-05;-0.00011446078133304;-6.5611595346127e-05;-2.0288962332415e-05;-6.7210399720352e-05;0.00054979673586786;-1.0771062989079e-05;0.00028942804783583;3.286960782134e-05;-8.9668028522283e-06;2.6784802685142e-05;0.00067825306905434;5.6647066230653e-05;0.00067956431303173;2.0123145532125e-06;1.8411945347907e-05;-7.2415491558786e-06;-0.0001829066168284;-0.00016481196507812;0.00010904669761658;1.4286743862613e-05;0.00024269107962027;-0.00018160110630561;1.6435060388176e-05;-0.0006479712901637;-6.1014572565909e-05;-0.00053562776884064;-6.8308865593281e-05;-0.00070432154461741;1.7944785213331e-05;3.7989746488165e-05;-6.3845749536995e-05;-0.0001448710099794;0.00020423565001693;0.00024551202659495;0.00030835016514175;0.00026313096168451;0.00015171950508375;-2.3541737391497e-05;-3.3187432563864e-05;-9.2521731858142e-05;0.0001607005688129;-0.00030615550349467;0.00049299350939691;-0.0003478821599856;6.9968686148059e-05;0.00023203516320791;0.00012804474681616;0.00046399518032558;0.0001304125180468;-0.00026974850334227;-0.00050179561367258;-0.00024997425498441;-0.00030485540628433;-0.00041575453360565;9.1818954388145e-05;-0.00032438783091493;2.7246736863162e-05;-0.00029360599000938;0.00077983958180994;-0.00012723196414299;-0.00025064451619983;-2.332495751034e-05;8.112056821119e-05;7.0701324148104e-05;-9.44463245105e-05;5.8046796766575e-05;0.00029409807757474;-0.00010574597399682;-0.00022093924053479;3.9521881262772e-05;-0.00013189160381444;7.466837996617e-05;0.0003089731617365;6.3929605857993e-06;0.00012393682845868;2.2967007680563e-05;0.0005077114328742;-0.00017886950809043;-0.00018663750961423;0.0003188575792592;0.00016126516857184;0.00025744125014171;-0.00012394893565215;-0.00012417277321219;-0.00015948769578245;-0.00045800788211636;5.2585684898077e-05;-0.00016218224482145;2.9367679417192e-06;0.00020118984684814;-3.4593300370034e-05;-0.00057816680055112;9.6742129244376e-05;-0.00015597931633238;-9.2812995717395e-05;-4.2720519559225e-05;-0.00010963643580908;0.00071723770815879;-2.4003709768294e-05;0.00038879021303728;4.1603299905546e-05;-1.018337206915e-05;1.5016805264167e-05;0.0009196795290336;4.9931015382754e-05;0.0008841097005643;1.2841740044678e-06;8.4527675880963e-07;3.7213976611383e-07;-0.00023290295212064;-0.00021327821013983;0.00013663197751157;2.370595211687e-05;0.00033046820317395;-0.00025456320145167;4.9626931286184e-05;-0.00085550599033013;-6.1340426327661e-05;-0.00068858684971929;-6.9644156610593e-05;-0.00094519573030993;2.5106262910413e-05;7.5202486186754e-05;-1.5481517039007e-05;-0.00021994483540766;0.00013766197662335;0.00064943823963404;0.00030357911600731;0.00030726130353287;0.00017357064643875;-0.00015367133892141;6.1033979363856e-06;-0.00013233689242043;0.00014608615310863;-0.00080329581396654;0.00041044692625292;-0.00019255316874478;2.2463940695161e-05;0.00058926723431796;0.00010091305011883;0.00056061561917886;0.00014674112026114;-0.00018884499149863;-0.00082069716881961;-0.00039893490611576;-0.00012658722698689;-0.00035673141246662;7.3101720772684e-05;-0.00026047418941744;-0.00016995934129227;-0.00025702005950734;0.0013177091022953;-8.4447980043478e-05;-0.00076397875091061;-1.6730469951654e-06;-7.9048550105654e-05;2.3362639694824e-05;-0.00011746184463846;7.130519952625e-05;0.00048556309775449;-0.00013247554306872;-0.00045037406380288;5.8795576478587e-05;-8.1032863818109e-05;4.5661265176022e-05;0.00057582423323765;-3.1998282793211e-05;6.8026958615519e-05;-1.7144961020676e-05;0.00069690169766545;1.3710443909076e-06;-0.0002074993099086;0.00033792984322645;6.570963159902e-05;0.00013226778537501;-9.7984782769345e-05;-2.7561110982788e-05;-8.3354469097685e-05;-0.00069168861955404;7.5260053563397e-05;-0.00014326730160974;-9.1314086603234e-06;0.00027992570539936;2.0775722077815e-05;-0.00076698424527422;0.0001812470582081;-0.00024125342315529;-0.00019946126849391;-0.00026324240025133;-0.00032576723606326;0.00094028771854937;-0.00012217408220749;0.00059203716227785;4.2407933506183e-05;2.99253247249e-06;-0.00014693292905577;0.0014742490602657;-0.00013543009117711;0.0011523043503985;-8.440816827715e-07;-0.00017600507999305;0.00010303732415196;-0.00031151928124018;-0.00026806120877154;0.0001369232631987;0.00013367408246268;0.00057325360830873;-0.00046134949661791;0.0003115983272437;-0.0012118393788114;6.5597996581346e-05;-0.00082547980127856;7.2333394200541e-05;-0.0014103684807196;4.1396167944185e-05;0.00027638836763799;2.8634083264478e-06;-0.00021125617786311;9.7781914519146e-05;0.0006372703355737;0.00023568815959152;0.00031582120573148;0.00015464557509404;-0.00011423470277805;1.5544992493233e-05;-0.00012511711975094;0.00011458770313766;-0.00077554769814014;0.00034416661947034;-5.9726247854996e-05;9.0140802058158e-06;0.0005890570464544;8.871965110302e-05;0.0004945321707055;0.00010139055666514;-0.00013615861826111;-0.00078549224417657;-0.00033828234882094;-9.1797519417014e-05;-0.00028388257487677;2.7913934900425e-05;-0.00021370202011894;-0.00025664921849966;-0.00021808651217725;0.0012277006171644;-6.6178967244923e-05;-0.00078058592043817;2.1050534996903e-05;-0.00012861085997429;4.1967937249865e-06;-0.00011221267050132;7.515940524172e-05;0.00044833231368102;-0.00012002159201074;-0.00045322091318667;5.143814269104e-05;-6.3342478824779e-05;2.5174686015816e-05;0.00061090802773833;-3.4290529583814e-05;1.0998624929925e-05;-1.6593285181443e-05;0.00064726773416623;4.6674529585289e-05;-0.00017344913794659;0.00031788740307093;2.9993627322256e-05;9.2194561148062e-05;-9.9208446044941e-05;-9.8955197245232e-06;-5.3468080295715e-05;-0.00065439433092251;6.4534768171143e-05;-9.4493530923501e-05;-7.4232684710296e-06;0.00025408656802028;2.4115155611071e-05;-0.00070338824298233;0.00017549742187839;-0.00021883087174501;-0.00019997847266495;-0.00030157476430759;-0.00033156565041281;0.00083171884762123;-0.00012325510033406;0.00057194498367608;3.9871429180494e-05;6.5080903368653e-06;-0.00015803531277925;0.0013985298573971;-0.00015385361621156;0.0010773407993838;-2.4293158276123e-06;-0.000195250599063;0.00010602095426293;-0.00031796068651602;-0.00026754022110254;0.00013238248357084;0.00016747618792579;0.00056565803242847;-0.00041776764555834;0.00032512718462385;-0.0010784028563648;7.8932993346825e-05;-0.00076572247780859;8.8982982560992e-05;-0.0013697773683816;4.1400617192267e-05;0.00029455195181072;0.00031112233409658;-6.1914637626614e-05;-0.00049404666060582;2.7560317903408e-05;-0.00054081162670627;-0.00014522441779263;0.00012019402493024;-0.00010003757051891;9.0043562522624e-05;-6.5824519879243e-06;0.00030988114303909;-4.7958801587811e-05;-3.8124613638502e-05;-0.00022261866251938;-0.00052324280841276;-2.0337898604339e-05;-0.0002309568808414;-0.00041484335088171;-0.00011838934733532;0.0007653670036234;0.00013055202725809;0.00015221699140966;0.0002471091283951;0.00032281261519529;0.00011123019066872;0.00027929412317462;0.00015089121006895;-0.00093330268282443;0.00014649964577984;0.00067634112201631;5.7276956795249e-05;-0.00020058764494024;3.948995799874e-05;-0.00026506479480304;-8.4860757851857e-06;0.00059628370217979;5.5988261010498e-05;-0.00021855802333448;-0.0001364703202853;-4.8114179662662e-05;2.658517769305e-05;0.0011790579883382;-1.5397190509248e-05;7.0076850533951e-05;-2.4988121367642e-05;0.00030774340848438;2.473329550412e-05;0.00013654185750056;-0.00012745382264256;0.0002714732545428;0.00017704891797621;-7.5404146627989e-05;-0.00025144859682769;1.3077115909255e-05;-0.0010366718051955;5.3316061894293e-06;-2.5201292373822e-05;2.4915678295656e-05;-0.00019427498045843;8.9522500275052e-06;-0.00030674776644446;-2.4305907118105e-06;-0.00024687964469194;0.00015582107880618;-0.00037024266202934;-0.00015972448454704;0.00056559109361842;-0.00021749107690994;0.00045240364852361;-0.00010322355228709;2.3265089112101e-05;2.4972650862765e-05;0.0014344201190397;-0.00012297678040341;0.00078924285480753;-0.00011768390686484;-0.0002605585323181;7.1077706707001e-06;0.00016445711662527;-0.00023600216081832;-0.00022475050354842;0.00016574873006903;3.0903509468772e-05;-0.00030030877678655;0.00045521382708102;-0.00082170107634738;0.00023701421741862;-0.00054450781317428;4.7073153837118e-05;-0.0013314542593434;7.4024916102644e-05;0.00039834747440182;3.1898034649203e-05;0.00045171924284659;-7.9337485658471e-05;-0.00054230081150308;2.3485352357966e-05;-0.0007148515433073;-0.0002347037952859;0.0002085290470859;-0.00012238073395565;0.00010858554014703;4.2347669477749e-06;0.00016833869449329;-7.0748770667706e-05;0.00010501936776564;-0.00031607795972377;-0.00063163985032588;-4.2990883230232e-05;-0.00035893073072657;-0.00056004658108577;-0.00021073268726468;0.00095816818065941;0.00023726487415843;0.00025020676548593;0.00034015899291262;0.00046976382145658;0.00016783308819868;0.00022447764058597;0.00022257263481151;-0.0011334632290527;0.00020679894078057;0.00078591698547825;8.5131134255789e-05;-0.00016513548325747;8.9585437308415e-06;-0.00041646577301435;2.9985512810526e-05;0.00078507873695344;6.5120337239932e-05;-0.00022182406974025;-0.00019096425967291;-6.1428152548615e-05;2.7679965569405e-05;0.0015648249536753;3.0740438887733e-06;0.00015843038272578;-2.3912747565191e-05;0.00032050715526566;4.3487936636666e-05;0.00010992326861015;-0.00021801977709401;0.00035052464227192;0.00035684168688022;-7.7925120422151e-05;-0.00038422146462835;5.7500968978275e-05;-0.0013920536730438;-2.9273696782184e-05;-4.4208904000698e-05;3.2351177651435e-05;-0.00037957297172397;1.1216655366297e-05;-0.00030691668507643;-1.3583205145551e-05;-0.00033177286968566;0.00019594628247432;-0.0003887437924277;-0.00018415931845084;0.00073389726458117;-0.0002433453919366;0.00056642643176019;-0.0001127258874476;2.8481512345024e-05;2.6581628844724e-05;0.0018116153078154;-0.00013774193939753;0.00096155033679679;-0.00011579966667341;-0.00034094564034604;1.355955737381e-05;0.00019086456450168;-0.00024251214927062;-0.00026731329853646;0.00015152838022914;2.821144698828e-05;-0.0004043257504236;0.00053100107470527;-0.0010703760199249;0.00026384193915874;-0.00065984285902232;3.5444907553028e-05;-0.0016650160541758;7.1383590693586e-05;0.00051975162932649;3.4534747101134e-05;0.00044748716754839;-6.3383136875927e-05;-0.00040408881613985;2.646027269293e-06;-0.00068828742951155;-0.00025125555112027;0.00020592944929376;-0.00010840835602721;9.3905997346155e-05;1.6144238543347e-05;-5.3331961680669e-05;-7.8568264143541e-05;0.00019467029778752;-0.00032644293969497;-0.00052674557082355;-5.5878947023302e-05;-0.00038041264633648;-0.000536760664545;-0.00023035948106553;0.00085183809278533;0.00027966120978817;0.00029665537294932;0.00031400864827447;0.00048596796113998;0.00018415208614897;0.00011766989337048;0.00023421259538736;-0.00095647777197883;0.00021220804774202;0.00063168717315421;9.1557376435958e-05;-5.981037611491e-05;-2.9177541364334e-05;-0.0004391867259983;6.5537846239749e-05;0.00069576356327161;5.841808160767e-05;-0.00016317612607963;-0.00018267503764946;-6.1672944866586e-05;2.1321706299204e-05;0.0014256824506447;2.5619941879995e-05;0.0001920660288306;-9.7635720521794e-06;0.00025559155619703;4.9757429223973e-05;3.0230648917495e-05;-0.00025008554803208;0.00032457755878568;0.00044373093987815;-4.3728632590501e-05;-0.00037826650077477;7.1328380727209e-05;-0.0012781755067408;-6.6070511820726e-05;-5.2760144171771e-05;2.7720454454538e-05;-0.00041549940942787;7.9897326941136e-06;-0.00024141193716787;-2.3875705664977e-05;-0.00030645920196548;0.0001720881118672;-0.00027891586069018;-0.00014901271788403;0.00067269336432219;-0.0001920233189594;0.00051044410793111;-8.4513187175617e-05;2.3033342586132e-05;2.4113396648318e-05;0.0016096555627882;-0.00010143397230422;0.00086085544899106;-7.0583701017313e-05;-0.00030169627279975;1.3063933693047e-05;0.00014796468894929;-0.00018528492364567;-0.00023851632431615;8.9532077254262e-05;2.758977097983e-05;-0.00036971029476263;0.00044664504821412;-0.00097055110381916;0.00019840226741508;-0.00059755152324215;9.2203799795243e-06;-0.0014945724979043;3.9438109524781e-05;0.00046790196211077;2.8183385438751e-05;0.00036243250360712;-3.4786349715432e-05;-0.00027967646019533;-2.056793164229e-05;-0.00055731990141794;-0.00022991931473371;0.00016264713485725;-9.558696183376e-05;7.4766947363969e-05;2.3540576876258e-05;-0.00010161547106691;-8.2678649050649e-05;0.00022148409334477;-0.00030760909430683;-0.00039158121217042;-5.8566212828737e-05;-0.0003276648640167;-0.00045877968659624;-0.00020168657647446;0.00068228389136493;0.00026141069247387;0.00028025679057464;0.00026044907281175;0.00037497447920032;0.0001873699366115;4.8700450861361e-05;0.00022019806783646;-0.00075608649058267;0.0001975804916583;0.00045624532504007;8.9784742158372e-05;5.3293952078093e-06;-4.087216075277e-05;-0.00036269289557822;7.4174466135446e-05;0.00053494254825637;5.0749164074659e-05;-0.00012337978114374;-0.0001483169326093;-6.2916442402638e-05;1.7249078155146e-05;0.0010960962390527;3.2931999157881e-05;0.00017816173203755;1.8374481669525e-06;0.00022661309048999;4.6745877625654e-05;-2.8552871299325e-05;-0.00022751241340302;0.00027498655254021;0.00041405778029002;-6.229334303498e-06;-0.00030552659882233;4.6869052312104e-05;-0.0010096044279635;-8.0314457591157e-05;-6.1615821323358e-05;2.0499423044384e-05;-0.00031532783759758;6.414048584702e-06;-0.00022522817016579;-2.9567710953415e-05;-0.00024679611669853;0.00013441299961414;-0.00018033351807389;-0.00011053813796025;0.00057380256475881;-0.00013800406304654;0.00041695334948599;-5.9078385675093e-05;1.4380904758582e-05;2.3710847017355e-05;0.0012789390748367;-6.1808867030777e-05;0.0007269459310919;-2.9657956474693e-05;-0.00021840789122507;1.0555231710896e-05;9.9841214250773e-05;-0.00014693889534101;-0.00019863534544129;4.6498716983479e-05;3.3781980164349e-05;-0.00029847476980649;0.0003518391167745;-0.00080122344661504;0.00012899853754789;-0.0005198079161346;-1.0141511666006e-05;-0.0012070034863427;1.0983650099661e-05;0.00035430828575045;2.0897989088553e-05;0.0001996849605348;-5.0899884627142e-06;-0.0001625979639357;-3.3320065995213e-05;-0.00030953137320466;-0.00016123038949445;8.5543550085276e-05;-7.6704760431312e-05;4.6789267798886e-05;2.593675890239e-05;3.1774161470821e-06;-7.0975780545268e-05;0.00018455405370332;-0.00023696922289673;-0.00021539366571233;-4.9783120630309e-05;-0.00019635267381091;-0.00030672686989419;-0.00012481902376749;0.00042660950566642;0.00017191820370499;0.00018856256792787;0.00017319321341347;0.00014521411503665;0.00015623717627022;5.3663115977542e-06;0.00016811169916764;-0.00049900752492249;0.0001476003380958;0.00024516074336134;7.4842537287623e-05;1.6844467609189e-05;-2.3025531845633e-05;-0.00018260223441757;5.1722316129599e-05;0.00031453120755032;3.8637932448182e-05;-8.6877364083193e-05;-8.6834363173693e-05;-5.8887064369628e-05;1.2954906196683e-05;0.00058480753796175;2.0257344658603e-05;0.00011698057642207;5.9558146858762e-06;0.00020104902796447;3.3940974390134e-05;-5.1048773457296e-05;-0.00013509139535017;0.00019143063400406;0.00024823940475471;2.1246991309454e-05;-0.00017992313951254;-6.2355302361539e-06;-0.00058880151482299;-6.2136248743627e-05;-6.4848034526221e-05;1.0999486221408e-05;-0.00010517448390601;9.5482055257889e-06;-0.00021934237156529;-2.8318792828941e-05;-0.00014817458577454;8.0210549640469e-05;-9.5464245532639e-05;-6.6587665060069e-05;0.00041139402310364;-7.6547694334295e-05;0.00026602862635627;-3.5646775359055e-05;3.3861313113448e-06;2.163040699088e-05;0.00078692805254832;-2.2007719962858e-05;0.00051329197594896;3.7088659610163e-06;-9.3204078439157e-05;8.0445661296835e-06;4.9061975005316e-05;-0.00011596010881476;-0.00013321930600796;2.413803122181e-05;3.90734312532e-05;-0.00018529592489358;0.00023015731130727;-0.0005381039227359;5.7168523198925e-05;-0.00038674342795275;-2.0613306332962e-05;-0.00075342290801927;-9.3358285084832e-06;0.00017605735047255;1.0047630894405e-05;-4.188638922642e-05;-0.00014842661039438;0.00014622608432546;0.00022092796280049;0.00024941793526523;0.00024480340653099;0.00010883463255595;-8.1826059613377e-05;-1.6539062926313e-05;-7.1411435783375e-05;0.00012118544691475;-0.0002126652689185;0.00035546245635487;-0.00026379065820947;4.221502240398e-05;0.00025677282246761;0.00012482724559959;0.00036443199496716;0.00012420969142113;-0.00022198812803254;-0.00042568147182465;-0.00021705582912546;-0.00020759245671798;-0.00030406090081669;2.4923665478127e-06;-0.00023419962963089;1.192691433971e-05;-0.00022007971710991;0.00066684948978946;-8.1521648098715e-05;-0.00029185821767896;-3.0494757083943e-05;6.7935361585114e-05;5.4815591283841e-05;-0.00016216973017436;3.9087266486604e-05;0.00026870804140344;-9.5707975560799e-05;-0.00016967392002698;2.7975796911051e-05;-8.0838886788115e-05;6.1294311308302e-05;0.00038570971810259;3.1527144983556e-06;0.00010104758985108;1.7692967958283e-05;0.00034363425220363;-0.00010867980745388;-0.0001845266087912;0.00023512117331848;0.00010135459888261;0.00025707154418342;-4.5994747779332e-05;-0.00011417882342357;-0.00011523255670909;-0.00043263638508506;3.9992457459448e-05;-0.00010495864262339;-4.1176599552273e-06;3.9577418647241e-05;-2.0262034013285e-05;-0.00037469825474545;8.6211475718301e-05;-0.00013966756523587;-7.8231627412606e-05;-6.5257707319688e-05;-0.0001057665940607;0.00055083684856072;-2.7873717044713e-05;0.00033377978252247;2.6229576178594e-05;-1.4290210401668e-06;-1.1327359061397e-05;0.00081009836867452;1.3216962543083e-05;0.00067111634416506;1.8668553138923e-06;-7.2495175118092e-05;2.228666744486e-05;-0.00015593395801261;-0.00016488914843649;7.8970253525767e-05;2.9631657525897e-05;0.00027340566157363;-0.0002412518078927;7.3055693064816e-05;-0.00069086154690012;-3.197123442078e-05;-0.00049909489462152;-3.5101948014926e-05;-0.00081187119940296;2.2133517632028e-05;0.00014018482761458;-2.3665686967433e-05;-0.00025054480647668;0.00014906091382727;0.00031582859810442;0.00030234010773711;0.00038824393413961;0.00012033229722874;-0.00015046782209538;-9.2363234216464e-06;-9.2678972578142e-05;0.00012674879690167;-0.0001985808921745;0.00039771304000169;-0.0002805225958582;4.088109562872e-05;0.00041032751323655;0.00019649406021927;0.00046207263949327;0.00017423102690373;-0.00028449457022361;-0.00059077062178403;-0.00028042346821167;-0.00024649166152813;-0.00032968202140182;-0.0001138852967415;-0.00026414846070111;-3.1653067708248e-05;-0.00025022815680131;0.00087588338647038;-8.4141822298989e-05;-0.00047854115837254;-4.7728382924106e-05;6.5748950873967e-05;7.2231639933307e-05;-0.00029337825253606;4.7202582209138e-05;0.00040207122219726;-0.00013689180195797;-0.00021464731253218;3.1884799682302e-05;-7.6686585089192e-05;7.4610667070374e-05;0.00070006743771955;-4.5039150791126e-06;0.00012019753194181;1.9446650185273e-05;0.00036633122363128;-8.6774132796563e-05;-0.00024930643849075;0.00029115623328835;7.6990167144686e-05;0.00036600002204068;-9.9377439255477e-06;-0.00018334403284825;-0.00012780711404048;-0.00066499004606158;5.2162253268762e-05;-9.3800656031817e-05;-1.0059893611469e-05;-9.5877774583641e-05;-1.3272579053591e-05;-0.00037709469324909;0.00012731163587887;-0.0001989441952901;-0.00011157299013576;-0.00012422083818819;-0.0001726384361973;0.0006734628113918;-4.9843391025206e-05;0.00046283591655083;2.7691361538018e-05;4.7916068979248e-06;-5.5752887419658e-05;0.0011302602943033;-2.5799741706578e-05;0.00083220552187413;2.571752474978e-06;-0.00017662181926426;4.8838322982192e-05;-0.00017991494678427;-0.00021375634241849;7.9890822235029e-05;5.863668047823e-05;0.00037514822906815;-0.00034552163560875;0.00014887319412082;-0.00087975326459855;-1.2818912182411e-05;-0.00059391796821728;-8.6977397586452e-06;-0.0011282247724012;3.0392189728445e-05;0.00027508963830769;2.9543775781349e-06;-0.00031294830841944;0.00012758873344865;0.00042349711293355;0.00031683087581769;0.00045811210293323;0.00013025145744905;-0.00019557046471164;-9.9433077593858e-07;-0.00010783196194097;0.00011965411249548;-0.00027777347713709;0.00040212963358499;-0.00025237281806767;3.4851054806495e-05;0.00053613126510754;0.00022645076387562;0.00051421020179987;0.00019216597138438;-0.00028941009077244;-0.00071768910856918;-0.00032576601370238;-0.00023059510567691;-0.00032104944693856;-0.00016343710012734;-0.00026828484260477;-9.3192771601025e-05;-0.00025531009305269;0.0010524082463235;-8.077833626885e-05;-0.00064423168078065;-3.9704373193672e-05;1.3539485735237e-05;6.6895539930556e-05;-0.00034740587580018;5.6519256759202e-05;0.00050994317280129;-0.00016073750157375;-0.0002695906732697;3.5010718420381e-05;-6.91130044288e-05;6.602807843592e-05;0.00091651058755815;-1.7959951946978e-05;0.00011077427916462;1.7486545402789e-05;0.00040153993177228;-3.5396515158936e-05;-0.00026401574723423;0.00032873914460652;3.9022041164571e-05;0.00037879723822698;3.9650635699218e-06;-0.00021852619829588;-0.00011185120092705;-0.00082843517884612;5.9776306443382e-05;-7.8851793659851e-05;-8.1011030488298e-06;-0.00015059977886267;-3.9111450860219e-06;-0.00040034734411165;0.00016063639486674;-0.00023697948199697;-0.00014748502871953;-0.00020417271298356;-0.00023725093342364;0.00075500819366425;-7.6279007771518e-05;0.00055361469276249;2.872287768696e-05;9.6016001407406e-06;-0.0001029932172969;0.0013659171527252;-7.254010415636e-05;0.00094485463341698;4.5565648179036e-06;-0.0002513283980079;7.9160134191625e-05;-0.00021618367463816;-0.0002474543871358;8.3573519077618e-05;0.00010437337914482;0.00046524356002919;-0.00041829611291178;0.000226541334996;-0.0010079696075991;1.4175579053699e-05;-0.00065836153225973;2.7424821382738e-05;-0.001350132166408;3.4705299185589e-05;0.00036931675276719;2.6707382858149e-05;-0.00033614848507568;0.00010041041241493;0.00054241926409304;0.00030386846628971;0.00046993821160868;0.00014511689369101;-0.00019857380539179;8.0769050327945e-06;-0.0001234204537468;0.00010944865061902;-0.00044915018952452;0.00039530478534289;-0.00018211887800135;2.6202258595731e-05;0.00063518999377266;0.00021986357751302;0.00054434064077213;0.00017632827803027;-0.00025496419402771;-0.00082357652718201;-0.00035438523627818;-0.00018645501404535;-0.00030214278376661;-0.00014259028830566;-0.00026196867111139;-0.0001832577836467;-0.00025092193391174;0.0012136909645051;-7.7434116974473e-05;-0.00078979838872328;-9.8084565252066e-06;-7.422538328683e-05;4.4760508899344e-05;-0.0003202041843906;6.9509143941104e-05;0.00058199366321787;-0.00016869670071173;-0.0003545037470758;4.005710434285e-05;-6.4781590481289e-05;4.3714208004531e-05;0.0010248305043206;-3.2883464882616e-05;7.2845017712098e-05;1.0406420187792e-05;0.00048466198495589;2.3881162633188e-05;-0.00024127190408763;0.00036268137046136;6.543653398694e-06;0.00030981030431576;-1.852431705629e-05;-0.00020630989456549;-8.1862825027201e-05;-0.00092274200869724;6.5690852352418e-05;-6.5099651692435e-05;-3.1877673336567e-06;-9.7543917945586e-05;7.3582873483247e-06;-0.00048709835391492;0.00018893924425356;-0.00025802018353716;-0.00018712169548962;-0.00028940869378857;-0.00030577083816752;0.00081891444278881;-0.00010476974421181;0.00062481698114425;3.3101143344538e-05;1.1656517926895e-05;-0.00014921778347343;0.0015353078488261;-0.00012302547111176;0.0010568270226941;4.4398971112969e-06;-0.0002897210069932;0.00010417433077237;-0.00027519068680704;-0.00028187624411657;0.00010328831558581;0.00015920386067592;0.00055615702876821;-0.00046012323582545;0.0003043410833925;-0.00109591439832;4.6567922254326e-05;-0.0007338902214542;6.6819084167946e-05;-0.0015193598810583;3.8901383959455e-05;0.00041995412902907;3.1479772587772e-05;-0.00023994823277462;5.0939808716066e-05;0.00043887726496905;0.00018786090367939;0.00034072823473252;0.0001073553939932;-0.0001166581932921;1.2814065485145e-05;-9.452662197873e-05;6.6826039983425e-05;-0.00040730298496783;0.00026478533982299;-4.4771717512049e-05;1.0829893653863e-05;0.00049488351214677;0.00014548307808582;0.00038287771167234;9.6701172878966e-05;-0.00014763098442927;-0.00062592764152214;-0.00024286427651532;-0.00010498429037398;-0.0001899156923173;-9.6087125712074e-05;-0.00017271083197556;-0.00021093255782034;-0.00016877301095519;0.00091411144239828;-4.974597322871e-05;-0.000633773393929;1.7908540030476e-05;-0.00011202678433619;1.3424124517769e-05;-0.00020627192861866;5.9036505263066e-05;0.000426151760621;-0.00011833752068924;-0.00030169991077855;2.939240039268e-05;-4.1726689232746e-05;1.3357132047531e-05;0.00077614694600925;-2.998010495503e-05;9.137789675151e-06;4.3785430534626e-06;0.00038410455454141;5.6255521485582e-05;-0.00014996605750639;0.00027212733402848;-1.6907875760808e-05;0.0001720056461636;-3.2882406230783e-05;-0.0001261326688109;-3.5954697523266e-05;-0.0006759109091945;4.5606419007527e-05;-2.4924012905103e-05;5.3938913424645e-07;-3.0817631341051e-05;1.059121950675e-05;-0.00038662462611683;0.00014518869284075;-0.00018359211389907;-0.00015329032612499;-0.0002622866013553;-0.00025233373162337;0.00058186327805743;-8.7941531091928e-05;0.00047483714297414;2.63065303443e-05;9.9018388937111e-06;-0.00012859053094871;0.001148306299001;-0.0001154662531917;0.0007954926113598;1.8726077541942e-06;-0.00022379630536307;8.5809406300541e-05;-0.00023504777345806;-0.00022215170611162;8.6157757323235e-05;0.00015377250383608;0.00044132801122032;-0.0003282023826614;0.00025576449115761;-0.00077801081351936;5.1272883865749e-05;-0.00055272009922192;6.8947330873925e-05;-0.0011563879670575;3.0567138310289e-05;0.00032242966699414;0.00039489404298365;-7.8231547377072e-05;-0.0003065082419198;3.2843730878085e-05;-0.00060293002752587;-0.00017236224084627;0.00014891936734784;-7.0864225563128e-05;7.2983079007827e-05;7.8703233157285e-06;-0.00015687091217842;-3.4923119528685e-05;9.0842571808025e-05;-0.0002237344160676;-0.00042122768354602;-4.0538441680837e-05;-0.00032715508132242;-0.00040660938248038;-0.00017356283206027;0.00067592784762383;0.00021664310770575;0.00024742411915213;0.00021822089911439;0.00048329017590731;9.8009484645445e-05;0.00013466626114678;0.00016599318769295;-0.00068794644903392;0.00014564646699;0.00050575152272359;6.3538442191202e-05;-8.782725490164e-05;-1.206052274938e-05;-0.00036584993358701;4.4171658373671e-05;0.00058974581770599;4.59117727587e-05;-0.00012187913671369;-0.00014902969996911;-3.729269883479e-05;1.1878154509759e-05;0.001264575868845;1.1316207746859e-05;0.00013815247802995;-1.4808302694291e-05;0.00015208430704661;4.052181247971e-05;5.8897272538161e-05;-0.00017742195632309;0.00025898474268615;0.00033775763586164;-6.4303392719012e-05;-0.00033462434657849;6.8009227106813e-05;-0.0010886344825849;-3.5890407161787e-05;-1.0165590538236e-05;2.1677142285625e-05;-0.0004120355588384;8.261600669357e-06;-0.0001255390670849;-1.4583312804461e-05;-0.00024426751770079;0.00014150369679555;-0.00024284006212838;-0.00012285515549593;0.00046642383676954;-0.00016214945935644;0.00040538696339354;-6.6175372921862e-05;2.1342710169847e-05;1.6468156900373e-05;0.001273155445233;-9.3797847512178e-05;0.00064107473008335;-7.1246424340643e-05;-0.00026848414563574;9.1079500634805e-06;0.00012096710997866;-0.00014400065992959;-0.0001940789661603;8.6439802544191e-05;1.8997141523869e-05;-0.00027406445587985;0.0003529678506311;-0.00069864990655333;0.00017503742128611;-0.00043658769573085;1.6384090486099e-05;-0.001200855593197;4.4232663640287e-05;0.00040693904156797;2.3624632376595e-05;0.00044752712710761;-7.1030372055247e-05;-0.00030702046933584;1.3760701222054e-05;-0.00068123894743621;-0.00022262199490797;0.00018183965585195;-8.2454236689955e-05;8.0592872109264e-05;1.5786197764101e-05;-0.00024345111160073;-5.7412991736783e-05;0.00017286125512328;-0.00028266670415178;-0.0004503506643232;-5.4004933190299e-05;-0.00038411657442339;-0.00047883088700473;-0.00021927714988124;0.0007507786503993;0.00027826157747768;0.00031046714866534;0.00025920214829966;0.00054558709962294;0.00014485958672594;9.394819062436e-05;0.00020778628822882;-0.0007610343163833;0.00018387829186395;0.0005278282915242;8.0546298704576e-05;-2.8888849556097e-05;-4.1182709537679e-05;-0.00044006312964484;7.4701063567773e-05;0.00063132186187431;5.1054390496574e-05;-0.00012063980102539;-0.00017018509970512;-4.8075653467095e-05;1.3844583918399e-05;0.0013627805747092;3.1089399271877e-05;0.00018591769912746;-6.6774400693248e-06;0.00017122253484558;4.8884794523474e-05;1.4202425518306e-05;-0.00023881993547548;0.00029003265080974;0.00045231773401611;-4.5665587094845e-05;-0.00037129063275643;8.4044804680161e-05;-0.0011923235142604;-7.0038033300079e-05;-2.9899276341894e-05;2.405154191365e-05;-0.00046776284580119;5.1893462114094e-06;-0.00014642732276116;-2.2715685190633e-05;-0.00027769998996519;0.00015412496577483;-0.00022099827765487;-0.00012633729784284;0.00055450655054301;-0.00016475128359161;0.00045371850137599;-6.5504289523233e-05;2.1681162252207e-05;1.9296634491184e-05;0.0014135624514893;-8.8919841800816e-05;0.00073052989318967;-5.8029097999679e-05;-0.0002883150591515;1.0352346180298e-05;0.00012094919657102;-0.00014111181371845;-0.00021345705317799;6.2128092395142e-05;2.290513839398e-05;-0.00031861118623056;0.00037765307934023;-0.00081500055966899;0.00016992702148855;-0.00050306925550103;4.6436875891231e-06;-0.0013345556799322;3.2394396839663e-05;0.00044275607797317;2.5231427571271e-05;0.00036786336568184;-4.4937507482246e-05;-0.00022736859682482;-6.1511354942922e-06;-0.00056265282910317;-0.00020183413289487;0.00015057661221363;-7.2866423579399e-05;6.660632789135e-05;1.8288843421033e-05;-0.00023341501946561;-6.1445920437109e-05;0.00018380627443548;-0.0002607766946312;-0.00035514449700713;-5.1217288273619e-05;-0.00032760534668341;-0.00041231603245251;-0.00019170298764948;0.00061754428315908;0.00025247456505895;0.00027973417309113;0.0002204347983934;0.0004394210409373;0.00014666185597889;4.867288589594e-05;0.00018954359984491;-0.00062410545069724;0.00016889238031581;0.00040795706445351;7.5061740062665e-05;1.6929670891841e-05;-4.7913224989315e-05;-0.00037215976044536;7.6423821155913e-05;0.00049785105511546;4.374016134534e-05;-9.5970965048764e-05;-0.00014080270193517;-4.6934066631366e-05;1.2052587408107e-05;0.001083038165234;3.5927692806581e-05;0.00016860425239429;1.8712771634455e-06;0.0001551643217681;4.3218962673564e-05;-2.4494533136021e-05;-0.00021861141431145;0.00024488416966051;0.00041413752478547;-1.6991583834169e-05;-0.00030010330374353;6.4618048781995e-05;-0.00096337695140392;-7.7212207543198e-05;-3.6822595575359e-05;1.8990620446857e-05;-0.0003728722804226;2.0537490854622e-06;-0.00014099029067438;-2.4250226488221e-05;-0.00023024270194583;0.0001244870654773;-0.00014917069347575;-9.7500749689061e-05;0.00047875280142762;-0.00012590058031492;0.00037871717358939;-4.8034547944553e-05;1.5543208064628e-05;1.8382028429187e-05;0.0011548496549949;-6.1166603700258e-05;0.00062397832516581;-3.1606094125891e-05;-0.00022447446826845;7.8843613664503e-06;8.7608976173215e-05;-0.00011077844101237;-0.00017985193699133;3.0631508707302e-05;2.4914326786529e-05;-0.00026530324248597;0.00030516105471179;-0.00068726384779438;0.0001213455980178;-0.00043842566083185;-6.3768015934329e-06;-0.0011031897738576;1.3716297871724e-05;0.00035285009653307;2.0463687178562e-05;-9.6623280114727e-06;-0.00024396604567301;0.0001163363122032;0.00025268874014728;0.00025166626437567;0.00037776739918627;9.0694949903991e-05;-0.0001392178091919;-4.6914701670175e-06;-7.7675205830019e-05;9.4622191681992e-05;-7.5479169026949e-05;0.00032012644805945;-0.00022310922213364;3.2362670026487e-05;0.0003637031186372;0.00019254858489148;0.00039022712735459;0.000157440037583;-0.00025575023028068;-0.00050643371650949;-0.00022805642220192;-0.00022498217003886;-0.00025794139946811;-0.00016825905186124;-0.00021424687292892;-3.6293899029261e-05;-0.00020201565348543;0.00071400485467166;-6.5686814195942e-05;-0.00042072113137692;-5.063428034191e-05;6.5227432060055e-05;6.9990397605579e-05;-0.0002953874936793;3.776823359658e-05;0.00035839472548105;-0.00012294932093937;-0.00016628549201414;2.392141141172e-05;-5.5764143326087e-05;6.781591946492e-05;0.00068558618659154;-3.9306628423219e-06;0.00010563286195975;1.7514521459816e-05;0.00026313489070162;-6.7414024670143e-05;-0.00022209134476725;0.0002441337419441;4.9864396714838e-05;0.00034787305048667;1.40147503771e-05;-0.00018249708227813;-0.00011000995436916;-0.00061187101528049;4.4233784137759e-05;-6.1509264924098e-05;-1.2208578482387e-05;-0.00016542118100915;-8.7661674115225e-06;-0.00025836631539278;0.0001121255045291;-0.00017674604896456;-9.2270303866826e-05;-0.00010051788558485;-0.00015166502271313;0.00054687639931217;-4.1237715777243e-05;0.00040293685742654;2.1014227968408e-05;6.5157205426658e-06;-5.6488508562325e-05;0.00097587349591777;-2.9343598725973e-05;0.00068595871562138;1.5082060826899e-06;-0.00018176094454248;4.1485560359433e-05;-0.00013491376012098;-0.00018282525707036;5.9048834373243e-05;4.5931341446703e-05;0.00031560153001919;-0.00030014623189345;0.00013574228796642;-0.00072883610846475;-6.3918614614522e-06;-0.00048067967873067;-7.5153667467021e-07;-0.00098374811932445;2.6803072614712e-05;0.00027090092771687;1.0525785000937e-05;-0.00029764173086733;0.00010446305532241;0.00033045298187062;0.00027206662343815;0.00044373457785696;0.00010110221046489;-0.00017362281505484;-8.1874247825908e-07;-8.993549272418e-05;9.3080481747165e-05;-0.00012330846220721;0.00033828042796813;-0.0002149870415451;3.1547602702631e-05;0.00045724507072009;0.00022301911667455;0.00043948242091574;0.00017645972548053;-0.00027017394313589;-0.00060905161080882;-0.00026558159152046;-0.00022796550183557;-0.00026194227393717;-0.00021289731375873;-0.00022841848840471;-7.6137199357618e-05;-0.00021486550394911;0.00085444271098822;-6.7492605012376e-05;-0.00054106244351715;-4.5742104703095e-05;3.0395400244743e-05;6.8721157731488e-05;-0.00034669300657697;4.6156092139427e-05;0.00044967251596972;-0.00014504618593492;-0.0002039591781795;2.6480200176593e-05;-5.4581607400905e-05;6.3337553001475e-05;0.00086454569827765;-1.3782361747872e-05;0.00010493291483726;1.8982536857948e-05;0.00029282734612934;-3.4559685445856e-05;-0.00023993995273486;0.00028093057335354;2.4727443815209e-05;0.00037342455470935;2.5021312467288e-05;-0.00022190905292518;-0.00010289518831996;-0.00074985553510487;5.0445334636606e-05;-5.4892032494536e-05;-9.0099529188592e-06;-0.00021379959071055;-4.7791563702049e-06;-0.00027915608370677;0.00013821310130879;-0.00020799138292205;-0.00012041161244269;-0.00016436746227555;-0.00019771124061663;0.00062376743881032;-6.0219848819543e-05;0.00047805794747546;2.2421423636843e-05;9.9716471595457e-06;-8.7821616034489e-05;0.0011754219885916;-5.8919686125591e-05;0.00078716949792579;3.908790404239e-06;-0.00023750886612106;6.4587911765557e-05;-0.00016782894090284;-0.00021205528173596;6.3646111811977e-05;8.274674473796e-05;0.00038820700137876;-0.00035966813447885;0.00019001854525413;-0.00084423675434664;8.8075175881386e-06;-0.00054205337073654;2.1414869479486e-05;-0.0011710156686604;2.9905068004155e-05;0.00034354426315986;3.4707638405962e-05;-0.0002811070298776;5.8860361605184e-05;0.00031251143082045;0.00021076577831991;0.00040119769982994;8.573078957852e-05;-0.0001388674863847;3.9274300434045e-06;-8.1157442764379e-05;5.9126621636096e-05;-0.00012102165055694;0.00026888301363215;-0.00012643805530388;2.3510205210187e-05;0.00042669626418501;0.00020257299183868;0.00037323881406337;0.0001364984200336;-0.00021287189156283;-0.00055559229804203;-0.00021896348334849;-0.00018021717551164;-0.00018742113024928;-0.00020515279902611;-0.00018427168834023;-0.00011982452269876;-0.00016967956617009;0.00075434282189235;-5.3692692745244e-05;-0.00051629141671583;-1.9061506463913e-05;-3.1567800760968e-05;4.7151581384242e-05;-0.00029085596906953;4.5681146730203e-05;0.00042927367030643;-0.00012876937398687;-0.00020097369269934;2.1456993636093e-05;-4.0328275645152e-05;3.6737492337124e-05;0.000846998533234;-2.1055511751911e-05;6.3595296523999e-05;1.5898353012744e-05;0.00025405752239749;9.5318655439769e-06;-0.00018073940009344;0.00025634476332925;-9.7041738627013e-06;0.00028543951339088;1.5825273294467e-05;-0.00020751090778504;-6.5575775806792e-05;-0.00071268016472459;4.3717849621316e-05;-2.2970980353421e-05;-2.2435972368839e-06;-0.00020260018936824;3.4410135185681e-07;-0.00023541663540527;0.00013081685756333;-0.00018303601245862;-0.00012007910845568;-0.00018566817743704;-0.000199207366677;0.00051778758643195;-6.2060156778898e-05;0.00043502045446075;2.0164783563814e-05;1.0053226105811e-05;-9.9030388810206e-05;0.0010569493751973;-7.5406365795061e-05;0.0006908216746524;3.3230207918677e-06;-0.00023015553597361;6.3463150581811e-05;-0.00016915297601372;-0.00019746068574023;6.3384373788722e-05;0.000104040154838;0.00036639379686676;-0.00030939592397772;0.00019879976753145;-0.00070779822999611;2.3479204173782e-05;-0.00047312321839854;3.991639096057e-05;-0.0010687171015888;2.6381379939266e-05;0.00032949610613286;8.4384337242227e-05;-2.4395130822086e-05;-8.9042667241301e-05;-5.434164631879e-05;-0.00091773981694132;-6.5045162045863e-05;-0.00071181613020599;-9.9067274277331e-06;0.00039070993079804;-3.4497363230912e-05;-0.00039182047476061;-3.3485075618955e-06;-0.00040334364166483;-0.00018995661230292;0.00023635906109121;-8.7000138591975e-05;-8.2168415246997e-05;-0.00053809740347788;-0.00022120161156636;0.00038812181446701;0.00017269563977607;0.001063555944711;8.5256440797821e-05;0.00061441096477211;0.00010229267354589;0.0005117004038766;0.00012933435209561;0.00053753860993311;3.5748846130446e-05;-0.00067206093808636;0.00014367330004461;1.3956403677184e-07;-1.3068186490273e-05;0.00056842458434403;0.00012540283205453;0.00010572489554761;-6.2079066992737e-05;0.00018946883210447;-4.956659176969e-05;-8.9074288553093e-05;0.00011500316759339;-0.00059050077106804;-1.8612288840814e-05;0.0005441679386422;-4.7920962970238e-05;3.8394333387259e-05;-8.87462447281e-05;-0.00027921388391405;0.0001929486024892;3.5603832657216e-05;-0.00013012987619732;5.8414192608325e-05;-0.00020927601144649;-7.3234354204033e-05;-0.00038274563848972;-2.1841848138138e-05;-0.00012047590280417;0.00011339868069626;0.00075995223596692;1.3995832887304e-05;-0.00073844473809004;5.3891140851192e-05;-1.6832891560625e-05;4.4610977056436e-05;0.00036667365930043;-0.00014357360487338;0.0010200615506619;-0.00031046266667545;-7.7443270129152e-05;-0.00017467890575062;-0.00016858872550074;0.00021869479678571;7.639906834811e-05;-1.9008990420843e-05;0.0013597157085314;-0.00016266564489342;0.0011889594607055;-0.0001644870499149;-0.00016013761342037;-0.00048063194844872;-0.00011889591405634;-0.00025173221365549;0.00048511126078665;0.00015288185386453;0.00032486006966792;-0.0010473624570295;0.00012223752855789;-0.0012414582306519;0.00024326030688826;3.0135135602904e-05;4.5647040678887e-05;-0.0012616409221664;0.00012035252439091;8.5334140749183e-05;-2.1055779143353e-05;-5.4704742069589e-05;-5.5582473578397e-05;-0.00088244024664164;-9.8963959317189e-05;-0.00069100077962503;-3.3948879718082e-05;0.00039538237615488;-1.5276897102012e-05;-0.00035863055381924;-1.2393520592013e-05;-0.00029232774977572;-0.00021802418632433;0.00021427747560665;-0.00010523579112487;-0.00011322676436976;-0.00057079491671175;-0.0002393303293502;0.000413442554418;0.00019691056513693;0.0010601239046082;0.00012631784193218;0.00049784278962761;0.0001234916417161;0.00047783463378437;0.00016206984582823;0.00049293326446787;4.6596807806054e-05;-0.00068963516969234;0.00016001483891159;-3.996936754902e-07;-1.4037676919543e-05;0.00055535539286211;0.00013440000475384;0.00012433929077815;-4.3615920731099e-05;0.00021184828074183;-6.0036258219043e-05;-0.00015036178228911;0.00013867528468836;-0.00057176448171958;-1.8119844753528e-05;0.0005007327417843;-4.8681158659747e-05;6.9195615651552e-05;-9.629475971451e-05;-0.00027902374858968;0.00022984376118984;8.3977261965629e-05;-0.00012853121734224;4.2427640437381e-05;-0.00027021835558116;-0.00011077943054261;-0.00037397939013317;-3.2130817999132e-05;-0.00012167634849902;0.0001213495634147;0.00076096941484138;1.7497823137091e-05;-0.00072416680632159;5.3205552831059e-05;-2.2205571440281e-05;4.6939519961597e-05;0.00036705515231006;-0.00014155516691972;0.0010672458447516;-0.00030223996145651;-3.8121244870126e-05;-0.00016854733985383;-0.0001723828172544;0.0002143291203538;0.00010189333261224;-1.7914944692166e-05;0.0013815261190757;-0.00014775978343096;0.0011855920311064;-0.00015417303075083;-0.00015769753372297;-0.00046718746307306;-0.00012477733253036;-0.00026350366533734;0.00047818734310567;0.00011472911864985;0.00032928507425822;-0.001074354047887;0.00011417489440646;-0.0012833632063121;0.00022626810823567;4.6436648517556e-06;4.2693289287854e-05;-0.0012494430411607;0.00011066338629462;1.3790072443953e-05;-6.6451248130761e-05;0.00010168524750043;1.9964727471233e-05;0.00010318149725208;0.00081832701107487;-1.7543030480738e-05;0.00088402978144586;0.00011357403855072;-0.0005363505333662;3.1536295864498e-05;0.00036374889896251;0.00024671168648638;0.00020706906798296;4.6930883399909e-05;-0.00024252093862742;7.8474127803929e-05;0.00059273961232975;0.00022145913681015;-0.00022287908359431;-0.00033311531296931;-7.8840952483006e-05;-0.0011880528181791;-0.0001878382608993;-0.00042414193740115;-0.00012315501226112;-0.00047316538984887;-7.0023656007834e-05;-0.00052673718892038;-0.00013973901513964;0.00078733230475336;-1.3417738045973e-05;6.0153033700772e-06;0.0001512672752142;0.00052054971456528;-8.6699561506975e-05;-3.1170654892776e-06;-7.5126961746719e-05;0.00027859100373462;0.00014949365868233;-0.00015348548186012;-1.5436711692018e-05;-0.00054958695545793;-7.2682203608565e-05;0.00045786585542373;-0.00011465598072391;-1.1851683666464e-05;-0.00031244690762833;0.00020745539222844;5.025310383644e-05;6.0880058299517e-05;-6.513037806144e-05;-6.9977621024009e-05;-0.00025799186551012;-2.9094802812324e-05;-0.00026147713651881;0.00016178149962798;-7.3857387178577e-05;1.9089464331046e-05;0.00068088556872681;6.6296313889325e-05;-0.00064438773551956;5.5990971304709e-05;-2.4561768441345e-05;-0.00018631531565916;0.00038598899845965;-0.00034325162414461;0.00098787574097514;-0.00012949359370396;-0.00012757889635395;0.00018928620556835;-0.00016644901188556;-2.431335633446e-05;8.663028893352e-06;-0.00018096015264746;0.0012522214092314;-0.00015826258459128;0.001264258287847;-0.00015840095875319;-0.00047361705219373;-0.00011255805293331;0.00055496027925983;-0.00032052939059213;0.00027664474328049;0.00020044430857524;0.0001604156132089;-0.00092074961867183;0.00024400166876148;-0.0012191978748888;4.8593519750284e-05;0.0001025747260428;0.00012220971984789;-0.0013078900519758;1.8049633581541e-05;-6.633887096541e-05;9.5928531663958e-05;4.1424158553127e-05;7.0146554207895e-05;0.00082585518248379;-3.4514403523644e-05;0.00089097121963277;0.00012378158862703;-0.0005229560774751;2.0441906599444e-05;0.00038741138996556;0.00021733679750469;0.00028517568716779;3.382909562788e-05;-0.00026510271709412;5.5731474276399e-05;0.00056125473929569;0.00020426373521332;-0.0002003412519116;-0.0003084515046794;-4.6039469452808e-05;-0.0011750248959288;-0.00016067081014626;-0.00049798877444118;-9.4547118351329e-05;-0.00048662419430912;-5.772992153652e-05;-0.00055981462355703;-0.00012592897110153;0.00077047187369317;-1.1653006367851e-05;5.080611572339e-06;0.00014199687575456;0.00052691384917125;-0.00010064932575915;-2.006983049796e-05;-6.1591956182383e-05;0.0002503331634216;0.00012255435285624;-9.322795085609e-05;-1.8944650946651e-05;-0.00055386684834957;-7.0460446295328e-05;0.00048706255620345;-0.000102968995634;-4.249632183928e-05;-0.00031010512611829;0.00017651935922913;9.8377367976354e-06;7.2822462243494e-05;-6.5581858507358e-05;-4.10924985772e-05;-0.00020229500660207;-1.6407708244515e-05;-0.00026971424813382;0.00014829277643003;-6.4802668930497e-05;1.7349226254737e-05;0.00067006587050855;6.4299296354875e-05;-0.00064719974761829;5.3696676332038e-05;-2.0756577214343e-05;-0.00018692525918595;0.00038460121140815;-0.00034781280555762;0.00094599078875035;-0.0001331735693384;-0.00016403489280492;0.00019037535821553;-0.00016102507652249;-2.5493553039269e-05;-1.2559684364533e-05;-0.00019220693502575;0.001221977872774;-0.00016474985750392;0.0012586917728186;-0.00015850525232963;-0.00047999498201534;-0.00010420863691252;0.00055692892055959;-0.00031264664721675;0.00026910554151982;0.00023124655126594;0.00016628223238513;-0.00089215341722593;0.00025645439745858;-0.0011759280459955;5.1498805987649e-05;0.00012466950283851;0.00012829025217798;-0.0013076346367598;8.6026906501502e-05;-3.144406946376e-05;-0.00032785488292575;-6.2224717112258e-05;-0.0010451498674229;4.409236862557e-05;-0.00077168480493128;5.3444950935955e-06;0.00027042752481066;-1.8972014004248e-05;-0.00031310724443756;1.8542637917562e-05;-0.00084094307385385;-0.0001493948220741;0.00033056366373785;-7.2828886914067e-05;3.7539688491961e-05;-0.00046665841364302;-9.7583608294372e-05;0.00040689326124266;8.3003818872385e-05;0.0010399431921542;-4.9687758291839e-05;0.0010017354506999;5.4235679272097e-05;0.00063836289336905;8.820605580695e-05;0.00049146049423143;2.2413894839701e-05;-0.00048927211901173;0.00011801423534052;-8.6191248556133e-06;-1.1057856681873e-05;0.0006166067905724;7.5317242590245e-05;0.00017255313287023;-8.9867542556021e-05;3.2902913517319e-05;-1.3446486264002e-05;8.2582473623916e-06;7.2596834797878e-05;-0.00071917509194463;-6.7131845753465e-06;0.00063285540090874;-4.9901798774954e-05;0.00029490629094653;-8.2753380411305e-05;-0.00023745572252665;9.2185531684663e-05;-4.2997042328352e-05;-0.00025100109633058;0.00013413828855846;1.7282409316977e-05;-4.6614586608484e-05;-0.00034791551297531;-3.2251969059871e-06;-0.00031855699489824;0.00010014206782216;0.00094699306646362;-4.2796202137652e-07;-0.0010314361425117;6.4426552853547e-05;-2.5825283955783e-05;5.6792126997607e-05;0.00025170925073326;-0.00016570773732383;0.00095802056603134;-0.00034244306152686;-8.9890185336117e-05;-0.0001936913758982;-0.00011549006740097;0.00020318214956205;0.00025733502116054;-3.7822796002729e-05;0.0013962369412184;-0.00020036997739226;0.0010270792990923;-0.00016222958220169;-0.00013216702791397;-0.00055255281040445;-0.00014171029033605;-0.00015024596359581;0.00048266028170474;0.00018269965949003;0.00038788304664195;-0.0010726118925959;0.00016707800386939;-0.0011521434644237;0.00026195583632216;-0.00017370480054524;6.3442705140915e-05;-0.0011194177204743;0.00013194922939874;0.00010538916103542;-2.9869723221054e-05;-0.00025229997118004;-8.204623736674e-05;-0.0011248927330598;-4.2340405343566e-05;-0.00089811498764902;-3.3492382499389e-05;0.00036846802686341;-7.7784585528207e-07;-0.00036238913889974;1.6238881244135e-06;-0.00066003698157147;-0.00024019830743782;0.00039641259354539;-0.00012107571819797;-4.1183786379406e-05;-0.00065055472077802;-0.00018362449191045;0.00050100061343983;0.00018618722970132;0.0012707164278254;4.6956829464762e-05;0.00087886833352968;0.00011708232341334;0.00062493950827047;0.00017298207967542;0.00055392947979271;4.9186000978807e-05;-0.00072824594099075;0.00017740087059792;-7.3573396548454e-06;-1.6437368685729e-05;0.00074424082413316;0.00011940571130253;0.00021079670113977;-7.8647768532392e-05;8.6131258285604e-05;-3.8115369534353e-05;-8.5203915659804e-05;0.00012640304339584;-0.00083117315080017;-9.1134024842177e-06;0.00069257762515917;-5.7807086704997e-05;0.00034412808599882;-0.00011077343515353;-0.00031323605799116;0.00017559228581376;3.083697083639e-05;-0.00027007202152163;0.00013248728646431;-9.7527939942665e-05;-0.0001131439130404;-0.00044324426562525;-2.6769692340167e-05;-0.0003229686699342;0.00013445125659928;0.0011225766502321;6.4093010223587e-06;-0.0011776356259361;7.3190123657696e-05;-4.2383067921037e-05;7.0910748036113e-05;0.0003534535644576;-0.0001962702954188;0.0012920454610139;-0.00040470401290804;-4.2501011193963e-05;-0.00022681175323669;-0.00017232044774573;0.00025290821213275;0.0003105491923634;-3.9821828977438e-05;0.0017427552957088;-0.00021576632570941;0.001311271567829;-0.00018929081852548;-0.0001632905768929;-0.00063136941753328;-0.00017285885405727;-0.00024748919531703;0.00058441702276468;0.00015000125858933;0.00046456098789349;-0.0013730329228565;0.00018370541511104;-0.0015294712502509;0.00029761463520117;-0.00019329016504344;6.7748500441667e-05;-0.0013877456076443;0.00014647579519078;0.00010456568998052;-2.1603704226436e-05;-0.00016242830315605;-8.3368591731414e-05;-0.00097947404719889;-0.00011318333417876;-0.00080597109626979;-7.5969517638441e-05;0.00036287665716372;3.2716441637604e-05;-0.0002873124612961;-1.8462307707523e-05;-0.00038703042082489;-0.00029000319773331;0.00034470745595172;-0.00015020098362584;-0.00010328805365134;-0.00068452517734841;-0.00021732064487878;0.0005166984628886;0.00023138990218285;0.0011998015688732;0.0001295692200074;0.00059237272944301;0.00015953018737491;0.00050104531692341;0.00023022475943435;0.00044054700993001;7.1553127781954e-05;-0.00074082933133468;0.00020337280875538;-7.9357741924468e-06;-1.6642703485559e-05;0.00068369001382962;0.00013433022832032;0.0002273923746543;-3.9103211747715e-05;0.00011949623149121;-5.2220220823074e-05;-0.00017689586093184;0.00015116123540793;-0.0007365383207798;-1.0563068826741e-05;0.00058602436911315;-5.5185730161611e-05;0.00035489216679707;-0.00011004130647052;-0.00030647922540084;0.00022954771702643;0.00011858401558129;-0.00023583041911479;9.6350515377708e-05;-0.0002075829252135;-0.00017480217502452;-0.00042808902799152;-4.4834931031801e-05;-0.00028670235769823;0.00013572968600783;0.0010546315461397;1.5745279597468e-05;-0.0010817338479683;6.3605795730837e-05;-5.1132257794961e-05;7.1721682616044e-05;0.00034182542003691;-0.0001823282946134;0.0013142315438017;-0.00036664816434495;2.5340277716168e-05;-0.00020480815146584;-0.00017508982273284;0.00023640257131774;0.00033748129499145;-3.2854051823961e-05;0.0016939393244684;-0.00017322147323284;0.0012517984723672;-0.00016240887634922;-0.00015366075967904;-0.00057985703460872;-0.00017406063852832;-0.00025834090774879;0.00054669321980327;7.971311424626e-05;0.00044777544098906;-0.0013522650115192;0.00015448953490704;-0.0015319128287956;0.00025038197054528;-0.00022486626403406;5.5757602240192e-05;-0.001305133337155;0.00012103651533835;8.7396037997678e-05;-1.2109613635403e-05;-0.00011077480303356;-6.9531532062683e-05;-0.00069899141089991;-0.00012824850273319;-0.00057173840468749;-9.7865457064472e-05;0.00025612517492846;6.3964464061428e-05;-0.0001417388120899;-2.9410193747026e-05;-0.00017381731595378;-0.0002761357172858;0.00023930562019814;-0.00014673901023343;-0.00011390367581043;-0.00056444440269843;-0.00017748530081008;0.00044664175948128;0.0002024635032285;0.00089504604693502;0.00014661281602457;0.00031473796116188;0.00015921052545309;0.00032789201941341;0.00023161487479229;0.00022842708858661;7.8391516581178e-05;-0.00054993527010083;0.00018504008767195;-9.8436548796599e-06;-1.2016221262456e-05;0.00049899314763024;0.00011211699893465;0.00021916553669143;2.2341996555042e-06;9.3165173893794e-05;-4.4896714825882e-05;-0.00020409833814483;0.00012890849029645;-0.00051670795073733;-9.1920246632071e-06;0.0003961390175391;-4.3579111661529e-05;0.00034861304447986;-8.1039848737419e-05;-0.00023291727120522;0.00021259984350763;0.00016558925563004;-0.00017762529023457;6.0250025853748e-05;-0.00022727037139703;-0.00019677318050526;-0.00033270035055466;-4.8339705244871e-05;-0.00024184059293475;0.0001038309710566;0.00082004320574924;2.1302859749994e-05;-0.00084635551320389;4.2244304495398e-05;-5.1373302994762e-05;6.1732440371998e-05;0.00023537928063888;-0.00013780273729935;0.0010619023814797;-0.00026329312822782;8.2523838500492e-05;-0.00014788453700021;-0.00013064082304481;0.00017177985864691;0.00034340715501457;-2.2562431695405e-05;0.0013310146750882;-0.00010340322478442;0.00091240933397785;-0.00010338005813537;-0.00011170542711625;-0.00044137705117464;-0.00014871593157295;-0.00018769656890072;0.00040618286584504;7.2506832111685e-06;0.00036149087827653;-0.0010742431040853;0.0001026853278745;-0.0012127220397815;0.00015707776765339;-0.00026626026374288;3.5830365959555e-05;-0.00094212830299512;7.4522009526845e-05;3.6448614082474e-06;-6.571374979103e-05;0.00012692694144789;8.8743297965266e-05;0.00013438693713397;0.00063290965044871;5.1040518883383e-05;0.00075339083559811;2.3585087546962e-05;-0.00036544058821164;4.35827387264e-05;0.00016589011647739;0.00030304671963677;0.00012417015386745;9.3417358584702e-05;-0.00029126080335118;5.8373458159622e-05;0.00057524384465069;0.00014536918024532;-0.00022795515542384;-0.00034495003637858;-9.1875728685409e-05;-0.0010070239659399;-0.00022327071928885;-0.00028315425151959;-0.00020068844605703;-0.0003205725515727;-9.8861855803989e-05;-0.0002823386748787;-0.00016179228259716;0.00064117717556655;-1.5467536286451e-05;6.1209716477606e-06;0.00012143114145147;0.00047470169374719;-3.6839534004685e-05;9.1827576397918e-05;-6.0956939705648e-05;0.00010859345638892;0.00013793658581562;-0.00019335761317052;5.4715183068765e-06;-0.00054289441322908;-6.7183915234637e-05;0.00035950561868958;-0.00010189813474426;0.00030678216717206;-0.00026538752717897;0.00017069517343771;0.00013269833289087;9.3954367912374e-05;-0.00012874201638624;-0.0001570028543938;-0.00017179865972139;-5.5396627431037e-05;-0.0001998797088163;0.00014601313159801;-0.0002007071452681;1.7483531337348e-05;0.00076849531615153;5.8874229580397e-05;-0.00080307218013331;6.7312910687178e-05;-4.57821006421e-05;-0.00017407740233466;0.00026579335099086;-0.00029496874776669;0.00096514524193481;-0.00010896512685576;-5.7214797379856e-06;0.00014774194278289;-0.00012056177365594;-2.6891653760686e-05;0.00022330056526698;-0.00013080280041322;0.0012038553832099;-0.00010916152677964;0.00096654356457293;-0.00012026855984004;-0.00044490059372038;-0.00013574375770986;0.00047362339682877;-0.00023141685232986;0.00030227671959437;9.5171468274202e-05;0.00014205015031621;-0.00093206996098161;0.00017101709090639;-0.001127386232838;3.7648303987226e-05;-0.00015110039385036;8.6876592831686e-05;-0.00098853779491037;1.2951845747011e-05;-8.1295693235006e-05;0.00014634313993156;0.00011321123747621;0.00012102847540518;0.00086985219968483;2.2708023607265e-05;0.0010322800371796;7.0837566454429e-05;-0.00050518609350547;3.5525092243915e-05;0.0003066586505156;0.00032524301786907;0.00027641153428704;8.8916363893077e-05;-0.00040682152030058;5.3477728215512e-05;0.000709404645022;0.0001845637743827;-0.00026889590662904;-0.00039979597204365;-7.2066271968652e-05;-0.0013388090301305;-0.00023332073760685;-0.00049199926434085;-0.00019472176791169;-0.00047170132165775;-9.7109223133884e-05;-0.00049356347881258;-0.00018056562112179;0.00086643866961822;-1.8732171156444e-05;6.5229064603045e-06;0.00014961819397286;0.0006429695058614;-8.3659244410228e-05;6.7250533902552e-05;-6.7189990659244e-05;0.00014831307635177;0.0001570750027895;-0.00016889492690098;-7.8877303621994e-07;-0.00073301396332681;-8.4809187683277e-05;0.00052368553588167;-0.00012944145419169;0.00028832501266152;-0.00034729603794403;0.00019128665735479;8.8645865616854e-05;0.00012908468488604;-0.00016563043755013;-0.00013747239427175;-0.00015971339598764;-4.6779627155047e-05;-0.00027025429881178;0.00018139404710382;-0.00022110511781648;1.6178924852284e-05;0.0009703024988994;8.0475081631448e-05;-0.0010063464287668;8.0554134910926e-05;-4.7884735977277e-05;-0.00023011614393909;0.00037810625508428;-0.00040782452560961;0.0012058042921126;-0.00015371073095594;-8.4458086348604e-05;0.00020289188250899;-0.00016298874106724;-3.9855545765022e-05;0.00019575477926992;-0.00020567451429088;0.0015288231661543;-0.00016454375872854;0.001325709046796;-0.00016261037671939;-0.00058063887991011;-0.00015462748706341;0.00063394597964361;-0.00032228039344773;0.00037333974614739;0.00018242026271764;0.00020452853641473;-0.0011668262304738;0.00026477724895813;-0.0014337529428303;6.0284895880613e-05;-8.7994339992292e-05;0.00013149570440874;-0.0013626486761495;2.286799463036e-05;-8.327784598805e-05;0.00013739005953539;0.0001704505411908;5.2050898375455e-05;0.0009422482107766;-9.3955259217182e-06;0.0011004218831658;9.2606001999229e-05;-0.00050009932601824;1.2056410923833e-05;0.00036368970177136;0.00027305536787026;0.00046776101225987;6.6407781559974e-05;-0.0004601941909641;7.388226549665e-06;0.00067657040199265;0.00015263751265593;-0.00022838152654003;-0.0003764709981624;-4.7257703954529e-06;-0.0013754706596956;-0.00018080478184856;-0.00067699729697779;-0.00014244101475924;-0.00054422556422651;-7.2688839281909e-05;-0.00058355933288112;-0.00015836264356039;0.00085949327331036;-1.7284588466282e-05;4.9112227316073e-06;0.00013471880811267;0.00068577431375161;-0.00011582150909817;4.3934989662375e-05;-4.7261906729545e-05;0.00010200530232396;0.0001238186378032;-7.6276875915937e-05;-4.7890989662847e-06;-0.00079076323891059;-8.5740750364494e-05;0.00059776334092021;-0.00012152812996646;0.00026936549693346;-0.00035115101491101;0.00014359888155013;1.5356787116616e-05;0.00015889368660282;-0.0001894122979138;-9.008922643261e-05;-5.5668180721113e-05;-2.4153294361895e-05;-0.0002817161148414;0.00017035078781191;-0.00023228829377331;1.0594165360089e-05;0.0010073820594698;8.4933402831666e-05;-0.0010694573866203;8.00328416517e-05;-4.2041254346259e-05;-0.0002418005024083;0.00038906311965548;-0.00043918710434809;0.001180428895168;-0.00016821941244416;-0.00014910541358404;0.00021085279877298;-0.00015637821343262;-4.7751844249433e-05;0.00016758478886914;-0.00024115496489685;0.0015433438820764;-0.00018284999532625;0.0013631621841341;-0.00016837019938976;-0.00061377615202218;-0.00014717727026436;0.00066230347147211;-0.00031996605684981;0.00037937151500955;0.00023990159388632;0.00023106898879632;-0.001167674199678;0.00030240823980421;-0.0014147091424093;7.2386654210277e-05;-5.48709758732e-05;0.00014900097448844;-0.0014158771373332;2.6677549612941e-05;-6.7404209403321e-05;9.8621021606959e-05;0.00022332501248457;-3.0779894586885e-05;0.00079648720566183;-2.5586246920284e-05;0.00087831064593047;7.5803349318448e-05;-0.00035022481461056;-1.1256051038799e-05;0.00028912542620674;0.00017015206685755;0.00057893397752196;3.6496556276688e-05;-0.0003764481516555;-5.0453487347113e-05;0.00047664289013483;7.273650408024e-05;-0.00011847545101773;-0.00028918977477588;6.267774006119e-05;-0.0010557954665273;-9.4276845629793e-05;-0.0007113630999811;-7.0250127464533e-05;-0.00049958255840465;-3.819460835075e-05;-0.00047921424265951;-0.00010404783824924;0.00058655283646658;-1.1652723514999e-05;1.942397602761e-06;8.5190877143759e-05;0.00054625089978799;-0.00010841643234016;3.4669876185944e-05;-1.7139604096883e-05;2.3022272216622e-05;6.3498337112833e-05;1.4251391803555e-05;-4.913271368423e-06;-0.00064827752066776;-6.8352870584931e-05;0.00051315996097401;-8.3062885096297e-05;0.00023145327577367;-0.00026114351931028;6.7632936406881e-05;-3.7042165786261e-05;0.00014908603043295;-0.0001745268527884;-4.2399653466418e-05;4.8896650696406e-05;-7.8596610819659e-07;-0.00021251292491797;0.0001187089146697;-0.00021612734417431;4.8044412324089e-06;0.0008137776167132;6.7939537984785e-05;-0.00089793174993247;6.2558799982071e-05;-2.8264475986362e-05;-0.00019335708930157;0.00027810325263999;-0.00035329555976205;0.00085631315596402;-0.00013637232768815;-0.00015964364865795;0.00015815456572454;-9.6956886409316e-05;-4.3828447815031e-05;0.00014065077994019;-0.00020691700046882;0.0011827807174996;-0.00014543930592481;0.001017042202875;-0.00012932279787492;-0.00050461059436202;-0.00011455961066531;0.00051929708570242;-0.00021341403771657;0.0003030568768736;0.00022904385696165;0.00019651187176351;-0.00088528508786112;0.00024880623095669;-0.001026529003866;6.4561085309833e-05;-5.9864501963602e-05;0.00012319520465098;-0.0010824153432623;9.1427151346579e-05;-3.0727769626537e-05;-0.00050682335859165;-6.7909015342593e-05;-0.0011688423110172;8.0740966950543e-05;-0.00081793044228107;-1.2703118045465e-05;0.00023372472787742;-7.058206392685e-06;-0.00014712734264322;1.5853087461437e-05;-0.0010506667895243;-0.00016349968791474;0.00029676166013815;-7.2357259341516e-05;8.0297744716518e-05;-0.00049418018897995;-3.9467555325245e-05;0.00052720226813108;4.3913092667935e-05;0.0010523021919653;-7.8676675911993e-05;0.0011459972010925;5.4504660511157e-05;0.00077936012530699;9.3398142780643e-05;0.00033596981666051;3.4777782275341e-05;-0.00032606202876195;0.00011780098429881;-3.0959956347942e-05;-7.452562385879e-06;0.00063935812795535;5.1667862862814e-05;0.00021942038438283;-7.9302910307888e-05;-8.0534613516647e-05;-8.9365958046983e-06;-7.3523069659132e-06;8.603505557403e-05;-0.00078012893209234;3.6614692362491e-06;0.00061680341605097;-4.9494636186864e-05;0.00054376188199967;-9.636420145398e-05;-0.00020138644322287;6.3244682678487e-05;-2.6833295123652e-05;-0.00033041724236682;0.0001620775583433;0.00012394295481499;-8.4314298874233e-05;-0.00031959026819095;-7.3067244557024e-06;-0.00043041989556514;0.00010637572268024;0.0011297148885205;-1.1044393431803e-05;-0.0012682353844866;7.4010677053593e-05;-5.0364844355499e-05;7.8013021266088e-05;0.00015115592395887;-0.0001955948973773;0.0010527088306844;-0.00038889644201845;-7.677936082473e-06;-0.00021623105567414;-9.3442933575716e-05;0.00019909543334506;0.00050487770931795;-6.1003040173091e-05;0.0015539787709713;-0.00023024043184705;0.00093737145652995;-0.00015690327563789;-9.8881020676345e-05;-0.00061492173699662;-0.00018756992358249;-9.1336441983003e-05;0.00048788619460538;0.00013161008246243;0.00048666307702661;-0.0012102541513741;0.0002168028295273;-0.0012400806881487;0.00027383043197915;-0.00043075138819404;8.2100232248195e-05;-0.0010196706280112;0.0001377269072691;0.00010471943096491;-2.4726839910727e-05;-0.00042252076673321;-8.803801756585e-05;-0.0011182184098288;-1.5277975762729e-05;-0.00085358391515911;-5.8791629271582e-05;0.00028671347536147;2.0641029550461e-05;-0.00013100913201924;-6.1452337831724e-06;-0.00077981327194721;-0.00025084606022574;0.00034657932701521;-0.00011753782018786;5.4534452829103e-06;-0.00063678045989946;-0.00011022008402506;0.0005856363568455;0.00014102124259807;0.0011638752184808;2.7345016860636e-05;0.00091714301379398;0.00012088097719243;0.00067120307357982;0.00017841476073954;0.00030818863888271;6.5858635935001e-05;-0.00049950683023781;0.00016934279119596;-2.9464625185938e-05;-1.1869869013026e-05;0.0007204552530311;8.4873441664968e-05;0.00026667572092265;-6.0528851463459e-05;-6.0437367210397e-05;-2.8363980163704e-05;-8.8303189841099e-05;0.00012359382526483;-0.00082667102105916;3.1870524708211e-06;0.0006337832310237;-5.2522660553223e-05;0.00060648721409962;-0.00011172079393873;-0.00025691147311591;0.00012156684533693;5.2029314247193e-05;-0.00033717870246619;0.00016205233987421;2.9930288292235e-05;-0.00014851655578241;-0.00040703261038288;-3.114230275969e-05;-0.00042960737482645;0.00012797824456356;0.0012392796343192;-3.9766132431396e-06;-0.0013629357563332;7.5291391112842e-05;-7.2363684012089e-05;9.0901870862581e-05;0.00021609575196635;-0.00021268501586746;0.0013020270271227;-0.00041968142613769;5.6845157814678e-05;-0.00023260143643711;-0.00013309308269527;0.00022697687381878;0.00057992670917884;-6.1359205574263e-05;0.0017767639365047;-0.00022530692513101;0.0010928193805739;-0.00016524767852388;-0.00011326600360917;-0.00064777751686051;-0.00020928638696205;-0.00016221743135247;0.00054063380230218;7.3098024586216e-05;0.00053730269428343;-0.0014317708555609;0.00022031331900507;-0.0015001120045781;0.00028117545298301;-0.00047681506839581;8.0220357631333e-05;-0.0011497476371005;0.00013823095650878;0.00010735109390225;-1.525517564005e-05;-0.00029168149922043;-9.2718008090742e-05;-0.00092283403500915;-0.00010703276348067;-0.00074081640923396;-0.00010560613009147;0.00028199359076098;5.8774574426934e-05;-7.4914009019267e-05;-3.0906077881809e-05;-0.00042477194801904;-0.00031572693842463;0.00031119026243687;-0.00015391556371469;-7.4395742558409e-05;-0.00067834550281987;-0.00015934654220473;0.00058399297995493;0.0002064571599476;0.0010861525079235;0.00012738154327963;0.00056566891726106;0.00017635824042372;0.00048641397734173;0.00024963132455014;0.00019791237718891;9.4762734079268e-05;-0.00054930004989728;0.00020352513820399;-2.5281806301791e-05;-1.2764792700182e-05;0.00065551832085475;0.00010719527926994;0.00028654164634645;-1.8710763470153e-05;-1.5179839465418e-05;-4.3039890442742e-05;-0.0001772673567757;0.00014096328231972;-0.00070433726068586;-8.2698187497954e-07;0.00053306523477659;-4.9239857617067e-05;0.00058448425261304;-0.00010288591874996;-0.00026342950877734;0.00017726335499901;0.00014851303421892;-0.00028061351622455;0.00012439290003385;-0.00010553936590441;-0.00021076480334159;-0.00041861177305691;-5.1902796258219e-05;-0.00037569121923298;0.00012519938172773;0.0011391277657822;1.0241720701742e-05;-0.0012363471323624;5.9928392147413e-05;-8.1084639532492e-05;8.9863482571673e-05;0.00022014013666194;-0.00019352225353941;0.0013206454459578;-0.00036968634231016;0.00011888753215317;-0.00020586936443578;-0.00014081815606914;0.00021182475029491;0.00058342120610178;-4.794096457772e-05;0.0017080719117075;-0.00016994813631754;0.0010436915326864;-0.00013663263234776;-0.00010960921645164;-0.00058823457220569;-0.00020532937196549;-0.0001826301595429;0.00050244608428329;4.9793429752754e-06;0.00050727045163512;-0.0013971840962768;0.00017715533613227;-0.0014968906762078;0.00022525763779413;-0.00048470392357558;6.1282124079298e-05;-0.0010737420525402;0.0001088896242436;0.00010752638627309;-7.1981307883107e-06;-0.00019756860274356;-8.8350803707726e-05;-0.00071654288331047;-0.00016173299809452;-0.00057385204127058;-0.000142433331348;0.00022945202363189;9.8693926702254e-05;5.989727924316e-06;-5.0567519792821e-05;-0.00015233164594974;-0.00035564447171055;0.00023701180180069;-0.000177545909537;-0.00012874980166089;-0.0006484734476544;-0.00017008156282827;0.00056501018116251;0.00022766496113036;0.00091843446716666;0.00018461991567165;0.0002704955113586;0.00021084959735163;0.00032082526013255;0.00029620056739077;4.4149477616884e-05;0.00011847008136101;-0.00048478174721822;0.00022046099184081;-2.3012400561129e-05;-1.0278348781867e-05;0.00052655290346593;0.00011379305215087;0.0003008127969224;2.7241472707829e-05;1.0109845788975e-05;-4.7058972995728e-05;-0.00024207643582486;0.00013524161477108;-0.00051444384735078;-5.3494090934691e-06;0.00039734900929034;-4.3642769014696e-05;0.00055810547200963;-7.8302749898285e-05;-0.00023871310986578;0.00020597163529601;0.00023345701629296;-0.00020981045963708;8.4178151155356e-05;-0.00021205461234786;-0.0002618512371555;-0.00039318136987276;-6.5619824454188e-05;-0.00032732513500378;0.00010588487202767;0.00096419075271115;2.5705909138196e-05;-0.0010536790359765;3.780528641073e-05;-8.423812687397e-05;8.4447347035166e-05;0.00017419674259145;-0.00016119098290801;0.0012134332209826;-0.00028907845262438;0.00017659012519289;-0.00016343647439498;-0.00012410046474542;0.0001751995732775;0.00058530014939606;-3.1607582059223e-05;0.0015128656523302;-9.9268028861843e-05;0.00086877134162933;-9.1910245828331e-05;-9.5042807515711e-05;-0.00050298537826166;-0.00019498448818922;-0.00015540223103017;0.00042331410804763;-5.771201904281e-05;0.00045303092338145;-0.0012454501120374;0.00012085105117876;-0.0013517793267965;0.00014489665045403;-0.00051363033708185;3.7719837564509e-05;-0.00087792228441685;6.9122608692851e-05;9.3083894171286e-05;-2.3459688236471e-06;-0.00013015902368352;-6.9973037170712e-05;-0.00049890094669536;-0.00015534402336925;-0.00037711736513302;-0.00013990043953527;0.00014936715888325;0.00010932390432572;6.0875096096424e-05;-5.3140603995416e-05;-2.3058908027451e-06;-0.00032162811839953;0.00014384015230462;-0.00016206671716645;-0.00013398140436038;-0.00051543454173952;-0.00013882559142075;0.00047334973351099;0.00019095184688922;0.00066287786467001;0.00017487717559561;8.3611856098287e-05;0.00019411281391513;0.00018909109348897;0.00027295824838802;-7.0313981268555e-05;0.00011481026740512;-0.00033578983857296;0.00019409641390666;-1.9353947209311e-05;-5.8439150052436e-06;0.00035594296059571;9.6736162959132e-05;0.0002668546512723;5.2528852393152e-05;1.414642065356e-05;-3.8384288927773e-05;-0.00023693854745943;0.00010270383791067;-0.00030393913039006;-7.7080985647626e-06;0.00025136707699858;-3.3792988688219e-05;0.000463453005068;-4.583699410432e-05;-0.00018208647088613;0.00018312204338145;0.00024864557781257;-0.00013169054000173;4.9383907025913e-05;-0.00023514026543126;-0.00025291013298556;-0.00031581887742504;-6.2245126173366e-05;-0.00025416375137866;7.3023002187256e-05;0.00070012785727158;3.2312655093847e-05;-0.0007811410469003;1.6646121366648e-05;-7.3316165071446e-05;6.8505818489939e-05;0.0001073639432434;-0.00011509197793202;0.00094498920952901;-0.0001906822581077;0.00018846070452128;-0.00011043615813833;-9.0151588665321e-05;0.00012275816698093;0.00050866685342044;-1.6433428754681e-05;0.0011509041069075;-3.7393183447421e-05;0.00060273363487795;-4.7250683564926e-05;-7.0922025770415e-05;-0.00037511251866817;-0.00016008529928513;-0.00010130443115486;0.00030498334672302;-8.7671520304866e-05;0.00035110572935082;-0.00095021043671295;6.5491432906128e-05;-0.0010358043946326;6.8179106165189e-05;-0.0004706354229711;1.6506362953805e-05;-0.00060037319781259;3.2226274925051e-05;-9.1522770162555e-06;-6.6736742155626e-05;0.00013693798973691;0.00013257181853987;0.00016656087245792;0.00045187474461272;0.00010067127732327;0.00052387459436432;-3.3141284802696e-05;-0.00023060593230184;6.6503547714092e-05;-3.6431101761991e-05;0.00034919619793072;-5.5640198297624e-06;0.00011246634676354;-0.00019006794900633;5.7686505897436e-05;0.00051177013665438;0.00010191053297604;-0.00020814195158891;-0.00036695541348308;-0.00012200212222524;-0.00074955925811082;-0.00026349679683335;-0.00010011145786848;-0.00024995449348353;-0.00019205675926059;-0.00013522409426514;1.5232362784445e-05;-0.00016737284022383;0.00039931759238243;-1.2601710295712e-05;6.5986491790682e-06;0.00010045471572084;0.00034689690801315;1.8344671843806e-05;0.00015245897520799;-5.709275501431e-05;-3.4268218769284e-06;0.00011555007949937;-0.00022053296561353;1.9188053556718e-05;-0.0003871598164551;-5.3598945669364e-05;0.00022837167489342;-7.1285023295786e-05;0.0004539601795841;-0.0002139681018889;0.00012880773283541;0.00021695630857721;9.4902105047368e-05;-0.00010044271766674;-0.00021414115326479;-0.00015378699754365;-8.2237282185815e-05;-0.00017194951942656;0.0001171714393422;-0.00022824916231912;2.1815392756253e-05;0.0006857113330625;3.584492878872e-05;-0.00077256018994376;7.0547932409681e-05;-6.2301754951477e-05;-0.00014151560026221;0.00014443857071456;-0.00021369819296524;0.00085440033581108;-7.5740448664874e-05;0.00011762634676415;0.0001044666278176;-8.0459023592994e-05;-1.7205924450536e-05;0.00038506669807248;-5.8914491091855e-05;0.0010503050871193;-5.7134478993248e-05;0.00063631328521296;-8.3905557403341e-05;-0.00037738922401331;-0.00015244320093188;0.00035860409843735;-0.00013059825869277;0.00029619966517203;-1.0595576895867e-05;9.6954368927982e-05;-0.00084701942978427;7.9181838373188e-05;-0.00095151469577104;1.2462259292079e-05;-0.00035490861046128;4.7760579036549e-05;-0.0006389832124114;-4.2200231291645e-06;-7.9118479334284e-05;0.00016223343845922;0.00017486726574134;0.00017184775788337;0.00063574931118637;9.3820941401646e-05;0.00076821842230856;-7.5857524279854e-06;-0.00033786878339015;6.5029867982958e-05;3.2859203201951e-05;0.00038681350997649;0.00010581765673123;0.0001203165811603;-0.00030300908838399;5.2047576900804e-05;0.00065312319202349;0.00012950031668879;-0.00025495741283521;-0.0004347798821982;-0.00012207769032102;-0.00103491358459;-0.00028724799631163;-0.00024663560907356;-0.00026670671650209;-0.00030748432618566;-0.00014085089787841;-0.00011966361489613;-0.00019236920343246;0.00058724405243993;-1.734269062581e-05;4.7270532377297e-06;0.00012211868306622;0.00050701427971944;-1.2933576726937e-05;0.00015146360965446;-6.4133419073187e-05;-1.2914983926748e-06;0.00014445256965701;-0.00022449040261563;1.9215627617086e-05;-0.0005880412645638;-7.0586174842902e-05;0.0003556830342859;-0.00010402927000541;0.00052854209206998;-0.00027966708876193;0.00015103399346117;0.00020039021910634;0.0001321891322732;-0.00016233975475188;-0.00022317834373098;-0.00012689654249698;-8.1850099377334e-05;-0.00021589343668893;0.00015491094382014;-0.00028109410777688;1.8257931515109e-05;0.00092532212147489;5.9564041293925e-05;-0.0010211176704615;8.811050793156e-05;-7.1025977376848e-05;-0.0001966815761989;0.00022443204943556;-0.00032098867814057;0.0011035681236535;-0.0001175814322778;8.1509722804185e-05;0.00014878319052514;-0.0001128496878664;-3.5256940464024e-05;0.00041951390448958;-0.00012608944962267;0.0013736231485382;-9.9587698059622e-05;0.00092313095228747;-0.00011326743697282;-0.00050171097973362;-0.00017894239863381;0.00049679528456181;-0.00020270999812055;0.00038003668305464;3.6590859963326e-05;0.00016195507487282;-0.0010968163842335;0.00015790566976648;-0.0012481539743021;3.6768666177522e-05;-0.00035968210431747;8.3242077380419e-05;-0.00093462120275944;6.0175793805683e-06;-8.3116465248168e-05;0.00016248476458713;0.00023478602815885;0.00011734767031157;0.00078652834054083;5.9724927268689e-05;0.00095108756795526;3.0871251510689e-05;-0.00040113605791703;4.4065698602935e-05;0.0001141644170275;0.00035037088673562;0.00030769448494539;0.00010008909157477;-0.00039197725709528;1.49451316247e-05;0.00069753476418555;0.00012221121869516;-0.00024509642389603;-0.00044756990973838;-7.1976639446802e-05;-0.0012081364402547;-0.00024862526333891;-0.0004586266586557;-0.00022250236361288;-0.00043418191489764;-0.00011797293700511;-0.00026971977786161;-0.00018118323350791;0.00068189750891179;-1.9107332263957e-05;6.4521140075158e-07;0.00012003009032924;0.00062517588958144;-5.6807140936144e-05;0.00012012589286314;-5.3902182116872e-05;-3.2093470508698e-05;0.00014078947424423;-0.00015754233754706;1.6557181879762e-05;-0.00074606755515561;-7.8902376117185e-05;0.00046966897207312;-0.00012135683209635;0.00054337026085705;-0.00031104823574424;0.00012761856487487;0.00012615651939996;0.00017003674292937;-0.00021785708668176;-0.00018466264009476;-2.4974147891044e-05;-6.1876999097876e-05;-0.00023574450460728;0.00016888596292119;-0.00030640707700513;8.4399289335124e-06;0.0010769622167572;7.8798992035445e-05;-0.0011849120492116;9.6125069831032e-05;-6.9967580202501e-05;-0.00023455785412807;0.00027852604398504;-0.00040773488581181;0.0012132984120399;-0.00015312976029236;1.5320867532864e-05;0.00017860342632048;-0.00012824051373173;-5.495215737028e-05;0.00040341142448597;-0.00019679927208927;0.0015468100318685;-0.00013840610336047;0.0011069810716435;-0.00013049379049335;-0.00058119057212025;-0.00018321971583646;0.00058711657766253;-0.00024587791995145;0.0004265527240932;9.8554257419892e-05;0.0002238916058559;-0.0012239380739629;0.00023612107906956;-0.0013905756641179;6.3572748331353e-05;-0.00032025607652031;0.00011730076948879;-0.0011328461114317;1.8540702512837e-05;-8.3835286204703e-05;0.00014819100033492;0.00032452004961669;2.5014944185386e-05;0.00089697225484997;2.3099624741008e-05;0.0010418304009363;5.5970580433495e-05;-0.00039515033131465;1.4022777577338e-05;0.00016329628124367;0.00028163380920887;0.00056981394300237;7.2038885264192e-05;-0.00043822632869706;-4.6489811211359e-05;0.00065872096456587;7.6626063673757e-05;-0.0001850454864325;-0.0004370822571218;1.2435109965736e-05;-0.0012534792767838;-0.00017892805044539;-0.00069817242911085;-0.00015590401017107;-0.00055562512716278;-8.5540210420731e-05;-0.00036634979187511;-0.00015230984718073;0.00064941082382575;-1.7962182027986e-05;-3.7353847801569e-06;9.915852569975e-05;0.00067823083372787;-9.2009882791899e-05;9.3247203039937e-05;-3.1883031624602e-05;-9.39660021686e-05;0.0001117329520639;-6.3150582718663e-05;1.4428122995014e-05;-0.00083440885646269;-8.1039121141657e-05;0.00054413999896497;-0.00011998238915112;0.00055462040472776;-0.00030693149892613;7.6186268415768e-05;4.3821837607538e-05;0.00020395156752784;-0.00026215653633699;-0.00013704337470699;0.00010715013195295;-3.5948323784396e-05;-0.00022745921160094;0.00016097388288472;-0.00033292127773166;-1.1041184961869e-06;0.0011471537873149;8.87136120582e-05;-0.0012818073155358;9.7542892035563e-05;-6.3681618485134e-05;-0.00025156248011626;0.00028263582498766;-0.00045335741015151;0.0011945383157581;-0.00017268743249588;-4.6270160964923e-05;0.00018572980479803;-0.0001172112824861;-7.008844113443e-05;0.0003885286860168;-0.00024543635663576;0.0015824718866497;-0.00015849192277528;0.0011404036777094;-0.00013407900405582;-0.00062193314079195;-0.00017964714788832;0.0006197452894412;-0.00023840127687436;0.00044503438402899;0.00015422397700604;0.00026524346321821;-0.0012401683488861;0.00028366921469569;-0.0013790419325233;8.337912731804e-05;-0.00030152138788253;0.00013803591718897;-0.0011876029893756;2.8026128347847e-05;-7.4612435128074e-05;0.00011123282456538;0.00038294278783724;-7.180302782217e-05;0.00088135967962444;-6.86023668095e-06;0.00093958002980798;5.9303129091859e-05;-0.00030917700496502;-1.4774268493056e-05;0.00016269326442853;0.00018363569688518;0.00076643179636449;4.0023278415902e-05;-0.00038001273060217;-0.00010309361823602;0.00050674588419497;1.296603204537e-05;-8.2537473645061e-05;-0.00038007000694051;9.5238101494033e-05;-0.0010784538462758;-9.0691304649226e-05;-0.00083778408588842;-7.7693832281511e-05;-0.00060630589723587;-4.7437151806662e-05;-0.00036552699748427;-0.00010547607234912;0.00046213131281547;-1.3226119335741e-05;-6.6599973251869e-06;6.4146108343266e-05;0.00059155916096643;-9.9834272987209e-05;6.8672066845465e-05;-8.0189711297862e-06;-0.00012617959873751;6.6805820097215e-05;1.848305328167e-05;1.0482832294656e-05;-0.00075556337833405;-7.1841248427518e-05;0.0005128740449436;-9.4993869424798e-05;0.00048673132550903;-0.00024585577193648;2.4825860236888e-05;-2.0049530576216e-05;0.00019522066577338;-0.000253514474025;-8.4523955592886e-05;0.00018594460561872;-9.3795788416173e-06;-0.00017322233179584;0.00012595689622685;-0.000319016398862;-5.8168348004983e-06;0.0010144901461899;8.0391677329317e-05;-0.0011588879860938;8.2976272096857e-05;-4.630414332496e-05;-0.00022334097593557;0.00021763468976133;-0.00040724498103373;0.00095779326511547;-0.00015585254004691;-9.0646026364993e-05;0.00015435034583788;-7.5054282206111e-05;-6.8929010012653e-05;0.00033144882763736;-0.0002377848722972;0.0013454903382808;-0.00014197814743966;0.00094740465283394;-0.00011415426706662;-0.00056557339848951;-0.0001547845749883;0.00054077460663393;-0.00016889451944735;0.00039183083572425;0.00018343483679928;0.00025034870486706;-0.0010343469912186;0.00026401193463244;-0.001111998455599;8.3555860328488e-05;-0.00026633837842382;0.00012873533705715;-0.0010165651328862;8.814808097668e-05;-2.2469686882687e-05;-0.00069158175028861;-5.8366720622871e-05;-0.0011362347286195;0.00010076635953737;-0.00069771846756339;-4.1106875869446e-05;0.00017390293942299;-6.4532105170656e-06;0.00019623659318313;-1.616901727175e-06;-0.0011180967558175;-0.0001656825770624;8.7554864876438e-05;-4.745262049255e-05;0.00010849191312445;-0.00046305253636092;2.9536029614974e-05;0.00065983913373202;-2.1414160073618e-05;0.00084872503066435;-6.540536560351e-05;0.0010798997245729;5.9848400269402e-05;0.00087331974646077;8.3936371083837e-05;-5.0636885134736e-05;5.7596302212914e-05;4.519543654169e-05;9.4292350695468e-05;-8.0064790381584e-05;7.0242590481939e-06;0.00051028322195634;1.0584946721792e-05;0.00023231071827468;-3.4640223020688e-05;-0.00023028344730847;-1.1214973710594e-05;-3.4507422242314e-05;9.1846552095376e-05;-0.00060982286231592;1.2026018339384e-05;0.00043382181320339;-3.8079335354269e-05;0.00074973539449275;-9.3308961368166e-05;-9.5273622719105e-05;1.6651671103318e-05;2.74230769719e-05;-0.00034213092294522;0.00014331932470668;0.00022063912183512;-0.00012762947881129;-0.00026104756398126;-1.100771351048e-05;-0.00043767687748186;9.2044276243541e-05;0.0011292117414996;-2.2303414880298e-05;-0.0013180751120672;7.0144640631042e-05;-8.7252556113526e-05;0.00010135448974324;-5.0489667046349e-05;-0.00020906180725433;0.0010050728451461;-0.00039254379225895;0.0001435264130123;-0.00021275902690832;-4.8877725930652e-05;0.00015909095236566;0.00083181879017502;-9.0065324911848e-05;0.0015158656751737;-0.00023592558864038;0.00062529317801818;-0.00011980266572209;-2.0511159164016e-05;-0.00059727166080847;-0.00023244331532624;2.5122057195404e-05;0.00039909870247357;1.6075193343568e-05;0.0005610347725451;-0.0012015952961519;0.00026039633667096;-0.0011593177914619;0.00024129897064995;-0.00077859679004177;9.7923766588792e-05;-0.00066800566855818;0.00012154773867223;9.2190355644561e-05;-1.0502629265829e-05;-0.00055917934514582;-7.6353251643013e-05;-0.0008959632832557;-1.6254067304544e-05;-0.00060004665283486;-8.8887682068162e-05;0.00018694814934861;2.3404569219565e-05;0.00026270461967215;-3.0360892196768e-05;-0.00067923887399957;-0.00024082908930723;0.00010438127355883;-8.3080762124155e-05;2.9324186471058e-05;-0.0005461351829581;-4.0771821659291e-05;0.00064943550387397;7.4254559876863e-05;0.00080142280785367;6.4449610363226e-05;0.00068233622005209;0.00012989566312172;0.00061933766119182;0.00016171426977962;-0.00016693449288141;9.0947789431084e-05;-6.971949187573e-05;0.00013151035818737;-7.2130627813749e-05;2.2876070033817e-06;0.0005233934498392;3.5301800380694e-05;0.00028280605329201;-1.2090195014025e-05;-0.00022079219343141;-2.9246863050503e-05;-9.6289892098866e-05;0.00010936718172161;-0.00055088975932449;1.2465849067667e-05;0.00040270006866194;-3.4920853067888e-05;0.00076133065158501;-9.1836300271098e-05;-0.00013256110833026;4.719919161289e-05;0.00010600206587696;-0.00031118092010729;0.00013805516937282;0.00012411932402756;-0.00017191030201502;-0.00035280029987916;-3.3890464692377e-05;-0.00040014085243456;9.8864642495755e-05;0.0011000281665474;-1.380923549732e-05;-0.001280052238144;6.0620808653766e-05;-0.00011273636482656;0.00010819017916219;-3.505317181407e-06;-0.00020213361131027;0.0011282170889899;-0.00037429048097692;0.00021081989689264;-0.0002030370378634;-7.2508628363721e-05;0.00015989724488463;0.00087748118676245;-8.4218125266489e-05;0.0015420909039676;-0.00020098366076127;0.00063907325966284;-0.00010675394150894;-2.0055455024703e-05;-0.00055043207248673;-0.00022920097399037;-3.1512819987256e-05;0.00038602290442213;-6.8554450990632e-05;0.00055355537915602;-0.0012982855550945;0.00023850024444982;-0.0012479589786381;0.00021242056391202;-0.00079190463293344;8.4593812061939e-05;-0.00064715108601376;0.0001043605589075;9.7784977697302e-05;-2.6305033316021e-06;-0.00039945024764165;-8.4894032625016e-05;-0.00070475821848959;-0.00010466904495843;-0.00050729903159663;-0.00012428693298716;0.00018319272203371;5.8753394114319e-05;0.0002379804791417;-5.1386072300375e-05;-0.00033338996581733;-0.00030317157506943;0.00012449453060981;-0.00012080201122444;-4.8580059228698e-05;-0.00058144849026576;-9.5769784820732e-05;0.00060986797325313;0.00014879756781738;0.00075630733044818;0.00014779622142669;0.00037474287091754;0.00018248886044603;0.00040776171954349;0.00022964771778788;-0.00019719674310181;0.00011684475612128;-0.0001836340961745;0.0001669056218816;-5.2561994380085e-05;-2.7404114462115e-06;0.00048199613229372;6.3385523390025e-05;0.00030202555353753;1.4617327906308e-05;-0.00015732532483526;-4.0328817703994e-05;-0.00015832491044421;0.00011480900866445;-0.00046015487168916;7.8864904935472e-06;0.00035730536910705;-3.2490694138687e-05;0.00069989514304325;-7.7602941018995e-05;-0.00016392009274568;9.1061177954543e-05;0.0001779755402822;-0.00024632198619656;0.00011541418643901;-8.7822782006697e-06;-0.00021216055029072;-0.00038492379826494;-5.3204374125926e-05;-0.000355988915544;9.4766575784888e-05;0.00099291454534978;2.6227071430185e-06;-0.0011530128540471;4.3169573473278e-05;-0.00011335554881953;0.00010132122406503;3.8377318560379e-05;-0.00017822782683652;0.0011301009217277;-0.00031901162583381;0.00023069081362337;-0.00017562552238815;-8.4568637248594e-05;0.00015127613733057;0.00081102753756568;-6.2025341321714e-05;0.0014593563973904;-0.00014220006414689;0.00063571805367246;-8.5752915765624e-05;-3.3036467357306e-05;-0.00049476802814752;-0.00021409083274193;-6.8057022872381e-05;0.00036311396979727;-0.00010263772128383;0.00050336716230959;-0.0012447520857677;0.00018278913921677;-0.0012322016991675;0.00016142240201589;-0.0007304604514502;5.9299225540599e-05;-0.00062609859742224;7.9010162153281e-05;0.00011955966328969;2.1057855974504e-06;-0.00029047759016976;-9.3788614321966e-05;-0.00061430502682924;-0.00018174218712375;-0.00044374520075507;-0.00016861208132468;0.00017563764413353;0.00010507953265915;0.00022619249648415;-7.5286683568265e-05;-8.0246732977685e-05;-0.00039240100886673;0.00012312490434851;-0.00016926304670051;-0.00013096250768285;-0.00064133387058973;-0.00014178999117576;0.00063963833963498;0.00021591759286821;0.00075764738721773;0.00021765964629594;0.00015181717753876;0.00024424443836324;0.00027265702374279;0.00031494675204158;-0.00026092864573002;0.00015588723181281;-0.00025346226175316;0.00021622990607284;-4.0938808524515e-05;-4.5086544560036e-06;0.00043614814057946;9.4562754384242e-05;0.00034723634598777;5.2666757255793e-05;-0.00010282996663591;-5.1615104894154e-05;-0.0002370727743255;0.00011984301818302;-0.00034516234882176;8.1626490100462e-07;0.00031784767634235;-3.287244180683e-05;0.00069191941292956;-5.8409044868313e-05;-0.00019606629211921;0.0001417820021743;0.00027808756567538;-0.0001806811633287;9.3211281637195e-05;-0.00015806977171451;-0.00027873387443833;-0.00043781273416243;-7.5928757723887e-05;-0.00034249294549227;8.935035293689e-05;0.00092438323190436;2.465778743499e-05;-0.0010918827028945;2.2564754544874e-05;-0.00011947500024689;0.00010174918861594;5.4099589760881e-05;-0.00016381074965466;0.0011764467926696;-0.00027385749854147;0.00027584546478465;-0.00015479787543882;-9.2726317234337e-05;0.00014731007104274;0.00082118919817731;-4.047832408105e-05;0.0014637433923781;-8.1026053521782e-05;0.00063634285470471;-6.2298568082042e-05;-4.8726586101111e-05;-0.00048385775880888;-0.00022284465376288;-8.0444136983715e-05;0.00035965593997389;-0.00013915625459049;0.00049347797175869;-0.0012395493686199;0.00012994799180888;-0.001274767681025;0.00010585590644041;-0.00076329271541908;3.3760235965019e-05;-0.00061156472656876;5.3249590564519e-05;0.0001186348090414;3.9470446608902e-06;-0.00020258115546312;-8.4709048678633e-05;-0.00049223745008931;-0.00019260791304987;-0.00033812073525041;-0.00017014058539644;0.00013782964379061;0.00011884005652973;0.00019532584701665;-7.8875607869122e-05;5.3861305786995e-05;-0.00039134622784331;9.1583722678479e-05;-0.00017295878205914;-0.00015713524771854;-0.00057826546253636;-0.00014098914107308;0.00057817733613774;0.00021546008065343;0.00064395158551633;0.00021796619694214;2.3682147002546e-05;0.00024517998099327;0.00017145022866316;0.00031927932286635;-0.00028046270017512;0.00015952554531395;-0.00022865747450851;0.00021439271222334;-3.0055436582188e-05;-3.5308883070684e-06;0.00033716033794917;9.7500269475859e-05;0.00032980003743432;7.0834052166902e-05;-6.4971762185451e-05;-4.908166374662e-05;-0.00024754571495578;0.00010053734877147;-0.00020985952869523;-3.8802963899798e-06;0.00024491208023392;-2.8065387596143e-05;0.00060001871315762;-3.4129894629586e-05;-0.00018343633564655;0.0001462266955059;0.0003022393793799;-0.00011267545778537;6.8071036366746e-05;-0.00022030329273548;-0.00028204984846525;-0.00041079643415287;-7.8684817708563e-05;-0.00029031102894805;6.978268356761e-05;0.00074744800804183;3.5594148357632e-05;-0.00090534536866471;4.5983892960066e-06;-0.0001083658717107;8.9052380644716e-05;4.4122629333287e-05;-0.0001319962029811;0.001031561056152;-0.00020581053104252;0.00027184054488316;-0.00011947861639783;-8.0284822615795e-05;0.00012182493810542;0.00073332735337317;-2.1813859348185e-05;0.0012617893517017;-2.9906108466093e-05;0.00052562344353646;-3.6398087104317e-05;-4.9591028073337e-05;-0.00041292316745967;-0.00020115172083024;-6.4661275246181e-05;0.00030344520928338;-0.00014410965377465;0.00042342388769612;-0.0010613688500598;7.9065037425607e-05;-0.0011135148815811;5.2676467021229e-05;-0.00070211052661762;1.2633071492019e-05;-0.00049552274867892;2.8622651370824e-05;7.4853465775959e-05;2.9318432552827e-06;-0.00012511425302364;-5.472315751831e-05;-0.00030611149850301;-0.00012515351409093;-0.00021213234867901;-0.0001099280489143;8.5225263319444e-05;7.802701293258e-05;0.00012579538451973;-5.1141814765288e-05;4.362119580037e-05;-0.00025250439648516;6.1496531998273e-05;-0.000112428846478;-0.00010089152056025;-0.00036777989589609;-9.0064175310545e-05;0.00036569108488038;0.00013844776549377;0.00040722650010139;0.00014009744336363;5.8205855566484e-06;0.0001586880243849;0.00010151410970138;0.00020662134920713;-0.00018015172099695;0.00010271740757162;-0.00014940350956749;0.00013875371951144;-1.8442988221068e-05;-2.2459093997895e-06;0.00021434674272314;6.2819359300192e-05;0.00021103853941895;4.68780308438e-05;-4.023670044262e-05;-3.042895514227e-05;-0.00015959139273036;6.3037310610525e-05;-0.00013441893679556;-3.0442156457866e-06;0.00015407441242132;-1.7706706785248e-05;0.00038347125519067;-2.0281881006667e-05;-0.00011763501970563;9.5569514087401e-05;0.00019547902047634;-7.1680638939142e-05;4.284700480639e-05;-0.00014388968702406;-0.0001830492838053;-0.00025998140336014;-5.0775692216121e-05;-0.00018563684716355;4.337316568126e-05;0.00047592748887837;2.4008204491111e-05;-0.00057539169210941;1.5678626823501e-06;-6.875170947751e-05;5.6327287893509e-05;2.8127333280281e-05;-8.3094877481926e-05;0.00065609905868769;-0.00012800845433958;0.00017337310418952;-7.4907402449753e-05;-5.0677645049291e-05;7.6901807915419e-05;0.00046580182970501;-1.2599843103089e-05;0.00080097885802388;-1.5751487808302e-05;0.00033307008561678;-2.1583397028735e-05;-3.1850875529926e-05;-0.00026214352692477;-0.0001280010183109;-4.0894497942645e-05;0.00019210460595787;-9.2136149760336e-05;0.00026826513931155;-0.00067418010439724;4.738775169244e-05;-0.00070760416565463;3.0445069569396e-05;-0.00044629580224864;6.7344531089475e-06;-0.00031371318618767;1.6577792848693e-05;-1.292638535233e-05;-5.7007709983736e-05;0.00011326465028105;0.0001154459969257;0.00014532888599206;0.00029235248803161;9.4875242211856e-05;0.00031157699413598;-4.1313502151752e-05;-0.00013547961134464;6.4087675127666e-05;-9.7796306363307e-05;0.00029984043794684;-6.5871521655936e-05;9.154971485259e-05;-9.2038979346398e-05;5.0403508794261e-05;0.00037486714427359;6.880873843329e-05;-0.00015745335258543;-0.00030027507455088;-0.00010710623610066;-0.00048729358240962;-0.00022942054783925;-6.9957486630301e-06;-0.00021518638823181;-0.00010236988600809;-0.00012731856259052;0.00013741277507506;-0.00013314541138243;0.0002091845672112;-7.7385257100104e-06;7.9954515967984e-06;7.3959461587947e-05;0.00020935171050951;3.5516022762749e-05;0.00014055882638786;-4.5948832848808e-05;-4.0882085158955e-05;7.6456955866888e-05;-0.00017628623754717;2.0460107407416e-05;-0.00020971831690986;-3.4251752367709e-05;0.00013088808918837;-3.7501129554585e-05;0.00038802999188192;-0.0001544697151985;7.7197793871164e-05;0.00020584027515724;7.566979911644e-05;-4.4134732888779e-05;-0.00018411864584778;-0.00012565037468448;-7.8377794125117e-05;-0.00014380013453774;7.7657459769398e-05;-0.00017469127487857;2.041007974185e-05;0.00047611072659492;1.364671607007e-05;-0.00057217996800318;5.621579111903e-05;-5.6819513702067e-05;-9.6021554782055e-05;6.9869318394922e-05;-0.00013065247912891;0.00062283000443131;-4.3858501157956e-05;0.00013969342398923;6.6384855017532e-05;-4.8480618715985e-05;-4.7108987928368e-06;0.00036611393443309;-1.1483833986858e-05;0.0007624858408235;-2.5092787836911e-05;0.00037179575883783;-5.4631866078125e-05;-0.00027080345898867;-0.00012847667676397;0.0002368165878579;-6.1976104916539e-05;0.00022813880059402;-4.5765165850753e-05;5.1715000154218e-05;-0.00062716763932258;2.121858051396e-05;-0.00067772791953757;-6.5337694650225e-06;-0.0003623447555583;2.2882646590006e-05;-0.00036361304228194;-2.0315716028563e-05;-8.502061245963e-05;0.00017028131696861;0.00020689677330665;0.00021523989562411;0.00044272429659031;0.00013737054541707;0.00048498040996492;-4.9149704864249e-05;-0.00021559109154623;9.5999079348985e-05;-0.00017379764176439;0.00043509376700968;-6.7800683609676e-05;0.00012659846106544;-0.00013833757839166;6.4798325183801e-05;0.00057625561021268;0.00010304198076483;-0.00023615850659553;-0.00046112976269796;-0.00016740805585869;-0.00073731073644012;-0.00033617898589;-3.4485346986912e-05;-0.00030885668820702;-0.00017106378800236;-0.0001868260151241;0.00022175922640599;-0.0001895332679851;0.00029792447458021;-1.3175082131056e-05;8.3067925515934e-06;0.00010362934699515;0.00033447900204919;4.2014096834464e-05;0.00020622491138056;-6.7804125137627e-05;-9.7382988315076e-05;0.00011597946286201;-0.00024027482140809;3.2507239666302e-05;-0.0003463510365691;-5.0996590289287e-05;0.00021427482715808;-6.390297494363e-05;0.00061001512221992;-0.00022680246911477;9.3213973741513e-05;0.00028496779850684;0.00012455259275157;-8.50638243719e-05;-0.00025907886447385;-0.00013409725215752;-0.00011134462693008;-0.00022154800535645;0.00011989077029284;-0.00026804077788256;2.3129847249947e-05;0.00075720506720245;2.8065293008694e-05;-0.00091259268810973;8.9720306277741e-05;-9.0685753093567e-05;-0.00015617543249391;0.00010089401621372;-0.00022689205070492;0.00095964991487563;-7.8809847764205e-05;0.00020968103490304;0.00010337747517042;-7.2917900979519e-05;-1.9961567886639e-05;0.00058047857601196;-4.4853077270091e-05;0.0011786639224738;-4.6362369175768e-05;0.00056689232587814;-7.4284704169258e-05;-0.00041456217877567;-0.00019392762624193;0.00036377189098857;-9.7312360594515e-05;0.00036297529004514;-7.5594434747472e-05;0.00010762782767415;-0.00098030280787498;5.7337587350048e-05;-0.0010384074412286;3.2507750802324e-06;-0.00056405103532597;4.3907704821322e-05;-0.00055312813492492;-1.7138379917014e-05;-8.4492050518747e-05;0.00017460789240431;0.00026901092496701;0.00019686073937919;0.00051715795416385;0.00012684303510468;0.00059755326947197;-2.794579086185e-05;-0.00025876975269057;8.9227462012786e-05;-0.00018410549091641;0.00041950051672757;3.7919267924735e-05;0.00011638063006103;-0.00018382622511126;3.9922364521772e-05;0.00062803894979879;0.0001011769491015;-0.00023679282458033;-0.00049245497211814;-0.00016087415860966;-0.00083849369548261;-0.00032273956458084;-0.00012938865984324;-0.00029007942066528;-0.00024603976635262;-0.00017602340085432;0.00017922013648786;-0.00018463960441295;0.00034038361627609;-1.5457701010746e-05;-8.2775258647416e-08;9.9508273706306e-05;0.00042292560101487;1.9585171685321e-05;0.00019459222676232;-6.3701205363031e-05;-0.00014496930816676;0.00012550836254377;-0.00021241730428301;3.3752581657609e-05;-0.00047526857815683;-5.7534056395525e-05;0.00027314879116602;-8.4868406702299e-05;0.00067809852771461;-0.0002389960718574;8.0326135503128e-05;0.00024834999931045;0.00014980489504524;-0.00014411982556339;-0.00024875227245502;-4.9297133955406e-05;-0.00010110693983734;-0.00022316951071844;0.00013543028035201;-0.00029793111025356;1.3234482139524e-05;0.00090578483650461;4.6667122660438e-05;-0.0010690450435504;0.00010104319517268;-9.6776806458365e-05;-0.00018869007180911;0.00012107075599488;-0.00029916415223852;0.0010684566805139;-0.00010848664533114;0.00019518144836184;0.00012201764911879;-8.2963684690185e-05;-4.3014199036406e-05;0.00061923108296469;-0.0001011890853988;0.0013260374544188;-6.9921006797813e-05;0.00067273835884407;-7.6293261372484e-05;-0.00046852737432346;-0.00020332318672445;0.00042117401608266;-0.00012294777843636;0.00041484844405204;-6.4327679865528e-05;0.00016553605382796;-0.0011060123797506;0.000114342685265;-0.0011594946263358;2.9380214982666e-05;-0.00058145169168711;6.5801657910924e-05;-0.00066427607089281;-8.6747795648989e-06;-7.3956041887868e-05;0.00015337638615165;0.00034274908830412;0.00012199292541482;0.00056160398526117;9.2559341283049e-05;0.00065300654387102;2.7008811684937e-06;-0.00026074348716065;6.3221108575817e-05;-0.00018414178339299;0.00033350067678839;0.00022459299361799;8.197679562727e-05;-0.00020274335111026;-1.3120190487825e-05;0.00058714742772281;6.6046981373802e-05;-0.00018201526836492;-0.00047254384844564;-0.00010783808829729;-0.00083322817226872;-0.00024945975746959;-0.00027735787443817;-0.00021539410226978;-0.00033653469290584;-0.00013645012222696;0.00011845542758238;-0.00014724243374076;0.00029851341969334;-1.4590353202948e-05;-1.2052377314831e-05;7.3815615905914e-05;0.00047156188520603;-1.0303509952792e-05;0.0001523742248537;-4.4091328163631e-05;-0.00021554603881668;0.00010988717986038;-0.00013144234253559;3.2523566915188e-05;-0.00056886387756094;-5.6209424656117e-05;0.00030653897556476;-9.4185190391727e-05;0.00069324678042904;-0.00021568896772806;3.6344779800856e-05;0.00016434758435935;0.00016966467956081;-0.00020234324620105;-0.00020217687415425;9.5586801762693e-05;-7.3775452619884e-05;-0.00018963738693856;0.00013031507842243;-0.0003008306666743;-2.3852871890995e-06;0.00097443396225572;6.1898586864118e-05;-0.0011384173994884;0.00010303800809197;-9.268205758417e-05;-0.0002039675891865;0.00011657742288662;-0.00035047176061198;0.0010480460477993;-0.0001310658553848;0.00015859756967984;0.00012585801596288;-7.7202355896588e-05;-6.8141307565384e-05;0.00060751341516152;-0.00015899550635368;0.0013332387898117;-8.8020999100991e-05;0.00068087567342445;-6.6928332671523e-05;-0.00047750241355971;-0.0001929385762196;0.00043172578443773;-0.00012172490096418;0.00043144961819053;-4.3617776100291e-05;0.00021949838264845;-0.0011154860258102;0.00016827737272251;-0.0011398775968701;5.8454072132008e-05;-0.00055573484860361;8.4335464634933e-05;-0.00068312761140987;2.2396811800718e-06;-7.1608723374084e-05;0.00013592201867141;0.00044977338984609;3.3302581869066e-05;0.00066697713918984;6.4115090935957e-05;0.00072763534262776;2.5146757252514e-05;-0.0002547288313508;3.6685429222416e-05;-0.00018794035713654;0.00026602245634422;0.00047689440543763;5.3854957513977e-05;-0.00020882047829218;-7.3306655394845e-05;0.00055191229330376;1.7868465874926e-05;-0.00011470128811197;-0.00048711913404986;-3.6864734283881e-05;-0.00085406407015398;-0.00018266287224833;-0.0004830549005419;-0.00015151989646256;-0.00047577801160514;-0.00010549213038757;7.30067040422e-05;-0.00011789923155447;0.00022420457389671;-1.2339265595074e-05;-2.4021674107644e-05;5.0593196647242e-05;0.00051420461386442;-3.2265001209453e-05;0.00012325015268289;-2.5252486011595e-05;-0.00029214273672551;9.2963484348729e-05;-6.1905673646834e-05;3.2659736461937e-05;-0.00065449869725853;-5.7569999626139e-05;0.00034022890031338;-9.9662967841141e-05;0.00074065662920475;-0.00019645430438686;-5.0275061767024e-06;0.00010142648534384;0.00019312756194267;-0.00025604519760236;-0.00017403853416909;0.00022884801728651;-5.2251773013268e-05;-0.0001569625310367;0.00012547742517199;-0.00032321631442755;-1.4327146345749e-05;0.0010618650121614;7.4705290899146e-05;-0.0012420247076079;0.00010834023123607;-9.004555613501e-05;-0.00022345688194036;9.9958357168362e-05;-0.0004020209016744;0.0010458041215315;-0.0001522101520095;0.00013429766113404;0.00012955503189005;-6.53436727589e-05;-9.088653314393e-05;0.00063218438299373;-0.00021023668523412;0.0013842552434653;-0.00010280647256877;0.00068338500568643;-6.219555507414e-05;-0.00051330646965653;-0.00019801086455118;0.00045442130067386;-0.00010396638390375;0.00046594665036537;-1.8866165191866e-05;0.00027082746964879;-0.0011491429759189;0.00021324072440621;-0.0011427021818236;8.3828330389224e-05;-0.00057971890782937;0.00010156242205994;-0.00070269056595862;1.8732540411293e-05;-7.1330250648316e-05;0.0001049839265761;0.00053390517132357;-8.308095857501e-05;0.0008037265506573;2.6638917915989e-05;0.00077953201252967;4.1089628211921e-05;-0.00022622813412454;4.5052365749143e-07;-0.00012400065315887;0.00018204405205324;0.00079389923484996;2.6416268156026e-05;-0.00019986230472568;-0.00013442126510199;0.00046351237688214;-4.2968527850462e-05;-2.0850407963735e-05;-0.0004758704744745;7.0955029514153e-05;-0.00085138931171969;-9.4144212198444e-05;-0.00075228966306895;-7.6470729254652e-05;-0.00064171495614573;-6.5768028434832e-05;-2.8998052584939e-05;-8.4578357927967e-05;0.0001280800497625;-8.2543792814249e-06;-3.0079287171247e-05;2.8735892556142e-05;0.0004969933652319;-5.0413389544701e-05;8.6057734733913e-05;-5.1718552640523e-06;-0.00030433360370807;6.5980369981844e-05;4.6958411985543e-06;2.7154319468536e-05;-0.00067122845211998;-5.8167326642433e-05;0.00035915934131481;-9.1416084615048e-05;0.00069926702417433;-0.00016480413614772;-3.1484760256717e-05;3.523115083226e-05;0.00019266516028438;-0.00027220568154007;-0.00013391513493843;0.00030361357494257;-2.570928336354e-05;-0.00010441886115586;0.00010944445966743;-0.00033173552947119;-1.8910168364528e-05;0.0010444918880239;7.7912976848893e-05;-0.0012291551101953;0.000100804703834;-7.0990674430504e-05;-0.00022365504992194;7.103067036951e-05;-0.00040835919207893;0.00092857953859493;-0.00015476721455343;6.9692461693194e-05;0.00012131173571106;-3.911396197509e-05;-9.6553711045999e-05;0.00057977106189355;-0.0002348504785914;0.0013197243679315;-0.00010752317029983;0.00064724805997685;-6.0926864534849e-05;-0.00053082371596247;-0.0001915694156196;0.0004522642120719;-6.5358566644136e-05;0.00045643528574146;4.6941790060373e-05;0.00028534411103465;-0.0010547649580985;0.00023118616081774;-0.0010344376787543;9.5774936198723e-05;-0.00054599484428763;0.00010990539158229;-0.00069632497616112;0.00010080285574077;-1.2451634574973e-05;-0.00089645688422024;-5.1058479584754e-05;-0.0010639190440997;7.2006921982393e-05;-0.00053208920871839;-9.1328074631747e-05;0.00014899829693604;-1.276511920878e-05;0.00065271387575194;-3.5849199775839e-05;-0.0010554770706221;-0.00020550336921588;-0.0002064012514893;-2.3527889425168e-05;0.00010097304766532;-0.00049449439393356;6.2566141423304e-05;0.00086907780496404;-5.7772744185058e-05;0.00062375754350796;2.4184957510442e-05;0.00087968667503446;9.9415949080139e-05;0.00094109121710062;0.00010059329360956;-0.00059231469640508;0.00010306955664419;0.00047097454080358;8.1496407801751e-05;-0.00016241399862338;3.1510779081145e-05;0.00036609545350075;-2.7329944714438e-05;0.00028771423967555;2.4051496438915e-05;-0.00040423264726996;-3.0556089768652e-05;-7.4216528446414e-05;0.00010362946341047;-0.00030161085305735;1.393536967953e-05;0.00022931033163331;-2.7485823011375e-05;0.00095321331173182;-8.7317726865876e-05;2.0408850105014e-05;-2.604047585919e-05;0.00012714712647721;-0.00032734399428591;0.00010525141260587;0.0002723035577219;-0.00018258841009811;-0.00032538105733693;-1.5007986803539e-05;-0.00039077154360712;7.9605830251239e-05;0.0011025189887732;-3.094947169302e-05;-0.0013673602370545;6.3910520111676e-05;-0.00015330959286075;0.00014210869267117;-0.0002796740445774;-0.00023970006441232;0.0010491044959053;-0.00042157413554378;0.00035699456930161;-0.00022192893084139;-1.4960468433856e-05;0.00012732383038383;0.0013055565068498;-0.00013318640412763;0.0015740825328976;-0.00025268289027736;0.00031412026146427;-8.3718456153292e-05;7.598650699947e-05;-0.000598301703576;-0.00030063895974308;0.00014603817544412;0.00031379039864987;-0.00014637825370301;0.00068511482095346;-0.0013042276259512;0.00032959366217256;-0.0011716070584953;0.00021509209182113;-0.0012482774909586;0.00012157043965999;-0.00029412019648589;0.00010780936281662;0.00010868762910832;3.5762474226431e-07;-0.00079225836088881;-7.4242423579562e-05;-0.000823104463052;-4.7383953642566e-05;-0.00041833077557385;-0.00013777241110802;0.00015724297554698;1.5451290892088e-05;0.00073290290310979;-6.7299632064532e-05;-0.00062456511659548;-0.00028465208015405;-0.00019003986380994;-5.6928594858618e-05;3.2707230275264e-05;-0.00058006116887555;-1.3270827366796e-05;0.00086431438103318;3.5226905310992e-05;0.00057111645583063;0.0001596916699782;0.00050828536041081;0.00017566680617165;0.00067092524841428;0.0001776053395588;-0.00073481781873852;0.00014063608250581;0.00037623371463269;0.00011767601972679;-0.00014757565804757;2.3656824851059e-05;0.00039039095281623;-3.1830845728109e-06;0.00037005648482591;3.6542118323268e-05;-0.00039989108336158;-4.9702091928339e-05;-0.00011897572403541;0.00011466479918454;-0.00024650798877701;1.6150454030139e-05;0.00024084413598757;-2.5757164621609e-05;0.00097288354299963;-8.3283593994565e-05;-2.5090957933571e-05;-1.2570448234328e-05;0.00019571020675357;-0.00029995103250258;0.00011403098324081;0.00018150026153307;-0.00021136723808013;-0.00045565070468001;-3.6840840039076e-05;-0.00038044422399253;8.7444663222414e-05;0.0010775419650599;-2.2543334125658e-05;-0.0013565010158345;5.4418880608864e-05;-0.000186089266208;0.00015153737331275;-0.00022529039415531;-0.00023393754963763;0.0011770464479923;-0.00040413704118691;0.00041273745591752;-0.00021421468409244;-3.3427746529924e-05;0.00012716701894533;0.0013713384978473;-0.00012783404963557;0.0016033980064094;-0.00021908700000495;0.00032039225334302;-7.1151633164845e-05;7.5991047197022e-05;-0.00055337703088298;-0.00029357286985032;8.8949025666807e-05;0.00030164216877893;-0.00023070370662026;0.00067805155413225;-0.0014278999296948;0.00030933722155169;-0.0012432073708624;0.00018755662313197;-0.0012676037149504;0.00010734814713942;-0.00027332970057614;9.2370857601054e-05;0.0001027731486829;8.105304914352e-06;-0.00052561995107681;-8.4278712165542e-05;-0.0005864446866326;-0.00012478209100664;-0.00033857478410937;-0.00014915197971277;0.00014117208775133;5.1655886636581e-05;0.00053269491763785;-7.7422824688256e-05;-0.00025251795887016;-0.00032128387829289;-6.4046143961605e-05;-9.6728428616188e-05;-4.0880626329454e-05;-0.00056358962319791;-7.1981616201811e-05;0.00070172897540033;0.00011851909948746;0.00054354593157768;0.00020233090617694;0.00022648097365163;0.00021022312284913;0.00038085604319349;0.00023024970141705;-0.00057296780869365;0.00014917555381544;0.00012258246715646;0.00014817697228864;-8.5130159277469e-05;6.9273496592359e-06;0.00036423755227588;3.5669887438416e-05;0.00034660243545659;4.1831517592072e-05;-0.00027373741613701;-5.0253860536031e-05;-0.00015330489259213;0.00010483063670108;-0.00024151435354725;1.3279725862958e-05;0.00024593636044301;-2.1931095034233e-05;0.00080752011854202;-6.2325452745426e-05;-9.4391114544123e-05;2.7223555662204e-05;0.00022076145978644;-0.00021498650312424;0.00010677743557608;4.2844356357818e-05;-0.00021798330999445;-0.0004343337204773;-5.6622317060828e-05;-0.00033762707607821;7.9118610301521e-05;0.00091464660363272;-2.9706011446251e-06;-0.0011435139458627;3.2418211048935e-05;-0.00015617285680491;0.00012213615991641;-0.00010281335562468;-0.00018340493261348;0.0010791390668601;-0.00030896460521035;0.0003431967634242;-0.00016793147369754;-4.9817532271845e-05;0.00011725759395631;0.0010812322143465;-8.1420737842564e-05;0.0013867886736989;-0.00013621189282276;0.00036855475627817;-5.4446205467684e-05;3.0078463169048e-05;-0.00045729163684882;-0.00023902150860522;1.4069575627218e-05;0.00027940003201365;-0.00020343142386992;0.00054447649745271;-0.0012437895638868;0.00020846641564276;-0.0011279463069513;0.00012749736197293;-0.00099417474120855;6.4090723753907e-05;-0.000323756452417;6.4210864366032e-05;0.00014111814380158;1.3040572412137e-05;-0.00040403020102531;-0.00010212642519036;-0.00053091259906068;-0.00021644543448929;-0.00030214368598536;-0.00019477526075207;0.00014380393258762;9.8931544926018e-05;0.00046333065256476;-0.00010732036025729;1.2524960766314e-05;-0.00043874408584088;-2.9342076231842e-05;-0.00015386902668979;-0.00014066754374653;-0.00065707770409063;-0.00013222187408246;0.00074447086080909;0.00021307285351213;0.00060448056319728;0.00027473908266984;3.7913359847153e-05;0.00028966245008633;0.00023220933508128;0.00033489186898805;-0.00061241816729307;0.00020310295803938;5.1183760660933e-06;0.00020968292665202;-5.9328649513191e-05;3.5045849244852e-07;0.00033750626607798;7.7740754932165e-05;0.00041102559771389;7.311789522646e-05;-0.00021708628628403;-6.6724387579598e-05;-0.0002251839323435;0.00010741905134637;-0.00013001481420361;8.2316119005554e-06;0.00025820225710049;-2.1204054064583e-05;0.00081019633216783;-3.8662852603011e-05;-0.00015733472537249;6.1839287809562e-05;0.00032356276642531;-0.00012964378402103;0.0001031395222526;-0.00011398649803596;-0.000278435414657;-0.00054252776317298;-8.7513100879733e-05;-0.00034430567757227;7.6216128945816e-05;0.00086552469292656;2.1728927094955e-05;-0.0011307845124975;6.9348679971881e-06;-0.00016717395919841;0.00012484921899159;-6.1777471273672e-05;-0.00017300325271208;0.0011690799146891;-0.00027043532463722;0.00038337730802596;-0.0001517343625892;-6.4233332523145e-05;0.00012390017218422;0.0011041486868635;-5.2801722631557e-05;0.0014526434242725;-7.1229616878554e-05;0.00041624889126979;-3.8011607102817e-05;2.3573479666084e-06;-0.00046956178266555;-0.00025606839335524;-1.2056182640663e-05;0.0003002435551025;-0.00022877161973156;0.00054713612189516;-0.0012833563378081;0.00014983903383836;-0.0012262186501175;7.5144416769035e-05;-0.0010436882730573;3.1074465368874e-05;-0.00035348665551282;4.3565949454205e-05;0.0001562247343827;1.2329303899605e-05;-0.00029164896113798;-9.6115887572523e-05;-0.00046041564201005;-0.00023243596660905;-0.00023371899442282;-0.00019328469352331;0.00012174521543784;0.00011155485844938;0.00035164970904589;-0.00011128387995996;0.0001404874783475;-0.00045476490049623;-3.0606523068855e-05;-0.00016417805454694;-0.00018670034478419;-0.00061967736110091;-0.0001439995248802;0.00069128745235503;0.00023476095520891;0.00055726018035784;0.00026863007224165;-4.3874406401301e-05;0.0002971630601678;0.00013945023238193;0.00035087033757009;-0.00057711079716682;0.00021440775890369;-2.5056006052182e-05;0.00021705059043597;-3.9131689845817e-05;-1.2529256991911e-06;0.00025224877754226;9.1486443125177e-05;0.00039963365998119;8.6093466961756e-05;-0.00016354197578039;-6.9184614403639e-05;-0.00023412145674229;8.832828461891e-05;9.9534936452983e-06;3.85050816476e-06;0.00022247560264077;-1.6307609257638e-05;0.00070458208210766;-1.2102621440135e-05;-0.00017005212430377;6.2957886257209e-05;0.00035061265225522;-4.1407598473597e-05;8.6643878603354e-05;-0.00019536601030268;-0.00027760601369664;-0.00055629061535001;-9.5769093604758e-05;-0.00029599716071971;5.9689016779885e-05;0.000692029716447;3.4956774470629e-05;-0.00096335622947663;-1.4054468010727e-05;-0.00015610951231793;0.00011266097862972;-4.4072614400648e-05;-0.00014393270248547;0.0010568925645202;-0.00020933987980243;0.0003713640908245;-0.0001200503174914;-5.9922760556219e-05;0.00010945176472887;0.0010049712145701;-2.7976873752777e-05;0.0013036140007898;-1.8252210793435e-05;0.00036134966649115;-2.0257470168872e-05;-1.3201539331931e-05;-0.00042034790385514;-0.00024174319696613;-1.0738934179244e-05;0.00026968159363605;-0.00021664345695172;0.00048541376600042;-0.0011305748485029;9.3484086391982e-05;-0.0011186811607331;2.7102214517072e-05;-0.00098085298668593;4.3127934077347e-06;-0.00029201057623141;2.4410206606262e-05;-3.8760848838137e-05;-0.00011087793973275;0.00020366099488456;0.00032010950963013;0.00027482173754834;0.00038230494828895;0.00017242810281459;0.00034071336267516;-5.0634851504583e-05;-0.00018388846365269;0.00013632359332405;-0.00038396814488806;0.00051144429016858;-0.0001663010334596;0.00011798389459727;6.3161651269183e-06;7.1524540544488e-05;0.00061628757975996;0.00010759373253677;-0.0002571870572865;-0.00057128234766424;-0.00023743894416839;-0.00061480520525947;-0.00041208579204977;6.1491009546444e-05;-0.00035228341585025;-0.00012566898658406;-0.00025106687098742;0.00056616443907842;-0.00018841690325644;5.5498923757114e-05;-1.4227582141757e-05;1.3010770999244e-05;9.2660164227709e-05;0.000254922430031;6.3110084738582e-05;0.00027100383886136;-8.3460872701835e-05;-0.00024401495466009;0.00010164760897169;-0.00022033750428818;5.2625066018663e-05;-0.00019436985894572;-3.735762584256e-05;0.0001820569159463;-4.5208606024971e-05;0.00075888476567343;-0.00021720923541579;-5.3844041758566e-06;0.00034165175748058;0.00016126301488839;-2.6396115572425e-05;-0.00026745969080366;-7.205407746369e-05;-0.00014147102774587;-0.00031639030203223;0.0001103778849938;-0.00028135132743046;1.5744242773508e-05;0.00074456667061895;1.3936552932137e-05;-0.0010107685811818;0.00011369799176464;-0.00013442710042;-0.00016501221398357;2.1352292606025e-05;-0.00023710400273558;0.0010178671218455;-8.0288155004382e-05;0.00033747934503481;9.0871151769534e-05;-5.281659468892e-05;-2.8582722734427e-05;0.00085385981947184;-3.2977084629238e-05;0.0012518919538707;-3.0451030397671e-05;0.00038115057395771;-4.3025236664107e-05;-0.00041513578617014;-0.00023662985768169;0.00032360613113269;-3.7768742913613e-05;0.00043429047218524;-0.00018318129878026;0.00012987064837944;-0.0010986892739311;3.017083145096e-05;-0.0010538791539147;-7.636448572157e-06;-0.00085082097211853;4.0966318920255e-05;-0.00033864905708469;-3.6570425436366e-05;-9.8214099125471e-05;0.00019547452393454;0.00040377082768828;0.00024744585971348;0.00039166887290776;0.00016349910583813;0.00038364093052223;-3.3161726605613e-05;-0.00019785070617218;0.00012843096919823;-0.00046681414823979;0.00046644566464238;-6.8378110881895e-05;9.9939403298777e-05;3.1662248147768e-06;3.1664963898947e-05;0.00062647275626659;9.3360322352964e-05;-0.00022836557764094;-0.00059145531849936;-0.00023883777612355;-0.00061466579791158;-0.00038129708264023;1.1968865692324e-05;-0.0003153336874675;-0.00018236611504108;-0.00022861910110805;0.00058432720834389;-0.0001698310370557;2.0484179913183e-05;-1.4737990568392e-05;-4.6294085223053e-06;7.4850708188023e-05;0.00031868685618974;4.8200923629338e-05;0.00025530977291055;-7.2681774327066e-05;-0.00031593459425494;0.00010629591270117;-0.000185042139492;5.2159044571454e-05;-0.00030926032923162;-4.1227824112866e-05;0.00020032908651046;-6.4669788116589e-05;0.00083374790847301;-0.00019651082402561;-2.2891605112818e-05;0.00029722054023296;0.00017401027434971;-0.0001013266883092;-0.00025544094387442;4.0960159822134e-05;-0.00012321167741902;-0.0002847807481885;0.00011704746430041;-0.00030204278300516;3.6424826248549e-06;0.00086985295638442;3.3199248719029e-05;-0.0011311242124066;0.00012318113294896;-0.0001392305130139;-0.0001892179279821;8.1819653132698e-06;-0.00029673596145585;0.0010693855583668;-0.0001071608348866;0.00033694950980134;9.6893032605294e-05;-5.3035812015878e-05;-5.9053836594103e-05;0.00089841213775799;-8.8788918219507e-05;0.0013199133099988;-4.3526957597351e-05;0.00040336261736229;-2.8472435587901e-05;-0.00043501882464625;-0.00023619095736649;0.00034132259315811;-4.1091741877608e-05;0.00047467619879171;-0.00019646904547699;0.0001903719821712;-0.0011765788076445;7.99483677838e-05;-0.0010954350000247;2.5186584025505e-05;-0.00086920673493296;5.4611733503407e-05;-0.00036718239425682;-2.5013283448061e-05;-7.7252618211787e-05;0.00016147644782905;0.00047279504360631;0.00015811131743249;0.00042380663217045;0.00012875950778835;0.00043347731116228;-7.0863052314962e-06;-0.00019414273265284;9.5331604825333e-05;-0.00048262317432091;0.00035862758522853;0.00013227030285634;6.6041269747075e-05;-5.1742449613812e-06;-2.7021304049413e-05;0.00056469463743269;5.0234128138982e-05;-0.00015323770639952;-0.00056297605624422;-0.00018061947776005;-0.0005844208644703;-0.00028952679713257;-0.00011787160474341;-0.00022922235075384;-0.000287035247311;-0.00017363893857691;0.00050761393504217;-0.00012959945888724;-2.6777563107316e-05;-1.1346492101438e-05;-2.6742556656245e-05;4.6324414142873e-05;0.00036882288986817;2.6411868020659e-05;0.00019872839038726;-4.8993962991517e-05;-0.00037381716538221;9.7429052402731e-05;-0.00012126386718592;4.6991095587146e-05;-0.00042217367445119;-4.1947150748456e-05;0.00020039069931954;-7.9784389527049e-05;0.00084159284597263;-0.00015604423242621;-3.9293106965488e-05;0.00021534340339713;0.00017502266564406;-0.00018146001093555;-0.00022260010882746;0.00017832675075624;-9.0121691755485e-05;-0.0002074485673802;0.00011195539264008;-0.00029587597236969;-1.1571840332181e-05;0.00094208645168692;5.2549661631929e-05;-0.0011714907595888;0.00012223160592839;-0.00012773364142049;-0.00020092169870622;-5.5090031310101e-06;-0.00034300034167245;0.0010258501861244;-0.0001283706369577;0.00030194508144632;9.6925992693286e-05;-4.7078654461075e-05;-8.8904518634081e-05;0.00085721677169204;-0.00014769982954022;0.0012941001914442;-5.7229779486079e-05;0.00040034911944531;-1.6541984223295e-05;-0.00043306063162163;-0.00022055031149648;0.00034207355929539;-3.4788168704836e-05;0.00048291857820004;-0.00017840636428446;0.00024428637698293;-0.0011528950417414;0.00013261653657537;-0.0010526458499953;6.1097744037397e-05;-0.00081468076677993;6.7886547185481e-05;-0.00037948100361973;-1.665944364504e-05;-7.678555266466e-05;0.00014788923726883;0.00064200238557532;8.0132951552514e-05;0.00054053828353062;0.00011705612996593;0.00050369516247883;1.5032999726827e-05;-0.00019849804812111;7.8374789154623e-05;-0.00060008227592334;0.0003104705538135;0.00038803371717222;3.7620549846906e-05;5.1054827054031e-05;-9.0513793111313e-05;0.00056338071590289;-3.3150735134768e-07;-8.0221849202644e-05;-0.00064718123758212;-0.0001383018825436;-0.00059337494894862;-0.00024116814893205;-0.00028626463608816;-0.00017734136781655;-0.00046839661081322;-0.00015439772687387;0.00057670223759487;-0.0001043139709509;-0.00017815157480072;-5.4841107157699e-06;-5.6686061725486e-05;2.011703872995e-05;0.00041729959775694;2.2773496311856e-05;0.00017804489471018;-3.5083976399619e-05;-0.00050538999494165;9.4475763035007e-05;-7.566998101538e-05;5.0276907131774e-05;-0.00051076838281006;-4.4549618905876e-05;0.00019300579151604;-9.4804796390235e-05;0.00097773713059723;-0.00012209532724228;-7.6982127211522e-05;0.00018647604156286;0.00019408046500757;-0.00025549920974299;-0.00022821336460765;0.00033404876012355;-7.5625990575645e-05;-0.00016826530918479;0.00011355827155057;-0.00031954789301381;-2.7089881768916e-05;0.0011005671694875;7.1339585701935e-05;-0.0013520448701456;0.00014177344564814;-0.00013914248847868;-0.00023810093989596;-5.8006022300106e-05;-0.00042724405648187;0.0011009901063517;-0.00016169069567695;0.00034447869984433;0.00010271112114424;-3.6252997233532e-05;-0.00013013336865697;0.00099716824479401;-0.0002157256094506;0.0014418730279431;-6.9624882598873e-05;0.00037847604835406;4.4504085394692e-07;-0.00049340224359185;-0.00025146384723485;0.00037229957524687;1.875514499261e-06;0.00057241815375164;-0.00020282340119593;0.00032911088783294;-0.0012777452357113;0.00018564233323559;-0.0011315291048959;9.9947726994287e-05;-0.00095554336439818;8.5899315308779e-05;-0.00036668113898486;2.3489255909226e-06;-7.616555376444e-05;0.00010777262650663;0.00068845140049234;-3.4940872865263e-05;0.00067106017377228;7.9163546615746e-05;0.00056277314433828;3.1539453630103e-05;-0.00017747428501025;3.89556553273e-05;-0.0005147893098183;0.00022071562125348;0.00067846279125661;1.158626855613e-05;6.5585525589995e-05;-0.00013268877228256;0.00047007919056341;-6.2414088461082e-05;7.2015632213152e-06;-0.00062692334176973;-2.8111491701566e-05;-0.00058987172087654;-0.00014443897816818;-0.00052135466830805;-0.00010227518214379;-0.00064045022008941;-0.00010978836508002;0.00045147989294492;-7.1410227974411e-05;-0.00025407870998606;2.8744409519277e-06;-7.28644663468e-05;8.0367456689601e-08;0.00038252130616456;1.5848314433242e-05;0.00012030398647767;-1.7597394617042e-05;-0.00050413300050423;7.4938900070265e-05;-2.8234640922165e-05;4.1325118218083e-05;-0.00049550161929801;-4.3116233428009e-05;0.00016840243188199;-8.8452739873901e-05;0.00091327709378675;-7.9665805969853e-05;-8.5264786321204e-05;0.00013257273531053;0.0001728858333081;-0.00026127678574994;-0.00019815796986222;0.00038772777770646;-4.97331348015e-05;-9.9957513157278e-05;9.6360941824969e-05;-0.00029405968962237;-3.1047038646648e-05;0.0010559669462964;7.3639625043143e-05;-0.0012896630214527;0.00013231017510407;-0.00011505682050483;-0.00023610737116542;-9.4834176707081e-05;-0.00043120232294314;0.0009730065939948;-0.00016226431762334;0.00029762511258014;9.5529379905201e-05;-1.7453654436395e-05;-0.00013626336294692;0.00092931865947321;-0.00023836262698751;0.0013650172622874;-7.3352966865059e-05;0.00034210862941109;3.2744485451985e-06;-0.00050300598377362;-0.00024795622448437;0.00036485490272753;4.1772200347623e-05;0.00056073593441397;-0.00014266297512222;0.00034174817847088;-0.0011531215859577;0.00020165739988443;-0.0010345875052735;0.00011324893421261;-0.00091868103481829;9.1678310127463e-05;-0.00034897323348559;0.00013355269038584;-1.6311918443535e-05;-0.00095196504844353;-2.6502177206567e-05;-0.00094229413662106;3.2795596780488e-05;-0.0003475109115243;-0.00011880139936693;0.00013779712026007;-2.4890086933738e-05;0.00088766636326909;-5.4250805987976e-05;-0.00090219179401174;-0.00022058268950786;-0.00045070293708704;-1.81886809969e-06;4.596206053975e-05;-0.0004880384367425;6.3968924223445e-05;0.00097526208264753;-6.2137929489836e-05;0.00040676389471628;0.00010302959708497;0.00066710828104988;0.0001142299734056;0.00092275720089674;0.00010756980918813;-0.00095505663193762;0.00013069999113213;0.00076848303433508;6.5409229137003e-05;-0.00024791131727397;6.1991377151571e-05;0.00017024517001119;-5.532397335628e-05;0.00035020057111979;6.6654363763519e-05;-0.00047153289779089;-5.7234403357143e-05;-8.5853593191132e-05;9.4459821411874e-05;0.00016911679995246;-8.6300309476428e-07;5.7777531765169e-05;-2.3294265702134e-05;0.00092718313680962;-6.2798775616102e-05;0.00012937196879648;-5.1447277655825e-05;0.00020743043569382;-0.00023957125085872;3.3297768823104e-05;0.00021038153499831;-0.00018319793161936;-0.00047995030763559;1.7058627577171e-07;-0.00026387927937321;5.8826244639931e-05;0.00085529027273878;-2.6985062504536e-05;-0.0011920671677217;4.9512924306327e-05;-0.00019690090266522;0.00016672028868925;-0.00045708834659308;-0.00024907034821808;0.00095997570315376;-0.00041200206032954;0.00049028382636607;-0.00021145123173483;8.457715921395e-06;9.6591436886229e-05;0.0015858502592891;-0.00015948429063428;0.0014771084534004;-0.00024989462690428;5.4339216148946e-05;-5.2251016313676e-05;0.0001501244987594;-0.00056108355056494;-0.00033541655284353;0.0002423422265565;0.00022331631043926;-0.0002391338639427;0.00072855752659962;-0.0012370464392006;0.00036227778764442;-0.0010778080904856;0.00018039428687189;-0.0015347499866039;0.00013287866022438;2.3115300791687e-05;9.1047884779982e-05;0.00014749781985302;-8.9022687461693e-06;-0.0008962110732682;-4.2950025090249e-05;-0.00077084882650524;-5.55611186428e-05;-0.00024300812219735;-0.00014951103366911;0.00014201986778062;-8.1865700849448e-06;0.00094855879433453;-7.7052347478457e-05;-0.00058680295478553;-0.00027483410667628;-0.00045460392720997;-2.1519452275243e-05;-8.174583285836e-07;-0.00054946239106357;1.8776718206936e-06;0.00097921409178525;3.2291588922817e-06;0.00035746092908084;0.00020822502847295;0.00041958040674217;0.00016900271293707;0.00071609544102103;0.00015860339044593;-0.001084198243916;0.00015877321129665;0.00072703137993813;8.7299958977383e-05;-0.00023511196195614;5.4254804126685e-05;0.00018108589574695;-3.9174396079034e-05;0.00043902301695198;6.838718400104e-05;-0.00046806261525489;-7.5185344030615e-05;-0.00010647213639459;9.8707037977874e-05;0.00023935559147503;1.9056797100347e-06;9.0294000983704e-05;-2.3460290321964e-05;0.000932784343604;-5.8284429542255e-05;9.735650382936e-05;-5.5418364354409e-05;0.00025075211306103;-0.00021440369891934;4.3465122871567e-05;0.00013916727039032;-0.0001862996869022;-0.00061583024216816;-1.3287165529619e-05;-0.0002662071492523;6.5593478211667e-05;0.00081139249959961;-2.1606678274111e-05;-0.0011780429631472;4.3322605051799e-05;-0.00022902700584382;0.00017650723748375;-0.00041478528873995;-0.00024550026864745;0.0010506114922464;-0.0003995438455604;0.00052644748939201;-0.00020618805137929;-8.4138491729391e-07;9.3693917733617e-05;0.0016555138863623;-0.00015839397383388;0.00148805975914;-0.00022812868701294;4.2082607251359e-05;-4.2617572034942e-05;0.00015366174920928;-0.00052076898282394;-0.00032570603070781;0.00019931310089305;0.00020878366194665;-0.0003062583564315;0.00072054768679664;-0.0013431062689051;0.00035166533780284;-0.0011080999393016;0.00016141320520546;-0.0015559461899102;0.00012353979400359;5.2333438361529e-05;8.0737663665786e-05;0.00013199931709096;1.5407515093102e-05;-0.00032430712599307;-8.2382437540218e-05;-0.00035188681795262;-0.00019886720110662;-0.00013347748608794;-0.00016150920419022;9.6066680271178e-05;7.3933915700763e-05;0.00041615532245487;-0.00010262583236909;0.00011898712546099;-0.00037164066452533;-0.00010490293061594;-0.00011357173934812;-0.00013741006841883;-0.00051108445040882;-0.00011345803795848;0.00061190192354843;0.00018011065549217;0.00038392981514335;0.00024766501155682;-4.7086214181036e-05;0.00025365399778821;0.00011800076026702;0.00027615111321211;-0.00063598877750337;0.00018809591711033;0.00011719512258423;0.00016094480815809;-4.2728999687824e-05;-6.2320779647962e-08;0.00017326258239336;5.9728314226959e-05;0.00035541137913242;6.6936205257662e-05;-0.00019560482178349;-6.5240354160778e-05;-0.00016687158495188;7.0037182013039e-05;8.1511905591469e-05;9.2309974206728e-06;0.00017428120190743;-8.6795389506733e-06;0.00062557350611314;-9.4535052994615e-06;-0.00011265642388025;8.9559378579906e-08;0.00028001907048747;-2.5695808290038e-05;7.9320125223603e-05;-0.00010825642675627;-0.00020158903498668;-0.00050843687495217;-7.7078402682673e-05;-0.00024411777849309;4.7750316298334e-05;0.00055392173817381;1.9834766135318e-05;-0.00081980583490804;-1.0631128134264e-05;-0.00015315938799176;0.00010460020712344;-8.8300017523579e-05;-0.00012859462003689;0.00086700241081417;-0.00018662707589101;0.00034147690166719;-0.00010482891957508;-3.5939203371527e-05;8.0935766163748e-05;0.00096347025828436;-3.7165998946875e-05;0.0010706786997616;-3.2290477975039e-05;0.00020417013729457;-1.3753313396592e-05;2.119314558513e-05;-0.00033565543708391;-0.00020795030286536;1.6335623513442e-05;0.00019351385708433;-0.00021596951410174;0.00042508766637184;-0.00097342004301026;0.00010586247663014;-0.00089078961173072;2.8084084988222e-05;-0.00092040083836764;1.1668268598442e-05;-0.00013376244169194;2.45275641646e-05;0.000206414348213;1.5302626707125e-05;-0.00029351864941418;-9.7661322797649e-05;-0.00043159551569261;-0.00026523807900958;-0.00011579111014726;-0.00019974399765488;0.00010437540186103;0.00010288217890775;0.00035341089824215;-0.00013478302571457;0.0002575125254225;-0.00050239090342075;-0.00013788178330287;-0.00015464487660211;-0.00024226952518802;-0.00062460830667987;-0.00015681864169892;0.00074721500277519;0.00026356853777543;0.00047519046347588;0.00029420570353977;-8.417600474786e-05;0.00033187793451361;7.9845456639305e-05;0.00037272475310601;-0.00076348654692993;0.0002615028352011;0.00012394900841173;0.00021463065058924;-3.0462468203041e-05;-1.9849551335938e-06;0.00011806580732809;9.4697643362451e-05;0.00044891922152601;9.7929056209978e-05;-0.00020143415895291;-9.1144684120081e-05;-0.00021493813255802;6.5356121922377e-05;0.00030650428379886;9.379976290802e-06;0.00019827963842545;-3.3275355235673e-06;0.00068878923775628;2.1445692254929e-05;-0.00016728171613067;-1.7559374100529e-05;0.00039219076279551;8.8380416855216e-05;9.1431567852851e-05;-0.00022587565763388;-0.00025071809068322;-0.00070982449688017;-0.00011256491416134;-0.00025812067906372;4.2522286094027e-05;0.00050323037430644;3.8875281461515e-05;-0.00088058033725247;-4.0180126234191e-05;-0.00018975549028255;0.00012454154784791;-9.3990638561081e-05;-0.00013639082317241;0.00099440908525139;-0.00017996248789132;0.00043614895548671;-0.0001015729867504;-4.1564362618374e-05;9.253213647753e-05;0.0011570903006941;-1.9048115063924e-05;0.0012437723344192;1.5946963685565e-05;0.00020175785175525;-2.4098758331093e-06;5.4381607696996e-06;-0.00039235196891241;-0.00026500900276005;2.7386666261009e-05;0.00022566829284187;-0.00025764986639842;0.00049314193893224;-0.0010879916371778;7.5835501775146e-05;-0.0010513509623706;-1.4728640053363e-05;-0.0011603103484958;-1.7695625501801e-05;-9.7111696959473e-05;1.5224903108901e-05;0.00019255978986621;1.5116055692488e-05;-0.0001816737203626;-8.300127228722e-05;-0.00034999995841645;-0.00022782335872762;-5.3445404773811e-05;-0.00016337139823008;7.3924478783738e-05;8.934974175645e-05;0.00020896358182654;-0.00012133072596043;0.00029208321939223;-0.00045079962001182;-0.00012864636664744;-0.00013337665586732;-0.00023893159232102;-0.00050462590297684;-0.00013798256986775;0.0006117076263763;0.00023755939037073;0.00038280955050141;0.00023041357053444;-9.405383025296e-05;0.0002939986588899;1.9393235561438e-05;0.00032740036840551;-0.00064208102412522;0.00024305602710228;0.00010586843563942;0.00018693966558203;-4.2935739656969e-06;-1.8937186041512e-06;3.3142605389003e-05;9.0893721790053e-05;0.0003720392123796;9.1213085397612e-05;-0.00015017414989416;-8.1367492384743e-05;-0.00017854676116258;3.5199460398871e-05;0.00038167941966094;8.1976077126455e-06;0.00015289896691684;5.4626311793982e-06;0.00052282039541751;4.4891210563947e-05;-0.00016312158550136;-3.801483035204e-05;0.00035629514604807;0.00016033358406276;8.1115875218529e-05;-0.00023673886607867;-0.00020936501096003;-0.00063692661933601;-0.00010829673556145;-0.00018597577582113;2.0976005544071e-05;0.00030008051544428;4.1925864934456e-05;-0.00064804189605638;-5.6408302043565e-05;-0.00016065457020886;9.9622768175323e-05;-6.7062690504827e-05;-9.5458482974209e-05;0.00077874638373032;-0.00010846288205357;0.00037558149779215;-6.3149207562674e-05;-3.0206234441721e-05;7.0107722422108e-05;0.00095101917395368;6.8749718593608e-06;0.00098200235515833;5.8745958085638e-05;0.00012174638686702;1.0104703505931e-05;-8.4633602455142e-06;-0.0003094649000559;-0.00022682192502543;3.0936458642827e-05;0.00017367668624502;-0.00021317413484212;0.00038803095230833;-0.00084050465375185;1.9429007807048e-05;-0.00083718390669674;-5.2997515012976e-05;-0.00098841183353215;-4.2874915379798e-05;-2.320416024304e-05;1.4702711723658e-06;0.00013974602916278;1.1100564734079e-05;-9.1992682428099e-05;-5.8335175708635e-05;-0.00024549127556384;-0.00015435602108482;-3.0540235457011e-05;-0.00011060209362768;4.624238863471e-05;6.4973763073795e-05;9.8357806564309e-05;-8.5682855569758e-05;0.00022948211699259;-0.00032787723466754;-8.4469094872475e-05;-9.6391020633746e-05;-0.00018001678108703;-0.00034172009327449;-9.6664050943218e-05;0.00041576428338885;0.00016993071767502;0.00027169534587301;0.00014476179785561;-7.444471702911e-05;0.00020978628890589;-1.2386310572765e-06;0.00023439021606464;-0.00042871621553786;0.0001785261410987;5.7826167903841e-05;0.00013595455675386;6.214972017915e-06;1.1052531334599e-07;7.1189033405972e-06;6.9740410253871e-05;0.00025113293668255;6.8404289777391e-05;-9.324515121989e-05;-5.6366421631537e-05;-0.00012669102579821;1.5456471373909e-05;0.00030076215625741;5.2537070587277e-06;0.00010102330270456;7.1349813879351e-06;0.00034181901719421;4.326917041908e-05;-0.00012888036144432;-2.8189813747304e-05;0.00026281308964826;0.00014257778821047;6.0285419749562e-05;-0.00018781590915751;-0.00015379143587779;-0.00045160556328483;-8.2398822996765e-05;-0.00011753162834793;8.2333763202769e-06;0.00016926199896261;3.4315478842473e-05;-0.00041847722604871;-4.9934649723582e-05;-0.00010959425708279;6.5809028455988e-05;-3.3748561691027e-05;-5.6772685638862e-05;0.00052500917809084;-5.5346958106384e-05;0.0002633819822222;-3.3936543331947e-05;-2.0923152987962e-05;4.7483354137512e-05;0.00063857680652291;1.7227792341146e-05;0.00066715001594275;6.4496896811761e-05;7.8660712460987e-05;1.2053282262059e-05;-1.713244637358e-05;-0.00021265419491101;-0.00016104518726934;2.3376032913802e-05;0.00012017264089081;-0.00014255828864407;0.00025925843510777;-0.00055533315753564;-1.0455006304255e-05;-0.00057559134438634;-5.6611519539729e-05;-0.00068468059180304;-4.4464966777014e-05;-7.3120299930451e-06;-4.4952653297514e-06;-3.7994075682946e-05;-0.00010070020653075;0.00015791920304764;0.00015133581473492;0.00020572952053044;0.00023599142150488;0.00011989877384622;9.2965259682387e-05;-3.9548031054437e-05;-8.0679441452958e-05;0.00010634839418344;-0.00019046977104153;0.00040623178938404;-0.00023432014859281;7.6198899478186e-05;8.6631087469868e-05;8.830212027533e-05;0.00036719162017107;7.670635386603e-05;-0.00019498310575727;-0.00037263424019329;-0.00014405520050786;-0.00033061159774661;-0.00032076955540106;8.3162514783908e-05;-0.00026802174397744;-1.0829755410668e-05;-0.0002205076161772;0.0004811747930944;-0.00012827775208279;-6.1385362641886e-05;-6.1794453358743e-06;4.5790671720169e-05;6.9817106123082e-05;2.7413232601248e-05;5.7803634263109e-05;0.00020279108139221;-7.1192429459188e-05;-0.00015006192552391;3.5697470593732e-05;-0.00014049917808734;5.1932689530076e-05;0.00012285057164263;-2.3934335331433e-06;8.8764238171279e-05;1.5189114492387e-05;0.00042986922198907;-0.00017051314353012;-6.6871391027234e-05;0.00028180959634483;0.00012682098895311;0.00013638789823744;-0.00016611142200418;-0.00012855244858656;-0.00013294414384291;-0.0003011611988768;4.840240944759e-05;-0.00014165302854963;1.3774926628685e-05;0.00026570321642794;-2.9425526008708e-05;-0.00051325932145119;6.8606976128649e-05;-0.00010312565427739;-6.9996734964661e-05;6.3674760895083e-06;-7.2783484938554e-05;0.00058441812871024;-1.1233642908337e-05;0.00027255521854386;4.3243002437521e-05;-1.9302449800307e-05;2.5293162252638e-05;0.00061540037859231;6.2258535763249e-05;0.00073646329110488;4.3843348862538e-07;0.00010499322524993;-3.5344524803804e-05;-0.00023102952400222;-0.00017467050929554;0.00015748091391288;1.0348871910537e-05;0.00025093505973928;-0.00014218395517673;8.9965133156511e-06;-0.00064688624115661;-6.2132690800354e-05;-0.00060780078638345;-6.5549924329389e-05;-0.00066559948027134;1.4126820133242e-05;-5.4286421800498e-05;-5.2492774557322e-05;-0.00014151458162814;0.00021860899869353;0.0002608182549011;0.00030016936943866;0.00032468905556016;0.00017395788745489;0.00013992922322359;-5.2084484195802e-05;-0.0001245967723662;0.00015397985407617;-0.00033490598434582;0.00055845570750535;-0.00030897776014172;0.00010469434346305;0.00013286758621689;0.00011641088349279;0.00054391700541601;0.00011243519111304;-0.00027498620329425;-0.00055410637287423;-0.00023156673705671;-0.0004618285165634;-0.00044846581295133;0.00011951152555412;-0.00037229483132251;-3.0785300623393e-05;-0.00030271435389295;0.00071897747693583;-0.00017616355034988;-0.0001119382577599;-1.2090854397684e-05;5.1334325689822e-05;9.2756279627793e-05;6.2285536841955e-05;7.8246906923596e-05;0.00029611884383485;-0.00010016546002589;-0.00024292786838487;6.0419788496802e-05;-0.00019331405928824;6.9946116127539e-05;0.00013265501183923;-9.4460156105924e-06;0.00013133829634171;7.2683815233177e-06;0.00065281166462228;-0.00022268705652095;-9.5521420007572e-05;0.00038406625390053;0.00017335533630103;0.00015405561134685;-0.00023031495220494;-0.00014145074237604;-0.00017585480236448;-0.00042184034828097;7.5867930718232e-05;-0.00021474219101947;1.5972671462805e-05;0.00043847068445757;-2.8243784981896e-05;-0.00078837003093213;0.00010554178152233;-0.00015081858146004;-0.00011670835374389;-8.6312747953343e-06;-0.00014079106040299;0.00086352613288909;-3.3963089663303e-05;0.00039387532160617;6.4079838921316e-05;-2.8582233426278e-05;1.3416481124295e-05;0.00091202580370009;5.2571562264347e-05;0.0010797429131344;-4.5174101614975e-06;0.00015712407184765;-3.7104924558662e-05;-0.00033663440262899;-0.00024652830325067;0.00023091389448382;1.3175978892832e-05;0.00038302582106553;-0.00021938927238807;5.2386014431249e-05;-0.00096266571199521;-5.7392549933866e-05;-0.00088519143173471;-6.7518383730203e-05;-0.00096317392308265;2.4979855879792e-05;-8.6774467490613e-05;-5.5096174037317e-05;-0.00015288974100258;0.00024169860989787;0.00037352342042141;0.00034336763201281;0.00037332173087634;0.00020384923845995;0.00021360194659792;-5.4170304792933e-05;-0.00016655391664244;0.0001748428621795;-0.00048272332060151;0.00061118393205106;-0.00029255368281156;0.00011785772221629;0.00014019818627276;0.00010889761324506;0.00066483061527833;0.00012887828052044;-0.00030399742536247;-0.00067290419247001;-0.00029543219716288;-0.00055158801842481;-0.00049881206359714;0.00012914583203383;-0.00041223267908208;-7.8120450780261e-05;-0.00032507290598005;0.00084400631021708;-0.00019823474576697;-0.00012882218288723;-1.6245283404714e-05;3.2186901080422e-05;9.7849100711755e-05;0.00014623334573116;8.3254773926456e-05;0.00034393364330754;-0.00010931991710095;-0.00032268007635139;8.8250693806913e-05;-0.00021967792417854;7.3131486715283e-05;2.8363467208692e-05;-2.3615821191925e-05;0.00016540854994673;-1.9001614418812e-05;0.00083199050277472;-0.00023227406200022;-9.0873574663419e-05;0.00041629327461123;0.000191563682165;8.6878557340242e-05;-0.00027099554426968;-9.4142778834794e-05;-0.00018078104767483;-0.00045369067811407;0.00010257805115543;-0.00027758054784499;1.3658401257999e-05;0.00065054919105023;-8.0930494732456e-06;-0.0010331517551094;0.00013305003813002;-0.00017584138549864;-0.00016472871357109;-2.578945714049e-05;-0.00022602347598877;0.0010697263060138;-6.972296978347e-05;0.00045228403178044;8.2489990745671e-05;-3.9014448702801e-05;-1.9963868908235e-05;0.0010870258556679;1.7762997686077e-06;0.0013248332543299;-1.6142817912623e-05;0.00023559181136079;-2.8976441171835e-05;-0.00041708268690854;-0.00028171471785754;0.00029462721431628;5.7083980209427e-06;0.00048548218910582;-0.00026648459606804;0.00012320197129156;-0.0011941068805754;-1.3222587767814e-05;-0.001084303483367;-3.6182107578497e-05;-0.001111575984396;3.7709854950663e-05;-0.00016263063298538;-4.3809071939904e-05;-0.00010470702545717;0.00018725571862888;0.00038295541889966;0.00026538962265477;0.00028260939870961;0.00016423097986262;0.00019755300309043;-3.3704629458953e-05;-0.00014745898079127;0.00013942054647487;-0.00050744879990816;0.00045613097609021;-0.00017639478028286;8.4011684521101e-05;0.00011635636474239;4.9743070121622e-05;0.00055259541841224;9.7769239800982e-05;-0.00021814205683768;-0.00056698865955696;-0.00026060867821798;-0.00042954820673913;-0.00038351758848876;0.00010279152047588;-0.00030617497395724;-9.7868440207094e-05;-0.00024133069382515;0.00072108634049073;-0.00014777008618694;-0.00013442663475871;-1.3475802916219e-05;4.3887148422073e-06;6.3458537624683e-05;0.00018359400564805;5.8396835811436e-05;0.00027089010109194;-7.8721823228989e-05;-0.00031702016713098;8.1682934251148e-05;-0.00016023512580432;5.5064989282982e-05;-0.00010062393266708;-2.6240639272146e-05;0.0001434447185602;-3.6780904338229e-05;0.00074800226138905;-0.00016248636529781;-7.1856069553178e-05;0.00030236504971981;0.0001568227307871;-1.3401664546109e-05;-0.00021762479445897;1.3464072253555e-05;-0.00012630660785362;-0.00032564712455496;9.1537433036137e-05;-0.00024892046349123;3.3954668197111e-06;0.00065633963095024;1.3230269360065e-05;-0.00094673625426367;0.00011632023233688;-0.00014554853260051;-0.00015641424397472;-3.8261550798779e-05;-0.0002349541609874;0.00092170760035515;-8.2361126260366e-05;0.00036545793409459;7.1216883952729e-05;-3.3309392165393e-05;-4.6447290515061e-05;0.00091727339895442;-4.921298022964e-05;0.0011283239582554;-2.1613546778099e-05;0.00021623987413477;-6.2438653003483e-06;-0.00035284511977807;-0.00022258500393946;0.00025135936448351;4.3526031845431e-07;0.00042808649595827;-0.00023503134434577;0.00015488492499571;-0.0010433300631121;3.3693639124976e-05;-0.00091395375784487;4.7229318624886e-06;-0.0009006267064251;3.8852249417687e-05;-0.00016583601245657;-1.8233629816677e-05;-7.7372395026032e-05;0.00012030048674205;0.0006547478842549;8.318687469e-05;0.00041914588655345;0.00012062054884154;0.00029899764922448;1.7368465705658e-05;-0.00014950810873415;8.3897335571237e-05;-0.00071971805300564;0.00027400074759498;0.00031553322332911;1.4723887943546e-05;0.00022405140043702;-7.8760553151369e-05;0.00047445140080526;-7.3525670813979e-06;-3.9878090319689e-05;-0.00064837647369131;-0.00016824444173835;-0.00035537901567295;-0.00022221737890504;-0.00016695277008694;-0.00015112473920453;-0.00043080354225822;-0.00015242811059579;0.00076373375486583;-7.4025563662872e-05;-0.00040438413270749;5.4587308113696e-06;-8.0198871728498e-05;-8.987400406113e-07;0.00026683780015446;4.797115616384e-05;0.00018379004905;-3.9885544538265e-05;-0.00052146305097267;7.6539799920283e-05;-6.1439852288458e-05;4.385001011542e-05;-0.00027097316342406;-3.2512980396859e-05;7.7050928666722e-05;-7.2832364821807e-05;0.00089461012976244;-4.7156045184238e-05;-0.00010183927224716;0.00020009363652207;0.00014251891116146;-0.00018989178352058;-0.0002040037070401;0.00030959813739173;-6.5418957092334e-05;-0.00018289330182597;8.5809537267778e-05;-0.00023627100745216;-2.7583480914473e-05;0.00088809069711715;5.7477489463054e-05;-0.0011444349074736;0.00013971446605865;-0.00014394562458619;-0.00021318544168025;-0.00015105087368283;-0.00038057268830016;0.00093769642990083;-0.00014429232396651;0.00040025071939453;7.3445662565064e-05;-1.4517652743962e-05;-0.0001361792528769;0.0010475498856977;-0.00019436443108134;0.0012410508934408;-4.3308009480825e-05;0.00015451469516847;3.8891601434443e-05;-0.00041342689655721;-0.00024378446687479;0.00027012338978238;7.0414011133835e-05;0.00054577714763582;-0.00025988134439103;0.00031899695750326;-0.0011272445553914;0.00014839450886939;-0.00093945028493181;9.8493095720187e-05;-0.0010212747147307;6.6989654442295e-05;-0.00012582453200594;3.4860397590819e-06;-9.5593117293902e-05;8.323719521286e-05;0.00072507990989834;-9.8225891633774e-06;0.00057238584849983;0.00010077251499752;0.00037339437403716;3.2991109037539e-05;-0.00014548056060448;5.2723156841239e-05;-0.00069083640119061;0.00022053497377783;0.00059824512572959;-5.3850417316426e-06;0.00028450603713281;-9.4922485004645e-05;0.00042706466047093;-7.0636233431287e-05;2.650356873346e-05;-0.00069408549461514;-8.0290847108699e-05;-0.00036908985930495;-0.00014842655218672;-0.00036853851634078;-0.00010368051880505;-0.00064227799884975;-0.00012735735799652;0.00072623981395736;-5.2317886002129e-05;-0.00052842276636511;2.3715458155493e-05;-0.00012406866881065;-1.9475637600408e-05;0.00021004051086493;6.198604387464e-05;0.00014467949222308;-3.4574452001834e-05;-0.00055880937725306;6.7230765125714e-05;-3.8130194297992e-05;3.1911487894831e-05;-0.00017095662769862;-3.3127649658127e-05;8.7047355918912e-06;-6.8020774051547e-05;0.00088444200810045;9.2202753876336e-06;-0.00010626890434651;0.00019372512178961;0.00010582988761598;-0.00018121888570022;-0.00020233486429788;0.00034739510738291;-4.5199172745924e-05;-0.00015497756248806;7.2616545367055e-05;-0.00019110295397695;-2.9839920898667e-05;0.00086143106454983;6.0048667364754e-05;-0.0011248715454713;0.00014400602958631;-0.00013055268209428;-0.00023009117285255;-0.00023709950619377;-0.00041221917490475;0.00086297997040674;-0.00015351975162048;0.00041913910536095;7.18522205716e-05;4.4756500727772e-08;-0.00015457982954103;0.0010933812009171;-0.00022763741435483;0.0012570907128975;-4.6285706048366e-05;0.00010223685239907;5.2034156396985e-05;-0.00046139289042912;-0.00027452342328615;0.00027666584355757;0.00013920328638051;0.00058968557277694;-0.0002277793828398;0.00035767868394032;-0.0010522836819291;0.0001675711828284;-0.00092525436775759;0.00011975628876826;-0.0011222179746255;7.4479838076513e-05;-7.2368769906461e-05;0.00018828990869224;-3.5521494282875e-05;-0.00084837363101542;1.1051808542106e-05;-0.00079461274435744;-8.7486459960928e-06;-0.00017910933820531;-0.00012260484800208;0.00012530462117866;-3.148862379021e-05;0.00084531959146261;-5.1958893891424e-05;-0.00068658799864352;-0.00021251876023598;-0.00058266805717722;7.9715337051312e-06;-5.1609527872643e-05;-0.00044609056203626;4.3286250729579e-05;0.00096108234720305;-2.8338297852315e-05;0.00023785265511833;0.00014844567340333;0.0004923643427901;9.9878023320343e-05;0.00081118883099407;0.00011098230606876;-0.0010768306674436;0.00013758809654973;0.00088495603995398;5.1500090194168e-05;-0.00031658640364185;8.9911089162342e-05;-3.5526016290532e-05;-6.990393740125e-05;0.00042585039045662;8.7064450781327e-05;-0.00043915025889874;-8.6100219050422e-05;-7.6612224802375e-05;6.9730078394059e-05;0.00070166139630601;-2.5077617465286e-05;-5.1051574700978e-05;-2.5339657440782e-05;0.00073248479748145;-2.6918607545667e-05;0.00021083407045808;-6.15670796833e-05;0.00026063935365528;-0.00010955097241094;-4.8116555262823e-05;6.1706021369901e-05;-0.00013896054588258;-0.00069246551720425;2.6457035346539e-05;-0.00011210191587452;3.5915116313845e-05;0.00045774641330354;-1.27338735183e-05;-0.00086237012874335;3.0132854590192e-05;-0.00021275211474858;0.00017215525440406;-0.00055848073679954;-0.00023447805142496;0.00075333943823352;-0.0003634589666035;0.00053557852515951;-0.00018039101269096;2.1851494238945e-05;6.786102312617e-05;0.0016430865507573;-0.00016441736079287;0.0012405668385327;-0.00022373514366336;-0.00013851170660928;-2.6484825866646e-05;0.00019030798284803;-0.00048692608834244;-0.00033497135154903;0.00030044405139051;0.00013840204337612;-0.00025786046171561;0.00068705162266269;-0.0010098301572725;0.00035143157583661;-0.00089170364663005;0.00013708129699808;-0.0016172759933397;0.00012876125401817;0.00026221227017231;7.1146481786855e-05;0.00024953106185421;-4.6181357902242e-05;-0.00090309564257041;1.2983296073799e-05;-0.00082488456973806;-6.269286677707e-05;-0.00012949308438692;-0.00015044794417918;0.00014148589980323;-2.6067482394865e-05;0.00090505467960611;-6.5639163949527e-05;-0.0005896519869566;-0.00026848731795326;-0.00066520448308438;-3.551258259904e-06;-0.00011303341307212;-0.00053719111019745;5.3403055062518e-06;0.0010891634738073;1.9485667507979e-05;0.00024879531702027;0.00022243839339353;0.00046118797035888;0.00013393926201388;0.00078924436820671;0.00015549267118331;-0.0012665814720094;0.00017108919564635;0.0009774649515748;6.9506670115516e-05;-0.00035179455881007;9.6129886514973e-05;-7.2146474849433e-05;-6.6565931774676e-05;0.00056016480084509;9.6704352472443e-05;-0.00047553336480632;-0.00011520554107847;-9.1855268692598e-05;7.5732430559583e-05;0.0009347710874863;-2.825536284945e-05;-2.7802117983811e-05;-3.0454037187155e-05;0.00078819965710863;-2.137210140063e-05;0.00022384918702301;-8.1140395195689e-05;0.0003223585372325;-7.5939700764138e-05;-5.7726821978576e-05;-6.4224914240185e-06;-0.00013957214832772;-0.00092153844889253;2.4341255993932e-05;-0.00011800544598373;4.2938474507537e-05;0.00040920858737081;-8.7239031927311e-06;-0.00091219844762236;2.7854326617671e-05;-0.0002608405193314;0.00020048121223226;-0.00060810806462541;-0.00025944065419026;0.00085978326387703;-0.00039507605833933;0.00061996042495593;-0.00019450741820037;2.1805604774272e-05;7.2009985160548e-05;0.0018886470934376;-0.00018360567628406;0.0013673176290467;-0.00023545212752651;-0.00018280785297975;-2.3029755539028e-05;0.00021589065727312;-0.00051567319314927;-0.00037117753527127;0.00031641466193832;0.00014178964192979;-0.00031951849814504;0.00075817841570824;-0.00115386035759;0.00038561070687138;-0.00098958401940763;0.00013871649571229;-0.0018415770027786;0.00013770649093203;0.00033678949694149;7.3157003498636e-05;0.00023123057326302;3.0366475129995e-06;-0.00020103936549276;-6.8061162892263e-05;-0.0003891047090292;-0.00022845872445032;-3.0245686502894e-05;-0.00015596170851495;7.8517434303649e-05;7.5843985541724e-05;0.00015825733134989;-0.000113240283099;0.00026024479302578;-0.0004280811699573;-0.00018003326840699;-0.00011939935939154;-0.00026548840105534;-0.00050834886496887;-0.00014074573118705;0.00064233900047839;0.0002474706270732;0.00036667165113613;0.00023622535809409;-1.767446337908e-05;0.00027223932556808;4.6746550651733e-05;0.00031171753653325;-0.00066970445914194;0.00023655670520384;0.0001787807996152;0.0001697090046946;-1.8124164853361e-05;-4.1356329347764e-06;-2.6668294594856e-05;8.5350395238493e-05;0.00040258531225845;8.5385559941642e-05;-0.00016246277664322;-9.4275354058482e-05;-0.00015866251487751;3.5525641578715e-05;0.00053550320444629;1.1174536666658e-05;0.00014893272600602;4.5472261263058e-06;0.00049131450941786;4.1864292143146e-05;-0.00013433292042464;-6.8349356297404e-05;0.00034688459709287;0.00019310445350129;6.5071537392214e-05;-0.00023829533893149;-0.00017109898908529;-0.000721791817341;-0.00010183693666477;-0.00016079070337582;2.3154741938924e-05;0.00020331292762421;3.3669246477075e-05;-0.00059748103376478;-4.9075053539127e-05;-0.00017444958211854;0.00010882989590755;-9.7852964245249e-05;-0.00010300055873813;0.00072806078242138;-0.00012671845615841;0.00039269548142329;-6.5860687755048e-05;-2.3589647753397e-05;6.5446307417005e-05;0.0010117479832843;-9.7843239927897e-06;0.0009487914503552;3.4420656447764e-05;6.0435970226536e-05;6.0187639974174e-06;7.6867972893524e-06;-0.0002945490705315;-0.00023298674204852;4.2636533180485e-05;0.00015883895684965;-0.00021897602709942;0.00039564675535075;-0.00080333510413766;4.8107420298038e-05;-0.00079673045547679;-3.7334659282351e-05;-0.0010561639210209;-2.8526144888019e-05;5.1886854635086e-05;8.6077043306432e-06;0.0002263805072289;1.3842761291016e-05;-0.00017121055861935;-8.1911479355767e-05;-0.00037466554204002;-0.00024146478972398;-1.3980303265271e-05;-0.00016166786372196;7.2664508479647e-05;8.3765189629048e-05;0.00015007788897492;-0.0001282259618165;0.00032715045381337;-0.00046816718531772;-0.00017140195996035;-0.00012891154619865;-0.00027464685263112;-0.00051239744061604;-0.0001497789635323;0.00063762732315809;0.00025947514222935;0.00037465139757842;0.00023625408357475;-6.1929524235893e-05;0.00030349922599271;5.3834905884287e-06;0.00033545642509125;-0.00068895873846486;0.00026198054547422;0.00015703188546468;0.00018407787138131;6.0046791077184e-06;-5.3207768360153e-06;-3.7395846447907e-05;9.5447903731838e-05;0.00039734443998896;9.2488298832905e-05;-0.00015404484292958;-9.4889306637924e-05;-0.00016858270100784;2.6936098947772e-05;0.00053402065532282;1.2680458894465e-05;0.00015536593855359;1.1032201655325e-05;0.00049442250747234;5.8066718338523e-05;-0.00016624429554213;-7.9161240137182e-05;0.00037063329364173;0.00023436968331225;8.2207887317054e-05;-0.00026123493444175;-0.0001862142526079;-0.0007243596483022;-0.00011654439003905;-0.00016513072478119;1.5459228961845e-05;0.00019374047406018;4.1296509152744e-05;-0.00059655215591192;-6.5841908508446e-05;-0.00017696364375297;0.00010543104144745;-7.8259159636218e-05;-9.3021764769219e-05;0.00075236841803417;-9.9843833595514e-05;0.00040148250991479;-5.5264670663746e-05;-2.4063654564088e-05;6.5183114202227e-05;0.0010156104108319;1.0440096048114e-05;0.00096515938639641;6.9516878284048e-05;6.3725616200827e-05;1.3519080312108e-05;-2.7223136385146e-06;-0.00029599020490423;-0.00023820954083931;3.8499085349031e-05;0.00015900746802799;-0.00022574598551728;0.00038983579725027;-0.00082467508036643;1.4116964848654e-05;-0.00081572192721069;-6.6102649725508e-05;-0.0010670628398657;-5.1981598517159e-05;5.0400598411215e-05;1.3323348184713e-06;0.00016261819109786;1.4298938367574e-05;-0.000100044249848;-6.5331965743098e-05;-0.0002696865121834;-0.00017609546193853;-8.8556425907882e-06;-0.00011877329234267;4.9361518904334e-05;6.5671738411766e-05;9.053176472662e-05;-9.8409538622946e-05;0.00026860274374485;-0.00036224999348633;-0.00011393096065149;-9.9729084467981e-05;-0.0002061675186269;-0.00037130084820092;-0.0001108378128265;0.00045776451588608;0.00019320780120324;0.00028300800477155;0.00016279869305436;-6.6841399529949e-05;0.00023420156503562;-1.3398012015386e-05;0.00025600369554013;-0.00049561529885978;0.00020347734971438;9.2617621703539e-05;0.00014310343249235;1.5332228940679e-05;-2.3391291961161e-06;-2.745896927081e-05;7.560288941022e-05;0.00028237543301657;7.2311871917918e-05;-0.00010546814155532;-6.7832617787644e-05;-0.00012913129467051;1.3323584425962e-05;0.0003877020208165;9.1795955086127e-06;0.00011378250201233;1.1555371202121e-05;0.00035821393248625;5.2491039241431e-05;-0.00014069037570152;-5.7347566325916e-05;0.00028572781593539;0.0001903888041852;6.9173423980828e-05;-0.000206341050216;-0.00014953032950871;-0.00052618619520217;-9.315661736764e-05;-0.00011951243504882;6.2872204580344e-06;0.00013557018246502;3.522133192746e-05;-0.00043086704681627;-5.8377463574288e-05;-0.00012773249181919;7.3698836786207e-05;-4.2104093154194e-05;-6.0365542594809e-05;0.00055606849491596;-5.536636672332e-05;0.00029579020338133;-3.2863132219063e-05;-1.860714655777e-05;4.8093330406118e-05;0.00072731147520244;2.0755449440912e-05;0.00071115238824859;7.3648618126754e-05;5.341216456145e-05;1.4128033399174e-05;-1.2073792277079e-05;-0.00021911021030974;-0.00017781568749342;2.6549263566267e-05;0.00011898802040378;-0.00016256794333458;0.00027926193433814;-0.00060090300394222;-1.2704845175904e-05;-0.00060698657762259;-6.6573578806128e-05;-0.00077679607784376;-5.2981355111115e-05;3.0444536605501e-05;-3.7508491459448e-06;-4.9531627155375e-05;-0.00012197860633023;0.0001870267878985;0.00017311127157882;0.00024768913863227;0.00026531482581049;0.0001375414285576;6.8790905061178e-05;-4.1261799196946e-05;-8.7659354903735e-05;0.00012869561032858;-0.00021478242706507;0.0004720609576907;-0.00029156132950447;8.0983736552298e-05;0.0001297992275795;0.00010996570199495;0.00041735504055396;9.4351460575126e-05;-0.00023389796842821;-0.0004303932946641;-0.00017378600023221;-0.00035415156162344;-0.00037616252666339;9.2886315542273e-05;-0.00030926073668525;2.3573834369017e-06;-0.00026427546981722;0.00059246568707749;-0.00014003437536303;-0.00011165840987815;-8.9471068349667e-06;6.3738356402609e-05;7.6979435107205e-05;-9.4506622190238e-06;6.3535073422827e-05;0.00023984380823094;-8.6874104454182e-05;-0.00017860329535324;3.6031269701198e-05;-0.00014979987463448;6.4744184783194e-05;0.00020053240587004;3.3351475394738e-06;0.00010298559209332;2.3630222131032e-05;0.00047773582627997;-0.00019548037380446;-0.00010851045954041;0.00032145690056495;0.00015296848141588;0.00019425062055234;-0.00017097526870202;-0.00014572707004845;-0.00015716027701274;-0.00037349306512624;5.0949452997884e-05;-0.00015325329150073;1.1665253623505e-05;0.00025157936033793;-3.8285175833153e-05;-0.00055940134916455;7.9447432653978e-05;-0.00012534367851913;-7.5851457950193e-05;1.0191560022577e-06;-7.734327664366e-05;0.00065515382448211;-8.8968727141037e-06;0.00032710176310502;4.5730645069852e-05;-1.7622083760216e-05;3.296271461295e-05;0.00073781586252153;7.631956395926e-05;0.00082869600737467;1.4461213595496e-06;7.9448996984866e-05;-3.3704436646076e-05;-0.00024807435693219;-0.00020275021961424;0.00016285190940835;1.5279498256859e-05;0.00028576818294823;-0.00017793658480514;7.7060631156201e-06;-0.00073922815499827;-7.7500255429186e-05;-0.00067456485703588;-8.2255945017096e-05;-0.00079804164124653;1.7963229765883e-05;-1.5597235687892e-05;-6.0070313338656e-05;-0.0001751324016368;0.00024106497585308;0.00026577420067042;0.00033435848308727;0.00036452349741012;0.00018471543444321;9.7680655017029e-05;-5.0921600632137e-05;-0.00012608809629455;0.00016913405852392;-0.00031500656041317;0.00061369565082714;-0.00036153881228529;0.00010509428830119;0.00019318393606227;0.00015103194164112;0.00057853496400639;0.0001291870867135;-0.00031555874738842;-0.00060589564964175;-0.00024959931033663;-0.00047291020746343;-0.00049027526983991;0.00010829939856194;-0.00040524668293074;-2.1027530237916e-05;-0.00034238272928633;0.00081976084038615;-0.00018203860963695;-0.00018234695016872;-1.534399780212e-05;7.1148358983919e-05;0.00010116539488081;-7.4165359364997e-06;8.3284256106708e-05;0.00033486293978058;-0.00011841716332128;-0.00026296876603737;5.5023861932568e-05;-0.0001942854578374;8.3504382928368e-05;0.00027895986568183;-1.3687467799173e-06;0.00013666116865352;2.0521994883893e-05;0.00066262320615351;-0.00024263546220027;-0.00014517806994263;0.00042293907608837;0.00019177247304469;0.00023889934527688;-0.00022237055236474;-0.00017392472364008;-0.00019990878354292;-0.00051699939649552;7.4435542046558e-05;-0.00020656039123423;1.2091283679183e-05;0.00035805199877359;-3.9246238884516e-05;-0.00077932089334354;0.00011550096678548;-0.00017377287440468;-0.00011555357195903;-1.5388384781545e-05;-0.00013767885684501;0.00089391536312178;-2.638011937961e-05;0.0004513111198321;6.3187471823767e-05;-2.4096461856971e-05;2.1011144781369e-05;0.0010263463482261;7.0472829975188e-05;0.001133649260737;-2.2283495582087e-06;0.00010036845196737;-3.6671168345492e-05;-0.00033942543086596;-0.00027437441167422;0.00022452579287346;2.389676956227e-05;0.00040785773308016;-0.00025308268959634;4.6914101403672e-05;-0.0010122554376721;-7.7615492045879e-05;-0.00091791310114786;-8.6087697127368e-05;-0.0011020095553249;2.7973845135421e-05;-1.2397485079418e-05;-4.7310648369603e-05;-0.00017400727665517;0.00021333477343433;0.00029945306596346;0.00031357698026113;0.00034981122007594;0.00017514303908683;0.00010485546954442;-4.2851872422034e-05;-0.00012992719712202;0.00015445148164872;-0.0003481657768134;0.00055298081133515;-0.00029820288182236;9.4877374067437e-05;0.00020085628784727;0.00013920007040724;0.00056640314869583;0.00012213706213515;-0.00029149913461879;-0.00060549704357982;-0.00025492766872048;-0.0004416917799972;-0.00044311420060694;8.7265085312538e-05;-0.00036870749318041;-5.3094830946065e-05;-0.00030647151288576;0.00080378784332424;-0.0001651260536164;-0.00020753827993758;-1.6040919945226e-05;4.3529427784961e-05;9.0272558736615e-05;1.3042314094491e-05;7.6983713370282e-05;0.00033120869193226;-0.00011196079867659;-0.00027940815198235;6.0687649238389e-05;-0.0001762559695635;7.3050119681284e-05;0.00025255640503019;-9.8326900115353e-06;0.00012691126903519;4.878771960648e-06;0.00066066510044038;-0.00020234849944245;-0.00013011536793783;0.00038774686981924;0.00016444936045446;0.00018405867740512;-0.00020612048683688;-0.00013236301310826;-0.00017290317919105;-0.00049761519767344;7.7923024946358e-05;-0.00020001259690616;8.5648152889917e-06;0.00038487478741445;-2.192094871134e-05;-0.00078450568253174;0.00011964776058448;-0.00016892777057365;-0.00012852385407314;-3.8708549254807e-05;-0.00017289342940785;0.00086975540034473;-4.4249110942474e-05;0.00043789800838567;6.2583174440078e-05;-2.3958806195878e-05;-8.6105292211869e-06;0.0010119684739038;2.6177434847341e-05;0.0011042907135561;-7.062776148814e-06;9.7003954579122e-05;-2.3067217625794e-05;-0.00033428127062507;-0.00026100984541699;0.00022268219618127;2.8290060072322e-05;0.00041718641296029;-0.00025449504028074;9.0501009253785e-05;-0.0009894137037918;-3.9774102333467e-05;-0.00088882970158011;-5.065642108093e-05;-0.0010708441259339;3.087826189585e-05;-1.3556617886934e-05;2.204202064604e-05;-0.00012728844012599;3.3496915420983e-05;0.00057507824385539;6.4347150328103e-06;0.00044612353667617;9.041273733601e-05;0.00019687892927323;3.2248557545245e-05;-0.00010859593021451;3.7644967960659e-05;-0.00058226025430486;0.00017832941375673;0.00046182100777514;-1.3591840797744e-05;0.00038638219120912;-7.9198898674804e-06;0.00032209261553362;-6.2217368395068e-05;1.2365958355076e-05;-0.00061581557383761;-8.3010607340839e-05;-0.00018383853603154;-0.00010297724656994;-0.00024798724916764;-8.927865565056e-05;-0.00055475771659985;-0.00011279182945145;0.00073155929567292;-3.1367653718917e-05;-0.00060921226395294;4.7270281356759e-05;-0.00016622206021566;-2.7660425985232e-05;7.589099368488e-06;7.8966186265461e-05;0.00017561459389981;-5.302604768076e-05;-0.00045787403360009;4.3295796785969e-05;-3.0496743420372e-05;3.9679880501353e-06;0.00026029421132989;-2.6826430257643e-05;-9.8046395578422e-05;-3.1949708500179e-05;0.00062175921630114;8.280456677312e-05;-9.3728165666107e-05;0.00021220713097136;1.1295841432002e-05;-5.0576716603246e-05;-0.00014504727732856;0.00018153223209083;-1.7394882888766e-05;-0.0002707717649173;4.1303308535134e-05;-4.924808308715e-05;-1.5481531590922e-05;0.00045459001557902;3.6253029975342e-05;-0.00072439323412254;0.0001287969207624;-0.00011484249989735;-0.00018913771782536;-0.00031529943225905;-0.00032848195405677;0.00058057747082785;-0.00011842793901451;0.00042316617327742;4.629752584151e-05;1.0117359124706e-05;-0.0001416391460225;0.001008759601973;-0.0001837995077949;0.00094024935970083;-2.2912834538147e-05;-7.8493321780115e-05;7.4325776949991e-05;-0.00036797628854401;-0.00025409483350813;0.00017502855916973;0.00020036014029756;0.000507207645569;-0.00021324939734768;0.0003083088377025;-0.00072552554775029;0.00011690201063175;-0.00067552091786638;0.00010548487625783;-0.0010887420503423;5.197201971896e-05;0.0001405890652677;0.00020956281514373;-5.2466850320343e-05;-0.00058323313714936;4.0560036723036e-05;-0.00061588949756697;-2.0952043996658e-05;-8.4364568465389e-05;-9.0642526629381e-05;9.4053692009766e-05;-2.6478661311558e-05;0.00051663449266925;-2.79145915556e-05;-0.00047320112935267;-0.00016027166566346;-0.00050257908878848;5.4443448789243e-06;-0.00012296235945541;-0.00033369421726093;2.2911457563168e-05;0.00075053243199363;1.2604458788701e-05;0.0001499745703768;0.00011620702571236;0.00039134512189776;5.3288156777853e-05;0.00060494482750073;9.2096983280499e-05;-0.00083391088992357;0.00010792226385092;0.00072428782004863;3.6190598621033e-05;-0.00029577792156488;8.8657150627114e-05;-0.00015297440404538;-6.0459737142082e-05;0.0004036009486299;7.5393014412839e-05;-0.00031004432821646;-8.8898385001812e-05;-5.0622744311113e-05;3.8532220060006e-05;0.00091686943778768;-3.7194939068286e-05;-7.6381300459616e-05;-2.4882112484192e-05;0.00044334895210341;1.7364343420923e-06;0.0002111160865752;-5.3321207815316e-05;0.0002359753852943;-1.9397586470404e-07;-8.879979577614e-05;-6.2860708567314e-05;-7.3633731517475e-05;-0.00072169315535575;4.0127662941813e-05;-5.61207480132e-06;1.6716401660233e-05;0.0001003524303087;1.0090341220348e-06;-0.00048285696539097;1.2772334230249e-05;-0.00017229930381291;0.00013882524217479;-0.00049659784417599;-0.00017864984693006;0.00045210207463242;-0.00026303910999559;0.00043757417006418;-0.00012449141649995;2.2903604985913e-05;4.2234376451233e-05;0.0013101606164128;-0.00013106064579915;0.00085115240653977;-0.00016410909302067;-0.00019775042892434;-1.1372502740414e-05;0.00016469502588734;-0.00035648513585329;-0.00027069624047726;0.00027243816293776;7.5069765443914e-05;-0.00018578574236017;0.00051912170602009;-0.00063201104057953;0.00027020229026675;-0.0006055535050109;8.8101471192203e-05;-0.001325688441284;9.9389668321237e-05;0.00032334509887733;4.8274614528054e-05;0.00034109340049326;-8.2176833529957e-05;-0.00071904453216121;5.6341930758208e-05;-0.00078053871402517;-8.8167740614153e-05;-1.946279189724e-05;-0.00012758238881361;0.00012434719246812;-2.4793171178317e-05;0.00056957261404023;-4.1765419155126e-05;-0.00041860854253173;-0.00024397156084888;-0.00067950430093333;-7.3783680818451e-06;-0.00023367407266051;-0.00048705565859564;-3.3028576581273e-05;0.0010122110834345;8.1030790170189e-05;0.00019963797240052;0.00021580756583717;0.00047892963630147;9.118826710619e-05;0.00065367505885661;0.00015493499813601;-0.0011532505741343;0.0001613291533431;0.00093982095131651;6.0082584241172e-05;-0.00037034851266071;0.00010261528223054;-0.00025307692703791;-5.9088193665957e-05;0.00064968346850947;9.3571368779521e-05;-0.00037666183197871;-0.00014353031292558;-6.7927256168332e-05;4.5468405005522e-05;0.0014034712221473;-4.4295818952378e-05;-4.0774848457659e-05;-3.5314737033332e-05;0.00052727002184838;1.4228869986255e-05;0.00025463729980402;-9.6203526481986e-05;0.00034288779716007;7.4399635195732e-05;-0.0001186551671708;-0.00018721677770372;-6.2906277889851e-05;-0.0011535392841324;4.1966592107201e-05;-6.2978297137306e-06;2.6560732294456e-05;-2.1959720470477e-05;7.042302058835e-06;-0.00055576430168003;9.7582933449303e-06;-0.00026330025866628;0.00019490593695082;-0.00061346899019554;-0.00023097659868654;0.00062979478389025;-0.00033250651904382;0.00059799395967275;-0.00015450503269676;2.940719241451e-05;4.9301506805932e-05;0.0018013382796198;-0.00017323900829069;0.0010989781003445;-0.00019827448704746;-0.00029927142895758;-7.1088657023211e-06;0.00021765036217403;-0.00042410739115439;-0.00034756649984047;0.0003217846096959;8.2696329627652e-05;-0.00029057360370643;0.00066593498922884;-0.00089316972298548;0.00034728652099147;-0.00078021181980148;9.8663971584756e-05;-0.0017862159293145;0.00012264111137483;0.00047960481606424;5.6513737945352e-05;0.0002485906588845;-1.988950134546e-05;-0.00013518064224627;-2.6515470381128e-05;-0.00038213763036765;-0.00016758272249717;1.6190726455534e-05;-9.9305048934184e-05;5.9475958551047e-05;4.3505842768354e-05;-5.6518198107369e-05;-6.9963381974958e-05;0.0001731013180688;-0.00030027085449547;-0.00019815620908048;-7.72120183683e-05;-0.00026145638548769;-0.00037896746653132;-0.00011825266119558;0.00051676807925105;0.00021039889543317;0.00027843110729009;0.00016566789417993;0.00013168666919228;0.00017247023060918;5.8487836213317e-05;0.00021870684577152;-0.00049586466047913;0.00017404672689736;0.00020904172561131;0.00011070229811594;-1.8958122382173e-05;-8.9241375462734e-06;-0.00013605167623609;6.7555491114035e-05;0.00035210294299759;6.1633872974198e-05;-0.00011371141590644;-9.1306115791667e-05;-9.4763316155877e-05;1.6626616343274e-05;0.00068228109739721;1.2634343875106e-05;0.00010831077815965;3.9640576687816e-06;0.000281111424556;4.0826733311405e-05;-7.5729840318672e-05;-9.4119852292351e-05;0.00026512538897805;0.00023618675186299;2.3017148123472e-05;-0.00022724915470462;-7.7268319728319e-05;-0.00069143943255767;-7.5217903940938e-05;-7.0127156504896e-05;1.3957750525151e-05;-5.267384040053e-05;2.0177039914415e-05;-0.00032085136626847;-3.7119785702089e-05;-0.00015237340994645;9.2772323114332e-05;-9.783935820451e-05;-7.8543576819357e-05;0.00046224167454056;-9.9572956969496e-05;0.00032179986010306;-4.1893959860317e-05;-8.0628451541997e-06;4.0520430047764e-05;0.00083202449604869;-1.9831431927742e-05;0.00065125362016261;1.5470692233066e-05;-4.8025918658823e-05;4.7084204197745e-06;1.7630009097047e-05;-0.00019170236191712;-0.00018608703976497;4.3766402086476e-05;9.6416544693056e-05;-0.00016898915055208;0.00029376204474829;-0.00053287803893909;5.302357749315e-05;-0.00053290696814656;-2.6764850190375e-05;-0.00088908826000988;-1.4724048924109e-05;0.00015389728650916;9.996751032304e-06;0.00018374342471361;5.863440946996e-06;-0.00012487215280998;-5.2726489229826e-05;-0.00029087663278915;-0.0001753094693413;1.9482456991682e-05;-0.00010694019874791;5.1119048293913e-05;5.1089122280246e-05;5.5104253988247e-05;-8.9357155957259e-05;0.00023128313478082;-0.00032065485720523;-0.000154274966917;-8.2309612480458e-05;-0.00021124370687176;-0.00035845040110871;-0.00011465344869066;0.00045951188076288;0.00019256572704762;0.0002536162501201;0.00017073701019399;1.4367466064868e-05;0.00020696216961369;2.4029636733758e-06;0.00022854130656924;-0.00050380028551444;0.00018562696641311;0.00015447686018888;0.0001189758622786;1.0612635378493e-05;-9.2605368990917e-06;-8.3428778452799e-05;6.6627966589294e-05;0.00029998685931787;6.0785187088186e-05;-0.00010691914212657;-7.6744130637962e-05;-0.00010452677088324;1.5692136003054e-05;0.00047911395085976;1.3205437426222e-05;0.00011421513045207;9.5436162155238e-06;0.00031274883076549;4.4001626520185e-05;-0.00010644602298271;-8.7339052697644e-05;0.00025481771444902;0.00021032380755059;5.160910950508e-05;-0.00019381409219932;-9.873193630483e-05;-0.00056617049267516;-8.207160863094e-05;-9.9763798061758e-05;9.455105100642e-06;5.1605806220323e-05;2.4711973310332e-05;-0.0003677967179101;-4.6043835027376e-05;-0.00013673008652404;7.8801196650602e-05;-6.6942637204193e-05;-6.6416112531442e-05;0.0005011735484004;-7.108339923434e-05;0.00029246974736452;-3.5988978197565e-05;-1.1091815395048e-05;4.036487734993e-05;0.00076102843740955;2.3532259092462e-06;0.00065098208142444;4.2717849282781e-05;-1.6908588804654e-06;9.5502491603838e-06;1.0066130016639e-05;-0.00018782836559694;-0.00016821373719722;2.8053009373252e-05;9.4716539024375e-05;-0.00016853056149557;0.00027005220181309;-0.00057132431538776;1.9022929336643e-05;-0.00053824210772291;-4.501236253418e-05;-0.00079121522139758;-3.4141310607083e-05;8.949484617915e-05;3.6050075777894e-06;0.00012598291505128;9.0097692009294e-06;-7.7784541645087e-05;-4.4957734644413e-05;-0.0002037671074504;-0.00012957608851139;6.3959478211473e-06;-8.2395388744771e-05;3.6008037568536e-05;4.2803032556549e-05;4.8663052439224e-05;-7.03649566276e-05;0.00018933447427116;-0.00025330780772492;-9.7438176453579e-05;-6.6723478084896e-05;-0.00015352301124949;-0.00026566939777695;-8.3251812611707e-05;0.00033277986221947;0.00014248625666369;0.0001963464601431;0.00012091679673176;-2.0786565073649e-05;0.00016436328587588;-8.7662547230138e-06;0.00017886316345539;-0.0003659643989522;0.00014524468861055;8.8705353846308e-05;9.6373660198878e-05;1.3436590961646e-05;-4.5353094719758e-06;-4.4130360038253e-05;5.2690953452839e-05;0.00021110406669322;4.8793976020534e-05;-7.6651638664771e-05;-5.3112114983378e-05;-8.5276078607421e-05;9.4182087195804e-06;0.00031831196974963;8.8102278823499e-06;8.4424391388893e-05;8.921000699047e-06;0.00024342490360141;3.7248653825372e-05;-9.4088318292052e-05;-5.6561082601547e-05;0.00019881434855051;0.00015351861657109;4.6852150262566e-05;-0.00014741141058039;-9.0355722932145e-05;-0.00039959044079296;-6.5831358369906e-05;-7.9718272900209e-05;4.6566701712436e-06;6.3981271523517e-05;2.2206577341422e-05;-0.00028917510644533;-4.0177368646255e-05;-9.7094183729496e-05;5.5167693062685e-05;-3.7152007280383e-05;-4.4875087041873e-05;0.00038619141560048;-4.2608771764208e-05;0.00021559155720752;-2.3387643523165e-05;-1.0582995855657e-05;3.2022708182922e-05;0.0005439100204967;1.116654220823e-05;0.00049713358748704;4.6571618440794e-05;1.7377600670443e-05;9.2243162725936e-06;-1.4561221632903e-06;-0.00014714829740115;-0.00012693171447609;1.8776481738314e-05;7.7018157753628e-05;-0.00012125655484851;0.00019877628074028;-0.0004287100455258;-1.7912403791343e-06;-0.00041797733865678;-4.4107022404205e-05;-0.00057406508130953;-3.5011460568057e-05;4.5695465814788e-05;-4.6787104679424e-07;-4.3097174057039e-05;-0.00010485381790204;0.00015184620860964;0.00014113711949904;0.00020777179452125;0.00021316020865925;0.00010919682972599;2.7645242880681e-05;-2.9212460503913e-05;-6.825101445429e-05;0.00010738318815129;-0.00016605862765573;0.00037650627200492;-0.00024342391407117;5.9357495047152e-05;0.00012913103273604;9.6561612735968e-05;0.00033361359965056;8.210232044803e-05;-0.00019642537517939;-0.00034939224133268;-0.0001483084197389;-0.00026614335365593;-0.00030315993353724;6.3154446252156e-05;-0.00024619314353913;8.5591918832506e-06;-0.00021671480499208;0.00050243682926521;-0.00010496938193683;-0.00012335969950072;-1.0103619388246e-05;5.8547131629894e-05;5.8961864851881e-05;-4.1643852455309e-05;4.7555415221723e-05;0.00019964612147305;-7.4010102252942e-05;-0.00014679618470836;2.6661411538953e-05;-0.00011021256068489;5.4869498853805e-05;0.00020884834520984;6.0109309742984e-06;8.4687264461536e-05;2.132961708412e-05;0.00036807396099903;-0.00015234416059684;-0.00011143027222715;0.00025201935204677;0.00012447826156858;0.00018328578153159;-0.00011765240924433;-0.00011409951548558;-0.00012633572623599;-0.00032254250254482;3.8344827771652e-05;-0.00011544348672032;5.5819477893237e-06;0.00015923609316815;-3.1494029826717e-05;-0.00042402939288877;6.5360312873963e-05;-0.00010611524339765;-5.9806785429828e-05;-6.3748143475095e-06;-6.3060098909773e-05;0.00051401293603703;-6.7426281020744e-06;0.0002730313281063;3.3938878914341e-05;-1.0936204489553e-05;2.5353558157803e-05;0.00061869743512943;5.8281806559535e-05;0.0006523021729663;8.5494878021564e-07;3.2989206374623e-05;-1.9664654246299e-05;-0.00018487976922188;-0.00016318977577612;0.00011709791579051;1.3507420590031e-05;0.00022969147539698;-0.00015556652215309;1.0727881999628e-05;-0.00059192610206082;-6.1118524172343e-05;-0.00052276923088357;-6.6303786297794e-05;-0.00066616153344512;1.6525762475794e-05;2.2242593331612e-05;-4.5392986066872e-05;-0.00016571118612774;0.00018828832253348;0.00018967401410919;0.0002651639515534;0.00032089094747789;0.00013801347813569;4.5297998440219e-05;-3.3846070436994e-05;-9.6130468591582e-05;0.00012758659431711;-0.00017355567251798;0.00048098797560669;-0.0002863896661438;7.5529314926825e-05;0.00019159945077263;0.00014840501535218;0.00045000505633652;0.00010822402691701;-0.00026788222021423;-0.00048482531565242;-0.00018864338926505;-0.00036663489299826;-0.00037738692481071;3.7794241507072e-05;-0.00031565685640089;-2.221597605967e-05;-0.00027407478773966;0.00065544986864552;-0.00013462241622619;-0.00018994136189576;-1.5201156202238e-05;6.7088178184349e-05;8.236199937528e-05;-7.3269256972708e-05;6.2405510107055e-05;0.00027863070135936;-0.00010288911289535;-0.00020184864115436;3.6178451409796e-05;-0.00013918781769462;7.1442780608777e-05;0.00035343537456356;4.6461332203762e-06;0.00010404911881778;2.35750903812e-05;0.00047266689944081;-0.0001893919397844;-0.00014602924056817;0.00033663696376607;0.00014777368051;0.00025084961089306;-0.0001479481725255;-0.00016063831571955;-0.00016241970297415;-0.00046996897435747;5.4255018767435e-05;-0.00013534733443521;3.2882742289075e-06;0.00017001872765832;-3.4205855627079e-05;-0.00054095697123557;9.3679154815618e-05;-0.00014634273247793;-8.3529768744484e-05;-1.4189192370395e-05;-0.0001044837772497;0.00066445046104491;-1.401676581736e-05;0.00037701649125665;4.5796929043718e-05;-1.413143309037e-05;1.5892248484306e-05;0.00083864032058045;5.8466543123359e-05;0.00086570659186691;-2.08657775147e-06;2.3504098862759e-05;-2.7225894882577e-05;-0.00024615784059279;-0.00022409329540096;0.00015896634431556;2.3369339032797e-05;0.00031796807888895;-0.0002090150519507;3.7045381759526e-05;-0.00076415081275627;-6.6682296164799e-05;-0.00069182843435556;-7.2489303420298e-05;-0.00092167477123439;2.4736396881053e-05;5.6859564210754e-05;-1.8552180335973e-05;-0.00019320726278238;0.00014377455227077;0.00019032129785046;0.00022977015760262;0.00034121380303986;0.00011718829773599;3.9098413253669e-05;-2.3621920263395e-05;-9.3214679509401e-05;9.7369207651354e-05;-0.00011118128168164;0.00040410889778286;-0.00020390542340465;6.2806844653096e-05;0.00021615368314087;0.00016454317665193;0.00041648259502836;9.9251781648491e-05;-0.0002484037540853;-0.0004772596876137;-0.00016981057706289;-0.00033420472755097;-0.00030321776284836;-3.5377823223826e-05;-0.00026931395404972;-6.8716210080311e-05;-0.00022956938482821;0.00060045660939068;-0.00011222332977923;-0.00023075930948835;-1.6037876775954e-05;3.5195382224629e-05;7.6336385973264e-05;-0.00010329706856282;5.8062170865014e-05;0.00028730928897858;-0.00010222639684798;-0.0001960032095667;3.3661097404547e-05;-0.00011299646575935;5.9482725191629e-05;0.00044958494254388;-3.2754919629951e-06;8.0545047239866e-05;1.6289202903863e-05;0.00040501984767616;-0.00013871806731913;-0.00013242372369859;0.00030614796560258;9.9860379123129e-05;0.00023611170763616;-0.00011526461457834;-0.00016065873205662;-0.00013380333257373;-0.00049858907004818;5.2520652388921e-05;-9.6624411526136e-05;1.0916418204943e-06;8.9072396804113e-05;-2.0802466679015e-05;-0.00045556991244666;9.7893425845541e-05;-0.00014113218639977;-8.9684814156499e-05;-4.3945536162937e-05;-0.00013066425162833;0.00057888240553439;-2.4734390535741e-05;0.00036754994653165;4.137675932725e-05;-1.0807571925397e-05;-1.4718989405083e-05;0.0008126551983878;1.8998107407242e-05;0.00078527285950258;-4.7576595534338e-06;-1.8716566046351e-05;-1.789270027075e-05;-0.0002285699301865;-0.00021319875668269;0.00014700669271406;4.003563299193e-05;0.00031576893525198;-0.00020060081442352;7.5699797889683e-05;-0.00067298440262675;-3.5355056752451e-05;-0.0006191423162818;-3.788915273617e-05;-0.00090400187764317;2.5498691684334e-05;0.00010215849033557;6.6078820964321e-05;-0.00026998855173588;3.275137601122e-07;0.00046182371443138;0.00010085837129736;0.00045499025145546;0.00010145221312996;2.0857696654275e-05;2.681564183149e-05;-0.00010588621080387;2.7675663659465e-05;-0.00038284255424514;0.00022807228378952;0.00024102043244056;2.3508155777563e-07;0.00053260457934812;0.00016811808745842;0.00035736605059355;6.5102017288154e-06;-0.00010628646123223;-0.00067692453740165;-0.00014710094546899;-0.00013212645717431;-0.00010962034139084;-0.0002168865466956;-0.00014723943604622;-0.00045100253191777;-0.0001458889892092;0.00086245307466015;-3.9978200220503e-05;-0.00072548782918602;6.3272629631683e-05;-0.00021709268912673;-1.0946196198347e-05;-0.00022557508782484;8.86838461156e-05;0.00039397753425874;-0.00011595509567996;-0.0003832648799289;2.7142967155669e-05;-3.4477383451303e-05;-1.6336009139195e-05;0.00094738783081993;-3.5895809560316e-05;-0.00011171802907484;5.7386700973439e-06;0.00042010331526399;0.00012651273573283;-0.00011877503129654;0.00030602206243202;-6.957701407373e-05;0.00014383561210707;-7.3138078732882e-05;-9.2539594334085e-05;-5.7359411584912e-06;-0.0006890733493492;3.616392496042e-05;5.3223993745632e-05;3.8650564420095e-06;-1.8173015632783e-05;1.5250086107699e-05;-0.00041290704393759;0.00015336593787652;-0.00015554614947177;-0.0001834607537603;-0.00038931696326472;-0.00030633504502475;0.00046540991752408;-9.9547258287203e-05;0.00052158336620778;3.4515822335379e-05;1.431509735994e-05;-0.00015373034693766;0.0011790359858423;-0.00015888061898295;0.00083981163334101;-6.3503016463073e-06;-0.00025845610070974;9.0671899670269e-05;-0.00032964776619337;-0.00028480845503509;0.00012342192349024;0.00025543369702064;0.00051572802476585;-0.00025939845363609;0.00030815752688795;-0.00061175506561995;7.9140198067762e-05;-0.00059146544663236;9.9282733572181e-05;-0.001311480300501;4.0062597690849e-05;0.00038024270907044;4.436571180122e-05;-0.00016692830831744;-4.2294163904444e-06;0.00040915250428952;2.0986881281715e-05;0.0003799184341915;7.2960363468155e-05;9.9058663181495e-05;2.7862908609677e-05;-8.4215775132179e-05;1.5671414075769e-05;-0.00037319160765037;0.00014647393254563;0.00034422602038831;-1.0305555406376e-05;0.00039335445035249;7.5541509431787e-05;0.00025021703913808;-4.3644206016324e-05;-2.4751805540291e-05;-0.00052130239782855;-6.7681576183531e-05;-0.00011017145152437;-5.9817204601131e-05;-0.00020997648243792;-8.3970597188454e-05;-0.0004572145990096;-9.5778363174759e-05;0.00062795914709568;-2.231387043139e-05;-0.00057225575437769;5.8813537179958e-05;-0.00018370772886556;-2.4145467250491e-05;-0.00012498832074925;7.6007694588043e-05;0.00022171136515681;-6.9397283368744e-05;-0.00034009871887974;2.4047756596701e-05;-2.1988540538587e-05;-1.6627165678074e-05;0.00057966395979747;-2.5786555852392e-05;-0.00012641229841392;-4.7719963731652e-06;0.00038697727723047;0.0001136651262641;-7.8609991760459e-05;0.00021496394765563;-5.0075723265763e-05;5.1701095799217e-05;-8.5826046415605e-05;2.2539021301782e-05;3.7311879168556e-06;-0.00039744138484821;2.3543107090518e-05;3.9174476114567e-05;-1.7851275515568e-06;0.00012294630869292;1.8408609321341e-05;-0.00040623210952617;0.00011303494102322;-0.00010006420779973;-0.00015246382099576;-0.00032905061380006;-0.00025697410455905;0.00036131040542386;-8.7067615822889e-05;0.00039034686051309;3.0794421036262e-05;1.2975841855223e-05;-0.00012313418847043;0.00088365445844829;-0.00014368128904607;0.00068811269011348;-1.0380867024651e-05;-0.00016715911624487;7.4312272772659e-05;-0.00029201264260337;-0.00022780269500799;0.00011297265882604;0.00021772539184894;0.00041987717850134;-0.00017404038226232;0.00025525159435347;-0.00046515406575054;7.9296791227534e-05;-0.00048579261056148;8.8090047938749e-05;-0.00099903531372547;3.6650922993431e-05;0.00024940713774413;0.00038518005749211;-0.00010008321260102;-0.00044988139416091;7.1137692430057e-05;-0.00067121902247891;-0.00011206074850634;6.1274935433175e-05;-8.7847598479129e-05;9.2286747531034e-05;-1.0431781447551e-05;0.00010987892892445;-1.7071193724405e-05;-0.00017510737234261;-0.0002039379614871;-0.00053374713752419;-2.2327812985168e-05;-0.00030564452754334;-0.00040736194932833;-8.8858840172179e-05;0.00079812936019152;0.00014733835996594;0.00020231334201526;0.00018682527297642;0.00048742486978881;5.5269589211093e-05;0.0003937819856219;0.00014654106053058;-0.00083457876462489;0.00013436211156659;0.00069395854370669;5.4456446378026e-05;-0.00027548201614991;6.5971697040368e-05;-0.00032161403214559;-2.0774590666406e-05;0.00064411200582981;6.7574255808722e-05;-0.00022847349464428;-0.00014691890100949;-4.2443323764019e-05;1.9480828996166e-05;0.0014632469974458;-3.3376392821083e-05;2.4473314624629e-05;-3.1439503800357e-05;0.00026583232101984;3.4396492992528e-05;0.00018841787823476;-0.00010821998876054;0.00030233411234803;0.00019123744277749;-0.00011859389633173;-0.00030463942675851;1.1585263564484e-05;-0.0011779016349465;2.6195069949608e-05;3.4142158256145e-05;1.9194154447177e-05;-0.00031590845901519;1.4657628526038e-05;-0.00024306603881996;-4.0000045373745e-06;-0.00023826450342312;0.0001632555940887;-0.00044773978879675;-0.00017086883599404;0.00043061425094493;-0.00023543766292278;0.00048212995170616;-9.9763899925165e-05;2.619488077471e-05;2.8488919269876e-05;0.0014550053747371;-0.00013419320748653;0.00077106768731028;-0.0001329758670181;-0.00030472051003017;2.3325451365963e-06;0.00016636530926917;-0.0002730684063863;-0.00026765506481752;0.0002241600304842;4.1766772483243e-05;-0.00024086116172839;0.00048262270865962;-0.00064895109971985;0.00025621798704378;-0.00053719768766314;5.4126387112774e-05;-0.0014448885340244;8.5952277004253e-05;0.00046964985085651;3.6635618016589e-05;0.00049120711628348;-0.00011677645670716;-0.00038014308665879;7.0856607635505e-05;-0.00076605757931247;-0.00016937176405918;0.00012452143710107;-8.4572122432292e-05;9.226050315192e-05;2.7070980195276e-06;-0.00018095527775586;-2.044625034614e-05;-2.0493369447649e-05;-0.00024775715428405;-0.00052956520812586;-4.3496660509845e-05;-0.00040857749991119;-0.00047298107529059;-0.00016412422701251;0.00084060744848102;0.00023852214508224;0.00029039653600194;0.00022275820083451;0.00061558408197016;7.6109507062938e-05;0.00027748351567425;0.00018728994473349;-0.00080897950101644;0.00016072399739642;0.00065184861887246;7.1420407039113e-05;-0.00020074620260857;2.4647746613482e-05;-0.0004232247301843;2.5124558305833e-05;0.00073755404446274;6.5191823523492e-05;-0.00018123783229385;-0.00017762710922398;-4.3614138121484e-05;1.2922625501233e-05;0.0016667770687491;-1.0505254067539e-05;0.00010723189916462;-2.6411185899633e-05;0.00019643345149234;4.9496709834784e-05;0.00013144736294635;-0.00016791788220871;0.00033351534511894;0.00034107951796614;-0.00011083998106187;-0.00041117193177342;5.6116496125469e-05;-0.001375159714371;-1.1724084288289e-05;2.8011314498144e-05;2.2932292267797e-05;-0.00050208205357194;1.5263127352227e-05;-0.00015710922889411;-1.4374030797626e-05;-0.00028062571072951;0.00017630300135352;-0.00037332807551138;-0.00016329751815647;0.00047273593372665;-0.00022045458899811;0.00050989439478144;-8.539578266209e-05;2.6844347303268e-05;2.4671528080944e-05;0.0015421287389472;-0.00012792374764103;0.00077791186049581;-0.0001083257375285;-0.00034195385524072;6.5987514972221e-06;0.00015294013428502;-0.0002228908269899;-0.00026806135429069;0.00016557663911954;3.6537014239002e-05;-0.00028251920593902;0.00046257136273198;-0.00072010850999504;0.0002379907091381;-0.00053814268903807;3.3668096875772e-05;-0.0015202128561214;7.0177949965e-05;0.00052377948304638;3.291059329058e-05;0.00043800310231745;-8.1800491898321e-05;-0.00028016691794619;3.0509932912537e-05;-0.00066545640584081;-0.00019001858890988;0.00013851781841367;-7.7042721386533e-05;7.7589837019332e-05;1.4130273484625e-05;-0.00026023614918813;-4.0281731344294e-05;0.00010800822929014;-0.0002590533986222;-0.00042273869621567;-5.1929768233094e-05;-0.00037728736060672;-0.00044638823601417;-0.0001859540498117;0.00071919034235179;0.00025630785967223;0.00030074841924943;0.00022031266416889;0.00053361244499683;0.00011360658390913;0.00013821333413944;0.00019332348892931;-0.0006851326324977;0.00016613479238003;0.00049827201291919;7.7006021456327e-05;-7.3397022788413e-05;-1.9979210264864e-05;-0.00039446915616281;6.0564809245989e-05;0.00061441247817129;5.4186395573197e-05;-0.0001281406293856;-0.00015897763660178;-4.6938606828917e-05;1.1414894288464e-05;0.0013601470272988;1.7610891518416e-05;0.00014978503168095;-1.0461880265211e-05;0.0001664882292971;4.7428377001779e-05;3.5630386264529e-05;-0.0001938533532666;0.00029027595883235;0.00038937095087022;-5.8191395510221e-05;-0.00036390731111169;5.9043199144071e-05;-0.0011689562816173;-5.3377472795546e-05;-7.9845694926917e-06;2.1568370357272e-05;-0.00044596471707337;8.6539575931965e-06;-0.00014091291814111;-2.1068741261843e-05;-0.00025629217270762;0.00014909736637492;-0.00023093534400687;-0.00012538094597403;0.00047646375605837;-0.00016679006512277;0.00043857315904461;-6.2113271269482e-05;1.960576082638e-05;2.1691575966543e-05;0.0013199980603531;-9.0079687652178e-05;0.00069256697315723;-6.1954626289662e-05;-0.00027510020299815;7.2827983785828e-06;0.00010956954793073;-0.0001556673378218;-0.00022012321278453;8.0292891652789e-05;3.4470107493689e-05;-0.00027252011932433;0.00037112348945811;-0.00069902784889564;0.00016974672325887;-0.00048579330905341;9.1521696958807e-06;-0.0012889265781268;3.7018369766884e-05;0.00042886773007922;2.5184328478645e-05;0.00035266642225906;-4.8010013415478e-05;-0.00019309027993586;-1.1757553011194e-06;-0.00053527159616351;-0.00018301419913769;0.00010377030412201;-7.6399446697906e-05;6.4821157138795e-05;2.4021714125411e-05;-0.00023289695673157;-5.4508403991349e-05;0.00015850900672376;-0.00026422154041938;-0.00031226433929987;-5.8156121667707e-05;-0.0003229662834201;-0.00040044169872999;-0.0001663093426032;0.00059488759143278;0.00024197285529226;0.00028762218425982;0.00019288700423203;0.00038673295057379;0.00013850195682608;6.9473753683269e-05;0.00019395673007239;-0.00056282203877345;0.00016498722834513;0.00035310653038323;8.3630533481482e-05;-9.0724161054823e-06;-3.2146264857147e-05;-0.00030838028760627;7.2223192546517e-05;0.00047282373998314;5.0362334150122e-05;-0.00010300565918442;-0.0001285104372073;-5.7661207392812e-05;1.1405658369767e-05;0.0010292303049937;2.628365837154e-05;0.00014490821922664;7.6653060432363e-07;0.0001785925560398;4.3610496504698e-05;-2.91923443001e-05;-0.0001740962616168;0.00025682678096928;0.00035834099981003;-1.4947199815651e-05;-0.00029339149477892;2.3144662918639e-05;-0.00092462770408019;-7.2614260716364e-05;-3.3022628485924e-05;1.7318723621429e-05;-0.00031106141977943;7.7154700193205e-06;-0.00017461333482061;-2.7210398911848e-05;-0.00021015769743826;0.00011873192124767;-0.00013787252828479;-9.4328934210353e-05;0.00044627889292315;-0.0001233904476976;0.0003681643283926;-4.4800945033785e-05;9.61177283898e-06;2.4736276827753e-05;0.0010620732791722;-5.406665513874e-05;0.00062363519100472;-2.264167778776e-05;-0.00018586590886116;5.8258965509594e-06;6.6129156039096e-05;-0.00013445799413603;-0.00018882575386669;3.8004054658813e-05;4.770171653945e-05;-0.0002278154133819;0.0003039771982003;-0.00061009725322947;0.00010795356502058;-0.00045968414633535;-9.6688181656646e-06;-0.001059703878127;9.4439137683366e-06;0.00031270648469217;1.8404369257041e-05;-1.5355320783783e-06;-0.00024210874107666;0.00011107260070276;0.00022468168754131;0.00023067279835232;0.00038276275154203;9.272536408389e-05;-7.7980497735552e-05;-8.3610484580277e-06;-8.1232879892923e-05;8.2772108726203e-05;-4.6008175559109e-05;0.00032999561517499;-0.00019041895575356;3.9906164602144e-05;0.00032096455106512;0.00019346084445715;0.00038752594264224;0.00013331291847862;-0.00024938347632997;-0.00049478770233691;-0.00019520438218024;-0.00025918768369593;-0.00024893996305764;-0.00015673886809964;-0.00022181968961377;-6.4606683736201e-05;-0.00020003935787827;0.00065187696600333;-7.6318909123074e-05;-0.00036705780075863;-3.5795637813862e-05;4.1951821913244e-05;7.0501315349247e-05;-0.0002423822588753;4.4879227061756e-05;0.00034621878876351;-0.00011735330190277;-0.00017454617773183;2.4386310542468e-05;-6.7725981352851e-05;6.0634560213657e-05;0.00066273170523345;-5.2875420806231e-06;8.799739589449e-05;1.8020629795501e-05;0.00028575860778801;-7.7496566518676e-05;-0.00018524838378653;0.00026401958893985;5.1959861593787e-05;0.00030963419703767;-2.2696071027895e-05;-0.00018746660498437;-0.00011078378884122;-0.00060205702902749;4.5424476411426e-05;-5.6202577980002e-05;-7.6085025284556e-06;-0.00011917266965611;-1.1359883501427e-05;-0.00029093550983816;0.00011002121755155;-0.00016582586977165;-9.2563903308474e-05;-8.7248394265771e-05;-0.00015015064855106;0.0005254918942228;-3.5684257454704e-05;0.00039417928201146;2.6411387807457e-05;2.3411237179971e-06;-5.0285689212615e-05;0.00091762258671224;-2.0782681531273e-05;0.00069835444446653;-9.9499152383942e-07;-0.0001461115462007;2.2181229724083e-05;-0.00016144875553437;-0.00019532916485332;8.5679668700323e-05;4.9365949962521e-05;0.0003152686113026;-0.00026114017236978;0.00012479875294957;-0.00067682994995266;-1.1199843356735e-05;-0.00050766597269103;-6.0588608903345e-06;-0.00096549920272082;2.6555519070826e-05;0.00023654823598918;3.0359613447217e-05;-0.00030350807355717;7.6415257353801e-05;0.00029546034056693;0.00023049939773045;0.00044854995212518;9.2698552180082e-05;-0.00012033365055686;9.3449040150517e-07;-8.8272347056773e-05;6.6785607486963e-05;-6.6560649429448e-05;0.0003100375761278;-0.0001406073133694;3.1280022085411e-05;0.00042784286779352;0.00022989413992036;0.00040752894710749;0.00014246952196117;-0.00024933245731518;-0.00058230391005054;-0.00021770531020593;-0.00023255251289811;-0.00021521090820897;-0.00023075311037246;-0.00021236499014776;-0.00012670387513936;-0.00019283450092189;0.00076423608697951;-6.5256092057098e-05;-0.00051069265464321;-2.4672666768311e-05;-1.4268029190134e-05;6.022796878824e-05;-0.00031349761411548;5.1277318561915e-05;0.0004409249231685;-0.00013817762373947;-0.00020879818475805;2.2820157028036e-05;-5.1609647925943e-05;4.6742512495257e-05;0.00090083410032094;-1.7251311874134e-05;6.9048575824127e-05;1.9901062842109e-05;0.00027417633100413;-1.5825475202291e-05;-0.00019800652808044;0.00028588011628017;4.2884007598332e-06;0.00032963705598377;5.6512922128604e-06;-0.00022837964934297;-8.6103194917087e-05;-0.00075440725777298;4.6877583372407e-05;-2.417609175609e-05;-4.2160918383161e-06;-0.00021807859593537;-4.3318909774825e-06;-0.00025648760492913;0.00013556044723373;-0.00019115286704618;-0.0001211440685438;-0.00017359555931762;-0.00020106793090235;0.0005407293792814;-5.6346281780861e-05;0.00046324011054821;2.4187265807996e-05;8.8496390162618e-06;-9.1699723270722e-05;0.0010971123119816;-6.4205254602712e-05;0.00074570631841198;1.2813684406865e-06;-0.00023095082724467;5.2421251893975e-05;-0.00018343009287491;-0.00022010823886376;7.8072152973618e-05;0.0001006239981507;0.00038155110087246;-0.00031008274527267;0.00019173833425157;-0.00072795164305717;1.3807944014843e-05;-0.0005206621135585;2.8405318516889e-05;-0.0011403940152377;2.9414015443763e-05;0.00034009045339189;8.527437603334e-05;-0.00039314481546171;1.9320503270137e-05;0.00034548147232272;0.00020296018919908;0.00054864445701241;9.7317417385057e-05;-9.1025722213089e-05;1.1851500858029e-05;-0.00010460796329426;2.9423175874399e-05;-4.7365021600854e-05;0.00029724679188803;-7.388761787297e-06;2.6777128368849e-05;0.0005345421959646;0.00029684419860132;0.00043202974484302;0.00011294744763291;-0.00024953714455478;-0.00069427222479135;-0.00019970852008555;-0.00023426611733157;-0.00015393867215607;-0.00031832768581808;-0.00021151479450054;-0.00027383342967369;-0.00018378903041594;0.00084493402391672;-6.1343896959443e-05;-0.00066153082298115;1.5719615475973e-05;-0.00013284591841511;4.390563844936e-05;-0.00035927808494307;7.1460897743236e-05;0.00055302673717961;-0.00016183602565434;-0.0002799549838528;2.0356157619972e-05;-4.2018615204142e-05;1.5218009139062e-05;0.0012551479740068;-3.4429867810104e-05;3.3729299957486e-06;2.4589340682724e-05;0.00028709296020679;6.074095290387e-05;-0.00017527928866912;0.00034834415419027;-6.067690992495e-05;0.00032111699692905;-2.9826578611392e-06;-0.00028775981627405;-5.0820974138333e-05;-0.000970711291302;4.8825248086359e-05;4.2971030779881e-05;5.4314195949701e-06;-0.0003157916944474;1.6793756003608e-06;-0.00024461335851811;0.00016821519238874;-0.00020653862156905;-0.0001622379058972;-0.00029239238938317;-0.00027523646713234;0.00050010287668556;-7.6584787166212e-05;0.00055784813594073;2.929804395535e-05;1.2930480806972e-05;-0.00014114755322225;0.0012689729919657;-0.00011635830014711;0.00082444667350501;-1.1326267213008e-06;-0.00031515717273578;6.6384847741574e-05;-0.00025773554807529;-0.00028245663270354;0.00010616910003591;0.00019076549506281;0.00048057426465675;-0.00031389019568451;0.00027320996741764;-0.00068524421658367;4.448943582247e-05;-0.00057356007164344;7.0144276833162e-05;-0.0013883687788621;3.5385764931561e-05;0.00045910369954072;8.121437713271e-05;-0.00031779377604835;-6.4600390032865e-06;0.00035299826413393;0.00013307911285665;0.00045980996219441;8.7192704086192e-05;-3.9754788303981e-05;1.860949487309e-05;-9.4375951448455e-05;1.5384488506243e-05;-0.00016466667875648;0.00022822130995337;0.0001103495087591;1.1934833310079e-05;0.0004958653007634;0.00022852166148368;0.00034935071016662;5.2864772442263e-05;-0.00016289917402901;-0.00062179093947634;-0.00015173516294453;-0.00015666789840907;-0.00010106197441928;-0.00025308300973848;-0.00015935565170366;-0.000334786134772;-0.0001431290875189;0.00076646934030578;-4.3705636926461e-05;-0.00064059998840094;4.5670894905925e-05;-0.00018261886725668;1.0488953193999e-05;-0.00028081674827263;7.2556322265882e-05;0.00045931126805954;-0.00013105556718074;-0.00029375965823419;1.827125561249e-05;-3.0596675060224e-05;-1.0403412488813e-05;0.0010880668414757;-3.5547356674215e-05;-5.6970653531607e-05;1.7717629816616e-05;0.00028990177088417;0.00010195736103924;-0.0001244787563337;0.00030371019965969;-7.6467760663945e-05;0.00021369387104642;-2.619073347887e-05;-0.00020419771317393;-1.3509441487258e-05;-0.00080702727427706;3.6861096305074e-05;6.2336352129932e-05;8.343035915459e-06;-0.00020662593306042;6.7054070314043e-06;-0.00025532572180964;0.0001490507129347;-0.00016538531053811;-0.00015877529222053;-0.00032685080077499;-0.00026631625951268;0.00040705397259444;-7.9762481618673e-05;0.00049633992603049;2.7615640647127e-05;1.3205104551162e-05;-0.00014002461102791;0.0011185774346814;-0.00012880959548056;0.00073369435267523;-2.118484417224e-06;-0.00028098959592171;7.4221199611202e-05;-0.00026687639183365;-0.00026085658464581;0.00010004207433667;0.00021648063557222;0.0004545321862679;-0.0002561608562246;0.00027058261912316;-0.00055537704611197;5.7086490414804e-05;-0.00051070802146569;8.2018377725035e-05;-0.0012420690618455;3.3005631848937e-05;0.00040757399983704;0.00047277178964578;-0.00011579984129639;-0.00022696869564243;7.0164162025321e-05;-0.00069709401577711;-0.00014865145203657;0.00010919755732175;-5.4292639106279e-05;7.0211652200669e-05;8.8201704784296e-06;-0.00042586258496158;-2.127500010829e-06;2.9758932214463e-05;-0.00020284351194277;-0.00039242173079401;-4.6823024604237e-05;-0.00040048515074886;-0.00039807255961932;-0.00016340272850357;0.00067288137506694;0.00024444397422485;0.00030351319583133;0.00016640596732032;0.0006296006613411;4.4933054596186e-05;0.00017451081657782;0.00016212575428654;-0.00053759827278554;0.00012949771189597;0.00046084958012216;6.2757389969192e-05;-0.00012146387598477;-4.7983530748752e-06;-0.00039044945151545;4.8994555982063e-05;0.00063397898338735;5.0725382607197e-05;-0.00011136716057081;-0.00015573573182337;-2.9789753170917e-05;3.8153807508934e-06;0.0014681692700833;5.156199222256e-06;0.00012550665996969;-1.8357046428719e-05;9.1248250100762e-05;4.7115699999267e-05;7.3279006755911e-05;-0.00015430730127264;0.00027932625380345;0.00034932824200951;-9.0480389189906e-05;-0.0003925256896764;6.7896762629971e-05;-0.0012143255444244;-3.0973980756244e-05;3.4467440855224e-05;2.0023237084388e-05;-0.00053289439529181;1.1238985280215e-05;-4.72981519124e-05;-1.550340311951e-05;-0.00023906413116492;0.00014575384557247;-0.00023731747933198;-0.0001222025603056;0.00033778219949454;-0.00016769509238657;0.00041155010694638;-5.3150790336076e-05;2.1508152713068e-05;1.7796435713535e-05;0.0012133014388382;-9.9093114840798e-05;0.00058808631729335;-7.4465693614911e-05;-0.00029444397659972;3.9377168832289e-06;0.00010032000136562;-0.00014126888709143;-0.00021719248616137;9.25718122744e-05;3.3648622775218e-05;-0.00021790579194203;0.00034142396179959;-0.00053253874648362;0.00017752157873474;-0.00040570000419393;1.871562199085e-05;-0.0012261178344488;4.9131504056277e-05;0.00044977851212025;2.5328754418297e-05;0.00050425040535629;-0.00010413804557174;-0.00019423764024395;4.8330453864764e-05;-0.00073631951818243;-0.00018243872909807;0.00012673264427576;-5.8009809436044e-05;7.2475311753806e-05;1.644837357162e-05;-0.00054250552784652;-1.8551096218289e-05;0.00010987247515004;-0.0002434955094941;-0.00038080642116256;-5.7831239246298e-05;-0.00043669223668985;-0.00044297854765318;-0.00019792649254669;0.00069641339359805;0.00029293177067302;0.00035863067023456;0.00018664103117771;0.00066673388937488;8.1336227594875e-05;0.00011881830141647;0.00018980666936841;-0.00053295388352126;0.00015441891446244;0.00042923758155666;7.580660894746e-05;-4.2930660129059e-05;-4.0292055928148e-05;-0.00042719038901851;8.4561732364818e-05;0.00062431447440758;5.3177594963927e-05;-9.9143187981099e-05;-0.00016364559996873;-3.751486656256e-05;4.5269712245499e-06;0.0014606448821723;2.9500370146707e-05;0.00016731352661736;-7.3058390626102e-06;9.48635788518e-05;5.0669041229412e-05;1.1293202987872e-05;-0.00019728102779482;0.00029136135708541;0.00043841535807587;-6.3845182012301e-05;-0.00040371468639933;7.2795890446287e-05;-0.0012359481770545;-7.056522736093e-05;1.704376154521e-05;2.2126951080281e-05;-0.00056068698177114;5.002864782e-06;-5.6058983318508e-05;-2.1488667698577e-05;-0.00025818249559961;0.0001493103482062;-0.00016403089102823;-0.00011399186769268;0.00038880622014403;-0.00015932210953906;0.00042920114356093;-4.45634505013e-05;1.9247368982178e-05;2.0075667634956e-05;0.001233622781001;-8.7998589151539e-05;0.00062780233565718;-5.4665706556989e-05;-0.00029096490470693;2.8514402856672e-06;8.0555706517771e-05;-0.00011676349822665;-0.00022227111912798;4.1841227357509e-05;4.2132902308367e-05;-0.00024032554938458;0.00033221510238945;-0.00058857048861682;0.0001575009082444;-0.00044135912321508;6.3290681282524e-06;-0.0012590879341587;3.3579730370548e-05;0.00045150265214033;2.5523168005748e-05;0.00040290004108101;-6.595098238904e-05;-0.00012787977175321;1.640790651436e-05;-0.00059304392198101;-0.00016492493159603;0.00010168131848332;-5.1356637413846e-05;5.922776836087e-05;1.8759817976388e-05;-0.00047663814621046;-3.0407680242206e-05;0.00013807106006425;-0.00022749353956897;-0.0002872264594771;-5.3511630540015e-05;-0.00036043158615939;-0.00037805025931448;-0.00017223083705176;0.00055998802417889;0.00026043903199024;0.00031801612931304;0.00015682393859606;0.00052159855840728;9.7246687801089e-05;6.2022889323998e-05;0.00017171158106066;-0.00042165818740614;0.00014312882558443;0.00031154451426119;7.1236536314245e-05;1.9338363927091e-05;-5.1010501920246e-05;-0.00034870897070505;8.814902685117e-05;0.00046937918523327;4.4711527152685e-05;-7.5512340117712e-05;-0.00013053479779046;-3.8830370613141e-05;4.4299526962277e-06;0.0011153038358316;3.7916925066384e-05;0.00015371134213638;3.6980745790061e-06;9.2864560429007e-05;4.2791576561285e-05;-3.8380137993954e-05;-0.00018132125842385;0.00024055245739873;0.00039898545946926;-2.5450477551203e-05;-0.00031490012770519;4.954731775797e-05;-0.00096471660071984;-8.2490943896119e-05;-6.8320412083267e-07;1.741954110912e-05;-0.0004329789953772;-3.6492923527476e-07;-7.0121765020303e-05;-2.2793754396844e-05;-0.00021241529611871;0.00011769796401495;-7.8209675848484e-05;-8.2338992797304e-05;0.00034513347782195;-0.00011674565030262;0.00035120191751048;-2.8402284442564e-05;1.2340822650003e-05;1.9330660506967e-05;0.00097360333893448;-5.7398643548368e-05;0.0005334138404578;-2.4574932467658e-05;-0.00021643318177667;1.0630866427164e-06;4.8214893467957e-05;-8.1997583038174e-05;-0.00018255367467646;-5.3705952041128e-07;4.1489798604744e-05;-0.00019978094496764;0.00025788828497753;-0.00049720361130312;0.00010438534809509;-0.00038612083881162;-6.7727191890299e-06;-0.001012273831293;1.1659038136713e-05;0.00034596907789819;2.0367409888422e-05;8.7139133029268e-06;-0.00025428118533455;8.9663139078766e-05;0.00015119591262192;0.0001955711923074;0.00039159448351711;6.4594729337841e-05;-7.7290431363508e-05;-3.4466656870791e-06;-6.8657369411085e-05;5.3556763305096e-05;0.00012387990136631;0.00026995484950021;-0.00016022101044655;3.2752235711087e-05;0.00028467734227888;0.00020747260714415;0.00033484739833511;0.00012752998736687;-0.00024573472910561;-0.0004243518342264;-0.00014979351544753;-0.00025527147226967;-0.00019092169532087;-0.00022862460173201;-0.00018348460434936;-5.6767828937154e-05;-0.00016244348080363;0.00050186109729111;-6.0584196035052e-05;-0.00031599091016687;-4.7275534598157e-05;6.0813199525001e-05;7.8000230132602e-05;-0.00026056924252771;3.4045930078719e-05;0.00031844191835262;-0.00010901967471;-0.00012979898019694;1.5736706700409e-05;-4.6151664719218e-05;6.3121748098638e-05;0.00069433933822438;-7.2491877745051e-07;8.6247833678499e-05;1.7105598089984e-05;0.00018151581753045;-7.6098272984382e-05;-0.00017268667579629;0.0002277913299622;3.5574827052187e-05;0.00031886214856058;4.0161862671084e-06;-0.0001986571442103;-0.00010658724932;-0.00059270369820297;3.9859842217993e-05;-2.2677984816255e-05;-1.4780814126425e-05;-0.00022212488693185;-7.7131808211561e-06;-0.00016790274821687;9.9827251688112e-05;-0.00015621590137016;-6.9944384449627e-05;-3.3584641641937e-05;-0.0001314001128776;0.0004049968556501;-2.1921387087787e-05;0.00035234028473496;2.0035711713717e-05;4.736991286336e-06;-5.1027833251283e-05;0.00078316120197996;-2.025320645771e-05;0.00057053205091506;-4.0454792724631e-06;-0.0001660201814957;6.8219060267438e-06;-0.00010323773312848;-0.00017402372031938;6.6072803747375e-05;1.7348047549604e-05;0.00025597130297683;-0.00022406449716073;0.00011074625217589;-0.00053863937500864;-8.1300213423674e-06;-0.00040688627632335;-2.9334307782847e-06;-0.00085813883924857;2.5476234441157e-05;0.00025240008835681;3.2472409657203e-05;-0.00029487480060197;6.6736552980728e-05;0.00023870386939961;0.00020885949197691;0.00043750522308983;7.4989366112277e-05;-0.00011420940427342;5.8686384818429e-07;-7.7143180533312e-05;5.2675051847473e-05;3.2712672691559e-05;0.00027380773099139;-0.00013361309538595;2.9677252314286e-05;0.00037800573045388;0.00022724391601514;0.00036634999560192;0.00013895546726417;-0.00024223334912676;-0.0005155834951438;-0.00018684512178879;-0.00023283246264327;-0.00018443063891027;-0.00026022538077086;-0.00018966100469697;-0.00010304828902008;-0.00016970570140984;0.00064636196475476;-5.7645258493721e-05;-0.00044359240564518;-3.3485859603388e-05;6.1227428886923e-06;6.4576823206153e-05;-0.00031127169495448;4.3229454604443e-05;0.00040570553392172;-0.00012864888412878;-0.00016727144247852;1.8028029444395e-05;-4.2466086597415e-05;4.9133268475998e-05;0.00085729255806655;-1.3623580343847e-05;7.4108778790105e-05;1.9796687411144e-05;0.00020936797955073;-2.2085223463364e-05;-0.0001868101535365;0.00025482941418886;5.8484772580414e-07;0.00032850092975423;2.0093382772757e-05;-0.00022899056784809;-8.5074861999601e-05;-0.00070717558264732;4.239138434059e-05;-1.4894637388352e-05;-6.5103131419164e-06;-0.00025557691697031;-4.3631284825096e-06;-0.00018551285029389;0.00012232871085871;-0.00017702204058878;-0.00010277216642862;-0.00013522678636946;-0.00017585621390026;0.00046867210767232;-4.5519162085839e-05;0.00041660026181489;1.9991430235677e-05;9.0204102889402e-06;-8.2026192103513e-05;0.0009801295818761;-5.4445048590424e-05;0.00065109523711726;6.2685552393305e-07;-0.0002217361034127;4.1706687625265e-05;-0.000145811776747;-0.00019626526045613;6.4783867856022e-05;7.6678705227096e-05;0.00033037544926628;-0.00027911772485822;0.00016787908680271;-0.00064042367739603;9.9858852991019e-06;-0.00045001116814092;2.3436257833964e-05;-0.0010260064154863;2.663543637027e-05;0.00032229381031357;7.6203978096601e-05;-0.00034364283783361;1.4218925571186e-05;0.00022965008975007;0.00017032626783475;0.00047714519314468;6.7550172389019e-05;-8.2795049820561e-05;6.1063697103236e-06;-7.9180623288266e-05;1.4824047866568e-05;9.7737058240455e-05;0.0002367713896092;-3.8239741115831e-05;2.7146961656399e-05;0.00040246415301226;0.00026576707023196;0.00034647050779313;0.00011015660857083;-0.00022812907991465;-0.00053480424685404;-0.00015052569506224;-0.00022541437647305;-0.00011548877228051;-0.00031790739740245;-0.00017303277854808;-0.00018304827972315;-0.00014453285257332;0.00060913542984053;-5.0880211347248e-05;-0.00048405223060399;-3.6812107282458e-06;-7.707627810305e-05;5.0738421123242e-05;-0.00031647592550144;5.1484232244547e-05;0.00046117120655254;-0.00013543652312364;-0.00018712418386713;1.3026746273681e-05;-3.1346789910458e-05;2.2281819838099e-05;0.0010508011328056;-2.5384040782228e-05;2.9789318432449e-05;2.3262567992788e-05;0.00017821141227614;3.0677041650051e-05;-0.00014852300228085;0.00027591476100497;-4.8043053539004e-05;0.00029594526859;1.7041094906745e-05;-0.00027038928237744;-5.2829876949545e-05;-0.00081702315947041;4.0288865420735e-05;3.5281675081933e-05;2.8551935429277e-06;-0.00032801934867166;-1.1782101410063e-06;-0.00013623991981149;0.00013336907431949;-0.00017105966981035;-0.0001193063944811;-0.00019544307724573;-0.00020661986491177;0.00037977346801199;-5.1996583351865e-05;0.00043742021080106;2.1077692508698e-05;1.0683095752029e-05;-0.00010711338109104;0.00099150522146374;-8.1806108937599e-05;0.00062735611572862;-9.0710716449394e-07;-0.00026016234187409;4.187867307337e-05;-0.00017802517686505;-0.00021908248891123;7.961482333485e-05;0.00012789905304089;0.00035892613232136;-0.00024806646979414;0.00020367553224787;-0.00053225556621328;2.8092741558794e-05;-0.00043218210339546;4.8602352762828e-05;-0.001089314580895;2.7117097488372e-05;0.00037634957698174;-0.00032877927878872;0.00036853324854746;0.00035048561403528;-0.00029044435359538;-3.8389436667785e-05;-2.4806446162984e-05;-3.0317589789775e-06;3.1453084375244e-05;2.9325090508792e-05;-2.5048990210053e-05;-0.00013616650539916;-7.5916766945738e-05;0.00024666960234754;-0.00023402785882354;-1.2571192200994e-05;9.1739684648928e-06;-3.8001340726623e-05;-1.2331218385953e-05;-3.2848543924047e-05;-0.00016421552572865;0.00018996297148988;0.00017802993534133;-0.00013778235006612;-0.00010614624625305;0.00022145007096697;-0.00010155847121496;7.9048237239476e-05;-6.9910049205646e-05;0.00013565052358899;-5.0552975153551e-05;4.2746978579089e-05;0.00033258559415117;0.0001529464207124;-0.00023739646712784;-9.0338886366226e-05;-0.00022447027731687;-0.00014315894804895;3.188474511262e-05;2.3729196982458e-05;-1.7177164409077e-05;-2.3117740056477e-05;-8.6534637375735e-05;-5.1670594984898e-05;0.00014579691924155;0.000127419931232;1.0044625014416e-05;3.0896655516699e-05;-0.00030960838194005;-0.0003363280557096;1.1147644727316e-05;0.00050183519488201;0.00033380193053745;7.3845840233844e-05;7.2178256232291e-05;7.4277872045059e-05;2.722033423197e-05;-4.2216684960295e-05;-5.6931046856334e-05;-0.00015714950859547;-0.0001114014085033;-2.2537326003658e-05;-3.9573988033226e-05;-0.00014036074571777;-7.5742558692582e-05;0.00035651517100632;0.00024070907966234;0.00032318665762432;0.00026775279548019;0.00015870032075327;0.00012741413956974;6.8165854827384e-07;7.6180913310964e-06;0.00018958121654578;0.00013807973300572;0.00025109760463238;0.00022184998670127;-4.0824088500813e-05;-2.2904609068064e-05;0.00017277985170949;0.00040920969331637;-7.3034170782194e-05;-0.00048089973279275;-0.00035488759749569;-0.00018375825311523;-0.00016169653099496;-0.00028726729215123;-0.00025836433633231;-0.00023116922238842;-0.00018777445075102;-0.00028776188264601;-0.00020440558728296;8.3678103692364e-05;4.1996936488431e-05;-0.0004470048006624;0.00046116154408082;0.00044939789222553;-0.0003638393827714;-2.4408504941675e-06;1.5748738633192e-06;-5.8692012316897e-06;4.0848673961591e-05;3.5299930459587e-05;-3.5520148230717e-05;-0.00010113738971995;-6.43969324301e-05;0.00031862771720625;-0.00029403663938865;-1.1951728993154e-05;1.6703246728866e-05;-2.5984683816205e-05;1.6070194760687e-05;-2.3445953047485e-05;-0.00023960170801729;0.00021283868409228;0.00019764955504797;-0.00020115487859584;-0.0001964357070392;0.00025181661476381;-0.00013212190242484;9.4299699412659e-05;-0.00010326338815503;0.00016595075430814;-6.6389162384439e-05;5.2355022489792e-05;0.00038118523661979;0.00023574721126352;-0.00026007377891801;-0.00014715545694344;-0.00027984561165795;-0.00019107660045847;3.6945391912013e-05;3.6396555515239e-05;-1.9800057998509e-05;-3.271007881267e-05;-0.00012463299208321;-7.4099771154579e-05;0.00017888010188472;0.00016404976486228;1.44093628478e-05;4.0748673200142e-05;-0.00038736019632779;-0.00041593899368308;1.4021137758391e-05;0.00059655855875462;0.00044391793198884;9.7423318948131e-05;8.37542975205e-05;9.813755605137e-05;5.003999103792e-05;-5.2965406212024e-05;-7.5140756962355e-05;-0.00018081058806274;-0.00014769491099287;-3.1246898288373e-05;-5.1663006161107e-05;-0.00016604058328085;-0.00010952658340102;0.00043296057265252;0.00032751393155195;0.00040042659384198;0.00035935384221375;0.00019051930576097;0.00016928407421801;9.5342744543814e-07;9.1762976808241e-06;0.00021722872043028;0.00019027429516427;0.0003021392330993;0.00030043092556298;-4.3780517444247e-05;-3.0945426260587e-05;0.00022366510529537;0.00051852350588888;-9.0328947408125e-05;-0.00059374904958531;-0.00047010200796649;-0.00022651995823253;-0.00021444424055517;-0.00035133742494509;-0.00034911814145744;-0.0002822466485668;-0.00025215587811545;-0.0003326871083118;-0.00028016598662362;9.3871123681311e-05;5.682758637704e-05;-0.00046738900709897;0.00044110498856753;0.00046106972149573;-0.00036027989699505;4.1811494156718e-05;4.6079603635008e-05;-7.4580875661923e-06;4.1132167098112e-05;3.3134336263174e-05;-3.9545280742459e-05;-3.9978625864023e-05;-9.6307485364377e-06;0.00032758279121481;-0.00029334877035581;-8.4708035501535e-06;2.2019761672709e-05;-5.1234255806776e-06;5.1805000111926e-05;-2.4023061087064e-06;-0.00027538416907191;0.00018416062812321;0.00017025864508469;-0.00023652974050492;-0.00025392611860298;0.00020531493646558;-0.00013732966908719;9.047357889358e-05;-0.00011989470658591;0.00015796674415469;-6.7805522121489e-05;5.0582428229973e-05;0.00032782414928079;0.00028736219974235;-0.00021552227553912;-0.00019080450874753;-0.000267629919108;-0.00020294554997236;3.0157429137034e-05;4.0277758671436e-05;-1.7008649592753e-05;-3.6486231692834e-05;-0.00011567294131964;-7.4268318712711e-05;0.00017364956147503;0.00016741793660913;1.4787191503274e-05;4.2309387936257e-05;-0.00039072052459233;-0.00041873889858834;1.7872256648843e-05;0.00056496285833418;0.00048290411359631;0.00010001859482145;7.8059412771836e-05;8.0979829363059e-05;6.1443846789189e-05;-4.9214333557757e-05;-7.6499396527652e-05;-0.00016968839918263;-0.00016041041817516;-3.2072777685244e-05;-5.2343391871545e-05;-0.00015013682423159;-0.00012331412290223;0.0004070776340086;0.0003546793886926;0.00038241883157752;0.00037848044303246;0.00018216302851215;0.00018190059927292;1.4518602711178e-06;8.9858085630112e-06;0.00019901544146705;0.00021232123253867;0.00028647933504544;0.00032616860698909;-3.9018534153001e-05;-3.6630652175518e-05;0.00021635767188855;0.00051277125021443;-9.3048300186638e-05;-0.00056470697745681;-0.00048716610763222;-0.00021564897906501;-0.00022250317852013;-0.00033369348966517;-0.00037446059286594;-0.00027052502264269;-0.00026967326994054;-0.00030808305018581;-0.00031273876084015;8.5914740338922e-05;6.516194116557e-05;-0.00037748875911348;0.00032485215342604;0.00037745607551187;-0.00028613762697205;6.270290032262e-05;7.6720672950614e-05;-6.7249793573865e-06;3.2622971048113e-05;2.4486476831953e-05;-3.4430191590218e-05;2.2367635210685e-06;4.9810605560197e-05;0.0002675031137187;-0.00023272776161321;-4.0724685277382e-06;2.1600464606308e-05;1.2536484064185e-05;6.9263827754185e-05;1.4630326404586e-05;-0.00024823183775879;0.00012517999857664;0.000116713141324;-0.00021883910812903;-0.00023610607604496;0.00011665173224173;-0.00011438853107393;6.9826870458201e-05;-0.00010690640920075;0.00011712669220287;-5.4474836360896e-05;3.8607344322372e-05;0.00021678047778551;0.00026809787959792;-0.00013884459622204;-0.00018907524645329;-0.00020177268015686;-0.0001689307828201;1.6757530829636e-05;3.2887055567699e-05;-1.0896658750426e-05;-3.1388601200888e-05;-7.3533330578357e-05;-4.7711822844576e-05;0.0001344215561403;0.00013605890853796;1.0960406143568e-05;3.3647611417109e-05;-0.00031949381809682;-0.0003452597593423;1.8899794667959e-05;0.00043405903852545;0.00042403259431012;8.2771868619602e-05;5.8972796978196e-05;4.2098905396415e-05;4.927062036586e-05;-3.4202112146886e-05;-5.9861009503948e-05;-0.00013088401465211;-0.00014289600949269;-2.4659115297254e-05;-4.030748095829e-05;-0.00010462156205904;-0.00010780708544189;0.0003012536035385;0.00030367722501978;0.00028396511333995;0.00031183197279461;0.00013987344573252;0.00015715796325821;1.8458164277035e-06;7.146465122787e-06;0.00014695085701533;0.0001892959990073;0.00021588553499896;0.00028094384470023;-2.9917284336989e-05;-3.6591070966097e-05;0.00015697503113188;0.00039986681076698;-7.9251854913309e-05;-0.00041881404467858;-0.00039620639290661;-0.00016024660726544;-0.00018154583813157;-0.00024887558538467;-0.00031609775032848;-0.00020476503414102;-0.0002280930057168;-0.00023079362290446;-0.00028032812406309;6.5235049987677e-05;6.2050115957391e-05;-0.00048916367813945;0.00052504369523376;0.00046140828635544;-0.00039679222390987;-5.4963898037386e-06;-5.4328229452949e-05;-9.7897464002017e-06;4.4423464714782e-05;3.7075707950862e-05;-3.4459564631106e-05;-0.00010703005682444;-0.00013101499644108;0.00028183663380332;-0.00027138279983774;-1.1114080734842e-05;1.4602272131015e-05;-2.6148327378905e-05;-2.1994540020387e-06;-3.6066950997338e-05;-0.00025057312450372;0.00025076270685531;0.00019921404600609;-0.00016187514120247;-0.00017061072867364;0.00030791104654782;-0.0001182336563943;8.5551138909068e-05;-7.209784234874e-05;0.00015542750770692;-6.2399070884567e-05;4.7519570216537e-05;0.00044557021465153;0.00020037917420268;-0.00032018590718508;-0.00013083567318972;-0.00033388796146028;-0.00020583887817338;5.1045666623395e-05;4.2951513023581e-05;-1.7414111425751e-05;-2.3559472538182e-05;-0.0002048788301181;-9.8044372862205e-05;0.00017872439639177;0.00016205009887926;6.6593693190953e-06;2.7410833354224e-05;-0.00038089792360552;-0.00043565389933065;-2.7680938728736e-05;0.00063405634136871;0.00042270211270079;0.00013594205665868;0.00011834577162517;0.00019388955843169;7.6626696682069e-05;-6.1738697695546e-05;-7.628165622009e-05;-0.00017529395699967;-0.00014160296996124;-2.3210530343931e-05;-3.9348051359411e-05;-0.00018047436606139;-0.00010376903082943;0.00046571900020353;0.0003139564068988;0.00041992706246674;0.00035047210985795;0.00018625956727192;0.00015743626863696;-9.6682867933851e-08;7.3564933700254e-06;0.00020862308156211;0.0001614468783373;0.00028839136939496;0.00025931978598237;-4.6153949369909e-05;-2.9494591217372e-05;0.00026500862441026;0.00058451434597373;-7.2303075285163e-05;-0.00067239551572129;-0.0005048550083302;-0.00025067152455449;-0.00023421089281328;-0.00035664066672325;-0.00031845000921749;-0.00027068596682511;-0.0002234212734038;-0.0003159886400681;-0.00023552094353363;9.4433031335939e-05;5.2268136641942e-05;-0.00065854971762747;0.00066808052361012;0.00060293229762465;-0.00050544564146549;3.8811205740785e-05;-3.4151242289227e-05;-1.5202795111691e-05;5.7115466916002e-05;4.64247277705e-05;-4.7810997784836e-05;-6.6426204284653e-05;-0.00012922367022838;0.00037033652188256;-0.00034787849290296;-1.2599471119756e-05;2.2474798242911e-05;-1.64789325936e-05;2.7686257453752e-05;-2.6923587938654e-05;-0.00035178998950869;0.0002975738607347;0.00022872602858115;-0.00023716817668173;-0.00028501980705187;0.00036030076444149;-0.00015415827510878;0.0001067391349352;-0.00011100060510216;0.00019195026834495;-8.0365360190626e-05;6.1041144363116e-05;0.00052012311061844;0.00031242280965671;-0.00036460111732595;-0.00021057362027932;-0.00041388481622562;-0.00028133788146079;6.1236671172082e-05;6.163417128846e-05;-2.0307645172579e-05;-3.4050277463393e-05;-0.00025662654661573;-0.0001434649748262;0.00022617369540967;0.00021073865354992;1.0007255696109e-05;3.6746125260834e-05;-0.00048578600399196;-0.00055192928994074;-3.3990494557656e-05;0.00077282695565373;0.00057244609342888;0.00017392347217537;0.00014709697279613;0.00023206669720821;0.00012479608994909;-7.8138327808119e-05;-0.00010135360207641;-0.00021384039428085;-0.00018877885304391;-3.2118638046086e-05;-5.1456248911563e-05;-0.00022137949417811;-0.00014706210640725;0.00057753728469834;0.00043092030682601;0.00053136417409405;0.00047140248352662;0.00023220501316246;0.00021057459525764;-3.619046822223e-07;9.5389077614527e-06;0.00025148663553409;0.00022235882352106;0.00035731596290134;0.00035373560967855;-5.2927218348486e-05;-4.0762119169813e-05;0.00034581890213303;0.00075380754424259;-9.2483001935761e-05;-0.00084789888933301;-0.00067467312328517;-0.00031809118809178;-0.0003094811399933;-0.00044544719276018;-0.0004329031216912;-0.00034009938826784;-0.00030177153530531;-0.00038209150079638;-0.00032455581822433;0.00011233741679462;7.1585040132049e-05;-0.00067359616514295;0.0006363833672367;0.00061416695825756;-0.00049641967052594;8.9566397946328e-05;1.8726712369244e-05;-1.7589185517863e-05;5.5503223848063e-05;4.3939402530668e-05;-5.1238035666756e-05;5.7074498727161e-06;-5.73687175347e-05;0.00037736221565865;-0.00034380366560072;-1.0633435522323e-05;2.6141677153646e-05;2.7304686227581e-06;6.644399400102e-05;-1.2892580798507e-06;-0.00038777905865572;0.00026632109074853;0.00019483049982227;-0.00027630742988549;-0.00035218079574406;0.00029611543868668;-0.00015672695008107;0.0001041003561113;-0.00013194339408074;0.00017683890473563;-7.8771336120553e-05;6.0768968978664e-05;0.00043984860531054;0.00038113191840239;-0.00030265795066953;-0.00026843772502616;-0.00038667875924148;-0.00030150183010846;5.1956150855403e-05;6.5814536355902e-05;-1.6668584066792e-05;-3.7934551073704e-05;-0.00022406510834116;-0.00015378436364699;0.0002193721011281;0.00021138900774531;9.9623348432942e-06;3.7121957575437e-05;-0.00048653990961611;-0.00055389333283529;-2.9459051802405e-05;0.0007266157772392;0.00062103342497721;0.00017256892169826;0.00014395905600395;0.00019102959777229;0.00015046751650516;-7.2079230449162e-05;-0.00010161229147343;-0.00020401597430464;-0.00020038613001816;-3.2372590794694e-05;-5.0183516577817e-05;-0.00020058959489688;-0.00016035504813772;0.00053750589722767;0.00046135147567838;0.00050375488353893;0.00048609543591738;0.00022251743939705;0.00022148134303279;-2.3391713455112e-07;9.8184718808625e-06;0.00023256793792825;0.0002423708938295;0.00033711490686983;0.0003781697305385;-4.8059791879496e-05;-4.7596331569366e-05;0.00033048924524337;0.00073831499321386;-9.5382005383726e-05;-0.00079971936065704;-0.00068881997140124;-0.00030395336216316;-0.00031253203633241;-0.00041939623770304;-0.00045723139191978;-0.00032432909938507;-0.00031652438337915;-0.00035542988916859;-0.00035596266388893;0.00010413399286335;8.0428442743141e-05;-0.00051987508777529;0.0004544650146272;0.0004866806557402;-0.00038074914482422;0.00010248759645037;6.283912807703e-05;-1.5058912140375e-05;4.1356899600942e-05;3.1713196221972e-05;-4.195863584755e-05;4.3371372157708e-05;3.0564595363103e-05;0.00029823786462657;-0.0002635664131958;-6.3274032982008e-06;2.2438502128352e-05;1.7565831512911e-05;8.1788224633783e-05;1.9203031115467e-05;-0.00033040417474695;0.00018378502863925;0.00012825349404011;-0.00024891944485717;-0.00031220476375893;0.00016627172590233;-0.00012505023914855;8.0075064033736e-05;-0.00011636567069218;0.00012165813677711;-5.9756006521638e-05;4.7480545617873e-05;0.0002751681022346;0.00034772662911564;-0.00018802050908562;-0.0002561942092143;-0.00027818337548524;-0.00024845215375535;3.0544717446901e-05;5.1722316129599e-05;-9.5792838692432e-06;-3.1795567338122e-05;-0.00013559038052335;-0.00011455579806352;0.00016476334712934;0.00016448639507871;6.3732873059053e-06;2.7458687327453e-05;-0.00038709279033355;-0.0004448072577361;-1.7454252883908e-05;0.00054034224012867;0.00053252029465511;0.00013501352805179;0.00011126386380056;0.00010613384802127;0.00012696800695267;-4.8220721510006e-05;-7.6199583418202e-05;-0.00015498501306865;-0.0001699560234556;-2.3683989638812e-05;-3.5714292607736e-05;-0.00013528707495425;-0.0001327083009528;0.00038206379394978;0.00038156405207701;0.00035991083132103;0.00038181376294233;0.00016625694115646;0.00018258650379721;2.8108911465097e-07;8.0335239545093e-06;0.00016763395979069;0.00020634630345739;0.00024599596508779;0.00031371222576126;-3.625785393524e-05;-4.54889050161e-05;0.00022845235071145;0.00055211130529642;-7.9768287832849e-05;-0.00056819868041202;-0.00053531804587692;-0.00022020289907232;-0.00024118108558469;-0.00030133977998048;-0.00037162707303651;-0.00023713796690572;-0.00025614403421059;-0.00025967805413529;-0.00030665742815472;7.7286800660659e-05;7.2946102591231e-05;-0.00063967285677791;0.00066981848794967;0.00054135150276124;-0.00048284727381542;3.8505306292791e-05;-9.641296492191e-05;-1.969347067643e-05;5.6928533012979e-05;4.2418236262165e-05;-4.1615570808062e-05;-4.949095819029e-05;-0.00020205714099575;0.00027882019639947;-0.0002757178444881;-7.5216548793833e-06;1.8599626855575e-05;-8.0992540461011e-06;7.2632969931874e-06;-3.7298916140571e-05;-0.00032613758230582;0.00029961130348966;0.00019850835087709;-0.00016257249808405;-0.00023106629669201;0.00039090041536838;-0.00011758128675865;7.8528209996875e-05;-5.8625650126487e-05;0.00015676172915846;-6.8619359808508e-05;4.7015440941323e-05;0.00053972884779796;0.00022708224423695;-0.00039123100577854;-0.00015979848103598;-0.00043549595284276;-0.00025900523178279;7.1534326707479e-05;6.3649633375462e-05;-1.563588193676e-05;-1.9814988263533e-05;-0.00034368975320831;-0.00015252172306646;0.00019442400662228;0.00018235555035062;1.2463260645745e-06;1.7708000086714e-05;-0.00041276452247985;-0.00049617321928963;-7.9381446994375e-05;0.0007141986861825;0.00046611650031991;0.00019973023154307;0.0001635200023884;0.00033910834463313;0.00013761050649919;-8.0163481470663e-05;-9.1442721895874e-05;-0.00017134656081907;-0.0001567303261254;-2.0481342289713e-05;-3.2336552976631e-05;-0.00021203613141552;-0.00012526845966931;0.0005492041236721;0.00036236230516806;0.00049457850400358;0.00041006761603057;0.00019574133330025;0.00017137572285719;-1.6334281554009e-06;5.6410444813082e-06;0.00020188318740111;0.00016193624469452;0.00029418605845422;0.00026309295208193;-4.5456021325663e-05;-3.1792056688573e-05;0.00036291123251431;0.00074749905616045;-5.7345831010025e-05;-0.00084904418326914;-0.0006410371279344;-0.00030906850588508;-0.00030029323534109;-0.00039661215851083;-0.00034536322345957;-0.00028459832537919;-0.00023404249805026;-0.00030496204271913;-0.00023181954747997;9.4293041911442e-05;5.5600314226467e-05;-0.00084977352526039;0.00085129158105701;0.00070828956086189;-0.0006151418783702;9.9479453638196e-05;-9.0807647211477e-05;-2.7892565412913e-05;7.1385919000022e-05;5.3524574468611e-05;-5.6226988817798e-05;1.5780473404448e-05;-0.00021763161930721;0.00036414366331883;-0.00035078608198091;-1.081110258383e-05;2.5827126592048e-05;1.7968351357922e-06;3.8097899960121e-05;-2.7199876058148e-05;-0.00044711286318488;0.00036465853918344;0.00022303228615783;-0.00023459874500986;-0.00037041970063001;0.00046285046846606;-0.00015010494098533;9.9250864877831e-05;-9.7953648946714e-05;0.00018983703921549;-8.4144405263942e-05;6.1359329265542e-05;0.00062271329807118;0.00035767117515206;-0.00044755678391084;-0.00025800865842029;-0.00053286657202989;-0.0003592589055188;8.6169326095842e-05;8.7510597950313e-05;-1.7365095118294e-05;-2.8897322408739e-05;-0.0004134287009947;-0.00022587233979721;0.00024555897107348;0.0002330664137844;2.5794477096497e-06;2.3695150957792e-05;-0.0005250129615888;-0.00063256500288844;-0.00010134708281839;0.00086958147585392;0.00063563627190888;0.00025305617600679;0.00021149567328393;0.00039930045022629;0.0002194199769292;-0.00010028163524112;-0.00011968757462455;-0.00021191853738856;-0.00020422470697667;-2.7891519494005e-05;-4.1270985093433e-05;-0.00025973559240811;-0.00017224669863936;0.00067406910238788;0.00049237522762269;0.00062225433066487;0.00054279959294945;0.00024473809753545;0.00022560484649148;-2.7340543056198e-06;7.6573878686759e-06;0.00024652181309648;0.00021829082106706;0.00036264126538299;0.0003541404439602;-5.2892111852998e-05;-4.3763018766185e-05;0.00046734130592085;0.0009579993202351;-7.302805170184e-05;-0.0010635250946507;-0.00084777746815234;-0.00039278256008402;-0.00038968320586719;-0.00049178901826963;-0.00046300690155476;-0.0003560746263247;-0.00031120705534704;-0.00037040721508674;-0.00031455006683245;0.00011361645738361;7.5152704084758e-05;-0.00085329462308437;0.00080692034680396;0.00071588018909097;-0.00059887015959248;0.00015175464795902;-3.5587912861956e-05;-3.0354740374605e-05;6.7591332481243e-05;5.0810132961487e-05;-5.82902066526e-05;9.3116243078839e-05;-0.00013535795733333;0.000367974746041;-0.00034235639031976;-1.1254454875598e-05;2.6726294890977e-05;1.5603232895955e-05;7.4937845056411e-05;3.8262945167844e-07;-0.00047688072663732;0.00033405402791686;0.00018462918524165;-0.00027178059099242;-0.0004413508286234;0.00038578530075029;-0.00014903976989444;9.8224118119106e-05;-0.00012241408694535;0.00016809189401101;-7.8624507295899e-05;6.2974722823128e-05;0.00051571766380221;0.00043848800123669;-0.00036925304448232;-0.00032586744055152;-0.00048734620213509;-0.00038809276884422;7.4614239565562e-05;9.0703935711645e-05;-1.299096038565e-05;-3.2681375159882e-05;-0.00035200390266255;-0.00024914968525991;0.00023719003365841;0.00022853397240397;1.9708136278496e-06;2.3400076315738e-05;-0.00052141805645078;-0.00063209084328264;-9.573316492606e-05;0.00080841465387493;0.00068944599479437;0.0002451938635204;0.00021236443717498;0.00032971627661027;0.00026159273693338;-9.1675676230807e-05;-0.0001179488026537;-0.00020472051983234;-0.00021038849081378;-2.7374935598345e-05;-3.8610909541603e-05;-0.00023448778665625;-0.00018188390822615;0.00061832083156332;0.00052039365982637;0.00058387737954035;0.00054782023653388;0.00023392448201776;0.00023188405612018;-2.9995146633155e-06;8.4217808762332e-06;0.00022917670139577;0.0002318936312804;0.00033873994834721;0.00037308994797058;-4.8405570851173e-05;-5.0355272833258e-05;0.00044082719250582;0.00092647806741297;-7.5783420470543e-05;-0.00099133141338825;-0.00085152074461803;-0.00037464237539098;-0.00038352413685061;-0.00045757464249618;-0.00048105607856996;-0.00033633629209362;-0.00032006218680181;-0.00034408256760798;-0.00033914973028004;0.00010582563845674;8.2522114098538e-05;-0.00063770508859307;0.00056579860392958;0.00055662327213213;-0.00044977877405472;0.00014708803792018;2.4876053430489e-05;-2.475229666743e-05;4.8575242544757e-05;3.625959288911e-05;-4.5629443775397e-05;0.00010698298865464;-1.659216650296e-05;0.00028660334646702;-0.0002574338868726;-7.9454048318439e-06;1.9882394553861e-05;2.286396920681e-05;8.5581377788913e-05;2.1594652935164e-05;-0.00039020803524181;0.00023472309112549;0.00011803264351329;-0.00024327500432264;-0.00037565123056993;0.00022007719962858;-0.00011600376456045;7.6808268204331e-05;-0.00010922986984951;0.00010776406270452;-5.7068729802268e-05;5.1138904382242e-05;0.00030991827952676;0.00039613569970243;-0.00022402332979254;-0.00030380324460566;-0.00033952583908103;-0.00031921768095344;4.5209420932224e-05;6.8885972723365e-05;-6.1112668845453e-06;-2.7455029339762e-05;-0.00020807044347748;-0.0001944481045939;0.00017552811186761;0.00017204417963512;-5.1910035381297e-07;1.6080464774859e-05;-0.00041052445885725;-0.00050217838725075;-6.6298176534474e-05;0.00059053301811218;0.00058706512209028;0.00018479194841348;0.00016588350990787;0.00018718974024523;0.00022095332678873;-5.9683858125936e-05;-8.5630112153012e-05;-0.0001564697449794;-0.00017184624448419;-1.8913675376098e-05;-2.5500132323941e-05;-0.00015497946878895;-0.00014378972991835;0.00042786734411493;0.00042059243423864;0.00040582395740785;0.00041496095946059;0.000172484680661;0.00018505957268644;-1.9985491235275e-06;7.3612077358121e-06;0.00016377927386202;0.00019109912682325;0.00024287909036502;0.00030321537633426;-3.6819710658165e-05;-4.7156056098174e-05;0.00029401725623757;0.00067163328640163;-6.4834537624847e-05;-0.00068288634065539;-0.0006391535862349;-0.00026660441653803;-0.00028360175201669;-0.00032082144753076;-0.00038131093606353;-0.00024057844711933;-0.00025147284031846;-0.0002494603395462;-0.00028605642728508;7.8165357990656e-05;7.258566620294e-05;-0.00067849329207093;0.00070066214539111;0.00054317223839462;-0.00049563334323466;7.4955984018743e-05;-0.00012758356751874;-2.4954191758297e-05;5.9076854086015e-05;4.1127907024929e-05;-4.1612398490543e-05;1.1358752090018e-05;-0.00024127567303367;0.00023749461979605;-0.00024197158927564;-4.4901480578119e-06;1.8956508938572e-05;5.4896408983041e-06;1.3297739315021e-05;-3.3723430533428e-05;-0.00034972801222466;0.00030737678753212;0.0001673573278822;-0.00013555011537392;-0.00025861887843348;0.00041703376336955;-9.9643904832192e-05;6.2614803027827e-05;-4.1683171730256e-05;0.00013781187590212;-6.2881299527362e-05;4.0056009311229e-05;0.00054413999896497;0.00021336648205761;-0.00040360516868532;-0.00016069204139058;-0.00046819914132357;-0.00027146935462952;7.7032738772687e-05;6.9511654146481e-05;-1.2187060747237e-05;-1.3383991245064e-05;-0.00041166562004946;-0.0001762918982422;0.00017634278628975;0.00017132400535047;-2.6744819479063e-06;7.6474234447232e-06;-0.00038899079663679;-0.00049246253911406;-0.0001125025228248;0.00069863349199295;0.00044617283856496;0.00023086783767212;0.00018489961803425;0.00041974461055361;0.00017058041703422;-8.1788297393359e-05;-8.9339417172596e-05;-0.00014179830031935;-0.00014449014270213;-1.6001946278266e-05;-2.2721163986716e-05;-0.00020432133169379;-0.00012289435835555;0.0005346453981474;0.00034787887125276;0.000483028619783;0.00039777546771802;0.00017676861898508;0.00015816384984646;-2.7144303658133e-06;3.4179831800429e-06;0.00016901068738662;0.00013814819976687;0.00025846954667941;0.00022797407291364;-3.8904505345272e-05;-2.8865251806565e-05;0.00038393290014938;0.00077076448360458;-3.8030895666452e-05;-0.00086600542999804;-0.00065568229183555;-0.00031187568674795;-0.00030963536119089;-0.00037072095437907;-0.00031606803531758;-0.00025635861675255;-0.00020870938897133;-0.0002557601837907;-0.00019480939954519;8.1518985098228e-05;4.9858372221934e-05;-0.00093315710546449;0.00092555914307013;0.00072886375710368;-0.00064928567735478;0.00015623324725311;-0.00014360020577442;-3.6122128221905e-05;7.5733485573437e-05;5.3709991334472e-05;-5.7333232689416e-05;0.00011156337131979;-0.00028820626903325;0.0003138828324154;-0.00031071991543286;-9.1033434728161e-06;2.5977986297221e-05;1.8021819414571e-05;4.3957254092675e-05;-2.3618895284017e-05;-0.00048736133612692;0.00038792990380898;0.00018253707094118;-0.00019691755005624;-0.00042630537063815;0.00051812635501847;-0.00012601325579453;7.9455079685431e-05;-7.9646008089185e-05;0.00016761758888606;-7.5544819992501e-05;5.3766205382999e-05;0.00063878094078973;0.00035454795579426;-0.00047218892723322;-0.00027116129058413;-0.00058422196889296;-0.00039272892172448;9.7281394118909e-05;9.9072938610334e-05;-1.2881968359579e-05;-2.073249197565e-05;-0.00051182665629312;-0.00027952957316302;0.00022813904797658;0.00022131134755909;-2.6635236736183e-06;1.0577246030152e-05;-0.00049982464406639;-0.00063761381898075;-0.00015200262714643;0.00086022092727944;0.0006217771442607;0.00029923976399004;0.00024977474822663;0.00051400775555521;0.00028722066781484;-0.00010677648970159;-0.00012079280713806;-0.0001780086022336;-0.00018747546710074;-2.2553995222552e-05;-2.896813020925e-05;-0.00026004211395048;-0.00017287442460656;0.00067293614847586;0.00048519278061576;0.00062984792748466;0.00054217624710873;0.00022570553119294;0.0002105459861923;-4.8403553591925e-06;4.740999884234e-06;0.00021100726735312;0.00018592746346258;0.00032229564385489;0.00030985122430138;-4.4685442844639e-05;-3.9135167753557e-05;0.00051992136286572;0.0010264358716086;-4.5483284338843e-05;-0.0011270404793322;-0.00090149405878037;-0.00041340058669448;-0.00041472693555988;-0.00047130475286394;-0.00043165136594325;-0.00032765467767604;-0.00028188337455504;-0.00031257118098438;-0.00026389001868665;9.9086493719369e-05;6.7007291363552e-05;-0.00093300407752395;0.00088270427659154;0.00073446152964607;-0.00063132250215858;0.00020434714679141;-9.4183968030848e-05;-3.8413581933128e-05;7.1326765464619e-05;5.1440489187371e-05;-5.8491958043305e-05;0.00018545147031546;-0.00021171466505621;0.00031671934993938;-0.00030128264916129;-1.1352902220096e-05;2.5000208552228e-05;2.6335093934904e-05;7.4795643740799e-05;1.7951097106561e-06;-0.00050962984096259;0.00036219303729013;0.00014609955542255;-0.00022868627274875;-0.00049441854935139;0.00044425518717617;-0.00012302835239097;7.9654186265543e-05;-0.00010445734369569;0.00014499979442917;-6.8270688643679e-05;5.6678571127122e-05;0.00052576948655769;0.00043837242992595;-0.0003900064912159;-0.0003409069031477;-0.00052956957370043;-0.00042752324952744;8.6259555246215e-05;0.00010194261267316;-8.4317698565428e-06;-2.4532371753594e-05;-0.00043712061597034;-0.00031413559918292;0.00022163208632264;0.00021388998720795;-3.7154047731747e-06;1.0593050319585e-05;-0.00049345573643222;-0.00063430384034291;-0.00014650129014626;0.00079345871927217;0.0006744479178451;0.00028654182096943;0.0002539744891692;0.0004303919558879;0.00034146261168644;-9.8463060567155e-05;-0.00011872332106577;-0.00017495403881185;-0.00018834647198673;-2.1638492398779e-05;-2.6408521080157e-05;-0.00023725577921141;-0.00017931887123268;0.0006167966639623;0.00050976651255041;0.00059273059014231;0.00054309563711286;0.00021622804342769;0.00021346473658923;-5.3791131904291e-06;5.7213133004552e-06;0.00019807617354672;0.00019361912563909;0.00029999241814949;0.00032405665842816;-4.0894366975408e-05;-4.4344866182655e-05;0.00049366481835023;0.00099287286866456;-4.7617031668779e-05;-0.001053764950484;-0.00090283952886239;-0.00039708748226985;-0.00040488276863471;-0.00043850264046341;-0.00044486267142929;-0.00030918326228857;-0.00028722625575028;-0.00029051979072392;-0.00028126494726166;9.2676244094037e-05;7.2182490839623e-05;-0.00066736072767526;0.00059959816280752;0.00055255799088627;-0.00045874895295128;0.00017404621758033;-2.0262961697881e-05;-2.9479191653081e-05;4.9268335715169e-05;3.5845296224579e-05;-4.3597479816526e-05;0.00015959536540322;-7.080782961566e-05;0.00024238330661319;-0.0002214086271124;-8.6346599346143e-06;1.6385383787565e-05;2.523646253394e-05;7.8118238889147e-05;2.002121800615e-05;-0.0003969527897425;0.00025272608036175;9.1098190750927e-05;-0.00020306803344283;-0.00039552233647555;0.00025529641425237;-9.3854447186459e-05;6.3287807279266e-05;-9.2468595539685e-05;8.7664011516608e-05;-4.7595814976376e-05;4.6633969759569e-05;0.00030434151994996;0.00038462114753202;-0.00023020683147479;-0.00030537761631422;-0.00035451236180961;-0.00034226587740704;5.185161717236e-05;7.3738236096688e-05;-2.642211939019e-06;-2.0859097276116e-05;-0.00025066031957977;-0.00024033927184064;0.00016064694500528;0.00015461730072275;-5.1542942856031e-06;6.6974462242797e-06;-0.0003802272840403;-0.00049175327876583;-9.9686651083175e-05;0.00056408921955153;0.00056176091311499;0.00020617348491214;0.0001937308406923;0.00024136138381436;0.00027683813823387;-6.1845705204178e-05;-8.26033501653e-05;-0.00013460071932059;-0.00014770623238292;-1.3787802345178e-05;-1.6239291653619e-05;-0.0001525468978798;-0.00013366446364671;0.00041278111166321;0.00039604981429875;0.00039653267594986;0.0003924232441932;0.00015585821529385;0.00016408074588981;-3.6029689454153e-06;5.5163509387057e-06;0.00013982527889311;0.00015406930469908;0.00021050711802673;0.00025679607642815;-3.1582374504069e-05;-4.0946284570964e-05;0.00031467666849494;0.00068843469489366;-4.3950134568149e-05;-0.00069686182541773;-0.00064531690441072;-0.00027245833189227;-0.00028439750894904;-0.00029794196598232;-0.00034014176344499;-0.00021476397523656;-0.00021781185932923;-0.00020885569392703;-0.00023245278862305;6.799038965255e-05;6.1754049966112e-05;-0.00053765444317833;0.00054397352505475;0.00042460032273084;-0.00038680681609549;8.8121545559261e-05;-0.00011132931831526;-2.0775503799086e-05;4.4402568164514e-05;3.0729319405509e-05;-3.1995903555071e-05;5.7468074373901e-05;-0.0001966719282791;0.00016545969992876;-0.00017019970982801;-4.1496818994347e-06;1.4646244380856e-05;9.3874978119857e-06;1.7771573766368e-05;-2.0090365069336e-05;-0.00028597450000234;0.00024030001077335;0.00010370206291554;-9.2197362391744e-05;-0.0002330776915187;0.00032794883009046;-6.7433022195473e-05;4.2018760723295e-05;-3.3525131584611e-05;9.6020507044159e-05;-4.2266281525372e-05;2.7597092412179e-05;0.00039652542909607;0.00016870569379535;-0.00030358618823811;-0.00013456304441206;-0.00036737485788763;-0.00022202274703886;5.7761371863307e-05;5.3856354497839e-05;-7.1556678449269e-06;-7.7666254583164e-06;-0.00032921184902079;-0.00015123946650419;0.00012239218631294;0.00012241098738741;-3.1472200134885e-06;2.3046984551911e-06;-0.00029002357041463;-0.00038452670560218;-9.9691787909251e-05;0.00052637024782598;0.00034730060724542;0.00019132572924718;0.00015613762661815;0.0003442112065386;0.00015550109674223;-5.9606270951917e-05;-6.5353640820831e-05;-9.2885798949283e-05;-0.00010207288869424;-1.0814889719768e-05;-1.3760021829512e-05;-0.00014415670011658;-9.1775378677994e-05;0.00038293801480904;0.00025943227228709;0.00035218149423599;0.00029418602935039;0.00012503193283919;0.00011417960922699;-2.6493980840314e-06;1.8625931943461e-06;0.00011334197188262;9.5354604127351e-05;0.00017806906544138;0.00016020773909986;-2.6357387469034e-05;-2.1070920411148e-05;0.00028911090339534;0.00058196525787935;-2.1965191990603e-05;-0.00064175599254668;-0.00049763609422371;-0.00023321504704654;-0.00023404558305629;-0.00026228436036035;-0.00022815678676125;-0.00017980916891247;-0.00014807967818342;-0.00017187518824358;-0.00013439707981888;5.579322896665e-05;3.5575150832301e-05;-0.00081322930054739;0.00079748738789931;0.000606287678238;-0.00054679397726431;0.00017248332733288;-0.00015121899195947;-3.3705709938658e-05;6.3145154854283e-05;4.3740350520238e-05;-4.7449037083425e-05;0.00017013009346556;-0.00028230538009666;0.00022648679441772;-0.00022853034897707;-8.075217010628e-06;2.1665407984983e-05;2.4276139811263e-05;4.1748655348783e-05;-1.4876648492645e-05;-0.00042125777690671;0.00032691704109311;0.00011540180275915;-0.00013476179447025;-0.00040045261266641;0.00045924598816782;-8.6597574409097e-05;5.2320898248581e-05;-6.1816914239898e-05;0.00012489805521909;-5.3942487284075e-05;3.8779013266321e-05;0.00051642919424921;0.00029129302129149;-0.00039059304981492;-0.00023185867758002;-0.00049992627464235;-0.00034124325611629;8.3894075942226e-05;8.6522435594816e-05;-8.0196496128337e-06;-1.2763223821821e-05;-0.00046854745596647;-0.00026444596005604;0.00017140485579148;0.00016975661856122;-3.3102085126302e-06;2.9407508463919e-06;-0.00038779503665864;-0.00051745428936556;-0.00015128043014556;0.00068496138555929;0.00049744237912819;0.0002677436277736;0.00022490996343549;0.00048073765356094;0.00028038313030265;-8.950167830335e-05;-9.8463409813121e-05;-0.00012010023056064;-0.00013769177894574;-1.7093479982577e-05;-1.8330942111788e-05;-0.00020871916785836;-0.00014142961299513;0.000536369450856;0.00038964950363152;0.00051599071593955;0.00044235985842533;0.0001709976058919;0.0001610018662177;-5.4868887673365e-06;2.0626680452551e-06;0.0001501450460637;0.00013186609430704;0.00023607404727954;0.0002260145265609;-2.9416030884022e-05;-2.7324082111591e-05;0.00045437770313583;0.00087101274402812;-1.983634501812e-05;-0.00094654230633751;-0.00076558068394661;-0.00034779997076839;-0.000350501970388;-0.00036761694354936;-0.00033270701533183;-0.00024935224791989;-0.00021291919983923;-0.000217026725295;-0.00018346270371694;6.9884081312921e-05;4.7915964387357e-05;-0.00081643398152664;0.00077379279537126;0.00061095430282876;-0.00053532724268734;0.00020416782354005;-0.00012027464254061;-3.5424403904472e-05;6.0326055972837e-05;4.2614185076673e-05;-4.817014632863e-05;0.00022023118799552;-0.00023499321832787;0.00022927025565878;-0.00022261083358899;-1.0278342415404e-05;2.0516581571428e-05;2.779132410069e-05;6.0311165725579e-05;1.4426066172746e-06;-0.00043416902190074;0.00031196142663248;9.2135887825862e-05;-0.00015496963169426;-0.00044763466576114;0.00041247333865613;-8.4233244706411e-05;5.2895269618602e-05;-7.9001227277331e-05;0.00011013960465789;-4.8800560762174e-05;4.1297411371488e-05;0.00043782076681964;0.0003533587732818;-0.00033218244789168;-0.00028295445372351;-0.00045820412924513;-0.00037005345802754;7.7385520853568e-05;8.9209104771726e-05;-4.888436251349e-06;-1.5763109331601e-05;-0.00041305524064228;-0.00029650013311766;0.00016956921899691;0.00016411163960584;-4.357757006801e-06;3.5185257729609e-06;-0.0003823692095466;-0.00051329884445295;-0.00014803920930717;0.00063564290758222;0.00053446332458407;0.00025654639466666;0.0002296172460774;0.00041723495814949;0.0003265816194471;-8.5042280261405e-05;-9.7819727670867e-05;-0.00012097983562853;-0.00013617570220958;-1.6316858818755e-05;-1.7059179299395e-05;-0.000196746274014;-0.00014528958126903;0.00050235883099958;0.00040688397712074;0.00049550598487258;0.00044481962686405;0.00016587198479101;0.00016255455557257;-5.9940152823401e-06;2.7774831323768e-06;0.00014413794269785;0.00013532653974835;0.00022268612519838;0.00023515388602391;-2.7045207389165e-05;-3.0179249733919e-05;0.00044183657155372;0.00085377128561959;-2.082004903059e-05;-0.00090437708422542;-0.00077144737588242;-0.00033996297861449;-0.00034494852297939;-0.00034876936115324;-0.00034170327126049;-0.000238842505496;-0.00021676512551494;-0.00020443768880796;-0.00019323587184772;6.6269596572965e-05;5.0609778554644e-05;-0.00054196338169277;0.00049768132157624;0.00043192593147978;-0.00036844843998551;0.00014797480253037;-5.2352734201122e-05;-2.4002305508475e-05;3.8916336052353e-05;2.8419157388271e-05;-3.3446900488343e-05;0.00014920266403351;-0.00010644616850186;0.00017029796435963;-0.00015976637951098;-7.4092877184739e-06;1.3190536265029e-05;2.0334822693258e-05;5.3089337598067e-05;1.0610275239742e-05;-0.00031262921402231;0.00021137892326806;6.0271831898717e-05;-0.00013025633234065;-0.00031901299371384;0.00024096119159367;-6.3927371229511e-05;4.2699364712462e-05;-6.4653213485144e-05;6.8783192546107e-05;-3.326014848426e-05;3.1837240385357e-05;0.00025521358475089;0.00027854135259986;-0.00019791234808508;-0.0002268755051773;-0.0002949966583401;-0.00027195506845601;4.4922482629772e-05;5.8538382290863e-05;-1.465235300202e-06;-1.298100414715e-05;-0.00023222350864671;-0.00020295692957006;0.00011779493797803;0.0001125070193666;-4.6758777898503e-06;2.6507414077059e-06;-0.0002823666727636;-0.00037992943543941;-9.3578819360118e-05;0.00043954278226011;0.00041720972512849;0.00017379250493832;0.00016338509158231;0.00023283514019568;0.00023361566127278;-5.0748163630487e-05;-6.3440071244258e-05;-9.231948206434e-05;-0.00010158157965634;-9.8484715636005e-06;-1.069458994607e-05;-0.00012186585809104;-9.7369898867328e-05;0.00032232794910669;0.00028791828663088;0.00031300444970839;0.0002965411695186;0.00011475432984298;0.0001180213293992;-3.3868473110488e-06;3.045217908948e-06;0.00010054396261694;0.00010310733341612;0.00015326064021792;0.00017718446906656;-2.1757528884336e-05;-2.7211450287723e-05;0.00026203496963717;0.00054756010649726;-2.4257589757326e-05;-0.00056275352835655;-0.00050287833437324;-0.00021677529730368;-0.00022375122352969;-0.0002277144085383;-0.00024321548698936;-0.00015970022650436;-0.00015501369489357;-0.00014716792793479;-0.00015462120063603;4.838908353122e-05;4.1747251088964e-05;6.0114256484667e-05;-1.3132546882844e-05;8.8131433585659e-05;2.0948373276042e-05;-0.0010757362470031;-9.3642476713285e-05;-0.00050922477385029;7.8516772191506e-05;0.00076783262193203;-0.00023973266070243;-0.0003825084422715;-4.0366390749114e-05;-0.00014454794290941;-0.00012173088180134;-0.00054711219854653;4.1501512896502e-05;-0.00020097619562875;-0.00048346756375395;-0.00043324998114258;0.00050739687867463;0.00010112825839315;0.00096602831035852;0.00023876478371676;0.00031273573404178;0.00010948337876471;0.00085109291831031;-5.4373763305193e-06;0.00045088867773302;3.3547552447999e-05;-0.00041604260331951;7.8796874731779e-05;-3.7802806218679e-06;-5.2191257964296e-06;0.00030063709709793;0.00019157146743964;-0.00017127339378931;-3.2023599487729e-05;0.00051234412239864;-0.0001513023453299;-0.00022483807697427;0.00021739560179412;-0.00016203995619435;-4.1631537897047e-05;0.00030274273012765;-4.2005009163404e-05;-0.00070329126901925;-0.00011467709555291;-0.00027895215316676;0.00031010835664347;0.00011594483657973;0.00020481417595875;-0.00012326198338997;-0.00057618733262643;-2.1545038180193e-05;-0.00034609888098203;-3.4214819606859e-05;0.00041396537562832;0.00014991151692811;0.00017097555974033;2.8799642677768e-05;7.4484079959802e-05;3.8647380279144e-05;2.9060629458399e-05;8.9932564151241e-06;0.00048655321006663;-7.0812369813211e-05;0.00076030771015212;-0.00024559019948356;-4.3175488826819e-05;-0.00013162425602786;-0.0002277950552525;0.00022319560230244;-0.00035137860686518;-5.5335664228551e-07;0.0010352288372815;-0.00012376060476527;0.0012755043571815;-0.00016739264538046;-0.00020789612608496;-0.0002850059827324;-9.3126560386736e-05;-0.0002994371461682;0.00039936689427122;0.00010709500202211;0.00020087223674636;-0.0007153254118748;6.3607796619181e-05;-0.0010386866051704;0.00021682734950446;0.00047126953722909;2.6590889319777e-05;-0.0014153923839331;0.00011247950897086;6.3325504015666e-05;-1.2018445886497e-05;0.00012543158663902;2.4603767087683e-05;-0.0011176189873368;-0.00012967496877536;-0.00053012592252344;4.2560572182992e-05;0.00078641896834597;-0.00020631497318391;-0.00037853277171962;-4.5827131543774e-05;-6.1060047300998e-05;-0.0001499833597336;-0.00057760230265558;1.1059038115491e-05;-0.00024358746304642;-0.00054405460832641;-0.00045850014430471;0.0005645583732985;0.00013121984375175;0.0010218882234767;0.00028662144904956;0.00023100789985619;0.00012481032172218;0.00087781413458288;3.9880444091978e-05;0.00044571896432899;4.0446488128509e-05;-0.00046245340490714;9.9988916190341e-05;-1.8925330778075e-06;-9.232048796548e-06;0.00030318586505018;0.00020560555276461;-0.00010608274169499;-1.9144225007039e-05;0.00059736589901149;-0.00018366146832705;-0.00036162519245408;0.00028913543792441;-0.00018002720025834;-3.7952442653477e-05;0.00026692132814787;-5.0122303946409e-05;-0.00062603771220893;-0.00015024206368253;-0.00027766212588176;0.00039327231934294;0.00018575269496068;0.00017211819067597;-0.00014849474246148;-0.00070808752207085;-6.959585880395e-05;-0.00032723069307394;-4.6653887693537e-05;0.00035363723873161;0.00018570304382592;0.0002046103036264;2.9981560146553e-05;6.6824533860199e-05;4.9630805733614e-05;2.5253779313061e-05;1.1918534255528e-05;0.00051322364015505;-7.312744128285e-05;0.0008703675121069;-0.00024730374570936;1.918398993439e-06;-0.00012610750854947;-0.00023298883752432;0.000218396744458;-0.00033712774165906;-1.9087617602054e-06;0.001126112183556;-0.0001161065447377;0.0013291244395077;-0.00015866951434873;-0.00021273172751535;-0.00027479461277835;-0.00010062722139992;-0.00033689037081786;0.00040878762956709;5.8567438827595e-05;0.00020953605417162;-0.00079602305777371;6.1412603827193e-05;-0.0011518582468852;0.00020526697335299;0.00046143314102665;2.8008153094561e-05;-0.0014689301606268;0.00010586826101644;5.2670111472253e-05;-9.3914513854543e-06;0.00011668534716591;1.9131828594254e-05;-0.00088358495850116;-0.00012732124014292;-0.00042122908052988;-1.5843145320105e-06;0.00059768656501547;-0.00011816526966868;-0.00029066865681671;-3.7546320527326e-05;1.8170343309976e-06;-0.00014118303079158;-0.00043865211773664;-2.3806311219232e-05;-0.00021371997718234;-0.00046222269884311;-0.00036556631675921;0.00047168377204798;0.00012353083002381;0.00082571979146451;0.00025345818721689;0.00013256182137411;0.00010822018521139;0.00067769142333418;7.4336850957479e-05;0.00034322746796533;3.6076107789995e-05;-0.00039762968663126;9.7774151072372e-05;5.0643098603587e-08;-9.9689541457337e-06;0.00024169140669983;0.00016747883637436;-1.9186596546206e-05;-2.7287658213027e-06;0.00051985582103953;-0.00015819077088963;-0.00037556645111181;0.00026716050342657;-0.00016067898832262;-2.7323543690727e-05;0.00018911127699539;-4.6335091610672e-05;-0.00040995259769261;-0.00013741142174695;-0.00021279026987031;0.00036823604023084;0.00019627687288448;9.7841882961802e-05;-0.00013097806368023;-0.00064354616915807;-9.6755829872563e-05;-0.00024159655731637;-4.3419015128165e-05;0.00021010429190937;0.00016468377725687;0.00019565731054172;2.5458213713137e-05;2.6381572752143e-05;4.6440622099908e-05;1.6089552445919e-05;1.208982848766e-05;0.00041134771890938;-5.8765726862475e-05;0.00075067253783345;-0.0001886147656478;2.7442423743196e-05;-9.2111840785947e-05;-0.00017844984540716;0.00016271880303975;-0.00023985192819964;-1.9823212369374e-06;0.00093992869369686;-8.1122409028467e-05;0.0010584681294858;-0.00011345687380526;-0.00016840246098582;-0.00021247113181744;-8.2209131505806e-05;-0.0002813805185724;0.0003246525011491;1.6489630070282e-05;0.0001674837549217;-0.00067802803823724;4.3204625399085e-05;-0.00096573133487254;0.000146178441355;0.00033798685763031;2.245448922622e-05;-0.0011693568667397;7.4727337050717e-05;7.9962404697653e-07;-3.4751839848468e-05;8.9727325303102e-07;-0.00010330123768654;0.00011242853361182;0.00084440532373264;-6.3479179516435e-05;0.00049234047764912;0.00021623018255923;-0.00069961231201887;6.5658248786349e-05;0.00026808065013029;0.0001403971837135;-1.3584281987278e-05;-4.5927277824376e-05;0.00046190503053367;0.00017193470557686;0.00041484425310045;0.00035287390346639;-0.00010165871935897;-0.00040330158662982;-0.00019445533689577;-0.00085163029143587;-0.00015790403995197;-0.00014680559979752;-5.9529343161557e-06;-0.00066460116067901;-5.5234540923266e-05;-0.00032784257200547;-6.3305436924566e-05;0.00039055294473656;-8.4457042248687e-06;2.1415185074147e-06;0.00017207370547112;0.00020913853950333;-5.1822382374667e-05;-8.1519159721211e-05;-0.00016826127830427;0.00062925228849053;0.00027672181022353;-0.00037706093280576;-2.1283471141942e-05;-0.00013067525287624;-5.7915447541745e-05;0.00019384443294257;-0.0001574777852511;-0.00048092429642566;-0.00022020871983841;0.00031793207745068;0.00012285984121263;-0.00011241751781199;0.00014049059245735;-2.0499976017163e-05;-0.00062712968792766;-4.1169572796207e-05;-0.00019054910808336;0.00019953389710281;0.00018295015615877;1.9424571291893e-05;0.00011905487917829;5.7065499277087e-05;0.00010487640975043;1.8918897694675e-05;6.9678258114436e-06;-8.7976863142103e-05;0.00036698652547784;-0.00022335082758218;0.00064892659429461;-7.3192837589886e-05;1.4993188415247e-05;0.00014784361701459;-0.00017908703011926;-1.0434079740662e-05;-0.00024157266307157;-0.00011419911606936;0.00079764175461605;-0.00011773074947996;0.0010412005940452;-0.00014368783740792;-0.00019691277702805;-8.9018205471803e-05;0.00034500009496696;-0.00029322810587473;0.0001540520315757;3.9950635255082e-05;8.7303553300444e-05;-0.00052217900520191;0.00016458197205793;-0.00087755348067731;2.8918610041728e-05;0.00034722991404124;8.6871303210501e-05;-0.0011272635310888;2.6105719825864e-06;-4.6428071073024e-05;-2.9665297915926e-06;-0.00012756860814989;0.00012406309542712;0.0011468124575913;-0.00012026989134029;0.00066278863232583;0.00033628795063123;-0.00097750639542937;8.6507621745113e-05;0.00037894878187217;0.00016464060172439;2.9010245270911e-05;-9.4629314844497e-05;0.00064571085385978;0.00021601202024613;0.00053178338566795;0.00048301424249075;-0.00011577005352592;-0.00052484049228951;-0.00024085611221381;-0.0011406645644456;-0.00020014992333017;-0.00024558929726481;3.7838664866285e-05;-0.00091491627972573;-6.9119174440857e-05;-0.00046214589383453;-6.7612592829391e-05;0.00050500413635746;-6.9379802880576e-06;-2.6945795639222e-07;0.00023081910330802;0.00028710809419863;-8.0210193118546e-05;-0.00018342316616327;-0.00020646340271924;0.0007959715439938;0.00032362210913561;-0.00039985752664506;-3.7356294342317e-05;-0.00015586099470966;-6.9040434027556e-05;0.00029046082636341;-0.00018602948694024;-0.00076777173671871;-0.00031085591763258;0.0003750313189812;0.00011356268805685;-0.00014044098497834;0.00023326573136728;1.0118443242391e-05;-0.00075981777627021;-4.5334938477026e-05;-0.00028443761402741;0.00024146765645128;0.00033828898449428;2.6956189685734e-05;0.00012393583892845;6.6413173044566e-05;0.00017708621453494;2.282383502461e-05;1.3390639651334e-05;-0.00011974431981798;0.00049915350973606;-0.00031531511922367;0.00083184719551355;-0.00010903975635301;-8.2239448602195e-06;0.00021533539984375;-0.00025456899311393;-1.3529090210795e-05;-0.00035905936965719;-0.00016813122783788;0.001042184070684;-0.00017546438903082;0.0014233966358006;-0.00019681267440319;-0.00027640804182738;-0.00011762356734835;0.00047328416258097;-0.00038950107409619;0.00020972988568246;8.5696134192403e-05;0.00012520021118689;-0.00066945428261533;0.000244644790655;-0.0011476373765618;3.9508482586825e-05;0.00050663243746385;0.00012859700655099;-0.0015409111510962;5.5745781537553e-06;-4.6492212277371e-05;-1.4961825627324e-06;-0.00010384836787125;9.4311239081435e-05;0.0011041895486414;-0.00014077917148825;0.00064832787029445;0.0003491009993013;-0.00094775133766234;7.7753415098414e-05;0.00039042005664669;0.00014176848344505;9.0751076641027e-05;-0.00011051397450501;0.00059323920868337;0.0001852721470641;0.0004891284625046;0.00046155785094015;-9.5610150310677e-05;-0.00047835943405516;-0.00020558854157571;-0.0010985221015289;-0.00018130299577024;-0.00030318406061269;6.7225999373477e-05;-0.00087856932077557;-6.0960202972637e-05;-0.00047832675045356;-5.4791587899672e-05;0.00048747545224614;-2.4959554139059e-06;-2.8029389795847e-06;0.0002199062728323;0.00029408183763735;-8.7612046627328e-05;-0.00023181686992757;-0.00017189449863508;0.00071050022961572;0.00025346869369969;-0.00027118952129968;-4.5453758502845e-05;-0.00014760467456654;-6.0233287513256e-05;0.00032411186839454;-0.00014827883569524;-0.00082978891441599;-0.00031472538830712;0.00031391865923069;5.7110431953333e-05;-0.00012066037743352;0.00025246228324249;4.1474060708424e-05;-0.00064717454370111;-3.062142059207e-05;-0.00030533649260178;0.000201189526706;0.00038975046481937;2.8422040486475e-05;0.00010692597425077;5.3773786930833e-05;0.00017059342644643;2.0663881514338e-05;1.5753794286866e-05;-0.00012078681174899;0.00048564333701506;-0.0003151424753014;0.00076785101555288;-0.00011434636689955;-6.0522939747898e-05;0.00022079434711486;-0.00025047326926142;-1.1086647646152e-05;-0.000369168643374;-0.0001746557536535;0.00098734337370843;-0.00018414662918076;0.0014007781865075;-0.00019376951968297;-0.00029477616772056;-0.00010732446389738;0.00047516063204966;-0.00036937175900675;0.00020110070181545;0.00013575179036707;0.00012569430691656;-0.00062501191860065;0.00025625390117057;-0.001077079679817;3.8300629967125e-05;0.0005165827460587;0.00013440442853607;-0.0015144139761105;7.3286675615236e-05;-2.700310506043e-05;-5.7726803788682e-05;-1.3836395737599e-05;-0.0010395613498986;-1.8231788999401e-05;-0.00059515691827983;8.9668144937605e-05;0.00057134596863762;-0.00017765205120668;-0.00048289092956111;-5.8621067182685e-06;-0.00050579378148541;-0.00010439348989166;-0.0001327231148025;1.3924027371104e-05;-7.4171606684104e-05;-0.00041466552647762;-0.00031676320941187;0.00036997732240707;7.5662064773496e-05;0.00098565395455807;9.162952483166e-05;0.00071384414331988;7.2915463533718e-05;0.00071505166124552;-6.0605111684708e-06;0.00060137384571135;1.3754744031758e-05;-0.00049814028898254;8.2545397162903e-05;-7.5382462227935e-07;-2.9900318168075e-06;0.00042657411540858;0.00015135723515414;-9.999236499425e-05;-7.8086464782245e-05;0.00034864261397161;-6.1669787100982e-05;2.6015100957011e-05;6.8821143941022e-05;-0.00033095490653068;-4.5490025513573e-05;0.00053517357446253;-4.5161355956225e-05;-0.00057099282275885;-5.1661616453202e-05;-0.00028973349253647;0.00018749652372207;-3.2505282433704e-05;9.5969138783403e-05;-2.5912628188962e-05;-0.00032179456320591;4.1798612073762e-05;-0.00042079034028575;3.3786250241974e-06;0.00023170883650891;8.6942091002129e-05;0.00035713144461624;2.7544801923796e-05;-0.00024467741604894;3.4613036405062e-05;2.823398426699e-05;1.5111328139028e-05;0.00043328653555363;-9.9726035841741e-05;0.00067812472116202;-0.00026333786081523;-0.00021632754942402;-0.00015497095591854;-0.00018157693557441;0.00022821265156381;-0.00027168481028639;8.2962515079998e-08;0.0010600802488625;-0.00015440424613189;0.0012498024152592;-0.00018429406918585;-0.00020550977205858;-0.00042313459562138;-7.8316086728591e-05;-0.00022634645574726;0.00045819915249012;0.00028020364698023;0.00021592857956421;-0.00072639586869627;8.0696932855062e-05;-0.00093830825062469;0.00025006977375597;0.00038299703737721;3.2471187296323e-05;-0.0014001472154632;0.00013097950431984;9.0966932475567e-05;-2.6935551431961e-05;3.7580572097795e-05;-8.9891491370508e-06;-0.0012984236236662;-9.101525938604e-05;-0.00075311330147088;7.420501060551e-05;0.00078392465366051;-0.00020966703596059;-0.00057172437664121;-2.4696870241314e-05;-0.00036707360413857;-0.00017106322047766;-0.0002624909975566;-5.5787108976801e-06;-0.00018344442651141;-0.00061209057457745;-0.00044937629718333;0.00054028572048992;0.00015534242265858;0.001284851343371;0.00020514834614005;0.00062714837258682;0.00012269485159777;0.00090287800412625;4.2677409510361e-05;0.00070211663842201;3.3318581699859e-05;-0.00069401174550876;0.00012655583850574;-7.9196547631e-07;-8.2010246842401e-06;0.00051275943405926;0.00021361569815781;-0.00010564513650024;-6.8144785473123e-05;0.00051955285016447;-0.00012536162103061;-0.0001492624724051;0.00018396446830593;-0.00039232475683093;-5.0815226131817e-05;0.00055310822790489;-5.7366389228264e-05;-0.00065056205494329;-0.00010979558282997;-0.0003647924750112;0.00032786288647912;6.4267616835423e-05;0.00012538241571747;-7.4162075179629e-05;-0.00055557437008247;-1.5217932741507e-05;-0.00049020769074559;-2.2967538825469e-05;0.00030261414940469;0.00015226799587253;0.00044624469592236;3.4309850889258e-05;-0.00024563306942582;5.0875900342362e-05;2.6124615033041e-05;2.20153688133e-05;0.00058626139070839;-0.00012422047439031;0.0010323269525543;-0.00033428164897487;-0.00015929898654576;-0.00018744947738014;-0.00026085018180311;0.00028843688778579;-0.00032501143869013;-1.0858492487387e-06;0.0014312276616693;-0.00017822900554165;0.0016389025840908;-0.000222367074457;-0.00025466622901149;-0.00047865486703813;-0.00010990051669069;-0.00036187347723171;0.00057036394719034;0.00023849478748161;0.00028156299958937;-0.0010150281013921;9.7594362159725e-05;-0.0013730205828324;0.00029856959008612;0.00047312246169895;3.9184542401927e-05;-0.0017915439093485;0.00015329367306549;8.7711217929609e-05;-2.1229156118352e-05;9.6413314167876e-05;-4.591774995788e-06;-0.0012365939328447;-0.00014236778952181;-0.00071084033697844;2.1357067453209e-05;0.00076665525557473;-0.00015821745910216;-0.00050143344560638;-3.571537672542e-05;-0.00017876087804325;-0.00020556157687679;-0.00030982389580458;-4.2618910811143e-05;-0.00023662993044127;-0.00065554236061871;-0.00046080735046417;0.00058449781499803;0.00018962951435242;0.0012551702093333;0.00026853260351345;0.00041692945524119;0.00014469985035248;0.00085835170466453;0.00010163236584049;0.00061443634331226;4.5589342335006e-05;-0.00069950200850144;0.00014863019168843;1.5121909768823e-07;-1.212627375935e-05;0.00047227583127096;0.00022034204448573;-3.6893165088259e-05;-3.5981505789096e-05;0.00057647126959637;-0.0001563109253766;-0.00031518618925475;0.0002596513077151;-0.00037199578946456;-4.304471440264e-05;0.00044290730147623;-6.103756459197e-05;-0.0005188012146391;-0.00014357011241373;-0.00034101202618331;0.00040978525066748;0.00016368841170333;9.2480906459969e-05;-0.00010498388292035;-0.00068156485212967;-8.9991917775478e-05;-0.00042844630661421;-4.2606417991919e-05;0.00024023417790886;0.00018294977780897;0.00045100355055183;3.4957152820425e-05;-0.00022122130030766;5.7875942729879e-05;1.6838650481077e-05;2.5178360374412e-05;0.0005748572293669;-0.00011638143041637;0.0011111740022898;-0.00031202170066535;-6.436347757699e-05;-0.00016734941164032;-0.00025626487331465;0.00026462064124644;-0.00027096559642814;-2.7644794045045e-06;0.0014454227639362;-0.0001499664504081;0.0015815482474864;-0.00019350968068466;-0.0002409987791907;-0.00042416027281433;-0.00011738605098799;-0.00038407574174926;0.00053573329932988;0.00013865144865122;0.00027985175256617;-0.001050612423569;8.5549014329445e-05;-0.0014303445350379;0.00025800129515119;0.00041417838656344;3.6681241908809e-05;-0.0017176910769194;0.00013056975149084;6.9988571340218e-05;-1.4322995411931e-05;0.00010408320667921;-3.3579406135686e-06;-0.00093460909556597;-0.00014778015611228;-0.0005280232289806;-3.0694252927788e-05;0.00056703755399212;-6.700366793666e-05;-0.0003479637671262;-3.4032134863082e-05;-3.3836662623798e-05;-0.00019575878104661;-0.00025021671899594;-7.365665078396e-05;-0.00021785360877402;-0.00054704875219613;-0.00036537350388244;0.00049348903121427;0.00017124392616097;0.00097104924498126;0.00025249147438444;0.00020777704776265;0.00013213769125286;0.00063266471261159;0.0001360528258374;0.00042561531881802;4.5396340283332e-05;-0.00055920332670212;0.00014170828217175;6.8635642946901e-07;-1.1851941962959e-05;0.00035050243604928;0.00017861048399936;4.0990624256665e-05;-6.3946276895877e-07;0.00049693323671818;-0.00013603649858851;-0.00036498310510069;0.0002472928899806;-0.00028627371648327;-3.0640156182926e-05;0.00028589580324478;-5.4194693802856e-05;-0.00030129181686789;-0.00013033856521361;-0.00025354235549457;0.0003907949430868;0.00020652427338064;3.8403733924497e-05;-0.00010377223952673;-0.00063771783607081;-0.00013784333714284;-0.00030086655169725;-4.5318200136535e-05;0.00012246632832102;0.00015981419710442;0.00037452855031006;3.1740288250148e-05;-0.00018019533308689;5.0321621529292e-05;6.7172964008932e-06;2.3061760657583e-05;0.00044117038487457;-8.6449312220793e-05;0.00093214225489646;-0.00022489095863421;8.8114120444516e-06;-0.00011642063327599;-0.00019321394211147;0.00019005833019037;-0.00016456203593407;-2.0583045170497e-06;0.0011621217709035;-9.2512200353667e-05;0.0012037673732266;-0.0001284085738007;-0.00018429414194543;-0.0003095316933468;-9.8029959190171e-05;-0.00030879347468726;0.0004032617143821;4.7515604819637e-05;0.00022068289399613;-0.0008620964945294;5.3365991334431e-05;-0.001163394190371;0.00016831541142892;0.00027170040993951;2.6357456590631e-05;-0.0013078000629321;8.3405844634399e-05;4.9489535740577e-05;-9.328705345979e-06;6.1124002968427e-05;-1.1306450687698e-05;-0.00054737343452871;-0.00010786182247102;-0.00032720254966989;-5.3886957175564e-05;0.00029328663367778;1.3821330867358e-05;-0.00019111634173896;-2.2149113647174e-05;1.2431049981387e-05;-0.00015777951921336;-7.9322220699396e-05;-8.472180343233e-05;-0.00014242631732486;-0.00036482134601101;-0.00021129577362444;0.00031983698136173;0.00012435198004823;0.00060957769164816;0.00016317362315021;9.3597125669476e-05;9.8064374469686e-05;0.00032857380574569;0.00013360554294195;0.00023675741977058;3.7265155697241e-05;-0.00037991406861693;0.00011555015953491;-4.7412047621265e-08;-7.8056646088953e-06;0.00023455380869564;0.00011127442849101;8.2551356172189e-05;1.9297702237964e-05;0.00029182469006628;-7.1449627284892e-05;-0.00026153173530474;0.00014821221702732;-0.0002063750725938;-1.8977983927471e-05;0.00017217785352841;-3.8459660572698e-05;-7.7394935942721e-05;-7.5370204285719e-05;-0.00015833642100915;0.00026753352722153;0.00016879702161532;-1.3876671800972e-05;-5.8329689636594e-05;-0.000415616115788;-0.000138439485454;-0.00018303348042537;-3.3159987651743e-05;6.2271396927827e-06;9.3443253717851e-05;0.00029985909350216;2.5722269128892e-05;-0.00019441074982751;3.1140509236138e-05;-3.5100633795082e-06;2.0030362065881e-05;0.00025672683841549;-5.716628220398e-05;0.00064229272538796;-0.00013090978609398;3.6183955671731e-05;-6.910025695106e-05;-0.00011493964120746;0.00011268493108219;-3.1227948056767e-05;-3.7783649986523e-07;0.00077752693323418;-4.0217717469204e-05;0.00072618474951014;-6.6203894675709e-05;-0.00011244598135818;-0.00020889213192277;-6.7691558797378e-05;-0.00018545570492279;0.00025500258198008;3.38123209076e-06;0.00015258649364114;-0.0005927862948738;2.3918913939269e-05;-0.00076953234383836;8.398549107369e-05;9.1174188128207e-05;1.4286593795987e-05;-0.00078496034257114;3.945183561882e-05;2.8711642698909e-06;-3.2730738894315e-05;3.9106453186832e-05;-4.5547712943517e-05;9.7043171990663e-05;0.00048860948299989;4.8485867409909e-06;0.00040413756505586;6.2255676311906e-05;-0.00034972638241015;3.5176763049094e-05;0.0001812183909351;0.00015396943490487;-4.5906658669992e-06;3.0834420613246e-05;4.9809645133791e-05;9.2680689704139e-05;0.00032808713149279;0.00017793776351027;-0.00011847147106891;-0.00023721712932456;-0.00010668126924429;-0.00062413763953373;-0.00013085169484839;-0.00011701139010256;-8.5129009676166e-05;-0.00030917432741262;-4.803718184121e-05;-0.00024011949426495;-8.4830935520586e-05;0.00038567071896978;-7.8892153396737e-06;4.3095992623421e-06;0.00010660284169717;0.00021109057706781;-2.1393861970864e-05;1.3559527360485e-05;-7.9412093327846e-05;0.00031631786259823;0.00014611693040933;-0.00022688269382343;-9.8858390629175e-06;-0.00019911005801987;-4.5780201617163e-05;0.00017170194769278;-8.6431376985274e-05;-0.0001077441702364;-0.00016068549302872;0.0002065709704766;0.00010207070590695;-3.2507799915038e-05;1.4085720067669e-05;-7.0025351305958e-05;-0.00034798253909685;-3.0980841984274e-05;-0.00012719588994514;0.00011618455755524;6.8464885316644e-07;1.8002250726568e-05;0.00024945201585069;3.8049973227317e-05;-0.00016089268319774;2.3857655833126e-05;-7.4212371146132e-06;-8.019020606298e-05;0.00022746819013264;-0.00015057365817484;0.00052675802726299;-5.134314778843e-05;-1.6468824469484e-05;9.5782161224633e-05;-0.00010164615378017;-4.6356990424101e-06;-5.3034469601698e-05;-6.6235828853678e-05;0.00064352521440014;-7.0799156674184e-05;0.00069860409712419;-9.403498552274e-05;-0.00020524006686173;-6.4716034103185e-05;0.00027238935581408;-0.0001884436205728;0.00012544576020446;6.1266247939784e-05;5.5359181715176e-05;-0.00045742024667561;9.8645643447526e-05;-0.00066385703394189;1.7196838598466e-05;0.00011495374201331;5.1133549277438e-05;-0.00073632533894852;5.0502799240348e-06;-4.6026209020056e-05;3.9006354199955e-05;-8.2050952187274e-05;0.00012598061584868;0.00080427923239768;-3.2719122827984e-05;0.00060883397236466;0.00015642936341465;-0.00061587418895215;5.4706062655896e-05;0.00030656016315334;0.00019216418149881;2.1229585399851e-05;3.8764437704231e-06;0.00019069718837272;0.00014783952792641;0.00047590315807611;0.00030608760425821;-0.00015450276259799;-0.00036781473318115;-0.00016362690075766;-0.00095373683143407;-0.00017817861225922;-0.00020778203906957;-7.0109847001731e-05;-0.00055606500245631;-6.2748193158768e-05;-0.00039705217932351;-0.00010131080489373;0.00055095460265875;-9.8456530395197e-06;4.2786418816831e-06;0.00016835298447404;0.00030278498888947;-5.1713475841098e-05;-4.0530339902034e-05;-0.00013201704132371;0.00052978715393692;0.00022763737069909;-0.00031629088334739;-2.1541471141973e-05;-0.00025705393636599;-6.4407140598632e-05;0.00026953598717228;-0.00013548231800087;-0.0003213491581846;-0.00024868600303307;0.0003031118249055;0.00011550963972695;-6.6352688008919e-05;7.2213108069263e-05;-5.463917113957e-05;-0.00053976912749931;-3.8306432543322e-05;-0.00021103190374561;0.00017989712068811;8.9333116193302e-05;2.4170292817871e-05;0.00029407982947305;5.6883382058004e-05;-0.00012855873501394;3.0090561267571e-05;-3.1258357466868e-06;-0.00011794840247603;0.00037164631066844;-0.00024389570171479;0.00075923418626189;-8.4465922554955e-05;-4.547100252239e-05;0.00015696266200393;-0.00017064806888811;-8.770990461926e-06;-0.00016047840472311;-0.00012061622692272;0.00093716394621879;-0.00012404513836373;0.0011137679684907;-0.00014865746197756;-0.00029218554846011;-9.1311478172429e-05;0.00041393292485736;-0.0003029000654351;0.00018018094124272;0.0001062957016984;9.4812057795934e-05;-0.00064560968894511;0.00017549101903569;-0.0009866637410596;3.0122142561595e-05;0.00026600912678987;9.0991241449956e-05;-0.0011799071216956;1.0977008059854e-05;-6.5885666117538e-05;3.8606693124166e-05;-0.00010602080874378;0.00013539928477257;0.0012460396392271;-0.00010999719961546;0.00089587166439742;0.00031344400485978;-0.00099068321287632;7.6272342994343e-05;0.00049439404392615;0.00022599461954087;0.00012691262236331;-5.5212218285305e-05;0.00037591237924062;0.00019954894378316;0.00065299827838317;0.00047640793491155;-0.00018201128114015;-0.00052809558110312;-0.00021288912103046;-0.0014018396614119;-0.00022992168669589;-0.00040150157292373;-1.5365803847089e-05;-0.00090576586080715;-7.7857876021881e-05;-0.0006331997574307;-0.00011158967390656;0.00075905752601102;-8.5358869910124e-06;1.8402762407277e-06;0.00024937419220805;0.00044338309089653;-0.00010415841825306;-0.00016568436694797;-0.0001814271818148;0.00076425680890679;0.00028888255474158;-0.00033547048224136;-4.5109467464499e-05;-0.0003326938895043;-8.4254730609246e-05;0.00044434968731366;-0.00017652030510362;-0.00069371564313769;-0.00038339153979905;0.00038468904676847;8.6389438365586e-05;-9.4818671641406e-05;0.0001784249470802;-3.2567904781899e-06;-0.00071655568899587;-3.723417466972e-05;-0.00035461474908516;0.00024090663646348;0.00026936261565425;3.4235308703501e-05;0.0003434335521888;7.3914758104365e-05;-8.6000974988565e-05;3.750425457838e-05;5.5010873438732e-06;-0.00017259996093344;0.00056984514230862;-0.00038346965448;0.001040302682668;-0.00013884689542465;-0.00011924463615287;0.00025314852246083;-0.00027072831289843;-1.3975119145471e-05;-0.00032535858917981;-0.0002072524803225;0.0013211525510997;-0.00021053562522866;0.0016948733245954;-0.00022782637097407;-0.00043254482443444;-0.000126015234855;0.00062014412833378;-0.00044779575546272;0.00025875907158479;0.00020587342442013;0.0001551892637508;-0.00088278378825635;0.00029933580663055;-0.0013945753453299;4.8415844503324e-05;0.00049357500392944;0.00015539504238404;-0.0018054626416415;1.8369537428953e-05;-7.1813548856881e-05;3.9502221625298e-05;-7.3699418862816e-05;9.313222108176e-05;0.0013056804891676;-0.00014922927948646;0.0009558645542711;0.00035358584136702;-0.0010224145371467;6.4616368035786e-05;0.00056570861488581;0.00020044624397997;0.0002610070805531;-8.1928876170423e-05;0.00032823809306137;0.00016656302614138;0.00063794298330322;0.00047845437075011;-0.00016021826013457;-0.00050283939344808;-0.00017006685084198;-0.0014596652472392;-0.00020910897001158;-0.00055106118088588;3.0320736186695e-05;-0.00094648223603144;-6.6732471168507e-05;-0.00072679505683482;-9.8552540293895e-05;0.00079117540735751;-3.4605332075444e-06;-8.5469287114393e-07;0.00025143442326225;0.00048866803990677;-0.00013224204303697;-0.00022979581262916;-0.00015248608542606;0.00072922074468806;0.00022246838489082;-0.00019185863493476;-6.0012134781573e-05;-0.00035025354009122;-8.1657904956955e-05;0.0005403570830822;-0.00014401596854441;-0.00083286501467228;-0.00041501794476062;0.0003359162947163;6.6526467890071e-06;-7.5393450970296e-05;0.00020938104717061;5.1868730224669e-05;-0.00063192425295711;-1.4462370927504e-05;-0.00041393144056201;0.00021070062939543;0.00033895374508575;3.7890476960456e-05;0.0003414508246351;6.5659201936796e-05;-0.00010039049084298;3.6316156183602e-05;1.1390899089747e-05;-0.00018783054838423;0.00060104770818725;-0.00041335338028148;0.001022310461849;-0.00015609519323334;-0.00021985075727571;0.00027702984516509;-0.0002797888009809;-1.2269843864487e-05;-0.00037993752630427;-0.00023718703596387;0.0013451293343678;-0.00023946663714014;0.0018043644959107;-0.00024341026437469;-0.00049272988690063;-0.00011693107080646;0.0006738428492099;-0.00045679620234296;0.00026030954904854;0.00030426710145548;0.00016995215264615;-0.00088329531718045;0.00034173019230366;-0.0013958819909021;5.2416580729187e-05;0.00056229962501675;0.00017762299103197;-0.0019252054626122;2.1916390323895e-05;-5.8556241128827e-05;3.5839038901031e-05;5.7290740187455e-06;2.3521000912297e-05;0.00096895074239001;-0.00012568812235259;0.00073271506698802;0.00025737314717844;-0.00070822262205184;2.9438069759635e-05;0.00045720426714979;0.00012736338248942;0.00035197028773837;-6.4257459598593e-05;0.0001397051528329;7.0142581535038e-05;0.00043699331581593;0.00032006119727157;-9.0164787252434e-05;-0.00032868367270567;-7.0879250415601e-05;-0.0010817538714036;-0.00012819004768971;-0.00056454539299011;4.3689484300558e-05;-0.00068663613637909;-3.6409292079043e-05;-0.00059746816987172;-6.6525964939501e-05;0.00058536883443594;1.0130183909496e-06;-1.4788038242841e-06;0.00017374464368913;0.00039767692214809;-0.00011806025577243;-0.00018064850883093;-7.7514952863567e-05;0.00047277414705604;9.5863884780556e-05;-1.4035915228305e-05;-5.3382791520562e-05;-0.00029153065406717;-6.0959373513469e-05;0.00048595500993542;-7.3028670158237e-05;-0.00065129506401718;-0.00031743349973112;0.00019872080883943;-5.8420326240594e-05;-2.5412433387828e-05;0.00014336514868774;7.1790156653151e-05;-0.00036812483449467;1.1810817341029e-05;-0.00034083463833667;0.00012355828948785;0.00024590457906015;3.1061357731232e-05;0.00027884618612006;4.2206036596326e-05;-0.00014213028771337;2.6839767087949e-05;1.2002310540993e-05;-0.00014812761219218;0.00043809143244289;-0.00031343378941528;0.00069685583002865;-0.00012213304580655;-0.00025452679255977;0.00020767813839484;-0.00018714171892498;-8.2164160630782e-06;-0.00028965208912268;-0.00019032557611354;0.00097943574655801;-0.00018717901548371;0.0013401720207185;-0.00018562440527603;-0.00041791913099587;-7.8685487096664e-05;0.00052527780644596;-0.00031240138923749;0.00018999871099368;0.00031358635169454;0.00013205932918936;-0.00063449202571064;0.0002696629089769;-0.00096260133432224;4.1332699765917e-05;0.00042695092270151;0.00014125877351034;-0.0014487429289147;9.7127966000699e-05;-4.0451559470966e-05;-0.00021540172747336;-3.9067836041795e-05;-0.0012967385118827;3.5056702472502e-05;-0.0008143171435222;8.7242820882238e-05;0.00053332315292209;-0.00014217081479728;-0.00058177777100354;1.5547726434306e-05;-0.00089676684001461;-0.0001271013461519;0.00010360616579419;-1.9989269276266e-05;-7.2813163569663e-06;-0.00048758756020106;-0.00027267728000879;0.00042356114136055;7.2481212555431e-05;0.0012303327675909;5.9748922467406e-06;0.0011431218590587;6.1678831116296e-05;0.00084226473700255;1.7660797311692e-05;0.00076475407695398;8.4550601968658e-06;-0.00061087153153494;0.00011001063103322;8.5272148453441e-07;-6.6239072111784e-06;0.00060933385975659;0.0001455804303987;1.0789303814818e-05;-0.00011868440924445;0.00030524443718605;-3.8309288356686e-05;8.2149337686133e-05;5.2296989451861e-05;-0.00058461434673518;-4.3659645598382e-05;0.00076407025335357;-6.1429665947799e-05;-0.00037078734021634;-6.0944468714297e-05;-0.00033168549998663;0.00017331018170808;-8.9237284555566e-05;-4.1109491576208e-05;4.6381639549509e-05;-0.0002318929618923;4.6602985094069e-05;-0.00049573462456465;1.6672365745762e-05;1.3074301932647e-05;9.8941171017941e-05;0.00067200575722381;2.4526749257348e-05;-0.00064096442656592;5.38449457963e-05;2.2883208657731e-05;3.0746297852602e-05;0.00045016303192824;-0.00014768229448237;0.00085639837197959;-0.00034339772537351;-0.00029079482192174;-0.00020307493105065;-0.00017539634427521;0.00026396694011055;-0.00016112963203341;-1.035343757394e-05;0.0013817147118971;-0.00020998957916163;0.0014307227684185;-0.00021840468980372;-0.00022895571601111;-0.00059595453785732;-0.00010765335900942;-0.0002204423508374;0.00057958310935646;0.00037389027420431;0.00031243768171407;-0.00096717657288536;0.00012675613106694;-0.0011426450219005;0.00031310541089624;0.0002788890269585;5.1006092689931e-05;-0.0016131934244186;0.00016398142906837;0.0001154015189968;-3.7830101064174e-05;-9.9736455013044e-05;-5.0073107559001e-05;-0.0014173291856423;-6.3426035922021e-05;-0.00096383452182636;4.2125284380745e-05;0.00066860357765108;-0.00012824188161176;-0.00063652044627815;-4.1745456655917e-06;-0.00064705533441156;-0.00021977310825605;0.00011653769615805;-6.9494220952038e-05;-0.00011977260874119;-0.00070127390790731;-0.00037414289545268;0.00055334309581667;0.000190168255358;0.0014960917178541;0.00012333216727711;0.00095156236784533;0.0001247504260391;0.00087688252096996;0.00010831860709004;0.00082988623762503;3.5750257666223e-05;-0.00087133439956233;0.00017125901649706;1.0226438007521e-06;-1.3306891560205e-05;0.00072582910070196;0.00019759018323384;4.173747220193e-05;-9.8911397799384e-05;0.00039565423503518;-8.3852733951062e-05;-8.4507919382304e-05;0.0001498437486589;-0.00069102086126804;-4.3126379750902e-05;0.00077135098399594;-6.9460147642531e-05;-0.00030459527624771;-0.00011115722736577;-0.00040486760553904;0.00029163985163905;1.7750393453753e-05;-5.6068773119478e-05;2.6017292839242e-05;-0.00039971037767828;-3.9282989746425e-05;-0.00056415575090796;-1.5967758372426e-05;2.1438534531626e-05;0.00015300727682188;0.00084157846868038;2.9026252377662e-05;-0.0007514035096392;6.7909095378127e-05;5.9864969443879e-06;4.4670297938865e-05;0.0005763407680206;-0.00017898326041177;0.0012701823143288;-0.00041388839599676;-0.00019879970932379;-0.00023584373411722;-0.00025056747836061;0.00031822419259697;-0.00011860120866913;-1.3970385225548e-05;0.001778875477612;-0.0002261748741148;0.0017627356573939;-0.00024707068223506;-0.00026022078236565;-0.00065290374914184;-0.00014304165961221;-0.00035673246020451;0.00068396498681977;0.00029831260326318;0.00039316201582551;-0.0013101568911225;0.00014656184066553;-0.0016170792514458;0.00035105156712234;0.00027211220003664;5.6951856095111e-05;-0.0019131724257022;0.00017807469703257;0.00010811763058882;-2.8038271921105e-05;-9.4873194029788e-06;-4.7228299081326e-05;-0.0012472427915782;-0.00013251241762191;-0.00086263060802594;-1.7041857063305e-05;0.00063116999808699;-7.2575698141009e-05;-0.0005221490864642;-2.1849902623217e-05;-0.00034696457441896;-0.0002621732710395;6.3304105424322e-05;-0.00010695018136175;-0.00018448595074005;-0.00072953500784934;-0.00038353443960659;0.00057342078071088;0.00023360006161965;0.0013927586842328;0.00020354431762826;0.00061807117890567;0.00015754834748805;0.00074847211362794;0.00017426414706279;0.00068048713728786;5.4604835895589e-05;-0.00085921684512869;0.00019425325444899;2.8100046733925e-07;-1.5637890101061e-05;0.00065061717759818;0.00020195328397676;8.8011533080135e-05;-5.1606311899377e-05;0.00041991454781964;-0.00010663338616723;-0.00023800531926099;0.00020744631183334;-0.00061843701405451;-3.5845147067448e-05;0.00060984963783994;-6.6944667196367e-05;-0.00018158665625378;-0.00013034004950896;-0.00037252434412949;0.00035906324046664;0.00012949653319083;-6.3103158026934e-05;-9.7886586445384e-06;-0.00050855911104009;-0.00012487816275097;-0.00049047061474994;-3.9727459807182e-05;-5.4347077593775e-07;0.00016825855709612;0.00079995102714747;3.1791420042282e-05;-0.00067793537164107;6.5932523284573e-05;-7.226221896417e-06;4.7147106670309e-05;0.00054178491700441;-0.00016296740795951;0.0013147754361853;-0.00037137509207241;-8.0179110227618e-05;-0.00020613767264877;-0.000244960130658;0.00028583171661012;-4.8590834921924e-05;-1.2887354387203e-05;0.001720710308291;-0.00018036560504697;0.0016356632113457;-0.00020704852067865;-0.00023461926321033;-0.00056844617938623;-0.00014667188224848;-0.0003695240302477;0.0006196983740665;0.0001738709397614;0.00037799164419994;-0.0012986479559913;0.00012284111289773;-0.0016258467221633;0.00029096260550432;0.00019229933968745;4.8592701205052e-05;-0.0017511363839731;0.00014446080604102;8.0193283793051e-05;-1.6163028703886e-05;2.8178068532725e-05;-3.4753527870635e-05;-0.00083053990965709;-0.00013927515828982;-0.00056345510529354;-6.6018037614413e-05;0.00041146512376145;1.1165410796821e-05;-0.00029929398442619;-2.7045241949963e-05;-9.7961397841573e-05;-0.00023755506845191;2.2178435756359e-05;-0.00012178424367448;-0.00017405337712262;-0.00055807817261666;-0.00028122292133048;0.00045656043221243;0.00019270803022664;0.00096305599436164;0.00019757957488764;0.00027058224077336;0.00014300578914117;0.00047121854731813;0.00019162788521498;0.0003889245854225;5.6546377891209e-05;-0.00060955825028941;0.0001717677077977;-1.3597732504422e-06;-1.1990873645118e-05;0.00043015312985517;0.00015311312745325;0.00012853904627264;3.7238787626848e-06;0.0003325869620312;-8.5067877080292e-05;-0.00029083856497891;0.00018232241563965;-0.00040696150972508;-2.4678201953066e-05;0.00035165902227163;-5.3109561122255e-05;-2.4079601644189e-05;-0.00010133305477211;-0.00025351942167617;0.00032722260220908;0.00019045843509957;-6.3081781263463e-05;-3.2455893233418e-05;-0.00047402959899046;-0.00017497994122095;-0.00031689993920736;-4.4003085349686e-05;-4.8847396101337e-05;0.00012836535461247;0.00058023969177157;3.1661416869611e-05;-0.00047926936531439;4.6460390876746e-05;-1.4354091035784e-05;3.8244757888606e-05;0.00036590575473383;-0.00010873277642531;0.0010045933304355;-0.00023603346198797;2.306100759597e-05;-0.00012912525562569;-0.00016965932445601;0.00018563216144685;3.3975258702412e-05;-6.8142880991218e-06;0.0012509549269453;-9.0991386969108e-05;0.0011096992529929;-0.0001180350445793;-0.00016149060684256;-0.00037968877586536;-0.0001140453532571;-0.00026407960103825;0.00041864445665851;4.645141234505e-05;0.00027409786707722;-0.00096239411504939;6.5209103922825e-05;-0.0012019048444927;0.00016088188567664;5.8516518038232e-05;2.8401844247128e-05;-0.0011841714149341;7.7250690083019e-05;6.3309038523585e-05;-1.0846504665096e-05;3.847221887554e-05;-2.7084442990599e-05;-0.00055196188623086;-0.0001256427494809;-0.0003591715649236;-9.7181015007664e-05;0.00023250876984093;8.1890670116991e-05;-0.00015977908333298;-2.5384515538462e-05;2.5726103558554e-05;-0.00021866921451874;2.6299832825316e-05;-0.00013746530748904;-0.00015331241593231;-0.00042316957842559;-0.00019637186778709;0.00036648553214036;0.00015169625112321;0.00066647515632212;0.00016864464851096;8.1098507507704e-05;0.00012630198034458;0.0002721814380493;0.00020192905503791;0.00020420193322934;5.4912059567869e-05;-0.00043524370994419;0.00015915065887384;-2.2986100702838e-06;-7.9522787927999e-06;0.00028405615012161;0.00011667583748931;0.0001598458038643;4.3374402594054e-05;0.00025723522412591;-5.3902840591036e-05;-0.00030028936453164;0.00013864501670469;-0.00026662228628993;-2.0068970115972e-05;0.00019234350475017;-4.6376990212593e-05;8.0143319792114e-05;-6.7074615799356e-05;-0.00017539439431857;0.00029500605887733;0.00022395707492251;-6.4304782426916e-05;-4.0102051571012e-05;-0.00043154577724636;-0.00021244915842544;-0.0002017296210397;-4.1560444515198e-05;-9.036192932399e-05;8.7389700638596e-05;0.00043283487320878;3.5367338568904e-05;-0.00035596979432739;3.1129588023759e-05;-1.6396503269789e-05;3.131878838758e-05;0.00024092948297039;-6.9383051595651e-05;0.00077787775080651;-0.00013458698231261;8.420149970334e-05;-7.4719013355207e-05;-0.00011786894174293;0.00011739163892344;8.7087915744632e-05;-1.8277788171872e-07;0.00092076219152659;-2.3722061087028e-05;0.00074005482019857;-5.564053208218e-05;-0.00011655575508485;-0.00025881882174872;-8.549611811759e-05;-0.00017987148021348;0.00028347119223326;-3.0902221624274e-05;0.00019619468366727;-0.00072255206760019;1.7592219592188e-05;-0.00089062919141725;6.6672204411589e-05;-3.4700118703768e-05;1.2813645298593e-05;-0.00079296802869067;2.8625685445149e-05;2.8762256079062e-06;-4.1437946492806e-05;6.3960840634536e-05;-1.98296365852e-05;0.00011381023068679;0.00050279480637982;2.9049733711872e-05;0.00047241870197468;3.1992556614568e-05;-0.00032715112320147;3.7966499803588e-05;0.00017000015941449;0.00020466538262554;3.5902264698962e-06;6.0210961237317e-05;-4.8562844312983e-05;8.7310581875499e-05;0.00038612642674707;0.00016277690883726;-0.00014882902905811;-0.00026113496278413;-0.00010462171485415;-0.00070268654963002;-0.00016157930076588;-0.00013357306306716;-0.00013250233314466;-0.0002834344340954;-6.4239364292007e-05;-0.00023645863984711;-0.00011324560182402;0.00044973628246225;-9.5790201157797e-06;5.747153863922e-06;0.00011101665586466;0.00026500909007154;-1.4170146641845e-05;5.0013371946989e-05;-7.2763839852996e-05;0.0002687199448701;0.00014255243877415;-0.00023697853612248;-5.7090751397482e-06;-0.00027295670588501;-5.2642739319708e-05;0.00020272455003578;-8.6136336904019e-05;1.5624045772711e-05;-0.00018347689183429;0.00020989854237996;0.00013014447176829;-5.3922681217955e-06;-2.3203378077596e-05;-0.0001108731230488;-0.0003265552513767;-4.0714527131058e-05;-0.00013759305875283;0.0001205975713674;-6.3272214902099e-05;2.1560170353041e-05;0.00037183082895353;4.081028237124e-05;-0.00031423196196556;3.3963620808208e-05;-1.689945202088e-05;-9.8375254310668e-05;0.00022800733859185;-0.00016836979193613;0.00062878528842703;-5.833647082909e-05;-4.3372847358114e-06;0.0001032637883327;-0.00010241639392916;-5.6577928262413e-06;2.3969631001819e-05;-6.6089422034565e-05;0.00076842796988785;-7.1652211772744e-05;0.00073882431024686;-0.00010015737643698;-0.00026096840156242;-8.2507496699691e-05;0.00031350931385532;-0.00019091353169642;0.00016186128777917;6.4324376580771e-05;6.2249338952824e-05;-0.00056547712301835;9.9078228231519e-05;-0.00076580513268709;1.7077258235076e-05;3.4674452763284e-05;5.1860915846191e-05;-0.0007719139684923;7.4106815191044e-06;-5.7707609812496e-05;7.9816687502898e-05;-2.784365642583e-05;0.00013326772022992;0.00077061826596037;1.6588870721534e-06;0.00071962899528444;9.8317643278278e-05;-0.00052878854330629;4.7176854423014e-05;0.00029833015287295;0.00024923373712227;7.470521813957e-05;5.0251186621608e-05;-5.2250692533562e-05;0.00011592172086239;0.0005409456207417;0.0002488793397788;-0.00019883055938408;-0.0003570516128093;-0.00013050886627752;-0.0010438555618748;-0.00020213214156684;-0.00026945438003168;-0.00013437076995615;-0.0004664879234042;-7.6663120125886e-05;-0.00041321461321786;-0.00013739305722993;0.00066039047669619;-1.2248694474692e-05;6.2168037402444e-06;0.00015881047875155;0.0004000014741905;-4.992959293304e-05;1.4318292414828e-05;-0.0001014383524307;0.00038992849295028;0.00019015709403902;-0.00026876555057243;-1.4841119991615e-05;-0.00039961040602066;-7.0799891545903e-05;0.00033692570286803;-0.00012180768680992;-8.9617737103254e-05;-0.00027365839923732;0.00027005121228285;0.00012128087109886;-3.2264483706967e-06;-1.142342989624e-05;-9.9711862276308e-05;-0.00041918802889995;-4.274276579963e-05;-0.00022141060617287;0.00016895032604225;-3.1799379939912e-05;2.553072408773e-05;0.00050806242506951;5.9470123233041e-05;-0.00041748411604203;4.5377946662484e-05;-1.8024236851488e-05;-0.00014841769007035;0.00035581496194936;-0.00027239407063462;0.00088135845726356;-9.7806114354171e-05;-6.0124100855319e-05;0.00016286117897835;-0.00015831689233892;-1.2819804396713e-05;-2.9858179914299e-05;-0.00012854152009822;0.0010951188160107;-0.00012592218990903;0.0011351722059771;-0.00014894151536282;-0.0003829330962617;-0.00010783520701807;0.00047150262980722;-0.00029455806361511;0.00022950459970161;0.00013452528219204;0.00011216662096558;-0.00079208664828911;0.00018289117724635;-0.0010967784328386;3.3219104807358e-05;0.00012795772636309;9.3901006039232e-05;-0.0011860138038173;1.8222606740892e-05;-8.335908933077e-05;9.8828313639387e-05;-2.2804939362686e-05;0.00013248057803139;0.0011967555619776;-6.1172642745078e-05;0.0010991949820891;0.0002180696465075;-0.00083966489182785;5.348054037313e-05;0.00052020419389009;0.00029361876659095;0.00025222054682672;1.8195645679953e-05;-5.9222758864053e-05;0.00014026135613676;0.00074735569069162;0.00037399062421173;-0.00025124204694293;-0.0004850507248193;-0.00014209179789759;-0.001557641196996;-0.00024447974283248;-0.0005456802318804;-0.00010645563452272;-0.00076529692159966;-8.6748776084278e-05;-0.00071411853423342;-0.00016193625924643;0.00096408714307472;-1.3399759154709e-05;5.7678953453433e-06;0.00022797983547207;0.00061065820045769;-0.00011633201211225;-7.0785172283649e-05;-0.00013074232265353;0.00055378052638844;0.00022971333237365;-0.00024870567722246;-3.5094868508168e-05;-0.00058298988733441;-9.5887357019819e-05;0.00057398871285841;-0.00015926588093862;-0.00032102395198308;-0.00041742765461095;0.00033154350239784;6.8859793827869e-05;8.5607516666641e-06;2.4710891011637e-05;-5.3739709983347e-05;-0.00051435269415379;-3.4077202144545e-05;-0.00036901122075506;0.00022570985311177;5.2209059504094e-05;3.2731451938162e-05;0.0006892898818478;8.2812868640758e-05;-0.00055548123782501;5.9892005083384e-05;-1.509985395387e-05;-0.00022410559176933;0.00055516033899039;-0.00043412801460363;0.0012233929010108;-0.00016188339213841;-0.00018144116620533;0.00025981606449932;-0.00024456979008391;-2.2455204089056e-05;-0.00014363853551913;-0.00023205418256111;0.0015642232028767;-0.00021764192206319;0.0017497928347439;-0.00022790866205469;-0.00057877012295648;-0.00013992835010868;0.00071849743835628;-0.00044524698751047;0.00032495998311788;0.00027662780485116;0.00018971860117745;-0.0011065403232351;0.00032293330878019;-0.0015613170107827;5.8293477195548e-05;0.00030445892480202;0.0001647638855502;-0.0018358016386628;2.9655224352609e-05;-9.1352208983153e-05;9.6565549029037e-05;3.3867690945044e-05;6.8096545874141e-05;0.0013094951864332;-0.00010653989738785;0.0011959900148213;0.00026071263710037;-0.00087557133520022;3.3676958992146e-05;0.00061539397574961;0.00025489879772067;0.00046574498992413;-1.1069779247919e-05;-0.00011698552407324;9.3419526820071e-05;0.00073206220986322;0.00036781581002288;-0.00021617149468511;-0.00046655052574351;-7.8985140135046e-05;-0.0016496648313478;-0.00020747842791025;-0.000773427891545;-4.9733200285118e-05;-0.00085321359802037;-6.7980799940415e-05;-0.00084483926184475;-0.00014489676686935;0.00099706533364952;-9.1880465333816e-06;3.8746566133341e-06;0.00022731228091288;0.0006738129304722;-0.00015791069017723;-0.00012097128637834;-0.00010476068564458;0.00053282006410882;0.00017137138638645;-0.00010718216071837;-4.957345299772e-05;-0.00062943395460024;-9.8174372396898e-05;0.00070073397364467;-0.00013529547140934;-0.00044773946865462;-0.00045060718548484;0.00028417914290912;-2.4400666006841e-05;3.5505763662513e-05;3.6723718949361e-05;1.260045064555e-05;-0.00042812860920094;-5.084687472845e-06;-0.00043097158777528;0.00020477789803408;9.0680638095364e-05;3.4478893212508e-05;0.0007106049451977;8.0811914813239e-05;-0.00060086633311585;5.9173031331738e-05;-7.0012788455642e-06;-0.00024423887953162;0.00059464870719239;-0.0004759072617162;0.0012087234063074;-0.00018272592569701;-0.00030112871900201;0.00028389075305313;-0.00024790977477096;-2.423052865197e-05;-0.00020751640840899;-0.0002743870136328;0.0016124254325405;-0.00025077653117478;0.0018826526356861;-0.00024839860270731;-0.00065267574973404;-0.00013145557022654;0.00078587117604911;-0.00045589773799293;0.0003314254572615;0.00039170164382085;0.00021448497136589;-0.0011200979351997;0.00037618514033966;-0.0015691267326474;6.7452987423167e-05;0.00038443063385785;0.00019256479572505;-0.0019921562634408;3.5681136068888e-05;-7.7339376730379e-05;6.9093839556444e-05;0.00012454856187105;-2.7079511710326e-05;0.0011013582115993;-0.00011687942605931;0.00095348706236109;0.00022051656560507;-0.00065846921643242;2.3004847662378e-06;0.00053010380361229;0.0001518992066849;0.00063343305373564;-3.1221257813741e-05;-0.00012120934115956;1.172892325485e-06;0.00050726317567751;0.00025697168894112;-9.7973708761856e-05;-0.0003402013098821;1.2196554052935e-05;-0.0012875408865511;-0.00011506714508869;-0.00085665343794972;1.5988811355783e-05;-0.00074017443694174;-3.1100815249374e-05;-0.0007344777113758;-9.2444264737424e-05;0.00071181688690558;-2.3099148620531e-06;1.8374846604274e-06;0.00016468482499477;0.00054748239926994;-0.00015503029862884;-0.00011177843407495;-5.0754722906277e-05;0.00038798674358986;6.6363754740451e-05;5.4346732213162e-05;-5.1490889745764e-05;-0.00050404568901286;-8.0143734521698e-05;0.00065439048921689;-7.3398827225901e-05;-0.00045372158638202;-0.00035792696871795;0.00017379043856636;-0.00010095402831212;4.9932619731408e-05;3.0234565201681e-05;6.6718028392643e-05;-0.0002545230963733;2.7818659873446e-05;-0.00037461085594259;0.00013041069905739;7.6465665188152e-05;3.0626073566964e-05;0.00054194725817069;5.8048448408954e-05;-0.00049239577492699;4.2654646676965e-05;5.2582449825422e-06;-0.00019637017976493;0.0004565209383145;-0.00037872078246437;0.00082864076830447;-0.0001483653759351;-0.00035317646688782;0.00022197201906238;-0.00016442897322122;-1.872498432931e-05;-0.0002068710164167;-0.00023604520538356;0.0012112758122385;-0.00020795456657652;0.0014745310181752;-0.00020440269145183;-0.00056491506984457;-9.4425748102367e-05;0.00063811999280006;-0.00031608348945156;0.0002505453012418;0.00041850857087411;0.00017585702880751;-0.000813954975456;0.00031498493626714;-0.0010988453868777;5.7615550758783e-05;0.00034807182964869;0.00016431011317763;-0.0016055818414316;8.0797028203961e-05;-4.362863546703e-05;-0.00046214359463193;-3.8616050005658e-05;-0.0012166547821835;0.00017081742407754;-0.00073930964572355;7.4718715040945e-05;0.00023688620422035;-6.1329701566137e-05;-0.00040163908852264;4.6025827032281e-05;-0.0013046793173999;-5.2544841310009e-05;0.0002427828439977;-1.9159891962772e-05;0.00014241712051444;-0.00029262929456308;-4.4170406908961e-05;0.00035543279955164;-5.4785210522823e-05;0.00096499250503257;-0.00018295331392437;0.0014364649541676;-1.9376842828933e-05;0.00083663954865187;-1.9067276298301e-05;0.0005928372265771;-1.4467723303824e-05;-0.00027766669518314;6.401014252333e-05;-3.5224497878517e-06;-5.2552945817297e-06;0.00052264926489443;5.1158080168534e-05;0.00013709744962398;-0.00012597109889612;9.5165596576408e-05;1.1361219549144e-05;0.00013717813999392;6.191698503244e-06;-0.00063816108740866;-1.8947021089843e-05;0.00070957135176286;-5.6265358580276e-05;7.6661897765007e-05;-4.8449437599629e-05;-0.00019543300732039;4.6847235353198e-05;-0.00015362205158453;-0.0002122456789948;0.00012126461660955;4.5588076318381e-05;5.5119806347648e-05;-0.00030487045296468;3.7537905882346e-05;-0.00031323439907283;6.9170811912045e-05;0.00076716358307749;4.3020640987379e-06;-0.00087655941024423;5.8507903304417e-05;1.4905568605172e-05;3.5596058296505e-05;0.00020447255519684;-0.00014144672604743;0.00058512500254437;-0.00029345441726036;-0.00026215231628157;-0.00017368955013808;-5.8306624850957e-05;0.00017672158719506;7.6076117693447e-05;-2.594050783955e-05;0.0011164030293003;-0.00020072412735317;0.00091879750834778;-0.00015885010361671;-0.00014562645810656;-0.0005586959887296;-0.00010726525215432;-4.8184552724706e-05;0.00045240874169394;0.00034298517857678;0.00030900977435522;-0.00075971550540999;0.00014276370347943;-0.00077186728594825;0.00025429067318328;-2.6787633032654e-05;5.9281701396685e-05;-0.0010923821246251;0.00013625191058964;0.00012110963143641;-5.4896965593798e-05;-0.00051438820082694;-6.6983702708967e-05;-0.0016493967268616;0.00014101760461926;-0.0010847413213924;7.2818816988729e-05;0.00042609122465365;-8.3535262092482e-05;-0.00057770585408434;4.3857351556653e-05;-0.0015012813964859;-0.00014348659897223;0.00036348847788759;-5.6802531616995e-05;0.00010759886208689;-0.00055317359510809;-0.00014801464567427;0.00054118345724419;2.8484259019024e-05;0.0014744059881195;-0.00014333297440317;0.0017320195911452;3.0685467208968e-05;0.0010772494133562;3.9232782000909e-05;0.00084151903865859;3.7122824778635e-06;-0.00059791567036882;0.00013118117931299;-5.7085635489784e-06;-1.0892174941546e-05;0.00080805853940547;0.00010960626968881;0.00017718819435686;-0.00015755313506816;0.00016077898908406;-8.3807017290383e-06;0.00011412624735385;5.3500407375395e-05;-0.00093180703697726;-2.7276260880171e-05;0.00097786309197545;-7.7668271842413e-05;0.00010152101458516;-8.8463806605432e-05;-0.00033309153513983;0.00012421446444932;-0.00014509254833683;-0.000275056110695;0.00015738586080261;-2.3950509785209e-05;2.3609956770088e-05;-0.00049735856009647;2.7124297048431e-05;-0.00036235834704712;0.00012041218724335;0.0011509294854477;9.28265217226e-06;-0.0012551895342767;8.4245453763288e-05;4.1188200157194e-06;5.8981091569876e-05;0.00037671465543099;-0.00021371994807851;0.0010836075525731;-0.00045060185948387;-0.00029585609445348;-0.00026258526486345;-0.00014216019189917;0.00028600275982171;0.00013046515232418;-3.7422771129059e-05;0.0017843741225079;-0.00028483427013271;0.0014909943565726;-0.00024176891020034;-0.00022092746803537;-0.00079723173985258;-0.00016740489809308;-0.00016573365428485;0.00068900192854926;0.00041632846114226;0.00047439563786611;-0.0012782425619662;0.00020792306168005;-0.001378957182169;0.0003779839607887;-2.7768213840318e-05;8.3093356806785e-05;-0.001696098013781;0.00019732807413675;0.00011708625243045;-3.8730548112653e-05;-0.00028451246907935;-7.5786527304444e-05;-0.0013584522530437;-1.0088223461935e-05;-0.0010000679176301;-6.012588755766e-07;0.00045552890514955;-3.8174228393473e-05;-0.00048770228750072;9.8841646831715e-06;-0.00086595758330077;-0.00023061953834258;0.00035713208490051;-0.00010762782039819;-3.1629384466214e-05;-0.00067498529097065;-0.0002218741865363;0.00054875807836652;0.00016459582548123;0.0014290111139417;2.2673999410472e-05;0.00111671583727;0.00010624443530105;0.00080530869308859;0.00014528454630636;0.00070299685467035;3.9672140701441e-05;-0.00077236810466275;0.00017828475392889;-5.2626642172982e-06;-1.5474397514481e-05;0.000789460609667;0.00014036732318345;0.00018411442579236;-0.00010080637002829;0.00017470194143243;-4.2905714508379e-05;-5.6500768550904e-05;0.00012395682279021;-0.00086445995839313;-2.0748037059093e-05;0.00079911254579201;-6.7884000600316e-05;0.00018591919797473;-0.00011178905697307;-0.00035207674955018;0.00020329120161477;-1.3456433407555e-06;-0.00024185296206269;0.00012084763875464;-0.00015802164853085;-8.0955062003341e-05;-0.00049796188250184;-1.531206726213e-05;-0.00028354951064102;0.00014216502313502;0.0011277095181867;1.3154060980014e-05;-0.0011657376307994;7.7843928011134e-05;-2.3860988221713e-05;6.617973849643e-05;0.00042341108201072;-0.00020568062609527;0.0013154285261407;-0.00043410627404228;-0.00012757508375216;-0.00024612489505671;-0.00019125454127789;0.00028558925259858;0.00019765632168856;-3.4726526791928e-05;0.0018514662515372;-0.00023993260401767;0.0015112699475139;-0.00022027982049622;-0.00020493089687079;-0.00070308556314558;-0.00017456764180679;-0.00026725191855803;0.00065763539168984;0.00024322158424184;0.00047417031601071;-0.0014100052649155;0.00018717774946708;-0.001602224772796;0.00033740102662705;-7.3313007305842e-05;7.1143040258903e-05;-0.0016321281436831;0.00016929829143919;0.00010964518151013;-2.5732424546732e-05;-0.00014441365783568;-7.4863964982796e-05;-0.0010971381561831;-0.00010689238843042;-0.00084544543642551;-6.1630038544536e-05;0.00042575472616591;1.2995987162867e-05;-0.00036263628862798;-1.6324533135048e-05;-0.00043956973240711;-0.00028696603840217;0.00028849314549007;-0.00014502546400763;-0.00011742256901925;-0.00070111104287207;-0.00025366104091518;0.00054616684792563;0.00022567938140128;0.00128068565391;0.00013378956646193;0.0006626324611716;0.00015671193250455;0.0005957322428003;0.00021948778885417;0.0005223267362453;6.6783322836272e-05;-0.00077421509195119;0.00020616292022169;-6.0752690842492e-06;-1.6052410501288e-05;0.00068893516436219;0.00015261325461324;0.00020408431009855;-4.3323892896296e-05;0.00019976543262601;-6.2098130001687e-05;-0.00019120490469504;0.00016192827024497;-0.00072582450229675;-1.8517734133638e-05;0.00061465403996408;-6.1335536884144e-05;0.00023240325390361;-0.00011385139077902;-0.0003281838435214;0.00026745966169983;0.00012098833394703;-0.00020197012054268;7.3290699219797e-05;-0.00028705855947919;-0.00016748772759456;-0.00044860600610264;-4.1674262320157e-05;-0.00023698760196567;0.00014359060151037;0.0010168856242672;2.1933534299023e-05;-0.0010136805940419;6.5400345192757e-05;-3.7917525332887e-05;6.6322732891422e-05;0.00039421871770173;-0.00018096655549016;0.0013291075592861;-0.00037268162122928;-1.0282406037732e-05;-0.00020883420074824;-0.00019201410759706;0.00025289942277595;0.00024329581356142;-2.7200718250242e-05;0.0017358084442094;-0.00017692896653898;0.0013716790126637;-0.00017601242871024;-0.00018064583127853;-0.0005994142848067;-0.00017106634913944;-0.00028202054090798;0.00058037583949044;0.00011740769696189;0.00043944444041699;-0.0013568265130743;0.00014662423927803;-0.0015758028021082;0.00026373192667961;-0.00012709463771898;5.4709242249373e-05;-0.0014487149892375;0.00012879938003607;9.7143238235731e-05;-1.5353536582552e-05;-6.9208334025461e-05;-6.5389613155276e-05;-0.000810133991763;-0.0001488732668804;-0.00061886286130175;-0.00010973677126458;0.00031527449027635;7.4039773608092e-05;-0.00020337065507192;-3.2563621061854e-05;-0.00015097492723726;-0.00030666426755488;0.00019960411009379;-0.00016848016821314;-0.00015410447667819;-0.00062480143969879;-0.00022745942987967;0.00050650927005336;0.00022265146253631;0.001008449587971;0.00018032321531791;0.00031198357464746;0.000176306522917;0.00039405090501532;0.00026029971195385;0.0002935586089734;8.3395629189909e-05;-0.0006289534503594;0.00021134076814633;-8.3107715909136e-06;-1.2524950761872e-05;0.00051939336117357;0.00014042266411707;0.00022868464293424;1.4769626432098e-05;0.00018955390260089;-5.8965568314306e-05;-0.00027502130251378;0.00015764706768095;-0.00052238075295463;-1.732039891067e-05;0.00040908547816798;-5.3807376389159e-05;0.00028029858367518;-9.1347130364738e-05;-0.00026429237914272;0.00028968940023333;0.00021511715021916;-0.0001588504674146;3.078180088778e-05;-0.0003608388651628;-0.0002346941473661;-0.00035545698483475;-5.420044544735e-05;-0.00021716101036873;0.00011909104796359;0.00082537205889821;3.2231469958788e-05;-0.00081274029798806;4.5774548198096e-05;-4.3990410631523e-05;6.0617217968684e-05;0.00029727755463682;-0.00013935762399342;0.0011630560038611;-0.00026976127992384;8.4376421000343e-05;-0.00015168318350334;-0.00015588356473017;0.00019075846648775;0.00028557289624587;-1.6518504708074e-05;0.0014458616496995;-9.5857787528075e-05;0.001060506911017;-0.00011082422133768;-0.00014290539547801;-0.00046827035839669;-0.00015413083019666;-0.00022714213992003;0.00045091169886291;1.1032474503736e-05;0.0003691918682307;-0.0011482611298561;8.9224166003987e-05;-0.001339124632068;0.00015955908747856;-0.00020351273997221;3.3533600799274e-05;-0.0011093567591161;7.5100571848452e-05;8.3300728874747e-05;-1.0528144230193e-05;-8.8870501713245e-06;-4.8013356718002e-05;-0.00057713303249329;-0.00014932831982151;-0.00040206406265497;-0.00013970346481074;0.00018994395213667;0.00013508369738702;-9.4640490715392e-05;-3.6446461308515e-05;3.3211894333363e-05;-0.00029876016196795;0.0001146606518887;-0.00018505306798033;-0.0001683914597379;-0.00050570955500007;-0.00018513065879233;0.00044780134339817;0.00018563320918474;0.00074037560261786;0.00018120391177945;6.8356195697561e-05;0.00016983872046694;0.00023545371368527;0.00027473640511744;0.00012596049054991;8.5470295744017e-05;-0.00046836287947372;0.0002071213821182;-8.2795504567912e-06;-7.2969137363543e-06;0.00034463289193809;0.00012456529657356;0.00024072593078017;6.6833119490184e-05;0.00019368506036699;-4.2433046473889e-05;-0.00033096439437941;0.00013128462887835;-0.00032186054158956;-2.0209727153997e-05;0.00022342534794006;-5.0892598665087e-05;0.00027330990997143;-5.8625293604564e-05;-0.00020029336155858;0.00030672721914016;0.00028565028333105;-0.00011007513967343;-1.1116051609861e-05;-0.0004279401327949;-0.00028824299806729;-0.0002478442620486;-5.6028136896202e-05;-0.00019221038382966;8.4437648183666e-05;0.00060080242110416;4.5319255150389e-05;-0.00057404133258387;2.6954819986713e-05;-3.7508263631025e-05;4.8584151954856e-05;0.00021094501425978;-9.009322093334e-05;0.0009468860225752;-0.00015443147276528;0.00014819952775724;-8.9918037701864e-05;-0.00011996887769783;0.00012847721518483;0.00026396356406622;-2.0608408703993e-06;0.0011155813699588;-1.1915558388864e-05;0.00075509998714551;-4.7584067942807e-05;-0.00011770681885537;-0.00033579205046408;-0.00012285399134271;-0.00016386542120017;0.00032318680314347;-6.826181197539e-05;0.00027444976149127;-0.0008928426541388;2.085774212901e-05;-0.0010516656329855;5.4535419621971e-05;-0.00022217250079848;1.13021760626e-05;-0.0007947935955599;2.1366058717831e-05;6.1239443311933e-05;-7.5557959462458e-06;7.7119921115809e-06;-3.2597923564026e-05;-0.00037740476545878;-0.00010994476178894;-0.00024449868942611;-0.00011977549729636;9.4490977062378e-05;0.00013308422057889;-3.8347745430656e-05;-2.8249303795747e-05;7.5567004387267e-05;-0.00023347632668447;7.5513664341997e-05;-0.00015420658746734;-0.00013249317998998;-0.00035195008968003;-0.00012421926658135;0.0003305186110083;0.00012851363862865;0.00049139559268951;0.00013234979996923;-1.6327085177181e-05;0.00012976676225662;0.00012754350609612;0.00022157788043842;4.4309941586107e-05;6.7448105255608e-05;-0.00031400995794684;0.00016402584151365;-6.3603165472159e-06;-3.4743202377285e-06;0.0002162006276194;9.1613554104697e-05;0.00019724399317056;7.2195667598862e-05;0.00014537092647515;-2.1565498173004e-05;-0.00027349812444299;8.5502688307315e-05;-0.00019226761651225;-1.7709066014504e-05;0.00011627901403699;-4.0007646020968e-05;0.00022347750200424;-3.0156126740621e-05;-0.00013750797370449;0.00024492980446666;0.00024902581935748;-7.4150768341497e-05;-1.8757064026431e-05;-0.00035216839751229;-0.00025052731507458;-0.00015670443826821;-4.3810134229716e-05;-0.00015122214972507;5.0155336793978e-05;0.00040500055183657;4.1940780647565e-05;-0.00038280265289359;1.3753323401033e-05;-2.6913312467514e-05;3.420438588364e-05;0.00013410812243819;-5.3386644140119e-05;0.00067403877619654;-7.8551260230597e-05;0.00013928282714915;-4.8846613935893e-05;-8.2026141171809e-05;7.953357999213e-05;0.00020497642981354;4.2325673348387e-06;0.00076843291753903;2.3238280846272e-05;0.00048534266534261;-1.3901287275075e-05;-8.5681778728031e-05;-0.00022274459479377;-8.5152722022031e-05;-0.00010306120384485;0.00021159692551009;-8.0889745731838e-05;0.00018357984663453;-0.00061901862500235;-1.0548236787145e-05;-0.00072946969885379;3.1685294743511e-06;-0.00018795538926497;3.5408189091868e-07;-0.00051412399625406;-3.8186622077774e-06;-1.6280713452943e-06;-3.7900790630374e-05;7.2848582931329e-05;2.6863388484344e-05;0.00010273335647071;0.00030827985028736;6.3845625845715e-05;0.00031731883063912;-3.3076743420679e-05;-0.00015310295566451;3.6382072721608e-05;3.6859742976958e-05;0.00021347809524741;-3.1789339118404e-05;8.1539183156565e-05;-9.5307455922011e-05;5.450852404465e-05;0.00030190771212801;7.9377612564713e-05;-0.00012242264347151;-0.00021678517805412;-7.5721291068476e-05;-0.00048005356802605;-0.00015837061800994;-4.6494445996359e-05;-0.00016016402514651;-0.00013004429638386;-7.4201496317983e-05;-5.7503137213644e-05;-0.0001129092706833;0.0002915327786468;-7.0951286943455e-06;6.013718120812e-06;7.5504998676479e-05;0.00019418470037635;2.0821707948926e-05;9.6642826974858e-05;-4.1985356801888e-05;0.0001022267024382;8.8628570665605e-05;-0.00019461158080958;5.2977461564296e-06;-0.00021237006876618;-4.0327508031623e-05;0.00012172186688986;-4.8563782911515e-05;0.00019365032494534;-0.00013439157919493;0.00014048704179004;0.00015771095058881;2.4270437279483e-05;-4.5370161387837e-05;-0.00014854889013804;-0.0002074824005831;-4.9586822569836e-05;-9.0668101620395e-05;7.8809425758664e-05;-0.00012298714136705;2.2061671188567e-05;0.00035542956902646;2.2680638721795e-05;-0.00036215438740328;3.4399174182909e-05;-2.5950557756005e-05;-7.2788709076121e-05;0.00011644229380181;-0.00010025148367276;0.0005033080233261;-3.3399879612261e-05;6.1600723711308e-05;6.3971092458814e-05;-5.9505644458113e-05;2.7026757720705e-07;0.00014932097110432;-1.3901116290072e-05;0.00060797855257988;-2.9801476557623e-05;0.00043458078289405;-6.5886248194147e-05;-0.00021326073328964;-8.2977639976889e-05;0.00021805247524753;-9.7246185760014e-05;0.00014588401245419;5.9691797105188e-06;2.8041393306921e-05;-0.00047218799591064;3.0507311748806e-05;-0.00057549786288291;7.9633935001766e-07;-0.00012948700168636;2.0058443624293e-05;-0.00044903845991939;1.6405047631451e-07;-5.5189295380842e-05;0.00010169201414101;3.2766416552477e-05;0.00014235837443266;0.00051064678700641;7.3290691943839e-05;0.00053225003648549;-1.8426002498018e-05;-0.00028117292094976;4.8762081860332e-05;0.0001052891384461;0.00029183863080107;-4.1562147998775e-06;0.0001043514275807;-0.00014742367784493;8.1353166024201e-05;0.00046482516336255;0.00013608712470159;-0.0001854825677583;-0.00031806662445888;-0.00010908052354353;-0.00077836611308157;-0.00021806108998135;-0.00012362276902422;-0.00021017754625063;-0.00024340838717762;-9.8054559202865e-05;-0.00016229385801125;-0.00015648729458917;0.00048379431245849;-1.1442407412687e-05;7.5249026849633e-06;0.00011592829832807;0.00031997833866626;8.5877700257697e-06;0.00011437820649007;-6.6742562921718e-05;0.00017980538541451;0.00014036099310033;-0.00026910795713775;4.2088267946383e-06;-0.00035141021362506;-6.1168131651357e-05;0.00021920634026174;-8.3690189057961e-05;0.00022844281920698;-0.00021028472110629;0.00020880765805487;0.00019616093777586;3.5110151657136e-05;-6.9020396040287e-05;-0.00018716105842032;-0.00029827572871;-6.3416169723496e-05;-0.00014634963008575;0.00012650529970415;-0.00016067568503786;2.7719348508981e-05;0.00054113421356305;4.1496379708406e-05;-0.00053661101264879;5.0457147153793e-05;-3.4466254874133e-05;-0.00011933819769183;0.00020599628624041;-0.0001820736360969;0.00077047746162862;-6.2940176576376e-05;5.2844512538286e-05;0.00010804362682393;-9.9760160082951e-05;-6.1402865867421e-06;0.00017423649842385;-5.2090919780312e-05;0.00093800999457017;-6.3378669437952e-05;0.00073830271139741;-0.00010437003948027;-0.00033111425000243;-0.00011715830623871;0.00035406573442742;-0.00017454133194406;0.00022129307035357;3.7791993236169e-05;6.5154097683262e-05;-0.00071899039903656;8.186785998987e-05;-0.00089649739675224;1.2106382200727e-05;-0.00012985248758923;4.587487273966e-05;-0.00076380977407098;5.6455492085661e-06;-7.11229222361e-05;0.0001263977464987;5.7714987633517e-05;0.00015021969738882;0.00074073136784136;4.8953708756017e-05;0.00081186642637476;3.6187615478411e-05;-0.00044032244477421;4.9524638598086e-05;0.00022249070752878;0.00032778698368929;0.0001148368100985;9.8798656836152e-05;-0.00024775057681836;8.520475239493e-05;0.00062220258405432;0.00018873673980124;-0.00024169676180463;-0.00038853118894622;-0.00011243762855884;-0.0011181979207322;-0.00024495643447153;-0.0002993845846504;-0.00021292807650752;-0.00039228823152371;-0.0001049279308063;-0.00034561436041258;-0.00017782236682251;0.00071068247780204;-1.5706320482423e-05;7.4263875831093e-06;0.00014777458272874;0.00049102923367172;-3.6810499295825e-05;8.8688138930593e-05;-8.0061457992997e-05;0.00021791103063151;0.00016966799739748;-0.00025447134976275;-3.7840146660528e-07;-0.00054374220781028;-7.7189986768644e-05;0.00037906836951151;-0.00011659139272524;0.00022348380298354;-0.00029462811653502;0.00023139645054471;0.00015977100702003;6.8628454755526e-05;-0.00010364903573645;-0.00016989490541164;-0.00029084307607263;-6.0144706367282e-05;-0.00022162607638165;0.00016774886171333;-0.00017783720977604;2.5059600375243e-05;0.00075960054527968;6.3615523686167e-05;-0.0007572952308692;6.6696062276606e-05;-4.0826595068211e-05;-0.0001804343337426;0.00031644882983528;-0.00030558987054974;0.0010349489748478;-0.00011125285527669;-1.6722731743357e-05;0.00016465778753627;-0.00014271773397923;-2.1489800928975e-05;0.00016920677444432;-0.00013168623263482;0.0012878675479442;-0.00011992386862403;0.0011064729187638;-0.00014336104504764;-0.00047149942838587;-0.00014254389679991;0.00051826384151354;-0.00026912303292193;0.00030607779626735;0.00011558784171939;0.00013606682477985;-0.00097695156000555;0.00017968795145862;-0.0012281639501452;3.6088800698053e-05;-8.6796106188558e-05;9.2564216174651e-05;-0.0011415530461818;1.6908008547034e-05;-8.4730847447645e-05;0.00013587603461929;9.6011055575218e-05;0.00011228941730224;0.00098352797795087;2.6400462047604e-06;0.0010721703292802;0.00010193662456004;-0.00058220082428306;3.5998848034069e-05;0.00037161028012633;0.00032002929947339;0.00031882248003967;7.5537209340837e-05;-0.00033683245419525;6.6598964622244e-05;0.00072121940320358;0.00022310353233479;-0.00025769133935682;-0.00042879048851319;-7.5093303166796e-05;-0.0014171543298289;-0.00023289035016205;-0.00055181130301207;-0.00017502560513094;-0.00056701502762735;-9.3545953859575e-05;-0.00056593067711219;-0.00017948205641005;0.00089391501387581;-1.7142014257843e-05;6.5937738327193e-06;0.00016963999951258;0.00064463925082237;-9.360269177705e-05;4.0140745113604e-05;-8.0118799814954e-05;0.00025053403805941;0.00017145587480627;-0.00018580135656521;-1.0281368304277e-05;-0.00071005610516295;-9.0697205450851e-05;0.00055219157366082;-0.00013533874880522;0.00014745919907;-0.00036900248960592;0.00022891994740348;8.2937185652554e-05;0.00010304603347322;-0.00012498491560109;-0.00011987216566922;-0.00024848303291947;-4.1662216972327e-05;-0.00029630013159476;0.00019236844673287;-0.00016974136815406;2.2044860088499e-05;0.00091887603048235;8.1919286458287e-05;-0.00091968168271706;7.6119737059344e-05;-3.8418413168984e-05;-0.00023229928046931;0.00042358925566077;-0.0004168126906734;0.0012171951821074;-0.00015656500181649;-0.00012175156734884;0.00021823504357599;-0.00018003999139182;-3.474558252492e-05;0.00011283778439974;-0.00021357891091611;0.0015589128015563;-0.0001789248053683;0.0014469370944425;-0.0001832454581745;-0.00059857114683837;-0.00015337877266575;0.0006679089856334;-0.00035012312582694;0.00036513176746666;0.00022277671087068;0.00020091315673199;-0.0011624038452283;0.00028058659518138;-0.0014751623384655;6.0103368014097e-05;5.7827855926007e-06;0.00014108741015662;-0.0015020967693999;3.1345662137028e-05;-9.1937050456181e-05;0.00012847564357799;0.00018523394828662;2.1652496798197e-05;0.0011306181550026;-4.3292151531205e-05;0.0011933528585359;0.00013895351730753;-0.00060162483714521;7.055324203975e-06;0.00046385123278014;0.00026336562586948;0.00060939532704651;4.5480410335585e-05;-0.00040294014615938;3.1240222142515e-06;0.00069719180464745;0.00019370923109818;-0.00020441990636755;-0.00041797413723543;1.2270551451365e-05;-0.001515097450465;-0.00017388656851836;-0.00084110291209072;-0.00010831413237611;-0.00069780950434506;-6.5671891206875e-05;-0.00070633017458022;-0.00015603606880177;0.00090136128710583;-1.47537475641e-05;4.8708920985518e-06;0.00015891337534413;0.00071559188654646;-0.00014069366443437;6.3200650401996e-06;-5.5348966270685e-05;0.00021468821796589;0.00012542834156193;-5.7419289078098e-05;-1.9550767319743e-05;-0.00079353770706803;-9.5552073617e-05;0.00068035925505683;-0.00012308466830291;8.7008964328561e-05;-0.00038940605008975;0.00017657426360529;-1.5948393411236e-05;0.00013996059715282;-0.00014640219160356;-5.4282423661789e-05;-0.00013517533079721;-1.0236429261568e-05;-0.00033197208540514;0.00018003907462116;-0.0001777540310286;1.8478629499441e-05;0.00097899069078267;8.7529777374584e-05;-0.0010136362398043;7.6730539149139e-05;-2.9774888389511e-05;-0.00025516995810904;0.00045169782242738;-0.00046768548781984;0.0012028508353978;-0.00017952735652216;-0.00023295631399378;0.00023614394012839;-0.00017330172704533;-4.3252650357317e-05;6.6842796513811e-05;-0.0002657831646502;0.0016188810113817;-0.00020974292419851;0.0015538324369118;-0.00019962852820754;-0.00067197222961113;-0.00014793516311329;0.0007316074334085;-0.00035273737739772;0.000380933546694;0.00032807412208058;0.0002381990198046;-0.0011855999473482;0.00033822606201284;-0.001478606602177;7.6028954936191e-05;6.2977800553199e-05;0.00016980430518743;-0.0016391562530771;4.694924064097e-05;-9.1133777459618e-05;0.00010110584844369;0.00032659055432305;-0.00010852437117137;0.0011879185913131;-8.3693892520387e-05;0.0011332171270624;0.00014772062422708;-0.00051269977120683;-2.9955885111121e-05;0.00047682106378488;0.00016576354391873;0.00098005193285644;9.2464069894049e-06;-0.00037821792648174;-9.9287019111216e-05;0.00054563611047342;0.0001204410000355;-7.2976865340024e-05;-0.00037517011514865;0.00012586207594723;-0.0013883088249713;-8.0874378909357e-05;-0.0011474265484139;-1.7993781511905e-05;-0.00080012413673103;-2.594215402496e-05;-0.0007375082350336;-0.00010972001473419;0.00069223355967551;-8.8697497631074e-06;3.0659919048048e-06;0.00012237433111295;0.0006686809938401;-0.00016919411427807;-4.8429619710078e-06;-1.7613321688259e-05;0.00016647245502099;4.8060508561321e-05;9.3499220383819e-05;-2.9179522243794e-05;-0.00075641163857654;-9.3940478109289e-05;0.00074245035648346;-8.4253690147307e-05;-2.8864956220787e-06;-0.00034667135332711;0.00010532847227296;-0.00011458542576293;0.0001543688995298;-0.00015099544543773;1.8924774849438e-05;-2.1304023903213e-05;3.0679275369039e-05;-0.0003159009211231;0.00013738562120125;-0.0001926549593918;1.7632533854339e-05;0.00089644198305905;7.9638157330919e-05;-0.00097569945501164;6.5728687332012e-05;-1.1263775377301e-05;-0.00024096433480736;0.00038469964056276;-0.00043868762440979;0.00094562774756923;-0.00017061522521544;-0.00034921264159493;0.00020871474407613;-0.00011169342178619;-4.3565578380367e-05;1.8753984477371e-05;-0.00027520389994606;0.0014193503884599;-0.00020220321312081;0.0013958949130028;-0.00018994025595021;-0.00067939353175461;-0.00012866845645476;0.00069053919287398;-0.00026067512226291;0.00034423428587615;0.00042927995673381;0.00023564745788462;-0.00099961028899997;0.0003343271673657;-0.0011803265661001;8.0212506873067e-05;9.4911694759503e-05;0.00017178607231472;-0.0015376844676211;8.736382733332e-05;-4.8184974730248e-05;-0.00066117313690484;-3.716104401974e-05;-0.0014560356503353;0.00024613103596494;-0.00085251627024263;6.9016183260828e-05;0.00019758808775805;-5.0113241741201e-05;-0.00030137560679577;5.4983549489407e-05;-0.0016651191981509;-4.7443558287341e-05;0.0002289696567459;-1.7138096154667e-05;0.00019832112593576;-0.00030662235803902;3.8175014196895e-05;0.00048358217463829;-0.0001144970592577;0.001036750851199;-0.00026333751156926;0.0017267331713811;-4.394912684802e-05;0.0010793696856126;-2.9144284781069e-05;0.00052277877693996;-1.3940135431767e-05;-0.00012095224519726;5.8940440794686e-05;-2.1914311219007e-05;-2.7584992494667e-06;0.00053662771824747;2.4368002414121e-05;0.00016538378258701;-0.00011923613055842;4.2839274101425e-06;1.8262193407281e-05;0.0001119588923757;2.7616153602139e-05;-0.00073975167470053;-7.6357810030458e-06;0.00069394195452332;-5.768811024609e-05;0.00033849556348287;-6.8717636168003e-05;-0.00014914090570528;2.6498028091737e-05;-0.00015335794887505;-0.00030408805469051;0.00014519634714816;0.0001599176612217;2.0613962988136e-05;-0.00021542973991018;3.6840760003543e-05;-0.00045642230543308;7.8696182754356e-05;0.00097070471383631;-7.8948842201498e-06;-0.0011274449061602;7.207511953311e-05;4.3069062485301e-06;5.1870523748221e-05;9.8981196060777e-05;-0.00017376651521772;0.00066740275360644;-0.00034377578413114;-0.00020071104518138;-0.00019807234639302;-3.4188979043392e-05;0.00017476467473898;0.00028557283803821;-4.656516466639e-05;0.0012836812529713;-0.00023746195074636;0.00085685384692624;-0.00015799017273821;-0.00011568785703275;-0.0006363382562995;-0.00015319358499255;1.1840857951029e-05;0.00047005485976115;0.00031780655262992;0.00040673781768419;-0.0008656372083351;0.00019314989913255;-0.00086809508502483;0.00027357164071873;-0.00026509488816373;7.9841585829854e-05;-0.0010262576397508;0.00014639919390902;0.00012131536641391;-5.6162123655668e-05;-0.0007781105232425;-6.5688451286405e-05;-0.001813497277908;0.00023271412646864;-0.001139794010669;5.1450530008879e-05;0.00031023230985738;-5.0161648687208e-05;-0.00035564016434364;5.1950642955489e-05;-0.0018955720588565;-0.00013138201029506;0.00034236058127135;-5.4203777835937e-05;0.00018997043662239;-0.00052593188593164;-9.791075171961e-06;0.00067169487010688;-5.8025634643855e-05;0.0014307704987004;-0.00024374172789976;0.0020004129037261;-1.4014717635291e-06;0.0012938535073772;2.9657974664588e-05;0.00064069370273501;7.6468277256936e-06;-0.0003113504499197;0.00011573005758692;-3.3753185562091e-05;-5.8661694311013e-06;0.00077576423063874;5.6554097682238e-05;0.00023350973788183;-0.00013862854393665;-7.8323701018235e-06;7.2694419941399e-06;8.5478670371231e-05;6.9397916377056e-05;-0.0010077690239996;-8.1768675954663e-06;0.00089930760441348;-7.4501833296381e-05;0.00050589756574482;-0.00010601343819872;-0.00023845148098189;7.1445560024586e-05;-0.00013703574950341;-0.00040316992090084;0.00019233897910453;0.00016310621867888;-2.6520488972892e-05;-0.0003514640557114;2.6356130547356e-05;-0.00056987843709067;0.00012121682084398;0.0013724913587794;-9.1509637059062e-06;-0.0015588493552059;9.6927542472258e-05;-1.6793768736534e-05;8.0729252658784e-05;0.00017723345081322;-0.00024466196191497;0.0010989966103807;-0.00048503439757042;-0.00018743964028545;-0.00027673083241098;-8.5856503574178e-05;0.00025525485398248;0.00045647905790247;-6.6095388319809e-05;0.0018720043590292;-0.00031443234183826;0.001245564664714;-0.00021720281802118;-0.00015540010645054;-0.0008518808754161;-0.00022095665917732;-4.8756213800516e-05;0.00065417721634731;0.00034884075284936;0.00058189244009554;-0.0013301048893481;0.00026603712467477;-0.0013755761319771;0.0003716990177054;-0.0004018000618089;0.00010658270184649;-0.0014313807478175;0.00019461185729597;0.00010415707947686;-3.3314241591142e-05;-0.00040700484532863;-7.4145311373286e-05;-0.001234102062881;3.3468331821496e-05;-0.0008919223328121;-1.9931050701416e-05;0.00031073999707587;-3.2967466268019e-06;-0.00028158750501461;1.0973658390867e-05;-0.00095087307272479;-0.00020703164045699;0.00034111854620278;-0.0001002132994472;2.5764376914594e-05;-0.00058022397570312;-0.0001125793569372;0.0005422638496384;0.00010381737956777;0.001211293740198;-3.120601104456e-05;0.0011082412675023;8.4510611486621e-05;0.00076840212568641;0.00013381672033574;0.00047736277338117;4.2165513150394e-05;-0.00052385096205398;0.00015318660007324;-1.8171516785515e-05;-1.1731803169823e-05;0.00069951399927959;9.0657995315269e-05;0.00022114162857179;-8.0832156527322e-05;2.7317577405483e-05;-2.2445090507972e-05;-4.7597961383872e-05;0.0001051963045029;-0.00081937538925558;-6.0786783251388e-06;0.00068425748031586;-5.7789140555542e-05;0.00043071765685454;-0.00010230292537017;-0.00026466863346286;0.00013216069783084;1.3284203532749e-06;-0.00030033732764423;0.00014473342162091;-8.3695076682488e-06;-0.00010109962022398;-0.0003854303213302;-1.4641302186646e-05;-0.00039280753117055;0.00012140376202296;0.0011440621456131;1.6084586604848e-06;-0.001244559767656;7.4139083153568e-05;-4.029766205349e-05;7.3784169217106e-05;0.00025692975032143;-0.00019906481611542;0.0011736130109057;-0.00040060849278234;-4.7459885536227e-05;-0.00022527655528393;-0.00013134928303771;0.00023165816674009;0.0003924339544028;-4.7612262278562e-05;0.0016831787070259;-0.00022466556401923;0.0011646491475403;-0.0001769434165908;-0.00014214894326869;-0.00065331516088918;-0.00018480187281966;-0.00016213110939134;0.00055693089962006;0.00016974241589196;0.00048352518933825;-0.0012955440906808;0.00019752867228817;-0.0013985201949254;0.00028954600566067;-0.00030416512163356;7.4684467108455e-05;-0.0012596236774698;0.00014532353088725;9.9454569863155e-05;-1.9741250071093e-05;-0.00022914876171853;-7.6546013588086e-05;-0.00092665746342391;-7.9839366662782e-05;-0.00072040170198306;-7.7259530371521e-05;0.0002908032911364;4.2501178540988e-05;-0.00018453827942722;-1.8359087334829e-05;-0.00045372694148682;-0.00027111850795336;0.00028911180561408;-0.00013791122182738;-7.1851070970297e-05;-0.00060960033442825;-0.00016308877093252;0.00051465909928083;0.00018171839474235;0.0010595361236483;9.4293754955288e-05;0.00060577254043892;0.00014456853386946;0.00050169578753412;0.00021179606846999;0.00031288890750147;7.2848437412176e-05;-0.00056662922725081;0.00018476905825082;-1.5158768292167e-05;-1.2374716789054e-05;0.00060506461886689;0.00011012411414413;0.00023439798678737;-2.7105279514217e-05;5.9993097238475e-05;-4.0034185076365e-05;-0.00015823889407329;0.00012830320338253;-0.00065637857187539;-7.5094417297805e-06;0.00052156194578856;-5.0298178393859e-05;0.00041730664088391;-9.3938520876691e-05;-0.00025896049919538;0.00018916261615232;0.00011818286293419;-0.00023394322488457;9.8850221547764e-05;-0.0001496297045378;-0.00017559762636665;-0.000377453136025;-4.0684401028557e-05;-0.00031259437673725;0.00011673341941787;0.00099720538128167;1.4419323633774e-05;-0.0010575673077255;5.6161363318097e-05;-5.3840853070142e-05;7.1801026933827e-05;0.00025255477521569;-0.0001702497684164;0.0011795996688306;-0.00033285780227743;5.1458573580021e-05;-0.00018673099111766;-0.0001399218745064;0.00020463230612222;0.00040238714427687;-3.4608554415172e-05;0.0015499405562878;-0.00015509499644395;0.0010517922928557;-0.00013646444131155;-0.00012684715329669;-0.00054627133067697;-0.00017411871522199;-0.00018873348017223;0.00048496469389647;5.7721204939298e-05;0.0004349579103291;-0.0012327539734542;0.00014678320439998;-0.0013653334463015;0.00021561580069829;-0.00031637997017242;5.272086491459e-05;-0.0011018619406968;0.00010513942834223;0.00010702717554523;-1.0261525858368e-05;-0.00015154863649514;-7.8804005170241e-05;-0.00073361117392778;-0.00015521363820881;-0.00056711572688073;-0.00013755614054389;0.00023827761469875;0.00010227062739432;-5.2472885727184e-05;-4.5682485506404e-05;-0.0001434693695046;-0.00034672301262617;0.00021684388048016;-0.00018055239343084;-0.00014289228420239;-0.00063060788670555;-0.00018096310668625;0.00055038864957169;0.00022214266937226;0.00092462170869112;0.0001782504550647;0.00026530449395068;0.00020130173652433;0.00033299330971204;0.00029192850342952;0.00010208252206212;0.0001109412041842;-0.00050852756248787;0.00022162725508679;-1.9225493815611e-05;-9.523890184937e-06;0.00050038582412526;0.00012233489542268;0.00028346866020001;3.2599677069811e-05;6.7330307501834e-05;-4.7947247367119e-05;-0.00026150760822929;0.00013639296230394;-0.00048288487596437;-1.0700185157475e-05;0.00038007175317034;-4.7154640924418e-05;0.00047571590403095;-7.5194853707217e-05;-0.00024195489822887;0.00023617222905159;0.00024357772781514;-0.000183145122719;6.2594328483101e-05;-0.0002740696654655;-0.0002665058709681;-0.00037207390414551;-6.3334555306938e-05;-0.00029518478550017;0.0001042331350618;0.00089495006250218;3.1828618375584e-05;-0.00095728464657441;3.6036162782693e-05;-6.9983536377549e-05;7.5996882515028e-05;0.00019847688963637;-0.00014863374235574;0.0011752508580685;-0.00026766167138703;0.00015763200644869;-0.00015227755648084;-0.00012943494948559;0.00017368537373841;0.00049371720524505;-2.3265774871106e-05;0.0014613778330386;-8.383428939851e-05;0.00089336081873626;-8.9017499703914e-05;-0.00011036532669095;-0.00048589901416562;-0.00018243900558446;-0.00016469218826387;0.00042156432755291;-4.2837928049266e-05;0.00042052805656567;-0.0011818973580375;9.8781747510657e-05;-0.0013200482353568;0.00013317553384695;-0.0004320134758018;3.182783984812e-05;-0.00091426412109286;6.3190331275109e-05;0.00010581935202936;-6.9752454692207e-06;-8.2650374679361e-05;-6.8469438701868e-05;-0.00059194269124418;-0.0001750577648636;-0.00042310598655604;-0.00016833508561831;0.00017050953465514;0.00015214963059407;7.8385883170995e-06;-5.4707546951249e-05;3.5721710446524e-05;-0.00037027627695352;0.00014706967340317;-0.00020572869107127;-0.00017968044267036;-0.00058106088545173;-0.00017469262820669;0.00053828197997063;0.00021571158140432;0.00077722198329866;0.00020052719628438;5.6041066272883e-05;0.00021574342099484;0.00021980653400533;0.00032570233452134;-1.3889752153773e-05;0.00012343615526333;-0.00043150212150067;0.00023649423383176;-1.8254626411363e-05;-5.6682802096475e-06;0.00038166099693626;0.00012575810251292;0.00030182415503077;7.9100325820036e-05;9.8573174909689e-05;-4.2439940443728e-05;-0.00032884199754335;0.00012464093742892;-0.00032328278757632;-1.6625153875793e-05;0.00025141608784907;-4.7284091124311e-05;0.00045503536239266;-5.0253336667083e-05;-0.00021536447457038;0.00027484374004416;0.0003253425238654;-0.00013035802112427;2.4137605578289e-05;-0.00037929497193545;-0.00032704131444916;-0.00032228894997388;-7.1363647293765e-05;-0.00026641649310477;8.2819708040915e-05;0.00073647941462696;4.8490259359824e-05;-0.0007840835605748;1.8739323422778e-05;-6.6652384703048e-05;6.8986955739092e-05;0.00015737232752144;-0.0001146706417785;0.0010745022445917;-0.00018563700723462;0.0002135383838322;-0.00010955568723148;-0.00011413910397096;0.00013768156350125;0.00047809677198529;-8.0419222285855e-06;0.0012816492235288;-1.3421929907054e-05;0.00072793097933754;-4.4145905121695e-05;-0.00010470961569808;-0.00040813471423462;-0.00016829866217449;-0.00013251659402158;0.00034964637598023;-0.00010302826558473;0.00036396889481694;-0.0010385633213446;4.0069004171528e-05;-0.0011782684596255;5.2674666221719e-05;-0.00044721239828505;1.1009408808604e-05;-0.00074250344187021;2.2373302272172e-05;6.8095709139016e-05;-6.2920375967224e-06;-1.479522416048e-05;-3.8819645851618e-05;-0.00037827822961845;-0.00011569348134799;-0.00025012361584231;-0.00012400667765178;9.1711684945039e-05;0.00013099380885251;-8.3937939052703e-06;-3.4075987059623e-05;7.3354087362532e-05;-0.00025283533614129;8.4076506027486e-05;-0.0001555499038659;-0.00013460782065522;-0.00037078766035847;-0.00011977428221144;0.00035374617436901;0.0001369017700199;0.00049825035966933;0.00013480345660355;-1.7982927602134e-05;0.00014288934471551;0.00012303801486269;0.00023186932958197;1.0924858315775e-06;7.9378674854524e-05;-0.00029815710149705;0.00016997232160065;-9.4851684480091e-06;-2.6875875391852e-06;0.00022528570843861;9.1189504018985e-05;0.00020909671729896;7.3203831561841e-05;0.0001103539034375;-2.2291444111033e-05;-0.00026274425908923;8.112657815218e-05;-0.00018712518794928;-1.6408643205068e-05;0.00012626433453988;-3.7188434362179e-05;0.00027311785379425;-2.6349869585829e-05;-0.00014217692660168;0.00022688086028211;0.00025496512535028;-7.5359414040577e-05;-5.7451552493148e-06;-0.00032706171623431;-0.00025514277513139;-0.00018139467283618;-4.8497655370738e-05;-0.00016852402768563;4.8937243263936e-05;0.00044023577356711;4.2303690861445e-05;-0.00044441188219935;9.6337034847238e-06;-3.5585915611591e-05;4.0128976252163e-05;0.00011510165495565;-6.0962465795456e-05;0.0007019272306934;-8.9179717178922e-05;0.00015456943947356;-5.5604828958167e-05;-7.8767530794721e-05;8.2573365943972e-05;0.00026850873837247;2.7587789190875e-06;0.00080931332195178;2.161006705137e-05;0.00047185103176162;-1.3842670341546e-05;-8.0844023614191e-05;-0.00024622352793813;-0.00010033240687335;-9.0446636022534e-05;0.00021899862622377;-8.5707106336486e-05;0.00021191922132857;-0.00065300689311698;-3.735266318472e-06;-0.00075878307688981;4.1443349800829e-06;-0.00025670978357084;-3.5213341220697e-07;-0.00049098551971838;-2.3352990865533e-06;-5.9931376199529e-06;-5.0554641347844e-05;9.8382675787434e-05;6.4104169723578e-05;0.00012957112630829;0.00033526952029206;8.3937375165988e-05;0.00035282343742438;-4.2004601709777e-05;-0.00015853784861974;5.0937473133672e-05;-1.0180931894865e-05;0.00027503748424351;-4.668867768487e-05;9.6213749202434e-05;-0.00011270409595454;5.8656194596551e-05;0.00036395189817995;8.0471436376683e-05;-0.00015067649655975;-0.0002727550745476;-9.2061163741164e-05;-0.00053817324806005;-0.00020536963711493;-3.7041463656351e-05;-0.00020231289090589;-0.00013015573495068;-0.00010491164721316;1.2549306120491e-05;-0.00013533273886424;0.00029354824800976;-7.8019893408054e-06;7.7925760706421e-06;8.3574203017633e-05;0.000222167262109;3.0251227144618e-05;0.00012511355453171;-4.7050452849362e-05;5.1078681281069e-05;9.0768051450141e-05;-0.00020673817198258;1.2218057236169e-05;-0.00023481485550292;-4.2031057091663e-05;0.00013837969163433;-4.7365239879582e-05;0.00029901199741289;-0.00015904437168501;0.00012939336011186;0.00019691753550433;4.9696311180014e-05;-4.9213886086363e-05;-0.00018230869318359;-0.00019544847600628;-6.7955814301968e-05;-0.0001208315952681;8.5690902778879e-05;-0.00015984784113243;2.4585848223069e-05;0.00044571707258001;2.0171861251583e-05;-0.00049207574920729;4.6853703679517e-05;-4.0898910810938e-05;-8.9761982962955e-05;0.00010863062925637;-0.00012115648132749;0.00060591090004891;-4.0224338590633e-05;9.9124554253649e-05;7.1740098064765e-05;-6.0591260989895e-05;-1.9985405685929e-07;0.0002547642798163;-1.1341055142111e-05;0.00073672470171005;-3.0294240787043e-05;0.00045381230302155;-6.9618414272554e-05;-0.00026345034711994;-0.00011183711467311;0.00025073761935346;-9.0925219410565e-05;0.00019542893278413;-1.1350020940881e-05;3.7815414543729e-05;-0.00058413384249434;2.7209831387154e-05;-0.00067912542726845;-3.8664543353661e-06;-0.00024269010464195;2.2559803255717e-05;-0.00045984765165485;-6.4148180172197e-06;-7.3307557613589e-05;0.00014293458661996;0.00010519391071284;0.00018048669153359;0.00053311587544158;0.00011131379142171;0.00058318517403677;-4.446961247595e-05;-0.00026600348064676;6.9532514316961e-05;9.839028280112e-06;0.00038717564893886;-1.7476348148193e-05;0.00013294005475473;-0.00019416127179284;7.9556710261386e-05;0.00055784732103348;0.00012361544941086;-0.00022583964164369;-0.00040305926813744;-0.00012983463238925;-0.00085255684098229;-0.00028829879011028;-0.00010681762796594;-0.00028075012960471;-0.0002290929260198;-0.00014414364704862;-3.7225432606647e-05;-0.00019300673739053;0.00047572201583534;-1.2871998478658e-05;8.5976789705455e-06;0.00012278075155336;0.00036798263317905;2.7282903829473e-05;0.00016773717652541;-6.8967725383118e-05;7.2408445703331e-05;0.00013980219955556;-0.00028599362121895;1.6438269085484e-05;-0.00040421073208563;-6.4696148911025e-05;0.00023895871709101;-8.1214151578024e-05;0.00043585358071141;-0.00024173407291528;0.00018612600979395;0.00025979019119404;8.0719153629616e-05;-9.3123504484538e-05;-0.00024963583564386;-0.00025469978572801;-9.13478579605e-05;-0.00017938889504876;0.00013460429909173;-0.00023761083139107;3.091546750511e-05;0.00070751720340922;3.9254482544493e-05;-0.00077127403346822;7.1305315941572e-05;-5.8829500630964e-05;-0.00014641118468717;0.00017924644635059;-0.00021329056471586;0.00092905573546886;-7.3644740041345e-05;0.00012098017759854;0.00011648321378743;-9.7024196293205e-05;-9.7706333690439e-06;0.00035971804754809;-4.758933573612e-05;0.0011352237779647;-6.0110072809039e-05;0.00073853274807334;-0.00010548093996476;-0.00040931371040642;-0.00016269405023195;0.00039882803685032;-0.00015488390636165;0.00030219694599509;2.1008136172895e-06;8.2410559116397e-05;-0.00089685595594347;7.3569084634073e-05;-0.00104729027953;7.3357300607313e-06;-0.00032974305213429;4.6666929847561e-05;-0.00075072143226862;-2.9512278842958e-07;-7.6558040746022e-05;0.00014777442265768;0.00013400067109615;0.00015842076390982;0.00065577228087932;8.3025966887362e-05;0.00075527065200731;-3.7814722873009e-06;-0.00034759257687256;5.83206419833e-05;8.9423418103252e-05;0.00036746825207956;0.00011031291796826;0.00011705353972502;-0.0002774074964691;6.2173887272365e-05;0.00062254874501377;0.00013796713028569;-0.0002411107707303;-0.00041433496517129;-0.00010983976972057;-0.0010298803681508;-0.00027015391970053;-0.00025624316185713;-0.00025195049238391;-0.00032481245580129;-0.00012929823424201;-0.0001788468362065;-0.00018815980001818;0.0006007322226651;-1.5661815268686e-05;5.9830531426996e-06;0.00012834246444982;0.00047867427929305;-1.3131052583049e-05;0.000135941314511;-6.7025088355877e-05;6.9138433900662e-05;0.00014694726269227;-0.00023844573297538;1.2875962056569e-05;-0.00054634269326925;-7.1860085881781e-05;0.00034442430478521;-0.00010167301661568;0.00042975178803317;-0.00027697201585397;0.00017763614596333;0.00019700202392414;0.00010724974708864;-0.00013538684288505;-0.00021296367049217;-0.00018933822866529;-7.6212359999772e-05;-0.00020689245138783;0.00015318740042858;-0.00024929203209467;2.2796908524469e-05;0.0008431164897047;5.6835531722754e-05;-0.00090870598796755;7.8541175753344e-05;-5.8609915868146e-05;-0.00018320318486076;0.00023941459949128;-0.00029631250072271;0.0010462397476658;-0.00010752397065517;5.5148684623418e-05;0.00014708968228661;-0.00011633193207672;-2.6159155822825e-05;0.00033527612686157;-0.00011331068526488;0.0013035297160968;-9.8210584837943e-05;0.00093906710390002;-0.00012143870117143;-0.00048171330126934;-0.00016595963097643;0.00048735673772171;-0.00020877811766695;0.00034469823003747;6.0098627727712e-05;0.00013927860709373;-0.0010200416436419;0.00014850989100523;-0.0011999792186543;3.1095005397219e-05;-0.00027808384038508;7.937725604279e-05;-0.00095906475326046;1.2421553947206e-05;-7.6929049100727e-05;0.00013570160081144;0.00017858190403786;8.4992621850688e-05;0.00079915457172319;3.2532636396354e-05;0.0009134805877693;4.594842903316e-05;-0.00040747047751211;3.0138835427351e-05;0.00020707883231808;0.000299400446238;0.00033842865377665;8.4114115452394e-05;-0.00035362938069738;1.9510334823281e-05;0.00062499335035682;0.00012923640315421;-0.00021248197299428;-0.00039363457472064;-4.2989086068701e-05;-0.0011680210009217;-0.00020732117991429;-0.00049643742386252;-0.00018068419012707;-0.00045518190017901;-9.3346985522658e-05;-0.00036662883940153;-0.00016251672059298;0.00068155792541802;-1.6191115719266e-05;3.4611007322383e-06;0.00012220718781464;0.00057182117598131;-6.5824984631035e-05;8.4856561443303e-05;-5.2515948482323e-05;6.4138359448407e-05;0.00013043924991507;-0.00014300356269814;5.137850621395e-06;-0.00066998560214415;-7.6829412137158e-05;0.00046159446355887;-0.0001108106225729;0.00036350675509311;-0.00029878731584176;0.00014704852947034;9.3033107987139e-05;0.00013461877824739;-0.00017162653966807;-0.00014391812146641;-8.9841130829882e-05;-4.5593242248287e-05;-0.00022538687335327;0.00015722935495432;-0.00024624174693599;1.3327590750123e-05;0.00092359009431675;7.1925926022232e-05;-0.00099137984216213;7.8492921602447e-05;-4.8801601224113e-05;-0.00021038250997663;0.0002955709642265;-0.0003667788405437;0.0010777856223285;-0.00013761522131972;-4.778735092259e-05;0.00017228387878276;-0.00012658271589316;-4.0930543036666e-05;0.00025785237085074;-0.00018188543617725;0.0013914877781644;-0.00013750260404777;0.0011072476627305;-0.0001377506996505;-0.00053924537496641;-0.00015457686095033;0.00055978453019634;-0.00024854840012267;0.00036068202462047;0.00014808963169344;0.00019080536731053;-0.001068472629413;0.000225913230679;-0.0012645546812564;5.5565953516634e-05;-0.00017668789951131;0.00011347443796694;-0.0011469330638647;2.9282977266121e-05;-8.4122686530463e-05;0.00012485797924455;0.00030692759901285;-2.8086997190258e-05;0.00099186575971544;-1.1902112419193e-05;0.0010611152974889;7.8613149526063e-05;-0.00041795047582127;-4.7899156925268e-06;0.00028475493309088;0.00023327971575782;0.00070719374343753;5.4009575251257e-05;-0.00041501148371026;-5.9335216064937e-05;0.00059985980624333;8.0706406151876e-05;-0.00014053948689252;-0.00040445986087434;6.2896207964513e-05;-0.0012788252206519;-0.00013430227409117;-0.00084435840835795;-0.00010808466322487;-0.0006401386926882;-6.0248552472331e-05;-0.00050454802112654;-0.00013611531176139;0.00065745628671721;-1.5007063666417e-05;2.6906343464361e-07;0.0001049824495567;0.00064860295969993;-0.00011228853691136;5.9295904065948e-05;-2.8214968551765e-05;1.3082142686471e-05;9.5188108389266e-05;-2.9453351089614e-05;1.0587827858899e-07;-0.00078776577720419;-8.4097657236271e-05;0.00058381969574839;-0.00010809172090376;0.00036334726610221;-0.00030822778353468;9.5274415798485e-05;-3.9575070331921e-06;0.00017626841145102;-0.00021965037740301;-8.7352491391357e-05;4.4497104681795e-05;-1.4148147783999e-05;-0.00023237313143909;0.00015154041466303;-0.00028886724612676;5.9490503190318e-06;0.0010283455485478;8.38868363644e-05;-0.0011349595151842;8.1784186477307e-05;-4.0373626688961e-05;-0.00023868543212302;0.00030926603358239;-0.00042898193350993;0.0010756951523945;-0.0001637911045691;-0.00014636278501712;0.00018634722800925;-0.0001118138898164;-5.615375994239e-05;0.00023990945192054;-0.00024336445494555;0.0014794863527641;-0.00016628757293802;0.0011972746578977;-0.00015025406901259;-0.00062111293664202;-0.00015647102554794;0.00062524224631488;-0.00024155409482773;0.00039247149834409;0.00024422214482911;0.00024118860892486;-0.0011117934482172;0.00028753254446201;-0.0012785487342626;7.819553866284e-05;-0.00015308336878661;0.00014299519534688;-0.0012729784939438;5.7460732932668e-05;-0.00010118041973328;0.00010702269355534;0.00059353467077017;-0.00022882242046762;0.0013481013011187;-6.2637089286e-05;0.0012449582573026;0.00010396249126643;-0.0003883185563609;-5.7957520766649e-05;0.00033255413291045;0.00014745636144653;0.0014152575749904;1.6957452317001e-05;-0.00043489466770552;-0.00020902033429593;0.00053410197142512;-2.3809699996491e-05;2.0556768504321e-05;-0.00048019777750596;0.00024492471129633;-0.0014014721382409;-2.5886416551657e-05;-0.0014654464321211;-8.6435402408824e-06;-0.0010017051827163;-1.8685332179302e-05;-0.00062853487906978;-0.00010079597268486;0.00047115932102315;-1.1740416994144e-05;-5.9900216911046e-06;7.3196890298277e-05;0.0007056049653329;-0.00016077044710983;5.4279986215988e-05;7.5492043833947e-06;-6.2070728745311e-05;4.1517145291436e-05;0.00011349358101143;-4.6504619604093e-06;-0.00092490145470947;-9.956416033674e-05;0.00073669903213158;-9.6911448054016e-05;0.00041435987805016;-0.00029399996856228;2.9855389584554e-05;-0.00011356404138496;0.00022529733541887;-0.00029136231751181;-3.2397045288235e-05;0.00021557213040069;2.876935286622e-05;-0.00020140326523688;0.00013891045819037;-0.00040030447416939;1.2580964892095e-07;0.0011819725623354;9.825213055592e-05;-0.0013658256502822;8.8197833974846e-05;-2.5208410079358e-05;-0.00027731631416827;0.00025951871066354;-0.00049503333866596;0.0010034117149189;-0.00019014476856682;-0.00028237354126759;0.00018583251221571;-5.2735453209607e-05;-7.6298172643874e-05;0.00027681098436005;-0.00031516826129518;0.0015756416833028;-0.00018698854546528;0.0012180432677269;-0.00015860843996052;-0.00076182989869267;-0.00017730440595187;0.0006988212116994;-0.00016469547699671;0.00045180457527749;0.00039138345164247;0.00030466172029264;-0.0011289949761704;0.00034420884912834;-0.0012046648189425;0.00010742679296527;-0.00020858141942881;0.00017454821499996;-0.0013743651797995;4.9756443331717e-05;-7.0021189458203e-05;5.2075818530284e-05;0.00051492417696863;-0.00024920827127062;0.0010129220318049;-5.9553021856118e-05;0.00083883502520621;6.7661363573279e-05;-0.00020506983855739;-6.3568557379767e-05;0.00021791826293338;4.4234035158297e-05;0.0012398504186422;-5.4439060477307e-06;-0.00025708111934364;-0.00020502222469077;0.00027874976512976;-7.8894387115724e-05;0.00010582988761598;-0.00033876125235111;0.00024986153584905;-0.00089720141841099;4.4330277887639e-05;-0.0012165947118774;4.3382438889239e-05;-0.00081077439244837;1.0278014087817e-05;-0.00043080118484795;-4.2984134779545e-05;0.00016037010936998;-5.9020549088018e-06;-5.7264405768365e-06;2.5697154342197e-05;0.00043423820170574;-0.00011474916391307;3.7974728911649e-05;2.0569468688336e-05;-6.8811583332717e-05;4.2073879740201e-06;0.00012081406021025;-3.1971819680621e-06;-0.00061733153415844;-6.799228140153e-05;0.00050139561062679;-5.437305662781e-05;0.00029753803391941;-0.0001589950552443;-8.5717229012516e-06;-0.00011282943887636;0.00015470721700694;-0.00021371888578869;-4.9542842361916e-07;0.00020444302936085;3.6516787076835e-05;-8.4596693341155e-05;7.8318873420358e-05;-0.00031320218113251;-2.4753287561907e-06;0.00078298384323716;6.6090302425437e-05;-0.00093252665828913;5.5345917644445e-05;-5.8971309044864e-06;-0.00018331804312766;0.00011763298971346;-0.00032240254222415;0.0005549801280722;-0.00012320860696491;-0.00022839399753138;0.00010516549809836;5.0949161050085e-06;-5.4688702221029e-05;0.00019361016165931;-0.00021899763669353;0.00098492112010717;-0.00011636149429251;0.00071424955967814;-9.6405390650034e-05;-0.00052406755276024;-0.0001197677484015;0.00044747357605956;-5.0526698032627e-05;0.00030053502996452;0.00030246036476456;0.00021035200916231;-0.00067412742646411;0.0002255086437799;-0.00067269563442096;7.7768600021955e-05;-0.00017017539357767;0.00011642464232864;-0.000850489072036;8.236535359174e-05;-4.4455933675636e-05;-0.00081014819443226;-2.119293094438e-05;-0.001510396017693;0.00029232274391688;-0.00081960210809484;4.8857324145501e-05;0.00014092492347118;-4.4503216486191e-05;-6.0398800997064e-05;4.9554906581761e-05;-0.0018174765864387;-3.6138353607384e-05;7.6956574048381e-05;6.9818429437873e-07;0.00022017587616574;-0.00027365604182705;0.00012735057680402;0.00060177990235388;-0.0001779284211807;0.00091311358846724;-0.0002974230737891;0.0017457904759794;-6.1053047829773e-05;0.0012437732657418;-4.2548024794087e-05;0.00026696859276854;-3.9631331674173e-06;0.0001726218033582;3.7629703001585e-05;-6.2893144786358e-05;9.0774774434976e-06;0.00040579927735962;-1.3608570952783e-05;0.00012417322432157;-6.9971400080249e-05;-0.00012233547749929;1.9915141820093e-05;5.9143858379684e-05;4.8072666686494e-05;-0.000638269004412;2.8166657557449e-06;0.00048225975478999;-4.5143788156565e-05;0.0005567439366132;-7.5475363701116e-05;-4.166214785073e-05;-6.3629641999796e-08;-0.00010542551899562;-0.0003217690391466;0.00011864207772305;0.00026585362502374;-3.6576468119165e-05;-6.1777129303664e-05;2.9451792215696e-05;-0.00047008052933961;6.8067914980929e-05;0.0010051237186417;-2.09711597563e-05;-0.0011805883841589;7.1469657996204e-05;-1.2855452951044e-05;6.6907981818076e-05;-9.3515263870358e-05;-0.00018704614194576;0.00062853650888428;-0.00035009370185435;-5.7852077588905e-05;-0.00019478135800455;5.0310035248913e-07;0.00014169410860632;0.00054342718794942;-6.9500732934102e-05;0.0012638082262129;-0.00024495497928001;0.00060045591089875;-0.00012704597611446;-4.4958054786548e-05;-0.00062663591234013;-0.00019882978813257;0.00011250646639382;0.00039740538340993;0.00022165231348481;0.00047567184083164;-0.00082041067071259;0.00023104377032723;-0.00083464634371921;0.00024760619271547;-0.0005713427090086;9.5208211860154e-05;-0.00072484824340791;0.00013289034541231;0.00010939865751425;-4.9602560466155e-05;-0.00097130500944331;-3.8159130781423e-05;-0.0017746618250385;0.00029629000346176;-0.0010008240351453;2.7764783226303e-05;0.00019924370280933;-4.4541360693984e-05;1.1431325219746e-05;4.3904365156777e-05;-0.0020531748887151;-9.6501964435447e-05;9.8903088655788e-05;-1.7415186448488e-05;0.00022747176990379;-0.00042210819083266;0.00012319968664087;0.0007866044761613;-0.00016157359641511;0.0011385082034394;-0.00028845816268586;0.0019595213234425;-3.2347510568798e-05;0.0014479453675449;-4.5633164518222e-06;0.00022978836204857;1.8562785044196e-05;0.00016629074525554;7.0408270403277e-05;-9.3878043117002e-05;1.3929049600847e-05;0.00053999049123377;-7.4215236054442e-06;0.00018669673590921;-7.3112227255479e-05;-0.00018694685422815;1.2497897841968e-05;4.1129776946036e-05;7.6746247941628e-05;-0.00077036616858095;3.7708746276621e-06;0.00058603746583685;-5.5332166084554e-05;0.00075583159923553;-0.00010074447345687;-6.726285937475e-05;1.1374704627087e-05;-8.2615493738558e-05;-0.00040432816604152;0.00014954205835238;0.00031031685648486;-7.9728284617886e-05;-0.00015315916971304;2.493219471944e-05;-0.0005681510665454;9.3813847342972e-05;0.0013069652486593;-2.5759625714272e-05;-0.0015343445120379;8.9575616584625e-05;-3.8491256418638e-05;9.6392934210598e-05;-0.00011703230120474;-0.00024662978830747;0.00091112562222406;-0.00045860602403991;-7.0212145146797e-06;-0.00025371034280397;-1.9245691873948e-05;0.00018849557091016;0.00078284041956067;-9.4513467047364e-05;0.0016841947799549;-0.00030830729519948;0.00078030105214566;-0.00016020423208829;-4.6867866331013e-05;-0.00079238234320655;-0.00026651204098016;0.00011897477088496;0.00050730357179418;0.00022150861332193;0.0006342971464619;-0.0011416812194511;0.00030286383116618;-0.0011712682899088;0.00031276923255064;-0.00080037256702781;0.00012197436444694;-0.00090575229842216;0.00016555629554205;0.00010856142034754;-1.3521604387279e-06;-0.00018023313896265;-7.4177696660627e-05;-0.00052826420869678;-0.00016194436466321;-0.00037682731635869;-0.00014949975593481;0.00015198047913145;0.00010635214130161;0.00012427706678864;-6.278368528001e-05;-2.0590525309672e-05;-0.00034895032877102;0.00011062064004363;-0.00016126490663737;-0.00014361503417604;-0.00054921279661357;-0.00013513147132471;0.00053883797954768;0.00019755605899263;0.00066937040537596;0.00018603003991302;8.8856686488725e-05;0.0002114951639669;0.00021618120081257;0.00028661722899415;-0.00016657830565237;0.00013447215314955;-0.00027031541685574;0.00019953236915171;-2.9849341444788e-05;-3.1971269436326e-06;0.00035040205693804;9.5410403446294e-05;0.00029027066193521;5.7748446124606e-05;-3.2103325793287e-05;-4.4950920710107e-05;-0.00023528387828264;0.0001031694773701;-0.00025689866743051;-5.4327138059307e-06;0.00025234743952751;-3.1506297091255e-05;0.00053316628327593;-4.3054620618932e-05;-0.00018091169476975;0.00015895762771834;0.00026805681409314;-0.00012361961125862;6.0386904806364e-05;-0.00021373345225584;-0.00026152469217777;-0.00036254478618503;-6.8451758124866e-05;-0.0002715427253861;7.3760391387623e-05;0.00073336076457053;3.1352647056337e-05;-0.0008572896476835;1.3505360584531e-05;-8.9277855295222e-05;7.9860379628371e-05;7.047712279018e-05;-0.00012751729809679;0.00099145236890763;-0.00020900553499814;0.00022880642791279;-0.00012007077748422;-8.6724874563515e-05;0.00012613063154276;0.00062373088439927;-2.2272339265328e-05;0.0012207914842293;-4.3101765186293e-05;0.0005734947626479;-4.6921948523959e-05;-6.1411854403559e-05;-0.00040620230720378;-0.00018439262930769;-7.8458353527822e-05;0.00031259565730579;-0.00010979553917423;0.00039719007327221;-0.0010049599222839;8.0524776421953e-05;-0.0010854618158191;6.98853036738e-05;-0.00059545133262873;1.8230728528579e-05;-0.00055758032249287;3.5435903555481e-05;0.0001207824316225;-8.1972677890008e-07;-0.00014643675240222;-7.4181341915391e-05;-0.00050671288045123;-0.00018147451919504;-0.0003383337170817;-0.0001679967099335;0.00013644245336764;0.00013069315173198;0.00012628178228624;-7.1235990617424e-05;6.3589141063858e-05;-0.00038529466837645;8.9552740973886e-05;-0.00018146548245568;-0.00017660795128904;-0.00056128145661205;-0.00014518851821776;0.00056298961862922;0.0002126591571141;0.00065587239805609;0.00020297302398831;1.1321697456879e-05;0.00023283362679649;0.00017663362086751;0.00031976049649529;-0.0002121891011484;0.0001516885968158;-0.00026437285123393;0.00021951779490337;-2.7565127311391e-05;-1.9597043774411e-06;0.00031400303123519;0.00010661737906048;0.00031348480843008;7.9907127656043e-05;-1.3247648894321e-05;-4.7143908886937e-05;-0.00027262856019661;0.00010004905925598;-0.00018037098925561;-9.087219950743e-06;0.00022004637867212;-3.2207386539085e-05;0.00053518213098869;-2.9959224775666e-05;-0.00018848298350349;0.00018044766329695;0.00032019068021327;-9.0151726908516e-05;4.8581321607344e-05;-0.00028216978535056;-0.00029814240406267;-0.00038095784839243;-7.7918979513925e-05;-0.00026638293638825;6.7133063566871e-05;0.00068617123179138;4.2528212361503e-05;-0.00081861508078873;2.6494878966332e-06;-9.2611167929135e-05;8.0669989984017e-05;6.5608059230726e-05;-0.00011837801866932;0.00099965545814484;-0.00018231190915685;0.00026080617681146;-0.00010710606875364;-8.640083251521e-05;0.00011999579146504;0.00064197811298072;-1.2738243640342e-05;0.0012128787348047;-9.8493646873976e-06;0.00054445757996291;-3.1298426620197e-05;-6.8183093389962e-05;-0.00039932527579367;-0.00019062114006374;-7.0823720307089e-05;0.00030413176864386;-0.00013340356235858;0.00039345005643554;-0.00099195598158985;5.3254818340065e-05;-0.0010891628917307;3.6482317227637e-05;-0.00063172494992614;5.6721291912254e-06;-0.00052326492732391;2.0118694010307e-05;-1.3397596376308e-05;-6.900166044943e-05;0.00012875578249805;0.0001108254873543;0.00016460876213387;0.00035068733268417;0.00010985891276505;0.00035168667091057;-5.2685780246975e-05;-0.00015391218767036;7.2130256739911e-05;-8.4971252363175e-05;0.00035254555405118;-8.6530846601818e-05;0.00010967752314173;-9.6174255304504e-05;6.8010696850251e-05;0.00042397898505442;8.0959747720044e-05;-0.00018067353812512;-0.0003449669748079;-0.00011559473205125;-0.00056594534544274;-0.00026603919104673;-4.429363343661e-06;-0.00025308763724752;-0.00011958646791754;-0.00014892611943651;0.0001439697080059;-0.00015799418906681;0.00024622166529298;-7.7511804192909e-06;1.1955671652686e-05;9.112263796851e-05;0.00022316869581118;4.6437889977824e-05;0.00016343698371202;-5.580082142842e-05;-1.8996272046934e-05;8.8372740719933e-05;-0.00021891525830142;2.3116621377994e-05;-0.00020840473007411;-3.9965976611711e-05;0.00014028085570317;-3.9110491343308e-05;0.00041798857273534;-0.00018286047270522;0.00010179648961639;0.00025265425210819;7.9420722613577e-05;-3.0424484066316e-05;-0.00021961062157061;-0.0001854119473137;-9.444315219298e-05;-0.00016795071132947;8.8645196228754e-05;-0.00019223667914048;2.7045545721194e-05;0.00050956924678758;1.1746986274375e-05;-0.00061487633502111;6.1613594880328e-05;-6.2167411670089e-05;-0.00010288730118191;8.5727733676322e-05;-0.00013269251212478;0.00070245162351057;-4.2187231883872e-05;0.00016195332864299;7.5298150477465e-05;-5.7328696129844e-05;2.3197894734039e-06;0.00040000065928325;2.9449058729369e-06;0.00085925823077559;-2.5165234546876e-05;0.00042686823871918;-6.9975438236725e-05;-0.0003080852329731;-0.00014835405454505;0.0002701602934394;-6.9456997152884e-05;0.00025011881371029;-4.7189481847454e-05;4.1422794311075e-05;-0.00069627643097192;9.8331720437272e-06;-0.00077065511140972;-1.5871431969572e-05;-0.00040507412631996;2.1927206034889e-05;-0.00041853188304231;-1.5366451407317e-05;-8.644288755022e-05;0.00016303530719597;0.00016120464715641;0.00020500665414147;0.0004769355582539;0.0001343559124507;0.00050204154103994;-5.6106659030775e-05;-0.00022172564058565;8.8838285591919e-05;-0.00010749343346106;0.00043618032941595;-6.5708882175386e-05;0.00013493359438144;-0.00014426767302211;7.9513629316352e-05;0.00056602212134749;0.0001066941767931;-0.00023405563842971;-0.00045003203558736;-0.0001494587486377;-0.00076990673551336;-0.00032951805042103;-4.332507160143e-05;-0.00031200828379951;-0.00018539237498771;-0.00018119465676136;0.00015169357357081;-0.00019763303862419;0.00034318096004426;-1.1521214219101e-05;1.0167595974053e-05;0.0001148306473624;0.00032300886232406;4.7172085032798e-05;0.00019977266492788;-7.0858273829799e-05;-3.4013868571492e-05;0.000121424527606;-0.00026962035917677;2.8233316697879e-05;-0.0003253108880017;-5.493752178154e-05;0.00020493390911724;-6.2769431679044e-05;0.0005497993552126;-0.00023553699429613;0.00012904533650726;0.00030064492602833;0.00010649722389644;-6.6167856857646e-05;-0.0002702375059016;-0.00020390732970554;-0.00011252348485868;-0.00021029954950791;0.00012212189903948;-0.0002549150667619;2.9658136554644e-05;0.00071142328670248;2.575487451395e-05;-0.00084186927415431;8.2555598055478e-05;-7.9484962043352e-05;-0.00014636224659625;0.00011913460184587;-0.00020405405666679;0.0009382507414557;-6.8489389377646e-05;0.00019319620332681;0.0001048918638844;-7.923245721031e-05;-8.9413824753137e-06;0.00051213789265603;-2.6404468371766e-05;0.0011499407701194;-4.4349671952659e-05;0.00060009298613295;-8.8862230768427e-05;-0.00041350905667059;-0.0001893626031233;0.00037004385376349;-0.00010445480438648;0.00033837623777799;-5.2077150030527e-05;8.1428566772956e-05;-0.00093186140293255;4.3317701056367e-05;-0.0010306454496458;-5.1645820349222e-06;-0.00050619931425899;3.8781970943091e-05;-0.00059269368648529;-8.7062217062339e-06;-6.767255399609e-05;0.00013251036580186;0.0001496280747233;0.00015358992095571;0.0004475508176256;9.6996292995755e-05;0.00050475297030061;-2.865920032491e-05;-0.00022114701278042;6.4661813667044e-05;-5.6802065955708e-05;0.0003380915732123;1.9201441318728e-05;0.00010413014388178;-0.00016712950309739;5.2176132157911e-05;0.00049555720761418;9.1865083959419e-05;-0.00019498438632581;-0.00037156057078391;-0.00011333724978613;-0.00071888649836183;-0.00025361319421791;-0.00010848222882487;-0.00023798503389116;-0.00020333398424555;-0.00013391494576354;4.3249187001493e-05;-0.00015864199667703;0.00035089557059109;-1.1239656487305e-05;3.8214870983211e-06;9.4647439254913e-05;0.00033009258913808;1.8699045540416e-05;0.00014596732216887;-5.5218748457264e-05;-2.8531823772937e-05;0.000108365820779;-0.00020396921900101;2.0393088561832e-05;-0.00036412657937035;-5.078414324089e-05;0.00021640733757522;-6.7423650762066e-05;0.00045802161912434;-0.00020454244804569;0.00011048937449232;0.00021147578081582;9.6932322776411e-05;-9.326634608442e-05;-0.00020706550276373;-0.00012820251868106;-8.0905898357742e-05;-0.00016786404012237;0.00011197737330804;-0.0002213146944996;1.9211303879274e-05;0.0006706576095894;3.4512864658609e-05;-0.00076721713412553;7.10086824256e-05;-6.2780840380583e-05;-0.00013992471212987;0.00012615264859051;-0.00021299316722434;0.00082992104580626;-7.5408621341921e-05;0.00012461993901525;0.00010090578871313;-7.5395721069071e-05;-1.9703649741132e-05;0.00039964762981981;-6.0650239902316e-05;0.001025261124596;-5.5538963351864e-05;0.00059638178208843;-7.8698918514419e-05;-0.00037283118581399;-0.00015366139996331;0.00034733093343675;-0.00011509583418956;0.0002984028251376;-1.6158124708454e-05;0.00010060500062536;-0.00082577479770407;7.8158547694329e-05;-0.00092110328841954;1.3435594155453e-05;-0.00037670254823752;4.7786183131393e-05;-0.00059719564160332;5.1283812354086e-05;-9.1182599135209e-05;7.8626231697854e-05;0.00072631309740245;-0.00027477100957185;0.0012308297445998;-3.1705931178294e-05;0.0010344404727221;7.1987415140029e-05;-0.00024685732205398;-5.5710333981551e-05;4.9628171836957e-05;0.00010467525135027;0.0014751224080101;-5.5536725085403e-07;-0.00023806728131603;-0.00024191031116061;0.00041755448910408;-0.00012354856880847;0.00011319624172756;-0.00053874833974987;0.00026088143931702;-0.0010750452056527;1.3734043932345e-05;-0.0013759498251602;1.2956763384864e-05;-0.0010415168944746;-2.0072648112546e-05;-0.00028859951999038;-6.2635321228299e-05;6.5646796429064e-05;-4.7728790377732e-06;-3.235424446757e-05;2.0010917069158e-05;0.00052889453945681;-9.2783469881397e-05;4.6000157453818e-05;1.6500622223248e-05;-0.00025518538313918;3.7311558116926e-05;9.01199382497e-05;1.4843911230855e-05;-0.00077817268902436;-7.6500728027895e-05;0.0004913306911476;-8.7128704763018e-05;0.00063681363826618;-0.00016275755479001;-3.6055826058146e-05;-5.8825655287364e-05;0.00019979126227554;-0.00029903661925346;-8.2858205132652e-05;0.00035566461156122;1.363102637697e-05;-5.2616709581343e-05;0.00010653374192771;-0.00040120555786416;-1.6703757864889e-05;0.0011318302713335;9.0041728981305e-05;-0.0013423606287688;9.5630370196886e-05;-3.7581219658023e-05;-0.00025644045672379;5.7024943089345e-05;-0.00045602105092257;0.00085357169155031;-0.0001728335628286;-9.9284894531593e-05;0.00013111402222421;-8.8342056869806e-07;-9.933827095665e-05;0.0005040216492489;-0.00029250318766572;0.0014041786780581;-0.00013417217996903;0.00078036764170974;-8.447423169855e-05;-0.00067104439949617;-0.00020380262867548;0.00054609583457932;-2.4618471798021e-05;0.00048330659046769;0.00023365498054773;0.00032013637246564;-0.0010106244590133;0.00028359887073748;-0.0010035628220066;0.00011540046398295;-0.00049832864897326;0.00014116367674433;-0.00090375187573954;5.0381306209601e-05;-7.2197384724859e-05;4.1882383811753e-05;0.00063191412482411;-0.00029434854513966;0.0010747916530818;-4.4967819121666e-05;0.00083886686479673;5.9326666814741e-05;-0.00016457428864669;-6.5845466451719e-05;7.975815969985e-05;3.4066837542923e-05;0.0013802266912535;-1.3733987543674e-05;-0.00016847030201461;-0.0002310441195732;0.00026457419153303;-0.00014203194587026;0.00015678731142543;-0.00042550024227239;0.0002805739059113;-0.00083888496737927;6.525785283884e-05;-0.00127075787168;5.260958278086e-05;-0.00094029930187389;6.599387688766e-06;-0.00028388973441906;-3.0410832550842e-05;-3.0660128686577e-05;-2.8913120786456e-06;-2.3615943064215e-05;2.8766255582013e-06;0.00037924290518276;-7.7297969255596e-05;1.5770207028254e-05;2.3609361960553e-05;-0.00019169108418282;1.5747174984426e-05;9.5490700914524e-05;1.0114272299688e-05;-0.00060870521701872;-5.9900747146457e-05;0.0003825951134786;-6.1554477724712e-05;0.00047850512783043;-0.00010160584497498;-3.8528200093424e-05;-7.7418160799425e-05;0.00014961521083023;-0.00023560247791465;-4.6425968321273e-05;0.00030572252580896;2.3118456738302e-05;1.1714437277988e-05;7.2626542532817e-05;-0.00033069823984988;-1.4091363482294e-05;0.00086098979227245;6.9860368967056e-05;-0.0010275718523189;6.7753237090074e-05;-1.5043581697682e-05;-0.00019626793800853;1.696873914625e-05;-0.00034665322164074;0.00057775579625741;-0.00013064632366877;-0.00011706980149029;9.1647576482501e-05;2.2607875507674e-05;-7.586714491481e-05;0.00036142460885458;-0.00023305372451432;0.0010410016402602;-0.0001015158413793;0.00056668813340366;-6.3615327235311e-05;-0.00053172296611592;-0.00015623857325409;0.00041676461114548;1.2836964742746e-05;0.00036585589987226;0.00022410220117308;0.00024840384139679;-0.0007124247495085;0.00022002798505127;-0.00069716922007501;9.2612528533209e-05;-0.00037539523327723;0.00011102621647296;-0.00068479427136481;7.9292163718492e-05;-3.7698329833802e-05;-0.00084033369785175;-2.1707924133807e-06;-0.001381560228765;0.00027830974431708;-0.00069131824420765;1.9374929252081e-05;0.00010484392987564;-4.3723666749429e-05;0.00018318126967642;3.3189837267855e-05;-0.0016926337266341;-3.8655551179545e-05;-0.00010707662295317;1.7307518646703e-05;0.00018812702910509;-0.00024325925915036;0.00017197837587446;0.00067021424183622;-0.0001961110974662;0.00070515350671485;-0.00026225668261759;0.0015075411647558;-5.6283111916855e-05;0.0012519357260317;-3.9254271541722e-05;-3.2473464671057e-05;1.4397674931388e-05;0.00041971664177254;2.0245142877684e-05;-0.00011656581045827;2.7655731173581e-05;0.00023266738571692;-4.1693085222505e-05;6.8702873250004e-05;-8.6874169937801e-06;-0.00022824453481007;1.2426274224708e-05;9.1573774625431e-06;5.8097972214455e-05;-0.00038285757182166;3.9297165130847e-06;0.00022188329603523;-2.9016900953138e-05;0.00064286531414837;-6.7171138653066e-05;6.152886635391e-05;-1.8109047232429e-05;-2.9637221814482e-05;-0.00027016739477403;6.3047031289898e-05;0.00030306621920317;-8.8174376287498e-05;1.2613502804015e-05;2.2120442736195e-05;-0.0003630303835962;4.75797605759e-05;0.00089092488633469;-2.695766488614e-05;-0.0010677857790142;5.9831701946678e-05;-3.4309032344026e-05;7.9283774539363e-05;-0.00026691134553403;-0.00018629072292242;0.00055005209287629;-0.00033177403383888;9.9537021014839e-05;-0.00017728007514961;2.0280092940084e-05;0.00010658289102139;0.00075759348692372;-8.752490975894e-05;0.0011564894812182;-0.0002316275058547;0.00033141090534627;-9.0843161160592e-05;2.5788522179937e-05;-0.00056913623120636;-0.00023353991855402;0.00019719103875104;0.00029874333995394;0.00011000644008163;0.0005092992214486;-0.00071853544795886;0.00025019486201927;-0.00076746009290218;0.00020461402891669;-0.00082373403711244;0.00010217816452496;-0.00039016711525619;0.00010988822032232;0.00011752875434468;-4.4147302105557e-05;-0.0010614221682772;-9.8847222034237e-06;-0.0016383361071348;0.00028306880267337;-0.0008274310384877;-1.44852538142e-05;0.00015056681877468;-4.6879427827662e-05;0.00037535739829764;2.1291056327755e-05;-0.0019470907282084;-0.00010497313633095;-0.00018099846784025;8.6068457676447e-06;0.00018593900313135;-0.00039032907807268;0.00018991477554664;0.00092004612088203;-0.00019396972493269;0.00085574970580637;-0.00024106030468829;0.0016875630244613;-2.5830573576968e-05;0.0015013504307717;-2.2715194347711e-07;-0.00022618687944487;4.8598558350932e-05;0.00056184752611443;4.582318069879e-05;-0.00018458750855643;4.5080221752869e-05;0.0003021908341907;-5.1957285904791e-05;0.00015131672262214;6.1157343225204e-06;-0.00034602105733939;-1.4859612065266e-06;-1.5872243238846e-05;8.6806750914548e-05;-0.00036791915772483;1.8466893152436e-06;0.00025602150708437;-3.7227055145195e-05;0.0008952155476436;-8.7479260400869e-05;8.4154700743966e-05;-2.3812353902031e-05;2.202951691288e-05;-0.00034057753509842;7.5580144766718e-05;0.00036134640686214;-0.00014185154577717;-0.00011213125981158;2.2338797862176e-05;-0.00044216605601832;6.6856759076472e-05;0.0011540899286047;-3.319183451822e-05;-0.0014200283912942;7.5318195740692e-05;-7.4528725235723e-05;0.00011996337707387;-0.00038213239167817;-0.00025496602756903;0.00080144597450271;-0.00044666984467767;0.00021206318342593;-0.00023673570831306;1.3925522580394e-05;0.0001423666253686;0.0011330296983942;-0.00012539533781819;0.0015703123062849;-0.00030084297759458;0.00040127799729817;-0.00011284016363788;5.5529770179419e-05;-0.0007402760675177;-0.00032615708187222;0.00025729250046425;0.00037971782148816;7.7705233707093e-05;0.00070441496791318;-0.0010160900419578;0.00034285546280444;-0.0010862734634429;0.00026081444229931;-0.0012067719362676;0.00013679379480891;-0.00043847018969245;0.00013864133507013;0.00010825247591129;3.9535270843771e-06;-0.00020684112678282;-6.7985769419465e-05;-0.0004042181535624;-0.00015512769459747;-0.00024774993653409;-0.00013972105807625;0.00010847520752577;8.6953252321109e-05;0.00021510227816179;-7.0288966526277e-05;3.2394702429883e-05;-0.00032507433206774;2.3253611288965e-05;-0.00012949813390151;-0.00013146777928341;-0.00047440352500416;-0.00010652982018655;0.00051053502829745;0.00017060758545995;0.00049031467642635;0.00018176551384386;2.0276847862988e-05;0.00020450750889722;0.00015684007667005;0.00025622572866268;-0.00032288455986418;0.00014214499969967;-9.7043659479823e-05;0.00016723152657505;-3.3846150472527e-05;-3.7594261925733e-08;0.00024381685943808;7.2702176112216e-05;0.00027996359858662;5.971760765533e-05;-9.4434341008309e-05;-4.5849697926315e-05;-0.00018843467114493;7.7432887337636e-05;-9.3598704552278e-05;-2.1637696079324e-07;0.00018492373055778;-1.9079860066995e-05;0.00052097334992141;-2.2920361516299e-05;-0.00013655395014212;8.5735351603944e-05;0.00025235550128855;-7.2221846494358e-05;6.0841568483738e-05;-0.0001527550193714;-0.00022145471302792;-0.00037151222932152;-6.6183121816721e-05;-0.0002331072173547;5.3916839533485e-05;0.00058790907496586;2.5595585611882e-05;-0.00075415818719193;4.7988459073167e-07;-0.00010153144103242;8.0245510616805e-05;-3.1311910788645e-06;-0.00011257725418545;0.0008317053434439;-0.00017429632134736;0.00025264004943892;-9.9508695711847e-05;-5.7450863096165e-05;9.488139039604e-05;0.00068288057809696;-2.3453219910152e-05;0.0010296599939466;-2.8236858270247e-05;0.00036400597309694;-2.6642383090802e-05;-2.6687146601034e-05;-0.0003405369061511;-0.00017746683442965;-2.6860390789807e-05;0.00023510887695011;-0.00013734026288148;0.00036763728712685;-0.0008675207500346;7.613496563863e-05;-0.00089586450485513;4.060232458869e-05;-0.00066608213819563;1.1443714356574e-05;-0.00032649704371579;2.4738246793277e-05;0.00015180528862402;3.2892230592552e-06;-0.00018296421330888;-7.6046235335525e-05;-0.00044668925693259;-0.00019524380331859;-0.00023461737146135;-0.00016995739133563;0.00010934781312244;0.00011417185305618;0.00019727110338863;-9.0037377958652e-05;0.00013117656635586;-0.00041366319055669;-9.9572855560837e-07;-0.00016215333016589;-0.00020006489648949;-0.00054805463878438;-0.00013228607713245;0.00060469389427453;0.00021932444360573;0.00054482871200889;0.00021282436500769;-3.786704473896e-05;0.00025578690110706;0.00013252830831334;0.00032378127798438;-0.00041187441092916;0.00018838213873096;-9.4791219453327e-05;0.00020809426496271;-3.1724459404359e-05;1.3971616681374e-06;0.00021463484154083;9.7092335636262e-05;0.00033928552875295;8.7554457422812e-05;-9.3333474069368e-05;-5.922179116169e-05;-0.00023466029961128;7.5244228355587e-05;4.2711937567219e-05;-2.8833692340413e-06;0.00018346187425777;-1.7960719560506e-05;0.00057033024495468;-2.6282752969564e-06;-0.00017098392709158;9.4579590950161e-05;0.00033980506123044;-8.9503910203348e-06;6.2780745793134e-05;-0.0002443112898618;-0.00027386724832468;-0.00048225469072349;-8.9132212451659e-05;-0.00024332031898666;4.9927992222365e-05;0.00056629505706951;4.133961192565e-05;-0.00079248059773818;-1.8727549104369e-05;-0.00012174409494037;9.2376110842451e-05;-8.5626570580644e-06;-0.00011533849465195;0.00092341058189049;-0.00016496135503985;0.00032029079739004;-9.5855539257172e-05;-6.2645558500662e-05;0.0001015884699882;0.00079804827691987;-1.1213783182029e-05;0.0011428577126935;1.0009815923695e-05;0.0003647914272733;-1.4792653018958e-05;-4.1277737182099e-05;-0.00038042370579205;-0.00021424923033919;-1.5628975233994e-05;0.00025755754904822;-0.00017036833742168;0.00041251996299252;-0.00093806302174926;5.0715512770694e-05;-0.0010064267553389;5.7955485317507e-06;-0.00081661174772307;-7.9419833127758e-06;-0.00030735091422684;1.349481226498e-05;0.00012957201397512;2.160963276765e-06;-9.0946079581045e-05;-5.2589766710298e-05;-0.00030501643777825;-0.00014114032092039;-0.00012184483057354;-0.00012000844435534;6.3438586948905e-05;8.3878578152508e-05;9.4235940196086e-05;-7.0516667619813e-05;0.0001571530738147;-0.00032113847555593;-2.860592212528e-05;-0.00011739754700102;-0.00017492481856607;-0.00037769626942463;-9.575801959727e-05;0.00043658257345669;0.00016687683819328;0.00036194149288349;0.00014038184599485;-6.0099351685494e-05;0.00019467472156975;6.053558900021e-05;0.0002429184387438;-0.00032912872848101;0.00015540405001957;-3.7281206459738e-05;0.00015433816588484;-1.388343389408e-05;3.0594826512242e-06;9.4876333605498e-05;7.7291362686083e-05;0.00024564421619289;7.3684954259079e-05;-6.5561544033699e-05;-4.6621342335129e-05;-0.00016610877355561;3.5742174077313e-05;0.00016188014706131;-2.2296151200862e-06;0.00010827249934664;-6.4331152316299e-06;0.00037697947118431;2.142403718608e-05;-0.00013441078772303;4.7638473915868e-05;0.00027342108660378;6.2462822825182e-05;4.6410772483796e-05;-0.00021082667808514;-0.00020096436492167;-0.00039096310501918;-7.4921292252839e-05;-0.0001467144174967;2.278382453369e-05;0.00030007972964086;3.7262565456331e-05;-0.0004971157759428;-3.2159645343199e-05;-9.204498201143e-05;6.5113526943605e-05;-1.0436301636219e-05;-6.8067114625592e-05;0.00061235926114023;-8.5245439549908e-05;0.00025024189380929;-5.1202288886998e-05;-3.880280564772e-05;6.4606232626829e-05;0.00057929789181799;6.9017442001496e-06;0.0007660849369131;4.4103391701356e-05;0.00019935813907068;2.2377919322025e-06;-3.7817964766873e-05;-0.00025882414774969;-0.00016165045963135;6.8561139414669e-06;0.00016845781647135;-0.00012783860438503;0.00028289543115534;-0.00060793966986239;3.8603193388553e-06;-0.00068082090001553;-3.1489475077251e-05;-0.00062740925932303;-2.6561625418253e-05;-0.0001447471731808;-1.4762857745154e-06;0.00010039857443189;3.1555375699099e-06;-5.273318674881e-05;-3.9295424357988e-05;-0.00020797197066713;-0.0001027094622259;-6.3801431679167e-05;-8.4059094660915e-05;3.8978738302831e-05;5.820777369081e-05;5.2791776397498e-05;-5.4880347306607e-05;0.00014383938105311;-0.00024258354096673;-3.295399073977e-05;-8.2486163591966e-05;-0.00013527281407733;-0.00026296250871383;-6.9213478127494e-05;0.00031173467868939;0.00012348919699434;0.0002432995242998;9.5660252554808e-05;-5.5531523685204e-05;0.00014738307800144;2.3709475499345e-05;0.00017799982742872;-0.00025950465351343;0.00012275214248803;-9.0774710770347e-06;0.00011163712042617;-3.478926828393e-06;2.80321273749e-06;4.2994437535526e-05;5.7667246437632e-05;0.00017776012828108;5.5766206060071e-05;-5.1921408157796e-05;-3.5627297620522e-05;-0.00011303050996503;1.6349764337065e-05;0.00017003052926157;-4.718603463516e-07;7.2349728725385e-05;-2.6909432904176e-07;0.00025998899945989;2.6609523047227e-05;-0.00010290051432094;1.7908168956637e-05;0.0002058403333649;7.6294367318042e-05;3.8248115743045e-05;-0.00015881162835285;-0.00014202152669895;-0.00030471771606244;-5.9546186093939e-05;-9.4408031145576e-05;1.006952697935e-05;0.00017134571680799;2.9249778890517e-05;-0.00033144908957183;-3.2622017897666e-05;-7.0509137003683e-05;4.649831680581e-05;-9.2490490715136e-06;-4.2617986764526e-05;0.00041830001282506;-4.6238095819717e-05;0.0001884054945549;-2.8999913411099e-05;-2.3815084205125e-05;4.2350351577625e-05;0.00042820573435165;1.2386005437293e-05;0.00052859721472487;4.8176483687712e-05;0.00011175317922607;7.027508218016e-06;-2.8308219043538e-05;-0.00017848388233688;-0.00012020178110106;1.2416840945662e-05;0.00011160929716425;-9.4818562502041e-05;0.0001978951622732;-0.00041629699990153;-1.1243150765949e-05;-0.00046945817302912;-3.8625468732789e-05;-0.00047395552974194;-2.9815004381817e-05;-6.5890555561054e-05;-5.0950625336554e-06;-1.9192055333406e-05;-6.8288063630462e-05;0.00010694355296437;8.9717323135119e-05;0.00013112160377204;0.00020426709670573;8.3597122284118e-05;0.0001311647502007;-3.4428339859005e-05;-7.074094901327e-05;6.4704086980782e-05;-9.7188392828684e-05;0.00028673533233814;-0.00013408386439551;6.5477885073051e-05;1.5832873032195e-05;6.1608763644472e-05;0.00027275338652544;5.11952675879e-05;-0.00013480728375725;-0.00026121718110517;-8.4616141975857e-05;-0.00029906549025327;-0.00021845968149137;4.0659328078618e-05;-0.00019257496751379;-3.5517216019798e-05;-0.00014347198884934;0.00025884478236549;-0.00010384462075308;3.2873103918973e-05;-2.8923407171533e-06;2.4465216483804e-05;5.8924648328684e-05;6.4936131821014e-05;4.3195199395996e-05;0.00013554701581597;-4.7136960347416e-05;-7.5221149018034e-05;3.4516455343692e-05;-0.0001236732059624;3.1245275749825e-05;2.4209020921262e-05;-1.0207701961917e-05;6.8496054154821e-05;2.2874833121023e-06;0.0003047420468647;-0.00013101832882967;-1.9692618025147e-06;0.0002078462857753;8.0012039688881e-05;6.4832100179046e-05;-0.00014261921751313;-0.00011907306179637;-9.1231158876326e-05;-0.00018674910825212;4.2816795030376e-05;-0.00011034321505576;1.5020819773781e-05;0.00023908556613605;-1.4971938981034e-05;-0.0003850715002045;4.6708319132449e-05;-6.3383326050825e-05;-5.3737734560855e-05;2.5481391276116e-05;-5.68516770727e-05;0.00044147556764074;-1.0364402442065e-05;0.00017222895985469;3.8224985473789e-05;-2.2596273993258e-05;1.6983054592856e-05;0.00038460170617327;4.2057661630679e-05;0.00055487250210717;-3.0244273148128e-06;0.00014731245755684;-4.01240431529e-05;-0.00018877335241996;-0.00012308056466281;0.00014189704961609;-5.4499532780028e-06;0.00017717941955198;-7.4366696935613e-05;3.393398174012e-06;-0.00046365486923605;-3.8180616684258e-05;-0.0004752914828714;-4.1480048821541e-05;-0.00042187990038656;9.0851417553495e-06;-0.00011926225852221;-2.1809864847455e-05;-8.6474741692655e-05;0.00013877858873457;0.00013082804798614;0.0001759121514624;0.00029739935416728;0.00011348307452863;0.00023221816809382;-4.7233163058991e-05;-0.00011526732123457;8.3985440141987e-05;-0.00013403134653345;0.00037392272497527;-0.00014464494597632;9.388256148668e-05;-1.0284656127624e-05;7.7786280598957e-05;0.0003925621858798;7.2653761890251e-05;-0.00018274990725331;-0.00035960815148428;-0.00012115325807827;-0.00045153780956753;-0.00028530659619719;3.6247547541279e-05;-0.00025706723681651;-7.4988740379922e-05;-0.00017909734742716;0.00030085010803305;-0.00014407877461053;9.4823830295354e-05;-5.8407258620718e-06;2.3056927602738e-05;8.1405101809651e-05;0.00013223453424871;5.4269290558295e-05;0.00017956880037673;-6.1581471527461e-05;-8.8575929112267e-05;6.1357168306131e-05;-0.00018020161951426;3.5925801057601e-05;-4.5394375774777e-05;-2.2833213733975e-05;0.00010704991291277;-1.2840427189076e-05;0.00042820925591514;-0.00017397926421836;2.58409363596e-05;0.00026964358403347;9.8693097243086e-05;4.4317686842987e-05;-0.0001995281490963;-0.00015555322170258;-0.00011212134995731;-0.0002273918944411;6.8779576395173e-05;-0.00016552922897972;2.1129884771653e-05;0.00039444959838875;-7.4288377618359e-06;-0.00056713144294918;6.5341053414159e-05;-8.0251411418431e-05;-8.6745269072708e-05;4.2945921450155e-05;-0.00010434368596179;0.00063726189546287;-2.7256304747425e-05;0.00021584246132988;5.9470989071997e-05;-3.8442663935712e-05;1.0842179108295e-05;0.00049886258784682;3.1188643333735e-05;0.00079324585385621;-1.1839339094877e-05;0.00026569166220725;-5.5432374210795e-05;-0.00027478777337819;-0.00016223739658017;0.00021755344641861;-2.4516246412531e-05;0.00025184365222231;-8.9855901023839e-05;2.6645924663171e-05;-0.00065848109079525;-2.5207404178218e-05;-0.00068740773713216;-3.7552013964159e-05;-0.00053320633014664;1.6776208212832e-05;-0.00023594954109285;-2.4029517589952e-05;-9.6363575721625e-05;0.00016002742631827;0.00018786829605233;0.00020846023107879;0.00036109890788794;0.00013444703654386;0.00031612871680409;-5.0555823690956e-05;-0.00015502449241467;9.8854943644255e-05;-0.0001947113632923;0.00042481144191697;-0.00013063478399999;0.00010922115325229;-2.8277303499635e-05;8.0483776400797e-05;0.00048991857329383;8.7984219135251e-05;-0.0002147567429347;-0.00044056167826056;-0.00015760361566208;-0.00056109682191163;-0.00032788922544569;2.5888832169585e-05;-0.00029524645651691;-0.00011552161595318;-0.00019963963131886;0.0003461520827841;-0.00016723865701351;0.0001278057025047;-9.0492349045235e-06;1.6060215784819e-05;9.1999827418476e-05;0.00019811379024759;5.6866356317187e-05;0.00020971498452127;-7.0642534410581e-05;-0.00012112739932491;8.4767088992521e-05;-0.00021066206682008;3.8650938222418e-05;-0.00012908122153021;-3.3622487535467e-05;0.00014262669719756;-3.1468593078898e-05;0.00054291443666443;-0.00019677322416101;3.8043643144192e-05;0.00029924715636298;0.00011487267329358;7.2146158345276e-06;-0.00023334591242019;-0.00014601163275074;-0.00012052009697072;-0.00025067420210689;9.0990499302279e-05;-0.00021322132670321;2.1631121853716e-05;0.00054747919784859;5.1273182180012e-06;-0.0007401205948554;8.2641941844486e-05;-9.4709423137829e-05;-0.00012050563964294;4.7723926400067e-05;-0.00016121967928484;0.00079859694233164;-4.9908197979676e-05;0.00024798841332085;7.705602911301e-05;-5.0359805754852e-05;-4.6605864554294e-06;0.00060193071840331;1.9943695406255e-06;0.00098791182972491;-2.3111992049962e-05;0.00035879298229702;-5.8956600696547e-05;-0.00034289798350073;-0.00018987391376868;0.00027746197883971;-4.0563001675764e-05;0.00032110302709043;-0.00010823866614373;6.6411652369425e-05;-0.00082685938104987;3.2723708045523e-06;-0.00085476890671998;-2.2221498511499e-05;-0.00062277400866151;2.7513442546478e-05;-0.00032877031480893;3.4449545637472e-05;-8.7170228653122e-05;5.5154294386739e-05;0.00070803269045427;-0.00019885247456841;0.00093241658760235;2.026342372119e-05;0.0007119175279513;4.976518539479e-05;-0.0001618686656002;-2.1013260266045e-05;-0.00026745686773211;0.00011382472439436;0.0011367041151971;-1.0957676749968e-05;2.8682057745755e-05;-0.00017565129383001;0.00035119752283208;-0.0001433723809896;0.00011069400352426;-0.00058264238759875;0.00015533315308858;-0.00068225571885705;-1.2978059203306e-05;-0.00093924184329808;-1.3056431271252e-05;-0.00090666924370453;-5.0358503358439e-05;0.00015402444114443;-4.0139591874322e-05;-0.0002687746018637;1.2316757420194e-05;-8.1309270171914e-05;-1.178725506179e-05;0.00031198759097606;-2.3809596427782e-07;3.8155620131874e-05;8.9632135313877e-07;-0.00041125065763481;4.7770077799214e-05;2.4579861928942e-05;2.3426096959156e-05;-0.00044812742271461;-4.6224296966102e-05;0.00017189438221976;-7.2651455411687e-05;0.00074207625584677;-4.0540820918977e-05;-7.3507842898834e-05;5.6050830608001e-05;0.00013062619837001;-0.00022764503955841;-0.0001442860084353;0.00038107519503683;-1.3399447198026e-05;-1.4404112334887e-05;7.4314491939731e-05;-0.00026591290952638;-2.6346431695856e-05;0.00094180717132986;7.0645459345542e-05;-0.0011499911779538;0.00010748054046417;-6.4318381191697e-05;-0.00022689762408845;-0.000125235383166;-0.00040828448254615;0.00074836640851572;-0.0001512732997071;0.00016417774895672;8.9217493950855e-05;8.9187597041018e-06;-0.00012123862688895;0.00074209400918335;-0.00024986983044073;0.001226956024766;-8.1579099060036e-05;0.0003658201021608;-8.7828084360808e-06;-0.00053563667461276;-0.00023508776212111;0.00037476001307368;8.6350621131714e-05;0.00050996080972254;1.3436675544654e-05;0.00032335452851839;-0.00090253417147323;0.00021160997857805;-0.00088055420201272;0.00011558349069674;-0.0007890731212683;0.0001002595454338;-0.00040798136615194;4.1508577851346e-05;-6.8232431658544e-05;2.2491773052025e-05;0.00063293374842033;-0.00026643980527297;0.00093232205836102;-1.5795449144207e-05;0.00066992064239457;4.8226826038444e-05;-0.00011549865303095;-4.8208192310994e-05;-0.0001118786240113;3.269827720942e-05;0.0012322783004493;-2.2645344870398e-05;3.7855054415559e-06;-0.00019476824672893;0.00021932242088951;-0.00016838860756252;0.00016818937729113;-0.00046469055814669;0.00023505679564551;-0.00061377807287499;5.9590933233267e-05;-0.0010412156116217;4.3666612327797e-05;-0.00091050990158692;-8.5059300545254e-06;-2.681518526515e-05;-1.4324420590128e-05;-0.00025029684184119;7.9694891610416e-06;-5.5669086577836e-05;-1.7356987882522e-05;0.00022615569469053;-9.6925077741616e-06;-2.2898693714524e-05;1.5785290088388e-05;-0.00029200842254795;2.6085179342772e-05;4.7156019718386e-05;1.6817051800899e-05;-0.00041278675780632;-3.8740345189581e-05;0.00015144622011576;-5.4187308705878e-05;0.00054912379710004;-1.4210162589734e-05;-5.7457476941636e-05;-4.0688014451007e-06;9.5008777861949e-05;-0.00018462882144377;-9.4155679107644e-05;0.0003338897950016;3.4270281048521e-06;8.2812388427556e-05;5.0078109779861e-05;-0.00023356032033917;-2.1876601749682e-05;0.00075584888691083;5.8117009757552e-05;-0.00090642273426056;7.3655428423081e-05;-2.5826395358308e-05;-0.00018074382387567;-0.00011527503374964;-0.00031963700894266;0.00050463498337194;-0.00011819761130027;5.1984679885209e-05;6.5774394897744e-05;2.9436234399327e-05;-8.9704153651837e-05;0.00051187258213758;-0.0002101472200593;0.00093631958588958;-6.8835135607515e-05;0.00030719296773896;-1.200393671752e-05;-0.00045565637992695;-0.00018123771587852;0.0003106324293185;9.1905436420348e-05;0.00038927793502808;9.1267225798219e-05;0.00025382338208146;-0.00062790140509605;0.00017664572806098;-0.00062661961419508;9.4865732535254e-05;-0.00057096523232758;8.6358646512963e-05;-0.00037289678584784;7.6923868618906e-05;-3.0906507163309e-05;-0.0006999175529927;1.1408403224777e-05;-0.0010591296013445;0.00020545517327264;-0.00049289525486529;-5.4421884669864e-06;8.1074758782052e-05;-3.8602567656199e-05;0.00028808080242015;1.6089717973955e-05;-0.0012919881846756;-4.5492553908844e-05;-0.00020647556812037;2.1596541046165e-05;0.00011518681276357;-0.00020477898942772;0.00015368453750852;0.00060902663972229;-0.00015496746345889;0.0004698088450823;-0.00017649804067332;0.0010807499056682;-3.675455445773e-05;0.0010280767455697;-2.056582889054e-05;-0.00021685943647753;2.8212713004905e-05;0.00048391442396678;1.1984369848506e-05;-0.00014654961705673;4.0826507756719e-05;9.0652407379821e-05;-4.9243510147789e-05;5.030668398831e-05;2.8455129722715e-05;-0.00024853899958543;-6.6920841845786e-07;-1.5242218978528e-05;5.0435588491382e-05;-8.9698027295526e-05;-3.0039182092878e-06;4.4581054680748e-05;-1.7559632397024e-05;0.00055253785103559;-4.6270328311948e-05;0.00011142392031616;-2.2845177227282e-05;3.1501313060289e-05;-0.00017922720871866;1.1233795703447e-05;0.00024255740572698;-9.8265743872616e-05;-2.5266203010688e-05;1.9641605831566e-05;-0.00021253636805341;2.7251464416622e-05;0.00064069498330355;-2.2237238226808e-05;-0.00080641434760764;4.1468018025625e-05;-4.644144064514e-05;7.7618526120204e-05;-0.00032815296435729;-0.00015984498895705;0.00042071347706951;-0.00027373878401704;0.00018122774781659;-0.00014128265320323;2.2578751668334e-05;7.452458521584e-05;0.00077920022886246;-8.6301784904208e-05;0.00092527887318283;-0.00018922411254607;0.00013705088349525;-5.8375440858072e-05;6.2639308453072e-05;-0.00045446067815647;-0.00022279798577074;0.00021747023856733;0.00019971908477601;3.2372947316617e-05;0.00045585850602947;-0.00054993329104036;0.00022529253328685;-0.00062564772088081;0.00015014842210803;-0.00085589609807357;9.1120491561014e-05;-0.00014145800378174;8.0741396232042e-05;0.0001490909489803;-4.7153749619611e-05;-0.00097428460139781;2.285024675075e-05;-0.0013397238217294;0.00020500121172518;-0.00058841414283961;-5.4000596719561e-05;0.00012770079774782;-4.8502908612136e-05;0.00057547038886696;2.5799420200201e-07;-0.0015720428200439;-0.00012445030733943;-0.00040374524542131;2.1317528080544e-05;7.375878340099e-05;-0.00036717674811371;0.00018784624990076;0.00095402461010963;-0.00015381244884338;0.00055947707733139;-0.00013686211605091;0.0012418830301613;-7.8719331213506e-06;0.0013495233142748;2.5901308617904e-05;-0.0005787864793092;7.7835022239015e-05;0.00079175853170455;3.3130789233837e-05;-0.00027939418214373;8.0921621702146e-05;6.314946222119e-05;-7.7773991506547e-05;0.00017701697652228;6.6898071963806e-05;-0.00041536195203662;-3.0307535780594e-05;-4.8595167754684e-05;7.8244782343972e-05;0.00019849662203342;-1.6348920325981e-05;-3.7030408748251e-06;-2.6722998882178e-05;0.00082793895853683;-5.6535413023084e-05;0.00020042913092766;-4.0305319998879e-05;0.00013057519390713;-0.00021453945373651;-1.5896341210464e-05;0.00027637463063002;-0.00015923469618428;-0.00025608282885514;3.2288789952872e-05;-0.00024025460879784;3.8411697460106e-05;0.00080950203118846;-2.6217656341032e-05;-0.0011254588607699;5.2484992920654e-05;-0.00010628023301251;0.00013541254156735;-0.00056530465371907;-0.0002457924420014;0.00063559762202203;-0.00040520692709833;0.00037387950578704;-0.00020494185446296;2.6898611395154e-05;0.0001033787993947;0.0013366600032896;-0.00014238877338357;0.001354746054858;-0.00027116533601657;9.4899085524958e-05;-7.1211012254935e-05;0.00013146114361007;-0.00064828048925847;-0.00035526696592569;0.00034709004103206;0.00025595733313821;-2.8030170142301e-05;0.00070747657446191;-0.00081247475463897;0.0003495741111692;-0.00094996206462383;0.00020122570276726;-0.0014509670436382;0.00013803540787194;-4.3081076000817e-05;0.0001080612273654;0.00018186177476309;6.1338903378783e-07;-0.00015646444808226;-6.1880666180514e-05;-0.00037172852898948;-0.00018646634998731;-0.00011509178875713;-0.0001468869013479;8.0107645771932e-05;8.5856438090559e-05;0.00014401588123292;-9.1324887762312e-05;0.00018591491971165;-0.00038872330333106;-8.6972104327288e-05;-0.00012759397213813;-0.0002238774613943;-0.00047275039833039;-0.00011653488763841;0.00056761910673231;0.00021347645088099;0.00040395651012659;0.00019190151942894;-4.2954488890246e-05;0.00023866732954048;8.0537443864159e-05;0.00029055189224891;-0.0004937780322507;0.00019811940728687;4.6500808821293e-05;0.00017332768766209;-2.7590887839324e-05;2.7783366931544e-06;7.4732612119988e-05;8.418557990808e-05;0.00033018313115463;8.3228667790536e-05;-0.0001228525507031;-6.917366408743e-05;-0.00017676604329608;4.3648771679727e-05;0.00030960064032115;2.3403054001392e-06;0.00013506994582713;-3.929526428692e-06;0.00047826702939346;2.5254408683395e-05;-0.00014096038648859;1.0306158401363e-05;0.00032312460825779;9.7670628747437e-05;5.8310481108492e-05;-0.0002238572051283;-0.00021006776660215;-0.00055798242101446;-8.9463297626935e-05;-0.00017098859825637;2.8706181183225e-05;0.00032129156170413;3.6602163163479e-05;-0.00061471213120967;-3.6956775147701e-05;-0.00013240182306617;9.0665365860332e-05;-5.3543175454251e-05;-9.4274691946339e-05;0.00072050385642797;-0.00012407531903591;0.00033118561259471;-6.8206529249437e-05;-3.7533995055128e-05;7.4376497650519e-05;0.00081097125075758;-5.0603221097845e-06;0.00092888349900022;3.165086673107e-05;0.00017249601660296;-5.879301738787e-07;-2.1967505745124e-05;-0.00030901230638847;-0.00020952892373316;2.5016222934937e-05;0.000188432255527;-0.00017117739480454;0.00036641143378802;-0.00074434041744098;3.4480370231904e-05;-0.00080700538819656;-2.4929562641773e-05;-0.00086697365622967;-2.2790773073211e-05;-8.8327724370174e-05;6.6641787270783e-06;0.00019168277503923;3.8722564568161e-06;-0.00011284473293927;-6.5666768932715e-05;-0.00036411339533515;-0.0001871057174867;-8.9435969130136e-05;-0.00014575783279724;7.0164875069167e-05;9.0921734226868e-05;9.6512390882708e-05;-9.7918607934844e-05;0.00024698243942112;-0.00041792026604526;-9.1666588559747e-05;-0.00013322691665962;-0.0002460076357238;-0.00046386080794036;-0.00012095551937819;0.00056300329742953;0.00022287465981208;0.00040097761666402;0.00017811650468502;-7.5804273365065e-05;0.00025482219643891;4.6261724492069e-05;0.00030495747341774;-0.00050079013453797;0.00021796458167955;4.0377941331826e-05;0.00018358266970608;-1.1053463822464e-05;3.6370070120029e-06;4.3061998439953e-05;9.4967006589286e-05;0.00032480410300195;9.234574099537e-05;-0.00011241992615396;-7.0535330451094e-05;-0.00018128770170733;2.9084503694321e-05;0.00037554168375209;2.7385249268264e-06;0.0001256786781596;2.0109421257075e-06;0.00045439600944519;4.5335091272136e-05;-0.00016538420459256;5.4107164260131e-07;0.0003511231043376;0.00015285132394638;6.6233733377885e-05;-0.00025925927911885;-0.00022275533410721;-0.00057995063252747;-0.0001025780220516;-0.00015530455857515;1.8390830518911e-05;0.00025711258058436;4.460669515538e-05;-0.00056924391537905;-5.4688247473678e-05;-0.00013405036588665;8.7265856564045e-05;-3.8623336877208e-05;-7.9650955740362e-05;0.00070367025909945;-9.2159214545973e-05;0.00034289198811166;-5.2958072046749e-05;-3.5824305086862e-05;7.0658890763298e-05;0.00079958455171436;1.3301295439305e-05;0.00090627413010225;7.0082736783661e-05;0.00014873599866405;9.5767263701418e-06;-3.6194986023474e-05;-0.00030294377938844;-0.00021540846501011;3.0869436159264e-05;0.0001830754627008;-0.00017355479940306;0.00035389568074606;-0.00071322894655168;-2.0824834336963e-06;-0.0007956747431308;-5.8523248299025e-05;-0.00088193250121549;-4.5919590775156e-05;-5.7872726756614e-05;-3.2806042327138e-06;0.00014657048450317;5.8691502999864e-06;-6.2886065279599e-05;-5.3131134336581e-05;-0.00026856688782573;-0.00013925551320426;-5.4067782912171e-05;-0.0001078291243175;4.7299916332122e-05;7.0082678576e-05;4.9787224270403e-05;-7.7401135058608e-05;0.00021991271933075;-0.00033132071257569;-6.8821798777208e-05;-0.00010250571358483;-0.00019300133862998;-0.000342023500707;-9.2972513812128e-05;0.00041731094825082;0.00017075464711525;0.00030047443578951;0.00012404385779519;-7.403947529383e-05;0.00020167346519884;1.4368081792782e-05;0.00023637572303414;-0.00038090019370429;0.00017572520300746;2.477294037817e-05;0.00014370139979292;2.4396335902566e-06;3.7404408885777e-06;1.9408455045777e-05;7.6770476880483e-05;0.000240432593273;7.3627226811368e-05;-8.0560086644255e-05;-5.3124716941966e-05;-0.00013711718202103;1.2961792890565e-05;0.00030852624331601;2.8294928142714e-06;9.2427908384707e-05;5.5394884839188e-06;0.00033111122320406;4.5794833567925e-05;-0.00013982500240672;-6.2955532484921e-06;0.00027836719527841;0.00014323071809486;5.7288893003715e-05;-0.00021092868701089;-0.00017480060341768;-0.00044673334923573;-8.5046842286829e-05;-0.00010977124475176;7.7980112109799e-06;0.00016434284043498;3.7721983972006e-05;-0.00040829589124769;-5.1860242820112e-05;-0.00010236972593702;6.3255400164053e-05;-1.8387831005384e-05;-5.1225506467745e-05;0.00052337377564982;-5.0167083827546e-05;0.00026335354777984;-3.0974122637417e-05;-2.5686818844406e-05;5.1183320465498e-05;0.00059671024791896;2.155666697945e-05;0.00067361100809649;7.5674353865907e-05;0.00010083719098475;1.2848920050601e-05;-3.4608343412401e-05;-0.00022470176918432;-0.00016556917398702;2.518803376006e-05;0.00013439999020193;-0.00013139078509994;0.00025896832812577;-0.0005269618704915;-2.3353382857749e-05;-0.00059467024402693;-6.3921921537258e-05;-0.00067045597825199;-4.9233778554481e-05;-2.9507102226489e-05;-7.7752265497111e-06;-3.092529004789e-05;-0.00010212429333478;0.00015083988546394;0.00012185418745503;0.00018243287922814;0.00026078036171384;0.00011218151485082;0.00012353350757621;-4.1556333599146e-05;-8.1964615674224e-05;9.1524969320744e-05;-0.00013352639507502;0.0003979871107731;-0.00021129466767889;7.9572782851756e-05;6.2768551288173e-05;9.1450834588613e-05;0.00035444728564471;6.883484456921e-05;-0.00018751781317405;-0.00035670571378432;-0.00011444665869931;-0.00035986452712677;-0.00030372777837329;6.4593041315675e-05;-0.00026117949164473;-2.8439038942452e-05;-0.00020879962539766;0.00041186934686266;-0.00013267235772219;-1.9926539607695e-05;-3.1497165764449e-06;4.288908894523e-05;7.6229385740589e-05;4.023810106446e-05;5.8752772019943e-05;0.00018954440020025;-6.8284381995909e-05;-0.00012481524026953;3.4635311749298e-05;-0.00014879321679473;4.9841870350065e-05;0.00011966069723712;-4.4864436858916e-06;8.2442660641391e-05;1.5299523511203e-05;0.0004016476450488;-0.00017764707445167;-4.1355247958563e-05;0.00028711877530441;0.00011938311217818;0.00013277713151183;-0.00017764064250514;-0.00015439419075847;-0.00013306099572219;-0.0002886577276513;4.9330214096699e-05;-0.00013237292296253;1.5525562048424e-05;0.00025333446683362;-2.9381257263594e-05;-0.00048461166443303;6.3891071476974e-05;-9.4946990429889e-05;-6.2602797697764e-05;2.3541024347651e-05;-6.2112681916915e-05;0.00056411075638607;-5.2478962970781e-06;0.00025604231632315;4.4946318666916e-05;-2.26055708481e-05;2.9074124540784e-05;0.00055944098858163;7.138915680116e-05;0.00071891286643222;2.2815801514753e-07;0.00012892512313556;-4.9501952162245e-05;-0.00023575086379424;-0.00017276545986533;0.00016708248585928;8.0398331192555e-06;0.0002362396044191;-0.00011810361320386;-4.783184522239e-06;-0.00060714554274455;-6.8295485107228e-05;-0.00060458405641839;-6.9155583332758e-05;-0.00062527926638722;1.1836224985018e-05;-8.0819125287235e-05;-3.6726505641127e-05;-0.00013576213677879;0.00018891035870183;0.00018098221335094;0.00024054750974756;0.00034438562579453;0.00014657525753137;0.00017803288938012;-5.1027083827648e-05;-0.00011684915079968;0.00011822632222902;-0.00019415993301664;0.00050051615107805;-0.00024622774799354;0.00010199563257629;8.2715843745973e-05;0.00011863039253512;0.00047790160169825;9.1749294369947e-05;-0.00024590731482022;-0.0004794848500751;-0.00016286785830744;-0.0004756908165291;-0.00038388479151763;7.050514977891e-05;-0.00033273414010182;-5.6768541981e-05;-0.00026089046150446;0.00053737655980512;-0.00016826002683956;-3.1809402571525e-05;-6.8262147578935e-06;4.5047338062432e-05;9.6380383183714e-05;6.6747932578437e-05;7.3130744567607e-05;0.00025070301489905;-8.900702232495e-05;-0.00017426363774575;5.3531253797701e-05;-0.00019098773191217;6.0737565945601e-05;0.00013459927868098;-1.1125857781735e-05;0.00011106011515949;8.5501960711554e-06;0.0005406733835116;-0.00021719375217799;-4.9551064876141e-05;0.00036090283538215;0.0001459815830458;0.00014724733773619;-0.00022526412794832;-0.00017958293028641;-0.00016231168410741;-0.00037364760646597;7.0202462666202e-05;-0.00017816462786868;1.7979873518925e-05;0.0003640383365564;-2.7416554075899e-05;-0.00066217081621289;8.8581968157087e-05;-0.00012442853767425;-9.4492810603697e-05;2.0987763491576e-05;-0.00010978167119902;0.00075100950198248;-1.9895913283108e-05;0.0003338496608194;6.1544305935968e-05;-3.1482752092415e-05;2.1276964616845e-05;0.0007422348135151;6.4693820604589e-05;0.00095620285719633;-5.0500611905591e-06;0.00018137820006814;-5.7616794947535e-05;-0.00031420923187397;-0.00022368656937033;0.00022654593340121;6.8993413151475e-06;0.00032473725150339;-0.00015917327255011;2.2848200387671e-05;-0.00080803228775039;-6.3621148001403e-05;-0.0008025502320379;-6.9878173235338e-05;-0.00081877736374736;1.9784612959484e-05;-0.00011989849008387;-3.1197469070321e-05;-0.00012577731104102;0.0001706780603854;0.00020859205687884;0.00023091904586181;0.00032472790917382;0.00014058988017496;0.00019294831145089;-4.4406828237697e-05;-0.00012373890785966;0.00011219309089938;-0.00023066381982062;0.00045254218275659;-0.00019662389240693;9.4427639851347e-05;7.4896415753756e-05;0.0001035274399328;0.00047325028572232;8.8437911472283e-05;-0.00022957881446928;-0.00047185758012347;-0.00017399725038558;-0.00045679396134801;-0.00035147572634742;5.6562224926893e-05;-0.00030556292040274;-7.6815427746624e-05;-0.00023369272821583;0.00051654491107911;-0.00015429085760843;-3.4363813028904e-05;-8.6077698142617e-06;2.6977388188243e-05;8.5188934463076e-05;9.3232178187463e-05;6.4800653490238e-05;0.00024156463041436;-8.247797813965e-05;-0.00018482442828827;6.1620579799637e-05;-0.00017716072034091;5.1963888836326e-05;7.4577066698112e-05;-1.7658647266217e-05;0.00011290454858681;-6.8826957431156e-06;0.00054651900427416;-0.0001874107401818;-4.0082522900775e-05;0.0003232461749576;0.00012962071923539;9.5306786533911e-05;-0.00020884261175524;-0.00013393101107795;-0.00013899632904213;-0.0003418578999117;7.4165196565446e-05;-0.00018222445214633;1.4856622328807e-05;0.00041111407335848;-1.2286283890717e-05;-0.00068441440816969;9.0359499154147e-05;-0.00011825979891;-0.00010775193368318;5.656143912347e-06;-0.00014122723951004;0.00074312888318673;-3.6775185435545e-05;0.00031450387905352;6.2563238316216e-05;-3.2654843380442e-05;-1.8520275091305e-07;0.00072395737515762;2.507007047825e-05;0.00094106874894351;-1.138106927101e-05;0.000196936816792;-4.383769191918e-05;-0.00031035125721246;-0.00020935627981089;0.00022744586749468;1.6779423503976e-06;0.00033134789555334;-0.00015818381507415;5.9290741774021e-05;-0.00080252776388079;-2.7788222723757e-05;-0.0007869215332903;-4.0937171434052e-05;-0.00077684316784143;2.4305261831614e-05;-0.00014233023102861;4.7598201490473e-05;-0.00012953624536749;1.2600049558387e-05;0.00072388973785564;-0.00018629072292242;0.00086864794138819;4.892576180282e-05;0.00057002977700904;5.1412633183645e-05;-0.00013248150935397;-1.62922005984e-05;-0.00042501292773522;0.00011849239672301;0.0011262343032286;-2.5730083507369e-05;0.00027351375319995;-9.681552182883e-05;0.00031322042923421;-0.00018755363998935;0.00011754073784687;-0.00068010186078027;0.00013192277401686;-0.00047033783630468;2.0972370293748e-06;-0.00079484860179946;-2.4403343559243e-05;-0.00099282176233828;-7.0726273406763e-05;0.00043549496331252;-2.2497650206788e-05;-0.0005861705285497;4.8414032789879e-05;-0.00017093381029554;-3.5940196539741e-05;7.6986536441837e-05;7.4430194217712e-05;3.5163353459211e-05;-2.2983884264249e-05;-0.00050477375043556;4.5928740291856e-05;-3.3208564218512e-06;7.3265232458652e-06;8.2701290011755e-06;-3.4414711990394e-05;-8.0646510468796e-05;-5.0174254283775e-05;0.0007391722756438;8.4916209743824e-05;-9.2682916147169e-05;0.00015453726518899;2.9641978471773e-05;-0.00011542845459189;-0.00017357982869726;0.00034319941187277;-9.2730924734497e-06;-6.4453262893949e-05;4.5206808863441e-05;-0.00011276402801741;-2.4642835342092e-05;0.0007179391104728;5.5391225032508e-05;-0.00097051146440208;0.00012113004049752;-6.7005035816692e-05;-0.00022994579921942;-0.00034847474307753;-0.00039999806904234;0.00057811295846477;-0.00014223241305444;0.00033525409526192;6.7454006057233e-05;2.4804570784909e-05;-0.00014426113921218;0.00094376283232123;-0.00024573336122558;0.0011225023772568;-5.3358449804364e-05;8.2054495578632e-05;5.1146009354852e-05;-0.00052394112572074;-0.00029493155307136;0.00028647083672695;0.00023664766922593;0.00057099654804915;-5.9611036704155e-05;0.00035176397068426;-0.00069898617221043;0.00017635800759308;-0.0007909364067018;0.00012853243970312;-0.0011016224743798;8.3149665442761e-05;-5.9102811064804e-05;3.6617046134779e-05;-7.0517118729185e-05;3.3225423976546e-06;0.00055075855925679;-0.00021363189443946;0.00074751675128937;4.4844455260318e-06;0.00049766269512475;4.0850045479601e-05;-8.5239742475096e-05;-3.3275209716521e-05;-0.00020223596948199;3.4918604796985e-05;0.0010148098226637;-2.5903756977641e-05;0.00012420151324477;-0.00013179102097638;0.00017474562628195;-0.00016297653201036;0.00014545208250638;-0.00044645273010246;0.00017843974637799;-0.00041385591612197;4.9033907998819e-05;-0.00078402052167803;2.8339425625745e-05;-0.0008063992136158;-2.0117384337937e-05;0.00013500510249287;-4.8801643970364e-06;-0.00036486081080511;2.1822539565619e-05;-8.6569896666333e-05;-2.6106150471605e-05;8.4463965322357e-05;3.4952263376908e-05;-3.741209366126e-05;3.5683365240402e-06;-0.00030992063693702;2.5835395717877e-05;1.7994367226493e-05;1.0655807272997e-05;-0.00016483852232341;-2.4166927687475e-05;-1.2079270163667e-05;-3.8358379242709e-05;0.00049111631233245;4.8181263991864e-05;-5.8457986597205e-05;4.9738890083972e-05;3.4207743738079e-05;-0.0001084079631255;-0.00010667541937437;0.00028388388454914;-1.9560802684282e-06;7.4753945227712e-05;2.8620061129914e-05;-0.00012038777640555;-2.0271001631045e-05;0.00056453834986314;4.2532010411378e-05;-0.00070125696947798;7.0432623033412e-05;-2.6293786504539e-05;-0.00015595628065057;-0.00020572711946443;-0.00027087196940556;0.00037429452640936;-9.7923046268988e-05;0.00014562743308488;4.5888129534433e-05;2.9346296287258e-05;-8.9032189862337e-05;0.00055116339353845;-0.00017659871082287;0.00076475250534713;-4.3752013880294e-05;0.00012073792458978;2.2134618120617e-05;-0.00037736189551651;-0.00018502898456063;0.00021811299666297;0.00014726257359143;0.00036746519617736;2.231417420262e-05;0.00023247388890013;-0.00046624286915176;0.00013279261474963;-0.00051137414993718;8.7485263065901e-05;-0.00064860074780881;6.4079060393851e-05;-0.0001415994920535;0.00022600691590924;-6.7703040258493e-05;-0.00075543130515143;6.3174658862408e-05;-0.00097476615337655;8.346469985554e-05;-0.00031718812533654;-8.7058680946939e-05;0.00011502722918522;-4.2621282773325e-05;0.00056142022367567;-1.0572322025837e-05;-0.0010344613110647;-0.00015321010141633;-0.00054949923651293;1.6503261576872e-05;-0.00010322912567062;-0.00035880465293303;0.00013105642574374;0.00091795646585524;-4.8127109039342e-05;0.00029662961605936;-6.0066581681895e-06;0.00076508644269779;8.3705544966506e-06;0.0010440468322486;7.3387818702031e-05;-0.00080611166777089;0.00010466995445313;0.00087481981609017;3.3169890230056e-05;-0.00037488955422305;0.0001176140649477;-0.00016252724162769;-8.8151580712292e-05;0.00031632973696105;0.00010033300350187;-0.00040234488551505;-7.6048985647503e-05;-5.8861041907221e-05;5.4785145039205e-05;0.00091540365247056;-4.6501612814609e-05;-0.00015087804058567;-2.7535743356566e-05;0.00061832804931328;-1.2761509424308e-05;0.00028188189025968;-4.6954115532571e-05;0.00023869948927313;-5.4107356845634e-05;-0.00010909102275036;6.3326340750791e-05;-0.00012734188931063;-0.00061327056027949;5.4974789236439e-05;-3.1366504117614e-05;1.5337511285907e-05;0.00030886236345395;-6.5309313868056e-06;-0.00072211783844978;2.5404333428014e-05;-0.00013875738659408;0.00014715385623276;-0.00067311694147065;-0.00022468184761237;0.00041789351962507;-0.00034216407220811;0.00047703538439237;-0.00016094908642117;2.9162096325308e-05;6.9637826527469e-05;0.0014299498870969;-0.00014858751092106;0.0010664407163858;-0.00022493499272969;-0.00015272419841494;-3.5296554415254e-05;0.00018009485211223;-0.000531239900738;-0.00036072198417969;0.00039562181336805;0.00014443484542426;-8.9809378550854e-05;0.00065607886062935;-0.00054930167971179;0.00033019800321199;-0.00076526420889422;0.00013685217709281;-0.0015766543801874;0.00012835196685046;0.0002890324103646;7.6265838288236e-05;0.00028896864387207;-8.4911349404138e-05;-0.00066104845609516;7.8364158980548e-05;-0.00087967398576438;2.3867758500273e-05;-0.00021872011711821;-9.9214194051456e-05;0.0001139425803558;-3.4149848943343e-05;0.00046270518214442;-1.1377879673091e-05;-0.00080354470992461;-0.00017909267626237;-0.00057829148136079;4.1916232476069e-06;-0.0001952743914444;-0.00038742931792513;8.5350984591059e-05;0.00092186580877751;1.8786982764141e-05;0.000251312245382;5.2383056754479e-05;0.00064080749871209;1.8204098523711e-05;0.00089814141392708;0.00010612600453896;-0.00086116965394467;0.00012009164493065;0.00086597597692162;4.281248402549e-05;-0.00039529096102342;0.00012160187179688;-0.00022620671370532;-7.8442273661494e-05;0.00042496316018514;0.0001037035981426;-0.00038201382267289;-0.00010137233039131;-6.2400089518633e-05;4.6414927055594e-05;0.0012036698171869;-5.3283387387637e-05;-0.00014566493337043;-3.0700146453455e-05;0.0005402336246334;3.5237223983131e-06;0.00028395254048519;-5.3573337936541e-05;0.00028608515276574;1.308420451096e-05;-0.00013038617908023;-5.1636408898048e-05;-0.00010654865764081;-0.00083192263264209;5.5800264817663e-05;1.6638790839352e-05;1.4231315617508e-05;0.00011031873145839;2.3547781893285e-06;-0.00059289892669767;1.5764208001201e-05;-0.00016288319602609;0.00015686561528128;-0.00066963274730369;-0.00021789604215883;0.0003748491872102;-0.0003240356745664;0.0005116566317156;-0.00014543606084771;2.7049243726651e-05;6.142176425783e-05;0.0014733899151906;-0.00015045463806018;0.00099225621670485;-0.00020517595112324;-0.00022028743114788;-2.5241224648198e-05;0.00018289432046004;-0.00048753284499981;-0.00036215683212504;0.00038718900759704;0.00012035074905725;-0.00011627451021923;0.00063655793201178;-0.00049866596236825;0.00032062214449979;-0.0007223830325529;0.00011492100020405;-0.00162612949498;0.0001221280253958;0.00038593818317167;6.609575211769e-05;0.000237085390836;-1.8897073459812e-05;-0.00010395957360743;-3.1047704396769e-05;-0.00038031401345506;-0.00016254339425359;-6.343381392071e-05;-0.00012163382052677;6.8439330789261e-05;6.2644539866596e-05;-1.427789356967e-05;-7.3237308242824e-05;0.00016303386655636;-0.00034950356348418;-0.0001489210408181;-0.00010183145786868;-0.00027611790574156;-0.00041995101491921;-9.9239572591614e-05;0.0005514562362805;0.00021894573001191;0.00033852658816613;0.00015280391380657;2.7990507078357e-05;0.00019297981634736;9.6607756859157e-05;0.00025671927141957;-0.00046942502376623;0.0001899644266814;0.00013336463598534;0.00014377213665284;-4.5076751121087e-05;7.8117063821992e-06;-4.2190920794383e-05;7.7087250247132e-05;0.00032739975722507;7.9696466855239e-05;-0.00012634371523745;-8.0159938079305e-05;-0.0001351752289338;2.3126560336095e-05;0.00060032017063349;2.4742605546635e-06;9.0447669208515e-05;1.4896276070431e-06;0.00036608654772863;4.1174018406309e-05;-0.00010751911031548;-3.3674747101031e-05;0.0003133351856377;0.00018219275807496;3.4734555811156e-05;-0.00023741228505969;-0.00015951237583067;-0.00065544561948627;-8.2830156316049e-05;-9.088875958696e-05;1.6682739442331e-05;8.2538244896568e-05;3.1370207580039e-05;-0.0004385226930026;-4.3215408368269e-05;-0.00013256078818813;9.0686517069116e-05;-8.5568746726494e-05;-8.0838282883633e-05;0.00052233057795092;-0.00010807294893311;0.00033713778248057;-4.8560497816652e-05;-2.3724169295747e-05;5.9409361711005e-05;0.00077713723294437;-8.0790059655556e-06;0.00075771729461849;3.4054988645948e-05;4.3960324546788e-05;2.1079283669678e-06;-1.9997114577563e-05;-0.00026477320352569;-0.00021387041488197;5.8031495427713e-05;0.00015307524881791;-0.00014413415919989;0.00033338740468025;-0.00052128452807665;3.2508356525796e-05;-0.00066076882649213;-3.4053875424433e-05;-0.00090298993745819;-2.4269151253975e-05;6.5326952608302e-05;6.6742477429216e-06;0.00020962631970178;-2.0727634364448e-06;-8.8612883700989e-05;-5.2392344514374e-05;-0.00035056745400652;-0.00017148994083982;-5.2727427828358e-05;-0.00012679521751124;6.2536128098145e-05;7.2749448008835e-05;2.0452429453144e-05;-8.8296670583077e-05;0.00023613106168341;-0.00038485697587021;-0.00012307251745369;-0.00011221139720874;-0.00025854908744805;-0.00042073742952198;-0.00011074586655013;0.00053204118739814;0.00021862910944037;0.00034943062928505;0.00015552558761556;-3.5830649721902e-05;0.00022747823095415;4.3961259507341e-05;0.00027572936960496;-0.00048376299673691;0.00020935635257047;8.9611217845231e-05;0.00015946330677252;-1.1312150490994e-05;3.9986684896576e-06;-2.0198289348627e-05;8.7308973888867e-05;0.00031086406670511;8.3901766629424e-05;-0.00011444927076809;-7.488902338082e-05;-0.0001489788555773;1.7696793292998e-05;0.00050108873983845;5.8130935940426e-06;0.00010622191621223;6.9769967012689e-06;0.00038387402310036;5.1610801165225e-05;-0.00014631844533142;-3.3914868254215e-05;0.00032843547523953;0.00019661482656375;5.8615391026251e-05;-0.00024720470537432;-0.00018164528592024;-0.00061071285745129;-9.7942494903691e-05;-0.00011195153638255;1.1874728443217e-05;0.00012723558756988;3.7637917557731e-05;-0.00046391278738156;-5.6339205912082e-05;-0.0001335399429081;8.4368366515264e-05;-4.8916695959633e-05;-6.9253903347999e-05;0.00058355048531666;-7.9958372225519e-05;0.00033419270766899;-4.0697395888856e-05;-2.6169773263973e-05;5.9684432926588e-05;0.00076585338683799;1.2243934179423e-05;0.00078891922021285;6.8885768996552e-05;7.2398841439281e-05;9.8737473308574e-06;-3.0562372558052e-05;-0.00026382599025965;-0.00020890758605674;4.1858656913973e-05;0.0001542032987345;-0.00015872076619416;0.00032304812339135;-0.00059067574329674;-2.7385810881242e-06;-0.00069037108914927;-6.1150516557973e-05;-0.00087294692639261;-4.7172623453662e-05;2.803066308843e-05;-1.5032851479191e-06;0.00015309973969124;5.436140781967e-06;-5.1903673011111e-05;-4.9264388508163e-05;-0.00026176293613389;-0.00013168388977647;-3.4478238376323e-05;-9.7729811386671e-05;4.4535856432049e-05;5.9722620790126e-05;1.3076057257422e-05;-7.3450311901979e-05;0.00021892836957704;-0.00031660633976571;-8.497843373334e-05;-9.0709843789227e-05;-0.00019699758559;-0.00032102910336107;-8.9351568021812e-05;0.00040038287988864;0.00016920881171245;0.00027626275550574;0.00011279158206889;-5.3458024922293e-05;0.00019036850426346;1.0114484211954e-05;0.00022147165145725;-0.00037583219818771;0.00017332378774881;4.9611702706898e-05;0.00013090143329464;7.0738310569141e-06;3.6060719139641e-06;-1.200067163154e-05;7.2841874498408e-05;0.00023183699522633;6.7652006691787e-05;-8.2487007603049e-05;-5.5849741329439e-05;-0.00011997589899693;7.6274250204733e-06;0.00036473874934018;6.123590083007e-06;8.685404463904e-05;9.3599128376809e-06;0.00029711029492319;4.8691257688915e-05;-0.00013388232036959;-2.8463129638112e-05;0.00026565231382847;0.00016860844334587;5.7721852499526e-05;-0.00020154420053586;-0.00015209679258987;-0.00046187519910745;-8.4421189967543e-05;-8.9708511950448e-05;4.8837191570783e-06;0.0001008798572002;3.2453994208481e-05;-0.00035850712447427;-5.2904459153069e-05;-0.00010404692875454;6.1427825130522e-05;-1.8890777937486e-05;-4.4711079681292e-05;0.000468491576612;-4.2888641473837e-05;0.0002596064878162;-2.4189028408728e-05;-2.0654142645071e-05;4.5699664042331e-05;0.00058358866954222;2.230670179415e-05;0.00061864033341408;7.6396943768486e-05;6.2546110711992e-05;1.2359198080958e-05;-3.095389547525e-05;-0.00020256280549802;-0.00016231881454587;2.7053267331212e-05;0.00011840676597785;-0.00012632556899916;0.0002426101709716;-0.00047471155994572;-2.502219285816e-05;-0.00054387835552916;-6.6113832872361e-05;-0.00066723470808938;-5.2082606998738e-05;1.3302190382092e-05;-5.8509008340479e-06;-3.325807483634e-05;-0.00011144812015118;0.00015231863653753;0.000116246912512;0.00018276723858435;0.00026100681861863;0.00010805505735334;9.4766553957015e-05;-3.5765537177213e-05;-7.7056065492798e-05;8.9588058472145e-05;-0.00011278111196589;0.00039593191468157;-0.0002196778805228;7.1801099693403e-05;8.9598266640678e-05;0.00010107761772815;0.00034519354812801;6.9887006247882e-05;-0.00019409385276958;-0.00035625195596367;-0.0001113443140639;-0.00033850749605335;-0.00030033872462809;5.3794385166839e-05;-0.00025639976956882;-2.375346593908e-05;-0.0002130304928869;0.00043434102553874;-0.00012452609371394;-5.8141151384916e-05;-2.9936441023892e-06;4.9913182010641e-05;7.3705152317416e-05;5.0514977374405e-06;5.529390546144e-05;0.00019228343444411;-7.1994087193161e-05;-0.0001334647386102;2.8508189643617e-05;-0.00013455894077197;5.4493204515893e-05;0.00018657621694729;1.5250072920026e-06;7.8482524259016e-05;2.0391324142111e-05;0.00038106751162559;-0.00017619054415263;-6.7104650952388e-05;0.00028488537645899;0.00012395658995956;0.00016485675587319;-0.00016038308967836;-0.00015150623221416;-0.00013658525131177;-0.00031776944524609;4.5032222260488e-05;-0.00011667036596918;9.5855220934027e-06;0.00019480485934764;-3.2269788789563e-05;-0.0004489216953516;6.4166299125645e-05;-0.00010093268792843;-5.550872447202e-05;2.1296769773471e-05;-5.7174045650754e-05;0.00053503137314692;-3.9730420553497e-07;0.00026843318482861;4.1156949009746e-05;-1.804743988032e-05;3.0057946787565e-05;0.00057681993348524;7.4705567385536e-05;0.00069383281515911;2.9622563602061e-07;8.5974003013689e-05;-4.6133351133903e-05;-0.00021822671988048;-0.00017590417701285;0.00015034808893688;1.2495470400609e-05;0.00023207407502923;-0.00012682037777267;-6.0140855566715e-06;-0.00058495596749708;-7.3219605837949e-05;-0.00057641963940114;-7.4405535997357e-05;-0.00065529864514247;1.3978213246446e-05;-3.1208652217174e-05;-3.704539994942e-05;-0.00016825144120958;0.00019273116777185;0.0001676041574683;0.0002453280321788;0.00036727957194671;0.00014219050353859;0.00013031157141086;-4.2819672671612e-05;-0.0001093009559554;0.0001145195128629;-0.00013595787459053;0.00051148526836187;-0.00026279187295586;9.20445236261e-05;0.00013969815336168;0.0001503797393525;0.00047351364628412;9.4387585704681e-05;-0.00026831260765903;-0.00049729162128642;-0.00015545010683127;-0.00045356675400399;-0.00038400909397751;4.1185980080627e-05;-0.00033469538902864;-5.7295623264508e-05;-0.00027547439094633;0.00058753415942192;-0.00015940421144478;-0.00010852656851057;-6.9440870902326e-06;5.5876829719637e-05;9.8012045782525e-05;-7.0206242526183e-06;7.2289862146135e-05;0.00026920789969154;-0.00010026399831986;-0.00019329866336193;4.1631228668848e-05;-0.00017101209959947;7.018557516858e-05;0.00030068133492023;-1.1528663890203e-06;0.00010000227484852;2.0716657672892e-05;0.00050854572327808;-0.00021931855008006;-9.4926894234959e-05;0.00037515902658924;0.00015190996055026;0.00021988197113387;-0.00020208294154145;-0.00019376915588509;-0.00017444841796532;-0.00045564540778287;6.3455976487603e-05;-0.00014583159645554;9.3264434326557e-06;0.00024210690753534;-3.4799519198714e-05;-0.00059847487136722;9.3301365268417e-05;-0.00013947047409602;-8.3936582086608e-05;1.5475674445042e-05;-0.00010322334128432;0.00070533493999392;-9.7411293609184e-06;0.00037198470090516;5.6026554375421e-05;-2.3611572032678e-05;2.2426816940424e-05;0.00079634884605184;7.4522889917716e-05;0.00093199429102242;-3.9301862670982e-06;9.7587100754026e-05;-5.698430686607e-05;-0.00029285380151123;-0.00024017604300752;0.00020411517471075;2.0598527044058e-05;0.00032745697535574;-0.00017642152670305;2.0420548025868e-05;-0.00077195884659886;-7.6975695264991e-05;-0.00077022612094879;-8.0912788689602e-05;-0.00091132964007556;2.2818554498372e-05;-1.8660874047782e-05;-2.2161728338688e-05;-0.00016224026330747;0.00015428745246027;0.00017727517115418;0.00021824790746905;0.00033022873685695;0.00012687218259089;0.00012365797010716;-3.37364472216e-05;-0.0001041256255121;9.8149197583552e-05;-0.00014504189311992;0.0004303072928451;-0.00019234363571741;7.816308789188e-05;0.00014126008318271;0.00014009726874065;0.00043201330117881;8.1628786574584e-05;-0.00023671379312873;-0.00046469439985231;-0.00015184635412879;-0.0003928868973162;-0.00032057065982372;1.8201237253379e-05;-0.00028697677771561;-8.0833378888201e-05;-0.00023192435037345;0.00053849013056606;-0.00013402382319327;-0.0001287597551709;-6.3067591327126e-06;2.5632465622039e-05;8.1508987932466e-05;-4.4154830902698e-06;6.4336112700403e-05;0.00025373575044796;-9.0855101007037e-05;-0.00019301116117276;4.2837677028729e-05;-0.0001439137122361;5.4952681239229e-05;0.00028994082822464;-7.8847824624972e-06;8.1488833529875e-05;9.415139174962e-06;0.00046647543786094;-0.00016748976486269;-8.1011596194003e-05;0.00032321433536708;0.0001156989892479;0.00017065650899895;-0.0001708274212433;-0.0001524794352008;-0.00013951891742181;-0.00042246596422046;6.024236427038e-05;-0.00012565228098538;8.2288479461567e-06;0.00023002778470982;-2.0642366507673e-05;-0.00055191799765453;9.1044603323098e-05;-0.00012444975436665;-9.1612237156369e-05;-1.5647336113034e-05;-0.00012574276479427;0.00062480848282576;-2.360415419389e-05;0.0003391380305402;5.1482282287907e-05;-2.1125148123247e-05;-1.5154970469666e-06;0.00073688669363037;3.2896245102165e-05;0.00083931162953377;-7.4350359682285e-06;8.0069017712958e-05;-4.0598639316158e-05;-0.00027128512738273;-0.0002158495481126;0.00018872013606597;2.9128272217349e-05;0.00031532617867924;-0.00016282663273159;5.4959109547781e-05;-0.00068548624403775;-4.0720158722252e-05;-0.0006892227102071;-4.6683173422934e-05;-0.00083660893142223;2.3715301722405e-05;-7.0728765422245e-06;0.00010030405974248;-0.0002651451213751;-6.888903590152e-05;0.00037386489566416;-7.0102236350067e-05;0.00061381724663079;6.7676803155337e-05;0.00030978620634414;4.16289367422e-05;-0.00010340664448449;-3.720126915141e-05;-0.00017778233450372;0.00013654981739819;0.00074740528361872;-1.1798167179222e-05;0.00043851332156919;0.00018294826440979;0.00025374093092978;-0.00015855260426179;-3.8520654925378e-05;-0.00061426748288795;7.728640048299e-05;-0.00022256064403336;3.6327488487586e-05;-0.00045182180474512;-8.5489882621914e-05;-0.00079764542169869;-8.773933222983e-05;0.00051824777619913;-2.0689776647487e-05;-0.00068648502929136;0.00010150560410693;-0.00029249186627567;-2.9219472708064e-05;-0.00025401130551472;0.00011875896598212;0.00018060299044009;-8.5439198301174e-05;-0.00040906498907134;2.0911247702315e-05;-2.1197130990913e-05;-4.2427938751644e-05;0.0009700937080197;-3.280852251919e-05;-0.0002747380931396;5.7409606597503e-06;0.00039492937503383;0.00018410591292195;-7.4040704930667e-05;0.00028031988767907;-0.00012517267896328;0.00013216283696238;-0.00011852868192364;1.1264455679338e-05;1.9760320355999e-05;-0.00046959947212599;1.4391279364645e-05;0.00014334458683152;3.5974105685455e-06;1.9777236957452e-05;1.8446269677952e-05;-0.00039097300032154;0.000117340387078;-5.2054900152143e-05;-0.00018388812895864;-0.00050632376223803;-0.00030707256519236;0.00013561178639065;-8.8346612756141e-05;0.00043527377420105;4.4356231228448e-05;1.9812188838841e-05;-0.00013434430002235;0.00089398771524429;-0.00018015978275798;0.00070586556103081;-2.4676883185748e-05;-0.00021012482466176;6.544135248987e-05;-0.0004268976917956;-0.0003207107365597;0.00017346456297673;0.00035706322523765;0.0005006204592064;-3.7933004932711e-05;0.00029303869814612;-0.00011702355550369;0.00010078870400321;-0.00051636365242302;0.0001094949329854;-0.0012397912796587;5.193816832616e-05;0.00034161398070864;7.1662740083411e-05;-0.00020093345665373;-3.3765136322472e-05;0.00054155325051397;-9.7354954050388e-05;0.00066360895289108;7.1115944592748e-05;0.00035825429949909;4.64952972834e-05;-0.00011293897114228;-1.6197604054469e-05;-0.00038169088657014;0.00013663549907506;0.00084261246956885;-2.1881794964429e-05;0.00043013412505388;6.7212538851891e-05;0.00027811186737381;-0.00016431410040241;2.9927470677649e-05;-0.00066216994309798;6.425487663364e-05;-0.00025668265880086;5.3932735681883e-06;-0.00050791801186278;-6.5108775743283e-05;-0.00085673428839073;-8.964857988758e-05;0.00059183605480939;-1.8554756024969e-05;-0.00071291479980573;8.7706146587152e-05;-0.00025946900132112;-4.1093695472227e-05;-0.00014545039448421;0.00011247413931414;0.00013223959831521;-6.3855841290206e-05;-0.00047431446728297;3.2163032301469e-05;-1.9101264115307e-05;-2.6157566026086e-05;0.00062670512124896;-3.1455481803278e-05;-0.00023315343423747;-1.4499256394629e-05;0.00054883537814021;0.0001674214436207;-8.709521353012e-05;0.0002460126997903;-7.4916904850397e-05;3.6899244150845e-05;-0.0001462511572754;0.00014677905710414;1.1430847735028e-05;-0.00031665398273617;2.2317966795526e-05;6.1749466112815e-05;-7.7054337452864e-06;0.00029026536503807;3.143132198602e-05;-0.00061325775459409;0.00012508309737314;-6.8372894020285e-05;-0.00020677875727415;-0.00048133442760445;-0.00034844473702833;0.00033419069950469;-0.00011399865616113;0.00043910901877098;4.9910002417164e-05;2.2566244297195e-05;-0.00014738367462996;0.00099154922645539;-0.00020944708376192;0.00088576099369675;-2.9643415473402e-05;-0.00014187920896802;8.0342360888608e-05;-0.0004595021600835;-0.00031798344571143;0.00019646272994578;0.00032959296368062;0.00055007898481563;-8.8685512309894e-05;0.0003306134021841;-0.00038969676825218;0.00012702340609394;-0.00063248455990106;0.00012202591460664;-0.0012482147431001;6.092716648709e-05;0.00023861385125201;0.00025623594410717;-8.034363418119e-05;-0.00051242433255538;8.2642305642366e-05;-0.00071834889240563;2.3523974959971e-05;-0.0001681196881691;-7.907844701549e-05;9.2801230493933e-05;-3.2653315429343e-05;0.00034448181395419;-2.0514642073977e-06;-0.00066990382038057;-0.00013704817683902;-0.00050643924623728;7.4491035775281e-06;-0.00019230590260122;-0.00029979419196025;8.1555881479289e-05;0.00075541972182691;2.0492752810242e-05;0.00017620927246753;3.2184107112698e-05;0.00052420131396502;-3.1008096357255e-06;0.00075931323226541;8.3304032159504e-05;-0.0007075424073264;9.542365296511e-05;0.00074444740312174;2.9468625143636e-05;-0.00036656204611063;0.00011771130084526;-0.00024659893824719;-7.6245807576925e-05;0.00036549216019921;9.2512542323675e-05;-0.00031154847238213;-9.0140922111459e-05;-4.5685184886679e-05;3.0717845220352e-05;0.0011703826021403;-5.699354733224e-05;-0.00016237988893408;-2.7783478799392e-05;0.00038983597187325;1.3058997865301e-05;0.00027244820375927;-4.1145278373733e-05;0.00024944415781647;3.8777601730544e-05;-0.00013864009815734;-7.8369252150878e-05;-7.744172035018e-05;-0.00074960105121136;6.2276682001539e-05;6.6818422055803e-05;3.6412252484297e-06;-1.800760946935e-05;6.7945506998512e-06;-0.00040151822031476;8.7493172031827e-06;-0.00012944007175975;0.00012978955055587;-0.00060786277754232;-0.00018007979087997;0.00022164711845107;-0.00026150557096116;0.00043499836465344;-0.00011391418956919;2.5418245058972e-05;4.6397788537433e-05;0.001225698273629;-0.00012718643120024;0.00076231232378632;-0.0001699931017356;-0.00022787826310378;-1.7559726984473e-05;0.00016411369142588;-0.00040252425242215;-0.00031006551580504;0.00035575864603743;8.2481528806966e-05;-7.6826137956232e-05;0.00052504421910271;-0.00030760292429477;0.00026789848925546;-0.00055408396292478;8.9388464402873e-05;-0.0013810788514093;0.00010369881056249;0.00038043357199058;5.2522427722579e-05;0.00042587085044943;-0.00013262056745589;-0.00053132488392293;0.00012584902287927;-0.00089106394443661;-2.5933421056834e-05;-0.00013117135677021;-0.00010124481195817;0.00011532899225131;-2.9015785912634e-05;0.00018196724704467;7.6936976256547e-06;-0.00063185748877004;-0.00019822643662337;-0.0006348502356559;-1.0099144674314e-05;-0.00035925323027186;-0.00041894181049429;4.1889819840435e-05;0.00096074218163267;0.00011174644168932;0.00024209478578996;8.1889855209738e-05;0.00065612583421171;-6.9178058765829e-06;0.00080811727093533;0.00014069445023779;-0.00086630211444572;0.00013295834651217;0.00088519544806331;5.0658760301303e-05;-0.0004615830257535;0.00014011122402735;-0.00036829488817602;-7.2420298238285e-05;0.00060390250291675;0.00011188195639988;-0.00035152182681486;-0.00014386804832611;-5.59663567401e-05;2.7995076379739e-05;0.0017835404723883;-7.2286420618184e-05;-0.00015096981951501;-3.9364731492242e-05;0.00039391580503434;3.358402318554e-05;0.00032070456654765;-6.3851170125417e-05;0.00036016528611071;0.00013133387255948;-0.00018683666712604;-0.00024153472622856;-6.4341729739681e-05;-0.0012224487727508;7.0721100200899e-05;0.0001134193080361;8.067470844253e-06;-0.00025125508545898;1.7549482436152e-05;-0.00037199392681941;1.6453678881589e-06;-0.00019368811626919;0.00017576329992153;-0.00071626965655014;-0.00021809176541865;0.00024234542797785;-0.00031379846041091;0.00057236349675804;-0.0001252399670193;2.9285627533682e-05;5.2736209909199e-05;0.001570277265273;-0.00016063130169641;0.00089806574396789;-0.00019220163812861;-0.00033790766610764;-1.6004172721296e-05;0.00019110974972136;-0.00045751323341392;-0.00039118118002079;0.00041473424062133;9.5269148005173e-05;-0.00011428324069129;0.00063256069552153;-0.00035043599200435;0.00032347132219002;-0.00066097342642024;9.2856411356479e-05;-0.0017778564943001;0.00012186734966235;0.00055529043311253;5.8079898735741e-05;0.00038367020897567;-0.00011661565804388;-0.00024296395713463;0.00010407749505248;-0.00064324506092817;-4.793763946509e-05;-7.0564063207712e-05;-6.8562891101465e-05;7.8516255598515e-05;-7.7947715908522e-06;-0.00015130976680666;1.5731589883217e-05;-0.00031968738767318;-0.00016440526815131;-0.00040782761061564;-2.6765341317514e-05;-0.0003552459529601;-0.00032439891947433;-5.06834112457e-06;0.00067121849860996;0.00015230901772156;0.00022296248062048;5.888010491617e-05;0.00048443381092511;-1.0291762919223e-05;0.00047780491877347;0.00012973840057384;-0.0005070777842775;0.00010452100832481;0.00053499272326007;5.090566992294e-05;-0.00030104198958725;8.3634666225407e-05;-0.00029890178120695;-1.902016265376e-05;0.0004770542436745;7.9445853771176e-05;-0.00020582597062457;-0.00011704495409504;-4.301802982809e-05;1.0544360520726e-05;0.0014480872778222;-4.4875028834213e-05;-7.3133560363203e-05;-2.6208432245767e-05;0.00019978497584816;3.7478137528524e-05;0.00018165344954468;-5.0848248065449e-05;0.00028655838104896;0.00017424243560527;-0.00013209694589023;-0.00026414400781505;-3.602238939493e-05;-0.0010121217928827;2.9438397177728e-05;0.00010329121141694;6.621166903642e-06;-0.00033952147350647;1.8237788026454e-05;-0.00016331410733983;-8.9334052972845e-06;-0.00014303415082395;0.00012580525071826;-0.00043479262967594;-0.00013796932762489;0.00010957660560962;-0.0002023781707976;0.00040730199543759;-6.8448134697974e-05;1.4611179722124e-05;3.7747180613223e-05;0.0010348042706028;-0.00010196048242506;0.00057091395137832;-0.00010673028737074;-0.00024914971436374;-1.0480890523468e-05;9.5257433713414e-05;-0.00029133702628314;-0.00027892351499759;0.00025824722251855;8.0412224633619e-05;-6.4762360125314e-05;0.00041138788219541;-0.0001402473426424;0.0001969438890228;-0.00044183904537931;4.6443899918813e-05;-0.0012436769902706;7.0434645749629e-05;0.00042086685425602;3.4975531889359e-05;0.00030153573607095;-8.1257094279863e-05;-7.0819107349962e-05;6.4633255533408e-05;-0.00042291628778912;-6.0797028709203e-05;-6.0485912399599e-05;-6.1146602092776e-05;5.7416411436861e-05;1.0189097338298e-05;-0.00023147587489802;3.0731255264982e-06;-0.00011410112347221;-0.00016665922885295;-0.00023738938034512;-3.9941867726156e-05;-0.00030996277928352;-0.00027188332751393;-1.9660621546791e-05;0.00047955778427422;0.00016124232206494;0.00020420490182005;4.8599733418087e-05;0.00025538273621351;2.0242780010449e-05;0.00026907442952506;0.00013225081784185;-0.0003013200184796;9.8098797025159e-05;0.00028356295661069;6.075132478145e-05;-0.00017331671551801;4.3935997382505e-05;-0.00018109181837644;2.0944215066265e-05;0.00031724988366477;6.2330538639799e-05;-0.00012897352280561;-8.2906379248016e-05;-5.0617374654394e-05;5.9882245295739e-06;0.0010251490166411;-2.1524223484448e-05;-3.0407776648644e-05;-1.1876943062816e-05;0.00014778583135922;3.3117914426839e-05;5.5078515288187e-05;-2.9068316507619e-05;0.00023525337746833;0.00016420110478066;-6.5711261413526e-05;-0.00021736937924288;-6.0168153140694e-05;-0.00073975045233965;-1.1460670975794e-05;6.5412743424531e-05;7.2386897045362e-06;-0.00025011488469318;1.6726569810999e-05;-0.00012921496818308;-1.6839772797539e-05;-9.5842522569001e-05;8.6160624050535e-05;-0.00021951872622594;-8.1699086877052e-05;8.7375876319129e-05;-0.00013056883472018;0.00029268654179759;-3.7300764233805e-05;-1.8685972236199e-06;3.6278899642639e-05;0.00063049129676074;-5.23347480339e-05;0.00041298236465082;-4.0565435483586e-05;-0.00013271046918817;-9.3283924798016e-06;1.2123992746638e-05;-0.00020865476108156;-0.00020486737776082;0.00014675715647172;9.5304647402372e-05;-3.5247168852948e-05;0.00027823902200907;-4.0113995055435e-05;9.8611766588874e-05;-0.00035918032517657;1.4791046851315e-05;-0.00085374526679516;2.7999025405734e-05;0.00026388303376734;1.98611705855e-05;0.00026491782045923;-4.5699147449341e-05;-6.2484519730788e-05;1.2240849173395e-05;-0.00037751669879071;-0.00011171083315276;-3.9441390981665e-05;-8.1507947470527e-05;5.7081175327767e-05;3.351869963808e-05;-0.00017222663154826;-3.4228280128445e-05;6.1145656218287e-05;-0.00024532165843993;-0.00017886252317112;-6.6011074522976e-05;-0.00028575339820236;-0.00032559534884058;-6.7965120251756e-05;0.00047573339543305;0.00019085833628196;0.00025892382836901;9.6925199613906e-05;0.00014572293730453;0.00010385578207206;0.00013974243483972;0.00018349073070567;-0.00034923950443044;0.00013889213732909;0.00018559093587101;9.492408571532e-05;-7.8279248555191e-05;1.4130947420199e-05;-0.00012114845594624;5.5063203035388e-05;0.00030376913491637;6.3460262026638e-05;-0.00011036737123504;-7.9585654020775e-05;-8.2161968748551e-05;1.0403695341665e-05;0.00078113778727129;-1.8365743699178e-06;4.2742358346004e-05;-1.3652373809236e-06;0.00021833594655618;3.7713140045526e-05;-4.1737490391824e-05;-4.5308566768654e-05;0.00025552313309163;0.00019335738033988;-7.2736979745969e-06;-0.00022220594109967;-9.1595793492161e-05;-0.00067347276490182;-5.3834497521166e-05;-8.7551898104721e-06;1.0869285688386e-05;-0.00011996477405773;2.0174487872282e-05;-0.00023724930360913;-3.0538263672497e-05;-0.00011395461478969;8.297056047013e-05;-0.00011332787107676;-6.9618909037672e-05;0.0002798461355269;-0.00010364796617068;0.00029445087420754;-3.4053016861435e-05;-1.1014573829016e-05;4.229309342918e-05;0.0006503788754344;-2.4731727535254e-05;0.00052909489022568;5.1255001380923e-06;-5.4351148719434e-05;-2.6335148959333e-06;-1.0333874342905e-05;-0.00020108165335841;-0.00019166443962604;7.862108759582e-05;0.00011149083729833;-9.0603825810831e-05;0.00027172610862181;-0.00026262472965755;5.2762810810236e-05;-0.0004607675364241;-1.5078306205396e-05;-0.00081485242117196;-4.1828161556623e-06;0.00016820643213578;1.1555735909496e-05;-2.3130274712457e-05;-0.00017921476683114;0.00014903450210113;9.3162670964375e-05;0.00018480616563465;0.00035183414001949;0.00010027517419076;9.0426183305681e-05;-2.3786717065377e-05;-8.715309377294e-05;6.993958959356e-05;2.7972495445283e-05;0.00040207462734543;-0.00018819725664798;6.4419153204653e-05;0.00015394568617921;0.00016790852532722;0.00037365764728747;7.3513212555554e-05;-0.00024424138246104;-0.00040810811333358;-9.4746181275696e-05;-0.00037435800186358;-0.00028128456324339;-4.2000017856481e-05;-0.00026003911625594;-7.5335272413213e-05;-0.00021811497572344;0.00045127101475373;-0.00011785930837505;-0.00013667170424014;-4.0593217818241e-06;5.1702656492125e-05;8.4094892372377e-05;-7.8351760748774e-05;5.2928666264052e-05;0.0002307530521648;-9.11264505703e-05;-0.0001576754875714;2.3864331524237e-05;-0.00011750237899832;6.2293707742356e-05;0.0004363456973806;7.372725121968e-06;6.7334898631088e-05;2.3041671738611e-05;0.00034557972685434;-0.00017747360107023;-0.00010586922144284;0.00031117370235734;0.0001170627438114;0.00024725822731853;-0.00013660357217304;-0.00018443216686137;-0.00014645315241069;-0.0004609661991708;4.7187335439958e-05;-7.0508598582819e-05;-5.025689915783e-06;4.5123008021619e-05;-2.8801860025851e-05;-0.00038826759555377;7.8766330261715e-05;-0.00012424682790879;-5.3105257393327e-05;2.5279632609454e-05;-8.3625956904143e-05;0.0004924014210701;3.598401463023e-06;0.00032953658956103;4.1848350520013e-05;-1.3583534382633e-05;1.2106838767068e-05;0.00065420765895396;6.0216392739676e-05;0.00071289716288447;-7.3033802436839e-06;7.7112717917771e-06;-5.2197712648194e-05;-0.00020729356037918;-0.00021138762531336;0.00014652239042334;1.6359788787668e-05;0.00025833863765001;-0.00014026217104401;2.0004736143164e-05;-0.00053981243399903;-6.5641434048302e-05;-0.00058369361795485;-6.8595312768593e-05;-0.00080770958447829;2.4498254788341e-05;7.4164527177345e-05;1.6921159840422e-05;-0.00023351579147857;9.667200356489e-05;0.0001043878874043;0.00016553392924834;0.00038311994285323;9.6829317044467e-05;0.00010851645492949;-1.603096643521e-05;-9.2733898782171e-05;4.8166602937272e-05;6.1434067902155e-05;0.00035642067086883;-8.5289553680923e-05;5.8322701079305e-05;0.00020035046327394;0.00021270428260323;0.0003718723601196;5.1960454584332e-05;-0.00024117712746374;-0.00044920726213604;-8.5858409875073e-05;-0.00035158745595254;-0.00022000347962603;-9.5260613306891e-05;-0.00024112917890307;-0.00016042384959292;-0.00019424132187851;0.00044929992873222;-0.00010413699783385;-0.00021191629639361;5.5124273785623e-06;-1.7141404896392e-05;7.8054596087895e-05;-0.00010859565372812;6.3870611484163e-05;0.0002670090761967;-9.9891629361082e-05;-0.00018834664660972;2.4574108465458e-05;-0.00010142931569135;4.3093259591842e-05;0.00061804929282516;-6.1063465182087e-06;2.0304853023845e-05;1.9597837308538e-05;0.00032622955041006;-0.00011848555732286;-8.7987682491075e-05;0.00031706903246231;6.098797894083e-05;0.00023172289365903;-0.00012628913100343;-0.00019429919484537;-0.0001184129723697;-0.00054501119302586;4.799036832992e-05;-2.4290684450534e-05;2.1254427338135e-06;-1.8678452761378e-05;-1.8891474610427e-05;-0.00035233399830759;9.3577560619451e-05;-0.00011622848251136;-8.070160401985e-05;-5.0206919695484e-05;-0.00013512618897948;0.00041115496424027;-1.4340468624141e-05;0.00035273091634735;4.3594496673904e-05;-1.2190944289614e-05;-2.2277003154159e-05;0.00068239710526541;1.26125269162e-05;0.00068799365544692;-1.1216660823266e-05;-3.6709901905851e-05;-4.9286158173345e-05;-0.00024246898829006;-0.00022893861751072;0.00016724203305785;7.11837928975e-05;0.00029987926245667;-0.00012270173465367;7.4478884926066e-05;-0.00043501250911504;-2.8366477636155e-05;-0.00056263088481501;-2.8393253160175e-05;-0.00088282948127016;2.6651676307665e-05;0.00013612944167107;8.3418759459164e-05;-0.00029666963382624;-1.30322532641e-05;5.7148492487613e-05;7.2289760282729e-05;0.00040746960439719;6.430376379285e-05;0.00013989763101563;6.449939974118e-06;-8.2740574725904e-05;-2.0231245798641e-05;0.00019423638877925;0.00021778406517114;0.00015447213081643;3.2087322324514e-05;0.00026122367125936;0.00027735967887565;0.00027706718537956;-1.9520983187249e-05;-0.00019766589684878;-0.00042892049532384;-2.1597593331535e-06;-0.00025988798006438;-5.4152456868906e-05;-0.00020662169845309;-0.00016164689441212;-0.00032695144182071;-0.00011859781807289;0.00032817551982589;-6.010802462697e-05;-0.00032447674311697;4.2080311686732e-05;-0.00014257954899222;4.8895573854679e-05;-0.00018545979401097;7.226914021885e-05;0.00026905018603429;-9.9548829894047e-05;-0.0002076680684695;1.0929667951132e-05;-5.0043898227159e-05;-1.2107776683479e-06;0.00095086224609986;-1.9401932149776e-05;-9.6981202659663e-05;2.0999359549023e-05;0.00019294352387078;2.0897014110233e-06;-5.0077775085811e-05;0.00029016597545706;-4.565068957163e-05;0.00021065330656711;-8.7643580627628e-05;-0.00020120885164943;-5.0654405640671e-05;-0.00062978215282783;3.2403102522949e-05;0.00010187678708462;7.6232790888753e-06;-0.00021650745475199;-5.838267497893e-06;-0.00016258495452348;9.5945011707954e-05;-7.7916571171954e-05;-9.4740091299172e-05;-0.00017696949362289;-0.00017923973791767;0.00012266846897546;-2.5294357328676e-05;0.00034544989466667;3.7556997995125e-05;-3.8960965866863e-06;-6.7338922235649e-05;0.00059000204782933;-5.2744588174392e-05;0.00049418391427025;-1.7203103197971e-05;-0.00014399101200979;-4.0046910726232e-05;-0.00025346016627736;-0.00023961473198142;0.00015837098180782;0.00016669563774485;0.00030763470567763;-4.4021857320331e-05;0.00013602159742732;-7.8355376899708e-05;2.0718827727251e-05;-0.00040668662404642;2.857737672457e-05;-0.00090048287529498;2.8916083465447e-05;0.00026926095597446;0.00013410522660706;-0.00039359260699712;-6.9726680521853e-05;0.00016060398775153;4.6803423174424e-05;0.00056439253967255;6.955090793781e-05;0.00016157681238838;2.316280551895e-05;-0.00010028525139205;-4.8840134695638e-05;0.00017691250832286;0.00020125271112192;0.00035640154965222;2.006378963415e-05;0.00042125725303777;0.00034521421184763;0.00030782926478423;-5.2108782256255e-05;-0.00019621216051746;-0.00057971570640802;1.0410428330943e-05;-0.00025602604728192;5.7627221394796e-06;-0.00037061885814182;-0.00015666711260565;-0.00053103041136637;-0.00011574893142097;0.00047428975813091;-4.706116305897e-05;-0.00056195602519438;8.0046003859024e-05;-0.00026167830219492;2.2940143026062e-05;-0.00030856096418574;9.9554999906104e-05;0.00038368941750377;-0.00013015886361245;-0.00030339404474944;9.4552424343419e-06;-3.2519892556593e-05;-3.1653758924222e-05;0.0013646876905113;-3.5285902413307e-05;-0.0001808646338759;2.7394395146985e-05;0.00022045310470276;0.00011188961798325;-6.8732260842808e-05;0.00034936954034492;-0.00012468875502236;0.00024661689531058;-7.4325507739559e-05;-0.00023881094239186;-1.0376880709373e-05;-0.00084793905261904;2.8880247555207e-05;0.00017692556139082;1.3844517525285e-05;-0.00033103249734268;1.7150704252344e-06;-0.00015744013944641;0.00013316806871444;-9.7674055723473e-05;-0.00014974892837927;-0.00036600639577955;-0.00026874692412093;9.0098335931543e-05;-5.4250111134024e-05;0.00047297895071097;4.0294889913639e-05;7.4742251854332e-06;-0.00012538027658593;0.0008718668250367;-0.00012413103831932;0.00061132514383644;-1.8676333638723e-05;-0.00027190361288376;7.3453306868032e-06;-0.00033869736944325;-0.00031748894252814;0.00016731482173782;0.00028814619872719;0.00043959365575574;-6.812768697273e-05;0.00024397359811701;-7.2607719630469e-05;5.9739191783592e-05;-0.00046822460717522;8.0223668192048e-05;-0.0012487791245803;3.9352427847916e-05;0.00043754780199379;0.00014024709525984;-0.00039765078690834;-8.4795727161691e-05;0.00035847586696036;1.1327047104714e-05;0.00067315011983737;8.9297675003763e-05;0.0002139601710951;4.0151102439268e-05;-0.00012163967767265;-4.289229400456e-05;-8.2600781752262e-05;0.00020520258112811;0.00059499189956114;1.5329818552345e-06;0.00057191861560568;0.00031603747629561;0.0003422312438488;-0.00010453999857418;-0.00013946201943327;-0.00073954666731879;8.5807187133469e-06;-0.00023293209960684;1.3000981198275e-05;-0.00044972900650464;-0.00014806193939876;-0.00076130760135129;-0.00012763442646246;0.00070071965456009;-3.7165995308897e-05;-0.00081086618592963;0.0001176647565444;-0.0003534262359608;-1.6242836863967e-05;-0.00036213619750924;0.00013103478704579;0.00039822148391977;-0.00013844796922058;-0.00043803729931824;1.7350845155306e-05;-2.895776378864e-05;-5.3495532483794e-05;0.0014756225282326;-4.4389740651241e-05;-0.00027213589055464;2.3328062525252e-05;0.00036460201954469;0.00020548958855215;-9.4502524007112e-05;0.00038723481702618;-0.0001634031359572;0.00022847921354696;-9.9287790362723e-05;-0.0001619006798137;2.0392189981067e-05;-0.00086128630209714;2.4217544705607e-05;0.00020034100452904;1.3898231372877e-05;-0.00022324356541503;1.1467202966742e-05;-0.0003084507479798;0.00016086456889752;-0.00010926709364867;-0.00020904836128466;-0.0005596365663223;-0.00035469472641125;0.00017539250256959;-9.3384223873727e-05;0.00058411428472027;4.6564851800213e-05;1.8352122424403e-05;-0.00017056497745216;0.0011671163374558;-0.00019213523773942;0.00081406469689682;-1.9645367501653e-05;-0.00033521302975714;7.0855210651644e-05;-0.00045003241393715;-0.00038570337346755;0.00017959473188967;0.0004025975940749;0.00058747571893036;-0.00011305011139484;0.00034542579669505;-0.00019669778703246;9.7204720077571e-05;-0.00059535528998822;0.00012309303565416;-0.0015586370136589;5.2097144362051e-05;0.00051825225818902;8.3316168456804e-05;-0.00023292904370464;-5.2874242101097e-05;0.00037105233059265;-3.4963166399393e-05;0.0005122622824274;6.8561093939934e-05;0.00021462092990987;3.7314955989132e-05;-9.353416680824e-05;-2.0700272216345e-05;-0.00024075202236418;0.00013357705029193;0.00058260664809495;-1.2496353519964e-05;0.00043438488501124;0.00015367312880699;0.00023916432110127;-0.000116833645734;-3.4484262869228e-05;-0.00056984042748809;2.3543210772914e-05;-0.00015788148448337;8.6716891019023e-06;-0.00034900585887954;-8.2761645899154e-05;-0.00066512089688331;-8.7845983216539e-05;0.00056157197104767;-1.8489567082725e-05;-0.00065380765590817;9.3906906840857e-05;-0.00026803152286448;-3.2912244932959e-05;-0.00022679292305838;0.00010544274846325;0.00021009854390286;-8.2354388723616e-05;-0.00037943062488921;1.8907798221335e-05;-1.9151308151777e-05;-4.0445291233482e-05;0.00089185917750001;-3.0420269467868e-05;-0.00023556035012007;6.5227759478148e-06;0.00036328536225483;0.00017365401436109;-7.2682763857301e-05;0.00026127166347578;-0.00011134688247694;0.0001109720687964;-0.00010001877672039;-5.3089838729647e-06;2.2474085199065e-05;-0.0004745438345708;1.3395268069871e-05;0.00012815232912544;4.2635228965082e-06;1.0610736353556e-05;1.5799170796527e-05;-0.00035161606501788;0.0001157962688012;-6.9102658017073e-05;-0.00017077976372093;-0.00045947806211188;-0.00028448938974179;0.00018750573508441;-8.5700332419947e-05;0.00042926354217343;3.7148245610297e-05;1.7672851754469e-05;-0.00013220659457147;0.00089698086958379;-0.00016595856868662;0.0006765280268155;-1.696947219898e-05;-0.00021866551833227;7.5047821155749e-05;-0.00037140960921533;-0.00028967965045013;0.00013899638724979;0.00031988613773137;0.00046980532351881;-8.7757412984502e-05;0.00028024832135998;-0.00021757029753644;8.9556888269726e-05;-0.0004866925009992;0.00010302557348041;-0.0011627386556938;4.4229076593183e-05;0.00033750740112737;0.00045687390957028;-0.00014612831000704;-0.00027630894328468;0.00012910756049678;-0.00072668230859563;-6.6057342337444e-05;-2.104182203766e-05;-6.4562678744551e-05;8.2454440416768e-05;-1.0965996807499e-05;-0.00023725100618321;2.9197079129517e-05;-0.000297321297694;-0.00015984381025191;-0.00046779168769717;-2.7498961571837e-05;-0.00040612852899358;-0.00034920190228149;-3.7244069972076e-05;0.00072897650534287;0.00017699704039842;0.00023490244348068;8.4279941802379e-05;0.00060937367379665;-3.0193834390957e-05;0.0004702594014816;0.00013397046132013;-0.00056876993039623;0.00010418516467325;0.00060494925128296;4.7465557145188e-05;-0.00034740046248771;9.4269511464518e-05;-0.00036448051105253;-2.9369448384386e-05;0.00063408561982214;7.5535332143772e-05;-0.00020677551219705;-0.00014492881018668;-3.0330367735587e-05;5.5225068535947e-06;0.0017289669485763;-5.4882559197722e-05;-4.2154595575994e-05;-3.6175071727484e-05;0.0001575458154548;4.6102271880955e-05;0.00022744906891603;-6.5839005401358e-05;0.00031400550506078;0.00020035878696945;-0.00016345411131624;-0.00035576161462814;6.5089998315671e-06;-0.0012589697726071;4.8860503738979e-05;0.00012215635797475;8.9256000137539e-06;-0.00048436838551424;2.275415135955e-05;-0.00010018442844739;-7.9723986345925e-06;-0.00018404798174743;0.00014792940055486;-0.00048678141320124;-0.00015687859558966;0.0001208173998748;-0.00022086316312198;0.00045222812332213;-7.2505383286625e-05;2.3464073819923e-05;3.0923267331673e-05;0.001225845888257;-0.00012534158304334;0.00059845997020602;-0.00012718234211206;-0.00032359440228902;-6.3474399212282e-06;0.00013190135359764;-0.00028224624111317;-0.00029528833692893;0.00027339821099304;5.7678829762153e-05;-9.7231568361167e-05;0.0004391162074171;-0.00022147134586703;0.00023515308566857;-0.00043577043106779;5.1753260777332e-05;-0.0013883793726563;8.5855739598628e-05;0.00051250302931294;3.6901750718243e-05;0.00046916594146751;-0.00013830862008035;-0.00023430792498402;0.00010955192556139;-0.00071576668415219;-9.336177026853e-05;2.1000394553994e-05;-5.7669221860124e-05;7.5913027103525e-05;-1.5415794223372e-06;-0.00035623539588414;2.1844489310752e-05;-0.00016796564159449;-0.00017367002146784;-0.00042047732858919;-3.7211848393781e-05;-0.00041055461042561;-0.00036382061080076;-8.4658044215757e-05;0.00069512630579993;0.00020626457990147;0.00027112168027088;0.0001060763024725;0.00062230293406174;-7.7136410254752e-06;0.0003495815617498;0.00014436578203458;-0.00051671412074938;0.00011075208021794;0.00052235642215237;5.4553642257815e-05;-0.0002571280056145;5.4574800742557e-05;-0.0003645142132882;4.856163286604e-06;0.00062816240824759;6.6086729930248e-05;-0.00016349930956494;-0.00014704119530506;-3.0539944418706e-05;3.5071032016276e-06;0.0016240080585703;-3.106057192781e-05;2.2522413928527e-05;-2.8948470571777e-05;0.00012157461605966;4.6935754653532e-05;0.00016016996232793;-9.1460155090317e-05;0.00030129443621263;0.00025462853955105;-0.00013437494635582;-0.00037533629802056;2.5221332180081e-05;-0.0012387243332341;1.5494422768825e-05;9.1807072749361e-05;1.3246853086457e-05;-0.00051006098510697;1.8888560589403e-05;-6.8713794462383e-05;-1.1576909855648e-05;-0.00020074246276636;0.00014510158507619;-0.0003712956677191;-0.00013948317791801;0.00018467351037543;-0.0001967135904124;0.00042898039100692;-6.0990500060143e-05;2.1178562747082e-05;2.6371850253781e-05;0.0011780568165705;-0.0001125453854911;0.00057656242279336;-0.00010232766362606;-0.00030549510847777;-3.1765739549883e-06;0.00010837679292308;-0.00022318262199406;-0.00026365133817308;0.00019628067093436;5.4074436775409e-05;-0.00013236762606539;0.00039068557089195;-0.0003079590969719;0.00020598527044058;-0.00041594277718104;3.7204757973086e-05;-0.0012993168784305;6.9446221459657e-05;0.00048076789244078;3.1443709303858e-05;0.00013550683797803;9.9167264124844e-06;7.647634629393e-05;-2.6537589292275e-05;-0.00023272616090253;-3.9925496821525e-05;-3.629541652117e-06;-8.7899088612176e-06;2.2835600248072e-05;9.7060437838081e-06;-0.00035251048393548;-1.0969727554766e-05;0.0001049610946211;-0.00013287717592902;-4.9185393436346e-05;-2.6658024580684e-05;-0.00016169178707059;-0.00013862177729607;-5.7734076108318e-05;0.00016595948545728;0.0001294909598073;0.00018857413670048;-4.5238753045851e-06;0.00016906490782276;5.9751717344625e-05;-9.4162606956161e-07;8.1371057603974e-05;-4.2805229895748e-05;7.8153592767194e-05;1.4103017747402e-05;4.4256361434236e-05;7.8871787991375e-05;-1.5601593986503e-05;-0.00011363824887667;5.4249168897513e-05;9.3273010861594e-05;1.4506940715364e-05;-1.5736057321192e-05;-3.6451987398323e-05;-2.5867355361697e-05;-9.634959496907e-06;0.00037531889392994;2.5948434995371e-05;6.6599903220776e-05;2.4595783543191e-05;2.4032642613747e-05;2.7795445930678e-05;-0.0001064397074515;-7.8670389484614e-05;0.00011620185250649;0.0002184143231716;4.5028278691461e-05;-0.00011874184565386;-2.2658716261503e-05;-0.00032652990194038;-6.4826563175302e-05;1.2558252819872e-05;-1.9694000457093e-06;-0.00018267976702191;-1.2943542060384e-05;-2.0500117898337e-05;-2.4504563043592e-05;-8.1072073953692e-05;2.8569351343322e-05;0.00010281374852639;1.3725581084145e-05;0.00011027218715753;4.6888185352145e-06;0.00014092931814957;2.263243732159e-05;-2.6787117803906e-06;1.4696766811539e-05;0.00023030104057398;1.5941535821185e-05;0.00020977044187021;5.3370222303784e-05;-5.1100920245517e-05;-4.2422520891705e-06;-2.4310727894772e-05;6.5027784330596e-06;-8.9631343143992e-05;-7.306995394174e-05;1.8742644897429e-05;-4.9508169468027e-05;5.4905704018893e-05;-0.00010365516209276;-3.3325937693007e-05;-0.0001869816769613;-4.6124783693813e-05;-0.00035296496935189;-4.4074113247916e-05;0.00010675494559109;8.1232901720796e-06;7.3622373747639e-05;4.5895678340457e-05;9.935992420651e-05;-5.5597425671294e-05;-0.00019253289792687;-2.700954064494e-05;-2.6965451525029e-06;-4.1678122215671e-06;2.1513353203773e-05;6.28753878118e-06;-0.00029030576115474;-1.6995152691379e-05;0.00013784352631774;-0.00015230091230478;-3.7588171835523e-05;-2.1941761588096e-05;-0.00013022549683228;-0.00011444294796092;-5.1997409173055e-05;0.00012038221757393;0.00011899429227924;0.00018216321768705;-2.7472317015054e-05;0.00010318832210032;8.1314188719261e-05;-2.2943075236981e-05;8.0779660493135e-05;-5.6198216043413e-05;9.0549816377461e-05;-4.2203673729091e-06;4.6741664846195e-05;0.00010665603622328;3.8008979572624e-06;-0.00010504818783375;4.1358212911291e-05;4.7079487558221e-05;3.1057857086125e-06;-1.1080945114372e-05;-2.7297433916829e-05;-2.8106227546232e-05;-1.4393702258531e-05;0.00027969383518212;2.3347365640802e-05;7.2437549533788e-05;3.6605975765269e-05;3.0935752874939e-05;3.3082789741457e-05;-0.00013516380568035;-9.7400385129731e-05;0.0001117555439123;0.00023702846374363;8.1072532339022e-05;-9.6578398370184e-05;-2.7995245545753e-05;-0.00025603058747947;-6.4392726926599e-05;2.8330712211755e-06;-9.1353085736046e-06;-0.00015225581591949;-2.108784065058e-05;-3.2395950256614e-05;-3.2430736609967e-05;-8.1026759289671e-05;1.2891316146124e-05;0.00012986193178222;4.1331735701533e-05;0.00014503567945212;4.3034830014221e-05;0.00013626705913339;3.5774253774434e-05;-2.6730097033578e-06;1.3865963410353e-05;0.00021097679564264;3.9164788177004e-05;0.00021919330174569;8.7246480688918e-05;-3.7420333683258e-05;-2.5685189939395e-06;-1.2428185073077e-05;3.1756680982653e-05;-8.5751817096025e-05;-9.9955628684256e-05;-1.2005594726361e-05;-6.1460748838726e-05;3.2738629670348e-05;-0.00013892173592467;-7.2071692557074e-05;-0.00019702370627783;-7.3557152063586e-05;-0.00032391512650065;-7.3524643084966e-05;8.6636377091054e-05;8.5288329501054e-06;-1.0918816428784e-07;7.9062971053645e-05;0.00011829356662929;-7.8023571404628e-05;-0.00013094104360789;-6.0997344917268e-06;-1.8878408809542e-06;3.2489833756699e-06;1.8216784155811e-05;1.561048890153e-07;-0.00020192230294924;-1.5699128198321e-05;0.00015228938718792;-0.00015266313857865;-2.3923294065753e-05;-1.3076014511171e-05;-8.7387532403227e-05;-7.2911003371701e-05;-3.8075078919064e-05;5.6556829804322e-05;9.5428265922237e-05;0.00015393520880025;-5.4131778597366e-05;2.9006461772951e-05;8.8136926933657e-05;-3.9865903090686e-05;6.8857043515891e-05;-6.1028011259623e-05;9.1108617198188e-05;-1.9176424757461e-05;4.2623847548384e-05;0.00011840411752928;3.0919691198505e-05;-8.8058921392076e-05;1.8032680600299e-05;-1.6644760592044e-07;-1.2272857929929e-05;-5.2937034524803e-06;-1.4929633834981e-05;-2.5167135390802e-05;-1.8279099094798e-05;0.00016910956765059;1.5713032553322e-05;7.0954767579678e-05;4.6068056690274e-05;2.9688540962525e-05;3.4653417969821e-05;-0.00014699599705637;-0.00010692424257286;9.4172210083343e-05;0.00022982199152466;0.00011057363008149;-6.521543400595e-05;-2.7224179575569e-05;-0.00016727292677388;-5.2653653256129e-05;-4.6998197831272e-06;-1.6133328244905e-05;-0.00011622747115325;-2.9980472390889e-05;-3.4321124985581e-05;-3.629524144344e-05;-7.3498304118402e-05;-6.7289192884346e-06;0.00014286476653069;7.0627611421514e-05;0.00015716128109489;8.1660444266163e-05;0.00011795594036812;4.8243731725961e-05;-1.7357984916089e-06;1.1050544344471e-05;0.00016938308544923;5.9411529946374e-05;0.00019953217997681;0.00011375966278138;-2.4432260033791e-05;-1.7721249605529e-06;7.3682658694452e-06;6.4037776610348e-05;-7.4011055403389e-05;-0.00012367937597446;-5.2206229156582e-05;-6.6108579630964e-05;1.7846820128398e-06;-0.00015014018572401;-0.0001057183399098;-0.00018143873603549;-9.5371724455617e-05;-0.00026301172329113;-9.8047908977605e-05;6.3291197875515e-05;9.7685551736504e-06;-0.00015197297034319;0.00012067447823938;0.00020756502635777;-0.00012747423897963;-9.1469501057873e-06;0.00011674428242259;4.9147515710501e-06;3.3158186852233e-05;1.2837400390708e-05;-2.5333243684145e-05;-5.7681361795403e-05;6.2478189647663e-05;0.00025255384389311;-0.00020282238256186;3.1551671781926e-06;1.9495204469422e-05;5.5398425047315e-07;5.4033393098507e-05;3.7375307329057e-06;-0.0001044884120347;1.3232392120699e-05;0.00011671337415464;-0.00019700672419276;-0.00014841186930425;6.277633656282e-05;-0.00010517201735638;4.7569174057571e-05;-0.00010589068551781;0.00013033364666626;-6.1890561482869e-05;3.4765034797601e-05;0.0001268675114261;0.00013995249173604;-3.9794304029783e-05;-5.9069039707538e-05;-6.9754925789312e-05;-3.2328844099538e-05;-8.0493346104049e-06;-1.638381831981e-06;-1.9179920855095e-05;-4.4006912503392e-05;3.291647954029e-05;5.9240581322229e-05;8.4279126895126e-05;8.7513057223987e-05;2.8055959774065e-05;6.6751585109159e-05;-0.00022187372087501;-0.0001550197484903;0.00011599550634855;0.00025633952463977;0.00024141627363861;-3.7144611269468e-05;-5.998738197377e-05;-7.9892612120602e-05;-8.7897220510058e-05;-8.9775676315185e-06;-3.6526096664602e-05;-8.6848973296583e-05;-8.0543672083877e-05;-3.7289366446203e-05;-7.3505485488568e-05;-5.9896741731791e-05;-7.2646231274121e-05;0.00018315236957278;0.00018615773296915;0.00018628551333677;0.0002309071860509;0.0001075306427083;0.00012546805373859;5.2869122555421e-06;5.4820502555231e-06;0.00011839260696433;0.00017582839063834;0.00019657620578073;0.00026987920864485;-1.1289810572634e-05;-7.0113819674589e-06;3.780556289712e-05;0.00013218833191786;-9.1441739641596e-05;-0.00017137289978564;-0.00016390690871049;-6.1003174778307e-05;-8.0027399235405e-05;-0.00018432318756822;-0.00025599627406336;-0.00018449002527632;-0.00022369028010871;-0.00020163266162854;-0.00026342939236201;3.9685386582278e-05;3.153193028993e-05;-0.00013042319915257;6.3934698118828e-05;0.0001935868349392;-0.00010695702076191;2.1380901671364e-05;0.00016057582979556;1.1848867870867e-05;3.6877157981507e-05;7.820941391401e-06;-3.1009883969091e-05;-3.0660405172966e-05;0.00011185409675818;0.00025374334654771;-0.00018949410878122;1.0290219506714e-05;3.2949425076367e-05;3.0218554456951e-05;9.4798117061146e-05;1.8834092770703e-05;-0.00013049031258561;-3.727287548827e-05;8.5260187915992e-05;-0.00022313781664707;-0.00016156285710167;1.4835180081718e-05;-0.00011634606198641;3.170615673298e-05;-0.00011440246453276;0.00013628143642563;-6.3337858591694e-05;1.8298827853869e-05;8.6162537627388e-05;0.00014316973101813;-9.8389655249775e-06;-7.7155418694019e-05;-5.07167133037e-05;-6.3414777287107e-06;-1.9692026398843e-05;-1.24890002553e-05;-1.3628819942824e-05;-4.7852787247393e-05;4.1239763959311e-05;0.00011849278234877;7.0895650424063e-05;8.3255741628818e-05;2.5838751753327e-05;7.7982796938159e-05;-0.00021272267622408;-0.00014843429380562;0.00013049735571258;0.00022264274593908;0.00025285314768553;-3.9950235077413e-05;-7.6228207035456e-05;-9.1213332780171e-05;-0.00013269553892314;-8.475307140543e-07;-3.1890533136902e-05;-7.2581286076456e-05;-9.0879322669934e-05;-3.3543678000569e-05;-8.4329149103723e-05;-3.4620883525349e-05;-7.9677323810756e-05;0.00014034190098755;0.00017966583254747;0.00013905313971918;0.00023732615227345;8.9969522377942e-05;0.00014437150093727;8.9205168478657e-06;3.1419660899701e-06;9.5795265224297e-05;0.00021323800319806;0.00016641800175421;0.00029943749541417;-1.0845922588487e-05;-1.3470405065164e-05;1.3861837942386e-05;9.1399517259561e-05;-0.0001005248632282;-0.00011473578342702;-0.0001426083908882;-2.3986336600501e-05;-8.1399695773143e-05;-0.00014782225480303;-0.00026521008112468;-0.00015615136362612;-0.00024608787498437;-0.00016990506264847;-0.00031545280944556;3.4796055842889e-05;4.4762349716621e-05;-8.3740655099973e-05;-2.505677366571e-05;0.00015317241195589;-6.7173845309298e-05;5.745243106503e-05;0.00021161041513551;2.1925592591288e-05;4.2304542148486e-05;7.2137999040933e-07;-3.8234953535721e-05;-2.0843390302616e-06;0.00016697504906915;0.00023800434428267;-0.00015346612781286;2.0189352653688e-05;5.4137821280165e-05;7.4864285124931e-05;0.00014647255011369;3.5598615795607e-05;-0.00015424046432599;-0.00011344031372573;3.7682402762584e-05;-0.00024282248341478;-0.0001582492259331;-5.1221919420641e-05;-0.00012530182721093;8.7338969478878e-07;-0.00011586416803766;0.00014428945723921;-6.2218139646575e-05;-1.3158818546799e-05;3.2283474865835e-05;0.0001231149508385;2.8740361813107e-05;-9.177337778965e-05;-1.878902730823e-05;4.5008269808022e-05;-3.5792520066025e-05;-3.2607833418297e-05;-4.7409885155503e-06;-5.0277543778066e-05;4.8461224650964e-05;0.00021577093866654;4.6593970182585e-05;6.9507063017227e-05;2.0774095901288e-05;9.4024297141004e-05;-0.00017917207151186;-0.00012183922081022;0.00014792707224842;0.0001563665427966;0.00024100486189127;-4.5213160774438e-05;-0.00010007052333094;-9.9118406069465e-05;-0.00020625804609153;1.1122185242129e-05;-2.2034233552404e-05;-4.866410017712e-05;-9.9549994047265e-05;-2.5382751118741e-05;-9.9415505246725e-05;1.9588680970628e-06;-8.3801700384356e-05;7.3291957960464e-05;0.00014787513646297;6.1355807702057e-05;0.00023040729865897;5.912865526625e-05;0.00016626303840894;1.3997369023855e-05;-4.0217449281954e-07;5.6195807701442e-05;0.00026170507771894;0.00011151145736221;0.00032660376746207;-1.0157308679482e-05;-2.3187887563836e-05;-1.6009813407436e-05;2.5705339794513e-05;-0.00011073338828282;-3.1796844268683e-05;-9.9984958069399e-05;3.4736152883852e-05;-7.8039352956694e-05;-8.2913000369444e-05;-0.00025726328021847;-0.00010595581261441;-0.00026671754312702;-0.00011455825733719;-0.00038056008634157;2.7120868253405e-05;6.4224797824863e-05;-4.0226466808235e-05;-0.0001148062365246;0.00012460911239032;-2.157554445148e-05;9.8286138381809e-05;0.00027518245042302;4.1080827941187e-05;5.5991898989305e-05;-6.8425551944529e-06;-5.232480543782e-05;1.8982038454851e-05;0.00019504538795445;0.00025906506925821;-0.00013621036487166;3.4070151741616e-05;8.8882945419755e-05;0.00012795261864085;0.00021904571622144;5.0850001571234e-05;-0.00018833634385373;-0.00021561465109698;-8.7373191490769e-06;-0.0002822918468155;-0.00017053569899872;-9.6949850558303e-05;-0.00015600482583977;-3.6165831261314e-05;-0.00013380838208832;0.00020168119226582;-7.2069917223416e-05;-5.8224890381098e-05;-1.2480114719438e-06;9.2143905931152e-05;6.1120925238356e-05;-0.0001005953308777;1.2501987839642e-05;0.00011958082177443;-5.71661585127e-05;-6.907107308507e-05;4.6422628656728e-06;-6.2453073041979e-05;5.4685315262759e-05;0.00034849447547458;2.5743986043381e-05;6.0185691836523e-05;1.8799833924277e-05;0.00014376238686964;-0.00015901641745586;-0.00010173929331359;0.00019323398009874;0.00010922896763077;0.000237533080508;-6.4992345869541e-05;-0.00013860983017366;-0.00011253070260864;-0.00032107814331539;2.5065683075809e-05;-1.9036409867113e-05;-2.8388645660016e-05;-9.7168587672058e-05;-2.10826874536e-05;-0.00015254659228958;3.7623296520906e-05;-9.5108349341899e-05;1.4266158359533e-05;0.00010805831698235;-1.1780908607761e-05;0.00026411507860757;3.2884585380089e-05;0.00021463757730089;2.2282265490503e-05;-4.6172626753105e-06;2.3647698981222e-05;0.00036436563823372;7.0263806264848e-05;0.00041262846207246;-1.0302277587471e-05;-3.0205797884264e-05;-4.1607247112552e-05;-5.350801802706e-05;-0.00013996397319715;4.7910270950524e-05;-5.3945041145198e-05;0.00011097530659754;-8.5163752373774e-05;-2.5052131604753e-05;-0.0002914170618169;-6.9966219598427e-05;-0.00033692692522891;-7.4769050115719e-05;-0.00051056907977909;2.3495711502619e-05;8.7748885562178e-05;0.00016311506624334;-0.00048777917982079;-7.7707562013529e-05;0.00014236850256566;0.00010230436600978;0.000625072454568;6.9519534008577e-05;7.6733937021345e-05;1.9297331164125e-05;-0.00010352363460697;-5.8299960073782e-05;0.00032942951656878;0.00022718912805431;0.00022569685825147;3.0474157028948e-05;0.0004678695986513;0.00042191063403152;0.00035755740827881;1.0863992429222e-05;-0.00026602286379784;-0.0006276789936237;-3.6959507269785e-05;-0.00028701449627988;-4.1397473182769e-07;-0.0004427962412592;-0.00018607256060932;-0.00045014219358563;-0.00012991974654142;0.00052660726942122;-5.4102420108393e-05;-0.00058757641818374;6.5940541389864e-05;-0.00025730559718795;4.2147174099227e-05;-0.00036771906889044;9.0641427959781e-05;0.00054206169443205;-0.00016167521243915;-0.00028108883998357;5.1179995352868e-06;-2.6899942895398e-05;-2.536677311582e-05;0.0016220614779741;-4.1924828110496e-05;-0.00011868619185407;3.5777851735475e-05;0.00016376850544475;0.00010471286805114;-8.872013859218e-05;0.00038613757351413;-0.00013544624380302;0.0003062762261834;-3.4262506233063e-05;-0.0003594201116357;-1.7801829017117e-05;-0.0011016045464203;3.8772530388087e-05;0.00018236209871247;1.7072859918699e-05;-0.00050609349273145;-4.4260920617489e-07;-7.8392855357379e-05;0.00015884495223872;-0.00014393350284081;-0.00015603320207447;-0.00033537243143655;-0.00028752093203366;0.00012775503273588;-5.309664629749e-05;0.0005338565679267;3.7058176530991e-05;9.0767662186408e-06;-0.00014568398182746;0.0010100088547915;-0.00012742933176924;0.00064885837491602;-1.5658366464777e-05;-0.00033983730827458;3.2809246022225e-06;-0.00030943696037866;-0.00033252214780077;0.0001624338910915;0.00026845431420952;0.00045789184514433;-0.00012330611934885;0.00026716638240032;-0.00016685826994944;5.8149395044893e-05;-0.0004806735960301;8.5843996203039e-05;-0.0013720399001613;3.8320235034917e-05;0.00052240304648876;0.00015267498383764;-0.00043334998190403;-8.6171537986957e-05;0.00018895727407653;6.8580055085476e-05;0.00058619224000722;6.7847257014364e-05;9.3288705102168e-05;2.4438006221317e-05;-9.8505646747071e-05;-5.5660420912318e-05;0.00019311123469379;0.00019331049406901;0.00030832240008749;1.9179697119398e-05;0.00047403303324245;0.00036952283699065;0.00031567137921229;-2.0606901671272e-05;-0.00020860991207883;-0.00060764997033402;-2.3171158318291e-05;-0.00023192528169602;1.6829000742291e-05;-0.00041483488166705;-0.00015745582641102;-0.00050027208635584;-0.00011392148007872;0.00054208072833717;-4.2101470171474e-05;-0.00061980274040252;8.6186570115387e-05;-0.00028783091693185;1.3455513908411e-05;-0.00035328028025106;9.3767623184249e-05;0.00049260613741353;-0.00014714123972226;-0.00029959515086375;5.595727088803e-06;-2.0915567802149e-05;-4.2256415326847e-05;0.0015242387307808;-4.2962270526914e-05;-0.00015707848069724;3.3110314689111e-05;0.00018504103354644;0.00014629388169851;-7.9714918683749e-05;0.00035961798857898;-0.00014798685151618;0.00025945212109946;-3.8288631913019e-05;-0.00030059588607401;9.4363258540398e-06;-0.0009953286498785;2.9259294024087e-05;0.00018597854068503;1.9082855942543e-05;-0.00042800995288417;2.074280700981e-06;-0.00010421170009067;0.00014953837671783;-0.00012487117783166;-0.00016197946388274;-0.00039908275357448;-0.00028544021188281;0.0001123890542658;-6.1792117776349e-05;0.00051472074119374;3.4739034163067e-05;1.2317195796641e-05;-0.00014742251369171;0.00099977385252714;-0.00014075404033065;0.00063025503186509;-1.3233903700893e-05;-0.00033393257763237;3.3442422136432e-05;-0.00032345688669011;-0.00032323962659575;0.00014370484859683;0.00030077231349424;0.00046322747948579;-0.00011424758849898;0.0002770627324935;-0.00015180821355898;6.552259583259e-05;-0.00045950809726492;9.5076451543719e-05;-0.001335904118605;3.7792946386617e-05;0.00050633825594559;0.0004033949226141;-0.0001337238936685;-8.990093920147e-05;0.00011272019037278;-0.00056775438133627;-5.5218017223524e-05;-9.7955833666674e-08;-2.6965419237968e-05;4.9631285946816e-05;5.8608617337086e-07;-0.00048700929619372;4.4445852836361e-05;-0.00013882986968383;-0.00010333180398447;-0.00027289660647511;-3.2724376069382e-05;-0.00035968402517028;-0.00024773975019343;-5.9580925153568e-05;0.00047908080159687;0.00017582264263183;0.00022777586127631;4.0999384509632e-05;0.00055510411038995;-5.2130671974737e-05;0.00025255131185986;0.00010087092960021;-0.00024475890677422;6.3956147641875e-05;0.00032830951386131;3.7097815948073e-05;-0.0002185975026805;4.826129952562e-05;-0.00028142199153081;3.5597747682914e-06;0.00051397230708972;4.588709998643e-05;-9.955970745068e-05;-0.0001139254309237;-1.1773667210946e-05;-5.8763366723724e-06;0.001354772830382;-3.097908484051e-05;1.828540553106e-05;-2.6162988433498e-05;1.9455577785266e-05;4.0674673073227e-05;0.00013091471919324;-4.6388773625949e-05;0.00023018234060146;0.00018799197277986;-0.00011911521141883;-0.00033372483449057;2.9705230190302e-05;-0.0010233779903501;2.1733410903835e-05;0.00010131208546227;8.6774125520606e-06;-0.00048986886395141;1.8292415916221e-05;3.6469420592766e-05;-9.3756443675375e-06;-0.00013883205247112;0.00010589865996735;-0.00026170187629759;-9.7204894700553e-05;1.1020590136468e-05;-0.00013931543799117;0.00030295285978355;-2.9977769372636e-05;1.5785399227752e-05;1.7415237380192e-05;0.00078437360934913;-8.4002873336431e-05;0.00034300237894058;-7.3893410444725e-05;-0.00024404330179095;-5.2345226322359e-06;6.3312239944935e-05;-0.00014691353135277;-0.00020061730174348;0.00014376229955815;4.3838648707606e-05;-4.5934906665934e-05;0.0002579326974228;-7.5264055340085e-05;0.00014694312994834;-0.00024933327222243;2.6577912649373e-05;-0.00092784356093034;5.2956260333303e-05;0.00038195424713194;2.2386628188542e-05;0.00053775554988533;-0.00016137793136295;-8.4057930507697e-05;0.00012063344911439;-0.00073310878360644;-0.00010010688129114;3.6532805097522e-05;-3.0595303542214e-05;6.0258971643634e-05;9.2636691988446e-06;-0.00075086369179189;4.6554650907638e-05;-5.7306489907205e-05;-0.00015374607755803;-0.00031104951631278;-5.1056005759165e-05;-0.00046923613990657;-0.00034743032301776;-0.00012362090637907;0.00060231552924961;0.00025929903495125;0.00033745676046237;7.8432174632326e-05;0.00073748052818701;-3.7933947169222e-05;0.0002161566662835;0.00014291373372544;-0.00027288490673527;9.3293463578448e-05;0.00034998470800929;5.604317993857e-05;-0.00017435490735807;1.2334998245933e-05;-0.00035911783925258;4.7902463848004e-05;0.00064054655376822;5.3005078370916e-05;-9.5210489234887e-05;-0.00014725531218573;-1.6988495190162e-05;-7.2522771006334e-06;0.0016200522659346;-7.5007469604316e-06;8.9470253442414e-05;-2.2976459149504e-05;7.5008547355537e-06;4.9953574489336e-05;8.7652348156553e-05;-9.0554014605004e-05;0.00028501541237347;0.00030313027673401;-0.00011738708417397;-0.00043273338815197;4.8585137847112e-05;-0.0012876357650384;-1.7722333723214e-05;9.6951334853657e-05;1.717303712212e-05;-0.00063834461616352;1.5255648577295e-05;5.4659845773131e-05;-1.4155243661662e-05;-0.00020012575259898;0.00013658884563483;-0.00020038714865223;-0.00010908972035395;8.8203953055199e-05;-0.00016317414701916;0.00037616302142851;-2.7334213882568e-05;1.7605974790058e-05;2.0196697732899e-05;0.00096575205679983;-9.6896947070491e-05;0.00044420338235795;-7.2786118835211e-05;-0.00029396041645668;-6.5666135924403e-06;4.9650185246719e-05;-0.00012968546070624;-0.00023406998661812;9.4407172582578e-05;6.2629405874759e-05;-9.5306349976454e-05;0.00028917432064191;-0.00019176700152457;0.00016291762585752;-0.00032178082619794;2.3277203581529e-05;-0.0011255042627454;5.246521322988e-05;0.0004593443882186;2.5855533749564e-05;0.00052557582966983;-0.00013270413910504;1.4015488886798e-05;8.2550657680258e-05;-0.00068678805837408;-0.00011499607353471;4.0374103264185e-05;-2.0746252630488e-05;5.2119219617452e-05;1.7385666069458e-05;-0.0009267769055441;3.3109576179413e-05;5.5049924412742e-05;-0.00016825617058203;-0.00022030995751265;-5.784150926047e-05;-0.00046305044088513;-0.0003486396453809;-0.00014874554472044;0.00052612443687394;0.00029087669099681;0.00037847700878046;7.243638538057e-05;0.00071492401184514;-6.1138885030232e-06;0.00010291812941432;0.00014810671564192;-0.00013098913768772;9.9337659776211e-05;0.00020994967781007;6.2626531871501e-05;-2.6508538212511e-05;-4.925412213197e-05;-0.00033409160096198;0.00010349723743275;0.0005179753061384;4.8590431106277e-05;-5.4566011385759e-05;-0.00013043418584857;-1.9068114852416e-05;-8.1943899203907e-06;0.0013739017304033;3.4702716220636e-05;0.00013491099525709;-2.6051889108203e-06;-2.0906440113322e-05;4.3811698560603e-05;-2.7724958272302e-05;-0.00011529774201335;0.00025461890618317;0.00036959079443477;-6.4818981627468e-05;-0.00038812970160507;3.9007274608593e-05;-0.0011322596110404;-7.9980076407082e-05;7.4629882874433e-05;1.9561899534892e-05;-0.0006140930345282;1.4860283670259e-07;6.9859292125329e-05;-1.687407893769e-05;-0.00019655688083731;0.00012182242790004;-2.6023285499832e-06;-7.4230789323337e-05;9.2044792836532e-05;-0.00012848721235059;0.0003322166739963;-2.1229982394289e-06;1.0062348337669e-05;2.0506433429546e-05;0.00075483875116333;-6.9868634454906e-05;0.00038977587246336;-3.458117498667e-05;-0.00024303345708176;-1.1582048500713e-05;-1.2009261808998e-05;-5.0098886276828e-05;-0.00020416677580215;-2.5384721084265e-05;7.7658849477302e-05;-8.9255743660033e-05;0.00020643507014029;-0.00016275107918773;0.00010720241698436;-0.00029777939198539;6.4767682488309e-06;-0.00095264206174761;2.5060930056497e-05;0.00039025864680298;2.2793503376306e-05;0.00041828030953184;-7.7691380283795e-05;5.5432214139728e-05;3.2523930713069e-05;-0.00056777067948133;-0.00010613464837661;3.1617204513168e-05;-1.4747817658645e-05;4.3188490963075e-05;1.762624924595e-05;-0.00083959865150973;1.056525252352e-05;0.00010399219900137;-0.00016969241551124;-0.00015114346751943;-5.1566879847087e-05;-0.00038056357880123;-0.00030241519561969;-0.00013786795898341;0.0004147456784267;0.00026466709095985;0.00035145040601492;5.4927430028329e-05;0.00058280897792429;3.2115480280481e-05;4.0446640923619e-05;0.00013458656030707;-7.0546084316447e-05;0.00010023228242062;0.00012009609054076;6.0436264902819e-05;6.8455607106443e-05;-6.8622874096036e-05;-0.00028365277103148;0.00011375167377992;0.00035852714790963;3.896843190887e-05;-3.2893403840717e-05;-0.00010123434913112;-2.2135376639199e-05;-7.55929022489e-06;0.0010221891570836;5.1431296014925e-05;0.00013665396545548;1.431799501006e-05;-1.2776097719325e-05;3.6690238630399e-05;-9.3496462795883e-05;-0.00012687432172243;0.00020718640007544;0.00037156618782319;-1.4936756997486e-05;-0.00029587937751785;2.3074873752194e-05;-0.0008630285738036;-0.0001030968996929;4.7740850277478e-05;1.4493281014438e-05;-0.00049192464211956;-1.1622350939433e-05;4.4020849600201e-05;-1.9334444004926e-05;-0.00017254748672713;9.4675553555135e-05;0.00010000787005993;-4.0721821278566e-05;0.00011457747314125;-8.3098610048182e-05;0.00027506481274031;1.2997041267226e-05;5.0842004384322e-06;1.9146529666614e-05;0.0005699874018319;-3.902969910996e-05;0.00034160836366937;-4.463614811101e-09;-0.00018018184346147;-1.2051395060553e-05;-3.1202180252876e-05;-1.3093002735332e-06;-0.00016703385335859;-9.0472538431641e-05;6.3586048781872e-05;-8.5302417573985e-05;0.00014097537496127;-0.00016194200725295;5.3930118156131e-05;-0.00027106338529848;-1.2648988558794e-05;-0.00075845996616408;-2.3550198875455e-06;0.00029830780113116;1.9476385205053e-05;0.00020126708841417;8.8715205492917e-06;9.2573784058914e-05;-3.1616302294424e-05;-0.0003517793957144;-6.1280603404157e-05;1.0084332643601e-05;-4.1274020645687e-07;2.6852125301957e-05;9.9266235338291e-06;-0.00055852334480733;-1.0589628800517e-05;0.00011278128658887;-0.00014483298582491;-6.4550040406175e-05;-3.1435221899301e-05;-0.00021874188678339;-0.00018042938609142;-9.1213114501443e-05;0.00021040781575721;0.00018098812142853;0.0002587788621895;2.2100084606791e-06;0.00033956769038923;6.3976083765738e-05;-7.7974937084946e-06;9.2383786977734e-05;-1.4539840776706e-05;8.6178930359893e-05;2.4578424927313e-05;4.6315501094796e-05;0.00013543796376325;-4.5800097723259e-05;-0.00019776946282946;8.0109442933463e-05;0.00013219495303929;1.4302775525721e-05;-8.073301614786e-06;-5.2278173825471e-05;-2.0706709619844e-05;-9.4123261078494e-06;0.00050250173080713;4.4933476601727e-05;0.00010418506280985;3.2758776796982e-05;-2.1385344552982e-06;2.8428510631784e-05;-0.00013112007582095;-0.00012582560884766;0.00012574456923176;0.00031463109189644;4.6431581722572e-05;-0.00015096324204933;7.0604528445983e-06;-0.0004326083289925;-8.951286872616e-05;1.6629015590297e-05;6.8408930076203e-08;-0.00028550854767673;-2.4579496312072e-05;1.3337365089683e-05;-2.2458372768597e-05;-0.00011987250763923;4.3099418689962e-05;0.00015620295016561;1.2363864698273e-05;0.00012710916053038;-2.4801472591207e-06;0.00017689868400339;3.1592520826962e-05;1.6032015537348e-06;1.3160065464035e-05;0.00031866758945398;7.3608971433714e-06;0.00024338805815205;4.7578105295543e-05;-9.4027440354694e-05;-8.918609637476e-06;-1.6876143490663e-05;5.6357668654528e-05;-0.00010616313375067;-0.00013707387552131;6.6738275563694e-06;-7.2428636485711e-05;4.9088448577095e-05;-0.00014643899339717;-2.1925114197074e-05;-0.00020188034977764;-4.4357890146784e-05;-0.00045500832493417;-4.2196130380034e-05;0.0001638887624722;1.4614067367802e-05;4.9242578825215e-05;8.4907638665754e-05;0.00013612549810205;-8.6562278738711e-05;-0.00021999060118105;-3.3897322282428e-05;3.701423338498e-06;5.8588761930878e-06;2.279864384036e-05;1.6311241779476e-06;-0.00036396190989763;-2.3133867216529e-05;0.00014979299157858;-0.00016050193517003;-3.5893135645892e-05;-1.8226297470392e-05;-0.00013614371709991;-0.00011317722965032;-6.3125691667665e-05;9.4202448963188e-05;0.00014542568533216;0.00020767327805515;-3.9530128560727e-05;0.00015730029554106;9.7303527581971e-05;-3.8458882045234e-05;8.0471436376683e-05;-3.3542972232681e-05;9.5968258392531e-05;-1.0180723620579e-05;4.3923013436142e-05;0.00016561297525186;4.2173896872555e-06;-0.00015784028801136;3.7865203921683e-05;2.0268818843761e-05;-1.4582480616809e-05;1.3940595522399e-07;-2.6128456738661e-05;-2.2102534785517e-05;-1.4814773749094e-05;0.00026591328787617;2.6124045689357e-05;9.7159267170355e-05;5.1952778449049e-05;1.1770415767387e-05;3.120869587292e-05;-0.00016642153786961;-0.00014711712719873;9.5478259027004e-05;0.00030841486295685;0.00011108275793958;-8.1201258581132e-05;5.0244977956027e-08;-0.00024043973826338;-6.6638560383581e-05;-1.1944736115765e-06;-1.3999569091538e-05;-0.00019368600624148;-3.8985501305433e-05;-1.1161438123963e-05;-3.0944644095143e-05;-0.00010272585495841;6.7885030148318e-06;0.00018622835341375;6.5530461142771e-05;0.00016565631085541;6.8045483203605e-05;0.00014672071847599;5.1677514420589e-05;1.0211764589485e-07;1.1348677617207e-05;0.00022980601352174;4.7760684537934e-05;0.00022411634563468;9.9273725936655e-05;-5.5695338232908e-05;-7.7733220678056e-06;1.3152643987269e-05;0.00010545425902819;-8.6494736024179e-05;-0.00017862777167466;-6.0361500800354e-05;-8.3269318565726e-05;-9.019793196785e-07;-0.00016867005615495;-8.9417102572042e-05;-0.00019496257300489;-8.4679595602211e-05;-0.00034330977359787;-8.7954613263719e-05;0.00010725911124609;1.592261105543e-05;-0.00010568721336313;0.00018346220895182;0.00021353938791435;-0.00015763104602229;-0.00012728647561744;-4.3950640247203e-06;4.2342935557826e-07;1.7066324289772e-05;2.3889022486401e-05;-1.0235368790745e-05;-0.00023385150416289;-2.899420724134e-05;0.00020984341972508;-0.00020141492132097;-2.1395515432232e-05;-5.1607062232506e-06;-8.2280981587246e-05;-5.7664321502671e-05;-4.314575198805e-05;-1.3678213690582e-05;0.00013625895371661;0.00018910253129434;-9.8979857284576e-05;8.1529860835872e-06;0.0001373048289679;-7.251113129314e-05;7.9281002399512e-05;-6.4261359511875e-05;0.00011933112546103;-3.592571374611e-05;4.6844121243339e-05;0.00021473212109413;7.5531424954534e-05;-0.00015394133515656;-1.3660422155226e-05;-7.3083356255665e-05;-5.5698834330542e-05;8.4419516497292e-06;-4.5888355089119e-06;-2.3415175746777e-05;-2.39436449192e-05;0.00011030910536647;3.7812235404999e-06;0.00011211559467483;8.3559767517727e-05;2.0038096408825e-05;3.9260059566004e-05;-0.0002254506398458;-0.00020009478612337;8.0017831351142e-05;0.00035755991120823;0.00020182643493172;-3.0578721634811e-05;2.3819368379918e-06;-0.0001164657442132;-4.2849693272728e-05;-1.7187177945743e-05;-3.2719974115025e-05;-0.00015854342200328;-6.6918619268108e-05;-2.6891053494182e-05;-4.3524003558559e-05;-0.00010978737554979;-3.3570846426301e-05;0.00024666628451087;0.00014427276619244;0.00023176141257863;0.0001621878327569;0.00014766931417398;8.6921754700597e-05;1.9079809021605e-07;1.036051162373e-05;0.00019910746777896;9.8963762866333e-05;0.00024066781043075;0.00017270317766815;-3.8452737499028e-05;-1.0184221537202e-05;6.5534208260942e-05;0.000198989873752;-8.4639650594909e-05;-0.00027110925293528;-0.00016728961782064;-0.00011465295392554;-6.0770649724873e-05;-0.00021979238954373;-0.00017809476412367;-0.00021769497834612;-0.00014530055341311;-0.00030690198764205;-0.00015560261090286;8.3804719906766e-05;2.4042905351962e-05;-0.00025728525361046;0.00027978204889223;0.00030987514765002;-0.00022787216585129;-5.6911027058959e-05;5.2390150813153e-05;-2.6702973627835e-06;3.5173867217964e-05;2.7154865165357e-05;-2.6133251594729e-05;-0.00014441595703829;-8.0661302490626e-06;0.00029580839327537;-0.00026261431048624;-1.0231393389404e-05;9.9629369287868e-06;-4.044014349347e-05;2.8215595193615e-06;-2.3160413547885e-05;-0.00011970886407653;0.00012406271707732;0.00019328713824507;-0.00019125755352434;-0.00012961606262252;0.00016276570386253;-0.00011446877761045;8.1894562754314e-05;-0.00010196870425716;0.00015301792882383;-6.5494306909386e-05;5.4317621106748e-05;0.00026434671599418;0.00016965078248177;-0.00015059165889397;-7.1745060267858e-05;-0.0001471228315495;-9.6300267614424e-05;1.4667721188744e-05;1.4328140423459e-05;-2.5464527425356e-05;-3.95742499677e-05;7.394161002594e-06;-8.4447674453259e-06;0.00014057067164686;0.0001255436509382;2.5809378712438e-05;5.5480952141806e-05;-0.00030162220355123;-0.00025744119193405;8.7154403445311e-05;0.00042388343717903;0.00031068490352482;-3.0863875508658e-06;-7.275791176653e-06;-4.6813995140838e-05;-3.3340420486638e-05;-3.0200470064301e-05;-5.4842283134349e-05;-0.00015550988609903;-0.00010760185978143;-3.869118518196e-05;-6.3845909608062e-05;-0.00012828508624807;-8.3217724750284e-05;0.00032732542604208;0.00025023031048477;0.00031214780756272;0.00028317992109805;0.00016623581177555;0.00013894915173296;1.7174637605422e-06;9.9336803032202e-06;0.00019371135567781;0.00016937075997703;0.00027993903495371;0.00027892668731511;-3.0233901270549e-05;-1.4384801943379e-05;0.00012503704056144;0.00031024203053676;-9.8055323178414e-05;-0.00038455592584796;-0.00029730569804087;-0.00015177656314336;-0.00012891436927021;-0.00028624414699152;-0.0002961941936519;-0.00026135292137042;-0.00023384804080706;-0.00030984508339316;-0.00025626792921685;7.5998861575499e-05;3.753636701731e-05;-0.00028900237521157;0.00026115967193618;0.00033599251764826;-0.00023203396995086;-9.6469357231399e-06;0.00011789702693932;-1.8904736975855e-07;4.3019044824177e-05;2.4331413442269e-05;-3.499580634525e-05;-8.5466417658608e-05;5.2747360314243e-05;0.00033705279929563;-0.00028371906955726;-1.8327283441977e-06;2.2116937543615e-05;-8.9199402282247e-06;5.5450800573453e-05;-1.249253386959e-06;-0.00017237606516574;7.9448131145909e-05;0.00017429346917197;-0.00025439943419769;-0.00020307712838985;0.00012517541472334;-0.00013807370851282;7.6604206697084e-05;-0.00013066231622361;0.00016692806093488;-7.8612029028591e-05;5.20393550687e-05;0.0002327202091692;0.00022049104154576;-0.00011032960901503;-0.00010876916348934;-0.00014830174040981;-9.5051778771449e-05;5.4933657338552e-06;1.4570353414456e-05;-2.4367727746721e-05;-5.065779259894e-05;-1.9330382201588e-06;2.3110000256565e-05;0.0001398564199917;0.0001379949535476;2.9902186724939e-05;7.0334615884349e-05;-0.00032764679053798;-0.00026896671624854;0.00011090615589637;0.00041695174877532;0.00036621117033064;-5.9894737205468e-06;-3.1368068448501e-05;-5.4418243962573e-05;-5.8862402511295e-05;-2.6461875677342e-05;-5.9248945035506e-05;-0.0001435150479665;-0.00012904869799968;-4.4092823372921e-05;-7.9512275988236e-05;-0.00011265489592915;-0.00010730957001215;0.00031599641079083;0.0002922092389781;0.0003067062352784;0.00033265468664467;0.00016316684195772;0.0001704284659354;4.4329667616694e-06;8.8666110968916e-06;0.0001789727830328;0.00022129656281322;0.00028038595337421;0.00034573394805193;-2.4541905077058e-05;-1.8711045413511e-05;0.00011499773245305;0.00030275844619609;-0.00011248150258325;-0.00036074942909181;-0.00031902166665532;-0.00013624965504277;-0.00014656585699413;-0.00028598931385204;-0.000354009331204;-0.00026402247021906;-0.00028656458016485;-0.00029455203912221;-0.00033208657987416;6.7628083343152e-05;4.9274909542874e-05;-0.00022441880719271;0.00014998661936261;0.00027882182621397;-0.00017889597802423;3.2175343221752e-05;0.00016847715596668;4.9148793550557e-06;3.9013732020976e-05;1.5163510397542e-05;-3.6019086110173e-05;-3.310345709906e-05;0.00013292413495947;0.00029592122882605;-0.00023394192976411;6.3660977502877e-06;3.2452233426739e-05;2.8383026801748e-05;9.8822325526271e-05;2.2388820070773e-05;-0.00018472265219316;9.4021843324299e-06;0.00011365574755473;-0.00026180912391283;-0.00020352081628516;3.1466333894059e-05;-0.00013137716450728;5.2228257118259e-05;-0.00012739899102598;0.00014114384248387;-6.9687252107542e-05;3.1187937565846e-05;0.00013511546421796;0.00021352473413572;-4.5748940465273e-05;-0.00012812006752938;-0.00010189758904744;-5.8014356909553e-05;-1.1100495612482e-05;3.6027811347594e-06;-1.5711824744358e-05;-4.8280355258612e-05;2.0959567336831e-05;8.6662606918253e-05;0.00010491171269678;0.0001167257069028;2.4751057935646e-05;6.8279106926639e-05;-0.00027967386995442;-0.00022969425481278;0.00011504282156238;0.00031843889155425;0.00034719071118161;-8.5282563304645e-06;-4.9249854782829e-05;-7.4691393820103e-05;-9.8719589004759e-05;-1.1627564163064e-05;-4.4624899601331e-05;-0.0001070620783139;-0.00013268648763187;-3.5421959182713e-05;-7.4351330113132e-05;-6.3603976741433e-05;-0.0001039220878738;0.00021735057816841;0.00025884562637657;0.0002085734740831;0.00029348142561503;0.00012242404045537;0.00016971804143395;7.2134548645408e-06;5.8491077652434e-06;0.00012742173566949;0.00023409970162902;0.00020966157899238;0.00033517961855978;-1.9230203179177e-05;-2.68256135314e-05;6.109855894465e-05;0.00021105544874445;-0.00010879705951083;-0.00023188817431219;-0.00025302593712695;-7.6331867603585e-05;-0.00012552981206682;-0.00020415133622009;-0.00032174790976569;-0.00019751171930693;-0.00027286613476463;-0.00021819659741595;-0.000349974114215;5.0994574849028e-05;6.0635600675596e-05;-0.00013699822011404;1.7156327885459e-05;0.00019592835451476;-0.00011715068831109;6.5447624365333e-05;0.00022034904395696;8.8893166321213e-06;3.3728054404492e-05;5.9324620451662e-06;-3.6223813367542e-05;1.9184667507943e-06;0.00022839356097393;0.00023301916371565;-0.00016481753846165;1.4941538211133e-05;4.5888573367847e-05;7.5830372225028e-05;0.00013876720913686;4.4236683606869e-05;-0.00018785150314216;-6.947893416509e-05;5.075693843537e-05;-0.00025798240676522;-0.00017119871336035;-8.1433347077109e-05;-0.00011745154915843;1.9321181753185e-05;-0.00011003128020093;0.00010498023766559;-5.6628345191712e-05;1.7612115925658e-06;3.7281104596332e-05;0.00018398746033199;1.8026201360044e-05;-0.00014232895046007;-4.7900088247843e-05;1.9367500954104e-06;-2.8700325856335e-05;-1.0321215086151e-05;-5.8627051657822e-06;-4.0843551687431e-05;4.3250187445665e-05;0.00018553242261987;6.518454028992e-05;9.0496891061775e-05;1.6591975509073e-05;5.8185858506477e-05;-0.00020997872343287;-0.00017172246589325;0.00011609532521106;0.00019623259140644;0.00030291624716483;-9.9943836175953e-06;-7.4221163231414e-05;-9.1034547949675e-05;-0.00016563586541452;4.1350499486725e-06;-2.3701748432359e-05;-6.9235196860973e-05;-0.00014776260650251;-2.2061232812121e-05;-5.8547819207888e-05;-1.2183237231511e-05;-9.7879958047997e-05;0.00011243596236454;0.00021059987193439;9.520127059659e-05;0.00023236506967805;7.5811112765223e-05;0.00016716930258553;9.8504306151881e-06;2.7784747089754e-06;6.6022592363879e-05;0.00024336397473235;0.00012269195576664;0.00030638067983091;-1.5466408513021e-05;-4.1929219150916e-05;1.021595835482e-05;0.00011892284965143;-0.00010339490836486;-0.00010181939433096;-0.00018162178457715;-1.0957960512314e-05;-0.00010071280121338;-0.00010511124855839;-0.00026306029758416;-0.00011703746713465;-0.00024420139379799;-0.00012904917821288;-0.00036499529960565;3.4981676435564e-05;8.0629426520318e-05;-6.1951235693414e-05;-0.00011038465891033;0.00013394771667663;-8.0028738011606e-05;9.0985973656643e-05;0.00029384941444732;1.4510572327708e-05;3.3300413633697e-05;-7.1206947893643e-08;-4.2223015043419e-05;9.2259879238554e-06;0.00034657289506868;0.00020989905169699;-0.00012759229866788;2.481456976966e-05;7.1983959060162e-05;0.00013872954878025;0.00018843291036319;6.3459832745139e-05;-0.00020941214461345;-0.00015565170906484;1.1374843779777e-05;-0.00028313070652075;-0.00014311195991468;-0.00018570620159153;-0.00012318075459916;-1.2241360309417e-05;-0.00010520367504796;9.6604700956959e-05;-5.4505286243511e-05;-3.3297434129054e-05;-2.3051812604535e-05;0.00015240102948155;6.7541608586907e-05;-0.00015837579849176;-8.1874641182367e-06;8.6526648374274e-05;-5.0211114285048e-05;-3.0028268156457e-05;-2.2126459953142e-07;-3.8055692130001e-05;6.1881582951173e-05;0.00035491879680194;3.8183487049537e-05;7.8512894106098e-05;1.339051323157e-05;5.4809257562738e-05;-0.00016953458543867;-0.00013031034904998;0.00014445775013883;0.00011280584294582;0.00028546602698043;-1.7599832062842e-05;-0.00012587501259986;-0.00011125083983643;-0.00029898414504714;1.89680740732e-05;-1.5811806406418e-06;-4.6010067308089e-05;-0.00019934565352742;-1.382000027661e-05;-4.7420431656064e-05;2.9413129595923e-05;-0.0001049269340001;4.2561194277368e-05;0.00018376631487627;7.9158744483721e-06;0.00019587986753322;4.6980931074359e-05;0.00019402212637942;1.4024220035935e-05;5.8809843039853e-07;1.9984099708381e-05;0.00029132500640117;6.5289990743622e-05;0.00032181412097998;-1.509834510216e-05;-6.7549633968156e-05;-3.2998559618136e-05;4.7482259105891e-05;-0.00011945223377552;-4.3773725337815e-06;-0.00013099702482577;5.0284503231524e-05;-8.7500440713484e-05;-3.1896186555969e-05;-0.0002297531318618;-6.5183972765226e-05;-0.00025315495440736;-7.1606882556807e-05;-0.00044428068213165;2.7325248083798e-05;0.00012011937360512;1.9520954083418e-05;-0.0002568286145106;6.7733570176642e-05;-7.0947331550997e-05;0.00011084838479292;0.00037328733014874;1.9295532183605e-05;2.4276234398712e-05;-1.3975427464175e-06;-5.1442908443278e-05;-1.0296372238372e-05;0.00050962821114808;0.00019554140453693;-0.00010650974581949;3.3083713788074e-05;0.00012144269567216;0.00023259289446287;0.00023925777350087;7.9336132330354e-05;-0.00024836653028615;-0.00024851824855432;-1.4831589396636e-05;-0.00030654118745588;-9.5489078375977e-05;-0.00028867073706351;-0.00013568963913713;-4.7403500502696e-05;-9.999041503761e-05;0.00010115966142621;-5.3413150453707e-05;-9.0667941549327e-05;-5.2313334890641e-05;9.4366165285464e-05;0.0001028343976941;-0.00017676968127489;1.7346608728985e-05;0.00021608838869724;-7.7597331255674e-05;-5.5570515542058e-05;3.6215359955349e-07;-2.841214700311e-05;6.7382403358351e-05;0.00065406848443672;1.474745113228e-05;7.1825263148639e-05;1.3702940123039e-05;3.0260498533607e-05;-0.00013492583821062;-9.3382303020917e-05;0.0001895671884995;4.3524385546334e-05;0.00027651907294057;-1.8123422705685e-05;-0.0002101090940414;-0.000118765681691;-0.00053540617227554;3.3728920243448e-05;3.926821591449e-05;-2.8809899959015e-05;-0.00032407202525064;-6.5827634898596e-06;-4.7522712520731e-06;6.9599125708919e-05;-0.00011929859465454;-8.5151850726106e-06;0.00016225437866524;-7.5774180004373e-05;0.00013057352043688;2.6733059712569e-05;0.00024354540801141;1.8522343452787e-05;-5.6736951137282e-07;-2.6462035748409e-05;0.00035536388168111;1.5254929166986e-05;0.00033712439471856;-1.8284494217369e-05;-0.0001208180692629;-7.8140663390514e-05;-1.1470587196527e-05;-0.00015139364404604;7.7048673119862e-05;-8.0598176282365e-05;0.00011266412184341;-7.3693401645869e-05;3.7245648854878e-05;-0.00016434554709122;-2.1133137124707e-05;-0.00026265633641742;-2.3440425138688e-05;-0.000572738237679;2.490133192623e-05;0.00019849921227433;0.00014671300596092;-0.00043255675700493;-6.722175021423e-05;6.9045352574904e-05;9.4491777417716e-05;0.00053971214219928;4.2500625568209e-05;3.2657910196576e-05;1.0246787496726e-05;-7.6165379141457e-05;-6.1287340940908e-05;0.00043005737825297;0.00017653968825471;0.00011440642992966;3.2221432775259e-05;0.000341500795912;0.00036640430334955;0.00028909862157889;4.349295704742e-05;-0.00024344290432055;-0.00047781181638129;-2.9642314984812e-05;-0.00027085089823231;1.2528630577435e-05;-0.00043305681901984;-0.00015183720097411;-0.00029198804986663;-9.7134987299796e-05;0.0003459251311142;-4.571354293148e-05;-0.00040883317706175;3.295078931842e-05;-0.00017556440434419;5.150066135684e-05;-0.00030297751072794;6.1392798670568e-05;0.00049088691594079;-0.00013686240708921;-0.0001806170475902;-2.1907703739998e-07;-1.6231833797065e-05;-9.2792197392555e-06;0.0013491128338501;-3.3565374906175e-05;-4.391744005261e-05;3.1469629902858e-05;7.0460584538523e-05;6.2075043388177e-05;-6.9013687607367e-05;0.0003058755537495;-0.00010617163934512;0.00026402837829664;-3.7317868191167e-06;-0.00034799141576514;-2.5553737941664e-05;-0.00096516322810203;3.5367094824323e-05;0.0001383976341458;1.303601948166e-05;-0.00049190741265193;-1.8610736560731e-06;4.0743443605606e-06;0.00013109255814925;-0.00013183581177145;-0.00011463078408269;-0.00019947400141973;-0.00021930059301667;9.142654016614e-05;-3.1862960895523e-05;0.00041743490146473;2.5638420993346e-05;7.9567316788598e-06;-0.00011625218758127;0.00078556884545833;-9.1623958724085e-05;0.00048603903269395;-1.2020676877e-05;-0.00028293253853917;-1.3853280506737e-05;-0.00020321727788541;-0.00025457184528932;0.00012582767521963;0.00017014256445691;0.00033310655271634;-0.00010322320304113;0.00020287247025408;-0.00014660750457551;4.0508923120797e-05;-0.00035205273889005;6.3624094764236e-05;-0.0010618227533996;2.8192087484058e-05;0.00042585071059875;0.00013142898387741;-0.00035712611861527;-7.567043940071e-05;6.0683767515002e-05;5.4624812037218e-05;0.00045413928455673;3.3843578421511e-05;5.3801410103915e-05;1.2247296581336e-05;-6.3545041484758e-05;-6.1455626564566e-05;0.00033525854814798;0.00012879834685009;0.00016733136726543;2.2924976292416e-05;0.00029605423333123;0.00030771712772548;0.00021985299827065;9.4875913418946e-06;-0.00018383053247817;-0.0003977149608545;-1.2624119563043e-06;-0.00020868408319075;3.7360256101238e-05;-0.00036890641786158;-0.00011561001156224;-0.00030032161157578;-7.0837326347828e-05;0.00028060239856131;-3.2913223549258e-05;-0.00036827914300375;5.0495986215537e-05;-0.00019143414101563;2.5392859242857e-05;-0.00026228319620714;5.6976699852385e-05;0.00040703712147661;-0.00011316862219246;-0.00016636255895719;-1.9107362732029e-06;-9.8848968264065e-06;-2.6145178708248e-05;0.0011805138783529;-3.1829134968575e-05;-7.480155909434e-05;2.8786138500436e-05;5.6644650612725e-05;8.7136737420224e-05;-4.6095428842818e-05;0.00025897723389789;-0.00011067601008108;0.00020521703117993;-6.3102306739893e-06;-0.00028653960907832;1.2828962780986e-06;-0.00080724619328976;2.3798576876288e-05;0.00013981606753077;1.5707890270278e-05;-0.00041449262062088;-1.4519282558467e-06;1.2848337064497e-05;0.00010785272024805;-9.6694107924122e-05;-0.00010326487245038;-0.00022691598860547;-0.00018966272182297;2.9542796255555e-05;-3.0675379093736e-05;0.00035263554309495;2.1838866814505e-05;8.0876998254098e-06;-0.00010247966565657;0.00065956299658865;-8.7833410361782e-05;0.00039199649472721;-9.7620877568261e-06;-0.00024887936888263;2.2429530872614e-06;-0.0001941271184478;-0.00022270061890595;0.00010214843496215;0.00018263190577272;0.00029351454577409;-6.5458625613246e-05;0.00018168937822338;-6.0441037931014e-05;3.9392416510964e-05;-0.00028401555027813;6.2070699641481e-05;-0.00091036467347294;2.4058743292699e-05;0.00037400904693641;0.00035133460187353;-7.3763229011092e-05;5.9471469285199e-05;3.4595741453813e-05;-0.00050918944180012;-6.8729343183804e-05;1.3784558177576e-05;9.9099761428079e-06;2.3880811568233e-05;1.5143261407502e-05;-0.00082129542715847;2.3008764401311e-05;3.7591391446767e-05;-9.4368930149358e-05;-7.2041133535095e-05;-4.0791888750391e-05;-0.00029544986318797;-0.00021645556262229;-0.00011778037151089;0.00028690398903564;0.00020584513549693;0.00031532775028609;1.9439637981122e-05;0.00060674356063828;-3.531362835929e-06;2.2927059035283e-05;8.326829993166e-05;7.1917776949704e-05;5.3468709666049e-05;4.0412654925603e-05;3.8421498175012e-05;0.00010987518908223;-9.3086426204536e-05;-0.00025134088355117;0.00011394406465115;0.00024596901494078;3.4768341720337e-05;-2.4478567866026e-06;-7.5010284490418e-05;-8.1948201113846e-06;-4.9505460992805e-06;0.0007121543167159;6.2929670093581e-05;0.0001152446566266;1.4516443116008e-05;-4.6928962547099e-05;2.1173264030949e-05;-8.1555444921833e-05;-0.00010474106966285;0.00013224458962213;0.0003118159074802;-2.4481299988111e-05;-0.00021646320237778;3.4950506233145e-05;-0.00059895764570683;-0.0001037920374074;3.4914522984764e-05;1.296199116041e-05;-0.00039407378062606;-1.6329324353137e-05;7.3323040851392e-05;-8.4319071902428e-06;-0.00013719400158152;7.3398172389716e-05;0.00013887714885641;-3.1380484870169e-05;5.7885670685209e-05;-6.1875412939116e-05;0.00018509585061111;2.0505338397925e-05;7.1514359660796e-06;9.0209259724361e-06;0.00037860005977564;-3.5404962545726e-05;0.00021471911168192;-9.5646591944387e-06;-0.00014216883573681;-1.2159818652435e-05;-2.9395943784039e-05;5.4415919294115e-05;-0.00011240327148698;-0.00013117647904437;4.6105531509966e-05;-5.4230866226135e-05;6.3199790020008e-05;-0.00010548996215221;4.6962941269157e-05;-0.00015960296150297;-1.3238907285995e-06;-0.00051652727415785;6.0676061366394e-06;0.00022222359257285;1.5669747881475e-05;0.00032652606023476;-4.2832649342017e-05;8.4150895418134e-05;4.139802967984e-06;-0.00050953490426764;-7.4693009082694e-05;1.1947231541853e-05;1.3209039025242e-05;2.4209433831857e-05;1.5259025531122e-05;-0.00085140630835667;8.0510590123595e-06;6.5322594309691e-05;-0.00011296883167233;-5.6237549870275e-05;-4.0612354496261e-05;-0.00028496456798166;-0.00022071135754231;-0.00012540286115836;0.00026767677627504;0.00021869938063901;0.00033746036933735;1.3650807886734e-05;0.00060326128732413;2.5747283871169e-05;9.2248228611425e-07;8.7598156824242e-05;9.0494177129585e-05;6.5259468101431e-05;1.3662937817571e-05;4.2116185795749e-05;0.00017650447261985;-0.00011085210280726;-0.00026919570518658;0.00012969804811291;0.00018743393593468;3.2825893867994e-05;5.0303938223806e-06;-6.9459420046769e-05;-1.1507087037899e-05;-5.1107035687892e-06;0.00062301277648658;7.7650416642427e-05;0.00012802099809051;2.7350053642294e-05;-4.358612204669e-05;2.0814322851948e-05;-0.00012549274833873;-0.00013323918392416;0.00012505963968579;0.00036426179576665;1.7296995338256e-06;-0.00019061226339545;3.3124022593256e-05;-0.00052944576600567;-0.00012654144666158;2.6034731490654e-05;1.0211481821898e-05;-0.00038035624311306;-2.6662339223549e-05;6.4634150476195e-05;-1.1335705494275e-05;-0.00014614082465414;6.8229281168897e-05;0.00020313428831287;-1.6497033357155e-05;8.9644752733875e-05;-4.3022071622545e-05;0.00018666610412765;3.0946353945183e-05;6.1094674492779e-06;9.5973409770522e-06;0.0003537472221069;-2.2834023184259e-05;0.00022997219639365;8.6167428889894e-06;-0.00013218804087956;-1.3780908375338e-05;-3.3023214200512e-05;8.9374851086177e-05;-0.00011075831571361;-0.00018396219820715;3.5168792237528e-05;-6.6665772465058e-05;4.1349783714395e-05;-0.00013330500223674;2.4491237127222e-05;-0.00017529314209241;-1.41511172842e-05;-0.00050224299775437;-9.6075755209313e-06;0.00020930296159349;1.7120846678154e-05;0.0001964145922102;2.2676733351545e-05;0.00010949997522403;-4.5516695536207e-05;-0.00038611530908383;-5.9754391259048e-05;5.4797837947262e-06;1.5362706108135e-05;2.0630857761716e-05;9.4050474217511e-06;-0.00066877977224067;-1.2796544069715e-05;9.1166381025687e-05;-0.0001215645679622;-2.9699616789003e-05;-2.9250039006001e-05;-0.00020482792751864;-0.00016818246513139;-0.00010157804354094;0.00017159659182653;0.00018621710478328;0.00028669001767412;-8.9540781118558e-06;0.00043778639519587;6.2726117903367e-05;-2.3825205062167e-05;7.5659962021746e-05;7.569370791316e-05;7.1688860771246e-05;-1.6596608475083e-05;3.874641697621e-05;0.00021403052960522;-8.5540770669468e-05;-0.00023390754358843;0.00010414326243335;7.1710717747919e-05;1.4028768418939e-05;1.1432827704994e-05;-4.5372202293947e-05;-1.3754643077846e-05;-6.6797283579945e-06;0.00038267552736215;6.7827881139237e-05;0.00011598187120399;4.1748800867936e-05;-2.6733097911347e-05;1.9319462808198e-05;-0.00015546355280094;-0.00014832771557849;9.1945992608089e-05;0.00035598667454906;4.9210335419048e-05;-0.000116364499263;2.4736782506807e-05;-0.00032975073554553;-0.00011428586731199;9.3125163402874e-06;2.098928604255e-07;-0.00028219289379194;-3.6990139051341e-05;3.6807592550758e-05;-1.5746012650197e-05;-0.00012792050256394;4.0654249460204e-05;0.00023316132137552;1.8708693460212e-05;0.00012131701805629;6.4113910411834e-06;0.0001545997656649;4.2646046495065e-05;3.8581024455198e-06;8.4300700109452e-06;0.00026022628298961;6.2185808928916e-06;0.00020894648332614;4.2451261833776e-05;-9.2743102868553e-05;-1.2749186680594e-05;-1.5064778381202e-05;0.00012391863856465;-8.8966713519767e-05;-0.00021652941359207;-8.4263756434666e-06;-7.3764444096014e-05;1.573300551172e-06;-0.00014814174210187;-2.3241127564688e-05;-0.00016633489576634;-3.9124668546719e-05;-0.00038925587432459;-3.9100363210309e-05;0.00015135074499995;1.689121745585e-05;-3.5494164052352e-08;0.00012613469152711;0.00016531736764591;-0.00011527886090335;-0.00020870084699709;-3.5508124710759e-05;2.7291955575492e-06;1.4881936294842e-05;2.1500996808754e-05;-2.5429028482904e-06;-0.00037321136915125;-3.1542229407933e-05;0.00014553917571902;-0.00015389555483125;-2.3569809854962e-05;-1.3200104149291e-05;-0.00011925781291211;-9.5805218734313e-05;-6.2998544308357e-05;4.7880683268886e-05;0.000153742133989;0.00020855182083324;-5.1220216846559e-05;0.00016660499386489;0.00010970885341521;-4.851201447309e-05;7.1465030487161e-05;-4.6271302380774e-06;9.121275797952e-05;-2.3887692805147e-05;3.8524292904185e-05;0.00021117352298461;8.565280950279e-06;-0.00018492485105526;2.7951440642937e-05;-2.7725436666515e-05;-3.2836131140357e-05;1.1836029443657e-05;-1.7448634025641e-05;-1.6764566680649e-05;-1.3508356460079e-05;0.00018538824224379;2.117640178767e-05;0.00010706316243159;6.31743168924e-05;-1.285115445171e-06;2.5426270440221e-05;-0.00018487853230909;-0.0001779146696208;6.6855718614534e-05;0.000342490588082;0.00013443874195218;-4.7656067181379e-05;2.1863857909921e-05;-0.00016640982357785;-5.7786532124737e-05;-8.3142003859393e-06;-1.887478356366e-05;-0.00019304890884086;-5.2509389206534e-05;1.1146014458063e-06;-2.6632180379238e-05;-0.00011077539238613;-3.707097903316e-06;0.00022975425235927;8.7681124568917e-05;0.00017735752044246;9.2406480689533e-05;0.0001384098577546;6.2912651628722e-05;1.4026838925929e-06;8.5335404946818e-06;0.00020604774181265;5.3885094530415e-05;0.00020730050164275;0.00010483028017916;-5.7261535403086e-05;-1.168326343759e-05;3.9878934330773e-05;0.00017305684741586;-7.607967563672e-05;-0.00024720886722207;-0.000107597297756;-9.7088079201058e-05;-3.900883893948e-05;-0.0001791526156012;-0.00010398799349787;-0.00017859358922578;-8.9765650045592e-05;-0.00031092620338313;-9.4853647169657e-05;0.00010367728827987;2.0554949514917e-05;-0.00028402786119841;0.00035610361373983;0.00034990586573258;-0.00028140214271843;-0.00010020058834925;-2.1445610400406e-05;-2.9523505418183e-06;3.3222382626263e-05;3.2625524909236e-05;-2.2961430659052e-05;-0.00023152641369961;-7.139184162952e-05;0.00027158705051988;-0.00025945663219318;-1.763359796314e-05;3.7095410334587e-06;-6.8876237492077e-05;-3.9955099055078e-05;-4.7410689148819e-05;-0.00011950301995967;0.00020273459085729;0.00022522246581502;-0.00014501555415336;-5.0950064178323e-05;0.00022435962455347;-0.00010618199303281;9.1942398285028e-05;-6.842609582236e-05;0.00015100203745533;-5.5752105254214e-05;5.2654198952951e-05;0.00035247806226835;0.00013952249719296;-0.00024983944604173;-6.4813415519893e-05;-0.00019579341460485;-0.00012710290320683;3.0305127438623e-05;1.6101897927001e-05;-2.2630680177826e-05;-2.741148819041e-05;-1.3228321222414e-05;-3.5622753784992e-05;0.00016186045832001;0.00013250595657155;1.2655778846238e-05;3.9006048609735e-05;-0.00032600510166958;-0.00032947276486084;4.2984756873921e-05;0.00052866997430101;0.00032490779994987;3.66174717783e-05;5.3151943575358e-05;1.5677251496982e-07;-2.4742626010266e-06;-3.9786857087165e-05;-5.7000543165486e-05;-0.00019505977979861;-0.00011302858911222;-2.4406421289314e-05;-4.7247791371774e-05;-0.00015959581651259;-7.0604357460979e-05;0.00038826986565255;0.00024294639297295;0.00034615490585566;0.00027054859674536;0.00018456767429598;0.00013263155415189;7.1592023687117e-07;9.984210919356e-06;0.00022930750856176;0.00014201643352862;0.00029266384080984;0.00023684394545853;-4.9691883759806e-05;-2.1219848349574e-05;0.00016477992176078;0.00040519906906411;-9.04935222934e-05;-0.00049593299627304;-0.0003437552950345;-0.00019122241064906;-0.00015118683222681;-0.00031293826759793;-0.00026749272365123;-0.00026780931511894;-0.00020128386677243;-0.00035164205473848;-0.00021530941012315;0.00010229380131932;4.1254948882852e-05;-0.00050052802544087;0.00052305613644421;0.00050371396355331;-0.00039814342744648;-3.1052957638167e-05;2.9018123314017e-05;-9.7767115221359e-06;5.3827094234293e-05;4.2390336602693e-05;-4.2203329940094e-05;-0.00014786205429118;-6.2840445025358e-05;0.0003937822766602;-0.00035789486719295;-1.2873907508038e-05;1.7979771655519e-05;-3.7657780922018e-05;1.413681457052e-05;-3.0461929782177e-05;-0.00024644387303852;0.00022536962933373;0.00025591425946914;-0.00025708382599987;-0.00021933345124125;0.00028269694303162;-0.00015791828627698;0.00011034079216188;-0.00012360003893264;0.00020201470761094;-8.8069660705514e-05;6.9503686972894e-05;0.00044481243821792;0.00027508518542163;-0.00027852004859596;-0.000148888269905;-0.00029636488761753;-0.00019827330834232;4.2379189835628e-05;4.2635881982278e-05;-2.8396907509887e-05;-4.5560740545625e-05;-0.00011666797945509;-7.5391471909825e-05;0.00021600608306471;0.00019599238294177;2.2580949007533e-05;5.7319826737512e-05;-0.00044365925714374;-0.0004321058804635;4.920276478515e-05;0.00066112156491727;0.00048482074635103;7.283369632205e-05;5.6791745009832e-05;6.9081965193618e-05;3.1481868063565e-05;-6.2144397816155e-05;-9.0799454483204e-05;-0.0002204105257988;-0.00017196906264871;-4.2592339013936e-05;-7.0401772973128e-05;-0.00020627448975574;-0.00013510447752196;0.00052713887998834;0.00039575100527145;0.00048957613762468;0.0004379337769933;0.00023332869750448;0.00020243141625542;9.6262806437153e-07;1.1976831956417e-05;0.00026145466836169;0.00022967568656895;0.0003760625841096;0.00037333366344683;-4.7484551032539e-05;-2.9952845579828e-05;0.00027048395713791;0.00060006900457665;-0.00011433295003371;-0.00070448033511639;-0.00055320089450106;-0.0002681695332285;-0.00024699280038476;-0.00042716175084934;-0.00042717845644802;-0.00035533134359866;-0.0003161269123666;-0.00040848995558918;-0.00034143016091548;0.00010979535727529;6.173722067615e-05;-0.00053118850337341;0.00049784011207521;0.0005223720218055;-0.00039629422826692;2.7514715839061e-05;9.1721172793768e-05;-1.0710420610849e-05;5.6550274166511e-05;3.9362977986457e-05;-4.8730820708442e-05;-6.7458990088198e-05;1.1067696505052e-05;0.0004121481324546;-0.00036126861232333;-7.1113286139735e-06;2.6468000214663e-05;-7.1714398472977e-06;6.5310850914102e-05;-3.0652665827802e-06;-0.00029841859941371;0.00018430924683344;0.00022200102102943;-0.00030977654387243;-0.0002972011861857;0.00022416120918933;-0.00016906904056668;0.00010440372716403;-0.00014796045434196;0.00019544536189642;-9.2368049081415e-05;6.7116954596713e-05;0.00038313050754368;0.00034042875631712;-0.00022432552941609;-0.00020262582984287;-0.00028673096676357;-0.00020948270685039;3.3338816137984e-05;4.6947581722634e-05;-2.514552033972e-05;-5.1778348279186e-05;-0.00011439063382568;-6.5731677750591e-05;0.00020988422329538;0.00020303376368247;2.3927852453198e-05;6.1672209994867e-05;-0.00045348107232712;-0.00043860627920367;5.7727855164558e-05;0.000628016598057;0.00053821143228561;7.6774915214628e-05;4.5380500523606e-05;5.4753691074438e-05;3.4984885132872e-05;-5.7639485021355e-05;-9.3062939413358e-05;-0.00020450539886951;-0.00019195946515538;-4.4673957745545e-05;-7.4073839641642e-05;-0.00018475673277862;-0.00015659283963032;0.00049598579062149;0.00043647614074871;0.0004692331131082;0.00046986836241558;0.00022331513173413;0.00022334203822538;2.2087162960815e-06;1.1399828508729e-05;0.00023818467161618;0.00026489995070733;0.00035860421485268;0.00041600802796893;-4.1181123378919e-05;-3.7227502616588e-05;0.0002611099043861;0.000593961274717;-0.00012019557470921;-0.00066851440351456;-0.00057876389473677;-0.00025358761195093;-0.0002602597232908;-0.00040850538061932;-0.00046725373249501;-0.00034248689189553;-0.00034689201856963;-0.00037734623765573;-0.00039388256845996;9.9157310614828e-05;7.3691750003491e-05;-0.00038469579885714;0.00029955393983983;0.00040227707359008;-0.00029189337510616;6.9059817178641e-05;0.00014968335744925;-6.7767750806524e-06;4.1826453525573e-05;2.471460175002e-05;-4.1787159716478e-05;-2.9674299639737e-06;0.00013255457452033;0.00031962376669981;-0.00026651006191969;6.2472827266902e-07;2.8827123969677e-05;2.9577802706626e-05;0.00010302353621228;2.7888085242012e-05;-0.00027556158602238;9.1536217951216e-05;0.00013108877465129;-0.0002894411154557;-0.00026805745437741;6.8247929448262e-05;-0.00013865481014363;7.2569302574266e-05;-0.00013100489741191;0.00012970101670362;-6.9441004598048e-05;4.4413325667847e-05;0.00020235135161784;0.0003137118765153;-0.00010925335664069;-0.0002148887142539;-0.00019037861784454;-0.00015615680604242;7.5897678470938e-06;3.1173909519566e-05;-1.344641441392e-05;-4.2461964767426e-05;-4.2347950511612e-05;1.7045492768375e-06;0.00014634622493759;0.00015520123997703;1.6119020074257e-05;4.6190463763196e-05;-0.00035716625279747;-0.00035464836400934;5.7784072851064e-05;0.00044621818233281;0.00047641759738326;6.2548409914598e-05;2.310635682079e-05;-6.3815682551649e-06;-1.3175207413951e-07;-3.0434630389209e-05;-6.3269239035435e-05;-0.00014482329424936;-0.00017761766503099;-3.0728104320588e-05;-5.2328319725348e-05;-0.00010289074270986;-0.00013265061716083;0.00031708282767795;0.00035873390152119;0.00029761530458927;0.00036053740768693;0.00015556663856842;0.00019280798733234;3.9027077036735e-06;8.1982871051878e-06;0.00015651668945793;0.00024105369811878;0.00024200667394325;0.00035218836273998;-3.0890863854438e-05;-4.4553016778082e-05;0.00014855065091979;0.00040907293441705;-0.0001039198905346;-0.00041873354348354;-0.00042925553862005;-0.00015758317022119;-0.00019605753186624;-0.00026625546161085;-0.00037592902663164;-0.00023067060101312;-0.00028447789372876;-0.00025570378056727;-0.0003626634425018;6.9933201302774e-05;7.8467826824635e-05;-0.00021863667643629;8.6286156147253e-05;0.00025803226162679;-0.00018061583978124;8.4001476352569e-05;0.00022456122678705;-5.4811011978018e-06;3.2906107662711e-05;1.1138035006297e-05;-3.5431643482298e-05;2.2615766283707e-05;0.00027955733821727;0.00022727070609108;-0.00017029212904163;1.0255913366564e-05;3.1634925107937e-05;7.4317627877463e-05;0.00013512751320377;5.3255964303389e-05;-0.00023499930102844;-1.4702734915772e-05;6.1119033489376e-05;-0.00027865645824932;-0.00020199624123052;-0.00010387288057245;-0.00010870445839828;3.5159773688065e-05;-0.00010351039964007;5.7730827393243e-05;-5.1432041800581e-05;2.3361237253994e-05;4.2387011490064e-05;0.00026577411335893;4.2697042772488e-06;-0.00020669076184276;-8.6142863437999e-05;-6.9002409873065e-05;-1.7303209460806e-05;1.5210177480185e-05;-4.5825568122382e-06;-3.3127569622593e-05;2.8230246243766e-05;0.00011386271944502;8.7351545516867e-05;0.00011158084816998;9.320190656581e-06;2.6939762392431e-05;-0.00024960999144241;-0.00023607969342265;7.2502029070165e-05;0.00024712164304219;0.00038175986264832;3.2413881854154e-05;-2.8594735340448e-05;-7.2770926635712e-05;-8.3342602010816e-05;-5.0781718528015e-06;-3.0750554287806e-05;-9.1726207756437e-05;-0.00018220316269435;-1.684428389126e-05;-2.4874030714273e-05;-3.0117238566163e-05;-0.00011467248259578;0.00015943628386594;0.00028829259099439;0.00013819185551256;0.00024958496214822;9.4008981250226e-05;0.00016754619718995;5.711504854844e-06;5.3886510613665e-06;7.6024880399927e-05;0.00021907544578426;0.00013252678036224;0.00029026812990196;-2.1523628674913e-05;-5.5067510402296e-05;5.0139453378506e-05;0.0002400341181783;-9.2710077296942e-05;-0.00019416236318648;-0.00029393367003649;-6.7928202042822e-05;-0.00013269489863887;-0.0001314871624345;-0.00027718709316105;-0.00012785120634362;-0.00022664428979624;-0.00014127876784187;-0.0003422113659326;4.3427080527181e-05;8.9813038357534e-05;-0.00010480706259841;-8.2169630331919e-05;0.00016541713557672;-0.00013426897930913;9.4019313110039e-05;0.00031544477678835;-5.9563381000771e-06;3.3356318454025e-05;3.2108960112964e-06;-3.6084635212319e-05;1.798187076929e-05;0.00046111506526358;0.00018325667770114;-0.00011852455645567;2.0505633074208e-05;4.1157170926454e-05;0.00013783648319077;0.00017392553854734;7.4216681241523e-05;-0.00023664643231314;-0.00010093794844579;2.8225484129507e-05;-0.00030733380117454;-0.00014795926108491;-0.00025459381868131;-0.00010245721932733;6.3359161686094e-06;-8.8254950242117e-05;1.3078343954476e-06;-4.5762881200062e-05;8.4446983237285e-06;-4.9963073252002e-05;0.00023377723118756;7.968216232257e-05;-0.00021239087800495;-2.4566712454543e-05;2.3367529138341e-05;-4.0318518585991e-05;2.8621404908336e-06;-7.2567769393572e-07;-2.6927837097901e-05;7.232757343445e-05;0.00028620826196857;5.3572621254716e-05;9.4816306955181e-05;6.3890706769598e-06;4.2233659769408e-06;-0.00019631259783637;-0.00016424932982773;0.00010209863103228;0.0001287857448915;0.00034255086211488;1.3676006346941e-05;-9.4818300567567e-05;-0.00011949884356;-0.0002214883279521;1.351646551484e-05;-4.6692795763192e-07;-6.3991283241194e-05;-0.00024250186106656;-8.0034424172482e-06;8.3696068031713e-06;1.9447286831564e-05;-0.00011632050882326;7.0679379859939e-05;0.0002701093617361;3.4591419534991e-05;0.00017383840167895;6.2506995163858e-05;0.00017645281332079;8.5584979387932e-06;3.684618150146e-06;2.2876425646245e-05;0.0002272289711982;6.7299981310498e-05;0.00027283580857329;-1.9608502043411e-05;-7.9097444540821e-05;-1.93839896383e-05;0.00014683867630083;-0.00010298561392119;-5.6064498494379e-05;-0.00022690431796946;-8.5998608483351e-06;-9.5073293778114e-05;-4.6905453928048e-05;-0.00020738098828588;-6.6814063757192e-05;-0.0002083922008751;-7.4137016781606e-05;-0.00038486663834192;3.1230785680236e-05;0.00012435497774277;1.2519733900263e-05;-0.00026348620303907;7.142255344661e-05;-0.00015076089766808;9.2200534709264e-05;0.00040463800542057;-5.5185173550854e-06;4.5962708099978e-05;-1.1909313570868e-06;-4.225631346344e-05;-2.6218522179988e-05;0.00070891511859372;0.00016015439177863;-9.154111467069e-05;3.3499018172733e-05;5.7597622799221e-05;0.00024437857791781;0.00021232468134258;8.203083416447e-05;-0.00026590621564537;-0.00018091323727276;2.6294350391254e-05;-0.00034797668922693;-6.7790897446685e-05;-0.00037973644793965;-0.00011315172741888;-2.6662339223549e-05;-7.3593844717834e-05;-6.5097905462608e-05;-4.7722114686621e-05;-2.4142614165612e-06;-8.1162332207896e-05;0.00015355521463789;0.00012566834629979;-0.00018763406842481;9.1916108431178e-06;0.00017319315520581;-6.7302607931197e-05;-1.4326759810501e-05;-3.7010322557762e-06;-1.7795833628043e-05;8.3478713349905e-05;0.00061332440236583;2.4964801923488e-05;8.6683074187022e-05;9.0850362539641e-06;-3.9229016692843e-05;-0.00016412403783761;-8.7732172687538e-05;0.00015931132656988;4.6576886234106e-05;0.00029677918064408;-6.0218749240448e-06;-0.00020860446966253;-0.00013636564835906;-0.00049628783017397;3.1673462217441e-05;5.1158927817596e-05;-4.101579907001e-05;-0.00038055345066823;-2.889303232223e-06;7.0102098106872e-05;6.1098959122319e-05;-0.00012017643166473;1.6206397049245e-05;0.0002674060233403;-5.360362411011e-05;5.3023522923468e-05;4.6821016439935e-05;0.00020694073464256;1.4521957382385e-05;4.7411421633115e-07;-2.1858963009436e-05;0.00022094904852565;2.278348983964e-05;0.00025550698046573;-2.3793096261215e-05;-0.00011799603089457;-9.8625168902799e-05;6.4566440414637e-05;-0.00013638671953231;6.2376282585319e-05;-0.00016080528439488;4.5337663323153e-05;-4.0527815144742e-05;1.5602257917635e-05;-7.2418813942932e-05;-2.2689899196848e-05;-0.00020090345060453;-2.7138032237417e-05;-0.00047061982331797;2.5835981432465e-05;0.00018809229368344;6.1852217186242e-05;-0.00028116689645685;9.4180340965977e-06;-0.00015528884250671;6.0935621149838e-05;0.00034945720108226;-9.5833920568111e-06;4.9721875257092e-05;-2.4871990262909e-06;-3.2682477467461e-05;-5.1773073209915e-05;0.00070009881164879;0.00010426059452584;-5.2957471780246e-05;3.2135671062861e-05;3.506412031129e-05;0.00024487602058798;0.00016671553021297;6.0899885284016e-05;-0.00022184172121342;-0.00015079784498084;3.6721572541865e-05;-0.00028943846700713;-8.3265052808201e-07;-0.00035778249730356;-8.7914682808332e-05;-3.3057109249057e-05;-4.1813011193881e-05;-0.00012146473454777;-3.6842542613158e-05;1.556750612508e-05;-6.6233027609996e-05;7.8476965427399e-05;0.00011181223817402;-0.00012858795525972;1.4534339243255e-05;0.0002008311857935;-6.1122525949031e-05;-1.0488959560462e-05;-6.4089263105416e-06;-6.5638782871247e-06;6.218582711881e-05;0.00062947382684797;8.8627248260309e-06;6.3958133978304e-05;8.6391064542113e-06;-6.7687025875784e-05;-0.00011609115608735;-2.9710196031374e-05;0.00014381059736479;4.9371979002899e-06;0.00020494373166002;-9.9485469036154e-06;-0.00021714837930631;-0.00010502285294933;-0.00051225972129032;3.066347562708e-05;6.8353430833668e-05;-2.3129950932343e-05;-0.00037298898678273;-2.5417347160328e-07;0.00010216346709058;6.0055848734919e-05;-9.033960668603e-05;-1.1764774399126e-07;0.00021947124332655;-7.013571303105e-05;-4.5250319089973e-05;3.6606586945709e-05;0.00016365879855584;1.3101372132951e-05;-9.9681449228228e-07;-3.3109517971752e-05;0.00012888696801383;3.0247881568357e-06;0.00016299700655509;-2.2053718566895e-05;-0.00010775608825497;-0.00011306210944895;3.1856448913459e-05;-0.0001190360635519;9.0926245320588e-05;-0.00010914981976384;4.0187362174038e-05;8.3005079432041e-06;3.0085817343206e-05;4.6033146645641e-05;-1.468719915465e-06;-0.0001338764996035;-4.1972771214205e-06;-0.00037565646925941;1.8410346456221e-05;0.00017260388995055;0.00033324246760458;-6.8350505898707e-05;9.2256370407995e-05;2.596298509161e-05;-0.00050755904521793;-4.85094205942e-05;-4.8546398829785e-06;3.0636958399555e-05;9.9542976386147e-06;1.755369885359e-05;-0.00094454584177583;3.0150382372085e-05;1.7290500181844e-05;-5.6138553190976e-05;9.38759148994e-06;-3.9025890146149e-05;-0.00025591242592782;-0.00017865853442345;-0.00011865517444676;0.00020431690791156;0.0001888950355351;0.00033733784221113;-9.179509106616e-06;0.00068221287801862;-1.8506076230551e-05;-1.4068430573388e-05;5.6008462706814e-05;0.00023037007485982;2.7657639293466e-05;-5.8782257838175e-05;2.9512235414586e-05;0.00020300557662267;-0.00014296137669589;-0.00023605796741322;0.00014675407146569;0.00014313995779958;3.8005546230124e-05;2.5826100682025e-05;-5.5489774240414e-05;-1.7031112520272e-06;-3.0694266115461e-06;0.0004595221253112;9.4763010565657e-05;0.00012216354662087;2.4425087758573e-05;-7.2413829911966e-05;8.8138776845881e-06;-0.00012158845493104;-0.00010051289427793;8.4395644080359e-05;0.0003125112853013;-1.611531843082e-05;-0.0001591365726199;3.3007516321959e-05;-0.000406225444749;-0.00014062844275031;2.0206927729305e-05;1.3960286196379e-05;-0.00033493104274385;-2.7917139959754e-05;9.0328700025566e-05;-2.0784655134776e-06;-0.0001272037770832;6.2817576690577e-05;0.00026336338487454;-1.8535891285865e-05;2.408676482446e-05;-4.3879161239602e-05;0.00012589199468493;3.8918249629205e-05;6.809243132011e-06;3.7274019177858e-06;0.00019841903122142;-2.8307820684859e-05;0.00013725747703575;-5.4430565796793e-06;-0.00010716867836891;-1.673702718108e-05;-5.4588581406279e-05;0.00013114957255311;-7.9227829701267e-05;-0.00022922256903257;4.9147674872074e-05;-2.9159236873966e-05;-1.6486823369632e-05;-6.1889142671134e-05;2.987934385601e-05;-9.7256946901325e-05;1.9105436876998e-06;-0.00033752003218979;3.8015386962797e-06;0.00016093309386633;1.4513673704641e-05;0.00032087482395582;-3.9315069443546e-05;0.00010092055163113;-3.7802999486303e-06;-0.00053214118815958;-5.9950561990263e-05;-4.2665114960982e-06;3.3411790354876e-05;1.2061504094163e-05;1.7220480003743e-05;-0.00098352879285812;1.1539019396878e-05;3.2273463148158e-05;-7.4043528002221e-05;1.1968505532423e-05;-3.873830428347e-05;-0.00025059009203687;-0.000193914223928;-0.00013084076636005;0.00020546333689708;0.00020561288692988;0.00036615430144593;-6.8969261519669e-06;0.00070879579288885;1.3713258340431e-05;-2.4216360543505e-05;6.0417791246437e-05;0.00023635089746676;3.9851151086623e-05;-6.7061831941828e-05;3.2654887036188e-05;0.00027595818392001;-0.00017138999828603;-0.00027814012719318;0.00016969112039078;8.928569877753e-05;4.1651826904854e-05;3.0499802960549e-05;-5.3990865126252e-05;-5.0001735871774e-06;-1.58679767992e-06;0.00039677246240899;0.00011464501585579;0.00013303628657013;3.6567067581927e-05;-6.8051653215662e-05;7.5056523201056e-06;-0.00015885356697254;-0.00013566545385402;7.9148361692205e-05;0.00038118130760267;-6.0097431742179e-07;-0.00013551115989685;3.5803946957458e-05;-0.00034759941627271;-0.00016909214900807;1.3755204236077e-05;1.2058645552315e-05;-0.00033293344313279;-3.8804380892543e-05;8.2888946053572e-05;-3.2293512504111e-06;-0.00014433077012654;6.3685372879263e-05;0.0003200896026101;-1.214879375766e-05;6.6416876506992e-05;-3.3952725061681e-05;0.00013755040708929;4.5712564315181e-05;7.0630376285408e-06;3.9597880459041e-06;0.00021134399867151;-2.2687843738822e-05;0.00016613933257759;3.5181119528715e-06;-0.00010813333938131;-1.8095235645887e-05;-5.1535451348173e-05;0.00016583473188803;-8.1095065979753e-05;-0.00028353001107462;3.8698777643731e-05;-5.0152557378169e-05;-2.8962851502001e-05;-0.00010795269918162;1.9990246073576e-05;-0.00011955224181293;-5.593872629106e-06;-0.00035663138260134;-4.8054616854643e-06;0.00016241178673226;1.6745698303566e-05;0.00024095032131299;2.0517909433693e-06;9.827969915932e-05;-3.6358684155857e-05;-0.00045226764632389;-5.7741581258597e-05;-5.571117526415e-06;3.1558556656819e-05;1.1096431990154e-05;1.3321095138963e-05;-0.00084392138523981;-9.4738043117104e-06;4.0867154893931e-05;-7.725218165433e-05;1.8732082025963e-05;-3.0586183129344e-05;-0.00019460360636003;-0.0001680124696577;-0.00011671966058202;0.00015778132365085;0.00018300344527233;0.00032663394813426;-8.138878911268e-06;0.0006009676726535;4.4265911128605e-05;-3.2331441616407e-05;5.1798411732307e-05;0.00020954478532076;4.3802578147734e-05;-7.0968635554891e-05;2.9292061299202e-05;0.00030386971775442;-0.00016734265955165;-0.00026570819318295;0.00016055823653005;1.0543412827246e-05;3.5955741623184e-05;3.098323213635e-05;-4.0075348806567e-05;-7.0139212766662e-06;-1.7040810007529e-07;0.00024142989423126;0.00011334931332385;0.00011963227007072;4.370191891212e-05;-5.2078437875025e-05;4.3233080759819e-06;-0.00017096700321417;-0.00014542179997079;5.6307650083909e-05;0.00037842025631107;1.8949336663354e-05;-8.2069294876419e-05;3.0789098673267e-05;-0.00021048428607173;-0.00016646125004627;3.8427169783972e-06;7.1549197855347e-06;-0.00026433414313942;-4.4170228647999e-05;6.030222721165e-05;-3.8162716009538e-06;-0.00013483241491485;5.1007686124649e-05;0.00033112318487838;-5.6948447735294e-08;9.3069866125006e-05;-1.2933727703057e-05;0.00011982892465312;4.7556157369399e-05;5.8888576859317e-06;3.1986019166652e-06;0.00016753700037953;-1.0826159268618e-05;0.00015871132200118;1.4664065929537e-05;-8.5673047578894e-05;-1.6847683582455e-05;-3.854047099594e-05;0.00018077029380947;-6.6668071667664e-05;-0.00029919343069196;1.7456224668422e-05;-5.8959649322787e-05;-4.5323518861551e-05;-0.00012698059435934;2.2134297523735e-06;-0.00011658289440675;-1.4059354725759e-05;-0.00029555763467215;-1.495331798651e-05;0.00012872046499979;1.6242818674073e-05;-0.00051627069478855;0.00055909919319674;0.00047026175889187;-0.00040463809273206;-1.8870779967983e-05;-4.940446888213e-05;-1.3591585229733e-05;5.0173013733001e-05;3.9888593164505e-05;-3.6478082620306e-05;-0.00012448549387045;-0.00014162779552862;0.0002971418434754;-0.00028534579905681;-1.0545172699494e-05;1.4343840121001e-05;-2.8839278456871e-05;-6.9672810241173e-06;-4.0116134186974e-05;-0.00024539200239815;0.00025282936985604;0.00022042389900889;-0.0001753658434609;-0.00016917442553677;0.00032179223489948;-0.00012212060391903;8.7211061327253e-05;-6.9775596784893e-05;0.00016301484720316;-7.0023619628046e-05;5.2853112720186e-05;0.00047644370351918;0.00021113154070918;-0.00032810983248055;-0.00012785354920197;-0.00033743647509255;-0.00020572189532686;5.7469897001283e-05;4.945469845552e-05;-2.0148452676949e-05;-2.683147067728e-05;-0.00021583467605524;-0.00010811186803039;0.00019395147683099;0.00017358132754453;8.154069291777e-06;3.0418488677242e-05;-0.00038584900903516;-0.00042042226414196;-2.1772946638521e-05;0.00063706754008308;0.00041566565050744;0.00012557636364363;0.00010666426533135;0.00019429305393714;7.8105520515237e-05;-6.9352267018985e-05;-8.4306513599586e-05;-0.00018882310541812;-0.00014872719475534;-2.5701245249365e-05;-4.297481791582e-05;-0.00020405548275448;-0.00011456292122602;0.00051398895448074;0.00033883735886775;0.0004630405746866;0.00038253955426626;0.00020008186402265;0.00016621070972178;-7.1838229587229e-07;7.9953497333918e-06;0.00022042103228159;0.00016823729674798;0.00030985486228019;0.00027499088901095;-4.6284112613648e-05;-2.7961756131845e-05;0.00030702704680152;0.00064156320877373;-7.4603492976166e-05;-0.00074754760134965;-0.00055683549726382;-0.00027543015312403;-0.00025507534155622;-0.00038596455124207;-0.00034096548915841;-0.00029525757418014;-0.00024042134464253;-0.0003353871870786;-0.00024495366960764;9.8900854936801e-05;5.2335031796247e-05;-0.00077633769251406;0.00078795204171911;0.00066383025841787;-0.0005551531794481;3.2477117201779e-05;-2.0587078324752e-05;-2.3931226678542e-05;7.3831033660099e-05;5.4806379921502e-05;-5.6700766435824e-05;-7.2848757554311e-05;-0.00015714508481324;0.00042780861258507;-0.00039808012661524;-1.1589388122957e-05;2.5266363081755e-05;-1.552206595079e-05;3.096896034549e-05;-3.1926960218698e-05;-0.00037788355257362;0.00031424636836164;0.00027642381610349;-0.00028697596280836;-0.00032646866748109;0.00041024573147297;-0.00017346785170957;0.00011452518083388;-0.00012070126831532;0.00021880127314944;-0.00010097247286467;7.5108953751624e-05;0.00061108317459002;0.00036656932206824;-0.0003979520406574;-0.00022618059301749;-0.00045448081800714;-0.0003030858351849;7.8959958045743e-05;8.1962913100142e-05;-2.6737578082248e-05;-4.3661861127475e-05;-0.00031496162409894;-0.0001791712566046;0.00026971512124874;0.00024980152375065;1.4688608644065e-05;4.5539421989815e-05;-0.00052369310287759;-0.00055405404418707;-2.7715135729522e-05;0.00081989530008286;0.00059764011530206;0.00016928050899878;0.00013254798250273;0.00026487451395951;0.00014262582408264;-0.00010044132068288;-0.00012637709733099;-0.00024606671649963;-0.00021710214787163;-4.0642833482707e-05;-6.2860250181984e-05;-0.00027930710348301;-0.00018562869809102;0.00070466758916155;0.00051921006524935;0.00065465964144096;0.00057646085042506;0.00027134618721902;0.00024345648125745;-1.6354767922167e-06;1.1113303116872e-05;0.00028480027685873;0.00025458898744546;0.00041864786180668;0.00041431136196479;-5.3528365242528e-05;-3.9811206079321e-05;0.00046232808381319;0.00092217279598117;-0.00010054811718874;-0.0010538409696892;-0.00083701399853453;-0.00038991318433546;-0.00037617972702719;-0.00053296383703128;-0.00051510141929612;-0.00040852726669982;-0.00036067902692594;-0.00043377766269259;-0.00036948747583665;0.00012382182467263;7.6358308433555e-05;-0.00078849116107449;0.00074415857670829;0.00067690573632717;-0.00054266984807327;8.9050801761914e-05;4.4516928028315e-05;-2.6046138373204e-05;7.2720526077319e-05;5.1607214118121e-05;-6.0716109146597e-05;8.0006193456938e-06;-6.5480649936944e-05;0.00043679808732122;-0.00039317511254922;-9.3812677732785e-06;2.901305379055e-05;5.6169960771513e-06;7.7538999903481e-05;-2.0594461602741e-06;-0.00041957802022807;0.00027642454369925;0.00023779310868122;-0.00033531614462845;-0.00040149097912945;0.00032984142308123;-0.00017711774853524;0.00011147075565532;-0.00014597976405639;0.00019940752827097;-9.8897347925231e-05;7.5534808274824e-05;0.00051593733951449;0.00044514969340526;-0.00032684186589904;-0.00029112739139237;-0.00042266343371011;-0.00032359102624469;6.7324108385947e-05;8.5506762843579e-05;-2.2585400074604e-05;-4.8186389904004e-05;-0.00027396911173128;-0.00018504234321881;0.00026074500055984;0.00025082979118451;1.4629041288572e-05;4.5984033931745e-05;-0.00052642333321273;-0.0005581135628745;-2.043981476163e-05;0.00076977635035291;0.00065434881253168;0.00016685386071913;0.00012781871191692;0.00021554352133535;0.00016560764925089;-9.2299531388562e-05;-0.00012566904479172;-0.00023475018679164;-0.00023226677149069;-4.066697874805e-05;-6.1418497352861e-05;-0.00025141099467874;-0.00020249202498235;0.00065195886418223;0.00055789889302105;0.00061849813209847;0.00059212202904746;0.00026020518271253;0.00025666499277577;-1.2614871138794e-06;1.1445228665252e-05;0.00026362246717326;0.00027858160319738;0.00039481584099121;0.00044458612683229;-4.860503031523e-05;-4.8076992243296e-05;0.00043864053441212;0.00089855620171875;-0.00010525691322982;-0.00098792801145464;-0.00085102260345593;-0.00037142279325053;-0.00037728127790615;-0.00050070753786713;-0.00054396543418989;-0.00038912548916414;-0.00037880754098296;-0.00040379405254498;-0.00040848905337043;0.0001149141244241;8.7137013906613e-05;-0.0005456855869852;0.00044928063289262;0.00051073462236673;-0.00039051522617228;0.00011418507347116;0.00012372764467727;-1.9933846488129e-05;4.9493100959808e-05;3.2504711271031e-05;-4.718238778878e-05;5.2583884098567e-05;0.00010921185457846;0.00032652736990713;-0.00027957878774032;-3.0771084311709e-06;2.3421665900969e-05;3.1734947697259e-05;0.00010911635763478;3.3370470191585e-05;-0.00035836503957398;0.00016326662444044;0.00013612677867059;-0.00030714765307494;-0.0003424579044804;0.00011290689872112;-0.00013677011884283;8.1358979514334e-05;-0.00012842804426327;0.0001117734645959;-6.8784604081884e-05;5.6601234973641e-05;0.00025566614931449;0.00040659771184437;-0.00015965291822795;-0.00029366739909165;-0.00027093291282654;-0.00025586088304408;2.7851523555e-05;5.8453497331357e-05;-1.005641570373e-05;-3.7842459278181e-05;-0.00011783535592258;-0.00010384780034656;0.00017758173635229;0.00018211286806036;6.9935131250531e-06;2.8697089874186e-05;-0.00041255311225541;-0.00045099793351255;-2.360638745813e-06;0.00053893454605713;0.00057866715360433;0.00012704862456303;9.4418195658363e-05;7.3863469879143e-05;0.00011891317990376;-4.8686521040509e-05;-8.1473779573571e-05;-0.00016783975297585;-0.00020081175898667;-2.5328370611533e-05;-3.605123856687e-05;-0.00013796362327412;-0.00015855825040489;0.00040228717261925;0.00044619501568377;0.00037866973434575;0.00042506965110078;0.00017854718316812;0.00020704510097858;4.9949960612139e-07;9.2091413534945e-06;0.00017024044063874;0.00023563536524307;0.00025880464818329;0.00035873014712706;-3.7049740058137e-05;-5.365263132262e-05;0.00024193874560297;0.00059826811775565;-9.1414563939907e-05;-0.00059704773593694;-0.00060083414427936;-0.00023425545077771;-0.00026343445642851;-0.00031439249869436;-0.00041860845522024;-0.00025274694780819;-0.0002911418559961;-0.00026991742197424;-0.00035647669574246;8.0461795732845e-05;8.589263597969e-05;-0.0003111868572887;0.00017010536976159;0.00032298930454999;-0.00023368625261355;0.00011016504140571;0.00021803649724461;-1.9299364794279e-05;3.5729703085963e-05;1.5310070011765e-05;-3.4498756576795e-05;6.3674975535832e-05;0.00029554680804722;0.00021570331591647;-0.00016484077787027;5.8334699133411e-06;1.4782664948143e-05;6.3638675783295e-05;0.00013280090934131;6.1807884776499e-05;-0.00027745775878429;3.9228307286976e-05;6.1745013226755e-05;-0.0002920450642705;-0.00024859653785825;-0.0001124167101807;-9.5346716989297e-05;4.5712709834334e-05;-9.6338546427432e-05;1.4172410374158e-05;-4.5855238568038e-05;4.4585420255316e-05;3.5580836993176e-05;0.00035663682501763;-2.3390987280436e-06;-0.00027448293985799;-0.00011923698912142;-0.0001607195881661;-3.1481224596064e-06;3.9415303035639e-05;-1.0472767826286e-06;-2.8083670258638e-05;1.1728233403119e-05;-5.584043719864e-06;0.00010672895587049;0.00012469102512114;3.3624712614255e-07;7.2153397923103e-06;-0.00028235983336344;-0.00029590915073641;2.2371345039573e-05;0.00028606239357032;0.00045678266906179;7.1597467467654e-05;3.2366922823712e-05;-5.3246607421897e-05;4.3763044232037e-05;-1.473351221648e-05;-4.2652278352762e-05;-0.00010931050928775;-0.00018583411292639;-1.0803538316395e-05;-5.785331268271e-06;-4.7127701691352e-05;-0.00013010481779929;0.00019915647862945;0.0003620792995207;0.00018011295469478;0.00027978082653135;0.00010751906665973;0.00016193106421269;1.4175576552589e-06;7.3359747148061e-06;8.099806291284e-05;0.00019074247393291;0.00013535541074816;0.00027516891714185;-2.5031546101673e-05;-5.8681856899057e-05;9.7676311270334e-05;0.00036292069125921;-7.6136078860145e-05;-0.0002868963056244;-0.00041299755685031;-0.00012536329450086;-0.0001680340646999;-0.00015238352352753;-0.00029985856963322;-0.00013397845032159;-0.00021134015696589;-0.00014384536189027;-0.00030520925065503;4.840170731768e-05;8.639174484415e-05;-0.0001748678041622;-1.7665512132226e-05;0.00021865249436814;-0.00015946847270243;0.00010834553540917;0.00032661663135514;-2.3711505491519e-05;3.3967462513829e-05;5.3436087910086e-06;-2.978361226269e-05;5.6521912483731e-05;0.00050073012243956;0.0001609815080883;-0.00010209756146651;1.4748439753021e-05;8.5136389316176e-06;0.000106467945443;0.000164602388395;8.7899650679901e-05;-0.00025448336964473;-4.7385616198881e-05;2.9218093914096e-05;-0.00032720467424951;-0.00018796189397108;-0.00030620957841165;-7.8761513577774e-05;2.419948032184e-05;-7.778978033457e-05;-6.80050579831e-05;-3.720212407643e-05;4.5789151045028e-05;-9.9735196272377e-05;0.00035380417830311;0.00010217739327345;-0.00028733597719111;-3.1303909054259e-05;-9.1844973212574e-05;-2.5119607016677e-05;3.2954096241156e-05;3.6580336200132e-06;-2.2657561203232e-05;9.5568371762056e-05;0.00010098278289661;7.2427130362485e-05;0.00010501897486392;-4.2113360905205e-06;-1.599159440957e-05;-0.00022447829542216;-0.00021291730809025;4.6622946683783e-05;0.0001429570838809;0.00041658215923235;4.1058079659706e-05;-2.3456870621885e-05;-0.00014224697952159;-4.0654358599568e-05;6.175006092235e-06;-1.742442145769e-05;-8.4296334534883e-05;-0.00022097681357991;-1.2849686754635e-06;2.5950273993658e-05;8.3925478975289e-06;-0.00013143649266567;9.2801601567771e-05;0.00036005905712955;6.7528861109167e-05;0.0002050302864518;7.4977571784984e-05;0.00015405641170219;2.1831854155607e-06;7.1742288128007e-06;2.7113734176964e-05;0.00018056688713841;6.6989072365686e-05;0.00024694757303223;-2.1440262571559e-05;-7.5016294431407e-05;1.3271891475597e-05;0.00026010858709924;-7.7600532677025e-05;-0.00011912877380382;-0.00034825023612939;-7.1345617470797e-05;-0.00012236063776072;-6.0453159676399e-05;-0.00024285020481329;-6.8980647483841e-05;-0.00017951114568859;-7.4620300438255e-05;-0.00031340276473202;3.3763441024348e-05;0.00010543211101322;-3.9909995393828e-05;-0.00013982661766931;9.351870539831e-05;-0.00011417731730035;7.5249794463161e-05;0.00030896419775672;-1.4209093023965e-05;2.8630245651584e-05;4.6023650668303e-08;-2.6327961677453e-05;3.8903781387489e-06;0.00051313318544999;0.00011380450450815;-6.5247899328824e-05;2.0798783225473e-05;2.4174003556254e-05;0.00014827237464488;0.00014819485659245;7.1675996878184e-05;-0.00020111637422815;-9.8605116363615e-05;2.0856265109614e-05;-0.00027135727577843;-8.1806159869302e-05;-0.00030841957777739;-7.180760439951e-05;-2.7357734779798e-06;-5.3257026593201e-05;-6.894554826431e-05;-3.1467647204408e-05;1.8007667677011e-05;-8.3194638136774e-05;0.00019111174333375;9.8337230156176e-05;-0.00019014735880774;-4.1340518919242e-07;5.0975522754015e-05;-4.0149887354346e-05;1.014979716274e-05;-4.466491887456e-08;-1.3481065252563e-05;7.6595686550718e-05;0.00030751086887904;3.2700394513085e-05;7.5121221016161e-05;2.0827494608966e-06;-3.1694227800472e-05;-0.00014013922191225;-0.00010805737838382;8.2148144429084e-05;5.4669293604093e-05;0.00027355251950212;1.5858875485719e-05;-0.00010473005386302;-0.00011447852739366;-0.00023298129963223;1.7089643733925e-05;1.6645493815304e-05;-4.4741133024218e-05;-0.00025005196221173;-5.1304385806361e-07;5.0268681661692e-05;3.2929376175161e-05;-9.6814146672841e-05;3.0853156204103e-05;0.00023400355712511;-8.3368995547062e-06;8.7452273874078e-05;4.2596391722327e-05;0.00013999489601701;6.0692532315443e-06;3.424772330618e-06;-5.0316598390054e-06;0.00016266494640149;2.5893850761349e-05;0.0001876362512121;-1.6817144569359e-05;-8.2063015724998e-05;-4.1565461287973e-05;0.00011275779979769;-8.2708946138155e-05;-4.8248252824123e-06;-0.0001829896500567;-2.2344306671584e-06;-5.9125191910425e-05;-5.7884481066139e-06;-0.00011555432865862;-2.7265703465673e-05;-0.00013851349649485;-3.0497953048325e-05;-0.00030939187854528;2.1247793483781e-05;0.00012199886259623;1.1887822438439e-05;-0.00016619349480607;3.6647725210059e-05;-9.6764466434252e-05;5.1797916967189e-05;0.0002666266518645;-1.1609470675467e-05;2.6802310458152e-05;-1.6321249631801e-06;-2.1099687728565e-05;-1.8886870748247e-05;0.00047633884241804;7.8837263572495e-05;-4.079244172317e-05;2.0712643163279e-05;2.0813116861973e-05;0.00014991426724009;0.00012049527140334;5.5717518989695e-05;-0.00016085745301098;-9.6780306193978e-05;2.1227286197245e-05;-0.00022119494678918;-2.8521870262921e-05;-0.0002788775600493;-5.8644938690122e-05;-1.1936120245082e-05;-3.4254568163306e-05;-7.8591423516627e-05;-2.5166178602376e-05;1.398529184371e-05;-6.5310472564306e-05;0.00011117631220259;8.4492487076204e-05;-0.00013332838716451;7.9678420661367e-06;9.4820949016139e-05;-3.9593738620169e-05;3.981165264122e-06;-1.9611643438111e-06;-7.1475060394732e-06;5.8124955103267e-05;0.0003487610083539;1.5661260476918e-05;5.567670086748e-05;3.7586339658446e-06;-4.0988434193423e-05;-9.4902934506536e-05;-5.6625474826433e-05;8.2465143350419e-05;1.7597449186724e-05;0.00019022115156986;6.913578545209e-06;-0.0001224895240739;-8.8306485849898e-05;-0.00027542587486096;1.8270198779646e-05;2.9412496587611e-05;-2.620622763061e-05;-0.00023881324159447;2.0403066969266e-07;6.1594124417752e-05;3.6316705518402e-05;-7.2859591455199e-05;9.3083981482778e-06;0.00017016062338371;-3.1136583857005e-05;2.3676075215917e-05;2.871196011256e-05;0.00011533006909303;6.3635898186476e-06;1.741793880683e-06;-1.5903729945421e-05;0.000122394922073;8.6802847363288e-06;0.00013416902220342;-1.3993204447615e-05;-7.5434814789332e-05;-5.5984008213272e-05;5.7676774304127e-05;-7.4085117375944e-05;3.1480092729907e-05;-0.00011248062219238;1.4648170690634e-05;-2.5141229343717e-05;1.2133380550949e-05;-4.0939488826552e-05;-9.4420038294629e-06;-0.00010057666077046;-1.1223289220652e-05;-0.00026224253815599;1.4610618563893e-05;0.00011404038377805;0.00018374787759967;1.1021325008187e-05;7.2147202445194e-05;-4.0388789784629e-05;-0.00037063047057018;-4.4547730794875e-05;-1.0641644621501e-05;3.1612766179023e-05;4.9320574362355e-06;1.1041365723941e-05;-0.00070962100289762;-1.4897713299433e-05;1.4440121958614e-05;-4.815001739189e-05;3.7586349208141e-05;-2.2394187908503e-05;-0.00013203937851358;-0.00012956387945451;-9.6508709248155e-05;0.00010831510007847;0.00013875772128813;0.00027138230507262;-7.0462947405758e-06;0.00052141182823107;4.2189458326902e-05;-3.1621981179342e-05;2.9496573915822e-05;0.00021489690698218;2.6856274416787e-05;-8.1210440839641e-05;1.9426979633863e-05;0.00030515337130055;-0.00017311373085249;-0.00023151013010647;0.00015499314758927;-5.4316627938533e-05;3.8864200178068e-05;3.2446419936605e-05;-2.4841159756761e-05;-4.8563238124189e-06;3.5649818528327e-06;6.8827925133519e-05;0.00011477892985567;9.3233240477275e-05;4.1233644878957e-05;-4.2927353206323e-05;-4.2241413211741e-06;-0.00015451772196684;-0.0001241445861524;2.3109769244911e-05;0.00032503416878171;1.0755596122181e-05;-2.86261401925e-05;2.3588954718434e-05;-5.9464935475262e-05;-0.00016230854089372;-4.0172312765208e-06;6.4805403781065e-06;-0.00017744344950188;-4.294886457501e-05;4.5782981032971e-05;1.4130661156742e-06;-0.00011394439206924;4.239678310114e-05;0.00032670371001586;-3.1656629744248e-06;8.3668637671508e-05;-9.5468540166621e-06;7.8860102803446e-05;4.3443731556181e-05;5.3164003475104e-06;1.6572535344039e-07;8.507428719895e-05;-1.1451314094302e-05;0.0001123324764194;5.5352743402182e-06;-5.784056338598e-05;-1.5400566553581e-05;-3.4555199817987e-05;0.00018585356883705;-4.0582570363767e-05;-0.00029946697759442;1.5430796338478e-05;-4.8753492592368e-05;-6.6115324443672e-05;-0.00011056600487791;5.4971360441414e-06;-7.8921686508693e-05;-5.3500034482568e-06;-0.00018327360157855;-7.0667529143975e-06;8.2371872849762e-05;1.3350432709558e-05;-0.00075663550524041;0.00079303845996037;0.00057442666729912;-0.00052288157166913;3.6384066333994e-05;-9.9866731034126e-05;-2.8600514269783e-05;7.0861853600945e-05;4.8991405492416e-05;-4.8347828851547e-05;-4.2998955905205e-05;-0.00025324532180093;0.00030549679649994;-0.00030216603772715;-4.6792147259112e-06;2.1681593352696e-05;1.689898681434e-06;5.455330665427e-06;-4.3834661482833e-05;-0.00034277158556506;0.00031013821717352;0.00023184143356048;-0.00018701996305026;-0.00025426343199797;0.00044587661977857;-0.00012676857295446;7.7759490523022e-05;-5.4061423725216e-05;0.00017421014490537;-8.3819679275621e-05;5.4109026677907e-05;0.00063507229788229;0.00026007124688476;-0.00042950711213052;-0.00016831136599649;-0.00047548519796692;-0.00027234121807851;9.3565126007888e-05;8.7076929048635e-05;-1.9925688320654e-05;-2.4777113139862e-05;-0.00043287849985063;-0.00019408305524848;0.00023111734481063;0.000214031941141;3.8728198887839e-06;2.0408198906807e-05;-0.0004197315138299;-0.00047322479076684;-9.0299792645965e-05;0.00072827842086554;0.00045538746053353;0.00020287280494813;0.00015288429858629;0.00040436346898787;0.0001647479220992;-0.00010721637954703;-0.00011633187386906;-0.0001895385212265;-0.00017687332001515;-2.6172234356636e-05;-3.7052624975331e-05;-0.00027294826577418;-0.00015801117115188;0.00067394459620118;0.00042751381988637;0.0006149229593575;0.000502857088577;0.0002222711336799;0.00019360914302524;-3.3832368444564e-06;5.6588678489788e-06;0.0002222282346338;0.00017951641348191;0.00033366802381352;0.0002942813152913;-4.314041507314e-05;-2.926916567958e-05;0.0005018490483053;0.00093108910368755;-5.1694471039809e-05;-0.001077247899957;-0.00080796121619642;-0.00038313306868076;-0.00037222192622721;-0.00047409764374606;-0.00040204104152508;-0.00033479105331935;-0.0002719187468756;-0.00032927916618064;-0.00024930690415204;9.9577729997691e-05;5.7458015362499e-05;-0.0010515190660954;0.0010538517963141;0.00078666169429198;-0.00069020414957777;0.00010980029765051;-9.399680129718e-05;-4.1343555494677e-05;9.3859816843178e-05;6.4781903347466e-05;-6.8373024987523e-05;4.5617718569702e-05;-0.00029035157058388;0.00041835076990537;-0.00040117741446011;-9.0285866463091e-06;3.0743816751055e-05;1.277896353713e-05;4.3150328565389e-05;-3.3674539736239e-05;-0.00049141270574182;0.00039023414137773;0.00027157572912984;-0.00028321432182565;-0.00043619782081805;0.00055043841712177;-0.0001678048283793;0.00010229616600554;-0.00010359866428189;0.00021953760005999;-0.00010652802302502;7.4745898018591e-05;0.00076336198253557;0.00043117595487274;-0.00050898065092042;-0.00028723274590448;-0.00060310633853078;-0.00039592746179551;0.00011902685946552;0.00012379334657453;-2.3986978703761e-05;-3.786411616602e-05;-0.00054443441331387;-0.00030005758162588;0.00030405962024815;0.00028589591966011;7.1496256168757e-06;2.9565992008429e-05;-0.00055233377497643;-0.00062246393645182;-0.00011853780597448;0.00091459270333871;0.00064819067483768;0.00026385328965262;0.00020481558749452;0.00049741129623726;0.00027356643113308;-0.00014080968685448;-0.00015955579874571;-0.00024394193314947;-0.00023913284530863;-3.7488567613764e-05;-5.0604674470378e-05;-0.00034901083563454;-0.00022942507348489;0.00085874507203698;0.00061171827837825;0.0008108023321256;0.00069737486774102;0.00029079749947414;0.00026513406191953;-5.5212517509062e-06;8.2534434113768e-06;0.00028471974655986;0.00025260442635044;0.00042945661698468;0.00041572732152417;-5.0791935791494e-05;-4.1297360439785e-05;0.0006792793283239;0.0012459368444979;-6.8270019255579e-05;-0.0014089851174504;-0.0011196170235053;-0.00051057327073067;-0.00050288799684495;-0.00061402429128066;-0.00056588638108224;-0.00043899496085942;-0.00037913213600405;-0.00041713123209774;-0.00035353284329176;0.00012459098070394;7.9940800787881e-05;-0.0010330533841625;0.00097814132459462;0.00078844418749213;-0.00065909628756344;0.00016612227773294;-2.5769579224288e-05;-4.2860578105319e-05;8.8395085185766e-05;6.0466634749901e-05;-6.9481044192798e-05;0.00013100607611705;-0.00018001858552452;0.00041790699469857;-0.00038559531094506;-1.0380335879745e-05;2.9821880161762e-05;2.3324131689151e-05;8.6553394794464e-05;-8.6577728097836e-07;-0.00051913119386882;0.00035084539558738;0.00022354802058544;-0.00032513015321456;-0.00051065045408905;0.00044509582221508;-0.00016412013792433;0.0001011206622934;-0.00013243715511635;0.00018812764028553;-9.7414151241537e-05;7.7084630902391e-05;0.00062181771500036;0.00052027963101864;-0.00041193756624125;-0.00036119172000326;-0.00054094835650176;-0.00042395075433888;0.00010247291356791;0.00012358755338937;-1.8528942746343e-05;-4.1481285734335e-05;-0.00045503280125558;-0.0003196828183718;0.00028821238083765;0.00027632009005174;5.9196113397775e-06;2.8660944735748e-05;-0.0005447193980217;-0.00062022957718;-0.00010863057104871;0.00083893403643742;0.00070587865775451;0.00025050158728845;0.00020525159197859;0.0004032984143123;0.00031485385261476;-0.00012638655607589;-0.00015372472989839;-0.00023376062745228;-0.00024353942717426;-3.553230635589e-05;-4.6711484174011e-05;-0.00030788092408329;-0.00023884170514066;0.00076936255209148;0.00064099807059392;0.00074649602174759;0.00068975827889517;0.00027485564351082;0.00026819412596524;-5.6711664910836e-06;9.308171684097e-06;0.00026247146888636;0.00026442660600878;0.00039504934102297;0.0004332919488661;-4.6377735998249e-05;-4.8854693886824e-05;0.00062736438121647;0.0011812131851912;-7.2447321144864e-05;-0.0012857592664659;-0.0011032219044864;-0.00047908606939018;-0.00048340309876949;-0.00056042609503493;-0.00057972373906523;-0.00040814041858539;-0.00038373630377464;-0.00038386223604903;-0.0003783063730225;0.00011546524910955;8.7483938841615e-05;-0.00067429867340252;0.00057302101049572;0.00057836464839056;-0.00045703822979704;0.00016071976278909;7.9454097431153e-05;-3.174995072186e-05;5.6510711146984e-05;3.7170906580286e-05;-4.9506321374793e-05;0.0001267039187951;5.5168897233671e-05;0.00030373976915143;-0.00026427875855006;-5.7163219935319e-06;1.6734882592573e-05;3.2888339774217e-05;0.00010912562720478;3.5941287933383e-05;-0.00041378641617484;0.00021864443260711;0.0001222815917572;-0.00029486592393368;-0.00040737923700362;0.00016512647562195;-0.00012101720494684;7.7499767940026e-05;-0.00011680826719385;8.7592437921558e-05;-6.3123370637186e-05;6.2880091718398e-05;0.00028452969854698;0.00046586384996772;-0.00019267537572887;-0.0003478558792267;-0.00032926196581684;-0.00033941748552024;4.6579873014707e-05;8.0207108112518e-05;-5.6251751630043e-06;-3.1947747629602e-05;-0.0001941765222;-0.0002133605448762;0.00018974226259161;0.00018822115089279;-1.6473684354423e-06;1.4213488611858e-05;-0.00042720735655166;-0.00050108606228605;-6.2349543441087e-05;0.00057597318664193;0.00062689027981833;0.0001786809443729;0.00015862968575675;0.00015826376329642;0.00024211824347731;-6.3336658058688e-05;-9.3560003733728e-05;-0.00016891439736355;-0.00019545840041246;-1.9087203327217e-05;-2.2945794626139e-05;-0.0001613484491827;-0.00017157588445116;0.00045070893247612;0.00049309339374304;0.0004315406549722;0.0004610180913005;0.00018369151803199;0.0002029111929005;-2.9006089334871e-06;8.6038862718851e-06;0.00016459774633404;0.000208533150726;0.00025004538474604;0.0003363672294654;-3.6795107007492e-05;-5.3204334108159e-05;0.0003240171354264;0.0007412054692395;-6.8840781750623e-05;-0.00073101330781356;-0.00072838779306039;-0.0002921647101175;-0.00031134331948124;-0.00033396162325516;-0.00042575149564072;-0.00025283027207479;-0.00027753695030697;-0.00025292232749052;-0.00031702930573374;8.015132334549e-05;8.1121157563757e-05;-0.00038554129423574;0.00024580545141362;0.0003662069211714;-0.0002654031268321;0.00013553959433921;0.00018877349793911;-2.9627712137881e-05;3.9034333894961e-05;1.7800139175961e-05;-3.2186424505198e-05;0.00011461079702713;0.0002682552440092;0.00019123216043226;-0.00014509125321638;1.4412127029573e-06;-1.2402524589561e-06;4.6789526095381e-05;0.00012464716564864;6.4814877987374e-05;-0.0002991100482177;8.5016894445289e-05;5.1213617553003e-05;-0.00028055987786502;-0.00029190801433288;-9.7034266218543e-05;-7.5750387622975e-05;4.8126166802831e-05;-8.622547466075e-05;-2.1072051822557e-05;-3.8051795854699e-05;5.9494384913705e-05;1.8230224668514e-05;0.00042354033212177;-1.4624373534389e-06;-0.00032332111732103;-0.00013770257646684;-0.00024779111845419;1.0692799151002e-05;5.6428943935316e-05;3.4194470117654e-06;-2.3976326701813e-05;-3.7385984796856e-06;-0.00013701763236895;0.00011573966185097;0.00012198325566715;-8.2036913227057e-06;-2.9772982088616e-06;-0.0002920517581515;-0.00032989494502544;-2.5644319975981e-05;0.00029609812190756;0.00049829093040898;9.9288103228901e-05;9.403647709405e-05;-3.3451986382715e-05;0.00018159160390496;-2.2483511202154e-05;-5.1826857088599e-05;-0.00011491564509925;-0.00016044852964114;-4.8609858822601e-06;2.4294863578689e-06;-5.8371191698825e-05;-0.0001356659195153;0.00021758239017799;0.00040568702388555;0.00020658649737015;0.00029691372765228;0.00011094161891378;0.00014515699876938;-2.4024575395742e-06;8.0074096331373e-06;7.7444485214073e-05;0.00015051467926241;0.00012588904064614;0.00024706230033189;-2.4955263143056e-05;-5.2695075282827e-05;0.00013828370720148;0.00045268362737261;-5.461498585646e-05;-0.00035196714452468;-0.00050064537208527;-0.00016971908917185;-0.00019071667338721;-0.00015862240979914;-0.00030366229475476;-0.00012931045785081;-0.00018867972539738;-0.00013161503011361;-0.00024832275812514;4.761974196299e-05;7.1592592576053e-05;-0.00023279595188797;5.6036522437353e-05;0.00025434672716074;-0.00016483587387484;0.0001157952574431;0.0002925843000412;-3.4565331588965e-05;3.6087771150051e-05;6.8000836108695e-06;-2.2681810150971e-05;9.7609074146021e-05;0.0004594141501002;0.0001310842926614;-7.6743170211557e-05;7.7572876762133e-06;-2.1058511265437e-05;6.1526872741524e-05;0.00014358691987582;8.8414162746631e-05;-0.00024518751888536;4.1258599594585e-06;2.2839063603897e-05;-0.00030896539101377;-0.00022161268861964;-0.00030015260563232;-5.1219460146967e-05;3.4085231163772e-05;-6.5060055931099e-05;-0.00011300820915494;-2.7317322746967e-05;7.3110320954584e-05;-0.00014040469250176;0.00043779777479358;0.00011770691344282;-0.0003298431111034;-3.0073708330747e-05;-0.00020537959062494;-7.2012517193798e-06;5.1444094424369e-05;8.6831096268725e-06;-2.007437433349e-05;0.00011053010530304;-0.00010442487109685;8.4006976976525e-05;9.7548741905484e-05;-1.42758799484e-05;-1.8962093236041e-05;-0.00023225782206282;-0.00023772985150572;-6.8652434492833e-06;0.00014227042265702;0.0004480009956751;5.4727766837459e-05;5.5502285249531e-05;-0.00015510310186073;0.00015466490003746;-1.345109126305e-06;-3.3032145438483e-05;-9.5118863100652e-05;-0.00015876020188443;4.6678646867804e-06;2.3299928216147e-05;-1.7921687458511e-06;-0.00013472975115292;0.00010273951920681;0.00041607301682234;9.3012415163685e-05;0.00022630461899098;8.0175806942862e-05;0.00011963867291342;-3.228612968087e-06;8.9975601440528e-06;2.8274040232645e-05;0.00011793802696047;6.0668575315503e-05;0.00020947703160346;-2.0864537873422e-05;-5.6642715208e-05;4.4634893129114e-05;0.00034412555396557;-4.7974514018279e-05;-0.00016598819638602;-0.00043951306724921;-0.00012404441076797;-0.0001371332036797;-6.7139997554477e-05;-0.0002577732084319;-6.5545769757591e-05;-0.00014702024054714;-6.7688357376028e-05;-0.00021780829411;3.2601179555058e-05;7.0226094976533e-05;-0.0003629146667663;0.0003961572656408;0.00027677763137035;-0.00026716050342657;4.5342362682277e-06;-8.0470490502194e-05;-1.6303023585351e-05;3.7405854527606e-05;2.2271367924986e-05;-2.1560885215877e-05;-4.959916259395e-05;-0.00015687725681346;0.00011611928493949;-0.00012616177264135;4.4805606194132e-06;9.6491339718341e-06;3.825526619039e-06;-7.2400234785164e-06;-3.0533567041857e-05;-0.00017094810027629;0.00016707924078219;0.00011520765110618;-6.3915926148184e-05;-8.138720295392e-05;0.00024526694323868;-5.2651834266726e-05;2.8300986741669e-05;7.2616821853444e-06;7.6087548222858e-05;-4.3623895180644e-05;2.0923418560415e-05;0.00035942898830399;6.9857233029325e-05;-0.00025637698126957;-4.6626897528768e-05;-0.00028118310729042;-0.00012165673979325;5.0435537559679e-05;4.0439401345793e-05;-8.5742767623742e-06;-4.9078016672865e-06;-0.0002786269178614;-7.5522337283473e-05;0.0001000967604341;9.9020187917631e-05;-2.5780805117392e-06;1.1704596545314e-06;-0.000205653035664;-0.00024839059915394;-6.6439068177715e-05;0.00039420233224519;0.00019892129057553;0.00012977569713257;8.9749446487986e-05;0.00028110199491493;5.9786856581923e-05;-5.1268329116283e-05;-5.1025512220804e-05;-7.533412281191e-05;-8.1502614193596e-05;-7.6265946518106e-06;-1.0693165677367e-05;-0.00012995419092476;-6.6538923420012e-05;0.0003390044439584;0.00018260171054862;0.00028895985451527;0.00022133027960081;9.773499914445e-05;8.552402141504e-05;-1.3657216868523e-06;8.1443357657918e-07;8.8627552031539e-05;6.8853274569847e-05;0.00014590371574741;0.00011309480760247;-2.1012736397097e-05;-1.3396976100921e-05;0.00023631310614292;0.00046190660214052;-1.4817522242083e-05;-0.00053942087106407;-0.00037329614860937;-0.00018403970170766;-0.00018518751312513;-0.00022043440549169;-0.00016516129835509;-0.00014533151988871;-0.00010897166794166;-0.00013744257739745;-9.311532630818e-05;4.4139909732621e-05;2.4678383852006e-05;-0.00078100909013301;0.00081334076821804;0.00055298797087744;-0.000520383939147;6.3841216615401e-05;-0.00013156715431251;-3.3241081837332e-05;7.2029928560369e-05;4.6378740080399e-05;-4.6881261368981e-05;1.1225456546526e-05;-0.0002970727509819;0.0002524942101445;-0.00025914728757925;-1.9561061037621e-07;2.1906746042077e-05;1.737651109579e-05;7.7009644883219e-06;-4.2224251956213e-05;-0.00035049632424489;0.00030668414547108;0.00019948482804466;-0.00015136507863645;-0.00026129075558856;0.00046688708243892;-0.0001053189553204;5.8062476455234e-05;-3.0304796382552e-05;0.00015262863598764;-7.7284239523578e-05;4.4752941903425e-05;0.00064173841383308;0.00023039396910463;-0.00044117611832917;-0.0001569389278302;-0.00050038733752444;-0.00027019198751077;0.00010028323595179;9.3003014626447e-05;-1.6571864762227e-05;-1.7280619431403e-05;-0.00050865818047896;-0.00021125872444827;0.00021000843844377;0.00020014338952024;4.3638920033118e-07;9.5659570433781e-06;-0.00037872078246437;-0.00044631789205596;-0.00012362371489871;0.0006910560769029;0.00040800613351166;0.00022861568140797;0.00016621475515421;0.00049109442625195;0.00018856266979128;-0.00011079741670983;-0.00011408434511395;-0.00015411384811159;-0.00016096394392662;-2.1611422198475e-05;-2.6425395844853e-05;-0.00026754222926684;-0.00015354025526904;0.00065915426239371;0.00040194587199949;0.00060432433383539;0.00048615562263876;0.00019847785006277;0.0001760226150509;-4.5013739509159e-06;2.76734090221e-06;0.00018643577641342;0.00015127040387597;0.00029141289996915;0.00024894380476326;-3.4819066058844e-05;-2.4531029339414e-05;0.00053138186922297;0.00095585244707763;-2.7549103833735e-05;-0.001101782778278;-0.00082025892334059;-0.00038588140159845;-0.00038214688538574;-0.00044699749560095;-0.00036331315641291;-0.00030137217254378;-0.00023999797122087;-0.00027101780869998;-0.00020254270930309;8.3966449892614e-05;4.9682694225339e-05;-0.0011939285323024;0.0011837444035336;0.00081786763621494;-0.0007408915553242;0.0001883370714495;-0.00016639154637232;-5.205939305597e-05;0.000100392891909;6.6170236095786e-05;-7.1052323619369e-05;0.00018769738380797;-0.0004015589656774;0.00035795898293145;-0.00035438223858364;-7.9686396929901e-06;3.2551481126575e-05;3.6597713915398e-05;5.1109404012095e-05;-2.97211263387e-05;-0.00054409814765677;0.00041832201532088;0.00021954854310025;-0.0002345410612179;-0.00052169163245708;0.00063778884941712;-0.00013797685096506;7.6626332884189e-05;-8.5580526501872e-05;0.00019778538262472;-9.5218529168051e-05;6.456264964072e-05;0.00080300058471039;0.0004385526990518;-0.00055084336781874;-0.00031122643849812;-0.00067437399411574;-0.0004420468758326;0.00013909771223553;0.00014476175419986;-1.9150593288941e-05;-2.8405574994395e-05;-0.0006939209997654;-0.00038452554144897;0.00028976326575503;0.00027768930885941;2.7548148864298e-06;1.4622412891185e-05;-0.00051585183246061;-0.00061998312594369;-0.00018822903803084;0.00089962634956464;0.00062493834411725;0.00032336756703444;0.00025277183158323;0.00066287320805714;0.00037395340041257;-0.00015821073611733;-0.00016896822489798;-0.00020168586343061;-0.00021992989059072;-3.3459953556303e-05;-3.6961253499612e-05;-0.00036614845157601;-0.00024038138508331;0.0008843980031088;0.00061917101265863;0.00085980916628614;0.00072772923158482;0.00027230640989728;0.00025101206847467;-9.0221928985557e-06;4.0530935621064e-06;0.00024987506913021;0.00021763774566352;0.00038532286998816;0.00036476054810919;-3.8619102269877e-05;-3.3800053643063e-05;0.00079547479981557;0.0013946952531114;-2.7993177354801e-05;-0.0015614660223946;-0.0012464539613575;-0.00056225573644042;-0.00055927550420165;-0.00061088742222637;-0.00054181949235499;-0.00041486555710435;-0.00035111518809572;-0.00034729941398837;-0.00029093405464664;0.00010660523548722;6.9486290158238e-05;-0.0011694433633238;0.0011084589641541;0.00081756775034592;-0.0007052612490952;0.00023925339337438;-0.00010590940655675;-5.3248892072588e-05;9.4026574515738e-05;6.2350118241739e-05;-7.0895082899369e-05;0.00026897955103777;-0.00029882515082136;0.00035594153450802;-0.00033687803079374;-1.1753688340832e-05;2.9072165489197e-05;3.8198762922548e-05;8.7264445028268e-05;4.5270161308508e-07;-0.00056147098075598;0.00038487414713018;0.00017326795205008;-0.00026924128178507;-0.00059314985992387;0.00053557706996799;-0.00013138043868821;7.711641228525e-05;-0.00011480461398605;0.00016520214558113;-8.3754894149024e-05;6.8413311964832e-05;0.00065206794533879;0.0005313228466548;-0.00044846103992313;-0.00038663676241413;-0.00060021632816643;-0.00047719260328449;0.00012311851605773;0.00014379329513758;-1.3553210010286e-05;-3.2007876143325e-05;-0.00058631476713344;-0.00041921189404093;0.00027546499040909;0.00026414651074447;7.8456355367962e-07;1.4377202205651e-05;-0.00050399830797687;-0.00061348296003416;-0.00017835672770161;0.00081637199036777;0.00067967275390401;0.0003033863613382;0.00025764881866053;0.00055043131578714;0.00043057723087259;-0.00014364105300047;-0.00016267775208689;-0.00019650332978927;-0.00021663363440894;-3.0727616831427e-05;-3.3548512874404e-05;-0.0003259421500843;-0.00024671890423633;0.00079053960507736;0.00064533058321103;0.00079435005318373;0.00071479508187622;0.00025770938373171;0.00024905754253268;-9.6145413408522e-06;5.4943670875218e-06;0.00023201982548926;0.00022187754802871;0.00035181475686841;0.0003761843254324;-3.5039342037635e-05;-3.9324742829194e-05;0.00074232317274436;0.0013246571179479;-3.1284835131373e-05;-0.0014318895991892;-0.0012265377445146;-0.00053202896378934;-0.00053404341451824;-0.00055614800658077;-0.00055040995357558;-0.00038472915184684;-0.00035082688555121;-0.00031878883601166;-0.00030567636713386;9.9173485068604e-05;7.3676696047187e-05;-0.0006752765038982;0.00058511702809483;0.0005442961701192;-0.00043993513099849;0.00017717607261147;2.8955471861991e-05;-3.5020635550609e-05;5.4361811635317e-05;3.5089517041342e-05;-4.4516549678519e-05;0.00017454387852922;-6.7908649725723e-06;0.00024397717788815;-0.00021454741363414;-6.8950389504607e-06;1.0827637197508e-05;2.9842974981875e-05;9.401940042153e-05;3.1836250855122e-05;-0.00039430157630704;0.00022577022900805;9.0284243924543e-05;-0.00023863531532697;-0.00040679189260118;0.00019264689763077;-9.1654233983718e-05;6.0997434047749e-05;-9.4566654297523e-05;6.2458260799758e-05;-4.9955375288846e-05;5.6686738389544e-05;0.00026415442698635;0.00043781875865534;-0.00018795843061525;-0.00033460545819253;-0.00032390645355918;-0.00035046928678639;5.2991741540609e-05;8.2826642028522e-05;-1.9034408751395e-06;-2.4091588784358e-05;-0.00022589940635953;-0.00026280593010597;0.00016834406415001;0.00016204691200983;-6.1654263845412e-06;5.081838935439e-06;-0.00037312594940886;-0.00046078351442702;-9.4587987405248e-05;0.0005157426930964;0.00056746962945908;0.00018826931773219;0.00018072524107993;0.00020123425929341;0.00029825782985426;-6.4709071011748e-05;-8.8403394329362e-05;-0.00014068001473788;-0.00015775875363033;-1.3330189176486e-05;-1.3779010259896e-05;-0.00015465421893168;-0.00015585440269206;0.00041810670518316;0.00045139322173782;0.00040984648512676;0.00042336009209976;0.00015977470320649;0.0001704745227471;-4.8694723773224e-06;6.4656255744922e-06;0.00013563637912739;0.00015923466708045;0.00020687934011221;0.00027254989254288;-2.9471948437276e-05;-4.2660340113798e-05;0.00034004184999503;0.00073672382859513;-4.2053030483657e-05;-0.0007236484088935;-0.00071534444577992;-0.00029148772591725;-0.00030146419885568;-0.00029943831032142;-0.00036834343336523;-0.00021716857736465;-0.00023034781042952;-0.00020138846593909;-0.00024255267635453;6.6386666730978e-05;6.3873427279759e-05;-0.00039786953129806;0.00027057464467362;0.00035731858224608;-0.0002561236906331;0.00014808910782449;0.00014424075197894;-3.3174554118887e-05;3.8134505302878e-05;1.722116212477e-05;-2.7433861760073e-05;0.00015541288303211;0.00021427411411423;0.00015091650129762;-0.00010978713544318;-2.2402318791137e-06;-1.1651475688268e-05;2.9448639907059e-05;0.00010837259469554;6.1074919358362e-05;-0.00028261265833862;0.00010503751400393;2.9483695470844e-05;-0.00023835396859795;-0.00030544516630471;-7.2203874879051e-05;-5.143000089447e-05;4.0773444197839e-05;-7.2760769398883e-05;-4.3737243686337e-05;-2.7139407393406e-05;6.1590493714903e-05;-1.5589752365486e-05;0.00043413022649474;1.37025863296e-05;-0.00033270585117862;-0.0001250525820069;-0.0002921239938587;1.7761945855455e-05;6.0081503761467e-05;7.3449996307318e-06;-1.9673772840179e-05;-3.8361326915037e-06;-0.00022525944223162;0.00010642574488884;9.9498967756517e-05;-1.363098181173e-05;-6.4712271523604e-06;-0.00026291294489056;-0.00031481866608374;-5.5786411394365e-05;0.00025598553474993;0.00047915781033225;0.00010398930317024;0.00013124203542247;-2.7505837351782e-05;0.00027582712937146;-2.3938348022057e-05;-5.0573675252963e-05;-0.00010321342415409;-0.00011698950402206;5.7577164369604e-08;4.8771994443086e-06;-5.5142787459772e-05;-0.00012507753854152;0.00019508188415784;0.00039263151120394;0.00019601301755756;0.00027687769033946;9.8342155979481e-05;0.00011647136125248;-4.8375354708696e-06;7.2521706897533e-06;6.1928658396937e-05;0.00010380114690633;9.8978751339018e-05;0.00020033081818838;-2.0723118723254e-05;-4.0793547668727e-05;0.00014907920558471;0.00046186699182726;-3.2643936719978e-05;-0.0003476677229628;-0.00050905189709738;-0.00017994915833697;-0.0001840052427724;-0.0001375240390189;-0.0002706483064685;-0.00010720088175731;-0.00015316519420594;-0.00010128244321095;-0.0001799921883503;3.9602979086339e-05;5.1447226724122e-05;-0.00023739109747112;7.9034682130441e-05;0.00024615993606858;-0.00014856577035971;0.00011239794548601;0.00025488753453828;-3.7089135730639e-05;3.5887565900339e-05;6.3695470089442e-06;-1.7181682778755e-05;0.0001164264176623;0.00040947116212919;0.00010088098497363;-5.0084992835764e-05;3.7712338780693e-06;-3.479785300442e-05;3.5048127756454e-05;0.00012410576164257;8.2201317127328e-05;-0.00021796947112307;2.3397580662277e-05;1.2969572708244e-05;-0.00027425942244008;-0.00022241889382713;-0.00028096287860535;-3.0776835046709e-05;3.2304109481629e-05;-5.2764033171115e-05;-0.00013223827409092;-1.9199218513677e-05;8.0386096669827e-05;-0.00016637657245155;0.00045122584560886;0.00012928934302181;-0.00033122251625173;-1.6057350876508e-05;-0.00025006683426909;1.3103773426337e-06;5.4726602684241e-05;1.1505059774208e-05;-1.7583530279808e-05;0.00011923346028198;-0.0002022061671596;8.0924772191793e-05;8.0213343608193e-05;-1.9092351067229e-05;-1.777482793841e-05;-0.00021270503930282;-0.00022418236767408;-3.1947529350873e-05;0.00011486579023767;0.00042849796591327;5.22699119756e-05;9.1576330305543e-05;-0.00016092849546112;0.00024843364371918;-3.6632607134379e-06;-3.5645443858812e-05;-9.1245485236868e-05;-0.00011118809925392;8.2440174082876e-06;1.9569399228203e-05;-1.2372518085613e-06;-0.00012786213483196;8.9129796833731e-05;0.00041732445242815;9.0126777649857e-05;0.00021659494086634;7.4325893365312e-05;9.1484595031943e-05;-5.7573465710448e-06;9.0350076789036e-06;2.0945484720869e-05;7.2859220381361e-05;4.5594642870128e-05;0.0001720605941955;-1.8397448002361e-05;-4.20576579927e-05;5.2881678129779e-05;0.00035777606535703;-2.8665052013821e-05;-0.00016446203517262;-0.00045630632666871;-0.00013975217007101;-0.00013094050518703;-5.6043445511023e-05;-0.00023993557260837;-5.2885901823174e-05;-0.00011809908028226;-5.1439117669361e-05;-0.00015034231182653;2.7913290978177e-05;4.6130902774166e-05;-0.0002221137547167;0.000249872187851;0.00017725427460391;-0.00017397571355104;-7.2405518949381e-06;-5.7953631767305e-05;-1.0466971616552e-05;2.4611385015305e-05;1.3814523299516e-05;-1.3062759535387e-05;-5.2356142987264e-05;-0.00010473842849024;6.9365421950351e-05;-7.8784789366182e-05;4.9346635933034e-06;5.7250836107414e-06;1.0535235333009e-06;-8.6477220975212e-06;-2.3208041966427e-05;-0.00010849906539079;0.00011228289804421;7.9288671258837e-05;-3.5809724067803e-05;-3.2991621992551e-05;0.00016250342014246;-3.3370670280419e-05;1.7418784409529e-05;1.402463112754e-05;4.8414043703815e-05;-2.9969580282341e-05;1.2625662748178e-05;0.00024707120610401;2.4901893993956e-05;-0.00017994533118326;-1.5889343558229e-05;-0.00019478057220113;-7.1621718234383e-05;3.2444811949972e-05;2.3525799406343e-05;-5.6664143812668e-06;-1.4543254565069e-06;-0.00019176548812538;-3.5426703107078e-05;6.1191953136586e-05;6.297374056885e-05;-2.560432676546e-06;-8.8981437329494e-07;-0.0001377432490699;-0.00016920840425882;-4.5014156057732e-05;0.00027269206475466;0.00012401831918396;9.0583715063985e-05;6.0082416894147e-05;0.0001985739072552;2.3358885300695e-05;-3.1138351914706e-05;-3.0234243240557e-05;-4.6003864554223e-05;-5.255014548311e-05;-3.7988522763044e-06;-5.7272750382253e-06;-8.1225582107436e-05;-3.864056270686e-05;0.00022032514971215;0.00010912154539255;0.00017948048480321;0.0001328102662228;6.1453494708985e-05;5.354912718758e-05;-5.3285384638002e-07;2.3901046120045e-07;5.3887717513135e-05;4.1182855056832e-05;9.2790862254333e-05;6.7284745455254e-05;-1.4594857930206e-05;-8.945102308644e-06;0.00013983793905936;0.00028942755307071;-9.5152363428497e-06;-0.00034089598921128;-0.00022413075203076;-0.00011409862781875;-0.0001164398927358;-0.00013930148270447;-9.8709540907294e-05;-9.038089774549e-05;-6.4950902014971e-05;-8.7460357462987e-05;-5.5814125516918e-05;2.8633039619308e-05;1.561297722219e-05;-0.0011272962437943;0.0010962783126161;0.00071588763967156;-0.00065844936762005;0.00025245893630199;-0.00020379699708428;-5.1051909395028e-05;8.6566666141152e-05;5.6310807849513e-05;-6.2102742958814e-05;0.00033134475233965;-0.0004371885152068;0.00025238984380849;-0.0002564387395978;-1.0273874067934e-05;2.9702154279221e-05;4.9710997700458e-05;5.6815766583895e-05;-1.5013965821709e-05;-0.0005021394463256;0.00036670130793937;0.00011695127614075;-0.00015005505701993;-0.0005605184705928;0.00061405031010509;-8.6428983195219e-05;4.1576309740776e-05;-7.6875810918864e-05;0.00015006579633337;-6.4048879721668e-05;4.4868051190861e-05;0.00066781206987798;0.00038939793012105;-0.00047240147250704;-0.00029259466100484;-0.00060871755704284;-0.00041694560786709;0.00012762716505677;0.00013578103971668;-1.2139754289819e-05;-1.7803942682804e-05;-0.00068384583573788;-0.00040604345849715;0.00022086888202466;0.00021711544832215;2.8822839794884e-06;4.7587723202014e-06;-0.00039723815280013;-0.00051227258518338;-0.00020929687889293;0.00072140386328101;0.00051186740165576;0.00031319475965574;0.00025125499814749;0.00067331077298149;0.0004147227446083;-0.00014241074677557;-0.00014721009938512;-0.00012331795005593;-0.00015651348803658;-2.8850437956862e-05;-2.4395569198532e-05;-0.00031185569241643;-0.00021165289217606;0.00073528353823349;0.00052665895782411;0.0007574291084893;0.00063952442724258;0.00020951392070856;0.00019573522149585;-1.1282009836577e-05;-2.4714358914935e-07;0.00017929381283466;0.00015310927119572;0.00028005140484311;0.00026484523550607;-1.7295325960731e-05;-1.8167500456912e-05;0.00075762235792354;0.0012812674976885;1.2153814168414e-05;-0.00141107942909;-0.0011508791940287;-0.00051269517280161;-0.00051175605040044;-0.00049972062697634;-0.00043611385626718;-0.00032573897624388;-0.00027356660575606;-0.00022527262626681;-0.00018977247236762;6.9162662839517e-05;4.5444321585819e-05;-0.0011216338025406;0.0010657788952813;0.00072031270246953;-0.00063809007406235;0.00027752897585742;-0.00017442971875425;-5.2066992793698e-05;8.4008228441235e-05;5.5028660426615e-05;-6.202410440892e-05;0.0003752134507522;-0.00038818546454422;0.00025372419622727;-0.00024775334168226;-1.3629430213769e-05;2.6613284717314e-05;4.3567197280936e-05;7.3551775130909e-05;-4.7185732654498e-08;-0.00050773116527125;0.00035293659311719;9.4845359853934e-05;-0.00016857589071151;-0.00060210103401914;0.00056223606225103;-8.2145437772851e-05;4.2909021431115e-05;-9.336003131466e-05;0.00013307493645698;-5.7803412346402e-05;4.82477589685e-05;0.00058134662685916;0.00045239613973536;-0.00041226681787521;-0.00034105018130504;-0.00056023482466117;-0.00044616425293498;0.00012118279846618;0.00013680203119293;-8.8604056145414e-06;-2.0722905901494e-05;-0.00061597913736477;-0.00044263844029047;0.00021812719933223;0.00020961204427294;8.2614616303545e-07;6.0648644648609e-06;-0.00038910860894248;-0.00050516932969913;-0.0002049136091955;0.00066967605380341;0.00054376671323553;0.0002970315690618;0.00025779963470995;0.00059981073718518;0.00046370064956136;-0.00013670579937752;-0.00014590211503673;-0.00012678769417107;-0.00015107789658941;-2.6628815248841e-05;-2.3932352632983e-05;-0.00029401402571239;-0.00021788611775264;0.00068833521800116;0.00054873892804608;0.00072950328467414;0.00063977699028328;0.00020463921828195;0.00019417608564254;-1.2021038855892e-05;8.2515737176436e-07;0.00017389668209944;0.00015358239761554;0.00026453731697984;0.00027231377316639;-1.594862624188e-05;-1.9807910575764e-05;0.00073997781146318;0.0012559205060825;1.1100031770184e-05;-0.0013530813157558;-0.0011559823760763;-0.00050309731159359;-0.00050116900820285;-0.00047385480138473;-0.00044559952220879;-0.00031315276282839;-0.00027525241603144;-0.00021441957505886;-0.00019494091975503;6.697960634483e-05;4.5924705773359e-05;-0.00031533706351183;0.0002213751868112;0.00027061183936894;-0.00017983702127822;0.00013380103337113;7.4783667514566e-05;-2.6780131520354e-05;2.8309637855273e-05;1.2559847164084e-05;-1.7925414795172e-05;0.00017250192468055;0.00011903703125427;8.6641521193087e-05;-5.3534953622147e-05;-6.3907359617588e-06;-1.5484032701352e-05;2.6107620669791e-06;7.5137992098462e-05;4.6429533540504e-05;-0.00020109473553021;9.0281973825768e-05;-5.3331773415266e-06;-0.00014792480214965;-0.0002672565751709;-3.6057474062545e-05;-1.856432754721e-05;2.3243796022143e-05;-5.3018571634311e-05;-4.8534315283177e-05;-1.0568060133664e-05;4.6315661165863e-05;-7.1252485213336e-05;0.00036175179411657;4.6771569031989e-05;-0.00027876105741598;-6.5325330069754e-05;-0.00027233004220761;1.6438430975541e-05;4.6032193495193e-05;9.9779190350091e-06;-1.3975306501379e-05;2.2827640350442e-05;-0.00025692346389405;7.2397509939037e-05;5.1177907153033e-05;-1.487149620516e-05;-2.6593554594001e-06;-0.0001758100988809;-0.00022488892136607;-6.1730082961731e-05;0.00014375448517967;0.00036381671088748;7.3556278948672e-05;0.0001331019011559;-4.558728687698e-05;0.000307034002617;-1.7050009773811e-05;-3.5735025448957e-05;-6.9677626015618e-05;-4.7027744585648e-05;3.8995135582809e-06;1.0674874602046e-06;-3.1818337447476e-05;-9.2137241153978e-05;0.00011413259926485;0.00030085718026385;0.00013372731336858;0.00020278751617298;6.3744351791684e-05;6.6821819928009e-05;-5.8535697462503e-06;5.0041921895172e-06;3.1923969800118e-05;4.451139466255e-05;4.8751964641269e-05;0.00012227852130309;-1.1070188520534e-05;-2.0002669771202e-05;0.00011782055662479;0.00035594930523075;-7.8913153629401e-06;-0.00024445226881653;-0.00040409667417407;-0.00014366158575285;-0.00013447922538035;-7.8500983363483e-05;-0.00018755190831143;-6.1243772506714e-05;-9.4140552391764e-05;-4.8544417950325e-05;-8.6864223703742e-05;2.2381893359125e-05;2.1616333469865e-05;-0.00058665050892159;0.00056639831745997;0.00035926784039475;-0.000338522833772;0.00016194996715058;-0.00013644392311107;-2.7302989110467e-05;4.2406067223055e-05;2.7021227651858e-05;-3.0360935852514e-05;0.00022803696629126;-0.0002623651525937;9.6776020654943e-05;-0.0001042217554641;-5.4260649449134e-06;1.5271700249286e-05;3.2834544981597e-05;3.0628390959464e-05;-5.3496260079555e-06;-0.00026318270829506;0.00018849725893233;2.5797115085879e-05;-4.3060234020231e-05;-0.00031897713779472;0.00034209256409667;-2.7782067263615e-05;9.0601060946938e-06;-3.4684784623096e-05;6.6230153606739e-05;-2.4637240130687e-05;1.6699714251445e-05;0.00033063447335735;0.00017318753816653;-0.00024421847774647;-0.00013771034718957;-0.00032809938420542;-0.00021385478612501;6.3745879742783e-05;6.7105807829648e-05;-4.5548695197795e-06;-4.2661913539632e-06;-0.00038482746458612;-0.00021571428806055;8.9322638814338e-05;9.4381983217318e-05;2.1779453618365e-06;-1.7272428749493e-06;-0.00018454079690855;-0.00025613562320359;-0.00012329257151578;0.00035509734880179;0.0002399780205451;0.00017746197408997;0.00014008111611474;0.00039335706969723;0.00022570230066776;-6.8146749981679e-05;-6.8562105298042e-05;-3.2418978662463e-05;-6.0489648603834e-05;-1.4780858691665e-05;-8.8937440523296e-06;-0.00014655239647254;-0.00010051397839561;0.0003490608651191;0.00024640912306495;0.00037031492684036;0.00030823904671706;9.0176901721861e-05;8.5290455899667e-05;-6.7980404310219e-06;-2.0192676402075e-06;6.7381719418336e-05;5.6740249419818e-05;0.00011420797818573;0.00010361157910665;-1.5238357491398e-06;-3.7154484289204e-06;0.00038250992656685;0.00064997089793906;2.1345245841076e-05;-0.00070658599724993;-0.00057611771626398;-0.00025803316384554;-0.00025953314616345;-0.00022960243222769;-0.00019269915355835;-0.00014335088781081;-0.00011692423868226;-7.6423479185905e-05;-6.2568724388257e-05;2.2859525415697e-05;1.4843437384116e-05;-0.00093538558576256;0.00089866237249225;0.00055813731160015;-0.00052211253205314;0.0002557254047133;-0.00020253285765648;-4.3444943003124e-05;6.7041779402643e-05;4.2954663513228e-05;-4.8329817218473e-05;0.00037210085429251;-0.00040724876453169;0.00015646501560695;-0.00016475410666317;-1.0123227184522e-05;2.3954238713486e-05;5.0969138101209e-05;5.0433638534741e-05;-5.7652014220366e-06;-0.00040542118949816;0.00028532731812447;4.0312319470104e-05;-7.5727606599685e-05;-0.00051039695972577;0.00052626506658271;-4.3590083805611e-05;1.4236430615711e-05;-6.1152670241427e-05;0.00010364965419285;-3.7903631891822e-05;2.7653957658913e-05;0.00050442974315956;0.00029950158204883;-0.00036519169225357;-0.00023356336168945;-0.00049273879267275;-0.00034255150239915;0.00010305338219041;0.00011072405322921;-7.1235672294279e-06;-9.2637219495373e-06;-0.0005910984473303;-0.00036024476867169;0.00014862768875901;0.00015114706184249;3.9882393139123e-06;-3.9739282442497e-07;-0.00027810904430225;-0.00037944075302221;-0.0001911555591505;0.00052530987886712;0.00037337891990319;0.00026471729506738;0.00021405601000879;0.00059412023983896;0.00037642393726856;-0.00011286845983705;-0.00011351661669323;-5.7336554164067e-05;-9.5285999123007e-05;-2.4010068955249e-05;-1.5581666957587e-05;-0.00024020897399168;-0.0001664864103077;0.00055721198441461;0.00040363695006818;0.00060287426458672;0.00050570053281263;0.00014523392019328;0.0001367527002003;-1.1349400665495e-05;-3.0048306598474e-06;0.00011355997412466;9.3539340014104e-05;0.00018254856695421;0.00016994164616335;-1.0195016102443e-06;-4.6612126425316e-06;0.00063298491295427;0.0010525524849072;3.5816894524032e-05;-0.0011436459608376;-0.00094478839309886;-0.00041976047214121;-0.0004193673375994;-0.00037206622073427;-0.00031659138039686;-0.00023230056103785;-0.00019201649411116;-0.00012262343079783;-0.00010196584480582;3.6371522583067e-05;2.3130685804063e-05;-0.00091962650185451;0.00086059386376292;0.00056128087453544;-0.0004953199531883;0.00027254648739472;-0.00016947711992543;-4.4643151341006e-05;6.5096370235551e-05;4.1593859350542e-05;-4.7237914259313e-05;0.00040519156027585;-0.00034852974931709;0.00015755704953335;-0.00015323898696806;-1.4271556210588e-05;1.7510708858026e-05;3.6596429708879e-05;6.3721665355843e-05;8.4127914306009e-06;-0.00040238938527182;0.00027352347387932;2.1974523406243e-05;-9.5959061582107e-05;-0.00054439256200567;0.00046272043255158;-3.7846315535717e-05;1.6861387848621e-05;-7.5750635005534e-05;8.0881225585472e-05;-3.1402116292156e-05;3.4022326872218e-05;0.00039799860678613;0.00037870320375077;-0.00028943037614226;-0.00029319524765015;-0.00042641861364245;-0.00038545482675545;9.6616982773412e-05;0.00011123979493277;-2.7242404030403e-06;-1.3177404980524e-05;-0.00049625075189397;-0.00041519847582094;0.00014986199676059;0.00014001756790094;-4.7914397782733e-07;2.059788130282e-06;-0.00027099516591989;-0.00037140591302887;-0.00018584549252409;0.00046270599705167;0.00041485630208626;0.00024020903219935;0.00022643407282885;0.00048964814050123;0.00044645430170931;-0.00010633630154189;-0.00011147333134431;-6.8795190600213e-05;-8.3981540228706e-05;-1.970865741896e-05;-1.5935027477099e-05;-0.00021996413124725;-0.00017367223335896;0.00050469959387556;0.00043479513260536;0.0005690356483683;0.0005052691558376;0.00014205512707122;0.00013274846423883;-1.2386391063046e-05;-1.4106302614891e-06;0.00010949568968499;8.9389475760981e-05;0.00016644506831653;0.00017713886336423;-1.2749036386595e-06;-5.3484818636207e-06;0.00060853565810248;0.0010247635655105;3.4389246138744e-05;-0.0010734924580902;-0.00095403182785958;-0.0004112376482226;-0.00040491711115465;-0.00034234105260111;-0.00032796763116494;-0.00021840711997356;-0.00019240770780016;-0.00011481282126624;-0.00010260190902045;3.6123950849287e-05;2.1389492758317e-05;-0.0005084949079901;0.00044163115671836;0.00035073459730484;-0.00027397333178669;0.0001825935614761;-4.8957048420561e-05;-3.045252924494e-05;3.8055000914028e-05;2.1783482225146e-05;-2.5409583031433e-05;0.00026570097543299;-9.6630363259465e-05;8.9823770395014e-05;-7.1029215177987e-05;-1.1076373994001e-05;-4.0426089071843e-06;4.9749201025406e-06;5.7376400945941e-05;2.5782315788092e-05;-0.00024918644339778;0.00015824992442504;-9.1603897089954e-06;-9.0918365458492e-05;-0.00035903486423194;0.00017201302398462;-1.4010379345564e-05;1.4668321455247e-05;-5.4559826821787e-05;3.0804341122348e-07;-1.1974052540609e-05;3.5214769013692e-05;8.4780716861133e-05;0.00033513872767799;-6.9451198214665e-05;-0.00026092762709595;-0.00018166494555771;-0.00030716814217158;4.4715001422446e-05;6.311247125268e-05;6.2643894125358e-06;-1.1195291335753e-05;-0.00016097219486255;-0.00032325196661986;8.6674685007893e-05;6.4614767325111e-05;-1.0010644473368e-05;6.9490562282226e-07;-0.0001822023477871;-0.00025275856023654;-0.00011002257087966;0.00022868925589137;0.00034278962993994;0.00012702067033388;0.00017079884128179;0.00014978781109676;0.00036695267772302;-4.6042292524362e-05;-5.6542321544839e-05;-5.5804372095736e-05;-3.3618955058046e-05;-3.4113886613341e-06;-6.9897291723464e-06;-9.0621739218477e-05;-0.00010708676563809;0.00022602586250287;0.00031053557177074;0.00026676908601075;0.00028135508182459;7.9297147749458e-05;7.2183436714113e-05;-8.4110752140987e-06;1.708399963718e-06;4.850777622778e-05;3.7687193980673e-05;7.367275247816e-05;0.00011220684973523;-4.2356109588582e-06;-6.7909631980001e-06;0.00027965754270554;0.00055445759790018;1.5865880413912e-05;-0.00050366850337014;-0.00055696483468637;-0.00022520255879499;-0.00021233083680272;-0.00015188251563814;-0.0002042099222308;-0.00010130601731362;-0.00010718017438194;-5.3944208048051e-05;-5.7527930039214e-05;2.1144171114429e-05;1.0289254532836e-05;-0.00039423553971574;0.00029012170853093;0.00031666905852035;-0.00018920819275081;0.00016966159455478;5.0066293624695e-05;-3.2838797778822e-05;3.489571827231e-05;1.4772692338738e-05;-1.8200189515483e-05;0.00025372579693794;8.3900835306849e-05;7.4893367127515e-05;-3.3436677767895e-05;-1.2689625691564e-05;-2.6028190404759e-05;-2.3880549633759e-05;7.9632933193352e-05;5.1349295972614e-05;-0.00021216220920905;0.00011228840594413;-2.9354579965002e-05;-0.000139705822221;-0.00034516979940236;-1.7055161151802e-05;-1.4918593649327e-07;1.9053686628467e-05;-5.8139863540418e-05;-7.0367685111705e-05;-3.7914653603366e-06;5.53821628273e-05;-0.0001255374372704;0.00045386436977424;8.0955687735695e-05;-0.00034108979161829;-5.2839732234133e-05;-0.00036355422344059;2.6949972379953e-05;5.6609420425957e-05;1.4932878002583e-05;-1.5806872397661e-05;3.7025754863862e-05;-0.00039423591806553;8.0285055446438e-05;4.0886516217142e-05;-2.1335159544833e-05;1.2775669802068e-06;-0.00018053576059174;-0.00023644420434721;-9.2362854047678e-05;0.0001202969942824;0.00040815531974658;7.6574426202569e-05;0.00018541772442404;-6.4287632994819e-05;0.0004550131270662;-2.3033046090859e-05;-4.4142889237264e-05;-7.4247727752663e-05;-1.166362199001e-05;7.5601892604027e-06;-4.6881414164091e-06;-3.0947285267757e-05;-0.00011787016410381;0.00011180596629856;0.00038065604167059;0.00015979800082278;0.0002515128289815;6.885616312502e-05;5.6775887060212e-05;-9.9066492111888e-06;5.5935984164535e-06;2.3620905267308e-05;1.7568869225215e-05;3.4904202038888e-05;0.00011722347699106;-7.7842778409831e-06;-8.9650238805916e-06;0.00016596892965026;0.00045983996824361;1.0944726454909e-05;-0.00030029672780074;-0.00053408171515912;-0.00019211410835851;-0.00016505701933056;-7.3645103839226e-05;-0.0002171188389184;-5.8738329244079e-05;-9.3442140496336e-05;-3.1127772672335e-05;-4.6950615796959e-05;1.9323886590428e-05;3.6523263133859e-06;3.3331689337501e-05;-3.1349241908174e-05;-1.6979938664008e-05;6.8099187046755e-05;0.00022787498892285;-0.0003453815006651;0.00053617788944393;-0.00066027493448928;-0.00083869008813053;0.00094750651624054;-4.2642444896046e-05;4.6273937186925e-05;6.7642395151779e-05;-5.2738752856385e-05;0.00033915205858648;-0.00051566719776019;-5.1915194489993e-05;-2.5564486350049e-05;1.1556786603251e-06;2.6080202587764e-05;5.6347846111748e-05;-0.00039168674265966;0.00046830525388941;2.3243233044923e-06;-5.1957529649371e-05;-0.00041845854138955;0.00060910533647984;1.8679169443203e-05;-3.122092311969e-05;-6.8399851443246e-05;9.4870956672821e-05;7.5766156442114e-06;-2.0256542484276e-05;-5.7421468227403e-05;-1.1078873285442e-07;0.00074028567178175;0.00022334992536344;0.00068556278711185;2.597298771434e-05;-0.00077012792462483;0.00019803663599305;-2.5069790353882e-05;2.5061142878258e-05;-0.00010823125921888;-0.00010384288907517;0.00050541560631245;-7.6380551035982e-05;0.00017157461843453;0.0007612761692144;0.00046847015619278;-0.00043824058957398;-0.00028386348276399;-0.0010630089091137;-0.00050179293612018;8.7788270320743e-05;1.0264197044307e-05;-0.00067287683486938;2.2445719878306e-05;3.676827691379e-05;-3.5743173611991e-06;4.1756920836633e-05;0.0001131925964728;-6.5510371314303e-06;3.7902022995695e-06;0.00010844555799849;5.3672436479246e-05;0.00010668407776393;0.00014752203423996;3.8077819226601e-06;0.00015158507449087;0.00017149322957266;-0.00015818870451767;-5.6014670235527e-07;-1.4248943443818e-05;0.00016822994803078;8.5505031165667e-05;-8.368854469154e-05;8.8944216258824e-05;-5.7338442275068e-05;0.00018494618416298;8.3860410086345e-05;-5.1522616558941e-05;-6.3313338614535e-05;-0.00015256053302437;-0.00022353757231031;-0.00019729588530026;-7.7651850006077e-05;4.1621765376476e-06;-0.00014377407205757;1.879988485598e-05;1.8355924112257e-05;-0.00010109143477166;-6.8481036578305e-05;3.8317393773468e-05;-3.5861354263034e-05;-2.0217124983901e-05;7.3315364716109e-05;0.00027206155937165;-0.00037932037957944;0.0006082170875743;-0.00073709961725399;-0.00096496182959527;0.0010759598808363;-5.3048050176585e-05;5.3111551096663e-05;7.8273260442074e-05;-5.9633199271047e-05;0.00041290052467957;-0.00057846948038787;-5.167919152882e-05;-2.3639899154659e-05;3.4400923709654e-07;1.7607399058761e-05;5.8982448535971e-05;-0.00044068571878597;0.00051773776067421;7.1974059210334e-06;-5.7474881032249e-05;-0.00049902038881555;0.00067770044552162;2.63604488282e-05;-3.5892633604817e-05;-8.9083921920974e-05;0.00010800115705933;5.7118627410091e-06;-1.9407918443903e-05;-6.0864949773531e-05;-6.7577698246168e-06;0.00077761127613485;0.00028928415849805;0.00070582883199677;9.8502910987008e-05;-0.00077745062299073;0.00012758618686348;-2.4105869670166e-05;2.2746333343093e-05;-0.00012729730224237;-0.0001167499794974;0.00051501777488738;-3.2878211641219e-05;0.0001909336715471;0.00084196124225855;0.0005198298022151;-0.00047369231469929;-0.00032374696456827;-0.0011294805444777;-0.0006097896839492;9.6453521109652e-05;2.0109080651309e-05;-0.00068777421256527;-3.844791353913e-05;3.9538743294543e-05;-4.2498737684582e-07;5.5156720918603e-05;0.00012259719369467;-6.8998710958112e-06;3.2602283681626e-06;0.00011974842345808;6.418717384804e-05;0.00014307905803435;0.0001739313302096;2.1115130948601e-05;0.00016651635814924;0.00015910888032522;-0.00015514742699452;4.2686798451541e-07;-1.3368723557505e-05;0.00018436765822116;0.00010354526602896;-7.4721363489516e-05;8.7145752331708e-05;-6.2436767620966e-05;0.00022884909412824;0.00011559724225663;-7.0139845774975e-05;-7.57827583584e-05;-0.00020135869272053;-0.00027158451848663;-0.00021943490719423;-9.8457210697234e-05;-1.6123456589412e-05;-0.00015519540465903;2.0511775801424e-05;1.9378760043764e-05;-0.00011139622074552;-7.8721830504946e-05;3.6841884138994e-05;-3.3837073715404e-05;-1.2143271305831e-05;6.9604888267349e-05;0.0002232419064967;-0.00035081134410575;0.00056169496383518;-0.00069137703394517;-0.00089747196761891;0.0010156222851947;-5.1367092964938e-05;4.9644324462861e-05;8.6122403445188e-05;-6.2904291553423e-05;0.00036466741585173;-0.00054379005450755;-5.7204080803785e-05;-3.4609758586157e-05;-9.5182558652596e-06;3.896202906617e-05;5.2694453188451e-05;-0.00038862213841639;0.00048713528667577;-4.3560053200054e-06;-4.9958580348175e-05;-0.00044266085023992;0.00063481857068837;2.5933743017958e-05;-3.4098728065146e-05;-9.0624205768108e-05;0.00010837049921975;5.1759398047579e-06;-1.838192838477e-05;-5.9431706176838e-05;-4.475762580114e-06;0.00074276921804994;0.00028954131994396;0.00068780995206907;0.00010808867955348;-0.00075668597128242;0.00011014505435014;-2.2506343157147e-05;1.9903138309019e-05;-0.0001337878202321;-0.0001170302493847;0.00048398887156509;-2.6298612283426e-05;0.00018220307538286;0.00082590716192499;0.00051447690930218;-0.00045272937859409;-0.00031925420626067;-0.0011039671953768;-0.00060915993526578;9.7274380095769e-05;2.1237645341898e-05;-0.00064799701794982;-4.4509695726447e-05;3.8393336581066e-05;1.9299836822029e-06;6.5792293753475e-05;0.00012157882883912;-6.1205191741465e-06;3.0016617529327e-06;0.0001248752232641;6.4653482695576e-05;0.00016922238864936;0.00017591561481822;3.6055716918781e-05;0.00016537592455279;0.00014128230395727;-0.00014680669119116;-5.0004250624625e-06;-1.3024697182118e-05;0.00019847354269587;0.00010739643039415;-4.616178557626e-05;8.7041029473767e-05;-6.2890416302253e-05;0.00023299106396735;0.0001187801535707;-8.098690159386e-05;-7.4338109698147e-05;-0.00021617524907924;-0.00027243720251136;-0.0002281478518853;-0.00010183063568547;-4.8882713599596e-05;-0.00015723747492302;2.7317759304424e-05;1.9786564735114e-05;-0.00013048395339865;-8.1644211604726e-05;5.15893480042e-05;-4.7452409489779e-05;-2.2171945602167e-05;8.9924804342445e-05;0.00033489603083581;-0.00045576249249279;0.00077695201616734;-0.00092949502868578;-0.001272699679248;0.0014083645073697;-7.6828742749058e-05;7.0372894697357e-05;0.00011479742533993;-8.2691600255203e-05;0.00055819709086791;-0.00074010121170431;-6.3410989241675e-05;-3.1454801501241e-05;-9.9733506431221e-06;2.9646171242348e-05;6.0069451137679e-05;-0.00053510104771703;0.00063896557549015;7.2401967372571e-06;-7.0094196416903e-05;-0.00065635232022032;0.00084972515469417;4.2387313442305e-05;-4.8515539674554e-05;-0.00013966078404337;0.00014863820979372;2.9678953978873e-06;-1.97369572561e-05;-7.6931122748647e-05;-1.9409184460528e-05;0.00093524914700538;0.00045258909813128;0.00083822751184925;0.0002577714913059;-0.00089626974659041;-3.3254527807003e-06;-2.5655359422672e-05;1.8543216356193e-05;-0.00019140032236464;-0.00016282794240396;0.00058843800798059;4.9638052587397e-05;0.0002481549163349;0.001101172529161;0.00068914232542738;-0.00059160200180486;-0.00044059081119485;-0.0014023677213117;-0.00089838437270373;0.00013182364637032;4.6112938434817e-05;-0.00078840123023838;-0.00016166520072147;5.1045328291366e-05;8.4541470641852e-06;9.8745651484933e-05;0.00016049161786214;-8.2188817032147e-06;2.5703513983899e-06;0.00016471771232318;9.570211841492e-05;0.00026996407541446;0.00026709644589573;7.7974000305403e-05;0.0002319613849977;0.0001403963251505;-0.00017444186960347;-9.055772238753e-07;-1.3332321032067e-05;0.00025618248037063;0.00016047163808253;-4.2523370211711e-05;0.00010297970584361;-8.0254110798705e-05;0.00037020453601144;0.00021166971419007;-0.00013318099081516;-0.00011814113531727;-0.00035892822779715;-0.0004287410993129;-0.00030622805934399;-0.00015969616652001;-9.2009766376577e-05;-0.00021418488177005;3.2123294658959e-05;2.4810749891913e-05;-0.00016339839203283;-0.00011463969713077;5.0389353418723e-05;-4.596681901603e-05;-2.5262082999689e-05;7.7677403169218e-05;0.00031718931859359;-0.00037155579775572;0.00072045356500894;-0.0008248362573795;-0.0012424484593794;0.0013393020490184;-8.0762663856149e-05;6.8614186602645e-05;0.0001073026942322;-7.2857175837271e-05;0.00058293936308473;-0.00067961442982778;-4.367395376903e-05;-1.2558613889269e-05;-1.3905980267737e-05;1.5424289813382e-05;2.9764731152682e-05;-0.00047367945080623;0.00054004898993298;2.1051429939689e-05;-6.7535642301664e-05;-0.00065389857627451;0.00074933416908607;4.8685382353142e-05;-4.8489029722987e-05;-0.00015393013018183;0.00014279813331086;-2.6261323000654e-06;-1.0691917850636e-05;-7.0448833866976e-05;-3.7633828469552e-05;0.00076740770600736;0.00050732237286866;0.00065967603586614;0.00040400694706477;-0.00066572247305885;-0.00023025511472952;-1.7525209841551e-05;2.9177124361013e-06;-0.00020409634453245;-0.00016616146604065;0.00045168839278631;0.00017226875934284;0.00023210670042317;0.0010003979550675;0.00063531222986057;-0.0005144479800947;-0.00042293695150875;-0.001183282234706;-0.00094142113812268;0.00013122975360602;7.4276358645875e-05;-0.00060463248519227;-0.00029689239454456;4.7220408305293e-05;1.8890179489972e-05;0.00011542430729605;0.00014862869284116;-7.7459171734517e-06;4.2580037984408e-07;0.00015548570081592;0.00010365458001615;0.00034258508821949;0.00031483641942032;0.00012708573194686;0.00025041872868314;5.1139799325028e-05;-0.00014228520740289;5.6205508371932e-06;-5.9425001381896e-06;0.00023456997587346;0.00017960477271117;4.1687112570798e-06;8.4257437265478e-05;-6.8279725383036e-05;0.00045437732478604;0.00029751632246189;-0.00017450384621043;-0.00014484429266304;-0.00046568555990234;-0.00052628054982051;-0.00029777045710944;-0.00018886307952926;-0.00014560487761628;-0.00022214381897356;2.7683687221725e-05;2.0707280782517e-05;-0.0001469595299568;-0.00011722850467777;3.0224409783841e-06;-4.3507561713341e-06;-4.6801676944597e-05;-4.7493563215539e-06;9.911460801959e-05;0.00021895584359299;0.00014489727618638;-7.6652511779685e-05;-0.00016743961896282;2.556805338827e-05;2.4640057745273e-06;-2.368512286921e-05;1.3968984603707e-05;-2.0747665985255e-05;0.00011340237688273;0.00025986693799496;7.8511089668609e-05;8.5086932813283e-05;5.8773475757334e-05;-9.8152322607348e-06;-0.00018498113786336;-0.00015602460189257;-2.927318928414e-05;1.0312524864275e-05;2.8246018700884e-05;-0.0001460609928472;-0.00020913282060064;2.0237105218257e-06;4.21828153776e-05;-2.2160846128827e-05;-8.4521576354746e-05;-2.5242754418286e-05;1.5836636521271e-05;3.1632178433938e-05;-6.2200728280004e-05;-4.8216144932667e-05;0.00044036589679308;-0.00024359210510738;0.0006652312586084;0.00044817122397944;-0.00075360876508057;4.4250740756979e-05;7.5668503995985e-07;-7.1715214289725e-05;-5.530961061595e-05;-0.00024977602879517;0.00033334549516439;6.9722074840683e-05;0.00037484423955902;0.00024037765979301;-0.0001184617576655;-0.0001789886446204;-4.3953605199931e-05;-0.00077333848457783;-3.0840339604765e-05;5.3938281780574e-05;0.00027639319887385;-0.00047942655510269;-1.9003187844646e-05;-1.2372978744679e-05;9.3437243776862e-05;7.7744123700541e-05;3.2389027637691e-06;-8.7970579443208e-07;2.3930702809594e-05;7.7011573011987e-05;3.5719273000723e-05;0.00010559276415734;6.1089893279132e-05;0.0001068684796337;-0.00010052485595224;9.1506881290115e-05;-2.2876392904436e-05;-3.569836189854e-05;6.9746397457493e-06;0.00014973554061726;6.6383829107508e-05;7.7103304647608e-06;-3.0015098673175e-05;0.00012671717558987;-1.0987987479893e-05;-4.8326626711059e-05;-4.9593887524679e-05;-3.8090529415058e-05;-0.00016340437286999;7.7438044172595e-06;-0.00011400960647734;-7.1737209509593e-05;-9.3145827122498e-05;1.9294295270811e-05;4.3733874917962e-05;-2.1213991203695e-05;-0.00013274751836434;2.154125013476e-06;3.8249181670835e-06;2.872742152249e-05;7.3162067565136e-05;-0.00056127231800929;-6.9255554990377e-05;-6.3918807427399e-05;-8.7407017417718e-05;0.00029916208586656;6.3312722886621e-06;6.3781066273805e-05;-2.6113339117728e-05;3.1615567422705e-05;-1.0626046787365e-05;-0.00069534964859486;-2.5150251531159e-05;-0.00015840942796785;-0.00019393755064812;-0.00015898622223176;0.00040355193777941;-4.3046647988376e-06;0.00023675507691223;0.00019929882546421;-8.9881403255276e-05;2.8865636068076e-06;0.00062800938030705;6.0859598306706e-05;-8.7293337855954e-05;1.2886871445517e-05;0.00017786461103242;1.0342428140575e-06;1.1282972081972e-05;-2.1864279915462e-05;-7.2392009315081e-05;7.2058326622937e-05;0.00035679221036844;-4.2469087929931e-05;0.00067230366403237;-0.00032680225558579;-0.00083889148663729;0.00056613917695358;3.0450841222773e-05;2.8339298296487e-05;-0.00012483770842664;-5.545017120312e-05;0.00019276965758763;-0.00029583147261292;3.1665389542468e-05;0.00041679709102027;0.000305423658574;-0.00011344541417202;-0.00014784895756748;-0.00083358370466158;-5.5379579862347e-05;7.1285823651124e-05;-5.068255632068e-05;-0.00030949522624724;0.00031930964905769;-4.3549196561798e-05;-1.2640122804441e-05;0.00018642164650373;8.4123836131766e-05;8.7165426521096e-06;-9.8899727163371e-07;0.00016129310824908;2.6785221052705e-05;0.00028053356800228;-1.4119355910225e-05;0.00023944170970935;3.3675292797852e-05;-4.3633172026603e-06;-4.6408444177359e-05;-0.00011723925854312;-2.1643565560225e-05;0.0002921337436419;-1.3749836398347e-05;0.00019444362260401;3.0719511414645e-05;-5.5713007895974e-05;0.00016960786888376;-2.8079402909498e-05;-0.00012614825391211;-2.7133231924381e-05;-0.0002906744775828;5.3183071031526e-06;-0.00022226134024095;2.0038520233356e-05;-0.0003007473424077;-2.7792100809165e-05;0.00014112344069872;1.9827375581372e-05;-0.00032827092218213;1.6750208260419e-06;3.4062311897287e-05;-3.0381223041331e-05;-3.0567184694519e-06;6.1126207583584e-05;0.0001604892895557;-0.0002959422999993;0.000484487216454;-0.0006035576807335;-0.0007895790040493;0.00090644299052656;-4.9356083763996e-05;4.387809894979e-05;9.1912275820505e-05;-6.3831022998784e-05;0.00030471396166831;-0.00047910292050801;-5.834266266902e-05;-4.3338288378436e-05;-2.1649939299095e-05;5.8643810916692e-05;3.9724927773932e-05;-0.00030882522696629;0.00042387936264277;-1.4836938134977e-05;-3.9006295992294e-05;-0.00036821886897087;0.00055253959726542;2.6469637305127e-05;-3.0833754863124e-05;-9.3424539954867e-05;0.00010491376451682;3.0529768082488e-06;-1.4745898624824e-05;-5.3452440624824e-05;-4.3294057832099e-06;0.00064246804686263;0.00029446271946654;0.00060791755095124;0.00014637227286585;-0.00066013023024425;4.0523576899432e-05;-1.7738160750014e-05;1.280282594962e-05;-0.00013887854584027;-0.00011310356785543;0.00040000068838708;7.4203476287948e-06;0.00016207015141845;0.0007634133216925;0.00048279180191457;-0.00039745992398821;-0.00030188958044164;-0.00099594739731401;-0.00060194154502824;9.3065929831937e-05;2.6133287974517e-05;-0.00053919793572277;-7.8898527135607e-05;3.46465894836e-05;6.7323644543649e-06;8.0554658779874e-05;0.00011328403343214;-4.6353652578546e-06;1.9741282812902e-06;0.00012557857553475;6.4850952185225e-05;0.00021136131545063;0.00017721959738992;6.675115582766e-05;0.00015639580669813;9.3001093773637e-05;-0.00011923153215321;-1.1097327842435e-05;-1.0553982065176e-05;0.00020631778170355;0.00011096338130301;2.5123558771156e-06;7.6562610047404e-05;-5.9536490880419e-05;0.00024546557688154;0.00013268637121655;-9.971737745218e-05;-7.4061696068384e-05;-0.00024972078972496;-0.00027700755163096;-0.00022981215442996;-0.00010761759767774;-0.0001012400680338;-0.00015049608191475;3.4640157537069e-05;1.8694987375056e-05;-0.00014836454647593;-8.1883277744055e-05;4.7818921302678e-05;-4.3106494558742e-05;-1.3177532309783e-05;7.6341973908711e-05;0.00026464500115253;-0.00037053631967865;0.00067686499096453;-0.00080289720790461;-0.0011422779643908;0.0012627316173166;-7.4071780545637e-05;6.365366425598e-05;0.0001197290039272;-8.2745660620276e-05;0.00049823831068352;-0.00064875837415457;-5.7973516959464e-05;-3.2795185688883e-05;-2.1077052224427e-05;4.5532873627963e-05;3.6048648325959e-05;-0.00043555296724662;0.0005397672066465;-2.3988909561012e-06;-5.6036526075331e-05;-0.00057427090359852;0.00072962697595358;4.3293675844325e-05;-4.4928190618521e-05;-0.0001456265890738;0.00014393818855751;-2.6122523877348e-07;-1.3984226825414e-05;-6.8103887315374e-05;-2.3135011360864e-05;0.00079360458767042;0.00046314709470607;0.00071231013862416;0.0003260274825152;-0.00074204400880262;-0.00012402326683514;-1.9946486645495e-05;7.5739030762634e-06;-0.00019749923376366;-0.00015961880853865;0.00047318209544756;0.00010804550402099;0.00022185161651578;0.0010073309531435;0.00064032070804387;-0.00051612657262012;-0.00041379060712643;-0.0012358579551801;-0.0008923132554628;0.0001263493031729;5.7492874475429e-05;-0.00063626299379393;-0.0002216095890617;4.750571315526e-05;1.6016892914195e-05;0.00011430398444645;0.00014951422053855;-6.6869215515908e-06;1.3684705209016e-06;0.00016109690477606;9.7508040198591e-05;0.00032005121465772;0.00028027093503624;0.00011363494559191;0.00022988209093455;7.7225762652233e-05;-0.0001435078738723;-4.2318720261392e-06;-9.9430244517862e-06;0.0002566309121903;0.00017109733016696;1.228096880368e-05;9.3279224529397e-05;-7.4449730163906e-05;0.00039271041168831;0.0002398830401944;-0.00015581872139592;-0.00012258483911864;-0.00040442109457217;-0.00045126266195439;-0.00030322585371323;-0.00017250792006962;-0.00015027190966066;-0.00021481183648575;3.6689696571557e-05;2.3347603928414e-05;-0.00017436446796637;-0.00011886882566614;6.2940380303189e-05;-5.6837016018108e-05;-2.9637414627359e-05;8.6899686721154e-05;0.00036109279608354;-0.00038473698077723;0.00085472094360739;-0.00094608875224367;-0.0015299225924537;0.0016245667356998;-0.0001040436400217;8.4804814832751e-05;0.00014095229562372;-9.2497684818227e-05;0.00073435250669718;-0.00079749280121177;-4.2873620259343e-05;-3.9109381759772e-06;-2.5178896976286e-05;2.5399858714081e-05;3.0762087135372e-06;-0.00053166830912232;0.00059152551693842;2.6353001885582e-05;-7.7044955105521e-05;-0.00080108764814213;0.00085073715308681;6.5426414948888e-05;-6.1284430557862e-05;-0.00021079309226479;0.00018225048552267;-7.5454977377376e-06;-6.6519160100142e-06;-8.3991995779797e-05;-5.9756945120171e-05;0.0008520811679773;0.00068964052479714;0.00071410008240491;0.00063297286396846;-0.00068227673182264;-0.00047490576980636;-1.6838343071868e-05;-9.9581993708853e-06;-0.00027724445681088;-0.00022054419969209;0.00046776153612882;0.00031129209673963;0.00028040341567248;0.0012093397090212;0.00077959889313206;-0.00059620989486575;-0.00052743125706911;-0.0013585039414465;-0.0012444399762899;0.00016902312927414;0.00011848158465;-0.00062625994905829;-0.00047875312156975;5.9270427300362e-05;3.4522974601714e-05;0.00016685818263795;0.00018596550216898;-9.182635039906e-06;-5.956766244708e-07;0.00019733172666747;0.00014181868755259;0.00050475326133892;0.00044953197357245;0.00020298035815358;0.00034591348958202;-1.773436338226e-06;-0.0001642091665417;9.2364607553463e-06;-4.0032823562797e-06;0.00029791964334436;0.00025671435287222;5.3141906391829e-05;0.00010579892114038;-8.223870099755e-05;0.00064278498757631;0.00044456060277298;-0.00025616533821449;-0.00020548886095639;-0.00067666091490537;-0.00075225689215586;-0.00038538430817425;-0.00027131466777064;-0.00024255576136056;-0.00030833864002489;3.616932008299e-05;2.579064857855e-05;-0.00019049474212807;-0.00016378329019062;5.2743693231605e-05;-4.7796111175558e-05;-3.2512456527911e-05;6.1925784393679e-05;0.00031519870390184;-0.00024882153957151;0.00071170518640429;-0.00073672604048625;-0.001296651083976;0.0013294188538566;-9.0018584160134e-05;7.030841516098e-05;0.00011874983465532;-7.8286138887051e-05;0.00065652834018692;-0.00060983386356384;-1.1300277037662e-05;2.4866285457392e-05;-1.909677121148e-05;3.9851784094935e-06;-3.8316513382597e-05;-0.00043661150266416;0.00043170849676244;3.1553565349896e-05;-5.6982487876667e-05;-0.0007037267787382;0.00063328276155517;5.8724210248329e-05;-5.0448201363906e-05;-0.00019158150826115;0.00014801065844949;-1.2815387890441e-05;1.9630811038951e-06;-6.1312930483837e-05;-6.789701001253e-05;0.00061048194766045;0.00066339242039248;0.00046014756662771;0.00070105941267684;-0.00037244372651912;-0.00063295144354925;-4.0301001718035e-06;-1.9702729332494e-05;-0.00024664707598276;-0.00019450500258245;0.00028007925720885;0.00037741890992038;0.00023306041839533;0.00099906011018902;0.00064952537650242;-0.0004689393681474;-0.00045291052083485;-0.0010134021285921;-0.001161644118838;0.00013544014655054;0.00012413501099218;-0.00038307017530315;-0.00054154254030436;4.5568907808047e-05;3.6211618862581e-05;0.00015900700236671;0.00015726311539765;-7.0266769398586e-06;-1.6139083527378e-06;0.00016041696653701;0.00013391874381341;0.00045825351844542;0.00042088315240107;0.00019453388813417;0.00031619693618268;-5.8350760809844e-05;-0.00011180080764461;1.0249590559397e-05;-3.4870470244641e-06;0.00023412461450789;0.00025139591889456;7.4010218668263e-05;8.4887149569113e-05;-6.7146174842492e-05;0.00059060461353511;0.00041805615182966;-0.00023593989317305;-0.00019217582303099;-0.00061862752772868;-0.00070262956432998;-0.00031452055554837;-0.00026234742836095;-0.00023245233751368;-0.00028242336702533;2.8731858037645e-05;2.4534267140552e-05;-0.00014922114496585;-0.00016103456437122;3.0573151889257e-05;-2.852144643839e-05;-2.7381365725887e-05;2.5993282179115e-05;0.00022773578530177;-9.963869524654e-05;0.00045535046956502;-0.00044454995077103;-0.00077929015969858;0.00075632857624441;-5.1485218136804e-05;3.9450351323467e-05;8.2277991168667e-05;-6.3531202613376e-05;0.00041357005829923;-0.00028963631484658;1.8017741240328e-05;4.0498311136616e-05;4.8602632887196e-06;-1.4648822798335e-05;-6.2221108237281e-05;-0.00030418171081692;0.00024555064737797;1.3178962035454e-05;-1.5871592040639e-05;-0.00045984165626578;0.00032153254142031;3.446489063208e-05;-2.4501327061444e-05;-0.00012317068467382;7.9088225902524e-05;-1.502834038547e-05;5.7482020565658e-06;-1.8902888768935e-05;-5.0645918236114e-05;0.00032395296148024;0.00050147686852142;0.00017736917652655;0.00058583758072928;-6.4947234932333e-05;-0.00057025183923542;1.0553743777564e-05;-1.3366387975111e-05;-0.00015225703828037;-0.00011803222150775;7.5210220529698e-05;0.00030415409128182;0.00014621055743191;0.00067466724431142;0.00043497732258402;-0.00029777441523038;-0.00030651004635729;-0.00057766929967329;-0.00088320625945926;5.865842467756e-05;7.8829267295077e-05;-0.00012502576282714;-0.00044082850217819;2.0460416635615e-05;1.9835459170281e-05;0.00011203760368517;0.00010446696251165;-1.9863318811986e-06;-1.5198310165943e-06;9.1100904683117e-05;9.7751981229521e-05;0.00024704955285415;0.00024491161457263;0.0001176545774797;0.00017481556278653;-6.0553982621059e-05;-1.5129959137994e-05;-1.3939985592515e-06;-1.2613677426998e-05;0.00013287582260091;0.00018748069123831;6.24128151685e-05;5.0293288950343e-05;-4.9576305173105e-05;0.00032073564943857;0.00019984015671071;-0.00012548376980703;-0.00010945910617011;-0.00032056079362519;-0.00038182444404811;-0.0001676016690908;-0.00017981026030611;-0.00014647754142061;-0.0001727171766106;2.1091973394505e-05;2.7279342248221e-05;-9.1694266302511e-05;-0.00013689079787582;1.8691764125833e-05;-1.838836215029e-05;-2.9877033739467e-05;7.3742689892242e-06;0.00018105874187313;7.904724952823e-06;0.00032117342925631;-0.00028686237055808;-0.00051018106751144;0.00044489308493212;-2.9205657483544e-05;2.0578878320521e-05;5.93051991018e-05;-5.3479710913962e-05;0.00028613785980269;-8.9542576461099e-05;4.0250753954751e-05;5.6340264563914e-05;2.5355690013384e-05;-2.1313049728633e-05;-9.4243667263072e-05;-0.00024070841027424;0.00013477470201906;6.0324109654175e-06;5.794245225843e-06;-0.00033018048270606;0.00012693418830168;2.0775765733561e-05;-6.7068590396957e-06;-8.4288825746626e-05;3.1602092349203e-05;-1.7628188288654e-05;8.7963344412856e-06;4.3800573621411e-06;-4.761229865835e-05;0.00016740878345445;0.00043986164382659;1.2048530152242e-05;0.00057008775183931;0.00012548181985039;-0.00058759184321389;2.0951179976691e-05;-8.5415585999726e-06;-0.0001086255942937;-8.3397688285913e-05;-4.765700941789e-05;0.00028379930881783;0.00010493197623873;0.0005221456522122;0.00033334791078232;-0.00021393710630946;-0.00023683371546213;-0.000344844564097;-0.00078211765503511;1.8700551663642e-05;6.0303533246042e-05;2.840366687451e-05;-0.00041589874308556;5.6291160035471e-06;8.2285368989687e-06;9.4160190201364e-05;8.601944136899e-05;6.7195128394815e-07;-1.4138828419163e-06;5.6133441830752e-05;8.5404091805685e-05;0.0001433085417375;0.00016693281941116;8.4811552369501e-05;0.00011200215521967;-7.0465983299073e-05;3.6747060221387e-05;-8.5450546976062e-06;-2.1778367226943e-05;7.8062301327009e-05;0.00016445404617116;5.9841378970305e-05;3.8220267015276e-05;-4.1318315197714e-05;0.00019838576554321;9.4772331067361e-05;-7.3808267188724e-05;-7.4949835834559e-05;-0.00017860226216726;-0.00023646018235013;-9.0045265096705e-05;-0.00014468721929006;-0.00010661325359251;-0.00012709389557131;1.8269758584211e-05;3.4203094401164e-05;-6.0444424889283e-05;-0.00013599437079392;9.1896863523289e-06;-1.0420771104691e-05;-3.7048448575661e-05;-4.5199567466625e-06;0.00013630399189424;0.00012654006422963;0.0002118784468621;-0.0001609835162526;-0.00029955108766444;0.0001901220966829;-8.9764826043393e-06;1.4953974414311e-06;3.646382901934e-05;-4.1154049540637e-05;0.00018013129010797;0.00010504214878893;6.2455525039695e-05;7.411644764943e-05;5.1623490435304e-05;-1.7085887520807e-05;-0.00014155526878312;-0.00019358858116902;3.3802381949499e-05;2.1097532680869e-06;2.0697943909909e-05;-0.00021817277593073;-6.0644193581538e-05;8.7830785560072e-06;1.3743858289672e-05;-4.9279387894785e-05;-2.1519026631722e-05;-2.0238987417542e-05;1.1470162462501e-05;2.1989953893353e-05;-5.0871803978225e-05;5.0751848903019e-05;0.00040440107113682;-0.0001175721627078;0.00058927637292072;0.00027980029699393;-0.00063226331258193;3.0124156182865e-05;-1.1629830396487e-06;-8.2011174526997e-05;-6.4079817093443e-05;-0.00014563734293915;0.00027193530695513;7.7109456469771e-05;0.00042211046093144;0.00026710241218098;-0.00015794180217199;-0.00018631538841873;-0.00017377611948177;-0.00073801458347589;-9.0706289483933e-06;5.0492613809183e-05;0.00015045906184241;-0.00040812973747961;-6.3254205997509e-06;-5.8467771850701e-06;8.6596090113744e-05;8.5638814198319e-05;2.3028044324747e-06;-9.0455841927906e-07;3.3061358408304e-05;8.2702004874591e-05;7.4292409408372e-05;0.00012823136057705;6.723910337314e-05;8.565277676098e-05;-8.0877609434538e-05;6.6656954004429e-05;-1.4845290934318e-05;-3.4609260183061e-05;3.6805980926147e-05;0.00015685622929595;5.8630183048081e-05;4.0990911656991e-05;-3.5790060792351e-05;0.00013331774971448;2.8525619200082e-05;-4.4224005250726e-05;-6.084714550525e-05;-8.9989131083712e-05;-0.00016155028424691;-3.3787837310228e-05;-0.00012515002163127;-8.0770776548889e-05;-0.00011147560871905;1.7513390048407e-05;4.653503492591e-05;-3.6428165913094e-05;-0.00014806413673796;3.2504519822396e-06;-6.1623168221558e-06;-5.3252482757671e-05;-1.3783726899419e-05;0.00012239468924236;0.00027551979292184;0.00016399337619077;-8.8106688053813e-05;-0.00018845475278795;1.0617429325066e-05;7.4494723776297e-06;-1.6464038708364e-05;2.4437042156933e-05;-3.8172027416294e-05;0.00012675904144999;0.00031478793243878;9.7005511634052e-05;0.00010906904935837;9.0861532953568e-05;-1.1091389751527e-05;-0.00022596007329412;-0.00019646996224765;-5.4610878578387e-05;-1.1549412874956e-06;3.6476954846876e-05;-0.00016567591228522;-0.0002522032300476;-9.1557438963719e-08;3.7502508348553e-05;-2.9511053071474e-05;-7.895975431893e-05;-2.6687215722632e-05;1.5972404071363e-05;4.1498067730572e-05;-6.6464308474679e-05;-2.629661867104e-05;0.00046093235141598;-0.00024435299565084;0.00074391451198608;0.00046335911611095;-0.00081656139809638;4.3977968744002e-05;7.0949522523733e-06;-8.2029364421032e-05;-6.74839320709e-05;-0.00025492900749668;0.00031298262183554;7.122773968149e-05;0.000440670264652;0.00027928006602451;-0.00015177986642811;-0.00018297351198271;-8.3338702097535e-05;-0.00087457551853731;-3.2165979064303e-05;5.5163807701319e-05;0.00027960393344983;-0.00048452371265739;-1.6937676264206e-05;-2.1820871552336e-05;0.00010220240801573;0.00011504049325595;3.5944415230915e-06;-7.694338677311e-08;2.508733268769e-05;0.00010305061732652;3.8485108234454e-05;0.00014505225408357;6.7658584157471e-05;0.00011015106429113;-0.00010077551269205;8.8775494077709e-05;-2.3492582840845e-05;-5.6705150200287e-05;1.2102615983167e-05;0.00019440533651505;6.7338856752031e-05;6.5340362198185e-05;-4.0035654819803e-05;0.00013131358718965;-1.0699715858209e-05;-3.7052308471175e-05;-7.1925423981156e-05;-4.6186392864911e-05;-0.00017078101518564;1.6105266240629e-06;-0.00014287988597061;-7.6276490290184e-05;-0.0001446037349524;2.1572903278866e-05;7.1510323323309e-05;-2.4687740733498e-05;-0.0002008708397625;-2.99608154819e-06;-2.599983872642e-06;-6.2185448769014e-05;-2.591367228888e-05;8.9035376731772e-05;0.00043201827793382;8.7628999608569e-05;5.6626213336131e-06;-4.5900429540779e-05;-0.00020023924298584;2.7525640689419e-05;-2.4014441805775e-05;1.7164202290587e-05;-4.0085840737447e-05;4.829033423448e-05;0.00052363844588399;0.00012516450078692;0.00014504590944853;0.00014225080667529;2.5378526515851e-06;-0.00030485194292851;-0.00018225119856652;-0.00017327380192;-1.6205569409067e-05;4.7283432650147e-05;-8.1331556430086e-05;-0.00044229289051145;-1.186099689221e-05;4.8827183491085e-05;-9.1957617769367e-06;-0.00011687470396282;-2.5957624529838e-05;1.5113057088456e-05;6.0279893659754e-05;-6.6551008785609e-05;-5.5850421631476e-05;0.00038083776598796;-0.00028601154917851;0.00076231796992943;0.00051351578440517;-0.00082941545406356;4.3574069422903e-05;2.3115320800571e-05;-7.3060829890892e-05;-7.1886679506861e-05;-0.0002860784297809;0.0002100158308167;4.1282630263595e-05;0.00040195291512646;0.00026177152176388;-0.00014073902275413;-0.00011709290265571;-3.4103348298231e-05;-0.00085746665718034;-4.6392560761888e-05;4.5522545406129e-05;0.00031784625025466;-0.00039168243529275;-1.9049750335398e-05;-4.5434135245159e-05;9.9932585726492e-05;0.00016969474381767;2.8310873858572e-06;3.1288614081859e-06;1.9228695236961e-05;0.00012652353325393;-7.3602941483841e-06;0.00020386098185554;4.3066018406535e-05;0.00018173386342824;-6.5508480474818e-05;3.5053584724665e-05;-2.6371388230473e-05;-8.9217923232354e-05;-1.1953468856518e-05;0.00024144908820745;4.3844222091138e-05;0.00015407238970511;-4.5207561925054e-05;0.00014025153359398;-3.4658987715375e-05;-2.2476084268419e-05;-0.00010022938658949;2.959736491448e-07;-0.00022294915106613;2.6259780497639e-05;-0.00016198976663873;-4.0890754462453e-05;-0.00023650597722735;2.3086540750228e-05;0.00010988977737725;-6.7446080720401e-06;-0.00028251210460439;4.4044923015463e-06;9.064307960216e-06;5.5087406508392e-05;8.8845074060373e-05;-0.00084322842303663;-6.8830384407192e-05;-0.00013821003085468;-1.9471322048048e-06;0.00062013015849516;-0.00017337077588309;5.4202482715482e-05;-5.3619645768777e-05;5.5527230870211e-05;-2.2193660697667e-05;-0.0010724972235039;6.4170577388722e-05;-0.00021755276247859;-0.000284477166133;-0.00030460956622846;0.00056713947560638;-1.7689302694635e-05;0.00042261014459655;0.00026494555640966;-0.00011194319085917;4.1341401811223e-05;0.00093447120161727;-2.4649996703374e-05;-8.4501392848324e-05;2.8698179448838e-05;0.00021657109027728;-7.8881093941163e-06;4.2302222027502e-06;-1.783905645425e-05;-6.1151527916081e-05;0.0001203347419505;0.00014608034689445;-2.5044046196854e-05;0.00070233998121694;-0.00034655665513128;-0.00080863939365372;0.00057478545932099;8.560450078221e-05;1.5574900317006e-05;-0.00013889824913349;-4.9491809477331e-05;-0.00015177032037172;-0.00029654146055691;-3.9314236346399e-05;0.00042138766730204;0.00032644724706188;4.8541467549512e-05;-0.00018342092516832;-0.0008647856884636;-6.0469683376141e-05;1.6220608813455e-05;-6.8559827923309e-05;1.1243844710407e-05;0.00032464362448081;-0.00010921583452728;-5.0874245971499e-06;0.00035216531250626;7.7186203270685e-05;1.9698985852301e-05;-2.9883917704865e-06;0.00025467571686022;2.5271436243202e-05;0.00037640618393198;-8.0358811828773e-05;0.00029853126034141;-1.6017652342271e-06;-8.3836675912607e-05;2.2490525225294e-05;-0.00022964447271079;-2.3823906303733e-05;0.00043618917698041;-3.5360430047149e-05;0.00043251004535705;-1.3667008715856e-05;-9.9806980870198e-05;0.00013660108379554;-7.9621830082033e-05;-0.00017161591676995;3.1691659387434e-05;-0.00030076384427957;7.9124096373562e-05;-0.00030063459416851;3.5407956602285e-05;-0.00047441388596781;2.3902075554361e-05;0.00027621310437098;2.2630914827459e-05;-0.00059823936317116;2.5033668862307e-05;8.1660309660947e-06;3.6381748031999e-06;5.6670927733649e-05;7.9846708104014e-05;-0.00067893171217293;-9.7862168331631e-05;-8.3457191067282e-05;-8.137814438669e-05;0.00040192325832322;-2.366941953369e-05;2.5874380298774e-05;-3.6669676774181e-05;6.2091370637063e-05;-2.9298154913704e-05;-0.00080220436211675;-1.6552903616684e-05;-0.00019393440743443;-0.00025077231111936;-0.00024012992798816;0.00047325505875051;4.365693712316e-06;0.00032844438101165;0.0002633590484038;-9.8862947197631e-05;2.6848645575228e-05;0.0007224113214761;5.9946916735498e-05;-4.8754711315269e-05;1.8917915440397e-05;0.00013537240738515;1.1345775419613e-05;7.6576789069804e-06;-2.006888462347e-05;-5.5837899708422e-05;9.8923650512006e-05;0.0002838927321136;-1.4250714230002e-05;0.00071541842771694;-0.0003110957914032;-0.00082353060133755;0.00054270849796012;4.7467437980231e-05;1.8405940863886e-05;-0.00012193000293337;-5.7365814427612e-05;2.637835132191e-05;-0.00027921400032938;-1.0390506304248e-06;0.00046818508417346;0.00033127353526652;-5.5273914767895e-05;-0.00018638656183612;-0.00090189022012055;-9.3071939772926e-05;3.4950568078784e-05;-5.4566768085351e-05;-0.00017366158135701;0.00030078471172601;-6.3472194597125e-05;-5.4844881560712e-06;0.00025972700677812;8.236678695539e-05;1.3458789908327e-05;-9.2723564648622e-07;0.00022634507331531;1.9465776858851e-05;0.0003498631704133;-3.7820111174369e-05;0.00020812496950384;2.8429401936592e-05;-2.5243702111766e-05;-2.2000922399457e-05;-0.00018106172501575;-1.9419432646828e-05;0.00039793580072001;-1.691848228802e-05;0.00036126817576587;1.2912159945699e-05;-8.3646540588234e-05;0.0001212007846334;-4.6534147259081e-05;-0.00016308270278387;2.8394837499945e-05;-0.00023889524163678;2.2984042516327e-05;-0.0002889538591262;1.8662738511921e-05;-0.00041420038905926;-1.1154973435623e-05;0.00022198590158951;2.0636160115828e-05;-0.00051056552911177;8.7572489064769e-06;9.7033080237452e-06;-2.9515463211283e-06;3.4493212297093e-05;5.1095234084642e-05;-0.00032790057593957;-0.00010132506577065;2.8648304578383e-05;-0.00014331350394059;7.8798359027132e-05;0.00013828893133905;4.0289705793839e-06;-1.1368748346285e-05;5.5231288570212e-05;-2.8519330953714e-05;-0.00036116581759416;-9.0713787358254e-05;-0.00011413808533689;-0.00014176654804032;-0.00012548953236546;0.00025752390502021;1.3006167137064e-05;0.00012566748773679;0.00020542215497699;-6.2300052377395e-05;8.2164888226544e-06;0.00031588383717462;0.00012620110646822;-1.8911292499979e-05;4.4481512304628e-06;4.6928609663155e-05;2.6278361474397e-05;5.5312634685833e-06;-1.3887868590245e-05;-3.9691734855296e-05;5.1285922381794e-05;0.0002762206713669;3.459983781795e-05;0.00049055932322517;-0.00014996045501903;-0.00056363426847383;0.00030869475449435;1.767894718796e-05;1.2765512110491e-05;-8.8862165284809e-05;-4.9492216930958e-05;0.00010743278107839;-0.00015512276149821;2.9736065698671e-05;0.00037922352203168;0.00025691720657051;-0.00010645825386746;-0.00014724185166415;-0.00065500347409397;-0.00014317416935228;3.921826282749e-05;-2.5188524887199e-05;-0.00020870163280051;0.00015623717627022;-2.2803045794717e-05;-1.9554945538403e-06;0.00014189301873557;6.3183702877723e-05;5.6342373682128e-06;1.9972458176198e-07;0.0001385072391713;1.9174405679223e-05;0.00022024863574188;1.2370505828585e-05;0.00011119121336378;4.3970001570415e-05;1.1782551155193e-05;-3.9192855183501e-05;-9.2988251708448e-05;-1.1674003872031e-05;0.00024453201331198;1.1034394447051e-05;0.00018625882512424;2.5511879357509e-05;-5.2030103688594e-05;9.8386008176021e-05;-3.402621132409e-06;-0.00010276567627443;4.2323022171331e-06;-0.00015729636652395;-3.4336753742537e-05;-0.00019208125013392;-8.2723208834068e-06;-0.00023462725221179;-3.6497473047348e-05;0.00011793289741036;1.3854021744919e-05;-0.00028835606644861;-1.1299863217573e-05;1.5039384379634e-05;-1.0466496860317e-05;2.0346977180452e-05;4.2328229028499e-05;-0.00011840782099171;-0.00013587959983852;0.00015046921907924;-0.00024848565226421;-0.00019421882461756;0.00033789835288189;-1.4089826436248e-05;7.8919556472101e-06;6.1385435401462e-05;-3.6456131056184e-05;-8.5383362602443e-05;-0.00018835865193978;-7.6159689342603e-05;-8.6564512457699e-05;-6.7524124460761e-05;0.00014745129738003;1.9788745703408e-05;-2.0853696696577e-05;0.0002232971455669;-4.1456449253019e-05;-6.0555112213478e-06;4.8560203140369e-05;0.00022692418133374;5.5160563761092e-07;-7.3019868978008e-06;-1.2157356650278e-05;4.7886962420307e-05;3.9964575080376e-06;-1.1489327334857e-05;-3.5684679460246e-05;2.4408678655163e-05;0.00033459803671576;0.0001056504479493;0.00042935498640873;-2.9979169994476e-05;-0.00048506126040593;0.00016651714395266;8.4361687413548e-07;9.802663953451e-06;-8.8768225396052e-05;-5.9676891396521e-05;0.00018133761477657;-7.5979813118465e-05;6.3685460190754e-05;0.00042075398960151;0.0002756214234978;-0.0001752079842845;-0.00016374183178414;-0.00062907888786867;-0.00025482708588243;5.0536422349978e-05;-4.3818113226735e-06;-0.000271599390544;5.5164735385915e-05;2.485102868377e-06;1.8781631752063e-06;9.2665395641234e-05;6.617604958592e-05;1.1956371963606e-06;7.9655035278847e-07;0.00010723242303357;2.9072130928398e-05;0.00018208612164017;6.2967505073175e-05;7.7491640695371e-05;7.0198424509726e-05;3.2822848879732e-05;-5.6583332479931e-05;-4.7643228754168e-05;-8.6566469690297e-06;0.00018841856217477;4.1559262172086e-05;9.6936353656929e-05;3.8558886444662e-05;-4.3320116674295e-05;0.00012381878332235;4.0700237150304e-05;-8.4131759649608e-05;-2.0378116460051e-05;-0.00015710163279437;-0.00010302774899174;-0.00016940489877015;-3.872180604958e-05;-0.00015545623318758;-6.7151646362618e-05;6.7261295043863e-05;1.2566151781357e-05;-0.00018942449241877;-3.2681156881154e-05;2.7231764761382e-05;-2.310501440661e-05;7.4160020631098e-06;5.1039929530816e-05;5.7515935623087e-05;-0.0002230241370853;0.00035242107696831;-0.00045894004870206;-0.00057211151579395;0.00069233746035025;-3.8354719436029e-05;3.1286512239603e-05;8.512878412148e-05;-5.6106044212356e-05;0.00017272469995078;-0.00036591736716218;-6.2226805312093e-05;-5.707049058401e-05;-3.7560403143289e-05;8.878164953785e-05;2.7922640583711e-05;-0.00019174339831807;0.0003328682796564;-2.6533620257396e-05;-2.4925340767368e-05;-0.0002205345663242;0.00042021737317555;1.9607450667536e-05;-2.2790041839471e-05;-7.2757131420076e-05;8.7201013229787e-05;2.5270016976719e-06;-1.209362562804e-05;-4.5134478568798e-05;3.3676010389172e-06;0.00050738215213642;0.00023890224110801;0.0005157642881386;0.00011150140926475;-0.00056225870503113;4.4874119339511e-05;-1.1436765817052e-05;8.5576439232682e-06;-0.00012522400356829;-9.5651106676087e-05;0.00030201784102246;-1.333135060122e-06;0.00012404914014041;0.00062958139460534;0.00040437505231239;-0.00030769634759054;-0.00025075854500756;-0.00083336839452386;-0.00049257202772424;7.8964345448185e-05;2.0049288650625e-05;-0.00041462434455752;-5.4815820476506e-05;2.5069715775317e-05;7.7118156696088e-06;8.7012762378436e-05;9.5259463705588e-05;-2.5000247205753e-06;1.2664414725805e-06;0.00011832441668957;5.4220570746111e-05;0.00021882109285798;0.00014653928519692;8.1457124906592e-05;0.00012871398939751;5.534233423532e-05;-9.0833862486761e-05;-2.2002292098477e-05;-8.6559539340669e-06;0.00020112912170589;9.2766262241639e-05;4.7043715312611e-05;6.2133389292285e-05;-5.2444145694608e-05;0.00021522397582885;0.00011400456423871;-0.00010189785098191;-5.9141904785065e-05;-0.00023643590975553;-0.00023061125830282;-0.00021107592328917;-9.0491615992505e-05;-0.00013588105503004;-0.00012502442405093;4.4613592763199e-05;1.6142246749951e-05;-0.00016283321019728;-6.7912696977146e-05;3.9120572182583e-05;-3.4622065868462e-05;-5.7091729104286e-06;5.9626327129081e-05;0.00017754205327947;-0.0002712944697123;0.0005219170707278;-0.00061737623764202;-0.00090391817502677;0.0010041098576039;-6.1289385484997e-05;5.0641883717617e-05;0.00010506706894375;-7.025217928458e-05;0.00038426491664723;-0.0005091450875625;-4.9875536205946e-05;-3.1749881600263e-05;-2.6662235541153e-05;5.487841917784e-05;1.7789197954698e-05;-0.00031274757930078;0.00040871030068956;-8.1363523349864e-06;-4.1336377762491e-05;-0.00043630905565806;0.00056100089568645;3.6599332815968e-05;-3.66163731087e-05;-0.0001258351985598;0.00012160745245637;-1.2391903965181e-06;-9.4284550868906e-06;-5.5428132327506e-05;-2.0197057892801e-05;0.00061149708926678;0.00039353370084427;0.00055858539417386;0.0003010417567566;-0.00057482637930661;-0.00015262214583345;-1.4909268429619e-05;7.8647008194821e-07;-0.00017406974802725;-0.00013683745055459;0.00035245806793682;0.00011467088916106;0.00017506511358079;0.00081190443597734;0.0005227456567809;-0.00040138413896784;-0.00033860650728457;-0.00098230724688619;-0.00074805051553994;0.00010784265032271;5.5258507927647e-05;-0.00047474980237894;-0.00020924402633682;3.9313894376392e-05;1.8104878108716e-05;0.00010754510003608;0.00012354635691736;-4.9634672905086e-06;6.8020381149836e-07;0.00013900753401686;8.4196595707908e-05;0.00030803619301878;0.00025096430908889;0.00011907142470591;0.00020069100719411;3.4310531191295e-05;-0.00011320313933538;-6.3214133660949e-06;-6.5996796365653e-06;0.00022546542459168;0.00015171350969467;4.191508560325e-05;7.7843717008363e-05;-6.1230530263856e-05;0.00035400356864557;0.00022621918469667;-0.00014856972848065;-0.00010883060167544;-0.0003789366746787;-0.00040534295840189;-0.00026389880804345;-0.00015439331764355;-0.00016419486200903;-0.00018864989397116;3.5588505852502e-05;1.9048953618039e-05;-0.00016034058353398;-0.0001032800792018;5.6788805522956e-05;-5.0784452469088e-05;-2.3689792215009e-05;7.376323628705e-05;0.00028662878321484;-0.00029598959372379;0.00072870077565312;-0.0007899318006821;-0.0013543916866183;0.0014302926138043;-9.4284107035492e-05;7.5881565862801e-05;0.00013048494292889;-8.2511112850625e-05;0.00065219437237829;-0.00069231487577781;-3.6267476389185e-05;-4.7150535920082e-07;-2.9588414690807e-05;3.6394729249878e-05;-1.7037153156707e-05;-0.00042808064608835;0.00047522954992019;2.1857167666894e-05;-6.6954911744688e-05;-0.00069362513022497;0.00071350729558617;6.0372443840606e-05;-5.6411841796944e-05;-0.00019907712703571;0.00016931547725108;-7.5646144068742e-06;-2.8691849820461e-06;-7.6621865446214e-05;-5.8855745010078e-05;0.00071186397690326;0.00062868843087927;0.0005998500273563;0.00061181804630905;-0.00056183751439676;-0.00050128204748034;-1.5616169548593e-05;-1.7347949324176e-05;-0.00026435399195179;-0.00020891634630971;0.00038368336390704;0.00031893208506517;0.00024293219030369;0.0010466563981026;0.00068319798447192;-0.00050358846783638;-0.00046408514026552;-0.0011583541054279;-0.0011192339006811;0.00016133204917423;0.00012257393973414;-0.00050848635146394;-0.00046721191029064;5.6198776292149e-05;3.8879668863956e-05;0.00016144628170878;0.00016817206051201;-8.2409615060897e-06;-7.8821312854416e-07;0.00018149695824832;0.00013315565593075;0.00050881842616946;0.00044452361180447;0.00021055899560452;0.0003383410803508;-3.5391232813708e-05;-0.00015473588427994;1.1060647011618e-05;-7.5199056936981e-07;0.00027680871426128;0.00024847858003341;7.4611969466787e-05;0.00010255361121381;-7.2268070653081e-05;0.00062804366461933;0.00045650315587409;-0.0002548283082433;-0.00020118577231187;-0.00067708862479776;-0.00074306881288067;-0.00036304423701949;-0.00026405008975416;-0.00025680434191599;-0.0003039407893084;3.3083339076256e-05;2.2108921257313e-05;-0.0001783699990483;-0.00015558997984044;5.2701547247125e-05;-4.7530666051898e-05;-3.0058126867516e-05;5.9482703363756e-05;0.00029094112687744;-0.00022166525013745;0.00068547471892089;-0.0006986407097429;-0.0012791811022907;0.001308056875132;-8.9631568698678e-05;7.0369707827922e-05;0.0001209345064126;-7.8037126513664e-05;0.00064783979905769;-0.00059787195641547;-1.114604765462e-05;2.624919761729e-05;-2.3040773157845e-05;1.2725826309179e-05;-4.8101504944498e-05;-0.00040614444878884;0.00039767083944753;2.9337619707803e-05;-5.582488302025e-05;-0.00068399321753532;0.00060525600565597;5.8765344874701e-05;-5.176287231734e-05;-0.00019596781930886;0.00015279222861864;-1.242431699211e-05;3.1354984457721e-06;-6.253083847696e-05;-6.8917499447707e-05;0.00058582256315276;0.00065431481925771;0.0004462183569558;0.00070554984267801;-0.00035915392800234;-0.00065296614775434;-5.8300702221459e-06;-2.4206439775298e-05;-0.00025325999013148;-0.00020020252850372;0.00026951672043651;0.00038751773536205;0.00022580345103052;0.00096817529993132;0.00063454901101068;-0.00044946634443477;-0.00044166247243993;-0.00098172866273671;-0.001140498323366;0.00014145819295663;0.00013182948168833;-0.00036418260424398;-0.00054563779849559;4.8212234105449e-05;4.0963746869238e-05;0.00016231898916885;0.00015728197467979;-7.1248123276746e-06;-1.504151100562e-06;0.00016200415848289;0.00013570312876254;0.00048453657655045;0.00044276754488237;0.00020606273028534;0.00033273224835284;-7.0617366873194e-05;-0.00012216479808558;1.2657451406994e-05;-1.7874598370327e-06;0.00023911372409202;0.00026003280072473;8.4482082456816e-05;9.2602924269158e-05;-6.6309366957285e-05;0.00061269284924492;0.00044809686369263;-0.0002460085961502;-0.00020011566812173;-0.00065133743919432;-0.00073597411392257;-0.00032409589039162;-0.00027166210929863;-0.00024925867910497;-0.00029992256895639;2.8138418201706e-05;2.3479889932787e-05;-0.00015209455159493;-0.00016512584988959;3.0785478884354e-05;-2.859988308046e-05;-2.4707278498681e-05;2.571028744569e-05;0.00021768931765109;-9.9869073892478e-05;0.00044642598368227;-0.00043404343887232;-0.00077570648863912;0.00075679732253775;-5.1976840040879e-05;4.0741047996562e-05;8.4087754657958e-05;-6.3925515860319e-05;0.00041015492752194;-0.00029885128606111;1.4996359823272e-05;3.8431593566202e-05;1.327538257101e-06;-1.120447905123e-05;-5.9257043176331e-05;-0.00029111027834006;0.00023740106553305;1.1599138815654e-05;-1.6526626495761e-05;-0.00045226933434606;0.0003241412632633;3.4642311220523e-05;-2.6705922209658e-05;-0.00012535684800241;8.5178930021357e-05;-1.3989540093462e-05;5.428681106423e-06;-2.0794532247237e-05;-4.8677797167329e-05;0.00032535282662138;0.00048622119356878;0.00018818871467374;0.00056598550872877;-8.3345985331107e-05;-0.00055114389397204;8.1404914453742e-06;-1.5032596820674e-05;-0.00015356169024017;-0.0001195769145852;8.4962084656581e-05;0.00029595245723613;0.00014296337030828;0.00066038582008332;0.00042818009387702;-0.00029179189004935;-0.00029981034458615;-0.0005781147046946;-0.00085657922318205;6.2497885664925e-05;7.9917874245439e-05;-0.00013454745931085;-0.00042595624108799;2.262045200041e-05;2.2346162950271e-05;0.00011069230095018;0.00010308686614735;-2.2606477614318e-06;-1.3976156196804e-06;9.2444497568067e-05;9.6543408290017e-05;0.00025713737704791;0.00025332919904031;0.00011963969154749;0.00018222778453492;-5.8893794630421e-05;-2.5286639356636e-05;2.8128670237493e-07;-1.0735358046077e-05;0.0001366278011119;0.00018760458624456;6.307916919468e-05;5.455878272187e-05;-4.8782269004732e-05;0.00032875360921025;0.00021201852359809;-0.00012912788952235;-0.00011221802560613;-0.00033314464963041;-0.00039471531636082;-0.00017388309061062;-0.00018109721713699;-0.0001503249804955;-0.00017982076678891;2.0460543964873e-05;2.5382556486875e-05;-9.3364717031363e-05;-0.00013503586524166;1.9561188310036e-05;-1.8779230231303e-05;-2.2816047930974e-05;1.0469409062352e-05;0.00016710290219635;-2.8355778340483e-05;0.00031217923969962;-0.00028705946169794;-0.00051382626406848;0.00047197309322655;-3.2053227187134e-05;2.4658755137352e-05;6.0130503698019e-05;-5.0948416173924e-05;0.00028237636433914;-0.00014292934793048;2.682424201339e-05;4.332098615123e-05;1.3280262464832e-05;-1.7221886082552e-05;-6.7889923229814e-05;-0.00022009195527062;0.00014497441588901;5.5359482757922e-06;-3.6099257272326e-07;-0.00032049475703388;0.00017061832477339;2.1952413590043e-05;-1.3189202036301e-05;-8.589568460593e-05;4.6954148274381e-05;-1.3945865248388e-05;6.5118088059535e-06;-2.9949983400002e-06;-3.9762351661921e-05;0.00018923170864582;0.00038768962258473;6.2047714891378e-05;0.00048279826296493;4.5826425775886e-05;-0.00048886990407482;1.3895289157517e-05;-1.0150276466447e-05;-0.00010513111919863;-8.1164733273908e-05;-2.0045079054398e-06;0.000245034287218;9.9637560197152e-05;0.00048553958185948;0.00031233500340022;-0.00020469988521654;-0.00022022565826774;-0.00036334659671411;-0.00068726163590327;2.7905580282095e-05;5.6644741562195e-05;-2.3405667889165e-05;-0.00035619447589852;1.0147151442652e-05;1.2451457223506e-05;8.4519757365342e-05;7.6941709266976e-05;-2.1220553492185e-07;-1.2245938023625e-06;5.8130481193075e-05;7.5920914241578e-05;0.00015387829625979;0.00016721228894312;8.0859201261774e-05;0.00011519112013048;-5.5398213589797e-05;1.3460939953802e-05;-4.5391857383947e-06;-1.4748479770788e-05;8.4194536611903e-05;0.00014820825890638;5.1960971177323e-05;3.7967831303831e-05;-3.7749567127321e-05;0.0002030877803918;0.00011237651051488;-7.72700223024e-05;-7.3701849032659e-05;-0.000193580344785;-0.00024423154536635;-0.00010138240031665;-0.00013479668996297;-0.00010313743405277;-0.00012445669563022;1.605847319297e-05;2.594136276457e-05;-6.167299579829e-05;-0.00011634673137451;-8.9298646344105e-06;-3.2768562050478e-06;-7.2642185841687e-05;-5.4305735829985e-05;8.50896249176e-05;0.00065932411234826;1.0157326869376e-05;9.7604235634208e-05;0.00010891193232965;-0.00047487346455455;5.8535169955576e-05;4.0884827967602e-07;2.8731959901052e-05;-6.4220010244753e-05;-3.2691332307877e-05;0.00079439528053626;0.00017156594549306;0.00021194329019636;0.0002564784954302;1.320416413364e-05;-0.0004211819905322;-0.00021838430257048;-0.00034769461490214;-5.9761405282188e-05;5.3046092943987e-05;-1.3999775774209e-06;-0.00067449721973389;-2.996875991812e-05;2.6635249014362e-05;2.3320747004618e-06;-0.00011453610932222;-2.2255120711634e-05;1.0807040780492e-05;0.0001014752779156;-4.8877307563089e-05;-5.4734602599638e-05;0.00022769045608584;-0.0003001814475283;0.00080781849101186;0.00052064296323806;-0.00080021389294416;3.1533447327092e-05;5.0836184527725e-05;-6.6125830926467e-05;-6.5006759541575e-05;-0.00028859154554084;-5.3519994253293e-05;-1.8935559637612e-05;0.00039852946065366;0.00025442850892432;-0.00016184156993404;5.5081130767576e-07;-1.9531633370207e-05;-0.00087578827515244;-6.0147132899147e-05;5.0922490117955e-06;0.00032436923356727;-0.0001785340718925;-1.3264478184283e-05;-8.8085325842258e-05;9.346533624921e-05;0.00028839512378909;3.0882006285537e-06;8.4711155068362e-06;5.2497166507237e-06;0.00019572301243898;-7.2399852797389e-05;0.00030984974000603;1.4008477592142e-05;0.00022590113803744;-6.774717803637e-06;-4.1176535887644e-05;-2.7287871489534e-05;-0.00016700012201909;-3.9754064346198e-05;0.00035941056557931;2.5780952910281e-06;0.00037633665488102;-7.102100062184e-05;0.00011051963520003;-6.8978974013589e-05;4.0176033508033e-05;-0.00015790623729117;5.5728072766215e-05;-0.00023221806623042;4.9439644499216e-05;-0.0002219984162366;1.1432721294113e-05;-0.00040800048736855;2.5755431124708e-05;0.00021022255532444;1.7843349269242e-05;-0.00050721783190966;-1.4400622603716e-05;-8.7912655999389e-07;-8.2925769675057e-05;-5.7885223213816e-05;6.0248850786593e-05;0.00081281294114888;-5.9756956034107e-05;0.00014360206841957;0.00024360086536035;-0.00068786996416748;8.1116806541104e-05;-1.3106486221659e-05;2.3645890905755e-05;-6.9359084591269e-05;-0.00011030628229491;0.0010457348544151;0.00019518354383763;0.00023996431264095;0.0003298623196315;3.86676438211e-05;-0.00050512904999778;-0.0002272723504575;-0.00044306396739557;-8.2173995906487e-05;6.0555255913641e-05;8.0857091234066e-05;-0.00085571355884895;-4.2575087718433e-05;4.9556023441255e-05;2.2541278667632e-05;-0.00017553224461153;-1.8354552594246e-05;6.7150031100027e-06;0.00012346186849754;-4.6307279262692e-05;-5.341244104784e-05;8.5531231889036e-05;-0.0003098564047832;0.00078541698167101;0.00052356015658006;-0.00075821037171409;2.6397663532407e-05;8.3423001342453e-05;-5.6047592806863e-05;-7.3568495281506e-05;-0.00029095442732796;-0.00025564263341948;-6.1099723097868e-05;0.00034880195744336;0.00024327471328434;-0.00015725899720564;0.00010170334280701;-4.484062174015e-06;-0.00081876636249945;-7.4657204095274e-05;-1.7690281310934e-05;0.00032764524803497;1.147138664237e-05;-1.216703276441e-05;-0.0001319984003203;8.7097185314633e-05;0.00038597651291639;1.962180249393e-06;1.3143649084668e-05;7.7446475188481e-06;0.00022381628514268;-0.00012721063103527;0.00035719640436582;-1.6361209418392e-05;0.00034553534351289;4.674765659729e-05;-0.00011727413220797;-3.3200867619598e-05;-0.00020957273954991;-6.229192513274e-05;0.0004075990000274;-3.1138450140134e-05;0.00046156608732417;-8.5260231571738e-05;0.0001324447512161;-0.00010573622421362;4.8575249820715e-05;-0.00017603804008104;0.00011656065180432;-0.00031716853845865;7.3182774940506e-05;-0.00023957653320394;5.4894630011404e-05;-0.00049325334839523;2.8663669581874e-05;0.00026123019051738;3.6575554986484e-05;-0.00060335587477311;1.2350168617559e-05;1.0078672858072e-05;8.1834165030159e-05;9.904562466545e-05;-0.001090178382583;-8.3846047346015e-05;-0.00021571517572738;4.7851990530035e-05;0.00087261735461652;-0.00028958384064026;6.9579082264681e-06;-7.2494964115322e-05;6.2713355873711e-05;-4.2865645809798e-05;-0.0013390585081652;0.00011220169835724;-0.00026939489180222;-0.00037929907557555;-0.00043328068568371;0.00069985963637009;-1.4121750609775e-05;0.00061246665427461;0.0003321964177303;-9.7422911494505e-05;7.5226191256661e-05;0.0011714937863871;-6.587818643311e-05;-3.5355755244382e-05;4.0543269278714e-05;0.00019373538088985;-2.6765462735057e-06;-9.6305348051828e-07;-1.5122350305319e-05;-2.6285131752957e-05;0.0001697737025097;-1.2852985491918e-05;-1.433155284758e-05;0.00076775054913014;-0.00036849224125035;-0.00080206111306325;0.0005931505584158;0.00011172840459039;2.0861436951236e-06;-0.00011745975643862;-5.0067261327058e-05;-0.00046048386138864;-0.00030281028011814;-0.00011340306082275;0.00045103247975931;0.00034996058093384;0.00017890313756652;-0.00021863252914045;-0.00093637243844569;-6.7515204136726e-05;-5.6859109463403e-05;-8.1934027548414e-05;0.00027177151059732;0.00033677800092846;-0.00014349298726302;3.5507869142748e-06;0.00047700357390568;7.56495501264e-05;2.9891427402617e-05;-3.9147253119154e-06;0.00035887729609385;2.1028701667092e-05;0.00049391639186069;-0.00014009252481628;0.00033560398151167;-3.7252029869705e-05;-0.00015809960314073;8.831584273139e-05;-0.00033689374686219;-2.4785489586066e-05;0.00061358069069684;-5.942227653577e-05;0.00069285475183278;-5.7700795878191e-05;-0.00014991156058386;9.5575051091146e-05;-0.00011515297956066;-0.00022146986157168;0.00010133361502085;-0.00030394506757148;0.000138259070809;-0.00041067562415265;4.779497612617e-05;-0.00066216959385201;7.6577307481784e-05;0.00040994246955961;2.6598016120261e-05;-0.00089876441052184;5.0100799853681e-05;1.4262831427914e-05;4.3910458771279e-06;7.7227727160789e-05;7.5372350693215e-05;-0.00080946669913828;-9.2742397100665e-05;-0.00016405546921305;-1.653391882428e-05;0.00057745474623516;-0.00013509186101146;-2.5749504857231e-05;-4.8420075472677e-05;6.1554572312161e-05;-4.5578395656776e-05;-0.00090724532492459;3.2969324820442e-05;-0.00021483551245183;-0.00030656106537208;-0.00031632202444598;0.00052454846445471;1.2289982805669e-05;0.00047013306175359;0.00027490951470099;-7.2865921538323e-05;5.4178308346309e-05;0.00083427253412083;9.414578016731e-06;1.0686618225009e-05;2.754634442681e-05;7.8559045505244e-05;1.5697161870776e-05;2.6759794309328e-06;-1.5212132893794e-05;-1.0569382538961e-05;0.00012845546007156;0.00010753092647064;-9.5651075753267e-06;0.00066632684320211;-0.00028937685419805;-0.00069749733665958;0.00048417679499835;5.2525243518176e-05;3.992375695816e-06;-7.9644210927654e-05;-4.8439713282278e-05;-0.00022981871734373;-0.00024708890123293;-6.8315202952363e-05;0.00042105323518626;0.00029735345742665;6.2728104239795e-05;-0.00018495066615287;-0.00082689354894683;-7.6824610005133e-05;-3.4407512430334e-05;-5.8860867284238e-05;6.5719767007977e-05;0.00027218219474889;-7.0619971666019e-05;2.88008732241e-06;0.00031242979457602;6.8054527218919e-05;1.9771232473431e-05;-1.0912677907982e-06;0.00028654528432526;8.3499535321607e-06;0.00042475856025703;-8.9129353000317e-05;0.00020440630032681;-1.0466633284523e-05;-9.0199384430889e-05;4.2049949115608e-05;-0.00024449630291201;-1.641967719479e-05;0.00051100604468957;-3.7872901884839e-05;0.00055653654271737;-2.9510280000977e-05;-0.00011304249346722;5.838306969963e-05;-7.084957906045e-05;-0.00019237205560785;9.3566704890691e-05;-0.00020076749206055;7.5983894930687e-05;-0.00035496306372806;2.8815866244258e-05;-0.00054542510770261;4.0331058698939e-05;0.0003026710182894;2.0706704162876e-05;-0.00070839608088136;3.1119474442676e-05;-6.8659714997921e-06;-5.6310514082725e-06;-5.1145067118341e-05;-5.6122862588381e-05;7.0963775215205e-05;0.00056121271336451;-1.1012542927347e-05;0.0001194533178932;0.00011825088586193;-0.00043481940519996;5.158147905604e-05;3.2440846553072e-05;3.6362234823173e-05;-5.8126024669036e-05;-3.8741723983549e-05;0.00063302071066573;0.00014191010268405;0.00019209604943171;0.00023101129045244;1.5564810382784e-06;-0.00034147436963394;-0.00017701511387713;-0.00034129960113205;-6.5233994973823e-05;2.9113816708559e-05;1.0246327292407e-05;-0.00055325136054307;-2.8387790734996e-05;-1.8152242773795e-05;-4.0225340853794e-06;-3.7918329326203e-05;-1.419584168616e-05;5.937259629718e-06;9.3813767307438e-05;-1.365353455185e-05;-3.3485877793282e-05;0.00010057882172987;-0.00021220941562206;0.00060836132615805;0.00036577167338692;-0.00055745843565091;1.4798893971602e-05;3.6145633202977e-05;-4.8018959205365e-05;-2.9969152819831e-05;-0.00020139265689068;-0.00016003980999812;-4.644058572012e-05;0.00029832683503628;0.00018234070739709;-0.00012886221520603;4.6966688387329e-05;-1.9567965864553e-05;-0.0006490153609775;-4.6328594180522e-05;-2.2949150661589e-05;0.00022842228645459;-3.7275789509295e-05;-4.4945122681384e-06;-6.8034765718039e-05;6.5166277636308e-05;0.00024676250177436;3.1165607197181e-06;8.164060091076e-06;-5.3155763453105e-06;0.00018100580200553;-7.9644552897662e-05;0.00028800830477849;-4.262896709406e-06;0.00016760862490628;2.5170349545078e-05;-6.6302185587119e-05;-1.8377000742476e-05;-0.00015635826275684;-4.0437782445224e-05;0.00033479640842415;-1.9238294044044e-05;0.00039846947765909;-6.7325294367038e-05;5.4095362429507e-05;-5.9138772485312e-05;7.0008856710047e-05;-0.00014581860159524;5.9652211348293e-05;-0.00015882655861787;4.19554344262e-05;-0.00020513277559076;3.3965909096878e-05;-0.00039024482248351;1.9915001757909e-05;0.0002006108261412;2.4199911422329e-05;-0.00049431977095082;-1.0822666808963e-05;-8.0072331911651e-06;-7.5427080446389e-05;-8.0860409070738e-05;9.6578725788277e-05;0.0008423700928688;-3.2395641028415e-05;0.00018608642858453;0.00020091830810998;-0.00067280733492225;7.888951950008e-05;4.8076526582008e-05;5.07184813614e-05;-7.9761863162275e-05;-7.3240073106717e-05;0.00095813150983304;0.00020835977920797;0.0002833298931364;0.00034897125442512;6.929260052857e-06;-0.00050778524018824;-0.00025594001635909;-0.00051580369472504;-9.8426280601416e-05;3.7235993659124e-05;3.3513035305077e-05;-0.00083505758084357;-4.3522864871193e-05;-2.6988935132977e-05;-9.8794828318205e-07;-6.2273975345306e-05;-1.963601243915e-05;7.7399990914273e-06;0.00014046509750187;-1.5645420717192e-05;-5.1954593800474e-05;0.00011696486035362;-0.00030939115094952;0.0008746616076678;0.00052790739573538;-0.00079058634582907;1.9735383830266e-05;5.6357777793892e-05;-6.7043845774606e-05;-3.8110792957013e-05;-0.00029119098326191;-0.0002744048833847;-7.7468408562709e-05;0.00041945721022785;0.00025623312103562;-0.00018392648780718;8.8079155830201e-05;-1.9382501704968e-05;-0.00092481350293383;-6.8800989538431e-05;-4.1844003135338e-05;0.00033128587529063;-1.6963200323517e-05;-6.2629183048557e-06;-0.00010487087274669;9.2372800281737e-05;0.00037103667273186;4.5116717046767e-06;1.2663354027609e-05;-9.2269283413771e-06;0.00026895821793005;-0.00012765869905706;0.00042429799214005;-1.2010118553007e-05;0.00025325434398837;4.6237921196735e-05;-0.00010794471018016;-2.7552330720937e-05;-0.00023607288312633;-6.4888125052676e-05;0.00049548095557839;-3.5262466553831e-05;0.00059967156266794;-0.00010073400335386;7.5344389188103e-05;-9.2569913249463e-05;0.00010784294863697;-0.00021485294564627;9.8040232842322e-05;-0.00023412590962835;6.6807573603e-05;-0.00030111687374301;5.9219048125669e-05;-0.00058017764240503;2.94253386528e-05;0.00030270774732344;4.0111666748999e-05;-0.00074038142338395;-1.7526033843751e-05;-6.4544910856057e-06;-9.6993084298447e-05;-8.6365202150773e-05;8.0766083556227e-05;0.0011033233022317;-0.00010991713497788;0.00023910317395348;0.00036809523589909;-0.00098003714811057;0.00011200501467101;3.4297623642487e-05;4.7159319365164e-05;-8.5321160440799e-05;-0.0001659108675085;0.0013586160494015;0.00025386360357516;0.00033973203971982;0.00047224113950506;4.1321731259814e-05;-0.0006572573329322;-0.00029968781745993;-0.00066465686541051;-0.00013168403529562;4.180133328191e-05;0.0001272418157896;-0.001127565628849;-6.1379316321108e-05;1.4347021988215e-06;2.3508429876529e-05;-0.00015375444490928;-1.7642361854087e-05;3.9987994568946e-06;0.00018059198919218;-1.579879426572e-05;-5.9143272665096e-05;-2.0986628442188e-05;-0.00036155013367534;0.00095852848608047;0.00059997808421031;-0.00084267155034468;1.7333142750431e-05;0.00010328867210774;-6.4899351855274e-05;-4.7722034651088e-05;-0.00033231390989386;-0.00053723895689473;-0.00013259690604173;0.00041330346721224;0.0002758571645245;-0.00019935837190133;0.00020973285427317;-2.3520778995589e-06;-0.000976259005256;-9.2989597760607e-05;-7.651172199985e-05;0.00037901441100985;0.00019036322191823;-6.6446018536226e-06;-0.00017218462016899;9.7871736215893e-05;0.00052900187438354;3.8071741528256e-06;1.9526949472493e-05;-4.2351121010142e-06;0.00032952596666291;-0.00020350633712951;0.00050664425361902;-4.4936292397324e-05;0.00042328421841376;0.00010684036533348;-0.00019856386643369;-3.9649676182307e-05;-0.000311524461722;-9.8412565421313e-05;0.00059723417507485;-7.4697840318549e-05;0.00074219814268872;-0.00013042298087385;0.00011414894106565;-0.0001489349961048;0.00012270378647372;-0.00024985111667775;0.00017940123507287;-0.00036149960942566;0.00010326297342544;-0.00034951735869981;0.00011223188630538;-0.00071770406793803;3.716491846717e-05;0.00039526310865767;6.5558604546823e-05;-0.00092534039868042;3.0090199288679e-05;4.4675311983156e-06;7.6497548434418e-05;7.7413576946128e-05;-0.0012316696811467;-7.3374263592996e-05;-0.00031614548061043;0.00014955049846321;0.0010772658279166;-0.0004337866557762;-0.00014338378969114;-8.0540456110612e-05;-4.2260027839802e-05;-6.6131084167864e-05;-0.0013462562346831;0.00017523557471577;-0.00025135951000266;-0.00042815099004656;-0.00054976687533781;0.00069565669400617;-1.0496786671865e-05;0.00081183493603021;0.00033492408692837;8.7628948676866e-05;0.00011657342110993;0.0012328120646998;-0.00013886594388168;0.00014171806105878;4.6815101086395e-05;4.5419415982906e-05;8.2843280324596e-06;-1.1842258572869e-05;-2.0132997633482e-06;9.8167438409291e-05;0.00021472560183611;-0.00035465849214233;-4.3353184082662e-06;0.00061811326304451;-0.00026236983831041;-0.00040775461820886;0.00037047214573249;0.00010280874266755;-3.4530279663159e-05;5.8088895457331e-05;-3.4697783121374e-05;-0.001016617519781;-0.0001839569886215;-0.00025051564443856;0.00032756742439233;0.00022403347247746;0.000396632385673;-0.00020129169570282;-0.0007148003205657;-2.2824971892987e-05;-0.00024900984135456;-6.7696390033234e-05;0.00073768047150224;0.00022246658045333;-0.00014636311971117;2.3703860279056e-05;0.000529664917849;4.1153201891575e-05;4.3972846469842e-05;-4.508778147283e-06;0.00046254676999524;-2.7818105081678e-06;0.00052802579011768;-0.00022316687682178;0.00021060017752461;-0.00010827709775185;-0.00025259831454605;0.00020626660261769;-0.00046511940308847;-1.5169209291344e-05;0.00078226102050394;-0.00010189961176366;0.0010464428924024;-0.00014428052236326;-0.00021527872013394;-7.5676041888073e-05;-0.00013953649613541;-0.00023186282487586;0.00024414106155746;-0.00012174573930679;0.00020894467888866;-0.00049677980132401;5.8924870245392e-05;-0.0007922500371933;0.00017931171169039;0.0005749388365075;2.6000687284977e-05;-0.0012784017017111;9.6955118351616e-05;3.1569787097396e-05;5.9693934417737e-06;0.00011388640996302;9.5538089226466e-05;-0.00136185484007;-0.00010759641008917;-0.00035206886241212;0.00010400163591839;0.0011274936841801;-0.00040028555667959;-0.00012940229498781;-8.6877735157032e-05;2.7867152311956e-05;-8.2873717474286e-05;-0.0014763328945264;0.00014609971549362;-0.00031376138213091;-0.00050483911763877;-0.00058171874843538;0.00080820539733395;1.2556160982058e-05;0.00089149846462533;0.00039594940608367;5.113523457112e-06;0.00012069175136276;0.0013667580205947;-9.3734204710927e-05;0.00012244092067704;5.1910745241912e-05;4.2567226046231e-05;2.122821751982e-05;-7.233838459797e-06;-1.0058040061267e-05;7.7924370998517e-05;0.00023195792164188;-0.00021391222253442;-5.9457825045683e-06;0.00080901710316539;-0.00035072406171821;-0.00068466475931928;0.00053939444478601;9.095963469008e-05;-2.330220559088e-05;-3.5564814879763e-06;-5.0994894991163e-05;-0.00086802075384185;-0.00027176787261851;-0.00023039344523568;0.00046877260319889;0.00033217770396732;0.00033010958577506;-0.0002454528294038;-0.00096871663117781;-6.630492862314e-05;-0.00020321883494034;-8.5666702943854e-05;0.00058984843781218;0.00031343835871667;-0.00012642332876567;1.9586210328271e-05;0.00054609245853499;6.70788140269e-05;4.2001931433333e-05;-2.8358069812384e-06;0.00050621142145246;-1.2111115665903e-06;0.00067115854471922;-0.0002230722020613;0.00028733228100464;-9.3279697466642e-05;-0.00025172191089951;0.00018656491010915;-0.00046945258509368;-1.9970178982476e-05;0.00089453865075484;-9.7748037660494e-05;0.0011088472092524;-0.00012796020018868;-0.00022101137437858;-2.8355980248307e-05;-0.00014572900545318;-0.00029226692277007;0.00024110602680594;-0.0002152483939426;0.00020843994570896;-0.00059234071522951;6.151258276077e-05;-0.00093927839770913;0.00016137650527526;0.00058338273083791;3.0638908356195e-05;-0.0013518909690902;9.0261928562541e-05;2.7528491045814e-05;1.1787118410211e-06;0.00010078646300826;6.4495317928959e-05;-0.00093495042528957;-0.00010404317436041;-0.00026563607389107;1.9075081581832e-05;0.00070283829700202;-0.00019371055532247;-0.00012203642108943;-5.3965246479493e-05;4.5809327275492e-05;-7.7108124969527e-05;-0.00090363220078871;4.6436525735771e-05;-0.00023442678502761;-0.00038304584450088;-0.00038836209569126;0.0005617180140689;4.015008744318e-05;0.00064619962358847;0.00029358980827965;-7.2436873779225e-06;8.3363462181296e-05;0.00089594558812678;-1.2909382576254e-06;0.00012575264554471;3.4375210816506e-05;-5.7200715673389e-05;3.7409528886201e-05;-9.2482838454089e-07;-1.1496066690597e-05;7.0533489633817e-05;0.00016121490625665;-2.1777965230285e-05;-3.2145851491805e-06;0.00064273341558874;-0.00025660506798886;-0.00057941843988374;0.00041767721995711;1.6214051356656e-05;-1.2547304322652e-05;4.7572902985848e-06;-4.6128363464959e-05;-0.00045146828051656;-0.00021138707234059;-0.00014386801922228;0.00040605769027025;0.00026864622486755;0.00014678793377243;-0.00018501216254663;-0.00078848656266928;-7.7369622886181e-05;-0.00012761769175995;-5.8770332543645e-05;0.00025112411822192;0.00023970189795364;-2.8529180781334e-05;1.3709918675886e-05;0.00030718275229447;5.8280595112592e-05;2.4777114958852e-05;9.6600388133083e-07;0.00036652872222476;-1.0770557310025e-05;0.00055018079001456;-0.00014212485984899;0.00016613975458313;-5.0728187488858e-05;-0.00015214396989904;0.00010862795897992;-0.00030195742147043;-1.1727197488653e-05;0.00069044379051775;-6.0789825511165e-05;0.00081112160114571;-7.518169877585e-05;-0.00015087978681549;-3.3901931601577e-05;-8.6944302893244e-05;-0.0002363528474234;0.00018709266441874;-0.00013565216795541;0.00012411134957802;-0.00047623351565562;3.6777797504328e-05;-0.00072994170477614;9.5815332315397e-05;0.00038305734051391;2.2049835024518e-05;-0.0009677893249318;5.5429201893276e-05;-9.0037501649931e-06;-1.6555290130782e-05;-5.9901580243604e-05;-9.5842573500704e-05;9.7000847745221e-05;0.0009439613786526;-7.8664081229363e-05;0.00029762854683213;0.00027787056751549;-0.00081034319009632;8.8039698312059e-05;0.00012747582513839;7.6577591244131e-05;-6.1223312513903e-05;-0.00010471964924363;0.00095704052364454;0.00021371092589106;0.00034171686274931;0.00040892267134041;-1.1932821507799e-05;-0.00052500539459288;-0.00025700283003971;-0.00068079686025158;-0.00013267307076603;-2.6712679755292e-05;6.3318417232949e-05;-0.00088863127166405;-5.3235056839185e-05;-0.00012733766925521;-1.068161236617e-05;5.699876419385e-05;-1.3142007446731e-05;2.9340692435653e-06;0.00017063738778234;5.6553824833827e-05;-5.0953680329258e-05;-3.3691587304929e-05;-0.00027172052068636;0.00082385737914592;0.00044964958215132;-0.00063780171331018;-4.1776070247579e-07;2.9356637242017e-05;-6.0756963648601e-05;3.9888986066217e-05;-0.00024833175120875;-0.00051392830209807;-0.0001528900465928;0.00037957238964736;0.00020756146113854;-0.00017376631149091;0.00017664759070612;-8.0481186159886e-06;-0.00083892775001004;-6.5152467868757e-05;-0.00011632855603239;0.00029073204495944;0.00017816830950323;4.7300418373197e-06;-8.1983213021886e-05;7.7828604844399e-05;0.00037972247810103;7.5898669820162e-06;1.5376454030047e-05;-3.3751173759811e-05;0.00033231027191505;-0.00018792954506353;0.00051680812612176;-4.6119926992105e-05;0.00021838120301254;0.00010918123007286;-0.00017174438107759;-2.4031454813667e-05;-0.00028828426729888;-9.4836410426069e-05;0.00062445679213852;-8.3174425526522e-05;0.00082530482904986;-0.00012996517762076;-8.7629368863418e-06;-0.00010946718248306;0.00020024899276905;-0.00025663070846349;0.00014147050387692;-0.00016896016313694;8.4143044659868e-05;-0.00038018764462322;0.0001194389842567;-0.00072417879709974;3.1139639759203e-05;0.0003789272159338;6.7834116634913e-05;-0.00096458703046665;-1.5414769222843e-05;-2.1646976165357e-05;-8.924013673095e-05;-0.00011916939547518;0.00010489894339116;0.0014032706385478;-0.00017712661065161;0.00041891617001966;0.00050589756574482;-0.00129334628582;0.00013812397082802;0.00016777675773483;9.2597372713499e-05;-6.1536855355371e-05;-0.00021879840642214;0.0015284189721569;0.00029608811018988;0.00047206570161507;0.00063002965180203;1.7780865164241e-05;-0.00077074259752408;-0.00035742885665968;-0.00099054526071995;-0.00019860139582306;-6.067075082683e-05;0.00017063558334485;-0.0013494968879968;-8.1489502917975e-05;-0.00015961124154273;8.539072041458e-06;9.8266900749877e-06;-1.1547669600986e-05;-1.8311504845769e-06;0.00025249150348827;8.7946529674809e-05;-6.9040346716065e-05;-0.00021044714958407;-0.00036471179919317;0.0010682727443054;0.00058278394863009;-0.00076619460014626;-1.0250395462208e-05;7.9572273534723e-05;-7.058672781568e-05;7.1120579377748e-05;-0.0003228414861951;-0.00096060993382707;-0.00025774913956411;0.00044539215741679;0.00025162627571262;-0.00022521903156303;0.00035472214221954;1.3274478078529e-05;-0.0010466709500179;-9.6950810984708e-05;-0.00020354238222353;0.00038143611163832;0.00047137151705101;9.1021993284812e-06;-0.00016841312753968;9.4760966021568e-05;0.00062273320509121;9.014698662213e-06;2.6517896912992e-05;-4.223063660902e-05;0.00047809421084821;-0.00031212004250847;0.00070335058262572;-9.2507340013981e-05;0.00039272612775676;0.00020158964616712;-0.00030026028980501;-3.9545575418742e-05;-0.00044294385588728;-0.00015467884077225;0.00087385973893106;-0.0001496259792475;0.0011893732007593;-0.00019608600996435;-4.4368061935529e-06;-0.00018970987002831;0.00028368926723488;-0.00034772398066707;0.00025416316930205;-0.00028458700398915;0.00013982357631903;-0.0005169014330022;0.00020898133516312;-0.0010168157750741;4.5696277084062e-05;0.00057783391093835;0.00011386727419449;-0.0014084074646235;-1.1013887160516e-05;-2.2728370822733e-05;-6.7840912379324e-05;-9.1048263129778e-05;7.4687726737466e-05;0.0012274329783395;-0.00019077937758993;0.00038956184289418;0.00048749608686194;-0.001170699018985;0.00012038789282087;0.00018402909336146;7.935053872643e-05;-6.9121019805607e-06;-0.00021787118748762;0.0013017709134147;0.00023594689264428;0.00040439539588988;0.00056772347306833;2.3115697331377e-05;-0.00064402137650177;-0.00029352362616919;-0.00089739059330896;-0.00018094798724633;-0.00011791817087214;0.00018349710444454;-0.0011629795189947;-7.1350659709424e-05;-0.00018790501053445;1.1553723197721e-05;4.3980464397464e-05;-3.1121248866839e-06;-6.2967296798888e-06;0.00022738252300769;0.0001156898579211;-6.0156988183735e-05;-0.00030081599834375;-0.00027020424022339;0.00083231145981699;0.00041029791464098;-0.0004874496080447;-2.5329341951874e-05;6.7039130954072e-05;-5.0858379836427e-05;0.00012239284114912;-0.00022768403869122;-0.0010143120307475;-0.00026572679053061;0.00032069772714749;0.0001565263082739;-0.00017719694005791;0.00037225091364235;3.5011435102206e-05;-0.0007801127503626;-7.314244430745e-05;-0.00023111818882171;0.00027778817457147;0.00056014832807705;1.5244147107296e-05;-0.00015190271369647;6.4215302700177e-05;0.00054842320969328;8.0419240475749e-06;2.5697780074552e-05;-4.7752149839653e-05;0.00043318365351297;-0.00030009384499863;0.0005978888948448;-9.988035162678e-05;0.00029078466468491;0.00020937503722962;-0.00028695436776616;-3.1369367206935e-05;-0.00041481430525891;-0.0001514923205832;0.00077500916086137;-0.00015852756041568;0.0011143422452733;-0.00018322645337321;-5.9160742239328e-05;-0.00017071318870876;0.00029003358213231;-0.00030023368890397;0.00023982147104107;-0.00017937066149898;0.00012970523675904;-0.00045123518793844;0.00021675718016922;-0.00088743213564157;3.9184618799482e-05;0.00054398452630267;0.00011551864008652;-0.0013070723507553;4.7700301365694e-05;-1.1308416105749e-05;-1.5874788005021e-05;3.1972344004316e-05;-0.0010903982911259;-3.0694463930558e-05;-0.00036859521060251;0.00016222397971433;0.00085573963588104;-0.00035852254950441;-0.00031545350793749;-4.6210585423978e-05;-0.00033307904959656;-6.3582323491573e-05;-0.00081186345778406;0.00013402698095888;-0.00012568748206832;-0.00035069903242402;-0.00046414625830948;0.00048245396465063;-1.1157018889207e-05;0.00081580178812146;0.00021302582172211;0.00045783721725456;9.7907999588642e-05;0.0009540751343593;-0.000124463942484;0.00036722677759826;2.6513105694903e-05;-0.00015101840835996;2.6249730581185e-05;-1.0254306289426e-05;4.8304950723832e-06;0.00023345119552687;0.00018747260037344;-0.00035468960413709;-3.8588797906414e-05;0.00044440041529015;-0.00012044761388097;-1.7747683159541e-05;0.00011741183698177;-2.5915525839082e-05;-5.5789038015064e-05;0.00033112833625637;-3.2718842703616e-05;-0.001074785948731;-5.8965204516426e-05;-0.00028782678418793;0.00020106500596739;3.4275715734111e-05;0.00035058447974734;-0.0001244346058229;-0.00045009003952146;5.3563435358228e-05;-0.0003826089669019;-1.6540978322155e-05;0.00067876337561756;9.8982920462731e-05;-2.0371553546283e-05;3.4394506656099e-05;0.00028305160230957;1.8399570762995e-05;4.7853227442829e-05;-2.1091716462251e-06;0.00043805755558424;-3.7570411222987e-05;0.00040132476715371;-0.00022370420629159;-9.3574206402991e-05;-0.00012945209164172;-0.00020810491696466;0.00022301892749965;-0.00045399405644275;-6.9698995730505e-07;0.00077121198410168;-0.00012353851343505;0.0011165778851137;-0.00017220579320565;-0.00022496124438476;-0.00026778451865539;-9.8052514658775e-05;-0.00016892513667699;0.00034327185130678;0.00017609879432712;0.00018337721121497;-0.00046923046465963;5.3796218708158e-05;-0.00066223077010363;0.0002170425868826;0.00056869036052376;2.3224058168125e-05;-0.0013448478421196;0.00011743744835258;6.2179722590372e-05;-8.7080861703726e-06;8.4863830124959e-05;5.885128484806e-05;-0.0015107392100617;-9.6615833172109e-05;-0.00053747213678434;0.00016925027011894;0.0012047606287524;-0.00045490494812839;-0.00038285829941742;-7.5365787779447e-05;-0.00019742366566788;-0.00011642544268398;-0.001197011792101;0.00015137471200433;-0.00026904523838311;-0.00057282880879939;-0.00064923224272206;0.00075377646135166;4.5309458073461e-05;0.0011648245854303;0.00035873384331353;0.00035363118513487;0.00014688563533127;0.0013457181630656;-0.00011234517296543;0.00043409920181148;4.8549183702562e-05;-0.00025591778103262;5.4086318414193e-05;-1.1709123100445e-05;-1.2080520264135e-06;0.00028153689345345;0.00026767508825287;-0.00039342138916254;-3.0052617148613e-05;0.00071033235872164;-0.00023857475025579;-0.00029998217360117;0.00031679761013947;-3.4364657039987e-05;-5.9399455494713e-05;0.00029831763822585;-4.837807136937e-05;-0.0012439725687727;-0.0001595854992047;-0.00036593861295842;0.00038374288124032;0.00017318956088275;0.00042726143146865;-0.00020590778149199;-0.00079077150439844;-1.080936613107e-06;-0.00043597118929029;-5.4179683502298e-05;0.00082028628094122;0.00020983180729672;-5.6941979664771e-07;3.9310922147706e-05;0.00040340001578443;4.3385021854192e-05;5.3174415370449e-05;1.0528618759054e-06;0.00062827049987391;-5.1293904107297e-05;0.00078066752757877;-0.00030837871599942;3.242810635129e-05;-0.00016391983081121;-0.00031231594039127;0.00029274975531735;-0.0005707562668249;-5.9375252021709e-06;0.0011696850415319;-0.00015406103921123;0.0015573123237118;-0.00021664233645424;-0.00028894896968268;-0.00027969299117103;-0.00014456910139415;-0.00032754088169895;0.00044555301428773;7.1253190981224e-05;0.00026034176698886;-0.00076348584843799;7.666573219467e-05;-0.0011452022008598;0.00027347935247235;0.0007260192069225;3.2952142646536e-05;-0.0018140929751098;0.00014523370191455;6.151785783004e-05;-6.5041872403526e-06;0.00013780551671516;6.4193074649666e-05;-0.0014807024272159;-0.0001384970091749;-0.00054510508198291;9.9339144071564e-05;0.0011393600143492;-0.0003668014833238;-0.00034949358087033;-7.5996082159691e-05;-5.9259426052449e-05;-0.00014290359104052;-0.001157563063316;9.3602626293432e-05;-0.00031878362642601;-0.00062464812071994;-0.00062782882014289;0.00079292833106592;8.8513137598056e-05;0.001169866649434;0.00039669472607784;0.00020319498435128;0.00015009577327874;0.0013100375654176;-3.6066478060093e-05;0.00039500187267549;5.3212221246213e-05;-0.00030285184038803;7.764119800413e-05;-6.6984625846089e-06;-8.8612432591617e-06;0.00025906055816449;0.00026540280668996;-0.00023506821889896;-1.6191101167351e-05;0.00080701900878921;-0.0002865475253202;-0.00052806595340371;0.00043308857129887;-6.6183441958856e-05;-4.4988733861828e-05;0.00021131304674782;-5.8545512729324e-05;-0.00097796891350299;-0.00021955836564302;-0.00032642524456605;0.0004899394698441;0.00027147601940669;0.0003248558496125;-0.00022799863654654;-0.0009510992676951;-6.7801724071614e-05;-0.00035933032631874;-7.0300389779732e-05;0.00061946036294103;0.00026625773170963;5.6266009778483e-05;3.437416307861e-05;0.00035097420914099;6.2145190895535e-05;4.2904321162496e-05;5.2217969823687e-06;0.00062413042178378;-5.1833856559824e-05;0.00091430166503415;-0.00028900452889502;0.00011257673759246;-0.00014141103019938;-0.00029717248980887;0.00025909056421369;-0.00050370587268844;-8.8854831119534e-06;0.0012290386948735;-0.00013428473903332;0.0015214158920571;-0.00018579573952593;-0.00026981660630554;-0.00022738342522644;-0.00014164712047204;-0.00037438466097228;0.00042142931488343;-2.8463482522056e-05;0.00024985263007693;-0.00083794677630067;7.1626287535764e-05;-0.0012567318044603;0.00023593218065798;0.00065219501266256;3.3992040698649e-05;-0.0017503827111796;0.00012514277477749;4.9370424676454e-05;-6.4665164245525e-06;0.0001299047289649;4.310000440455e-05;-0.0010430692927912;-0.00013472324644681;-0.00041116584907286;1.2612293176062e-05;0.00074335071258247;-0.00017595665121917;-0.00026754435384646;-5.0463160732761e-05;1.884352604975e-05;-0.00013152694737073;-0.00072216079570353;7.796641511959e-06;-0.0002543069422245;-0.00049193773884326;-0.00043711028411053;0.00057964859297499;0.00010152261529583;0.00086989410920069;0.00031024945201352;9.6014424343593e-05;0.00011341211211402;0.00088025961304083;4.614967838279e-05;0.00030616406002082;3.9624828787055e-05;-0.00030584642081521;8.4360333858058e-05;-9.4143297246774e-07;-1.1135430213471e-05;0.00019943245570175;0.00019211335165892;-4.5475484512281e-05;-1.2248005987203e-06;0.00065109861316159;-0.00021912426745985;-0.00050253822701052;0.00036083880695514;-9.5202049124055e-05;-2.7480627977639e-05;0.00013783642498311;-5.2586983656511e-05;-0.00053503381786868;-0.00018312374595553;-0.00021871285571251;0.00043629683204927;0.0002516194654163;0.00015153859567363;-0.00017839881184045;-0.00079964753240347;-9.9746765044983e-05;-0.0002334210294066;-5.4924250434851e-05;0.00029353512218222;0.00021473795641214;0.00010780519369291;2.5509001716273e-05;0.00017974074580707;5.6615557696205e-05;2.4609244064777e-05;7.651934538444e-06;0.00045903993304819;-4.4824675569544e-05;0.00076226919190958;-0.00019541593792383;8.4712512034457e-05;-8.8783650426194e-05;-0.00019850766693708;0.00016767632041592;-0.00032162337447517;-5.3266576287569e-06;0.00096159352688119;-8.4237202827353e-05;0.0011203753529117;-0.00011690102110151;-0.0001895930909086;-0.00016667088493705;-9.3984366685618e-05;-0.00030352774774656;0.00031498694443144;-3.9135364204412e-05;0.00016892682469916;-0.00067955779377371;4.4282322051004e-05;-0.00099780678283423;0.00014868553262204;0.00042854878120124;2.5014922357514e-05;-0.0012710546143353;7.857738819439e-05;3.2050171284936e-05;-4.3251648094156e-06;8.7560045358259e-05;2.8227746952325e-05;-0.00066909572342411;-9.101379691856e-05;-0.00026186276227236;7.0215480718616e-07;0.00047091348096728;-0.00010264359298162;-0.00017203403695021;-3.2162712159334e-05;2.110022069246e-05;-8.7479726062156e-05;-0.00046139082405716;-1.796751234906e-06;-0.00016704617883079;-0.00031979489722289;-0.00028122239746153;0.00037549616536126;6.7911161750089e-05;0.00055938243167475;0.00020448406576179;5.3168248996371e-05;7.3578972660471e-05;0.00056167162256315;3.7863130273763e-05;0.00019656155200209;2.5453027774347e-05;-0.00020160670101177;5.7351098803338e-05;-2.7773944566434e-07;-7.5750117503048e-06;0.00012639720807783;0.00012421570136212;-1.7579106497578e-05;2.2311082830129e-06;0.00042988848872483;-0.00014229243970476;-0.00033992322278209;0.00023807145771571;-6.1921549786348e-05;-1.7391343135387e-05;8.3227998402435e-05;-3.5348566598259e-05;-0.00033272951259278;-0.00012049744691467;-0.0001384190400131;0.00029255650588311;0.000171004969161;9.1123692982364e-05;-0.00011872492177645;-0.00053212326020002;-7.2298214945477e-05;-0.00014598618145101;-3.5922843380831e-05;0.00017761405615602;0.0001403693750035;7.0750029408373e-05;1.6827134459163e-05;0.00011681758769555;3.7915051507298e-05;1.5607298337272e-05;5.0044582167175e-06;0.00029691978124902;-2.8175492843729e-05;0.00049812952056527;-0.00012264683027752;5.8255271142116e-05;-5.4867436119821e-05;-0.0001266405597562;0.00010552151798038;-0.00020575951202773;-3.2961825127131e-06;0.0006230451981537;-5.1559243729571e-05;0.00072097702650353;-7.27032602299e-05;-0.00012221433280502;-0.00010390674287919;-5.9209101891611e-05;-0.00019819331646431;0.00020158960251138;-3.0679500923725e-05;0.00010586661665002;-0.00044221270945854;2.6436408006703e-05;-0.00064780830871314;9.1992747911718e-05;0.00027459784178063;1.606622026884e-05;-0.00081862224033102;4.8485278966837e-05;-3.9220462895173e-06;-2.7748361389968e-05;-3.2377825846197e-05;-0.000105499610072;0.00010482908692211;0.00096745020709932;-9.1807538410649e-05;0.00042126284097321;0.0002872827462852;-0.00083553686272353;8.3530321717262e-05;0.0002219050511485;0.00011089227336925;-2.8644688427448e-05;-9.5072224212345e-05;0.00078177341492847;0.00020250944362488;0.00039788195863366;0.00042022328125313;-5.2804869483225e-05;-0.00049338181270286;-0.00023893317847978;-0.00082557718269527;-0.00015648135740776;-0.00010859991016332;4.9120513722301e-05;-0.00084162736311555;-5.7501853007125e-05;-0.00025435499264859;-3.4685770515352e-05;0.0002358962665312;-8.998230441648e-06;8.6167864310482e-07;0.00018717386410572;0.00014578290574718;-5.4732623539167e-05;-0.00010720897262217;-0.00022389704827219;0.00075743335764855;0.00036255648592487;-0.00049136881716549;-1.7245880371775e-05;-4.1012172005139e-05;-5.9610396419885e-05;0.00013736917753704;-0.00020221115846653;-0.0006140487967059;-0.00021192787971813;0.00035277110873722;0.00015775370411575;-0.00015188977704383;0.00020026754646096;-4.6569089136028e-06;-0.00075157074024901;-5.37571759196e-05;-0.00018096278654411;0.00024692274746485;0.00025688132154755;1.5077041098266e-05;-1.5638139529983e-06;6.63720202283e-05;0.00028944018413313;1.3014092473895e-05;1.4153951269691e-05;-6.5334788814653e-05;0.00038075220072642;-0.00022791537048761;0.00060882227262482;-6.9595800596289e-05;0.00011826692207251;0.00014927411393728;-0.00019952280854341;-1.7615562683204e-05;-0.00030370260355994;-0.0001169144816231;0.00075325765646994;-0.00011698526941473;0.0010203148704022;-0.00015112971595954;-0.00011803326196969;-0.00010855191067094;0.00029940705280751;-0.00029272618121468;0.00016230334585998;-5.5554282880621e-05;9.3443879450206e-05;-0.00047135778004304;0.00016308379417751;-0.00084901915397495;3.1868901714915e-05;0.00041295605478808;8.8101056462619e-05;-0.0011450612219051;-4.7998569243646e-06;-4.5773449528497e-05;-4.961004742654e-05;-0.00014085015573073;0.00013154244516045;0.0015743370167911;-0.00020317737653386;0.00067810527980328;0.00054086360614747;-0.0014201821759343;0.00013617947115563;0.000371844653273;0.00015839967818465;2.2274820366874e-05;-0.00020514611969702;0.0013094403548166;0.00029704856569879;0.00061203393852338;0.00069986266316846;-5.4018175433157e-05;-0.00077532546129078;-0.00035843759542331;-0.0013368712970987;-0.00025024116621353;-0.000247570395004;0.00014600230497308;-0.0013782922178507;-9.1308858827688e-05;-0.00042747266707011;-3.6109191569267e-05;0.00034725150908343;-6.4622718127794e-06;-4.3962891140836e-06;0.00030419588438235;0.00026000358047895;-9.3111128080636e-05;-0.000313630560413;-0.00031960377236828;0.0010974092874676;0.0004921238287352;-0.00059881078777835;-4.1925610275939e-05;-4.7199646360241e-05;-8.149073983077e-05;0.00027414958458394;-0.00027680717175826;-0.0012000512797385;-0.00038004110683687;0.00046857955749147;0.00018344029376749;-0.00021535476844292;0.00040351366624236;3.0024952138774e-05;-0.001040973351337;-7.7457807492465e-05;-0.00034457337460481;0.00034741265699267;0.00059697701362893;2.8431551982067e-05;-3.6020079278387e-05;8.7958535004873e-05;0.00050368934171274;1.9515804524417e-05;2.7270611099084e-05;-0.0001067984776455;0.00061692210147157;-0.00040183064993471;0.0009229201823473;-0.0001343668991467;0.00018781340622809;0.00027676118770614;-0.0003529250388965;-3.0115883419057e-05;-0.00052184500964358;-0.00020920479437336;0.0011872582836077;-0.00021806685253978;0.0016656282823533;-0.00025439009186812;-0.00021765417477582;-0.00019245951261837;0.00049937493167818;-0.00044832142884843;0.00029336777515709;-6.0407946875785e-05;0.00016599042282905;-0.00072839809581637;0.00030052097281441;-0.0013201853726059;5.2195700845914e-05;0.00070590124232695;0.00016010041872505;-0.0018845711601898;5.4056187082097e-07;-5.0827758968808e-05;-4.1427723772358e-05;-0.00011061221448472;0.00010105798719451;0.0015766280703247;-0.00024315032351296;0.00069968402385712;0.00058148236712441;-0.0014373972080648;0.00012946747301612;0.00042505943565629;0.00014397586346604;0.00012356365914457;-0.00023265775234904;0.0012446114560589;0.00025851337704808;0.00058448227355257;0.00070662150392309;-3.3794316550484e-05;-0.00073004962177947;-0.00032504435512237;-0.0013551973970607;-0.00024473186931573;-0.00036476110108197;0.00018854522204492;-0.0013620330719277;-8.5363441030495e-05;-0.00049738126108423;-2.6888477805187e-05;0.00037708456511609;1.4684233065054e-06;-9.075042726181e-06;0.00030766279087402;0.00030265311943367;-0.00010578156070551;-0.00041977435466833;-0.0002650577807799;0.0010067018447444;0.00037639104994014;-0.00038496468914673;-6.2680359405931e-05;-4.8846832214622e-05;-7.1759059210308e-05;0.00036437701783143;-0.00021356703655329;-0.0013897120952606;-0.00041844739462249;0.00039863219717517;9.4598151918035e-05;-0.00019598708604462;0.00046019919682294;7.6715070463251e-05;-0.00090708420611918;-5.4317541071214e-05;-0.00041161914123222;0.00028466258663684;0.00072800758061931;3.6817993532168e-05;-4.9232541641686e-05;6.7541637690738e-05;0.00050147797446698;1.8391545381746e-05;3.174522498739e-05;-0.00012078239524271;0.00063401373336092;-0.00042265301453881;0.00087555166101083;-0.00015085481572896;7.140617526602e-05;0.0003035425033886;-0.00036133482353762;-2.4428985852865e-05;-0.00056542322272435;-0.00022953214647714;0.0011799379717559;-0.00024642300559208;0.0017526960000396;-0.0002672009577509;-0.00029086638824083;-0.00018351874314249;0.00055092416005209;-0.00044117044308223;0.00029318648739718;5.9971862356178e-05;0.00017153641965706;-0.00070910778595135;0.00033686243114062;-0.0012852640356869;5.1493974751793e-05;0.00076356920180842;0.00017893510812428;-0.0019752036314458;7.8969815149321e-06;-4.0210095903603e-05;-1.518445333204e-05;-2.3621663785889e-05;3.8590518670389e-05;0.0010326866758987;-0.00018201342027169;0.00047297339187935;0.00039224681677297;-0.00092720665270463;7.314131653402e-05;0.00033128046197817;8.590523066232e-05;0.00021540840680245;-0.00016105438407976;0.00072453578468412;0.00011960361734964;0.00035775563446805;0.0004620430408977;-3.8168326454979e-07;-0.00043189260759391;-0.00018105453636963;-0.00090548931621015;-0.00015371052722912;-0.00038711645174772;0.00014569176710211;-0.00086136109894142;-4.7939898649929e-05;-0.00040060936589725;-1.6026597222663e-05;0.00027511321241036;6.872810445202e-06;-8.4010989667149e-06;0.00020213406241965;0.0002461074909661;-8.449893357465e-05;-0.00032773174461909;-0.00012769865861628;0.0005976784741506;0.00015073244867381;-7.8639117418788e-05;-5.8252775488654e-05;-5.2317041991046e-05;-4.5699438487645e-05;0.00034429610241205;-8.9007757196669e-05;-0.0010535904439166;-0.00030597817385569;0.00021474744426087;-9.1177034846623e-06;-0.00010746219049906;0.00032494409242645;8.4693980170414e-05;-0.00050070753786713;-1.1750010344258e-05;-0.00033332913881168;0.00013865149230696;0.00054642843315378;3.2562453270657e-05;-2.4351866159122e-05;3.1155643227976e-05;0.00029752874979749;1.2244409845152e-05;2.4968099751277e-05;-9.2147987743374e-05;0.0004257928521838;-0.00029051903402433;0.00051204871851951;-0.00010832078987733;-7.4200368544552e-05;0.00021248077973723;-0.00022446645016316;-1.2305145901337e-05;-0.00040176857146434;-0.00016672239871696;0.000767401244957;-0.00017996663518716;0.0012058588908985;-0.00018993244157173;-0.00026929751038551;-0.00011595052637858;0.00040982541395351;-0.00026797235477716;0.00019219219393563;0.00016348386998288;0.00011652219109237;-0.0004502841620706;0.00024502989253961;-0.00077609432628378;3.4570235584397e-05;0.00054481130791828;0.00013159004447516;-0.0013788713840768;7.8014345490374e-05;-3.0022805731278e-05;-0.000121104552818;1.1343852293066e-06;-0.0013076065806672;5.1551810429373e-06;-0.00058883597375825;0.00016614662308712;0.00080590107245371;-0.00031083426438272;-0.00053633243078366;-1.8011109204963e-05;-0.00071848923107609;-8.6949483375065e-05;-0.00046244700206444;8.6575368186459e-05;-5.7803219533525e-05;-0.0004153250483796;-0.000448856910225;0.0004628936003428;5.7124493650917e-06;0.001087588374503;0.00013428388047032;0.00093071442097425;8.8764674728736e-05;0.00099278311245143;-9.2553120339289e-05;0.00066191359655932;1.3281727660797e-05;-0.00038843887159601;6.2747858464718e-05;-4.1087787394645e-06;3.0172495826264e-06;0.00043058887240477;0.00019542827794794;-0.00024893888621591;-9.3970760644879e-05;0.00047185647417791;-7.6796015491709e-05;0.00011832267045975;4.6125896915328e-05;-0.00025158352218568;-6.9356334279291e-05;0.00064386305166408;-5.2891882660333e-05;-0.0010503293015063;-3.5439246858004e-05;-0.00035464676329866;0.00020768577815033;-6.6519714891911e-05;0.00024839836987667;-7.1763250161894e-05;-0.00042194829438813;9.9562967079692e-05;-0.00052795483497903;1.506388434791e-05;0.00050484394887462;8.5096704424359e-05;0.00022220722166821;4.1996150685009e-05;-3.6870951589663e-05;2.9061022360111e-05;5.4856220231159e-05;5.8493064898357e-06;0.00050859479233623;-8.7645996245556e-05;0.00052711908938363;-0.00028558782651089;-0.00031486840452999;-0.00017393275629729;-0.00020118728571106;0.00026782328495756;-0.00046497859875672;3.8790312828496e-06;0.0010583522962406;-0.00017648302309681;0.0014245476340875;-0.00021993721020408;-0.00027138573932461;-0.00048267559031956;-9.1796944616362e-05;-0.00018514168914407;0.00050840806216002;0.000396536255721;0.00022489369439427;-0.00066112371860072;7.7191587479319e-05;-0.00082941877190024;0.00028962673968635;0.00059994013281539;3.4084929211531e-05;-0.0016931951977313;0.00015765572607052;8.5347790445667e-05;-2.5088234906434e-05;1.6985426555038e-05;1.0109655704582e-05;-0.0014056378277019;-7.3391718615312e-05;-0.00069591199280694;0.00011862737301271;0.00091093004448339;-0.00029300607275218;-0.00055121735204011;-3.4805190807674e-05;-0.00042561127338558;-0.00014442717656493;-0.00052853382658213;4.9080066673923e-05;-0.0001828271051636;-0.00057924748398364;-0.00051160162547603;0.00059190607862547;0.0001009813931887;0.0012625466333702;0.00023096057702787;0.00066336587769911;0.00012320642417762;0.0010631915647537;-2.0898132788716e-05;0.00066690531093627;3.2319818274118e-05;-0.00055465532932431;0.00010039626067737;-3.8137832234497e-06;-4.1918392525986e-06;0.00045771346776746;0.00023103390412871;-0.00020412384765223;-6.8833636760246e-05;0.00058533845003694;-0.00014455370546784;-0.00013007396773901;0.0001886422833195;-0.00028713126084767;-6.0304901126074e-05;0.00053848541574553;-5.7226108765462e-05;-0.00090991880279034;-0.00010698777623475;-0.00037624430842698;0.00033223410719074;6.0148362535983e-05;0.00022895613801666;-0.00011110475315945;-0.00061392114730552;1.6552756278543e-05;-0.00050736026605591;-2.0431018128875e-05;0.00047559075755998;0.00015483878087252;0.0002998060954269;3.9500398997916e-05;-4.8449212044943e-05;4.5829470764147e-05;4.1387087549083e-05;1.3320714060683e-05;0.0006052870885469;-0.00010367242066422;0.00089536636369303;-0.00032560602994636;-0.00017081403348129;-0.00018391748017166;-0.0002679891185835;0.00029457570053637;-0.00043831998482347;6.9520217493846e-07;0.0013367455685511;-0.00017752913117874;0.0016452997224405;-0.00022884426289238;-0.00027756043709815;-0.00045364795369096;-0.00011272926349193;-0.0003312352928333;0.00055213453015313;0.00025670567993075;0.00026549125323072;-0.0009086350328289;8.8383123511449e-05;-0.001249433378689;0.00030097819399089;0.00059055793099105;3.716348510352e-05;-0.0018521137535572;0.0001579558593221;7.795439887559e-05;-1.8253304006066e-05;9.0408495452721e-05;1.5457917470485e-05;-0.0012790284818038;-0.00012328110460658;-0.00064074766123667;5.4806274420116e-05;0.0008454499184154;-0.00022077650646679;-0.0004634328361135;-4.2471288907109e-05;-0.00019297510152683;-0.00017025812121574;-0.00053125631529838;5.1089464250254e-06;-0.00023708112712484;-0.00060629658401012;-0.00049094337737188;0.0006095192511566;0.00014158677367959;0.0011875028721988;0.00028081756317988;0.00040152907604352;0.00013452238636091;0.00096772762481123;4.4702392187901e-05;0.00055730884196237;4.1775012505241e-05;-0.00055706995772198;0.00011769410775742;-1.8041229168375e-06;-9.3994822236709e-06;0.0003989580727648;0.00022477998572867;-0.00010776542330859;-3.6450914194575e-05;0.00062050990527496;-0.00017802536603995;-0.00032090680906549;0.00027642771601677;-0.00026720488676801;-4.5880944526289e-05;0.00039099541027099;-5.832146780449e-05;-0.00068402290344238;-0.00014829257270321;-0.0003298680530861;0.00040444559999742;0.00016285422316287;0.0001678475382505;-0.000134369765874;-0.00071731978096068;-6.0465892602224e-05;-0.0004102345847059;-4.1752413380891e-05;0.00035893233143725;0.00018952031678054;0.00030594965210184;3.4947650419781e-05;-3.8727288483642e-05;5.464432615554e-05;2.8184984330437e-05;1.648472607485e-05;0.00057280383771285;-9.396154928254e-05;0.00097718404140323;-0.00029328963137232;-5.0636928790482e-05;-0.00015578835154884;-0.0002564059686847;0.00025704453582875;-0.00035595195367932;-2.2550075300387e-06;0.0013132821768522;-0.00014429914881475;0.0015237259212881;-0.00019018432067242;-0.00024639858747832;-0.00036767625715584;-0.00011363694648026;-0.00035905282129534;0.00049271702300757;0.00012422059080563;0.00025209545856342;-0.00092745269648731;7.679195550736e-05;-0.0012965011410415;0.0002493939246051;0.00049645372200757;3.4201377275167e-05;-0.0016899241600186;0.0001288311323151;5.5780899856472e-05;-1.1032686416002e-05;0.0001004555815598;1.6094774764497e-05;-0.00091400824021548;-0.00012008212797809;-0.00044419389450923;4.0443364923703e-06;0.00060360820498317;-0.0001223121653311;-0.00030695533496328;-3.5790388210444e-05;-4.2439940443728e-05;-0.00014326292148326;-0.00041962577961385;-2.3174492525868e-05;-0.00020550508634187;-0.00046855671098456;-0.00036637292942032;0.0004755609552376;0.00012152518320363;0.00085552519885823;0.00024380045942962;0.00018399329565;0.00010828042286448;0.0006924569606781;7.1606344135944e-05;0.00036599923623726;3.5787626984529e-05;-0.00041120982496068;0.0001000030169962;-1.5351095328242e-07;-9.5484519988531e-06;0.00026504098786972;0.00016920852067415;-2.2926224119146e-05;-8.1055268310593e-06;0.00051055056974292;-0.00015222377260216;-0.00035071882302873;0.00025540273054503;-0.00018215995805804;-2.9230288419058e-05;0.00022295390954241;-4.7580990212737e-05;-0.00042169317021035;-0.0001327511126874;-0.00022456611623056;0.00035908550489694;0.00018349048332311;9.6948446298484e-05;-0.00012219190830365;-0.00062589853769168;-9.0729692601599e-05;-0.00026204032474197;-4.0853086829884e-05;0.00021122948965058;0.00016126634727698;0.00022093032021075;2.6452878955752e-05;-5.7521324379195e-06;4.6563411160605e-05;1.6769563444541e-05;1.3157158718968e-05;0.0004186884034425;-6.3175502873491e-05;0.00076278380583972;-0.00019842432811856;1.3842392036167e-05;-9.9614255304914e-05;-0.00018266971164849;0.0001715967518976;-0.00023968392633833;-2.1688276774512e-06;0.00097272760467604;-8.7972068286035e-05;0.0010896812891588;-0.00012087332288502;-0.00017504622519482;-0.00023493883782066;-8.4595907537732e-05;-0.00027942165615968;0.00034153115120716;3.3902131690411e-05;0.00017738177848514;-0.00070027465699241;4.6950921387179e-05;-0.0009837350808084;0.00015664323291276;0.00034001385211013;2.3796066670911e-05;-0.00120709836483;8.0226665886585e-05;8.3259919847478e-06;-6.0638751165243e-05;1.5772386632307e-06;-9.6331765234936e-05;0.00011085114238085;0.0014190081274137;-0.00017255898274016;0.00081806327216327;0.00043512744014151;-0.001195446238853;9.7129464847967e-05;0.0004747306520585;0.00018525536870584;0.00016190766473301;-0.00013584173575509;0.00076815712964162;0.00021903486049268;0.0006201695650816;0.00057941308477893;-0.00010742492304416;-0.00062233308563009;-0.00025591690791771;-0.001394554739818;-0.00023163069272414;-0.00042210699757561;8.0547433753964e-05;-0.0011300247861072;-7.86476812209e-05;-0.00058816809905693;-7.2612383519299e-05;0.00058493937831372;-3.7305544537958e-06;-2.8969941467949e-06;0.00027654645964503;0.00038778086309321;-0.00011110930063296;-0.00027684826636687;-0.00021961639868096;0.00088456616504118;0.00032832653960213;-0.00035365950316191;-5.4596283007413e-05;-0.00021060892322566;-8.1376660091337e-05;0.00042753524030559;-0.00019423154299147;-0.0010223237331957;-0.00040391826769337;0.000391760841012;8.3570128481369e-05;-0.00013809760275763;0.0003044740005862;3.9088219637051e-05;-0.00080722756683826;-4.1292503738077e-05;-0.00038924993714318;0.00026300735771656;0.00047185362200253;3.6107117921347e-05;0.00016822840552777;7.2735885623842e-05;0.00017520325491205;2.8654148991336e-05;1.9054365111515e-05;-0.00014963067951612;0.00060288346139714;-0.00040307571180165;0.00095522560877725;-0.00014482661208604;-4.5243599743117e-05;0.00027627986855805;-0.00030864783911966;-1.9210368918721e-05;-0.00044324406189844;-0.00022081042698119;0.0012615636223927;-0.00022854631242808;0.0017300881445408;-0.00025056535378098;-0.00037711960612796;-0.00015250038995873;0.00059491908177733;-0.00044013431761414;0.00027418660465628;0.00015354654169641;0.00016383994079661;-0.0008034334750846;0.00031934419530444;-0.0013356701238081;5.1095161325065e-05;0.00062643911223859;0.00016830435197335;-0.0019027653615922;1.7413305613445e-05;-7.2421513323206e-05;7.7363147283904e-06;-5.7163611927535e-05;7.8226890764199e-05;0.0015654943417758;-0.00022091224673204;0.00092382618458942;0.00049693137407303;-0.0012932597892359;9.1322603111621e-05;0.00058092339895666;0.00017926501459442;0.00033001322299242;-0.00016644690185785;0.00074843753827736;0.00018935190746561;0.00064205686794594;0.00062158278888091;-8.8899760157801e-05;-0.0006311975303106;-0.00023118940589484;-0.0015408416511491;-0.0002326520771021;-0.00062467798124999;0.00012576923472807;-0.0012287610443309;-7.3689960117918e-05;-0.00072745862416923;-6.9406683905981e-05;0.00066062767291442;2.2194071789272e-06;-5.8744230955199e-06;0.00029914898914285;0.00046687317080796;-0.00014486820145976;-0.00036168648512103;-0.00019366163178347;0.00090386503143236;0.0002605059708003;-0.00020201430015732;-7.7657394285779e-05;-0.0002451159816701;-8.521463314537e-05;0.00057299132458866;-0.00016063207294792;-0.0012559973401949;-0.000468670274131;0.00037121976492926;2.4294558897964e-06;-0.00012881337897852;0.00035850668791682;9.5518851594534e-05;-0.00077449344098568;-1.6780741134426e-05;-0.0004871737328358;0.00023777433671057;0.00058062496827915;4.6197132178349e-05;0.00018119055312127;6.5439009631518e-05;0.00016414935817011;2.9765868021059e-05;2.653391493368e-05;-0.00017699478485156;0.00067155191209167;-0.00045429676538333;0.0009805983863771;-0.00016984919784591;-0.00018517051648814;0.00031674694037065;-0.00032803005888127;-1.6234234863077e-05;-0.00052747840527445;-0.00026233185781166;0.0013643555575982;-0.00027171408873983;0.0019598936196417;-0.00028589292196557;-0.00048513946239837;-0.00015211947902571;0.00069802952930331;-0.00046776267117821;0.00029028858989477;0.00029840157367289;0.00018443647422828;-0.00085212447447702;0.00037971249548718;-0.0014003458200023;5.6955075706355e-05;0.00073940795846283;0.00020108172611799;-0.0021622749045491;2.5649213057477e-05;-6.5466752857901e-05;1.7684194972389e-05;4.5957989641465e-05;4.7512780838588e-06;0.0012431476498023;-0.00019808400247712;0.00074702478013933;0.00039071784703992;-0.00096575310453773;4.8943500587484e-05;0.0005157656269148;0.00011730199184967;0.0004960477235727;-0.00013776239939034;0.00046310867764987;6.9728841481265e-05;0.00045658709132113;0.00046154652955011;-2.5256736989832e-05;-0.00043815857497975;-0.00011838749196613;-0.0012184844817966;-0.00015598617028445;-0.00072784966323525;0.000129601045046;-0.00094774598255754;-4.150438689976e-05;-0.00066293816780671;-4.8116322432179e-05;0.00051793025340885;7.389004167635e-06;-5.531911028811e-06;0.00022469203395303;0.00041960438829847;-0.00014189523062669;-0.00030525148031302;-0.00010145101987291;0.00064037129050121;0.00010059490887215;3.3461863495177e-05;-7.7674914791714e-05;-0.00023140579287428;-6.9752728450112e-05;0.00058944191550836;-7.3682524089236e-05;-0.001097773318179;-0.00039088749326766;0.0002344729291508;-8.7466971308459e-05;-6.6998123656958e-05;0.0002776303444989;0.00012286838318687;-0.00049536029109731;2.0462282918743e-05;-0.00044501607771963;0.00013861125626136;0.00047261215513572;4.4025859097019e-05;0.00016564436373301;4.0758870454738e-05;5.7506094890414e-05;2.3019942091196e-05;2.7476138711791e-05;-0.00015253435412887;0.00052202248480171;-0.00036600025487132;0.00066544115543365;-0.00014095559890848;-0.00029924654518254;0.00025269889738411;-0.00022390013327822;-1.0136171113118e-05;-0.00044123793486506;-0.00022602979151998;0.0010417361045256;-0.00022806802007835;0.0015619128243998;-0.00023767800303176;-0.00047104104305618;-0.00011155974061694;0.00059428164968267;-0.00032513160840608;0.0002239780878881;0.00038432271685451;0.00015111877291929;-0.0006330162868835;0.00032065602135845;-0.00097435136558488;4.7589241148671e-05;0.0006171406712383;0.00017273340199608;-0.0017652411479503;7.1546011895407e-05;-4.2132083763136e-05;-0.00037967573734932;-2.5339124476886e-05;-0.0011271233670413;0.00014165430911817;-0.00054612313397229;0.00013573352771346;0.00037443113978952;-0.00015296712808777;-0.0004845081421081;3.3294178138021e-05;-0.0012445079628378;-2.2477082893602e-05;5.6580447562737e-06;3.690590892802e-05;0.00014447823923547;-0.00020045836572535;-0.00018325942801312;0.00026532122865319;-9.6889045380522e-05;0.00084878678899258;-0.00010197549272561;0.0013937260955572;7.0521605266549e-07;0.00079280842328444;-8.7900625658222e-05;0.00065397267462686;-2.1781266696053e-05;-0.00022160253138281;3.9698697946733e-05;5.1984484343848e-06;1.4701676036566e-06;0.00042076368117705;9.0527188149281e-05;7.7618602745133e-07;-0.00013715463865083;0.00027961598243564;1.2292498468014e-05;0.00027228804538026;-6.911221134942e-05;-0.0004026026581414;-5.1711427659029e-05;0.00077039218740538;-5.9355887060519e-05;-0.00056592212058604;8.2642754932749e-06;-0.00023347639944404;7.6614051067736e-05;-0.000201305054361;-5.9022895584349e-06;3.937718065572e-05;-0.00013453167048283;0.00014744562213309;-0.00040674742194824;6.2652034102939e-05;1.1307822205708e-05;3.1305604352383e-05;0.00038801922346465;2.8933773137396e-05;-0.00041283134487458;3.3409116440453e-05;5.3365827625385e-05;8.4541579781217e-06;0.00026794985751621;-9.2430411314126e-05;0.00018319257651456;-0.00021420742268674;-0.00046299048699439;-0.00014228411600925;-4.5121676521376e-05;0.00017177576955874;-0.00026243343017995;4.2249541820638e-07;0.00076105247717351;-0.00016673663049005;0.00094988715136424;-0.00016193299961742;-0.00019919841724914;-0.00052227370906621;-5.4228486987995e-05;5.5810614867369e-06;0.00042533222585917;0.00051162886666134;0.00017971161287278;-0.0004211914492771;7.6475305831991e-05;-0.00035543105332181;0.00023217716079671;0.00033317870111205;3.7683450500481e-05;-0.0012310955207795;0.00013368713553064;0.00010516703332542;-5.2008665079484e-05;-0.00037209634319879;-3.1496609153692e-05;-0.0015959606971592;0.0001113914695452;-0.00082504557212815;0.00017171673243865;0.00067056191619486;-0.00024194149591494;-0.00069484044797719;2.3847349439166e-05;-0.0013888709945604;-8.434648043476e-05;-8.3187769632787e-05;4.2083425796591e-05;8.3686711150222e-05;-0.00042312714504078;-0.00035063616815023;0.00045562392915599;-4.0953142161015e-05;0.0013220740947872;-3.0416042136494e-05;0.0016348802018911;4.7379024181282e-05;0.0011161941802129;-8.0614765465725e-05;0.00091515586245805;-9.0504281615722e-06;-0.00047931136214174;8.4142156993039e-05;3.4584516015457e-06;-4.7857179197308e-07;0.0006217117770575;0.00016889088146854;-6.6602828155737e-05;-0.00016325910110027;0.00043955951696262;-2.4746688723098e-05;0.00025621440727264;-2.0464680346777e-05;-0.00055422860896215;-7.1455157012679e-05;0.00098656280897558;-7.8044482506812e-05;-0.00083036889554933;-2.323736953258e-05;-0.0003762127016671;0.00017504357674625;-0.00019229148165323;5.2274946938269e-05;2.06733293453e-05;-0.00029771105619147;0.00014819440548308;-0.00059839495224878;5.4983749578241e-05;0.0001539778750157;7.8256824053824e-05;0.00056217412929982;4.115684714634e-05;-0.00051534327212721;4.9706355639501e-05;6.2558036006521e-05;1.7349615518469e-05;0.00048217966104858;-0.00014001996896695;0.00055736768990755;-0.00034530146513134;-0.00052442849846557;-0.00021737310453318;-0.00014577894762624;0.00028526497771963;-0.00037762318970636;-1.056225528373e-06;0.0012929177610204;-0.00023773101565894;0.0015572414267808;-0.00024981773458421;-0.00029463172541;-0.00070938299177215;-9.8360695119482e-05;-0.00012067268107785;0.0006407325854525;0.00060761166969314;0.00029256581910886;-0.00079860509140417;0.00011678164446494;-0.00085781532106921;0.00035050109727308;0.00050428387476131;5.300976044964e-05;-0.0018959265435115;0.00019415959832259;9.1994683316443e-05;-3.337173620821e-05;-9.7387266578153e-05;-2.0901212337776e-05;-0.0012968690134585;-2.5189747248078e-05;-0.00074684584978968;8.8776505435817e-05;0.0006725937128067;-0.00018780656682793;-0.00056994514307007;-6.5712974901544e-06;-0.00065340549917892;-0.00014319184992928;-0.00013339353608899;-3.3463661566202e-06;-8.7597749370616e-05;-0.00052773073548451;-0.0003751098702196;0.00047882262151688;9.5856812549755e-05;0.0012280162191018;0.00011255924619036;0.00089865748304874;9.3640992417932e-05;0.00088474061340094;1.7746919183992e-05;0.00072270951932296;2.0102566850255e-05;-0.00061064318288118;0.00011308868124615;5.9536341723287e-07;-6.1163596001279e-06;0.00053984060650691;0.00018302927492186;-6.3358798797708e-05;-9.3176342488732e-05;0.0004351360257715;-8.0810146755539e-05;-1.6486763342982e-05;0.00010725510946941;-0.00045235219295137;-5.163853711565e-05;0.00066355254966766;-6.04337619734e-05;-0.00059303111629561;-7.7005839557387e-05;-0.0003488231159281;0.00025381150771864;-1.6860212781467e-05;6.8666951847263e-05;-2.5373241442139e-05;-0.00041656329995021;2.5462035409873e-05;-0.00049930321983993;8.2348441310387e-07;0.00019647945009638;0.00011965070734732;0.00050612253835425;3.3145453926409e-05;-0.0003811958595179;4.8957852413878e-05;3.0409921237151e-05;2.2711468773196e-05;0.00051290565170348;-0.00012665339454543;0.00086131715215743;-0.00032301296596415;-0.00025027705123648;-0.00018827733583748;-0.00020849671273027;0.00027014056104235;-0.0002810861042235;-2.8501999622677e-06;0.0013398205628619;-0.00018681905930862;0.0015087927458808;-0.00021621685300488;-0.00024816460791044;-0.00053180777467787;-0.00010378255683463;-0.00026645793695934;0.00056309357751161;0.00032958426163532;0.00027990763192065;-0.00092719704844058;0.00010174501221627;-0.0011679265880957;0.0002968858461827;0.00041282369056717;4.2318726627855e-05;-0.0016992372693494;0.00015580662875436;7.8408767876681e-05;-2.2575781258638e-05;4.5571600821859e-06;-1.4901896975061e-05;-0.0010692200157791;-8.1781836342998e-05;-0.00063501804834232;3.4358556149527e-05;0.00060281768674031;-0.00013279948325362;-0.00044556180364452;-1.9527145923348e-05;-0.00032321977778338;-0.00016257645620499;-0.00015886835171841;-3.1824005418457e-05;-0.00014647467469331;-0.00052608962869272;-0.00035230003413744;0.00046278833178803;0.00013681565178558;0.0010740217985585;0.00016914533625823;0.00053073064191267;0.00010852250125026;0.00072230619844049;6.9130219344515e-05;0.00055974436691031;3.2317231671186e-05;-0.00058369524776936;0.00012076959683327;1.1244578956848e-07;-8.8399519881932e-06;0.0004478475311771;0.00017238700820599;-2.3512880943599e-05;-5.0816634029616e-05;0.00041830772534013;-0.00010226344602415;-0.00016236535157077;0.00016557199705858;-0.00037589549901895;-3.7908401282039e-05;0.00046760871191509;-5.217555371928e-05;-0.00041336019057781;-9.9437231256161e-05;-0.00029687391361222;0.00028852166724391;7.7498239988927e-05;4.9755661166273e-05;-4.8955291276798e-05;-0.00046603451482952;-4.4963209802518e-05;-0.00039484284934588;-2.2579502910958e-05;0.00015749002341181;0.00013364902406465;0.00045057281386107;2.838598084054e-05;-0.00030434236396104;4.7458030167036e-05;1.4863348042127e-05;2.3840302674216e-05;0.0004622335836757;-0.00010805409692694;0.00089204864343628;-0.00027692978619598;-0.00011068436288042;-0.00015427435573656;-0.00020137548563071;0.00022936565801501;-0.00019912923744414;-4.1866783249134e-06;0.0012310717720538;-0.00014315874432214;0.0013216491788626;-0.00017314405704383;-0.00020571585628204;-0.0004126698768232;-0.00010038192704087;-0.00028508112882264;0.00047338294098154;0.0001791896938812;0.00025261557311751;-0.0008876760257408;8.3364189777058e-05;-0.0011573765659705;0.00023571171914227;0.00031665686401539;3.4664390113903e-05;-0.0014514485374093;0.00012062892346876;5.0813167035813e-05;-9.3534772531711e-06;3.6404369893717e-05;-1.6894857253646e-05;-0.0003693662583828;-9.4988856290001e-05;-0.00021034828387201;-0.00011384965182515;8.9872832177207e-05;0.00013998581562191;-6.7857399699278e-05;-1.8969156371895e-05;7.8049866715446e-05;-0.00019194083870389;2.5490444386378e-05;-0.00014761186321266;-0.00013010062684771;-0.00030783063266426;-0.00012589455582201;0.00029972934862599;0.00010507792467251;0.00044830562546849;0.00012808613246307;-2.1309077055776e-05;0.00010119711078005;0.00014221377205104;0.00019821678870358;8.2102516898885e-05;4.7966768761398e-05;-0.00029250248917378;0.00014530555927195;-2.9627399271703e-06;-3.950863629143e-06;0.00017279986059293;8.7043787061702e-05;0.00017722800839692;7.1996604674496e-05;0.00020072210463695;-2.3585233066115e-05;-0.00029917049687356;9.5175593742169e-05;-0.00016188777226489;-1.789666384866e-05;7.7359240094665e-05;-4.5162370952312e-05;0.00013893737923354;-3.6233483115211e-05;-0.00011787451512646;0.00026385847013444;0.00024103169562295;-6.0563397710212e-05;-4.3380645365687e-05;-0.00039130629738793;-0.00023644082830288;-0.00010992246097885;-3.4393244277453e-05;-0.00011597925185924;5.1337941840757e-05;0.00031210307497531;3.8721147575416e-05;-0.00024974119151011;2.2136551706353e-05;-1.3877478522772e-05;2.4349796149181e-05;0.00015225828974508;-3.6470486520557e-05;0.00060278421733528;-5.1849950978067e-05;0.00013187763397582;-3.0871608032612e-05;-8.6280939285643e-05;6.6643791797105e-05;0.00010754738468677;5.2289319683041e-06;0.0006642373627983;2.7332662284607e-05;0.00046522443881258;-1.0458225915499e-05;-8.8141008745879e-05;-0.00015941384481266;-5.16272848472e-05;-0.00011680098396027;0.00018079421715811;-9.5794464868959e-05;0.00012296476052143;-0.00053470995044336;-2.2420443201554e-05;-0.00064671755535528;-4.6186378312996e-06;-8.632358367322e-05;1.5808476518941e-06;-0.00050921452930197;-7.2333386924583e-06;4.5017215597909e-05;-9.1419151431182e-06;3.5419980122242e-05;-1.1952476597799e-05;-0.00029948481824249;-7.9140852903947e-05;-0.00015134538989514;-0.00011625904153334;3.2566898880759e-05;0.00016145741392393;-3.9252150600078e-05;-1.5099939446372e-05;9.289727313444e-05;-0.00017533541540615;2.5473034838797e-05;-0.00014905347779859;-0.00011738622561097;-0.00025591667508706;-9.8228454589844e-05;0.00026688110665418;8.2886137533933e-05;0.00035945125273429;0.00010868874232983;-5.1540911954362e-05;8.7697160779499e-05;9.4654278655071e-05;0.00019093594164588;4.2482548451517e-05;4.2676048906287e-05;-0.00023688169312663;0.0001368343946524;-2.654664513102e-06;-2.3805378077668e-06;0.00012920737208333;7.4210882303305e-05;0.00017801126523409;8.145780157065e-05;0.00018099750741385;-8.9123705038219e-06;-0.0002914437209256;7.2875089244917e-05;-0.00012083237379557;-1.7467415091232e-05;3.4622142266016e-05;-4.5100634451956e-05;0.0001499990321463;-2.1736266717198e-05;-9.4703063950874e-05;0.00024870061315596;0.0002399012882961;-5.704417344532e-05;-4.5202079490991e-05;-0.00037093670107424;-0.00023968941241037;-7.5005249527749e-05;-2.9081100365147e-05;-0.00011976744281128;3.4428780054441e-05;0.00025749680935405;3.9698832551949e-05;-0.00019868406525347;1.9033883290831e-05;-1.1976597306784e-05;2.063609099423e-05;0.00012173269351479;-2.2357004127116e-05;0.00052668730495498;-1.6653610146022e-05;0.0001439218322048;-1.1936933333345e-05;-7.5000971264672e-05;4.5898665121058e-05;0.00010508151171962;7.5719040069089e-06;0.00055695266928524;4.657169120037e-05;0.00036244449438527;6.3570755628461e-06;-7.7344913734123e-05;-0.00011431225721026;-3.178227780154e-05;-9.4657931185793e-05;0.00013843846681993;-0.00011944596917601;8.5345302068163e-05;-0.00045577154378407;-3.8881513319211e-05;-0.00054612470557913;-3.1877258152235e-05;-9.3776419817004e-05;-2.6238174086757e-06;-0.00040247791912407;-2.0638059140765e-05;1.568735933688e-05;-6.2093691667542e-05;4.2358882637927e-05;-2.8491302145994e-05;7.7738615800627e-05;0.0010888722026721;-0.00010623627895257;0.00080986000830308;0.00026894302573055;-0.00082003435818478;5.2188985137036e-05;0.00044433315633796;0.000184193107998;0.00024881403078325;-5.0817878218368e-05;0.00023850936850067;0.00012563215568662;0.0005460397223942;0.00037935451837257;-0.0001348278747173;-0.00043286953587085;-0.00013636585208587;-0.0012260628864169;-0.00018081886810251;-0.00048019489622675;1.8791566844811e-06;-0.00078094290802255;-5.9923859225819e-05;-0.00058336759684607;-9.3044844106771e-05;0.00065168825676665;-5.0881749302789e-06;9.4196730060503e-07;0.00020449826843105;0.00042764478712343;-0.00010646105511114;-0.00015134546265472;-0.00012753620103467;0.00057980319252238;0.00019573800091166;-0.00018523262406234;-4.3665182602126e-05;-0.00033740216167644;-7.362435280811e-05;0.00045863242121413;-0.00012829581100959;-0.00059175479691476;-0.00034495041472837;0.00028151003061794;2.6331144908909e-05;-4.5055166992825e-05;0.00013550175935961;1.719722240523e-05;-0.00051237270236015;-1.7284164641751e-05;-0.00033277695183642;0.00018492253730074;0.00021812798513565;3.0748120479984e-05;0.00035360196488909;6.0510617913678e-05;-0.00017286470392719;3.505881250021e-05;5.1915289986937e-06;-0.00015896314289421;0.00048143000458367;-0.0003457079292275;0.00086626556003466;-0.00012871001672465;-0.0001583997218404;0.00022273369540926;-0.0002189232618548;-1.4553994333255e-05;-0.00026365753728896;-0.0001941613300005;0.0011529624462128;-0.00019041057385039;0.0014589114580303;-0.00020162657892797;-0.00042304451926611;-0.00011035930947401;0.00055962108308449;-0.00035935355117545;0.0002361129882047;0.00023676111595705;0.00014559987175744;-0.00077019562013447;0.00027447319007479;-0.0011626982595772;4.5702727220487e-05;0.00040862237801775;0.00014307902893052;-0.0015717605128884;2.8457034204621e-05;-7.580825331388e-05;4.8851958126761e-05;4.4053445890313e-05;2.4278549972223e-05;0.0012615126324818;-0.00014839450886939;0.00093924795510247;0.00031300442060456;-0.00088754447642714;3.6780686059501e-05;0.00055547064403072;0.00017111207125708;0.00049711583415046;-7.2609160270076e-05;0.00018546934006736;7.6908734627068e-05;0.0005634079570882;0.00039657860179432;-0.00010402609041194;-0.00044387360685505;-8.7064305262174e-05;-0.001384261646308;-0.00016603458789177;-0.00075265654595569;4.3935448047705e-05;-0.00090135086793453;-4.8826539568836e-05;-0.0007380525348708;-9.0186302259099e-05;0.00071450410177931;-9.9938597486471e-07;7.3041192649725e-08;0.00021836874657311;0.00051609880756587;-0.0001496537879575;-0.00019265511946287;-0.00010535559704294;0.00060277088778093;0.000140822987305;-5.359789065551e-05;-6.255587504711e-05;-0.00040384195744991;-8.376991172554e-05;0.00062509742565453;-0.00010536231275182;-0.00075554824434221;-0.00040054981946014;0.00026366562815383;-5.5549357057316e-05;-2.3715720089967e-05;0.00015163348871283;7.3472321673762e-05;-0.00047877043834887;1.1239159903198e-05;-0.00041961035458371;0.00017125184240285;0.0002553993545007;3.8663602026645e-05;0.00040197494672611;6.0326805396471e-05;-0.00023932328622323;3.7155288737267e-05;1.350143156742e-05;-0.00018815314979292;0.00053891976131126;-0.00039672263665125;0.00088188389781862;-0.00015201918722596;-0.00030635780422017;0.00025376275880262;-0.00022137549240142;-1.4489132809103e-05;-0.00033259161864407;-0.00023909041192383;0.0012618504697457;-0.00022825386258774;0.001662646769546;-0.00023579734261148;-0.00053822336485609;-0.00011112028732896;0.00066183920716867;-0.00037440186133608;0.00025510974228382;0.00038639377453364;0.00017077717348002;-0.00082268589176238;0.0003318679810036;-0.0012066216440871;5.4871383326827e-05;0.00050131371244788;0.00017503870185465;-0.0018190282862633;5.3152372856857e-05;-9.0482593805064e-05;5.6915399909485e-05;0.00026682182215154;-0.00011640627781162;0.0013739343266934;-0.00018938539142255;0.00098414672538638;0.00030664564110339;-0.00078696693526581;-1.163242450275e-05;0.00063475361093879;0.00010937194747385;0.001054368680343;-8.7539279775228e-05;3.2339572499041e-05;-8.4346880612429e-05;0.00045920995762572;0.00032401128555648;1.9297118342365e-05;-0.00038591789780185;5.2920739108231e-05;-0.0013941121287644;-9.3097813078202e-05;-0.001270574866794;0.00011178704153281;-0.00098050199449062;-1.214685926243e-05;-0.00088033941574395;-6.9744703068864e-05;0.00061351904878393;5.3558687795885e-06;1.9792282728304e-06;0.0001894662855193;0.00058437883853912;-0.00020852616580669;-0.00016796638374217;-3.8935198972467e-05;0.00052852049702778;5.5790474107198e-06;0.00020788663823623;-8.2908860349562e-05;-0.00048715856974013;-9.822200081544e-05;0.000865790003445;-4.2346746340627e-05;-0.00086476764408872;-0.00041237878031097;0.00018369680037722;-0.00019725121092051;3.5521548852557e-05;0.00010356248094467;0.00015661930956412;-0.00032372775604017;7.1329559432343e-05;-0.00048511903150938;0.00011705133510986;0.00018377152446192;4.778643778991e-05;0.00045728983241133;5.4254323913483e-05;-0.0003905312041752;3.5300563467899e-05;2.9916653147666e-05;-0.00020569300977513;0.00049633183516562;-0.00040266898577102;0.0006532451370731;-0.00015784337301739;-0.00055778271052986;0.00024000620760489;-0.00013489743287209;-1.4889770682203e-05;-0.00036414395435713;-0.00027373133343644;0.0011813408927992;-0.00023889560543466;0.001626196783036;-0.00025211757747456;-0.00067825132282451;-0.00010241683776258;0.00071508530527353;-0.00026977420202456;0.00025025269133039;0.00062487699324265;0.00018539400480222;-0.0007264000014402;0.00035629136255011;-0.00092083495110273;6.4318570366595e-05;0.00053600833052769;0.00019554389291443;-0.0018897682894021;4.5986434997758e-05;-6.1700753576588e-05;3.7719397369074e-05;0.00029287362121977;-0.00015180946502369;0.00087711570085958;-0.00012517505092546;0.00060666323406622;0.00016024688375182;-0.00038282797322609;-3.7185698602116e-05;0.000412582536228;3.0399796742131e-05;0.0009551967959851;-5.0449722039048e-05;-7.981982344063e-05;-0.00014451758761425;0.00020955908985343;0.00013574978220277;8.416932541877e-05;-0.00019867527589668;0.00011699763126671;-0.00082158402074128;-8.9830318756867e-06;-0.0010531474836171;9.4567265477963e-05;-0.00062669871840626;1.4846784324618e-05;-0.0005936108645983;-3.2243591704173e-05;0.00029375479789451;5.2017549023731e-06;4.1469702409813e-06;9.1119334683754e-05;0.00037626360426657;-0.00015767628792673;-4.8179852456087e-05;8.5149149526842e-06;0.00028764948365279;-5.8431607612874e-05;0.00023790253908373;-5.7324941735715e-05;-0.00034002322354354;-6.976310396567e-05;0.0006435546092689;2.5226522666344e-06;-0.00051949545741081;-0.00023899541702121;7.6365191489458e-05;-0.0001862487551989;5.3907122492092e-05;1.1760083907575e-05;0.0001342590112472;-0.00012757806689478;7.6242431532592e-05;-0.00031074025901034;4.7236178943422e-05;1.6572968888795e-05;3.2893596653594e-05;0.00030909245833755;3.2065338018583e-05;-0.00033281327341683;1.9504752344801e-05;2.7011192287318e-05;-0.00012924257316627;0.000258687796304;-0.0002301141503267;0.00024937535636127;-9.1154826804996e-05;-0.00047215283848345;0.00012392504140735;-1.9253509890405e-05;-8.2977994679823e-06;-0.00022246189473663;-0.00017516831576359;0.00064153998391703;-0.00013874395517632;0.00091274903388694;-0.0001541326782899;-0.00047323340550065;-5.2137718739687e-05;0.00044273270759732;-9.456071711611e-05;0.00013808802759741;0.00049884297186509;0.00011301034828648;-0.00036736411857419;0.00021330261370167;-0.00036626966902986;4.2625833884813e-05;0.0003210810245946;0.00012208768748678;-0.0011302761267871;9.1675712610595e-05;-5.7375978940399e-05;-0.00062082114163786;-3.6424054997042e-05;-0.001523056300357;0.00025142374215648;-0.00080358498962596;0.00013989869330544;0.00031796481925994;-0.0001205486987601;-0.00054126110626385;6.1818420363124e-05;-0.0018384869908914;-1.808650631574e-05;0.00017434269830119;1.6078760381788e-05;0.00023484590929002;-0.0002451638574712;-8.7040192738641e-05;0.00037952538696118;-0.00015077402349561;0.0010955469915643;-0.00024572017719038;0.0019688457250595;-4.1107476135949e-05;0.0010902811773121;-8.9990229753312e-05;0.00078622985165566;-3.4326345485169e-05;-0.00020473239419516;5.00224850839e-05;4.0431336856273e-06;-2.5819797428994e-06;0.000544824230019;6.6435153712519e-05;0.00011946906306548;-0.00017450185259804;0.00023832467559259;2.6515504941926e-05;0.0002759673516266;-5.2409664931474e-05;-0.00066685728961602;-4.1824401705526e-05;0.00094230473041534;-7.6110001828056e-05;-0.0002504771691747;-2.0577315808623e-05;-0.00022489053662866;6.4460080466233e-05;-0.00025588486460038;-0.00017695011047181;0.00010435248259455;-2.3426699044649e-05;0.00014584662858397;-0.00036803793045692;7.6675758464262e-05;-0.00029243243625388;5.5982254707487e-05;0.00072663143509999;1.8742099200608e-05;-0.00084338284796104;5.9770569350803e-05;5.4559724958381e-05;2.334944656468e-05;0.00022086180979386;-0.00014414139150176;0.00033902327413671;-0.00029396204627119;-0.00050793745322153;-0.0001881620119093;-2.2231341063161e-05;0.00019300315761939;-0.00011067279410781;-1.4427109817916e-05;0.0010604292619973;-0.00022891319531482;0.0010569352889434;-0.00018644121882971;-0.00019897897436749;-0.00068458647001535;-9.0205307060387e-05;3.4585435059853e-05;0.00052393798250705;0.00057816208573058;0.00028770967037417;-0.00060917239170521;0.00013359590957407;-0.00053527730051428;0.00028944239602424;0.00015806953888386;6.1761013057549e-05;-0.0013651181943715;0.00016480119666085;0.00011138997069793;-6.4656676840968e-05;-0.00068087439285591;-4.6742330596317e-05;-0.0018039153655991;0.00025349878706038;-0.00097799708601087;0.00015570965479128;0.00044630136108026;-0.00015468851779588;-0.00063792138826102;6.1311016906984e-05;-0.002057985169813;-5.419696753961e-05;0.00017869366274681;1.1985530363745e-05;0.00023294881975744;-0.00036309837014414;-0.00015447645273525;0.00048773325397633;-0.00013494695303962;0.0013653307687491;-0.00023185601457953;0.0022133223246783;-1.9400324163144e-05;0.0012846268946305;-8.2480954006314e-05;0.00093387521337718;-2.8300868507358e-05;-0.00032041530357674;7.7225748100318e-05;1.6956660147116e-06;-3.8999105527182e-06;0.00066722009796649;9.9177923402749e-05;0.00011018596705981;-0.00019371740927454;0.00030340792727657;1.6539332136745e-05;0.00028706304146908;-3.5654000384966e-05;-0.00080373411765322;-5.0567254220368e-05;0.001096926513128;-8.9743094576988e-05;-0.00032752036349848;-3.6473637010204e-05;-0.00029010133584961;0.00011096349044237;-0.00026632641674951;-0.00018776928482112;0.00010766521154437;-7.5038406066597e-05;0.00014398174243979;-0.0004459849151317;7.7953875006642e-05;-0.00028808493516408;7.9253397416323e-05;0.000896729179658;2.3522146875621e-05;-0.0010002460330725;7.2575618105475e-05;6.0314006987028e-05;3.1802283047e-05;0.00029388288385235;-0.00018023992015515;0.00052018329733983;-0.0003726358700078;-0.00056619779206812;-0.00023560182307847;-5.6450226111338e-05;0.00025019815075211;-0.00012314607738517;-1.8707947674557e-05;0.0013616936048493;-0.00027768916334026;0.0013559074141085;-0.00023246082128026;-0.00024296845367644;-0.00082464335719123;-0.00011984841694357;3.6119806168244e-07;0.0006498169968836;0.00065455964067951;0.00036984120379202;-0.00080839218571782;0.00016606092685834;-0.00076829292811453;0.00035746724461205;0.00019050645641983;7.5126750743948e-05;-0.0017115405062214;0.00020109351316933;6.85065460857e-05;-9.8376722235116e-06;2.0187640984659e-05;-2.9907541829743e-05;-0.00043651068699546;-0.00011875890049851;-0.00026401967625134;-0.00013999981456436;0.00010235986701446;0.00016294517263304;-4.7101799282245e-05;-2.9441946026054e-05;9.0490073489491e-05;-0.00025779829593375;5.9455724112922e-05;-0.0001792087132344;-0.00015726457058918;-0.00039099698187783;-0.00014211761299521;0.0003814973460976;0.00013761533773504;0.00054957548854873;0.00015025079483166;-3.0911567591829e-05;0.00013929924170952;0.00015341152902693;0.00025112574803643;5.3138919611229e-05;7.2457820351701e-05;-0.00034345415770076;0.00018501264275983;-7.1814438342699e-06;-3.4511426747486e-06;0.00022448253002949;0.00010508239938645;0.00022544671082869;8.8226770458277e-05;0.00018865102902055;-2.616862366267e-05;-0.0003363877767697;0.00010359348380007;-0.00019844640337396;-2.0871755623375e-05;0.00010875408042921;-4.9434453103459e-05;0.00023274561681319;-3.6195324355504e-05;-0.00015087248175405;0.00029373593861237;0.00029649084899575;-7.6494310633279e-05;-3.2535528589506e-05;-0.00043173748417757;-0.00029358800384216;-0.00015722337411717;-4.8327765398426e-05;-0.00016428212984465;5.815574695589e-05;0.00042742415098473;4.8734473239165e-05;-0.00038705789484084;1.8732131138677e-05;-2.5803774406086e-05;3.6144865589449e-05;0.00015624282241333;-5.3687319450546e-05;0.00075655913678929;-7.6423442806117e-05;0.00017061368271243;-4.7434525185963e-05;-9.7335192549508e-05;8.5587387729902e-05;0.00020581363060046;5.8561677178659e-06;0.0008452488691546;3.3729069400579e-05;0.0005403560353443;-1.1562195140868e-05;-0.00010124524851562;-0.00023250035883393;-8.6926593212411e-05;-0.00012011985381832;0.00023100542603061;-0.00010891415877268;0.00019019762112293;-0.00067987258080393;-2.0757908714586e-05;-0.00080953183351085;-5.5046439229045e-06;-0.0001900744100567;-2.9713592653025e-07;-0.00058073125546798;-8.6322806964745e-06;6.5780310251284e-05;-1.0108135938935e-05;3.105130235781e-05;-2.6419618734508e-05;-0.00039675968582742;-0.00011133118823636;-0.00022323829762172;-0.00014569993072655;6.6376203903928e-05;0.00018305430421606;-3.3081396395573e-05;-2.7830345061375e-05;0.00011877036013175;-0.00025631714379415;5.5041018640622e-05;-0.00018669458222575;-0.00015635098679923;-0.00036183881456964;-0.00012972306285519;0.00036703704972751;0.00012488628271967;0.00049949029926211;0.00014142137661111;-6.7458626290318e-05;0.00013563489483204;0.00012013197556371;0.00025460802135058;2.961865720863e-05;7.1041868068278e-05;-0.0003184367378708;0.00018734465993475;-6.3263141782954e-06;-2.1401829144452e-06;0.0001950209698407;0.0001021730422508;0.00023138425603975;0.00010136172204511;0.00019013904966414;-1.6259775293292e-05;-0.00034613869502209;8.9920788013842e-05;-0.00016702499124222;-2.2812348106527e-05;7.4820760346483e-05;-5.0844842917286e-05;0.0002339145867154;-2.4979817681015e-05;-0.00014089085743763;0.00030116221751086;0.00031233910704032;-7.0398265961558e-05;-3.9572965761181e-05;-0.0004474756133277;-0.0003114867140539;-0.00013409333769232;-4.7251349315047e-05;-0.00016448528913315;4.678062396124e-05;0.00038744538323954;5.3773441322846e-05;-0.00034267871524207;1.4624141840613e-05;-2.3285436327569e-05;3.3126623748103e-05;0.00014315648877528;-4.1967468860094e-05;0.00071912381099537;-4.7379311581608e-05;0.0001826191728469;-3.2757630833657e-05;-9.1879897809122e-05;7.2743401688058e-05;0.00019675938528962;1.0169954293815e-05;0.00078480702359229;5.5874086683616e-05;0.00048450392205268;3.2183761504712e-06;-9.986489021685e-05;-0.00020623636373784;-7.6722142694052e-05;-0.00010759795986814;0.00020668875367846;-0.0001255395472981;0.00016616078210063;-0.00063502253033221;-4.0210794395534e-05;-0.00075696292333305;-3.1470481189899e-05;-0.00018900335999206;-5.850729849044e-06;-0.00052481930470094;-2.2381069356925e-05;3.9914819353726e-05;-6.0325387494231e-06;2.0225868865964e-05;-1.6550462532905e-05;-0.00022890158288646;-6.5115469624288e-05;-0.00012592274288181;-8.7728163634893e-05;3.2732041290728e-05;0.00011184471077286;-1.4357631698658e-05;-1.7435224435758e-05;8.0074125435203e-05;-0.00015847926260903;3.5269324143883e-05;-0.00011342181096552;-9.4105358584784e-05;-0.00021253366139717;-7.5073367042933e-05;0.00021906626352575;7.3146497015841e-05;0.00029074243502691;8.1480822700541e-05;-5.1095914386678e-05;8.4039427747484e-05;6.220622890396e-05;0.00015474061365239;7.9461324276053e-06;4.4716220145347e-05;-0.00018678564811125;0.00011539333354449;-3.9026745071169e-06;-6.4659820964152e-07;0.00011313697177684;6.1915299738757e-05;0.00014034779451322;6.4732936152723e-05;0.00010887423559325;-6.7217169998912e-06;-0.00020526589651126;4.7596342483303e-05;-9.2215756012592e-05;-1.4715486031491e-05;3.9761434891261e-05;-2.9917571737315e-05;0.00014492533227894;-1.0071868018713e-05;-8.5288884292822e-05;0.00018096978601534;0.00019319279817864;-3.9149577787612e-05;-2.3240090740728e-05;-0.00027013526414521;-0.00019367539789528;-8.0266319855582e-05;-2.9495064154617e-05;-9.9092496384401e-05;2.4222441425081e-05;0.00022831435489934;3.4853474062402e-05;-0.00020450218289625;5.4596334848611e-06;-1.4248507795855e-05;1.9828677977785e-05;8.0916339356918e-05;-2.3281076209969e-05;0.000426748621976;-2.2472502678283e-05;0.0001117691208492;-1.7472710169386e-05;-5.2872554078931e-05;4.1896255424945e-05;0.00012339535169303;7.930811989354e-06;0.0004641227715183;4.0901555621531e-05;0.00027880509151146;6.0998609114904e-06;-6.0318914620439e-05;-0.00012535040150397;-4.8269874241669e-05;-5.8498528233031e-05;0.0001213967698277;-7.5171730713919e-05;0.00010055187885882;-0.00037546851672232;-2.9774579161312e-05;-0.00044783370685764;-2.6375670131529e-05;-0.00012210226850584;-6.0380657487258e-06;-0.00030122397583909;-1.7589534763829e-05;-2.6148342158194e-07;-2.709182081162e-05;5.0441507482901e-05;1.5173584870354e-05;7.1949936682358e-05;0.00023020782100502;4.9400274292566e-05;0.00022660316608381;-3.0900391720934e-05;-0.00010734683746705;2.517860957596e-05;2.886023503379e-05;0.00015503572649322;-2.466413025104e-05;6.3252882682718e-05;-6.1925791669637e-05;4.1825314838206e-05;0.00021620122424792;5.6882676290115e-05;-8.4775812865701e-05;-0.00016083724040072;-5.3718846174888e-05;-0.00034817814594135;-0.00011330826237099;-3.0437395253102e-05;-0.00011897817603312;-9.7622309112921e-05;-5.2310144383227e-05;-4.4738011638401e-05;-8.4220235294197e-05;0.00021030208154116;-5.0451990318834e-06;4.2433252929186e-06;5.6102824601112e-05;0.00013569225848187;1.889753548312e-05;7.4953917646781e-05;-3.1402505555889e-05;8.7598273239564e-05;6.8578781792894e-05;-0.00015706419071648;3.5438852137304e-06;-0.00014988922339398;-3.1676339858677e-05;8.0388461356051e-05;-3.6843601264991e-05;0.00013646601291839;-9.6329247753602e-05;0.00011217902647331;0.0001232510257978;1.2729063200823e-05;-3.2501429814147e-05;-0.00011549593909876;-0.00016866231453605;-3.6183981137583e-05;-5.9151974710403e-05;5.8880508731818e-05;-9.1090172645636e-05;1.7296037185588e-05;0.00024979433510453;1.7746577213984e-05;-0.00024700572248548;2.3925054847496e-05;-1.7018346625264e-05;-4.9792215577327e-05;8.5241823398974e-05;-6.5387401264161e-05;0.00036340291262604;-2.1169456886128e-05;5.2173283620505e-05;4.5571068767458e-05;-4.5738837798126e-05;1.2985458397452e-06;9.9832395790145e-05;-4.9021546146832e-06;0.00043486265349202;-1.9321241779835e-05;0.00031311629572883;-4.9799993576016e-05;-0.00014975274098106;-5.8642221119953e-05;0.00015537750732619;-7.0468879130203e-05;9.9844706710428e-05;-6.0112495248177e-07;1.4190425645211e-05;-0.00033619880559854;1.6701113054296e-05;-0.00041485831025057;-1.8784427879837e-07;-8.6438842117786e-05;1.1754845218093e-05;-0.00032701421878301;2.8467795232245e-07;-3.5455766919767e-05;6.3162326114252e-05;2.2271988200373e-05;8.8004315330181e-05;0.00030912234797142;6.2087681726553e-05;0.00029919020016678;-3.8264897739282e-05;-0.00014335768355522;3.1390005460707e-05;3.9038950490067e-05;0.00019616736972239;-2.1247236873023e-05;7.9860823461786e-05;-7.3578034061939e-05;5.431441240944e-05;0.00028066622326151;7.3300987423863e-05;-0.00010693226067815;-0.00021297790226527;-6.6831002186518e-05;-0.00045694949221797;-0.00014223794278223;-4.7637346142437e-05;-0.00014976586680859;-0.00013766373740509;-6.6155291278847e-05;-6.1263046518434e-05;-0.00010669120092643;0.00026814642478712;-6.4642194956832e-06;4.9385466809326e-06;7.2249604272656e-05;0.00017558895342518;2.2391168386093e-05;9.4455914222635e-05;-4.1843799408525e-05;0.00011395822366467;9.1273483121768e-05;-0.00020469717856031;4.8799465730553e-06;-0.00019421134493314;-4.1894702007994e-05;0.00010443940118421;-4.9848291382659e-05;0.00017282881890424;-0.00012485503975768;0.00014260386524256;0.00015711854211986;1.72411382664e-05;-4.0650702430867e-05;-0.00014645242481492;-0.0002153057284886;-4.5652752305614e-05;-7.5347044912633e-05;7.8033488534857e-05;-0.00011598281707847;2.1158293748158e-05;0.00032281238236465;2.4925160687417e-05;-0.00031769089400768;3.1088024115888e-05;-2.1449122868944e-05;-6.5154148614965e-05;0.00011122903379146;-8.7265914771706e-05;0.00047290610382333;-2.8420035960153e-05;7.0864494773559e-05;6.0266909713391e-05;-6.2307612097356e-05;3.7733570934506e-07;0.0001264454331249;-9.9077833510819e-06;0.0005648285150528;-2.7056770704803e-05;0.00040896266000345;-6.5105072280858e-05;-0.00019316533871461;-7.4619383667596e-05;0.00020267940999474;-9.2515198048204e-05;0.00012902086018585;-3.4424992918503e-06;2.0897885406157e-05;-0.00043543230276555;2.5098788682953e-05;-0.00053981016390026;1.3115125057084e-06;-0.00010914207086898;1.708834679448e-05;-0.00042827191646211;7.1741429565009e-05;-9.8611126304604e-05;7.1290116466116e-05;0.00053176243091002;-0.00026624088059179;0.0014165313914418;-0.00015804498980287;0.0010812527034432;0.00019912736024708;-0.0005183617467992;-6.8152170570102e-05;0.00056880345800892;6.7412642238196e-05;0.0015943471807986;-4.7205838200171e-05;-0.00024806053261273;-0.0002401843375992;0.00038344258791767;0.00011631855886662;0.0001167879163404;-0.00036754112807103;0.00023722658806946;-0.0013501665089279;1.0637287459758e-06;-0.001689269207418;0.00010708332411014;-0.0010393792763352;1.7986962120631e-05;-0.00087737728608772;-6.4548061345704e-05;0.00045096481335349;-5.5249671504498e-07;7.2305765570491e-06;0.0001155439458671;0.00061359844403341;-0.0002245702635264;-2.5787181584747e-05;1.2306562894082e-05;0.00030536248232238;-4.5389846491162e-05;0.00028526660753414;-6.0365389799699e-05;-0.00068588036810979;-0.00011040289246012;0.00093303382163867;-3.2023737730924e-05;-0.00039974573883228;-0.00033560846350156;9.7527517937124e-05;-0.00024500588187948;0.00012782702106051;-9.734580089571e-05;0.00013656764349435;-6.8194305640645e-05;9.5172996225301e-05;-0.00035166367888451;9.8297474323772e-05;-0.00015837930550333;3.4242970286869e-05;0.00072603422449902;6.9245550548658e-05;-0.00081634242087603;4.544950206764e-05;2.9479027944035e-05;-0.00022854580311105;0.00033470202470198;-0.00039565024781041;0.00054944871226326;-0.00015548431838397;-0.00062801677267998;0.00018431703210808;-2.1488547645276e-05;-3.031184860447e-05;-0.00016123478417285;-0.00028918083989993;0.0011557767866179;-0.00020436332852114;0.0013481247005984;-0.00020902208052576;-0.00075870053842664;-0.00010717170516727;0.00069443363463506;-0.00014009219012223;0.00028451828984544;0.00068197777727619;0.00021563285554294;-0.00070568901719525;0.00033428409369662;-0.0007244236767292;8.045226422837e-05;0.00027724119718187;0.00018618321337271;-0.0016426453366876;6.2705898017157e-05;-7.628537423443e-05;4.5482542191166e-05;0.00048063779831864;-0.00026171025820076;0.0011023383121938;-0.00012992467964068;0.00079245585948229;0.00013864261563867;-0.0003294630732853;-7.0837719249539e-05;0.00043951882980764;1.3703804143006e-05;0.0014010907616466;-4.1508959839121e-05;-0.00020126278104726;-0.00023724317725282;0.00022073101717979;4.6336732339114e-05;0.00015050341608003;-0.00025797577109188;0.00023652162053622;-0.00096678454428911;4.1430230339756e-05;-0.0014450732851401;0.00011030519090127;-0.00082669639959931;3.1204170227284e-05;-0.000682333833538;-3.3812157198554e-05;0.00024730319273658;1.5378501529995e-06;7.0927212618699e-06;6.9806388637517e-05;0.00044538773363456;-0.00018597760936245;8.2793549154303e-06;2.6200266802334e-05;0.00022738079132978;-6.9059155066498e-05;0.00027475331444293;-5.0491722504376e-05;-0.0005072980420664;-8.702879131306e-05;0.00075233867391944;-6.0228499023651e-06;-0.00032247102353722;-0.00023331955890171;5.2850678912364e-05;-0.00022645207354799;0.00010469269909663;-9.0519723016769e-05;0.00013460409536492;-2.4129969460773e-05;9.3330039817374e-05;-0.00026519084349275;5.7205368648283e-05;-0.00016519085329492;2.8195820050314e-05;0.00051771727157757;4.9309885071125e-05;-0.00061753077898175;2.9178279874031e-05;3.0953404348111e-05;-0.0001656626991462;0.00021849187032785;-0.00027484862948768;0.00028391802334227;-0.0001085924814106;-0.00054939469555393;0.00011966391321039;2.4682040020707e-05;-2.0145702364971e-05;-0.00014066328003537;-0.00021620590996463;0.00077655911445618;-0.00014523316349369;0.0009381408453919;-0.00015471020014957;-0.0005857254145667;-6.9325724325608e-05;0.00050700234714895;-5.5987868108787e-05;0.0001909905258799;0.00057950068730861;0.00015437303227372;-0.00044384630746208;0.00024138850858435;-0.00038929839502089;6.0448299336713e-05;0.00022034673020244;0.00013825128553435;-0.0011942484416068;9.2985945229884e-05;-6.1677827034146e-05;-0.00084629410412163;-2.9730199457845e-05;-0.001768090412952;0.0003530403773766;-0.00093339703744277;0.00012232133303769;0.00021942562307231;-8.4064718976151e-05;-0.00040443663601764;7.6528238423634e-05;-0.0022833617404103;-2.2484730379801e-06;0.00019004019850399;1.053361211234e-05;0.00029915638151579;-0.00023709060042165;5.257673910819e-05;0.00051419954979792;-0.00022485332738142;0.0011365971295163;-0.00036826063296758;0.002290055854246;-8.5032785136718e-05;0.0013672367203981;-9.6491174190305e-05;0.00069120031548664;-3.7471028917935e-05;6.6210527620569e-06;3.9981481677387e-05;-1.4318091416499e-05;-1.5014996961327e-06;0.00049975072033703;2.0388088159962e-05;0.00015694841567893;-0.00015682024240959;0.00012774279457517;3.4599070204422e-05;0.00020586074970197;-1.1595028809097e-05;-0.00078314985148609;-2.1681284124497e-05;0.00085453764768317;-7.5173076766077e-05;0.00015437461843248;-5.1542971050367e-05;-0.00012857855472248;4.2608746298356e-05;-0.00024848137400113;-0.00030634668655694;0.00012463278835639;0.00012635024904739;9.2764494183939e-05;-0.00015568708477076;7.3822608101182e-05;-0.00052691518794745;6.8157431087457e-05;0.00095929153030738;3.9387902006638e-07;-0.001136974315159;7.6541451562662e-05;4.8909092583926e-05;3.8040798244765e-05;4.2409341403982e-05;-0.00017829064745456;0.00039499159902334;-0.00032966115395539;-0.00041891119326465;-0.00020418598433025;1.9004373825737e-05;0.00017182950978167;0.00014421834202949;-3.5251934605185e-05;0.0011692693224177;-0.00026018547941931;0.00089796358952299;-0.00016977450286504;-0.00013760212459601;-0.0007402211194858;-0.00013424312055577;0.00011182510934304;0.00050947221461684;0.00052190897986293;0.00038223835872486;-0.00063819804927334;0.00018485228065401;-0.00059373601106927;0.00029137209639885;-0.00015961554890964;8.3221995737404e-05;-0.0011777309700847;0.00016608076111879;0.00010965242108796;-6.8462002673186e-05;-0.00094478687969968;-3.9021269913064e-05;-0.0020029656589031;0.00037132381112315;-0.0010826801881194;0.00012748582230415;0.00028700707480311;-9.812929056352e-05;-0.00043941280455329;7.8753218986094e-05;-0.0025564560201019;-3.1185143598123e-05;0.00021475803805515;3.481163048491e-06;0.00031458894954994;-0.00032397350878455;3.1041279726196e-05;0.00061557139270008;-0.00022558053024113;0.0013368630316108;-0.00037950382102281;0.0025429443921894;-7.3931478254963e-05;0.0015478394925594;-8.7334301497322e-05;0.00077746767783538;-3.1720512197353e-05;-3.4521959605627e-05;6.0887621657457e-05;-2.4489580027875e-05;-2.5079444299081e-07;0.00058554124552757;3.3794458431657e-05;0.00016778860299382;-0.00017007043061312;0.00014884216943756;3.2557920349063e-05;0.00021772549371235;-9.6178030162264e-07;-0.00090208521578461;-2.6476995117264e-05;0.00097222370095551;-8.6931002442725e-05;0.00017457513604313;-6.4476400439162e-05;-0.00015663694648538;6.9401154178195e-05;-0.00026043248362839;-0.00034463871270418;0.00013318029232323;0.00012245260586496;8.4485727711581e-05;-0.00018586657824926;7.8450830187649e-05;-0.00057992339134216;8.4280778537504e-05;0.001140812295489;1.5163846001087e-06;-0.0013335429830477;8.9154542365577e-05;5.2973140554968e-05;4.8343797971029e-05;4.6249064325821e-05;-0.00021498579008039;0.00051889388123527;-0.00039598380681127;-0.0004621061088983;-0.0002447841106914;7.8627244874951e-06;0.00021018405095674;0.00019406368664932;-4.2837640648941e-05;0.0014082618290558;-0.00030532962409779;0.0010832876432687;-0.00020128801406827;-0.00015737174544483;-0.00087195768719539;-0.00016564430552535;0.00011655655544018;0.00060508807655424;0.00058590760454535;0.00046612488222308;-0.00077486527152359;0.0002207396319136;-0.00075388175901026;0.0003438777057454;-0.00021163976634853;9.8350734333508e-05;-0.0013990513980389;0.00019496202003211;8.0799814895727e-05;-7.5035777626908e-06;-1.9573897588998e-05;-4.0877159335651e-05;-0.00043231109157205;-0.00012744551349897;-0.00027263991069049;-0.00014252944674809;0.00010039610788226;0.00015084689948708;2.4679409307282e-06;-3.9623402699362e-05;8.2038655818906e-05;-0.00028812885284424;7.4538809712976e-05;-0.0001756996352924;-0.00015916991105769;-0.00041903555393219;-0.00013272879004944;0.00041567694279365;0.00015214401355479;0.00055511016398668;0.00015141900803428;-2.9454669856932e-05;0.00016091135330498;0.0001453701115679;0.00026311964029446;-2.2146768969833e-05;9.317220246885e-05;-0.00031067823874764;0.00019153476750944;-1.308095852437e-05;-1.8094485767506e-06;0.00023746537044644;0.0001029402774293;0.0002385464758845;8.6651023593731e-05;0.00012063290341757;-2.773856431304e-05;-0.00030435607186519;9.270675946027e-05;-0.00018173978605773;-1.8286735212314e-05;0.00012851164501626;-4.239312329446e-05;0.00031268878956325;-2.8237296646694e-05;-0.00015780027024448;0.0002527694159653;0.00029835372697562;-7.381663453998e-05;-7.9915316746337e-06;-0.00037522640195675;-0.00029244279721752;-0.00020402006339282;-5.6081560614984e-05;-0.00018849987827707;5.4863427067176e-05;0.00048127051559277;4.8198191507254e-05;-0.00049215188482776;1.0074474630528e-05;-4.0957889723359e-05;4.629139584722e-05;0.00011928645108128;-6.742800178472e-05;0.00079021730925888;-9.7204152552877e-05;0.00018983930931427;-6.0460228269221e-05;-8.9047724031843e-05;9.1061665443704e-05;0.00031551951542497;3.1569761631545e-06;0.00090484006796032;2.8364542231429e-05;0.00051083648577332;-1.2883546332887e-05;-9.0967325377278e-05;-0.00027541851159185;-0.00011508761235746;-9.4549046480097e-05;0.00024301980738528;-0.00010871937411139;0.00024106996716;-0.00072586286114529;-6.5684907895047e-06;-0.0008491002372466;-9.7212375749223e-07;-0.00031091697746888;-1.6025597915359e-06;-0.00053136108908802;-4.3957288653473e-06;7.4226933065802e-05;-8.1928737927228e-06;6.2449785218632e-06;-3.3932978112716e-05;-0.00038796066655777;-0.0001147071379819;-0.00022763412562199;-0.0001398690365022;7.2197588451672e-05;0.00016177725046873;-4.1492739910609e-06;-3.5229939385317e-05;0.00011124439333798;-0.00027331878663972;6.23400483164e-05;-0.00017594524251763;-0.00015628666733392;-0.00037453265395015;-0.00012258658534847;0.00038236027467065;0.0001343686162727;0.00049710407620296;0.00013745426258538;-6.4430758357048e-05;0.00014935414947104;0.0001144412017311;0.00025429655215703;-2.0583278455888e-05;8.5748652054463e-05;-0.00029085285495967;0.00018705389811657;-1.0044091141026e-05;-6.8234896843933e-07;0.00020015072368551;0.00010010114783654;0.00022930084378459;9.568873065291e-05;0.00013612928160001;-1.9331417206558e-05;-0.00030855421209708;7.9694662417751e-05;-0.00014567375183105;-2.0693572878372e-05;9.0937995992135e-05;-4.2996431147913e-05;0.00027589264209382;-1.8024578821496e-05;-0.00014639786968473;0.00026104695280083;0.00030427807359956;-5.9599598898785e-05;-1.9734774468816e-05;-0.00039524416206405;-0.00029896190972067;-0.00017019564984366;-5.3026175010018e-05;-0.00017092854250222;4.400877878652e-05;0.00041188846807927;5.2493352995953e-05;-0.00040736957453191;5.8470100157137e-06;-3.3206164516741e-05;3.9404378185282e-05;0.00011530984193087;-5.1264258217998e-05;0.00072342588100582;-6.3599931309e-05;0.00018710245785769;-4.3003346945625e-05;-8.3555234596133e-05;7.7132339356467e-05;0.000266355171334;9.1287274699425e-06;0.00080912106204778;5.0640366680454e-05;0.00045742921065539;6.5251668956989e-07;-9.1963760496583e-05;-0.00023831304861233;-9.9133270850871e-05;-8.5840743849985e-05;0.00021432706853375;-0.00011421522503952;0.00020305241923779;-0.00064909219508991;-2.929084621428e-05;-0.00076874007936567;-2.5838809960987e-05;-0.00026901834644377;-8.0284007708542e-06;-0.00048132476513274;-1.765302658896e-05;4.2381994717289e-05;-5.7532097343937e-06;1.5557754522888e-05;-1.8191709386883e-05;-0.00022814805561211;-6.4647181716282e-05;-0.0001262386504095;-8.6672887846362e-05;3.2840700441739e-05;0.0001082027083612;-6.3909583332133e-06;-1.9392837202759e-05;8.0656929640099e-05;-0.00016470685659442;3.6606976209441e-05;-0.00011199201981071;-9.5426781626884e-05;-0.00021573256526608;-7.3169147071894e-05;0.00022522584185936;7.4775220127776e-05;0.00029107442242093;7.927390106488e-05;-5.4046238801675e-05;8.8118060375564e-05;6.0058599046897e-05;0.00015580261242576;-6.0945344557695e-06;4.9109177780338e-05;-0.00018002824799623;0.00011694701242959;-4.8813221837918e-06;-7.1455095174144e-09;0.00011355947208358;6.23519445071e-05;0.00014062326226849;6.5003856434487e-05;9.586859960109e-05;-6.9999887273298e-06;-0.00019803848408628;4.3975254811812e-05;-8.5015417425893e-05;-1.4685257156088e-05;4.1542149119778e-05;-2.831397796399e-05;0.00015618986799382;-7.0536584644287e-06;-8.8022454292513e-05;0.00017286470392719;0.00019495860033203;-3.4768814657582e-05;-1.8468952475814e-05;-0.00026112826890312;-0.00019422647892497;-8.8107539340854e-05;-3.146367816953e-05;-0.00010090252180817;2.2844902559882e-05;0.00023366911045741;3.5695695260074e-05;-0.00021951341477688;2.4499493065377e-06;-1.6392479665228e-05;2.1325180568965e-05;7.3826391599141e-05;-2.4880491764634e-05;0.00043065191130154;-2.4413229766651e-05;0.00011504560097819;-1.9223351046094e-05;-5.1260558393551e-05;4.2816296627279e-05;0.00014079712855164;8.4536677604774e-06;0.00047103848191909;4.248116601957e-05;0.0002714104775805;6.7214405135019e-06;-5.9705816966016e-05;-0.00013434466382023;-5.4249790991889e-05;-5.2008927013958e-05;0.00012374723155517;-7.371242827503e-05;0.00010997465142282;-0.00037952492129989;-2.958870936709e-05;-0.00045247742673382;-2.7720509024221e-05;-0.00014352730067912;-7.5398997978482e-06;-0.00028990159626119;-1.7817546904553e-05;3.3850719773909e-06;-8.5546998889185e-06;1.0697370271373e-05;-1.5014543350844e-06;6.3857341956464e-06;8.1299935118295e-05;2.8275759177632e-05;4.636007361114e-05;-4.4138028897578e-05;3.6322130654298e-06;3.4562581276987e-06;5.3649227993446e-06;5.4130290664034e-05;-2.0424600734259e-05;3.6858749808744e-05;-6.1416658354574e-06;1.4178836863721e-05;4.7407924284926e-05;4.246081061865e-06;-5.1200977395638e-06;-5.9690450143535e-05;-4.368077043182e-06;-8.8362423412036e-05;-3.254981857026e-05;4.8683164095564e-06;-4.9116079026135e-05;-2.5891429686453e-05;-1.4440468476096e-05;-3.6324734082882e-06;-3.6406396247912e-05;4.9790625780588e-05;-4.7575093731211e-07;2.0242878235877e-06;1.8266093320563e-05;2.3025164409773e-05;2.2388401703211e-05;4.4850508857053e-05;-4.4985349632043e-06;5.1247348892502e-05;2.0148061594227e-05;-9.3265087343752e-05;8.1747725744208e-07;-2.6701776732807e-05;-1.8773103874992e-05;-5.3016237870906e-06;-6.4366454353149e-06;4.999494922231e-05;-2.7232686989009e-05;5.7562174333725e-05;6.8903573264834e-05;-3.4116126244044e-06;-7.5139837463212e-06;-6.7176304582972e-05;-9.6542826213408e-05;-1.1248609553149e-05;-1.3789652939522e-06;1.4763578292332e-05;-3.9638052840019e-05;1.1668726983771e-05;5.2057548600715e-05;6.8283061409602e-06;-3.4950637200382e-05;4.6340692279045e-06;-1.8045194565275e-06;-1.7896531971928e-06;2.4333641704288e-05;2.0106373995077e-05;0.0001075388645404;8.5996362031437e-06;4.9449517973699e-05;7.7347158367047e-06;-2.4458175175823e-05;7.0277046688716e-06;2.0182005755487e-05;2.6643087039702e-05;0.00011521304986672;6.7570581450127e-06;7.2418559284415e-05;-2.2175639969646e-05;-2.3836953914724e-05;-4.6887867029e-06;3.1192132155411e-05;-1.511458413006e-05;4.0779363530419e-07;-2.5510245905025e-05;-2.6793692086358e-05;-9.0285771875642e-05;-2.5175533664878e-05;-0.000119863449072;-6.945891527721e-06;-2.1451294742292e-05;-1.0250932064082e-05;-8.209307998186e-05;-2.6523457563599e-06;-4.5270844566403e-05;8.2656712038442e-05;5.4462558182422e-05;0.00010562391980784;0.00033186463406309;7.5596573879011e-05;0.00033283061929978;-4.2135656258324e-05;-0.00014913623454049;4.1814117139438e-05;1.5489285942749e-06;0.00024156959261745;-2.2381973394658e-05;8.9211389422417e-05;-9.165227675112e-05;5.5852149671409e-05;0.00032934991759248;7.229427137645e-05;-0.0001281077566091;-0.00025653050397523;-7.6382988481782e-05;-0.00050533068133518;-0.00017644053150434;-4.59438560938e-05;-0.00017927534645423;-0.00014154824020807;-8.8880406110547e-05;-9.7718766483013e-06;-0.00012293149484321;0.00026969765895046;-6.8077110881859e-06;5.0925013965752e-06;7.8099619713612e-05;0.00020066821889486;2.8512744393083e-05;0.00011258454469498;-4.4710865040543e-05;6.6511020122562e-05;9.0775320131797e-05;-0.00020654359832406;9.9422632047208e-06;-0.00021676001779269;-4.2798015783774e-05;0.00011929132597288;-4.8656620492693e-05;0.00025735062081367;-0.00014402065426111;0.00013104673416819;0.0001840543554863;3.8262201996986e-05;-4.5282558858162e-05;-0.00017101821140386;-0.00019659283861984;-5.9147419960937e-05;-9.648463310441e-05;8.2766688137781e-05;-0.00014429556904361;2.2586862542084e-05;0.0003998810716439;2.3166096070781e-05;-0.00042747348197736;4.1189658077201e-05;-3.2646352337906e-05;-8.0299047112931e-05;0.00010268542246195;-0.00010778717842186;0.00055303802946582;-3.5408622352406e-05;9.5122755737975e-05;6.7046988988295e-05;-6.2003127823118e-05;-1.281285449295e-06;0.00020960519032087;-1.1092985005234e-05;0.00066606752807274;-2.8687220037682e-05;0.00042535830289125;-6.7669316194952e-05;-0.00023786957899574;-9.8484459158499e-05;0.00023145844170358;-8.6032450781204e-05;0.00017126875172835;-1.1670077583403e-05;3.1846047932049e-05;-0.00052194070303813;2.5753763111425e-05;-0.00062021886697039;-8.6248269326461e-07;-0.00019920509657823;2.0180534193059e-05;-0.00043746261508204;8.1802943896037e-05;-0.00010255867528031;6.7067914642394e-05;0.00075954658677801;-0.00039370899321511;0.0015384381404147;-0.000128419851535;0.0011857431381941;0.00013409438543022;-0.00035127770388499;-0.0001017834074446;0.00043466986971907;3.6350935260998e-05;0.0020231809467077;-2.9660641303053e-05;-0.00033102481393144;-0.00033458601683378;0.00034717746893875;-5.8892266679322e-05;0.00020654001855291;-0.00044692232040688;0.00037713526398875;-0.0013243501307443;7.5481802923605e-05;-0.001969508593902;0.00011015155905625;-0.0012280961964279;3.2120147807291e-05;-0.0007817727746442;-5.3408424719237e-05;0.00022646963770967;-5.8762166190718e-06;2.4755013328104e-06;5.8287034335081e-05;0.00058013678062707;-0.00020190380746499;2.9387263566605e-05;3.3255382732023e-05;0.00010349662625231;-3.5576875234256e-05;0.00025895357248373;-3.0420645998674e-05;-0.00082379445666447;-0.00011204789188923;0.00085425726138055;-4.9323265557177e-05;5.9798549045809e-05;-0.00024389654572587;3.6876623198623e-05;-0.00023299097665586;0.00017385340470355;-0.00023480347590521;7.8371427662205e-05;0.00014592103252653;8.9614120952319e-05;-0.00015155726578087;9.8763295682147e-05;-0.00039794045733288;1.4324239600683e-05;0.00096721469890326;8.6395477410406e-05;-0.00115125044249;5.810585571453e-05;2.7084173780167e-05;-0.00025271726190113;0.00016811388195492;-0.00041236248216592;0.00054933817591518;-0.00016133089957293;-0.00056046422105283;0.00014581569121219;4.461322168936e-05;-5.2461524319369e-05;7.0178386522457e-05;-0.00030865651206113;0.0012044385075569;-0.0001745344925439;0.0011044736020267;-0.00015591198462062;-0.00079687929246575;-0.00013584450061899;0.00066020101075992;-4.0062237530947e-05;0.00035408724215813;0.00062810443341732;0.00026076490757987;-0.00072338891914114;0.00031927952659316;-0.00068376946728677;0.00010030384873971;-2.460179530317e-05;0.00017685651255306;-0.0013887732056901;7.4411007517483e-05;-8.6962601926643e-05;4.5426171709551e-05;0.00069278653245419;-0.00038017929182388;0.001338412403129;-0.00011452862236183;0.0009918618015945;0.00010524463868933;-0.00025235762586817;-9.9586482974701e-05;0.00036542720044963;-2.2875848060266e-07;0.0018276529153809;-3.0822986445855e-05;-0.00027041396242566;-0.00031389851938002;0.00024420217960142;-8.8878696260508e-05;0.00021990103414282;-0.00037662900285795;0.00036429864121601;-0.0010785050690174;9.8813616205007e-05;-0.0017647469649091;0.00011572946095839;-0.0010900946799666;4.0023292967817e-05;-0.00065783353056759;-3.1620504159946e-05;0.00011309639376123;-4.1746689021238e-06;2.4294481590914e-06;3.4220858651679e-05;0.00046752949128859;-0.00017427893180866;3.6304387322161e-05;3.6798090150114e-05;7.0655107265338e-05;-4.259324123268e-05;0.00023715077259112;-2.5200819436577e-05;-0.00068522349465638;-9.3700786237605e-05;0.00071903481148183;-3.5152752388967e-05;7.5195639510639e-05;-0.00018362072296441;1.3238572137197e-05;-0.00021553941769525;0.00015105382772163;-0.00021104338520672;7.8981051046867e-05;0.00015422217256855;8.4603889263235e-05;-0.00010912350990111;7.4061172199436e-05;-0.00036576160346158;1.0713683877839e-05;0.00079802109394222;7.1653463237453e-05;-0.00097045412985608;4.6210225264076e-05;2.6755786166177e-05;-0.00020698542357422;0.00011778058251366;-0.0003350640181452;0.00039887678576633;-0.00013073449372314;-0.00048700114712119;0.00010977526108036;5.8410802012077e-05;-4.4779455492971e-05;6.2228806200437e-05;-0.00025838072178885;0.00096830120310187;-0.00013946385297459;0.0008646190399304;-0.00012591750419233;-0.00066539103863761;-0.00011043553968193;0.00053641037084162;-5.4985030146781e-06;0.00028820664738305;0.00054324313532561;0.00021745024423581;-0.00056751485681161;0.00026115623768419;-0.00050609424943104;8.5440537077375e-05;-3.4030454116873e-05;0.0001455417368561;-0.0011131161591038;8.6918626038823e-05;-5.7674496929394e-05;-0.00097628007642925;-8.9712748376769e-06;-0.0018237581243739;0.00040493803680874;-0.00093360512983054;9.0750785602722e-05;0.00013995765766595;-6.3765095546842e-05;-0.00015410628111567;7.3134578997269e-05;-0.0024282927624881;8.2125179687864e-06;6.2711733335163e-05;2.0161423890386e-05;0.00030312547460198;-0.00021078978898004;0.00017493013001513;0.0006428126944229;-0.0002774711465463;0.0010160988895223;-0.00042173045221716;0.0022736163809896;-0.00011105911107734;0.001551641500555;-9.8884913313668e-05;0.00042906843009405;-2.7163836421096e-05;0.00029513327172026;2.0340414266684e-05;-5.8951074606739e-05;1.0402235602669e-05;0.00033771811285987;-2.4945446057245e-05;9.302706894232e-05;-9.3026632384863e-05;-2.4103208488668e-05;3.5107132134726e-05;0.00011173304665135;2.8177237254567e-05;-0.00068673206260428;-5.5236087064259e-06;0.00057092611677945;-5.8391880884301e-05;0.00047078507486731;-6.8138040660415e-05;2.8167094114906e-06;1.5029121641419e-05;-0.00018444260058459;-0.00033309427089989;9.3458802439272e-05;0.00026283826446161;1.1606648513407e-05;7.4495212174952e-05;5.9196248912485e-05;-0.00056580983800814;6.0391743318178e-05;0.0010211619082838;-1.714540849207e-05;-0.0012160558253527;7.7489246905316e-05;3.5124645364704e-05;5.2252704335842e-05;-0.00018309518054593;-0.0001947088749148;0.00038623315049335;-0.00033609406091273;-0.00023102638078853;-0.00019883539061993;4.7447447286686e-05;0.00013636867515743;0.00042755214963108;-5.8070152590517e-05;0.0011562665458769;-0.00026526435976848;0.00061861611902714;-0.00013440633483697;-4.9349120672559e-05;-0.00071618048241362;-0.00018653763982002;0.00020462389511522;0.00042524168384261;0.00039282863144763;0.00045832659816369;-0.00056945026153699;0.00022505249944516;-0.00061320938402787;0.0002602111781016;-0.00051790016004816;9.9088640126865e-05;-0.00081962859258056;0.00014852176536806;0.00010709817433963;-6.5526430262253e-05;-0.0010947930859402;-1.0742383892648e-05;-0.0020394283346832;0.00043219103827141;-0.0010663262801245;8.7218824774027e-05;0.00018005351012107;-7.208960596472e-05;-0.00013143147225492;7.5388656114228e-05;-0.0027185813523829;-1.7350221241941e-05;5.8730132877827e-05;1.6083127775346e-05;0.00031258226954378;-0.00028227144503035;0.00018700033251662;0.00076365302084014;-0.00028680224204436;0.0011612507514656;-0.00044504628749564;0.0025018209125847;-0.00010813156404765;0.0017544779693708;-8.935196819948e-05;0.00044200359843671;-1.8310000086785e-05;0.00033173212432303;3.4897955629276e-05;-8.9701235992834e-05;1.9066857930738e-05;0.00038034515455365;-2.5622150133131e-05;0.00010458887845743;-9.4798248028383e-05;-4.4069071009289e-05;3.3678512409097e-05;0.00011643116158666;3.8525929994648e-05;-0.00072992214700207;-1.0567193385214e-05;0.00063089170726016;-6.7374101490714e-05;0.0005507625755854;-7.8720026067458e-05;8.5867768575554e-06;2.5802375603234e-05;-0.0001846075465437;-0.00037027776124887;9.5013398095034e-05;0.00028871383983642;-5.1583051572379e-06;5.4525313316844e-05;6.6358545154799e-05;-0.00062092777807266;7.0695037720725e-05;0.0011832118034363;-1.8225817257189e-05;-0.0014157346449792;8.8508029875811e-05;3.7210720620351e-05;6.5560110670049e-05;-0.00024161592591554;-0.00023313285782933;0.00046749447938055;-0.00039904096047394;-0.00023758724273648;-0.00023512558254879;4.5690099796047e-05;0.000164706070791;0.00053681817371398;-7.0536210841965e-05;0.0013653953792527;-0.00030978288850747;0.00072310079121962;-0.00015709381841589;-4.9157555622514e-05;-0.00084376556333154;-0.00023052620235831;0.00024448780459352;0.00049733789637685;0.00044305852497928;0.00055396935204044;-0.00065171264577657;0.00026788224931806;-0.00075246469350532;0.00030310379224829;-0.00065582548268139;0.00011720128532033;-0.00093830260448158;0.00017265361384489;7.060282950988e-05;-1.9327212612552e-06;-8.8329674326815e-05;-4.2408446461195e-05;-0.00032227177871391;-0.00010110768926097;-0.0002193646505475;-9.8426709882915e-05;8.582651935285e-05;7.7998112828936e-05;6.7059096181765e-05;-3.9307840779657e-05;1.1785149581556e-05;-0.00022517624893226;5.9162113757338e-05;-0.00010859074245673;-0.00010364061017754;-0.00033700925996527;-8.5082356235944e-05;0.00033895132946782;0.00012364513531793;0.00040872776298784;0.00011468850425445;2.4105016564135e-05;0.0001333795953542;0.00012451061047614;0.00018753188487608;-0.0001044101518346;8.6278865637723e-05;-0.00016824134218041;0.00013104770914651;-1.833728128986e-05;-6.4545793065918e-07;0.00019656271615531;6.4213636505883e-05;0.00018120862659998;4.6554956497857e-05;-2.6683642317948e-06;-2.7100135412184e-05;-0.00016519436030649;6.2234823417384e-05;-0.0001267516927328;-6.1191494751256e-06;0.0001341645111097;-2.1048699636594e-05;0.00031772698275745;-2.1067951820442e-05;-0.00011356148024788;0.00011462794645922;0.00018855868256651;-6.0938335082028e-05;2.7905889510293e-05;-0.00016838198644109;-0.0001802113984013;-0.00021480429859366;-4.4864307710668e-05;-0.00016166007844731;4.2202133045066e-05;0.00042383139953017;2.498702815501e-05;-0.00049588596448302;4.4615694605454e-06;-5.1284376240801e-05;4.733819514513e-05;4.2786570702447e-05;-7.2056725912262e-05;0.00060532958013937;-0.00011353437730577;0.0001509233698016;-6.6537693783175e-05;-5.4526273743249e-05;7.4697796662804e-05;0.00036881299456581;-8.5700985437143e-06;0.00073511112714186;-1.0017297427112e-05;0.00034397828858346;-2.1566218492808e-05;-4.4428150431486e-05;-0.00024559730081819;-0.00011321315832902;-4.4457090552896e-05;0.00018941079906654;-7.460262713721e-05;0.00023704770137556;-0.00059390993556008;3.3886219171109e-05;-0.00066171906655654;2.6931778847938e-05;-0.00036480894777924;5.6853505157051e-06;-0.00033500150311738;1.3891141861677e-05;9.2733906058129e-05;-3.4735396639007e-06;-7.2918322985061e-05;-4.8345602408517e-05;-0.00038751566899009;-0.00012959756713826;-0.00024352979380637;-0.00013106408005115;9.3356880825013e-05;0.00011576975521166;6.5526721300557e-05;-5.0122929678764e-05;6.7656110331882e-05;-0.00029359202017076;5.7021174143301e-05;-0.00014808702690061;-0.00014991327770986;-0.00041205633897334;-0.00011121489660582;0.00042461411794648;0.00015597349556629;0.00049427733756602;0.00014521295088343;-2.0411183868418e-05;0.00017090499750338;0.00013091256550979;0.00024837238015607;-0.00013461774506141;0.00011211528908461;-0.00021176667360123;0.00017377897165716;-1.9816772692138e-05;3.2237824143522e-07;0.0002132946101483;8.7882239313331e-05;0.00023251157836057;7.3681469075382e-05;2.5747833205969e-05;-3.2880892831599e-05;-0.00023495226923842;7.4083793151658e-05;-0.0001058392736013;-1.1281563274679e-05;0.00013617945660371;-2.8298085453571e-05;0.00037001885357313;-1.6956677427515e-05;-0.00014498531527352;0.00016644770221319;0.00026861403603107;-5.0429265684215e-05;2.0838569980697e-05;-0.00026857768534683;-0.00024967070203274;-0.00026129398611374;-5.9871479606954e-05;-0.00018850663036574;4.6827055484755e-05;0.00047266946057789;3.9556234696647e-05;-0.00055449153296649;-8.2313346183582e-07;-5.9916757891187e-05;5.5646069085924e-05;5.8724534028443e-05;-7.7651020546909e-05;0.00073983438778669;-0.00011416975758038;0.0002021814143518;-6.905338523211e-05;-6.9127687311266e-05;8.6533778812736e-05;0.00043251950410195;-2.2747949515178e-06;0.00088054209481925;1.4744288819202e-05;0.00040950215770863;-1.467499168939e-05;-6.4789310272317e-05;-0.0002894421631936;-0.0001371066464344;-5.312043504091e-05;0.00022584291582461;-0.00010576344357105;0.00027636875165626;-0.00070360471727327;1.6313546439051e-05;-0.00080471980618313;6.7878108893638e-06;-0.00044182685087435;-2.4562109501858e-06;-0.0004001577035524;4.314407306083e-06;7.6193035056349e-05;-3.9161768654594e-06;-3.0555038392777e-05;-3.3787066058721e-05;-0.00029425858519971;-9.8448173957877e-05;-0.00016680239059497;-0.00010515748726903;6.0608788771788e-05;0.00010219716205029;3.1221206882037e-05;-3.8495614717249e-05;8.567376062274e-05;-0.00023484726261813;3.2129973988049e-05;-0.00012241885997355;-0.0001295701804338;-0.00030916088144295;-8.8101791334338e-05;0.00032860159990378;0.00011949016334256;0.00037129494012333;0.00010883843060583;-4.3355143134249e-05;0.00013358132855501;8.6115011072252e-05;0.00019997340859845;-0.00010467187530594;8.9706460130401e-05;-0.00016305466124322;0.0001409759715898;-1.2380396583467e-05;1.2106579561078e-06;0.00014170845679473;7.3374147177674e-05;0.00018421608547214;6.7802197008859e-05;3.9422164263669e-05;-2.3773700377205e-05;-0.00019936698663514;5.199848965276e-05;-4.0631512092659e-05;-1.110217817768e-05;8.4376879385673e-05;-2.3192003936856e-05;0.00026516357320361;-4.8385181798949e-06;-0.00011566028842935;0.00014319532783702;0.00023083330597728;-1.8574603018351e-05;7.6679343692376e-06;-0.00024817243684083;-0.00021017702238169;-0.000200730850338;-4.9142305215355e-05;-0.00013527703413274;3.0870462069288e-05;0.00032099420786835;3.6624842323363e-05;-0.00038062097155489;-5.817932105856e-06;-4.3767384340754e-05;4.04935417464e-05;5.1058079407085e-05;-5.0339396693744e-05;0.00055854598758742;-6.70031804475e-05;0.00016634062922094;-4.2455209040781e-05;-5.412978498498e-05;6.1881728470325e-05;0.00031409287475981;4.8280521696142e-06;0.0006542427581735;3.2469233701704e-05;0.00030084417085163;-2.3064048946253e-06;-5.8030735090142e-05;-0.00021118547010701;-0.00010297664994141;-3.8571728509851e-05;0.00016691900964361;-9.0072542661801e-05;0.00019858706218656;-0.00051664107013494;-7.5256175477989e-06;-0.00060625723563135;-1.5391042325064e-05;-0.00033286798861809;-9.7029660537373e-06;-0.000294785189908;-6.2935309870227e-06;-7.492752502003e-06;-4.6644552639918e-05;8.5870720795356e-05;7.4152878369205e-05;0.00010744883184088;0.00025446727522649;7.4568102718331e-05;0.00025549161364324;-3.6963945603929e-05;-0.00010996790661011;4.7150893806247e-05;-5.1622060709633e-05;0.00023906683782116;-4.5669166865991e-05;7.6614560384769e-05;-6.9763191277161e-05;4.7003893996589e-05;0.00029326986987144;5.4841537348693e-05;-0.00012131045514252;-0.0002397028147243;-7.4895971920341e-05;-0.00040313097997569;-0.00017844699323177;-1.0869624020415e-05;-0.00017207099881489;-9.4243448984344e-05;-9.8728589364327e-05;8.1890801084228e-05;-0.00010974300676025;0.00017942862177733;-5.0755684242176e-06;6.3076204241952e-06;6.4321691752411e-05;0.00015905308828223;3.2030322472565e-05;0.00010932530130958;-3.8343532651197e-05;-4.9598033911025e-06;6.3816245528869e-05;-0.00015645605162717;1.4576146895706e-05;-0.00015393087232951;-2.9754821298411e-05;9.6117611974478e-05;-2.95581521641e-05;0.00028350070351735;-0.00012663730012719;7.8517681686208e-05;0.00017466909775976;5.1380411605351e-05;-2.4905350073823e-05;-0.00015450979117304;-0.00013383831537794;-6.3336250605062e-05;-0.00010689907503547;6.3255021814257e-05;-0.00013316648255568;1.9243545466452e-05;0.00035744975320995;1.0283241863362e-05;-0.00042247615056112;4.1834926378215e-05;-3.9911250496516e-05;-7.1852904511616e-05;6.1282116803341e-05;-9.3000060587656e-05;0.00048772580339573;-2.9806080419803e-05;0.00010773642134154;5.3548148571281e-05;-4.2001760448329e-05;7.7564260436702e-07;0.00026283547049388;9.9476849868552e-08;0.0005944324657321;-1.8557784642326e-05;0.00030771770980209;-5.0829108658945e-05;-0.00021676036703866;-0.00010135719639948;0.00019183824770153;-4.9892481911229e-05;0.00017158464470413;-2.7575975764194e-05;2.8763737645932e-05;-0.00047681853175163;9.2644295364153e-06;-0.00053636386292055;-8.8707711256575e-06;-0.00026649559731595;1.5350953617599e-05;-0.00030469647026621;-8.1466396295582e-06;-5.919385512243e-05;0.00010720366117312;9.8771379271057e-05;0.00013253815995995;0.00034306902671233;9.2428665084299e-05;0.00034844008041546;-4.352946052677e-05;-0.0001515309268143;5.7701501646079e-05;-5.9282469010213e-05;0.00029795232694596;-3.65848391084e-05;9.6194555226248e-05;-9.3734175607096e-05;5.9027079259977e-05;0.00038256173138507;7.1505157393403e-05;-0.00015455820539501;-0.00031082591158338;-9.4124319730327e-05;-0.00053638487588614;-0.00022131978766993;-3.1586656405125e-05;-0.00021437014220282;-0.00013874623982701;-0.00012114281707909;8.5163446783554e-05;-0.00013848810340278;0.00024099268193822;-6.909630883456e-06;5.83435758017e-06;8.2474696682766e-05;0.00021475608809851;3.6688074033009e-05;0.00013515289174393;-4.9612939619692e-05;-2.3903371584311e-06;8.6566040408798e-05;-0.00020053044136148;1.7683451005723e-05;-0.00021535785344895;-4.0300055843545e-05;0.00013025754014961;-4.351128518465e-05;0.00036031138733961;-0.00016227076412179;0.00010380642925156;0.00021615110745188;6.4687483245507e-05;-3.9870108594187e-05;-0.00019405157945585;-0.00016609401791357;-7.7339580457192e-05;-0.00013235879305284;8.5051877249498e-05;-0.00017166898760479;2.2926560632186e-05;0.00047322825412266;1.789882844605e-05;-0.00055120867909864;5.4198211728362e-05;-4.9543577915756e-05;-9.6555180789437e-05;8.3025122876279e-05;-0.00013039511395618;0.0006357308011502;-4.282462032279e-05;0.00013220841356087;7.1953989390749e-05;-5.713807331631e-05;-3.1840854717302e-06;0.0003283319529146;-1.0734857823991e-05;0.00077505590161309;-2.8493526770035e-05;0.00041659321868792;-6.6020947997458e-05;-0.00028362715966068;-0.00012869459169451;0.00025489085237496;-7.0327485445887e-05;0.000223835799261;-3.0951021471992e-05;4.5961936848471e-05;-0.00061855401145294;2.3108825189411e-05;-0.00070086854975671;-5.5341788538499e-06;-0.00032960262615234;2.3514203348896e-05;-0.00041535965283401;-5.5198988775373e-06;-4.493331653066e-05;8.4008381236345e-05;8.7932829046622e-05;9.9094759207219e-05;0.00028227074653842;6.689805741189e-05;0.00030394271016121;-2.5883762646117e-05;-0.00013138244685251;4.2633055272745e-05;-4.0648210415384e-05;0.00022437929874286;-4.0933937839327e-07;7.103783718776e-05;-9.2307309387252e-05;3.9499758713646e-05;0.00030997372232378;5.6268301705131e-05;-0.00012244390381966;-0.0002424290869385;-7.1125541580841e-05;-0.00044533985783346;-0.00016665745351929;-5.1533494115574e-05;-0.00015958958829287;-0.00012451387010515;-8.9672663307283e-05;4.3441388697829e-05;-0.00010520718933549;0.00020821610814892;-6.1519358496298e-06;2.7274575131742e-06;6.2811363022774e-05;0.00019170211453456;2.0254336050129e-05;9.7961390565615e-05;-3.6966634070268e-05;-1.1025978892576e-05;6.8998800998088e-05;-0.00014369387645274;1.3241677152109e-05;-0.00020466363639571;-3.2461030059494e-05;0.00012056388368364;-3.9249774999917e-05;0.00028971279971302;-0.00012922381574754;7.6748576248065e-05;0.00015213325968944;5.6271215726156e-05;-4.6777931856923e-05;-0.00014306876983028;-0.0001043930024025;-5.5889424402267e-05;-0.00010277816909365;6.9660964072682e-05;-0.00013905607920606;1.5071645975695e-05;0.00040498364251107;1.8642762370291e-05;-0.00046608579577878;4.4088981667301e-05;-3.8827012758702e-05;-8.3678700320888e-05;7.1947448304854e-05;-0.0001211444978253;0.00051663647172973;-4.166897633695e-05;9.042661258718e-05;6.111527181929e-05;-4.6689325245097e-05;-8.048248673731e-06;0.00025590806035325;-2.5061211999855e-05;0.00063469528686255;-2.9578410249087e-05;0.00035739553277381;-5.1403574616415e-05;-0.00023372114810627;-0.00010025487426901;0.00021354676573537;-6.4020336139947e-05;0.000184915625141;-1.5338442608481e-05;5.1466093282215e-05;-0.0005066244630143;3.5517768992577e-05;-0.00057195406407118;2.934120630016e-06;-0.00025008359807543;2.5036086299224e-05;-0.00035753319389187;7.3135270213243e-05;-8.9196895714849e-05;4.3445073970361e-05;0.00078748509986326;-0.00040945195360109;0.0013941826764494;-8.9504588686395e-05;0.0010464772349223;8.9251276222058e-05;-0.00022051528503653;-9.8680990049616e-05;0.00023127981694415;1.1512987839524e-05;0.0019625844433904;-2.6730303943623e-05;-0.0002319352934137;-0.00032274093246087;0.0002705357328523;-0.00015540853200946;0.00023935284116305;-0.00046931463293731;0.0003912117681466;-0.0010733199305832;0.00010654053039616;-0.0017906469292939;0.00010218609531876;-0.0012146169319749;2.9497481591534e-05;-0.00053338299039751;-3.1633524486097e-05;-2.1598614694085e-05;-4.1329644773214e-06;-1.33422545332e-05;1.588354462001e-05;0.00041590037290007;-0.00013120187213644;7.7257636803552e-06;3.429578646319e-05;-5.1267586968606e-05;-1.2928637261211e-05;0.00018060521688312;-6.6655211412581e-06;-0.00071727728936821;-8.8526096078567e-05;0.00058878830168396;-5.387736382545e-05;0.00031760192359798;-0.00012711616000161;-4.7085400183278e-06;-0.0001649405749049;0.00014567608013749;-0.00024360547831748;1.3540918189392e-05;0.00025537484907545;6.3048355514184e-05;3.0617098673247e-05;7.9642792115919e-05;-0.00041678923298605;-2.6499185423745e-06;0.00093513779575005;8.0780198913999e-05;-0.0011255895951763;5.8566121879267e-05;2.2065969460527e-05;-0.00022953184088692;4.0666227505426e-06;-0.00036488156183623;0.00046354896039702;-0.00014181544247549;-0.00037463160697371;0.00010165877029067;6.8609690060839e-05;-6.280930392677e-05;0.0002352352894377;-0.00027495255926624;0.001051583327353;-0.00012723788677249;0.0007535379845649;-8.6793494119775e-05;-0.00068639393430203;-0.00014771550195292;0.00052045815391466;4.3863128666999e-05;0.00036152292159386;0.0004608804883901;0.00025712911156006;-0.00060273939743638;0.00025903890491463;-0.00057593901874498;0.00010017187014455;-0.00025760967400856;0.00014219641161617;-0.00097108248155564;7.156466745073e-05;-8.2538106653374e-05;2.5791578082135e-05;0.00077907741069794;-0.00042545309406705;0.0013469205005094;-8.5349078290164e-05;0.00097128504421562;7.7690645412076e-05;-0.00016977232007775;-0.00010178915545112;0.00019072924624197;-1.699517997622e-05;0.0019182001706213;-3.2109237508848e-05;-0.00017760813352652;-0.00031890606624074;0.00021150088286959;-0.00018820782133844;0.00026459654327482;-0.00045671072439291;0.0004055550089106;-0.00095808261539787;0.00013234015204944;-0.0017324776854366;0.00011502460256452;-0.0012074634432793;3.6811579775531e-05;-0.00046470755478367;-1.5558025552309e-05;-0.00011335981253069;-2.6623849862517e-06;-1.6451440387755e-05;-7.9645786854599e-08;0.00034351841895841;-0.00010815641144291;-9.1235524450894e-06;3.7030673411209e-05;-8.5828600276727e-05;-1.2053033060511e-05;0.00016110217256937;-1.7409355450582e-06;-0.00064576813019812;-7.6265569077805e-05;0.00048747495748103;-4.8942176363198e-05;0.00035035255132243;-8.3965904195793e-05;-2.145258258679e-05;-0.00015223200898618;0.00012853833322879;-0.00022887946397532;5.8446407820156e-06;0.00028065763763152;5.7506644225214e-05;8.0400706792716e-05;6.5121996158268e-05;-0.00039126406772994;-7.1118070081866e-06;0.00085906934691593;7.3740986408666e-05;-0.0010383813641965;5.3674099035561e-05;2.2389480363927e-05;-0.00020876222697552;-3.4932123526232e-05;-0.00033325745607726;0.00039499733247794;-0.00012834461813327;-0.00031265948200598;8.3190796431154e-05;7.4922398198396e-05;-6.2602586694993e-05;0.0002534095547162;-0.00025417853612453;0.00095544866053388;-0.00010887350072153;0.00061846425523981;-6.7498032876756e-05;-0.00062185875140131;-0.00014382072549779;0.00045487561146729;7.028593972791e-05;0.00034112785942852;0.0004061694489792;0.00024322197714355;-0.00053423625649884;0.00023173908994067;-0.00050973967881873;9.6028154075611e-05;-0.00029353465652093;0.00012656280887313;-0.00081220880383626;8.4229504864197e-05;-4.9712038162397e-05;-0.00094304594676942;1.438708659407e-05;-0.0016323651652783;0.00037331919884309;-0.00080553547013551;4.9595208110986e-05;9.7399220976513e-05;-5.5277483625105e-05;9.2849142674822e-05;5.4656662541674e-05;-0.0021764349658042;-4.1751277990443e-07;-0.00010976176417898;3.0498757041642e-05;0.00023547577438876;-0.00019030476687476;0.00023046646674629;0.00070153950946406;-0.00026753434212878;0.0007876215968281;-0.00037786341272295;0.0019039940088987;-0.00010545038821874;0.0015182386850938;-8.0987549154088e-05;0.00011128639016533;-5.4494194046129e-06;0.00050866266246885;5.920230250922e-06;-0.00012058027641615;3.1466053769691e-05;0.00014983644359745;-5.3951229347149e-05;7.3864493970177e-06;-1.598323979124e-05;-0.00016346001939382;2.5222223484889e-05;3.3917873224709e-05;4.9150636186823e-05;-0.00039762392407283;-2.1979003577144e-06;0.00023881877132226;-3.6255063605495e-05;0.00060004938859493;-6.3537590904161e-05;0.00011155691026943;-8.2629312601057e-06;-8.4689483628608e-05;-0.00026685887132771;3.3756499760784e-05;0.00031953628058545;-6.2038139731158e-05;0.00016458147729281;4.3067997467006e-05;-0.00042344236862846;3.9300790376728e-05;0.00089592894073576;-2.5338897103211e-05;-0.0010830747196451;6.3717976445332e-05;1.3027535715082e-05;6.4065512560774e-05;-0.00036065274616703;-0.00019120861543342;0.00033986978814937;-0.00031763259903528;-1.7243861293537e-05;-0.00017683880287223;5.1318886107765e-05;0.00010297313565388;0.00064970436505973;-7.5982730777469e-05;0.0010565402917564;-0.00024477977422066;0.00033865368459374;-9.6104799013119e-05;2.8419841328287e-05;-0.00063426955603063;-0.00023022019013297;0.00027353462064639;0.00031469605164602;0.00024509872309864;0.0004942788509652;-0.00046168442349881;0.00024244459928013;-0.0006121966871433;0.00021156355796847;-0.00079452444333583;0.00010438235040056;-0.00043763592839241;0.00012040340516251;0.00012582451745402;-6.5360574808437e-05;-0.0010995715856552;3.0782073736191e-05;-0.0019055077573285;0.0004165698774159;-0.0009633973822929;3.3791315217968e-05;0.00013252410280984;-6.6371590946801e-05;0.00017980720440391;5.784867607872e-05;-0.0025580034125596;-3.1735777156428e-05;-0.0001864092919277;3.1619896617485e-05;0.00021341649699025;-0.00027080823201686;0.00028733126237057;0.00090208800975233;-0.00028182292589918;0.00090988900046796;-0.00042037665843964;0.0021467071492225;-0.00011500711116241;0.0018404313595966;-6.6682943725027e-05;2.9132594136172e-05;1.2318600965955e-05;0.00066411157604307;1.6861356925801e-05;-0.00020429947471712;5.8955360145774e-05;0.00012673574383371;-7.1333430241793e-05;7.5044995355711e-06;4.9412788030168e-06;-0.00024266890250146;1.8824934159056e-05;2.3799691916793e-05;6.464898615377e-05;-0.00027531146770343;-1.4096450286161e-05;0.00021065725013614;-4.3619984353427e-05;0.00075059843948111;-7.2067559813149e-05;0.0001697620464256;-1.1295377589704e-05;-5.4521478887182e-05;-0.00028616216150112;1.0833050509973e-05;0.00037458111182787;-9.9136421340518e-05;0.00012238897033967;5.6792094255798e-05;-0.00044918415369466;4.3386618926888e-05;0.0010382710024714;-2.7547239369596e-05;-0.0013050513807684;7.3614413850009e-05;1.613745916984e-05;8.5595362179447e-05;-0.00052947597578168;-0.00024362189287785;0.00037343287840486;-0.00039870670298114;4.1552331822459e-05;-0.00021755078341812;5.3397154260892e-05;0.00013128577847965;0.00086571334395558;-9.9304445029702e-05;0.0012951155658811;-0.00030205756775104;0.00037666433490813;-0.00011638289288385;5.3580959502142e-05;-0.00079921336146072;-0.00031586393015459;0.00037930207327008;0.00037926135701127;0.00029792901477776;0.00064124865457416;-0.00046576390741393;0.00030828965827823;-0.00079043861478567;0.0002556120743975;-0.0011006272397935;0.0001325902849203;-0.00045377219794318;0.00014607117918786;0.00010474695591256;-5.2178678743076e-05;-0.00067998562008142;4.5662411139347e-05;-0.0012219211785123;0.00027512855012901;-0.00062657712260261;1.0467361789779e-05;8.2334998296574e-05;-4.5103963202564e-05;0.00013485741510522;3.9550195651827e-05;-0.0017318052705377;-2.4540473532397e-05;-0.000183532902156;2.3400838472298e-05;7.8832221333869e-05;-0.0001684860617388;0.00022427293879446;0.00062436633743346;-0.00017207223572768;0.0005366921541281;-0.00028760425630026;0.0013473579892889;-9.0007539256476e-05;0.0012718942016363;-3.5221015423303e-05;-2.7964799301117e-05;1.5026032997412e-05;0.00052415847312659;8.2521019066917e-06;-0.00018652895232663;5.8987661759602e-05;-3.683485192596e-05;-5.8560879551806e-05;-3.9666549128015e-05;2.9608594559249e-05;-0.00017292164557148;6.7112705437467e-06;2.6028562842839e-06;4.1856794268824e-05;4.6908582589822e-05;-2.1069985450595e-05;2.5810320948949e-05;-2.7495007088874e-05;0.00047740706941113;-3.7565427192021e-05;0.00017251686949749;-6.5851882027346e-06;-6.9790839916095e-06;-0.0001329959341092;-4.0686158172321e-05;0.00023575036902912;-7.7990967838559e-05;9.874468378257e-05;4.7167250158964e-05;-0.00023589777993038;1.640506889089e-05;0.00057693995768204;-1.447721842851e-05;-0.00078356225276366;4.2400490201544e-05;3.2205629395321e-05;5.3649462643079e-05;-0.00047079837531783;-0.00016204459825531;9.2805268650409e-05;-0.00025152097805403;5.2331906772451e-05;-0.00013480232155416;4.1077608329942e-05;8.085829904303e-05;0.00056952820159495;-6.4422885770909e-05;0.0007481649518013;-0.00019560939108487;0.00016809320368338;-7.0014481025282e-05;5.671535836882e-05;-0.0005399496294558;-0.00023066694848239;0.00031787832267582;0.00022942776558921;0.00022712444479112;0.00043097886373289;-5.972211874905e-05;0.00020147570467088;-0.00045475471415557;0.00015576384612359;-0.00082005618605763;8.9193548774347e-05;-0.00018509820802137;9.2188456619624e-05;9.491277160123e-05;-8.6843931512703e-07;-8.0943020293489e-05;-4.3583117076196e-05;-0.00030122097814456;-0.00011650579108391;-0.00016461087216157;-0.00010942513472401;6.9413981691469e-05;8.5040774138179e-05;8.4046077972744e-05;-5.1761795475613e-05;8.4605424490292e-05;-0.00026383070508018;1.340846029052e-05;-0.0001138756488217;-0.00013742432929575;-0.00034586287802085;-8.7119107774924e-05;0.00037812523078173;0.00013860543549526;0.00037204960244708;0.00012508190411609;-3.3063006412704e-05;0.00015692315355409;9.0787223598454e-05;0.00021123341866769;-0.00020594843954314;0.00011411333252909;-0.00010342399036745;0.00014112048665993;-1.8548944353824e-05;1.8952088112201e-06;0.00014042569091544;6.9704467023257e-05;0.00020618665439542;6.2748520576861e-05;-2.4644812583574e-05;-3.4106222301489e-05;-0.00017192833183799;4.9573467549635e-05;1.2958599654667e-05;-5.836428499606e-06;0.00010619294334901;-1.5581555999233e-05;0.00033569819061086;-1.0434257546876e-06;-0.00011765032104449;9.2338334070519e-05;0.00023137303651311;-4.1643957047199e-06;2.9610753699671e-05;-0.00019689025066327;-0.00019496017193887;-0.00027786105056293;-5.6942837545648e-05;-0.00014974644000176;3.175922029186e-05;0.00035175643279217;3.1901705369819e-05;-0.00047234265366569;-1.1875386917382e-05;-6.5882908529602e-05;5.347712431103e-05;1.4685278074467e-05;-6.6340195189696e-05;0.00059202086413279;-9.3349080998451e-05;0.00019640070968308;-5.5794236686779e-05;-4.6710436436115e-05;6.664615648333e-05;0.00044655191595666;-1.2311198815951e-06;0.00072154233930632;1.9014649296878e-05;0.00026560167316347;-7.0633668656228e-06;-4.2168776417384e-05;-0.00024297274649143;-0.00013070991553832;-1.7742941054166e-05;0.0001733264507493;-0.00010155507334275;0.0002490202896297;-0.00057425524573773;1.549391890876e-05;-0.0006495647248812;-5.0093212848878e-06;-0.00047028574044816;-8.8365595729556e-06;-0.00023734800925013;3.0390219762921e-06;0.00010411057155579;-1.6132361224663e-06;-5.3211198974168e-05;-3.8957536162343e-05;-0.0002751192660071;-0.00010878549073823;-0.00012476941628847;-0.00010121750528924;5.5638083722442e-05;8.0449935921934e-05;4.8678575694794e-05;-5.1384860853432e-05;0.00011704349162756;-0.00026169835473411;-7.9584688137402e-06;-0.00010660706902854;-0.00014944051508792;-0.00031546491663903;-8.1626159953885e-05;0.0003595988964662;0.00013588210276794;0.00033004293800332;0.00010931761789834;-4.9046819185605e-05;0.00015274123870768;6.6048021835741e-05;0.00020372172002681;-0.00021762339747511;0.00011934384383494;-7.2815681050997e-05;0.00013472286809701;-1.3145776392776e-05;3.2670889140718e-06;9.4450231699739e-05;6.9768313551322e-05;0.00019673393398989;6.5501459175721e-05;-2.5083232685574e-05;-3.4882414183812e-05;-0.00015910172078293;3.5028693673667e-05;0.00010143805411644;-5.1672336667252e-06;8.4324987255968e-05;-1.0631410077622e-05;0.00029652527882718;1.3166471944714e-05;-0.00011670555250021;7.2909635491669e-05;0.00023600684653502;3.8862250221428e-05;2.8701018891297e-05;-0.00020566872262862;-0.00018542636826169;-0.00029433163581416;-6.0204161854926e-05;-0.00012216607865412;2.1938551071798e-05;0.00026117940433323;3.3858024835354e-05;-0.00039899497642182;-2.2150912627694e-05;-6.600048072869e-05;5.0242175348103e-05;1.0284645213687e-05;-5.3350391681306e-05;0.0005230093956925;-6.8442197516561e-05;0.000199731788598;-4.1609913751017e-05;-3.975939398515e-05;5.7193876273232e-05;0.00042773739551194;6.8742187977477e-06;0.00064423872390762;3.9648930396652e-05;0.00020639756985474;1.1996003195236e-06;-4.4502226955956e-05;-0.00021895162353758;-0.00012861238792539;-4.3065701902378e-06;0.00015219309716485;-0.0001000425836537;0.00022701182751916;-0.0004978635115549;-3.9862070480012e-06;-0.00058407010510564;-2.6224355679005e-05;-0.00047339330194518;-2.0471588868531e-05;-0.00017041845421772;-3.7579984564218e-06;-1.0940478205157e-05;-5.5801956477808e-05;9.4782539235894e-05;0.00010096682672156;0.00011997122783214;0.00025442717014812;8.1134727224708e-05;0.0002397191565251;-3.4311902709305e-05;-0.00010918855696218;5.5335352953989e-05;-8.9270477474201e-05;0.00025858252774924;-5.6291002692888e-05;7.4016956205014e-05;-4.3886309867958e-05;5.0627881137189e-05;0.00031125932582654;5.5729029554641e-05;-0.00013107275299262;-0.0002695427974686;-8.7586704466958e-05;-0.00039428021409549;-0.00019549996068235;-2.2258579974732e-06;-0.00018234325398225;-9.3742251920048e-05;-0.0001143497065641;0.00015143262862694;-0.00010993922478519;0.00013228805619292;-5.3451371968549e-06;7.1018098424247e-06;6.3032370235305e-05;0.00014692566765007;3.4427896025591e-05;0.00012194365990581;-4.2977182602044e-05;-4.3007519707317e-05;6.1286678828765e-05;-0.00014859189104754;1.9802664610324e-05;-0.0001220341946464;-2.6759580578073e-05;9.5078496087808e-05;-2.658874655026e-05;0.0003223369421903;-0.00012856161629315;5.2748371672351e-05;0.00018623503274284;6.3074126956053e-05;-1.0821901923919e-05;-0.00015483117022086;-0.00011410391743993;-7.094305328792e-05;-0.00013400209718384;6.2937520851847e-05;-0.00013721636787523;1.6432768461527e-05;0.0003643179370556;8.0768031693879e-06;-0.00045997434062883;4.8642701585777e-05;-5.0563277909532e-05;-7.7294309448916e-05;4.5587737986352e-05;-0.00010317086707801;0.00051157915731892;-3.2682441087672e-05;0.0001356292195851;5.335199602996e-05;-3.8588983443333e-05;-2.3881057131803e-06;0.00032970932079479;-1.9903227439499e-06;0.00062833842821419;-1.8129681848222e-05;0.00027737347409129;-4.5651984692086e-05;-0.00022568721033167;-0.00011426064156694;0.00019125027756672;-3.8157581002451e-05;0.00019454566063359;-4.8279318434652e-05;3.8781785406172e-05;-0.0005123692099005;8.4055518527748e-06;-0.00055544567294419;-1.0209085303359e-05;-0.00033977447310463;1.7753291103872e-05;-0.00026630540378392;5.8635636378312e-05;-0.00010439720063005;-4.1695861000335e-05;0.00034072855487466;-0.00020209708600305;0.00062153179896995;-1.1266123465248e-06;0.0004441931960173;3.794008443947e-05;-6.925572961336e-05;-5.2937131840736e-05;-2.4090231818263e-05;1.7763695723261e-05;0.0010149957379326;-2.0401892470545e-05;0.00012955235433765;-1.8548029402154e-05;0.00010189963359153;-0.00018042983720079;9.6666721219663e-05;-0.00034823239548132;0.00021191242558416;-0.00031927324016578;9.1067668108735e-05;-0.00068521872162819;1.9995268303319e-05;-0.00076597469160333;-9.6736803243402e-06;1.1480003195175e-05;-1.384361894452e-06;-0.00035362603375688;4.5544980821433e-05;-0.00012853994849138;-1.8129587260773e-05;-9.2953094281256e-05;4.4825319491792e-05;-6.3762287027203e-05;-1.1327034371789e-05;-0.00017692208348308;6.3129973568721e-06;2.487266465323e-05;-1.8948914657813e-05;0.00020435359328985;-2.70386954071e-05;-8.7902990344446e-05;-8.5891406342853e-06;0.00023647796479054;9.3130140157882e-05;-2.5374776669196e-05;5.9506706747925e-05;-5.3903790103504e-05;2.3619313651579e-05;-6.5239401010331e-05;0.0001259119308088;2.3339935069089e-05;3.2448213460157e-05;8.1176240200875e-06;-1.9571716620703e-05;-2.6165841973125e-06;0.00023481891548727;2.4738446882111e-05;-0.00038719869917259;3.6968027416151e-05;3.5269687941764e-05;-0.00011795437603723;-0.00030334416078404;-0.00017253412806895;-2.0434104953893e-05;-5.5951375543373e-05;3.6345245462144e-05;3.1135183235165e-05;4.2112562368857e-05;-4.9656446208246e-05;0.0002996125840582;-0.00012848203186877;0.00038066788692959;-3.362711504451e-05;4.5634420530405e-05;2.1118836230016e-05;-0.00034768486511894;-0.00016105850227177;0.00016977277118713;0.00021735161135439;0.00025698545505293;0.00016929532284848;0.00015162883209996;8.5389539890457e-05;8.6733976786491e-05;-0.00021584256319329;6.3171479268931e-05;-0.00052933115512133;5.0772297981894e-05;-4.406489097164e-05;5.7340472267242e-05;-7.1644455601927e-05;-2.2439178337663e-06;0.00069006468402222;-0.00036786799319088;0.0010963249951601;-4.502093361225e-05;0.00075015920447186;5.5449443607358e-05;-9.9031814897899e-05;-7.8482662502211e-05;-8.4036955740885e-06;-1.9977351257694e-05;0.0015991429099813;-3.5219403798692e-05;-2.6150001986025e-07;-0.00023874334874563;0.00014870319864713;-0.00022135334438644;0.00024514339747839;-0.00045821713865735;0.00034291576594114;-0.00065757083939388;0.00012645551760215;-0.0013335212133825;9.2290982138366e-05;-0.0010983161628246;2.0008334104205e-05;-0.00017540412954986;2.1206626570347e-06;-0.00031483970815316;9.3299277068581e-06;-5.1499944675015e-05;-2.3612315999344e-05;0.00013703166041523;-1.5553199773422e-05;-7.9016004747245e-05;2.5631250537117e-05;-0.00020456880156416;9.7815136541612e-06;7.5478332291823e-05;8.881785106496e-06;-0.00038527385913767;-4.3589450797299e-05;0.00015526963397861;-4.2082079744432e-05;0.00043852929957211;2.5619359803386e-05;-4.3585001549218e-05;-5.2807805332122e-05;5.5078518926166e-05;-0.00015059352153912;-5.9447869716678e-05;0.00031110952841118;2.5141471269308e-05;0.00018940272275358;3.5730019590119e-05;-0.00024803378619254;-1.7619258869672e-05;0.00068781699519604;5.5749263992766e-05;-0.00082829839084297;5.2480474550975e-05;1.5429151972057e-05;-0.00017438670329284;-0.00018211391579825;-0.00027716858312488;0.0002908160968218;-0.00010378297156421;-8.1625643360894e-05;5.1658738811966e-05;6.5943080699071e-05;-6.9695510319434e-05;0.00038403738290071;-0.00020719910389744;0.00077328743645921;-6.5950094722211e-05;0.00029514561174437;-3.4382283047307e-06;-0.00048286726814695;-0.00016292164218612;0.0003014687972609;0.00014479136734735;0.00033872292260639;0.00022200657986104;0.00022680011170451;-0.00037843335303478;0.0001663907605689;-0.00043234569602646;8.9826979092322e-05;-0.00048909254837781;8.8821740064304e-05;-0.00039660595939495;8.1614671216812e-05;-3.8728510844521e-05;-0.00070228817639872;2.5879588065436e-05;-0.0011508845491335;0.00024887060862966;-0.00054947438184172;9.0518960860209e-06;7.5583142461255e-05;-4.3534531869227e-05;0.00021261445363052;2.8825450499426e-05;-0.001491398899816;-2.3278225853574e-05;-0.00019999331561849;2.6992232960765e-05;0.00011729868856492;-0.00016929450794123;0.00018941657617688;0.00060336320893839;-0.00017832810408436;0.00049617496551946;-0.00023901009990368;0.0012284987606108;-6.7217952164356e-05;0.0011444599367678;-3.912070314982e-05;-0.00012268034333829;1.6575368135818e-05;0.00050586368888617;4.1489752220514e-06;-0.0001554035989102;4.6261324314401e-05;3.1168430723483e-05;-5.5428605264751e-05;-3.8782859519415e-06;3.0328623324749e-05;-0.00021767163707409;5.9470607993717e-06;-6.2303015511134e-06;4.4997595978202e-05;-5.4595624533249e-05;-8.555073691241e-06;2.1816875232616e-05;-1.9234517822042e-05;0.00051174405962229;-4.187641752651e-05;0.00014033686602488;-1.8553328118287e-05;8.9803570517688e-06;-0.00015877390978858;-1.1290339898551e-05;0.00025015400024131;-8.7926608102862e-05;5.4856547649251e-05;3.021383054147e-05;-0.00021115109848324;1.9561281078495e-05;0.00060554558876902;-2.0342178686406e-05;-0.00077181332744658;4.0812330553308e-05;-1.3270041563374e-05;6.5154941694345e-05;-0.00037974320002832;-0.00015612799325027;0.00027495063841343;-0.00025806599296629;0.00012831781350542;-0.0001342817558907;3.2628613553243e-05;7.2744122007862e-05;0.00068220251705498;-7.6382304541767e-05;0.00083751499187201;-0.00018887198530138;0.00013635231880471;-6.0667112848023e-05;6.1401609855238e-05;-0.00047637594980188;-0.00022261710546445;0.00025805528275669;0.00020165363093838;0.00011041747347917;0.00043546108645387;-0.00035354876308702;0.0002124281891156;-0.00054026959696785;0.00014860491501167;-0.0008212705142796;8.9167406258639e-05;-0.00014892102626618;8.3357816038188e-05;0.00015830069605727;-6.8178975197952e-05;-0.00087112071923912;7.1258567913901e-05;-0.0014613681705669;0.00030300547950901;-0.00071867159567773;-2.07548164326e-05;0.00010845127690118;-5.9285481256666e-05;0.00034436292480677;3.4815995604731e-05;-0.0019879215396941;-6.1393177020364e-05;-0.0003692666941788;3.3635689760558e-05;3.6035049561178e-05;-0.00025454579736106;0.0002921090926975;0.0008847551071085;-0.00018780253594741;0.00057313137222081;-0.00029833408189006;0.0014755431329831;-9.461378067499e-05;0.0015930240042508;-1.66565150721e-05;-0.00029890684527345;4.4824580982095e-05;0.0008044161950238;1.1151606486237e-05;-0.00031316309468821;0.00010086000111187;-0.00011402188101783;-9.3102113169152e-05;-1.3975280126033e-05;8.0115685705096e-05;-0.00033781657111831;-1.0523648597882e-05;-3.0369550586329e-05;6.2621817050967e-05;0.00034561048960313;-3.4415381378494e-05;-0.00011984351294814;-2.727306127781e-05;0.00068983749952167;-4.2091200157302e-05;0.00027797307120636;-2.6615149181453e-05;7.8199023846537e-05;-0.0001363709452562;-8.4444065578282e-05;0.00030160861206241;-0.00014053998165764;-2.1166535589145e-05;5.884622441954e-05;-0.00018587705562823;1.3064051927358e-05;0.00066031306050718;-2.014299025177e-05;-0.00096425460651517;4.6957091399236e-05;-8.4872050365448e-07;9.3735528935213e-05;-0.0007031470304355;-0.00022422416077461;0.00019137588969897;-0.00035092100733891;0.00024469749769196;-0.00017630893853493;4.2993182432838e-05;9.8648451967165e-05;0.00099429558031261;-0.00010937463230221;0.0010470408014953;-0.00025861788890325;8.2845144788735e-05;-7.6660769991577e-05;0.00012073830293957;-0.00068097887560725;-0.00035231630317867;0.00044970566523261;0.00025219828239642;0.0001833877468016;0.00063023658003658;-0.00017081512487493;0.0003000219585374;-0.00070657231844962;0.00019001898181159;-0.0013173122424632;0.00012797027011402;-3.1911844416754e-05;0.00011010001617251;0.00015564482600894;-6.5799744334072e-05;-0.00058437476400286;7.9170262324624e-05;-0.0010716477409005;0.0002207747020293;-0.00053888937691227;-2.4745671908022e-05;8.1010737631004e-05;-4.3173789890716e-05;0.0002065190783469;3.1286457669921e-05;-0.0015199182089418;-5.4596497648163e-05;-0.00030660553602502;2.1622199710691e-05;-4.897233156953e-05;-0.00019435207650531;0.00023905835405458;0.0006858297274448;-0.00011024675040971;0.00039995435508899;-0.00023199395218398;0.0010609588352963;-8.5647821833845e-05;0.0012273249449208;2.618151711431e-06;-0.00022452468692791;4.0210376027972e-05;0.00064249825663865;1.1007793546014e-05;-0.00028085600933991;9.2785456217825e-05;-0.0001803710765671;-7.3838498792611e-05;-2.0869834770565e-05;7.5393305451144e-05;-0.00024524150649086;-1.7063541235984e-05;-2.9644717869814e-05;4.3987922254018e-05;0.00049192999722436;-3.8345766370185e-05;-0.00015326353604905;-2.28381704801e-05;0.00048034547944553;-2.1193467546254e-05;0.00024825581931509;-1.5657795302104e-05;8.4355444414541e-05;-4.8667432565708e-05;-0.00010221156844636;0.00018766849825624;-0.00010748532804428;-5.3027451940579e-05;5.4242111218628e-05;-9.7276912129018e-05;2.4614182621008e-06;0.00037746940506622;-8.9896084318752e-06;-0.00065193261252716;2.9879975045333e-05;1.9632054318208e-05;6.8013912823517e-05;-0.00061313138576224;-0.00016897305613384;6.0758666222682e-06;-0.00025468564126641;0.00019001499458682;-0.00012493805843405;3.3911190257641e-05;7.3538001743145e-05;0.000715262722224;-7.8772056440357e-05;0.00069135264493525;-0.00018970949167851;1.7715290596243e-05;-5.5682292440906e-05;9.6912161097862e-05;-0.00052690011216328;-0.00028126800316386;0.00038518477231264;0.00018539931625128;0.00017855147598311;0.00047423393698409;0.00010609140008455;0.0002189674123656;-0.00047509570140392;0.00013443735952023;-0.0010518337367103;9.5759831310716e-05;4.9065434723161e-05;8.0869700468611e-05;0.00014093819481786;-2.9556963454525e-06;-4.2295458115404e-05;-3.7230653106235e-05;-0.00026832456933334;-0.00011153603554703;-7.4154275353067e-05;-9.3532122264151e-05;4.7932157031028e-05;6.3794308516663e-05;1.3500056184057e-06;-5.7395758631174e-05;0.00015949136286508;-0.0002813849132508;-5.6508535635658e-05;-9.2519076133613e-05;-0.00018408946925774;-0.00030851547489874;-7.84331059549e-05;0.00037952180719003;0.00015298918879125;0.00029057709616609;9.9100921943318e-05;-4.3387943151174e-05;0.00016079052875284;4.5252807467477e-05;0.00020439518266357;-0.00029180830460973;0.00014438219659496;6.3608708842366e-06;0.0001271947985515;-9.4556889962405e-06;5.4471720432048e-06;2.514463449188e-05;7.0268215495162e-05;0.0002086800232064;6.5964712121058e-05;-6.1664904933423e-05;-4.6586334065069e-05;-0.00012877910921816;1.6226096704486e-05;0.00029108879971318;5.1386626864769e-07;7.3836497904267e-05;8.0617161302143e-07;0.0002815353218466;3.4013359254459e-05;-0.00011997646652162;1.3955445865577e-05;0.00024967832723632;0.00011675803398248;4.0343395085074e-05;-0.00019939277262893;-0.00016227776359301;-0.00039690113044344;-7.1678732638247e-05;-8.9170724095311e-05;1.1212438039365e-05;0.00013952501467429;3.1765153835295e-05;-0.00035199499689043;-3.8884059904376e-05;-8.4464612882584e-05;5.6283759477083e-05;-1.1274013559159e-05;-4.635852019419e-05;0.00045401829993352;-5.5000135034788e-05;0.00023216041154228;-3.0222592613427e-05;-2.748849146883e-05;4.9348614993505e-05;0.0004957735654898;1.3115107321937e-05;0.00059826648794115;5.8086992794415e-05;0.00010752895468613;6.9738066486025e-06;-4.042861473863e-05;-0.0002072323259199;-0.00014876776549499;2.2368252757587e-05;0.00013179895177018;-0.00010594057675917;0.00023260427406058;-0.00043375114910305;-1.4200897567207e-05;-0.00053799041779712;-4.7181183617795e-05;-0.00058285577688366;-3.6145527701592e-05;-4.4327593059279e-05;-4.6972895688668e-06;0.00011695148714352;1.2657116030823e-06;-2.359122299822e-05;-3.4755412343657e-05;-0.00021306780399755;-8.9207904238719e-05;-4.5902273996035e-05;-7.3304458055645e-05;3.5401193599682e-05;4.9809612391982e-05;-1.1721046575985e-05;-4.982044629287e-05;0.00015812335186638;-0.00024219183251262;-5.10530298925e-05;-7.3838222306222e-05;-0.00015433007501997;-0.00024590766406618;-6.5424675995018e-05;0.00030563972541131;0.00012712890747935;0.00023171684006229;7.3123752372339e-05;-4.5493317884393e-05;0.00013933758600615;1.9579825675464e-05;0.00016948652046267;-0.00025283813010901;0.00012819876428694;1.1164016541443e-05;0.00010552023013588;2.2750000425731e-06;5.3896446843282e-06;7.809059752617e-06;5.9932994190603e-05;0.00016789750952739;5.4723161156289e-05;-5.3951938753016e-05;-3.9164118788904e-05;-0.00010055232269224;5.7590841606725e-06;0.00026372654247098;2.8341760298645e-06;6.1169150285423e-05;5.2758405217901e-06;0.00022425454517361;3.6656674637925e-05;-0.00010951622243738;-2.3442751171387e-06;0.00021183675562497;0.00012033277016599;4.2238098103553e-05;-0.00016688494361006;-0.00013290860806592;-0.00033920732676052;-6.5378604631405e-05;-6.6859844082501e-05;4.6256805035227e-06;8.7796586740296e-05;2.6667496058508e-05;-0.00027446486637928;-3.9967711927602e-05;-7.3475144745316e-05;4.4703250750899e-05;-2.1160578853596e-06;-3.0684201192344e-05;0.00036414686474018;-3.0837156373309e-05;0.0001959990040632;-1.7795333405957e-05;-1.9868195522577e-05;3.7985020753695e-05;0.00041285451152362;1.895904642879e-05;0.00048121603322215;6.406335887732e-05;6.9944624556229e-05;9.4917386377347e-06;-3.5553694033297e-05;-0.00016383115143981;-0.00012528322986327;1.9990466171294e-05;0.00010140469385078;-8.9699562522583e-05;0.00018540781456977;-0.00035088130971417;-2.6468431315152e-05;-0.00043239770457149;-5.3480467613554e-05;-0.00049150886479765;-4.1561579564586e-05;-1.4227257452148e-05;-6.4970704443112e-06;-2.0173929442535e-05;-7.7784636232536e-05;0.00010547792771831;6.9778143370058e-05;0.00011618829739746;0.00019708707986865;7.3324728873558e-05;8.6236512288451e-05;-2.691106783459e-05;-5.5749926104909e-05;5.5558721214766e-05;-5.8246172557119e-05;0.00027891085483134;-0.00014508694584947;5.3347190259956e-05;4.9058809963753e-05;7.0675923780072e-05;0.00023970099573489;4.4639964471571e-05;-0.00013195617066231;-0.00024614130961709;-6.2998144130688e-05;-0.00025762728182599;-0.0002059871039819;3.4293494536541e-05;-0.00017911446047947;-2.6246791094309e-05;-0.00014529468899127;0.00027440427220426;-9.2227055574767e-05;-1.7137223039754e-05;2.4796676711958e-07;3.3095715480158e-05;5.6060176575556e-05;1.7332011339022e-05;4.0113529394148e-05;0.00012849949416704;-4.8896443331614e-05;-8.3856000856031e-05;1.9913733922294e-05;-0.00010146263957722;3.767521775444e-05;0.00012034479004797;-3.8540156310773e-07;5.2312054322101e-05;1.408007574355e-05;0.00026243858155794;-0.00013065787788946;-3.1578922062181e-05;0.00020712881814688;8.5700237832498e-05;0.00011051405454054;-0.00012412067735568;-0.00011976216046605;-9.7693162388168e-05;-0.00021496046974789;3.3132655516965e-05;-8.0406345659867e-05;7.857366654207e-06;0.00014221805031411;-2.2718109903508e-05;-0.00031216634670272;4.3014988477807e-05;-6.7289380240254e-05;-3.5314289561938e-05;2.5159904907923e-05;-3.4738524846034e-05;0.00037542363861576;2.7502037482918e-06;0.00018181835184805;3.0563220207114e-05;-1.5033935596875e-05;2.3308384697884e-05;0.00037995449383743;5.8948553487426e-05;0.00048867549048737;3.2946815053947e-07;7.7686818258371e-05;-4.1318045987282e-05;-0.00016038716421463;-0.00012424436863512;0.00011382300726837;8.160918696376e-06;0.00015818401880097;-7.7433513069991e-05;-1.230147518072e-05;-0.00040007103234529;-5.6134216720238e-05;-0.00041289022192359;-5.5175936722662e-05;-0.00044314228580333;8.3763197835651e-06;-4.0703413105803e-05;-2.0089883037144e-05;-9.0871413704008e-05;0.00011331529094605;8.5269595729187e-05;0.00013210099132266;0.00022201605315786;8.2183360063937e-05;0.0001004474106594;-2.8871763788629e-05;-6.5409396484029e-05;6.2259859987535e-05;-6.8919704062864e-05;0.00030364145641215;-0.00014994844968896;5.8856199757429e-05;5.7720440963749e-05;8.1675272667781e-05;0.00027362955734134;5.059140312369e-05;-0.00014936582010705;-0.00028168977587484;-7.6424636063166e-05;-0.00028780970023945;-0.00022448059462477;3.1334562663687e-05;-0.0001973286998691;-3.7436555430759e-05;-0.00015820207772776;0.00030768578290008;-0.00010053532605525;-2.5343395464006e-05;-1.4792973388467e-06;3.1899609894026e-05;6.1795079091098e-05;2.0482892068685e-05;4.4251526560402e-05;0.00014646853378508;-5.5263801186811e-05;-9.8635748145171e-05;2.5095405362663e-05;-0.00011122793512186;4.0047700167634e-05;0.00013674038928002;-2.5837107386906e-06;5.8043697208632e-05;1.1947737220908e-05;0.00029721492319368;-0.00013874293654226;-3.4591463190736e-05;0.00022647967853118;8.9945227955468e-05;0.00011613810784183;-0.00013476720778272;-0.0001266084582312;-0.0001045162207447;-0.00024335847410839;3.8811293052277e-05;-8.9792440121528e-05;8.5112187662162e-06;0.0001649793703109;-2.1475501853274e-05;-0.00035580914118327;5.0776401621988e-05;-7.5411568104755e-05;-4.5337499614106e-05;2.2156547856866e-05;-5.0966660637641e-05;0.00042038966785185;-2.2351730422088e-06;0.00020441650121938;3.5023364034714e-05;-1.7245238268515e-05;1.9024470020668e-05;0.00043056049617007;5.3926509281155e-05;0.0005493956268765;-1.5542398159596e-06;8.7434309534729e-05;-4.3611387809506e-05;-0.00018161933985539;-0.00013862345076632;0.00013046502135694;9.4961014838191e-06;0.00018384010763839;-8.8513261289336e-05;-1.4576158946511e-06;-0.00044740925659426;-5.2132440032437e-05;-0.00046331589692272;-5.2773262723349e-05;-0.0004999412340112;1.083443294192e-05;-4.5591958041769e-05;8.8823850092012e-05;-0.00018143247871194;-7.5275129347574e-05;0.00040274031925946;-0.00022382737370208;0.00076184805948287;2.6446456104168e-05;0.00054508540779352;4.8945144953905e-05;-9.3150149041321e-05;-6.487948121503e-05;-9.0782297775149e-05;5.4295454901876e-05;0.0012103760382161;-2.4382778065046e-05;0.00027582692564465;6.7981876782142e-05;0.00016463412612211;-0.00025744445156306;7.4529358244035e-05;-0.00052487966604531;0.00024697932531126;-0.00034576692269184;0.00011373998131603;-0.00073339085793123;-9.7715101219364e-06;-0.0010231183841825;-3.5808043321595e-05;0.0001804209605325;-4.485194949666e-06;-0.0005742785288021;8.4704872278962e-05;-0.00023613130906597;-3.1101568310987e-05;-0.00020047205907758;0.00010251964704366;-6.0220852901693e-05;-3.5727251088247e-05;-0.00033717436599545;1.7933543858817e-05;1.2932291610923e-06;-3.3540280128364e-05;0.00055120280012488;-2.9577773602796e-05;-0.00025896402075887;-7.0794362727611e-06;0.00038135939394124;0.00016737797704991;-5.0413796998328e-05;0.0001631523919059;-0.00010719332203735;8.0910554970615e-05;-0.00012367800809443;0.0001586396683706;2.3687176508247e-05;-6.9172347139101e-05;5.6609851526446e-06;7.0735673944e-05;-3.6640558391809e-06;0.00022192226606421;2.752432556008e-05;-0.00047451409045607;6.7143424530514e-05;3.372260107426e-05;-0.00016757412231527;-0.000489158090204;-0.00026135504595004;-2.4722736270633e-05;-7.8509918239433e-05;0.00020896705973428;4.5543467422249e-05;3.814282536041e-05;-8.7843582150526e-05;0.00054627005010843;-0.00017760162882041;0.00056372728431597;-3.9527800254291e-05;-4.8209432861768e-05;4.292535231798e-05;-0.00046786005259492;-0.00026940487441607;0.00021025784371886;0.0003447683993727;0.00040990626439452;0.00015185207303148;0.0002346584078623;0.00014057703083381;0.00011238780280109;-0.00038601929554716;9.5755283837207e-05;-0.00092935911379755;6.2621889810544e-05;0.00011791859287769;7.9650861152913e-05;-0.00015843585424591;-5.5026932386681e-05;0.00059608614537865;-0.00027768238214776;0.00093067553825676;2.2919419279788e-05;0.00063307996606454;5.6855049479054e-05;-0.00010374436533311;-6.1450875364244e-05;-0.00021127097716089;4.9579371989239e-05;0.001406833762303;-3.5316537832841e-05;0.00029035535408184;-3.0348319342011e-05;0.00019284275185782;-0.0002788121055346;0.00014531485794578;-0.00061278423527256;0.00027024798328057;-0.00042953243246302;0.00011013523908332;-0.0009303925326094;1.3988453247293e-05;-0.0011702836491168;-3.5144279536325e-05;0.00023463090474252;-3.5699571299119e-07;-0.00064261327497661;7.5048381404486e-05;-0.00021964464394841;-4.4201780838193e-05;-0.00013240033877082;0.00010286079486832;-7.8624638263136e-05;-2.223964111181e-05;-0.00041507353307679;2.6712456019595e-05;6.4892979025899e-06;-1.9276483726571e-05;0.00032556906808168;-3.0119153962005e-05;-0.00023007922573015;-2.2966856704443e-05;0.00053281377768144;0.00016936278552748;-7.1439979365095e-05;0.00014475912030321;-7.2834576712921e-05;9.2481959654833e-06;-0.0001466137036914;0.00027415234944783;1.7759133697837e-05;1.789800626284e-05;1.1944421203225e-05;6.3895249695634e-06;-1.4335415471578e-05;0.00044254443491809;3.98668962589e-05;-0.00068356870906428;8.3006118074991e-05;1.208336379932e-05;-0.00019985011022072;-0.0004912800504826;-0.00031956372549757;0.00014832946180832;-0.0001050298451446;0.00024102504539769;5.1376839110162e-05;4.6217366616474e-05;-0.00010992514580721;0.00070091558154672;-0.00021765440760646;0.00078215938992798;-4.5696968300035e-05;-8.4656921899295e-06;5.8922658354277e-05;-0.00052251771558076;-0.00029216805705801;0.00024086826306302;0.00034418742870912;0.00048531562788412;0.00011316633026581;0.00029028853168711;-0.00012394427903928;0.00014290327089839;-0.00052155111916363;0.00011501635162858;-0.0010248244507238;7.498892955482e-05;5.1700910262298e-05;5.3066076361574e-05;-8.2107610069215e-05;-2.2983313101577e-05;0.00059272814542055;-0.0002999352873303;0.00090074294712394;-1.3664569451066e-05;0.000595438410528;4.7805304348003e-05;-7.6645599619951e-05;-5.9692196373362e-05;-0.00012589375546668;-2.3898664949229e-06;0.001330018392764;-3.5516728530638e-05;0.00013433190179057;-0.00014815531903878;0.00012894529209007;-0.00022550075664185;0.00019943453662563;-0.00046494221896864;0.00027684465749189;-0.00045998656423762;0.00010884765652008;-0.0010113986209035;6.127684173407e-05;-0.0010040102060884;-5.7699833178049e-07;3.2379422918893e-05;7.3527303356968e-06;-0.00043581268982962;2.9378392355284e-05;-0.00010105598630616;-3.3711978176143e-05;-5.5072687246138e-06;4.6133241994539e-05;-0.00010431454575155;9.1308411356295e-06;-0.0002790795697365;1.8444059605827e-05;2.9303957489901e-05;3.4947056519741e-06;-9.9907418189105e-05;-2.5756495233509e-05;-5.9712961956393e-05;-3.0635175789939e-05;0.00044263098970987;9.3934890173841e-05;-5.3713803936262e-05;3.0658331525046e-05;-7.2375551098958e-06;-6.9890826125629e-05;-9.7211050160695e-05;0.00028890007524751;1.1485401955724e-05;0.00016764528118074;1.5771860489622e-05;-0.00010637938248692;-1.8592540072859e-05;0.00052149471594021;4.115837145946e-05;-0.00065685855224729;5.615415648208e-05;1.0463426406204e-05;-0.00015784356219228;-0.00029150952468626;-0.00025137286866084;0.00020383918308653;-8.9590706920717e-05;7.8491742897313e-05;3.9133392419899e-05;5.2055231208215e-05;-7.7551878348459e-05;0.0004798399459105;-0.00018120274762623;0.00067012221552432;-4.3416184780654e-05;0.00010200121323578;3.3029595215339e-05;-0.00041691705700941;-0.00019116137991659;0.00021643927902915;0.00020950817270204;0.00035230524372309;0.00012280188093428;0.00022252934286371;-0.00024995725834742;0.0001290648651775;-0.00040408383938484;8.8159897131845e-05;-0.00064631359418854;6.765934813302e-05;-0.00013267749454826;0.00021626718807966;-8.143962622853e-05;-0.00052614120068029;0.0001047842160915;-0.00091995816910639;0.00014491069305222;-0.00041216419776902;-5.9667312598322e-05;9.049736399902e-05;-4.5084954763297e-05;0.0002923044085037;2.050370494544e-05;-0.0012243500677869;-9.1614187113009e-05;-0.00044755576527677;2.0363571820781e-05;-0.00016239268006757;-0.00023419942590408;0.00022002127661835;0.00075166812166572;-4.4874668674311e-05;0.000263178255409;-0.00014029759040568;0.00078839110210538;-6.7849963670596e-05;0.0011287080124021;4.3501149775693e-05;-0.00047329274821095;6.8601846578531e-05;0.00076159788295627;1.5583707863698e-05;-0.0003877306880895;0.0001312281092396;-0.00028128124540672;-9.3231858045328e-05;0.00010247628961224;0.00010955942707369;-0.00032463375828229;-5.0459402700653e-05;-4.5449356548488e-05;3.9445272705052e-05;0.00098717899527401;-6.0729780670954e-05;-0.00026939524104819;-2.3214290195028e-05;0.00045989011414349;-9.8650525615085e-07;0.00031790672801435;-2.6232115487801e-05;0.00018571157124825;1.4764925253985e-05;-0.0001563402620377;9.5174138550647e-05;-0.00011898222874152;-0.00037092759157531;7.0626323577017e-05;5.0058803026332e-05;-7.9469200500171e-06;0.000157620452228;-8.3678565943046e-07;-0.00052102690096945;1.7763777577784e-05;-2.2440915927291e-05;9.4149079814088e-05;-0.00073168968083337;-0.00018245806859341;-3.0870160117047e-05;-0.00026878342032433;0.00034447366488166;-0.00011826096306322;2.8238930099178e-05;6.595384911634e-05;0.00095787516329437;-0.00010403448686702;0.00070413458161056;-0.00019113814050797;-0.00013462298375089;-4.1363498894498e-05;0.00014377833576873;-0.0005145279574208;-0.00033988390350714;0.00044957929640077;0.00013701333955396;0.00011554163211258;0.00053229473996907;0.00012145422806498;0.00025310821365565;-0.00052441476145759;0.00011668748629745;-0.0013146107085049;0.00010707692126743;0.00027661092462949;7.1129259595182e-05;0.00028120088973083;-9.9111435702071e-05;-0.00046840641880408;0.00011275841097813;-0.00088370294542983;9.5026269264054e-05;-0.00033391482429579;-6.7090608354192e-05;9.3195274530444e-05;-3.5892633604817e-05;0.000178765898454;2.1817817469127e-05;-0.0010153950424865;-0.00011941482807742;-0.00046053010737523;6.4283385654562e-06;-0.00023265024356078;-0.00027726165717468;0.00016488683468197;0.00077330874046311;1.2555378816614e-05;0.00026568432804197;-8.6777647084091e-05;0.00072881486266851;-5.6058346672216e-05;0.00099524052347988;7.3246934334747e-05;-0.00051180261652917;8.2857768575195e-05;0.00073397136293352;2.8249707611394e-05;-0.00039445096626878;0.0001289698848268;-0.00028883945196867;-7.8118886449374e-05;0.00023581684217788;0.00010565291449893;-0.00030941172735766;-7.4278425017837e-05;-4.8192050599027e-05;3.3067684853449e-05;0.0011958923423663;-6.2633131165057e-05;-0.00022379438451026;-2.7188729291083e-05;0.00040999375050887;1.0422656487208e-05;0.00029563522548415;-2.7182075427845e-05;0.00023197344853543;5.1313680160092e-05;-0.00015796549268998;-1.6348341887351e-05;-0.00010435677540954;-0.00060659029986709;6.5727756009437e-05;6.9099420215935e-05;-2.7196533665119e-06;1.7520675100968e-05;6.2279441408464e-06;-0.00044631370110437;1.1069927495555e-05;-5.92449978285e-05;0.00010989369184244;-0.00068411708343774;-0.00017982917779591;6.1198402363516e-06;-0.00026646890910342;0.00038441232754849;-0.00011035894567613;2.4914039386204e-05;6.205722456798e-05;0.001030869083479;-0.00011059013922932;0.00070534338010475;-0.00017710000975057;-0.00017511272744741;-3.4747492463794e-05;0.0001336321583949;-0.00048200346645899;-0.00034324498847127;0.00042197867878713;0.00013171594764572;7.142276444938e-05;0.00052908179350197;5.5925596825546e-05;0.00025155564071611;-0.00053257989929989;0.00010293961531715;-0.0013684930745512;0.00010316557745682;0.0003347858437337;6.4077736169565e-05;0.00025514379376546;-8.3195132901892e-05;-0.00017285598732997;8.7536885985173e-05;-0.00051613093819469;1.706455987005e-05;-0.00017097347881645;-5.4223790357355e-05;6.2242048443295e-05;-1.0824217497429e-05;-6.3355444581248e-05;1.7033476979122e-05;-0.00046627287520096;-0.00011408988939365;-0.00028799023129977;-1.45674448504e-05;-0.00025801782612689;-0.00022146049013827;7.2967814048752e-05;0.00051284319488332;8.3979975897819e-05;0.00018056818225887;-2.6806557798409e-05;0.00036678600008599;-2.9036067644483e-05;0.00053132546599954;8.6710089817643e-05;-0.00030667218379676;7.1996495535132e-05;0.00041395507287234;3.6319492210168e-05;-0.00025835799169727;8.0629921285436e-05;-0.00020977290114388;-2.4795455829008e-05;0.00021542451577261;7.4083487561438e-05;-0.00018044622265734;-6.5803396864794e-05;-4.2281055357307e-05;1.4294169886853e-05;0.0010035345330834;-4.1206727473764e-05;-0.00013621005928144;-1.7222511814907e-05;0.00020894364570267;2.0718172891065e-05;0.00015439266280737;-1.3089969797875e-05;0.00020248594228178;9.8537711892277e-05;-0.00010515587200643;-0.00010807751095854;-7.4165174737573e-05;-0.00057120609562844;2.7282218070468e-05;8.3316910604481e-05;-2.6854704060497e-07;-0.00014380014908966;1.1923336387554e-05;-0.00020003286772408;-3.6747542253579e-06;-4.9943817430176e-05;7.8027034760453e-05;-0.00039098996785469;-0.00010447355452925;-2.7278876586934e-05;-0.0001627881283639;0.00028127388213761;-5.7024484704016e-05;6.348616352625e-06;4.2182775359834e-05;0.00063265353674069;-6.6015505581163e-05;0.00041466319817118;-8.7785803771112e-05;-0.00013614897034131;-1.9487222743919e-05;5.0327293138253e-05;-0.00029091406031512;-0.0002328377449885;0.00025171609013341;9.8969008831773e-05;3.7810012145201e-05;0.00032972352346405;0.00012314038758632;0.00013970831059851;-0.00034989410778508;4.7878191253403e-05;-0.0009158406755887;5.4633808758808e-05;0.00026866278494708;3.3704491215758e-05;0.0002637158613652;-7.6433992944658e-05;2.0979430701118e-05;7.4720410339069e-05;-0.00033583171898499;-2.8932930945302e-05;-0.00012038558634231;-6.0512575146277e-05;5.2420073188841e-05;1.0107462912856e-05;-0.0002258494932903;9.8799928309745e-06;-0.0001891837164294;-0.00014703336637467;-0.00018625571101438;-3.7049543607282e-05;-0.00031590889557265;-0.00023434704053216;3.1242449040292e-05;0.00042436152580194;0.00014914423809387;0.00017515683430247;9.5168888947228e-07;0.00013155779743101;-1.5959440133884e-06;0.00031199003569782;0.00012007805344183;-0.00018696719780564;8.4332081314642e-05;0.00022852668189444;5.7123081205646e-05;-0.00018087538774125;5.2034014515812e-05;-0.00015657593030483;2.1984045815771e-05;0.00017292078700848;6.63788523525e-05;-0.00011595559044508;-6.1210470448714e-05;-5.708622848033e-05;8.0083591456059e-06;0.00092076422879472;-2.6128496756428e-05;-9.6406656666659e-05;-9.4594461188535e-06;0.0001417860185029;2.7167588996235e-05;4.6126289817039e-05;2.0944692096236e-06;0.00021267407282721;0.00014408190327231;-6.5621854446363e-05;-0.00015843720757402;-9.2007605417166e-05;-0.00054103974252939;-1.0784722690005e-05;7.6172327680979e-05;4.0450854612573e-06;-0.0002044210996246;1.6799278455437e-05;-0.00012162505299784;-1.5401874406962e-05;-3.70599773305e-05;6.3167848566081e-05;-0.00021771552565042;-6.4631567511242e-05;-1.9488421457936e-05;-0.00011898868979188;0.00024142181791831;-3.3402604458388e-05;-1.1340421224304e-05;4.3437958083814e-05;0.00038816320011392;-3.5335837310413e-05;0.0003006515908055;-3.085755452048e-05;-8.3652368630283e-05;-1.6074203813332e-05;-2.6729969249573e-05;-0.00022504557273351;-0.00019077262550127;0.00015886701294221;0.00012217677431181;2.3785260054865e-05;0.00024872072390281;0.00021271633158904;6.8293549702503e-05;-0.0003142616187688;1.7890330127557e-05;-0.00071889947867021;2.200847484346e-05;0.00021386331354734;1.9092216462013e-05;0.00023751561820973;-4.2957766709151e-05;-1.0972328709613e-05;1.602059819561e-05;-0.00033102877205238;-8.5987558122724e-05;-7.3021095886361e-05;-7.6872034696862e-05;5.2853840315947e-05;3.4559379855637e-05;-0.00017643577302806;-2.6753914426081e-05;3.44594627677e-05;-0.00023228835198097;-0.00014017875946593;-6.5267122408841e-05;-0.00027632791898213;-0.00029489639564417;-4.2258419853169e-05;0.00043025842751376;0.00017535263032187;0.00024867869797163;6.2731051002629e-05;7.961366645759e-05;8.9756948000286e-05;0.00015298119978979;0.00017292863049079;-0.00026981023256667;0.0001280549186049;0.00013475377636496;9.4537594122812e-05;-8.1481288361829e-05;2.1165873477003e-05;-8.7347703811247e-05;5.5172160500661e-05;0.0002314362936886;6.492013199022e-05;-9.8426309705246e-05;-6.4866027969401e-05;-8.6353662481997e-05;8.4037073975196e-06;0.00069996283855289;-5.6945336837089e-06;1.2065504051861e-05;-4.7586544837941e-07;0.00020675579435192;3.629588172771e-05;-5.1759012421826e-05;-1.7293215933023e-05;0.0002461115072947;0.00016927215619944;-4.5786514419888e-06;-0.00019994111789856;-0.0001153837874881;-0.00056852749548852;-5.2567862439901e-05;3.3504651497651e-08;8.3100221672794e-06;-8.9467706857249e-05;2.1708525309805e-05;-0.00022610402083956;-3.1345643947134e-05;-8.3338192780502e-05;6.8854795244988e-05;-9.5470102678519e-05;-5.5997497838689e-05;0.00022733502555639;-8.9813096565194e-05;0.00026292164693587;-2.8439129891922e-05;-1.6694319128874e-05;4.5225842768559e-05;0.00050568615552038;-1.3190903700888e-05;0.00047164858551696;1.7784937881515e-05;-1.9885665096808e-05;-4.1631005842646e-06;-3.5179327824153e-05;-0.00020643681637011;-0.0001818989549065;8.1900107034016e-05;0.00012446272012312;-5.6656539527467e-05;0.00024854310322553;-0.00014640956942458;2.928505455202e-05;-0.00043778805411421;-1.9729819541681e-05;-0.00071761407889426;-1.1214588994335e-05;0.00012776782386936;8.5040010162629e-06;0.00019321456784382;-1.4996704521764e-05;-1.5293153410312e-05;-2.2730555429007e-05;-0.00030528730712831;-0.00010417190787848;-5.8191108109895e-05;-8.467971929349e-05;4.9297937948722e-05;5.0421014748281e-05;-0.00011067494779127;-4.8968468036037e-05;0.00015162776981015;-0.00028369479696266;-9.8563235951588e-05;-8.1731086538639e-05;-0.00023633686942048;-0.00031054436112754;-7.260734855663e-05;0.00040964008076116;0.00017499896057416;0.00028488240786828;7.9807286965661e-05;7.9618939707871e-06;0.00014530970656779;6.715517520206e-05;0.00020037402282469;-0.00030107240309007;0.000153701621457;6.2447041273117e-05;0.00011870446178364;-2.0486511857598e-05;9.7543261290411e-06;-3.6650108086178e-05;7.2069276939146e-05;0.0002245996001875;6.6365064412821e-05;-8.0564313975628e-05;-5.8600147895049e-05;-0.00010923382797046;6.0790848692704e-06;0.00050515338080004;3.6160320178169e-06;5.9103207604494e-05;6.4518408180447e-06;0.00024722199304961;4.4487816921901e-05;-0.0001143638510257;-1.8396523955744e-05;0.00026413827436045;0.00017783713701647;3.5971792385681e-05;-0.00021311316231731;-0.00014422349340748;-0.00050964544061571;-7.6672797149513e-05;-4.7436962631764e-05;6.8385215854505e-06;8.7314892880386e-06;2.6718584194896e-05;-0.00029097622609697;-4.4774034904549e-05;-9.6066134574357e-05;6.2972212617751e-05;-2.4936300178524e-05;-4.2515865061432e-05;0.0003703459224198;-5.6914126616903e-05;0.0002614569675643;-2.1994572307449e-05;-2.1369867681642e-05;4.6779074182268e-05;0.00052528502419591;1.0803962140926e-05;0.00055853166850284;6.0877035139129e-05;3.677291169879e-05;5.3278477025742e-06;-4.4516327761812e-05;-0.00020099103858229;-0.00017127589671873;4.1208040784113e-05;0.00012584435171448;-9.5664203399792e-05;0.00023916982172523;-0.00033190791145898;-1.2398615581333e-05;-0.00050687044858932;-5.2630330173997e-05;-0.00067581346957013;-4.049238486914e-05;5.1929215260316e-05;-9.4645196213605e-07;0.00013533036690205;1.8411076325719e-06;3.2468713015987e-06;-3.4652501199162e-05;-0.00023384740052279;-7.8374490840361e-05;-3.7712256016675e-05;-6.498957372969e-05;3.6151970562059e-05;4.2827185097849e-05;-8.2520869909786e-05;-4.4731295929523e-05;0.0001743369793985;-0.00025272881612182;-6.5480824559927e-05;-6.8277127866168e-05;-0.00017715575813781;-0.0002426740975352;-6.5482017816976e-05;0.0003104264033027;0.00013762564049102;0.00024036649847403;5.1902385166613e-05;-2.6217721824651e-05;0.00013707464677282;1.8738572180155e-05;0.00016815459821373;-0.00024934869725257;0.00013842157204635;2.3631031581317e-05;0.00010411760740681;1.162069838756e-05;9.2269765445963e-06;-1.9646975488286e-05;6.3837556808721e-05;0.00016635010251775;5.3410385589814e-05;-5.801753650303e-05;-4.3967585952487e-05;-9.2739821411669e-05;-2.4796750039968e-06;0.0003532255650498;7.923998964543e-06;6.0759182815673e-05;1.209450965689e-05;0.00020238931756467;4.5564640458906e-05;-0.00012378201063257;-2.2424537746701e-05;0.00022456134320237;0.00016441170009784;5.1874761993531e-05;-0.00017873027536552;-0.00012938831059728;-0.00038936344208196;-7.4776660767384e-05;-4.6544253564207e-05;9.4744950729364e-07;1.9328243070049e-05;2.1926814952167e-05;-0.00024039146956056;-4.7200712288031e-05;-8.1843732914422e-05;4.4183543650433e-05;1.3273210242915e-05;-1.8906755940407e-05;0.0003349318576511;-1.8093069229508e-05;0.00021157803712413;-7.3110650191666e-06;-1.7324397049379e-05;3.6684334190795e-05;0.00041777844307944;2.6642153898138e-05;0.00046840030699968;8.1444632087369e-05;3.9980179280974e-05;9.8936989161302e-06;-4.2134495743085e-05;-0.00015399322728626;-0.00013721939467359;1.8827551684808e-05;9.5253228209913e-05;-8.7747313955333e-05;0.0001807285589166;-0.00031431787647307;-4.1944098484237e-05;-0.0004244394658599;-6.8868263042532e-05;-0.00053037441102788;-5.6363522162428e-05;2.6811843781616e-05;-5.5304958550551e-06;6.539469177369e-05;1.1085576261394e-05;2.9645296308445e-05;-2.8602156817215e-05;-0.0001342167815892;-2.5271576305386e-05;-1.8314542103326e-05;-2.6915364287561e-05;1.9503127987264e-05;1.9675522707985e-05;-7.8424505773e-05;-1.9557584892027e-05;0.00012583821080625;-0.00015633548900951;-3.3096115657827e-05;-3.438117710175e-05;-9.9264325399417e-05;-0.00012224893725943;-3.6383247788763e-05;0.00015574826102238;7.5157928222325e-05;0.00014643772738054;4.7865523811197e-07;-2.3058792066877e-05;8.0715217336547e-05;-3.4457896163076e-06;9.2020694864914e-05;-0.00013070032582618;8.7893138697837e-05;-6.0138050095304e-09;6.0628692153841e-05;2.5391003873665e-05;1.3734930689679e-05;-1.5610785339959e-05;3.7149737181608e-05;7.7396354754455e-05;2.6873138267547e-05;-2.8901516998303e-05;-2.3434091417585e-05;-5.0293161621084e-05;-9.7645970527083e-06;0.00020352969295345;1.0104222383234e-05;3.9614060369786e-05;1.5207527212624e-05;0.00010052123252535;3.445128822932e-05;-9.4044757133815e-05;-2.4351611500606e-05;0.00013675681839231;0.00012174719449831;4.9304973799735e-05;-0.00010729551286204;-7.9528472269885e-05;-0.00022126303520054;-5.2611263527069e-05;-1.8980075765285e-05;-3.9432325138478e-06;-1.4835894944554e-05;6.858007509436e-06;-0.00011820902727777;-3.5573139030021e-05;-5.0353446567897e-05;1.7045193089871e-05;3.6508412449621e-05;9.6586236395524e-06;0.00018868107872549;1.6969095668173e-05;0.00012373925710563;9.8434429673944e-06;-8.6262216427713e-06;1.9433155102888e-05;0.00022100599016994;3.1588275305694e-05;0.00026246943161823;7.604112761328e-05;1.692863588687e-05;7.709472811257e-06;-2.824182229233e-05;-7.2413859015796e-05;-8.2425816799514e-05;-2.5470010314166e-06;4.1988885641331e-05;-5.0402941269567e-05;8.6859952716623e-05;-0.00017554973601364;-5.3712996304967e-05;-0.00024083914468065;-6.3985833548941e-05;-0.00029903187532909;-5.6700249842834e-05;2.2152880774229e-05;-3.7919749047433e-06;-2.349689748371e-05;-8.9580214989837e-05;0.00011522444401635;5.667677760357e-05;0.00011449935846031;0.0002213101106463;7.1279333496932e-05;8.1504877016414e-05;-2.3411264919559e-05;-5.7167417253368e-05;4.889816409559e-05;-1.9429802705417e-05;0.00029635670944117;-0.00015632931899745;5.1062310376437e-05;6.5271888161078e-05;8.4272418462206e-05;0.00024486178881489;4.546136551653e-05;-0.00014603314048145;-0.00025514370645396;-5.06588294229e-05;-0.00027247893740423;-0.00021167841623537;1.9905233784812e-05;-0.00018541904864833;-2.9997043384355e-05;-0.00015491315571126;0.0002864038979169;-9.3895498139318e-05;-3.3356020139763e-05;4.1340713323734e-06;4.2836207285291e-05;5.9186557336943e-05;-4.3791869757115e-06;3.7895446439506e-05;0.00013412587577477;-5.4077681852505e-05;-8.9332337665837e-05;1.5572226402583e-05;-9.8820579296444e-05;4.4885950046591e-05;0.00018398821703158;5.8829450608755e-06;5.3199732064968e-05;1.8836353774532e-05;0.00025441890466027;-0.00014513316273224;-4.8567657358944e-05;0.00022206451103557;9.8142016213387e-05;0.00014499126700684;-0.00012264982797205;-0.00013333532842807;-0.00010918596672127;-0.0002535059757065;3.2504784030607e-05;-6.9488945882767e-05;8.1783116456791e-07;9.7500065749045e-05;-2.6436913685757e-05;-0.00029606942553073;4.3290485336911e-05;-7.5990457844455e-05;-2.4868602849892e-05;3.8060938095441e-05;-2.7190522814635e-05;0.00037142407381907;1.1252365766268e-05;0.00020076098735444;3.0259134291555e-05;-1.3163886251277e-05;2.8185999326524e-05;0.00040135002927855;7.13478657417e-05;0.00049999111797661;-6.9763018473168e-07;5.5603584769415e-05;-4.5982389565324e-05;-0.0001542323443573;-0.00013670584303327;0.00010771719098557;6.3583242990717e-06;0.00015869837079663;-8.2091733929701e-05;-2.0913159460179e-05;-0.00039776114863344;-6.8530687713064e-05;-0.00042042954009958;-6.805937300669e-05;-0.00048834225162864;1.1567489309527e-05;-1.0908378499153e-05;-1.8831955458154e-05;-0.00011993679800071;0.0001215427837451;7.3228198743891e-05;0.00013720490096603;0.00026308008818887;8.2924780144822e-05;9.6227980975527e-05;-2.5554974854458e-05;-6.9190617068671e-05;5.7175257097697e-05;-1.3969558494864e-05;0.00032922712853178;-0.0001592455082573;5.8172568969894e-05;8.6533764260821e-05;0.00011024736886611;0.00029173522489145;5.301522105583e-05;-0.0001749133807607;-0.00030997721478343;-6.7686007241718e-05;-0.0003114783030469;-0.00023310726101045;5.8971950238629e-06;-0.00021089611982461;-5.0573526095832e-05;-0.00017335820302833;0.00033369936863892;-0.00010401448525954;-5.7177883718396e-05;2.0556220192702e-07;3.8161779229995e-05;6.9335153966676e-05;-1.3029176443524e-05;4.5830201997887e-05;0.00016571240848862;-6.5416206780355e-05;-0.00011226303467993;2.0856947230641e-05;-0.00010942779044854;4.8004392738221e-05;0.00024820875842124;2.5180640932376e-06;5.5626154789934e-05;1.7987691535382e-05;0.00029383355285972;-0.00015319892554544;-5.5098262237152e-05;0.0002529980847612;9.8496791906655e-05;0.00016285515448544;-0.00013470795238391;-0.00015014800010249;-0.0001191179107991;-0.00031343146110885;3.9489535993198e-05;-7.3563751357142e-05;2.6973959847965e-06;0.00010311756341252;-2.5555453248671e-05;-0.00034097727620974;5.6623644923093e-05;-8.8382774265483e-05;-4.0496517613064e-05;2.9971319236211e-05;-5.2653165766969e-05;0.00041782250627875;4.6395734898397e-06;0.00023854132450651;3.5895547625842e-05;-1.5362213162007e-05;1.9921160856029e-05;0.00047643255675212;6.2758641433902e-05;0.0005763765075244;-3.0153332772898e-06;5.4687316151103e-05;-5.1853199693142e-05;-0.00018427707254887;-0.00016025437798817;0.00013225660950411;1.4238274161471e-05;0.00019693918875419;-9.6327399660368e-05;-3.1165714062809e-06;-0.00044522309326567;-6.21391372988e-05;-0.0004832309205085;-6.2535858887713e-05;-0.00058354617794976;1.455394885852e-05;7.5570295621219e-07;0.00010037251922768;-0.00026901802630164;-7.1329515776597e-05;-3.6594021366909e-05;-1.632937528484e-05;0.00034767840406857;4.809533857042e-05;0.00024831961491145;1.7316655430477e-05;-7.467411342077e-05;-5.3298543207347e-05;0.00022027107479516;0.00013176827633288;0.0003861898148898;1.7040512830135e-05;0.00022389731020667;0.00029746882501058;0.00019636994693428;-0.00011534636723809;-0.00015284944674931;-0.00036512667429633;9.6257987024728e-05;-0.00020751359988935;4.4461281504482e-05;-0.00016295170644298;-0.0001085241092369;-0.00047034726594575;-6.9318746682256e-05;0.00015623294166289;-3.6741454096045e-05;-0.0003217775374651;6.6249383962713e-05;-0.00020192902593408;3.7061832699692e-05;-0.00019176141358912;8.3218066720292e-05;0.00010375496640336;-7.6512871601153e-05;-0.00020731131371576;8.598934073234e-06;-3.4805012546713e-05;-2.5217907023034e-05;0.00094972446095198;-2.0991577912355e-05;-0.00021792197367176;1.4922699847375e-05;0.00014358860789798;4.4960888772039e-05;-7.7804370448575e-06;0.00025103084044531;-9.2464244517032e-05;0.00018594208813738;-0.00010411920811748;-0.0001248982589459;-2.1633539290633e-05;-0.00044009269913658;2.0672858227044e-05;0.00016235688235611;8.8607785073691e-06;-0.00021795637439936;1.6575096424276e-06;-9.7204974736087e-05;6.7972898250446e-05;-1.2738690884362e-06;-8.6657091742381e-05;-0.00024908821796998;-0.00017578959523235;-0.00010032867430709;-2.5419602025067e-05;0.00025857167202048;4.0760885894997e-05;-5.8332134358352e-06;-6.0693299019476e-05;0.00032573554199189;-7.1162794483826e-05;0.00028953939909115;-2.7151094400324e-05;-0.00012084766058251;-5.9104037063662e-05;-0.00028306274907663;-0.00022183966939338;0.00017934617062565;0.00021703260426875;0.00027162424521521;6.874115933897e-05;0.00012323245755397;0.00031665107235312;4.4698663259624e-05;-0.00028580854996108;4.467272083275e-05;-0.00076164479833096;3.0883194995113e-05;0.00025624223053455;0.00011907814041479;-0.00029776070732623;-9.7014009952545e-05;8.5129497165326e-05;-6.3185463659465e-05;0.00049821427091956;5.5271782912314e-05;0.00033593748230487;3.0707262340002e-05;-8.981600694824e-05;-6.4300496887881e-05;0.00013228169700596;0.00012716396304313;0.00065364816691726;5.800478902529e-06;0.00032091225148179;0.00030117193819024;0.00021102768369019;-0.00017478912195656;-0.00011916656512767;-0.00047784604248591;0.00013707624748349;-0.00023062608670443;7.6666263339575e-05;-0.00032451105653308;-0.00010136908531422;-0.00070213910657912;-7.2485228884034e-05;0.00025319840642624;-2.8934566216776e-05;-0.0004993419861421;9.6633564680815e-05;-0.00027809315361083;8.8903871073853e-06;-0.00027673848671839;0.00011298323806841;0.00010831667168532;-8.5495885286946e-05;-0.00029888501740061;1.1920265023946e-05;-2.992923509737e-05;-4.3685398850357e-05;0.0011109178885818;-2.7886089810636e-05;-0.00030236167367548;1.6423868146376e-05;0.00022638325754087;0.00012933238758706;-3.0736206099391e-05;0.00028187883435749;-0.00013879836478736;0.00020292737463024;-0.00011709849059116;-8.0805242760107e-05;2.9454545256158e-06;-0.0004641227715183;1.2909682482132e-05;0.00019820143643301;1.009682273434e-05;-0.00018268104759045;7.0793930717628e-06;-0.00018052343511954;8.3157450717408e-05;4.6911873141653e-06;-0.00013096956536174;-0.00042264323565178;-0.00023256902932189;-0.00012467228225432;-4.6651763113914e-05;0.00032923882827163;4.5611894165631e-05;6.0413563005568e-06;-8.7821841589175e-05;0.00051624403567985;-0.00012146661902079;0.00041272930684499;-3.0296987461043e-05;-0.00017297753947787;-1.0908178410318e-05;-0.00037828952190466;-0.00028619027580135;0.0001904571254272;0.00032301584724337;0.00037383424933068;8.7368411186617e-05;0.00019273028010502;0.000328486377839;7.0231159043033e-05;-0.00035648708580993;7.483025547117e-05;-0.0010066910181195;4.2729701817734e-05;0.00032723750337027;0.00013859292084817;-0.0003224317333661;-0.00012570430408232;0.00029130568145774;-0.00015018242993392;0.0007309119682759;6.8156405177433e-05;0.00050562276737764;5.2971623517806e-05;-0.00011677635484375;-7.7164258982521e-05;-3.9924052543938e-05;0.00012420516577549;0.0011072974884883;-1.4011576240591e-05;0.00045589089859277;0.00028150618891232;0.00023808749392629;-0.00028120510978624;-5.1373048336245e-05;-0.00065718247788027;0.00021114958508406;-0.00027976738056168;0.00011863934923895;-0.00056440301705152;-8.6542509961873e-05;-0.0010882196947932;-7.8941651736386e-05;0.00039262484642677;-1.8165383153246e-05;-0.0007649672916159;0.00013962356024422;-0.00038329334347509;-3.0869079637341e-05;-0.00036395143251866;0.00015760801034048;7.004922372289e-05;-8.963217260316e-05;-0.00045385770499706;1.9128367057419e-05;-2.3435066395905e-05;-6.5674823417794e-05;0.0012584604555741;-3.62508399121e-05;-0.00043034134432673;1.3064081940684e-05;0.00039067046600394;0.00023778529430274;-6.1588682001457e-05;0.00032151443883777;-0.00018993188859895;0.00020531023619696;-0.00015668991545681;3.0816085200058e-05;3.1599585781805e-05;-0.00043623530655168;3.7699237509514e-06;0.00023725880600978;8.093094038486e-06;-5.4093918151921e-05;1.8053575331578e-05;-0.00036695969174616;0.00010425740038045;1.9666376829264e-05;-0.00019873703422491;-0.00066502578556538;-0.00032714303233661;-0.000137603157782;-8.2225938967895e-05;0.00042376515921205;5.6804212363204e-05;2.3710339519312e-05;-0.00012622340000235;0.00077552971197292;-0.00019959852215834;0.00062899221666157;-3.914540502592e-05;-0.00021943435422145;4.7234549128916e-05;-0.00054156681289896;-0.00038441011565737;0.0002288545074407;0.00047789217205718;0.00053555599879473;0.00012496563431341;0.00029647091287188;0.00033501506550238;0.00011457214714028;-0.00048978882841766;0.00011922580597457;-0.0013600569218397;6.3942759879865e-05;0.00039450437179767;0.00010286214092048;-0.00023135844094213;-9.486403723713e-05;0.00037737551610917;-0.00017040502279997;0.00069249229272828;5.6111672165571e-05;0.00048224642523564;5.1838847866748e-05;-0.00010182082041865;-5.8101602917304e-05;-0.00017005339032039;9.0075816842727e-05;0.0010931588476524;-2.3910450181575e-05;0.00040152994915843;0.00015757919754833;0.00019677152158692;-0.00026592117501423;2.1801699404023e-05;-0.00059545517433435;0.00019730023632292;-0.00025325326714665;0.0001005143058137;-0.00057585572358221;-4.8056626837933e-05;-0.0010298239067197;-6.202605436556e-05;0.00037531190901063;-7.2071456997946e-06;-0.00070885755121708;0.00011773961159633;-0.0003198181220796;-4.4480450014817e-05;-0.00028307971660979;0.00013930448039901;7.5211496550764e-06;-6.0785863752244e-05;-0.00043413028470241;2.1330553863663e-05;-1.4939153516025e-05;-5.1342845836189e-05;0.00088886660523713;-2.9123471904313e-05;-0.00037421711022034;1.7540255612403e-06;0.00042175143607892;0.00022322595759761;-6.586495146621e-05;0.00024772010510787;-0.00015007107867859;0.00012761370453518;-0.00014742041821592;0.00012471879017539;3.0894287192496e-05;-0.00024655513698235;7.6459897968562e-08;0.00016985031834338;1.5542637754606e-07;0.00011145822645631;2.2500407794723e-05;-0.00043465290218592;9.009941277327e-05;1.6354217223125e-05;-0.00018749723676592;-0.000601235718932;-0.00030188797973096;-4.1791427065618e-05;-8.6011561506893e-05;0.00036356621421874;4.9148438847624e-05;2.7975895136478e-05;-0.00011589811037993;0.00073433230863884;-0.00019461457850412;0.00063437782227993;-3.4801287256414e-05;-0.00016542692901567;6.6958586103283e-05;-0.0004929163842462;-0.00033377457293682;0.00019671130576171;0.0004212222120259;0.00049319060053676;9.3985130661167e-05;0.00028182688402012;0.00016156384663191;0.000113923662866;-0.00046843642485328;0.00011315789015498;-0.0011888107983395;6.084876076784e-05;0.00029385989182629;0.00024473082157783;-9.0713452664204e-05;-0.00027812557527795;0.00011748637916753;-0.00059987226268277;5.916555528529e-05;-0.0002389782021055;-6.3713509007357e-05;7.353557884926e-05;-3.265933264629e-05;0.00012825334852096;2.1889409254072e-05;-0.0007531198207289;-9.1026449808851e-05;-0.0004081153892912;7.8651519288542e-06;-0.00025742870639078;-0.00019850127864629;0.00015676012844779;0.0005953052896075;3.9557256968692e-05;0.00012233412417118;-6.594073784072e-05;0.000446892430773;-6.1914142861497e-05;0.00078623491572216;6.7164161009714e-05;-0.00043197732884437;6.7100321757607e-05;0.00062023953069001;1.7571745047462e-05;-0.00038523133844137;0.00013236884842627;-0.00031480356119573;-7.96109525254e-05;0.00018649965932127;0.00010090622527059;-0.00026137495297007;-6.7090200900566e-05;-3.7312289350666e-05;1.9204535419703e-05;0.0012280737282708;-7.0078662247397e-05;-0.00026883746613748;-2.314606535947e-05;0.00026744217029773;2.0959247194696e-05;0.00029173953225836;-1.7140529962489e-05;0.00021262642985675;8.1686106568668e-05;-0.00017060029495042;-4.5235676225275e-05;-8.2586702774279e-05;-0.0005668360972777;7.3560149758123e-05;0.00014826669939794;-1.4204530089046e-05;-0.00013378690346144;1.1462645488791e-05;-0.00023938973026816;2.4699197638256e-06;-2.6209370844299e-05;8.3238519437145e-05;-0.00064185715746135;-0.00014051648031455;-0.00016714727098588;-0.00020128022879362;0.0003328874881845;-7.5006668339483e-05;1.7870379451779e-05;4.6182944061002e-05;0.00079237332101911;-8.8264532678295e-05;0.00045394789776765;-0.00013825330825057;-0.00020337029127404;-2.4763874534983e-05;0.00012258591596037;-0.00038451125146821;-0.00029711567913182;0.00039524416206405;8.1879399658646e-05;0.00010135318734683;0.00041732835234143;0.00028259688406251;0.00019873214478139;-0.00036804768024012;7.2787319368217e-05;-0.0011419554939494;8.4562176198233e-05;0.00036745157558471;4.7277604608098e-05;0.00039488522452302;-0.00014164275489748;-0.00023580707784276;0.00016216878429987;-0.00071206782013178;2.1682017177227e-05;-0.00021908147027716;-7.9650671978015e-05;9.0295063273516e-05;-2.820315057761e-05;-7.8096425568219e-05;3.8431302527897e-05;-0.00070083065656945;-0.00013491761637852;-0.00048598652938381;-9.0964585979236e-06;-0.00041640119161457;-0.00028582275263034;0.00013133154425304;0.0007352028042078;0.00012574071297422;0.00017349762492813;-3.8400168705266e-05;0.00052712706383318;-7.8552169725299e-05;0.00080922403139994;0.00011464458657429;-0.00049791927449405;9.2053043772466e-05;0.00069075066130608;3.5441742511466e-05;-0.00047345989150926;0.00015515863196924;-0.00038743621553294;-7.3903043812606e-05;0.0003829803026747;0.00011411575542297;-0.00028831450617872;-0.00010824039782165;-4.3420095607871e-05;1.3843529814039e-05;0.0017568357288837;-8.6137464677449e-05;-0.00026115361833945;-3.338671012898e-05;0.00024814464268275;3.8534533814527e-05;0.00031997106270865;-1.841590164986e-05;0.00030617820448242;0.00014362836373039;-0.0002074618532788;-0.00019080849597231;-7.957399066072e-05;-0.00098008767236024;8.1922793469857e-05;0.00020160335407127;-9.9304597824812e-06;-0.00034973048605025;2.2177404389367e-05;-0.00018963225011248;-4.001225988759e-06;-6.5339161665179e-05;0.00011633466783678;-0.00070448440965265;-0.00016336221597157;-0.00020966489682905;-0.00024094113905448;0.00043468602234498;-7.6770345913246e-05;1.6930516721914e-05;5.3373387345346e-05;0.0009852743241936;-0.00011169984645676;0.00052494485862553;-0.00015047668421175;-0.00028350870707072;-2.6633004381438e-05;0.00012042662274325;-0.00042611925164238;-0.00036528907367028;0.00044026348041371;0.00010498087794986;0.00010115202894667;0.0004882687353529;0.00033788019209169;0.00023304240312427;-0.00043911777902395;7.5103882409167e-05;-0.0014200499281287;9.6932701126207e-05;0.00050303916214034;5.0822563935071e-05;0.00034426795900799;-0.00011193306272617;-0.00013798096915707;0.00011291480768705;-0.00055571104167029;-1.3689067600353e-05;-0.00013536808546633;-6.3188461354002e-05;7.0416928792838e-05;-9.0408766482142e-06;-0.00018856152018998;2.5221599571523e-05;-0.00039132300298661;-0.00013823028712068;-0.00034117023460567;-2.3140279154177e-05;-0.00035388336982578;-0.00026680278824642;5.0954426114913e-05;0.00058194913435727;0.00013890225091018;0.00019053164578509;-7.4643469361035e-07;0.00039214582648128;-3.6324574466562e-05;0.00051471614278853;0.00011415896005929;-0.00035758889862336;8.6867847130634e-05;0.00045694858999923;4.4686839828501e-05;-0.00030742498347536;9.2741349362768e-05;-0.00026906980201602;-2.1730806111009e-05;0.00033768304274417;8.2697741163429e-05;-0.00019383383914828;-9.2162466899026e-05;-4.2905441659968e-05;8.6200388977886e-06;0.001344662392512;-5.0197610107716e-05;-0.00013608514564112;-2.2203068510862e-05;0.0001762080937624;3.3765507396311e-05;0.00017498107627034;-1.9240915207774e-05;0.00025845228810795;0.00014837236085441;-0.00013152034080122;-0.00020311251864769;-6.4781910623424e-05;-0.00083324027946219;3.2286119676428e-05;0.00013055118324701;4.5851059837787e-08;-0.00030570387025364;1.8104150512954e-05;-0.00013695580128115;-9.0024414021173e-06;-7.8265482443385e-05;9.7890246252064e-05;-0.00042654792196117;-0.00011554973025341;-6.383298750734e-05;-0.00017940743418876;0.00034543586662039;-5.3926556574879e-05;6.767221748305e-06;4.2673487769207e-05;0.00075553439091891;-8.0178426287603e-05;0.00043629948049784;-9.1988549684174e-05;-0.00020122750720475;-1.7894952179631e-05;5.5474643886555e-05;-0.00029872640152462;-0.00026994527433999;0.00027494839741848;9.9501659860834e-05;3.0873947252985e-05;0.00036225232179277;0.00015403324505314;0.00015874014934525;-0.00037385785253718;4.4595781218959e-05;-0.0010773786343634;6.0872775065945e-05;0.00036910979542881;3.3724383683875e-05;0.00038633093936369;-0.00011458075459814;6.2564853578806e-05;0.00010286417091265;-0.00043006174382754;-5.1711747801164e-05;-0.0001087916243705;-6.6182030423079e-05;6.3726038206369e-05;1.1735809493985e-05;-0.0004551942110993;2.5428413209738e-05;-0.00013792344543617;-0.0001759229489835;-0.00022735647507943;-4.7744033508934e-05;-0.00042835745261982;-0.00029604011797346;9.4322194854612e-06;0.00051443697884679;0.00021456165995914;0.00022608971630689;1.3007016605115e-05;0.00022717138926964;-1.5851524949539e-05;0.00031615170883015;0.0001500766229583;-0.00018932938110083;0.00010033886064775;0.00025267360615544;6.8457527959254e-05;-0.00021657388424501;5.4148837079993e-05;-0.00019080481433775;3.8627378671663e-05;0.00030216234154068;7.4555995524861e-05;-0.00013308136840351;-8.6685620772187e-05;-5.5137359595392e-05;1.3096444035909e-06;0.0012807919410989;-2.6844147214433e-05;-7.5719333835877e-05;-1.2352327757981e-05;0.00011194827675354;3.843943704851e-05;4.1365619836142e-05;6.7747254206552e-07;0.00027404038701206;0.00019256402447354;-8.1181671703234e-05;-0.00025560305221006;-9.2891394160688e-05;-0.00084895937470719;-1.914050335472e-05;0.00012293952750042;7.9460405686405e-06;-0.00037393253296614;1.9709850676009e-05;-7.2681046731304e-05;-1.9638249796117e-05;-7.0264053647406e-05;8.77077691257e-05;-0.00020401748770382;-7.4324765591882e-05;-7.6645657827612e-05;-0.00014593431842513;0.0003093802370131;-2.7206893719267e-05;-1.1988395272056e-05;4.8251760745188e-05;0.00047966933925636;-5.0690912758e-05;0.00034279105602764;-3.5144810681231e-05;-0.00013948883861303;-2.0177942133159e-05;-4.9664213292999e-05;-0.0002374408650212;-0.00024024813319556;0.00016745753237046;0.00014667723735329;3.6946901673218e-05;0.00028243570704944;0.00026684446493164;8.6342799477279e-05;-0.00035684529575519;1.8895145331044e-05;-0.00088973727542907;2.7661088097375e-05;0.00030644127400592;2.23175593419e-05;0.0003021503216587;-6.6287371737417e-05;3.3922584407264e-05;3.9324077079073e-05;-0.00037422735476866;-7.7569187851623e-05;-6.343158747768e-05;-6.3668652728666e-05;5.3633284551324e-05;2.6115178116015e-05;-0.00036167030339129;-6.332381417451e-06;2.9379130864982e-05;-0.00021237065084279;-0.00015629654808436;-5.8761786931427e-05;-0.00033057606196962;-0.00029175239615142;-4.38225652033e-05;0.0004381159087643;0.00019901638734154;0.00025571996229701;4.4362983317114e-05;0.00016726525791455;5.512669304153e-05;0.00016044534277171;0.00016197963850573;-0.00020810989371967;0.00011878773511853;0.00014528792235069;8.4244369645603e-05;-9.262658568332e-05;1.8859844203689e-05;-0.00012453802628443;6.1102073232178e-05;0.00026900510420091;6.1786871810909e-05;-9.5458803116344e-05;-7.4315088568255e-05;-6.786916492274e-05;8.9255769353258e-07;0.00089802040020004;-2.882504986701e-06;1.2285747288843e-05;-2.48251950552e-07;0.00014084596477915;3.9529943023808e-05;-4.5678818423767e-05;-2.3281294488697e-05;0.00025185805861838;0.0002010437019635;-1.8733195247478e-05;-0.00023527586017735;-9.4999995781109e-05;-0.00069823599187657;-5.3404401114676e-05;4.4441378122428e-05;8.6639729488525e-06;-0.00023190584033728;1.6923875591601e-05;-0.00013648999447469;-2.9315629944904e-05;-9.2276372015476e-05;7.5626267062034e-05;-7.3692724981811e-05;-5.2048661018489e-05;0.00012191094720038;-9.6543997642584e-05;0.00027416794910096;-1.7796797692426e-05;-1.3534422578232e-05;4.2190582462354e-05;0.0004789904342033;-2.2199545128387e-05;0.00040945739601739;1.1158864253957e-05;-7.1226160798687e-05;-8.7247099145316e-06;-4.9885966291185e-05;-0.00018240754434373;-0.00019417844305281;7.7527307439595e-05;0.00012432278890628;-3.172350989189e-05;0.00023424270329997;-2.9849614293198e-05;3.7148322007852e-05;-0.00038892490556464;-1.5151600564423e-05;-0.00074776809196919;-6.0558304539882e-06;0.0001953522732947;1.189312479255e-05;0.00019141474331263;-2.2703707145411e-05;3.7265534047037e-05;-3.4051017792081e-06;-0.00027114260592498;-6.1564634961542e-05;-3.9974391256692e-05;-4.7952391469153e-05;3.8337228033924e-05;2.7174057322554e-05;-0.00024854499497451;-1.9308841729071e-05;0.00010512032895349;-0.00020124258298893;-8.8968678028323e-05;-5.2259416406741e-05;-0.00022230304602999;-0.00022500201885123;-5.1999464631081e-05;0.00030911041540094;0.00015077383432072;0.0002258496824652;2.935068187071e-05;7.8386190580204e-05;8.2439859397709e-05;6.312540062936e-05;0.00013830960961059;-0.0001693626109045;0.00011209247168154;5.7310302508995e-05;7.9674115113448e-05;-1.2344411516096e-05;7.671095772821e-06;-6.9347966928035e-05;5.9759833675344e-05;0.00017561035929248;4.5714925363427e-05;-5.8585010265233e-05;-5.0663456931943e-05;-6.5065411035903e-05;-4.0352497308049e-06;0.00054176477715373;8.214129593398e-06;4.0644947148394e-05;1.0019752153312e-05;0.0001276121038245;3.8373396819225e-05;-9.0873960289173e-05;-2.9965834983159e-05;0.000203448231332;0.00018088435172103;2.4038523406489e-05;-0.00018080622248817;-9.2197653430048e-05;-0.00047178295790218;-6.3385348767042e-05;5.2228278946131e-06;3.2221778383246e-06;-0.00012138118472649;1.1667868420773e-05;-0.00013881418271922;-3.462045424385e-05;-8.0138488556258e-05;4.926900510327e-05;8.4501389210345e-06;-2.0320447220001e-05;0.00018836304661818;-3.8983271224424e-05;0.00020815357856918;-3.2315504086e-06;-1.2909412362205e-05;3.2756131986389e-05;0.00036348146386445;7.0971254899632e-06;0.00036456767702475;5.0192589696962e-05;-1.9530110876076e-05;-2.2029782087429e-07;-4.6405872126343e-05;-0.00012549747771118;-0.00014130451017991;2.2354317479767e-05;8.908222662285e-05;-5.2370949561009e-05;0.00016340064757969;-0.00014005857519805;-1.3984571523906e-05;-0.00034016001154669;-4.3713149352698e-05;-0.00053810473764315;-3.539888348314e-05;0.00010189212480327;3.2722546166042e-06;0.00011256420839345;6.4040104916785e-06;4.8273672291543e-05;-2.7941052394453e-05;-0.00019755572429858;-3.6183850170346e-05;-2.4473909434164e-05;-3.187730544596e-05;2.7531312298379e-05;2.1881138309254e-05;-0.00017369932902511;-2.0402563677635e-05;0.00014142326836009;-0.00018841594283003;-5.2752864576178e-05;-4.1479634091957e-05;-0.00015123591583688;-0.00016406468057539;-4.7387322410941e-05;0.00021263636881486;0.00011122387513751;0.00019323534797877;1.6536298517167e-06;1.8001679563895e-05;9.0302761236671e-05;1.0553824722592e-05;0.0001141307875514;-0.00014315079897642;0.00010649739124347;1.2617419088201e-05;7.1690163167659e-05;2.9984141292516e-05;1.1942503988394e-05;-4.2399675294291e-05;5.0469712732593e-05;0.00010853639105335;3.2673469831934e-05;-3.7822705053259e-05;-3.4511085686972e-05;-5.7163728342857e-05;-1.1107472346339e-05;0.00033864186843857;1.3743304407399e-05;4.909026392852e-05;1.8896891560871e-05;0.00010749264765764;4.0577477193438e-05;-0.00011315345909679;-3.7726189475507e-05;0.00017087058222387;0.00017054199997801;5.3235209634295e-05;-0.0001418976316927;-8.7795684521552e-05;-0.00032698482391424;-6.5808191720862e-05;-8.8196793512907e-06;-3.1640606721339e-06;-7.1051443228498e-05;5.240493464953e-06;-0.00012237133341841;-4.0159808122553e-05;-6.8965106038377e-05;2.7417838282418e-05;5.0643295253394e-05;8.0657227954362e-06;0.00020207434135955;8.0399822763866e-06;0.00016434007557109;1.1760163943109e-05;-1.0268789083057e-05;2.4868211767171e-05;0.00027961711748503;3.065124474233e-05;0.00031452722032554;8.2307895354461e-05;7.9096309946181e-07;5.3016556194052e-06;-3.8864418456797e-05;-8.363548113266e-05;-0.00010988122812705;-7.0408550527645e-06;5.5542801419506e-05;-5.7350724091521e-05;0.0001110534867621;-0.00017664532060735;-5.4272033594316e-05;-0.00029121941770427;-6.9278066803236e-05;-0.00040383770829067;-6.1711813032161e-05;5.7029727031477e-05;-1.0608044931359e-06;4.1232302464778e-05;2.9280065064086e-05;7.1477661549579e-05;-4.2639785533538e-05;-0.00012997182784602;4.895903657598e-06;-1.2753609553329e-05;-9.5495997811668e-06;1.8223156075692e-05;9.6022458819789e-06;-0.00012597256863955;-7.7353024607874e-06;0.000155303554493;-0.00016535058966838;-2.7289150239085e-05;-2.3831316866563e-05;-9.2217138444539e-05;-9.1510133643169e-05;-3.2793785067042e-05;0.00011326238745824;6.87400897732e-05;0.00015312296454795;-4.4206590246176e-05;-2.5992105292971e-05;7.8920253145043e-05;-2.2873795387568e-05;8.0372541560791e-05;-0.00010707278124755;9.648795821704e-05;-1.6206025975407e-05;5.7045024732361e-05;5.4735755838919e-05;2.8433654733817e-05;-2.7078325729235e-05;3.2822990760906e-05;4.7431807615794e-05;1.6962958397926e-05;-2.201524694101e-05;-2.0324261640781e-05;-4.1882165533025e-05;-2.0371333448566e-05;0.00020091375336051;1.8971935787704e-05;4.8301277274732e-05;2.8900165489176e-05;7.1836380811874e-05;4.3554038711591e-05;-0.00012382183922455;-4.6436769480351e-05;0.00013877866149414;0.00016093108570203;7.9142220783979e-05;-0.00010519943316467;-7.8358119935729e-05;-0.00021231830760371;-6.4022111473605e-05;-6.9463640102185e-06;-1.0262405339745e-05;-5.8216362958774e-05;-6.3478205447609e-06;-8.302249625558e-05;-4.5093325752532e-05;-5.593970490736e-05;2.8099477731303e-06;8.0509591498412e-05;4.2836763896048e-05;0.00017362207290716;5.7792633015197e-05;0.00012345146387815;3.1998763006413e-05;-5.6414755817968e-06;1.6112127923407e-05;0.00018927667406388;5.4905787692405e-05;0.00024161435430869;0.00011512044875417;3.3354824608978e-06;8.0631898526917e-06;-2.6757328669191e-05;-3.6162698961562e-05;-8.5487612523139e-05;-3.1815943657421e-05;1.3409212442639e-05;-4.95455788041e-05;5.4805197578389e-05;-0.00016043447249103;-9.46694999584e-05;-0.00022483964858111;-9.6711642981973e-05;-0.00028426200151443;-9.2187081463635e-05;3.6258155887481e-05;-1.4671700228064e-06;-3.2244552130578e-05;5.5855107348179e-05;0.00011179123976035;-6.1902996094432e-05;-7.5335912697483e-05;6.187723192852e-05;-4.0697027543501e-06;1.6204365238082e-05;1.2075974154868e-05;-5.8655009524955e-06;-9.0940280642826e-05;1.4789652595937e-05;0.0001895548630273;-0.00016510009299964;-7.5876814662479e-06;-4.6240006668086e-06;-4.388429078972e-05;-1.9615983546828e-05;-1.6843845514813e-05;1.9578621504479e-05;2.7045194656239e-05;0.00013021378254052;-0.00011270191316726;-7.8837758337613e-05;6.9723268097732e-05;-5.7138960983139e-05;5.2251387387514e-05;-8.9197492343374e-05;0.00010159404337173;-4.4076892663725e-05;4.741312659462e-05;8.0377896665595e-05;6.0799320635851e-05;-1.485827669967e-05;1.1945990081585e-05;-5.4528095461137e-06;2.2494396034745e-06;-1.2278514986974e-05;-9.5525656433892e-06;-2.9941904358566e-05;-3.4662847610889e-05;0.00010316615953343;3.1530980777461e-05;5.3163701522863e-05;4.5848079025745e-05;4.4009761040797e-05;5.536764729186e-05;-0.00015117511793505;-6.2857136072125e-05;0.00012931272794958;0.00017190100334119;0.00012257766502444;-8.3317354437895e-05;-8.1900325312745e-05;-0.00013412715634331;-7.3664043156896e-05;-2.745441179286e-06;-1.9879817045876e-05;-6.0248730733292e-05;-2.4250108253909e-05;-5.2051091188332e-05;-5.9287125623086e-05;-4.9682221288094e-05;-2.7353924451745e-05;0.00011801360960817;9.3656773969997e-05;0.00016048357065301;0.00012767130101565;0.00010069124982692;6.4277221099474e-05;-3.4802752679752e-07;8.9110317276209e-06;0.0001252503861906;9.5723415142857e-05;0.00019850992248394;0.0001760050363373;2.0972274796804e-06;1.082999551727e-05;-1.2168178727734e-05;1.2196414900245e-05;-7.777306745993e-05;-6.4107960497495e-05;-3.8242451410042e-05;-4.3895834096475e-05;4.2368689889827e-08;-0.00015596159209963;-0.00015832859207876;-0.00018693262245506;-0.00014857199857943;-0.00020826258696616;-0.00015007823822089;2.6214078388875e-05;1.1337036767145e-06;-6.0798141930718e-05;5.1176906708861e-05;0.00012863158190157;-6.49599605822e-05;-3.8925765693421e-05;0.0001003875004244;3.4872246033046e-06;2.9236247428344e-05;7.9238416219596e-06;-1.5604538930347e-05;-6.2747531046625e-05;3.7426994822454e-05;0.00020890489395242;-0.00016472305287607;2.8162367016193e-06;9.1881111075054e-06;-1.3780296285404e-05;2.7460162527859e-05;-4.5645442696696e-06;-3.1715786462883e-05;-9.1764131866512e-06;0.00010851265687961;-0.00015314592747018;-0.00010914224549197;5.4265961807687e-05;-7.8516466601286e-05;3.5838449548464e-05;-9.1407171566971e-05;0.00011252259719186;-5.5429576605093e-05;3.6858054954791e-05;7.9503035522066e-05;7.8027587733231e-05;-3.8452731132566e-06;-4.9881805352925e-06;-2.0249135559425e-05;4.611498752638e-06;-1.3528118870454e-05;-1.0722988918133e-05;-2.2732989236829e-05;-4.2885589209618e-05;6.6010179580189e-05;5.8447316405363e-05;5.2527357183862e-05;5.3297142585507e-05;3.4104738006135e-05;6.8555542384274e-05;-0.00016276938549709;-7.2930073656607e-05;0.00013242733257357;0.00017091253539547;0.00014947059389669;-7.4800584116019e-05;-8.7477710621897e-05;-0.00010682072752388;-9.4872884801589e-05;3.9966468534658e-07;-2.3987275199033e-05;-5.5869415518828e-05;-3.4233515179949e-05;-4.1143783164443e-05;-7.4436895374674e-05;-3.9276528696064e-05;-4.4087468268117e-05;0.00011837032798212;0.00011458286462585;0.00014180199650582;0.00016723613953218;8.7163352873176e-05;8.8569402578287e-05;3.9425249269698e-06;4.9064819904743e-06;9.8568620160222e-05;0.00013276193931233;0.00017487457080279;0.00022016577713657;6.6860025071946e-07;1.0263770491292e-05;-9.8001764854416e-06;2.109296292474e-05;-8.108488691505e-05;-6.3658175349701e-05;-5.7967467000708e-05;-2.7754802431446e-05;-2.6103731215699e-05;-0.00014532922068611;-0.00019467881065793;-0.00016491275164299;-0.0001857028255472;-0.00017315460718237;-0.00020136681268923;2.2395466658054e-05;7.5134544204047e-06;-5.2854480600217e-05;4.2183132791251e-06;0.00011607713531703;-4.2694671719801e-05;8.2739479694283e-06;0.00013619245146401;1.6925341697061e-05;3.9052578358678e-05;1.0475425824552e-06;-2.5663863198133e-05;-2.6145869924221e-05;6.1993894632906e-05;0.00020500148821156;-0.00013955586473458;1.3673603461939e-05;2.8550712158903e-05;2.5313825972262e-05;8.3733699284494e-05;1.1040504432458e-05;-7.4416304414626e-05;-7.0154994318727e-05;5.9773556131404e-05;-0.00017637961718719;-0.00012120276369387;1.8439313862473e-05;-9.6199888503179e-05;9.5062232503551e-06;-9.5229872385971e-05;0.00012872609659098;-5.682868140866e-05;9.7866313808481e-06;5.0064696551999e-05;7.1969741838984e-05;1.4452168215939e-05;-2.2921536583453e-05;-9.6106014098041e-06;3.1740535632707e-05;-2.3206855985336e-05;-2.5840945454547e-05;-1.0914794074779e-05;-4.7775447455933e-05;4.8131885705516e-05;0.00011799120693468;3.8200621929718e-05;4.8437294026371e-05;2.5006951545947e-05;9.0060028014705e-05;-0.00014573644148186;-6.9835812610108e-05;0.00013618226512335;0.00013560440856963;0.00015365394938271;-6.7368266172707e-05;-9.0866808022838e-05;-9.128003148362e-05;-0.00013866877998225;7.5368557190814e-06;-2.342138759559e-05;-3.8919199141674e-05;-3.3492855436634e-05;-3.0356080969796e-05;-9.8816759418696e-05;-1.2528466868389e-05;-5.29769458808e-05;7.4125746323261e-05;9.9206074082758e-05;8.1306250649504e-05;0.00018719559011515;5.9155143389944e-05;0.00011342679499649;1.0082016160595e-05;6.6204250970259e-08;6.5515167079866e-05;0.00018214411102235;0.0001247158361366;0.00025789489154704;-2.2063734377298e-06;6.6375569076627e-06;-1.8868613551604e-05;-9.2543823484448e-06;-8.7440486822743e-05;-2.095197851304e-05;-4.7092613385757e-05;1.8106093193637e-05;-4.130451270612e-05;-9.6974377811421e-05;-0.00020831348956563;-0.00011751412239391;-0.00021673808805645;-0.00012240385694895;-0.00026336999144405;1.8746723071672e-05;1.9614129996626e-05;-2.9753498893115e-05;-7.3953917308245e-05;0.00010917368490482;-2.6936118047161e-06;6.574909639312e-05;0.00021140494209249;4.2706142266979e-05;6.4668223785702e-05;-9.3594690042664e-06;-4.5202563342173e-05;9.6138437584159e-06;8.1085876445286e-05;0.00024944468168542;-0.0001331491075689;3.2582567655481e-05;6.2695406086277e-05;8.168079511961e-05;0.00017823939560913;3.0048360713408e-05;-0.00012977432925254;-0.00018355890642852;6.3728894019732e-06;-0.0002409449807601;-0.0001590823958395;-1.56170954142e-05;-0.00014327562530525;-2.9739587262156e-05;-0.00012537722068373;0.00019980322394986;-7.401446782751e-05;-2.9772352718282e-05;2.0010051230201e-05;5.5620083003305e-05;4.5893219066784e-05;-3.5118358937325e-05;1.6969421267277e-05;9.6699608548079e-05;-4.5261225750437e-05;-6.3616265833843e-05;2.0274421785871e-06;-6.9521644036286e-05;4.698056000052e-05;0.00023501299438067;2.0491057512118e-05;4.4751526729669e-05;2.1882580767851e-05;0.00015924424224067;-0.00014422729145736;-6.2886021623854e-05;0.00018876799731515;0.00010604716953821;0.00017025749548338;-9.0368550445419e-05;-0.00012700035586022;-0.00010245066368952;-0.00024524476611987;2.2046304366086e-05;-2.9694321710849e-05;-1.9109238564852e-05;-1.5196390450001e-05;-2.624849548738e-05;-0.00017675815615803;2.4069913706626e-05;-7.0484435127582e-05;1.7604803360882e-05;7.2380142228212e-05;1.0209074389422e-05;0.00025918195024133;3.2843614462763e-05;0.00017413648311049;2.1541665773839e-05;-6.5835579334816e-06;3.6893743526889e-05;0.00030508727650158;8.7300832092296e-05;0.0003816272073891;-3.9445162656193e-06;1.0981706509483e-05;-4.2213650885969e-05;-8.6685409769416e-05;-0.00012264485121705;5.5460866860813e-05;-1.5325082131312e-05;0.00010035077139037;-6.0481939726742e-05;-4.5892411435489e-05;-0.00027669910923578;-8.3654165791813e-05;-0.00032099665259011;-8.5407089500222e-05;-0.00041873607551679;1.6536110706511e-05;3.3542764867889e-05;-3.0001788218215e-06;-0.00016869459068403;0.00010385903442511;2.1263516828185e-05;0.00011426523997216;0.00031252024928108;6.6777698521037e-05;9.6278388809878e-05;-1.4073270904191e-05;-6.9267138314899e-05;2.5329980417155e-05;0.00013851608673576;0.00030799815431237;-0.00011846935376525;4.8475969379069e-05;0.00011874151095981;0.00016157020581886;0.00027776786009781;4.2016599763883e-05;-0.00019829047960229;-0.00031114715966396;-2.7916632461711e-05;-0.00031867268262431;-0.00018841130076908;-6.7136628786102e-05;-0.00019599504594225;-9.0906876721419e-05;-0.0001606258447282;0.00028563485830091;-9.2481801402755e-05;-9.5926319772843e-05;6.2562380662712e-06;2.9431788789225e-05;7.3647279350553e-05;-6.9140747655183e-05;4.1220526327379e-05;0.0001794284908101;-7.3779803642537e-05;-0.00011546976020327;1.133444129664e-05;-8.7599182734266e-05;4.9566398956813e-05;0.00045208173105493;8.3372824519756e-06;3.4774191590259e-05;2.2386977434508e-05;0.00022443747729994;-0.00014799792552367;-6.851657963125e-05;0.00026111581246369;8.5194427811075e-05;0.00021308068244252;-0.00011386788537493;-0.00017913448391482;-0.00011992922372883;-0.00041301062447019;3.6502151488094e-05;-1.8749642549665e-05;-8.6435838966281e-06;-4.6094126446405e-05;-2.4161745386664e-05;-0.00024270058202092;5.9689053159673e-05;-9.4166229246184e-05;-2.6870395231526e-05;4.2097501136595e-05;-5.8614499721443e-05;0.00031527149258181;1.5285997505998e-05;0.00026077040820383;3.3697142498568e-05;-1.1102640200988e-05;1.0330464647268e-05;0.00045853451592848;5.7786139223026e-05;0.00052276137284935;-8.8383503680234e-06;-9.7316442406736e-06;-6.4621992351022e-05;-0.00016169773880392;-0.00017842816305347;0.00012271430750843;1.8842132703867e-05;0.00019008085655514;-7.857519085519e-05;4.0876639104681e-06;-0.00032379580079578;-6.0129459598102e-05;-0.00043904685298912;-6.0935759393033e-05;-0.00064052816014737;2.0763514839928e-05;8.4370338299777e-05;5.6639779359102e-05;-0.00026959041133523;3.1116447644308e-05;-1.7110827684519e-05;9.2097907327116e-05;0.0003656251647044;6.0745413065888e-05;0.00013129510625731;-3.4531012715888e-06;-7.7296237577684e-05;-1.0857954293897e-05;0.00028320398996584;0.00025466387160122;1.4255349924497e-05;4.301229637349e-05;0.00017537704843562;0.00025922092027031;0.00028032434056513;8.3987288235221e-06;-0.00022299037664197;-0.00036162999458611;-6.3164412722472e-07;-0.00030535538098775;-9.9845274235122e-05;-0.00014981599815655;-0.0001798545854399;-0.00020749471150339;-0.00013221587869339;0.00024111481616274;-7.6121767051518e-05;-0.00018282706150785;1.6939417037065e-05;-5.9269532357575e-05;7.6665375672746e-05;-0.00012262586096767;5.6680815760046e-05;0.00023154326481745;-8.9583831140772e-05;-0.0001530289882794;8.8923279690789e-06;-6.4170460973401e-05;2.6525471184868e-05;0.00078502349788323;-6.5602753238636e-06;-3.411646684981e-05;2.1212563297013e-05;0.0001724219910102;-8.6072803242132e-05;-4.4194399379194e-05;0.00028255477081984;1.1862698556797e-05;0.00021843949798495;-0.00010265367018292;-0.00021460416610353;-9.1801513917744e-05;-0.00057569000637159;3.7967336538713e-05;6.4673913584556e-05;-6.6890191874336e-07;-0.00019515847088769;-1.3403375305643e-05;-0.00015780024114065;8.0743586295284e-05;-8.2589118392207e-05;-5.69388976146e-05;-3.0124452678137e-05;-0.00012672714365181;0.00015207019168884;6.0478953400889e-07;0.000297636637697;3.760196705116e-05;-1.030263138091e-05;-3.2211592042586e-05;0.00045451437472366;8.2328392636555e-07;0.00046519163879566;-1.7856096746982e-05;-8.1593258073553e-05;-8.3272578194737e-05;-0.00020203275198583;-0.00021337890939321;0.00016174852498807;8.3170343714301e-05;0.00023589111515321;-3.2519219530514e-05;6.7607674282044e-05;-0.00010290190402884;-1.3224126632849e-05;-0.00040111722773872;-1.202169823955e-05;-0.00075445370748639;2.5232597181457e-05;0.00019042858912144;0.00013949431013316;-0.00041220537968911;-6.8858309532516e-05;-8.5196930740494e-05;4.5295473682927e-05;0.00046397690312006;6.4447100157849e-05;0.00023549271281809;1.4098833162279e-05;-9.9214405054227e-05;-6.8664936407004e-05;0.00044603738933802;0.00021920580184087;0.00026608418556862;3.701264722622e-05;0.0002845392737072;0.00042363346437924;0.0002978065458592;-7.6478732808027e-05;-0.00026516892830841;-0.00047235219972208;7.1216825745068e-05;-0.00030678659095429;1.6891039194888e-05;-0.00022850405366626;-0.00017910650058184;-0.00045625658822246;-0.00011208875366719;0.0002205875935033;-6.4286730776075e-05;-0.00035065109841526;6.4801206463017e-05;-0.00022257144155446;7.3690520366654e-05;-0.00021951003873255;9.1627014626283e-05;0.00028175953775644;-0.00011767917021643;-0.00024108943762258;5.0357202781015e-06;-4.6542929339921e-05;-1.4996287063695e-05;0.0013496897881851;-2.5459632524871e-05;-0.0001843113132054;2.6578154574963e-05;0.00014181525330059;1.2004441032332e-06;-1.3895994015911e-05;0.00035912456223741;-8.8150089140981e-05;0.00025817833375186;-0.00012002577568637;-0.00026908132713288;-5.4397482017521e-05;-0.00081189948832616;3.8108013541205e-05;0.00020492104522418;1.0876373380597e-05;-0.00039758608909324;-4.615039415512e-06;-7.5594427471515e-05;0.00010728645429481;-5.3169980674284e-05;-9.8942902695853e-05;-0.0001949113648152;-0.00022266866290011;-8.4323117334861e-05;-1.6481266357005e-05;0.00038247497286648;5.0470956921345e-05;-1.0995951924997e-05;-8.2232218119316e-05;0.00048509566113353;-6.6986227466259e-05;0.00043482217006385;-3.2535775972065e-05;-0.00018219124467578;-0.00011032215843443;-0.00031579041387886;-0.00029925198759884;0.00023290555691347;0.00022288224135991;0.00033703845110722;5.2509243687382e-05;0.00014929153257981;0.00026682796305977;3.8269743527053e-05;-0.00040559432818554;4.2764386307681e-05;-0.0010216960217804;3.6217057640897e-05;0.00035923719406128;0.00016634185158182;-0.00044329819502309;-0.00011222164175706;4.1472223529126e-05;6.1531736719189e-06;0.00058523664483801;6.7756132921204e-05;0.00027151143876836;2.847301766451e-05;-0.00010753732931335;-8.2843289419543e-05;0.00033591914689168;0.00018911602091976;0.00049963087076321;2.2254878786043e-05;0.00040517500019632;0.00043249240843579;0.00029259553411976;-0.00012231877190061;-0.00022504312801175;-0.0005724128568545;9.2233094619587e-05;-0.00028095129528083;6.6578359110281e-05;-0.00037966232048348;-0.00016015415894799;-0.0006564570358023;-0.00010381365427747;0.00034553470322862;-4.7352787078125e-05;-0.00055440800497308;0.00010399826715002;-0.00032323886989616;3.0838029488223e-05;-0.00033201172482222;0.00011784732487286;0.0003314733330626;-0.00013169873273;-0.00032439347705804;5.7492261476e-06;-3.2123356504599e-05;-4.7055233153515e-05;0.0015745252603665;-3.6941110010957e-05;-0.00027107165078633;3.1208466680255e-05;0.00018872294458561;0.00012207303370815;-3.829729030258e-05;0.00038129938184284;-0.00015770083700772;0.00027086335467175;-0.00010585877316771;-0.00024927526828833;-6.5038711909438e-06;-0.00088134070392698;2.5955647288356e-05;0.00025367940543219;1.7159698472824e-05;-0.0004145335406065;1.1581155376916e-06;-0.00010450702393427;0.00012500565208029;-5.1893832278438e-05;-0.00014730032125954;-0.00040728654130362;-0.00028006426873617;-0.00011946356971748;-4.2689509427873e-05;0.00046299092355184;4.9724942073226e-05;2.7401429179008e-06;-0.00012042629532516;0.00071796902921051;-0.00012811948545277;0.0005243796040304;-3.0584167689085e-05;-0.00027255283202976;-3.6262681533117e-05;-0.00039154960541055;-0.00035452196607366;0.00021531875245273;0.00034245173446834;0.00043969909893349;4.7491645091213e-05;0.00023442825477105;0.00026498426450416;6.8150002334733e-05;-0.00043970707338303;8.426188287558e-05;-0.0012717162026092;4.4414606236387e-05;0.0004701278230641;0.0001772508258;-0.00043355015804991;-0.00015173183055595;0.00012068537762389;-5.2305047574919e-05;0.00063078256789595;8.0637386417948e-05;0.00037082779454067;4.5312790462049e-05;-0.00011847117275465;-9.0672358055599e-05;0.00016400236927439;0.00016403335030191;0.0007947210688144;4.3169739001314e-06;0.00050339999143034;0.00043810834176838;0.00026882594102062;-0.00022101937793195;-0.00017526364536025;-0.00064484670292586;0.00014515974908136;-0.00022569164866582;0.00011328626715112;-0.00041965622222051;-0.00014233772526495;-0.00091038743266836;-9.8143638751935e-05;0.00043814387754537;-3.1390540243592e-05;-0.00074402720201761;0.00015588469977956;-0.0004352264222689;-1.3856620171282e-05;-0.00041815443546511;0.00015480045112781;0.00026695514679886;-0.00012991903349757;-0.00042980091529898;8.5506862887996e-06;-2.5587318305043e-05;-8.2309248682577e-05;0.0017283086199313;-4.2444633436389e-05;-0.0004189966712147;3.284279955551e-05;0.00026605906896293;0.00023128613247536;-5.0630627811188e-05;0.00040079694008455;-0.00021828280296177;0.00027380420942791;-0.0001301649317611;-0.00016278600378428;3.6100776924286e-05;-0.00082418782403693;9.2625969045912e-06;0.00032273787655868;2.1224121155683e-05;-0.00036424453719519;5.9538942878135e-06;-0.00016797591524664;0.00012483475438785;-1.134005105996e-05;-0.00018596281006467;-0.00063670135568827;-0.00032608071342111;-0.00023309327661991;-6.347901216941e-05;0.00051272410200909;5.5320168030448e-05;1.1388265193091e-05;-0.00013944442616776;0.00082002679118887;-0.00017905858112499;0.00056893058354035;-3.4396187402308e-05;-0.00032171502243727;1.7720059986459e-05;-0.00049823196604848;-0.00041419619810767;0.00021894324163441;0.00048386683920398;0.00053110998123884;0.00010281483264407;0.00029318165616132;0.00042714131996036;9.5600662461948e-05;-0.0004690958885476;0.00011600527795963;-0.0014672027900815;5.470919131767e-05;0.00054568063933402;0.00011075873044319;-0.00025941498461179;-0.00010655319783837;0.00018151703989133;-8.2146994827781e-05;0.00047983427066356;6.0678026784444e-05;0.00032497831853107;4.0627601265442e-05;-8.6956206359901e-05;-5.6359014706686e-05;-4.5334028982325e-05;9.9178505479358e-05;0.00074063858482987;-1.0470467714185e-05;0.00038737701834179;0.0002520629495848;0.00017280639440287;-0.00020651920931414;-6.3255203713197e-05;-0.00048870570026338;0.0001306529447902;-0.00014235397975426;8.7476902990602e-05;-0.00033484076266177;-7.7938617323525e-05;-0.00077894952846691;-6.5158455981873e-05;0.00035968190059066;-1.2248012353666e-05;-0.00061106483917683;0.00012391300697345;-0.00032956464565359;-3.3944266760955e-05;-0.00030948704807088;0.0001267665065825;0.00010414889402455;-7.8054392361082e-05;-0.00035934432526119;1.0844170901692e-05;-1.6955160390353e-05;-6.4370324253105e-05;0.0011174839455634;-2.8141232178314e-05;-0.0003586771490518;1.784097730706e-05;0.00026520769461058;0.00020771133131348;-4.6985689550638e-05;0.00026874055038206;-0.00016572102322243;0.0001708972704364;-0.00011255065328442;-1.6571173546254e-05;3.7838199204998e-05;-0.00043704587733373;-2.6845152660826e-06;0.0002299031621078;1.1218715371797e-05;-0.00013152396422811;8.9575551101007e-06;-0.00020985052105971;8.3446429925971e-05;1.0780439879454e-05;-0.00015021873696242;-0.00054365256801248;-0.00024801958352327;-0.00015588910900988;-5.9183133998886e-05;0.00036776359775104;4.0902064938564e-05;1.453731147194e-05;-0.00010293605009792;0.00062985182739794;-0.00015094592527021;0.00045557809062302;-2.5420960810152e-05;-0.00022172676108312;4.7625318984501e-05;-0.00040066539077088;-0.00030776832136326;0.00015186308883131;0.00039213959826156;0.00041623887955211;8.4000232163817e-05;0.00023276745923795;0.00029500626260415;8.1307262007613e-05;-0.00036134402034804;9.4267707027029e-05;-0.0010892328573391;4.4528023863677e-05;0.00037439988227561;0.00038574350764975;-0.00014073991042096;-3.1216211937135e-05;0.00014666201604996;-0.00048570090439171;-2.5704150175443e-05;-8.8742017396726e-05;-4.9518814194016e-05;5.9445992519613e-05;-1.0762965757749e-05;-0.00036285028909333;5.0129081500927e-05;-0.00030796657665633;-9.8133146821056e-05;-0.00031756394309923;-2.2684551368002e-05;-0.00040936100413091;-0.00022025759972166;4.277390326024e-05;0.00049553200369701;0.00016780638543423;0.00013870000839233;-5.4112911129778e-06;0.00039800637750886;-8.1605976447463e-05;0.00042923339060508;0.00010350452794228;-0.00026228546630591;6.3219478761312e-05;0.00040789725608192;3.1850890081841e-05;-0.00034884535125457;0.00010676889360184;-0.00029621479916386;-3.4122342185583e-05;0.00042586811468937;6.9380759669002e-05;-0.00016290511121042;-0.00010163144179387;-1.8526005078456e-05;-3.7503557450691e-06;0.0015443812590092;-6.506459612865e-05;-0.00012532364053186;-3.0093620807747e-05;5.9750691434601e-05;4.1554569179425e-05;0.0002062039275188;-7.6898322731722e-06;0.0002514858788345;0.00014642170572188;-0.00015770159370732;-0.00027503189630806;-2.2337933842209e-05;-0.00098977831657976;5.8134242863161e-05;0.00018066812481266;-2.4290943656524e-06;-0.00047821138286963;2.4203411157941e-05;1.3676140952157e-05;-8.8403221525368e-06;-6.8108616687823e-05;9.2023066827096e-05;-0.00042932794895023;-0.0001040820570779;-0.00023318447347265;-0.00015915872063488;0.00031777453841642;-3.2135478249984e-05;9.3019589257892e-06;3.1915209547151e-05;0.00066395039903;-8.1998645327985e-05;0.00028468162054196;-9.0703659225255e-05;-0.00024595577269793;-1.6941437934292e-05;5.7265733630629e-05;-0.00024518137797713;-0.00025869664386846;0.00027276339824311;7.2472750616726e-05;8.1200814747717e-05;0.00030257811886258;0.00032112837652676;0.00015347395674326;-0.00025280471891165;4.0957249439089e-05;-0.00099761120509356;6.4057356212288e-05;0.0004206589946989;2.9687262212974e-05;0.00040537051972933;-0.00012459895515349;0.00017606066830922;0.00010074023157358;-0.00034496327862144;-5.3470379498322e-05;-6.1110869864933e-05;-3.7272038753144e-05;4.4826709199697e-05;1.4666175957245e-05;-0.00073066650656983;4.703993909061e-05;1.8810082110576e-05;-0.00013017385208514;-0.00011791422730312;-4.7380071919179e-05;-0.0004176055372227;-0.0002453995984979;-2.6222798624076e-05;0.00036987909697928;0.00022796809207648;0.00022069686383475;3.5441007639747e-06;0.00025539589114487;-4.3073741835542e-05;0.00013764198229183;0.00012403134314809;2.7352181859897e-05;6.9098095991649e-05;8.0394616816193e-05;5.6335258705076e-05;-0.00013061976642348;1.3140525879862e-05;-0.00011407118290663;6.9258800067473e-05;0.00030900619458407;4.8060148401419e-05;-6.7420733103063e-05;-7.4197429057676e-05;-2.7029047487304e-05;-1.0622344234434e-05;0.0011489811586216;-3.4602192044986e-06;5.5509376579721e-06;-7.3563574005675e-06;-1.2409166629368e-05;3.3100885048043e-05;-3.2308103982359e-05;1.9759758288274e-05;0.00022638135123998;0.00016986236732919;-5.057920498075e-05;-0.00027923376183026;-6.5878935856745e-05;-0.00085763371316716;-4.2692070564954e-05;0.00012518088624347;1.4077101695875e-05;-0.00045864039566368;1.2234464520589e-05;5.5421885917895e-05;-1.5864097804297e-05;-6.97097639204e-05;7.5097508670297e-05;9.4623364930158e-06;-3.7747078749817e-05;-0.00017596485849936;-0.00010884718358284;0.00022821231686976;6.8443946474872e-06;-1.3447362107399e-05;3.5950037272414e-05;0.00021204561926425;-3.874452522723e-05;0.00017624258180149;-1.0829655366251e-05;-0.00012198251351947;-2.2807256755186e-05;-0.00011118856491521;-0.00011839122453239;-0.00018636962340679;5.0164657295682e-05;0.00014370764256455;7.0048517955001e-05;0.00015574855206069;0.00034061228507198;4.6192868467188e-05;-0.00022086103854235;1.0758103599073e-05;-0.00061274936888367;1.4567012840416e-05;0.00025855333660729;1.5432231521118e-05;0.00032333066337742;-8.0259291280527e-05;0.00011160445865244;5.2401966968318e-05;-0.00033679971238598;-5.8192050346406e-05;-3.9662791095907e-05;-3.356624438311e-05;4.0246319258586e-05;1.7807240510592e-05;-0.00058211531722918;2.0419196516741e-05;6.3346000388265e-05;-0.00015036937838886;-0.00010136302444153;-4.6615499741165e-05;-0.00032859729253687;-0.00023383599182125;-4.9733884225134e-05;0.00033424361026846;0.00019768158381339;0.0002342096704524;1.5397241440951e-05;0.00023860840883572;7.613685738761e-06;8.8083776063286e-05;0.00012202435027575;-3.3243555662921e-05;8.2482882135082e-05;6.381914136e-05;6.1033868405502e-05;-5.3604755521519e-05;-2.9648695090145e-06;-0.00010766468767542;7.1628484874964e-05;0.00025816226843745;4.2389376176288e-05;-5.4758958867751e-05;-6.5678570535965e-05;-3.5159089748049e-05;-8.6182490122155e-06;0.00087947264546528;9.9185008366476e-06;3.977930828114e-05;2.3283428163268e-06;2.5887284209603e-05;3.3258478651987e-05;-6.4682193624321e-05;-1.3924626728112e-05;0.0002045299479505;0.00018943233590107;-1.6495620002388e-05;-0.00023792506544851;-6.0267488152022e-05;-0.00070118717849255;-5.8056251873495e-05;7.262180588441e-05;1.0550298611633e-05;-0.00034036641591229;6.9841516960878e-06;-4.3239801925665e-06;-2.1265228497214e-05;-8.5357649368234e-05;6.6160522692371e-05;4.0662518586032e-05;-2.8521635613288e-05;-2.0042445612489e-05;-7.7170625445433e-05;0.00021460067364387;6.2441640693578e-06;-1.0330115401302e-05;3.082800321863e-05;0.00027984345797449;-2.202195355494e-05;0.00024407818273176;1.2167439308541e-05;-9.0723930043168e-05;-1.3838885024597e-05;-8.1351441622246e-05;-9.4011047622189e-05;-0.0001596114016138;1.288629573537e-05;0.00011104169971077;1.0169119377679e-05;0.00014304254727904;0.00010940116044367;2.3581336790812e-05;-0.00025052280398086;-1.0552076673775e-05;-0.00056658161338419;-5.3168164413364e-06;0.00019980853539892;1.1438783985795e-05;0.00018259353237227;-1.8123420886695e-05;7.4578012572601e-05;-3.2866132642084e-06;-0.00024975612177514;-4.3856125557795e-05;-2.272716119478e-05;-2.4460236090817e-05;3.009775900864e-05;1.5917168639135e-05;-0.0003531031543389;-5.6563030739198e-06;0.00010199220560025;-0.00015572673873976;-6.7121007305104e-05;-3.7074816646054e-05;-0.00020567086176015;-0.00017559406114742;-5.0655817176448e-05;0.0002331217401661;0.00014209709479474;0.00020194664830342;4.2690585360106e-06;0.00013371430395637;5.4611551604467e-05;3.2672302040737e-05;0.0001037360416376;-7.522103987867e-05;8.8486085587647e-05;3.0216782761272e-05;5.7983168517239e-05;2.1296806153259e-05;-2.7900998702535e-06;-8.5794257756788e-05;5.7959961850429e-05;0.00014336792810354;2.9303375413292e-05;-3.5676999686984e-05;-4.4130738388048e-05;-3.9256232412299e-05;-9.3135968199931e-06;0.00050998601363972;1.6575475456193e-05;5.0010363338515e-05;1.5574714780087e-05;5.3591720643453e-05;3.3086853363784e-05;-9.4662886112928e-05;-4.4414970034268e-05;0.00015993756824173;0.00019124985556118;2.8130802093074e-05;-0.00015919313591439;-5.6351167586399e-05;-0.000432987784734;-6.241266237339e-05;2.418591066089e-05;1.5702385098848e-06;-0.00018908860511146;-5.8258473245587e-07;-5.0932365411427e-05;-2.823947397701e-05;-7.7056349255145e-05;3.9608457882423e-05;6.3904364651535e-05;-2.0081117781956e-06;0.00010194946662523;-2.0672656319221e-05;0.00017014605691656;1.2384851288516e-05;-7.853014722059e-06;2.3247570425156e-05;0.00025914085563272;8.6159270722419e-06;0.00025423604529351;4.8969392082654e-05;-4.4525531848194e-05;-3.9717579056742e-06;-4.7113859181991e-05;-5.7730445405468e-05;-0.00011656704737106;-2.0483641492319e-05;6.0491140175145e-05;-3.4449974918971e-05;0.00010246930469293;-6.2491053540725e-05;-2.1814337742398e-05;-0.00024089904036373;-4.1529630834702e-05;-0.0004319116123952;-3.6835077480646e-05;0.00011678527516779;5.9644285101967e-06;9.5085844804998e-05;2.0420598957571e-05;7.8542208939325e-05;-3.5452234442346e-05;-0.00018596228619572;-2.2314759917208e-05;-1.3349503205973e-05;-1.3987767488288e-05;2.3383803636534e-05;1.1334969713062e-05;-0.00024236412718892;-1.2216404684295e-05;0.00013564754044637;-0.00016055928426795;-4.2890787881333e-05;-2.8207416107762e-05;-0.00013818331353832;-0.00012776916264556;-4.5044424041407e-05;0.00015588945825584;0.00010781695164042;0.00017861247761175;-2.1224104784778e-05;5.852317190147e-05;7.5021707743872e-05;-5.8273262766306e-06;8.9563909568824e-05;-8.4221042925492e-05;9.3232163635548e-05;1.2737051520162e-06;5.5225398682524e-05;6.1495658883359e-05;9.7582578746369e-06;-6.6655949922279e-05;4.4638672989095e-05;7.518648635596e-05;1.7234011465916e-05;-2.3166263417806e-05;-2.9651255317731e-05;-3.8096663047327e-05;-1.458360657125e-05;0.00031623686663806;1.9150727894157e-05;5.6313943787245e-05;2.6949732273351e-05;5.6403860071441e-05;3.6786233977182e-05;-0.00011949422332691;-6.0604721511481e-05;0.00013778734137304;0.00019325014727656;6.3638450228609e-05;-0.00011875497148139;-5.7663739426062e-05;-0.00029190559871495;-6.4075356931426e-05;4.6945624490036e-06;-6.0260190366535e-06;-0.00012342435366008;-8.3674631241593e-06;-6.121868500486e-05;-3.5836077586282e-05;-7.0475281972904e-05;1.8151560652768e-05;9.1506146418396e-05;2.7038229745813e-05;0.00014779744378757;2.6889745640801e-05;0.00014265853678808;2.5413508410566e-05;-5.9814287851623e-06;1.8217859178549e-05;0.00021827810269315;3.495524651953e-05;0.00024280403158627;8.5076455434319e-05;-2.1725152691943e-05;1.202960675073e-06;-3.0392064218177e-05;-2.5622483008192e-05;-9.4944938609842e-05;-4.7096360503929e-05;2.3116746888263e-05;-5.0281498261029e-05;6.5669264586177e-05;-0.00012816785601899;-6.4348176238127e-05;-0.00022538608754985;-7.1274080255534e-05;-0.00034299519029446;-6.7885703174397e-05;7.4310672061983e-05;3.4898034755315e-06;1.4297849702416e-05;5.6083288654918e-05;0.00010466467938386;-6.1687162087765e-05;-0.00012767869338859;1.3440312613966e-05;-7.4040262916242e-06;1.3216697425378e-06;1.8375296349404e-05;2.1941873455944e-06;-0.00016831335960887;-4.8916313062364e-06;0.00016839646559674;-0.0001670029014349;-2.3946913643158e-05;-1.5970199456206e-05;-8.7392203568015e-05;-7.3655530286487e-05;-3.3125528716482e-05;7.6806762081105e-05;7.5836513133254e-05;0.00015739207447041;-6.6230066295248e-05;-1.1051048204536e-05;8.1945407146122e-05;-3.7235098716337e-05;7.3015842644963e-05;-8.4388782852329e-05;9.8957942100242e-05;-2.3967542801984e-05;5.1212395192124e-05;8.9150365965907e-05;3.7866670027142e-05;-5.1110371714458e-05;2.4724804461584e-05;1.9754588720389e-05;2.2192230062501e-06;-1.3782218047709e-05;-1.6807094652904e-05;-3.3326163247693e-05;-2.3539205358247e-05;0.000187479541637;2.0955465515726e-05;6.1649778217543e-05;4.1562510887161e-05;4.788170917891e-05;4.3755841033999e-05;-0.00014461930550169;-7.5844676757697e-05;0.00012470940419007;0.00019937068282161;0.00010328879579902;-9.0446788817644e-05;-6.1052895034663e-05;-0.00019489059923217;-6.4581596234348e-05;-2.788205165416e-06;-1.5066425476107e-05;-9.4254261057358e-05;-2.1438252588268e-05;-5.5135318689281e-05;-4.5685996155953e-05;-6.5752436057664e-05;-7.2731168074824e-06;0.00012219618656673;6.8368142819963e-05;0.00016636130749248;8.393288590014e-05;0.00012290656741243;4.7079316573218e-05;-3.2390910291724e-06;1.3419859897112e-05;0.00017239486624021;6.6692729888018e-05;0.00022275213268586;0.00013160664821044;-1.0859973372135e-05;4.1774756027735e-06;-1.1661583812383e-05;1.5661258657929e-05;-8.3490755059756e-05;-7.9457640822511e-05;-2.4183886125684e-05;-5.6760294683045e-05;2.3182146833278e-05;-0.00015511701349169;-0.00011660236486932;-0.00020706428040285;-0.00011030867608497;-0.00027382778353058;-0.0001100517474697;5.0715054385364e-05;4.2040733205795e-06;-9.7886972071137e-05;0.00012044945469825;0.00017798130284064;-0.00010936048056465;-7.8884513641242e-05;7.8572418715339e-05;-4.3868408283743e-06;2.6718858862296e-05;1.7859876606963e-05;-1.41911141327e-05;-0.00011954051296925;1.742646600178e-05;0.00024896344984882;-0.0002143227175111;-7.8731509347563e-06;8.2240325127714e-07;-4.5486322051147e-05;-9.7809006547322e-06;-1.8988135707332e-05;-1.8033086234936e-05;4.7942172386684e-05;0.00016543647507206;-0.00015932360838633;-0.00010642913548509;9.818952094065e-05;-8.2878628745675e-05;6.3934057834558e-05;-0.00010224864672637;0.00012930636876263;-5.9350262745284e-05;5.5362193961628e-05;0.00013964429672342;0.00010152834147448;-4.4404256186681e-05;-6.4544015003776e-06;-4.3084339267807e-05;-2.1145420760149e-05;-6.4079449657584e-06;-3.407769554542e-06;-3.1889409001451e-05;-4.2555442632874e-05;9.0070541773457e-05;2.8600392397493e-05;8.4869068814442e-05;7.5523123086896e-05;4.2118390410906e-05;6.420690624509e-05;-0.00021023505541962;-0.00011334798909957;0.00013915338786319;0.00025259997346438;0.00018532945250627;-7.7387281635311e-05;-8.0034471466206e-05;-0.00013184931594878;-7.8604694863316e-05;-8.7972584879026e-06;-3.241322337999e-05;-9.6872390713543e-05;-5.2464150940068e-05;-5.2164417866152e-05;-7.0124646299519e-05;-7.7948468970135e-05;-5.0026443204843e-05;0.00019545947725419;0.0001550863526063;0.00021981375175528;0.00019267656898592;0.00013013178249821;9.551938273944e-05;6.1431796893885e-07;1.0098096936417e-05;0.00015201646601781;0.00013153642066754;0.00024348445003852;0.00023434264585376;-6.2883414102544e-06;6.0733827922377e-06;2.3701610189164e-05;9.3234652013052e-05;-9.383956057718e-05;-0.00015818669635337;-0.00011485194409033;-7.6786840509158e-05;-3.7599391362164e-05;-0.00020935737120453;-0.00022359061404131;-0.00022973341401666;-0.00019733649969567;-0.00025704092695378;-0.0002048166206805;4.2539570131339e-05;1.1074193935201e-05;-0.00014365023525897;0.00012562771735247;0.0002179390139645;-0.00012704287655652;-4.0934504795587e-05;0.00013301371654961;2.418790700176e-06;4.0954506403068e-05;1.5440798961208e-05;-2.5920024199877e-05;-8.7883498053998e-05;5.542629151023e-05;0.00029770276159979;-0.0002398385113338;2.080402964566e-06;1.5994357454474e-05;-1.5188421457424e-05;4.2848761950154e-05;-4.3776317397715e-06;-8.028322190512e-05;1.2755737770931e-05;0.0001561598473927;-0.00022297092073131;-0.00016089055861812;8.499176328769e-05;-0.00011503942369018;5.5861597502371e-05;-0.00012260605581105;0.00015355217328761;-7.6390417234506e-05;5.0248043407919e-05;0.00014541881682817;0.00014038044901099;-3.2893229217734e-05;-3.4275020880159e-05;-6.2579107179772e-05;-2.2783524400438e-05;-1.0318185559299e-05;-4.2993083297915e-06;-2.8427595680114e-05;-5.4998705309117e-05;6.0227426729398e-05;6.3386672991328e-05;9.301197133027e-05;9.315725765191e-05;3.9607926737517e-05;8.3113263826817e-05;-0.00024784085690044;-0.00014150809147395;0.0001574746274855;0.00027804402634501;0.00024390585895162;-7.3460498242639e-05;-9.4648697995581e-05;-0.00011823923705379;-0.00010993581963703;-7.5548205131781e-06;-3.9818856748752e-05;-9.7694210126065e-05;-7.4732764915098e-05;-5.042797056376e-05;-9.1291789431125e-05;-7.2376809839625e-05;-7.5689473305829e-05;0.00021062207815703;0.00019986258121207;0.00022487621754408;0.00025617555365898;0.00013018118625041;0.00013371946988627;5.034213700128e-06;7.3992409852508e-06;0.00014275542343967;0.00018855271628127;0.0002466976584401;0.00030896687530912;-7.0497467277164e-06;3.2154966902453e-06;2.7742129532271e-05;0.00011287911911495;-0.0001087340497179;-0.00017099062097259;-0.00015223384252749;-6.7963519541081e-05;-6.9609050115105e-05;-0.00022210902534425;-0.00028880807803944;-0.00023277215950657;-0.00025896480656229;-0.00024820599355735;-0.00028726269374602;4.1438968764851e-05;2.2650934624835e-05;-0.00010708884656196;4.7853918658802e-05;0.00017776957247406;-8.9813423983287e-05;6.9862794589426e-06;0.000164313998539;1.3564134860644e-05;4.3356179958209e-05;6.7630844569067e-06;-3.1292780477088e-05;-4.1189003241016e-05;9.7463649581186e-05;0.00026227306807414;-0.00019116955809295;1.1799733329099e-05;3.242523962399e-05;2.5762486984604e-05;9.2092253908049e-05;1.3481278983818e-05;-0.00010981681407429;-5.1354712923057e-05;9.3615009973291e-05;-0.00022557673219126;-0.00015685193648096;2.57381634583e-05;-0.00011802047811216;2.6003384846263e-05;-0.00011707266821759;0.00014615838881582;-6.8829926021863e-05;2.0657034838223e-05;8.6023275798652e-05;0.00012253910244908;-6.1091094494259e-07;-5.1166145567549e-05;-3.7508132663788e-05;9.9876515378128e-06;-2.2138032363728e-05;-1.8657030523173e-05;-1.6067941032816e-05;-5.3404568461701e-05;5.0804355851142e-05;0.00012857437832281;6.5632368205115e-05;7.6145566708874e-05;2.9826524041709e-05;9.0088622528128e-05;-0.00020664143085014;-0.00012151843111496;0.00015152887499426;0.00020862590463366;0.00022806976630818;-6.2931001593824e-05;-9.6485557151027e-05;-0.00010467854008311;-0.00015048008935992;2.3770076040819e-06;-3.0287639674498e-05;-6.7557775764726e-05;-7.4750212661456e-05;-3.7443795008585e-05;-9.7896176157519e-05;-3.2654523238307e-05;-7.5120922701899e-05;0.00013357533316594;0.00016461990890093;0.0001367872901028;0.0002371202717768;8.9827262854669e-05;0.00014284538337961;9.9741246231133e-06;2.5003205337271e-06;9.6104806289077e-05;0.00021381849364843;0.00017420852964278;0.00030994115513749;-7.3475034696457e-06;-3.6655105759564e-06;-4.0165744508158e-08;5.4265765356831e-05;-0.00010585941345198;-8.7881664512679e-05;-0.00011135617387481;-1.2202328434796e-05;-6.7750988819171e-05;-0.00014884836855344;-0.00026460527442396;-0.00016378008876927;-0.00025815484696068;-0.00017417728668079;-0.00031893653795123;3.1346615287475e-05;3.5446377296466e-05;-5.0338789151283e-05;-5.2389754273463e-05;0.00012314383639023;-4.4621512643062e-05;4.8377529310528e-05;0.00020775501616299;2.7417381716077e-05;5.33244892722e-05;-1.9403692022024e-06;-3.9648573874729e-05;-7.6632577474811e-06;0.00014344586816151;0.00023377790057566;-0.00013679907715414;2.3438489733962e-05;5.6894805311458e-05;7.895350427134e-05;0.00014832511078566;2.7361684260541e-05;-0.00013429594400804;-0.00013740043505095;3.4975550079253e-05;-0.0002344381500734;-0.0001432759599993;-3.63598956028e-05;-0.00012609957775567;-1.7180278518936e-05;-0.00011361201904947;0.00015314650954679;-6.5097978222184e-05;-1.9176100977347e-05;3.0643295758637e-05;8.2339953223709e-05;3.5948243748862e-05;-5.9599660744425e-05;-2.1351065697672e-06;6.9715126301162e-05;-3.9159262087196e-05;-4.4680324208457e-05;-4.3244117478025e-06;-5.4909229220357e-05;4.7698580601718e-05;0.00024379257229157;3.4320059057791e-05;5.2637751650764e-05;2.2319560230244e-05;0.00010891246347455;-0.00015800709661562;-8.5352403402794e-05;0.00016614598280285;0.0001272069348488;0.00019969878485426;-6.6863896790892e-05;-0.00011796343460446;-9.9672593933064e-05;-0.00023324690118898;1.5410592823173e-05;-1.5809229807928e-05;-3.5686996852746e-05;-7.7589189459104e-05;-2.5984822059399e-05;-0.00011580532736843;1.0193145499215e-05;-7.3934723332059e-05;5.1203485782025e-05;0.00011261615873082;3.9956306864042e-05;0.00021628684771713;4.9165941163665e-05;0.00016347937344108;1.6630601749057e-05;-2.7532037165656e-06;4.6836143155815e-05;0.00025882956106216;0.00010184515849687;0.00032911374000832;-7.3621126830403e-06;-1.2067618627043e-05;-3.2983669370878e-05;-2.7244219381828e-05;-0.00011494420323288;9.7568718047114e-06;-5.3007308451924e-05;5.9431415138533e-05;-5.9166261053178e-05;-6.7785986175295e-05;-0.00023402710212395;-9.6824049251154e-05;-0.00027481158031151;-0.00010185685823672;-0.0003838257107418;2.1910054783802e-05;5.5339809478028e-05;-1.445160592084e-06;-0.00015787812299095;8.3699436800089e-05;-3.7314181099646e-05;7.7983801020309e-05;0.00027922404115088;3.9367772842525e-05;7.5964606367052e-05;-5.2888103709847e-06;-5.379971844377e-05;-2.4149903765647e-06;0.00024478361592628;0.0002369582944084;-9.4912145868875e-05;3.4341523132753e-05;9.4891584012657e-05;0.00015795006765984;0.00021022745931987;3.2913510949584e-05;-0.00018047065532301;-0.00022813153918833;8.3900640674983e-06;-0.0002727355749812;-0.00012782352860086;-0.00010379262675997;-0.00014834431931376;-7.3385017458349e-05;-0.00011949476174777;0.00016713958757464;-6.9232068199199e-05;-6.7372107878327e-05;5.8775226534635e-06;3.976512743975e-05;6.5163614635821e-05;-8.1774800491985e-05;2.3133661670727e-05;0.00014670546806883;-6.1087070207577e-05;-7.8771023254376e-05;1.9513581719366e-06;-5.7396267948207e-05;4.5279201003723e-05;0.00046007544733584;1.5048068235046e-05;3.1757328542881e-05;2.0134444639552e-05;0.00012259310460649;-0.00013460886839312;-6.3663173932582e-05;0.00020893543842249;7.4378920544405e-05;0.00020594226953108;-7.7080127084628e-05;-0.00016629937454127;-0.00010287111217622;-0.00038721313467249;2.7521564334165e-05;1.3511292308976e-05;-1.875386442407e-05;-0.00013761690934189;-1.9178734874004e-05;-0.00012145938671893;4.5096941903466e-05;-8.278062887257e-05;2.5020435145962e-07;8.2087761256844e-05;-3.602995275287e-05;0.00018828455358744;2.7418391255196e-05;0.00021348691370804;2.4732675228734e-05;-6.6279562815907e-06;9.4030065156403e-06;0.00032496923813596;5.485789370141e-05;0.00037655493360944;-1.1694670320139e-05;-3.9180500607472e-05;-6.5099207859021e-05;-9.078141010832e-05;-0.00014936855586711;8.3402213931549e-05;-1.1394497960282e-05;0.00012610189151019;-4.9179630877916e-05;-7.5571601882984e-06;-0.00018717188504525;-5.5199161579367e-05;-0.00031822026357986;-5.7460067182546e-05;-0.00051650288514793;2.0995012164349e-05;0.00010660676343832;8.4600891568698e-05;-0.00032446277327836;1.9682220226969e-06;-0.00011608333443291;7.3891045758501e-05;0.00036827713483945;3.6749243008671e-05;0.00011913075286429;4.0362377262682e-07;-6.7774271883536e-05;-4.817185254069e-05;0.00052769167814404;0.00020621328440029;-5.5371469898091e-06;4.0318420360563e-05;0.00014191991067491;0.00030663356301375;0.00024656360619701;1.2445033462427e-05;-0.00024626779486425;-0.00030270763090812;3.2951404136838e-05;-0.00030596953001805;-3.8582402339671e-05;-0.0002170247171307;-0.0001556722127134;-0.00017237271822523;-9.9347067589406e-05;8.7285668996628e-05;-6.4454521634616e-05;-0.00012261550000403;3.1460813261219e-06;-5.1389411964919e-05;9.4541021098848e-05;-0.00011644289043033;4.4102511310484e-05;0.00025991650181822;-8.8207561930176e-05;-0.00011442181130406;-1.8860746422433e-06;-3.927172292606e-05;3.0874158255756e-05;0.00091424223501235;-4.6040913730394e-06;-1.8347227523918e-05;2.1207439203863e-05;5.7163775636582e-05;-9.9212120403536e-05;-1.689243617875e-05;0.00026596270618029;-2.3530935777671e-06;0.00021497227135114;-8.1575250078458e-05;-0.00026178214466199;-9.386042074766e-05;-0.00067856494570151;3.8573522033403e-05;0.00010914480662905;-6.2699978116143e-06;-0.00034896761644632;-9.7466781880939e-06;-2.005150054174e-05;8.0938581959344e-05;-8.3536862803157e-05;-3.6005396395922e-05;6.5312131482642e-05;-0.00012296208296902;4.6947459964031e-07;1.8440730855218e-05;0.00027083823806606;3.2965352147585e-05;-9.6399498943356e-06;-4.0186700061895e-05;0.00030689782579429;2.0986827564684e-07;0.00033918744884431;-2.4070335712167e-05;-0.00011322405043757;-0.00012657440674957;-0.00014211170491762;-0.00020453470642678;0.00016515512834303;4.0498733142158e-05;0.00017852080054581;1.5858418919379e-05;5.9169189626118e-05;6.3752646383364e-05;-6.0435259001679e-06;-0.00030535436235368;-6.1481550801545e-06;-0.00066814332967624;2.4646687961649e-05;0.00022567430278286;0.0001784705236787;-0.00050208711763844;-9.2447146016639e-05;-0.00022546027321368;6.2951716245152e-05;0.00045238219900057;4.6253760956461e-05;0.00019550454453565;1.0695020137064e-05;-9.1260211775079e-05;-0.00010646013834048;0.00077677424997091;0.0002003194676945;0.00012960378080606;4.6321205445565e-05;0.00023068086011335;0.00050194066716358;0.00028786255279556;-4.3655571062118e-05;-0.00032787540112622;-0.00040648668073118;8.0552701547276e-05;-0.00032681974698789;5.9344456531107e-05;-0.00027666761889122;-0.00018225418170914;-0.00034230819437653;-9.2139125627e-05;5.7579214626458e-05;-6.5039675973821e-05;-0.0002362758241361;4.3921103497269e-05;-0.00020661679445766;0.0001064829993993;-0.00017916466458701;7.2496106440667e-05;0.00038254426908679;-0.00012464955216274;-0.00018774057389237;-7.6867399911862e-06;-2.7100944862468e-05;-5.0322887545917e-06;0.0015355651266873;-2.5296352760051e-05;-0.00012264512770344;3.0073184461799e-05;1.2085467460565e-05;-4.6091317926766e-05;2.4641780328238e-05;0.00036486622411758;-8.5338229837362e-05;0.00024955725530162;-0.00010263398144161;-0.00037331134080887;-6.945709901629e-05;-0.0010340376757085;4.6461547754006e-05;0.00024319178191945;9.4556671683677e-06;-0.00059456948656589;-5.2672603487736e-06;7.5296877184883e-05;0.00011479439854156;-6.9062291004229e-05;-7.2667040512897e-05;-3.5666231269715e-05;-0.00021661150094587;-0.00023304129717872;1.079800313164e-05;0.00036666708183475;4.7130713937804e-05;-1.4444459338847e-05;-8.7155727669597e-05;0.00032895890763029;-5.1807895943057e-05;0.00032568632741459;-3.8877602491993e-05;-0.00020769945695065;-0.00018305116100237;-0.00024369938182645;-0.00029679195722565;0.00025381517480128;0.00015430536586791;0.00026868746499531;0.0001039962444338;0.00012845637684222;0.00040698365774006;3.6289409763413e-05;-0.00032731963437982;3.9558646676596e-05;-0.00093145307619125;3.2900057703955e-05;0.00039032089989632;0.00021739046496805;-0.00056928343838081;-0.00014178169658408;-0.00013632481568493;5.8570261899149e-05;0.00056708237389103;5.9879566833843e-05;0.00020836670591962;2.1251653379295e-05;-0.00010588931763778;-0.0001196477242047;0.00069467071443796;0.00020070554455742;0.00029372124117799;4.0808048652252e-05;0.00037426836206578;0.00056750618387014;0.00031346193281934;-7.3085670010187e-05;-0.00033268542028964;-0.00053323444444686;7.9214092693292e-05;-0.00030776005587541;9.6617382951081e-05;-0.00038440167554654;-0.00019299249106552;-0.00051358895143494;-0.00010068083065562;0.00022773674572818;-5.7956611271948e-05;-0.00045193819096312;9.2893686087336e-05;-0.00033064192393795;6.8666224251501e-05;-0.00031740413396619;9.9498873169068e-05;0.00049329595640302;-0.00015638658078387;-0.00027165419305675;-6.7207274696557e-06;-2.0867335479124e-05;-4.4361793698044e-05;0.0019069942645729;-4.1828949179035e-05;-0.00020586156460922;4.1067651181947e-05;5.2775147196371e-05;7.0968970248941e-05;-6.6463021539676e-06;0.00042300013592467;-0.00015989504754543;0.00029779429314658;-8.391901064897e-05;-0.00041273352690041;-2.0358629626571e-05;-0.0012150044785812;3.9206661313074e-05;0.00030170046375133;2.2758911654819e-05;-0.00067815242800862;-3.7268978303473e-06;6.5542291849852e-05;0.00014071857731324;-7.5396856118459e-05;-0.00012540417083073;-0.00027176414732821;-0.00028174763428979;-0.00025113759329543;-1.6614478226984e-05;0.00048178163706325;4.9528527597431e-05;-5.1184165386076e-06;-0.00012810040789191;0.0006206858670339;-0.00010864392243093;0.00043669613660313;-3.5804478102364e-05;-0.00031632120953873;-0.00011270733375568;-0.00033527327468619;-0.0003670180158224;0.0002446778526064;0.00029118536622263;0.00039363847463392;8.1357422459405e-05;0.00021691920119338;0.00040241525857709;6.1564664065372e-05;-0.00038932624738663;7.9355930211022e-05;-0.001258140662685;4.0095546864904e-05;0.00053789833327755;0.00018826554878615;-0.00046814512461424;-0.0001442284847144;-5.9036559832748e-05;2.4550219677621e-05;0.00049689970910549;5.9405701904325e-05;0.00021110533270985;2.6775391233969e-05;-9.439262066735e-05;-0.00010131657472812;0.00044909099233337;0.00015552740660496;0.00039850053144619;2.4496423066012e-05;0.00038625180604868;0.00048155180411413;0.00024785197456367;-0.00011017946962966;-0.00025071398704313;-0.00049282028339803;8.4882456576452e-05;-0.00021299711079337;0.00010436046432005;-0.00033527077175677;-0.00015438240370713;-0.00056636647786945;-8.3746250311378e-05;0.00027968309586868;-3.920984454453e-05;-0.00050639279652387;0.00011788510892075;-0.00035734701668844;2.1458461560542e-05;-0.00033830344909802;0.00010385095811216;0.00040456038550474;-0.00013604195555672;-0.0002858956286218;-4.3056247704953e-06;-1.4706412912346e-05;-6.6953187342733e-05;0.0017247177893296;-4.1190771298716e-05;-0.00025822795578279;3.9190214010887e-05;8.3948209066875e-05;0.00014130465569906;-2.00039576157e-05;0.00037060477188788;-0.00017812734586187;0.00026043117395602;-7.1927468525246e-05;-0.0003154409059789;2.0455323465285e-05;-0.0010110203875229;2.1076246412122e-05;0.00029298901790753;2.5810484657995e-05;-0.00055628025438637;-2.3752127162879e-06;2.9864750104025e-05;0.00011886402353412;-4.2898191168206e-05;-0.00013156124623492;-0.00039920836570673;-0.00025983262457885;-0.00025752049987204;-2.9536191505031e-05;0.00044460990466177;4.3133364670211e-05;1.3074377420708e-06;-0.00012035318650305;0.00063186249462888;-0.00012182375212433;0.00039848138112575;-2.8339092750684e-05;-0.00030842624255456;-4.2265211959602e-05;-0.00034559305640869;-0.00034210647572763;0.00019074550073128;0.00034308939939365;0.00039314408786595;8.2175560237374e-05;0.0002214433188783;0.00039903051219881;6.4320316596422e-05;-0.00034397354465909;8.6306572484318e-05;-0.0011951116612181;3.793001815211e-05;0.0005121054709889;0.00037859822623432;-0.00013437375309877;8.1141961345566e-06;0.00011948608153034;-0.00047452177386731;-3.6630521208281e-05;-2.7134414267493e-05;-1.8375603758614e-05;3.8917522033444e-05;1.8508549146645e-06;-0.00056209467584267;5.6172739277827e-05;-0.00013402510376181;-7.5221330916975e-05;-0.00019931542919949;-3.1744813895784e-05;-0.00035526894498616;-0.00019539210188668;-3.2065156119643e-05;0.00037862054887228;0.00017005545669235;0.00019763199088629;3.9551423469675e-06;0.00048485031584278;-7.5831274443772e-05;0.00022254216310102;8.6434549302794e-05;-0.00010122045932803;4.4262611481827e-05;0.00023071122996043;3.1011753890198e-05;-0.00021176182781346;4.8974550736602e-05;-0.00023130215413403;5.0827934501285e-06;0.00044013583101332;4.1065577534027e-05;-7.9418663517572e-05;-9.4817303761374e-05;-5.9791595958814e-06;-9.7534984888625e-06;0.0012512223329395;-3.2125764846569e-05;-2.3650954972254e-06;-2.3741342374706e-05;-1.9798037101282e-05;3.7050293030916e-05;0.0001128876756411;-1.5034651369206e-05;0.00020336752641015;0.00015043628809508;-0.00011133148655063;-0.00030422632698901;1.5050059118948e-05;-0.00092007743660361;2.2111984435469e-05;0.00011785385868279;6.220498107723e-06;-0.00047693739179522;1.8127115254174e-05;7.778983854223e-05;-8.7060452642618e-06;-9.4516479293816e-05;8.4061255620327e-05;-0.00020899092487525;-7.4473507993389e-05;-0.00012804655125365;-0.00011484509013826;0.00024267690605484;-1.1150985301356e-05;9.8227646958549e-06;1.7490501704742e-05;0.00053583830595016;-6.6816719481722e-05;0.00021594081772491;-5.8227447880199e-05;-0.00020579481497407;-1.0442220627738e-05;2.4296496121679e-05;-0.00012278123176657;-0.00018268094572704;0.00012692871678155;5.5138782045105e-05;2.8163396564196e-05;0.00019370496738702;0.00013246675371192;0.00011257222649874;-0.00017365072562825;2.305243833689e-05;-0.00074568961281329;4.3837360863108e-05;0.00033285771496594;1.9257890016888e-05;0.00050566875142977;-0.0001731109659886;0.00010320587898605;0.00013612111797556;-0.00056787044741213;-5.5876294936752e-05;-1.3109674910083e-05;-6.2691178754903e-06;3.5914548789151e-05;1.4200618352334e-05;-0.00097036885563284;8.0225217971019e-05;-2.6789528419613e-05;-8.810026338324e-05;-0.00013845584180672;-5.0955415645149e-05;-0.00044912818702869;-0.00024624401703477;-8.3645107224584e-05;0.00039664030191489;0.0002420305099804;0.00030198594322428;4.0961276681628e-06;0.00064605864463374;-9.566661901772e-05;0.00012542080366984;0.00010733128874563;6.0296228184598e-05;4.5260796468938e-05;0.00011721898772521;4.3914595153183e-05;-0.00014208962966222;1.4100721728028e-06;-0.00020970701007172;6.1426442698576e-05;0.00052182149374858;3.7708712625317e-05;-4.5304212108022e-05;-0.00010651138290996;-1.8078885659634e-06;-1.5895142496447e-05;0.0013600087258965;-1.7594618384464e-06;8.1951577158179e-05;-1.8902881492977e-05;-7.8325079812203e-05;3.8681955629727e-05;2.9074553822284e-05;-8.9180321083404e-06;0.00022779885330237;0.00019463892385829;-9.142498311121e-05;-0.00038740015588701;1.4874923181196e-05;-0.0011044427519664;-2.5933837605407e-05;0.00011437444481999;1.7888240108732e-05;-0.000602247484494;1.3280257917359e-05;0.00013575358025264;-1.0022850801761e-05;-0.00012556428555399;9.8868811619468e-05;-1.9967930711573e-05;-6.2657607486472e-05;-0.00016029465768952;-0.00011959293624386;0.00024601741461083;1.3298043086252e-05;5.9105150285177e-06;1.8788647139445e-05;0.000440994015662;-6.737737567164e-05;0.00019568555580918;-4.2073796066688e-05;-0.0002077103999909;-1.8186468878412e-05;-4.8600071750116e-05;-5.7111134083243e-05;-0.00018791270849761;1.7046797438525e-05;9.7994059615303e-05;4.2697247408796e-05;0.00014390304568224;0.00017018447397277;9.6365503850393e-05;-0.00016796987620182;1.9885635992978e-05;-0.00071748689515516;3.5894463508157e-05;0.0003400327404961;1.8939175788546e-05;0.00053797289729118;-0.00016762677114457;0.00019442470511422;0.00012442184379324;-0.00050260341959074;-7.2241215093527e-05;-2.5850709789665e-05;-2.0345873053884e-05;4.4104621338192e-05;1.849937143561e-05;-0.0010816587600857;7.2321141487919e-05;6.8254470534157e-05;-0.00012730798334815;-0.0001164511195384;-5.7882189139491e-05;-0.00049875973490998;-0.00028864361229353;-8.1789316027425e-05;0.00041604088619351;0.00028508526156656;0.00031198942451738;1.2013777450193e-05;0.00051893823547289;-7.1812042733654e-05;8.6371946963482e-05;0.00013303593732417;0.00010817715519806;6.5491483837832e-05;5.7394987379666e-05;5.8434623497305e-05;-0.00010269293852616;-1.8003283912549e-05;-0.00015714080655016;9.9023462098558e-05;0.00046733775525354;4.3349373299861e-05;-4.6622368245153e-05;-9.9725359177683e-05;-1.0987675523211e-05;-1.7938649762073e-05;0.0013895375886932;1.4319080037239e-05;8.7498869106639e-05;-9.3289991127676e-06;-8.1546008004807e-05;3.8427264371421e-05;-5.1021859690081e-05;5.6203375606856e-06;0.00025154536706395;0.00022038763563614;-6.0706635849783e-05;-0.00038554490311071;-2.9322798582143e-05;-0.0011354226153344;-6.3108403992373e-05;0.00013436637527775;2.2207022993825e-05;-0.0006345251458697;8.7133157649077e-06;0.00013546943955589;-1.4164378626447e-05;-0.0001214896037709;9.9949691502843e-05;9.8536576842889e-05;-4.4899141357746e-05;-0.0002002373803407;-0.00012387837341521;0.00025792684755288;2.2027623344911e-05;-6.3780889831833e-06;3.0164450436132e-05;0.00029433667077683;-5.6417655287078e-05;0.00018759294471238;-1.90513292182e-05;-0.00017996525275521;-2.5886000003084e-05;-0.00012505223276094;-6.2192673794925e-05;-0.00020280644821469;-1.5627492757631e-05;0.00014860428927932;6.5251173509751e-05;0.00013767670316156;0.00029408888076432;6.631703581661e-05;-0.00020486203720793;1.4293914318841e-05;-0.00069555989466608;2.191533712903e-05;0.00032713206019253;1.8489412468625e-05;0.00043029707740061;-0.00011910537432414;0.00016673817299306;7.9131983511616e-05;-0.00040305886068381;-6.6372747824062e-05;-2.0126728486503e-05;-1.9394250557525e-05;3.8315716665238e-05;1.7323647625744e-05;-0.00089545297669247;4.6889250370441e-05;9.9715311080217e-05;-0.00012769091699738;-8.4376209997572e-05;-4.9522594053997e-05;-0.00039841787656769;-0.00025277480017394;-7.6499003625941e-05;0.00034327281173319;0.00024167996889446;0.0002739324409049;1.5250931937771e-05;0.0003960172762163;-3.1391042284667e-05;4.4753403926734e-05;0.00011807086411864;8.7648928456474e-05;6.7135639255866e-05;2.2999474822427e-05;5.5010495998431e-05;-3.6142770113656e-05;-3.0692528525833e-05;-0.00011451462341938;9.8385855380911e-05;0.00034669006709009;3.6489680496743e-05;-3.5465567634674e-05;-7.7231838076841e-05;-1.4893043953634e-05;-1.4745096450497e-05;0.0010658808751032;2.4870956622181e-05;8.8151187810581e-05;5.8184917861581e-07;-5.4332856961992e-05;3.1429932278115e-05;-8.4870574937668e-05;-5.4618390095129e-06;0.00020899418450426;0.00020496614160948;-2.6323894417146e-05;-0.00030191111727618;-3.7791211070726e-05;-0.00089541909983382;-7.405984797515e-05;9.9630779004656e-05;1.8520906451158e-05;-0.00049754651263356;1.8155697034672e-06;8.9816909166984e-05;-1.4822531738901e-05;-0.00010858504538191;8.1262573075946e-05;0.00014269398525357;-2.7864738513017e-05;-0.00012219410564285;-9.3475406174548e-05;0.00021600404579658;2.1975314666633e-05;-7.9241663115681e-06;2.7218549803365e-05;0.00022103000083007;-3.7399429857032e-05;0.00018205693049822;1.2977936592051e-07;-0.00013097553164698;-2.1628307877108e-05;-0.00011951526539633;-4.0585819078842e-05;-0.00016573625907768;-4.4781918404624e-05;0.00012877736298833;3.9312180888373e-05;0.0001070563448593;0.00020069691527169;3.7110181438038e-05;-0.00019616067584138;2.347192094021e-06;-0.00056024774676189;5.9151066125196e-06;0.0002488341415301;1.4653845937573e-05;-0.00025091986753978;0.00026223642635159;0.00028327669133432;-0.00019948769477196;-5.338331538951e-05;7.9907964391168e-05;-7.086998266459e-06;4.1342384065501e-05;2.6104451535502e-05;-2.7268406483927e-05;-0.00011655449634418;-1.2786929346476e-06;0.00030399585375562;-0.0002623577893246;-5.9958970268781e-06;1.0380013918621e-05;-3.2367468520533e-05;1.1987442121608e-05;-1.8473689124221e-05;-0.0001045526805683;9.0483808889985e-05;0.00019370413792785;-0.00020976587256882;-0.00015608570538461;0.00015148590318859;-0.00011267326044617;7.320200529648e-05;-0.00010677039972506;0.00015256943879649;-7.4982570367865e-05;5.932828571531e-05;0.00024463882436976;0.00017176840628963;-0.00010899158951361;-5.5347769375658e-05;-0.0001291007938562;-7.7941665949766e-05;1.3064228369331e-05;1.7472486433689e-05;-2.9326378353289e-05;-4.6188361011446e-05;-5.6555586525064e-07;-7.5008983912994e-06;0.00013309740461409;0.00012220334610902;3.2278850994771e-05;6.2819133745506e-05;-0.00028100522467867;-0.00019848230294883;0.00010947540431516;0.00036533255479299;0.00027582515031099;-3.0423467251239e-05;-4.5067459723214e-05;-5.5102114856709e-05;-4.430819535628e-05;-2.8979728085687e-05;-5.5732252803864e-05;-0.00013739039422944;-9.8812954092864e-05;-4.5903361751698e-05;-7.1805341576692e-05;-0.00012535054702312;-8.9708992163651e-05;0.00032102459226735;0.00025391645613126;0.00031642883550376;0.00029349784017541;0.00016087084077299;0.00013658218085766;1.31041917939e-06;9.9793187473551e-06;0.0001750892988639;0.00017062562983483;0.00028160170768388;0.00029266273486428;-1.8077615095535e-05;-5.2794816838286e-06;0.0001253436494153;0.00028176611522213;-9.7682321211323e-05;-0.00036210389225744;-0.00028564487001859;-0.00014479058154393;-0.00012098268780392;-0.00028573020244949;-0.00030735967447981;-0.00026846423861571;-0.00024789766757749;-0.00029142075800337;-0.00026003495440818;6.1285769334063e-05;2.8543177904794e-05;-0.00027350676828064;0.00025615835329518;0.00030970713123679;-0.00020739280444104;-3.028211358469e-05;0.00012208886619192;-4.0224913391285e-06;4.8553545639152e-05;2.4943239623099e-05;-3.4066040825564e-05;-9.3229973572306e-05;3.5551613109419e-05;0.00034029918606393;-0.00028428944642656;-1.162231114904e-06;1.8765980712487e-05;-1.6583311662544e-05;4.5028176828055e-05;-6.9645057010348e-06;-0.00013968267012388;6.6158609115519e-05;0.00018969846132677;-0.00025569461286068;-0.00019843911286443;0.00013434472202789;-0.00013254348596092;7.1915121225175e-05;-0.00012730454909615;0.00016820259043016;-8.5233012214303e-05;5.8981517213397e-05;0.00023561496345792;0.000204578100238;-9.2778522230219e-05;-7.6442513091024e-05;-0.00013283101725392;-7.8126788139343e-05;7.5149564509047e-06;1.6056224922067e-05;-2.8965125238756e-05;-5.4871525208e-05;-1.4015740816831e-06;1.633800638956e-05;0.00013745397154707;0.00013371839304455;3.4577267797431e-05;7.5539697718341e-05;-0.00030805642018095;-0.00021544976334553;0.00012905411131214;0.00037917381268926;0.00031885306816548;-3.445985930739e-05;-6.0031507018721e-05;-6.4715488406364e-05;-6.6587264882401e-05;-2.6779383915709e-05;-5.9704085288104e-05;-0.00013794680126011;-0.00011475302017061;-4.8995429096976e-05;-8.5576481069438e-05;-0.00011922494013561;-0.00010669603943825;0.0003231982991565;0.00028649272280745;0.00031994804157875;0.00033322218223475;0.00016446098743472;0.00016169814625755;3.7008599065302e-06;9.2246691565379e-06;0.00017481172108091;0.00020930725440849;0.0002908302412834;0.00034513181890361;-1.7404097889084e-05;-7.7936238085385e-06;0.00011994309898;0.00028314435621724;-0.00011122714931844;-0.00035639587440528;-0.00030417274683714;-0.00013734374078922;-0.00013545139518101;-0.0002942358260043;-0.00035271837259643;-0.00027738069184124;-0.0002901564585045;-0.00029479150543921;-0.00031757517717779;6.0682970797643e-05;3.6770303267986e-05;-0.0001594713103259;0.00011732579150703;0.00020653687533922;-0.00012581361806951;1.5843684195715e-06;0.00012723596591968;4.2625815694919e-06;3.5645247407956e-05;1.2442712431948e-05;-2.7596521249507e-05;-4.5964894525241e-05;7.6196105510462e-05;0.000246449111728;-0.00019440446340013;4.8341898946092e-06;2.2675569198327e-05;9.4405349955196e-06;6.5228843595833e-05;8.4825260273647e-06;-0.00011626123159658;3.463054099484e-06;0.00010805872443598;-0.00020452092576306;-0.00015266951231752;4.9254012992606e-05;-0.00010460254998179;4.1160550608765e-05;-0.0001025770616252;0.00012416105892044;-6.1482875025831e-05;3.092714905506e-05;0.00012002077710349;0.00014699768507853;-3.370430204086e-05;-6.7112348915543e-05;-7.0871064963285e-05;-3.2493964681635e-05;-8.030606295506e-06;-3.496341207665e-07;-1.6786607375252e-05;-4.3284668208798e-05;2.3588912881678e-05;6.5113097662106e-05;8.2808357547037e-05;8.8487737230025e-05;2.4777140424703e-05;6.4420324633829e-05;-0.00021649367408827;-0.00015146599616855;0.00011099204130005;0.00024397175002377;0.00024231961288024;-3.1980114727048e-05;-5.9170783060836e-05;-7.1706155722495e-05;-8.9344212028664e-05;-8.7013622760423e-06;-3.5994904465042e-05;-8.4285435150377e-05;-8.7051535956562e-05;-3.364696749486e-05;-7.1023125201464e-05;-5.6628377933521e-05;-7.7579541539308e-05;0.00017979746917263;0.0001932141603902;0.00017797046166379;0.00023411885194946;0.00010196049697697;0.00012885633623227;5.8667155826697e-06;4.752735094371e-06;0.00010788423242047;0.00017897426732816;0.00018402079876978;0.0002713167341426;-1.1549439477676e-05;-9.6928069979185e-06;4.3340944102965e-05;0.00014057058433536;-8.9508677774575e-05;-0.00017448737344239;-0.00017512938939035;-5.8422916481504e-05;-8.676758443471e-05;-0.00017505622236058;-0.0002565591421444;-0.00017374072922394;-0.00022474308207165;-0.00018690775323194;-0.00026949294260703;3.8245620089583e-05;3.5375538573135e-05;0.00012236164184287;-0.0004270831705071;-1.9182993128197e-05;-0.00022210823954083;7.9498589911964e-05;0.00041361129842699;1.5763900591992e-05;0.00010673161887098;1.4767809375371e-07;-6.3981868152041e-05;-8.3836297562812e-05;0.00087604089640081;0.00017944486171473;-6.4718049543444e-05;4.6035915147513e-05;0.00010026770178229;0.00038019189378247;0.00025540398200974;3.9125261537265e-05;-0.00030546242487617;-0.00027384821441956;4.990260276827e-05;-0.00035661767469719;8.201747732528e-06;-0.00033311807783321;-0.00015030888607726;-0.0001129883385147;-7.6234413427301e-05;-8.2128615758847e-05;-6.1501035816036e-05;-3.9611331885681e-05;-3.6864690628136e-05;-1.549126682221e-05;0.00013943199883215;-9.4440998509526e-05;3.3011718187481e-05;0.00033136593992822;-9.3964772531763e-05;-7.5621508585755e-05;-1.0563367141003e-05;-1.7842274246505e-05;5.2598428737838e-05;0.0010835983557627;-3.4928086733998e-06;3.2368410757044e-05;1.7960517652682e-05;-5.2063169277972e-05;-0.00014564800949302;1.7089138054871e-05;0.00026746161165647;-7.6644864748232e-06;0.00021599720639642;-6.9443747634068e-05;-0.00033801124664024;-0.00012098038132535;-0.00086180155631155;4.9384307203582e-05;0.00014356065366883;-1.3968374332762e-05;-0.00052696990314871;-3.7452825836226e-06;0.00010474963346496;9.6435789600946e-05;-0.00010606082651066;-2.1469215425896e-05;0.00023603957379237;-0.00013986146950629;-0.00012936703569721;3.8920898077777e-05;0.00026221954612993;3.113449565717e-05;-1.0342457244406e-05;-5.6586894061184e-05;0.00016804816550575;-3.5122823192069e-06;0.00025508436374366;-3.4405496990075e-05;-0.00014311203267425;-0.00020134712394793;-7.3243987571914e-05;-0.00020761211635545;0.00019981007790193;-4.3405849282863e-05;0.00012526853242889;5.9667716413969e-05;5.9330985095585e-05;0.00019555157632567;7.7930781117175e-06;-0.00024159913300537;3.3874291602842e-06;-0.00061391608323902;2.5658295271569e-05;0.00026149145560339;0.00019466155208647;-0.00054676446598023;-8.9512475824449e-05;-0.00028834873228334;6.8888606620021e-05;0.0004765555204358;1.8212638678961e-05;0.00014686580107082;3.3631940823398e-06;-7.4298382969573e-05;-0.00013001852494199;0.0010551983723417;0.00016905744269025;7.6621436164714e-06;5.3324052714743e-05;0.00013978058996145;0.00050091871526092;0.00027262265211903;1.2152003364463e-05;-0.0003497295838315;-0.000327569025103;8.1041915109381e-05;-0.00037568350671791;8.2491009379737e-05;-0.00039880597614683;-0.00016559123469051;-0.00019911317212973;-6.6073480411433e-05;-0.00011968750186497;-6.297307118075e-05;-8.8627086370252e-05;-7.362009910139e-06;-0.00012336693180259;0.00014249709784053;-0.0001180116814794;4.7236037062248e-05;0.0004450237902347;-0.00011795361206168;-0.00011069142055931;-1.5641791833332e-05;-9.6320891316282e-06;2.6262618121109e-05;0.0014688688097522;-2.006650538533e-05;-1.5655634342693e-05;2.5406241547898e-05;-8.8002423581202e-05;-0.00010631485201884;5.418419095804e-05;0.00032873349846341;-6.1786544392817e-05;0.00021597008162644;-7.8123332059477e-05;-0.00042979838326573;-9.9158962257206e-05;-0.0011124899610877;5.5031137890182e-05;0.00021750708401669;5.3368182761915e-07;-0.00068067276151851;-2.4028186089708e-06;0.00016987745766528;0.00011817907943623;-9.8237702331971e-05;-4.5696167944698e-05;0.0001746924535837;-0.00019505646196194;-0.00027453585062176;3.581848795875e-05;0.00031393428798765;3.8141097320477e-05;-1.2462479389796e-05;-8.6044274212327e-05;0.0001830569235608;-3.3743228414096e-05;0.0002416193310637;-4.1716273699421e-05;-0.00019889570830856;-0.00023570407938678;-0.00013276297249831;-0.0002606829511933;0.0002552876539994;2.5290462872363e-05;0.00017417139315512;0.00011830620496767;0.00010166727588512;0.00039072270737961;3.2183867006097e-05;-0.00024594549904577;3.1588093406754e-05;-0.00075713312253356;2.853666410374e-05;0.00035542077966966;0.00020226309425198;-0.00053076428594068;-0.00011466780415503;-0.00014656594430562;6.2676066590939e-05;0.0005500796250999;2.3510787286796e-05;0.0001178444508696;7.5924062912236e-06;-7.3736984631978e-05;-0.00012228022387717;0.00084275822155178;0.00015225764946081;0.00012296270870138;4.573205660563e-05;0.0002372897870373;0.00047847395762801;0.00026549812173471;1.0524338904361e-05;-0.00030532540404238;-0.00039848886081018;5.8441193687031e-05;-0.00033690672717057;9.5368814072572e-05;-0.00048454385250807;-0.00015536799037363;-0.000289657356916;-6.7494693212211e-05;5.5043645261321e-05;-5.1726732635871e-05;-0.00025078997714445;3.0297567718662e-05;-0.00019730972417165;8.980838174466e-05;-0.00023309655080084;5.9070840507047e-05;0.00051005947170779;-0.00013446297089104;-0.00014995878154878;-1.1533450560819e-05;-7.161489520513e-06;-7.5207517511444e-06;0.0015515200793743;-3.2920885132626e-05;-5.4511838243343e-05;3.3235381124541e-05;-3.7327641621232e-05;8.4842386058881e-06;8.051029908529e-06;0.00033204475766979;-0.00011297524179099;0.00023831105499994;-3.6414854548639e-05;-0.00042597041465342;-4.4422264181776e-05;-0.0011180569417775;4.282364534447e-05;0.00020912969193887;1.3498676707968e-05;-0.00064979336457327;-2.6350051030022e-06;0.00012973736738786;0.00012669987336267;-0.00010346483031753;-8.6979584011715e-05;-5.3287440096028e-05;-0.00021722968085669;-0.00018055994587485;5.195259291213e-06;0.00037190009607002;3.2331750844605e-05;-9.7938254839391e-07;-0.00010838560410775;0.00047030043788254;-7.3202056228183e-05;0.00033184909261763;-2.9018765417277e-05;-0.00026396388420835;-0.00012625938688871;-0.0001822640770115;-0.00027528201462701;0.00019900177721865;0.00012630752462428;0.00025818115682341;4.802330295206e-05;0.00016369794320781;0.00022956606699154;4.2996420233976e-05;-0.00027625961229205;5.7368069974473e-05;-0.00094057677779347;2.9043509130133e-05;0.00042525079334155;0.00014862895477563;-0.00037891516694799;-9.708380093798e-05;-4.0541643102188e-05;3.7241599784466e-05;0.00042970414506271;2.7320185836288e-05;9.7866890428122e-05;1.1866848581121e-05;-6.0925165598746e-05;-8.3260107203387e-05;0.00047336265561171;0.0001131857643486;0.00018705501861405;2.6745938157546e-05;0.00024829461472109;0.0003504415799398;0.00019568705465645;-1.759849692462e-05;-0.00020305944781285;-0.00034774400410242;4.1731884266483e-05;-0.00021578124142252;7.3479546699673e-05;-0.00035779958125204;-0.00011387079575798;-0.00030938017880544;-5.6740336731309e-05;0.00015553302364424;-3.306774306111e-05;-0.00030237797182053;5.6453613069607e-05;-0.00020850592409261;3.4178912756033e-05;-0.00023937570222188;5.7817116612568e-05;0.00038567325100303;-0.00010824348282767;-0.00015487222117372;-6.3622051129641e-06;-6.5669819377945e-06;-3.1014104024507e-05;0.0012453368399292;-3.0742638045922e-05;-9.8053315014113e-05;3.0023167710169e-05;1.2264604265511e-05;7.3890922067221e-05;-1.6000340110622e-05;0.0002626616624184;-0.00011669701780193;0.00019551135483198;-2.0693856640719e-05;-0.00030093427631073;7.3764532260157e-08;-0.00082889356417581;2.3050097297528e-05;0.00017538956308272;1.7065203792299e-05;-0.00046657066559419;-2.6154802981182e-06;6.6751665144693e-05;9.7746786195785e-05;-7.0055728428997e-05;-8.8908680481836e-05;-0.00019324029562995;-0.00017961367848329;-0.00011268351227045;-1.4702901353303e-05;0.00032083515543491;2.4765857233433e-05;3.6423937217478e-06;-9.2440110165626e-05;0.00049861898878589;-7.7994147432037e-05;0.00030139289447106;-1.6625435819151e-05;-0.00023412053997163;-3.7724443245679e-05;-0.00019152915047016;-0.00022799837461207;0.00012597284512594;0.0001799728925107;0.00025645748246461;1.3429771570372e-05;0.00015741243259981;0.00014382167137228;3.8707163184881e-05;-0.00023752958804835;5.7435328926658e-05;-0.00083656865172088;2.3917162252474e-05;0.00036760643706657;0.00053218059474602;-0.00020321362535469;0.00025773176457733;0.00015474219981115;-0.00049543048953637;-2.6976458684658e-05;-3.6065106542083e-05;2.3309637981583e-05;9.6845751613728e-06;2.4924160243245e-05;-0.0013234231155366;0.00012154702562839;3.6586410715245e-05;-2.7202080673305e-05;4.0445283957524e-05;-5.8525034546619e-05;-0.00044772517867386;-0.00018235080642626;-8.5579966253135e-05;0.00022935080050956;0.00024544625193812;0.00032575876684859;-4.7872410505079e-05;0.00070618133759126;-0.00015596215962432;-8.9773657236947e-06;7.8989287430886e-05;0.00040498093585484;-1.5787649090271e-06;-0.00012671521108132;3.5738710721489e-05;-5.9575169871096e-05;-4.4192416680744e-05;-5.9910544223385e-05;0.00010172541078646;0.00047623837599531;1.9983448510175e-05;1.239077118953e-05;-7.5549818575382e-05;1.553899346618e-05;-2.208383193647e-05;0.0010868274839595;2.6914858608507e-05;0.00013881339691579;-1.2986492947675e-05;-0.00015703725512139;2.3292725018109e-05;-6.1280421505217e-05;5.9812184190378e-05;0.00017488864250481;0.00010037645552075;-5.3688880143454e-05;-0.00037276191869751;-6.0924012359465e-06;-0.0010006834054366;-6.179803312989e-05;9.6540476079099e-05;2.7697969926521e-05;-0.00057551998179406;5.8191271818941e-06;0.00019900254847016;-2.7021631012758e-06;-8.7539294327144e-05;7.7004369813949e-05;0.0002508215548005;-2.3433565729647e-05;-0.00034088824759237;-8.8900793343782e-05;0.00012545770732686;6.0805628891103e-05;-1.651513230172e-06;1.4196953088685e-05;-2.450469219184e-05;-4.7267007175833e-05;-4.0252612052427e-06;-1.6701884305803e-05;-0.00012923091708217;-3.2486714189872e-05;-0.00015765852003824;6.3991516071837e-05;-0.00014016852946952;-0.00014214839029592;0.00014535538502969;0.00015301705570891;-1.8445394744049e-05;0.00040649154107086;4.2501022107899e-05;-3.1798626878299e-05;2.1913654563832e-05;-0.00033205357613042;2.2375263142749e-05;0.00022051703126635;1.4454257325269e-05;-0.00045117299305275;0.00045998158748262;0.00039603569894098;-0.00030730254366063;-2.2521964638145e-05;5.1032653573202e-05;-1.5818599422346e-05;5.5536944273626e-05;3.6804449337069e-05;-3.8817110180389e-05;-9.031545050675e-05;-6.1423437728081e-05;0.00033917956170626;-0.00030097179114819;-6.6907568907482e-06;1.6440564650111e-05;-2.1522697352339e-05;2.0831130314036e-05;-2.2037787857698e-05;-0.00019125528342556;0.00015377497766167;0.00022179423831403;-0.00023951202456374;-0.00021264002134558;0.00023520700051449;-0.00013008204405196;8.1543155829422e-05;-0.00010437038872624;0.00016958593914751;-8.5227795352694e-05;6.3934799982235e-05;0.00037765453453176;0.0002461870899424;-0.00019927124958485;-0.00011143943993375;-0.00023290092940442;-0.000148781153257;4.2846473661484e-05;4.8463953135069e-05;-2.79248397419e-05;-4.5158536522649e-05;-0.00013165055133868;-8.135841198964e-05;0.00018622174684424;0.00017126205784734;2.433918780298e-05;5.3950971050654e-05;-0.00033640777110122;-0.00027709663845599;5.6196713558165e-05;0.00047631998313591;0.0003493528929539;3.0781448003836e-05;5.060283911007e-06;6.6483946284279e-05;2.9012044251431e-05;-6.143390055513e-05;-8.6308900790755e-05;-0.00017424950783607;-0.0001420269254595;-4.224350414006e-05;-6.5881060436368e-05;-0.00019138208881486;-0.0001331076346105;0.00047206450835802;0.00035810333793052;0.00045098760165274;0.00040616057231091;0.00019607819558587;0.00017133771325462;-3.3912928643076e-07;1.0096267942572e-05;0.00020486077119131;0.00019498103938531;0.00032179555273615;0.00032952436595224;-2.7579764719121e-05;-1.5512343452428e-05;0.00028623751131818;0.00054045318393037;-9.0078916400671e-05;-0.00064873578958213;-0.00051657221047208;-0.00024324934929609;-0.0002237391017843;-0.00037675217026845;-0.00038330460665748;-0.00031528205727227;-0.00028580747311935;-0.00032596653909422;-0.00028841590392403;7.97578250058e-05;4.3386593461037e-05;-0.00046125130029395;0.00044819296454079;0.00040488145896234;-0.00030401960248128;-1.6369754121115e-06;7.6410637120716e-05;-1.5378902389784e-05;5.7264696806669e-05;3.552644921001e-05;-4.161707329331e-05;-6.0727146774298e-05;-3.2213847589446e-05;0.00034873094409704;-0.00030386800062843;-4.8052152124001e-06;1.977773172257e-05;-1.2743376828439e-05;4.1594452341087e-05;-1.1649173757178e-05;-0.00021037322585471;0.00013696134556085;0.00020944529387634;-0.00026187676121481;-0.00024258739722427;0.00021233443112578;-0.00013532632146962;7.9585362982471e-05;-0.00011567599722184;0.00016866101941559;-8.6933716374915e-05;6.3317325839307e-05;0.00035263391328044;0.00027190640685149;-0.00017912613111548;-0.00013023200153839;-0.00022707390598953;-0.00015223823720589;3.9015169022605e-05;4.9103546189144e-05;-2.6792487915372e-05;-4.8236273869406e-05;-0.00012635109305847;-7.6731412264053e-05;0.00018383593123872;0.00017428871069569;2.5033286874532e-05;5.7172070228262e-05;-0.00034097605384886;-0.00027945786132477;6.2005579820834e-05;0.0004653521173168;0.00036926550092176;2.9514940251829e-05;-1.9999782807645e-07;5.725691880798e-05;2.8081607524655e-05;-5.9273254009895e-05;-8.7271691882052e-05;-0.00016936898464337;-0.0001490578870289;-4.3000782170566e-05;-6.907765782671e-05;-0.00018201106286142;-0.00014230464876164;0.00045696264714934;0.0003756168007385;0.00044244501623325;0.00042012392077595;0.00019286858150735;0.00018020592688117;4.1852425169964e-07;9.7821102826856e-06;0.00019846741633955;0.00020972038328182;0.00031628631404601;0.00034907009103335;-2.5742379875737e-05;-1.7614098396734e-05;0.00028107370599173;0.00053477106848732;-9.3592367193196e-05;-0.0006309894961305;-0.00052517774747685;-0.00023636815603822;-0.00022802043531556;-0.00036981262383051;-0.00040116533637047;-0.00031116811442189;-0.00030030359630473;-0.00031672485056333;-0.00031088304240257;7.6601667387877e-05;4.7463803639403e-05;0.00011472836922621;-0.00040245548007078;-1.7837795894593e-05;-0.00024065829347819;6.7196000600234e-05;0.0003879961441271;-9.0011832298842e-07;8.984497981146e-05;-1.6835335827636e-06;-4.9758644308895e-05;-8.749560220167e-05;0.00093104317784309;0.00013923188089393;-8.1455640611239e-05;4.3144675146323e-05;4.5904384023743e-05;0.00034725040313788;0.00021800269314554;5.0299011491006e-05;-0.00028621926321648;-0.00020555773517117;5.6766308262013e-05;-0.00034482686896808;2.5212890250259e-05;-0.000366133346688;-0.00012280426744837;-5.8212914154865e-05;-5.2092080295552e-05;-0.00017617947014514;-5.2010211220477e-05;2.966037754959e-05;-5.8613852161216e-05;2.7170321118319e-05;0.00014376723265741;-7.0668676926289e-05;2.1252692022244e-05;0.00030298632918857;-7.9075107350945e-05;-3.6155870475341e-05;-1.2623860129679e-05;-6.8074682531005e-06;6.21603030595e-05;0.00094561779405922;1.1362101304258e-06;6.2492006691173e-05;1.2480631085054e-05;-9.4742048531771e-05;-0.00015556406287942;2.717730239965e-05;0.00022009806707501;-1.1823575505332e-06;0.00018758740043268;-5.2827690524282e-05;-0.00031647813739255;-0.00012350121687632;-0.00078579213004559;4.6597837354057e-05;0.00012578298628796;-1.9047794921789e-05;-0.00051481265109032;-4.9677424840411e-07;0.00014208260108717;8.6012703832239e-05;-0.000103289828985;-6.0345128076733e-06;0.0003061406314373;-0.00011656485730782;-0.0001586436846992;4.8002439143602e-05;0.00020889900042675;2.4287381165777e-05;-8.1075986599899e-06;-5.0677204853855e-05;6.3705505453981e-05;1.2671862350544e-06;0.00017808671691455;-3.4246353607159e-05;-0.00012620165944099;-0.00020415367907844;-1.0446185115143e-05;-0.00017266096256208;0.00017916773504112;-0.00010297890548827;6.5079177147709e-05;7.1302507421933e-05;4.2017309169751e-05;0.00020863740064669;8.3344311860856e-06;-0.00017307330563199;1.8651322761798e-06;-0.00047133045154624;2.2551486836164e-05;0.00022305248421617;0.00017941190162674;-0.0005102104623802;-7.3556700954214e-05;-0.00030991781386547;6.1494691180997e-05;0.00044952394091524;-5.2346354095789e-06;0.0001117133142543;-3.1961951663106e-06;-5.2826057071798e-05;-0.00013160024536774;0.0011481288820505;0.00012797517410945;-6.062738611945e-05;5.3434912842931e-05;4.4333311961964e-05;0.00044352031545714;0.00022995490871836;4.5685119403061e-05;-0.00032798788743094;-0.00022670520411339;8.181620069081e-05;-0.00038174714427441;8.9059147285298e-05;-0.00045553161180578;-0.00013502383080777;-8.2492420915514e-05;-3.9512582588941e-05;-0.0002550613717176;-5.5299555242527e-05;4.0479302697349e-05;-4.8682450142223e-05;-3.5430333809927e-05;0.00015624219668098;-6.4912121160887e-05;2.5394259864697e-05;0.00041496832272969;-9.651110303821e-05;-4.3034553527832e-05;-1.7930258763954e-05;1.1204648444618e-06;5.1131632062607e-05;0.0012129750102758;-1.0936410035356e-05;5.9110672737006e-05;1.7236139683519e-05;-0.00013898662291467;-0.00014542049029842;6.4710846345406e-05;0.00026141063426621;-3.1973093427951e-05;0.0001743351604091;-5.6380707974313e-05;-0.00040565058588982;-0.00011685286881402;-0.0010013398714364;5.4698386520613e-05;0.00016762329323683;-8.9080276666209e-06;-0.00064200104679912;3.1611037343282e-07;0.00020367742399685;0.0001031228894135;-0.00010299358837074;-1.809071363823e-05;0.0003159397165291;-0.00015278950741049;-0.00027505747857504;5.3724885219708e-05;0.00023204099852592;2.7922244044021e-05;-9.5700597739778e-06;-7.0138703449629e-05;3.5017510526814e-05;-1.39544290505e-05;0.0001526944397483;-4.0939703467302e-05;-0.00015857809921727;-0.00024832243798301;-3.0670387786813e-05;-0.00020500841492321;0.00022907719539944;-8.6481697508134e-05;7.6456191891339e-05;0.00012463008170016;6.4042513258755e-05;0.00034837765269913;2.4346129066544e-05;-0.000161528296303;1.858104042185e-05;-0.00053176609799266;2.3513719497714e-05;0.00027640245389193;0.00020923612464685;-0.00050616369117051;-0.00011843903484987;-0.00030470394995064;4.139081647736e-05;0.00042164692422375;-9.8299451565254e-06;0.00010234238288831;-5.3452399697562e-06;-4.141137105762e-05;-0.00015180995978881;0.0011130635393783;8.5296553152148e-05;-2.5951325369533e-05;5.3353829571279e-05;2.9528338927776e-05;0.00044181855628267;0.00018552043184172;3.5078577639069e-05;-0.00029460366931744;-0.00019254346261732;8.8837688963395e-05;-0.00033523258753121;0.00014058337546885;-0.0004681775753852;-0.00011751925921999;-8.1475685874466e-05;-1.6111043805722e-05;-0.00027613702695817;-4.6124110667733e-05;4.3881860619877e-05;-1.8796223230311e-05;-0.0001013524379232;0.00012427970068529;-4.0463939512847e-05;1.8069551515509e-05;0.00046651723096147;-9.3928967544343e-05;-3.8705700717401e-05;-1.9878680177499e-05;1.0096868209075e-05;2.1663850930054e-05;0.0012149085523561;-2.2407382857637e-05;5.4453365009977e-05;1.9431523469393e-05;-0.00014970019401517;-9.5432274974883e-05;8.8024302385747e-05;0.00024420843692496;-5.2540108299581e-05;0.00010940059291897;-4.0630831790622e-05;-0.00041617720853537;-7.3845898441505e-05;-0.001017929171212;5.0412309064995e-05;0.00016233694623224;5.5300515668932e-06;-0.00062332552624866;2.9084063157825e-07;0.00021549046505243;9.7158248536289e-05;-8.106973109534e-05;-2.6760537366499e-05;0.00024926557671279;-0.00015299591177609;-0.00032757539884187;4.949483263772e-05;0.00020234978001099;2.3840335416025e-05;-7.0871169555176e-06;-7.3905699537136e-05;1.2830366358685e-05;-2.5833329345915e-05;9.7665804787539e-05;-3.7974994484102e-05;-0.00015778187662363;-0.00022978463675827;-3.7578534829663e-05;-0.00019208673620597;0.00022264773724601;-5.5411368521163e-05;6.7075627157465e-05;0.00015135838475544;7.3008428444155e-05;0.00039287726394832;3.3635671570664e-05;-0.00011100195115432;3.0380693715415e-05;-0.00047268110211007;1.9291172066005e-05;0.00026664897450246;0.00050767452921718;-0.00018666331015993;0.00023297427105717;0.00013050640700385;-0.00054885231656954;-1.5659339624108e-05;-3.8508347643074e-05;4.2897787352558e-05;-2.0222444163664e-06;2.859314372472e-05;-0.0013960794312879;0.00011767103569582;2.0197116100462e-05;-7.2415296017425e-06;9.8869160865434e-05;-5.7949404435931e-05;-0.00039080093847588;-0.00016718874394428;-0.00010787268547574;0.00018367286247667;0.00022649721358903;0.00037661407259293;-5.9879967011511e-05;0.00083009578520432;-0.000148669059854;-4.6647430281155e-05;5.8336376241641e-05;0.0004949644790031;-1.4541485143127e-05;-0.00019177133799531;3.078326699324e-05;6.539295281982e-05;-0.00010456536983838;-7.8288008808158e-05;0.0001386379590258;0.00037398125277832;2.4326691345777e-05;3.9025322621455e-05;-6.1904058384243e-05;1.6163081454579e-05;-1.6797437638161e-05;0.00078665936598554;6.7324384872336e-05;0.00016302427684423;7.6168640816832e-07;-0.00015396691742353;1.1948037354159e-05;-0.00010840689355973;3.1584771932103e-05;0.0001284518657485;0.00013943259546068;-3.6524368624669e-05;-0.00030892415088601;3.0638548196293e-06;-0.00078250619117171;-0.00010884588118643;5.5768017773516e-05;2.856225182768e-05;-0.00048735138261691;-9.0279536379967e-06;0.00018131376418751;1.6864577219167e-06;-0.0001006715465337;7.2576753154863e-05;0.0003680122026708;-1.6458645404782e-05;-0.0002655784774106;-7.0922411396168e-05;8.5388070147019e-05;7.2251314122695e-05;1.446399210181e-06;7.2490383900004e-06;-8.3827246271539e-05;-4.0838021959644e-05;-1.248156058864e-05;-1.1189985343663e-05;-0.00010076599573949;-3.3006668672897e-05;-0.00015924150648061;0.00014432266470976;-0.00010402057523606;-0.00025329436175525;0.00013484674855135;0.00012588176468853;-7.9629877291154e-05;0.00029743771301582;3.1029157980811e-05;-7.5735329119198e-06;2.0313731511123e-05;-0.00021445527090691;1.6475803931826e-05;0.00016266114835162;1.4063182788959e-05;0.0004169660678599;-0.00010330993245589;0.00013878186291549;4.7022254875628e-05;-0.00060518557438627;-3.4763383155223e-05;-2.5750932763913e-05;4.9590245907893e-05;5.4983348718451e-07;2.4430955818389e-05;-0.0012643656227738;5.74879013584e-05;-8.1703586829462e-07;-3.0341143428814e-05;7.8242264862638e-05;-4.763139077113e-05;-0.00029379472834989;-0.00018779892707244;-0.00013636905350722;0.00019443900964689;0.00021012416982558;0.0004158382944297;-3.463009124971e-05;0.0008819741779007;-5.7540943089407e-05;-4.0471637476003e-05;4.6990255214041e-05;0.00041769939707592;6.5196909417864e-06;-0.00015287280257326;2.898688762798e-05;0.00027680056518875;-0.00020055382628925;-0.00023441528901458;0.00019802156020887;0.00014053701306693;5.03678311361e-05;4.6647168346681e-05;-5.2639123168774e-05;4.3185632421228e-06;-3.5298185139254e-06;0.00042207003571093;0.00013239879626781;0.00015132807311602;3.0819181120023e-05;-0.00010830028622877;1.0071604492623e-06;-0.00016485413652845;-8.3827064372599e-05;7.7158438216429e-05;0.00032759804162197;-2.2843378246762e-05;-0.00017243689217139;2.4718203349039e-05;-0.00041136128129438;-0.00019042192434426;1.9723656805581e-05;2.066789966193e-05;-0.00036934312083758;-3.7470472307177e-05;0.00012421853898559;3.5959051274403e-06;-0.0001432221615687;7.3429742769804e-05;0.00042439947719686;-1.8945456758956e-05;-4.1230046917917e-05;-5.1140927098459e-05;0.00010199289681623;6.384195148712e-05;6.9277634793252e-06;1.6973143601717e-06;6.1476850532927e-05;-3.5212924558436e-05;8.8857508671936e-05;-9.5242085080827e-06;-9.9537588539533e-05;-2.639667764015e-05;-0.00010243448195979;0.00021131815447006;-7.656765228603e-05;-0.0003521116450429;8.2891281635966e-05;1.0646503142198e-05;-8.4144412539899e-05;1.6567539205425e-05;3.1263785785995e-05;-6.158903852338e-05;1.1516081031004e-05;-0.00025639333762228;9.0875482783304e-06;0.00014598127745558;1.6554908143007e-05;0.00034136412432417;-4.5651897380594e-05;0.00010830951941898;-4.8818396862771e-06;-0.00057380524231121;-4.7959496441763e-05;-1.947108830791e-05;4.7537618229399e-05;3.6680928587884e-06;2.0190269424347e-05;-0.0011330380802974;1.8106622519554e-05;5.9656290432031e-06;-4.807200821233e-05;6.4418760302942e-05;-3.9446185837733e-05;-0.00023547204909846;-0.00018846527382266;-0.0001388952950947;0.00018039744463749;0.00019968702690676;0.00040383817395195;-2.0005225451314e-05;0.00082182721234858;1.1364620604581e-06;-4.1123876144411e-05;4.2952800868079e-05;0.00035847767139785;2.1633928554365e-05;-0.00013119995128363;2.797619526973e-05;0.00036284612724558;-0.00022997832274996;-0.00028636842034757;0.00021357354125939;2.3798413167242e-05;5.6101082009263e-05;4.6567405661335e-05;-4.3856449337909e-05;-1.6764846577644e-06;1.6066341004262e-06;0.00024397682864219;0.00015227314725053;0.00014095191727392;4.5057564420858e-05;-8.2651531556621e-05;-3.3930123208847e-06;-0.00019202129624318;-0.00013156358909328;5.2875097026117e-05;0.00039835789357312;-7.0053670242487e-06;-0.0001016012756736;2.8900034521939e-05;-0.00023270792735275;-0.00021587591618299;5.3671128625865e-06;1.5216464817058e-05;-0.00030436404631473;-4.9885002226802e-05;9.2101719928905e-05;3.3776259442675e-06;-0.00015499214350712;6.8194734922145e-05;0.0004451330169104;-1.4209882465366e-05;5.0612041377462e-05;-3.4601813240442e-05;0.00010717543773353;6.0657428548438e-05;7.6661171988235e-06;5.6201656661869e-07;0.0001010834457702;-2.7260201022727e-05;0.00012905907351524;-3.0455378237093e-06;-9.1228837845847e-05;-2.3480908566853e-05;-7.4682757258415e-05;0.00023685218184255;-6.4851185015868e-05;-0.0003893612883985;5.3360003221314e-05;-3.5531098546926e-05;-8.6575710156467e-05;-8.7375818111468e-05;2.2599300791626e-05;-8.8260487245861e-05;3.4304227938264e-06;-0.000260348781012;1.2062267842339e-06;0.00013068353291601;1.7531472622068e-05;0.00024548941291869;-6.0455204220489e-06;8.7071952293627e-05;-3.1888917874312e-05;-0.00045708648394793;-4.7787383664399e-05;-1.4203260434442e-05;3.8427493564086e-05;5.0669282245508e-06;1.4556439964508e-05;-0.00088862457778305;-5.3696439863415e-06;1.4440444829233e-05;-5.1910021284129e-05;4.8435456847074e-05;-2.9080347303534e-05;-0.00017207233759109;-0.00015703539247625;-0.00011591344809858;0.00013904842489865;0.00016600493108854;0.00033041610731743;-1.1608978638833e-05;0.00064710981678218;3.215204924345e-05;-3.7200188671704e-05;3.5695731639862e-05;0.0002737989416346;2.7267209588899e-05;-0.00010274571104674;2.3590846467414e-05;0.0003417517291382;-0.00020115936058573;-0.00025953119620681;0.0001829609827837;-3.09192801069e-05;4.6689761802554e-05;3.8918049540371e-05;-3.2065752748167e-05;-4.1426260395383e-06;2.86279168904e-06;0.00013083894737065;0.00013337105337996;0.00011525853187777;4.4998014345765e-05;-5.8454505051486e-05;-4.0828131204762e-06;-0.00017637999553699;-0.00013152015162632;3.4959972254001e-05;0.00036509340861812;5.8838950280915e-06;-5.5098564189393e-05;2.5062219719985e-05;-0.00012243002129253;-0.00018904716125689;-1.142408564192e-06;9.6360045063193e-06;-0.00022990792058408;-4.7798384912312e-05;6.3367529946845e-05;2.0272743768146e-06;-0.00013503830996342;5.3455827583093e-05;0.00038772623520344;-6.7382720772002e-06;7.862023630878e-05;-1.7918751836987e-05;9.3099726655055e-05;5.1614162657643e-05;6.2767367126071e-06;4.5417075966725e-07;9.3853988801129e-05;-1.7132320863311e-05;0.0001252048969036;3.6175470086164e-06;-7.1719841798767e-05;-1.8885180907091e-05;-4.9878377467394e-05;0.00021339269005693;-5.105098898639e-05;-0.00034744787262753;2.8706414013868e-05;-4.7660578275099e-05;-7.6460353739094e-05;-0.00011000813537976;1.0895782907028e-05;-8.7656721007079e-05;-3.2542254757573e-06;-0.0002189892984461;-5.145404884388e-06;0.00010260868293699;1.54575373017e-05;-0.00071695796214044;0.00072105351136997;0.00050549086881801;-0.00042362371459603;2.8115831810283e-05;1.7741840565577e-06;-3.0435387088801e-05;7.4623996624723e-05;4.8376830818597e-05;-5.1326187531231e-05;-1.144822272181e-05;-0.00017145197489299;0.00035311837564223;-0.00032350080437027;-6.0496063269966e-06;2.2805847038398e-05;1.8048904593115e-08;3.0110961233731e-05;-2.6011379304691e-05;-0.00028441939502954;0.00021691044094041;0.00023971038172022;-0.00025633935001679;-0.00029319047462195;0.00035093104816042;-0.00013638600648846;7.8987512097228e-05;-9.5041876193136e-05;0.00018174908473156;-9.3798960733693e-05;6.6204389440827e-05;0.00053936435142532;0.00032637797994539;-0.00030568017973565;-0.00017342384671792;-0.00035309576196596;-0.00022465671645477;8.5611209215131e-05;9.337915253127e-05;-2.704491816985e-05;-4.2723007936729e-05;-0.00033194312709384;-0.0001935203326866;0.00024103140458465;0.00022259511752054;1.8259666831e-05;4.2073748772964e-05;-0.00035755426506512;-0.00031904823845252;-1.905416684167e-05;0.00055280450033024;0.00038434375892393;0.0001006886450341;5.6723623856669e-05;0.00025467143859714;0.00014086632290855;-0.00010954910976579;-0.00012813277135137;-0.00019633931515273;-0.00017938607197721;-4.05555110774e-05;-5.7083609135589e-05;-0.00027854446670972;-0.00018847193859983;0.00065069895936176;0.00047099642688408;0.00063217297429219;0.00055002991575748;0.00022876755974721;0.00020276282157283;-3.844776074402e-06;8.766690370976e-06;0.00022915334557183;0.00021098175784573;0.00035381660563871;0.00035203801235184;-2.9835768145858e-05;-2.0294328351156e-05;0.00053354410920292;0.00088597397552803;-6.5743006416596e-05;-0.001039860653691;-0.00082993955584243;-0.00037491219700314;-0.00035837336326949;-0.00048271601554006;-0.00045991246588528;-0.00036545420880429;-0.00032125681173056;-0.00033938157139346;-0.00029508164152503;9.0903049567714e-05;5.301656347001e-05;-0.00071185774868354;0.00069256557617337;0.00050539884250611;-0.0004069700371474;4.9891579692485e-05;2.7481404686114e-05;-3.0351697205333e-05;7.3403592978138e-05;4.6459914301522e-05;-5.2231342124287e-05;2.4823539206409e-05;-0.00013328263594303;0.00035300455056131;-0.00031725896405987;-6.2078770497465e-06;2.3467837308999e-05;2.6822337986232e-06;4.9183483497472e-05;-1.3539465726353e-05;-0.00029462267411873;0.00019813158723991;0.00022006127983332;-0.00027285015676171;-0.00032268831273541;0.0003128103853669;-0.00013526162365451;7.7289681939874e-05;-0.00010676797683118;0.00017198571003973;-9.0684057795443e-05;6.5933345467784e-05;0.0004891388816759;0.00035614895750768;-0.00027248868718743;-0.00019543648522813;-0.00033156180870719;-0.00022946699755266;7.9900702985469e-05;9.3020964413881e-05;-2.5281982743763e-05;-4.4329241063679e-05;-0.00030534900724888;-0.00019698093819898;0.00023333415447269;0.0002199295850005;1.8373062630417e-05;4.2836385546252e-05;-0.00035063538234681;-0.00031238503288478;-1.4274029126682e-05;0.00052236102055758;0.00039689420373179;9.4436021754518e-05;5.3678206313634e-05;0.00022740611166228;0.00014978623948991;-0.0001046783363563;-0.0001266445760848;-0.00018963396723848;-0.0001809587556636;-4.0038557926891e-05;-5.7100725825876e-05;-0.00026143089053221;-0.00019475832232274;0.00061298656510189;0.00048344422248192;0.00060825818218291;0.00055015436373651;0.00022147729760036;0.0002043129352387;-3.6926719531039e-06;8.886353498383e-06;0.00021999498130754;0.00021695521718357;0.00033933378290385;0.00036051089409739;-2.7523352400749e-05;-2.2185102352523e-05;0.00051803822861984;0.00086092774290591;-6.6890032030642e-05;-0.00099358567968011;-0.00082570570521057;-0.00036201172042638;-0.00035210646456107;-0.0004615772922989;-0.0004673236689996;-0.00035308653605171;-0.00032508035656065;-0.00032448608544655;-0.00030567063367926;8.6651329183951e-05;5.5182284995681e-05;-0.00012215704191476;-2.6364103177912e-05;0.00015503189933952;-9.519986633677e-05;7.5915464549325e-05;0.00026363969664089;-2.5820221708273e-05;2.7926465918426e-05;1.89033710285e-06;-1.619046270207e-05;5.438848893391e-05;0.0004201196716167;9.1628367954399e-05;-4.6867608034518e-05;9.4473043645849e-06;-1.7367532564094e-05;5.8957619330613e-05;0.00011946783342864;7.3379458626732e-05;-0.00017143138393294;-3.1828345527174e-05;1.5308747606468e-05;-0.00025225660647266;-0.0001375877764076;-0.00029136877856217;-3.8760026654927e-05;2.1129093511263e-05;-4.5501608838094e-05;-0.00010555876360741;-2.1199995899224e-05;5.7229692174587e-05;-0.00013704704178963;0.00031932067940943;0.00011708661622833;-0.00023707821674179;4.6928817027947e-06;-0.00011590216308832;-1.3178739209252e-05;3.4694829082582e-05;6.3431580201723e-06;-1.4907861441316e-05;0.00011069564061472;-2.5137660486507e-05;5.4456184443552e-05;7.2924936830532e-05;-1.0303535418643e-05;-1.845670522016e-05;-0.00016160937957466;-0.0001460872736061;1.3107440281601e-05;6.9451540184673e-05;0.00031488164677285;2.3836255422793e-05;1.099656765291e-05;-0.00014810547872912;6.1291917518247e-05;5.9540438996919e-06;-1.7924809071701e-05;-6.6385335230734e-05;-0.00013600733655039;4.6937107072154e-06;2.3703480110271e-05;1.6004998542485e-05;-0.00010585874406388;4.8772311856737e-05;0.00032058468787;3.7754769437015e-05;0.00015215932216961;5.4117757827044e-05;9.1809532023035e-05;-1.6195037915168e-06;6.9543079916912e-06;8.5253177530831e-06;9.1844602138735e-05;3.2498839573236e-05;0.00015973929839674;-1.5427471225848e-05;-4.7338398871943e-05;2.7250714538241e-06;0.00022256508236751;-4.1592214984121e-05;-6.9996756792534e-05;-0.00030972875538282;-7.5164403824601e-05;-8.7773114501033e-05;-2.739172668953e-05;-0.00018470859504305;-3.5801171179628e-05;-0.00010959576320602;-3.8152422348503e-05;-0.00017711620603222;2.1747033315478e-05;5.94623197685e-05;0.00017182373267133;-0.00038491800660267;-0.00010307263437426;-0.00025570136494935;1.8274036847288e-05;0.00031182891689241;-1.9211311155232e-05;7.3020666604862e-05;-8.7044945757953e-06;-1.9742605218198e-05;-0.00013081092038192;0.00092043570475653;3.7039550079498e-05;-3.6006855225423e-05;4.3490628740983e-05;-3.4064691135427e-05;0.00032457962515764;0.00011441364040365;3.5299297451274e-05;-0.00021156948059797;-9.5334384241141e-05;7.8700941230636e-05;-0.00026000090292655;0.00013401619798969;-0.00039528121124022;-7.4990399298258e-05;-1.4285157703853e-05;7.0155456342036e-06;-0.00030020737904124;-3.1823368772166e-05;0.00010578670480754;-2.3921165848151e-05;-6.2324448663276e-05;9.7044976428151e-05;1.5904166502878e-05;2.9193879527156e-06;0.00036364435800351;-6.1839760746807e-05;-6.3655363646831e-07;-1.6845509890118e-05;1.3437335837807e-05;2.0478893929976e-05;0.00082987744826823;-1.7011492673191e-05;7.2866685513873e-05;1.1340125638526e-05;-0.00013775350817014;-8.4860315837432e-05;8.9217246568296e-05;0.00015966310456861;-3.0460649213637e-05;3.7873280234635e-05;-2.6295472707716e-05;-0.00031787354964763;-5.6515171309002e-05;-0.0007502551889047;3.977193046012e-05;0.0001024404191412;4.6750883484492e-06;-0.00045557954581454;1.4304945352706e-06;0.00017958738317247;6.7651162680704e-05;-5.5984761274885e-05;-1.0458689757797e-05;0.00025368435308337;-0.00010285418102285;-0.0002814746403601;4.7973266191548e-05;0.00010686807218008;1.4217480384104e-05;-4.7049238673935e-06;-5.04595664097e-05;-9.0819157776423e-05;-1.2629427146749e-05;1.6048918041633e-05;-3.0329727451317e-05;-9.5135350420605e-05;-0.00019256558152847;1.1595621799643e-05;-0.00012276311463211;0.00017363019287586;-9.0592729975469e-05;1.2387382639645e-06;0.00014100116095506;3.9291990105994e-05;0.00032326497603208;2.6218567654723e-05;-3.6258548789192e-05;2.0039160517626e-05;-0.0002377935743425;1.1811042895715e-05;0.0001602892880328;0.00050133431795985;-0.00022326101316139;0.00023766448430251;0.00016338826389983;-0.00052395748207346;2.1105144696776e-05;-5.0914306484628e-05;5.5405977036571e-05;-1.8228121916763e-05;3.4366854379186e-05;-0.0014208436477929;0.0001560996461194;2.6972420528182e-06;3.6357971112011e-05;0.00017287368245889;-6.0858790675411e-05;-0.00035872776061296;-0.00011605479085119;-9.9255281384103e-05;0.00011210530647077;0.00018608325626701;0.00037139336927794;-9.0535475465003e-05;0.00086004758486524;-0.00020717858569697;-8.2581944297999e-05;3.7834201066289e-05;0.00059920456260443;-4.6401724830503e-05;-0.00027322137611918;2.4058514100034e-05;8.5001402112539e-06;-7.0954934926704e-05;6.9309026002884e-05;0.00010610098252073;0.00043128346442245;-1.4764690092761e-07;5.3564290283248e-05;-4.5823897380615e-05;2.3107733795769e-05;-1.8843411453418e-05;0.00063701625913382;4.5393459004117e-05;0.00018841653945856;-1.1003359759343e-05;-0.00015184446237981;5.7279648899566e-06;-0.00010026381642092;0.00010271254723193;0.00010592170292512;-2.119363489328e-05;-1.6667510863044e-05;-0.00031671702163294;-1.0408843991172e-05;-0.00076216040179133;-7.3601804615464e-05;1.8679613276618e-05;3.4691220207606e-05;-0.00039964602910914;6.4297410062863e-07;0.00016306263569277;5.1462184273987e-06;-7.1138376370072e-05;6.0637019487331e-05;0.00041546713327989;-6.8948352236475e-06;-0.00031179477809928;-6.3187166233547e-05;1.5123450793908e-05;8.2468934124336e-05;8.6374103602793e-07;3.3202579743374e-06;-0.00025027629453689;-3.502185063553e-05;-8.77267375472e-05;-5.9866702031286e-06;-5.1137169066351e-05;-3.560281402315e-05;-0.00019126040569972;0.00016096270701382;-7.2625232860446e-05;-0.00027325178962201;0.00015633301518392;0.00017061726248357;-0.00013328959175851;0.00034026862704195;1.7096896044677e-05;5.5638265621383e-05;2.5079010811169e-05;-2.0245232008165e-05;1.4211104826245e-05;8.1030804722104e-05;1.0320723049517e-05;0.00036814017221332;-6.9008434365969e-05;8.065457950579e-05;6.8479403125821e-06;-0.00062123342650011;-2.538125954743e-05;-3.3454056392657e-05;5.8634312154027e-05;-6.3753627728147e-06;2.4196315280278e-05;-0.0012407517060637;3.5455937904771e-05;-3.5080265661236e-05;-1.6669144315529e-05;0.00011254296259722;-3.9838512748247e-05;-0.00020899109949823;-0.00018310220912099;-0.00014441442908719;0.00017194307292812;0.00017426445265301;0.00043531518895179;-2.9773771530017e-05;0.00094002723926678;-2.597085403977e-05;-4.978763172403e-05;2.2932194042369e-05;0.00045995513210073;-6.0290346937109e-07;-0.0001830366672948;2.2562244339497e-05;0.00043923096382059;-0.00028966012177989;-0.00028653829940595;0.00025711028138176;-4.5233518903842e-05;7.6910910138395e-05;5.6771859817673e-05;-3.307826409582e-05;-4.6594919922427e-07;6.8806607487204e-06;5.7546836615074e-05;0.00019382148457225;0.00013922323705629;5.1802511734422e-05;-8.1613325164653e-05;-1.5672523659305e-05;-0.00021577492589131;-0.00012155139847891;2.5477174858679e-05;0.00039901220588945;-1.8922501112684e-05;-5.8438366977498e-05;1.643702853471e-05;-8.9576795289759e-05;-0.0002666647778824;-8.8083934315364e-06;1.9347648049006e-05;-0.0002420347154839;-5.9464135119924e-05;8.3538376202341e-05;1.0386864232714e-05;-0.00016577700444032;7.6383956184145e-05;0.00056054187007248;-2.325981586182e-05;5.5998152674874e-05;-4.3300991819706e-05;7.238698162837e-05;7.2137692768592e-05;9.1132415036554e-06;-3.5711198052013e-06;6.3959614635678e-06;-3.5417095205048e-05;0.00010043694055639;-1.3956591828901e-05;-6.9079782406334e-05;-2.8142969313194e-05;-9.9966913694516e-05;0.00029992542113177;-4.4245603930904e-05;-0.00049040617886931;7.8105134889483e-05;-2.6742844056571e-05;-0.00013940835196991;-9.6640433184803e-05;3.3100084692705e-05;-5.9511894505704e-05;1.6372705431422e-05;-0.00015865813475102;1.0068225492432e-05;8.9273424237035e-05;1.7845934053184e-05;0.00033699412597343;-2.8480033506639e-05;8.5676241724286e-05;-2.9973552955198e-05;-0.00062542664818466;-4.284355964046e-05;-3.1225921702571e-05;5.9913123550359e-05;-3.0765727387916e-06;2.2078675101511e-05;-0.0012320966925472;6.0622928685916e-06;-2.5677945814095e-05;-3.2846230169525e-05;0.00010606097930577;-3.7085836083861e-05;-0.00019417467410676;-0.00019366963533685;-0.00015269503637683;0.00016672891797498;0.00018845904560294;0.00044741065357812;-2.1548823497142e-05;0.00093721714802086;1.7518577806186e-05;-5.2854542445857e-05;2.4795224817353e-05;0.00044637563405558;1.2093903933419e-05;-0.00017748662503436;2.3777751266607e-05;0.00051221164176241;-0.00031950222910382;-0.00034260001848452;0.0002786097174976;-0.00011153551895404;8.2342361565679e-05;5.9786059864564e-05;-3.1458512239624e-05;-3.6762667150469e-06;9.4937913672766e-06;-1.1172894119227e-05;0.0002121823199559;0.00014115269004833;6.3212719396688e-05;-7.5921350799035e-05;-1.769337359292e-05;-0.00024337018840015;-0.00016088635311462;1.5834450096008e-05;0.00047336000716314;-1.0478874173714e-05;-2.5960616767406e-05;2.3115524527384e-05;-9.9728094937745e-06;-0.00029202408040874;-1.2624883311219e-05;1.6334297470166e-05;-0.00023559301916976;-6.9822381192353e-05;7.6401884143706e-05;1.0255909728585e-05;-0.00018116617866326;7.6135722338222e-05;0.0005959658883512;-1.9999130017823e-05;0.00010149398440262;-3.2697764254408e-05;8.5064704762772e-05;7.5079842645209e-05;9.4864108177717e-06;-3.7258587326505e-06;3.2174029911403e-05;-3.156556704198e-05;0.00012805037840735;-9.9714743555523e-06;-7.2440641815774e-05;-2.8085280064261e-05;-8.3989711129107e-05;0.00033183218329214;-4.4438973418437e-05;-0.00053626397857442;5.8459667343413e-05;-5.2286519348854e-05;-0.00014679480227642;-0.00014416757039726;2.7861085982295e-05;-8.065091969911e-05;1.0700851817091e-05;-0.00018331775208935;5.4466463552671e-06;9.4081631687004e-05;1.9729066480068e-05;0.00024857805692591;1.0157687029277e-05;7.8979479440022e-05;-5.3610834584106e-05;-0.00050701829604805;-4.9705507990438e-05;-2.2689935576636e-05;4.8441557737533e-05;1.0502974419069e-06;1.6045274605858e-05;-0.00099054607562721;-1.8148295566789e-05;-7.0521746238228e-06;-4.3567535612965e-05;7.7665601565968e-05;-2.8251071853447e-05;-0.00015092421381269;-0.00016669892647769;-0.00012980950123165;0.00013247015886009;0.00016763884923421;0.00037119790795259;-1.1439048648754e-05;0.0007481686770916;4.9440684961155e-05;-4.6000768634258e-05;2.4472539735143e-05;0.00034470341051929;2.2327596525429e-05;-0.00013715399836656;2.1278434360283e-05;0.00046036500134505;-0.00027221359778196;-0.00031434587435797;0.00023567859898321;-0.00012616478488781;6.6607957705855e-05;4.9962291086558e-05;-2.5162829842884e-05;-5.4090987759992e-06;8.5360561570269e-06;-3.442759407335e-05;0.00017960129480343;0.00011951650230912;5.9260131820338e-05;-5.7889577874448e-05;-1.4210209883458e-05;-0.00021778333757538;-0.00015861765132286;1.0253439540975e-05;0.00043551943963394;2.119151304214e-06;-5.2835516726191e-06;2.3844373572501e-05;2.5291326892329e-05;-0.0002484354772605;-1.2371277989587e-05;1.0586276403046e-05;-0.00019613851327449;-6.3480263634119e-05;5.7606015616329e-05;7.1857807597553e-06;-0.0001591441250639;6.119188037701e-05;0.00050622643902898;-1.17821036838e-05;0.0001146025097114;-1.6760679500294e-05;8.2576028944459e-05;6.3659252191428e-05;7.7492159107351e-06;-2.5461954464845e-06;5.1041552069364e-05;-2.1432791982079e-05;0.00012814444198739;-2.4051930722635e-06;-6.3128733017948e-05;-2.2773947421229e-05;-5.4935288062552e-05;0.0002903554122895;-3.9463819121011e-05;-0.00046534926514141;3.0420304028667e-05;-6.109901732998e-05;-0.00012171577691333;-0.00014932561316527;1.615502515051e-05;-8.541408169549e-05;2.0639461126848e-06;-0.00017730197578203;-1.2241201829966e-06;8.3942184573971e-05;1.7674512491794e-05;-0.0007669689366594;0.00079176580766216;0.00043211231241003;-0.00041770355892368;4.6384484448936e-05;-7.8767581726424e-05;-3.6463607102633e-05;7.3530587542336e-05;4.5046330342302e-05;-4.6207424020395e-05;4.4586522562895e-05;-0.00029014813480899;0.00024281897640321;-0.0002408862055745;4.0566189341007e-07;2.3038495783112e-05;3.1424933695234e-05;8.4789589891443e-06;-3.6949466448277e-05;-0.00026686547789723;0.0002158483985113;0.00019912906282116;-0.00016553970635869;-0.00024295948969666;0.00040907159564085;-9.6855728770606e-05;4.4249842176214e-05;-3.6944511521142e-05;0.000148546838318;-7.786120113451e-05;4.4682194129564e-05;0.00060049985768273;0.00025046814698726;-0.00035569179453887;-0.00014333068975247;-0.00038672689697705;-0.00020617672998924;0.00011040582467103;0.00011162721784785;-2.0849229258602e-05;-2.5694969735923e-05;-0.00049074413254857;-0.00023325158690568;0.00022265581355896;0.00020307773957029;9.9187136584078e-06;1.8134122001356e-05;-0.00025235474458896;-0.00023583011352457;-9.3006747192703e-05;0.00046205605030991;0.00025133867166005;0.00014175775868353;7.8781704360154e-05;0.00042340319487266;0.00018972331599798;-0.00013362872414291;-0.000133339461172;-0.00014844362158328;-0.00015279617218766;-2.9834953238606e-05;-3.2147654565051e-05;-0.00030424728174694;-0.0001772929681465;0.00067539821611717;0.00040740537224337;0.00065682193962857;0.00052912242244929;0.00019195541972294;0.00016732369840611;-6.3954175857361e-06;2.9019329303992e-06;0.00018515218107495;0.00015361831174232;0.00028493386344053;0.00024764510453679;-1.9296174286865e-05;-1.189504746435e-05;0.00065776449628174;0.0010002892231569;-1.2809367035516e-05;-0.001189446891658;-0.0008997920085676;-0.00040839525172487;-0.00039707575342618;-0.00046483488404192;-0.00037653910112567;-0.00031370864599012;-0.00025190931046382;-0.00024697958724573;-0.00019063134095632;7.0730195147917e-05;4.0186660044128e-05;-0.0010732171358541;0.0010755396215245;0.00061818794347346;-0.00055866985348985;9.5873125246726e-05;-7.3305855039507e-05;-5.0985945563298e-05;0.00010158113582293;6.244693940971e-05;-6.6489141318016e-05;0.00012068711657776;-0.00035462991218083;0.00035792484413832;-0.0003415861283429;-4.3255922719254e-06;3.1385614420287e-05;3.4120512282243e-05;3.7131329008844e-05;-3.431161530898e-05;-0.00038443313678727;0.0002823562535923;0.00025715975789353;-0.00026299015735276;-0.00040453724795952;0.00052341888658702;-0.00013619892706629;6.6244079789612e-05;-8.269749378087e-05;0.00020153552759439;-0.00010432823910378;6.7113811383024e-05;0.0007586840656586;0.00041161981062032;-0.00044260564027354;-0.00023708201479167;-0.00049947068328038;-0.00030334907933138;0.0001455244346289;0.00015530570817646;-2.8715097869281e-05;-4.1295752453152e-05;-0.00062118016649038;-0.00034717767266557;0.00030548629001714;0.00028265721630305;1.6704221707187e-05;3.1495867006015e-05;-0.00034689879976213;-0.00031937824678607;-0.00011308290413581;0.00060424080584198;0.00037553656147793;0.00017659143486526;0.0001034025917761;0.00052469037473202;0.00028983439551666;-0.0001793859701138;-0.0001870045234682;-0.00020790187409148;-0.00021303986432031;-4.3961128540104e-05;-5.0244339945493e-05;-0.00040287576848641;-0.00026188482297584;0.00088646472431719;0.00060081481933594;0.00089387764455751;0.00074985419632867;0.00026713809347712;0.00023695503477938;-9.3853495855001e-06;5.7490851759212e-06;0.00025906984228641;0.00022665476717521;0.00039234501309693;0.00037081431946717;-2.4209795810748e-05;-1.7164642486023e-05;0.00090068380814046;0.0013569828588516;-2.4895876777009e-05;-0.0015892531955615;-0.0012592388084158;-0.00055730337044224;-0.0005407955031842;-0.00062749703647569;-0.00055187183897942;-0.00043590003042482;-0.00036739016650245;-0.00034391426015645;-0.00028755029779859;9.6836360171437e-05;5.6890239648055e-05;-0.0010115175973624;0.00098127278033644;0.00058790022740141;-0.00049771316116676;0.00012143326603109;-3.6049379559699e-05;-4.8543603043072e-05;9.3809510872234e-05;5.7106091844616e-05;-6.3491621403955e-05;0.00017308426322415;-0.00028458071756177;0.00033912807703018;-0.00031342633883469;-7.4068570938834e-06;2.8241123800399e-05;2.5376150006196e-05;5.9846148360521e-05;-1.477068872191e-05;-0.0003720669192262;0.00024430110352114;0.00021481743897311;-0.00027087732451037;-0.0004327742208261;0.00043894260306843;-0.00012407830217853;6.2587219872512e-05;-9.9368080554996e-05;0.0001752570096869;-9.1457084636204e-05;6.5018939494621e-05;0.0006347656599246;0.00044334173435345;-0.00036691050627269;-0.0002606529451441;-0.00043116987217218;-0.00029964439454488;0.00013061524077784;0.0001473406155128;-2.5022825866472e-05;-4.1631472413428e-05;-0.00053396634757519;-0.0003505484201014;0.00027915328973904;0.00026274699484929;1.6194822819671e-05;3.1571442377754e-05;-0.00031085935188457;-0.00028541559004225;-0.00010003759962274;0.0005183563916944;0.00036788650322706;0.0001512098533567;9.598698670743e-05;0.00044330570381135;0.00030290230643004;-0.0001635670196265;-0.00017663279140834;-0.00019139546202496;-0.00019918814359698;-4.0714628994465e-05;-4.802019248018e-05;-0.00035661488072947;-0.00025965785607696;0.0007756280247122;0.00059235619846731;0.00081441825022921;0.00071203714469448;0.00024479944841005;0.00022293097572401;-9.4702090791543e-06;6.3163502090902e-06;0.00023768351820763;0.00021922196901869;0.00035147037124261;0.00036102937883697;-1.9798197172349e-05;-1.7439953808207e-05;0.00083867914509028;0.0012503411853686;-2.4287126507261e-05;-0.001435883808881;-0.0011958555551246;-0.00051328598055989;-0.00050020084017888;-0.00056189950555563;-0.00053499673958868;-0.00039749415009283;-0.00035153888165951;-0.0003093923733104;-0.00028090245905332;8.7380656623282e-05;5.4425861890195e-05;-0.00015502815949731;-3.889633808285e-05;0.00019487694953568;-0.00010081413347507;9.1745430836454e-05;0.0003585479571484;-4.3227857531747e-05;4.0582555811852e-05;2.0585589766142e-07;-1.3279991435411e-05;8.5176885477267e-05;0.0005890826578252;8.4539562521968e-05;-2.4551392925787e-05;1.0034185834229e-05;-5.2771782065975e-05;5.0584829295985e-05;0.0001472366420785;0.00010190151078859;-0.0002000853564823;-3.0427623642026e-05;1.4115052181296e-05;-0.00033279656781815;-0.00017612535157241;-0.00044401086051948;-2.5862202164717e-05;3.0998475267552e-05;-4.3205753172515e-05;-0.00020200471044518;-1.9599829101935e-05;0.00010305939940736;-0.00024896857212298;0.00048365906695835;0.00019770087965298;-0.00033937659463845;3.7235869967844e-05;-0.00021784869022667;-8.7266462287516e-06;5.6983375543496e-05;1.2914715625811e-05;-1.7406819097232e-05;0.0001885446254164;-0.00016842209151946;7.3510833317414e-05;8.5617786680814e-05;-2.2341209842125e-05;-2.9204473321442e-05;-0.00020524029969238;-0.00018065406766254;-1.2520130439952e-05;5.1098271796945e-05;0.00041946637793444;2.4598268282716e-05;5.6509332353016e-05;-0.00024055075482465;0.00020663376199082;7.9019873737707e-06;-3.0361228709808e-05;-9.1977060947102e-05;-0.00013455345469993;1.2671928743657e-05;3.3105021429947e-05;2.9822600481566e-05;-0.00014643082977273;4.3859468860319e-05;0.0004803444899153;3.969062527176e-05;0.00020033020700794;7.0372065238189e-05;8.977535617305e-05;-6.3268662415794e-06;1.0981011655531e-05;-1.0103539125339e-06;6.451452645706e-05;2.3504097043769e-05;0.00017640028090682;-1.9710874767043e-05;-4.8896497901296e-05;3.1582237625116e-07;0.00033433953649364;-3.3135384001071e-05;-7.7760429121554e-05;-0.00047248709597625;-0.00013036023301538;-0.00011166151671205;-1.8031569197774e-05;-0.00024427392054349;-2.9999000616954e-05;-0.00011288223322481;-3.0908970074961e-05;-0.00015639304183424;2.4763066903688e-05;5.1255701691844e-05;-8.0209734733216e-05;-0.00011928129970329;0.00013502067304216;-5.5664640967734e-05;5.9233472711639e-05;0.00041388894896954;-5.0743481551763e-05;4.5599063014379e-05;-5.7872989600583e-06;-3.9834594645072e-06;5.2002709708177e-05;0.00069986196467653;4.4390842958819e-05;1.7015074263327e-05;1.3864989341528e-05;-8.3240360254422e-05;4.9068708904088e-05;0.00014290524995886;0.00010891818237724;-0.00015941727906466;-5.456643702928e-05;1.8315220586373e-05;-0.00035229709465057;-0.00011413261381676;-0.00056324520846829;-7.1999270403467e-06;3.0439570764429e-05;-1.9172235624865e-05;-0.00027949264040217;-1.4940812434361e-05;0.00013284986198414;-0.00031150699942373;0.00049689505249262;0.00024529860820621;-0.00032787970849313;7.9603196354583e-05;-0.00021139097225387;-8.8465249064029e-06;6.1555962020066e-05;1.5003633961896e-05;-1.421499382559e-05;0.00023594776575919;-0.00020687490177806;6.5400752646383e-05;7.9374651249964e-05;-2.7787349608843e-05;-3.8302448956529e-05;-0.00018480446306057;-0.00013365918130148;-1.6620197129669e-05;-8.0896979852696e-06;0.0003815671952907;3.4552149372757e-06;5.0975279009435e-05;-0.0002924740256276;0.00022742661531083;1.449341289117e-05;-2.9712995456066e-05;-8.8494016381446e-05;-0.00011552830255823;1.7980100892601e-05;4.1209343180526e-05;5.1165621698601e-05;-0.00015166742377914;7.3615929068183e-06;0.00052520836470649;9.0020893139808e-07;0.00017244207265321;6.5196640207432e-05;6.2670696934219e-05;-8.7618464021944e-06;1.2631223398785e-05;-2.1969495719532e-05;1.6354466424673e-05;-5.724459697376e-07;0.00014393580204342;-1.9950932255597e-05;-4.1191455238732e-05;-3.7732344935648e-05;0.00032738255686127;-2.1375735741458e-05;-1.1885955245816e-05;-0.00049341632984579;-0.0001388502860209;-8.7170068582054e-05;1.4293803360488e-05;-0.00022610416635871;-4.5685519580729e-06;-8.117884863168e-05;-6.5550038925721e-06;-9.9897850304842e-05;1.9389121007407e-05;3.391658901819e-05;-2.5261340852012e-05;-0.00016158469952643;8.6608437413815e-05;-2.9090144380461e-05;3.1336479878519e-05;0.0004174736677669;-5.0234135414939e-05;4.5417396904668e-05;-8.9529212345951e-06;1.2347924212008e-06;1.7197766283061e-05;0.00071670848410577;2.2143140085973e-05;3.383833609405e-05;1.6288315237034e-05;-9.3510781880468e-05;5.0582097173901e-05;0.00013022743223701;0.00010343458416173;-0.00012545782374218;-6.7036911787e-05;2.4346469217562e-05;-0.00034004918416031;-5.9994785260642e-05;-0.0005883050034754;-1.0171404341008e-07;2.906431836891e-05;-3.658643890958e-06;-0.00029984983848408;-1.3105977814121e-05;0.00014029223530088;-0.00030475331004709;0.00044800931937061;0.0002417045616312;-0.00027892660000362;8.8211541878991e-05;-0.00016977621999104;-8.9099567048834e-06;5.8300047385274e-05;1.3643834790855e-05;-1.0965107321681e-05;0.00023312478151638;-0.00018578449089546;5.5044463806553e-05;7.5518211815506e-05;-2.7299487555865e-05;-4.0786642784951e-05;-0.00016186581342481;-9.3332986580208e-05;-1.2100686944905e-05;-2.9644106689375e-05;0.00031812567613088;-8.561386493966e-06;3.187645052094e-05;-0.00028679869137704;0.00018754765915219;1.7551652490511e-05;-2.7594769562711e-05;-7.8433840826619e-05;-0.00010416010627523;1.8480326616555e-05;4.2555693653412e-05;5.875043279957e-05;-0.00014305050717667;-8.6195859694271e-06;0.00050986127462238;-2.0403735106811e-05;0.00014063391427044;5.9122976381332e-05;4.5116717956262e-05;-8.9144095909433e-06;1.2530857020465e-05;-3.0898336262908e-05;-9.8843765954371e-06;-9.8193258963875e-06;0.00011787810217356;-1.9436130969552e-05;-3.4441341995262e-05;-6.0400623624446e-05;0.0002948626934085;-1.6449144823127e-05;2.6767746021505e-05;-0.00046238617505878;-0.00013137962378096;-6.4351603214163e-05;2.7867281460203e-05;-0.00019679446995724;7.4067347668461e-06;-5.9983038227074e-05;3.7182003325142e-06;-6.6398213675711e-05;1.5764642739668e-05;2.3329066607403e-05;0.0004572945763357;-0.00014245341299102;6.1342020671873e-06;4.9319420213578e-05;-0.00068539561470971;2.793313433358e-05;-4.9048743676394e-05;6.3326508097816e-05;-1.996281753236e-05;3.2558429666096e-05;-0.0014260719763115;9.1906935267616e-05;-6.5872285631485e-05;1.999749110837e-05;0.00018055342661683;-4.2123567254748e-05;-0.00017595694225747;-0.00019798509310931;-0.00015006973990239;0.0002082864230033;0.00011986237223027;0.00047807683586143;-3.7650435842806e-05;0.0011044600978494;-9.7014242783189e-05;-7.5498537626117e-05;1.9005383364856e-06;0.00059811904793605;-3.2176500099013e-05;-0.00026216031983495;1.9710754713742e-05;0.00045180023880675;-0.00032106786966324;-0.00014136945537757;0.00028363784076646;1.1418162102927e-05;8.5660307377111e-05;6.4535255660303e-05;-1.5894778698566e-05;4.1043344936043e-06;6.8549829848052e-06;-7.0308284193743e-05;0.00022159863146953;0.00017770777049009;4.80222661281e-05;-7.7782329753973e-05;-2.9323469789233e-05;-0.00024581226170994;-2.2352738596965e-05;2.1463229131768e-05;0.00025064119836316;-1.5198651453829e-05;-7.5607989856508e-05;-3.632314837887e-05;-0.00010799391748151;-0.00029901749803685;-3.8643487641821e-05;3.24810789607e-05;-0.00018233999435324;-6.2025515944697e-05;6.2189028540161e-05;1.8947082935483e-05;-0.00019402569159865;0.00010264860611642;0.00079058815026656;-3.9826627471484e-05;3.9739814383211e-05;-7.4826610216405e-05;2.2388974684873e-05;9.4137867563404e-05;1.0596701940813e-05;-6.6995817178395e-06;-0.00017014920013025;-5.3305826440919e-05;6.878687418066e-05;-2.4413167921011e-05;-2.912025047408e-05;-3.9057507819962e-05;-0.00018130315584131;0.00037460910971276;-2.6368858016212e-05;-0.00064492365345359;0.00015814376820344;1.041337964125e-05;-0.00021210547129158;-9.2450187366921e-05;5.1433493354125e-05;-2.7245720048086e-05;3.6660316254711e-05;-2.5137258035102e-06;1.974711449293e-05;1.9498345864122e-05;1.8942697352031e-05;0.00044078839709982;-8.2163394836243e-05;2.9847511541448e-05;-7.3632309067762e-06;-0.00078405888052657;-8.0947602327797e-06;-5.1807437557727e-05;7.7713855716866e-05;-1.6643409253447e-05;3.1702518754173e-05;-0.0015432415530086;4.2968826164724e-05;-8.0617173807696e-05;7.1440985038862e-07;0.00018001429270953;-4.3009054934373e-05;-0.00018181426275987;-0.00022537421318702;-0.00018134382844437;0.00020803761435673;0.00016728264745325;0.00055279239313677;-3.2631622161716e-05;0.0012320660753176;-2.9043119866401e-05;-7.1277769166045e-05;3.8848866097396e-06;0.0006286790012382;-1.5151243133005e-05;-0.0002646186912898;2.1761261450592e-05;0.00066475552739576;-0.00043570250272751;-0.00035581990960054;0.0003713745099958;-0.00018558840383776;0.00012249863357283;7.6360869570635e-05;-2.124779712176e-05;-3.7445811358339e-06;1.6974316167762e-05;-0.00023920786043163;0.00029564570286311;0.00016516167670488;7.8489247243851e-05;-7.5898235081695e-05;-3.596206443035e-05;-0.00030798572697677;-0.0001482158259023;-7.5033567554783e-06;0.00050381012260914;-2.5470422770013e-05;1.2601034541149e-05;-4.1665216485853e-06;0.00013545402907766;-0.00039894305518828;-3.7542609788943e-05;2.6276020435034e-05;-0.0001802457991289;-9.0378991444595e-05;6.3767642132007e-05;2.0454313926166e-05;-0.0002297569590155;0.00010588272562018;0.00085647514788434;-4.0682916733203e-05;0.00013424921780825;-5.8900863223244e-05;5.2519546443364e-05;0.00010141188977286;1.3027596651227e-05;-9.1049014372402e-06;-8.6196720076259e-05;-5.0675462262006e-05;0.0001217430253746;-2.5957360776374e-05;-4.9770591431297e-05;-3.9243266655831e-05;-0.00014349934644997;0.00045741439680569;-2.6003264792962e-05;-0.00075460434891284;0.00011833813914564;-4.7778241423657e-05;-0.00023404690728057;-0.00019463455828372;5.1249466196168e-05;-6.3309889810625e-05;3.1064129871083e-05;-7.7502263593487e-05;1.7747472156771e-05;4.7251720388886e-05;2.3293421691051e-05;0.00034070177935064;-1.0307040611224e-05;4.7255711251637e-05;-6.0264173953328e-05;-0.00069687282666564;-3.7331799831009e-05;-4.425015868037e-05;7.2198250563815e-05;-1.0195186405326e-05;2.4680102796992e-05;-0.0013561333762482;-9.250346920453e-06;-6.4290543377865e-05;-1.9140330550727e-05;0.00015032361261547;-3.4278134990018e-05;-0.00014528846077155;-0.00020928315643687;-0.00017099214892369;0.00016642396803945;0.00017390743596479;0.00050329312216491;-1.809782042983e-05;0.0010852596024051;4.0015198464971e-05;-6.3747575040907e-05;5.0797402764147e-06;0.00054288713727146;3.6237133826944e-06;-0.00022582347446587;1.989721749851e-05;0.00070097274146974;-0.00043630925938487;-0.00042074295924976;0.0003653223393485;-0.00027393366326578;0.00012066539784428;7.2764691140037e-05;-1.8273194655194e-05;-7.7755985330441e-06;1.9693656213349e-05;-0.00030916175455786;0.00029176060343161;0.00014083046698943;8.6455547716469e-05;-6.2926003010944e-05;-3.4890694223577e-05;-0.00030775830964558;-0.00019755128596444;-2.3627339032828e-05;0.00057398085482419;-1.8868544430006e-05;6.3209889049176e-05;1.2069665899617e-05;0.00025308120530099;-0.00039426697185263;-3.3890242775669e-05;1.8075746993418e-05;-0.0001549373700982;-9.5240960945375e-05;5.2923216571799e-05;1.8348095181864e-05;-0.00022275614901446;9.2060348833911e-05;0.00079477304825559;-3.2957967050606e-05;0.00017517765809316;-3.5003940865863e-05;6.4586143707857e-05;9.3921858933754e-05;1.1992588042631e-05;-8.7269027062575e-06;-3.7217807403067e-05;-3.9952617953531e-05;0.00013921290519647;-2.0427047275007e-05;-5.1875973440474e-05;-3.4231274185004e-05;-9.5893832622096e-05;0.00045447144657373;-2.3161421268014e-05;-0.00073267205152661;7.0000955020078e-05;-7.6941789302509e-05;-0.00021976967400406;-0.00022558901400771;3.9997321437113e-05;-8.1443125964142e-05;2.0373581719468e-05;-0.00010671676136553;1.1761489076889e-05;5.3862044296693e-05;2.3145985323936e-05;0.00022628324222751;3.1508468964603e-05;4.5282358769327e-05;-7.9555320553482e-05;-0.00052319042151794;-4.5222044718685e-05;-3.2358642783947e-05;5.5530908866785e-05;-4.8039751163742e-06;1.6507065083715e-05;-0.0010170581517741;-3.5918554203818e-05;-4.1017727198778e-05;-2.7823660275317e-05;0.00010883144568652;-2.3069591406966e-05;-9.6550509624649e-05;-0.0001656038366491;-0.00013479990593623;0.00011677548900479;0.00014455684868153;0.00038682529702783;-6.0082588788646e-06;0.00081139639951289;7.1231217589229e-05;-5.0676913815551e-05;4.8133492782654e-06;0.00040172279113904;1.3726204997511e-05;-0.00016699550906196;1.5661953511881e-05;0.00058976979926229;-0.00035358386230655;-0.000364998501027;0.00029293051920831;-0.00025754870148376;9.5052193501033e-05;5.8155739679933e-05;-1.2168041394034e-05;-8.1540492828935e-06;1.6724045053707e-05;-0.0002829248260241;0.00023376778699458;0.00010875381849473;7.4530282290652e-05;-4.4883458031109e-05;-2.7935551770497e-05;-0.00025375865516253;-0.00017879556980915;-2.5437489966862e-05;0.00049279315862805;-8.7799089669716e-06;7.1514965384267e-05;1.4429831935558e-05;0.00025067853857763;-0.00031643119291402;-2.8120282877353e-05;1.0784856385726e-05;-0.0001167559021269;-8.0337849794887e-05;3.6765155527974e-05;1.3963149285701e-05;-0.00018409642507322;7.0293732278515e-05;0.00063683080952615;-2.3484064513468e-05;0.00016734305245336;-1.5632169379387e-05;5.9174657508265e-05;7.5069772719871e-05;9.2535638032132e-06;-6.9095444814593e-06;-1.1546793757589e-05;-2.7815511202789e-05;0.00012484853505157;-1.3183911505621e-05;-4.210642146063e-05;-2.5956307581509e-05;-5.4338466725312e-05;0.00037910876562819;-1.7922955521499e-05;-0.00060401827795431;3.2402105716756e-05;-7.8214230597951e-05;-0.00017709129315335;-0.00020271555695217;2.7078051061835e-05;-7.814570562914e-05;1.0481994650036e-05;-9.9496173788793e-05;6.0224901972106e-06;4.5556967961602e-05;1.9209250240237e-05;-0.00084922538371757;0.00087058648932725;0.00042692772694863;-0.0004325772752054;7.3554758273531e-05;-0.00010492197907297;-4.148130028625e-05;7.8017612395342e-05;4.6082419430604e-05;-4.8181700549321e-05;0.00011046958388761;-0.0003533732087817;0.00021827167074662;-0.00022368445934262;1.7458812635596e-06;2.5998739147326e-05;5.0142352847615e-05;1.0522183401918e-05;-3.7323425203795e-05;-0.0002781716757454;0.00021356342767831;0.00018369696044829;-0.00014753013965674;-0.00027129802037962;0.00045270784175955;-8.5954743553884e-05;3.0916886316845e-05;-3.0376935683307e-05;0.00014632847160101;-7.4690033216029e-05;3.9257272874238e-05;0.00064243999077007;0.00025323752197437;-0.00038085767300799;-0.00015005352906883;-0.00041260843863711;-0.00021066507906653;0.0001258396951016;0.00012802254059352;-2.0735293219332e-05;-2.3355572920991e-05;-0.00058241147780791;-0.00027222782955505;0.00022539394558407;0.00020740990294144;1.1642561730696e-05;1.3985547411721e-05;-0.0002147501509171;-0.00019848803640343;-0.00012171372509329;0.00042821731767617;0.00020894229237456;0.00015767780132592;8.2278740592301e-05;0.00051188375800848;0.00022983504459262;-0.00015288886788767;-0.00014677060244139;-0.00013031123671681;-0.00014909043966327;-3.1647770811105e-05;-2.8230913812877e-05;-0.00033227060339414;-0.00019133627938572;0.00071511371061206;0.00041615494410507;0.0007175161736086;0.00057015928905457;0.00018816704687197;0.00016552388842683;-8.2699589256663e-06;5.3611603334502e-07;0.00018018526316155;0.00014686466602143;0.00027407583547756;0.00023044904810376;-1.1455502317403e-05;-6.459325504693e-06;0.00076533574610949;0.0011145538883284;8.8340530055575e-06;-0.0013267373433337;-0.0010031519923359;-0.00045120660797693;-0.0004416418960318;-0.00048793398309499;-0.00037804438034073;-0.00031629702425562;-0.0002497463428881;-0.00022005014761817;-0.00016744025924709;6.2551189330406e-05;3.6020705010742e-05;-0.0012963658664376;0.001285023521632;0.00066066283034161;-0.000625069020316;0.0001808393135434;-0.00014867859135848;-6.3041530665942e-05;0.00011206244380446;6.7063447204418e-05;-7.2693954280112e-05;0.00029512381297536;-0.00050573365297168;0.000312623946229;-0.0003101083857473;-5.4471543080581e-06;3.706110510393e-05;6.5051135607064e-05;4.6339970140252e-05;-3.2296738936566e-05;-0.00043980445479974;0.00030604281346314;0.00021358771482483;-0.00022256435477175;-0.00051522982539609;0.00064330146415159;-0.00011142676521558;4.1077906644205e-05;-7.6724209066015e-05;0.00019668351160362;-9.4744122179691e-05;5.7383600506e-05;0.00084734498523176;0.00044754112605006;-0.00050874124281108;-0.00027733415481634;-0.00058147037634626;-0.00035317873698659;0.00017975360970013;0.00019168172730133;-2.6731302568805e-05;-3.5311579267727e-05;-0.00082111830124632;-0.00046309808385558;0.0003134663857054;0.00029375264421105;1.7537222447572e-05;2.1203930373304e-05;-0.00030003045685589;-0.00029186854953878;-0.00018958123109769;0.00058132823323831;0.00033764171530493;0.00023258240253199;0.00014282290067058;0.00072737375739962;0.00041528407018632;-0.00021866588213015;-0.00021634054428432;-0.00017403639503755;-0.00020422335364856;-4.6081724576652e-05;-4.1502778913127e-05;-0.00046035216655582;-0.00029763524071313;0.00097692606505007;0.00064747745636851;0.0010337245184928;0.00085319235222414;0.0002653208503034;0.00023728699306957;-1.4462612853094e-05;9.70049541138e-07;0.0002510616031941;0.00021069998911116;0.00037118399632163;0.00033937636180781;-9.3830367404735e-06;-7.0431137828564e-06;0.0011318466858938;0.0016398197039962;2.2633683329332e-05;-0.0019035396398976;-0.0015170963015407;-0.00066464859992266;-0.00065014319261536;-0.00067912950180471;-0.00056851806584746;-0.00044503982644528;-0.00036620808532462;-0.00029132785857655;-0.00023788599355612;8.2628132076934e-05;4.8264857468894e-05;-0.0012333207996562;0.0011886013671756;0.00063677266007289;-0.000558000523597;0.00020701518224087;-0.00011194937542314;-6.0543799918378e-05;0.00010382587061031;6.2060826166999e-05;-6.9199137215037e-05;0.00035102420952171;-0.00043263242696412;0.00029522195109166;-0.00028055073926225;-1.0717108125391e-05;3.1951021810528e-05;4.5887096348451e-05;6.8843517510686e-05;-1.1921849363716e-05;-0.00042435346404091;0.00027137450524606;0.00016935290477704;-0.000230876612477;-0.00055096478899941;0.00055272120516747;-9.7268042736687e-05;3.936693246942e-05;-9.6357129223179e-05;0.00016800746379886;-8.0041965702549e-05;5.6671040510992e-05;0.00070669566048309;0.0004924553213641;-0.00042454793583602;-0.00030855648219585;-0.0005024250713177;-0.00035822117934003;0.00016451987903565;0.00018322710820939;-2.2548832930624e-05;-3.6074714444112e-05;-0.00071345124160871;-0.00048064475413412;0.00028764689341187;0.00027197939925827;1.5894420357654e-05;2.2110081772553e-05;-0.00026305028586648;-0.00025804367032833;-0.00017610247596167;0.00048992224037647;0.00033449291368015;0.00020191271323711;0.00014031465980224;0.00062673084903508;0.00044325983617455;-0.0002014878555201;-0.00020607572514564;-0.00016224164573941;-0.000186233461136;-4.1513532778481e-05;-3.9943133742781e-05;-0.00040968638495542;-0.00029774551512673;0.00085382629185915;0.00064669066341594;0.00094881764380261;0.00081568286987022;0.00024418966495432;0.00022100590285845;-1.5069967048476e-05;2.1587907212961e-06;0.00023140755365603;0.00020085262076464;0.00032876807381399;0.00032978798844852;-5.7386346270505e-06;-6.7054852479487e-06;0.0010668756440282;0.0015287470305339;2.2944808733882e-05;-0.0017368950648233;-0.0014577539404854;-0.00062065507518128;-0.00060579332057387;-0.00060700287576765;-0.00055467837955803;-0.00040594185702503;-0.00034939000033773;-0.00025960308266804;-0.00022806871857028;7.4846611823887e-05;4.4126009015599e-05;-0.00018943386385217;-3.0457355023827e-05;0.00022914487635717;-8.8042572315317e-05;0.00010383006156189;0.00040592945879325;-5.4997271945467e-05;5.0749764341163e-05;-7.4334622013339e-07;-9.455718100071e-06;0.00012626072566491;0.00067506468622014;7.0964706537779e-05;4.5514343582909e-06;6.7253326960781e-06;-8.2807346188929e-05;2.113358641509e-05;0.00016217347001657;0.00011903019913007;-0.00020335824228823;-2.5012375772349e-05;4.0066215660772e-06;-0.00037359865382314;-0.00021920635481365;-0.00053924991516396;-6.6013208197546e-06;3.5589815524872e-05;-4.0847189666238e-05;-0.00027300993679091;-1.4709066817886e-05;0.00013637583469972;-0.00035910960286856;0.00063102494459599;0.00027447598404251;-0.00042859616223723;7.8954217315186e-05;-0.00033210768015124;-7.2020247898763e-07;7.2204675234389e-05;2.017708720814e-05;-2.0597904949682e-05;0.00026471249293536;-0.0003425991453696;8.9250512246508e-05;8.2242142525502e-05;-3.4365202736808e-05;-2.8912807465531e-05;-0.0002312278811587;-0.0002009683084907;-4.1553197661415e-05;1.8542630641605e-05;0.00049922213656828;1.6331841834472e-05;0.00011584940511966;-0.00032974901841953;0.00038432164001279;7.861614903959e-06;-4.1564624552848e-05;-0.00011300831829431;-0.00010079867206514;2.0436606064322e-05;3.0270817660494e-05;4.4381307816366e-05;-0.00018200316117145;2.8315402232693e-05;0.00061958597507328;4.089515277883e-05;0.00024841618142091;8.2033075159416e-05;7.6870346674696e-05;-1.1307561180729e-05;1.4203776117938e-05;-1.2085278285667e-05;2.6130279366043e-05;9.3177459348226e-06;0.0001810055837268;-2.1694910174119e-05;-4.0259496017825e-05;6.7594551182992e-06;0.00043650777661242;-1.8048636775347e-05;-8.3098660979886e-05;-0.00062604446429759;-0.00018381803238299;-0.00013197553926148;-2.6581894871924e-06;-0.00029470017761923;-2.126389699697e-05;-0.0001105263872887;-1.8631579223438e-05;-0.00011230776726734;2.5486340746284e-05;3.0515335311065e-05;-0.00010720946738729;-0.00014837869093753;0.00017759374168236;-4.4914308091393e-05;7.0525362389162e-05;0.0005337594775483;-6.8038345489185e-05;6.2365936173592e-05;-8.3294535215828e-06;-1.1589382893362e-06;8.1169848272111e-05;0.00090440030908212;4.2358566133771e-05;4.3293388443999e-05;1.4464183550444e-05;-0.00012318149674684;3.3475953387097e-05;0.00018198318139184;0.00014152542280499;-0.00018252675363328;-6.9253175752237e-05;1.6319710994139e-05;-0.0004516108892858;-0.00015600153710693;-0.00075119466055185;5.6919911912701e-06;3.9868442399893e-05;-1.9291037460789e-05;-0.00038724826299585;-1.4863528122078e-05;0.00018440504209138;-0.00045537805999629;0.00069799565244466;0.00035236764233559;-0.00044700904982165;0.00013071433932055;-0.00033192257978953;-4.4219405026524e-06;8.2466605817899e-05;2.3191883883555e-05;-1.976300336537e-05;0.00034351510112174;-0.00037738736136816;8.9378852862865e-05;9.192375728162e-05;-4.2344730900368e-05;-4.2321222281316e-05;-0.00023947759473231;-0.00016651558689773;-3.8047241105232e-05;-3.6409317544894e-05;0.00050381344044581;-8.6668787844246e-06;0.00010248155740555;-0.000421899050707;0.00039823105907999;1.8288616047357e-05;-4.4185100705363e-05;-0.00012158230674686;-0.00010729258065112;2.7282869268674e-05;4.2972282244591e-05;7.5283816840965e-05;-0.00020904913253617;-6.3816428337304e-06;0.00073850690387189;-3.7560578221019e-06;0.00024095011758618;8.6900210590102e-05;6.2942875956651e-05;-1.4028360055818e-05;1.7642820239416e-05;-3.5968605516246e-05;-1.3737873814534e-05;-1.1294356227154e-05;0.0001763809559634;-2.5894207283272e-05;-4.0110073314281e-05;-4.8886653530644e-05;0.00046138631296344;-1.4810324501013e-05;-5.7489737628202e-06;-0.00070352840702981;-0.00020462230895646;-0.00011507230374264;3.1178693461698e-05;-0.00030883273575455;2.3619290914212e-06;-9.5700132078491e-05;1.0344741667723e-06;-8.2148268120363e-05;2.3754279027344e-05;2.124700404238e-05;-1.0053632649942e-05;-0.00025422018370591;0.00010570801532594;-6.5308668126818e-06;2.305311136297e-05;0.00060686317738146;-7.2715993155725e-05;6.8686102167703e-05;-1.507553497504e-05;6.5345843722753e-06;1.0187647603743e-05;0.0010521835647523;1.5972203982528e-05;6.5542582888156e-05;2.2487816750072e-05;-0.0001517359924037;5.0597140216269e-05;0.0001843728532549;0.0001470541319577;-0.00014697448932566;-0.00010751495574368;3.494521297398e-05;-0.0004875409649685;-6.3127547036856e-05;-0.00088014517677948;1.1245620044065e-05;4.4650012569036e-05;5.3106596169528e-06;-0.00046083476627246;-1.6705225789337e-05;0.00021778087830171;-0.00046446334454231;0.00065656908554956;0.0003665289550554;-0.00037602204247378;0.00014475655916613;-0.00025144394021481;-6.9833222369198e-06;8.3785955212079e-05;2.0685163690359e-05;-1.5209115190373e-05;0.00035759917227551;-0.00032491888850927;7.8412595030386e-05;0.00010758408461697;-4.363992047729e-05;-5.3645359002985e-05;-0.00023067409347277;-0.00010405666398583;-2.2458634703071e-05;-6.0366724937921e-05;0.00042184503399767;-3.1827559723752e-05;5.4773641750216e-05;-0.00043745836592279;0.0003004981263075;2.7546555429581e-05;-4.5234333811095e-05;-0.00011432047904236;-0.00011912880290765;2.9500737582566e-05;5.1765931857517e-05;9.7020849352702e-05;-0.00021659804042429;-2.8256659788894e-05;0.00079267285764217;-4.4008073018631e-05;0.00020253218826838;8.7727588834241e-05;4.5103432057658e-05;-1.4492592526949e-05;1.917831832543e-05;-5.423527181847e-05;-5.7874025515048e-05;-2.2385584088624e-05;0.00015727216668893;-2.9398792321444e-05;-3.5380318877287e-05;-0.00010586523421807;0.00044160278048366;-1.5100581549632e-05;6.8541005020961e-05;-0.00071079726330936;-0.0002069251058856;-8.1648817285895e-05;5.3702806326328e-05;-0.00028605575789697;2.0305285943323e-05;-7.4833129474428e-05;1.3409458915703e-05;-4.6606586693088e-05;2.1334855773603e-05;1.0058235602628e-05;7.4993949965574e-05;-0.00029398238984868;2.601821506687e-05;2.2497877580463e-05;-2.6038725991384e-05;0.0005237094592303;-5.8361893024994e-05;6.1055667174514e-05;-1.7435328118154e-05;1.0918751286226e-05;-5.9082994994242e-05;0.00097188324434683;-5.0280091272725e-06;5.4567572078668e-05;2.4234317606897e-05;-0.00015028106281534;5.0899336201837e-05;0.00015155800792854;0.00011742677452276;-8.4193161455914e-05;-0.00011739494220819;4.3210926378379e-05;-0.00041106378193945;3.0942013836466e-05;-0.00078739540185779;1.1474591701699e-05;4.9621601647232e-05;2.5406568965991e-05;-0.00043583108345047;-1.6619134839857e-05;0.0002122890582541;-0.00034606221015565;0.00045198822044767;0.00028339633718133;-0.00016733510710765;0.00010514952009544;-7.3117655119859e-05;-4.2081269384653e-06;6.7286666308064e-05;1.0649792784534e-05;-5.0776466196112e-06;0.00027174325077794;-0.00017212235252373;4.8594309191685e-05;0.00012090511154383;-3.5468387068249e-05;-5.5904871260282e-05;-0.00018787960289046;4.332696335041e-06;4.6715458665858e-06;-4.4398475438356e-05;0.00020102858252358;-5.5752629123162e-05;-2.6055136913783e-05;-0.00033274490851909;6.9915731728543e-05;3.3387168514309e-05;-4.1355782741448e-05;-8.0112942669075e-05;-0.00011826899572043;2.5098775950028e-05;4.771714884555e-05;0.00010078639024869;-0.00018639017071109;-3.6526969779516e-05;0.00072993646608666;-7.2705166530795e-05;0.00011176711996086;7.7735407103319e-05;1.523108130641e-05;-1.1204931070097e-05;1.6413703633589e-05;-6.1568600358441e-05;-0.0001248066109838;-2.3029462681734e-05;0.00010639878018992;-2.9674660254386e-05;-1.6124162357301e-05;-0.00015342331607826;0.00034634722396731;-1.6144897017512e-05;0.00013159704394639;-0.00060015899362043;-0.00017879677761812;-2.0567002138705e-05;5.9416081057861e-05;-0.00019087381951977;3.1063209462445e-05;-4.1871389839798e-05;1.8729891962721e-05;1.4968486539146e-05;1.6012876585592e-05;-1.2536849681055e-05;0.00043634252506308;-5.5479002185166e-05;-6.7252585722599e-05;-5.4690299293725e-05;-0.00083674531197175;4.9389445848647e-06;-6.0682257753797e-05;8.1172365753446e-05;-2.2287060346571e-05;3.2968928280752e-05;-0.0016186630818993;1.9604818589869e-05;-0.00011448715667939;5.5099717428675e-06;0.00021678385382984;-3.3723506930983e-05;-8.6690750322305e-05;-0.00025848374934867;-0.00019811709353235;0.00023692850663792;0.00012401932326611;0.00059633771888912;-1.0295303582097e-05;0.0013597417855635;1.1795097634604e-05;-8.4195387898944e-05;-2.0317775124568e-05;0.000697749434039;-1.7907927031047e-05;-0.00030164129566401;1.7766340533854e-05;0.00088923348812386;-0.00057528424076736;-0.00041905153193511;0.00047442142385989;-0.00036889375769533;0.00017365293751936;8.5447922174353e-05;-9.421115692021e-07;-1.0564614058239e-05;2.8599673896679e-05;-0.00060060352552682;0.00039419095264748;0.00016861713083927;0.0001067813791451;-4.8322268412448e-05;-5.7211975217797e-05;-0.00038667602348141;-0.0001677686086623;-4.6924284106353e-05;0.00059013674035668;-3.4640725061763e-05;0.00011675769201247;-3.8377722376026e-05;0.00043455263948999;-0.00052528211381286;-6.6467662691139e-05;2.8553444280988e-05;-7.250982162077e-05;-0.00012225455429871;2.0549798136926e-05;3.0280340070021e-05;-0.00029961741529405;0.00013658046373166;0.0011421394301578;-6.6802131186705e-05;0.00025307064061053;-6.8937151809223e-05;3.2349165849155e-05;0.00012441222497728;1.6232746929745e-05;-1.4592962543247e-05;-0.00016588503785897;-6.5458450990263e-05;0.00015704151883256;-3.9654805732425e-05;-2.005210990319e-05;-4.6972785639809e-05;-0.00016189480083995;0.00061226589605212;-1.7016977835738e-06;-0.0010234275832772;0.00014393737365026;-8.7141619587783e-05;-0.00032014556927606;-0.00032719981390983;7.4479488830548e-05;-8.1541700637899e-05;4.2881900299108e-05;1.0364984518674e-05;2.5045883376151e-05;-8.1440493886475e-06;2.8368032872095e-05;0.00031031403341331;2.6066280042869e-05;-1.3980856238049e-05;-0.0001053406012943;-0.00071719981497154;-3.4048978704959e-05;-5.2334140491439e-05;7.630525942659e-05;-1.4713489690621e-05;2.4400487745879e-05;-0.0013740932336077;-3.945543357986e-05;-9.5931565738283e-05;-1.3217710147728e-05;0.00017809607379604;-2.5734212613315e-05;-6.5943611843977e-05;-0.00022226727742236;-0.00017990297055803;0.00016635145584587;0.00014226815255824;0.00052438850980252;-1.9732754026336e-06;0.0011552014620975;8.3702623669524e-05;-7.0080081059132e-05;-1.5924835679471e-05;0.00058908620849252;2.0623328964575e-06;-0.00025108444970101;1.4983640539867e-05;0.00088447704911232;-0.00054784404346719;-0.00049465516349301;0.0004455263260752;-0.00044678323320113;0.00016211754700635;8.0214311310556e-05;-1.9858177893184e-06;-1.375222018396e-05;3.013765126525e-05;-0.00062132527818903;0.00036844829446636;0.00013128962018527;0.00010985681728926;-3.9627531805309e-05;-5.1640821766341e-05;-0.00036336679477245;-0.00022744481975678;-6.2579310906585e-05;0.00066237366991118;-3.0190551115084e-05;0.00016151575255208;-6.7748501351161e-06;0.00053549720905721;-0.00049223349196836;-5.4861506214365e-05;1.7508424207335e-05;-5.8240842918167e-05;-0.0001204432483064;1.8905862816609e-05;2.588101051515e-05;-0.00027054097154178;0.00011034168710466;0.00098983163479716;-5.2029336075066e-05;0.00027010129997507;-3.4664404665818e-05;4.6225028199842e-05;0.00011009183072019;1.4153744814394e-05;-1.3626682630274e-05;-9.4441151304636e-05;-4.8788449930726e-05;0.00015940150478855;-3.1889438105281e-05;-2.7569876692723e-05;-3.8571237382712e-05;-9.3236529210117e-05;0.00057725887745619;-3.7708255717916e-07;-0.00093480636132881;7.3905721365009e-05;-0.00011123498552479;-0.0002880354586523;-0.00032459289650433;5.599136420642e-05;-9.1698850155808e-05;2.8055877919542e-05;-3.3548243663972e-05;1.7981714336202e-05;9.8476384664536e-06;2.6463971153134e-05;0.00018831800844055;7.0051581133157e-05;-1.1820152394648e-06;-0.0001211101480294;-0.00052696408238262;-4.5786058763042e-05;-3.9033991924953e-05;5.8847264881479e-05;-8.3510085460148e-06;1.5522880858043e-05;-0.0010116418125108;-6.7738532379735e-05;-6.8368055508472e-05;-2.2121363144834e-05;0.00013053006841801;-1.4959237887524e-05;-2.6643472665455e-05;-0.00017152084910776;-0.00013985449913889;0.0001082180388039;0.00011783450463554;0.00039598543662578;8.4509201769833e-06;0.00085233128629625;0.00011410252773203;-5.4655978601659e-05;-1.3839311577613e-05;0.00043538183672354;1.3008875612286e-05;-0.00018547810032032;1.066532695404e-05;0.00073529273504391;-0.00044061875087209;-0.00042585632763803;0.00035381293855608;-0.00039641527109779;0.00012730497110169;6.5029606048483e-05;1.8284036968907e-06;-1.2680301551882e-05;2.5015609935508e-05;-0.00053640833357349;0.00029171223286539;9.9575961939991e-05;9.2641821538564e-05;-2.6793404686032e-05;-4.1257742850576e-05;-0.00029312478727661;-0.00020023743854836;-5.868239531992e-05;0.00055940600577742;-2.0373874576762e-05;0.00015095283742994;2.8345382929729e-07;0.00048261668416671;-0.00038980125100352;-4.5506607420975e-05;9.3467742772191e-06;-3.8081820093794e-05;-9.9781864264514e-05;1.0606683645165e-05;2.0193459931761e-05;-0.00022401899332181;8.4297753346618e-05;0.0007900504861027;-4.0257753425976e-05;0.00024696163018234;-1.1029950655939e-05;4.3159237975487e-05;8.7872598669492e-05;1.0903634574788e-05;-1.1346505743859e-05;-5.6356366258115e-05;-3.4997490729438e-05;0.00013754960673396;-2.388286338828e-05;-2.1972935428494e-05;-2.853559635696e-05;-4.1095128835877e-05;0.00048509379848838;2.5079416445806e-06;-0.00077368732308969;2.6062500182888e-05;-0.00010852089326363;-0.00023505787248723;-0.00028190019656904;4.0967257518787e-05;-8.4765459178016e-05;1.5979194358806e-05;-3.7568290281342e-05;1.224914285558e-05;9.7184984042542e-06;2.1620322513627e-05;-0.0013191166799515;0.0012824111618102;0.00063101691193879;-0.00060735980514437;0.00027167180087417;-0.00020996875537094;-6.2652674387209e-05;0.00010093999298988;6.0938076785533e-05;-6.798334652558e-05;0.00047513699973933;-0.00057863019173965;0.00022643177362625;-0.00023351833806373;-1.1024798368453e-05;3.7675483326893e-05;8.0338002589997e-05;5.7336263125762e-05;-1.7881216990645e-05;-0.00044335794518702;0.00028899376047775;0.00011010433081537;-0.00014069098688196;-0.00060913269408047;0.00067572761327028;-6.6164975578431e-05;1.1133618500025e-05;-8.109025657177e-05;0.00016384637274314;-6.3957100792322e-05;3.8827485695947e-05;0.0007613503257744;0.00042816557106562;-0.00047936986084096;-0.00028919673059136;-0.00057719554752111;-0.00037146115209907;0.00017488344747107;0.00018873126828112;-1.9879362298525e-05;-2.4730614313739e-05;-0.0008607676718384;-0.00051277363672853;0.00025678597739898;0.0002474385255482;1.8268823623657e-05;1.1961035852437e-05;-0.00023704978229944;-0.00026290252571926;-0.0002310930431122;0.00049909617519006;0.00029780244221911;0.00026026595151052;0.00017652814858593;0.00079716905020177;0.00049068441148847;-0.00021005183225498;-0.00020286440849304;-0.00010269536142005;-0.00015179536421783;-4.4045642425772e-05;-3.1258576200344e-05;-0.00042453082278371;-0.00028231472242624;0.00087956670904532;0.0005972888902761;0.00099368568044156;0.00081861577928066;0.00022008594532963;0.00020004567340948;-1.7823607777245e-05;-4.0804461605148e-06;0.00020193507953081;0.00016202825645451;0.00028760285931639;0.00026034816983156;9.5892492026906e-06;5.9897724895563e-06;0.0011383871315047;0.0016382427420467;6.476636917796e-05;-0.0018629386322573;-0.0015149189857766;-0.00066025351407006;-0.00064910406945273;-0.00060961308190599;-0.00049877568380907;-0.00038044693064876;-0.00031007872894406;-0.00019023031927645;-0.00015410102787428;5.1810460718116e-05;2.9221673685242e-05;-0.0013081972720101;0.0012485795887187;0.00064084830228239;-0.00057249510427937;0.00029079840169288;-0.00018666616233531;-6.2689272454008e-05;9.8671480373014e-05;5.9741036238847e-05;-6.7170825786889e-05;0.00051621801685542;-0.00053537089843303;0.00022666971199214;-0.00022152499877848;-1.6343445167877e-05;3.2916672353167e-05;5.6889904954005e-05;7.339410512941e-05;-4.546307536657e-06;-0.00044094424811192;0.00027772458270192;8.7505810370203e-05;-0.00015594300930388;-0.00065008585806936;0.00062210625037551;-5.880197204533e-05;1.3565947483585e-05;-9.7582138550933e-05;0.00014706629735883;-5.6259810662596e-05;4.1925195546355e-05;0.00066985905868933;0.00048928131582215;-0.00042376160854474;-0.00032944150734693;-0.00052498286822811;-0.00039704443770461;0.0001693516242085;0.00018781020480674;-1.688612428552e-05;-2.7283222152619e-05;-0.00078359572216868;-0.000554091820959;0.00025120479403995;0.00023916906502564;1.5396639355458e-05;1.4541094060405e-05;-0.00022247861488722;-0.00024972585379146;-0.00022584697580896;0.00044715829426423;0.0003152571443934;0.00023853893799242;0.00018455846293364;0.00072073226328939;0.00053934834431857;-0.00020309234969318;-0.00020200322614983;-0.0001079344729078;-0.00014152540825307;-4.0039612940745e-05;-3.2473435567226e-05;-0.00039786321576685;-0.00029439222998917;0.00081224291352555;0.00062709668418393;0.000957292097155;0.00081923592370003;0.00021542164904531;0.00019441021140665;-1.908094418468e-05;-2.4520400074834e-06;0.00019681817502715;0.00016018813767005;0.0002684824867174;0.00026633564266376;1.0143354302272e-05;6.283885340963e-06;0.0011201864108443;0.0016044043004513;6.4103849581443e-05;-0.0017873687902465;-0.0015230870340019;-0.00064857769757509;-0.00063358619809151;-0.00057227449724451;-0.00051178084686399;-0.00036588980583474;-0.00030967744532973;-0.00018132326658815;-0.0001532173337182;5.1532639190555e-05;2.639313970576e-05;-0.00023959745885804;1.1082379387517e-06;0.00027329885051586;-3.8243324524956e-05;0.00011509415344335;0.00042041920823976;-6.2529368733522e-05;6.0161477449583e-05;-6.6873889181807e-07;-4.9169802878168e-06;0.00019493290164974;0.00069892266765237;5.3365514759207e-05;4.5026499719825e-05;-3.0899045668775e-06;-0.00011177755368408;-4.874150181422e-05;0.00017437666247133;0.0001306584890699;-0.00017566440510564;-2.4257145923912e-05;-2.1836776795681e-05;-0.00038773418054916;-0.00028875735006295;-0.00060405203839764;2.4179187676054e-05;3.6353649193188e-05;-4.2498988477746e-05;-0.00033025693846866;-5.5995433285716e-06;0.00016232470807154;-0.00050129531882703;0.00080689747119322;0.00037140815402381;-0.00052458519348875;0.00014603555609938;-0.00047953458852135;1.3302704246598e-05;8.4548424638342e-05;2.9411199648166e-05;-2.608634349599e-05;0.00036397328949533;-0.00058672891464084;0.00010632822522894;6.6744098148774e-05;-4.9147587560583e-05;-1.6439138562419e-05;-0.00024510401999578;-0.00020027959544677;-7.6277603511699e-05;-4.2810872400878e-05;0.00056587386643514;-1.1103879842267e-05;0.0001962291134987;-0.00044480350334197;0.00062875973526388;5.6484414017177e-06;-5.6278255215148e-05;-0.00013649508764502;-3.1484840292251e-05;3.007348459505e-05;1.322099706158e-05;6.9102286943235e-05;-0.00023528751626145;-8.3726527009276e-06;0.00079945253673941;4.333489050623e-05;0.00032521289540455;9.3977563665248e-05;5.3237261454342e-05;-1.8316621208214e-05;1.7968799511436e-05;-2.9509634259739e-05;-2.599765866762e-05;-1.469824474043e-05;0.00018496639677323;-2.1356994693633e-05;-1.9416653231019e-05;3.0929328204365e-05;0.00056851113913581;6.9471202550631e-06;-9.0552064648364e-05;-0.00083559338236228;-0.00025301225832663;-0.00016099018102977;2.7358017177903e-05;-0.00036702741635963;-9.3894705059938e-06;-0.00010969032155117;1.9109027107334e-06;-4.0632134187035e-05;2.4690185455256e-05;-7.7561162470374e-06;-0.0001593345659785;-0.00012685739784501;0.00023436693300027;1.8565202708487e-06;7.9650184488855e-05;0.00057939265388995;-7.6849857578054e-05;7.4017385486513e-05;-8.2988544818363e-06;1.9788174085988e-06;0.00013760499132331;0.00097309233387932;3.7614478060277e-05;7.4494637374301e-05;6.2748604250373e-06;-0.00015361003170256;-3.2216255931417e-05;0.00020729860989377;0.00015930051449686;-0.00016781833255664;-7.6870281191077e-05;-2.8233907869435e-06;-0.00049446302000433;-0.00022545825049747;-0.00084899493958801;2.9743288905593e-05;4.4971780880587e-05;-2.3666230845265e-05;-0.00045080596464686;-9.7763158919406e-06;0.00021618571190629;-0.00060327025130391;0.00090127496514469;0.00045592774404213;-0.00055677606724203;0.0001940899528563;-0.0004897610633634;8.8808119471651e-06;9.641168435337e-05;3.2777465094114e-05;-2.7045763999922e-05;0.00045355979818851;-0.00062468100804836;0.00011387887207093;8.6324827861972e-05;-5.8483878092375e-05;-2.8908172680531e-05;-0.00027690865681507;-0.00018432180513628;-6.9888643338345e-05;-7.8583863796666e-05;0.00060016219504178;-3.488162838039e-05;0.00018543627811596;-0.00055198022164404;0.00064307916909456;1.726773007249e-05;-6.1694183386862e-05;-0.00015432384680025;-4.9007034249371e-05;3.7209352740319e-05;2.4235147066065e-05;0.0001009634215734;-0.00027077316190116;-3.2652798836352e-05;0.0009535230929032;-7.1220671316041e-07;0.00033115124097094;0.00010588320583338;4.8926303861663e-05;-2.061453233182e-05;2.2336094843922e-05;-5.0603714043973e-05;-5.8741883549374e-05;-2.695501279959e-05;0.00020094812498428;-2.8827933419961e-05;-2.3078973754309e-05;-3.6315701436251e-05;0.00060695788124576;3.4073864298989e-06;-1.1792200893979e-05;-0.00093491852749139;-0.00027838378446177;-0.00014947915042285;5.4561289289268e-05;-0.000402723060688;9.0724415713339e-06;-0.00010815336281667;1.218043598783e-05;-2.8809139621444e-05;2.6592006179271e-05;-1.2967799193575e-05;-4.5731310819974e-05;-0.0002620276354719;0.0001620116236154;7.1255926741287e-05;1.6621521353954e-05;0.00068817980354652;-8.1861864600796e-05;8.2618367741816e-05;-1.6319561837008e-05;1.0575725355011e-05;4.8749800043879e-05;0.0011777045438066;1.4453238691203e-05;9.8093725682702e-05;1.4555933375959e-05;-0.00019001869077329;-2.9092809199938e-05;0.00022498163161799;0.00017090811161324;-0.00011972810170846;-0.00013972815941088;1.7737176676746e-05;-0.00055622158106416;-0.00012082188914064;-0.0010338121792302;3.653442763607e-05;5.4564763559029e-05;3.4817435334844e-06;-0.00054387660929933;-1.3929960914538e-05;0.00026014228933491;-0.00063105416484177;0.00088403694098815;0.00048554482054897;-0.00047186476876959;0.00021554580598604;-0.00040239150985144;8.5063438746147e-06;9.9344324553385e-05;3.0234425139497e-05;-2.3041091480991e-05;0.0004875572049059;-0.00058656476903707;0.00010627878509695;0.00011524720321177;-6.2861639889888e-05;-3.8861799112055e-05;-0.00028322567231953;-0.00010676855163183;-4.9801914428826e-05;-0.00010073094745167;0.00050637393724173;-7.2606882895343e-05;0.0001321567397099;-0.0005912616616115;0.00053557771025226;2.9759836252197e-05;-6.8699242547154e-05;-0.0001540367375128;-6.2622370023746e-05;4.158401497989e-05;2.8645710699493e-05;0.00013544697139878;-0.00029850506689399;-6.0578502598219e-05;0.0010830155806616;-5.2606268582167e-05;0.0003078029549215;0.00011365114914952;3.0496512408718e-05;-2.1774631022708e-05;2.5680876206025e-05;-7.5476629717741e-05;-0.00011709472164512;-3.8311845855787e-05;0.00019713237998076;-3.5559121897677e-05;-1.5581799743813e-05;-0.00011443501716712;0.00060901802498847;1.0049615184471e-06;8.5052983195055e-05;-0.00099343550391495;-0.00029266549972817;-0.00011597387492657;8.4825638623443e-05;-0.0004067386907991;2.9311060643522e-05;-9.4639777671546e-05;2.3592099751113e-05;1.2740790225507e-05;2.6320127290091e-05;-3.1715237128083e-05;0.00031740809208713;-8.2780716184061e-06;-9.9314063845668e-05;-8.3303901192266e-05;-0.00067694491008297;1.5972996152414e-06;-5.1677292503882e-05;6.6035769123118e-05;-1.9007482478628e-05;2.4995424610097e-05;-0.0012832743814215;-1.3917241631134e-05;-0.00010941171058221;1.8891557829193e-06;0.00018327413999941;-1.9689796317834e-05;-9.9095295809093e-06;-0.00021818990353495;-0.00016468547983095;0.00019222797709517;7.8540557296947e-05;0.00048738924670033;6.7963469518872e-06;0.0011194506660104;5.1928211178165e-05;-6.8977591581643e-05;-2.9033017199254e-05;0.00057050009490922;-1.0050044693344e-05;-0.00024764964473434;1.1281103979854e-05;0.00084732135292143;-0.00053982948884368;-0.0004067512054462;0.00043630047002807;-0.000426281534601;0.00017068891611416;7.2561058914289e-05;9.4810102382326e-06;-1.3768936696579e-05;3.0261684514699e-05;-0.00069010572042316;0.0003698815125972;0.0001246666215593;0.00010362115426688;-2.1361398466979e-05;-5.6124954426195e-05;-0.00034582585794851;-0.00016419574967586;-6.350865442073e-05;0.00055253237951547;-3.8724931073375e-05;0.00016525429964531;-4.1594325011829e-05;0.00055213639279827;-0.00049029686488211;-6.5159583755303e-05;2.0349472833914e-05;3.1404622404807e-06;-0.00011672561959131;-6.5516564973223e-06;2.8609742003027e-05;-0.0002779126225505;0.00012240072828718;0.0010389019735157;-6.8547225964721e-05;0.0002816065098159;-5.1070921472274e-05;2.0495645003393e-05;0.00010914291488007;1.4507199921354e-05;-1.4951682715036e-05;-0.00014802087389398;-5.7674445997691e-05;0.00014868668222334;-3.9197384467116e-05;-3.5318257687322e-06;-3.9215246943058e-05;-0.00011429483129177;0.00057540804846212;1.2739148587571e-05;-0.00095872225938365;0.00010750773799373;-0.00010280928108841;-0.00029781376360916;-0.00034292848431505;7.1349662903231e-05;-8.0393103417009e-05;3.673515675473e-05;3.832330548903e-05;2.3322450942942e-05;-2.9313516279217e-05;2.5270315745729e-05;0.00025005746283568;6.5416097640991e-05;-9.3378170276992e-05;-0.00014570010534953;-0.00066284195054322;-2.6497787985136e-05;-5.2385879826033e-05;6.9254063419066e-05;-1.612498817849e-05;2.1011059288867e-05;-0.0012508018407971;-7.1339251007885e-05;-0.0001124400732806;-1.2425255590642e-05;0.00018142677436117;-1.2551743566291e-05;3.1875828426564e-05;-0.00022251751215663;-0.00017171108629555;0.00016556037007831;8.8842723926064e-05;0.00049086648505181;2.1842841306352e-05;0.0011067418381572;0.00012801837874576;-7.0147769292817e-05;-3.5008477425436e-05;0.00056490895804018;5.0443627515051e-06;-0.00024423305876553;9.2377358669182e-06;0.00096947769634426;-0.00059761590091512;-0.00050257018301636;0.00047506805276498;-0.00053817476145923;0.00018734589684755;8.0210549640469e-05;1.4975938029238e-05;-1.7986501916312e-05;3.5345008654986e-05;-0.00082705420209095;0.00040281633846462;0.00011985309538431;0.00012036370026181;-1.482497464167e-05;-6.1397331592161e-05;-0.00037544150836766;-0.0002120229328284;-8.5644045611843e-05;0.00065664621070027;-4.3139676563442e-05;0.00022098080080468;-3.4280765248695e-05;0.00070996006252244;-0.00053325475892052;-7.220235420391e-05;1.4519887372444e-05;2.3988459361135e-05;-0.00013254582881927;-1.3984708857606e-05;3.058878792217e-05;-0.00031054322607815;0.00012583522766363;0.0011127160396427;-7.475825259462e-05;0.00035414678859524;-2.965403291455e-05;2.9529970561271e-05;0.00011669927334879;1.525693005533e-05;-1.7443873730372e-05;-0.00012721649545711;-5.6336615671171e-05;0.00017332370043732;-4.2179617594229e-05;-3.5983239285997e-06;-3.8241538277362e-05;-6.8390356318559e-05;0.00065804657060653;2.0418554413482e-05;-0.001074799336493;6.4452382503077e-05;-0.00014254265988711;-0.000329675123794;-0.00040726186125539;7.3501243605278e-05;-0.00010149007721338;3.0921120924177e-05;2.7637868697639e-05;2.3403421437251e-05;-2.9532844564528e-05;2.7775216949522e-05;0.0001307168713538;0.00012131367111579;-8.1013196904678e-05;-0.00017155938257929;-0.00049744098214433;-4.2696883610915e-05;-4.1355826397194e-05;5.5233813327504e-05;-1.0069052223116e-05;1.2612426871783e-05;-0.00093992968322709;-0.00010982081585098;-8.9295768702868e-05;-2.2469215764431e-05;0.00014124388690107;-1.8220134734293e-06;7.3711220466066e-05;-0.0001806101645343;-0.00013922181096859;0.00011141567665618;6.9579771661665e-05;0.00038220634451136;3.4243974369019e-05;0.00084745167987421;0.00017073571507353;-5.7876328355633e-05;-3.4908396628452e-05;0.00043589202687144;1.7713298802846e-05;-0.00018897165136877;4.9907694119611e-06;0.00085388828301802;-0.00050771457608789;-0.00044911718578078;0.00039631917024963;-0.00049305881839246;0.0001565473357914;7.0502639573533e-05;1.9998235075036e-05;-1.697380139376e-05;3.0554718250642e-05;-0.00075842544902116;0.00033485449966975;9.8438227723818e-05;0.00010678455873858;-5.5256946325244e-06;-5.2495539421216e-05;-0.00031508022220805;-0.0001846596278483;-8.3609476860147e-05;0.00056801096070558;-3.6674373404821e-05;0.00020929734455422;-2.8835211196565e-05;0.00066517340019345;-0.00044255517423153;-6.7732005845755e-05;5.9143862927158e-06;3.5403398214839e-05;-0.00011587588232942;-1.9364824765944e-05;2.6010746296379e-05;-0.00028279938851483;0.00010500354983378;0.00096274970564991;-6.6914813942276e-05;0.00035139371175319;-9.2417656105681e-07;2.924540785898e-05;0.00010013834253186;1.2574302672874e-05;-1.6290394341922e-05;-8.903794514481e-05;-4.4926146074431e-05;0.00015790993347764;-3.6681649362436e-05;6.0727575146302e-07;-2.8880722311442e-05;-4.7184466893668e-06;0.0006062940810807;2.4903638404794e-05;-0.00097405147971585;6.0113525250927e-06;-0.00015035341493785;-0.00029492980684154;-0.00038311359821819;6.1791615735274e-05;-9.9792479886673e-05;1.8224916857434e-05;2.1248783014016e-05;1.9480743503664e-05;-2.8174403269077e-05;2.4011495042942e-05;-0.0012305536074564;0.0011818894417956;0.00058556773001328;-0.00057427317369729;0.00032359472243115;-0.00025298853870481;-5.6472337746527e-05;8.4229242929723e-05;5.2278774091974e-05;-5.965008676867e-05;0.0005647882935591;-0.00059509865241125;0.00015253588207997;-0.00016757985576987;-1.434286696167e-05;3.5839599149767e-05;8.5951658547856e-05;5.8468784118304e-05;-7.9570372690796e-06;-0.00042586863855831;0.0002708830870688;2.4337923605344e-05;-6.2359518778976e-05;-0.00064413819927722;0.00067238823976368;-3.0107723432593e-05;-9.6697749540908e-06;-7.8754681453574e-05;0.00013210058386903;-3.8190693885554e-05;2.3151415007305e-05;0.00065236160298809;0.00036467611789703;-0.0004359987215139;-0.00026651483494788;-0.00056113017490134;-0.00036737410118803;0.00015198648907244;0.00016425820649602;-1.339938989986e-05;-1.3820083950122e-05;-0.00082822161493823;-0.00049445772310719;0.00018924102187157;0.00019136237096973;1.7545329683344e-05;4.3976569941151e-06;-0.00021422799909487;-0.00027354192570783;-0.00024360901443288;0.0004630176408682;0.00028613157337531;0.00027964886976406;0.00020240449521225;0.0008005597628653;0.00049453641986474;-0.00017794770246837;-0.00016910667181946;-3.8873484299984e-05;-0.00010018077591667;-4.0635393816046e-05;-2.3087921363185e-05;-0.00036021971027367;-0.00024059378483798;0.00075261871097609;0.0005138530395925;0.00088325300021097;0.00072169955819845;0.00017228270007763;0.00016009037790354;-1.8578581148176e-05;-7.7762379078194e-06;0.00014884368283674;0.00011227597133256;0.00021085974003654;0.00018461757281329;2.1703717720811e-05;1.4310953702079e-05;0.0010117496130988;0.0015044900355861;8.8028114987537e-05;-0.0016742934240028;-0.0013710272032768;-0.00060463132103905;-0.0005981067661196;-0.00051651312969625;-0.00040753011126071;-0.00030543567845598;-0.0002445770369377;-0.00010611390462145;-8.2993377873208e-05;2.4955968910945e-05;1.2757585864165e-05;-0.0012312073959038;0.0011595508549362;0.00060870550805703;-0.00054092338541523;0.00034261611290276;-0.00022856458963361;-5.7306006056024e-05;8.3471008110791e-05;5.2107687224634e-05;-5.9027781389887e-05;0.00060776591999456;-0.00054963561706245;0.00015863281441852;-0.00015671177243348;-2.1568903321167e-05;2.8617125281016e-05;5.2280312957009e-05;7.3746952693909e-05;5.6955591389851e-06;-0.0004230841586832;0.0002667999942787;4.292937774153e-06;-8.2656115409918e-05;-0.00069538335083053;0.00061506446218118;-2.2399670342566e-05;-4.9551817937754e-06;-9.7582764283288e-05;0.00011298507160973;-3.0615414289059e-05;2.9289867597981e-05;0.00054042902775109;0.00045878911623731;-0.00036333035677671;-0.00033157199504785;-0.00049212004523724;-0.00041828511166386;0.00014827531413175;0.00016557968046982;-8.9726245278143e-06;-1.8527878637542e-05;-0.00072468590224162;-0.00056825781939551;0.00019243318820372;0.00018188745889347;1.1829321920231e-05;9.3087437562644e-06;-0.00020450970623642;-0.00026459005312063;-0.00023996974050533;0.00040194333996624;0.00032551359618083;0.00025083555374295;0.00022088071273174;0.00069155677920207;0.00058096746215597;-0.00017256423598155;-0.00017064089479391;-5.6261225836352e-05;-8.5221683548298e-05;-3.4559605410323e-05;-2.6160383640672e-05;-0.00033311231527478;-0.00026080213137902;0.00068375322734937;0.00056661473354325;0.00085017876699567;0.00073768175207078;0.0001730070944177;0.00015519643784501;-2.0670295270975e-05;-5.327176040737e-06;0.00014662834291812;0.00011140950664412;0.00019373148097657;0.00019716162933037;2.0575194866979e-05;1.5449537386303e-05;0.0010024682851508;0.0014893249608576;8.7096865172498e-05;-0.0016042657662183;-0.0014101597480476;-0.00060226256027818;-0.00058746192371473;-0.00047782572801225;-0.00043524469947442;-0.00029442715458572;-0.00024931004736573;-0.00010345420741942;-8.2346246927045e-05;2.8075686714146e-05;8.3165714386269e-06;-0.000445064593805;0.00027474027592689;0.00037658904329874;-0.00011926985462196;0.0001930133003043;0.00015619766782038;-4.746799095301e-05;4.9458412831882e-05;1.3048329492449e-05;-1.4761101738259e-05;0.00034501138725318;0.00025342154549435;6.7586137447506e-05;1.4643004760728e-05;-2.2151385564939e-05;-6.5995052864309e-05;-9.4945811724756e-05;0.00012580814654939;8.8269145635422e-05;-0.0001982383109862;8.1136357039213e-05;-6.2452229030896e-05;-0.00022292156063486;-0.0004456382303033;-0.00021140038734302;3.140890476061e-05;2.3308613890549e-05;-7.1720154664945e-05;-0.00017635103722569;4.91882337883e-06;9.9818615126424e-05;-0.0003626853285823;0.00073698064079508;0.0002513051731512;-0.00050893024308607;6.1720806115773e-05;-0.00053827377269045;3.5302426113049e-05;7.9062367149163e-05;2.7242218493484e-05;-2.567375486251e-05;0.00021358609956224;-0.00066386180697009;0.00010645368456608;3.7933943531243e-05;-4.0523726056563e-05;7.7176928243716e-06;-0.00021270512661431;-0.00023460759257432;-0.00011811496369774;1.7711325199343e-05;0.00053740141447634;3.1291547202272e-05;0.00025967179681174;-0.00027087226044387;0.00073256465839222;-2.0617037080228e-05;-6.2999482906889e-05;-0.00011468245065771;3.0631981644547e-05;2.1167585146031e-05;-1.3197791304265e-05;1.5263774912455e-05;-0.00021253990416881;4.8175090341829e-05;0.00067060464061797;0.0001532804017188;0.00037387077463791;8.9761946583167e-05;4.7655077651143e-05;-1.9209641322959e-05;1.2133266864112e-05;-1.18353182188e-06;-1.5229132259265e-05;1.0959881819872e-06;0.00015629598055966;-8.8177002908196e-06;2.1662854123861e-06;0.00018846735474654;0.00064718700014055;3.1946841772879e-05;-0.00029187998734415;-0.00084847590187564;-0.00028200348606333;-0.00021333577751648;-2.4480617867084e-05;-0.00034730313927867;-4.3684489355655e-05;-0.00011372723383829;-5.4361348702514e-06;-7.0040969148977e-06;2.1009314878029e-05;-2.4602995836176e-05;-0.00041882871300913;0.00014024632400833;0.0004204208671581;-4.0714839997236e-06;0.00017182694864459;0.00041115455678664;-7.1686205046717e-05;7.3816350777633e-05;5.7087145250989e-06;-7.112740604498e-06;0.00035491154994816;0.00066841463558376;6.5405511122663e-05;7.2238020948134e-05;-2.3331736883847e-05;-0.0001353268744424;-0.000164469180163;0.00020815175957978;0.00014992995420471;-0.00017945790023077;-1.1237651733609e-06;-6.9121240812819e-05;-0.00041232042713091;-0.00048073683865368;-0.0006250329897739;5.8781432016985e-05;4.0673028706806e-05;-7.0353344199248e-05;-0.00036833994090557;4.5780625441694e-06;0.00018505564366933;-0.00067158171441406;0.0011003582039848;0.00048149708891287;-0.00069615303073078;0.00020602578297257;-0.00071270141052082;3.8918398786336e-05;0.00010940890933853;4.1372015402885e-05;-3.719480446307e-05;0.00047059069038369;-0.00094235467258841;0.00014444297994487;6.3343686633743e-05;-6.8231413024478e-05;4.8689989853301e-06;-0.00029234361136332;-0.0002361598162679;-0.00013093987945467;-8.2716411270667e-05;0.00070690410211682;-3.3676700695651e-05;0.00032073695911095;-0.00057173427194357;0.00099165842402726;-6.342899723677e-06;-8.7807704403531e-05;-0.00018013229419012;4.3088082748e-05;4.135028575547e-05;-1.4493912203761e-05;9.1666661319323e-05;-0.00033966155024245;-2.9653443561983e-05;0.0011014550691471;0.00010001222108258;0.00050301756709814;0.00012544218043331;4.5506894821301e-05;-2.9222575903987e-05;2.3648941350984e-05;-4.0169456042349e-05;-6.0367336118361e-05;-3.1445695640286e-05;0.00023102399427444;-2.030913674389e-05;4.0378827179666e-06;0.0001312367094215;0.00084517855430022;3.8515274354722e-05;-0.00019852697732858;-0.0012266342528164;-0.00037997210165486;-0.00024907680926844;4.5266449888004e-05;-0.00052659586071968;-1.9392427930143e-05;-0.00014470989117399;1.3063183359918e-05;1.7409016436432e-05;2.9848715712433e-05;-5.0591763283592e-05;-0.00023146184685174;-6.5193358750548e-05;0.00030011046328582;6.9292604166549e-05;8.7201566202566e-05;0.00056181865511462;-7.6788783189841e-05;7.859843026381e-05;-5.5065156630008e-06;3.2053048926173e-06;0.00020781593048014;0.00092614779714495;3.8650883652736e-05;9.7363961685915e-05;-7.7411295933416e-06;-0.00016657737432979;-0.00012690387666225;0.00022217164223548;0.00016361029702239;-0.00012981235340703;-8.1729289377108e-05;-3.1934680009726e-05;-0.00049016444245353;-0.00031095230951905;-0.00085809238953516;5.541985592572e-05;4.6752760681557e-05;-3.4213484468637e-05;-0.00046142426435836;-2.9416296456475e-06;0.00022327760234475;-0.00070675858296454;0.0010541633237153;0.00052207225235179;-0.00062435609288514;0.00024375320936088;-0.00061492156237364;2.6461113520782e-05;0.00010468699474586;3.9476017263951e-05;-3.346356243128e-05;0.00052786304149777;-0.0008459638338536;0.00013285633758642;7.9291334259324e-05;-7.0615598815493e-05;-8.6862082753214e-06;-0.00029192885267548;-0.00017677368305158;-9.7675823781174e-05;-0.00011592890223255;0.00063986465102062;-6.656158802798e-05;0.00025696400552988;-0.00063769018743187;0.00085264421068132;1.1652742614388e-05;-8.0790981883183e-05;-0.00017897362704389;1.6588093785685e-05;4.485161480261e-05;-2.0998970740038e-06;0.0001243558654096;-0.00033459108090028;-6.2290106143337e-05;0.00113874534145;1.551099740027e-05;0.0004322603053879;0.00012140375474701;3.3418153179809e-05;-2.7223046345171e-05;2.6241747036693e-05;-6.2680854171049e-05;-9.2016198323108e-05;-4.1349132516189e-05;0.0002232591068605;-2.8272152121644e-05;-1.178306320071e-06;6.4093896980921e-06;0.00074683560524136;2.474674511177e-05;-4.2657480662456e-05;-0.0011545541929081;-0.00034615624463186;-0.00019062166393269;7.8266028140206e-05;-0.00049942423356697;9.0264866230427e-06;-0.00012333589256741;2.1381099941209e-05;2.6489426090848e-05;2.8876791475341e-05;-5.0876311433967e-05;-9.1057321697008e-05;-0.00017421858501621;0.00018390738114249;9.3782298790757e-05;2.4965927877929e-05;0.00056926684919745;-6.9404384703375e-05;7.1946902608033e-05;-1.1495601938805e-05;8.8438791863155e-06;8.9828805357683e-05;0.00095251569291577;1.6025825971155e-05;9.5851748483256e-05;3.5953200949734e-06;-0.00016428359958809;-7.9310448199976e-05;0.00019884055654984;0.00014753792493138;-8.6050502432045e-05;-0.00011620624718489;-3.2338518849429e-06;-0.00046726907021366;-0.00016259370022453;-0.00087005912791938;4.4739826989826e-05;4.5070937630953e-05;-6.1841797105444e-06;-0.00045674186549149;-7.6057881415181e-06;0.00021899442072026;-0.00060681015020236;0.00085947912884876;0.00045790086733177;-0.00047094118781388;0.00021720041695517;-0.00044970400631428;1.6861564290593e-05;8.8018547103275e-05;3.1349518394563e-05;-2.5143941456918e-05;0.00046660468797199;-0.00065307709155604;0.00010534524335526;8.4239305579104e-05;-6.1040467699058e-05;-1.7364040104439e-05;-0.00025215995265171;-0.00010885265510296;-6.3610503275413e-05;-0.00010778194700833;0.00048879324458539;-7.4449664680287e-05;0.00017339194891974;-0.00056367204524577;0.00062161404639482;2.0360197595437e-05;-6.7202498030383e-05;-0.00014899647794664;-6.2843810155755e-06;3.967924931203e-05;6.2531230469176e-06;0.00012370680633467;-0.00028486776864156;-6.4860076236073e-05;0.0010073942830786;-3.1112525903154e-05;0.00032578359241597;0.00010398924496258;2.0210300135659e-05;-2.2083151634433e-05;2.3765733203618e-05;-6.7141481849831e-05;-0.00010729784116847;-3.9110895158956e-05;0.00018373876810074;-2.937276076409e-05;-2.175298959628e-06;-6.6430162405595e-05;0.00059387955116108;1.3362864592636e-05;4.642426938517e-05;-0.0009584377403371;-0.00028371810913086;-0.0001279143471038;8.161437290255e-05;-0.00040571397403255;2.298510298715e-05;-9.2194008175284e-05;2.3064558263286e-05;3.4515258448664e-05;2.4002163627301e-05;-4.6006793127162e-05;-0.00043449579970911;0.0004685977473855;0.00012311557657085;-0.00029796766466461;6.9652764068451e-05;-0.00014533680223394;-2.3669703296036e-05;3.1078132451512e-05;1.4011809071235e-05;-1.9854900529026e-05;0.00010814549750648;-0.000320657127304;-5.6154758567573e-06;-5.5031854572007e-05;2.4631135602249e-05;2.8514732548501e-05;0.00014465750427917;-2.012463301071e-05;-3.3369302400388e-05;-0.00014585837197956;7.90521298768e-05;3.9507598557975e-05;5.1161870942451e-05;-8.2329715951346e-05;0.00037799123674631;-1.3694412700715e-05;-3.3984575566137e-05;5.0210252084071e-05;6.5289983467665e-05;-3.6935616662959e-05;-6.6920338213095e-06;0.00054065568838269;-0.00013558329374064;-0.00034569721901789;8.909945609048e-05;-0.00043720923713408;-1.9821090972982e-05;6.2846891523805e-05;5.7484558055876e-05;-1.4155846656649e-05;1.420477656211e-05;-0.0006558108725585;5.8717428146338e-06;4.1519069782225e-05;8.6199484940153e-05;2.4022212528507e-05;-2.1266389012453e-05;-0.00014702466432936;-0.00015588698443025;-0.00012419988343026;0.00036300436477177;3.2276038837153e-05;0.00021843446302228;4.5696902816417e-05;0.00065558974165469;-3.9722304791212e-05;-7.4476200097706e-05;-4.7416073357454e-05;7.7759228588548e-05;-6.3409461290576e-05;-3.794990334427e-05;4.9647715059109e-06;-0.00021787743025925;-1.8267501218361e-05;0.00054075813386589;6.640373612754e-05;0.00044394587166607;0.00021610250405502;4.3983265641145e-05;7.0629168476444e-05;-1.8962492731589e-06;-1.3188532648201e-05;2.5912398996297e-05;9.4909219114925e-06;0.00010505740647204;8.5959327407181e-06;2.3986447558855e-05;4.0465374695486e-06;0.00035659247078001;0.00068568933056667;6.0313854191918e-05;-0.00088644382776693;-0.0004175340582151;-0.00025900974287651;-0.00029158292454667;-0.00032330138492398;-5.6898046750575e-05;-0.00012209601118229;-5.5476393754361e-05;1.4327234566736e-05;4.6667369133502e-06;-2.5134913812508e-05;8.2050646597054e-06;-0.00064846681198105;0.00065514334710315;0.00024395735817961;-0.0003713603655342;0.00016248758765869;-0.00019196151697543;-3.0621813493781e-05;4.1734459955478e-05;2.3378161131404e-05;-2.9888818971813e-05;0.00027460383716971;-0.00041480385698378;2.3649796276004e-05;-7.4018927989528e-05;1.0868874596781e-05;3.1920015317155e-05;0.00013308832421899;4.4461380639405e-06;-2.3692828108324e-05;-0.0002250353427371;0.00012829850311391;1.0203024430666e-05;4.070134673384e-05;-0.00026300959871151;0.00047312374226749;-9.8303353297524e-06;-3.2368381653214e-05;7.582502803416e-06;8.2098784332629e-05;-2.8875836505904e-05;-3.3513588277856e-06;0.0005555545212701;-1.7761696653906e-05;-0.00037074775900692;8.1143952002094e-07;-0.0004751164233312;-0.00010827091318788;8.2705322711263e-05;8.161568257492e-05;-1.3429284081212e-05;8.9624290922075e-06;-0.00070582708576694;-0.00012430213973857;6.4421466959175e-05;0.00010371820826549;2.3798214897397e-05;-1.4922879927326e-05;-0.00015471917868126;-0.00018778901721817;-0.0001596114016138;0.00038548064185306;8.9902852778323e-05;0.00024138342996594;9.193619916914e-05;0.00071098172338679;0.00010311754886061;-9.6387935627718e-05;-7.5006348197348e-05;6.2696155509911e-05;-6.2265564338304e-05;-3.9038553950377e-05;-1.8896150777437e-06;-0.00024461498833261;-7.2806717071217e-05;0.00056638347450644;0.00016881283954717;0.00054911297047511;0.00034086272353306;6.9641922891606e-05;8.6029416706879e-05;-6.9576249188685e-06;-1.2749707821058e-05;5.3174702770775e-05;2.9772942070849e-05;0.00011798645573435;4.0197384805651e-05;2.6869691282627e-05;1.0195356480835e-05;0.0005241067847237;0.00088809779845178;7.4623923865147e-05;-0.0010704701999202;-0.00065852038096637;-0.00034655598574318;-0.00036721583455801;-0.00035883035161532;-0.00013495473831426;-0.00015906603948679;-9.531185060041e-05;-2.2691640424455e-06;-3.9823830775276e-06;-1.6943904483924e-05;5.3814565035282e-06;-0.00096999318338931;0.0009312218753621;0.00044010076089762;-0.00046311266487464;0.00028404445038177;-0.0002346511464566;-4.3669031583704e-05;6.1163293139543e-05;3.8145819416968e-05;-4.4802003685618e-05;0.00050044641830027;-0.00051674689166248;8.1050966400653e-05;-0.00010464217484696;-9.752801815921e-06;3.1090607080841e-05;9.0381923655514e-05;4.2704905354185e-05;-6.0855645642732e-06;-0.00033266592072323;0.00020303991914261;-1.8833816284314e-05;-1.5119261433938e-06;-0.00052837887778878;0.00057168060448021;-6.4212977122224e-06;-2.37846361415e-05;-5.4367541451938e-05;9.6885109087452e-05;-2.1998723241268e-05;9.4615688794875e-06;0.00052949180826545;0.00022982622613199;-0.0003624465316534;-0.00017685619241092;-0.00048579933354631;-0.00027988184592687;0.00011562315921765;0.00012360696564429;-9.8590580819291e-06;-3.8140826745803e-06;-0.00072032702155411;-0.00037288272869773;0.00011923241254408;0.00013349529763218;1.7998258044827e-05;-2.0083100480406e-06;-0.00017284804198425;-0.00022851231915411;-0.00020948477322236;0.00038535459316336;0.00021111038222443;0.00025228780577891;0.00017005440895446;0.00071378034772351;0.00037518868339248;-0.00013324338942766;-0.00012204603262944;1.414661801391e-05;-5.9585865528788e-05;-3.6755329347216e-05;-1.4846095837129e-05;-0.00028277773526497;-0.00017173653759528;0.00060607946943492;0.00037370051722974;0.00070480344584212;0.00055136904120445;0.00011704050848493;0.00011432365863584;-1.5423172953888e-05;-9.8752107078326e-06;9.4950541097205e-05;6.4390471379738e-05;0.00014221019227989;0.0001079750873032;2.7837393645314e-05;1.764207809174e-05;0.00078056642087176;0.0012136459117755;9.1171445092186e-05;-0.0013470113044605;-0.0010656189406291;-0.00048625949420966;-0.00048660149332136;-0.00040814664680511;-0.00028462687623687;-0.00022015743888915;-0.00016728219634388;-3.7657497159671e-05;-2.6567111490294e-05;1.0442347502249e-06;9.91245883597e-07;-0.00099056691396981;0.00091144145699218;0.00050032621948048;-0.00040730059845373;0.00031783265876584;-0.0001939388748724;-4.6136141463649e-05;6.2474544392899e-05;3.9172457036329e-05;-4.4074324250687e-05;0.00058028171770275;-0.00043985902448185;9.7547577752266e-05;-8.6343869043048e-05;-2.4730956283747e-05;1.528934808448e-05;1.7779397239792e-05;6.9877860369161e-05;1.7610784198041e-05;-0.00032945466227829;0.00020547343592625;-5.154482278158e-05;-4.2081643186975e-05;-0.00063209759537131;0.00047143219853751;8.3012437244179e-06;-1.324336790276e-05;-8.9240726083517e-05;6.0834037867608e-05;-8.8796305135475e-06;2.3818247427698e-05;0.00031810023938306;0.00042909645708278;-0.00022403092589229;-0.00031455309363082;-0.0003544213832356;-0.00039645156357437;0.00011248702503508;0.00012881064321846;-7.2545003604318e-07;-1.4047492186364e-05;-0.00051896640798077;-0.00053997908253223;0.00013387770741247;0.00011707985686371;4.7036446630955e-06;9.2546570158447e-06;-0.00016246757877525;-0.00021964097686578;-0.00020732152916025;0.0002760389179457;0.00030114137916826;0.00019705513841473;0.00021589889365714;0.00049879791913554;0.00056780059821904;-0.00012601679190993;-0.00012856889225077;-2.8722655770252e-05;-2.7762409445131e-05;-2.3631546355318e-05;-2.2835381969344e-05;-0.00023205870820675;-0.00022133952006698;0.00048147191409953;0.00050055712927133;0.00065146741690114;0.00060256879078224;0.00012537642032839;0.00010603950795485;-2.0347468307591e-05;-4.5335787035583e-06;9.249212598661e-05;6.4317529904656e-05;0.00011383774835849;0.00013783169561066;2.3829512429074e-05;2.1435505914269e-05;0.00077891198452562;0.0012164968065917;9.027418855112e-05;-0.0012339530512691;-0.001181373023428;-0.00049597880570218;-0.000476346060168;-0.00033647747477517;-0.00035487819695845;-0.00020516965014394;-0.00018197072495241;-3.9640857721679e-05;-2.3645841793041e-05;1.0683243999665e-05;-9.8786422313424e-06;-0.00071947323158383;0.00060543545987457;0.0004328329814598;-0.00022652075858787;0.00026299915043637;-6.5543652453925e-05;-4.0191658627009e-05;4.9008747737389e-05;2.6698247893364e-05;-2.8250138711883e-05;0.00050222064601257;-0.00017390548600815;7.3689217970241e-05;-2.3377682737191e-05;-3.1371833756566e-05;-1.7968572137761e-05;-7.1378963184543e-05;8.8137872808147e-05;4.6771401684964e-05;-0.00023067391884979;0.00014104422007222;-8.0748643085826e-05;-8.8617358414922e-05;-0.00056693388614804;0.00017564097652212;3.1642142857891e-05;-3.1322440463555e-07;-9.0543398982845e-05;-3.2648124033585e-05;7.1202985054697e-06;4.5219196181279e-05;-4.8353635065723e-05;0.00057102489518002;2.3633274395252e-05;-0.0004040556086693;-0.00011444788833614;-0.00046132237184793;7.4619994848035e-05;9.8446165793575e-05;1.3562396816269e-05;-2.0274563212297e-05;-0.00013224537542555;-0.00061957299476489;0.00010997539357049;6.0810867580585e-05;-1.6587244317634e-05;1.6053067156463e-05;-0.00014758127508685;-0.00018778764933813;-0.00015987311780918;9.9070566648152e-05;0.00037579418858513;9.3733477115165e-05;0.0002364513638895;9.9187760497443e-05;0.00067079957807437;-7.40401155781e-05;-9.4752394943498e-05;-6.4370171457995e-05;2.7151865651831e-05;-4.6387057750508e-07;-2.4586624931544e-05;-9.6663905424066e-05;-0.00022202118998393;0.00021855863451492;0.00056419020984322;0.00039687182288617;0.00049707066500559;9.906965715345e-05;6.4245905377902e-05;-2.1473599190358e-05;3.2500904580957e-06;4.3611340515781e-05;2.592681630631e-05;4.0255803469336e-05;0.00013228385068942;1.2931624951307e-05;2.0489267626544e-05;0.00051024340791628;0.00091861031251028;7.1291840868071e-05;-0.00074930040864274;-0.0010175876086578;-0.00038489236612804;-0.00034326533204876;-0.00015587522648275;-0.00034918574965559;-0.0001175487486762;-0.00014060606190469;-1.1027784239559e-05;4.7746843847563e-06;1.2594401596289e-05;-2.6822242944036e-05;-0.00058247416745871;0.00041478031198494;0.00043754393118434;-0.00012710892769974;0.00023565250739921;8.2574726548046e-05;-4.7045872634044e-05;5.187644273974e-05;1.9069002519245e-05;-1.9130951841362e-05;0.00045840302482247;0.00010725740139605;7.0931469963398e-05;1.7853761164588e-05;-3.3786800486268e-05;-5.7796311011771e-05;-0.00013436669541989;0.00012412709475029;8.2780039520003e-05;-0.00019883971253876;0.00010305548494216;-9.0982968686149e-05;-0.00018350803293288;-0.00055456132395193;-0.00010321698937332;4.6477489377139e-05;1.5700525182183e-05;-9.0996152721345e-05;-0.000143251978443;1.1954247383983e-05;8.7029424321372e-05;-0.0003474737459328;0.00079150177771226;0.00023452541790903;-0.00054435367928818;4.937263292959e-05;-0.00059325771871954;5.3922780352877e-05;9.2064175987616e-05;2.7686828616424e-05;-2.8562048100866e-05;0.00016490356938448;-0.00077214860357344;0.00011764618830057;3.7293069908628e-05;-3.9436232327716e-05;1.8518598153605e-05;-0.00019462930504233;-0.00021906961046625;-0.0001452694850741;2.6001209789683e-06;0.00053149310406297;3.3215852454305e-05;0.00029110893956386;-0.00022245945001487;0.00084434146992862;-4.024164081784e-05;-8.153776434483e-05;-0.0001136107093771;5.842402606504e-05;1.9032690033782e-05;-2.5601222660043e-05;-4.4510775296658e-06;-0.00025486320373602;7.1904876676854e-05;0.00073570304084569;0.00024103079340421;0.00047561386600137;0.00010016784653999;4.7886973334244e-05;-2.4246684915852e-05;1.1347023246344e-05;7.3506548687874e-06;-7.9480641943519e-06;-2.50483083164e-07;0.00016203834093176;6.7383227886353e-09;1.6223029888351e-05;0.00032714297412895;0.00081677426351234;5.6905897508841e-05;-0.00045641779433936;-0.0010342460591346;-0.00035322486655787;-0.00028228943119757;-4.6564931835746e-05;-0.000404080550652;-6.6028063884005e-05;-0.00013256489182822;1.3991316336615e-06;1.6124939065776e-05;1.9179713490303e-05;-3.9623948396184e-05;-0.00043800886487588;0.00024286372354254;0.00038371112896129;-2.9346723749768e-05;0.00017551594646648;0.00020955520449206;-5.0388469389873e-05;5.3949494031258e-05;1.1056567018386e-05;-1.0370681593486e-05;0.0003679700603243;0.00032642812584527;5.8389723562868e-05;4.820466710953e-05;-2.9220318538137e-05;-8.6438092694152e-05;-0.00016046251403168;0.00014532211935148;0.00010196661605733;-0.00014565906894859;4.1680457798066e-05;-7.8750657849014e-05;-0.00025369573268108;-0.00046812085201964;-0.00032461257069372;5.3513998864219e-05;2.4615350412205e-05;-7.3707415140234e-05;-0.00022359438298736;1.0159746125282e-05;0.00011747338430723;-0.00049066595965996;0.00086641882080585;0.00034309879993089;-0.00056547927670181;0.00014188000932336;-0.00060371437575668;4.2063908040291e-05;8.7177068053279e-05;3.2573334465269e-05;-3.0903662263881e-05;0.00031887018121779;-0.00080266187433153;0.00011737376189558;3.5432531149127e-05;-5.0501839723438e-05;1.6184481864912e-05;-0.00020903165568598;-0.00019254350627307;-0.0001232580980286;-6.1119149904698e-05;0.00055319268722087;-1.5149928913161e-05;0.00028451037360355;-0.00039220455801114;0.00085919123375788;-1.9566072296584e-05;-7.5170319178142e-05;-0.00013578953803517;6.442754965974e-05;2.9217982955743e-05;-2.3853001039242e-05;5.0802660553018e-05;-0.00027355420752428;-5.9792064348585e-06;0.00083724258001894;0.00013919388584327;0.00044525129487738;9.9126176792197e-05;3.4600150684128e-05;-2.4955314074759e-05;1.6419566236436e-05;-1.9392748072278e-05;-3.4844622859964e-05;-2.2183690816746e-05;0.00017476239008829;-8.4842477008351e-06;1.3886886335968e-05;0.00020038627553731;0.00073647120734677;4.6194003516575e-05;-0.00026775788865052;-0.0010219677351415;-0.00032673860550858;-0.00023462949320674;1.640738810238e-05;-0.00042723957449198;-3.2713502150727e-05;-0.00012177730241092;1.0455797564646e-05;2.7641299311654e-05;2.1715663024224e-05;-4.8339017666876e-05;1.8626233213581e-05;-1.8447692127666e-05;-1.5195555533865e-05;4.7851161070867e-05;0.00011695209832396;-0.00021465684403665;0.00031741190468892;-0.00040685699786991;-0.00049066310748458;0.00056815869174898;-1.3476259482559e-05;2.7989610316581e-05;2.493262400094e-05;-2.4965456759674e-05;0.00016308658814523;-0.0003185298119206;-3.7848716601729e-05;-1.4818668205407e-05;1.2151185728726e-05;2.9935070415377e-05;3.6798261135118e-05;-0.00024338395451196;0.00028331490466371;3.5698938063433e-06;-4.0312130295206e-05;-0.00021106415078975;0.0003790780028794;-1.7456925434089e-06;-1.8633703803062e-05;-1.160180545412e-05;5.2344308642205e-05;1.009910920402e-05;-1.8436950995238e-05;-4.3908639781876e-05;7.8429102359223e-06;0.00056144746486098;6.6656531998888e-05;0.00053831160767004;-0.00010683829168556;-0.00063595711253583;0.00028905770159326;-2.475531618984e-05;2.5530731363688e-05;-5.5912139941938e-05;-6.6832566517405e-05;0.00042210955871269;-0.00013949161802884;0.00011246801295783;0.00048637742293067;0.0002975054376293;-0.00030797551153228;-0.00016277669055853;-0.00076677836477757;-0.0002217701257905;6.1371822084766e-05;-5.2570794650819e-06;-0.00055215629981831;0.00012639618944377;2.8012605980621e-05;-8.9362183643971e-06;4.6576360546169e-06;7.9938174167182e-05;-5.2219838835299e-06;3.2772388749436e-06;6.5402105974499e-05;2.9550372346421e-05;4.779802475241e-05;9.1259054897819e-05;2.0177026271995e-06;0.00010417599696666;0.00014260620810091;-0.00013387994840741;4.1991665966634e-06;-1.2256578884262e-05;0.00010135186312255;3.8096190110082e-05;-9.0166118752677e-05;7.3678194894455e-05;-3.2330783142243e-05;0.00012123704800615;4.2301020585001e-05;-2.3702856196905e-05;-5.0056485633831e-05;-9.7807198471855e-05;-0.00013317473349161;-0.00012267999409232;-3.1224804843077e-05;3.1073464924702e-05;-0.00010031004057964;5.6634462453076e-06;1.2809920008294e-05;-4.8126970796147e-05;-3.5558525269153e-05;2.8537839170895e-05;-2.7431971830083e-05;-1.9018381863134e-05;6.30876456853e-05;0.00019867649825756;-0.00030780900851823;0.00047119471128099;-0.00058539764722809;-0.00073550117667764;0.00083355623064563;-3.1694282370154e-05;4.1045386751648e-05;4.8584075557301e-05;-4.1106672142632e-05;0.00028616900090128;-0.00045870133908466;-4.667156827054e-05;-1.9013446944882e-05;9.1148722276557e-06;2.3976670490811e-05;5.1616159908008e-05;-0.00035348592791706;0.0004111448652111;6.4065493461385e-06;-5.1601771701826e-05;-0.00035594901419245;0.00054260925389826;1.0320148248866e-05;-2.7455487725092e-05;-4.4909487769473e-05;7.9707278928254e-05;9.2891423264518e-06;-2.0627505364246e-05;-5.4576597904088e-05;2.9110371997376e-06;0.00070127041544765;0.00016125896945596;0.00065539294155315;-3.6835321225226e-05;-0.00075141614070162;0.00025427134823985;-2.6660014555091e-05;2.7101425075671e-05;-8.8115317339543e-05;-9.1897942184005e-05;0.00049918791046366;-0.0001107511416194;0.00015456567052752;0.00067372113699093;0.00041305815102533;-0.00040362475556321;-0.0002423363912385;-0.00098303204867989;-0.00039577670395374;8.016455831239e-05;3.5719956485991e-06;-0.00065926247043535;7.313942478504e-05;3.4897897421615e-05;-6.7140749706596e-06;2.4240340280812e-05;0.00010358406143496;-6.478401246568e-06;3.6835283481196e-06;9.2749214672949e-05;4.5200529712019e-05;8.3446742792148e-05;0.0001304857141804;3.5315397326485e-06;0.00013803037290927;0.00016749478527345;-0.00015643220103811;3.179545274179e-06;-1.3779170330963e-05;0.00014222123718355;6.6342829086352e-05;-9.598168253433e-05;8.5815088823438e-05;-4.763608740177e-05;0.00016977047198452;7.2292961704079e-05;-4.1519702790538e-05;-6.2827959482092e-05;-0.00013919941557106;-0.00019740311836358;-0.00017110738554038;-5.9530604630709e-05;2.1452255168697e-05;-0.00013031646085437;1.191407773149e-05;1.6410413081758e-05;-7.6706586696673e-05;-5.5102551414166e-05;3.4539367334219e-05;-3.2605887099635e-05;-2.1249636120046e-05;6.7697088525165e-05;0.00024907159968279;-0.00034282743581571;0.00055095844436437;-0.00066737429006025;-0.00088028766913339;0.00097908661700785;-4.6374036173802e-05;4.8688114475226e-05;6.3854371546768e-05;-4.9674683396006e-05;0.00037694280035794;-0.00052784779109061;-4.5593773393193e-05;-1.7814270904637e-05;4.6581549213442e-06;1.2989435163036e-05;5.3666775784222e-05;-0.00040279611130245;0.00046423604362644;1.1679566341627e-05;-5.6360895541729e-05;-0.00045278345351107;0.00061562878545374;2.2077561879996e-05;-3.2842395739863e-05;-7.4923329520971e-05;9.5580879133195e-05;5.9676344790205e-06;-1.8181157429353e-05;-5.7043336710194e-05;-6.6465413510741e-06;0.00071577518247068;0.00025117132463492;0.00065037311287597;7.3487812187523e-05;-0.0007216072990559;0.00013494610902853;-2.3395097741741e-05;2.1841955458513e-05;-0.00011307723616483;-0.00010618951637298;0.00048297466128133;-3.9244918298209e-05;0.00017435391782783;0.0007570976158604;0.00046726831351407;-0.00043238556827419;-0.00028914489666931;-0.0010286254109815;-0.0005352275329642;8.9254339400213e-05;1.8107370124198e-05;-0.00064190209377557;-2.2155209080665e-05;3.6697521863971e-05;-1.3597987162939e-06;4.5126016630093e-05;0.00011174276005477;-6.6651282395469e-06;2.8117819965701e-06;0.00010642042616382;5.7841418311e-05;0.00013396055146586;0.00016356495325454;2.5706662199809e-05;0.00015491525118705;0.00014268539962359;-0.00014605165051762;3.2618600016576e-06;-1.1590328540478e-05;0.00016148801660165;8.9865658082999e-05;-7.4833107646555e-05;7.9670797276776e-05;-5.333510125638e-05;0.0002239705354441;0.00011561123392312;-6.7712280724663e-05;-7.6332129538059e-05;-0.00020069658057764;-0.00025971012655646;-0.00019712344510481;-8.74076213222e-05;-1.1225518392166e-05;-0.00014197643031366;1.5540550521109e-05;1.6953175872914e-05;-9.2200774815865e-05;-6.7408043832984e-05;4.2690095142461e-05;-3.9514277887065e-05;-2.3721970137558e-05;7.439027831424e-05;0.0002849567681551;-0.00036476316745393;0.00063862756360322;-0.0007537814672105;-0.0010688488837332;0.0011702603660524;-6.3961706473492e-05;5.9147238061996e-05;8.3136008470319e-05;-5.9062098443974e-05;0.00048252104897983;-0.00061308243311942;-4.6292410843307e-05;-1.694092679827e-05;-4.0776985770208e-06;1.3787805073662e-05;4.5919710828457e-05;-0.00044080917723477;0.00050819921307266;1.8449769413564e-05;-6.4834443037398e-05;-0.0005553612136282;0.00069252372486517;3.5560417018132e-05;-4.1014194721356e-05;-0.00011278753663646;0.00011868350702571;2.1239286525088e-06;-1.4882909454172e-05;-6.5453707065899e-05;-2.1917208869127e-05;0.0007480958593078;0.00037454918492585;0.00066405232064426;0.00022837013239041;-0.00070731167215854;-3.2972555345623e-05;-2.1068293790449e-05;1.3253707948024e-05;-0.00015825785521884;-0.00013562318054028;0.0004762185853906;6.0762777138734e-05;0.00020453205797821;0.000878038816154;0.00055052869720384;-0.00047538470244035;-0.00035556647344492;-0.0011121792485937;-0.00072984548751265;0.00011202430323465;4.5283228246262e-05;-0.00063383125234395;-0.00015252514276654;4.1976119973697e-05;8.0234403867507e-06;7.9092729720287e-05;0.00012989388778806;-7.4123881859123e-06;1.5111135098778e-06;0.00013125711120665;7.976550841704e-05;0.00024143043265212;0.00023938110098243;7.8741504694335e-05;0.00020215651602484;9.7362193628214e-05;-0.00014629944053013;5.0377743718855e-06;-8.0944355431711e-06;0.00019747210899368;0.00013051930000074;-3.7506404623855e-05;8.0491074186284e-05;-5.9488174883882e-05;0.0003459935542196;0.00021126482170075;-0.00012390379561111;-0.00011263598571531;-0.00034132445580326;-0.00039727610419504;-0.00024828317691572;-0.00013584249245469;-7.7890086686239e-05;-0.00017940644465853;2.1163923520362e-05;1.8138120140065e-05;-0.00011800078937085;-8.8321947259828e-05;5.4095624363981e-05;-4.921075378661e-05;-3.2284617191181e-05;8.2576400018297e-05;0.00032418605405837;-0.00035919932997786;0.00074069650145248;-0.00082891818601638;-0.0013400369789451;0.0014289693208411;-8.865115523804e-05;7.4120784120169e-05;9.7770076536108e-05;-6.0548376495717e-05;0.00064558017766103;-0.00072103354614228;-3.9811202441342e-05;-3.3411158710805e-06;-1.6698926629033e-05;1.1046290637751e-05;2.0452322132769e-05;-0.00047089179861359;0.00052265106933191;4.1188242903445e-05;-8.3211743913125e-05;-0.00069713313132524;0.00076354929478839;5.4796313634142e-05;-5.3886709793005e-05;-0.00016460282495245;0.00014778193144593;-3.3917067412403e-06;-7.8678376667085e-06;-8.125884050969e-05;-5.1877679652534e-05;0.00075382919749245;0.00054328958503902;0.00064626534003764;0.0004692408547271;-0.00064294395269826;-0.00032034967443906;-1.8619504771777e-05;-4.0089053072734e-06;-0.00022723447182216;-0.0001843955978984;0.00045057796523906;0.00023192030494101;0.00024348353326786;0.00099543598480523;0.00063781521748751;-0.00051032815827057;-0.0004337283608038;-0.0011621845187619;-0.00097709684632719;0.00015252003504429;9.8920980235562e-05;-0.0005942732677795;-0.00036134509718977;5.0552287575556e-05;2.5165565602947e-05;0.00012736405187752;0.00015452346997336;-9.4815268312232e-06;-5.8360785715195e-07;0.00016316247638315;0.00011274358985247;0.00042541767470539;0.00038618879625574;0.00016851174586918;0.00029990525217727;1.2212588444527e-05;-0.0001637376844883;1.5102342331375e-05;4.4853879899165e-07;0.00023505806166213;0.00019332466763444;1.5926865671645e-05;8.5459010733757e-05;-6.0879861848662e-05;0.00057699892204255;0.00040823491872288;-0.00022415205603465;-0.0001857459283201;-0.00060390855651349;-0.00066948693711311;-0.0003217582416255;-0.00021548332006205;-0.00017825243412517;-0.00025314695085399;2.3664075342822e-05;1.7051524991984e-05;-0.00013782741734758;-0.00011496662045829;2.7429050533101e-06;-2.8800252493966e-06;-4.761888703797e-05;2.7421401682659e-06;7.8940771345515e-05;0.00022210368479136;0.00013693977962248;-5.553409573622e-05;-0.00015539770538453;1.6381321984227e-05;-7.0443110189444e-07;-3.6375382478582e-05;5.4028514568927e-06;-6.1635596466658e-06;0.00010682149877539;0.00027565084747039;7.4983225204051e-05;8.1643462181091e-05;3.7943624192849e-05;-7.0627638706355e-06;-0.00018522438767832;-0.0001288977364311;-3.4170654544141e-05;2.2852816982777e-05;2.5319483029307e-05;-0.00013566434790846;-0.00022816224372946;3.1841937015997e-06;5.5646065447945e-05;-1.6607531506452e-05;-0.00010883493087022;-2.6466317649465e-05;1.7274624042329e-05;2.7514921384864e-05;-6.6735832660925e-05;-6.8675493821502e-05;0.00045247279922478;-0.00026885655825026;0.00066919188247994;0.00048765889368951;-0.00079037476098165;4.9816677346826e-05;-2.6496697955736e-06;-7.1652459155302e-05;-5.8376637753099e-05;-0.00027450025663711;0.00037243196857162;7.2090231697075e-05;0.00035161891719326;0.00023692929244135;-0.00010050179116661;-0.00018351782637183;-2.050294460787e-05;-0.00076138065196574;-3.483655382297e-05;6.2070663261693e-05;0.00030441809212789;-0.00050750345690176;-2.3050908566802e-05;-8.2321175796096e-06;9.7905620350502e-05;6.6419677750673e-05;1.9179633454769e-06;-3.9721123812342e-07;3.1157251214609e-05;6.4598134486005e-05;3.0724062526133e-05;0.00012097689614166;4.7337252908619e-05;0.00018478976562619;-8.7553307821508e-05;6.1970364185981e-05;-2.5118191842921e-05;-2.3322321794694e-05;-1.1257828873568e-06;0.00014043232658878;6.0320297052385e-05;-2.5040006221388e-05;-2.363349267398e-05;0.0001745074550854;-4.5732144826616e-06;-7.7375712862704e-05;-4.854409780819e-05;-3.0276607503765e-05;-0.00025097734760493;1.4566718164133e-05;-0.00010938601189991;-6.0420170484576e-05;-0.00010048242256744;2.0160896383459e-05;2.5293013095506e-05;-1.6336947737727e-05;-9.4189519586507e-05;-5.9607632465486e-06;1.1171745427419e-05;1.2712745046883e-05;9.6250572823919e-05;-0.00080133468145505;-3.2491978345206e-05;-0.0001211840135511;-2.6719175366452e-05;0.00054508092580363;-0.000135262569529;0.00014622930029873;-4.4507829443319e-05;1.751475247147e-05;5.1933561735495e-06;-0.0011075163492933;5.2896808483638e-05;-0.00019925019296352;-0.00024122341710608;-0.00021548474614974;0.0005648290971294;-3.8615104131168e-05;0.00033480452839285;0.00020763608335983;-0.00012850010534748;4.8742963372206e-06;0.00095488387160003;-1.7699687305139e-05;-0.00018597688176669;2.3244740077644e-05;0.00035024742828682;-2.5842700779322e-05;1.1954160072492e-05;-2.53586913459e-05;-0.00010753572132671;9.3635884695686e-05;0.00032514904160053;-6.882642628625e-05;0.00077250716276467;-0.00044022474321537;-0.0010289443889633;0.00073874014196917;6.8866698711645e-05;3.8902679079911e-05;-0.0001868470426416;-5.9609086747514e-05;0.00014784351515118;-0.00038941376260482;1.8769202142721e-05;0.00043097318848595;0.00036721970536746;-6.1365535657387e-05;-0.00015522514877375;-0.00093392858980224;-3.14678545692e-05;9.7359879873693e-05;-7.6873409852851e-05;-0.00025021110195667;0.000423165387474;-8.9143322838936e-05;-1.957886161108e-05;0.00028868453227915;0.0001007824394037;1.4548942090187e-05;-3.6480835206021e-06;0.00018418232502881;5.0124654080719e-05;0.00033962453017011;-5.1248189265607e-05;0.00045686375233345;7.3994069680339e-06;-7.0874993980397e-05;-1.4612053746532e-05;-0.00014966548769735;-3.5027704143431e-05;0.00033513602102175;-3.1649149605073e-05;0.00019540525681805;1.763515319908e-05;-6.8852248659823e-05;0.00027741646044888;-6.2749655626249e-05;-0.00013908268010709;-7.7850942034274e-05;-0.00050064799143001;6.5121377701871e-05;-0.00024694838793948;4.2707546526799e-05;-0.00037008611252531;-5.1357001211727e-06;0.00017231421952602;2.705089536903e-05;-0.00037007330683991;1.2622127542272e-05;-3.0415876608458e-06;6.3236543610401e-06;1.156406597147e-05;9.7291958809365e-05;-0.00071726436726749;-5.7673194532981e-05;-9.2677953944076e-05;-0.00011082462879131;0.00037574165617116;5.4581178119406e-06;0.00013260878040455;-2.8952799766557e-05;1.0673162250896e-05;3.2437581012346e-06;-0.0009427149198018;-2.7238864277024e-05;-0.00019310376956128;-0.00022824622283224;-0.00015526445349678;0.00052284699631855;-1.8833667127183e-05;0.00027602055342868;0.00021015420497861;-0.0001176585428766;-1.7371194189764e-05;0.00084487779531628;6.8354260292836e-05;-0.00016735839017201;1.4272945918492e-05;0.00030976769630797;-1.0974978977174e-05;1.804734711186e-05;-3.1214833143167e-05;-0.00011533436918398;8.1056146882474e-05;0.00051235454156995;-8.332307334058e-05;0.00088434520876035;-0.00047420262126252;-0.0011818100465462;0.00081731047248468;3.3861822885228e-05;4.8088029870996e-05;-0.00018495444965083;-7.4436597060412e-05;0.00036708527477458;-0.00043119923793711;6.0193829995114e-05;0.00051285384688526;0.00040395828546025;-0.00017665140330791;-0.00016585513367318;-0.0010739589342847;-4.2391158785904e-05;0.00012973106640857;-7.1444832428824e-05;-0.00049060687888414;0.0004653585201595;-5.0381095206831e-05;-2.4078162823571e-05;0.00021848212054465;0.00011911639739992;9.9769476946676e-06;-2.6714478735812e-06;0.00017187200137414;5.1239116146462e-05;0.0003611151187215;-1.1558945516299e-05;0.00043834032840095;3.0973278626334e-05;-3.194162127329e-05;-5.7252182159573e-05;-0.00011323325452395;-3.4209318982903e-05;0.00032829525298439;-2.3177877665148e-05;0.0001376210275339;4.3749550968641e-05;-5.6381402828265e-05;0.0003158563922625;-2.1816365915583e-05;-0.00015017412079033;-0.00010112897143699;-0.00053038389887661;8.2876567830681e-06;-0.00026044840342365;3.2913139875745e-05;-0.00035294381086715;-3.4456006687833e-05;0.00013141236559022;2.8361686418066e-05;-0.00031028786906973;2.0515665255516e-06;-1.5168931213339e-06;2.1676457890862e-06;2.8577705961652e-06;7.92151040514e-05;-0.00052955589490011;-5.184905603528e-05;-6.4703875978012e-05;-0.00013861272600479;0.0002094805095112;8.6270360043272e-05;0.0001093462924473;-1.2279844668228e-05;-2.6134734980587e-06;4.5612314352184e-06;-0.00068581325467676;-6.9373818405438e-05;-0.00014959908730816;-0.0001734453253448;-7.7627490099985e-05;0.00039790413575247;-5.7309925978188e-06;0.00018821288540494;0.00015650023124181;-8.7781336333137e-05;-3.2853848097147e-05;0.00062828976660967;0.00010467645915924;-0.00013547763228416;5.5576865634066e-06;0.00024563737679273;-1.8429167312206e-06;1.8131517208531e-05;-2.8416789064067e-05;-0.00010155806376133;5.6988177675521e-05;0.00050293741514906;-7.8108081652317e-05;0.00076878000982106;-0.00040952931158245;-0.0010553356260061;0.00071938603650779;9.6761668828549e-06;4.5917175157228e-05;-0.00015707677812316;-6.8658795498777e-05;0.00041649662307464;-0.00038004794623703;6.9781795900781e-05;0.00044187178718857;0.00034866834175773;-0.00019721810531337;-0.00013125040277373;-0.00092619349015877;-3.7302623240976e-05;0.00012954605335835;-5.6973272876348e-05;-0.00051651347894222;0.00040731416083872;-2.1405428924481e-05;-2.342745756323e-05;0.00014481088146567;0.00010870944242924;6.1397659010254e-06;-2.6222348878946e-06;0.00012659600179177;4.9375212256564e-05;0.00031996436882764;1.1583562809392e-05;0.00040833238745108;2.5100949642365e-05;-3.3122978493338e-05;-5.4931708291406e-05;-6.5419073507655e-05;-2.8792268494726e-05;0.00025705905864015;-1.8266659026267e-05;6.1297534557525e-05;4.3242838728474e-05;-3.6945169995306e-05;0.00031800210126676;1.4942768757464e-05;-0.00012906882329844;-0.00011626950436039;-0.00052009988576174;-2.3178617993835e-05;-0.00021767182624899;2.2547832486453e-05;-0.00028290835325606;-3.4441982279532e-05;7.5399701017886e-05;2.4792025214992e-05;-0.00019939754565712;-1.2394760915413e-06;7.341993477894e-05;-6.5783606260084e-05;-4.324199835537e-05;0.00010098934581038;0.000373330200091;-0.0003664139949251;0.00091948168119416;-0.00097604829352349;-0.0017866119742393;0.0018711753655225;-0.00012470167712308;9.9280921858735e-05;0.00012904751929455;-6.9989044277463e-05;0.00088559038704261;-0.00091503909789026;-3.9512215153081e-05;1.2432703442755e-05;-3.7804747989867e-05;2.6852982045966e-05;-1.9698965843418e-05;-0.00053167250007391;0.00056969298748299;6.6618187702261e-05;-0.00011226379865548;-0.00090906262630597;0.00090524216648191;8.0921956396196e-05;-7.5750314863399e-05;-0.00024344876874238;0.00020296745060477;-8.4234006862971e-06;-1.0913304322457e-06;-0.00011294774594717;-9.1490466729738e-05;0.00085558014689013;0.00077699776738882;0.00072427466511726;0.00077952549327165;-0.0006769264000468;-0.00067144993226975;-2.1833873688593e-05;-2.6454312319402e-05;-0.00034046691143885;-0.00027191027766094;0.00049104884965345;0.00044377861195244;0.00031232112087309;0.0012302565155551;0.00080551026621833;-0.00060332607245073;-0.00056395487627015;-0.0013648183085024;-0.0013402815675363;0.00022625816927757;0.00017888320144266;-0.00063603388844058;-0.0006209432031028;7.0234127633739e-05;5.1035975047853e-05;0.00019979570060968;0.00020685182244051;-1.3345817023946e-05;-2.1028156425018e-06;0.00022378216090146;0.00016546972619835;0.00070096028503031;0.00062302546575665;0.00029059458756819;0.00047301835729741;-7.5784177170135e-05;-0.00022981131041888;2.977327494591e-05;9.4665419965168e-06;0.00031630392186344;0.00029862282099202;7.9662633652333e-05;0.00011969665501965;-7.2162540163845e-05;0.00092110026162118;0.00070477585541084;-0.00036848249146715;-0.00029687312780879;-0.00099146808497608;-0.0010904296068475;-0.00045820497325622;-0.00033956774859689;-0.00031978171318769;-0.00039600941818208;3.0133738619043e-05;1.8637896573637e-05;-0.00018390591139905;-0.00016709446208552;6.627866969211e-05;-5.9065194363939e-05;-4.3248754082015e-05;8.4601117123384e-05;0.0003283619589638;-0.00027214115834795;0.00081234204117209;-0.00081626320024952;-0.0016128928400576;0.0016583407996222;-0.00011580228601815;8.7914602772798e-05;0.00011376308975741;-5.7141096476698e-05;0.00082223786739632;-0.00078546977601945;-2.0770972696482e-05;2.9014678148087e-05;-4.3077328882646e-05;1.6858564777067e-05;-4.6692744945176e-05;-0.00045157098793425;0.0004552440950647;7.0410053012893e-05;-9.8550488473848e-05;-0.00082969793584198;0.00074912927811965;7.6673633884639e-05;-6.8150890001561e-05;-0.00022971918224357;0.00017908457084559;-1.1233370059927e-05;4.5946790123708e-06;-9.9355711427052e-05;-9.5818009867799e-05;0.00068617099896073;0.00074287573806942;0.00055643118685111;0.00080568692646921;-0.0004720920114778;-0.00076468382030725;-1.3709422091779e-05;-3.4117012546631e-05;-0.00031815745751373;-0.00025489667314105;0.00036432320484892;0.0004837931774091;0.00027672928990796;0.0010675367666408;0.00070498156128451;-0.00050690583884716;-0.00050624454161152;-0.0011228549992666;-0.0012512592365965;0.00020454234618228;0.00018427269242238;-0.00047260976862162;-0.00065100868232548;6.0604830650846e-05;5.3424329962581e-05;0.00019394820265006;0.00018503064347897;-1.2271337254788e-05;-2.3344427972916e-06;0.00019979923672508;0.00015663335216232;0.00066715781576931;0.00060654821572825;0.00027414318174124;0.00046446305350401;-0.00010531133739278;-0.00020732691336889;3.0221230190364e-05;1.1240552339586e-05;0.00027259683702141;0.00029251031810418;9.273365867557e-05;0.00010726187610999;-6.1174898291938e-05;0.00088451436022297;0.00069176196120679;-0.00035546722938307;-0.00028576434124261;-0.00094579125288874;-0.0010662928689271;-0.00041118371882476;-0.00033088459167629;-0.00030766677809879;-0.00038399777258746;2.6276791686541e-05;1.544030601508e-05;-0.00015755125787109;-0.00016028397658374;-2.9488978725567e-06;5.0993361355722e-07;-5.5831449571997e-05;-8.8081433204934e-06;4.6515036956407e-05;0.00037356317625381;7.2799710324034e-05;2.8856338758487e-05;-3.429060234339e-05;-0.00017234432743862;1.7450523955631e-05;-4.8607063945383e-05;1.5991188320186e-06;-1.556842107675e-05;3.7291672924766e-05;0.00048021410475485;0.00010294251114829;0.00011998557602055;8.504104334861e-05;7.2506377364334e-06;-0.00026681629242375;-0.00011800175707322;-0.00014774556620978;7.8021448643995e-06;4.3081028707093e-05;-6.1090671806596e-05;-0.00040904045454226;-7.4384265644767e-06;7.349080988206e-05;-3.2127002214111e-07;-0.00014954002108425;-2.4803415726637e-05;1.5501831512665e-05;4.127575448365e-05;-7.0486501499545e-05;-6.953114643693e-05;0.00035795319126919;-0.00028076965827495;0.00065972417360172;0.00050437432946637;-0.00078757083974779;4.8834124754649e-05;1.5156492736423e-05;-6.4867992477957e-05;-7.9051998909563e-05;-0.00028499448671937;0.00026552655617706;4.7101304517128e-05;0.00031624958501197;0.00023317319573835;-9.4963776064105e-05;-0.00011807720875368;-1.1115836969111e-05;-0.00072265829658136;-4.7408142563654e-05;6.1900747823529e-05;0.00031461397884414;-0.00039401013054885;-2.3617472834303e-05;-3.1612467864761e-05;9.5851057267282e-05;0.00012830310151912;5.9312446865079e-07;3.151895271003e-06;3.2118146918947e-05;8.5019339167047e-05;-1.0026690688392e-05;0.00019045131921303;2.0751776901307e-05;0.00029318043380044;-4.3535634176806e-05;-6.8122117227176e-06;-2.8401813324308e-05;-5.0938433560077e-05;-1.7033138647093e-05;0.00018907527555712;3.5007979022339e-05;5.3290761570679e-05;-2.9034939871053e-05;0.00020305883663241;-2.5878405722324e-05;-7.3937138949987e-05;-7.7312819485087e-05;1.4423018910747e-05;-0.0003395538078621;3.1164905522019e-05;-0.00013037881581113;-2.653937190189e-05;-0.00020341396157164;2.2204520064406e-05;5.6099379435182e-05;-3.7572790461127e-06;-0.00016303626762237;-3.9711721910862e-06;1.5769968740642e-05;3.4737509849947e-05;0.00011157024709973;-0.00104597536847;-3.9068727346603e-05;-0.00016555654292461;4.082086525159e-05;0.00083732191706076;-0.00028955409652553;0.00014628772623837;-6.9807399995625e-05;4.8192760004895e-05;-6.4872674556682e-06;-0.0014769844710827;0.00012918849824928;-0.00025263559655286;-0.00032129912870005;-0.00035439504426904;0.00071416847640648;-5.2976109145675e-05;0.00048815322224982;0.00028104556258768;-0.00015786172298249;4.1091814637184e-05;0.001226045540534;-8.7783504568506e-05;-0.00019576841441449;3.7726549635408e-05;0.0004014452570118;-3.3441345294705e-05;4.4778757910535e-06;-2.1208679754636e-05;-0.00010305610339856;0.00013890171248931;0.00011718703171937;-4.3367654143367e-05;0.00079514842946082;-0.00045708942343481;-0.0010075104655698;0.00074858090374619;0.00013064189988654;2.7871703423443e-05;-0.00021166818623897;-5.4688134696335e-05;-0.00019533824524842;-0.00039057221147232;-4.7324749175459e-05;0.00043655151966959;0.00040001806337386;9.7607829957269e-05;-0.0001908324775286;-0.00096335541456938;-5.1169288781239e-05;4.7989658924052e-05;-9.616377792554e-05;7.5393785664346e-05;0.00042680129990913;-0.00016168250294868;-1.278375111724e-05;0.00046492155524902;9.5717776275706e-05;2.5125298634521e-05;-5.4800443649583e-06;0.00026921497192234;5.4285475926008e-05;0.00040598149644211;-0.00011251190153416;0.00053472351282835;-2.2514832380693e-05;-0.00014112703502178;4.6285102143884e-05;-0.00025456768344156;-3.9564954931848e-05;0.00045956237590872;-4.9215534090763e-05;0.00038809870602563;-2.0483023035922e-05;-0.0001140951862908;0.00025544626987539;-0.0001200499755214;-0.00016747796325944;-3.2601488783257e-05;-0.0005246585351415;0.00013983866665512;-0.00031418140861206;5.6977405620273e-05;-0.00050479004858062;3.8243662856985e-05;0.00029799403273501;3.0636925657745e-05;-0.00061117729637772;3.208297493984e-05;7.4776893598028e-05;-6.6104970755987e-05;-3.925574128516e-05;9.686678822618e-05;0.00030448858160526;-0.00028483147616498;0.00085188844241202;-0.00087389466352761;-0.0017678032163531;0.0018404859583825;-0.00012566642544698;9.9800607131328e-05;0.00013294350355864;-6.5379339503124e-05;0.00087823334615678;-0.00089012342505157;-3.8810256228317e-05;1.5732492101961e-05;-5.0130853196606e-05;5.6625569413882e-05;-5.3653631766792e-05;-0.00044751472887583;0.00047645048471168;6.5015105064958e-05;-0.00011294805153739;-0.00086435221601278;0.00082768575521186;8.307315147249e-05;-7.9605939390603e-05;-0.00025945791276172;0.00021546604693867;-7.8253278843476e-06;3.4800066259777e-06;-0.00012006342149107;-0.0001000844858936;0.00077548046829179;0.00076804164564237;0.00067521043820307;0.00082128267968073;-0.0006261687958613;-0.00076578592415899;-2.6775396690937e-05;-4.110381269129e-05;-0.00036890682531521;-0.00029478064971045;0.00045575224794447;0.0004973117611371;0.00029549899045378;0.0011413077590987;0.00076027004979551;-0.00054525560699403;-0.00053706800099462;-0.0012604896910489;-0.0012966427020729;0.0002515681553632;0.00020988525648136;-0.00057240796741098;-0.00066105253063142;7.8471406595781e-05;6.5678264945745e-05;0.00021537744032685;0.0002097946126014;-1.3630931789521e-05;-1.8550048253019e-06;0.00023097143275663;0.00017323206702713;0.00079578039003536;0.00069542683195323;0.00033379645901732;0.00052477646386251;-0.00012467296619434;-0.0002590736548882;3.786152228713e-05;1.4877165995131e-05;0.00033379238448106;0.00032723616459407;0.00011575266398722;0.00013891007984057;-7.0810747274663e-05;0.0010038417531177;0.00081911741290241;-0.00040568268741481;-0.00032364783692174;-0.0011142042931169;-0.0012101015308872;-0.00049332249909639;-0.00037271625478752;-0.00037871854146942;-0.00044825673103333;2.8340273274807e-05;1.5718951544841e-05;-0.00019337979028933;-0.00017935842333827;7.2468385042157e-05;-6.4096835558303e-05;-4.3290725443512e-05;8.8636988948565e-05;0.00030599959427491;-0.00023884589609224;0.00083140510832891;-0.00081065500853583;-0.0017248498043045;0.0017662724712864;-0.00012455083196983;9.5505631179549e-05;0.00012754240015056;-6.0273025155766e-05;0.00087812909623608;-0.00083178956992924;-2.2824558982393e-05;3.3645948860794e-05;-5.5227345001185e-05;4.0868148062145e-05;-7.4290350312367e-05;-0.00043213900062256;0.00042896418017335;7.2095361247193e-05;-0.00010599596134853;-0.00086217577336356;0.0007573536131531;8.2918515545316e-05;-7.6640695624519e-05;-0.00025839946465567;0.0002042394480668;-1.0843183190445e-05;7.281966645678e-06;-0.00011220085434616;-0.00010665224544937;0.00069803261430934;0.00078301865141839;0.00058217305922881;0.00087800592882559;-0.00049504498019814;-0.00086699507664889;-1.9576438717195e-05;-4.6380053390749e-05;-0.00036116401315667;-0.00029138085665181;0.00038164015859365;0.00054488010937348;0.00028535153251141;0.0010910019045696;0.00072928972076625;-0.00050972937606275;-0.00052452192176133;-0.001154707162641;-0.0013036211021245;0.00023804222291801;0.00021814506908413;-0.00048269148101099;-0.00071142142405733;7.2076014475897e-05;6.8175715568941e-05;0.00021736875351053;0.00020244692859706;-1.335039632977e-05;-1.9400320070417e-06;0.00022017730225343;0.00017380024655722;0.0007761248270981;0.00070081040030345;0.00031888982630335;0.00053726910846308;-0.0001373211707687;-0.00025012524565682;3.8230369682424e-05;1.498392339272e-05;0.00030789151787758;0.00033665556111373;0.0001196052544401;0.00013425534416456;-6.6998843976762e-05;0.00099737232085317;0.00081662449520081;-0.00040149223059416;-0.00032323744380847;-0.0010910468408838;-0.0012202652869746;-0.0004684834566433;-0.00037850392982364;-0.00036627642111853;-0.00045420503010973;2.6821058781934e-05;1.4964185538702e-05;-0.00017724615463521;-0.00018398325482849;-1.9755616449402e-05;3.9583878788108e-06;-9.44917628658e-05;-4.2779458453879e-05;2.3887905626907e-05;0.00092660472728312;-0.00011430687300162;0.00015058304416016;0.00035730094532482;-0.00086871994426474;9.781941480469e-05;-6.5740488935262e-05;9.8382806754671e-06;-7.188314339146e-05;-0.00017951081099454;0.0013283601729199;0.00020771022536792;0.00025008991360664;0.00037721858825535;7.3565155616961e-05;-0.00058216578327119;-0.00022449262905866;-0.00048822819371708;-8.964537846623e-05;8.1902027886827e-05;0.00015531260578427;-0.0010166881838813;-5.1891038310714e-05;0.00012115067511331;4.6736615331611e-05;-0.00030173937557265;-1.5869996786932e-05;3.5832199500874e-06;0.00013235562073532;-6.0530379414558e-05;-4.8684432840673e-05;-3.6199508031132e-05;-0.00033465182059444;0.00073598866583779;0.00056226854212582;-0.00076744140824303;3.2556585210841e-05;0.00012118431914132;-4.7968962462619e-05;-0.0001090455261874;-0.00031588558340445;-0.00039904849836603;-8.876570063876e-05;0.00027277431217954;0.0002568734344095;-0.00013178336666897;0.00018741430540103;-4.791664196091e-06;-0.00073197757592425;-9.8679891380016e-05;-1.9227429220336e-05;0.0003514307027217;0.0001770512026269;-1.7018195649143e-05;-0.00017816820763983;8.8973160018213e-05;0.00048328409320675;2.0405524026046e-07;1.7479524103692e-05;3.1596657208866e-05;0.00022097694454715;-0.00018177421588916;0.00036814500344917;-4.9937341827899e-05;0.00060102681163698;9.8561220511328e-05;-0.00020317644521128;-4.8873018386075e-05;-0.00022005382925272;-8.0587597039994e-05;0.00041606687591411;-5.663451156579e-05;0.00041170718031935;-9.4948722107802e-05;0.0002250274119433;-0.00016148507711478;-3.592735993152e-06;-0.00015725333651062;0.00020146169117652;-0.00052721664542332;0.00010280295100529;-0.00023624718596693;8.9602734078653e-05;-0.00051987898768857;3.4592329029692e-05;0.00026663969038054;4.8838599468581e-05;-0.0005930699990131;1.2407227814037e-06;1.8316821297049e-05;3.0811672331765e-05;0.00010037986066891;-0.0011535595403984;-2.6934836569126e-05;-0.0001589030289324;0.00017581730207894;0.0011496954830363;-0.00051595369586721;0.00010473367001396;-9.5251627499238e-05;3.3391930628568e-05;-1.8739216102404e-05;-0.0017508621094748;0.0002488270692993;-0.00024260813370347;-0.00033783877734095;-0.00051691906992346;0.00074171531014144;-8.6354062659666e-05;0.00059178314404562;0.00032281570020132;-0.00010361277963966;9.8035743576474e-05;0.0013375020353124;-0.00021471141371876;-0.00015726963465568;5.2206723921699e-05;0.00041717741987668;-4.4932574382983e-05;-1.3904382285546e-05;-2.761856876532e-06;-4.9647769628791e-05;0.00018552628171165;-0.00040086635272019;1.2511258319137e-05;0.00054143532179296;-0.00033294226159342;-0.00055730505846441;0.00049217080231756;0.00022750509378966;-8.2829010352725e-06;-0.00015125263598748;-2.5474077119725e-05;-0.00094175082631409;-0.00024920093710534;-0.00018501542217564;0.00025300058769062;0.00030298696947284;0.00043070429819636;-0.00018356728833169;-0.00064230349380523;-4.526990960585e-05;-0.00010596805077512;-9.8341326520313e-05;0.00079589575761929;0.00028219650266692;-0.00027998330187984;7.182509307313e-06;0.00069353496655822;4.9187543481821e-05;4.1649356717244e-05;-9.0203211584594e-06;0.00033915540552698;5.7117380492855e-05;0.00031355730607174;-0.00019811352831312;0.00053255032980815;-8.9256871433463e-05;-0.00024897497496568;0.00016833300469443;-0.00039391682366841;-3.7720743421232e-05;0.00050515308976173;-7.6164469646756e-05;0.00059812498511747;-0.00010042505164165;-0.00017907870642375;0.00014144515444059;-0.00019063784566242;-0.0001211698690895;4.9161291826749e-05;-0.00041881171637215;0.0002469812752679;-0.00030294436146505;6.7574575950857e-05;-0.00050178082892671;0.00012591158156283;0.00046724200365134;2.8661901524174e-05;-0.00088279391638935;6.8191468017176e-05;1.8760940747597e-06;2.0176101315883e-05;5.6451739510521e-05;0.00012773806520272;-0.0013720602728426;-4.9410515202908e-05;-0.00021978917357046;0.00013810276868753;0.0012487773783505;-0.0005046923761256;0.00012627085379791;-0.00010317417036276;6.6974309447687e-05;-2.5586354240659e-05;-0.0019755866378546;0.00023260478337761;-0.00031398356077261;-0.0004265463212505;-0.00055675581097603;0.0009009973728098;-7.4292118370067e-05;0.00070495577529073;0.00038276915438473;-0.00016149978910107;9.4650262326468e-05;0.0015768347075209;-0.00018402877321932;-0.00018562001059763;5.7093991927104e-05;0.00045760758803226;-4.0855087718228e-05;-7.5495509008761e-06;-1.3177521395846e-05;-7.7756369137205e-05;0.00020790603593923;-0.00022183665714692;-8.5682731878478e-06;0.00080529769184068;-0.00046714406926185;-0.00092053279513493;0.00073228543624282;0.00021847376774531;6.9703942244814e-06;-0.0002132077497663;-4.7224883019226e-05;-0.00076961383456364;-0.00037600396899506;-0.00016142702952493;0.00042059042607434;0.00042719527846202;0.000353692274075;-0.00023448042338714;-0.00097010546596721;-6.9340901973192e-05;-5.5853954108898e-05;-0.00011987068864983;0.000603781954851;0.00041710378718562;-0.00026847419212572;-1.265411242457e-07;0.00072425132384524;8.4746498032473e-05;4.2233590647811e-05;-8.4966477515991e-06;0.00039701402420178;6.2469334807247e-05;0.00047794700367376;-0.0002036433579633;0.00064087630016729;-7.6540592999663e-05;-0.00025534522137605;0.00014864893455524;-0.00041679834248498;-4.5383330871118e-05;0.00063885655254126;-8.0249941674992e-05;0.00067839282564819;-8.5707797552459e-05;-0.00018939955043606;0.00021562034089584;-0.00019646460714284;-0.00019336621335242;3.812675277004e-05;-0.00055347010493279;0.00024818885140121;-0.00041001400677487;7.6602795161307e-05;-0.00067364313872531;0.00011326056846883;0.0004948495188728;3.605273377616e-05;-0.00098700623493642;6.6388965933584e-05;3.5378950997256e-05;-2.9111573894625e-05;-9.8097075351689e-07;4.240288035362e-05;1.5664680176997e-05;-6.8671062763315e-05;0.00026823222287931;-0.00030761558446102;-0.00069212767994031;0.00075662764720619;-4.9651142035145e-05;4.2209881939925e-05;7.8340570325963e-05;-4.201908086543e-05;0.00031318402034231;-0.00037964203511365;-4.1135237552226e-05;-2.5452118279645e-05;-2.8173762984807e-05;9.7791278676596e-05;-3.7937970773783e-05;-8.0295532825403e-05;0.00014376420585904;4.913845828014e-07;-4.4125048589194e-05;-0.00027443130966276;0.00032003890373744;3.2609816116747e-05;-3.3895801607287e-05;-0.0001302908785874;0.0001188203386846;5.1018105295952e-07;2.1483422187885e-06;-5.3851803386351e-05;-3.186870526406e-05;0.00030971379601397;0.00028439305606298;0.0003137729363516;0.00030172558035702;-0.00035186053719372;-0.00028089093393646;-2.6343352146796e-05;-2.6889472792391e-05;-0.00018640959751792;-0.00014364754315466;0.00021793677296955;0.00019303742737975;9.5905801572371e-05;0.00042698666220531;0.00030588704976253;-0.00018879912386183;-0.00019622586842161;-0.00052045687334612;-0.00048061367124319;0.00013326609041542;9.7573429229669e-05;-0.00024427947937511;-0.00023979006800801;5.6439042964485e-05;4.2614716221578e-05;9.7193849796895e-05;9.2822330771014e-05;-4.5448150558514e-06;6.8928858354411e-07;0.00011669011291815;7.5589879998006e-05;0.00044872684520669;0.00032788497628644;0.00021106401982252;0.00023635347315576;-9.3512557214126e-05;-0.0001295915863011;2.2457670638687e-05;1.07922078314e-05;0.00021281100634951;0.00015812512720004;9.8552787676454e-05;8.1730970123317e-05;-4.1340907046106e-05;0.00044821959454566;0.00041100481757894;-0.00019396861898713;-0.00013660038530361;-0.00056881422642618;-0.00054426852148026;-0.0002806247503031;-0.0001785752538126;-0.00025818409631029;-0.00022601697128266;9.2006530394428e-06;3.6877975162497e-06;-0.00013087937259115;-8.6659150838386e-05;5.8877099945676e-05;-5.0894443120342e-05;-2.457852497173e-05;7.2751143306959e-05;0.00014894056948833;-0.00014200716395862;0.00056912592845038;-0.00056299299467355;-0.0013163221301511;0.0013706844765693;-9.4313276349567e-05;7.6130250818096e-05;0.0001045949102263;-4.4441843783716e-05;0.00064848165493459;-0.00066377740586177;-3.5785797081189e-05;6.6381849137542e-06;-5.0477490731282e-05;8.5793777543586e-05;-7.0638408942614e-05;-0.00024924450553954;0.00027600440080278;4.4493215682451e-05;-8.889329910744e-05;-0.00059742014855146;0.00056198233505711;6.3117375248112e-05;-6.4137042500079e-05;-0.00021112333342899;0.00017943246348295;-3.1544636840408e-06;5.9159860938962e-06;-0.00010007275704993;-7.9378798545804e-05;0.00052228942513466;0.00054338620975614;0.00048938114196062;0.00061647896654904;-0.00047244896995835;-0.00061819149414077;-2.9943756089779e-05;-4.5107775804354e-05;-0.00030697550391778;-0.00024647483951412;0.00033838575473055;0.0004042977525387;0.00020078867964912;0.00075791828567162;0.00051771447760984;-0.00035096527426504;-0.00036793426261283;-0.00086038734298199;-0.00088889535982162;0.00022075917513575;0.00018671204452403;-0.00040032417746261;-0.00050418043974787;7.2335722506978e-05;6.5488551626913e-05;0.00017215681145899;0.00016042616334744;-1.0433214811201e-05;-4.4882210659125e-07;0.00018266444385517;0.00013504286471289;0.00069822423392907;0.00058994477149099;0.00029640339198522;0.00044235558016226;-0.00013618054799736;-0.0002351548318984;3.8836904423079e-05;1.7261485481868e-05;0.00027930180658586;0.00027072295779362;0.00011938790703425;0.0001286110637011;-5.4784748499515e-05;0.00082498084520921;0.00073523953324184;-0.00033654467551969;-0.00026440242072567;-0.00096158502856269;-0.0010165553539991;-0.0004173687484581;-0.0003094426356256;-0.00034651751047932;-0.0003904226468876;1.7158383343485e-05;7.4845265771728e-06;-0.00015971706307027;-0.00014406247646548;5.6911027058959e-05;-4.9779802793637e-05;-2.9829147024429e-05;6.6129927290604e-05;0.00016873839194886;-0.00011135013482999;0.00057466758880764;-0.000523439317476;-0.0012985799694434;0.0013205255381763;-9.381900599692e-05;7.374606502708e-05;0.00010095338075189;-4.0596689359518e-05;0.00065975781762972;-0.00061984232161194;-1.8875136447605e-05;2.8384160032147e-05;-5.4942145652603e-05;6.3017207139637e-05;-8.8426815636922e-05;-0.000258574844338;0.00024684995878488;5.1867518777726e-05;-8.3467966760509e-05;-0.00061426695901901;0.00051335507305339;6.2405772041529e-05;-6.2866645748727e-05;-0.00020905112614855;0.00017039869271684;-5.5948717090359e-06;8.2512269727886e-06;-9.3217175162863e-05;-8.4037485066801e-05;0.00047880827332847;0.00055782560957596;0.00042652519186959;0.00065995223121718;-0.00037060989416204;-0.00069739349419251;-2.2616744900006e-05;-4.8352307203459e-05;-0.00029692193493247;-0.00024350972671527;0.00028602240490727;0.00043778007966466;0.00019668780441862;0.0007361993775703;0.00050289399223402;-0.00033469137270004;-0.00036372445174493;-0.00080081343185157;-0.00090342265320942;0.00020581953867804;0.00019149403669871;-0.00034322909777984;-0.00054028572048992;6.4643478253856e-05;6.7142391344532e-05;0.00017261422181036;0.00015576044097543;-1.034672732203e-05;-4.0881400309445e-07;0.00017207505879924;0.00013691764615942;0.0006620540516451;0.00059474183944985;0.00026899945805781;0.00045856152428314;-0.00013102775847074;-0.00023380534548778;3.8322854379658e-05;1.6017191228457e-05;0.0002505324955564;0.00028257371741347;0.00011112247011624;0.00012936556595378;-5.2457635320025e-05;0.00081136042717844;0.00071985507383943;-0.00032529057352804;-0.00026461214292794;-0.00092224415857345;-0.0010193028720096;-0.00038961006794125;-0.00031501331250183;-0.00031809351639822;-0.00040088561945595;1.6495821910212e-05;7.6566939242184e-06;-0.00014081528934184;-0.00015273793542292;2.7640435291687e-05;-2.5189052394126e-05;-1.3391472748481e-05;2.394809780526e-05;8.2971280789934e-05;-3.605499614423e-06;0.00028283550636843;-0.00021946673223283;-0.00061438826378435;0.00059539335779846;-4.2974537791451e-05;3.6603822081815e-05;6.7581509938464e-05;-3.4152690204792e-05;0.00032125605503097;-0.00025713976356201;3.7232832710288e-06;3.4290187613806e-05;-2.5550676582498e-05;2.7241674615652e-05;-7.4406256317161e-05;-0.0001255891402252;7.7065560617484e-05;1.3514655620384e-05;-2.9169941626606e-05;-0.00030798246734776;0.00020381851936691;2.589872747194e-05;-3.0725150281796e-05;-0.00011272898700554;9.2677946668118e-05;-4.640653514798e-06;5.5529167184432e-06;-3.2746145734563e-05;-3.6269135307521e-05;0.00022304384037852;0.00029619527049363;0.00017411349108443;0.00036621256731451;-0.00012219700147398;-0.00041255928226747;-7.0774804044049e-06;-2.9543476557592e-05;-0.00014596330584027;-0.00012244736717548;0.00010421154729556;0.00023205879551824;8.4220329881646e-05;0.00038095357012935;0.00027120948652737;-0.00016104528913274;-0.00017902081890497;-0.00039433661731891;-0.00049644487444311;8.5240732005332e-05;9.2788621259388e-05;-0.00012737419456244;-0.00028478910098784;3.2562395062996e-05;4.2168518120889e-05;8.8519271230325e-05;7.740335422568e-05;-3.6474880289461e-06;3.6803282910114e-07;8.1208985648118e-05;7.7676784712821e-05;0.00030806777067482;0.00031192024471238;0.00012403493747115;0.00024962981115095;-5.7735651353141e-05;-0.00011677940346999;1.7966272935155e-05;4.982192422176e-06;0.00012553016131278;0.00017875424236991;5.7587756600697e-05;8.6197585915215e-05;-3.4691092878347e-05;0.00036862192791887;0.0003188882546965;-0.00014104619913269;-0.00012852814688813;-0.00041321906610392;-0.00048714436707087;-0.00018776106298901;-0.00017959300021175;-0.00015660388453398;-0.00023603728914168;7.4047434281965e-06;6.2967010308057e-06;-7.1827489591669e-05;-0.0001105222327169;6.3072197917791e-06;-7.8662233136129e-06;-5.7428915170021e-06;-7.3294249887113e-06;2.8276519515202e-05;9.6476527687628e-05;7.7866679930594e-05;2.8262636533327e-06;-0.00012952789256815;6.5780222939793e-05;-5.249310106592e-06;1.0607601325319e-05;4.0312599594472e-05;-2.7785878046416e-05;8.3300219557714e-05;2.7052217774326e-05;2.7553443942452e-05;5.0664933951339e-05;4.871760665992e-06;-2.6622296900314e-06;-7.9588469816372e-05;-4.0786744648358e-05;-6.062424290576e-05;-1.1137285582663e-05;8.7323960542562e-06;-9.329357999377e-05;-4.0720784454606e-05;-7.3687709800652e-07;-8.0016625361168e-06;-4.1369748942088e-05;3.179462873959e-05;-5.0817011469917e-06;4.281012024876e-06;1.1946704944421e-05;-5.7982047110272e-06;3.491160532576e-05;0.00011962510325247;-2.1072175513837e-05;0.00019008002709597;8.1280457379762e-05;-0.00024644372751936;6.4469491007912e-06;-1.5548392184428e-05;-4.1247505578212e-05;-3.8602305721724e-05;-3.88035987271e-05;8.9985231170431e-05;5.942059942754e-06;0.00013701472198591;0.00011263529449934;-4.1609393520048e-05;-4.8526326281717e-05;-9.8156531748828e-05;-0.00023582925496157;-1.6721546671761e-06;2.5371962692589e-05;4.1280494770035e-05;-0.00011563076259336;7.1661679612589e-06;2.213939842477e-05;3.3592881663935e-05;3.0321949452627e-05;1.1524822411957e-06;9.5466396032862e-07;1.6107009287225e-05;4.2091254726984e-05;5.2112565754214e-05;0.00012815475929528;2.0479281374719e-05;0.00011740987247322;-6.4699347603892e-06;-3.7701356632169e-05;2.0336506167951e-06;-7.1984559326665e-06;2.8878312150482e-05;0.00011711298429873;1.6656076695654e-05;6.5827975049615e-05;-2.2516105673276e-05;6.9559107942041e-05;3.8290654629236e-05;-1.2651907127292e-05;-4.1165367292706e-05;-5.4731979616918e-05;-0.00013438225141726;-3.798289981205e-05;-9.2255882918835e-05;-3.6335033655632e-05;-0.00013423299242277;2.4818384645187e-06;1.1148953490192e-05;-1.7498909073765e-05;-9.5328352472279e-05;-2.7626474548015e-05;7.5983081160302e-07;-0.0001259585696971;-6.701528764097e-05;4.2636569560273e-05;0.0013638337841257;-0.00020252505782992;0.00022638021619059;0.00057508714962751;-0.0013441406190395;0.0001509563298896;-5.0399154133629e-05;2.8533311706269e-05;-0.00010132144234376;-0.00028889038367197;0.0019397914875299;0.00029315755818971;0.0003724982670974;0.00060547539032996;0.00010777461284306;-0.00083276751684025;-0.00034307679743506;-0.00076077255653217;-0.00016063313523773;8.1549987953622e-05;0.0002545390452724;-0.0014626976335421;-8.1573482020758e-05;0.00012301697279327;6.5091611759271e-05;-0.00038168410537764;-1.4554220797436e-05;-1.5418925158883e-06;0.00021261945948936;-4.4994725612924e-05;-5.126519681653e-05;-0.00021443898731377;-0.0004283131856937;0.00097222055774182;0.00070195755688474;-0.00091673043789342;2.6153857106692e-05;0.0001863292127382;-5.7609740906628e-05;-0.00010600428504404;-0.00039275278686546;-0.00084582011913881;-0.00018627470126376;0.00034202242386527;0.00032395840389654;-0.00018770789029077;0.00036827230360359;-6.0970573940722e-06;-0.00094357179477811;-0.0001372152910335;-9.3474969617091e-05;0.00044210138730705;0.00048522208817303;-1.3367417523114e-05;-0.00027881321148016;0.00010704311716836;0.00075264758197591;1.5612657762176e-06;2.8039237804478e-05;3.2264775654767e-05;0.00035470374859869;-0.00030015475931577;0.00053088931599632;-9.0621644631028e-05;0.00082085683243349;0.00018468894995749;-0.00032758814631961;-6.7488472268451e-05;-0.00036390338209458;-0.00013124398537911;0.00064249499700963;-0.00011475379869808;0.00071845890488476;-0.0001598650123924;0.00025069600087591;-0.00025487641687505;5.7117566029774e-05;-0.00023147974570747;0.00032187707256526;-0.00067712459713221;0.00015581447223667;-0.00036010157782584;0.00016612971376162;-0.00078022060915828;4.902926957584e-05;0.00045089490595274;8.7827567767818e-05;-0.00099392235279083;-2.3390623027808e-05;4.2074722728103e-07;-9.9036988103762e-05;-4.4598175009014e-05;2.4956894776551e-05;0.0011164887109771;-0.00020062731346115;0.00016438230522908;0.00052591791609302;-0.0011634945403785;0.00013056919851806;-4.1408497054363e-05;2.1083551473566e-05;-7.388827361865e-05;-0.00027102523017675;0.0016450475668535;0.00022714408987667;0.00029133286443539;0.0005282373749651;0.00010494008165551;-0.00067417119862512;-0.00028261338593438;-0.00062179763335735;-0.00014514518261421;5.021857941756e-05;0.00024764603585936;-0.0011990725761279;-7.0456044340972e-05;0.00010327555355616;6.1760816606693e-05;-0.00033269659616053;-5.7133229347528e-06;-6.2308040469361e-06;0.00018038133566733;-2.1662353901775e-05;-2.8152249797131e-05;-0.0002986989566125;-0.0003134339931421;0.00069336855085567;0.00049892358947545;-0.00060816924087703;1.0791884051287e-05;0.0001721483131405;-3.5032750020036e-05;-6.7261797084939e-05;-0.00027905532624573;-0.00086798804113641;-0.00018433768127579;0.00021275726612657;0.00023041454551276;-0.00013894047879148;0.00037280039396137;-1.2330797289906e-06;-0.00064723484683782;-0.00011186199117219;-0.00011053495836677;0.00031642251997255;0.00056640827096999;-6.0634529290837e-06;-0.0002550384378992;7.1487629611511e-05;0.00066073948983103;1.0283778237863e-06;2.5085391825996e-05;2.7171929104952e-05;0.00029246805934235;-0.00027174889692105;0.00039937303517945;-8.9254637714475e-05;0.00069296575384215;0.00018037682457361;-0.000295739620924;-5.6857490562834e-05;-0.00031529419356957;-0.00011598214769037;0.00051254587015137;-0.00011390357394703;0.00059903983492404;-0.00014004569675308;0.00018598923634272;-0.0002319201012142;5.758875340689e-05;-0.00017074764764402;0.00029622230795212;-0.00054530071793124;0.00013602670514956;-0.00027922584558837;0.00015844842710067;-0.00061218702467158;3.9692647987977e-05;0.00039270077832043;8.1404788943473e-05;-0.00083992118015885;1.3157365174266e-05;9.1958781922585e-06;-1.8130966054741e-05;6.7731605668087e-05;-0.0010196785442531;-2.2388203433366e-05;-0.00011632847599685;0.00021495706459973;0.0010636557126418;-0.00051450228784233;-2.30771729548e-05;-8.4019426140003e-05;-0.00012807783787139;-2.2556803742191e-05;-0.0014587754849344;0.000248819909757;-0.00015278898354154;-0.00026477102073841;-0.00053327088244259;0.00057594559621066;-0.00010111035226146;0.00055606989189982;0.00029288569930941;0.00012670407886617;0.0001135494603659;0.0011138382833451;-0.00023308048548643;9.3045446192264e-07;4.3271775211906e-05;0.00028681152616628;-3.4967317333212e-05;-1.9657620214275e-05;9.3443304649554e-06;3.8313311961247e-05;0.00018754415214062;-0.00056871160631999;1.4891294995323e-05;0.00037783253355883;-0.00018177913443651;-0.00011341203207849;0.00020193631644361;0.0002128876367351;-4.2176434362773e-05;5.1022878324147e-05;-1.4334961633722e-05;-0.0012947195209563;-9.4182803877629e-05;-0.00024913041852415;0.00014024325355422;0.00013659885735251;0.00052376673556864;-0.00015947691281326;-0.00041372943087481;1.3699658666155e-05;-0.00025737236137502;-5.5890701332828e-05;0.0010158132063225;0.00012882394366898;-0.00028643143014051;2.6321771656512e-05;0.00066081847762689;1.1146992619615e-05;5.0176076911157e-05;-1.0370418749517e-05;0.00034401105949655;3.5251956433058e-05;0.00012164226791356;-0.00019447092199698;0.00022588836145587;-0.00010442736675031;-0.00022022398479749;0.00019587932911236;-0.00045829190639779;-2.0702211259049e-05;0.00044449695269577;-8.6511499830522e-05;0.00070803542621434;-0.00013320593279786;-0.00020716246217489;-4.3659671064233e-05;-0.00016234484792221;-5.1051581976935e-05;0.00014570976782124;-9.9752098321915e-05;0.00021742279932369;-0.00022772107331548;5.0492813898018e-05;-0.00032655609538779;0.00015953487309162;0.00055142428027466;2.1265816030791e-05;-0.0010116971097887;8.6917469161563e-05;1.620686998649e-05;1.7281445252593e-05;4.1088384023169e-05;0.00011583097511902;-0.0015470754588023;-5.3107811254449e-05;-0.00023891204909887;0.00026001580408774;0.0015435613458976;-0.00069947988959029;7.733186976111e-06;-0.00012423099542502;-3.3294589229627e-05;-4.403857383295e-05;-0.0021746163256466;0.00032772638951428;-0.00029819339397363;-0.00046011817175895;-0.00074445287464187;0.00093064800603315;-0.00010267158359056;0.00086627353448421;0.00044354502460919;7.8975172073115e-06;0.00015365195577033;0.0017045652493834;-0.00028796575497836;-5.3012921853224e-05;6.7704124376178e-05;0.00039874608046375;-4.1305494960397e-05;-2.3060012608767e-05;3.6551830362441e-06;1.7776479580789e-05;0.00026990551850758;-0.00065928470576182;2.0172554286546e-05;0.00067474599927664;-0.00035711089731194;-0.00048358159256168;0.00048580681323074;0.00028340265271254;-3.8241822039708e-05;-5.4525000450667e-05;-2.9931341487099e-05;-0.0015462597366422;-0.00023941292602103;-0.00031474576098844;0.00030768997385167;0.00031204707920551;0.00065592321334407;-0.0002499598194845;-0.00078104250133038;-3.021392330993e-05;-0.00027104665059596;-0.00010722027218435;0.0012445363681763;0.00028677767841145;-0.00036441680276766;2.5612764147809e-05;0.00091863825218752;4.3363357690396e-05;6.2829691160005e-05;-1.2036434782203e-05;0.00051379867363721;5.1103361329297e-05;0.00040133341099136;-0.00028286408632994;0.0004930843715556;-0.00013881805352867;-0.00033879055990838;0.00026408967096359;-0.00060607510386035;-3.6653200368164e-05;0.00075210764771327;-0.00011769511183957;0.0010266728932038;-0.00017184963508043;-0.00027544077602215;3.6518133128993e-05;-0.00023820159549359;-0.00016639188106637;0.00017694091366138;-0.0003301466058474;0.0003195435856469;-0.00043960535549559;8.1734993727878e-05;-0.0006989439134486;0.00020973751088604;0.00073030625935644;3.4529475669842e-05;-0.0014138530241325;0.00011303471546853;1.539306504128e-05;1.6564721590839e-05;7.1292473876383e-05;0.00011789739801316;-0.0014889648882672;-6.7025313910563e-05;-0.00027046902687289;0.00018899825226981;0.0014089643955231;-0.0005888266605325;2.2477470338345e-05;-0.00011267124500591;3.5960587410955e-05;-5.1685416110558e-05;-0.0020307840313762;0.00026336859446019;-0.00032175739761442;-0.0004823409835808;-0.00066730630351231;0.00092570239212364;-6.4222505898215e-05;0.0008533070795238;0.00042679533362389;-7.2039503720589e-05;0.00013220281107351;0.0016342946328223;-0.00021427785395645;-6.7176923039369e-05;6.3715131545905e-05;0.00034861301537603;-2.5999319404946e-05;-1.5350835383288e-05;-5.1384768084972e-06;-1.2890621974293e-06;0.00024891755310819;-0.00044068408897147;1.0628653399181e-05;0.00075675692642108;-0.00040763308061287;-0.00070776726352051;0.00060738838510588;0.00022684615396429;-1.8544722479419e-05;-0.00011336037277943;-4.1192444768967e-05;-0.0011763072106987;-0.00030663912184536;-0.00025571350124665;0.00038591420161538;0.00037896112189628;0.00050456362077966;-0.00024685804964975;-0.00090130523312837;-6.5328589698765e-05;-0.00018554170674179;-0.00011504880239954;0.00093538261717185;0.00035073730396107;-0.00028647517319769;1.5389139662147e-05;0.00080292025813833;6.5771921072155e-05;5.2511099056574e-05;-8.6378549895016e-06;0.00048893707571551;4.7478901251452e-05;0.00051684939535335;-0.00025780094438232;0.00055618066107854;-0.0001154420824605;-0.00031260578543879;0.00022145689581521;-0.00052279070951045;-3.9248217944987e-05;0.00078016275074333;-0.00010396027209936;0.00094784086104482;-0.00013920101628173;-0.00024349210434593;9.5985473308247e-05;-0.00022055978479329;-0.00020990044868086;0.00014357388135977;-0.00042501286952756;0.00029429484857246;-0.00048994628014043;8.0570396676194e-05;-0.00078165828017518;0.00017403444508091;0.00063189800130203;3.6144287150819e-05;-0.0012927264906466;9.5064162451308e-05;2.2029405954527e-05;-1.4159601050778e-05;2.348793350393e-05;2.254192258988e-05;-0.00012105004134355;-2.8017113436363e-05;3.6936489777872e-05;-0.00014159460260998;-0.00022709780023433;0.00032910690060817;-2.0759449398611e-05;1.5952937246766e-05;7.1968264819589e-05;-5.5356504162773e-05;4.9245867558056e-05;-0.00019010331016034;-6.1802486015949e-05;-7.7373821113724e-05;-2.412034336885e-05;0.00014010861923452;-4.5736696847598e-06;8.0082172644325e-05;6.6488770244177e-05;-4.1882147343131e-05;-5.3359776757134e-06;-1.7025451597874e-05;0.00016813576803543;1.3973079148855e-05;-8.0776480899658e-06;-8.7906053522602e-05;8.6177919001784e-05;3.2403124805569e-06;-1.4457713177762e-06;-1.327924655925e-05;1.1737378372345e-05;0.00018093061225954;0.00010580716480035;0.00022190870367922;6.3198327552527e-05;-0.00031820402364247;-9.1920319391647e-06;-3.1081352062756e-05;-1.3687562386622e-05;-0.00010272306826664;-7.3441849963274e-05;0.00014202848251443;2.7541047529667e-05;1.2971072465007e-05;0.00022493035066873;0.00018773383635562;-7.8839679190423e-05;-8.2025828305632e-05;-0.00033488270128146;-0.00021399582328741;6.7359753302298e-05;2.6972227715305e-05;-0.00014469141024165;-3.5713368561119e-05;6.0988422774244e-05;2.8409782316885e-05;3.9607111830264e-05;4.7839122998994e-05;-2.9503661380659e-07;2.7460753244668e-06;8.5911022324581e-05;3.1687999580754e-05;0.00032075357739814;0.00013430476246867;0.00017461356765125;8.495211659465e-05;-7.1518923505209e-05;-4.7001150960568e-05;1.1275225006102e-05;6.4920359363896e-06;0.00021848473988939;7.8789758845232e-05;0.00011916414950974;4.6762532292632e-05;-4.0570663259132e-05;0.00017194566316903;0.00016809802036732;-0.00010402379120933;-3.2516618375666e-05;-0.00030396794318222;-0.00019298339611851;-0.0002253502025269;-8.6094325524755e-05;-0.00024858419783413;-0.00010727590415627;4.2983979255951e-06;9.8316286312183e-07;-0.00015576909936499;-4.5311553549254e-05;3.328427192173e-05;-2.3514985514339e-05;2.6341645934735e-05;3.756631485885e-05;-0.00014878583897371;-2.9599304980366e-05;8.5757157648914e-05;-0.00021469579951372;-0.00042521866271272;0.00055555388098583;-3.2403186196461e-05;2.9960390747874e-05;9.8149168479722e-05;-6.7099630541634e-05;0.00012666870316025;-0.00030919667915441;-8.099168917397e-05;-9.0694971731864e-05;-2.6411991711939e-05;0.00019142965902574;-2.3010574295768e-05;8.2866114098579e-05;8.7560387328267e-05;-4.8596823035041e-05;-2.2579011783819e-05;-7.0108835643623e-05;0.00025505744270049;2.0847062842222e-05;-1.9967079424532e-05;-0.00012692557356786;0.00012875840184279;5.2147570386296e-06;-4.8151127884921e-07;-3.5684020986082e-05;2.8466902222135e-06;0.00026377581525594;0.0001707903429633;0.00032144496799447;0.00013394383131526;-0.00045697434688918;-7.2406168328598e-05;-4.2651910916902e-05;-2.439783202135e-05;-0.00017302352352999;-0.00012263176904526;0.00022302199795377;7.794702105457e-05;3.4099779441021e-05;0.00031881546601653;0.00026139701367356;-0.00011875542986672;-0.00012497726129368;-0.0004684341547545;-0.00031953895813785;0.00012325287389103;6.103369378252e-05;-0.00022267151507549;-9.2263457190711e-05;8.1408121332061e-05;4.5135249820305e-05;7.3811541369651e-05;7.6952695962973e-05;-9.3535078349305e-07;2.9754685328953e-06;0.00012347496522125;5.5227959819604e-05;0.00048504644655623;0.00024468623450957;0.00026485024136491;0.00015652475121897;-0.00011596811236814;-9.4287905085366e-05;2.0067916921107e-05;1.1513357094373e-05;0.00029414059827104;0.00012971639807802;0.00015387249004561;7.9046069004107e-05;-5.479491665028e-05;0.00031894110725261;0.00032342810300179;-0.00016730195784476;-7.7056021837052e-05;-0.00051360583165661;-0.00037042316398583;-0.00032540428219363;-0.00014545036538038;-0.0003486457571853;-0.00018468039343134;5.4712349992769e-06;9.892181651594e-07;-0.00019844848429784;-7.2969945904333e-05;3.831406502286e-05;-2.9020653528278e-05;1.7430311345379e-05;4.4381060433807e-05;-0.00010624823335093;-3.3993284887401e-05;0.0001604410354048;-0.00025872603873722;-0.00059235107619315;0.00070582440821454;-4.2596733692335e-05;3.9460115658585e-05;0.00010004776413552;-6.0694434068864e-05;0.00022449862444773;-0.00037602978409268;-7.2960458055604e-05;-7.0678208430763e-05;-2.9515744245145e-05;0.00017949170432985;-4.009278563899e-05;3.286930223112e-05;0.00010419150930829;-3.3086405892391e-05;-3.6963418097002e-05;-0.00015922488819342;0.00029943627305329;2.7555419364944e-05;-2.9997658202774e-05;-0.00014432812167797;0.00014256636495702;4.7351568355225e-06;1.4117789532975e-06;-5.1420633099042e-05;-1.3697841495741e-05;0.00029832989093848;0.00022710759367328;0.00034788285847753;0.00021818021195941;-0.00046272517647594;-0.00017770992417354;-4.2377392674098e-05;-3.1559222406941e-05;-0.0002052741474472;-0.00015070337394718;0.00024950911756605;0.0001432906719856;6.0063735872973e-05;0.00037080372567289;0.00028903386555612;-0.00014779866614845;-0.00015858512779232;-0.00051418034126982;-0.0003952051338274;0.00015084182086866;9.1106914624106e-05;-0.00025400877348147;-0.00016700553533155;8.1338606833015e-05;5.2835814130958e-05;9.377582318848e-05;9.2003705503885e-05;-2.5119395559159e-06;2.4367107016587e-06;0.0001334947446594;7.0924106694292e-05;0.0005380975198932;0.00032150716288015;0.00027755738119595;0.00021555231069215;-0.00012750527821481;-0.00013060600031167;2.6329933461966e-05;1.4024388292455e-05;0.00029152634670027;0.00016121049702633;0.00014796636241954;9.5457311545033e-05;-5.4938169341767e-05;0.00042160897282884;0.00042755113099702;-0.0002001899847528;-0.00011582849401748;-0.00061821384588256;-0.00050702848238871;-0.000347915221937;-0.00018190206901636;-0.00035454088356346;-0.00023417387274094;5.5495665947092e-06;1.0106066383742e-06;-0.00018748553702608;-8.8965243776329e-05;1.8247386833536e-05;-1.8397078747512e-05;-6.9947536758264e-06;3.3013584470609e-06;4.3541425839067e-05;9.261081868317e-05;0.00017858597857412;-6.5731685026549e-05;-0.00036870740586892;0.00030600043828599;-2.2949203412281e-05;2.5394867407158e-05;7.273430674104e-05;-4.1245111788157e-05;0.00020759527978953;-9.5554081781302e-05;2.2910713596502e-05;5.6569962907815e-05;-1.7823618691182e-05;1.8068712961394e-05;-0.0001054938256857;-6.9962494308129e-05;-3.4486100048525e-05;-9.5619170679129e-06;-3.5513182865543e-06;-0.0002064568689093;4.7138713853201e-05;8.6392137745861e-06;-2.1613217541017e-05;-9.1405658167787e-05;7.8595170634799e-05;-4.9549962568562e-06;6.2414824242296e-06;-2.9472287224053e-06;-1.5256040569511e-05;0.00012090500240447;0.00021580327302217;6.1239799833857e-05;0.0002947527973447;8.3737941167783e-06;-0.0003797709941864;-1.6202993435854e-07;-3.1515435694018e-05;-9.9425480584614e-05;-8.8872948253993e-05;1.6545420294278e-05;0.0001796142605599;3.0225417503971e-05;0.00025802024174482;0.00020236820273567;-8.923132554628e-05;-0.00010829931852641;-0.00024781073443592;-0.00037950227851979;3.6337532947073e-05;6.3487968873233e-05;-2.1787394871353e-05;-0.00021036172984168;2.4432907594019e-05;4.6561646740884e-05;6.3998355471995e-05;5.0989772717003e-05;-7.1601377271691e-08;1.416934765075e-06;4.7636323870393e-05;6.8267399910837e-05;0.00018596919835545;0.00024984206538647;7.006306987023e-05;0.00021270669822115;-2.8644639314734e-05;-9.3109811132308e-05;1.2956474165549e-05;1.4671502412966e-07;8.7275919213425e-05;0.00018694180471357;4.2570700315991e-05;0.00010094403842231;-3.7603931559715e-05;0.00020134406804573;0.00017583963926882;-6.3076593505684e-05;-8.5967287304811e-05;-0.00022502057254314;-0.00031367383780889;-0.00012327010335866;-0.00016334763495252;-0.00010619796375977;-0.00023056076315697;2.3257136945176e-06;6.586165909539e-06;-4.9823909648694e-05;-0.00013246427988634;1.3113703062118e-05;-1.4828014172963e-05;-5.6050075727399e-06;-6.3763427533559e-06;3.6904777516611e-05;0.00013092864537612;0.00013598836085293;-1.036877711158e-05;-0.00025518299662508;0.00017118023242801;-1.3186418982514e-05;2.0517383745755e-05;7.088111306075e-05;-4.3917862058152e-05;0.00015449267812073;-1.4852595086268e-05;3.3668948162813e-05;6.9726942456327e-05;-5.329862688086e-06;6.5480189732625e-06;-0.00011651240492938;-5.6687316828175e-05;-7.9908611951396e-05;-1.8148179151467e-05;7.5079951784573e-06;-0.00016301583673339;-2.1403409846243e-05;1.0939222647721e-06;-1.7122611097875e-05;-7.6909149356652e-05;6.6802662331611e-05;-5.95986693952e-06;6.2632107074023e-06;1.1541294952622e-05;-7.1038894020603e-06;7.8762037446722e-05;0.00018612973508425;6.8142376221658e-06;0.00027489446802065;7.2730101237539e-05;-0.0003654170432128;4.7315447773144e-06;-2.9374716177699e-05;-7.5898729846813e-05;-6.9413144956343e-05;-2.6547990273684e-05;0.00014924866263755;1.0882412425417e-05;0.00021781616669614;0.00018033711239696;-6.6870015871245e-05;-8.1247169873677e-05;-0.00018732459284365;-0.000349572772393;1.1278276360827e-05;4.6494988055201e-05;2.7768468498834e-05;-0.00017884184489958;1.8061395167024e-05;4.3665266275639e-05;5.3540439694189e-05;4.2611969547579e-05;1.4539735957442e-06;1.5199567542368e-06;3.1923609640216e-05;6.5216190705542e-05;0.00012050471559633;0.00021825153089594;4.5065371523378e-05;0.00019119326316286;-1.426326980436e-05;-7.461186760338e-05;8.3541362982942e-06;-4.520211405179e-06;6.3905637944117e-05;0.0001869254920166;3.2153206120711e-05;0.00010551763989497;-3.7286041333573e-05;0.00012979288294446;9.9759687145706e-05;-2.9380276828306e-05;-6.8974281020928e-05;-0.00013268862676341;-0.00023522785340901;-8.5908119217493e-05;-0.000152900654939;-7.6662057836074e-05;-0.00022073410218582;1.6584256172791e-06;1.0266256140312e-05;-3.6751436709892e-05;-0.00014355315943249;9.4974748208188e-06;-1.1762856956921e-05;-6.3555066844856e-06;-9.6803387350519e-06;3.5498531360645e-05;0.0001357282162644;0.00010886233212659;7.9878645919962e-06;-0.0001872007997008;9.9563803814817e-05;-7.8199964264059e-06;1.6355852494598e-05;6.0296897572698e-05;-3.9602964534424e-05;0.00011941159755224;2.6847894332604e-05;3.6822384572588e-05;7.0660062192474e-05;4.0205900404544e-06;-1.0952629736494e-06;-0.0001117556457757;-5.2375231462065e-05;-8.9080902398564e-05;-1.7726690202835e-05;1.0861987902899e-05;-0.00013189074525144;-5.1211784011684e-05;-1.5158825590333e-06;-1.3186436262913e-05;-6.1425947933458e-05;5.1271475967951e-05;-6.3886268435454e-06;5.7997799558507e-06;1.6249574400717e-05;-5.4599881877948e-06;5.3503070375882e-05;0.0001621446426725;-2.046247573162e-05;0.00025432542315684;0.00010032638238044;-0.00033581323805265;7.4286563176429e-06;-2.4164535716409e-05;-5.9565456467681e-05;-5.507853711606e-05;-4.6123204811011e-05;0.00012395443627611;5.2730733841599e-06;0.00018790399190038;0.00015731921303086;-5.5773703934392e-05;-6.5543768869247e-05;-0.00014414812903851;-0.00031846005003899;-2.3071272892139e-07;3.5764394851867e-05;4.9480273446534e-05;-0.00015526171773672;1.2146168955951e-05;3.5304492485011e-05;4.6197990741348e-05;3.9352558815153e-05;1.7896834378917e-06;1.3762488606517e-06;2.2885991711519e-05;5.925225559622e-05;7.9738012573216e-05;0.00018575905414764;3.0520764994435e-05;0.00016666171723045;-7.9667915997561e-06;-5.8337260270491e-05;4.4344001253194e-06;-8.0912659541355e-06;4.4863601942779e-05;0.00016876609879546;2.3872655219748e-05;9.6973257313948e-05;-3.2892476156121e-05;9.5757080998737e-05;5.9509788115975e-05;-1.5838511899346e-05;-5.8165405789623e-05;-8.3208076830488e-05;-0.00018887761689257;-5.9078785852762e-05;-0.0001336616842309;-5.4668078519171e-05;-0.00019493987201713;2.4381574803556e-06;1.348038767901e-05;-2.6277948563802e-05;-0.00013607539585792;-2.5023091438925e-05;-1.1743623872462e-05;-0.00011497347441036;-8.4659688582178e-05;6.8390021624509e-05;0.0015489892102778;-0.00025593873579055;0.00031494064023718;0.00068032648414373;-0.00157802447211;0.00017094015493058;5.313376095728e-05;6.4354484493379e-05;-8.3537262980826e-05;-0.00033036089735106;0.0020675710402429;0.00031102137290873;0.00045741800568067;0.00074268929893151;9.5782270363998e-05;-0.00089407147606835;-0.00039991684025154;-0.00097808439750224;-0.00021896068938076;-5.6112990023394e-06;0.00028953026048839;-0.001577548799105;-9.6266136097256e-05;4.396396775519e-07;5.3368694352685e-05;-0.00026417445042171;-7.0579462772002e-06;-8.2707911133184e-06;0.00026773873833008;3.7988676922396e-05;-4.8432964831591e-05;-0.00039012319757603;-0.00041242747101933;0.0010137364733964;0.00065176648786291;-0.0007959536742419;7.8621383181599e-07;0.00018378489767201;-5.9104855608894e-05;-7.0027056153776e-07;-0.0003643476520665;-0.0012550987303257;-0.00029076909413561;0.00034622134990059;0.00029948010342196;-0.00020309613319114;0.00049929204396904;-1.4624209825342e-06;-0.00095777469687164;-0.00013868426322006;-0.00021193554857746;0.00042202763142996;0.00076637888560072;1.4969301673773e-06;-0.00029794828151353;9.8345721198712e-05;0.00085414387285709;5.8460909713176e-06;3.3954776881728e-05;5.0812573135772e-06;0.00046423354069702;-0.00038494434556924;0.00062592176254839;-0.00012296880595386;0.00078637531260028;0.00025631242897362;-0.00039513793308288;-6.8594919866882e-05;-0.00047161080874503;-0.00017177767585963;0.0008228431106545;-0.00017217286222149;0.0010298170382157;-0.00021595078578684;0.00014023574476596;-0.00030246723326854;0.00018358464876655;-0.00028168325661682;0.00038815074367449;-0.00058662454830483;0.0001834452705225;-0.00046721828402951;0.00023686567146797;-0.0009431338403374;5.4929314501351e-05;0.0006024973699823;0.00012458662968129;-0.0013603952247649;-2.2172927856445e-05;-1.2607280041266e-05;-0.00010208807361778;-6.7447406763677e-05;5.5853168305475e-05;0.0014329594559968;-0.00026438443455845;0.00028350608772598;0.00066582043655217;-0.0014923388371244;0.00016110173601191;6.8196088250261e-05;5.6653247156646e-05;-4.6641995140817e-05;-0.00032879007630982;0.0019134086323902;0.00027188993408345;0.000408114050515;0.00071001687319949;0.00010172060137847;-0.00080988596891984;-0.00036810358869843;-0.00090666254982352;-0.00021153601119295;-4.5731012505712e-05;0.00029677562997676;-0.0014526152517647;-8.9848537754733e-05;-2.3328877432505e-05;5.4730891861254e-05;-0.00023656390840188;-1.1057320534746e-06;-1.1433357940405e-05;0.00025473345885985;5.6008764659055e-05;-4.1890885768225e-05;-0.00045069219777361;-0.00034474904532544;0.00087487016571686;0.00052522530313581;-0.00059799000155181;-1.3101935110171e-05;0.00017976257367991;-4.6042569010751e-05;3.9155846025096e-05;-0.00029284422635101;-0.0013099095085636;-0.00029653022647835;0.00027923774905503;0.00023058029182721;-0.00018323950644117;0.00051427335711196;1.6836085706018e-05;-0.00080306048039347;-0.00011861399980262;-0.00023523707932327;0.00034550673444755;0.00082836567889899;7.7877739386167e-06;-0.00029380767955445;7.542826642748e-05;0.0008124765008688;4.9664345169731e-06;3.3548349165358e-05;-1.8562459445093e-06;0.00043907173676416;-0.00036971687222831;0.0005478587700054;-0.00012314070772845;0.00066928373416886;0.00025556021137163;-0.0003740914107766;-6.0311922425171e-05;-0.00046190241118893;-0.00016754088574089;0.0007534172036685;-0.00017607801419217;0.0010024801595137;-0.0002082474384224;8.6937994637992e-05;-0.00028144859243184;0.00019842473557219;-0.00025347017799504;0.00036520464345813;-0.00047565167187713;0.00017185728938784;-0.0004189808096271;0.00023857051564846;-0.00085025810403749;4.9464619223727e-05;0.00059265224263072;0.00012494003749453;-0.0013115433976054;3.3937303669518e-05;-2.7828953079734e-06;-7.3144321504515e-05;5.2068364311708e-05;-0.0011958476388827;-1.6905793017941e-05;-0.00021140291937627;0.0002459328097757;0.0011292896233499;-0.00053631997434422;-0.00019651411275845;-7.5339696195442e-05;-0.0003787289315369;-3.750428368221e-05;-0.0013585233828053;0.00024491143994965;-0.00011308795365039;-0.00030329092987813;-0.00060449860757217;0.00057168205967173;-0.00010547876445344;0.00074050400871783;0.00029301308677532;0.00044701204751618;0.00012710975715891;0.0011787321418524;-0.00024045364989433;0.00021883836598136;3.6783265386475e-05;0.00014561490388587;-1.5605286534992e-05;-1.8400864064461e-05;1.2378201972751e-05;0.00015570619143546;0.00021861806453671;-0.00059138837968931;-1.8222424841952e-05;0.00045540649443865;-0.0001487398694735;4.6140354243107e-05;0.00011818665370811;0.0001397606683895;-6.6873872128781e-05;0.00028823464526795;-2.7775551643572e-05;-0.001567292958498;-5.287972453516e-05;-0.0003257914504502;0.00016311145736836;5.6788117944961e-05;0.00055441004224122;-0.00016261184646282;-0.00045960376155563;6.7642031353898e-05;-0.0004149237065576;-2.8717715395032e-05;0.0010847247904167;0.00010074691090267;-0.00023539268295281;4.1573337512091e-05;0.00060700433095917;8.1825883171405e-06;6.5743413870223e-05;-1.0639204447216e-05;0.00043366666068323;9.5224231699831e-06;0.00011457389337011;-0.00023099548707251;2.383005039519e-06;-0.00013399601448327;-0.00022199333761819;0.00023944446002133;-0.00057476107031107;-1.1428603102104e-05;0.00059492961736396;-0.00012174146831967;0.00099913182202727;-0.00017809931887314;-0.00026767596136779;-0.00021164205099922;-0.00015359837561846;-4.9955280701397e-05;0.00027779035735875;0.000125819715322;0.0002259492612211;-0.00030170497484505;5.3400737670017e-05;-0.00036287604598328;0.00021694159659091;0.0006994673749432;2.4731174562476e-05;-0.0013738457346335;0.00012145736400271;3.1495412258664e-05;6.1569121498906e-06;2.3056816644385e-05;8.2465929153841e-05;-0.0014136512763798;-5.9411646361696e-05;-0.00027340051019564;0.00024180309264921;0.001371000893414;-0.00061101518804207;-0.00013651206973009;-0.00010186686995439;-0.00014862352691125;-6.1190738051664e-05;-0.0017483413685113;0.00027092834352516;-0.0002365413820371;-0.00043728016316891;-0.00070263724774122;0.00077778787817806;-7.1163711254485e-05;0.00088641326874495;0.00039553522947244;0.00019559926295187;0.0001522372913314;0.0014509971952066;-0.00024033518275246;0.00012923894973937;5.6017583119683e-05;0.00018365599680692;-1.2419182894519e-05;-2.0927131117787e-05;6.7238306655781e-06;0.0001159653038485;0.00025881725014187;-0.00061910710064694;5.5384730330843e-06;0.0006001137662679;-0.00026322333724238;-0.00025881270994432;0.00032457025372423;0.000189247642993;-5.3837728046346e-05;0.00012314837658778;-3.1735584343551e-05;-0.0015622518258169;-0.00015760635142215;-0.00033983521279879;0.00027160625904799;0.00020908332953695;0.00060470087919384;-0.00021617257152684;-0.00067426450550556;-7.7237757523108e-07;-0.00036471645580605;-7.4257703090552e-05;0.001174449454993;0.00020602517179213;-0.00026844535022974;3.524652129272e-05;0.00075097853550687;2.9750874091405e-05;6.2597093346994e-05;-9.0272596935392e-06;0.00051976589020342;2.0272342226235e-05;0.0003725964052137;-0.000277003768133;0.0002564451424405;-0.00014456248027273;-0.00030273204902187;0.00026870775036514;-0.00060165469767526;-2.3353779397439e-05;0.00078520056558773;-0.00012589868856594;0.00112910696771;-0.00018629617989063;-0.00028350931825116;-0.00010946522525046;-0.00020292971748859;-0.00015462540613953;0.00026531127514318;-0.00010491564898985;0.00028822923195548;-0.0004614440840669;7.1763730375096e-05;-0.00066934683127329;0.00022735932725482;0.00073677633190528;3.1000323360786e-05;-0.0015016482211649;0.00012328098819125;3.0409257306019e-05;4.8838201109902e-06;7.0990347012412e-05;7.7267548476811e-05;-0.0012495227856562;-7.6922195148654e-05;-0.00030772562604398;0.00014991985517554;0.0011141027789563;-0.00044466278632171;-0.00013096882321406;-8.329983393196e-05;-4.0224829717772e-05;-7.1863774792291e-05;-0.001409497577697;0.00017851665324997;-0.00025357431150042;-0.00043869111686945;-0.00056895392481238;0.00071377458516508;-1.3525877875509e-05;0.0008242508629337;0.0003494537959341;8.2967460912187e-05;0.00012322978000157;0.0012553181732073;-0.00013937121548224;0.00012764282291755;4.9239159125136e-05;6.6300330217928e-05;1.0537555681367e-05;-1.2296799468459e-05;-2.0492780095083e-06;0.00010088434646605;0.00022076585446484;-0.00036800795351155;5.2576149300876e-07;0.00062414928106591;-0.0002731800195761;-0.00043021453893743;0.0003894072433468;0.00010607349395286;-3.3903772418853e-05;5.5839780543465e-05;-3.7184330722084e-05;-0.0010568598518148;-0.00019423945923336;-0.00026029098080471;0.00033200360485353;0.00024518897407688;0.00041024692473002;-0.00020154390949756;-0.00072912720497698;-3.6893721699016e-05;-0.0002555004612077;-7.3424715083092e-05;0.00077546911779791;0.00023374189913739;-0.00014953178470023;2.4429895347566e-05;0.00055111869005486;4.4403859646991e-05;4.5077489630785e-05;-4.0103764149535e-06;0.00046621702495031;4.4982234612689e-06;0.00051605619955808;-0.00023065184359439;0.00025690725306049;-0.00011209624790354;-0.00025931911659427;0.00021138878946658;-0.00046748635941185;-1.9292350771138e-05;0.00079148187069222;-0.00010211337939836;0.0010293524246663;-0.00014452768664341;-0.00022552254085895;-6.5793465182651e-05;-0.00015617546159774;-0.00021526520140469;0.00023585128656123;-0.000156001697178;0.00022962133516558;-0.00050566042773426;6.162142381072e-05;-0.00077520002378151;0.00017955177463591;0.00057920103427023;2.8097687390982e-05;-0.0012927381321788;9.693049651105e-05;2.6558753233985e-05;-1.5201902897388e-05;3.1541956559522e-05;2.1832249331055e-05;-0.00016245547158178;-3.3533560781507e-05;1.6302672520396e-05;-0.00015282361709978;-0.00021093204850331;0.00033894082298502;-2.4199944164138e-05;1.4174164789438e-05;8.823267853586e-05;-7.6931442890782e-05;3.7554131267825e-05;-0.00020356774621177;-7.7712611528113e-05;-0.00010662406566553;-3.4785760362865e-05;0.00017507361189928;3.0579053600377e-06;0.0001250461791642;7.6261196227279e-05;-5.4925789299887e-05;5.2273589972174e-06;1.8673619024412e-06;0.00018730187730398;1.764591979736e-05;-3.1640372526454e-06;-0.00011273914424237;0.00010297833068762;3.1571687486576e-06;-1.7518510730952e-06;-5.47576973986e-07;2.2827323846286e-05;0.00020162922737654;0.00011475026985863;0.00024507564376108;5.6638342357473e-05;-0.00035963600385003;7.8889052019804e-06;-4.1836112359306e-05;-1.5770448953845e-05;-0.0001029804625432;-7.7745055023115e-05;0.00015332129260059;1.9833130863844e-05;-3.1366889174933e-07;0.00025656091747805;0.00022097153123468;-8.2302918599453e-05;-8.7186766904779e-05;-0.00038485150435008;-0.00024396920343861;6.0783993831137e-05;2.0714966012747e-05;-0.00015352338959929;-2.6027251806227e-05;8.4877341578249e-05;3.3850643376354e-05;2.6279405574314e-05;4.9282098188996e-05;-4.7117833901211e-07;4.6026007112232e-06;0.00010103804379469;3.0186525691533e-05;0.00037801222060807;0.00013049528934062;0.0001969532459043;8.1115205830429e-05;-8.1225101894233e-05;-3.9261558413273e-05;1.7617638150114e-05;7.6846672527608e-06;0.00028044023201801;8.6608619312756e-05;0.0001593857887201;4.875092417933e-05;-5.1570787036326e-05;0.00015299870574381;0.00015551432443317;-0.00011229253141209;-1.5028985217214e-05;-0.00031294042128138;-0.00017388399282936;-0.00027526513440534;-9.2038710135967e-05;-0.00031049415702;-0.00011190229997737;-1.5144163398872e-06;1.478404954014e-07;-0.00020389977726154;-4.9762802518671e-05;3.7549933040282e-05;-2.4566670617787e-05;3.6773162719328e-05;3.6848388845101e-05;-0.00019763920863625;-2.9914868719061e-05;5.8242589147994e-05;-0.00022175899357535;-0.00039831933099777;0.00055658852215856;-3.4125634556403e-05;2.8136615583207e-05;0.00011898132652277;-9.0771565737668e-05;0.00010496082541067;-0.00031931363628246;-9.8613927548286e-05;-0.0001203230858664;-3.4779110137606e-05;0.00023117645469029;-1.7475031199865e-05;0.00013274990487844;9.2067079094704e-05;-6.7229353589937e-05;-1.121422428696e-05;-4.2967287299689e-05;0.0002707212115638;2.2374217223842e-05;-1.477575096942e-05;-0.00015085151244421;0.00014746896340512;5.4624097174383e-06;-8.1842802046594e-07;-2.3263584807864e-05;1.6093828890007e-05;0.00028451249818318;0.0001767892827047;0.00034458591835573;0.00012099320883863;-0.00050542323151603;-4.7022014769027e-05;-5.2531424444169e-05;-2.6766780138132e-05;-0.00017597977421246;-0.00012631510617211;0.00023490490275435;6.5397383878008e-05;1.7504908100818e-05;0.00034847189090215;0.00029618118423969;-0.00011917587107746;-0.0001272375084227;-0.00051944720325992;-0.0003470454539638;0.00011751279089367;5.2522598707583e-05;-0.0002300641790498;-7.6325828558765e-05;0.0001040416318574;5.1786217227345e-05;6.3295767176896e-05;7.7359931310639e-05;-5.1741596962529e-07;4.6952341108408e-06;0.00013861093611922;5.4154828831088e-05;0.00054156046826392;0.00023939319362398;0.00029231034568511;0.00014984478184488;-0.00012692040763795;-8.5178849985823e-05;2.5100289349211e-05;1.3078735719319e-05;0.00035767801455222;0.00014007055142429;0.00019339899881743;8.3162434748374e-05;-6.740177195752e-05;0.00029266244382598;0.00030460575362667;-0.00017226148338523;-5.76096426812e-05;-0.00051849253941327;-0.00034175041946582;-0.00037603825330734;-0.00015280485968105;-0.00041328629595228;-0.00019098920165561;2.073723948115e-07;-4.3420550355222e-07;-0.00024716643383726;-7.9682606155984e-05;3.7054473068565e-05;-2.6113330022781e-05;2.8065223887097e-05;3.8716636481695e-05;-0.00015957072901074;-1.9262890418759e-05;9.2096786829643e-05;-0.00021872879005969;-0.00046878194552846;0.00060020963428542;-3.5613495128928e-05;3.2506010029465e-05;0.00010979129001498;-7.5704527262133e-05;0.00015420578711201;-0.00033263201476075;-8.4541854448617e-05;-9.3516733613797e-05;-3.000389187946e-05;0.00020671909442171;-3.2757801818661e-05;9.2034810222685e-05;8.2953083619941e-05;-5.3156130888965e-05;-2.1994988856022e-05;-8.849443111103e-05;0.00026654225075617;2.2485039153253e-05;-2.1293615645845e-05;-0.00014554032532033;0.00014432735042647;5.4289666877594e-06;7.7308635582085e-07;-3.5241766454419e-05;3.1437373309018e-06;0.00027365252026357;0.00018839281983674;0.00032797106541693;0.00015848658222239;-0.00046841314178891;-0.00010786673374241;-4.7177501983242e-05;-3.0301840524771e-05;-0.00018693989841267;-0.00013511310680769;0.00023444923863281;0.0001013932924252;3.0356761271833e-05;0.00033245806116611;0.00027511836378835;-0.00011896948853973;-0.0001299988507526;-0.0004855846054852;-0.00034544261870906;0.00013154036423657;7.0079695433378e-05;-0.00022888816602062;-0.00011394570901757;9.2336813395377e-05;5.3820749599254e-05;7.4722811405081e-05;7.9758501669858e-05;-1.0456163863637e-06;3.6880883271806e-06;0.0001310523803113;6.0342306824168e-05;0.00052908511133865;0.00027343136025593;0.00028019756427966;0.00017582341388334;-0.00012745009735227;-0.00010607322474243;2.6784258807311e-05;1.4217609532352e-05;0.00031924396171235;0.0001503165694885;0.00016810947272461;9.0525594714563e-05;-6.1243619711604e-05;0.00033710990101099;0.00035786349326372;-0.00017697925795801;-8.0763027654029e-05;-0.00055015092948452;-0.0004053920856677;-0.00035558038507588;-0.00016545099788345;-0.00037940058973618;-0.00021117120923009;2.6426369004184e-07;-1.0280439255439e-06;-0.000211800186662;-8.4526058344636e-05;2.0995110389777e-05;-2.187618156313e-05;-5.6526555454184e-06;-7.0927660544839e-07;8.8040615082718e-06;0.00017917995864991;0.00016507419059053;2.2865953724249e-05;-0.00036977286799811;0.00027224008226767;-2.1243789888103e-05;2.7605939976638e-05;9.5034927653614e-05;-4.6030560042709e-05;0.00021724485850427;-6.7122608015779e-05;3.3229309337912e-05;7.7421791502275e-05;-3.624376404332e-05;3.7070807593409e-05;-0.00015839954721741;-3.7068595702294e-05;-0.000112022011308;-2.0340759874671e-05;-2.2341245653479e-07;-0.00020529709581751;-2.1147468942218e-05;2.6008954137069e-06;-2.5905399525072e-05;-0.00011152686056448;0.00010121498780791;-3.5992511584482e-06;8.6625977928634e-06;2.937429371741e-06;-8.7721346062608e-06;9.459670400247e-05;0.00020781000785064;3.9740858483128e-05;0.00030342728132382;4.7550835006405e-05;-0.00045518903061748;-1.9103372324025e-06;-4.7533583710901e-05;-0.00011299941252219;-0.00010809525701916;-2.0421009594429e-06;0.00021225560340099;2.7150088044436e-06;0.00021764429402538;0.00018963677575812;-5.2980798500357e-05;-8.6278851085808e-05;-0.0002217586588813;-0.00034981383942068;3.7972222344251e-05;7.9070334322751e-05;7.2761986302794e-06;-0.00021957982971799;3.1976192985894e-05;7.1371367084794e-05;6.9567242462654e-05;4.6342145651579e-05;1.5451428225788e-06;3.043751576115e-06;4.5511282223742e-05;8.0072371929418e-05;0.00020925819990225;0.00030816759681329;6.7476976255421e-05;0.00027010787744075;-2.7314086764818e-05;-0.00013576088531408;2.0214220057824e-05;3.4942161164508e-06;9.9883494840469e-05;0.0002472719643265;5.017493822379e-05;0.00014417472993955;-5.0504691898823e-05;0.00018916997942142;0.00020853760361206;-4.576364881359e-05;-9.257833880838e-05;-0.0002384355320828;-0.0003430247597862;-0.000144275589264;-0.00020756389130838;-0.00012204939412186;-0.00031086103990674;-2.8186509553052e-06;1.2571372280945e-06;-5.329167470336e-05;-0.00017511931946501;1.6292611690005e-05;-1.9141678421875e-05;-3.5989201023767e-06;-9.0951953097829e-06;2.4783023036434e-05;0.00019244018767495;0.00014712176925968;3.2499214285053e-05;-0.00028610951267183;0.00017395956092514;-1.3456000488077e-05;2.5677218218334e-05;9.5831324870232e-05;-5.3648931498174e-05;0.00017783798102755;-7.3902142503357e-06;4.2626703361748e-05;9.1508474724833e-05;-1.287553277507e-05;1.5423762306455e-05;-0.0001579742092872;-4.6832527004881e-05;-0.00013537738414016;-2.9618957341881e-05;9.0727498900378e-06;-0.0001844859943958;-5.2916995628038e-05;-3.4368947581243e-06;-2.280575245095e-05;-9.8596887255553e-05;9.2287009465508e-05;-5.7215538618038e-06;7.8246430348372e-06;1.8118145817425e-05;-3.1013306056593e-07;8.3415856352076e-05;0.00020408116688486;3.1188949378702e-06;0.00030469047487713;9.1124704340473e-05;-0.00043726593139581;3.9690639823675e-06;-4.2737199692056e-05;-9.1491958301049e-05;-8.4682040323969e-05;-3.3562868338777e-05;0.0001773138938006;-4.8325573516195e-06;0.00023109631729312;0.00020533410133794;-5.9386467910372e-05;-7.959057984408e-05;-0.00021144399943296;-0.0003813918447122;1.1199514119653e-05;5.5831333156675e-05;3.969205863541e-05;-0.00019784699543379;2.5356732294313e-05;6.5698637627065e-05;6.1307364376262e-05;4.1091232560575e-05;2.9395159799606e-06;2.289893473062e-06;3.3914086088771e-05;8.0452642578166e-05;0.00014552859647665;0.00027969051734544;5.0629801989999e-05;0.00024210225092247;-1.1697735317284e-05;-0.00010533163731452;1.3578605830844e-05;-1.5341425978477e-06;8.0961683124769e-05;0.00024740307708271;3.8409594708355e-05;0.00014612506492995;-5.0254147936357e-05;0.00013119842333253;0.00011940285185119;-1.8644030205905e-05;-8.0659381637815e-05;-0.00015100897871889;-0.00027044033049606;-0.00010864371142816;-0.00019970000721514;-9.4901057309471e-05;-0.00029431525035761;-1.6453554962936e-06;7.0864780354896e-06;-4.3832067603944e-05;-0.00018910525250249;1.1717812412826e-05;-1.5163935131568e-05;-3.5716598176805e-06;-1.0985418157361e-05;2.6702955437941e-05;0.00017802468209993;0.00011524423462106;3.9593811379746e-05;-0.00020648747158702;9.9998367659282e-05;-7.6840942710987e-06;2.1304978872649e-05;7.9409190220758e-05;-4.5592300011776e-05;0.00013410835526884;2.6643401724868e-05;4.210935003357e-05;8.7236207036767e-05;2.7741727137709e-08;4.1377288653166e-06;-0.00013945229875389;-4.4321721361484e-05;-0.00013215051149018;-2.7451245841803e-05;9.8051696113544e-06;-0.00014582478615921;-6.9040164817125e-05;-5.4617598834739e-06;-1.9050228729611e-05;-7.6898570114281e-05;7.3072187660728e-05;-5.7858792388288e-06;6.4717905843281e-06;2.1281655790517e-05;2.486320454409e-06;6.0482947446872e-05;0.00016849808162078;-1.7233698599739e-05;0.0002634578559082;0.00010313031816622;-0.00037161965155974;6.1083251239324e-06;-3.4964530641446e-05;-6.9612528022844e-05;-6.2876672018319e-05;-4.5472817873815e-05;0.00013592142204288;-8.0450345194549e-06;0.00019502156646922;0.00017502818081994;-5.0136633944931e-05;-6.1992024711799e-05;-0.0001658051769482;-0.00033201128826477;-4.3048828501924e-07;3.9534777897643e-05;5.1712715503527e-05;-0.00015922490274534;1.7810636563809e-05;5.3560030210065e-05;5.01577706018e-05;3.4546912502265e-05;3.131601260975e-06;1.7521944073451e-06;2.3096999939298e-05;6.9993213401176e-05;9.5335570222232e-05;0.00023087089357432;3.4264878195245e-05;0.00019959469500463;-3.4847896586143e-06;-8.1007841799874e-05;8.364356290258e-06;-4.736552000395e-06;5.685460564564e-05;0.00021360877144616;2.6297460863134e-05;0.00012930469529238;-4.2417912482051e-05;9.1275258455426e-05;7.0188987592701e-05;-4.4968501242693e-06;-6.6374355810694e-05;-9.3952803581487e-05;-0.00020783793297596;-7.4867573857773e-05;-0.00016851599502843;-6.6054308263119e-05;-0.00024858192773536;-1.588699376498e-07;1.0198829841102e-05;-3.0665032682009e-05;-0.00017098024545703;-1.3667930943484e-05;-2.8786071197828e-05;-7.4436778959353e-05;-8.1903039244935e-05;8.5523490270134e-05;0.0015014812815934;-0.00025759305572137;0.00041941201197915;0.00064775813370943;-0.0015243624802679;0.00015417432587128;0.00020108153694309;0.00010185017890763;8.1126432860401e-07;-0.00029531889595091;0.0017327063251287;0.00026791109121405;0.0004936174955219;0.00074664660496637;4.9093363486463e-05;-0.00079429935431108;-0.00037772432551719;-0.0011031157337129;-0.00024102996394504;-0.00016273984510917;0.00025384113541804;-0.0014167008921504;-9.2509930254892e-05;-0.00019710326159839;1.9052637071582e-05;-1.3669354302692e-05;2.3756668099395e-07;-1.1365124009899e-05;0.00028293379000388;0.0001573110348545;-5.7295197620988e-05;-0.00045246776426211;-0.00032723229378462;0.00092926860088482;0.00049084139754996;-0.00054118176922202;-2.9028611606918e-05;9.9987853900529e-05;-6.0019381635357e-05;0.00016856293950696;-0.00027642952045426;-0.0014184530591592;-0.0003596939786803;0.00032329646637663;0.00021010413183831;-0.00018196568998974;0.00051158084534109;1.5697474736953e-05;-0.00085490639321506;-0.00010571358870948;-0.00032039030338638;0.00033848854945973;0.00084727292414755;1.9249799152021e-05;-0.00021256820764393;7.7769043855369e-05;0.00073610845720395;1.192939998873e-05;3.3432686905144e-05;-4.0823568269843e-05;0.00052163819782436;-0.00041025105747394;0.00066203204914927;-0.00013609694724437;0.00052483758190647;0.0002837642095983;-0.00038214056985453;-5.4404736147262e-05;-0.0005073553766124;-0.00019349555077497;0.00093166023725644;-0.00020607006445061;0.0012655329192057;-0.00024453533114865;-4.9822057917481e-05;-0.00028355151880533;0.00032927977736108;-0.00030769806471653;0.00037722993874922;-0.00031898403540254;0.00018190934497397;-0.0005443929694593;0.00027805077843368;-0.0009990525431931;5.333360604709e-05;0.00066949398024008;0.00014740122423973;-0.0015928514767438;-9.2603095254162e-06;-3.4780299756676e-05;-6.8577995989472e-05;-5.4413245379692e-05;7.4107047112193e-05;0.0015491129597649;-0.00029727385845035;0.00042861237307079;0.00069856533082202;-0.0015861231368035;0.00015585338405799;0.00025675824144855;9.8214200988878e-05;9.4478156825062e-05;-0.00032471620943397;0.001734857680276;0.00023979702382348;0.00048219307791442;0.00079281564103439;7.1883237978909e-05;-0.00077992049045861;-0.00037885026540607;-0.0011438484070823;-0.00025350085343234;-0.00027817883528769;0.00029326890944503;-0.001439391169697;-9.1413494374137e-05;-0.00026884983526543;2.4212051357608e-05;1.4368994015967e-05;7.3603773671493e-06;-1.5583262211294e-05;0.00030085982871242;0.00020186265464872;-6.9045410782564e-05;-0.00055466347839683;-0.00028743816073984;0.00090857013128698;0.00039676047163084;-0.00036448668106459;-5.2176044846419e-05;0.00010470200504642;-5.5868509662105e-05;0.00026647766935639;-0.00022356213594321;-0.0016640319954604;-0.00040823081508279;0.0002951929345727;0.00013944001693744;-0.00018389259639662;0.00058023456949741;5.655775021296e-05;-0.00080188503488898;-8.5153107647784e-05;-0.00039905463927425;0.00029011251172051;0.00099350581876934;3.0487006370095e-05;-0.00023792439606041;6.1010076024104e-05;0.00076986238127574;1.1477597581688e-05;3.8709822547389e-05;-5.5437649280066e-05;0.00055620505008847;-0.00043311962508596;0.00061975477728993;-0.00014873460168019;0.00039461968117394;0.00030819754465483;-0.00038473994936794;-4.9477170250611e-05;-0.0005700511392206;-0.00021384377032518;0.00094750081188977;-0.00023310937103815;0.0013929747510701;-0.0002674980496522;-0.00013334571849555;-0.00028141605434939;0.0003929419326596;-0.00030482851434499;0.0003794954973273;-0.00018472854571883;0.0001872893772088;-0.00053860445041209;0.00031175653566606;-0.00097240507602692;5.3725718316855e-05;0.00075506331631914;0.00016674849030096;-0.0017451213207096;3.6496001030173e-06;-3.2804360671435e-05;-2.5216044377885e-05;2.1163523342693e-05;3.1985953683034e-05;0.001006837701425;-0.00021955839474685;0.00028649516752921;0.0004664929874707;-0.0010258632246405;9.0043038653675e-05;0.00024828859022819;6.4163032220677e-05;0.00022585387341678;-0.00021679227938876;0.001009747502394;9.4026370788924e-05;0.00029264442855492;0.00054056599037722;6.7848799517378e-05;-0.00044694196549244;-0.0002295771118952;-0.00078014086466283;-0.00017116163508035;-0.00037291966145858;0.00020975226652808;-0.00088065094314516;-5.1672315748874e-05;-0.00028886873042211;1.1082012861152e-05;7.1526650572196e-05;1.1922888006666e-05;-1.2445058018784e-05;0.00020508994930424;0.00019992444140371;-6.4485146140214e-05;-0.00041839969344437;-0.0001309110521106;0.00055140990298241;0.00013572513125837;-1.8884336896008e-05;-5.9123063692823e-05;3.9600210584467e-05;-3.8574398786295e-05;0.00032733456464484;-7.9372490290552e-05;-0.0013088549021631;-0.00031377206323668;0.00016137221246026;5.9194426285103e-06;-0.00010553808533587;0.00040840936708264;7.7867123764008e-05;-0.00045144668547437;-2.3347400201601e-05;-0.00035415880847722;0.00012987323862035;0.00074027851223946;3.373232902959e-05;-0.00014755601296201;2.3475990019506e-05;0.00047493391321041;8.4807315943181e-06;3.0618044547737e-05;-5.6802316976245e-05;0.00038566079456359;-0.00029714283300564;0.00032038227072917;-0.00010449246474309;6.2373765103985e-05;0.00021387878223322;-0.0002232174447272;-2.6047720893985e-05;-0.00042343739187345;-0.00015912750677671;0.00061600271146744;-0.00017396190378349;0.0010104675311595;-0.00019874231657013;-0.00020927829609718;-0.0001780489255907;0.00033449192414992;-0.00017392904555891;0.00024291676527355;7.4700466939248e-05;0.00012470580986701;-0.00033786954008974;0.00023086172586773;-0.00053713558008894;3.5790420952253e-05;0.00056954065803438;0.00012721079110634;-0.0012888499768451;4.1467221308267e-05;-2.506750934117e-05;-0.00027756069903262;-1.0126472261618e-05;-0.00078055396443233;7.2152128268499e-05;-0.00017598460544832;0.00017009317525662;0.00048639357555658;-0.00024723209207878;-0.00032564293360338;-1.8744609633359e-06;-0.00090228003682569;-8.7679825355735e-07;-0.00038332625990734;0.0001083565002773;0.00012670102296397;-7.5167605245952e-05;-0.00030968061764725;0.0001739566505421;-0.00013959786156192;0.00049999222392216;4.3881100282306e-05;0.00099418614991009;4.5104872697266e-05;0.00061316520441324;-0.00015059164434206;0.00043059841846116;-1.0447142813064e-05;7.7980412243051e-06;2.1644698335876e-06;1.5735238321213e-06;9.9719100035145e-06;0.00023293511185329;0.00011014170013368;-0.00019939252524637;-9.3472328444477e-05;0.00031146488618106;8.5390402091434e-06;0.00035359564935789;-0.00012278200301807;-8.7819062173367e-05;-6.7184919316787e-05;0.00061149394605309;-4.3753138015745e-05;-0.0010821595788002;5.7857960200636e-05;-0.00022221486142371;6.4750012825243e-05;-0.00016927064280026;0.0002171950036427;-4.2677525925683e-05;-0.00021347907022573;0.00016483123181388;-0.00040366512257606;5.8141271438217e-05;0.00042580484296195;-1.196848188556e-05;-1.8712760720518e-05;4.2089584894711e-05;0.00010625104914652;1.9152369077347e-06;6.5009662648663e-05;-9.2235022748355e-06;0.00022290468041319;-2.1796573491883e-05;-0.00026968875317834;-0.00011506723967614;-0.00045591534581035;-8.9459143055137e-05;-1.4240153177525e-05;0.00012717688514385;-0.00041960371891037;8.1941261669272e-06;0.00027387842419557;-0.00010468318942003;0.00065724685555324;-0.00012188468099339;-0.00020281953038648;-0.00037292411434464;-3.7296867958503e-05;0.00012165205407655;0.00027795170899481;0.00049291789764538;8.4038634668104e-05;-4.8156420234591e-05;2.0034334738739e-05;0.00017441704403609;0.00015681378135923;0.00050186616135761;1.790962414816e-05;-0.0010192466434091;9.9993936601095e-05;5.7452689361526e-05;-2.68144212896e-05;-0.00027091056108475;3.4411534670653e-06;-0.0011894591152668;5.2747585868929e-05;-0.000300009152852;0.00024027789186221;0.00085983995813876;-0.00041021817014553;-0.00042117221164517;-2.5923432986019e-05;-0.00097981526050717;-2.8408630896593e-05;-0.00076606759103015;0.0001733030367177;6.7158231104258e-05;-0.00021875310631003;-0.00050972157623619;0.00037301410338841;-0.00014205097977538;0.00080824666656554;0.00014526466839015;0.0011123985750601;9.1567264462356e-05;0.00098769774194807;-0.00020799922640435;0.00053967133862898;4.158422598266e-06;-2.8642325560213e-05;9.7262400231557e-06;-4.35120318798e-06;1.2360919754428e-05;0.00031475798459724;0.00018621755589265;-0.00037980594788678;-9.7431613539811e-05;0.00045684914221056;-4.3530722905416e-05;0.00034197865170427;-6.9251975219231e-05;-8.3350896602497e-05;-8.6703919805586e-05;0.00070666178362444;-5.3078969358467e-05;-0.0015329472953454;3.1106639653444e-05;-0.00033888922189362;0.00013120372022968;-0.000137856011861;0.00037887657526881;-9.0894536697306e-05;-0.00036813082988374;0.00017067037697416;-0.00054249499225989;4.2929197661579e-05;0.00075388170080259;2.9159107725718e-05;-3.7888356018811e-05;5.4111831559567e-05;0.00024767647846602;8.1647176557453e-06;8.2095582911279e-05;-9.2754344223067e-06;0.00039225115324371;-3.1568131817039e-05;-0.00010626118455548;-0.00021257290791254;-0.0004355396667961;-0.00014349108096212;-0.00010769555956358;0.00022056436864659;-0.00058840424753726;3.9096762520785e-06;0.0005734235746786;-0.00015264941612259;0.001068047597073;-0.00019027072994504;-0.0002909260801971;-0.00045866222353652;-9.2912741820328e-05;5.8960329624824e-05;0.00039928519981913;0.00051722896751016;0.00017725869838614;-0.00023742641496938;4.626757799997e-05;-8.6803956946824e-05;0.00024265376850963;0.00071589869912714;2.7951704396401e-05;-0.0015265292022377;0.00014519211254083;2.6820383936865e-05;-8.9415416368865e-06;3.0239380066632e-05;4.4408388930606e-06;-0.00019226859149057;-4.2220752220601e-05;-6.0681308241328e-05;-9.8501455795486e-05;-4.010513657704e-05;0.00017208680219483;-2.5360974177602e-05;-1.5893472209427e-06;7.0497531851288e-05;-9.7964082669932e-05;5.2076779866184e-07;-0.00012636469909921;-7.9053206718527e-05;-0.00014422000094783;-5.5512777180411e-05;0.00017702924378682;3.4059430618072e-05;0.00019886487280019;7.175853534136e-05;-4.4980730308453e-05;3.7426278140629e-05;5.4445001296699e-05;0.00013929621491116;2.5676899895188e-05;1.6160483937711e-05;-0.00013238184328657;9.082377073355e-05;9.4799503358445e-08;-1.7243590946237e-06;4.9839462008094e-05;4.1617939132266e-05;0.00014128485054243;7.1802227466833e-05;0.00016640455578454;7.4197450885549e-06;-0.00025459835887887;4.6082819608273e-05;-6.0342510550981e-05;-1.2239197531017e-05;-2.4891913199099e-05;-4.4447286200011e-05;0.00010059899796033;-9.9324070106377e-06;-4.1324965422973e-05;0.00019609158334788;0.0001812335831346;-4.7305329644587e-05;-5.0629139877856e-05;-0.00029767196974717;-0.0001836850278778;-6.7333144215809e-06;-8.0511572377873e-06;-9.3911883595865e-05;1.33363837449e-05;0.00012647770927288;2.7833251806442e-05;-5.7700181059772e-05;2.5071116397157e-05;-3.1425968245458e-06;9.3104717961978e-06;8.8509550550953e-05;1.8943578652397e-06;0.00034439240698703;3.3207354135811e-05;0.00013277963444125;1.9769995560637e-05;-6.0665402997984e-05;9.1310985226301e-06;3.788012691075e-05;5.5997124945861e-06;0.00032355688745156;4.8410322051495e-05;0.00020679405133706;1.8317010471947e-05;-5.2412873628782e-05;9.4284882834472e-07;3.0527196940966e-05;-7.734263635939e-05;5.4670315876137e-05;-0.000152608146891;-1.5179659385467e-05;-0.00027881021378562;-4.696195901488e-05;-0.00033046025782824;-4.918553531752e-05;-2.8079959520255e-05;-9.500852797828e-07;-0.00024444557493553;-2.5448463929933e-05;3.387724791537e-05;-1.5100014024938e-05;4.1225914173992e-05;1.5587313100696e-05;-0.00022835218987893;-4.4954718759982e-05;-3.3277381589869e-05;-0.00015487079508603;-0.0001470225979574;0.00031208150903694;-2.9748141969321e-05;7.0733267421019e-06;0.00010483621008461;-0.00011464582348708;1.8976803403348e-05;-0.00020409349235706;-0.00010057069448521;-0.00016020516341086;-5.6878634495661e-05;0.00022573914611712;2.3397187760565e-05;0.00021073526295368;8.9934408606496e-05;-6.8593064497691e-05;2.9861357688787e-05;3.8223424780881e-05;0.00020353640138637;2.5353545424878e-05;9.8452783277025e-06;-0.00015639903722331;0.00012442740262486;1.9455471829133e-06;-1.9536294075806e-06;3.3282751246588e-05;4.335425546742e-05;0.00021446896425914;0.00011743395589292;0.00025359413120896;3.7741836422356e-05;-0.00038493139436468;3.6107427149545e-05;-6.3839856011327e-05;-1.8211037968285e-05;-7.980692316778e-05;-7.5413197919261e-05;0.00015732044994365;4.9161126298713e-06;-3.0998682632344e-05;0.00028435030253604;0.00025698257377371;-7.7846983913332e-05;-8.4367580711842e-05;-0.0004296800470911;-0.00027195605798624;3.1431914976565e-05;5.0259450290469e-06;-0.00015105333295651;-5.5317100304819e-06;0.00013477382890414;4.0347506001126e-05;-2.1951624148642e-05;4.4464541133493e-05;-1.9931633232773e-06;8.965559572971e-06;0.00011881138925673;1.9601970052463e-05;0.00045633493573405;9.9654294899665e-05;0.0002093134826282;6.0314039728837e-05;-8.9654691691976e-05;-1.5585734217893e-05;3.6226876545697e-05;9.0709390860866e-06;0.00038485703407787;8.7455096945632e-05;0.00023213875829242;4.2782427044585e-05;-6.7426350142341e-05;8.4638668340631e-05;0.00010673057113308;-0.00011563998850761;3.0003928259248e-05;-0.00028376569389366;-0.0001065516989911;-0.00035148966708221;-8.858220098773e-05;-0.0004079679492861;-0.00010190437751589;-2.1283169189701e-05;-1.5825692116778e-06;-0.00028457312146202;-4.8899586545303e-05;3.5678625863511e-05;-2.0065939679625e-05;4.0459304727847e-05;2.5548060875735e-05;-0.00021242687944323;-3.1742489227327e-05;1.2395172234392e-05;-0.00018461717991158;-0.00027194333961233;0.00043045380152762;-3.0798219086137e-05;1.7778465917218e-05;0.00011662326869555;-0.00010512821609154;6.3169762142934e-05;-0.00025962214567699;-9.8952499683946e-05;-0.0001370935497107;-4.3870099034393e-05;0.0002282634814037;-3.6853640494883e-07;0.00017109158216044;8.5061954450794e-05;-7.2169626946561e-05;1.0480027412996e-05;-5.6467947615602e-06;0.00023409187269863;2.1913070668234e-05;-2.1808134533785e-06;-0.000154720939463;0.00013833881530445;3.7379932109616e-06;-1.0181274774368e-06;5.4010133681004e-06;3.0897495889803e-05;0.00024832706549205;0.00014909745368641;0.00029281491879374;8.1814716395456e-05;-0.00044013292063028;-1.1036561772926e-05;-5.6781795137795e-05;-2.35858879023e-05;-0.00012959078594577;-0.00010061095963465;0.00019438478921074;3.8032911106711e-05;-9.5504301498295e-06;0.0003156648890581;0.00027873812359758;-9.5849485660437e-05;-0.00010412336268928;-0.00047253197408281;-0.00031356123508886;7.4069044785574e-05;2.7959997169091e-05;-0.00018675571482163;-4.3002837628592e-05;0.0001183872227557;4.8163707106141e-05;2.1708379790653e-05;5.8932393585565e-05;-8.6544071109529e-07;6.7182068050897e-06;0.00012724719999824;3.7834866816411e-05;0.00049644726095721;0.00017190663493238;0.00025106061366387;0.00010569462028798;-0.00010817587462952;-5.0159778766101e-05;3.1093033612706e-05;1.1988180631306e-05;0.00036938127595931;0.00011907287989743;0.00020979062537663;6.5687396272551e-05;-6.8783963797614e-05;0.00018235293100588;0.00020150703494437;-0.00013996043708175;-1.2747109394695e-05;-0.00039498467231169;-0.0002198609727202;-0.00036261131754145;-0.00012461250298657;-0.00040934901335277;-0.00015112957044039;-1.1978711881966e-05;-2.2131275727588e-06;-0.00026249152142555;-6.7858731199522e-05;3.106154690613e-05;-2.0283796402509e-05;2.9265487683006e-05;2.7963011234533e-05;-0.0001582023978699;-1.3611456779472e-05;4.6158646000549e-05;-0.00016749216592871;-0.00032565795117989;0.0004450534179341;-2.7530435545486e-05;2.2548310880666e-05;9.8771743068937e-05;-7.6032134529669e-05;9.7431206086185e-05;-0.00025444861967117;-7.6875039667357e-05;-9.305369167123e-05;-2.8925625883858e-05;0.00018564512720332;-2.0199180653435e-05;0.00010891888086917;6.4217019826174e-05;-5.4901072871871e-05;-6.7441069404595e-06;-4.4264259486226e-05;0.00021007438772358;1.7319865946774e-05;-1.1232442375331e-05;-0.00012755558418576;0.00012258130300324;4.2028486859635e-06;3.612244654505e-07;-1.5460384020116e-05;1.3526168004319e-05;0.00022035298752598;0.00014501917758025;0.00026104412972927;0.00010706726607168;-0.00038554350612685;-6.016828774591e-05;-4.2837695218623e-05;-2.4520797524019e-05;-0.0001405376533512;-0.00010295114043402;0.00018404163711239;6.5479631302878e-05;8.2167362052132e-06;0.00027114324620925;0.00023337539460044;-8.828128920868e-05;-9.7876458312385e-05;-0.00040234296466224;-0.00027976083219983;9.2024827608839e-05;4.4596439693123e-05;-0.00017598188424017;-7.1738177211955e-05;8.7311229435727e-05;4.5725359086646e-05;4.566981078824e-05;5.8842972066486e-05;-4.4770220597457e-07;4.1750490709092e-06;0.00010908171680057;4.3908617954003e-05;0.00043826102046296;0.00019873859127983;0.00022943882504478;0.00012500923185144;-0.0001028351689456;-7.1124806709122e-05;2.4714898245293e-05;1.2078459803888e-05;0.00028881331672892;0.00012084876652807;0.00015645222447347;7.086040568538e-05;-5.6020562624326e-05;0.00022677949164063;0.00024844668223523;-0.00013427417434286;-4.3532643758226e-05;-0.00041008234256878;-0.00027586877695285;-0.00030516376136802;-0.00012935535050929;-0.00033408481976949;-0.00016253057401627;-5.1995375542901e-06;-2.3140521534515e-06;-0.00019611867901403;-6.8654342612717e-05;2.0910158127663e-05;-2.3169082851382e-05;-1.3465167967297e-06;-4.2100559767277e-06;-7.2754833126965e-06;0.00022174646437634;0.00014826124242973;6.7496795963962e-05;-0.0003321310505271;0.00021905257017352;-1.6861977201188e-05;2.7766020139097e-05;0.00011063122656196;-5.1822713430738e-05;0.00020185750327073;-4.2145435145358e-05;3.7993151636329e-05;8.894282655092e-05;-3.7257635995047e-05;4.0909329982242e-05;-0.00017974113870878;-1.8896847905125e-05;-0.00015780715330038;-3.3193966373801e-05;3.458537548795e-06;-0.00019283953588456;-5.5022781452863e-05;-4.8953647819872e-06;-2.5850758902379e-05;-0.00011735929001588;0.0001128009535023;-2.8089921215724e-06;8.8675524239079e-06;1.3332091839402e-05;3.049449333048e-06;8.5804305854253e-05;0.00019587521092035;2.5792625820031e-05;0.00028286204906181;6.2386701756623e-05;-0.00045570384827442;-1.6691274140612e-06;-5.4133422963787e-05;-0.00010889112309087;-0.00010434589785291;-1.1510352123878e-05;0.0002063805150101;-1.9028097085538e-05;0.00020191643852741;0.00019299139967188;-3.6204193747835e-05;-6.8982393713668e-05;-0.00021719188953284;-0.00033538285060786;2.6339352189098e-05;7.1947302785702e-05;2.2089561753091e-05;-0.00020198880520184;3.5213284718338e-05;8.5434039647225e-05;6.4337407820858e-05;3.3221738704015e-05;3.4073912047461e-06;3.2824652862473e-06;3.8922615203774e-05;8.3410071965773e-05;0.00019628030713648;0.00032170087797567;6.1861945141573e-05;0.00027652725111693;-1.7659249351709e-05;-0.00014254069537856;2.2690623154631e-05;7.5241873673804e-06;0.00010440994083183;0.00027622273773886;4.8618931032252e-05;0.0001655495580053;-5.8366447774461e-05;0.00014496748917736;0.00017941350233741;-1.9870829419233e-05;-8.6003281467129e-05;-0.00020506023429334;-0.00030729107675143;-0.00014452313189395;-0.00022645328135695;-0.00012267241254449;-0.00034078094176948;-7.4239342211513e-06;-4.5517003854911e-06;-5.315382804838e-05;-0.00019843882182613;2.0062921976205e-05;-2.4507840862498e-05;-2.6568184807729e-07;-1.0044149348687e-05;3.6624583117373e-06;0.00026527198497206;0.00015375790826511;8.9603090600576e-05;-0.00031362686422653;0.00017204383038916;-1.3245543414087e-05;3.0819821404293e-05;0.0001246977772098;-6.0629103245446e-05;0.00019932494615205;-3.155789727316e-06;5.084763688501e-05;0.00011484300921438;-2.4389548343606e-05;2.834273618646e-05;-0.00020542243146338;-2.7858164685313e-05;-0.00020376285829116;-4.3203985114815e-05;7.6345841080183e-06;-0.00020244561892468;-8.9022767497227e-05;-1.0259566806781e-05;-2.8584639949258e-05;-0.00012217393668834;0.00012168574903626;-4.545194315142e-06;9.2373347797547e-06;2.5651354008005e-05;1.0606772775645e-05;8.7683314632159e-05;0.00021370578906499;2.8828471840825e-06;0.00031570994178765;0.0001021788775688;-0.00049936340656132;2.4766679871391e-06;-5.9032998251496e-05;-0.00010729215864558;-9.9724762549158e-05;-3.5690769436769e-05;0.00020470484741963;-2.7992391551379e-05;0.00023194197274279;0.00022716107196175;-4.360344610177e-05;-7.0604277425446e-05;-0.00023547695309389;-0.00039341722731479;1.078052991943e-05;6.4324129198212e-05;4.7993042244343e-05;-0.00020809397392441;3.4163153031841e-05;9.4509814516641e-05;6.7176362790633e-05;3.1949715776136e-05;5.0694848141575e-06;3.0644434900751e-06;3.4078540920746e-05;9.5279967354145e-05;0.00017259642481804;0.00034878132282756;5.619892544928e-05;0.00029638258274645;-6.3881025198498e-06;-0.00014284203643911;2.0639676222345e-05;5.4232732509263e-06;0.00010053165897261;0.0003159983898513;4.3446838390082e-05;0.00019250057812314;-6.5545260440558e-05;0.00012232114386279;0.00013971026055515;-7.1426518388762e-07;-9.0848589024972e-05;-0.00016891048289835;-0.00029911508318037;-0.00013486044190358;-0.00025316048413515;-0.00011469233140815;-0.00037817048723809;-7.0160799623409e-06;-1.2664211226365e-06;-5.0369464588584e-05;-0.0002381239173701;1.4654620827059e-05;-2.0386090909597e-05;-1.7527587203858e-07;-1.196820903715e-05;1.3507907169696e-05;0.00025038328021765;0.00012264828546904;9.4390888989437e-05;-0.00022802832245361;8.8559478172101e-05;-6.5941521825152e-06;2.8002983526676e-05;0.00010672661301214;-5.0630569603527e-05;0.00015284746768884;3.581824421417e-05;5.2002611482749e-05;0.00011646930943243;-4.235251708451e-06;1.0209176252829e-05;-0.00018601851479616;-3.2725460187066e-05;-0.00020507117733359;-4.1258790588472e-05;5.9934418459306e-06;-0.00016414509445895;-0.0001063695162884;-1.2362667803245e-05;-2.7355552447261e-05;-9.7758340416476e-05;0.0001028687111102;-5.0783883125405e-06;7.5125026341993e-06;2.9849799830117e-05;1.5288633221644e-05;6.5991051087622e-05;0.000176925357664;-1.9143679310218e-05;0.00027810962637886;0.00011685994832078;-0.00042925780871883;5.2707550821651e-06;-5.1998114940943e-05;-8.3408813225105e-05;-7.2308626840822e-05;-5.0079474021913e-05;0.0001540837547509;-2.9777505915263e-05;0.00020151046919636;0.00019972665177193;-3.9168389776023e-05;-5.451898323372e-05;-0.00019141280790791;-0.00035090302117169;-2.6679231268645e-06;4.4133485062048e-05;6.1300299421418e-05;-0.00016540974320378;2.4778715669527e-05;8.2645041402429e-05;5.6525172112742e-05;2.4622027922305e-05;5.540218353417e-06;2.1727139483119e-06;2.1297724742908e-05;8.6673164332751e-05;0.00011137606634293;0.00030131347011775;3.7157427868806e-05;0.0002511415805202;4.8840938688954e-06;-0.00011541172716534;1.3391208085523e-05;8.8450093471693e-07;6.9976595113985e-05;0.00028501704218797;2.737107934081e-05;0.00018038088455796;-5.6777200370561e-05;8.0864861956798e-05;8.1717880675569e-05;1.5974019333953e-05;-7.9160665336531e-05;-0.00010320571163902;-0.00023524835705757;-9.324533311883e-05;-0.00022329251805786;-7.8098266385496e-05;-0.0003325404250063;-3.5978066534881e-06;4.5535684876086e-06;-3.4006909118034e-05;-0.00022710315533914;8.4910734585719e-06;-1.4369949894899e-05;2.4466135073453e-06;-8.1492726167198e-06;1.2556908586703e-05;0.00018790393369272;7.33774213586e-05;8.4220780991018e-05;-0.00012650173448492;2.1114476112416e-05;-5.6831771644283e-07;2.0836419935222e-05;7.6417374657467e-05;-3.1034076528158e-05;9.1058376710862e-05;3.9320493669948e-05;3.8904061511857e-05;9.326701547252e-05;7.8533603300457e-06;-1.1539832485141e-06;-0.00013419808237813;-2.4251750801341e-05;-0.00016735409735702;-3.4564349334687e-05;2.9950368229947e-07;-0.00010331212979509;-9.0154841018375e-05;-1.2532104847196e-05;-2.2166550479596e-05;-6.3965235312935e-05;7.6208663813304e-05;-3.541119667716e-06;4.6612894948339e-06;2.5879962777253e-05;2.0036568457726e-05;3.8750145904487e-05;0.00010811199899763;-2.1693005692214e-05;0.00017971656052396;8.7246575276367e-05;-0.0002779267670121;4.168041414232e-06;-4.1169962059939e-05;-5.1515933591872e-05;-3.6645582440542e-05;-4.0064816857921e-05;8.9475397544447e-05;-2.9392258511507e-05;0.00013044956722297;0.00013361718447413;-2.2736834580428e-05;-2.9119682949386e-05;-0.00012233505549375;-0.00023103921557777;-8.1782491179183e-06;2.0442013919819e-05;4.9204423703486e-05;-9.7534655651543e-05;1.5495483239647e-05;6.5996267949231e-05;3.5932793252869e-05;3.7088652788952e-06;5.3154640227149e-06;7.0085087600091e-07;7.2981806624739e-06;6.2209663155954e-05;5.2907875215169e-05;0.00021363764244597;1.8008589904639e-05;0.00016322372539435;1.0999636288034e-05;-7.6316006015986e-05;7.3233013608842e-06;2.8198858217365e-06;3.8218186091399e-05;0.00021148633095436;1.1686624020513e-05;0.0001411167322658;-4.0148272091756e-05;3.0826424335828e-05;3.3941134461202e-05;2.7608381060418e-05;-5.4475858632941e-05;-4.3428932258394e-05;-0.00013959215721115;-5.0554255722091e-05;-0.0001629675825825;-4.0738625102676e-05;-0.00023951201001182;-1.7810880308389e-06;2.0444067558856e-06;-1.6949481505435e-05;-0.00017490878235549;5.9350730907681e-07;-3.8281559682218e-05;-2.8235981517355e-05;-5.785825123894e-05;6.9967252784409e-05;0.0011861026287079;-0.00018272364104632;0.00050102057866752;0.00044175013317727;-0.0010931068100035;9.798241808312e-05;0.00029520186944865;0.0001106819108827;0.00011462258407846;-0.00017817720072344;0.00098354916553944;0.00018140002794098;0.00043552333954722;0.00053732964443043;-1.2152586350567e-05;-0.00055772007908672;-0.00024664623197168;-0.0010091795120388;-0.00018776759679895;-0.00028905837098137;0.00014487782027572;-0.001026485231705;-6.5690946939867e-05;-0.00034673773916438;-1.9906430679839e-05;0.00023912533652037;1.062300839294e-06;-6.7192104324931e-06;0.00022868080122862;0.00023184454767033;-7.483107765438e-05;-0.00031598351779394;-0.00020365280215628;0.00072914909105748;0.00029310505487956;-0.00029733704286627;-4.2593997932272e-05;-4.2707750253612e-05;-5.6498498452129e-05;0.00027793808840215;-0.0001685318275122;-0.0010528975399211;-0.00031916025909595;0.00028141948860139;8.7965468992479e-05;-0.00013087544357404;0.00034467445220798;4.1143477574224e-05;-0.0006560058100149;-4.7736200940562e-05;-0.00031064401264302;0.00022273932700045;0.00056079245405272;2.6637040718924e-05;-2.8460843168432e-05;5.459632302518e-05;0.00037288790917955;1.5299456208595e-05;2.3769000108587e-05;-8.1226062320638e-05;0.00046000754809938;-0.00032543204724789;0.00062177126528695;-0.00011425454431446;0.00012512486136984;0.00022828271903563;-0.00027092127129436;-2.5897283194354e-05;-0.00040591423748992;-0.00017119006952271;0.00087387429084629;-0.00018119254673366;0.0012426198227331;-0.00020555091032293;-0.00020346094970591;-0.00016565008263569;0.00039230595575646;-0.00029632961377501;0.00025009390083142;-3.5499017485563e-06;0.00013589825539384;-0.00052822090219706;0.000247774500167;-0.00091312994481996;4.1330047679367e-05;0.00055126479128376;0.00013209352619015;-0.0014495896175504;7.6311234806781e-06;-4.6795132220723e-05;-2.1795523934998e-05;-1.3310680515133e-05;4.8134181270143e-05;0.0012775666546077;-0.00022139013162814;0.00053985981503502;0.00048998050624505;-0.0011639220174402;9.5148767286446e-05;0.00036584745976143;0.00010630767064868;0.00026002072263509;-0.00020398553169798;0.00098640832584351;0.00014621141599491;0.00043564857332967;0.00058172445278615;1.4678320439998e-05;-0.00055596843594685;-0.00023824267555028;-0.0010888957185671;-0.00019460667681415;-0.00045639806194231;0.00018297342467122;-0.0010826967190951;-6.209930870682e-05;-0.00044177734525874;-1.662025533733e-05;0.00027036291430704;6.6627580963541e-06;-9.0947150965803e-06;0.00024684824165888;0.00028764773742296;-9.7633615951054e-05;-0.00038661531289108;-0.0001769546943251;0.00074188917642459;0.00022382361930795;-0.00015389740292449;-6.3288440287579e-05;-5.7595010730438e-05;-5.9591209719656e-05;0.00040089548565447;-0.0001320630981354;-0.0012811757624149;-0.00036981157609262;0.00026551113114692;2.2689539036946e-05;-0.0001273335510632;0.00039449564064853;8.431302558165e-05;-0.00063226075144485;-2.6095165594597e-05;-0.00039350287988782;0.0001939256908372;0.00066626234911382;3.7021713069407e-05;-3.6161014577374e-05;4.5578908611787e-05;0.00038550910539925;1.5539428204647e-05;3.0579431040678e-05;-9.8092830739915e-05;0.00050116947386414;-0.00035617014509626;0.00058879726566374;-0.00012862363655586;-5.19193861237e-07;0.00025288626784459;-0.00027118949219584;-2.3412323571392e-05;-0.00047356271534227;-0.00019809787045233;0.0009138333844021;-0.00020953857165296;0.0013845667708665;-0.00023389267153107;-0.00029248095233925;-0.00016907122335397;0.0004639464605134;-0.00029421038925648;0.000260433065705;0.00012702003004961;0.00014738659956492;-0.00053684873273596;0.00028574885800481;-0.00089347368339077;4.474902380025e-05;0.00064327847212553;0.00015460833674297;-0.0016353583196178;2.245284304081e-05;-5.185597910895e-05;5.3956277952238e-06;0.00012711076124106;-1.5747980796732e-05;0.0010895890882239;-0.0002257895830553;0.000431544292951;0.00042796510388143;-0.00095584109658375;5.6675147789065e-05;0.00038938381476328;7.095232285792e-05;0.00056039524497464;-0.00018595631991047;0.00071652833139524;3.0274225082394e-06;0.00030719529604539;0.00050881324568763;8.068486204138e-05;-0.00039008163730614;-0.00015480411821045;-0.00093159591779113;-0.00015378907846753;-0.00073102908208966;0.00019766199693549;-0.00086642184760422;-3.4394339309074e-05;-0.00050299824215472;-1.0448266948515e-05;0.00021537812426686;1.3118017704983e-05;-7.0820728979015e-06;0.00020526754087768;0.0003204169915989;-0.00011911711044377;-0.00035051087616012;-8.6198015196715e-05;0.00057103211292997;4.6717628720216e-05;0.00014071579789743;-7.901626668172e-05;-9.8394557426218e-05;-6.059892984922e-05;0.00056636962108314;-3.9502603613073e-05;-0.0013475634623319;-0.00035665888572112;0.00017004301480483;-8.8619817688596e-05;-6.9537454692181e-05;0.0003379306581337;0.00012783314741682;-0.00043118576286361;2.2928905309527e-05;-0.00043862208258361;0.00010396903235232;0.00062180188251659;4.6314853534568e-05;-1.6932110156631e-05;2.5055080186576e-05;0.0002700257464312;1.3338370990823e-05;3.6862122215098e-05;-9.907526691677e-05;0.00041383953066543;-0.00031565589597449;0.0002983913582284;-0.00011397946218494;-0.00022323064331431;0.00021494633983821;-0.00016582506941631;-1.8763004845823e-05;-0.00045280810445547;-0.00019309640629217;0.00070124363992363;-0.00019378733122721;0.0011820323998109;-0.00022503476066049;-0.00038771986146457;-0.00015294822514988;0.00045835832133889;-0.0001648425241001;0.0002299339248566;0.00033191489637829;0.00013448725803755;-0.0003840517019853;0.00026499832165428;-0.00049228162970394;4.2420662794029e-05;0.00062198581872508;0.00015097518917173;-0.001512628281489;6.4077299612109e-05;-4.4073178287363e-05;-0.00048217870062217;-2.7873820727109e-05;-0.0011294255964458;0.00016173497715499;-0.00038272290839814;0.00019507702381816;0.00045992797822692;-0.00022749401978217;-0.00049610843416303;2.881555519707e-05;-0.0015274890465662;6.6611478359846e-06;-0.00018235453171656;8.8945671450347e-05;0.00023381927167065;-9.4399430963676e-05;-0.00028074390138499;0.0002072227653116;-0.00019335388788022;0.00075132417259738;-7.0680187491234e-05;0.0016397425206378;1.4615204236179e-05;0.00082722387742251;-0.00016233682981692;0.00068961677607149;-3.0646933737444e-05;-5.3204195864964e-05;1.6281444914057e-05;1.2600588888745e-05;6.0166184994159e-06;0.00036674216971733;0.00010602873953758;-6.1542596085928e-05;-0.00015986208745744;0.00039749557618052;2.9154851290514e-05;0.00044124852865934;-0.00015318095393013;-0.00031236570794135;-7.5677642598748e-05;0.00092153350124136;-7.1434878918808e-05;-0.0010460561607033;5.7936678786064e-05;-0.00024776885402389;8.6335123341996e-05;-0.0002716698218137;8.9783636212815e-05;-6.1695260455963e-07;-0.00022105222160462;0.00022519071353599;-0.00046046669012867;9.5388910267502e-05;0.0001733013195917;-1.5043690382299e-06;0.00020068416779395;4.6769568143645e-05;-0.00019422375771683;2.1212037609075e-05;8.5827792645432e-05;-6.3217121351045e-06;0.00023422829690389;-6.2473234720528e-05;-0.00027171699912287;-0.00016198282537516;-0.0006806988385506;-0.00012706976849586;2.3742593839415e-05;0.0001509874855401;-0.00044746795902029;1.0394418495707e-05;0.00045292687718756;-0.0001592071930645;0.00086063070921227;-0.00015608650573995;-0.00023934905766509;-0.00056544994004071;-3.1395953556057e-05;0.00015821178385522;0.00040606272523291;0.00070185266667977;0.00012189900735393;-0.00011769054981414;4.4611406337935e-05;0.0001750302471919;0.00021622887288686;0.00052868825150654;3.1928033422446e-05;-0.0013140721712261;0.00013773144746665;7.5263225880917e-05;-4.7984671255108e-05;-0.00051873736083508;-3.0290606446215e-05;-0.0013615555362776;0.0001578305818839;-0.00046483337064274;0.00023335379955824;0.00064433424267918;-0.0003031468950212;-0.00057374365860596;2.0917137590004e-05;-0.0016982285305858;-1.3321805454325e-05;-0.00031834372202866;0.00011397907655919;0.00023068921291269;-0.00017353129805997;-0.00039233834831975;0.00029624698800035;-0.00020014465553686;0.00094865902792662;-2.6014928153018e-05;0.0018227500841022;4.1582010453567e-05;0.0010134638287127;-0.00018770659517031;0.00080377765698358;-2.5684194042697e-05;-9.5096023869701e-05;2.7855447115144e-05;1.319647890341e-05;5.9027292991232e-06;0.00043344069854356;0.00014501284749713;-0.00012510085070971;-0.00017244783521164;0.00049006851622835;1.035471814248e-05;0.00046680768718943;-0.0001399471948389;-0.00036872923374176;-8.7855420133565e-05;0.0010448105167598;-8.3314916992094e-05;-0.0012944517657161;4.8398494982393e-05;-0.00031114937155508;0.00013194148777984;-0.00027421317645349;0.00014159517013468;-1.9280825654278e-05;-0.0003065719793085;0.00023409903224092;-0.00052897003479302;9.578464232618e-05;0.00029167323373258;1.8571752661956e-05;0.00024539232254028;5.4948330216575e-05;-0.00018806838488672;2.8102287615184e-05;0.00010007081436925;-5.2509435590764e-06;0.00031184431281872;-7.7606200648006e-05;-0.00020719470921904;-0.00022139748034533;-0.00073124194750562;-0.00016336691624019;-8.1825119195855e-06;0.00020181556465104;-0.00053693109657615;8.5355541159515e-06;0.00062186375726014;-0.00019527612312231;0.001097809523344;-0.00019650562899187;-0.00029088041628711;-0.00065856776200235;-5.948473335593e-05;0.00014348003605846;0.00049664441030473;0.00076416530646384;0.00018216983880848;-0.0002132543886546;6.3524057622999e-05;8.8315391622018e-05;0.00027090142248198;0.00064223882509395;4.0341612475459e-05;-0.0016372750978917;0.00016869543469511;3.9792597817723e-05;-9.469630640524e-06;3.6106441257289e-05;-5.1628385335789e-06;-0.00028192225727253;-6.7099499574397e-05;-0.00012884332682006;-0.00011169226490892;1.9078413970419e-05;0.00016424276691396;-3.781050327234e-05;-1.0740303878265e-05;8.3150123828091e-05;-0.00015158650057856;6.2561189224652e-06;-0.00014259027375374;-0.00010967344860546;-0.00022711938072462;-8.8924600277096e-05;0.00024848565226421;6.7828128521796e-05;0.00032199433189817;9.9494391179178e-05;-4.8497789975954e-05;7.1364993345924e-05;9.4229806563817e-05;0.00017549601034261;4.2160212615272e-05;3.4143460652558e-05;-0.00020598246192094;0.00012329162564129;-1.9253664049756e-06;-2.2486974557978e-06;0.00010447042586748;6.6475979110692e-05;0.00016785768093541;7.8784927609377e-05;0.0001852664136095;-7.8842085713404e-06;-0.00029109790921211;7.2222523158416e-05;-0.00010291703802068;-1.5886931578279e-05;1.4886663848301e-05;-4.6151395508787e-05;0.00012777691881638;-2.2203603293747e-05;-8.0309277109336e-05;0.00023886137933005;0.00022747309412807;-5.2297287766123e-05;-4.9238697101828e-05;-0.00036069605266675;-0.00022522227664012;-5.1250885007903e-05;-2.3487211365136e-05;-0.0001094799808925;3.2204388844548e-05;0.00021623255452141;3.6052675568499e-05;-0.00014885744894855;2.2588630599785e-05;-7.9701685535838e-06;1.6969850548776e-05;0.00011648895451799;-1.4967823517509e-05;0.00048051253543235;-3.7052398056403e-06;0.00014590690261684;-3.2095765618578e-06;-7.419656321872e-05;3.6820893001277e-05;7.7527562098112e-05;6.6797506406147e-06;0.00049282255349681;4.6106750232866e-05;0.00032413948792964;8.5992060121498e-06;-7.2613198426552e-05;-7.9916237154976e-05;-1.4150224160403e-05;-9.2941016191617e-05;0.0001163281922345;-0.00013295943790581;5.6542678066762e-05;-0.00040689355228096;-4.1056489862967e-05;-0.00048838288057595;-3.5446879337542e-05;-6.6530374169815e-05;-1.5352418358816e-06;-0.00036775844637305;-2.1211983039393e-05;4.2121155274799e-05;-1.2105863788747e-05;4.2482311982894e-05;-1.1385881748538e-07;-0.0002852757461369;-6.5483523940202e-05;-0.00010654841753421;-0.00013691591448151;-3.579204712878e-05;0.00022723988513462;-3.39029575116e-05;-6.7474102252163e-06;0.00010544647375355;-0.00015941372839734;1.4627620657848e-05;-0.00017667455540504;-0.00011785006063292;-0.00022572827583645;-8.4735715063289e-05;0.00026511118630879;5.9734255046351e-05;0.00031283611315303;0.00010353059769841;-6.8755223765038e-05;6.788078462705e-05;7.6839460234623e-05;0.00020343711366877;3.3447882742621e-05;3.1546125683235e-05;-0.0002088346373057;0.00013859698083252;-1.0723649666033e-06;-1.944737505255e-06;9.0745656052604e-05;6.6517830418888e-05;0.00020147145551164;0.00010195176582783;0.00021866307361051;8.0129893831327e-06;-0.00034655095078051;6.3520128605887e-05;-9.6610587206669e-05;-1.8876649846788e-05;-1.6667192539899e-05;-5.9042136854259e-05;0.0001554281625431;-1.2765425708494e-05;-7.3796501965262e-05;0.00027754096663557;0.00026447681011632;-6.4380983531009e-05;-6.4214844314847e-05;-0.00041858069016598;-0.00026886680279858;-3.0039960620343e-05;-1.8382177586318e-05;-0.00013488128024619;2.1044805180281e-05;0.00021133506379556;4.2877611122094e-05;-0.00012597178283613;2.9058763175271e-05;-7.1506469794258e-06;1.6274132576655e-05;0.0001240796118509;-4.6524419303751e-06;0.00051727052778006;3.1225670682034e-05;0.0001814492570702;1.7028474758263e-05;-8.4057515778113e-05;2.351187322347e-05;7.7828008215874e-05;9.2470454546856e-06;0.00050339935114607;6.9145702582318e-05;0.00031749211484566;2.3292755940929e-05;-7.8413642768282e-05;-4.1056136979023e-05;1.755031371431e-05;-0.0001037280599121;0.00010014232975664;-0.00018989344243892;1.5255817743309e-05;-0.00042653642594814;-6.3796273025218e-05;-0.00050704920431599;-6.4940344600473e-05;-6.7229884734843e-05;-3.4231863992318e-06;-0.00036683949292637;-3.5426284739515e-05;2.9019574867561e-05;-1.2032274753437e-05;3.2667558116373e-05;9.3478820417658e-06;-0.00018710094445851;-3.6414923670236e-05;-3.5055902117165e-05;-0.00012085422349628;-0.00011197293497389;0.00024386229051743;-2.3994893126655e-05;3.9601072785445e-06;8.6123574874364e-05;-0.00010077973274747;2.6337498638895e-05;-0.00016262305143755;-8.1945312558673e-05;-0.00013604760169983;-4.8341709771194e-05;0.00018543998885434;2.2300198907033e-05;0.0001818664604798;7.0712208980694e-05;-5.5873984820209e-05;3.0416946174228e-05;2.7084939574706e-05;0.00016426634101663;2.0325614968897e-05;1.13585492727e-05;-0.0001367455261061;0.00010469329572516;1.0282441280651e-06;-1.1255275467192e-06;3.6249661206966e-05;3.7720586988144e-05;0.00016997977218125;9.5077717560343e-05;0.00019256660016254;3.2716594432713e-05;-0.00029636244289577;2.1512369130505e-05;-5.6748038332444e-05;-1.6007536032703e-05;-5.5250733566936e-05;-5.9225490986137e-05;0.00012974746641703;8.2473661677795e-06;-3.2209652999882e-05;0.00022578124480788;0.00020719628082588;-6.0048350860598e-05;-6.3754880102351e-05;-0.00033878471003845;-0.00022176293714438;1.6016376321204e-05;2.159936911994e-06;-0.00011972824722761;-6.9775028350705e-06;0.00012260959192645;3.4641328966245e-05;-3.7559155316558e-05;3.2294068660121e-05;-2.7153841983818e-06;8.5034689618624e-06;9.4463714049198e-05;1.2728549336316e-05;0.00037865061312914;7.5246498454362e-05;0.00016237840463873;4.5039196265861e-05;-7.1310125349555e-05;-8.7709986473783e-06;3.9621681935387e-05;8.2034866863978e-06;0.00032735080458224;7.1937138272915e-05;0.0001975592749659;3.3872984204208e-05;-5.603884710581e-05;4.9247679271502e-05;7.7108263212722e-05;-8.9925924839918e-05;3.3930056815734e-05;-0.00021519404253922;-7.2162438300438e-05;-0.00029540801187977;-7.1383285103366e-05;-0.00034346198663116;-8.150876237778e-05;-2.8889940949739e-05;-2.4803805445117e-06;-0.00023680036247242;-3.9791328163119e-05;1.5889232599875e-05;-1.903675183712e-05;3.3234466627619e-06;-6.0316269809846e-06;-7.5263851613272e-06;0.00019318542035762;0.00010932532313745;6.8030880356673e-05;-0.00023372500436381;0.00013763291644864;-9.8207328846911e-06;2.2035745132598e-05;9.9429867987055e-05;-4.7512083256152e-05;0.00014726014342159;-2.0088376913918e-05;3.2660991564626e-05;7.8379358456004e-05;-2.3368107576971e-05;2.8628928703256e-05;-0.00014951841149013;-9.6522826424916e-06;-0.00014924452989362;-3.7376667023636e-05;6.3651282289356e-06;-0.00014726883091498;-5.4410083976109e-05;-9.6609082902432e-06;-1.943055758602e-05;-9.5486866484862e-05;9.701082308311e-05;-2.1674468371202e-06;6.7726300585491e-06;1.9797262211796e-05;1.2188472283015e-05;6.9369169068523e-05;0.00015324096602853;1.2460016478144e-05;0.00021277976338752;5.4627813369734e-05;-0.00034993031295016;-4.0636973608343e-07;-4.5834949560231e-05;-8.0287289165426e-05;-7.3957678978331e-05;-1.373695613438e-05;0.00015384861035272;-2.7448246328277e-05;0.0001657864486333;0.0001674935920164;-2.6375386369182e-05;-4.7581448598066e-05;-0.00018132316472474;-0.00027645562659018;9.0124349299003e-06;4.6224067773437e-05;2.4810093236738e-05;-0.00014803849626333;2.9536242436734e-05;7.6198586612009e-05;4.5365573896561e-05;1.4031626051292e-05;4.1423490984016e-06;2.1394735085778e-06;2.5905215807143e-05;6.7769586166833e-05;0.00013974090688862;0.00025875907158479;4.6224635298131e-05;0.00021036405814812;-6.2348826759262e-06;-0.00010622340050759;1.8593431377667e-05;9.8340979093337e-06;8.5575680714101e-05;0.0002353583695367;3.6253433790989e-05;0.00014264159835875;-5.1120605348842e-05;7.9047997132875e-05;0.00010623892012518;3.4936817883136e-06;-6.1785074649379e-05;-0.00012988322123419;-0.00020684863557108;-0.00011089295730926;-0.00019032243289985;-9.6021911303978e-05;-0.00028125854441896;-9.0251724031987e-06;-8.3406630437821e-06;-4.2245759686921e-05;-0.00017187926277984;1.6088342817966e-05;-2.1640853447025e-05;6.1072328207956e-06;-9.6745388873387e-06;1.5811931319831e-08;0.00023630481155124;0.00011752485443139;9.1634537966456e-05;-0.00023144774604589;0.00011008915316779;-6.9335583248176e-06;2.5687992092571e-05;0.00011833451571874;-5.5629025155213e-05;0.00015294691547751;5.8503360378381e-07;4.3122112401761e-05;0.00010379027662566;-1.4226690836949e-05;2.0151213902864e-05;-0.00017702928744256;-1.5912690287223e-05;-0.00019590361625887;-4.9796512030298e-05;8.6247091530822e-06;-0.00016212156333495;-7.9803066910245e-05;-1.5677514966228e-05;-2.3092501578503e-05;-0.00010549799480941;0.00011337964679115;-3.1786059935257e-06;7.3134283411491e-06;3.0762595997658e-05;2.1869509509997e-05;7.4796771514229e-05;0.00017101134289987;-1.0595887260934e-06;0.00024072869564407;8.0418067227583e-05;-0.00039177731378004;1.8750376966636e-06;-5.4720087064197e-05;-8.3238614024594e-05;-7.1589100116398e-05;-2.826188756444e-05;0.00016088582924567;-3.8811598642496e-05;0.00019383284961805;0.00020005489932373;-3.1174211471807e-05;-4.9129470426124e-05;-0.00020480259263422;-0.00032759929308668;-1.8479095160728e-06;4.1375518776476e-05;4.204109791317e-05;-0.00015785919094924;3.1276467780117e-05;9.2618603957817e-05;4.8398851504317e-05;5.7898851082427e-06;6.1354053286777e-06;1.6762961649874e-06;2.219810448878e-05;7.9947378253564e-05;0.0001292719389312;0.0002974609087687;4.4485528633231e-05;0.00023060564126354;2.2351382540364e-06;-0.00011190501390956;1.8741735402727e-05;1.2347664778645e-05;8.7964384874795e-05;0.00028247959562577;3.3970456570387e-05;0.00017497317458037;-5.9889323893003e-05;5.9909649280598e-05;8.2812519394793e-05;2.2201962565305e-05;-6.8281180574559e-05;-0.00010897422907874;-0.00020599704294;-0.00011020947567886;-0.00022474472643808;-9.560227044858e-05;-0.00032806032686494;-1.0005242984334e-05;-1.0185587598244e-05;-4.2142983147642e-05;-0.00021342010586523;1.0614759048622e-05;-1.7028211004799e-05;5.5889954637678e-06;-8.8680608314462e-06;1.2267330930626e-05;0.00020264252088964;8.7883054220583e-05;8.7509841250721e-05;-0.00015666800027248;4.5954006054671e-05;-1.7012689568219e-06;2.2848646040075e-05;9.3801485490985e-05;-4.0498769521946e-05;0.0001101271918742;2.2663571144221e-05;4.0456805436406e-05;0.00010009361722041;3.4098200103472e-06;2.094712044709e-06;-0.00014746957458556;-2.3737347873976e-05;-0.00018056541739497;-4.3211919546593e-05;3.4978272651642e-06;-0.00012410109047778;-8.4033374150749e-05;-1.4992129763414e-05;-2.3244778276421e-05;-7.8648547059856e-05;9.331431647297e-05;-3.5851385291608e-06;5.468499239214e-06;2.9494865884772e-05;2.4368058802793e-05;5.1720548071899e-05;0.00013026728993282;-1.5515313862124e-05;0.00019881005573552;8.4195562521927e-05;-0.00031037631561048;3.4363481518085e-06;-4.8443096602568e-05;-6.052735625417e-05;-4.3604355596472e-05;-3.6171415558783e-05;0.00011347333202139;-3.4297132515348e-05;0.00015604060899932;0.00015890171926003;-2.6894433176494e-05;-3.6967088817619e-05;-0.00015261580119841;-0.00026811711722985;-8.3572112998809e-06;2.3990936824703e-05;4.7247885959223e-05;-0.00011802313383669;2.0994595615775e-05;7.9820638347883e-05;3.8725145714125e-05;-3.4611987302924e-06;6.1483988247346e-06;4.9594046913626e-07;1.0380312232883e-05;6.8451168772299e-05;7.3047704063356e-05;0.00024345843121409;2.5878282031044e-05;0.00017751639825292;9.2071904873592e-06;-8.3588580309879e-05;1.0878866305575e-05;8.6298450696631e-06;5.4267926316243e-05;0.00024035158276092;1.849144064181e-05;0.00015662069199607;-4.7118777729338e-05;3.1325798772741e-05;4.2099178244825e-05;3.0837898520986e-05;-5.8367506426293e-05;-5.7131939684041e-05;-0.00015123405319173;-6.8040673795622e-05;-0.00018741005624179;-5.7663146435516e-05;-0.00027115107513964;-4.7173698476399e-06;-4.5137639972381e-06;-2.510587364668e-05;-0.0001920442446135;6.2731801335758e-06;-1.5597459423589e-05;1.1293951502012e-05;-4.0529275793233e-06;2.1251380530884e-05;0.00018376790103503;6.1160477343947e-05;0.00010245224984828;-9.3267495685723e-05;-9.7742686193669e-06;4.6183199629013e-06;2.0854247850366e-05;8.6265470599756e-05;-2.6398040063214e-05;7.5804608059116e-05;2.131418659701e-05;3.667230339488e-05;0.00010770437074825;1.8239305063616e-05;-1.5626834283466e-05;-0.00012940079614054;-2.6466783310752e-05;-0.00018937310960609;-4.786835052073e-05;-5.1363463171583e-06;-9.5914663688745e-05;-8.5515814134851e-05;-1.9513925508363e-05;-2.4780798412394e-05;-6.2791426898912e-05;9.3807080702391e-05;-3.3190872272826e-06;3.9131173252827e-06;3.1565494282404e-05;3.9617993024876e-05;3.3769978472264e-05;9.2471338575706e-05;-2.2279558834271e-05;0.00014678586740047;7.5358453614172e-05;-0.00022883639030624;3.4987731396541e-06;-5.5848573538242e-05;-4.25779944635e-05;-1.1564974556677e-05;-3.5606251913123e-05;8.4478087956086e-05;-4.1283678001491e-05;0.00012006418546662;0.00012529085506685;-1.6013005733839e-05;-2.4672855943209e-05;-0.00011471765174065;-0.00020645634504035;-1.4833146451565e-05;3.4823367514036e-06;4.6959827159299e-05;-8.4404484368861e-05;1.5250806427503e-05;9.2639224021696e-05;2.8174255930935e-05;-4.0906601498136e-05;8.3295508375159e-06;-2.1543369257415e-06;-4.2131837290071e-06;6.0592730733333e-05;2.4953769752756e-05;0.0002212342369603;9.8370992418495e-06;0.000125073507661;1.7496044165455e-05;-6.1804421420675e-05;5.9311000768503e-06;1.9025017536478e-05;2.8984382879571e-05;0.00023349297407549;5.0461198952689e-06;0.00016113447782118;-3.9891358028399e-05;-1.2798900570488e-05;6.430405392166e-06;5.2453662647167e-05;-5.0442075007595e-05;-7.8801285781083e-06;-9.2724541900679e-05;-3.4988392144442e-05;-0.00017925718566403;-2.7904896342079e-05;-0.00024902305449359;-2.2029316824046e-06;-1.3785856936011e-05;-1.0957343874907e-05;-0.00018998645828106;5.585986218648e-05;-7.3947594501078e-05;4.6813838707749e-05;0.0004043348308187;-0.00016604621487204;0.0011338843032718;-0.00021288858260959;0.00058524712221697;0.00030250733834691;-0.0006652619340457;-2.1561540052062e-05;0.00051327800611034;3.6633464333136e-05;0.0012813309440389;-0.00012271422019694;0.00019455014262348;-0.00021110587113071;0.0002312708820682;0.00033861497649923;0.00016816839342937;-0.00026450867881067;4.8527952458244e-05;-0.00099934649188071;-6.4475738327019e-05;-0.0013948293635622;0.00018542840552982;-0.00081862712977454;1.1899893252121e-05;-0.00074669293826446;-2.5907736926456e-05;0.00024956371635199;1.0433385796205e-05;7.6145825005369e-06;0.00015052757225931;0.00044224638259038;-0.00020182227308396;-0.00014105693844613;-3.9640572140343e-06;0.00049428979400545;-9.4019051175565e-05;0.0003778483660426;-8.9697765361052e-05;-0.00034039112506434;-9.5551382401027e-05;0.0008973783114925;1.8893586457125e-05;-0.0011414774926379;-0.00033915313542821;0.0001315179397352;-0.00023842691734899;2.3415137548e-05;0.00012537519796751;0.00019482114294078;-0.00028682354604825;0.00010152111644857;-0.00045365773257799;5.9286063333275e-05;0.0002400698576821;5.4864402045496e-05;0.00022707488096785;3.2987554732244e-05;-0.00016412380500697;1.7441920135752e-05;4.9729849706637e-05;-0.00014470440510195;0.00032482406822965;-0.00029226596234366;9.9042517831549e-05;-0.00010912456491496;-0.00063320132903755;0.00016287034668494;-6.3392039919563e-06;-1.2322459951974e-05;-0.00039957612170838;-0.00022349174832925;0.00064665201352909;-0.0001815427094698;0.0011237128637731;-0.0002203121985076;-0.00060790870338678;-0.0001060041540768;0.00054755964083597;-5.2027135097887e-05;0.00019486813107505;0.00067584728822112;0.00014128020848148;-0.00032056798227131;0.00026716486900114;-0.00016748701455072;5.2912677347194e-05;0.0005611059605144;0.00016319085261784;-0.001551327528432;5.2177620091243e-05;-5.9846162912436e-05;4.1163722926285e-05;0.00039150138036348;-0.00018097646534443;0.00083817320410162;-0.00015126061043702;0.00045538193080574;0.0001760527229635;-0.00037182847154327;-4.3896012357436e-05;0.00040684058330953;3.3163955777127e-06;0.0011781540233642;-7.148452277761e-05;-1.0588499208097e-05;-0.00022819686273579;0.00011957747483393;0.00017835601465777;0.00016590359155089;-0.00014856898633298;0.00011133049702039;-0.00071403285255656;-6.3729135035828e-06;-0.0012378219980747;0.00013841007603332;-0.00059131014859304;2.7565516575123e-05;-0.00060810765717179;-1.749008151819e-05;0.00015787751181051;7.5769125942315e-06;1.0165067578782e-05;8.7171858467627e-05;0.00034693782799877;-0.00017747408128344;-2.5933230062947e-05;2.4347789803869e-05;0.00034478653105907;-0.00011648768122541;0.00035223743179813;-7.018926407909e-05;-0.00030261112260632;-7.9954705142882e-05;0.00075626518810168;3.5381843190407e-05;-0.00076551968231797;-0.00023259561567102;7.9698693298269e-05;-0.00023038405925035;4.4500375224743e-05;2.4588412998128e-05;0.00017546849267092;-0.0001675304811215;0.00010414456482977;-0.00033941841684282;2.547131589381e-05;4.3026364437537e-05;4.312632518122e-05;0.00021345623827074;2.4733877580729e-05;-0.00023498677182943;1.1377539522073e-05;4.1781404434005e-05;-0.00011222443572478;0.0002011384931393;-0.00018966250354424;-3.2662599551259e-05;-7.2787435783539e-05;-0.00060239457525313;9.413635416422e-05;5.4314616136253e-05;-4.9262757784163e-06;-0.0002831901947502;-0.00016628281446174;0.00041424974915572;-0.0001228351611644;0.00076865049777552;-0.00015692485612817;-0.0004980920930393;-5.2709729061462e-05;0.00040964636718854;9.6196827144013e-06;0.00011331357382005;0.00060699379537255;9.680466610007e-05;-0.00018082161841448;0.00018699682550505;2.1420029952424e-05;3.9956623368198e-05;0.00039556011324748;0.00011890406312887;-0.0011093501234427;7.0371454057749e-05;-5.6227581808344e-05;-0.00070971477543935;-3.5753520933213e-05;-0.0014074225910008;0.00027857604436576;-0.00058061978779733;0.00018424712470733;0.00031753882649355;-0.00015744200209156;-0.00052083190530539;6.1532096879091e-05;-0.0021501986775547;2.690203837119e-05;3.8463545934064e-05;5.5902441090439e-05;0.00033520720899105;-8.4976600192022e-05;-0.00014256066060625;0.00026397663168609;-0.00025764614110813;0.00089294032659382;-0.00023526245786343;0.0021778643131256;-4.2021612898679e-05;0.0010492439614609;-0.00015761434042361;0.00080536078894511;-4.9764523282647e-05;1.0080380889121e-05;1.9850005628541e-05;2.3310694814427e-05;-2.4255271000584e-06;0.00038927813875489;6.1536622524727e-05;0.00010577284410829;-0.00019417428120505;0.00040001535671763;4.2055726225954e-05;0.00040132930735126;-0.00012387640890665;-0.00056015787413344;-5.904789941269e-05;0.00103369273711;-8.9147673861589e-05;-0.00064985686913133;2.5508659746265e-05;-0.00017461099196225;9.5152638095897e-05;-0.00032720691524446;-0.0001202195417136;4.5119664719095e-05;-0.00014101924898569;0.00022593011090066;-0.00027786317514256;0.00011511101183714;-0.0002529620542191;2.3251624952536e-05;0.00048665935173631;3.4547858376754e-05;-0.00058311043540016;4.7406530939043e-05;9.8684962722473e-05;-5.4419740536105e-07;0.00011094388901256;-0.00010455496521899;-0.00023216911358759;-0.00018761609680951;-0.0007609055028297;-0.00014810675929766;8.1722006143536e-05;0.0001345398632111;-0.00031849191873334;5.0581288633111e-06;0.00054474495118484;-0.00019785048789345;0.00082637858577073;-0.00015239464119077;-0.00020138472609688;-0.00066799734486267;-2.9466520572896e-05;0.00019941170467064;0.00044700587750413;0.00075468030991033;0.0001694118254818;-0.00011772780999308;7.9138371802401e-05;0.00018107253708877;0.0002348990237806;0.00034738282556646;4.8497491661692e-05;-0.0012953859986737;0.00015102379256859;7.7598589996342e-05;-6.0822912928415e-05;-0.0007813015836291;-4.2159244912909e-05;-0.0015766452997923;0.00029231558437459;-0.00064972467953339;0.00020806053362321;0.00040962328785099;-0.00019365249318071;-0.0005707613308914;6.132746784715e-05;-0.0024076469708234;1.4400157851924e-05;2.066170281978e-06;6.5538493799977e-05;0.00035992974881083;-0.00012917151616421;-0.00020032841712236;0.00031659324304201;-0.00027567151119001;0.001032828935422;-0.0002277121093357;0.0024076437111944;-2.915727054642e-05;0.001183069543913;-0.00017261679749936;0.00090807565720752;-4.9382699216949e-05;-2.246482836199e-06;2.9930184609839e-05;2.4606837541796e-05;-2.9363191060838e-06;0.00043139964691363;7.9847864981275e-05;8.8379943917971e-05;-0.00020944249990862;0.00046695116907358;3.8409216358559e-05;0.00043864903273061;-0.00012598835746758;-0.00064143596682698;-6.72338574077e-05;0.0011550460476428;-0.00010190396278631;-0.00078339123865589;2.232018232462e-05;-0.0002017595252255;0.00012916095147375;-0.00034790177596733;-0.00012018223060295;3.6568952054949e-05;-0.00018553022528067;0.00023659990984015;-0.00028400757582858;0.00012373115168884;-0.00024591622059233;3.3683365472825e-05;0.00056534825125709;3.9904301956994e-05;-0.00064812792697921;5.5150827392936e-05;0.00011435995111242;6.1726342437396e-07;0.00012600595073309;-0.00012380151019897;-0.00022055953741074;-0.00022854605049361;-0.00084229133790359;-0.00017704398487695;8.0983023508452e-05;0.00016367869102396;-0.00036358801298775;4.1284906728833e-06;0.0006421897560358;-0.00023017574858386;0.00096885376842692;-0.00017845111142378;-0.00022925662051421;-0.00076394120696932;-4.3608230043901e-05;0.00021267452393658;0.00051901786355302;0.00083025672938675;0.00021597907471005;-0.00014591621584259;9.6461335488129e-05;0.00018316964269616;0.00027477537514642;0.00039619937888347;5.7140710850945e-05;-0.0015147203812376;0.00017540842236485;4.9255977501161e-05;-9.0553712652763e-06;2.9002772862441e-05;-1.3838248378306e-05;-0.00032268415088765;-7.7799486462027e-05;-0.00016837156726979;-0.00011424435069785;5.0601167458808e-05;0.00014987819304224;-2.9221575459815e-05;-1.8363554772804e-05;8.3494916907512e-05;-0.00018783318228088;2.037955346168e-05;-0.00014618098794017;-0.00012449201312847;-0.0002740987110883;-0.00010068759002024;0.00029121860279702;8.7980923126452e-05;0.000386585801607;0.00010729744099081;-5.1213093684055e-05;9.4959847046994e-05;0.00010756179108284;0.00019299620180391;3.0815081117908e-05;4.9761289119488e-05;-0.00023518322268501;0.00014147751790006;-4.844643171964e-06;-1.4777211845285e-06;0.00013709426275454;7.8933393524494e-05;0.00017892083269544;8.0601632362232e-05;0.00016449646500405;-1.5067301319505e-05;-0.00028810920775868;7.7426222560462e-05;-0.00012182164209662;-1.7619000573177e-05;4.2635925638024e-05;-4.3345418816898e-05;0.0001629233447602;-2.3421243895427e-05;-0.00010492391447769;0.00024205431691371;0.00024805084103718;-5.0429607654223e-05;-3.7656674976461e-05;-0.00036534902756102;-0.00024377074441873;-8.3813836681657e-05;-3.4315398806939e-05;-0.00012217895709909;3.9156875573099e-05;0.00027884938754141;4.0935206925496e-05;-0.0002300466876477;1.6112293451442e-05;-1.360355054203e-05;2.348650014028e-05;0.00011593127419474;-2.8112175641581e-05;0.00055476120905951;-3.0055776733207e-05;0.00015253924357239;-2.0384295567055e-05;-7.7202013926581e-05;5.3879146435065e-05;0.00012799852993339;7.4422000579943e-06;0.00058855174575001;4.4477550545707e-05;0.00037063032505102;3.1102640605241e-06;-8.0491357948631e-05;-0.00014255940914154;-4.9481033784105e-05;-8.8775959738996e-05;0.00015438653645106;-0.00011300513142487;0.00011353991430951;-0.00047770229866728;-3.4745145967463e-05;-0.00057301513152197;-2.7006852178602e-05;-0.00012283284740988;-3.4107581541321e-06;-0.0004102869424969;-1.8063738025376e-05;4.9666534323478e-05;-9.8839391284855e-06;3.4587985282997e-05;-1.2199843695271e-05;-0.00031648960430175;-7.5582021963783e-05;-0.00015469401841983;-0.00012213840091135;2.9343482310651e-05;0.00017030845629051;-2.5721794372657e-05;-1.7259204469156e-05;9.9417986348271e-05;-0.00019213509222027;2.2692585844197e-05;-0.00015722784155514;-0.00012742953549605;-0.00026854916359298;-9.7362397355027e-05;0.00029380831983872;8.352776785614e-05;0.00037582262302749;0.00010605300485622;-6.7321620008443e-05;9.4762435765006e-05;9.488806972513e-05;0.00020213119569235;2.3245826014318e-05;4.9601061618887e-05;-0.00023361282364931;0.00014775000454392;-4.312031705922e-06;-1.0295268566551e-06;0.00012878228153568;7.958438800415e-05;0.00019011249241885;9.0503213868942e-05;0.00017346696404275;-8.6239579104586e-06;-0.00030528067145497;7.1594578912482e-05;-0.00011358650954207;-1.9231221813243e-05;2.7341891836841e-05;-4.6873443352524e-05;0.00017139376723208;-1.7867267160909e-05;-0.00010321131412638;0.0002557487168815;0.00026393512962386;-5.1476094085956e-05;-4.2825249693124e-05;-0.0003871294320561;-0.00026203057495877;-7.5101110269316e-05;-3.3654381695669e-05;-0.00012888073979411;3.3641586924205e-05;0.0002703454811126;4.4794338464271e-05;-0.00021606996597257;1.5938649085001e-05;-1.2946524293511e-05;2.2758433260606e-05;0.00011606777115958;-2.2785556211602e-05;0.00055967795196921;-1.4335548257804e-05;0.00016458622121718;-1.2169696674391e-05;-7.8672870586161e-05;4.8291294660885e-05;0.00012702138337772;9.6383573691128e-06;0.00058242899831384;5.7324599765707e-05;0.00035931391175836;1.084609539248e-05;-8.2959057181142e-05;-0.00013011708506383;-4.1275463445345e-05;-8.8303117081523e-05;0.00014667265349999;-0.00012936833081767;0.0001001016353257;-0.00047669920604676;-4.6448934881482e-05;-0.0005711039993912;-4.1771007090574e-05;-0.00012401276035234;-5.8603814068192e-06;-0.00040009239455685;-2.5807388738031e-05;9.6588782980689e-06;-1.5001681276772e-05;9.0967132564401e-06;-5.6360036069236e-06;-8.0176459960057e-07;0.00015885125321802;6.8026725784875e-05;7.0185866206884e-05;-0.00012787333980668;4.9826099711936e-05;-1.2861180493928e-06;1.4835261026747e-05;8.6446401837748e-05;-3.7528381653829e-05;8.9046836365014e-05;-2.0315640085755e-06;2.7567910365178e-05;7.2739785537124e-05;-5.3357671276899e-06;8.9271097749588e-06;-0.00011660635937005;-5.4721381275158e-06;-0.00014253116387408;-4.2067182221217e-05;6.9252146204235e-06;-9.9978373327758e-05;-5.232352486928e-05;-1.5980043826858e-05;-1.2180831618025e-05;-6.9693014665972e-05;8.0193181929644e-05;-1.4414007409869e-06;4.4047465053154e-06;2.5857969376375e-05;2.3746408260195e-05;4.814745625481e-05;0.00010336766717955;-2.6368861654191e-06;0.00013403315097094;4.6078086597845e-05;-0.00022914403234608;1.2510494116214e-06;-3.9393082261086e-05;-4.8338846681872e-05;-3.6455025110627e-05;-1.5420800991706e-05;0.00010036787716672;-3.6050296330359e-05;0.00012122124462621;0.00013364873302635;-1.4843115422991e-05;-2.4039025447564e-05;-0.00013498651969712;-0.00020479898375925;-8.7233784142882e-06;1.7587046386325e-05;2.7082380256616e-05;-9.1729903942905e-05;2.1705849576392e-05;7.1706665039528e-05;2.4856708478183e-05;-1.7061749531422e-05;5.5531040743517e-06;-2.3868564014151e-08;9.105499884754e-06;4.995597191737e-05;7.1625749114901e-05;0.00019659526878968;2.6280915335519e-05;0.00013278338883538;6.2875460571377e-06;-6.5205225837417e-05;1.3249013136374e-05;1.7198413843289e-05;5.8304252888774e-05;0.00019465437799226;1.9743876691791e-05;0.00012071734090568;-4.1542625695001e-05;7.5737852966995e-06;3.0688141123392e-05;3.0846829758957e-05;-3.7534857256105e-05;-4.7226581955329e-05;-0.00010102394298883;-6.7987770307809e-05;-0.00015439109120052;-6.0411381127778e-05;-0.00021844978618901;-9.7376405392424e-06;-1.7626329281484e-05;-2.611836680444e-05;-0.00014388401177712;2.5343128982058e-06;-2.133925408998e-05;3.1281255360227e-05;8.5033916548127e-06;4.3775555241155e-05;0.00020504421263468;4.9061851314036e-05;0.00016513430455234;-4.920020364807e-05;-6.7378408857621e-05;1.5601954146405e-05;2.1553931219387e-05;0.00011852426541736;-1.7395404938725e-05;6.1598133470397e-05;-1.7986889361055e-05;3.7804598832736e-05;0.00016017620509956;3.8063331885496e-05;-5.0199036195409e-05;-0.00014356726023834;-3.6547789932229e-05;-0.00026790186529979;-8.014988998184e-05;-2.0628089259844e-05;-9.9799639428966e-05;-9.3154441856313e-05;-3.6875360819977e-05;-3.1427920475835e-05;-6.9848290877417e-05;0.00014474244380835;-3.6845694921794e-06;3.3074343264161e-06;4.4216139940545e-05;8.7639797129668e-05;2.4081748051685e-05;7.503305823775e-05;-2.7258513000561e-05;0.00010073764860863;6.7292756284587e-05;-0.00017324945656583;3.5810314784612e-06;-0.00010038755863206;-3.3374904887751e-05;3.7762969441246e-05;-3.4277647500858e-05;0.00010457593452884;-7.0276990300044e-05;0.00010673989163479;0.00011939703836106;1.1323265880492e-06;-2.3214761313284e-05;-0.00010922488581855;-0.00017259339801967;-2.7214562578592e-05;-2.9336049919948e-05;5.1328774134163e-05;-7.9390760220122e-05;1.5360657926067e-05;0.00017119730182458;2.0124529328314e-05;-0.00015002499276306;1.6536150724278e-05;-9.6437997854082e-06;-2.9408602131298e-05;6.7500499426387e-05;-2.7893460355699e-05;0.00028430394013412;-7.7586528277607e-06;7.8910285083111e-05;3.2845491659828e-05;-4.8873836931307e-05;2.9396285299299e-06;6.2895647715777e-05;8.9774093794404e-06;0.00032687219209038;-9.1590900410665e-06;0.00023051972675603;-4.3659678340191e-05;-9.2496753495652e-05;-3.4682128898567e-05;0.00010799829760799;-5.4967815231066e-05;5.6047636462608e-05;-3.2857722544577e-05;-5.5030786825228e-06;-0.00025105307577178;-1.8446316971676e-06;-0.00032123428536579;-1.4092861420067e-06;-5.5627955589443e-05;2.4791427222226e-06;-0.00025075220037252;7.9787947470322e-05;-8.5807492723688e-05;6.0184946050867e-05;0.00067211268469691;-0.00033056904794648;0.0012937086867169;-0.00019502757641021;0.00077341526048258;0.00020704632333945;-0.00044425367377698;-8.3319093391765e-05;0.00052913115359843;-3.1104998470255e-06;0.0019630475435406;-8.1237667473033e-05;-0.00011177594569745;-0.00036866523441859;0.00018487439956516;0.00015151586558204;0.00026786795933731;-0.00026472809258848;0.00024774068151601;-0.0010756070259959;3.1968262192095e-05;-0.0019418820738792;0.00018654747691471;-0.00096898735500872;4.7039218770806e-05;-0.00086544931400567;-2.7928679628531e-05;0.00015236032777466;1.6671164075888e-06;2.0626290279324e-05;9.4028087914921e-05;0.00046817187103443;-0.00024100953305606;1.2489600521803e-05;3.4662141843e-05;0.0004135106864851;-0.00012985615467187;0.00043562415521592;-7.524745160481e-05;-0.00056457612663507;-0.00012101743777748;0.0010300186695531;2.1449175619637e-05;-0.00076617923332378;-0.0002711825654842;0.0001063272866304;-0.00030795534257777;8.5156490968075e-05;-6.897967250552e-05;0.00020365162345115;-0.00014770148845855;0.00013938812480774;-0.00030409486498684;5.6496308388887e-05;-0.00014595496759284;4.7583984269295e-05;0.00049216736806557;5.3510564612225e-05;-0.00057277467567474;2.1562036636169e-05;6.4223218942061e-05;-0.00018477630510461;0.00018572733097244;-0.00028430586098693;1.3451597624226e-05;-0.00011052212357754;-0.00082935119280592;0.00011578181874938;0.00010941529762931;-1.5045342479425e-05;-0.00028102472424507;-0.00025198541698046;0.00063338404288515;-0.00016048700490501;0.0010009469697252;-0.00018323218682781;-0.00073527009226382;-8.4219238488004e-05;0.00057962723076344;3.774465949391e-05;0.00020198500715196;0.00082202581688762;0.00016501914069522;-0.00026572731439956;0.00026243273168802;1.6442038031528e-05;6.8062465288676e-05;0.00039473411743529;0.00016680732369423;-0.0014734260039404;7.2825598181225e-05;-7.4487419624347e-05;4.7548965085298e-05;0.00060942262643948;-0.00031483179191127;0.0011072206543759;-0.00016301129653584;0.00066173024242744;0.0001529956352897;-0.00031319877598435;-8.5041538113728e-05;0.00046044134069234;-2.2890049876878e-05;0.0017571542412043;-6.2651946791448e-05;-0.00014857339556329;-0.00034286992740817;0.00011898383672815;8.4003651863895e-05;0.00025405912310816;-0.00020563951693475;0.00025311126955785;-0.00088216940639541;5.5711629102007e-05;-0.001734803779982;0.00016413928824477;-0.00083364662714303;5.1066726882709e-05;-0.00074845372000709;-1.7899215890793e-05;9.9753458925989e-05;1.7686143110041e-06;1.9478489775793e-05;6.5904925577343e-05;0.00039728949195705;-0.00021849415497854;4.7613229980925e-05;4.1120099922409e-05;0.00034670613240451;-0.00012877229892183;0.00039373140316457;-6.5909516706597e-05;-0.0004832427657675;-0.00010450768604642;0.00090226362226531;2.769309503492e-05;-0.00060429208679125;-0.00021672541333828;7.8287768701557e-05;-0.00028993593878113;8.2845988799818e-05;-8.5295971075539e-05;0.00019438230083324;-0.00010663982538972;0.00013261786079966;-0.00026481182430871;3.8155707443366e-05;-0.00018551229732111;4.1107345168712e-05;0.00041440219501965;4.4077776692575e-05;-0.00051530625205487;1.5711853848188e-05;5.6531051086495e-05;-0.00015211441495921;0.00014277659647632;-0.00021887217008043;-5.1475792133715e-05;-8.6836807895452e-05;-0.00075793027644977;8.2705584645737e-05;0.00011832312156912;-9.4971437647473e-06;-0.00023953680647537;-0.00020878514624201;0.00049415783723816;-0.00012782712292392;0.00080790591891855;-0.00015238860214595;-0.00062767142662778;-5.2930350648239e-05;0.00047969157458283;5.5101700127125e-05;0.00014419590297621;0.0007397421868518;0.00013003520143684;-0.00018921657465398;0.00021265799296089;7.9277371696662e-05;5.6374032283202e-05;0.00033090717624873;0.00013739730638918;-0.0012084097834304;6.3170511566568e-05;-5.8856374380412e-05;-0.00089092954294756;-2.4875183953554e-05;-0.0016103400848806;0.00038584347930737;-0.00073088391218334;0.00015577563317493;0.00017253003898077;-9.4378083304036e-05;-0.00040177043410949;8.0884390627034e-05;-0.0026029027067125;4.9908754590433e-05;0.00012539683666546;3.6429621104617e-05;0.0003850233333651;-6.7071916419081e-05;3.2229745556833e-05;0.00036984230973758;-0.00031855644192547;0.00092192972078919;-0.00038363938801922;0.0024628511164337;-0.00010005041986005;0.0013032413553447;-0.00015270060976036;0.00074934324948117;-5.808322748635e-05;0.00019014871213585;1.048951253324e-05;1.7793734514271e-05;-6.6602738115762e-06;0.00028567959088832;6.9587936195603e-06;0.00014849592116661;-0.00017495627980679;0.00032485101837665;4.7817706217756e-05;0.00028391220257618;-6.2527506088372e-05;-0.00070085248444229;-3.2661813747836e-05;0.00089910498354584;-8.7810229160823e-05;-0.00016097190382425;-1.5491712474613e-05;-4.4501255615614e-05;8.7828528194223e-05;-0.00032401594216935;-0.00027042554575019;5.4606389312539e-05;-4.0277433299707e-07;0.00017129462503362;5.9098398196511e-05;0.00011153998639202;-0.00057888322044164;4.0690632886253e-05;0.00071447581285611;1.3549462892115e-05;-0.00087377714226022;6.6240303567611e-05;0.00010629528696882;5.5641926337557e-06;-9.2971604317427e-05;-0.00013833309640177;-0.00017132679931819;-0.00019943951338064;-0.00068662915145978;-0.00015569724200759;0.00012244936078787;0.00010400167957414;-0.00010912253492279;-5.3585358728014e-06;0.00057167088380083;-0.00021851339261048;0.00065507815452293;-0.00012827751925215;-0.00011674776033033;-0.00068409426603466;-4.4377462472767e-05;0.00023944889835548;0.00041525301639922;0.00067803252022713;0.00022563475067727;-4.8055648221634e-05;0.00011595193791436;0.00013950861466583;0.0002252970734844;4.8366193368565e-05;6.4084160840139e-05;-0.001063542207703;0.00014584996097255;7.0347690780181e-05;-6.5349398937542e-05;-0.0010048068361357;-2.9330607503653e-05;-0.00179807189852;0.00042278130422346;-0.00082094926619902;0.00017271720571443;0.00022074360458646;-0.0001126108400058;-0.00042701244819909;8.601752051618e-05;-0.0029926020652056;4.1974824853241e-05;0.00012741304817609;3.9945603930391e-05;0.0004243518342264;-9.8318152595311e-05;1.4559559531335e-05;0.00043196999467909;-0.00035114769707434;0.0010516922920942;-0.00041003493242897;0.0027685032691807;-0.00010008110257331;0.0014735944569111;-0.00016523731756024;0.00084718898870051;-5.9770209190901e-05;0.00022237283701543;1.9148743376718e-05;1.2187550055387e-05;-4.8996780606103e-06;0.00030183698982;1.1863516192534e-05;0.00014889054000378;-0.00019084251835011;0.00038168160244823;5.0749989895849e-05;0.00032139811082743;-6.7196880991105e-05;-0.00079242343781516;-3.9827107684687e-05;0.0010152425384149;-0.00010275489330525;-0.0002142687299056;-1.8584043573355e-05;-4.1180930566043e-05;0.00011877986980835;-0.00035563763231039;-0.00030116181005724;4.5990513172001e-05;-1.883767072286e-05;0.00018109491793439;0.00011079174146289;0.00012714734475594;-0.00064890884095803;4.8273319407599e-05;0.00083050428656861;1.7006917914841e-05;-0.0010035230079666;7.6607400842477e-05;0.00012836384121329;7.1750796450942e-06;-0.00013621058315039;-0.00016608562145848;-0.00018904087482952;-0.00023848596902099;-0.00078704534098506;-0.00018620502669364;0.0001398078748025;0.00012470470392145;-0.00012149762187619;-6.7949581534776e-06;0.00064654293237254;-0.00025642046239227;0.00075544900028035;-0.00014942804409657;-0.00012826053716708;-0.00080091011477634;-5.6793051044224e-05;0.000278300489299;0.00048610279918648;0.0007690439815633;0.0002787736011669;-1.8488710338715e-05;0.00013863938511349;0.00017911102622747;0.00026339796022512;3.6172918044031e-05;7.5969037425239e-05;-0.0012364105787128;0.0001705228787614;3.3186024666065e-05;-3.8653812225675e-05;-0.0006459389696829;-1.4091428965912e-05;-0.0010445704683661;0.00027250038692728;-0.00045245289220475;0.00010495083552087;0.0001099864821299;-6.2740007706452e-05;-0.00020766837405972;5.2463328756858e-05;-0.0020107962191105;3.266259591328e-05;6.3647472416051e-05;2.6604884624248e-05;0.00027636252343655;-2.6499961677473e-05;1.7829703210737e-05;0.0002505564771127;-0.00024006540479604;0.00057915539946407;-0.0002588864590507;0.0017435614718124;-6.5710053604562e-05;0.00090369605459273;-0.00010814653069247;0.0005090520135127;-3.8156973459991e-05;0.00023107886954676;7.0830269578437e-06;4.8247698032355e-06;-1.2658972536883e-06;8.6477324657608e-05;-4.9396307986171e-06;8.7886728579178e-05;-0.00011060988617828;0.00027260411297902;3.2417661714135e-05;0.00019848391821142;-4.3199885112699e-05;-0.00046787221799605;-2.5282346541644e-05;0.00059868849348277;-6.8598565121647e-05;-0.00015067090862431;-8.1759835666162e-06;3.0441176932072e-05;9.5140065241139e-05;-0.000221899128519;-0.00019714690279216;-1.9285170083094e-07;-3.3242755307583e-05;0.000109115804662;0.0002155017136829;8.8145156041719e-05;-0.00046150584239513;2.6093459382537e-05;0.00048813014291227;1.1750807061617e-05;-0.00059908226830885;4.7983747208491e-05;0.00010015229781857;-1.5974559346432e-06;-0.00018187295063399;-0.00010433704301249;-0.00023886856797617;-0.00012612828868441;-0.00053292920347303;-0.00011047999578295;0.00012101188622182;5.7511890190654e-05;-9.5214098109864e-05;1.0329931399156e-07;0.00023380074708257;-0.0001559231459396;0.00035942770773545;-7.8226483310573e-05;-5.357245754567e-05;-0.00049326103180647;-2.0852021407336e-05;0.00021312991157174;0.00027727239648812;0.000482868461404;0.00016226986190304;0.0001847270905273;8.0456520663574e-05;0.00031608421704732;0.00014756890595891;-1.0074257943415e-06;4.7090063162614e-05;-0.0006903984467499;0.00010119337821379;4.8916663217824e-05;-6.7922237576568e-06;1.025528399623e-05;-1.8962744434248e-05;-0.00028564024250954;-7.4570831202436e-05;-0.00016173995391;-9.8584474471863e-05;5.2898925787304e-05;0.00011880775127793;-1.0443142855365e-05;-2.1339672457543e-05;6.8043220380787e-05;-0.00018150005780626;3.2406078389613e-05;-0.0001247672480531;-0.00011048441228922;-0.0002587764756754;-8.7707121565472e-05;0.00026942402473651;8.8006891019177e-05;0.00035390627454035;9.5404102467e-05;-4.0873826947063e-05;9.6098956419155e-05;9.3254231614992e-05;0.00017434866458643;3.7061615785206e-06;5.3817766456632e-05;-0.00020568793115672;0.00012857535330113;-6.7609717007144e-06;-6.8507000605678e-07;0.00013544851390179;7.0517344283871e-05;0.00015853726654314;6.762714474462e-05;0.00011356488539604;-1.4889738849888e-05;-0.00023152916401159;6.307584408205e-05;-0.00010880536865443;-1.481379604229e-05;5.5684002290946e-05;-3.3587199141039e-05;0.00017555363592692;-1.7528711396153e-05;-9.9977442005184e-05;0.00019447617523838;0.00021524942712858;-4.3312604248058e-05;-2.0522171325865e-05;-0.00029309463570826;-0.00021125424245838;-9.9864897492807e-05;-3.466229463811e-05;-0.00011632713722065;3.411914804019e-05;0.00027874167426489;3.6045625165571e-05;-0.00025995349278674;8.9282602857566e-06;-1.8447308320901e-05;2.5350494979648e-05;8.893346239347e-05;-3.3221993362531e-05;0.00050795229617506;-4.1686875192681e-05;0.00013322690210771;-2.7595440769801e-05;-6.3643674366176e-05;5.3460396884475e-05;0.00015918677672744;5.7078118516074e-06;0.00055600865744054;3.4225045965286e-05;0.00032871111761779;-4.38502581801e-07;-6.7756394855678e-05;-0.00015596652519889;-6.123634375399e-05;-6.7747161665466e-05;0.00014883909898344;-8.7145082943607e-05;0.00013049195695203;-0.00044688317575492;-2.2077660105424e-05;-0.0005326391546987;-1.7172604202642e-05;-0.00015911694208626;-3.6385981729836e-06;-0.0003535098512657;-1.217072167492e-05;4.8898877139436e-05;-7.4076033342863e-06;1.9125845938106e-05;-1.7674914488452e-05;-0.00028000702150166;-7.2238253778778e-05;-0.00015061961312313;-0.00010254895460093;4.0805534808896e-05;0.00013030580885243;-1.0713805750129e-05;-2.0749523173436e-05;8.4416889876593e-05;-0.00018563895719126;3.2108589948621e-05;-0.00013153144391254;-0.00011374509631423;-0.00025295114028268;-8.6473177361768e-05;0.0002693907590583;8.4542269178201e-05;0.00034605732071213;9.3269947683439e-05;-5.7659519370645e-05;9.6811920229811e-05;8.2679718616419e-05;0.00017987088358495;6.2878564222046e-07;5.4059135436546e-05;-0.00020682586182375;0.00013381258759182;-5.985386451357e-06;-1.6386321988193e-07;0.00012824025179725;7.2512957558502e-05;0.00016405734641012;7.5271018431522e-05;0.00012173091818113;-1.0838372872968e-05;-0.00024288074928336;5.8441146393307e-05;-0.00010007110540755;-1.657884058659e-05;4.3414809624664e-05;-3.5460336221149e-05;0.00017475021013524;-1.276946386497e-05;-0.00010064828529721;0.00020603775919881;0.00022863340564072;-4.0465045458404e-05;-2.4897655748646e-05;-0.00031295421649702;-0.00022565218387172;-9.2743430286646e-05;-3.5182089050068e-05;-0.00011699533934006;3.0115836125333e-05;0.00026727450313047;3.9964659663383e-05;-0.00024326085986104;7.1024032877176e-06;-1.6976713595795e-05;2.4185621441575e-05;9.019575372804e-05;-2.8357619157759e-05;0.00050764833576977;-2.9153638024582e-05;0.00013966149708722;-2.1560610548477e-05;-6.4129846577998e-05;4.9943442718359e-05;0.00015240941138472;8.479728421662e-06;0.00054684735368937;4.615553189069e-05;0.00032085314160213;5.9151998357265e-06;-7.1180525992531e-05;-0.00014936490333639;-5.7843717513606e-05;-6.6086497099604e-05;0.000144113713759;-9.4477938546333e-05;0.00012211667490192;-0.00044101616367698;-3.3019263355527e-05;-0.00052796234376729;-2.9570152037195e-05;-0.00015518831787631;-6.7387768467597e-06;-0.00034695951035246;-1.89388574654e-05;3.3609281672398e-05;-5.0814674068533e-06;1.504791998741e-05;-1.2864649761468e-05;-0.00018663075752556;-4.8537403927185e-05;-9.9582182883751e-05;-6.9843961682636e-05;2.4596898583695e-05;8.9752924395725e-05;-5.970151960355e-06;-1.4628117241955e-05;6.4362160628662e-05;-0.00013031577691436;2.518531982787e-05;-9.0835070295725e-05;-7.7798817073926e-05;-0.00017074620700441;-5.8281890233047e-05;0.00018260425713379;5.7155804825015e-05;0.00023326789960265;6.1744278355036e-05;-4.5659257011721e-05;6.8321038270369e-05;5.0328992074355e-05;0.00012422309373505;-2.968042053908e-06;3.8232265069382e-05;-0.00014253097469918;9.3842609203421e-05;-3.9059127630026e-06;2.0796665012313e-07;8.7467888079118e-05;5.048259117757e-05;0.0001127705181716;5.3673742513638e-05;8.1056488852482e-05;-5.4454594646813e-06;-0.00016407636576332;3.5774370189756e-05;-6.5908003307413e-05;-1.212238385051e-05;2.8141887014499e-05;-2.3853594029788e-05;0.00012135223369114;-5.5871164477139e-06;-7.0435606176034e-05;0.00014201266458258;0.00015968122170307;-2.6061805328936e-05;-1.6561012671445e-05;-0.0002159458672395;-0.00015866248577368;-6.4441206632182e-05;-2.4885814127629e-05;-7.9891797213349e-05;1.8280334188603e-05;0.00018176015873905;2.9186372557888e-05;-0.00016664066060912;2.576633278295e-06;-1.1712649211404e-05;1.6438320017187e-05;6.0325721278787e-05;-1.8316954083275e-05;0.00034574570599943;-1.6455885997857e-05;9.5163202786352e-05;-1.3629174645757e-05;-4.2575917177601e-05;3.348112659296e-05;0.00010616226791171;7.1568670136912e-06;0.00037248551961966;3.6327997804619e-05;0.00021598426974379;6.4664568526496e-06;-4.9562575441087e-05;-0.00010435789590701;-4.1197581595043e-05;-4.2134244722547e-05;9.8097792943008e-05;-6.2793209508527e-05;8.4411498392001e-05;-0.00030045959283598;-2.6368737962912e-05;-0.00035993035999127;-2.4716677216929e-05;-0.0001094621111406;-6.3531933847116e-06;-0.00023267234792002;-1.5547664588667e-05;4.9583436521061e-06;-1.2129286915297e-05;1.3897531971452e-05;-1.3523970210372e-06;8.0082381828106e-06;0.00011742144124582;4.0458351577399e-05;6.6875763877761e-05;-6.4362007833552e-05;5.9328258430469e-06;4.185848410998e-06;8.3449585872586e-06;7.3651528509799e-05;-2.5764231395442e-05;5.2605937526096e-05;-7.07655772203e-06;2.0382558432175e-05;6.7426168243401e-05;5.5365380831063e-06;-6.5808726503747e-06;-8.5701860371046e-05;-6.5060403358075e-06;-0.00012555900320876;-4.3306710722391e-05;4.2203873817925e-06;-6.8716348323505e-05;-3.9708087570034e-05;-1.9104743842036e-05;-6.6953111854673e-06;-5.0371134420857e-05;6.9028174038976e-05;-8.3470899880922e-07;2.7521382435225e-06;2.4829616450006e-05;3.1713130738353e-05;3.0707305995747e-05;6.3640880398452e-05;-6.5911267483898e-06;7.4530697020236e-05;3.0353878173628e-05;-0.00013502800720744;1.2939044609084e-06;-3.8011821743567e-05;-2.7474672606331e-05;-8.2542919699335e-06;-1.0543947610131e-05;7.0711474108975e-05;-3.7100759072928e-05;8.058956154855e-05;9.548549860483e-05;-5.0408730203344e-06;-1.1558009646251e-05;-9.3143891717773e-05;-0.00013525757822208;-1.4448023648583e-05;-6.5392276837883e-07;2.167688580812e-05;-5.6931992730824e-05;1.5613508367096e-05;7.286239269888e-05;1.1413560059736e-05;-4.7300814912887e-05;6.5414296841482e-06;-2.4015669168875e-06;-2.493238525858e-06;3.496924546198e-05;2.8098038455937e-05;0.00015279438230209;1.1839279068226e-05;7.2761278715916e-05;1.0832055522769e-05;-3.6480782000581e-05;9.0128905867459e-06;2.7119553124066e-05;3.5503391700331e-05;0.0001626417360967;8.8511233116151e-06;0.00010294475214323;-3.0922194127925e-05;-2.9966522561153e-05;-3.5102332276438e-06;4.2907304305118e-05;-2.3049553419696e-05;-1.8804516912496e-06;-4.041696593049e-05;-3.6634948628489e-05;-0.00012738810619339;-3.3830841857707e-05;-0.00017016829224303;-8.4961457105237e-06;-2.8430327802198e-05;-1.3724282325711e-05;-0.00011702200572472;2.6016032279585e-06;-1.4062440641283e-05;2.0278224837966e-05;5.7237266446464e-06;2.0338507965789e-05;0.00012672667799052;3.3765350963222e-05;9.3930713774171e-05;-3.9956601540325e-05;-2.6749348762678e-05;9.0322082542116e-06;7.4749314080691e-06;8.048538438743e-05;-1.564399281051e-05;4.285825707484e-05;-1.3573559954239e-05;2.2213836928131e-05;9.2049027443863e-05;1.6646203221171e-05;-2.4004535589484e-05;-9.2309179308359e-05;-1.4985075722507e-05;-0.00015823756984901;-5.26343465026e-05;-5.6769649745547e-06;-6.6400411014911e-05;-5.0549559091451e-05;-2.4957906134659e-05;-9.2062509793323e-06;-4.8278070607921e-05;8.3101171185263e-05;-1.4229823364076e-06;2.1400364857982e-06;2.848039730452e-05;4.958357749274e-05;2.2104697563918e-05;5.2611114369938e-05;-1.2894744031655e-05;5.6678800319787e-05;3.4248641895829e-05;-0.00011151753278682;2.1475043467944e-06;-5.524428706849e-05;-2.2239226382226e-05;1.4003781870997e-05;-1.5149126738834e-05;7.459482003469e-05;-4.5637905714102e-05;6.9745925429743e-05;8.6377811385319e-05;1.5728049902464e-06;-1.1117704161734e-05;-8.1209545896854e-05;-0.00011454966443125;-1.8862901924876e-05;-1.42339777085e-05;2.7361043976271e-05;-5.2664221584564e-05;1.2692057680397e-05;0.00010297442349838;1.0015894986282e-05;-9.0589514002204e-05;1.0054569429485e-05;-5.654103915731e-06;-1.4578395166609e-05;3.7047448131489e-05;-3.1831873457122e-06;0.00017553093493916;8.6736571347501e-07;5.5408378102584e-05;1.8138996892958e-05;-3.0698407499585e-05;5.1001511565119e-06;4.4257329136599e-05;1.8363774870522e-05;0.00019789169891737;-3.6028140470989e-07;0.00012973346747458;-2.974189374072e-05;-5.9025442169514e-05;-2.1438769181259e-05;6.4395761000924e-05;-2.6762203560793e-05;2.9065560738673e-05;-2.0646328266594e-05;-1.5593754142174e-05;-0.00015335279749706;-1.4411780284718e-05;-0.00019566784612834;-5.1928595894424e-06;-4.3982199713355e-05;-4.1736416278582e-06;-0.00014139154518489;1.149096192421e-06;-2.306396709173e-05;3.739803287317e-05;1.7927091903402e-05;4.6311382902786e-05;0.00019534246530384;4.5395532652037e-05;0.00016957556363195;-3.8126341678435e-05;-7.0632508140989e-05;1.858811629063e-05;1.000903921522e-05;0.00012638721091207;-1.3992403182783e-05;5.5899767176015e-05;-3.1243311241269e-05;3.4322514693486e-05;0.00016558343486395;3.6364912375575e-05;-5.5961056204978e-05;-0.00014351004210766;-3.4754681109916e-05;-0.00026915952912532;-8.7946020357776e-05;-2.0514575226116e-05;-9.8806216556113e-05;-8.5009698523208e-05;-4.2835916246986e-05;-1.6349003999494e-05;-6.973254494369e-05;0.00014138364349492;-3.1980678159016e-06;2.8302260943747e-06;4.4393163989298e-05;9.4674483989365e-05;2.2763457309338e-05;6.9024994445499e-05;-2.5014254788402e-05;6.781436240999e-05;5.6257271353388e-05;-0.00014469974848907;4.2802407733689e-06;-0.00010440918413224;-2.8750313504133e-05;4.6214070607675e-05;-2.8420847229427e-05;0.00012109011004213;-7.5074327469338e-05;9.1473099018913e-05;0.00011548493057489;1.0027401003754e-05;-2.0728988602059e-05;-0.00010641825792845;-0.00014526917948388;-3.0765197152505e-05;-3.7163725210121e-05;4.6929031668697e-05;-7.81111230026e-05;1.5112880646484e-05;0.00018956414714921;1.5269124560291e-05;-0.00018517977150623;1.901494761114e-05;-1.2733023140754e-05;-3.4824130125344e-05;5.9164620324736e-05;-3.7908044760115e-05;0.00028937525348738;-1.1076751434302e-05;6.7169770773035e-05;3.4076190786436e-05;-4.1289946238976e-05;2.5395167995157e-06;8.6744366853964e-05;6.6824773057306e-06;0.00033803950645961;-1.0502801160328e-05;0.00022468842507806;-4.1681796574267e-05;-0.00011261890904279;-4.549717050395e-05;0.0001163448105217;-4.7225305024767e-05;7.2801107307896e-05;-1.7581729480298e-05;8.1310901123288e-07;-0.00026168359909207;9.0263154106651e-07;-0.00032398590701632;-2.7365611003916e-06;-8.2692764408421e-05;4.5166962081566e-06;-0.00023883499670774;6.4731371821836e-05;-5.9964149841107e-05;2.3596023311256e-05;0.00062258646357805;-0.00034504290670156;0.0009874221868813;-0.00010796319838846;0.00061873171944171;8.4756138676312e-05;-0.00016120035434142;-8.7594620708842e-05;0.00025658484082669;-3.4778709959937e-05;0.001790689653717;-4.0231909224531e-05;-0.00012235055328347;-0.00031002057949081;8.086488378467e-05;-5.6303004384972e-05;0.00026331946719438;-0.00024988711811602;0.00030345178674906;-0.0007001519552432;9.7131094662473e-05;-0.0015643008518964;0.00013193818449508;-0.00086650589946657;4.6803481382085e-05;-0.00053690536879003;-7.9765004556975e-06;-0.00012142964988016;-1.7785999943953e-06;6.8234817263146e-06;1.8899545466411e-05;0.00018875251407735;-0.00013008814130444;2.1425505110528e-05;3.1844145269133e-05;0.000183896307135;-6.8073233705945e-05;0.00024278454657178;-2.8314065275481e-05;-0.00043119202018715;-8.5372761532199e-05;0.0005731342243962;1.8625335940214e-07;-0.00018867211474571;-6.7847911850549e-05;5.4214830015553e-05;-0.000189562124433;4.5698001486016e-05;-0.00012164040526841;9.0302331955172e-05;1.3947767911304e-05;9.251017763745e-05;6.104836211307e-05;3.772117634071e-05;-0.00030249418341555;1.7945127183339e-05;0.00046912612742744;4.8999525461113e-05;-0.00058422441361472;1.3034788025834e-05;6.6087406594306e-05;-0.00014422301319428;-8.2022852438968e-05;-0.00017240652232431;-8.3279417594895e-05;-6.9848880229983e-05;-0.00055513519328088;3.8131049223011e-05;0.00014006972196512;-1.4036359971215e-05;-5.6194039643742e-05;-0.00017651643429417;0.00033861235715449;-7.7339958806988e-05;0.00045316625619307;-5.7422159443377e-05;-0.00052623468218371;-6.4596351876389e-05;0.00034659670200199;0.00012499743024819;0.00016312417574227;0.0005450455355458;0.00012820487609133;-1.151096967078e-05;0.00014960633416194;0.00015143217751756;5.6660435802769e-05;3.4825767215807e-05;0.00010180111712543;-0.00076062924927101;9.4394556072075e-05;-9.0373017883394e-05;4.6643108362332e-05;0.00089637958444655;-0.00049078703159466;0.001506682834588;-0.00016792574024294;0.0009797994280234;0.00013711788051296;-0.000277595652733;-0.0001270880602533;0.00044453990994953;-4.1892901208485e-05;0.0025375171098858;-5.8062480093213e-05;-0.0002369230351178;-0.00045555148972198;0.00015978755254764;-5.6015407608356e-05;0.00036130202352069;-0.0003621822106652;0.00043444285984151;-0.0011266442015767;0.00012969993986189;-0.0023130243644118;0.00019133464957122;-0.0012637275503948;6.8354565883055e-05;-0.00085457030218095;-1.9017292288481e-05;-4.6615390601801e-05;-6.2631561377202e-06;2.037043668679e-05;4.011108467239e-05;0.00038916670018807;-0.00022226087457966;4.8836056521395e-05;4.9508777010487e-05;0.00028904833015986;-0.0001019179544528;0.00037323238211684;-4.5838100049878e-05;-0.00071539264172316;-0.00012787425657734;0.00093740248121321;-4.2618444240361e-06;-0.00028818740975112;-0.0001583932316862;7.7351003710646e-05;-0.00030947019695304;0.00010200215183431;-0.00019892906129826;0.00015676079783589;2.099476478179e-05;0.0001398506865371;-1.7323696738458e-05;6.4330342866015e-05;-0.00044366723159328;2.8235017452971e-05;0.00074063165811822;7.4792711529881e-05;-0.00091284565860406;2.5270377591369e-05;8.1145481090061e-05;-0.00021970507805236;-5.186814632907e-06;-0.00028692328487523;1.2732491086354e-05;-0.00011698801245075;-0.00083640083903447;7.8673983807676e-05;0.00017615726392251;-2.3555929146823e-05;-0.00010461987403687;-0.00027561985189095;0.00065780815202743;-0.0001349184603896;0.00083323597209528;-0.0001172492193291;-0.00079007772728801;-8.572426304454e-05;0.00056317570852116;0.00011530252959346;0.00024229072732851;0.00081539031816646;0.00019912794232368;-0.00019764670287259;0.00025245686993003;4.6032291720621e-05;8.5559709987137e-05;0.00012298583169468;0.00016224374121521;-0.0012749732704833;8.2983722677454e-05;-7.6809141319245e-05;3.5411736462265e-05;0.00078819680493325;-0.00044288468779996;0.0013088803971186;-0.00014429671864491;0.00084256392437965;0.00010699544509407;-0.00020370210404508;-0.00011692172120092;0.00038882865919732;-5.2879542636219e-05;0.002202880801633;-4.8851896281121e-05;-0.00022020000324119;-0.00040658272337168;0.00011155378888361;-7.4851857789326e-05;0.00032818707404658;-0.00030258414335549;0.00039824275881983;-0.00094575481489301;0.0001311374217039;-0.0020252629183233;0.00017175231187139;-0.0010991545859724;6.6366672399454e-05;-0.00073491974035278;-1.0001383998315e-05;-5.8323792472947e-05;-6.6649904510996e-06;2.1541321984841e-05;2.5154511604342e-05;0.00033480956335552;-0.00019780555157922;6.1410872149281e-05;4.7717992856633e-05;0.00024414109066129;-9.171363490168e-05;0.00032227201154456;-3.8205926102819e-05;-0.00061906717019156;-0.00010818881128216;0.00080879917368293;-1.6994316638375e-06;-0.00020948330347892;-0.00012755504576489;5.6502660299884e-05;-0.00028119899798185;9.5731287728995e-05;-0.00018719639047049;0.00014677934814245;3.295527130831e-05;0.00012514388072304;-1.8712347809924e-05;5.113585939398e-05;-0.00041225331369787;2.3065749701345e-05;0.00062748603522778;6.3306710217148e-05;-0.00078820838825777;1.9959386918345e-05;6.7865403252654e-05;-0.0001817511219997;-4.8880667691265e-07;-0.00023285399947781;-1.0827598089236e-05;-9.6033581939992e-05;-0.00072756089502946;5.8909052313538e-05;0.00015932811948005;-1.9024335415452e-05;-8.9772991486825e-05;-0.00023137562675402;0.00054819526849315;-0.00011030944006052;0.0006891941302456;-9.9148746812716e-05;-0.00066194694954902;-6.1759303207509e-05;0.0004677759425249;0.0001029100312735;0.00018972936959472;0.00070330192102119;0.00016436215082649;-0.00016819624579512;0.00021009679767303;5.4744828958064e-05;7.2008813731372e-05;0.00010794401896419;0.00013516673061531;-0.0010604424169287;5.2114432037342e-05;-5.2893505198881e-05;-0.00093432312132791;-1.5768308685438e-06;-0.0016265735030174;0.00042752997251227;-0.00077445787610486;0.00011512349010445;7.8258010034915e-05;-5.804071406601e-05;-0.00019961044017691;7.9564735642634e-05;-0.0026456725317985;5.8915091358358e-05;7.0578134909738e-05;3.255960837123e-05;0.00035315696732141;-5.6178181694122e-05;0.00017286566435359;0.00047115792403929;-0.00033504495513625;0.00082514074165374;-0.0004479797789827;0.0023451158776879;-0.00013235442747828;0.0014498739037663;-0.00013871099508833;0.00054276443552226;-5.0088321586372e-05;0.00038231996586546;-3.5338864563528e-06;-1.3326593034435e-05;-3.1595052973898e-07;0.00011679794988595;-3.52265778929e-05;5.4607797210338e-05;-0.00010838642629096;0.00018068513600156;4.685543171945e-05;0.0001507830893388;-4.0624049688631e-06;-0.0006424190942198;-1.094705748983e-05;0.00057601794833317;-6.7104818299413e-05;0.00021653207659256;-4.2327210394433e-05;8.2283506344538e-05;6.0077862144681e-05;-0.00025934472796507;-0.00029284897027537;2.642403342179e-05;0.0001497344346717;8.2658407336567e-05;0.00035246182233095;8.791438449407e-05;-0.0006420353311114;3.8518821384059e-05;0.00078555959044024;-6.4977602960425e-06;-0.00095116120064631;6.809185288148e-05;0.00010105055116583;1.2416864592524e-05;-0.00028790420037694;-0.00015243641973939;-0.00010746293264674;-0.00019930595590267;-0.00048188981600106;-0.00014758863835596;0.0001246811443707;7.6420234108809e-05;0.00011243053450016;-1.8670754798222e-05;0.00056093314196914;-0.00021492698579095;0.00043402865412645;-9.7207936050836e-05;-2.4941364245024e-05;-0.00062393496045843;-8.0060410255101e-05;0.00026859139325097;0.00033310422440991;0.00052023434545845;0.00027604872593656;3.5142275010003e-05;0.00014340880443342;2.5825807824731e-05;0.000195041517145;-0.00026230994262733;7.3443188739475e-05;-0.00072012463351712;0.0001259636337636;6.7832028435078e-05;-6.163396028569e-05;-0.0010412260890007;2.4477105853293e-06;-0.0018167649395764;0.00046598372864537;-0.00088370515732095;0.00011939169780817;0.00011144992458867;-6.9874804466963e-05;-0.00019070130656473;8.4756145952269e-05;-0.0029974556528032;4.6685516281286e-05;5.7975870731752e-05;3.4161810617661e-05;0.00036659132456407;-9.5659444923513e-05;0.00018888544582296;0.00056539493380114;-0.00035784192732535;0.0009365500882268;-0.00048419562517665;0.0025929145049304;-0.00013897303142585;0.0016530393622816;-0.00014146669127513;0.00058268615975976;-4.6699591621291e-05;0.00044511139276437;4.3408767851361e-06;-4.442490535439e-05;1.032548607327e-05;0.00011943457502639;-3.8838017644593e-05;4.7001536586322e-05;-0.00011110201012343;0.00018518799333833;4.8615194828017e-05;0.00017027571448125;-3.0478886401397e-06;-0.00065933092264459;-1.9289349438623e-05;0.0006294084014371;-7.7664342825301e-05;0.00024082099844236;-4.6469565859297e-05;0.00010275544627802;7.5036092312075e-05;-0.0002709977561608;-0.00031709257746115;1.5420189811266e-05;0.00016496298485436;7.6230222475715e-05;0.00037851961678825;0.00010187457519351;-0.00069302559131756;4.3055799324065e-05;0.00090017745969817;-5.3543772082776e-06;-0.0010996208293363;7.7155869803391e-05;0.00011858142534038;1.8713024473982e-05;-0.00036798277869821;-0.00018447852926329;-0.00011100620031357;-0.00024733491591178;-0.00052329286700115;-0.00017783269868232;0.00013471284182742;9.7792610176839e-05;0.000162152282428;-2.5803215976339e-05;0.0006770474719815;-0.00025483025819995;0.00050664832815528;-0.00011654439003905;-2.5320536224172e-05;-0.00074602366657928;-0.00011407113925088;0.00032529514282942;0.00039664912037551;0.00059449265245348;0.00035186059540138;6.5077081671916e-05;0.00017591346113477;-1.2090140444343e-05;0.00023165908351075;-0.00036332252784632;8.9000233856495e-05;-0.00082415086217225;0.00014848935825285;5.2885850891471e-05;-4.3300264223944e-05;-0.00066572369541973;1.1449983503553e-05;-0.0011768328258768;0.00030178923043422;-0.00057548878248781;7.2295908466913e-05;8.2703649241012e-05;-5.0619717512745e-05;-0.00010157985525439;5.3669031331083e-05;-0.0019728641491383;2.4174092686735e-05;-2.1921669031144e-06;2.4833369025146e-05;0.00021178807946853;-6.6827175032813e-05;0.00013233491335995;0.00039389106677845;-0.00022760663705412;0.00059120764490217;-0.00031341816065833;0.0016531422734261;-9.1976544354111e-05;0.0011122002033517;-8.7831460405141e-05;0.00034837672137655;-2.5109970010817e-05;0.00033130976953544;3.3197084121639e-06;-5.5886339396238e-05;1.7237565771211e-05;3.7650432204828e-05;-2.7958825739915e-05;1.0226617632725e-06;-5.810237780679e-05;0.00010322291200282;2.9477158022928e-05;0.0001091489175451;-3.1689210118202e-06;-0.00033423362765461;-1.8833661670214e-05;0.00036092978552915;-4.9865757318912e-05;0.00014229291991796;-2.5762021323317e-05;8.6653744801879e-05;4.8879839596339e-05;-0.00015826075104997;-0.00017887019203044;-9.4140377768781e-06;0.00010853706044145;3.7228062865324e-05;0.00024502465385012;6.9186229666229e-05;-0.00040600754437037;2.2656344299321e-05;0.0005549814668484;-1.6698356830602e-06;-0.00069383892696351;4.774306944455e-05;8.5939602286089e-05;1.2749250345223e-05;-0.00029213054222055;-0.00012278973008506;-0.00012622242502403;-0.00016515824245289;-0.00032068722066469;-0.00011587610060815;8.7760388851166e-05;6.5643987909425e-05;0.00011661756434478;-1.8609671315062e-05;0.00042412741458975;-0.00016799155855551;0.0003048395155929;-7.5749660027213e-05;-1.1879502380907e-05;-0.00050682004075497;-9.3886577815283e-05;0.00024896729155444;0.00025767157785594;0.00040230024023913;0.00024797153309919;0.00012727771536447;0.00011826124682557;1.1900896197403e-06;0.00014957775420044;-0.00028878360171802;6.060283340048e-05;-0.00050194544019178;9.7032258054242e-05;4.6388035116252e-05;-4.817956869374e-05;7.4758725077118e-07;0.00043167785042897;-0.00025605282280594;0.00071259477408603;-5.592231900664e-05;0.00047676480608061;4.6206092520151e-05;-8.4965926362202e-05;-6.280808156589e-05;0.00012032515223837;-2.2665024516755e-05;0.0012545532081276;-2.3968717869138e-05;-5.4302603530232e-05;-0.00018131437536795;6.365223089233e-05;-0.00010201363329543;0.00017766737437341;-0.0002274021244375;0.00024041709548328;-0.00046650637523271;8.6636799096595e-05;-0.0010312463855371;7.8731070971116e-05;-0.00069235078990459;2.6876919946517e-05;-0.00029527134029195;-2.801228674798e-06;-0.0001554676273372;4.8221759243461e-06;-1.6913820218178e-05;1.9522935872374e-06;6.8995010224171e-05;-5.5035921832314e-05;-2.5964423912228e-05;1.7753995052772e-05;5.1343409722904e-05;-2.5363584427396e-05;0.00011530853953445;-1.2897567103209e-05;-0.00023787877580617;-5.0075013859896e-05;0.00026134814834222;-8.4976836660644e-06;2.2377620553016e-05;-4.3501440813998e-06;2.0655559637817e-05;-9.3144182756077e-05;1.3448444406094e-05;-7.0423258875962e-05;2.5678275051177e-05;6.5608277509455e-05;5.0219801778439e-05;0.00011424572585383;2.3499760573031e-05;-0.0002040320832748;5.1948227337562e-06;0.00034827797207981;3.4592532756506e-05;-0.00044074587640353;1.2258868082426e-05;4.8531015636399e-05;-0.00010529999417486;-0.00012675144535024;-0.00012557121226564;-3.305530117359e-05;-5.0486138206907e-05;-0.00029253808315843;2.453445631545e-05;8.6101972556207e-05;-1.5496152627748e-05;3.9763639506418e-05;-0.00012299447553232;0.00027142345788889;-4.6588047553087e-05;0.00025356488185935;-1.7502716218587e-05;-0.00035776893491857;-6.2841558246873e-05;0.00021974604169372;0.0001126419956563;0.00013993318134453;0.00032473521423526;0.00010013648716267;1.8852839275496e-05;9.7909753094427e-05;1.5484109098907e-05;4.4180549593875e-05;-0.00011136459215777;6.4706226112321e-05;-0.00040624602115713;7.0430563937407e-05;-7.2516231739428e-05;1.1724295063686e-06;0.0006545947981067;-0.00038744395715185;0.0010690084891394;-8.5943771409802e-05;0.00071148504503071;7.004776125541e-05;-0.00012559916649479;-9.5721865363885e-05;0.0001844359212555;-3.7230438465485e-05;0.0019022230990231;-3.712335092132e-05;-8.3192448073532e-05;-0.00027805709396489;9.037403651746e-05;-0.00015245297981892;0.00027112354291603;-0.00033635483123362;0.00036272700526752;-0.00069642864400521;0.0001322292664554;-0.001565745449625;0.00012141123443143;-0.0010390810202807;4.2080129787792e-05;-0.00044930959120393;-2.9093425837345e-06;-0.00023823317314964;7.1226595537155e-06;-2.4883032892831e-05;1.5513282960455e-06;0.00010279753769282;-8.5210223915055e-05;-3.488535003271e-05;2.7685697205015e-05;8.1397665780969e-05;-4.0904102206696e-05;0.00017982030112762;-1.9867435185006e-05;-0.00035788817331195;-7.6003889262211e-05;0.00040130683919415;-1.1585159882088e-05;2.392595706624e-05;-4.4543453441293e-06;3.1360003049485e-05;-0.00014492779155262;2.0164738089079e-05;-0.00010901457426371;4.2686548113124e-05;9.756007057149e-05;7.7959222835489e-05;0.00017020074301399;3.4515476727393e-05;-0.00031012861290947;7.995891792234e-06;0.00051993643864989;5.2053674153285e-05;-0.00066028808942065;1.7989124899032e-05;7.3605784564279e-05;-0.00015835619706195;-0.00019218656234443;-0.00018791142792907;-6.1827362515032e-05;-7.564015686512e-05;-0.000448971579317;3.5399436455918e-05;0.00013335373660084;-2.3279812012333e-05;5.5980937759159e-05;-0.00018602116324473;0.00039775099139661;-6.9765046646353e-05;0.00037681520916522;-2.5437931981287e-05;-0.00053775584092364;-9.2932357802056e-05;0.0003292289620731;0.00017125476733781;0.00020837609190494;0.00049353600479662;0.00015102836186998;3.6690824344987e-05;0.00014746707165614;4.1253282688558e-05;6.6755957959685e-05;-0.00016224783030339;9.7722542705014e-05;-0.000611875904724;9.0364679635968e-05;-8.5938649135642e-05;1.3169678823033e-05;0.00090667145559564;-0.00053025974193588;0.0014718377497047;-0.00012099104787922;0.00099501933436841;8.9666136773303e-05;-0.00016034253349062;-0.00013108913844917;0.00026824921951629;-5.8906247431878e-05;0.0025450496468693;-4.7286237531807e-05;-0.00017516217485536;-0.00040737638482824;0.0001296797854593;-0.00020538610988297;0.00037116554449312;-0.00043765376904048;0.00049655756447464;-0.00098180572967976;0.00018014865054283;-0.0021591444965452;0.00016979286738206;-0.0013856583973393;6.3637722632848e-05;-0.00064519979059696;-3.8198277252377e-06;-0.00025498989271;-1.9774997781496e-06;-8.0191084634862e-06;-8.5148144535196e-07;0.00020749075338244;-0.00013569030852523;-2.5696408556541e-05;4.4944015826331e-05;0.00011082082346547;-5.1137983973604e-05;0.00024292134912685;-1.8514996554586e-05;-0.00061630125856027;-0.00010238985851174;0.00059988931752741;-2.463363125571e-05;9.3107315478846e-05;-2.8386461053742e-05;3.5667508200277e-05;-0.00022621656535193;6.1737926444039e-05;-0.00019747127953451;6.8983914388809e-05;0.00016526844410691;0.00010401228064438;0.00023090864124242;5.3591436881106e-05;-0.0004774181288667;6.5663057284837e-06;0.00077674799831584;7.5095682404935e-05;-0.00096304871840402;2.634282282088e-05;8.5975945694372e-05;-0.00021594652207568;-0.00018872364307754;-0.00026530065224506;1.9472012354527e-05;-0.00010968366404995;-0.00061817921232432;5.1675611757673e-05;0.0001720587752061;-3.2801803172333e-05;7.7289347245824e-05;-0.00025798953720368;0.00061607867246494;-9.9770666565746e-05;0.00057313079014421;-4.115995761822e-05;-0.00070810224860907;-0.00010586312419036;0.00045695973676629;0.00017557296087034;0.0002727571700234;0.0006434932583943;0.00020939183013979;-8.8597516878508e-05;0.00021274563914631;-2.4884064259822e-05;9.0700334112626e-05;-0.00017212951206602;0.00013544471585192;-0.00088995753321797;7.927804836072e-05;-6.9641471782234e-05;7.5440289037942e-06;0.00083110900595784;-0.00049516942817718;0.0013317633420229;-0.00010877790191444;0.00088426505681127;7.1671973273624e-05;-0.00011305896623526;-0.00012181770580355;0.00023106962908059;-7.1609698352404e-05;0.0022836881689727;-4.357310172054e-05;-0.00015792775957379;-0.00038212785148062;9.0132743935101e-05;-0.00020725339709315;0.00035371968988329;-0.00038684462197125;0.00046465438208543;-0.00085194973507896;0.00017863040557131;-0.0019549443386495;0.00016237846284639;-0.0012549847597256;6.440238939831e-05;-0.00056658661924303;4.5669207793253e-06;-0.00025260707479902;-6.9467569119297e-06;3.8396583477152e-06;-1.020139643515e-05;0.00017399081843905;-0.00011890019231942;-2.4617795133963e-05;4.4945703848498e-05;8.8003202108666e-05;-4.1838287870632e-05;0.00020439628860913;-9.7214579000138e-06;-0.00057939009275287;-8.6230713350233e-05;0.00051181722665206;-2.447590486554e-05;0.00013310091162566;-1.062299907062e-05;2.2067315512686e-05;-0.0002113769587595;5.9911679272773e-05;-0.00019138396601193;6.2969629652798e-05;0.0001748633076204;8.997065742733e-05;0.00024433419457637;4.4459131459007e-05;-0.00044983284897171;1.6734338714741e-06;0.00069620390422642;6.6536631493364e-05;-0.0008575443062;2.1114134142408e-05;7.3723065725062e-05;-0.0001844681246439;-0.00016607978614047;-0.00022313893714454;1.4483768609352e-05;-9.3766218924429e-05;-0.00053746916819364;3.7278041418176e-05;0.00015720502415206;-2.8459207896958e-05;7.7029886597302e-05;-0.00022323892335407;0.00053271953947842;-8.1710400991142e-05;0.00047365931095555;-2.8654709240072e-05;-0.00059926300309598;-8.3560553321149e-05;0.00038160881376825;0.00015282240929082;0.00022790259390604;0.00054968491895124;0.00018118036678061;-9.071111708181e-05;0.00018112076213583;-1.4760275007575e-05;7.9101751907729e-05;-0.00015378015814349;0.00011497794184834;-0.00074655172647908;4.4357962906361e-05;-4.1098202927969e-05;-0.00077489763498306;1.748877002683e-05;-0.0013334356481209;0.00035933495382778;-0.00065299036214128;6.7584762291517e-05;4.0051025280263e-05;-4.0658149373485e-05;-2.0792507712031e-05;5.9096597397001e-05;-0.0021371431648731;4.2873729398707e-05;-2.8784445021302e-05;3.0381599572138e-05;0.00024460212443955;-5.6215787481051e-05;0.00021266579278745;0.00047151223407127;-0.00027230122941546;0.00060981675051153;-0.00038172051426955;0.00178616004996;-0.00011881300451932;0.0012898804852739;-0.00010170569294132;0.00027945550391451;-2.8841308449046e-05;0.00044370192335919;-9.5668201538501e-06;-5.4342301154975e-05;1.3207191841502e-05;-1.353831612505e-05;-5.0082202506019e-05;-4.9485330237076e-05;-3.526780710672e-05;3.3875923691085e-05;3.579555414035e-05;5.5604297813261e-05;2.4767445211182e-05;-0.00040222427924164;-3.0950409382058e-06;0.0002432434266666;-3.9726135582896e-05;0.00035167139139958;-4.3364780140109e-05;0.00014207178901415;2.7448231776361e-05;-0.00015473774692509;-0.00021215667948127;-1.0285652933817e-05;0.00021418981486931;4.9757622946345e-06;0.00040696235373616;5.7665904023452e-05;-0.00046802332508378;2.3031267119222e-05;0.00065460824407637;-1.5244257156155e-05;-0.00079029792686924;5.2753151976503e-05;7.6896212704014e-05;1.8427836039336e-05;-0.00036548200296238;-0.00013663094432559;-5.3404422942549e-05;-0.00017765715892892;-0.00023925070127007;-0.000120403492474;9.2016896815039e-05;5.6034972658381e-05;0.00025223047123291;-2.825438605214e-05;0.00049529189709574;-0.00017944767023437;0.00023711266112514;-6.676039629383e-05;3.1646970455768e-05;-0.00049515173304826;-0.0001103662798414;0.00025731747155078;0.00023051118478179;0.00033775286283344;0.00028207639115863;7.1773181844037e-05;0.00014287230442278;-9.5202492957469e-05;0.00014813341840636;-0.00043782635475509;6.9214678660501e-05;-0.0003879293508362;9.4458009698428e-05;8.6459738668054e-05;-5.7516215747455e-05;-0.00085478095570579;4.3083236960229e-05;-0.0015471578808501;0.00039294347516261;-0.00079917738912627;5.1245177019155e-05;8.1845217209775e-05;-5.6991895689862e-05;4.23347519245e-05;6.246444536373e-05;-0.0023988417815417;1.6330277503585e-05;-0.00011985481251031;3.4720396797638e-05;0.00018900237046182;-0.00012334604980424;0.00027554720873013;0.00064669694984332;-0.0002700813638512;0.00069733522832394;-0.00042227579979226;0.0019077487522736;-0.00013374563422985;0.0015828522155061;-8.7261512817349e-05;0.0002022338740062;-1.204631098517e-05;0.00057211559033021;-1.8812194184648e-06;-0.00015178286412265;4.7764409828233e-05;-3.9985752664506e-05;-6.4620340708643e-05;-9.590903937351e-05;-4.3056156755483e-06;-6.969320384087e-05;3.081604882027e-05;4.6740031393711e-05;3.5066630516667e-05;-0.00020806370594073;-1.9540149878594e-05;0.00016100326320156;-4.1541497921571e-05;0.0004619836108759;-4.6173696318874e-05;0.0001906099205371;1.4993936929386e-05;-0.00011129456834169;-0.00019375198462512;-3.784151704167e-05;0.00028017503791489;-4.0220704249805e-05;0.0003348809259478;6.835214298917e-05;-0.00040719972457737;1.9951316062361e-05;0.00073465559398755;-1.6002522897907e-05;-0.00093618832761422;5.7122313592117e-05;8.8348497229163e-05;3.4999542549485e-05;-0.00052031176164746;-0.00017646557535045;-5.7915240176953e-05;-0.00025303760776296;-0.00014823491801508;-0.0001516124320915;8.0086269008461e-05;8.7021442595869e-05;0.00041579044773243;-4.8824309487827e-05;0.0007101385272108;-0.00022604620608035;0.00027056387625635;-8.7883192463778e-05;4.3089956307085e-05;-0.00064516154816374;-0.00020710722310469;0.00036839302629232;0.00028809328796342;0.00039605845813639;0.00041940991650335;0.00011949231702602;0.00019782857270911;-0.00029737100703642;0.00018630013801157;-0.00071633834159002;9.3699607532471e-05;-0.00037873128894717;0.00011572676157812;8.0592180893291e-05;-4.8790359869599e-05;-0.00061472173547372;4.7204906877596e-05;-0.0011514615034685;0.00029133577481844;-0.00061462330631912;2.7050095013692e-05;6.958088488318e-05;-4.4849472033093e-05;5.4845797421876e-05;4.5826298446627e-05;-0.001830572495237;6.4739123217805e-07;-0.00012653360317927;2.5590454242774e-05;9.4899078249e-05;-0.00010764668695629;0.00022681037080474;0.00052486825734377;-0.00018625479424372;0.00050608086166903;-0.0003177092585247;0.0013749891659245;-0.00010416546138003;0.0012392358621582;-5.3598581871483e-05;0.00011647689098027;-8.5397101656781e-07;0.00047416388406418;1.5830499933145e-06;-0.00015265685215127;5.0314709369559e-05;-8.0931888078339e-05;-5.2583880460588e-05;-0.00010421949264128;1.3905805644754e-05;-7.4811578087974e-05;1.9120414435747e-05;2.5869941964629e-05;2.8594044124475e-05;-2.6323319616495e-05;-2.2805401385995e-05;5.7332683354616e-05;-3.0966835765867e-05;0.00035551722976379;-3.1181716622086e-05;0.00017028269940056;1.1788584743044e-05;-5.9520778449951e-05;-0.00011507183808135;-5.2174033044139e-05;0.00021349957387429;-4.7183024435071e-05;0.00024860043777153;5.5336407967843e-05;-0.00026644152239896;1.0323362403142e-05;0.00052024686010554;-9.9545532066259e-06;-0.00069466658169404;4.0760503907222e-05;7.8496617788915e-05;2.7839048925671e-05;-0.00046167633263394;-0.0001394028076902;-9.2856513219886e-05;-0.00020010444859508;-8.1993101048283e-05;-0.00011708225792972;5.6728993513389e-05;7.0559544838034e-05;0.00032955425558612;-3.9053575164871e-05;0.0005251788534224;-0.00017495283100288;0.00018290513253305;-6.7660010245163e-05;3.9215217839228e-05;-0.0005147255724296;-0.00017992708308157;0.0003164334630128;0.00022216231445782;0.00031173264142126;0.00034337068791501;0.00020401403889991;0.00015555453137495;-0.00023898351355456;0.00014193764945958;-0.00061995344003662;7.4612711614463e-05;-0.00024053253582679;8.8608343503438e-05;4.3667296267813e-05;-1.8165730580222e-05;0.00012983013584744;5.4775682656327e-05;-2.9642926619999e-06;2.7438902179711e-05;-0.00010510701395106;-3.2558120437898e-05;3.4942313504871e-06;1.6143083485076e-05;2.5988476409111e-05;2.9571115192084e-06;-0.00030975494883023;-3.929621016141e-05;-2.0736781152664e-05;-1.7335238226224e-05;-0.00017340161139145;-7.9431585618295e-05;7.0531794335693e-05;0.00016338011482731;5.25820760231e-05;3.4415654226905e-05;-4.686040483648e-05;-0.00016085994138848;-2.7487922125147e-05;0.00019454686844256;3.9686987292953e-05;3.081858085352e-05;2.2412514226744e-05;0.00010000872862292;2.12815557461e-05;-7.8067707363516e-05;2.8684096832876e-05;-0.00016844236233737;1.2023594536004e-05;-0.00015162050840445;3.6867710150545e-05;2.6069455998368e-05;-1.0090015166497e-05;-5.6955279433168e-05;2.1125644707354e-05;0.00023169645282906;-1.8039103451883e-05;-0.00016186367429327;-8.4708208305528e-06;7.6726122642867e-05;-7.448094834217e-07;4.9436654080637e-05;4.4466811232269e-05;5.8904101024382e-05;7.5877127528656e-05;-6.0327893152134e-05;-2.0392011720105e-05;-6.6514818172436e-05;0.00026317455922253;1.8541707049735e-06;-6.2269551563077e-05;3.1509175641986e-06;-1.7830634533311e-05;9.3435892267735e-06;-5.756118480349e-05;-2.106374381583e-07;7.5157979154028e-05;-4.5973206397321e-06;-0.00018221198115498;-2.4504037355655e-05;2.8265124001337e-06;-4.4174961658427e-05;1.0171466783504e-05;-3.4610930015333e-05;-1.0282486073265e-05;2.6336070732214e-05;-0.00010860023758141;7.8397633842542e-06;-9.2912290710956e-05;-1.4129207556834e-05;5.8712603276945e-06;-1.1021168575098e-05;-2.1101786842337e-05;-0.00011932502820855;-1.9948181943619e-05;4.83837138745e-05;8.9797089458443e-05;-1.1813011951745e-05;8.8377899373882e-05;0.0004578240623232;2.1832138941136e-07;-1.933772546181e-05;2.1347832444008e-05;-0.00017645441403147;7.5827206273971e-06;4.3894120608456e-05;9.3959679361433e-06;7.1344642492477e-05;-0.0001045666722348;-4.0483755583409e-05;0.00048954348312691;-0.0003122178313788;0.00087968062143773;-2.9830818675691e-05;0.00062767596682534;5.2913841500413e-05;-9.0594978246372e-05;-7.8860983194318e-05;4.4177068048157e-05;-7.6205024015508e-06;0.0015010159695521;-3.0211902412702e-05;7.5181509600952e-05;-0.00010558173380559;0.00010155561903957;-0.00022296787938103;0.00017759299953468;-0.00039673486026004;0.00031799619318917;-0.00049207039410248;0.00013279616541695;-0.0010881331982091;6.2037936004344e-05;-0.0010132333263755;1.0364945410402e-05;-0.00015583464119118;1.3840806332155e-06;-0.00037631744635291;3.9814483898226e-05;-0.00011365603131708;-1.6634605344734e-05;-6.0104048316134e-05;1.6110887372633e-05;-0.00010139726509806;3.4478257475712e-06;-0.00012485556362662;-4.7660446398368e-06;7.0561167376582e-05;-2.036119622062e-05;4.0855775296222e-05;-4.3876301788259e-05;2.4589888198534e-05;-1.2503048310464e-05;0.00022251377231441;8.4489336586557e-05;-1.3397992915998e-05;-2.2771423573431e-06;-4.3360269046389e-05;-9.7271367849316e-06;-4.5683478674619e-05;0.00015918092685752;4.214320142637e-05;0.00013497106556315;1.4829335668765e-05;-0.00011444395204308;-1.5081194533195e-06;0.0003699213557411;3.7220728700049e-05;-0.00053209759062156;3.0668470571982e-05;6.3845014665276e-05;-0.00014559617557097;-0.000327169400407;-0.00019587756833062;-6.3954990764614e-05;-6.8324741732795e-05;-0.00011992936924798;3.6288787669037e-05;7.7143653470557e-05;-4.369304588181e-05;0.00023748507373966;-0.00016391681856476;0.00042202670010738;-4.9936701543629e-05;0.00015887520567048;1.1138200534333e-05;-0.00045968202175573;-0.00016066781245172;0.00024243915686384;0.00024147715885192;0.00027113882242702;0.0003111217811238;0.00016721387510188;0.0001333998516202;0.00011740329500753;-0.00016135450277943;7.2314411227126e-05;-0.00048172302194871;7.2664479375817e-05;-0.00022481777705252;7.5864649261348e-05;-9.2998074251227e-05;-3.346691664774e-05;0.00065075512975454;-0.00040769358747639;0.0011044925777242;-5.3876003221376e-05;0.00076270243152976;6.0660644521704e-05;-9.1810536105186e-05;-9.7872769401874e-05;7.0229878474493e-05;-3.8821483030915e-05;0.0018627804238349;-4.0069062379189e-05;2.9703860491281e-05;-0.00020686672360171;9.234683966497e-05;-0.00025911375996657;0.00026192396762781;-0.00043614677269943;0.0004013839061372;-0.0006206231773831;0.00016744816093706;-0.0014361344510689;0.00010447295062477;-0.0012038571294397;3.0225191949285e-05;-0.0002632629184518;8.7807420641184e-06;-0.00040115785668604;2.7097830752609e-05;-8.5021092672832e-05;-2.4015753297135e-05;-2.0257764845155e-05;-6.2792446442472e-06;-0.00012347140000202;2.0268966181902e-05;-0.00010372795077274;-8.8115029939217e-06;9.8738200904336e-05;-1.2535984751594e-05;-0.00016209718887694;-5.223361949902e-05;0.00011158271809109;-2.0459168808884e-05;0.00026438097120263;8.4349398093764e-05;-1.498585788795e-05;-6.1440063291229e-05;-2.2231806724449e-05;-6.3639861764386e-05;-3.0625178624177e-05;0.0002197429566877;5.2161176427035e-05;0.00024009590561036;1.9129633074044e-05;-0.00021094352996442;-5.918469014432e-06;0.00051547191105783;4.8238980525639e-05;-0.00067256321199238;2.8585287509486e-05;7.2032707976177e-05;-0.00016602105461061;-0.00032545597059652;-0.00021509529324248;-4.3436470150482e-05;-8.0163452366833e-05;-0.0002165113837691;3.5841443605023e-05;0.00010407701483928;-4.3752534111263e-05;0.00023436328046955;-0.00019260209228378;0.00049489439697936;-5.8529964007903e-05;0.00023295871505979;1.411746507074e-05;-0.00051916489610448;-0.00015394570073113;0.00028028362430632;0.00024233599833678;0.00028229528106749;0.00038073683390394;0.00018649887351785;6.8778419517912e-05;0.0001406006194884;-0.0001511420996394;8.0870064266492e-05;-0.00045020729885437;8.7097483628895e-05;-0.00035033925087191;6.6920802055392e-05;-6.4554791606497e-05;-2.3577933461638e-05;0.00071639521047473;-0.00044405099470168;0.0011449793819338;-6.4641120843589e-05;0.00076603557681665;5.1978655392304e-05;-6.1492915847339e-05;-0.00010116385965375;5.9158472140552e-05;-6.6197724663652e-05;0.0019466878147796;-4.236143649905e-05;-1.1006690328941e-05;-0.00027450689231046;6.4262603700627e-05;-0.00026677275309339;0.00030961103038862;-0.00041584216523916;0.00042588158976287;-0.0006297537474893;0.00017978383402806;-0.0015449029160663;0.0001293387322221;-0.0012108584633097;4.4830285332864e-05;-0.00030382609111257;1.6737552869017e-05;-0.00039709103293717;6.64869639877e-06;-3.8635251257801e-05;-3.0722796509508e-05;-8.6350919445977e-06;-1.6927362594288e-05;-0.00013716096873395;3.3044972951757e-05;-7.6642165367957e-05;-4.7013477342261e-06;9.4335373432841e-05;3.8478483475046e-06;-0.00034235263592564;-4.9819969717646e-05;0.00014247356739361;-2.8181546440464e-05;0.00030488692573272;8.8097789557651e-05;-1.4753491996089e-05;-0.00010153483890463;-4.3456034291012e-06;-0.00010780843877001;-2.2069749320508e-05;0.00025680317776278;4.7113437176449e-05;0.00036346705746837;2.0231183953001e-05;-0.00029093376360834;-1.2640944987652e-05;0.00058489554794505;5.2115836297162e-05;-0.00071009539533406;2.1991207177052e-05;6.8724009906873e-05;-0.00016012783453334;-0.00029484918923117;-0.0001953377504833;-5.5623595471843e-06;-7.8848526754882e-05;-0.00026028888532892;2.412726644252e-05;0.00011814231402241;-3.7254616472637e-05;0.00021510857914109;-0.00018762485706247;0.00046553567517549;-5.185878399061e-05;0.00023004176910035;2.7186099032406e-05;-0.00047955597983673;-0.0001186865119962;0.00025868674856611;0.00020394692546688;0.00024968889192678;0.00035717387800105;0.00017650790687185;9.7238571470371e-06;0.00013504030357581;-0.00010205611033598;7.6413940405473e-05;-0.00037801987491548;8.396701014135e-05;-0.00037193510797806;9.9168209999334e-05;-5.3957886848366e-05;-0.00043931274558417;9.3336551799439e-05;-0.00091060710838065;0.00025070933043025;-0.00057624059263617;-1.9447752492852e-05;5.6450684496667e-05;-4.2990708607249e-05;0.00018171691044699;3.6066885513719e-05;-0.0016629169695079;-1.7065516658477e-05;-0.00023994928051252;2.8321701392997e-05;-6.060249870643e-05;-0.00010103830572916;0.00030983402393758;0.00055117369629443;-0.00012064517795807;0.00030362550751306;-0.00029816929600202;0.00094835367053747;-0.00011548507609405;0.0012576360022649;-1.6719190170988e-05;-5.728930409532e-05;2.0324327124399e-05;0.00059876596787944;-3.0460530524579e-06;-0.00026421112124808;9.3249334895518e-05;-0.0002815350308083;-7.8385237429757e-05;-0.00024451030185446;8.2565544289537e-05;-0.00017918001685757;1.1136015018565e-05;-2.7066716938862e-05;4.0882001485443e-05;0.0004006260423921;-4.0790782804834e-05;-0.00025309884222224;-1.7210943042301e-05;0.00040585972601548;-2.0909408704028e-05;0.0002792701125145;-3.3941212222999e-06;2.0288272935431e-05;-1.0492050932953e-05;-0.0001311551022809;0.00026243619504385;-0.00010646682494553;0.00029315598658286;5.9881840570597e-05;-8.8212655100506e-05;-1.3434422726277e-05;0.00034729301114567;-9.4458009698428e-06;-0.00055517262080684;2.8027927328367e-05;0.00011310022819089;2.3597594918101e-05;-0.00067593588028103;-0.00013998153735884;-0.0002876267535612;-0.00019342380983289;6.3243227486964e-05;-0.00010133522300748;3.8441972719738e-05;6.6927408624906e-05;0.00035444911918603;-4.1361792682437e-05;0.00038535546627827;-0.00016629550373182;3.3342279493809e-05;-5.6561784731457e-05;8.7390624685213e-05;-0.00050147192087024;-0.00023722456535324;0.00040730493492447;0.00017102161655203;0.00029815812013112;0.00037443180917762;0.00060965737793595;0.00015968590741977;-0.00025766802718863;0.00012049422366545;-0.00083051127148792;7.8998818935361e-05;2.7130838134326e-05;7.6666437962558e-05;9.2517038865481e-05;-4.9041020247387e-05;-0.00033393205376342;8.8281674834434e-05;-0.00075457012280822;0.00021279219072312;-0.0005012818146497;-2.2010888642399e-05;4.7656223614467e-05;-3.2643623853801e-05;0.00014245382044464;3.1240724638337e-05;-0.0014436080818996;-2.1536667190958e-05;-0.00019825820345432;1.9742194126593e-05;-8.5372994362842e-05;-9.7635507700033e-05;0.00027149796369486;0.00048340499051847;-8.79435101524e-05;0.00025910238036886;-0.00025812911917455;0.00076167727820575;-0.00010189110616921;0.0010813898406923;-5.7022070905077e-06;-3.0387040169444e-05;2.0729239622597e-05;0.00050970783922821;1.7506047242932e-06;-0.00023153203073889;8.1599871919025e-05;-0.00026700503076427;-6.1526145145763e-05;-0.0002377061318839;7.428637763951e-05;-0.00013797495921608;8.2226606537006e-06;-3.1788258638699e-05;3.7459602026502e-05;0.00037567963590845;-3.6891680792905e-05;-0.00023646313638892;-1.58457296493e-05;0.00034541133209132;-1.7432621461921e-05;0.00023932706972118;4.7239955165423e-06;2.3301736291614e-05;8.8688584582997e-06;-0.00012014166713925;0.00021552109683398;-9.8341035482008e-05;0.00029580850969069;4.9728110752767e-05;-8.575899846619e-05;-1.0761003977677e-05;0.00028115880559199;-5.9979438447044e-06;-0.00046916754217818;2.3236227207235e-05;0.0001106209892896;1.7400388969691e-05;-0.00059377064462751;-0.00011935706424993;-0.00025597977219149;-0.00016579579096287;4.5534277887782e-05;-8.9481822215021e-05;3.0414781576837e-05;6.0404898249544e-05;0.00025763508165255;-3.1219322409015e-05;0.00029041693778709;-0.00013959294301458;3.283917249064e-05;-4.9385922466172e-05;6.6367741965223e-05;-0.00043749119504355;-0.00019797489221673;0.00034778274130076;0.00015919034194667;0.00025390548398718;0.0003214149037376;0.00061395869124681;0.00012963726476301;-0.0002069393376587;0.00010363665205659;-0.00071189348818734;6.607522664126e-05;2.6157642423641e-05;6.5488980908412e-05;7.1685870352667e-05;-3.2779920729809e-05;-8.4843202785123e-05;6.1418817494996e-05;-0.00033252831781283;9.6162533736788e-05;-0.00025622095563449;-2.3600599888596e-05;2.6794368750416e-05;-9.9794515335816e-06;4.3520198232727e-05;1.612593223399e-05;-0.00069517467636615;-2.8822623789893e-05;-0.00010464317892911;1.6945677998592e-06;-0.00011593234376051;-7.7140881330706e-05;0.00014360307250172;0.0002764290838968;-8.5458550529438e-06;0.00012451526708901;-0.0001256704563275;0.00025937121245079;-5.4508691391675e-05;0.00053925724932924;1.7221851521754e-05;-1.0490121894691e-05;2.0024368495797e-05;0.00025303461006843;1.0022217793448e-05;-0.00013898377073929;4.8716650780989e-05;-0.00016766095359344;-2.0652390958276e-05;-0.00014855583140161;4.8623496695654e-05;-6.5398438891862e-05;-2.2331294076139e-06;-3.4003693144768e-05;2.2011367036612e-05;0.00030665114172734;-2.395285446255e-05;-0.0001674377854215;-8.6661002569599e-06;0.00017247661889996;-5.4622009884042e-06;0.00011621534940787;1.4236346942198e-05;4.2654290155042e-05;4.0758597606327e-05;-7.3321942181792e-05;8.197539136745e-05;-7.0502450398635e-05;0.00015666984836571;2.0543888240354e-05;-2.8170561563456e-05;-4.6035474952077e-06;8.9069013483822e-05;1.4200883242665e-06;-0.00021054822718725;8.1317839430994e-06;7.060346979415e-05;8.7822763816803e-06;-0.00031768073677085;-5.8436937251827e-05;-0.000134738147608;-8.9989676780533e-05;4.2936302634189e-05;-4.7886027459754e-05;5.8338346207165e-06;3.7201585655566e-05;8.1137928646058e-05;-1.2838562724937e-05;0.00010760443547042;-6.3413099269383e-05;1.16600704132e-05;-2.5960369384848e-05;1.347753823211e-05;-0.00023591874924023;-0.00010607302829158;0.00018040106806438;0.00010214292706223;0.00011610017827479;0.00017593047232367;0.00043791337520815;5.6656568631297e-05;-0.00011845952394651;5.0747872592183e-05;-0.00039291137363762;3.1430339731742e-05;4.2811891034944e-05;3.0934093956603e-05;9.8470874945633e-05;-3.8009937270544e-05;0.00012814094952773;7.4673407652881e-05;-9.4817325589247e-05;3.6336594348541e-05;-0.00016378590953536;-4.0986447856994e-05;2.0634715838241e-05;8.3738968896796e-06;-3.7619192880811e-05;1.1412633284635e-05;-0.00037874662666582;-5.5418182455469e-05;-6.8017558078282e-05;-1.6848412997206e-05;-0.00022834559786133;-0.00010789521184051;0.00010222168202745;0.00023872508609202;7.1683331043459e-05;6.2475512095261e-05;-6.8124158133287e-05;-0.00010226015729131;-4.1464521927992e-05;0.00031638570362702;5.3130606829654e-05;1.3393823792285e-05;3.2244075555354e-05;0.00014838275092188;2.5653600459918e-05;-0.0001315940025961;4.5291300921235e-05;-0.00017390621360391;1.0054135600512e-05;-0.00014864577678964;5.0737660785671e-05;-2.2897833332536e-05;-1.4785618986934e-05;-5.6894728913903e-05;1.9897164747817e-05;0.00043311587069184;-2.592559576442e-05;-0.00019623989646789;-8.1102134572575e-06;0.00010094423487317;3.1117494927457e-06;6.1776321672369e-05;3.8117890653666e-05;8.8367065472994e-05;9.6445321105421e-05;-7.160992390709e-05;-1.0331284101994e-05;-8.6087580712046e-05;0.00012300540402066;3.8836419662402e-06;-9.8457451258582e-07;3.1305981451624e-07;-5.5493470426882e-05;1.0404428394395e-05;-8.0312500358559e-05;-1.6460380720673e-06;7.7118958870415e-05;5.3479866437556e-06;-0.00023225886980072;-3.3616368455114e-05;-9.1078378318343e-05;-7.1501490310766e-05;5.9196136135142e-05;-3.7599806091748e-05;-1.4773465409235e-05;3.7596957554342e-05;-6.4970110543072e-05;-1.4545402109434e-06;-2.5791387088248e-05;-2.6302435799153e-05;-1.2191305813758e-06;-1.9228751625633e-05;-3.653781459434e-05;-0.00017900459351949;-7.4099807534367e-05;0.00011526038724696;0.00011522647400852;4.4362001062836e-05;0.00013756078260485;0.00055609853006899;1.693479862297e-05;-9.1363210231066e-05;3.084666968789e-05;-0.00030980128212832;1.5839459592826e-05;8.3332393842284e-05;1.587991573615e-05;-5.2932878134015e-06;8.8940441855812e-06;3.2835963793332e-05;-1.4050831850909e-05;-2.7920668799197e-05;3.5286408092361e-05;-1.725140009512e-06;1.0280721653544e-05;3.4136962767661e-07;-3.0726224053979e-07;-2.0470446543186e-05;5.5678324315522e-06;6.876970292069e-05;-5.4658386943629e-05;2.0541908725136e-06;-3.2694915717002e-06;-1.1177623491676e-05;-1.2879171435998e-06;-5.1207280193921e-06;9.0834519141936e-06;-3.4375364066364e-06;4.5473920181394e-05;-4.7527395508951e-05;-3.8819449400762e-05;2.2666601580568e-05;-1.977599458769e-05;1.1842354979308e-05;-2.8206530259922e-05;3.1683342967881e-05;-2.3206528567243e-05;2.1475316316355e-05;1.9485974917188e-05;1.6692085409886e-05;9.2655564003508e-06;1.3091706932755e-05;-8.7751686805859e-08;6.2982549025037e-06;-3.3011422146956e-06;-1.0453678669364e-06;-1.2801734555978e-05;-1.8299475414096e-05;2.5015577193699e-05;8.4355169747141e-06;9.4736351456959e-06;9.7339143394493e-06;1.5647341570002e-05;2.3891483579064e-05;-5.2233946917113e-05;-4.4876910578751e-06;5.6276079703821e-05;4.7942088713171e-05;3.6803878174396e-05;-4.2027939343825e-05;-4.5347798732109e-05;-3.8783942727605e-05;-2.5975095923059e-05;1.6897326986509e-06;-6.7499299802876e-06;-9.2232348833932e-06;1.8013276985585e-06;-1.695227183518e-05;-2.4226834284491e-05;-1.0306874173693e-05;-8.2086144175264e-06;3.2546256989008e-05;2.8320255296421e-05;5.5006705224514e-05;4.8072903155116e-05;3.0122284442768e-05;2.0181407307973e-05;-2.6404092068333e-07;1.4958385463615e-06;3.0436685847235e-05;3.1105289963307e-05;6.7394008510746e-05;6.8018016463611e-05;7.8071198004181e-06;1.2181852980575e-05;-1.8856439055526e-05;-1.7724612916936e-05;-2.5025196009665e-05;2.399472577963e-06;4.7501393964922e-06;-9.8499649539008e-06;6.1542741605081e-06;-5.4908148740651e-05;-5.9873800637433e-05;-6.5049120166805e-05;-5.9352911193855e-05;-5.6312135711778e-05;-4.9343223508913e-05;-1.6238365105892e-06;-9.2935915745329e-06;-6.0676102293655e-06;8.6499831013498e-06;3.3167067158502e-05;-1.4036712855159e-05;-2.6673891625251e-05;3.6765646655113e-05;-1.2982737871425e-06;1.098949360312e-05;1.0483501711178e-07;-7.5857565207116e-07;-1.962351052498e-05;6.1873925005784e-06;6.9217094278429e-05;-5.4468819143949e-05;2.4361245323234e-06;-2.7894568574993e-06;-1.0249516890326e-05;3.5809483733829e-07;-4.7197554522427e-06;7.3658229666762e-06;-4.828642886423e-06;4.4558866648003e-05;-4.9075391871156e-05;-3.9269747503567e-05;2.2321621145238e-05;-2.0585881429724e-05;1.1027057553292e-05;-2.8356585971778e-05;3.1851111998549e-05;-2.3429678549292e-05;2.1231831851765e-05;1.9396165953367e-05;1.7106774976128e-05;9.4898277893662e-06;1.2802900528186e-05;-2.2567455459921e-07;6.2476201492245e-06;-3.4482793580537e-06;-1.0141114898943e-06;-1.2355633771222e-05;-1.8759301383398e-05;2.4004060833249e-05;9.0686999101308e-06;9.4684528448852e-06;9.8658611022984e-06;1.5263580280589e-05;2.438173032715e-05;-5.245835200185e-05;-4.6473073780362e-06;5.638660149998e-05;4.7653797082603e-05;3.7531870475505e-05;-4.177379378234e-05;-4.5594460971188e-05;-3.8157966628205e-05;-2.6433686798555e-05;1.8341478380535e-06;-6.8998424467281e-06;-9.1139036157983e-06;1.7284453406319e-06;-1.6554495232413e-05;-2.4793727789074e-05;-9.9627795862034e-06;-8.6808922787895e-06;3.2274176192004e-05;2.8925898732268e-05;5.3868719987804e-05;4.9620230129221e-05;2.955766285595e-05;2.0931227481924e-05;1.7375542782361e-08;1.225371079272e-06;2.9838274713256e-05;3.2023493986344e-05;6.6415210312698e-05;6.9455163611565e-05;7.5156435741519e-06;1.2478354619816e-05;-1.8781545804814e-05;-1.7642672901275e-05;-2.512841274438e-05;2.5739980173967e-06;4.2722554098873e-06;-9.0993644334958e-06;5.3245712479111e-06;-5.4408908908954e-05;-6.1017592088319e-05;-6.392905197572e-05;-6.0759226471419e-05;-5.5236883781618e-05;-5.0730366638163e-05;-1.5458502957699e-06;-9.3940725491848e-06;5.5747677834006e-05;-0.00012670975411311;-6.830340862507e-05;-9.7940122941509e-05;-6.3952538766898e-05;0.00016323848103639;3.4170385333709e-05;0.00026264807092957;9.1718402472907e-06;-4.2455831135157e-05;-3.6226658266969e-05;6.3451851019636e-05;6.4544023189228e-05;0.00046898922300898;9.1270485427231e-06;0.00010607218428049;0.00021935619588476;0.00011748292308766;-0.00014592407387681;-8.4285878983792e-05;-0.00023630696523469;0.00012729378067888;-0.00013503711670637;6.1183811340015e-05;1.1366162652848e-05;-5.6699616834521e-05;-0.00041689194040373;-3.3568139770068e-05;1.5901976439636e-05;-2.0569523258018e-05;-0.00022487406386063;5.1953054935439e-05;-0.00014479891979136;3.170509080519e-05;-0.00016880287148524;7.0800597313792e-05;-0.00012281455565244;-3.8434685848188e-05;-0.00011852414172608;1.5793259080965e-05;-4.0987641114043e-05;-2.1623984139296e-05;0.00051824777619913;-1.5625626474502e-05;-0.0002494880463928;1.3142312127457e-06;0.00012391894415487;3.8474674511235e-05;2.0561248675222e-05;0.00015425366291311;-8.5878185927868e-05;0.00014593520609196;-0.0001033096559695;-1.9057288227486e-05;-1.5135037756409e-05;2.3077422156348e-05;1.3618607226817e-05;7.964699761942e-05;5.71133386984e-06;-6.3092986238189e-05;6.303246209427e-06;-9.3741713499185e-05;1.9132185116177e-05;6.5502783400007e-05;-5.9721092839027e-05;-0.00024378248781431;-0.00010860738984775;-8.3351987996139e-05;-2.6327219529776e-05;8.2771213783417e-05;3.4273511118954e-05;-6.4920081968012e-06;-1.7887115973281e-05;3.114212086075e-05;-4.9029506044462e-05;4.2425352148712e-05;-2.4975037376862e-05;-2.4103197574732e-05;-4.2088242480531e-05;-0.0002303062210558;-0.00011200225708308;0.00015547522343695;0.00014622465823777;0.00016535147733521;7.4888324888889e-05;5.5854870879557e-05;0.00048187578795478;4.0920371247921e-05;-0.00012534741836134;2.7571322789299e-05;-0.00041706100455485;2.3850423531258e-05;0.00012382258137222;6.3475636125077e-05;-0.00013179244706407;-7.789529627189e-05;2.3539905669168e-05;-0.00012104212510167;0.00031584929092787;3.2187777833315e-05;0.00036139512667432;1.9507149772835e-05;-5.1246603106847e-05;-4.5599179429701e-05;1.1349693522789e-05;5.3454998123925e-05;0.0007445263909176;-8.8931471964315e-07;0.0001463598018745;0.0001846682280302;0.00011770487617468;-0.00019766420882661;-3.6165554774925e-05;-0.00030622957274318;0.00017960781406146;-0.00018304532568436;8.7119369709399e-05;-0.00019123058882542;-3.9979298890103e-05;-0.00061733514303342;-3.0483202863252e-05;3.8139100070111e-05;-1.354996493319e-05;-0.00033473732764833;6.4306383137591e-05;-0.00017481119721197;1.1351012290106e-05;-0.00021679003839381;8.6344043666031e-05;-0.00014811406435911;-3.5358141758479e-05;-0.00016887868696358;1.7514759747428e-05;-3.1952233257471e-05;-2.7528492864803e-05;0.00052937725558877;-1.9491986677167e-05;-0.00028357192059048;-4.1016420482265e-07;0.00019029570103157;9.2459551524371e-05;2.4185592337744e-06;0.00015047613123897;-0.00010784662299557;0.00014411607116926;-0.00010999912774423;4.1340714233229e-05;-7.2795285177563e-07;7.1027796366252e-05;7.4248550845368e-06;7.5684962212108e-05;3.4887846140919e-06;1.4866462151986e-05;1.2169369256299e-05;-0.00018918176647276;2.338052399864e-05;7.6048869232181e-05;-9.0433110017329e-05;-0.00035336811561137;-0.00014009985898156;-0.00011020249075955;-3.9404243580066e-05;9.1842281108256e-05;3.6299428757047e-05;9.1922011051793e-06;-2.8979024136788e-05;0.00013357121497393;-8.4421495557763e-05;0.00013122329255566;-2.8955946618225e-05;-3.0837170925224e-05;-6.4962332544383e-06;-0.00030098206480034;-0.00014892424223945;0.0001663243456278;0.00021069313515909;0.00022265381994657;0.00011704633652698;9.7475967777427e-05;0.00048594467807561;5.938196045463e-05;-0.00015842172433622;4.4918848288944e-05;-0.00054496043594554;3.5181568819098e-05;0.00012530767708085;9.2031914391555e-05;-0.00017116114031523;-9.1206376964692e-05;0.00032178760739043;-0.00025434646522626;0.00073365971911699;1.8890852516051e-05;0.00060036039212719;4.881954373559e-05;-8.7392210843973e-05;-7.6536831329577e-05;-1.9475181034068e-05;3.5050663427683e-05;0.0013301796279848;-2.381674858043e-05;0.00022698740940541;8.9978522737511e-05;0.00013155104534235;-0.0002941521233879;7.4669544119388e-05;-0.00047494593309239;0.00029974835342728;-0.00034865975612774;0.00014369448763318;-0.00073081930167973;-9.0036294864149e-08;-0.0010666092857718;-2.2642494514002e-05;5.3134412155487e-05;-1.9955764400947e-06;-0.00053669465705752;8.7013722804841e-05;-0.00023532797058579;-2.3534215870313e-05;-0.00023135787341744;0.0001007707323879;-0.00014605831529479;-2.760648203548e-05;-0.00028293571085669;1.3745648175245e-05;6.0002635109413e-06;-3.8578455132665e-05;0.00054988375632092;-3.0591680115322e-05;-0.00028199606458656;-4.3712684600905e-06;0.00031799601856619;0.00016535847680643;-3.2056897907751e-05;0.00013984488032293;-0.00012346847506706;0.00010769727668958;-0.00012095904821763;0.00015744342817925;2.7690852220985e-05;3.9393846236635e-05;1.430839574823e-06;7.2744194767438e-05;-8.1215716818406e-07;0.00018855040252674;2.6299596356694e-05;-0.00042220929753967;4.3850814108737e-05;7.9864366853144e-05;-0.00015369337052107;-0.00050861429190263;-0.00022808907669969;-0.00016809806402307;-6.6490785684437e-05;0.0001136076025432;4.5341799705056e-05;4.3094711145386e-05;-6.2745915784035e-05;0.0003576896560844;-0.00016421989130322;0.00040922258631326;-4.3855368858203e-05;-1.2816263733839e-05;2.6963272830471e-05;-0.00047707214253023;-0.00024692551232874;0.00022239114332478;0.00035212887451053;0.00035734623088501;0.00024168987874873;0.00019459296891;0.00040041073225439;0.00010701304563554;-0.0002768580452539;8.4876570326742e-05;-0.00081303023034707;6.3380815845449e-05;7.9043893492781e-05;8.5765845142305e-05;-0.00014127344184089;-7.7051634434611e-05;0.00050063105300069;-0.00033166210050695;0.00091978604905307;-9.5536017852282e-07;0.00068330479552969;5.6107230193447e-05;-8.4160863480065e-05;-8.3917468145955e-05;-5.8973968407372e-05;2.0520974430838e-06;0.0015818417305127;-3.6957211705158e-05;0.00020979908003937;-2.9274066037033e-05;0.00011183661263203;-0.00031699240207672;0.0001675932580838;-0.00050668918993324;0.00035259197466075;-0.00042851807666011;0.00016308833437506;-0.0010171605972573;4.4048683776055e-05;-0.0012094927951694;-5.3190487960819e-06;1.3443361240206e-05;9.2785176093457e-06;-0.00057277042651549;7.2237191488966e-05;-0.00020051609317306;-3.9137958083302e-05;-0.00019324627646711;8.981442078948e-05;-0.00017241846944671;-7.9984001786215e-06;-0.00029165350133553;1.3092777408019e-05;2.5120856662397e-05;-2.6794215955306e-05;0.00031555234454572;-3.1058123568073e-05;-0.00022593623725697;-1.296456593991e-05;0.00037857305142097;0.00017692845722195;-4.5350439904723e-05;8.5151557868812e-05;-0.0001016462338157;4.8188496293733e-05;-0.00011254785204073;0.00024303630925715;3.2438510970678e-05;0.00015258007624652;-4.7412822823389e-07;4.4528487705975e-06;-8.5346182459034e-06;0.00034433486871421;3.4673194022616e-05;-0.00054589781211689;4.3688676669262e-05;7.4313953518867e-05;-0.00016849394887686;-0.00050511036533862;-0.00024085080076475;-0.00011884047125932;-7.6797528890893e-05;6.7922490416095e-05;4.0869446820579e-05;6.3976091041695e-05;-6.7380635300651e-05;0.00040925250505097;-0.00018742664542515;0.0005052222404629;-4.5606346247951e-05;2.5343828383484e-05;4.6692566684214e-05;-0.00050348066724837;-0.00024321518139914;0.00022565509425476;0.00035321110044606;0.00037092677666806;0.00026539684040472;0.00021724480029661;0.00024988211225718;0.0001217365716002;-0.00028936684248038;9.3334449047688e-05;-0.00079446489689872;7.1688642492518e-05;-5.3238395594235e-06;5.7248646044172e-05;-7.0103829784784e-05;-3.9258262404473e-05;0.00055222929222509;-0.00034299728577025;0.00089703302364796;-3.0163448172971e-05;0.00060381286311895;4.3745832954301e-05;-4.9553524149815e-05;-7.5525626016315e-05;-3.6539451684803e-05;-4.001257912023e-05;0.0014895179774612;-3.7703808629885e-05;9.6436648163944e-05;-0.00015882698062342;5.9294798120391e-05;-0.00025306522729807;0.00022877588344272;-0.00039496703539044;0.00033472498762421;-0.0004357504658401;0.00014808932610322;-0.0011037164367735;8.594173414167e-05;-0.0010363105684519;2.0928669982823e-05;-0.00010059092892334;1.7194997781189e-05;-0.00042988939094357;2.4906948965508e-05;-8.2868522440549e-05;-3.4779568522936e-05;-9.8541444458533e-05;4.2974748794222e-05;-0.00016531217261218;1.6964693713817e-05;-0.00017420492076781;8.807702215563e-06;3.8035981560824e-05;2.3253241465682e-07;-8.2196238508914e-05;-2.6210907890345e-05;-7.2793423896655e-05;-2.0551107809297e-05;0.00032244905014522;0.00012477133714128;-3.3701016945997e-05;-1.1587092558329e-05;-4.525761687546e-05;-3.0491632060148e-05;-6.6673397668637e-05;0.00024971138918772;2.3651062292629e-05;0.00029314629500732;3.0016749406059e-06;-0.00011769292177632;-1.4637130334449e-05;0.0004231077618897;3.5867684346158e-05;-0.00053012976422906;2.6224754037685e-05;5.4785276006442e-05;-0.0001339087029919;-0.00033763833926059;-0.00017535522056278;-2.8440939786378e-05;-6.4288549765479e-05;-5.6835295254132e-05;2.1909927454544e-05;7.689659105381e-05;-4.4623324356508e-05;0.00028971789288335;-0.00015359857934527;0.00041541273822077;-3.4992011933355e-05;8.0415695265401e-05;4.4714892283082e-05;-0.00038868587580509;-0.00014810143329669;0.00017862003005575;0.00023114506620914;0.00025789320352487;0.00022910331608728;0.00016521781799383;5.824229810969e-05;0.00010120794468094;-0.00017096099327318;7.0542278990615e-05;-0.00049496459541842;6.1050406657159e-05;-0.00013070624845568;0.00012902064190712;-6.0202735767234e-05;-0.00012254863395356;0.00011939372780034;-0.00044182367855683;0.00012644013622776;-0.00036934847594239;-5.3664603910875e-05;4.796170105692e-05;-3.4263510315213e-05;0.00014476582873613;2.4539349396946e-05;-0.001024690689519;-3.7941012124065e-05;-0.00027730758301914;1.8705146430875e-05;-0.00022311201610137;-7.9695229942445e-05;0.0002737536560744;0.00041895103640854;-3.9078122426872e-07;5.1937582611572e-05;-0.00018318121146876;0.00032943894620985;-9.6691910584923e-05;0.00089710997417569;3.1598428904545e-05;-0.00016335731197614;3.6118104617344e-05;0.00051842204993591;6.3043728459888e-08;-0.00032674465910532;0.00011976309906458;-0.00036055804230273;-7.7397948189173e-05;-0.00020605347526725;0.00010769399523269;-0.00020136352395639;-1.0398238373455e-05;-3.9761685911799e-05;2.5598139473004e-05;0.00084244646131992;-6.0811344155809e-05;-0.00039116034167819;-9.6560825113556e-06;0.00025115939206444;5.4135698519531e-06;0.00029009036370553;-4.9231725824939e-06;9.9491247965489e-05;9.2570284323301e-05;-0.00017117589595728;0.00015389538020827;-0.00010878079774557;4.2069787014043e-05;6.3855994085316e-05;0.00012610928388312;-2.9624732633238e-05;4.2687543100328e-06;2.7886453608517e-06;-0.00023558962857351;6.7851888161385e-06;0.00011206939961994;1.7408096027793e-05;-0.00067308242432773;-0.00010165682760999;-0.00046723321429454;-0.00013868082896806;0.00015533980331384;-5.5684347898932e-05;1.2646903087443e-05;5.0877384637715e-05;0.0002580982982181;-3.3965508919209e-05;0.00014784326776862;-0.00011436639033491;-9.4859504315536e-05;-3.7302434066078e-05;8.5382125689648e-05;-0.00037937751039863;-0.00023940861865412;0.00040224537951872;9.7307951364201e-05;0.00026474942569621;0.00030039894045331;0.00086064578499645;0.00011881712271133;-0.00017656078853179;7.165835268097e-05;-0.00078976235818118;6.2163788243197e-05;0.00023561829584651;4.8670448450139e-05;0.00020495767239481;-7.0945934567135e-05;0.00020852533634752;9.6417599706911e-05;-9.3238872068468e-05;-4.2613319237716e-06;-0.00013778396532871;-5.4842515964992e-05;3.511977774906e-05;8.8562064775033e-06;-0.00023261221940629;2.1734793335781e-05;-0.00020014218171127;-9.1312904260121e-05;-0.00010365889465902;-2.7505637262948e-05;-0.00033669784897938;-0.00015790457837284;8.4635612438433e-05;0.00028794031823054;0.00014369434211403;6.5774751419667e-05;-3.9059032133082e-05;-0.00013883104838897;-4.3437383283162e-05;0.00026807902031578;9.046644117916e-05;-7.3730643634917e-06;5.1294333388796e-05;0.00013306860637385;3.9042577554937e-05;-0.00017764719086699;5.4617416026304e-05;-0.00015045626787469;2.4795903300401e-05;-3.1950254197e-05;5.888583837077e-05;-6.1273887695279e-05;-3.3634540159255e-05;-5.3080948418938e-05;9.1551719378913e-06;0.00078282319009304;-3.0866693123244e-05;-0.00018432007345837;-7.9110059232335e-06;6.4694162574597e-05;1.6458912796224e-05;3.6909434129484e-05;3.9862734411145e-05;0.00015331617032643;0.0001290238724323;-7.2565286245663e-05;-9.0171437477693e-05;-9.9968958238605e-05;-0.00023303412308451;-4.6159798330336e-06;9.1787478595506e-05;1.4676423916171e-06;-0.00022120063658804;1.559297197673e-05;-1.6960009816103e-05;-9.733545994095e-06;4.8711455747252e-05;2.5546507458785e-05;-0.0001907830737764;-3.0910585337551e-05;-0.00018897860718425;-8.940070256358e-05;0.00013679102994502;-2.376722113695e-05;-2.3599097403348e-05;4.3382238800405e-05;-2.2357047782862e-05;-1.2538896044134e-05;1.571087159391e-05;-1.8119519154425e-05;-4.2749215936055e-05;-2.2351407096721e-05;-7.796742283972e-05;-0.00018722546519712;-0.0001285636681132;0.00013788462092634;0.0001365391217405;7.6198775786906e-05;0.00016000405594241;0.00061976490542293;2.1765677956864e-05;-0.00015254218305927;2.4453203877783e-05;-0.00043332698987797;1.6059750123532e-05;0.00016821057943162;1.415833048668e-05;-1.3858082638762e-05;1.9467210222501e-05;5.1860854000552e-05;-2.4463548470521e-05;-3.7910391256446e-05;4.7503017412964e-05;-2.5167430521833e-06;1.4151331015455e-05;2.5642391392466e-06;-2.3333720946539e-06;-3.4044471249217e-05;9.0129751697532e-06;9.977364243241e-05;-8.0458572483622e-05;1.2746600077662e-06;-2.8909946649947e-06;-1.6191190297832e-05;-1.6828190609885e-06;-7.1397075771529e-06;8.1927228166023e-06;-3.5296798728268e-07;6.57906930428e-05;-6.8521512730513e-05;-5.3122086683288e-05;3.3146610803669e-05;-2.9588180041173e-05;1.8566010112409e-05;-4.092168455827e-05;4.7444336814806e-05;-3.1094470614335e-05;2.834249244188e-05;3.3725624234648e-05;2.7887695978279e-05;7.8399325502687e-06;1.4516631381412e-05;-4.1018133742909e-06;5.1761994654953e-06;-4.8531310312683e-06;-2.0489846974669e-06;-1.6809435692267e-05;-2.3899250663817e-05;3.7043493648525e-05;1.3525925169233e-05;1.8477905541658e-05;1.7980821212404e-05;2.0995659724576e-05;3.236952034058e-05;-7.6825599535368e-05;-1.4984192603151e-05;7.5590680353343e-05;7.5083880801685e-05;5.7446428399999e-05;-5.3484167438e-05;-5.7857272622641e-05;-5.6684104492888e-05;-3.7729892937932e-05;1.7138220300694e-06;-9.9229591796757e-06;-1.9571074517444e-05;-3.4846086691687e-06;-2.3558168322779e-05;-3.355956505402e-05;-1.836490991991e-05;-1.400293331244e-05;5.3841642511543e-05;4.587407966028e-05;7.9540957813151e-05;7.040609489195e-05;4.5004573621554e-05;3.1176470656646e-05;-1.2032472795909e-07;2.7446435524325e-06;4.6801142161712e-05;4.7014073061291e-05;9.6530442533549e-05;9.737928485265e-05;7.8116690929164e-06;1.3638339623867e-05;-1.984168375202e-05;-1.3318418496056e-05;-3.6658100725617e-05;-9.4436436484102e-06;-3.4686170238274e-06;-1.6982014130917e-05;3.8228299672483e-06;-7.9096775152721e-05;-8.7029009591788e-05;-9.2614944151137e-05;-8.4009108832106e-05;-8.5750114521943e-05;-7.4641233368311e-05;2.432511337247e-06;-8.676932338858e-06;-1.6099204003694e-05;1.8944696421386e-05;5.3076873882674e-05;-2.4562461476307e-05;-3.4881981264334e-05;5.1000683015445e-05;-1.7151030533569e-06;1.5524861737504e-05;2.1140856460988e-06;-3.2779466891952e-06;-3.159588231938e-05;1.0922604815278e-05;0.00010117248166353;-8.0356323451269e-05;2.1492007817869e-06;-1.7450796576668e-06;-1.3905443665863e-05;2.3046932255966e-06;-6.092864623497e-06;3.938721420127e-06;-3.5665220821102e-06;6.3813698943704e-05;-7.2203656600323e-05;-5.5058473662939e-05;3.2038446079241e-05;-3.1455183489015e-05;1.6962529116427e-05;-4.1385941585759e-05;4.8095771489898e-05;-3.1812443921808e-05;2.7655170924845e-05;3.3454725780757e-05;2.930938899226e-05;8.5586880231858e-06;1.3435438631859e-05;-4.7771391109563e-06;5.1310398703208e-06;-5.099826012156e-06;-2.0624790977308e-06;-1.6037942259572e-05;-2.4768449293333e-05;3.4314740332775e-05;1.5442228686879e-05;1.8459657439962e-05;1.8494170944905e-05;2.0240819139872e-05;3.3473606890766e-05;-7.7653530752286e-05;-1.5640296624042e-05;7.5935924542136e-05;7.4739546107594e-05;5.957393659628e-05;-5.2882151067024e-05;-5.8428518968867e-05;-5.4853888286743e-05;-3.9209473470692e-05;1.949942770807e-06;-1.0241793461319e-05;-1.9156890630256e-05;-4.106900178158e-06;-2.2750427888241e-05;-3.4844142646762e-05;-1.7476324501331e-05;-1.5354742572526e-05;5.339493509382e-05;4.7686702600913e-05;7.7529271948151e-05;7.3998904554173e-05;4.3805190216517e-05;3.3145610359497e-05;4.0268875522997e-07;2.2554611405212e-06;4.5184307964519e-05;4.9675658374326e-05;9.4536866527051e-05;0.00010104697139468;7.431766789523e-06;1.3947303159512e-05;-1.9646235159598e-05;-1.2850308849011e-05;-3.6968041968066e-05;-9.2317059170455e-06;-4.9057898650062e-06;-1.5402571079903e-05;1.7022667861966e-06;-7.8223914897535e-05;-9.0017791080754e-05;-9.04756525415e-05;-8.7338135926984e-05;-8.3141901995987e-05;-7.856229058234e-05;2.335335011594e-06;-8.4838347902405e-06;9.6878786280286e-05;-0.00023733975831419;-9.1002570115961e-05;-0.00015774380881339;-3.8977665099083e-05;0.00022534614254255;4.8770147259347e-05;0.00029417761834338;1.5947141946526e-05;-6.8577501224354e-05;-5.8345543948235e-05;0.00021854889928363;0.00010902195936069;0.00043228131835349;1.6467063687742e-05;0.00017345663218293;0.00033131946111098;0.00016876964946277;-0.00015994741988834;-0.00015748488658573;-0.0003111632540822;0.00013333323295228;-0.00016898178728297;7.1788876084611e-05;1.4888066743879e-06;-9.9030825367663e-05;-0.00048136620898731;-5.4721895139664e-05;5.3137628128752e-05;-3.3283889933955e-05;-0.00027276636683382;7.3149574745912e-05;-0.00021320091036614;4.722389348899e-05;-0.00017625834152568;8.5672254499514e-05;-2.7482685254654e-05;-6.3412509916816e-05;-0.00018186685338151;1.0813850167324e-05;-4.1078197682509e-05;-3.1851042876951e-05;0.00089804426534101;-1.9857527149725e-05;-0.00028264173306525;1.0187999578193e-05;0.00011719422036549;2.7791220418294e-05;2.3785416487954e-05;0.00023592305660713;-9.9506374681368e-05;0.00018687726696953;-0.00012712104944512;-9.1258902102709e-05;-2.2218930098461e-05;-0.00027596880681813;2.0329169274191e-05;0.00017440103692934;1.0307184311387e-05;-0.0002097890683217;2.991237806782e-06;-6.1178696341813e-05;4.4949851144338e-05;5.0866070523625e-05;-6.9521163823083e-05;-0.00025017958250828;-0.00015778285160195;-0.00018814552458934;-2.1956413547741e-05;0.00018478150013834;4.5857730583521e-05;-1.4754743460799e-05;-4.0527949749958e-05;9.86051018117e-05;-5.9471072745509e-05;0.00012872590741608;-3.3454005460953e-05;-7.4831725214608e-05;-9.3251772341318e-05;-0.0002899723185692;-0.00019035310833715;0.00020667022909038;0.00021177690359764;0.00022898142924532;0.00011727240053006;8.4734943811782e-05;0.00057922332780436;4.8481597332284e-05;-0.00021254576859064;3.8313461118378e-05;-0.00062200170941651;2.9140564947738e-05;0.00022036870359443;9.5601084467489e-05;-0.00021770976309199;-0.00010001035843743;-2.6500511012273e-06;-9.3360176833812e-05;0.00036124931648374;4.7657955292379e-05;0.00036723227822222;2.7446980311652e-05;-7.220824045362e-05;-5.9361853345763e-05;9.0845082013402e-05;8.6538559116889e-05;0.00069897843059152;1.7735502524374e-06;0.00023400920326822;0.00027282614610158;0.00014877202920616;-0.00021168478997424;-8.9780558482744e-05;-0.0003705277631525;0.00017298890452366;-0.00017669328371994;9.4583068857901e-05;-0.00019630324095488;-7.3926174081862e-05;-0.00067821377888322;-4.9275487981504e-05;0.00012237140617799;-1.9811066522379e-05;-0.00041135746869259;9.1324094682932e-05;-0.00024948676582426;9.1234214778524e-06;-0.00025405883206986;0.00010709935304476;-5.5122021876741e-05;-5.7965025916928e-05;-0.0002441016404191;1.3371412023844e-05;-3.141186243738e-05;-4.3207837734371e-05;0.00088509352644905;-2.1744723198935e-05;-0.0003354792133905;1.0005626791099e-05;0.0001918365014717;0.00011585705215111;-9.1505226009758e-06;0.00022143231763039;-0.00013335193216335;0.00018475358956493;-0.00012326208525337;-9.494622645434e-06;4.2252440835e-06;-0.00019862577028107;5.7864722293743e-06;0.00017829130229075;8.3713739513769e-06;-0.00011584091407713;7.7604809121112e-06;-0.00015202800568659;4.5774973841617e-05;6.105967622716e-05;-0.0001035664245137;-0.00040801317663863;-0.00018033645756077;-0.00021248655684758;-3.7007808714407e-05;0.00020787153334823;4.3440890294733e-05;2.8187482712383e-06;-5.2693034376716e-05;0.0002545882598497;-9.9030075944029e-05;0.00022267120948527;-3.2175354135688e-05;-0.00010341713641537;-2.1113268303452e-05;-0.00034872643300332;-0.00022629715385847;0.0001825847721193;0.00029294725391082;0.00028912007110193;0.00014433912292589;0.00013388200022746;0.00054225453641266;6.3686580688227e-05;-0.00023926662106533;5.8632336731534e-05;-0.00076202338095754;3.8356396544259e-05;0.00024212455900852;0.0001299942668993;-0.00026866275584325;-0.00015890666691121;6.7956380007672e-06;-0.00016011856496334;0.00045379347284324;6.7511733504944e-05;0.00054558814736083;4.7674759116489e-05;-9.2875816335436e-05;-8.6006548372097e-05;5.7936453231378e-05;8.1437727203593e-05;0.0011009306181222;-1.1036495379813e-05;0.00034007831709459;0.00035722795291804;0.00013885421503801;-0.00035667416523211;-8.5372244939208e-05;-0.00046430993825197;0.00027375848731026;-0.00015544518828392;0.00016439193859696;-0.00028826555353589;-7.9514036769979e-05;-0.0010343876201659;-5.2215378673282e-05;0.00016057571338024;-1.0129700058314e-05;-0.00062262878054753;0.00014973187353462;-0.00038837624015287;-2.1603826098726e-05;-0.00039080061833374;0.00016145140398294;-0.00014247655053623;-6.3080413383432e-05;-0.00037269189488143;1.4238735275285e-05;-2.6191628421657e-05;-7.7929194958415e-05;0.0012390506453812;-2.6597870601108e-05;-0.00053258467232808;1.5938738215482e-05;0.00026410806458443;0.00022572300804313;-2.3792252250132e-05;0.0002727177052293;-0.00021135013957974;0.00023957874509506;-0.00016781120211817;6.9401859946083e-05;3.4572782169562e-05;-0.00020750130352098;-1.1399411960156e-05;0.00029658610583283;1.1785571587097e-05;-0.0001400439068675;1.1195103979844e-05;-0.00020184920867905;4.5046177547192e-05;0.00012413041258696;-0.00014511651534121;-0.00067033100640401;-0.00023770568077452;-0.0004809649544768;-4.6973331336631e-05;0.00026696061831899;5.6137156207114e-05;1.2304411939112e-05;-6.656015466433e-05;0.00030149423400871;-0.00015211600111797;0.00024832971394062;-4.5257562305778e-05;-0.00016184365085792;4.4219636947673e-06;-0.00049794651567936;-0.0003283814585302;0.00022289709886536;0.00047410794650204;0.00039165702764876;0.00028684514109045;0.00018942721362691;0.000928352936171;9.3528666184284e-05;-0.00026971465558745;8.9165230747312e-05;-0.0010421590413898;5.5710479500704e-05;0.00035455412580632;0.00010157655924559;-0.00019754233653657;-0.00013275592937134;8.9325410954189e-05;-0.00017625623149797;0.00044379834434949;5.2949450036976e-05;0.00050912448205054;4.585651186062e-05;-7.5660318543669e-05;-7.1685557486489e-05;-2.5726236344781e-05;4.8899182729656e-05;0.0010870596161112;-1.9167444406776e-05;0.00029767755768262;0.00024782776017673;9.4854418421164e-05;-0.00033469274058007;-2.1264431779855e-05;-0.00040510081453249;0.00026213642559014;-0.0001345137716271;0.00015105521015357;-0.00034511156263761;-4.4611133489525e-05;-0.00097602960886434;-3.6384346458362e-05;0.00014212483074516;6.2028118463786e-07;-0.00057838362408802;0.0001281448348891;-0.00032745345379226;-3.5530116292648e-05;-0.00035318420850672;0.00014598990674131;-0.00017684689373709;-4.1422630602028e-05;-0.00033903610892594;1.362939565297e-05;-1.6677611711202e-05;-6.5073771111201e-05;0.00095274770865217;-2.0194216631353e-05;-0.00047661259304732;1.0418012607261e-05;0.00026479986263439;0.0002259018656332;-3.3769483707147e-05;0.00020591748761944;-0.00018699356587604;0.00018975089187734;-0.00014501606347039;0.00012907024938613;3.6501689464785e-05;-6.4472638769075e-05;-1.8139335224987e-05;0.00024137056607287;5.7512061175657e-06;-3.5401826607995e-05;1.2736678399961e-05;-0.00022690578771289;3.2245257898467e-05;0.00011651551903924;-0.00013379528536461;-0.00062498619081452;-0.000203354677069;-0.0004202087293379;-4.5702348870691e-05;0.00021237689361442;4.5163553295424e-05;2.0324496290414e-05;-5.5941531172721e-05;0.00028516032034531;-0.00014392714365385;0.00023658738064114;-3.7961162888678e-05;-0.00013362869503908;3.4551634598756e-05;-0.00044227845501155;-0.00028272822964936;0.00017629902868066;0.00042852989281528;0.00034481260809116;0.00026267659268342;0.00017389675485902;0.00077595398761332;8.5588537331205e-05;-0.00022546011314262;8.1641526776366e-05;-0.00089779437985271;5.133948798175e-05;0.00028410350205377;0.0001744995242916;-7.5840645877179e-05;7.4044350185432e-05;0.00013502052752301;-0.00019961431098636;4.914012606605e-05;-0.00023994775256142;-6.4038722484838e-05;4.5218559534987e-05;-2.6501416868996e-05;7.4727636274474e-06;2.7400035833125e-05;-0.00061488599749282;-4.8890076868702e-05;-0.00026412779698148;7.0699129537388e-06;-0.00032201618887484;-7.4729214247782e-05;0.00022341409930959;0.00032642201404087;8.1453224993311e-05;-5.2069066441618e-05;-0.00011296014417894;4.1589111788198e-05;-9.1230547695886e-05;0.00063556717941537;6.0818583733635e-05;-0.00016203253471758;4.0628681745147e-05;0.00041322375182062;5.9019739637733e-06;-0.00035607712925412;0.00013112883607391;-0.00034474543645047;-6.8493995058816e-05;-8.6828113126103e-05;0.00010158747318201;-0.00018641418137122;-2.9059174266877e-05;-3.2324642234016e-05;9.5345731097041e-06;0.0011151746148244;-7.3631897976156e-05;-0.00038228213088587;-1.1532934877323e-05;0.00012125531065976;2.2703303329763e-05;0.00026308133965358;6.8621889113274e-06;0.00014539726544172;0.00012608258111868;-0.00017591370851733;3.1281699193642e-05;-9.2439462605398e-05;-0.00024041727010626;6.8928704422433e-05;0.00022656796500087;-3.0964554753155e-05;-0.00022666588483844;1.3687750652025e-05;-4.0872986573959e-05;-4.6100944928185e-06;9.9757744465023e-05;1.775015880412e-05;-0.00059868447715417;-7.4458941526245e-05;-0.00056395202409476;-0.00010839715832844;0.00018629501573741;-2.5154617105727e-05;-1.3431316574497e-06;4.2366918933112e-05;0.00017446765559725;-3.0539202271029e-05;2.2208934751689e-05;-8.0754776718095e-05;-0.00014647073112428;-2.9255692425068e-05;5.6868295359891e-05;-0.00030188760138117;-0.00023483333643526;0.00037408256321214;7.145621930249e-05;0.00025985654792748;0.0002416951028863;0.00095170963322744;9.0224486484658e-05;-0.00012079624866601;4.5130494982004e-05;-0.00071715458761901;5.028951636632e-05;0.00031645037233829;3.3072945370805e-05;0.00027180014876649;-0.00011283934145467;0.00019242575217504;0.00016545025573578;-0.00015693451859988;9.9350527307251e-06;-0.00019504537340254;-7.1415714046452e-05;5.022751429351e-05;-1.9586123016779e-05;-0.00020595191745088;4.454158624867e-05;-0.00043962869676761;-6.6897817305289e-05;-0.0002622848842293;-7.3310743573529e-06;-0.00043692108010873;-0.00011245611676713;0.00019252600031905;0.00034176785266027;0.00015462434384972;-5.1724113291129e-05;-8.3628372522071e-05;-1.8042215742753e-05;-0.00010760358418338;0.00053437653696164;9.104999480769e-05;-0.00012810366752092;4.7395431465702e-05;0.00036324531538412;1.7028825823218e-05;-0.0004021743661724;0.0001422857894795;-0.00031668221345171;-5.5293268815149e-05;6.3433843024541e-05;9.4748378614895e-05;-0.00018023935263045;-5.0841801567003e-05;-2.8076136004529e-05;-7.0844299315809e-09;0.001425086054951;-8.409366273554e-05;-0.0003434254322201;-1.885322308226e-05;5.6307315389859e-05;3.3436008379795e-05;0.00023884947586339;3.0140838134685e-05;0.00019920601334888;0.00013365896302275;-0.00017835888138507;-8.9886358182412e-05;-9.0275243564975e-05;-0.00055470928782597;7.1853086410556e-05;0.00027021550340578;-2.3487649741583e-05;-0.0004036127938889;2.2886650185683e-05;4.7286033804994e-05;-9.3771977844881e-06;8.3840532170143e-05;3.1434006814379e-05;-0.00054257235024124;-6.8057815951761e-05;-0.00063552311621606;-0.0001192877170979;0.00022265230654739;-1.1915225513803e-05;-8.8820734163164e-06;4.4949123548577e-05;0.00014819393982179;-3.8167974707903e-05;-8.6556565292994e-06;-7.1562819357496e-05;-0.0001785546191968;-3.1725379812997e-05;1.2092082215531e-05;-0.0002886712027248;-0.00025770350475796;0.00036280459607951;9.586384112481e-05;0.00027587875956669;0.00023683832841925;0.0010429340181872;8.7424006778747e-05;-0.000122670608107;4.1378410969628e-05;-0.00075798714533448;5.0319536967436e-05;0.0003756707010325;2.9663035093108e-05;0.00031502480851486;-0.00010916207975242;0.00027813916676678;0.00011855716002174;-0.00011759342305595;-2.835313352989e-05;-0.00011531310155988;-5.5841173889348e-05;4.2598672735039e-05;9.4357928901445e-06;-0.00049881980521604;4.2333456804045e-05;-6.7326349380892e-05;-0.0001052223960869;-0.00010578539513517;-3.5967314033769e-05;-0.00042128976201639;-0.0001914340100484;6.1322090914473e-05;0.00030983932083473;0.00020095083164051;8.8599619630259e-05;-2.5380428269273e-05;-8.4747785876971e-05;-6.1297811043914e-05;0.00020879069052171;0.00011121607531095;4.6510675019817e-05;5.5925782362465e-05;8.8017193775158e-05;4.6272569306893e-05;-0.00020122680871282;5.2123792556813e-05;-0.00010205028956989;4.3383231968619e-05;0.00010338058928028;5.6336117268074e-05;-7.4867049988825e-05;-4.7691457439214e-05;-3.8863094232511e-05;-3.0407070426008e-06;0.0010613288031891;-2.9106378860888e-05;-0.00013470194244292;-9.6798357844818e-06;5.4941174312262e-06;2.473274798831e-05;3.7110096400284e-06;5.7647121138871e-05;0.00019693831563927;0.00012804467405658;-6.7829882027581e-05;-0.00017701782053337;-0.00010472910071258;-0.00056763493921608;-1.4636142623203e-05;0.00015445060853381;6.8682188612001e-06;-0.0003807723405771;1.778748446668e-05;5.4373929742724e-05;-1.2752958355122e-05;2.1217227185844e-05;4.356297722552e-05;-9.8467047791928e-05;-2.5489976906101e-05;-0.00030640952172689;-0.00010433884017402;0.00017652001406532;-4.6575860324083e-06;-2.7063524612458e-05;4.5560736907646e-05;-4.423622158356e-05;-2.3315758880926e-05;1.9891369447578e-05;-1.2972021067981e-05;-7.5701573223341e-05;-2.8145552278147e-05;-0.0001308090868406;-0.00017280425527133;-0.00016683555440977;0.00012618181062862;0.00016379184671678;0.00012472197704483;0.0001525638072053;0.00069178483681753;2.4489869247191e-05;-0.00016423479246441;2.3025300833979e-05;-0.00048296339809895;1.7322576240986e-05;0.00022373499814421;1.4075354556553e-05;-3.9296948671108e-05;4.9863338063005e-05;9.4896953669377e-05;-5.0968523282791e-05;-5.4894517234061e-05;6.5554551838432e-05;-3.6884498513245e-06;2.0233364921296e-05;8.1538564700168e-06;-7.036946954031e-06;-6.3994455558714e-05;1.4704281056765e-05;0.00016017181042116;-0.00013277205289342;-1.5095740764082e-06;-1.4214756447473e-06;-2.6610028726282e-05;-3.3885203265527e-06;-1.1209329386475e-05;1.9777767192863e-06;1.177086323878e-05;0.00010518159979256;-0.00010735015530372;-7.7836870332249e-05;5.5795084335841e-05;-5.0134509365307e-05;3.4474458516343e-05;-6.6347391111776e-05;7.9815305070952e-05;-4.4061787775718e-05;3.9928308979142e-05;6.8684632424265e-05;5.4100040870253e-05;-3.3718442864483e-06;1.1452504622866e-05;-1.5202311260509e-05;-7.8770455047561e-07;-7.0051155489637e-06;-3.5621687857201e-06;-2.3539914764115e-05;-3.2677577110007e-05;5.9835889260285e-05;2.2504049411509e-05;4.1258437704528e-05;3.8168203900568e-05;3.0717481422471e-05;4.6953886339907e-05;-0.00012653040175792;-4.4280161091592e-05;0.00010689246119;0.0001353860279778;0.00010229604959022;-6.8955770984758e-05;-7.4280018452555e-05;-9.0391687990632e-05;-5.8487748901825e-05;-5.7822632015814e-07;-1.7512640624773e-05;-4.5323213271331e-05;-1.9319655621075e-05;-3.6292112781666e-05;-5.0151400500908e-05;-3.8549249438802e-05;-2.7411024348112e-05;0.0001032660875353;8.5461790149566e-05;0.00013116808258928;0.00011667104263324;7.6583863119595e-05;5.5110507673817e-05;2.4123608000082e-07;5.6042940741463e-06;8.4226056060288e-05;8.0169869761448e-05;0.00015436226385646;0.00015367522428278;4.7383823584823e-06;1.2915351362608e-05;-1.0809497325681e-05;1.2659188541875e-05;-5.973962470307e-05;-5.1654056733241e-05;-3.4727167076198e-05;-3.5657241824083e-05;-7.0605501605314e-06;-0.00012846986646764;-0.0001409518008586;-0.00014685945643578;-0.00013073933951091;-0.00014932536578272;-0.00012649886775762;1.4869994629407e-05;-3.270132765465e-06;-4.7582721890649e-05;4.8513556976104e-05;0.00010007926175604;-5.1882721891161e-05;-4.4783402699977e-05;7.7004719059914e-05;-1.5362842304967e-06;2.4030352506088e-05;6.9678194449807e-06;-9.8637492556009e-06;-5.5435353715438e-05;2.1832669517607e-05;0.00016601823153906;-0.00013342946476769;1.2859095477324e-06;2.3618144950888e-06;-1.8740711311693e-05;9.8468271971797e-06;-7.6144360718899e-06;-1.2395438716339e-05;1.5854050161579e-06;9.9317367130425e-05;-0.0001195284203277;-8.6571533756796e-05;5.1505041483324e-05;-5.6270248023793e-05;3.0089864594629e-05;-6.8034991272725e-05;8.2805039710365e-05;-4.70122176921e-05;3.7437817809405e-05;6.7956396378577e-05;5.9800968301715e-05;-4.2537632793938e-07;6.7427322392177e-06;-1.8620476112119e-05;-5.7865401004165e-07;-7.5984739851265e-06;-3.789508355112e-06;-2.1598680177703e-05;-3.5158438549843e-05;5.0357924919808e-05;2.9758190066786e-05;4.1276442061644e-05;4.0431961679133e-05;2.8460877729231e-05;5.0630853365874e-05;-0.00013025722000748;-4.7324225306511e-05;0.00010832356201718;0.00013546229456551;0.00011049700697185;-6.6947017330676e-05;-7.619391544722e-05;-8.3814615209121e-05;-6.4307532738894e-05;1.284440429572e-07;-1.8647568140295e-05;-4.3978459871141e-05;-2.2354670363711e-05;-3.3838077797554e-05;-5.4394749895437e-05;-3.5635912354337e-05;-3.2344978535548e-05;0.00010281703725923;9.2259353550617e-05;0.00012635660823435;0.00012843856529798;7.3182083724532e-05;6.2111343140714e-05;1.5718584336355e-06;4.4086600610171e-06;7.822981569916e-05;9.0401801571716e-05;0.00014872693282086;0.0001666355819907;4.1951657294703e-06;1.2983327906113e-05;-1.0162844773731e-05;1.4989791452535e-05;-6.1022961745039e-05;-5.1475843065418e-05;-4.0444985643262e-05;-3.1167008273769e-05;-1.4303522220871e-05;-0.00012630654964596;-0.00015173015708569;-0.00014132251089904;-0.00014182028826326;-0.00014082816778682;-0.00014112688950263;1.4020198250364e-05;-1.6354899798898e-06;0.00013478698383551;-0.00034232888719998;-0.00010304914030712;-0.00030288405832835;1.8213268049294e-05;0.00017217551067006;5.3158102673478e-05;0.00024220510385931;1.3424627468339e-05;-7.6830037869513e-05;-8.2528189523146e-05;0.0004874472215306;0.0001401707122568;0.00019927618268412;3.0342011086759e-05;0.00016316103574354;0.00043689328595065;0.000194422682398;-0.00012575557047967;-0.00025099390768446;-0.0002833969774656;0.00010779323201859;-0.00016833422705531;7.5394935265649e-05;6.2612845795229e-05;-0.00013832324475516;-0.00035615009255707;-6.3538871472701e-05;-4.8705937842897e-06;-4.6515353460563e-05;-0.0001859786134446;7.098336936906e-05;-0.00023116839292925;7.8534030762967e-05;-0.00010476536408532;7.1030081016943e-05;0.0001150236275862;-7.9874094808474e-05;-0.00017289340030402;-1.3577259778685e-06;-3.1052146368893e-05;-3.0168033845257e-05;0.0011893509654328;-2.1009214833612e-05;-0.00022759278363083;1.8032977095572e-05;2.5733217626112e-05;-3.6640612961492e-05;5.594787580776e-05;0.00028494879370555;-8.0158024502452e-05;0.00018167428788729;-0.00013166329881642;-0.00021025363821536;-3.9429374737665e-05;-0.00062087329570204;3.26830886479e-05;0.00024168789968826;1.397826235916e-05;-0.00041209594928659;-2.4767934974079e-06;5.3863594075665e-05;6.3008410506882e-05;2.5690636903164e-05;-4.7122048272286e-05;-0.00010458433098393;-0.00016979684005491;-0.00032136324443854;2.2764104414819e-06;0.0002288958785357;4.9780486733653e-05;-2.5985724278144e-05;-4.9629154091235e-05;1.3508080883184e-05;-3.9503978769062e-05;0.00010712093353504;-4.0214472392108e-05;-0.00010535672481637;-0.00018367829034105;-0.00026053277542815;-0.00022278622782324;0.00024759306688793;0.00018631930288393;0.00020557886455208;0.00016240878903773;7.0607806264888e-05;0.00067947857314721;4.2131192458328e-05;-0.00021544768242165;3.2275544072036e-05;-0.00063119165133685;2.6090760002262e-05;0.00027442837017588;0.00016208626038861;-0.00034610138391145;-0.00019232295744587;-0.00026400617207401;-6.0069407481933e-05;0.00020863601821475;8.2108796050306e-05;0.00041827457607724;4.0873139369069e-05;-9.0427391114645e-05;-0.00010012494021794;0.00026570635964163;0.00010163609840674;0.0007185589056462;5.4974761951598e-06;0.00033680128399283;0.00052147806854919;0.00012696188059635;-0.00032234971877187;-0.00021262797235977;-0.00036245762021281;0.00021557667059824;-3.1178056815406e-05;0.0001703387388261;9.5680134108989e-06;-0.00012891543156002;-0.00080608093412593;-5.862240868737e-05;0.00013080360076856;-1.9076838725596e-05;-0.00052054459229112;0.00017635090625845;-0.00045369064901024;-7.7143677117419e-06;-0.00036684045335278;0.0001501173392171;-7.1082672548073e-07;-8.5421670519281e-05;-0.00034814354148693;4.7061880081856e-07;-2.1803556592204e-05;-0.00010371524695074;0.0016451748088002;-2.8537340767798e-05;-0.00053686439059675;3.2402065698989e-05;0.00011308518151054;0.00019466751837172;1.1475698556751e-05;0.00032940442906693;-0.00022074498701841;0.00026086639263667;-0.00015695828187745;-8.4800551121589e-05;4.5014898205409e-05;-0.00056159857194871;-8.7462185547338e-06;0.00041242392035201;2.6072280888911e-05;-0.00043506498332135;-1.5466288232346e-06;2.5376271878486e-05;4.6236855268944e-05;0.00012752100883517;-0.00010800105519593;-0.00059803266776726;-0.00021749889128841;-0.00069749739486724;-1.6139882063726e-05;0.00031319700065069;5.7466131693218e-05;-1.0171467692999e-05;-6.3934268837329e-05;0.00015280676598195;-0.00011712530249497;9.2687405413017e-05;-4.6017481508898e-05;-0.00022499451006297;-6.306391878752e-05;-0.00044074916513637;-0.00034586616675369;0.00022322971199173;0.00047560854000039;0.00033966699265875;0.00033103438909166;0.00015157928282861;0.0011824396206066;7.4288713221904e-05;-0.00020534354553092;7.8450066212099e-05;-0.0010004307841882;4.3417807319202e-05;0.00046523616765626;0.00011775459279306;-0.00024154034326784;-0.00015410188643727;-0.00014693001867272;-7.9539728176314e-05;0.0002003272093134;6.5304840973113e-05;0.00037181974039413;3.7371297366917e-05;-6.9578585680574e-05;-7.4164854595438e-05;0.00011237382568652;6.5893051214516e-05;0.0007096859626472;-4.3916502363572e-06;0.00029024371178821;0.00037724711000919;7.8409109846689e-05;-0.00029177984106354;-0.00012802975834347;-0.00030079390853643;0.00019711130880751;-1.1229237316002e-05;0.00014341071073432;-4.5141259761294e-05;-8.6009684309829e-05;-0.0007379402522929;-4.2844232666539e-05;0.00013205785944592;-6.9319439717219e-06;-0.00047806315706111;0.00014900247333571;-0.00037204165710136;-2.6419787900522e-05;-0.00034883955959231;0.00013725884491578;-6.6716376750264e-05;-6.0610025684582e-05;-0.00030381567194127;3.1479962672165e-06;-1.8206486856798e-05;-8.6946085502859e-05;0.0012596172746271;-2.0128401956754e-05;-0.00048368974239565;2.5793260647333e-05;0.00012685438559856;0.00020501292601693;-8.199000149034e-06;0.00024922110605985;-0.00019896666344721;0.00021879179985262;-0.00012861823779531;-6.6694547058432e-06;4.6560799091822e-05;-0.00032637355616316;-1.8743914552033e-05;0.00033524859463796;1.8457734768162e-05;-0.00028461424517445;-2.333711108804e-07;-1.5134989553189e-05;2.8362475859467e-05;0.00011893724149559;-9.8077762231696e-05;-0.00057171005755663;-0.00016925344243646;-0.00057738507166505;-1.8607108358992e-05;0.00024723313981667;4.3906649807468e-05;-1.0574143516351e-06;-4.8072164645419e-05;0.00016299569688272;-0.00010601234680507;8.2460384874139e-05;-3.4438882721588e-05;-0.00018850002379622;-5.8693872233562e-06;-0.00037538807373494;-0.00028338644187897;0.0001547751162434;0.0004218227986712;0.00028807844500989;0.00027848960598931;0.00013224172289483;0.00096632016357034;6.0992868384346e-05;-0.00015802821144462;6.7617234890349e-05;-0.00083408021600917;3.7382433220046e-05;0.00037825069739483;0.00029005878604949;-0.00012055563274771;0.00029133402858861;0.00015560796600766;-3.9072157960618e-05;-2.6396821340313e-05;-0.00011392903979868;-5.9158643125556e-05;4.0388666093349e-05;-9.141150258074e-06;-0.00038602785207331;5.3509833378484e-05;-0.00016405266069341;-5.7707027735887e-05;-0.00017103426216636;-1.782621620805e-05;-0.00043810580973513;-0.00010390215174994;0.00012649988639168;0.00023556486121379;0.00018633078434505;-5.4559382988373e-05;-4.4317122956272e-05;-9.2458023573272e-05;-0.00010412443225505;0.00029635481769219;9.2779060651083e-05;-1.5171586710494e-05;3.5552417102735e-05;0.00019312210497446;2.0436760678422e-05;-0.00034239242086187;0.00011646027996903;-0.00018215687305201;-2.7335301638232e-05;0.00016881029296201;5.9292899095453e-05;-0.00012455922842491;-5.0914386520162e-05;-1.0376318641647e-05;-1.0928079973382e-05;0.0013264496810734;-7.2655733674765e-05;-0.00021498868591152;-2.0323412172729e-05;-3.3255524613196e-05;3.2652413210599e-05;0.00014329150144476;5.256127769826e-05;0.00018571714463178;9.007898188429e-05;-0.00012707746645901;-0.0001650564809097;-6.8360997829586e-05;-0.00069624197203666;5.6238179240609e-05;0.00024841548292898;-1.0140379345103e-05;-0.00046354718506336;2.5145882318611e-05;0.00012531675747596;-1.0120385013579e-05;6.2563660321757e-05;2.9694485419895e-05;-0.00032716430723667;-3.6986799386796e-05;-0.00059737381525338;-9.5960262115113e-05;0.00017877490608953;9.1134488684474e-06;-1.5617482858943e-05;3.7233428884065e-05;-1.0181529432884e-06;-3.0974657420302e-05;-7.0803173002787e-05;-4.2391147871967e-05;-0.00014628528151661;-3.0014225558261e-05;-5.2070692618145e-05;-0.00019714068912435;-0.00021021244174335;0.00025298108812422;0.00010410239337943;0.00025306170573458;0.00015210242418107;0.00093666458269581;5.309472544468e-05;-7.0909569330979e-05;3.0112958484096e-05;-0.00054409721633419;3.5738183214562e-05;0.0003141880442854;1.9593893739511e-05;0.00041985517600551;-0.00014860005467199;0.00035227811895311;0.0001350574020762;-0.00014048216689844;-4.0677674405742e-05;-8.5648920503445e-05;-4.2464860598557e-05;3.9717349864077e-05;1.2987543414056e-05;-0.00084676541155204;7.1543392550666e-05;7.0675989263691e-05;-9.6032803412527e-05;-5.3681185818277e-05;-4.4037333282176e-05;-0.00047275651013479;-0.00020485284039751;2.3270289602806e-05;0.00028163040406071;0.00024408177705482;0.00012928941578139;-2.126057370333e-05;3.0796305509284e-05;-9.0129273303319e-05;9.6901363576762e-05;0.00011479580280138;0.00019369277288206;4.4383592467057e-05;-2.1819714675075e-05;4.8252652049996e-05;-0.00017897861835081;2.833004873537e-05;-1.0714876225393e-05;7.3388844612055e-05;0.00024215680605266;4.161155084148e-05;-5.5237145716092e-05;-5.320256241248e-05;-1.6193211195059e-05;-1.6555939509999e-05;0.0012015748070553;-1.4744102372788e-05;-3.9877824747236e-05;-1.0862619092222e-05;-8.1562779087108e-05;2.6453300961293e-05;-5.6724846217548e-05;9.3364295025822e-05;0.0002130200737156;9.1697052994277e-05;-4.8444639105583e-05;-0.0002659130259417;-0.00010262292198604;-0.00084900279762223;-3.4749682527035e-05;0.00018249957065564;1.725684342091e-05;-0.0005212509422563;1.58798557095e-05;0.00014072144404054;-1.1316019481455e-05;-7.3675678322616e-06;5.6959976063808e-05;8.7086365965661e-05;-1.1069680112996e-05;-0.00042118458077312;-0.00010793494584505;0.00016959250206128;2.3980046535144e-05;-2.7911517463508e-05;4.25287107646e-05;-0.00016662578855176;-2.9957403967273e-05;-2.5191520762746e-05;-3.0368933039426e-06;-8.8074986706488e-05;-3.539174576872e-05;-0.00020319569739513;-0.00011199096479686;-0.00017577612015884;5.079826223664e-05;0.00019510944548529;0.00017802052025218;9.5097027951851e-05;0.00074701302219182;1.5602623534505e-05;-0.00012287583376747;2.2533800802194e-05;-0.00040778936818242;1.5214296581689e-05;0.0002330372662982;1.2800760487153e-05;-9.5808863989078e-05;0.00010611625475576;0.00014401448424906;-8.7891719886102e-05;-5.607950151898e-05;7.4315801612101e-05;-5.2432324082474e-06;2.7337253413862e-05;1.3853503332939e-05;-1.3701354873774e-05;-8.1905680417549e-05;1.3719358321396e-05;0.00020300020696595;-0.0001700450811768;-2.7962132662651e-06;2.6816601348401e-06;-2.7988355213893e-05;1.9555266135285e-06;-1.2892188351543e-05;-2.5635377824074e-05;2.9839970011381e-05;0.00013217306695879;-0.0001402839407092;-9.9258490081411e-05;7.9314821050502e-05;-6.8077650212217e-05;4.4363976485329e-05;-7.727624324616e-05;0.0001006397724268;-5.3868498071097e-05;4.5426717406372e-05;0.00011681024625432;8.7570282630622e-05;-2.7429801775725e-05;-4.144430931774e-06;-4.4265500037e-05;-1.9849994714605e-05;-1.8456456700733e-06;2.2140882265376e-06;-2.5074119548663e-05;-3.6880988773191e-05;4.6031356760068e-05;1.6642932678224e-05;6.7937231506221e-05;6.2626742874272e-05;3.0684132070746e-05;5.1812363381032e-05;-0.00016729872731958;-8.0056357546709e-05;0.00011067295417888;0.00019249423348811;0.00014578957052436;-6.1765240388922e-05;-7.0621143095195e-05;-8.6296851804946e-05;-5.8942936448148e-05;-7.6354781413102e-06;-2.7899188353331e-05;-7.2892195021268e-05;-4.2821200622711e-05;-3.8652360672131e-05;-5.6913970183814e-05;-6.3699611928314e-05;-4.6326520532602e-05;0.00016643397975713;0.00013491515710484;0.00018176097364631;0.00016688043251634;0.00010015738371294;7.8229299106169e-05;6.8316739998409e-07;7.0672244874004e-06;0.00010738892888185;0.000106083083665;0.00019013602286577;0.00019489602709655;-1.6749684164097e-06;7.866537089285e-06;2.7125775886816e-05;8.4533901826944e-05;-7.1060654590838e-05;-0.00013628396845888;-0.00010323663445888;-6.49667927064e-05;-3.826853208011e-05;-0.00017171453509945;-0.00018943267059512;-0.0001813606795622;-0.00016529487038497;-0.00018876920512412;-0.00016598636284471;2.8070115149603e-05;5.8479804465605e-06;-0.0001076212793123;0.00010581434617052;0.00015379696560558;-9.1004752903245e-05;-4.4759548472939e-05;8.9720240794122e-05;-3.2060809189716e-06;3.1381416192744e-05;1.2913555110572e-05;-1.6989632058539e-05;-7.1164329710882e-05;2.5003670089063e-05;0.00021446574828587;-0.00017543502326589;-1.5006196285583e-09;6.8732970248675e-06;-1.9830620658468e-05;1.7263206245843e-05;-8.3723452917184e-06;-4.2834046325879e-05;1.8962327885674e-05;0.00012787891319022;-0.00015759421512485;-0.00011377192276996;7.4267838499509e-05;-7.6324140536599e-05;4.1405048250454e-05;-8.2742692029569e-05;0.0001059981295839;-5.7906730944524e-05;4.3814168748213e-05;0.00011605423787842;9.8243341199122e-05;-2.3622047592653e-05;-1.1458265362307e-05;-4.8325822717743e-05;-2.0328221580712e-05;-3.0475589483103e-06;1.9910100945708e-06;-2.3810407583369e-05;-4.0188817365561e-05;3.7935849832138e-05;2.5717918106238e-05;6.9275170972105e-05;6.6887405409943e-05;2.9799250114593e-05;5.666037031915e-05;-0.00017576990649104;-8.6348351032939e-05;0.00011509240721352;0.00019684790458996;0.00016025669174269;-6.0693459090544e-05;-7.4372241215315e-05;-8.2250408013351e-05;-6.6932509071194e-05;-7.1869876592245e-06;-2.9637792977155e-05;-7.2121918492485e-05;-4.8415920900879e-05;-3.7847818020964e-05;-6.2403094489127e-05;-6.1054372054059e-05;-5.3381387260742e-05;0.00016761741426308;0.00014687514340039;0.00018079625442624;0.00018347223522142;9.8950375104323e-05;8.8137996499427e-05;2.0547543044813e-06;6.1038672356517e-06;0.00010416015720693;0.00012059071741533;0.00018893126980402;0.0002142096782336;-1.9530841655069e-06;7.3770229391812e-06;2.7808468075818e-05;8.840791269904e-05;-7.4544339440763e-05;-0.00013748656783719;-0.00011243886547163;-6.1386017478071e-05;-4.6778593969066e-05;-0.00017332832794636;-0.00020618113921955;-0.00018005361198448;-0.00018138421000913;-0.00018438589177094;-0.00018727425776888;2.748711995082e-05;8.6502586782444e-06;0.00020018150098622;-0.00049791153287515;-0.00013995544577483;-0.00047126368735917;5.0392565754009e-05;0.00018018379341811;5.1347626140341e-05;0.00023466741549782;1.3025643966103e-05;-8.6304855358321e-05;-0.00013218107051216;0.00088264816440642;0.00015765964053571;6.2193241319619e-05;4.5311437133932e-05;0.00014829040446784;0.000580474792514;0.00022314334637485;-0.0001119737062254;-0.00035481512895785;-0.00027247195248492;0.00011913640628336;-0.00020328884420451;0.0001195798322442;2.9668468414457e-05;-0.00017380692588631;-0.00029320170870051;-6.1190097767394e-05;-0.00013321610458661;-5.8101311879e-05;-0.00010822198237292;7.00046075508e-05;-0.0002715207519941;0.00011776050087065;-4.1978233639384e-05;6.1320490203798e-05;0.00028570735594258;-0.00010043381189462;-0.0001695522951195;-1.6033347492339e-05;-1.4128771908872e-05;-2.9933340556454e-05;0.001601513242349;-2.6387780962978e-05;-0.0001852894492913;2.5418385121156e-05;-8.3696380897891e-05;-9.2399473942351e-05;0.00011175374675076;0.00034915778087452;-8.0074030847754e-05;0.00016879760369193;-0.00014485580322798;-0.00035641866270453;-5.6343800679315e-05;-0.0010312754893675;4.8192894610111e-05;0.00032631357316859;1.7530042896396e-05;-0.00066878163488582;-4.2891447264992e-06;0.00018992200784851;8.7583081040066e-05;5.7677616496221e-06;-3.2612028007861e-05;4.9424219469074e-05;-0.00020253729599062;-0.00053823046619073;3.133010250167e-05;0.00027133652474731;5.5776465160307e-05;-3.3437809179304e-05;-6.7776491050608e-05;-0.00011330459528835;-3.2883424864849e-05;6.2653103668708e-05;-5.378986679716e-05;-0.00015059414727148;-0.00029601759160869;-0.00024425366427749;-0.00027560253511183;0.00031918298918754;0.00016052210412454;0.00018490604998078;0.00025526498211548;6.9736743171234e-05;0.00089758250396699;4.7973375330912e-05;-0.00020009675063193;3.6183711927151e-05;-0.00067253632005304;2.7547079298529e-05;0.00035090217716061;0.00019832258112729;-0.00046268929145299;-0.00016992109885905;-0.00047798990271986;4.6936605940573e-05;0.00010303892486263;6.3102015701588e-05;0.00024084016331472;1.9473378415569e-05;-8.4225939644966e-05;-0.00012620573397726;0.00073020940180868;0.00013526879774872;0.00014635796833318;3.6932266084477e-05;0.00019881904881913;0.00059981294907629;0.00017878387006931;-0.00016115730977617;-0.00033901576534845;-0.00025483750505373;0.00012417619291227;-9.865499305306e-05;0.00014168533380143;0.00010799373558257;-0.00016842212062329;-0.00036764729884453;-5.6938413763419e-05;-5.96453610342e-05;-4.5544948079623e-05;-0.00019885756773874;0.00011637383431662;-0.00035463739186525;7.3552466346882e-05;-0.00011600447032833;7.3847477324307e-05;0.00026293727569282;-0.000100485587609;-0.00020856308401562;-1.6246498489636e-05;-8.3596742115333e-06;-6.8062152422499e-05;0.0017036736244336;-3.0892253562342e-05;-0.00026989282923751;3.2033491152106e-05;-7.3260256613139e-05;-9.4701963462285e-06;9.0351197286509e-05;0.00034451388637535;-0.00011928759340663;0.00018168137467001;-0.00013147022400517;-0.0003183355438523;-8.2320912042633e-06;-0.0010017232270911;3.1751595088281e-05;0.00037162652006373;2.7799525923911e-05;-0.0006697797216475;-6.496546575363e-06;0.00020105710427742;7.2904287662823e-05;4.6212979214033e-05;-4.4393058487913e-05;-0.0001342903560726;-0.00019991843146272;-0.00064344168640673;2.3003256501397e-05;0.00028403161559254;5.4886186262593e-05;-3.1034032872412e-05;-6.6337612224743e-05;-7.1930044214241e-05;-5.1498896937119e-05;2.2948410332901e-05;-5.0693899538601e-05;-0.00018488151545171;-0.00023804746160749;-0.0002843267575372;-0.00029310517129488;0.00028368664789014;0.0002582233864814;0.00021281666704454;0.00029055547202006;8.5210951510817e-05;0.0010304889874533;5.3497242333833e-05;-0.00017043184197973;4.8178080760408e-05;-0.00073212618008256;2.8114785891376e-05;0.00040169808198698;0.00018251409346703;-0.00039973927778192;-0.00018866482423618;-0.0004222544375807;1.2641173270822e-05;8.6415020632558e-05;7.0931346272118e-05;0.00028832361567765;2.8116486646468e-05;-8.1349564425182e-05;-0.00011455926141934;0.00052138371393085;0.00010789903899422;0.00034186875564046;2.3253895051312e-05;0.0002514190855436;0.0005746433744207;0.00012914802937303;-0.00022891457774676;-0.00028805510373786;-0.00025649147573858;0.00015443527081516;-2.1843268768862e-05;0.00016091855650302;0.00011608403292485;-0.00014916398504283;-0.0005144210299477;-5.1570514187915e-05;1.633980718907e-05;-3.0143066396704e-05;-0.00031916482839733;0.00015661740326323;-0.00041903372039087;2.4457947802148e-05;-0.00022381762391888;9.9734752438962e-05;0.0001748273789417;-9.3604532594327e-05;-0.00025822906172834;-1.275978047488e-05;-7.9497176557197e-06;-9.8307471489534e-05;0.0017104798462242;-3.1373812817037e-05;-0.00038333120755851;3.638166890596e-05;-2.6308929591323e-05;9.3661990831606e-05;5.8114597777603e-05;0.00032949188607745;-0.00016801194578875;0.00020597669936251;-0.00012687973503489;-0.00023294212587643;3.4312601201236e-05;-0.00084709568182006;9.425044481759e-06;0.00040409780922346;3.2545689464314e-05;-0.0006017506821081;-7.1992931225395e-06;0.00016846993821673;5.337151378626e-05;9.1951886133756e-05;-6.4134794229176e-05;-0.00035536949872039;-0.00019188405713066;-0.00072254071710631;1.1079289834015e-05;0.00028757384279743;5.3178879170446e-05;-2.328738446522e-05;-6.0534512158483e-05;-4.2719730117824e-06;-7.4895935540553e-05;5.5737009461154e-06;-4.6371431380976e-05;-0.000210965576116;-0.00015296845231205;-0.00033798223012127;-0.00031062786001712;0.00023703154874966;0.00036507955519482;0.000249270175118;0.00032566790468991;0.00010443205246702;0.0011410907609388;5.7712401030585e-05;-0.00014910113532096;5.9713871451095e-05;-0.00080673908814788;3.1341136491392e-05;0.00043760609696619;0.00010602048132569;-0.0002228326338809;-0.00012221674842294;-0.00019595818594098;-2.6249193979311e-05;0.00011168005585205;4.4108528527431e-05;0.00022676470689476;2.268403841299e-05;-5.0407594244462e-05;-6.7852161009796e-05;0.00022986288240645;5.4930362239247e-05;0.00037105125375092;6.5737958721002e-06;0.00018761634419207;0.00032899921643548;6.3118670368567e-05;-0.00017970327462535;-0.00014128476323094;-0.00018614747386891;0.00012685013643932;-1.2582102499437e-05;0.00011123128933832;1.7472359559179e-06;-7.8700977610424e-05;-0.00043626921251416;-2.9931881726952e-05;4.4947508285986e-05;-1.1514154721226e-05;-0.00027653618599288;0.00011120486306027;-0.0002824861148838;-7.1188042056747e-06;-0.00021430943161249;8.2929167547263e-05;5.3152572945692e-05;-5.5725926358718e-05;-0.0001912341977004;-4.8398787839687e-06;-7.65347158449e-06;-6.9395427999552e-05;0.0010557086206973;-1.874187910289e-05;-0.00030350111774169;2.4517175916117e-05;2.2902539058123e-05;0.00011811557487817;1.6545085600228e-05;0.00020181947911624;-0.00013645099534187;0.00015093010733835;-8.11866557342e-05;-9.6307841886301e-05;3.5903074603993e-05;-0.00042246776865795;-6.2073731896817e-06;0.00026248881476931;1.9564282411011e-05;-0.00032462034141645;-3.9776191442797e-06;7.0443420554511e-05;2.637566649355e-05;7.5180934800301e-05;-5.6573844631203e-05;-0.00034058495657519;-0.00011881609680131;-0.00047138167428784;-3.5334912240614e-07;0.00018586682563182;3.2135194487637e-05;-7.1553913585376e-06;-3.6580124287866e-05;6.2613195041195e-05;-6.2189079471864e-05;2.0936196960974e-05;-2.6512920157984e-05;-0.0001476069301134;-4.4279273424763e-05;-0.00024646948440932;-0.0002085418527713;0.00012471941590775;0.00028372503584251;0.0001836791052483;0.00021792878396809;8.1634912930895e-05;0.00074115890311077;3.7946723750792e-05;-9.4987582997419e-05;4.4067393901059e-05;-0.00057121319696307;2.3069327653502e-05;0.00029220813303255;0.00057144969468936;-0.0002049275644822;0.0004174345813226;0.00016241346020252;-0.00024030596250668;-4.8002697440097e-05;-6.7827946622856e-05;-2.6806226742337e-05;3.7252659240039e-05;1.9837698346237e-05;-0.0012991827679798;0.0001105008268496;0.000171524414327;-9.0537578216754e-05;4.732885940939e-07;-5.7279845350422e-05;-0.00055104837520048;-0.00024376195506193;-2.3273676561075e-05;0.00029560839175247;0.00029916560743004;0.00021730878506787;-2.3106746084522e-05;0.00024663266958669;-0.00013096832844894;4.7893954615574e-06;0.00012334952771198;0.00037177893682383;3.3263568184339e-05;-0.0001299698051298;5.4215954151005e-05;-0.0001526974956505;-4.8938272811938e-06;7.2467752033845e-05;0.0001147777074948;0.00041981978574768;3.1429794034921e-05;-3.3036154491128e-05;-6.4500243752263e-05;3.7524944218603e-06;-2.9087150323903e-05;0.001403798814863;6.1012233345537e-06;6.9317735324148e-05;-1.3237701750768e-05;-0.00016412958211731;2.7692400180968e-05;-0.00012026156764477;0.00013955374015495;0.00024414023209829;5.6570792366983e-05;-3.5660297726281e-05;-0.00038386136293411;-0.00010665177251212;-0.0011863331310451;-6.4343606936745e-05;0.00019907172827516;3.1492065318162e-05;-0.00068637519143522;1.2958250408701e-05;0.00022057900787331;-8.4544262790587e-06;-4.9324946303386e-05;8.0511286796536e-05;0.00029998016543686;-5.0725275286823e-06;-0.00053081446094438;-0.00012506767234299;0.0001734099641908;5.4113806982059e-05;-2.7093090466224e-05;4.1229232010664e-05;-0.00027167642838322;-4.2991527152481e-05;-5.1322556828381e-05;9.0836687149931e-07;-0.00010852216655621;-4.5784760004608e-05;-0.00028522504726425;-4.7044984967215e-05;-0.00019546387193259;-5.0490074499976e-05;0.00024429612676613;0.00023259686713573;4.2465806473047e-05;0.00080708006862551;1.6526986655663e-05;-9.4501716375817e-05;2.7155416319147e-05;-0.00037591491127387;1.7202884919243e-05;0.00025456040748395;1.4273389751907e-05;0.00047564375563525;-0.00016261037671939;0.00031763571314514;0.00011893810733454;-0.00022042480122764;-3.9232407289091e-05;-4.9298261728836e-05;-1.9344974134583e-05;3.1778010452399e-05;1.6804169717943e-05;-0.0010991968447343;8.7058826466091e-05;0.00016660813707858;-8.2712256698869e-05;6.234697139007e-06;-4.6958612074377e-05;-0.00043172130244784;-0.00021422280406114;-3.441145963734e-05;0.00025407131761312;0.00024217052850872;0.00020315339497756;-1.2839096598327e-05;0.00023458160285372;-9.4542272563558e-05;-1.6306423276546e-05;0.00010067520634038;0.00031102495267987;3.1405419576913e-05;-0.00012110800889786;4.7146080760285e-05;-8.9510547695681e-05;-2.0744850189658e-05;8.1403501098976e-05;0.00010768152424134;0.0003474873083178;2.5430888854316e-05;-2.2866970539326e-05;-5.11005455337e-05;3.6869550967822e-06;-2.4855304218363e-05;0.0011080510448664;1.7101619960158e-05;8.4375416918192e-05;-7.2589023147884e-06;-0.00013487860269379;2.1369736714405e-05;-0.00012498354772106;0.00011603426537476;0.00020100217079744;4.6347704483196e-05;-1.7417876733816e-05;-0.0003171268326696;-9.3589209427591e-05;-0.00098342436831445;-6.8686516897287e-05;0.00015383813297376;2.8110112907598e-05;-0.00055853248341009;6.3258721638704e-06;0.00017349755216856;-6.7671739998332e-06;-5.9623806009768e-05;7.1885348006617e-05;0.00030780342058279;-2.9685465960938e-06;-0.00039573071990162;-0.00010323424066883;0.00014586006000172;4.5285800297279e-05;-2.1515905245906e-05;3.3403528505005e-05;-0.00021570856915787;-3.6206907680025e-05;-1.4653809557785e-05;5.1538063416956e-06;-8.5612533439416e-05;-3.7074456486152e-05;-0.00024540245067328;-2.6414705644129e-05;-0.0001574440539116;-7.0236863393802e-05;0.00020554004004225;0.00017371535068378;3.2042025850387e-05;0.00059348449576646;1.1764412192861e-05;-9.1635360149667e-05;1.9652719856822e-05;-0.00030375644564629;1.1007702596544e-05;0.00019917121971957;1.1449436897237e-05;-0.00019908584363293;0.00020612680236809;0.00020479134400375;-0.00014179927529767;-4.2702005885076e-05;6.9538000389002e-05;-8.9595387180452e-06;3.6061257560505e-05;2.0422299712664e-05;-2.1744619516539e-05;-7.9668061516713e-05;-5.9508129197638e-06;0.00023270268866327;-0.00019819615408778;-3.0944745503803e-06;7.8161465353332e-06;-2.2084665033617e-05;1.0430749171064e-05;-1.3888012290408e-05;-7.2635841206647e-05;5.8310324675404e-05;0.00015232175064739;-0.00016734524979256;-0.0001265646860702;0.00011597228876781;-8.306949166581e-05;5.0546444981592e-05;-7.8494704212062e-05;0.00011400559742469;-6.1731952882838e-05;4.7969715524232e-05;0.00018843408906832;0.00013272365322337;-7.0356007199734e-05;-3.3586868084967e-05;-9.491530363448e-05;-5.410557059804e-05;1.2878468623967e-05;1.7922537153936e-05;-2.39522451011e-05;-3.7597801565425e-05;-1.3854326425644e-05;-1.3865164874005e-05;0.00010161722457269;9.3779075541534e-05;2.5526756871841e-05;4.8888538003666e-05;-0.00020081653201487;-0.00012003868323518;8.8479435362387e-05;0.00025087184621952;0.00018747927970253;-3.4047225199174e-05;-4.948327477905e-05;-3.6651141272159e-05;-3.1551579013467e-05;-2.4112847313518e-05;-4.4794716814067e-05;-0.00010028103861259;-7.2519811510574e-05;-3.6090408684686e-05;-5.5980366596486e-05;-0.0001009642801364;-7.3501752922311e-05;0.00025389925576746;0.00019956854521297;0.00025288842152804;0.0002327541296836;0.00012164385407232;0.00010189598833676;4.6747720716667e-07;7.557631306554e-06;0.00012532612890936;0.00012655291357078;0.00021581040346064;0.00022540286590811;-8.9759232650977e-06;4.8799898877405e-07;0.00011141773575218;0.00022098571935203;-7.1212933107745e-05;-0.00028886491782032;-0.00022807849745732;-0.0001157048609457;-9.4711002020631e-05;-0.00022314341913443;-0.00023962931300048;-0.00020937828230672;-0.00019330721988808;-0.00021359339007176;-0.00019372213864699;4.1208822949557e-05;1.6920026610023e-05;-0.00020675358246081;0.00020333395514172;0.00021246539836284;-0.00014250783715397;-3.3846230508061e-05;8.2947939517908e-05;-7.8407201726804e-06;3.8503731047967e-05;1.9786033590208e-05;-2.3981991034816e-05;-6.9001893280074e-05;6.2582435020886e-06;0.00024183488858398;-0.00020299725292716;-1.5206778698484e-06;1.0494343769096e-05;-1.7358144759783e-05;2.21253685595e-05;-9.6290777946706e-06;-8.4494029579218e-05;4.9573347496334e-05;0.00014876811474096;-0.0001815279974835;-0.0001402447669534;0.00010904426017078;-8.8588029029779e-05;4.9268452130491e-05;-8.4679813880939e-05;0.00011728729441529;-6.4222273067571e-05;4.7502926463494e-05;0.00018321843526792;0.0001436841848772;-6.4904190367088e-05;-4.0331222407985e-05;-9.5371004135814e-05;-5.4648953664582e-05;1.129410975409e-05;1.7685011698632e-05;-2.3445190890925e-05;-4.0085524233291e-05;-1.5213468032016e-05;-7.682236173423e-06;0.00010203762212768;9.6964198746718e-05;2.5824108888628e-05;5.2367111493368e-05;-0.00020707346266136;-0.00012400100240484;9.3242757429834e-05;0.00025245762662962;0.00019916071323678;-3.4824977774406e-05;-5.3245108574629e-05;-3.7969140976202e-05;-3.7093839637237e-05;-2.3478798539145e-05;-4.5897166273789e-05;-9.9298813438509e-05;-7.7079079346731e-05;-3.64574843843e-05;-5.9835179854417e-05;-9.7793905297294e-05;-7.9281322541647e-05;0.00025131952133961;0.00021021872817073;0.00025182182434946;0.00024468151968904;0.00012128731759731;0.00010914782615146;1.3334829418454e-06;7.0888331720198e-06;0.00012413502554409;0.00013739243149757;0.0002159161522286;0.00024047774786595;-8.7876196630532e-06;-9.1200931251478e-08;0.00011029443703592;0.00022117326443549;-7.4462048360147e-05;-0.00028558165649883;-0.00023432954913005;-0.00011263244232396;-9.9524739198387e-05;-0.00022374378750101;-0.00025284988805652;-0.00020953346393071;-0.00020550967019517;-0.00021180824842304;-0.0002101412974298;4.0618971979711e-05;1.9163753677276e-05;0.00016423824126832;-0.00045452304766513;-6.9185727625154e-05;-0.0003591061104089;5.1384573453106e-05;0.00024526924244128;1.3716739886149e-05;0.00013262042193674;1.8355626707489e-06;-5.907458398724e-05;-0.00012036460248055;0.0009998616296798;0.00013106851838529;-0.00010910426499322;4.464204175747e-05;3.1844840123085e-05;0.00041477620834485;0.00020605654572137;-2.9304687814147e-06;-0.00029865850228816;-0.00018744319095276;7.8796656453051e-05;-0.00027748386492021;7.6230120612308e-05;-0.00017348195251543;-0.00013150583254173;-7.2680944867898e-05;-4.0230501326732e-05;-0.00024877543910407;-5.475514990394e-05;6.696289347019e-05;-2.0099208995816e-05;-8.1517653597984e-05;0.00014783145161346;7.1076960011851e-05;2.1754058252554e-05;0.00032715804991312;-7.4425734055694e-05;-6.1891732912045e-05;-1.9989964130218e-05;2.2752905692869e-07;3.3126227208413e-05;0.0011450371239334;-1.185029213957e-05;1.6604988559266e-05;1.2580087059177e-05;-0.00013277718971949;-0.00017380093049724;0.00012354162754491;0.00025793188251555;-1.1543804248504e-05;8.410641021328e-05;-0.00010885131632676;-0.00035398342879489;-0.00010515291069169;-0.00094286049716175;5.5656277254457e-05;0.00020072846382391;-3.9998080865189e-06;-0.00058557593729347;3.5498737815942e-07;0.00019060427439399;8.9946282969322e-05;-6.6627784690354e-05;-2.4972130177048e-06;0.00034611532464623;-0.00014941023255233;-0.00036462783464231;5.1840808737325e-05;0.00018820269906428;3.5950986784883e-05;-2.1522435417864e-05;-5.8455334510654e-05;-0.00016577249334659;-9.476781315243e-07;7.2688213549554e-05;-4.5470278564608e-05;-0.000102623787825;-0.00030501477885991;-7.7308133768383e-05;-0.00019308968330733;0.00027080095605925;-4.5973389205756e-05;6.6309243266005e-05;0.00018162549531553;3.4811557270586e-05;0.0005229621892795;2.6966075893142e-05;-0.00014188187196851;1.3273817785375e-05;-0.0004033645382151;2.0002547898912e-05;0.00022309127962217;0.00022131134755909;-0.0005634929984808;-0.00012295271153562;-0.00049137964379042;5.8060562878381e-05;0.00024783291155472;2.4329057850991e-05;0.00018250447465107;4.264026756573e-06;-7.3475617682561e-05;-0.00015840098785702;0.0011930930195376;0.00014517117233481;-8.8480410340708e-05;5.4758547776146e-05;5.498826794792e-05;0.0005580463912338;0.00023216646513902;-3.8312278775265e-05;-0.00037266663275659;-0.00022088053810876;0.00010956114419969;-0.00028932836721651;0.00012797095405404;-0.00014294273569249;-0.00016392140241805;-0.00013372635294218;-4.2414369090693e-05;-0.00030050441273488;-6.2862971390132e-05;5.1684142817976e-05;9.4842043836252e-06;-0.0001739287545206;0.00016245945880655;7.1311260398943e-05;3.1650106393499e-05;0.00040273633203469;-9.4875984359533e-05;-9.7070762421936e-05;-2.4901009965106e-05;2.2871345208841e-06;1.1959713447141e-05;0.0015207928372547;-2.2050575353205e-05;-3.4551252610981e-05;1.9068022083957e-05;-0.0001664860319579;-0.00017720091273077;0.00015857139078435;0.00032703721080907;-3.8006488466635e-05;9.949960076483e-05;-0.00013442631461658;-0.0004356472636573;-9.8967000667471e-05;-0.0011817413615063;6.4238396589644e-05;0.00028174201725051;6.4147889133892e-06;-0.00074087339453399;-6.5115830238938e-07;0.00025212566833943;0.00010391687828815;-4.8369674914284e-05;-9.3186117737787e-06;0.00032932672183961;-0.00019337471167091;-0.00053678953554481;5.9087888075737e-05;0.00023217279522214;4.7461853682762e-05;-2.9713359253947e-05;-7.3254035669379e-05;-0.00023172842338681;-1.2396031706885e-05;4.1366369259777e-05;-5.772592703579e-05;-0.00013505030074157;-0.00037042703479528;-0.00013265384768602;-0.00024941147421487;0.00034173479070887;4.2780602598214e-06;9.7215292043984e-05;0.00026235470431857;4.9484871851746e-05;0.00078871537698433;4.2823379772017e-05;-0.00015492917736992;2.6303443519282e-05;-0.00051537872059271;2.4269860659842e-05;0.00030000859987922;0.00062635523499921;-0.00027509144274518;0.0005116518586874;0.00022378245193977;-0.00032533777994104;-1.8401795387035e-05;-6.149312685011e-05;2.4491979274899e-05;-4.7520238695142e-06;3.5021377698286e-05;-0.0016995850019157;0.00018255985924043;0.00014720938634127;1.147990951722e-05;0.00017542039859109;-7.2917115176097e-05;-0.00056649494217709;-0.00013815685815644;-5.3029863920528e-05;9.9961347586941e-05;0.00029847121913917;0.00027839952963404;-8.8390690507367e-05;0.00060459296219051;-0.00024649081751704;-0.00012323055125307;8.6086831288412e-05;0.00070170150138438;-3.6708424886456e-05;-0.00033315768814646;3.6052206269233e-05;-0.00015619723126292;-8.1143443821929e-06;0.00017220685549546;9.9624041467905e-05;0.00062082248041406;-1.0805802048708e-05;3.4109332773369e-05;-6.0453043261077e-05;3.5113102057949e-05;-3.6836972867604e-05;0.0012460469733924;1.481314029661e-06;0.00018687074771151;-2.6809568225872e-05;-0.0002440960961394;1.9978602722404e-05;-0.00011268827074673;0.00019629996677395;0.00019228544260841;-9.146657976089e-05;-2.4139477318386e-05;-0.0004682898579631;-5.4083880968392e-05;-0.0012709730071947;-3.818329423666e-05;0.00012915054685436;4.2654624849092e-05;-0.0006776240770705;1.9006716684089e-05;0.00028475196450017;3.5878679227608e-07;-1.8773285773932e-05;5.9632751799654e-05;0.00044413455179892;1.4221892342903e-05;-0.00071601587114856;-8.6515217844862e-05;4.0865201299312e-05;0.00011416119377827;-1.6504709492438e-05;2.1462494260049e-05;-0.00054736254969612;-3.2474366889801e-05;-0.00023260303714778;5.8041910051543e-06;-7.0392990892287e-05;-5.6396107538603e-05;-0.000310030503897;0.00011001055099769;-0.00015154990251176;-0.00020793326257262;0.00024092083913274;0.00036103921593167;-0.00014234514674172;0.00091539160348475;-7.0701780714444e-06;8.9506756921764e-05;3.1013387342682e-05;-3.7218313082121e-05;1.431717282685e-05;0.00015796696243342;1.2736639291688e-05;0.00071925314841792;-0.00029704070766456;0.00050925347022712;0.00023288739612326;-0.00044588284799829;-2.3763344870531e-05;-6.8332905357238e-05;2.5204537450918e-05;3.944915079046e-06;3.6804514820687e-05;-0.0018964471528307;0.00019034251454286;0.00014621601440012;-1.0060484783025e-05;0.00015294880722649;-7.9812423791736e-05;-0.00062662665732205;-0.00019846567010973;-7.4797244451474e-05;0.00019073962175753;0.00033559504663572;0.0003540929465089;-8.5203158960212e-05;0.00073297281051055;-0.00024977509747259;-0.00010004024079535;0.00010131883755093;0.00072526931762695;-2.5530223865644e-05;-0.00032026530243456;4.5199602027424e-05;-0.00012785062426701;-3.7292669730959e-05;0.00012198949843878;0.00013486320676748;0.00064654526067898;6.7152273004467e-06;2.9258042559377e-05;-7.4367293564137e-05;3.2312946132151e-05;-3.823077713605e-05;0.0014221867313609;2.1962381651974e-05;0.00019681418780237;-2.274610051245e-05;-0.0002594706020318;2.3627448172192e-05;-0.00013373026740737;0.00018533953698352;0.00022622010146733;-2.2064796212362e-05;-3.8893347664271e-05;-0.00050887046381831;-6.1392776842695e-05;-0.0013962542871013;-7.1407834184356e-05;0.00015384821745101;4.5450462494045e-05;-0.00077701371628791;1.3940303688287e-05;0.00030899184639566;-4.7970434025046e-07;-5.6959368521348e-05;8.2893981016241e-05;0.00049026811029762;2.3930303996167e-06;-0.00070160336326808;-0.00011053880734835;9.0278110292275e-05;0.00011239975719946;-1.6424412024207e-05;2.5475776055828e-05;-0.00046826968900859;-4.6642460802104e-05;-0.00018197851022705;-8.2892802311108e-07;-0.00010568943980616;-5.867776053492e-05;-0.00032785421353765;0.00010778509749798;-0.00017859454965219;-0.00022839287703391;0.00026268899091519;0.0003420984139666;-0.00011320109479129;0.00090326997451484;1.0913561709458e-05;4.587648800225e-05;3.4564516681712e-05;-0.00016776162374299;2.0471277821343e-05;0.00021626173111144;1.5778296074132e-05;0.00059430726105347;-0.00022844357590657;0.00043623382225633;0.00017417277558707;-0.00025911949342117;-2.9594182706205e-05;-6.3899322412908e-05;-5.3126486818655e-06;2.128658888978e-05;2.4586304789409e-05;-0.0014806222170591;0.00013747418415733;0.00018537572759669;-4.8994355893228e-05;8.1854246673174e-05;-5.9790138038807e-05;-0.00052672013407573;-0.00020832584414165;-3.9325106627075e-05;0.00021916917467024;0.00028528348775581;0.0002439211239107;-4.3825933971675e-05;0.0003801015263889;-0.00016915175365284;-6.496563582914e-05;0.00010099408245878;0.00052718410734087;3.432925495872e-06;-0.0002335540484637;4.6267025027191e-05;-0.00012152795534348;-2.489907637937e-05;0.00015285011613742;0.00012387723836582;0.00047657318646088;1.6592131942161e-05;-2.1818480036018e-06;-5.4646414355375e-05;1.9314849851071e-05;-3.3407948649256e-05;0.0012804865837097;1.753872493282e-05;0.00013015417789575;-1.536235504318e-05;-0.00020567837054841;2.0297773517086e-05;-0.00014364728122018;0.00017957579984795;0.00021675191237591;-2.2019610696589e-05;-2.3029228032101e-05;-0.00040526472730562;-0.00010110780567629;-0.0012032155646011;-7.080590876285e-05;0.00017302502237726;3.8220157875912e-05;-0.00067650707205757;1.04939654193e-05;0.00025006322539411;-2.5137740067294e-06;-4.9495607527206e-05;7.6940908911638e-05;0.00043195972102694;4.7494859245489e-06;-0.00059500249335542;-0.00011296382581349;0.00011372799053788;7.8133423812687e-05;-2.37252588704e-05;3.3346190321026e-05;-0.00042779906652868;-4.13942943851e-05;-0.00012529615196399;4.1137504922517e-06;-8.5147439676803e-05;-5.0606195145519e-05;-0.00031770038185641;2.6365411031293e-05;-0.0001703146554064;-0.00014015700435266;0.00025467501836829;0.00027818550006486;-3.9427904994227e-05;0.00083031429676339;6.0691590988426e-06;-1.84794262168e-05;3.0491637517116e-05;-0.00020153135119472;1.6328511264874e-05;0.00020076571672689;1.2874304047727e-05;0.00045721267815679;-0.00016623830015305;0.00032114266650751;0.00012018565757899;-0.00017905110144056;-2.4166010916815e-05;-4.9816637329059e-05;-1.0969922186632e-05;2.2859048840473e-05;1.699728636595e-05;-0.0011163400486112;9.6768970252015e-05;0.00016881652118172;-5.4375905165216e-05;4.9554124416318e-05;-4.3400628783274e-05;-0.00039338727947325;-0.00018129132513423;-2.9851105864509e-05;0.00019655548385344;0.00021705593098886;0.0001849463878898;-2.2727565010427e-05;0.00023751905246172;-0.00011108478793176;-4.9008081987267e-05;8.1726160715334e-05;0.00038094684714451;1.2416207027854e-05;-0.00017242385365535;3.9429585740436e-05;-7.9580830060877e-05;-2.6063733457704e-05;0.00014167492918205;0.00010553184984019;0.00034254533238709;1.7306527297478e-05;-8.6958543761284e-06;-3.8464171666419e-05;1.2106949725421e-05;-2.6187390176347e-05;0.00098755059298128;1.9674062059494e-05;9.9775192211382e-05;-8.7448952399427e-06;-0.00015233247540891;1.4836638001725e-05;-0.00013147381832823;0.00014651517267339;0.00017531846242491;-1.7330474292976e-05;-1.0616250619933e-05;-0.00030339087243192;-9.726763528306e-05;-0.00093261676374823;-6.6250184318051e-05;0.00014198909047991;3.0325065381476e-05;-0.00052285043057054;5.3015874073026e-06;0.00018372236809228;-2.3080601749825e-06;-4.8876976507017e-05;6.4909298089333e-05;0.00036697325413115;3.881242719217e-06;-0.00043539042235352;-9.4466740847565e-05;0.00010208982712356;5.4306823585648e-05;-2.0944889911334e-05;2.9312877813936e-05;-0.00033216015435755;-3.3657684980426e-05;-7.1961163484957e-05;5.8064797485713e-06;-6.30003050901e-05;-3.8936294004088e-05;-0.00026159975095652;4.823571543966e-06;-0.00013577930803876;-0.00010525353718549;0.00020899789524265;0.00020011620654259;-1.2041220543324e-05;0.00062438688473776;4.2510405364737e-06;-4.0916391299106e-05;2.3156670067692e-05;-0.00017553548968863;1.1444517440395e-05;0.00015629318659194;9.7705797088565e-06;-0.00035438491613604;0.000359147292329;0.00026845833053812;-0.00020634505199268;-1.9093035007245e-05;4.7934085159795e-05;-1.6716359823477e-05;4.7179892135318e-05;2.8255439247005e-05;-3.0185867217369e-05;-4.8633261030773e-05;-5.9768161008833e-05;0.0002485120203346;-0.00021758509683423;-3.3399555832148e-06;1.2440747013898e-05;-1.1388393431844e-05;1.6546291590203e-05;-1.6278369002976e-05;-0.00012574860011227;9.3609596660826e-05;0.00016940329805948;-0.0001851682754932;-0.00016410082753282;0.00017465325072408;-9.1405214334372e-05;5.2348332246765e-05;-7.360837480519e-05;0.00012342663831078;-6.7632521677297e-05;4.9467060307506e-05;0.000287254457362;0.00018708290008362;-0.00013180622772779;-7.1671885962132e-05;-0.00015941748279147;-9.6278257842641e-05;3.8937789213378e-05;4.5391367166303e-05;-2.2940401322558e-05;-3.6316720070317e-05;-0.00012252107262611;-7.6595351856668e-05;0.00014188383647706;0.00013038770703133;2.0358605979709e-05;4.1503582906444e-05;-0.00021321806707419;-0.00014107719471212;4.6031524107093e-05;0.00029306302894838;0.00020657814457081;3.12627207677e-06;-2.1691819711123e-05;5.9836314903805e-05;2.794905230985e-05;-5.4092783102533e-05;-7.1545618993696e-05;-0.00012370964395814;-0.00010233489592792;-3.3684071240714e-05;-5.0483082304709e-05;-0.00015732939937152;-0.00011056782386731;0.00036882076528855;0.00027614407008514;0.00036262589856051;0.00032274887780659;0.00014445769193117;0.00012406396854203;-1.2529710602394e-06;7.3724927460717e-06;0.00014475405623671;0.000140940232086;0.00023882728419267;0.00024484281311743;-1.3509431482817e-05;-5.1089546104777e-06;0.00026415637694299;0.00043220422230661;-5.9410216636024e-05;-0.00052950065582991;-0.00042262597708032;-0.00019558047642931;-0.00017741607734933;-0.00029061266104691;-0.00029272321262397;-0.00024188114912249;-0.00021803396521136;-0.00022959777561482;-0.00020541575213429;5.2465929911705e-05;2.6141862690565e-05;-0.00035805616062135;0.00035302873584442;0.0002723079524003;-0.00020218633289915;-1.0562466741248e-05;5.8471461670706e-05;-1.6343959941878e-05;4.8030331527116e-05;2.7616493753158e-05;-3.1320560083259e-05;-3.469288276392e-05;-4.7112098400248e-05;0.00025163454120047;-0.00021784639102407;-2.9194543458289e-06;1.3542060514737e-05;-1.0067715265905e-05;2.5709683541209e-05;-1.1739646652131e-05;-0.00013276928802952;8.6123087385204e-05;0.00016333282110281;-0.00019448640523478;-0.00017689603555482;0.00016369778313674;-9.2909525847062e-05;5.1436356443446e-05;-7.889519474702e-05;0.00012222102668602;-6.7660424974747e-05;4.931221701554e-05;0.00027435863739811;0.00019864144269377;-0.00012342915579211;-7.8673729149159e-05;-0.00015529539086856;-9.7649804956745e-05;3.7433059333125e-05;4.5496122766053e-05;-2.24293617066e-05;-3.7528989196289e-05;-0.00011843290849356;-7.6123258622829e-05;0.0001402066409355;0.00013144881813787;2.0595771275111e-05;4.2852956539718e-05;-0.00021331790776458;-0.00014035630738363;4.8423469706904e-05;0.00028686108998954;0.00021236711472739;1.4550012110703e-06;-2.3553677237942e-05;5.5107975640567e-05;2.8308817491052e-05;-5.3138584917178e-05;-7.1941343776416e-05;-0.00012153019633843;-0.00010452140122652;-3.372921855771e-05;-5.1905706641264e-05;-0.00015219634224195;-0.00011514425568748;0.0003586859384086;0.00028471645782702;0.00035782667691819;0.00032832691795193;0.00014269771054387;0.00012711419549305;-9.1154691972406e-07;7.1943190960155e-06;0.00014266626385506;0.00014600598660763;0.0002354279422434;0.00025249176542275;-1.286686892854e-05;-5.5975579016376e-06;0.00026226870249957;0.00042858073720708;-6.0562342696358e-05;-0.0005196001729928;-0.00042658144957386;-0.00019229436293244;-0.00017857526836451;-0.00028630363522097;-0.00030007123132236;-0.00023922581749503;-0.0002236618893221;-0.00022545299725607;-0.00021352786279749;5.1294642616995e-05;2.7275364118395e-05;0.00016675157530699;-0.00045815244084224;-6.7394175857771e-05;-0.00035339646274224;4.6024691982893e-05;0.00026329606771469;3.8370963011403e-06;0.00012033007806167;-6.3826934137978e-07;-5.15859319421e-05;-0.00012620884808712;0.0010618943488225;0.00011524717410794;-0.00012314692139626;4.5344178943196e-05;1.3699508372156e-06;0.00039632446714677;0.00019645279098768;1.2957574654138e-05;-0.00029046341660433;-0.00016375428822357;7.978447683854e-05;-0.00029251567320898;8.4567829617299e-05;-0.00023486117424909;-0.00012027419143124;-3.7186404370004e-05;-2.9369130061241e-05;-0.00030033211805858;-5.2210420108167e-05;0.00010730761277955;-3.7188980059e-05;-5.2689771109726e-05;0.00015431825886481;8.946459274739e-05;1.5291318050004e-05;0.00034399042488076;-6.9328511017375e-05;-3.9545237086713e-05;-2.1395375370048e-05;5.6918352129287e-06;4.3324016587576e-05;0.001082829781808;-1.026211612043e-05;5.0867278332589e-05;9.8237405836699e-06;-0.00015217011969071;-0.00018315788474865;0.00013364506594371;0.00023946799046826;-6.2352978602576e-06;6.1822829593439e-05;-0.00010125637345482;-0.00035989430034533;-0.00011195064143976;-0.00093860336346552;5.6838376622181e-05;0.00018195806478616;-7.2014690886135e-06;-0.00058459874708205;2.2060235096433e-06;0.00020393852901179;9.0448542323429e-05;-7.6411197369453e-05;1.9356791653991e-06;0.00040600894135423;-0.00014182939776219;-0.0003644791431725;5.8721579989651e-05;0.0001664838346187;3.1739167752676e-05;-1.865377453214e-05;-5.8515230193734e-05;-0.00020045644487254;1.2401238791426e-06;5.3966614359524e-05;-4.5561901060864e-05;-9.6715637482703e-05;-0.00031015311833471;-3.8409492844949e-05;-0.00017900492821354;0.00026576576055959;-9.3218361143954e-05;3.5204328014515e-05;0.00018400803674012;3.0442486604443e-05;0.00049420294817537;2.6884970793617e-05;-0.00011564525630092;1.2431974028004e-05;-0.00034241037792526;1.8915568944067e-05;0.00020306369697209;0.00023817978217266;-0.00058949890080839;-0.00012550920655485;-0.00049413536908105;5.1153681852156e-05;0.00029701890889555;2.2857786916575e-06;0.00015155119763222;-3.0941971544962e-06;-5.7155732065439e-05;-0.0001791741233319;0.0013694091467187;0.00011509628529893;-0.00014140673738439;6.0341975768097e-05;-1.8655302483239e-05;0.00053420331096277;0.00021497554553207;3.5072075661446e-06;-0.00036624012864195;-0.00016747215704527;0.0001117005595006;-0.00033399453968741;0.0001524076651549;-0.00029005034593865;-0.00014623923925683;-4.0195660403697e-05;-1.9422712284722e-05;-0.00042437383672222;-6.0404294345062e-05;0.00015519133012276;-2.3829370547901e-05;-0.00011986721801804;0.00017747623496689;0.00012714530748781;1.1932455890928e-05;0.00047545798588544;-8.7739681475796e-05;-4.5052245695842e-05;-2.9235181500553e-05;1.4475350326393e-05;3.1786537874723e-05;0.0014173535164446;-2.0831614165218e-05;5.6449265684932e-05;1.4524475773214e-05;-0.00021390977781266;-0.00020604470046237;0.00018494809046388;0.00029507774161175;-1.9686231098603e-05;4.3706731958082e-05;-0.00011619271390373;-0.00047239029663615;-0.00011240909225307;-0.0012257758062333;7.0135283749551e-05;0.00023800082271919;2.0344680251583e-06;-0.00075474090408534;2.1720888980781e-06;0.00028502856730483;0.00010718922567321;-7.1309172199108e-05;2.2105341486167e-06;0.00047338020522147;-0.00017934426432475;-0.00054377474589273;7.7284064900596e-05;0.00018677466141526;3.8778838643339e-05;-2.4066979676718e-05;-7.3509618232492e-05;-0.00031123685766943;-3.9750516407366e-06;4.2897772800643e-06;-5.8850691857515e-05;-0.00012133755808463;-0.00039439139072783;-4.8857760702958e-05;-0.00022264814469963;0.00034090806730092;-0.00010055617167382;2.7144222258357e-05;0.00027476469404064;3.736329745152e-05;0.00072547950549051;4.1558083466953e-05;-0.00010051429853775;2.2476542653749e-05;-0.00038238576962613;2.1548290533246e-05;0.00025560837821104;0.00027694666641764;-0.00060361466603354;-0.00017627075430937;-0.00055759632959962;3.9746690163156e-05;0.00026742415502667;-1.0854582797037e-05;0.00013578207290266;-1.0285793905496e-05;-3.8002344808774e-05;-0.00021274901519064;0.0014684146735817;6.398116966011e-05;-0.00015153840649873;6.7492481321096e-05;-8.4749277448282e-05;0.00056170561583713;0.00015970709500834;6.3035399762157e-06;-0.00036071895738132;-8.3081344200764e-05;0.00012731748574879;-0.00030693574808538;0.00021958441357128;-0.00034230458550155;-0.00013200557441451;1.8187382011092e-05;1.2745823369187e-05;-0.00053584517445415;-5.2794155635638e-05;0.00023400738427881;-2.4569751531089e-06;-0.00016578746726736;0.00015506622730754;0.00017968792235479;-1.1651594832074e-05;0.00056439836043864;-8.3214683400001e-05;-1.3987360034662e-05;-3.3801145036705e-05;2.818360371748e-05;7.0195787884586e-06;0.0014060471439734;-2.9981621992192e-05;9.3935763288755e-05;1.5354018614744e-05;-0.0002549669588916;-0.00018788293527905;0.00021546430070885;0.00026817925390787;-1.7805312381824e-05;-3.3832056942629e-05;-9.1513356892392e-05;-0.00050876592285931;-7.580999226775e-05;-0.0012871007202193;7.0292080636136e-05;0.00021848964388482;1.4908142475178e-05;-0.00076320301741362;1.7394339693055e-06;0.00032299564918503;9.5774063083809e-05;-4.6290591853904e-05;1.036095454765e-05;0.00048698138562031;-0.00016671100456733;-0.0006475854315795;9.1772162704729e-05;0.0001294230169151;3.2776100852061e-05;-2.1920392100583e-05;-6.8416848080233e-05;-0.00042746058898047;-2.7847120236402e-06;-9.3698326963931e-05;-6.0977246903349e-05;-0.00010604350245558;-0.0004048332630191;-7.287837433978e-06;-0.000203460076591;0.00034317089011893;-0.00013086418039165;-3.3440224797232e-05;0.00033686513779685;2.4106015189318e-05;0.00081788172246888;4.7414050641237e-05;-1.7452921383665e-05;2.5141602236545e-05;-0.00024227365793195;1.7373024093104e-05;0.00022246071603149;0.00024978822330013;-0.00049877911806107;-0.00017398499767296;-0.00054018665105104;2.7589168894337e-05;0.00012637942563742;-1.0328423741157e-05;0.00010920871136477;-1.2279897418921e-05;-2.1406876840047e-05;-0.00019623241678346;0.0012707514688373;2.5515584638924e-05;-0.00016877893358469;5.9119069192093e-05;-0.00012817434617318;0.00048311392311007;9.4042406999506e-05;-6.9015554799989e-06;-0.0002971327630803;5.3595531426254e-06;0.00011299889592919;-0.00020659423898906;0.00021899864077568;-0.0002202515170211;-0.00010328758799005;7.2371236456092e-05;3.0047880500206e-05;-0.00053377740550786;-4.0408660424873e-05;0.0002732212014962;1.8453118173056e-05;-0.00017551533528604;0.00011745782830985;0.00025394163094461;-3.2753578125266e-05;0.0005121321300976;-5.7252589613199e-05;4.7021349018905e-06;-3.2518441003049e-05;3.3152900869027e-05;-1.3381987628236e-05;0.0011387746781111;-2.9872346203774e-05;0.00010455772280693;9.9623366622836e-06;-0.00023953120398801;-0.00017486406431999;0.00022617816284765;0.00020611722720787;8.1795751611935e-06;-0.00012093668192392;-8.2956736150663e-05;-0.00043642093078233;-4.0891201933846e-05;-0.0011180664878339;6.2484599766321e-05;0.00017588266928215;2.0600125935744e-05;-0.00062721793074161;1.7253096302738e-06;0.00028787733754143;6.9206900661811e-05;-1.2954743397131e-05;2.4719454813749e-05;0.00047144049312919;-0.00013130757724866;-0.00064784800633788;9.1962348960806e-05;5.1600047299871e-05;2.6641673684935e-05;-2.1339887098293e-05;-4.8615896957926e-05;-0.00053423980716616;6.9560060182994e-06;-0.00016956253966782;-5.700135443476e-05;-5.2465460612439e-05;-0.00038281801971607;2.0495237549767e-05;-0.00015508093929384;0.00031386263435706;-0.0001443953224225;-8.4591061749961e-05;0.00035144219873473;-4.1647317630122e-06;0.00081107282312587;4.4578981032828e-05;4.5264270738699e-05;1.7728447346599e-05;-4.8224683268927e-05;1.1680695934047e-05;0.00013595781638287;0.00071497686440125;-0.00031661908724345;0.00046430647489615;0.00024291149748024;-0.00054604740580544;3.5862383356289e-06;-6.8575674958993e-05;5.2487939683488e-05;-1.6682508430677e-05;4.4926404370926e-05;-0.0019898260943592;0.00021614754223265;9.5537383458577e-05;3.3106571208918e-05;0.00022960697242524;-8.4880550275557e-05;-0.00057551020290703;-0.00015975811402313;-0.00010103529348271;0.00012927586794831;0.00030200794572011;0.0004176770162303;-0.00011233502300456;0.00095332786440849;-0.00028794651734643;-0.00014051840116736;7.593170448672e-05;0.00083497335435823;-5.4946460295469e-05;-0.0003936885332223;3.7582343793474e-05;-8.7861066276673e-05;-5.2986226364737e-05;0.00017375420429744;0.00013118528295308;0.00069279776653275;-1.1201726010768e-05;5.9949590649921e-05;-6.6572705691215e-05;3.8224523450481e-05;-3.5472658055369e-05;0.0011680318275467;3.1539439078188e-05;0.00025663358974271;-2.4751610908424e-05;-0.00024928950006142;1.4722971172887e-05;-0.00014122997527011;0.0001987369323615;0.00018768754671328;-9.236294135917e-05;-1.9784529285971e-05;-0.00050742592429742;-4.1562809201423e-05;-0.00130351819098;-7.1589274739381e-05;7.9900331911631e-05;5.1469374739099e-05;-0.00067275058245286;1.2055215847795e-05;0.00027710595168173;4.5652727749257e-06;-6.0055277572246e-05;7.7128337579779e-05;0.00057742919307202;5.2078121370869e-06;-0.00064953055698425;-9.4799273938406e-05;2.7159025194123e-05;0.00012979241728317;-8.5800757005927e-06;1.4525140613841e-05;-0.00052474153926596;-4.2725620005513e-05;-0.00020132465579081;5.3968568636265e-07;-7.0968773798086e-05;-5.9831610997207e-05;-0.00032517459476367;0.00018683267990127;-0.00013992396998219;-0.00032990143517964;0.000257222505752;0.00034314949880354;-0.00018879910930991;0.00078068289440125;5.3077328630025e-06;9.650643914938e-05;3.6330799048301e-05;-1.1820232430182e-05;1.7381496945745e-05;0.0001379248133162;1.5056256415846e-05;0.00070589006645605;-0.00029307688237168;0.00037732048076577;0.0002139412536053;-0.00064201140776277;2.5186275252054e-06;-6.5193693444598e-05;5.6281667639269e-05;-1.2290394806769e-05;4.2687421228038e-05;-0.0019532025326043;0.00019536913896445;5.6003977078944e-05;1.9487166355248e-05;0.0001964299735846;-8.0805097240955e-05;-0.00053746462799609;-0.00019064580556005;-0.00012134023563704;0.00018755253404379;0.0002899216779042;0.00046510022366419;-9.971133840736e-05;0.0010476941242814;-0.00025449221720919;-0.00010628534073476;7.1365437179338e-05;0.00077793997479603;-4.3574898882071e-05;-0.00034379513817839;3.8385835068766e-05;6.9530437940557e-06;-0.00010376525460742;6.0764457884943e-05;0.00016408714873251;0.00058797211386263;1.3378153198573e-05;5.7972094509751e-05;-6.9441834057216e-05;3.0479262932204e-05;-2.8792715966119e-05;0.001066729426384;6.6901477111969e-05;0.00023857767519075;-1.1567265573831e-05;-0.00022761247237213;1.236565731233e-05;-0.00014996949175838;0.00013762430171482;0.00017540743283462;2.2673906642012e-05;-3.3756507036742e-05;-0.00045399813097902;-2.9798768082401e-05;-0.0011536539532244;-0.00011597713455558;7.4186827987432e-05;4.6391625801334e-05;-0.00064480159198865;-1.1255892786721e-06;0.00025679697864689;4.9991808737104e-06;-9.9870783742517e-05;9.0099529188592e-05;0.00057693023700267;-1.0020669833466e-05;-0.000507275108248;-9.8245021945331e-05;5.8291105233366e-05;0.00011660200107144;-3.7623121897923e-06;1.1697432455549e-05;-0.00036359851947054;-5.0680409913184e-05;-0.00012128618254792;-8.0711015471024e-06;-9.2296424554661e-05;-5.3626135922968e-05;-0.00028398653375916;0.00020251102978364;-0.00013364083133638;-0.00035999377723783;0.0002318155602552;0.00026267001521774;-0.00016214996867348;0.00059751770459116;2.449792191328e-05;5.1854694902431e-05;3.4842058084905e-05;-0.00010949693387374;2.0889619918307e-05;0.00016112418961711;1.6657628293615e-05;-0.00059426366351545;0.00059534475440159;0.00032328418456018;-0.00027332830359228;1.8447297406965e-05;1.2975007848581e-05;-3.0425686418312e-05;6.5304171585012e-05;3.8101363315945e-05;-4.0844075556379e-05;3.5064818803221e-05;-0.00017035100609064;0.00025372713571414;-0.00022962098591961;-2.7598237011262e-06;1.8520893718232e-05;1.0354136975366e-05;2.3489103114116e-05;-2.0395953470143e-05;-0.00018005524179898;0.00012233841698617;0.00018624775111675;-0.00020016766211484;-0.00022437468578573;0.00026690980303101;-9.3418624601327e-05;4.5136566768633e-05;-6.7021981521975e-05;0.00013614067574963;-7.4073432188015e-05;4.9715068598744e-05;0.00043032190296799;0.00025766203179955;-0.00021295635087881;-0.00011789560812758;-0.00023189118655864;-0.00013544590910897;8.3212195022497e-05;9.2595670139417e-05;-2.4196786398534e-05;-3.6354573239805e-05;-0.00030837400117889;-0.00018447679758538;0.00019461443298496;0.00017809290147852;1.9305298337713e-05;3.4497788874432e-05;-0.0001758821454132;-9.9970551673323e-05;-1.3873727766622e-05;0.00028156785992905;0.00016713084187359;3.7112138670636e-05;-5.3690318964073e-06;0.00022243864077609;0.00012721843086183;-0.00010861243936233;-0.0001183098211186;-0.00013993207539897;-0.00013178963854443;-3.530251342454e-05;-4.5136981498217e-05;-0.00025049783289433;-0.00017023789405357;0.00053037004545331;0.00037331995554268;0.00054873590124771;0.00046907889191061;0.00017161772120744;0.00014793821901549;-5.0621642913029e-06;6.0084312281106e-06;0.00017144245794043;0.00015704959514551;0.00026477425126359;0.00026097430964001;-1.063916079147e-05;-4.147652816755e-06;0.00054790801368654;0.00076381396502256;-3.0950042855693e-05;-0.00092254765331745;-0.00073903298471123;-0.0003239783400204;-0.00030512223020196;-0.00039299385389313;-0.00036383239785209;-0.00029179459670559;-0.00025265797739848;-0.00023555662482977;-0.00020434467296582;5.9299491113052e-05;3.1064853828866e-05;-0.00059143442194909;0.00057937519159168;0.00032391818240285;-0.00025726284366101;2.8880980607937e-05;2.5854978957796e-05;-3.0229057301767e-05;6.4862724684644e-05;3.7078771129018e-05;-4.1117691580439e-05;5.7398316130275e-05;-0.00015084388724063;0.00025253050262108;-0.00022446952061728;-3.8442626646429e-06;1.8029146303888e-05;5.2864897952531e-06;3.4041117032757e-05;-1.3661535376741e-05;-0.00018192433344666;0.00011171821097378;0.00017465799464844;-0.00020864812540822;-0.00024159329768736;0.00024396408116445;-9.1074405645486e-05;4.442499630386e-05;-7.4387600761838e-05;0.00012982946645934;-7.1234964707401e-05;4.9874804972205e-05;0.00039918144466355;0.00027574633713812;-0.00019536890613381;-0.00012755424540956;-0.0002165662299376;-0.00013714493252337;8.0848767538555e-05;9.238797792932e-05;-2.3421056539519e-05;-3.7132758734515e-05;-0.00029010837897658;-0.00019095800234936;0.00018952682148665;0.0001766559726093;1.9363407773199e-05;3.5216089599999e-05;-0.00016708082694095;-9.0542060206644e-05;-1.1168860510224e-05;0.00026062643155456;0.00016607219004072;3.0289551432361e-05;-6.9943389462424e-06;0.00020581080752891;0.00013432570267469;-0.00010625155846355;-0.00011821005318779;-0.00013667240273207;-0.00013068907719571;-3.4567197872093e-05;-4.5620628952747e-05;-0.00023936276556924;-0.00017610625945963;0.00050271669169888;0.00038381363265216;0.00053517852211371;0.00046998154721223;0.00016756748664193;0.00014709249080624;-5.1785887080769e-06;6.2002645790926e-06;0.00016790904919617;0.00015825474110898;0.00025543291121721;0.00026462311507203;-9.3983680926613e-06;-4.189018454781e-06;0.00054307811660692;0.00074978382326663;-3.0791245080763e-05;-0.00089482142357156;-0.00074069580296054;-0.00031757322722115;-0.00030070112552494;-0.00037893396802247;-0.00036882300628349;-0.00028457856387831;-0.00025397338322364;-0.00022781777079217;-0.00020689876691904;5.7461566029815e-05;3.0749317375012e-05;0.00022427979274653;-0.00046928616939113;-0.0001421512424713;-0.00037500451435335;1.2978116501472e-05;0.0003000618016813;-2.5601553716115e-05;9.2253772891127e-05;-1.3536870937969e-05;-1.6434240023955e-05;-0.00017613201634958;0.0011837400961667;2.4334527552128e-05;-8.5474814113695e-05;5.5016786063788e-05;-9.8385899036657e-05;0.00039952655788511;0.00011124963930342;3.3083430025727e-05;-0.00025257086963393;-5.4990741773508e-05;0.00010524390381761;-0.00028616734198295;0.00019016419537365;-0.0004258009721525;-8.4211140347179e-05;3.4249798773089e-05;2.5095132514252e-05;-0.00045748596312478;-3.7141264328966e-05;0.00020909808517899;-2.1240603018668e-05;-9.3050606665201e-05;0.00011764818191295;0.00012334938219283;-1.3320368452696e-05;0.00046323271817528;-6.2270257330965e-05;1.5617590179318e-05;-2.4426135496469e-05;2.3648946807953e-05;1.7129223124357e-05;0.00096514477627352;-2.2958090994507e-05;0.00011298436584184;9.6905314421747e-06;-0.00019357842393219;-0.00013172569742892;0.00015847089525778;0.00018075351545122;-1.5413228538819e-05;-3.8272413803497e-05;-4.7938621719368e-05;-0.00039502116851509;-6.1190730775706e-05;-0.00094316655304283;5.3349322115537e-05;0.00012134229473304;9.485494956607e-06;-0.00054699886823073;2.8533970635181e-06;0.00023587110626977;7.5453135650605e-05;-5.0895774620585e-05;2.7842213512486e-06;0.00040066122892313;-0.00011904159327969;-0.00043749221367761;7.3900839197449e-05;7.7289914770517e-05;1.7529715478304e-05;-9.3241260401555e-06;-5.4269210522762e-05;-0.00029208199703135;-4.6397103687923e-06;-6.2264276493806e-05;-4.3462958274176e-05;-7.808882946847e-05;-0.0002870746247936;4.0372018702328e-05;-0.00013570571900345;0.00024433378712274;-0.00015413192159031;-5.3108684369363e-05;0.00023609498748556;2.3734972273814e-05;0.00051253056153655;3.5761084291153e-05;6.0046722865081e-06;2.0110013792873e-05;-0.00014211673988029;1.2092742508685e-05;0.00014504449791275;0.00026682351017371;-0.00051933608483523;-0.00017493731866125;-0.00045452502672561;8.7916288293854e-07;0.00026061572134495;-3.0228442483349e-05;9.9609707831405e-05;-1.9052362404182e-05;-8.1948855950031e-06;-0.00021446359460242;0.0013618640368804;2.7476357900014e-06;-0.00013268613838591;6.2440667534247e-05;-0.00016922067152336;0.00043265614658594;9.6173709607683e-05;3.0995164706837e-05;-0.00026221890584566;-5.2686805247504e-06;0.00012002218863927;-0.00028637575451285;0.00024029123596847;-0.00043749224278145;-8.2796032074839e-05;9.5469047664665e-05;4.6423530875472e-05;-0.00059343402972445;-3.8679958379362e-05;0.00031189870787784;-1.5628915207344e-05;-0.00011995046224911;0.00012666011753026;0.00026518240338191;-3.6992318200646e-05;0.00055492506362498;-5.3237181418808e-05;3.3511765650474e-05;-3.0449744372163e-05;3.4439010050846e-05;1.1352290130162e-05;0.00098611460998654;-2.8801065127482e-05;0.00016602089453954;4.3364752855268e-06;-0.0002284698857693;-0.00017820070206653;0.00023350612900686;0.00018219144840259;1.435146714357e-05;-0.00015487255586777;-7.130181620596e-05;-0.00044499643263407;-5.8267054555472e-05;-0.0010779125150293;6.6365530074108e-05;0.00011368057312211;1.4597585504816e-05;-0.00057295541046187;5.435459115688e-06;0.00025936524616554;8.0561003414914e-05;-4.5454864448402e-05;1.6034975487855e-05;0.00056274892995134;-0.00013154864427634;-0.00055715051712468;9.8817348771263e-05;2.7232725187787e-05;1.8189088223153e-05;-1.1714070751623e-05;-5.6135952036129e-05;-0.00050283817108721;3.5531495541363e-06;-0.00013680738629773;-5.5488362704637e-05;-4.2698411562014e-05;-0.00037601400981657;8.379909559153e-05;-0.00013320620928425;0.00031163479434326;-0.00024062643933576;-0.00012027458433295;0.00032195376115851;6.5875774453161e-06;0.00064664502860978;4.6697281504748e-05;5.3973682952346e-05;1.9164652258041e-05;5.3707180995843e-06;1.1467001058918e-05;9.5526789664291e-05;0.00068993214517832;-0.00030597593286075;0.00034215426421724;0.00022199540399015;-0.00066708005033433;2.5774539608392e-05;-6.8566681875382e-05;6.830307393102e-05;-2.3750628315611e-05;4.6653382014483e-05;-0.0019495665328577;0.00021282772650011;2.9058419386274e-05;4.5774777390761e-05;0.00024051980290096;-8.1763981143013e-05;-0.00049344409490004;-0.0001631160848774;-0.00012765391147695;0.00015054814866744;0.00025617668870836;0.00048341139336117;-0.00011525178706506;0.001121093868278;-0.00027993408730254;-0.00012667512055486;5.4533291404368e-05;0.00082734751049429;-6.1953913245816e-05;-0.00038493901956826;3.35673103109e-05;5.8273335525882e-06;-9.7284624644089e-05;0.00013524929818232;0.0001497840275988;0.00060845579719171;-1.4860725059407e-06;7.0312329626177e-05;-5.8915957197314e-05;3.2921772799455e-05;-2.7210420739721e-05;0.0008919948595576;6.3043953559827e-05;0.00026547949528322;-1.5410651030834e-05;-0.00021101311722305;5.9718104239437e-06;-0.00015195751620922;0.0001647446770221;0.00015162842464633;-6.0264188505244e-05;-1.5636103853467e-05;-0.00044302604510449;-3.0960902222432e-05;-0.0010859890608117;-0.00010411998664495;3.0111708838376e-05;5.0428901886335e-05;-0.00055570277618244;7.0315780931196e-07;0.00022425591305364;8.0639747466194e-06;-9.3797927547712e-05;8.4560408140533e-05;0.0006213259184733;-6.5736098804337e-06;-0.00047304260078818;-9.1637703008018e-05;1.5227298717946e-05;0.00012150876136729;-1.0539132517806e-06;6.7736750679614e-06;-0.00041995680658147;-4.7599223762518e-05;-0.00013640032557305;-6.097225650592e-06;-6.0449685406638e-05;-5.3748106438434e-05;-0.0002908393216785;0.00023017637431622;-0.0001063865274773;-0.0003993226273451;0.00023597211111337;0.00026281096506864;-0.00019822083413601;0.00053166499128565;1.9072649592999e-05;7.9660472692922e-05;3.7193069147179e-05;4.3450668272271e-06;1.8741282474366e-05;0.00010101743828272;1.5075980627444e-05;0.0006770106847398;-0.00027940611471422;0.00022034785069991;0.00017946730076801;-0.00074023206252605;3.5078894143226e-05;-6.6576038079802e-05;6.8945671955589e-05;-2.333285556233e-05;4.5297503675101e-05;-0.0019258070969954;0.00019065900414716;-6.3967463574954e-06;3.8062811654527e-05;0.00023238296853378;-7.2756614827085e-05;-0.00041048854473047;-0.00020195727120154;-0.00014717598969582;0.00020993607176933;0.00021777616348118;0.00052476447308436;-9.0534289483912e-05;0.001221492770128;-0.00023925553250592;-0.00011345851089573;3.9004058635328e-05;0.00080536276800558;-5.5685988627374e-05;-0.000364383100532;3.1857773137745e-05;0.00016807900101412;-0.00019045837689191;5.5660697398707e-05;0.00021446977916639;0.0004515883338172;3.4617602068465e-05;7.1503112849314e-05;-4.7497476771241e-05;2.4744664187892e-05;-1.7405165635864e-05;0.00063125404994935;0.00012984074419364;0.00025708295288496;6.0540883168869e-06;-0.00017860345542431;-6.8425406425376e-06;-0.0001989621669054;0.00012303117546253;0.00012256352056284;3.5117394872941e-05;-2.0325969671831e-05;-0.00035242896410637;-4.5158009015722e-05;-0.00083936436567456;-0.00018860639829654;9.12133964448e-06;4.8975500249071e-05;-0.00047114954213612;-2.2679210815113e-05;0.00018248015840072;1.3297556506586e-05;-0.00015083368634805;0.00010679337719921;0.00076248886762187;-2.6103276468348e-05;-0.00031361303990707;-0.00010153115727007;2.3557939130114e-05;0.00012172054266557;3.7002421322541e-06;2.5110823571595e-06;-0.00035640428541228;-5.9167654399062e-05;-6.1866288888268e-05;-1.6535344911972e-05;-5.6247859902214e-05;-5.3477939218283e-05;-0.00028186553390697;0.00030641700141132;-8.8005333964247e-05;-0.00053990102605894;0.00023796247842256;0.00018786404689308;-0.00021801963157486;0.00033206437365152;4.0606420952827e-05;4.0105634980137e-05;4.2609844967956e-05;-8.4314388004714e-06;2.3103135390556e-05;8.2160826423205e-05;1.8337714209338e-05;-0.0007189204916358;0.00073463493026793;0.00026569815236144;-0.00028622196987271;4.3619704229059e-05;-5.2270814194344e-05;-3.8261106965365e-05;6.9484907726292e-05;3.8504091207869e-05;-4.0666465793038e-05;0.00011471944890218;-0.0003052041574847;0.00017683695477899;-0.00017635810945649;2.5280933186878e-06;2.3170658096205e-05;5.3219104302116e-05;8.4837956819683e-06;-3.0320876248879e-05;-0.00017369784472976;0.0001149795280071;0.00016281226999126;-0.00013780198059976;-0.00020557540119626;0.00034491991391405;-6.7630884586833e-05;1.5682097000536e-05;-2.8709340767819e-05;0.00012441222497728;-6.4430809288751e-05;3.2364390790462e-05;0.00053184037096798;0.00022402087051887;-0.00027313895407133;-0.00011264090426266;-0.00026775363949127;-0.00012112387776142;0.00011839946091641;0.00012554669228848;-2.1760264644399e-05;-2.6198436898994e-05;-0.00049770280020311;-0.00024707335978746;0.00020342717471067;0.00018178603204433;1.779578087735e-05;1.8604758224683e-05;-6.8476030719467e-05;4.3271193135297e-06;-8.2152735558338e-05;0.00018205500964541;3.6193338019075e-05;6.7372660851106e-05;-8.1723476341722e-07;0.0004016260500066;0.00019300487474538;-0.00015240482753143;-0.00014356915198732;-0.00010728331108112;-0.00012275080371182;-3.2983403798426e-05;-2.8170441510156e-05;-0.00031529474654235;-0.00018429511692375;0.00061928282957524;0.00035231510992162;0.00065663811983541;0.00052089086966589;0.00015576749865431;0.00013330797082745;-8.3296763477847e-06;6.0764688214476e-07;0.0001572069741087;0.00012946732749697;0.00022966616961639;0.00019380792218726;1.3102109051033e-06;4.5264209802554e-06;0.00077094609150663;0.00098485941998661;1.9350987713551e-05;-0.0012076403945684;-0.00092104851501063;-0.00040269587771036;-0.0003875449183397;-0.00043210195144638;-0.00033175011049025;-0.00028063342324458;-0.00022189145965967;-0.00017221248708665;-0.00013323678285815;4.4915792386746e-05;2.3808190235286e-05;-0.0010076521430165;0.0010051634162664;0.00034393751411699;-0.00033168858499266;7.1780144935474e-05;-3.4759363188641e-05;-5.5219210480573e-05;9.9824726930819e-05;5.3522267990047e-05;-5.7887165894499e-05;0.00021267512056511;-0.00039642155752517;0.00025610401644371;-0.00024164143542293;-1.0735974456111e-06;3.020324766112e-05;5.6647484598216e-05;3.1780829885975e-05;-3.0187211450539e-05;-0.0002253159909742;0.00012523602345027;0.00021860923152417;-0.00022486671514343;-0.00032169118640013;0.00042454912909307;-9.1369933215901e-05;2.2647871446679e-05;-6.5441767219454e-05;0.00016970335855149;-8.5469437181018e-05;4.8300880735042e-05;0.00067701691295952;0.00036435615038499;-0.00033119390718639;-0.00017569681222085;-0.00030323263490573;-0.00014966174785513;0.00016649483586662;0.0001825569634093;-3.2570671464782e-05;-4.3270458263578e-05;-0.00064512400422245;-0.00037521572085097;0.00028383964672685;0.00025686592562124;3.0236986276577e-05;3.4533313737484e-05;-1.8175696823164e-05;0.00010113133612322;-9.3668670160696e-05;0.00013428243983071;-1.8053318854072e-05;4.4058622734156e-05;-3.6380257370183e-05;0.00050193490460515;0.00029107060981914;-0.00021941646991763;-0.00021275471954141;-0.00015205316594802;-0.00016767290071584;-4.8411897296319e-05;-4.5825552660972e-05;-0.00043406328768469;-0.00028430711245164;0.00080273032654077;0.00051547726616263;0.00091399042867124;0.00075051304884255;0.00021533051040024;0.00018139733583666;-1.2697353668045e-05;2.8749618650181e-06;0.00022832755348645;0.00019211182370782;0.00031246858998202;0.00028690265025944;6.7832229433407e-06;1.1181706213392e-05;0.0011329463450238;0.0013495931634679;2.679511817405e-05;-0.0016539100324735;-0.0013208764139563;-0.00055806600721553;-0.00052942126058042;-0.00058649957645684;-0.00048905157018453;-0.00039409383316524;-0.00032381663913839;-0.0002387200074736;-0.00019470164261293;6.1382343119476e-05;2.9418377380352e-05;-0.00098605512175709;0.00095600046915933;0.00033614982385188;-0.00027188658714294;8.9430170191918e-05;-8.5836181824561e-06;-5.4535397794098e-05;9.709109144751e-05;5.0877628382295e-05;-5.648837031913e-05;0.00026416720356792;-0.00035311668762006;0.00024606997612864;-0.00022090900165495;-6.1178020587249e-06;2.603641951282e-05;2.9804801670252e-05;5.2125320507912e-05;-1.5392544810311e-05;-0.00021240462956484;9.847353794612e-05;0.00018881935102399;-0.00023722361947875;-0.00035686150658876;0.00036046537570655;-7.953007298056e-05;2.146468796127e-05;-8.1832527939696e-05;0.00015054695541039;-7.5260104495101e-05;4.8674712161301e-05;0.00058679410722107;0.00040582663496025;-0.00028273611678742;-0.00019269752374385;-0.00024978659348562;-0.00014860015653539;0.00016135894111358;0.00018094376719091;-3.0914085073164e-05;-4.4319374865154e-05;-0.00058235245523974;-0.00040050139068626;0.00026811883435585;0.00024910512729548;2.9892324164393e-05;3.6300727515481e-05;2.0770305127371e-05;0.00014360730710905;-8.603270543972e-05;6.259619112825e-05;-4.426040686667e-05;1.6686435628799e-05;-4.1841598431347e-05;0.00044667205656879;0.00031446406501345;-0.00021286631817929;-0.00021244403615128;-0.00014527194434777;-0.00015669930144213;-4.5108277845429e-05;-4.6704542910447e-05;-0.00040208728751168;-0.00029875268228352;0.00071585399564356;0.00053730106446892;0.00087231397628784;0.00074428325751796;0.0002036737423623;0.000171161009348;-1.3830293937644e-05;4.0018157960731e-06;0.00021987447689753;0.00018693410675041;0.00028390108491294;0.00028583712992258;1.0155721611227e-05;1.3360356206249e-05;0.001122264075093;0.0013015115400776;2.9679880753974e-05;-0.0015683165984228;-0.0013195381034166;-0.00053977302741259;-0.00050941476365551;-0.00054066209122539;-0.00049446412594989;-0.00037278974195942;-0.00031832972308621;-0.00021889562776778;-0.00018708150309976;5.7352473959327e-05;2.4475897589582e-05;-0.0006437330157496;0.00061238260241225;0.00018969108350575;-0.0001294084941037;6.7690874857362e-05;-2.303081600985e-06;-3.6029690818395e-05;6.1327198636718e-05;3.0953095119912e-05;-3.4728975151666e-05;0.00021907153131906;-0.00023364977096207;0.00013269520422909;-0.00011445302516222;-6.5795152295323e-06;1.4577032743546e-05;7.9683004514663e-06;4.0439103031531e-05;-3.9315536923823e-06;-0.00011213009565836;3.5930355807068e-05;9.718764340505e-05;-0.00014271144755185;-0.00024397806555498;0.00020740143372677;-3.5106440918753e-05;4.9635250434221e-06;-5.3557992941933e-05;8.174755203072e-05;-3.9714803278912e-05;2.7989408408757e-05;0.00034183604293503;0.000276767736068;-0.00015987937513273;-0.00012562228948809;-0.00012800125114154;-8.5716856119689e-05;0.0001096008636523;0.00012319080997258;-1.8959204680868e-05;-2.7282543669571e-05;-0.00037536773015745;-0.00028984516393393;0.00016443208733108;0.00015575643919874;1.9392949980102e-05;2.1999288946972e-05;6.5298168919981e-05;0.0001584394776728;-6.292720354395e-05;-3.7851572415093e-05;-8.76257327036e-05;-8.0076288213604e-06;-3.5849145206157e-05;0.00028782692970708;0.00022947062097955;-0.00014348531840369;-0.00014305557124317;-8.0887410149444e-05;-8.8331587903667e-05;-2.7151139875059e-05;-2.8164689865662e-05;-0.00025462891790085;-0.00020663769100793;0.00042885783477686;0.00035981569089927;0.00056621967814863;0.00049215991748497;0.00012064443581039;9.8688709840644e-05;-1.0870900041482e-05;2.0020736428705e-06;0.00013249285984784;0.00010807393846335;0.00015686880215071;0.00016678053361829;1.305979276367e-05;1.4465636922978e-05;0.0007715416722931;0.00086663226829842;3.4337241231697e-05;-0.0010293236700818;-0.00090028851991519;-0.0003585787198972;-0.00033640151377767;-0.00032935058698058;-0.00031610290170647;-0.00022628629812971;-0.00019497620814946;-0.00011269302922301;-9.4425457064062e-05;2.984454476973e-05;8.0787813203642e-06;0.00022649925085716;-0.00043371712672524;-0.00013643967395183;-0.00030828153830953;-2.0792809664272e-05;0.00026117343804799;-3.1532828870695e-05;7.7435761340894e-05;-1.9150696971337e-05;8.8210492776852e-07;-0.00018476325203665;0.001155691803433;-9.8985383374384e-06;-9.8068245279137e-05;4.9782011046773e-05;-0.00016982045781333;0.00030303091625683;8.6040468886495e-05;4.2451843910385e-05;-0.00017903896514326;-1.6069761841209e-05;9.4186303613242e-05;-0.00026695840642788;0.00020284645142965;-0.00045397583744489;-5.180401421967e-05;0.00010053667938337;4.7938567149686e-05;-0.00052611343562603;-3.0388539016712e-05;0.00028831855161116;-4.6149376430549e-05;-4.8378882638644e-05;0.00012116316065658;0.00026683916803449;-3.0203842470655e-05;0.00045793745084666;-3.2150946935872e-05;4.0634844481247e-05;-2.3146239982452e-05;2.891467011068e-05;3.6315617762739e-05;0.00065985205583274;-2.0123265130678e-05;0.00017573325021658;-5.1572210395534e-06;-0.00017227885837201;-0.00017045377171598;0.00021703288075514;0.0001307610218646;2.6501440515858e-05;-0.00017833622405306;-7.3483752203174e-05;-0.00035014832974412;-7.4469622632023e-05;-0.00083387293852866;5.9937363403151e-05;5.3194238716969e-05;4.0561531022831e-06;-0.00041027698898688;9.1589890871546e-06;0.00018059798458125;7.8901372035034e-05;-6.4288404246327e-05;7.7004042395856e-06;0.00058830640045926;-0.00011653333785944;-0.0003993374411948;8.9484725322109e-05;-3.9871488297649e-06;1.0415171345812e-05;-4.5577858145407e-06;-5.3696145187132e-05;-0.00044856386375614;1.2198022432131e-06;-9.4424744020216e-05;-4.8079586122185e-05;-1.2526758837339e-05;-0.00033175674616359;0.00012394634541124;-9.1808055003639e-05;0.00027816719375551;-0.00029918868676759;-0.00013564570690505;0.00025307666510344;1.1845745575556e-05;0.00043507118243724;4.4391996198101e-05;4.7347359213745e-05;1.6885020158952e-05;7.6686526881531e-05;9.8911541499547e-06;3.105727955699e-05;0.00068004871718585;-0.00025124492822215;-4.6011504309718e-05;0.00010233726789011;-0.00087886478286237;7.6057702244725e-05;-6.723065598635e-05;7.1199363446794e-05;-3.1269275496015e-05;4.7373840061482e-05;-0.0019760360009968;0.00016846212383825;-6.7320543166716e-05;3.963155177189e-05;0.00026949433959089;-5.4735231969971e-05;-0.00021263548114803;-0.00028246024157852;-0.00018879210983869;0.00032072243629955;0.00011305548105156;0.00061695004114881;-4.0061975596473e-05;0.0014753869036213;-0.00018185828230344;-0.00012820518168155;-3.7028121369076e-06;0.00085150176892057;-5.8701643865788e-05;-0.00038982823025435;2.6737399821286e-05;0.0004994043847546;-0.00038685151957907;3.4019874874502e-05;0.00035242075682618;0.00020474966731854;9.7323667432647e-05;8.3673810877372e-05;-9.4704382718191e-06;1.3417938134808e-05;5.0939956963703e-07;1.0070210919366e-05;0.00027255719760433;0.00029119223472662;4.5839027734473e-05;-0.00011142491712235;-4.2386192944832e-05;-0.00032900465885177;0.00011689889652189;6.0471425967989e-05;9.6491683507338e-05;-5.9434532886371e-06;-0.00019282834546175;-0.00011081037519034;-0.00039237513556145;-0.00036677563912235;-6.5949876443483e-05;5.6750574003672e-05;-0.0002593568933662;-7.0713314926252e-05;7.8516961366404e-05;2.9583090508822e-05;-0.0002776377950795;0.00016196898650378;0.0012254711473361;-6.6277862060815e-05;-1.8725348127191e-05;-0.00013291819777805;-4.8716901801527e-07;0.00014245617785491;1.3177420441934e-05;-7.4500635491859e-06;-0.00039147451752797;-8.7037566117942e-05;6.0266611399129e-05;-3.689062941703e-05;-1.0579548870737e-05;-6.2036073359195e-05;-0.00032480119261891;0.00051995937246829;-3.9031456253724e-05;-0.00093998695956543;0.00029181322315708;7.4211653554812e-05;-0.00031983890221454;-4.8509446060052e-05;8.281185728265e-05;-1.5085523045855e-05;6.3193263486028e-05;0.00010257457324769;3.2368865504395e-05;-1.7473192201578e-05;2.5968358386308e-05;-0.00093217880930752;0.00094728352269158;0.00022237082885113;-0.00030132010579109;7.4905619840138e-05;-7.9232522693928e-05;-4.940855797031e-05;8.3967453974765e-05;4.400600300869e-05;-4.797127621714e-05;0.00024079237482511;-0.00045168577344157;0.00015715858899057;-0.00016838339797687;4.468467523111e-06;3.3265947422478e-05;0.00010314000246581;8.1404787124484e-06;-3.6231151170796e-05;-0.00016934676386882;8.2310623838566e-05;0.00016481196507812;-0.00012852312647738;-0.0002492391213309;0.00043916216236539;-5.9162604884477e-05;-7.7709964898531e-06;-2.9756096409983e-05;0.00014478876255453;-6.5462510974612e-05;2.5099923732341e-05;0.00066601485013962;0.00025308498879895;-0.0003262686659582;-0.000129402091261;-0.0002899092505686;-0.00010121951345354;0.00016394087288063;0.00017598777776584;-2.760431743809e-05;-2.9937782528577e-05;-0.00070653896545991;-0.00033778737997636;0.00024251447757706;0.00021498263231479;3.0377626899281e-05;2.0479290469666e-05;5.0229726184625e-05;0.00016412159311585;-0.0001219679688802;4.8630925448379e-05;-0.00010910128912656;6.0102825955255e-05;-4.1199396946467e-05;0.00057185051264241;0.00027052935911343;-0.00021846315939911;-0.00019529719429556;-9.0965259005316e-05;-0.00013174340710975;-4.6189154090825e-05;-2.9252660169732e-05;-0.00042538679554127;-0.00023815267195459;0.00077243859414011;0.00039601797470823;0.00087604497093707;0.00067677738843486;0.00016954215243459;0.00014563305012416;-1.2744359992212e-05;-3.5786461012322e-06;0.00018510733207222;0.00014511249901261;0.0002463657874614;0.00019067220273428;1.964199145732e-05;1.9348990463186e-05;0.0011187775526196;0.0013180953683332;6.1905739130452e-05;-0.0016397952567786;-0.0012414742959663;-0.00053614610806108;-0.00051691639237106;-0.00054612121311948;-0.00038019401836209;-0.00033291828003712;-0.00025531896972097;-0.00015212813741527;-0.00011403001553845;3.4828193747671e-05;1.8595277651912e-05;-0.0013186716241762;0.0013042386854067;0.00036038956022821;-0.00038766601937823;0.00014700736210216;-9.799309191294e-05;-6.9527290179394e-05;0.00011645973427221;6.1449478380382e-05;-6.7880137066822e-05;0.000417042610934;-0.00059578579384834;0.00022582324163523;-0.00022510551207233;-3.2493999242433e-06;4.1293053072877e-05;0.00010126707638847;3.9725029637339e-05;-3.2288058719132e-05;-0.00025659429957159;0.00011779243504861;0.00019415229326114;-0.00019925193919335;-0.0004376529250294;0.00056862749624997;-7.2124588768929e-05;-5.8198879742122e-06;-7.0982445322443e-05;0.00018687923147809;-8.0070560215972e-05;3.8516249333043e-05;0.00083064392674714;0.00042763655073941;-0.00041556364158168;-0.0002228027296951;-0.00037245437852107;-0.00017628054774832;0.00022251250629779;0.00024306590785272;-3.6077828553971e-05;-4.3706331780413e-05;-0.00091230194084346;-0.00052450160728768;0.00032356620067731;0.00029439595527947;4.023855944979e-05;3.2154111977434e-05;7.9138080764096e-05;0.00022065118537284;-0.00016913990839384;4.3956588342553e-05;-0.00012761194375344;7.185459980974e-05;-3.6269364500185e-05;0.00074339169077575;0.00043426122283563;-0.0002936836972367;-0.0002727665414568;-0.00012782819976564;-0.00017220004519913;-5.9940291976091e-05;-4.4338128645904e-05;-0.00055253453319892;-0.00035521225072443;0.0009788068709895;0.00060237030265853;0.0011801837245002;0.00095218740170822;0.00023275733110495;0.00019738455011975;-1.9790342776105e-05;-2.717453526202e-06;0.00025495351292193;0.00020206926274113;0.00032061341335066;0.0002786687691696;2.8170390578452e-05;2.7869353289134e-05;0.0015427415492013;0.0018017956754193;8.5432831838261e-05;-0.0021915570832789;-0.0017525454750285;-0.00073654216248542;-0.00070491107180715;-0.00071214279159904;-0.0005559726851061;-0.00044933514436707;-0.00035919586662203;-0.00020474116900004;-0.00015970740059856;4.9564579967409e-05;2.1335887140594e-05;-0.0012906729243696;0.0012405110755935;0.0003691678866744;-0.0003059535229113;0.00016786550986581;-6.5405984059907e-05;-6.8549496063497e-05;0.00011310543050058;5.8804114814848e-05;-6.5769731008913e-05;0.00047885629464872;-0.00053526042029262;0.00021911710791755;-0.00019994949980173;-1.2067671377736e-05;3.3525153412484e-05;4.8940124543151e-05;6.6602238803171e-05;-1.2878648703918e-05;-0.00024027528706938;9.2379639681894e-05;0.00015703206008766;-0.00021892979566474;-0.00049173686420545;0.00047962093958631;-5.6259636039613e-05;-3.2415009627584e-06;-9.432143997401e-05;0.00016145403787959;-6.6654916736297e-05;4.0945673390524e-05;0.00070069020148367;0.00049661577213556;-0.00035001343348995;-0.00025240459945053;-0.0002984868187923;-0.00018636757158674;0.0002155740512535;0.00023955668439157;-3.347810707055e-05;-4.5632586989086e-05;-0.00080775801325217;-0.00057111296337098;0.00030486940522678;0.00028462876798585;3.7647980207112e-05;3.5833265428664e-05;0.00012175377923995;0.0002644291089382;-0.00015866267494857;-3.876892151311e-05;-0.00014910427853465;3.3324897231068e-05;-3.4708329621935e-05;0.00065250194165856;0.00047784592607059;-0.00028249103343114;-0.00027272067382;-0.00012771457841154;-0.0001554647606099;-5.3353727707872e-05;-4.7028719563968e-05;-0.00050364690832794;-0.00037896455614828;0.0008528278558515;0.00064587057568133;0.0011181482113898;0.00094709073891863;0.00022147594427224;0.00018360132526141;-2.18852674152e-05;-1.6200276320433e-07;0.00024624279467389;0.00019575822807383;0.00028446287615225;0.00028216713690199;3.031800770259e-05;3.0431905543082e-05;0.0015205477830023;0.0017349884146824;8.6577179899905e-05;-0.0020627384074032;-0.0017568984767422;-0.00071253412170336;-0.00067540089366958;-0.00064405455486849;-0.00057247147196904;-0.00042299201595597;-0.00035352996201254;-0.00018693301535677;-0.00015040344442241;4.8312682338292e-05;1.3793399375572e-05;-0.00082698988262564;0.00077800190774724;0.00018279698269907;-9.8203832749277e-05;0.00010107828711625;-1.2772204172506e-05;-4.5366763515631e-05;7.3702467489056e-05;3.5834858863382e-05;-4.031425123685e-05;0.00035305169876665;-0.00033296685433015;0.00012203541700728;-9.9876626336481e-05;-1.1747684766306e-05;1.740777042869e-05;3.2076482057164e-06;5.4486074077431e-05;-2.4190399017243e-07;-0.00010229256440653;6.8287113208498e-06;8.5782710812055e-05;-0.00015075122064445;-0.0003184168599546;0.00024394865613431;-2.0544197468553e-05;-8.9700470198295e-06;-6.8404217017815e-05;8.9616165496409e-05;-3.4851123928092e-05;2.4930886866059e-05;0.00039405017741956;0.00035226801992394;-0.00018243193335366;-0.00015956586867105;-0.00011270633694949;-8.2598067820072e-05;0.00014817784540355;0.00016558537026867;-2.305356611032e-05;-3.2213723898167e-05;-0.00049192371079698;-0.00040740350959823;0.00019354932010174;0.00018483195162844;2.7301864975016e-05;2.7441061320133e-05;0.00018231401918456;0.00030869490001351;-9.2994196165819e-05;-0.00017717406444717;-0.00021796741930302;-3.5836699680658e-05;-6.1998049204703e-05;0.00038317855796777;0.00032974779605865;-0.00019554969912861;-0.00019170501036569;-7.7726399467792e-05;-8.8109918578994e-05;-3.3195166906808e-05;-3.2987514714478e-05;-0.00032281177118421;-0.0002752517175395;0.00049316673539579;0.000442049553385;0.00072956620715559;0.00063777103787288;0.00013395700079855;0.00010444667714182;-1.6546842743992e-05;8.4396123156694e-07;0.00015924249601085;0.00012212566798553;0.00015832037024666;0.00017467312864028;2.7401340048527e-05;2.8364105673973e-05;0.0010701948776841;0.0011353435693309;6.9273359258659e-05;-0.0013441826449707;-0.0012039106804878;-0.00046891343663447;-0.00043733129859902;-0.00039226666558534;-0.00038322189357132;-0.00026527437148616;-0.00022671789338347;-9.9278491688892e-05;-7.6353331678547e-05;2.6288744265912e-05;-9.678847163741e-07;0.0001588747400092;-0.00044273716048338;3.8786879485997e-07;9.4166076451074e-05;-8.2634804130066e-05;0.00065140519291162;-6.5726853790693e-05;8.1366735685151e-05;-2.5581230147509e-05;1.8744336557575e-05;-0.00012574494758155;0.0013174291234463;-1.8036471374216e-05;5.8651843573898e-05;2.9030174118816e-05;-0.00022231023467612;2.2923508367967e-05;0.00020455413323361;0.00014150384231471;-4.3558986362768e-05;-0.0001884064549813;5.1615406846395e-05;-0.00051382003584877;9.1888163296971e-05;-0.0010337081039324;2.5329027266707e-05;8.79735162016e-05;4.9142421630677e-05;-0.00061035813996568;-2.2920019546291e-05;0.00031055731233209;-0.00042765538091771;0.00052081351168454;0.00035919825313613;-2.3893657271401e-05;0.00012600225454662;3.7274508940754e-05;7.159020697145e-06;8.3306076703593e-05;7.0279111241689e-06;1.1645377071545e-06;0.00034243345726281;-0.00018475469551049;4.9733516789274e-05;0.00020208572095726;-5.1012790208915e-05;-7.5205563916825e-05;-0.00025969778653234;0.00013353567919694;2.7700059945346e-05;-4.4888696720591e-05;6.2270279158838e-05;-0.00013060851779301;-9.6503717941232e-05;-0.00041854073060676;-7.8206234320533e-05;5.6553850299679e-05;-6.6767184762284e-05;-9.5551513368264e-05;-0.00014977603859734;3.6668872780865e-05;5.0134978664573e-05;0.00016560485528316;-0.00027453200891614;-6.9762674684171e-05;0.0011400856310502;-0.0001366626820527;0.00010397281585028;0.00011641147284536;-1.5669045751565e-05;-1.4737650417374e-05;2.2872362023918e-05;-0.00010393669799669;-0.00030138611327857;-3.6387416912476e-05;0.00012091518146917;-4.7580782847945e-05;1.1396214176784e-05;-0.00028363193268888;0.00047593776253052;-2.1136287614354e-05;0.00026505833375268;-0.0008834803593345;-0.00026938269729726;2.6889421860687e-05;9.9904173112009e-05;-0.00021649115660693;5.7570883654989e-05;-4.0231218008557e-05;3.3204476494575e-05;0.00012113870616304;2.0886769561912e-05;-6.6840322688222e-05;0.00059179193340242;-0.00019722728757188;-0.00016317502013408;4.5167009375291e-05;-0.00083149987040088;8.2841157563962e-05;-6.1716149502899e-05;6.3055485952646e-05;-3.100854519289e-05;4.2065981688211e-05;-0.0017637350829318;0.00012823360157199;-9.1144022007938e-05;3.381399801583e-05;0.00025562080554664;-3.8107486034278e-05;-8.7648157204967e-05;-0.00028704322176054;-0.00018399000691716;0.00033075775718316;5.0038717745338e-05;0.00058331794571131;-9.0427247414482e-06;0.0014131502248347;-0.00012128265370848;-0.00011809236457339;-2.4688795747352e-05;0.00077559793135151;-5.0716931582429e-05;-0.00035585509613156;2.052087438642e-05;0.00062927010003477;-0.00045421192771755;-1.7963944628718e-05;0.00039125097100623;2.4468954507029e-05;0.00012755175703205;7.92978098616e-05;1.0222068340227e-05;4.6245904741227e-06;1.0615568498906e-05;-0.00031250040046871;0.00032142215059139;0.00026119194808416;6.4365864091087e-05;-6.551433034474e-05;-5.5199692724273e-05;-0.00035408238181844;8.7156382505782e-05;1.9915085431421e-05;0.0001500929647591;-8.9091172412736e-06;-7.7368851634674e-05;-0.00012913750833832;-8.3826824265998e-05;-0.00042598182335496;-8.8800232333597e-05;5.1271177653689e-05;-0.00012514916306827;-8.9704750280362e-05;2.152781780751e-05;3.4105767554138e-05;-0.00031466581276618;0.00017317381571047;0.001323409145698;-8.4417115431279e-05;0.00012879552377854;-0.00012896068801638;-1.1273848940618e-05;0.00014011951861903;1.5640556739527e-05;-1.1772042853408e-05;-0.00036996259586886;-9.1486610472202e-05;0.00010816325084306;-4.4616033846978e-05;1.3777965250483e-05;-5.9419126046123e-05;-0.00029569587786682;0.00058540405007079;-1.0817270776897e-05;-0.0010572404135019;0.0002774057793431;9.3424341685022e-06;-0.00034369245986454;-0.00021593933342956;9.7524163720664e-05;-4.2241172195645e-05;6.5006039221771e-05;0.0001451286370866;3.4064280043822e-05;-6.2174316553865e-05;2.7419562684372e-05;0.00059310527285561;-0.00014178357378114;-0.00024476245744154;-2.8858814403065e-05;-0.00095637945923954;7.4115028837696e-05;-6.9620960857719e-05;7.4748008046299e-05;-3.3194770367118e-05;4.2953241063515e-05;-0.001929609104991;8.0209618317895e-05;-0.00012983450142201;2.3538232198916e-05;0.00028378595015965;-3.0955688998802e-05;-9.9053086159984e-06;-0.00034101103665307;-0.00022182070824783;0.00037118923501112;4.0621762309456e-05;0.0006769597530365;1.505356249254e-05;0.001629134058021;-4.5875942305429e-05;-0.00012598057219293;-4.3482534238137e-05;0.0008561730501242;-4.1245541069657e-05;-0.00038649886846542;1.9233100829297e-05;0.00094120990252122;-0.00063944625435397;-0.00019818960572593;0.00052938144654036;-0.00021704786922783;0.00019417844305281;9.6574076451361e-05;2.2074507796788e-05;-4.9765212679631e-06;2.4752700483077e-05;-0.00067104049958289;0.00044778222218156;0.00026666285702959;0.00010473626753082;-4.800869646715e-05;-7.5332907726988e-05;-0.00045160032459535;7.2984084908967e-06;-2.2798438294558e-05;0.00036418723175302;-2.9226639526314e-05;4.1826926462818e-05;-0.00014146827743389;0.00026551194605418;-0.00058986514341086;-0.00011252847616561;4.9438032874605e-05;-5.9102723753313e-05;-0.00013295048847795;-5.3060666687088e-06;4.3274030758766e-05;-0.0004091281152796;0.00020767861860804;0.0016143668908626;-0.00011434732005;0.00029512634500861;-0.00012895777763333;-3.454392981439e-06;0.0001636502565816;2.0686104107881e-05;-1.8382861526334e-05;-0.00036238730535842;-0.00010583125549601;0.00017706230573822;-5.9628655435517e-05;1.8817734598997e-05;-6.5001811890397e-05;-0.00027967602363788;0.00077146012336016;7.5529496825766e-06;-0.0013626735890284;0.00027169103850611;-6.5593034378253e-05;-0.00042658686288632;-0.00040391087532043;0.00012401785352267;-8.3230173913762e-05;7.0651884016115e-05;0.0001522108213976;4.04808561143e-05;-8.1405218224972e-05;3.4741457056953e-05;-0.00089913612464443;0.0009010955109261;0.000140792602906;-0.00024505966575816;0.00010316930274712;-9.0437359176576e-05;-4.5320346544031e-05;7.2534006903879e-05;3.7247787986416e-05;-4.240221096552e-05;0.00033172254916281;-0.00047675488167442;9.5446644991171e-05;-0.00011451359750936;1.769795517248e-06;3.5151795600541e-05;0.00012072573736077;1.0581133210508e-05;-2.8073738576495e-05;-0.00012706650886685;3.0056016839808e-05;0.00010499356721994;-7.7602198871318e-05;-0.00025936271413229;0.0004220160190016;-3.0859300750308e-05;-2.9135459044483e-05;-3.3628904930083e-05;0.00012566364603117;-4.3907381041208e-05;1.0294264939148e-05;0.00060218718135729;0.00022115874162409;-0.00029082791297697;-0.00011846041161334;-0.00024582294281572;-6.9904024712741e-05;0.0001602373959031;0.00017410720465705;-2.5313685910078e-05;-2.4782024411252e-05;-0.00071516691241413;-0.00034120303462259;0.00020649679936469;0.00018537476717029;3.5492677852744e-05;1.7385462342645e-05;0.00012836593668908;0.00024482083972543;-0.00013085134560242;-6.4678664784878e-05;-0.00018980394816026;4.726982297143e-05;-5.5651093134657e-05;0.00058902305318043;0.00028301295242272;-0.00021817730157636;-0.00018935222760774;-4.3126783566549e-05;-0.00010018540342571;-4.7802175686229e-05;-2.3822922230465e-05;-0.00040975530282594;-0.00022548397828359;0.0007040553027764;0.0003406576870475;0.00085737335029989;0.00065195810748264;0.00013680719712283;0.00011984411685262;-1.4301842384157e-05;-7.3868854997272e-06;0.00016338344721589;0.00012029190838803;0.00019304639135953;0.00013729353668168;3.4266820875928e-05;2.9434018870234e-05;0.0011405725963414;0.0012997892918065;8.9316032244824e-05;-0.0016155305784196;-0.0012266802368686;-0.0005277261370793;-0.00051024236017838;-0.00050866254605353;-0.00032807406387292;-0.00029302315670066;-0.00022029361571185;-8.769026317168e-05;-6.3673935073894e-05;1.3241631677374e-05;7.1933327490115e-06;-0.0014366515679285;0.0014028045115992;0.00038108046283014;-0.00042811423190869;0.00023568257165607;-0.0001698647683952;-7.0039299316704e-05;0.00011028556036763;5.9988327848259e-05;-6.8025576183572e-05;0.00060003687394783;-0.00071230053436011;0.00016706470341887;-0.00017956040392164;-9.8798836916103e-06;4.7461093345191e-05;0.00012513175897766;4.7700763389003e-05;-2.4351436877623e-05;-0.00028064526850358;0.00011771458230214;0.00011215807899134;-0.00012698584760074;-0.00055241957306862;0.00065949576674029;-3.8367452361854e-05;-3.1400639272761e-05;-8.1901947851293e-05;0.00017813725571614;-5.64913279959e-05;2.2257409000304e-05;0.00083407474448904;0.00042958930134773;-0.00044430670095608;-0.00024972864775918;-0.00042684853542596;-0.00021773418120574;0.00023190921638161;0.00025306528550573;-3.2163465220947e-05;-3.5462118830765e-05;-0.0010248003527522;-0.00059339992003515;0.00029490594170056;0.0002746794198174;4.3856929551112e-05;2.5541112336214e-05;9.0369481767993e-05;0.00020467423018999;-0.00022421579342335;4.6342967834789e-05;-0.00012162383063696;0.00012307884753682;9.3815415311838e-06;0.00087961979443207;0.00052410905482247;-0.00030363199766725;-0.00027625882648863;-7.2403796366416e-05;-0.00014049775199965;-6.3457111536991e-05;-3.8664955354761e-05;-0.00056151056196541;-0.00036001185071655;0.00098579318728298;0.00060396711342037;0.001248823129572;0.00099998037330806;0.00021454476518556;0.00018627125245985;-2.4360408133361e-05;-8.8242341007572e-06;0.00023861585941631;0.00017812928126659;0.00027725519612432;0.00023069769667927;4.5776534534525e-05;3.9725997339701e-05;0.0016404506750405;0.0019672513008118;0.00012972725380678;-0.0023444360122085;-0.0018879508133978;-0.000799692759756;-0.00077230029273778;-0.00071826495695859;-0.00053712207591161;-0.00043043566984124;-0.0003385929740034;-0.00013763325114269;-0.00010207344894297;2.753414628387e-05;8.6655345512554e-06;-0.0014227211941034;0.0013552831951529;0.00041643049917184;-0.00035620358539745;0.00025541830109432;-0.00014055520296097;-6.9666188210249e-05;0.00010864445357583;5.8985238865716e-05;-6.654710159637e-05;0.00065404339693487;-0.00065312883816659;0.00017162731091958;-0.00016107957344502;-2.0289005988161e-05;3.8008369301679e-05;5.996908294037e-05;7.3974835686386e-05;-5.990627414576e-06;-0.00027148623485118;0.00010736250260379;8.13972656033e-05;-0.00015275586338248;-0.00061728432774544;0.00057487096637487;-2.4861557903932e-05;-2.4298866264871e-05;-0.00010633651254466;0.00015499581058975;-4.5230266550789e-05;2.7423729989096e-05;0.00070073682582006;0.00052142748609185;-0.00037748945760541;-0.0002960676793009;-0.00035347961238585;-0.00024943295284174;0.0002263961796416;0.00025032655685209;-2.8779735657736e-05;-3.8867921830388e-05;-0.00090378418099135;-0.00066067307488993;0.00028447207296267;0.00026724915369414;3.8405389204854e-05;3.1061117624631e-05;0.00011595814430621;0.00022783783788327;-0.00021562837355305;-1.7933278286364e-05;-0.00011525762965903;8.5402010881808e-05;2.3493164917454e-05;0.00077112769940868;0.00059102661907673;-0.00029223650926724;-0.00027817886439152;-8.5433399362955e-05;-0.00012356066145003;-5.4836091294419e-05;-4.328076101956e-05;-0.00051114289090037;-0.00039100629510358;0.00086301605915651;0.0006698167999275;0.0011890118476003;0.0010087072150782;0.00021099230798427;0.00017570509226061;-2.710176158871e-05;-5.1969241212646e-06;0.00023345481895376;0.00017603632295504;0.00024760403903201;0.0002441244723741;4.48651262559e-05;4.1577102820156e-05;0.0016189033631235;0.0019158073700964;0.0001276622642763;-0.0022193703334779;-0.0019155606860295;-0.0007828880334273;-0.00074731785571203;-0.00064994755666703;-0.00057049741735682;-0.0004106288542971;-0.0003395973762963;-0.00013189188030083;-9.7934593213722e-05;3.1624811526854e-05;1.173276928057e-06;-0.00084425043314695;0.0007915492169559;0.0001845201040851;-0.00010295250103809;0.00012631219578907;-3.8873604353284e-05;-4.3456049752422e-05;6.8497181928251e-05;3.4203567338409e-05;-3.8452650187537e-05;0.00040684899431653;-0.00036843973794021;9.7011514299084e-05;-7.8321449109353e-05;-1.4905089301465e-05;1.8515494957683e-05;5.2422756198212e-06;5.4289619583869e-05;1.9350995899003e-06;-0.00010106184345204;5.774010787718e-06;5.3583538829116e-05;-0.0001183276399388;-0.00034846932976507;0.00026589081971906;-6.6720526774589e-06;-1.7281694454141e-05;-7.0782371039968e-05;8.4877865447197e-05;-2.4325412596227e-05;1.7520391338621e-05;0.00037711331970058;0.00034910655813292;-0.00018398830434307;-0.00017090457549784;-0.00011945246660616;-9.7575459221844e-05;0.00014830574218649;0.00016485282685608;-2.0633327949326e-05;-2.8890897738165e-05;-0.0005078885005787;-0.00042926511378027;0.00017953325004783;0.00017109532200266;2.7180425604456e-05;2.5761140932445e-05;0.0001860147312982;0.00029915833147243;-0.00011017078213627;-0.00017958364333026;-0.00021106826898176;-2.1482353986357e-05;-4.2689254769357e-05;0.00041027728002518;0.00036294740857556;-0.00019480646005832;-0.00018923336756416;-5.9200297982898e-05;-7.1028487582225e-05;-3.2589810871286e-05;-3.0894942028681e-05;-0.00031540234340355;-0.00027205949299969;0.0004744817269966;0.00043280140380375;0.00073375023202971;0.00064281065715477;0.00012477891868912;9.6352334367111e-05;-1.8249411368743e-05;-1.1147626537422e-06;0.00015083356993273;0.00011210770753678;0.00013684676378034;0.00015229362179525;3.2607262255624e-05;3.2592735806247e-05;0.0010828780941665;0.0011674036504701;8.3922306657769e-05;-0.0013617945369333;-0.0012297654757276;-0.00048071882338263;-0.00045012249029242;-0.00037933068233542;-0.00036959382123314;-0.00025139912031591;-0.00021328633010853;-7.4396841228008e-05;-5.1988088671351e-05;1.9130757209496e-05;-6.3694137679704e-06;4.3266500142636e-05;-0.00041265672189184;0.00014322464994621;0.00025084792287089;-7.1364382165484e-05;0.00083195394836366;-8.5322673839983e-05;9.9854514701292e-05;-2.4560773454141e-05;2.1626834495692e-05;-1.8599255781737e-05;0.0014817246701568;-2.3882648747531e-06;0.00012969275121577;1.1407567399147e-05;-0.0002602711902;-0.00013379167648964;0.00028784488677047;0.00019565783441067;-1.3920263882028e-05;-0.00025309211923741;1.4274170098361e-05;-0.00065693247597665;-6.3104322180152e-05;-0.0013229647884145;6.7611312260851e-05;8.6161242506932e-05;2.889856841648e-05;-0.00070223165675998;-1.7460602975916e-05;0.0003446138871368;-0.00073600257746875;0.00097631191601977;0.00056844262871891;-0.00031334508094005;0.00026118342066184;-0.00029560155235231;2.9245571568026e-05;0.00011551423085621;2.7089483410236e-05;-1.8852117136703e-05;0.0005803193198517;-0.00066858797799796;0.00010821469913935;0.00019821641035378;-8.1297017459292e-05;-4.3284628191032e-05;-0.00033339636866003;6.6389533458278e-05;-2.9344373615459e-05;-0.00012947466166224;0.00031608270364814;-0.00017612539522815;6.8647335865535e-05;-0.00069630757207051;0.00043109458056279;4.9703878175933e-05;-0.00010901530185947;-0.00017493659106549;-5.9644855355145e-05;5.6367185607087e-05;1.2393208635331e-05;0.00022418971639127;-0.00042958662379533;-0.000127724284539;0.0015718364156783;-0.00012228227569722;0.0003695456252899;0.00015367360902019;-9.3009402917232e-06;-2.9537395676016e-05;3.5995501093566e-05;-0.00013179000234231;-0.00027661540661938;-6.3564089941792e-05;0.0002319135091966;-5.060271723778e-05;2.0695149942185e-05;-0.0002205237688031;0.00078097195364535;8.459493983537e-06;0.00021953518444207;-0.0013646716251969;-0.00039834750350565;-9.5334107754752e-05;0.00015512200479861;-0.00051669456297532;5.7460492826067e-05;-0.00010109075083164;4.4692191295326e-05;0.00013670772023033;3.1790139473742e-05;-0.00010492272122065;0.00012778575182892;-0.00042211846448481;3.7096957385074e-05;0.00016334037354682;-8.7762120529078e-05;0.0006863793823868;-6.8204011768103e-05;8.3718485257123e-05;-2.4919194402173e-05;2.0480063540163e-05;-9.6710144134704e-05;0.0013069291599095;-1.6278268958558e-05;8.6186941189226e-05;2.1700143406633e-05;-0.00022681285918225;-3.9360660593957e-05;0.00022195781639311;0.00015140198229346;-1.5251273907779e-05;-0.00021139765158296;3.8225138268899e-05;-0.00053634692449123;5.1492141210474e-05;-0.0010934105375782;4.0960429032566e-05;8.2075035606977e-05;4.4228443584871e-05;-0.00061283074319363;-1.9935248928959e-05;0.00030737981433049;-0.00050637556705624;0.00063732883427292;0.0004083159728907;-0.00010010768892244;0.00016632951155771;-6.7420434788801e-05;1.6051768398029e-05;8.7941523815971e-05;1.3193274753576e-05;-5.4627485042147e-06;0.0004046460671816;-0.00034760261769406;6.5250613261014e-05;0.00019130522559863;-5.9140467783436e-05;-5.6115441111615e-05;-0.00026773780700751;0.00011720236943802;7.9086139521678e-06;-7.2156501119025e-05;0.00012093855912099;-0.0001459578925278;-3.7636276829289e-05;-0.00048939598491415;9.3359754828271e-05;5.2075509302085e-05;-8.0746322055347e-05;-0.00011620908480836;-9.9947050330229e-05;4.1760398744373e-05;2.8403914257069e-05;0.00018236704636365;-0.000317008147249;-9.1109090135433e-05;0.0012435193639249;-0.00013216787192505;0.00019212138431612;0.00012354289356153;-1.8733426259132e-05;-1.9392915419303e-05;2.6748783056973e-05;-0.00011216667189728;-0.00028597793425433;-4.52840286016e-05;0.00015184943913482;-4.6756736992393e-05;1.8902221199824e-05;-0.00025639389059506;0.00055444292956963;-7.9429473771597e-06;0.0002497625828255;-0.0010097675258294;-0.00030154653359205;-1.279979278479e-05;0.00011885695130331;-0.00031439849408343;5.7369579735678e-05;-5.695634172298e-05;3.6889763578074e-05;0.00013345619663596;2.3250715457834e-05;-8.4677500126418e-05;0.00040430790977553;-3.7023255572421e-05;-0.00024297407071572;-9.4500188424718e-05;-0.00077981251524761;4.1395695006941e-05;-5.8329012972536e-05;6.4116153225768e-05;-2.5804944016272e-05;3.0595372663811e-05;-0.0015014513628557;2.6600059754855e-06;-0.00013157320790924;7.9640713011031e-06;0.00022857751173433;-1.4020504750079e-05;7.13077315595e-05;-0.00028489634860307;-0.00018920062575489;0.00028859727899544;1.8171494957642e-05;0.00055868818890303;3.2832169381436e-05;0.0013387183425948;4.6436725824606e-05;-9.5028452051338e-05;-5.0136826757807e-05;0.0006807770114392;-1.9205641365261e-05;-0.00030243420042098;1.1245535461057e-05;0.00096485181711614;-0.00062800565501675;-0.00032307585934177;0.00050419330364093;-0.000392249901779;0.0002029174938798;8.5126746853348e-05;2.7728732675314e-05;-1.3243586181488e-05;3.1215171475196e-05;-0.00082542380550876;0.00043491172255017;0.00018761266255751;0.00011313604045426;-1.6147065252881e-05;-7.1919683250599e-05;-0.00040466687642038;-7.139056106098e-05;-5.9133875765838e-05;0.00046492702676915;-4.6306722651934e-05;0.0001471171999583;-0.00011058706149925;0.00053943617967889;-0.00057062704581767;-0.0001018220646074;3.096713044215e-05;2.5634462872404e-05;-0.00013508139818441;-2.9116352379788e-05;3.9021797419991e-05;-0.00038439585478045;0.00018050792277791;0.0014206598279998;-0.00011350969725754;0.00037309579784051;-8.4283288742881e-05;2.5422305043321e-06;0.00014039661618881;1.8979148080689e-05;-2.0021594536956e-05;-0.00025148710119538;-8.8808592408895e-05;0.00018446953617968;-5.7945213484345e-05;2.1075358745293e-05;-5.0526585255284e-05;-0.00016472526476718;0.00074078410398215;2.5629333322286e-05;-0.0012771576875821;0.00017390803259332;-0.00012063426402165;-0.00039044496952556;-0.00046029817895032;0.00011504100984894;-9.7010619356297e-05;5.3600302635459e-05;0.00012146952940384;3.5693836252904e-05;-7.809169619577e-05;3.1487998057855e-05;0.00025719607947394;7.7879944001324e-05;-0.00026667831116356;-0.00018129670934286;-0.00067511230008677;9.0511475718813e-06;-5.2772422350245e-05;5.8889148931485e-05;-2.0175797544653e-05;2.1140745957382e-05;-0.0012660328065977;-8.5637198935729e-05;-0.00013444728392642;-1.1232998076594e-05;0.00020315061556175;2.8943272809556e-06;0.00016857867012732;-0.00026757651357912;-0.00017861019296106;0.00023921809042804;-2.071031531159e-06;0.00049999327166006;6.0758546169382e-05;0.0011907134903595;0.00015810062177479;-8.5258463514037e-05;-6.2703111325391e-05;0.00059468945255503;4.2105307329621e-06;-0.00026182873989455;4.9692484935804e-06;0.0010569634614512;-0.00065721373539418;-0.00041196239180863;0.00051136425463483;-0.00051459687529132;0.00021723087411374;8.8425636931788e-05;4.0112976421369e-05;-1.8950437151943e-05;3.5543624107959e-05;-0.0009870717767626;0.00044511136366054;0.00016350149235222;0.0001264582388103;2.7141909413331e-06;-7.4359668360557e-05;-0.00039593107067049;-0.0001022916767397;-8.7462372903246e-05;0.00052968628006056;-6.1814636865165e-05;0.00021594084682874;-0.00010739280696725;0.00073935399996117;-0.00058068102225661;-0.0001110596494982;1.7497099179309e-05;7.4714058428071e-05;-0.00014638667926192;-4.7152941988315e-05;3.9709302654956e-05;-0.00041723623871803;0.00017675757408142;0.0014310441911221;-0.00012668962881435;0.00048069554031827;-4.1379789763596e-05;1.0008247045334e-05;0.00013809021038469;1.9055161828874e-05;-2.3658954887651e-05;-0.00019392321701162;-8.251368853962e-05;0.00020827272965107;-6.2803628679831e-05;2.5921126507455e-05;-4.2185190977762e-05;-5.906076694373e-05;0.00081796280574054;4.2956540710293e-05;-0.0013757491251454;8.43528250698e-05;-0.00018245440151077;-0.00041059430805035;-0.00054907461162657;0.00011853676551254;-0.0001219922414748;3.9853064663475e-05;0.00011038511729566;3.5706012567971e-05;-8.2507722254377e-05;3.2225510949502e-05;5.9877762396354e-05;0.00020814455638174;-0.00024933379609138;-0.00025619630469009;-0.00048391355085187;-3.0651037377538e-05;-4.3044499761891e-05;4.7944973630365e-05;-1.1723419447662e-05;8.6518220996368e-06;-0.00089078512974083;-0.0001808268862078;-0.00011783545051003;-3.0077681003604e-05;0.0001593288325239;2.0542309357552e-05;0.00024866065359674;-0.00022105996322352;-0.00014810635184404;0.00015703635290265;-1.9268272808404e-05;0.00038365583168343;8.4288680227473e-05;0.00089762086281553;0.00026693180552684;-6.9818022893742e-05;-6.9801841164008e-05;0.00045152474194765;2.9895150873926e-05;-0.00019933203293476;-2.3300692646444e-06;0.0010277491528541;-0.00059820455498993;-0.00043377897236496;0.00044995543430559;-0.00055446912301704;0.00019675072690006;8.6390304204542e-05;5.2741132094525e-05;-2.1478617782122e-05;3.39443104167e-05;-0.0010311802616343;0.00038795996806584;0.00013486277021002;0.00012550978863146;1.9013747078134e-05;-6.7889333877247e-05;-0.00034156494075432;-0.00010120052320417;-0.00010578305227682;0.00050541909877211;-6.7260763898958e-05;0.00024682588991709;-9.6149306045845e-05;0.00082873663632199;-0.00050545623525977;-0.0001151473770733;-2.7974886052107e-07;0.00010706704779295;-0.00013975182082504;-5.9141741076019e-05;3.5810495319311e-05;-0.00041918139322661;0.00015233606973197;0.0013216056395322;-0.00012115266144974;0.00055183412041515;2.2505430024466e-05;1.6647740267217e-05;0.0001263080193894;1.6257699826383e-05;-2.5220040697604e-05;-0.00012701790546998;-6.6932960180566e-05;0.000207455639611;-5.9975664044032e-05;3.1789011700312e-05;-2.8923477657372e-05;7.9036261013243e-05;0.00085206376388669;5.8828456531046e-05;-0.0013841427862644;-4.4165928557049e-05;-0.00023402215447277;-0.00040788485785015;-0.00057983043370768;0.00010435019794386;-0.00013797420251649;1.7623364328756e-05;9.6597097581252e-05;3.2946394640021e-05;-8.113456715364e-05;2.9374175937846e-05;-0.0013421532930806;0.001293440698646;0.00041979961679317;-0.00045765662798658;0.00030280926148407;-0.00022995282779448;-5.9987032727804e-05;8.892577898223e-05;5.2005896577612e-05;-6.0254642448854e-05;0.00067543372279033;-0.00070913432864472;0.00011060265387641;-0.00013109207793605;-1.6237981981249e-05;4.5559365389636e-05;0.00011849643487949;5.1899653044529e-05;-1.2506549865066e-05;-0.00030783779220656;0.00014510902110487;1.8649485355127e-05;-4.5035529183224e-05;-0.00062053033616394;0.00067779136588797;-8.0427407738171e-06;-4.156785144005e-05;-8.6112704593688e-05;0.00014853953325655;-2.9867649573134e-05;8.9075747382594e-06;0.00071864237543195;0.00037242515827529;-0.00042653444688767;-0.00024550518719479;-0.00047098996583372;-0.00026761167100631;0.00019551104924176;0.00021238774934318;-2.2477435777546e-05;-2.1245439711493e-05;-0.00096489046700299;-0.00056152709294111;0.00021822564303875;0.00021433092479128;3.737369843293e-05;1.5029887435958e-05;5.2924337978766e-07;4.1596798837418e-05;-0.0002453793422319;0.00016797744319774;6.0784486777266e-06;0.00019109001732431;9.1591376985889e-05;0.00088230444816872;0.00052887358469889;-0.00024846638552845;-0.000225044801482;-1.5086906387296e-05;-9.2823109298479e-05;-5.6470478739357e-05;-2.9915187042207e-05;-0.00046817580005154;-0.00030218859319575;0.00085184443742037;0.00053565832786262;0.0011055101640522;0.00088308699196205;0.00017387035768479;0.00015672543668188;-2.4412145648967e-05;-1.2398270882841e-05;0.00018643037765287;0.0001303051103605;0.00020890464656986;0.00016769602370914;4.9634596507531e-05;3.9788817957742e-05;0.0013999459333718;0.0018074761610478;0.00014119839761406;-0.0020852203015238;-0.0016928381519392;-0.00073271477594972;-0.00071521213976666;-0.00061647844268009;-0.00045013354974799;-0.00035162689164281;-0.00027340103406459;-7.1302631113213e-05;-4.7584515414201e-05;7.4970148489228e-06;-1.8853997971746e-06;-0.0013410708634183;0.0012640785425901;0.00046413886593655;-0.00039981908048503;0.00032164616277441;-0.00020494568161666;-6.0058744566049e-05;8.8248183601536e-05;5.2130595577182e-05;-5.9020578191848e-05;0.00072477135108784;-0.00065825838828459;0.00012050221994286;-0.00011578047997318;-2.722744102357e-05;3.5447268601274e-05;5.3740124712931e-05;7.3431241617072e-05;3.6399837881618e-06;-0.00030008272733539;0.00014383651432581;-7.1506715357827e-06;-7.0053472882137e-05;-0.00068882043706253;0.00060317781753838;3.8787975427113e-06;-3.3447959140176e-05;-0.00010959377686959;0.00012733672338072;-2.0135090380791e-05;1.5460998838535e-05;0.00057993165683001;0.00048598882858641;-0.00034776527900249;-0.00031538851908408;-0.00038923282409087;-0.00032387470128015;0.00019179258379154;0.00021192924759816;-1.7591415598872e-05;-2.6578441975289e-05;-0.0008309175609611;-0.00065329467179254;0.00021838772227056;0.00020466733258218;2.940575905086e-05;2.2493662982015e-05;1.5123514458537e-05;5.3535262850346e-05;-0.00023992001661099;0.00010294023377355;4.1058650822379e-05;0.00015254279423971;0.00011592460941756;0.0007514210883528;0.00062903406796977;-0.00023958964447957;-0.00022840584279038;-3.8740967283957e-05;-7.2268150688615e-05;-4.6873286919435e-05;-3.5735676647164e-05;-0.00042208033846691;-0.0003371350467205;0.00074222788680345;0.00061489356448874;0.0010537778725848;0.00090808141976595;0.00017614850366954;0.00014822512457613;-2.7792069886345e-05;-8.4147659435985e-06;0.00018230818386655;0.00013163854600862;0.00018411653582007;0.00018580377218314;4.7186123993015e-05;4.223633732181e-05;0.0013877267483622;0.0017815398750827;0.00013924464292359;-0.001978627871722;-0.0017490780446678;-0.000726978702005;-0.0006989270914346;-0.00055248627904803;-0.00049519998719916;-0.0003370895574335;-0.00027950794901699;-7.1548296546098e-05;-4.4725318730343e-05;1.4295354048954e-05;-9.8592045105761e-06;-0.0003975334984716;8.4979015809949e-05;0.00043490275857039;0.00023087511362974;9.9506432889029e-05;0.00048730373964645;-6.7839850089513e-05;7.753015961498e-05;2.911469891842e-06;1.3311395150595e-06;0.00035711762029678;0.00075172737706453;5.4746935347794e-05;0.00012350735778455;-3.9700975321466e-05;-0.00016650158795528;-0.0003336081863381;0.00025207834551111;0.00016420883184765;-3.6527955671772e-05;-0.00010803857730934;-9.6672978543211e-05;-0.00045147087075748;-0.00049127714009956;-0.00081104837590829;0.00010145908890991;4.8786510888021e-05;-6.5603329858277e-05;-0.0004243062576279;9.9040726126987e-06;0.00020725361537188;-0.00078977487282827;0.001221333281137;0.00055578525643796;-0.00063779688207433;0.00028988218400627;-0.00068966753315181;6.3948828028515e-05;0.00012290278391447;4.1338022128912e-05;-3.9911985368235e-05;0.00057042046682909;-0.0011006520362571;0.00015125688514672;0.00010193502384936;-8.1520032836124e-05;2.0166526155663e-05;-0.00027381975087337;-7.8325807407964e-05;-0.0001258733245777;-0.0001722236193018;0.00055915949633345;-0.00013466994278133;0.00030308793066069;-0.00067814136855304;0.0010407596128061;-6.0420743466238e-06;-0.00012771552428603;-0.00020389078417793;8.5738982306793e-05;5.420581146609e-05;-4.1895473259501e-05;0.00016401067841798;-0.00047410509432666;-0.00012167375825811;0.0014555691741407;8.1896716437768e-05;0.00064422684954479;0.00014846822887193;1.7163574739243e-05;-4.0118091419572e-05;3.3080268622143e-05;-7.8624652815051e-05;-0.00011047522275476;-6.5645312133711e-05;0.0002726789098233;-2.0405974282767e-05;3.3193835406564e-05;0.00016148731810972;0.0010235444642603;6.3064202549867e-05;-0.0001711987570161;-0.0015743441181257;-0.00046719220699742;-0.00028805967303924;0.00012123510532547;-0.00069332227576524;-9.1842794063268e-06;-0.00016346198390238;3.4062162740156e-05;9.7571624792181e-05;3.3847776649054e-05;-0.00010728956840467;-0.00026041467208415;-8.9026310888585e-05;0.00036251760320738;0.00026651055668481;4.2876559746219e-05;0.00064845138695091;-7.8538396337535e-05;8.9267363364343e-05;-6.6920238168677e-06;9.3632970674662e-06;0.00024528504582122;0.001046720193699;3.7734203942819e-05;0.00014255780843087;-2.5196737624356e-05;-0.0002077168028336;-0.00029450177680701;0.00028028909582645;0.00018709232972469;-2.4776591089903e-05;-0.00016829746891744;-6.4982399635483e-05;-0.00055450532818213;-0.00037284332211129;-0.0010551522718742;9.8198135674465e-05;6.0791993746534e-05;-3.6478428228293e-05;-0.00054270215332508;1.6471656181238e-06;0.00026252193492837;-0.00086535036098212;0.0012600314803421;0.00062742154113948;-0.00062131689628586;0.00032482185633853;-0.00066230626543984;5.3876199672231e-05;0.00012526971113402;4.3214746256126e-05;-3.8615973608103e-05;0.00065218500094488;-0.0010813573608175;0.00015268324932549;0.0001227306202054;-8.9979585027322e-05;6.7836567723134e-06;-0.00031677342485636;-6.4541542087682e-05;-0.00010760172881419;-0.00018368738528807;0.00057158921845257;-0.00015701215306763;0.00027642218628898;-0.00077688106102869;0.00098442716989666;1.3271079296828e-05;-0.00012491486268118;-0.00021644029766321;6.3499071984552e-05;6.0167109040776e-05;-3.1615039915778e-05;0.00020034630142618;-0.00048740190686658;-0.00014053686754778;0.001581444288604;3.3822402656369e-06;0.00060160073917359;0.00015674263704568;9.0179419203196e-06;-3.9361853851005e-05;3.6953893868485e-05;-0.00010483196820132;-0.00016060841153376;-7.2031070885714e-05;0.00028223948902451;-3.2350053515984e-05;2.9777760573779e-05;2.7558045985643e-05;0.00099012663122267;4.9662819947116e-05;-2.6276846256224e-05;-0.0015891963848844;-0.00046475074486807;-0.00024392118211836;0.00014891632599756;-0.00069566268939525;1.759227598086e-05;-0.00015338863886427;4.0701459511183e-05;0.00011245501809753;3.5436147300061e-05;-0.00011363528756192;-7.0305402914528e-05;-0.00025239161914214;0.00020949574536644;0.00024122284958139;-2.4324959667865e-05;0.00069004914257675;-7.4845389463007e-05;8.5630330431741e-05;-1.5701729353168e-05;1.5609102774761e-05;7.9469726188108e-05;0.0011645142221823;1.1412845196901e-05;0.00012913781392854;-3.5738162296184e-06;-0.00021313612523954;-0.00018398248357698;0.00025624490808696;0.00017399770149495;-1.2677975973929e-05;-0.00019995812908746;-1.6445639630547e-05;-0.00055620225612074;-0.00017003719403874;-0.0011019831290469;7.36647634767e-05;6.4100720919669e-05;2.3294903712667e-06;-0.00056835496798158;-8.1396428868175e-06;0.00027518111164682;-0.00073435803642496;0.0010128503199667;0.00055037171114236;-0.00043491757242009;0.00027371739270166;-0.00044732564128935;3.4802880691132e-05;0.0001060714785126;3.3092252124334e-05;-2.6775585865835e-05;0.00057087303139269;-0.00079806474968791;0.00011870013258886;0.00013687885075342;-7.8105425927788e-05;-1.4524694051943e-05;-0.00029473283211701;-1.0692593605199e-05;-6.1758633819409e-05;-0.00014620411093347;0.00041973116458394;-0.00014915075735189;0.00016382100875489;-0.00068278191611171;0.00065713579533622;3.0013423383934e-05;-0.00010199939424638;-0.00017848145216703;8.8882861746242e-06;5.2847699407721e-05;-9.9220596894156e-06;0.00019383401377127;-0.00040727859595791;-0.00012298778165132;0.0014093100326136;-6.6727996454574e-05;0.00043157109757885;0.0001375714346068;-1.1280922080914e-06;-3.0630526453024e-05;3.3121366868727e-05;-0.00010914415906882;-0.00019266227900516;-6.1697624914814e-05;0.00023165017773863;-3.8357371522579e-05;2.139628486475e-05;-0.00010582065442577;0.00077724270522594;2.5158822609228e-05;0.00010976367047988;-0.0013073339359835;-0.00037992591387592;-0.00014792197907809;0.0001403369824402;-0.00054683297639713;3.8195925299078e-05;-0.0001120445158449;3.9009646570776e-05;0.00011003605322912;2.9976761652506e-05;-9.768053132575e-05;-0.00017802977527026;0.00032215245300904;-0.00012928282376379;-0.00027442397549748;-0.00019282613357063;-7.5353920692578e-05;-2.9169965273468e-05;3.2307922083419e-05;-4.4788788500227e-07;-5.7110923989967e-06;-0.00034270825562999;-0.00025236932560802;-7.407421071548e-05;-3.9754366298439e-05;8.8025975855999e-05;3.091879261774e-05;0.00024363360716961;-0.00012217527546454;-8.7013977463357e-05;2.5048533643712e-05;-1.0715706594056e-05;0.00019302546570543;8.2211336120963e-05;0.00040549956611358;0.00032475602347404;-3.9027796447044e-05;-6.0171380027896e-05;0.00023082780535333;4.9567373935133e-05;-0.00010595453932183;-8.7644857558189e-06;0.00079555285628885;-0.00039925577584654;-0.00038735548150726;0.00028900991310365;-0.00049865012988448;0.00012078569852747;7.1356022090185e-05;5.6463188229827e-05;-1.9839715605485e-05;2.5530438506394e-05;-0.00087797187734395;0.000228283170145;7.828845991753e-05;0.00010386434587417;3.0091818189248e-05;-4.6377455873881e-05;-0.00022347136109602;-9.7054355137516e-05;-0.00011092329077655;0.00040439673466608;-5.1226747018518e-05;0.00023438940115739;-4.955042822985e-05;0.00077254162169993;-0.00030618839082308;-9.760376997292e-05;-2.2857424482936e-05;0.00011595145770116;-0.00010357930295868;-5.7042936532525e-05;2.2443324269261e-05;-0.00033855106448755;8.5083884187043e-05;0.00095324462745339;-6.684319669148e-05;0.0005280066980049;0.00010599456436466;2.2295556846075e-05;9.5436749688815e-05;8.3857948993682e-06;-2.1604610083159e-05;-3.8999820390018e-05;-3.4781474823831e-05;0.0001594338536961;-3.8979553210083e-05;3.4140630305046e-05;-1.0122347703145e-05;0.00022936491586734;0.00076762435492128;6.7183827923145e-05;-0.0011629585642368;-0.00020837393822148;-0.00025306484894827;-0.00034904584754258;-0.00048731069546193;5.1120059652021e-05;-0.00013059763296042;-1.3710770872422e-05;6.7681248765439e-05;2.3717273506918e-05;-6.3274033891503e-05;1.9504337615217e-05;-0.00046476785792038;0.00054167292546481;2.7250380298938e-05;-0.00035591350751929;2.5472747893218e-06;-0.00015101151075214;-2.9593751605717e-05;3.6305420508143e-05;1.199612779601e-05;-2.0236519048922e-05;1.5081835044839e-05;-0.00038959737867117;-3.8756577851018e-05;-6.020668297424e-05;4.9639391363598e-05;4.042416185257e-05;0.0002376499469392;-6.1197562899906e-05;-5.8707657444756e-05;-0.00010620426473906;4.0834383980837e-05;9.2727779701818e-05;8.2534716057125e-05;6.2258615798783e-05;0.00045781023800373;-2.2530210117111e-05;-5.7465847930871e-05;0.00011278401507298;7.9640034527984e-05;-6.2581850215793e-05;-1.2386039088597e-05;0.00076699478086084;-0.00026556788361631;-0.00044239341514185;0.00018227961845696;-0.00055441778386012;4.0997627365869e-05;8.4010542195756e-05;7.620651012985e-05;-2.1009618649259e-05;2.1023413864896e-05;-0.0009119765018113;8.5929772467352e-05;6.4062704041135e-05;0.00011391265434213;3.6872857890557e-05;-3.4233304177178e-05;-0.00018192912102677;-0.0001355941494694;-0.00014854923938401;0.00042757362825796;-2.1228412151686e-05;0.00026869252906181;6.7027408476861e-06;0.00086994143202901;-0.00014415576879401;-0.00010872865095735;-5.5690521548968e-05;0.00011860390804941;-9.2626956757158e-05;-5.7951529015554e-05;1.2248135135451e-05;-0.00033365876879543;1.4991784155427e-05;0.00083231931785122;2.1398911485448e-05;0.000621733663138;0.00024564054911025;4.5675584260607e-05;9.616652096156e-05;9.9502835837484e-07;-2.1094449039083e-05;2.4842396669555e-05;-2.6696416171035e-06;0.00015142510528676;-1.2116980542487e-05;3.8084228435764e-05;3.7534498460445e-06;0.00044910298311152;0.00091832189355046;8.6113839643076e-05;-0.0012570621911436;-0.00047708171769045;-0.00033977290149778;-0.00039672729326412;-0.00048674925346859;-2.6662211894291e-05;-0.0001614795619389;-5.7443965488346e-05;4.0824659663485e-05;1.6056290405686e-05;-4.8646696086507e-05;1.3719486560149e-05;-0.00074854172999039;0.00076930597424507;0.00017966363520827;-0.00040102511411533;0.00015108262596186;-0.00020181652507745;-3.4855835110648e-05;4.6460569137707e-05;2.4614475478302e-05;-3.3160133170895e-05;0.00030651906854473;-0.0005052505293861;3.3057078780985e-06;-7.5369716796558e-05;1.8261573131895e-05;4.3410487705842e-05;0.00019715265079867;-1.2272543244762e-05;-3.5040382499574e-05;-0.00019799386791419;8.7212887592614e-05;2.5041021217476e-05;6.2257742683869e-05;-0.00023233819229063;0.00054757937323302;-8.4530129242921e-06;-5.2620132919401e-05;2.1094438125147e-05;0.00010071992437588;-3.4817145206034e-05;-1.0127266250493e-05;0.00069729960523546;-5.8594905567588e-05;-0.00043064940837212;3.1366551411338e-05;-0.00052949175005779;-7.344573532464e-05;0.00010810992534971;0.00010837092122529;-1.9267596144346e-05;9.6970970844268e-06;-0.00088892137864605;-0.00012464125757106;8.7123640696518e-05;0.00012766524741892;3.6440818803385e-05;-1.7701726392261e-05;-0.00012698922364507;-0.00011687833466567;-0.00018167134840041;0.00036240118788555;1.5060533769429e-05;0.00025621257373132;5.6811779359123e-05;0.00086331111378968;8.8461369159631e-05;-0.00013645079161506;-9.9039745691698e-05;8.8025641161948e-05;-7.7057346061338e-05;-5.4545125749428e-05;-1.012408574752e-06;-0.00034195170155726;-7.9568664659746e-05;0.00075154629303142;0.00016709484043531;0.00073192548006773;0.00042757333721966;7.7875803981442e-05;0.00010373058466939;-7.9388319136342e-06;-1.863904617494e-05;7.6571246609092e-05;3.4583652450237e-05;0.00014742623898201;3.2112926419359e-05;4.1853498260025e-05;1.7802505681175e-05;0.0007120180525817;0.0011385243851691;0.00010541743540671;-0.0014182452578098;-0.0008274273131974;-0.00044584693387151;-0.00047161636757664;-0.00048662471817806;-0.00014458459918387;-0.00020231066446286;-0.00011456431820989;1.3038148608757e-05;5.9677718127205e-06;-3.1232048058882e-05;5.4883639677428e-06;-0.0011116745881736;0.0010715849930421;0.00038684511673637;-0.00044631291530095;0.00029177381657064;-0.0002419520606054;-4.8011395847425e-05;6.711467722198e-05;4.0890783566283e-05;-4.8691283154767e-05;0.00059796200366691;-0.00062448281096295;6.3624138419982e-05;-9.4847804575693e-05;-1.15567481771e-05;4.0520815673517e-05;0.00012000828428427;3.9895599911688e-05;-1.0254994776915e-05;-0.00029219276621006;0.00014863282558508;-2.3517039153376e-05;1.2901364243589e-05;-0.00055370200425386;0.00062813691329211;5.2130612857582e-06;-4.4166215957375e-05;-6.1862891016062e-05;0.00011587415792746;-1.91006129171e-05;1.3476229696607e-06;0.00062074040761217;0.0002469742030371;-0.00039554105023853;-0.00017756946908776;-0.00049000338185579;-0.00025200832169503;0.00014862684474792;0.00015920262376312;-1.5592451745761e-05;-7.3426281232969e-06;-0.00086515722796321;-0.0004344993212726;0.00014520357945003;0.00015809827891644;3.0556933779735e-05;2.7178191430721e-06;-8.9188179117627e-05;-9.3774251581635e-05;-0.00023030902957544;0.00028118383488618;9.2492242401931e-05;0.00023309284006245;0.00012837562826462;0.00082866131560877;0.0004195268265903;-0.00018225749954581;-0.00016120806685649;3.0190773031791e-05;-6.2257851823233e-05;-4.9406371545047e-05;-1.9529050405254e-05;-0.00037064170464873;-0.00021621082851198;0.00073087110649794;0.0004183710552752;0.00090045831166208;0.00069136795355007;0.00012929805961903;0.00012565539509524;-1.992814031837e-05;-1.4074439604883e-05;0.000127030434669;8.0389370850753e-05;0.00015722110401839;0.00010804284102051;4.5878001401434e-05;3.2562766136834e-05;0.0010538507485762;0.0015048822388053;0.00013014294381719;-0.0017097854288295;-0.0013382392935455;-0.00060676608700305;-0.00060283252969384;-0.00051090749911964;-0.00033290270948783;-0.0002671585243661;-0.00019835357670672;-2.2441758119385e-05;-1.0431644113851e-05;-9.2648760983138e-06;-6.083158950787e-06;-0.0011407036799937;0.0010489682899788;0.00047448108671233;-0.00035008907434531;0.00033043313305825;-0.00019573599274736;-4.9736405344447e-05;6.8460452894215e-05;4.2494604713283e-05;-4.7215042286552e-05;0.00070275348844007;-0.00054049392929301;8.5296131146606e-05;-6.7353685153648e-05;-3.3281590731349e-05;2.0339524780866e-05;2.9718414680246e-06;7.8407661931124e-05;1.923458512465e-05;-0.00027810587198474;0.00014863516844343;-6.9097026425879e-05;-3.6345554690342e-05;-0.00069290422834456;0.00049759796820581;2.7895945095224e-05;-2.9874863685109e-05;-0.00010746646148618;7.5231662776787e-05;-1.2609687018994e-06;1.6462723579025e-05;0.00035648062475957;0.00049367174506187;-0.00023366165987682;-0.00033779992372729;-0.00032569482573308;-0.00038479946670122;0.00014712671691086;0.00016532113659196;-5.1413076107565e-06;-1.991765020648e-05;-0.00061153795104474;-0.00064647098770365;0.00015931342204567;0.00014061716501601;1.3870055227017e-05;1.9094013623544e-05;-6.3625404436607e-05;-6.787807069486e-05;-0.00022648181766272;0.00014294493303169;0.0001774419361027;0.00015703077951912;0.0001821966143325;0.00056766008492559;0.00065410899696872;-0.00017316652520094;-0.00017370904970448;-2.3891785531305e-05;-1.9531991711119e-05;-3.1346498872153e-05;-3.2223317248281e-05;-0.00029468812863342;-0.00029404726228677;0.00054595567053184;0.00059576646890491;0.00082838087109849;0.0007712603546679;0.00014108729374129;0.00011212746903766;-2.7495407266542e-05;-6.3892771322571e-06;0.0001223330036737;8.59371284605e-05;0.00011574778909562;0.00014823958917987;4.1194725781679e-05;3.968531746068e-05;0.0010679808910936;0.0015131195541471;0.00013069937995169;-0.0015592017443851;-0.0015093181282282;-0.00062080583302304;-0.00059196120128036;-0.00040292553603649;-0.00043780379928648;-0.00024850334739313;-0.00021870530326851;-2.6264269763487e-05;-3.3829760468507e-06;5.2242553465476e-06;-2.3247590434039e-05;-0.00082304212264717;0.00069202535087243;0.00044742051977664;-0.00015285894914996;0.00026863859966397;-6.0867994761793e-05;-4.1353232518304e-05;5.2505445637507e-05;2.9247974453028e-05;-2.9225548132672e-05;0.00059468357358128;-0.00023157526447903;6.9835652539041e-05;-2.2101462491264e-06;-4.2726562242024e-05;-1.9176617570338e-05;-0.00012617277388927;0.00010356225538999;5.2154216973577e-05;-0.00018192770949099;9.9286218755879e-05;-0.00010339344589738;-9.0711364464369e-05;-0.00063396204495803;0.00016466704255436;5.2996823797002e-05;-7.9526935223839e-06;-0.00010752845264506;-2.8880633180961e-05;1.4758009456273e-05;4.1783849155763e-05;-6.3210754888132e-05;0.00065357476705685;3.4118755138479e-05;-0.00043201318476349;-8.0251185863744e-05;-0.0004731927474495;9.8953532869928e-05;0.00012213269656058;1.2151670489402e-05;-2.5254197680624e-05;-0.00015361203986686;-0.0007307983469218;0.00012654191232286;7.7808246714994e-05;-1.4818929230387e-05;2.6395726308692e-05;-9.1927635367028e-05;-8.9797518739942e-05;-0.0001739723229548;1.239955508936e-05;0.00030378700466827;5.5592128774151e-05;0.00022798367717769;0.00011041999096051;0.00076094915857539;-0.00010088906128658;-0.00012864742893726;-7.0339025114663e-05;4.2990985093638e-05;-1.1678914688673e-06;-3.5907516576117e-05;-0.00011279386671958;-0.00029785436345264;0.00022249043104239;0.0006934572593309;0.00049907126231119;0.00064001249847934;0.00011458382505225;6.4926876802929e-05;-2.8870103051304e-05;4.2655810830183e-06;5.580469587585e-05;4.167589941062e-05;3.206290784874e-05;0.0001514098548796;2.3436476112693e-05;3.5705787013285e-05;0.00069725239882246;0.0011386291589588;0.00010073362500407;-0.00093762949109077;-0.0012955735437572;-0.00047856563469395;-0.00042722394573502;-0.00017131386266556;-0.00044445763342083;-0.00014308498066384;-0.0001701982691884;-2.0093741568417e-06;2.5330598873552e-05;1.2362203960947e-05;-4.3636275222525e-05;-0.0006385445012711;0.00045538070844486;0.00045267911627889;-1.063358013198e-05;0.00021746796846855;9.7037423984148e-05;-4.5061973651173e-05;5.3175994253252e-05;2.0128598407609e-05;-1.7209906218341e-05;0.00051641534082592;7.4698895332403e-05;6.5745698520914e-05;4.6656772610731e-05;-4.6602115617134e-05;-6.3822517404333e-05;-0.00022273311333265;0.00014255214773584;8.781020733295e-05;-0.00012323452392593;4.9271562602371e-05;-0.00011457467917353;-0.00018657665350474;-0.0006004583556205;-0.00015036930562928;7.2522627306171e-05;1.1797672414104e-05;-0.00010108708374901;-0.00014657873543911;1.9011238691746e-05;8.5135070548858e-05;-0.00038620291161351;0.00086658773943782;0.00025575634208508;-0.00054529681801796;9.3786518846173e-05;-0.00059209315804765;7.5014300819021e-05;0.00010824337368831;2.6686791898101e-05;-3.2375166483689e-05;0.00017917425429914;-0.00087819929467514;0.00012738410441671;5.4364114475902e-05;-4.1326806240249e-05;3.0372922992683e-05;-0.00015018586418591;-0.00011701518815244;-0.00015161315968726;-7.4684459832497e-05;0.00044455099850893;-1.7536225641379e-05;0.00028147010016255;-0.00024136455613188;0.00091204029740766;-5.6578712246846e-05;-0.00011196370905964;-0.0001226363965543;8.2130791270174e-05;2.21185364353e-05;-4.0608731069369e-05;9.7588444987196e-06;-0.00034075201256201;3.9187536458485e-05;0.00090150500182062;0.0002979009586852;0.00060827139532194;0.00011463224655017;4.0275910578202e-05;-3.2250030926662e-05;1.451725984225e-05;3.4594620501593e-06;-1.5196750382529e-06;-1.6979574866127e-05;0.00018423311121296;7.5679531619244e-06;3.3494878152851e-05;0.00045698654139414;0.00099728838540614;8.3123377407901e-05;-0.0005641701282002;-0.0012968166265637;-0.00043162051588297;-0.00034788271295838;-2.8393020329531e-05;-0.00051326758693904;-7.9378012742382e-05;-0.0001557796203997;1.2784079444828e-05;4.8148747737287e-05;2.0299223251641e-05;-6.4625390223227e-05;-0.00049532856792212;0.00024735505576245;0.00044715602416545;0.00011563330917852;0.00015755702042952;0.00029741821344942;-5.6331929954467e-05;6.4374879002571e-05;1.0865942385863e-05;-6.6335192059341e-06;0.000431099178968;0.00043008150532842;6.0163358284626e-05;9.0929439465981e-05;-4.4113057811046e-05;-0.00011789608106483;-0.00028813222888857;0.00019496379536577;0.0001279566786252;-7.6637668826152e-05;-2.2783522581449e-05;-0.00010779612784972;-0.00032052415190265;-0.00054727937094867;-0.00049910560483113;8.8717133621685e-05;3.1208011932904e-05;-8.418619108852e-05;-0.00029188889311627;1.5891906514298e-05;0.0001472654112149;-0.0006475483532995;0.001086528529413;0.00044816225999966;-0.00063709571259096;0.0002256663137814;-0.00069143902510405;6.3801060605329e-05;0.00011076810915256;3.8083162507974e-05;-3.8649672205793e-05;0.00043573294533417;-0.0010308880591765;0.00014197603741195;6.1095706769265e-05;-6.5806772909127e-05;2.8841663151979e-05;-0.00022137491032481;-0.00012412042997312;-0.00013943492376711;-0.00014056180953048;0.00055796548258513;-8.100565901259e-05;0.00031849622610025;-0.00052668649004772;0.0010398485464975;-2.5282777642133e-05;-0.00011205796909053;-0.00017319340258837;0.00010015643783845;4.1375511500519e-05;-4.3351956264814e-05;0.00010302063310519;-0.00040563588845544;-6.8476423621178e-05;0.001182603999041;0.00015808349417057;0.00061841501155868;0.00012897620035801;2.4903576559154e-05;-3.6330147850094e-05;2.4725677576498e-05;-4.4402655476006e-05;-5.5750191677362e-05;-4.8457401135238e-05;0.00022982792870607;-8.3112863649148e-06;3.2794359867694e-05;0.00027228653198108;0.00097605778137222;7.1077411121223e-05;-0.00030915523529984;-0.0014132731594145;-0.00043603315134533;-0.00030582828912884;6.7312146711629e-05;-0.00060790579300374;-3.4105745726265e-05;-0.00015587802045047;2.5438450393267e-05;7.3896742833313e-05;2.7718926503439e-05;-8.7595471995883e-05;-0.00026491688913666;6.1389480833896e-05;0.00028285494772717;0.00011457804066595;7.6564239861909e-05;0.00031993648735806;-4.7236077080015e-05;5.3258961997926e-05;1.7802074125939e-06;5.3377021913548e-07;0.00023846716794651;0.00050158245721832;3.4421376767568e-05;7.9604687925894e-05;-2.354294883844e-05;-0.00011125913442811;-0.00019318376143929;0.00015978628653102;0.00010812887921929;-4.4910724682268e-05;-5.4361451475415e-05;-5.9159927332075e-05;-0.00029876234475523;-0.0003234741743654;-0.00052381277782843;6.2966784753371e-05;3.0671690183226e-05;-4.3050913518528e-05;-0.00028563642990775;6.4163255046878e-06;0.00014036579523236;-0.00053839385509491;0.00082904065493494;0.00038436558679678;-0.00046618940541521;0.00019758549751714;-0.00050209439359605;3.8400547055062e-05;8.0043464549817e-05;3.0138109650579e-05;-2.8131527869846e-05;0.00038995099021122;-0.00075134704820812;0.00010510024731047;5.2588558901334e-05;-5.4797681514174e-05;1.409799187968e-05;-0.00019129349675495;-8.9755129010882e-05;-8.9685476268642e-05;-0.00011411040031817;0.0004303767636884;-7.572551839985e-05;0.00022383948089555;-0.00046823563752696;0.00074057589517906;-4.0690420064493e-06;-7.7275537478272e-05;-0.00013790764205623;6.4089756051544e-05;3.5159009712515e-05;-2.6340740078012e-05;0.00010323352034902;-0.00030195334693417;-7.0820176915731e-05;0.00093837454915047;5.3186791774351e-05;0.00041848563705571;9.741112444317e-05;1.2447429071472e-05;-2.5817224013736e-05;2.0921452232869e-05;-5.0859878683696e-05;-7.0472815423273e-05;-4.1143590351567e-05;0.00017544113507029;-1.4237304640119e-05;2.065005901386e-05;9.873001545202e-05;0.00067051197402179;4.1510276787449e-05;-0.00011130941857118;-0.0010218676179647;-0.00030720501672477;-0.00018944284238387;7.3652598075569e-05;-0.00044636731036007;-4.6834670683893e-06;-0.00010606127762003;2.2503740183311e-05;6.1182385252323e-05;2.1601250409731e-05;-6.7602639319375e-05;1.3125214536558e-05;-1.3235779078968e-05;-1.1875084055646e-05;3.5944776755059e-05;7.8218428825494e-05;-0.00015490091755055;0.00022621055541094;-0.00029500375967473;-0.00035067161661573;0.00040957832243294;-6.9055554376973e-06;2.0402711015777e-05;1.4642019777966e-05;-1.6738849808462e-05;0.00010777105489979;-0.00023147501633503;-2.8955855668755e-05;-1.0859118447115e-05;1.1876052667503e-05;2.5623108740547e-05;2.6862060622079e-05;-0.0001754704862833;0.00020291116379667;2.7165251594852e-06;-3.123391434201e-05;-0.00014160574937705;0.00027563908952288;-4.1849480112433e-06;-1.352947219857e-05;-1.9768206129811e-06;3.7101894122316e-05;8.5462706920225e-06;-1.470987808716e-05;-3.3965483453358e-05;7.3579931267886e-06;0.00043185483082198;3.3882817660924e-05;0.00041788496309891;-0.00010343940812163;-0.00049939606105909;0.00024600606411695;-2.0233534087311e-05;2.0706473151222e-05;-3.9231177652255e-05;-4.9761689297156e-05;0.00033177802106366;-0.0001213584546349;8.3464154158719e-05;0.00035887732519768;0.00021961999300402;-0.0002326914400328;-0.00011624136823229;-0.0005837029311806;-0.00014417876082007;4.6897286665626e-05;-6.0879478951392e-06;-0.00043197383638471;0.0001159836538136;2.1837464373675e-05;-7.8522743933718e-06;-7.265778663168e-07;6.085348650231e-05;-3.9929791455506e-06;2.4578309876233e-06;4.7513531171717e-05;2.1377209122875e-05;3.6270703276386e-05;6.7258944909554e-05;6.6554384829942e-06;7.7133627200965e-05;0.00010760428995127;-0.00010312391532352;4.16633201894e-06;-9.6003859653138e-06;7.442242349498e-05;2.4894216039684e-05;-7.1590417064726e-05;5.6919539929368e-05;-2.25647672778e-05;9.4295312010217e-05;3.1183277314994e-05;-1.7777652828954e-05;-4.0407347114524e-05;-7.9647696111351e-05;-9.7465985163581e-05;-9.0743000328075e-05;-1.9859622625518e-05;2.4086817575153e-05;-7.4900010076817e-05;2.7557066459849e-06;9.7313713922631e-06;-3.243743776693e-05;-2.4615363145131e-05;-7.6928046155444e-07;-1.9578426417866e-06;-7.9951532825362e-06;6.2923456425779e-05;-0.00036536640254781;-3.4289208997507e-05;-6.2434424762614e-05;-0.00016534942551516;5.9338341088733e-05;0.00016311177751049;9.3580812972505e-05;6.5426629589638e-06;-2.5614115656936e-05;9.2966201918898e-06;-0.00046046517672949;-0.00011200804146938;-0.00010973873577313;-0.00012424825399648;1.4645009287051e-05;0.00028560811188072;8.3300947153475e-06;0.00011881539830938;8.4177983808331e-05;-5.7428354921285e-05;-5.6319775467273e-05;0.00044847320532426;0.00014019530499354;-0.00011067123705288;-3.9124342947616e-06;0.00019770342623815;5.8256632655684e-06;1.9645674910862e-05;-2.6913196052192e-05;-9.3502123490907e-05;3.3820706448751e-05;0.00050244078738615;-8.6984866356943e-05;0.00067914073588327;-0.00037337114918046;-0.00098394823726267;0.00066888896981254;-1.6459485777887e-05;4.7193272621371e-05;-0.00013788425712846;-6.5058535255957e-05;0.00048848753795028;-0.00035487677087076;7.950363215059e-05;0.0003657978377305;0.00030015138327144;-0.00021794512576889;-9.003649756778e-05;-0.00079355947673321;-1.7481257600593e-05;0.0001399687898811;-4.6076598664513e-05;-0.00056099466746673;0.00037751859053969;8.2830538303824e-06;-2.5228202503058e-05;7.5548385211732e-05;0.00010393111006124;3.0741800856049e-06;-3.7805077681696e-06;8.2126956840511e-05;5.3372416005004e-05;0.00031867239158601;3.4024589695036e-05;0.00044591823825613;4.8730039452494e-06;-6.6644694015849e-05;-3.8351929106284e-05;-1.5630588677595e-05;-2.4576836949564e-05;0.00019536229956429;-2.0548503016471e-05;-1.3981195479573e-05;3.6562963941833e-05;-1.4864703189232e-05;0.00036856110091321;6.7576271248981e-05;-0.00012213845911901;-0.00015206637908705;-0.00059650075854734;-5.7115063100355e-05;-0.00018501267186366;1.4850235857011e-05;-0.00024441603454761;-2.325801870029e-05;1.6161731764441e-05;2.2821359380032e-05;-8.5098203271627e-05;2.6738790737113e-08;4.8959882406052e-05;-4.3986503442284e-05;-3.2614669180475e-05;7.214041397674e-05;0.00025124259991571;-0.0002570123760961;0.00060964893782511;-0.00065235927468166;-0.0012066756607965;0.0012681421358138;-8.3506391092669e-05;6.7201603087597e-05;7.0032801886555e-05;-3.2676816772437e-05;0.00059962878003716;-0.00063244975171983;-2.8578195269802e-05;7.616407401656e-06;-2.3433267415385e-05;1.2908556527691e-05;-2.8720128284476e-06;-0.00035413220757619;0.00038118151132949;5.729061740567e-05;-8.6653170001227e-05;-0.0006065564812161;0.00061827676836401;5.4284468205879e-05;-5.2030871302122e-05;-0.00015307425928768;0.00013005641812924;-3.7248073567753e-06;-1.5456992059626e-06;-8.2658320025075e-05;-6.3146122556645e-05;0.00057328888215125;0.00048814516048878;0.00049794494407251;0.00048044096911326;-0.00048000176320784;-0.00040371657814831;-1.734354373184e-05;-1.6034964573919e-05;-0.00022329420608003;-0.00017966590530705;0.00035265923361294;0.0002809199213516;0.0002097634569509;0.00078405870590359;0.00051119911950082;-0.00039521447615698;-0.00036251556593925;-0.00089369289344177;-0.00083335652016103;0.00015908254135866;0.0001210900300066;-0.00045128480996937;-0.00039030279731378;4.6475914132316e-05;3.1864201446297e-05;0.00012583401985466;0.00013473187573254;-1.0076671969728e-05;-1.7062691313185e-06;0.00014635210391134;0.00010523473611102;0.00047681864816695;0.00042404216947034;0.00019631601753645;0.00031985461828299;-5.0410912081134e-05;-0.00016841570322867;2.4777855287539e-05;9.6869925982901e-06;0.00019812532991637;0.00018191551498603;4.0640516090207e-05;7.6303847890813e-05;-4.0149428969016e-05;0.00064659531926736;0.0005044459248893;-0.00025667742011137;-0.00020904075063299;-0.00069675454869866;-0.00076006999006495;-0.00030282360967249;-0.00021786711295135;-0.00020243652397767;-0.00025851564714685;1.6162168321898e-05;9.0261428340455e-06;-0.00010721766739152;-9.4135742983781e-05;2.083138724629e-06;-1.2164828149253e-06;-5.5979344324442e-05;8.8498545665061e-06;5.9140202210983e-05;0.00028627348365262;0.00013804870832246;-1.8665596144274e-05;-0.00014658154395875;-2.3368404072244e-05;-2.3176846752904e-06;-5.7527107856004e-05;-3.0063586109463e-06;6.4532514443272e-06;0.00010454496805323;0.00036831037141383;8.6961401393637e-05;9.9499717180151e-05;2.4828927053022e-05;-3.7102283840795e-06;-0.00022744915622752;-0.00011094362707809;-7.1504124207422e-05;3.8630605558865e-05;2.9601651476696e-05;-0.00013207108713686;-0.0003152632561978;3.4558463539724e-06;8.1210419011768e-05;-1.1329737390042e-05;-0.00015695879119448;-3.083507908741e-05;2.0713641788461e-05;2.8277330784476e-05;-8.2191982073709e-05;-9.4306364189833e-05;0.00050163129344583;-0.00032923123217188;0.00075685698539019;0.00059546390548348;-0.00093804183416069;6.2610721215606e-05;-3.4236750252603e-06;-8.0902165791485e-05;-7.8537363151554e-05;-0.00033765184343792;0.00044227909529582;7.9541954619344e-05;0.00036464998265728;0.00026800032355823;-9.2923037300352e-05;-0.00019832522957586;-5.0335906962573e-06;-0.0008361124782823;-4.6332250349224e-05;8.246955985669e-05;0.00037325901212171;-0.00057740067131817;-3.053279579035e-05;-8.9318155005458e-06;0.00011647574137896;7.8483753895853e-05;-1.4304794149211e-07;1.1944000561925e-06;4.6768596803304e-05;6.3246538047679e-05;2.1225756427157e-05;0.00018396967789158;2.7330432203598e-05;0.00034750282065943;-6.6681728640106e-05;6.86265366312e-06;-3.1515759474132e-05;-1.684834023763e-05;-1.3430606486509e-05;0.00016337692795787;5.2222767408239e-05;-4.66002675239e-05;-2.0275352653698e-05;0.00027411253540777;3.046005986107e-06;-0.00012660000356846;-6.4261468651239e-05;-1.7242105968762e-05;-0.00043349523912184;2.5463887141086e-05;-0.00012687720300164;-4.4263055315241e-05;-0.00015841165441088;2.4557844881201e-05;1.2054367289238e-05;-1.0224714969809e-05;-7.6064679888077e-05;-1.0366305104981e-05;1.3370133274293e-05;3.5304464063302e-07;0.00010245687735733;-0.00085725553799421;-8.574997082178e-06;-0.00014613824896514;-1.9609680748545e-05;0.00060976576060057;-0.00016485071682837;0.00019525951938704;-4.526765042101e-05;1.3098728231853e-05;1.3309541827766e-05;-0.0012519148876891;6.8785389885306e-05;-0.00020800065249205;-0.00025260364054702;-0.00020275391580071;0.00061112048570067;-4.7957109927665e-05;0.00035613143700175;0.00018729857401922;-0.00015284171968233;-5.7216057030018e-06;0.0010551671730354;-3.3229476684937e-05;-0.000242415611865;2.4684495656402e-05;0.00043370536877774;-3.5004770325031e-05;1.349403464701e-05;-2.7805339414044e-05;-0.00012887132470496;9.4006696599536e-05;0.00032652600202709;-8.0084915680345e-05;0.00079797051148489;-0.00049595412565395;-0.0011476085055619;0.00083692581392825;7.6502197771333e-05;4.9444293836132e-05;-0.00023044199042488;-6.3130042690318e-05;0.00018519446894061;-0.00044412838178687;2.1944057152723e-05;0.00041958547080867;0.00040580896893516;-5.5350363254547e-05;-0.0001422778586857;-0.00095179333584383;-3.1238374504028e-05;0.00012965715723112;-9.1697940661106e-05;-0.00025404506595805;0.00047954230103642;-9.6843032224569e-05;-2.6050103770103e-05;0.00031704251887277;0.00011367625120329;1.5803543647053e-05;-5.0274911700399e-06;0.00017376724281348;7.1045906224754e-05;0.00037437598803081;-6.574528379133e-05;0.000641793187242;-1.4332507817016e-05;-0.00012086717470083;6.9380289460241e-06;-0.00013438829046208;-4.4973359763389e-05;0.00033699389314279;-3.9219994505402e-05;0.00012737934594043;1.2610450539796e-05;-6.7842418502551e-05;0.00037831100053154;-7.3369905294385e-05;-0.00013592399773188;-0.00013624527491629;-0.00069097685627639;9.857725672191e-05;-0.00025458421441726;5.4341177019523e-05;-0.00038846305687912;6.4624837250449e-06;0.00014912810001988;3.2285799534293e-05;-0.00032269369694404;1.4840157746221e-05;-6.764768386347e-06;6.9133238866925e-06;-2.6008672193711e-06;0.00010216785449302;-0.00075219670543447;-2.9072112738504e-05;-0.00013108151324559;-0.00011905644350918;0.00039451633347198;8.9112909336109e-06;0.00017389653658029;-2.3240560039994e-05;-7.868162356317e-06;1.3398590454017e-05;-0.001028380356729;-3.1236992072081e-05;-0.00019701753626578;-0.00023332245473284;-0.00011173221719218;0.00055156310554594;-2.2081592760514e-05;0.00029134078067727;0.00016865540237632;-0.00012879203131888;-3.887962520821e-05;0.00091973331291229;7.0918504206929e-05;-0.00021204145741649;1.2235169378982e-05;0.00037786061875522;-1.6745392713347e-05;2.1504236428882e-05;-3.4704153222265e-05;-0.00013689784100279;7.6549593359232e-05;0.00054624793119729;-0.00010528295388212;0.0009273556061089;-0.00053665199084207;-0.0013272286159918;0.00093147961888462;2.8926682716701e-05;6.0232323448872e-05;-0.00022351910592988;-8.056598744588e-05;0.00045844813575968;-0.00049448106437922;7.0750029408373e-05;0.00050137512153015;0.00043638833449222;-0.00019175138731953;-0.00014706156798638;-0.0010995412012562;-3.0515740945702e-05;0.00017109821783379;-8.2738435594365e-05;-0.00055080914171413;0.00053049740381539;-4.5254801079864e-05;-3.1816878617974e-05;0.00022254850773606;0.00013541922089644;1.054851054505e-05;-4.8044639697764e-06;0.00015616347081959;7.2882525273599e-05;0.00042478126124479;-1.4161701983539e-05;0.00063690420938656;3.3346398140566e-06;-9.5871058874764e-05;-3.2772954000393e-05;-8.7489272118546e-05;-4.2021612898679e-05;0.00032824085792527;-3.3348725992255e-05;6.8490218836814e-05;3.7581281503662e-05;-4.8200021410594e-05;0.00044567475561053;-2.9849318252673e-06;-0.00016077206237242;-0.00017121438577306;-0.00076182221528143;1.8339525922784e-05;-0.00027156955911778;4.1054125176743e-05;-0.00038745137862861;-1.9234359569964e-05;9.6083516837098e-05;3.3549782529008e-05;-0.00024560507154092;5.6950912039611e-06;-2.6764341782837e-06;6.6284070499023e-07;-6.0206584748812e-06;9.1587542556226e-05;-0.00058741017710418;-4.4141117541585e-05;-9.7725162049755e-05;-0.00018903157615568;0.00018890544015449;0.00014913037011866;0.00014062788977753;-3.0622184112872e-06;-2.1915575416642e-05;1.1500917025842e-05;-0.00076294073369354;-0.00011056740186177;-0.0001673283695709;-0.00019328015332576;-3.1335181120085e-05;0.00044686344335787;4.8473193459131e-08;0.00020741405023728;0.00013982807286084;-9.698978101369e-05;-6.1230712162796e-05;0.00071552733425051;0.00014992550131865;-0.00016906516975723;1.0833051646841e-06;0.00030140933813527;2.0587705762409e-07;2.455635512888e-05;-3.5661865695147e-05;-0.00012955073907506;5.6960449001053e-05;0.00063332763966173;-0.00010894459410338;0.00092217628844082;-0.00051009381422773;-0.0013242980930954;0.00090602558339015;-3.9925334931468e-06;6.1793369241059e-05;-0.0001996118662646;-8.5567568021361e-05;0.00058641732903197;-0.00048032446647994;9.5096373115666e-05;0.00050340365851298;0.00041815702570602;-0.00025973955052905;-0.00013445783406496;-0.0010870035039261;-3.2168692996493e-05;0.00018207977700513;-6.8740911956411e-05;-0.00068411132087931;0.00051193765830249;-8.6283807831933e-06;-3.2693264074624e-05;0.00014535922673531;0.00013829827366862;6.3248812693928e-06;-4.7251478463295e-06;0.00012961587344762;7.0851092459634e-05;0.00042549558565952;2.5806722987909e-05;0.00059890607371926;9.769382813829e-06;-8.4332488768268e-05;-4.9473619583296e-05;-4.6803579607513e-05;-3.5940065572504e-05;0.00029006757540628;-2.7784844860435e-05;1.7529873730382e-05;4.7280169383157e-05;-3.1281382689485e-05;0.00046920965542085;5.5690845329082e-05;-0.00016348440840375;-0.00018747805734165;-0.00077159772627056;-4.5038446842227e-05;-0.0002594942052383;2.6325857106713e-05;-0.00035008636768907;-3.0531355150742e-05;5.1032449846389e-05;3.1587122066412e-05;-0.00016816843708511;7.2694024311204e-07;4.9181366193807e-05;-4.3548690882744e-05;-3.1922747439239e-05;7.0779700763524e-05;0.00018148653907701;-0.00018137505685445;0.00052982312627137;-0.00054769281996414;-0.0011849052971229;0.0012384164147079;-8.3391452790238e-05;6.7918459535576e-05;5.7227083743783e-05;-1.4992440810602e-05;0.00058958400040865;-0.00061414105584845;-2.8580267098732e-05;1.0397450751043e-05;-2.9993072530488e-05;3.6686800740426e-05;-2.748010410869e-05;-0.0002648337977007;0.00028258780366741;6.6925655119121e-05;-9.6993178885896e-05;-0.0005511773051694;0.00054346595425159;5.6145192502299e-05;-5.636607966153e-05;-0.00015663648082409;0.00013340421719477;-2.2747553884983e-06;2.6289949346392e-06;-9.588247485226e-05;-7.5447656854521e-05;0.00048509077169001;0.00046103337081149;0.00044928101124242;0.00050111516611651;-0.0004389388486743;-0.00046995276352391;-2.2669371901429e-05;-2.8008147637593e-05;-0.00024875652161427;-0.00019834935665131;0.00032801204361022;0.00032499161898158;0.00019630200404208;0.00066558265825734;0.00044562839320861;-0.0003307078150101;-0.00032588993781246;-0.00076420657569543;-0.00075252703391016;0.00019053129653912;0.00015245891700033;-0.00039702109643258;-0.00041880595381372;5.1747112593148e-05;4.2128060158575e-05;0.00013763428432867;0.00013527263945434;-1.1160802387167e-05;-2.2898443603481e-06;0.00014997943071648;0.00010939884668915;0.00058006623294204;0.00049896945711225;0.00024940795265138;0.00036673710565083;-0.0001073552921298;-0.00019889682880603;3.5409051633906e-05;1.7327218301944e-05;0.00020113030041102;0.00019231320766266;6.8933950387873e-05;8.6728796304669e-05;-3.003685742442e-05;0.00076253269799054;0.00064353441121057;-0.00030649473774247;-0.0002473562490195;-0.00085521611617878;-0.00090404850197956;-0.00033019826514646;-0.0002416805800749;-0.00025569289573468;-0.00029672661912628;1.2045326002408e-05;4.4250032260607e-06;-0.0001016508686007;-9.0134541096631e-05;8.083377906587e-05;-7.1570008003619e-05;-5.5189299018821e-05;0.00011400342918932;0.00033618038287386;-0.00031410300289281;0.00090891221771017;-0.00092038081493229;-0.0019665444269776;0.0020417582709342;-0.00014119393017609;0.00011023687693523;9.7514195658732e-05;-2.7699936254066e-05;0.00099533970933408;-0.0010045466478914;-3.8838817999931e-05;2.5642239052104e-05;-5.568752749241e-05;3.8617941754637e-05;-4.3710115278373e-05;-0.00046915007987991;0.0004894933081232;0.00011402738164179;-0.00015352728951257;-0.00094828166766092;0.00090099638327956;9.5409333880525e-05;-9.0842768258881e-05;-0.0002623851178214;0.00021468607883435;-6.3385032262886e-06;5.2258405958128e-06;-0.00015018146950752;-0.00012548384256661;0.00079436175292358;0.00079060345888138;0.0007111209561117;0.00086461595492437;-0.00066291476832703;-0.00082314078463241;-3.1243049306795e-05;-4.5833847252652e-05;-0.00039844497223385;-0.00032048008870333;0.00050837709568441;0.00055885082110763;0.00032775063300505;0.0011256173020229;0.00074772449443117;-0.00055454968241975;-0.0005525735905394;-0.001259216456674;-0.0012902132002637;0.00029653261299245;0.00024806402507238;-0.00062729587079957;-0.00072347861714661;7.9929384810384e-05;6.7880610004067e-05;0.00022584738326259;0.00021888648916502;-1.8443783119437e-05;-3.6213875773683e-06;0.00024315717746504;0.00017930529429577;0.00091391953174025;0.00080726610030979;0.00037637539207935;0.0006025496404618;-0.00016051561397035;-0.00031689077150077;5.4973967053229e-05;2.7211006454309e-05;0.00031696443329565;0.00031943051726557;0.00010722044680733;0.0001357563160127;-5.0771544920281e-05;0.0012236892944202;0.0010216742521152;-0.00049146864330396;-0.00039600761374459;-0.0013459417968988;-0.0014648456126451;-0.00052479212172329;-0.00039605496567674;-0.00039375107735395;-0.00048179010627791;2.1849542463315e-05;7.5473290053196e-06;-0.00016312612569891;-0.00015086913481355;7.8081277024467e-05;-6.8370616645552e-05;-5.8900510339299e-05;0.00010462382488186;0.00031659915111959;-0.00024640402989462;0.00086604378884658;-0.00081117323134094;-0.0018992871046066;0.0019373121904209;-0.00014196975098457;0.00010237537208013;8.8074208179023e-05;-1.41837499541e-05;0.00098850845824927;-0.00092715705977753;-2.1304271285771e-05;4.4436095777201e-05;-7.5904179539066e-05;2.5636874852353e-05;-7.121980888769e-05;-0.00042194471461698;0.00041510775918141;0.00012705179688055;-0.00014614252722822;-0.00093050242867321;0.00079420796828344;9.7167932835873e-05;-8.6321386334021e-05;-0.00026227184571326;0.00019783042080235;-9.8907839856111e-06;1.1054377864639e-05;-0.00014342146459967;-0.00013600630336441;0.0006715870113112;0.00079988560173661;0.00058093282859772;0.00093341042520478;-0.00048122834414244;-0.00096419244073331;-2.2271760826698e-05;-5.5598193284823e-05;-0.00039100291905925;-0.00031934690196067;0.00040189173887484;0.00063243234762922;0.00031090242555365;0.0010276300599799;0.00068812194513157;-0.00048919406253844;-0.00052844203310087;-0.0010921737411991;-0.0012673656456172;0.00028363455203362;0.00026602967409417;-0.0004965229309164;-0.00079348206054419;7.1704984293319e-05;7.3463670560159e-05;0.00023110576148611;0.00020635208056774;-1.8792165064951e-05;-3.3506112231407e-06;0.00023208073980641;0.0001764510961948;0.00090337247820571;0.00082781456876546;0.00035327416844666;0.00063912518089637;-0.00017832129378803;-0.00032086373539641;5.6360448070336e-05;3.0474106097245e-05;0.00028388545615599;0.00032904034014791;0.00011780346540036;0.00012856474495493;-4.3299285607645e-05;0.0012350536417216;0.001045401324518;-0.00049765012226999;-0.00039815917261876;-0.0013331099180505;-0.0015146571677178;-0.00049823900917545;-0.00040390220237896;-0.00038146277074702;-0.00049799215048552;2.1044861568953e-05;2.8059373562428e-06;-0.00014467933215201;-0.0001480736391386;5.3534138714895e-05;-4.6354427468032e-05;-4.4595115468837e-05;7.0377645897679e-05;0.00020546582527459;-0.00013380667951424;0.00058269716100767;-0.000505679869093;-0.0012998858001083;0.0013074059970677;-0.00010013645805884;6.6993176005781e-05;5.282592610456e-05;1.8949705236082e-06;0.0006892008241266;-0.00061066803755239;-6.3807501646806e-06;4.1062281525228e-05;-6.684054096695e-05;1.3499868146027e-05;-6.5822387114167e-05;-0.00026542533305474;0.00024777060025372;0.00010010800178861;-0.00010195506183663;-0.00063972227508202;0.00049755990039557;6.8757515691686e-05;-5.7596389524406e-05;-0.00018111000827048;0.00012682525266428;-8.4012763181818e-06;1.0754892173281e-05;-9.9723300081678e-05;-0.00010220985859632;0.00040739879477769;0.00056033546570688;0.00034289032919332;0.00068323581945151;-0.00024779731757008;-0.00074706703890115;-1.0965228284476e-05;-4.4065789552405e-05;-0.00027166554355063;-0.00022588243882637;0.00023053503537085;0.00048271793639287;0.00020972138736397;0.00066012487513945;0.00044719054130837;-0.00030562386382371;-0.00035536877112463;-0.00067653646692634;-0.00086288002785295;0.00019487320969347;0.00019855797290802;-0.00028440228197724;-0.00058993697166443;4.5711356506217e-05;5.4530530178454e-05;0.00016525039973203;0.00013869762187824;-1.3745094292972e-05;-2.0478803435253e-06;0.00015787642041687;0.00012137620069552;0.00063367479015142;0.00059908436378464;0.00023765457444824;0.00048096015234478;-0.00013349125219975;-0.00023682307801209;4.1239538404625e-05;2.4075377950794e-05;0.00018014440138359;0.00023453701578546;8.528812759323e-05;8.5919906268828e-05;-2.4859697077773e-05;0.00088750850409269;0.0007573765469715;-0.00035818433389068;-0.00028481357730925;-0.0009410377824679;-0.0011089310282841;-0.00033698728657328;-0.00028723923605867;-0.00026009607245214;-0.00036316897603683;1.3780660992779e-05;-2.1230500806269e-06;-8.8985652837437e-05;-9.7962598374579e-05;-1.8300181636732e-07;9.9965711797267e-07;-6.4616506278981e-05;8.9671348177944e-06;3.6685989471152e-05;0.00038130467873998;0.0001218551187776;3.178492988809e-05;-0.00010499668132979;-0.00011162010196131;2.3762820546835e-06;-7.8001612564549e-05;-8.8590641098563e-06;8.3734448708128e-06;8.2390244642738e-05;0.00050535995978862;0.00010552544699749;0.00012680617510341;3.1723990105093e-05;2.7884400424227e-06;-0.00028627243591473;-9.8352065833751e-05;-0.00013460863556247;4.4174721551826e-05;4.1723473259481e-05;-0.00010854448191822;-0.00043528407695703;1.9689316843596e-07;0.00010758299322333;-3.2460377497046e-06;-0.00020603490702342;-3.3098494895967e-05;2.2211404939299e-05;3.2324718631571e-05;-9.5548180979677e-05;-0.00010507653496461;0.00049765524454415;-0.00036944603198208;0.0008053183555603;0.00067089131334797;-0.0010380505118519;7.1681242843624e-05;3.2511914014322e-06;-8.5035688243806e-05;-0.0001052233055816;-0.00038189036422409;0.00045167995267548;7.695858948864e-05;0.00035988926538266;0.00029294620617293;-8.5733852756675e-05;-0.00018500244186725;-1.5545754195045e-06;-0.00086624355753884;-5.9651720221154e-05;9.9362194305286e-05;0.0004192928026896;-0.00057867198484018;-3.5980847314931e-05;-1.8047201592708e-05;0.00012892250379082;0.00011187037307536;-1.7031485413099e-06;3.4602965115482e-06;5.925484947511e-05;6.9141511630733e-05;5.2273469464126e-07;0.00024508088245057;7.0076907832117e-06;0.0005030847969465;-4.0435017581331e-05;-4.9643182137515e-05;-3.8336751458701e-05;-2.0680838133558e-05;-2.5043153073057e-05;0.0001970574085135;4.0693557821214e-05;-4.4997163058724e-05;-2.1491672669072e-05;0.00035142354317941;-5.1623233048304e-06;-0.00016044059884734;-8.0409532529302e-05;1.0783838661155e-05;-0.00058955018175766;3.8479582144646e-05;-0.00014687309158035;-2.5249020836782e-05;-0.00022861079196446;2.8871618269477e-05;1.1435899068601e-05;-3.8920948099985e-06;-8.3779588749167e-05;-3.3596231787669e-06;3.1509582640865e-06;-6.439202115871e-05;3.8813232094981e-06;1.4282273696153e-05;0.00043338804971427;7.9974764958024e-05;7.3352275649086e-05;-3.1141553336056e-05;-0.0002076312812278;1.1449874364189e-05;-8.4663442976307e-05;-1.1037618605769e-05;1.2648525853365e-06;3.79562152375e-05;0.00058979756431654;0.00011243455810472;0.00013852422125638;5.1708000682993e-05;1.0832571206265e-05;-0.00031076231971383;-8.3688137237914e-05;-0.00018376240041107;3.4539858461358e-05;5.1790590077871e-05;-6.026401752024e-05;-0.0005029285675846;-5.4372703743866e-06;0.00011675401037792;6.6884163061331e-06;-0.00022270213230513;-2.9978262318764e-05;1.9656199583551e-05;3.5511118767317e-05;-9.2981710622553e-05;-9.6283707534894e-05;0.00040855110273696;-0.00035160296829417;0.00073265051469207;0.0006379903643392;-0.00096887809922919;6.8301982537378e-05;1.3616844626085e-05;-7.4800482252613e-05;-0.00011469366290839;-0.0003644819080364;0.00036717439070344;5.9035275626229e-05;0.00030707608675584;0.00027454533847049;-7.1527436375618e-05;-0.00013629715249408;-6.2492017605109e-07;-0.00077159079955891;-6.5247644670308e-05;9.5766976301093e-05;0.00039817322976887;-0.00047294382238761;-3.5008946724702e-05;-2.9719809390372e-05;0.00011983157310169;0.00013878027675673;-1.999442702072e-06;5.0984863264603e-06;5.8329980674898e-05;7.1519418270327e-05;-2.5517298126942e-05;0.00025505316443741;-7.1025597208063e-06;0.00054733181605116;-1.5917687051115e-05;-8.0181715020444e-05;-4.005609662272e-05;-2.982621845149e-05;-3.1088857213035e-05;0.00020637009583879;2.6639627321856e-05;-2.3026947019389e-05;-2.3711463654763e-05;0.00034624326508492;-2.7364170819055e-05;-0.00015359173994511;-8.1627396866679e-05;4.497823829297e-05;-0.0006074890261516;4.7771052777534e-05;-0.00014571244537365;-7.6205251389183e-06;-0.0002577627892606;2.8850221497123e-05;2.0507266526693e-05;1.577559260113e-06;-0.00010067375842482;-1.2201845493109e-05;1.991484532482e-05;1.0948634553642e-05;0.00011113675282104;-0.0010475015733391;3.0024691568542e-06;-0.00016856395814102;7.1101167122833e-05;0.00093287299387157;-0.00035879146889783;0.00023035841877572;-7.1735485107638e-05;5.8314042689744e-05;6.3002557908476e-06;-0.0016679152613506;0.00017104391008615;-0.00024470637436025;-0.00031233209301718;-0.00033505706232972;0.00073603814234957;-7.2377908509225e-05;0.00047783233458176;0.00024038158881012;-0.0002049246977549;3.2068364816951e-05;0.0012967239599675;-0.00013127164856996;-0.00029463035752997;4.0780771087157e-05;0.00053425913210958;-5.1068138418486e-05;2.6390773655294e-06;-2.0377769033075e-05;-0.00013219751417637;0.00013121696247254;2.1877685867366e-05;-3.9220438338816e-05;0.00070202990900725;-0.00049090327229351;-0.0010513118468225;0.00080980057828128;0.00015872705262154;4.0741619159235e-05;-0.0002796521584969;-4.9280435632681e-05;-0.0002304698136868;-0.00042782764649019;-5.3478881454794e-05;0.00034438440343365;0.00043066890793853;0.00015170205733739;-0.00014875484339427;-0.00084257411072031;-6.3098428654484e-05;8.4410814451985e-05;-0.000118528791063;0.00019387013162486;0.00046128305257298;-0.00018859056581277;-2.1042849766673e-05;0.00052232953021303;0.00010162761464017;2.6633542802301e-05;-6.8738077061425e-06;0.00023012730525807;8.6847241618671e-05;0.00037751952186227;-0.00014354957966134;0.00080999580677599;-5.5378659453709e-05;-0.00020902526739519;8.3378872659523e-05;-0.00022078136680648;-5.587279520114e-05;0.00041004363447428;-5.6164975831052e-05;0.00022395698761102;-3.0024813895579e-05;-0.00011237476428505;0.00037562311626971;-0.00016561722441111;-0.00012151295231888;-0.00012013802916044;-0.00076756166527048;0.00021733956236858;-0.00028415626729839;7.6378746598493e-05;-0.00045373869943433;5.4692241974408e-05;0.00024892797227949;3.6678673495771e-05;-0.00048875238280743;3.3380048989784e-05;5.4785305110272e-05;-4.800177339348e-05;-3.3167434594361e-05;7.7902812336106e-05;0.00015422161959577;-0.00015814599464647;0.00053525588009506;-0.00054269493557513;-0.0012908093631268;0.0013488543918356;-9.0879693743773e-05;7.521527732024e-05;6.024251706549e-05;-9.3574572019861e-06;0.00063901033718139;-0.00067029026104137;-3.453957833699e-05;9.3743410616298e-06;-3.8197773392312e-05;6.2974875618238e-05;-4.6320863475557e-05;-0.00024118725559674;0.00026096976944245;7.3427661845926e-05;-0.00011063780402765;-0.000569871685002;0.00055832805810496;6.2393490225077e-05;-6.5205305872951e-05;-0.00017730229592416;0.0001536530762678;-5.6968821127157e-07;4.8428173613502e-06;-0.00011400253424654;-8.7624517618679e-05;0.00048875214997679;0.00047744781477377;0.00048046189476736;0.00054499920224771;-0.00048149144276977;-0.00053476687753573;-3.0733390303794e-05;-3.8521116948687e-05;-0.00028999423375353;-0.0002313638542546;0.00035884382668883;0.0003725643036887;0.00020469234732445;0.00065676955273375;0.00044360861647874;-0.00032450372236781;-0.000332315772539;-0.0007704742019996;-0.00075761356856674;0.00023158109979704;0.00018643114890438;-0.00041885999962687;-0.00046153884613886;6.250519072637e-05;5.382494055084e-05;0.0001570736640133;0.00014997521066107;-1.2491529560066e-05;-2.1673126866517e-06;0.00016780791338533;0.00012163205246907;0.00069027848076075;0.00058423250447959;0.00029652699595317;0.00042447820305824;-0.00014315254520625;-0.00024200160987675;4.466497557587e-05;2.2355019609677e-05;0.00022991331934463;0.00021952921815682;9.1111942310818e-05;0.00010771620873129;-3.1705185392639e-05;0.00087997398804873;0.00078484514961019;-0.00035442571970634;-0.00028470571851358;-0.0010138234356418;-0.0010563852265477;-0.00038407990359701;-0.00027850654441863;-0.00030968655482866;-0.00035083974944428;1.1339875527483e-05;2.9434072530421e-06;-0.00011462604743429;-0.00010075211321237;8.9941677288152e-05;-7.8485965786967e-05;-5.5683496611891e-05;0.00012222171062604;0.00027394742937759;-0.00024714577011764;0.00090079649817199;-0.00087356736185029;-0.002120055956766;0.0021930318325758;-0.00015301209350582;0.00012064145266777;0.00010804688645294;-2.0602990844054e-05;0.0010692642536014;-0.0010740655707195;-4.5642864279216e-05;2.740584568528e-05;-7.7127457188908e-05;8.9042980107479e-05;-8.9439155999571e-05;-0.00040945093496703;0.00042702528298832;0.00012069312651874;-0.000170399696799;-0.0009665111429058;0.00089012068929151;0.00010548051795922;-0.0001051006038324;-0.0003022302116733;0.00025086113600992;-3.8322873479046e-06;1.0361452041252e-05;-0.00017803453374654;-0.00014617883425672;0.00077251112088561;0.00081576418597251;0.00073880102718249;0.00095136783784255;-0.00069897907087579;-0.00096705876057968;-4.4402386265574e-05;-6.7865796154365e-05;-0.00046964670764282;-0.00038013482117094;0.00053652084898204;0.00065435038413852;0.00033334051840939;0.00108677521348;0.00073046010220423;-0.00052539503667504;-0.0005551790818572;-0.0012361155822873;-0.0012878749985248;0.00036414584610611;0.00031126997782849;-0.00063386437250301;-0.00080604437971488;9.8863813036587e-05;9.2049347585998e-05;0.00026137361419387;0.00024265133833978;-2.0300163669162e-05;-2.8454528546717e-06;0.00027224668883719;0.0002010984608205;0.0011011608876288;0.00095715466886759;0.00045075998059474;0.00071089656557888;-0.00022431142861024;-0.0003939914458897;7.0590940595139e-05;3.5343615309102e-05;0.00036713088047691;0.00037688290467486;0.00015276273188647;0.00017725011275616;-5.6063698139042e-05;0.0014108950272202;0.0012634888989851;-0.00056811439571902;-0.00045542058069259;-0.0016048782272264;-0.0017235606210306;-0.00061683426611125;-0.00046501631732099;-0.00048994011012837;-0.00058691995218396;2.1153855414013e-05;4.8865636017581e-06;-0.00018864446610678;-0.00017686173669063;9.0119443484582e-05;-7.8166805906221e-05;-6.2631828768644e-05;0.00011710725812009;0.00028709028265439;-0.00020717881852761;0.00091681990306824;-0.00082135776756331;-0.0021342856343836;0.002170629799366;-0.00015900436847005;0.00011677287693601;0.0001053385421983;-1.214217627421e-05;0.0011043957201764;-0.00103606027551;-2.7606320145424e-05;4.9518745072419e-05;-9.9998578662053e-05;6.9398091000039e-05;-0.00011522223940119;-0.0004054851597175;0.0003936805005651;0.00013667576422449;-0.00016599157243036;-0.0010017773602158;0.00083218445070088;0.00010984103573719;-0.00010309838398825;-0.00031041644979268;0.00024085119366646;-7.8337907325476e-06;1.5133607121243e-05;-0.00017358295735903;-0.00015823770081624;0.0007062946096994;0.00085870025213808;0.00065109657589346;0.001043220050633;-0.00055222376249731;-0.0011226945789531;-3.4880828025052e-05;-7.6281088695396e-05;-0.00046924484195188;-0.00038780723116361;0.00045700330520049;0.00073647621320561;0.00033229385735467;0.0010613729245961;0.00071604741970077;-0.00049814261728898;-0.00056068279081956;-0.0011547761969268;-0.0013289822963998;0.00035308254882693;0.00033124184119515;-0.00054458616068587;-0.00089215737534687;9.167554526357e-05;9.7897980595008e-05;0.0002715103328228;0.00023906723072287;-2.115731331287e-05;-2.3753666482662e-06;0.00026843679370359;0.00020448116993066;0.0010942760854959;0.0009903033496812;0.0004242256982252;0.00076391344191507;-0.00022941549832467;-0.00040630204603076;7.1651709731668e-05;3.7092941056471e-05;0.00034249329473823;0.00039836138603278;0.00015685314428993;0.00017456829664297;-5.3230854973663e-05;0.0014374840538949;0.0012882024748251;-0.00057781301438808;-0.00046357125393115;-0.0015987392980605;-0.0017921527614817;-0.00060113926883787;-0.00048233865527436;-0.00047387270024046;-0.00061604043003172;2.1985204512021e-05;1.6820562223074e-06;-0.0001752970420057;-0.00018256544717588;5.8120680478169e-05;-5.0048867706209e-05;-4.6209064748837e-05;7.4932948336937e-05;0.00018945976626128;-0.00011241863103351;0.00059794069966301;-0.00049854890676215;-0.0013868726091459;0.0013914406299591;-0.00010643880523276;7.2335998993367e-05;5.8918205468217e-05;3.9922147152538e-06;0.0007321773446165;-0.00064921582816169;-8.2591968748602e-06;4.4072690798203e-05;-7.868525426602e-05;3.2155003282242e-05;-8.5993859102018e-05;-0.00025430138339289;0.00023277246509679;0.00010419265163364;-0.00010960015060846;-0.00066316861193627;0.00050415372243151;7.345833000727e-05;-6.4434483647346e-05;-0.00019957828044426;0.00014365070092026;-7.1744534579921e-06;1.2393517863529e-05;-0.00011237476428505;-0.00011105749581475;0.00041653931839392;0.00057446560822427;0.00037013707333244;0.00071860471507534;-0.0002749118139036;-0.0008069968316704;-1.6407404473284e-05;-5.2823594160145e-05;-0.00030198760214262;-0.00025431046378799;0.00025226789875887;0.00052203639643267;0.00021596552687697;0.0006605195812881;0.00044959018123336;-0.00030335239716806;-0.00036285459646024;-0.00069273059489205;-0.00086926377844065;0.00022325587633532;0.00022610256564803;-0.0003031573141925;-0.00062303064623848;5.3562267567031e-05;6.4805724832695e-05;0.00018058877321891;0.00015159881149884;-1.4712514712301e-05;-1.4338729670271e-06;0.00017126764578279;0.00013191865582485;0.00070766871795058;0.00066396757028997;0.00026245968183503;0.00053336418932304;-0.00015205540694296;-0.00027516085538082;4.7765537601663e-05;2.6534329663264e-05;0.00020164210582152;0.00026254521799274;9.9669785413425e-05;0.00010613164340612;-2.878811028495e-05;0.00096480420324951;0.00085692096035928;-0.00038784425123595;-0.00031010137172416;-0.0010448599932715;-0.0012191275600344;-0.00037706963485107;-0.00031796394614503;-0.00029414126765914;-0.00041292698006146;1.3948018022347e-05;-2.7336752737028e-06;-9.9797027360182e-05;-0.00011189181532245;-2.2993068341748e-05;9.805167792365e-06;-9.5377567049582e-05;-1.9709781554411e-05;-2.4319680960616e-05;0.00093070382717997;-0.00014007401478011;0.00014593423111364;0.00041643099393696;-0.00095196417532861;9.7998381534126e-05;-0.00013588920410257;-7.0845885602466e-06;-8.0277714005206e-05;-0.00021836356609128;0.0015043889870867;0.00019970812718384;0.00024450352066197;0.00036069916677661;9.3465503596235e-05;-0.00060300435870886;-0.00018403900321573;-0.00048437734949403;-7.4174000474159e-05;0.00011706810619216;0.000199177840841;-0.0010702637955546;-5.3665782616008e-05;0.00021088118955959;6.5276515670121e-05;-0.00043046395876445;-1.458284441469e-05;1.9317260466778e-06;0.00011700300092343;-8.3678271039389e-05;-3.7488582165679e-05;-0.00012422440340742;-0.00035377437598072;0.00060654932167381;0.00060773867880926;-0.00079221907071769;5.0430659030098e-05;0.00014478429511655;-3.9231410482898e-05;-0.00016708177281544;-0.00034787383629009;-0.00042675228905864;-9.4377763161901e-05;0.00015035415708553;0.00028279671096243;-7.0255293394439e-05;0.00023365349625237;-2.5743007427081e-05;-0.00056113244500011;-0.00012792377674486;7.9538303907611e-06;0.00037695505307056;0.00028722806018777;-2.7855658117915e-05;-0.00020023723482154;9.5274815976154e-05;0.00053177826339379;-1.6363159147659e-06;1.9779061403824e-05;6.9880567025393e-05;0.00017732314881869;-0.00022808666108176;0.0003506402426865;-8.5927968029864e-05;0.00096005911473185;0.00014562961587217;-0.00029273139080033;-6.998914614087e-05;-0.00018052660743706;-9.0786401415244e-05;0.00037874936242588;-7.1967726398725e-05;0.00022033134882804;-9.1841357061639e-05;0.00036966605694033;-0.00022481376072392;-0.00010715371900005;-0.00010564114199951;0.00029939541127533;-0.00083294254727662;0.00013265943562146;-0.00021290117001627;0.00011284166976111;-0.00049034610856324;4.1253137169406e-05;0.00020489055896178;5.2250114094932e-05;-0.00044805681682192;-9.6546455097268e-06;2.5130269932561e-05;5.2912514547643e-06;0.00010139976075152;-0.0011404240503907;1.6866266605575e-06;-9.9158722150605e-05;0.00021928794740234;0.001314232009463;-0.0006247031269595;0.0002227361255791;-0.00010669696348486;8.0627221905161e-05;-8.0621039160178e-06;-0.0020714001730084;0.00031430451781489;-0.00023556093219668;-0.00032527025905438;-0.00054773018928245;0.00077572982991114;-0.00011912462650798;0.0005525914602913;0.00032497555366717;-0.00019211694598198;0.00010571165330475;0.0014154196251184;-0.00027761093224399;-0.00030141268507577;6.0200080042705e-05;0.0006079847807996;-6.8382221797947e-05;-1.9804941985058e-05;5.1916219945269e-07;-9.3582675617654e-05;0.00018444166926201;-0.00057125784223899;4.0087641536957e-05;0.00040846559568308;-0.00036161692696624;-0.00057082937564701;0.00053921027574688;0.00029690880910493;3.7914103359071e-06;-0.000246449111728;-1.6533516827621e-05;-0.0011088791070506;-0.00027778150979429;-0.00020252438844182;0.00014683917106595;0.00035832333378494;0.00053705391474068;-0.00014777317119297;-0.00049741880502552;-8.4955885540694e-05;-7.8251767263282e-05;-0.00012997727026232;0.0010532983578742;0.00030672480352223;-0.00035329049569555;1.6779760869667e-07;0.00083369720960036;5.1397593779257e-05;4.4832540879725e-05;-1.0061624379887e-05;0.00029951648321003;9.9326425697654e-05;0.0002039593673544;-0.00023973952920642;0.00084034673636779;-0.0001142622277257;-0.00030456186505035;0.00020126477465965;-0.00037621113006026;-5.9923942899331e-05;0.0004224457370583;-7.8145269071683e-05;0.00038103561382741;-0.00010564319381956;-0.00019105398678221;0.00025313993683085;-0.00027918626437895;-3.4302171115996e-05;-4.6839981223457e-05;-0.00065356772392988;0.00035740883322433;-0.00024669829872437;9.0843175712507e-05;-0.00036839919630438;0.00013325319741853;0.00043801555875689;3.5694636608241e-05;-0.00075904960976914;6.6562890424393e-05;-1.1940957847401e-05;2.7472082365421e-05;1.9219445675844e-05;0.00012447562767193;-0.0013190164463595;2.7008532015316e-06;-0.00016728622722439;0.00018912152154371;0.0013986659469083;-0.00062027346575633;0.00026711582904682;-0.00011013411130989;0.0001073445964721;-7.0577898441115e-06;-0.0022839277517051;0.00030519644496962;-0.00029277428984642;-0.00039533581002615;-0.00055058876750991;0.00091178633738309;-0.00011124047887279;0.00064370839390904;0.00034506019437686;-0.00025372524396516;9.1489382612053e-05;0.0016318417619914;-0.00025777809787542;-0.00035506856511347;6.3345520175062e-05;0.00067781610414386;-7.0212117861956e-05;-1.3616260730487e-05;-9.1715110102086e-06;-0.00012917950516567;0.00019484186486807;-0.0004152953333687;1.7067713997676e-05;0.00060818361816928;-0.00049181800568476;-0.00091787870042026;0.00077675277134404;0.0002875056816265;2.3810503989807e-05;-0.00032437409390695;-3.4315522498218e-05;-0.00090644130250439;-0.00040571289719082;-0.00017401541117579;0.00026048207655549;0.00047252711374313;0.00046388147165999;-0.00017171713989228;-0.00073941826121882;-0.00010483977530384;-1.0943600500468e-05;-0.0001543309626868;0.00087005930254236;0.00044012517901137;-0.00033857408561744;-1.0703992302297e-05;0.00085091684013605;8.6192187154666e-05;4.4581105612451e-05;-1.0048026524601e-05;0.000329179369146;0.00011263073247392;0.0003544328501448;-0.00024923356249928;0.0010265209712088;-0.00011303380597383;-0.00033226018422283;0.00019273631914984;-0.00037163740489632;-7.0859787228983e-05;0.00051950226770714;-8.3457060100045e-05;0.0003867449995596;-9.3590155302081e-05;-0.00019143157987855;0.00036552350502461;-0.0002891936164815;-9.0573958004825e-05;-8.9607478003018e-05;-0.00086018582805991;0.00037422543391585;-0.00033003799035214;0.00010421538172523;-0.00051431357860565;0.00012572068953887;0.00042857066728175;4.3689622543752e-05;-0.00078296870924532;6.4158855821006e-05;7.8767159720883e-05;-6.7145461798646e-05;-4.0693008486414e-05;0.00010255818051519;0.000119484080642;-0.00010719637066359;0.00065621151588857;-0.00059170462191105;-0.0017508139135316;0.0018081954913214;-0.00012564222561195;0.00010106274567079;9.8946111393161e-05;-1.039736707753e-05;0.00087439047638327;-0.00088636815780774;-4.704121965915e-05;1.45141957546e-05;-8.7353037088178e-05;0.00014220463344827;-0.00012423713633325;-0.00023539616086055;0.00025784035096876;8.9785338786896e-05;-0.00014393033052329;-0.00073190592229366;0.00065191101748496;8.8294000306632e-05;-9.4671078841202e-05;-0.00027498317649588;0.00023531385522801;1.7662192703938e-06;1.3159139598429e-05;-0.00016381657042075;-0.0001269044005312;0.00055460707517341;0.00061436038231477;0.00059693632647395;0.00077574793249369;-0.00058927689678967;-0.00085574452532455;-5.2244457037887e-05;-7.7902950579301e-05;-0.00043223067768849;-0.00035451640724204;0.00044677656842396;0.00058443035231903;0.00024434764054604;0.00074732128996402;0.0005046552978456;-0.00034864086774178;-0.00040581374196336;-0.00089231698075309;-0.00091279856860638;0.0003518647281453;0.00030399934621528;-0.00049462635070086;-0.00067156658042222;0.00010023815411841;0.00010043662041426;0.00023162181605585;0.000206131109735;-1.6375654013245e-05;-2.614329730477e-08;0.0002357884804951;0.00017200763977598;0.0010283165611327;0.00086949090473354;0.00041323751793243;0.00064382539130747;-0.00023412394511979;-0.00038983827107586;7.1076428866945e-05;3.4742050047498e-05;0.00034220164525323;0.00034913548734039;0.00016727889305912;0.00018750976596493;-5.4263691708911e-05;0.0012246075784788;0.0012139142490923;-0.00049388263141736;-0.00039213706622832;-0.0014670632081106;-0.0015414899680763;-0.00057328812545165;-0.0004227222816553;-0.00047734528197907;-0.00056095299078152;1.3692214452021e-05;-1.4014009508401e-08;-0.00017800665227696;-0.0001652948994888;7.8548131568823e-05;-6.6946209699381e-05;-4.7199548134813e-05;9.8591503046919e-05;0.0001372572442051;-8.0148507549893e-05;0.0006770298932679;-0.0005523175932467;-0.0017651210073382;0.0017908620648086;-0.00012956850696355;9.870311623672e-05;9.5869683718774e-05;-2.8031415695295e-06;0.00090316339628771;-0.00085875042714179;-3.1419680453837e-05;3.4323074942222e-05;-0.00010664700675989;0.00012288142170291;-0.00014396947517525;-0.00024255806056317;0.00023664299806114;0.000102757338027;-0.00014098554675002;-0.00076355837518349;0.00060984608717263;9.0701774752233e-05;-9.4269635155797e-05;-0.00027863366995007;0.00022771857038606;-5.2659248694908e-07;1.5931231246213e-05;-0.00016121129738167;-0.00013491825666279;0.00051595002878457;0.0006359577528201;0.00054436444770545;0.00082749029388651;-0.00048936903476715;-0.00095661246450618;-4.5264154323377e-05;-8.3366539911367e-05;-0.00042779117939062;-0.00036044887383468;0.00039672484854236;0.00063612905796617;0.00024434030638076;0.00072812801226974;0.00049077463336289;-0.00033180267200805;-0.00040838794666342;-0.00084324600175023;-0.00092626386322081;0.00034235458588228;0.00031799371936359;-0.00044328175135888;-0.00072186562465504;9.3407732492778e-05;0.00010447223030496;0.000236534018768;0.00020380331261549;-1.7120066331699e-05;5.2474075573627e-07;0.00023024479742162;0.00017433160974178;0.0010098342318088;0.00088968104682863;0.00038293041870929;0.00068301497958601;-0.00022781227016822;-0.00040425907354802;7.2000198997557e-05;3.4848893847084e-05;0.00031754342489876;0.00036491497303359;0.00016225632862188;0.0001887217949843;-5.2092833357165e-05;0.0012345819268376;0.001226035063155;-0.00049348897300661;-0.00039759158971719;-0.0014509439934045;-0.001580965006724;-0.00055610929848626;-0.00043303711572662;-0.00045238988241181;-0.00058399065164849;1.4217192074284e-05;-1.8887434407588e-06;-0.00016295954992529;-0.00017103254504036;-3.3763048122637e-05;1.0291248145222e-05;-0.00012686534319073;-3.0507315386785e-05;-1.1588978850341e-05;0.0013339071301743;-0.00024628624669276;0.00014855382323731;0.0006729947635904;-0.0014757880708203;0.00015814011567272;-0.00016695135855116;4.458812327357e-06;-0.00013587268767878;-0.00035547235165723;0.0022360088769346;0.0002758557384368;0.00034634655457921;0.0006149114924483;0.0001475775934523;-0.0008534321677871;-0.00031550266430713;-0.0007076125475578;-0.00015264003013726;0.00014979776460677;0.00032762656337582;-0.0015025490429252;-8.6590924183838e-05;0.0002763602824416;9.558998135617e-05;-0.00059699808480218;-1.0686323548725e-05;-6.3331158344226e-06;0.00019137731578667;-8.3890379755758e-05;-1.8771890609059e-05;-0.00036644423380494;-0.00044278023415245;0.00074623618274927;0.00073787639848888;-0.00090439076302573;4.9875870899996e-05;0.00024238508194685;-4.0699305827729e-05;-0.00019326353503857;-0.00042132911039516;-0.00095662102103233;-0.00019669282482937;0.0001566185237607;0.00036762052332051;-0.00010248064063489;0.00045225291978568;-5.1128579798387e-05;-0.00067345541901886;-0.00018228993576486;-6.6255881392863e-05;0.00046033188118599;0.00070753932232037;-2.7269119527773e-05;-0.0003367108583916;0.00010976642079186;0.00085961271543056;-7.7416906663075e-08;3.07522204821e-05;8.8509317720309e-05;0.00028576259501278;-0.00036817460204475;0.00044347764924169;-0.00012971162504982;0.0013178008375689;0.00024083322205115;-0.0004310921067372;-0.00010047330579255;-0.00031022727489471;-0.00013899475743528;0.00055242289090529;-0.00012984540080652;0.00039954000385478;-0.00015908179921098;0.00043397946865298;-0.00037273584166542;-8.9375214884058e-05;-0.00013125508849043;0.00047568095033057;-0.0010710143251345;0.0001998297375394;-0.00030306377448142;0.00018645153613761;-0.00066584628075361;5.7669625675771e-05;0.0003690297016874;8.8691849668976e-05;-0.00076946284389123;-2.9586950404337e-05;8.1459975262987e-06;-0.00010375629062764;-2.0494833734119e-05;-3.7308136597858e-06;0.0011202916502953;-0.00023772577696946;8.2380909589119e-05;0.00061571010155603;-0.0013026506640017;0.00014352719881572;-0.00013711195788346;5.6773833421175e-06;-0.00011720856127795;-0.00032978126546368;0.0019408008083701;0.00022327106853481;0.00027806020807475;0.0005674633430317;0.00014008925063536;-0.00071294262306765;-0.00028922990895808;-0.00058447336778045;-0.00015063106548041;0.00011647451174213;0.00030861794948578;-0.0012574472930282;-7.7801014413126e-05;0.00023224238248076;8.657161379233e-05;-0.00051475182408467;-3.2344587452826e-06;-1.0253685104544e-05;0.00017171747458633;-5.613445682684e-05;1.0983841320922e-06;-0.00041724598850124;-0.00033633879502304;0.00055256945779547;0.00054388359421864;-0.00062472757417709;2.9566963348771e-05;0.00022667330631521;-2.3858388885856e-05;-0.00014055296196602;-0.00030996880377643;-0.0009896574774757;-0.00019578270439524;9.1533453087322e-05;0.00028134157764725;-8.60001964611e-05;0.00044727220665663;-4.3492927943589e-05;-0.0004826974181924;-0.00015154811262619;-9.3754482804798e-05;0.00034105489612557;0.00075751112308353;-1.6499647244927e-05;-0.00031475457944907;7.6018259278499e-05;0.00077626196434721;4.0394957068202e-07;2.734177178354e-05;7.1351489168592e-05;0.00024933626991697;-0.00032975050271489;0.00032876434852369;-0.00011426585842855;0.00108102185186;0.00021951041708235;-0.0003687594726216;-8.4961793618277e-05;-0.00028513671713881;-0.0001215706433868;0.00045240327017382;-0.00012297779903747;0.00036239737528376;-0.00014533870853484;0.00032431806903332;-0.00033713612356223;-5.168373536435e-05;-9.362812852487e-05;0.00042402828694321;-0.00084563676500693;0.00017338189354632;-0.00024095935805235;0.00017016404308379;-0.00052322627743706;4.7525900299661e-05;0.0003452789678704;8.1508827861398e-05;-0.00069370481651276;8.9216126752945e-07;1.6332987797796e-05;-4.987265492673e-05;6.526135985041e-05;-0.0009261462255381;-1.6909971236601e-05;2.6641961085261e-05;0.00025550808641128;0.0011955823283643;-0.00061052717501298;9.7286276286468e-05;-9.9015836894978e-05;-7.9849029134493e-05;-1.3067236068309e-05;-0.001750907395035;0.00031053388374858;-0.00012733573385049;-0.00021925076725893;-0.00059234170475975;0.00056737195700407;-0.00014485408610199;0.00044362532207742;0.00033070737845264;4.0440525481245e-05;0.00013428335660137;0.0011075687361881;-0.00029282012837939;-0.00014476377691608;5.1182349125156e-05;0.00048246188089252;-5.801887891721e-05;-2.5921464839485e-05;1.4185750842444e-05;-1.0755547918961e-05;0.00018802769773174;-0.00073545193299651;4.7546778660035e-05;0.00025307055329904;-0.00018770396127366;-6.0229976952542e-05;0.00019740585412364;0.00030164729105309;-3.7373803934315e-05;-1.7156877220259e-05;-5.7310717238579e-06;-0.0015383741119877;-9.2403723101597e-05;-0.0002642460167408;5.1197264838265e-05;0.00017632039089222;0.00063537800451741;-0.00014079068205319;-0.00029122442356311;-2.0303779820097e-05;-0.00024973630206659;-7.7355703979265e-05;0.0012956939172;0.00012564809003379;-0.00039055664092302;2.4532737370464e-05;0.00082897581160069;5.6858857533371e-06;5.3558571380563e-05;-1.167894606624e-05;0.00029252108652145;7.7309188782237e-05;-9.7973614174407e-05;-0.00021140777971596;0.00042295805178583;-0.0001098758802982;-0.00022873039415572;0.00020274103735574;-0.00045392813626677;-3.9206021028804e-05;0.00028682497213595;-7.8667122579645e-05;0.00045653118286282;-0.00012548819358926;-0.0002224810741609;3.0527004128089e-05;-0.0002403561520623;7.2792885475792e-05;5.5447671911679e-05;-0.00023313076235354;0.00029753282433376;-0.00011593624367379;6.2178376538213e-05;-6.0085811128374e-05;0.00014714922872372;0.00054302613716573;2.5226720026694e-05;-0.0008770139538683;7.9635174188297e-05;-4.0457216528011e-06;2.7679780032486e-05;-1.4153164556774e-05;0.00010974895121763;-0.0013795212144032;-1.874060035334e-05;-5.3445641242433e-05;0.00031734578078613;0.0017016147030517;-0.00083184451796114;0.00020527445303742;-0.00013905731611885;3.5218810808146e-05;-2.1319308871171e-05;-0.0025670784525573;0.00041731301462278;-0.00025203224504367;-0.00038047390989959;-0.00077699217945337;0.00090133107732981;-0.00016586304991506;0.00068707158789039;0.00045013628550805;-0.00012576890003402;0.00016661820700392;0.0016767112538218;-0.00037759568658657;-0.00029156071832404;7.6385294960346e-05;0.00070711405714974;-8.0070807598531e-05;-3.216741970391e-05;1.052313746186e-05;-6.3494917412754e-05;0.0002536995743867;-0.00089784729061648;6.6898559452966e-05;0.00042800811934285;-0.00036573788383976;-0.00041913395398296;0.00049133109860122;0.00040489406092092;-2.2856886062073e-05;-0.00018353182531428;-1.3914659575676e-05;-0.001806526677683;-0.00024661276256666;-0.00032225690665655;0.00012938519648742;0.00036939486744814;0.00080016767606139;-0.00019264241564088;-0.0005200746236369;-8.4166575106792e-05;-0.00022944359807298;-0.00014328853285406;0.0016178047517315;0.00028737590764649;-0.00049942504847422;1.7128793842858e-05;0.0011287718079984;3.7738300306955e-05;6.5565509430598e-05;-1.38285677167e-05;0.00041014153975993;0.00011711706611095;9.6080875664484e-05;-0.00031277834204957;0.00086863979231566;-0.00015392652130686;-0.00036964789615013;0.00028024127823301;-0.00056103040697053;-6.7195338488091e-05;0.00050278712296858;-0.00010625368304318;0.00058458128478378;-0.00016013861750253;-0.00028260503313504;0.00018381902191322;-0.00036010888288729;1.759553924785e-05;1.5479708963539e-05;-0.00060156406834722;0.0004531228041742;-0.00026691891252995;0.00010482485231478;-0.00032003206433728;0.00019315518147778;0.00066563411382958;4.1112602048088e-05;-0.0011237392900512;9.986934310291e-05;-5.843096460012e-06;2.566365947132e-05;1.6685105947545e-05;0.00010729049972724;-0.0012625698000193;-1.0750833098427e-05;-0.00011920747056138;0.0002335405733902;0.0014755927259102;-0.00068296067183837;0.00021796202054247;-0.00011636532144621;0.00010210377513431;-2.0842642697971e-05;-0.0022865957580507;0.00033554222318344;-0.00026516331126913;-0.00038458401104435;-0.00062605371931568;0.0008552428917028;-0.00011646524217213;0.00065234891371801;0.00037491909461096;-0.00020523194689304;0.00012345601862762;0.0015416014939547;-0.00029073870973662;-0.00030173253617249;6.6966429585591e-05;0.00063138682162389;-6.519710586872e-05;-2.2720410925103e-05;8.3964420127813e-07;-8.6216561612673e-05;0.0002114618109772;-0.00063455488998443;4.9389102059649e-05;0.00045950687490404;-0.00040454519330524;-0.00064287421992049;0.00060651655076072;0.00032406829996035;3.2977179671434e-06;-0.00025541093782522;-2.200761991844e-05;-0.0012838743859902;-0.00031310738995671;-0.00023954587231856;0.000172130545252;0.00041585805593058;0.00060131656937301;-0.0001626317971386;-0.00057010067394003;-0.00011108032776974;-0.00011216339771636;-0.00014756806194782;0.00120470370166;0.00034602760570124;-0.00038717527058907;1.8418038507662e-06;0.00093820929760113;6.0409314755816e-05;5.1186761993449e-05;-1.0208661478828e-05;0.00035624773590825;0.00010819669114426;0.00024812904302962;-0.00027887878241017;0.0009495863923803;-0.00013174035120755;-0.00034944669459946;0.00023475274792872;-0.00043369937338866;-6.7400396801531e-05;0.0005123844021;-9.0606139565352e-05;0.0004620933032129;-0.00012445644824766;-0.0002262887719553;0.00026298087323084;-0.00032430325518362;-4.2686999222497e-05;-3.1855721317697e-05;-0.00072392483707517;0.00041337366565131;-0.00030952025554143;0.00010314762039343;-0.00043381424620748;0.00015564828936476;0.00050998444203287;4.1014660382643e-05;-0.00090829160762951;7.8395947639365e-05;3.9670227124589e-05;-2.9767121304758e-05;1.8639226254891e-05;5.0322571041761e-05;-0.00016658444656059;-3.0377548227989e-06;9.8376483947504e-05;-0.00022158057254273;-0.00057636282872409;0.00070769089506939;-3.7612855521729e-05;4.0993956645252e-05;9.1883033746853e-05;-5.1049202738795e-05;0.00019678749958985;-0.00038606516318396;-8.5146675701253e-05;-8.3817765698768e-05;-2.0066318029421e-05;0.00021945229673292;-5.0178852688987e-05;8.4137878729962e-05;6.7820379626937e-05;-3.4908698580693e-05;-4.816941509489e-05;-0.00010206739534624;0.00028026319341734;2.4552102331654e-05;-3.2884723623283e-05;-0.00013957680494059;0.00014828685380053;7.8211442087195e-06;2.3564366529172e-06;-6.4436200773343e-05;-1.6314868844347e-05;0.00026489613810554;0.00018331121827941;0.00034895449061878;0.00018232289585285;-0.00051219534361735;-0.00014158742851578;-4.9986701924354e-05;-3.557451418601e-05;-0.00022819184232503;-0.00016140246589202;0.0002729402622208;0.0001334151456831;4.759506919072e-05;0.00028725547599606;0.0002371804730501;-0.00011007959255949;-0.00012498324213084;-0.00044497143244371;-0.00030467452597804;0.00018184386135545;0.00010379887680756;-0.00025631074095145;-0.00014288142847363;8.821819210425e-05;5.6926764955278e-05;9.9965713161509e-05;9.4788178103045e-05;-1.7525918565298e-06;2.6726718260761e-06;0.00013734583626501;6.9491215981543e-05;0.00059568870346993;0.00034034426789731;0.0003247685090173;0.00021486754121725;-0.0001623283023946;-0.00014637554704677;3.1241885153577e-05;1.6949881683104e-05;0.00030899659032002;0.00015678038471378;0.0001592278276803;0.00010292102524545;-5.4992411605781e-05;0.00045494246296585;0.00050235446542501;-0.00021524018666241;-0.00012309811427258;-0.00070066377520561;-0.00054520339472219;-0.00037457889993675;-0.00018563878256828;-0.0003935637359973;-0.00024207320529968;2.1819880657858e-06;-3.6401877423486e-07;-0.00019198998052161;-8.2912301877514e-05;5.2696716011269e-05;-4.1206349123968e-05;7.9280198406195e-06;6.6634645918384e-05;-0.00014345037925523;9.6035296337504e-07;0.00020521933038253;-0.00028303914587013;-0.00088521523866802;0.0010074861347675;-5.9249105106574e-05;5.810466609546e-05;0.0001028547048918;-4.3168060074095e-05;0.00036419968819246;-0.00052930024685338;-8.545552555006e-05;-6.9660658482462e-05;-4.1823310311884e-05;0.00023867039999459;-8.609003998572e-05;4.3225572881056e-05;9.0499750513118e-05;-1.3124143151799e-05;-7.4623727414291e-05;-0.00023313341080211;0.00036121063749306;4.0447466744808e-05;-5.1816503400914e-05;-0.00018766144057736;0.00018787920998875;8.9844515969162e-06;6.2444996729027e-06;-9.6539668447804e-05;-4.3381103751017e-05;0.00032559188548476;0.00027069641510025;0.00042768372804858;0.00031928942189552;-0.00057377410121262;-0.00032241715234704;-5.9505091485335e-05;-5.4498712415807e-05;-0.00030294695170596;-0.00022794908727519;0.00033881378476508;0.00025538448244333;8.4395251178648e-05;0.00036200066097081;0.00027746008709073;-0.00014523450226989;-0.0001785814674804;-0.00053550844313577;-0.00040765153244138;0.00024934677639976;0.00016992131713778;-0.00032582855783403;-0.00026981806149706;0.00010315811232431;7.8801225754432e-05;0.00013908231630921;0.00012677996710408;-4.8851393330551e-06;2.9924017326266e-06;0.0001706527400529;9.8586206149776e-05;0.00076614826684818;0.00050394976278767;0.00037604165845551;0.00033831762266345;-0.00020326556114014;-0.00023195336689241;4.7004636144266e-05;2.4044713427429e-05;0.00034791129291989;0.00022190318850335;0.00018193358846474;0.00014315453881864;-6.1352751799859e-05;0.00067037023836747;0.00075017113704234;-0.00029627792537212;-0.00019529048586264;-0.00095910183154047;-0.00083464320050552;-0.00046322625712492;-0.0002628278452903;-0.00045872793998569;-0.00035284564364702;2.4677990495547e-06;-1.9725957827177e-06;-0.00020603554730769;-0.00011324374645483;6.4369764004368e-05;-5.3009247494629e-05;-2.2715463273926e-05;8.2457721873652e-05;-3.1629966542823e-05;-4.9047883976527e-07;0.00039532870869152;-0.00033751977025531;-0.0012993786949664;0.0013594524934888;-9.0509573055897e-05;7.6742850069422e-05;8.6197214841377e-05;-5.0591625040397e-06;0.00062618684023619;-0.00067715568002313;-5.507624882739e-05;-1.294956109632e-05;-8.3373844972812e-05;0.00019324224558659;-0.00013430418039206;-7.2241498855874e-05;0.00012248841812834;4.9951049732044e-05;-0.00011213222023798;-0.00046331298653968;0.0004284338792786;6.460168515332e-05;-7.6937925769016e-05;-0.00022835044364911;0.00020669412333518;7.49822038415e-06;1.2877449080406e-05;-0.00013840378960595;-9.4047063612379e-05;0.00035563093842939;0.0003897188580595;0.00046113855205476;0.00053503439994529;-0.00050776213174686;-0.00063791312277317;-5.7794048188953e-05;-7.6846328738611e-05;-0.00036808889126405;-0.00030203998903744;0.00036394436028786;0.00045321942889132;0.00014774178271182;0.00042199870222248;0.00028490289696492;-0.00018306128913537;-0.00024966863566078;-0.000568839663174;-0.00052173424046487;0.00031551157007925;0.0002639090816956;-0.00036856296355836;-0.00047855582670309;9.7949596238323e-05;9.8012598755304e-05;0.00018493962124921;0.00015928987704683;-1.1032234397135e-05;2.5694582745928e-06;0.00019021701882593;0.00013140783994459;0.00089163053780794;0.00070625625085086;0.00036412046756595;0.00051412970060483;-0.00022520747734234;-0.00034773684456013;6.4918254793156e-05;3.1020626920508e-05;0.00031202848185785;0.00028944585938007;0.00016904149379116;0.00017844742978923;-5.210586823523e-05;0.00095249316655099;0.001059299451299;-0.00038845007657073;-0.00029881013324484;-0.0012300276430324;-0.0012281371746212;-0.00050281244330108;-0.0003454961697571;-0.00044351402902976;-0.00048064350266941;5.375796717999e-06;-4.1658695408842e-06;-0.00016640938702039;-0.00013785283954348;6.2324194004759e-05;-5.1759961934295e-05;-3.3325373806292e-05;7.7356111432891e-05;6.4216537793982e-06;2.2006102881278e-05;0.00042610240052454;-0.00028690110775642;-0.0013099851785228;0.001326116384007;-9.3959053629078e-05;7.3448187322356e-05;7.3776333010755e-05;1.1389113751648e-05;0.00066155049717054;-0.00064120412571356;-3.2307558285538e-05;1.5396824892377e-05;-0.00010723889135988;0.00015660797362216;-0.00015270983567461;-9.6979063528124e-05;0.00010435282456456;7.0789523306303e-05;-0.0001104939437937;-0.00050423922948539;0.00037666092975996;6.6988584876526e-05;-7.737511623418e-05;-0.00022384301701095;0.00019103383237962;5.6284557103936e-06;1.527461790829e-05;-0.00013701101124752;-0.00010409155220259;0.000308715243591;0.00039451321936212;0.0004034293233417;0.00057046854635701;-0.00038659910205752;-0.00073193886782974;-4.8876921937335e-05;-8.1153055361938e-05;-0.00035178914549761;-0.00030375309870578;0.00031004578340799;0.00050137599464506;0.00014947731688153;0.00038096573553048;0.00024698761990294;-0.00016166364366654;-0.0002458568487782;-0.00049843383021653;-0.00049774022772908;0.00030170887475833;0.0002784920798149;-0.0003198905615136;-0.00052031269297004;8.472668559989e-05;9.9539414804894e-05;0.00018458424892742;0.00015317731595132;-1.2280790542718e-05;3.0716407763975e-06;0.000175917026354;0.00013048249820713;0.00084029661957175;0.00071539595955983;0.00030674802837893;0.0005493942881003;-0.00020491503528319;-0.00036691903369501;6.5671483753249e-05;3.0144183256198e-05;0.00026181107386947;0.00029636872932315;0.00014850354637019;0.00017735724395607;-4.5011394831818e-05;0.000950580870267;0.0010662624845281;-0.00037766367313452;-0.00030402981792577;-0.0011895907809958;-0.0012549912789837;-0.0004631724441424;-0.00034611916635185;-0.00038556760409847;-0.00049607554683462;5.9630333453242e-06;-6.1925397858431e-06;-0.00013340641453397;-0.0001380332687404;-3.270309389336e-05;2.3103032162908e-06;-0.00011060303950217;-3.2293712138198e-05;2.0654539184761e-05;0.0013761254958808;-0.00029575600638054;0.00010341758752475;0.00076546444324777;-0.0016548950225115;0.00017730791296344;-0.00011335808085278;3.0609437089879e-05;-0.00015048401837703;-0.00039867937448435;0.0023700015153736;0.0002667329099495;0.00037771617644466;0.00075327686499804;0.00015164114302024;-0.0008579168934375;-0.00038610043702647;-0.00079326395643875;-0.00021175720030442;0.00010325722541893;0.00036696315510198;-0.0014849663712084;-9.8664604593068e-05;0.00022012925182935;9.1260597400833e-05;-0.00055542675545439;-8.7809985416243e-07;-1.5280118532246e-05;0.00022710805933457;-2.7884359951713e-05;7.8423881859635e-06;-0.00054547475883737;-0.0004058487538714;0.00067414517980069;0.00064795307116583;-0.0007194391801022;2.9613454898936e-05;0.00027506257174537;-3.4364868042758e-05;-0.00011250271927565;-0.00037105940282345;-0.0013897531898692;-0.00028107309481129;0.0001108408687287;0.00035558931995183;-9.8211254226044e-05;0.00057931983610615;-7.1831353125162e-05;-0.00059477996546775;-0.00018895204993896;-0.00017854150792118;0.0004140377859585;0.0010354263940826;-1.4344386727316e-05;-0.00039413530612364;9.3183327408042e-05;0.00099423213396221;4.0630384319229e-06;3.4761946153594e-05;7.5779877079185e-05;0.00034679955570027;-0.00043932991684414;0.00040983111830428;-0.00014520564582199;0.0013244597939774;0.0002913266653195;-0.00046594592276961;-0.00010700552229537;-0.00038748083170503;-0.00016149453585967;0.0006110371905379;-0.00016894401051104;0.00052467914065346;-0.00020495487842709;0.00033668341347948;-0.0004538816283457;-7.7412378232111e-06;-0.00011764981172746;0.0005581482546404;-0.00098768598400056;0.00022471827105619;-0.00033753985189833;0.00022783086751588;-0.00065272679785267;6.0876351199113e-05;0.00048338534543291;0.00011254506534897;-0.00098933931440115;-3.03577453451e-05;1.2883664339824e-06;-9.9492965091486e-05;-1.9707016690518e-05;2.440944990667e-05;0.0012653591111302;-0.00029828789411113;5.4183983593248e-05;0.00074360857252032;-0.001567984232679;0.00017117540119216;-9.5963485364337e-05;2.7795840651379e-05;-0.0001227413158631;-0.00039179090526886;0.0022227878216654;0.00023297447478399;0.00033048712066375;0.00073742505628616;0.00015702238306403;-0.00078086741268635;-0.00037677204818465;-0.00071483332430944;-0.00021287969138939;6.9755653385073e-05;0.00036603937041946;-0.0013613258488476;-9.3723036115989e-05;0.00019388401415199;8.9672605099622e-05;-0.00052114226855338;4.0096442717186e-06;-1.7700878743199e-05;0.00021981963072903;-1.113676262321e-05;1.4156070392346e-05;-0.00058422790607437;-0.00034434409462847;0.00058100250316784;0.00052937894361094;-0.00054305739467964;1.4183294297254e-05;0.00027168705128133;-2.4728929929552e-05;-6.9486210122705e-05;-0.00030248798429966;-0.0014451122842729;-0.00028470790130086;7.9205812653527e-05;0.00029502832330763;-9.5754985522944e-05;0.00058697641361505;-5.5028835049598e-05;-0.00049910956295207;-0.00016708018665668;-0.00020351685816422;0.00034267702721991;0.0010773234535009;-6.4910400396911e-06;-0.00039246919914149;7.1790142101236e-05;0.00095920264720917;3.6803553484788e-06;3.3780648664106e-05;6.648003909504e-05;0.00032853501033969;-0.00041551465983503;0.00032801902852952;-0.00013662147102877;0.0011619554134086;0.00027803119155578;-0.00042489898623899;-9.7544085292611e-05;-0.00038392859278247;-0.00015358558448497;0.00054518395336345;-0.0001659703993937;0.00051506160525605;-0.00019946896645706;0.00026973491185345;-0.00042781271622516;1.5571364201605e-05;-9.2831680376548e-05;0.00052286975551397;-0.00084152037743479;0.00020903823315166;-0.00029271541279741;0.00022035700385459;-0.00055309367598966;5.5199539929163e-05;0.00048410057206638;0.00011008221918019;-0.00096217420650646;1.2241699550941e-05;7.134780389606e-06;-0.00012680342479143;4.2023748392239e-05;-0.000925030966755;-1.7921769540408e-05;6.6097156377509e-05;0.00028504346846603;0.0012089387746528;-0.00062260631239042;-1.5833746147109e-05;-9.1388224973343e-05;-0.00032162782736123;-1.7906915672938e-05;-0.0016536947805434;0.00031122943619266;-4.7926623665262e-05;-0.00018789357272908;-0.00066289055394009;0.00048236647853628;-0.00017298886086792;0.00047796074068174;0.00034360581776127;0.00032630612258799;0.00015244334645104;0.0010294510284439;-0.00030784227419645;7.4374311225256e-06;4.2822721297853e-05;0.00042547399061732;-4.8220790631603e-05;-2.3340411644313e-05;1.8397593521513e-05;6.2297556723934e-05;0.00020286955987103;-0.0007445415831171;2.2164957044879e-05;0.00028962135547772;-0.00014055060455576;0.00014831018052064;8.056314982241e-05;0.00026906383573078;-6.0395832406357e-05;0.00021018424013164;-1.8154951249016e-05;-0.0018568017985672;-3.2603133149678e-05;-0.00031395570840687;5.0916678446811e-05;9.4930976047181e-05;0.00065969105344266;-0.00013925644452684;-0.00030539144063368;3.1640141969547e-05;-0.00038408330874518;-4.5297860197024e-05;0.0013774121180177;7.983705290826e-05;-0.00039951887447387;4.0299124520971e-05;0.00082845811266452;-2.7658109047479e-06;6.9379100750666e-05;-1.3841678082827e-05;0.00031897833105177;6.8552595621441e-05;-0.00029731620452367;-0.00021416573144961;0.00018568367522676;-0.00011870840535266;-0.00018394801008981;0.00021271809237078;-0.00055545312352479;-3.1841464078752e-05;0.00024898280389607;-9.5827897894196e-05;0.00054953969083726;-0.00014543435827363;-0.00027092031086795;-0.0001117048523156;-0.00023343742941506;0.00015188020188361;0.00013233066420071;1.2842220940001e-06;0.00028889099485241;-5.7090855989372e-05;5.4738349717809e-05;0.00016696179227438;0.00017039506928995;0.00067162432242185;2.5683792046038e-05;-0.0010876684682444;9.9735152616631e-05;5.7047350310313e-06;1.6470019545523e-05;-5.0637499953154e-05;6.5761509176809e-05;-0.0010512117296457;-3.1059989851201e-05;2.1298945284798e-05;0.00028632706380449;0.001402007532306;-0.00069614197127521;8.1741687608883e-05;-0.00011078160605393;-8.9832312369253e-05;-2.8071286578779e-05;-0.0020019756630063;0.00034478268935345;-0.00014474512136076;-0.00028156221378595;-0.00070457305992022;0.00063892547041178;-0.00014744367217645;0.00055995781440288;0.0003938933077734;6.4398438553326e-05;0.00016158852668013;0.0012297400971875;-0.00032039897632785;-0.00012875208631158;5.8679845096776e-05;0.00051109393825755;-5.5184322263813e-05;-2.8349650165183e-05;1.4932040357962e-05;9.3097623903304e-06;0.00021975196432322;-0.00080578488996252;5.3309031500248e-05;0.00030626522493549;-0.00023415450414177;-0.00010636650404194;0.00025988795096055;0.00032621776335873;-3.9801790990168e-05;1.3150618542568e-05;-1.3979914001538e-05;-0.0017982680583373;-0.00012671564763878;-0.00031420317827724;7.3633884312585e-05;0.00023405044339597;0.00070963613688946;-0.0001515941839898;-0.00036916861427017;-4.3411026126705e-05;-0.00031051199766807;-9.4616218120791e-05;0.001487105153501;0.0001682023430476;-0.00043177980114706;2.8227263101144e-05;0.00094999861903489;1.5027772860776e-05;6.3194514950737e-05;-1.1861137863889e-05;0.00035724707413465;8.7947417341638e-05;-8.9973931608256e-05;-0.0002640497405082;0.00052855326794088;-0.00013347150525078;-0.00027283770032227;0.0002444650453981;-0.00053294427925721;-4.9000926082954e-05;0.00037134528975002;-9.6794254204724e-05;0.00054173043463379;-0.00015052701928653;-0.00027033800142817;2.3557948225061e-05;-0.00030270108254626;8.2699138147291e-05;7.9139274021145e-05;-0.00029080265085213;0.00037561386125162;-0.00017324244254269;7.9500670835841e-05;-7.517133053625e-05;0.00017752696294338;0.00064374803332612;3.2061907404568e-05;-0.0010713203810155;9.6705596661195e-05;4.1485254769213e-05;-2.9533977794927e-05;2.8117830879637e-05;4.8092082579387e-05;-0.00020580760610756;-1.5764779845995e-06;6.9111491029616e-05;-0.00022091261052992;-0.00052248744759709;0.00067460647551343;-3.6197579902364e-05;3.7877391150687e-05;0.00010907326941378;-7.0832204073668e-05;0.00016099258209579;-0.00037631639861502;-9.8071766842622e-05;-0.00010609602031764;-2.3839686036808e-05;0.00024796099751256;-4.4566448195837e-05;0.00012323404371273;6.9184818130452e-05;-5.3168947488302e-05;-3.6233574064681e-05;-6.9070978497621e-05;0.00028223084518686;2.3031849195831e-05;-2.6865094696404e-05;-0.00015209341654554;0.00015867128968239;7.7788736234652e-06;1.7171265653815e-06;-5.1287141104694e-05;-2.4744583697611e-06;0.00027705094544217;0.0001817891607061;0.00035699797444977;0.00015947254723869;-0.00054084317525849;-0.00010546261910349;-5.4902731790207e-05;-3.541748446878e-05;-0.00022328048362397;-0.000156973808771;0.00027309986762702;0.00011147045734106;3.0406161386054e-05;0.00030732003506273;0.00026341775082983;-0.00010774483234854;-0.00012239963689353;-0.00047916400944814;-0.00032103032572195;0.00016897066961974;8.9074477727991e-05;-0.00025316086248495;-0.00011807661940111;0.00010196174844168;6.0214726545382e-05;9.0074012405239e-05;9.1401634563226e-05;-7.5691968959291e-07;3.9061824281816e-06;0.00014498129894491;6.6259963205084e-05;0.00061513186665252;0.00031765320454724;0.00033902170252986;0.00019699311815202;-0.00016452501586173;-0.00012974315905012;3.2119842217071e-05;1.7191416191054e-05;0.00035170788760297;0.00016054628940765;0.00018464055028744;0.00010284563177265;-6.5069361880887e-05;0.00040595233440399;0.00045447837328538;-0.0002072183706332;-9.9267657788005e-05;-0.00066817901097238;-0.00048615713603795;-0.00040178399649449;-0.00018426049791742;-0.0004332663374953;-0.00023699989833403;-1.1125265473311e-06;-1.4448403362621e-06;-0.00022656044166069;-8.7084474216681e-05;4.6759399992879e-05;-3.4598688216647e-05;2.2130365323392e-05;5.4819607612444e-05;-0.00019306094327476;9.9765511549776e-06;0.00011450114106992;-0.00023362820502371;-0.00066002795938402;0.00079971639206633;-4.4619126128964e-05;4.5470835175365e-05;0.000112800662464;-6.3990650232881e-05;0.00023948811576702;-0.00043428884237073;-9.4742994406261e-05;-9.3718634161633e-05;-3.3314143365715e-05;0.00025405758060515;-6.7356719227973e-05;0.00010053936421173;7.1231712354347e-05;-4.2937463149428e-05;-4.8558777052676e-05;-0.00012852648796979;0.0003053660329897;2.8881329853903e-05;-3.6229030229151e-05;-0.00017191846563946;0.00017577801190782;8.7025046013878e-06;4.0038903534878e-06;-6.6915003117174e-05;-1.5695763067924e-05;0.00029192087822594;0.00021349321468733;0.00038149580359459;0.00021994442795403;-0.00055333477212116;-0.00019546471594367;-5.8317338698544e-05;-4.5664306526305e-05;-0.00025683236890472;-0.00018737278878689;0.00029905245173723;0.00017169205239043;4.393546259962e-05;0.00032131557236426;0.00026351714041084;-0.00011437781358836;-0.00013932400906924;-0.00049543683417141;-0.00034705435973592;0.00020099451649003;0.00012195642921142;-0.00027846719603986;-0.00017691790708341;0.00010616247891448;7.1782022132538e-05;0.00010779313015519;0.00010341315646656;-1.9419042018853e-06;4.0362237996305e-06;0.00015554325364064;7.9264755186159e-05;0.00068132573505864;0.00039255598676391;0.00035356782609597;0.00025298414402641;-0.0001818610180635;-0.00017312911222689;3.9732261939207e-05;2.0622745068977e-05;0.00035853168810718;0.00019211092148907;0.00018904962053057;0.00012448767665774;-6.7186963860877e-05;0.00049694755580276;0.00057308288523927;-0.000237724481849;-0.00013210419274401;-0.00077737175161019;-0.00061470869695768;-0.00043376898975112;-0.00022003057529218;-0.00045235431753099;-0.00029086781432852;-1.8943838995256e-06;-2.8714598556689e-06;-0.00022345177421812;-0.00010257584654028;2.9503795303754e-05;-2.7129684895044e-05;-1.4920557077858e-05;1.4758625184186e-05;-4.5360804506345e-05;0.0002109246852342;0.00017288025992457;7.9238925536629e-05;-0.00050792685942724;0.00041213652002625;-3.3193045965163e-05;3.0587401852245e-05;8.5064493760001e-05;-1.6147087080753e-05;0.00028567580739036;-0.00014196157280821;2.4363849661313e-05;6.4771811594255e-05;-9.0009016275872e-05;8.7646039901301e-05;-0.00019180944946129;1.0858854011531e-06;-0.00011752078717109;3.5588611808635e-06;-2.2620106392424e-05;-0.00022269066539593;-3.0047884138185e-05;1.2521416465461e-05;-3.5450761060929e-05;-0.00013259673141874;0.00011466666910565;1.6898463854886e-06;1.1905959581782e-05;-2.9229559004307e-05;-2.8069869586034e-05;6.7363464040682e-05;0.00017940811812878;7.9875811934471e-05;0.00029516502399929;8.806656296656e-06;-0.00052594335284084;-1.3620234312839e-05;-6.3669685914647e-05;-0.00015754978812765;-0.00016202068945859;3.6590332456399e-05;0.00028938159812242;2.5305366762041e-06;0.00011451575119281;0.0001020054842229;-1.3123225244271e-06;-6.9741283368785e-05;-0.00016194289491978;-0.00020924542332068;9.7265699878335e-05;0.00013904263323639;-2.5562974769855e-05;-0.00025612601893954;4.220995833748e-05;8.8599830633029e-05;8.9437678980175e-05;5.8239722420694e-05;-7.5950288191962e-07;5.6936696637422e-06;6.0765189118683e-05;8.221384632634e-05;0.00032862336956896;0.00038653131923638;8.5931613284629e-05;0.00035473235766403;-5.8732297475217e-05;-0.00022551431902684;3.4695931390161e-05;1.0410492905066e-05;0.00011859826918226;0.00026358518516645;6.8980494688731e-05;0.0001614409557078;-5.0970738811884e-05;0.00030483715818264;0.00042227824451402;-9.1061760031153e-05;-0.00012294249609113;-0.00041695850086398;-0.00051366310799494;-0.00020505108113866;-0.00023265082563739;-0.00016135250916705;-0.00037552355206572;-4.7539660954499e-06;-7.6982341852272e-06;-5.8378736866871e-05;-0.0001633064384805;-2.2993361199042e-05;-7.3764949775068e-06;-6.6543201683089e-05;-1.6747520930949e-05;4.8334259190597e-05;0.0011154671665281;-0.00027633263380267;3.6494682717603e-05;0.00068049744004384;-0.0014636283740401;0.00015416120004375;-2.7096337362309e-05;5.0839636969613e-05;-0.00010568177822279;-0.00034712100750767;0.0019673770293593;0.00019078153127339;0.00033174944110215;0.00072838243795559;0.00012072655226802;-0.00066873617470264;-0.00037172011798248;-0.00071689143078402;-0.00022278226970229;6.6252032411285e-06;0.00031946381204762;-0.0011294918367639;-8.7173357314896e-05;0.00010167763684876;6.4219559135381e-05;-0.00038648181362078;7.2431894295732e-06;-1.8499320503906e-05;0.00021171940898057;4.1457111365162e-05;1.9252816855442e-05;-0.00055212085135281;-0.00029583540163003;0.00049312261398882;0.0004405154613778;-0.00041022599907592;5.4965917115624e-06;0.00023332810087595;-2.7989564841846e-05;1.9594594050432e-05;-0.00025516602909192;-0.0014952695928514;-0.00030068439082243;6.0039703384973e-05;0.0002734299923759;-6.9142472057138e-05;0.00055112066911533;-7.1120593929663e-05;-0.00043098392779939;-0.00015174121654127;-0.00025878241285682;0.00029770465334877;0.0010811301181093;1.1300265896352e-06;-0.0003546470834408;6.2957966292743e-05;0.0008929658215493;7.9632327469881e-06;3.0993469408713e-05;4.5268177927937e-05;0.00033342250389978;-0.0004146168648731;0.00028816255507991;-0.00012827987666242;0.0010365811176598;0.00027353368932381;-0.00039073670632206;-9.1496578534134e-05;-0.00037925783544779;-0.00015170888218563;0.0005362915690057;-0.00016889951075427;0.00052910338854417;-0.00020686091738753;0.00016685623268131;-0.0004346159985289;7.6420030381996e-05;-7.8931945608929e-05;0.00051861093379557;-0.00069377158069983;0.00020331585255917;-0.00030433785286732;0.00021859318076167;-0.000477563473396;5.2286235586507e-05;0.00049526628572494;0.00011282687046332;-0.0010044173104689;-2.0111638150411e-05;-1.1021610589523e-05;-5.7899454986909e-05;1.1856372111652e-05;5.5948810768314e-05;0.0010970629518852;-0.00030540834995918;-2.3450964363292e-05;0.00071391480742022;-0.0014945297734812;0.00015849058399908;5.5763689488231e-06;5.0660379201872e-05;-3.8320566090988e-05;-0.00036833577905782;0.0019681614357978;0.00015591293049511;0.00030172086553648;0.0007848177338019;0.00014585042663384;-0.00063338608015329;-0.00039714117883705;-0.00069459574297071;-0.00024430910707451;-7.7876262366772e-05;0.00034789927303791;-0.0010899202898145;-8.6845517216716e-05;5.8099911257159e-05;6.7469889472704e-05;-0.00038029058487155;1.36155204018e-05;-2.1898264094489e-05;0.0002261816553073;7.3320486990269e-05;1.5767996956129e-05;-0.00063027598662302;-0.00025519423070364;0.00047157364315353;0.00034293899079785;-0.00023745215730742;-1.5819292457309e-05;0.00024686465621926;-2.4673145162524e-05;0.00010820714669535;-0.00019916241581086;-0.0017336716409773;-0.00033755978802219;4.4829044782091e-05;0.00021731777815148;-7.7261072874535e-05;0.00060663232579827;-4.2713632865343e-05;-0.00039630083483644;-0.00013219815446064;-0.00032970518805087;0.00024668406695127;0.0012148078531027;1.2769482054864e-05;-0.00039044310688041;4.5476659579435e-05;0.00093734165420756;7.7803870226489e-06;3.4529559343355e-05;3.7853100366192e-05;0.00034786458127201;-0.0004206103621982;0.00019322741718497;-0.00012883088493254;0.00089902739273384;0.00027865701122209;-0.00036562146851793;-8.8190048700199e-05;-0.00042598592699505;-0.00016013451386243;0.00050103437388316;-0.00018075652769767;0.00058134680148214;-0.00022536420146935;9.1354369942565e-05;-0.0004364738415461;0.00011801915388787;-5.0013561121887e-05;0.0005155768012628;-0.00055665062973276;0.00020263961050659;-0.00027141664759256;0.00023093202617019;-0.00036846232251264;5.1511666242732e-05;0.00056434283033013;0.0001229317713296;-0.0011001178063452;-3.3443295706093e-06;-1.7226204363396e-05;-1.1707556041074e-05;7.4059615144506e-05;4.1895287722582e-05;0.0006626247195527;-0.00022718826949131;-8.3208316937089e-05;0.00047676989925094;-0.00096779561135918;9.6035175374709e-05;8.5317617049441e-05;3.8551912439289e-05;0.00014641357120126;-0.00024529607617296;0.0011722466442734;2.2642663680017e-05;0.00015907020133454;0.00057609839132056;0.0001240905985469;-0.00032581933191977;-0.00027705891989172;-0.00044743088074028;-0.0001836129813455;-0.0002550846838858;0.00024518792633899;-0.00059019605396315;-4.949952926836e-05;-7.9402212577406e-05;3.7018566217739e-05;-0.00019415176939219;1.6722007785575e-05;-1.5818721294636e-05;0.00016135291662067;0.00011794563761214;-8.281273949251e-06;-0.00045642009354196;-0.00010500655480428;0.00028762558940798;7.9185221693479e-05;0.00010023068170995;-4.0452472603647e-05;0.00014274998102337;-2.1691808797186e-05;0.00025931437266991;-5.0498616474215e-05;-0.0014483472332358;-0.00027248400147073;1.7211559679708e-05;5.6931268773042e-05;-4.6236255002441e-05;0.00042855378706008;1.3285490240378e-05;-0.00022290174092632;-4.8520443669986e-05;-0.00033218582393602;9.342202974949e-05;0.00091047555906698;2.6721791073214e-05;-0.00027215766021982;1.0224572179141e-05;0.00061905023176223;6.2793201323075e-06;2.8483609639807e-05;5.0893672778329e-06;0.00024517480051145;-0.00028029450913891;-2.7426996894064e-05;-8.1711405073293e-05;0.00033672346035019;0.000182039802894;-0.00018077610002365;-5.1384631660767e-05;-0.00034301477717236;-0.00011961632117163;0.0002745681849774;-0.00013309440691955;0.00045325924293138;-0.00017626228509471;-8.5855150246061e-05;-0.0002857621293515;0.00015863627777435;1.7024021872203e-05;0.00032808710238896;-0.00011709828686435;0.00013105889956933;-0.00013339734869078;0.00016678011161275;-3.6209316021996e-05;3.3572781831026e-05;0.00047110192826949;9.6668700280134e-05;-0.00088264397345483;2.678898817976e-05;-1.9922050341847e-05;-0.00031272554770112;-2.0926443539793e-05;-0.00056473404401913;5.0270016799914e-05;4.4218602852197e-05;0.00018877780530602;0.00050376018043607;-0.00027759512886405;-0.00024782531545497;-1.1824167813757e-05;-0.00092301511904225;8.8503302322351e-06;-0.00050364161143079;0.00013533730816562;0.0001850448170444;1.6057581888163e-05;-0.00037568469997495;7.4721225246321e-05;-0.00018582737538964;0.00030795307247899;0.00010391187970527;0.00097068818286061;7.051774446154e-05;0.00045694713480771;-0.00018131517572328;0.00035444172681309;-1.0030345947598e-05;0.00014897026994731;-1.2189799235784e-05;6.2368203543883e-06;1.1761945643229e-05;0.00016711534408387;0.00010650541662471;-0.00022408987570088;-8.6567451944575e-05;0.00031837981077842;1.7480348105892e-05;0.00044127393630333;-0.00016869096725713;-1.1480475222925e-05;-7.255590026034e-05;0.00063818192575127;-4.6946737711551e-05;-0.0013350106310099;8.5630585090257e-05;-0.00020702705660369;5.5882392189233e-05;-0.00017272068362217;0.00025791986263357;-5.7872377510648e-05;-0.00023292128753383;0.00017573664081283;-0.00039613893022761;6.7043183662463e-05;0.00053779740119353;-3.2078085496323e-05;-0.00015057153359521;4.8908121243585e-05;0.00026557591627352;-6.7576211222331e-06;7.3983079346363e-05;-1.4976348211349e-05;0.00015167845413089;1.0996764103766e-05;-0.00061811716295779;-6.7758774093818e-05;-0.0005082794232294;-6.5544954850338e-05;5.1571441872511e-05;8.7973006884567e-05;-0.00046354546793737;6.0365737226675e-06;-2.4942393793026e-05;-8.2552323874552e-05;0.000410382024711;-9.2783870059066e-05;-0.00020811433205381;-0.00034456921275705;-4.0753020584816e-05;0.0002570157230366;0.00020464694534894;0.00052867236081511;6.1107923102099e-05;0.00017852436576504;1.2481220892369e-06;0.00063935748767108;0.00011484840069897;0.00055271334713325;1.4060255125514e-05;-0.0008982100407593;8.5331041191239e-05;2.8475315048127e-05;-1.5993666238501e-05;-0.00033151821116917;-1.2732048162434e-05;-0.00078063312685117;2.9961434847792e-05;8.8535147369839e-05;0.00027015517116524;0.00087166181765497;-0.00046329159522429;-0.00023819632770028;-4.1840132325888e-05;-0.00096598971867934;-3.8625917113677e-06;-0.00099564937409014;0.00022584592807107;0.00016448582755402;-5.0043920055032e-05;-0.00058793550124392;0.00020369200501591;-0.00022353482199833;0.00043933282722719;0.00022515907767229;0.0010100002400577;0.00012460810830817;0.0007048561819829;-0.00026647964841686;0.00034357586991973;5.4432889555756e-06;0.00026475090999156;-2.2838479708298e-05;-2.6647856543605e-07;1.6329915524693e-05;0.0001794908894226;0.0001648129982641;-0.0004425733932294;-7.0112997491378e-05;0.00038082167156972;-2.8558813937707e-05;0.00047249140334316;-0.00013533476158045;6.2343729950953e-05;-8.6211206507869e-05;0.00068038335302845;-5.1864441047655e-05;-0.0018797811353579;7.0221736677922e-05;-0.00029564840951934;7.119687506929e-05;-0.00012088038783986;0.00044528482249007;-9.5318457169924e-05;-0.00031616172054783;0.00016283737204503;-0.00048986729234457;4.648407411878e-05;0.00095721334218979;-3.2322607239621e-06;-0.00026097340742126;5.915286965319e-05;0.00051387114217505;-6.1509808801929e-06;9.2124100774527e-05;-1.7467375073466e-05;0.00024388979363721;3.0233206416597e-05;-0.0006740415119566;-0.00014292944979388;-0.00040800956776366;-0.00010340566223022;-9.2355412562029e-06;0.00015442448784597;-0.00061194377485663;-6.5204339989577e-06;5.0863269279944e-05;-0.00011105112207588;0.00054899242240936;-0.00013561338710133;-0.00028386045596562;-0.00036625101347454;-0.0001252143556485;0.00029163373983465;0.00023987775784917;0.00048701794003136;0.00016891438281164;0.00014431914314628;2.3863507522037e-05;0.00068482593633235;0.00016557352500968;0.00073735881596804;2.260508153995e-05;-0.0012049846118316;0.00011401107622078;2.4037613911787e-05;-1.2906344636576e-05;2.758668961178e-05;1.6760144717409e-05;-0.00015436414105352;-2.0856527044089e-05;-4.3344371079002e-06;-0.00011809333955171;-0.00016028148820624;0.00027191088884138;-2.0298282834119e-05;1.0415579708933e-05;7.5744392233901e-05;-7.1451679104939e-05;2.9513039407902e-05;-0.00016695479280315;-6.8990200816188e-05;-9.8477787105367e-05;-3.1436742574442e-05;0.00015938372234814;2.5608910618757e-06;0.00012804623111151;5.6207863963209e-05;-4.7962628741516e-05;8.7378275566152e-06;1.0239737093798e-05;0.00015186247765087;1.5187605640676e-05;3.0779420967519e-07;-0.00010323448077543;9.1140376753174e-05;2.3824668460293e-06;-7.7331048942142e-07;6.7392488745099e-06;2.2994332539383e-05;0.00016044465883169;9.3212220235728e-05;0.00019206063007005;4.4900967623107e-05;-0.00029457960044965;4.567854830384e-06;-3.9431761251763e-05;-1.5073639588081e-05;-8.2122198364232e-05;-6.4886131440289e-05;0.00012518923904281;1.8655226085684e-05;-1.1098560207756e-05;0.00020336211309768;0.00018313899636269;-5.8654924941948e-05;-6.5151813032571e-05;-0.00030946277547628;-0.00020030869927723;4.5781122025801e-05;1.5644656741642e-05;-0.00011908621672774;-2.0520210455288e-05;8.2224585639779e-05;3.1268180464394e-05;1.0323497917852e-05;3.8259837310761e-05;-4.9055108775065e-07;4.9020986807591e-06;8.5926993051544e-05;2.254771970911e-05;0.00033506905310787;0.00010491772263777;0.00016959817730822;6.3949875766411e-05;-7.4056304583792e-05;-2.851556018868e-05;2.0984838556615e-05;7.6677069955622e-06;0.00025457664742135;7.454178557964e-05;0.0001468739064876;4.0367056499235e-05;-4.6831984946039e-05;0.0001102985770558;0.00012505074846558;-9.261734521715e-05;-1.6938548696999e-06;-0.00025627974537201;-0.00013237913663033;-0.00024636572925374;-7.8309400123544e-05;-0.00028079815092497;-9.3953989562578e-05;-8.6212703536148e-06;-1.3580259974333e-06;-0.00018318524234928;-4.1816627344815e-05;3.265899795224e-05;-2.0722192857647e-05;3.1467781809624e-05;3.0008592148079e-05;-0.00018472516967449;-1.2006354154437e-05;2.8297803510213e-05;-0.00016874723951332;-0.00031583831878379;0.00044989932212047;-2.7470818167785e-05;2.2365060431184e-05;9.99042604235e-05;-7.9306671977974e-05;8.3254497440066e-05;-0.00026088312733918;-8.5250278061721e-05;-0.00010605986608425;-2.9588776669698e-05;0.00020564348960761;-1.8249767890666e-05;0.00013263114669826;6.3644765759818e-05;-5.7808159908745e-05;-7.2358739089395e-06;-2.4081913579721e-05;0.00021486851619557;1.78098998731e-05;-1.0227709026367e-05;-0.00013089153799228;0.00012663962843362;4.6343275243999e-06;2.1384576598393e-07;-1.5208537661238e-05;1.6212106856983e-05;0.00022342620650306;0.00014018588990439;0.00027112581301481;9.6098359790631e-05;-0.00041355309076607;-4.1628212784417e-05;-4.6600231144112e-05;-2.4606941224192e-05;-0.00014563162403647;-0.00010578817455098;0.0001921484072227;5.752059223596e-05;3.4012575724773e-06;0.00026849994901568;0.00023710781533737;-8.425246051047e-05;-9.4623697805218e-05;-0.00040941298357211;-0.00027445922023617;9.6454306913074e-05;4.3862983147847e-05;-0.0001803705963539;-6.1762541008648e-05;9.4252172857523e-05;4.6457007556455e-05;4.5140466681914e-05;6.1156802985352e-05;-2.1851869291822e-07;4.6962768465164e-06;0.00011538716353243;4.2935003875755e-05;0.00046676956117153;0.00019817060092464;0.0002493021893315;0.00012230568972882;-0.00011330936104059;-6.9703739427496e-05;2.5970697606681e-05;1.2425143722794e-05;0.00031100740307011;0.00011933761561522;0.00017004321853165;7.0363857958e-05;-5.9198569942964e-05;0.00022968294797465;0.00025584397371858;-0.00014129887858871;-3.966973599745e-05;-0.0004303218156565;-0.0002762325166259;-0.00032506676507182;-0.00012952271208633;-0.00036046671448275;-0.00016163258987945;-6.1038276726322e-06;-2.2367378278432e-06;-0.000212547252886;-6.671166192973e-05;3.5675075196195e-05;-2.4780949388514e-05;2.654291165527e-05;3.6486428143689e-05;-0.00017541101260576;5.2896048146067e-06;5.8226214605384e-05;-0.0001748575741658;-0.00042096033575945;0.0005428833537735;-3.0965060432209e-05;2.9608305339934e-05;0.00010161258251173;-6.9781177444384e-05;0.00013733554806095;-0.00030333502218127;-8.1402198702563e-05;-8.9922483311966e-05;-2.7414091164246e-05;0.00020926586876158;-4.040494968649e-05;0.00011026469292119;5.4849482694408e-05;-5.1227019866928e-05;-2.1224106603768e-05;-6.3911895267665e-05;0.00022763603192288;1.8728273062152e-05;-1.8996677681571e-05;-0.00013789952208754;0.00013808970106766;5.8738223742694e-06;2.0265490547899e-06;-3.2502532121725e-05;4.4247344703763e-06;0.0002312563592568;0.00015907154011074;0.00028577478951775;0.00013780701556243;-0.00042870381730609;-0.0001036773683154;-4.6208700950956e-05;-3.1998453778215e-05;-0.00017788315017242;-0.00012875058746431;0.00021633777942043;9.99168260023e-05;1.4641524103354e-05;0.0002671369293239;0.00023052009055391;-8.5902443970554e-05;-0.00010213569476036;-0.00040891391108744;-0.00028429744997993;0.00012738587975036;6.939610466361e-05;-0.00020000486983918;-0.00010272961662849;9.1033776698168e-05;5.5000295105856e-05;6.571884296136e-05;7.0385722210631e-05;-4.3504894620128e-07;4.0890781747294e-06;0.00012032178346999;5.4408930736827e-05;0.00050950510194525;0.00025903969071805;0.00026843027444556;0.00016363253234886;-0.00012991312541999;-0.00010410835966468;2.9861739676562e-05;1.5426661775564e-05;0.00030448663164862;0.00014416304475162;0.00016212783521041;8.896069630282e-05;-5.9671187045751e-05;0.00030455409432761;0.00035169237526134;-0.00016188761219382;-6.9762369093951e-05;-0.0005201319581829;-0.0003772706259042;-0.00034104601945728;-0.00015837854880374;-0.0003672061720863;-0.00020423094974831;-5.7560582717997e-06;-3.6140927477391e-06;-0.00019774622342084;-7.9542085586581e-05;2.8559408747242e-05;-2.8522976208478e-05;-9.0634957814473e-06;6.4018445300462e-06;-4.5467390009435e-05;0.00026063999393955;0.000168393846252;0.00010705417662393;-0.00045229945681058;0.00033170392271131;-2.6565398002276e-05;3.131393896183e-05;0.00011124517186545;-3.5253990063211e-05;0.00026301507023163;-9.2248985311016e-05;3.5050379665336e-05;8.484110730933e-05;-7.8525234130211e-05;8.094262011582e-05;-0.00021762105461676;2.390645477135e-06;-0.00016649672761559;-1.8118573279935e-05;-1.1458656445029e-05;-0.00021956831915304;-6.6484477429185e-05;1.8036058690996e-06;-3.3187308872584e-05;-0.00013957534974907;0.00012710163719021;4.0536480128139e-07;1.1641901437542e-05;-7.0021392275521e-06;-1.0633883903211e-05;7.6862306741532e-05;0.00019633780175354;5.5044507462298e-05;0.00030039099510759;4.3131902202731e-05;-0.00054209225345403;-8.8610850070836e-06;-6.7379689426161e-05;-0.00014716386795044;-0.00015043106395751;1.21850243886e-05;0.0002755337045528;-2.0012985260109e-05;0.0001538269862067;0.00015091334353201;-6.0130787460366e-06;-6.5334046666976e-05;-0.00019827407959383;-0.00027168015367351;6.7001557908952e-05;0.00011768920376198;1.9056358269154e-06;-0.00024375729844905;4.4046344555682e-05;0.00010128415306099;8.3611688751262e-05;4.6823191951262e-05;2.1417570224003e-06;5.6021663112915e-06;5.2776420488954e-05;9.1062458523083e-05;0.00028899346943945;0.00039295927854255;7.8273369581439e-05;0.00035596720408648;-3.9385467971442e-05;-0.00021366111468524;3.3255546441069e-05;1.1241414540564e-05;0.00012546173820738;0.0003063119656872;6.4810861658771e-05;0.00018654466839507;-6.3757091993466e-05;0.00023161436547525;0.00033211940899491;-5.1604340114864e-05;-0.00011140729475301;-0.00033600552706048;-0.00043937427108176;-0.00019604385306593;-0.00025800135335885;-0.00015811040066183;-0.00040787470061332;-8.8445549408789e-06;-1.0031714737124e-05;-6.1300306697376e-05;-0.0002037341328105;2.4264558305731e-05;-2.6403484298498e-05;-6.8436179390119e-06;-9.2499226411746e-07;-3.258720607846e-05;0.00028018170269206;0.00015354817151092;0.00012302628601901;-0.00037022324977443;0.00023259808949661;-2.0200108338031e-05;2.9656039259862e-05;0.00011358325718902;-4.0965001971927e-05;0.00022498045291286;-3.2796433515614e-05;4.5135740947444e-05;0.00010183423000854;-5.9953130403301e-05;5.7223009207519e-05;-0.00021952141833026;7.1166573434311e-07;-0.00020166899776086;-2.5125931642833e-05;-5.2277132454037e-06;-0.00020208826754242;-9.8398602858651e-05;-4.5294736992219e-06;-2.9923785405117e-05;-0.00012729826266877;0.00011793644080171;-1.5181557273536e-06;1.0369000847277e-05;7.8913481047493e-06;-1.2985510693397e-06;7.1778405981604e-05;0.00019170508312527;2.2279826225713e-05;0.00028961230418645;8.4063955000602e-05;-0.00052209146087989;-2.0078548459423e-06;-6.270497397054e-05;-0.00012508840882219;-0.00012835468805861;-1.8355984138907e-05;0.00023905657872092;-2.8141301299911e-05;0.00016526525723748;0.00017693579138722;-1.1277194062131e-05;-5.8041190641234e-05;-0.00020017931819893;-0.00029828993137926;3.7802914448548e-05;9.3863753136247e-05;3.1680930987932e-05;-0.00021561577159446;3.6977442505304e-05;9.7577154519968e-05;7.564506813651e-05;4.0459941374138e-05;3.5798520912067e-06;4.924247150484e-06;4.0896462451201e-05;9.1384805273265e-05;0.00022557265765499;0.00037188394344412;6.1976839788258e-05;0.00034329405752942;-1.798358061933e-05;-0.00018967343203258;2.7304417017149e-05;8.2791939348681e-06;0.00010680924606277;0.00031123761436902;4.9639493227005e-05;0.00018768224981613;-6.4222120272461e-05;0.00017357621982228;0.00023653637617826;-2.2596843336942e-05;-0.00010014697909355;-0.00024894400849007;-0.00037322050775401;-0.00016155588673428;-0.00025430152891204;-0.00012920775043312;-0.00039888426545076;-8.0853660620051e-06;-7.0841533670318e-06;-5.0794049457181e-05;-0.00021787718287669;1.6114476238727e-05;-1.9239720131736e-05;-5.6374874475296e-06;-4.5785750444338e-06;-1.4100349289947e-05;0.00023377250181511;0.00011152008664794;0.00010489996202523;-0.00024367867445108;0.00012153168790974;-1.1644118785625e-05;2.3175785827334e-05;8.6353596998379e-05;-3.2414081942989e-05;0.00015457739937119;1.6447356756544e-05;4.2845800635405e-05;9.3573129561264e-05;-3.076014763792e-05;2.9231703592814e-05;-0.00017557638057042;-7.1469544309366e-06;-0.00018028187332675;-2.1905871108174e-05;-2.7352130018699e-06;-0.00014740008919034;-0.00010169595771004;-6.280948582571e-06;-2.341565414099e-05;-9.0264627942815e-05;8.4713261458091e-05;-2.6013324259111e-06;7.4026879701705e-06;1.3783146641799e-05;2.9782061119477e-06;5.0461745559005e-05;0.00014548016770277;-4.114475359529e-06;0.00023034980404191;9.471920930082e-05;-0.00040371052455157;2.5286142317782e-06;-4.6305885916809e-05;-8.6450170783792e-05;-8.7230626377277e-05;-3.4830030926969e-05;0.00016119786596391;-2.45588234975e-05;0.00013564528489951;0.00014934276987333;-1.3707473044633e-05;-4.136812640354e-05;-0.00015160901239142;-0.00025080918567255;1.4857954738545e-05;6.0723839851562e-05;4.453664587345e-05;-0.00015246534894686;2.3479175069951e-05;7.2120477852877e-05;5.7031989854295e-05;3.3121439628303e-05;3.5332479910721e-06;3.5078801374766e-06;2.5110171918641e-05;7.4053488788195e-05;0.00013665921869688;0.0002828098658938;3.7636596971424e-05;0.00026640435680747;-2.1638225007337e-06;-0.0001370741520077;1.6372483514715e-05;1.6975041035039e-06;6.7409615439828e-05;0.0002477832022123;2.8343349185889e-05;0.00015146484656725;-4.9475227569928e-05;0.00011223398905713;0.00013618657249026;-4.0281229303218e-06;-7.6556803833228e-05;-0.0001472870062571;-0.00026755631552078;-0.00010212705819868;-0.00019754297682084;-7.9855140938889e-05;-0.00030905017047189;-3.8306479837047e-06;6.7299237116458e-07;-3.1094703444978e-05;-0.00018423724395689;8.8419656094629e-06;-1.2460007383197e-05;-1.5959684560585e-06;-5.6383237279078e-06;2.8538474339257e-07;0.00016528155538253;6.7437918914948e-05;7.3693598096725e-05;-0.00013019629113842;4.0185943362303e-05;-3.6883975553792e-06;1.6687550669303e-05;6.0999856941635e-05;-2.4049963030848e-05;8.806509868009e-05;3.2827760151122e-05;3.2636115065543e-05;7.3252369475085e-05;-4.9229843170906e-06;8.9225295596407e-06;-0.00011957527749473;-1.2971136129636e-05;-0.0001371420948999;-2.1859026674065e-05;-8.0399274793308e-07;-9.1601970780175e-05;-7.9723220551386e-05;-7.6896767495782e-06;-1.7133128494606e-05;-5.6502347433707e-05;5.8436176914256e-05;-2.5112267394434e-06;4.3975828702969e-06;1.6786983906059e-05;9.1824849732802e-06;3.2804917282192e-05;9.4091505161487e-05;-1.4119505976851e-05;0.00015591707779095;7.4646406574175e-05;-0.00025771310902201;3.2592395200481e-06;-3.179981285939e-05;-5.0253445806447e-05;-4.5011700422037e-05;-3.2370749977417e-05;8.7148866441566e-05;-2.1631032723235e-05;0.00010150376328966;0.00010950498108286;-1.4489507520921e-05;-2.451622094668e-05;-0.00010292541992385;-0.00018566666403785;-4.1615115264904e-07;2.8282202038099e-05;3.9507183828391e-05;-8.9259236119688e-05;1.38501454785e-05;5.0250200729351e-05;3.4857537684729e-05;1.6692694771336e-05;3.4542322282505e-06;1.7039208159986e-06;1.1180334695382e-05;5.248479283182e-05;6.4221690990962e-05;0.00018636207096279;1.9127695850329e-05;0.00016439813771285;6.0025040511391e-06;-7.9793055192567e-05;8.0101672210731e-06;-2.4676543830537e-07;3.7254470953485e-05;0.00017474115884397;1.3050562301942e-05;0.00011200393782929;-3.4272063203389e-05;4.9655220209388e-05;5.459284511744e-05;1.170064570033e-05;-4.9176083848579e-05;-6.2764353060629e-05;-0.00015000528946985;-5.3513278544415e-05;-0.00013611355097964;-4.1856070311042e-05;-0.00020752196724061;-1.726246182443e-06;3.3344736038998e-06;-1.6604668417131e-05;-0.0001396854640916;1.528257780592e-05;-2.9329097742448e-05;2.766271973087e-05;0.00019967916887254;5.383559710026e-06;0.00054863916011527;-0.00021557502623182;-8.9299181126989e-05;0.00038449541898444;-0.00076710537541658;5.4675212595612e-05;0.00019158111535944;3.2936372008407e-05;0.00049963674973696;-0.00019339876598679;0.00078043120447546;-0.00011078222451033;0.00010009128891397;0.00052711495663971;0.00015200424240902;-0.00017259281594306;-0.00021025165915489;-0.00043120910413563;-0.00016016398149077;-0.00060371001018211;0.00021895208919886;-0.00038624386070296;-2.3020633307169e-05;-0.00026189917116426;1.7190226571984e-05;-0.00010117514466401;1.6667381714797e-05;-4.9744548960007e-06;0.00013803818728775;0.00019434058049228;-6.1736784118693e-05;-0.00030277308542281;-4.105882908334e-05;0.00029027502750978;-5.3507912525674e-05;0.00031101942295209;-5.9639645769494e-05;2.624330954859e-05;-4.5051601773594e-05;0.00051207956857979;1.5972131222952e-05;-0.0014674403937533;-0.00027028200565837;3.3110198273789e-05;-4.7022789658513e-05;-1.4353988262883e-05;0.00030693199369125;6.900321750436e-05;-0.00021148582163732;1.3566886991612e-05;-0.00039074645610526;4.2639396269806e-05;0.00071192102041095;4.1224655433325e-05;-0.00018400384578854;4.5740102905256e-06;0.00042647056397982;6.9214447648847e-06;3.5315140848979e-05;-2.6678555514081e-05;0.00020763144129887;-0.00024013209622353;-0.00020416289044078;-6.5692722273525e-05;-4.1938426875276e-05;0.00013948271225672;-5.6416487495881e-05;-3.7222511309665e-05;-0.00035443966044113;-0.00012688130664174;0.00016330801008735;-0.00012253379100002;0.00044558054651134;-0.00017589206981938;-0.00025309351622127;-0.00023380405036733;0.00023367756512016;7.7188320574351e-05;0.00026571773923934;0.000191754224943;0.00011538768740138;-5.5330303439405e-05;0.00015662201622035;0.000267166265985;3.2651827496011e-05;0.00050503999227658;0.00010245434532408;-0.00095168093685061;3.2326646760339e-05;-3.3099069696618e-05;-0.00050408556126058;-4.4996755605098e-05;-0.00068324792664498;0.00011526582966326;-5.770206712441e-07;0.00020581303397194;0.00041727206553333;-0.00023671527742408;-0.00036056089447811;1.4673637451779e-05;-0.0015230758581311;2.5163832106045e-05;-0.00029195685056038;0.00011273844575044;0.0003204119275324;6.736795330653e-05;-0.00036237578024156;6.7461955950421e-06;-0.00025341383297928;0.00038810961996205;2.449023850204e-05;0.0015328068984672;4.9929542001337e-05;0.00048930000048131;-0.00019190910097677;0.0005681540351361;-3.269876469858e-05;0.0001529887522338;-4.8460105972481e-06;2.9616176107083e-05;4.4229968807485e-06;0.00021166373335291;8.8368484284729e-05;-2.4778688384686e-05;-0.00015312885807361;0.00045866536675021;3.8213183870539e-05;0.0005352656589821;-0.00021136064606253;-0.00019571857410483;-7.9587262007408e-05;0.00093707191990688;-7.8753546404187e-05;-0.0013524009846151;9.6366376965307e-05;-0.00018242916848976;0.00010584560368443;-0.00027537872665562;0.0001041991636157;-3.8623595173704e-05;-0.00030605625943281;0.00024725738330744;-0.00036914774682373;0.00011465782154119;0.00022408766380977;-2.8291722628637e-05;-2.5841460228548e-05;5.6312917877221e-05;6.0866983403685e-05;8.6158479462028e-06;0.00010164233390242;-1.9379176592338e-05;9.5460149168503e-05;-1.303069984715e-05;-0.00081529375165701;-5.4903957789065e-05;-0.00080228544538841;-7.5846473919228e-05;0.00014309959078673;6.7670087446459e-05;-0.00052359432447702;1.5127463484532e-05;-0.00011502425331855;-0.00011116179666715;0.00043047821964137;-9.5027484348975e-05;-0.00021865691815037;-0.00048124612658285;3.2879245281947e-06;0.00033656743471511;0.00026859540957958;0.00074262014823034;3.6687622923637e-05;0.00030939199496061;1.1696616866175e-06;0.00096092885360122;0.00013028443208896;0.0006089051021263;2.0248979126336e-05;-0.0010514174355194;0.00010470252891537;3.1890125683276e-05;-3.3903554140124e-05;-0.00057233747793362;-5.3653348004445e-05;-0.00077413546387106;0.00011167358752573;5.4487500165123e-05;0.00025792978703976;0.00059722107835114;-0.00032783864298835;-0.00038218245026655;3.8436664908659e-06;-0.0017466001445428;1.8259679563926e-05;-0.00048986484762281;0.00015514246479142;0.0003600959898904;5.1941868150607e-05;-0.0005007759318687;2.8950908017578e-05;-0.00029408183763735;0.00046243009273894;8.7755972344894e-05;0.0017218855209649;8.3940532931592e-05;0.00057096831733361;-0.00024134054547176;0.00063506414880976;-3.0202792913769e-05;0.00021887861657888;-5.442686870083e-06;3.4885510103777e-05;4.7832641030254e-06;0.00022136922052596;0.00011630196240731;-8.9776534878183e-05;-0.0001606679870747;0.0005365630495362;2.4764682166278e-05;0.00061135669238865;-0.0002225992793683;-0.00021605541405734;-9.1163790784776e-05;0.0010699321283028;-9.3466900580097e-05;-0.0017232550308108;0.00010022911737906;-0.00022212073963601;0.00013542713713832;-0.00027703307569027;0.00016323897580151;-5.8188157709083e-05;-0.00038129690801725;0.00025739552802406;-0.00039455102523789;0.00012015544052701;0.00037775159580633;-1.7836113329395e-05;-5.554815652431e-05;6.6592183429748e-05;0.00015061319572851;1.2199396223878e-05;0.00012394069926813;-2.2599038857152e-05;0.00011924630962312;-1.1341928257025e-05;-0.00093541276874021;-9.4035924121272e-05;-0.00085920852143317;-0.00010160087549593;0.00014730253315065;9.7525618912186e-05;-0.00063631479861215;1.1524201909197e-05;-0.00014230892702471;-0.00013658322859555;0.00049249152652919;-0.00011922105477424;-0.00026457305648364;-0.00054671970428899;-3.1377454433823e-05;0.00038919394137338;0.00031261396361515;0.00079474301310256;9.4954040832818e-05;0.00036046525929123;1.373473151034e-05;0.0011620334116742;0.0001630765182199;0.00074227660661563;2.6812978831003e-05;-0.0012784126447514;0.00012777453230228;5.5511432037747e-06;-1.810684625525e-05;-0.00040681354585104;-4.7500190703431e-05;-0.00033202339545824;6.4956569985952e-05;0.00017231378296856;0.00017279988969676;0.00037407610216178;-0.00021216942695901;-0.00019096693722531;-1.3294241263395e-08;-0.0012502192985266;1.5264840840246e-05;-0.00033254924346693;0.00010447820386617;0.00028142394148745;8.0309226177633e-05;-0.00036275433376431;-5.8936115237884e-05;-0.00021501879382413;0.00019718361727428;8.4627834439743e-05;0.0011473759077489;6.7675005993806e-05;0.00022824553889222;-0.00016626967408229;0.00039752488373779;-2.1930345610599e-05;0.00022771829389967;-6.253262199607e-06;3.4803852031473e-05;-4.623899485523e-07;7.4284034781158e-05;6.2184473790694e-05;-1.0491717148398e-05;-0.00010253860091325;0.00037199951475486;1.3715743079956e-05;0.00041959894588217;-0.00015032959345262;-0.0001593225315446;-5.5078849982237e-05;0.00072797428583726;-7.0763941039331e-05;-0.0012080692686141;6.6668275394477e-05;-0.00010362339526182;0.00010495052993065;-0.00016931185382418;6.7404580477159e-05;-4.2823812691495e-05;-0.00027749291621149;0.0001573522167746;-0.00014636498235632;8.4438863268588e-05;0.00019266529125161;-7.5804468906426e-06;-6.541106995428e-05;4.5032546040602e-05;0.00013537499762606;1.1217181054235e-05;9.3695656687487e-05;-1.8883174561779e-05;4.8319907364203e-06;-5.1346324880797e-07;-0.0007612855406478;-4.5323373342399e-05;-0.0005852798349224;-6.0894162743352e-05;0.00014140267740004;4.0296490624314e-05;-0.000433861190686;6.9640195761167e-06;-0.00030204944778234;-8.3215447375551e-05;0.00014523621939588;-5.957415123703e-05;-0.00015669674030505;-0.00033777055796236;-2.0077364752069e-05;0.00030514894751832;0.0001682360743871;0.00049372011562809;6.7885142925661e-05;0.00039426429430023;6.5034564613597e-06;0.0010781842283905;8.6112093413249e-05;0.00049517006846145;1.7302563719568e-05;-0.0007567816064693;7.7252116170712e-05;2.2458565581474e-05;-1.5545552741969e-05;1.751389936544e-05;2.2395162886824e-05;-0.00011209615331609;4.7336402531073e-06;3.4969099942828e-05;-0.00010884738003369;-0.00025856684078462;0.00033518622512929;-1.902742224047e-05;1.8277150957147e-05;6.5780026488937e-05;-4.5832435716875e-05;8.3582803199533e-05;-0.00018778300727718;-5.1478051318554e-05;-5.6867265811889e-05;-1.7016653146129e-05;0.00013234750076663;-2.5515913876006e-05;7.1284113801084e-05;3.3075477404054e-05;-3.410987847019e-05;-1.2004556992906e-05;-3.8701062294422e-05;0.00014176248805597;1.1000741324096e-05;-1.1154422281834e-05;-8.7205371528398e-05;8.7385094957426e-05;3.6079604797123e-06;1.2926908539157e-06;-1.8773953343043e-05;4.2933606891893e-06;0.00014592839579564;0.00010050908895209;0.00017751882842276;8.5210704128258e-05;-0.00026789645198733;-6.3680497987662e-05;-2.8654132620431e-05;-2.0084919015062e-05;-0.00011050969624193;-7.9717974585947e-05;0.00013460514310282;6.1448030464817e-05;7.08123889126e-06;0.00016983131354209;0.00014799235214014;-5.3337138524512e-05;-6.3567131292075e-05;-0.00025932004791684;-0.00018176480080001;7.7583950769622e-05;4.1558312659618e-05;-0.00012394235818647;-6.2952130974736e-05;5.7647877838463e-05;3.5035507607972e-05;4.0016999264481e-05;4.30394684372e-05;-1.2023754436541e-07;2.6271882234141e-06;7.5290052336641e-05;3.3990527299466e-05;0.00031847003265284;0.00016039186448324;0.00016807619249448;0.00010098913480761;-8.0587204138283e-05;-6.3288556702901e-05;1.895124114526e-05;9.9046392278979e-06;0.00019305392925162;9.1768917627633e-05;0.00010233681678073;5.6015291193034e-05;-3.8518235669471e-05;0.00018420488049742;0.00021314949844964;-9.9113305623177e-05;-4.1247662011301e-05;-0.00031936771119945;-0.00022914506553207;-0.00021463824668899;-9.9817210866604e-05;-0.00023179271374829;-0.0001282095327042;-4.4859784793516e-06;-2.741461230471e-06;-0.00012523107579909;-5.0916012696689e-05;1.7627933630138e-05;-2.0105469957343e-05;1.5715994550192e-06;-3.1349461551144e-06;-2.118643715221e-05;0.00020219157158863;0.00010963794920826;7.8658413258381e-05;-0.00025298839318566;0.00015789332974236;-1.1988277037744e-05;2.1940535589238e-05;9.8176198662259e-05;-4.2310868593631e-05;0.00015590756083839;-2.9894861654611e-05;3.0860373954056e-05;7.4164156103507e-05;-3.4444714401616e-05;3.9768030546838e-05;-0.00015655455354135;4.0190570871346e-07;-0.00015064039325807;-3.3073276426876e-05;2.3589661850565e-06;-0.00014766755339224;-5.7718338211998e-05;-8.5145438788459e-06;-1.9635272110463e-05;-9.8571457783692e-05;9.7270829428453e-05;-1.1281292700005e-06;7.1858835326566e-06;1.5458001143998e-05;9.3654307420366e-06;6.629538256675e-05;0.00014911672042217;1.8995204300154e-05;0.00020556786330417;4.7452998842346e-05;-0.00035897298948839;-1.8267836594532e-06;-4.720702781924e-05;-8.6843938333914e-05;-8.3585116954055e-05;-7.2643692874408e-06;0.00016608466103207;-2.9533284759964e-05;0.00014872950850986;0.00015587960660923;-1.6461390259792e-05;-4.3148102122359e-05;-0.00017474191554356;-0.00025272407219745;1.6869091268745e-05;5.5089476518333e-05;1.9386074200156e-05;-0.00015158113092184;3.1234671041602e-05;7.837269367883e-05;4.79245572933e-05;1.6010415492929e-05;3.9032561289787e-06;2.7520732146513e-06;2.8374526664265e-05;6.7263725213706e-05;0.00015882472507656;0.00026868656277657;4.9814669182524e-05;0.00022467320377473;-1.0201169970969e-05;-0.0001209405818372;2.1157864466659e-05;1.1306895430607e-05;9.0574976638891e-05;0.00023717235308141;3.9129859942477e-05;0.00014306584489532;-5.2363557188073e-05;9.218947525369e-05;0.00013521694927476;-1.5560198107778e-06;-6.4064188336488e-05;-0.00015515135601163;-0.00022676873777527;-0.00012202297511976;-0.00019364668696653;-0.00010371384269092;-0.00029101732070558;-1.0193063644692e-05;-1.1044169696106e-05;-4.3653679313138e-05;-0.00016776961274445;1.6723337466829e-05;-2.0446241251193e-05;2.6232667096338e-06;-5.5648224588367e-06;-1.6129923096742e-05;0.00021969770023134;0.00010872862912947;9.0088520664722e-05;-0.00023503699048888;0.00012852308282163;-9.7693682619138e-06;2.2605880076298e-05;0.00010368332732469;-4.484945020522e-05;0.00014961512351874;-1.1150445970998e-05;3.6345441912999e-05;8.5672458226327e-05;-2.79825690086e-05;3.2009262213251e-05;-0.00016563352255616;-1.9303424778627e-06;-0.00017256196588278;-3.7732792407041e-05;3.8573830352107e-06;-0.00014812940207776;-7.2667571657803e-05;-1.1604724932113e-05;-2.0157314793323e-05;-9.8537551821209e-05;9.9711578513961e-05;-1.7633685729379e-06;7.0499791036127e-06;2.1596055375994e-05;1.3969641258882e-05;6.5970547439065e-05;0.00015233054000419;7.9611563705839e-06;0.00021028640912846;6.3992243667599e-05;-0.00036659973557107;2.5447607754359e-07;-4.8873138439376e-05;-8.2988910435233e-05;-7.8273747931235e-05;-1.8011480278801e-05;0.00016041610797402;-3.4650485758903e-05;0.00015739091031719;0.00016937250620686;-1.8373493730905e-05;-4.1384373616893e-05;-0.00018026637553703;-0.00027067269547842;7.821322469681e-06;4.9085880164057e-05;3.0740073270863e-05;-0.00014813942834735;3.0011316994205e-05;8.2522783486638e-05;4.723410893348e-05;1.199118742079e-05;4.8236452130368e-06;2.4673986445123e-06;2.4408416720689e-05;7.0736386987846e-05;0.00014158421254251;0.00027619051979855;4.5361863158178e-05;0.00022817160061095;-3.0194703413144e-06;-0.00011822243686765;1.9878762032022e-05;1.1560730854399e-05;8.6325249867514e-05;0.0002518079127185;3.4715922083706e-05;0.00015283575339708;-5.4816548072267e-05;7.4322982982267e-05;0.00010919685882982;1.0407529771328e-05;-6.391599890776e-05;-0.00013092625886202;-0.00021299245418049;-0.00011380764044588;-0.00020290167594794;-9.6449919510633e-05;-0.00030294278985821;-1.0172254405916e-05;-1.1179967259523e-05;-4.0706963773118e-05;-0.00018274140893482;4.5927336032037e-05;-4.5660712203244e-05;6.9195324613247e-05;0.00045842427061871;-0.00011117105896119;0.00057469075545669;-0.00021247775293887;-9.6527346613584e-06;0.00027315234183334;-0.00052138778846711;-1.2061112101946e-05;0.00033423458808102;3.6938863559044e-06;0.0012393540237099;-0.00013503849913832;0.00031410428346135;-0.00032300583552569;2.0942265109625e-05;0.00043262430699542;0.00024483387824148;-3.6103920137975e-05;-6.4978805312421e-05;-0.00048685088404454;-9.7649026429281e-05;-0.001270130625926;0.00021225128148217;-0.0003127105301246;2.1776462745038e-05;-0.00054405356058851;-4.0368061604568e-07;-6.1868602642789e-05;1.0054712220153e-05;2.0091219994356e-05;0.00010227193706669;0.00028181803645566;-0.00016387448704336;-4.0725062717684e-05;1.7983022189583e-05;0.00039641244802624;-0.00017726837540977;0.00052014651009813;-7.8575656516477e-05;-0.00019174866611138;-9.2881433374714e-05;0.00089655094780028;6.9752924900968e-05;-0.0014224379556254;-0.00024785145069472;8.5867417510599e-05;-0.000199027810595;2.693842361623e-05;0.00010070293501485;0.00016711806529202;-0.00025959897902794;0.00010599567031022;-0.00040254514897242;1.516847351013e-05;0.00030230946140364;5.7699900935404e-05;-1.5977877410478e-05;1.405139300914e-05;0.00010157939686906;4.3949557948508e-06;5.6453518482158e-05;-7.4237250373699e-05;0.00012733857147396;-0.00018551500397734;-0.00045242015039548;-5.0469123380026e-05;-0.00058000173885375;7.4876348662656e-05;0.00012832507491112;-1.8704669855651e-05;-0.00038046031841077;-0.00015192510909401;7.4167815000692e-06;-0.00010590216697892;0.00044216105015948;-0.00016758609854151;-0.00047568648005836;-0.00014985425514169;0.00033078851993196;0.000166248952155;0.00018084180192091;0.0005959082627669;0.00010283805750078;8.6765779997222e-05;0.00014880737580825;0.00071941094938666;3.7651068851119e-05;0.00055055017583072;0.00011595615069382;-0.0010839710012078;4.4997912482359e-05;-3.9449016185245e-05;5.8569410612108e-05;0.00042355948244222;-0.00013180992391426;0.00045087281614542;-0.00014953318168409;4.4413973228075e-05;0.00015271233860403;-0.00027592791593634;-3.5286117054056e-05;0.00029655254911631;-1.4439302503888e-05;0.0011620750883594;-7.5877040217165e-05;5.8211640862282e-05;-0.00030577371944673;-2.2634383640252e-05;0.00025645742425695;0.00021588728122879;1.4795537936152e-05;2.010056959989e-05;-0.00036622525658458;-3.7208697904134e-05;-0.0011608650675043;0.00015154328139033;-0.00023930081806611;3.3902921131812e-05;-0.00049209163989872;-3.6451490359468e-06;-3.4585031244205e-05;5.4650968195347e-06;2.276823943248e-05;6.0408438002924e-05;0.00023468385916203;-0.00016249821055681;6.5241147240158e-05;3.3989010262303e-05;0.00034608785063028;-0.0001688979100436;0.00043867560452782;-6.6106833401136e-05;-0.00020682137983385;-8.3134713349864e-05;0.00078062008833513;6.901611777721e-05;-0.00098417594563216;-0.00016949039127212;8.3025341155007e-05;-0.00021244805247989;3.0339535442181e-05;1.7943988268598e-06;0.0001717053091852;-0.00021435525559355;0.0001146846843767;-0.00030388502636924;3.9477447444369e-07;5.5078206059989e-05;4.7869609261397e-05;3.9831356843933e-05;1.279428761336e-05;-4.2659223254304e-05;5.5413562449758e-07;4.8613626859151e-05;-6.5466098021716e-05;6.6931526816916e-05;-9.9625205621123e-05;-0.00042998426943086;-2.8728705729009e-05;-0.00063270807731897;2.6046107450384e-05;0.00016068054537755;-4.1576872717997e-06;-0.00029065349372104;-0.00011525605077622;-4.8379290092271e-05;-6.7621418565977e-05;0.00033102562883869;-0.00011978791008005;-0.00041511861491017;-6.0463458794402e-05;0.0002656131691765;0.00015526769857388;7.7513359428849e-05;0.00058925687335432;6.1207640101202e-05;0.00012109435192542;0.0001011754211504;0.00066481373505667;2.7862037313753e-05;0.00041679840069264;8.6284249846358e-05;-0.0008227881626226;2.3033047909848e-05;-4.0058228478301e-05;-0.00068043440114707;-5.2969684475102e-05;-0.00081833638250828;0.00021580532484222;-0.00013658402895089;0.00018366222502664;0.00022074881417211;-0.00013858503371011;-0.00037466385401785;4.64149088657e-05;-0.0021201665513217;5.1952236390207e-05;-9.9744875114993e-06;6.710449088132e-05;0.00041698370478116;0.00010564355034148;-0.00021921982988715;-2.1303319499566e-06;-0.00030731214792468;0.00045059388503432;-0.00012951751705259;0.0019850651733577;-7.7179374784464e-06;0.00060027558356524;-0.00017638358986005;0.00069959642132744;-5.5666176194791e-05;0.00020489463349804;-2.0538700482575e-06;5.8775796787813e-05;-1.0649997420842e-05;0.00015376097871922;3.5789711546386e-05;0.00019055571465287;-0.00019320529827382;0.00054360512876883;4.6596200263593e-05;0.00046384791494347;-0.00017311405099463;-0.00044608899042942;-5.9887559473282e-05;0.0010294682579115;-9.9934637546539e-05;-0.00093924213433638;6.2567065469921e-05;-6.6013286414091e-05;0.00015256898768712;-0.00033997086575255;-0.00013407383812591;-1.7341089915135e-05;-0.00029614972299896;0.00026342578348704;-6.6373904701322e-05;0.00014171793009154;-0.00031060981564224;-1.2078149893568e-06;0.00020528023014776;4.5170228986535e-05;-0.00027349789161235;3.4230964956805e-05;0.00012545970093925;-2.3186559701571e-05;-5.5498763686046e-05;-5.1916311349487e-05;-0.0008125506574288;-3.6959798308089e-05;-0.00094813539180905;-8.2756421761587e-05;0.00021790208120365;2.9431112125167e-05;-0.00045687981764786;2.3127375243348e-05;-0.0001942213420989;-0.00013283747830428;0.00035069335717708;-7.5979049142916e-05;-0.00015129042731132;-0.00052601675270125;6.0630958614638e-05;0.00033690509735607;0.00027959697763436;0.000779107096605;1.6904428775888e-05;0.0004484155215323;1.2832220818382e-05;0.0010986895067617;0.00012731742754113;0.00048134769895114;2.7910044082091e-05;-0.00097586133051664;0.00010781952732941;1.8875271052821e-05;-4.2013602069346e-05;-0.00076836347579956;-6.3842926465441e-05;-0.00088085938477889;0.00022791305673309;-0.00010335296974517;0.0002191775420215;0.00030893416260369;-0.00018295043264516;-0.00039745905087329;4.4184649595991e-05;-0.002453628461808;4.9605940148467e-05;-7.3841343692038e-05;8.6477150034625e-05;0.00047297772835009;0.00010637313971529;-0.00030706316465512;-5.4671677389706e-06;-0.00034936229349114;0.00050987338181585;-0.00010458070028108;0.0022363089956343;1.09627007987e-05;0.00065044709481299;-0.00020852137822658;0.00079960160655901;-5.8802943385672e-05;0.00025743010337465;9.6684595973784e-07;6.9359339249786e-05;-1.2632667676371e-05;0.00014440789527725;4.8983954911819e-05;0.0001842379278969;-0.0002111312787747;0.00064004154410213;4.5574899559142e-05;0.0005392741295509;-0.00019380780577194;-0.00051851582247764;-6.9462992541958e-05;0.0011803733650595;-0.00011847401037812;-0.0011852936586365;6.9864501710981e-05;-7.3237366450485e-05;0.00019393939874135;-0.00036847204319201;-0.00013503083027899;-3.5238041164121e-05;-0.00036697601899505;0.00028425591881387;-1.3388452316576e-05;0.00015870119386818;-0.00030926291947253;3.9111723708629e-06;0.00022706075105816;5.4110598284751e-05;-0.0002736161404755;4.044349770993e-05;0.0001529822620796;-2.7712139853975e-05;-7.3851057095453e-05;-6.2528779380955e-05;-0.00092424894683063;-5.9856211009901e-05;-0.0010753463720903;-0.00010593853221508;0.00024736509658396;4.3350984924473e-05;-0.00055117771262303;2.5216482754331e-05;-0.00025993952294812;-0.00015906535554677;0.00039335471228696;-9.2020069132559e-05;-0.00017510935140308;-0.00060628959909081;5.8137789892498e-05;0.000380452896934;0.00032942145480774;0.00085886532906443;4.9392685468774e-05;0.00054727622773498;2.1611471311189e-05;0.0013333717361093;0.00015443914162461;0.00057686952641234;3.4011682146229e-05;-0.0011618479620665;0.00012881220027339;-3.9061883398972e-06;-2.2585547412746e-05;-0.00051683920901269;-4.8150373913813e-05;-0.00044066231930628;0.00013746635522693;5.569573113462e-05;0.00015486088523176;0.00022163947869558;-0.00013398670125753;-0.0002091169153573;2.2112250007922e-05;-0.0017218590946868;3.3983331377385e-05;-9.8181364592165e-05;6.6789732954931e-05;0.00033762957900763;0.0001028406622936;-0.00025597610510886;-5.6405231589451e-05;-0.00025036698207259;0.00025335617829114;-2.9192207875894e-05;0.0014710405375808;2.4021859644563e-05;0.00032861030194908;-0.000151350221131;0.00052277056965977;-3.8667938497383e-05;0.00024634235887788;-1.9134156445944e-06;5.6484434026061e-05;-1.0608880074869e-05;1.6929092453211e-05;3.0771530873608e-05;0.00012172308197478;-0.00013603515981231;0.00047335072304122;2.6581608835841e-05;0.00038282011519186;-0.00013668766769115;-0.00034448280348442;-4.6985700464575e-05;0.00080205232370645;-8.7039094069041e-05;-0.00092732545454055;5.2042021707166e-05;-1.9688699467224e-05;0.0001546565326862;-0.00023738203162793;-8.8528424385004e-05;-4.4908352720086e-05;-0.00029326626099646;0.00018531359091867;0.00010934553574771;0.00011124261072837;-0.00021275415201671;3.015165702891e-06;9.9866862001363e-05;4.0329188777832e-05;-0.00010792168905027;2.7089947252534e-05;0.00011969234765274;-2.4815939468681e-05;-0.00010432348790346;-3.5425302485237e-05;-0.00073711998993531;-2.4988852601382e-05;-0.00075727410148829;-6.8820118030999e-05;0.00019703873840626;1.4370568351296e-05;-0.00042203965131193;1.9890290786861e-05;-0.00036810446181335;-0.00010097875201609;0.00014644066686742;-4.971581074642e-05;-0.00010747701890068;-0.0003880170697812;4.8918827815214e-05;0.00028388138161972;0.00019717869872693;0.00055429525673389;3.0535364203388e-05;0.00052775541553274;7.4605181907828e-06;0.0011652725515887;8.9550077973399e-05;0.00042798230424523;2.1007492250646e-05;-0.00074487691745162;8.2706988905556e-05;2.742755896179e-05;-5.6103217502823e-06;1.9500999769662e-05;-5.6268104344781e-06;-0.00018604323850013;-3.8788650272181e-05;-9.1320885985624e-05;-6.4526859205216e-05;2.6571549824439e-05;8.7460975919385e-05;-1.5269357390935e-05;-9.520340427116e-06;4.8707144742366e-05;-0.00010473139991518;4.5840388338547e-06;-8.3383616583887e-05;-7.2277784056496e-05;-0.00015111405809876;-5.560597855947e-05;0.00016808055806905;4.5370463340078e-05;0.00021689028653782;5.7180648582289e-05;-3.4194123145426e-05;5.1136597903678e-05;6.1228856793605e-05;0.00010777051647892;1.6261941709672e-05;2.725851663854e-05;-0.00012773419439327;8.0316975072492e-05;-2.6521563540882e-06;-4.283899386337e-07;7.1168629801832e-05;4.5365792175289e-05;0.00010203407873632;4.8074485675897e-05;9.4777562480886e-05;-8.3491440818761e-06;-0.00016842701006681;4.3740212277044e-05;-6.3418381614611e-05;-1.051009803632e-05;1.6295362001983e-05;-2.5603310859879e-05;8.7077620264608e-05;-1.2489516848291e-05;-5.9509293350857e-05;0.00013950961874798;0.0001457756588934;-2.4654684239067e-05;-2.2705809897161e-05;-0.00021365874272306;-0.00014227033534553;-3.9419475797331e-05;-1.9525961761246e-05;-6.6878696088679e-05;2.1725507394876e-05;0.00014857812493574;2.4283846869366e-05;-0.00011699214519467;9.0866551545332e-06;-6.0435918385338e-06;1.2508242434706e-05;6.5472479036544e-05;-1.3685201338376e-05;0.00031322205904871;-1.2674823665293e-05;9.1956615506206e-05;-9.2047903308412e-06;-4.5502165448852e-05;2.9530208848882e-05;6.5777698182501e-05;4.9968634812103e-06;0.00032324591302313;2.9257793357829e-05;0.00020258265431039;3.671560307339e-06;-4.7425372031284e-05;-7.7583441452589e-05;-2.6915622584056e-05;-4.9492089601699e-05;8.5593215771951e-05;-6.7938635766041e-05;6.1005252064206e-05;-0.0002641589671839;-2.3736090952298e-05;-0.00031731007038616;-1.9523862647475e-05;-6.4727879362181e-05;-2.8598155950021e-06;-0.0002276128216181;-1.2425306522346e-05;2.7142255930812e-05;-5.9933872762485e-06;2.1771998945042e-05;-4.4844828153145e-06;-0.00018314403132536;-3.5277022107039e-05;-8.5321938968264e-05;-6.5640924731269e-05;1.8814442228177e-05;9.302581747761e-05;-1.3767598829872e-05;-8.7356793301296e-06;5.3926345572108e-05;-0.00010425643267808;4.136901225138e-06;-8.5584775661118e-05;-7.2547161835246e-05;-0.00014589347119909;-5.298054747982e-05;0.00016754442185629;4.1773313569138e-05;0.00021022377768531;5.4258063755697e-05;-4.0139755583368e-05;4.9584836233407e-05;5.6593893532408e-05;0.0001082611415768;1.3278096957947e-05;2.662531369424e-05;-0.00012450978101697;8.1316371506546e-05;-2.4059002043941e-06;-1.439672843162e-07;6.6437183704693e-05;4.5244800276123e-05;0.00010426210792502;5.1123442972312e-05;9.5803021395113e-05;-5.9836297623406e-06;-0.00017221027519554;4.0686471038498e-05;-5.8669633290265e-05;-1.1062675184803e-05;9.2704312919523e-06;-2.6593796064844e-05;8.7914479081519e-05;-1.003857505566e-05;-5.8767491282197e-05;0.00014207507774699;0.00014994783850852;-2.3235277694766e-05;-2.3857861378929e-05;-0.00021869111515116;-0.00014716968871653;-3.4597640478751e-05;-1.9148759747623e-05;-6.7442284489516e-05;1.937816341524e-05;0.00014177410048433;2.5583454771549e-05;-0.0001081777154468;8.6957288658596e-06;-5.3804260460311e-06;1.1936464943574e-05;6.4628075051587e-05;-1.1208070645807e-05;0.00031052785925567;-6.2588483160653e-06;9.5665061962791e-05;-5.8677856031863e-06;-4.5858792873332e-05;2.7102640160592e-05;6.3235747802537e-05;5.8912351050822e-06;0.00031489110551775;3.4370208595647e-05;0.00019455749134067;6.7266601035953e-06;-4.8267604142893e-05;-7.2532442572992e-05;-2.3906082788017e-05;-4.8073983634822e-05;8.179213909898e-05;-7.2220434958581e-05;5.5437718401663e-05;-0.00025932918651961;-2.8473408747232e-05;-0.00031142079387791;-2.535634303058e-05;-6.3381623476744e-05;-3.9732663026371e-06;-0.0002197580615757;-1.5495277693844e-05;1.7712714907248e-05;-4.1509456423228e-06;1.5087586689333e-05;-2.3098384644982e-06;-0.00012106588837923;-2.0641728042392e-05;-5.4655076382915e-05;-4.2638843297027e-05;1.0774831025628e-05;6.1940219893586e-05;-8.6642512542312e-06;-5.3564417612506e-06;3.6333967727842e-05;-6.783409480704e-05;1.5533149735347e-06;-5.6206401495729e-05;-4.7793717385503e-05;-9.3730399385095e-05;-3.3822951081675e-05;0.00011055098730139;2.5479508622084e-05;0.00013667275197804;3.3694537705742e-05;-2.78901643469e-05;3.1583105737809e-05;3.6730274587171e-05;7.0111724198796e-05;8.0560839705868e-06;1.716230144666e-05;-8.0158453783952e-05;5.3475268941838e-05;-1.5146775922403e-06;6.3536283789745e-08;4.1874824091792e-05;2.9855673346901e-05;6.8591805757023e-05;3.4398039133521e-05;6.2527687987313e-05;-3.3899445952557e-06;-0.00011377142072888;2.5620520318625e-05;-3.6722361983266e-05;-7.4889771894959e-06;3.5679818211065e-06;-1.779755075404e-05;5.6804874475347e-05;-5.74962268729e-06;-3.8891299482202e-05;9.3522401584778e-05;9.9724013125524e-05;-1.3806187780574e-05;-1.5665686078137e-05;-0.00014483768609352;-9.7944575827569e-05;-2.0657920686062e-05;-1.2522920769698e-05;-4.3597647163551e-05;1.2081252862117e-05;9.0181427367497e-05;1.7285572539549e-05;-6.7240558564663e-05;5.4994407037157e-06;-3.0942126159061e-06;7.5974762694386e-06;4.2218576709274e-05;-6.5057679421443e-06;0.00020309288811404;-2.158631787097e-06;6.4149404352065e-05;-2.8468002710724e-06;-3.0548002541764e-05;1.7196211047121e-05;3.9874994399725e-05;4.1940734263335e-06;0.00020342542848084;2.4391332772211e-05;0.00012500189768616;5.3526246119873e-06;-3.2341766200261e-05;-4.6728338929825e-05;-1.5115668247745e-05;-3.0829825846013e-05;5.2917748689651e-05;-4.8085927119246e-05;3.5104811104247e-05;-0.00016840334865265;-2.0420806322363e-05;-0.00020222348393872;-1.8595210349304e-05;-4.0542301576352e-05;-3.0520118343702e-06;-0.00014182372251526;-1.120164324675e-05;1.1112598258478e-05;-1.3695502275368e-05;3.7748561680928e-06;-3.5510388443072e-06;-1.3969334759167e-05;0.00014273379929364;6.7655862949323e-05;5.7458808441879e-05;-0.00014695373829454;8.1353296991438e-05;-5.7060328799707e-06;1.4198932149156e-05;7.1640803071205e-05;-3.1427382054972e-05;9.3784517957829e-05;-1.1381342119421e-05;2.1876117898501e-05;5.3358227887657e-05;-1.7723765267874e-05;2.2843676561024e-05;-0.00010650338663254;2.6207308110315e-06;-0.00011277785233688;-2.8525611924124e-05;3.6348974390421e-06;-9.3753624241799e-05;-4.2893087083939e-05;-9.3718745119986e-06;-1.1608167369559e-05;-6.5573905885685e-05;6.7368513555266e-05;-7.5772965146825e-07;4.4568378143595e-06;1.6482941646245e-05;1.2264363249415e-05;4.5762870286126e-05;9.8323245765641e-05;7.4132030931651e-06;0.00012777399388142;3.3746458939277e-05;-0.0002264780778205;-2.3818728323022e-07;-3.1940526241669e-05;-5.2570503612515e-05;-4.8518701078137e-05;-7.4232530096197e-06;0.00010232471686322;-2.6924250050797e-05;0.00010445062071085;0.00011446826101746;-1.0959151040879e-05;-2.4212222342612e-05;-0.00012303791299928;-0.00017726524674799;2.6305324354325e-06;2.8436248612707e-05;1.6956018953351e-05;-9.2277521616779e-05;2.1151270630071e-05;5.6138404033845e-05;2.7602392947301e-05;2.220905116701e-06;3.5515972740541e-06;1.4100975249676e-06;1.541346864542e-05;4.4814507418778e-05;9.2765621957369e-05;0.00017776172899175;3.1256407964975e-05;0.00013931484136265;-1.5317731367759e-06;-7.2833434387576e-05;1.3985585610499e-05;1.0261876923323e-05;6.1104103224352e-05;0.00016482664796058;2.3758588213241e-05;9.9592201877385e-05;-3.7586494727293e-05;3.6367524444358e-05;6.2521008658223e-05;1.1767468095059e-05;-3.7254001654219e-05;-7.9279161582235e-05;-0.00012260445510037;-7.6999749580864e-05;-0.00013336785195861;-6.6915294155478e-05;-0.00019578431965783;-8.7656335381325e-06;-1.0878662578762e-05;-2.8517881219159e-05;-0.00011815456673503;1.1335395356582e-05;-1.5350195099018e-05;6.0001470956195e-06;-5.191467153054e-06;-1.1412073035899e-05;0.00016634678468108;7.1414404374082e-05;7.0456051616929e-05;-0.00014452803588938;6.6790023993235e-05;-4.0643453758094e-06;1.5632169379387e-05;8.360184438061e-05;-3.5880308132619e-05;9.6166593721136e-05;-2.7852206585521e-06;2.6989486286766e-05;6.6336251620669e-05;-1.3604984815174e-05;1.8906839613919e-05;-0.00012146969675086;1.4949221167626e-06;-0.00013891742855776;-3.6382611142471e-05;5.0305116019445e-06;-0.0001014334266074;-5.4472318879561e-05;-1.3359891454456e-05;-1.2673592209467e-05;-7.1700858825352e-05;7.6725002145395e-05;-1.0583150924504e-06;4.6480772653013e-06;2.3130474801292e-05;1.8422379071126e-05;5.0064270908479e-05;0.00010753095557448;1.553309175506e-06;0.00013726764882449;4.4106607674621e-05;-0.00024411239428446;8.0387309253638e-07;-3.6733432352776e-05;-5.3649444453185e-05;-4.6836168621667e-05;-1.3191628568165e-05;0.00010635846410878;-3.4721495467238e-05;0.00011920286488021;0.00013388501247391;-1.278896797885e-05;-2.3757685994497e-05;-0.00013829523231834;-0.0002033928030869;-4.1249786590924e-06;2.5107670808211e-05;2.4555667550885e-05;-9.604587830836e-05;2.2703603463015e-05;6.6329121182207e-05;2.8057918825652e-05;-5.0195135372633e-06;4.8181609599851e-06;1.0764264288809e-06;1.3071988178126e-05;5.0467937398935e-05;8.7487976998091e-05;0.00019901468476746;3.09444112645e-05;0.00014796342293266;3.5673328966368e-06;-7.5150914199185e-05;1.4610099242418e-05;1.339257141808e-05;6.4203144575004e-05;0.0001905556418933;2.2685189833282e-05;0.00011629860819085;-4.295770850149e-05;2.1176325390115e-05;4.7040899517015e-05;2.40632234636e-05;-3.9103248127503e-05;-6.6320950281806e-05;-0.00011661891039694;-7.7890763350297e-05;-0.00015269283903763;-6.8056237068959e-05;-0.00022088814876042;-1.0160572855966e-05;-1.4298802852863e-05;-2.9040291337878e-05;-0.00013925865641795;7.1717995524523e-06;-9.9385179055389e-06;4.025062025903e-06;-3.3982648801612e-06;-7.8950643001008e-06;0.00010977925558109;4.4427892134991e-05;4.724841346615e-05;-8.8457265519537e-05;3.7696987419622e-05;-2.2435599476012e-06;1.0026441486843e-05;5.4172440286493e-05;-2.2362824893207e-05;5.9601359680528e-05;5.6364251577179e-07;1.7811162251746e-05;4.3574760638876e-05;-7.8420562203974e-06;1.1680289389915e-05;-7.9254656156991e-05;1.7685705415715e-06;-9.2657086497638e-05;-2.3938106096466e-05;2.8393189950293e-06;-6.3617553678341e-05;-3.6962373997085e-05;-9.1408483058331e-06;-8.1630751083139e-06;-4.5614404371008e-05;4.9098256567959e-05;-6.2637491282658e-07;2.8720323825837e-06;1.5894696844043e-05;1.2701979358098e-05;3.1909170502331e-05;6.8067856773268e-05;-1.3801498255361e-07;8.5315732576419e-05;2.8936394301127e-05;-0.00015397989773192;6.7685266458284e-07;-2.3583756046719e-05;-3.3481599530205e-05;-2.8863718398497e-05;-9.067141036212e-06;6.6062922996935e-05;-2.378871977271e-05;7.6084419561084e-05;8.7055341282394e-05;-7.7710246841889e-06;-1.3709623999603e-05;-8.891687321011e-05;-0.00013037177268416;-4.038643965032e-06;1.5018070371298e-05;1.6615076674498e-05;-5.9355010307627e-05;1.4439193364524e-05;4.3118467146996e-05;1.7384640159435e-05;-4.460678610485e-06;3.297077228126e-06;6.7567231099019e-07;7.4632198447944e-06;3.2309675589204e-05;5.3149073210079e-05;0.00012801760749426;1.9269353288109e-05;9.3560898676515e-05;3.5159375784133e-06;-4.7501551307505e-05;9.2488453447004e-06;8.8975048129214e-06;4.0648177673575e-05;0.00012325821444392;1.3659428077517e-05;7.5493830081541e-05;-2.8018284865539e-05;8.6701920736232e-06;2.5481735065114e-05;1.8277747585671e-05;-2.4344109988306e-05;-3.8197402318474e-05;-6.9646237534471e-05;-4.871384226135e-05;-9.8682823590934e-05;-4.2543764720904e-05;-0.00014216330600902;-6.7228288571641e-06;-9.6590965767973e-06;-1.8045526303467e-05;-9.0655412350316e-05;2.6453437385499e-05;-1.7022608517436e-05;4.0444701880915e-05;0.00030208949465305;-0.00010231586202281;0.00023542267445009;-8.1847574620042e-05;-7.0694959504181e-06;6.8703157012351e-05;-0.00012386716844048;-2.6600388082443e-05;0.00012281093222555;-9.4871384135331e-06;0.00083785789320245;-3.5231318179285e-05;1.7348573237541e-05;-0.00020760565530509;-1.1319565601298e-05;0.00014111866767053;0.00014520411787089;2.9037141757726e-06;2.9628470656462e-05;-0.00021056468540337;-1.4589671991416e-05;-0.0007465771632269;8.7070358858909e-05;-0.00010725532774813;2.2846765205031e-05;-0.00027518955175765;-4.98872168464e-06;-9.8371063359082e-05;-3.1365611903311e-06;2.1713547539548e-05;1.882821743493e-05;7.8858814958949e-05;-7.5378651672509e-05;9.2067923105787e-05;1.2441860235413e-05;0.00016195962962229;-8.1026570114773e-05;0.00022884056670591;-2.1166057194932e-05;-0.00017096498049796;-5.7371406001039e-05;0.0004328080394771;2.6569918190944e-05;-0.00049366417806596;-5.340865754988e-05;5.5951615649974e-05;-7.8370896517299e-05;2.1832604033989e-05;-5.3339867008617e-05;5.2918661822332e-05;-0.00011134173109895;5.6363369367318e-05;-4.2213094275212e-05;1.5094044101716e-05;-6.770158506697e-05;2.2395468477043e-05;7.7702337875962e-05;1.7291673430009e-05;-8.4554078057408e-05;6.0763767351091e-07;3.6739962524734e-05;-5.2212097216398e-05;-4.2746723920573e-05;-6.6246087953914e-05;-0.00024524066247977;-1.4659423868579e-05;-0.00032803390058689;4.7695230023237e-06;0.00011737315071514;-4.9778063839767e-06;-0.00012200153287267;-6.7469678469934e-05;-0.00011363405792508;-2.8660126190516e-05;6.2100800278131e-05;-3.5883516829927e-05;-0.00024783911067061;-6.1785824073013e-05;0.00014424603432417;0.00010244857548969;8.4487786807586e-05;0.00029000925133005;4.8854079068406e-05;0.00013190912432037;4.6189034037525e-05;0.00051604799227789;1.8260330762132e-05;0.00017583699082024;4.7039782657521e-05;-0.00039552952512167;4.2221341573168e-05;-2.7090984076494e-05;6.2723163864575e-05;0.00047398387687281;-0.00016241021512542;0.0003697324427776;-0.00012884110037703;3.1642039175495e-06;0.00010616751387715;-0.00018325714336243;-4.4294607505435e-05;0.00020602392032743;-2.0760468032677e-05;0.0013159716036171;-5.5498436267953e-05;5.3374087656266e-06;-0.00032991875195876;-2.6642921511666e-05;0.00020963033603039;0.00022804908803664;1.6818792573758e-05;5.3330866649048e-05;-0.00032168193138205;-1.6954831153271e-05;-0.0011838428908959;0.00013825173664372;-0.00017917310469784;3.8670299545629e-05;-0.00044357153819874;-5.3308422138798e-06;-0.00014080689288676;-4.9650725486572e-06;3.4537813917268e-05;2.7117841455038e-05;0.00013373672845773;-0.00012724775297102;0.00014108263712842;2.431070242892e-05;0.00026551395421848;-0.0001332891988568;0.00036885825102217;-3.56771342922e-05;-0.00027177651645616;-8.8558073912282e-05;0.00069066602736712;4.4920652726432e-05;-0.00076412968337536;-8.3837519923691e-05;8.4969527961221e-05;-0.00014531835040543;3.5253986425232e-05;-8.7413893197663e-05;0.00010044175724033;-0.0001680210698396;9.491487435298e-05;-8.1451798905618e-05;1.9120065189782e-05;-0.00011500723485369;3.5108088923153e-05;0.00012209835404065;2.5844165065791e-05;-0.00014180208381731;-5.8819153991863e-08;5.6777040299494e-05;-8.0157537013292e-05;-5.7328488765052e-05;-9.8411350336391e-05;-0.00039468254544772;-2.4129229132086e-05;-0.0005437369691208;4.768097824126e-06;0.00018745355191641;-6.5518552219146e-06;-0.00019916225573979;-0.0001080665315385;-0.00017014390323311;-4.5100594434189e-05;0.00011999902926618;-5.7393630413571e-05;-0.00038305323687382;-8.0866819189396e-05;0.00022362430172507;0.00015763324336149;0.00011668192746583;0.00047038742923178;7.4664552812465e-05;0.0002051482006209;7.5450676376931e-05;0.00079618924064562;2.8968732294743e-05;0.00028594111790881;7.4349365604576e-05;-0.00062919280026108;6.8348090280779e-05;-4.9759855755838e-05;8.2652091805357e-05;0.00070319831138477;-0.00026586896274239;0.00072495971107855;-0.00019819753651973;0.00017439508519601;0.00017101314733736;-0.00030171871185303;-7.2590555646457e-05;0.00038657715776935;-3.6705096135847e-05;0.0019901939667761;-8.6376930994447e-05;-2.9812721550115e-05;-0.00047862026258372;-2.2141512090457e-05;0.00027190244873054;0.0003403666196391;-1.6001245967345e-05;0.0001217103927047;-0.0005834634648636;-6.35921378489e-06;-0.0018464227905497;0.00021120687597431;-0.00044837134191766;6.1070510128047e-05;-0.00073863344732672;-7.1115105129138e-06;-0.00011943921708735;-5.3524372560787e-06;4.9161877541337e-05;5.6342560128542e-05;0.00026922472170554;-0.00022566222469322;0.00016091990983114;4.3508480302989e-05;0.00047478481428698;-0.00020124213187955;0.00055189034901559;-6.8744397140108e-05;-0.00043233652831987;-0.00013061676872894;0.001077763736248;6.8744229793083e-05;-0.0011168404016644;-0.00016571846208535;0.00013510264398064;-0.00028818877763115;4.8498954129172e-05;-0.00010426966036903;0.00020974379731342;-0.00026549241738394;0.00015992554835975;-0.00019941657956224;2.472924097674e-05;-0.00017264028429054;5.6091615988407e-05;0.00021386025764514;3.7364658055594e-05;-0.00026113630156033;-8.6521089315283e-07;8.3561477367766e-05;-0.00012339526438154;-9.6440262495889e-06;-0.00014458638906945;-0.00053822668269277;-4.7156707296381e-05;-0.00092064309865236;1.9375393094379e-05;0.00026146529125981;-3.2567877497058e-06;-0.00034344894811511;-0.00017737067537382;-9.9197277450003e-05;-8.4214625530876e-05;0.00039962664595805;-0.00011567038745852;-0.00060343107907102;-7.1001995820552e-05;0.00037850739317946;0.00020416833285708;0.00012628205877263;0.00079780106898397;0.00010414545977255;0.00022531329886988;0.00014110960182734;0.00098508119117469;4.5687338570133e-05;0.00048037731903605;0.00012242888624314;-0.0010928217088804;6.2618659285363e-05;-4.4728090870194e-05;6.5359752625227e-05;0.00062134774634615;-0.0002545625611674;0.00064657058101147;-0.00015892769442871;0.00019736764079425;0.00011665927740978;-0.00019060079648625;-7.5213742093183e-05;0.00034952370333485;-4.5858530938858e-05;0.0017585491295904;-6.1121725593694e-05;-0.00010295941319782;-0.00042358334758319;-4.4323111069389e-05;0.00017238053260371;0.00030379855888896;-3.7700892789871e-06;0.00014938623644412;-0.00048558440175839;2.2894582798472e-05;-0.0016379895387217;0.00017463313997723;-0.00042185993515886;6.114128336776e-05;-0.00065141054801643;-3.8405100895034e-06;-9.5896859420463e-05;-5.2472314564511e-06;4.4142641854705e-05;3.7815549148945e-05;0.00023600950953551;-0.00021134378039278;0.00017313584976364;4.5635493734153e-05;0.0004306614282541;-0.00017826157272793;0.00046686118002981;-6.1584316426888e-05;-0.00038123276317492;-0.00011249863018747;0.00093608489260077;6.2633487686981e-05;-0.0008590763900429;-0.00012893785606138;0.0001181270199595;-0.00028153668972664;4.3912907131016e-05;-0.00011753980652429;0.00020848785061389;-0.00022890836407896;0.00015182830975391;-0.00017522940470371;1.5188390534604e-05;-0.00023251850507222;4.8099442210514e-05;0.00019513972802088;3.1572893931298e-05;-0.0002714212751016;-3.6115402508585e-06;7.2090544563252e-05;-0.00010118928184966;-1.4978175386204e-05;-9.0387635282241e-05;-0.00050017511239275;-3.340759940329e-05;-0.00086366076720878;-6.6248162511329e-07;0.00024464845773764;3.7496674849535e-06;-0.00029322283808142;-0.00014500952966046;-9.7500553238206e-05;-6.2588427681476e-05;0.00034535070881248;-9.5405564934481e-05;-0.00051646458450705;-2.167188176827e-05;0.00031288748141378;0.00018617932801135;5.9748672356363e-05;0.00073541433084756;7.2353286668658e-05;0.00021469735656865;0.00011017295037163;0.00084788101958111;3.69090193999e-05;0.00040278641972691;9.9283184681553e-05;-0.0009042164310813;1.3225770771896e-06;-3.7302979762899e-05;-0.00077705952571705;-3.8331720134011e-05;-0.00094443879788741;0.00031133656739257;-0.00029993601492606;0.00014558504335582;4.6260138333309e-05;-5.4504067520611e-05;-0.00027732059243135;6.5303836890962e-05;-0.0025154831819236;7.8346827649511e-05;0.0001511485024821;3.4360891731922e-05;0.00043542616185732;0.00011946391168749;-3.0003806386958e-05;6.6785432863981e-05;-0.00033920735586435;0.00047093673492782;-0.0002815549087245;0.0021621105261147;-7.1353890234604e-05;0.00080065079964697;-0.00015805731527507;0.00069591257488355;-6.7290515289642e-05;0.00031557169859298;-8.6776226453367e-06;7.5878633651882e-05;-2.3499087546952e-05;-3.945890966861e-06;-1.7965236111195e-05;0.00022492955031339;-0.000178777743713;0.00053608085727319;4.8719244659878e-05;0.00030334363691509;-9.3160750111565e-05;-0.00062687514582649;-2.8839212973253e-05;0.00086396053666249;-9.83016579994e-05;-0.00040651462040842;1.3336651136342e-05;8.2864520663861e-05;0.00016763313033152;-0.00035152735654265;-0.00028877114527859;-2.318644146726e-05;-0.00018786621512845;0.00022048682149034;0.00039932251092978;0.00013726325414609;-0.00072073156479746;2.1721787561546e-05;0.00041466893162578;2.3382459403365e-05;-0.00053742004092783;5.3789513913216e-05;0.00014596909750253;-2.7703312298399e-05;-0.00024539706646465;-8.727270324016e-05;-0.00067840120755136;-2.5690702386783e-05;-0.00090899196220562;-8.7883621745277e-05;0.00024206910165958;-1.0772556606753e-06;-0.00033228445681743;2.7927437258768e-05;-0.00024299403594341;-0.00014360189379659;0.00023248132492881;-5.1641698519234e-05;-4.5699653128395e-05;-0.00048503265134059;9.8332042398397e-05;0.00028702040435746;0.00024262959777843;0.00066432252060622;1.7366986867273e-05;0.00059025909285992;3.0531784432242e-05;0.0010344065958634;0.00011537862155819;0.00025588372955099;3.4603755921125e-05;-0.00075479230144992;9.9282478913665e-05;-6.3158204284264e-06;-3.8672802475048e-05;-0.00085811730241403;-4.6343171561603e-05;-0.00098557176534086;0.00033086628536694;-0.00029076563077979;0.00016629416495562;7.9989949881565e-05;-6.9753587013111e-05;-0.00028369628125802;6.647775444435e-05;-0.0028833395335823;7.6940639701206e-05;0.00015937157149892;3.9304286474362e-05;0.00048316683387384;0.000119497126434;-7.8165263403207e-05;6.3475934439339e-05;-0.00037336591049097;0.00052048382349312;-0.00027968449285254;0.0023983023129404;-6.3433799368795e-05;0.00084374065045267;-0.00017587192996871;0.00079809647286311;-7.1557326009497e-05;0.00036210264079273;-3.4558315746835e-06;8.5713756561745e-05;-2.5803317839745e-05;-3.4400585718686e-05;-1.4241402823245e-05;0.000242803391302;-0.00019845632778015;0.00063528458122164;5.118858825881e-05;0.00035791934351437;-0.00010865966032725;-0.0007204344146885;-3.5980501706945e-05;0.0009945360943675;-0.00011728108074749;-0.0005413563339971;1.753353899403e-05;9.9530661827885e-05;0.00021434837253764;-0.00038696257979609;-0.00032173996441998;-4.1773095290409e-05;-0.00024900800781325;0.00024050619686022;0.00051820324733853;0.00015769562742207;-0.00081359606701881;2.6925454221782e-05;0.00047073501627892;3.0114451874397e-05;-0.00059532688464969;6.1981911130715e-05;0.00017614361422602;-3.2494983315701e-05;-0.00029256864218041;-0.00010692867363105;-0.00074147165287286;-4.3775453377748e-05;-0.0010491439606994;-0.00011197486310266;0.00027720985235646;6.0152524383739e-06;-0.0004043867229484;3.2659099815646e-05;-0.00031507454696111;-0.00017072429182008;0.00026721405447461;-6.3157305703498e-05;-5.0870377890533e-05;-0.00056307052727789;0.000114159352961;0.00030921914731152;0.00029406556859612;0.0007303521852009;4.0610448195366e-05;0.00070892064832151;3.971642581746e-05;0.0012405813904479;0.00014064664719626;0.00030879132100381;4.096935299458e-05;-0.00089988799300045;0.00011825558613054;-1.5904000974842e-05;-2.2165926566231e-05;-0.00056431471602991;-3.4513363061706e-05;-0.00055063591571525;0.00020545246661641;-0.00011035751958843;0.00011771742720157;7.0871916250326e-05;-5.3413932619151e-05;-0.00015812672791071;3.8181162381079e-05;-0.0020166034810245;4.6599732741015e-05;9.2621310614049e-05;2.8671951440629e-05;0.00032892628223635;8.6166590335779e-05;-0.00010344486508984;1.0406941328256e-05;-0.00025341348373331;0.00030920110293664;-0.0001496531185694;0.0015870025381446;-2.6960320610669e-05;0.00047804435598664;-0.0001221330894623;0.00055345718283206;-4.6400295104831e-05;0.00027384574059397;8.7410865035054e-07;6.3733532442711e-05;-1.7914509953698e-05;-7.5744777859654e-05;-5.4563711273659e-06;0.00017082245904021;-0.00013461025082506;0.00048249179963022;3.0556002457161e-05;0.0002651825780049;-8.2563012256287e-05;-0.00049163645599037;-2.8467251468101e-05;0.00070352770853788;-8.8221779151354e-05;-0.00048266054363921;1.8251741494169e-05;8.1120801041834e-05;0.00017620845756028;-0.00025561280199327;-0.00021573893900495;-4.7939240175765e-05;-0.00022843711485621;0.00016250356566161;0.00043903410551138;0.00011350689601386;-0.0005687769735232;1.9368944776943e-05;0.00028761179419234;2.6081235773745e-05;-0.00035838456824422;4.2162973841187e-05;0.00013504449452739;-2.6300451281713e-05;-0.00022520510538016;-7.4591145676095e-05;-0.00053380191093311;-2.8303968065302e-05;-0.00075891910819337;-8.1937396316789e-05;0.00020590417261701;9.1036156391056e-07;-0.0003284041013103;2.6115880245925e-05;-0.00033516102121212;-0.00011672986875055;0.00013958630734123;-4.0314407669939e-05;-3.2309253583662e-05;-0.0003845549072139;9.2011498054489e-05;0.00020629554637708;0.00020575606322382;0.00047986448043957;3.0640825571027e-05;0.00058218283811584;2.3160113414633e-05;0.0010130702285096;9.4851435278542e-05;0.00025331147480756;2.6846921173274e-05;-0.00063102965941653;8.200961019611e-05;3.1717670935905e-05;-2.2458250896307e-05;2.7699335987563e-05;0.00033804753911681;-0.00015446898760274;0.00039194256532937;-7.4914110882673e-05;0.00015449129568879;5.750714262831e-05;-0.00010353632387705;-3.9196740544867e-05;0.00013690511696041;-1.8343151168665e-05;0.00097541132709011;-2.9643611924257e-05;-2.6846106266021e-05;-0.00020395965839271;5.4563629419135e-06;6.1023249145364e-05;0.00015896787226666;-5.9860703913728e-05;0.0001021093557938;-0.00029516674112529;2.0749486793648e-05;-0.00084789312677458;8.6042768089101e-05;-0.0002931697817985;2.7359628802515e-05;-0.00030600657919422;-4.0337922655453e-06;-9.5933093689382e-05;-3.8453999877675e-06;1.8529508452048e-05;1.5867097317823e-05;8.0774174421094e-05;-7.9725905379746e-05;5.8730620366987e-05;1.5823299690965e-05;0.00016343921015505;-6.4402142015751e-05;0.00019167670689058;-1.9645962311188e-05;-0.00021552001999225;-5.6316235713894e-05;0.00039938624831848;1.6144473192981e-05;-0.00033636359148659;-4.2901054257527e-05;5.3775176638737e-05;-0.0001011645217659;1.8039259884972e-05;-6.1394326621667e-05;6.008692071191e-05;-7.4377610872034e-05;5.9124937251909e-05;1.513547704235e-05;1.7898533769767e-05;-0.00013642977864947;1.8179143808084e-05;0.0001598612871021;2.2528583940584e-05;-0.0001929141144501;6.2817770185575e-07;4.2441650293767e-05;-6.516447319882e-05;-5.5819928093115e-05;-6.8872359406669e-05;-0.00018623299547471;-2.3230018996401e-05;-0.00036066200118512;7.1515214585816e-06;0.00011176209955011;-2.2838289623905e-06;-9.9849181424361e-05;-8.0356650869362e-05;-1.3732312254433e-05;-3.3034910302376e-05;0.00014628814824391;-3.1470161047764e-05;-0.00027557363500819;-4.0012480894802e-05;0.00016633735504001;9.4216324214358e-05;7.4600618972909e-05;0.00032076830393635;5.3029685659567e-05;0.00010735019895947;5.951373532298e-05;0.00037387129850686;2.3040718588163e-05;0.00012339623935986;5.1615410484374e-05;-0.00041971652535722;5.7294593716506e-05;-4.0715272916714e-05;3.6960202123737e-05;0.00059940450591967;-0.00030142863397487;0.00075921241659671;-0.00011854346666951;0.00038066031993367;8.2454003859311e-05;-0.00014016703062225;-7.7829688962083e-05;0.00023806795070414;-4.2898274841718e-05;0.0017528510652483;-4.4133535993751e-05;-9.7235541034024e-05;-0.00034545254311524;1.327811878582e-05;2.9532415283029e-05;0.00027814629720524;-0.00013561293599196;0.00023219556896947;-0.00054129509953782;6.7505148763303e-05;-0.0015064305625856;0.0001437128521502;-0.00062773679383099;5.1860210078303e-05;-0.00053610693430528;-3.805293545156e-06;-0.00016374400001951;-7.8880912042223e-06;2.9562061172328e-05;1.8025293684332e-05;0.00013208705058787;-0.00013873350690119;7.8417091572192e-05;3.190520874341e-05;0.00027040365966968;-9.6927702543326e-05;0.00029530300525948;-3.0153853003867e-05;-0.00040107360109687;-9.2710826720577e-05;0.00064155674772337;1.9357472410775e-05;-0.00041732663521543;-5.3253737860359e-05;8.4701583546121e-05;-0.00019553952733986;2.8875676434836e-05;-0.0001215580268763;0.00011057117808377;-8.3144237578381e-05;0.00010369954543421;7.9586840001866e-05;3.0089298888925e-05;-0.00030046116444282;2.5634206394898e-05;0.00033655372681096;4.2013329220936e-05;-0.00041957205394283;5.3085773288331e-07;7.5210133218206e-05;-0.00011932304914808;-0.00011052395711886;-0.00011489294411149;-0.0002731510612648;-4.6052526158746e-05;-0.00063577207038179;9.5979839898064e-06;0.00018827915482689;-1.9352919480298e-06;-0.00014411643496715;-0.00014600163558498;4.4242053263588e-05;-5.638141738018e-05;0.00029727315995842;-4.2710631532827e-05;-0.0004730757791549;-4.2949472117471e-05;0.00028741743881255;0.00015030955546536;0.00011248514783802;0.00055561028420925;9.3682952865493e-05;0.00016898183093872;0.00010969880531775;0.0005263892817311;4.3014086259063e-05;0.00015841536514927;8.9188521087635e-05;-0.00070344033883885;7.5356889283285e-05;-4.0598162740935e-05;5.9076752222609e-05;0.0008297951426357;-0.00041009465348907;0.00092446856433526;-0.00016130520089064;0.00044946468551643;8.671055547893e-05;-0.00012464365863707;-0.00011190424993401;0.0003319927782286;-7.6072072261013e-05;0.0024769355077296;-5.0509417633293e-05;-0.00021854181250092;-0.00051194569095969;-2.5183628167724e-05;4.1473300370853e-05;0.00039242021739483;-0.00010484676022315;0.00031486604711972;-0.00066336541203782;9.8095355497207e-05;-0.00210219505243;0.00019884991343133;-0.00075642898445949;8.3038779848721e-05;-0.0007792470860295;-2.2003500816936e-06;-0.00022346242622007;-2.1291005396051e-05;6.5473352151457e-05;1.2241297554283e-05;0.00015147494559642;-0.0002157118433388;0.00017455512715969;4.8782563681016e-05;0.00045724501251243;-0.00014340366760734;0.00041925182449631;-3.7861103919568e-05;-0.00060458236839622;-0.00013531230797525;0.00094290910055861;3.0914179660613e-05;-0.0005806318949908;-4.2931729694828e-05;0.0001461841748096;-0.00030962089658715;3.3560780138941e-05;-0.00021928394562565;0.00018714996986091;-0.00016605973360129;0.00016061917995103;0.00017469355952926;4.1034174500965e-05;-0.00053798448061571;3.6036992241861e-05;0.00044567967415787;5.9195434005233e-05;-0.00057232636027038;-8.5452693383559e-06;0.00010922373621725;-0.00015974020061549;-0.0001687137701083;-0.00011465953866718;-0.00043375283712521;-5.5485572374891e-05;-0.00099227949976921;-1.3006747394684e-05;0.00029976101359352;9.6045077953022e-06;-0.00024405674776062;-0.00019157321366947;-9.5361741841771e-05;-6.2884282669984e-05;0.00036140833981335;-3.2627984182909e-05;-0.0006062826141715;1.2950467862538e-06;0.00036351100425236;0.0001815959403757;9.221573418472e-05;0.00077406677883118;0.00010880338959396;0.00032558426028118;0.00013470202975441;0.00090693234233186;5.2696304919664e-05;0.00028417870635167;0.00011680512398016;-0.00094341422664002;6.7322478571441e-05;-3.4571450669318e-05;4.5959975977894e-05;0.00073628651443869;-0.0003764669818338;0.00081709964433685;-0.00013524745008908;0.0004046781687066;5.9258400142426e-05;-6.5425141656306e-05;-0.00010530011059018;0.00029427197296172;-8.1206271715928e-05;0.0021784740965813;-3.948712037527e-05;-0.00021714738977607;-0.00045721288188361;-4.8806698032422e-05;-2.2373833417078e-06;0.00035622139694169;-8.215794514399e-05;0.00030215372680686;-0.00054985639872029;0.00010605371790007;-0.0018603875068948;0.00017461336392444;-0.00068323168670759;7.9272460425273e-05;-0.00067772908369079;3.2912516871875e-06;-0.00020848553685937;-2.0501531253103e-05;6.1213031585794e-05;6.5909779323192e-07;0.00012183475337224;-0.00019493681611493;0.00017128181934822;4.6396173274843e-05;0.00041048612911254;-0.00012321377289481;0.00035179653787054;-3.1436717108591e-05;-0.00052735855570063;-0.00011574555537663;0.00081213004887104;2.6752706617117e-05;-0.00044376813457347;-2.0939674868714e-05;0.00012465685722418;-0.00028835673583671;2.9812152206432e-05;-0.00020810704154428;0.00017860671505332;-0.0001401365007041;0.00014586660836358;0.00016109584248625;3.2311007089447e-05;-0.00051556708058342;2.9698849175475e-05;0.00038049457361922;5.0863302021753e-05;-0.00050588807789609;-1.0877496606554e-05;9.5168208645191e-05;-0.00013005665095989;-0.00015606053057127;-7.2241135057993e-05;-0.00042198851588182;-4.0968494431581e-05;-0.00088968774070963;-2.5047374947462e-05;0.00027292448794469;1.2520885320555e-05;-0.000212814527913;-0.00015756374341436;-0.00011518910469022;-4.512608575169e-05;0.00028714080690406;-2.1565498173004e-05;-0.00050618033856153;2.4288276108564e-05;0.00029078891384415;0.00016947636322584;4.6428991481662e-05;0.0006876359693706;8.1282865721732e-05;0.00031164535903372;0.00010454376752023;0.00081212067743763;4.315212572692e-05;0.00024384402786382;9.4929018814582e-05;-0.00077252351911739;-2.0419616703293e-05;-2.6618568881531e-05;-0.00072516256477684;-1.1750214071071e-05;-0.00093250343343243;0.00034201078233309;-0.00039528417983092;9.9933997262269e-05;-4.837563392357e-05;-9.9210255939397e-06;-0.00012005634198431;6.320203829091e-05;-0.0024524331092834;8.7076587078627e-05;0.00015826243907213;2.1218032998149e-05;0.00036360308877192;0.00010867363016587;0.00012188300752314;0.00014813066809438;-0.00031943919020705;0.00040883079054765;-0.00035230949288234;0.0019284154986963;-0.00010769032815006;0.00092650600709021;-0.00013256481906865;0.00055332545889542;-6.1332022596616e-05;0.00040301427361555;-1.8225880921818e-05;6.7439133999869e-05;-2.5780769647099e-05;-0.00017672241665423;-5.0142039981438e-05;7.4349489295855e-05;-0.0001149371964857;0.00042042261338793;4.8028512537712e-05;0.00013886316446587;-1.8777853256324e-05;-0.00062996079213917;-2.3045781745168e-06;0.00051578460261226;-7.3254937888123e-05;4.1219436752726e-06;-2.2439604435931e-05;0.00019239085668232;0.00013763783499599;-0.00030221824999899;-0.00028916620067321;-4.9412665248383e-05;-2.4678742192918e-05;0.00013706389290746;0.00077082373900339;0.00010445576481288;-0.0008023843402043;2.4026317987591e-05;0.00049344153376296;1.6160850009328e-06;-0.0006042875465937;5.6002460041782e-05;0.00015017867553979;-2.9876102416893e-05;-0.00038447714177892;-0.0001003196957754;-0.00049978395691141;-2.0581877834047e-05;-0.00070584000786766;-8.2814134657383e-05;0.0002083016152028;-1.3819209016219e-05;-0.00019978324417025;2.7118461730424e-05;-0.00024144498456735;-0.00013389444211498;0.00011785581591539;-3.067268335144e-05;4.6651057346025e-05;-0.00038156053051353;9.5590665296186e-05;0.0002221825561719;0.0001719792780932;0.00047055666800588;3.1851708627073e-05;0.00066863588290289;4.2973344534403e-05;0.00080008764052764;9.4310955319088e-05;3.0419361792156e-05;3.6117558920523e-05;-0.00047028070548549;8.0337449617218e-05;-2.4877665055101e-05;-2.5894056307152e-05;-0.00072887551505119;-1.6196740034502e-05;-0.00087969249580055;0.00033112394157797;-0.00036749959690496;0.00010252004722133;-3.5171502531739e-05;-1.1171098776686e-05;-0.00010969871800626;6.0226568166399e-05;-0.0025732840877026;7.7449280070141e-05;0.00018144908244722;1.7754462533048e-05;0.0003674972394947;9.5657720521558e-05;8.6499894678127e-05;0.00013485971430782;-0.00031562166986987;0.00041446625255048;-0.00032871641451493;0.0019586372654885;-9.5684561529197e-05;0.00088525522733107;-0.00012955807324033;0.00059469061670825;-5.9609370509861e-05;0.00040423753671348;-1.077342312783e-05;6.6385859099682e-05;-2.440216303512e-05;-0.00018712556629907;-4.6758224925725e-05;0.00010302026203135;-0.0001261427096324;0.00047233593068086;4.6251512685558e-05;0.00016623047122266;-2.7749809305533e-05;-0.00065922690555453;-8.3681579781114e-06;0.00058645365061238;-8.4539438830689e-05;-6.319502426777e-05;-1.8965381968883e-05;0.00019747202168219;0.00016794374096207;-0.00031107960967347;-0.00030999100999907;-5.8759662351804e-05;-7.3640352638904e-05;0.0001452404394513;0.00081432273145765;0.0001162013868452;-0.00085733470041305;2.8191598175908e-05;0.00051595078548416;6.6896554926643e-06;-0.00063516572117805;5.9754456742667e-05;0.00016349709767383;-3.0567862268072e-05;-0.00040098308818415;-0.00011347107647453;-0.00048412889009342;-3.6457804526435e-05;-0.0007706509786658;-9.9243472504895e-05;0.00022196778445505;-7.6029778028897e-06;-0.00023203072487377;2.8882408514619e-05;-0.00027199392206967;-0.00014870533777867;0.0001424963993486;-3.7620491639245e-05;4.3683583498932e-05;-0.00041853365837596;0.00010788886720547;0.00021286704577506;0.00020607294572983;0.00048079932457767;4.9284699343843e-05;0.00071297714021057;4.9761143600335e-05;0.00088534696260467;0.00011037600779673;5.1509479817469e-05;3.9668593672104e-05;-0.00054536352399737;9.02743122424e-05;-1.2581824194058e-05;6.2892513597035e-07;0.00014658556028735;4.5128628698876e-05;0.00012095273996238;2.8024131097482e-05;-3.6024710425409e-05;-2.7485521059134e-05;-3.1026727810968e-05;3.5165558074368e-05;0.00010927418770734;-4.7660419113527e-06;-0.00038736365968361;-2.3716054784018e-05;4.8581976443529e-05;-2.3736616640235e-05;-0.00014148282934912;-5.8751564210979e-05;4.2119172576349e-05;0.00010513993765926;3.562846177374e-05;2.1313737761375e-06;-3.3448719477747e-05;-0.00021747499704361;-2.1317380742403e-05;7.2193099185824e-05;2.9449371140799e-05;7.4866737122647e-05;1.3172437320463e-05;9.0634181105997e-05;1.950018122443e-05;-2.6917352442979e-05;1.2980523024453e-05;-0.00023960320686456;1.2272608728381e-05;-0.000149489424075;2.4497172489646e-05;0.00012109988165321;-9.8388136393623e-06;-6.7217435571365e-05;2.7475791284814e-05;3.5057557397522e-05;-1.1808236195066e-05;-0.00013887854584027;-1.622288255021e-05;6.1760110838804e-05;-5.8133528000326e-06;7.0853500801604e-05;8.0803336459212e-05;3.3650765544735e-05;4.4659747800324e-05;-7.1678310632706e-05;-6.9328743848018e-05;-5.1543360314099e-05;0.00054846360580996;6.2042131503404e-06;-0.00021554947306868;1.0073550583911e-05;2.0015471818624e-05;1.0549621947575e-05;-5.0585051212693e-05;4.0567292671767e-06;9.4199647719506e-05;-1.8061060472974e-05;-0.00018752094183583;-2.7926993425353e-05;0.00012185762170702;-2.1267300326144e-05;-7.7150958532002e-05;-4.1291070374427e-05;6.4858959376579e-06;1.3499976375897e-05;-0.00018715756596066;2.2097623514128e-05;-0.00025025894865394;-8.2917440522579e-06;-1.1921797522518e-05;-1.9444660210866e-06;8.1523485278012e-06;-7.1174610638991e-05;5.3461211791728e-05;-4.0100145270117e-05;8.2319646026008e-05;-9.0749737864826e-05;4.5379347284324e-05;0.00048823846736923;-1.5865016393946e-05;0.00013714181841351;1.6566926205996e-05;-6.1067454225849e-05;6.3291918195318e-07;1.5669817003072e-05;6.0465345086413e-06;5.3726838814327e-05;-3.7390247598523e-05;1.5460651411559e-05;0.00056607089936733;-0.00032201324938796;0.00078066339483485;-8.8347420387436e-05;0.00047467340482399;5.2141112973914e-05;-7.8627395851072e-05;-8.0798301496543e-05;0.00017382623627782;-4.9332611524733e-05;0.0017079681856558;-3.1534738809569e-05;-0.00011390288273105;-0.00029338165768422;2.2311203792924e-05;-7.5895302870777e-05;0.00025886393268593;-0.00018686924886424;0.00028251906041987;-0.00051725964294747;0.00010158868099097;-0.0013904748484492;0.00012165942462161;-0.00073581846663728;4.8978847189574e-05;-0.00045742694055662;6.2185739579945e-07;-0.0002020008105319;-7.8641169238836e-06;1.8258644558955e-05;1.3881691529605e-06;5.8834466472035e-05;-0.00010179261880694;1.9522563889041e-05;2.9079257728881e-05;0.00019482149218675;-5.70083684579e-05;0.0001981646346394;-1.5817289749975e-05;-0.00037935236468911;-7.6793832704425e-05;0.0004544212424662;1.0011237918661e-06;-0.00014325416123029;2.7316616524331e-06;6.4390784245916e-05;-0.00016796974523459;1.0517255759623e-05;-0.00011916527728317;7.5522824772634e-05;-1.3652589814228e-06;8.3907129010186e-05;0.00021506854682229;2.8770760764019e-05;-0.00034493432031013;1.276462990063e-05;0.00038655128446408;4.3734271457652e-05;-0.00048413337208331;-1.4148997706798e-07;7.6733442256227e-05;-0.00012134294956923;-0.00016846293874551;-0.00010559213114902;-0.00018084076873492;-4.917147452943e-05;-0.0005349152488634;5.3951853260514e-06;0.00016231978952419;-1.3477510947268e-06;-6.6571759816725e-05;-0.00014025429845788;9.7048898169305e-05;-4.6357374230865e-05;0.00026346536469646;-7.3246037572972e-06;-0.00042255214066245;-2.7243855583947e-05;0.00025024352362379;0.00013303774176165;0.00010798817675095;0.00046303740236908;9.4348906714004e-05;0.00017641574959271;0.00010212915367447;0.0003478855942376;4.4349551899359e-05;2.0067331206519e-05;7.8406366810668e-05;-0.00055075343698263;6.1430167988874e-05;-2.0505691281869e-05;2.4158749511116e-05;0.00073583319317549;-0.00042444909922779;0.00086928787641227;-0.00010908425610978;0.00053596630459651;3.4484655770939e-05;-1.8888053091359e-05;-0.00010816879512277;0.00019323499873281;-8.7298976723105e-05;0.0023328959941864;-2.9921206078143e-05;-0.00022565518156625;-0.00041452105506323;-2.0287767256377e-05;-0.00011384145182092;0.00035198821569793;-0.00016353190585505;0.00037290138425305;-0.00057000276865438;0.00014399638166651;-0.0018123991321772;0.00016101614164654;-0.0008579099085182;7.6732903835364e-05;-0.00062601320678368;6.4651835600671e-06;-0.00029791353153996;-2.6240066290484e-05;5.8334455388831e-05;-1.4763018043595e-05;-1.1459561392257e-05;-0.00014015031047165;5.6298875279026e-05;4.1626266465755e-05;0.00033498500124551;-7.075604662532e-05;0.00024362876138184;-7.2282814471691e-06;-0.00057216815184802;-0.00010538593051024;0.00059407064691186;-1.3545956107919e-06;-0.00015465731848963;6.1604179791175e-05;0.0001151665346697;-0.00024809688329697;-5.8355517467135e-06;-0.00020275167480577;0.00011424953117967;-3.4412027162034e-05;0.00011721537885023;0.00046881622984074;3.85466919397e-05;-0.00059942720690742;1.2973337106814e-05;0.0004973232280463;6.035507976776e-05;-0.00062050757696852;-1.5328334484366e-05;0.00011576045653783;-0.00015437277033925;-0.00027643467183225;-8.3854087279178e-05;-0.00028450082754716;-5.5187996622408e-05;-0.00079669995466247;-2.3511141989729e-05;0.00025255928630941;1.5982559489203e-05;-0.00013932143338025;-0.00016816095740069;-9.6447380201425e-05;-4.002200148534e-05;0.00025111777358688;4.0134356822819e-05;-0.00047844092478044;3.3181055187015e-05;0.00027371491887607;0.00013511774886865;7.3763709224295e-05;0.00056894164299592;9.7889133030549e-05;0.00038829058757983;0.00010897327592829;0.0006776848458685;4.8626738134772e-05;8.2075508544222e-05;9.2404028691817e-05;-0.00064393517095596;5.7594035752118e-05;-1.5870808056206e-05;1.2244388926774e-05;0.00070585682988167;-0.00042441437835805;0.00084635039092973;-9.6663083240855e-05;0.0005232265102677;2.15923464566e-05;1.7115986338467e-05;-0.0001073403400369;0.00016484972729813;-9.9874858278781e-05;0.0022048975806683;-2.8440241294447e-05;-0.00020224366744515;-0.00039376274798997;-4.6335571823874e-05;-0.00015468231867999;0.0003498830483295;-0.00016278943803627;0.00038309316732921;-0.00050309003563598;0.00015954932314344;-0.0017134203808382;0.00015670052380301;-0.0008645310299471;7.77421737439e-05;-0.00056092627346516;1.4759085388505e-05;-0.00032106979051605;-2.7559115551412e-05;5.8222831285093e-05;-2.5838848159765e-05;-5.177601633477e-05;-0.00011821245425381;2.8109319828218e-05;4.2315925384173e-05;0.0002953993389383;-5.4515923693543e-05;0.0001958766952157;6.7403101411401e-07;-0.00053158070659265;-9.0183995780535e-05;0.00048548591439612;-5.8180094129057e-06;-6.0236467106733e-05;8.9325818407815e-05;9.5434566901531e-05;-0.00023589038755745;-1.403532223776e-05;-0.00019038683967665;0.00010287479381077;4.5537553887698e-06;0.00010432930866955;0.00049965496873483;3.037454916921e-05;-0.00057575269602239;6.3131715251075e-06;0.00046228326391429;5.5392280046362e-05;-0.00057483377167955;-1.8757429643301e-05;0.00011055947834393;-0.00013452737766784;-0.00028812728123739;-5.3926713007968e-05;-0.00030630017863587;-4.4436175812734e-05;-0.00072141323471442;-3.3206255466212e-05;0.00023811116989236;1.7899723388837e-05;-0.00011514535435708;-0.00014704177738167;-0.00011887933942489;-2.6813369913725e-05;0.00018403855210636;5.4151896620169e-05;-0.0004126125422772;4.1472041630186e-05;0.00021637586178258;0.0001430686970707;4.7408251703018e-05;0.00051591766532511;8.1626305473037e-05;0.00040175067260861;8.71328447829e-05;0.00063297263113782;4.3273110350128e-05;4.5828437578166e-05;7.7866185165476e-05;-0.00051826651906595;-2.7383710403228e-05;-1.3369642147154e-05;-0.00050525576807559;5.9219605645922e-06;-0.00067314965417609;0.00026297956355847;-0.00033429317409173;5.298326141201e-05;-6.1845101299696e-05;3.2807752177177e-06;4.5978476919117e-06;4.2229985410813e-05;-0.0017916129436344;6.5515618189238e-05;9.0098481450696e-05;1.5044631254568e-05;0.00022719145636074;7.3621478804853e-05;0.00015759890084155;0.00015404366422445;-0.00022609095321968;0.00026195257669315;-0.00028518209001049;0.0012912964448333;-9.2367554316297e-05;0.0007631802582182;-8.8030436018016e-05;0.00032965172431432;-3.9748916606186e-05;0.00035577203379944;-1.8630771592143e-05;3.9182566979434e-05;-1.7373204173055e-05;-0.000232730715652;-4.9821639549918e-05;-7.0096597482916e-05;-4.5303961087484e-05;0.00024692784063518;3.8105124986032e-05;3.5114309866913e-05;1.6743984815548e-05;-0.00044609213364311;8.6363552327384e-06;0.00019061377679463;-4.000031913165e-05;0.00015940295998007;-2.973948357976e-05;0.00019800894369837;8.3372004155535e-05;-0.00019963034719694;-0.00018529196677264;-6.061408930691e-05;7.5715950515587e-05;5.6339962611673e-05;0.00076872081262991;6.0555339587154e-05;-0.000580586027354;1.2858443369623e-05;0.00039472806383856;-8.8690503616817e-06;-0.00045948909246363;4.0612187149236e-05;0.00011811659351224;-2.3838132619858e-05;-0.00036574469413608;-8.1984333519358e-05;-0.00030285777756944;-1.8101502064383e-05;-0.00042117733391933;-6.2285478634294e-05;0.00013442148338072;-1.129718930315e-05;-9.0607689344324e-05;1.9268351024948e-05;-0.00017768598627299;-9.8385753517505e-05;4.0227921999758e-05;-1.6088091797428e-05;7.9309349530376e-05;-0.00024174539430533;6.210263381945e-05;0.00014403922250494;9.6088355348911e-05;0.0002622036554385;4.0187242120737e-05;0.00056054739980027;4.0714621718507e-05;0.00048107514157891;6.4203268266283e-05;-9.0328452643007e-05;2.886785841838e-05;-0.00022230528702494;5.3060004574945e-05;-2.5619019652368e-05;3.4552240322228e-06;0.00018329458544031;5.4705840739189e-05;0.0001951329613803;3.5126045986544e-05;-4.9592861614656e-05;-3.5285040212329e-05;-4.7563309635734e-05;3.8220387068577e-05;0.00014263778575696;-5.2757568482775e-06;-0.0005031477776356;-1.7913962437888e-05;5.8833400544245e-05;-2.2261165213422e-05;-0.00016052286082413;-3.981956615462e-05;8.0646444985177e-05;8.5870044131298e-05;3.8335361750796e-05;-5.367541234591e-05;-5.1755283493549e-05;-0.00026561124832369;-3.1028048397275e-05;0.00011274334246991;3.0560226150556e-05;9.5409945060965e-05;1.2099508239771e-05;0.0001267624029424;1.5237789739331e-05;-3.3974520192714e-05;1.6056377717177e-05;-0.00031684877467342;4.3592203837761e-06;-0.00023847819829825;3.1332103390014e-05;0.00014449880109169;-2.0148686417087e-06;-7.4552037403919e-05;3.2337982702302e-05;4.2378112993902e-05;-1.2448249435693e-05;-0.00019647421140689;-1.5198795153992e-05;7.7511089330073e-05;-8.2556216511875e-06;0.00010998058132827;8.4072918980382e-05;1.0274591659254e-05;5.6348708312726e-05;-9.3395530711859e-05;-3.0483552109217e-05;-5.2886789490003e-05;0.00071167357964441;1.1066420483985e-05;-0.00024454738013446;5.1381080083956e-06;1.9371107555344e-05;8.7119296949822e-06;-5.086898454465e-05;5.3159324124863e-06;0.00012587218952831;-2.8667411243077e-05;-0.00026065422571264;-2.9553679269156e-05;3.6119392461842e-05;-1.1639212061709e-05;-0.00011312392598484;-4.474042361835e-05;1.4432730495173e-05;9.8758355306927e-06;-0.0002617648569867;3.0162036637194e-05;-0.00035973420017399;-1.2007023542537e-05;-3.0161603717715e-05;-4.8784721684569e-07;2.3281747417059e-05;-6.7920322180726e-05;7.2475660999771e-05;-2.6928104489343e-05;7.6785698183812e-05;-8.0226185673382e-05;3.2555311918259e-05;0.00070175889413804;-2.1816777007189e-05;0.00021616466983687;1.8375169020146e-05;-6.0526414017659e-05;8.7924826175367e-07;4.3928866944043e-05;7.2847528826969e-06;1.5371499102912e-05;-1.0360189662606e-05;0.00022943440126255;7.3527080530766e-05;0.00012028100900352;3.6876408557873e-05;-0.00010394096898381;-4.4943688408239e-05;-1.8849121261155e-05;3.4942349884659e-05;0.00010441836639075;-2.4203689008573e-06;-0.00045994270476513;-4.2778134229593e-05;1.9275190425105e-05;-2.7614345526672e-05;-0.0002347955305595;-9.2351750936359e-05;8.9767039753497e-05;0.00017887889407575;6.8181601818651e-05;5.7487309277349e-06;-5.824516483699e-05;-0.00033639164757915;-3.6039848055225e-05;0.00018781874678098;4.9343681894243e-05;7.8329001553357e-05;2.4845892767189e-05;0.00012418763071764;2.7445941668702e-05;-7.572731556138e-05;3.0823535780655e-05;-0.00029164823354222;1.9014880308532e-05;-0.00025957034085877;4.5877106458647e-05;0.00010135056800209;-1.0865283002204e-05;-9.0877234470099e-05;3.5089484299533e-05;0.00018970452947542;-2.1811276383232e-05;-0.00023984623840079;-1.4641574125562e-05;9.4491384516004e-05;-4.8631127356202e-06;7.9899567936081e-05;8.2666789239738e-05;6.0696464061039e-05;0.00010202322300756;-9.3445501988754e-05;-4.2987627239199e-05;-8.5761770606041e-05;0.00060445297276601;3.5779419249593e-06;-0.00017430823936593;7.0782070906716e-06;-7.1981394285103e-06;1.3793115613225e-05;-5.8441550208954e-05;1.4536532262355e-06;0.0001284352329094;-2.0170857169433e-05;-0.00026105702272616;-3.0689658160554e-05;7.1516478783451e-05;-4.1560833778931e-05;-4.5665976358578e-05;-5.2781575504923e-05;-8.374822755286e-06;2.9099566745572e-05;-0.00024852904607542;2.3970460460987e-05;-0.00026593665825203;-1.165619596577e-05;1.9020601484954e-06;-9.1111523943255e-06;-1.5686422557337e-05;-0.00012774909555446;2.9201723009464e-05;9.0480034486973e-06;0.0001189274553326;-7.4365721957292e-05;8.6762862338219e-05;0.00071393267717212;-1.8106107745552e-05;7.945102697704e-05;2.5570347133907e-05;-0.00014654816186521;4.0884583540901e-06;4.7099943913054e-05;8.9830527940649e-06;2.1663330699084e-05;-1.0283921255905e-05;0.00014644570183009;4.7157256631181e-05;5.0758073484758e-05;2.1290588847478e-05;-7.5942509283777e-05;-2.8956588721485e-05;-2.5743597689143e-06;1.8741220628726e-05;4.5386848796625e-05;-3.0222673785829e-07;-0.00024635289446451;-3.2359479519073e-05;-1.1515545565999e-06;-1.7185178876389e-05;-0.00015547734801657;-6.5571533923503e-05;5.614482506644e-05;0.00012563810741995;4.8070189222926e-05;1.6250951375696e-05;-3.6028788599651e-05;-0.00021517799177673;-2.1764908524347e-05;0.00013061237405054;3.4198750654468e-05;4.0125731175067e-05;1.8158521925216e-05;6.9117093516979e-05;1.9369717847439e-05;-5.6055527238641e-05;2.2133830498205e-05;-0.00015744077973068;1.5043226994749e-05;-0.00015861239808146;3.0722985684406e-05;4.4435724703362e-05;-7.8754901551292e-06;-5.6302160373889e-05;2.0171366486466e-05;0.00015584337234031;-1.5180212358246e-05;-0.00015102946781553;-7.8208240665845e-06;5.7882291002898e-05;-1.3743929230259e-06;3.6215478758095e-05;4.5766366383759e-05;4.8443460400449e-05;7.289648783626e-05;-5.2788389439229e-05;-2.5134555471595e-05;-5.910178515478e-05;0.00030886364402249;-3.5340988802091e-07;-7.3974937549792e-05;3.9527494664071e-06;-1.4317221939564e-05;9.3779644885217e-06;-3.3732805604814e-05;-6.5455373032819e-07;7.467145769624e-05;-9.3671387730865e-06;-0.00014949815522414;-1.6471525668749e-05;3.7428639188875e-05;-3.065545388381e-05;-6.7958667386847e-06;-3.1507301173406e-05;-1.1243642802583e-05;2.1842753994861e-05;-0.00014224853657652;1.2237239388924e-05;-0.00012652750592679;-5.3561370805255e-06;1.0062507499242e-05;-7.3043675001827e-06;-2.2088581317803e-05;-9.0320143499412e-05;3.4071581467288e-06;2.1047137124697e-05;7.8948425652925e-05;-3.5940051020589e-05;6.3752428104635e-05;0.00042045535519719;-1.0708294212236e-05;7.3195228651457e-06;1.5500483641517e-05;-0.00010795785055961;2.8350580123515e-06;2.9355673177633e-05;5.1267161325086e-06;1.1340603123244e-05;-1.6538640920771e-05;-5.0759863370331e-05;-0.00017413280147593;-5.0829719839385e-05;-6.3196835981216e-05;2.6186353352387e-05;0.00015325238928199;-1.5953164620441e-05;9.4423994596582e-06;-1.0095090146933e-05;-5.8137364248978e-05;2.9865208489355e-05;0.00040297661325894;1.5790883480804e-05;-7.360332801909e-06;0.00017515735817142;7.9618985182606e-05;-0.00010547136480454;-6.7107925133314e-05;-0.00011940847616643;9.4478113169316e-05;-5.8259407524019e-05;4.3008556531277e-05;0.00021343844127841;-3.4890359529527e-05;-0.00020026134734508;-1.577887996973e-05;-5.6498956837459e-05;-1.5090391570993e-05;-0.00013478499022312;2.1319236111594e-05;-5.818258432555e-05;3.7394387618406e-05;-0.00020352765568532;5.5006785260048e-05;-0.00021282244415488;-2.4285332983709e-05;5.8273994909541e-06;2.4000333723961e-05;-5.9542693634285e-05;-4.8348661039199e-06;0.00017557843239047;-1.4238984476833e-05;-0.00023219776630867;-7.0345940912375e-06;9.0847905084956e-05;3.305124482722e-05;5.3585896239383e-05;9.6767587820068e-05;-8.4179533587303e-05;0.00012504518963397;-8.7119573436212e-05;-2.6155230443692e-05;-2.1442341676448e-05;0.00039804037078284;1.6296495232382e-05;-6.2692954088561e-05;3.0705532481079e-06;4.7840389925113e-06;7.7089662227081e-06;-5.0068272685166e-05;-1.3706472600461e-05;9.1020287072752e-05;-4.0236402128357e-05;-0.00021029177878518;-3.8338490412571e-05;6.631371070398e-05;-2.4100138034555e-05;-5.4912587074796e-05;1.9446744772722e-05;-1.2919589380544e-06;1.9528661141521e-05;-0.00014317520253826;-1.5299274309655e-05;-0.0002105914754793;-1.3458740795613e-05;4.0715385694057e-06;1.2352028022633e-07;-0.00012056857667631;8.6623758761561e-06;0.00011153594823554;3.7157965380175e-06;5.9497971960809e-05;-2.285045957251e-05;-4.9119598770631e-06;0.00052017311099917;2.1468569684657e-05;5.4646749049425e-05;3.3873250231409e-06;-0.00014289614045992;1.2126756701036e-05;6.0910617321497e-05;4.8864744712773e-06;1.8931472141048e-06;-4.9469130317448e-05;-0.00016482562932651;-5.6098782806657e-05;-0.00010133053729078;2.6941159376292e-05;0.00014195476251189;-2.1877385734115e-05;2.7066680559074e-05;-7.75424814492e-06;-8.9379398559686e-05;2.024820423685e-05;0.00047098734648898;1.6337920897058e-05;-2.6494220946915e-05;0.00015991656982806;6.5887114033103e-05;-0.00011302682833048;-5.7141776778735e-05;-9.760133252712e-05;9.7473151981831e-05;-3.1795203540241e-05;4.5860164391343e-05;0.00020155955280643;-3.0070277716732e-05;-0.0001916897308547;-1.1486839866848e-05;-6.7059445427731e-05;-1.184509437735e-05;-0.00015206639363896;1.6237781892414e-05;-4.600225656759e-05;3.0246739697759e-05;-0.0002437077491777;5.7000474043889e-05;-0.00023110542679206;-2.0267490981496e-05;2.7130330636282e-05;2.6078923838213e-05;-6.1192127759568e-05;-7.1930782041818e-07;0.00012436266115401;-1.5251323929988e-05;-0.00023898703511804;-8.8580336523592e-06;9.9067641713191e-05;5.8917226851918e-05;5.772473741672e-05;8.0216428614222e-05;-9.5245930424426e-05;0.00011699044989655;-8.3031052781735e-05;-1.5026437722554e-05;-1.8238721168018e-05;0.00049549737013876;1.4233090041671e-05;-0.00010365009075031;1.1182154366907e-06;2.5537146939314e-05;9.7471993285581e-06;-5.8823432482313e-05;-2.0774810764124e-05;0.00010065185051644;-4.5052576751914e-05;-0.00024316238705069;-2.6283380066161e-05;6.2554026953876e-05;-2.5072004063986e-05;-8.856692147674e-05;1.2924868315167e-05;9.531505384075e-06;2.639460581122e-05;-0.00015640516357962;-1.7397191186319e-05;-0.00026972434716299;-9.8813497970696e-06;-9.0298353825347e-06;2.7060033971793e-05;-0.00010267370089423;2.8843427571701e-05;9.6289128123317e-05;-1.3197434782342e-05;4.4353826524457e-05;-3.2837171602296e-05;-7.3421706474619e-06;0.00056791858514771;1.9706452803803e-05;0.00011579850979615;2.1415103219624e-06;-0.00012392857752275;1.2232388144184e-05;6.4928317442536e-05;3.9700222259853e-05;-4.8872161642066e-06;-1.7444546756451e-05;0.00052706996211782;-0.00035847842809744;0.00068788911448792;-5.2439605497057e-05;0.00048153451643884;8.9405029939371e-06;3.7980145862093e-05;-8.1230922660325e-05;2.9446462576743e-05;-8.6318592366297e-05;0.0017267317743972;-2.4597637093393e-05;-9.0660192654468e-05;-0.00025344750611112;-3.6117857234785e-05;-0.00021568704687525;0.000270235206699;-0.00019555006292649;0.00034405302722007;-0.00035019277129322;0.00015480040747207;-0.0012188743567094;0.00011474025814096;-0.00082689145347103;5.4978521802695e-05;-0.00033307573175989;2.154160210921e-05;-0.000353747891495;-1.8303375327378e-05;2.624541411933e-05;-3.3736745535862e-05;-0.00017409537394997;-2.1499279682757e-05;-0.00013475881132763;3.2950232707663e-05;0.00011698043817887;-5.9462176977831e-06;6.7876586399507e-05;1.6431025869679e-05;-0.00035607159952633;-4.7385856305482e-05;0.00011632323003141;-1.8243459635414e-05;0.00014832436863799;0.00014432752504945;4.1499028156977e-05;-0.00013675600348506;-5.5489006626885e-05;-9.164419316221e-05;1.7313966964139e-05;0.00012599116598722;4.9604706873652e-05;0.00059908186085522;1.0895196282945e-05;-0.00038853639853187;-9.9479939308367e-06;0.00038955316995271;4.1560386307538e-05;-0.00045254404540174;-1.8690110664465e-05;0.00010057405597763;-0.00010837995068869;-0.00033276368048973;-4.2927462345688e-05;-0.00020456509082578;-3.7847152270842e-05;-0.00041534390766174;-2.3805343516869e-05;0.0001547925057821;1.3083479643683e-05;-1.640430673433e-05;-0.00011282058403594;-7.2909577284008e-05;-1.3263340406411e-05;6.9949841417838e-05;8.7548447481822e-05;-0.00028149134595878;1.4170908798405e-05;0.00012239345232956;0.00012940302258357;6.2991901359055e-05;0.00030472141224891;7.2515853389632e-05;0.00039603770710528;6.0603135352721e-05;0.00035725193447433;3.7241989048198e-05;-0.00012311885075178;5.2115687140031e-05;-0.00023106465232559;2.0116111045354e-05;-2.3618897103006e-05;8.200518641388e-05;0.00010745737381512;-8.6262603872456e-05;0.0001235914969584;-0.00032862176885828;-5.3562631364912e-05;-4.865748451266e-06;-1.3209105418355e-05;0.00017769518308342;1.394428909407e-05;-0.0010298929410055;-4.097487362742e-06;-0.00012245571997482;1.4557675967808e-05;-0.0002071578783216;1.3829403542331e-05;0.00030417222296819;0.00020238989964128;9.9323256108619e-07;-9.0104906121269e-05;-0.00020314576977398;3.1260657124221e-05;-9.6427640528418e-05;0.00072767125675455;1.8969352822751e-05;3.266692510806e-05;1.5672436347813e-05;0.00038523320108652;-8.802883712633e-06;-0.00021289009600878;8.2486454630271e-05;-0.00044677866389975;-5.8611942222342e-05;-0.00048102354048751;9.7683601779863e-05;-5.8705245464807e-05;2.632418909343e-05;-5.5824915762059e-05;3.3162323234137e-05;0.00045772735029459;-4.0178838389693e-05;-0.00044678145786747;-9.2045678456998e-07;0.00018999852181878;-6.2594185692433e-06;0.00027031163335778;1.6513802620466e-05;-3.0155179047142e-06;0.00011565132444957;-0.00016849755775183;0.00023514554777648;-0.0001004504665616;0.0006321594119072;4.4472813897301e-05;1.3074631169729e-05;-3.4500288165873e-05;4.3243198888376e-05;-2.1221037513897e-06;-0.00014907898730598;7.6846663432661e-06;0.00020208666683175;-3.6670742701972e-05;-0.00062656763475388;-5.8829777117353e-05;-0.00058282393729314;-5.0150556489825e-05;-3.2931431633187e-05;-3.6458928661887e-05;1.6556727132411e-05;3.4056465665344e-05;-0.00020338031754363;1.8626902601682e-05;-0.00025606862618588;-6.9707406510133e-05;-5.3106006816961e-05;-2.8510676202131e-05;6.9687725044787e-05;-0.00026247749337927;-0.00010660405678209;0.0002943898725789;7.4975934694521e-05;0.00026492358301766;0.00013730413047597;0.0012768189189956;2.9883596653235e-05;0.00011065779108321;4.868974792771e-05;-0.00040141519275494;3.0964984034654e-05;0.00016081043577287;3.5269360523671e-05;2.9229346182547e-05;-2.7248453989159e-05;0.00015242100926116;0.00011713311687345;-1.8296308553545e-05;0.0001126577553805;-0.00031515228329226;-5.9624278947012e-05;-8.7473563326057e-06;-6.2322883422894e-06;0.00015536916907877;1.4523502613883e-05;-0.00099204014986753;-1.0478909644007e-05;-0.00010452896094648;8.1044581747847e-06;-0.00025136166368611;-5.2089262680965e-07;0.00029978333623149;0.00020272718393244;2.5841232854873e-05;-0.0001024328157655;-0.00019430195970926;-7.4422176112421e-05;-9.8962525953539e-05;0.00068398955045268;2.9654027457582e-05;5.5953514674911e-05;1.8334081687499e-05;0.00036250063567422;-3.8708872125426e-06;-0.00021702935919166;8.3817642007489e-05;-0.00045947823673487;-5.0077840569429e-05;-0.00049224059330299;9.7362928499933e-05;-3.6721423384733e-05;2.2667512894259e-05;-6.5167951106559e-05;3.5025863326155e-05;0.000495410640724;-4.2515035602264e-05;-0.00046062967157923;-2.8212050438015e-06;0.00017864794062916;-5.6201874940598e-06;0.00026055696071126;3.0823397537461e-05;7.9151895988616e-06;0.0001273072703043;-0.00017207824566867;0.00020820717327297;-0.00010695993114496;0.000662500213366;4.2271316488041e-05;-1.6634443227304e-06;-3.1236944778357e-05;9.812941243581e-06;9.6948224381777e-07;-0.00012554829299916;6.4918704083539e-06;0.00021323918190319;-3.8828740798635e-05;-0.00061600276967511;-5.5161923228297e-05;-0.00056189054157585;-5.1331349823158e-05;-3.8063135434641e-05;-3.9252729038708e-05;1.1186734809598e-05;3.6527457268676e-05;-0.00026631832588464;2.2453714336734e-05;-0.00030979723669589;-6.377595855156e-05;-5.1394592446741e-05;-2.8673162887571e-05;5.31828009116e-05;-0.0002556974068284;-9.2649126600008e-05;0.00027226793463342;9.0303074102849e-05;0.00023996415256988;0.0001324066251982;0.0013559091603383;2.0246274289093e-05;0.00012534964480437;4.8885256546782e-05;-0.00038212083745748;2.8412581741577e-05;0.00016746440087445;3.3158827136504e-05;7.4265793955419e-05;-3.1946416129358e-05;0.00028582566301338;9.2657304776367e-05;0.00010228057362838;2.644510641403e-05;-0.00014180554717313;-5.355723988032e-05;5.6319881878153e-06;2.0669955119956e-05;3.2171902830669e-07;7.3075639193121e-06;-0.00035104641574435;-5.4618867579848e-05;-2.9188862754381e-05;-2.3473643523175e-05;-0.00029964128043503;-0.00010556819324847;0.00011785617243731;0.00020693789701909;0.00010307219054084;-6.7595524342323e-06;-6.4230895077344e-05;-0.00038576149381697;-4.8647518269718e-05;0.00024686841061339;6.3121427956503e-05;6.5007880039047e-05;3.2085878046928e-05;0.00011740586342057;2.8484519134508e-05;-0.00013266690075397;4.8891884944169e-05;-0.00024012349604163;2.1286143237376e-05;-0.000268080184469;5.6449709518347e-05;2.9167320462875e-05;-1.1842045751109e-05;-7.9769946751185e-05;2.649521229614e-05;0.00042813667096198;-3.0727529519936e-05;-0.00027797376969829;-8.8826473074732e-06;7.7767173934262e-05;1.9237770629843e-06;6.0507343732752e-05;6.3803803641349e-05;8.8662913185544e-05;0.00013285411114339;-8.9120112534147e-05;-1.7817690604716e-05;-0.00010236201342195;0.00035548731102608;1.4864283457428e-06;-3.0715218599653e-05;9.9780481832568e-07;-9.5346622401848e-05;1.4738154277438e-05;-1.9665170839289e-05;-3.5624113934318e-06;0.00012589589459822;-1.2284041986277e-05;-0.00025244287098758;-2.1156920411158e-05;-8.3568287664093e-05;-5.8623576478567e-05;2.1793219275423e-05;-4.2875301005552e-05;-2.462259180902e-05;3.9873801142676e-05;-0.00025961286155507;1.4902831935615e-05;-0.00020752516866196;-1.1454619198048e-05;1.4577653928427e-06;-1.7521868358017e-05;-5.7326731621288e-05;-0.00016077731561381;-2.8968606784474e-05;8.1582271377556e-05;0.00013291106733959;6.7142650550522e-07;0.00011091859778389;0.00081168871838599;-1.354847154289e-05;-1.1713598723873e-05;2.8503507564892e-05;-0.00021903245942667;8.241219802585e-06;9.4614129920956e-05;1.0000843758462e-05;3.8033907912904e-05;-1.6273563232971e-05;0.00016267858154606;5.2412342483876e-05;4.7906603867887e-05;1.8216407625005e-05;-8.5604362539016e-05;-3.1278017559089e-05;3.9430556171283e-06;1.4663537513115e-05;1.6310039427481e-05;2.4290686724271e-06;-0.00021499252761714;-3.5469653084874e-05;-1.4415063560591e-05;-1.5877802070463e-05;-0.00017337637837045;-6.8730441853404e-05;6.4003346778918e-05;0.00013241182023194;5.7883829867933e-05;1.1392605301808e-05;-3.7585385143757e-05;-0.00023034818877932;-2.5293287762906e-05;0.00014579476555809;3.7883615732426e-05;3.6396166251507e-05;2.0128769392613e-05;6.7275504989084e-05;1.9480703485897e-05;-7.1847382059786e-05;2.7146468710271e-05;-0.00014305544027593;1.5584955690429e-05;-0.00016142993990798;3.3456410164945e-05;2.4419501642114e-05;-8.0920854088617e-06;-5.2774765208596e-05;1.7593278244021e-05;0.0002227475924883;-1.7617268895265e-05;-0.00016166413843166;-6.1540117712866e-06;5.2707062422996e-05;5.8591166407496e-07;3.0820672691334e-05;4.0229340811493e-05;5.5810840422055e-05;8.1493824836798e-05;-5.143091766513e-05;-1.7710248357616e-05;-6.3336046878248e-05;0.00023950429749675;-8.9595044983071e-07;-3.3807878935477e-05;2.2047438505979e-06;-3.9842168916948e-05;9.5846453405102e-06;-2.2134950995678e-05;-2.0963411770936e-06;7.3971918027382e-05;-7.2120033109968e-06;-0.00014696405560244;-1.3596280950878e-05;-6.9711154537799e-06;-3.5232769732829e-05;1.1624338185356e-05;-2.8742479116772e-05;-1.5576873920509e-05;2.4659408154548e-05;-0.00014613286475651;9.7103693406098e-06;-0.00011191072553629;-5.2286754907982e-06;9.1045367298648e-06;-9.5459336080239e-06;-3.385150921531e-05;-9.9073091405444e-05;-1.2378403880575e-05;4.1597686504247e-05;8.2521721196827e-05;-1.5334950148826e-05;7.0156813308131e-05;0.00044904384412803;-9.5382092695218e-06;-1.6580801457167e-05;1.6254069123534e-05;-0.00012759564560838;3.9541828300571e-06;4.3517866288312e-05;5.3496255532082e-06;3.8207224861253e-05;-7.950948929647e-05;-7.6472082582768e-05;-0.00023494480410591;-5.79291881877e-05;-1.6043051800807e-05;3.9217600715347e-05;0.00024208155809902;-4.8392621465609e-06;-1.9443532437435e-05;-2.6451682060724e-05;1.3114827197569e-05;5.5866195907583e-05;0.00045707519166172;1.6219508324866e-05;4.6168108383426e-05;0.00026397264446132;0.00011162387090735;-0.00015592208364978;-0.00010908520198427;-0.00018547584477346;0.00012992910342291;-8.5956366092432e-05;6.3461586250924e-05;0.0002490115002729;-5.9190213505644e-05;-0.00033499349956401;-2.8606636988115e-05;-4.737305425806e-05;-2.1902829757892e-05;-0.00018181010091212;4.5755870814901e-05;-0.0001240195997525;4.95862623211e-05;-0.00020812673028558;7.4168419814669e-05;-0.00024249927082565;-3.5013723390875e-05;-5.7220855524065e-05;2.3843094822951e-05;-6.4058491261676e-05;-1.7928021406988e-05;0.00042476601083763;-1.5324196283473e-05;-0.00030960535514168;-3.5911375562137e-06;0.00010655906953616;2.3183218218037e-05;5.1431852625683e-05;0.00014922310947441;-9.8492419056129e-05;0.00017309538088739;-0.00011958214599872;-2.4498449420207e-05;-2.6087420337717e-05;0.00027214852161705;1.8123340851162e-05;3.1124833185459e-05;6.2525691646442e-06;-6.0440881497925e-05;6.5233316490776e-06;-4.9296213546768e-05;-3.4666836654651e-06;0.00010655235382728;-4.6205870603444e-05;-0.00025044174981304;-7.8125827712938e-05;-3.9478982216679e-05;-2.7004498406313e-05;4.4947300921194e-06;3.4449411032256e-05;-1.3496546671377e-05;8.0023619375424e-06;-0.00015209718549158;-2.7345318812877e-05;-0.00015930888184812;-2.4379462047364e-05;1.0778894647956e-06;-4.7390760300914e-05;-0.00019883361528628;-4.8536359827267e-05;0.00016535677423235;8.3691084000748e-05;0.00011410834122216;3.5181190469302e-05;1.0876960914175e-05;0.00068346015177667;3.4906977816718e-05;-2.6705845812103e-05;1.3354006114241e-05;-0.00028027323423885;1.8453607481206e-05;0.00010912497236859;2.4322982426384e-05;-4.192502819933e-05;-6.9285393692553e-05;-0.00017912065959536;-7.1411654062103e-05;-2.7258072805125e-05;3.5911638406105e-05;0.0002303545770701;-8.5593164840247e-06;-7.4612461276047e-07;-1.9638380763354e-05;-5.4349242418539e-05;3.597978502512e-05;0.00054341368377209;1.2452254850359e-05;2.9329950848478e-05;0.00021300961088855;8.4773215348832e-05;-0.00016179938393179;-7.4623647378758e-05;-0.00015866942703724;0.00013210946053732;-5.8161003835266e-05;6.4164720242843e-05;0.00018702136003412;-4.2846655560425e-05;-0.00033860688563436;-2.0536510419333e-05;-4.6271783503471e-05;-1.4070559700485e-05;-0.00020496350771282;3.746039874386e-05;-0.00010060302884085;3.3025502489181e-05;-0.00025005399947986;7.494111196138e-05;-0.00026666835765354;-2.5347511837026e-05;-3.8114121707622e-05;2.6087262085639e-05;-6.1571132391691e-05;-1.2401343155943e-05;0.00030341144884005;-1.4362352885655e-05;-0.00030490840435959;-6.3300649344455e-06;0.0001242937578354;6.1299164372031e-05;4.3297313823132e-05;0.00011273985001026;-0.00010740956349764;0.00015602866187692;-0.00010542005475145;1.2913033970108e-05;-1.8410071788821e-05;0.00039930501952767;1.1541626008693e-05;-1.8006843674812e-05;2.6412078568683e-06;-2.8370498057484e-06;9.1011470431113e-06;-7.5642616138794e-05;-1.2783607417077e-05;0.00011215863924008;-5.2877167036058e-05;-0.00029176694806665;-5.9879104810534e-05;-2.8999700589338e-05;-2.9087197617628e-05;-3.3398675441276e-05;2.5071214622585e-05;3.6506199307951e-07;1.5142813936109e-05;-0.00013374004629441;-3.2935455237748e-05;-0.00019375070405658;-1.8755185010377e-05;-7.317250037886e-06;-1.018156510213e-07;-0.00017234613187611;-2.4401218979619e-05;0.00013091233267915;6.6542968852445e-05;9.5550873083994e-05;2.3309747120948e-05;1.2624762348423e-05;0.00066627579508349;3.2715368433855e-05;3.0856062949169e-05;1.3031391063123e-05;-0.00024904106976464;1.8726988855633e-05;9.7897245723289e-05;3.6914767406415e-05;-2.6707237338996e-05;-2.6105690267286e-05;0.00041337846778333;-0.00027815144858323;0.00062464730581269;-3.2584412110737e-05;0.00042455864604563;2.1591971744783e-05;-2.9261902909639e-06;-6.1233760789037e-05;-2.9091158921801e-06;-5.4725180234527e-05;0.0012353096390143;-2.6393672669656e-05;1.5173775864241e-05;-0.00015782791888341;-1.7779492509362e-06;-0.00019148201681674;0.00019899175094906;-0.00022906466620043;0.00027140235761181;-0.00029576101223938;0.00012338250235189;-0.00089383864542469;8.1535617937334e-05;-0.00074006244540215;3.1015890272101e-05;-0.00016363446775358;1.8084074326907e-05;-0.00031080085318536;2.5655758690846e-06;-2.1742966055172e-05;-2.7799525923911e-05;-0.000125332371681;1.85342887562e-05;-0.00014603660383727;2.1241763533908e-05;-3.1918956665322e-05;2.7896437586605e-06;3.4013901313301e-05;7.7577196861967e-06;-0.00015828428149689;-2.3395563403028e-05;-1.9615441487986e-05;-1.4091051525611e-05;0.00018186467059422;0.00011259320308454;-2.9376740258158e-06;-5.5456221161876e-05;-4.7084813559195e-05;-3.124339855276e-05;-2.3794049411663e-05;0.00016020608018152;2.4203980501625e-05;0.00036785312113352;-2.2680861633262e-08;-0.00016846621292643;-1.0954077879433e-05;0.00030066710314713;2.760318966466e-05;-0.00035371835110709;-8.6787315467518e-07;6.4426225435454e-05;-8.7385385995731e-05;-0.00027019219123758;-7.321188604692e-05;-0.0001252415968338;-3.4461805626052e-05;-0.00017096383089665;-2.1081345948915e-06;8.624633483123e-05;-9.0721705419128e-06;9.46350992308e-05;-9.6622774435673e-05;0.00011406063276809;-1.6430223695352e-05;4.4732143578585e-05;5.4393283789977e-05;-0.00025034602731466;-5.4556727263844e-05;0.00010176837531617;0.00015233145677485;0.00011561552673811;0.00021307765564416;8.4318293374963e-05;0.00020690311794169;5.5874599638628e-05;7.5659001595341e-05;3.9258200558834e-05;-0.00023574871011078;4.0773033106234e-05;-0.00011686366633512;4.8919137043413e-05;-3.4881442843471e-05;0.00034280424006283;0.00014481336984318;0.00019956190953963;6.1194747104309e-05;-0.00029435267788358;-8.5681320342701e-05;1.2937417523062e-05;-1.9968185370089e-05;0.0001425830705557;1.110387074732e-05;-0.00072874675970525;-2.1770836610813e-05;-0.00016299067647196;1.3161799870431e-05;-0.0003652329032775;2.2231426555663e-05;0.00034275368670933;0.00014490622561425;9.3053284217604e-05;-0.0002503712894395;-0.00016826846695039;-0.00041109998710454;-0.00010229543113383;0.00064088718499988;5.623228935292e-05;2.6054331101477e-06;2.8461512556532e-05;0.00034364516614005;-6.1958453443367e-06;-0.00030479344422929;0.00012016479013255;-0.00047998034278862;-5.9910475101788e-05;-0.00055833149235696;0.0001246652827831;-0.00012058961146977;2.3548805984319e-05;-5.74902187509e-05;2.3247979697771e-05;0.00082509737694636;-6.453779496951e-05;-0.00058919418370351;6.0949405451538e-06;0.00010922954243142;8.7202724898816e-06;0.00027572194812819;9.1263154899934e-06;4.6588807890657e-05;0.00019897625315934;-0.00019635529315565;0.00023955895449035;-0.00012913075624965;0.00046638821368106;5.1295253797434e-05;0.00021905517496634;-4.9811496865004e-05;-0.00015232095029205;6.0067177400924e-06;1.3441678675008e-05;-4.4822304516856e-06;0.00024366730940528;-4.8444977437612e-05;-0.00067614245926961;-3.5376542655285e-05;-0.00082610524259508;-4.0956252632895e-05;3.7354897358455e-05;-1.2776858056895e-05;-1.4885613381921e-05;4.4774555135518e-05;-0.00036253029247746;2.615962694108e-05;-0.0003766372683458;-4.9490110541228e-05;-8.025729766814e-05;-3.4114917070838e-05;3.6700843338622e-05;-0.00025987537810579;-0.0001533533068141;0.0003556391748134;7.2041861130856e-05;0.00034002348547801;0.0001250367204193;0.0016443900531158;5.4050206017564e-06;9.2262773250695e-05;3.7672562029911e-05;-0.00040763520519249;2.5717328753672e-05;0.000263798807282;2.7936686819885e-05;8.9638400822878e-05;-5.1729559345404e-05;0.00046207648119889;0.00016164280532394;0.00028527819085866;4.3522119085537e-05;-0.00026711434475146;-8.9222972746938e-05;7.4604840847314e-06;-9.1285819507902e-06;1.3651783774549e-05;2.0974679500796e-05;-0.00061961484607309;-2.8969348932151e-05;-0.00012172295100754;1.310674178967e-06;-0.0004363696789369;2.3052825781633e-06;0.00032399874180555;0.00013285645400174;0.00013720644346904;-0.00025319823180325;-0.00015640431956854;-0.00053144642151892;-0.00011328787513776;0.00054392305901274;7.2108130552806e-05;7.7447206422221e-05;2.8764416128979e-05;0.00027182107442059;2.2226865894481e-06;-0.00030891850474291;0.00011903127597179;-0.00045243304339238;-4.0874696423998e-05;-0.00052282941760495;0.00011595310206758;-8.2415106589906e-05;1.6302792573697e-05;-6.4067469793372e-05;2.0735677026096e-05;0.00091687007807195;-6.6826527472585e-05;-0.00057311693672091;2.0166696685919e-06;6.478536670329e-05;1.1308978173474e-05;0.0002377410128247;4.0971728594741e-05;6.8429159000516e-05;0.0001991891185753;-0.00018998059385922;0.00016826871433295;-0.00013648283493239;0.00040496760630049;4.5547505578725e-05;0.00020875228801742;-4.1540817619534e-05;-0.00024043866142165;1.1828528840852e-05;7.4091905844398e-05;-6.8668496169266e-06;0.00025292419013567;-4.9046415369958e-05;-0.00060484511777759;-2.1220292182988e-05;-0.00084076763596386;-3.8913283788133e-05;2.4291044610436e-05;-6.8658850977954e-06;-2.2919814000488e-05;4.6881017624401e-05;-0.00049502379260957;3.1108531402424e-05;-0.00046550412662327;-3.3325359254377e-05;-7.7388176578097e-05;-3.5107910662191e-05;-1.4748932699149e-05;-0.00023967256129254;-0.00013612290786114;0.00031817457056604;0.00010190744069405;0.00032879374339245;9.9659424449783e-05;0.0017654903931543;-1.6353105820599e-05;0.00012682462693192;3.4066819353029e-05;-0.00034417715505697;1.9471272025839e-05;0.00026973642525263;2.2672973500448e-05;0.00013969087740406;-6.5479012846481e-05;0.00049803633010015;0.00014924629067536;0.00029064906993881;9.6449757620576e-06;-0.00019173277541995;-7.9650075349491e-05;1.509701996838e-05;1.7314292790616e-06;-0.00014325583470054;2.709188083827e-05;-0.00031993823358789;-4.6357556129806e-05;-7.5328600360081e-05;-1.3173243132769e-05;-0.00044762465404347;-5.3955001931172e-05;0.00022912817075849;0.00014244034537114;0.0001703177113086;-0.0001780106977094;-9.9682038126048e-05;-0.0005856083589606;-9.6938951173797e-05;0.00033867824822664;8.3592720329762e-05;0.0001148369119619;3.134065264021e-05;0.00013822480104864;1.6987589333439e-05;-0.00026322540361434;9.6189512987621e-05;-0.00029033786267973;-2.0653130832216e-06;-0.00036441828706302;8.5577514255419e-05;-5.1043192797806e-05;3.1813868872632e-07;-5.9394678828539e-05;1.2860312381235e-05;0.00089107034727931;-5.6689321354497e-05;-0.00043532060226426;-2.2075787455833e-06;1.1486449693621e-05;1.3051570931566e-05;0.00012085027992725;6.4739964727778e-05;0.00010269246558892;0.00016878088354133;-0.00013399940507952;4.8970421630656e-05;-0.00013080828648526;0.0001600862306077;2.2844506020192e-05;0.00018770537280943;-2.0988631149521e-05;-0.00029647452174686;1.6809226508485e-05;0.00011228523362661;-9.3453008958022e-06;0.00019631934992503;-2.8845972337876e-05;-0.00037442735629156;-3.5583325370681e-06;-0.00062768254429102;-5.1931205234723e-05;4.8494228394702e-05;-7.23232733435e-06;-3.6282141081756e-05;4.8001809773268e-05;-0.00049404130550101;2.135355680366e-05;-0.00038808464887552;-1.1871446986333e-05;-4.81530369143e-05;-3.2414325687569e-05;-9.155480802292e-05;-0.00019381602760404;-0.00010948671842925;0.00022049383551348;0.00013608265726361;0.00022857176372781;8.7666383478791e-05;0.0014639304718003;-2.7134752599522e-05;5.7176977861673e-05;2.9437709599733e-05;-0.00025988373090513;1.2321868780418e-05;0.00022310827625915;1.3441815099213e-05;0.00017588301852811;-7.1660782850813e-05;0.00043223239481449;0.00013381616736297;0.00016668315220159;3.4650195175345e-06;-0.00016759728896432;-7.1396956627723e-05;2.4395460059168e-05;1.0362945431552e-05;-0.00020568589388859;2.7025364033761e-05;-0.00023333462013397;-7.0350819441956e-05;-6.7284912802279e-05;-2.4452487195958e-05;-0.00043310111504979;-0.00011984668526566;0.00015951979730744;0.00022093699953984;0.00017428348655812;-6.1714265029877e-05;-7.0159941969905e-05;-0.00049606629181653;-7.7719640103169e-05;0.000277089769952;9.1572743258439e-05;9.8173099104315e-05;4.0567483665654e-05;0.00010247265163343;3.1892177503323e-05;-0.00022274628281593;7.6105890912004e-05;-0.00021011276112404;2.4817176381475e-05;-0.00024831044720486;7.0935711846687e-05;-3.3865198929561e-05;-1.5859490304138e-05;-6.6349042754155e-05;1.3589583431894e-05;0.00083949649706483;-4.5686832891079e-05;-0.00033399229869246;-6.3835441324045e-06;2.5250588805648e-05;1.2821044947486e-05;5.3824802307645e-05;7.2139846452046e-05;0.00013484845112544;0.00015815629740246;-0.00010085113171954;-3.1989886338124e-05;-0.00013022267376073;3.3789194276324e-05;3.8008874980733e-06;0.00013052696886007;-5.0908620323753e-06;-0.0002779180649668;1.8894510503742e-05;7.0029047492426e-05;-9.647990736994e-06;0.00014196016127244;-5.8876648836304e-06;-0.00025411136448383;-8.804265235085e-06;-0.00038015851168893;-7.6295640610624e-05;8.1496662460268e-05;-2.2151416487759e-05;-3.946992001147e-05;5.1430608436931e-05;-0.00036943855229765;8.5979017967475e-06;-0.00024683677474968;-8.3782197179971e-06;-2.771127037704e-05;-2.9522758268286e-05;-0.00012112154217903;-0.00019462098134682;-0.00010024561197497;0.00016177560610231;0.00016496305761393;0.00012678866914939;0.00012145792425144;0.0011399781797081;-1.6525877072127e-05;-3.9515736716567e-05;3.098801971646e-05;-0.00029718977748416;1.2104012057534e-05;0.00018498663848732;1.1458416338428e-05;7.6776537753176e-05;-0.00017312374257017;-9.7043724963441e-05;-0.00033924842136912;-2.2445938157034e-05;-3.8307534850901e-05;4.8727426474215e-05;0.00024734891485423;6.420916179195e-06;-4.6435750846285e-05;-5.0002276111627e-05;0.0002017087826971;8.1074111221824e-05;0.00029041917878203;1.9181223251508e-05;8.3616156189237e-05;0.00035555852809921;0.00012257482740097;-0.00016414752462879;-0.00017549452604726;-0.00018230095156468;0.00012381946726236;-6.5485088271089e-05;7.6637661550194e-05;0.00030901498394087;-9.003997547552e-05;-0.00032616310636513;-3.7331254134187e-05;-5.9076377510792e-05;-2.9047259886283e-05;-0.00014718530292157;6.7517918068916e-05;-0.00018852979701478;6.2274280935526e-05;-0.00012196585885249;6.9669134973083e-05;-0.00015094943228178;-4.4621156121138e-05;-0.00010887854296016;1.0807630133058e-05;-4.6456145355478e-05;-3.2900981750572e-05;0.00074846809729934;-1.4798057236476e-05;-0.00030463738949038;5.0623152674234e-06;4.5295146264834e-05;-2.0062316252734e-05;6.2611594330519e-05;0.00019560295913834;-8.3620339864865e-05;0.00016874680295587;-0.00013321694859769;-7.4992291047238e-05;-2.6956022338709e-05;-8.955376688391e-05;2.1345471395762e-05;0.0001629906182643;1.1820108738902e-05;-0.00022197450743988;1.1197331559742e-06;3.0781702662352e-05;1.3542648048315e-05;9.6276475233026e-05;-2.8787584597012e-05;-0.00017448942526244;-0.00010759386350401;-0.00024053394736256;-1.1302066013741e-05;8.0652724136598e-05;4.4433301809477e-05;-2.8903490601806e-05;-8.9959230535896e-06;-0.00020318194583524;-2.3629791030544e-05;-0.00011321487545501;-3.4080254408764e-05;-2.2030624677427e-05;-0.00013562710955739;-0.00022662345145363;-0.00011344163067406;0.00020763358043041;0.00014629031647928;0.00013168498117011;0.00012302611139603;1.4752885363123e-05;0.00080465996870771;3.8990525354166e-05;-8.5223189671524e-05;1.8591428670334e-05;-0.00034813661477529;1.8649028788786e-05;0.00016661178960931;8.5872488853056e-05;-0.00015724846161902;-0.00016575984773226;-0.00044090210576542;-5.4768490372226e-05;-0.00019977694319095;8.5004088759888e-05;0.00037931682891212;2.4337627110071e-05;-4.1122919355985e-05;-5.7685170759214e-05;7.8861601650715e-05;5.0763810577337e-05;0.00064100348390639;1.8483755184207e-06;0.00017174756794702;0.00045552931260318;2.0855070033576e-05;-0.0003590522101149;-0.00018208996334579;-0.00012766922009178;0.00021167866361793;0.00015407042519655;0.00014652659592684;0.00040902328328229;-9.7831143648364e-05;-0.00062128575518727;-3.343218122609e-05;-2.2954396627028e-05;-5.3989328989701e-06;-0.00034946147934534;0.00013595289783552;-0.00033377442741767;2.076526016026e-06;-0.00035600078990683;0.00014267908409238;-0.00035808098618872;-2.7979927835986e-05;-0.0002275251026731;1.1676001122396e-05;-4.1029470594367e-05;-7.6178039307706e-05;0.001083688926883;-7.1082754402596e-06;-0.00059202586999163;1.4595084394387e-05;8.0335783422925e-05;0.00015594883006997;2.4026616301853e-05;0.000193753206986;-0.00019239124958403;0.00024935993133113;-0.00016502989456058;9.1231275291648e-05;1.9298855477246e-05;5.8035846450366e-05;-2.2172405806486e-05;0.00033140787854791;1.3754167412117e-05;-0.00027213955763727;-9.6425185347471e-07;6.4579377067275e-05;-2.6090341634699e-05;0.00021392146300059;-4.9328009481542e-05;-0.00053980812663212;-9.6047253464349e-05;-0.00075042387470603;-5.61171816571e-07;9.0628942416515e-05;4.6101260522846e-05;-1.8277563867741e-05;1.1030835594283e-05;-0.00029849974089302;-5.9899462939939e-05;-0.00028311589267105;-4.0643571992405e-05;-0.00010556900815573;-5.3741961892229e-05;-0.00030986047931947;-0.00019200572569389;0.00016794654948171;0.00035033209132962;0.00015454841195606;0.00033882330171764;2.8110089260736e-05;0.0014813982415944;4.901249485556e-05;2.4265646061394e-05;3.5932829632657e-05;-0.00051543628796935;2.9748129236395e-05;0.00031750820926391;5.7966200984083e-05;-9.6191331977025e-05;-0.00014104023284744;-0.00036081054713577;-5.9954323660349e-05;-0.00020616114488803;7.6876232924405e-05;0.0003408117336221;2.1414767616079e-05;-2.556915023888e-05;-3.9762315282132e-05;-1.8406308299745e-05;3.1394931284012e-05;0.00063726317603141;-3.9098486013245e-06;0.00015127558435779;0.00036811738391407;-1.0204313184659e-05;-0.00033969525247812;-0.00013377208961174;-8.9160879724659e-05;0.00019486708333716;0.00017704187484924;0.00012656619946938;0.00036117527633905;-7.4840121669695e-05;-0.00057787023251876;-2.6190060452791e-05;-5.4927168093855e-06;2.4717128326301e-06;-0.00033821127726696;0.00011483026173664;-0.00027709061396308;-1.0999171536241e-05;-0.00037512832204811;0.00014004729746375;-0.0004018260515295;-1.3426159057417e-05;-0.00020105970907025;1.4445034139499e-05;-4.0471182728652e-05;-6.1857746914029e-05;0.00085727719124407;-5.732621275456e-07;-0.00056577270152047;1.099400651583e-05;9.2794689408038e-05;0.00017538307292853;1.8942353108287e-06;0.00014180481957737;-0.00018614162399899;0.00023709719243925;-0.00014337923494168;0.0001455933379475;1.7732118067215e-05;0.00021221752103884;-3.0800736567471e-05;0.00028366941842251;7.4377080636623e-06;-0.00018626818200573;-2.9701752168876e-07;4.1873798181769e-05;-3.6315759643912e-05;0.00020481534011196;-4.646016532206e-05;-0.00053943932289258;-6.3164130551741e-05;-0.00067914178362116;-1.812066329876e-06;5.6869947002269e-05;3.559354445315e-05;-1.0489921805856e-05;2.0557270545396e-05;-0.00026316556613892;-5.4753378208261e-05;-0.00028799337451346;-3.1628107535653e-05;-9.6299569122493e-05;-3.4459103517293e-06;-0.00025895534781739;-0.00015369376342278;0.00011312557762722;0.00031563660013489;0.00012238835915923;0.00029798917239532;2.0140594642726e-05;0.0013429519021884;3.8864240195835e-05;5.8113717386732e-05;2.953226066893e-05;-0.00043577849282883;2.6130650439882e-05;0.00027982753817923;8.773756417213e-05;-4.7937297495082e-05;0.00046138031757437;0.00014693141565658;0.00034829875221476;-7.0306350608007e-07;-0.00020474908524193;-9.0501256636344e-05;2.4712584490771e-05;-1.9105549654341e-05;2.3904800400487e-05;1.4123947948974e-05;-0.00036035064840689;-3.3534048270667e-05;-0.00014917562657502;5.5056402743503e-06;-0.00041719910223037;1.3497184227163e-05;0.00028900007600896;7.9263525549322e-05;0.00015073681424838;-0.00029828096739948;-0.00010426680091769;-0.00059848203090951;-9.0822475613095e-05;0.00043016514973715;7.6790063758381e-05;6.799884317843e-07;3.1494626455242e-05;0.00023053659242578;3.4896891065728e-07;-0.00032654861570336;0.00012821816198993;-0.00035942043177783;-4.881393033429e-05;-0.00040351072675548;0.00010567878052825;-0.00013395174755715;1.0255681445415e-05;-3.7473626434803e-05;6.9682218963862e-06;0.0009876819094643;-7.4008908995893e-05;-0.0005140055436641;3.3150886338262e-06;1.7105770893977e-05;1.9008586605196e-05;0.00021230924176052;1.9436080037849e-05;8.4045561379753e-05;0.00018186135275755;-0.0001666412135819;0.00014447643479798;-0.00011859643564094;0.00011436314525781;5.3252340876497e-05;0.00030425112345256;-4.3883905163966e-05;-0.00028652278706431;1.4009621736477e-05;0.00011787642870331;-1.0735615433077e-05;0.00021663094230462;-4.0918832382886e-05;-0.00054782611550763;-1.282553330384e-05;-0.0008515638182871;-3.681780435727e-05;7.6734540925827e-05;7.9990959420684e-06;-3.0723222153028e-05;4.4779219024349e-05;-0.00039947670302354;2.150164982595e-05;-0.00036623844061978;-2.8398824724718e-05;-8.2521451986395e-05;-3.439291685936e-05;-1.3152555766283e-05;-0.00021816675143782;-0.00016649665485602;0.00032901763916016;7.3493232775945e-05;0.00034650845918804;9.678606147645e-05;0.0015629559056833;-8.416066521022e-06;6.164957449073e-05;2.6560281185084e-05;-0.00034025925560854;1.92787447304e-05;0.0002750032581389;1.9296283426229e-05;0.00022105252719484;-0.00010322555317543;0.00056533917086199;0.00019100759527646;0.00029717630241066;-1.0329842552892e-05;-0.00020887024584226;-9.2886177299079e-05;3.1886498618405e-05;-1.2299529771553e-05;-0.00027709425194189;4.6570305130444e-05;-0.00029398885089904;-4.8001777031459e-05;-0.00013974335161038;-1.0249876140733e-05;-0.00054524600272998;-3.7189391150605e-05;0.00027274005697109;0.0001388139789924;0.00021693861344829;-0.00024349545128644;-0.00010827495862031;-0.00055379333207384;-0.00013019544712733;0.00040484915371053;0.00010309241770301;9.4528651970904e-05;3.3694472222123e-05;0.00018385962175671;1.3334633877093e-05;-0.00039486624882556;0.00014488396118395;-0.00029635353712365;-3.3142237953143e-05;-0.00022526203247253;9.7723503131419e-05;-0.00012963733752258;-1.1638109754131e-05;-3.4227621654281e-05;-2.4304022190336e-06;0.0013483494985849;-8.7101965618785e-05;-0.00046835976536386;-8.0610452641849e-06;-3.5158551327186e-05;2.7716554541257e-05;0.00018356880173087;7.279225246748e-05;0.00015175288717728;0.00015388944302686;-0.00016853655688465;2.8966444460821e-06;-0.00013514085731003;-0.00024574701092206;5.7735924201552e-05;0.00033554577385075;-3.1208732252708e-05;-0.0004623985150829;2.4279446733999e-05;0.00018108072981704;-1.2944873560627e-05;0.00020957762899343;-2.3261047317646e-05;-0.0004775554407388;-9.0807525339187e-06;-0.00097253068815917;-6.5311585785821e-05;0.00010783708421513;2.0698036678368e-05;-3.6445901059778e-05;5.3084073442733e-05;-0.00047548289876431;1.031493593473e-05;-0.00038945354754105;-2.5224702767446e-05;-0.00010637089872034;-4.3506817746675e-05;-9.111288090935e-05;-0.00024016007955652;-0.00020789154223166;0.00033444669679739;0.00013444507203531;0.00040438518044539;0.0001060678914655;0.0017350744456053;-7.7763106673956e-06;5.3453495638678e-05;3.1662741093896e-05;-0.00039872599882074;2.3661043087486e-05;0.0003251843736507;1.9998446077807e-05;0.0002560299471952;-0.00011237111903029;0.00060505681904033;0.00017962280253414;0.00030563573818654;-1.9362632883713e-05;-0.00017347717948724;-8.3390630607028e-05;2.9903827453381e-05;1.0389864968374e-07;-0.00042827383731492;5.3963096434018e-05;-0.0001277542905882;-5.7486951845931e-05;-7.0987240178511e-05;-2.228401353932e-05;-0.00054681033361703;-8.1209211202804e-05;0.00021032322547399;0.00014424748951569;0.00023505902208854;-0.00017126396414824;-8.3024810010102e-05;-0.00059025938389823;-0.0001227636821568;0.00026104802964255;0.00010697376274038;0.0001858702453319;3.2022395316744e-05;5.9758476709248e-05;2.5100483981078e-05;-0.00032470226869918;0.00011073041241616;-0.00017031232709996;1.058547059074e-05;-0.00017926094005816;7.4882584158331e-05;-7.9408913734369e-05;-1.3478183973348e-05;-3.7509966205107e-05;-4.107686891075e-06;0.0012237770715728;-6.7383618443273e-05;-0.0003696229250636;-8.3804470705218e-06;-6.5639884269331e-05;2.2506361347041e-05;7.4589501309674e-05;0.00010318554268451;0.0001583430566825;0.00012733356561512;-0.00011889658344444;-5.9215246437816e-05;-0.00014365802053362;-0.00029307778459042;2.5021543478942e-05;0.00028154568281025;-1.2823850738641e-05;-0.00047081228694879;2.4111513994285e-05;0.00019403685291763;-1.2358139429125e-05;0.00017892985488288;-1.2631691788556e-05;-0.00026139616966248;9.033567039296e-06;-0.00080378243001178;-7.2584189183544e-05;9.1338450147305e-05;1.774823613232e-05;-4.6221390221035e-05;5.4796702897875e-05;-0.00057315622689202;9.5833547675284e-06;-0.00037964977673255;-4.8287902245647e-06;-6.3165600295179e-05;-4.3033018300775e-05;-0.00017251989629585;-0.00019615454948507;-0.0001638239773456;0.00022913388966117;0.00017970992485061;0.00032110908068717;7.8811637649778e-05;0.0015748334117234;-2.8461932743085e-05;3.1179908546619e-05;3.0984105251264e-05;-0.00027456041425467;1.4614354768128e-05;0.0002611076051835;1.305591831624e-05;0.00030029058689252;-0.00011941143020522;0.0005191340460442;0.00015955956769176;0.00016494662850164;-2.1663901861757e-05;-0.00015000760322437;-7.2412600275129e-05;3.6633271520259e-05;7.1253257374337e-06;-0.00052305543795228;5.5541353503941e-05;-5.1595518016256e-05;-7.9130484664347e-05;-6.1249047575984e-05;-3.1247174774762e-05;-0.00051745277596638;-0.00014349834236782;0.00014175416436046;0.00021900491265114;0.00023338287428487;-5.2868766942993e-05;-5.723797949031e-05;-0.00045098568079993;-0.0001035234745359;0.00020394239982124;0.00011106092279078;0.000180324059329;4.0070946852211e-05;2.4771625248832e-05;3.7797468394274e-05;-0.0002660492900759;8.0279613030143e-05;-9.0988272859249e-05;4.1190756746801e-05;-7.5090960308444e-05;6.2141501985025e-05;-6.2997911300045e-05;-2.5657152946224e-05;-4.034151788801e-05;-4.4451730900619e-06;0.0011552706127986;-4.8112229706021e-05;-0.00026272528339177;-9.5018222054932e-06;-5.4125084716361e-05;2.1036472389824e-05;5.3233202379488e-06;0.00010700669372454;0.00018086151976604;0.000116342183901;-8.4305771451909e-05;-0.00012409134069458;-0.00014271901454777;-0.00041568596498109;-1.9254141534475e-06;0.00022784559405409;1.8010891835729e-06;-0.00045475695515051;2.2333861124935e-05;0.00015400821575895;-1.1922318662982e-05;0.00011657355935313;1.2508557119872e-05;-0.00012070941738784;3.9641749935981e-06;-0.00058114359853789;-9.4138325948734e-05;0.0001199568141601;6.1746168285026e-06;-4.5822198444512e-05;5.5401487770723e-05;-0.00044960872037336;-4.0543159229856e-06;-0.00024204775399994;-1.5863379303482e-06;-5.0112779717892e-05;-3.961798211094e-05;-0.0002027259033639;-0.00018502974126022;-0.00015335959324148;0.00016355916159227;0.00020422293164302;0.00022645502758678;0.00010348996875109;0.0012495953124017;-1.6830090316944e-05;-5.197354403208e-05;3.146480594296e-05;-0.00030875729862601;1.4118255421636e-05;0.00022867634834256;1.1356650247762e-05;0.00014282330812421;-0.00032062194077298;-0.00014768559776712;-0.0005930868210271;2.3422084268532e-05;-0.00015803641872481;6.7606968514156e-05;0.0002731169515755;1.4353807273437e-05;-7.1506925451104e-05;-9.5538453024346e-05;0.000534093065653;0.00011263075430179;0.0001170834293589;3.0621689802501e-05;9.6549178124405e-05;0.00054719531908631;0.00013764039613307;-0.00020240039157216;-0.00030142409377731;-0.00015198779874481;0.00013845428475179;-1.7190835933434e-05;0.00012022986629745;0.00047499110223725;-0.00014321302296594;-0.00030332306050695;-4.4231728679733e-05;-0.0001563887053635;-4.1641960706329e-05;-8.2534388639033e-05;0.00010166778520215;-0.00029514654306695;9.2408343334682e-05;-2.1358595404308e-05;6.7491477238946e-05;-4.1285926272394e-05;-5.9539135691011e-05;-0.00015554965648334;-6.0726124502253e-06;-2.863632653316e-05;-5.5957341828616e-05;0.0012752339243889;-1.8766546418192e-05;-0.00033281810465269;1.5147955309658e-05;-6.0643498727586e-05;-8.2165890489705e-05;0.00012054214312229;0.00027657131431624;-7.9599238233641e-05;0.00015684487880208;-0.00017441374075133;-0.00017861671221908;-3.1260187824955e-05;-0.00054488069145009;3.1953055440681e-05;0.00033070764038712;2.1448246116051e-05;-0.0004945412511006;-4.190622803435e-06;0.00017542587011121;2.8719035981339e-05;0.00011323991930112;-3.6587193790183e-06;-6.9436122430488e-05;-0.00014739850303158;-0.00060065020807087;1.8499165889807e-05;0.00014066809671931;6.0391364968382e-05;-4.9164871597895e-05;-2.1598620151053e-05;-0.00042053061770275;-1.4171147086017e-05;-0.00018272282613907;-5.3673131333198e-05;-5.4040894610807e-05;-0.00028292142087594;-0.00026549192261882;-0.0001947230193764;0.0003030146472156;0.00020354644220788;0.0001293946406804;0.00028486986411735;2.1673704395653e-06;0.0012166951783001;4.8446647269884e-05;-8.9903034677263e-05;2.2737309336662e-05;-0.00040027644718066;2.0443163521122e-05;0.0002575286780484;0.00014963770809118;-0.00030833695200272;-0.00018969984375872;-0.00077072408748791;4.0146482206183e-05;-0.00038516204222105;8.7945983977988e-05;0.00029473821632564;1.9725130186998e-05;-6.7513639805838e-05;-0.00010051043500425;0.0005245121428743;9.4027316663414e-05;0.00011725048534572;2.7427940949565e-05;9.702448733151e-05;0.00063873850740492;7.3268965934403e-05;-0.00028326862957329;-0.00034051999682561;-5.2473737014225e-05;0.00015795617946424;0.00014487400767393;0.00015518258442171;0.00070510344812647;-0.00015568206436001;-0.00032433780143037;-3.6987563362345e-05;-0.00019446859369054;-3.2409312552772e-05;-8.5464896983467e-05;0.00014393367746379;-0.00037929267273284;7.1832568210084e-05;-4.8535457608523e-05;8.0635836638976e-05;-0.00011598999117268;-4.8341786168749e-05;-0.00018557440489531;-1.1132920917589e-05;-1.9835812054225e-05;-8.865594281815e-05;0.0014580610441044;-1.6302528820233e-05;-0.00044231044012122;2.0276196664781e-05;-0.00010501459473744;-4.5702588977292e-05;0.00013114840839989;0.00027299643261358;-0.00010644822759787;0.00016226497245952;-0.00018979377637152;-0.00013477685570251;-3.1797001156519e-06;-0.00055195775348693;1.6919691915973e-05;0.00043042647303082;2.8885908250231e-05;-0.00057378050405532;-8.0072359196492e-06;0.00025725204613991;7.6543057048184e-07;0.00018446783360559;1.283016808884e-05;-0.00016521904035471;-0.00012872612569481;-0.00090841064229608;3.5025677789235e-05;0.00011736072337953;6.4104839111678e-05;-5.6918590416899e-05;-2.5130430003628e-06;-0.00062321021687239;-1.1115940651507e-05;-0.00035334459971637;-6.0857135395054e-05;-6.6954584326595e-05;-0.00029593374347314;-0.00027988190413453;-0.00021534149709623;0.00030240390333347;0.00027424731524661;9.6077274065465e-05;0.00041716924170032;-2.5158882635878e-05;0.0016415569698438;5.0375016144244e-05;-2.6594656787893e-07;2.2236785298446e-05;-0.00034930199035443;2.0224684703862e-05;0.00030430799233727;0.00014423695392907;-0.00027953664539382;-0.00022637071378995;-0.00078348658280447;1.3899801160733e-05;-0.00042877253144979;0.00011103844008176;0.00038530913298018;3.0564129701816e-05;-6.874374957988e-05;-9.3785027274862e-05;0.00035874161403626;8.3961283962708e-05;0.0003881189331878;1.6185516869882e-05;0.00017813552403823;0.00068951910361648;2.9879009161959e-05;-0.00039854919305071;-0.00033282893127762;-6.6789601987693e-05;0.00021100144658703;0.00024813364143483;0.00018564745550975;0.00074720056727529;-0.00016023448552005;-0.00054761726642027;-4.2618910811143e-05;-0.00011334632290527;-1.9446068108664e-05;-0.00025944653316401;0.00019061194325332;-0.00046985360677354;2.9284947231645e-05;-0.00024443207075819;0.00013430730905384;-0.0002576002443675;-4.6359702537302e-05;-0.00026853760937229;-5.2471996241366e-06;-2.7009506084141e-05;-0.00011812963202829;0.0016380769666284;-1.3634084098157e-05;-0.00063994573429227;2.7229474653723e-05;-4.6367709728656e-05;8.3037033618893e-05;8.7052161688916e-05;0.0002848437288776;-0.00018598970200401;0.00024801830295473;-0.00020599071285687;-3.0725521355635e-05;2.8915319489897e-05;-0.00039312490844168;-1.0771626875794e-05;0.00051364937098697;3.12818265229e-05;-0.00056275754468516;-9.4587057901663e-06;0.0002396274212515;-2.2071060811868e-05;0.00025457848096266;-1.4296715562523e-05;-0.00046059835585766;-0.00012739079829771;-0.0011164946481586;2.943726212834e-05;0.00014289798855316;6.6954577050637e-05;-4.9666054110276e-05;7.7869726737845e-06;-0.00057804334210232;-4.0586135582998e-05;-0.00040695469942875;-6.1827173340134e-05;-0.00012169719411759;-0.00020826038962696;-0.00035830269916914;-0.00026652391534299;0.00026782471104525;0.00041759992018342;0.00014573580119759;0.00050510646542534;-3.1502584079135e-06;0.0019688212778419;5.6408058298985e-05;2.7935302568949e-05;3.5451805160847e-05;-0.00052186759421602;2.8605054467334e-05;0.00040258737863041;7.8051285527181e-05;-0.00014044011186343;-0.00016197477816604;-0.00052271690219641;-1.0403774467704e-05;-0.0003391174832359;8.774411980994e-05;0.00030883448198438;2.5008974262164e-05;-4.0720165998209e-05;-4.9042155296775e-05;9.3392118287738e-05;4.7270139475586e-05;0.00043041023309343;2.3144139049691e-06;0.00015515089035034;0.00046612278674729;-1.3207109986979e-05;-0.00033744180109352;-0.0002047434245469;-4.014648948214e-05;0.00017226475756615;0.00023831850558054;0.00013142520037945;0.00055296806385741;-0.00010363674664404;-0.00048996473196894;-3.1402003514813e-05;-2.842785033863e-05;-3.7857453207835e-06;-0.00027210472035222;0.00014249882951844;-0.00033808397711255;-2.6159309527429e-06;-0.00030072158551775;0.00012821584823541;-0.00032545084832236;-2.2409758457798e-05;-0.00021702671074308;3.5504097013472e-06;-2.8882110200357e-05;-8.564192103222e-05;0.0011002268875018;-2.8137906156189e-06;-0.00056246679741889;1.9407312720432e-05;1.4136516256258e-05;0.00013381948519964;2.5034123609657e-05;0.00017984773148783;-0.00017353480507154;0.00023029115982354;-0.00015041978622321;7.7379190770444e-05;2.7901322027901e-05;-4.5040957047604e-05;-2.6945164790959e-05;0.00037757444079034;1.7719816241879e-05;-0.00033021054696292;-6.6920842982654e-06;0.00014135371020529;-3.5557564842748e-05;0.00021661150094587;-2.3011720259092e-05;-0.00048664436326362;-6.8882422056049e-05;-0.00084013666491956;1.4764200386708e-05;8.9301087427884e-05;4.4429070840124e-05;-2.8689688406303e-05;1.9694138245541e-05;-0.00038054990000091;-3.9248716348084e-05;-0.00033227482344955;-3.9382935938193e-05;-0.00010218265379081;-7.2895338234957e-05;-0.00027048762422055;-0.00018738002108876;0.00014417004422285;0.00034842651803046;0.0001119360604207;0.00037059732130729;3.5805945231004e-07;0.0015082211466506;3.6762463423656e-05;5.2836800023215e-05;2.642153413035e-05;-0.00041204094304703;2.2754175006412e-05;0.00031208124710247;0.0003249878063798;-0.00014888541772962;0.0007803980843164;0.00021028546325397;0.00049626122927293;-7.4468480306678e-05;-0.00011984840966761;-9.4182330940384e-05;3.6539335269481e-05;-2.826599711625e-06;-0.00064613332506269;7.6341835665517e-05;0.00014386037946679;-5.0750517402776e-05;-3.8166563172126e-05;-2.7833209969685e-05;-0.00064101634779945;-5.9051453717984e-05;0.00020485879213084;3.4581564250402e-05;0.00030617043375969;-0.00027061408036388;-4.565404378809e-05;-0.00072964624268934;-0.00014770288544241;9.9502380180638e-05;0.00012867999612354;0.0002629903901834;2.3345555746346e-05;-5.6553581089247e-05;2.4530243535992e-05;-0.00040389411151409;0.00013946095714346;-8.7542423443665e-07;5.4568336054217e-06;3.2617874239804e-05;4.5273198338691e-05;-0.00010519998613745;-1.6908375982894e-05;1.6764278143455e-06;-2.5273435312556e-05;0.0014954819343984;-8.9398978161626e-05;-0.00027801058604382;-1.6630943719065e-05;-0.00016722960572224;2.9022694434389e-05;2.8803453460569e-05;0.00014737735909875;0.00018323741096538;3.18039310514e-05;-8.575326501159e-05;-0.00014845037367195;-0.00014143508451525;-0.00076191336847842;4.6570647100452e-05;0.00037645135307685;-5.2297023103165e-06;-0.000627004832495;3.3676529710647e-05;0.00028957321774215;-1.3275780474942e-05;0.00018641934730113;-1.2553789019876e-05;-0.00014472482143901;3.5032368032262e-05;-0.0010689967311919;-7.6094249379821e-05;9.5675641205162e-05;5.6318254792131e-05;-5.5168133258121e-05;5.6655084335944e-05;-0.0007452933350578;6.6770890043699e-06;-0.00043691034079529;5.5624554988754e-06;-6.4435043896083e-05;-5.61121305509e-05;-0.00025130505673587;-0.0001651077036513;-0.0002057542296825;0.00022271391935647;0.00020843156380579;0.00046025298070163;2.3524107746198e-05;0.0017505190335214;-4.3048064981122e-05;6.6188767959829e-05;3.2809115509735e-05;-0.00017626398766879;1.3568865142588e-05;0.00026947649894282;1.1942591299885e-05;0.00038294499972835;-0.00016464326472487;0.0006849059718661;0.00019666546722874;0.00030155200511217;-5.0836129958043e-05;-0.00011946126323892;-7.2352639108431e-05;3.3054377126973e-05;5.5771693041606e-06;-0.00082277244655415;8.9643632236402e-05;0.00012887739285361;-5.5090891692089e-05;-5.3394355745695e-06;-3.5860819480149e-05;-0.0006009831558913;-0.00010453736467753;0.00014728341193404;0.00010142234532395;0.00029007962439209;-0.00012690604489762;-5.2948289521737e-05;-0.00048300015623681;-0.00014934637874831;7.68638055888e-05;0.00011990301572951;0.00033109690411948;2.0445333575481e-05;-9.8886899650097e-05;3.2649681088515e-05;-0.00032827293034643;9.7937561804429e-05;4.2832289182115e-05;3.8396843592636e-05;0.00010449942783453;4.0116708987625e-05;-7.0566267822869e-05;-2.4163267880795e-05;-3.2637199183227e-06;-2.4406379452557e-05;0.0014027751749381;-6.1915248807054e-05;-0.00019189715385437;-1.6466668967041e-05;-0.00016383336333092;2.5510491468594e-05;-2.1281672161422e-05;0.00016512299771421;0.00019422741024755;1.8081122107105e-05;-6.8959263444412e-05;-0.00020752214186359;-0.0001436217862647;-0.00080202729441226;1.4219326658349e-05;0.00031054706778377;7.0300584411598e-06;-0.00061861431458965;2.8336251489236e-05;0.00026807145331986;-1.0892662430706e-05;0.00013370109081734;8.5227211457095e-06;1.3130696743247e-06;2.8786960683647e-05;-0.00091453245840967;-8.6730149632785e-05;9.4593844551127e-05;5.4049494792707e-05;-4.9728714657249e-05;5.3462739742827e-05;-0.00069274689303711;-2.8140134418209e-06;-0.00036567190545611;8.8771948867361e-06;-5.7930697948905e-05;-5.3520685469266e-05;-0.0002793425519485;-0.00013504213711713;-0.0001875062007457;0.00014091428602114;0.00023123587016016;0.00039585382910445;1.8290342268301e-05;0.0015306446002796;-3.6488498153631e-05;3.8412621506723e-05;3.1841824238654e-05;-0.00017234706319869;1.2376593076624e-05;0.00024070985091385;1.0814973393281e-05;0.00044339351006784;-0.0001749003859004;0.00058397831162438;0.00017921160906553;0.00012549008533824;-4.0604143578093e-05;-0.00011520570114953;-6.1573002312798e-05;3.987064701505e-05;1.0686816494854e-05;-0.00094489444745705;9.3350718088914e-05;0.00014365634706337;-7.812097464921e-05;-8.2325514085824e-06;-4.2465435399208e-05;-0.00057574693346396;-0.00017338979523629;9.2043221229687e-05;0.00020423787645996;0.00028470432152972;1.660905013523e-06;-4.1260707803303e-05;-0.00030230960692279;-0.00013486633542925;6.8236775405239e-05;0.00012215402966831;0.00033383269328624;3.0064358725213e-05;-0.00010753993410617;4.4537668145495e-05;-0.00026467294082977;6.1142527556513e-05;8.3552695286926e-05;7.3268922278658e-05;0.00016523613885511;3.9944767195266e-05;-5.8512756368145e-05;-3.4272437915206e-05;-9.4695014922763e-06;-2.3494216293329e-05;0.0013718034606427;-3.646303593996e-05;-0.0001170594478026;-1.4746030501556e-05;-0.00014793698210269;2.3907185095595e-05;-7.6700787758455e-05;0.00016885364311747;0.00021834218932781;2.7110785595141e-05;-4.9831498472486e-05;-0.00025531646679156;-0.00015254892059602;-0.00088575173867866;-2.061306622636e-05;0.00026887247804552;1.8325259588892e-05;-0.00061907322378829;2.3105840227799e-05;0.00023306922230404;-1.0072158147523e-05;7.1076312451623e-05;3.6626450309996e-05;0.00012501784658525;1.8261287550558e-05;-0.00072701112367213;-0.00011181639274582;0.00012867510668002;4.0968949178932e-05;-4.731718217954e-05;5.4797885240987e-05;-0.00056994345504791;-1.8234411982121e-05;-0.00024137388390955;8.0181689554593e-06;-5.9691363276215e-05;-5.052763299318e-05;-0.00030664348741993;-0.00013321272854228;-0.00018434532103129;8.7082626123447e-05;0.00025834018015303;0.00030970794614404;5.1726845413214e-05;0.0012709802249447;-2.0026656784466e-05;-3.7664340197807e-05;3.3549917134224e-05;-0.00024492444936186;1.4247268154577e-05;0.00023288564989343;1.0769714208436e-05;0.00021277063933667;-0.00048010135651566;-0.00017998243856709;-0.00075969600584358;5.7810997532215e-05;-0.0001784389896784;6.7997774749529e-05;0.00026310258544981;1.4906425349182e-05;-8.4568368038163e-05;-0.00014874938642606;0.00094571564113721;0.00013254140503705;-6.9467532739509e-05;4.5247972593643e-05;6.5763357270043e-05;0.00067371345357969;0.00016458095342387;-0.00018583283235785;-0.00039849855238572;-0.00012624764349312;0.0001408860553056;-4.2363397369627e-05;0.00016095324826892;0.00046226714039221;-0.00017904565902427;-0.00021120019664522;-4.0262457332574e-05;-0.00030034515657462;-5.515298107639e-05;3.1695348297944e-05;0.00010301599832019;-0.00034164320095442;0.00013230000331532;0.0001314886030741;4.4892371079186e-05;0.00016724926535971;-7.3069139034487e-05;-0.00015702981909271;-2.4149621822289e-05;-4.474521119846e-06;-5.7220073358621e-05;0.0016610241727903;-2.5718300094013e-05;-0.00025125793763436;1.9758013877436e-05;-0.00017300432955381;-0.00016649025201332;0.00020177326223347;0.00033812332549132;-5.3714742534794e-05;8.21838984848e-05;-0.00020030939776916;-0.00032794495928101;-4.724243626697e-05;-0.0010292031802237;5.2899653383065e-05;0.00041529460577294;2.622760439408e-05;-0.00073559634620324;-4.8991637413565e-06;0.00029673665994778;5.6941291404655e-05;8.8145920017269e-05;1.7388316337019e-05;0.00015361391706392;-0.00018748524598777;-0.00084601482376456;5.2261279051891e-05;0.00017490031314082;6.7929497163277e-05;-5.8245066611562e-05;-4.2141138692386e-05;-0.00059999397490174;-3.9760484469298e-06;-0.00021100835874677;-7.0544876507483e-05;-7.7845455962233e-05;-0.00043203964014538;-0.00025129236746579;-0.00025199429364875;0.00039832442416809;0.00016744775348343;9.9778939329553e-05;0.000406721199397;-3.0317366963573e-06;0.0014215494738892;5.7309953263029e-05;-8.2487429608591e-05;2.5902805646183e-05;-0.00039274484151974;2.1478123017005e-05;0.00030115206027403;0.0002321654901607;-0.0004898082697764;-0.00023724463244434;-0.0009894062532112;8.4281775343698e-05;-0.00042401484097354;9.5394418167416e-05;0.00029792141867802;2.061883242277e-05;-8.9079338067677e-05;-0.00015959513257258;0.00095417769625783;0.00012573234562296;-8.2412589108571e-05;4.6317480155267e-05;7.6514312240761e-05;0.00081796693848446;0.00011738181638066;-0.00027455383678898;-0.00046639409265481;-4.4007134420099e-05;0.00016112531011458;0.00011765860108426;0.00020349635451566;0.00075373245636001;-0.00020679798035417;-0.00024272562586702;-3.8532485632459e-05;-0.00033319368958473;-5.0790160457836e-05;2.407078682154e-05;0.00016432757547591;-0.00046568590914831;0.00011417183850426;0.00012412773503456;5.3314364777179e-05;0.0001240546698682;-7.0817855885252e-05;-0.00020024647528771;-2.9677868951694e-05;2.6386749141238e-06;-0.00010446736996528;0.0019509135745466;-2.8802331144107e-05;-0.00036941407597624;2.6659667128115e-05;-0.00021706375991926;-0.00014406665286515;0.00022133758466225;0.00036213808925822;-7.6328215072863e-05;9.0191031631548e-05;-0.00022383528994396;-0.00031543479417451;-1.1080042895628e-05;-0.001116321538575;4.4140670070192e-05;0.00053050188580528;4.0205566619989e-05;-0.00084589194739237;-9.5432696980424e-06;0.00037995455204509;3.2515148632228e-05;0.00016861328913365;3.3131127565866e-05;4.6023196773604e-05;-0.00018751980678644;-0.0011662606848404;6.6464439441916e-05;0.0001682524161879;7.8181343269534e-05;-7.1840004238766e-05;-2.691173722269e-05;-0.00081510382005945;-3.0189726203389e-06;-0.00037515047006309;-8.240454189945e-05;-8.7990491010714e-05;-0.00047058289055713;-0.00029679684666917;-0.00028899707831442;0.00042856502113864;0.00025769358035177;8.715431613382e-05;0.00055074860574678;-2.7627567760646e-05;0.0019028125097975;6.5731968788896e-05;-1.752856769599e-05;2.8343922167551e-05;-0.00037813573726453;2.2694601284456e-05;0.00035894382745028;0.00019117067859042;-0.00037983065703884;-0.0002360350190429;-0.00098266452550888;8.8089363998733e-05;-0.0005710557452403;0.00010630526230671;0.00028383370954543;2.4116025088006e-05;-7.7902397606522e-05;-0.00012741659884341;0.00070121063617989;9.8676049674395e-05;-3.7996127502993e-05;3.4361532016192e-05;8.8479835540056e-05;0.00077607564162463;5.1650626119226e-05;-0.00031549294362776;-0.0004263854061719;2.71990775218e-05;0.00014902117254678;0.00025288175675087;0.00019151999731548;0.00089271570323035;-0.00019015837460756;-0.00025926460511982;-3.4443462936906e-05;-0.00026237496058457;-3.5266777558718e-05;-2.1019430278102e-05;0.00018934262334369;-0.00048466451698914;7.1074246079661e-05;6.6347238316666e-05;5.908345701755e-05;9.2547152235056e-06;-5.1674742280738e-05;-0.00021523392933886;-2.6260302547598e-05;5.3551207201963e-06;-0.00012616899039131;0.0017981347627938;-2.3248985598912e-05;-0.00043262462713756;2.6911386157735e-05;-0.00019073949079029;-8.4134793723933e-05;0.00017920244135894;0.00030844775028527;-8.6002961324994e-05;9.9533666798379e-05;-0.0002057392266579;-0.00020381809736136;2.2704882212565e-05;-0.00090527907013893;2.3280505047296e-05;0.00053457648027688;4.2865707655437e-05;-0.00074510357808322;-1.1661374628602e-05;0.00035623979056254;6.530275413752e-07;0.00021462999575306;3.6789573641727e-05;-0.00010425168875372;-0.00015079196600709;-0.0012095434358343;5.9745776525233e-05;0.00013514701277018;7.2970971814357e-05;-6.9217574491631e-05;-6.0538613979588e-06;-0.00081974419299513;-5.6042031246761e-06;-0.00043522124178708;-7.5693627877627e-05;-8.0337711551692e-05;-0.00039480638224632;-0.00029594797524624;-0.00026741586043499;0.00036296204780228;0.00030996280838735;7.5249772635289e-05;0.00056251889327541;-4.0480616007699e-05;0.0019601399544626;6.0828668210888e-05;3.2644984457875e-05;2.581666012702e-05;-0.00031946218223311;2.0639308786485e-05;0.00034387299092487;0.00045426859287545;-0.00020753857097588;0.00083519471809268;0.0002255941653857;0.0004148411389906;-8.0947953392752e-05;-7.5830714195035e-05;-6.6512628109194e-05;2.4287135602208e-05;1.2927959687659e-05;-0.0011213573161513;0.00012369765317999;0.0003370878403075;-3.1891413527774e-05;8.9416702394374e-05;-4.7537294449285e-05;-0.00066541251726449;-8.3309052570257e-05;0.00011999724665657;-1.3407512597041e-05;0.00034192463499494;-0.00015390935004689;-3.6330584407551e-05;-0.00049483153270558;-0.00018931464001071;-0.00010559187649051;0.00012780318502337;0.00050323375035077;-1.4225668110157e-06;-0.00026769615942612;3.2566935260547e-05;-0.00035008575650863;0.00010097965423483;0.00023822755611036;4.9396534450352e-05;0.00031330424826592;1.5990121937648e-07;-4.9743586714612e-05;-2.2473861463368e-05;2.756500725809e-05;-3.9610655221622e-05;0.0014774983283132;-6.7696943006013e-05;-5.885561768082e-05;-2.4951586965472e-05;-0.0002496030065231;2.3286353098229e-05;-9.6086914709304e-05;0.00023048050934449;0.00019838282605633;-0.00010956495680148;-1.9586723283282e-05;-0.00030694523593411;-0.00014134083176032;-0.0011372599983588;1.9686662199092e-05;0.00031826106715016;2.3607042749063e-05;-0.00070736615452915;3.4616838092916e-05;0.00033352265018038;-7.8033272075118e-06;0.00013831093383487;6.7315800151846e-06;0.00021225155796856;5.7694040151546e-05;-0.0010865228250623;-8.420406084042e-05;4.9781396228354e-05;9.5948424132075e-05;-5.4842694225954e-05;5.1078732212773e-05;-0.0009402590803802;-2.8513275651676e-07;-0.00044957094360143;2.4718434360693e-05;-2.8172622478451e-05;-6.7126311478205e-05;-0.00037715918733738;-5.5842425354058e-05;-0.00018904043827206;4.2520467104623e-05;0.000277204439044;0.000500543625094;-8.0705816799309e-05;0.0016436012228951;-6.2363302276935e-05;0.00010482170182513;3.562983329175e-05;3.0202403650037e-05;6.4136984292418e-06;0.0001898187038023;8.823685675452e-06;0.00054669141536579;-0.00023430482542608;0.00078864663373679;0.00022984723909758;0.00025428194203414;-6.6160289861728e-05;-8.9954897703137e-05;-5.8265417465009e-05;2.9704635380767e-05;1.6644573406666e-05;-0.0013280011480674;0.00013908807886764;0.0003161394270137;-4.7764369810466e-05;8.6169879068621e-05;-5.4505850130226e-05;-0.00068621506216004;-0.00014135947276372;9.0025132521987e-05;8.1854843301699e-05;0.00035343616036698;-4.6083798224572e-05;-4.4003285438521e-05;-0.00031183238024823;-0.00019821555179078;-8.3864280895796e-05;0.00013329280773178;0.00055247888667509;3.7690765566367e-06;-0.00027383290580474;4.2292896978324e-05;-0.00032174441730604;7.4350500653964e-05;0.00024689789279364;7.975529297255e-05;0.0003736803191714;9.7754618764156e-06;-4.372527837404e-05;-3.3110496588051e-05;2.3632226657355e-05;-4.1441635403316e-05;0.0015895743854344;-4.8549987695878e-05;-2.2199421437108e-05;-2.472170672263e-05;-0.00025723429280333;2.4761455279076e-05;-0.00012381904525682;0.00024995944113471;0.0002328839909751;-9.7501040727366e-05;-2.4861492420314e-05;-0.00036642717896029;-0.00015841002459638;-0.0012667181435972;-8.3502991401474e-06;0.00031398926512338;3.0871215130901e-05;-0.00077526835957542;3.0894352676114e-05;0.00034025221248157;-7.1952708822209e-06;9.5445291663054e-05;3.1653056794312e-05;0.00030156222055666;4.6536370064132e-05;-0.001046038698405;-0.0001081371519831;8.1443125964142e-05;9.3994509370532e-05;-5.3008629038231e-05;5.4042331612436e-05;-0.00089130154810846;-1.4458193618339e-05;-0.00039385148556903;2.1264777387842e-05;-4.801589238923e-05;-6.8654328060802e-05;-0.00041026846156456;-6.0456459323177e-05;-0.00020610055071302;1.2322276234045e-05;0.00031034037237987;0.00047974567860365;-5.8291410823585e-05;0.0015871163923293;-4.7389847168233e-05;6.6516586230136e-05;3.8584636058658e-05;-5.3816860599909e-05;1.095962124964e-05;0.00021773918706458;1.0523165656195e-05;0.00062246830202639;-0.00024380112881772;0.00065628770971671;0.00020845179096796;3.9541489968542e-05;-4.9049776862375e-05;-9.5348463219125e-05;-4.8465928557562e-05;3.9644444768783e-05;1.9042865460506e-05;-0.0014664492337033;0.00014062713307794;0.00029525306308642;-7.7100485214032e-05;6.2738676206209e-05;-5.8220965001965e-05;-0.00065596296917647;-0.00022356190311257;3.9301219658228e-05;0.00021930837829132;0.00034344184678048;9.5074850833043e-05;-3.5862914955942e-05;-8.8864901044872e-05;-0.00017934912466444;-5.605199112324e-05;0.00013482182112057;0.00054278288735077;1.8004542653216e-05;-0.00025310169439763;5.4400483350037e-05;-0.00024754810146987;2.8342667064862e-05;0.00025415307027288;0.00012067718489561;0.00040892855031416;2.2575382899959e-05;-4.0126062231138e-05;-4.3096501030959e-05;1.5764502677484e-05;-4.0330203773919e-05;0.0016009225510061;-1.5281131709344e-05;3.3231015549973e-05;-1.9893457647413e-05;-0.00023883492394816;2.3903241526568e-05;-0.00016880809562281;0.00025090362760238;0.00026282062754035;-6.6840642830357e-05;-2.0145454982412e-05;-0.0004041992360726;-0.00017579080304131;-0.0013438944006339;-5.3057687182445e-05;0.00028791837394238;3.8992791814962e-05;-0.00079591758549213;2.1726955310442e-05;0.00030909731867723;-6.1935843405081e-06;2.0845405742875e-05;6.6650558437686e-05;0.00041708926437423;2.7989883164992e-05;-0.00086837285198271;-0.00013856624718755;0.00013156555360183;7.8013406891841e-05;-4.8480673285667e-05;5.5923588661244e-05;-0.00073237472679466;-3.4427961509209e-05;-0.00025609869044274;1.5427149264724e-05;-6.7626271629706e-05;-6.4988613303285e-05;-0.0004291977675166;-6.7891851358581e-05;-0.00021362213010434;-3.2535543141421e-05;0.00033584679476917;0.00039162949542515;-8.8172064351966e-06;0.0013382345205173;-2.1597217710223e-05;-1.79854396265e-05;4.0557082684245e-05;-0.00018163648201153;1.5870111383265e-05;0.00023652501113247;1.2051827070536e-05;0.00048088835319504;-0.00017860870866571;0.00041404904914089;0.00013590167509392;-5.2435421821428e-05;-2.8592712624231e-05;-6.4107924117707e-05;-2.8425667551346e-05;3.1523763027508e-05;1.4771231690247e-05;-0.0011387593112886;0.00010266997560393;0.0002292256540386;-6.5911313868128e-05;4.7623416321585e-05;-4.2974836105714e-05;-0.00044616343802772;-0.00019237001833972;7.9253862850237e-07;0.0002009994641412;0.00024014124937821;0.00012826338934246;-1.9723382138181e-05;3.8337704609148e-05;-0.00011909796739928;-5.3394607675727e-05;9.4991424703039e-05;0.00040404699393548;1.6909883925109e-05;-0.00019435296417214;4.3782474676846e-05;-0.00013346556806937;-5.2524014790833e-06;0.00021472555818036;0.00010802929318743;0.00032293185358867;1.8078217181028e-05;-2.3909744413686e-05;-3.2195253879763e-05;1.2227696970513e-05;-3.0459616027656e-05;0.0011270800605416;7.2642301347514e-06;6.8377630668692e-05;-1.1501757398946e-05;-0.00017232389654964;1.5519868611591e-05;-0.00015332429029513;0.00018934416584671;0.0001978300861083;-5.365717515815e-05;-4.7122493924689e-06;-0.00030989351216704;-0.00013610854512081;-0.0010188034502789;-6.1367667512968e-05;0.00019320142746437;3.3030064514605e-05;-0.00057968584587798;1.0175591341977e-05;0.00021205209486652;-3.2068930977402e-06;-2.2176616766956e-05;6.3304505601991e-05;0.0003900962183252;1.5361740224762e-05;-0.00055614463053644;-0.00010996368655469;0.00010823607590282;5.390313162934e-05;-3.2521660614293e-05;3.9816466596676e-05;-0.00048611548845656;-3.2670064683771e-05;-0.00012875179527327;1.1496576917125e-05;-5.1757524488494e-05;-4.5815577323083e-05;-0.00032628863118589;-3.8802019844297e-05;-0.00015362435078714;-6.0869882872794e-05;0.00025488529354334;0.00025076646124944;1.2072548543074e-06;0.00084255490219221;-8.0393565440318e-06;-4.1159171814797e-05;2.8994614694966e-05;-0.00015259241627064;1.1767258911277e-05;0.00016605656128377;8.84587825567e-06;0.00018315947090741;-0.0004499414935708;-9.8670767329168e-05;-0.00048349931603298;4.0050610550679e-05;4.2476458474994e-05;2.3285399947781e-05;0.00015155228902586;4.5851115828555e-06;-5.9284713643137e-05;-0.0001375985739287;0.0010153790935874;0.00010808461956913;-0.0001726799091557;4.164830170339e-05;-1.1822204214695e-05;0.00044086354319006;0.00016801492893137;-4.871338387602e-05;-0.00029597466345876;-0.00011425722186686;9.0618050307967e-05;-0.00017752732674126;0.00011048317537643;6.2127161072567e-05;-0.00012551838881336;-3.5806067899102e-05;-2.1848849428352e-05;-0.00033935208921321;-5.1439936214592e-05;0.00014160673890729;7.3357318797207e-06;-0.00014663442561869;0.000147666563862;0.00022454709687736;9.596246854926e-06;0.00029488053405657;-5.5421409342671e-05;-6.342963752104e-05;-2.6704259653343e-05;1.0960080544464e-05;1.0275204658683e-05;0.0011787790572271;-1.7071124602808e-05;-9.858616067504e-06;8.2233163993806e-06;-0.00018016636022367;-0.00020805570238736;0.00020451558521017;0.0002534527448006;1.5722363286841e-06;-2.4089644284686e-05;-0.00015096249990165;-0.00034515804145485;-8.8292785221711e-05;-0.00098656641785055;6.0421367379604e-05;0.00025199758238159;4.8726883505879e-06;-0.00060843589017168;1.9165154299117e-06;0.00023983416031115;7.9100638686214e-05;-2.4285467588925e-05;1.9083357983618e-05;0.00041835790034384;-0.00015390594489872;-0.00055156246526167;5.9855392464669e-05;0.0001303141907556;4.289338903618e-05;-3.4180542570539e-05;-5.2920910093235e-05;-0.00044912230805494;8.0810168583412e-06;-7.1664842835162e-05;-5.4843862017151e-05;-5.7743778597796e-05;-0.00039428612217307;-9.9510078143794e-05;-0.00018258378258906;0.00033111308584921;-2.7038609914598e-05;2.7738733479055e-05;0.00028015524731018;4.9654036047286e-06;0.00080592330778018;3.8935846532695e-05;-7.5450065196492e-05;1.5042264749354e-05;-0.0002320415514987;1.55896468641e-05;0.00018399086548015;0.00026320700999349;-0.00060275034047663;-0.00017918665253092;-0.00079821946565062;6.7046552430838e-05;-9.8654956673272e-05;4.811763210455e-05;0.00022722082212567;8.1819007391459e-06;-8.1421581853647e-05;-0.000193995248992;0.0013389273080975;0.00013384732301347;-0.00022993955644779;5.8022607845487e-05;-1.2919976143166e-05;0.00068946741521358;0.00019293205696158;-0.00012120592873544;-0.0004357076541055;-0.00010274908709107;0.00013474856677931;-0.00013733492232859;0.00018487655324861;0.00028054966242053;-0.00018416575039737;-7.0508467615582e-05;-2.4918730559875e-05;-0.00047350296517834;-6.5648440795485e-05;0.00018568421364762;5.8980578614864e-05;-0.00029283505864441;0.00017982923600357;0.00030348938889802;1.2239299394423e-05;0.00037510911352001;-7.4952549766749e-05;-0.0001095787883969;-3.764755820157e-05;1.7247290088562e-05;-2.5819916118053e-05;0.0017476157518104;-2.8757909603883e-05;-8.8729604613036e-05;1.5252559933288e-05;-0.00026140728732571;-0.0002627233043313;0.00028531142743304;0.00035386098898016;-9.088238584809e-06;-3.2218991691479e-05;-0.00021151281544007;-0.00045908315223642;-8.417091157753e-05;-0.0013645584695041;7.7208831498865e-05;0.00039879084215499;2.051160481642e-05;-0.00086521438788623;-6.3140896600089e-07;0.00036348347202875;8.8353575847577e-05;2.7260812203167e-05;3.45072185155e-05;0.00046910738456063;-0.00020937813678756;-0.00091676076408476;8.4741193859372e-05;0.00016330427024513;6.4820116676856e-05;-5.5892083764775e-05;-6.1104234191589e-05;-0.00073481042636558;9.7503934739507e-06;-0.0002034175558947;-8.0859863373917e-05;-7.3810340836644e-05;-0.00055197736946866;-0.00017105175356846;-0.00026148688630201;0.00046763618593104;2.7934724130319e-05;3.3079890272347e-05;0.00045896452502348;-8.7243697635131e-06;0.0013749876525253;6.100789323682e-05;-6.209577259142e-05;2.348619455006e-05;-0.00029011382139288;2.0755183868459e-05;0.0002717862080317;0.00026677691494115;-0.00055365142179653;-0.0002290271804668;-0.00101266161073;9.4681410701014e-05;-0.00040659419028088;7.0369365857914e-05;0.00022609172447119;9.6373287306051e-06;-7.4764036980923e-05;-0.00019498042820487;0.0012580872280523;0.00010509544517845;-0.00029767904197797;5.7463596021989e-05;-4.3891588575207e-05;0.00078132649650797;0.00011562284635147;-0.00019131833687425;-0.00047057107440196;3.4537995816208e-05;0.00013446864613798;5.6704655435169e-05;0.00022122760128696;0.00061753607587889;-0.00019480947230477;-2.6638712370186e-05;-1.2070921002305e-05;-0.00051629572408274;-5.6212895287899e-05;0.00023153924848884;0.00012273670290597;-0.00040184627869166;0.00014644954353571;0.00036522260052152;-4.8760703066364e-06;0.00033559612347744;-5.9654259530362e-05;-0.0001230149064213;-4.2551928345347e-05;2.8574193493114e-05;-7.9673212894704e-05;0.0018328865990043;-3.2817875762703e-05;-0.00015497325512115;1.7527894669911e-05;-0.00030264150700532;-0.00025605913833715;0.0003088595403824;0.00033549289219081;1.5899330492175e-06;-8.2822109106928e-05;-0.00021838837710675;-0.00042405619751662;-3.2096013455885e-05;-0.001375880674459;6.9607849582098e-05;0.00046173259033822;3.7925205106148e-05;-0.00088912178762257;-4.9351415327692e-06;0.00042120707803406;5.1360853831284e-05;0.00011474057100713;6.3288469391409e-05;0.00039460850530304;-0.00018839789845515;-0.0011787036200985;9.8641750810202e-05;0.0001064639800461;7.0197151217144e-05;-6.9167879701126e-05;-3.5562825360103e-05;-0.00099725660402328;2.0724159185193e-05;-0.00039219119935296;-8.9592089352664e-05;-4.2838011722779e-05;-0.00058602099306881;-0.00018364592688158;-0.00025883069611154;0.0004820444737561;8.2064514572266e-05;-1.6936010069912e-05;0.00058689253637567;-5.2868548664264e-05;0.0017636135453358;6.699204823235e-05;3.1976262107491e-05;1.9198705558665e-05;-0.00013634511560667;1.7341482816846e-05;0.00025820839800872;0.00022503978107125;-0.00043613227899186;-0.00022431295656133;-0.0010263567091897;0.00010934503370663;-0.00058810750488192;7.9687662946526e-05;0.00018819476827048;1.0045740964415e-05;-6.2112703744788e-05;-0.00016221593250521;0.0010112747550011;7.7438351581804e-05;-0.00032864790409803;4.8229911044473e-05;-5.679894820787e-05;0.00073551421519369;5.1624185289256e-05;-0.00021219992777333;-0.00043423409806564;0.00012580295151565;0.00010579447553027;0.00019395997514948;0.00020387271069922;0.00080082239583135;-0.00017854700854514;1.9601682652137e-05;-5.8249866015103e-06;-0.00046205363469198;-4.277003245079e-05;0.00023406601394527;0.00014697831647936;-0.00041348810191266;0.00010733048111433;0.00037310837069526;-1.8594941138872e-05;0.00024999905144796;-3.8188751204871e-05;-0.00011894591443706;-4.01412435167e-05;3.3322052331641e-05;-0.00010298223787686;0.0016199335223064;-2.9011236620136e-05;-0.0001731885568006;1.5268740753527e-05;-0.0002864109701477;-0.00023143904400058;0.00027889842749573;0.00027380720712245;2.0421997760423e-05;-0.00010689766349969;-0.00019673747010529;-0.00032872008159757;2.7638914161798e-06;-0.0011921633267775;5.5919965234352e-05;0.00044281152077019;4.3031046516262e-05;-0.00077484780922532;-7.0778532972327e-06;0.0003952405822929;1.9405088096391e-05;0.00015631056157872;7.8023127571214e-05;0.00030692378641106;-0.00015017560508568;-0.0011841614032164;9.3439586635213e-05;5.6082768423948e-05;6.5118743805215e-05;-7.0070054789539e-05;-1.3093434063194e-05;-0.0010438759345561;2.7290305297356e-05;-0.00045739999040961;-8.3792008808814e-05;-1.0786990060296e-05;-0.00053685024613515;-0.00016571112792008;-0.00022037587768864;0.00042902361019515;0.00010234324872727;-4.6957084123278e-05;0.00058662710944191;-7.7959426562302e-05;0.0017717364244163;6.2219340179581e-05;8.2791564636864e-05;1.2177754797449e-05;-8.3326494859648e-06;1.2751404938172e-05;0.00020727740775328;0.00064542022300884;-0.00029223278397694;0.00073549919761717;0.00025657506193966;-7.0785940806672e-06;-4.7246845497284e-05;-6.8037988967262e-05;-1.2890694961243e-05;3.6148981052975e-06;3.2535928767174e-05;-0.0017228751676157;0.0001904595119413;0.00029166077729315;-6.1491539327108e-07;0.00019114621682093;-7.2832939622458e-05;-0.00067761685932055;-0.00012748812150676;1.2174759831396e-05;3.8438531191787e-05;0.00035413526347838;0.00011611497029662;-7.2313552664127e-05;0.00019397282449063;-0.00026221806183457;-0.00017761324124876;0.00011451272439444;0.00075135967927054;-3.2467058190377e-05;-0.00039365098928101;3.9557224226883e-05;-0.00027328616124578;4.3317006202415e-05;0.00032290958915837;8.9881810708903e-05;0.00065082299988717;-2.3162978322944e-05;1.0229360668745e-05;-4.7180095862132e-05;4.2581828893162e-05;-4.64597978862e-05;0.0014975158264861;-3.1876912544249e-05;0.00015374715439975;-3.4293723729206e-05;-0.00028795149410143;2.0636467525037e-05;-0.00014609670324717;0.00028319345437922;0.00022453066776507;-0.00019594853802118;-3.1232716537488e-06;-0.00049696961650625;-0.00011368844570825;-0.0014769973931834;-1.2855789464084e-05;0.00020964100258425;4.8223457270069e-05;-0.00077777984552085;3.0696748581249e-05;0.00034052226692438;-7.7895992944832e-07;5.0228325562784e-05;4.4508120481623e-05;0.00049322843551636;4.3218340579187e-05;-0.0010198671370745;-9.9212709756102e-05;2.6240324586979e-05;0.00013558966747951;-3.588176696212e-05;3.7104422517586e-05;-0.00089927430963144;-2.1113552065799e-05;-0.00038012460572645;2.0561536075547e-05;-4.0854607505025e-05;-7.4287607276347e-05;-0.00042344391113147;7.4409224907868e-05;-0.00018716734484769;-0.00016845029313117;0.0003166930982843;0.00050924631068483;-0.00016911512648221;0.0013893783325329;-4.1927960410248e-05;0.00012781332770828;3.9760383515386e-05;7.1996051701717e-05;1.0040417691926e-05;0.00015805974544492;1.2644803973672e-05;0.00063287763623521;-0.00026859572972171;0.00063943368149921;0.00022746216563974;-8.1674821558408e-05;-4.0765007724985e-05;-7.2993236244656e-05;-1.426406288374e-05;1.3949334061181e-05;2.7856276574312e-05;-0.0016331995138898;0.00016925677482504;0.00025490531697869;-2.3653299649595e-05;0.00014029898738954;-6.6812317527365e-05;-0.00063393072923645;-0.00016405593487434;1.7841026647147e-06;0.00011813396122307;0.00033373382757418;0.00015354836068582;-6.2197956140153e-05;0.00021961690799799;-0.00022604946570937;-0.00012232347216923;0.00011236680438742;0.00066465680720285;-1.5983863704605e-05;-0.00032647323678248;4.3091728002764e-05;-0.00022387538047042;1.879299270513e-05;0.00024906679755077;0.00010596833453747;0.00055715820053592;-1.6778960798547e-06;-1.4808756532148e-07;-4.9535847210791e-05;3.2602707506157e-05;-4.2165873310296e-05;0.0014662424800918;-1.3599254998553e-05;0.00012270991283003;-2.6319921744289e-05;-0.00026387005345896;2.1695050236303e-05;-0.00014388245472219;0.00024563813349232;0.00022771753720008;-0.00011589757195907;-1.7946033040062e-05;-0.00045631101238541;-0.00011715980508598;-0.0013758239801973;-3.7191406590864e-05;0.00021794984058943;4.275725223124e-05;-0.00076406530570239;2.3047492504702e-05;0.00032017775811255;-2.0546258383547e-06;1.6523961676285e-05;5.7604531320976e-05;0.00045598181895912;2.8693984859274e-05;-0.00088602514006197;-0.00010823417687789;6.8366367486306e-05;0.00011019063094864;-3.3943648304557e-05;3.8450372812804e-05;-0.00073480483843014;-2.9827979233232e-05;-0.00029538283706643;1.3778103493678e-05;-6.3187471823767e-05;-6.5524218371138e-05;-0.00038990116445348;3.8008849514881e-05;-0.00018724799156189;-0.00013401768228505;0.00029809848638251;0.00042724984814413;-0.00010656492668204;0.0012335357023403;-2.3384298401652e-05;6.9443151005544e-05;3.697901047417e-05;-5.1435687055346e-05;1.3863768799638e-05;0.00019019466708414;1.251875073649e-05;0.00063300743931904;-0.0002484452270437;0.0005468730814755;0.00019144505495206;-9.9424971267581e-05;-3.1374907848658e-05;-7.6622280175798e-05;-2.3168593543232e-05;2.7339232474333e-05;2.3357890313491e-05;-0.0015705300029367;0.00015051357331686;0.00027534662513062;-5.4299111070577e-05;0.0001056940163835;-5.9053865697933e-05;-0.00057568895863369;-0.00021762544929516;-7.8098819358274e-06;0.00020546387531795;0.00030690737185068;0.00017817883053795;-3.8790924008936e-05;0.00017463073891122;-0.00018422081484459;-0.00010136399941985;0.00011121725401608;0.00060239824233577;1.8599608893055e-06;-0.00029554282082245;4.9728663725546e-05;-0.00017055530042853;-1.0212748748017e-05;0.00028710250626318;0.00013358282740228;0.0004865181108471;1.2967259863217e-05;-1.2064414477209e-05;-4.1552622860763e-05;2.5246132281609e-05;-4.0682189137442e-05;0.0014106006128713;9.4251909104059e-06;0.00012350648466963;-1.8733617253019e-05;-0.00024205971567426;1.7543346984894e-05;-0.0001863450743258;0.00025696642114781;0.00023835424508434;-0.00010882021888392;-7.6193873610464e-06;-0.00042546476470307;-0.0001556630450068;-0.0013385181082413;-7.1391950768884e-05;0.0002240612229798;4.5030676119495e-05;-0.00074390292866156;1.4237993127608e-05;0.00028939699404873;-9.5389771104237e-07;-2.3825889002183e-05;7.7032549597789e-05;0.00053534877952188;2.0906916688546e-05;-0.00076734990580007;-0.0001301794545725;0.0001027565667755;8.8693486759439e-05;-3.6410554457689e-05;4.3878855649382e-05;-0.00067867862526327;-4.0535189327784e-05;-0.00021198992908467;1.2363476344035e-05;-6.2341794546228e-05;-6.2001498008613e-05;-0.00041459847125225;5.2081372814428e-06;-0.00018733058823273;-0.00013526031398214;0.00032042252132669;0.00036051930510439;-5.4822452511871e-05;0.0011020443635061;-1.1700373761414e-05;2.2968913526711e-06;3.9140883018263e-05;-0.00011375464964658;1.6094640159281e-05;0.00019203471310902;1.2037596206937e-05;0.00049900129670277;-0.00018601672491059;0.00038300361484289;0.00013261075946502;-9.7476076916791e-05;-1.9591747332015e-05;-6.0168884374434e-05;-1.9432285625953e-05;2.6517223886913e-05;1.6806417988846e-05;-0.0012219958007336;0.00011055879440391;0.00022810531663708;-5.5511372920591e-05;7.2922943218146e-05;-4.3486626964295e-05;-0.00042102177394554;-0.00019367632921785;-1.5181667549768e-05;0.00019627140136436;0.00022825623454992;0.00015983068442438;-2.1693929738831e-05;0.00013977941125631;-0.00012598786270246;-7.7078519097995e-05;8.5675324953627e-05;0.00045360758667812;8.6210038716672e-06;-0.00022540859936271;4.216018714942e-05;-0.00010279556590831;-2.3925027562655e-05;0.00024696605396457;0.00011843688844237;0.00035961135290563;1.562133365951e-05;-1.214446456288e-05;-2.9088236260577e-05;1.7475340428064e-05;-3.1761283025844e-05;0.0010695544769987;1.9536755644367e-05;0.0001072999657481;-1.1039068340324e-05;-0.00018155328871217;1.1816637197626e-05;-0.00016751105431467;0.00020781999046449;0.00019097574113403;-8.6084328358993e-05;-7.5935817633876e-09;-0.00032431559520774;-0.00013804662739858;-0.0010400245664641;-7.2851158620324e-05;0.00017355727322865;3.678068969748e-05;-0.00057319167535752;6.5337694650225e-06;0.00021246429241728;-1.1112217634945e-07;-4.0464932681061e-05;6.9443980464712e-05;0.00046856215340085;1.3100571777613e-05;-0.00054520758567378;-0.00010991911403835;9.3600014224648e-05;6.1970225942787e-05;-2.8903999918839e-05;3.6055454984307e-05;-0.00050811906112358;-3.6175828427076e-05;-0.00012626436364371;1.0161503269046e-05;-4.7446803364437e-05;-4.7009001718834e-05;-0.00033566172351129;-3.8395205592678e-06;-0.0001458116894355;-0.00011592516239034;0.00026008574059233;0.00025318533880636;-2.5249964892282e-05;0.00079114467371255;-4.8716492528911e-06;-2.6646763217286e-05;3.0576022254536e-05;-0.00010963836393785;1.2692822565441e-05;0.00014737575838808;9.2012705863453e-06;0.00018723770335782;-0.00046330108307302;-9.056311682798e-05;-0.00044334898120724;3.267400097684e-05;9.5089868409559e-05;1.3336139090825e-05;0.00013762782327831;1.7757618024916e-06;-5.3133575420361e-05;-0.00014347798423842;0.00108375295531;9.9356278951745e-05;-0.0001818849996198;4.2457253584871e-05;-3.5940702218795e-05;0.00040861932211556;0.00017088511958718;-2.4670738639543e-05;-0.00028147877310403;-0.00011222830653423;8.7421256466769e-05;-0.00021248281700537;0.00011235035344725;-4.098164208699e-05;-0.00011528825416462;-4.2212523112539e-06;-1.4480154277408e-05;-0.00037731070187874;-5.0852511776611e-05;0.00017306169320364;-1.5825291484362e-05;-0.00010939075582428;0.00015704268298578;0.00024682772345841;5.2576269808924e-06;0.00033436375088058;-5.2067149226787e-05;-4.3545969674597e-05;-2.7918906198465e-05;1.5323277693824e-05;2.647993460414e-05;0.0011156247928739;-1.5947713109199e-05;3.8265996408882e-05;5.1696042646654e-06;-0.00018969947996084;-0.00021798275702167;0.00021915994875599;0.00024137840955518;6.9310190156102e-06;-5.4445335990749e-05;-0.00014733494026586;-0.00036091380752623;-0.00010082773223985;-0.0010036444291472;6.3458981458098e-05;0.00022357390844263;1.6147998849192e-07;-0.00060304679209366;4.3839850150107e-06;0.00023918793885969;8.6710941104684e-05;-4.7991288738558e-05;1.7312977433903e-05;0.00049571564886719;-0.00015235424507409;-0.00052215118193999;6.6215165134054e-05;0.00011849305883516;3.8128866435727e-05;-2.9045493647573e-05;-5.7519740948919e-05;-0.00044843385694548;8.0293320934288e-06;-5.775675890618e-05;-5.4339132475434e-05;-5.5881813750602e-05;-0.00039780154475011;-5.9800826420542e-05;-0.00017322685744148;0.00032941222889349;-8.5575564298779e-05;4.1421567402722e-06;0.00027168754604645;8.8693650468485e-06;0.00072452059248462;3.8651156501146e-05;-6.5611442551017e-05;1.516151951364e-05;-0.00019570007862058;1.5345105566666e-05;0.00016479413898196;0.0002606570487842;-0.00059889844851568;-0.00015437477850355;-0.00066854420583695;5.0612186896615e-05;2.9126367735444e-05;2.26865086006e-05;0.00017796554311644;7.9332403402077e-07;-6.3355968450196e-05;-0.00019823381444439;0.0014099900145084;0.00010811654647114;-0.00024817648227327;5.8268160501029e-05;-6.4366060541943e-05;0.00058616750175133;0.00018700087093748;-5.6173626944656e-05;-0.00038349992246367;-9.0275141701568e-05;0.00011866918794112;-0.00020977546228096;0.00018078075663652;3.5474407923175e-05;-0.0001538790675113;9.7235233624815e-06;-7.7924405559315e-06;-0.00052308366866782;-6.1528779042419e-05;0.00024592588306405;1.1838929822261e-05;-0.00020340128685348;0.00018525033374317;0.00033831529435702;-4.5093456719769e-06;0.00045758561464027;-6.6547298047226e-05;-5.8226909459336e-05;-3.8405647501349e-05;2.599320760055e-05;5.6277190196852e-06;0.0015162220224738;-2.6436373445904e-05;3.0368039006134e-05;9.0507728600642e-06;-0.00026691437233239;-0.00027122153551318;0.00029325531795621;0.00030865194275975;1.0000405382016e-05;-9.3918642960489e-05;-0.00018331661703996;-0.00047632728819735;-0.00010019515320892;-0.0013434361899272;8.0660422099754e-05;0.00030942467856221;1.1688550330291e-05;-0.00080390961375087;3.633115284174e-06;0.00033919981797226;9.9023200164083e-05;-2.409295666439e-05;3.100519097643e-05;0.00059848127420992;-0.00019400873861741;-0.00079054059460759;9.2688518634532e-05;0.00013049774861429;5.0681828724919e-05;-4.1635506931925e-05;-6.7172411945648e-05;-0.00067483284510672;1.1062978046539e-05;-0.00015361994155683;-7.4459174356889e-05;-6.5624743001536e-05;-0.00052897486602888;-8.0513578723185e-05;-0.00022607264691032;0.0004366414505057;-8.9381617726758e-05;-1.6316036635544e-05;0.00041008740663528;-1.3123486723998e-06;0.0010983695974573;5.5829212215031e-05;-4.0824364987202e-05;2.1225750970189e-05;-0.00019791699014604;1.8404925867799e-05;0.00021330035815481;0.00029135189834051;-0.00060574186500162;-0.00021059169375803;-0.00084422202780843;6.893380486872e-05;-0.0001415929000359;3.0899835110176e-05;0.00017364893574268;-2.314005541848e-06;-5.4728199756937e-05;-0.00022179583902471;0.0014681961620227;7.9078017733991e-05;-0.00030733173480257;6.5247702877969e-05;-0.00011005335545633;0.00068198365624994;0.00013291856157593;-9.0706584160216e-05;-0.00042380474042147;1.4224548067432e-05;0.00012648427218664;-0.00010631431359798;0.00023579130356666;0.00019152420281898;-0.0001646215969231;6.3793988374528e-05;1.0224559446215e-05;-0.00060690438840538;-5.6980399676831e-05;0.00031340218265541;6.1870116041973e-05;-0.00029715537675656;0.00016219855751842;0.00041299182339571;-3.1092153221834e-05;0.00051926798187196;-6.2347513448913e-05;-5.4909567552386e-05;-4.4519943912746e-05;3.888895662385e-05;-3.8515168853337e-05;0.0016327857738361;-3.5121101973346e-05;2.39469063672e-05;1.1563627595024e-05;-0.00031321690767072;-0.00027642672648653;0.00032614610972814;0.00030408354359679;2.6382300347905e-05;-0.00015873112715781;-0.00017886454588734;-0.0005046360893175;-5.5674812756479e-05;-0.0014599750284106;8.2271566498093e-05;0.00034000346204266;2.8970061975997e-05;-0.00085416837828234;6.4618370743119e-07;0.00039333742461167;7.8545417636633e-05;3.3052088838303e-05;5.2830237109447e-05;0.00058720650849864;-0.00018795065989252;-0.0009987922385335;0.00011119573900942;8.5238294559531e-05;5.3386418585433e-05;-4.9302656407235e-05;-5.3871321142651e-05;-0.00087935151532292;1.8997985534952e-05;-0.00028989461134188;-8.3905826613773e-05;-4.5195763959782e-05;-0.00057670415844768;-7.3192597483285e-05;-0.00022930315753911;0.00046677439240739;-7.8558528912254e-05;-6.7888904595748e-05;0.00052122108172625;-3.1265306461137e-05;0.0013749034842476;6.3935112848412e-05;3.5469918657327e-05;1.9780218281085e-05;-7.3035567766055e-05;1.606225487194e-05;0.00019961367070209;0.00029049190925434;-0.00056040985509753;-0.00022468806128018;-0.00086861941963434;6.9121953856666e-05;-0.00024010802735575;3.0116329071461e-05;0.00014534164802171;-6.6222546593053e-06;-3.9884176658234e-05;-0.00022390043886844;0.0014118754770607;4.6692974137841e-05;-0.00034663671976887;6.436698458856e-05;-0.00015850394265726;0.00065958045888692;8.6542109784205e-05;-9.2183639935683e-05;-0.00039873566129245;9.1410169261508e-05;0.00011344920494594;-3.8402889913414e-05;0.00025370516232215;0.00024839289835654;-0.00015022142906673;0.0001317051355727;2.7560659873416e-05;-0.00064240489155054;-4.9073052650783e-05;0.00037004132173024;7.9193894634955e-05;-0.00031502437195741;0.00013878596655559;0.00049765780568123;-5.9094181779074e-05;0.00054872507462278;-4.6315846702782e-05;-3.5334101994522e-05;-4.5936820242787e-05;4.8280871851603e-05;-5.671752296621e-05;0.001487979083322;-3.7866426282562e-05;6.4346488215961e-05;7.0949736254988e-06;-0.0003170442651026;-0.00028431808459572;0.0003457727143541;0.00026336428709328;5.9262401919113e-05;-0.0002462147094775;-0.00016838006558828;-0.00048560689901933;-2.8056394512532e-05;-0.0014310088008642;8.2624479546212e-05;0.00030307596898638;3.5947407013737e-05;-0.00078562612179667;1.0029583563664e-06;0.00037943024653941;6.3746090745553e-05;5.4375203035306e-05;6.711549940519e-05;0.00062486372189596;-0.00017194694373757;-0.0010311407968402;0.00012075339327566;2.6425152100273e-05;4.8373694880866e-05;-4.812333281734e-05;-4.3186715629417e-05;-0.00098791217897087;2.6160112611251e-05;-0.00035024737007916;-8.5439562099054e-05;-7.6077512858319e-06;-0.00058745837304741;-3.0361778044607e-05;-0.00020042705000378;0.00046597205800936;-0.00012418063124642;-0.00012340024113655;0.00055353157222271;-5.1940711273346e-05;0.0013883481733501;6.6965905716643e-05;8.9431647211313e-05;1.5513081962126e-05;8.4665734902956e-05;1.2680538929999e-05;0.00013445194053929;0.0006661350489594;-0.0003055261913687;0.00054262345656753;0.00023847377451602;-0.00026573942159303;-9.1999509095331e-06;-5.8980764151784e-05;2.031499207078e-05;-1.2471210538934e-05;4.0715418435866e-05;-0.0018302394310012;0.00020797864999622;0.00020397920161486;2.528434197302e-05;0.00023700237215962;-7.5542680860963e-05;-0.00056697451509535;-0.00014133924560156;-5.2861032600049e-05;7.4047486123163e-05;0.00029293895931914;0.00026572757633403;-8.0670572060626e-05;0.00059845775831491;-0.00027398427482694;-0.00019348852219991;8.3105893281754e-05;0.0008068757597357;-5.1537273975555e-05;-0.00042120151920244;3.6095934774494e-05;-0.00016568599676248;-1.0322340131097e-05;0.00036123604513705;0.00011000267113559;0.00072980648837984;-3.3113770768978e-05;4.4069980503991e-05;-4.5350941945799e-05;4.3852716771653e-05;-4.0644015825819e-05;0.001185916364193;4.8186052481469e-06;0.00026098956004716;-3.2111558539327e-05;-0.00025074282893911;8.8602510004421e-06;-0.00017409249267075;0.00028753405786119;0.00019506180251483;-0.00024812383344397;1.9637891455204e-05;-0.00051064504077658;-9.6151401521638e-05;-0.0013984484830871;-4.3786960304715e-05;9.6906034741551e-05;5.9128495195182e-05;-0.00065393297700211;2.0091174519621e-05;0.00026866371626966;6.5768167587521e-06;-1.6017133020796e-05;6.5049098338932e-05;0.00065566482953727;2.6796231395565e-05;-0.00079485296737403;-0.00010272115468979;-4.2543483687041e-06;0.00014177196135279;-1.9152148524881e-05;2.2761574655306e-05;-0.00078131002373993;-3.3465417800471e-05;-0.00027625795337372;1.2190667803225e-05;-2.5531875508022e-05;-7.0911948569119e-05;-0.00040925209759735;0.0001685967145022;-0.00014717302110512;-0.00032541123800911;0.00031331481295638;0.00042902008863166;-0.00021541122987401;0.0010004892246798;-2.0597792172339e-05;0.00011946058657486;4.3564545194386e-05;0.00012910233635921;1.2183856597403e-05;8.8158885773737e-05;1.4194938557921e-05;0.00035656336694956;-0.00013642934209201;0.0002745782257989;9.8213364253752e-05;-7.5274816481397e-05;-1.246676856681e-05;-4.137126961723e-05;-1.0950259820675e-05;1.4933806596673e-05;1.3176631000533e-05;-0.00089172821026295;8.2822676631622e-05;0.00015416590031236;-3.0886956665199e-05;6.3914776546881e-05;-3.1556719477521e-05;-0.00029818859184161;-0.00012975894787814;-1.2093317309336e-05;0.00012547509686556;0.00016035373846535;0.00011472275218694;-1.7879185179481e-05;0.00013120971561875;-9.7190910310019e-05;-6.2732047808822e-05;5.7578581618145e-05;0.0003435498510953;7.1985465410762e-07;-0.00017132968059741;2.7858683097293e-05;-7.0421971031465e-05;-1.9384850020288e-05;0.0001766215718817;8.3538885519374e-05;0.00027079079882242;9.1344263637438e-06;-3.7374577459559e-06;-1.9985163817182e-05;1.4572258805856e-05;-2.2514646843774e-05;0.00074162380769849;1.4980671949161e-05;8.4149069152772e-05;-8.4952216639067e-06;-0.00013256781676318;7.1941035457712e-06;-0.00011636261478998;0.00015147800149862;0.00013015948934481;-7.1776579716243e-05;-5.3971490387994e-07;-0.00023468771541957;-9.3815426225774e-05;-0.00073749257717282;-5.1069931942038e-05;0.00011544937297003;2.6752853955259e-05;-0.00040262629045174;4.5469714677893e-06;0.00015348600572906;9.9963392585778e-07;-2.7618232707027e-05;4.8339876229875e-05;0.00034508740645833;8.9972299974761e-06;-0.00039976069820113;-7.5171781645622e-05;5.5671596783213e-05;4.9920705350814e-05;-1.9014485587832e-05;2.3514961867477e-05;-0.00037789507769048;-2.5337809347548e-05;-0.0001028053520713;6.0543370636879e-06;-3.1593968742527e-05;-3.4546334063634e-05;-0.00023666820197832;1.6031723134802e-05;-0.0001002401986625;-0.00010411495168228;0.00018313014879823;0.00018999597523361;-3.5608387406683e-05;0.00056767778005451;-3.3680848900985e-06;-3.8617308746325e-06;2.2697149688611e-05;-5.3417821618496e-05;9.4493980213883e-06;9.7513664513826e-05;6.94116761224e-06;0.00032703261240385;-0.00012140181934228;0.00023502606200054;8.34623206174e-05;-7.5492702308111e-05;-9.507629329164e-06;-3.8006710383343e-05;-1.0323543392587e-05;1.5334288036684e-05;1.1517408893269e-05;-0.00081416789907962;7.2987138992175e-05;0.00014513063069899;-3.2600772101432e-05;5.5635369790252e-05;-2.7814665372716e-05;-0.00026148394681513;-0.00012655883620027;-1.4208145330485e-05;0.00012648082338274;0.00014212192036211;0.00011208824435016;-1.3482558642863e-05;0.00012208901171107;-8.2291997387074e-05;-5.695314030163e-05;5.1907685701735e-05;0.00030918759875931;3.0621140467701e-06;-0.00015529125812463;2.6522366169957e-05;-5.2622683142545e-05;-2.3800017515896e-05;0.00016930545098148;8.1451842561364e-05;0.00023995680385269;1.0538332389842e-05;-4.1096209315583e-06;-1.6811351088108e-05;1.2607875760295e-05;-2.0598892660928e-05;0.00066462706308812;1.8243077647639e-05;8.0921439803205e-05;-6.3839011090749e-06;-0.00011874603660544;5.8333939705335e-06;-0.00011374056339264;0.00014160813589115;0.0001202875864692;-6.6685781348497e-05;1.1202969290025e-06;-0.00021142198238522;-9.1805850388482e-05;-0.00067080790176988;-5.2907151257386e-05;0.00010477407340659;2.489456164767e-05;-0.00036501514841802;2.3679899641138e-06;0.0001357059518341;1.2130213917771e-06;-3.3236570743611e-05;4.7378736780956e-05;0.00033445408917032;6.9304151111282e-06;-0.00034694190253504;-7.1141002990771e-05;5.5081945902202e-05;4.332888420322e-05;-1.749154580466e-05;2.2032161723473e-05;-0.00033904818701558;-2.4644406948937e-05;-8.090453047771e-05;5.677076842403e-06;-2.8299751647864e-05;-3.1080155167729e-05;-0.00021971814567223;1.30762155095e-05;-9.124892676482e-05;-0.00010044885857496;0.00017025796114467;0.00016405501810368;-2.7298956410959e-05;0.00049502070760354;-1.6120126247188e-06;-1.286103088205e-05;2.0649618818425e-05;-5.4805335821584e-05;8.6594036474708e-06;8.7879292550497e-05;6.2997964960232e-06;0.00011945352162002;-0.00029502878896892;-5.5184718803503e-05;-0.00026691242237575;1.5952751709847e-05;6.8218832893763e-05;6.0046450016671e-06;8.4701874584425e-05;4.0015797253545e-07;-3.1346939067589e-05;-9.2241367383394e-05;0.00070183287607506;5.8283327234676e-05;-0.00011509404430399;2.6331319531891e-05;-3.2180378184421e-05;0.00024460710119456;0.00010751712397905;-1.1114855624328e-05;-0.00016931576828938;-6.9253801484592e-05;5.4449654271593e-05;-0.00014019051741343;7.2290917159989e-05;-5.0103051762562e-05;-6.7977547587361e-05;6.097838650021e-06;-5.8362020354252e-06;-0.00025360018480569;-3.1411931558978e-05;0.00012065063492628;-1.843005156843e-05;-5.7293585996376e-05;0.00010313867824152;0.00016806396888569;3.6948661090719e-06;0.0002173701650463;-2.9992330382811e-05;-2.1967021893943e-05;-1.7950218534679e-05;1.1078019269917e-05;2.2702408386976e-05;0.00067747145658359;-9.551910807204e-06;3.5919314541388e-05;1.6144184655786e-06;-0.00012241001240909;-0.00014068477321416;0.0001484488893766;0.00014752174320165;4.4257603803999e-06;-5.026438520872e-05;-9.6002768259495e-05;-0.00022894708672538;-6.8833120167255e-05;-0.00063107971800491;4.0837207052391e-05;0.0001335178676527;-1.6226492789428e-06;-0.00037515888107009;3.9656529224885e-06;0.00015041809820104;5.7326120440848e-05;-3.7162972148508e-05;9.6197009042953e-06;0.0003437984851189;-9.6089665021282e-05;-0.00032568551250733;4.4278160203248e-05;6.7517132265493e-05;2.2683649149258e-05;-1.7008920622175e-05;-3.79470657208e-05;-0.00029626465402544;4.452638222574e-06;-3.8034449971747e-05;-3.4557775506983e-05;-3.1844021577854e-05;-0.00025436544092372;-2.3424703613273e-05;-0.00010529718565522;0.00020997403771617;-7.7332690125331e-05;-7.8140956247807e-06;0.00017248243966606;6.8864319473505e-06;0.00044268244528212;2.527705146349e-05;-3.5603763535619e-05;1.025293568091e-05;-0.00010320653382223;9.5531149781891e-06;9.4855109637138e-05;0.00013695230882149;-0.00032446876866743;-7.1574031608179e-05;-0.00031990176648833;2.0098117602174e-05;5.0888367695734e-05;8.0485942817177e-06;9.2826026957482e-05;-6.7387972535471e-08;-3.2909010769799e-05;-0.00010522620141273;0.0007729982607998;5.836211857968e-05;-0.0001292319939239;3.0055411116336e-05;-3.9708920667181e-05;0.00028612092137337;0.00010871287668124;-1.8643975636223e-05;-0.00019205786520615;-6.1317827203311e-05;6.1443482991308e-05;-0.00013662502169609;8.9867491624318e-05;-3.225399996154e-05;-7.6323020039126e-05;1.0266345270793e-05;-3.4297531783523e-06;-0.00028722215211019;-3.3352123864461e-05;0.00013767348718829;-1.0785863196361e-05;-8.0916557635646e-05;0.00010794487752719;0.00018771224131342;6.5163084173037e-07;0.00024641925119795;-3.3241314667976e-05;-2.4805771317915e-05;-2.0247458451195e-05;1.375903684675e-05;1.6651052646921e-05;0.00076606287620962;-1.2225666068844e-05;3.3844666177174e-05;2.5801930405578e-06;-0.00014000375813339;-0.00015123518824112;0.0001638689864194;0.00016124547983054;5.4355346037482e-06;-5.9456840972416e-05;-0.00010228475730401;-0.00025444707716815;-6.6810833232012e-05;-0.00070603494532406;4.4493302993942e-05;0.00015206803800538;1.6192236671486e-06;-0.0004187842423562;3.6736439597007e-06;0.00017325024236925;5.9270598285366e-05;-2.9825079764123e-05;1.2944124136993e-05;0.00036265930975787;-0.00010496934555704;-0.00038854908780195;5.0387759984005e-05;6.8526060204022e-05;2.5285289666499e-05;-1.9763096133829e-05;-3.970056786784e-05;-0.00034842395689338;5.0141902647738e-06;-6.270515586948e-05;-3.9061393181328e-05;-3.3723645174177e-05;-0.00028305122395977;-2.737415888987e-05;-0.00011644705227809;0.00023344960936811;-7.7417622378562e-05;-1.3763763490715e-05;0.00020503513223957;4.2080059756699e-06;0.00052942329784855;2.9416491088341e-05;-2.7387985028327e-05;1.1715858818206e-05;-0.00010027740790974;1.0097036465595e-05;0.00010500782809686;0.00029168167384341;-0.00054996274411678;-0.00019075303862337;-0.00058442750014365;1.1254539458605e-05;4.3054722482339e-05;-6.8030290094612e-06;0.00010488703264855;-1.7970201952267e-05;-1.3443056559481e-05;-0.00023346084344666;0.0014380521606654;8.5080837379792e-06;-0.00025777338305488;6.1722807004116e-05;-0.00021184596698731;0.00047528502182104;9.7414224001113e-05;-5.0388057388773e-06;-0.0002823822433129;3.9832717448007e-05;0.00010239283437841;-0.00018843055295292;0.00025479044415988;-0.00019472585699987;-9.6374307759106e-05;0.00016895041335374;5.1337185141165e-05;-0.00067248818231747;-4.2470619519008e-05;0.00039918642141856;2.715977416301e-06;-0.00017408234998584;0.0001467251277063;0.0005107430042699;-6.6849395807367e-05;0.00061913375975564;-3.3642954804236e-05;2.1761867174064e-05;-3.8776724977652e-05;4.7390676627401e-05;8.7434116835539e-08;0.0010580434463918;-3.3762655220926e-05;0.00020206577028148;-6.3002207753016e-06;-0.00026071607135236;-0.00027829993632622;0.00034739964758046;0.00020092831982765;7.6950280345045e-05;-0.00032210524659604;-0.00014108585310169;-0.00047474729944952;-6.2602797697764e-05;-0.0012704496039078;8.7554166384507e-05;0.00014423487300519;1.967285243154e-05;-0.00060828821733594;9.6465082606301e-06;0.00027665551169775;8.9420063886791e-05;-3.0003398933331e-05;4.1113809857052e-05;0.00079451082274318;-0.00016772672825027;-0.00073721312219277;0.00012429257913027;-1.6084470189526e-05;2.741612297541e-05;-2.2892563720234e-05;-6.0347891121637e-05;-0.00082564208423719;1.5884170352365e-05;-0.00022226027795114;-7.5841031502932e-05;1.1479978638818e-05;-0.00053674401715398;9.8501368483994e-05;-0.00014494521019515;0.00043421069858596;-0.00032136790105142;-0.00017757486784831;0.00044036758481525;-1.9255732695456e-05;0.00089256773935631;6.6869237343781e-05;8.2143451436423e-05;1.7951761037693e-05;0.00017097408999689;1.213568066305e-05;3.8060152292019e-05;0.00060276320436969;-0.00027524554752745;0.00034546974347904;0.00019585702102631;-0.00039589067455381;1.9128043277306e-05;-5.2752820920432e-05;3.4803237213055e-05;-1.8590913896332e-05;3.9664832002018e-05;-0.0016685294685885;0.0001909554557642;0.00011363526573405;3.3878059184644e-05;0.00022700468252879;-6.5928434196394e-05;-0.00042708739056252;-0.00014452333562076;-8.1611891801003e-05;0.00011014793562936;0.00021539536828641;0.00032594072399661;-7.3591982072685e-05;0.00076541939051822;-0.00024382403353229;-0.00016250993940048;5.3424144425662e-05;0.00073566858191043;-5.4067892051535e-05;-0.0003749887982849;2.9987359084771e-05;-6.1172511777841e-05;-5.4713593272027e-05;0.00031354106613435;0.00011964606528636;0.00063308404060081;-2.2013764464646e-05;5.3135881898925e-05;-3.5516644857125e-05;3.578570249374e-05;-3.0373326808331e-05;0.00084048660937697;3.6894038203172e-05;0.00026862320373766;-2.2405354684452e-05;-0.00019264299771748;-5.5279070920733e-07;-0.00017097841191571;0.00024883591686375;0.00015205875388347;-0.00022257227101363;2.2158828869578e-05;-0.00043076783185825;-8.379174687434e-05;-0.0011241707252339;-7.2226037445944e-05;3.0064586098888e-05;5.5826425523264e-05;-0.00049610529094934;7.2905704655568e-06;0.00019214721396565;1.0424413630972e-05;-6.1761180404574e-05;7.4650313763414e-05;0.00068260106490925;7.7734757724102e-06;-0.00054776616161689;-9.7010095487349e-05;-1.3651975677931e-05;0.00012528683873825;-7.9324727266794e-06;1.2479758879635e-05;-0.00060722825583071;-3.980450128438e-05;-0.00017460693197791;2.5761469260033e-06;-1.6030369806685e-05;-6.0158108681208e-05;-0.00034901162143797;0.00020720319298562;-0.00010567186836852;-0.00039146872586571;0.00027584983035922;0.0003158691979479;-0.00021086414926685;0.00064738019136712;6.4734348370621e-07;8.8890104962047e-05;4.2162257159362e-05;0.00012759790115524;1.3899974874221e-05;4.4073181925341e-05;1.4025596101419e-05;-0.00082956982078031;0.00081897008931264;-3.1794224923942e-05;-1.0031239071395e-05;4.2080566345248e-05;1.4648699107056e-05;-5.2177372708684e-05;8.7910426373128e-05;3.6839963286184e-05;-4.123208054807e-05;0.00030718283960596;-0.00040437444113195;0.00011696186265908;-0.00010545505938353;1.4660774922959e-06;2.5269400794059e-05;7.7417986176442e-05;3.0063265512581e-05;-2.1603555069305e-05;-4.227970566717e-05;-5.4055075452197e-05;0.00016174519259948;-0.00017633875540923;-0.00017401718650945;0.00024305813712999;-4.1905615944415e-05;-1.9475897715893e-05;-5.8178615290672e-05;0.00012946125934832;-4.7170171455946e-05;1.6583071555942e-05;0.00050460174679756;0.00028164300601929;-0.00019040892948397;-0.00011785106471507;-5.0842331802414e-06;7.15183414286e-05;0.00017513992497697;0.00019786773191299;-3.5318764275871e-05;-4.4033247831976e-05;-0.00058646040270105;-0.00036618550075218;0.00023177875846159;0.00020149527699687;4.8641239118297e-05;4.1345279896632e-05;0.00046392963849939;0.00061845476739109;-5.4908552556299e-05;-0.00049484998453408;-0.00053293746896088;-0.00012981731561013;-0.00020755427249242;0.00041723807225935;0.00027262390358374;-0.00025649089366198;-0.00023383229563478;-8.104280277621e-05;-0.00010371449752711;-4.8715683078626e-05;-3.7071768019814e-05;-0.00042657734593377;-0.00028693318017758;0.0005471438053064;0.00031157149351202;0.0008242794428952;0.00066379795316607;0.00013185282296035;9.4450799224433e-05;-1.3701298485103e-05;6.9788825385331e-07;0.00020498220692389;0.00015956511197146;0.00018610896950122;0.00016185738786589;3.5279106668895e-05;3.8966933061602e-05;0.001353197847493;0.0011339971097186;7.6369215094019e-05;-0.0015094114933163;-0.0012310415040702;-0.00047828251263127;-0.00043374314554967;-0.00046658428618684;-0.00036051357164979;-0.00030230038100854;-0.0002409237640677;-0.00011628305946942;-8.6889660451561e-05;2.5744233425939e-05;3.3226976938749e-06;-0.00083109835395589;0.00080295308725908;-1.5633522707503e-05;3.576789458748e-05;4.8633904953022e-05;2.8157066481072e-05;-5.2509320084937e-05;8.8281034550164e-05;3.6415720387595e-05;-4.094266842003e-05;0.00033694464946166;-0.00038349663373083;0.00011740812624339;-9.5516348665114e-05;-3.2621928767185e-06;2.1455185560626e-05;3.9532478695037e-05;4.3882868340006e-05;-1.3105403922964e-05;-3.36602643074e-05;-6.3378793129232e-05;0.00014809974527452;-0.00018976247520186;-0.00020404570386745;0.00020328194659669;-3.4156921174144e-05;-1.7201969967573e-05;-6.9233843532857e-05;0.00012036682164762;-4.2182131437585e-05;1.800596510293e-05;0.00045545707689598;0.00031734083313495;-0.00017327765817754;-0.00012504408368841;2.3371550923912e-05;6.9995607191231e-05;0.00017573649529368;0.00019834293925669;-3.5240936995251e-05;-4.5005173888057e-05;-0.00054736947640777;-0.00039404685958289;0.00022492244897876;0.00020320031035226;4.7814937715884e-05;4.379328674986e-05;0.00048793412861414;0.00064529763767496;-5.1254428399261e-05;-0.00052807637257501;-0.00055684923427179;-0.00014988982002251;-0.00020762380154338;0.00038838459295221;0.00029153231298551;-0.00025456352159381;-0.00023814568703528;-8.3555263699964e-05;-9.79172764346e-05;-4.5284508814802e-05;-3.9980022847885e-05;-0.00040710609755479;-0.0003062829200644;0.00049265136476606;0.00034475344000384;0.00080880592577159;0.00067286897683516;0.00012953064288013;9.0057743364014e-05;-1.5102055840543e-05;2.2075780634623e-06;0.0002054921205854;0.00015867121692281;0.00017223649774678;0.00016826513456181;3.6461049603531e-05;4.0571732824901e-05;0.0013630953617394;0.0011222759494558;7.7598815551028e-05;-0.001473966287449;-0.0012538952287287;-0.0004745188052766;-0.00042807051795535;-0.00043965323129669;-0.00037852858076803;-0.00029599506524391;-0.00024245285021607;-0.00011241182801314;-8.3646365965251e-05;2.6969961254508e-05;-8.8368415163131e-07;0.00027676252648234;-0.0005796987679787;-8.5602740000468e-05;-8.0742385762278e-05;-9.799757390283e-05;0.00043206638656557;-3.7432349927258e-05;8.7868305854499e-05;-2.7914780730498e-05;1.2511623026512e-05;-0.00022460545005742;0.0015439211856574;-1.5120598618523e-05;-0.00010333357204217;4.0007165807765e-05;-0.00027452243375592;0.00013191427569836;0.00019948941189796;9.6338757430203e-05;-7.0854403020348e-05;-0.00015134754357859;5.7028562878259e-05;-0.00041384215001017;0.00019805516058113;-0.00080857664579526;-7.2613388510945e-06;0.00018001266289502;6.9820198405068e-05;-0.00073743565008044;-3.5114542697556e-05;0.0004256067040842;-0.00026221855659969;0.00022061032359488;0.00028994682361372;0.00048433695337735;1.7669512089924e-05;0.00048128375783563;1.0541880328674e-05;7.1944872615859e-05;-2.0291608961998e-05;3.2986121368594e-05;0.00021622190251946;0.00030576711287722;3.272784397268e-06;0.00032607105094939;-4.7738332796143e-05;-0.00015857978723943;-0.00034557044273242;0.00039549154462293;0.00011991648352705;5.8528552472126e-05;-0.00036897862446494;-0.00021442704019137;-0.0003470761294011;-0.00028610264416784;-0.00081802631029859;9.8235686891712e-05;-3.2405278034275e-05;-4.8481790145161e-05;-0.00033503299346194;3.5974819184048e-05;0.00011612931848504;0.00018665222160053;-0.00024200888583437;-3.8964935811237e-05;0.0013827960938215;-0.00021300851949491;-0.00025117892073467;0.00014939093671273;-6.1250124417711e-05;-3.8000074198408e-08;1.1292155249976e-05;-0.00012129620881751;-0.00071009551174939;-1.9709443222382e-05;6.2545734635933e-07;-7.5655640102923e-05;5.4369655117625e-05;-0.00053829728858545;0.00040318560786545;-7.1245849539991e-05;0.00047466761316173;-0.0008713987772353;-0.00030332923051901;0.00025258256937377;7.5368967372924e-05;0.00018516351701692;8.7223706941586e-05;1.6711643183953e-05;3.6068504414288e-05;0.00028935418231413;1.9943394363509e-05;-0.00010791896056617;0.00028173663304187;-0.00053944281535223;-0.00014961051056162;-0.00034033082192764;-3.9765636756783e-05;0.00024742589448579;-2.7424555810285e-05;8.8895954831969e-05;-2.3842772861826e-05;2.5118206394836e-06;-0.00022972667647991;0.0014303296338767;-1.092633283406e-05;-0.00016742745356169;5.3863248467678e-05;-0.00023739170865156;0.00031406138441525;0.00012417895777617;4.8162990424316e-05;-0.00018045985780191;-3.1708466849523e-05;8.8849301391747e-05;-0.00029639605781995;0.00023698533186689;-0.00050424697110429;-5.285358929541e-05;0.00016897231398616;6.276950443862e-05;-0.00067808968015015;-3.7253565096762e-05;0.00039815448690206;-8.9420456788503e-05;-2.2206750145415e-05;0.00018010631902143;0.00048247532686219;-4.3102543713758e-05;0.00057809369172901;-1.7461066818214e-05;5.0350270612398e-05;-2.9691333111259e-05;4.0283717680722e-05;7.4033792770933e-05;0.00068855000426993;-2.1588788513327e-05;0.0002642820472829;-2.0944795323885e-05;-0.00020274196867831;-0.00027986153145321;0.00034598089405335;0.00015405484009534;7.2489536250941e-05;-0.00034268476883881;-0.00014682226174045;-0.00041885781683959;-0.0001291151274927;-0.0010461856145412;8.8241540652234e-05;4.2879080865532e-05;-3.9639362512389e-06;-0.00045559371937998;1.880000672827e-05;0.00018962140893564;0.00011929947504541;-0.00010913034930127;9.6541270977468e-06;0.00096635933732614;-0.00017285090871155;-0.00049127684906125;0.00012768317537848;-4.0506765799364e-05;1.2786232218787e-05;-5.0180087782792e-06;-7.9164950875565e-05;-0.00071238283999264;2.4342909910047e-06;-0.00011565830209292;-7.0334659540094e-05;2.7951122319791e-05;-0.00050072342855856;0.00021356793877203;-0.00010381784522906;0.00042038716492243;-0.00051379494834691;-0.00022055773297325;0.00034062552731484;1.6754220268922e-05;0.00052430684445426;7.0010974013712e-05;5.8934627304552e-05;2.2756130420021e-05;0.00021824869327247;1.3887895875087e-05;-3.0430217520916e-05;0.0007642408600077;-0.00028662901604548;-0.00031323937582783;6.3783227233216e-05;-0.00086869404185563;0.00014268682571128;-6.1106846260373e-05;4.3500585888978e-05;-3.6920875572832e-05;5.0660793931456e-05;-0.0020906839054078;0.00019143713871017;-4.2055016820086e-05;3.8204259908525e-05;0.00032024914980866;-3.3684336813167e-05;-1.9113664166071e-05;-0.0003851612273138;-0.00020031366148032;0.00046820481657051;-2.2482592612505e-05;0.0006260655936785;3.513447518344e-05;0.0015829037874937;-0.00017099274555221;-0.00019126778352074;-3.8859936466906e-05;0.00093227048637345;-6.9198933488224e-05;-0.00045439795940183;2.5459932658123e-05;0.00059336848789826;-0.0004680591810029;0.00036998954601586;0.00041560584213585;0.00033943180460483;0.00011255788558628;8.9633613242768e-05;3.6984522012062e-05;1.9340504877619e-05;-2.7508490347827e-06;-0.00021223622024991;0.0003396583488211;0.00041846244130284;4.780247763847e-05;-8.7311491370201e-05;-7.2304719651584e-05;-0.00044138543307781;0.00034763076109812;7.4479954491835e-05;-0.0002250063844258;3.4854794648709e-05;-0.00023646210320294;-0.00026275546406396;-0.00052340468391776;-0.00044594876817428;-0.00013510891585611;8.3552447904367e-05;-0.00017941354599316;-8.9429653598927e-05;9.801126907405e-06;4.8422778490931e-05;-0.0004041880602017;0.0002390037116129;0.001835000468418;-0.00011066779552493;7.158189691836e-05;-0.00020230469817761;-4.5232951379148e-05;0.00018056627595797;1.7916574506671e-05;-1.0024846233136e-05;-0.00066032743779942;-0.00012841197894886;0.00011488837481011;-5.5696866184007e-05;5.2763047278859e-05;-8.2894206570927e-05;-0.0004824775387533;0.00069592497311532;-2.1544728951994e-05;-0.0013426936930045;0.00044495725887828;8.331288699992e-05;-0.00043392876978032;-0.00019476957095321;0.00013004936045036;-3.6096804251429e-05;9.5960160251707e-05;0.00030457918182947;4.6302346163429e-05;-0.00013504014350474;3.349353937665e-05;0.00074002705514431;-0.00026044767582789;-0.00046849899808876;1.3013153875363e-05;-0.00083858054131269;0.00016494956798851;-5.4880969400983e-05;3.0080700526014e-05;-3.6586538044503e-05;4.7400968469447e-05;-0.0020062504336238;0.00016930968558881;-4.7912104491843e-05;2.9496277420549e-05;0.0003192009171471;-1.6711946955184e-05;0.00011740995250875;-0.00042050608317368;-0.00020138760737609;0.00052287674043328;-0.00010058392217616;0.00060870056040585;7.6743126555812e-05;0.0015808648895472;-0.0001241909340024;-0.00020056150970049;-6.0808724811068e-05;0.00090486655244604;-6.39713180135e-05;-0.00044508642167784;2.2025607904652e-05;0.00067482556914911;-0.00051965744933113;0.0004384541825857;0.00044504486140795;0.000314967794111;0.00013568709255196;9.0674380771816e-05;5.9548852732405e-05;1.7711048712954e-05;-1.1421996077843e-06;-0.00038149123429321;0.00037878361763433;0.00044380410690792;5.4880209063413e-05;-6.6064414568245e-05;-8.4328974480741e-05;-0.00046768781612627;0.00041632360080257;6.5766740590334e-05;-0.00030778080690652;3.1700968975201e-05;-0.0002108454646077;-0.00032026483677328;-0.00045134901301935;-0.00048923172289506;-0.000162085678312;8.5961779404897e-05;-0.00011900040408364;-0.00010309666686226;-2.6092768166563e-05;5.5984710343182e-05;-0.00046792058856227;0.0002688865060918;0.0020354341249913;-0.00014100931002758;0.00016885851800907;-0.0002141358127119;-5.5211949074874e-05;0.00018533057300374;2.1180640032981e-05;-1.3236937775218e-05;-0.00069461890961975;-0.00014273783017416;0.00015603679639753;-6.7704932007473e-05;7.2268325311597e-05;-8.3719911344815e-05;-0.00048772155423649;0.00076766597339883;-5.9860785768251e-06;-0.0015008179470897;0.00046361266868189;4.9015452532331e-05;-0.00046396267134696;-0.00032049336005002;0.00015684100799263;-5.6386979849776e-05;0.00010203292913502;0.00035463698441163;5.2292220061645e-05;-0.00017451813619118;3.609018313e-05;-0.00086402270244434;0.00087424373487011;-7.5437266787048e-05;-8.7012638687156e-05;5.2032632083865e-05;-3.1433228286915e-05;-4.7546280256938e-05;7.7218202932272e-05;3.3784246625146e-05;-3.909493170795e-05;0.00033617732697167;-0.00048893969506025;6.7689383286051e-05;-8.5697138274554e-05;6.3353295445268e-06;3.6620225728257e-05;0.00015282887034118;3.9368906072923e-06;-3.2350759283872e-05;-2.1456280592247e-05;-7.7639931987505e-05;0.00013283206499182;-9.8056814749725e-05;-0.0001495414035162;0.00033854381763376;-2.9245542464196e-05;-4.3440082663437e-05;-3.5437326005194e-05;0.00013261592539493;-4.0612922020955e-05;2.10623284147e-06;0.00059259310364723;0.00020588091865648;-0.00022948191326577;-9.5635179604869e-05;-7.5257223215885e-05;6.8992354499642e-05;0.00018238613847643;0.00020337157184258;-3.3146443456644e-05;-3.5168428439647e-05;-0.00072189350612462;-0.00034227562719025;0.00022748899937142;0.00019092491129413;5.1726863603108e-05;2.9967053706059e-05;0.00040580364293419;0.000584197929129;-9.2650887381751e-05;-0.00043582514626905;-0.00049992365529761;-7.6652169809677e-05;-0.00019303668523207;0.00054091156926006;0.0002636483986862;-0.0002682228514459;-0.00022784213069826;-4.0167913539335e-05;-9.7191419627052e-05;-5.6491382565582e-05;-2.703085920075e-05;-0.00046751627814956;-0.00025354503304698;0.00067170843249187;0.0002676754957065;0.00090828561224043;0.00068189884768799;0.00012263545067981;9.8005330073647e-05;-1.4277797163231e-05;-6.9885213633825e-06;0.00018956282292493;0.00013952323934063;0.00018114487465937;0.00011733036808437;4.668632755056e-05;4.3817399273394e-05;0.0013840404571965;0.0012873619562015;0.00010451953130541;-0.0017029212322086;-0.0012893138919026;-0.00053018674952909;-0.0004977454082109;-0.00052436877740547;-0.00031524972291663;-0.00030175448046066;-0.00022423765040003;-7.3610513936728e-05;-5.1395756599959e-05;6.8003460000909e-06;2.1154414753255e-06;-0.0012010352220386;0.0011847937712446;-4.5854609197704e-05;-5.441828398034e-05;8.9691056928132e-05;-2.2786925910623e-05;-6.7328386649024e-05;0.00010997177741956;4.7952747991076e-05;-5.470202449942e-05;0.00050864357035607;-0.00063216115813702;0.00011217433348065;-0.00011299581092317;-1.1540165587576e-06;4.2007701267721e-05;0.00013551312440541;3.3122978493338e-05;-2.9631659344886e-05;-3.7753186916234e-05;-9.9053111625835e-05;0.00016792085079942;-0.00017262726032641;-0.00027657023747452;0.00040102636558004;-3.3036532840924e-05;-4.838240420213e-05;-7.4283620051574e-05;0.00017167911573779;-4.982004975318e-05;9.0971188910771e-06;0.00072241242742166;0.00036573698162101;-0.00028502926579677;-0.00016334098472726;-5.5293083278229e-05;7.4855743150692e-05;0.00024972783285193;0.0002790083817672;-4.5185490307631e-05;-5.2448871429078e-05;-0.00090005662059411;-0.00052982062334195;0.00030612284899689;0.00026655153487809;6.7757260694634e-05;4.8449579480803e-05;0.0005924723809585;0.00082522083539516;-0.00011745277879527;-0.00064030120847747;-0.00070231046993285;-0.00013854789722245;-0.0002558192354627;0.00067210290580988;0.00041194673394784;-0.00036178281879984;-0.00032133929198608;-7.349053339567e-05;-0.00012574880383909;-7.001610356383e-05;-4.4381347834133e-05;-0.00060227385256439;-0.00038708600914106;0.00081171269994229;0.00043475316488184;0.001206596265547;0.00095522578340024;0.00017187577032018;0.00012907374184579;-2.2056427042116e-05;-5.2045875236217e-06;0.00026700855232775;0.00019884447101504;0.00023273123952094;0.00018536346033216;6.1517850554083e-05;6.1186656239443e-05;0.0019104913808405;0.0017250914825127;0.00013734663662035;-0.0022422028705478;-0.0018066010670736;-0.00071591249434277;-0.00066314032301307;-0.00066589756170288;-0.00047782363253646;-0.00040895509300753;-0.00031819046125747;-0.00011216592974961;-7.7501870691776e-05;1.8618255126057e-05;-2.4252376533695e-06;-0.001193973235786;0.0011429176665843;2.5627828108554e-06;3.5483608371578e-05;0.00010292610386387;2.9715099572059e-06;-6.7264634708408e-05;0.00010984771506628;4.7308923967648e-05;-5.3442610806087e-05;0.00056031486019492;-0.00058100291062146;0.00011757351603592;-9.3839160399511e-05;-1.2168666216894e-05;3.2244279282168e-05;4.8974448873196e-05;6.1756807554048e-05;-1.2063325812051e-05;-2.4287559426739e-05;-0.00010837332956726;0.0001394524006173;-0.00020073013729416;-0.00034265260910615;0.00031505204970017;-1.7468486475991e-05;-4.0216833440354e-05;-9.7263786301482e-05;0.00015149611863308;-3.9510203350801e-05;1.3374714399106e-05;0.00060645531630144;0.00044704243191518;-0.00024340169329662;-0.0001869937259471;4.3396457840572e-06;5.9063364460599e-05;0.0002477029338479;0.00027624287758954;-4.3802978325402e-05;-5.4605512559647e-05;-0.00079519161954522;-0.00059166236314923;0.00029144654399715;0.00026663122116588;6.3354120356962e-05;5.4112129873829e-05;0.00062551436712965;0.00085723475785926;-0.0001091945450753;-0.00069081975379959;-0.00072605488821864;-0.00017735430446919;-0.00024523044703528;0.00059152801986784;0.00045954930828884;-0.00035170780029148;-0.00032689343788661;-8.4762024926022e-05;-0.00011107061436633;-6.0711430705851e-05;-5.0759837904479e-05;-0.00055090681416914;-0.0004259230918251;0.00068445765646175;0.00050962972454727;0.0011554299853742;0.0009684125543572;0.00016905931988731;0.00011888898006873;-2.5175770133501e-05;-1.2705131666735e-06;0.00026559343677945;0.0001968013093574;0.00020330205734354;0.00020083032723051;6.1216996982694e-05;6.3539962866344e-05;0.0019034206634387;0.0016823705518618;0.0001362249313388;-0.0021322560496628;-0.0018426773604006;-0.00070176378358155;-0.00064272119197994;-0.00059758848510683;-0.0005177347920835;-0.00039279196062125;-0.00032008296693675;-0.00010914230369963;-7.180043758126e-05;2.403766484349e-05;-1.1380634532543e-05;-0.00082617095904425;0.00077177688945085;1.9326544133946e-06;9.8799391707871e-05;7.08854131517e-05;2.1801521143061e-05;-4.6823031880194e-05;7.6189542596694e-05;3.1702318665339e-05;-3.5535991628421e-05;0.0004230490885675;-0.00038138730451465;7.4949093686882e-05;-4.5593165850732e-05;-1.4203255886969e-05;1.6814827176859e-05;-1.3814130397805e-05;5.7652523537399e-05;8.6070309635033e-07;1.1634412658168e-05;-9.9680641142186e-05;7.9820594692137e-05;-0.00015179420006461;-0.00026122538838536;0.00016103241068777;7.5276403777025e-07;-2.7413234420237e-05;-7.7306627645157e-05;9.1696259914897e-05;-2.0462703105295e-05;1.0060179192806e-05;0.00035971755278297;0.00035205215681344;-0.00014174380339682;-0.00013374742411543;5.2186598622939e-05;5.0342536269454e-05;0.0001760775630828;0.00019540305947885;-3.0519797292072e-05;-3.9207930967677e-05;-0.00050618691602722;-0.00045053169014864;0.00019587892165873;0.00018743869441096;4.3162712245248e-05;4.0984032239066e-05;0.00048295751912519;0.00065924879163504;-7.1253474743571e-05;-0.00055055925622582;-0.00056173838675022;-0.00015864384477027;-0.00017990569176618;0.00037192422314547;0.00034384324681014;-0.00024624983780086;-0.00023611159122083;-6.1242906667758e-05;-6.6936096118297e-05;-3.7849331420148e-05;-3.8789636164438e-05;-0.0003626600082498;-0.00032373153953813;0.00040944790816866;0.00039742424269207;0.00078993575880304;0.00069056206848472;0.00011347746476531;7.3730516305659e-05;-1.979709668376e-05;9.429506349079e-07;0.00018386369629297;0.00013310849317349;0.00012034738028888;0.00014222417667042;4.5418892113958e-05;4.8404141125502e-05;0.0013552930904552;0.0011684495257214;0.00010026348900283;-0.0014540497213602;-0.0013282160507515;-0.00048881478141993;-0.00044304126640782;-0.00038149461033754;-0.0003820065758191;-0.00026430576690473;-0.00022214847558644;-6.6185042669531e-05;-3.7844776670681e-05;1.7032913092407e-05;-1.5631003407179e-05;0.00018436499522068;-0.0005561921861954;6.1030004872009e-05;0.00033029241603799;-0.00015803270798642;0.00075009738793597;-6.0837282944703e-05;9.5454975962639e-05;-2.9394399462035e-05;2.5328121409984e-05;-0.0001393313286826;0.0016058684559539;-1.2949464689882e-05;6.4849802583922e-05;1.1920896213269e-05;-0.00029568091849796;-0.00017050263704732;0.00030281150247902;0.00017041819228325;8.4037332271691e-05;-0.00031959515763447;1.0805583769979e-05;-0.00060450908495113;6.093256524764e-05;-0.0012911751400679;6.9240901211742e-05;0.00014070818724576;5.8702502428787e-05;-0.00076741178054363;-2.5153778551612e-05;0.00040390196954831;-0.00059171201428398;0.00070970627712086;0.00048312751459889;0.000177880647243;0.00018289167201146;0.00012686723493971;4.4422446080716e-05;0.00010663321882021;3.8271577977866e-06;5.6171320466092e-06;0.00047860149061307;-0.00035918434150517;6.1789251049049e-05;0.0003222442464903;-8.0678095400799e-05;-7.7680859249085e-05;-0.00035869248677045;0.00035598964313976;4.4461554352893e-05;-6.2847095250618e-05;-0.00017085508443415;-0.00027812540065497;-0.00014874069893267;-0.0005731611745432;-0.00016384734772146;8.2106860645581e-05;-0.00012397803948261;-0.00013502140063792;-0.00014162310981192;5.9231006162008e-05;2.0749786926899e-05;0.00027513789245859;-0.0004581356770359;-0.00014620354340877;0.0018447791226208;-0.00020766972738784;0.00021029007621109;0.00017333564755972;-5.9021440392826e-05;-2.4615694201202e-05;3.6085133615416e-05;-0.00016880320617929;-0.00053193158237264;-6.5257372625638e-05;0.00018860489944927;-6.7834538640454e-05;6.2771476223134e-05;-0.00040960501064546;0.00074067321838811;-1.1962604730797e-05;0.00040909688686952;-0.0014245462371036;-0.00042138865683228;3.7333913496695e-05;0.00017972600471694;-0.00038199592381716;8.7009459093679e-05;-6.7585555370897e-05;5.5232812883332e-05;0.00028461386682466;3.0910279747332e-05;-0.00016904398216866;0.00025795135297813;-0.00063655443955213;-1.2952845281688e-05;0.00017646848573349;-0.00014927874144632;0.00075021624797955;-6.5273707150482e-05;0.00010379909508629;-3.401396679692e-05;2.4792452677502e-05;-0.00020518887322396;0.0017733668209985;-2.211222454207e-05;1.9737957700272e-05;3.1091880373424e-05;-0.0003179848426953;-2.7989379304927e-05;0.00028599365032278;0.00016551537555642;9.5501554824295e-06;-0.0002802396484185;4.5802822569385e-05;-0.00061746715800837;0.0001493361487519;-0.0012799772666767;4.0356058889301e-05;0.00016140793741215;7.4670846515801e-05;-0.00084051780868322;-3.2826901588123e-05;0.00045232052798383;-0.00051427783910185;0.00058144156355411;0.00045119895366952;0.00027379271341488;0.00013052535359748;0.00026149011682719;2.7916958060814e-05;0.00010408667731099;-3.1364245387522e-06;1.5418845578097e-05;0.00041822940693237;-0.0001336428540526;4.539643850876e-05;0.00034546141978353;-7.3671304562595e-05;-0.00011447244469309;-0.00038584103458561;0.00036288180854172;7.3647293902468e-05;-1.583554148965e-05;-0.00021305722475518;-0.00025505339726806;-0.00023171280918177;-0.00051301304483786;-0.0004094178439118;9.6027433755808e-05;-0.00010003195347963;-0.00011219183215871;-0.0002261468762299;5.3712206863565e-05;6.0275233408902e-05;0.00025782795273699;-0.00039865999133326;-0.0001067498451448;0.0017751500708982;-0.00023189921921585;5.1384307880653e-05;0.00017578316328581;-6.038478386472e-05;-1.7056516298908e-05;3.0130520826788e-05;-0.00016308620979544;-0.00061376427765936;-5.0409926188877e-05;0.00013579914229922;-7.6865078881383e-05;5.6872388086049e-05;-0.00050214084330946;0.00065446569351479;-3.6860270483885e-05;0.00047327351057902;-0.0012918289285153;-0.00040104973595589;0.00011944999278057;0.00014872153406031;-0.0002059170656139;9.6077608759515e-05;-3.8795573345851e-05;5.1266299124109e-05;0.00029110323521309;2.8685442885035e-05;-0.00015052256640047;0.00070183235220611;-0.00024595719878562;-0.00034024266642518;3.6374178307597e-05;-0.00088850094471127;0.00013493771257345;-6.2328232161235e-05;4.946418266627e-05;-3.7062305636937e-05;4.7842189815128e-05;-0.001978567102924;0.00016101518122014;-8.1743120972533e-05;3.6885343433823e-05;0.00030487903859466;-2.9141554477974e-05;1.6337524357368e-05;-0.0003713509067893;-0.00020275128190406;0.00045249628601596;-3.1585732358508e-05;0.000630353752058;3.4030676033581e-05;0.0015880890423432;-0.00013647880405188;-0.00016498363402206;-4.6479872253258e-05;0.00088488479377702;-6.2620689277537e-05;-0.00042140379082412;2.177554051741e-05;0.00068970146821812;-0.00051410705782473;0.00021593966812361;0.00044105175766163;0.00016789328947198;0.0001396084408043;8.8975546532311e-05;3.710700548254e-05;1.0420888429508e-05;6.3204611251422e-06;-0.00039453676436096;0.00037015925045125;0.00036623951746151;6.3659972511232e-05;-6.2401566538028e-05;-7.4247604061384e-05;-0.00043175797327422;0.00026016533956863;4.1775696445256e-05;-7.883914076956e-05;1.209595848195e-05;-0.00014369783457369;-0.00023502604744863;-0.00025289366021752;-0.00048404102562927;-0.00013647200830746;7.2083035774995e-05;-0.00011074847134296;-0.00010187675798079;-9.9090984804207e-06;4.7357731091324e-05;-0.00041664173477329;0.0002361468214076;0.0017873900942504;-0.00012179441546323;0.0001756040728651;-0.00018333866319153;-3.953298801207e-05;0.00017477018991485;1.9619990780484e-05;-1.4019990885572e-05;-0.0005640514427796;-0.00012560177128762;0.00014201831072569;-6.0185957408976e-05;5.1308266847627e-05;-7.6649790571537e-05;-0.00041401232010685;0.00073015689849854;-4.5031915760774e-06;-0.0013747750781476;0.00039563185418956;2.5277731765527e-05;-0.00043702815310098;-0.000300400366541;0.0001370916434098;-5.4068721510703e-05;8.9785986347124e-05;0.00027594444691204;4.5897279051133e-05;-0.00013397927978076;3.3940243156394e-05;0.0007674494991079;-0.00022732962679584;-0.00054146361071616;-3.2324398489436e-05;-0.001041661715135;0.00016461155610159;-6.9659428845625e-05;5.2270897867857e-05;-4.2651328840293e-05;5.1535145757953e-05;-0.0022340521682054;0.0001384244824294;-0.00012279640941415;3.0522809538525e-05;0.00035271732485853;-1.6405279893661e-05;0.00016016559675336;-0.00046601449139416;-0.00024660155759193;0.00056748819770291;-0.00010089693387272;0.00074124959064648;7.8688892244827e-05;0.0018946334021166;-8.0842481111176e-05;-0.00019108352717012;-7.8437064075842e-05;0.0010087264236063;-6.1110593378544e-05;-0.00047590985195711;2.0756886442541e-05;0.00097879278473556;-0.00070094654802233;0.000189760219655;0.00057816796470433;6.1239530623425e-05;0.00020930165192112;0.00011033267219318;6.2433995481115e-05;5.5725595302647e-06;1.4507798368868e-05;-0.00071935798041523;0.00050210283370689;0.00042842779657803;9.5027004135773e-05;-4.8321795475204e-05;-9.9721924925689e-05;-0.00053490069694817;0.00030620096367784;2.1761137759313e-05;-4.5017906813882e-05;-9.9735543699353e-06;-9.1989968495909e-05;-0.00030953375971876;-6.6950859036297e-05;-0.00064869568450376;-0.00018335667846259;7.9208475654013e-05;-5.7549783377908e-05;-0.00014424209075514;-4.4820193579653e-05;6.2542072555516e-05;-0.00056647707242519;0.00030542627791874;0.0022768336348236;-0.00018092630489264;0.00035689119249582;-0.00020885653793812;-4.5739157940261e-05;0.00021016820392106;2.7200354452361e-05;-2.2251466361922e-05;-0.00063161988509819;-0.00015894604439382;0.0002211405953858;-8.6033927800599e-05;7.0425885496661e-05;-8.7152184278239e-05;-0.00043766057933681;0.00096746580675244;1.6153266187757e-05;-0.0018112752586603;0.00044057983905077;-3.9197377191158e-05;-0.00055188802070916;-0.00052513345144689;0.00019139889627695;-9.517516446067e-05;0.00010536921035964;0.00033749276190065;5.9938167396467e-05;-0.00018164636276197;4.3494583223946e-05;0.00015400649863295;9.5104456704576e-05;-0.000629888381809;-0.00021558211301453;-0.00041593762580305;9.0181158157066e-05;-2.2384147086996e-05;8.7537546278327e-06;-1.6650606994517e-05;9.0385055955267e-06;-0.00072135729715228;-9.8946919024456e-05;-0.00012451020302251;-1.9600092855399e-05;0.00014533368812408;4.2658452002797e-05;0.00047367744264193;-0.00026621884899214;-0.00012472594971769;0.00032718901638873;-0.00023471175518353;0.00030956242699176;0.00013268101611175;0.00088757649064064;0.00019041515770368;-8.3020066085737e-05;-0.00010215530346613;0.00036621512845159;1.1625179467956e-05;-0.00016266015882138;-5.668873200193e-06;0.00076448265463114;-0.00048153061652556;3.090808968409e-05;0.00033341295784339;-0.00013937387848273;0.00019191851606593;7.3793882620521e-05;8.6939289758448e-05;-9.655651410867e-06;1.2855883142038e-05;-0.0008282518829219;0.00032900579390116;0.00022452327539213;7.5543386628851e-05;3.1823499739403e-05;-6.5889908000827e-05;-0.00022084539523348;0.0002703920181375;-3.6550623917719e-05;-0.00010547391866567;-0.00010008429671871;5.7354664022569e-05;-0.00025535194436088;0.00035832388675772;-0.00039811723399907;-0.00016148532449733;1.0835420653166e-05;0.00010903209476965;-0.00011136347893625;-9.1821355454158e-05;4.4650187192019e-05;-0.00047246553003788;0.00019981736841146;0.0014416748890653;-0.00019637863442767;0.00053050869610161;-2.6224377506878e-05;-2.100766323565e-05;0.00010693028889364;2.1501879018615e-05;-2.6292198526789e-05;-0.00020549904729705;-8.9511289843358e-05;0.00020896895148326;-8.1579302786849e-05;5.8949601225322e-05;-2.2479967810796e-05;4.6264613047242e-05;0.00075058161746711;6.2997372879181e-05;-0.001357304980047;4.3600783101283e-05;-0.00018996876315214;-0.00035861987271346;-0.00062515906756744;0.00016338535351679;-0.00011671221000142;2.8962036594748e-05;0.00019100701319985;4.2936113459291e-05;-0.00013661861885339;2.7735006369767e-05;-0.00098435778636485;0.00099154468625784;-7.4933122959919e-05;-0.00013973633758724;8.8436056103092e-05;-7.0906186010689e-05;-4.8335736209992e-05;7.570898742415e-05;3.4659562516026e-05;-4.1914390749298e-05;0.00043891448876821;-0.00059082685038447;3.9537459088024e-05;-7.5107243901584e-05;4.8207389227173e-06;4.7096287744353e-05;0.00019475523731671;-1.5130554231746e-07;-3.4482662158553e-05;-2.3439239157597e-05;-9.5126270025503e-05;0.00010200837277807;-5.3953455790179e-05;-0.0002007865550695;0.00043151283171028;-1.495702417742e-05;-6.3375977333635e-05;-3.9332240703516e-05;0.0001434310543118;-3.2638796255924e-05;-8.0645995694795e-06;0.00067875080276281;0.0001909697894007;-0.00028606556588784;-9.4396011263598e-05;-0.00014663132606074;5.7642413594294e-05;0.00019989778229501;0.00022096393513493;-3.4715092624538e-05;-3.1037143344292e-05;-0.00087105471175164;-0.00037231284659356;0.00022853942937218;0.00019905118097086;5.9775720728794e-05;2.5853114493657e-05;0.00039024243596941;0.00058242084924132;-0.00013061496429145;-0.00040212422027253;-0.00050341425230727;-3.70019733964e-05;-0.00018184480722994;0.0006892464007251;0.00029470355366357;-0.00029216188704595;-0.00024187791859731;-5.8627110774978e-06;-9.5113588031381e-05;-6.6549575421959e-05;-2.5278779503424e-05;-0.00052137178136036;-0.00026148906908929;0.00078272551763803;0.00028351912624203;0.0010487594408914;0.00076359609374776;0.00012553689884953;0.00010920406202786;-1.7230240700883e-05;-1.3074824892101e-05;0.00020025702542625;0.00013647603918798;0.00018508109496906;0.00010087289410876;6.1423699662555e-05;5.2296240028227e-05;0.0015208990080282;0.0015183029463515;0.00013798852160107;-0.0019733489025384;-0.0014591017970815;-0.00062041427008808;-0.00059337710263208;-0.00060181628214195;-0.00032330033718608;-0.0003249000874348;-0.00023384815722238;-4.5470875193132e-05;-2.8882117476314e-05;-7.6026540227758e-06;-1.7100443301388e-06;-0.0013760185102001;0.0013471130514517;7.8723078331677e-06;-0.0001348558726022;0.00016077404143289;-9.0820693003479e-05;-6.6658547439147e-05;0.00010523536184337;4.9550162657397e-05;-5.7934688811656e-05;0.00067508185748011;-0.00076976785203442;7.6883450674359e-05;-9.3608723545913e-05;-8.9349969130126e-06;5.3299470891943e-05;0.0001643979921937;3.5128363379044e-05;-2.7485888494994e-05;-5.6831220717868e-05;-0.00010137577919522;0.00010526442929404;-0.00010670247138478;-0.00039380448288284;0.0005278381286189;-7.7305385275395e-06;-7.1194328484125e-05;-8.8204367784783e-05;0.00018144752539229;-3.3164338674396e-05;-4.792794243258e-06;0.00079507747432217;0.00038062673411332;-0.00035203044535592;-0.00019301376596559;-0.00015190844715107;1.9588933355408e-05;0.00026958057424054;0.00029788419487886;-4.3940202886006e-05;-4.6324868890224e-05;-0.0010597680229694;-0.00060370110440999;0.00030131833045743;0.00026936407084577;7.3337170761079e-05;4.3939777242485e-05;0.00054045807337388;0.00077351840445772;-0.0001775081618689;-0.00056012440472841;-0.0006506671779789;-7.53805070417e-05;-0.00020704686176032;0.00084577675443143;0.00049848121125251;-0.00038454390596598;-0.00033642628113739;-3.3114927646238e-05;-0.00011234979319852;-7.8170814958867e-05;-4.2932031647069e-05;-0.00064645608654246;-0.00040536682354286;0.00091451354091987;0.00048459076788276;0.001367702614516;0.0010722832521424;0.00017739810573403;0.00014187386841513;-2.7755191695178e-05;-1.2487601452449e-05;0.00027563588810153;0.00019404251361266;0.00022524470114149;0.00016560545191169;7.8861441579647e-05;7.241900311783e-05;0.0020652529783547;0.0020321272313595;0.00018171795818489;-0.0025571621954441;-0.0020532787311822;-0.00083532655844465;-0.00078865088289604;-0.00073614675784484;-0.00050167390145361;-0.0004308728966862;-0.00032961380202323;-7.4297546234448e-05;-4.3381151044741e-05;3.2024504434958e-06;-1.0001785994973e-05;-0.0013559514191002;0.0012881959555671;7.8597688116133e-05;-3.0102954042377e-05;0.0001746809866745;-6.0375357861631e-05;-6.5740459831432e-05;0.00010422494233353;4.9117257731268e-05;-5.5652068112977e-05;0.00072386680403724;-0.00070023298030719;8.9338973339181e-05;-7.177286897786e-05;-2.3375530872727e-05;3.9664151699981e-05;5.2003273594892e-05;6.8398447183426e-05;-6.7487826527213e-06;-4.2158033465967e-05;-0.00010328918870073;7.2307215305045e-05;-0.00014151829236653;-0.00047520542284474;0.00041867804247886;9.8052250905312e-06;-5.789686110802e-05;-0.00011546479800018;0.00015645589155611;-2.1370933609433e-05;1.5211096524581e-06;0.00063488184241578;0.00049274967750534;-0.00028643550467677;-0.0002380689693382;-6.9397210609168e-05;-1.6542189769098e-05;0.00026408900157548;0.00029159526457079;-4.0477731090505e-05;-5.0063208618667e-05;-0.00090065592667088;-0.00068840180756524;0.00028673993074335;0.00026444776449353;6.4579449826851e-05;5.2335071814014e-05;0.00056609947932884;0.00079310842556879;-0.00016583697288297;-0.00061420217389241;-0.00064981181640178;-0.00012367514136713;-0.00018414968508296;0.0007138354703784;0.00057353306328878;-0.00036737852497026;-0.00034023087937385;-5.6354198022746e-05;-9.0616595116444e-05;-6.4350992033724e-05;-5.1344883104321e-05;-0.0005730603588745;-0.00045272579882294;0.00074538734043017;0.00058266747510061;0.0012842692667618;0.0010865295771509;0.0001767161738826;0.00012835042434745;-3.1870222301222e-05;-6.6902398430102e-06;0.00026996814995073;0.00019392972171772;0.00018888828344643;0.00018789419846144;7.5401760113891e-05;7.4513292929623e-05;0.0020320438779891;0.0019619408994913;0.00017617721459828;-0.002385804662481;-0.0020904284901917;-0.00081150175537914;-0.00075513700721785;-0.00063823134405538;-0.00055596139281988;-0.0004084263346158;-0.00033203072962351;-7.6330594311003e-05;-3.8674232200719e-05;1.3273011063575e-05;-2.1077692508698e-05;-0.00087182968854904;0.00081130029866472;3.7169771530898e-05;7.331206870731e-05;9.6525545814075e-05;-2.2242006707529e-06;-4.4487143895822e-05;7.132111932151e-05;3.1655061320635e-05;-3.5207925975556e-05;0.000479259819258;-0.00041828045505099;6.2625760619994e-05;-3.4365119063295e-05;-1.9481449271552e-05;1.8891389117925e-05;-1.7806885807659e-05;5.9590394812403e-05;3.53589621227e-06;8.7506869022036e-06;-9.7453899797983e-05;4.8786692786962e-05;-0.00012402725405991;-0.00031171078444459;0.00019437879382167;1.3063675396552e-05;-3.3475651434856e-05;-8.359897765331e-05;9.077723370865e-05;-1.2093357327103e-05;5.0985709094675e-06;0.00035528119769879;0.00037007723585702;-0.00015084161714185;-0.0001563865080243;2.4858378310455e-05;1.3356338968151e-05;0.00017867713177111;0.00019705841259565;-2.7973674150417e-05;-3.6795085179619e-05;-0.00052810763008893;-0.00048607011558488;0.00019045213412028;0.00018184217333328;4.1719944420038e-05;4.0016911952989e-05;0.0004412981797941;0.00061483675381169;-9.2782247520518e-05;-0.00050458492478356;-0.00050977017963305;-0.0001351149257971;-0.00014817372721154;0.00040322300628759;0.00038934539770707;-0.00024617835879326;-0.00023652135860175;-5.0772425311152e-05;-5.5443986639148e-05;-3.7736539525213e-05;-3.8789923564764e-05;-0.00035983897396363;-0.00033017879468389;0.00042113085510209;0.00042777881026268;0.00082321790978312;0.00072902778629214;0.00011547236499609;7.6077762059867e-05;-2.2558011551155e-05;-1.0444227882545e-06;0.00018066691700369;0.00012979956227355;0.00011087159509771;0.00013580039376393;4.9922171456274e-05;5.2113715355517e-05;0.001374249230139;0.0012620884226635;0.00011434131010901;-0.0015219692140818;-0.0014100618427619;-0.00052505097119138;-0.00048071178025566;-0.00038560692337342;-0.00039488187758252;-0.0002648571098689;-0.00022342661395669;-5.2113209676463e-05;-2.3295258870348e-05;1.3030537957093e-05;-1.9994255126221e-05;-0.00015800083929207;-0.00016347267956007;0.00031982266227715;0.00069357175379992;-0.00011990939674433;0.00058658857597038;-4.2120929720113e-05;6.393414514605e-05;-7.4500535447442e-06;1.9076904209214e-05;0.0001655599771766;0.00087678164709359;2.6003630409832e-05;0.00017539069813211;-5.281129051582e-05;-0.00019440970208962;-0.00058408814948052;0.0003012117522303;0.00015890452777967;0.00027124388725497;-0.00034537399187684;-0.00010411284893053;-0.00046509056119248;-0.00029675365658477;-0.0010856514563784;0.00014851415471639;6.9405214162543e-05;-1.9021286789211e-05;-0.00046014954568818;5.9972671806463e-06;0.0002164095203625;-0.00072402245132253;0.0010055579477921;0.00048765007522888;-0.00014745001681149;0.00031960644992068;-0.00024217784812208;9.603779471945e-05;0.00011702336632879;1.8149046809413e-05;-2.3028733266983e-05;0.00055746134603396;-0.00091803789837286;0.00010131668386748;0.00022369381622411;-8.2814185589086e-05;2.158746792702e-05;-0.00017752530402504;0.00035214234958403;-4.3532523704926e-05;-0.00024264804960694;-7.7029202657286e-05;-0.00032205626484938;7.3185976361856e-05;-0.00062766636256129;0.00053962704259902;1.2202617654111e-05;-0.00018241377256345;-0.00018136521975975;7.0630499976687e-05;6.6347347456031e-05;-7.0452013460454e-05;0.00026628229534253;-0.00059335608966649;-0.00025543526862748;0.001787408371456;-1.9467890524538e-05;0.00064736430067569;0.00015221654030029;-3.8617668906227e-05;-4.5963148295414e-05;4.518344940152e-05;-0.00013496923202183;-0.00022705251467414;-0.00010419850150356;0.00028944213408977;-2.2679909307044e-05;6.8860812461935e-05;7.4824070907198e-05;0.00099349091760814;6.58784629195e-05;1.5225031347654e-05;-0.0017243283800781;-0.00046773510985076;-0.00022386008640751;0.00023291786783375;-0.00078433781163767;2.0085246433155e-05;-0.0001454129233025;5.6412602134515e-05;0.00021809441386722;3.5348588426132e-05;-0.00018162064952776;-5.6761575251585e-05;-0.00034328809124418;0.00029126388835721;0.00072213006205857;-0.00016359893197659;0.00079308886779472;-5.934554792475e-05;8.7452252046205e-05;-1.7426005797461e-05;2.65866110567e-05;8.0536352470517e-05;0.0013056439347565;1.550111664983e-05;0.00018855546659324;-3.9906564779812e-05;-0.00026544302818365;-0.00055872648954391;0.00036416863440536;0.00019892520504072;0.00026298186276108;-0.00041466258699074;-8.1782811321318e-05;-0.00062115833861753;-0.00022178568178788;-0.0014106155140325;0.00015191511192825;9.9090386356693e-05;7.3997807703563e-06;-0.00065334094688296;-3.8793300518591e-06;0.00031648194999434;-0.0008507389575243;0.0011359729105607;0.00060320907505229;-0.00011861782695632;0.00034997187322006;-0.00022005474602338;9.3628594186157e-05;0.00013404795026872;2.088726432703e-05;-2.1003388610552e-05;0.00066916306968778;-0.00095821177819744;0.00011316616291879;0.00028470932738855;-0.00010087241389556;-2.8553170494661e-08;-0.00028161320369691;0.00038141055847518;-2.9816103051417e-05;-0.00023170727945399;-5.9994217735948e-05;-0.00036072169314139;4.3951560655842e-05;-0.00076664768857881;0.00048348581185564;3.9443715650123e-05;-0.00019624904962257;-0.00020816494361497;3.3451939088991e-05;7.779520819895e-05;-5.9853184211534e-05;0.0003279119846411;-0.00066343322396278;-0.00027179458993487;0.0021494110114872;-0.00010365490015829;0.0006476339767687;0.00018636167806108;-5.1072816859232e-05;-4.8378842620878e-05;5.2536091970978e-05;-0.00017918116645887;-0.00034643124672584;-0.0001129019074142;0.00032483387622051;-4.3041833123425e-05;7.6403579441831e-05;-9.333279740531e-05;0.0010895506711677;5.4053180065239e-05;0.00017428224964533;-0.0019463115604594;-0.00053414347348735;-0.00018967481446452;0.00026862346567214;-0.00083812867524102;5.155232429388e-05;-0.00015019720012788;6.7995279096067e-05;0.00027133533149026;4.077673656866e-05;-0.00021158237359487;0.00011003058898496;-0.0005821175291203;0.0001815959403757;0.00056354189291596;-0.00018502604507376;0.0010066038230434;-8.4159561083652e-05;0.00011787568655564;-3.1877083529253e-05;3.3138334401883e-05;-6.6060696553905e-05;0.0018582617631182;-6.3216543821909e-06;0.00016373992548324;-4.6757791096752e-06;-0.0003479617589619;-0.00035758063313551;0.00039983849273995;0.0002343119122088;0.00015589474060107;-0.00042965859756805;-1.8381417248747e-05;-0.00078932824544609;-5.5630007409491e-05;-0.0017059205565602;0.00012078207510058;0.00013725813187193;4.8832498578122e-05;-0.00089568918338045;-2.0891098756692e-05;0.00044957405771129;-0.00089690880849957;0.0011463772971183;0.00068511400604621;-6.2421349866781e-05;0.00032531726174057;-0.00012784628779627;6.9051624450367e-05;0.00014505548460875;2.0581557691912e-05;-1.2638484804484e-05;0.00071670254692435;-0.00080887955846265;0.00011346511018928;0.00034247251460329;-0.00011025284038624;-4.9014306569006e-05;-0.00041067585698329;0.00035216214018874;3.2341651490242e-07;-0.00016771828813944;-9.8403450010665e-07;-0.00034632429014891;-2.9984847060405e-05;-0.00084470317233354;0.00026846842956729;7.6505843026098e-05;-0.00018074733088724;-0.00021214048319962;-6.5661319240462e-05;8.0817939306144e-05;-1.5513820471824e-05;0.0003564854268916;-0.00064944184850901;-0.00023171967768576;0.0023513722699136;-0.00020473450422287;0.00050305644981563;0.00021549363736995;-5.7840821682476e-05;-4.2519193812041e-05;5.2921881433576e-05;-0.00021032565564383;-0.00050077302148566;-0.00010176757496083;0.00031043199123815;-7.046102109598e-05;7.1986571128946e-05;-0.0003414710809011;0.0010755150578916;2.0134168153163e-05;0.0003784590808209;-0.0019744669552892;-0.00056356069399044;-8.9825793111231e-05;0.00026026050909422;-0.00072703091427684;8.9777706307359e-05;-0.00012860679998994;7.2542912675999e-05;0.00030635466100648;4.2713698348962e-05;-0.00021296051272657;0.00018112614634447;-0.00053649360779673;4.4185115257278e-05;0.00028536817990243;-0.00014391833974514;0.00077530386624858;-6.7887071054429e-05;9.6095602202695e-05;-3.0037463147892e-05;2.6157678803429e-05;-0.00013838181621395;0.0015676075126976;-1.8944048861158e-05;8.5154344560578e-05;1.7744037904777e-05;-0.00028412725077942;-0.00012239199713804;0.00028301583370194;0.00017161044524983;5.2451407100307e-05;-0.0002957500400953;2.6481655368116e-05;-0.00061189325060695;7.362514588749e-05;-0.0012928672367707;6.1752536566928e-05;0.00012076373968739;5.8964604249923e-05;-0.00074474920984358;-2.428737388982e-05;0.0003843207960017;-0.00058399135014042;0.00071076827589422;0.00047427575918846;6.9812987931073e-05;0.00018582543998491;5.1875536883017e-05;3.4522483474575e-05;0.00010335334081901;8.442983016721e-06;6.8362743377293e-07;0.00047144488780759;-0.00038158023380674;6.5979176724795e-05;0.00028129009297118;-7.5707612268161e-05;-6.8429842940532e-05;-0.00033518151030876;0.00027233932632953;3.0522973247571e-05;-7.0640686317347e-05;-5.8554640418151e-05;-0.00023573309590574;-0.00010778725845739;-0.00056636339286342;-5.5996410083026e-05;7.3549417720642e-05;-0.00011471271864139;-0.00013328381464817;-0.00012196778698126;5.4689920943929e-05;2.0554090951919e-05;0.00025312710204162;-0.0004238132678438;-0.0001331981329713;0.0016906986711547;-0.00019102432997897;0.00022040991461836;0.00016212173795793;-4.8371766752098e-05;-2.416624010948e-05;3.4548822441138e-05;-0.00015620376507286;-0.00045453896746039;-6.096617289586e-05;0.00018371317128185;-6.2969753344078e-05;5.0013455620501e-05;-0.00036966847255826;0.00070319836959243;-9.1366218839539e-06;0.00037038981099613;-0.0013301748549566;-0.00039543898310512;1.7558155377628e-05;0.00016653790953569;-0.00038209173362702;8.0748344771564e-05;-6.6086227889173e-05;5.1035716751358e-05;0.00024121609749272;2.9230202926556e-05;-0.00014669826487079;0.00047144759446383;-7.5601026765071e-05;-0.00046394989476539;-0.00010350930824643;-0.00078830134589225;0.00010242994176224;-5.3481351642404e-05;4.4244290620554e-05;-3.0551778763765e-05;3.2915293559199e-05;-0.0015541744651273;2.8074724468752e-05;-0.00013501795183402;1.085382882593e-05;0.00025231225299649;9.9021428923152e-07;0.00021407843451016;-0.00034947125823237;-0.0001933758467203;0.00040756250382401;-9.7205273050349e-05;0.00056169799063355;7.8822296927683e-05;0.0014322641072795;3.6052970244782e-05;-0.00012302848335821;-7.637085946044e-05;0.00071517337346449;-2.7801683245343e-05;-0.00032653249218129;9.4531960712629e-06;0.00094865617575124;-0.00063788675470278;-7.6946249464527e-05;0.00050492159789428;-0.00020949101599399;0.00021103493054397;8.9863708126359e-05;5.5181175412145e-05;-7.8677467172383e-06;2.3725278879283e-05;-0.00084575120126829;0.0004488222184591;0.0002723301295191;0.00010200015094597;-7.8030425356701e-06;-8.3228886069264e-05;-0.0004171475302428;0.0001297062553931;-3.153497891617e-05;0.00017451647727285;-4.6801782445982e-05;6.318111991277e-05;-0.00021641232888214;0.00034294568467885;-0.00057762389769778;-0.00014688402006868;4.3837146222359e-05;4.0959617763292e-05;-0.00013670706539415;-5.9035002777819e-05;4.9439928261563e-05;-0.00048643760965206;0.00024115067208186;0.0017771174898371;-0.0001667674514465;0.0004442046629265;-0.00012396690726746;-2.4037477487582e-05;0.00016112420416903;2.3234639229486e-05;-2.3826500182622e-05;-0.000372485461412;-0.00012142265040893;0.00021411657507997;-7.7394739491865e-05;5.4126685427036e-05;-5.845336636412e-05;-0.00021884868328925;0.00085212121484801;3.8086851418484e-05;-0.0015371782938018;0.00025166434352286;-0.00012323560076766;-0.00045498419785872;-0.00056605599820614;0.00016468958347104;-0.0001074547690223;7.0138645241968e-05;0.00022686811280437;4.8273566790158e-05;-0.00014014264161233;3.5775021387963e-05;0.00030877446988598;5.0388880481478e-05;-0.00055092538241297;-0.00020205524924677;-0.00068397668655962;8.0381643783767e-05;-4.603430716088e-05;3.6956469557481e-05;-2.532511643949e-05;2.2138463464216e-05;-0.0012681359658018;-7.0507281634491e-05;-0.0001540184894111;-8.9932482296717e-06;0.00022099539637566;2.3508137019235e-05;0.00036134920082986;-0.00033495927345939;-0.00018273569003213;0.00037455398705788;-0.00015047291526571;0.00049822090659291;0.00011483697016956;0.0012944652698934;0.00016101689834613;-0.00010702686267905;-9.7545191238169e-05;0.0006074404809624;-1.8134002175429e-06;-0.00027147584478371;9.7380245733802e-07;0.0010541601805016;-0.00067474902607501;-0.00016867330123205;0.00050907529657707;-0.00033578946022317;0.00023933785269037;9.4539085694123e-05;7.3502415034454e-05;-1.5102396901057e-05;2.7912687073695e-05;-0.0010433610295877;0.00046454422408715;0.00024570006644353;0.00011560078564798;1.8166290828958e-05;-8.5755760665052e-05;-0.00038454050081782;0.00012493108806666;-6.2031656852923e-05;0.00020963104907423;-8.415496267844e-05;0.00013537076301873;-0.00022796078701504;0.00057580909924582;-0.00058958912268281;-0.00016420739120804;2.566494003986e-05;0.0001048937701853;-0.00015025220636744;-8.3984727098141e-05;5.1312665164005e-05;-0.00054001959506422;0.00024260063946713;0.0017929478781298;-0.00019838628941216;0.00059334916295484;-7.0842448621988e-05;-1.6540614524274e-05;0.00015495921252295;2.4582381229266e-05;-2.9662885935977e-05;-0.00028334156377241;-0.00011562560393941;0.00024713677703403;-8.8607121142559e-05;5.9391401009634e-05;-4.5385873818304e-05;-6.952400872251e-05;0.0009454739629291;6.2614395574201e-05;-0.0016669319011271;0.00013670272892341;-0.00020603877783287;-0.00047512105084024;-0.00069972494384274;0.00017977289098781;-0.00013792878598906;5.2564751968021e-05;0.00021091235976201;5.0211721827509e-05;-0.00014624113100581;3.6702305806102e-05;0.00010662782733561;0.00020104696159251;-0.00058364967117086;-0.00029720002203248;-0.00052811176283285;4.3644253310049e-05;-3.8071062590461e-05;2.9210659704404e-05;-1.7835673133959e-05;9.5460745797027e-06;-0.00092498626327142;-0.00018513528630137;-0.00015561599866487;-2.9679831641261e-05;0.00018353383347858;4.511464794632e-05;0.00048282096395269;-0.00030153474654071;-0.00016255205264315;0.00030978367431089;-0.00018662681395654;0.00040601287037134;0.00014601972361561;0.0010699457488954;0.00029401018400677;-9.1556517872959e-05;-0.00011357466428308;0.00048146329936571;2.8138350899098e-05;-0.00021281497902237;-7.9737437772565e-06;0.0011017380747944;-0.00066113675711676;-0.00023128508473746;0.00047587833250873;-0.00041723038884811;0.00024439636035822;9.953912376659e-05;9.2411959485617e-05;-2.0220251826686e-05;2.8388392820489e-05;-0.0011723111383617;0.00043714031926356;0.00022156606428325;0.00012326033902355;3.8962662074482e-05;-8.2798840594478e-05;-0.00033072524820454;0.00013474730076268;-8.8435801444575e-05;0.00020520518592093;-0.00011518063547555;0.00018414422811475;-0.00023095052165445;0.00074419711017981;-0.00054969813209027;-0.0001794342242647;3.4675213100854e-06;0.00014997924154159;-0.00015414367953781;-0.00010158256191062;5.0111117161578e-05;-0.0005773269222118;0.00022695631196257;0.0017494250787422;-0.00021225510863587;0.0007199554820545;5.8724872360472e-06;-7.1630597631156e-06;0.00014707280206494;2.3337934180745e-05;-3.4060307370964e-05;-0.00019799427536782;-0.00010122132516699;0.0002622228639666;-9.3467584520113e-05;6.5238047682215e-05;-2.9855375032639e-05;0.00011210681986995;0.0010376982390881;8.5878236859571e-05;-0.0017701030010357;-1.9343257008586e-05;-0.00028466238291003;-0.0004943119129166;-0.0007861289777793;0.00017718019080348;-0.00016525028331671;2.7356607461115e-05;0.0001934711181093;5.0161768740509e-05;-0.00014643296890426;3.5642853617901e-05;-0.0008937792154029;0.00090221007121727;-4.5450160541805e-05;-0.00020894018234685;0.00011173456005054;-0.0001131886310759;-3.8521546230186e-05;5.664344644174e-05;2.7781157768914e-05;-3.6370100133354e-05;0.00043944353819825;-0.00057983089936897;-1.9025636674996e-06;-5.5062766477931e-05;5.8178238759865e-06;5.0873728469014e-05;0.00021838732936885;-9.8612563306233e-06;-3.2852381991688e-05;-4.2222367483191e-05;-7.6769509178121e-05;4.8852994950721e-05;1.6939084162004e-05;-0.00020475167548284;0.00047095425543375;4.1173413478646e-07;-7.2375369200017e-05;-2.7565683922148e-05;0.00012707166024484;-1.9928318579332e-05;-1.7748752725311e-05;0.00066826888360083;8.9868372015189e-05;-0.00032240018481389;-4.7963614633773e-05;-0.00025454949354753;2.9713524781982e-05;0.00016899695037864;0.00018378433014732;-2.9354352591326e-05;-1.5555102436338e-05;-0.00088828039588407;-0.00028494399157353;0.00016969552962109;0.00016388348012697;5.68310606468e-05;1.0768112588266e-05;0.00023669665097259;0.00038283001049422;-0.00014992976502981;-0.00018705050752033;-0.00035468183341436;5.3230200137477e-05;-0.00011341334175086;0.00075733137782663;0.00022608287690673;-0.00024465829483233;-0.00019283907022327;4.7008237743285e-05;-7.7654447522946e-05;-6.6208194766659e-05;-1.5507022908423e-05;-0.00047247283509932;-0.00019068004621658;0.0007764728507027;0.0002170186053263;0.00097980292048305;0.00066149205667898;9.977266745409e-05;0.00010285435564583;-1.5108818843146e-05;-1.8605767763802e-05;0.00016623806732241;9.6036368631758e-05;0.00015889787755441;5.5388631153619e-05;6.3738989410922e-05;4.6676963393111e-05;0.0012843876611441;0.0014388716081157;0.00014439292135648;-0.0018462323350832;-0.0012744973646477;-0.00058325636200607;-0.00057342642685398;-0.00058002845617011;-0.00024217503960244;-0.00027896848041564;-0.00018635996093508;-2.8307767934166e-06;1.2305133623158e-06;-2.594364923425e-05;-2.6868031000049e-06;-0.0013094261521474;0.0012722834944725;0.00011081696720794;-0.00023363693617284;0.00022029530373402;-0.00015880494902376;-5.5430769862141e-05;8.3543614891823e-05;4.4027616240783e-05;-5.2701918320963e-05;0.0007168457377702;-0.00076742586679757;4.14264977735e-05;-7.0852867793292e-05;-1.4892421859258e-05;5.4638370784232e-05;0.00016162838437594;3.3680782507872e-05;-2.0109420802328e-05;-0.00010667843889678;-4.8617865104461e-05;2.467651029292e-05;-2.484729157004e-05;-0.00046962167834863;0.00058632082073018;1.4191875379765e-05;-7.611776527483e-05;-8.7772627011873e-05;0.00016086090181489;-1.4149733033264e-05;-1.4150119568512e-05;0.00073471292853355;0.00032195416861214;-0.00037502346094698;-0.00018828402971849;-0.00027149508241564;-6.9451911258511e-05;0.00023210057406686;0.00025348277995363;-3.3887590689119e-05;-3.0141418392304e-05;-0.0010312148369849;-0.00055857899133116;0.00023498901282437;0.00022180053929333;6.337340164464e-05;2.9627391995746e-05;0.0003336024528835;0.0004940775106661;-0.00020949874306098;-0.00028633794863708;-0.00041124358540401;3.5742996260524e-05;-9.0200315753464e-05;0.00088458636309952;0.00048981583677232;-0.0003224071697332;-0.00027911807410419;1.3947436855233e-05;-8.0644065747038e-05;-7.1983835368883e-05;-3.4302254789509e-05;-0.00056354829575866;-0.00034110812703148;0.00086185662075877;0.00045399315422401;0.0012646493269131;0.00097858801018447;0.00015428425103892;0.00013361683522817;-2.7660964406095e-05;-1.7086871594074e-05;0.00023080565733835;0.00015171474660747;0.00018585547513794;0.00012369125033729;7.8225435572676e-05;6.6647706262302e-05;0.0017803870141506;0.0019512585131451;0.00018771553004626;-0.0023694885894656;-0.0018865189049393;-0.00079780980013311;-0.00076725869439542;-0.00067660049535334;-0.00043692562030628;-0.00037402857560664;-0.00028052285779268;-3.0341403544298e-05;-8.5197007138049e-06;-1.1570528840821e-05;-1.4300104339782e-05;-0.0012736897915602;0.0011985521996394;0.00019301458087284;-0.0001235349336639;0.00023450593289454;-0.00012692574819084;-5.2973700803705e-05;8.0564685049467e-05;4.3555530282902e-05;-4.8983056331053e-05;0.00076070096110925;-0.00068682862911373;5.7854002079694e-05;-4.5123168092687e-05;-3.2173469662666e-05;3.8166126614669e-05;3.495265627862e-05;6.6706685174722e-05;1.9150263597112e-06;-8.7703294411767e-05;-4.4297394197201e-05;-1.3013444913668e-05;-5.9059319028165e-05;-0.00055960373720154;0.00046265064156614;3.3356478525093e-05;-5.984544986859e-05;-0.00011746515519917;0.00013234512880445;-5.3039849490233e-07;-7.0899632191868e-06;0.00052867055637762;0.00046408918569796;-0.0002761053328868;-0.00026407872792333;-0.00015979680756573;-0.00013320260040928;0.00022256872034632;0.00024390564067289;-2.7344571208232e-05;-3.5970802855445e-05;-0.00081635924289003;-0.00066904071718454;0.00022362115851138;0.0002067005407298;4.9875357944984e-05;4.1080747905653e-05;0.0003495161072351;0.00049931200919673;-0.00019554114260245;-0.00035197462420911;-0.00037367499317043;-2.1231675418676e-05;-5.3473198931897e-05;0.00069244293263182;0.00060321437194943;-0.00029930516029708;-0.00027951167430729;-2.1382978957263e-05;-4.8613139369991e-05;-5.4219697631197e-05;-4.4170217734063e-05;-0.0004707723564934;-0.00039338073111139;0.00065843912307173;0.00056757376296446;0.0011500898981467;0.00099638220854104;0.00015541794709861;0.00011619009455899;-3.2785188523121e-05;-9.9260159913683e-06;0.00021833852224518;0.00015458687266801;0.00014234654372558;0.00014928517339285;7.1881753683556e-05;6.9283305492718e-05;0.0017216217238456;0.0018597251037136;0.00017933275375981;-0.0021426826715469;-0.0019273024518043;-0.00076660036575049;-0.00072325841756538;-0.00055077683646232;-0.00050253514200449;-0.00034445559140295;-0.00028264266438782;-3.4946879168274e-05;-2.958862523883e-06;2.0896425212413e-06;-2.7560170565266e-05;-0.00032787813688628;-2.5284623916377e-05;0.00043318190728314;0.00062805518973619;-3.804447260336e-05;0.00059057003818452;-5.4712691053282e-05;7.4590599979274e-05;-1.5978739611455e-06;1.3719531125389e-05;0.00031420434243046;0.00084700883598998;4.2795127228601e-05;0.0001884257508209;-6.3007646531332e-05;-0.00019874605641235;-0.00060007040156052;0.00031790503999218;0.00017797929467633;0.00020526783191599;-0.00029532980988733;-0.00013151473831385;-0.00049462262541056;-0.0004616262158379;-0.0010747148189694;0.00015947347856127;6.2745246395934e-05;-5.2035684348084e-05;-0.00047290962538682;1.3939889868197e-05;0.0002222332987003;-0.00085635355208069;0.0012577606830746;0.00057888979790732;-0.00040560966590419;0.00036637895391323;-0.00049235945334658;0.0001030971397995;0.00013843894703314;3.1209685403155e-05;-3.6472938518273e-05;0.00063631136436015;-0.001175137818791;0.00014021454262547;0.0001919736241689;-9.2301052063704e-05;3.471398667898e-05;-0.00021282126544975;0.00023358492762782;-9.3015078164171e-05;-0.00027558245346881;0.00017489075253252;-0.00029499683296308;0.00019555540347937;-0.00072993466164917;0.00089461414609104;-4.6380309868255e-06;-0.00019268732285127;-0.00021762505639344;0.00010891674901359;6.9977177190594e-05;-7.6992604590487e-05;0.00026033748872578;-0.0006511538522318;-0.00025169673608616;0.0019042001804337;5.4388376156567e-05;0.00080222170799971;0.00017336287419312;-2.1064524844405e-05;-5.3323852625908e-05;4.6424695028691e-05;-0.00012628656986635;-0.00017924235726241;-0.00010911689605564;0.00032770613324828;-1.8815759176505e-05;6.9745859946124e-05;0.00020297997980379;0.0012093713739887;8.7948879809119e-05;-0.00012737199722324;-0.0019817592110485;-0.00055651488946751;-0.0003202665830031;0.00022560333309229;-0.00089988915715367;4.4920565756001e-07;-0.00018427416216582;5.7102137361653e-05;0.00019999804499093;3.9929655031301e-05;-0.00018099347653333;-0.00016501898062415;-0.00022972225269768;0.00035300277522765;0.0006352667696774;-9.6893621957861e-05;0.00075982161797583;-6.5830041421577e-05;8.8968219642993e-05;-1.2491744200815e-05;2.1760855815955e-05;0.00017468826263212;0.0011994809610769;2.6099407477886e-05;0.00019410204549786;-4.4012736907462e-05;-0.00024895093520172;-0.0005352272419259;0.00035176804522052;0.00020175441750325;0.00019873144628946;-0.00035316578578204;-9.3654583906755e-05;-0.00060883996775374;-0.00032068279688247;-0.0013292683288455;0.00014992222713772;8.32162113511e-05;-1.554554910399e-05;-0.00061580899637192;1.951256990651e-06;0.00029457893106155;-0.0009165508672595;0.0012703078100458;0.00064739014487714;-0.00034135417081416;0.00037663883995265;-0.00043126117088832;8.9580164058134e-05;0.00013836903963238;3.1868828955339e-05;-3.1796207622392e-05;0.00070844334550202;-0.0011147448094562;0.00013781324378215;0.00022805920161773;-0.00010264692537021;1.40842385008e-05;-0.000289863004582;0.00024169002426788;-6.8405563069973e-05;-0.0002486027951818;0.00017517180822324;-0.0003123301139567;0.0001537829375593;-0.00082008074969053;0.00076790869934484;2.477523048583e-05;-0.00018659661873244;-0.00022663442359772;7.2198592533823e-05;7.6114702096675e-05;-6.3329411204904e-05;0.00030465595773421;-0.00065706967143342;-0.000256718340097;0.0020713126286864;-5.3862586355535e-05;0.00072272185934708;0.00018584154895507;-3.3067753975047e-05;-5.0585244025569e-05;5.0573358748807e-05;-0.00016275623056572;-0.00026936156791635;-0.00011040355457226;0.0003361169656273;-3.7257283111103e-05;6.8305933382362e-05;-3.3483688639535e-06;0.0011539858533069;6.6338747274131e-05;7.4718875112012e-05;-0.00197922764346;-0.00055135146249086;-0.00025008572265506;0.00025141221703961;-0.00088007695740089;3.6593384720618e-05;-0.00016865220095497;6.3788313127588e-05;0.00022948269906919;4.1498278733343e-05;-0.00019352203526068;-1.9591998352553e-05;-0.00033527391497046;0.00021555702551268;0.00046845560427755;-0.00010872722486965;0.00074611202580854;-6.5237385570072e-05;8.665413770359e-05;-1.8863847799366e-05;2.2895303118275e-05;4.1898550989572e-05;0.0012672562152147;6.4272267081833e-06;0.00015357752272394;-1.7052541807061e-05;-0.00024455855600536;-0.00034254949423485;0.00030662235803902;0.00018244118837174;0.00012658430205192;-0.00031401205342263;-4.0354119846597e-05;-0.00058665545657277;-0.00014975837257225;-0.0012617886532098;0.000107771877083;8.4775485447608e-05;1.4661255590909e-05;-0.000623652653303;-8.0704139691079e-06;0.00030445668380708;-0.00077167327981442;0.0010293540544808;0.00056971033336595;-0.00023631770454813;0.00029981532134116;-0.00029716960852966;5.9946898545604e-05;0.00011507816088852;2.5828836442088e-05;-2.1584010028164e-05;0.00060859089717269;-0.00083191646263003;0.00011049887689296;0.00021350335737225;-8.8866210717242e-05;-1.0253081200062e-05;-0.00029763870406896;0.00018935216940008;-3.744753121282e-05;-0.00017326221859548;0.00015853460354265;-0.00025281831040047;8.6024585471023e-05;-0.00071459240280092;0.00050993461627513;4.0893315599533e-05;-0.00014408382412512;-0.00018653254664969;1.6136200429173e-05;6.4100575400516e-05;-3.3146807254525e-05;0.0002694551658351;-0.00052811019122601;-0.00019544220413081;0.0017889561131597;-0.00011139272828586;0.00051348027773201;0.00016317497647833;-3.3119860745501e-05;-3.8136611692607e-05;4.2379564547446e-05;-0.00015377750969492;-0.00029334551072679;-8.5958585259505e-05;0.00026953601627611;-4.4783220801037e-05;5.3299430874176e-05;-0.00014852511230856;0.00090917130000889;3.624806413427e-05;0.00019124231766909;-0.001605674973689;-0.00045278438483365;-0.00014816480688751;0.00020866644626949;-0.00067103549372405;5.3771680541104e-05;-0.00012397623504512;5.545800740947e-05;0.00020582269644365;3.443756577326e-05;-0.00016087215044536;-0.00016290904022753;0.00033143619657494;-0.00029787598759867;-0.0002951345522888;-0.00023240366135724;-4.2090585338883e-05;-2.7700241844286e-05;2.5338256818941e-05;-3.9061665120244e-06;-5.0526837185316e-06;-0.00037175294710323;-0.00026844558306038;-0.00010185103019467;-3.8657268305542e-05;0.00010147234570468;4.3888663640246e-05;0.00035986912553199;-0.00016360382142011;-9.8479482403491e-05;0.00010410265531391;-9.5027520728763e-05;0.00021408341126516;0.00011414679465815;0.00051564676687121;0.00034737549140118;-4.682331928052e-05;-8.4096267528366e-05;0.00025235165958293;5.2441082516452e-05;-0.00011303647625027;-1.3305831089383e-05;0.00087199336849153;-0.00045313072041608;-0.00033494937815703;0.00031921011395752;-0.00046456197742373;0.00016013182175811;8.2033591752406e-05;7.6381671533454e-05;-2.1574032871285e-05;2.4638000468258e-05;-0.00098615302704275;0.00026614192756824;0.00011479196837172;0.00010884275252465;4.1931176383514e-05;-5.3994685004e-05;-0.00021337876387406;1.0435258445796e-05;-0.0001077030756278;0.0002918422978837;-9.5357419922948e-05;0.00021559243032243;-0.00011502022243803;0.00078863423550501;-0.00034735799999908;-0.0001321142190136;-2.5321713110316e-05;0.00014171174552757;-0.0001153536431957;-7.7699580288026e-05;2.9358163374127e-05;-0.00043419442954473;0.0001238043041667;0.0011822731466964;-0.00012157434684923;0.00065106630790979;0.00011045810242649;1.3770702025795e-05;0.00010900263441727;1.1796296348621e-05;-2.7738477001549e-05;-5.132061050972e-05;-5.0742950406857e-05;0.00019195405184291;-5.9552403399721e-05;5.0644044677028e-05;-9.0262765297666e-06;0.00028409244259819;0.0009034737595357;8.6639236542396e-05;-0.0014146619942039;-0.00022207589063328;-0.00029972652555443;-0.00040976848686114;-0.00061703938990831;9.1381138190627e-05;-0.00015284516848624;-1.1676923350024e-05;0.00010728574125096;3.3747310226317e-05;-9.2850452347193e-05;2.3405149477185e-05;-0.00043631691369228;0.00053030642447993;-0.00013877045421395;-0.00033197729499079;-4.5778382627759e-05;-0.00010969138384098;-2.6602543584886e-05;2.954430601676e-05;7.8051725722617e-06;-1.8096461644745e-05;-3.1153892905422e-06;-0.00039592460962012;-6.9719411840197e-05;-5.0793336413335e-05;5.6959626817843e-05;5.0304017349845e-05;0.00032171150087379;-9.1757159680128e-05;-6.7044158640783e-05;-1.6058347682701e-05;-5.0077764171874e-05;0.0001094029576052;0.00010450414993102;0.00016991290613078;0.00044742692261934;-2.2972326405579e-05;-7.7896387665533e-05;0.00012274777691346;8.2077334809583e-05;-6.1504077166319e-05;-1.860671909526e-05;0.00080530846025795;-0.00030244409572333;-0.00039931066567078;0.00020367869001348;-0.00049267418216914;9.4850998721085e-05;9.4690301921219e-05;9.3033129815012e-05;-2.376341035415e-05;1.8622682546265e-05;-0.00096979114459828;0.00011260348401265;8.8460663391743e-05;0.00011624422768364;4.7909536078805e-05;-3.6053359508514e-05;-0.00012589755351655;-3.0783053261985e-06;-0.00013722159201279;0.00028846075292677;-0.00010510913125472;0.00022818688012194;-6.1696169723291e-05;0.0008641179301776;-0.00017507068696432;-0.00014015231863596;-6.4316525822505e-05;0.0001347839133814;-9.8575357696973e-05;-7.1850365202408e-05;1.6053239960456e-05;-0.00041293143294752;3.9012313209241e-05;0.0009734149207361;-3.4162083466072e-05;0.0007337307324633;0.00026325933868065;3.8749913073843e-05;0.00010251255298499;2.8457036478358e-06;-2.6552401322988e-05;3.9494254451711e-05;-9.0328449005028e-06;0.00017016069614328;-3.2451083825435e-05;5.1696013542823e-05;8.8448005044484e-06;0.00054480810649693;0.0010286985198036;0.00010593787010293;-0.0014625585172325;-0.00051494332728907;-0.0003842971927952;-0.00044339845771901;-0.00058752967743203;6.490871328424e-06;-0.00018088590877596;-5.924737706664e-05;6.4654166635592e-05;2.5513480068184e-05;-6.7620501795318e-05;1.5786479707458e-05;-0.00077452993718907;0.00080682610860094;-1.2107667544115e-06;-0.00033950514625758;0.00010536911577219;-0.00015873344091233;-3.3233278372791e-05;4.3884021579288e-05;2.1968748114887e-05;-3.2341533369618e-05;0.00033404037822038;-0.0005497102974914;-2.9046137569821e-05;-6.0701884649461e-05;2.0927633158863e-05;5.4713545978302e-05;0.00026987522142008;-3.4012631658698e-05;-4.2787851270987e-05;-9.2830872745253e-05;-2.4251210561488e-05;4.0248152799904e-05;7.6428957981989e-05;-0.00014312093844637;0.00053826539078727;-3.4366439649602e-06;-7.6231706771068e-05;1.8556029317551e-05;0.00011357026232872;-2.899509127019e-05;-1.999422784138e-05;0.00075127364834771;-7.5550640758593e-05;-0.00040563807124272;4.6162847866071e-05;-0.00044578072265722;7.5276520874468e-06;0.00013329788635019;0.00013957753253635;-2.5469642423559e-05;3.8498205867654e-06;-0.00097188132349402;-0.00012931672972627;0.00011784811795224;0.00014093976642471;5.2301886171335e-05;-1.2976029211131e-05;6.3604106799175e-06;0.00010029925761046;-0.00017095904331654;0.00014856053167023;-0.00015634443843737;0.00018894211098086;-3.7185516703175e-05;0.00088587251957506;8.0023717600852e-05;-0.00018801006081048;-0.0001304568577325;0.00010063069930766;-8.3235048805363e-05;-6.9249857915565e-05;-1.4144053466225e-06;-0.00044054863974452;-8.8962173322216e-05;0.00087097921641544;0.00012895844702143;0.00089978333562613;0.00050855841254815;7.7873999543954e-05;0.0001087934433599;-8.7719154180377e-06;-2.4080707589746e-05;0.00011664369958453;4.6416404074989e-05;0.00016368908109143;1.6396314094891e-05;5.9456113376655e-05;3.0701063224114e-05;0.00095005898037925;0.0013253588695079;0.00013596244389191;-0.0017166619654745;-0.00098482542671263;-0.00052606873214245;-0.0005451173055917;-0.00059609935851768;-0.00014032915350981;-0.00023916197824292;-0.00013342595775612;2.8718162866426e-05;1.6269244952127e-05;-4.5109532948118e-05;4.5454216888174e-06;-0.0010001693153754;0.000968714710325;0.00019894039724022;-0.00028998294146731;0.00021539066801779;-0.00017576983373147;-4.0552182326792e-05;5.7416444178671e-05;3.3467658795416e-05;-4.0610095311422e-05;0.00056224002037197;-0.00059309205971658;2.6049157895613e-05;-5.7514695072314e-05;-1.139584583143e-05;4.19664720539e-05;0.00012612232239917;2.6142375645577e-05;-1.2937232895638e-05;-0.00015202503709588;2.8665679565165e-05;-1.7016114725266e-05;2.0111096091568e-05;-0.0004269256896805;0.00051939842524007;1.7141974240076e-05;-5.7831221056404e-05;-5.853119364474e-05;0.00011182811431354;-9.5020004664548e-06;-9.7401498351246e-06;0.00057091494090855;0.00021324632689357;-0.00032844432280399;-0.00013801601016894;-0.0003433920792304;-0.00013846265210304;0.00015537184663117;0.00016731368668843;-1.9703629732248e-05;-1.190598050016e-05;-0.0008151265210472;-0.00040403826278634;0.00014649212243967;0.00015135366993491;3.9978014683584e-05;1.0343679605285e-05;6.9441768573597e-05;0.00013750907965004;-0.00019167154096067;3.597158138291e-05;-0.00011059398093494;0.00013092042354401;2.7534768378246e-05;0.00074433989357203;0.00036976614501327;-0.0002044632419711;-0.00017574857338332;3.6851382901659e-05;-5.1825823902618e-05;-5.278027310851e-05;-2.1176410882617e-05;-0.00039073472726159;-0.00022222650295589;0.00068923085927963;0.0003623019438237;0.00092097569722682;0.00069772708229721;0.00011287527740933;0.00010737589764176;-2.0516916265478e-05;-1.5351728507085e-05;0.00014271019608714;8.6495543655474e-05;0.00013684769510292;8.3177961641923e-05;5.6644475989742e-05;4.3612781155389e-05;0.0011594463139772;0.0014824901008978;0.00014434986223932;-0.0017344515072182;-0.0013509487034753;-0.00060227973153815;-0.00059162004617974;-0.00050878181355074;-0.00031146840774454;-0.00026173409423791;-0.00019106052059215;-3.2576201647316e-06;7.8068196671666e-06;-1.7394204405718e-05;-1.2241897820786e-05;-0.0010629404569045;0.00097197550348938;0.00030093474197201;-0.00012663876987062;0.00024890538770705;-0.00012972253898624;-4.094568794244e-05;5.9089663409395e-05;3.584105434129e-05;-3.8265894545475e-05;0.00070212344871834;-0.00054076185915619;4.6379944251385e-05;-1.4975164049247e-05;-4.0280854591401e-05;2.0995730665163e-05;-4.3889551307075e-05;7.6129661465529e-05;1.8744149201666e-05;-0.00010579363879515;7.2238667598867e-06;-7.5336829468142e-05;-2.9972361517139e-05;-0.00059492670698091;0.00036990505759604;5.2239731303416e-05;-4.4686828914564e-05;-0.00011227330833208;7.856400043238e-05;1.2975230674783e-05;-6.1671062212554e-07;0.00030126460478641;0.00048085150774568;-0.00017950884648599;-0.00029136368539184;-0.0001615955698071;-0.0002492940693628;0.00016539159696549;0.00018143362831324;-1.1468560842331e-05;-2.6007332053268e-05;-0.00056547875283286;-0.00065148656722158;0.00015941419405863;0.00014361966168508;2.4804001441225e-05;3.3328487916151e-05;0.0001428490068065;0.00022682946291752;-0.00018911935330834;-0.0001452849683119;-9.8766744486056e-05;2.8992049919907e-05;6.7929082433693e-05;0.00049803039291874;0.00062116561457515;-0.00020583005971275;-0.00020663793839049;-1.9133791283821e-05;-1.5560204928988e-06;-3.284118429292e-05;-4.0529721445637e-05;-0.00030698737828061;-0.00034234634949826;0.00046235162881203;0.00059259246336296;0.00087713910033926;0.00084082287503406;0.00012998914462514;8.9949047833215e-05;-3.2171221391764e-05;-6.2284989326145e-06;0.00014412215386983;0.0001061051079887;8.3529550465755e-05;0.00013131876767147;5.6385884818155e-05;5.8264533436159e-05;0.001266461214982;0.001561316428706;0.00015621850616299;-0.0016357699641958;-0.0016395575366914;-0.00064596242737025;-0.0006078789010644;-0.00038186626625247;-0.00046305754221976;-0.00025169702712446;-0.00022308532788884;-6.4581536207697e-06;2.3961438273545e-05;4.4736722770722e-07;-3.7908623198746e-05;-0.00079000071855262;0.00065823725890368;0.0003524741914589;5.3357030992629e-05;0.00019695077207871;-1.9482298739604e-05;-3.2461084629176e-05;4.4978110963712e-05;2.5773537345231e-05;-2.2448019080912e-05;0.00060025206767023;-0.00026190996868536;4.6358469262486e-05;4.1028306441149e-05;-5.3248393669492e-05;-1.7657013813732e-05;-0.00020979114924558;0.00010971958545269;5.0535491027404e-05;-3.1519492040388e-05;-1.5758652807563e-05;-0.00011463086411823;-8.2474092778284e-05;-0.00058162858476862;7.0040405262262e-05;7.9078425187618e-05;-1.7974047295866e-05;-0.00011146070755785;-1.5297227946576e-05;2.4985944037326e-05;2.3972716007847e-05;-8.0194738984574e-05;0.00064018543343991;4.4385815272108e-05;-0.00036719883792102;1.9460325347609e-05;-0.00035338901216164;0.0001203753563459;0.00013640995894093;5.3262824621925e-06;-2.8719330657623e-05;-0.00014161309809424;-0.0007431052508764;0.00012497490388341;9.4456561782863e-05;-7.252776867972e-06;3.9837759686634e-05;5.5803859140724e-05;0.00014248008665163;-0.00014930445468053;-0.00017329762340523;6.1787424783688e-05;-4.3774998630397e-05;0.00013990084698889;9.3035254394636e-05;0.00071948673576117;-0.00012705237895716;-0.00016371117089875;-6.759756070096e-05;5.7061628467636e-05;-8.5975545971451e-07;-4.7897225158522e-05;-0.00011149929196108;-0.00036472865031101;0.00015275811892934;0.00075073190964758;0.00055415747920051;0.00073816656367853;0.0001140006861533;4.9335685616825e-05;-3.5220924473833e-05;5.8587465900928e-06;6.9016808993183e-05;6.4125684730243e-05;6.9070069912414e-06;0.00015127284859773;3.6212593840901e-05;5.3596424550051e-05;0.00087736017303541;0.0012360264081508;0.00012567930389196;-0.0010330543154851;-0.0014739494072273;-0.0005212610703893;-0.00046468724031001;-0.00014687106886413;-0.0005076143424958;-0.00015448265185114;-0.00018313630425837;9.948883416655e-06;5.1548795454437e-05;1.1705857104971e-05;-6.1904807807878e-05;-0.00059856887673959;0.00041870385757647;0.00039359607035294;0.00021137454314157;0.00013658845273312;0.00012152449926361;-3.2885793189052e-05;4.3736268708017e-05;1.7555399608682e-05;-1.0140696758754e-05;0.00050292967353016;2.7438029064797e-05;4.8347596020903e-05;8.7402026110794e-05;-5.9488160331966e-05;-6.1447150073946e-05;-0.00034192801103927;0.00015281907690223;8.2971455412917e-05;3.375617598067e-05;-6.0935031797271e-05;-0.00013021142513026;-0.00016897094610613;-0.00055549357784912;-0.00023293920094147;0.00010163440310862;5.4586876103713e-06;-9.917114948621e-05;-0.00012425650493242;2.6495861675357e-05;6.4104431658052e-05;-0.00037639765650965;0.00082123558968306;0.00023587020405103;-0.00043045540223829;0.00015449471538886;-0.00045069723273627;9.6275682153646e-05;0.00011584014282562;1.8512451788411e-05;-3.227949491702e-05;0.00017452829342801;-0.00086750031914562;0.00011716726294253;8.1026053521782e-05;-3.6061170249013e-05;4.30577674706e-05;-3.6894449294778e-05;9.388622129336e-05;-0.00012695946497843;-0.00019471927953418;0.00018858721887227;-0.00010749873763416;0.00019629583403002;-0.00022731184435543;0.00082129868678749;-7.2897499194369e-05;-0.00014552928041667;-0.00011646943312371;9.5528892416041e-05;2.4267847038573e-05;-5.6201628467534e-05;3.1997533369577e-05;-0.00041607572347857;-3.5902456147596e-05;0.0009958241134882;0.00033024887670763;0.00070397206582129;0.00011618918506429;2.2684173018206e-05;-3.9117690903367e-05;1.7682521502138e-05;1.9434801288298e-06;1.3657191630045e-05;-4.198474198347e-05;0.00019066654203925;1.8077642380376e-05;5.2121289627394e-05;0.00058832694776356;0.0010851363185793;0.00010541777010076;-0.00062392494874075;-0.0014687677612528;-0.00046857373672538;-0.00038200573180802;1.2540929674287e-05;-0.00059379090089351;-8.7477557826787e-05;-0.0001662531576585;2.3860366127337e-05;8.2011458289344e-05;2.0874722395092e-05;-8.9358640252613e-05;-0.00043661004747264;0.00020164759189356;0.00039706495590508;0.00035888698766939;6.2725055613555e-05;0.00029697883292101;-3.8984391721897e-05;5.1350809371797e-05;8.7936359705054e-06;6.467578828051e-07;0.00039277283940464;0.00035305946948938;4.5477714593289e-05;0.00012552330736071;-5.8261437516194e-05;-0.00011145082680741;-0.0004314421385061;0.00020490809401963;0.0001163333436125;9.5262825198006e-05;-0.00013592781033367;-0.0001254758099094;-0.00028444608324207;-0.00049131130799651;-0.0005556806572713;0.00011850072769448;2.7948703063885e-05;-7.5923126132693e-05;-0.00025317890685983;2.0993844373152e-05;0.00011981705756625;-0.00059157563373446;0.00097564049065113;0.00038922618841752;-0.00044077765778638;0.00025147886481136;-0.00049070949899033;8.5788735304959e-05;0.00011128425830975;2.6383757358417e-05;-3.4006021451205e-05;0.00039847855805419;-0.00096573156770319;0.00012006480392301;0.00010108738206327;-5.9830799727933e-05;4.0036688005785e-05;-0.00011860854283441;0.00010158270742977;-0.00010741392179625;-0.00021650778944604;0.00023818494810257;-0.00017113966168836;0.00021306127018761;-0.0004667186003644;0.0008575075189583;-3.4437744034221e-05;-0.00014512191410176;-0.0001574354537297;0.00010856875451282;4.3532178096939e-05;-6.1892293160781e-05;0.00013674794172402;-0.000477954687085;-0.00014445558190346;0.001282638288103;0.00016815221169963;0.00069044076371938;0.00012817473907489;2.4872610993043e-06;-4.22847988375e-05;2.8678914532065e-05;-5.6139462685678e-05;-5.4844473197591e-05;-7.1806978667155e-05;0.00023475562920794;6.4215817019431e-07;5.3223913710099e-05;0.00035966752329841;0.0010261308634654;8.9057670265902e-05;-0.00033093680394813;-0.0015437381807715;-0.00045619579032063;-0.00032365208608098;0.00011717300367309;-0.00068236625520512;-3.8080957892817e-05;-0.0001594287896296;3.6230761907063e-05;0.00011827144771814;2.7914913516724e-05;-0.00011850334703922;-1.3572420130004e-06;-3.3116393751698e-06;-1.068081928679e-05;6.2847611843608e-05;-0.00036360658123158;-1.6364667317248e-05;-0.00010221277625533;-0.00018162223568652;3.4166245313827e-05;0.00019263349531684;0.00010022502829088;1.5561477994197e-05;-4.0436705603497e-05;1.3745910109719e-05;-0.00044661661377177;-0.00013268522161525;-0.00010963231034111;-0.00012603726645466;6.2529885326512e-05;0.00028242822736502;1.6310272258124e-05;0.00013204457354732;4.2967825720552e-05;-5.4920375987422e-05;-7.5498479418457e-05;0.00045982023584656;0.00015848655311856;-0.00011435156920925;-8.1400630733697e-06;0.00020528364984784;8.4235580288805e-06;2.2317137336358e-05;-2.8635882699746e-05;-0.00010340737208026;2.7754022084991e-05;0.00052203563973308;-0.00010240881238133;0.00069974735379219;-0.00039925830787979;-0.0010602565016598;0.00072448572609574;-2.7402562409407e-05;5.3044623200549e-05;-0.00015527741925325;-6.8927489337511e-05;0.00055387947941199;-0.00038519463851117;8.6658321379218e-05;0.00034871365642175;0.00030589921516366;-0.0002301871572854;-7.3906317993533e-05;-0.00079039816046134;-5.0174076022813e-06;0.00016718538245186;-4.8058544052765e-05;-0.00060889485757798;0.00040694800554775;1.912568041007e-05;-2.9345810617087e-05;6.5746498876251e-05;0.00011303656356176;3.2128177736013e-06;-5.7471479522064e-06;7.4654184572864e-05;6.3294479332399e-05;0.00038612532080151;4.3553987779887e-05;0.00055555842118338;-1.7602600564715e-05;-0.00011863714462379;-1.8306162019144e-05;8.8833274958233e-07;-2.5137396733044e-05;0.00020100300025661;-2.8766384275514e-05;-3.0829323804937e-05;2.9566250304924e-05;-5.6677636166569e-06;0.00045550701906905;0.00010807596117957;-0.00014547267346643;-0.00019151305605192;-0.00074676895746961;-7.6041025749873e-05;-0.00019843720656354;1.4095805454417e-05;-0.00028926317463629;-8.8271081040148e-06;-4.7533631004626e-06;2.5073217329918e-05;-5.3153373301029e-05;4.3150457713637e-06;4.7428566176677e-05;-4.087401975994e-05;-4.0374998206971e-05;6.6166576289106e-05;0.00016790952940937;-0.00012363423593342;0.00048504048027098;-0.00041962030809373;-0.0011673618573695;0.0011825816472992;-9.1185909695923e-05;6.2762323068455e-05;2.6482262910577e-05;2.2060206902097e-05;0.00062469387194142;-0.00057781813666224;-1.08458689283e-05;3.2705520425225e-05;-6.0327503888402e-05;1.1535316843947e-05;-4.5605196646648e-05;-0.00020772125571966;0.00019852354307659;0.00010325886978535;-0.00010569319420028;-0.00055245292605832;0.00044689775677398;6.5408945374656e-05;-5.7992667279905e-05;-0.00015694722242188;0.00011499994434416;-4.0438790165354e-06;9.9357675935607e-06;-0.00010250298510073;-9.6419324108865e-05;0.00032912229653448;0.00044237071415409;0.00031255325302482;0.00056067871628329;-0.00024788212613203;-0.00061877025291324;-1.785164931789e-05;-4.2786512494786e-05;-0.00024372308689635;-0.00020197880803607;0.00023022890673019;0.00042049409239553;0.00018272915622219;0.00049406115431339;0.0003289686574135;-0.00023837211483624;-0.0002842286194209;-0.0005275416187942;-0.00064943061443046;0.00019748068007175;0.00018990339594893;-0.0002716991584748;-0.00050083664245903;4.3115462176502e-05;4.9755028157961e-05;0.000139823925565;0.0001168461094494;-1.416166924173e-05;-2.5921904125425e-06;0.00013768603093922;0.00010137486970052;0.0006091805989854;0.00056286907056347;0.00021958671277389;0.00042635423596948;-0.00013632135232911;-0.00023558631073684;4.615257421392e-05;2.8311256755842e-05;0.00014614718384109;0.00018565721984487;7.5460447988007e-05;7.9601682955399e-05;-8.8161723397207e-06;0.00085332308663055;0.00077185098780319;-0.00034431915264577;-0.00027496786788106;-0.00092787336325273;-0.0010604264680296;-0.00030715487082489;-0.00025040976470336;-0.00023387548571918;-0.00032032691524364;7.9331284723594e-06;-6.0588795349759e-06;-6.3082501583267e-05;-6.5516112954356e-05;1.1435204214649e-06;9.0318160061997e-08;-4.9073125410359e-05;9.5700952442712e-06;3.302087134216e-05;0.00027055109967478;0.00010871038830373;1.3366053281061e-05;-0.00010738164564827;-4.9755948566599e-05;-2.7084061002824e-06;-5.8428711781744e-05;-6.8949211708969e-06;1.0799700248754e-05;7.9684796219226e-05;0.00035486684646457;7.728801574558e-05;9.2901122116018e-05;1.1917180017917e-05;-1.6894346117624e-06;-0.00020835534087382;-7.5241114245728e-05;-8.6467029177584e-05;3.9916372770676e-05;2.7771415261668e-05;-0.0001008437902783;-0.00030806180438958;2.6552697818261e-06;8.0026911746245e-05;-5.8475793593971e-06;-0.00015353111666627;-2.6768359020934e-05;1.8226082829642e-05;2.2830481611891e-05;-7.4697985837702e-05;-8.7157408415806e-05;0.00041674994281493;-0.0002944917359855;0.00064477801788598;0.00053415709408;-0.00082879676483572;5.7398097851546e-05;-2.1147347979422e-06;-6.9067966251168e-05;-7.7618991781492e-05;-0.00030413520289585;0.00038398613105528;6.5868705860339e-05;0.00029117680969648;0.00023165173479356;-6.7353365011513e-05;-0.00016084691742435;1.6832293567859e-06;-0.00069683231413364;-4.4711199734593e-05;7.869080582168e-05;0.00033471090137027;-0.000487261073431;-2.8743594157277e-05;-8.6480840764125e-06;0.00010324562754249;7.4091993155889e-05;-1.456236532249e-06;2.1697655938624e-06;4.7379104216816e-05;4.9924135964829e-05;8.0436257121619e-06;0.00018879228446167;6.9521906880254e-06;0.00038791642873548;-3.6079207347939e-05;-3.4278313250979e-05;-2.9317774533411e-05;-1.0030052180809e-05;-1.8611528503243e-05;0.00014686421491206;3.4543616493465e-05;-4.8426922148792e-05;-1.4573960470443e-05;0.0002813356986735;4.7450930651394e-06;-0.0001312614622293;-6.1302227550186e-05;-1.3238146721051e-06;-0.00046519126044586;2.7527836209629e-05;-0.00011294151772745;-2.278043939441e-05;-0.00016768839850556;2.2414122213377e-05;1.8155640191253e-06;-4.032547622046e-06;-5.1128015911672e-05;-1.1772336620197e-05;1.2179877558083e-05;-6.640148058068e-06;8.3035760326311e-05;-0.00071296433452517;1.9619250451797e-05;-0.00014983881555963;-9.116313776758e-06;0.00054686149815097;-0.00015866030298639;0.00019699953554664;-3.4151617001044e-05;1.6657671949361e-05;1.5711158994236e-05;-0.0011165366740897;6.7629502154887e-05;-0.00017127582395915;-0.00021428042964544;-0.00014015941997059;0.0005156461847946;-3.9972095692065e-05;0.00031064989161678;0.00011825537512777;-0.00015064052422531;-1.5808001990081e-05;0.00091019656974822;-3.8551275792997e-05;-0.00024093927640934;2.0417688574526e-05;0.00041134841740131;-3.3900967537193e-05;1.107852858695e-05;-2.3185615646071e-05;-0.00012077722203685;7.2829498094507e-05;0.00022235154756345;-6.6664397309069e-05;0.00061675230972469;-0.00043414396350272;-0.00099921750370413;0.00074229476740584;6.9656838604715e-05;4.9541107728146e-05;-0.00023168142070062;-5.0792794354493e-05;0.00015450018690899;-0.0003968694654759;1.4365971765073e-05;0.00029414548771456;0.00035609942278825;-2.0525680156425e-05;-8.9771790953819e-05;-0.00072123209247366;-3.3633990824455e-05;0.00013426247460302;-8.9186192781199e-05;-0.00015888964117039;0.00042342851520516;-8.4722894825973e-05;-2.7108870199299e-05;0.00028639985248446;0.00010069693234982;1.4128674592939e-05;-5.4093525250209e-06;0.0001268662745133;7.7971177233849e-05;0.00033977304701693;-7.3238654294983e-05;0.00072211911901832;-4.0972892747959e-05;-0.0001615001965547;3.8764854252804e-05;-8.9493682025932e-05;-4.5959863200551e-05;0.00027378485538065;-4.0106799133355e-05;3.2583491702098e-05;-6.865866453154e-07;-5.3520449000644e-05;0.00040363852167502;-7.3547416832298e-05;-0.00010456330346642;-0.00016649020835757;-0.00075690634548664;0.0001223674044013;-0.00021332409232855;5.5904514738359e-05;-0.00033702541259117;2.3651165975025e-05;9.2665875854436e-05;3.1008832593216e-05;-0.00020795981981792;1.5477280612686e-05;-9.1185811470496e-06;5.8339210227132e-06;-9.6921448857756e-06;8.8783752289601e-05;-0.00067440536804497;1.5386851373478e-05;-0.00018569153326098;-0.0001110072771553;0.00036150068626739;1.2807501661882e-05;0.00018521664605942;-9.6062049124157e-06;-2.0154773665126e-05;1.9968529159087e-05;-0.00095513981068507;-3.5258901334601e-05;-0.0001740348234307;-0.00021352371550165;-3.0064802558627e-05;0.00049474689876661;-1.2373136996757e-05;0.00028942205244675;7.6981836173218e-05;-0.00012726556451526;-6.124817446107e-05;0.0008608786156401;6.7224733356852e-05;-0.00021880511485506;6.9422958404175e-06;0.00037838949356228;-1.6693793440936e-05;2.1650072085322e-05;-3.2384316000389e-05;-0.00014011903840583;5.7857007050188e-05;0.0004622194392141;-0.00010951470176224;0.00080363027518615;-0.00051474518841133;-0.0012773290509358;0.00091018580133095;1.775503551471e-05;6.4924730395433e-05;-0.0002434590132907;-7.3172908741981e-05;0.00047134634223767;-0.00048639590386301;6.5964282839559e-05;0.00038329194649123;0.00040119071491063;-0.0001611950865481;-9.2239679361228e-05;-0.00091201940085739;-1.7579946870683e-05;0.0001983163820114;-8.4335173596628e-05;-0.00049560301704332;0.00051514647202566;-3.0810813768767e-05;-3.6145574995317e-05;0.00020092529302929;0.00013264497101773;1.0357836799813e-05;-7.0683086050849e-06;0.00011809959687525;8.7100394011941e-05;0.00046458188444376;-1.8930330043077e-05;0.00080524623626843;-4.1160943510476e-05;-0.00018004165031016;1.5481919035665e-05;-4.5544264139608e-05;-4.390487447381e-05;0.00029398570768535;-4.3239993829047e-05;-4.8323604460165e-06;1.7805881725508e-05;-3.1318755645771e-05;0.00053991546155885;2.5908355382853e-05;-0.00015966326463968;-0.00022637787333224;-0.00094879901735112;3.0320501537062e-05;-0.00025490735424682;4.4012482248945e-05;-0.00040253717452288;1.1405713848944e-05;4.1573854105081e-05;3.4905573556898e-05;-0.00014389038551599;1.1515200640133e-05;-4.5686242629017e-06;-8.0971165061783e-07;-1.0975944860547e-05;8.4751292888541e-05;-0.00055629014968872;-2.0156896880508e-06;-0.00017041510727722;-0.00019264369620942;0.00016018998576328;0.00016764395695645;0.00015074292605277;1.1175482541148e-05;-4.3429743527668e-05;1.9145005353494e-05;-0.00071849976666272;-0.00012564098869916;-0.00015669710410293;-0.000186451812624;5.2014722314198e-05;0.00041887132101692;1.1241634638282e-05;0.00022658138186671;5.2470240916591e-05;-9.2735266662203e-05;-8.8987399067264e-05;0.00070713402237743;0.00015789103053976;-0.00017343951913062;-5.0058583838108e-06;0.00030695542227477;1.7979240283239e-06;2.6833742595045e-05;-3.5574226785684e-05;-0.00013930468412582;4.2237421439495e-05;0.00059519021306187;-0.00012573445565067;0.00087014638120309;-0.00051768985576928;-0.0013541639782488;0.0009370464249514;-1.9009639800061e-05;6.8320900027175e-05;-0.0002242075279355;-8.4102830442134e-05;0.00064086163183674;-0.00049904506886378;9.6636722446419e-05;0.0004199473769404;0.00039781426312402;-0.00024791280156933;-9.0493325842544e-05;-0.00097511190688238;-1.0027993084805e-05;0.00021949131041765;-7.0332047471311e-05;-0.00068732345243916;0.00052583974320441;7.5535326686804e-06;-3.8149151805555e-05;0.00012682720262092;0.00014343610382639;6.6475781750341e-06;-7.7317663453869e-06;0.00010520968498895;8.5179213783704e-05;0.00050614727661014;3.2097916118801e-05;0.00077209708979353;-3.3495871321065e-05;-0.00017376117466483;-6.513152129628e-06;-1.413224163116e-05;-3.6427107261261e-05;0.00027935471734963;-4.0742634155322e-05;-2.4634717192384e-05;3.0289611459011e-05;-1.4732756426383e-05;0.00058767379960045;0.00010868727986235;-0.00018525875930209;-0.00024575451971032;-0.00098948099184781;-5.7788649428403e-05;-0.00026234958204441;2.6614799935487e-05;-0.00040181339136325;-9.6719963948999e-07;8.5546553236782e-06;3.3936310501304e-05;-9.5081893960014e-05;8.1765356299002e-06;7.0506452175323e-05;-6.1317150539253e-05;-5.3584175475407e-05;0.00010104761167895;0.00022256617376115;-0.0001906068646349;0.0006882082670927;-0.0006371412309818;-0.0017229446675628;0.0017692507244647;-0.00012913251703139;9.783075802261e-05;4.2664600186981e-05;2.571266850282e-05;0.00089876685524359;-0.00088374328333884;-2.9820153940818e-05;3.4109067200916e-05;-6.9003632233944e-05;4.3567910324782e-05;-6.0418853536248e-05;-0.000297319580568;0.00029529383755289;0.00013661026605405;-0.00016031756240409;-0.00077758968109265;0.00068898010067642;9.3763890617993e-05;-9.0736757556442e-05;-0.00023107753077056;0.00018587446538731;-1.1613643664532e-06;1.1381554941181e-05;-0.00016061794303823;-0.00013562064850703;0.00053110113367438;0.00060078012757003;0.00054219306912273;0.00075101939728484;-0.00049941061297432;-0.00079608417581767;-3.8909125578357e-05;-6.0513491916936e-05;-0.00037120722117834;-0.0003038153226953;0.00041642406722531;0.00055775762302801;0.00026754353893921;0.00072231859667227;0.00047718134010211;-0.000362351158401;-0.00040397356497124;-0.00082760857185349;-0.00089150585699826;0.00031574457534589;0.00027690947172232;-0.0004817901935894;-0.00066534854704514;7.3719122156035e-05;7.3058356065303e-05;0.000201410453883;0.00018137530423701;-2.0195173419779e-05;-3.8849657357787e-06;0.00020819905330427;0.00015122686454561;0.00093100313097239;0.00082508922787383;0.00035356238367967;0.00059514329768717;-0.00020698629668914;-0.00035192360519432;7.0538641011808e-05;3.9939830458025e-05;0.00024231433053501;0.0002680612669792;0.000114520182251;0.00013341693556868;-1.756906749506e-05;0.0012542400509119;0.0011635961709544;-0.00050403730710968;-0.00040637640631758;-0.0014130348572508;-0.001537797274068;-0.00048001942923293;-0.00036706411628984;-0.00037110448465683;-0.0004678399709519;1.0428686437081e-05;-4.4646185415331e-06;-0.00010655482765287;-0.00010242778080283;7.8251330705825e-05;-6.7367051087786e-05;-6.4898187702056e-05;0.00010862984345295;0.00025904219364747;-0.00018832155910786;0.00078249810030684;-0.00067140185274184;-0.0019164414843544;0.001941705471836;-0.00014875970373396;0.00010378067963757;4.5500601117965e-05;3.5841600038111e-05;0.0010206887964159;-0.00094853685004637;-1.9623488697107e-05;5.2991650591139e-05;-9.9987315479666e-05;3.0406459700316e-05;-8.2787861174438e-05;-0.00032731442479417;0.00031090559787117;0.00016578532813583;-0.0001734311808832;-0.00089293043129146;0.0007220910047181;0.00010723593004514;-9.708249126561e-05;-0.00026069715386257;0.0001942264061654;-5.3367007240013e-06;1.6425785361207e-05;-0.0001725912297843;-0.00015923676255625;0.00053736555855721;0.00071056152228266;0.00052539620082825;0.00091091741342098;-0.00042660994222388;-0.0010107634589076;-3.2906129490584e-05;-7.269417255884e-05;-0.00040797152905725;-0.00033942048321478;0.00038928666617721;0.00068766582990065;0.00029731838731095;0.0007922007353045;0.00052716198842973;-0.00038318609585986;-0.0004584766284097;-0.00085957709234208;-0.0010378238512203;0.00033500394783914;0.00031928124371916;-0.00045524383313023;-0.00081292953109369;7.3980270826723e-05;8.4451428847387e-05;0.00023198394046631;0.00019576653721742;-2.3183520170278e-05;-3.8808648241684e-06;0.00022848210937809;0.00016833550762385;0.0010170531459153;0.00093490397557616;0.00036615569842979;0.00070533569669351;-0.00022814066323917;-0.00039718876359984;7.7246746513993e-05;4.6131201088428e-05;0.00024777653743513;0.00031098959152587;0.0001285631879;0.00013963688979857;-1.6769523426774e-05;0.0014074281789362;0.0012926408089697;-0.00056676781969145;-0.00045370307634585;-0.0015452299267054;-0.0017548295436427;-0.00051559205166996;-0.00041684292955324;-0.0003938221198041;-0.00053744699107483;1.3244124602352e-05;-8.9732448032009e-06;-0.00010844218923012;-0.00011311013804516;5.3492702136282e-05;-4.5823933760403e-05;-4.6178563934518e-05;7.1413945988752e-05;0.00017904039123096;-0.00010845305951079;0.00054870796157047;-0.00044713416718878;-0.0012964125489816;0.0012987405061722;-0.00010185764404014;6.6855376644526e-05;3.9083388401195e-05;1.9227420125389e-05;0.00069419393548742;-0.00061286485288292;-6.0416127780627e-06;4.3639502109727e-05;-7.8316385042854e-05;1.8366594304098e-05;-7.2367991378997e-05;-0.00022690229525324;0.00020693514670711;0.00011230973177589;-0.00011036694195354;-0.00062010152032599;0.00046482332982123;7.1502618084196e-05;-6.1098493461031e-05;-0.00018025630561169;0.00012584381329361;-6.4895652940322e-06;1.2545613572001e-05;-0.00010971042502206;-0.00010925126844086;0.00035859236959368;0.00052208098350093;0.00032408098923042;0.00066638307180256;-0.00022984329552855;-0.00075848074629903;-1.4885101336404e-05;-5.0438207836123e-05;-0.00027687597321346;-0.00023374537704512;0.00022578774951398;0.00049901305465028;0.00020218463032506;0.00056998734362423;0.00038632523501292;-0.00026419418281876;-0.00032710612867959;-0.00059231580235064;-0.00076934962999076;0.0002122663136106;0.00021729974832851;-0.00026961811818182;-0.00058984057977796;4.6685210691066e-05;5.9183414123254e-05;0.00016510221757926;0.00013462646165863;-1.5155657820287e-05;-1.9138556126563e-06;0.00015612746938132;0.00011780466593336;0.0006696839700453;0.00063416361808777;0.00023909343872219;0.00050658034160733;-0.00014778813056182;-0.00026689920923673;4.8394376790384e-05;2.9247919883346e-05;0.00016827082436066;0.00022947580146138;8.8435037469026e-05;9.1540881840046e-05;-1.6539910575375e-05;0.00093939923681319;0.00083998223999515;-0.00037854525726289;-0.00030144635820761;-0.0010074373567477;-0.0011864309199154;-0.00034305351437069;-0.00029103987617418;-0.0002629883820191;-0.00037983927177265;1.1068957974203e-05;-6.5907447606151e-06;-7.7149030403234e-05;-8.6451327661052e-05;-1.1422797570049e-06;2.5220736006304e-06;-6.2844890635461e-05;1.0763818863779e-05;1.0863981515286e-05;0.00039920103154145;0.00010323186870664;7.0581845648121e-05;-7.2844042733777e-05;-0.00015284823894035;1.5508846900048e-06;-8.8049921032507e-05;-1.3639087228512e-05;1.1939823707507e-05;6.374140502885e-05;0.00054377841297537;0.00010500787902856;0.00013336043048184;1.8746732166619e-05;4.2892479541479e-06;-0.00029294198611751;-6.7709246650338e-05;-0.00016522116493434;5.0676571845543e-05;4.5670887629967e-05;-8.6194530013017e-05;-0.00046841471339576;-5.6526715752625e-07;0.00011885959247593;2.2511931092595e-06;-0.00022462233027909;-3.1695832149126e-05;2.1440799173433e-05;2.859756568796e-05;-9.7241281764582e-05;-0.00010490047134226;0.00044549751328304;-0.00036643180646934;0.00075083022238687;0.00066973682260141;-0.0010192138142884;7.3958166467492e-05;5.9519948081288e-06;-7.9713652667124e-05;-0.00011820944200736;-0.00038308117655106;0.00042789842700586;6.8602974351961e-05;0.00030679866904393;0.0002837463398464;-6.2341321608983e-05;-0.00015862353029661;1.6252173509201e-06;-0.00078511919127777;-6.5671258198563e-05;0.00010634490172379;0.00041757736471482;-0.00052657636115327;-3.8105165003799e-05;-2.0224035324645e-05;0.00012729782611132;0.00012124347267672;-3.1448155368707e-06;4.9610657697485e-06;6.7156077420805e-05;6.0268794186413e-05;-1.7023685359163e-05;0.00027075893012807;-1.5116511349333e-05;0.00061217666370794;-1.0317956366634e-05;-0.00010049991396954;-4.110439112992e-05;-1.3795374798065e-05;-3.3204742067028e-05;0.00019890822295565;2.563246198406e-05;-6.1640617786907e-05;-1.8386215742794e-05;0.00039618290611543;-1.0308298442396e-05;-0.00018388890021015;-8.0932790297084e-05;3.6120214645052e-05;-0.00069079868262634;4.6312768972712e-05;-0.00014618408749811;-4.3110035221616e-06;-0.00025872341939248;2.9907259886386e-05;-1.2021311022181e-06;2.1186194771872e-06;-5.9920464991592e-05;-6.7917162596132e-06;7.8673965617782e-06;-7.1357986598741e-05;9.3895905592944e-06;-5.0907445256598e-05;0.00056189770111814;4.4853135477751e-05;0.00018486691988073;5.4316737077897e-05;-0.00036771330633201;1.2477496056817e-05;-0.00013077844050713;-2.4734741600696e-05;4.4325588532956e-06;-8.0194904512609e-06;0.00082096317782998;0.00013248261529952;0.00018354936037213;3.1592684536008e-05;1.7487876903033e-05;-0.0003890038933605;-2.1712750822189e-05;-0.00029980871477164;5.600832082564e-05;7.7064556535333e-05;-1.0130051123269e-05;-0.00068574282340705;-9.3618655228056e-06;0.00017434117035009;2.3237746063387e-05;-0.00032076585921459;-3.1148050766205e-05;2.0415349354153e-05;3.1925748771755e-05;-0.00011516689846758;-0.00010631591430865;0.00032512506004423;-0.00040462869219482;0.00070080376463011;0.00074881530599669;-0.0010888575343415;8.8006323494483e-05;2.7557538487599e-05;-7.2488539444748e-05;-0.00017691234825179;-0.00043320018448867;0.00035125680733472;4.4327392970445e-05;0.00020940964168403;0.00030493017402478;-1.7720345567795e-05;-8.1007659900934e-05;-1.6726578451198e-06;-0.0006735748029314;-9.7443931736052e-05;0.00013186228170525;0.00046340381959453;-0.00039229288813658;-4.7664660087321e-05;-4.5224282075651e-05;0.00013699416012969;0.0002004860289162;-5.5990749388002e-06;1.0210267646471e-05;9.1529960627668e-05;6.1056060076226e-05;-8.4605911979452e-05;0.0003572941350285;-6.5678337705322e-05;0.00095733202761039;6.0613605455728e-05;-0.00022718204127159;-5.7635676057544e-05;-1.7351758287987e-05;-5.7905632274924e-05;0.00025067949900404;-7.4037516242242e-06;-8.709634130355e-05;-2.3246317141457e-05;0.00052436033729464;-6.3576160755474e-05;-0.00024414877407253;-8.8738503109198e-05;0.00013609995949082;-0.00098954874556512;8.1369551480748e-05;-0.00017024645057973;4.4974451157032e-05;-0.00037692033220083;3.7792822695337e-05;-9.9322587630013e-06;1.6922032955335e-05;-5.3418651077664e-05;-1.7955821022042e-05;2.1076733901282e-05;-2.106550937242e-06;8.87451460585e-05;-0.00088456581579521;5.2788960601902e-05;-0.000175327717443;9.1062538558617e-05;0.00093309866497293;-0.00038978082011454;0.00028548180125654;-6.0372021835065e-05;9.6678748377599e-05;1.1928149433516e-05;-0.0016511912690476;0.00019087434338871;-0.00020707084331661;-0.00028086107340641;-0.00025910991826095;0.00065004132920876;-6.5615437051747e-05;0.00043448392534629;0.00015003455337137;-0.00025450729299337;1.683284608589e-05;0.0011711221886799;-0.00015407416503876;-0.00035857717739418;3.8795111322543e-05;0.00058585614897311;-5.7785298849922e-05;-1.7717566151987e-06;-1.5502646419918e-05;-0.00014369553537108;0.00010189623571932;-0.00014020227536093;-1.229130612046e-05;0.00043662241660058;-0.00045254582073539;-0.00094990170327947;0.0007662654388696;0.00016967358533293;5.3621362894773e-05;-0.00034153304295614;-3.3152056857944e-05;-0.00027109769871458;-0.00041229568887502;-6.2407096265815e-05;0.00015572672418784;0.00042372028110549;0.0002134134847438;-6.1850209021941e-05;-0.00052054185653105;-9.8719894594979e-05;0.00011849526345031;-0.00013764246250503;0.000375267729396;0.00043233382166363;-0.00018930407532025;-2.9565948352683e-05;0.00053163274424151;9.5351999334525e-05;2.5200799427694e-05;-6.8395802372834e-06;0.00016013135609683;0.00011367668776074;0.00032823148649186;-0.00018174751312472;0.0010998051147908;-9.7664233180694e-05;-0.00028799095889553;0.00013543448585551;-0.00014811311848462;-7.0425041485578e-05;0.00032917872886173;-5.9357851569075e-05;4.620601885108e-06;-4.6065426431596e-05;-9.8872340458911e-05;0.00046917627332732;-0.00022337681730278;-5.7537410611985e-05;-0.00020272575784475;-0.00099273247178644;0.0003142352506984;-0.00023636744299438;9.5452844107058e-05;-0.0003778638492804;7.7161043009255e-05;0.00015313968469854;4.0255636122311e-05;-0.00029059682856314;3.2576634112047e-05;5.4207524954109e-05;-4.6644716348965e-05;-3.1792755180504e-05;7.7716562373098e-05;8.5068619227968e-05;-9.6379699243698e-05;0.00044367619557306;-0.00042930827476084;-0.0012441152939573;0.0012986827641726;-8.7759086454753e-05;7.3873685323633e-05;4.4828248064732e-05;1.094501294574e-05;0.00061723543331027;-0.00065388134680688;-3.8128291635076e-05;6.4079890762514e-06;-4.6009499783395e-05;9.2308357125148e-05;-6.6240543674212e-05;-0.00016038850299083;0.00017967626627069;7.8349650721066e-05;-0.00011842649109894;-0.00050117587670684;0.00048374212929048;6.3350074924529e-05;-6.9714333221782e-05;-0.00017735024448484;0.00015724639524706;3.3746623557818e-06;8.0763120422489e-06;-0.00012791686458513;-9.5029579824768e-05;0.00039002799894661;0.00039901552372612;0.00044047250412405;0.00050638482207432;-0.00046195121831261;-0.00053721049334854;-4.0691458707443e-05;-5.038103699917e-05;-0.00030412070918828;-0.00024400443362538;0.00034988901461475;0.00038645655149594;0.00018035105313174;0.00048558230628259;0.00032655979157425;-0.00024214015866164;-0.00027122642495669;-0.00060340756317601;-0.00058248703135177;0.00026491624885239;0.00021502168965526;-0.00038243838935159;-0.00044614050420932;6.8749548518099e-05;6.3474319176748e-05;0.00015704204270151;0.00014375144382939;-1.3011506780458e-05;-1.5852203887334e-06;0.00016370520461351;0.0001161038671853;0.00074994150782004;0.00062284787418321;0.00031241419492289;0.00043991245911457;-0.00017891426978167;-0.00027831277111545;5.4845062550157e-05;2.8544516680995e-05;0.00022514701413456;0.00021514398395084;0.00010715815005824;0.00012205686653033;-2.4642580683576e-05;0.00092444679467008;0.00090815150178969;-0.00037227311986499;-0.00029730080859736;-0.0011069263564423;-0.0011341938516125;-0.00040024964255281;-0.00028455656138249;-0.00033349744626321;-0.00037233921466395;6.371355993906e-06;-1.5946102394082e-06;-0.00010613802442094;-9.1254521976225e-05;8.8258675532416e-05;-7.5645446486305e-05;-6.0593094531214e-05;0.0001246829633601;0.00017375027528033;-0.00014806333638262;0.00074643228435889;-0.00065524148521945;-0.0020838193595409;0.0021402477286756;-0.00015316451026592;0.00011991657083854;5.5018845159793e-05;4.0590191929368e-05;0.0010731468209997;-0.0010716505348682;-4.5651722757611e-05;3.3324144169455e-05;-9.8803597211372e-05;0.00011614333925536;-0.00011645077756839;-0.00027182098710909;0.00027436017990112;0.00015525809430983;-0.0001982817921089;-0.00086934014689177;0.00075982138514519;0.00011412943422329;-0.00011851149611175;-0.00029682373860851;0.00024878085241653;4.2950355236826e-06;1.7370693967678e-05;-0.00021587905939668;-0.00017249578377232;0.00056539569050074;0.00065317214466631;0.00065911636920646;0.00088435295037925;-0.00063812249572948;-0.00098947726655751;-6.3795305322856e-05;-9.1975198301952e-05;-0.00049170869169757;-0.00040522293420509;0.00052300549577922;0.00070168945239857;0.00029969413299114;0.00071989692514762;0.00046887039206922;-0.00036018071114086;-0.00043459012522362;-0.00087383668869734;-0.00090906670084223;0.00043922677286901;0.00038138052332215;-0.00057364988606423;-0.00079593318514526;0.00010497133189347;0.00010773534449982;0.0002581310691312;0.00022762980370317;-2.4045217287494e-05;-2.7623407277133e-06;0.0002603163884487;0.00018752001051325;0.0012279509101063;0.0010628341697156;0.00046187796397135;0.00075760966865346;-0.0002937586104963;-0.00048452700139023;9.5920797321014e-05;5.1793482271023e-05;0.00032380473567173;0.00035107159055769;0.00017104516155086;0.00019947814871557;-2.7840962502523e-05;0.0015676728216931;0.0015748699661344;-0.00062775460537523;-0.00050507305422798;-0.0018430077470839;-0.0019619909580797;-0.00063499191310257;-0.00047358978190459;-0.00050727202324197;-0.00062594853807241;1.07393880171e-05;-6.5709409682313e-06;-0.00014583459415007;-0.00013953690358903;9.1709909611382e-05;-7.7892742410768e-05;-7.0308560680132e-05;0.00012435903772712;0.00019905202498194;-0.00012239580973983;0.00080598890781403;-0.00062940508360043;-0.0021733967587352;0.0021939005237073;-0.00016596139175817;0.00011900220852112;5.632264947053e-05;5.0778144213837e-05;0.0011468514567241;-0.0010716717224568;-2.8546612156788e-05;5.6738994317129e-05;-0.00013683424913324;9.6654061053414e-05;-0.00014427318819799;-0.00028448735247366;0.00026354985311627;0.00017861748347059;-0.00019912041898351;-0.00094514677766711;0.00073248101398349;0.00012228218838573;-0.00011971125786658;-0.00031448449590243;0.00024534779367968;2.5921713131538e-07;2.2111966245575e-05;-0.00021764529810753;-0.00018881019786932;0.00053334305994213;0.00072065443964675;0.00060416362248361;0.00099792995024472;-0.00051392463501543;-0.0011753925355151;-5.4319694754668e-05;-0.00010254958760925;-0.00050266232574359;-0.00042685130028985;0.00046125365770422;0.00080649345181882;0.00031091790879145;0.00073384155984968;0.0004805721109733;-0.00035176140954718;-0.00046150333946571;-0.00084773165872321;-0.00098377733957022;0.00043618443305604;0.00041224333108403;-0.00051193829858676;-0.00090485991677269;9.9217235401738e-05;0.00011700170580298;0.0002763856027741;0.00023115426301956;-2.6062702090712e-05;-1.8423162373438e-06;0.0002657349978108;0.00019579545187298;0.0012470101937652;0.0011258865706623;0.00043583670048974;0.00084616418462247;-0.00029331818223;-0.00051937520038337;9.8951713880524e-05;5.4604301112704e-05;0.00030779675580561;0.00038493401370943;0.00017476861830801;0.00020236436103005;-2.6940651878249e-05;0.0016359102446586;0.0016344106988981;-0.00065352872479707;-0.00052619056077674;-0.0018752602627501;-0.0020882305689156;-0.00063735002186149;-0.00050356634892523;-0.00049536157166585;-0.00067908794153482;1.3266417226987e-05;-1.1134568012494e-05;-0.00013783111353405;-0.00014835449110251;6.2071718275547e-05;-5.254090501694e-05;-5.1216979045421e-05;8.0552650615573e-05;0.00014570746861864;-6.1876671679784e-05;0.00057344802189618;-0.0004150249005761;-0.0014582691946998;0.0014502956764773;-0.00011377155897208;7.5631258368958e-05;4.6481731260428e-05;2.9221946533653e-05;0.00077760551357642;-0.00068166869459674;-7.972601451911e-06;5.0337141146883e-05;-0.00010807235958055;5.4726457165089e-05;-0.0001149274976342;-0.00020250254601706;0.00017466438293923;0.00012385376612656;-0.00012579500616994;-0.00066239439183846;0.00046380917774513;8.0669829912949e-05;-7.4175120971631e-05;-0.00021386546723079;0.00015499713481404;-3.6969590837543e-06;1.6255486116279e-05;-0.00013547930575442;-0.00012772377522197;0.00035764172207564;0.00053666409803554;0.00036515240208246;0.00072658940916881;-0.00026469826116227;-0.00087948038708419;-2.533752740419e-05;-6.8992980231997e-05;-0.00033260599593632;-0.00028920327895321;0.00026001667720266;0.00058112607803196;0.00021047914924566;0.00054044957505539;0.0003656403569039;-0.00024527159985155;-0.00033256158349104;-0.00059111008886248;-0.00074656901415437;0.00026816793251783;0.00027483483427204;-0.00029667027411051;-0.00065366277704015;6.0381040384527e-05;8.0075500591192e-05;0.00019326311303303;0.00015632658323739;-1.7088472304749e-05;-3.577244740427e-07;0.00017834629397839;0.00013538959319703;0.00080472638364881;0.00075515714706853;0.00027599991881289;0.00060871138703078;-0.00018234695016872;-0.00034688197774813;6.1756749346387e-05;3.4323096770095e-05;0.00020129313634243;0.00028040981851518;0.00011376343172742;0.00012965915084351;-2.294923797308e-05;0.0010805036872625;0.0010415141005069;-0.00043114967411384;-0.00034703515120782;-0.0012011794606224;-0.001396712497808;-0.00041454678284936;-0.00034671818139032;-0.0003194251912646;-0.00047510513104498;1.0920719432761e-05;-9.0538487711456e-06;-9.2431509983726e-05;-0.00010949284478556;-1.4478769116977e-05;1.2952940778632e-05;-7.6288575655781e-05;6.5041535890487e-06;-0.00010081169602927;0.00071391044184566;-4.2064875742653e-05;0.00024670685525052;0.00023251760285348;-0.00064972892869264;3.6017765523866e-05;-0.00017655729607213;-3.0384015190066e-05;-3.2375653972849e-05;-0.00011138288391521;0.0011705522192642;0.00015597946185153;0.00022480440384243;0.00010035662853625;4.2818257497856e-05;-0.00048217113362625;-7.6600035754382e-06;-0.00042109753121622;3.4570140996948e-05;0.00012092731049052;9.696044435259e-05;-0.00088492460781708;-2.4914326786529e-05;0.00024085829500109;4.9553786084289e-05;-0.00043115043081343;-2.4301780285896e-05;1.3171679711377e-05;4.3464824557304e-05;-0.0001215269730892;-7.3617586167529e-05;7.4268296884838e-05;-0.000397794181481;0.0005305798840709;0.00074209331069142;-0.001012698514387;9.2628215497825e-05;7.5622905569617e-05;-5.1366492698435e-05;-0.00023430940927938;-0.00043392350198701;8.7593834905419e-05;-1.0216440387012e-05;5.5750635510776e-05;0.00031172961462289;3.3107375202235e-05;7.0081077865325e-05;-2.9197053663665e-05;-0.00043874469702132;-0.00013520858192351;0.0001266779290745;0.00045407935976982;-6.3195111579262e-05;-5.1946459279861e-05;-0.00010089563147631;0.0001289892825298;0.00033910418278538;-6.4542246036581e-06;1.6317855624948e-05;0.00011317677126499;6.8213303165976e-05;-0.00018099219596479;0.00039418225060217;-0.00011657756840577;0.0013048651162535;0.00014737868332304;-0.00035816361196339;-7.7563352533616e-05;-3.8244699680945e-05;-8.3287704910617e-05;0.00029439342324622;-5.2031555242138e-05;-0.00010867445234908;-4.0665414417163e-05;0.00060558866243809;-0.00016461122140754;-0.00028038606978953;-7.2651549999136e-05;0.00027926708571613;-0.0012351566692814;0.00012553182023112;-0.00018324085976928;0.00010229967301711;-0.00046120560728014;4.4777236325899e-05;5.8082459872821e-06;3.5845321690431e-05;-7.773869583616e-05;-2.3816844986868e-05;1.5556492144242e-05;-8.9049150119536e-05;-2.1798034310905e-07;-8.965223969426e-05;0.00089010148076341;-0.0001352124963887;0.00019317935220897;0.0004251818463672;-0.00096920842770487;8.0691024777479e-05;-0.00020765811495949;-2.4789189410512e-05;-9.1455884103198e-05;-0.00022414534760173;0.0015924718463793;0.00018824197468348;0.0002547872136347;0.000275841972325;8.6581974755973e-05;-0.00059816933935508;-9.6931886218954e-05;-0.00049816141836345;-3.0525119655067e-05;0.00016172968025785;0.00020783863146789;-0.001079980051145;-4.8383077228209e-05;0.00029844249365851;7.5592273788061e-05;-0.00053888163529336;-1.6805710401968e-05;3.5561477034207e-06;8.2525628386065e-05;-0.00011613271635724;-3.2514581107534e-05;-0.00015458026609849;-0.00039297487819567;0.00046289278543554;0.00070959376171231;-0.00090771046234295;8.360629726667e-05;0.00014641394955106;-3.5185013985028e-05;-0.00025174926850013;-0.00041524475091137;-0.00030687992693856;-7.8271274105646e-05;4.7051494220796e-06;0.00033233285648748;2.2455946236732e-05;0.00023267598589882;-5.9844587667612e-05;-0.00036432425258681;-0.00016560543735977;7.1036258304957e-05;0.00043471512617543;0.00030157933360897;-4.6957182348706e-05;-0.00019074577721767;0.00011499143147375;0.00053244543960318;-3.9825654312153e-06;2.115270581271e-05;0.00011772065045079;0.00011369344429113;-0.0002728258841671;0.00037321946001612;-0.0001315352274105;0.0014436773490161;0.00019735281239264;-0.00040840773726813;-9.5088878879324e-05;-0.00010542410745984;-0.00010121961531695;0.00034652481554076;-8.3786086179316e-05;-4.2888135794783e-05;-7.7398202847689e-05;0.00057923776330426;-0.00028484978247434;-0.00025090484996326;-5.6242584832944e-05;0.00040605285903439;-0.0012658970663324;0.0001658570690779;-0.00020058461814187;0.00013618743105326;-0.00049031351227313;5.0194666982861e-05;9.2424925242085e-05;5.2258557843743e-05;-0.00022420566529036;-1.9670311303344e-05;2.8735343221342e-05;-1.168962171505e-05;7.4512608989608e-05;-0.00088305026292801;4.040531712235e-05;-2.8831527743023e-05;0.00023392219736706;0.0013288669288158;-0.00066341168712825;0.00033033612999134;-9.8592019639909e-05;0.00017724061035551;-3.1927727377479e-06;-0.0021243046503514;0.00034129031701013;-0.00018823104619514;-0.00027976257842965;-0.00048685449291952;0.00066580047132447;-0.00011587907647481;0.0004451475397218;0.00025940072373487;-0.00030689060804434;9.8089753009845e-05;0.0012176989112049;-0.00030187924858183;-0.00043162825750187;6.0832349845441e-05;0.00072121602715924;-7.9627017839812e-05;-2.6280320525984e-05;5.4250972425507e-06;-0.00012531821266748;0.00014612432278227;-0.00073491845978424;8.6193591414485e-05;8.2033562648576e-05;-0.00033639720641077;-0.00049618806224316;0.00052106427028775;0.00033119699219242;2.6526315195952e-05;-0.00035099149681628;6.7510927692638e-07;-0.001157000544481;-0.00027830619364977;-0.00020063608826604;-6.2836268625688e-05;0.0003999495820608;0.00059472001157701;-4.5135788241168e-05;-0.00014089763863012;-0.00016174699703697;-2.8252614356461e-05;-0.00016397685976699;0.0012813588837162;0.00029207608895376;-0.00037502325722016;-1.2886870536022e-05;0.00088040647096932;4.9042555474443e-05;4.0791546780383e-05;-7.8952734838822e-06;0.00020128261530772;0.00013977257185616;6.5702006395441e-05;-0.00028691874467768;0.0012247919803485;-0.00014206464402378;-0.00036004395224154;0.00023497018264607;-0.00027458294061944;-8.5469175246544e-05;0.00028107088292018;-7.2202332376037e-05;8.0789413914317e-06;-0.00010503746307222;-0.00017883449618239;0.00036647680099122;-0.00039422739064321;8.4456522017717e-05;-0.00016610653256066;-0.000924872525502;0.00050047365948558;-0.00016788284119684;0.0001193835050799;-0.00017490683239885;0.00013311949442141;0.00030846064328216;4.1618495743023e-05;-0.00046567831304856;5.6273627706105e-05;-2.288092582603e-05;3.1211675377563e-05;-2.0705492715933e-06;9.4872273621149e-05;-0.0010677226819098;6.3814470195211e-05;-0.00012849931954406;0.00021505028416868;0.0014388323761523;-0.00067959952866659;0.00038491081795655;-9.9058976047672e-05;0.00019964069360867;9.6944836514012e-07;-0.0023631169460714;0.00034310918999836;-0.00024238249170594;-0.0003523247432895;-0.00046803333680145;0.00080255779903382;-0.00010776564158732;0.00055627338588238;0.00024632189888507;-0.00036953695234843;7.63971474953e-05;0.0014527201419696;-0.0002947224129457;-0.00049700011732057;6.3611114455853e-05;0.00080905680079013;-8.4634884842671e-05;-2.1260440917104e-05;-2.9676846224902e-06;-0.00016326742479578;0.00015227448602673;-0.00063374964520335;6.5697946411092e-05;0.00022455178259406;-0.00046370198833756;-0.00082965340698138;0.00075969466706738;0.00032577294041403;4.9443664465798e-05;-0.00044592822086997;-1.3133188986103e-05;-0.00097640429157764;-0.00040876449202187;-0.00017987030150834;-1.0265941909893e-06;0.00051013519987464;0.0005489427712746;-4.6587003453169e-05;-0.0003025715413969;-0.00018371440819465;4.6836110414006e-05;-0.00019415417045821;0.0011559603735805;0.0004247147589922;-0.00036241053021513;-2.6142981369048e-05;0.00090780114987865;8.3482365880627e-05;4.1899485950125e-05;-8.7185153461178e-06;0.00022305949823931;0.00015957387222443;0.00023289736418519;-0.00031141442013904;0.0015033899107948;-0.00015974622510839;-0.00042707411921583;0.00025167595595121;-0.00026293707196601;-9.9360389867797e-05;0.00037971799611114;-8.2977654528804e-05;-8.101633284241e-06;-0.00010449689580128;-0.00017798267072067;0.00051028659800068;-0.0004145686107222;3.0673865694553e-05;-0.00022623111726716;-0.0012084619374946;0.00054327503312379;-0.00025066689704545;0.00013870715338271;-0.00034191034501418;0.00014120229752734;0.00028629068401642;5.0924390961882e-05;-0.00046672660391778;5.780113133369e-05;5.6502736697439e-05;-4.7195342631312e-05;-2.4866161766113e-05;7.9493867815472e-05;-1.5097334653547e-05;-2.45358896791e-05;0.00034554139710963;-0.00032481466769241;-0.0011956829112023;0.0012603069189936;-8.163492748281e-05;7.2600014391355e-05;5.1613136747619e-05;1.4196274605638e-05;0.00057633098913357;-0.00064188259420916;-5.1947205065517e-05;-1.0857704182854e-05;-5.518860052689e-05;0.00015948034706526;-0.00010015942098107;-7.1156347985379e-05;0.00011137507681269;6.1798251408618e-05;-0.00011827706475742;-0.00041453790618107;0.00041421901551075;6.0706457588822e-05;-7.333231769735e-05;-0.00018992394325323;0.00017692588153295;8.2403439591872e-06;1.0916649443971e-05;-0.0001386335643474;-9.3954891781323e-05;0.00031477498123422;0.00032625099993311;0.00042709556873888;0.00046146017848514;-0.00049119110917673;-0.00052783818682656;-5.4919153626543e-05;-6.4978965383489e-05;-0.00033358865766786;-0.00026666570920497;0.00035805834340863;0.00039223008207045;0.00014625466428697;0.00034267833689228;0.00022746025933884;-0.00016485298692714;-0.00021432810171973;-0.00047834758879617;-0.00042421536636539;0.00030355755006894;0.0002418290823698;-0.0003597917384468;-0.0004188817110844;8.4483406681102e-05;7.9918696428649e-05;0.00016333165694959;0.00014364693197422;-1.1438787623774e-05;4.6547052079404e-07;0.00016829141532071;0.00011451495083747;0.00082281517097726;0.00064935907721519;0.0003454236430116;0.00044873519800603;-0.00021784828277305;-0.00031421173480339;6.2308805354405e-05;3.1557352485834e-05;0.00025955628370866;0.00023084379790816;0.00013934474554844;0.00014980335254222;-3.2938580261543e-05;0.00092264410341159;0.0010120566003025;-0.00037424656329677;-0.00029121650732122;-0.0011796794133261;-0.001162993721664;-0.0004445742815733;-0.00029986299341545;-0.00039083900628611;-0.00040864446782507;2.7278517791274e-06;-4.0184017962019e-06;-0.00012724245607387;-0.0001006927122944;8.8596054411028e-05;-7.4053983553313e-05;-5.2352141210577e-05;0.00012182177306386;3.1502393539995e-05;-2.5282295609941e-05;0.00059399235760793;-0.00045564246829599;-0.0019610037561506;0.0020121063571423;-0.00013962920638733;0.00011317100870656;6.3163097365759e-05;4.8510803026147e-05;0.00099379091989249;-0.0010099558858201;-5.6507204135414e-05;1.6652753402013e-05;-0.00012392434291542;0.00020629739447031;-0.00017731181287672;-0.00014587477198802;0.00016317100380547;0.00012884291936643;-0.00018875910609495;-0.00072836934123188;0.0006103896885179;0.00010697625839384;-0.00012189420522191;-0.0003078626759816;0.00026943840202875;1.17885065265e-05;2.1652476789313e-05;-0.00022674040519632;-0.00016863363271113;0.00042573813698255;0.0005175907863304;0.00061617861501873;0.00079524761531502;-0.00063317228341475;-0.00097686133813113;-8.2213264249731e-05;-0.00011444493429735;-0.000517891603522;-0.00043353033834137;0.00051025429274887;0.00070503947790712;0.0002396516938461;0.00046902615576982;0.00028400926385075;-0.00022646160505246;-0.00033468680339865;-0.0006446399493143;-0.00061801413539797;0.00048380234511569;0.00041995878564194;-0.00051932426868007;-0.00073926569893956;0.00012195973249618;0.00013216347724665;0.0002606786438264;0.00022114034800325;-2.1181116608204e-05;1.1686321386151e-06;0.00025445051142015;0.00018074731633533;0.0012783816782758;0.001071689883247;0.00046883735922165;0.00076146441278979;-0.0003306494327262;-0.00053899385966361;0.0001040887873387;5.2390987548279e-05;0.00035053308238275;0.00037279448588379;0.00020696177671198;0.00024263451632578;-4.0216196794063e-05;0.0015047392807901;0.0016920488560572;-0.0006000836729072;-0.00047989870654419;-0.0018773003248498;-0.0019453997956589;-0.0006712187314406;-0.00048423133557662;-0.00055486924247816;-0.00067504402250051;6.3961406340241e-06;-9.2937352746958e-06;-0.0001644099393161;-0.00015653754235245;9.1154419351369e-05;-7.5645337346941e-05;-6.379745900631e-05;0.00011909974273294;5.0841041229432e-05;1.965961746464e-05;0.00064808106981218;-0.00038894347380847;-0.0020305144134909;0.0020317370072007;-0.00015089611406438;0.0001108680080506;6.3048995798454e-05;6.3258048612624e-05;0.0010609908495098;-0.00099055049940944;-3.4020617022179e-05;4.5978409616509e-05;-0.00017578962433618;0.00018585956422612;-0.00021611318516079;-0.0001515417243354;0.00013460619084071;0.00015377585077658;-0.00018750182061922;-0.0007962963427417;0.00055151322158054;0.0001133819896495;-0.00012397365935612;-0.0003229646536056;0.00026469479780644;9.1073634393979e-06;2.6164148948737e-05;-0.00022898342285771;-0.00018376910884399;0.00038224109448493;0.00055548455566168;0.00056127336574718;0.00087738619185984;-0.00049644272075966;-0.0011565706226975;-7.2968097811099e-05;-0.000126962113427;-0.00052147818496451;-0.00045880494872108;0.00044491424341686;0.00080457294825464;0.00024316084454767;0.00044507265556604;0.00026780113694258;-0.00020065954595339;-0.00034633764880709;-0.00059790012892336;-0.00063080852851272;0.00047838862519711;0.00045501583372243;-0.00045831248280592;-0.00082677323371172;0.00011411868035793;0.00014423136599362;0.00027510360814631;0.00022273416107055;-2.3261331079993e-05;3.0145833989081e-06;0.00025339316925965;0.00018743038526736;0.0012796128867194;0.001129511743784;0.00042215478606522;0.00085882365237921;-0.00031760797719471;-0.00058917736168951;0.00010852308332687;5.3629413741874e-05;0.00032300193561241;0.00041045402758755;0.00020309208775871;0.00025292721693404;-3.9535982068628e-05;0.0015506182098761;0.0017505867872387;-0.00061112223193049;-0.00049724674317986;-0.0018906777258962;-0.0020548370666802;-0.00066509761381894;-0.00051154312677681;-0.00052489759400487;-0.00073867518221959;8.2531641965033e-06;-1.4445864508161e-05;-0.00014833366731182;-0.00016856761067174;6.3082319684327e-05;-5.1796356274281e-05;-5.0010512495646e-05;7.7788703492843e-05;1.6881160263438e-05;7.4663483246695e-05;0.00044734959374182;-0.00017709386884235;-0.0013785279588774;0.0013414690038189;-0.00010594871855574;7.0849302574061e-05;4.4936503400095e-05;5.2924573537894e-05;0.00073548429645598;-0.00062842771876603;-8.1132629929925e-06;4.9526741349837e-05;-0.00016008748207241;0.00012761175457854;-0.00018654906307347;-7.9049474152271e-05;4.4224805606063e-05;0.0001165749199572;-0.00012383547436912;-0.00055315135978162;0.00029676433769055;7.6959280704614e-05;-8.2916900282726e-05;-0.00022585051192436;0.00017426784324925;5.2529862841766e-06;2.0775305529241e-05;-0.00015482665912714;-0.0001310168299824;0.00021391137852333;0.00037959223845974;0.00033269182313234;0.00062082527438179;-0.00023903281544335;-0.00089479971211404;-4.3165866372874e-05;-9.5485025667585e-05;-0.00035495305201039;-0.00033084067399614;0.00024948202189989;0.00060345337260514;0.00015401006385218;0.00025000947061926;0.00015439072740264;-9.7429539891891e-05;-0.00022515410091728;-0.00035034539178014;-0.00039160627056845;0.00031779074924998;0.00033122330205515;-0.00025615029153414;-0.00059666595188901;7.286955951713e-05;0.00010878321336349;0.00019543792586774;0.00015097288996913;-1.6240419427049e-05;4.2708225009847e-06;0.00016815344861243;0.00012980522296857;0.00086119218030944;0.00079627329250798;0.0002569169155322;0.00065745622850955;-0.00020467017020565;-0.0004407346714288;7.6322285167407e-05;3.6283116060076e-05;0.00020415645849425;0.00030953902751207;0.00013552491145674;0.00018206826644018;-2.9691858799197e-05;0.0010552629828453;0.0012107006041333;-0.00040952957351692;-0.00034002342727035;-0.0012716215569526;-0.0014421038795263;-0.00044661966967396;-0.00036420510150492;-0.00033925779280253;-0.00055334100034088;5.5402347243216e-06;-1.4723369531566e-05;-9.1366193373688e-05;-0.00012533726112451;-3.581070996006e-05;1.807613807614e-05;-0.00010262241266901;-1.7433244465792e-06;-7.4047005909961e-05;0.0011326147941872;-0.00025461293989792;9.1175024863333e-05;0.00069634366082028;-0.0014701081672683;0.00014040734095033;-0.00026952420012094;-1.3336561096366e-05;-0.00019557130872272;-0.00037598784547299;0.0022983062081039;0.00023117479577195;0.00031831316300668;0.00053917762124911;0.00014283660857473;-0.00077078596223146;-0.00023148562468123;-0.00062952213920653;-0.00012045162293361;0.00023116442025639;0.00035229796776548;-0.001344443182461;-8.1673730164766e-05;0.00040782077121548;0.00011019031808246;-0.000738171976991;-6.7450041569828e-06;-1.0645583643054e-05;0.00013691069034394;-0.00011520669067977;2.9803515644744e-05;-0.00048987084301189;-0.00042610714444891;0.00036333891330287;0.00074222381226718;-0.00085128651699051;8.5418039816432e-05;0.00026667257770896;-1.8714012185228e-05;-0.00029337650630623;-0.00043706494034268;-0.00093284173635766;-0.0001862740755314;-0.00010545147233643;0.00041530252201483;3.9032958738972e-05;0.00048256240552291;-0.000131605178467;-0.00024382761330344;-0.00023214072280098;-1.5750687452964e-05;0.00045668502571061;0.0008814895991236;-4.6829645725666e-05;-0.00034579075872898;0.00011157031258335;0.00087851885473356;-7.3671145628396e-08;2.9785587685183e-05;0.00014550816558767;0.00017866223060992;-0.00043566068052314;0.00034697822411545;-0.00017067123553716;0.0018863237928599;0.00029671686934307;-0.00053761049639434;-0.00013509769632947;-0.00019908080867026;-0.00013832161494065;0.00043109589023516;-0.00013934128219262;-3.7518264434766e-05;-0.00014207942876965;0.00062682118732482;-0.00050513900350779;-0.00025642415857874;-1.0150154594157e-05;0.00064795732032508;-0.0015086410567164;0.00024437555111945;-0.00023996476375032;0.00019906322995666;-0.00051998812705278;6.4830943301786e-05;0.00021314661717042;8.2130703958683e-05;-0.00041763388435356;-3.1802359444555e-05;1.4680925232824e-05;-7.9864308645483e-05;2.8687381927739e-06;-3.8929738366278e-05;0.00090719782747328;-0.00024443390429951;-1.6083315131254e-05;0.00063211040105671;-0.0012853717198595;0.00013195213978179;-0.00022527424152941;-5.5775831242499e-06;-0.00018532124522608;-0.00034648075234145;0.001980991801247;0.00017931731417775;0.00024210986157414;0.00052445766050369;0.00013732102524955;-0.00062374654226005;-0.0002420348173473;-0.00048222884652205;-0.00013533688616008;0.00019501427595969;0.00032743229530752;-0.0010717463446781;-7.4781964940485e-05;0.00034728643367998;9.7648990049493e-05;-0.00063137506367639;1.1144994687129e-06;-1.5080774574017e-05;0.00012620442430489;-8.0199606600218e-05;5.2331426559249e-05;-0.00052463886095211;-0.00030957415583543;0.00020663063332904;0.00051973608788103;-0.00054054002976045;5.6956614571391e-05;0.00025316714891233;-3.4439362934791e-06;-0.00021868151088711;-0.00030688222614117;-0.001001650467515;-0.00018748389265966;-0.00012553026317619;0.00032349093817174;2.8409995138645e-05;0.00047357042785734;-0.00012156397133367;-0.0001138318766607;-0.00019257020903751;-6.1590246332344e-05;0.00032171871862374;0.00092835148097947;-3.081964678131e-05;-0.00032943265978247;7.2546165029053e-05;0.00079928571358323;1.6739531929488e-06;2.5165925762849e-05;0.00011742077185772;0.00015577013255097;-0.00038404535735026;0.00020830731955357;-0.00013784201291855;0.0015180386835709;0.00025423351326026;-0.00043195925536565;-0.00011478064698167;-0.00018972234101966;-0.00011495484795887;0.00032831521821208;-0.00012419201084413;-2.855700586224e-05;-0.00013278720143717;0.0004597504157573;-0.00046123642823659;-0.00018464491586201;2.3624075765838e-05;0.00057171861408278;-0.0011626394698396;0.00020970124751329;-0.00017701512842905;0.00016942480579019;-0.00035017225309275;5.2537208830472e-05;0.00021586130606011;7.2164250013884e-05;-0.00038915843470022;-1.1750389603549e-05;2.1477510017576e-05;-6.222071533557e-05;3.8959569792496e-05;-0.00058169779367745;-1.811209222069e-05;0.00019953887385782;0.00025472440756857;0.0011629823129624;-0.0006194164743647;0.00021729069703724;-9.7424446721561e-05;4.6460965677397e-05;-1.1250190254941e-05;-0.0017769814003259;0.00032419321360067;-7.2941140388139e-05;-0.00014665148046333;-0.00057012285105884;0.00042535096872598;-0.00014796931645833;0.00024855800438672;0.00032515957718715;-0.00010601842222968;0.00014294106222223;0.00082018971443176;-0.00030155212152749;-0.00028792483499274;5.2967407100368e-05;0.00059855269500986;-6.7313310864847e-05;-3.028406536032e-05;1.7621032384341e-05;-5.450431490317e-05;0.00015183839423116;-0.00081661675358191;9.171665442409e-05;-2.7888329441339e-06;-0.00016484882507939;9.5493378466927e-06;0.00016886032244656;0.00034657490323298;-1.8625600205269e-05;-0.0001025285673677;5.8971781982109e-06;-0.0015821886481717;-8.3705330325756e-05;-0.00024373669293709;-9.0704073954839e-05;0.00022548435663339;0.00065467023523524;-6.9999630795792e-05;-4.5259952457855e-05;-9.2997855972499e-05;-0.00020538165699691;-0.00010156265489059;0.001454402692616;0.00010778945579659;-0.00043284977436997;1.5415951565956e-05;0.00088700436754152;1.7582455029697e-06;4.6213328459999e-05;-8.6309364633053e-06;0.00018557158182375;0.00011548061593203;-0.00031836921698414;-0.00022369962243829;0.00067899539135396;-0.00010643462883309;-0.00021777198708151;0.00019118232012261;-0.00035350659163669;-6.1355589423329e-05;7.5518146331888e-05;-5.9327532653697e-05;4.4307103962637e-05;-0.00010053418372991;-0.00020755769219249;0.00011777539475588;-0.00033434512442909;0.00021173690038268;-6.2164333940018e-05;-0.00040868818177842;0.00039410986937582;1.416158511347e-06;7.8183424193412e-05;0.00025760981952772;0.00011440692469478;0.0004251143836882;2.8320890123723e-05;-0.000562786066439;5.9229401813354e-05;-2.0543939172057e-05;3.4085736842826e-05;-4.3296869989717e-05;7.0594032877125e-05;-0.00094582611927763;1.0897848369495e-05;0.0001354971609544;0.00033483101287857;0.0017129990737885;-0.00088136806152761;0.00037562011857517;-0.00013323214079719;0.00018869829364121;-1.5310952221625e-05;-0.0026623026933521;0.00045533815864474;-0.00017362023936585;-0.00029320639441721;-0.00072936050128192;0.00072048808215186;-0.00017193875100929;0.00046824789023958;0.00040292707853951;-0.0003061719762627;0.00016978703206405;0.0013289822963998;-0.00041065231198445;-0.00049705622950569;7.8642369771842e-05;0.00089365401072428;-9.7403069958091e-05;-4.1217666876037e-05;1.7499000023236e-05;-0.00011948879546253;0.00020051046158187;-0.0010900959605351;0.00013512971054297;-8.0531935964245e-06;-0.0003318979870528;-0.00030256528407335;0.00045563501771539;0.00047355124843307;7.1170447881741e-06;-0.00031740567646921;6.9833213274251e-06;-0.0019211724866182;-0.00024017677060328;-0.00031059992033988;-0.00013533158926293;0.00044040576904081;0.00086851877858862;-6.3587496697437e-05;-7.2504466515966e-05;-0.00019630519091152;-0.00017104808648583;-0.00018735966295935;0.0019375059055164;0.0002640261373017;-0.00056037143804133;1.3816237469655e-06;0.0012280035298318;3.2914060284384e-05;5.8999885368394e-05;-1.0259715054417e-05;0.00026295619318262;0.00017570825002622;-0.00018841038399842;-0.00036208343226463;0.0013458788162097;-0.000172456871951;-0.0004045836685691;0.0003006253100466;-0.0004252030630596;-0.00010293012019247;0.00023728210362606;-8.9104949438479e-05;5.6251205933222e-06;-0.00014441115490627;-0.0002682261983864;0.00032300333259627;-0.00052538007730618;0.00021558305888902;-0.00015436501416843;-0.00092211982700974;0.00063884834526107;-0.00011546145105967;0.00013913831207901;7.6999065640848e-05;0.00017140287673101;0.00049867376219481;4.7871006245259e-05;-0.00069310440449044;7.9504839959554e-05;-2.0243089238647e-05;3.1877545552561e-05;-1.3302011211636e-05;7.3276882176287e-05;-0.00093687459593639;3.8886344555067e-05;9.5485056590405e-06;0.00027224063524045;0.0015758873196319;-0.00077895022695884;0.00038076101918705;-0.00011238735896768;0.00023824654635973;-1.3627301996166e-05;-0.0024860498961061;0.00039561264566146;-0.00020218660938554;-0.00032725461642258;-0.00058972492115572;0.00072824448579922;-0.00012559517927002;0.00051262095803395;0.00031352855148725;-0.00036675797309726;0.00012399753904901;0.0013072005240247;-0.00034646564745344;-0.00050200073746964;7.1210983151104e-05;0.00083447922952473;-8.6199368524831e-05;-3.4289631003048e-05;9.3496419140138e-06;-0.0001368701341562;0.00016818527365103;-0.00089651840971783;0.00011805184476543;1.3137801033736e-05;-0.00038135150680318;-0.00053235789528117;0.00058900605654344;0.00040622529922985;3.2343799830414e-05;-0.00039762904634699;8.0979839367501e-07;-0.0014810611028224;-0.00031691062031314;-0.00025077926693484;-0.00011762779467972;0.0004907411057502;0.00071992713492364;-2.8099362680223e-05;-9.6411073172931e-05;-0.0002214104461018;-6.8366913183127e-05;-0.00019901597988792;0.0016192385228351;0.00033221347257495;-0.00046199333155528;-1.4144185115583e-05;0.0010788573417813;5.6749689974822e-05;4.9304002459394e-05;-8.0022664405988e-06;0.0002372605522396;0.00016774040705059;1.7772123101167e-05;-0.00035430956631899;0.0014975458616391;-0.0001711704680929;-0.00043434323742986;0.00029055282357149;-0.00032983205164783;-0.00010414075222798;0.00030620224424638;-8.5097992268857e-05;-4.4212563807378e-05;-0.00013015427975915;-0.00022447516676039;0.00040948923560791;-0.00050483329687268;0.00013469511759467;-0.00018884417659137;-0.0010900376364589;0.00062741310102865;-0.0001899500930449;0.00014464695414063;-0.00012507176143117;0.0001602667325642;0.00037678345688619;4.9409412895329e-05;-0.00055370840709656;6.9101617555134e-05;2.3313303245232e-05;-1.8157459635404e-05;6.8167046265444e-06;3.4725359000731e-05;-0.00011960255505983;1.8414159058011e-05;2.7525731638889e-05;-0.00011092818022007;-0.00034923778730445;0.00043029908556491;-1.7512422346044e-05;2.6811796487891e-05;4.0486433135811e-05;-1.5476578482776e-05;0.00010955223115161;-0.00023658321879338;-5.2493433031486e-05;-4.8029214667622e-05;2.1159423795325e-06;0.00014368923439179;-3.8621994463028e-05;6.3583567680325e-05;1.5274115867214e-05;-1.4498185919365e-05;-4.1704526665853e-05;-3.553154238034e-05;0.00015282303502318;1.108439937525e-05;-2.358774872846e-05;-7.0162051997613e-05;8.561182039557e-05;6.3559245973011e-06;2.3848519958847e-06;-5.2148086979287e-05;-1.7544320144225e-05;0.00012692056770902;8.1973048509099e-05;0.00019496925233398;9.564877836965e-05;-0.00032096594804898;-7.290237408597e-05;-3.1236304494087e-05;-2.2716872990713e-05;-0.00015292866737582;-0.00010216991358902;0.00017524925351609;7.9460478445981e-05;2.7096190024167e-05;0.00010454290168127;9.5527277153451e-05;-4.1437793697696e-05;-5.1184597396059e-05;-0.00019483239157125;-0.00011853186151711;0.00013298921112437;7.3659044574015e-05;-0.00014942510460969;-7.9255296441261e-05;4.9718091759132e-05;3.3769447327359e-05;6.7906657932326e-05;5.9108540881425e-05;-6.2487066543326e-07;1.075472937373e-06;7.8615572419949e-05;4.1495401092106e-05;0.00037587541737594;0.00021752482280135;0.00022339065617416;0.00012772863556165;-0.00012079410953447;-9.8087286460213e-05;2.133434645657e-05;1.1337240721332e-05;0.00017370349087287;8.6505300714634e-05;8.6191714217421e-05;6.3619343563914e-05;-2.8307345928624e-05;0.00030646755476482;0.00035839108750224;-0.00013734518142883;-8.6314415966626e-05;-0.0004778293077834;-0.00036219504545443;-0.00022381461167242;-0.00011099402763648;-0.0002396840864094;-0.0001454578305129;-8.3830855146516e-07;-1.9126380834678e-07;-9.7833559266292e-05;-4.2944793676725e-05;4.2062627471751e-05;-3.2954263588181e-05;7.4764770943148e-06;6.0559574194485e-05;-0.0001814598654164;3.2360236218665e-05;7.6467586040962e-05;-0.00018681958317757;-0.00067313120234758;0.00079512025695294;-3.7781555874972e-05;4.8469584726263e-05;6.7029999627266e-05;-2.0318593669799e-05;0.00024744498659857;-0.00043177686166018;-8.3172264567111e-05;-7.0989954110701e-05;-7.4944182415493e-06;0.00023572685313411;-7.6179618190508e-05;8.8105793111026e-05;3.0307115594042e-05;-1.4386268048838e-05;-7.4707546446007e-05;-0.00010593646584312;0.00026719376910478;2.7045074602938e-05;-4.5390093873721e-05;-0.0001362019975204;0.00015333060582634;1.1292607268842e-05;5.7964834923041e-06;-9.4866358267609e-05;-3.877733979607e-05;0.00021035107783973;0.00015007168985903;0.00033605514909141;0.00020080035028514;-0.00052404636517167;-0.00018857445684262;-5.7086050219368e-05;-4.6157590986695e-05;-0.00026869657449424;-0.00018863930017687;0.00030396034708247;0.0001775663549779;5.3167772421148e-05;0.0001705657778075;0.00014160000137053;-6.8659042881336e-05;-9.3808543169871e-05;-0.00031753713847138;-0.00019672994676512;0.00024023262085393;0.00014768306573387;-0.00026346431695856;-0.00017490092432126;8.8088054326363e-05;6.4063686295412e-05;0.00011715546133928;0.00010349344665883;-2.4587716325186e-06;2.1246419237286e-06;0.0001360098249279;7.4597854109015e-05;0.00066323491046205;0.00041015294846147;0.0003586195234675;0.00024704556562938;-0.00020708060765173;-0.00019460397015791;4.1724732000148e-05;2.1793804990011e-05;0.00028915796428919;0.00016092164150905;0.00015129640814848;0.00011987164907623;-4.6674264012836e-05;0.0005620596348308;0.00068301399005577;-0.00024749329895712;-0.00016114697791636;-0.00085337524069473;-0.0006906944909133;-0.0003896604757756;-0.00020574360678438;-0.00040404358878732;-0.00027454108931124;-2.0135498743912e-06;-1.4708274420627e-06;-0.00016150425653905;-7.9120029113255e-05;6.4347630541306e-05;-5.159239663044e-05;-9.7660740721039e-06;8.9405904873274e-05;-0.00016739548300393;4.7085293772398e-05;0.00022820739832241;-0.00025643655681051;-0.001180428895168;0.0012921550078318;-7.4049989052583e-05;7.5460971856955e-05;7.9522018495481e-05;4.2497322283452e-07;0.000522289366927;-0.00067629740806296;-8.8553984824102e-05;-5.6047763791867e-05;-5.4544605518458e-05;0.00028457332518883;-0.00013956880138721;4.3031548557337e-05;6.0917584050912e-05;2.2916005036677e-05;-0.00012001628056169;-0.00030103910830803;0.00038549632881768;5.6278222473338e-05;-7.8674391261302e-05;-0.0002200848684879;0.00022238507517613;1.5399418771267e-05;1.3072400179226e-05;-0.0001536321506137;-8.5112813394517e-05;0.00028158939676359;0.00026060757227242;0.00047135949716903;0.00040605393587612;-0.00063519360264763;-0.00047865838860162;-7.9864475992508e-05;-8.2707840192597e-05;-0.0003963322378695;-0.00030572633841075;0.00041894899914041;0.0003834703238681;0.00010545625991654;0.00023594996309839;0.00015600594633725;-9.8791133495979e-05;-0.00016328851052094;-0.00041727360803634;-0.00028916209703311;0.00036727293627337;0.00027025418239646;-0.00038045510882512;-0.00037619553040713;0.00011830990115413;0.00010438382741995;0.00017958765965886;0.00015467159391847;-8.1135494838236e-06;3.3637895739957e-06;0.00019256181258243;0.00011919787357328;0.00097258354071528;0.0006895883125253;0.00043967703823;0.00045089834020473;-0.00028522495995276;-0.00035404326627031;7.1323840529658e-05;3.513801493682e-05;0.00035849362029694;0.00026327060186304;0.00020162967848592;0.00019301331485622;-5.5892887758091e-05;0.00093072652816772;0.001150491531007;-0.00038880101055838;-0.00028159373323433;-0.0013160586822778;-0.0011940110707656;-0.00054913805797696;-0.00033219970646314;-0.00052294420311227;-0.00046268085134216;-1.7298473267147e-06;-5.1967385843454e-06;-0.00019044973305427;-0.00012387952301651;8.1860918726306e-05;-6.6443797550164e-05;-3.8261136069195e-05;0.00010982198728016;-0.00011344732774887;8.4931794845033e-05;0.0003987884556409;-0.00024531662347727;-0.0016481159254909;0.0016990639269352;-0.00011022752005374;9.4671333499718e-05;7.4416602728888e-05;4.2981522710761e-05;0.00080956681631505;-0.00085656467126682;-6.7412031057756e-05;-1.2523530131148e-05;-0.00013498989574146;0.00029031003941782;-0.00021987412765156;-2.6691717721405e-05;7.4550880526658e-05;8.0830672231968e-05;-0.00015784279094078;-0.00051944109145552;0.00042325179674663;8.5867803136352e-05;-0.00011046310828533;-0.00029011050355621;0.00026681131566875;1.7915543139679e-05;2.2656169676338e-05;-0.00020742342167068;-0.0001388794335071;0.00027841256815009;0.00034939643228427;0.00053027912508696;0.00062059861375019;-0.00059329753275961;-0.00084540020907298;-9.1866735601798e-05;-0.00012302695540711;-0.00049140222836286;-0.00041552298353054;0.00045911702909507;0.00062725704628974;0.0001514011528343;0.00022339186398312;9.648478589952e-05;-8.9482775365468e-05;-0.00021469942294061;-0.00040392769733444;-0.00030487732146867;0.00047046333202161;0.0004033372097183;-0.00043034434202127;-0.00060183042660356;0.00012979365419596;0.00014417326019611;0.00023542289272882;0.00019188089936506;-1.4906479009369e-05;5.4940110203461e-06;0.000225844050874;0.00015647085092496;0.0011909423628822;0.00094840361271054;0.00043507537338883;0.00067171762930229;-0.00033110837102868;-0.00052878307178617;9.9106793641113e-05;4.5521926949732e-05;0.00035836512688547;0.00035977302468382;0.00022446452931035;0.00026109570171684;-5.5003594752634e-05;0.0012585637159646;0.0015998681774363;-0.00050203735008836;-0.00039566168561578;-0.0016898041358218;-0.0016773897223175;-0.00064615113660693;-0.00044267647899687;-0.00055683741811663;-0.00065017136512324;6.1687444485869e-07;-1.0819002454809e-05;-0.00017773752915673;-0.00016223624697886;8.2789374573622e-05;-6.7101653257851e-05;-5.3660311095882e-05;0.00010307980846846;-8.6421794549096e-05;0.00015202943177428;0.00045775252510794;-0.00013344042235985;-0.0016951211728156;0.0016719305422157;-0.00011995159002254;9.0116620413028e-05;7.1638503868598e-05;6.3996347307693e-05;0.00087584467837587;-0.00080619793152437;-3.3692816941766e-05;2.8917844247189e-05;-0.00020346984092612;0.00025840883608907;-0.00027284375391901;-3.7340632843552e-05;2.9118065867806e-05;0.00011004589759978;-0.00015320884995162;-0.00059023150242865;0.00032396175083704;9.0145760623273e-05;-0.00011268712114543;-0.00030083404271863;0.00025642750551924;1.5821786291781e-05;2.7216443413636e-05;-0.00020684611808974;-0.00015317773795687;0.00021663385268766;0.00036568575887941;0.00046072571421973;0.00068132131127641;-0.00041347596561536;-0.0010384253691882;-7.9873658251017e-05;-0.00013737176777795;-0.00048130078357644;-0.00044134957715869;0.00037547931424342;0.00072970939800143;0.0001470489660278;0.00016503481310792;5.1871727919206e-05;-4.63851429231e-05;-0.00021338945953175;-0.0003290593449492;-0.00026560152764432;0.00045488329487853;0.00044094477198087;-0.00035730766830966;-0.00067767006112263;0.00011624872422544;0.0001588632731;0.00024490238865837;0.00018884264864028;-1.6985650290735e-05;8.2031601777999e-06;0.00021388902678154;0.00016173630137928;0.0011542777065188;0.00099633552599698;0.0003540274919942;0.00077915500150993;-0.00029879648354836;-0.00059241912094876;0.0001039968119585;4.4568285375135e-05;0.00030743901152164;0.00040293220081367;0.00020733368000947;0.00027735225739889;-5.3572337492369e-05;0.0012718873331323;0.0016427095979452;-0.0004915107274428;-0.0004084006359335;-0.001662562135607;-0.0017588076880202;-0.00061872776132077;-0.00046647907583974;-0.00049388577463105;-0.00072375795571133;1.9100232293567e-06;-1.6780177247711e-05;-0.00014598370762542;-0.00017908423615154;6.2771083321422e-05;-5.0635549996514e-05;-4.9489932280267e-05;6.9090237957425e-05;-9.1080262791365e-05;0.00022082519717515;0.00035090319579467;5.043028795626e-05;-0.0012451191432774;0.0011606455082074;-9.3499838840216e-05;6.1294202168938e-05;6.048389695934e-05;5.9915993915638e-05;0.00066848396090791;-0.00051852455362678;2.0171812593617e-06;5.5980362958508e-05;-0.00021566364739556;0.00018935237312689;-0.00026953394990414;1.3575368029706e-05;-6.9991729105823e-05;9.7922820714302e-05;-0.00010703227599151;-0.00045642541954294;0.00010994340118486;6.5043874201365e-05;-8.2795231719501e-05;-0.00023369543487206;0.00018480799917597;1.09272014015e-05;2.4007800675463e-05;-0.00015052768867463;-0.00012028341006953;9.721011883812e-05;0.00026319912285544;0.00027428253088146;0.00052378670079634;-0.00015890420763753;-0.00092819263227284;-4.9299371312372e-05;-0.00011604501196416;-0.00035400738124736;-0.0003577895113267;0.00019965499814134;0.0006161846104078;8.8242813944817e-05;3.7268357118592e-05;2.7160717763763e-06;2.6677205823944e-05;-0.0001370174868498;-0.00017165129247587;-0.00012545973004308;0.00032189436024055;0.00035862089134753;-0.00018626711971592;-0.00053705030586571;7.8690885857213e-05;0.00013626967847813;0.00019256320956629;0.00014029862359166;-1.302020791627e-05;9.7345546237193e-06;0.00014923496928532;0.0001257715630345;0.00083506060764194;0.0007855121511966;0.00021142073092051;0.00069783820072189;-0.00019450650142971;-0.00050652545178309;8.2010104961228e-05;3.1926821975503e-05;0.00020283256890252;0.00035493067116477;0.00014487243606709;0.00022891286062077;-4.6379831474042e-05;0.00092902692267671;0.0012355844955891;-0.00034382147714496;-0.00030509688076563;-0.0012021901784465;-0.001359821530059;-0.00044894719030708;-0.00037605554098263;-0.00033301350777037;-0.00062620599055663;6.6815618993132e-07;-1.9475863155094e-05;-9.1674948635045e-05;-0.00015860282292124;3.8314923585858e-05;-3.0978593713371e-05;-3.4679538657656e-05;3.4931585105369e-05;-8.8457178208046e-05;0.00022795773111284;0.00020478901569732;0.00014774074952584;-0.00070906279142946;0.00060803210362792;-5.6195771321654e-05;3.1791929359315e-05;4.714908573078e-05;3.86814281228e-05;0.00039345276309177;-0.00023156085808296;2.0369647245388e-05;5.88415277889e-05;-0.00017090098117478;0.00012031468213536;-0.00021822773851454;4.8216308641713e-05;-0.00012358539970592;6.3091887568589e-05;-5.6411423429381e-05;-0.00026866651023738;-4.2714986193459e-05;3.4422075259499e-05;-4.6662604290759e-05;-0.00014675236889161;0.00010675929661375;6.2333274399862e-06;1.6426674847025e-05;-8.4407532995101e-05;-7.2459712100681e-05;1.861708915385e-05;0.00014500293764286;0.00011726740922313;0.00031105699599721;2.2679903395328e-06;-0.00065610208548605;-2.2095253370935e-05;-7.8058808867354e-05;-0.00020975632651243;-0.00023678893921897;6.2813414842822e-05;0.00040589977288619;3.1023930205265e-05;-3.7256231735228e-05;-1.2865075404989e-05;6.1402541177813e-05;-6.0976854001638e-05;-6.3445702835452e-05;-2.1866881070309e-05;0.00017659594595898;0.00023151103232522;-5.3308031056076e-05;-0.00032558446400799;4.3055079004262e-05;9.5000956207514e-05;0.00012307759607211;8.7719214207027e-05;-7.1237013798964e-06;8.8719816631055e-06;8.2500257121865e-05;8.0990357673727e-05;0.0004774191766046;0.00049821991706267;9.5953975687735e-05;0.00050997122889385;-9.323292033514e-05;-0.0003507700166665;5.0817248848034e-05;1.6564967154409e-05;0.00011128236656077;0.00026084561250173;8.0763013102114e-05;0.00015707091370132;-3.7035686546005e-05;0.00052444258471951;0.0007244655280374;-0.0001813273265725;-0.00017809496785048;-0.00067710812436417;-0.00083082378841937;-0.0002629246446304;-0.00024939017021097;-0.00018119633023161;-0.00044558959780261;-2.4412452148681e-07;-1.566598075442e-05;-4.819259265787e-05;-0.00012145919754403;2.1499277863768e-05;-1.8072236343869e-05;-2.0386112737469e-05;1.6144653272931e-05;-5.2195777243469e-05;0.00016538890486117;0.00012056774721714;0.00010384435154265;-0.00038138724630699;0.00030338717624545;-3.0604205676354e-05;1.6580472220085e-05;3.5283967008581e-05;1.5049756257213e-05;0.00021590221149381;-8.9532244601287e-05;2.0661138478317e-05;4.7672237997176e-05;-9.6996285719797e-05;6.3827734265942e-05;-0.00014448312867898;3.0406550649786e-05;-0.00010124078835361;3.284167178208e-05;-2.7209302061237e-05;-0.00015533521946054;-5.7033088523895e-05;1.6033363863244e-05;-2.2810223526903e-05;-8.4838997281622e-05;5.7033648772631e-05;2.0357670109661e-06;9.4553015514975e-06;-3.9116883272072e-05;-3.8235753891058e-05;1.46889115058e-05;9.886163752526e-05;4.629349859897e-05;0.00019256383529864;3.8587852031924e-05;-0.00041123983100988;-6.9696748141723e-06;-4.374885247671e-05;-0.00011597121920204;-0.00013656285591424;1.141617212852e-05;0.00023304070055019;1.1581309991016e-05;-4.3741403032982e-07;2.5183042453136e-05;3.245652987971e-05;-3.6787056160392e-05;-5.6543645769125e-05;-5.2320126997074e-05;8.362544758711e-05;0.00012635880557355;-6.1936725614942e-06;-0.00018715867190622;2.2339452698361e-05;5.5929143854883e-05;7.2637834819034e-05;5.423042239272e-05;-3.1992369713407e-06;5.5601803978789e-06;4.5381631935015e-05;5.1709092076635e-05;0.00025067353271879;0.00029320636531338;4.9359601689503e-05;0.00032376922899857;-4.0406153857475e-05;-0.0002034082863247;2.6555035219644e-05;7.4538479566399e-06;6.2439823523164e-05;0.00017200260481331;4.1405844967812e-05;9.5402290753555e-05;-2.6454827093403e-05;0.00028131622821093;0.00036784060648642;-9.2167159891687e-05;-9.9693475931417e-05;-0.00034719801624306;-0.00046716327778995;-0.00014228148211259;-0.00015511194942519;-9.7256423032377e-05;-0.00027776852948591;-8.8568377520915e-08;-8.4762277765549e-06;-2.6783707653522e-05;-8.6618601926602e-05;-3.6032954085385e-05;1.2305727977946e-05;-7.2064074629452e-05;6.8835784077237e-06;-2.0390361896716e-05;0.0010078632039949;-0.00030711808358319;-0.00010359725274611;0.00078604678856209;-0.0016132739838213;0.00016158309881575;-0.00024894130183384;1.3004318134335e-05;-0.00026095367502421;-0.00042354533798061;0.002421221928671;0.00019081564096268;0.0003077145665884;0.0007085939287208;0.00015252636512741;-0.00070186390075833;-0.00033421686384827;-0.00060031958855689;-0.00019606415298767;0.00022250501206145;0.00039639140595682;-0.0011430201120675;-9.3640584964305e-05;0.00039892829954624;0.00010858358291443;-0.00073992524994537;6.7725295593846e-06;-2.3406557374983e-05;0.00015583519416396;-6.7537577706389e-05;8.8580673036631e-05;-0.00068117020418867;-0.00035758453304879;0.00014047262084205;0.00058844842715189;-0.00055738951778039;6.8495413870551e-05;0.00033014963264577;-3.7003062516305e-06;-0.00021435928647406;-0.0003527105145622;-0.0014475981006399;-0.00026304926723242;-0.00020892839529552;0.00042128752102144;7.0352689363062e-05;0.00060843396931887;-0.00019226250879001;-4.9142225179821e-05;-0.00024643755750731;-0.00014734276919626;0.00037333319778554;0.0012999119935557;-3.3768341381801e-05;-0.00043778706458397;8.381169027416e-05;0.0010482892394066;6.4706146076787e-06;3.0571074603358e-05;0.00013758675777353;0.00020352979481686;-0.00051166518824175;0.00018637518223841;-0.00016784979379736;0.0019186445279047;0.00033232106943615;-0.00053711590589955;-0.00014805975661147;-0.00025181792443618;-0.00014561419084202;0.00038271429366432;-0.00016632035840303;-7.6997341238894e-05;-0.00018396660743747;0.00050269701750949;-0.00064486864721403;-0.00018990025273524;6.4582753111608e-05;0.00076888495823368;-0.0013904826482758;0.00027362958644517;-0.00021873209334444;0.0002161302982131;-0.0003276763309259;6.5185107814614e-05;0.00030523186433129;9.688398858998e-05;-0.0005303718498908;-3.4188673453173e-05;1.1185983566975e-05;-6.0530255723279e-05;1.7588094124221e-05;2.4945377390395e-06;0.00088193267583847;-0.0003070509119425;-0.00018981152970809;0.00075919518712908;-0.0015220807399601;0.00015974541020114;-0.00022973390878178;1.4561544048775e-05;-0.00024210913397837;-0.00041364310891367;0.0022756671532989;0.0001563874684507;0.0002550482749939;0.000716564420145;0.0001595311332494;-0.00062010606052354;-0.00035215070238337;-0.00049990590196103;-0.00020889537699986;0.00019347743364051;0.00039058664697222;-0.00099823076743633;-9.0105211711489e-05;0.0003708308795467;0.00010489002306713;-0.00070114457048476;1.1251818250457e-05;-2.5496108719381e-05;0.00015370605979115;-4.9503891204949e-05;9.5642106316518e-05;-0.00070317159406841;-0.00029715627897531;7.9193901910912e-05;0.00046506628859788;-0.00037974314182065;5.0209160690429e-05;0.0003289605374448;3.3799171887949e-06;-0.0001603624841664;-0.00028007084620185;-0.0015228361589834;-0.00026640624855645;-0.00021089083747938;0.00036499401903711;5.7335226301802e-05;0.00061119190650061;-0.00017608699272387;-6.7185720808993e-07;-0.00022138909844216;-0.00018051685765386;0.00030069734202698;0.0013348049251363;-2.3552145648864e-05;-0.00044174815411679;6.1682294472121e-05;0.001021487172693;6.7975652200403e-06;2.8727150493069e-05;0.00012663604866248;0.00018946964701172;-0.00048058605170809;8.6305168224499e-05;-0.00015021080616862;0.0017051754985005;0.00030590433743782;-0.00047192903002724;-0.00013823689369019;-0.00025346383336;-0.00013408684753813;0.00030865066219121;-0.00015649631677661;-8.1477905041538e-05;-0.00018109746451955;0.00041945674456656;-0.00061669759452343;-0.00015948055079207;9.2694426712114e-05;0.00072445394471288;-0.0012038541026413;0.00025501908385195;-0.00017168083286379;0.00019923363288399;-0.00019824206538033;5.9274050727254e-05;0.00031716737430543;9.1748232080135e-05;-0.0005191732198;-7.946599907882e-06;1.6174713891814e-05;-0.00013224304711912;6.6160855567432e-06;-0.00040405034087598;-4.5839165977668e-05;0.00036971023655497;0.00028248847229406;0.0011712684063241;-0.00063420104561374;0.00015848262410145;-9.5638926723041e-05;-0.00011743264622055;-1.789150883269e-05;-0.0017163500888273;0.00032983807614073;2.4619183022878e-05;-8.2721722719725e-05;-0.00067475356627256;0.00027558038709685;-0.00017852752353065;0.00017225996998604;0.00038191972998902;8.9877961727325e-05;0.00017797306645662;0.00058762723347172;-0.00031794063397683;-0.0001983003312489;4.7131878091022e-05;0.00059298850828782;-6.0719419707311e-05;-2.7334865080775e-05;2.2099760826677e-05;-1.4277199625212e-05;0.00015764463751111;-0.00080583442468196;8.0943820648827e-05;-2.9881880436733e-06;-0.00011981689021923;0.00023237535788212;4.5628512452822e-05;0.0003510310780257;-3.7308993341867e-05;0.00010497893526917;-6.831080554548e-06;-0.0019635690841824;-2.0065966964466e-05;-0.00027563943876885;-9.670735016698e-05;0.00017613457748666;0.00067141826730222;-6.5696767705958e-05;-5.7465604186291e-05;-6.503257463919e-05;-0.00032857962651178;-7.4039890023414e-05;0.0015772202750668;6.038405263098e-05;-0.00049325061263517;3.0916464311304e-05;0.00095218728529289;-8.5243927969714e-06;5.9102574596182e-05;-1.0322476555302e-05;0.00018048260244541;0.00011815533071058;-0.00062209914904088;-0.0002170671505155;0.00047715078108013;-0.00010202256089542;-0.00014844910765532;0.00018273865862284;-0.00044138185330667;-5.8683999668574e-05;-8.5011997725815e-05;-6.4105159253813e-05;-1.0114805263584e-05;-0.00010447368549649;-0.00024912567459978;2.310802528882e-06;-0.00034910760587081;0.00033194688148797;-2.2694484869135e-05;-0.00020409388525877;0.00039705511881039;0.00012555040302686;6.9930385507178e-05;0.00066415296168998;0.00011477287625894;0.00054624333279207;2.7382846383261e-05;-0.00067781924735755;6.95972921676e-05;-1.4396084225154e-05;2.5036470105988e-05;-9.8720578534994e-05;2.2976446416578e-05;-0.00056475395103917;-2.9930906748632e-05;0.00033464806620032;0.00032284634653479;0.0014927511801943;-0.0007859084289521;0.00027503271121532;-0.00011637104762485;4.6815544919809e-05;-2.4458251573378e-05;-0.0022366023622453;0.00040492121479474;-4.6212760935305e-05;-0.00017810697318055;-0.00075308937812224;0.00044148860615678;-0.00017703257617541;0.00029243578319438;0.00042157262214459;-0.00010690332419472;0.00019261478155386;0.00083712214836851;-0.00037532180431299;-0.00035505820414983;6.4387088059448e-05;0.00076508091297001;-7.6863405411132e-05;-3.6464887671173e-05;2.2635986169917e-05;-6.2935447203927e-05;0.00017832969024312;-0.0009874808602035;0.00012421599240042;-8.0143858212978e-05;-0.00021621181804221;3.4279692044947e-05;0.00022277901007328;0.00043547822861001;-1.498561596236e-05;-7.5664000178222e-05;-1.0774357406262e-06;-0.002124727005139;-0.00011776053725043;-0.00030952435918152;-0.0001549316366436;0.00033070839708671;0.00079958024434745;-4.4464028178481e-05;-1.0307887350791e-05;-0.00015865710156504;-0.00028648666921072;-0.00013674832007382;0.0018959720619023;0.00015263467503246;-0.00056538067292422;1.8541442841524e-05;0.0011586976470426;1.0099127393914e-05;6.2475162849296e-05;-9.5369678092538e-06;0.00021677657787222;0.00015487388009205;-0.00050778803415596;-0.00031174393370748;0.00096452032448724;-0.00014248055231292;-0.00027809588937089;0.00025481026386842;-0.0004520962247625;-8.6997482867446e-05;1.6115713151521e-05;-7.7768330811523e-05;-8.2644619396888e-05;-0.00013030212721787;-0.00027636284357868;0.00014368473784998;-0.00048909481847659;0.0003266541461926;-8.9794251834974e-05;-0.00056782393949106;0.00057062675477937;3.8257305277511e-05;0.00011207225179533;0.00052111822878942;0.00014648161595687;0.00055212416918948;3.8875354221091e-05;-0.00069492042530328;7.7983931987546e-05;-1.5096422430361e-05;2.3348351533059e-05;-3.6478304537013e-05;2.5198914954672e-05;-0.00047227551112883;1.0039554581454e-05;0.00016810886154417;0.00023620630963705;0.0012278005015105;-0.00063092808704823;0.00029372185235843;-8.7145112047438e-05;0.00019430236716289;-1.9582153981901e-05;-0.0018818725366145;0.0003222965169698;-8.7238266132772e-05;-0.0001972941972781;-0.00051713065477088;0.0004157260118518;-0.00010582998220343;0.00029128167079762;0.00027496641268954;-0.00025863002520055;0.00012589892139658;0.00072938797529787;-0.00028677092632279;-0.00038738804869354;5.5018492275849e-05;0.00065455317962915;-6.4195548475254e-05;-3.2902171369642e-05;1.533783506602e-05;-8.6284431745298e-05;0.00012107432849007;-0.00079819461097941;0.00012335312203504;-0.00018195644952357;-0.00022591206652578;-0.00017033818585332;0.00031539911287837;0.00035464501706883;1.7606555047678e-05;-0.00023544195573777;6.7716937337536e-06;-0.0014589742058888;-0.00017339344776701;-0.00022283862926997;-0.00019178450747859;0.00036293681478128;0.00061809085309505;1.7087766536861e-05;0.00010332655074308;-0.00020177759870421;-0.00013576752098743;-0.00015110280946828;0.0015047522028908;0.00018659047782421;-0.00041834462899715;-3.7419899854285e-06;0.00091558753047138;2.6195362806902e-05;4.1123450500891e-05;-4.5968790800544e-06;0.00015477520355489;0.00013661471894011;-0.00022452556004282;-0.00029243461904116;0.0011402622330934;-0.00013140475493856;-0.00030990823870525;0.0002340632781852;-0.00027163053164259;-8.5091473010834e-05;9.4042188720778e-05;-6.1192615248729e-05;-0.0001817761658458;-0.00010648870375007;-0.00019602364045568;0.00024018599651754;-0.00045932640205137;0.00021666230168194;-0.00013657294039149;-0.0007449722616002;0.00054402992827818;-5.361301737139e-05;0.0001149318923126;0.00020446961570997;0.00012205027451273;0.0003233618917875;3.6208894016454e-05;-0.00039877076051198;5.554666131502e-05;2.3175265596365e-05;-1.781621358532e-05;8.1016296462622e-06;3.3721633371897e-05;-0.00012427032925189;2.0179264538456e-05;2.202323594247e-05;-0.00010684361768654;-0.00033257112954743;0.0004144815611653;-1.684172275418e-05;2.5695584554342e-05;4.2860268877121e-05;-1.8248247215524e-05;0.00010129686415894;-0.00022868621454109;-5.3269232012099e-05;-5.0057904445566e-05;1.3574569948105e-06;0.00014609513164032;-3.8472320738947e-05;6.8314657255542e-05;1.4539102267008e-05;-1.7257914805668e-05;-3.8854013837408e-05;-2.9637054467457e-05;0.00014789431588724;1.0421534170746e-05;-2.2115353203844e-05;-7.0708905695938e-05;8.549266931368e-05;6.1747173276672e-06;2.3497439087805e-06;-4.8807884013513e-05;-1.4832675333309e-05;0.0001251891371794;8.0301011621486e-05;0.00018951817764901;9.0699119027704e-05;-0.00031618983484805;-6.7881541326642e-05;-3.0940911528887e-05;-2.2463769710157e-05;-0.0001492309384048;-9.9508004495874e-05;0.00016994756879285;7.5466086855158e-05;2.2947493562242e-05;0.00010430599650135;9.6605654107407e-05;-3.9057154936017e-05;-4.9126574594993e-05;-0.00019377427815925;-0.00011822189117083;0.00012779064127244;6.9881112722214e-05;-0.00014368038682733;-7.4470284744166e-05;5.0424318033038e-05;3.3926076866919e-05;6.5540174546186e-05;5.7119119446725e-05;-3.2416679118796e-07;1.3117611388225e-06;7.7920129115228e-05;4.0036346035777e-05;0.00036923310835846;0.00020872813183814;0.00022012248518877;0.00012260985386092;-0.00011854623880936;-9.3645925517194e-05;2.0755674995598e-05;1.108087690227e-05;0.00017629245121498;8.6203377577476e-05;8.7945540144574e-05;6.2643433921039e-05;-2.9736198484898e-05;0.00028906870284118;0.00034196968772449;-0.00013193362974562;-7.9595840361435e-05;-0.00045875925570726;-0.00034312039497308;-0.00022292467474472;-0.00010876423039008;-0.00024019769625738;-0.00014245143393055;-1.2263479902686e-06;-4.6422732680185e-07;-0.00010092223237734;-4.3309053580742e-05;4.077398989466e-05;-3.1210580345942e-05;1.2040830370097e-05;5.6445955124218e-05;-0.00019709841581061;3.7211309972918e-05;5.4628006182611e-05;-0.00017222005408257;-0.00060282874619588;0.00072818604530767;-3.3873217034852e-05;4.4006654206896e-05;7.4233437771909e-05;-2.9831784559065e-05;0.00020992054487579;-0.0003983264323324;-8.5509462223854e-05;-7.8315941209439e-05;-8.6355203166022e-06;0.00024212288553827;-7.3518356657587e-05;0.00010383403423475;2.7926967959502e-05;-2.4915440008044e-05;-6.4179483160842e-05;-7.8846678661648e-05;0.00024788622977212;2.3259162844624e-05;-3.9572536479682e-05;-0.00013408121594694;0.00015048783097882;1.0681359526643e-05;5.2418627092266e-06;-8.2447484601289e-05;-2.8328548069112e-05;0.00020489614689723;0.00014105986338109;0.00031821438460611;0.00017616702825762;-0.00050925981486216;-0.00015989177336451;-5.5400283599738e-05;-4.3785814341391e-05;-0.00025296487729065;-0.00017643206228968;0.00028558590565808;0.00015616734162904;3.870344517054e-05;0.00017068354645744;0.00014638739230577;-6.1577062297147e-05;-8.5803556430619e-05;-0.0003159137268085;-0.00019338670244906;0.00021963425388094;0.00013101646618452;-0.00024416262749583;-0.00015094822447281;8.9278648374602e-05;6.3079132814892e-05;0.00010764301259769;9.5862778834999e-05;-1.3146479886927e-06;2.799672756737e-06;0.00013196507643443;6.901361484779e-05;0.00063193769892678;0.00037239084485918;0.00034731195773929;0.00022387826174963;-0.00019693128706422;-0.00017534736252856;3.8829242839711e-05;2.0221230442985e-05;0.00029555737273768;0.00015663060185034;0.00015472526138183;0.00011462316615507;-5.0867100071628e-05;0.00049646093975753;0.00061422068392858;-0.00022560998331755;-0.00013718129775953;-0.00078006944386289;-0.00061186717357486;-0.00038147540180944;-0.00019413843983784;-0.00040224919212051;-0.00025887283845805;-3.3079481909226e-06;-2.0487420897553e-06;-0.00017020692757796;-7.907780673122e-05;5.5555537983309e-05;-4.310589065426e-05;2.341310164411e-06;7.3615803557914e-05;-0.00020736461738124;6.614661833737e-05;0.00013675805530511;-0.00018445540626999;-0.00090563140111044;0.0010193785419688;-5.4683026974089e-05;5.8804940636037e-05;8.8592489191797e-05;-1.8704015019466e-05;0.00037553068250418;-0.00053964357357472;-8.952702046372e-05;-7.2150549385697e-05;-4.9067395593738e-05;0.00028973689768463;-0.00012796057853848;8.4909952420276e-05;4.217131936457e-05;-8.6294076027116e-06;-8.7229105702136e-05;-0.00018767891742755;0.00029601040296257;3.9974449464353e-05;-5.9971695009153e-05;-0.00019302150758449;0.00019929706468247;1.4313171959657e-05;1.0667760761862e-05;-0.000116306306154;-5.3343894251157e-05;0.00023258573492058;0.00019638003141154;0.0003961407346651;0.00029520483803935;-0.00056788284564391;-0.00035168952308595;-7.2189031925518e-05;-7.1750357165001e-05;-0.0003338654350955;-0.00025483433273621;0.00035180556005798;0.00029288762016222;5.7374152675038e-05;0.00018610319239087;0.00012723659165204;-6.0768958064727e-05;-0.00011758298933273;-0.00035295056295581;-0.00021458759147208;0.00030003325082362;0.00021241322974674;-0.00030828572926112;-0.00027376937214285;0.00011213352991035;9.5121606136672e-05;0.00014484679559246;0.000124559213873;-4.095822077943e-06;4.7363246267196e-06;0.00016593722102698;9.6344527264591e-05;0.00082496658433229;0.0005423579714261;0.00038696679985151;0.00035115724313073;-0.0002460285613779;-0.00028534137527458;5.8587749663275e-05;2.7932424927712e-05;0.00034541278728284;0.00023023717221804;0.00019377878925297;0.00017071269394364;-6.1601400375366e-05;0.00069949502358213;0.00091453827917576;-0.00030254988814704;-0.00020345505618025;-0.0010524266399443;-0.00090446416288614;-0.00048710810369812;-0.00027633752324618;-0.00048192535177805;-0.00038913462776691;-4.6118111640681e-06;-5.4480892686115e-06;-0.00019397372670937;-0.00011465947318356;6.1318540247157e-05;-4.8546746256761e-05;-2.5674722564872e-05;8.0309931945521e-05;-0.00015747446741443;0.00012566149234772;0.00022533620358445;-7.5274787377566e-05;-0.0011359902564436;0.0011666548671201;-6.9204230385367e-05;6.2099352362566e-05;6.6347478423268e-05;3.2752799597802e-05;0.00054660183377564;-0.00058592006098479;-5.5690310546197e-05;-2.5980018108385e-05;-0.00012290204176679;0.00027850113110617;-0.0002065883600153;1.4304595424619e-05;4.018802792416e-05;3.563953214325e-05;-0.00010324380127713;-0.00030683912336826;0.00022125327086542;5.4819396609673e-05;-8.013463957468e-05;-0.00022047801758163;0.00020815306925215;1.7675480194157e-05;1.892074214993e-05;-0.00014768296387047;-8.9654080511536e-05;0.00013579808000941;0.0001871286513051;0.00036636076401919;0.00039872087654658;-0.00042272193240933;-0.00061211496358737;-7.698948320467e-05;-0.00010421871411381;-0.00036696044844575;-0.00031777893309481;0.00032633423688821;0.00046436613774858;6.3381230575033e-05;4.8747340770205e-05;-4.921844083583e-05;7.4093395596719e-06;-0.00010525257675909;-0.00017908957670443;-6.1720049416181e-05;0.0003571137203835;0.00030903404694982;-0.00028786037000827;-0.00040878012077883;0.00010566360288067;0.00012371287448332;0.0001688555785222;0.00013081992801744;-7.7541644714074e-06;7.492234090023e-06;0.00015851948410273;0.00010984903929057;0.0008666607318446;0.00066335097653791;0.00029924695263617;0.0004707675834652;-0.00025419486337341;-0.00041584330028854;7.4185722041875e-05;2.9618731787195e-05;0.00027893303195015;0.00027961988234892;0.00018461198487785;0.00022112982696854;-5.346879697754e-05;0.00083217344945297;0.0012057091807947;-0.00033014433574863;-0.00026030925801024;-0.0011935349320993;-0.0011405672412366;-0.0004863738140557;-0.00032244369504042;-0.00042533013038337;-0.00050014705630019;-2.9161126349209e-06;-9.2769269031123e-06;-0.00014395370089915;-0.0001356104912702;6.4000196289271e-05;-5.1194707339164e-05;-4.0941959014162e-05;7.4418327130843e-05;-0.00014505806029774;0.00021735001064371;0.00028190738521516;5.1928385801148e-05;-0.0011953163193539;0.00114618439693;-7.6574833656196e-05;5.9295874962118e-05;7.2731018008199e-05;5.0636488595046e-05;0.0006152285495773;-0.00053632404888049;-2.2060336050345e-05;1.501326005382e-05;-0.00019420697935857;0.00026533825439401;-0.00027934796526097;2.3674926978856e-06;-1.1235664715059e-05;5.6375803978881e-05;-9.86304730759e-05;-0.00037277207593434;0.00010931621363852;5.6163724366343e-05;-8.4667044575326e-05;-0.00023856334155425;0.00020863841928076;1.7126109014498e-05;2.3688166038482e-05;-0.00014610108337365;-9.9862336355727e-05;7.8144657891244e-05;0.00019980952492915;0.00030921222059987;0.00045343115925789;-0.00025897001614794;-0.00081276101991534;-6.833158840891e-05;-0.0001231630158145;-0.00036646623630077;-0.000352940231096;0.00025445848586969;0.00057063938584179;4.8350357246818e-05;-1.1492134945001e-05;-0.00010293971718056;5.6949102145154e-05;-9.7826210549101e-05;-0.00011009363515768;-9.2383907031035e-06;0.00034812532248907;0.00035072918399237;-0.00022422806068789;-0.00048007298028097;9.6969080914278e-05;0.0001467652618885;0.0001808921515476;0.00012919650180265;-8.657649232191e-06;1.0938570994767e-05;0.00014732318231836;0.00012045006587869;0.00084194715600461;0.00072076066862792;0.00022396970598493;0.00058261019876227;-0.00022534630261362;-0.00049345660954714;8.0782658187672e-05;2.775466782623e-05;0.00023986052838154;0.00034195644548163;0.00017215010302607;0.00025535962777212;-5.8951809478458e-05;0.00083537312457338;0.0012651151046157;-0.00031090967240743;-0.00027435988886282;-0.0011762368958443;-0.001209587790072;-0.00047207617899403;-0.00035906437551603;-0.00037539596087299;-0.000597225909587;-3.2737225410528e-06;-1.5116906979529e-05;-0.0001175067955046;-0.00016918541223276;5.6130138545996e-05;-4.6293873310788e-05;-4.1104154661298e-05;5.1730592531385e-05;-0.00013007527741138;0.00030128107755445;0.00027659404440783;0.00015836795500945;-0.001011332962662;0.00089481950271875;-7.1147718699649e-05;5.0004869990516e-05;8.5817853687331e-05;3.7004439946031e-05;0.00054765929235145;-0.00036940752761438;1.4220614502847e-05;6.1831968196202e-05;-0.00021190823463257;0.00020355748711154;-0.00030526120099239;3.6504126910586e-05;-0.00012496279668994;5.7430206652498e-05;-7.5590898632072e-05;-0.00036328224814497;-1.5268664355972e-05;4.3163876398467e-05;-7.0551621320192e-05;-0.00021941942395642;0.00017948861932382;1.1125500350317e-05;2.2594374968321e-05;-0.00011031917529181;-8.5727981058881e-05;5.1399681979092e-05;0.00021027227921877;0.00020137750834692;0.00043410004582256;-7.6710901339538e-05;-0.0008645550115034;-4.2550305806799e-05;-0.00011477114458103;-0.00030753840110265;-0.00032445069518872;0.00013534873141907;0.00054909847676754;2.7565543859964e-05;-6.4212158576993e-06;-2.6353989596828e-05;6.9625493779313e-05;-8.6644533439539e-05;-0.00011617936979746;-5.984334347886e-05;0.000260662403889;0.00031181797385216;-0.00011423786054365;-0.00044824744691141;7.5116542575415e-05;0.00014359886699822;0.00016671416233294;0.00011413386528147;-7.0432602115034e-06;1.183046879305e-05;0.00011867380817421;0.00011847107089125;0.00069034268381074;0.00067962647881359;0.00015800341498107;0.00063135393429548;-0.00015277076454367;-0.00046863613533787;7.2181486757472e-05;2.3112104827305e-05;0.00019151854212396;0.00037283392157406;0.00013283336011227;0.00024541831226088;-6.3097388192546e-05;0.00068997463677078;0.0010245724115521;-0.00023740810866002;-0.00023997078824323;-0.0009510624804534;-0.0010761203011498;-0.00039465824374929;-0.00035686351475306;-0.00029407883994281;-0.00061402755090967;-4.4134581003163e-06;-1.8862761862692e-05;-8.9384513557889e-05;-0.00019234845240135;3.9703201764496e-05;-3.3293716114713e-05;-3.3585431083338e-05;3.0524519388564e-05;-0.00010603509872453;0.00028677922091447;0.00020308177045081;0.00019023203640245;-0.00068630266468972;0.00056032126303762;-5.2237541240174e-05;3.2535903301323e-05;6.851929356344e-05;2.6607809559209e-05;0.00038420804776251;-0.00019229087047279;2.8882463084301e-05;7.0905458414927e-05;-0.00017705437494442;0.0001340118033113;-0.00025605683913454;5.4986965551507e-05;-0.00016212651098613;4.8607395001454e-05;-4.9482852773508e-05;-0.00026537996018305;-8.8174580014311e-05;2.7222549761063e-05;-4.633912249119e-05;-0.00015753452316858;0.00011876440112246;6.2194849306252e-06;1.6876409063116e-05;-7.1083537477534e-05;-6.1704544350505e-05;2.042725100182e-05;0.00015601654013153;0.00010234285582555;0.00031390716321766;3.0583069019485e-05;-0.00069551292108372;-2.0104769646423e-05;-8.3859071310144e-05;-0.00021134587586857;-0.00024295758339576;4.4819589675171e-05;0.00041209236951545;9.4832103059161e-06;-2.3909724404803e-05;6.2720760070079e-06;7.0015899837017e-05;-5.4603111493634e-05;-8.1365622463636e-05;-4.2527408368187e-05;0.00016192192560993;0.00022665894357488;-3.221597216907e-05;-0.00032193079823628;4.6570814447477e-05;0.00010814035340445;0.00012461251753848;8.6160485807341e-05;-4.7189537326631e-06;1.0158839359065e-05;7.8435667091981e-05;9.0021690994035e-05;0.00046189714339562;0.00050836207810789;9.1022309788968e-05;0.00053183594718575;-8.2306076365057e-05;-0.00036204486968927;5.1074934162898e-05;1.4653040125268e-05;0.00012309321027715;0.00030340783996508;8.2373342593201e-05;0.00018291767628398;-5.0533912144601e-05;0.00047063690726645;0.00068376318085939;-0.00015070351946633;-0.00017008108261507;-0.00063152029179037;-0.00078290194505826;-0.00026766228256747;-0.00027398139354773;-0.00018718009232543;-0.00048914132639766;-3.0654123293061e-06;-1.6325093383784e-05;-5.4296324378811e-05;-0.00015719122893643;2.2196285499376e-05;-1.9600935047492e-05;-1.9585682821344e-05;1.3271909665491e-05;-5.6846667575883e-05;0.0001990088931052;0.00012344244169071;0.00012255148612894;-0.00037262667319737;0.00027856198721565;-2.8738741093548e-05;1.7987713363254e-05;4.8132402298506e-05;7.2021680352918e-06;0.00021385462605394;-6.7227359977551e-05;2.6758143576444e-05;5.8200104831485e-05;-9.647048136685e-05;6.678760109935e-05;-0.00016561608936172;3.156925595249e-05;-0.00012748558947351;2.4767949071247e-05;-2.3971675545909e-05;-0.00015874084783718;-7.9331191955134e-05;1.207206514664e-05;-2.3233775209519e-05;-9.1401168901939e-05;6.4511863456573e-05;1.6408359897468e-06;9.624648555473e-06;-3.0931525543565e-05;-3.2254931284115e-05;2.0119625332882e-05;0.00011055028153351;3.779171674978e-05;0.00020158813276794;5.5583139328519e-05;-0.00043780347914435;-5.227279416431e-06;-4.6791454224149e-05;-0.00011722249473678;-0.00013893697177991;6.8598393454522e-07;0.00023508252343163;1.4434085642279e-06;1.6665291695972e-05;4.6712237235624e-05;3.2112100598169e-05;-3.6143799661659e-05;-7.5467825809028e-05;-7.9752593592275e-05;7.4124036473222e-05;0.00012242466618773;5.8484329201747e-06;-0.00018734080367722;2.4019444026635e-05;6.3147177570499e-05;7.4242321716156e-05;5.4467156587634e-05;-1.8737390519163e-06;6.0188008319528e-06;4.3481210013852e-05;5.8619421906769e-05;0.00024235226737801;0.00030586897628382;4.849966353504e-05;0.000339944352163;-3.3364787668688e-05;-0.00020856085757259;2.6527777663432e-05;6.4551259129075e-06;6.8575252953451e-05;0.00019934320880566;4.1219675040338e-05;0.00011153237574035;-3.4065004001604e-05;0.00025669610477053;0.00034193461760879;-7.6345313573256e-05;-9.8269338195678e-05;-0.00032389763509855;-0.00044855778105557;-0.00014440802624449;-0.00017274791025557;-0.00010020405170508;-0.00030517336563207;-1.4082612551647e-06;-8.1465759649291e-06;-2.9649008865817e-05;-0.00011039713717764;-2.775777647912e-05;4.1717507883732e-06;-1.4529443433275e-05;3.7666337448172e-05;4.700709177996e-05;0.00060602830490097;-0.00029813501168974;-0.00036130944499746;0.00071226072032005;-0.0014313296414912;0.00014778925105929;-0.00018672875012271;3.7751065974589e-05;-0.0002526332391426;-0.00038152805063874;0.0020729992538691;8.3380422438495e-05;0.00022723131405655;0.00077001797035336;0.00013554014731199;-0.00045457482337952;-0.00039151546661742;-0.0004214957007207;-0.00024092628154904;0.00014307636593003;0.00035908521385863;-0.00061216909671202;-8.4331099060364e-05;0.00031508156098425;8.3369443018455e-05;-0.00062349264044315;1.7450114683015e-05;-2.8328679036349e-05;0.00013723576557823;-5.0103967623727e-06;0.00011877811630256;-0.00065779453143477;-0.00023886655981187;-9.2939044407103e-05;0.00034101403434761;-0.00016962715017144;4.3863845348824e-05;0.00032907584682107;1.1477728776299e-06;-4.3941276089754e-05;-0.00021509332873393;-0.0017242701724172;-0.0002824566909112;-0.00026389997219667;0.00036993995308876;0.00010404897329863;0.00057728902902454;-0.00021995478891768;0.00011394837201806;-0.00021215109154582;-0.0002734741428867;0.000241912304773;0.0014294687425718;-1.4417113561649e-05;-0.000461395829916;4.7434499720111e-05;0.0010310134384781;1.2842616342823e-05;2.4626711820019e-05;0.00010869962716242;0.00017419527284801;-0.00049310422036797;-6.1232312873472e-05;-0.00013090365973767;0.0016223712591454;0.00029889470897615;-0.00042009379831143;-0.00013859789760318;-0.00024992023827508;-0.00012568064266816;0.00019596033962443;-0.00015644953236915;-0.00019721034914255;-0.00018962813192047;0.00029869159334339;-0.00068102189106867;-0.00010617844964145;0.0001513136230642;0.00076221441850066;-0.0010468284599483;0.00025770251522772;-0.00013377649884205;0.00018525806081016;5.9767087805085e-05;5.4692452977179e-05;0.0003445629554335;9.2871734523214e-05;-0.00051403878023848;-2.6336743758293e-05;2.396319359832e-06;3.0695216537424e-06;7.4427276558708e-05;8.3240454841871e-05;0.00049734901404008;-0.000329041184159;-0.00053428928367794;0.00074739858973771;-0.0014628825010732;0.00015828984032851;-0.00017278408631682;4.2553590901662e-05;-0.00020710036915261;-0.00040496376459487;0.0021046223118901;2.9656577680726e-05;0.0001757878344506;0.00087532831821591;0.00016704163863324;-0.00038256391417235;-0.00046345312148333;-0.00032979296520352;-0.00028471651603468;7.5659838330466e-05;0.00038825167575851;-0.00047434555017389;-8.5788989963476e-05;0.00029431900475174;8.6251573520713e-05;-0.0006475843838416;2.4109893274726e-05;-3.1313462386606e-05;0.00015110908134375;2.2230895410758e-05;0.00012385135050863;-0.00072005932452157;-0.00019807436910924;-0.00012402891297825;0.0002305428206455;3.0230645279516e-05;2.3182154109236e-05;0.00035788581590168;2.137855062756e-06;6.3955085352063e-05;-0.00015219576016534;-0.002043872140348;-0.00031822471646592;-0.00027357102953829;0.00033183943014592;9.5393974334002e-05;0.00062967161647975;-0.00020611770742107;0.00013423635391518;-0.00019463547505438;-0.00036092911614105;0.00018817844102159;0.0015965703641996;-9.1188235273876e-07;-0.00052488403161988;2.8430884412955e-05;0.0011152613442391;1.3794669939671e-05;2.6888299544225e-05;0.00010937461047433;0.00017346392269246;-0.00049882417079061;-0.00023307424271479;-0.00012194846931379;0.0014938408276066;0.00029056682251394;-0.00036687543615699;-0.00014146337343846;-0.00029270540107973;-0.00012781044642907;9.4984963652678e-05;-0.00015791000623722;-0.00023435104230884;-0.00021031507640146;0.00022695436200593;-0.00070852105272934;-8.3693004853558e-05;0.0002164210745832;0.00077796512050554;-0.00091400358360261;0.00026076089125127;-6.9727189838886e-05;0.00018212823488284;0.00030043243896216;5.4544496379094e-05;0.00041912030428648;9.7982796432916e-05;-0.00057800125796348;-1.0784970072564e-05;-4.0092281778925e-06;3.0571631214116e-05;9.702052193461e-05;8.9832195953932e-05;0.00016104163660202;-0.00022666840231977;-0.0005056825466454;0.00047163150156848;-0.00089548632968217;9.9690070783254e-05;-6.204990495462e-05;3.5836212191498e-05;-3.774862489081e-05;-0.00025637657381594;0.001239973003976;-5.8322730183136e-05;5.44927570445e-05;0.00064188404940069;0.00012934600817971;-0.00012616127787624;-0.00035194389056414;-0.00011838062346214;-0.00021906838810537;-7.7438984590117e-05;0.00025400301092304;-8.6584448581561e-05;-4.9820708227344e-05;0.00011650693340925;4.7734953113832e-05;-0.0003830368805211;2.1959489458823e-05;-2.0986737581552e-05;0.00010432700219098;6.0975376982242e-05;7.2117218223866e-05;-0.00046886780182831;-7.0823458372615e-05;-0.00010350082447985;9.0288658611826e-06;0.00025453791022301;-1.0368970833952e-05;0.00023168977349997;-3.4643123854039e-06;0.00020102769485675;-1.9657341908896e-05;-0.0016027617966756;-0.00023575349769089;-0.00017155920795631;0.00015366172010545;5.7156390539603e-05;0.00041660372517072;-0.00010727060725912;9.4962349976413e-05;-9.1585447080433e-05;-0.00033518974669278;5.4861317039467e-05;0.0011234126286581;1.6337346096407e-05;-0.00037582532968372;-1.7334891708742e-06;0.00074668973684311;1.0306522199244e-05;1.9325918401591e-05;5.8901314332616e-05;0.00010907169053098;-0.00030753607279621;-0.00034205184783787;-6.2153099861462e-05;0.00071978877531365;0.00016561873781029;-0.00015338759112637;-8.6422980530187e-05;-0.00023156353563536;-8.2503174780868e-05;-5.3978401410859e-05;-9.9213983048685e-05;-0.00016703541041352;-0.0001538483047625;2.5512617867207e-05;-0.00045818131184205;-3.1614240469935e-06;0.00020396769104991;0.00048357975902036;-0.00036052684299648;0.00016006502846722;2.5470841137576e-05;0.00010856738663279;0.00047444814117625;3.2758121960796e-05;0.00035053252940997;6.808547914261e-05;-0.00045443658018485;5.7130000641337e-06;-9.7599468062981e-06;-0.00027048168703914;-3.6877379898215e-05;-0.00016033211431932;-8.4800237942773e-09;0.00027899412089027;0.00016308970225509;0.00042012982885353;-0.00024454304366373;-0.00011782893125201;-2.0072842744412e-05;-0.00071961752837524;6.742739060428e-06;-0.00049069907981902;0.00012652395525947;0.00020744689390995;8.8742643129081e-05;-0.00038422388024628;-6.8949411797803e-05;-0.00017508568998892;5.2792925998801e-05;0.00016321387374774;0.00071520602796227;9.1752524895128e-05;0.00012178968609078;-0.00016288222104777;0.00021231725986581;-6.0424854382291e-06;0.00022981510846876;-1.6865578800207e-05;1.2721937309834e-05;8.7894677562872e-06;7.5290416134521e-05;7.7035205322318e-05;-0.00016058553592302;-5.9840978792636e-05;0.00024954491527751;1.4247727449401e-05;0.00042007968295366;-0.00016394373960793;3.8340298488038e-05;-5.7535678934073e-05;0.00054587254999205;-4.4066498958273e-05;-0.0012945587513968;8.4585582953878e-05;-0.00014434898912441;4.3988216930302e-05;-0.00011735827865778;0.00021049288625363;-5.0599064707058e-05;-0.00021285116963554;0.00013080079224892;-0.0002978989505209;5.740253982367e-05;0.00051048718160018;-3.2701045711292e-05;-0.00022463136701845;4.3799562263303e-05;0.00034654480987228;-9.1036808953504e-06;6.3942083215807e-05;-1.4849333638267e-05;5.4855536291143e-05;3.6739209463121e-05;-0.00078896328341216;-2.4281676815008e-05;-0.00041874041198753;-3.4575085010147e-05;0.00010325808398193;3.5183340514777e-05;-0.000392484216718;-1.3901326383348e-06;-0.00030200570472516;-4.8202880861936e-05;6.431760994019e-05;-4.6082175686024e-05;-0.00016735050303396;-0.0002393729519099;-4.9968642997555e-05;0.00032116935472004;9.3493683380075e-05;0.00041113496990874;5.3053056035424e-05;0.00032873297459446;-7.3794490162982e-06;0.00097106670727953;5.4140949941939e-05;0.00047905766405165;9.6232397481799e-06;-0.00059902248904109;5.4900468967389e-05;-3.1669151212554e-06;-2.0320040050592e-07;-0.00029758209711872;-4.8785193939693e-05;-0.00010711608774727;-4.9519239837537e-05;0.00053486961405724;0.00026310887187719;0.000847291899845;-0.00047654466470703;-1.6460435290355e-05;-5.9928010159638e-05;-0.00065899780020118;-8.8502529251855e-06;-0.0011220297310501;0.00024656768073328;0.00022929189435672;7.1723356086295e-05;-0.00067083624890074;-4.2639145249268e-05;-0.00022555862960871;3.0097176932031e-05;0.00034893155680038;0.00063990225316957;0.00017710770771373;0.00013949006097391;-0.00027300458168611;9.2459224106278e-05;1.460995463276e-05;0.00046204318641685;-3.627218757174e-05;3.0959033665567e-06;1.675138992141e-05;4.9159403715748e-05;0.00012442082515918;-0.00043169566197321;-1.0883329196076e-05;0.00018343522970099;-3.0848113965476e-05;0.00052061973838136;-0.0001523425016785;0.00018471138901077;-6.4234634919558e-05;0.00056621269322932;-4.6954966819612e-05;-0.0020642203744501;7.8687677159905e-05;-0.0002312395372428;-4.2103970372409e-06;-8.748849722906e-06;0.00043844498577528;-6.123972707428e-05;-0.00021209317492321;6.7489629145712e-05;-0.00040472435648553;2.1310805095709e-05;0.0011316136224195;-1.0147809916816e-05;-0.00043225570698269;5.373485328164e-05;0.00073871930362657;-1.2568264537549e-05;8.0372316006105e-05;-1.6144191249623e-05;0.00010148242290597;8.5326049884316e-05;-0.0010472038993612;-0.00011551451461855;-0.00016791008238215;-6.901834422024e-05;5.6094111641869e-05;9.7651463875081e-05;-0.00052718364167958;-2.973649679916e-05;-0.00041293591493741;-6.5192252804991e-05;-6.7854474764317e-05;-7.6325275585987e-05;-0.00025045999791473;-0.00021204852964729;-0.00021244650997687;0.00045681066694669;6.0177357227076e-05;0.00026919995434582;0.00023675782722421;0.0003916280111298;2.6480467568035e-05;0.0013371851528063;8.500023977831e-05;0.0006613822770305;1.9764034732361e-05;-0.00076984817860648;7.4509953265078e-05;-1.2393783435982e-05;8.4794664871879e-06;-0.0002063580614049;-3.6273519071983e-05;-4.8502057325095e-05;-4.7900812205626e-05;0.00049321260303259;0.00023523278650828;0.00086679152445868;-0.0004764182085637;9.9059725471307e-05;-6.5054955484811e-05;-0.00036494637606665;-1.443499695597e-05;-0.0012228050036356;0.00024666383978911;0.00014941429253668;1.8259370335727e-05;-0.00060500984545797;2.0126519302721e-05;-0.00017673628462944;2.3048971343087e-05;0.00033028351026587;0.00031456464785151;0.00016315431275871;0.00014153333904687;-0.00025428953813389;-6.4740670495667e-05;2.486388257239e-05;0.0005009399028495;-3.9764567191014e-05;-3.3769697438402e-06;1.4424050277739e-05;-1.4511682820739e-05;0.00010500555799808;-0.00047106813872233;3.528430534061e-05;4.1003957448993e-05;-7.4270814366173e-05;0.00032705554622225;-3.3522719604662e-05;0.00021692104928661;-3.4491418773541e-05;0.00031679877429269;-3.1340419809567e-05;-0.0017909513553604;1.4006528544996e-05;-0.00019506912212819;-5.7574219681555e-05;0.00010733236558735;0.00043300385004841;-3.0146380595397e-05;-0.00010264255251968;-2.817183303705e-05;-0.0002727551618591;-2.6503286790103e-05;0.0011478777742013;3.6893692595186e-05;-0.00041319525917061;3.4905788197648e-05;0.00075145810842514;-2.3801051156624e-06;6.395598029485e-05;-1.1450631063781e-05;7.7949443948455e-05;9.5704759587534e-05;-0.00081087357830256;-0.00015199130575638;0.00020297167066019;-7.5580537668429e-05;-2.4141403628164e-05;0.00011540407285793;-0.0004079156788066;-4.4828975660494e-05;-0.00034328881883994;-5.3369960369309e-05;-0.00020121593843214;-6.8825858761556e-05;-0.00020873389439657;-6.6806438553613e-05;-0.00027528766077012;0.00038203381700441;-1.5017292753328e-05;-4.1116294596577e-05;0.00031540656345896;0.00029428067500703;4.9627429689281e-05;0.0010847816010937;7.5991483754478e-05;0.00051313871517777;2.2114265448181e-05;-0.00055162271019071;5.8706551499199e-05;3.2810952689033e-05;-2.4400673282798e-05;1.1396352419979e-05;3.9303351513809e-05;-0.00014179243589751;2.7500280339154e-05;6.6403721575625e-05;-0.0001297005219385;-0.00046823310549371;0.00055447412887588;-3.0143937692628e-05;3.1639992812416e-05;7.0259484346025e-05;-3.4054712159559e-05;0.00017856877821032;-0.00029971057665534;-6.2414168496616e-05;-5.9216610679869e-05;-2.5562027076376e-05;0.00018142705084756;-6.0269401728874e-05;7.3873285145964e-05;3.253270915593e-05;-2.3570230041514e-05;-3.8196634704946e-05;-8.6245898273773e-05;0.00018776539945975;2.0096820662729e-05;-2.7536039851839e-05;-0.00011865077976836;0.00012164549843874;7.140436082409e-06;4.4447483560361e-06;-5.1878225349355e-05;-1.5785250070621e-05;0.00016937697364483;0.00012867592158727;0.00024358548398595;0.00015263428213075;-0.00036043630097993;-0.00015822952263989;-4.2046624002978e-05;-3.6706656828756e-05;-0.00018323751282878;-0.00013629115710501;0.00020391559519339;0.00013720653078053;2.3909085939522e-05;0.00016665004659444;0.00013462120841723;-5.3199080866762e-05;-7.848150562495e-05;-0.00027878166292794;-0.00018471537623554;0.00015106650243979;9.8075775895268e-05;-0.00018151522090193;-0.00013159774243832;7.33635170036e-05;5.3929496061755e-05;7.4943010986317e-05;6.9363210059237e-05;-1.3578614925791e-06;3.1845881949266e-06;0.00010289898636984;5.3951403970132e-05;0.00047821266343817;0.00028454113635235;0.00023816623433959;0.00018239635392092;-0.00013481214409694;-0.00013635854702443;3.1558924092678e-05;1.5683976016589e-05;0.0002364846150158;0.00013523374218494;0.00012822693679482;9.2741196567658e-05;-4.4753254769603e-05;0.00035303621552885;0.00044394741416909;-0.00016443987260573;-9.5227034762502e-05;-0.00055738654918969;-0.0004506420227699;-0.00029845561948605;-0.00015613887808286;-0.00030783688998781;-0.00021207192912698;-4.3725785872084e-06;-3.5564307836466e-06;-0.00014237764116842;-7.047709368635e-05;4.250092752045e-05;-3.4082611819031e-05;-2.8480350010796e-05;4.4883287046105e-05;-0.00011704269854818;0.00019313578377478;0.00017693050904199;0.00010236694652122;-0.00073327776044607;0.00067335128551349;-3.8735674024792e-05;3.1366525945487e-05;6.5030922996812e-05;2.9799224648741e-05;0.00037878204602748;-0.00029570661718026;-7.6494225140777e-06;6.1608739088115e-06;-0.00015289013390429;0.00021112053946126;-0.00023137612151913;-3.0063583835727e-05;1.8899916540249e-05;1.3746787772106e-05;-4.6998262405396e-05;-0.00021757626382168;-8.7135094872792e-06;2.6352936401963e-05;-5.2568393584806e-05;-0.00016257481183857;0.00014330777048599;1.3426581972453e-05;1.715141661407e-05;-7.7448261436075e-05;-4.8290232371073e-05;1.7276886865147e-05;0.00011152684601257;0.00017815710452851;0.00027898213011213;-0.00011549078772077;-0.00056283100275323;-4.5920216507511e-05;-9.1169058578089e-05;-0.00023124294239096;-0.00023538444656879;0.00013983059034217;0.00038951064925641;-1.2145115761086e-05;-3.2594220101601e-05;-0.00014287661178969;7.5570649642032e-05;-3.9893038774608e-05;-2.1493220629054e-05;5.7566874602344e-05;0.00021257357730065;0.00022791506489739;-0.00011871552123921;-0.00030753307510167;6.6366890678182e-05;0.0001131095123128;0.00011227541835979;7.1787515480537e-05;-2.1181022020755e-06;1.01596915556e-05;8.5117979324423e-05;8.0746045568958e-05;0.00049262231914327;0.00042612862307578;9.6642303105909e-05;0.00035646802280098;-0.00013461888011079;-0.00033983931643888;4.9473521357868e-05;1.0598103472148e-05;0.00015491992235184;0.0002510879712645;0.00011734792497009;0.00019768353377003;-5.2718158258358e-05;0.00044344129855745;0.00079949566861615;-0.0001542890095152;-0.00015552586410195;-0.00066364859230816;-0.00065993564203382;-0.00029587274184451;-0.00023471511667594;-0.00022977915068623;-0.00041500153020024;-4.3929808271059e-06;-9.8660484582069e-06;-7.9205259680748e-05;-0.00014040652604308;4.1833296563709e-05;-3.5936129279435e-05;-2.7271857106825e-05;3.1761457648827e-05;-0.00010838414164027;0.00027790240710601;0.00020023391698487;0.00015444325981662;-0.00069913838524371;0.00058789039030671;-4.4714084651787e-05;3.5856035538018e-05;8.9151377324015e-05;1.0655820005923e-05;0.00038217034307308;-0.00022149768483359;1.926197001012e-05;5.6231048802147e-05;-0.00015684727986809;0.00016395654529333;-0.00026260814047419;1.9059307305724e-05;-0.00011685720528476;1.9259130567661e-05;-4.3028059735661e-05;-0.00025787699269131;-6.0870897868881e-05;2.1304880647222e-05;-4.9694106564857e-05;-0.00017102753918152;0.00014478132652584;8.0041854744195e-06;1.6973674064502e-05;-6.0125890740892e-05;-4.5832039177185e-05;4.0238082874566e-05;0.00016772228991613;0.00012752576731145;0.0003219117061235;-2.1627782189171e-05;-0.000664655235596;-2.8755150196957e-05;-9.0227338660043e-05;-0.00022093152801972;-0.00023650923685636;7.7232783951331e-05;0.00040261514368467;-9.1986466941307e-06;2.3827009499655e-05;-1.8906025616161e-06;5.7268192904303e-05;-5.6203851272585e-05;-0.00010574567568256;-7.7993259765208e-05;0.00016773992683738;0.00021520908921957;-5.8732148318086e-05;-0.0003221785009373;5.8936901041307e-05;0.00012009869533358;0.0001192407507915;7.6062649895903e-05;-1.8508484345148e-06;9.8892751339008e-06;8.0391706433147e-05;9.5804651209619e-05;0.00047011254355311;0.00049235386541113;0.0001016092064674;0.00046280687092803;-9.7327123512514e-05;-0.00034431042149663;5.1164035539841e-05;1.4159704733174e-05;0.00015188958786894;0.00031714932993054;9.9066855909768e-05;0.00020931541803293;-6.2076273025014e-05;0.00042519406997599;0.00068432983243838;-0.0001324838376604;-0.00016118025814649;-0.00061615579761565;-0.0006990124238655;-0.0002868359151762;-0.00028353041852824;-0.00021709321299568;-0.00048737617908046;-6.820062026236e-06;-1.4440694030782e-05;-7.2582959546708e-05;-0.0001821604964789;3.2733729312895e-05;-2.9718768928433e-05;-2.2649554011878e-05;1.7667107385932e-05;-8.4155086369719e-05;0.00028463217313401;0.00017114861111622;0.00016800787125248;-0.00052850163774565;0.00040102380444296;-3.6466790334089e-05;2.9457914934028e-05;8.5026098531671e-05;-3.2006369110604e-07;0.00030118459835649;-0.00011540599371074;3.3774449548218e-05;7.6619551691692e-05;-0.00012951782264281;0.00010937643673969;-0.00024015438975766;3.4046348446282e-05;-0.0001702692679828;1.6014819266275e-05;-3.0300878279377e-05;-0.00022197572980076;-9.9980956292711e-05;1.2396991223795e-05;-3.7511257687584e-05;-0.0001400255569024;0.00011384323443053;3.6480678318185e-06;1.3639420103573e-05;-3.5776953154709e-05;-3.3435557270423e-05;3.7150435673539e-05;0.00015943170001265;6.6960725234821e-05;0.00027975434204563;5.021949618822e-05;-0.00059840630274266;-1.2806674021704e-05;-7.2724309575278e-05;-0.00016952633450273;-0.00019126779807266;1.8480717699276e-05;0.00032797278254293;-1.2744812011078e-05;4.3075961002614e-05;6.2783277826384e-05;4.2794057662832e-05;-4.8408328439109e-05;-0.00011971726053162;-0.00012417286052369;0.0001062433802872;0.00016544399841223;-5.4004899538995e-06;-0.00026136563974433;4.1924013203243e-05;0.00010139635560336;0.00010001035843743;6.4824176661205e-05;-6.7648767299033e-07;8.3352006186033e-06;5.9327830967959e-05;8.6692954937462e-05;0.00034776874235831;0.0004269327619113;7.3810020694509e-05;0.00043585224193521;-5.291942943586e-05;-0.00028502888744697;3.9803639083402e-05;1.0541679330345e-05;0.00011466119758552;0.00029703121981584;6.7115855927113e-05;0.00018003935110755;-5.6574597692816e-05;0.00031898220186122;0.0004781293682754;-8.679545862833e-05;-0.00013146077981219;-0.00044666239409707;-0.00056920031784102;-0.00021728329011239;-0.00025489871040918;-0.00015876238467172;-0.00043787708273157;-5.7569500313548e-06;-1.2345096365607e-05;-5.2071191021241e-05;-0.00017671119712759;1.9531335055945e-05;-1.9132325178361e-05;-1.3692022548639e-05;6.1594300859724e-06;-4.3965297663817e-05;0.00021140440367162;0.00011317824828438;0.00011670288222376;-0.00030831436743028;0.00020604918245226;-2.0959245375707e-05;1.9249033357482e-05;6.2834900745656e-05;-8.7157422967721e-06;0.00018207075481769;-3.112412741757e-05;3.1839772418607e-05;6.8190638558008e-05;-7.0893089286983e-05;5.4746662499383e-05;-0.00016760628204793;1.8570957763586e-05;-0.0001448183611501;5.0340822781436e-06;-1.5048614841362e-05;-0.00014640366134699;-8.8641558249947e-05;3.9450223994208e-06;-2.2176356651471e-05;-8.884121052688e-05;7.0824949943926e-05;3.0950420182307e-07;8.3876020653406e-06;-1.1877937140525e-05;-1.6528942069272e-05;3.1459483579965e-05;0.00011927146988455;2.1363870473579e-05;0.00019880413310602;6.7263783421367e-05;-0.00040868661017157;-2.3248308025359e-06;-4.5146403863328e-05;-0.000101689955045;-0.00011596587864915;-1.216613145516e-05;0.00019890342082363;-1.1861349776154e-05;5.9094640164403e-05;8.313954458572e-05;1.6456615412608e-05;-3.4736516681733e-05;-0.00010308375931345;-0.00013655582733918;4.8190100642387e-05;9.428859630134e-05;1.9992005036329e-05;-0.00016445506480522;2.3727987354505e-05;6.5492095018271e-05;6.4726482378319e-05;4.4207867176738e-05;5.5017625300025e-07;5.1117913244525e-06;3.4440930903656e-05;6.2442632042803e-05;0.00019357977726031;0.00028430885868147;4.281083602109e-05;0.00030063165468164;-1.9511115169735e-05;-0.0001762376195984;2.2153766622068e-05;4.4525672819873e-06;6.832509097876e-05;0.00021300694788806;3.5366902011447e-05;0.00012387633614708;-4.0371229260927e-05;0.0001840878976509;0.00024848693283275;-4.1922325181076e-05;-8.4358551248442e-05;-0.00024156626022886;-0.00035333877895027;-0.00012534750567283;-0.00017713209672365;-9.0930152509827e-05;-0.00029861909570172;-3.040252977371e-06;-5.1871443247364e-06;-3.0269133276306e-05;-0.00013580177619588;-1.5933701433823e-05;2.1595506041194e-06;4.4306671043159e-05;7.9639321484137e-05;8.4269915532786e-05;3.7491663533729e-05;-0.00022002750483807;-0.00057777157053351;0.00047849011025392;-0.00092529208632186;9.775985381566e-05;-0.00013899919576943;3.9196871512104e-05;-0.00017327275418211;-0.00025825278135017;0.0013332697562873;-5.0733033276629e-05;8.9479879534338e-05;0.0006447916966863;9.8008647910319e-05;-0.00011061607801821;-0.00034818894346245;-0.0001146657159552;-0.00021584297064692;5.347694241209e-05;0.0002499827533029;6.0851976741105e-05;-5.2989762480138e-05;0.00022172233730089;4.8810987209436e-05;-0.00046112280688249;1.8406510207569e-05;-2.0197223420837e-05;6.7811852204613e-05;1.9713177607628e-05;0.00011350891145412;-0.0003972644044552;-0.00010942389053525;-0.00029223843012005;9.7121548606083e-05;0.00014384351379704;2.9972428819747e-05;0.00025187581195496;-1.7022276779244e-06;0.00010783828474814;-7.8730554378126e-05;-0.0015052352100611;-0.00020220612350386;-0.00026745136710815;0.00028037471929565;0.00013748227502219;0.00036308012204245;-0.00020959839457646;0.00022984978568275;-0.00014351466961671;-0.00028681612457149;0.00010843737254618;0.0011348649859428;-1.7177504787469e-06;-0.00038598405080847;1.6530399079784e-05;0.00078136869706213;1.4866247511236e-05;1.2765931387548e-05;7.4780298746191e-05;6.4287763962056e-05;-0.00036824180278927;-0.00029506321880035;-7.046916289255e-05;0.0011334749870002;0.00019517986220308;-0.00022290137712844;-0.00010882173955906;-0.00015444347809535;-7.5269548688084e-05;-0.00010368060611654;-0.00010022427159129;-0.00043441817979328;-0.00013235963706393;0.00013233860954642;-0.00058238417841494;-7.4701361882035e-05;0.00021629339607898;0.0006164139485918;-0.00065519456984475;0.00019658339442685;1.0146455679205e-05;0.00010325245239073;0.00050759426085278;3.5052566090599e-05;0.00025822408497334;6.1134756833781e-05;-0.00025421590544283;-1.0667713468138e-05;-1.945387282376e-07;7.8716846473981e-05;0.00016288539336529;0.00012444004823919;-0.000130916305352;-0.00025613530306146;-0.00082510756328702;0.0005037592491135;-0.00094346364494413;0.00010234586079605;-0.00010725277388701;4.501584044192e-05;-1.285950656893e-05;-0.00027470075292513;0.0013303783489391;-0.0001538768701721;2.4496883270331e-05;0.00079147546784952;0.00014476665819529;1.0494326488697e-05;-0.00043790345080197;-9.9342560133664e-06;-0.00027000237605534;-0.00012049926590407;0.00028049171669409;0.00029636721592396;-4.8306876124116e-05;0.00015590486873407;4.6743927669013e-05;-0.00049646140541881;2.2472639102489e-05;-1.5089706721483e-05;7.7488861279562e-05;5.596169285127e-05;9.6927215054166e-05;-0.00036486922181211;-7.5561729317997e-05;-0.00026806991081685;-1.9459312170511e-05;0.00037028742372058;8.6046775322757e-06;0.00025467146770097;-1.7424405086786e-05;0.00032037624623626;-1.6430474715889e-05;-0.001915130415;-0.00023429746215697;-0.0002481686824467;0.00024127229698934;0.00013635701907333;0.00036698262556456;-0.00018546712817624;0.00018163172353525;-0.00011174735118402;-0.00039515894604847;6.8235473008826e-05;0.0012370196636766;1.6215533833019e-05;-0.00045646238140762;3.6653186725744e-06;0.00086516718147323;1.5699264622526e-05;1.8720627849689e-05;7.0244175731204e-05;4.882164648734e-05;-0.00037163821980357;-0.00054269528482109;-5.6627381127328e-05;0.00093813356943429;0.00017475163622294;-0.00013062340440229;-0.00011236601130804;-0.00021702330559492;-8.1829603004735e-05;-0.00028966931859031;-9.7156909760088e-05;-0.00052237039199099;-0.00015283048560377;3.4399723517708e-05;-0.00061564997304231;-4.3654639739543e-05;0.00030312692979351;0.00063639524159953;-0.00048341639922;0.00020329580001999;0.00011919312237296;9.4761089712847e-05;0.00093417894095182;3.6140820157016e-05;0.000374180090148;6.9601970608346e-05;-0.00035409329575486;1.5777567341502e-06;-8.631827768113e-06;7.9610239481553e-05;0.00020886115089525;0.0001052117877407;-9.4201372121461e-05;-0.00022710236953571;-0.00070775934727862;0.00040433157118969;-0.00074282760033384;7.5804775406141e-05;2.0106651845708e-06;3.7178760976531e-05;0.00022824137704447;-0.00021973908587825;0.00096789258532226;-0.00020058338122908;-2.3713419068372e-05;0.00069646630436182;0.00016051037528086;6.8595167249441e-05;-0.00037488967063837;-4.8324991439586e-06;-0.00023709205561318;-0.00034250668250024;0.00023955815413501;0.00027127243811265;-2.961225254694e-05;-1.2357562809484e-05;3.1137078622123e-05;-0.00035241100704297;2.1032654331066e-05;-6.9482439357671e-06;8.3806589827873e-05;0.00010502637451282;2.9890155929024e-05;-0.00027157025760971;-2.5361565349158e-05;-7.6925905887038e-05;-0.00011682244803524;0.00047067177365534;-2.5963099687942e-05;0.00016668376338203;-3.1510422559222e-05;0.0004694850940723;4.4003085349686e-05;-0.0017958600074053;-0.00022621716198046;-0.0001328998041572;9.5476141723339e-05;7.8551478509326e-05;0.00029754635761492;-7.1398884756491e-05;3.3661639463389e-05;-3.7471625546459e-05;-0.00041313993278891;1.6009544197004e-05;0.00098681473173201;3.2978619856294e-05;-0.00037515064468607;-7.7436116043827e-06;0.00068334559909999;1.0732723239926e-05;2.4346927602892e-05;3.7993297155481e-05;5.8994661230827e-05;-0.00027022705762647;-0.00059516937471926;-3.6126697523287e-05;0.0003959238238167;0.00011617735435721;-1.5023553714855e-05;-7.8241966548376e-05;-0.00025917502352968;-8.0064855865203e-05;-0.00029205667669885;-8.0243844422512e-05;-0.000294667086564;-0.0001490489958087;-0.00010784323239932;-0.00044247112236917;4.0351849747822e-05;0.00028243081760593;0.00044808705570176;-0.00010634250793373;0.00014864500553813;0.0001581669494044;8.1239028077107e-05;0.00096829643007368;2.9654835088877e-05;0.00042585009941831;6.9334251747932e-05;-0.00048952305223793;-7.9744022514205e-06;-1.4483347513305e-05;-0.0004121575911995;-7.7222633990459e-05;7.9206874943338e-05;3.6266708320909e-06;0.00045062441495247;0.00016192290058825;0.00025873101549223;-0.00016808873624541;-0.00016595578927081;-1.8858171415559e-06;-0.0011864374391735;1.9292097931611e-05;-0.00021577339794021;8.8922810391523e-05;0.00036523042945191;0.00019866830552928;-0.00041527298162691;-0.00028417928842828;-0.00022791458468419;-7.1246678999159e-05;0.0001603909622645;0.0010982408421114;9.8030192020815e-05;-0.00016756924742367;-0.00015391557826661;0.00037436123238876;-2.7841024348163e-05;0.00024894345551729;-8.2737878983608e-06;5.1343951781746e-05;-3.886494141625e-06;4.5826571295038e-05;4.3412550439825e-05;0.00015707335842308;-0.00012771968613379;0.00044403458014131;3.1316667445935e-05;0.00051897449884564;-0.00021915989054833;-0.0001198113677674;-6.1007733165752e-05;0.00085130229126662;-8.2457489043009e-05;-0.0013546146219596;0.00010549878788879;-6.8262743297964e-05;0.00013980398944113;-0.00020454781770241;-3.4684919683059e-06;-5.0233906222275e-05;-0.00038140034303069;0.00020511048205663;-0.00020670673984569;0.00011479952081572;0.00010766366904136;-3.1393887184095e-05;-0.00018466278561391;5.3988267609384e-05;0.00022594240726903;3.2423645279778e-06;8.7733271357138e-05;-2.2493153664982e-05;-4.5882105041528e-05;2.2641261239187e-05;-0.0011020444799215;3.885568730766e-05;-0.00077388610225171;-2.1212870706222e-05;0.00024727976415306;-2.9036333216936e-05;-0.00045984736061655;1.254034214071e-05;-0.00064610567642376;-5.263212005957e-05;-9.7345931862947e-05;-1.6166812201845e-05;-0.00014584310702048;-0.00030668082763441;3.7881127354922e-05;0.0004026367678307;9.9803517514374e-05;0.00059088284615427;-2.7459798729979e-05;0.00059456337476149;-2.579061765573e-05;0.001597409020178;2.8395106710377e-05;0.00056219601538032;8.2400001701899e-06;-0.00061456620460376;5.5935452110134e-05;-1.5236239050864e-05;-1.1468720003904e-05;-0.00047113239997998;-9.4899165560491e-05;0.00014590662613045;-2.0786923414562e-05;0.0006261506350711;0.00022151083976496;0.00046024596667849;-0.00027757225325331;-0.00013795553240925;-1.8703527530306e-05;-0.0013291358482093;1.1436107342888e-05;-0.00047488321433775;0.00014377300976776;0.00041923858225346;0.00020519823010545;-0.00059575599152595;-0.00031700253020972;-0.00026930499006994;-8.2650542026386e-05;0.00026352604618296;0.0011992162326351;0.00014829922292847;-0.0002284595684614;-0.0002134149253834;0.00038199743721634;-2.2585811166209e-05;0.00036765931872651;-1.3210111319495e-05;5.610853258986e-05;-2.276362010889e-06;2.8388212740538e-05;6.5050640841946e-05;8.348924893653e-05;-0.00011816411279142;0.00046319226385094;1.6403133486165e-05;0.00062451185658574;-0.00024078736896627;-9.8178978078067e-05;-6.8737666879315e-05;0.0009665991528891;-9.6422008937225e-05;-0.0018303201068193;0.00011472377809696;-0.00010178725642618;0.00014622935850639;-0.00017169551574625;6.8569061113521e-05;-6.0208574723219e-05;-0.00043136876774952;0.00018865296442527;-0.00023220985895023;0.00011276876466582;0.00034864243934862;-2.3706730644335e-05;-0.00027307399432175;6.4349827880505e-05;0.00039707456016913;4.1834982766886e-06;0.00010735671094153;-2.5106313842116e-05;-3.7189594877418e-05;3.6003006243845e-05;-0.0012856660177931;-8.5839856183156e-06;-0.00075454224133864;-4.4348431401886e-05;0.00025580669171177;-1.6832723304105e-06;-0.00056655303342268;2.3961490569491e-06;-0.00077101221540943;-7.0911992224865e-05;-0.00016618128574919;-3.3829652238637e-05;-0.0001898340851767;-0.00033799756783992;-2.9878912755521e-05;0.00048030886682682;0.00011182724847458;0.00057812128216028;6.3922176195774e-05;0.00068293325603008;-7.9620731412433e-06;0.0019438617164269;5.088368197903e-05;0.00069888855796307;1.4322377865028e-05;-0.00076905591413379;7.3704810347408e-05;-1.7333095456706e-05;-4.5163560571382e-06;-0.0003512044204399;-7.0714202593081e-05;0.00011955320951529;-1.9194432752556e-05;0.00051891041221097;0.00018785023712553;0.00046055542770773;-0.00026700962916948;-4.991931564291e-05;-2.4350892999792e-05;-0.00098240026272833;3.6298408758739e-06;-0.00053497799672186;0.00013775506522506;0.00030523361056112;0.00013373878027778;-0.00050688465125859;-0.00020834550377913;-0.0002092885406455;-5.1809802243952e-05;0.00023357034660876;0.00084378267638385;0.00012766533473041;-0.00015443994197994;-0.00018620867922436;0.00023737778246868;-1.0247756108583e-05;0.00035356945591047;-1.4346598618431e-05;3.9560258301208e-05;-3.2723960430303e-07;-1.1811301192211e-05;5.6804023188306e-05;-1.9715256712516e-05;-6.502858013846e-05;0.00030408188467845;-7.3969204095192e-06;0.00045669442624785;-0.00015308847650886;-4.5830976887373e-05;-4.7151774197118e-05;0.00068309070775285;-7.2081857069861e-05;-0.0015199665213004;7.0701506047044e-05;-8.6270498286467e-05;8.9647204731591e-05;-7.5767209636979e-05;0.00010601430403767;-4.3344691221137e-05;-0.00029988121241331;0.00010058985208161;-0.0001337364083156;6.6160762798972e-05;0.00040815808461048;-1.5397799870698e-06;-0.00024139975721482;4.746003105538e-05;0.00038959088851698;5.7845877563523e-06;8.7671869550832e-05;-1.9212227925891e-05;-3.2548097806284e-05;3.7017718568677e-05;-0.00096986495191231;-4.3409214413259e-05;-0.00042995667899959;-4.7997833462432e-05;0.00016355632396881;2.2027135855751e-05;-0.00044378716847859;-7.4578197200026e-06;-0.00060145644238219;-5.8629939303501e-05;-0.00018544719205238;-3.4090651752194e-05;-0.00015345079009421;-0.00022878659365233;-7.8919503721409e-05;0.00037602605880238;7.000634650467e-05;0.0003312818298582;0.00012093169789296;0.00052688212599605;9.3517501227325e-06;0.001516415621154;4.8465317377122e-05;0.00053990300511941;1.4538676623488e-05;-0.00058874353999272;5.9683068684535e-05;2.6643687306205e-05;-2.0675139239756e-05;-1.8356609871262e-05;2.9731754693785e-05;-7.7123033406679e-05;0.00010678168473532;0.00010846798977582;6.5069034462795e-05;-0.00044259999413043;0.00040928876842372;-1.429504754924e-05;1.3050736924924e-05;4.3055515561718e-05;2.1083476895001e-05;0.00021988540538587;-0.0001784676569514;-1.0564193871687e-05;-1.7693528207019e-05;-0.00010491355351405;0.0001661297865212;-0.00015608299872838;-7.4718584073707e-05;9.792636410566e-05;-9.8256323326495e-06;-1.8114284102921e-05;-0.00011046828149119;-2.4257964469143e-05;1.1485040886328e-05;-3.1090828997549e-05;-0.00010044951341115;9.109757229453e-05;1.1141095455969e-05;1.1361970791768e-05;-4.0846345655154e-05;-1.9057304598391e-05;-5.4156735131983e-06;4.9692094762577e-05;0.00012051460362272;0.00015756805078126;-7.6854470535181e-05;-0.00032914037001319;-3.4309152397327e-05;-6.1421094869729e-05;-0.00014027120778337;-0.00014495918003377;9.4715098384768e-05;0.00024345803831238;-3.3011408959283e-05;-2.5857196305878e-05;-0.00017276177823078;6.4701984229032e-05;-1.2720724043902e-05;2.5041410481208e-05;9.2324662546162e-05;0.00013451716222335;0.00013971328735352;-8.3251208707225e-05;-0.0001853932189988;4.4811637053499e-05;7.6060794526711e-05;6.3546882302035e-05;3.6101551813772e-05;7.6155083661433e-07;7.8819739428582e-06;4.9820813728729e-05;4.7698555135867e-05;0.00027179677272215;0.00020714961283375;2.7714384486899e-05;0.00016092939767987;-8.7749394879211e-05;-0.00021273456513882;2.5701452614157e-05;-7.3405095690759e-07;9.5893126854207e-05;0.00014648513752036;8.1509992014617e-05;0.00013513205340132;-3.7171612348175e-05;0.00022975300089456;0.00050913484301418;-7.9274759627879e-05;-8.4504921687767e-05;-0.00035892840242013;-0.00031034060521051;-0.00017555653175805;-0.00012539491581265;-0.00013553009193856;-0.00023969731410034;-2.051566980299e-06;-3.0195521958376e-06;-5.3999792726245e-05;-9.0674577222671e-05;7.3533969953132e-06;9.8733686115793e-08;0.00012092904944438;0.00028243527049199;0.00010355589620303;-0.00042776434565894;-0.00018495738913771;-0.00087035814067349;0.00026047124993056;-0.0004552879545372;4.0928214730229e-05;-1.057054603848e-07;2.9067208743072e-05;0.00043849874055013;-0.00014283902419265;0.00057070335606113;-0.00030746861011721;-7.9929806815926e-05;0.00064902426674962;0.00015279588114936;0.00025933611323126;-0.00034560461062938;0.00013311443035491;-0.00021436232782435;-0.00048219718155451;0.00018350906611886;0.00068747025215998;-4.3612667468551e-06;-8.2259670307394e-05;1.0835853572644e-05;-0.00033263096702285;7.9076971815084e-06;1.999956475629e-05;2.5669040041976e-05;6.8599809310399e-05;-6.7742213616384e-08;7.7370874350891e-05;-8.2290625869064e-06;-7.6326337875798e-05;-0.00016143529501278;0.00051632174290717;-9.8742511909222e-06;5.5553551646881e-05;-6.1100050515961e-05;0.00061205460224301;6.1067250499036e-05;-0.0015873294323683;-0.00012801667617168;-7.3810937465169e-05;9.9701515864581e-05;0.00010775034752442;5.7026922149817e-05;-7.7001037425362e-05;-4.0009323129198e-05;-4.3704955032808e-07;-0.00031770282657817;1.5577621525154e-05;0.00058099924353883;3.3651846024441e-05;-0.00030731243896298;1.7818996411734e-06;0.00050761888269335;9.663992386777e-06;2.3879971195129e-05;8.850845915731e-06;-4.8269979743054e-05;-0.0002083520666929;-0.00067170133115724;-6.4598689277773e-06;0.00017989738262258;4.9169149860973e-05;0.00010906826355495;-6.3670086092316e-05;-0.00019762945885304;-5.8528694353299e-05;-0.00057322444627061;-3.9664919313509e-05;-0.00053752248641104;-7.9696153989062e-05;-0.00014426489360631;-0.0003894527326338;3.2741725590313e-05;0.0002767636324279;0.00039012587512843;-2.0973027858417e-05;0.00012994599819649;0.00028414305415936;2.9819859264535e-05;0.0013758963905275;2.084420339088e-05;0.00038013618905097;5.2345279982546e-05;-0.00031388163915835;2.4599699827377e-05;-1.0683223081287e-05;0.00013241295528132;0.00042015555663966;5.6443743233103e-05;-0.00030432688072324;-0.00020302149641793;-0.00080641073873267;0.0002408202708466;-0.0004033932054881;1.740139850881e-05;0.00012216522009112;1.4633782484452e-05;0.00088720652274787;-0.00013271781790536;0.0004047206020914;-0.00041675008833408;-0.00013630359899253;0.00064838124671951;0.00022927380632609;0.00030247450922616;-0.00030333880567923;8.4758787124883e-05;-0.00020139748812653;-0.00089818361448124;0.000201087561436;0.00058798596728593;1.6379093722207e-05;-0.00028949626721442;5.3454659791896e-06;-0.00029022293165326;6.3938714447431e-06;3.4415959817125e-05;4.2533418309176e-05;0.00013593702169601;-8.9350141934119e-05;0.00015296110359486;2.0828549168073e-05;0.00017239659791812;-0.00024177521117963;0.00065339897992089;-4.5390810555546e-05;-4.186336445855e-05;-9.184602095047e-05;0.0008890843600966;0.0001040125862346;-0.0017553076613694;-0.00015435444947798;2.3772372514941e-05;-4.9497110012453e-05;7.3588620580267e-05;1.68944188772e-05;4.9449183279648e-05;-0.00020880579540972;7.5229319918435e-05;-0.00038367244997062;-5.4802039812785e-06;0.00041867909021676;5.4526215535589e-05;-0.00026695177075453;8.0604223740011e-07;0.00040938734309748;2.9370669381024e-06;4.2930598283419e-05;-1.2140366379754e-05;-4.5971373765497e-05;-0.00014860476949252;-0.00087506510317326;1.9036868934563e-06;-0.00030369212618098;8.592441190558e-06;0.00022914393048268;-4.3687734432751e-05;-0.00030401480034925;-8.0156423791777e-05;-0.00064172461861745;-3.6073925002711e-05;-0.00036346993874758;-0.0001034002925735;-0.00029584314324893;-0.0002833686885424;0.00011081685806857;0.00032911883317865;0.00027564342599362;0.00032928597647697;0.00010328332427889;0.00039095140527934;3.4867454814957e-05;0.001630530692637;2.3514059648733e-05;0.0005192332318984;6.8228662712499e-05;-0.00056376837892458;2.7758116630139e-05;-1.0241082236462e-05;9.8246782727074e-05;0.00037039420567453;-2.1699406715925e-06;-0.00020036479691043;-0.00012290978338569;-0.0004996745265089;9.5270472229458e-05;-0.00013205764116719;-1.5352296031779e-05;0.00014501958503388;-6.4983100855898e-06;0.00089143577497452;-5.5112246627687e-05;4.7843630454736e-05;-0.0003578930918593;-0.00014432726311497;0.00037337190588005;0.00019317313854117;0.00026657097623684;-0.00014392576122191;7.3135386628564e-05;-0.00010392278636573;-0.0008545647142455;0.00012102868640795;0.00039924058364704;3.13896634907e-05;-0.00031803420279175;-3.2711116091377e-06;-0.00016355939442292;-1.0171421536143e-06;3.8428726838902e-05;1.7209134966834e-05;0.00011070207256125;-0.00012377400707919;0.00024504869361408;3.1938929168973e-05;0.00027243376825936;-0.00020133162615821;0.00048462199629284;-4.4343945774017e-05;-0.00011219549924135;-8.4321523900144e-05;0.00075748632661998;8.980054553831e-05;-0.0011123440926895;-7.9774661571719e-05;8.7711909145582e-05;-0.0001262822188437;3.5197354009142e-05;-8.4361046901904e-05;0.00011426726268837;-0.00025529091362841;0.00010474459850229;-0.00025055330479518;-1.1561741303012e-05;2.9197572075645e-05;4.5825090637663e-05;-0.0001278342679143;4.0747281673248e-06;0.00014629725774284;-4.0874297155824e-06;3.9067876059562e-05;-2.0933970517945e-05;-6.5586442360654e-05;-2.6654337489163e-05;-0.00072119652759284;1.6543137462577e-05;-0.00053942122031003;-4.350021481514e-05;0.00025359005667269;-1.0729998393799e-05;-0.00023653423704673;-5.3375926654553e-05;-0.00053621380357072;-4.0295408325619e-06;-0.00020963544375263;-5.8894616813632e-05;-0.00027103081811219;-8.9547640527599e-05;9.6329255029559e-05;0.00025045918300748;7.4688665335998e-05;0.00043522586929612;3.7595465983031e-05;0.00036306897527538;4.367058409116e-06;0.0013017709134147;1.3523336747312e-05;0.00039043842116371;4.4258351408644e-05;-0.00042955434764735;-3.5589160688687e-05;-1.3394377674558e-05;-0.00051824253750965;-8.8325272372458e-05;0.00013345951447263;6.5872540290002e-05;0.00040755051304586;0.00012965858331881;2.624498665682e-05;-4.8876016080612e-05;-0.00015667274419684;2.2697828171658e-05;-0.0016995634650812;4.5601474994328e-05;0.00011758555774577;3.2443022064399e-05;0.00044855350279249;0.00025170197477564;-0.00029860500944778;-0.00036474716034718;-0.00025939967599697;-9.6794290584512e-05;5.0793874834199e-05;0.0014057738007978;5.3030267736176e-05;-0.00021517502318602;-0.00012555977446027;0.00051152461674064;-5.0911949074361e-05;0.00027308380231261;-3.7194349715719e-06;0.00010133519390365;-2.655291245901e-05;-7.9221768828575e-05;-1.1203100257262e-05;0.0004307889030315;-0.00017719887546264;0.00062498368788511;3.2637384720147e-05;0.00042751655564643;-0.00017686185310595;-0.00037917788722552;-4.0071328839986e-05;0.00094536086544394;-0.00010852899868041;-0.00096233788644895;7.3255585448351e-05;8.1006459367927e-05;0.00023545135627501;-0.0002770068240352;-0.00026915257330984;-5.6162876717281e-05;-0.00046708306763321;0.00024155587016139;0.00019485072698444;0.00014995405217633;-0.00052362604765221;-1.296784034821e-06;-1.0175231182075e-05;4.5572891394841e-05;-4.6144541556714e-05;2.7533027605386e-05;0.00011529174662428;-3.3102078305092e-05;-0.00019527399854269;-1.789919588191e-05;-0.0010638007661328;8.9558488980401e-05;-0.00098731997422874;-2.2378693756764e-05;0.00033159868326038;-8.2727885455824e-05;-0.00044943083776161;3.2472744351253e-05;-0.00087114184862003;-6.2618506490253e-05;-0.00019141493248753;1.3563184438681e-05;-4.9931826652028e-05;-0.00028429020312615;0.00016075441089924;0.00032494746847078;9.154510917142e-05;0.00058024498866871;-0.00011029706365662;0.00081273796968162;-3.1528343242826e-05;0.001841280492954;1.3132947970007e-05;0.00050381309119985;7.801597348589e-06;-0.00051782198715955;5.2235194743844e-05;-4.8592199163977e-05;-1.1244337656535e-05;-0.00058104487834498;-0.0001023707081913;0.00019552053709049;6.179394404171e-05;0.00051839923253283;0.00016343814786524;0.00010124498658115;-8.9254390331917e-05;-0.00014362335787155;1.6715319361538e-05;-0.0019750690553337;4.4279200665187e-05;5.2923816838302e-05;5.1728613470914e-05;0.00050328962970525;0.00026359388721175;-0.00040474120760337;-0.00040689256275073;-0.00029402700602077;-9.9334945844021e-05;9.9631513876375e-05;0.0015692802844569;7.8454737376887e-05;-0.00027820767718367;-0.00015697599155828;0.0005813593743369;-5.3236006351653e-05;0.00034537262399681;-2.4114779080264e-06;0.00011642165918602;-2.9755103241769e-05;-0.00012447085464373;-4.0864979382604e-06;0.00044071351294406;-0.00018681936489884;0.00070754124317318;2.9626933610416e-05;0.00050599424866959;-0.00020021361706313;-0.00043844390893355;-4.6201290388126e-05;0.0010753291426226;-0.00012751189933624;-0.0012312764301896;8.2764643593691e-05;9.0465735411271e-05;0.00027763860998675;-0.00028603750979528;-0.00027852217317559;-7.5068659498356e-05;-0.0005436590872705;0.00024902605218813;0.00029308316879906;0.00016437293379568;-0.00052417430561036;3.2681825814507e-06;-2.2555179384653e-05;5.4407042625826e-05;-4.2577817112033e-06;3.2400592317572e-05;0.00014211208326742;-3.858722266159e-05;-0.00022344093304127;-2.645004860824e-05;-0.00116138800513;6.7357665102463e-05;-0.001084289746359;-4.3412015656941e-05;0.00036494314554147;-7.4761745054275e-05;-0.00054447876755148;3.4313579817535e-05;-0.0010143993422389;-8.261499897344e-05;-0.0002220277528977;4.2143683458562e-06;-6.0699465393554e-05;-0.00032890634611249;0.00015888948109932;0.00034716399386525;0.00012353902275208;0.0006007194169797;-7.3525909101591e-05;0.00093903474044055;-2.2587340936298e-05;0.0021516482811421;3.2237931009149e-05;0.00060292048146948;1.1791568795161e-05;-0.00064751849276945;6.8202411057428e-05;-3.7762027204735e-05;-7.1313834268949e-06;-0.00042030893382616;-6.2081184296403e-05;3.2216466934187e-05;6.4927495259326e-05;0.00032811678829603;0.00013471973943524;0.00015655657625757;-0.00010515288158786;-8.3254228229634e-05;6.9377092586365e-06;-0.0015207927208394;3.0350469387486e-05;-7.4828349170275e-05;5.7319521147292e-05;0.00033856855588965;0.00016095019236673;-0.00030963961035013;-0.00021862062567379;-0.00022381034796126;-3.4252423120051e-06;6.5987929701805e-05;0.0011486458824947;5.5776927183615e-05;-6.4743064285722e-05;-0.00013373896945268;0.00042682027560659;-3.4460819733795e-05;0.00029552265186794;-3.6667320273409e-06;7.810255192453e-05;-1.8115826605936e-05;-0.00011826058471343;1.1948297469644e-05;0.00019568881543819;-0.00011983932199655;0.00050242559518665;1.6224137652898e-05;0.00036431616172194;-0.00013325033069123;-0.00031299918191507;-3.6538578569889e-05;0.0007395003340207;-9.0772991825361e-05;-0.00097777938935906;5.4595911933575e-05;4.9461923481431e-05;0.00018922913295683;-0.00019379143486731;-0.0001308151113335;-6.6222717578057e-05;-0.00036449107574299;0.00016195210628211;0.00028750250930898;0.0001095297629945;-0.00028233201010153;5.5114564929681e-06;-1.2639263331948e-05;4.0658978832653e-05;2.7234247681918e-05;2.3965927539393e-05;0.00012126965157222;-3.1255716749001e-05;-0.00017082039266825;-1.9937757315347e-05;-0.00081375963054597;2.0624980606954e-05;-0.00074006436625496;-4.8306032113032e-05;0.00023828058328945;-2.9065058697597e-05;-0.00043926172656938;2.4120143280015e-05;-0.0007052841829136;-7.0170674007386e-05;-0.00011632071982604;-1.1859732694575e-05;-5.8933735999744e-05;-0.00026204920141026;8.8612592662685e-05;0.00025692218332551;0.00011165933392476;0.00041225508903153;-9.0483435997157e-06;0.000713667483069;-9.7151068985113e-06;0.0015210300916806;4.2295792809455e-05;0.00045049164327793;1.1691256077029e-05;-0.00053560745436698;5.8538986195344e-05;1.7532724086777e-05;-6.0363213378878e-06;5.651011451846e-05;0.00025052137789316;-3.476933852653e-05;-1.7060832760762e-05;-8.1000915088225e-05;-0.00022959220223129;6.7176857555751e-05;-0.00011317726603011;-1.1917713891307e-05;7.5971598562319e-05;-1.5237243360389e-06;0.00064687983831391;-3.5896744520869e-05;5.0604954594746e-05;-0.00020912999752909;-3.8175807276275e-05;0.00022144182003103;0.00012013458763249;9.5465205959044e-05;-5.7610392104834e-05;-6.4993553678505e-05;-5.290250555845e-05;-0.00057703023776412;8.0673475167714e-05;0.00016280385898426;1.788455665519e-05;-0.000206826676731;-4.849763627135e-06;-0.00012110696843592;-4.110803729418e-06;2.6258401703672e-05;1.0287605618942e-05;4.8438392695971e-05;-5.7961035054177e-05;0.0001455524325138;7.9779601946939e-06;0.0001238484546775;-9.4089009508025e-05;0.00025619767257012;-1.4831304724794e-05;-0.00011656997230602;-5.5465137847932e-05;0.00043019978329539;3.5045115510002e-05;-0.00061172095593065;-3.9800248487154e-05;5.0273170927539e-05;-3.514020863804e-05;2.8485066650319e-05;-6.445478356909e-05;2.7379057428334e-05;-0.00012874836102128;4.6705117711099e-05;-6.4768537413329e-05;1.1789539712481e-05;-1.4443568943534e-05;2.2887523300597e-05;-1.3686125384993e-05;1.1844496839331e-05;3.2620242564008e-05;5.0116273087042e-07;2.8491993361968e-05;-3.6197601730237e-05;-5.359166971175e-05;-6.0653692344204e-05;-0.00030231862911023;-3.1055490126164e-06;-0.00024775433121249;-4.4774096750189e-06;0.00012582838826347;-9.5960585895227e-06;-0.00011891000758624;-4.7494322643615e-05;-0.00026473510661162;-1.6054873412941e-05;-0.00010301500878995;-2.2655989596387e-05;-0.00018552428809926;-8.8823595433496e-05;9.4480405095965e-05;0.00010716020187829;0.0001017940667225;0.0002025567664532;4.6553730498999e-05;0.00017679852317087;2.2298356270767e-05;0.00070077681448311;1.2144610082032e-05;0.00019874138524756;3.596264650696e-05;-0.00028918092721142;2.1049188944744e-05;1.8863183868234e-06;0.00011470353638288;0.00038198419497348;7.2572788667458e-06;-0.00030238760518841;-0.00013660918921232;-0.000617652956862;0.00010875544830924;-0.00016771943774074;-7.9062401709962e-06;8.2379039668012e-05;1.6614679907434e-06;0.00093205639859661;-6.0550093621714e-05;9.8959819297306e-05;-0.00036656565498561;-9.7723583166953e-05;0.00045160125591792;0.00017958553507924;0.00027055424288847;-0.00018238741904497;4.8451343900524e-05;-0.00012532029359136;-0.00082691159332171;0.00013135516201146;0.0005588544299826;2.7837408197229e-05;-0.00028915712027811;-6.9001966949145e-06;-0.00023114071518648;-9.0912735686288e-06;5.08859702677e-05;3.2088462376123e-06;4.9316189688398e-05;-8.3882114267908e-05;0.00030822338885628;1.1571694813028e-05;0.00017111250781454;-0.00017578758706804;0.00046931873657741;-1.7235601262655e-05;-0.00015423930017278;-9.2891081294511e-05;0.00073584000347182;6.8441353505477e-05;-0.0011435233755037;-4.515142791206e-05;7.7448683441617e-05;-2.455867252138e-05;5.7930068578571e-05;-0.00013480607594829;2.4576651412644e-05;-0.00022592587629333;7.2515023930464e-05;-0.0001220650592586;1.5795792933204e-05;8.3042823462165e-06;3.8275091355899e-05;-0.00010662477870937;1.5401998098241e-05;0.00015761591203045;2.3069750909599e-07;4.0677085053176e-05;-4.7031240683282e-05;-0.00010855076834559;-9.8354736110196e-05;-0.00057541637215763;4.5311994654185e-06;-0.0003500773163978;-1.9963190425187e-05;0.00022861518664286;-2.1263133021421e-05;-0.00019637626246549;-6.3744126236998e-05;-0.00061199313495308;-1.3372405192058e-05;-0.00034935458097607;-1.9234887076891e-05;-0.00024599273456261;-0.00017248711083084;0.00010599547385937;0.00018433370860294;0.00018963673210237;0.00025054402067326;8.0168341810349e-05;0.00035457607009448;1.5427982361871e-05;0.0013925544917583;1.5522453395533e-05;0.00035741933970712;5.0356702558929e-05;-0.00037737746606581;3.6588502553059e-05;3.709196789714e-06;0.00013942280202173;0.00057029403978959;-5.6082859373419e-05;-0.00027719134232029;-0.00016164136468433;-0.00064244878012687;8.5127612692304e-05;-9.5131334092002e-05;-3.6755944165634e-05;0.00016808387590572;-2.5169603759423e-05;0.0015369922621176;-5.2679628424812e-05;-6.4527746872045e-05;-0.00052672007586807;-0.00017737063171808;0.00046844372991472;0.00027948050410487;0.00036376877687871;-0.00013916181342211;4.8652593250154e-05;-0.00011004476982635;-0.0013190212193877;0.00016347663768101;0.00054634705884382;5.6873894209275e-05;-0.00050382863264531;-8.239856470027e-06;-0.00027124589541927;-2.0161649445072e-05;8.4215869719628e-05;-2.2694914605381e-06;5.8922552852891e-05;-0.00017321768973488;0.00044878615881316;3.1495867006015e-05;0.00042258037137799;-0.0002394363109488;0.00059948820853606;-3.4868531656684e-05;-0.00030233321012929;-0.00013514599413611;0.001045381766744;9.5688359579071e-05;-0.0013248909963295;-2.6060204618261e-05;0.00017149304039776;-0.00015750445891172;3.9638885937165e-05;-0.000234941355302;0.00013263382425066;-0.00038647634210065;0.00014557456597686;-7.5544638093561e-05;1.4338437722472e-05;-0.00025124615058303;5.4102492867969e-05;-5.9476242313394e-05;2.4921559088398e-05;5.4311287385644e-05;-1.1676979738695e-05;7.0480076828972e-05;-6.9567002356052e-05;-0.00017517340893392;-4.1054008761421e-05;-0.00083855172852054;1.2162583516329e-05;-0.00079862884012982;-7.1538859629072e-05;0.00037457037251443;-2.8298061351961e-06;-0.00030489449272864;-8.7189619080164e-05;-0.00084358226740733;3.924803593236e-07;-0.00032882229425013;-7.8385346569121e-06;-0.0003554196737241;-8.0880665336736e-05;0.00014462778926827;0.000245196162723;0.00010199746611761;0.00051806360716;6.4975436544046e-05;0.00057210371596739;1.0505304089747e-05;0.0018781254766509;1.8780199752655e-05;0.0004990006564185;6.4553263655398e-05;-0.00055788637837395;3.649350037449e-05;5.4045034403316e-07;0.00010873975406867;0.00050892360741273;-8.3372899098322e-05;-0.00017077213851735;-0.00011845901462948;-0.00044398292084225;3.0358800358954e-05;6.5293538682454e-06;-4.7522935346933e-05;0.00017181906150654;-3.6515077226795e-05;0.0014045484131202;-2.4862771169865e-05;-0.00016614697233308;-0.00046078217565082;-0.0001815033465391;0.00030609511304647;0.0002546010655351;0.0003098949091509;-5.4255273425952e-05;4.6980589104351e-05;-5.6657663662918e-05;-0.0012060173321515;0.00012509903172031;0.00036314068711363;5.8686458942248e-05;-0.00046749343164265;-6.3504485297017e-06;-0.00020775639859494;-1.9544168026187e-05;7.5883006502409e-05;-1.0139633559447e-05;5.3819287131773e-05;-0.00017910262977239;0.00042084217420779;3.4239477827214e-05;0.00044356181751937;-0.00020032069005538;0.00047779129818082;-3.5413639125181e-05;-0.00028591585578397;-0.00011775035090977;0.0009037273703143;8.1402235082351e-05;-0.00097076775273308;-2.7929140742344e-06;0.00017268426017836;-0.00019388174405321;2.1033034499851e-05;-0.00023513661290053;0.00016465221415274;-0.00036576311686076;0.00014816796465311;-4.9297192163067e-05;8.7910884758458e-06;-0.00035701791057363;4.654506847146e-05;-1.6398198567913e-05;2.2573149180971e-05;-3.6471097700996e-05;-1.5260167856468e-05;6.372691859724e-05;-5.4287560487865e-05;-0.00016365706687793;2.4997441869345e-05;-0.00077135022729635;1.9647774024634e-05;-0.00083052314585075;-8.9141649368685e-05;0.00035279954317957;1.0268131518387e-05;-0.0002644871128723;-6.5982472733594e-05;-0.00072391203138977;1.54340541485e-05;-0.00023315807629842;-8.3638099113159e-07;-0.00030794020858593;8.3238082879689e-06;0.0001097193962778;0.00022564199753106;-2.1960408957966e-06;0.00053875049343333;2.5621058739489e-05;0.00052898714784533;-6.4677915361244e-06;0.0015869830967858;1.3336949450604e-05;0.00041475152829662;4.7586963773938e-05;-0.00045737638720311;-7.7580370998476e-05;-2.2208723748918e-06;-0.00053346902132034;-6.8631692556664e-05;8.4873878222425e-05;0.00014508453023154;0.000243756963755;8.7024156528059e-05;-0.00015595291915815;4.4035408791387e-05;-5.564351886278e-05;3.5698689316632e-05;-0.0020655828993767;7.3968461947516e-05;0.00032076044590212;-6.6206084738951e-06;0.00043245125561953;0.00025355242541991;-0.00011387663835194;-0.00031805958133191;-0.00026605708990246;-8.6625688709319e-05;-8.8162400061265e-05;0.0014642314054072;-9.225382200384e-06;-5.2226794650778e-05;-0.00010047945397673;0.00055289512965828;-6.3386760302819e-05;0.00033418301609345;-8.7140178948175e-06;0.00014452675532084;-4.8967423936119e-05;-0.00030000705737621;-5.8264369727112e-05;0.00043657593778335;-0.00017133528308477;0.0007108889403753;3.1246356229531e-05;0.00023765808145981;-8.3379025454633e-05;-0.000612766307313;-7.0075539042591e-06;0.00076546566560864;-0.00010830346582225;-0.00043051975080743;1.8947774151457e-05;0.00024529753136449;0.00028044110513292;-0.00031459625461139;-0.00041498831706122;-8.6196967458818e-05;-0.00040523544885218;0.00022070744307712;0.0008138578850776;0.00014745745284017;-0.0010133583564311;2.576536462584e-05;0.00018144225759897;2.4740900698816e-05;-0.00027759428485297;4.7500394430244e-05;0.00014884404663462;-4.7623936552554e-05;-0.00036364563857205;-5.9977894125041e-05;-0.00081161723937839;0.00011657091818051;-0.0010014927247539;-3.5470126022119e-05;0.00033711281139404;-0.00010832906991709;-0.00041486587724648;5.2422572480282e-05;-0.00099332700483501;-7.1011592808645e-05;-0.00023081334074959;3.411585566937e-05;7.8526041761506e-05;-0.00018244472448714;0.00026650022482499;0.00016093524754979;5.8417081163498e-05;0.00040527249802835;-0.00016334926476702;0.0010114468168467;-2.8477079467848e-05;0.0017595866229385;8.8207707449328e-06;0.00036545222974382;7.2077264121617e-06;-0.00034351088106632;4.4724965846399e-05;-0.00010402879706817;3.8421226236096e-06;-0.00056280719581991;-7.6373544288799e-05;0.00021316279890016;0.00014572407235391;0.00033746421104297;9.9707016488537e-05;-0.0001595968788024;4.7376448492287e-05;-1.0739335266408e-05;3.1780349672772e-05;-0.0024044730234891;7.5162475695834e-05;0.00036438865936361;-9.1537240223261e-06;0.00046658769133501;0.00026451464509591;-0.00017387951083947;-0.0003686030395329;-0.00028613989707083;-0.0001148311785073;-6.2298837292474e-05;0.0015714794863015;2.8954168556083e-06;-0.00014492838818114;-0.00011141204595333;0.00064188294345513;-6.774379289709e-05;0.00039498880505562;-3.947876393795e-06;0.00016700642299838;-5.5389220506186e-05;-0.00040639887447469;-6.1480233853217e-05;0.00047342525795102;-0.00018545468628872;0.00083887035725638;3.037277929252e-05;0.00027769731241278;-9.5204479293898e-05;-0.00071917369496077;-9.9525068435469e-06;0.00086214940529317;-0.00012998495367356;-0.00055893562966958;2.3076920115273e-05;0.00029720549355261;0.00034935006988235;-0.00033792355679907;-0.00046785184531473;-0.00011928982712561;-0.00049867667257786;0.00023224258620758;0.0010764092439786;0.00016850333486218;-0.0011787050170824;3.2577405363554e-05;0.00020700121240225;3.1781237339601e-05;-0.00029861275106668;5.5364758736687e-05;0.00018737002392299;-5.7503886637278e-05;-0.00043593451846391;-8.234559209086e-05;-0.00082113308599219;0.00010884771472774;-0.0011458892840892;-5.9268244513078e-05;0.00038149073952809;-0.0001129533702624;-0.00051499984692782;6.3067403971218e-05;-0.0011967305326834;-9.0474823082332e-05;-0.00026688381331041;3.3074466045946e-05;0.00010007898526965;-0.00020877605129499;0.00031384578323923;0.00012627454998437;9.3294467660598e-05;0.00038936533383094;-0.00015623579383828;0.0012090133968741;-2.5219336748705e-05;0.0020681798923761;2.4392291379627e-05;0.00043465406633914;9.4033230197965e-06;-0.00042522852891125;5.7224209740525e-05;-9.9356737337075e-05;1.1177035958099e-05;-0.00034055032301694;-4.4071119191358e-05;0.00027611260884441;9.911503730109e-05;0.00029149412875995;6.828096229583e-05;-0.00011283959611319;4.1242612496717e-05;6.9980342232157e-05;1.3844636669091e-05;-0.0018646473763511;4.7666500904597e-05;0.00027385039720684;-1.2282972420508e-05;0.00029159244149923;0.00016559030336794;-0.00015185087977443;-0.00025330978678539;-0.00019176193745807;-9.9651217169594e-05;-2.4040346033871e-05;0.0010094456374645;6.505683359137e-06;-0.00016502884682268;-7.5862619269174e-05;0.00048957235412672;-4.4724416511599e-05;0.00032095093047246;3.5565619782574e-06;0.0001271958462894;-4.043065928272e-05;-0.00041306196362711;-3.8454025343526e-05;0.00029318846645765;-0.00012278147914913;0.00067005102755502;1.4526172890328e-05;0.00018460775027052;-5.899166353629e-05;-0.00055571115808561;-9.3247135737329e-06;0.00058254791656509;-0.00010271462815581;-0.00044307191274129;1.4515083421429e-05;0.00024944444885477;0.00029581721173599;-0.00022549231653102;-0.00032610370544717;-0.00012104743655073;-0.00041152542689815;0.00014695868594572;0.001055977656506;0.00012331511243246;-0.00093909783754498;2.9640132197528e-05;0.00015137456648517;2.7586009309744e-05;-0.00020127142488491;4.2334195313742e-05;0.00017078380915336;-5.0542017561384e-05;-0.00037390759098344;-7.518694474129e-05;-0.00047883600927889;6.4838364778552e-05;-0.00085846113506705;-6.3705520005897e-05;0.00027736666379496;-7.4853276601061e-05;-0.00045476641389541;5.565090032178e-05;-0.0010035970481113;-7.1202332037501e-05;-0.00021023734007031;2.2063653887017e-05;9.0830952103715e-05;-0.00015065366460476;0.00025864748749882;2.4091179511743e-05;9.672933811089e-05;0.00019411047105677;-9.4353454187512e-05;0.0010296020191163;-2.0459197912714e-05;0.0016034049913287;2.8035676223226e-05;0.00033540703589097;5.8569162320055e-06;-0.00032217180705629;4.5514330849983e-05;-8.3185506809969e-05;1.7313624994131e-05;-6.2220875406638e-05;-5.7940474107454e-06;0.00034620414953679;4.1887429688359e-05;0.00020286311337259;1.1233099030505e-05;-0.00011945363075938;6.34221942164e-05;0.0001464650122216;-1.3022159919274e-06;-0.0010415721917525;1.8274015019415e-05;0.00022131824516691;-2.8890997782582e-05;7.793604163453e-05;6.0679631133098e-05;-6.6638211137615e-05;-0.00012665285612457;-6.5166146669071e-05;-0.0001084107789211;-3.3426954360039e-06;0.00027981455787085;-1.5823973171791e-06;-0.00020139990374446;-1.5246506336553e-05;0.00026057072682306;-1.8390799596091e-05;0.00019098007760476;1.0287909390172e-05;7.6576841820497e-05;-2.3737740775687e-05;-0.00038040909566917;-2.2749567506253e-05;0.00012673565652221;-4.7924386308296e-05;0.00041856840834953;-2.3949803562573e-06;3.1314008083427e-05;-4.3929180719715e-06;-0.00033131573582068;-1.2816586831832e-06;0.00019803130999207;-6.0247359215282e-05;-0.00013653495989274;-1.5568368780805e-06;0.00019381452875677;0.0002083685103571;-8.7941392848734e-05;-0.00018393102800474;-0.00010285372263752;-0.00027057327679358;4.5072418288328e-05;0.00093235541135073;6.2871062254999e-05;-0.00067672139266506;2.5011879188241e-05;8.6731328337919e-05;1.6065199815785e-05;-0.00011171920777997;2.4768707589828e-05;0.00012588030949701;-3.707916039275e-05;-0.00028042154735886;-5.7940069382312e-05;-5.9257414250169e-05;3.5156328522135e-05;-0.00046386814210564;-4.9098787712865e-05;0.0001462798245484;-4.4342188630253e-05;-0.0003055386187043;4.3648462451529e-05;-0.00071109691634774;-3.2422143704025e-05;-0.00016465951921418;2.107036561938e-05;9.0208915935364e-05;-4.1118386434391e-05;0.00019399491429795;-9.6927957201842e-05;6.4589614339639e-05;-4.3761592678493e-05;-5.2357976528583e-05;0.00072923529660329;-2.0347646568553e-05;0.00091736146714538;1.2076170605724e-05;0.00015753446496092;-1.3735680113314e-06;-9.395185043104e-05;1.8527363863541e-05;2.9192369765951e-05;3.9392300095642e-05;9.7799740615301e-05;0.00057263352209702;-0.00017981613927986;-0.00013782712630928;-0.00010283442679793;-0.00030334416078404;-3.1546576792607e-05;0.00013111482257955;-6.6918168158736e-05;0.00010006014781538;-6.9739799073432e-05;0.0019330239156261;2.5854039904516e-06;-0.00033769302535802;-0.00048589496873319;-0.00016283213335555;0.00018917757552117;0.00028285445296206;0.00028040134930052;6.1094811826479e-05;-1.5131808140723e-05;6.9359325607365e-06;-0.0013832092517987;0.00012568521196954;0.00022216884826776;7.874533184804e-05;-0.00057264231145382;-5.0332755563431e-06;-0.00029840256320313;-4.9036796553992e-05;0.00012573863205034;-3.7433634133777e-05;-0.00014061651017983;-0.00017417001072317;0.00043094257125631;2.633513577166e-05;0.00055409816559404;-0.00014316018496174;0.00036718547926284;1.2654223269237e-07;-0.00051561946747825;-0.00013682311691809;0.00083071767585352;4.3415959225968e-05;-0.00065363681642339;0.00012995966244489;0.00024259193742182;-0.0002126290492015;-2.8319718694547e-05;-0.00033788534346968;0.0001466758112656;-0.00037832494126633;0.00014940665278118;0.00047871103743091;3.8506532291649e-05;-0.00075669842772186;3.1515755836153e-05;0.00016578927170485;4.7614459617762e-05;-0.00024497724371031;-3.4229396987939e-05;0.0001067548582796;-0.00011023857223336;-0.00031977443723008;4.3031708628405e-05;-0.0005610857042484;-1.7632975186643e-06;-0.0009709412115626;-0.00010963592649205;0.00038862030487508;3.8528836739715e-05;-0.00027789484011009;-8.8685679656919e-05;-0.00090214144438505;2.5254747015424e-05;-0.00023571032215841;0.000117064701044;-0.00026321000768803;0.00011850916052936;0.00011363910743967;7.5990414188709e-05;-4.3839572754223e-05;0.00042910594493151;3.0700372008141e-05;0.00072865292895585;3.6573846955434e-06;0.0016853667329997;1.2940818123752e-05;0.00036615843418986;5.3353232942754e-05;-0.00041817940655164;3.1273051718017e-05;2.997858064191e-05;8.1317841249984e-05;0.00054552254732698;-0.00018999580061063;-5.1665851060534e-05;-8.684099157108e-05;-0.00021167594240978;-4.0362214349443e-05;0.0001488800480729;-7.0428657636512e-05;0.0001124130358221;-7.4759525887202e-05;0.0017871959134936;5.7461234064249e-06;-0.00032739795278758;-0.00045307562686503;-0.00017289385141339;0.00011829563300125;0.00027678578044288;0.00024462971487083;9.5612507720944e-05;-1.244952181878e-05;2.9095541322022e-05;-0.0013187198201194;0.00011408043064876;0.00011064292630181;7.7152195444796e-05;-0.00052654923638329;-5.3978959613232e-07;-0.00027126705390401;-4.4786294893129e-05;0.00011410631850595;-4.0075214201352e-05;-0.00011700046889018;-0.00017241259047296;0.00039975324762054;2.7851872800966e-05;0.00053159345407039;-0.00012367025192361;0.00031115123420022;-2.1804203242937e-06;-0.00046704561100341;-0.00012191927089589;0.00075198546983302;3.7000485463068e-05;-0.00051681103650481;0.00012419266568031;0.0002187713253079;-0.00022494270524476;-2.5826922865235e-05;-0.00031622557435185;0.0001601980329724;-0.00034253025660291;0.0001450816198485;0.00040991179412231;3.2671363442205e-05;-0.00072733993874863;2.7624784706859e-05;0.00015623432409484;4.3122017814312e-05;-0.00024848341126926;-3.3572516258573e-05;9.6283562015742e-05;-8.8297092588618e-05;-0.00029378815088421;7.3369723395444e-05;-0.0005841389647685;6.4359760472144e-06;-0.00092797388788313;-0.00011308558896417;0.00036434089997783;3.8860554923303e-05;-0.00025022882618941;-7.2833507147152e-05;-0.00080734782386571;3.1608953577233e-05;-0.00020280813623685;0.00010207119339611;-0.00023513523046859;0.00013406785728876;8.1497637438588e-05;0.00010446230589878;-8.3431157690939e-05;0.00044496450573206;1.1100198207714e-05;0.00067847227910534;-8.470859938825e-06;0.0015134803252295;1.0502254554012e-05;0.00032356625888497;4.2662391933845e-05;-0.00035663504968397;-0.00011620098666754;1.4503441889246e-05;-0.00042211890104227;-3.1664458219893e-05;5.5689524742775e-05;0.00018696747429203;6.54843825032e-05;4.3057556467829e-05;-0.00023066233552527;8.1861500802916e-05;9.1326583060436e-05;3.0845130822854e-05;-0.0020586815662682;8.6666470451746e-05;0.00034327351022512;-1.8197617464466e-05;0.00032411524443887;0.00022132279991638;6.0208734794287e-05;-0.00021455355454236;-0.00023253218387254;-9.9394354037941e-05;-0.00018164867651649;0.0011847779387608;-5.4550415370613e-05;0.00016757874982432;-7.7303571742959e-05;0.00047718288260512;-5.8858277043328e-05;0.0003796772507485;-1.8172338968725e-05;0.00015674151654821;-5.8597393945092e-05;-0.00051506812451407;-7.8166929597501e-05;0.00016038224566728;-0.00010933403973468;0.00064737955108285;3.6209628888173e-05;5.4759853810538e-05;3.6693927540909e-06;-0.00069193041417748;2.1095425836393e-05;0.00038793808198534;-8.0045996583067e-05;-1.4543938050338e-05;-2.3928378141136e-05;0.00034951214911416;0.00024727339041419;-0.00030442391289398;-0.00036728565464728;-0.00012660870561376;-0.00020928954472765;0.0001512623130111;0.0013508044648916;0.00011022740363842;-0.0011154632084072;2.7869224140886e-05;0.00028696953086182;1.8340780343351e-06;-0.00035034530446865;5.1103292207699e-05;0.00017586813191883;-6.1002359871054e-05;-0.00048506885650568;-7.9427583841607e-05;-0.00053381465841085;0.00012048009375576;-0.00083324767183512;-4.5429675083142e-05;0.00027257259353064;-0.00010193794878433;-0.00038467973354273;6.5173480834346e-05;-0.00099183944985271;-6.7496905103326e-05;-0.00022026387159713;4.0610459109303e-05;0.0001769827795215;-5.7236662541982e-05;0.00030580721795559;1.4291291336122e-05;1.0044164810097e-05;0.00018670201825444;-0.00017569138435647;0.0011473959311843;-2.5600467779441e-05;0.0014343757648021;8.291411177197e-06;0.00021436379756778;4.8049223551061e-06;-0.0001484804233769;3.345355798956e-05;-0.00015041111328173;2.4609882530058e-05;-0.0003656626213342;-2.6996791348211e-05;0.00027322146343067;0.00017568055773154;0.00014657713472843;3.4982032957487e-05;-0.00026625068858266;0.00010404387285234;0.00017573486547917;2.3430759028997e-05;-0.0023005078546703;8.4506886196323e-05;0.00041409910772927;-3.0057846743148e-05;0.00030336272902787;0.00022452558914665;4.0278275264427e-05;-0.00026280392194167;-0.00022172069293447;-0.00017422136443201;-0.00015911360969767;0.0011017720680684;-4.9087353545474e-05;5.6783410400385e-05;-6.9271613028832e-05;0.00053787120850757;-5.8951671235263e-05;0.00042602638131939;-1.2449046153051e-05;0.00016869678802323;-6.0873331676703e-05;-0.00066473230253905;-8.4036415501032e-05;0.00014932507474441;-0.00011235658894293;0.00076545582851395;3.4721226256806e-05;5.4914846259635e-05;5.5261698435061e-06;-0.00075921177631244;1.8387290765531e-05;0.00039267944521271;-9.5886971394066e-05;-5.3626536100637e-05;-2.3923919798108e-05;0.00041781502659433;0.00031274658977054;-0.00031865487108007;-0.00040169505518861;-0.00017007961287163;-0.00028088432736695;0.00015103183977772;0.0016948544653133;0.00012689709546976;-0.0012987916124985;3.3008986065397e-05;0.0002991565852426;7.0025325840106e-06;-0.00036423889105208;5.6772441894282e-05;0.00022361549781635;-7.4805117037613e-05;-0.00058264326071367;-0.00010081021900987;-0.00049021618906409;0.00012057244748576;-0.00094550655921921;-6.7779874370899e-05;0.00030305530526675;-0.00010873968858505;-0.00049912085523829;8.0320714914706e-05;-0.0012233869638294;-7.9238721809816e-05;-0.00026271984097548;4.4251413783059e-05;0.00021203969663475;-5.2850795327686e-05;0.00036983625614084;-5.0880546041299e-05;3.4693104680628e-05;0.00012256416084711;-0.00018174048454966;0.0014122122665867;-2.968901208078e-05;0.0016745071625337;1.8267845007358e-05;0.00025268908939324;4.525046733761e-06;-0.00016248493921012;3.9463109715143e-05;-0.0001426353410352;3.1373183446703e-05;-8.0203419202007e-05;1.380190724376e-06;0.00051096465904266;8.8548658823129e-05;0.00020624898024835;5.4129241533474e-08;-0.00022346651530825;0.00010362431203248;0.00025279616238549;1.0226814310954e-06;-0.0016452303389087;4.583421832649e-05;0.00034385852632113;-3.9204678614624e-05;0.00011204200563952;0.00013274664524943;1.2571231309266e-05;-0.00020616523397621;-0.00010406695946585;-0.00022878139861859;-6.7633482103702e-05;0.00040552741847932;-2.7269323254586e-05;-0.00013754710380454;-2.2270865883911e-05;0.00038378711906262;-3.2205258321483e-05;0.00032289285445586;1.4070160432311e-06;0.00011872210598085;-3.960636240663e-05;-0.00065463839564472;-5.4226395150181e-05;3.0926748877391e-05;-5.8693964092527e-05;0.00062185601564124;1.4219792319636e-05;-3.5172238312953e-06;1.8853239453165e-05;-0.00052516651339829;9.080345989787e-06;0.0001626189914532;-7.5509175076149e-05;-4.5191241952125e-05;-1.7400212527718e-05;0.00035058773937635;0.00027969243819825;-0.00018935164553113;-0.00025890287361108;-0.00017207195924129;-0.00026982341660187;7.343222387135e-05;0.0015904294559732;9.0344932687003e-05;-0.0010412890696898;2.7873829822056e-05;0.00016876081645023;1.1368828381819e-05;-0.00020249337831046;3.9114278479246e-05;0.00020925402350258;-6.7898516135756e-05;-0.00050307967467234;-8.3651881141122e-05;-0.00019823403272312;8.4832288848702e-05;-0.00069503445411101;-6.6918182710651e-05;0.00021473535161931;-7.8040342486929e-05;-0.00048468069871888;7.3970695666503e-05;-0.001116922008805;-4.920172796119e-05;-0.00024672137806192;3.8721427699784e-05;0.0001791797549231;-2.4141650101228e-06;0.00032173009822145;-0.00013602255785372;4.4412656279746e-05;-6.0300048062345e-05;-0.00012787933519576;0.0012804951984435;-3.6945140891476e-05;0.0013302526203915;1.2172361493867e-05;0.00019817464635707;-2.4623111585242e-06;-5.488643728313e-05;2.3361755665974e-05;-0.00010348447540309;2.5139992430923e-05;0.00010048612602986;3.1751897040522e-05;0.00044153333874419;5.1422099204501e-05;0.00012955155398231;-2.1581170585705e-05;-0.00015211451682262;8.7816042650957e-05;0.00025218608789146;-8.7382477431674e-06;-0.0010656724916771;1.0357804967498e-05;0.00023699829762336;-4.114916009712e-05;-5.1690192776732e-05;2.3208875063574e-05;1.7529540855321e-05;-5.3163101256359e-05;-1.8795772120939e-05;-0.00014258451119531;-3.7245958083076e-05;-4.9763668357627e-05;-2.4205441150116e-05;-0.00011575673852349;1.0994733202097e-05;0.00024278908676933;-8.1978541857097e-06;0.00021821129485033;1.4166535038385e-05;5.6985474657267e-05;-1.5534664271399e-05;-0.00054007867584005;-1.8802300473908e-05;-8.029197488213e-05;-1.1785191418312e-05;0.00042336288606748;-3.6448748232942e-06;-5.8705350966193e-05;3.2990188628901e-05;-0.00029134942451492;-1.2143459571234e-06;-3.0016512027942e-05;-5.132332444191e-05;2.095036143146e-05;-1.4336365893541e-05;0.00023909780429676;0.00021313710021786;-6.5791122324299e-05;-0.00010806375939865;-0.00014502290287055;-0.00021176254085731;-2.8672684493358e-07;0.0013036701129749;4.9275789933745e-05;-0.00073075853288174;2.4124072297127e-05;9.5985626103356e-05;1.3517069419322e-05;-0.00011727514356608;2.294725527463e-05;0.00017591744835954;-5.0862796342699e-05;-0.00038500333903357;-6.5512336732354e-05;8.2348728028592e-05;3.1235689675668e-05;-0.00041286228224635;-6.5874977735803e-05;0.00011343906953698;-3.3981286833296e-05;-0.00039488601032645;5.7424302212894e-05;-0.00080714089563116;-2.7259959097137e-05;-0.00015457838890143;2.2154326870805e-05;0.00011412331514293;-1.8436274331179e-05;0.00022741114662495;-0.00015704915858805;7.6448028266896e-05;-0.00016028086247388;-4.3822372390423e-05;0.00098729983437806;-3.3241591154365e-05;0.00080961332423612;1.5878484191489e-05;8.9752320491243e-05;-3.7887698454142e-06;-1.7835300241131e-06;1.3318883247848e-05;-5.3246767492965e-05;1.2793933819921e-05;0.00017398696218152;4.8692665586714e-05;0.00025401436141692;3.671548620332e-05;2.3990942281671e-05;-2.9623806767631e-05;-7.6944132160861e-05;6.1706377891824e-05;0.00019369569781702;-9.872266673483e-06;-0.0006098635494709;-1.5627701941412e-05;0.00012376742961351;-3.5324912460055e-05;-0.00014404652756639;-5.214868724579e-05;2.9132614145055e-05;7.9781406384427e-05;2.7895268431166e-05;-3.3097381674452e-05;-3.1936382583808e-05;-0.00025746304891072;-2.3959722966538e-05;-1.3299961210578e-05;2.8181979359942e-05;0.00013143284013495;8.4924831753597e-06;0.00013047852553427;2.1695859686588e-05;4.5871342990722e-06;3.4712015803962e-06;-0.00037673593033105;8.961027560872e-06;-0.00014601000293624;1.7872069292935e-05;0.00023812033759896;-1.36066455525e-05;-8.5367675637826e-05;3.7347679608501e-05;-9.350900654681e-05;-9.2044292614446e-06;-0.00013703545846511;-2.9605051167891e-05;6.7741340899374e-05;-1.0544698852755e-05;0.00012700670049526;0.00013857516751159;1.8532249669079e-05;9.066640814126e-06;-0.00010510889114812;-0.00014118789113127;-4.6485260099871e-05;0.00091096904361621;1.6859323295648e-05;-0.00042726212996058;1.8774067939376e-05;4.9830592615763e-05;1.3688993931282e-05;-6.9793910370208e-05;1.0053395271825e-05;0.00013149346341379;-3.136258237646e-05;-0.0002606198831927;-4.4676366087515e-05;0.00022120040375739;-9.6349467639811e-06;-0.0001824291102821;-5.7388362620259e-05;3.377389657544e-05;1.9634612726804e-06;-0.00027778255753219;3.7635767512256e-05;-0.00046286650467664;-1.1763932889153e-05;-5.4906555305934e-05;6.0951497289352e-06;4.5775061153108e-05;-5.1426639402052e-05;0.00012641974899452;-0.00011997600813629;9.5309937023558e-05;-0.0001696566469036;2.3400471036439e-05;0.00066527392482385;-2.5875644496409e-05;0.00034450282691978;1.8188738977187e-05;-8.3393952081678e-06;-2.5627384729887e-06;1.3082828445476e-05;7.1521822064824e-06;-3.280272721895e-05;8.4648709162138e-06;0.00010620764805935;2.9274962798809e-05;0.00013589907030109;2.2211481336853e-05;1.7747261154e-05;-1.6926567695918e-05;-4.4170996261528e-05;3.9366379496641e-05;0.00012070925004082;-6.9651991907449e-06;-0.00033805606653914;-1.1494785212562e-05;7.5018731877208e-05;-2.3345133740804e-05;-9.0360299509484e-05;-4.0985949453898e-05;7.3448109105811e-06;6.2194201746024e-05;1.7449579900131e-05;-6.4288073531316e-08;-1.542771133245e-05;-0.00016772927483544;-1.2781329132849e-05;-2.2163072571857e-05;1.7608172129258e-05;7.3298913775943e-05;5.9559911278484e-06;6.923883483978e-05;1.528321809019e-05;6.6265033638047e-06;1.0191776027568e-06;-0.00022014821297489;9.5628511189716e-06;-7.0901216531638e-05;1.1310204172332e-05;0.00014192899107002;-1.1896412615897e-05;-5.7280874898424e-05;2.4067965568975e-05;-6.7723922256846e-05;-5.4585816542385e-06;-7.9922574514057e-05;-1.8516469936003e-05;4.511724182521e-05;-6.366388333845e-06;6.6995620727539e-05;8.6708350863773e-05;2.3035139747662e-05;8.1309535744367e-06;-6.0905964346603e-05;-0.00010271767678205;-3.1796014809515e-05;0.00054399087093771;7.5201714935247e-06;-0.00026292947586626;1.3622634469357e-05;3.3293323213002e-05;9.3392309281626e-06;-4.1323710320285e-05;5.6182625485235e-06;7.4088115070481e-05;-1.7112412024289e-05;-0.00014140200801194;-2.7790627427748e-05;0.00019028925453313;-8.7398921095883e-06;-9.8441509180702e-05;-3.5205379390391e-05;1.550111664983e-05;3.2433779324492e-06;-0.00015282987442333;2.2052548956708e-05;-0.00025762541918084;-4.6230416046456e-06;-2.680999932636e-05;3.4993649933313e-06;2.5623658075347e-05;-3.0572915420635e-05;7.5375166488811e-05;-8.8308624981437e-05;6.2269311456475e-05;-0.0001200158658321;1.838881871663e-05;0.00034606328699738;-1.5945677660056e-05;0.00018051096412819;1.0177084732277e-05;-4.3266909415252e-06;-2.412934691165e-06;1.7347920220345e-06;3.3460016766185e-06;-1.9739083654713e-05;6.1120867030695e-05;-1.8583192286314e-05;-0.00013883718929719;-2.491856503184e-05;-0.00032192061189562;1.7384816601407e-05;-7.3029528721236e-05;-6.3101098930929e-05;0.00011231921962462;5.0972735152754e-06;-0.00015813956269994;-1.0891803867707e-06;0.00050358212320134;3.3905067539308e-05;-0.0001534012844786;8.4217863332015e-05;4.6223365643527e-05;-1.8725981135503e-05;-4.4176638766658e-05;1.6098949345178e-05;3.1284151191358e-05;4.3497799197212e-05;1.9866703951266e-05;0.00019831427198369;-1.9958168195444e-05;0.00013252419012133;3.5194134397898e-06;-0.00010711512004491;-1.2469421562855e-05;-0.00013375142589211;-1.5802557754796e-05;3.0622893973486e-05;1.5897532648523e-05;-0.00031080099870451;3.3960015571211e-05;-7.5111973274034e-05;-2.4106482669595e-05;0.00014754952280782;2.1114001356182e-05;-5.0210597692057e-05;2.0192566807964e-05;-0.00010370826203143;-3.1920309993438e-05;-0.00012204584345454;-1.0418777492305e-05;5.6955177569762e-05;0.0001072681916412;0.00012301831156947;6.4872052462306e-05;-0.00010172780457651;9.7467536761542e-06;-6.4055915572681e-05;-0.00013160497474018;-8.6377858679043e-06;0.00071282661519945;2.7070645955973e-05;-0.00034071417758241;4.5157068484514e-07;5.1893926865887e-05;1.616179724806e-05;-4.8735135351308e-05;-3.0596296710428e-05;9.1342255473137e-05;-6.1283775721677e-05;-0.00024076760746539;9.8559403340914e-06;0.00023149774642661;-2.1857593310415e-05;-0.00020618308917619;-1.5815419828868e-05;5.5559798056493e-05;4.3215983168921e-05;-0.00016834748385008;-5.2545706239471e-06;-0.00050726276822388;8.2082087828894e-06;-0.00010039070184575;0.00010750473302323;-2.8803956411139e-06;0.00011183448805241;5.806678746012e-05;-0.00017059987294488;-1.258235261048e-05;-0.00015404976147693;-1.9141156371916e-05;0.00052281323587522;7.8966479577502e-07;0.00039800023660064;-1.0931297765637e-05;1.5707726561232e-05;5.7252332226199e-06;6.7822104028892e-05;5.4678835113009e-06;8.6952131823637e-05;4.1106213757303e-05;0.00040906187496148;-0.00022997327323537;-0.00013327223132364;-4.681990321842e-05;-5.1397539209574e-05;-8.3179111243226e-05;0.00022836861899123;-6.0920559917577e-05;-4.6570887207054e-05;-9.2331574705895e-05;0.0019505979726091;2.3933402189869e-05;-0.00038688277709298;-0.00033658786560409;-0.00013206407311372;-3.6088320484851e-05;0.00022932306455914;0.00018508156063035;0.00017866885173135;8.7504877228639e-06;8.0538862675894e-05;-0.0010523956734687;8.9955261501018e-05;-5.896586299059e-05;7.5699965236709e-05;-0.00050752551760525;5.604537363979e-06;-0.00034413547837175;-6.4830368501134e-05;0.00014090776676312;-4.7958637878764e-05;-0.00038619147380814;-9.8932163382415e-05;0.00014668791845907;2.2154274120112e-05;0.00053356145508587;-4.2760966607602e-05;0.00013789584045298;3.496137651382e-05;-0.00057701097102836;-0.00010568467405392;0.00041048953426071;-3.2100995213113e-06;-0.00015680521028116;0.00024922456941567;0.00023108534514904;-0.00020257670257706;-0.00010948527778964;-0.00026274521951564;9.2506743385457e-05;-0.00022915612498764;0.00010295402171323;0.0010371787939221;3.9634429413127e-05;-0.00089444557670504;4.9376517381461e-06;0.00027526498888619;5.4237949370872e-05;-0.00033188922679983;-6.041131564416e-05;0.0001501309016021;-0.00012059980508639;-0.00045039234100841;9.0653702500276e-05;-0.00029646678012796;-1.9177232388756e-05;-0.00088080915156752;-0.00010755557741504;0.00031653288169764;7.2016788180918e-05;-0.00029176598764025;-7.627369632246e-05;-0.0009422866278328;3.489730443107e-05;-0.00017757585737854;0.00021715083857998;-0.00011153996456414;0.00023524745483883;4.8987025365932e-05;-7.2038223152049e-05;-0.00012155716103734;0.00021129990636837;-6.3458139720751e-07;0.00092667550779879;1.8974459408128e-06;0.0013639570679516;3.5505343021214e-06;0.00023201321891975;3.8785012293374e-05;-0.00021471137006301;1.298407005379e-05;6.8054308940191e-05;3.5575554647949e-05;0.0004479720373638;-0.00024878210388124;8.3962904682267e-06;-4.7645738959545e-05;1.3032648894296e-05;-7.3579787567724e-05;0.00021371970069595;-6.7549801315181e-05;-9.730063538882e-06;-9.775250509847e-05;0.0018546197097749;1.6962607332971e-05;-0.00034336961107329;-0.00034705299185589;-0.00014451972674578;-6.6407861595508e-05;0.00024945911718532;0.00014667770301457;0.00020355729793664;-2.1395286239567e-05;9.38387674978e-05;-0.0011119969421998;9.5769915787969e-05;-0.00016341340960935;7.6246418757364e-05;-0.00047298581921495;1.0827611731656e-05;-0.00033151207026094;-6.0970749473199e-05;0.00013139603834134;-5.167428025743e-05;-0.00032847473630682;-0.00010125455446541;0.00014878081856295;2.5324538000859e-05;0.00049228389980271;-3.662448580144e-05;0.00012104603956686;3.2374726288253e-05;-0.00054073048522696;-9.4751485448796e-05;0.000395136710722;-5.2100067478023e-06;-0.00010491772991372;0.0002302389475517;0.00019937926845159;-0.00021169100364204;-9.0959583758377e-05;-0.00025481201009825;0.0001037359907059;-0.00019140490621794;0.0001003820943879;0.00089675671188161;3.4213629987789e-05;-0.00082778109936044;2.7051714823756e-06;0.00026682921452448;5.0386537623126e-05;-0.00032971316250041;-5.3971783927409e-05;0.00013077138282824;-0.00010157301585423;-0.00040878809522837;0.00010067175026052;-0.00035643103183247;-1.0547644706094e-05;-0.00082374043995515;-0.00010669732728275;0.00030011605122127;6.3439285440836e-05;-0.00024332239991054;-6.8236215156503e-05;-0.000819027191028;3.6829558666795e-05;-0.00016119677457027;0.00019134396279696;-0.00011204052134417;0.00021342918626033;2.7344773116056e-05;-1.5948058717186e-05;-0.00012827200407628;0.00025227884179913;-4.463112418307e-06;0.00082095229299739;-5.6530971050961e-06;0.0012376036029309;4.9082300392911e-06;0.00020006865088362;3.3201300539076e-05;-0.00019305010209791;-0.00012293696636334;2.5507804821245e-05;-0.0002167699567508;-1.0410407185191e-06;0.00011951425403822;0.00015233914018609;-2.2819445803179e-05;5.9209151004325e-06;-0.00020194305398036;7.3372873885091e-05;0.00018635879678186;1.4176375771058e-05;-0.0015701549127698;7.0377958763856e-05;0.00025003578048199;-1.428380892321e-05;0.00017124392616097;0.00016326806508005;0.00013987366401125;-0.0001328940707026;-0.00015179852198344;-0.00013764129835181;-0.00017401778313797;0.00065713009098545;-5.8962516050087e-05;0.00023343368957285;-4.6290810132632e-05;0.00031867736834101;-3.9383630792145e-05;0.00033011648338288;-2.0409337594174e-05;0.00012507830979303;-4.8522379074711e-05;-0.00056412152480334;-6.7028937337454e-05;-0.0001348314108327;-3.557493982953e-05;0.00046071864198893;3.8216647226363e-05;-4.4040600187145e-05;4.3441061279736e-05;-0.00055818795226514;2.9688622817048e-05;4.1603147110436e-05;-4.1978302760981e-05;0.00015247591363732;-3.6224515497452e-05;0.00033412154880352;0.00016397635044996;-0.00023577692627441;-0.0002062041166937;-0.00013782153837383;-1.9345241526025e-05;7.0801106630825e-05;0.0014233604306355;6.150160334073e-05;-0.00084722077008337;1.220881131303e-05;0.00025548876146786;-1.075308318832e-05;-0.00026312400586903;3.807527536992e-05;0.00016768065688666;-6.0977312386967e-05;-0.00046894553815946;-6.8259760155343e-05;-0.00031748181208968;9.945867350325e-05;-0.00055796571541578;-4.1382394556422e-05;0.00017216648848262;-7.2229493525811e-05;-0.00033487583277747;6.1850274505559e-05;-0.00082684407243505;-4.9023703468265e-05;-0.00016889182734303;3.3380743843736e-05;0.00019241470727138;2.8975466193515e-05;0.00025921440101229;-5.8708028518595e-05;-2.3688147848588e-05;3.0282439183793e-05;-0.00014586863107979;0.0010710100177675;-2.400024641247e-05;0.00097712257411331;6.5586064010859e-06;0.00010518774070079;9.9692283583863e-07;-7.4087952270929e-06;2.0251536625437e-05;-0.00015512519166805;3.6848254239885e-05;-5.0488361011958e-06;2.6594359951559e-05;0.0004688318585977;0.00011375813483028;4.0041304600891e-05;-2.7546822821023e-05;-0.00023344962392002;9.4527560577262e-05;0.00030453797080554;3.7186424606261e-07;-0.0015807348536327;5.8645084209275e-05;0.00028317791293375;-2.5878855012706e-05;5.1448838348733e-05;0.00016234160284512;0.00017149625637103;-0.00018009466293734;-8.9694505732041e-05;-0.00029719251324423;-0.00014529713371303;0.00024558126460761;-5.8729216107167e-05;0.00012498968862928;-1.5639687262592e-05;0.00031885219505057;-2.9401173378574e-05;0.00035735245910473;-1.5563537090202e-05;9.4641327450518e-05;-3.347496749484e-05;-0.00074817310087383;-7.1158203354571e-05;-0.00027638132451102;-9.1796309789061e-06;0.0005105517921038;3.8139474781929e-05;-7.7791693911422e-05;5.4219399316935e-05;-0.0004595021600835;1.9954542949563e-05;-0.00011568947229534;-4.3749689211836e-05;0.00014807569095865;-3.4535289159976e-05;0.00040216741035692;0.00020030430459883;-0.00021977693540975;-0.00015952068497427;-0.00019513195729814;-2.7130838134326e-05;4.0567036194261e-05;0.0017591208452359;6.7920700530522e-05;-0.0008930818294175;6.2762242123426e-06;0.00018967792857438;-6.2456156229018e-06;-0.00019635002536234;3.5256784030935e-05;0.00023501816031057;-8.1908750871662e-05;-0.00059953128220513;-7.3245770181529e-05;-0.00033732771407813;0.00010764766193461;-0.00058158591855317;-5.1699644245673e-05;0.00016883248463273;-7.1979316999204e-05;-0.00050670653581619;8.0992540461011e-05;-0.0010847646044567;-4.4032098230673e-05;-0.00021945862681605;3.7217745557427e-05;0.00021868631301913;5.3943898819853e-05;0.0003002209123224;-9.9330209195614e-05;-1.6609223166597e-05;-3.8774065615144e-05;-0.00015612966672052;0.0014934544451535;-4.323538087192e-05;0.001106814481318;6.1344239838945e-06;0.0001101581583498;-3.3143298878713e-06;7.34186542104e-05;1.709316529741e-05;-0.00013364211190492;3.2031224691309e-05;0.00017091687186621;5.5857562983874e-05;0.00054754357552156;7.9873549111653e-05;3.1761403079145e-05;-4.5666954974877e-05;-0.00018850204651244;8.7750398961361e-05;0.00032668135827407;-8.2147653301945e-06;-0.0013088687555864;2.9250175430207e-05;0.00022967541008256;-3.0870807677275e-05;-8.9484274212737e-05;8.9454901171848e-05;0.00016137312923092;-9.7138203273062e-05;-1.9969533241238e-05;-0.00028464442584664;-0.00011052793706767;-0.00013297236000653;-5.5168693506857e-05;9.0126290160697e-05;1.2334410712356e-05;0.00026338672614656;-1.1270445611444e-05;0.00031142329680733;-2.4988873974507e-06;3.5083601687802e-05;-7.9184737842297e-06;-0.00072474230546504;-4.5960387069499e-05;-0.00036270209238864;1.8725926565821e-05;0.00042942480649799;2.4587454390712e-05;-9.5179449999705e-05;5.3851283155382e-05;-0.00025779561838135;2.2807134882896e-06;-0.00023283260816243;-3.7546862586169e-05;0.00012053484533681;-2.5456389266765e-05;0.00034489156678319;0.00018766419088934;-0.00013582942483481;-5.7096644013654e-05;-0.00019755885296036;-3.5220535210101e-05;-9.2259115263005e-06;0.0016646182630211;5.3882955398876e-05;-0.00072829087730497;3.9458745959564e-06;0.00011013901530532;2.2986205294728e-06;-0.0001234984229086;2.4925746402005e-05;0.00024753017351031;-7.8041790402494e-05;-0.00057694892166182;-6.4361294789705e-05;-0.00020974910876248;6.7619846959133e-05;-0.00045689224498346;-6.1138620367274e-05;0.00011888504377566;-4.2377945646876e-05;-0.00054342608200386;7.6479838753585e-05;-0.0010085193207487;-3.3784257539082e-05;-0.00018173035641667;2.5155439288937e-05;0.00016491471615154;7.2821362664399e-06;0.00025154609465972;-9.4816488854121e-05;3.2231193472398e-05;-9.1250178229529e-05;-9.0112574980594e-05;0.0015034755924717;-4.7431451093871e-05;0.00090557982912287;1.4261563592299e-05;5.8766152505996e-05;-3.3696890113788e-06;9.5934454293456e-05;1.4288284546637e-05;-8.6187319539022e-05;1.9591674572439e-05;0.0002840762026608;7.7272430644371e-05;0.00045521368156187;5.5995224101935e-05;-1.3520787433663e-05;-5.3041352657601e-05;-0.00012064617476426;7.3783601692412e-05;0.00028576445765793;-1.1678726878017e-05;-0.00093719753203914;-5.2756240620511e-06;0.00015472459199373;-3.5088993172394e-05;-0.00020804587984458;-1.1734511645045e-05;0.00012917244748678;4.1628714825492e-05;3.9854054193711e-05;-0.00017267408838961;-7.979499787325e-05;-0.00040363273001276;-4.95564963785e-05;9.362751734443e-05;3.5744873457588e-05;0.00019237454398535;7.6322066888679e-06;0.00022742318105884;1.4195796211425e-05;-1.6019404938561e-05;1.2492393580033e-05;-0.00059369660448283;-8.8843662524596e-06;-0.00038200119161047;3.7738536775578e-05;0.00031171864247881;4.8234442147077e-06;-0.0001125148992287;5.2918327128282e-05;-6.9757683377247e-05;-1.2178151337139e-05;-0.00029401609208435;-2.9179576813476e-05;0.00011192492820555;-1.7451906387578e-05;0.0002313535369467;0.00015762359544169;-3.5026227124035e-05;4.2153773392783e-05;-0.00016708581824787;-5.4970132623566e-05;-5.6819539167918e-05;0.0013733271043748;2.9503728001146e-05;-0.00052254099864513;7.9320734585053e-06;4.978351353202e-05;1.0581753485894e-05;-7.5461306551006e-05;1.3728473277297e-05;0.00022092374274507;-5.9807167417603e-05;-0.00046151436981745;-5.1483893912518e-05;1.7167601981782e-05;1.2661283108173e-05;-0.00028068583924323;-7.0033041993156e-05;5.3807249059901e-05;-5.3255080274539e-06;-0.0004872148274444;6.0461479733931e-05;-0.00076230720151216;-2.1251933503663e-05;-9.9316544947214e-05;9.4922006610432e-06;8.3078055467922e-05;-5.0922455557156e-05;0.0001793178380467;-9.1567722847685e-05;9.1232555860188e-05;-0.00015126669313759;-4.5476285777113e-06;0.0012533031404018;-4.3336065573385e-05;0.00055627507390454;2.4031971406657e-05;-1.1819492101495e-05;-2.1421710698633e-06;8.2047343312297e-05;1.0743005987024e-05;-3.4641951060621e-05;5.155881808605e-06;0.00028691999614239;7.8293393016793e-05;0.00028885033680126;4.0788287151372e-05;-5.3785344789503e-05;-4.859096952714e-05;-6.1034374084556e-05;5.4031635954743e-05;0.0001984288537642;-8.9301520347362e-06;-0.000608024536632;-2.7174839487998e-05;8.2627469964791e-05;-3.2655869290465e-05;-0.00024162953195628;-7.0565925852861e-05;9.5355062512681e-05;0.00013028968533035;6.4344574639108e-05;-6.3894309278112e-05;-5.8744306443259e-05;-0.00044874896411784;-4.104629624635e-05;0.00011276781151537;4.4425367377698e-05;0.00012518990843091;1.8137723600375e-05;0.00015064775652718;2.3213600798044e-05;-4.6661087253597e-05;2.2804995751358e-05;-0.00041865368257277;1.4195928997651e-05;-0.00032188621116802;4.2358224163763e-05;0.00019466267258395;-7.9931560321711e-06;-0.00010686568566598;4.4667489419226e-05;6.5159649238922e-05;-1.8688706404646e-05;-0.00027560547459871;-2.0780074919458e-05;9.9068944109604e-05;-1.0329084034311e-05;0.00012919939763378;0.00011746746895369;3.0830982723273e-05;8.9527711679693e-05;-0.00012256694026291;-6.2214181525633e-05;-7.7059550676495e-05;0.00096436764579266;1.1034136150556e-05;-0.00032629352062941;1.001054806693e-05;1.0764923899842e-05;1.3949915228295e-05;-5.0059585191775e-05;5.5862860790512e-06;0.00016910719568841;-3.7643374525942e-05;-0.00032617835677229;-3.7235131458146e-05;0.00012843646982219;-2.2808289941167e-05;-0.00013519785716198;-6.4242754888255e-05;9.5165396487573e-06;1.7633967217989e-05;-0.00036697395262308;4.0311460907105e-05;-0.00048268047976308;-1.182713185699e-05;-3.3292315492872e-05;-1.5231295265039e-06;1.8439737687004e-05;-8.8669243268669e-05;0.00010284793097526;-6.0599220887525e-05;0.00011538447870407;-0.00014705862849951;5.0804945203708e-05;0.00091405073180795;-3.2687730708858e-05;0.00025911719421856;2.6041812816402e-05;-6.9843503297307e-05;-9.5537330935258e-08;5.9044570662081e-05;7.8195998867159e-06;-1.7496845430287e-06;1.7764725271263e-05;-5.5085984058678e-05;-0.00023299630265683;-5.3329760703491e-05;-0.00017609242058825;2.8583563107532e-05;0.00011942821583943;-3.3527081541251e-05;4.2368166759843e-05;-3.3664546208456e-06;-0.00011733645806089;2.1911324438406e-05;0.00048061006236821;2.3738659365335e-05;-5.7054763601627e-05;0.00019616786448751;8.4279497968964e-05;-0.00010423846833874;-7.7417484135367e-05;-9.9507553386502e-05;9.6184689027723e-05;-3.3979660656769e-05;4.623113272828e-05;0.00032091827597469;-3.4996472095372e-05;-0.00013447695528157;-1.2034686733386e-05;-8.9259447122458e-05;-1.5858999176999e-05;-0.0001458775223;1.2977672668057e-05;-3.6915404052706e-05;4.4482469093055e-05;-0.00028037652373314;6.0911403124919e-05;-0.00025820566224866;-2.7876310923602e-05;5.8547546359478e-05;3.1020786991576e-05;-7.6895710662939e-05;1.8207530274594e-06;9.8010270448867e-05;-1.929408426804e-05;-0.00026859948411584;-1.0662864042388e-05;9.9603115813807e-05;5.1689672545763e-05;8.418600918958e-05;0.00010232676140731;-0.00010775223199744;0.00013427913654596;-9.7742929938249e-05;-5.5021348089213e-05;-2.6148949473281e-05;0.0006275586783886;2.2077740140958e-05;-0.00015485844051;2.6608195184963e-06;2.1228494006209e-05;1.0576462955214e-05;-4.3607815314317e-05;-2.6785810405272e-05;0.00011632223322522;-4.7822119086049e-05;-0.0002538388944231;-2.286805465701e-05;0.00015597048331983;-2.8859767553513e-05;-0.00011978454131167;1.4584443306376e-05;7.2317689046031e-06;3.6046953027835e-05;-0.00021707298583351;-8.6785667008371e-06;-0.00036958258715458;-1.0085837857332e-05;-9.5223476819228e-06;2.8796594051528e-05;-9.7510113846511e-05;5.7916611694964e-05;0.00011590096983127;-6.3200794102158e-05;3.5413420846453e-05;-8.1802521890495e-05;-2.2461324988399e-05;0.00064325297717005;1.8413840734866e-05;0.00016093741578516;-3.8557650441362e-06;-8.7868800619617e-05;1.0521274816711e-05;7.0291796873789e-05;-1.6918580513448e-05;6.3023479015101e-05;-5.9385438362369e-05;-0.00026716131833382;-6.543991912622e-05;-0.00034911266993731;3.8243299059104e-05;8.7890752183739e-05;-5.9851641708519e-05;0.00010458230099175;7.4752296086444e-07;-0.00020051778119523;4.6082909648248e-06;0.00072840927168727;3.3100066502811e-05;-0.00013022046186961;0.00019633634656202;6.0936366935493e-05;-0.00013665024016518;-7.5924894190393e-05;-4.0487349906471e-05;0.00011255482240813;4.8654881538823e-05;5.854467235622e-05;0.00036254961742088;-3.5028930142289e-05;-9.6999909146689e-05;-3.5104947073705e-06;-0.00014143285807222;-1.2362288543954e-05;-0.0002091769274557;-3.5839357792611e-07;-8.7032276496757e-06;3.4458666050341e-05;-0.00043740207911469;7.379303133348e-05;-0.00033083313610405;-2.3467528080801e-05;0.00014008792641107;4.1159335523844e-05;-9.5338342362083e-05;1.5009183698567e-05;-1.2397616728776e-06;-2.7215164664085e-05;-0.00032277705031447;-1.7054368072422e-05;0.00012794078793377;0.00012956031423528;0.00011975992674707;7.8520410170313e-05;-0.0001556014030939;0.00012670752767008;-0.0001040134957293;-5.4777934565209e-05;-2.276939994772e-05;0.00098237919155508;2.2868061932968e-05;-0.00030396546935663;-1.7152860891656e-06;5.9330530348234e-05;1.7983156794799e-05;-6.2325940234587e-05;-5.0030830607284e-05;0.00016150820010807;-6.7051405494567e-05;-0.00037692530895583;9.4219130915008e-06;0.00015578769671265;-3.3931803045562e-05;-0.00023849647550378;-3.1273677905119e-06;4.1245639295084e-05;6.1991049733479e-05;-0.00030688272090629;-1.2117705409764e-05;-0.00062246882589534;-5.7111242313113e-07;-5.8559700846672e-05;0.00010203586134594;-5.4715445003239e-05;0.00012757413787767;9.4959243142512e-05;-0.00012816266098525;-7.6429541877587e-06;-0.00012634297308978;-3.6956993426429e-05;0.00091364642139524;1.3666495760845e-05;0.00038294732803479;-9.7962301879306e-06;-4.5037315430818e-05;1.1385016478016e-05;0.00010264883894706;-3.2703541364754e-05;0.00011309744877508;-4.6216489863582e-05;-0.00021850415214431;-7.3847331805155e-05;-0.00051834399346262;4.2404364648974e-05;2.3963526473381e-05;-8.2738253695425e-05;0.00018022168660536;1.2603509276232e-06;-0.00024881673743948;-3.1786996260053e-05;0.00095185468671843;3.529186869855e-05;-0.00021373592608143;0.00011256378638791;-2.4890408894862e-05;-0.00016770498768892;-3.5084751289105e-05;9.455144754611e-05;0.00011790477583418;0.00019524182425812;6.7206150561105e-05;0.0002565719478298;-2.0021821910632e-05;-4.0526680095354e-05;1.6013249478419e-05;-0.00020213142852299;6.7817990156982e-07;-0.00025177182396874;-2.5300794732175e-05;4.5005923311692e-05;9.7156032552448e-07;-0.00055514421546832;6.4092018874362e-05;-0.00035741840838455;-1.5321745649999e-06;0.0002505234151613;4.3799282138934e-05;-9.1669549874496e-05;3.3805234124884e-05;-0.00016856563161127;-3.0849114409648e-05;-0.00029593202634715;-2.293417310284e-05;0.00013148551806808;0.00022557693591807;0.00013655310613103;-1.5569847164443e-05;-0.00018372574413661;6.4540465245955e-05;-6.6569402406458e-05;-1.8988779629581e-05;-4.7815824473219e-06;0.001246724743396;1.3759349712927e-05;-0.00045795430196449;-1.0121306331712e-05;0.0001007883111015;2.5381092200405e-05;-7.5949908932671e-05;-7.5837488111574e-05;0.00018800813995767;-7.0245121605694e-05;-0.00046303033013828;7.6112344686408e-05;1.1895120223926e-05;-2.741969001363e-05;-0.00038947787834331;-3.8481168303406e-05;9.4762639491819e-05;8.7486376287416e-05;-0.00038036546902731;-1.4063919479668e-05;-0.00086110254051164;1.843172867666e-05;-0.000121289602248;0.00018880092829932;4.5924858568469e-05;0.0002124504535459;1.291209628107e-05;-0.00017056557408068;-9.9908327683806e-05;-0.00012337425141595;-5.4926771554165e-05;0.0011206878116354;-1.9264839465905e-06;0.00066613778471947;-1.6483047147631e-05;5.5071890528779e-05;8.7003709268174e-06;0.00012111508112866;-3.1735409720568e-05;0.00013751731603406;-2.1103511244291e-05;-9.5462301032967e-06;-0.00014399834617507;-0.00046512886183336;2.3285634597414e-05;1.5079077456903e-05;-9.7464013379067e-05;0.00024186767404899;-1.7886728528538e-05;-0.00023380015045404;-7.3581839387771e-05;0.0014172939117998;3.2440369977849e-05;-0.00030230908305384;-5.5737324146321e-05;-0.00010649983596522;-0.00018297151837032;7.1393871621694e-05;0.00017359576304443;0.00016647868324071;0.00021561060566455;8.84245018824e-05;-0.00018200169142801;2.1134563212399e-05;-9.0268993517384e-05;4.4384636566974e-05;-0.00032083207042888;1.1736414307961e-05;-0.00032537744846195;-5.413786493591e-05;0.00010724132152973;-3.158627441735e-05;-0.00061286549316719;2.4739871150814e-05;-0.00028792110970244;1.907176374516e-05;0.00039077995461412;3.2398176699644e-05;-4.9875070544658e-05;5.0620288675418e-05;-0.00039343000389636;-4.9942933401326e-05;-0.00013594377378467;-2.6066792997881e-05;0.00010423985804664;0.00030231894925237;0.00016706474707462;-0.00012462559971027;-0.00019148591673002;-4.2365696572233e-05;-8.1373991633882e-06;-2.8760250643245e-05;2.8327947802609e-05;0.0014245710335672;1.4429070688493e-05;-0.00067679909989238;-1.4506483239529e-05;0.00019362178863958;3.8826528907521e-05;-0.00016980149666779;-9.019322169479e-05;0.0002009971649386;-8.6815765826032e-05;-0.00053785950876772;0.0001281208533328;-0.00016071544087026;-2.1750274754595e-05;-0.00061387836467475;-7.8635974205099e-05;0.00018383594579063;0.00010230620682705;-0.00040107974200509;-3.1265772122424e-05;-0.0010297797853127;3.54303556378e-05;-0.00016837628209032;0.00025691217160784;6.3245228375308e-05;0.00027608266100287;-3.2202395232162e-05;-0.00016217899974436;-0.00016721519932617;-2.9965274734423e-05;-5.5186897952808e-05;0.0012295549968258;-1.2190468623885e-05;0.0010047338437289;-1.5621173588443e-05;0.00014237940195017;1.4549378647644e-05;5.6762408348732e-05;-8.6316822489607e-06;9.1300542408135e-05;-3.1488466447627e-06;0.00023099384270608;-0.00020861264783889;-7.4572686571628e-05;-8.8188517111121e-06;0.00010644146823324;-6.9935260398779e-05;0.00019507843535393;-4.0767252357909e-05;-0.00012246074038558;-8.5937412222847e-05;0.0014753806171939;1.5335866919486e-05;-0.00025240718969144;-0.0001805654464988;-0.00010884659423027;-0.00016140940715559;0.00016227214655373;8.7642009020783e-05;0.00020514467905741;4.6043842303334e-05;0.00010111185110873;-0.00062290107598528;6.0195565311005e-05;-0.00025826838100329;5.4417727369582e-05;-0.00032543708221056;1.6727362890379e-05;-0.00031536538153887;-5.5699336371617e-05;0.00011035361967515;-4.1748800867936e-05;-0.0004422768834047;-1.2128231901443e-05;-0.00014423676475417;2.483286698407e-05;0.00034610589500517;1.7253294572583e-05;-6.5364083638997e-06;4.6471170207951e-05;-0.00044286038610153;-5.1571678341134e-05;2.8260345061426e-05;-2.3586970200995e-05;0.00010183375707129;0.00025433939299546;0.00013323601160664;-0.00015461732982658;-0.00013201133697294;-0.00010739800927695;2.9682445529033e-05;-1.7291140466114e-05;4.2505984310992e-05;0.001093951635994;1.5809746400919e-05;-0.00063668185612187;-1.3688244507648e-05;0.0002498691319488;4.0083312342176e-05;-0.00025225515128113;-6.3594066887163e-05;0.00014350324636325;-8.4216226241551e-05;-0.00043051643297076;0.00010000839392887;-0.00019635373610072;-1.7958509488381e-05;-0.0005777885671705;-7.6704476668965e-05;0.0001926915574586;7.1567104896531e-05;-0.00023979964316823;-4.7905967221595e-05;-0.00073172425618395;3.0872033676133e-05;-0.00012225657701492;0.00021190292318352;-5.6421699810016e-06;0.00021181674674153;-2.01905349968e-05;-7.5650328653865e-05;-0.0001267067855224;7.5733863923233e-05;-2.0078015950276e-05;0.00085780821973458;-4.3744630602305e-06;0.00086315191583708;-2.1846551589988e-06;9.9090306321159e-05;2.0441875676624e-05;-3.4942735510413e-05;-6.9831796281505e-05;1.0416973964311e-05;0.00027062735171057;9.0859022748191e-05;0.00038447449333034;7.1451060648542e-05;-0.00016379228327423;-6.5708001784515e-05;-7.7214725024533e-05;2.2716134481016e-05;0.00025884553906508;-4.0284894566867e-06;-0.00092531117843464;1.1526536582096e-05;2.1871383069083e-05;6.0977788507444e-07;-0.00020446252892725;8.1058708019555e-05;0.00027850628248416;-1.1910497960343e-05;2.7774431146099e-05;-0.00029134948272258;-0.00014919388922863;-0.00033182819606736;-7.3628259997349e-05;0.0003967389347963;2.6326082661399e-05;0.00012642149522435;6.0255438256718e-06;0.0002934084914159;-1.1398948117858e-05;-0.00010991655290127;4.7314337280113e-05;-0.00056962360395119;-4.8373029130744e-05;-0.00058140221517533;7.7768570918124e-05;0.00011787410039688;4.0490893297829e-05;-7.5816104072146e-05;4.0068764064927e-05;0.00018783018458635;-2.2790785806137e-05;-0.00044957411591895;-2.5862980237434e-06;0.00012307953147683;-1.2642114597838e-05;0.00028224513516761;5.9053039876744e-05;-7.5400355854072e-05;0.00010585597192403;-0.00017888602451421;0.00020290251995903;-7.0933063398115e-05;0.0011054403148592;3.7799105484737e-05;-0.00017446036508773;-3.1218343792716e-05;1.2385473382892e-05;-2.3297025109059e-06;-4.2536565160844e-05;8.381281986658e-06;0.00024832939379849;-7.1525384555571e-05;-0.00059163098921999;-3.324041608721e-05;-0.00056703534210101;3.0620438337792e-05;-0.00019780965521932;-2.6894924303633e-05;3.704775008373e-05;2.8079577987228e-06;-0.00049710832536221;5.6796958233463e-05;-0.00066796672763303;-3.1629348086426e-05;-9.3712558737025e-05;-5.9324925132387e-06;9.3159986136016e-05;-0.00010243873839499;4.8894860810833e-05;0.00013956514885649;3.0133109248709e-05;0.00015130666724872;-1.0296846994606e-05;0.0015519554726779;-3.4717759263003e-05;0.0004452581924852;2.0735109501402e-05;-0.00010958233906422;5.6532976486778e-06;0.00016148951544892;1.7768068573787e-05;-6.5907290263567e-05;7.8833018051228e-06;0.00037130777491257;0.00011390812869649;0.00046552190906368;7.1124442911241e-05;-0.00016553844034206;-7.7888937084936e-05;-8.7317464931402e-05;3.6395278584678e-05;0.00028379511786625;-5.4615711633232e-06;-0.00098235486075282;1.2325550642345e-06;4.0029539377429e-05;-9.5944287750171e-06;-0.0002868568408303;4.6141700295266e-05;0.00028759578708559;3.2512085454073e-05;5.9484762459761e-05;-0.00029712088871747;-0.00015081356104929;-0.00050212437054142;-8.3566890680231e-05;0.00038968544686213;4.169349631411e-05;0.0001510040165158;1.2338240594545e-05;0.00030638216412626;-3.4901788694697e-06;-0.00012592443090398;5.4087904572953e-05;-0.00065179006196558;-3.8322275941027e-05;-0.00064891244983301;8.8003682321869e-05;0.00015662613441236;3.3158394217025e-05;-0.00010497672337806;5.0497448683018e-05;0.00024199516337831;-2.857371691789e-05;-0.00052202498773113;-6.6806592258217e-06;0.00013987855345476;-1.3560008483182e-05;0.00029513385379687;8.6249987361953e-05;-5.1983039156767e-05;0.00013931888679508;-0.00020387829863466;0.00017128382751253;-9.2109396064188e-05;0.0012876003747806;3.6507160984911e-05;-0.00023014574253466;-2.6827878173208e-05;-1.2954261364939e-05;2.4431510610157e-06;-3.1739324185764e-05;7.6187188824406e-06;0.00028065836522728;-7.6592674304266e-05;-0.0006380692939274;-3.8845177186886e-05;-0.00048175107804127;1.7752407075022e-05;-0.00020301149925217;-4.4279047870077e-05;2.9686310881516e-05;1.0115156328538e-05;-0.00058129866374657;6.3297789893113e-05;-0.00076535460539162;-3.1092626159079e-05;-9.8226577392779e-05;-6.6425836848794e-06;8.4344486822374e-05;-0.00011474149505375;7.3680188506842e-05;0.00010801609460032;6.3549545302521e-05;8.2209568063263e-05;8.3413360698614e-06;0.001728632603772;-4.2358627979411e-05;0.00046474867849611;2.7721351216314e-05;-0.00012856694229413;5.4222400649451e-06;0.00018524714687373;1.7407634004485e-05;-3.176806421834e-05;-2.4061068870651e-07;0.00041578599484637;0.00010929391282843;0.00043882170575671;4.1331430111313e-05;-0.00011665798956528;-7.1295515226666e-05;-6.2559483922087e-05;4.0794486267259e-05;0.0002076442760881;-5.7019237829081e-06;-0.00067672075238079;-1.9442873963271e-05;4.8109159251908e-05;-2.0851322915405e-05;-0.00032076810020953;-2.5019802706083e-05;0.00020260828023311;8.6406529590022e-05;9.3396833108272e-05;-0.00020568369654939;-9.738166409079e-05;-0.00062642776174471;-6.7111192038283e-05;0.00024057757400442;5.3423100325745e-05;0.00013890159607399;1.9423898265813e-05;0.00019966166291852;1.145029636973e-05;-0.00011074153007939;4.7297631681431e-05;-0.00051122135482728;-3.7426077597047e-06;-0.00053357263095677;7.0325921115e-05;0.0001501610968262;1.2493714166339e-05;-0.00010753717651824;4.5460627006833e-05;0.0002563898160588;-2.9045173505438e-05;-0.00044134625932202;-9.4586430350319e-06;0.0001020835552481;-9.2818845587317e-06;0.00018695073958952;9.3740920419805e-05;3.9427764022548e-06;0.00014778121840209;-0.00015898079436738;6.982955528656e-05;-9.6283212769777e-05;0.0010597052751109;1.883251752588e-05;-0.00020246932399459;-1.0495235983399e-05;-5.6141241657315e-05;9.8956597867073e-06;2.6811849238584e-06;2.7448693344923e-06;0.00023272608814295;-5.7358487538295e-05;-0.00046017896966077;-2.6429679564899e-05;-0.00020919332746416;-9.8598984550335e-06;-0.00013470299018081;-5.3212148486637e-05;2.5163633381453e-06;2.1514451873372e-05;-0.00053362868493423;5.0918988563353e-05;-0.00063004839466885;-1.5203175280476e-05;-5.483160566655e-05;-7.8855855463189e-06;1.8597836970002e-05;-0.00010441623453517;7.7300908742473e-05;3.7260397220962e-05;0.00010165164712816;-3.1182593374979e-05;3.4947483072756e-05;0.0013965697726235;-4.4718231947627e-05;0.00031124756787904;2.8695647415589e-05;-9.6477597253397e-05;1.9734270608751e-06;0.00014326091331895;1.014612189465e-05;1.7352351278532e-05;-1.4423000720853e-05;0.00038653818774037;0.00010289048077539;0.0002987704356201;2.936919372587e-05;-0.00011709536192939;-6.2168721342459e-05;-2.6197023544228e-05;3.3516069379402e-05;0.00011233305849601;-9.9942008091602e-07;-0.0004523178213276;-3.9041995478328e-05;1.8507089407649e-05;-2.4660546841915e-05;-0.00032724553602748;-8.0950776464306e-05;0.00014537305105478;0.0001574071648065;0.00010713255323935;-9.6184601716232e-05;-7.0469061029144e-05;-0.00059463654179126;-5.6074906751746e-05;0.00020421195949893;5.961861461401e-05;0.00010708344052546;2.6485764465178e-05;0.0001332409447059;2.2634987544734e-05;-0.00011570995411603;4.6741675760131e-05;-0.00035935215419158;1.8897897462011e-05;-0.00041264595347457;5.990894351271e-05;9.9384480563458e-05;-3.2376706258219e-06;-9.9353776022326e-05;3.7283240089891e-05;0.00032192395883612;-3.0586361390306e-05;-0.00036224696668796;-9.6306821433245e-06;8.2445214502513e-05;-3.9816504795454e-06;9.8357828392182e-05;8.3024788182229e-05;5.5394830269506e-05;0.00015188354882412;-0.0001166248039226;9.2625659817713e-06;-0.00010222062701359;0.00073228619294241;5.4756956160418e-06;-0.00012266205158085;-6.6189625158586e-07;-8.194605470635e-05;1.4331920283439e-05;5.6857420531742e-06;-1.4279387414717e-06;0.00017948307504412;-3.4539552871138e-05;-0.00032268845825456;-1.8892924344982e-05;-6.1123173509259e-05;-3.969614408561e-05;-5.0073169404641e-05;-5.4417127103079e-05;-1.9495711967465e-05;3.4112235880457e-05;-0.00042299932101741;3.3128715585917e-05;-0.00042292755097151;-8.3206887211418e-06;-1.3694646440854e-05;-1.2675961443165e-05;-3.7213554605842e-05;-0.00012841327406932;3.8477865018649e-05;3.4995373425772e-05;0.00012991481344216;-6.0430666053435e-05;7.6772004831582e-05;0.0010681342100725;-3.4687429433689e-05;0.00012743237311952;3.0261277061072e-05;-0.00012988467642572;3.4489880818001e-06;0.00010841932089534;7.5937778092339e-06;1.8328024452785e-05;-2.7079726351076e-05;-8.2341088273097e-05;-0.0003440479922574;-5.0440510676708e-05;-0.00020004399993923;4.3532454583328e-05;0.00020149582996964;-1.9837592844851e-05;1.2173240065749e-05;-1.5104631529539e-05;-5.6417022278765e-05;4.0729079046287e-05;0.00046003141324036;2.1541218302445e-05;-1.0692529031076e-05;0.00029176266980357;9.6223790023942e-05;-0.0001628425961826;-0.00012459875142667;-0.00012655957834795;0.00012585375225171;-1.7411637600162e-05;6.5523468947504e-05;0.00045415904605761;-5.7326989917783e-05;-0.00024387851590291;-2.1808866222273e-05;-9.3284143076744e-05;-1.94515378098e-05;-0.00015818630345166;3.8252313970588e-05;-0.00010007125820266;5.8155830629403e-05;-0.00026422945666127;7.7181990491226e-05;-0.00034447555663064;-3.029348954442e-05;2.2644499040325e-06;3.0483874070342e-05;-8.1360100011807e-05;-1.337518915534e-05;0.00032027252018452;-1.4749764886801e-05;-0.00036250837729312;-7.7338991104625e-06;9.4397735665552e-05;2.7027146643377e-05;7.5682291935664e-05;0.00013470067642629;-0.0001145360947703;0.00019049264665227;-0.00012656071339734;-2.2792981326347e-05;-3.1788938940736e-05;0.00052567629609257;1.9446268197498e-05;-2.9697797799599e-05;5.5722243814671e-06;-5.2813422371401e-05;7.1206409302249e-06;-9.7398897196399e-06;-2.550178396632e-05;0.00014263963385019;-3.6792480386794e-05;-0.00027321971720085;-4.6314064093167e-05;5.8771738622454e-06;-2.8684982680716e-05;-7.2012262535281e-05;2.9959268431412e-05;-1.3751212463831e-05;3.1752551876707e-05;-0.00029952291515656;-1.07115620267e-05;-0.00035952043253928;-2.0898061848129e-05;5.9747012528533e-06;-3.2780790206743e-05;-0.00015445562894456;1.6957777916105e-05;0.00015815898950677;1.8953664039145e-05;6.3516912632622e-05;-1.5727404388599e-05;-2.5810664737946e-05;0.00085798453073949;2.8780803404516e-05;8.9014167315327e-05;1.3765255744147e-06;-0.00015709198487457;1.3214597856859e-05;0.00010863460920518;3.2605667001917e-06;1.8007005564868e-05;-9.5638293714728e-05;-0.00041067771962844;-5.8471672673477e-05;-0.00037556973984465;5.8289595472161e-05;0.00020422638044693;-3.5039131034864e-05;5.5706350394757e-05;-8.8664091890678e-06;-0.0001413538120687;2.3080714527168e-05;0.00065336062107235;2.4806573492242e-05;-5.320457421476e-05;0.00031397416023538;5.9157962823519e-05;-0.00022240122780204;-0.00012982545013074;-6.2865983636584e-05;0.00014915676729288;8.9933913841378e-05;8.1935853813775e-05;0.00054987927433103;-5.9648264141288e-05;-0.00025761904544197;-1.5657144103898e-05;-0.00012979276652914;-1.2509325642895e-05;-0.00021563518384937;3.4738197427941e-05;-9.1635934950318e-05;4.613961209543e-05;-0.00041273812530562;9.983960626414e-05;-0.00047431452549063;-1.9814322513412e-05;4.6716992073925e-05;4.0615952457301e-05;-9.9711047369055e-05;-7.1667909651296e-06;0.00027091256924905;-1.4620284673583e-05;-0.00046110796392895;-1.2640087334148e-05;0.00012082222383469;0.00010101118095918;8.8225060608238e-05;0.00010581321112113;-0.00016299374692608;0.00021192156418692;-0.00013633993512485;2.6917687137029e-05;-2.8891354304506e-05;0.00084017455810681;1.102082660509e-05;-9.8361990239937e-05;9.4407062078972e-07;-2.8781894798158e-05;1.1173105121998e-05;-7.8684306572541e-06;-5.2951334509999e-05;0.0001971842139028;-4.6372198994504e-05;-0.00040382382576354;-1.1500083928695e-05;-7.650409679627e-05;-2.9294289561221e-05;-0.0001601686963113;1.8528720829636e-05;5.3221874622977e-06;5.8813842770178e-05;-0.00041174239595421;-1.2859006346844e-05;-0.00058105803327635;-1.5414587323903e-05;-2.497431160009e-05;2.8902271878906e-05;-0.00011958756658714;6.6345448431093e-05;0.00013055859017186;-7.4845979725069e-06;1.9600267478381e-05;-1.7826638213592e-05;-4.5041935663903e-05;0.0011730338446796;2.5088653273997e-05;0.00025631865719333;-4.0038689803623e-06;-0.00012036473344779;1.4020063645148e-05;0.00014725539949723;-1.9320053979754e-05;7.9660116170999e-05;-9.232314187102e-05;-0.00043287515291013;-5.0369930249872e-05;-0.00059623050037771;7.0430331106763e-05;0.00015100154269021;-5.0804213969968e-05;0.00011453626939328;1.2085464504707e-06;-0.00022158712090459;-8.7680000433465e-06;0.00077972968574613;2.4118688088492e-05;-0.00010995778575307;0.00027426154701971;-2.8897342417622e-05;-0.00026982693816535;-0.00011145103053423;7.7404496551026e-05;0.00014917967200745;0.0002677121956367;8.7076645286288e-05;0.00058442493900657;-5.2651896112366e-05;-0.0002053602511296;-2.0729826246679e-06;-0.00016277920803986;1.5491754083996e-06;-0.0002470183535479;1.8945143892779e-05;-5.441081157187e-05;1.5986071957741e-05;-0.00054666504729539;0.00011042731057387;-0.00057407061103731;4.423146492627e-06;0.00011315674782963;4.5767592382617e-05;-0.00010408776870463;6.309825948847e-06;0.00014662917237729;-9.3194767032401e-06;-0.00050706689944491;-1.690491080808e-05;0.00012193084694445;0.00019331047951709;8.6165382526815e-05;2.6491999960854e-05;-0.00019937747856602;0.00019542301015463;-0.00011631529923761;0.00010378939623479;-1.8577409719001e-05;0.0011201550951228;-6.6021457314491e-06;-0.0001722617453197;-7.5015991569671e-06;-4.3868017201021e-06;1.4195600670064e-05;1.4441127859754e-05;-8.5539853898808e-05;0.00023789351689629;-4.2709827539511e-05;-0.00050697196274996;5.7336928875884e-05;-0.00024964121985249;-1.8268425264978e-05;-0.00026948744198307;-6.9368188633234e-06;3.628051126725e-05;8.9711662440095e-05;-0.00051714008441195;-8.099821570795e-06;-0.00081772572593763;-1.3136706229488e-06;-7.4946030508727e-05;0.0001121505338233;-2.4412720449618e-05;0.00013186220894568;4.6556237066397e-05;-3.5078552173218e-05;-7.0129535743035e-05;1.0997166555171e-06;-7.2677670686971e-05;0.001436433638446;8.3334307419136e-06;0.0004843081405852;-1.3685080375581e-05;-1.9786504708463e-05;1.0131949238712e-05;0.00018245237879455;-3.3979184081545e-05;0.00011578259000089;-7.3501425504219e-05;-0.00036691437708214;-4.9473397666588e-05;-0.00064985896460712;6.848818884464e-05;0.00010932811710518;-5.4997668485157e-05;0.00014055769133847;7.7965978562133e-06;-0.0002570268989075;-2.8863014449598e-05;0.00082403561100364;1.9741748474189e-05;-0.00013885804219171;0.0001944002287928;-8.6925523646642e-05;-0.00027254267479293;-7.220204861369e-05;0.00015779380919412;0.0001391107798554;0.00034311434137635;7.8084980486892e-05;0.00049308780580759;-3.7696467188653e-05;-0.00016731375944801;7.8446119005093e-06;-0.00017259822925553;1.0508081686567e-05;-0.00024692350416444;-3.4736589782369e-07;-9.6805842986214e-06;-4.7646312850702e-06;-0.00057649990776554;0.00010298232518835;-0.00059079908533022;2.3107335437089e-05;0.00015495350817218;4.4518761569634e-05;-9.3574555648956e-05;1.9717339455383e-05;-6.3178283937759e-08;-5.460606644192e-06;-0.00046605864190497;-1.9478446120047e-05;0.00011381007789169;0.00023243077157531;7.1978451160248e-05;-4.1393366700504e-05;-0.00019859174790327;0.00016224864521064;-8.6908148659859e-05;0.00015491635713261;-1.1938804163947e-05;0.0012159048346803;-1.7005952031468e-05;-0.00022073132277001;-1.392387002852e-05;3.8682886952301e-05;1.6346255506505e-05;5.6226986089314e-06;-9.7453783382662e-05;0.00023636993137188;-3.7627996789524e-05;-0.00052024266915396;9.9803706689272e-05;-0.00033109830110334;-1.0527006452321e-05;-0.00033153616823256;-2.5025005015777e-05;5.9129335568286e-05;0.00010076884791488;-0.00052045250777155;-5.8708224059956e-06;-0.00087764317868277;9.134672836808e-06;-9.2229369329289e-05;0.00015875688404776;3.6805708077736e-05;0.00016671563207638;-1.5421595890075e-05;-4.7095600166358e-05;-0.00012376510130707;1.8395272491034e-05;-8.2207458035555e-05;0.0014314319705591;-3.9539140743727e-06;0.00059475423768163;-1.8593078493723e-05;5.4025298595661e-05;7.5621815085469e-06;0.00016708990733605;-6.7193919676356e-05;1.299329505855e-05;0.00064768537413329;0.00012991957191844;0.00077608862193301;-2.1096660930198e-05;-0.00017901026876643;-0.00011587386688916;-1.1838177670143e-05;-5.7609518080426e-06;0.00029872916638851;-2.2057285605115e-05;-0.00036839130916633;-2.0385405150591e-05;-6.1502745666075e-05;9.5493078333675e-06;-0.00041513869655319;6.8616558564827e-05;0.00034762991708703;-7.2121387347579e-05;0.00015640120545868;-0.00049514236161485;-9.0097455540672e-05;-0.0010935688624159;-6.2938845076133e-05;0.00032828049734235;7.53948406782e-05;4.5072800276102e-05;2.9241817173897e-05;0.0001849526015576;-8.4374369180296e-06;-0.00022182072279975;9.5639887149446e-05;-0.00049136369489133;-3.2741787435953e-05;-0.00083235133206472;0.00011686834477587;-4.936479308526e-05;5.445841816254e-05;-6.8927678512409e-05;2.7903055524803e-05;0.00054647208889946;-5.1592582167359e-05;-0.0006603169022128;2.089110603265e-05;4.2682178900577e-05;-2.0963132385532e-07;0.00020635081455112;-2.5722515601956e-06;-2.5402170649613e-05;0.00025541850482114;-0.00016739146667533;0.00034461825271137;-0.00013088253035676;0.0008670711540617;2.4875138478819e-05;0.00021793633641209;-5.4422413086286e-05;-0.00014998436381575;3.0101575703156e-06;0.0001234304800164;-8.2815968198702e-06;0.00029804615769535;-8.665047789691e-05;-0.00057041522813961;8.8682663772488e-06;-0.00076692027505487;1.0839169590326e-05;-3.7283360143192e-05;-1.0001728696807e-05;-4.1692997911014e-05;4.0190956497099e-05;-0.00071189063601196;6.2025530496612e-05;-0.00064592622220516;-8.9007035057875e-06;-2.56087660091e-05;-2.7875938030775e-05;7.5123830356461e-06;-0.00012216616596561;-3.519050005707e-05;0.00021297771309037;5.3254301747074e-05;0.00022834411356598;1.0966992704198e-05;0.0018482477171347;-6.2864564824849e-05;0.00020491649047472;2.6058723960887e-05;-8.70519070304e-05;3.0753071200706e-07;0.00021573599951807;1.2147382221883e-05;-3.4652196063689e-06;-1.3005193977733e-05;0.00050681497668847;0.0001314847759204;0.00049902824684978;2.1993091650074e-05;-0.0001913094019983;-9.0592977358028e-05;-2.1345551431295e-05;5.4881088544789e-06;0.0001597624795977;-1.1700566346917e-06;-0.0005364331882447;-1.9505840100464e-05;-4.7901979996823e-05;-7.8752327681286e-07;-0.00038153424975462;2.8304160878179e-05;0.00029758390155621;3.2295036362484e-05;0.00012554424756672;-0.00032746911165304;-0.00011935480142711;-0.00073905265890062;-8.1937854702119e-05;0.00037605524994433;6.4251813455485e-05;9.0914385509677e-05;2.4007924366742e-05;0.00021202058997005;-6.8336044023454e-07;-0.00021122545877006;8.6047446529847e-05;-0.00047941575758159;-2.7264353775536e-05;-0.00064323784317821;0.00010265435412293;-2.4153887352441e-06;3.1227980798576e-05;-7.6670119597111e-05;2.960636811622e-05;0.00057293812278658;-4.7602741688024e-05;-0.00056383915944025;7.0937107921054e-06;6.265465344768e-05;1.0752768275779e-06;0.000210086160223;3.7076326407259e-05;9.2264353952487e-06;0.00020447978749871;-0.00017097507952712;0.00021085128537379;-0.00011967639875365;0.00076133041875437;2.8375843612594e-05;9.9791133834515e-05;-3.848127744277e-05;-0.00015505537157878;6.8386580096558e-06;7.9366443969775e-05;-4.8614988372719e-06;0.00026184270973317;-6.6483524278738e-05;-0.0005419398075901;-8.104518201435e-06;-0.00065897556487471;-4.0371346585744e-06;-5.0828464736696e-05;-1.6314570530085e-05;-2.0917344954796e-05;3.4412136301398e-05;-0.00059414491988719;4.9485908675706e-05;-0.00058768439339474;-1.5714871551609e-05;-5.3568768635159e-05;-2.3261454771273e-05;3.0723633699381e-06;-0.00014964370348025;-3.5872351872968e-05;0.00020281948673073;7.5736970757134e-05;0.00020095273794141;3.632387961261e-05;0.0016888669924811;-4.5501925342251e-05;0.00022143259411678;2.5511209969409e-05;-0.00016032379062381;5.6493349802622e-06;0.00021336067584343;1.385016093991e-05;6.8911213020328e-05;-3.8347145164153e-05;0.00051907112356275;0.00013679638504982;0.00040777973481454;1.2970302122994e-05;-0.00016839023737703;-8.2061778812204e-05;-6.3614352256991e-06;1.2071727724106e-05;6.300554673544e-07;1.208083176607e-05;-0.00037680863169953;-3.8010206480976e-05;-3.5171920899302e-05;-1.3459412002703e-05;-0.00041951210005209;-4.051852010889e-05;0.00023097131634131;0.00010746437328635;0.00015343257109635;-0.00021881723660044;-9.3922324595042e-05;-0.00071867002407089;-8.3942737546749e-05;0.0002929198089987;7.546013512183e-05;0.00012121757026762;2.8442678740248e-05;0.0001395596191287;1.4214238944987e-05;-0.00021219886548351;8.1122299889103e-05;-0.00035437048063613;1.9275164504506e-06;-0.0004887756658718;8.3292092313059e-05;7.3194873948523e-06;1.0077921615448e-05;-7.7086282544769e-05;2.406166640867e-05;0.00066555198282003;-4.7987250582082e-05;-0.00046877609565854;-4.8554960585534e-07;3.4289936593268e-05;4.8083338697325e-06;0.00012697417696472;6.5855696448125e-05;6.375863449648e-05;0.00018247445404995;-0.00013703641889151;8.9425157057121e-05;-0.00012583259376697;0.00049985182704404;1.6752923329477e-05;9.2181137006264e-05;-1.9977049305453e-05;-0.00021912436932325;1.4016499335412e-05;9.4722206995357e-05;-6.8132922024233e-06;0.00021948599896859;-4.3552343413467e-05;-0.00039282909710892;-2.0820434656343e-06;-0.0004970098962076;-3.5370259865886e-05;-7.7565855463035e-06;-2.3388791305479e-05;-3.2831470889505e-05;4.2430616304046e-05;-0.00056249491171911;3.4655793569982e-05;-0.00048902828712016;-7.4886702350341e-06;-3.56219970854e-05;-2.5301491405116e-05;-6.8988956627436e-05;-0.00016058979963418;-4.1508628783049e-05;0.00016289579798467;0.00012616490130313;0.0001370849495288;6.508737715194e-05;0.0014842372620478;-4.2270847188774e-05;0.00012801733100787;2.9253602406243e-05;-0.00017115019727498;6.4919181568257e-06;0.00019324036838952;1.021836851578e-05;0.0001031257561408;-4.709913264378e-05;0.00046344703878276;0.00012329900346231;0.000295404024655;8.1689131548046e-06;-0.00014328166435007;-6.951361137908e-05;6.5210260800086e-06;1.523895025457e-05;-7.6205556979403e-05;1.6070714991656e-05;-0.0002477282541804;-5.0817223382182e-05;-2.8226659196662e-05;-2.0331141058705e-05;-0.00039812497561797;-8.9917433797382e-05;0.00016414506535511;0.00016210640023928;0.00015304160478991;-0.00011579933197936;-6.7251261498313e-05;-0.00064098014263436;-7.1717040555086e-05;0.00022301418357529;7.5825919338968e-05;0.00011588523193495;3.1306855817093e-05;8.6245439888444e-05;2.4147344447556e-05;-0.00018403789727017;6.6887776483782e-05;-0.00024098031281028;2.4236062017735e-05;-0.00036265928065404;6.4511550590396e-05;1.1241598258493e-05;-4.092851668247e-06;-7.3680770583451e-05;2.0321467673057e-05;0.000629102520179;-4.1174484067596e-05;-0.00036511663347483;-4.3593149712251e-06;2.6113802960026e-05;5.5148034334707e-06;5.4865384299774e-05;7.2866823757067e-05;9.2656526248902e-05;0.0001598361559445;-9.910280641634e-05;1.3066832252662e-05;-0.00012096355931135;0.0003162810462527;3.2080540677271e-06;7.1002345066518e-05;-5.4725210247852e-06;-0.00021686813852284;1.6511545254616e-05;7.7513948781416e-05;-7.2296811595152e-06;0.00016780798614491;-2.2919104594621e-05;-0.00025761526194401;-2.5038571038749e-07;-0.0002980082645081;-5.6946588301798e-05;2.6295128918719e-05;-3.1731229682919e-05;-3.8881622458575e-05;4.5510867494158e-05;-0.00046732285409234;2.0829023924307e-05;-0.00035361072514206;-2.7997448341921e-06;-1.258636257262e-05;-2.4064902390819e-05;-0.0001082704984583;-0.00015882280422375;-3.8708913052687e-05;0.00011833666212624;0.0001504347746959;6.258457142394e-05;8.8650755060371e-05;0.001168749993667;-3.3787488064263e-05;3.3247812098125e-05;3.0745493859285e-05;-0.00017412075249013;6.8374492911971e-06;0.00015303236432374;7.3846495070029e-06;5.65717164136e-05;-0.00011408366844989;-0.00010664058936527;-0.00047084069228731;-1.7106596715166e-05;-0.00024521310115233;5.5443066230509e-05;0.0002316870377399;-9.5845166470099e-07;-2.6997056920663e-05;-3.8643069274258e-05;0.0001240722485818;6.2765218899585e-05;0.00026691125822254;1.9777047782554e-05;3.5362310882192e-05;0.00038637727266178;9.3377166194841e-05;-0.00019043919746764;-0.00018842346617021;-0.00010908985859714;0.00012615266314242;2.4875651433831e-05;8.201235323213e-05;0.00056414882419631;-8.5984858742449e-05;-0.00026250333758071;-2.8984419259359e-05;-0.00011094483488705;-2.4373472115258e-05;-0.00010830718383659;6.9231464294717e-05;-0.00018117197032552;6.892740202602e-05;-0.00013962367665954;7.1436959842686e-05;-0.00029468809952959;-3.2330593967345e-05;-6.8366731284186e-05;1.5379257092718e-05;-5.8146717492491e-05;-3.5680401197169e-05;0.00065066659590229;-1.095172137866e-05;-0.00037289410829544;8.2250522837057e-07;2.3686470740358e-05;-3.0096560294623e-05;8.0156103649642e-05;0.00017138842667919;-8.9885354100261e-05;0.00018509807705414;-0.00014470911992248;-3.6602796171792e-05;-2.919801590906e-05;0.00013963779201731;1.8907094272436e-05;0.00014979638217483;1.2138976671849e-05;-0.00021050331997685;5.5768884976715e-07;7.701799768256e-05;-1.2957912076672e-05;0.00014376705803443;-8.9218356151832e-06;-0.00019065027299803;-7.5697462307289e-05;-0.00026251046801917;-1.1855060620292e-05;7.2330494731432e-06;4.4280255679041e-05;-3.6907607864123e-05;1.5902700397419e-05;-0.00039957932312973;-5.5121249715739e-06;-0.00030581105966121;-3.3881788112922e-05;4.9621876314632e-06;-0.00014327593089547;-0.00019831091049127;-5.6580563978059e-05;0.0002057736273855;0.00011602393351495;8.0047226219904e-05;0.00010996880882885;-2.8984452001168e-05;0.0010244817240164;3.5680095606949e-05;1.0823669981619e-05;7.2150883170252e-06;-0.00019847780640703;1.3201421097619e-05;0.00015055372205097;4.756634007208e-05;-8.05422605481e-05;-0.000128400453832;-0.00058027385966852;-7.4206791396136e-06;-0.00044217819231562;7.4021780164912e-05;0.00024132852558978;-3.8496050365211e-06;-5.9888102441619e-06;-3.3376629289705e-05;6.9277477450669e-05;4.6852706873324e-05;0.00034317164681852;1.8090373487212e-05;2.0922414478264e-05;0.00043270250898786;3.8001155189704e-05;-0.00026015524053946;-0.00020779223996215;-2.1922136511421e-05;0.00014197413111106;0.00016678091196809;9.9783530458808e-05;0.00071672676131129;-9.3696035037283e-05;-0.00027990565286018;-2.4525625121896e-05;-0.00013485789531842;-1.5500563677051e-05;-0.00013681437121704;8.3669488958549e-05;-0.00020821177167818;5.1569393690443e-05;-0.00023247276840266;9.2658170615323e-05;-0.00040862875175662;-1.8090326193487e-05;-6.8034067226108e-05;1.8058439309243e-05;-6.2255829107016e-05;-4.4579632231034e-05;0.00069758930476382;-6.0121724345663e-06;-0.00047583182458766;9.1190406692476e-07;1.7329031834379e-05;2.692177076824e-05;7.9549216025043e-05;0.00014700792962685;-0.00012546010839287;0.00020541847334243;-0.00015500618610531;2.9937060389784e-05;-1.7940808902495e-05;0.00029418017948046;3.5991708955407e-06;0.00017650439986028;1.127825180447e-05;-0.00023020373191684;-2.7044810835264e-08;0.00011657281720545;-4.1308438085252e-05;0.00020208334899507;-4.152239398536e-06;-0.00030020563281141;-4.3370047933422e-05;-0.00046674106852151;-1.4829522569926e-06;-4.0860068111215e-05;3.9765218389221e-05;-3.2307227229467e-05;4.0160848584492e-05;-0.00054080068366602;-3.8330467759806e-06;-0.00048204883933067;-3.4041531762341e-05;-1.5344765415648e-05;-0.0001114008409786;-0.00017912936164066;-4.5559791033156e-05;0.00017962754645851;0.00013845320791006;3.7300793337636e-05;0.00017964858852793;-5.2664592658402e-05;0.0013669993495569;3.1975469028112e-05;0.00012776363291778;2.7460805540613e-06;-0.00015597349556629;1.341904498986e-05;0.0001912815059768;3.6789933801629e-05;-4.4277912820689e-05;-0.00015491618250962;-0.00067445263266563;-5.5527152653667e-06;-0.00063029589364305;9.9474294984248e-05;0.00028118665795773;-2.3480154140998e-06;1.2420258826751e-05;-2.5795578039833e-05;-2.5990726499003e-05;3.3108932257164e-05;0.00049687165301293;1.2446551409084e-05;3.688105425681e-05;0.00048403555410914;-2.8249251045054e-05;-0.00036311999429017;-0.00022242772683967;5.4537253163289e-05;0.00017360532365274;0.00033164577325806;0.00012106631766073;0.00085487979231402;-0.0001038931804942;-0.00037287216400728;-2.4199696781579e-05;-0.00012662539666053;-3.7547983993136e-06;-0.00022017750598025;0.00010444423242006;-0.0002497814130038;2.4746290364419e-05;-0.00038837824831717;0.00013344292528927;-0.0005779403145425;-2.0363690964587e-06;-9.6208503236994e-05;2.3286429495784e-05;-6.9992776843719e-05;-5.4990519856801e-05;0.00078791286796331;2.1421165001811e-06;-0.00063712120754644;2.437339617245e-06;3.5063469113084e-05;0.00012054160470143;5.7189310609829e-05;0.00012308629811741;-0.00018348450248595;0.000260645581875;-0.00017064737039618;0.00014028741861694;-4.9633868002275e-06;0.00049797241808847;-2.0869470972684e-05;0.00023339164908975;8.2693613876472e-06;-0.00024177857267205;-9.2900558001929e-07;0.00014426236157306;-7.3437186074443e-05;0.00027330595185049;-7.5326142905396e-06;-0.00048912694910541;-9.9572016551974e-06;-0.00073026906466112;7.1982444751484e-06;-7.355198613368e-05;3.5496901546139e-05;-2.5139484932879e-05;6.5605367126409e-05;-0.00064753339393064;-1.0816874237207e-05;-0.00065223901765421;-3.3552587410668e-05;-5.3131094318815e-05;-5.3075735195307e-05;-0.00017959697288461;-5.1497812819434e-05;0.00013838835002389;0.00020640750881284;1.0962836313411e-05;0.00027084528119303;-6.7439716076478e-05;0.0017786881653592;2.8404181648511e-05;0.00024077192938421;2.0066675006092e-06;-0.00017972270143218;1.6207046428462e-05;0.00026333201094531;-4.4241091927688e-06;4.4020722270943e-05;-0.00013345805928111;-0.0006642559892498;1.2663704183069e-05;-0.00078738038428128;0.00010663207649486;0.00022698071552441;-9.5534805950592e-06;4.2098901758436e-05;3.8651064642181e-06;-0.00017777767789084;1.358031113341e-05;0.00048872182378545;7.4726008278958e-06;6.2997137320053e-06;0.00042263479554094;-8.459478704026e-05;-0.00037438521394506;-0.00019565339607652;0.00015034980606288;0.00014707057562191;0.00045238499296829;9.4759270723443e-05;0.0009407980251126;-9.2298054369166e-05;-0.00030399765819311;-1.9850982425851e-05;-0.0001015480447677;7.0438281909446e-06;-0.00021819911489729;7.9076911788434e-05;-0.00018401778652333;7.8661969382665e-06;-0.00047911080764607;0.00014668199582957;-0.0007236641831696;2.2472104319604e-05;-6.0804984968854e-05;3.1823270546738e-05;-7.9729470598977e-05;-3.5063170798821e-05;0.00054286979138851;1.4967577044445e-05;-0.00067409418988973;-3.6859084957541e-06;5.4125965107232e-05;0.00016851074178703;2.1904670575168e-05;4.7653466026532e-05;-0.00019584184337873;0.00028006843058392;-0.00015323904517572;0.00025271598133259;-1.198115569423e-05;0.00079502578591928;-3.8414109440055e-05;0.00019116602197755;-2.1297528292052e-06;-0.00015479954890907;-3.3198728033312e-07;0.0001399790198775;-9.8431584774517e-05;0.00028824128094129;-2.0331410723884e-06;-0.00053928891429678;4.5345746912062e-05;-0.00071680312976241;7.2085358624463e-06;-0.00012923277972732;2.1666552129318e-05;-1.8416516468278e-05;8.9733090135269e-05;-0.00067198928445578;-2.5461461063969e-06;-0.00075376592576504;-2.2290743800113e-05;-5.086102464702e-05;2.542840775277e-05;-9.0735113190021e-05;1.1020465535694e-05;5.702349517378e-05;0.00015718472423032;-5.0920545618283e-05;0.00022273723152466;-8.9481531176716e-05;0.0017901766113937;1.4841968550172e-05;0.00032948513398878;-9.2583914010902e-06;-7.4642528488766e-05;1.1521745364007e-05;0.00024908225168474;-5.3170148021309e-05;8.8909164333018e-06;0.0008433458278887;0.00013197370572016;0.0010515734320506;-9.8562515631784e-05;-0.00011104316217825;-0.0001357641449431;1.7969297914533e-05;-1.4775983800064e-05;0.00024055253015831;-2.6829538910533e-05;9.5129697001539e-05;-3.8266422052402e-05;-5.4982498113532e-05;8.0300442277803e-06;-0.00048838398652151;6.8142857344355e-05;0.00032570853363723;-0.00017167649639305;0.00022911398264114;-0.00060943537391722;-1.5757223081891e-05;-0.0014845264377072;-4.2707833927125e-05;0.00011725351214409;0.00010314691462554;3.2565989386057e-05;3.6068246117793e-05;3.900499723386e-05;-2.5888100481097e-06;-0.00026817840989679;0.00011667074431898;-0.00028210383607075;-1.9019733372261e-05;-0.0007445789524354;9.4770235591568e-05;-0.00010663887223927;5.5041316954885e-05;-3.7764522858197e-05;8.0178115240415e-06;0.0007006514351815;-6.84904443915e-05;-0.00060099235270172;2.2621839889325e-05;-5.3516872867476e-05;7.0625310399919e-06;0.00010054812446469;2.2698259272147e-06;5.6217586461571e-06;0.00022830013767816;-0.00010915200255113;0.00031382503220811;-0.00014218805881683;0.00047138083027676;2.5530356651871e-05;0.00037535213050433;-4.9752907216316e-05;-0.00025848895893432;1.1219480256841e-05;0.00021662836661562;-1.464608067181e-05;0.00029583825380541;-8.7598411482759e-05;-0.00041773097473197;4.7068158892216e-05;-0.00086727406596765;4.3404288589954e-06;1.4088906937104e-05;1.1669810191961e-05;-7.3402261477895e-05;5.2359922847245e-05;-0.00085172231774777;6.0915921494598e-05;-0.00061399099649861;1.5179914043983e-05;1.7757038222044e-05;-3.8031415897422e-05;-8.6796550021973e-05;-0.00011383021774236;-7.0510453952011e-05;0.00022218648518901;7.9858415119816e-05;0.00028958101756871;-8.1078806033474e-06;0.0018429540796205;-8.776367030805e-05;0.00012148113455623;2.3220905859489e-05;2.9180255296524e-05;-7.1780777943786e-06;0.00019105251703877;5.2041359595023e-06;0.00014247726358008;-6.3933257479221e-05;0.00045315903844312;0.00012287509161979;0.00028318390832283;-7.6978121796856e-06;-0.00012770721514244;-6.4283987740055e-05;1.5059293218656e-05;4.1493844946672e-06;-0.00020632027008105;2.8402928364812e-05;-0.00012796009832527;-4.1788669477683e-05;-3.82109246857e-05;-1.5194064872048e-05;-0.0003845879691653;-6.0250487877056e-05;0.00016042609058786;0.00010475368617335;0.00015974399866536;-0.0001412433484802;-6.0127582401037e-05;-0.0005390722071752;-7.9252611612901e-05;0.00018827256280929;7.3886294558179e-05;0.00012918446736876;2.4575565475971e-05;4.9366455641575e-05;1.8114518752554e-05;-0.00020826475520153;7.2764662036207e-05;-0.00015605057706125;1.3730569662584e-05;-0.00024167761148419;5.6890465202741e-05;-3.2655687391525e-05;-2.4854948605935e-06;-4.1613944631536e-05;5.0217854550283e-06;0.00075436593033373;-4.396007352625e-05;-0.00030684398370795;-3.3822830118879e-06;-2.5371307856403e-05;1.0993021533068e-05;4.8853500629775e-05;7.119574729586e-05;9.5409784989897e-05;0.0001143422559835;-8.5927495092619e-05;-1.7360864603688e-06;-0.0001101163434214;8.1966109064524e-06;1.075988257071e-05;0.0001629371981835;-9.199569831253e-06;-0.00028674062923528;1.5690406144131e-05;0.00012300898379181;-8.1349626270821e-06;0.0001463604712626;-1.7250817109016e-05;-0.00020372081780806;8.5880601545796e-06;-0.00049054768169299;-4.8949739721138e-05;4.3959338654531e-05;-2.3793959371687e-06;-3.6262837966206e-05;4.0605304093333e-05;-0.00045944887096994;1.4076795196161e-05;-0.00031805882463232;-7.6960350270383e-07;-2.891342046496e-05;-2.7930575015489e-05;-0.00012156249431428;-0.00014052152982913;-8.2302787632216e-05;0.00014776914031245;0.00013279833365232;0.00017194989777636;5.9233618230792e-05;0.0011569244088605;-2.989321910718e-05;3.6683140933746e-05;2.4395456421189e-05;-0.00015937490388751;7.6833230195916e-06;0.00016930038691498;7.5598804869514e-06;0.00020591649808921;-8.5605024651159e-05;0.00046684304834343;0.00012829262414016;0.00023637690173928;-1.2294535736146e-05;-0.00012245059770066;-6.2496364989784e-05;2.4221519197454e-05;6.8740505412279e-06;-0.0003511268296279;4.0385519241681e-05;-4.1589828470023e-05;-5.5675431212876e-05;-2.9393886507023e-05;-2.2143030946609e-05;-0.00041482926462777;-0.00010291798389517;0.00013107474660501;0.0001496206241427;0.00018177747551817;-8.5542436863761e-05;-4.8527086619288e-05;-0.00051113491645083;-8.384782995563e-05;0.00014878020738252;8.3641127275769e-05;0.00016653815691825;2.8066457161913e-05;3.7845513816137e-06;2.7381516702008e-05;-0.00020727390074171;6.4946798374876e-05;-7.0573987613898e-05;3.5717006539926e-05;-0.00015784299466759;4.902188811684e-05;-3.3220720069949e-05;-1.033024636854e-05;-3.83841470466e-05;5.9323824075364e-08;0.00084160652477294;-3.9196667785291e-05;-0.00025022675981745;-6.1209070736368e-06;-4.5378888898995e-05;1.2143898857175e-05;-4.8476367737749e-06;9.5701318059582e-05;0.00012655493628699;9.2723501438741e-05;-6.5009844547603e-05;-6.256371125346e-05;-0.00012454426905606;-0.00017633683455642;-2.8945237318112e-06;0.0001723519526422;1.3818380466546e-06;-0.00033981760498136;1.7569263945916e-05;0.00013320983271115;-8.4244502431829e-06;0.00012018845154671;-9.8063094355894e-07;-9.4873954367358e-05;1.2346083167358e-05;-0.00045676392619498;-7.1029688115232e-05;6.8578388891183e-05;-2.316216523468e-06;-4.2229308746755e-05;4.6174161980161e-05;-0.00047288430505432;4.2317974475736e-06;-0.00026934663765132;3.230538823118e-06;-2.1684500097763e-05;-3.1712872441858e-05;-0.0001788966183085;-0.00014717348676641;-9.4518341938965e-05;0.00012531671382021;0.0001728979696054;0.00016180613602046;7.1907794335857e-05;0.0010974594624713;-2.7761474484578e-05;-9.7675920187612e-06;2.833596408891e-05;-0.00017080995894503;8.8495880845585e-06;0.00016465556109324;6.7709502218349e-06;0.00011106474266853;-0.00023424514802173;-0.00013925120583735;-0.00064714800100774;2.3713990231045e-05;-0.00033108043135144;6.8130299041513e-05;0.00024382675474044;1.0774344445963e-05;-5.6196215155069e-05;-7.6003547292203e-05;0.00040179019561037;8.6804764578119e-05;6.1735663621221e-05;2.5371109586558e-05;4.8906807933236e-05;0.00051134324166924;9.7655261924956e-05;-0.00021014689991716;-0.00027665935340337;-7.3149676609319e-05;0.0001255857932847;6.7722401581705e-05;0.0001105208939407;0.00067739275982603;-0.00012378199608065;-0.00022598255600315;-3.2521322282264e-05;-0.00018385812290944;-3.3583968615858e-05;-2.8730602934957e-05;9.8234515462536e-05;-0.0002687776577659;8.8990738731809e-05;1.4558835573553e-05;5.6939174100989e-05;-0.00016938491899054;-3.8495800254168e-05;-0.00011770181299653;-3.1835936624702e-06;-3.1282226700569e-05;-5.6714117818046e-05;0.0010518685448915;-1.3301991202752e-05;-0.00035157459205948;8.7310636445181e-06;-7.3887007602025e-05;-0.00010087689588545;0.00012691963638645;0.00022542195802089;-6.2553721363656e-05;0.00013713266525883;-0.0001735763362376;-0.00011186031770194;-2.8369928259053e-05;-0.00032367653329857;2.7893025617232e-05;0.00030501213041134;2.0506902728812e-05;-0.00042141697485931;-4.0227059798781e-06;0.00018844791338779;3.9458604987885e-06;0.00014408676361199;1.9127443010802e-05;-5.4723375797039e-05;-0.00011207754141651;-0.00057512399507686;1.453107688576e-05;6.6539789258968e-05;5.7561730500311e-05;-5.5404103477485e-05;-4.6268226583379e-07;-0.0005705893272534;3.0555252124032e-06;-0.00030873544164933;-5.0461556384107e-05;-7.8811335697537e-06;-0.0002834607148543;-0.00023122830316424;-0.00013188505545259;0.00028403312899172;0.00017459497030359;7.8441742516588e-05;0.00026074520428665;-3.6990059015807e-05;0.0012770226458088;4.436528251972e-05;-1.928194615175e-05;1.1916718904104e-05;-0.00021430131164379;1.3698081602342e-05;0.0001989405718632;0.00011793633893831;-0.00023050628078636;-0.00018458242993802;-0.00087262940360233;5.2631472499343e-05;-0.00060195010155439;9.8770018666983e-05;0.0002787682460621;1.4814069800195e-05;-5.4400516091846e-05;-7.8526558354497e-05;0.00039732787990943;8.3479455497582e-05;6.7884022428188e-05;2.5402885512449e-05;5.2477858844213e-05;0.00064167025266215;4.6068333176663e-05;-0.00030722279916517;-0.00034314388176426;2.2318987248582e-05;0.00014567479956895;0.00024402288545389;0.00014077723608352;0.00097302917856723;-0.00015225763490889;-0.00025634560734034;-3.3743901440175e-05;-0.00021843882859685;-2.8544591259561e-05;-4.0761340642348e-05;0.00014153790834825;-0.00035843029036187;7.7119984780438e-05;-3.1730505725136e-05;7.7504184446298e-05;-0.00027323447284289;-2.8972721338505e-05;-0.00015451498620678;-5.6859526011976e-06;-2.9644101232407e-05;-8.7467073171865e-05;0.0012846521567553;-1.0068897609017e-05;-0.00048850267194211;1.2973569027963e-05;-0.00010841401672224;-7.1076428866945e-05;0.00013796673738398;0.0002347603731323;-9.2159840278327e-05;0.00016432789561804;-0.00020326334924903;-6.2572624301538e-05;-9.1817437350983e-06;-0.00031557373586111;1.4766188542126e-05;0.0004127541615162;2.7196709197597e-05;-0.00051442533731461;-7.7458380474127e-06;0.00026710465317592;-2.5249673853978e-05;0.00022541932412423;3.4653156035347e-05;-0.00016254909860436;-9.8188538686372e-05;-0.00090385822113603;3.1427272915607e-05;4.7001627535792e-05;6.4872852817643e-05;-6.5995358454529e-05;2.2327787519316e-05;-0.00079946767073125;7.1707672759658e-06;-0.00049775681691244;-6.0616228438448e-05;-1.982219509955e-05;-0.00030568157671951;-0.00025474370340817;-0.00015832824283279;0.00029916985658929;0.00024453576770611;4.966695632902e-05;0.0003999195760116;-6.8180408561602e-05;0.0017858197679743;4.7711833758513e-05;6.6772518039215e-05;9.5896684797481e-06;-0.00018975572311319;1.5319252270274e-05;0.00025881547480822;9.0915789769497e-05;-0.00015729377628304;-0.00020694373233709;-0.0010165870189667;7.806257053744e-05;-0.00088366225827485;0.00012923689791933;0.00029459639335983;1.9203702322557e-05;-4.4890737626702e-05;-5.5083404731704e-05;0.0002291894343216;7.1324269811157e-05;0.00010839772585314;1.7794189261622e-05;6.6059925302397e-05;0.00070047640474513;-2.6693031031755e-05;-0.00040243630064651;-0.00036645139334723;0.00012916373088956;0.00015081827586982;0.00045209767995402;0.00014419235230889;0.0012634610757232;-0.0001646568562137;-0.00029208863270469;-3.6437497328734e-05;-0.00018800716497935;-1.6378429791075e-05;-8.7380183686037e-05;0.00017442129319534;-0.00041008094558492;4.8599467845634e-05;-0.00013098027557135;0.00010540420043981;-0.00045697190216742;-8.5249803305487e-06;-0.00018971225654241;-2.7793307708635e-06;-3.1905565265333e-05;-0.00011026725405827;0.001327607082203;-4.5513493773797e-07;-0.00063811795553192;1.4747100067325e-05;-0.00010587229917292;-9.4886136139394e-06;0.00010905320232268;0.00020417764608283;-0.00012471563240979;0.00021245804964565;-0.00021686784748454;6.2595456256531e-05;1.1480286957521e-05;-0.00012400107516441;-9.4111483122106e-06;0.00048902531852946;2.862351720978e-05;-0.00050815369468182;-1.116073144658e-05;0.00030127400532365;-6.5312160586473e-05;0.00030695006716996;4.5610308006871e-05;-0.00033527691266499;-6.0914215282537e-05;-0.001148559502326;3.8467926060548e-05;1.4611669030273e-05;6.5777312556747e-05;-7.0708709245082e-05;5.3177922382019e-05;-0.00094799266662449;9.2326536105247e-06;-0.0006667870329693;-6.2152452301234e-05;-2.7495812901179e-05;-0.00026376888854429;-0.00026259128935635;-0.00015970729873516;0.00026070501189679;0.00031913295970298;2.110217246809e-05;0.00049143400974572;-9.8107826488558e-05;0.0021737925708294;4.4099295337219e-05;0.00015799778338987;4.4924231588084e-06;-0.00015124163473956;1.558235817356e-05;0.00029845000244677;2.9969507522765e-05;-2.9469822038664e-05;-0.00016741499712225;-0.0009365426376462;9.2187307018321e-05;-0.00099627499002963;0.00012936558050569;0.00022558354248758;1.4226845451049e-05;-1.9440258256509e-05;-9.7148804343306e-06;-1.2084030458936e-05;4.8023415729403e-05;8.6296524386853e-05;8.3224613263155e-06;4.2843359551625e-05;0.00058516935678199;-8.440250530839e-05;-0.00039053123327903;-0.00030777105712332;0.00021435375674628;0.00011071835615439;0.00055148714454845;9.7389973234385e-05;0.0013167954748496;-0.00013934755406808;-0.00021426286548376;-3.2959465897875e-05;-0.00012142467312515;-3.2694381388865e-06;-8.7822270870674e-05;0.00014563683362212;-0.00032357810414396;2.3840782887419e-05;-0.00021048945200164;0.00011228939547436;-0.00059665081789717;1.7398637282895e-05;-0.00015598366735503;5.6911349020083e-06;-3.7949557736283e-05;-9.0192879724782e-05;0.00095927552320063;1.323883770965e-05;-0.00064276141347364;8.8364749899483e-06;-7.258822734002e-05;3.7098041502759e-05;5.348822378437e-05;0.000115306385851;-0.00012516826973297;0.00023034121841192;-0.00018452953372616;0.00018932459352072;9.2753489298047e-06;0.00021105098130647;-2.907151610998e-05;0.00042430238681845;1.8152320990339e-05;-0.00035722661414184;-1.1073553650931e-05;0.00026271646493115;-9.2409092758317e-05;0.00031193511676975;4.9526170187164e-05;-0.00039627507794648;1.6584896229688e-06;-0.0010448329849169;3.3130672818515e-05;-3.9773163734935e-05;5.0857783207903e-05;-6.2915984017309e-05;7.8006363764871e-05;-0.00090136873768643;1.8044169337372e-05;-0.00070827821036801;-4.7268309572246e-05;-1.0109073627973e-05;-0.00015884336607996;-0.00018147820082959;-9.2814538220409e-05;0.00015769363380969;0.00027521821903065;-2.998501440743e-05;0.00041916943155229;-0.00011745312804123;0.002024588175118;2.6417070330353e-05;0.00021769109298475;-8.3656141214306e-06;-3.1365132599603e-05;1.0077937986352e-05;0.00024952116655186;-1.9435385183897e-05;-6.3172078625939e-06;0.00096590159228072;0.00012816723028664;0.0012347570154816;-0.00014836381888017;-4.2149236833211e-05;-0.00014229207590688;3.1603743991582e-05;-1.3603553270514e-05;0.00010916521569015;-1.8625714801601e-05;0.00044945417903364;-4.7746038035257e-05;-2.9399316190393e-06;1.4712674101247e-06;-0.00051885994616896;5.294654329191e-05;0.00027750519802794;-0.00024421967100352;0.00027383171254769;-0.00065246719168499;4.6452376409434e-05;-0.0017036447534338;-3.2792686397443e-05;-0.00010300453141099;0.00011868480214616;8.8027140009217e-05;3.3817239454947e-05;-0.0001207173554576;5.3938374549034e-06;-0.00028599848155864;0.00012384503497742;1.4556378573616e-06;3.0801948014414e-06;-0.00055227958364412;4.527811324806e-05;-0.00010712944640545;5.398977373261e-05;-6.1826017372368e-06;-9.9312283055042e-06;0.00074754684465006;-7.7938020695001e-05;-0.00044145257561468;1.5114209418243e-05;-0.0001362520706607;6.6902262005897e-06;-3.6282959626988e-05;5.1915238145739e-05;2.7392681658966e-05;0.00011524918954819;-2.3522201445303e-05;0.00022035802248865;-0.00014932196063455;6.9457390054595e-05;2.5014220227604e-05;0.00040999852353707;-2.8119084163336e-05;-0.00032816347084008;2.0069688616786e-05;0.00026076924405061;-1.4650585399067e-05;0.00027988135116175;-8.0944075307343e-05;-0.00018454376549926;8.5868108726572e-05;-0.00089916435535997;-9.9732433227473e-06;1.2145282198617e-05;2.6444080504007e-05;-8.7745640485082e-05;5.7834000472212e-05;-0.001013602828607;5.5971679103095e-05;-0.00059125712141395;3.8286914787022e-05;6.3141509599518e-05;-4.5642947952729e-05;-0.00021542102331296;-0.0001060697104549;-7.4899340688717e-05;0.00019418049487285;0.00013696747191716;0.00032674660906196;-3.5366414522287e-05;0.0017569455085322;-0.0001134621197707;9.7820302471519e-05;2.4925475372584e-05;0.00019233372586314;-1.3775553270534e-05;0.00012406404130161;-1.6884117712834e-06;0.0001372911647195;-7.6322081440594e-05;0.0010888900142163;0.00017797703912947;0.0012105451896787;-0.0001574883935973;-4.9154456064571e-05;-0.00014614868268836;4.5320968638407e-05;-1.0295733773091e-05;-0.00025814757100306;2.5418956283829e-05;0.00057651364477351;-5.6846576626413e-05;2.0799263438676e-05;-1.2258504284546e-05;-0.00065132003510371;-5.1204942792538e-06;0.00026052654720843;-0.00019003756460734;0.00034151744330302;-0.00060441088862717;5.0914604798891e-05;-0.0016820846358314;-8.307888492709e-05;-0.00015375555085484;0.00014270357496571;0.00022233433264773;2.9867595003452e-05;-0.00021164987992961;1.7499602108728e-05;-0.00037997766048647;0.00014978204853833;0.00020857465278823;2.2661888579023e-05;-0.00030260003404692;1.6105528629851e-05;-0.00011633640679065;3.8491885788972e-05;1.4612635823141e-05;-2.6730882382253e-05;0.0011329036206007;-9.7316995379515e-05;-0.00033795667695813;1.9909468562673e-07;-0.00021073025709484;1.1848082067445e-05;-0.00011812821321655;0.00013887732347939;9.8336386145093e-05;7.9566289059585e-06;1.371094276692e-05;6.2375278503168e-05;-0.00018051196821034;-0.00046167991240509;3.3064028684748e-05;0.00046143020153977;-6.0641559684882e-06;-0.00051338761113584;3.2925530831562e-05;0.00032183370785788;-1.4268743143475e-05;0.00027139252051711;-5.8253273891751e-05;-1.8215147065348e-05;0.00010420669423183;-0.0010749325156212;-5.7596909755375e-05;3.8942573155509e-05;4.2518597183516e-05;-9.5893708930817e-05;6.9749956310261e-05;-0.0011726275552064;3.7897578295087e-05;-0.00059711816720665;4.246448588674e-05;5.7689314417075e-05;-6.1315739003476e-05;-0.00036155770067126;-0.00014355899475049;-0.00012723663530778;0.00020419973589014;0.00023732382396702;0.00042474575457163;-2.6835205062525e-05;0.0019306802423671;-0.00011582468869165;8.2636055594776e-05;3.9377948269248e-05;0.00019052029529121;-6.6830330069934e-06;0.00014413373719435;-8.2991732597293e-07;0.00032163510331884;-0.00012889764911961;0.00045977500849403;0.00012995488941669;0.00016713397053536;-2.50949869951e-05;-8.6577507317998e-05;-4.9475547712063e-05;3.0888793844497e-05;7.3623496064101e-06;-0.00068890064721927;7.0433387008961e-05;0.00014858077338431;-5.6567612773506e-05;1.0434316209285e-05;-2.8929085601703e-05;-0.00041832023998722;-0.00013055368617643;7.466618262697e-05;0.00014228124928195;0.00020506247528829;-2.1569670934696e-05;-2.6526529836701e-05;-0.00033415539655834;-9.9406832305249e-05;2.5082934371312e-05;8.6998785263859e-05;0.0002735203015618;1.9599978259066e-05;-0.00011157992412336;3.31448718498e-05;-0.0001932281156769;4.3523981730687e-05;0.00012798115494661;6.2463972426485e-05;8.1784295616671e-05;2.4928847778938e-05;-3.8421912904596e-05;-1.587921360624e-05;-6.3876364038151e-06;-1.8168413589592e-05;0.00096941186347976;-2.5262861527153e-05;-8.9057495642919e-05;-1.0610970093694e-05;-0.00011906555300811;1.3372748981055e-05;-8.8388682343066e-05;0.00015013849770185;0.00015652751608286;-1.1854520380439e-05;-2.1370638933149e-05;-0.00017404486425221;-0.00013319704157766;-0.0006266989512369;-2.1030084099039e-05;0.00020465925626922;1.7555312297191e-05;-0.00044962199172005;1.6830408640089e-05;0.00017901528917719;-5.9041981330665e-06;6.1323378758971e-05;2.5641254978837e-05;0.00015011971117929;2.3394559320877e-05;-0.00054175895638764;-8.886094292393e-05;8.1733589468058e-05;2.5738616386661e-05;-4.1118259105133e-05;4.4052529119654e-05;-0.00052559818141162;-1.2633406186069e-05;-0.00021058581478428;1.0917980034719e-05;-2.3563970898977e-05;-3.9185364585137e-05;-0.0002694561262615;-0.00010708306217566;-0.00012311259342823;6.2217441154644e-05;0.00021635240409523;0.00022533819719683;3.524020939949e-05;0.00098718272056431;-2.4639737603138e-05;-2.125209539372e-05;2.9062664907542e-05;-0.00011371896107448;9.5224277174566e-06;0.00014900809037499;5.7216498134949e-06;0.00026292796246707;-0.00010305495379725;0.00031446211505681;8.986364264274e-05;9.3338923761621e-05;-1.5428362530656e-05;-5.5566029914189e-05;-3.1136583857005e-05;2.4058035705821e-05;5.7414636103204e-06;-0.00058535329299048;5.8328278100817e-05;0.00014975843077991;-4.2480518459342e-05;2.0332003259682e-05;-2.2003148842487e-05;-0.00029048213036731;-0.00010745673353085;3.6424142308533e-05;0.00011157541302964;0.00014699553139508;1.1935845577682e-05;-1.4535809896188e-05;-0.00018981345056091;-7.327065395657e-05;-1.221077855007e-05;6.1046681366861e-05;0.00022956327302381;1.2209210581204e-05;-0.00011197025742149;2.6201725631836e-05;-0.00012394912482705;1.9716771930689e-05;0.00015273758617695;5.6982193200383e-05;0.00010770939843496;1.3027427485213e-05;-2.5310695491498e-05;-1.0987306268362e-05;1.899477410916e-06;-1.7150126950582e-05;0.00070499168941751;-1.0028819815489e-05;-2.0423598471098e-05;-8.1250345829176e-06;-0.00010158200166188;8.484607860737e-06;-9.2483416665345e-05;0.00012811318447348;0.00011994222586509;-4.0004139009397e-05;-2.4727521577006e-06;-0.00015087284555193;-0.0001044954333338;-0.00054557947441936;-2.5649049348431e-05;0.00014848742284812;1.8058157365886e-05;-0.00034397555282339;1.0468003893038e-05;0.00013536440383177;-2.8931706310686e-06;2.4114749976434e-05;2.7710819267668e-05;0.00019093306036666;1.8848322724807e-05;-0.00038981091347523;-7.1421382017434e-05;6.0743528592866e-05;2.2425980205298e-05;-2.9329681638046e-05;3.1618084904039e-05;-0.00039830731111579;-1.4530349289998e-05;-0.00013254869554657;1.0068061783386e-05;-1.4555218513124e-05;-2.9608274417114e-05;-0.0002241733163828;-6.9191490183584e-05;-9.1207839432172e-05;2.2937254470889e-05;0.00017309593386017;0.00016645170398988;1.9567454728531e-05;0.00066608254564926;-1.6534137103008e-05;-2.1287993149599e-05;2.1881647626287e-05;-6.255383050302e-05;7.1196386670636e-06;9.792566561373e-05;3.5359507819521e-06;0.00012315697676968;-0.00027487191255204;-9.3025286332704e-05;-0.00046506535727531;3.1281011615647e-05;-0.00017344119260088;3.6576151615009e-05;0.00013755416148342;8.2505803220556e-06;-4.8105961468536e-05;-9.0522516984493e-05;0.0005867388099432;7.2641269071028e-05;-0.00013088966079522;2.491252416803e-05;-7.6220885603107e-07;0.00036253087455407;9.0474000899121e-05;-9.7344207460992e-05;-0.000221669790335;-3.9200185710797e-05;7.3404073191341e-05;-1.0844682947209e-05;8.8650827819947e-05;0.00034413413959555;-9.5936207799241e-05;-5.200574742048e-05;-1.5756519132992e-05;-0.00022937140602153;-3.3314332540613e-05;9.1821799287573e-05;4.8171994421864e-05;-0.00017838037456386;9.1463596618269e-05;0.00019312981748953;9.6730855148053e-06;9.0035558969248e-05;-2.9558552341769e-05;-7.0552909164689e-05;-1.8213400835521e-05;4.205011009617e-06;-2.4594068236183e-05;0.00088227400556207;-1.3714093256567e-05;-0.00010403586202301;5.8973428167519e-06;-0.00013025224325247;-0.00014991780335549;0.00015849409101065;0.00018228386761621;-1.7653489337022e-08;-1.9285740563646e-05;-0.00013420611503534;-0.00019025814253837;-3.9103495510062e-05;-0.00061831489438191;3.8571826735279e-05;0.00023821579816286;1.2850461644121e-05;-0.00042251881677657;-8.9020409177465e-07;0.00018854789959732;3.4490829420974e-05;4.4545959099196e-05;2.8447819204303e-05;0.00021397818636615;-0.00010696653771447;-0.00050790183013305;3.4993070585188e-05;6.7431043135002e-05;4.0191433072323e-05;-3.8688940549036e-05;-2.3694998162682e-05;-0.00047811001422815;1.1160593203385e-05;-0.00016202669939958;-4.3596868636087e-05;-1.1904627172044e-05;-0.00031051316182129;-0.00013001410115976;-0.00012467529450078;0.00025987438857555;6.402160943253e-05;2.6735233404906e-05;0.00024832284543663;-2.1932124582236e-05;0.00083616137271747;3.4113516448997e-05;-2.5604846086935e-05;9.9557619250845e-06;-0.00010537803609623;8.7541620814591e-06;0.00012783032434527;0.00017505737196188;-0.00037737100501545;-0.00016196041542571;-0.0007820192258805;5.8329867897555e-05;-0.000367812870536;6.9946974690538e-05;0.00022705923765898;1.3965232938062e-05;-7.2216935222968e-05;-0.00012447338667698;0.00077351584332064;0.00010559383372311;-0.00015182991046458;3.6265242670197e-05;1.8272543456987e-05;0.00060292502166703;0.00011490481119836;-0.00019206304568797;-0.00035420618951321;-3.5577242670115e-05;0.00011718979658326;6.1081074818503e-05;0.00014127550821286;0.00067114015109837;-0.00015442838775925;-0.00012255644833203;-2.7966993002337e-05;-0.00031156759359874;-4.569920929498e-05;9.5226387202274e-05;0.00010253577784169;-0.00031616899650544;0.00012075946870027;0.00021815705986228;2.6523859560257e-05;5.2072678954573e-05;-4.4487267587101e-05;-0.00012722592509817;-2.326475805603e-05;-7.3132292754963e-07;-6.0315011069179e-05;0.0013828506926075;-2.0003562894999e-05;-0.00024491659132764;1.1834378710773e-05;-0.0001815028663259;-0.00019256990344729;0.00021216076856945;0.00027462156140245;-1.9737366528716e-05;2.3823393348721e-05;-0.00020134607621003;-0.00024290417786688;-3.87371146644e-05;-0.00083172926679254;4.8406898713438e-05;0.00039002468110994;2.5561785150785e-05;-0.00062947208061814;-4.2831943574129e-06;0.00029006245313212;3.2129686587723e-05;0.00011480392277008;4.3441788875498e-05;0.00018951378297061;-0.00015178613830358;-0.00082822050899267;4.834242281504e-05;9.8090691608377e-05;6.45513064228e-05;-6.397574179573e-05;-2.1998963347869e-05;-0.0007509877323173;1.390635225107e-05;-0.00030902127036825;-6.6895743657369e-05;-1.9039493054152e-05;-0.00043874434777535;-0.00022142608941067;-0.00019088436965831;0.00037799135316163;0.00014748290413991;4.8530888307141e-05;0.00039542882586829;-4.2349271097919e-05;0.0014310566475615;5.3261395805748e-05;-2.0925053831888e-05;1.495838023402e-05;-0.00017890616436489;1.4075507351663e-05;0.00021759502124041;0.0001831374829635;-0.00036727025872096;-0.00021870904311072;-0.0011038447264582;0.00011054940114263;-0.00074976979522035;0.00011012092727469;0.00025463849306107;1.955416155397e-05;-7.8868353739381e-05;-0.00012454854731914;0.00075487536378205;0.00010741592996055;-0.00023995469382498;3.808445399045e-05;1.5341136531788e-05;0.00078262685565278;6.3911640609149e-05;-0.00029630018980242;-0.00045114880776964;8.6180785729084e-05;0.00012182674981887;0.0002836404601112;0.00017106601444539;0.0011391823645681;-0.00019506894750521;-0.00011039144737879;-3.1709034374217e-05;-0.00035144313005731;-4.2850508179981e-05;0.0001197253659484;0.00016731271171011;-0.00044242970761843;0.00011201848246856;0.00024594299611636;3.0045463063288e-05;-4.7957353672246e-05;-3.4153730666731e-05;-0.00017159564595204;-2.8671900508925e-05;5.8116675063502e-06;-0.00010967184789479;0.0016606148565188;-1.9187482394045e-05;-0.00037843946483918;1.5929728760966e-05;-0.00023589498596266;-0.00020557374227792;0.00023397775657941;0.00029183051083237;-2.1620307961712e-05;3.4039909223793e-05;-0.00023843604139984;-0.00020059678354301;-9.5716141004232e-06;-0.00089219101937488;4.1296851122752e-05;0.00052433501696214;3.9609698433196e-05;-0.00074165692785755;-9.7720530902734e-06;0.00038465484976768;-1.5501884718105e-06;0.00021466740872711;7.5131611083634e-05;0.00010789416410262;-0.00014764045772608;-0.0011878466466442;6.4711246523075e-05;7.725422619842e-05;7.9209254181478e-05;-8.6512161942665e-05;2.8699132599286e-06;-0.0010675535304472;2.5158356947941e-05;-0.00052358128596097;-8.2811864558607e-05;-5.7931110859499e-06;-0.00050841778283939;-0.00026273657567799;-0.00021893036318943;0.00042425526771694;0.00022899228497408;1.9750310457312e-05;0.00055347214220092;-8.8587847130839e-05;0.0020131047349423;6.2827690271661e-05;5.4004944104236e-05;1.111062556447e-05;-0.00010712160292314;1.4238367839425e-05;0.00026043073739856;0.00013325111649465;-0.00023681473976467;-0.0002434121852275;-0.0014497999800369;0.00019596706260927;-0.0013604310806841;0.00016570404113736;0.00023155806411523;2.8626896892092e-05;-8.5102838056628e-05;-7.7049815445207e-05;0.00047535041812807;0.00010622206173139;-0.00045780086657032;2.8290980480961e-05;7.5708353506343e-06;0.00090749107766896;-1.6158897778951e-05;-0.000406404142268;-0.00052516465075314;0.00027787970611826;7.1255657530855e-05;0.00064142449991778;0.00014644108887296;0.0019007814116776;-0.00022680830443278;-1.2985645298613e-05;-4.1727242205525e-05;-0.00031425422639586;-3.2292467949446e-05;0.00016839217278175;0.00023256528947968;-0.00053772272076458;9.4530660135206e-05;0.00033475839882158;1.9375172996661e-05;-0.00030796660576016;3.7345637338149e-06;-0.00021639607439283;-3.1719831895316e-05;1.6741114450269e-05;-0.00016125559341162;0.0016715674428269;-7.1195595410245e-06;-0.00051908352179453;1.2961133506906e-05;-0.00027947992202826;-0.00025708472821862;0.00021873708465137;0.00024507616763003;2.3990733097889e-05;3.9495364035247e-05;-0.0002719885960687;-2.6453049940756e-05;2.0391742509673e-05;-0.00075081008253619;2.646279426699e-05;0.00065875612199306;5.0921178626595e-05;-0.00073529727524146;-1.6441828847746e-05;0.00044875443563797;-5.687439625035e-05;0.00033366534626111;0.00013248882896733;2.1794210624648e-05;-0.00011953080684179;-0.0014703809283674;6.3458879594691e-05;2.6086876459885e-05;9.3955197371542e-05;-0.0001188199603348;4.3014009861508e-05;-0.0014360623899847;4.9450387450634e-05;-0.00076471792999655;-9.2940281319898e-05;5.609566505882e-05;-0.00057081785053015;-0.00029416714096442;-0.0001967865973711;0.00043758060201071;0.00032196645042859;-1.751252602844e-05;0.00065416638972238;-0.00016242681886069;0.0025224210694432;6.9812675064895e-05;0.00013419579772744;-1.843989025474e-06;9.5105038781185e-05;8.2774413385778e-06;0.00023934662749525;4.2840758396778e-05;-5.4395157349063e-05;-0.00016902502102312;-0.0011839146027341;0.00018638765322976;-0.0013080654898658;0.00014599332644138;0.00013886508531868;2.1667234250344e-05;-5.2356153901201e-05;-1.1092770364485e-05;0.00011054945207434;7.1874426794238e-05;-0.00040916839498095;1.3675978152605e-05;-6.7835462687071e-06;0.00067332480102777;-7.6139353041071e-05;-0.00034787025651895;-0.00039657138404436;0.00032742685289122;2.3375499949907e-05;0.00066466344287619;7.1379166911356e-05;0.0017460879171267;-0.00017232514801435;5.1449897000566e-05;-3.6798635846935e-05;-0.00018185061344411;-1.4637087588198e-05;0.00013143214164302;0.00018029863713309;-0.00038658807170577;5.2418698032852e-05;0.00019007855735254;2.6911240638583e-05;-0.00042959852726199;2.7082645829068e-05;-0.00016081739158835;-1.804789644666e-05;6.3196948758559e-06;-0.00012591914855875;0.0010705449385568;7.3547012107156e-06;-0.00047146168071777;7.0877172220207e-06;-0.00019997959316242;-0.00016802041500341;0.00012120620522182;0.00012648988922592;1.4962517525419e-05;7.4311545176897e-05;-0.00020056740322616;0.00011287240340607;2.1251884390949e-05;-0.00027966755442321;5.8070537534149e-07;0.00050969317089766;3.532206028467e-05;-0.00046916393330321;-1.528019674879e-05;0.00034032456460409;-8.3900318713859e-05;0.00030721834627911;0.00011786926188506;-8.993500523502e-05;-3.4323900763411e-05;-0.0011666537029669;4.7555764467688e-05;-3.2200823625317e-05;6.8890454713255e-05;-9.7328498668503e-05;6.8290275521576e-05;-0.0011903961421922;5.2519168093568e-05;-0.00070357037475333;-6.5605112467892e-05;7.3358380177524e-05;-0.00037356998655014;-0.00019470376719255;-0.00010783875040943;0.00026806219830178;0.00026118470123038;-5.7250592362834e-05;0.00050179992103949;-0.00016445537039544;0.0020521953701973;4.0288567106472e-05;0.00016727359616198;-1.6304204109474e-05;0.00019476657325868;2.273443442391e-06;0.00015449059719685;0.00031607566052116;-0.00015419490227941;0.0010374869452789;0.00020551626221277;0.00093764258781448;-0.00013474191655405;-4.2593885154929e-05;-0.00011551275383681;3.7960689951433e-05;3.021617885679e-06;-0.00076071778312325;8.3132719737478e-05;0.00059903803048655;-4.6245600969996e-05;9.2491456598509e-05;-3.1718114769319e-05;-0.00067900429712608;-5.5366428568959e-05;0.00018413337238599;-0.00013251979544293;0.00035985879367217;-0.00041756583959796;3.3651638659649e-05;-0.0012316660722718;-0.00013937393669039;-0.00022469497343991;0.00014189108333085;0.00041794241406024;1.0701004612201e-05;-0.00032267018104903;2.8042117264704e-05;-0.00037884843186475;0.00012935828999616;0.00039718017796986;4.9782091082307e-05;7.7969307312742e-05;-1.7811162251746e-05;-7.9001692938618e-05;1.6756066543167e-05;3.3780248486437e-05;-4.0060425817501e-05;0.0013070775894448;-8.5834799392615e-05;-0.00012932009121869;-1.6168496586033e-05;-0.00026100454851985;1.1988578989985e-05;-0.00018542075122241;0.00023763846547808;0.00015405872545671;-0.00014505266153719;4.70949235023e-05;-0.00015497487038374;-0.00018603166972753;-0.00096049584681168;2.307311660843e-05;0.00039436118095182;2.2724107111571e-05;-0.000629591580946;3.7188416172285e-05;0.00033813837217167;-8.5526071416098e-06;0.00020802035578527;-2.3182199583971e-05;0.00024750418378972;0.00010273409134243;-0.0011227786308154;-8.6394371464849e-05;2.805445001286e-05;7.6897318649571e-05;-8.3335529780015e-05;6.5106505644508e-05;-0.0012198325712234;1.7282689441345e-05;-0.00054469483438879;4.4087340938859e-05;4.7790799726499e-05;-7.2032169555314e-05;-0.0004614434146788;-9.152757411357e-05;-0.00015416610403918;8.7386346422136e-05;0.00031106834649108;0.00049138988833874;-7.7203229011502e-05;0.0018266630358994;-0.00010565079719527;9.7316376923118e-05;4.5286880776985e-05;0.00022432785772253;-2.7318214961269e-06;0.00012231562868692;1.7411313137927e-06;0.00037367339245975;-0.00016387511277571;0.00070550257805735;0.00017185999604408;0.00043262497638352;-7.2669092332944e-05;-5.6399341701763e-05;-6.7006003519055e-05;2.9128992537153e-05;8.7047274064389e-06;-0.00089713413035497;9.4354858447332e-05;0.00036734653986059;-4.3114607251482e-05;7.2948067099787e-05;-3.5751203540713e-05;-0.00053993746405467;-9.6728690550663e-05;9.9412412964739e-05;9.1957481345162e-06;0.00028228672454134;-0.00015269253344741;-5.4567340157519e-06;-0.00056563905673102;-0.00013601327373181;-0.00012245318794157;0.00010998416109942;0.00040511460974813;6.9201159931254e-06;-0.00024564558407292;3.145809751004e-05;-0.0002721454075072;7.342777098529e-05;0.00028554975870065;6.099236998125e-05;0.00021121981262695;-2.3613115445187e-06;-4.6715795178898e-05;-8.251988219854e-06;2.2747417460778e-05;-3.4078871976817e-05;0.0011848815483972;-4.7620844270568e-05;-3.9872102206573e-05;-1.7263715562876e-05;-0.00021046405890957;1.4448164620262e-05;-0.00013763047172688;0.00021251731959637;0.00016716514073778;-0.00011330331471981;1.1398264177842e-05;-0.00023259007139131;-0.00014876609202474;-0.00094742141664028;-2.434566113152e-06;0.0002794444153551;2.5277618988184e-05;-0.00057984073646367;2.6187293769908e-05;0.00027102878084406;-5.5249392971746e-06;0.0001063424278982;1.2169269211881e-05;0.00026488795992918;5.7292043493362e-05;-0.00085942423902452;-8.6359119450208e-05;5.0316011765972e-05;6.8003333581146e-05;-5.3822790505365e-05;4.8758269258542e-05;-0.00084454118041322;-3.7465283639904e-06;-0.00035712498356588;2.6250208975398e-05;-2.8951028525626e-06;-5.6884360674303e-05;-0.00036821936373599;-6.664697866654e-05;-0.00014936539810151;3.2769923564047e-05;0.00026439945213497;0.00038694759132341;-4.7439913032576e-05;0.0013438852038234;-5.7660046877572e-05;5.5122633057181e-05;3.4412867535139e-05;5.5275719205383e-05;4.4215480556886e-06;0.00013787529314868;5.0003318392555e-06;0.00045147576020099;-0.00018156561418436;0.00055877084378153;0.00015844043809921;0.000180595452548;-3.9489725168096e-05;-7.4127412517555e-05;-4.9761812988436e-05;3.3923868613783e-05;1.1609540706559e-05;-0.0010534828761593;0.00010517904593144;0.00029095233185217;-5.8889145293506e-05;5.8631401770981e-05;-3.9468246541219e-05;-0.00049990258412436;-0.00016145814151969;5.4453033953905e-05;0.00013732039951719;0.00025912851560861;1.6492716667926e-06;-1.7723208657117e-05;-0.00027734038303606;-0.00013390091771726;-7.0913309173193e-05;0.00010312144877389;0.00042283209040761;1.2472175512812e-05;-0.0002230597747257;4.0527524106437e-05;-0.00021312823810149;3.4382221201668e-05;0.00028034707065672;9.1064568550792e-05;0.00026080053066835;1.1130488019262e-05;-3.7216603232082e-05;-1.8992584955413e-05;1.4704991372128e-05;-3.2810879929457e-05;0.0011992305517197;-1.9241710106144e-05;6.4510036281717e-06;-1.5832391000004e-05;-0.00019335247634444;1.4229527550924e-05;-0.00015639050980099;0.00022377814457286;0.00019509649428073;-0.0001000559568638;2.8495865080913e-06;-0.00028049328830093;-0.00016206018335652;-0.0010084668174386;-3.6313194868853e-05;0.00024562951875851;3.2073377951747e-05;-0.00059774797409773;1.8775037460728e-05;0.00024527372443117;-3.7141346638236e-06;4.1194001823897e-05;4.3545733205974e-05;0.00035325548378751;3.5953889891971e-05;-0.00072008324787021;-0.00011081516277045;8.4915067418478e-05;5.6092772865668e-05;-4.6093657147139e-05;4.8366320697824e-05;-0.00070352846523747;-2.2333200831781e-05;-0.00024728511925787;1.8248507331009e-05;-2.5406034183106e-05;-5.2984538342571e-05;-0.00037664861883968;-7.5281277531758e-05;-0.00015618251927663;-6.3175900777424e-07;0.00028418691363186;0.00032164886943065;-8.2331225712551e-06;0.0011379510397092;-3.1390565709444e-05;-1.8370200223217e-06;3.5733253753278e-05;-5.5589938710909e-05;1.0540921721258e-05;0.00015601950872224;6.6719208007271e-06;0.00037768867332488;-0.0001454137818655;0.00037859761505388;0.00011336080206092;6.2512328440789e-05;-2.0212937670294e-05;-5.8873625675915e-05;-3.2189214834943e-05;2.886099537136e-05;9.5561745183659e-06;-0.00087987817823887;8.4564315329771e-05;0.00022321213327814;-5.2522398618748e-05;4.4951306335861e-05;-3.1242001568899e-05;-0.00036419089883566;-0.00014933629427105;2.2132366211736e-05;0.00014652730897069;0.00019116880139336;5.450056414702e-05;-1.3832294825988e-05;-0.0001225170417456;-9.9055410828441e-05;-5.3164549171925e-05;7.6666998211294e-05;0.00033841442200355;1.1794983947766e-05;-0.00017706063226797;3.4979504562216e-05;-0.00013528036652133;8.4962175606051e-06;0.00023894499463495;8.5103740275372e-05;0.00022249853645917;1.153440825874e-05;-2.5548313715262e-05;-1.6256637536571e-05;1.1091835403931e-05;-2.6296293071937e-05;0.00091606687055901;-1.7789791399991e-06;3.4132190194214e-05;-1.0949625902867e-05;-0.00014833970635664;1.0071887118102e-05;-0.00013978860806674;0.00018206471577287;0.00015963948681019;-8.3112485299353e-05;5.752914603363e-06;-0.00023316952865571;-0.00013390168896876;-0.00081743812188506;-4.4262033043196e-05;0.0001800509635359;2.8422731702449e-05;-0.00046800915151834;1.0812384971359e-05;0.00018128970987163;-1.8420010974296e-06;3.6704952890432e-06;4.6177505282685e-05;0.00033357381471433;2.2411066311179e-05;-0.00050506979459897;-9.5030714874156e-05;7.6949661888648e-05;3.9837454096414e-05;-3.3554424589965e-05;3.7356789107434e-05;-0.00050811469554901;-2.4315935661434e-05;-0.00014790802379139;1.3208882592153e-05;-2.3534661522717e-05;-3.9807382563595e-05;-0.00030382082331926;-5.8169607655145e-05;-0.00012167406384833;-1.9343791791471e-05;0.00023085945576895;0.00022503126820084;4.6526888581866e-06;0.00079096498666331;-1.667728247412e-05;-2.3581076675327e-05;2.7886713724001e-05;-6.6501881519798e-05;9.4600500233355e-06;0.00011982907017227;5.2342247727211e-06;0.00015919028373901;-0.0003672509919852;-9.7657677542884e-05;-0.00049294024938717;3.367655153852e-05;-0.00010775079863379;3.0947569030104e-05;0.00014198914868757;6.8251652010076e-06;-5.4038860980654e-05;-0.00011993169027846;0.00082243862561882;8.7055275798775e-05;-0.00018742278916761;3.270687739132e-05;-2.1331034076866e-05;0.00039719653432257;0.00012410480121616;-7.5514522904996e-05;-0.0002555436512921;-6.0133217630209e-05;8.0065532529261e-05;-7.7627126302104e-05;0.0001043334195856;0.00024578039301559;-0.00010872125130845;-1.9089384295512e-05;-1.4280486539064e-05;-0.00031062916968949;-4.2671628762037e-05;0.00014622433809564;3.0230972697609e-05;-0.00017118493269663;0.00012223306111991;0.00027170858811587;1.9011939684788e-06;0.00020492625480983;-3.6942215956515e-05;-6.3926752773114e-05;-2.5345281756017e-05;1.2447632798285e-05;-9.236364348908e-06;0.0010283715091646;-1.6903455616557e-05;-4.2093208321603e-05;5.1425249694148e-06;-0.00017044073319994;-0.00019844603957608;0.00020883783872705;0.00021645409287885;1.2637402505788e-05;-6.5485102823004e-05;-0.00015448150224984;-0.0002739311021287;-6.2688930484001e-05;-0.00084224430611357;5.3264953749022e-05;0.00025180532247759;1.0102378837473e-05;-0.00052250875160098;1.4363596392286e-06;0.00022435866412707;5.7937719248002e-05;1.1536095371412e-05;3.061641837121e-05;0.00036626594373956;-0.00013407289225142;-0.00056736514670774;5.0564820412546e-05;8.4806924860459e-05;4.2701365600806e-05;-3.8793219573563e-05;-3.9324466342805e-05;-0.00053418410243466;1.3431296792987e-05;-0.00014010957966093;-5.16473519383e-05;-2.1992977053742e-05;-0.00038487106212415;-0.00011578260455281;-0.0001506302942289;0.00031555039458908;1.3033824870945e-05;1.5609059119015e-05;0.00028649327578023;-1.5396393791889e-05;0.00085908686742187;3.9252139686141e-05;-3.7472105759662e-05;1.231099213328e-05;-0.00011753605213016;1.0834351087396e-05;0.00013914669398218;0.00021619300241582;-0.00047134995111264;-0.00016167716239579;-0.00078868953278288;6.5620173700154e-05;-0.00030464419978671;5.6783224863466e-05;0.00019480589253362;9.9010239864583e-06;-7.1002985350788e-05;-0.0001597119262442;0.0010556667111814;0.000106471721665;-0.0002759525377769;4.4735446863342e-05;-3.4042379411403e-05;0.00060374836903065;0.00013358837168198;-0.00014269097300712;-0.00037363555748016;-2.0131763449172e-05;0.00010631288023433;-1.664647470534e-06;0.00015914136020001;0.00051843648543581;-0.00015782316040713;-1.7261674656766e-05;-1.6444944776595e-05;-0.00042557393317111;-5.2998064347776e-05;0.0002038907550741;7.6967276982032e-05;-0.00029362356872298;0.00014790470595472;0.00037087561213411;-2.9354771413637e-06;0.000247583957389;-4.5495769882109e-05;-9.9365279311314e-05;-3.5041470255237e-05;1.9807928765658e-05;-4.2674695578171e-05;0.001459778752178;-2.4808645321173e-05;-0.00010667131573427;8.8981960288947e-06;-0.00024402821145486;-0.00026041656383313;0.00028148709679954;0.00028782547451556;1.9016508304048e-05;-8.9873457909562e-05;-0.00020954078354407;-0.00034884744673036;-5.7338143960806e-05;-0.0011338967597112;6.7280328948982e-05;0.00037639623042196;2.3536424123449e-05;-0.00072197715053335;-8.8057169023159e-07;0.00033005684963427;5.8650490245782e-05;6.5234875364695e-05;5.3690408094553e-05;0.00042754010064527;-0.00017362179642078;-0.0008922319393605;7.3204668296967e-05;9.5274692284875e-05;6.1604892835021e-05;-6.0131391364848e-05;-3.9896243833937e-05;-0.00083351164357737;2.1042778826086e-05;-0.00028094131266698;-7.4603180109989e-05;-1.9170138330082e-05;-0.00052975019207224;-0.00016747273912188;-0.00020633990061469;0.00043216912308708;5.0907467084471e-05;4.3760364860645e-06;0.00044548843288794;-4.02451150876e-05;0.0013704041484743;5.755554229836e-05;-1.1603015082073e-05;1.5514358892688e-05;-0.00011033217015211;1.3841946383764e-05;0.00019335089018568;0.00023030006559566;-0.00046154885785654;-0.0002191092207795;-0.0011135987006128;0.0001213264913531;-0.00069714040728286;9.3076174380258e-05;0.00020214865799062;1.3160326489015e-05;-7.5740994361695e-05;-0.00016523210797459;0.0010587903670967;0.00010184739221586;-0.00042066469904967;4.8516176320845e-05;-6.1551501858048e-05;0.00077286275336519;8.0040903412737e-05;-0.00022747558250558;-0.00046579027548432;0.00011926455772482;9.8652868473437e-05;0.0002172714448534;0.00019233205239289;0.00098670367151499;-0.00019478498143144;4.7154924686765e-05;-1.4175579053699e-05;-0.00048871140461415;-5.0808801461244e-05;0.00027288441197015;0.00014519573596772;-0.00042291192221455;0.00013800586748403;0.00048024175339378;-2.2970954887569e-05;0.00021230799029581;-3.2975378417177e-05;-0.00012863922165707;-4.3160656787222e-05;3.306301732664e-05;-9.7506803285796e-05;0.0016912064747885;-2.8024693165207e-05;-0.000181934403372;1.0617482985253e-05;-0.00030892877839506;-0.00030441276612692;0.00032343773636967;0.0002982116129715;4.7423538489966e-05;-0.0001356773864245;-0.00024196410959121;-0.00033363958937116;-2.0369561752887e-05;-0.0012626848183572;6.8257046223152e-05;0.00048531603533775;4.1422885260545e-05;-0.00082115730037913;-5.6533490351285e-06;0.00041790449176915;2.7492422304931e-05;0.00015840247215237;9.4195573183242e-05;0.00041406118543819;-0.00017351924907416;-0.0012317840009928;9.3237664259505e-05;5.7969387853518e-05;7.5472824391909e-05;-8.313448051922e-05;-1.7244179616682e-05;-0.0011855959892273;3.745600770344e-05;-0.00048835127381608;-9.2307600425556e-05;1.4135474884824e-05;-0.00062948459526524;-0.00019424739002716;-0.00022523978259414;0.00049557408783585;0.00010223805293208;-4.1522373066982e-05;0.00060708349337801;-9.2828071501572e-05;0.001894133980386;6.9872956373729e-05;6.5567292040214e-05;1.0237389687973e-05;2.6730112949735e-05;1.2240268915775e-05;0.000199158443138;0.00018913304666057;-0.00034055588184856;-0.00024429472978227;-0.0014680622844025;0.00021028015180491;-0.0013231741031632;0.00014860552619211;0.00016623361443635;2.1146865037736e-05;-8.4626757598016e-05;-0.00012439097918104;0.00080288527533412;0.00010202100384049;-0.00069659913424402;4.0417824493488e-05;-8.5118539573159e-05;0.00089603010565042;8.8756196419126e-06;-0.00032278953585774;-0.00053991290042177;0.00031227982253768;3.5261571611045e-05;0.00056952110026032;0.00016900747141335;0.0017723583150655;-0.00022729189367965;0.00018646336684469;-2.1799616661156e-05;-0.00046718254452571;-4.2967451008735e-05;0.00035824568476528;0.00021934816322755;-0.00053374189883471;0.00012262070958968;0.00067554722772911;-5.9993799368385e-05;3.1655516067985e-05;5.3112476052775e-06;-0.00016563755343668;-4.9655467591947e-05;5.0628808821784e-05;-0.00015768931189086;0.0016952569130808;-2.1910926079727e-05;-0.00026330992113799;4.8359784159402e-06;-0.00036078062839806;-0.00039950551581569;0.00034035704447888;0.00025757579714991;0.00012956227874383;-0.00019813030667137;-0.00028112131985836;-0.0001989488810068;1.7388189007761e-05;-0.0012303645489737;6.5623993577901e-05;0.00059999886434525;5.7687320804689e-05;-0.00081295112613589;-1.1130440725537e-05;0.00047147349687293;-2.1066938643344e-05;0.00026962588890456;0.00016057417087723;0.00040822257869877;-0.00016063755901996;-0.0014984920853749;9.4165960035753e-05;-1.7857842067315e-06;9.2038491857238e-05;-0.00011701534094755;1.6918009350775e-05;-0.001596340094693;6.6051667090505e-05;-0.00071176746860147;-0.00010622459376464;9.5824441814329e-05;-0.00074092694558203;-0.00022840604651719;-0.00020225549815223;0.00054445292335004;0.00017377168114763;-8.3745813753922e-05;0.00071634392952546;-0.00017056762590073;0.0023592323996127;8.2622420450207e-05;0.0001355154090561;-2.6063157747558e-06;0.00027612497797236;5.3000107982371e-06;0.0001450530544389;6.2450519180857e-05;-9.4364178949036e-05;-0.00015189216355793;-0.0011036009527743;0.00018788942543324;-0.001200056867674;0.00012740664533339;8.7949192675296e-05;1.8880014977185e-05;-5.5364416766679e-05;-2.8021449907101e-05;0.00023619462444913;6.9805777457077e-05;-0.00053716462571174;1.7547699826537e-05;-4.1997009248007e-05;0.00061524857301265;-5.2675466577057e-05;-0.00027209738618694;-0.00037610594881698;0.00031528511317447;-7.4732597568072e-06;0.00058115291176364;6.6893786424771e-05;0.0015872648218647;-0.00016123762179632;0.00015766493743286;-2.778290763672e-05;-0.00022052372514736;-1.983067340916e-05;0.00021855461818632;0.00016908223915379;-0.0003669184516184;5.9998452343279e-05;0.00038058028439991;-2.5264647774748e-05;-0.00020522078557406;2.3365753804683e-05;-0.00012979080202058;-2.780891918519e-05;2.7517235139385e-05;-0.00012300806702115;0.0010093768360093;-2.4802452571748e-06;-0.00028783854213543;3.7466504636541e-06;-0.00022888691455591;-0.0002425320999464;0.00016758980927989;0.00012683977547567;8.1476813647896e-05;-5.6229750043713e-05;-0.00018455684767105;1.0728399502113e-05;2.5689385438454e-05;-0.00055067212088034;2.2606131096836e-05;0.00044754808186553;3.9184851630125e-05;-0.00047144293785095;-1.2408015209076e-05;0.0003197283949703;-5.8495119446889e-05;0.00024987498181872;0.00012735172640532;0.00011014922347385;-5.8286717830924e-05;-0.0010715677635744;5.4061489208834e-05;-3.1338484404841e-05;6.5214378992096e-05;-9.1958412667736e-05;4.7105757403187e-05;-0.001160716987215;5.7480505347485e-05;-0.00059251667698845;-6.7113804107066e-05;9.3324706540443e-05;-0.00043978815665469;-0.00016812639660202;-0.00010757009295048;0.00030458020046353;0.00019170610175934;-6.8159679358359e-05;0.00048821134259924;-0.00015510206867475;0.0017684655031189;4.4609521864913e-05;0.00013125193072483;-1.4660550732515e-05;0.00026419010828249;-3.324263309068e-09;8.7826840172056e-05;0.00044672354124486;-0.00021039001876488;0.00068644870771095;0.00019545599934645;0.00030283679370768;-6.1013408412691e-05;-3.9514245145256e-05;-4.3442370952107e-05;8.9429995568935e-06;2.0682724425569e-05;-0.001177539001219;0.00013444923388306;0.0003644687240012;-8.8830647655413e-06;0.00015649868873879;-4.7755183913978e-05;-0.00053912284784019;-8.5250787378754e-05;5.6213393690996e-05;-3.1986746762414e-05;0.00028222007676959;-7.0541129389312e-05;-1.7682459656498e-05;-0.00025550706777722;-0.00018555769929662;-0.00020344911899883;9.9136770586483e-05;0.0005572636728175;-2.0294985006331e-05;-0.00034238747321069;2.8976306566619e-05;-0.00025794771499932;5.9408292145235e-05;0.00039893598295748;6.537669833051e-05;0.00045273979776539;-3.2857460610103e-05;-1.0178883712797e-05;-1.2859876733273e-05;3.8190897612367e-05;-3.8878933992237e-05;0.0011336443712935;-4.031138450955e-05;9.9940967629664e-05;-2.6915608032141e-05;-0.00023028501891531;8.4071571109234e-06;-0.00016472981951665;0.00027249817503616;0.00016652920749038;-0.00024355995992664;3.8995698560029e-05;-0.00034217047505081;-0.00013542674423661;-0.0011525354348123;-8.6720177705502e-07;0.00019840271852445;4.2299885535613e-05;-0.00057897687656805;2.7794410925708e-05;0.00026449299184605;8.4421162682702e-07;8.2535610999912e-05;2.1135339920875e-05;0.00045135719119571;5.8505527704256e-05;-0.00089544022921473;-8.5582651081495e-05;-2.0974307517463e-06;0.00010888131510001;-4.2393839976285e-05;3.7968071410432e-05;-0.00093442434445024;-7.4443910307309e-06;-0.00036910860217176;2.7067550036008e-05;1.3926529391028e-05;-6.7009605118074e-05;-0.00040801917202771;4.401472324389e-05;-0.00014180751168169;-0.00012739753583446;0.00029382520006038;0.0004458871553652;-0.00014955470396671;0.0012744250707328;-5.8639900089474e-05;0.00011094221554231;3.9709735574434e-05;0.00018811745394487;3.198363856427e-06;7.9475998063572e-05;7.9468218245893e-06;0.00040390327922069;-0.00015869326307438;0.00038467557169497;0.00012206842075102;3.0074312235229e-05;-2.0869905711152e-05;-5.4331201681634e-05;-2.6983492716681e-05;2.3833874365664e-05;1.2371780940157e-05;-0.00097337749321014;9.4781491497997e-05;0.00022203315165825;-4.3555210140767e-05;6.3922649133019e-05;-3.4580298233777e-05;-0.00037570323911496;-0.00014758484030608;1.2836319001508e-05;0.00013623063568957;0.00019798778521363;7.2072900366038e-05;-1.6239731849055e-05;-3.7046505894978e-05;-0.00011307135719107;-7.2159666160587e-05;7.568507862743e-05;0.00038244595634751;5.142737791175e-06;-0.00019978331692982;3.3913587685674e-05;-0.0001312117674388;2.5524029751978e-06;0.00024698386550881;8.8226057414431e-05;0.00028013158589602;7.9224691944546e-06;-1.7804133676691e-05;-1.8495140466257e-05;1.6174168194993e-05;-2.8035516152158e-05;0.00093589077005163;1.4315788803287e-06;6.260479131015e-05;-1.2501693163358e-05;-0.00016113043238875;9.5571476776968e-06;-0.00014120952982921;0.00019275472732261;0.00016020865587052;-0.00010162641410716;5.560045792663e-06;-0.00026083359261975;-0.00012826253077947;-0.00087855919264257;-4.58704198536e-05;0.00017018504149746;3.0943279853091e-05;-0.00048763302038424;1.061351485987e-05;0.0001918513153214;-4.1800237227108e-07;-3.0741746286367e-06;4.9078931624535e-05;0.00037040185998194;2.1068057321827e-05;-0.00053431553533301;-9.3999864475336e-05;6.7923931055702e-05;5.154851169209e-05;-3.0509432690451e-05;3.4407854400342e-05;-0.00052437197882682;-2.59562748397e-05;-0.00015863258158788;1.1701831681421e-05;-2.7287753255223e-05;-4.2448060412426e-05;-0.00030760158551857;-2.7720674552256e-05;-0.00012403876462486;-5.8802103012567e-05;0.00023349992989097;0.00024614654830657;-2.1178735551075e-05;0.00079733494203538;-1.4694894161948e-05;-4.8070078264573e-06;2.9023663955741e-05;-4.7505141992588e-05;1.0289414603903e-05;0.00011810829892056;6.4107675825653e-06;0.00036511436337605;-0.00013910330017097;0.00031242621480487;0.00010044054943137;1.7740833300195e-06;-1.3666919585376e-05;-4.8900197725743e-05;-2.2405365598388e-05;2.3253647668753e-05;1.0557983841863e-05;-0.00087464071111754;8.2631340774242e-05;0.00019925653759856;-4.3847525375895e-05;5.3921899962006e-05;-2.9840502975276e-05;-0.0003163873043377;-0.00014292103878688;3.8602697713941e-06;0.00014048245793674;0.0001683574373601;8.3222883404233e-05;-1.2517787581601e-05;-9.0359089881531e-06;-9.3674883828498e-05;-6.2535465986002e-05;6.5342850575689e-05;0.00033661877387203;6.9826432991249e-06;-0.00017658498836681;3.1817980925553e-05;-9.9637618404813e-05;-6.9431089286809e-06;0.0002316925820196;8.5561849118676e-05;0.00024565929197706;9.6050089268829e-06;-1.570379572513e-05;-1.5469462596229e-05;1.3618481716549e-05;-2.5080709747272e-05;0.00081316940486431;8.1425696407678e-06;6.5455795265734e-05;-9.7209913292318e-06;-0.00014009029837325;7.6471342254081e-06;-0.00013528313138522;0.00017565539747011;0.00014501603436656;-9.3032511358615e-05;6.9910392994643e-06;-0.00023171877546702;-0.0001208803296322;-0.00078283803304657;-4.9477810534881e-05;0.00014778606418986;2.8622382160393e-05;-0.00042953222873621;7.0726587182435e-06;0.00016359082655981;1.2230425738835e-07;-1.6130834410433e-05;4.9128277169075e-05;0.00035723243490793;1.6189947928069e-05;-0.00044413789873943;-8.7664397142362e-05;6.630285497522e-05;4.2261697672075e-05;-2.6610005079419e-05;3.0942090234021e-05;-0.00044958124635741;-2.5970708520617e-05;-0.00011855844786623;1.0289999408997e-05;-2.4421380658168e-05;-3.6685698432848e-05;-0.00027833919739351;-2.7872951250174e-05;-0.00010943198867608;-5.8273228205508e-05;0.00021196152374614;0.00020353458239697;-1.0446596206748e-05;0.00066273234551772;-9.885852705338e-06;-1.7604697859497e-05;2.5640991225373e-05;-5.2537405281328e-05;9.464882168686e-06;0.00010292868682882;5.5421755860152e-06;0.0001536261261208;-0.00035780004691333;-8.4579653048422e-05;-0.00041925741243176;2.7268901249045e-05;-4.5548498746939e-05;2.0884237528662e-05;0.00011802158405771;3.7764814351249e-06;-4.542861279333e-05;-0.00011748438555514;0.00082685454981402;7.5964329880662e-05;-0.00018185412045568;3.1776886316948e-05;-3.6287045077188e-05;0.00034476164728403;0.00012023832823616;-4.765841003973e-05;-0.00022755676764064;-5.8630273997551e-05;6.995187868597e-05;-0.00010499134805286;9.8494609119371e-05;0.00012683859677054;-9.4768729468342e-05;7.9737747000763e-06;-8.4551584222936e-06;-0.00031389127252623;-3.9768827264197e-05;0.00015752860053908;1.0875904081331e-05;-0.00013182590191718;0.00011941663251491;0.00026968636666425;-3.1332940579887e-06;0.0002424085396342;-3.3539487048984e-05;-4.4598062231671e-05;-2.488571954018e-05;1.5647934560548e-05;3.4940881050716e-06;0.00091967085609213;-1.5690613508923e-05;7.1266231316258e-06;2.9697953323193e-06;-0.00016464086365886;-0.00019059622718487;0.00020532058260869;0.00019461566989776;1.702857480268e-05;-8.7885644461494e-05;-0.00013854711141903;-0.00027605009381659;-6.6576998506207e-05;-0.00082014588406309;5.25609102624e-05;0.00020830424909946;6.1727132560918e-06;-0.00048594220425002;3.1506858704233e-06;0.00020560801203828;6.1808961618226e-05;-1.1563734915399e-05;2.5379966245964e-05;0.00040184817044064;-0.00012544865603559;-0.00050161237595603;5.280015830067e-05;7.4570212746039e-05;3.5481170925777e-05;-3.0785915441811e-05;-4.1575163777452e-05;-0.00047897596959956;1.1544461813173e-05;-0.00010736841795733;-4.7528777940897e-05;-2.3303209673031e-05;-0.0003588751424104;-7.5764350185636e-05;-0.00013665635196958;0.00029192279907875;-3.5414646845311e-05;-1.6712498336346e-06;0.00025976245524362;-8.2371298049111e-06;0.00071830389788374;3.6078039556742e-05;-3.1191444577416e-05;1.1849917427753e-05;-9.311346366303e-05;1.0295419087925e-05;0.00011744037328754;0.00020550211775117;-0.00044950220035389;-0.00013425227371044;-0.00063197669805959;4.9328697059536e-05;-0.00017334052245133;3.5539065720513e-05;0.00014717693557031;4.0743816498434e-06;-5.4829499276821e-05;-0.00015561806503683;0.0010508021805435;8.4751605754718e-05;-0.00026664257165976;4.2582843889249e-05;-6.2582104874309e-05;0.00049161788774654;0.00012654077727348;-8.4545266872738e-05;-0.00031238823430613;-2.1544932678808e-05;8.6829430074431e-05;-6.2080500356387e-05;0.00014697307778988;0.0002828536380548;-0.00012828885519411;3.5508535802364e-05;-4.6092104639683e-06;-0.00042643293272704;-4.7714136599097e-05;0.00022626682766713;4.1161249100696e-05;-0.00021795155771542;0.0001404851936968;0.00037909715319984;-1.6503132428625e-05;0.00032236619153991;-3.9117701817304e-05;-6.0422280512284e-05;-3.4054814022966e-05;2.5727589672897e-05;-1.9165614503436e-05;0.0012286008568481;-2.3422166123055e-05;-4.7068383537407e-06;4.470210569707e-06;-0.00022913250722922;-0.00024862072314136;0.00027394574135542;0.00024452619254589;3.2811942219269e-05;-0.000138622475788;-0.00017698426381685;-0.00035351468250155;-6.2661536503583e-05;-0.0010880136396736;6.7179760662839e-05;0.00028616620693356;1.6643913113512e-05;-0.00063909083837643;2.3946029159561e-06;0.00028640794334933;6.6828622948378e-05;1.8765893400996e-05;4.4504799006972e-05;0.00049733108608052;-0.0001578678493388;-0.00074481731280684;7.5001022196375e-05;7.4160678195767e-05;4.7545683628414e-05;-4.447681203601e-05;-4.5250919356477e-05;-0.00071714958176017;1.8358519810135e-05;-0.00020801596110687;-6.5728869230952e-05;-1.7874597688206e-05;-0.00048211414832622;-9.6057512564585e-05;-0.00017589102208149;0.00038780484464951;-3.5818477044813e-05;-2.4925910111051e-05;0.0003853780508507;-2.6509176677791e-05;0.0010678741382435;5.1168655772926e-05;-4.2729907363537e-06;1.4419910257857e-05;-5.8531128161121e-05;1.2099536434107e-05;0.00014406084665097;0.00023554210201837;-0.00047182451817207;-0.00018491024093237;-0.00086757121607661;8.4744904597756e-05;-0.00042641235631891;5.6717206462054e-05;0.00014697834558319;3.575506980269e-06;-5.5619078921154e-05;-0.00017649162327871;0.001134741702117;7.5492331234273e-05;-0.00039019051473588;4.9091508117272e-05;-0.00010442652273923;0.00061843439470977;9.2556518211495e-05;-0.00013148059952073;-0.00037987215910107;7.9961224400904e-05;8.1823003711179e-05;7.079160423018e-05;0.0001882215437945;0.00056253204820678;-0.00015382071433123;0.00010854827269213;4.3647155507642e-06;-0.00051382434321567;-4.7839810576988e-05;0.00031016679713503;9.0974688646384e-05;-0.00031848443904892;0.00013662609853782;0.00052174035226926;-4.7564630222041e-05;0.00037670641904697;-3.1130046409089e-05;-7.0346490247175e-05;-4.2630053940229e-05;4.0711889596423e-05;-6.0467220464488e-05;0.0014080976834521;-3.0454861189355e-05;-1.0667364222172e-05;3.7641950711986e-06;-0.00028677185764536;-0.00030339724617079;0.00033229618566111;0.00025668586022221;7.2319860919379e-05;-0.0002242940972792;-0.00020193039381411;-0.00038421835051849;-3.318781091366e-05;-0.0012763888807967;7.6762611570302e-05;0.00034554061130621;3.2285926863551e-05;-0.00072317681042477;3.8461772078335e-07;0.00035021346411668;5.2564544603229e-05;7.5315474532545e-05;7.6606178481597e-05;0.00056181324180216;-0.0001698619016679;-0.00099579698871821;9.6907337137964e-05;3.7840254663024e-05;5.6580171076348e-05;-5.9106951084686e-05;-3.5377524909563e-05;-0.0010038012405857;3.1155464967014e-05;-0.00035091297468171;-8.2088197814301e-05;1.2989461538382e-05;-0.00058930233353749;-9.8620388598647e-05;-0.00019070938287769;0.0004612160846591;-3.7003450415796e-05;-7.4591145676095e-05;0.00051750364946201;-6.3399827922694e-05;0.0014220889424905;6.5152504248545e-05;5.59520231036e-05;1.1981846910203e-05;7.399611058645e-05;1.0904550435953e-05;0.00013000461331103;0.00024715310428292;-0.00045306197716855;-0.00021032607764937;-0.0010587975848466;0.00012135689030401;-0.00076077785342932;8.4616120147984e-05;0.00011726649245247;3.8341258914443e-06;-5.6600387324579e-05;-0.00018351899052504;0.001119380700402;6.6088752646465e-05;-0.00059175252681598;4.7905472456478e-05;-0.00016070769925136;0.00067864789161831;6.6548418544699e-05;-0.00016600705566816;-0.00040979727054946;0.00018455421377439;3.8193546060938e-05;0.00024312830646522;0.00020171386131551;0.00093996524810791;-0.0001669811172178;0.00024193373974413;1.3589349691756e-05;-0.00057728524552658;-4.6001845475985e-05;0.00042573941755109;0.0001327144127572;-0.00039459360414185;0.00013808853691444;0.00080882967449725;-0.00010398962331237;0.00042049321928062;-2.9923126021458e-06;-7.517194171669e-05;-5.2002935262863e-05;6.2628409068566e-05;-9.5224488177337e-05;0.0014018578222021;-3.5380413464736e-05;4.1546099964762e-05;-7.5640723480319e-06;-0.00033081544097513;-0.0004217877285555;0.00042006900184788;0.00024019139527809;0.00017044311971404;-0.0004027649119962;-0.0002471269108355;-0.00037480407627299;-1.1425922821218e-05;-0.0014415672048926;9.5888746727724e-05;0.00037230487214401;4.5142460294301e-05;-0.00072354328585789;2.0466288788157e-06;0.00036851046024822;4.5273260184331e-05;0.00011357351468178;0.00012182710634079;0.00075294700218365;-0.00019564968533814;-0.0011589354835451;0.00011203952453798;-2.1703252059524e-05;6.4913510868791e-05;-7.4788425990846e-05;-3.189420021954e-05;-0.0013406517682597;4.9101483455161e-05;-0.00046435522381216;-9.9227436294314e-05;8.3416096458677e-05;-0.00074681779369712;-8.3255734352861e-05;-0.0001770972594386;0.000563693291042;-9.067894279724e-05;-0.00013446557568386;0.00061361421830952;-0.00010533105523791;0.00164355779998;8.7102307588793e-05;0.00010301490692655;8.3321147030802e-06;0.00030724302632734;7.0892924668442e-06;4.8113550292328e-05;0.00052724796114489;-0.00024861667770892;0.00048957177205011;0.00018457918486092;5.7546778407414e-05;-1.6387997675338e-05;-3.1940315238899e-05;-2.0457322534639e-05;-4.6187587940949e-06;3.0285809771158e-05;-0.0014001519884914;0.00016721221618354;0.00030842851265334;9.4863826234359e-06;0.00021160318283364;-5.0561015086714e-05;-0.00043905584607273;-0.00013157875218894;-7.2651291702641e-06;4.3482737964951e-05;0.00022111047292128;7.9108693171293e-05;-1.2268366845092e-05;0.00015540859021712;-0.00020743595086969;-0.00023787973623257;7.2517424996477e-05;0.00065549957798794;-3.9447215385735e-05;-0.00039492754149251;2.9503355108318e-05;-0.00017755643057171;7.7749573392794e-06;0.00056019210023805;9.5611540018581e-05;0.00065266177989542;-5.0697533879429e-05;2.2263411665335e-05;-7.8188131737988e-06;4.4874428567709e-05;-3.8952053728281e-05;0.00093969027511775;-3.0243504625105e-06;0.00025811971863732;-3.0934374080971e-05;-0.00020818974007852;-6.4643386394891e-06;-0.00022780959261581;0.0003561295743566;0.00016783452883828;-0.00040145602542907;7.8707096690778e-05;-0.00042491254862398;-0.00015965419879649;-0.0012816705275327;-3.5794801078737e-05;8.5155923443381e-05;6.510125240311e-05;-0.00050940178334713;1.9109358618152e-05;0.00019953626906499;1.1574878044485e-05;2.2460757520548e-07;5.8636233006837e-05;0.00075111706973985;4.1714698454598e-05;-0.00074311182834208;-0.00011460279347375;-3.2358715543523e-05;0.00012867127952632;-2.6088093363796e-05;2.731481254159e-05;-0.00092097499873489;-2.9577187888208e-05;-0.00026826674002223;1.8030559658655e-05;3.2310457754647e-05;-7.2938448283821e-05;-0.00046732154441997;0.00014774045848753;-0.00012175390293123;-0.00033549146610312;0.00035008214763366;0.00041433295700699;-0.00021132522670086;0.00096011051209643;-3.3623218769208e-05;0.00010261489660479;5.2625629905378e-05;0.00026668954524212;8.7725074990885e-06;4.7524549700029e-06;1.1693337910401e-05;0.00026722135953605;-0.00048441495164298;-0.00016885819786694;-0.00066427473211661;3.5503038816387e-05;-0.00033611146500334;3.8157064409461e-05;7.8779929026496e-05;-1.0203863894276e-05;-2.5710309273563e-05;-0.00021027107140981;0.0012246326077729;2.6915502530755e-05;-0.00044330197852105;4.5485354348784e-05;-0.00021534253028221;0.00044528604485095;9.8537529993337e-05;-5.5811680795159e-05;-0.00025985357933678;8.0105695815291e-05;3.3363718102919e-05;1.84163582162e-05;0.00021142035257071;0.00029047270072624;-0.00010242898133583;0.00025979508063756;4.1960378439398e-05;-0.00062065367819741;-4.110033478355e-05;0.00044228468323126;4.1037830669666e-05;-0.00023741158656776;0.0001482847292209;0.00084334227722138;-0.00011393859313102;0.00060441793175414;4.8057722779049e-06;-7.3135715865646e-06;-4.5756019972032e-05;6.1921324231662e-05;-2.5326322429464e-05;0.00097826647106558;-3.6660279874923e-05;0.00023357992176898;-2.2800848455518e-05;-0.00026241145678796;-0.000407375395298;0.00045915966620669;0.00019298461847939;0.00018430172349326;-0.00053642626153305;-0.00022635475033894;-0.00042523673619144;-5.1579583669081e-05;-0.0013675470836461;0.00010843428026419;0.00016999579383992;2.6094749046024e-05;-0.00054959824774414;1.4383394955075e-05;0.00024472622317262;9.1973473899998e-05;-9.1095207608305e-06;7.8201235737652e-05;0.0010020344052464;-0.00020786268578377;-0.00081986852455884;0.00012439192505553;-5.9478988987394e-05;3.8601887354162e-05;-3.7820751458639e-05;-6.3736719312146e-05;-0.0011187035124749;3.0618044547737e-05;-0.00027570818201639;-9.0360706963111e-05;8.7580447143409e-05;-0.00070139247691259;7.2163980803452e-05;-0.00013206960284151;0.00054955203086138;-0.00035020848736167;-0.00019589970179368;0.00049784622387961;-4.9582336941967e-05;0.0010288861813024;8.9499415480532e-05;8.4916340711061e-05;1.5713194443379e-05;0.00036199280293658;9.2822347141919e-06;-5.1451632316457e-05;0.00054551678476855;-0.00024930713698268;0.00020738228340633;0.00014524921425618;-0.00021656455646735;3.7757443351438e-05;-3.4286360460101e-05;2.1162359189475e-06;-1.5367140804301e-05;3.3986263588304e-05;-0.0014397305203602;0.00017151211795863;0.00017254828708246;2.1525489501073e-05;0.00022177661594469;-4.3274591007503e-05;-0.00027737641357817;-0.00017476556240581;-6.0210757510504e-05;0.00014812365407124;0.00012425596651156;0.00022400912712328;-7.7851336754975e-06;0.0005566633772105;-0.00019509256526362;-0.00020147374016233;3.4636439522728e-05;0.00065999443177134;-4.8604491894366e-05;-0.00036900507984683;2.579025203886e-05;-3.0975614208728e-05;-7.3716219048947e-05;0.00053080421639606;0.00013219029642642;0.00063236366258934;-2.5813715183176e-05;4.2233757994836e-05;9.9617523119377e-07;3.7399753637146e-05;-3.0018680263311e-05;0.00061962642939761;5.6568500440335e-05;0.00030924705788493;-2.063106148853e-05;-0.00015634435112588;-1.9289011106594e-05;-0.0002365134714637;0.00036192362313159;0.00014144851593301;-0.00041317811701447;6.8610788730439e-05;-0.00039495047531091;-0.00017018448852468;-0.0010931086726487;-9.5158153271768e-05;-2.7420028345659e-06;6.7809451138601e-05;-0.0003835546085611;-4.8264968199874e-07;0.0001257613330381;1.9677694581333e-05;-9.4637558504473e-05;9.5621959189884e-05;0.00092899706214666;1.8168225324189e-06;-0.00048400519881397;-0.00012606958625838;-4.1794854041655e-05;0.0001287791528739;-8.8592787506059e-06;1.3906294043409e-05;-0.00075809477129951;-5.0601021939656e-05;-0.00014270927931648;-3.2648350156705e-07;3.378469045856e-05;-6.7348126322031e-05;-0.0004309014766477;0.00024607323575765;-8.7390442786273e-05;-0.0005194513942115;0.00034438059083186;0.00030877336394042;-0.00023986226005945;0.0005614782567136;8.7536309365532e-06;7.0272202719934e-05;5.715286170016e-05;0.00025991859729402;1.6251775377896e-05;-3.915001070709e-05;1.524120762042e-05;0.00070234044687822;-0.00030283688101918;-0.00025822635507211;7.5446761911735e-05;-0.00037993583828211;0.00014243628538679;-2.8319349439698e-05;-1.9824479750241e-05;-2.3521959519712e-05;4.0262340917252e-05;-0.0017082305857912;0.00020664242038038;0.000155879475642;1.8450527932146e-05;0.00028830964583904;-1.5790001270943e-05;2.0651774320868e-05;-0.00035532991751097;-0.00011411370360292;0.00041858179611154;-7.2551323683001e-05;0.00034049834357575;9.4395254564006e-05;0.00093428714899346;-0.00017430727893952;-0.00026680051814765;-2.3432166926796e-05;0.00079048745101318;-6.4018182456493e-05;-0.00044728216016665;2.5851095415419e-05;0.00019647374574561;-0.00024288478016388;0.00093198550166562;0.0002579701540526;0.00076145370258018;1.0972973541357e-05;5.8630768762669e-05;6.3105224398896e-05;4.3529078538995e-05;-3.0161923859851e-05;0.00020981927809771;0.00018934231775347;0.00050259486306459;-7.925078534754e-06;-0.00011707749217749;-6.5594023908488e-05;-0.00041990663157776;0.00064045761246234;0.00014815530448686;-0.00078057881910354;0.00012362511188257;-0.00042576811392792;-0.00037089746911079;-0.0011860688682646;-0.00025253379135393;-0.00011475155042717;0.00010619744716678;-0.00025851832469925;-3.9271795685636e-05;1.8998520317837e-05;4.8627058276907e-05;-0.00030575023265556;0.00021342837135307;0.0017863997491077;-6.4458719862159e-05;-0.00024060736177489;-0.00023103119747248;-8.0611454905011e-05;0.00016484977095388;5.4081638154457e-06;6.4250007199007e-06;-0.00097785994876176;-0.00011670183448587;8.2967535490752e-06;-3.3210515539395e-05;9.378094546264e-05;-8.9359702542424e-05;-0.00063720636535436;0.00048088727635331;-5.5513570259791e-05;-0.0010720611317083;0.0005437649670057;0.00025219665258192;-0.00036251218989491;0.00016140750085469;8.8470442278776e-05;1.7114347429015e-05;0.00010321801528335;0.00045597794814967;3.9835162169766e-05;-0.00018022423319053;2.564734313637e-05;0.00066778116161004;-0.0002738501643762;-0.00045999171561562;2.3514096028521e-05;-0.00043514597928151;0.00017252427642234;-2.4680488422746e-05;-2.2327343685902e-05;-2.4356930225622e-05;3.6822235415457e-05;-0.0015891521470621;0.00018441492284182;9.9827186204493e-05;1.3555673831434e-05;0.00027302905800752;1.3894299399908e-07;0.00017196642875206;-0.00038594956276938;-0.00012681640509982;0.0004872482677456;-0.00015960187010933;0.00036258492036723;0.00012288131983951;0.0010219115065411;-0.00012978789163753;-0.00024443224538118;-5.0539729272714e-05;0.00073400203837082;-5.9553163737291e-05;-0.00040746363811195;2.1447171093314e-05;0.00030244307708926;-0.0003024656616617;0.00091224699281156;0.00028429619851522;0.00067223445512354;4.3838219426107e-05;6.0204427427379e-05;8.0563622759655e-05;3.7196918128757e-05;-2.4518820282537e-05;-2.1956047930871e-05;0.00023410930589307;0.00050080276560038;2.8182739697513e-06;-8.2066013419535e-05;-7.5154763180763e-05;-0.00041954155312851;0.00065859413007274;0.00012569078535307;-0.00079200236359611;0.00010419397585792;-0.00036493901279755;-0.00040279349195771;-0.00099485728424042;-0.00029909625300206;-0.00014605587057304;0.00010168515291298;-0.00016844077617861;-5.5547112424392e-05;-2.5908462703228e-05;5.4425181588158e-05;-0.0003717275976669;0.00023911183234304;0.0018942751921713;-9.9987846624572e-05;-7.0124144258443e-05;-0.00023435310868081;-8.032991172513e-05;0.000155522764544;1.2339445675025e-05;8.6309576374788e-08;-0.0008880504174158;-0.00012969954696018;7.9942255979404e-05;-4.8082689318107e-05;9.866740583675e-05;-8.2339254731778e-05;-0.00059443147620186;0.00053115113405511;-3.092275801464e-05;-0.0011825672117993;0.00052763277199119;0.00017285873764195;-0.000364200968761;-6.6517386585474e-05;0.00012124652130296;-1.2806010090571e-05;0.00010414638381917;0.00045054717338644;4.5822358515579e-05;-0.00020441132073756;2.7201313059777e-05;-0.00065777415875345;0.00064789725001901;-0.00039114520768635;0.00029172856011428;6.3573074839951e-06;7.1969421696849e-05;-5.2811901696259e-05;8.8075052190106e-05;2.3596325263497e-05;-2.7928592317039e-05;0.00034728384343907;-0.00039505411405116;2.7384065106162e-05;-1.330515351583e-05;8.8925944510265e-06;1.7637397832004e-05;0.00010369796655141;3.3856071240734e-05;-1.8700693544815e-05;7.3519338911865e-05;-0.0001755030680215;0.00016209442401305;-0.00018640478083398;-1.5630171219527e-06;5.8492019888945e-05;-2.7052259611082e-05;-3.8251248042798e-05;-6.5768013882916e-05;0.00011681672913255;-2.1217705580057e-05;-6.8184194788046e-06;0.00036546820774674;0.00021136275609024;-8.6374173406512e-05;-9.102145122597e-05;0.00030278423218988;0.00030759986839257;0.00018104941409547;0.0002125873870682;-4.2759704228956e-05;-5.3367464715848e-05;-0.00050096382619813;-0.00033353370963596;0.00019860269094352;0.00015851923672017;7.2572300268803e-05;5.948705074843e-05;0.0010082237422466;0.0011263478081673;9.240017789125e-06;-0.0011325285304338;-0.0010615357896313;-0.00031256143120117;-0.00039410157478414;0.00031146209221333;0.00024178964667954;-0.00030047522159293;-0.00026536575751379;-4.3514421122381e-05;-6.2774306570645e-05;-5.1464870921336e-05;-3.475424455246e-05;-0.00043267285218462;-0.00029392351279967;0.00026132730999961;6.6399879870005e-05;0.0007147888536565;0.00056405423674732;6.5804146288428e-05;1.8156279111281e-05;-1.12370653369e-05;2.4106814180413e-06;0.00022562735830434;0.00016868821694516;9.6605865110178e-05;7.2519644163549e-05;4.943899330101e-05;5.8087178331334e-05;0.00160547636915;0.00082344858674332;9.8253782198299e-05;-0.0012964415363967;-0.0010771688539535;-0.00036943634040654;-0.00030138870351948;-0.00035994374775328;-0.00024804513668641;-0.00023291210527532;-0.00018053836538456;-5.7043656852329e-05;-3.344074866618e-05;1.135188540502e-05;-8.2467067841208e-06;-0.00068546237889677;0.00065620354143903;-0.0003668442950584;0.00037131167482585;4.037927283207e-06;8.629345393274e-05;-5.5149881518446e-05;9.199765190715e-05;2.4550852685934e-05;-2.8446769647417e-05;0.00038382830098271;-0.00039118895074353;3.1592073355569e-05;-1.6598801266809e-06;2.5828815068962e-06;1.3172528269934e-05;3.6039564292878e-05;4.8936748498818e-05;-1.0868937351916e-05;9.6754745754879e-05;-0.00018908760102931;0.00015507788339164;-0.00020794352167286;-3.7878879084019e-05;1.2525976671895e-05;-1.6384306945838e-05;-3.5403354559094e-05;-7.7532007708214e-05;0.00011263081978541;-1.7815073078964e-05;-5.870782842976e-06;0.00033031654311344;0.00025741755962372;-8.5726998804603e-05;-8.5084480815567e-05;0.00033810830791481;0.00032068160362542;0.00019116009934805;0.00021973870752845;-4.5297878386918e-05;-5.530369526241e-05;-0.00047537163482048;-0.00038072740426287;0.00019637103832792;0.00017181046132464;7.3367322329432e-05;6.4599662437104e-05;0.0010648493189365;0.001197146717459;1.3019270227232e-05;-0.001191480900161;-0.0011393309105188;-0.00034939136821777;-0.00040556106250733;0.0002994620881509;0.00026314402930439;-0.0003087272925768;-0.00028142443625256;-5.1048024033662e-05;-5.7752909924602e-05;-4.745597470901e-05;-4.1507886635372e-05;-0.00042322522494942;-0.00033266184618697;0.00020985005539842;0.00012089329538867;0.00072973471833393;0.00059821468312293;6.7306558776181e-05;1.4730926523043e-05;-1.3910687812313e-05;4.7861371967883e-06;0.00023535396030638;0.00017192373343278;8.5193038103171e-05;8.535296365153e-05;5.2933406550437e-05;6.199494964676e-05;0.0016758148558438;0.00085032032802701;0.00010332821693737;-0.0013171209720895;-0.0011479174718261;-0.00038096151547506;-0.00031105510424823;-0.00034046117798425;-0.00028599650249816;-0.00023835756292101;-0.00018899742281064;-5.8313209592598e-05;-2.839546505129e-05;1.4926687981642e-05;-1.5284287655959e-05;-0.00048440956743434;0.00045076818787493;-0.00028484707581811;0.00035716604907066;-5.9328745010134e-06;7.6677548349835e-05;-3.9841495890869e-05;6.6584318119567e-05;1.6209907698794e-05;-1.8489421563572e-05;0.0003020913572982;-0.00027620737091638;1.1943848221563e-05;2.009355557675e-05;-2.2661952243652e-06;5.539276116906e-06;-2.1991703761159e-05;4.4532964238897e-05;-2.2234401058085e-06;0.00010669814946596;-0.00016293123189826;0.00010174780618399;-0.00015826620801818;-3.073142215726e-05;-4.4178581447341e-05;-1.75695745952e-07;-2.6245939807268e-05;-6.2637052906211e-05;7.483586523449e-05;-6.4274768192263e-06;-7.0861228778085e-06;0.00019501989299897;0.00020379523630254;-4.9279296945315e-05;-4.7398149035871e-05;0.00029830518178642;0.00026518577942625;0.0001443137152819;0.00016251034685411;-3.4650529414648e-05;-4.0854112739908e-05;-0.00031247819424607;-0.00029986933805048;0.00013328553177416;0.00012679478095379;5.5044831242412e-05;5.0955262850039e-05;0.00085062009748071;0.00095816451357678;1.7354701412842e-05;-0.00095491035608575;-0.00092467712238431;-0.00029473257018253;-0.00031636012136005;0.00019490113481879;0.00019548588898033;-0.00023000618966762;-0.00021456567628775;-3.5542871046346e-05;-3.1373907404486e-05;-3.1051389669301e-05;-3.3987016649917e-05;-0.00029360520420596;-0.00026402933872305;8.4212901128922e-05;0.00010066820686916;0.00051883363630623;0.00043904187623411;4.0723392885411e-05;-1.0037077800007e-06;-1.171522308141e-05;5.0165231186838e-06;0.00017433860921301;0.00012257126218174;4.0745209844317e-05;5.7423923863098e-05;4.2348270653747e-05;4.951447044732e-05;0.0012650054413825;0.00059591821627691;8.0926416558214e-05;-0.00093320850282907;-0.00085318263154477;-0.00026852506562136;-0.00021570461103693;-0.00021590909454972;-0.00021676837059204;-0.00016449904069304;-0.00013193210179452;-3.2820102205733e-05;-6.709881745337e-06;1.0574122825346e-05;-1.8249558706884e-05;0.00021301505330484;-0.00048528902698308;-1.1015622476407e-05;0.00013376709830482;-0.00012448088091332;0.00037882901960984;-2.2008427549736e-05;6.6183725721203e-05;-2.2044951037969e-05;1.2872129445896e-05;-0.00016988883726299;0.0012653289595619;-5.359993338061e-06;-7.365698547801e-05;1.4678487787023e-05;-0.0002401054953225;-5.8140372857451e-05;0.00021821992413606;9.3035887402948e-05;4.7363388148369e-05;-0.00021261746587697;4.0704899220145e-06;-0.00035764533095062;0.00011435496708145;-0.00074945960659534;2.7932099328609e-05;0.00016631044854876;5.6117594795069e-05;-0.00061373796779662;-2.6524727218202e-05;0.00035989639582112;-0.00030779218650423;0.00030357367359102;0.00029654082027264;0.0005011530010961;4.8106034228113e-05;0.00037728613824584;3.765057772398e-05;6.521802424686e-05;-1.5229915334203e-05;2.644352207426e-05;0.00025601041852497;3.6032040952705e-05;1.2987136869924e-05;0.00032027036650106;-5.8138077292824e-05;-0.00010476926399861;-0.00033234211150557;0.00042702339123935;8.7803113274276e-05;4.6384171582758e-05;-0.00042495515663177;-0.00025744884624146;-0.00025809611543082;-0.00031971294083633;-0.00060386979021132;9.0122666733805e-05;-6.9549423642457e-05;-6.4968116930686e-05;-0.00020394549937919;4.2522980947979e-05;4.5689255784964e-05;0.00020681934256572;-0.00029741166508757;-7.2199596615974e-05;0.0014720134204254;-0.00020811153808609;-7.3063492891379e-05;0.00013804783520754;-7.1267968451139e-05;-6.691123417113e-06;1.8082431779476e-05;-0.00013175951607991;-0.00064429576741531;-3.2460404327139e-05;6.7323067924008e-05;-6.7028369812761e-05;7.4876086728182e-05;-0.00048594080726616;0.00045228021917865;-3.903348260792e-05;0.00044503551907837;-0.00097219471354038;-0.00030573617550544;0.00016787055938039;0.00010604152339511;-3.5005472454941e-05;8.5076280811336e-05;-1.4376181752596e-05;4.0218936192105e-05;0.00031634548213333;2.0443363609957e-05;-0.00015389783948194;0.00031412762473337;-0.00063684396445751;-7.6474534580484e-05;-4.3049254600191e-05;-0.0001247954351129;0.00029567914316431;-1.2226137187099e-05;8.0214704212267e-05;-2.706986379053e-05;8.5426263467525e-06;-0.00025471331900917;0.0016124909743667;-4.3430063669803e-06;-0.00020547308668029;3.0659779440612e-05;-0.0003069585072808;7.0663270889781e-05;0.0002407472638879;8.1913662143052e-05;-1.8058954083244e-05;-0.00019082009384874;1.5878251360846e-05;-0.00035422598011792;0.00020242725440767;-0.00068766443291679;-1.5602360008415e-06;0.00025113177252933;7.6279320637695e-05;-0.00078925746493042;-3.9358514186461e-05;0.00049213710008189;-0.00025523445219733;0.00017725155339576;0.00030965643236414;0.00083618913777173;-1.9991091903648e-05;0.00064331403700635;3.8494745240314e-05;6.570197729161e-05;-3.1221079552779e-05;4.9233989557251e-05;0.00021744873083662;0.00033415920916013;-7.9862911661621e-06;0.0004266508622095;-6.472446693806e-05;-0.00017590033530723;-0.00046047291834839;0.00058278103824705;0.00014693787670694;0.00013728723570239;-0.00065960531355813;-0.00031762575963512;-0.00041633876389824;-0.00029518181690946;-0.0010970896109939;0.00013006155495532;-4.4015265302733e-05;-4.6451543312287e-05;-0.00034923813655041;4.6015189582249e-05;9.9893208243884e-05;0.00022986055410001;-0.00028596559423022;-3.5029584978474e-05;0.0017545745940879;-0.00028245995054021;-0.0003209464775864;0.00017112128261942;-9.8658078059088e-05;4.4644539229921e-06;9.9297876658966e-06;-0.00015140530013014;-0.00097208574879915;-1.8587874365039e-05;-3.8929160837142e-06;-9.4655159045942e-05;0.00010439898323966;-0.00072765839286149;0.00043835316319019;-7.7744509326294e-05;0.00063285272335634;-0.0010289226192981;-0.00035134301288053;0.00032714955159463;8.3797800471075e-05;0.00023613970552105;0.00011596569675021;1.8651706341188e-05;4.3564527004492e-05;0.00044238913687877;2.1521183953155e-05;-0.00018537959840614;0.00027642148779705;-0.00051675940630957;-0.00012980733299628;-0.00034739289549179;-3.7888861697866e-05;1.6199908714043e-05;4.0959557736642e-06;7.0492991653737e-05;-1.948255339812e-05;-4.1665421122161e-06;-0.0002237482694909;0.0013200932880864;2.7427493023424e-06;-0.00028490932891145;4.110591544304e-05;-0.00024521051091142;0.00026416877517477;0.00013737606059294;1.8252128938911e-05;-0.00014322108472697;-2.8088237741031e-05;3.7805122701684e-05;-0.00017017195932567;0.00021027050388511;-0.00022895510483067;-5.1841609092662e-05;0.00023411100846715;5.8883972087642e-05;-0.00065454537980258;-3.7291065382306e-05;0.00043146027019247;-6.898522406118e-05;-6.4261752413586e-05;0.00018473601085134;0.00076207518577576;-7.9123325122055e-05;0.00063058891100809;1.1334326700307e-05;3.414397360757e-05;-3.6161975003779e-05;5.1882670959458e-05;6.2722472648602e-05;0.00064002285944298;-2.6891679226537e-05;0.00031676236540079;-3.5247754567536e-05;-0.00020170852076262;-0.00037750811316073;0.0004645194276236;0.00015812579658814;0.00015203094517346;-0.00055133790010586;-0.00022336738766171;-0.00041735172271729;-0.00012569392856676;-0.0011774372542277;0.00010907519754255;4.2882846173597e-05;-7.1942025670069e-07;-0.00041920252260752;2.4870536435628e-05;0.00015922494640108;0.00013498804764822;-0.00011539239494596;2.7521577067091e-05;0.0011947952443734;-0.00021486642071977;-0.00054502172861248;0.00013617478543893;-7.5896925409324e-05;1.8851367713069e-05;-1.1078620445915e-05;-9.0455112513155e-05;-0.00093535572523251;9.5894365585991e-06;-0.00013508285337593;-8.3694081695285e-05;8.2593018305488e-05;-0.00064029189525172;0.00021686883701477;-9.9566947028507e-05;0.00052807398606092;-0.00058807281311601;-0.00024809059686959;0.00039262053905986;5.6529806897743e-06;0.00058961403556168;9.0258035925217e-05;5.9294874517946e-05;2.375075382588e-05;0.00036326108966023;1.347622674075e-05;-0.00010451876005391;0.00082741613732651;-0.00033102426095866;-0.00051480799447745;4.2618255974958e-05;-0.00070197915192693;0.00019886124937329;-4.3208179704379e-05;-8.9649489609656e-07;-3.5574306821218e-05;4.9646780098556e-05;-0.002067384775728;0.00022299017291516;4.9069753004005e-05;2.8267846573726e-05;0.00034337851684541;-1.1762586836994e-05;0.00014382408699021;-0.00046119146281853;-0.00018111473764293;0.00058083888143301;-0.00014739761536475;0.0005387588753365;0.00011441955575719;0.0014562879223377;-0.00017126306192949;-0.00026548284222372;-5.9221376432106e-05;0.00094357441412285;-7.5968033343088e-05;-0.00049764761934057;2.5972000003094e-05;0.00048469236935489;-0.00042980813304894;0.00086921075126156;0.00039176509017125;0.00066112546483055;8.0015895946417e-05;8.3900929894298e-05;8.0242949479725e-05;3.5501951060724e-05;-1.8853586880141e-05;-0.00014660232409369;0.00032393174478784;0.0005631540552713;2.229898746009e-05;-8.9447887148708e-05;-9.0149667812511e-05;-0.00050903670489788;0.00065942818764597;0.0001249443157576;-0.0007204971043393;9.8683078249451e-05;-0.00037547395913862;-0.00042465075966902;-0.00096340040909126;-0.0004178291419521;-0.0001800866011763;0.0001142682012869;-0.00018039775022771;-8.0818594142329e-05;-2.9071501558064e-05;6.2960134528112e-05;-0.00046404820750467;0.00028908875538036;0.0022617680951953;-0.00012722812243737;7.0919359131949e-06;-0.00026960138347931;-8.614069520263e-05;0.00019843819609378;1.8151822587242e-05;-5.4112970246933e-06;-0.00096215429948643;-0.00015663550584577;0.00012074002006557;-6.2098559283186e-05;0.00010522519005463;-9.9446770036593e-05;-0.00066424655960873;0.00072129094041884;-2.7084635803476e-05;-0.0015102131292224;0.00060067267622799;0.00015839507977944;-0.00047445861855522;-0.00017126274178736;0.00015221419744194;-2.9508408260881e-05;0.00012303567200433;0.0004901495995;5.5317155783996e-05;-0.00022777490084991;3.5734476114158e-05;0.00086718762759119;-0.00032749757519923;-0.00075897149508819;-1.1339921002218e-05;-0.00078023644164205;0.00024545312044211;-4.2263163777534e-05;-8.1919761214522e-06;-3.8766804209445e-05;4.9909966037376e-05;-0.0021387953311205;0.0002158193528885;1.406845603924e-05;2.2437841835199e-05;0.00036190592800267;5.1981915021315e-06;0.00031835489789955;-0.00053301540901884;-0.00020413649326656;0.00069567660102621;-0.00025245835422538;0.00058943766634911;0.0001589319872437;0.0016381365712732;-0.00013407599180937;-0.00027791323373094;-9.1372930910438e-05;0.00097862083930522;-7.6163654739503e-05;-0.000509932579007;2.3992253773031e-05;0.00062070798594505;-0.00052359618712217;0.00095556303858757;0.0004489776911214;0.00066545372828841;0.00012267648708075;9.3511465820484e-05;0.00010763516911538;3.4463722840883e-05;-1.7877249774756e-05;-0.00034297682577744;0.00039457637467422;0.00062016031006351;3.2200758141698e-05;-7.2096197982319e-05;-0.0001068031124305;-0.00054666958749294;0.0007695882814005;0.00012211679131724;-0.00083679379895329;8.0125144449994e-05;-0.00036980203003623;-0.00050944823306054;-0.00091709609841928;-0.00049618334742263;-0.00022269939654507;0.00011964506120421;-0.00013156786735635;-0.00010311848018318;-6.5821805037558e-05;7.5148083851673e-05;-0.00057474651839584;0.00034254445927218;0.002587616443634;-0.00018028136400972;0.00013953800953459;-0.00029302149778232;-9.5474104455207e-05;0.00020980382396374;2.5370754883625e-05;-1.1336457646394e-05;-0.000995799084194;-0.00018278571951669;0.00018466252367944;-8.3460377936717e-05;0.00012055190745741;-0.00010150252637686;-0.0006761698750779;0.00083738163812086;-1.0313688107999e-05;-0.0017640591831878;0.00063623616006225;0.00011313685536152;-0.00052266288548708;-0.0003606932295952;0.00020019471412525;-5.4994306992739e-05;0.00013316381955519;0.00053964677499607;6.6616143158171e-05;-0.00026983732823282;4.0674105548533e-05;-0.0007079248316586;0.00071833160473034;-0.00037499764584936;0.00014554319204763;1.1888868357346e-05;3.1913798011374e-05;-4.2974919779226e-05;7.0754940679763e-05;2.1991831090418e-05;-2.7605055947788e-05;0.0003604965750128;-0.00046173765440471;-1.0940445918095e-06;-1.6822667021188e-05;9.8249656730331e-06;3.3243766665692e-05;0.00018700040527619;3.3759490634111e-06;-2.8914964786964e-05;9.9817021691706e-05;-0.00020389411656652;0.00012621787027456;-9.8560165497474e-05;-4.5707006393059e-06;0.0001842370693339;-1.7171167201013e-05;-5.9819947637152e-05;-4.7013123548822e-05;0.0001222919090651;-1.7377247786499e-05;-1.6451491319458e-05;0.00046828333870508;0.00015501651796512;-0.00012135260476498;-7.766889029881e-05;0.0001837650052039;0.00025382754392922;0.00018483582243789;0.00021426760940813;-3.8285699702101e-05;-4.34582507296e-05;-0.00063357327599078;-0.00030701598734595;0.00020627172489185;0.0001559681550134;7.1041002229322e-05;4.482944495976e-05;0.00079580786405131;0.00098325870931149;-3.5815475712297e-05;-0.00093328970251605;-0.00088540167780593;-0.00023021045490168;-0.00034752106876113;0.00042287277756259;0.00023156327370089;-0.00030224616057239;-0.00025038394960575;-1.2362126653898e-05;-6.6674314439297e-05;-6.0845530242659e-05;-2.5503633878543e-05;-0.00047030777204782;-0.00025307564646937;0.00046106686932035;8.3734448708128e-05;0.00082902272697538;0.00061300460947677;7.3129347583745e-05;4.2393683543196e-05;-1.2319934285188e-05;-6.5751078182075e-06;0.00020560718257912;0.00014811639266554;0.00011532282951521;5.2088264055783e-05;5.9016783779953e-05;5.9697122196667e-05;0.0015590637922287;0.0010529168648645;0.00011834523320431;-0.0015414344379678;-0.0011794860474765;-0.00044661769061349;-0.00039559279684909;-0.00044622397399507;-0.00022849235392641;-0.00025184743572026;-0.00018435066158418;-2.9033366445219e-05;-1.5742974937893e-05;-5.6896169553511e-06;-5.736385446653e-06;-0.00097593589453027;0.00096260500140488;-0.00047336291754618;0.00030702477670275;2.1341575120459e-05;6.4139196183532e-05;-6.1204184021335e-05;0.00010202410339843;3.0879873520462e-05;-3.7264922866598e-05;0.0005338194896467;-0.00060342880897224;1.1524502042448e-05;-9.2355367087293e-06;4.0084078136715e-06;3.5809178370982e-05;0.00016097308252938;3.1332972866949e-05;-2.6754541977425e-05;0.00014529496547766;-0.00027748933644034;0.00016400402819272;-0.00017477595247328;-5.822354069096e-05;0.00017105470760725;-1.4022762115928e-05;-7.0416324888356e-05;-8.7110667664092e-05;0.00016036853776313;-1.7268124793191e-05;-1.9710874767043e-05;0.00055279186926782;0.00028479617321864;-0.0001501984661445;-0.0001244480808964;0.00032134604407474;0.0003586350067053;0.00025743164587766;0.00029527404694818;-5.4311407438945e-05;-6.4104693592526e-05;-0.00077636941568926;-0.00047933449968696;0.00027288129786029;0.00021982347243465;9.6407158707734e-05;7.1690017648507e-05;0.0011829897994176;0.0014229930238798;-3.4398093703203e-05;-0.0013678113464266;-0.0012987775262445;-0.00036865842412226;-0.00048445875290781;0.00051659235032275;0.00035781081533059;-0.00041473438614048;-0.00035916877095588;-3.5642235161504e-05;-8.0748257460073e-05;-7.4354255048092e-05;-4.394406278152e-05;-0.00060702761402354;-0.00039367930730805;0.00049386994214728;0.00016568136925343;0.0010981124360114;0.00085907697211951;0.00010052006837213;4.7170506149996e-05;-1.984311529668e-05;-4.1278372009401e-06;0.00029649341013283;0.00021436538372654;0.00013507362746168;8.9567780378275e-05;7.9607299994677e-05;8.475650975015e-05;0.0021916932892054;0.001389846438542;0.0001586697762832;-0.0020226999185979;-0.001654852181673;-0.00059574394254014;-0.00051758106565103;-0.00054762430954725;-0.00035558731178753;-0.00033949577482417;-0.00025943794753402;-5.1887767767766e-05;-2.3506165234721e-05;3.3971705306612e-06;-1.4807933439442e-05;-0.00099214352667332;0.00094487133901566;-0.00039716027094983;0.00041554326890036;2.6533742129686e-05;8.2429185567889e-05;-6.2354076362681e-05;0.00010439484321978;3.1742245482747e-05;-3.6595472920453e-05;0.000582572480198;-0.0005715272272937;2.2851349058328e-05;9.165078154183e-06;-8.4210532804718e-06;2.552614932938e-05;4.1137631342281e-05;5.9883343055844e-05;-1.1100089977845e-05;0.00016510579735041;-0.00027946804766543;0.00014130208001006;-0.00020597643742803;-0.00013383525947575;8.9070214016829e-05;3.7948861972836e-06;-6.0143349401187e-05;-0.00010777758143377;0.00014659891894553;-9.7200772870565e-06;-1.6300095012411e-05;0.00045820002560504;0.00036874040961266;-0.00013633922208101;-0.0001327649661107;0.00036737014306709;0.00034842031891458;0.00026231806259602;0.00029503289260902;-5.491004412761e-05;-6.5913023718167e-05;-0.0006870849756524;-0.00055324280401692;0.00025983509840444;0.00023019581567496;9.1991903900634e-05;7.9018202086445e-05;0.0012203444493935;0.001462685293518;-2.9197410185589e-05;-0.0014013458276168;-0.0013475969899446;-0.00041039852658287;-0.00047249562339857;0.00046177345211618;0.00040279777022079;-0.00040913125849329;-0.00037206840352155;-5.1803581300192e-05;-6.6993510699831e-05;-6.3523948483635e-05;-5.3913718147669e-05;-0.00056005507940426;-0.00044678486301564;0.00037430736119859;0.00026261917082593;0.0010710717178881;0.00089208834106103;0.00010286510223523;3.9939706766745e-05;-2.4212011339841e-05;5.4996064591251e-07;0.00030138363945298;0.00021567831572611;0.00010965922410833;0.00011180342698935;8.0180609074887e-05;8.7849533883855e-05;0.0022179549559951;0.0013843921478838;0.00015972048277035;-0.0019591157324612;-0.0017264001071453;-0.00059538730420172;-0.00051320862257853;-0.00048480098485015;-0.00041427434189245;-0.00033415769576095;-0.00026663701282814;-5.6120556109818e-05;-1.7098887838074e-05;1.2031257938361e-05;-2.5841645765468e-05;-0.00073229044210166;0.0006777077796869;-0.00025317797553726;0.00037603577948175;1.6758658603067e-05;7.5763360655401e-05;-4.6544279030059e-05;7.7876837167423e-05;2.3652240997762e-05;-2.6303130653105e-05;0.00045121315633878;-0.00039590382948518;2.0855630282313e-05;1.9828352378681e-05;-1.3196604413679e-05;1.2310574675212e-05;-4.153857298661e-05;6.0149701312184e-05;1.0535336514295e-06;0.00014274443674367;-0.00021476473193616;9.0205743617844e-05;-0.00016874117136467;-0.0001365131320199;1.1481911315059e-05;1.5287570931832e-05;-3.961099719163e-05;-8.7637592514511e-05;9.5894385594875e-05;-3.4908243833343e-06;-9.106329343922e-06;0.00028087006649002;0.00031797800329514;-8.5384730482474e-05;-9.2168491391931e-05;0.00029656628612429;0.000251976569416;0.0001960971421795;0.0002168693463318;-4.0525246731704e-05;-4.878999243374e-05;-0.00045482607674785;-0.00044992077164352;0.00018395988445263;0.00017703592311591;6.4105581259355e-05;6.0955819208175e-05;0.00091105751926079;0.0011035877978429;-1.8624714357429e-05;-0.0010498196352273;-0.0010228202445433;-0.00032786093652248;-0.00034216852509417;0.00030468267505057;0.00031584285898134;-0.00029630327480845;-0.00027997064171359;-4.6067994844634e-05;-4.0623472159496e-05;-4.0367482142756e-05;-4.5343382225838e-05;-0.00038375754957087;-0.00036016578087583;0.00021504871256184;0.0002608357463032;0.00077053770655766;0.00067348370794207;7.5974618084729e-05;2.4177743398468e-05;-2.0348439647933e-05;3.2464686228195e-06;0.00021846540039405;0.00015330735186581;6.5245090809185e-05;9.4664574135095e-05;5.9863941714866e-05;6.6848791902885e-05;0.0016346406191587;0.0010187186999246;0.00011932176857954;-0.0014042766997591;-0.0013120365329087;-0.00043867147178389;-0.00037605865509249;-0.00032129857572727;-0.00034039898309857;-0.00024071952793747;-0.00019828914082609;-3.8829286495456e-05;-3.9072574509191e-06;1.1858656762342e-05;-2.7481841243571e-05;0.00021244210074656;-0.00057567202020437;5.4705596994609e-05;0.00038068433059379;-0.00018498743884265;0.00065852090483531;-4.3492054828675e-05;8.6695101344958e-05;-2.8220998501638e-05;2.4067197955446e-05;-0.00016361822781619;0.0015648314729333;-9.1612291726051e-06;2.4486938855262e-05;5.2125915317447e-06;-0.0002970899513457;-0.00022042710043024;0.00030963963945396;0.00015302088286262;0.00013670038606506;-0.00034357947879471;-8.3282729974599e-06;-0.00054630031809211;7.6045973401051e-05;-0.0011997112305835;7.3516006523278e-05;0.00016559430514462;6.3001294620335e-05;-0.00075398990884423;-2.6337642339058e-05;0.00041175109799951;-0.00053474534070119;0.00061082752654329;0.00044635136146098;0.00039431906770915;0.00015067943604663;0.00027418168610893;5.7302098866785e-05;9.899225551635e-05;-5.4271727094601e-06;1.5502975657e-05;0.0004383169580251;-0.00027377647347748;4.4606898882193e-05;0.00037048675585538;-8.2519654824864e-05;-8.4628161857836e-05;-0.0003747558221221;0.00047980909585021;6.8376750277821e-05;-2.8607890271815e-05;-0.00038314674748108;-0.00032932631438598;-0.00021617955644615;-0.00052319274982437;-0.00037552876165137;9.4240305770654e-05;-0.00013059619232081;-0.0001210047485074;-0.00015552320110146;6.1431623180397e-05;1.3533943274524e-05;0.00029117436497472;-0.00046748394379392;-0.00015055200492498;0.0019533825106919;-0.00023636323749088;0.00015574246936012;0.00017686036881059;-7.9250232374761e-05;-2.2093063307693e-05;3.549214306986e-05;-0.00017966455197893;-0.00063986104214564;-6.4953957917169e-05;0.0001758598809829;-7.3268696723972e-05;8.426932618022e-05;-0.00048065939336084;0.00071690866025165;-1.7124950318248e-05;0.00047575321514159;-0.0014391579898074;-0.00042386050336063;8.376448386116e-05;0.0001855452574091;-0.00033702133805491;9.7041818662547e-05;-5.8449368225411e-05;5.7991943322122e-05;0.00035099807428196;3.0368511943379e-05;-0.00020138875697739;0.00027629995020106;-0.00063106324523687;-7.8686052802368e-06;0.0002347374393139;-0.00017471592582297;0.00056555354967713;-3.4828481147997e-05;8.599156717537e-05;-3.0175388019416e-05;2.0606432372006e-05;-0.00022132649610285;0.0016419809544459;-1.2206701285322e-05;-5.5339482059935e-05;1.793170486053e-05;-0.00031119145569392;-0.00010470658889972;0.00029282117611729;0.00013377411232796;8.1454360042699e-05;-0.00030275224708021;5.9293956837791e-06;-0.00050112960161641;0.00014812393055763;-0.0010694005759433;4.5925477024866e-05;0.00020072307961527;7.5392694270704e-05;-0.00079233176074922;-3.3000640542014e-05;0.00045479138498195;-0.00043334683869034;0.00044747564243153;0.00040100017213263;0.00059002719353884;7.9383040429093e-05;0.00043747166637331;4.9979225877905e-05;8.8338172645308e-05;-1.5080418961588e-05;2.9317461667233e-05;0.00036025937879458;-5.2632134611486e-05;2.367560955463e-05;0.00040832837112248;-7.857595483074e-05;-0.00011745381198125;-0.00042495594243519;0.00052611500723287;9.9814555142075e-05;4.8591999075143e-05;-0.00050579785602167;-0.00032808724790812;-0.00030151713872328;-0.00044408714165911;-0.00067418918479234;0.00011399426875869;-0.00010737768752733;-9.3257600383367e-05;-0.00022390643425751;5.688647433999e-05;3.9607188227819e-05;0.00027602986665443;-0.0004046713875141;-0.00010357715655118;0.0019275186350569;-0.00027251068968326;-1.855033042375e-05;0.00017809828568716;-9.0705209004227e-05;-1.2488791981013e-05;2.7956641133642e-05;-0.00017666054191068;-0.00077753176447004;-4.7306089982158e-05;0.00011928657477256;-8.4959756350145e-05;9.4021335826255e-05;-0.00061211572028697;0.00061598379397765;-4.0716844523558e-05;0.0005688343080692;-0.0013039372861385;-0.00040196749614552;0.00018020354036707;0.00015010105562396;-0.0001455769961467;0.0001113367616199;-2.9519571398851e-05;5.4160162108019e-05;0.00039677345193923;2.7328851501807e-05;-0.00020483777916525;0.00066495034843683;-0.00024108069192152;-0.0004818934830837;9.2277696239762e-06;-0.00073030748171732;0.00016426938236691;-4.5710996346315e-05;1.8952268874273e-05;-3.3881966373883e-05;4.2244028009009e-05;-0.001755234785378;0.00015775543579366;-4.2881176341325e-05;2.741877506196e-05;0.00028640817617998;-9.5970272013801e-06;0.0001494934404036;-0.00038741176831536;-0.0001760370505508;0.00049434322863817;-0.0001262551813852;0.00052881042938679;8.284918294521e-05;0.0014031103346497;-0.00011349096894264;-0.00018457540136296;-6.1635299061891e-05;0.00079650332918391;-5.9411300753709e-05;-0.00039539422141388;1.8462687876308e-05;0.00058355316286907;-0.00045575806871057;0.00046950293472037;0.00038813488208689;0.00033001328120008;0.00011857683421113;7.9704441304784e-05;6.1875332903583e-05;1.6751808288973e-05;-2.7074472654931e-06;-0.00035926036071032;0.00033491017529741;0.00041452757432126;4.4510336010717e-05;-5.0171824113932e-05;-7.8371762356255e-05;-0.00041676068212837;0.00042689393740147;6.4198080508504e-05;-0.00036591099342331;3.3366144634783e-05;-0.00020580920681823;-0.00031412226962857;-0.00044574675848708;-0.00042928723269142;-0.00015941791934893;8.0167774285655e-05;-8.6301937699318e-05;-9.0572633780539e-05;-3.8915120967431e-05;5.2427494665608e-05;-0.0004369719827082;0.00025280663976446;0.0019001766340807;-0.00013682550343219;0.00017226656200364;-0.00020251970272511;-5.968976256554e-05;0.00016974841128103;1.9856026483467e-05;-1.2604264156835e-05;-0.0006572378333658;-0.00013442077033687;0.00014783767983317;-6.4264582761098e-05;7.7931697887834e-05;-7.7090211561881e-05;-0.00045378232607618;0.00070735282497481;-2.0706767145384e-07;-0.0013970809523016;0.00043748316238634;4.3700369133148e-05;-0.00042942140134983;-0.00031696606311016;0.00015034066746011;-5.3289462812245e-05;9.6119845693465e-05;0.00035420144558884;4.8940262786346e-05;-0.00017951930931304;3.3128984796349e-05;0.00081167061580345;-0.00025353225646541;-0.00095265195704997;-8.9029614173342e-05;-0.00095214555040002;0.00025922869099304;-5.0345301133348e-05;8.7451271610917e-06;-4.4491458538687e-05;4.8389105359092e-05;-0.0021234136074781;0.00015410876949318;-0.00010719290730776;2.0175284589641e-05;0.00036143144825473;1.9096860341961e-05;0.000469358288683;-0.0005611801170744;-0.00023885782866273;0.00074737233808264;-0.00031960639171302;0.00068283750442788;0.00017353336443193;0.0019002670887858;-5.2477818826446e-05;-0.00023571880592499;-0.00012553921260405;0.00097367097623646;-6.482327444246e-05;-0.00047541499952786;1.6535685062991e-05;0.00091663398779929;-0.00068944168742746;0.00065816019196063;0.00054663460468873;0.00037634308682755;0.0002140259166481;0.00011088639439549;0.00011770107812481;1.641958624532e-05;-9.3679267365587e-07;-0.00075388478580862;0.00050691695651039;0.00056924991076812;7.0229812990874e-05;-2.8679700335488e-05;-0.00011771018762374;-0.00053612404735759;0.00067357992520556;6.6624379542191e-05;-0.00060130946803838;-3.2775817544461e-06;-0.00022480076586362;-0.0005023468984291;-0.00041098438668996;-0.00062923005316406;-0.0002570194483269;9.8219854407944e-05;-1.91275121324e-05;-0.00014346753596328;-0.00010395901335869;8.0674151831772e-05;-0.00069752964191139;0.00038118052179925;0.0027451070491225;-0.00025400848244317;0.00043365321471356;-0.00026135725784115;-8.447517757304e-05;0.00021969950466882;3.4330085327383e-05;-2.5539502530592e-05;-0.00081351824337617;-0.00019681628327817;0.00027255684835836;-0.00011203707254026;0.00011766677198466;-9.1897687525488e-05;-0.00051395635819063;0.0010438887402415;3.0495264581987e-05;-0.0020806842949241;0.00054388045100495;-3.2030227885116e-05;-0.0005931023042649;-0.00067870004568249;0.00025598320644349;-0.00010689572081901;0.00012484035687521;0.00049337378004566;7.5396041211206e-05;-0.00027692809817381;4.7424680815311e-05;0.00051753118168563;-9.472174133407e-05;-0.0011216136626899;-0.00019711413187906;-0.00071128981653601;0.00024726326228119;-2.7387988666305e-05;-8.697017619852e-06;-3.4405187761877e-05;2.7292318918626e-05;-0.0013698450056836;3.4656237403397e-05;-0.00015590662951581;-3.9109154386097e-06;0.00025571038713679;5.3949046559865e-05;0.00070682348450646;-0.00047396513400599;-0.00019021474872716;0.00066828646231443;-0.00043728481978178;0.00050245400052518;0.00020339906041045;0.0015198630280793;9.1359826910775e-05;-0.00016726795001887;-0.00015208388504107;0.00064589269459248;-2.878490704461e-05;-0.0003016174887307;1.6300546121784e-06;0.00086966349044815;-0.00062235922086984;0.00053047353867441;0.0004392234259285;0.00023892588797025;0.00024242917424999;9.6577699878253e-05;0.00013569068687502;4.8514189074922e-06;2.6986427315023e-07;-0.00089468969963491;0.00045445776777342;0.00045965923345648;6.4768435549922e-05;2.297665378137e-05;-0.0001023157601594;-0.00034478862653486;0.0006745508289896;3.0895072995918e-05;-0.00063387164846063;-9.2305985162966e-05;-0.00013124437828083;-0.0004937713383697;-0.00010207614104729;-0.00053571601165459;-0.00025917749735527;5.6957334891194e-05;8.951286872616e-05;-0.00013683718862012;-0.00013756830594502;7.4838448199444e-05;-0.00068627001019195;0.00034193912870251;0.002336312783882;-0.0002982338774018;0.00058459129650146;-0.00016420424799435;-6.9878406065982e-05;0.0001608688471606;3.5880781069864e-05;-3.188694245182e-05;-0.00052962306654081;-0.00016522209625691;0.0002902116975747;-0.00012197283649584;0.00010449923865963;-5.2277824579505e-05;-0.0002144328027498;0.00094475707737729;6.2162784161046e-05;-0.0018865304300562;0.00032124665449373;-0.00013835052959621;-0.00048698019236326;-0.00081892969319597;0.00026757150772028;-0.00012395059457049;8.252802217612e-05;0.00039590822416358;6.9779867772013e-05;-0.00025031244149432;4.0798178815749e-05;0.00031228002626449;2.126136678271e-05;-0.001071683713235;-0.00024705240502954;-0.0005455914651975;0.00020323923672549;-1.8015129171545e-05;-9.4792076197336e-06;-2.6161997084273e-05;1.4603860108764e-05;-0.00093520450172946;-5.151395816938e-05;-0.00016606244025752;-1.7771280909074e-05;0.00019159202929586;6.4883482991718e-05;0.00074991176370531;-0.00038813284481876;-0.00015707801503595;0.00055074505507946;-0.00043563143117353;0.00038894586032256;0.00019643938867375;0.0012279426446185;0.00017764189396985;-0.00012420282291714;-0.0001511934096925;0.00046015507541597;-3.1779145501787e-06;-0.00020565750310197;-6.0315969676594e-06;0.00083095364971086;-0.00056321825832129;0.00036659179022536;0.00036912623909302;0.000108220767288;0.00024558795848861;8.8330656581093e-05;0.00013361223682296;-2.6896057079284e-06;2.4254445634142e-06;-0.00092915003187954;0.00040247122524306;0.0003674341714941;6.4903462771326e-05;4.2972853407264e-05;-8.6759835539851e-05;-0.00022927382087801;0.00059698917903006;2.4040405151027e-06;-0.00054128735791892;-0.00014014572661836;-5.8475703553995e-05;-0.00044050949509256;0.00011605313193286;-0.0004626092268154;-0.00023999376571737;2.7289375793771e-05;0.00012908465578221;-0.00012864057498518;-0.00013747288903687;6.5775449911598e-05;-0.00063543859869242;0.00029005738906562;0.0019633995834738;-0.00029482721583918;0.00062468991382048;-8.3010971138719e-05;-5.1926530431956e-05;0.00012517378490884;3.2826384995133e-05;-3.313239722047e-05;-0.00034568610135466;-0.00013136339839548;0.00027302818489261;-0.00011699745664373;8.7751010141801e-05;-2.813450373651e-05;-1.2757481272274e-05;0.00086681131506339;7.3942079325207e-05;-0.0016946549294516;0.00015031926159281;-0.00019017183512915;-0.00041733542457223;-0.00081534637138247;0.00024614462745376;-0.00012793482164852;4.9786329327617e-05;0.00030887642060407;6.1023565649521e-05;-0.00021027367620263;3.5161978303222e-05;-0.0008262696210295;0.00083560234634206;-0.00033937499392778;7.0458198024426e-05;3.4995278838323e-05;-3.4697150113061e-06;-4.0949824324343e-05;6.5997053752653e-05;2.3480617528548e-05;-3.0678187613375e-05;0.00043887938954867;-0.00055057788267732;-1.8334299966227e-05;-1.6888388927327e-05;6.2397543842962e-06;4.482694203034e-05;0.00021792271581944;-4.9653758651402e-06;-3.2096904760692e-05;0.00010615599603625;-0.00021995061251801;9.7486365120858e-05;-5.1656868890859e-05;-5.8052399253938e-05;0.00028287892928347;-3.8774996937718e-06;-7.6690426794812e-05;-4.9603029765422e-05;0.00013451497943606;-1.1572706171137e-05;-2.4429789846181e-05;0.00056261016288772;0.00014675449347124;-0.00018511898815632;-7.3982533649541e-05;8.8609442173038e-05;0.00022095111489762;0.00020103383576497;0.00022807973437011;-3.9180893509183e-05;-3.8365600630641e-05;-0.00077266478911042;-0.00033286240068264;0.00021211848070379;0.00016967131523415;7.5780480983667e-05;3.9186525100376e-05;0.00070517690619454;0.00092522613704205;-7.5552452472039e-05;-0.00082118192221969;-0.00082433345960453;-0.00017906341236085;-0.00031934547587298;0.00056295905960724;0.000255000020843;-0.00032004987588152;-0.00025977144832723;1.2696732483164e-05;-7.0248628617264e-05;-6.9526096922345e-05;-2.4606506485725e-05;-0.00051982467994094;-0.00025853095576167;0.00060293154092506;0.00012989262177143;0.00098279118537903;0.00070688535925001;8.5331077571027e-05;6.4251064031851e-05;-1.5704830730101e-05;-1.2982132830075e-05;0.00021723177633248;0.00014537588867825;0.00013104676327202;4.8069829063024e-05;7.1709699113853e-05;6.5668849856593e-05;0.0016557748895139;0.0013186633586884;0.00014694253331982;-0.0018345023272559;-0.001364505616948;-0.00054802768863738;-0.00050599279347807;-0.00053425831720233;-0.00025035085855052;-0.00028551393188536;-0.00020292699628044;-1.2901813533972e-05;-2.4055234462139e-06;-1.6620439055259e-05;-7.5176558311796e-06;-0.0011228057555854;0.0010996658820659;-0.00040019786683843;0.00022614652698394;6.0996524553047e-05;1.5504183465964e-05;-5.4401909437729e-05;9.0181085397489e-05;3.165885573253e-05;-3.893235407304e-05;0.00065908901160583;-0.00071169331204146;-1.3630155081046e-05;2.2239314603212e-06;-7.1999147621682e-06;4.8301448259735e-05;0.0001719048304949;2.7311414669384e-05;-2.5540488422848e-05;0.00016300375864375;-0.00030009087640792;0.00010291158105247;-0.00010482686775504;-0.00015873194206506;0.00028047221712768;1.177269496111e-05;-8.9943379862234e-05;-0.00010035186278401;0.00017115514492616;-1.333975774287e-06;-3.2618529075989e-05;0.00061949453083798;0.00030575835262425;-0.00021212502906565;-0.00014755656593479;0.00022329301282298;0.00029503399855457;0.00027566967764869;0.00030946038896218;-5.2685481932713e-05;-5.7862864196068e-05;-0.00090238905977458;-0.00054070731857792;0.00027362818946131;0.00022795701806899;9.8933320259675e-05;6.7389526520856e-05;0.0010546176927164;0.001334419590421;-8.8151122326963e-05;-0.0012238339986652;-0.0011912347981706;-0.00031058755121194;-0.00043069466482848;0.00065514293964952;0.00042548574856482;-0.00043176661711186;-0.00037062575574964;-8.2068136180169e-06;-7.2998875111807e-05;-8.0601814261172e-05;-4.4255775719648e-05;-0.00064164330251515;-0.00041051028529182;0.00061616604216397;0.00024786620633677;0.001270574866794;0.00099351175595075;0.00011610707588261;7.0889291237108e-05;-2.6371169951744e-05;-1.1782472938648e-05;0.0003082909679506;0.00021339637169149;0.00013778833090328;8.4018109191675e-05;9.5355520898011e-05;9.4412826001644e-05;0.0023038627114147;0.001727849827148;0.00019618596707005;-0.0023536281660199;-0.0019224402494729;-0.0007237519021146;-0.00065525277750567;-0.00062122463714331;-0.00039547169581056;-0.00037336247623898;-0.00028296944219619;-2.9106859074091e-05;-1.3030944501224e-06;-7.2292855293199e-06;-2.0227931599948e-05;-0.0011419159127399;0.0010781816672534;-0.00029692956013605;0.00034969582338817;7.3093506216537e-05;3.584218211472e-05;-5.4540207202081e-05;9.1333298769314e-05;3.2933090551523e-05;-3.7351241189754e-05;0.00072238483699039;-0.00067182630300522;2.6590005290927e-06;2.6737921871245e-05;-2.4466187824146e-05;3.463884422672e-05;2.5137731427094e-05;6.3441264501307e-05;-5.6524927458668e-06;0.00018512894166633;-0.00029875396285206;6.8547684350051e-05;-0.00013928407861385;-0.00026367206010036;0.00018004771845881;3.4773649531417e-05;-7.6463911682367e-05;-0.00012757023796439;0.00015300979430322;9.2835998657392e-06;-2.8444417694118e-05;0.00048093931400217;0.00042788541759364;-0.00017434403707739;-0.00018360454123467;0.00028827079222538;0.00025957505567931;0.00027900622808374;0.00030812673503533;-5.0875503802672e-05;-6.137842865428e-05;-0.00076792249456048;-0.00064896169351414;0.00026093548513018;0.00023369104019366;9.0290355728939e-05;7.805375935277e-05;0.0010832250118256;0.0013625245774165;-8.3961502241436e-05;-0.0012613515136763;-0.0012130439281464;-0.00035947977448814;-0.00040359544800594;0.00055765075376257;0.00051031651673838;-0.00042090061469935;-0.00038465595571324;-3.3779899240471e-05;-5.0016882596537e-05;-6.5798150899354e-05;-5.6820863392204e-05;-0.00057385995751247;-0.00047896354226395;0.0004572132602334;0.00038180468254723;0.0012236555339769;0.0010457928292453;0.00012199632328702;6.0718546592398e-05;-3.2718297006795e-05;-5.5086529755499e-06;0.00030833287746646;0.00021839181135874;0.00010321891022613;0.00011364616511855;9.4402610557154e-05;9.9071032309439e-05;0.0023224141914397;0.0017265415517613;0.00019744654127862;-0.0022523759398609;-0.0020309432875365;-0.00072691653622314;-0.00065013376297429;-0.00053073087474331;-0.00047800669563003;-0.00036341408849694;-0.00029367548995651;-3.4496493753977e-05;7.2236962296301e-06;4.9684267651173e-06;-3.5095581552014e-05;-0.00082022824790329;0.00075244542676955;-0.00015590159455314;0.00032208120683208;4.9399139243178e-05;4.6517154260073e-05;-4.0392678783974e-05;6.761869735783e-05;2.467892045388e-05;-2.6276038624928e-05;0.00053475325694308;-0.00044382113264874;1.3529026546166e-05;3.0731058359379e-05;-2.5733226721059e-05;1.5847052054596e-05;-6.5389693190809e-05;6.5467298554722e-05;6.8729495978914e-06;0.00015066188643686;-0.00021824311988894;3.6274330341257e-05;-0.00012543880438898;-0.00023753664572723;6.3730265537743e-05;3.7431047530845e-05;-4.7251622163458e-05;-9.9973920441698e-05;9.3894224846736e-05;8.5109431893216e-06;-1.4257097063819e-05;0.00027105968911201;0.00037502829218283;-9.5215735200327e-05;-0.00013860121543985;0.00023531350598205;0.00016315848915838;0.00020143970323261;0.00021979059965815;-3.5198310797568e-05;-4.5396984205581e-05;-0.00047720753354952;-0.00052436848636717;0.00018356319924351;0.00017544203728903;5.7827757700579e-05;5.971278733341e-05;0.00077105249511078;0.00098627805709839;-5.7052769989241e-05;-0.00091140536824241;-0.00087374792201445;-0.00028349942294881;-0.00027383380802348;0.00033901169081219;0.0004022543434985;-0.00029217224800959;-0.00028100700001232;-4.0111499401974e-05;-2.5336441467516e-05;-3.8927355490159e-05;-4.7850524424575e-05;-0.00037332400097512;-0.00038255655090325;0.00026145493029617;0.00037090323166922;0.00084638362750411;0.00077467918163165;9.1864290880039e-05;3.8704936741851e-05;-2.6609021006152e-05;2.281252307057e-07;0.00021197159367148;0.000151626765728;5.9414109273348e-05;0.00010293460218236;6.6280721512157e-05;7.2842289227992e-05;0.0016469521215186;0.001238557510078;0.00014104237197898;-0.001552851870656;-0.0015113488771021;-0.00052338669775054;-0.00046366816968657;-0.00033602779149078;-0.00039560763980262;-0.00025444311904721;-0.00021603480854537;-2.5421497412026e-05;1.2165701264166e-05;8.7158923633979e-06;-3.5441931686364e-05;-0.00012362289999146;-0.00021085755724926;0.00034479008172639;0.0010375523706898;-0.00022583924874198;0.0006124033825472;-2.6671184969018e-05;5.2964554924984e-05;-7.6026381066185e-06;2.6645524485502e-05;0.00014265043137129;0.00083110836567357;2.5419409212191e-05;0.00022266499581747;-7.601184915984e-05;-0.00019806613272522;-0.00083839986473322;0.00033987895585597;0.00016027128731366;0.0004771874519065;-0.00047836976591498;-0.00013768665667158;-0.00045994209358469;-0.00029714219272137;-0.0012191262794659;0.00019507193064783;7.5790121627506e-05;-1.3293998563313e-05;-0.0004372451803647;9.5148789114319e-06;0.00019596380298026;-0.00073368672747165;0.00098475045524538;0.00045851178583689;7.4173913162667e-05;0.00036543523310684;-6.2069964769762e-05;0.00013146194396541;0.00012289581354707;7.0958367359708e-06;-1.8479904611013e-05;0.00057729223044589;-0.0009556224104017;8.4142768173479e-05;0.00029232705128379;-8.7225147581194e-05;3.8554528146051e-05;-9.7455420473125e-05;0.00061610655393451;-1.7754295186023e-05;-0.00031715299701318;-0.00043797612306662;-0.00045029143802822;-1.3173142178857e-05;-0.00061912788078189;0.00039862317498773;8.3708073361777e-06;-0.00023430223518517;-0.0001851279521361;9.6327508799732e-05;7.790005474817e-05;-0.00010452395508764;0.00031846194178797;-0.00069710559910163;-0.00034888405934907;0.0020134774968028;-2.55015984294e-05;0.00072913186158985;0.00015491814701818;-6.4650259446353e-05;-5.4054511565482e-05;5.5044660257408e-05;-0.00015419330156874;-0.00025772204389796;-0.00013301975559443;0.00032477150671184;-1.5246514522005e-05;8.9443441538606e-05;0.00013167395081837;0.0010515671456233;7.9921228461899e-05;2.2120988433016e-05;-0.0019055627053604;-0.00048916187370196;-0.0002357583725825;0.00030049591441639;-0.00091390259331092;1.8845381418942e-05;-0.00015221801004373;6.7138120357413e-05;0.00027955611585639;3.8856305764057e-05;-0.00022844299382996;-2.1245772586553e-05;-0.00038810845580883;0.0003223289095331;0.0010693941731006;-0.00027100759325549;0.00079684623051435;-3.9764723624103e-05;7.4439980380703e-05;-1.6853240595083e-05;3.3326094126096e-05;5.4453557822853e-05;0.0012406872119755;1.7339430996799e-05;0.00022617208014708;-6.4944848418236e-05;-0.00026743320631795;-0.00082117557758465;0.00040675257332623;0.00019657080702018;0.00047377680311911;-0.0005511338240467;-0.00012210129352752;-0.00060224666958675;-0.00022530295245815;-0.0015149379614741;0.00019908412650693;0.00010928429401247;1.3900973499403e-05;-0.00062299182172865;-8.5930031445969e-07;0.00029574989457615;-0.00084770901594311;0.0010973935713992;0.00056843913625926;0.00014651045785286;0.00038017210317776;-2.1138652300579e-05;0.00013070256682113;0.00013689592014998;8.8625483840588e-06;-1.439521292923e-05;0.00067939230939373;-0.00098763266578317;9.3497270427179e-05;0.0003627990372479;-0.0001070296348189;1.7033613403328e-05;-0.00022077563335188;0.00065304944291711;-1.9924509615521e-06;-0.00028220197418705;-0.00044694053940475;-0.0004925686516799;-4.7124081902439e-05;-0.00074830820085481;0.00030729742138647;4.0871931560105e-05;-0.00024868376203813;-0.00020921637769789;6.1357131926343e-05;8.9683097030502e-05;-9.8240801889915e-05;0.00038636368117295;-0.0007691967766732;-0.00035881393705495;0.0024118041619658;-0.00012363355199341;0.00072441424708813;0.00019055923621636;-8.1170692283195e-05;-5.5844484450063e-05;6.2763632740825e-05;-0.00020560072152875;-0.00039982766611502;-0.00013990930165164;0.0003634913591668;-3.8244397728704e-05;0.00010197197843809;-7.1621754614171e-05;0.0011440169764683;6.7248074628878e-05;0.00020737895101774;-0.002132250694558;-0.00055664946557954;-0.00019475496083032;0.00033671839628369;-0.00097122025908902;5.5043608881533e-05;-0.00015680318756495;7.9951030784287e-05;0.00034795948886313;4.3881580495508e-05;-0.000268024567049;0.00013444728392642;-0.00057137373369187;0.00019316512043588;0.00079287157859653;-0.00025854812702164;0.00088221271289513;-5.4004605772207e-05;9.4965704192873e-05;-2.8101991119911e-05;3.4658565709833e-05;-8.6922620539553e-05;0.0016377497231588;-1.8353323412157e-06;0.00015803342103027;-2.6759998945636e-05;-0.00032303686020896;-0.00054519332479686;0.00040595146128908;0.00020560313714668;0.00032015729811974;-0.00050718343118206;-5.9580223023659e-05;-0.00068331597140059;-5.3807114454685e-05;-0.0015962704783306;0.00014858636131976;0.00014596818073187;5.1162638555979e-05;-0.00079574511619285;-1.732911914587e-05;0.00040347475442104;-0.00079984258627519;0.00098822161089629;0.0005931121413596;0.00023984331346583;0.00030103625613265;8.9826658950187e-05;9.6950039733201e-05;0.00013186053547543;6.6477327891334e-06;-2.3569646145916e-06;0.00064973731059581;-0.00074095057789236;8.355503086932e-05;0.00039717124309391;-0.000108615415229;-3.3703036024235e-05;-0.00035545279388316;0.00057251326506957;2.9667477065232e-05;-0.00016357496497221;-0.00037433739635162;-0.00043711168109439;-0.00012009734200547;-0.00074467150261626;2.6903921025223e-05;7.9539582657162e-05;-0.00020977228996344;-0.00019040812912863;-4.0435632399749e-05;8.4384155343287e-05;-4.9639977078186e-05;0.0003847801417578;-0.00068730860948563;-0.00027658513863571;0.0024460759013891;-0.00022390206868295;0.00050764041952789;0.00020714741549455;-8.7085601990111e-05;-4.390344111016e-05;5.6581455282867e-05;-0.00022431407705881;-0.00056000036420301;-0.00011312566493871;0.0003145307127852;-6.6085653088521e-05;9.9121811217628e-05;-0.00034832413075492;0.001038039335981;2.7451793357613e-05;0.00041639636037871;-0.001992492005229;-0.00054735754383728;-6.8388028012123e-05;0.00029450334841385;-0.00076251855352893;9.2991562269162e-05;-0.00012236295151524;7.8260789450724e-05;0.0003788108297158;4.1583483834984e-05;-0.00026016181800514;0.00017818527703639;-0.00049619091441855;5.0928141718032e-05;0.00035455156466924;-0.00016324540774804;0.00063420401420444;-4.525880649453e-05;7.8337841841858e-05;-2.580638283689e-05;2.3761685952195e-05;-0.0001366827491438;0.001369068864733;-1.2661141226999e-05;5.551787398872e-05;5.3520143410424e-06;-0.00025864635244943;-0.00019716484530363;0.00027171373949386;0.00014334502338897;0.00012000438437099;-0.00030791052267887;-1.6613096249785e-06;-0.00050811970140785;6.3544990553055e-05;-0.0011187399504706;6.8853652919643e-05;0.00012891687219962;5.5302007240243e-05;-0.00065749452915043;-2.1535584892263e-05;0.00034953028080054;-0.00050054723396897;0.00058850517962128;0.00040735834045336;0.00024837360251695;0.00015291037561838;0.00016532350855414;4.7771514800843e-05;8.9507768279873e-05;4.6757114091633e-07;7.5820526035386e-06;0.00040893879486248;-0.00032031093724072;4.7575889766449e-05;0.00030148337827995;-7.2859533247538e-05;-6.0250622482272e-05;-0.00031379074789584;0.00037129214615561;4.5059809053782e-05;-4.5617820433108e-05;-0.00025207249564119;-0.00027176106232218;-0.00014915056817699;-0.0004860534099862;-0.0002007447037613;7.5847841799259e-05;-0.00012043523747707;-0.00011434164480306;-0.00010611983452691;5.3794097766513e-05;2.263935357405e-06;0.00025524848024361;-0.00041774078272283;-0.00013949908316135;0.0016874198336154;-0.00019858618907165;0.00019446296209935;0.00015383273421321;-6.4566323999316e-05;-2.2232052288018e-05;3.3275209716521e-05;-0.00015722859825473;-0.00050104362890124;-6.0470920288935e-05;0.00017144531011581;-6.1312624893617e-05;6.8500427005347e-05;-0.00038456826587208;0.0006538798334077;-6.9382867877721e-06;0.00039075943641365;-0.0012847760226578;-0.00037594119203277;3.9913589716889e-05;0.00016932365542743;-0.00035768927773461;8.2167294749524e-05;-5.9499670896912e-05;5.1126604375895e-05;0.00028543776716106;2.7245750970906e-05;-0.00017194588144775;0.00046548777027056;-9.4935596280266e-05;-0.00064390298211947;-0.00011111714411527;-0.00068604398984462;0.00014919272507541;-3.9074642700143e-05;1.7872729586088e-05;-2.9970547984703e-05;2.9439090212691e-05;-0.0013709629420191;4.2926407331834e-05;-0.00012120747851441;8.0257686931873e-06;0.0002352560259169;1.8142212866223e-05;0.00034940510522574;-0.0003682695387397;-0.00017240218585357;0.00047393140266649;-0.00020670540106948;0.00048625227645971;0.00011795801401604;0.0013276067329571;3.3297055779258e-05;-0.00013267413305584;-9.4007365987636e-05;0.00063665036577731;-2.9734670533799e-05;-0.00029678124701604;6.3461848185398e-06;0.00080768263433129;-0.000562300439924;0.00018220038327854;0.00043335949885659;1.975410441446e-06;0.00019287630857434;8.2604208728299e-05;7.7254997449927e-05;-1.2418089454513e-06;1.2401511412463e-05;-0.00075421715155244;0.00040287603042088;0.00032225830364041;7.6500364230014e-05;1.7573636341695e-06;-8.3067941886839e-05;-0.00036649047979154;0.00032081591780297;-2.9649779520469e-08;-0.00015060836449265;-4.4447584514273e-05;-2.8286385713727e-05;-0.00029748646193184;0.0001009963452816;-0.00050439458573237;-0.00017324846703559;4.9436195695307e-05;4.9118458264275e-05;-0.00012072988465661;-8.1325924838893e-05;5.3761188610224e-05;-0.00051547551993281;0.00026248485664837;0.0018596189329401;-0.00019586778944358;0.0004489514103625;-0.00014137600373942;-4.3080770410597e-05;0.00015304483531509;2.496321212675e-05;-2.4005403247429e-05;-0.00042642149492167;-0.00013227450835984;0.00021926376211923;-8.567186887376e-05;7.4010975367855e-05;-5.5598880862817e-05;-0.00023258908186108;0.00082147715147585;4.3065876525361e-05;-0.0015492429956794;0.00028363559977151;-0.00010957870836137;-0.00043923323391937;-0.00059711100766435;0.00018840037228074;-0.00010325519542675;7.4188137659803e-05;0.00028650669264607;5.2749062888324e-05;-0.00017637292330619;3.4794535167748e-05;0.00039773885509931;-9.3985145213082e-06;-0.00093889312120155;-0.00021917285630479;-0.00069376529427245;0.00018201915372629;-3.3317814086331e-05;7.1457220656157e-06;-3.1100731575862e-05;2.334520831937e-05;-0.0012584822252393;-3.0483750379062e-05;-0.00017381137877237;-7.6755659392802e-06;0.00023486484133173;4.8615951527609e-05;0.00061396905221045;-0.00041990089812316;-0.00018633699801285;0.0005578879499808;-0.0003482565516606;0.0004915259196423;0.0001798790472094;0.0014241568278521;0.00014609609206673;-0.00013433463755064;-0.00013918975309934;0.00060410000151023;-1.2435704775271e-05;-0.00027267061523162;-2.1183172975725e-06;0.00098604010418057;-0.00066425272962078;0.0002025841968134;0.00047634600196034;-3.8534079067176e-05;0.00025788796483539;9.8297779913992e-05;0.00011526236630743;-6.9711568357889e-06;1.3945471437182e-05;-0.0010301655856892;0.00047124837874435;0.00036036668461747;9.0909969003405e-05;3.2344883948099e-05;-9.6835203294177e-05;-0.00034722150303423;0.00044961911044084;-1.6407575458288e-05;-0.00027218679315411;-0.00010945549001917;2.3757381839573e-08;-0.00039068568730727;0.00026519148377702;-0.00057151116197929;-0.00022912687563803;3.8260935980361e-05;0.00012230539869051;-0.00014775150339119;-0.00012552579573821;6.5996617195196e-05;-0.00066080060787499;0.00031258631497622;0.0021563121117651;-0.00028058484895155;0.00066859403159469;-0.0001143828194472;-4.7963305405574e-05;0.0001616043591639;3.2215059036389e-05;-3.4559328923933e-05;-0.00039211646071635;-0.00014902002294548;0.00028859041049145;-0.00011665777856251;9.139073517872e-05;-4.6460198063869e-05;-0.00010268745973008;0.0010075174504891;7.5541429396253e-05;-0.0018931108061224;0.00021620138431899;-0.0002049550821539;-0.00050556915812194;-0.00084331061225384;0.00024819272221066;-0.00014432637544814;6.7310022132006e-05;0.00032011585426517;6.4609273977112e-05;-0.00021487391495612;4.0597707993584e-05;0.00020407509873621;0.00012023859017063;-0.00093936990015209;-0.00028692206251435;-0.00054305850062519;0.00014520894910675;-2.503237737983e-05;3.0187877655408e-06;-2.393187241978e-05;1.1528762115631e-05;-0.0008958014077507;-0.00012936763232574;-0.00018036643450614;-2.3305614377023e-05;0.0001885336387204;6.4694810134824e-05;0.00069723534397781;-0.00036500743590295;-0.00016193022020161;0.00047593394992873;-0.00037013806286268;0.00039517405093648;0.00019292513024993;0.0011869053123519;0.00025152953458019;-0.00010812113032443;-0.00014787093095947;0.00046050662058406;1.4713148630108e-05;-0.00020141461573076;-1.0583527910057e-05;0.0009901796001941;-0.00062879995675758;0.00010403061605757;0.00042532960651442;-0.00012445487664081;0.00026424013776705;9.8823482403532e-05;0.00012543969205581;-1.2753358532791e-05;1.4304952856037e-05;-0.0011043428676203;0.00043162700603716;0.00031070268596523;9.410161874257e-05;5.1085909944959e-05;-8.7748303485569e-05;-0.00025992208975367;0.000434778543422;-4.0703111153562e-05;-0.00025104579981416;-0.0001541430974612;4.885672024102e-05;-0.00037363375304267;0.00043612578883767;-0.00051487906603143;-0.00023115806106944;1.2349508324405e-05;0.00015908709610812;-0.0001455095334677;-0.00013341539306566;6.1446400650311e-05;-0.00066012691240758;0.00027991933166049;0.0019666003063321;-0.00028897583251819;0.00075278803706169;-3.2482988899574e-05;-3.5048025893047e-05;0.00014185093459673;3.0001769118826e-05;-3.7623442040058e-05;-0.0002659973106347;-0.0001245121966349;0.00028602479142137;-0.00011793544399552;8.7052256276365e-05;-2.6752886697068e-05;9.5509887614753e-05;0.0010275688255206;9.3332200776786e-05;-0.0018708230927587;4.8780173528939e-05;-0.00026946619618684;-0.00048740033525974;-0.00088205141946673;0.00023714611597825;-0.00016024429351091;3.8044021493988e-05;0.00027244520606473;6.0879003285663e-05;-0.00019607992726378;3.7577581679216e-05;-0.00074668967863545;0.00075949070742354;-0.00020807865075767;-7.9293829912785e-05;5.7738274335861e-05;-5.6326629419345e-05;-3.0486700779875e-05;4.5966276957188e-05;1.9578537830967e-05;-2.7800109819509e-05;0.00039805439882912;-0.00051655125571415;-3.3795080526033e-05;-2.3006186893326e-05;6.1634418671019e-06;4.8677939048503e-05;0.00022727358737029;-1.8201681086794e-05;-3.158950858051e-05;5.3666797612095e-05;-0.00015923568571452;5.0192960770801e-05;1.8355520296609e-05;-9.1198584414087e-05;0.0003561083576642;5.7243801165896e-06;-7.725425530225e-05;-3.0706265533809e-05;0.00011635249393294;-7.3885653364414e-06;-2.5741024728632e-05;0.00057379697682336;5.8482753956923e-05;-0.00024391953775194;-2.952704380732e-05;-0.00010286245378666;0.00012348710151855;0.00016181817045435;0.00017901758837979;-3.0733452149434e-05;-1.9314586097607e-05;-0.00078265421325341;-0.00023991116904654;0.0001577721996;0.00014198062126525;6.2988634454086e-05;1.7324475265923e-05;0.00038513570325449;0.00055887759663165;-0.00010708178160712;-0.00040835374966264;-0.00050896150059998;-3.5904333344661e-05;-0.000191848637769;0.00063459319062531;0.00018119045125786;-0.00024979151203297;-0.00019283402070869;5.0548002036521e-05;-6.3924875576049e-05;-6.5184962295461e-05;-1.4205687875801e-05;-0.00045616476563737;-0.00017543471767567;0.00066053733462468;0.00012126962246839;0.00091169908409938;0.00060258549638093;7.553564500995e-05;7.7269760367926e-05;-1.333094041911e-05;-1.8365843061474e-05;0.00017308774113189;9.7079871920869e-05;0.00012814605724998;2.5925028239726e-05;6.6598593548406e-05;5.1536506362027e-05;0.0012948212679476;0.0012753274058923;0.00014159768761601;-0.001704647555016;-0.0011651946697384;-0.00052159040933475;-0.00050412607379258;-0.00052892253734171;-0.00018935996922664;-0.00025018502492458;-0.00016438128659502;1.0566774108156e-05;1.15927623483e-05;-2.9348704629228e-05;-4.1240427890443e-06;-0.00099593494087458;0.00096753280377015;-0.0002310348500032;0.00010132608440472;9.2316797235981e-05;-3.5424105590209e-05;-3.915473644156e-05;6.3734900322743e-05;2.6410563805257e-05;-3.278686926933e-05;0.00061984430067241;-0.00064134382409975;-2.4904997189878e-05;7.3325322773599e-06;-1.460068506276e-05;4.6289977035485e-05;0.0001372799888486;2.2783799067838e-05;-1.7780337657314e-05;0.00011366042599548;-0.00022833526600152;3.2517757063033e-05;-3.2780531910248e-05;-0.00022256840020418;0.00031269140890799;2.8163787646918e-05;-8.287098899018e-05;-9.1167887148913e-05;0.00014220598677639;1.0508598279557e-05;-3.3911259379238e-05;0.00053244002629071;0.00025660550454631;-0.00022295056260191;-0.00013746620970778;7.5859781645704e-05;0.00016476084419992;0.00022420173627324;0.00024745095288381;-3.9340578950942e-05;-3.9737573388265e-05;-0.00079988874495029;-0.0004711743677035;0.00020752850105055;0.00018135964637622;7.7987388067413e-05;4.8976926336763e-05;0.00071309256600216;0.00093273568199947;-0.00011244211782468;-0.00080955895828083;-0.00082110147923231;-0.00018055453256238;-0.00027744632097892;0.00062793894903734;0.000389804772567;-0.00034132364089601;-0.00029256619745865;1.6298719856422e-05;-4.9144102376886e-05;-6.6964865254704e-05;-3.5381715861149e-05;-0.00052029330981895;-0.00033235776936635;0.00056500814389437;0.00025895683211274;0.0011116304667667;0.00087023538071662;0.00010289874626324;7.3139563028235e-05;-2.5500774427201e-05;-1.456205973227e-05;0.00024893545196392;0.00016519529162906;0.00011005317355739;6.3600891735405e-05;8.4790546679869e-05;7.9757875937503e-05;0.0018602585187182;0.0015935634728521;0.00018178422760684;-0.0020605055615306;-0.0016856108559296;-0.0006610177224502;-0.00061415834352374;-0.00053849519463256;-0.00034200921072625;-0.0003138059109915;-0.00023634661920369;-6.5974581957562e-06;1.5288511349354e-05;-1.3377843970375e-05;-2.0458466678974e-05;-0.0010749910725281;0.00099796417634934;-0.0001044004020514;0.00023970550682861;0.0001190824987134;-1.79816288437e-05;-3.9349168218905e-05;6.5337044361513e-05;2.9577404347947e-05;-3.1704654247733e-05;0.00073842785786837;-0.00063296250300482;-6.7823980316462e-06;4.1855153540382e-05;-3.9251419366337e-05;3.1958141335053e-05;-3.186510730302e-05;6.6679931478575e-05;5.8101140893996e-06;0.0001489499991294;-0.00023718239390291;-1.939207140822e-05;-6.4583684434183e-05;-0.00037975507439114;0.00021542697504628;6.1570986872539e-05;-7.2589311457705e-05;-0.00013009062968194;0.0001258002303075;2.6258023353876e-05;-3.152259887429e-05;0.00036656102747656;0.00044197551324032;-0.00016147758287843;-0.00022000953322276;0.00016272155335173;9.2727954324801e-05;0.00023687499924563;0.00025741051649675;-3.5496068448992e-05;-4.7053916205186e-05;-0.00065486697712913;-0.00065406056819484;0.00020742164633702;0.00018786323198583;6.7187429522164e-05;6.5706473833416e-05;0.00074841117020696;0.00097981910221279;-0.00011959037510678;-0.00088130362564698;-0.0008290289551951;-0.00024138494336512;-0.00023798596521374;0.00050969677977264;0.00055539299501106;-0.00034072008566;-0.00032072994508781;-1.8225655367132e-05;-1.3612657312478e-05;-5.1235238061054e-05;-5.2988314564573e-05;-0.00045396306086332;-0.00043752594501711;0.00040079452446662;0.00046257584472187;0.0011057299561799;0.0010021824855357;0.00011941161210416;6.4114923588932e-05;-3.6181052564643e-05;-7.6366168286768e-06;0.00025116858887486;0.00018208747496828;6.9656409323215e-05;0.00010479165939614;8.7444066593889e-05;9.166279778583e-05;0.0019606102723628;0.0017066653817892;0.00019667984452099;-0.0020375747699291;-0.0019455989822745;-0.00071320711867884;-0.00065180286765099;-0.0004460479831323;-0.00047728960635141;-0.00031469576060772;-0.00026417121989653;-8.9304112407262e-06;3.1448304071091e-05;4.6180545609786e-07;-4.2860490793828e-05;-0.00072330865077674;0.00064306409331039;7.0857249738765e-06;0.00025550325517543;7.5637653935701e-05;1.7899505110108e-05;-2.6445659386809e-05;4.4242398871575e-05;2.06529875868e-05;-1.9022154447157e-05;0.00052366848103702;-0.00037562369834632;6.8063031903876e-06;5.1261817134218e-05;-3.9154256228358e-05;8.1690268416423e-06;-0.00013343755563255;7.1538292104378e-05;1.9092716684099e-05;0.00013406545622274;-0.00017166585894302;-3.8995050999802e-05;-7.0191810664255e-05;-0.00032480218214914;5.1908300520154e-05;6.2568367866334e-05;-4.0628237911733e-05;-9.8351250926498e-05;5.9729380154749e-05;2.2395821360988e-05;-1.3663147910847e-05;0.00012702535605058;0.00040764425648376;-4.8533886001678e-05;-0.00018142793851439;0.00015582179185003;7.9998890214483e-06;0.00016012054402381;0.00017176628171001;-1.9589899238781e-05;-3.4423512261128e-05;-0.00032560180989094;-0.00054276629816741;0.00013791168748867;0.00012987783702556;3.3342501410516e-05;5.1056045776932e-05;0.00047701795119792;0.00065485737286508;-8.1109785242006e-05;-0.00059996102936566;-0.00052715686615556;-0.0001945885742316;-0.00012641973444261;0.0002380292135058;0.00045614439295605;-0.00021447932522278;-0.00022212638577912;-3.5661447327584e-05;1.4188570276019e-05;-2.2746968170395e-05;-4.621024345397e-05;-0.00024642958305776;-0.00035350833786651;0.00017895737255458;0.00046740978723392;0.0007004861254245;0.00073026766767725;8.9187000412494e-05;3.5399407352088e-05;-3.0097293347353e-05;5.5338688298434e-07;0.00014935141371097;0.00011756292224163;2.2692780476063e-05;0.0001002731587505;5.695680010831e-05;6.6564716689754e-05;0.0012882369337603;0.0011824453249574;0.00013647001469508;-0.001288719009608;-0.0014258384471759;-0.00049737899098545;-0.00044726158375852;-0.00023297259758692;-0.00040845287730917;-0.00020047288853675;-0.00018691817240324;-1.7650704648986e-06;3.6894551158184e-05;6.5217409428442e-06;-4.6416123950621e-05;-0.00025115831522271;-8.9665380073711e-05;0.00040695953066461;0.001010445994325;-0.00017401183140464;0.00058863597223535;-3.042126991204e-05;5.5026466725394e-05;-3.0752050861338e-06;2.3714264898445e-05;0.0002591417869553;0.00073322269599885;3.2152856874745e-05;0.00023958653036971;-8.6510146502405e-05;-0.00018946419004351;-0.00085621478501707;0.00034034828422591;0.00016525620594621;0.0004553182516247;-0.00045072930515744;-0.00016207879525609;-0.00045028017484583;-0.00040948035893962;-0.0011717629386112;0.0002060651750071;6.2849510868546e-05;-4.051324503962e-05;-0.00041243727901019;1.9150342268404e-05;0.00017992936773226;-0.00079857028322294;0.0011268511880189;0.00049802678404376;-0.00011306221131235;0.00040379041456617;-0.00021892233053222;0.00013808842049912;0.00013750787184108;1.4932951671653e-05;-2.9251023079269e-05;0.00060736096929759;-0.0011172423837706;0.0001081550726667;0.00025758254923858;-8.8311557192355e-05;5.3415667935042e-05;-8.0014251579996e-05;0.00055426394101232;-5.0686016038526e-05;-0.00036699688644148;-0.00028960968484171;-0.00043276356882416;6.0762537032133e-05;-0.00066068774322048;0.0006489276420325;-1.2860899005318e-05;-0.0002439558156766;-0.00020309863612056;0.00012910205987282;7.7474214776885e-05;-0.00011020888632629;0.00030931923538446;-0.00074322562431917;-0.00036218881723471;0.002048886148259;5.2046652854187e-05;0.00087297835852951;0.00016795465489849;-5.26744806848e-05;-6.0875940107508e-05;5.4291602282319e-05;-0.00014098107931204;-0.00019238350796513;-0.00014116872625891;0.0003436453116592;-7.3050432547461e-06;9.3957438366488e-05;0.00029128105961718;0.0012300353264436;0.00010478905460332;-0.00012691156007349;-0.0021117622964084;-0.00056036119349301;-0.00032538702362217;0.00029963706037961;-0.0010026291711256;-2.7820110517496e-06;-0.00018422854191158;6.7993583797943e-05;0.00026228773640469;4.1840172343655e-05;-0.00022607855498791;-0.00010250875493512;-0.00026784095098265;0.00033429195173085;0.00093269359786063;-0.00020444925758056;0.00071254262002185;-4.0448008803651e-05;6.8867273512296e-05;-1.224464722327e-05;2.8211601602379e-05;0.00012542078911792;0.0010494197485968;2.0404064343893e-05;0.00022099296620581;-6.4180661865976e-05;-0.00023249590594787;-0.00074170512380078;0.00036392983747646;0.00018208670371678;0.00040044021443464;-0.00047016961616464;-0.00012304780830164;-0.0005417910288088;-0.00027853474603035;-0.0013396020513028;0.00018470859504305;8.4692823293153e-05;-5.5944351515791e-06;-0.00054059328977019;5.5134496506071e-06;0.00025099006597884;-0.00082825979916379;0.0011097997194156;0.00055398658150807;-4.8637906729709e-05;0.00037812400842085;-0.00017624319298193;0.00011766932584578;0.0001310210354859;1.651177626627e-05;-2.2808331777924e-05;0.00065217079827562;-0.0010278064291924;0.000104943603219;0.00028572924202308;-9.8075528512709e-05;2.8905871658935e-05;-0.00019192832405679;0.00050375401042402;-3.0501938454108e-05;-0.00028975619352423;-0.00023653685639147;-0.00041846669046208;3.4872533433372e-05;-0.0007259925478138;0.00050953688332811;2.2291611458058e-05;-0.000224349234486;-0.00020549826149363;8.8056920503732e-05;8.0453341070097e-05;-9.2965980002191e-05;0.00034281326225027;-0.00071748532354832;-0.00033287622500211;0.0021695722825825;-6.6958236857317e-05;0.00075572816422209;0.00017789581033867;-6.1796330555808e-05;-5.4847201681696e-05;5.6184377172031e-05;-0.00017796897736844;-0.00029431865550578;-0.00013143850082997;0.00034380075521767;-2.9192380679888e-05;9.0714856924023e-05;3.551102054189e-05;0.0011362907243893;7.7245997090358e-05;9.6184368885588e-05;-0.0020355966407806;-0.00054021249525249;-0.00024110065714922;0.00030564604094252;-0.00094480015104637;3.6816236388404e-05;-0.00016358678112738;7.2073853516486e-05;0.0002886090951506;4.1510986193316e-05;-0.00023441920347977;1.0588147233648e-05;-0.00032655609538779;0.00019752088701352;0.00059547141427174;-0.00015775344218127;0.0006476134294644;-4.3902226025239e-05;6.8796303821728e-05;-1.6735737517592e-05;2.4016881070565e-05;1.57019985636e-05;0.0010859600733966;5.1383954087214e-06;0.00014831972657703;-2.8533342629089e-05;-0.00021917681442574;-0.00043705452117138;0.00029469167930074;0.00015619849727955;0.00022910482948646;-0.0003550304681994;-5.9495996538317e-05;-0.00049825111636892;-0.00012416776735336;-0.0011541849235073;0.00011980658746324;8.4400096966419e-05;1.8269351130584e-05;-0.00053739832947031;-5.6111912272172e-06;0.00026225377223454;-0.00066259579034522;0.00086176773766056;0.00047652813373134;-2.8793581805076e-05;0.00026944710407406;-0.00012212846195325;7.3013754445128e-05;0.00010211775952484;1.4802596524532e-05;-1.3724848031416e-05;0.00052884180331603;-0.00072222168091685;8.3594975876622e-05;0.00023890935699455;-8.152901136782e-05;-2.0433576537471e-06;-0.00023716333089396;0.00032891507726163;-1.2587697710842e-05;-0.00016870760009624;-9.8617681942414e-05;-0.00029748782981187;9.7749043561635e-06;-0.00060701952315867;0.00030724296811968;3.9982016460272e-05;-0.00015616267046425;-0.00016052807040978;2.3504313503508e-05;6.238927016966e-05;-4.9520582251716e-05;0.00027734218747355;-0.00053051277063787;-0.00022068970429245;0.0017597047844902;-0.00011833664029837;0.00049519527237862;0.0001510218862677;-5.042388511356e-05;-3.7652596802218e-05;4.267704571248e-05;-0.00015682884259149;-0.00030992951360531;-9.0720568550751e-05;0.00025675253709778;-3.9534537791042e-05;6.7396766098682e-05;-0.00013775206753053;0.00084700027946383;3.9667665987508e-05;0.00020515375945251;-0.0015482699964195;-0.00042347921407782;-0.00012846337631345;0.00022488457034342;-0.00066144205629826;5.3083174861968e-05;-0.00011354394519003;5.728180258302e-05;0.00023940323444549;3.2124880817719e-05;-0.0001811101246858;-9.4523478765041e-05;0.00025448584347032;-0.00042482549906708;-0.00024636767921038;-0.00023103925923351;9.2568161562667e-06;-1.921528019011e-05;1.174364660983e-05;-7.1407444011129e-06;-2.5838683086477e-06;-0.00033359005465172;-0.00021477055270225;-0.00010865279182326;-2.8221047614352e-05;9.3557726358995e-05;4.7153716877801e-05;0.00040585800888948;-0.00017480822862126;-8.959521073848e-05;0.00017453906184528;-0.00016800362209324;0.0001928630808834;0.00012158836034359;0.00053315795958042;0.00028349822969176;-4.6028450015001e-05;-9.0466804977041e-05;0.0002208148362115;4.1360737668583e-05;-9.572410635883e-05;-1.4321355592983e-05;0.00073782750405371;-0.00039907507016324;-0.00017702180775814;0.00027042086003348;-0.00029430750873871;0.00016222761769313;7.4411887908354e-05;8.0849022197071e-05;-1.7334541553282e-05;1.6611558748991e-05;-0.00085323007078841;0.00024166234652512;0.00013512829900719;8.5915344243404e-05;4.3288990127621e-05;-4.943758904119e-05;-0.00014995312085375;0.00013890734408051;-7.4986477557104e-05;7.525912951678e-05;-0.00011798042396549;0.00013306093751453;-0.00016439480532426;0.00058800663100556;-0.00030415310175158;-0.00014056493819226;-2.0783601939911e-05;0.00013016368029639;-9.9904675153084e-05;-8.1193713413086e-05;3.0580318707507e-05;-0.00043118360918015;0.00013568429858424;0.0011486599687487;-0.0001519432553323;0.00061607011593878;8.6279520473909e-05;1.0817844895428e-06;9.67197920545e-05;1.3102354387229e-05;-2.7380785468267e-05;-5.9656202211045e-05;-5.4887947044335e-05;0.00018151695257984;-6.7237386247143e-05;5.5099582823459e-05;-5.9299804888724e-06;0.0002680575416889;0.00082220142940059;8.4188381151762e-05;-0.0013354381080717;-0.00017776305321604;-0.00027122625033371;-0.0003718415973708;-0.00060303881764412;0.00011281103797955;-0.00013820566528011;-6.3748393586138e-06;0.0001249204215128;3.5704943002202e-05;-0.0001022947835736;2.2304131562123e-05;-0.00032764149364084;0.00041688964120112;-0.000278349412838;-0.00025724689476192;-7.3142626206391e-05;-5.1668259402504e-05;-1.6856880392879e-05;1.5434216038557e-05;2.091118176395e-06;-1.299501855101e-05;1.3927201507613e-06;-0.00032828751136549;-8.8877946836874e-05;-3.3620992326178e-05;5.0201884732815e-05;5.1930794143118e-05;0.00035470863804221;-0.00010211647168035;-6.0799611674156e-05;6.7363689595368e-05;-0.00012937553401571;9.6580348326825e-05;0.00011045582505176;0.00023136014351621;0.00036038961843587;-1.8186388842878e-05;-8.3511346019804e-05;9.8419499408919e-05;6.9927191361785e-05;-4.2423966078786e-05;-2.2044991055736e-05;0.00068029563408345;-0.00028110900893807;-0.00028221411048435;0.00017902064428199;-0.00033770428854041;0.00012715377670247;8.4552011685446e-05;8.977011020761e-05;-2.1711939552915e-05;1.2946070455655e-05;-0.00083358242409304;0.00012067466741428;9.0663292212412e-05;9.2338894319255e-05;5.0311235099798e-05;-3.0857732781442e-05;-4.6141714847181e-05;0.00011821100633824;-9.9708151537925e-05;0.00010048653348349;-0.0001586346043041;0.00014802439545747;-0.00011365458340151;0.00069258693838492;-0.00016936390602496;-0.00014206823834684;-5.839252480655e-05;0.00012678869825322;-8.4554761997424e-05;-7.1576796472073e-05;1.7450944142183e-05;-0.0004051759315189;5.8470286603551e-05;0.00090222904691473;-9.4720904598944e-05;0.00069599988637492;0.00022543650993612;2.3827811673982e-05;8.7466556578875e-05;4.310012627684e-06;-2.7290254365653e-05;5.1837188948411e-05;-1.2094147677999e-05;0.00015353738854174;-4.9049300287152e-05;5.4239884775598e-05;1.2611666534212e-05;0.00053196039516479;0.00092242780374363;0.0001039182243403;-0.0013611390022561;-0.00044405757216737;-0.00034975493326783;-0.00039610030944459;-0.00056749803479761;4.5551110815722e-05;-0.00016293945373036;-4.9176847824128e-05;7.2774819273036e-05;2.8341188226477e-05;-7.1886839577928e-05;1.5943820471875e-05;-0.00051829119911417;0.00056248501641676;-0.00020255625713617;-0.0002183986507589;2.0421630324563e-05;-7.4606854468584e-05;-1.8977940271725e-05;2.358460733376e-05;1.0074364581669e-05;-2.0452265744098e-05;0.00022442518093158;-0.00041417556349188;-6.4800107793417e-05;-3.2461393857375e-05;2.2774966055294e-05;5.2455066906987e-05;0.00030091125518084;-5.6025419326033e-05;-4.2139057768509e-05;2.7769809094025e-05;-0.00012175644224044;4.6881246817065e-05;8.4635423263535e-05;3.2500400266144e-05;0.00038565247086808;-2.2753879420634e-06;-7.9072153312154e-05;2.0953566490789e-05;9.0291898231953e-05;-1.4650446246378e-05;-2.5177741918014e-05;0.00060911767650396;-0.00013266367022879;-0.00028346088947728;7.6620752224699e-05;-0.00027139816666022;9.7106232715305e-05;0.00010726710024755;0.00011631685629254;-2.382674938417e-05;2.0116751784371e-06;-0.00078817846952006;-3.0516606784659e-05;9.8335920483805e-05;0.0001033097578329;5.3744533943245e-05;-1.1346362953191e-05;9.2912501713727e-05;0.0002247328084195;-0.00010925920651061;-3.7064059142722e-05;-0.00024222831416409;9.8142227216158e-05;-0.00011195335537195;0.00067809183383361;-1.0075881618832e-05;-0.00017018328071572;-0.00010448577086208;9.9794859124813e-05;-6.9980647822376e-05;-6.5459884353913e-05;4.5765605136694e-06;-0.0004022967768833;-3.230913716834e-05;0.0007474793237634;-8.1946946011158e-06;0.00076934025855735;0.00037692961632274;4.5781926019117e-05;8.1663027231116e-05;-3.8116859286674e-06;-2.4548353394493e-05;0.00011426366836531;3.2182342692977e-05;0.00013409130042419;-2.0916046196362e-05;5.7050157920457e-05;2.9270486265887e-05;0.00081340747419745;0.0010492460569367;0.0001195471486426;-0.0014475624775514;-0.00073209492256865;-0.00041973029146902;-0.00043268516310491;-0.00053318124264479;-4.5098160626367e-05;-0.00019212627375964;-9.5368268375751e-05;4.0749637264526e-05;2.1171264961595e-05;-5.0184000428999e-05;7.9338806244778e-06;-0.00080631056334823;0.00071746710455045;0.00010400601604488;0.00018066655320581;0.00012504593178164;-2.698868229345e-05;-2.4600398319308e-05;4.0073660784401e-05;2.315942219866e-05;-2.113907430612e-05;0.00060088693862781;-0.00043063826160505;7.5327761805966e-06;5.1565901230788e-05;-4.7391949919984e-05;1.1849995644297e-05;-0.00014180532889441;7.6273958256934e-05;2.2630834791926e-05;9.6489035058767e-05;-0.00013743885210715;-7.7703123679385e-05;-3.8313919503707e-05;-0.00042538295383565;0.00012439933198038;7.4093208240811e-05;-4.4440897909226e-05;-0.00011096417438239;6.4341154939029e-05;3.0101031370577e-05;-1.7464702978032e-05;0.00012921140296385;0.00044391720439307;-7.1841859607957e-05;-0.00022696440282743;8.333069854416e-05;-7.740286673652e-05;0.00015864681336097;0.0001692157384241;-1.5095532944542e-05;-3.1458621378988e-05;-0.00035259159631096;-0.00059453130234033;0.00013221528206486;0.00012243865057826;2.8693100830424e-05;4.9501613830216e-05;0.0003699830849655;0.00052220071665943;-0.00011374299356248;-0.00046557589666918;-0.0003866707556881;-0.00013778320862912;-5.709461402148e-05;0.00028421156457625;0.00052951561519876;-0.00020503594714683;-0.00021596362057608;-2.8304140869295e-05;2.6280298698111e-05;-2.204540578532e-05;-4.7259040002245e-05;-0.00023811022401787;-0.00036190173705108;0.00020828311971854;0.00052550237160176;0.00074515520827845;0.0007890579290688;9.9785094789695e-05;4.6130422560964e-05;-3.3883097785292e-05;-1.7500694866612e-06;0.00014603705494665;0.00011896646901732;2.072038660117e-05;0.00010447599197505;5.9768866776722e-05;6.8808629293926e-05;0.0012818287359551;0.0013189563760534;0.00015128517406993;-0.0013724118471146;-0.0015344193670899;-0.00055241322843358;-0.00050571071915329;-0.00024486894835718;-0.00044052471639588;-0.00020764299551956;-0.00019609414448496;5.401599992183e-06;4.4829692342319e-05;4.6890527301002e-06;-4.9951009714277e-05;-0.00071579252835363;0.0005873020272702;0.00021830454352312;0.00032725758501329;9.5953255367931e-05;3.8480764487758e-05;-2.0646761186072e-05;3.4422417229507e-05;2.0491830582614e-05;-1.2905104085803e-05;0.00057868857402354;-0.00028763711452484;1.8968537915498e-05;9.3802336778026e-05;-6.4232976001222e-05;-1.4872211067996e-05;-0.00031633218168281;0.00011502589768497;4.7170753532555e-05;0.00015815478400327;-0.0001579842355568;-0.00011859249934787;-7.7807919296902e-05;-0.00048854644410312;-6.5397522121202e-05;0.00010625871072989;-2.7406003937358e-05;-0.00011386970436433;6.783066510252e-06;3.6318506317912e-05;-1.3604336572826e-06;-9.8678647191264e-05;0.00059862417401746;4.9389051127946e-05;-0.00027273307205178;0.00015801882545929;-0.00017323106294498;0.00014454065239988;0.00015097623690963;-4.6620689317933e-06;-3.3060907298932e-05;-0.00011467169679236;-0.00072482053656131;0.00011855677439598;0.00011412000458222;3.9130372897489e-06;5.6795659475029e-05;0.00027022516587749;0.00045405371929519;-0.00010791924432851;-0.00042588269570842;-0.00027482883888297;-0.00017790643323679;1.2675896869041e-05;6.5274587541353e-05;0.00063434819458053;-0.00015922603779472;-0.00020642034360208;-6.5567313868087e-05;6.8678527895827e-05;4.5054079578222e-07;-6.1032133089611e-05;-0.00010878850298468;-0.00043028822983615;3.8809048419353e-05;0.00076493137748912;0.00059598119696602;0.00081975047942251;0.00010728558117989;2.7831105398946e-05;-4.1223571315641e-05;8.1440166468383e-06;9.1547990450636e-05;9.4950686616357e-05;-2.5371686206199e-05;0.00014531933993567;5.0193648348795e-05;7.1833761467133e-05;0.0010904937516898;0.0012757501099259;0.00014631764497608;-0.0011005369015038;-0.0016149492003024;-0.00053921004291624;-0.00047909602290019;-0.00010337620915379;-0.00055568863172084;-0.00016463924839627;-0.00019259288092144;1.7030632079695e-05;7.402273331536e-05;1.3827983821102e-05;-7.8260003647301e-05;-0.0005106120952405;0.00033909801277332;0.00031360707362182;0.00049225671682507;2.6359157345723e-05;0.00015845500456635;-1.7094602299039e-05;2.9434355383273e-05;1.3247574315756e-05;-1.7074948743812e-07;0.0004531005397439;-1.459237500967e-05;2.8166014089948e-05;0.00013705302262679;-7.2790659032762e-05;-5.681398397428e-05;-0.00048970605712384;0.0001618729729671;7.6312113378663e-05;0.00022658349189442;-0.00019293170771562;-0.00014181896403898;-0.00014983498840593;-0.00047414799337275;-0.00035105040296912;0.00013276736717671;-2.2810240807303e-07;-9.1776535555255e-05;-9.283481631428e-05;3.3730342693161e-05;3.4360269637546e-05;-0.00036097061820328;0.00073626608354971;0.00020247526117601;-0.00027459944249131;0.00023041365784593;-0.00025517228641547;0.00011717307643266;0.00011912996706087;7.7681143011432e-06;-3.0990730010672e-05;0.0001795815769583;-0.00081566296285018;9.75855946308e-05;0.00011083175922977;-2.8963388103875e-05;5.7034325436689e-05;0.00010867172386497;0.000349259149516;-8.8657012383919e-05;-0.00033595392596908;-0.0001358800654998;-0.00021795467182528;8.3328923210502e-05;-0.00021303482935764;0.00067356240469962;-8.7786364019848e-05;-0.00018106355855707;-0.00010791983368108;0.00010608724551275;2.7965435947408e-05;-7.2524584538769e-05;5.9564339608187e-05;-0.00048026393051259;-0.00014182162703946;0.0010460434714332;0.00034209457226098;0.0007694682572037;0.00011046392319258;1.1676512485792e-06;-4.5230935938889e-05;2.1440599084599e-05;4.3083450691483e-06;3.2078354706755e-05;-7.2294111305382e-05;0.00019119888020214;2.9199018172221e-05;6.856372783659e-05;0.00071237527299672;0.0011064279824495;0.00012162140046712;-0.00064395531080663;-0.001575433765538;-0.00047539829392917;-0.0003917655267287;7.0331618189812e-05;-0.00065453699789941;-9.1779562353622e-05;-0.00016910159320105;3.1675146601629e-05;0.00011219504813198;2.2906731828698e-05;-0.00011154265666846;-0.00035635271342471;0.00013787735952064;0.00034131162101403;0.00062680966220796;-4.3538737372728e-05;0.00030245681409724;-2.0552302885335e-05;3.5350487451069e-05;6.1214600464155e-06;9.100327588385e-06;0.00033702969085425;0.00027264686650597;3.0778188374825e-05;0.00016495895397384;-7.2233488026541e-05;-0.00010156794451177;-0.00058805843582377;0.00021244528761599;0.00010419900354464;0.00027975332341157;-0.00025460071628913;-0.00014017723151483;-0.00024775401107036;-0.00042044845758937;-0.00062737235566601;0.00014815066242591;2.3809832782717e-05;-6.5321000874974e-05;-0.00020526041043922;2.5646484573372e-05;8.4791819972452e-05;-0.00053474289597943;0.00084903120296076;0.00032332263072021;-0.0002370498405071;0.00028505621594377;-0.00027495555696078;0.00010663317516446;0.00010907726391451;1.3979729374114e-05;-2.9168257242418e-05;0.00036820583045483;-0.00088402861729264;9.4061062554829e-05;0.00013855801080354;-5.2841071010334e-05;5.2234190661693e-05;5.8187286100519e-08;0.00033749733120203;-7.0670437708031e-05;-0.00030112915555947;-0.00010016011219705;-0.00026685852208175;0.00010095333709614;-0.0004081062215846;0.00066049245651811;-4.3317086237948e-05;-0.00017742055933923;-0.00014134914090391;0.00011650415399345;4.6417655539699e-05;-8.0284953583032e-05;0.00016673978825565;-0.00053387932712212;-0.00023069826420397;0.0013321189908311;0.00017040112288669;0.00073725997935981;0.00012103070912417;-1.9261877241661e-05;-4.725311009679e-05;3.262285827077e-05;-6.1403537984006e-05;-4.647132664104e-05;-9.6084404503927e-05;0.0002355691685807;1.045497629093e-05;6.9270041421987e-05;0.0004434593138285;0.0010267331963405;0.00010205149010289;-0.00033689397969283;-0.0016119381180033;-0.0004524749238044;-0.00032692655804567;0.00017026482964866;-0.00073776708450168;-4.1272065573139e-05;-0.00015766400611028;4.3526353692869e-05;0.00015318326768465;2.8751539502991e-05;-0.00014344895316754;-1.7306031168118e-06;-4.7451294449274e-06;-9.5285122370115e-06;5.1467410230543e-05;-0.00030294779571705;1.4553525943484e-05;-0.00015296100173146;-0.00017022454994731;-3.1431618481292e-06;0.00019858205632772;8.7848660768941e-05;2.6053307010443e-05;-5.4122818255564e-05;1.7190643120557e-05;-0.00034586849506013;-0.00013858640159015;-9.2047943326179e-05;-0.00010919402848231;0.00012246855476405;0.00022966459800955;2.6343459467171e-05;0.00013740929716732;-2.860327003873e-05;-4.1794199205469e-05;-8.9950852270704e-05;0.00040076009463519;0.00015539137530141;-9.3960923550185e-05;-1.2991396943107e-05;0.00017299396859016;1.1674135748763e-05;2.1768017177237e-05;-2.5171797460644e-05;-9.9235927336849e-05;1.3358039723244e-05;0.00043472377001308;-0.00010398883750895;0.00058995734434575;-0.00035454559838399;-0.00096363399643451;0.00066131522180513;-3.7282377888914e-05;5.0515383918537e-05;-0.00015499541768804;-6.0860158555442e-05;0.00053223251597956;-0.00035206860047765;7.8593373473268e-05;0.00024852529168129;0.0002507618337404;-0.00019545914256014;-3.4684348065639e-05;-0.00061997736338526;1.4409705727303e-05;0.00017800975183491;-4.0690378227737e-05;-0.00054760003695264;0.00036657685996033;2.9895534680691e-05;-2.9459253710229e-05;4.4788583181798e-05;0.00010422202467453;3.1944005058904e-06;-7.7675531429122e-06;5.4137228289619e-05;6.4228966948576e-05;0.00041900164796971;5.3251689678291e-05;0.00060419377405196;-4.7508270654362e-05;-0.00017446611309424;1.3995178960613e-05;1.9932445866289e-05;-1.9705212253029e-05;0.00017749579274096;-3.602186916396e-05;-3.5367054806557e-05;1.3881981431041e-05;7.9800502135186e-06;0.00049417186528444;0.00015537433500867;-0.0001572455803398;-0.00020827709522564;-0.00082130875671282;-9.823029540712e-05;-0.00018437583639752;8.1591024354566e-06;-0.00030994243570603;1.4395858670468e-05;-2.8246353394934e-05;2.3482642063755e-05;-8.8377555584884e-06;1.0423201274534e-05;-4.3501387381184e-07;-6.3156153373711e-06;-6.1630876189156e-06;3.6498953704722e-05;-0.00019776840053964;2.6045492631965e-05;-0.00015759238158353;-0.00015141093172133;-6.5374588302802e-05;0.00020370801212266;5.6320837757085e-05;3.206687324564e-05;-5.89763840253e-05;1.6578353097429e-05;-0.00018236726464238;-0.00014038672088645;-6.4590632973704e-05;-7.5456904596649e-05;0.00015366793377325;0.00014733550779056;3.2182113500312e-05;0.00010765475599328;-7.1228620072361e-05;-1.9040338884224e-05;-8.9430715888739e-05;0.00027294209576212;0.00014742366329301;-5.3838029998587e-05;-1.6513135051355e-05;0.00010808427759912;1.6379857697757e-05;1.8445311070536e-05;-1.8704415197135e-05;-8.0846897617448e-05;-9.7907548024523e-07;0.00031712572672404;-8.9349952759221e-05;0.00043078055023216;-0.00025974298478104;-0.00074685219442472;0.00050624058349058;-4.2141469748458e-05;3.9373026083922e-05;-0.00012689482537098;-4.750162770506e-05;0.00044614227954298;-0.00026816033641808;6.4354790083598e-05;0.00014384658425115;0.00016653643979225;-0.00014839749201201;-4.1015227907337e-06;-0.00040905750938691;2.7586231226451e-05;0.00015978117880877;-2.4057664631982e-05;-0.00043843078310601;0.00027382155531086;3.5896409826819e-05;-2.4222526917583e-05;1.7197091437993e-05;8.2313577877358e-05;2.1680127701984e-06;-8.1258804129902e-06;3.4593704185681e-05;5.1921164413216e-05;0.00037900617462583;6.9350317062344e-05;0.00051052263006568;-5.4377342166845e-05;-0.00017833740275819;2.3802862415323e-05;2.8625534469029e-05;-9.3368462330545e-06;0.00013213872443885;-3.4560682252049e-05;-2.2330701540341e-05;5.4581446420343e-06;1.7257563740714e-05;0.00044305532355793;0.00018983856716659;-0.00014743597421329;-0.00018311600433663;-0.00072920037200674;-0.00013075054448564;-0.00014776748139411;-4.0520858419768e-06;-0.00027208315441385;2.2517799152411e-05;-3.6290741263656e-05;1.7890277376864e-05;1.6774876712589e-05;1.2843475815316e-05;2.8081785785616e-05;-2.4746783310547e-05;-2.4146220312105e-05;4.3233147152932e-05;9.1786067059729e-05;-8.1589801993687e-05;0.00024968013167381;-0.00023441947996616;-0.0007263901643455;0.00074678956298158;-5.7343906519236e-05;4.5364202378551e-05;-1.0872438906517e-05;3.4227297874168e-05;0.00039684440707788;-0.00039778702193871;-1.2518907169579e-05;1.7830639990279e-05;-1.9336672266945e-05;5.2098835112702e-07;-7.161507710407e-06;-9.8404030723032e-05;8.7331944087055e-05;7.8146047599148e-05;-8.5183804912958e-05;-0.00031499133910984;0.00028928689425811;4.5700977352681e-05;-4.4949665607419e-05;-9.0408211690374e-05;7.5425872637425e-05;2.4635967292852e-06;5.1043280109297e-06;-7.8336030128412e-05;-6.3268795202021e-05;0.00018421860295348;0.00019576396152843;0.00022155501937959;0.00027083460008726;-0.00021771783940494;-0.00028788953204639;-2.3338656319538e-05;-2.6838883059099e-05;-0.00014895970525686;-0.00012179482291685;0.00019308780611027;0.0002211182290921;0.00010893945000134;0.00020728122035507;0.00013148610014468;-0.00011972417269135;-0.00013462250353768;-0.00026207265909761;-0.0002615230914671;0.00015002042346168;0.00012507534120232;-0.00021473292144947;-0.00025510380510241;3.1324561859947e-05;2.8727961762343e-05;7.1590337029193e-05;6.7331864556763e-05;-1.1153519153595e-05;-3.4950985536852e-06;8.0703153798822e-05;5.6919434427982e-05;0.00044214059016667;0.00038462763768621;0.00015877283294685;0.00024248863337561;-0.00011156193795614;-0.00016509991837665;4.1429862903897e-05;2.5217801521649e-05;7.4072988354601e-05;8.2024191215169e-05;4.7191522753565e-05;5.5611926654819e-05;1.3625705832965e-05;0.00061560492031276;0.00059342331951484;-0.00024858966935426;-0.00020426872652024;-0.0007021309575066;-0.00073677330510691;-0.00019965837418567;-0.00014787657710258;-0.00015516756684519;-0.00018597197777126;-2.0020374904561e-06;-5.8314321904618e-06;-1.7414340618416e-05;-1.6859035895322e-05;-1.0035659215646e-05;3.3652120237093e-06;-7.7607764978893e-06;6.3425039115828e-05;-0.00052588904509321;7.0667418185622e-05;-0.00026122402050532;-9.4631788670085e-05;0.00029965178691782;1.8359487512498e-05;0.00017326843226328;9.9915596365463e-06;-2.2574444301426e-05;2.2737982362742e-05;-0.00077958381734788;-4.1494360630168e-05;-0.00013668702740688;-0.00018293679750059;7.9769102740102e-05;0.00038423525984399;9.2031577878515e-06;0.00028624015976675;-4.9820606363937e-05;-0.00012177047756268;-8.4985338617116e-05;0.00071659625973552;6.2399572925642e-05;-0.00019681836420204;-6.6582123281478e-07;0.00032819135230966;-1.1223427463847e-05;1.9041650375584e-05;-2.5606923372834e-05;-0.00013253970246296;2.8779984859284e-05;0.00028308486798778;-9.8882141173817e-05;0.00055554049322382;-0.00043130820267834;-0.0010938831837848;0.00079537183046341;5.0715634642984e-06;6.466094055213e-05;-0.00025777466362342;-5.5886408517836e-05;0.00041904347017407;-0.00042886397568509;4.9104852223536e-05;0.00018267355335411;0.00031994027085602;-9.2011279775761e-05;-9.4767556220177e-06;-0.0005625142948702;-7.8352286436711e-06;0.00021861339337192;-8.0085563240573e-05;-0.00034314292133786;0.00044202915159985;-1.2764046914526e-05;-3.84147024306e-05;0.00017098074022215;0.00011705327779055;1.0086182555824e-05;-9.3130620371085e-06;7.0637783210259e-05;9.38158336794e-05;0.0004888863186352;-2.3292990590562e-05;0.00094804423861206;-9.417026740266e-05;-0.00027514150133356;7.6130156230647e-05;1.3254401665108e-06;-4.0855309634935e-05;0.00024460282293148;-5.300933480612e-05;-7.1868409577291e-05;-9.266513188777e-06;-1.0887475582422e-05;0.00060004187980667;6.1395156080835e-05;-0.00015255332982633;-0.00026331457775086;-0.001092235557735;3.9871036278782e-05;-0.00022396665008273;4.2445481085451e-05;-0.00041073566535488;5.0326299970038e-05;-1.8849104890251e-05;3.3631789847277e-05;-3.0741419323022e-05;1.896072535601e-05;-6.1678661040787e-06;-3.1478605251323e-06;-8.4373259596759e-06;6.6898814111482e-05;-0.0004774366680067;6.3917133957148e-05;-0.00029137590900064;-0.00017641671001911;0.00011573353549466;0.00017405163089279;0.00013979572395328;3.1581374059897e-05;-6.8878318415955e-05;2.6207701012027e-05;-0.00058155122678727;-0.00013553352619056;-0.00013288948684931;-0.00016848242376;0.00017491102335043;0.00034581669024192;3.0947878258303e-05;0.00025895948056132;-8.9314831711818e-05;-7.8938966908026e-05;-0.00012159274047008;0.00064625439699739;0.00015359642566182;-0.00014862010721117;-1.3749516256212e-05;0.00026706277276389;6.7989926719747e-06;2.7084370231023e-05;-3.067985016969e-05;-0.00014014105545357;1.5596137018292e-05;0.0004443701764103;-0.00013620175013784;0.00068903836654499;-0.00046135328011587;-0.0012434936361387;0.0008721828344278;-3.8899659557501e-05;6.8681838456541e-05;-0.00024346222926397;-7.1616159402765e-05;0.00063280866015702;-0.00046690518502146;8.4455830801744e-05;0.00023406275431626;0.00031267758458853;-0.00018802795966621;-1.1928017556784e-05;-0.00067513232352212;2.6437272026669e-05;0.00025730981724337;-6.2834682466928e-05;-0.00059219368267804;0.00047995973727666;2.9296803404577e-05;-4.1576506191632e-05;9.5776245871093e-05;0.00013470748672262;7.3712858466024e-06;-1.1578750672925e-05;6.9552195782308e-05;9.1670815891121e-05;0.00058247084962204;4.5430322643369e-05;0.00091898994287476;-9.2292917543091e-05;-0.00028511733398773;5.2898776630173e-05;2.2842046746518e-05;-2.9817576432833e-05;0.00025132409064099;-5.6419747124892e-05;-4.9384194426239e-05;4.2738320189528e-06;8.2362403190928e-06;0.00068177282810211;0.00018901751900557;-0.0002072428324027;-0.0002885939902626;-0.0011776060564443;-8.7044420070015e-05;-0.00024792310432531;1.9762326701311e-05;-0.00045728433178738;4.1753799450817e-05;-3.969715180574e-05;3.346343874e-05;-9.7827942227013e-06;1.8954837287311e-05;5.3424173529493e-05;-4.5943055738462e-05;-4.37342459918e-05;7.9683049989399e-05;0.00013181580288801;-0.00010975622717524;0.00045011506881565;-0.00038275207043625;-0.0013365601189435;0.001365996315144;-0.00010301596921636;7.8608238254674e-05;-3.1617855711374e-06;5.825400876347e-05;0.00071757560363039;-0.00070777739165351;-2.3588292606291e-05;3.1023973861011e-05;-6.0211077652639e-05;3.6857247323496e-05;-4.9404825404054e-05;-0.00016070924175438;0.00014779562479816;0.00013000480248593;-0.00014444869884755;-0.00056013907305896;0.00048181982128881;8.1828788097482e-05;-8.2015852967743e-05;-0.0001780597231118;0.00014647509669885;4.6327022573678e-06;1.2371031516523e-05;-0.00014961855777074;-0.00012189795961604;0.00029830794665031;0.00036210552207194;0.00039016726077534;0.00053640175610781;-0.00036984440521337;-0.00060907332226634;-4.4564036215888e-05;-6.0392485465854e-05;-0.00029757237643935;-0.0002469779283274;0.00033077938132919;0.00045123684685677;0.00019311813230161;0.00034550687996671;0.00021081634622533;-0.00019103215890937;-0.00024280560319312;-0.00043488616938703;-0.00045954281813465;0.00029385252855718;0.00025624639238231;-0.00035916230990551;-0.00050405896035954;6.128272798378e-05;6.3809296989348e-05;0.00014972519420553;0.0001310691004619;-1.8933873434435e-05;-3.8685338950017e-06;0.00015444470045622;0.00010886726522585;0.00080913957208395;0.00071191060123965;0.00027698581106961;0.00047571494360454;-0.00020310234685894;-0.00032599252881482;7.2189723141491e-05;4.2378320358694e-05;0.00015620318299625;0.0001827257219702;9.9340526503511e-05;0.00011799366620835;8.496273039782e-06;0.0010893787257373;0.0011123205767944;-0.00043638865463436;-0.00035451876465231;-0.0012638383777812;-0.0013543418608606;-0.00038382690399885;-0.00028824133914895;-0.0002942189166788;-0.00037742685526609;1.839554442995e-06;-9.2467844297062e-06;-5.3115640184842e-05;-5.2867821068503e-05;5.6886339734774e-05;-4.788942533196e-05;-4.8689111281419e-05;8.2751917943824e-05;0.00012578922905959;-8.9216111518908e-05;0.00046987968380563;-0.00034576872712933;-0.0014175795949996;0.0014326261589304;-0.00011221272870898;7.9652825661469e-05;-5.2390387281775e-06;7.2231166996062e-05;0.00077133619925007;-0.00073407863965258;-1.9196946595912e-05;3.9875987567939e-05;-9.1336536570452e-05;4.1879633499775e-05;-7.0347639848478e-05;-0.00014815853501204;0.0001321602758253;0.00014504003047477;-0.00014957945677452;-0.00059454125585034;0.00046325614675879;8.9762856077868e-05;-8.8119864813052e-05;-0.00019475266162772;0.00015357777010649;4.4518233153212e-06;1.6467094610562e-05;-0.00016330819926225;-0.00013793891412206;0.00025592697784305;0.00037684914423153;0.00037098332541063;0.00060033495537937;-0.00031984830275178;-0.00072403863305226;-4.6053992264206e-05;-7.3576302384026e-05;-0.00032054577604868;-0.00027272943407297;0.00031028961529955;0.00052708364091814;0.00019920973863918;0.00030177517328411;0.00017420729272999;-0.00016377991414629;-0.0002451409236528;-0.00037692708428949;-0.0004419875331223;0.00031936570303515;0.00029534046188928;-0.00033229347900487;-0.00057352345902473;6.2740567955188e-05;7.4661649705376e-05;0.00016636872896925;0.00013563601532951;-2.0895246052532e-05;-2.9595180421893e-06;0.00016291959036607;0.00011396605987102;0.00086152274161577;0.00077769922791049;0.00026647734921426;0.00053765589836985;-0.00021602671768051;-0.00037090247496963;7.8293312981259e-05;4.6560355258407e-05;0.00015394427464344;0.00020391393627506;0.00011085942969657;0.00013097365444992;9.3101116362959e-06;0.0011652836110443;0.0012296366039664;-0.00046569897676818;-0.0003758413658943;-0.0013460608897731;-0.0014878683723509;-0.00040609244024381;-0.00031385559123009;-0.0003007655905094;-0.0004236621898599;4.1712714846653e-06;-1.2491291272454e-05;-5.3276216931408e-05;-5.6790613598423e-05;-7.8596467574243e-06;1.1016544704034e-05;-5.6635824876139e-05;7.7338345363387e-06;-0.00012844626326114;0.00056095456238836;-9.3033179382473e-07;0.00031770771602169;0.00012995983706787;-0.00044790742686018;2.5925805857696e-06;-0.00014274883142207;-3.3236610761378e-05;9.0343628471601e-06;-5.1143746532034e-05;0.00083768204785883;0.00012180759222247;0.00020181412401143;-3.3998487197096e-05;7.0240412242129e-06;-0.00037045610952191;8.7191627244465e-05;-0.00038883098750375;7.8673561802134e-05;8.6144107626751e-05;4.1965682612499e-05;-0.00071666407166049;-8.8115330072469e-06;0.00018364851712249;3.2607746106805e-05;-0.00032988862949423;-2.4223487343988e-05;1.6456002413179e-05;1.1360795724613e-05;-0.00011220635497011;-8.9937311713584e-05;0.00013138628855813;-0.00035481463419273;0.00044807809172198;0.00068575335899368;-0.000949822133407;9.1391950263642e-05;2.8987882615183e-05;-4.9300957471132e-05;-0.00021411605121102;-0.00040329090552405;0.00026941820397042;1.7795706298784e-05;8.9484319687472e-06;0.0002558265987318;6.867952470202e-05;2.6853351755562e-06;-6.1428322624124e-06;-0.00033008778700605;-0.00011139525304316;0.0001529943983769;0.00041710867662914;-0.00019876367878169;-5.2331284678075e-05;-4.1193477954948e-05;0.00012289584265091;0.0002078590914607;-8.7876878751558e-06;1.4005945558893e-05;0.000105456179881;3.0266355679487e-05;-0.00013082260556985;0.00040214863838628;-0.00012311873433646;0.0012176084564999;0.00013975126785226;-0.00035395170561969;-6.1797509260941e-05;7.0197224886215e-06;-7.5672214734368e-05;0.00024630295229144;-4.6822573494865e-05;-0.00014090542390477;-1.3806952665618e-05;0.00060298701282591;-8.4135303040966e-05;-0.00028737177490257;-7.9365876445081e-05;0.00020636776753236;-0.0012025209143758;9.8211676231585e-05;-0.00015937068383209;9.8834287200589e-05;-0.00044281230657361;3.8595888327109e-05;-5.2418439736357e-05;3.0863448046148e-05;2.5261035261792e-05;-2.0386096366565e-05;1.9758537746384e-05;1.5675891518185e-06;5.0912534788949e-05;-0.00062972091836855;0.00011159523273818;-0.00021325192938093;0.00010540087532718;0.00088805489940569;-0.00040259549859911;0.00031015675631352;-3.8917944038985e-05;0.00016703679284547;9.9306489573792e-06;-0.001497293356806;0.00019773308304138;-0.00015762184921186;-0.00025176425697282;-0.00014232174726203;0.00050052755977958;-3.2021725928644e-05;0.00040297853411175;1.9096696632914e-05;-0.00031126898829825;-4.0294466998603e-06;0.00092425791081041;-0.00016290105122607;-0.00038878121995367;3.3788030123105e-05;0.00056538241915405;-5.5302032706095e-05;-9.337671144749e-06;-7.2189013735624e-06;-0.00014046842989046;5.7204255426768e-05;-0.00036865953006782;3.6825378629146e-05;2.7140575184603e-05;-0.00036082993028685;-0.00074585806578398;0.00065053766593337;0.00017100771947298;6.7940811277367e-05;-0.00040938064921647;-7.4662866609287e-06;-0.00032779021421447;-0.00036124847247265;-7.7469827374443e-05;-0.00011343920050422;0.0003969703684561;0.00028905397630297;6.2860388425179e-05;-3.2296375138685e-05;-0.00016236890223809;0.00014973060751799;-0.00015899316349532;0.00063043681439012;0.0003578629984986;-0.00017106282757595;-3.9282298530452e-05;0.00051494082435966;8.0658399383537e-05;2.2599049771088e-05;-5.5051682466001e-06;8.1253849202767e-05;0.0001304082252318;0.00029174925293773;-0.00023638844140805;0.0014118667459115;-0.00014709544484504;-0.00038419230259024;0.00020513650088105;-5.8381796407048e-05;-8.2919017586391e-05;0.00025685655418783;-6.199897325132e-05;-0.00021952105453238;-7.1843714977149e-05;-7.9472163633909e-05;0.0005255839205347;-0.0003052419051528;4.6755967559875e-06;-0.00026330319815315;-0.0011920921970159;0.00043762644054368;-0.000193604893866;0.00011734842701117;-0.0003321664116811;0.00010876690066652;3.4880427847384e-05;4.1783281631069e-05;-6.984214996919e-05;3.3033695217455e-05;-1.543908547319e-05;1.2388169125188e-05;-1.9520307432686e-06;4.8308938858099e-05;-0.00052251707529649;9.3538641522173e-05;-0.00021420925622806;2.8581378501258e-05;0.00061127654043958;-0.00022529924171977;0.00024180144828279;-1.722268643789e-05;9.4043221906759e-05;1.3220727851149e-05;-0.0011221305467188;9.9296405096538e-05;-0.00013371248496696;-0.00020474016491789;-4.5012788177701e-05;0.00040898972656578;-1.3503340596799e-05;0.00032668164931238;-1.6556758055231e-05;-0.00022659359092358;-3.3297899790341e-05;0.00075918767834082;-7.2387723776046e-05;-0.00029565492877737;1.8822460333467e-05;0.00043929388630204;-3.5201330319978e-05;6.1479858004532e-07;-1.2240370779182e-05;-0.0001271101355087;3.9771308365744e-05;-0.00013501009379979;-8.771838110988e-06;0.00017551095515955;-0.00034920594771393;-0.0007917444454506;0.00064002012368292;0.00010128614667337;6.2279927078635e-05;-0.0003308096784167;-2.1919346181676e-05;-5.3381008910947e-05;-0.00035176769597456;-2.9692340831389e-05;-2.4186554583139e-05;0.00033718888880685;0.00014317822933663;4.2559819121379e-05;-0.00017427580314688;-0.00010132430907106;0.00016445686924271;-0.00012069055810571;0.00026877282653004;0.00035248722997494;-0.00010287461191183;-3.6400964745553e-05;0.00035742254112847;8.5856132500339e-05;1.6389572920161e-05;-6.3856814449537e-06;6.448997737607e-05;0.00011012828326784;0.00033350739977323;-0.00014735253353138;0.0011708347592503;-0.00012223265366629;-0.00032665848266333;0.00015113006520551;-2.5754190573934e-05;-6.2978484493215e-05;0.00022481576888822;-5.4112486395752e-05;-0.00017192888481077;-4.6904948248994e-05;-4.8520876589464e-05;0.00051891955081373;-0.00015870360948611;-4.393091876409e-05;-0.00025007015210576;-0.0010870629921556;0.00027427499298938;-0.00018520212324802;8.3306942542549e-05;-0.00032642178121023;8.2843413110822e-05;4.170805823378e-06;3.5909230064135e-05;-3.2100389944389e-05;2.5600385924918e-05;6.9097273808438e-05;-5.7733850553632e-05;-5.3694155212725e-05;0.0001040403440129;6.1674450989813e-05;-4.322376116761e-05;0.00044282138696872;-0.00029913481557742;-0.0016928643453866;0.0017213745741174;-0.00012551879626699;9.8246680863667e-05;-1.7208632925758e-05;0.00010419012687635;0.00090767559595406;-0.00090374721912667;-3.8130994653329e-05;3.2842901418917e-05;-0.00010250811465085;0.00011970710329479;-0.00011770307901315;-0.00010419676254969;8.8134518591687e-05;0.0001577415241627;-0.00018753588665277;-0.00061454635579139;0.00049349671462551;0.00010981642117258;-0.00011922316480195;-0.00024540076265112;0.00021151101100259;1.5518135114689e-05;2.2569185603061e-05;-0.00022773287491873;-0.00017503391427454;0.0002012699842453;0.00030630742548965;0.00047062849625945;0.00063755235169083;-0.00046867245691828;-0.00081078306538984;-8.4668303315993e-05;-0.00010819008457474;-0.00042558935820125;-0.00035960983950645;0.00043168177944608;0.00062138133216649;0.00020910672901664;0.00012351959594525;1.1635374903562e-05;-9.5466421043966e-05;-0.00020460497762542;-0.00024734443286434;-0.00023046640853863;0.00046737893717363;0.00040711610927247;-0.00042569730430841;-0.00063259562011808;9.5194991445169e-05;0.00010645473230397;0.00020171061623842;0.00016742927255109;-2.4232445866801e-05;-2.1428256786749e-06;0.00019476559828036;0.00013414598652162;0.0011295638978481;0.00097479100804776;0.00034136170870624;0.00062034907750785;-0.00031257554655895;-0.00050217023817822;0.00010684342851164;5.9056506870547e-05;0.00020335317822173;0.00024426492745988;0.00016394382691942;0.00020135476370342;8.4059711298323e-06;0.0014222635654733;0.0016961223445833;-0.00056201312690973;-0.00045607090578414;-0.0017620733706281;-0.0018534975824878;-0.00053432316053659;-0.00038926262641326;-0.00040827598422766;-0.00053612067131326;1.9038262735194e-06;-1.2262941709196e-05;-7.1989939897321e-05;-7.5478179496713e-05;7.1968373958953e-05;-5.9223937569186e-05;-5.9476307797013e-05;0.00010433544957777;6.7938308347948e-05;-2.740410673141e-05;0.00048571056686342;-0.00027174444403499;-0.0017511260230094;0.0017587835900486;-0.00013469946861733;9.7383344836999e-05;-1.3562264030043e-05;0.00011204354814254;0.00095083145424724;-0.00090864876983687;-2.914489050454e-05;4.4777556468034e-05;-0.00014138942060526;0.00011269782407908;-0.00013601523824036;-0.00010281756840413;8.275306026917e-05;0.00017344743537251;-0.00018746050773188;-0.00066158373374492;0.00047351320972666;0.00011443225230323;-0.0001210100017488;-0.00025720239500515;0.00021189310064074;1.3489308003045e-05;2.5291306883446e-05;-0.00023081249673851;-0.00018433536752127;0.00018890417413786;0.00034187268465757;0.0004494508029893;0.0006956122815609;-0.00040164540405385;-0.00092238117940724;-7.8637247497682e-05;-0.00011604955216171;-0.00043303475831635;-0.00037775287637487;0.0003969177196268;0.00068744557211176;0.00021563733753283;0.00013005177606829;1.9437740775174e-05;-8.7813663412817e-05;-0.00022201346291695;-0.00024531729286537;-0.00026104631251656;0.00046593078877777;0.00042948676855303;-0.00039533380186185;-0.00069395371247083;9.1630819952115e-05;0.0001143424451584;0.00021471810759977;0.00016990744916257;-2.5936007659766e-05;-8.9496614918971e-07;0.00020032766042277;0.00013884730287828;0.0011467891745269;0.0010163631523028;0.00032198976259679;0.00068685604492202;-0.00030608079396188;-0.00053453876171261;0.00010961420775857;6.0488277085824e-05;0.00019719563715626;0.00026800221530721;0.00016562076052651;0.00020629024947993;7.8158036558307e-06;0.0014660228043795;0.0017373223090544;-0.00057843449758366;-0.00046915904385969;-0.0017863229149953;-0.0019367068307474;-0.00054242642363533;-0.0004077356425114;-0.00040036902646534;-0.00057790882419795;4.1248881643696e-06;-1.6163659893209e-05;-7.0331749157049e-05;-8.0661178799346e-05;-1.6305981262121e-05;1.7458811271354e-05;-7.3145936767105e-05;7.5386396929389e-06;-0.00018664247181732;0.00079803128028288;-6.6952685301658e-05;0.00040418151183985;0.00030380571843125;-0.00078845274401829;2.4949598810053e-05;-0.00022181450913195;-4.2701150960056e-05;-4.0056918805931e-05;-0.00014646652562078;0.0013471993152052;0.00016905753000174;0.00028192103491165;3.2128344173543e-05;2.9673716198886e-05;-0.00053178105736151;9.7845375421457e-05;-0.00056089251302183;7.2585469752084e-05;0.00015608544345014;0.00013475571176969;-0.001022711629048;-2.5023871785379e-05;0.0002957352262456;6.1493075918406e-05;-0.00051149778300896;-2.4066795958788e-05;1.3102289813105e-05;2.2930598788662e-05;-0.00014527642633766;-7.0561043685302e-05;-4.9323385610478e-05;-0.00043338889372535;0.0003895747649949;0.00084408698603511;-0.0011128972982988;0.00012029032950522;8.3525344962254e-05;-4.2835283238674e-05;-0.00032112849294208;-0.00050088507123291;9.6222509455401e-05;-2.3650643925066e-05;-0.00011993326188531;0.00034250880707987;0.00012990285176784;0.0001302787422901;-5.2597308240365e-05;-0.00020326831145212;-0.00017688852676656;0.00018097973952536;0.00050847418606281;5.394762774813e-05;-6.94003465469e-05;-0.00010402090265416;0.00014636140258517;0.0003879357536789;-9.9366707217996e-06;2.1716412447859e-05;0.0001501874794485;4.2317649786128e-05;-0.00025097109028138;0.00049802829744294;-0.00018459028797224;0.0018159482860938;0.00023674523981754;-0.00053113931789994;-9.8108714155387e-05;-5.9853764469153e-06;-0.0001108099022531;0.00033646228257567;-8.9367407781538e-05;-0.00023023609537631;-3.6629400710808e-05;0.00080207677092403;-0.00022042934142519;-0.00038541140384041;-6.715133349644e-05;0.00039648584788665;-0.0016814969712868;0.00016416853759438;-0.00020632635278162;0.00016004216740839;-0.00058794708456844;5.4545009334106e-05;-5.4872525652172e-05;5.0762344471877e-05;2.1922851374256e-05;-2.2223746782402e-05;1.8128557712771e-05;-6.745767313987e-05;4.9108898565464e-06;-0.00015167726087384;0.0007769109797664;-0.00013030823902227;0.00026769892429002;0.00041768577648327;-0.00093409611145034;5.5870601499919e-05;-0.00023788132239133;-3.3003070711857e-05;-0.0001102127644117;-0.00021875367383473;0.0015189916593954;0.00016363317263313;0.00026370538398623;0.00016939017223194;5.6770288210828e-05;-0.00053300417494029;1.0872782695515e-05;-0.00051984790479764;1.052829065884e-05;0.00019229380995966;0.00020530830079224;-0.00098606524989009;-4.0485676436219e-05;0.00033237668685615;7.5889176514465e-05;-0.00055594858713448;-1.4509360880766e-05;2.1689825189242e-06;4.1194929508492e-05;-0.00012591293489095;-1.0482777724974e-05;-0.0002381690137554;-0.00037141345092095;0.00020392025180627;0.00070881645660847;-0.00087476568296552;0.0001062275186996;0.00013564416440204;-2.030883297266e-05;-0.00031358114210889;-0.00042412406764925;-0.00022708535834681;-7.1583373937756e-05;-0.00018500116129871;0.00033962115412578;0.00012870634964202;0.00024167232913896;-0.00010101046063937;-4.5719254558207e-05;-0.0001922367955558;0.0001172088450403;0.00042705092346296;0.00037472095573321;-6.0464331909316e-05;-0.0001637825043872;0.00011688855738612;0.00049630913417786;-5.1544620873756e-06;2.1515999833355e-05;0.00014432379975915;5.3741154260933e-05;-0.00031341222347692;0.00038497408968396;-0.00017229137301911;0.0017987958854064;0.00024983490584418;-0.00050733110401779;-0.00010945075337077;-3.4582837542985e-05;-0.00010757960262708;0.00031262086122297;-0.00010111855226569;-0.00024837595992722;-6.0450827731984e-05;0.00070026138564572;-0.00033670375705697;-0.00033921154681593;-1.4919377463229e-05;0.00049607985420153;-0.001553179230541;0.00018877025286201;-0.00018461991567165;0.0001618406677153;-0.00049342424608767;5.3628100431524e-05;-1.11929657578e-05;5.3570194722852e-05;-2.6958392481902e-05;-2.3593493096996e-05;2.778086309263e-05;-2.173839675379e-06;3.2045874831965e-05;-0.00052539096213877;8.5074178059585e-05;-2.0285142454668e-05;0.00021822570124641;0.001225357176736;-0.00063430151203647;0.00038341456092894;-7.3134775448125e-05;0.00030845715082251;-6.8172253122611e-06;-0.0019247274613008;0.00032640679273754;-0.00013480005145539;-0.00024611304979771;-0.00035073517938145;0.00048215041169897;-6.7448323534336e-05;0.00036205275682732;0.00013717306137551;-0.00042092907824554;7.2924121923279e-05;0.00086308945901692;-0.00028282310813665;-0.00050011358689517;5.486731606652e-05;0.00070925801992416;-7.4890558607876e-05;-3.2886913686525e-05;1.0330155419069e-05;-0.0001336736313533;8.3980463386979e-05;-0.00084927433636039;0.00014010941958986;-0.00034277929808013;-0.00027479862910695;-0.0003870707587339;0.00046648623538204;0.00032277626451105;5.5903947213665e-05;-0.00045237434096634;2.2167683709995e-05;-0.0010594743071124;-0.00026384767261334;-0.00018277537310496;-0.00031383064924739;0.00043060118332505;0.00058968126541004;9.6089672297239e-05;0.00032086408464238;-0.00026318788877688;2.987998414028e-05;-0.00019692309433594;0.0014238278381526;0.00025393452960998;-0.00033539178548381;-3.0132097890601e-05;0.00082620262401178;4.5585471525555e-05;3.1724099244457e-05;-3.1398431019625e-06;9.7418720542919e-05;0.00015782428090461;1.3260976629681e-05;-0.00034286009031348;0.0016004326753318;-0.00016866531223059;-0.00042312865843996;0.00027453430811875;-0.000134244968649;-0.00010525190009503;0.00018282262317371;-6.4957865106408e-05;-0.00034073516144417;-0.00010927705443464;-0.00014692332479171;0.00043698376975954;-0.00051570235518739;0.00016231485642493;-0.00024954651598819;-0.0011566405883059;0.00064776587532833;-0.00012738879013341;0.00014962712884881;-8.4746883658227e-05;0.00013697016402148;0.00013177847722545;4.4404281652533e-05;-0.00014024776464794;4.5594752009492e-05;-2.8600807127077e-05;3.1095310987439e-05;4.9687978389557e-06;5.0728689529933e-05;-0.00074740563286468;0.00014235584239941;-0.00017717297305353;0.00021547504002228;0.0014121509157121;-0.00069331453414634;0.00046303862472996;-7.0846574089956e-05;0.00033634735154919;-2.6016974175036e-07;-0.0022668547462672;0.0003489492519293;-0.00019410504319239;-0.00033775542397052;-0.00030805659480393;0.00064360944088548;-5.7663615734782e-05;0.00052457937272266;8.1053614849225e-05;-0.00050223211292177;4.1255851101596e-05;0.0011646380880848;-0.00029575225198641;-0.0005952148931101;5.8682562666945e-05;0.00084096565842628;-8.4659084677696e-05;-2.9938068109914e-05;3.5200023376092e-06;-0.00018193623691332;8.7322528997902e-05;-0.00084829959087074;0.00012825697194785;-0.00028074122383259;-0.00041105531272478;-0.00073603284545243;0.00073450250783935;0.00033075973624364;8.5802348621655e-05;-0.00059283885639161;1.3630854482471e-05;-0.00093281717272475;-0.00041316889110021;-0.0001773489639163;-0.00032948976149783;0.00055537384469062;0.00059848016826436;0.00012825999874622;0.00027270999271423;-0.00030114880064502;0.00012494534894358;-0.0002430679887766;0.0014173745876178;0.0003993047575932;-0.00033399558742531;-4.8302692448488e-05;0.00089653150644153;8.3406768681016e-05;3.6214627471054e-05;-5.3083799684828e-06;0.00011399464710848;0.00019184837583452;0.00021246381220408;-0.00039759176434018;0.0020671021193266;-0.00021717224444728;-0.00055925804190338;0.00033343009999953;-0.00011876457574544;-0.00012663079542108;0.00029865678516217;-8.5107058112044e-05;-0.0003936602442991;-0.00012652689474635;-0.00015001473366283;0.00064117956208065;-0.00056616455549374;0.00011419175280025;-0.00034155347384512;-0.001591183245182;0.00074564927490428;-0.00021879274572711;0.00018131789693143;-0.00029509561136365;0.00016951499856077;9.7211355750915e-05;5.742577923229e-05;-0.00012081856402801;5.3442003263626e-05;-1.9871802578564e-05;1.9279121261206e-05;4.2999272409361e-06;3.728418960236e-05;-0.00052488478831947;0.00011819288920378;-0.00018621602794155;0.00011364692181814;0.00091072247596458;-0.00041963579133153;0.00032214174279943;-3.5909593862016e-05;0.00021471736545209;3.9272772482946e-06;-0.0015037979464978;0.00020470078743529;-0.00014017843932379;-0.00024208256218117;-0.00013826391659677;0.00044845551019534;-2.5045701477211e-05;0.00038336237776093;4.2850961108343e-06;-0.00034424499608576;6.4734240368125e-07;0.0008180026197806;-0.00016848456289154;-0.00040800782153383;3.4504399081925e-05;0.00057123648002744;-5.2782514103455e-05;-1.5401772543555e-05;-1.7836674714999e-06;-0.00013816461432725;4.8446785513079e-05;-0.00049716146895662;6.7466178734321e-05;-0.00014176151307765;-0.00032039723009802;-0.00064248900162056;0.00059205613797531;0.0001975508639589;6.9476765929721e-05;-0.00043348295730539;1.8912221548817e-06;-0.00046729570021853;-0.00033224379876629;-9.8522737971507e-05;-0.00021844450384378;0.00039935315726325;0.0003542315971572;0.0001038074697135;0.00015299762890209;-0.00019987078849226;0.00013504974776879;-0.00016926243552007;0.00082751561421901;0.00032062389072962;-0.00019491645798553;-3.9910530176712e-05;0.00056766479974613;7.2977250965778e-05;2.3413820599671e-05;-4.7049857130332e-06;6.7482542362995e-05;0.0001378427259624;0.0002362608211115;-0.000258338812273;0.0015218195039779;-0.00016076053725556;-0.00041826567030512;0.00023242294264492;-4.985875057173e-05;-8.7688807980157e-05;0.00022588690626435;-6.2339327996597e-05;-0.00029665231704712;-8.3518396422733e-05;-8.7735839770176e-05;0.00052320136455819;-0.00034956319723278;4.5384567783913e-05;-0.00027200186741538;-0.0012341464171186;0.00048771180445328;-0.0001762563479133;0.00012341572437435;-0.00027325988048688;0.00011896016803803;2.5172095774906e-05;4.205842196825e-05;-3.1641902751289e-05;3.5699547879631e-05;7.5379248301033e-05;-6.1062455642968e-05;-5.4643998737447e-05;0.0001126745773945;-5.2356117521413e-05;5.7511631894158e-05;0.00035146885784343;-0.00013746740296483;-0.0017396867042407;0.0017607214394957;-0.00012017551489407;9.7134645329788e-05;-1.1019657904399e-05;0.00012389231415;0.00091974023962393;-0.00092587067047134;-5.0433780415915e-05;1.7619080608711e-05;-0.00014257049770094;0.00022451503900811;-0.00019547686679289;-3.0852086638333e-05;3.0088809580775e-05;0.00014110549818724;-0.00018897552217823;-0.0005416251369752;0.00039006979204714;0.0001119088701671;-0.00013333781680558;-0.00027739148936234;0.00024911577929743;2.5011571779032e-05;2.9165363230277e-05;-0.00025984761305153;-0.00018752067990135;7.1474765718449e-05;0.00019045142107643;0.00047326341154985;0.00060848903376609;-0.00049582426436245;-0.00087711302330717;-0.00011207416537218;-0.00014253474364523;-0.00048760717618279;-0.00042135277180932;0.00045842910185456;0.00068830040981993;0.00016813050024211;-0.00012351282930467;-0.00021215240121819;3.0555369448848e-05;-0.0001246986357728;-1.6367874195566e-05;6.9703077315353e-05;0.00055792654165998;0.00048810875159688;-0.00041529961163178;-0.00063953793141991;0.00011881102545885;0.00014096521772444;0.0002217718429165;0.00017488628509454;-2.2659261958324e-05;2.5306587758678e-06;0.00020079157548025;0.00013673292414751;0.0012412341311574;0.0010392913827673;0.00034728040918708;0.00065669830655679;-0.00036883709253743;-0.00060246087377891;0.00012048125063302;6.0275626310613e-05;0.00023737904848531;0.00028389203362167;0.00020959114772268;0.00026463787071407;-6.6554098339111e-06;0.0014388748677447;0.0019633972551674;-0.00056162348482758;-0.00045536388643086;-0.0019052267307416;-0.0019539152272046;-0.00060316571034491;-0.0004237015673425;-0.00046893491526134;-0.00062206556322053;6.1921571159473e-07;-1.3185512216296e-05;-9.4154231192078e-05;-0.00010175813804381;8.0946709203999e-05;-6.4550236857031e-05;-6.5164691477548e-05;0.00011361952783773;-4.9506808863953e-05;9.6924370154738e-05;0.00042352013406344;-8.0816862464417e-05;-0.0018449816852808;0.0018270033178851;-0.00013466073141899;9.7310025012121e-05;-2.6512129807088e-06;0.00013637897791341;0.00099311652593315;-0.00093527231365442;-3.4837739804061e-05;3.794554140768e-05;-0.00021125529019628;0.00022027577506378;-0.00023481952666771;-2.5502939024591e-05;1.2580580005306e-05;0.00016578433860559;-0.000190701946849;-0.00061781250406057;0.00035133498022333;0.00011825486581074;-0.00013794151891489;-0.00029883059323765;0.00025431095855311;2.3177892217063e-05;3.2837757316884e-05;-0.000267119059572;-0.0002012675977312;6.4976848079823e-05;0.00023600428539794;0.00046018505236134;0.00068058510078117;-0.00040902680484578;-0.0010490983258933;-0.00010438271419844;-0.00015621284546796;-0.00050280580762774;-0.00045935332309455;0.00041756776045077;0.00078960828250274;0.00017605458560865;-0.00011816028563771;-0.00020096624211874;4.4455289753387e-05;-0.00014886050485075;-3.148398900521e-05;4.5936692913529e-05;0.00055970513494685;0.00052774645155296;-0.00038575669168495;-0.00072207098128274;0.00011500871187309;0.000157037837198;0.00024300631775986;0.00018267113773618;-2.5273326173192e-05;5.1593742682599e-06;0.00020959111861885;0.00014713261043653;0.0012795006623492;0.0011115943780169;0.00032100811949931;0.00077518360922113;-0.00035646511241794;-0.0006676705670543;0.00012731058814097;6.1367871239781e-05;0.00023214030079544;0.00033146087662317;0.00021103283506818;0.00028104038210586;-1.0197873052675e-05;0.0015095274429768;0.0020398257765919;-0.00058405270101503;-0.0004796635475941;-0.0019606293644756;-0.0020859537180513;-0.00062435609288514;-0.00045838629011996;-0.00046079812454991;-0.00070433475775644;2.8887632197439e-06;-1.9334072931088e-05;-9.1664151113946e-05;-0.00011698484740919;5.5903950851643e-05;-4.4346252252581e-05;-4.7167428419925e-05;7.0905880420469e-05;-5.0078811909771e-05;0.00012148278619861;0.00031501470948569;-4.3913696572417e-06;-0.0012066282797605;0.0011616027913988;-9.1504021838773e-05;6.0073602071498e-05;1.955312291102e-05;8.0848694778979e-05;0.00065215385984629;-0.0005609827931039;-9.5880559456418e-06;3.9197129808599e-05;-0.00018016573449131;0.00015174604777712;-0.00019564274407458;-3.7096858704899e-06;-2.0125564333284e-05;0.00011094993533334;-0.00011580135469558;-0.00042949811904691;0.00017287330410909;7.2490285674576e-05;-8.4709492512047e-05;-0.00020496983779594;0.00016451344708912;1.2298477486183e-05;2.2401327441912e-05;-0.0001632126950426;-0.00012812354543712;6.1525948694907e-05;0.00020263131591491;0.00027730359579436;0.00047568418085575;-0.00019652539049275;-0.00079153367551044;-5.5824362789281e-05;-0.00010542840755079;-0.00032933481270447;-0.00031990450224839;0.00022604531841353;0.00056132371537387;0.00010740906873252;-2.9589540645247e-05;-7.2167262260336e-05;2.8115209715907e-05;-0.00011777492909459;-8.0932775745168e-05;-3.5667788324645e-05;0.00033697212347761;0.00034768943442032;-0.00021255823958199;-0.00050182401901111;7.1262598794419e-05;0.00011297819582978;0.00017148131155409;0.00012528011575341;-1.5639918274246e-05;6.175550424814e-06;0.0001392853591824;0.00010459510667715;0.00081435573520139;0.00073697848711163;0.00019776326371357;0.00059129111468792;-0.00020726613001898;-0.00046171474969015;8.0947924288921e-05;3.6087931221118e-05;0.00016122686793096;0.00026575539959595;0.00013377785217017;0.00019126287952531;-1.9840361346724e-05;0.00095534819411114;0.0012675411999226;-0.00036408010055311;-0.00030598454759456;-0.0012228274717927;-0.0013527577975765;-0.0004113441973459;-0.00032113664201461;-0.00029771981644444;-0.00051985582103953;2.4267405933642e-06;-1.6812331523397e-05;-6.6990956838708e-05;-0.0001008487524814;-1.9517165128491e-05;1.567939943925e-05;-5.5603890359635e-05;5.3968524298398e-06;-0.00013385101919994;0.00066620163852349;-0.00011596013064263;0.00021955686679576;0.00037486921064556;-0.00084302155300975;4.9114154535346e-05;-0.00021673861192539;-2.6908433937933e-05;-0.00011401622759877;-0.00019518013868947;0.0013710085768253;0.00014074235514272;0.00023576074454468;0.0001574174821144;4.825260839425e-05;-0.00046399200800806;7.0766609496786e-06;-0.00045952407526784;6.5178705881408e-06;0.00017974617367145;0.00018208306573797;-0.0008463857229799;-3.6500921851257e-05;0.00030495063401759;6.6656561102718e-05;-0.00050383084453642;-1.1398966307752e-05;2.3805345961136e-07;3.39402249665e-05;-0.00011124079901492;1.0969066579491e-06;-0.00024031697830651;-0.00032595073571429;0.00013253124780022;0.00062602414982393;-0.00076197570888326;9.7160685982089e-05;0.00013016563025303;-1.5857869584579e-05;-0.00028519370243885;-0.00037591252475977;-0.00024796274374239;-7.0579357270617e-05;-0.00019742535369005;0.00031221468816511;0.00013087267871015;0.0002306087553734;-0.00010588792065391;1.1730944606825e-05;-0.00017832173034549;9.7323289082851e-05;0.00037639960646629;0.00038961731479503;-5.4883184930077e-05;-0.00015629538393114;0.00010368946095696;0.00046558931353502;-3.980396741099e-06;1.9323235392221e-05;0.00013240153202787;4.4633983634412e-05;-0.00029039918445051;0.00032668633502908;-0.00015672875451855;0.0016647845041007;0.0002318320912309;-0.00046625506365672;-0.00010119057697011;-2.8476490115281e-05;-9.7076110250782e-05;0.00027147613582201;-9.4028240710031e-05;-0.00025623186957091;-5.7711156841833e-05;0.00063093088101596;-0.00032251627999358;-0.00030864786822349;9.4185412535808e-07;0.00046462169848382;-0.0014167878543958;0.00017365900566801;-0.00016218321979977;0.00014731244300492;-0.00042013466008939;4.8582998715574e-05;-1.2103273547837e-05;4.9288773880107e-05;-1.2024430361635e-05;-3.4135209716624e-05;2.2007241568645e-05;-6.3655665144324e-05;5.1039178288192e-06;-0.00014419072249439;0.00087679800344631;-0.00024009426124394;0.00012075989070581;0.00067210651468486;-0.0013872976414859;0.00010502204531804;-0.00032896685297601;-2.2103202354629e-05;-0.000268451141892;-0.00036281096981838;0.0021692726295441;0.00018466556502972;0.00031750526977703;0.00039995356928557;9.3681745056529e-05;-0.0006391373462975;-9.9108583526686e-05;-0.00060290208784863;-6.9817433541175e-05;0.00030737422639504;0.00034011705429293;-0.0011005166452378;-7.0577538281213e-05;0.00048321986105293;0.00010957097401842;-0.00077339331619442;-2.787989387798e-06;-1.4950534932723e-05;6.5931279095821e-05;-0.00013121885422152;8.5105762991589e-05;-0.00059549382422119;-0.00038527380093001;-9.6783049229998e-05;0.00072340306360275;-0.00077516387682408;0.00012512343528215;0.00025996722979471;6.6419506765669e-06;-0.00039623901830055;-0.00044207042083144;-0.00080794875975698;-0.00016700534615666;-0.00040108372922987;0.0004552633035928;0.00020857941126451;0.00047671070205979;-0.00022906679078005;0.00027003226568922;-0.00028137868503109;4.6193810703699e-05;0.00043550849659368;0.0010094605386257;-6.8767207267229e-05;-0.00030939804855734;0.00011213899415452;0.00082456972450018;1.1722670478775e-06;2.7233027140028e-05;0.00018390514014754;7.5440424552653e-05;-0.00050468579865992;0.00030670600244775;-0.00021226301032584;0.002422914840281;0.00035779742756858;-0.00065162184182554;-0.00016205782594625;-7.4590512667783e-05;-0.00013699349074159;0.0003469335497357;-0.00015372817870229;-0.00042865495197475;-0.00011614125833148;0.00077756564132869;-0.00063032243633643;-0.00038623024011031;8.0844307376537e-05;0.00081175920786336;-0.0018963576294482;0.00028478313470259;-0.00020260085875634;0.00021682100486942;-0.00045280353515409;6.8978311901446e-05;3.8000198401278e-05;7.6549120421987e-05;-6.8352121161297e-05;-3.0030771085876e-05;1.7079702956835e-05;-3.9787541027181e-05;7.2599482336955e-06;-6.9477311626542e-05;0.00060410279547796;-0.00022553994494956;-6.5642503614072e-05;0.00058836187236011;-0.0011597474804148;0.00010361656313762;-0.00026795288431458;-7.3402557063673e-06;-0.00026606718893163;-0.0003242171369493;0.001793428324163;0.00012580274778884;0.00021675914467778;0.00042632420081645;9.3589223979507e-05;-0.00046623143134639;-0.00016079255146906;-0.00039380477392115;-0.00010699909034884;0.00026456580962986;0.00030493817757815;-0.00075752701377496;-6.49714274914e-05;0.00040321369306184;9.2420392320491e-05;-0.00063533335924149;5.8296795941715e-06;-2.004601083172e-05;6.4837549871299e-05;-8.5272506112233e-05;0.00010979028593283;-0.0005961746792309;-0.00024993214174174;-0.00021061176084913;0.00044928153511137;-0.00040442464523949;8.4177423559595e-05;0.00024808355374262;1.9795295884251e-05;-0.00028413746622391;-0.00027882674476132;-0.00091495760716498;-0.00016742225852795;-0.0003579884651117;0.00035023453528993;0.00016041735943872;0.00045361480442807;-0.00021184365323279;0.00031849747756496;-0.00022567996347789;-2.7602613045019e-05;0.00027267681434751;0.0010385537752882;-4.4777436414734e-05;-0.00029876778717153;6.3832339947112e-05;0.00073884334415197;4.6108075366647e-06;2.0096094885957e-05;0.00014208236825652;6.3469226006418e-05;-0.00042866854346357;0.00012078112922609;-0.0001539194927318;0.0018575097201392;0.00028198974905536;-0.00047851452836767;-0.00013466138625517;-7.9128149081953e-05;-0.00010322354501113;0.00022166277631186;-0.00012475565017667;-0.00037709300522693;-0.00010991158342222;0.00053302949527279;-0.00056851742556319;-0.00027367332950234;0.00011571172217373;0.00069501233519986;-0.0013778888387606;0.00023642065934837;-0.0001298308634432;0.0001654746447457;-0.00021900414139964;5.3005009249318e-05;6.89321605023e-05;6.1155806179158e-05;-8.2153150287922e-05;-1.6162852261914e-05;2.0935085558449e-05;-4.2130537622143e-05;5.5369041547237e-06;-0.0001984379341593;-2.0099114408367e-05;0.0002786467957776;0.00020950613543391;0.00096517999190837;-0.00052602897631004;0.00025677107623778;-7.7400567533914e-05;0.00018260547949467;-1.6291942301905e-05;-0.0014854042092338;0.00027660353225656;-2.6986175726051e-05;-9.5333271019626e-05;-0.00046279799425974;0.00023606930335518;-0.00010214339272352;9.8950913525186e-05;0.00026542588602751;-0.00022635463392362;0.00012758257798851;0.00041918002534658;-0.00024983429466374;-0.00033631260157563;4.6240718802437e-05;0.00054939102847129;-5.6906868849183e-05;-3.0703198717674e-05;1.7599475540919e-05;-6.6557433456182e-05;9.5729650638532e-05;-0.00074353505624458;0.00012040076398989;-0.00024609957472421;-0.00012376863742247;5.0878054025816e-05;0.00013172463513911;0.00031944923102856;4.1747421164473e-06;-0.00015995337162167;1.4630244550062e-05;-0.0013566078850999;-7.2692448156886e-05;-0.00019286978931632;-0.00020252606191207;0.00025308105978183;0.00055433117086068;1.4251856555347e-05;0.00018459577404428;-0.00016151039744727;-0.00014894912601449;-0.00011320353223709;0.0013675094814971;8.4019768110011e-05;-0.00038187700556591;3.2874818316486e-06;0.00078371033305302;1.4798001757299e-06;3.1299012334784e-05;-2.9622497095261e-06;9.2158370534889e-05;0.00011905276915058;-0.00036543435999192;-0.0002253806887893;0.00083381694275886;-9.5227209385484e-05;-0.00020099553512409;0.00017120617849287;-0.00021452612418216;-7.0797395892441e-05;-4.5960601710249e-05;-4.0252885810332e-05;-0.00025421945611015;-7.6499476563185e-05;-0.00016382444300689;0.00015852168144193;-0.00038410574779846;0.00025652116164565;-0.000124127487652;-0.00051073695067316;0.0004429992986843;4.1060880903387e-05;8.8580258307047e-05;0.00038376994780265;8.3737293607555e-05;0.00026408818666823;2.7043775844504e-05;-0.00025766310864128;3.8857997424202e-05;-2.6039138901979e-05;3.3330667065457e-05;-2.083782965201e-05;1.3137763744453e-05;-0.00039826353895478;4.4845175580122e-05;0.00020532563212328;0.0002976139949169;0.0015296081546694;-0.00081259739818051;0.00045297606266104;-0.00010112608288182;0.00040945832733996;-2.3196487745736e-05;-0.002350889146328;0.00042016009683721;-0.0001023040531436;-0.0002400076482445;-0.00056216784287244;0.00045170550583862;-0.00010112934251083;0.00030941210570745;0.0002721210476011;-0.00049493805272505;0.00014287007797975;0.00076961470767856;-0.00036739528877661;-0.00059988850262016;7.1099821070675e-05;0.00086546700913459;-8.7965796410572e-05;-4.9644655518932e-05;2.2561480363947e-05;-0.00013405701611191;0.0001125358248828;-0.0011505129514262;0.00020735828729812;-0.00054909934988245;-0.00025761860888451;-0.00018391865887679;0.00039116007974371;0.00046371141797863;4.845440707868e-05;-0.00044977338984609;3.1609924917575e-05;-0.001730106654577;-0.0002245572686661;-0.00026679699658416;-0.00042711518472061;0.00050331122474745;0.00080849643563852;0.00011440504022175;0.0004766606434714;-0.0003420582797844;-9.8058670118917e-05;-0.00022883489145897;0.0020486873108894;0.00022015770082362;-0.00050654064398259;-2.1695706891478e-05;0.0011410166043788;3.0262661312008e-05;4.1795789002208e-05;-1.8234161416331e-06;0.00012201940262457;0.00019216490909457;-0.00026945257559419;-0.00042251078411937;0.0017913520568982;-0.00018595071742311;-0.00045230149407871;0.00032650516368449;-0.00022292751236819;-0.00012745788262691;8.2815611676779e-05;-7.0931673690211e-05;-0.00048667754163034;-0.00013582741667051;-0.00021807083976455;0.00039654027204961;-0.00068606407148764;0.00031404494075105;-0.00025670634931885;-0.0011796065373346;0.00081567111192271;-6.2301412981469e-05;0.00017562747234479;0.00023430942383129;0.00015608033572789;0.00025369960349053;4.9389411287848e-05;-0.00023233349202201;5.8928180806106e-05;-2.5739493139554e-05;3.2020667276811e-05;-1.6865266161403e-07;2.379128272878e-05;-0.00052800320554525;0.00010117985948455;1.6689538824721e-05;0.00026284155319445;0.0015257896156982;-0.00077875307761133;0.00047147445729934;-8.4438543126453e-05;0.00043032044777647;-1.8617978639668e-05;-0.0023635055404156;0.00039459500112571;-0.00014809693675488;-0.00030670699197799;-0.00044009115663357;0.00053628720343113;-6.758752715541e-05;0.00044087626156397;0.00016832744586281;-0.00053953425958753;9.4732800789643e-05;0.00091338733909652;-0.00033713897573762;-0.00062202499248087;6.7096945713274e-05;0.00086535239825025;-8.4355422586668e-05;-4.5170436351327e-05;1.6029660400818e-05;-0.00015704048564658;9.3500057118945e-05;-0.0010605568531901;0.00019250818877481;-0.00053737469715998;-0.00032900174846873;-0.0004401886544656;0.00056392629630864;0.00042101772851311;7.4230891186744e-05;-0.00055372272618115;2.7254636734142e-05;-0.0014145744498819;-0.00032310598180629;-0.00023510633036494;-0.00044540618546307;0.00056767917703837;0.00073470780625939;0.00015700023504905;0.00048602093011141;-0.00036875181831419;2.175927704684e-07;-0.00025328842457384;0.0018708736170083;0.0003087745863013;-0.0004377138975542;-3.8297250284813e-05;0.0010678137186915;5.7744939113036e-05;3.9531671063742e-05;-1.8967448340845e-06;0.00011962906137342;0.00019452394917607;-3.8007256080164e-05;-0.00044415821321309;0.0020652629900724;-0.00021049969654996;-0.00054220989113674;0.00035700461012311;-0.00016688575851731;-0.00013313512317836;0.00019784660253208;-7.9525489127263e-05;-0.00049336464144289;-0.00014321989146993;-0.0001930317375809;0.00051136448746547;-0.00069154426455498;0.00023238641733769;-0.00029578490648419;-0.0014342883368954;0.00084649870404974;-0.00015324279956985;0.00019021931802854;-2.6304533093935e-05;0.0001723204186419;0.00017083130660467;5.4332089348463e-05;-0.00016445381334051;5.9801375755342e-05;-1.7352871509502e-05;1.9230092220823e-05;2.006739805438e-06;2.4769369701971e-05;-0.00040879764128476;8.5931118519511e-05;-7.4904455686919e-05;0.00013803980255034;0.00091583025641739;-0.00044624181464314;0.00030172918923199;-4.4421492930269e-05;0.0002410637534922;-4.9721343202691e-06;-0.0014618565328419;0.00022240943508223;-0.00011202781752218;-0.00020933663472533;-0.00020958254754078;0.0003791969793383;-3.4680302633205e-05;0.00031632129685022;5.939424954704e-05;-0.00033510100911371;3.2527757866774e-05;0.00066756882006302;-0.0001872016582638;-0.00039049421320669;3.7917769077467e-05;0.00054426031420007;-5.1225801144028e-05;-2.2144431568449e-05;4.8328188313462e-06;-0.00011432624160079;5.3305502660805e-05;-0.00058058928698301;9.5467890787404e-05;-0.00024534575641155;-0.00025050740805455;-0.00042997568380088;0.00044904966489412;0.00023027561837807;5.5153646826511e-05;-0.0003789073380176;9.9118833531975e-06;-0.00068859895691276;-0.00025394753902219;-0.00012379359395709;-0.00024784385459498;0.0003670122823678;0.00040707245352678;9.8463904578239e-05;0.00023340636107605;-0.00021290915901773;5.9555532061495e-05;-0.00015969207743183;0.0010014385916293;0.00024373787164222;-0.00023487268481404;-3.015838774445e-05;0.00061345851281658;5.1469989557518e-05;2.3711871108389e-05;-2.7276666969556e-06;7.031094719423e-05;0.00012682733358815;8.963470463641e-05;-0.00026203496963717;0.0013678398681805;-0.00014170541544445;-0.00036802445538342;0.00022275309311226;-7.8543154813815e-05;-8.338141196873e-05;0.00016537263581995;-5.386241900851e-05;-0.00029816571623087;-8.4873026935384e-05;-0.00010456582094776;0.00040339972474612;-0.00038540523382835;9.961875184672e-05;-0.00021992257097736;-0.0010280833812431;0.00049827998736873;-0.0001294524554396;0.00011756370804505;-0.00012665789108723;0.00011001072562067;6.9365923991427e-05;3.6807236028835e-05;-6.9850044383202e-05;3.5759076126851e-05;3.5370958357817e-05;-2.820629197231e-05;-2.4236321678472e-06;5.6091597798513e-05;-0.00016011034313124;5.8684090618044e-05;1.9924693333451e-05;-8.974607771961e-05;-0.00061905878828838;0.00070451118517667;-3.141222987324e-05;4.3385331082391e-05;2.806506199704e-05;1.4697697224619e-05;0.00025426610955037;-0.00038778092130087;-6.5175590862054e-05;-4.7633668145863e-05;9.8258738034929e-07;0.00020706803479698;-8.6585954704788e-05;7.8195058449637e-05;-1.0669956282072e-05;4.2884025788226e-06;-7.8859935456421e-05;-7.960174116306e-05;0.00018610313418321;2.9335998988245e-05;-4.9273006879957e-05;-0.00011604781320784;0.00013161603419576;1.3892792594561e-05;9.0461844592937e-06;-0.00010447628301335;-5.2910538215656e-05;7.8001598012634e-05;5.578005220741e-05;0.00024638764443807;0.00016896944725886;-0.00041168884490617;-0.00019605731358752;-6.0206442867639e-05;-5.2849809435429e-05;-0.00024783538538031;-0.00017665002087597;0.0002683253842406;0.00018951977835968;3.8421621866291e-05;-3.0511024306179e-05;-3.8089903682703e-05;9.8548362075235e-06;-2.6623169105733e-05;-6.6985114244744e-05;1.6082345609902e-05;0.00025533020379953;0.00017019038205035;-0.00021006989118177;-0.00016829208470881;7.6295160397422e-05;6.1574311985169e-05;0.00010040897905128;8.5165098425932e-05;-2.8896636194986e-06;1.7926312239069e-06;0.00010382264008513;5.8829027693719e-05;0.00059079629136249;0.00038957147626206;0.0002871356846299;0.00021117512369528;-0.00020873903122265;-0.00020932726329193;4.5291009882931e-05;2.3085760403774e-05;0.00020893786859233;0.00012644130038098;0.00012582853378262;0.00011856663331855;-2.8628710424528e-05;0.00052706524729729;0.00075318157905713;-0.00022113617160358;-0.00015408072795253;-0.00081268814392388;-0.00068599876249209;-0.0003243206301704;-0.00017962702258956;-0.00032817423925735;-0.00024615656002425;-5.5666264415777e-06;-2.0898580714857e-06;-0.0001039505150402;-5.8146892115474e-05;5.3235416999087e-05;-4.2298346670577e-05;-1.8309341612621e-05;8.2198930613231e-05;-0.00017875806952361;9.2627051344607e-05;9.2988710093778e-05;-7.0265014073811e-05;-0.0010313870152459;0.0011053289053962;-5.7472891057841e-05;6.2866703956388e-05;2.4085142285912e-05;5.1940311095677e-05;0.00048184770275839;-0.00059597019571811;-7.2833645390347e-05;-4.1353287087986e-05;-5.1066519517917e-05;0.00027391532785259;-0.00015546201029792;6.2688370235264e-05;-9.9988722013222e-07;3.4511071135057e-05;-0.00011777901818277;-0.00020056578796357;0.00023660143779125;5.6629698519828e-05;-8.3210317825433e-05;-0.00018814075156115;0.00019440727191977;2.208935256931e-05;1.787949440768e-05;-0.00016836008580867;-9.8559430625755e-05;4.7895711759338e-05;6.5068452386186e-05;0.00034506435622461;0.00030481803696603;-0.00049458886496723;-0.0004318839055486;-9.217303886544e-05;-9.6324183687102e-05;-0.00036335800541565;-0.00028582126833498;0.00036692892899737;0.0003751945332624;6.3348714320455e-05;-0.00013023061910644;-0.00017247819050681;5.4338786867447e-05;-3.3788252039813e-05;1.0834933164006e-05;0.00012924539623782;0.0003991671546828;0.00030473610968329;-0.00029612448997796;-0.00032500605448149;0.0001064094612957;0.00010379958257545;0.00015037890989333;0.00012149848043919;-7.8176135502872e-06;3.9044502955221e-06;0.00014423242828343;8.8657128799241e-05;0.00087148690363392;0.00063103885622695;0.00033103718305938;0.00036246160743758;-0.00029555094079114;-0.00037668048753403;7.550779992016e-05;3.5744058550335e-05;0.00025286662275903;0.00019932228315156;0.00018062113667838;0.00019744128803723;-3.2198622648139e-05;0.00083761772839352;0.0012684202520177;-0.00033730803988874;-0.00025346738402732;-0.0012473897077143;-0.0011369215790182;-0.00046146605745889;-0.00027950215735473;-0.00042422054684721;-0.00040710109169595;-5.1715819608944e-06;-5.2120117288723e-06;-0.00012158590106992;-8.8766020780895e-05;7.6795338827651e-05;-6.0399255744414e-05;-4.9193455197383e-05;0.00011341282515787;-0.00016873885761015;0.00014260812895373;0.00024857293465175;-6.4641772041796e-06;-0.0016082254005596;0.0016311806393787;-9.7719763289206e-05;8.454873750452e-05;1.5418587281602e-05;0.00011486675066408;0.00082017341628671;-0.00085304508684203;-6.5014639403671e-05;-1.5638766853954e-05;-0.00016784320177976;0.00033585913479328;-0.00026198991690762;1.2305797099543e-05;2.7103156753583e-05;9.3060662038624e-05;-0.00016431658877991;-0.00041399759356864;0.00026728550437838;9.4971372163855e-05;-0.00012871585204266;-0.00028386898338795;0.00026700849412009;3.1211886380333e-05;3.1129286071518e-05;-0.0002505513257347;-0.00016464460350107;-6.4484661379538e-06;9.4888266175985e-05;0.00045269425027072;0.00051497423555702;-0.0005093512008898;-0.00083479145541787;-0.0001252112997463;-0.00015872447693255;-0.0005006926949136;-0.00043822801671922;0.00045189875527285;0.00067246297840029;0.00010016151645686;-0.0002610205556266;-0.00036612100666389;0.00012076323037036;-5.6915418099379e-05;0.00012279475049581;0.00028371336520649;0.00057180586736649;0.00049675948685035;-0.00038239121204242;-0.00057379750069231;0.0001345749333268;0.00016391101235058;0.00021977580036037;0.00016536966722924;-1.6223721104325e-05;8.0999734564102e-06;0.00019121904915664;0.00012899220746476;0.0012066997587681;0.00095620501087978;0.00033286382677034;0.00060698215384036;-0.00038314616540447;-0.00062558689387515;0.00011594358511502;4.9734855565475e-05;0.00027553501422517;0.00030682174838148;0.00023829031852074;0.00030332370079122;-3.2729236409068e-05;0.0012557540321723;0.0019545014947653;-0.00048711441922933;-0.00039265427039936;-0.0017922463594005;-0.001756097539328;-0.00061907776398584;-0.00041117414366454;-0.00050197064410895;-0.00064338918309659;-1.7460365597799e-06;-1.1730760888895e-05;-0.00012554027489386;-0.00013053919246886;8.1266691267956e-05;-6.2890627305023e-05;-6.4852560171857e-05;0.00010985411063302;-0.00016035944281612;0.00020957345259376;0.00032992637716234;0.00011420090595493;-0.0016993839526549;0.0016537270275876;-0.00011289474059595;8.1509722804185e-05;2.1138301235624e-05;0.00013696333917323;0.00090170977637172;-0.00083145563257858;-3.6322217056295e-05;1.7151816791738e-05;-0.00026815210003406;0.0003207917616237;-0.00032020205981098;1.9604676708695e-05;-1.0631351869961e-05;0.00012542262265924;-0.0001615048822714;-0.00049975595902652;0.00017647884669714;0.00010121489322046;-0.00013420701725408;-0.00030505598988384;0.00026713425177149;3.0038938348298e-05;3.5714703699341e-05;-0.00025697954697534;-0.00018028011254501;-4.6256653149612e-05;0.00011633672693279;0.00041890837019309;0.00057155644753948;-0.00035939065855928;-0.0010456809541211;-0.00011496250954224;-0.00017752291751094;-0.00050278997514397;-0.00048249476822093;0.0003815283998847;0.00079429405741394;9.9393459095154e-05;-0.0003086736833211;-0.00039800076046959;0.00016355386469513;-6.6526474256534e-05;0.00015398496179841;0.00033109149080701;0.00056595995556563;0.00054782046936452;-0.00033058467670344;-0.00065634027123451;0.00012490793596953;0.00018545385682955;0.00023810767743271;0.00016783269529697;-1.9401641111472e-05;1.2162942766736e-05;0.0001893718726933;0.00013755973486695;0.0012146981898695;0.0010252489009872;0.00026318518212065;0.00074795115506276;-0.00035123733687215;-0.00071468623355031;0.00012480533041526;4.8918660468189e-05;0.00024474901147187;0.0003631868166849;0.00023010543372948;0.00032742126495577;-3.5386259696679e-05;0.0012992111733183;0.0020356201566756;-0.0004899482592009;-0.00041297150892206;-0.0018170533003286;-0.0018766390858218;-0.00062213337514549;-0.00044443231308833;-0.00045895788935013;-0.00074416742427275;6.9077628950254e-07;-1.9690049157361e-05;-0.00010804810881382;-0.00015013389929663;6.5328895288985e-05;-4.9940412282012e-05;-5.9164038248127e-05;7.7111777500249e-05;-0.00015189871191978;0.00026006574626081;0.00029319748864509;0.00022186341811903;-0.0013046166859567;0.0012066636700183;-9.5987728855107e-05;5.8099933085032e-05;3.1679850508226e-05;0.00011194571561646;0.00071174156619236;-0.0005664128693752;-2.0270283584978e-06;4.4577100197785e-05;-0.00028829454095103;0.0002406445419183;-0.00030669308034703;6.5964566601906e-05;-9.3789727543481e-05;0.00011708353849826;-0.00011739551700884;-0.00042077963007614;2.2332673324854e-05;7.5755611760542e-05;-0.00010086961265188;-0.00024616628070362;0.00019997981144115;2.0883560864604e-05;2.9919006919954e-05;-0.00019306210742798;-0.00014333777653519;-5.7889821619028e-05;0.00010811500396812;0.00027434914954938;0.00045407214201987;-0.00014188773639034;-0.00096411845879629;-7.2908209403977e-05;-0.0001466030953452;-0.00038149286410771;-0.00040502817137167;0.00021466496400535;0.00068670563632622;6.4573920099065e-05;-0.00027073844103143;-0.00028218067018315;0.00016528286505491;-5.2033916290384e-05;0.00011296708544251;0.00027539901202545;0.00040632055606693;0.00044572466867976;-0.00018624516087584;-0.00053831306286156;8.6396918050013e-05;0.00015963651821949;0.00019804848125204;0.00013278002734296;-1.5859368431848e-05;1.3541307453124e-05;0.00014146912144497;0.00011290136171738;0.00091567490017042;0.00082934316014871;0.00016149674775079;0.00071808008942753;-0.00022982934024185;-0.00061400985578075;0.00010003698116634;3.5566623409977e-05;0.00017499443492852;0.00034147416590713;0.00016441085608676;0.00026597824762575;-3.6925241147401e-05;0.00098276697099209;0.0015374579234049;-0.00035693269455805;-0.00031730835326016;-0.001358010689728;-0.0014887965517119;-0.00047682574950159;-0.00037168635753915;-0.00032426408142783;-0.00066729664104059;6.4832130419745e-07;-2.4048806153587e-05;-7.4626674177125e-05;-0.00013942092482466;4.1058989154408e-05;-3.1036048312671e-05;-4.1023387893802e-05;4.1759241867112e-05;-0.00012481657904573;0.00023595165112056;0.00018372431804892;0.00024225472589023;-0.00077016348950565;0.00066854251781479;-6.1496291891672e-05;3.1330902857007e-05;2.8803036911995e-05;7.2747221565805e-05;0.00043089489918202;-0.00028493776335381;1.4759260920982e-05;4.6830504288664e-05;-0.0002264873473905;0.000151069383719;-0.0002322268410353;8.3504426584113e-05;-0.00012572662672028;8.0541256465949e-05;-6.5970816649497e-05;-0.00025935561279766;-7.672294304939e-05;4.3181826185901e-05;-5.9466976381373e-05;-0.00015591183910146;0.00011838840873679;1.2412961950758e-05;1.9735578462132e-05;-0.00011514818470459;-8.8680608314462e-05;-6.2913008150645e-05;5.5837994295871e-05;0.00013338675489649;0.00026421219808981;-3.7052263905935e-06;-0.00067490717628971;-3.6448742321227e-05;-9.6599615062587e-05;-0.00022907790844329;-0.00026971576153301;8.1197496911045e-05;0.00045660152682103;2.3757862436469e-05;-0.00021725289116148;-0.00017817095795181;0.00014075415674597;-1.7827560441219e-05;8.9716682850849e-05;0.00022234812786337;0.00023181184951682;0.00028812294476666;-6.6990818595514e-05;-0.00033118753344752;4.7680816351203e-05;0.00010931607539533;0.00012851948849857;8.3213490142953e-05;-9.6506155387033e-06;1.1301086487947e-05;8.1012476584874e-05;7.2032824391499e-05;0.00054168869974092;0.00052640563808382;7.1025111537892e-05;0.00052713102195412;-0.00011518724204507;-0.00041974795749411;6.3424966356251e-05;1.9853605408571e-05;9.8439333669376e-05;0.00024828876485117;9.3005350208841e-05;0.0001745857152855;-2.998394666065e-05;0.00057271611876786;0.00092047161888331;-0.00019715486268979;-0.00018840268603526;-0.00079442607238889;-0.00092291715554893;-0.00028830376686528;-0.00024425721494481;-0.00017991549975704;-0.00046919926535338;1.3348888661113e-09;-2.0199633581797e-05;-4.0121711208485e-05;-0.00010191604815191;-3.4422853786964e-05;1.5816123777768e-05;-1.2644259186345e-05;1.1421832823544e-05;-5.8388734032633e-05;0.00055396655807272;-0.00028646626742557;-0.00020828712149523;0.00073663354851305;-0.0014543496072292;0.00012428881018423;-0.0003181840875186;1.1308301509416e-05;-0.00040412013186142;-0.0003996072919108;0.0021851910278201;0.00011420328519307;0.00027448221226223;0.0005901011172682;8.9043736807071e-05;-0.0004736926057376;-0.00023180290008895;-0.00046879015280865;-0.00016250522457995;0.00033881663694046;0.00037147279363126;-0.0006596352905035;-8.142324804794e-05;0.00049485027557239;0.00010312785889255;-0.00076040421845391;1.455125038774e-05;-3.2517222280148e-05;6.4052524976432e-05;-7.6801610703114e-05;0.00018111565441359;-0.00077574839815497;-0.0002717579191085;-0.00049910595407709;0.00048377990606241;-0.00034828792558983;0.00011082069249824;0.00033852478372864;3.1474275601795e-05;-0.00031127646798268;-0.00031166878761724;-0.0013582017272711;-0.00023296930885408;-0.00055615458404645;0.00047847229870968;0.00026930152671412;0.00057656300486997;-0.0003395477833692;0.00059300038265064;-0.00030080252327025;-0.00011233541590627;0.00030217409948818;0.0014916682848707;-5.4867992730578e-05;-0.00041061840602197;7.0449197664857e-05;0.00098671414889395;1.2117912774556e-05;2.2222200641409e-05;0.00016614131163806;7.3352770414203e-05;-0.00058698613429442;4.6155499148881e-05;-0.00018459370767232;0.0024193583521992;0.0003746786096599;-0.00060378754278645;-0.00017693583504297;-9.6808711532503e-05;-0.00012697637430392;0.00021673461014871;-0.00016940265777521;-0.0005928270984441;-0.00015132577391341;0.00058142619673163;-0.00082790828309953;-0.00030077685369179;0.00019789919315372;0.00096416793530807;-0.0016728503396735;0.00031622481765226;-0.00014737561286893;0.00020837922056671;-0.00011956781963818;6.4199812186416e-05;0.00010295739775756;8.210918167606e-05;-9.000206773635e-05;-3.3370703022229e-05;1.4722113519383e-05;1.9837140996515e-07;1.8245737010147e-05;-1.1234047633479e-05;0.0003959852620028;-0.00028269621543586;-0.00034662961843424;0.00070121302269399;-0.0013513934100047;0.00012722797691822;-0.00029974366771057;1.7353604562231e-05;-0.00040564290247858;-0.00038497650530189;0.0020358632318676;7.8574812505394e-05;0.00021377755911089;0.00062577723292634;9.5789648185018e-05;-0.00038071890594438;-0.0002828732249327;-0.00033433330827393;-0.00018874929810409;0.00032322967308573;0.00035893201129511;-0.00047469878336415;-7.9382982221432e-05;0.00046964263310656;9.7210126114078e-05;-0.00071729946648702;1.8501432350604e-05;-3.4520926419646e-05;6.6108921600971e-05;-5.7856716011884e-05;0.00018971682584379;-0.0007716222316958;-0.0002141040895367;-0.00053065834799781;0.00035637448308989;-0.00017137781833299;9.0390756668057e-05;0.00034098481410183;3.5727749491343e-05;-0.00024777068756521;-0.00023536533990409;-0.0014457073993981;-0.00023376803437714;-0.00052542990306392;0.00043100275797769;0.00024045335885603;0.00056915020104498;-0.00032600513077341;0.00058918062131852;-0.000273027602816;-0.00015530092059635;0.00022939487826079;0.0015142621705309;-4.2530948121566e-05;-0.00042054036748596;4.7703950258438e-05;0.0009666335536167;1.3508300071408e-05;1.8462365915184e-05;0.00015431942301802;6.3119419792201e-05;-0.00054980424465612;-6.6206746851094e-05;-0.00015781007823534;0.0021628099493682;0.00033454917138442;-0.00051448738668114;-0.00016773077368271;-9.8887583590113e-05;-0.00011150682257721;0.00013271265197545;-0.00015209974662866;-0.00060097593814135;-0.00014958807150833;0.00048896216321737;-0.00079823128180578;-0.00026732779224403;0.00022697696113028;0.00091248692478985;-0.0014573958469555;0.00029603770235553;-0.0001018738548737;0.00018143774650525;4.0505350625608e-05;5.8166289818473e-05;0.00012173459981568;7.3760478699114e-05;-8.5623243649025e-05;-1.7261612811126e-05;1.9719976990018e-05;-7.1929811383598e-05;-4.2937423131661e-05;0.00023017363855615;-8.4251165390015e-05;0.00057145924074575;0.00022296453244053;0.00094367837300524;-0.00052644649986178;0.00025388243375346;-7.8364944783971e-05;0.00020963637507521;-3.3180200261995e-05;-0.001395171857439;0.00027454350492917;7.4090836278629e-05;-2.3782844436937e-05;-0.00058470107614994;-5.2556725904651e-07;-0.00010064457455883;-7.8911318269093e-05;0.00036090964567848;-0.00020545886945911;0.00017836189363152;-6.6422886447981e-05;-0.00024891982320696;-0.00032479190849699;4.4492015149444e-05;0.00054674118291587;-4.6951401600381e-05;-3.1747222237755e-05;2.2660515242023e-05;-4.6415942051681e-05;8.0014055129141e-05;-0.0006934842094779;0.00014216524141375;-0.00037678884109482;-7.7867232903372e-05;0.00027350836899132;8.8924607553054e-06;0.00035520031815395;-5.3637307928511e-07;-1.5391369743156e-05;6.4469631979591e-06;-0.0017110658809543;-1.1808031558758e-05;-0.00020012140157633;-0.00024224989465438;0.00027225783560425;0.00053376908181235;4.8157395212911e-05;0.00024071392545011;-0.00020002834207844;-0.00026302025071345;-0.00010347445640946;0.0015331805916503;3.6888184695272e-05;-0.00046357137034647;1.2896463886136e-05;0.00088001688709483;-9.1974607130396e-06;3.1442948966287e-05;4.3510107161637e-07;6.4843261498027e-05;0.00012339524982963;-0.00065888970857486;-0.00023892667377368;0.00076845072908327;-8.1639460404404e-05;-0.00013295862299856;0.00015797805099282;-0.00023844171664678;-7.716422987869e-05;-0.00026730584795587;-3.3399352105334e-05;-0.00046980945626274;-7.0207832322922e-05;-0.00018591736443341;7.7210235758685e-05;-0.00045685065560974;0.0003758750972338;-0.00011385270772735;-0.00039848088636063;0.00050062092486769;0.00015238141349982;9.3709226348437e-05;0.0008531806524843;6.7367291194387e-05;0.00032715982524678;2.511127240723e-05;-0.00023427947598975;3.8962713006185e-05;-2.1270585421007e-05;2.7002051865566e-05;-5.5036198318703e-05;-3.2898187782848e-05;4.0659153455636e-05;-3.2003554224502e-05;0.00048559333663434;0.00028261277475394;0.0013294359669089;-0.00072092044865713;0.0003742610279005;-9.3654874945059e-05;0.0003568428219296;-3.8252663216554e-05;-0.0019774646498263;0.00037138813058846;1.2651108590944e-05;-0.00013085266982671;-0.00064105400815606;0.00017123500583693;-0.00010063735680887;9.4543393061031e-05;0.00035302361357026;-0.00037495675496757;0.00018404462025501;0.00021429998741951;-0.00032844083034433;-0.00049238989595324;6.1546699726023e-05;0.00074765691533685;-6.6963883000426e-05;-4.6617322368547e-05;2.7158032025909e-05;-8.6407584603876e-05;9.4539514975622e-05;-0.00099071080330759;0.00020402853260748;-0.00059253460494801;-0.00016018381575122;0.00012331930338405;0.00017515450599603;0.00045409658923745;2.7217331080465e-05;-0.00021923225722276;2.0256524294382e-05;-0.0019600826781243;-0.00010885737719946;-0.00025720047415234;-0.00039968494093046;0.00043496972648427;0.00071965798269957;0.00011432674364187;0.00045375135960057;-0.00032271145028062;-0.00023302361660171;-0.00018178303434979;0.0020102586131543;0.0001209266774822;-0.00054187950445339;-3.3812907531683e-06;0.0011162528535351;8.3766644820571e-06;3.9782520616427e-05;1.094204662877e-06;9.299254452344e-05;0.00016741520084906;-0.00057765416568145;-0.00037220411468297;0.0013982697855681;-0.00014130955969449;-0.00030925468308851;0.00026768198586069;-0.0002509978658054;-0.00011228058428969;-0.00014975502563175;-5.3941566875437e-05;-0.0005845480482094;-0.00011482831905596;-0.00022572254238185;0.00021253513114061;-0.00066179252462462;0.00040807513869368;-0.00018433594959788;-0.00081256596604362;0.00074696226511151;7.132191240089e-05;0.0001493500021752;0.0007008679676801;0.00011907792941201;0.00032355650910176;3.8916172343306e-05;-0.00024104602925945;5.4337633628165e-05;-1.7847705748864e-05;2.4217228201451e-05;-1.8629207261256e-05;-1.5722327589174e-05;-0.00011565214663278;2.970630339405e-05;0.00024284330720548;0.00023455600603484;0.0012273801257834;-0.00064646929968148;0.00036397657822818;-7.2859409556258e-05;0.00038835970917717;-3.1230585591402e-05;-0.0018336599459872;0.00032807741081342;-4.63260403194e-05;-0.00018873740918934;-0.00046393173397519;0.00025921786436811;-5.9407506341813e-05;0.00022253877250478;0.00021724133694079;-0.00041793784475885;0.00012314842024352;0.00036268850089982;-0.00028258099337108;-0.00048702440108173;5.553934170166e-05;0.00067915703402832;-6.0631366068264e-05;-4.4021726353094e-05;2.1572866899078e-05;-9.6686853794381e-05;6.9632718805224e-05;-0.00090066756820306;0.00019158273062203;-0.00060705986106768;-0.00018942290626001;-8.0465637438465e-05;0.00028736889362335;0.00039033935172483;4.7977609938243e-05;-0.00033818144584075;2.4445798771922e-05;-0.0015045567415655;-0.00017277714505326;-0.00021633240976371;-0.00041827536188066;0.00045275365118869;0.00062840635655448;0.00014927447773516;0.00050539581570774;-0.00033616670407355;-0.00012330641038716;-0.0001955805637408;0.0017540047410876;0.00016822043107823;-0.00042935379315168;-1.9334547687322e-05;0.00095559662440792;2.561767178122e-05;3.2493106118636e-05;2.0159950508969e-06;8.4434017480817e-05;0.0001511439186288;-0.00029702595202252;-0.00037204960244708;0.0015485071344301;-0.00014999642735347;-0.00037603022065014;0.00028117513284087;-0.00016670583863743;-0.00010776947601698;2.6842199076782e-06;-5.4479274695041e-05;-0.00052286358550191;-0.00011697689478751;-0.00018279558571521;0.00027581339236349;-0.00063422718085349;0.00029637740226462;-0.00019163379329257;-0.00095034635160118;0.00072932103648782;-3.4170367143815e-05;0.00015218621410895;0.00033007570891641;0.00012613048602361;0.00020072216284461;3.8656955439365e-05;-0.00014451179595198;4.9845490138978e-05;3.3433214412071e-05;-2.6332108973293e-05;7.6300636919768e-07;5.1153110689484e-05;-0.00016189242887776;5.7164830650436e-05;1.7397596820956e-05;-9.100665920414e-05;-0.00054612726671621;0.00063115981174633;-2.7524278266355e-05;3.8728754589101e-05;3.6635938158724e-05;3.2497387110197e-06;0.00021417799871415;-0.00034577195765451;-6.393896182999e-05;-5.0565398851177e-05;2.4293083100702e-08;0.00020234560361132;-8.1231795775238e-05;7.9120465670712e-05;-3.9562819438288e-06;-4.1641596908448e-06;-6.7581400799099e-05;-6.4194107835647e-05;0.00017222033056896;2.364194187976e-05;-4.171636828687e-05;-0.00010845298675122;0.00012323950068094;1.1942516721319e-05;7.6495207395055e-06;-8.8065491581801e-05;-4.0820694266586e-05;9.3563598056789e-05;6.6276574216317e-05;0.00022909471590538;0.00015075851115398;-0.0003888271166943;-0.00016977768973447;-5.3034429583931e-05;-4.6452321839752e-05;-0.0002259437169414;-0.00015978084411472;0.00024390380713157;0.00016440483159386;2.9313021514099e-05;8.1515509009478e-06;-1.85378291917e-06;-7.6558364980883e-07;-3.2012871088227e-05;-0.00010272720828652;-2.3208876882563e-05;0.00022162761888467;0.00014432339230552;-0.00019115426403005;-0.00014627043856308;7.2289265517611e-05;5.728936594096e-05;9.2002432211302e-05;7.8104611020535e-05;-1.6553969999222e-06;2.2045030618756e-06;9.8598080512602e-05;5.4516873206012e-05;0.00053720868891105;0.00034193537430838;0.00027287760167383;0.00019125218386762;-0.00018778827507049;-0.00018155219731852;3.9302078221226e-05;1.9833745682263e-05;0.00020907567522954;0.00012291668099351;0.00011988388723694;0.00010750490037026;-3.250419467804e-05;0.00045432723709382;0.0006437866250053;-0.00019513837469276;-0.00013010919792578;-0.00071247050072998;-0.00058834668016061;-0.00030494105885737;-0.00016498319746461;-0.00031442096224055;-0.00022649277525488;-5.6654157560843e-06;-2.3022055302135e-06;-0.00010817144357134;-5.8682249800768e-05;4.7142581024673e-05;-3.6859393730992e-05;-1.1310477020743e-05;6.8786888732575e-05;-0.00017842858505901;8.9290981122758e-05;8.5829677118454e-05;-6.8371940869838e-05;-0.00083407358033583;0.00090342294424772;-4.459897900233e-05;4.984243423678e-05;4.388883462525e-05;2.4927794584073e-05;0.00037195044569671;-0.00047945042024367;-6.7515029513743e-05;-4.8682046326576e-05;-5.3701238357462e-05;0.00026046356651932;-0.00014353603182826;5.4493782954523e-05;2.2955849999562e-05;1.1033939699701e-05;-8.7715510744601e-05;-0.00015465682372451;0.00019237452943344;4.0016639104579e-05;-6.36257318547e-05;-0.00016368624346796;0.00016979110660031;1.7523252608953e-05;1.3984996257932e-05;-0.00012565676297527;-6.6669097577687e-05;8.2658065366559e-05;8.5218183812685e-05;0.00030142013565637;0.0002498424728401;-0.00043261627433822;-0.00035670757642947;-7.3568655352574e-05;-7.9267847468145e-05;-0.00030411247280426;-0.00024054622917902;0.00030372632318176;0.00030598833109252;3.8153782952577e-05;-3.59892983397e-05;-9.2884787591174e-05;2.9061306122458e-05;-4.4550961320056e-05;-7.2093273047358e-05;4.2937881516991e-05;0.00031184664112516;0.0002366140979575;-0.00024818058591336;-0.0002620677696541;9.4000708486419e-05;9.2131478595547e-05;0.00012767880980391;0.00010212511551799;-4.3376994653954e-06;4.9454156396678e-06;0.00012713762407657;7.7528813562822e-05;0.00071847211802378;0.0004970568115823;0.00028901299810968;0.00030211187549867;-0.00023912964388728;-0.00030471605714411;5.8688390708994e-05;2.5494908186374e-05;0.00024547750945203;0.00018713205645327;0.00016077024338301;0.00016979897918645;-4.1066774429055e-05;0.00064314174233004;0.00098185939714313;-0.0002642689505592;-0.00019245703879278;-0.00098056974820793;-0.00086559384362772;-0.00040188009734266;-0.00023628535564058;-0.00037961627822369;-0.00035178460530005;-5.0580929382704e-06;-4.7715720938868e-06;-0.00012682582018897;-9.0267283667345e-05;6.4061707234941e-05;-4.902121872874e-05;-4.0746352169663e-05;9.2601650976576e-05;-0.00018762073887046;0.00015644855739083;0.00017948794993572;6.5849970269483e-05;-0.0012299231020734;0.0012367743765935;-5.9809743106598e-05;5.4348725825548e-05;3.8502224924741e-05;8.5003463027533e-05;0.00060872366884723;-0.00063136196695268;-5.7941353588831e-05;-4.0612325392431e-05;-0.00017278028826695;0.00035677404957823;-0.00027264267555438;-3.7168221751926e-05;0.00010630751057761;3.3533353416715e-05;-0.00010390634270152;-0.00027336704079062;0.00012510170927271;6.183005461935e-05;-9.809803304961e-05;-0.0002372833841946;0.00022693380014971;2.9258040740388e-05;2.6861973310588e-05;-0.00018188109970652;-0.00010693329386413;-4.1193568904418e-05;3.8819282053737e-05;0.0003578650939744;0.00037412456003949;-0.00038836768362671;-0.00067783164558932;-0.00010760166333057;-0.00014219353033695;-0.0004019275365863;-0.00036425393773243;0.00034928880631924;0.00055400363635272;2.1683386876248e-05;-0.00024272306472994;-0.00042272341670468;0.00014684369671158;-1.8259781427332e-05;0.00016606434655841;0.0003448968345765;0.00045291718561202;0.00040064955828711;-0.00029024534160271;-0.00044189189793542;0.00011777592590079;0.00015358602104243;0.00017261829634663;0.00012077080464223;-7.4905033216055e-06;1.1736533451767e-05;0.0001453819568269;0.00010142732935492;0.00090185471344739;0.00067536835558712;0.00021340420062188;0.00043253845069557;-0.00030415804940276;-0.00052363111171871;8.4841238276567e-05;2.5884599381243e-05;0.00024037669936661;0.0002701730991248;0.00021168247621972;0.00028070103144273;-4.883784276899e-05;0.0008502138662152;0.0015467302873731;-0.00032653787638992;-0.00026823440566659;-0.0012947126524523;-0.0012043238384649;-0.00049474067054689;-0.00031435946584679;-0.00040458241710439;-0.00053328886860982;-1.2608454653673e-06;-6.6289303504163e-06;-0.00012326221622061;-0.00013626513828058;6.9567540776916e-05;-5.3002273489255e-05;-5.5997967137955e-05;9.0396373707335e-05;-0.00019114853057545;0.00024183721689042;0.00024674439919181;0.00019421870820224;-0.0013327727792785;0.0012707645073533;-7.3484945460223e-05;5.4242016631179e-05;4.6475903218379e-05;0.00010631750046741;0.00069404946407303;-0.00061704928521067;-3.0652256100439e-05;-8.5813662735745e-06;-0.00026476394850761;0.00035414026933722;-0.00034120664349757;-2.2618773073191e-05;5.2568502724171e-05;6.1230581195559e-05;-0.00010536525951466;-0.00035050237784162;3.1655621569371e-05;6.7395762016531e-05;-0.00010628071322571;-0.00026326248189434;0.0002350851718802;2.9583485229523e-05;3.1606752600055e-05;-0.0001911242143251;-0.00012257409980521;-8.5625651990995e-05;5.1448932936182e-05;0.0003315343928989;0.00042409548768774;-0.00025972424191423;-0.00088481139391661;-0.00010200148244621;-0.00016360745939892;-0.0004146691353526;-0.00041467766277492;0.00029435812029988;0.00067416753154248;1.5790481484146e-05;-0.0003079961752519;-0.00046638961066492;0.00019689192413352;-1.7890974049806e-05;0.00020960111578461;0.0004114048788324;0.00045976674300618;0.00045640510506928;-0.00024724853574298;-0.00051857094513252;0.00011290036491118;0.00017945011495613;0.0001924155803863;0.00012549058010336;-9.9401677289279e-06;1.5786499716341e-05;0.00014384428504854;0.00011328463006066;0.00093068758724257;0.00075840967474505;0.00015835091471672;0.00057217990979552;-0.00028254798962735;-0.00062064570374787;9.6399278845638e-05;2.602955828479e-05;0.00021838478278369;0.0003356232191436;0.00020789676636923;0.00031599774956703;-5.4598018323304e-05;0.00089750526240095;0.0016561936354265;-0.00032755930442363;-0.00029226197511889;-0.0013493417063728;-0.0013312269002199;-0.00050982023822144;-0.00035791954724118;-0.00037681878893636;-0.00064638152252883;-8.5191243215377e-07;-1.4222529898689e-05;-0.00010783001926029;-0.00016460752522107;6.0065671277698e-05;-4.6302830014611e-05;-5.3474686865229e-05;6.5410953538958e-05;-0.00017749117978383;0.00030511536169797;0.00024473326629959;0.00027640370535664;-0.0011077214730904;0.00099300697911531;-7.4646857683547e-05;4.6344768634299e-05;5.3847394156037e-05;8.929664909374e-05;0.00060140033019707;-0.00044343390618451;3.9008514249872e-06;3.6975183320465e-05;-0.00028247619047761;0.00026235447148792;-0.00033165246713907;5.557883559959e-05;-9.0089517470915e-05;7.8328477684408e-05;-8.8672604761086e-05;-0.00034151237923652;-6.4419604314025e-05;5.5597251048312e-05;-8.6850865045562e-05;-0.00022974697640166;0.00019013145356439;2.072895404126e-05;2.761383439065e-05;-0.00015434254601132;-0.00010947517148452;-7.2375492891297e-05;8.0805941252038e-05;0.00022612589236815;0.00037524005165324;-8.9817498519551e-05;-0.00088964647147804;-6.6024687839672e-05;-0.00014058595115785;-0.00033881358103827;-0.00037236738717183;0.00016841590695549;0.00062167050782591;1.4244717931433e-05;-0.00026344862999395;-0.00029713005642407;0.00018287738203071;-2.3667760615353e-05;0.00012640519707929;0.00030108736245893;0.00034721978590824;0.00039461147389375;-0.00013886789383832;-0.00046107152593322;8.273027924588e-05;0.00016132368182298;0.00017494463827461;0.00011158907727804;-9.9205981314299e-06;1.5561023246846e-05;0.00011656556307571;0.00010496281902306;0.00077194586629048;0.00070260639768094;0.00011589244968491;0.00063716754084453;-0.00019222372793593;-0.00056770717492327;8.6741762061138e-05;2.4308408683282e-05;0.00017012507305481;0.00034606689587235;0.00015354936476797;0.00027044417220168;-5.2737526857527e-05;0.00075622997246683;0.0013236426748335;-0.00026095227804035;-0.00025313277728856;-0.0011101682903245;-0.0011921252589673;-0.0004251676145941;-0.00034110873821191;-0.00029079779051244;-0.00063574354862794;-2.3829909423512e-06;-2.1754291083198e-05;-7.7527052781079e-05;-0.00016236025840044;4.2094474338228e-05;-3.2852611184353e-05;-4.0403185266769e-05;3.8876569306012e-05;-0.00013849166862201;0.00027798948576674;0.00018444286251906;0.00026133179198951;-0.00074107118416578;0.00062348908977583;-5.6778470025165e-05;3.089018719038e-05;4.68516809633e-05;5.9704128943849e-05;0.00041385099757463;-0.00024752342142165;2.0171009964542e-05;5.131499710842e-05;-0.00022761718719266;0.00016574314213358;-0.00026064546545967;8.0392455856781e-05;-0.0001412658020854;6.6454034822527e-05;-5.9455349401105e-05;-0.00025221024407074;-0.00010756108531496;3.5845179809257e-05;-5.6326589401579e-05;-0.00016138004139066;0.000124140191474;1.2030883226544e-05;1.9333174350322e-05;-0.0001004015939543;-7.6815980719402e-05;-4.8791225708555e-05;7.4761854193639e-05;0.00012339334352873;0.00026086732395925;1.3312905139173e-05;-0.00069338054163381;-3.3327421988361e-05;-9.7536532848608e-05;-0.0002269005344715;-0.00027089146897197;6.7939654400107e-05;0.00045362001401372;5.6619655879331e-06;-0.00018377888773102;-0.00015004018496256;0.00013842062617186;-1.8484077372705e-05;5.6034863519017e-05;0.00018594336870592;0.00021267074043863;0.00027497133123688;-5.280778350425e-05;-0.00032292885589413;4.9867103371071e-05;0.00011696042929543;0.00012816315575037;8.2132333773188e-05;-7.0771106948087e-06;1.2362685083644e-05;7.7197961218189e-05;7.8265293268487e-05;0.0005153373349458;0.00051454728236422;6.9476336648222e-05;0.00053387647494674;-0.00010383842163719;-0.00041878802585416;6.1073929828126e-05;1.6807945939945e-05;0.00011072441702709;0.00027812973712571;9.2740534455515e-05;0.00018891498621088;-4.2006071453216e-05;0.00051098485710099;0.00085674243746325;-0.00016674348444212;-0.00017577590188012;-0.00073314533801749;-0.00084869272541255;-0.00028771362849511;-0.00025736590032466;-0.00018498659483157;-0.00049346621381119;-2.3595910079166e-06;-2.0375697204145e-05;-4.6913897676859e-05;-0.00012793358473573;-2.8230346288183e-05;8.2004398791469e-06;5.2657491323771e-05;3.9078062400222e-05;5.1966799219372e-05;5.9184778365307e-05;-0.00028083065990359;-0.00060219230363145;0.00066478474764153;-0.0012780126417056;0.00012049261567881;-0.00026887460262515;4.3610722059384e-05;-0.00045387665159069;-0.00035913600004278;0.0018682593945414;-2.1162472876313e-06;0.00018355061183684;0.00072497711516917;7.1143796958495e-05;-0.00019565086404327;-0.00035647171898745;-0.00022776566038374;-0.00023682504252065;0.00029411129071377;0.00033338740468025;2.0642926301662e-07;-7.5714306149166e-05;0.00043443945469335;7.6512173109222e-05;-0.00066086632432416;2.5477716917521e-05;-3.855724571622e-05;4.5623350160895e-05;-1.5870176866883e-05;0.00022256861848291;-0.00068827933864668;-0.00015891558723524;-0.00073788035660982;0.00022598353098147;5.9729820350185e-05;8.7383152276743e-05;0.00036189044476487;3.2146152079804e-05;-0.00011721860209946;-0.00016823956684675;-0.001713968697004;-0.00024653930449858;-0.00058070587692782;0.00046524088247679;0.00029529788298532;0.00052044593030587;-0.00039131098310463;0.00070037937257439;-0.00026946637080982;-0.00027424487052485;0.00017231820675079;0.001640091300942;-3.3243817597395e-05;-0.00046938000014052;3.2904299587244e-05;0.0010163401020691;2.1852871213923e-05;1.1670085768856e-05;0.00013028233661316;4.7747205826454e-05;-0.00057526584714651;-0.00024063161981758;-0.00013006830704398;0.002098796190694;0.00032739446032792;-0.00045525701716542;-0.00017036631470546;-9.6227377071045e-05;-0.00010007785749622;-1.9587687347666e-05;-0.00015229711425491;-0.00076463574077934;-0.00015711001469754;0.00034554558806121;-0.00089893018594012;-0.00020137043611612;0.00028988835401833;0.00097521260613576;-0.0012833869550377;0.00030521280132234;-5.6721270084381e-05;0.00016192311886698;0.00036874564830214;5.1889815949835e-05;0.00016268131730612;7.5229021604173e-05;-7.2137663664762e-05;-2.9180995625211e-05;8.2349561125739e-06;8.3330109191593e-05;6.3156010583043e-05;0.00012529749074019;-0.00018995703430846;-0.00030336421332322;-0.00088849314488471;0.00068365543847904;-0.0012789551401511;0.00013448929530568;-0.00027734725154005;5.643573240377e-05;-0.00049232505261898;-0.00037339245318435;0.0018809819594026;-6.5832449763548e-05;0.00012019036512356;0.00086360471323133;8.6154970631469e-05;-6.8231041950639e-05;-0.00047168199671432;-5.8986519434256e-05;-0.00029961470863782;0.00029346271185204;0.00034844817128032;0.00029501982498914;-7.8951597970445e-05;0.00044853537110612;7.5525393185671e-05;-0.0006902088643983;3.2083542464534e-05;-4.2896976083284e-05;4.9141170165967e-05;5.8358400565339e-06;0.00024656593450345;-0.00071436195867136;-0.00011794127931353;-0.00082908238982782;0.00010856081644306;0.00027113375836052;7.4137868068647e-05;0.00040514572174288;3.3920117857633e-05;-1.9969167624367e-05;-0.00010269418999087;-0.0020394520834088;-0.00027027039323002;-0.00059908902039751;0.00046506311628036;0.00029909957083873;0.00054774881573394;-0.00041224565939046;0.00073972268728539;-0.00026178060215898;-0.00037065346259624;0.00011713511048583;0.0018227734835818;-2.1652096620528e-05;-0.00054611713858321;1.3327130545804e-05;0.0011168117634952;2.5721521524247e-05;8.3109543993487e-06;0.0001363715127809;3.2358351745643e-05;-0.00059006887022406;-0.00043876239215024;-0.00011283611820545;0.0020320520270616;0.00030978894210421;-0.00038780685281381;-0.000181056704605;-0.00011020322563127;-9.3830494733993e-05;-0.00016599748050794;-0.0001440003834432;-0.00090857956092805;-0.00017193934763782;0.00029265019111335;-0.00096111203311011;-0.0002014146593865;0.00037190134753473;0.001022313372232;-0.0011958040995523;0.00031676463549957;1.0536832633079e-05;0.00014390003343578;0.00068692397326231;5.1770693971775e-05;0.00021243479568511;7.3232957220171e-05;-6.3620012952015e-05;-1.5907808119664e-05;3.1095498798095e-06;9.0546920546331e-05;7.1373520768248e-05;0.0001555974886287;-0.00041570799658075;-0.000197613844648;-0.0008446112042293;0.00040798832196742;-0.00073588796658441;8.9092514826916e-05;-0.0001570350577822;5.1010440074606e-05;-0.00031018193112686;-0.00022418037406169;0.0010761504527181;-0.0001227375905728;2.788446181512e-06;0.00066056428477168;6.2417566368822e-05;0.00012405336019583;-0.00040127657121047;0.00014365323295351;-0.0002452778571751;0.00014278823800851;0.00021124871273059;0.00055021099979058;-4.7290017391788e-05;0.00025577493943274;3.7689438613597e-05;-0.00041835018782876;2.5824305339484e-05;-2.8351752916933e-05;2.9361206543399e-05;3.5729022783926e-05;0.00016380386659876;-0.00040857039857656;-2.4828181267367e-05;-0.00058047298807651;-6.615564780077e-05;0.0003968846576754;2.9150496629882e-05;0.00027754617622122;1.6422509361291e-05;0.0001289793435717;1.0648320312612e-05;-0.0015737814828753;-0.00018466867913958;-0.00036841191467829;0.0002741627395153;0.00018848519539461;0.0003302491386421;-0.0002644460182637;0.0004649261245504;-0.00014077694504522;-0.0003391494974494;1.2505949598562e-05;0.0012477298732847;1.1465124316601e-06;-0.00040454603731632;-1.108686774387e-05;0.00076169095700607;1.9915212760679e-05;1.4596830624214e-06;8.1034340837505e-05;2.9047487259959e-06;-0.00035996260703541;-0.00049338320968673;-4.4744156184606e-05;0.0010951614240184;0.00016117574705277;-0.00014626455958933;-0.0001159915336757;-8.6259038653225e-05;-4.902771252091e-05;-0.00027490791399032;-7.6041142165195e-05;-0.00069568632170558;-0.00011861896928167;9.1118650743738e-05;-0.00063396868063137;-0.00010367931827204;0.00031134704477154;0.00064812984783202;-0.00057517271488905;0.00019683285790961;8.5531770309899e-05;6.3853134633973e-05;0.00079545029439032;2.9582162824227e-05;0.00019355787662789;4.2797211790457e-05;-4.6144170482876e-05;-2.2450052711065e-05;1.2142904779466e-05;-0.00015177475870587;-9.122837218456e-05;0.0006600902415812;-0.00014073884813115;0.00081709289224818;0.00018080869631376;0.00060410343576223;-0.00034915254218504;0.00014700445171911;-5.6141412642319e-05;-8.6313360952772e-05;-3.2585667213425e-05;-0.00082811515312642;0.00018061559239868;0.00022438011365011;0.00010495910100872;-0.00060851266607642;-0.00031404657056555;-0.00010935269529;-0.00029128949972801;0.00039638395537622;8.3566883404274e-05;0.0001926932745846;-0.00062515889294446;-0.00018073733372148;-0.00012248742859811;2.0435283659026e-05;0.00040673019248061;-2.0921726900269e-05;1.8701869066717e-06;1.250664354302e-05;-2.946897984657e-05;4.2983127059415e-05;-0.00021657762408722;6.0966638557147e-05;-0.00014650092634838;-2.6091865947819e-05;0.00044075178448111;-0.0001276349357795;0.00021602433116641;-1.7339021724183e-05;0.00034761981805786;-3.3403579436708e-05;-0.0016748508205637;5.8914156397805e-05;-0.00011650371016003;-8.3517705206759e-05;0.00015494710532948;0.00024634081637487;2.6776990125654e-05;-2.7739717552322e-05;-9.5838186098263e-05;-0.00028416613349691;-1.967197022168e-05;0.00099746440537274;-3.921382358385e-06;-0.00042678471072577;3.1228650186677e-05;0.00070136389695108;-9.7472402558196e-06;3.4747477911878e-05;-1.8414863234284e-06;3.7353809148044e-06;8.5063242295291e-05;-0.00089514465071261;-0.00013208336895332;0.00020253795082681;-3.9105456380639e-05;5.887906809221e-05;5.8359182730783e-05;-0.00027184581267647;-4.9307403969578e-05;-0.0005964933661744;-2.2695958250551e-05;-0.00055498292203993;-2.7337458959664e-05;-0.00015078778960742;-4.5135948312236e-05;-0.00029816789901815;0.0003932494437322;-5.9503552620299e-05;-6.6755157604348e-05;0.00032366102095693;0.00034135326859541;5.3140691306908e-05;0.0014225816121325;2.1168365492485e-05;0.00040668621659279;1.4553960681951e-05;-0.00024030392523855;3.177529288223e-05;-2.0614144887077e-05;1.4901859685779e-05;-0.00012834377412219;-6.1374550568871e-05;0.00034793606027961;-8.3899692981504e-05;0.00062791531672701;0.00020309326646384;0.0007982961833477;-0.00044279839494266;0.00019766864716075;-6.3098312239163e-05;-2.0524894353002e-05;-2.8892192858621e-05;-0.0011459972010925;0.00022844216437079;0.00014422692765947;2.4138033040799e-05;-0.00057327229296789;-0.00011314076982671;-0.00011330159031786;-0.00012198659533169;0.00034399560536258;-4.5518268052547e-06;0.00017162942094728;-0.00024701352231205;-0.00021902093430981;-0.00020609749481082;3.0298451747512e-05;0.0004956999910064;-3.43138090102e-05;-9.7268293757224e-06;1.5133451597649e-05;-4.868303949479e-05;6.2391547544394e-05;-0.000435636844486;8.8652093836572e-05;-0.00021946041670162;-7.2111426561605e-05;0.00029735313728452;-1.476416400692e-05;0.00026015134062618;-5.9447079365782e-06;0.00017118510731962;-1.8612288840814e-05;-0.0016565860714763;-1.7876399169836e-06;-0.00015508421347477;-0.00015757989604026;0.00021522103634197;0.00037967297248542;4.1464660171187e-05;8.3983664808329e-05;-0.00013918319018558;-0.00023433570459019;-6.252147431951e-05;0.001208393718116;4.1596773371566e-05;-0.00042807019781321;2.0465933630476e-05;0.00077555002644658;-1.1274091775704e-06;3.9763232052792e-05;-2.9272434858285e-06;3.0889532354195e-05;0.00010535185720073;-0.00074729433981702;-0.00018725817790255;0.00051875395001844;-7.0434027293231e-05;-5.5943328334251e-05;0.00011804619862232;-0.00026918869116344;-6.2414517742582e-05;-0.00041954661719501;-3.3463427826064e-05;-0.0004949287394993;-5.3163392294664e-05;-0.00016877408779692;3.1340718123829e-05;-0.00036958864075132;0.00037468966911547;-8.9024579210673e-05;-0.00027330606826581;0.00041353143751621;0.0002519613772165;7.3595620051492e-05;0.0011152363149449;5.2256571507314e-05;0.00037302731652744;2.1459220079123e-05;-0.00026166252791882;3.9015307265799e-05;-1.2688390597759e-05;1.4158163139655e-05;-4.0609422285343e-05;-3.204985478078e-05;0.00011998754780507;-1.1052651643695e-05;0.00030381497344933;0.00015673483721912;0.00074795057298616;-0.0004015704325866;0.00021819565154146;-4.6569231926696e-05;0.00019874455756508;-2.54879687418e-05;-0.0010896851308644;0.00020374248560984;2.9306229407666e-05;-7.2024056862574e-05;-0.00035763171035796;4.6906305215089e-05;-4.8993006203091e-05;4.8236499424092e-05;0.00018521708261687;-0.00020482904801611;0.00010294582898496;-1.2550999883842e-07;-0.00017994330846705;-0.00027897066320293;3.2529937016079e-05;0.00042698727338575;-3.3227632229682e-05;-2.419600605208e-05;1.5185154552455e-05;-5.2899351430824e-05;3.9237729652086e-05;-0.00051701383199543;0.00012019280984532;-0.00040038902079687;-9.1163456090726e-05;7.7751406934112e-05;0.00010475100862095;0.00024997655418701;2.2674968931824e-05;-0.00010490866407054;7.6459127740236e-06;-0.0011371202999726;-6.9124966103118e-05;-0.00013752360246144;-0.00026007980341092;0.00027156685246155;0.00037623711978085;9.7955584351439e-05;0.00030498011619784;-0.00020866967679467;-0.00012930894445162;-0.00010773805115605;0.0011416869238019;7.6232783612795e-05;-0.00031029380625114;-3.9468550312449e-06;0.00063879386289045;9.5075893113972e-06;2.3370144845103e-05;1.6502049220435e-06;3.6240140616428e-05;9.4248745881487e-05;-0.00035869923885912;-0.00022510030248668;0.00086303893476725;-8.4215513197705e-05;-0.00018409281619824;0.00016093079466373;-0.00013237626990303;-6.6495282226242e-05;-0.00013560410297941;-3.0408653401537e-05;-0.00041910380241461;-6.7281485826243e-05;-0.00012606890231837;0.00011635544069577;-0.00040918387821876;0.00024838553508744;-0.00010671944619389;-0.0004938023048453;0.00045931831118651;5.8021036238642e-05;9.0684079623315e-05;0.00048948917537928;6.8042245402467e-05;0.00017644435865805;2.2146547053126e-05;-0.00010093427408719;3.1720566767035e-05;4.070030990988e-05;-2.9889493816881e-05;-3.2496653147973e-05;5.9334633988328e-05;-0.00011766531679314;0.00010104243119713;0.00013029295951128;9.0475339675322e-05;-0.00074277084786445;0.00072322902269661;-1.4841967640677e-05;1.5845615052967e-05;3.7595640606014e-05;5.9419646277092e-05;0.00035963379195891;-0.00034853859688155;-3.5574070352595e-05;-5.5038042773958e-05;-0.00015302329848055;0.00029932201141492;-0.00023149962362368;-0.00016492465510964;0.00024637376191095;-2.0236995624145e-05;-3.0926847102819e-05;-0.0001357216242468;-1.1700488357747e-05;2.5913195713656e-05;-5.7477311202092e-05;-0.00015330722089857;0.00014645472401753;2.3717093426967e-05;1.976739440579e-05;-9.1597867140081e-05;-4.169261228526e-05;-7.9748322605155e-05;-1.4355383427755e-05;0.00022087428078521;0.00021932655363344;-0.0001862866920419;-0.0004503425443545;-7.6206262747291e-05;-0.00010679887054721;-0.00023923351545818;-0.00023446053091902;0.00020172703079879;0.00038105080602691;-5.0587608711794e-05;-0.00017425300029572;-0.00047143609845079;0.00014345948875416;1.3146071978554e-05;0.00021088783978485;0.0003564742510207;0.00027771046734415;0.00025701752747409;-0.00017349926929455;-0.00028444576309994;7.8262899478432e-05;0.00011776742758229;9.7751631983556e-05;5.6003584177233e-05;5.6662014458198e-07;1.2458225683076e-05;7.7190597949084e-05;6.1297083448153e-05;0.00045131682418287;0.00029966139118187;2.3052214601194e-05;0.0001717886334518;-0.00018224319501314;-0.00035397947067395;4.0142032958101e-05;-3.5074269817414e-06;0.00013479164044838;0.0001745788322296;0.0001472809817642;0.00021771591855213;-4.5068129111314e-05;0.00039195516728796;0.00098584056831896;-0.00014487367297988;-0.00013435767323244;-0.00063792162109166;-0.00052207242697477;-0.00027585797943175;-0.00016154990589712;-0.0002120701392414;-0.00032737318542786;2.7687781312125e-06;2.7027817850467e-06;-8.1920996308327e-05;-0.0001123124093283;4.9569629481994e-05;-3.7433263059938e-05;-4.0728598833084e-05;6.2339946452994e-05;-0.00014504395949189;0.00018498407735024;0.00018258148338646;0.00015744331176393;-0.00087825593072921;0.00082003267016262;-3.0193983548088e-05;2.4561852114857e-05;5.6812852562871e-05;6.4586201915517e-05;0.00044344726484269;-0.00037595810135826;-2.2768808776163e-05;-3.3657706808299e-05;-0.00020808191038668;0.00031560505158268;-0.00028966536046937;-0.00012348656309769;0.00017380670760758;-2.0053012121934e-06;-4.3717649532482e-05;-0.00020530151959974;-4.6198085328797e-05;3.1180221412797e-05;-6.7204433435109e-05;-0.00018814954091795;0.00017089942411985;2.3943954147398e-05;2.3108927052817e-05;-0.00010349016520195;-5.495100049302e-05;-7.1229180321097e-05;3.0363647965714e-05;0.00023121973208617;0.00028042419580743;-0.00015264555986505;-0.00061982398619875;-7.5254021794535e-05;-0.00012376921949908;-0.00027746998239309;-0.00028750885394402;0.00019342009909451;0.00047754214028828;-4.782065298059e-05;-0.00017672526882961;-0.00043414504034445;0.00015949785301927;-6.1428926301232e-07;0.00017170357750729;0.00032988248858601;0.00029880303191021;0.00030233449069783;-0.00016606449207757;-0.00035419769119471;8.4818049799651e-05;0.00014272872067522;0.00012426945613697;7.1649097662885e-05;-1.0329749784432e-06;1.4983393157308e-05;9.0933252067771e-05;8.1176724052057e-05;0.0005500681581907;0.00041691481601447;4.2380936065456e-05;0.00031063158530742;-0.00018610987171996;-0.00043433217797428;5.4512245696969e-05;1.4094927109909e-06;0.00015902264567558;0.00025098380865529;0.0001575068308739;0.00025508130784146;-5.7537738030078e-05;0.00047993147745728;0.0010992217576131;-0.00016785190382507;-0.00016839655290823;-0.00076755130430683;-0.00068463524803519;-0.00033386528957635;-0.00022719577827957;-0.00024632082204334;-0.00044705157051794;-2.3039262941893e-07;-4.4845101001556e-06;-8.9387038315181e-05;-0.00014877524517942;4.2039515392389e-05;-3.3650467230473e-05;-3.3836851798696e-05;4.111168163945e-05;-0.00012784874706995;0.00024164740170818;0.00017522367124911;0.0001836376322899;-0.00072154519148171;0.00063050742028281;-4.3250896851532e-05;3.0288703783299e-05;6.1004302551737e-05;4.1256462282035e-05;0.00038733339169994;-0.00026207414339297;6.4664709498174e-06;2.6189489290118e-05;-0.00018494490359444;0.00019740345305763;-0.00025402978644706;1.0014719919127e-05;-4.919584171148e-05;3.0082685043453e-05;-4.9090864195023e-05;-0.00022574180911761;-6.7090826632921e-05;2.7851376216859e-05;-5.4160882427823e-05;-0.00016291497740895;0.00013731779472437;1.3246349226392e-05;1.8309994629817e-05;-8.2384176494088e-05;-5.6305227190023e-05;-2.0065954231541e-05;9.0997666120529e-05;0.00014697718142997;0.00026724266353995;-4.8833408072824e-05;-0.00062043033540249;-4.1249368223362e-05;-9.5992043497972e-05;-0.00022661231923848;-0.00024857488460839;0.00010355764970882;0.00041595185757615;-1.3819804735249e-05;-0.00010345616465202;-0.00016140064690262;0.00010891775309574;-2.4317250790773e-05;2.6551329938229e-05;0.00012381092528813;0.0002091733913403;0.00024568566004746;-8.3555343735497e-05;-0.00031072139972821;5.9972717281198e-05;0.00011820582585642;0.00011667323269648;7.2444126999471e-05;-3.2662624107616e-06;1.1461935173429e-05;7.7479846368078e-05;8.0169505963568e-05;0.00048655454884283;0.0004541348607745;7.5115836807527e-05;0.00042004205170088;-0.00011898866068805;-0.00037327752215788;5.3705869504483e-05;1.1873625226144e-05;0.00013405425124802;0.00026832462754101;0.00010690205090214;0.00020190530631226;-5.1048300520051e-05;0.00044266087934375;0.0008136322721839;-0.00014501216355711;-0.0001579373201821;-0.00066755624720827;-0.00070513848913833;-0.00028713236679323;-0.00024509124341421;-0.00020601371943485;-0.0004514827451203;-4.1768057599256e-06;-1.3751973710896e-05;-6.4606050727889e-05;-0.00014353761798702;3.1718718673801e-05;-2.6252133466187e-05;-2.6647721824702e-05;2.545768438722e-05;-9.9341115856078e-05;0.00022989527496975;0.00014404447574634;0.00017578148981556;-0.00052916770800948;0.00043314092908986;-3.7284593418008e-05;2.4446409952361e-05;5.4260752222035e-05;2.6056850401801e-05;0.00029417753103189;-0.00015776701911818;1.8781063772622e-05;4.4382562919054e-05;-0.00015048807836138;0.00012681874795817;-0.00020931407925673;4.1470004362054e-05;-0.00011041880497942;3.1562849471811e-05;-3.7657155189663e-05;-0.0001889892591862;-8.3964718214702e-05;1.9555365724955e-05;-3.8962312828517e-05;-0.00012531493848655;0.00010001893679146;7.4903232416546e-06;1.3675177797268e-05;-5.6772900279611e-05;-4.3980442569591e-05;-6.0849215515191e-06;9.2144022346474e-05;8.5984938777983e-05;0.00021404465951491;1.3550225048675e-05;-0.00052366178715602;-2.1524090698222e-05;-7.1196489443537e-05;-0.00016630881873425;-0.00019302073633298;4.4445609091781e-05;0.00032425881363451;-7.6954393080086e-06;-6.3373008742929e-05;-5.5097920267144e-05;7.9363271652255e-05;-2.460719224473e-05;-1.8593245840748e-05;4.4105101551395e-05;0.00013657369709108;0.00018300877127331;-3.2002837542677e-05;-0.0002392658352619;3.9988884964259e-05;9.1528774646576e-05;9.3487607955467e-05;5.9535777836572e-05;-2.7563592084334e-06;8.9372206275584e-06;5.6614419008838e-05;6.6878215875477e-05;0.00035942441900261;0.00037757703103125;5.8914083638228e-05;0.00038652043440379;-6.929458322702e-05;-0.00029277175781317;4.1783103370108e-05;1.0591968930385e-05;9.7373573225923e-05;0.00023370160488412;6.9524030550383e-05;0.00015384647122119;-4.2005041905213e-05;0.00033428421011195;0.00056289456551895;-0.00010227173333988;-0.00012376029917505;-0.00048823340330273;-0.00056556117488071;-0.00021283718524501;-0.00020741754269693;-0.00014694902347401;-0.00038034623139538;-3.9097458284232e-06;-1.3576577657659e-05;-4.3555111915339e-05;-0.00012361955305096;-1.8474078387953e-05;5.0057001317327e-06;0.00010424431820866;8.0775273090694e-05;0.0001366481592413;-0.00041713929385878;-0.00022421410540119;-0.00089187832782045;0.00046985680819489;-0.00087963114492595;9.2841401055921e-05;-0.00019733839144465;5.6867022067308e-05;-0.00035596074303612;-0.00025269691832364;0.0012689918512478;-0.00012195485032862;6.9747933594044e-05;0.00073036801768467;5.0756945711328e-05;9.2450791271403e-05;-0.00041023903759196;3.9045418816386e-05;-0.00025621362146921;0.00017147070320789;0.00024065542675089;0.00061975501012057;-5.2723175031133e-05;0.00030824265559204;4.0529859688831e-05;-0.00049978960305452;2.3587143004988e-05;-2.5809073122218e-05;1.3227097042545e-05;1.9043818610953e-05;0.00018857054237742;-0.00034279320971109;-7.2915492637549e-05;-0.00070663390215486;1.9424147467362e-05;0.00031978619517758;6.0260554164415e-05;0.00029592041391879;8.763494406594e-06;0.00012007851182716;-4.8724858061178e-05;-0.0016715032979846;-0.00018593645654619;-0.00044409590191208;0.00039394464693032;0.00026278465520591;0.00030525878537446;-0.00034994422458112;0.00053817220032215;-0.00018667767290026;-0.00034303663414903;7.6819043897558e-05;0.0013220531400293;-1.0220603144262e-05;-0.00044066700502299;9.1291985881981e-06;0.00085213466081768;2.5274193831137e-05;-2.35217385125e-07;8.0361816799268e-05;-2.4193820991059e-06;-0.00045361925731413;-0.00042613717960194;-6.3513100030832e-05;0.0014746671076864;0.00021773588377982;-0.00023465768026654;-0.00013690782361664;-6.8067223764956e-05;-6.1172046116553e-05;-0.00029552751220763;-0.00010118644422619;-0.00085482589202002;-0.00011571995128179;0.00014223706966732;-0.00077970494749025;-0.0001158074446721;0.00029937253566459;0.00080515962326899;-0.00081743899499997;0.00024533050600439;4.9951133405557e-05;8.7099710071925e-05;0.0008333369041793;3.3592055842746e-05;0.00018780336540658;5.4177718993742e-05;-9.1594638433889e-06;-1.8222232029075e-05;6.3687803049106e-06;0.00015673054440413;0.0001340021553915;0.00022585480473936;-0.00078196963295341;-0.00025468194507994;-0.0012908008648083;0.0004878192266915;-0.00088125769980252;0.00010436365118949;-0.00020472663163673;7.3405761213508e-05;-0.00034912247792818;-0.00026458053616807;0.0012705500703305;-0.00022909593826625;4.867459892921e-07;0.00092682876856998;6.6605738538783e-05;0.00028400143492036;-0.00055789318867028;0.00023589580086991;-0.0003368447360117;0.00012243373203091;0.00025854521663859;0.0010743474122137;-5.2397390390979e-05;0.00030560977756977;3.5521177778719e-05;-0.00054777762852609;2.8201213353896e-05;-2.3770639018039e-05;6.1891132645542e-06;4.3425614421722e-05;0.00020393403246999;-0.00027471224893816;-4.0695591451367e-05;-0.00079749611904845;-0.00010146146087209;0.0005612006643787;5.2382660214789e-05;0.00033083077869378;-2.3732836780255e-06;0.00030105558107607;1.3569047041528e-05;-0.002104080747813;-0.00020253076218069;-0.0004587201110553;0.00041658760164864;0.00028912822017446;0.00028325343737379;-0.00038208873593248;0.00054783071391284;-0.00017565287998877;-0.00046558104804717;3.6386467400007e-05;0.0014788194093853;3.0461355891021e-06;-0.00054136459948495;-4.9024183681468e-06;0.00097958988044411;3.0480367058772e-05;-3.3796291063481e-06;8.2560742157511e-05;-3.2841107895365e-05;-0.00048389320727438;-0.00068127230042592;-4.4645537855104e-05;0.0014245373895392;0.0001984873379115;-0.00014765992818866;-0.00015250328578986;-8.9626701083034e-05;-5.8352765336167e-05;-0.00053737533744425;-9.1986890765838e-05;-0.0010930685093626;-0.00012576623703353;8.4048602730036e-05;-0.00087459525093436;-0.00011673024710035;0.00039576174458489;0.0008864623378031;-0.0007497655460611;0.00026945493300445;0.00015229909331538;6.6409498685971e-05;0.0013359915465117;3.4215954656247e-05;0.00026907026767731;5.5284323025262e-05;-1.6015756045817e-06;-9.7827814897755e-06;4.5014280658506e-06;0.00015104855992831;0.00015004743181635;0.00022901839111;-0.00083363009616733;-0.00019433775742073;-0.0012066578492522;0.00033301251824014;-0.00057559635024518;7.7600903750863e-05;-0.00012543173215818;6.2969120335765e-05;-0.00017263267363887;-0.00018229836132377;0.00082319416105747;-0.0002609851944726;-7.7424781920854e-05;0.00078772159758955;7.037800969556e-05;0.00036897652898915;-0.00050139083759859;0.00034172777668573;-0.00029605851159431;-9.3840253612143e-06;0.00018546171486378;0.0010989648289979;-3.217961784685e-05;0.00017207162454724;1.7665015548118e-05;-0.00039656899753027;2.2475236619357e-05;-1.1496430488478e-05;3.5715415833693e-06;5.874302223674e-05;0.00013032757851761;-0.00011212768004043;3.120643668808e-06;-0.00054245768114924;-0.00018114429258276;0.00059492123546079;2.0254874470993e-05;0.00024091383966152;-1.6702333596186e-05;0.00040074880234897;6.8967456172686e-05;-0.0018083518370986;-0.00015397678362206;-0.00029205487226136;0.00026714382693172;0.00020218972349539;0.00016792087990325;-0.00025285925948992;0.00032334346906282;-9.2331494670361e-05;-0.00043013243703172;-1.2898711247544e-05;0.0010915180901065;1.7727383237798e-05;-0.00044963051914237;-1.5721087038401e-05;0.00075799785554409;2.3021426386549e-05;-2.2065391931392e-06;5.8200199418934e-05;-4.713365342468e-05;-0.00032607920002192;-0.00072551070479676;-9.9811541076633e-06;0.00080908875679597;0.00010305258183507;2.1158816707612e-06;-0.00011081607954111;-9.9166521977168e-05;-3.7215722841211e-05;-0.00058738730149344;-4.8591107770335e-05;-0.00090585782891139;-9.826674067881e-05;-1.1105399607914e-05;-0.00063378713093698;-7.4455463618506e-05;0.00036217842716724;0.0006259482470341;-0.00037849851651117;0.00018988152442034;0.00021495624969248;2.2307431208901e-05;0.0013799266889691;2.3431006411556e-05;0.00027733636670746;3.8314148696372e-05;-3.3699863706715e-05;-4.2986437620129e-05;4.7386133701366e-06;-0.00023416623298544;-0.00011369730054867;0.00091684714425355;-0.00013211849727668;0.00081364816287532;7.0438050897792e-05;-1.7674989067018e-05;-1.5777057342348e-05;8.8177594079752e-06;-1.0081167602038e-05;-0.00063355214660987;-3.6396033920028e-06;0.00010406323417556;1.0915113307419e-05;0.000352196599124;0.00025089620612562;-0.00040280530811287;-0.00057802419178188;-0.00011557461402845;-0.00046712349285372;0.00027638179017231;0.00049302889965475;0.00013201590627432;-0.00096877379110083;-5.1141189032933e-05;0.00018880360585172;-2.1683215891244e-05;0.00017757881141733;8.4493540271069e-06;7.3573552072048e-05;-1.7884498447529e-05;-8.040813554544e-05;-2.4971397579066e-05;0.00051281234482303;-0.00010017847671406;0.00037284541758709;1.0784575351863e-05;0.00038459681672975;-0.00017425436817575;-0.00012292905012146;-2.3785185476299e-05;0.00070442672586069;-8.4323357441463e-05;-0.00096345896599814;8.219347364502e-05;7.9577264841646e-05;0.00019615028577391;-8.3513354184106e-05;-0.00025421770988032;-3.0064562452026e-05;-0.00045258027967066;0.00011802945664385;-1.7595773897483e-05;0.00010251506319037;-0.00024401953851338;-8.0279514804715e-06;-0.00021245273819659;3.971358819399e-05;0.00020923835108988;8.2084616224165e-06;4.2919094994431e-05;-1.345419059362e-05;-0.000128047176986;1.6691888959031e-05;-0.00091571488883346;8.4120183601044e-05;-0.00061947881476954;1.6793333998066e-05;0.00029602347058244;-0.00010648163879523;-0.00026066691498272;7.723281669314e-06;-0.00094193610129878;-5.6741296248219e-06;-0.00051450403407216;5.1869552407879e-05;-2.4559956727899e-05;-8.9403118181508e-05;8.2415317592677e-05;0.00026147204334848;-2.727873652475e-05;0.00027424591826275;-6.2737133703195e-05;0.0005946074379608;-2.4264649255201e-05;0.0017979166004807;-4.9947280786e-05;0.00039430437027477;-1.9918331872759e-06;-0.00014369240670931;8.7305161287077e-06;-5.0270708015887e-05;1.0081478649226e-05;-0.00026028699357994;-0.0001445568195777;0.0011757742613554;-0.00018929713405669;0.0010995102347806;0.00012564926873893;0.00017379027849529;-0.00012237297778483;6.9939269451424e-05;-2.9836088287993e-05;-0.00059036718448624;-1.9328897906234e-05;-0.00014573155203834;6.3733612478245e-05;0.00040771884960122;0.0002581765584182;-0.00061474740505219;-0.0006767901359126;-0.00013012210547458;-0.00054999603889883;0.00041946535930037;0.00045369801227935;0.00019749987404794;-0.0012461906298995;-0.00010210106847808;0.00013122957898304;-1.2797761883121e-05;0.00029300653841347;5.5203736337717e-06;7.1518996264786e-05;-1.3504075468518e-05;-9.5035298727453e-05;-1.5537234503427e-05;0.00047001134953462;-6.5487467509229e-05;0.00027738031349145;-7.067956175888e-07;0.00051922164857388;-0.00021255592582747;-5.0575596105773e-05;-2.4718972781557e-05;0.00078792049316689;-9.4256945885718e-05;-0.001477402402088;9.9382821645122e-05;4.9682901590131e-05;0.00017051021859515;4.5875949581387e-06;-0.00019458011956885;-1.5541852917522e-05;-0.00045489415060729;5.4429725423688e-05;-9.6591400506441e-05;8.8045388110913e-05;8.1982165283989e-05;-6.9703487497463e-06;-0.00034285077708773;4.8086782044265e-05;0.0004331658128649;5.2831351240457e-06;4.7408662794624e-05;-1.0451978596393e-05;-0.00011251245450694;3.242435559514e-05;-0.0010759520810097;1.4216234376363e-05;-0.00048511996283196;-1.3299064676175e-06;0.00029614250524901;-7.6242897193879e-05;-0.00031787427724339;-1.0765756087494e-05;-0.0010970984585583;-1.5518688087468e-05;-0.00069800496567041;3.7385692849057e-05;-6.121231126599e-05;-9.514555131318e-05;-3.5986395232612e-05;0.0003313641063869;-3.20363760693e-05;0.00018736436322797;7.6504977187142e-05;0.00063515809597448;5.403785053204e-06;0.0021808568853885;-3.5760716855293e-05;0.00050040951464325;2.8844990538346e-06;-0.0002067975292448;2.0286741346354e-05;-3.187141919625e-05;8.8803153630579e-06;-0.00018405844457448;-9.6607836894691e-05;0.00073267467087135;-0.0001288469939027;0.00078510789899155;0.00012753145711031;0.00031710870098323;-0.00018751254538074;8.4733183030039e-05;-3.3865624573082e-05;-0.00035251048393548;-2.0028654034832e-05;-0.0003861399309244;9.5728166343179e-05;0.00026481557870284;0.00014109691255726;-0.00051136087859049;-0.00039787398418412;-0.0001033384251059;-0.0003194831951987;0.00033211495610885;0.00027137596043758;0.00015782266564202;-0.00076667865505442;-0.00011644487676676;2.9329004973988e-05;1.0732974260463e-06;0.00029132651980035;-4.0973436625791e-06;3.6698955227621e-05;-2.991204155478e-06;-6.0925005527679e-05;1.1068712410633e-05;0.00016337724810001;-1.3645225408254e-05;0.00010297125118086;-2.0840770957875e-05;0.00037723948480561;-0.00012701097875834;3.8213052903302e-05;-1.7438620488974e-05;0.00050295860273764;-6.0125519667054e-05;-0.0012884860625491;5.7642802858027e-05;-1.7450543964515e-05;6.4191328419838e-05;6.5582658862695e-05;-1.1520884982019e-05;-7.0268936269713e-07;-0.0002532308571972;-8.1982943811454e-06;-0.00012520827294793;3.4186072298326e-05;0.00036559291766025;7.468573130609e-06;-0.00030349139706232;3.4148801205447e-05;0.00044719135621563;2.7345645321475e-06;3.730877142516e-05;-5.723406047764e-06;-4.4811338739237e-05;4.1031769796973e-05;-0.00076997780706733;-4.9682017561281e-05;-0.00014217243005987;-2.214619780716e-05;0.00014956320228521;-6.9350348894659e-06;-0.00025266862940043;-2.2287751562544e-05;-0.00070991826942191;-2.0648347344832e-05;-0.00050304218893871;2.833739927155e-06;-8.2111488154624e-05;-5.9379995946074e-05;-0.00012132844130974;0.00027213274734095;-2.5759425625438e-05;3.7636171327904e-05;0.00015996501315385;0.00040076900040731;2.4921862859628e-05;0.001507701119408;-1.1266201909166e-06;0.00038676886470057;7.6273199738353e-06;-0.00021326547721401;2.4725204639253e-05;2.6494468329474e-05;-1.8706530681811e-05;-2.174702785851e-05;3.7927464290988e-05;-6.6700020397548e-05;4.3753869249485e-05;0.0001104694820242;4.7069006541278e-05;-0.00045946089085191;0.00044224795419723;7.2203115450975e-06;-1.810447997741e-06;3.6519530112855e-05;3.5947887226939e-05;0.00020753471471835;-0.00019738932314795;-2.6734875063994e-05;-6.4754160121083e-05;-0.00011937884119106;0.00024192928685807;-0.00017528599710204;-0.00022920496121515;0.00032249503419735;-4.6997836761875e-05;4.9610403038969e-06;-6.3399485952687e-05;-4.4096064812038e-05;6.1619616644748e-06;-3.1812109227758e-05;-9.8749791504815e-05;9.5496339781675e-05;1.8345275748288e-05;1.3673948160431e-05;-3.8062084058765e-05;-4.2859733184741e-06;-5.4563537560171e-05;-9.3107082648203e-06;0.00015793317288626;0.00014071927580517;-0.00010622210538713;-0.00028617362841032;-5.2920877351426e-05;-7.5186726462562e-05;-0.00014344761439133;-0.00014796863251831;0.00012825535668526;0.00025457367883064;-7.6398231612984e-05;-6.1253842432052e-05;-0.0004076698096469;0.00010469050175743;1.1264571185166e-05;0.00014820659998804;0.00025638937950134;0.00016463124484289;0.00015348757733591;-0.00012066152703483;-0.00018692041339818;5.3468345868168e-05;8.6234707850963e-05;5.5174274166347e-05;2.3997814423637e-05;4.2366414163553e-06;1.0805867532326e-05;4.7109679144341e-05;4.1838262404781e-05;0.00021060263679828;9.3139904493e-05;-4.780946255778e-05;2.4557572032791e-05;-0.00011202796304133;-0.00022801557497587;1.3073542504571e-05;-1.800947029551e-05;8.5308369307313e-05;0.00011040637764381;0.00010535385081312;0.00016264262376353;-3.8646398024866e-05;0.00018311523308512;0.00061484338948503;-6.7499808210414e-05;-7.373612606898e-05;-0.00028893898706883;-0.00015704910038039;-0.00015575945144519;-7.4247727752663e-05;-0.00011601313599385;-0.00019068967958447;4.7296484808612e-06;8.2248352555325e-06;-6.2089617131278e-05;-8.9455934357829e-05;3.0072942536208e-05;-2.1907502741669e-05;-2.4348679289687e-05;3.854507667711e-05;-8.0123376392294e-05;8.1248552305624e-05;0.0001285107282456;7.1940070483834e-05;-0.00050792656838894;0.00047703969175927;2.934154963441e-08;3.199062348358e-06;4.5455166400643e-05;3.6072626244277e-05;0.00023822051298339;-0.00020818496705033;-2.1672243747162e-05;-5.6391447287751e-05;-0.00013874251453672;0.0002447607985232;-0.00019483346841298;-0.00019850376702379;0.00027799271629192;-3.8518399378518e-05;-2.5192534849339e-06;-9.1626068751793e-05;-5.3492360166274e-05;8.0982817962649e-06;-3.5506014683051e-05;-0.00011229119991185;0.00010540227231104;1.801282451197e-05;1.4580821698473e-05;-4.2108174966415e-05;-9.634346497478e-06;-4.5431323087541e-05;1.3216658771853e-05;0.00016135230544023;0.0001619517133804;-9.7303563961759e-05;-0.00034776134998538;-5.1649971283041e-05;-8.0045574577525e-05;-0.00015812763012946;-0.00016721694555599;0.00012534088455141;0.00028783601010218;-7.2794719017111e-05;-5.6815235438989e-05;-0.00037206025444902;0.00010625777940731;4.7609719331376e-06;0.00012012404476991;0.00023058291117195;0.00017060007667169;0.00016769226931501;-0.00011723435454769;-0.00021085684420541;5.6015531299636e-05;9.4988936325535e-05;6.538066372741e-05;3.0345876439242e-05;3.4537440569693e-06;1.1539305887709e-05;5.2660983783426e-05;4.9794030928751e-05;0.00025636787177064;0.00014369595737662;-3.0111928936094e-05;8.2335282058921e-05;-0.00011264449858572;-0.00025503677898087;2.0031535314047e-05;-1.474386863265e-05;9.8295407951809e-05;0.00014181807637215;0.00010790954547701;0.00017500510148238;-4.4025789975422e-05;0.00021633692085743;0.00064671295695007;-7.568669389002e-05;-8.6235515482258e-05;-0.00034681300166994;-0.000221309819608;-0.00018195719167124;-0.00010283059964422;-0.00013406582002062;-0.00023829140991438;2.3881034394435e-06;4.5464821596397e-06;-6.5492611611262e-05;-0.00010364577610744;-1.0074401870952e-05;6.8717299654963e-06;0.00012433367373887;0.00010147987632081;0.0001625175063964;-0.00068354664836079;-0.00014608362107538;-0.00093424535589293;0.00024856318486854;-0.00044682953739539;5.4645501222694e-05;-0.00012511754175648;5.1264418289065e-05;-0.0001882763026515;-0.00013200991088524;0.00062903051730245;-0.00018686572730076;-5.4280089898384e-06;0.00060530478367582;2.2306589016807e-05;0.00027523571043275;-0.00036784401163459;0.00019745698955376;-0.00021772575564682;4.7174242354231e-05;0.00013545707042795;0.0009515697020106;-2.4761598979239e-05;0.00016340930596925;9.0674257080536e-06;-0.00031687979935668;1.2524729754659e-05;-3.6873266253679e-06;-2.0818468328798e-05;1.9834138583974e-05;0.00012006689212285;2.9369934054557e-05;-2.2965843527345e-05;-0.00052119622705504;-8.7223488662858e-05;0.00038623812724836;4.1238337871619e-05;0.00017224994371645;-1.7448022845201e-05;0.00027408060850576;1.7322510757367e-05;-0.0012910052901134;-8.8843378762249e-05;-0.00025444323546253;0.00029287129291333;0.00020068310550414;5.6260578276124e-05;-0.00026030241861008;0.00028812576783821;-9.8211290605832e-05;-0.00028711991035379;2.6756739316625e-05;0.00077225756831467;3.6582844131772e-06;-0.00033176384749822;1.0981561899825e-06;0.00057039206149057;2.221170507255e-05;-7.8991733971634e-06;2.8244892746443e-05;-4.7836154408287e-05;-0.00029702050960623;-0.00042137553100474;-1.393340244249e-05;0.00082755432231352;0.00010572982864687;-4.8903159040492e-05;-9.0547757281456e-05;-2.9274442567839e-05;-2.8089705665479e-05;-0.00046356586972252;-4.7409153921762e-05;-0.00079623138299212;-4.8436733777635e-05;1.9241493646405e-05;-0.00055282266112044;-5.1516926760087e-05;0.00021845271112397;0.00055493839317933;-0.00043740187538788;0.00016880047041923;0.00011703198833857;2.3983446226339e-05;0.001026569865644;1.5896575860097e-05;0.00016823176702019;3.0981544114184e-05;5.4395459301304e-05;-7.4613685683289e-06;1.607887679711e-05;0.00019834948761854;0.00021624921646435;0.00025648286100477;-0.0011634370312095;-0.00017865584231913;-0.0014475786592811;0.00022872080444358;-0.00037956007872708;5.7126340834657e-05;-0.00011756870662794;6.3396902987733e-05;3.2359337637899e-05;-0.00012270284059923;0.00051530450582504;-0.00036287511466071;-9.5457398856524e-05;0.00085066939936951;5.7917884987546e-05;0.00054429128067568;-0.00053710292559117;0.00042768640560098;-0.00030665466329083;-0.00015356598305516;0.00014958356041461;0.001572486711666;-1.2172696187918e-05;7.8928722359706e-05;-4.038532551931e-06;-0.00037680054083467;6.714715709677e-06;2.2671667466057e-05;-3.8124602724565e-05;2.4161296096281e-05;8.8125387264881e-05;0.00030998289003037;-4.7117573558353e-06;-0.00045485913869925;-0.00021380063844845;0.00064392207423225;3.3538904972374e-05;0.00013377435971051;-6.0072976339143e-05;0.00062065420206636;7.8577271779068e-05;-0.0017795551102608;-6.8955712777097e-05;-0.00017475614731666;0.00030055639217608;0.000214230894926;-8.3335537055973e-05;-0.00025644793640822;0.00011598023411352;-5.290497574606e-05;-0.00036876549711451;1.0301277143299e-05;0.00069673272082582;2.4215743906097e-05;-0.0004279837012291;-2.0019988369313e-06;0.00066213571699336;2.4277915144921e-05;-4.9714731176209e-06;9.2383124865592e-06;-0.00011243038898101;-0.00029860300128348;-0.00071398279396817;1.2263419193914e-05;0.00058435782557353;5.4963114962447e-05;0.00011277607700322;-9.5854222308844e-05;-8.0188518040814e-05;-2.9019160137977e-05;-0.00088642747141421;-2.4629251129227e-05;-0.0010890454286709;-2.8411061066436e-05;-6.0311078414088e-05;-0.00059623742708936;-3.6975103284931e-05;0.0002848478325177;0.00059418909950182;-0.0003145323425997;0.00018661956710275;0.00030410211184062;-9.1873644123552e-06;0.0018272047163919;1.4112690223556e-05;0.00031731836497784;3.4554446756374e-05;1.9980496290373e-05;1.2391936934364e-06;1.808196248021e-05;0.00021174421999604;0.00028849460068159;0.00026415649335831;-0.0012772829504684;-0.00015096041897777;-0.0014953995123506;0.00013089699496049;-0.00017535086954013;3.6587538488675e-05;-5.3163632401265e-05;5.1831797463819e-05;0.00030819920357317;-7.3104456532747e-05;0.00022040335170459;-0.00045319477794692;-0.00019654830975924;0.00080689165042713;9.7963958978653e-05;0.00067155383294448;-0.00052708829753101;0.00056538346689194;-0.00029629515483975;-0.00037145958049223;0.00011604052997427;0.0016608722507954;8.4524390331353e-06;-5.6486369430786e-05;-1.4739177458978e-05;-0.00031772002694197;-7.8333152941923e-07;4.358356090961e-05;-4.2164261685684e-05;3.6266992538003e-05;8.8619418647795e-07;0.00048990518553182;1.9833307305817e-05;-0.00016847506049089;-0.00027864519506693;0.00070779729867354;6.5006970544346e-06;4.8530706408201e-05;-8.7902590166777e-05;0.00082070578355342;0.00011872134928126;-0.0017318241298199;-3.2803804060677e-05;-2.9675860787393e-05;0.0001620246184757;0.0001548015861772;-0.00019386103667784;-0.00012652535224333;-0.00012160369078629;2.8328597181826e-05;-0.00036500257556327;-1.182527103083e-05;0.00037395805702545;4.0615723264636e-05;-0.00039523604209535;-4.4724502004101e-06;0.0005383410025388;1.4918246961315e-05;3.9518649828096e-06;2.8655524602073e-06;-0.00015118950977921;-0.00016747984045651;-0.00091412878828123;3.9672195271123e-05;5.6985401897691e-05;-3.2791373087093e-05;0.00027205352671444;-6.8187488068361e-05;-0.00012987984518986;-1.8786082364386e-05;-0.0010648254537955;1.6598349247943e-05;-0.0010346963535994;-1.1829750292236e-05;-0.00012278526264708;-0.00041393534047529;-3.3936335967155e-05;0.00031928485259414;0.00039840783574618;-2.0817920812988e-05;0.00012912233069073;0.00045234640128911;-5.0023914809572e-05;0.002142854500562;9.0518378783599e-06;0.00039160103187896;2.4486840629834e-05;-3.8907401176402e-05;7.8293160186149e-06;1.5769126548548e-05;0.00014645824558102;0.00025304660084657;0.00015802033885848;-0.00089798134285957;-7.4547911935952e-05;-0.00098116893786937;4.330349383963e-06;4.938172060065e-05;3.2540187930863e-06;9.907035746437e-06;2.0255012714188e-05;0.00045943021541461;-6.4164428295044e-06;-8.9803172159009e-05;-0.00036723571247421;-0.00020048004807904;0.00047037226613611;9.8995806183666e-05;0.00052501598838717;-0.00031116578611545;0.00045099618728273;-0.00017250260862056;-0.00043285716674291;5.0096117774956e-05;0.0011265627108514;2.4191815100494e-05;-0.00014773229486309;-1.7543397916597e-05;-0.00017447807476856;-9.5699324447196e-06;5.0366932555335e-05;-3.6427452869248e-05;1.8930179066956e-05;-7.5858093623538e-05;0.00049817957915366;2.1033503799117e-05;0.0001346602657577;-0.0002063448773697;0.00047100553638302;-1.0913573532889e-05;-5.2434857934713e-05;-8.3753620856442e-05;0.00069324433570728;9.254503675038e-05;-0.0010409548413008;1.9285851522e-05;9.744601265993e-05;2.6429345325596e-06;6.0822756495327e-05;-0.00023625195899513;2.0796525859623e-05;-0.00027948778006248;8.13743317849e-05;-0.00020221494196448;-8.1076204878627e-06;-7.3912407970056e-05;3.6836514482275e-05;-0.00022177532082424;1.6316759001711e-06;0.00023720538592897;7.7433605838451e-07;1.2195065210108e-05;-3.7857776078454e-06;-0.00014325682423078;-3.3308367619611e-07;-0.00074553349986672;4.6551020204788e-05;-0.00036036389064975;-9.0342909970786e-05;0.00029826434911229;-2.0664741896326e-05;-0.00012208455882501;-3.0745266030863e-06;-0.00085820019012317;4.4767126382794e-05;-0.00065296899992973;1.4021131391928e-05;-0.00011733970313799;-0.00012182093632873;-2.7419819161878e-05;0.00022973824525252;0.00010199346434092;0.00019386048370507;3.6562323657563e-05;0.00042907730676234;-6.6839602368418e-05;0.0016623813426122;1.1285402479189e-06;0.0003084679483436;7.3697187872312e-06;-5.3123258112464e-05;-8.5460451373365e-05;1.4880773051118e-05;-0.00027346980641596;-0.00013186187425163;0.0011743443319574;-0.00012922787573189;0.00091220490867272;4.0124275983544e-05;-0.00023030274314806;9.5633105956949e-05;5.413213148131e-05;-2.7589209139478e-07;-0.00099141732789576;1.5060145415191e-05;0.00041281437734142;-4.2674135329435e-05;0.00042209445382468;0.00030385886202566;-0.00036750323488377;-0.00072181067662314;-0.00012321984104346;-0.00058167235692963;0.00025633166660555;0.00062332482775673;0.00011838721547974;-0.0012042637681589;-2.0120169210713e-05;0.00029959745006636;-3.9630187529838e-05;0.00018563131743576;1.4490465218842e-05;0.00013899915211368;-4.5707889512414e-05;-0.00023805252567399;-7.1711481723469e-05;0.00084035523468629;-0.0001574558991706;0.00063289783429354;-5.0651323135753e-08;0.00030313132447191;-0.00013807909272145;-0.00036530755460262;-5.531529950531e-06;0.00082821975229308;-0.00011589383211685;-0.00069731340045109;5.7245189964306e-05;0.00023465909180231;0.00033814369817264;-0.00014800947974436;-0.0005242137121968;-6.0282087360974e-05;-0.00064963306067511;0.00017226483032573;0.00039312153239734;0.00014321951312013;-0.00087780406465754;2.5045685106306e-05;-0.00011582303704927;3.6758628993994e-05;3.7828041968169e-05;2.8979724447709e-05;6.10179558862e-05;-2.4594828573754e-05;-0.00023456664348487;-2.3754677386023e-05;-0.00079857389209792;0.00014367177209351;-0.00086075306171551;1.1741510206775e-05;0.00038142799166963;-0.00016545437392779;-0.00028156774351373;3.0939139833208e-05;-0.0012602292699739;-1.1190962140972e-05;-0.000617828394752;8.6141109932214e-05;8.4440820501186e-05;3.5767166082223e-06;0.00025207223370671;9.9612145277206e-05;-4.852204801864e-05;0.00017814162129071;-0.00017636646225583;0.00079235411249101;-3.449550786172e-05;0.0021350698079914;-6.6864609834738e-05;0.00041329345549457;-6.8802801251877e-06;-6.4350184402429e-05;2.4925022898969e-06;-0.00010041872883448;2.0572786525008e-05;-0.0002843166294042;-0.00014998509141151;0.001375665073283;-0.000161988689797;0.0010839073220268;5.8612335124053e-05;-0.00020104086434003;8.0952580901794e-05;9.5434697868768e-05;-8.2698616097332e-06;-0.0010653506033123;9.6524436230538e-06;0.00040274710045196;-3.7177574995439e-05;0.00045428867451847;0.00029993517091498;-0.00047643834841438;-0.00079616968287155;-0.00012129923561588;-0.00062994618201628;0.0003301463148091;0.00062284519663081;0.00014758542238269;-0.0014353810111061;-3.2181531423703e-05;0.00031251713517122;-3.9363305404549e-05;0.00022602760873269;1.8437383914716e-05;0.00015313606127165;-4.971340240445e-05;-0.00028879544697702;-7.6893855293747e-05;0.00092028791550547;-0.00015211162099149;0.0006513970438391;-6.7942137320642e-06;0.00036018688115291;-0.00015779820387252;-0.00039895839290693;-3.454523266555e-06;0.00090596126392484;-0.00013074011076242;-0.0008824861724861;6.5568274294492e-05;0.00026091985637322;0.00037642478127964;-0.00011181860463694;-0.00057270261459053;-6.6790293203667e-05;-0.00072084710700437;0.00014802839723416;0.00047679038834758;0.00014817561896052;-0.00089736474910751;3.0605748179369e-05;-0.00014581094728783;4.1961804527091e-05;9.1811576567125e-05;3.1824689358473e-05;6.7639884946402e-05;-2.4473793018842e-05;-0.00024181260960177;-3.8859081541887e-05;-0.00075152376666665;0.0001097415733966;-0.00086537632159889;-4.4703588173434e-06;0.0003997492021881;-0.00015990558313206;-0.00031148959533311;2.9246806661831e-05;-0.0013932435540482;-2.2458661987912e-05;-0.00070503266761079;8.2518476119731e-05;9.8680138762575e-05;1.050900118571e-05;0.00024040957214311;4.8017274821177e-05;-2.9707240173593e-05;9.6426454547327e-05;-0.00012610504927579;0.00082351744640619;-1.7252959878533e-05;0.0023675626143813;-5.5417505791411e-05;0.0004678970144596;-5.5983277889027e-06;-9.9422206403688e-05;1.0233960892947e-05;-5.2900541049894e-05;1.5810670447536e-05;1.4855641893519e-05;-2.4809287424432e-05;0.00049348111497238;-4.5456421503332e-05;0.00030956318369135;-6.9341767812148e-06;-0.00011954538786085;6.973727431614e-05;0.00011667629587464;-7.577693395433e-06;-0.00031839334405959;-2.0180762021482e-06;0.00020981568377465;-3.7288202292984e-05;5.0466191169107e-05;2.720374504861e-05;-0.00011517660459504;-0.00017810732242651;6.6561606217874e-06;-0.00016056983440649;8.7434011220466e-05;-3.1357696570922e-05;2.8712607672787e-05;-0.0004982259706594;1.6809568478493e-05;8.5965832113288e-05;-7.3344708653167e-06;5.7833636674332e-05;1.4673487385153e-05;5.5373435316142e-05;-1.8944878320326e-05;-0.00021005177404732;-2.730047890509e-05;0.00029025078401901;-2.453826891724e-05;0.00021206837845966;-1.6464726286358e-05;1.6928588593146e-05;-7.6130309025757e-06;-0.00017679117445368;7.7740742199239e-06;0.00014811166329309;-4.1371684346814e-05;-7.7029835665599e-05;2.1329374249035e-06;0.00013191155449022;0.000155988993356;1.7886555724544e-05;-0.00020521944679786;-4.4612035708269e-05;-0.00025271432241425;-1.9087565306108e-06;0.00045869319001213;3.3892676583491e-05;-0.0004560248053167;2.4221573767136e-05;1.447320414627e-06;1.0004376235884e-05;-1.9779128706432e-05;1.3678254617844e-05;3.6658901080955e-05;-1.0933229532384e-05;-0.00011111672210973;-4.2898816900561e-05;0.00012540289026219;1.0173456757911e-05;-0.00020198794663884;-1.9401550162002e-05;9.0905399702024e-05;-3.8493250031024e-05;-9.1227419034112e-05;1.9082335711573e-05;-0.00046009104698896;-6.9617553890566e-06;-0.00020941068942193;2.439179297653e-05;8.0534497101326e-05;4.1429895645706e-05;0.00010819645831361;-0.00015425961464643;2.2637386791757e-05;-0.00014812943118159;-1.9812005120912e-05;0.00026255560806021;-9.1989369366274e-07;0.0005881353863515;-8.1977614172501e-06;8.4102241089568e-05;-5.0160542741651e-06;3.3807333238656e-05;8.4363142605071e-07;-7.4224826676073e-06;4.6004101022845e-05;0.00018293781613465;0.00024260698410217;0.00019956610049121;-0.0011986170429736;-9.7643845947459e-05;-0.0012611404526979;-1.0753343531178e-06;5.06345568283e-05;1.5129480743781e-05;-8.0857949797064e-05;2.822428541549e-05;0.00051501812413335;-4.6193051161936e-08;-0.00011495365470182;-0.00038648291956633;-0.00012171577691333;0.00063294381834567;5.2279414376244e-05;0.00059577618958429;-0.0004016999155283;0.00044564018025994;-0.00021268604905345;-0.00035796363954432;5.9323807363398e-05;0.001562523888424;2.4579643650213e-05;-0.00013967290578876;-2.6971702027367e-05;-0.000244238472078;-2.7681906431098e-05;8.5233528807294e-05;-6.343954737531e-05;-9.6175215730909e-05;-2.869445415854e-05;0.00069757661549374;-6.9082107074792e-06;2.5237748559448e-05;-0.00019695007358678;0.00049281277460977;2.9873623134336e-05;-0.00013838708400726;-0.00010632623161655;0.00073014246299863;7.624920544913e-05;-0.0011408710852265;9.1095651441719e-05;0.00012201379286125;0.00015468425408471;8.7306267232634e-05;-0.00036541098961607;-0.00010293801460648;-0.00031205001869239;4.6759090764681e-05;2.0529967514449e-05;2.860531094484e-05;-0.00020026405400131;3.0026847525733e-05;-0.00022206849826034;1.6468857211294e-05;0.0002735493471846;5.1209726734669e-06;1.2416450772434e-05;-6.3573417719454e-05;-0.0001958967623068;-0.00010642823326634;-0.00043585765524767;2.8932821805938e-05;-0.00016276897804346;-6.0964855947532e-05;0.00027896434767172;-2.5901477783918e-05;-9.0596629888751e-05;-1.6940117347986e-05;-0.001085126074031;3.02963253489e-05;-0.00087011134019122;0.00010334001126466;-6.7442750150803e-05;-0.00021055639081169;9.571367627359e-06;3.5758279409492e-05;0.00025192616158165;-9.9191413028166e-05;9.7393560281489e-05;0.00043203777750023;-4.8686906666262e-05;0.0019047741079703;-3.0067492389207e-06;0.00032057682983577;1.824337959988e-05;1.3697361282539e-05;-6.0592373074542e-07;5.453624544316e-05;0.00021603411005344;0.00035463087260723;0.0002107469481416;-0.0014050642494112;-9.2027876235079e-05;-0.0014279037714005;-6.3361003412865e-05;0.00019355288532097;-2.1307009774318e-06;-4.3475673010107e-05;1.5275923942681e-05;0.00084792991401628;2.8948719773325e-05;-0.00031481409678236;-0.00052216846961528;-0.00022873072884977;0.00065967504633591;0.00010762293095468;0.00076815707143396;-0.00042511508218013;0.00060839799698442;-0.00022320156858768;-0.00061953131807968;5.2239502110751e-05;0.0017603355227038;4.6358170948224e-05;-0.00026256157434545;-3.3171949326061e-05;-0.00026057785726152;-4.0155438910006e-05;0.00011756103776861;-8.273222920252e-05;-0.00010736374679254;-0.00010883355571423;0.0009166015079245;4.4033840822522e-06;0.00027141402824782;-0.00024543926701881;0.00057190406369045;1.903962038341e-05;-0.00023576825333294;-0.00014257321890909;0.00097956310492009;9.9523545941338e-05;-0.0012326965807006;0.0001406899682479;0.00023310042161029;5.2187682740623e-05;6.3669896917418e-05;-0.00050397263839841;-5.2959180720791e-06;-0.00051349180284888;0.00011468499724288;4.3226307752775e-05;2.8972817744943e-05;-0.0004942124360241;4.2538362322375e-05;-0.00022013680427335;2.276037048432e-05;0.0002108307526214;-4.5732726903225e-06;2.4452432626276e-05;-6.6316672018729e-05;-0.00026457462809049;-1.4111376913206e-05;-0.000695078400895;4.8726411478128e-05;-0.00055169418919832;-0.00013539673818741;0.00043024335172959;-9.8862856248161e-06;-0.00014633100363426;-1.4859695511404e-05;-0.001373661798425;6.7514505644795e-05;-0.00096032762667164;0.00013293430674821;-8.6861487943679e-05;-9.4585979240946e-05;-1.8928047211375e-05;8.7314809206873e-05;0.00013275955279823;7.5618787377607e-05;6.7739507358056e-05;0.0006324602290988;-8.5046660387889e-05;0.002414179733023;-5.0310245569563e-06;0.00042060116538778;1.2970162970305e-05;-2.0249919543858e-05;4.9987284000963e-06;4.3479452870088e-05;0.00016657916421536;0.00031964119989425;0.00014162059233058;-0.0010856635635719;-5.3230218327371e-05;-0.0010631686309353;-9.4723785878159e-05;0.00024604983627796;-1.6422311091446e-05;-2.8921494958922e-06;-1.1368633749953e-06;0.00082410487812012;4.3857740820386e-05;-0.00036698492476717;-0.00044876732863486;-0.0002376064658165;0.00044377651647665;0.00011599419667618;0.00063919194508344;-0.00028903500060551;0.00052921014139429;-0.00015068508218974;-0.00060890655731782;2.6945397621603e-05;0.0013084731763229;4.8213278205367e-05;-0.00026736274594441;-2.6749901735457e-05;-0.00018880065181293;-3.6935358366463e-05;0.00010422751074657;-7.103640382411e-05;-8.5045852756593e-05;-0.00013895008305553;0.00079203041968867;7.5788948379341e-06;0.00038506297278218;-0.00019028152746614;0.00042136327829212;5.1738320507866e-06;-0.00023180547577795;-0.00012380916450638;0.00083970295963809;7.8583165304735e-05;-0.00086153642041609;0.00013521642540582;0.00024382899573538;-4.534871186479e-05;2.4230519557022e-05;-0.00044706181506626;7.6709191489499e-05;-0.00050823838682845;0.00012960426101927;5.4190310038393e-05;2.4973502149805e-05;-0.00058329408057034;3.7428075302159e-05;-0.00014544351142831;2.1649471818819e-05;8.7233049271163e-05;-1.1747103599191e-05;2.6919107767753e-05;-4.2560142901493e-05;-0.00023679362493567;7.4152463639621e-05;-0.0006794142536819;5.0590078899404e-05;-0.00067374925129116;-0.00015127728693187;0.00040491318213753;7.8190814747359e-06;-0.00014171090151649;-3.6895444281981e-06;-0.001152012264356;7.7027427323628e-05;-0.00071840401506051;0.00011186756455572;-7.0070746005513e-05;3.4115197195206e-05;-4.1997165681096e-05;0.00010682013817132;-1.6065972886281e-05;0.00019163526303601;1.4933497368474e-05;0.00059269857592881;-9.0470304712653e-05;0.0020099366083741;-6.201318683452e-06;0.00035392490099184;2.0468314687605e-06;-2.3236003471538e-05;-0.00014630737132393;3.5494624171406e-05;-0.00022867540246807;-0.00010942477820208;0.0011890045134351;-7.5285795901436e-05;0.00077830359805375;2.013700623138e-06;-0.00038752940599807;0.00017924851272255;0.00017531812773086;1.6961556639217e-06;-0.0013092341832817;4.2862106056418e-05;0.00060407788259909;-7.8221586591098e-05;0.00037803931627423;0.00028381479205564;-0.00022246102162171;-0.00068002799525857;-0.00011132931831526;-0.00057817524066195;0.00015800805704203;0.00056967261480168;6.8694076617248e-05;-0.0010797386057675;2.1267721876939e-06;0.00035937700886279;-4.9936847062781e-05;0.00021895849204157;9.6372259577038e-06;0.00020780942577403;-7.7291457273532e-05;-0.00049851916264743;-0.00010550117440289;0.00082440406549722;-0.00016405757924076;0.00081378198228776;-7.9355795605807e-06;0.00010568823199719;-3.9167924114736e-05;-0.00064608844695613;2.6624980819179e-05;0.00066605868050829;-0.00011849390284624;-0.00022946941317059;2.2948217974772e-06;0.00039728500996716;0.0004130641464144;-0.00020988652249798;-0.00065025896765292;-0.00011307523527648;-0.00065121159423143;0.00018076717969961;0.0011084729339927;0.00014356929750647;-0.0014059331733733;5.6147549912566e-05;5.038454401074e-05;1.8922690287582e-05;-0.00014669878873974;4.8313260776922e-05;9.410622442374e-05;-4.3080701289e-05;-0.0003524047206156;-7.3355244239792e-05;-0.00037836655974388;0.00017157109687105;-0.00091255706502125;-1.8525724954088e-05;0.00036819180240855;-0.00018304388504475;-0.00030101567972451;5.8855242969003e-05;-0.0014150076312944;-2.4501805455657e-05;-0.00057808205019683;0.00010109807772096;0.00022911086853128;0.00017353439761791;0.00042452159686945;-0.00018900143913925;-7.5641233706847e-05;-9.4513357907999e-05;-0.00026464983238839;0.00095562823116779;-3.4964996302733e-05;0.0020326632075012;-5.5817254178692e-05;0.00035878672497347;-1.1036033356504e-05;3.8653677620459e-05;-1.1557787047423e-06;-0.00017985845624935;4.6388147893595e-05;-0.00021577526058536;-0.00011924949649256;0.0014334092848003;-9.8211130534764e-05;0.00093356828438118;4.7490452743659e-06;-0.00043098855530843;0.00020577786199283;0.00025021162582561;-5.3966964514984e-06;-0.0015180837363005;4.3222615204286e-05;0.00069692882243544;-9.2865666374564e-05;0.00039340773946606;0.00027804891578853;-0.00029652088414878;-0.00075273029506207;-0.00010421947808936;-0.00063975219381973;0.00021024064335506;0.00054949568584561;8.4347826486919e-05;-0.0013162192190066;4.3708032535505e-06;0.0004136654024478;-5.3161162213655e-05;0.00025884446222335;1.6355152183678e-05;0.00023756166046951;-8.7152926425915e-05;-0.00062726880423725;-0.00011658450239338;0.00093221385031939;-0.00017173778905999;0.00092673918697983;-1.5629189874744e-05;0.00012362233246677;-4.5216209400678e-05;-0.00075465411646292;3.0002527637407e-05;0.0007333456305787;-0.0001400169567205;-0.00029773081769235;4.5033652895654e-06;0.00046878348803148;0.00049570924602449;-0.00020163500448689;-0.00074209360172972;-0.00014442429528572;-0.00077272532507777;0.00017544790171087;0.0014045834541321;0.00016009873070288;-0.0016281552379951;6.7160828621127e-05;6.1567712691613e-05;2.4287659471156e-05;-0.00015610044647474;5.5497552239103e-05;0.0001181188999908;-4.9576781748328e-05;-0.00040559950866736;-0.00010430916154291;-0.00023074841010384;0.00015675819304306;-0.0010063926456496;-4.248903496773e-05;0.00040523702045903;-0.0001925009128172;-0.00035907735582441;6.8806439230684e-05;-0.0016358661232516;-3.8532394682989e-05;-0.00065618695225567;0.00010626347648213;0.00027718051569536;0.00020095919899177;0.0004850292170886;-0.00031087655224837;-4.921432264382e-05;-0.0002169653744204;-0.00025583093520254;0.001077554305084;-2.5950426788768e-05;0.0023053090553731;-4.4858275941806e-05;0.00040836195694283;-1.1431629900471e-05;2.1622867279802e-05;5.2056343520235e-06;-0.00014867521531414;3.9834219933255e-05;-8.51143267937e-05;-6.0514768847497e-05;0.001009494299069;-4.6562483476009e-05;0.00061374122742563;-3.7061656712467e-06;-0.00031112384749576;0.00015794664795976;0.00025045854272321;-8.9656432464835e-06;-0.0012244089739397;2.9160966732888e-05;0.00051085132872686;-7.3434050136711e-05;0.00020726532966364;0.00014955528604332;-0.00018917453417089;-0.00045233691344038;-5.8999376051361e-05;-0.00040355045348406;0.00012437468103599;0.00027642623172142;4.3915562855545e-05;-0.00087135267676786;7.991503480298e-06;0.00032117340015247;-3.4085263905581e-05;0.00021342604304664;1.6389487427659e-05;0.0001699811546132;-6.0739479522454e-05;-0.00056444510119036;-7.482089131372e-05;0.00056088709970936;-0.00010307088086847;0.00069042958784848;-1.6299260096275e-05;4.3087544327136e-05;-1.0295700121787e-05;-0.0005802198429592;2.0674413462984e-05;0.00042263834620826;-0.00010162407852476;-0.00015090015949681;-4.9004015636456e-06;0.00036252912832424;0.00037658362998627;-0.00012396225065459;-0.00049294711789116;-0.00013506681716535;-0.00055210414575413;9.5240582595579e-05;0.0013103852979839;0.00010794102854561;-0.001246290630661;5.2749666792806e-05;8.0884521594271e-05;1.8537190044299e-05;-0.00013646221486852;4.1599792893976e-05;0.00012155769218225;-4.432167406776e-05;-0.00034861051244661;-9.4482762506232e-05;2.9279897717061e-05;8.9874345576391e-05;-0.00071133661549538;-5.3228970500641e-05;0.00026852451264858;-0.00012070518278051;-0.00032139749964699;6.0062611737521e-05;-0.0012216957984492;-3.4515294828452e-05;-0.00043362905853428;6.7968037910759e-05;0.00021732060122304;0.00013024349755142;0.00036955016548745;-0.00030417964444496;6.7460327954905e-06;-0.00024450547061861;-0.00015623334911652;0.00088727584807202;-1.9472270651022e-05;0.0015954991104081;-1.5546242138953e-05;0.00027292873710394;-8.6503687271033e-06;6.9863531280134e-06;8.6933023339952e-06;-9.8251555755269e-05;2.679417229956e-05;2.3949476599228e-05;-1.1017775250366e-05;0.00057772250147536;-7.8284447226906e-06;0.00032020703656599;-9.232713637175e-06;-0.00017585681052878;0.00010041079076473;0.00020714898710139;-9.907206731441e-06;-0.00080447894288227;9.8015034382115e-06;0.0002960498968605;-4.9704744014889e-05;4.4696946133627e-05;4.1266564949183e-05;-9.7491960332263e-05;-0.00017755736189429;-1.8964039554703e-05;-0.00018496405391488;5.3703839512309e-05;2.7376108846511e-05;1.3160154594516e-05;-0.00046097615268081;1.1569740308914e-05;0.00020133140787948;-1.3868515452486e-05;0.00014818737690803;1.672375947237e-05;9.1308778792154e-05;-3.0160625101416e-05;-0.00042072517680936;-3.0414024877246e-05;0.00023746053921059;-4.0017603168963e-05;0.00041569981840439;-1.6632773622405e-05;-1.1476106010377e-05;9.7312204161426e-06;-0.00034087017411366;7.7429212979041e-06;0.00015508163778577;-6.1310391174629e-05;-5.6785080232657e-05;-6.4413379732287e-06;0.00022018130403012;0.00023810158018023;-3.7744244764326e-05;-0.00023765870719217;-0.00010429370740894;-0.00033553331741132;2.1573188860202e-05;0.00099916174076498;5.5577998864464e-05;-0.00077163439709693;3.468471186352e-05;6.0998216213193e-05;1.468470418331e-05;-8.4316590800881e-05;2.4025895982049e-05;0.00010523352102609;-3.2633961382089e-05;-0.00025479309260845;-6.70673471177e-05;0.00016354532272089;3.3628864912316e-05;-0.0004008045361843;-4.7513294703094e-05;0.00013833049160894;-5.4604897741228e-05;-0.00025049148825929;4.3665495468304e-05;-0.00076358101796359;-2.0138502804912e-05;-0.0002354773459956;3.3515108952997e-05;0.00012730447633658;4.231901402818e-05;0.00022173597244546;-0.00022069191618357;4.7104873374337e-05;-0.00020219144062139;-5.923487333348e-05;0.00062989559955895;-1.7505601135781e-05;0.00089734682114795;3.9672400475865e-08;0.00013930592103861;-6.3879047047521e-06;2.8493554964371e-06;7.2967704909388e-06;-6.3573264924344e-05;1.7914571799338e-05;7.4791307270061e-05;1.1334541341057e-05;0.00033081648871303;5.7710062719707e-06;0.00015570969844703;-1.3082034456602e-05;-0.00010243777069263;6.6564018197823e-05;0.0001622023555683;-9.2916297944612e-06;-0.0005003294791095;-6.1724347233394e-07;0.00017304091306869;-3.4948698157677e-05;-3.3245854865527e-05;-9.2951850092504e-06;-4.3181771616219e-05;-4.1082650568569e-05;4.2204651435895e-06;-7.7169082942419e-05;1.9361685190233e-05;-0.0001022151845973;-9.2408606633398e-07;-0.00023243211035151;1.4565625860996e-05;0.00012027044431306;-2.9515672395064e-06;9.5161180070136e-05;1.5053324204928e-05;4.7068264393602e-05;-1.3934637536295e-05;-0.00030307591077872;-7.4136937655567e-06;7.3927840276156e-05;-1.0736654985521e-05;0.00025408214423805;-1.5745476048323e-05;-4.0154787711799e-05;1.9253075151937e-05;-0.0001939271169249;1.5775947304064e-06;1.923059062392e-05;-3.5968088923255e-05;7.4452518674661e-06;-7.1179238148034e-06;0.00013072596630082;0.00015055462426972;1.0104267857969e-06;-0.00010029709665105;-7.7577249612659e-05;-0.00020623821183108;-8.3908516899101e-06;0.00073476019315422;2.6386993340566e-05;-0.00048274293658324;2.3567887183162e-05;4.3526000808924e-05;1.0976662451867e-05;-5.4044587159296e-05;1.3271684110805e-05;8.1753045378719e-05;-2.2781830921303e-05;-0.00017676511197351;-4.544261173578e-05;0.00021630332048517;8.323838301294e-06;-0.00021710104192607;-3.9677241147729e-05;6.4648258558009e-05;-2.1628915419569e-05;-0.00018235815514345;3.0699291528435e-05;-0.00046636973274872;-1.0393493539596e-05;-0.00011765347153414;1.6534380847588e-05;7.3451104981359e-05;1.1930949767702e-05;0.00013985819532536;-0.00016436842270195;5.3241175919538e-05;-0.00017293191922363;-1.6752470401116e-05;0.00042813629261218;-1.5231420547934e-05;0.00047074045869522;5.6108492572093e-06;6.0971760831308e-05;-4.6907935029594e-06;7.6869864642504e-06;4.2567339733068e-06;-1.7525077055325e-05;5.0116392230848e-05;1.3143077921995e-05;-4.7082736273296e-05;8.3758923210553e-06;-0.00030603897175752;-1.165293951999e-06;-0.00021598806779366;-6.2045641243458e-05;0.00010753743117675;6.7605155891215e-06;-0.0001142948094639;1.6207200133067e-06;0.00032041248050518;3.4388671338093e-05;-0.00016089774726424;5.1318684199941e-06;4.0527495002607e-05;8.7474414613098e-05;-2.3867321942816e-05;5.4717231250834e-05;-3.5349301469978e-05;2.8625343475142e-05;-1.3689526895178e-05;7.8354481956922e-05;-9.8785994850914e-06;0.00033829681342468;6.6262850850762e-06;-7.9384495620616e-05;-1.5813631762285e-05;-7.9087891208474e-05;-2.2285594241112e-05;4.9770333134802e-05;5.686858912668e-06;-0.00020015944028273;7.2117886702472e-06;0.00014772993745282;-2.8185460905661e-05;0.00012711007730104;-1.4888825035086e-06;-8.5660764170825e-07;2.0912502805004e-05;-0.00014322985953186;-3.8288817449939e-05;4.1853822040139e-05;-1.3825926998834e-06;-3.2573498174315e-05;7.7769967901986e-05;0.0001282096200157;8.0694728239905e-05;-5.5013126257109e-05;-7.8736185969319e-05;-4.8231908294838e-05;-0.00020634262182284;2.9842914273104e-07;0.00045989162754267;3.1986994144972e-05;-0.00034361323923804;4.7805456233618e-06;2.7316547857481e-05;1.389807130181e-05;-2.4734023099882e-05;-1.2423995030986e-05;3.8215304812184e-05;-5.839569712407e-05;-0.00013624197163153;-1.5558916857117e-06;0.00027049108757637;-8.3418508438626e-06;-0.00016548368148506;-2.0705703718704e-05;6.6482847614679e-05;2.559790846135e-05;-6.4345338614658e-05;2.0119980490563e-06;-0.00042244367068633;1.1613705282798e-05;-0.00015212180733215;9.7180774901062e-05;3.5726259284274e-06;7.0189656980801e-05;4.949443609803e-05;-0.0001832644775277;5.2458099162322e-06;-0.00015026883920655;-3.2224343158305e-06;0.00023303095076699;-1.0241642485198e-05;0.00042843201663345;-1.1670650565065e-05;5.3630479669664e-05;2.5118017674686e-06;4.3026237108279e-05;-2.654687341419e-05;7.8105942520779e-05;4.6902147005312e-05;-1.7462003597757e-05;4.9519545427756e-05;-0.00061766669386998;-4.3918853407376e-06;-0.00046699796803296;-0.00010231748456135;0.000195387241547;8.9114573711413e-06;-0.00015971137327142;-2.5856579668471e-06;0.0004838922759518;5.4262738558464e-05;-0.00028106919489801;-6.5700114646461e-05;1.557857831358e-05;0.00018063836614601;-2.5891442419379e-05;0.00019654743664432;-0.00010612334881444;0.00015318105579354;-4.302422166802e-05;3.7950503610773e-05;-1.340326070931e-05;0.00068502587964758;1.7235452105524e-05;-0.00012559039168991;-2.2113124941825e-05;-0.0001225436135428;-3.9966016629478e-05;8.8895169028547e-05;-1.7156369722215e-05;-0.00028591399313882;-8.034759957809e-06;0.00033255049493164;-3.3482199796708e-05;0.00021572058903985;-2.2813674149802e-05;4.7940102376742e-05;3.5950914025307e-05;-0.0002385838306509;-6.4904328610282e-05;0.00016822548059281;4.8201773097389e-06;-0.00013117917114869;0.00014752880088054;0.0001990141463466;9.1938374680467e-05;-6.5422165789641e-05;-0.00020169169874862;-5.209812297835e-05;-0.00032411373103969;1.8194104995928e-05;0.0006195567548275;4.4986041757511e-05;-0.00055661163059995;7.2530865509179e-06;1.7249845768674e-05;2.2414182240027e-05;-2.0266601495678e-05;-1.8250126231578e-05;4.53907668998e-05;-8.4759230958298e-05;-0.00020478162332438;8.2802289398387e-06;0.00028579900390469;-6.1632117649424e-06;-0.00028153380844742;-5.2004001190653e-05;0.00014009881124366;3.4325494198129e-05;-8.29884011182e-05;3.6459144325818e-07;-0.00072076654760167;2.9512631954276e-05;-0.00032136202207766;0.00016692168719601;4.7284771426348e-05;0.0001081437440007;3.3320382499369e-05;-0.00026302906917408;-1.7066757891371e-06;-0.00022634338529315;5.0342960093985e-06;0.00036115534021519;-2.562926056271e-05;0.00083761202404276;-1.6473994037369e-05;0.000118600888527;1.4996453501226e-06;8.2446989836171e-05;-3.0638104362879e-05;0.00010471323912498;0.00012137748854002;0.00010682924767025;0.00012464544852264;-0.0011264028726146;-2.3616676116944e-05;-0.00093189708422869;-0.000140482414281;0.00029990618349984;6.4625573941157e-06;-0.00018135851132683;-7.5972416198056e-06;0.00075847288826481;7.0637783210259e-05;-0.0004261547292117;-0.00025294988881797;-7.6798511145171e-05;0.00036702875513583;6.2042799982009e-06;0.00048696150770411;-0.00024358784139622;0.00040318802348338;-0.00010917012696154;-0.00017104890139308;-3.0972528293205e-06;0.0012704737018794;3.7436282582348e-05;-0.00020854455942754;-2.9285476557561e-05;-0.00020170713833068;-6.2250132032204e-05;0.00014235987327993;-6.343680433929e-05;-0.00034521223278716;-5.0865150114987e-05;0.00065724208252504;-2.8695960281766e-05;0.00033847088343464;-8.6672633187845e-05;0.00020095366926398;5.2074497943977e-05;-0.00035675551043823;-0.00010984213440679;0.00047915958566591;2.7055641112383e-05;-0.00044521980453283;0.00023468781728297;0.00028009133529849;7.7791584772058e-05;-4.7296154662035e-05;-0.00041387430974282;-3.7455534766195e-05;-0.00047913767048158;6.0954058426432e-05;0.00068116222973913;5.6698605476413e-05;-0.00079716008622199;1.506138323748e-05;-3.5111443139613e-05;3.3654094295343e-05;2.1568259398919e-05;-2.3547314413008e-05;4.8546386096859e-05;-0.00010653566278052;-0.0002960201818496;2.3301063265535e-05;6.9576693931594e-05;6.9599814196408e-06;-0.00047017043107189;-0.00010810951789608;0.00028409133665264;3.5446813853923e-05;-0.00011610025103437;-5.9220055845799e-06;-0.0011865291744471;6.0087972087786e-05;-0.00064141390612349;0.00024294914328493;8.9421540906187e-05;0.00011974546214333;-1.3117621165293e-05;-0.00027405869332142;5.5096415962907e-06;-0.00025221353280358;2.6426645490574e-05;0.00056913436856121;-5.5933211115189e-05;0.0016214101342484;-1.8797893062583e-05;0.00025406319764443;1.8294499568583e-06;0.00010996950732078;-2.1784193450003e-05;0.00011738191096811;0.00016194050840568;0.00029120189719833;0.00010127848509001;-0.001286193379201;-3.2532108889427e-05;-0.0010775071568787;-0.00018637352332007;0.00042070136987604;-1.7969603504753e-05;-0.00013832710101269;-3.3919321140274e-05;0.0012757015647367;8.8074404629879e-05;-0.00060483964625746;-0.00043777716928162;-0.00018933298997581;0.00039382034447044;9.3577451480087e-05;0.00066496175713837;-0.00024364117416553;0.0005345523240976;-0.00011021558748325;-0.00059025414520875;1.3507950825442e-05;0.0014122675638646;6.7164466599934e-05;-0.00037034769775346;-2.9826924219378e-05;-0.00026529029128142;-8.3580896898638e-05;0.00019133827299811;-9.7287178505212e-05;-0.0003793892392423;-0.0001361279428238;0.00088388938456774;-1.6698762919987e-05;0.00059857004089281;-0.00012298536603339;0.00028213488985784;5.317590694176e-05;-0.00051941105630249;-0.00015307030116674;0.00077005784260109;3.7293044442777e-05;-0.00055862800218165;0.00031136121833697;0.00038124137790874;-4.2723379010567e-05;-5.9222547861282e-05;-0.0005885831778869;5.9094716561958e-05;-0.00064605020452291;0.00012997689191252;0.00077135709580034;6.8180190282874e-05;-0.0011380024952814;2.2942034775042e-05;3.8559483073186e-07;4.8992122174241e-05;-6.8230096076149e-05;-3.6795732739847e-05;6.7877961555496e-05;-0.00011997021647403;-0.00039060760173015;9.9718832643703e-05;-0.0002143221499864;1.771975257725e-05;-0.00084767478983849;-0.00017796333122533;0.00043893710244447;5.1213868573541e-05;-0.0001818865275709;-2.0122122805333e-05;-0.0015106763457879;9.2675967607647e-05;-0.00075047969585285;0.00029578860267065;8.768102270551e-05;0.0002267552918056;-5.0076418119716e-05;-0.00023381123901345;-9.3480033683591e-05;-0.00010828587983269;1.4589613783755e-05;0.00080873031402007;-8.0271900515072e-05;0.0022095513995737;-1.7260306776734e-05;0.00037241744576022;4.5214314923214e-06;4.5505727030104e-05;-1.1681800060614e-05;9.2947761004325e-05;0.00013351911911741;0.00029268593061715;5.7983012084151e-05;-0.0010176566429436;-1.8760589227895e-05;-0.00083717930829152;-0.00017057279183064;0.00038978908560239;-2.7152746042702e-05;-8.2677128375508e-05;-3.9773825847078e-05;0.0011704199714586;7.8389763075393e-05;-0.00054579216521233;-0.00040452170651406;-0.00020811500144191;0.0002698922471609;0.00011258225276833;0.00057508028112352;-0.0001630492915865;0.00047559133963659;-7.2796523454599e-05;-0.00061509624356404;1.0537029993429e-05;0.0010773361427709;6.4462503360119e-05;-0.00034342365688644;-2.1631802155753e-05;-0.00022133519814815;-7.2889793955255e-05;0.00016573996981606;-8.9724911958911e-05;-0.00030299712670967;-0.00014786327665206;0.00076553970575333;-8.7559183157282e-06;0.00059375027194619;-9.5471456006635e-05;0.00021469448984135;3.9939604903338e-05;-0.00045710866106674;-0.00013203192793299;0.00068713421933353;2.7017567845178e-05;-0.00040255457861349;0.00027338255313225;0.00033582278410904;-0.00010081699292641;-5.4766012908658e-05;-0.00052023178432137;0.00010310986544937;-0.00057010829914361;0.00013167667202652;0.00062170007731766;5.8310117310612e-05;-0.0010403600754216;1.9550232536858e-05;1.6761350707384e-05;4.3965857912553e-05;-0.00010241453855997;-3.6062385333935e-05;6.030009535607e-05;-8.5644183855038e-05;-0.00034190906444564;0.00013815671263728;-0.0003273740876466;2.3965336367837e-05;-0.00083037023432553;-0.00017410666623618;0.00040202593663707;4.9627287808107e-05;-0.00016738451085985;-1.236886055267e-05;-0.0012824791483581;9.1502850409597e-05;-0.00060602184385061;0.00024421507259831;7.7000360761303e-05;0.00024249171838164;-7.394069689326e-05;-0.00013783515896648;-0.00015016082033981;6.7897040025855e-06;-1.0570855010883e-05;0.00073704071110114;-8.2150669186376e-05;0.0019038749160245;-1.4449737136601e-05;0.00032403465593234;-1.2583350326167e-06;3.3061951398849e-05;-0.00020347964891698;5.9767131460831e-05;-9.1851106844842e-05;-6.3777646573726e-05;0.0010825414210558;-2.025875801337e-05;0.00053122238023207;-3.1806324841455e-05;-0.00041896040784195;0.00019505704403855;0.00033050918136723;-9.5128498287522e-06;-0.0013803249457851;6.0883790865773e-05;0.00059318350395188;-7.8290540841408e-05;0.00024800666142255;0.00023061905812938;-4.4864405936096e-05;-0.00053563056280836;-8.0239107774105e-05;-0.00053866114467382;5.3574032790493e-05;0.00028126680990681;2.0616418623831e-05;-0.00073611887637526;1.1209827789571e-05;0.00032996357185766;-4.560653178487e-05;0.00025401063612662;-3.0484955004795e-06;0.0002462164266035;-9.6040959761012e-05;-0.0007469552801922;-0.00010709471825976;0.00040116813033819;-0.00010760019358713;0.000809597724583;4.2601513996487e-06;-7.5197734986432e-05;5.2430510550039e-05;-0.00081245304318145;5.4733103752369e-05;0.0002837719512172;-8.6887303041294e-05;0.00013957243936602;-4.3390657083364e-05;0.00048258501919918;0.00036780213122256;-0.00025107641704381;-0.00053256680257618;-0.00016744135064073;-0.00041958998190239;0.00013780248991679;0.0017916613724083;0.0001023656441248;-0.0014963521389291;5.4971478675725e-05;0.0001800658646971;-4.016314051114e-06;-0.00021460013522301;5.2258594223531e-05;0.00013396394206211;-6.3688807131257e-05;-0.00044235822861083;-9.7540381830186e-05;9.7161864687223e-06;0.00017082705744542;-0.00078386749373749;-4.9506459617987e-05;0.00027912150835618;-0.00015937884745654;-0.00034398498246446;8.0073958088178e-05;-0.0013962532393634;-3.1884072086541e-05;-0.00044910769793205;9.4532239018008e-05;0.00032970809843391;0.00032539377571084;0.00051185756456107;-0.00041128398152068;-0.00010693220974645;-0.00035566923907027;-0.00029787753010169;0.0010901824571192;-3.5655946703628e-05;0.0016402581240982;-3.2953936170088e-05;0.00028164777904749;-1.4530813132296e-05;0.00012873466766905;-3.5434288747638e-06;-0.00024192499404307;7.2369235567749e-05;-3.9224349166034e-05;-6.1930011725053e-05;0.0013267850736156;-3.814803858404e-05;0.00065111188450828;-3.8739264709875e-05;-0.00047858618199825;0.0002316298923688;0.00042584165930748;-1.7619126083446e-05;-0.0015959141310304;6.1899496358819e-05;0.00069927127333358;-9.758894884726e-05;0.00022884696954861;0.00021517199638765;-8.8547414634377e-05;-0.00058216799516231;-6.2399325543083e-05;-0.00060268247034401;9.1334972239565e-05;0.00018693474703468;2.6825762688532e-05;-0.00092724448768422;2.0807407054235e-05;0.00038420004420914;-4.7323301259894e-05;0.00029332339181565;3.6862850265607e-06;0.00026949544553645;-0.00010287175973644;-0.00090310606174171;-0.00011642582103377;0.00046782696153969;-0.00011492014164105;0.00094001815887168;-4.5667884478462e-06;-8.3554565208033e-05;5.6667740864214e-05;-0.0009102372569032;5.5651460570516e-05;0.00030563614564016;-0.00010647910676198;0.00012971569958609;-4.4636988604907e-05;0.00056053232401609;0.00045195041457191;-0.0002494151412975;-0.00060674658743665;-0.0002084690349875;-0.00053497613407671;0.00013608898734674;0.0021576650906354;0.00011960326082772;-0.0017506125150248;6.6453008912504e-05;0.00019546577823348;1.2754121598846e-06;-0.00023606084869243;5.9032947319793e-05;0.00016819511074573;-7.3361312388442e-05;-0.00051504955627024;-0.00012883769522887;0.0001996407227125;0.00016073498409241;-0.00088098051492125;-7.7902448538225e-05;0.00031047419179231;-0.00016973107995;-0.00041911250445992;9.3471076979768e-05;-0.0016264758305624;-4.5150092773838e-05;-0.0005103797884658;0.00010155599738937;0.00038200142444111;0.00036133333924226;0.00059396005235612;-0.00054880429524928;-7.946773985168e-05;-0.00050286523764953;-0.00029890288715251;0.0012593193678185;-3.1618928915123e-05;0.0018677084008232;-2.1062880477984e-05;0.00031387168564834;-1.5026544133434e-05;0.00013152440078557;9.3850195526102e-07;-0.00019446389342193;5.7194385590265e-05;6.3825158576947e-05;-1.9935683667427e-05;0.0010485495440662;-1.5861254723859e-05;0.00047914829337969;-3.5798373573925e-05;-0.00035358517197892;0.00018109804659616;0.00038869271520525;-1.8698125131777e-05;-0.0013358824653551;3.7558544136118e-05;0.00052782765123993;-7.9961762821767e-05;8.753143629292e-05;0.00012123946362408;-6.371127528837e-05;-0.00036864989669994;-2.7280237191007e-05;-0.00043071215623058;5.9381887695054e-05;-1.8831195120583e-05;9.8972313935519e-06;-0.00067779934033751;2.3275024432223e-05;0.00031709490576759;-2.8972413929296e-05;0.00025693408679217;1.089481429517e-05;0.00018106974312104;-6.5337306295987e-05;-0.0007845678483136;-7.468161493307e-05;0.00025408889632672;-6.6661472374108e-05;0.00073054892709479;-9.5342093118234e-06;-7.7743716246914e-05;4.7015062591527e-05;-0.00065112352604046;3.0931816581869e-05;0.00014674574777018;-8.5871019109618e-05;7.8322242188733e-05;-3.027330058103e-05;0.00043534216820262;0.00036802189424634;-0.00015129147504922;-0.00040245190029964;-0.00019022791821044;-0.00043062857002951;6.7984459747095e-05;0.0018699126085266;8.9821623987518e-05;-0.0013536878395826;5.0704726163531e-05;0.00014039521920495;8.3790555436281e-06;-0.00016834116831888;4.3138727050973e-05;0.00017703426419757;-6.5460531914141e-05;-0.00046729313908145;-0.00010766651394079;0.00023214620887302;9.9993339972571e-05;-0.00067807966843247;-7.6897733379155e-05;0.0002268876414746;-0.00011261208419455;-0.00042194087291136;8.0777834227774e-05;-0.0013310558861122;-3.5786302760243e-05;-0.00038385752122849;6.9633286329918e-05;0.00027879021945409;0.00021205954544712;0.00044941919622943;-0.00042649745591916;-5.8938471738657e-06;-0.00041098636575043;-0.0001844721409725;0.001159405335784;-3.2530770113226e-05;0.0014484024140984;-5.3682592806581e-06;0.00022535872994922;-1.1849630027427e-05;9.3522881797981e-05;4.817726676265e-06;-0.00013173936167732;3.8461279473267e-05;0.00015290136798285;2.127792504325e-05;0.00066325115039945;9.1486963356147e-06;0.0002594854158815;-3.2565927540418e-05;-0.00021200229821261;0.00012384836736601;0.00031908965320326;-1.8009573977906e-05;-0.00094273168360814;1.0147788088943e-05;0.0003276992647443;-5.9831290855072e-05;-5.6120454246411e-05;1.2369886462693e-05;-2.9524628189392e-05;-0.00011713099956978;9.8412920124247e-06;-0.00021178621682338;2.0227016648278e-05;-0.00021839859255124;-8.1391153798904e-06;-0.0003725606657099;2.6611727662385e-05;0.00021848606411368;-8.4844505181536e-06;0.00018811266636476;1.8065666154143e-05;9.3346556241158e-05;-2.9724258638453e-05;-0.00059993227478117;-2.620195846248e-05;4.2437408410478e-05;-1.8616001398186e-05;0.00048073779908009;-1.7052685507224e-05;-8.9397122792434e-05;4.4962740503252e-05;-0.00037971592973918;9.2228001449257e-06;-2.0664707335527e-05;-5.7920336985262e-05;7.3128270742018e-05;-1.9984319806099e-05;0.0002747452526819;0.00025819134316407;-4.6224358811742e-05;-0.000179426104296;-0.0001524413091829;-0.00030218355823308;6.8099313921266e-07;0.0014495474752039;4.9383070290787e-05;-0.00089712318731472;3.6660163459601e-05;9.1992900706828e-05;1.278106810787e-05;-0.00010659385588951;2.5384084437974e-05;0.00015872941003181;-4.9213202146348e-05;-0.00035925558768213;-7.9825753346086e-05;0.00032793876016513;3.5094879422104e-05;-0.00041293792310171;-7.2406692197546e-05;0.00012045369658154;-4.9357237003278e-05;-0.00035862837103195;6.069124356145e-05;-0.00090285635087639;-2.2328769773594e-05;-0.00021516926062759;3.5529523302102e-05;0.00016244828293566;7.7561526268255e-05;0.00029013457242399;-0.00030869702459313;5.9435678849695e-05;-0.00033280192292295;-6.7802582634613e-05;0.00089094415307045;-2.9741233447567e-05;0.000868413830176;9.7053971330752e-06;0.0001126681745518;-8.3199847722426e-06;5.3736395784654e-05;5.8563618949847e-06;-7.7812597737648e-05;2.2455989892478e-05;0.00017558726540301;3.8938025682e-05;0.00036306140827946;2.0805353415199e-05;0.00011054768401664;-2.7746482373914e-05;-0.00011325465311529;8.1212885561399e-05;0.00023457250790671;-1.463908029109e-05;-0.00059885194059461;-8.2859532994917e-06;0.00018445230671205;-4.3991542042932e-05;-0.00012306492135394;-4.8895111831371e-05;-1.0121650120709e-05;3.499986269162e-05;2.8367416234687e-05;-6.1795792134944e-05;-2.0461877738853e-06;-0.00028986134566367;-1.5426547179231e-05;-0.00016898222384043;2.7430542104412e-05;0.00013553387543652;4.1072908061324e-06;0.00012120060273446;2.1503019524971e-05;3.7585959944408e-05;-8.5104757090448e-06;-0.00041647499892861;4.1094895095739e-06;-5.2739371312782e-05;6.8219433160266e-06;0.00029243706376292;-2.1252140868455e-05;-9.1067086032126e-05;4.0403989260085e-05;-0.00019047832756769;-2.6078391783813e-06;-9.8176751635037e-05;-3.6643494240707e-05;7.4985749961343e-05;-1.2941843124281e-05;0.0001505106483819;0.00017132643552031;1.9213672203477e-05;-4.4625037844526e-05;-0.00011015278141713;-0.00021038923296146;-3.4663509723032e-05;0.0010240636765957;2.0906412828481e-05;-0.00055565859656781;2.7069305360783e-05;5.7396107877139e-05;1.3824532288709e-05;-6.7243265220895e-05;1.2969824638276e-05;0.00012287485878915;-3.2103740522871e-05;-0.00024554305127822;-5.4897034715395e-05;0.00036102865124121;-2.9923626243544e-06;-0.00021629282855429;-6.0768117691623e-05;4.7982633986976e-05;-1.0361526619818e-05;-0.00026389479171485;4.1216830140911e-05;-0.00054448412265629;-1.0784837286337e-05;-9.5370844064746e-05;1.4245879356167e-05;7.8616067185067e-05;1.065288074642e-06;0.00017159804701805;-0.0002130101347575;8.6022962932475e-05;-0.00025830665254034;1.1992327699772e-06;0.00060123112052679;-2.4589837266831e-05;0.00043429751531221;1.4844299585093e-05;3.2482676033396e-05;-5.6135945669666e-06;2.5801226001931e-05;4.5061919990985e-06;-3.912347892765e-05;1.1012783943443e-05;0.0001055145621649;2.6460593289812e-05;0.0001620275870664;1.7849355572253e-05;4.1182040149579e-05;-1.5871055438765e-05;-5.3362786275102e-05;4.3969292164547e-05;0.00013026970555075;-8.1768948803074e-06;-0.00032831873977557;-8.9689574451768e-06;9.0411951532587e-05;-2.5212684704456e-05;-8.3829560026061e-05;-3.9730432035867e-05;-3.8188104554138e-06;5.0162809202448e-05;1.719993451843e-05;-6.7437126745062e-06;-7.2278630796063e-06;-0.00017510053294245;-1.0566553100944e-05;-6.4737345383037e-05;1.6770687579992e-05;7.3048591730185e-05;4.5974816202943e-06;6.5485226514284e-05;1.4826816368441e-05;1.5684165191487e-05;-2.2856995656184e-06;-0.00022783908934798;8.3491368059185e-06;-4.3781816202682e-05;8.0922909546643e-06;0.00015421006537508;-1.4089016076468e-05;-5.7923931308324e-05;2.4525143089704e-05;-9.3364898930304e-05;-3.6106848710915e-06;-6.8538654886652e-05;-2.0093499188079e-05;4.6661058149766e-05;-6.8635245042969e-06;7.190336327767e-05;9.4217924925033e-05;2.3369108021143e-05;-5.9064118431706e-06;-6.1398473917507e-05;-0.00012089551455574;-2.7865606170963e-05;0.00056703173322603;8.3892282418674e-06;-0.00029421297949739;1.5734640328446e-05;3.4368003980489e-05;9.2423797468655e-06;-3.9365186239593e-05;6.2567755776399e-06;7.0442045398522e-05;-1.7015934645315e-05;-0.00013442107592709;-3.0188435630407e-05;0.00022901197371539;-6.9652423917432e-06;-0.00010583270341158;-3.5520915844245e-05;1.8871938664233e-05;-6.5534941029455e-08;-0.00014632973761763;2.2664045900456e-05;-0.00027578367735259;-4.2250117076037e-06;-3.7458532460732e-05;5.5633508964092e-06;3.4212309401482e-05;-1.5629282643204e-05;8.6547683167737e-05;-0.00011358064512024;5.8987476222683e-05;-0.00014311181439552;1.1994483429589e-05;0.00032093681511469;-1.5340938261943e-05;0.00020093942293897;9.1746178441099e-06;7.1552854024048e-06;-3.2464322430314e-06;5.6432172641507e-06;2.5712336082506e-06;-1.3632866284752e-05;3.7863363104407e-05;-6.16237275608e-06;-7.2084621933755e-05;-1.4262015611166e-05;-0.00015474886458833;2.0340512492112e-06;-8.1223086453974e-05;-4.3003925384255e-05;6.5988344431389e-05;5.8905043260893e-06;-9.7436561190989e-05;3.7927188714093e-06;0.00025144647224806;2.490535916877e-05;-0.00010235182708129;4.8067835450638e-05;5.360240538721e-05;3.3190073736478e-05;-2.535381281632e-05;-1.9305591195007e-05;4.7688654376543e-06;-3.1301224225899e-05;3.1692695756647e-06;0.00011518714745762;-9.2626778496196e-06;0.00015127054939512;9.3911495469001e-07;-5.817923010909e-05;-1.265170158149e-05;-6.1155675211921e-05;-1.3251699783723e-05;2.9567250749096e-05;1.8974884369527e-05;-0.00016756316472311;1.6435793440905e-05;3.5553373891162e-05;-2.5896970328176e-05;8.8334112660959e-05;1.1146503311465e-05;-3.0575592973037e-05;1.3399988347373e-05;-9.4987859483808e-05;-2.4647501049913e-05;-3.5803481296171e-05;-5.0962989917025e-06;2.6510801035329e-05;4.415400326252e-05;9.3792084953748e-05;7.4259340181015e-05;-5.4237643780652e-05;-7.8732746260357e-06;-4.6889173972886e-05;-0.00014553476648871;-9.5945124485297e-06;0.00040711456676945;2.5520073904772e-05;-0.00024127376673277;3.3188578072441e-06;3.4891891118605e-05;9.7116944743902e-06;-2.9459506549756e-05;-1.1001408893208e-05;3.8877726183273e-05;-4.4794556743e-05;-0.00011014740448445;-4.7249145609385e-06;0.00026956203510053;-1.1209298463655e-05;-0.00011283161438769;-5.1238012019894e-06;2.9053222533548e-05;2.2687687305734e-05;-6.352316995617e-05;2.8374265639286e-06;-0.00028255372308195;2.912557874879e-06;-6.2590217567049e-05;6.3024832343217e-05;-1.560846430948e-05;5.8366986195324e-05;5.7323642977281e-05;-0.00014505875878967;6.0118190958747e-06;-0.0001195221193484;-9.4450861070072e-06;0.00019047087698709;-1.9602366592153e-06;0.00022076292952988;-9.3695143732475e-06;1.8489012290956e-05;2.8625820505113e-06;2.6220946892863e-05;-2.1954327166895e-05;6.1003884184174e-05;-7.9605515566072e-06;-0.00011340202763677;-1.6777654309408e-05;-0.00027461827266961;4.5633219087904e-06;-0.0001397265587002;-6.8979374191258e-05;0.00011034403723897;9.1690753833973e-06;-0.00015430385246873;3.860362994601e-06;0.0004018984909635;3.9299655327341e-05;-0.00016686848539393;7.0491812948603e-05;7.7462231274694e-05;5.1010021707043e-05;-4.1569077438908e-05;-1.2507962310337e-05;2.3368659185508e-06;-2.5916700906237e-05;4.3234258555458e-06;0.00018182970234193;-1.5303830878111e-05;0.00025060804910026;2.6312563932152e-06;-9.2956288426649e-05;-1.8598244423629e-05;-9.9388977105264e-05;-2.1449053747347e-05;4.7131430619629e-05;2.5317138351966e-05;-0.00026841822545975;2.4319429940078e-05;5.3747888159705e-05;-3.8271235098364e-05;0.00014438779908232;1.6200468962779e-05;-4.3986776290694e-05;2.1747307982878e-05;-0.00014886373537593;-3.8565129216295e-05;-5.3311247029342e-05;-7.7801059887861e-06;3.748034578166e-05;7.7944561780896e-05;0.00014600326539949;0.0001071795632015;-8.5789783042856e-05;-2.0274379494367e-05;-6.9330286351033e-05;-0.00022024608915672;-1.2459722711355e-05;0.00064474664395675;3.8525355193997e-05;-0.00038322454201989;4.4988964873482e-06;5.1632294344017e-05;1.5505744158872e-05;-4.4397846068023e-05;-1.8700149666984e-05;6.2500665080734e-05;-6.9460926169995e-05;-0.00017895817290992;-5.0191870286653e-06;0.00040023977635428;-1.8477963749319e-05;-0.00018353058840148;-1.1430800441303e-05;5.0632919737836e-05;3.6065604945179e-05;-0.00010528077109484;2.7228143153479e-06;-0.00046233143075369;6.4986593315552e-06;-0.00010848386591533;0.00010395573917776;-1.3088824744045e-05;9.7814816399477e-05;8.1291829701513e-05;-0.00022668186284136;5.377980414778e-06;-0.00019302184227854;-1.3671670785698e-05;0.00032190381898545;-3.01338832287e-06;0.00037136010359973;-1.4166935216053e-05;3.2501051464351e-05;4.2452743400645e-06;4.8207337385975e-05;-3.7246543797664e-05;0.00010527310951147;1.0372296856076e-05;-0.00012315704952925;6.8839194682369e-06;-0.00059111666632816;1.2683591194218e-05;-0.00031412712996826;-0.00011712936975528;0.00021570801618509;1.2800843251171e-05;-0.00023331621196121;-8.6536583694397e-06;0.00065190118039027;6.1388076574076e-05;-0.00030115243862383;3.2159696274903e-05;5.3473078878596e-05;8.4268722275738e-05;-5.0354512495687e-05;0.00011371447908459;-3.4788150514942e-05;0.00011000694939867;-5.6574053814984e-06;0.00019721018907148;-2.2974589228397e-05;0.00049373088404536;1.421352953912e-05;-0.00015330822498072;-2.1078069039504e-05;-0.0001617284870008;-4.3388663470978e-05;9.2402726295404e-05;3.7613667700498e-06;-0.00042501464486122;1.8353923223913e-05;0.0001320860319538;-4.0720824472373e-05;0.00027105875778943;1.4824357094767e-05;-3.8445574318757e-05;4.1441093344474e-05;-0.00027261910145171;-6.0857448261231e-05;-1.0408053640276e-05;-1.086883185053e-05;2.2090283891885e-05;0.00017636320262682;0.00022011094551999;9.3420334451366e-05;-0.00012496960698627;-0.00011160734720761;-6.9472480390687e-05;-0.00030473762308247;1.9126391634927e-06;0.00097764120437205;5.0142072723247e-05;-0.00063940789550543;2.3525758479082e-06;7.1167291025631e-05;2.6567844543024e-05;-6.3178609707393e-05;-3.5729786759475e-05;9.1546120529529e-05;-9.9402481282596e-05;-0.00029248878126964;2.259041502839e-05;0.00044539882219397;-2.4923296223278e-05;-0.00033439177786931;-4.4943193643121e-05;0.00011780519707827;5.7609293435235e-05;-0.00016591278836131;-2.0891689018754e-06;-0.00080524600343779;2.5939827537513e-05;-0.00023829474230297;0.00019849195086863;6.2778039136901e-05;0.00018537174037192;5.3416148148244e-05;-0.00033935767714866;-3.4193275496364e-05;-0.00030119650182314;-1.6279007468256e-05;0.00056151946773753;-1.3699174814974e-05;0.00075015402399004;-2.0375642634463e-05;9.2109694378451e-05;3.2430732517241e-06;0.00010054942686111;-5.3023395594209e-05;0.00015546413487755;5.4729622206651e-05;-5.184274414205e-05;4.8835507186595e-05;-0.00099633831996471;1.7980602933676e-05;-0.00058686477132142;-0.00017635662516113;0.00035962404217571;1.2622534995899e-05;-0.00029175489908084;-3.2977059163386e-05;0.00093704403843731;8.5379542724695e-05;-0.00048078605323099;-9.6843890787568e-05;-2.8183718313812e-05;0.0001449936098652;-2.9364149668254e-05;0.00034262420376763;-0.00010421243496239;0.00033830618485808;-2.992243571498e-05;7.3727962444536e-05;-2.3816792236175e-05;0.00084799004253;3.6462322896114e-05;-0.00023289199452847;-1.9748054910451e-05;-0.00022085702221375;-7.8795826993883e-05;0.00016648705059197;-4.323260509409e-05;-0.00056530587607995;-1.8477927369531e-05;0.00031753943767399;-3.3252999855904e-05;0.00046518503222615;3.3323126444884e-06;-5.59957106816e-06;6.8458313762676e-05;-0.00046844477765262;-9.045701881405e-05;0.00014908994489815;-1.3004264474148e-05;-3.4573873563204e-05;0.00030718866037205;0.00030540543957613;2.2309312043944e-05;-0.00014927520533092;-0.00028908741660416;-2.7868691176991e-05;-0.00041218704427592;3.7468911614269e-05;0.0012613605940714;6.1438135162462e-05;-0.00097823888063431;-1.3638250493386e-06;9.0727909991983e-05;4.1266619518865e-05;-8.8091917859856e-05;-5.3655006922781e-05;0.00010400724568171;-0.00012323255941737;-0.0003929584636353;7.9729703429621e-05;0.00038645471795462;-2.5367253329023e-05;-0.00055026391055435;-0.00010403999476694;0.00022577747586183;7.8077042417135e-05;-0.00020675764244515;-8.9278664745507e-06;-0.0012100486783311;6.0068428865634e-05;-0.00042476280941628;0.00031951928394847;0.0002028028247878;0.00030536847771145;-2.9744061976089e-05;-0.00045276200398803;-0.00011536971578607;-0.00040621304651722;-1.6366018826375e-05;0.00077491113916039;-3.6123747122474e-05;0.0012934644473717;-2.6346635422669e-05;0.00020364923693705;-9.5045265879889e-07;0.00015005991735961;-5.427192809293e-05;0.0001864626101451;8.3115985034965e-05;0.00010160161764361;1.1301860467938e-05;-0.0011328522814438;1.6589461665717e-05;-0.00066364504164085;-0.00022187235299498;0.00048048869939521;-6.2693820837012e-06;-0.00029265147168189;-6.9318324676715e-05;0.0014418866485357;0.0001001206037472;-0.00064259843202308;-0.00024949864018708;-0.00012269809667487;0.00012525856436696;4.6403278247453e-05;0.0004898997140117;-7.9833320342004e-05;0.00045720563502982;-1.4903652299836e-05;-0.00027281208895147;-6.3179845710692e-06;0.00090695504331961;6.5469146647956e-05;-0.00037133196019568;-1.3956740076537e-05;-0.00029792712302878;-0.00011093916691607;0.0002324699453311;-8.29125274322e-05;-0.00067312747705728;-7.5838768680114e-05;0.00044535732013173;-2.0166966351098e-05;0.00070271326694638;3.4490192035719e-08;1.2665092071984e-05;8.6831154476386e-05;-0.00068164867116138;-0.00012158005847596;0.00032342199119739;-2.0341918570921e-05;-3.1561721698381e-05;0.00042090375791304;0.00038676540134475;-9.8952143162023e-05;-0.00017740784096532;-0.00044162478297949;4.7525165427942e-05;-0.00050272804219276;8.5481427959166e-05;0.0015233204467222;7.3347255238332e-05;-0.0013316221302375;-4.3202858250879e-06;0.000164095647051;5.9518544730963e-05;-0.00018967837968376;-7.3497802077327e-05;0.00012824829900637;-0.00014402397209778;-0.00050360686145723;0.00015413228538819;0.00022572126181331;-2.5341867512907e-05;-0.00085312209557742;-0.00016343453899026;0.00034213264007121;0.00010132478200831;-0.00026559864636511;-2.564377427916e-05;-0.0015194433508441;8.9402768935543e-05;-0.00050729850772768;0.00041284642065875;0.00027491780929267;0.00043626327533275;-9.1939771664329e-05;-0.00049144407967106;-0.00022291572531685;-0.00037308013997972;-2.5501334675937e-05;0.0010155454510823;-5.1669729145942e-05;0.0017590819625184;-2.7181526093045e-05;0.00030015484662727;1.0877258773689e-06;0.00012388422328513;-3.9786827983335e-05;0.00015186752716545;7.3402028647251e-05;0.00015173596329987;-1.7072183254641e-05;-0.00089234113693237;1.5816274753888e-05;-0.00051253684796393;-0.0001889631676022;0.00042101703002118;-1.5838604667806e-05;-0.00021621692576446;-6.9802379584871e-05;0.0013048805994913;8.1766964285634e-05;-0.00055123289348558;-0.00026168840122409;-0.00015272966993507;6.227835547179e-05;7.8836812463123e-05;0.00043525581713766;-3.3772957976907e-05;0.00040873268153518;9.2389876726884e-07;-0.00037034790148027;1.9572951259761e-06;0.00067397649399936;6.2897022871766e-05;-0.00033540348522365;-6.6853626776719e-06;-0.00026092596817762;-9.920777665684e-05;0.00020631909137592;-8.1878621131182e-05;-0.00055554939899594;-8.4227998740971e-05;0.00038371322443709;-8.5091069195187e-06;0.0006413203664124;5.9583526308415e-06;7.9975501421359e-07;7.520130748162e-05;-0.00060695421416312;-0.00010285428288626;0.00030793630867265;-2.2146328774397e-05;8.1257248893962e-06;0.00036995124537498;0.0003223029198125;-0.00013756574480794;-0.00014563197328243;-0.00039694365113974;7.5284908234607e-05;-0.00041091509046964;8.5009414760862e-05;0.0012614326551557;6.0593767557293e-05;-0.0011647149221972;-6.1469645515899e-06;0.00015607480600011;5.3070820285939e-05;-0.00018984846246894;-6.5880500187632e-05;0.00010795378329931;-0.00010824594937731;-0.00043633097084239;0.00016931630671024;3.8378984754672e-05;-1.2445578249753e-05;-0.00078629003837705;-0.00015477098349947;0.00031196445343085;8.8552915258333e-05;-0.00022773923410568;-1.9258350221207e-05;-0.001287852297537;8.5018698882777e-05;-0.00042532358202152;0.0003486848436296;0.00024051211948972;0.00039098924025893;-0.00011353766603861;-0.0003558978496585;-0.00023482584219892;-0.00023595268430654;-3.4307438909309e-05;0.00089467997895554;-5.5571468692506e-05;0.0015364218270406;-2.2536974938703e-05;0.00026546220760792;-2.2221586277738e-06;0.00010105413821293;-0.00022468772658613;7.455465674866e-05;8.4375984442886e-05;-2.2119307686808e-05;0.00095370365306735;-4.9098011913884e-06;0.0003027144994121;-5.5384221923305e-05;-0.00034071900881827;0.00015568002709188;0.00042769990977831;-2.6273870389559e-05;-0.001097567146644;5.559704368352e-05;0.00044269382487983;-5.5554777645739e-05;9.5677161880303e-05;0.00017055941862054;8.2824284618255e-05;-0.00038576370570809;-3.0466686439468e-05;-0.00049586565000936;5.2929965477233e-07;-0.0001310652733082;-2.113925603453e-07;-0.00041096701170318;1.8101258319803e-05;0.00022597465431318;-2.8905904400744e-05;0.00023245393822435;-1.2678131497523e-05;0.0002326345857;-9.2219437647145e-05;-0.00082639383617789;-8.0362413427792e-05;-0.00013301607395988;-2.6241628802381e-05;0.0006269141449593;2.6768357201945e-05;-0.00016124201647472;9.35970529099e-05;-0.00077643623808399;6.4892148657236e-05;-0.0001006357560982;-3.9527440094389e-05;0.00028219030355103;-5.903609780944e-05;0.00044670546776615;0.00023724959464744;-0.00024526452762075;-0.00027212905115448;-0.00018609242397361;-0.00010173699411098;6.9149406044744e-05;0.002033137017861;4.4154839997645e-05;-0.0011589889181778;2.7355847123545e-05;0.00021363937412389;-2.0367979232105e-05;-0.00015884333697613;4.0145831007976e-05;0.00015221719513647;-7.3545626946725e-05;-0.0004422074125614;-8.6220112279989e-05;0.00019303501176182;0.00014636205742136;-0.00054672220721841;-5.9643967688316e-05;0.0001614172506379;-0.00011096042726422;-0.00036936887772754;8.4149782196619e-05;-0.001188792521134;-2.6043462639791e-05;-0.00028886494692415;7.1949179982767e-05;0.00033539056312293;0.0003800803096965;0.0004735680995509;-0.00046620186185464;-0.00012225405953359;-0.0004606859292835;-0.00027037426480092;0.0010855278233066;-3.8183046854101e-05;0.0011202502064407;-1.4010811355547e-05;0.00021196300804149;-1.687307303655e-05;0.00017077635857277;-5.7342635955138e-06;-0.00023513232008554;7.6652147981804e-05;0.00014207037747838;-9.3920098152012e-06;0.001075210631825;-1.3018145182286e-05;0.00035658141132444;-6.0860518715344e-05;-0.00036851133336313;0.00017646636115387;0.00047404738143086;-2.9245953555801e-05;-0.0012221281649545;5.2669885917567e-05;0.00049480726011097;-6.8361441663001e-05;4.9484435294289e-05;0.0001404795475537;5.876705472474e-05;-0.00037581988726743;-8.3597578850458e-06;-0.00051194260595366;1.9749093553401e-05;-0.00022343329328578;-3.5642533475766e-06;-0.00049745134310797;2.7455793315312e-05;0.00025884513161145;-2.7426067390479e-05;0.00025771584478207;-6.3551851781085e-06;0.00021688870037906;-8.342075307155e-05;-0.00090026698308066;-8.3162951341365e-05;-7.4056290031876e-05;-3.2320571335731e-05;0.00069513526977971;1.5085287486727e-05;-0.00016480624617543;9.3169350293465e-05;-0.00075225648470223;5.5197731853696e-05;-9.1870606411248e-05;-5.388294448494e-05;0.00027075147954747;-5.5903212341946e-05;0.00048156979028136;0.00029286873177625;-0.00022398044529837;-0.00030830007744953;-0.00021072954405099;-0.00019603691180237;6.4291576563846e-05;0.0021812887862325;6.0130620113341e-05;-0.0012912374222651;3.5742243198911e-05;0.00019784180040006;-1.2738480108965e-05;-0.00016743686865084;4.2445313738426e-05;0.00017967671738006;-7.781865861034e-05;-0.0004912989679724;-0.0001040497518261;0.00031507716630585;0.00012669184070546;-0.00058835610980168;-8.0854035331868e-05;0.00017498072702438;-0.00011089462350355;-0.00042339312494732;8.9717628725339e-05;-0.0013030378613621;-3.5626377211884e-05;-0.00031730861519463;7.2552895289846e-05;0.00034751949715428;0.00036972557427362;0.00050772953545675;-0.00052837294060737;-8.5258448962122e-05;-0.00054144958266988;-0.00024808582384139;0.0012083749752492;-3.4406995837344e-05;0.0012173606082797;-2.0777461031685e-06;0.00020520522957668;-1.4830845429969e-05;0.00017438163922634;-1.8734998548098e-06;-0.00016589934239164;4.9137539463118e-05;0.00020927490550093;3.3183176128659e-05;0.00077638373477384;2.3331827833317e-05;0.00018166717200074;-5.3728534112452e-05;-0.00024289549037348;0.00012173774302937;0.00038628227775916;-2.0550618501147e-05;-0.0010952909942716;2.7628324460238e-05;0.00032184584415518;-4.8892190534389e-05;-7.0688460255042e-05;7.6877280662302e-05;9.1870599135291e-05;-0.00018046409240924;8.6862082753214e-06;-0.00035322233452462;-3.1368213967653e-05;-0.00030408528982662;-2.6774450816447e-05;-0.00020915841741953;2.6842959414353e-05;0.00022904911020305;-1.175663783215e-05;0.00024927823687904;1.6981309727271e-06;9.5810552011244e-05;-3.229251888115e-05;-0.00074517505709082;-4.7733832616359e-05;-0.00022894484573044;2.2662434275844e-06;0.0004973717732355;1.1787326002377e-05;-0.00012366620649118;6.5963940869551e-05;-0.00040510282269679;1.8501375961932e-05;-0.00018600275507197;-4.2100160499103e-05;0.00016256001254078;-3.3002183045028e-05;0.00035619572736323;0.00022247493325267;-0.0001309807121288;-0.00013038856559433;-0.00018919771537185;-0.00012358803360257;6.2686281125934e-06;0.0017676663119346;4.8377303755842e-05;-0.00088950380450115;1.880708259705e-05;0.00011575534153963;-9.8649577395804e-09;-0.00010948809358524;2.7370539100957e-05;0.00020752706041094;-7.1823451435193e-05;-0.00049071072135121;-7.4023191700689e-05;0.00010334773105569;7.4771065555979e-05;-0.00045080514973961;-7.0217764005065e-05;0.00012169203546364;-6.0260816098889e-05;-0.00047404316137545;7.6414580689743e-05;-0.0010595400817692;-2.677203337953e-05;-0.00022258741955739;4.1179358959198e-05;0.00021135082351975;0.00014148958143778;0.0003342455602251;-0.00028007570654154;1.7360980564263e-06;-0.00030804908601567;-0.00012766291911248;0.001269493252039;-4.2564912291709e-05;0.00093292439123616;7.725068826403e-06;0.0001117081992561;-9.0306903075543e-06;0.00012799675459974;4.5655510803044e-06;-0.00010908348485827;3.0693499866175e-05;0.00026952387997881;5.822226012242e-05;0.00054470979375765;2.9788925530738e-05;7.3152819823008e-05;-4.9318136007059e-05;-0.00014784726954531;8.7604348664172e-05;0.00031420093728229;-1.7792654034565e-05;-0.00081575236981735;1.4003069281898e-06;0.00020253680122551;-4.0783856093185e-05;-0.00016852139378898;-7.9747069321456e-06;8.198014984373e-05;-1.364712989016e-05;4.0536764572607e-05;-0.00019827128562611;-3.8003083318472e-05;-0.00043521550833248;-3.3044063457055e-05;-7.2242910391651e-05;3.3890592021635e-05;0.00017255418060813;3.443476771281e-06;0.00019064360822085;1.2615591913345e-05;2.6227316993754e-05;-3.7983174934197e-06;-0.00058179337065667;-1.1564412488951e-05;-0.00028619417571463;2.3111315385904e-05;0.00034289751783945;-1.0080623269459e-06;-0.00011504573922139;5.4786814871477e-05;-0.00018420511332806;-1.92645484276e-06;-0.00023985424195416;-3.1177303753793e-05;0.00012101469474146;-2.0544563085423e-05;0.00023068633163348;0.00016869053069968;-4.0955583244795e-05;-6.3726574808243e-06;-0.00015465127944481;-0.00010033519356512;-3.7356745451689e-05;0.0013919306220487;2.7629312171484e-05;-0.00060288503300399;1.5188960787782e-05;6.1231694417074e-05;8.3416825873428e-06;-6.7387678427622e-05;1.5319092199206e-05;0.00019015521684196;-5.5613258155063e-05;-0.0003971362602897;-5.4737505706726e-05;0.00017993563960772;2.0672401660704e-05;-0.00028458758606575;-7.0623522333335e-05;5.9507146943361e-05;-1.7988861145568e-05;-0.00042861650581472;5.8833709772443e-05;-0.0007709925994277;-1.7567082977621e-05;-0.00012218573829159;1.8595852452563e-05;0.00011063918645959;2.4506651243428e-05;0.00022170205193106;-0.00018804031424224;6.6048283770215e-05;-0.00025382422609255;-3.1677991501056e-05;0.0010609495220706;-3.9137095882325e-05;0.00057878810912371;1.8776461729431e-05;3.5727985959966e-05;-5.3983440011507e-06;8.7650994828437e-05;5.6377557484666e-06;-5.8143439673586e-05;1.4954054677219e-05;0.00025557589833625;6.1131366237532e-05;0.00033578951843083;2.76675382338e-05;8.2892011050717e-06;-4.0271748730447e-05;-7.9137731518131e-05;5.9514029999264e-05;0.0002199749724241;-1.2746095308103e-05;-0.00053690391359851;-1.4768640539842e-05;0.00011455786443548;-3.2536707294639e-05;-0.00019252773199696;-5.3922824008623e-05;6.1177626776043e-05;7.7843913459219e-05;5.2189334383002e-05;-8.2376813224982e-05;-3.3987078495556e-05;-0.00042977769044228;-3.036774796783e-05;1.767611820469e-06;3.4645348932827e-05;0.00011612021626206;1.1401391020627e-05;0.00012684249668382;1.8025773897534e-05;-1.0874146028073e-05;9.6763214969542e-06;-0.00040333176730201;9.8349000836606e-06;-0.00025332672521472;2.856685568986e-05;0.00021616165759042;-9.5000877990969e-06;-9.8531119874679e-05;4.2681276681833e-05;-4.2813626350835e-05;-1.0826717698365e-05;-0.00022373547835741;-2.1635010853061e-05;9.1744819656014e-05;-1.1988852747891e-05;0.00012873862578999;0.00011950705811614;1.5086583516677e-05;5.1762268412858e-05;-0.00011124208685942;-8.519362017978e-05;-5.4428888688562e-05;0.0009736951906234;1.1695002285705e-05;-0.00037727935705334;1.3371587556321e-05;2.4381581170019e-05;1.1435936357884e-05;-4.0741677366896e-05;7.1094914346759e-06;0.00014675736019854;-3.6492387152975e-05;-0.00027848826721311;-3.7260062526911e-05;0.00021442225261126;-1.1049901331717e-05;-0.00015180079208221;-6.0825972468592e-05;1.7859223589767e-05;6.0037054936402e-06;-0.00032754271524027;3.9676313463133e-05;-0.00049425271572545;-9.4656688816031e-06;-5.1117476687068e-05;5.0968328650924e-06;4.0974162402563e-05;-3.393257065909e-05;0.00013307650806382;-0.00012032788799843;8.9625638793223e-05;-0.00019937395700254;2.2287646061159e-05;0.00076674780575559;-3.0610626708949e-05;0.00029737778822891;2.1003939764341e-05;-1.5196411368379e-05;-2.7302085072733e-06;5.4951815400273e-05;4.6066325012362e-06;-1.6291003703373e-05;4.9443973693997e-05;-3.8720561860828e-05;-0.00020806182874367;-3.975469735451e-05;-0.00023674026306253;1.8768781956169e-05;1.1571132745303e-05;-5.2371731726453e-05;7.7511416748166e-05;5.941619292571e-06;-0.00015841070853639;1.1014891242667e-05;0.00044917344348505;3.174738958478e-05;-0.00011292820272502;0.0001569854648551;8.8343993411399e-05;-4.0664472180652e-05;-6.7143962951377e-05;-6.9124434958212e-05;5.8777841331903e-05;-3.2698400900699e-05;3.0424193028011e-05;0.00031724057043903;-2.5730274501257e-05;3.2879277569009e-05;-5.464888545248e-06;-9.4525988970418e-05;-1.6486455933773e-05;-0.00012470611545723;-4.6745926738367e-06;6.9511756919383e-06;4.2150677472819e-05;-0.00029764126520604;4.7975358029362e-05;-0.00016260615666397;-3.4017222787952e-05;0.00011043937411159;2.9636157705681e-05;-7.468719559256e-05;1.2190218512842e-05;-3.8384408981074e-05;-2.6552743292996e-05;-0.00020203036547173;-1.1402979907871e-05;8.7527936557308e-05;6.1633443692699e-05;0.00011416178313084;0.00010448407556396;-0.00010591011960059;8.6270425526891e-05;-8.6683336121496e-05;-0.00012691465963144;-2.4589078748249e-05;0.0007171604083851;3.0411829357035e-05;-0.00027225032681599;2.8590063720912e-06;4.3273990741e-05;1.2726134627883e-05;-4.1507519199513e-05;-2.7194155336474e-05;9.9789700470865e-05;-5.6953631428769e-05;-0.00022808292123955;-1.0929356903944e-05;0.00031878799200058;-2.8733025828842e-05;-0.00015887891640887;4.1272519410995e-06;2.1435738744913e-05;4.0740054828348e-05;-0.00018922162416857;-1.1225906746404e-06;-0.00044096479541622;-2.6163156690018e-06;-4.1147897718474e-05;6.7053428210784e-05;-4.9069905799115e-05;9.6422605565749e-05;0.00010128584835911;-0.00015922915190458;1.4352500329551e-05;-0.00016368333308492;-2.5364874090883e-05;0.0005220586899668;1.0078640116262e-05;0.00024869255139492;-1.0506104445085e-05;-1.9991157387267e-05;6.7750993366644e-06;6.2089624407236e-05;-3.4761054848786e-05;0.00010059034684673;-3.5754001146415e-05;-0.0002444582642056;-3.4642813261598e-05;-0.00048794169561006;3.2782805647003e-05;-6.4300766098313e-05;-8.7947308202274e-05;0.00016075196617749;1.2128738489992e-05;-0.00025031666154973;-6.6538937062433e-06;0.00069315871223807;4.5450349716702e-05;-0.00020997402316425;0.00014607771299779;5.6703807786107e-05;-6.4360938267782e-05;-7.2677205025684e-05;2.7670919735101e-05;5.5770109611331e-05;9.5632989541627e-05;3.5215343814343e-05;0.00037306698504835;-3.0939580028644e-05;0.0001331836101599;4.157254807069e-06;-0.00014635262778029;-1.3179362213123e-05;-0.00018808145250659;-2.403882353974e-05;4.641200939659e-05;2.4864855731721e-05;-0.00047225196612999;5.6750512158033e-05;-0.00021411477064248;-2.8032151021762e-05;0.00021662950166501;4.0615570469527e-05;-9.4299226475414e-05;3.0780389352003e-05;-0.00015779217937961;-3.6415891372599e-05;-0.00024171608674806;-1.9232489648857e-05;0.00011713262210833;0.00015813652134966;0.00015773318591528;6.8675341026392e-05;-0.00015552777040284;5.3956970077707e-05;-8.6790481873322e-05;-0.0001337301946478;-1.8512171664042e-05;0.0011015634518117;3.2274165278068e-05;-0.00046131465933286;-3.1301633498515e-06;7.9049808846321e-05;2.1707361156587e-05;-5.9383288316894e-05;-5.1647177315317e-05;0.00014207608182915;-7.798465230735e-05;-0.00035432950244285;2.8030104658683e-05;0.00032488949364051;-3.592062057578e-05;-0.00029106342117302;-2.1454186935443e-05;6.5088592236862e-05;6.8294742959552e-05;-0.0002772445732262;-5.3569447118207e-06;-0.00073744432302192;1.2302295544941e-05;-0.00011409822036512;0.00015780705143698;3.0652274290333e-05;0.00018766314315144;6.264507828746e-05;-0.0002505106094759;-4.1414063161938e-05;-0.00024555157870054;-3.8347650843207e-05;0.00080567447002977;3.1637061965739e-06;0.00052292557666078;-1.7214453691849e-05;3.2831947464729e-05;6.0611791923293e-06;0.00010947632108582;-6.4994899730664e-05;0.00018063849711325;-1.3629321074404e-05;-0.00024720342480578;-9.1548145064735e-06;-0.00088483071886003;5.0671245844569e-05;-0.00024065061006695;-0.00014954942162149;0.00030763793620281;2.1914373064646e-05;-0.00037048873491585;-4.0291506593348e-05;0.00099052581936121;6.8424713390414e-05;-0.0003832423244603;7.5974181527272e-05;-1.3600370039057e-05;-7.0466303441208e-05;-6.6987908212468e-05;0.0002209559752373;2.1893614757573e-05;0.00032127677695826;3.0165176212904e-05;0.00038475231849588;-3.5031440347666e-05;0.00036994394031353;2.4098564608721e-05;-0.00021837213716935;-6.149780801934e-06;-0.00025422946782783;-6.6384352976456e-05;0.0001333809341304;-1.473474821978e-05;-0.00070633209543303;4.9127371312352e-05;-0.00019704383157659;-1.6334246538463e-05;0.00041461779619567;5.681740003638e-05;-0.00012171594426036;6.6687767684925e-05;-0.0004026745154988;-5.2678380598081e-05;-0.00022580605582334;-3.3141761377919e-05;0.00016456957382616;0.0003148224495817;0.00023056633654051;-1.5225720744638e-05;-0.00021557124273386;-5.4638527217321e-05;-5.8213910961058e-05;-0.00017153455701191;-1.2663945199165e-06;0.0016178236110136;3.7251800677041e-05;-0.00080166582483798;-1.4420455954678e-05;0.00013637469965033;3.6566230846802e-05;-8.9223416580353e-05;-8.393944153795e-05;0.00017790535639506;-0.00010586768621579;-0.00049334339564666;0.000102238409454;0.00035816570743918;-4.3605225073406e-05;-0.0004990270244889;-7.2422291850671e-05;0.00014107297465671;0.00010610470781103;-0.00036241434281692;-9.9243525255588e-06;-0.0011642263270915;4.2870891775237e-05;-0.00023817206965759;0.00031240485259332;0.00021543535694946;0.00035031751031056;-3.3448253816459e-05;-0.00042744187521748;-0.0001559401571285;-0.0004042517975904;-5.429916200228e-05;0.0011026051361114;-1.362108378089e-05;0.00095786311430857;-2.8490219847299e-05;0.00014537684910465;1.238303525497e-06;0.00017683551413938;-8.1739526649471e-05;0.000230289879255;5.1788115342788e-06;-0.00019065033120569;-1.3453699466481e-05;-0.0010723264422268;6.0740698245354e-05;-0.00030923334998079;-0.0001853065477917;0.0004028705006931;2.2288706531981e-05;-0.00042575332918204;-7.0391288318206e-05;0.0012460872530937;7.8430202847812e-05;-0.00049452163511887;-1.1683981028909e-05;-8.8164393673651e-05;-0.0001016437963699;-3.2375366572523e-05;0.00035482144448906;2.2916497982806e-05;0.00046723213745281;3.4275486541446e-05;0.0002739553747233;-2.8753909646184e-05;0.0004428511892911;4.213801730657e-05;-0.00028182359528728;2.6554080250207e-06;-0.00029891051235609;-0.0001015432208078;0.00020408496493474;-4.7832319978625e-05;-0.0008470150642097;3.2687505154172e-05;-0.00019863351189997;2.1107945258336e-07;0.00057135563110933;7.180330430856e-05;-0.00014419200306293;9.4537856057286e-05;-0.00060872035101056;-6.1579317844007e-05;-0.00018947114585899;-4.6625056711491e-05;0.0002170534862671;0.00042527832556516;0.00026906386483461;-0.0001137481740443;-0.0002503014402464;-0.00013833261618856;-1.6309099009959e-05;-0.00016893816064112;1.5354569768533e-05;0.0019452993292361;3.8056463381508e-05;-0.0010394918499514;-2.5063241992029e-05;0.00020039771334268;4.8570196668152e-05;-0.00013595778727904;-0.00010652300261427;0.00019673196948133;-0.0001185362416436;-0.00057691108668223;0.00017033229232766;0.00030647678067908;-4.5802538807038e-05;-0.00066879997029901;-0.00011268435628153;0.00019911708659492;0.00013195499195717;-0.0004119970544707;-1.57497543114e-05;-0.0014127551112324;6.5826818172354e-05;-0.00029450838337652;0.00041653870721348;0.00034975673770532;0.00047122201067396;-0.00011861383245559;-0.0005204159533605;-0.00025933326105587;-0.00046568864490837;-6.7869208578486e-05;0.0012818791437894;-2.6734574930742e-05;0.0012415155069903;-3.4856053389376e-05;0.00023132642672863;-1.5242483186739e-06;0.00019662486738525;-6.8611814640462e-05;0.00019740856077988;1.470698043704e-05;-8.6109546828084e-05;-2.9170609195717e-05;-0.00085700658382848;5.0084927352145e-05;-0.00024053998640738;-0.00015564989007544;0.00035010164720006;1.3908344044467e-05;-0.00034611861337908;-7.0081900048535e-05;0.001107013435103;6.1850420024712e-05;-0.00042232882697135;-7.1012764237821e-05;-0.00011645314225461;-0.00010863551142393;1.1242861546634e-05;0.00032700487645343;3.6467816244112e-05;0.0004155651840847;3.2351781555917e-05;9.9145967396908e-05;-1.4086549526837e-05;0.00032386172097176;4.2184423364233e-05;-0.0002469444880262;7.5248999564792e-06;-0.00025767358602025;-9.9584758572746e-05;0.0001990117598325;-5.2885126933688e-05;-0.00071721785934642;1.871443237178e-05;-0.00017642887542024;1.1468574484752e-05;0.00051081378478557;6.6652733949013e-05;-0.00012830855848733;9.0577530500013e-05;-0.00059123343089595;-4.8908477765508e-05;-0.0001322440803051;-4.5254088036017e-05;0.00021020221174695;0.00037953857099637;0.00021365389693528;-0.00014589318016078;-0.00020634823886212;-0.00013874690921512;1.0017969543696e-05;-0.00010449818364577;1.5799540051376e-05;0.0016614625928923;2.8407346690074e-05;-0.00090769684175029;-2.6905812774203e-05;0.00020224871695973;4.3887503125006e-05;-0.0001403027708875;-9.2298032541294e-05;0.00015756602806505;-9.2978203610983e-05;-0.00048635632265359;0.00017371581634507;0.00017104503058363;-3.2638145057717e-05;-0.00060055026551709;-0.00010756221308839;0.00018251099390909;0.00011340987839503;-0.00032899624784477;-1.277342926187e-05;-0.001186179346405;6.3116720411927e-05;-0.00024919272982515;0.00036753213498741;0.00032534773345105;0.00041652185609564;-0.00014108211325947;-0.00041691501974128;-0.00025572694721632;-0.00035816276795231;-6.2063110817689e-05;0.0010607182048261;-3.1457107979804e-05;0.001084491610527;-2.9932232791907e-05;0.00021410468616523;-3.3564738259884e-06;0.00015813998470549;-0.00018083072791342;6.6917797084898e-05;0.00018291895685252;-9.7057854873128e-06;0.00078819016925991;-4.0760700358078e-05;0.00020059706002939;-5.7254343118984e-05;-0.00021579231543001;0.00010065361129818;0.00037264157435857;-3.4582000807859e-05;-0.00049911870155483;2.830003904819e-05;0.00027540681185201;-3.5057884815615e-05;9.9628584848688e-07;9.5653114840388e-05;7.6987264037598e-05;-0.00027222177595831;2.4677652618266e-05;-0.00039971459773369;3.1872859835858e-05;-0.00041311830864288;1.3430508261081e-05;-0.00031505626975559;2.8046650186297e-05;9.0235524112359e-05;-9.7703186838771e-06;0.00011482887202874;-9.3710450528306e-06;0.00017549407493789;-7.0071619120426e-05;-0.00061137008015066;-4.2726191168185e-05;-0.00029813408036716;1.3165837117413e-05;0.00037429199437611;2.7788018996944e-05;-0.00014301561168395;7.9018383985385e-05;-0.00056117685744539;5.3783187468071e-05;-0.00021487007325049;-7.7741524364683e-06;0.00022950864513405;-4.6251603635028e-05;0.00029196101240814;0.00011525016452651;-0.00016932892322075;-8.9111330453306e-05;-0.00013371193199418;4.6123273932608e-05;2.2891474145581e-05;0.0015354233328253;3.1346919513453e-06;-0.0006778109818697;8.118412551994e-06;0.00014927124720998;-2.112660149578e-05;-6.0823615058325e-05;2.2079942937125e-05;0.00010011438280344;-5.3537653002422e-05;-0.00026904945843853;-5.5690852605039e-05;0.00029709035879932;9.2796304670628e-05;-0.00027738907374442;-4.8927435273072e-05;6.2569124565925e-05;-6.1582431953866e-05;-0.0002583381428849;6.0058122471673e-05;-0.00076580885797739;-1.2751925169141e-05;-0.00014742482744623;4.5025211875327e-05;0.00024630493135192;0.00033796255593188;0.00033970893127844;-0.00040908314986154;-0.00010254650987918;-0.00043693603947759;-0.00018943900067825;0.00068420480238274;-2.6701152819442e-05;0.00058474572142586;-3.1459910587728e-06;0.00015074721886776;-1.5022876141302e-05;0.00014003834803589;-7.9906330938684e-06;-8.7008767877705e-05;2.2683867427986e-05;0.00026459296350367;6.194941670401e-05;0.00046779765398242;3.0853458156344e-05;-1.1939788237214e-05;-5.2634204621427e-05;-0.0001083414972527;5.4630869271932e-05;0.00026277991128154;-1.3025894077145e-05;-0.00069176667602733;5.5583072935406e-06;0.00011707374505932;-2.0810568457819e-05;-0.00016812350077089;2.6648343919078e-05;0.00014540192205459;-2.7865729862242e-05;4.0476035792381e-05;-0.00023237176355906;-6.4604741055518e-05;-0.00041292491368949;-4.1002203943208e-05;8.0231904576067e-05;2.9608039767481e-05;0.00012794647773262;4.3372597247071e-06;0.00018876809917856;1.0820457418959e-06;-1.7771737475414e-05;1.1524735782587e-05;-0.00050973286852241;-2.171198502765e-05;-0.00039124899194576;4.0833412640495e-05;0.00022074047592469;1.6241570847342e-05;-9.3223105068319e-05;4.5621407480212e-05;-4.0571572753834e-05;-6.081568699301e-06;-0.00030587252695113;-1.3319264326128e-05;0.00011388309212634;-1.6890084225452e-05;0.00021681693033315;9.9905402748846e-05;-5.6481312640244e-05;4.6455319534289e-05;-0.00014227261999622;4.0934384742286e-05;-4.2445513827261e-05;0.0011437756475061;2.3298460291699e-05;-0.00036418362287804;-4.5115511966287e-06;2.915513687185e-05;1.6623088185952e-06;-3.4529297408881e-05;9.9993376352359e-06;0.00018505097250454;-5.5571694247192e-05;-0.00040298124076799;-3.588219624362e-05;-8.8457847596146e-05;2.6212095690425e-05;-0.00020882119133603;-4.7024739615154e-05;3.8210211641854e-05;-9.871119800664e-06;-0.00041094998596236;5.1653947593877e-05;-0.00065021502086893;-1.7268459487241e-05;-9.4581191660836e-05;9.6422536444152e-06;9.2582376964856e-05;4.9567292990105e-06;0.0001471286668675;-6.7393841163721e-05;3.4081931516994e-05;-0.0001092589518521;-3.1752770155435e-05;0.0011013827752322;-3.564081271179e-05;0.00044476197217591;1.596518450242e-05;-5.7786069191934e-06;-2.2165536393004e-06;0.00011547962640179;6.5574386098888e-06;-6.4172090787906e-05;1.5511228411924e-05;0.00031658800435252;7.3745686677285e-05;0.0004200265975669;2.7386064175516e-05;-3.4292439522687e-05;-5.3300107538234e-05;-7.9531469964422e-05;4.9504666094435e-05;0.00023766198137309;-1.2778503332811e-05;-0.00057012500474229;-8.77088677953e-06;9.0771842224058e-05;-2.3308924937737e-05;-0.00022321703727357;-2.1192023268668e-05;0.00012847609468736;4.2738472984638e-05;6.3886131101754e-05;-0.00017206555639859;-5.6511093134759e-05;-0.00052379246335477;-4.1874904127326e-05;8.9033354015555e-05;3.7659006920876e-05;0.00011641233140836;1.1718520909199e-05;0.00015455204993486;9.2604741439573e-06;-3.8457150367321e-05;2.0106703232159e-05;-0.0004529919824563;-1.5198306755337e-06;-0.00040466309292242;4.4174452341394e-05;0.00018816352530848;6.7002038122155e-06;-9.8787451861426e-05;4.4310741941445e-05;3.3712767617544e-05;-1.3657869203598e-05;-0.00032161601120606;-1.2108821465517e-05;0.00010091809963342;-1.3106378901284e-05;0.00016046370728873;9.3106646090746e-05;-1.5479941794183e-05;9.1177767899353e-05;-0.00012808485189453;1.9967377738794e-05;-6.0203838074813e-05;0.0010434566065669;1.3794648111798e-05;-0.00029642987647094;-4.7848703843556e-07;1.6890370488909e-06;6.8448775891738e-06;-1.6624642739771e-05;5.623120614473e-06;0.0001795308344299;-4.8406291170977e-05;-0.00035178542020731;-2.8834276236012e-05;1.6105710528791e-05;9.2199655910008e-07;-0.00015146289661061;-5.5333264754154e-05;1.3463656614476e-05;6.4529858718743e-06;-0.00041258678538725;4.5633805711986e-05;-0.00056605553254485;-1.1768329386541e-05;-5.6579625379527e-05;2.8742558697559e-06;4.605504727806e-05;-3.1138955819188e-05;0.00012501822493505;-6.2354250985663e-05;7.0262482040562e-05;-0.00013868992391508;7.2644147621759e-06;0.0010200017131865;-3.7171914300416e-05;0.00031812977977097;2.2052197891753e-05;-2.4739016225794e-05;-1.6529140793864e-06;9.9427685199771e-05;5.3646558626497e-06;-2.1313482648111e-05;1.61598120485e-06;0.00031117480830289;7.5130017648917e-05;0.00029978482052684;2.2191077732714e-05;-5.867760773981e-05;-4.7131477913354e-05;-3.9886122976895e-05;3.6004981666338e-05;0.00015647409600206;-7.4329059316369e-06;-0.00038496634806506;-2.2747182811145e-05;4.7182940761559e-05;-2.1817690139869e-05;-0.00024221898638643;-5.9242996940156e-05;0.00010124306572834;0.00010345647751819;7.6615149737336e-05;-9.2446782218758e-05;-4.6213648602134e-05;-0.00052129034884274;-3.9104117604438e-05;0.00010315042891307;4.134549817536e-05;9.0190696937498e-05;1.738248829497e-05;0.00010568767174846;1.585945210536e-05;-6.1251099396031e-05;2.7568219593377e-05;-0.00032560658291914;1.5303339750972e-05;-0.0003466427733656;4.1350853280164e-05;0.00012276889174245;-2.7647811293718e-06;-8.7392254499719e-05;3.5293745895615e-05;0.0001349544909317;-1.9487410099828e-05;-0.0002866156573873;-9.4756660473649e-06;7.564097904833e-05;-7.0559453888563e-06;8.7497093772981e-05;7.3805451393127e-05;2.6999787223758e-05;0.00011395566980354;-9.6071715233847e-05;-1.5631326277799e-06;-6.9978137616999e-05;0.00075190968345851;4.3358904804336e-06;-0.0001780427119229;2.8503241082944e-06;-3.3249729312956e-05;1.0548956197454e-05;-4.0196914596891e-07;8.1621652725516e-07;0.00014738309255335;-3.2927749998635e-05;-0.00025840039597824;-1.7739615941537e-05;6.26893597655e-05;-2.3567388780066e-05;-7.2866445407271e-05;-5.2313782362035e-05;-9.6930480140145e-06;2.072676034004e-05;-0.00035045869299211;3.1657047657063e-05;-0.00039732010918669;-5.9255335145281e-06;-1.7404390746378e-05;-4.5019173740002e-06;-8.8573269749759e-06;-6.9427987909876e-05;7.5324613135308e-05;-2.7211732231081e-05;9.4550436188001e-05;-0.00012097992294002;4.5231547119329e-05;0.00082025211304426;-3.1580464565195e-05;0.00015375003567897;2.4054632376647e-05;-5.6245866289828e-05;2.8197902679494e-07;7.7441436587833e-05;4.0793752305035e-06;-3.0915842330614e-07;1.2744742889481e-05;-5.8173027355224e-05;-0.00028024421771988;-3.6676388845081e-05;-0.0002224550844403;3.0850718758302e-05;0.00010833163105417;-2.8774693419109e-05;3.4918601159006e-05;-2.8437625587685e-06;-9.9421231425367e-05;2.2721656932845e-05;0.00037272219196893;2.1727613784606e-05;-4.7987978177844e-05;0.00021639557962772;7.8179276897572e-05;-0.00010433259740239;-9.3755319539923e-05;-8.1045553088188e-05;8.4704675828107e-05;-3.2527645998925e-06;4.4670836359728e-05;0.00040845829062164;-3.8802831113571e-05;-0.00010909372213064;-1.2850469829573e-05;-8.424626867054e-05;-1.470031838835e-05;-0.00011746042582672;1.7586011381354e-05;-4.6674602344865e-05;4.8373105528299e-05;-0.00024377161753364;5.731657074648e-05;-0.00027884577866644;-2.5420182282687e-05;4.6352393837878e-05;2.8063346690033e-05;-7.2861497756094e-05;-2.4272701466543e-06;0.00013808092626277;-1.4348670447362e-05;-0.00027864603907801;-8.9948034656118e-06;7.8913726611063e-05;2.8881169782835e-05;7.5490897870623e-05;9.9251614301465e-05;-9.632870205678e-05;0.0001432280841982;-9.543432679493e-05;-4.095593249076e-05;-2.7956873964285e-05;0.00056567077990621;1.9690274712048e-05;-0.00010373193799751;3.3033288673323e-06;-1.3399628187472e-05;7.3979831540782e-06;-7.8023222158663e-06;-2.653943374753e-05;0.00011506201553857;-3.2636067771818e-05;-0.00021895571262576;-2.2755024474463e-05;0.00012228100968059;-2.7574815248954e-05;-9.8382835858501e-05;1.7511605619802e-05;-4.4077510210627e-06;3.3818352676462e-05;-0.00025255550281145;-2.4121040951286e-06;-0.00036646830267273;-1.1314850780764e-05;-2.7900146051252e-06;1.6951466932369e-06;-8.6259344243445e-05;5.7353096053703e-05;0.00011396029731259;-5.0477879995015e-05;2.9453254683176e-05;-8.2420316175558e-05;-3.0060287826927e-05;0.0006559697794728;1.8688020645641e-05;0.0001341195020359;-4.6581881179009e-06;-6.584244692931e-05;7.5720336099039e-06;7.9026744060684e-05;-2.1788229787489e-05;6.8166009441484e-05;-5.8611778513296e-05;-0.0003102250630036;-3.7312005588319e-05;-0.00040537261520512;4.265996903996e-05;7.0082896854728e-05;-5.2119150495855e-05;9.3747388746124e-05;7.7211507232278e-06;-0.00019921526836697;3.6631151942856e-06;0.0005581573350355;2.8348958949209e-05;-0.00011162182636326;0.00020748563110828;4.388679008116e-05;-0.0001374753046548;-9.0705179900397e-05;-6.3550883169228e-06;8.9132350694854e-05;0.00010281554568792;4.9471305828774e-05;0.00046582127106376;-3.8552356272703e-05;-6.4678875787649e-05;-5.3556495913654e-06;-0.00011446785356384;-8.485169018968e-06;-0.00016881826741155;1.145913529399e-06;-1.0277426554239e-05;3.3319614885841e-05;-0.00040105113293976;7.3341463576071e-05;-0.00037117625470273;-1.5625235391781e-05;0.00011820320651168;4.0079736209009e-05;-9.3931761512067e-05;1.3107955055602e-05;1.3728278645431e-05;-1.6256071830867e-05;-0.00034004519693553;-1.6024647266022e-05;0.00011371430446161;0.00011152266233694;9.3179980467539e-05;5.9868427342735e-05;-0.000141545504448;0.00014202344755176;-9.4872870249674e-05;-9.0625871962402e-06;-2.6356668968219e-05;0.00091541995061561;1.4444865882979e-05;-0.00022893183631822;-3.3678297768347e-06;3.2354619179387e-05;1.3219529137132e-05;-2.0148947442067e-05;-5.1339990022825e-05;0.00015387371240649;-4.7392415581271e-05;-0.00033290806459263;1.7689724700176e-05;0.00011858085781569;-3.1133255106397e-05;-0.00019783155585174;-6.6256563968636e-07;2.2549309505848e-05;6.0397578636184e-05;-0.00032334050047211;-4.3481659304234e-06;-0.00058966368669644;-4.9302400384477e-07;-4.4360771426e-05;8.5867832240183e-05;-1.7522699636174e-05;0.00012896265252493;7.0015885285102e-05;-0.0001201907871291;-2.3658612917643e-05;-0.00013527445844375;-4.5120392314857e-05;0.00087946408893913;1.1807429473265e-05;0.00032433817978017;-1.1679838280543e-05;-1.5218312910292e-05;6.9161646933935e-06;0.00011167563934578;-4.78122055938e-05;0.00013423127529677;-5.4164494940778e-05;-0.00035456122714095;-2.258712083858e-05;-0.00067928934004158;6.1392602219712e-05;5.5840728236944e-06;-7.8776414738968e-05;0.00016867789963726;2.053322714346e-05;-0.00030222802888602;-2.1088277208037e-05;0.00072081165853888;3.4496188163757e-05;-0.00019004472414963;0.0001839666365413;-2.64709979092e-05;-0.00018533860566095;-8.8389577285852e-05;0.00013101364311296;8.3777689724229e-05;0.00028776677208953;5.0468890549382e-05;0.00054965942399576;-4.1114155465038e-05;1.4040923815628e-05;5.0862172429333e-06;-0.00014899819507264;1.5872839185249e-06;-0.00021223108342383;-2.2046433514333e-05;3.8726400816813e-05;8.2136111814179e-06;-0.00057647115318105;8.9183951786254e-05;-0.00048925279406831;4.5977608351677e-06;0.00020802962535527;5.3330662922235e-05;-0.00011600758443819;3.4777407563524e-05;-0.00013312281225808;-1.400305700372e-05;-0.00040708982851356;-2.4935327019193e-05;0.0001445080852136;0.00021555939747486;0.00010574005136732;-1.1913311027456e-05;-0.00018929566431325;0.00012806415907107;-8.4810591943096e-05;5.5603235523449e-05;-2.3374399461318e-05;0.0012989251408726;2.949855343104e-06;-0.00035712958197109;-1.3848487469659e-05;7.0873982622288e-05;1.928572783072e-05;-1.5068098036863e-05;-8.375240577152e-05;0.00019758328562602;-5.3747895435663e-05;-0.00045173094258644;8.2131817180198e-05;2.8239934181329e-05;-2.8888658562209e-05;-0.00031844386830926;-2.7490097636473e-05;5.5706055718474e-05;9.3922259111423e-05;-0.00042958059930243;-2.2398571672966e-06;-0.00086912827100605;1.5421914213221e-05;-0.00010026318341261;0.00018423641449772;9.6487143309787e-05;0.00022016164439265;-7.727365300525e-06;-0.00019231920305174;-0.00011247240763623;-0.00017896285862662;-7.0185968070291e-05;0.0011716793524101;-1.7367568716509e-06;0.00057107128668576;-2.1903457309236e-05;7.1209171437658e-05;3.4834613416024e-06;0.00015924010949675;-7.7197400969453e-05;0.00020177668193355;-5.3549923904939e-05;-0.00045084283920005;5.7111974456348e-06;-0.00097405241103843;8.8528060587123e-05;-2.2468368115369e-05;-9.2137976025697e-05;0.00021547509822994;4.0110851841746e-05;-0.00041318079456687;-3.619414565037e-05;0.00077279604738578;3.462295353529e-05;-0.00023397378390655;0.00018926286429632;-0.00010326412302675;-0.0002578962885309;-0.00010177538933931;0.00027124784537591;7.75046646595e-05;0.00049794535152614;4.424881626619e-05;0.00074551603756845;-5.1610739319585e-05;5.3506682888838e-05;8.330703167303e-06;-0.00015963072655722;1.1949112376897e-05;-0.00023075808712747;-4.2072155338246e-05;8.0455145507585e-05;-8.3277727753739e-06;-0.0007299684220925;0.00011687706864905;-0.00070812762714922;3.3022017305484e-05;0.00025826448109001;6.9660854933318e-05;-0.00014437385834754;5.5579177569598e-05;-0.00025712538626976;-3.515054345371e-07;-0.0005264682113193;-3.4949596738443e-05;0.00017641288286541;0.0002937720855698;8.7440341303591e-05;-9.0592482592911e-05;-0.00022921427444089;0.00016216149379034;-8.4517305367626e-05;0.00018932053353637;-3.2980693504214e-05;0.0016633233753964;-1.6274674635497e-05;-0.00039011114859022;-2.6561925551505e-05;0.00010434962314321;2.1843170543434e-05;9.534865966998e-06;-0.00011825613910332;0.00024563175975345;-4.5829972805222e-05;-0.00055066513596103;0.000147593265865;-0.00010982982348651;-2.4956574634416e-05;-0.00039993858081289;-4.3794825614896e-05;6.4431857026648e-05;0.00012808619067073;-0.00056639208924025;5.3170897444943e-06;-0.0010999870719388;2.575679536676e-05;-0.00011702324991347;0.00025693702627905;0.00020620317081921;0.00029717429424636;-8.5819010564592e-05;-0.00023430744477082;-0.0002026518486673;-0.00019816230633296;-0.00010452793503646;0.0014804378151894;-1.3394842426351e-05;0.00073029368650168;-3.3507789339637e-05;0.00016203240375035;-7.1072463470045e-07;0.00019985996186733;-8.53661695146e-05;0.00020660852896981;-2.2354601242114e-05;-0.00035168346948922;3.2594078220427e-05;-0.00091635616263375;7.960543007357e-05;-9.338570816908e-05;-9.4472168711945e-05;0.00021825756994076;4.8422378313262e-05;-0.00040428948705085;-3.6810986784985e-05;0.00058615923626348;3.4552896977402e-05;-0.00024057189875748;0.00011006982094841;-0.00010578510409687;-0.00019546762632672;-7.9597535659559e-05;0.00028965709498152;2.6040712327813e-05;0.00048364498070441;1.3541466614697e-05;0.00064615142764524;-4.4289216020843e-05;0.00015842283028178;9.4530378191848e-06;-0.00011259494931437;1.2396394595271e-05;-0.00017255278362427;-6.9665715273004e-05;0.00013745183241554;-1.672129110375e-05;-0.00067889736965299;0.00010065804963233;-0.00061947829090059;3.6161647585686e-05;0.00027511178632267;7.4865180067718e-05;-0.0001511224108981;7.5123753049411e-05;-0.00039976934203878;5.3315575314627e-06;-0.00043767603347078;-4.0281298424816e-05;0.00019802374299616;0.00028825012850575;6.9874658947811e-05;-0.00012275352491997;-0.00020120498083998;0.00011493024067022;-5.3494452004088e-05;0.00018657164764591;-4.0131857531378e-05;0.0015827269526199;-1.4909469427948e-05;-0.00042415194911882;-3.3062326110667e-05;0.0001405305811204;2.2094123778515e-05;-4.3856102820428e-06;-0.00010281148570357;0.00018400760018267;-4.3608244595816e-05;-0.00044198730029166;0.00015435289242305;4.5334381866269e-05;-2.6982097551809e-05;-0.00035293557448313;-5.0635757361306e-05;5.6370594393229e-05;0.00011519627878442;-0.00042913015931845;7.6694341260009e-06;-0.00096564792329445;3.3516662369948e-05;-0.00010584372648736;0.00028096025926061;0.00029603761504404;0.00032052060123533;-0.00013576554192696;-0.00030844114371575;-0.00022171200544108;-0.00029475093469955;-8.9312605268788e-05;0.0011286492226645;-1.8403647118248e-05;0.00064441602444276;-3.4507698728703e-05;0.00018584955250844;-5.7424631449976e-06;0.00017533714708406;-0.00016673644131515;6.3638144638389e-05;0.00084787898231298;9.4591843662784e-05;0.0011957479873672;-0.00013070463319309;-5.0221424316987e-05;-0.00013803658657707;9.2290065367706e-06;-6.7210953602626e-06;0.00048792653251439;-6.5129170252476e-05;0.00025974281015806;-3.5449236747809e-05;-2.0360437702038e-05;1.0758718417492e-05;-0.00043747629388236;2.2677304514218e-05;0.00027453748043627;-0.00018178143363912;0.00022403651382774;-0.00062536098994315;5.6882439821493e-05;-0.0017545114969835;6.2236144913186e-06;-1.9801993403235e-05;9.2313428467605e-05;-3.9791833842173e-05;4.0106337110046e-05;-8.129793968692e-06;-6.0783095250372e-06;-0.00012547743972391;6.4176703745034e-05;-0.00032446318073198;1.305741352553e-05;-0.0010114073520526;9.2162401415408e-05;-6.2524348322768e-05;7.2957911470439e-05;-6.2187427829485e-05;2.8459544409998e-05;0.00021588006347883;-3.4514810977271e-05;-0.00063135474920273;4.0823440940585e-05;-1.5346830650742e-07;-1.0505298632779e-05;3.8683963794028e-05;-6.9501053076237e-05;-7.402959454339e-05;0.00031686914735474;-7.4997253250331e-05;0.0004629414761439;-0.00011922890553251;0.00095772399799898;-1.8466271285433e-05;0.00029549634200521;-4.9078742449638e-05;-9.1259309556335e-05;-1.7972121213461e-06;0.00017464921984356;-1.2935256563651e-05;0.00024910399224609;-8.412504394073e-05;-0.00028559641214088;4.0267961594509e-05;-0.00024916033726186;-1.1324962542858e-05;3.9658712921664e-05;-4.5762844820274e-05;-9.9313707323745e-05;5.1466817239998e-05;-0.00073817302472889;5.9101093938807e-05;-0.00052571314154193;8.9891900643124e-06;9.084444900509e-05;-2.6032788809971e-05;-3.9214610296767e-05;3.0300712751341e-05;6.9585366873071e-05;-1.6169427908608e-05;5.1540224376367e-05;-8.6647858552169e-05;-7.139737590478e-06;0.0013433233834803;-7.4709045293275e-05;-1.4508834283333e-05;4.2727235268103e-05;0.00012354375212453;-9.9283624876989e-06;0.00011355336755514;-4.8613281933285e-07;2.7083762688562e-05;-1.5348125089076e-05;0.00028809095965698;7.1630107413512e-05;0.00021818994719069;1.0412217307021e-05;-7.5188581831753e-05;-4.2075309465872e-05;-8.3592649389175e-06;1.7150769053842e-05;3.8068636058597e-05;2.115841880368e-06;-0.00020455945923459;-2.7398071324569e-05;3.3983594676101e-06;-1.4548832041328e-05;-0.00023473324836232;-5.8101086324314e-05;9.4518829428125e-05;0.00010159055818804;8.4355408034753e-05;-7.2439441282768e-05;-3.9189028029796e-05;-0.00045138786663301;-3.8912399759283e-05;0.00011743821960408;4.1998791857623e-05;7.0048045017757e-05;1.8194727090304e-05;6.3229235820472e-05;1.472630083299e-05;-8.8919936388265e-05;3.483655382297e-05;-0.00019388004147913;1.7189131540363e-05;-0.00027312437305227;3.7564288504655e-05;4.4349690142553e-05;-2.5734152586665e-06;-5.8766006986843e-05;2.0197774574626e-05;0.00027041518478654;-2.2611660824623e-05;-0.00024082508753054;-4.0439617805532e-06;3.5834797017742e-05;-5.8445453987588e-07;4.0514139982406e-05;4.7950059524737e-05;4.4162487029098e-05;0.0001082740855054;-6.5992608142551e-05;1.064294247044e-05;-6.9554989750031e-05;0.00038742573815398;9.5908433195291e-07;-2.7554047846934e-05;-6.3620518631069e-07;-8.9031731477007e-05;1.008460912999e-05;3.0661867640447e-05;-2.963897486552e-06;0.00011378654744476;-1.9988197891507e-05;-0.00017782291979529;-3.5252733141533e-06;-6.3270003010985e-05;-3.1742802093504e-05;-9.9566696007969e-06;-3.3345218980685e-05;-2.1615471268888e-05;2.5861922040349e-05;-0.00029907713178545;1.8207940229331e-05;-0.00026129913749173;-1.9719548163266e-06;-3.4113945730496e-06;-1.0573557119642e-05;-5.0031700084219e-05;-8.5751882579643e-05;1.5041735423438e-05;3.5691598895937e-05;9.1233603598084e-05;-3.2936746720225e-05;5.3443705837708e-05;0.00070079852594063;-2.4765608031885e-05;4.9147052777698e-05;2.0843584934482e-05;-7.8314973507077e-05;2.545792995079e-06;7.9421995906159e-05;3.3765868465707e-06;2.6735571736936e-05;-5.1286431698827e-05;-6.4183928770944e-05;-0.00030541425803676;-1.5807745512575e-05;-0.00017333646246698;3.2372976420447e-05;0.0001360485330224;-5.8326018006483e-06;-9.6614567155484e-06;-1.8776854631142e-05;3.5749362723436e-05;3.702002868522e-05;0.00017954839859158;1.4259464478528e-05;6.6683601289697e-06;0.00024099873553496;7.0038957346696e-05;-0.00010982920503011;-0.00011545573215699;-7.7872166002635e-05;7.7827709901612e-05;2.7847986530105e-06;4.7925037506502e-05;0.00040485803037882;-4.9700633098837e-05;-0.00014240534801502;-1.7317019228358e-05;-7.413602725137e-05;-1.6169839000213e-05;-6.5650259784888e-05;3.8128931919346e-05;-9.8351629276294e-05;5.0574177294038e-05;-9.9595599749591e-05;4.3599447963061e-05;-0.00021947264031041;-2.235110696347e-05;-2.1842040951014e-05;1.350048569293e-05;-4.514538886724e-05;-1.8909942809842e-05;0.00033891652128659;-8.1350981417927e-06;-0.00024316634517163;-1.8765533695841e-06;2.3693522962276e-05;-2.7725865948014e-05;5.6147888244595e-05;0.00010845907672774;-5.7221772294724e-05;0.00012760500248987;-9.2944654170424e-05;-2.8845328415628e-05;-2.324816705368e-05;0.00019183632684872;1.6049705664045e-05;5.7059805840254e-05;7.4300787673565e-06;-0.00010697218385758;1.2757479908032e-06;4.1527582652634e-05;-1.0909967386397e-05;9.4239228928927e-05;-6.1310024648265e-06;-0.00012165873340564;-4.561330206343e-05;-7.1274444053415e-05;-1.5359220924438e-05;-1.5372741472675e-05;2.8047323212377e-05;-2.4256576580228e-05;1.3667146049556e-05;-0.00026488956063986;1.2396721871255e-08;-0.00022702335263602;-1.9725061065401e-05;1.2648923984671e-05;-8.5793923062738e-05;-0.00012066718045389;-9.1908823378617e-06;0.00013402465265244;4.607736991602e-05;4.9356229283148e-05;1.9626912035164e-05;-2.4534521799069e-05;0.0006270210724324;2.292051067343e-05;1.9319331840961e-05;1.9857072857121e-06;-9.6553681942169e-05;6.8534100137185e-06;8.3153914602008e-05;-7.8630953794345e-05;0.00018731274758466;-8.7899454229046e-05;-0.00073676579631865;8.8709413830657e-05;-0.0011483047856018;0.00012214292655699;6.9295798311941e-05;-3.6715468013426e-05;9.7238073067274e-05;6.2495630118065e-05;-0.00041483656968921;2.3069085273164e-06;0.00027215320733376;1.299698396906e-05;-9.0963461843785e-05;0.00036770224687643;-0.00010712286166381;-0.00032940137316473;-0.00020658843277488;0.00029308046214283;4.5161690650275e-05;0.00062380830058828;2.4298269636347e-05;0.0012861955910921;-9.2074871645309e-05;-2.0934601707268e-05;-2.0726229195134e-05;-6.6265456553083e-05;1.2472447451728e-05;-0.00013014032447245;1.3481432688423e-05;-3.0706538382219e-05;1.7131153072114e-05;-0.00056622602278367;0.0001491064322181;-0.00096406787633896;5.4229116358329e-05;4.8553232772974e-05;5.5695156333968e-05;-0.00011934677604586;1.4799784366915e-05;4.7206605813699e-05;3.4329739719396e-05;-0.00069401506334543;-2.353758100071e-05;9.4047551101539e-05;0.00016965573013294;-1.1699120477715e-05;-6.4268519054167e-05;-0.00018233341688756;0.00030743452953175;-0.00013248113100417;0.00038991859764792;-5.2443654567469e-05;0.001332214102149;-4.4941563828615e-05;5.0726452172967e-05;-2.04434763873e-05;-1.1012333743565e-05;2.8639326501434e-06;0.00013612952898256;-0.00012261501979083;0.00027646581293084;9.9873586805188e-06;-0.00047222845023498;0.00010619315435179;-0.00036711318534799;-1.6424442947027e-05;-0.00020103350107092;5.9072658586956e-06;-3.073687912547e-05;0.00012001110007986;-0.00072069064481184;1.9187602447346e-05;-0.00091000704560429;-4.8270671868522e-06;-4.8717702156864e-06;0.00011478269152576;0.00012636496103369;0.00018143662600778;-3.7020865420345e-05;-7.8121964179445e-05;-0.00015271818847395;-5.772184158559e-05;-0.00012608036922757;0.0016194124473259;6.2480530687026e-06;0.00039989274227992;-3.145251685055e-05;0.00015248947602231;-4.7452161311412e-07;0.00019575898477342;-8.0345998867415e-05;0.00018264581740368;-3.9144662878243e-05;-0.00046066078357399;6.4482788729947e-05;-0.00087647442705929;8.6485437350348e-05;-1.258893735212e-05;-4.8026613512775e-05;0.00011896505748155;5.828859139001e-05;-0.00037636092747562;-1.2142269952164e-05;0.00026695636915974;1.52212469402e-05;-0.00012020509166177;0.00019281047570985;-9.7770440333989e-05;-0.00021899286366533;-0.00011952027125517;0.00025562322116457;1.6347607015632e-05;0.00048261674237438;9.2756090452895e-07;0.00086126133101061;-5.6683918955969e-05;6.4176121668424e-05;-8.6462969193235e-06;-4.390289177536e-05;1.2400992090988e-05;-0.00010774294787552;-3.4640830563148e-05;6.8508001277223e-05;3.5508840028342e-06;-0.00053997355280444;0.00012123535270803;-0.00075355911394581;4.703679587692e-05;0.00011105851444881;5.7758330513025e-05;-0.00011803400411736;4.7527628339594e-05;-0.00020971002231818;2.8437185392249e-05;-0.00051110697677359;-2.756717185548e-05;0.00012553342094179;0.00018987036310136;-1.0006297088694e-05;-9.521990432404e-05;-0.00016219732060563;0.00022042731870897;-7.9753175668884e-05;0.00030962709570304;-5.4397158237407e-05;0.0012795763323084;-3.5731460229727e-05;-0.00010187288717134;-2.7797324946732e-05;7.5926211138722e-05;7.7007425716147e-06;6.7793080233969e-05;-9.7351301519666e-05;0.00018674760940485;-8.3298018580535e-06;-0.00037215917836875;0.00012033632810926;-0.00011962831194978;-1.6646292351652e-05;-0.00020435640180949;-1.4985180314397e-05;-4.7570761125826e-06;0.00010148921865039;-0.00046688134898432;1.6224244973273e-05;-0.0007507000118494;1.1686626748997e-05;-2.5630943127908e-05;0.00017799049965106;0.00020165005116723;0.00021096137061249;-9.7188909421675e-05;-0.00016794296971057;-0.00016675126971677;-0.00016060932830442;-9.4941875431687e-05;0.0010941283544526;-8.5709662016598e-06;0.00038485578261316;-3.110357283731e-05;0.00015840836567804;-4.2412393668201e-06;0.00014829749125056;-0.00017452258907724;6.3907755247783e-05;0.0011131347855553;0.0001134480262408;0.0015860210405663;-0.00019161320233252;-2.7754233087762e-05;-0.00017693398694973;2.9982076739543e-05;-1.5153840649873e-05;0.00050834909779951;-7.2386435931548e-05;0.0005440705572255;-5.4639247537125e-05;-1.615731525817e-05;1.2561547919177e-05;-0.00055070233065635;4.6373283112189e-05;0.00032567713060416;-0.00028994007152505;0.00029838201589882;-0.00082294957246631;9.815426892601e-05;-0.0022740757558495;1.4732652743987e-05;-0.00013547482376453;0.00012647647236008;-2.9427910703816e-05;4.975426782039e-05;-9.6988645964302e-05;-2.3050006348058e-06;-0.00020471071184147;0.00010021941852756;-0.00018635575543158;1.9162269381923e-05;-0.0010659614345059;8.3269333117642e-05;-0.00011018485383829;8.818089554552e-05;-4.1575767681934e-05;1.4486608051811e-05;0.00040435756091028;-5.9111978771398e-05;-0.00066496431827545;4.2755218601087e-05;-7.4940071499441e-05;-7.035693670332e-06;-3.1488816603087e-05;-4.8663841880625e-05;-5.9009573305957e-05;0.00030083683668636;-3.875605398207e-05;0.00049396028043702;-0.00015788212476764;0.00076896214159206;-1.0812561413331e-05;0.00044078621431254;-5.0112157623516e-05;-0.00018618890317157;6.5907624957617e-06;0.00025155796902254;-1.7370817658957e-05;0.00031015064450912;-0.00010275154636474;-0.00025175805785693;8.1414000305813e-05;-0.00053570186719298;-1.251661524293e-05;4.2963616579073e-05;-2.7658310500556e-05;-0.00012380750558805;6.7216176830698e-05;-0.0010283631272614;7.0815010985825e-05;-0.00063531356863678;3.0821520340396e-05;0.00012319340021349;-3.9562266465509e-05;-0.00014323127106763;-1.8034395907307e-05;3.0764414987061e-05;6.8154193286318e-05;9.8335658549331e-05;5.242638872005e-05;-2.0978603060939e-05;0.0017102094134316;-0.00011510434705997;7.7806085130305e-08;4.3531181290746e-05;0.00023564140428789;-1.6961563233053e-05;0.00011030515452148;-4.2770006984938e-06;4.73720174341e-05;-9.7924021247309e-05;-7.0975460403133e-05;-0.00034161904477514;1.7329434740532e-06;-0.00018086086492985;3.5168726753909e-05;0.00013718886475544;2.8248789476493e-06;-2.6344960133429e-05;-3.2458319765283e-05;0.00014473771443591;4.4892196456203e-05;7.3021969001275e-05;1.3350824701774e-05;2.202128416684e-05;0.00026665220502764;6.3048108131625e-05;-0.00011227333743591;-0.00013836951984558;-5.8967340009985e-05;7.1746697358321e-05;2.1159836251172e-05;5.4322117648553e-05;0.00040745906881057;-6.0517577367136e-05;-0.00013163918629289;-1.8181070117862e-05;-8.8653512648307e-05;-1.8021582945948e-05;-2.9893628379796e-05;4.9105739890365e-05;-0.00013036643213127;5.2234307077015e-05;-1.899991184473e-05;3.4189019061159e-05;-0.0001543657417642;-2.1500987713807e-05;-5.051232437836e-05;3.8670054891554e-06;-2.7798907467513e-05;-2.7484082238516e-05;0.00048325234092772;-7.1350482357957e-06;-0.00021439883857965;2.1269297576509e-06;-1.8156841179007e-05;-5.5492197134299e-05;6.2675389926881e-05;0.00011867455032188;-3.8094123738119e-05;9.9312033853494e-05;-9.551557013765e-05;-4.4757525756722e-05;-1.9709234038601e-05;-3.8736994611099e-05;1.6442832929897e-05;0.00013383582700044;1.0180488970946e-05;-0.00018313254986424;-1.2873508694611e-06;8.1548190792091e-05;-2.1420530629257e-06;8.4764600615017e-05;7.5898119575868e-06;-5.7217665016651e-05;-5.7999044656754e-05;-0.00021212930732872;-3.5231960282545e-06;1.9964580133092e-05;3.1929008400766e-05;-3.1151219445746e-05;3.8268676689768e-06;-0.00030138896545395;2.4104303975037e-06;-0.00018617780006025;-2.4992466933327e-05;8.5220026448951e-06;-0.00013900773774367;-0.00013098354975227;-4.6521316107828e-05;0.00015202960639726;8.4362298366614e-05;5.0042734073941e-05;8.9551947894506e-05;-2.355517608521e-05;0.00066493224585429;2.4779807063169e-05;-1.0165688763664e-05;4.9052532631322e-06;-0.00010446317901369;6.6073248490284e-06;9.5199851784855e-05;-2.7643347493722e-05;8.1773490819614e-05;-0.00011457887012511;-0.00090558099327609;0.00013901825877838;-0.0011738660978153;0.00012949708616361;0.00010235120134894;3.6984235975979e-06;5.4000662430553e-07;3.6013905628351e-05;-0.00020082209084649;4.0295319195138e-05;-0.00013686192687601;5.4334896049113e-06;-1.6027634046623e-05;0.00048309526755475;-9.0948247816414e-05;-0.00032178036053665;-0.0002788926649373;0.00029127139714547;1.9403185433475e-05;0.00062735605752096;2.9113869459252e-05;0.0014995242236182;-0.00012321663962211;4.0562831600255e-06;-3.2581621780992e-05;-7.5837109761778e-05;5.4722892173231e-07;5.6488484005968e-06;0.00010110725997947;-0.00020846442203037;3.1784664315637e-05;-0.00012934739061166;8.0276186054107e-05;-0.00068843772169203;4.3829692003783e-05;-8.8965403847396e-05;1.2765014616889e-05;-4.1040584619623e-05;-6.0908103478141e-05;0.00051675166469067;2.4260807549581e-05;-0.0005490054609254;-5.3833568927075e-06;-6.1622151406482e-05;-2.5566139811417e-05;2.7263969968772e-05;2.5090330382227e-05;-5.8471126976656e-05;0.0001924172102008;-0.0001575356873218;0.00027776250499301;-1.2605781193997e-05;0.0004461242351681;-2.5613699108362e-05;0.00032283118343912;8.6840682342881e-06;-0.0002115889074048;-8.7349608293152e-06;0.00022234205971472;-9.8224038083572e-05;0.00027604011120275;7.0578804297838e-05;-0.00026387959951535;2.9197122785263e-05;-0.00074428168591112;1.2216548384458e-05;-8.4644576418214e-05;4.1168696043314e-05;-6.9222624006215e-05;8.5773281170987e-05;-0.00088836025679484;3.5834294976667e-05;-0.00070256914477795;-3.5070130252279e-05;4.9383899749955e-05;-0.00013933319132775;-6.7590168328024e-05;1.4141705833026e-05;0.00010946345719276;0.00013895699521527;-7.7294957009144e-05;0.00023417815100402;-0.00013844727072865;0.001679983921349;2.2356867702911e-05;0.00021834272774868;-2.1682970327674e-05;0.00016502244397998;2.3501749524257e-07;0.00014772664871998;-0.00012471585068852;3.677419226733e-05;0.0013120009098202;0.00013103969104122;0.0018668185221031;-0.00023533083731309;9.6018391104735e-07;-0.00020354911976028;5.2946517826058e-05;-2.1288717107382e-05;0.00038941384991631;-5.8089710364584e-05;0.0008405412081629;-7.2474424086977e-05;8.3922732301289e-06;1.0510683750908e-05;-0.00063575064996257;4.7698624257464e-05;0.00034072846756317;-0.00036144978366792;0.00035559176467359;-0.00094513106159866;0.00013967338600196;-0.0026290107052773;1.0230876796413e-05;-0.00027823873097077;0.00015417479153257;3.2296302379109e-05;5.2024679462193e-05;-0.00022294282098301;6.1554928834084e-06;-0.00031277726520784;0.00014576299872715;0.00014569544873666;2.8223304980202e-05;-0.00087487808195874;3.4060787584167e-05;-0.00014280616596807;9.2948059318587e-05;-2.473806944181e-06;-9.7327811090508e-06;0.00065943622030318;-9.2486610810738e-05;-0.00054840260418132;2.9954513593111e-05;-0.00017181629664265;-4.4281973714533e-06;-0.0001634986983845;3.6421617551241e-05;-1.3802578905597e-05;0.00014979450497776;4.6851095248712e-05;0.00040034038829617;-0.00019944029918406;0.00024889173801057;9.5817749752314e-06;0.00053707108600065;-2.9300617825356e-05;-0.00031031091930345;2.2371243176167e-05;0.00030657902243547;-1.7828882846516e-05;0.00034880443126895;-0.00010626223229337;-0.00010280494461767;0.00013536638289224;-0.00086870056111366;-3.306365761091e-05;2.7876880267286e-05;-3.7828467611689e-06;-0.00013560240040533;8.1198726547882e-05;-0.0013386183418334;6.9830297434237e-05;-0.00069594680098817;5.6839664466679e-05;0.00015269970754161;-5.5202490329975e-05;-0.00032848888076842;-0.00011464867566247;-2.8332795409369e-05;0.00018744132830761;0.00019349437206984;0.00025019695749506;-2.2909511244507e-05;0.0019855005666614;-0.00015608566172887;3.4388271160424e-05;4.6215445763664e-05;0.00037616668851115;-2.0976229279768e-05;7.4614945333451e-05;-9.2085865617264e-06;-5.4038919188315e-05;2.8052822926838e-06;0.0013367014471442;0.00014465829008259;0.0018604466458783;-0.0002301925123902;-3.9618294067623e-06;-0.00020707449584734;7.8457924246322e-05;-2.6767100280267e-05;0.00027319727814756;-3.6820576497121e-05;0.00099108158610761;-8.0438498116564e-05;6.3087072703638e-06;1.1485551112855e-05;-0.00067133514676243;-3.0979004804976e-05;0.00031178884091787;-0.00026618930860423;0.00036512064980343;-0.00089707202278078;0.00017249534721486;-0.0027329700533301;-4.8120182327693e-06;-0.00031294085783884;0.00015489460201934;7.4116018367931e-05;5.0384962378303e-05;-0.00029133414500393;1.2983424312552e-05;-0.00037488935049623;0.0001696229155641;0.00045252882409841;5.238424273557e-05;-0.00075360661139712;-1.4755129086552e-05;-0.00016194513591472;9.3193077191245e-05;2.321883039258e-05;-2.3169199266704e-05;0.00077907758532092;-0.00011093251669081;-0.00043434559484012;2.04423777177e-05;-0.00022078992333263;-8.2162432590849e-06;-0.00031272301566787;9.0549343440216e-05;1.6698091712897e-05;3.8456182664959e-05;0.00013902137288824;0.00034192320890725;-0.00022815143165644;-0.00012323964620009;1.2084027730452e-05;0.00058032694505528;-3.6763699426956e-06;-0.0003653810126707;3.3014293876477e-05;0.00030922907171771;-1.5949250155245e-05;0.00032818593899719;-8.2047437899746e-05;8.9209992438555e-05;0.0001692422083579;-0.00082299631321803;-9.7736599855125e-05;5.6862270866986e-05;-3.1280553230317e-05;-0.00014607225602958;9.4304719823413e-05;-0.0014211580855772;4.3206586269662e-05;-0.00061035167891532;5.9986839914927e-05;0.00017943109560292;-6.0702004702762e-05;-0.00049942836631089;-0.00020836120529566;-3.7415611586766e-05;0.00024978115106933;0.00029510969761759;0.00022851323592477;5.0297898269491e-05;0.0018720494117588;-0.00015523956972174;-3.4721990232356e-05;6.8472829298116e-05;0.00041199306724593;-1.0732652299339e-05;3.5574230423663e-05;-1.3976841728436e-05;1.8430728232488e-05;4.6947286591603e-07;-0.00016240784316324;-0.0014793418813497;0.00027383904671296;-0.0018247569678351;0.00019356957636774;9.2397625849117e-05;3.9780687075108e-05;-0.00010654830111889;2.0910885723424e-05;-7.2786227974575e-05;0.00010857331653824;-0.00091401778627187;9.0103566208199e-07;-8.4570649505622e-07;0.00077734718797728;4.1688822420838e-06;-0.00035478902282193;-0.00047145728603937;0.00034228651202284;-0.00010199555981671;0.00086293887579814;1.492931824032e-05;0.0026224779430777;-0.00019959473866038;0.00024506822228432;-5.606226841337e-05;-0.00013799262524117;-2.114819471899e-05;0.00028565517277457;0.00022930627164897;-0.00046197380288504;0.00011066098522861;0.00070556858554482;-6.4965883211698e-05;-0.00063231820240617;6.7578519519884e-05;-0.00021361165272538;-3.1507672247244e-05;4.2930794734275e-05;-0.00016706905444153;0.0010024930816144;1.492841693107e-05;-0.00042379219667055;-1.1871224160132e-05;-0.00027762036188506;-0.00049402442527935;0.00014855232439004;9.8066826467402e-05;0.00022921408526599;-3.22233827319e-05;-0.0002681787009351;0.00026089118910022;6.6421239353076e-06;-0.00046155438758433;3.5942735848948e-05;0.00065486715175211;4.9070986278821e-05;-0.00045582462917082;-1.6805639461381e-05;0.00035662722075358;-6.6588552726898e-05;0.0003170880372636;0.00021192491112743;0.00022309104679152;-0.00014146380999591;-0.0010245140874758;-1.6193096598727e-05;3.2296709377988e-06;0.00010303905582987;-0.00015524156333413;3.521163307596e-05;-0.0015048014465719;7.5071766332258e-05;-0.00068286724854261;-8.0859725130722e-05;0.0002043997956207;-0.00068214238854125;-0.00029718602309003;-5.0928836571984e-05;0.00044483586680144;0.00031423260224983;3.2331419788534e-05;0.0003676799533423;-0.00020120346744079;0.0020193799864501;9.2507041699719e-05;2.9748698580079e-05;-8.7928365246626e-06;0.00041078211506829;-1.0938780178549e-05;3.9168302464532e-05;-1.8769313101075e-05;6.9700974563602e-05;-0.00014417103375308;-0.0013696795795113;0.00026611494831741;-0.0017568517941982;0.00018377875676379;7.0969988883007e-05;2.9037111744401e-05;-7.0259775384329e-05;4.6536464651581e-05;-0.00018037138215732;8.8918546680361e-05;-0.00073426717426628;2.2057545265852e-06;-1.2516801689344e-05;0.00070099427830428;-6.9299050664995e-05;-0.00036178083973937;-0.00043243283289485;0.00040938766323961;-7.7620061347261e-05;0.00088140042498708;2.8447189492908e-07;0.0023982939310372;-0.0001864793302957;0.0002175742702093;-5.3580191888614e-05;-9.882623271551e-05;-1.2040427463944e-05;0.00021374825155362;0.00019199142116122;-0.00037903047632426;7.505172106903e-05;0.00039535717223771;-9.5011755547603e-06;-0.00068326253676787;6.5367989009246e-05;-0.00017825856048148;-1.791706563381e-05;1.7093429050874e-05;-0.00013699685223401;0.0008285932126455;2.2452260964201e-05;-0.00048647914081812;-6.9247907958925e-06;-0.00021772368927486;-0.0003194285382051;9.1802292445209e-05;6.156052404549e-05;0.00012479038559832;6.2931903812569e-05;-0.0002262666093884;0.00029342161724344;6.0815036704298e-06;-0.00012462379527278;5.7563161135477e-06;0.00056827318621799;3.6104971513851e-05;-0.00037400453584269;-1.6897061868804e-05;0.00033068491029553;-9.7267089586239e-05;0.00033024582080543;0.00017111784836743;1.7628583009355e-05;-5.3951182053424e-05;-0.001024137949571;7.8350394687732e-06;-3.9420658140443e-05;8.3282444393262e-05;-0.00013246669550426;7.1992006269284e-05;-0.0013613105984405;7.1209346060641e-05;-0.0007395357824862;-6.7698420025408e-05;0.0001651782222325;-0.00047295656986535;-0.00020152186334599;-3.5198227124056e-05;0.00030459754634649;0.00025959216873161;-3.8532904000022e-05;0.00037741340929642;-0.00020214852702338;0.002013165038079;5.9747293562395e-05;0.00011528829054441;-2.2292435460258e-05;0.0003785066655837;-7.074253517203e-06;6.8713387008756e-05;-4.4859501940664e-05;4.770179202751e-06;0.00095863622846082;0.00010005293734139;0.0013483224902302;-0.0001714061218081;9.4971092039486e-06;-0.00014693690172862;4.3236279452685e-05;-1.4817047485849e-05;0.00017064885469154;-2.6742905902211e-05;0.00067630910780281;-5.4979638662189e-05;2.2932195861358e-05;4.5948263505124e-06;-0.00046831759391353;2.0915498680552e-05;0.00023122242419049;-0.00025617197388783;0.00026354964938946;-0.00066860654624179;0.00011023792467313;-0.0018806065199897;-2.4663468138897e-06;-0.00024555108393542;0.00011493225611048;6.6662621975411e-05;3.4101351047866e-05;-0.00020772274001502;8.5630081230192e-06;-0.0002610310621094;0.00011751061538234;0.00026539785903879;2.4389393729507e-05;-0.0004663236613851;-3.1581937491865e-06;-0.00010276214015903;6.3357132603414e-05;1.3830903299095e-05;-1.6494945157319e-05;0.00056819192832336;-7.6315249316394e-05;-0.00030043910373934;1.2097609214834e-05;-0.00015281031664927;-3.5984326132166e-06;-0.00017253085388802;8.0252844782081e-05;1.5855028323131e-05;6.6121915551776e-06;7.2933195042424e-05;0.00020579627016559;-0.00015731893654447;-9.37481308938e-05;1.5620189515175e-05;0.00038313632830977;-6.1275422922336e-06;-0.0002677247102838;2.2412879843614e-05;0.00022375224216375;-1.0763330465124e-05;0.00024539977312088;-6.8444598582573e-05;2.580748332548e-05;0.00011233986151638;-0.00070880429120734;-3.9762991946191e-05;1.2226960279804e-05;7.0112164394232e-06;-9.5533912826795e-05;6.0837792261736e-05;-0.0010411809198558;4.3488485971466e-05;-0.00048831274034455;4.7126250137808e-05;0.00011601785809034;-4.5355649490375e-05;-0.00031339796259999;-0.00011140973947477;-4.1996150685009e-05;0.00015439344861079;0.00018495004042052;0.00024400195979979;-1.7362639482599e-05;0.0014433278702199;-0.00011918359814445;3.4042277547996e-05;3.6455829103943e-05;0.00031266326550394;-1.423841331416e-05;3.2389783882536e-05;-7.4965555540984e-06;1.7319151083939e-05;-2.9098357117618e-05;0.0012225122191012;0.00014097498205956;0.0016817282885313;-0.00020725454669446;4.8784904720378e-06;-0.0001890442072181;7.320136501221e-05;-2.1498250134755e-05;8.5637962911278e-05;-1.1071599146817e-05;0.00096384179778397;-7.5002273661084e-05;3.2415158784715e-05;5.9387998589955e-06;-0.00062316854018718;-4.8569174396107e-05;0.00026757013984025;-0.00023002075613476;0.00033963716123253;-0.00079457811079919;0.0001661772839725;-0.002431585919112;-2.1487358026206e-05;-0.00033571445965208;0.00014526868471876;0.00013454335567076;4.0290171455126e-05;-0.00032061184174381;1.677035834291e-05;-0.00037748878821731;0.00016383617185056;0.00059541338123381;5.3996034694137e-05;-0.00048444280400872;-4.2514981032582e-05;-0.00014232097601052;8.2674247096293e-05;3.6441600968828e-05;-3.0988368962426e-05;0.00081848225090653;-0.00010770973312901;-0.00028526980895549;7.4244053394068e-06;-0.00022981449728832;-9.7824113254319e-06;-0.00034273284836672;0.00016060512280092;4.644287400879e-05;-9.9698736448772e-05;0.00016784117906354;0.00020835762552451;-0.00023211829829961;-0.00042334216414019;1.7340667909593e-05;0.00051188666839153;1.5102911675058e-05;-0.00038648495683447;3.5924796975451e-05;0.0002837663050741;-1.0826855032064e-05;0.00028533927979879;-6.1382335843518e-05;0.00021836897940375;0.0001662052818574;-0.00083835900295526;-0.00011106608144473;4.1082177631324e-05;-1.4847169950372e-05;-0.00012916912965011;8.7552471086383e-05;-0.0013858170714229;2.977690564876e-05;-0.00054460531100631;5.9418107412057e-05;0.00016707585018594;-6.2714025261812e-05;-0.00054413045290858;-0.00020604049495887;-5.6438806495862e-05;0.00022009044187143;0.00032755968277343;0.00027667509857565;3.6250021366868e-05;0.0017223606118932;-0.00014518691750709;-1.6797599528218e-05;6.8140398070682e-05;0.00042020238470286;-7.8553257480962e-06;1.1079287105531e-05;-1.2767244697898e-05;6.8911213020328e-05;-8.6949250544421e-05;-0.00017323681095149;-0.0015370019245893;0.00028207007562742;-0.0018900126451626;0.00019906520901714;6.8475710577331e-05;3.7567027902696e-05;-0.00011122208525194;-1.9959668861702e-05;0.00014732309500687;0.00011533763608895;-0.0010698360856622;6.95469270795e-06;-5.4678032029187e-05;0.00079662806820124;2.1100930098328e-05;-0.00033619359601289;-0.00048901175614446;0.00036543703754432;-0.00012383678404149;0.00087017408804968;3.8186692108866e-05;0.0026426047552377;-0.00021092344832141;0.00035975582432002;-4.542452734313e-05;-0.00024355135974474;-3.0089880965534e-05;0.00040233568870462;0.00024735782062635;-0.00051777699263766;0.00012648936535697;0.0010306617477909;-0.00012961825996172;-0.00035276255221106;7.3118826549035e-05;-0.00020159620908089;-4.7600155085092e-05;7.0226240495685e-05;-0.00018224594532512;0.001134816207923;-1.7018573998939e-06;-0.0002578069397714;-1.9956600226578e-05;-0.00033461410203017;-0.00061490799998865;0.00028787719202228;0.00013310198846739;0.00032030427246355;-0.00027229904662818;-0.00031313038198277;0.00011870567686856;1.6964602764347e-05;-0.00090486719273031;7.179122621892e-05;0.00063782144570723;5.9263740695314e-05;-0.00053877499885857;-1.1299468496873e-05;0.0003724584239535;-3.9383001421811e-05;0.00029178478871472;0.00023716347641312;0.00051156029803678;-0.00019111395522486;-0.001170186442323;1.1453537808848e-05;-2.2403795810533e-05;0.00010684580774978;-0.00015401808195747;1.4083989299252e-05;-0.0017138879047707;8.6539810581598e-05;-0.00067901634611189;-9.7628304501995e-05;0.00023101780971047;-0.00085993815446272;-0.00029651055228896;-8.1055477494374e-05;0.00057287444360554;0.0002457759110257;-5.6559629229014e-06;0.00048728354158811;-0.00021132944675628;0.0020692991092801;0.00010940628999379;4.7406771045644e-05;-6.182977813296e-06;0.00053477840265259;-1.1356302820786e-05;-1.7607391782803e-05;1.0001674127125e-05;1.4061598449189e-05;-0.00013313791714609;-0.001273630419746;0.0002539322595112;-0.0016153859905899;0.0001663841685513;4.2387830035295e-05;2.8115948225604e-05;-7.4956566095352e-05;2.1735328118666e-05;-3.9627982914681e-05;8.8104650785681e-05;-0.0008020285749808;5.226501798461e-06;-3.4487857192289e-05;0.00064567575464025;-4.975304909749e-05;-0.00030257238540798;-0.00040573262958787;0.0003823573642876;-9.0827721578535e-05;0.00079081172589213;6.2799495026411e-06;0.0021924111060798;-0.00017609179485589;0.00027680650237016;-4.4519641960505e-05;-0.00013698331895284;-1.7306543668383e-05;0.00027275024331175;0.0001924990065163;-0.00038585509173572;7.5448297138792e-05;0.00058340968098491;-5.9017853345722e-05;-0.00041777390288189;5.7598215789767e-05;-0.00015943979087751;-2.9265960620251e-05;3.9177724829642e-05;-0.00014173189993016;0.00084363966016099;8.5155807028059e-06;-0.00031179274083115;-8.2483129517641e-06;-0.00024196002050303;-0.00037762973806821;0.0001542332029203;8.0325320595875e-05;0.00018151677795686;-8.4389510448091e-05;-0.00021854888473172;0.00016610950115137;1.9892529962817e-05;-0.00045055951341055;2.8505110094557e-05;0.00051329826237634;4.2345280235168e-05;-0.00039425861905329;-1.3655821931025e-05;0.00030761357629672;-7.1245965955313e-05;0.00028081011259928;0.00017584311717656;0.00018689148419071;-8.1248639617115e-05;-0.0010032128775492;2.0346153178252e-05;-3.7346366298152e-05;7.9889774497133e-05;-0.00012169928231742;4.9840135034174e-05;-0.0013318479759619;7.2949791501742e-05;-0.00062994426116347;-7.0895170210861e-05;0.00017006183043122;-0.00054197350982577;-0.00020470237359405;-5.8955574786523e-05;0.00035070223384537;0.00022557076590601;-4.0680271922611e-05;0.00041489693103358;-0.00018908067431767;0.0017962781712413;6.3188243075274e-05;9.051230881596e-05;-1.8229264242109e-05;0.00041126011637971;-7.4346839937789e-06;1.9455801520962e-05;0.00014676775026601;-0.00023565716401208;-0.00014261611795519;-0.0010606473078951;0.00016410237003583;-0.00125550723169;0.00013731153740082;4.4320669985609e-05;1.9421217075433e-05;-7.8101038525347e-05;-9.6956777269952e-05;0.00050902354996651;8.216078276746e-05;-0.00085624010534957;1.3654744179803e-05;-0.0001187925299746;0.00055605836678296;7.5384363299236e-05;-0.00019925473316107;-0.00033374218037352;0.00020792966824956;-9.6674186352175e-05;0.00052539317402989;8.6925319919828e-05;0.0016751274233684;-0.00014927444863133;0.00035507345455699;-8.2859642134281e-06;-0.00035778860910796;-3.4112941648345e-05;0.00042499683331698;0.00017330408445559;-0.00041367168887518;0.00012651570432354;0.0011666911887005;-0.00016814135597087;0.0001595264475327;5.9135971241631e-05;-0.00011723516217899;-5.1796683692373e-05;7.913337321952e-05;-0.00012563982454594;0.00095951475668699;-2.4742155801505e-05;5.1998031267431e-05;-3.0902941944078e-05;-0.00029004804673605;-0.0005952536012046;0.00042788195423782;0.00015144032659009;0.00033775862539187;-0.00055052415700629;-0.00030286269611679;-0.00013223961286712;3.0302383038361e-06;-0.0012251461157575;0.00010606642899802;0.00039158554864116;4.8946109018289e-05;-0.000481416558614;4.5234010030981e-06;0.00026256844284944;3.4465425414965e-05;0.00013339922588784;0.00018068685312755;0.00084973452612758;-0.00023125085863285;-0.00093540298985317;4.7521305532428e-05;-4.8022033297457e-05;7.6557334978133e-05;-9.8658842034638e-05;-3.7573547160719e-05;-0.0014568591723219;6.3503372075502e-05;-0.00043332972563803;-9.3912385636941e-05;0.00019038317259401;-0.0008646339410916;-0.00016561443044338;-9.1582660388667e-05;0.00061180087504908;-1.5846380847506e-05;-6.388098699972e-05;0.00046579277841374;-0.00013470441626851;0.0014358668122441;0.00011151697981404;4.2175735870842e-05;7.619576081197e-06;0.00051451253239065;-5.4201932471187e-06;-8.8843844423536e-05;0.00030858340323903;-0.00015225271636155;0.00032897142227739;9.5905990747269e-05;0.00035303848562762;-1.8469072529115e-05;3.0742191938771e-06;-5.8626490499591e-05;9.6238327387255e-06;1.320594947174e-05;-0.00072807417018339;9.8989519756287e-05;0.00038236886030063;-1.1390039617254e-05;0.00014032699982636;-1.5124053788895e-05;-0.00023010559380054;-0.00012617278844118;2.8388534701662e-05;4.431725028553e-05;0.00010666705202311;-0.00010360720625613;7.1755122917239e-05;-0.0003237156488467;-0.00010240736446576;-0.0002421928656986;4.7376674046973e-05;0.00037968571996316;-1.9245057046646e-05;-0.00029980472754687;1.8908791389549e-05;-0.00015604028885718;2.2119622371974e-05;0.00071045110234991;7.3037357651629e-05;0.00045494790538214;-6.6395085013937e-05;-6.9673478719778e-06;3.3483156585135e-05;4.1715065890457e-05;-3.1556228350382e-05;0.00052341725677252;-8.5642168414779e-06;0.00022702207206748;-2.4300765289809e-05;-0.00013447082892526;-2.3016458726488e-05;-0.00027463291189633;0.00036495257518254;0.00011060907127103;-0.00049399712588638;0.00014359009219334;-0.00025750717031769;-0.00020154436060693;-0.0009730575256981;-2.7386615329306e-05;6.5183558035642e-05;6.4237283368129e-05;-0.00027775616035797;1.4811899745837e-05;9.213561861543e-05;1.5479441572097e-05;-1.2631574008992e-06;5.1747021643678e-05;0.00073803868144751;5.2333703933982e-05;-0.00048119827988558;-0.00012532870459836;-3.6828518204857e-05;7.3416413215455e-05;-2.9400023777271e-05;2.8669033781625e-05;-0.00084083830006421;-3.0868613976054e-05;-0.00016879546456039;1.7126436432591e-05;7.9879318946041e-05;-5.8560759498505e-05;-0.00046573069994338;7.16261783964e-05;-6.6787339164875e-05;-0.00026289309607819;0.00033771136077121;0.00027533993124962;-0.00013060784840491;0.00064211804419756;-3.1702456908533e-05;3.9952967199497e-05;5.8412428188603e-05;0.00032665702747181;8.6993868535501e-06;-7.6134281698614e-05;5.2095870159974e-06;0.00038442687946372;-0.00018034200184047;-4.6763839236519e-06;5.489064642461e-05;0.00012650886492338;5.4767573601566e-05;2.1695223040297e-06;-5.2630904974649e-05;-9.2942298124399e-07;1.7632475646678e-05;-0.00085111742373556;0.00012131378753111;0.0002754689194262;-5.84009103477e-06;0.00016274212975986;-2.6063694349432e-06;-3.3819131203927e-05;-0.00020241516176611;-1.4989390365372e-05;0.00019513996085152;-2.048129135801e-05;1.7309330360149e-05;9.8989141406491e-05;6.7654487793334e-05;-9.7057112725452e-05;-0.00023081331164576;7.381922841887e-06;0.00042190260137431;-3.0742197850486e-05;-0.00029733873088844;1.7500660760561e-05;-4.5140081056161e-05;-5.552632137551e-05;0.00083754071965814;0.00011136781540699;0.00056353694526479;-4.3563020881265e-05;1.0723979357863e-05;5.4801188525744e-05;4.0494011045666e-05;-3.0132749088807e-05;0.00031039721216075;5.2937746659154e-05;0.00032507695141248;-2.2481548512587e-05;-9.9119439255446e-05;-4.0635801269673e-05;-0.0003043774922844;0.0004900018684566;0.0001143550616689;-0.00066960178082809;0.00014313247811515;-0.00029640947468579;-0.00027679672348313;-0.00099107332061976;-8.7095308117568e-05;-2.2336151232594e-05;7.7650496677961e-05;-0.0002014126512222;-3.329331320856e-06;2.8089021725464e-05;2.8925607693964e-05;-0.00011541404819582;0.00010858997848118;0.0010690983617678;5.4060155889601e-06;-0.00032518644002266;-0.00016110501019284;-5.7049273891607e-05;8.7617663666606e-05;-1.1677038855851e-05;1.799626625143e-05;-0.00081468722783029;-6.2097409681883e-05;-6.6576605604496e-05;-3.1389970445161e-06;8.6110871052369e-05;-6.1176047893241e-05;-0.00050359813030809;0.00017352774739265;-5.0854381697718e-05;-0.000496611231938;0.00039472241769545;0.00023505339049734;-0.0001771412207745;0.0003459598228801;1.7772194041754e-05;2.5871970137814e-05;7.1264606958721e-05;0.00036651332629845;2.0027664504596e-05;-0.00012962291657459;1.0403829946881e-05;-0.00020138459512964;0.00020308885723352;-0.00058065156918019;0.0004438602773007;3.0976778361946e-05;6.9493667979259e-05;-5.5760647228453e-05;9.0234803792555e-05;6.503833901661e-06;-9.5911773314583e-06;0.00019366329070181;-0.00019440829055384;-2.2143733076518e-05;4.2890813347185e-05;3.3310872822767e-05;-1.3854118151357e-05;0.00011660953896353;5.0531652959762e-05;-1.2567664271046e-05;-9.6058429335244e-05;-1.7481803297414e-05;0.00019506759417709;-0.0002412394824205;0.00019894409342669;-0.00016764170140959;-5.8358749811305e-05;-4.3182440094824e-06;-5.3468851547223e-05;7.2967013693415e-05;-9.4862052719691e-06;-9.7278607427143e-06;8.1876954936888e-05;5.0024646043312e-05;-1.0445295629324e-05;-0.00010412155097583;0.00047862797509879;0.00041974440682679;8.511841588188e-05;0.0001243015867658;-3.6653633287642e-05;-5.2014016546309e-05;-0.0001627933816053;-0.00012730782327708;7.3270442953799e-05;3.3860676921904e-05;7.0607013185509e-05;6.3551095081493e-05;0.0013885505031794;0.0011127311736345;0.00010745608597063;-0.0013811364769936;-0.0012140775797889;-0.00033559495932423;-0.00041204909211956;7.5853015005123e-05;0.00012697165948339;-0.00020134197256994;-0.00017835632024799;-1.6456735465908e-05;-1.2971783689864e-05;-2.9479138902389e-05;-1.7745900549926e-05;-0.00025991623988375;-0.00017114139336627;-0.00029332374106161;-0.00036821121466346;0.00015590887051076;9.8226701084059e-05;-2.6834417440114e-05;-7.871410343796e-05;3.5780394682661e-06;1.1687923688442e-05;0.00019546192197595;0.0001531235902803;-1.474321106798e-05;-3.2565978472121e-05;1.4059384739085e-05;3.3666448871372e-05;0.0012046741321683;-0.00013235682854429;5.1832877943525e-05;-0.00022190689924173;-0.00019410473760217;-2.1319672669051e-05;6.1596976593137e-05;-6.9860063376836e-05;9.636094233656e-08;-4.0303311834577e-05;-2.4739314540057e-05;-3.3457850804552e-05;-1.9927338144043e-05;1.6986692571663e-05;2.5264041596529e-06;-0.00020993378711864;0.00020372610015329;-0.00053796387510374;0.00047444188385271;2.668593879207e-05;6.7917608248536e-05;-5.6135027989512e-05;9.0064662799705e-05;6.8953449954279e-06;-9.6307130661444e-06;0.0001979044318432;-0.00019315378449392;-1.7972970454139e-05;4.664518928621e-05;3.0374529160326e-05;-1.5475014151889e-05;6.471842789324e-05;5.1599723519757e-05;-9.5825234893709e-06;-8.5520936409011e-05;-1.0141079656023e-05;0.00019100830832031;-0.00024432240752503;0.00017677673895378;-0.00018244078091811;-5.2622803195845e-05;-1.4888499890731e-06;-5.4999301937642e-05;7.1914473664947e-05;-9.2941836555838e-06;-9.9953122116858e-06;7.287849439308e-05;6.2795705161989e-05;-2.9408294722089e-05;-8.8437940576114e-05;0.00047303547034971;0.00041547018918209;8.7877415353432e-05;0.00012223910016473;-3.7910082028247e-05;-5.0445603847038e-05;-0.00015107954095583;-0.00014194718096405;6.6852087911684e-05;4.110674126423e-05;6.9697845901828e-05;6.3702485931572e-05;0.0013782097958028;0.0011059300741181;0.00010588571603876;-0.0013536185724661;-0.001221995218657;-0.00034009062801488;-0.00040213414467871;8.3139180787839e-05;0.00012517886352725;-0.00019964021339547;-0.00017964644939639;-1.9845476344926e-05;-1.0756715710158e-05;-2.5852454200503e-05;-2.1190586267039e-05;-0.00024869135813788;-0.00018361485854257;-0.00030710053397343;-0.00034040096215904;0.0001634294167161;0.0001036937101162;-2.5849223675323e-05;-7.6146861829329e-05;2.2384326712199e-06;1.2576995686686e-05;0.00019727731705643;0.00015130219981074;-1.8550612367108e-05;-2.5818084395723e-05;1.5656876712455e-05;3.2637188269291e-05;0.0012041517766193;-0.0001168992384919;5.2574381697923e-05;-0.00023736793082207;-0.00020294792193454;-2.3714528651908e-05;5.1892660849262e-05;-5.9881749621127e-05;-1.6113717720145e-05;-4.4151780457469e-05;-2.5312003344879e-05;-3.5787619708572e-05;-1.8127098883269e-05;1.9008743038285e-05;3.6409964820905e-08;0.00014393108722288;-0.00024670799029991;-4.1628070903243e-05;-0.00021325131820049;-1.4417357306229e-05;-0.00036225037183613;5.2665876864921e-05;1.2163824067102e-05;2.3027033080325e-07;-2.2363346943166e-05;-0.0001136885402957;0.00051082018762827;2.9419397833408e-05;-0.00036180787719786;1.4039662801224e-06;-0.00012002915173071;8.1315782153979e-05;0.0001080520087271;-3.6784716940019e-05;-2.8915772418259e-05;-3.091790858889e-05;-6.1498561990447e-05;0.00010443881183164;7.2075505158864e-05;0.00037281305412762;-3.0373528716154e-05;0.00021365220891312;2.2361529772752e-05;-0.00028820868465118;-2.1732350433012e-05;0.00026923211407848;2.1170375475776e-05;-0.00013996845518705;9.6067524282262e-05;0.00087091972818598;-0.00010820570605574;0.00039130315417424;4.8506233724765e-05;-1.9401777535677e-05;-3.2662301236996e-05;5.0944934628205e-05;-4.4370385694492e-06;0.00034391359076835;-2.5911191187333e-05;0.00023496414360125;-3.7177574995439e-05;-0.00012607368989848;-0.00036653733695857;0.00041912737651728;9.5696072094142e-05;0.00021706975530833;-0.00060496019432321;-0.00023411109577864;-0.00020934327039868;-4.3401916627772e-05;-0.00087950885063037;9.0468725829851e-05;6.2136787164491e-05;1.122913636209e-05;-0.00020097554079257;2.0175857571303e-05;5.8982550399378e-05;9.4097296823747e-05;-6.1528960941359e-05;5.4478034144267e-05;0.00089819962158799;-0.00018936477135867;-0.00036139183794148;5.6300712458324e-05;-6.5285101300105e-05;2.4467573894071e-05;-2.0917805159115e-05;-7.142798131099e-05;-0.00077750626951456;1.6280346244457e-05;-9.077820868697e-05;-5.7807446864899e-05;0.00010999624646502;-0.00056580355158076;2.9773878850392e-05;-4.6560027840314e-05;0.00044004086521454;-0.00029104738496244;-0.00010129311704077;0.00025184926926158;-1.2492771020334e-05;0.00040122034261003;7.937682676129e-05;1.7671456589596e-05;1.8452732547303e-05;0.00035557281807996;1.9844483176712e-06;-0.00013655719521921;0.00020967492309865;-0.00035907828714699;-6.5725347667467e-05;-0.00033775490010157;-1.452476499253e-05;-0.0005425387644209;7.7911441621836e-05;1.8104457922163e-05;2.1860313381694e-07;-3.312340049888e-05;-0.00016488558321726;0.0007505954708904;4.2547446355456e-05;-0.00053673482034355;3.1830197713134e-06;-0.00017654344264884;0.00013771311205346;0.00015643771621399;-5.5969496315811e-05;-5.402981696534e-05;-3.7596193578793e-05;-9.0127425210085e-05;0.00015898696437944;0.0001072382365237;0.00056564243277535;-4.7689711209387e-05;0.00031497169402428;3.2176718377741e-05;-0.00042481487616897;-3.163626024616e-05;0.00039737077895552;3.2490395824425e-05;-0.0002064951841021;0.00014254813140724;0.0012642529327422;-0.00015914025425445;0.00056284765014425;6.9917041400913e-05;-2.9188193366281e-05;-4.7404089855263e-05;7.4402334576007e-05;-8.4377197708818e-06;0.00051127042388543;-3.6903798900312e-05;0.00033774226903915;-5.4049371101428e-05;-0.00018668788834475;-0.00054000591626391;0.00060367904370651;0.00013915704039391;0.00031925740768202;-0.00086913391714916;-0.00033846290898509;-0.00030221664928831;-6.3858155044727e-05;-0.0012817200040445;0.00013199000386521;9.5969982794486e-05;1.7040352759068e-05;-0.00029811947024427;2.8786209441023e-05;9.0472152805887e-05;0.00013526181282941;-8.4966835856903e-05;8.2500620919745e-05;0.0013080519856885;-0.00027629805845208;-0.00053293403470889;8.3329519839026e-05;-9.4494032964576e-05;3.647199991974e-05;-3.2221301808022e-05;-0.00010297918197466;-0.001144721521996;2.4581602701801e-05;-0.00013921223580837;-8.5530999058392e-05;0.00016228131426033;-0.00082850712351501;4.8445228458149e-05;-6.7970344389323e-05;0.00064342649420723;-0.00042909235344268;-0.00015160201292019;0.00036874890793115;-2.1157165974728e-05;0.00060376577312127;0.00011678650480462;2.5199624360539e-05;2.6511432224652e-05;0.00052134657744318;3.0251139833126e-06;-0.00019804727344308;0.00021731774904765;-0.00036803289549425;-0.00012011145736324;-0.00067039369605482;5.7989866036223e-05;-0.00076486903708428;9.2123264039401e-05;3.1675564969191e-05;2.4431481051579e-06;-4.5218959712656e-05;-0.00016561579832342;0.00083361985161901;5.1638482545968e-05;-0.00066584552405402;1.7985250451602e-05;-0.00018803379498422;0.00035145087167621;0.00012009446072625;-0.00010026200470747;-0.00019619113299996;8.1174810475204e-05;-7.3580122261774e-05;0.00025971731520258;0.00013353484973777;0.00088569626677781;-9.6554547781125e-05;0.00035526262945496;2.5527135221637e-05;-0.00048067880561575;-3.6583045584848e-05;0.00045471926569007;8.9844434114639e-05;-0.00030250972486101;0.00014149387425277;0.001262805541046;-0.00017951060726773;0.00053887692047283;5.633387263515e-05;-4.7313566028606e-05;-5.2604427764891e-05;8.0866906500887e-05;-5.8293455367675e-05;0.00077917316230014;-3.8840782508487e-05;0.00028022602782585;-4.4525200792123e-05;-0.00024620367912576;-0.00057419383665547;0.00056700868299231;0.00016348775534425;0.00033509207423776;-0.0007888819091022;-0.00031990456045605;-0.00031892085098661;-3.2902251405176e-05;-0.0014176229014993;0.00013246489106677;0.00018993931007572;3.3471431379439e-05;-0.0004230318882037;2.01696439035e-05;0.00017400510841981;0.00010071873111883;-2.6209177121927e-06;0.00012373388744891;0.0012041043955833;-0.00026608011103235;-0.0007645768346265;9.2365116870496e-05;-8.7898260971997e-05;5.07717304572e-05;-5.4166568588698e-05;-7.9001372796483e-05;-0.0013275103410706;4.2554911487969e-05;-0.00026692537358031;-9.6918338385876e-05;0.0001710141368676;-0.00087862281361595;-9.7347856353736e-07;-9.4782844826113e-05;0.00066375778988004;-0.00032497689244337;-0.000156792535563;0.00046647153794765;-7.0194699219428e-05;0.00098427128978074;0.00011794615420513;5.1131810323568e-05;1.8274417016073e-05;0.00054253643611446;2.1319781353668e-06;-0.00015974296547938;0.00063145923195407;-0.00028354983078316;-0.00042813565232791;2.5622119210311e-05;-0.00015404072473757;0.0001693727390375;-4.1391481317987e-06;-5.8992249250878e-05;-1.4126635505818e-05;2.999757816724e-05;-0.0013554418692365;0.00019441674521659;0.00022692102356814;5.6779458645906e-07;0.00025055525475182;1.0725327229011e-05;0.00019322459411342;-0.00037839685683139;-8.1332691479474e-05;0.00046809483319521;-0.00018390211334918;0.00020215533731971;0.00016295291425195;0.0006301921675913;-0.00012881313159596;-0.00028952088905498;-4.1456260078121e-05;0.00064335617935285;-5.686125223292e-05;-0.00040325964801013;2.2355176042765e-05;0.00010075280442834;-0.00018771160102915;0.0012505962513387;0.00021002265566494;0.00085897848475724;-1.8630507838679e-05;3.7038698792458e-05;9.92838977254e-05;5.1991788495798e-05;-3.7929396057734e-05;0.00014983795699663;0.00015923647151794;0.00054864789126441;-2.44591919909e-05;-9.4121081929188e-05;-7.6354088378139e-05;-0.00044641728163697;0.00080257380614057;0.00015633135626558;-0.001084377290681;0.00017990534252021;-0.00043505334178917;-0.00046461992315017;-0.00132386025507;-0.00020646468328778;-0.00012980743485969;0.00011869550507981;-0.00018590920080896;-3.0466568205156e-05;-3.3402709959773e-05;5.5691656598356e-05;-0.00030893136863597;0.00022257356613409;0.0018630872946233;-5.8330817410024e-05;-0.00022277540119831;-0.00026315086870454;-9.5032482931856e-05;0.00013375593698584;5.3847447816224e-06;1.0915931852651e-05;-0.0010486876126379;-0.00012567060184665;4.1547908040229e-05;-3.2951262255665e-05;0.00012017862900393;-8.4794046415482e-05;-0.00071651220787317;0.0003710527671501;-4.6474229748128e-05;-0.0009785108268261;0.00059884623624384;0.00025041721528396;-0.0002949524205178;8.4627485193778e-05;9.264460823033e-05;9.7716410891735e-06;0.00011262727639405;0.0005283925565891;4.3047850340372e-05;-0.00023294398852158;2.0846526240348e-05;0.00061728240689263;-0.00026208756025881;-0.00056797434808686;-3.7190395687503e-06;-0.00030502307345159;0.00019093879382126;-1.038782284013e-05;-4.3664495024132e-05;-1.938005334523e-05;3.0260620405897e-05;-0.0013487044489011;0.00017777545144781;0.00012776951189153;3.9573874346388e-06;0.0002438581577735;1.5553154298686e-05;0.00027894144295715;-0.00038753700209782;-0.00010467030369909;0.00050847267266363;-0.00022985873511061;0.00027707678964362;0.0001561089156894;0.00084415724268183;-0.00010553321044426;-0.00024800404207781;-6.1296967032831e-05;0.00062969251303002;-5.5290478485404e-05;-0.00036767483106814;1.8961331079481e-05;0.0002180834999308;-0.00025196265778504;0.0010850937105715;0.00023653569223825;0.00074776815017685;2.5988456400228e-05;4.7334342525573e-05;9.8943957709707e-05;4.16451584897e-05;-3.0172574042808e-05;-2.0567676983774e-05;0.00020389423298184;0.00051873555639759;-1.111681558541e-05;-6.8507026298903e-05;-7.7287972089835e-05;-0.00040356884710491;0.00075610470958054;0.00013358668365981;-0.00098036287818104;0.00012485217303038;-0.0003812434442807;-0.00045107110054232;-0.0010873676510528;-0.00025219653616659;-0.00015411323693115;0.00010530354484217;-0.000133083172841;-4.6447927161353e-05;-5.1930084737251e-05;5.7129749620799e-05;-0.00036364904372022;0.00023821122886147;0.0018722116947174;-9.9244694865774e-05;-7.4420466262382e-05;-0.00024436274543405;-8.8131324446294e-05;0.00013285978639033;1.2979255188839e-05;2.2299354895949e-06;-0.00090159283718094;-0.00013056822353974;9.1555215476546e-05;-4.7665154852439e-05;0.00010817676229635;-7.6199197792448e-05;-0.0006148325628601;0.00044271184015088;-2.7710739232134e-05;-0.0010824956698343;0.00054161454318091;0.00017680958262645;-0.0003108202945441;-9.6313640824519e-05;0.00012301329115871;-1.038718255586e-05;0.00010492059664102;0.00047688666381873;4.6372188080568e-05;-0.00022581583471037;2.3656983103137e-05;-0.00029359417385422;0.00030535375117324;-0.00062237679958344;0.0003822365833912;-3.8130913253553e-06;8.8087959738914e-05;-4.1561565012671e-05;7.0728710852563e-05;5.8219279708283e-06;-9.8475420600153e-06;0.00023498988593929;-0.00025771802756935;-4.0272487240145e-05;4.0365073800785e-05;2.4590122848167e-05;4.528485078481e-06;0.00018244414241053;2.6613523004926e-05;-1.8208957044408e-05;5.4836196795804e-05;-0.00016638303350192;0.0001535097399028;-0.00016663240967318;0.00019398298172746;-8.7223925220314e-05;-3.9562735764775e-05;-3.1365372706205e-05;-5.2356477681315e-05;8.323597285198e-05;-1.4516741657644e-06;-1.8956832718686e-05;0.00016723887529224;6.0897174989805e-05;2.2658283342025e-05;-8.7716129200999e-05;0.00047105154953897;0.00041845004307106;0.00011842716048704;0.00015712439198978;-3.5625726013677e-05;-5.0190519687021e-05;-0.00028112970176153;-0.0001579113304615;0.0001209082765854;6.0987083998043e-05;7.4523486546241e-05;5.9496520407265e-05;0.0012267617275938;0.0011833137832582;7.3076436819974e-05;-0.0013610373716801;-0.0011677069123834;-0.00034927774686366;-0.00043973053107038;0.00011887945584022;0.00013867419329472;-0.00024593400303274;-0.00020570946799126;-6.4930291046039e-06;-2.3582102585351e-05;-4.344321496319e-05;-1.6980760847218e-05;-0.00032354771974497;-0.00018066739721689;-7.3357405199204e-05;-0.00026155920932069;0.00034697566297837;0.00025148506392725;-9.3547369033331e-06;-5.3708110499429e-05;-2.3592916420512e-07;4.1007751860889e-06;0.00018989694945049;0.00014639915025327;1.0853958883672e-05;-2.6190644348389e-05;3.2814961741678e-05;4.8666373913875e-05;0.0013148381840438;0.00018138661107514;6.8880835897289e-05;-0.00060626276535913;-0.00049748277524486;-0.00012344746210147;-4.5878856326453e-05;-0.00016959072672762;-3.8799036701676e-05;-9.4431925390381e-05;-7.0301997766364e-05;-1.5487950804527e-05;-8.5453202700592e-06;3.6416934108274e-06;-1.0901903806371e-06;-0.00045701756607741;0.00045724428491667;-0.00079160713357851;0.00058572978014126;-3.2546331567573e-06;0.00011998092668364;-6.2745435570832e-05;0.0001057985573425;1.0939535968646e-05;-1.578391311341e-05;0.00034969911212102;-0.00036713489680551;-3.9425744034816e-05;5.6592616601847e-05;2.9415932658594e-05;1.627648430258e-06;0.00016923736257013;4.937092307955e-05;-2.0119077817071e-05;6.813790241722e-05;-0.00020596304966602;0.00021845239098184;-0.00025890755932778;0.00021974035189487;-0.00014447359717451;-4.9664406105876e-05;-3.5504363040673e-05;-8.1164558650926e-05;0.00011896487558261;-4.2400765778439e-06;-2.3926158974064e-05;0.00022721069399267;0.00012633972801268;-9.7178226496908e-06;-0.00011486436414998;0.00064943876350299;0.00057889905292541;0.00017426768317819;0.00022199160594027;-5.3276206017472e-05;-7.0808157033753e-05;-0.0003806724853348;-0.0002629226364661;0.00016398497973569;0.00010279396519763;0.00010365417256253;8.738118049223e-05;0.0017374239396304;0.0016597233479843;0.00010113909229403;-0.0018805679865181;-0.001669134828262;-0.00050032680155709;-0.00060287880478427;0.00018764392007142;0.00021093546820339;-0.00034639530349523;-0.00029966101283208;-2.2260868718149e-05;-3.317997106933e-05;-5.4721720516682e-05;-3.1438630685443e-05;-0.00044359627645463;-0.00028856564313173;-0.00013627322914544;-0.00030987337231636;0.00051057786913589;0.00038299555308186;-4.6015647967579e-06;-6.9674191763625e-05;-3.1347924505098e-06;8.2976821431657e-06;0.00028088773251511;0.00021225828095339;1.4290007129603e-05;-1.6070971469162e-05;4.6846049372107e-05;6.7509790824261e-05;0.0018921456066892;0.00029776920564473;9.8104639619123e-05;-0.00088734616292641;-0.00075119500979781;-0.00019022656488232;-8.5992003732827e-05;-0.00022650632308796;-9.7846030257642e-05;-0.00014670599193778;-0.0001092611491913;-3.6541645386023e-05;-1.632837120269e-05;1.3190870049584e-05;-5.1339907258807e-06;-0.00048476390657015;0.00046400903374888;-0.00070366158615798;0.00066031084861606;-1.0261264833389e-05;0.00012205154052936;-6.3744519138709e-05;0.00010676643432816;1.2342557965894e-05;-1.6053396393545e-05;0.00037171388976276;-0.00036251769051887;-2.8932225177414e-05;6.6086431615986e-05;2.0949562895112e-05;-3.2338707569579e-06;5.8267603890272e-05;6.0510697949212e-05;-1.1957565220655e-05;9.2420290457085e-05;-0.00019972783047706;0.00020630909421016;-0.00027204945217818;0.00016257529205177;-0.0001841575576691;-3.4997450711671e-05;-2.885809954023e-05;-8.8644235802349e-05;0.00011511957563926;-2.5503156848572e-06;-2.3321912522078e-05;0.00019794404215645;0.00016910697740968;-3.9033260691212e-05;-8.9688932348508e-05;0.00064620457123965;0.00057212775573134;0.00018244016973767;0.00022084239753895;-5.5731230531819e-05;-6.8956716859248e-05;-0.00034998738556169;-0.0003079121815972;0.00015293496835511;0.00012041812442476;0.00010097539779963;8.987349428935e-05;0.0017273189732805;0.0016638686647639;9.8307442385703e-05;-0.0018422971479595;-0.0016989267896861;-0.00051825458649546;-0.00058596668532118;0.00019365837215446;0.00021925811597612;-0.00034399909782223;-0.00030829038587399;-3.1935178412823e-05;-2.7619693355518e-05;-4.6716701035621e-05;-3.9963491872186e-05;-0.00041856404277496;-0.00032530815224163;-0.00017842545639724;-0.00023132433125284;0.00052700965898111;0.00041126171709038;-1.2830747664339e-07;-6.6316482843831e-05;-6.7114715420757e-06;1.0815225323313e-05;0.00028621440287679;0.00020983270951547;4.4219364099263e-06;2.3002266971162e-06;5.0055838073604e-05;6.7747059802059e-05;0.0019106050021946;0.0003404782328289;0.00010081059735967;-0.00091511616483331;-0.00080660614185035;-0.00020246978965588;-0.00010665519948816;-0.00020151562057436;-0.00014383974485099;-0.00015546994109172;-0.00011564679152798;-4.209574763081e-05;-1.1447217730165e-05;1.861275814008e-05;-1.2524786143331e-05;-0.00038337835576385;0.00035452048177831;-0.00044059459469281;0.00050821679178625;-1.9759996575885e-05;9.4276321760844e-05;-4.383945997688e-05;7.3471805080771e-05;1.0460250450706e-05;-1.2417195648595e-05;0.00028754692175426;-0.00026265202905051;-1.4703547094541e-05;5.201416570344e-05;6.3203087847796e-06;-2.2389472178475e-06;-2.5703406208777e-05;4.8184912884608e-05;-3.2886994176806e-06;0.00011214292317163;-0.00016779600991867;0.00012950469681527;-0.0001900934294099;6.8631954491138e-05;-0.00014322747301776;-9.0067660494242e-06;-2.1798470697831e-05;-6.6928652813658e-05;7.8427117841784e-05;-1.1084045326015e-07;-1.6180772945518e-05;0.00013502640649676;0.00015673467714805;-3.4461787436157e-05;-3.7557270843536e-05;0.00044643209548667;0.0003932322433684;0.00014111514610704;0.00016198003140744;-4.0572344005341e-05;-4.6952616685303e-05;-0.0002503371797502;-0.00026104363496415;0.00011127560719615;0.00010522509546718;6.8600980739575e-05;6.3444444094785e-05;0.0011701484909281;0.0011879163794219;6.034346006345e-05;-0.0012634075246751;-0.0012062889290974;-0.0003800128470175;-0.00040541664930061;0.00014641285815742;0.00016337806300726;-0.00024718046188354;-0.00022807656205259;-2.7880865673069e-05;-1.7504462448414e-05;-3.0031800633878e-05;-3.4541084460216e-05;-0.00028996559558436;-0.00026099511887878;-0.0001043228621711;-7.0182206400204e-05;0.00042115087853745;0.00034386178595014;7.7741788118146e-06;-3.9636259316467e-05;-8.1701991803129e-06;8.337171493622e-06;0.00020019794465043;0.0001411027769791;3.0065343707975e-06;1.9121822333545e-05;4.1180341213476e-05;5.1445997087285e-05;0.0013751874212176;0.00034028416848741;7.7683027484454e-05;-0.00073940103175119;-0.00067598384339362;-0.00017676062998362;-0.00011430539598223;-0.00014749936235603;-0.00014905058196746;-0.00012663623783737;-9.6001727797557e-05;-2.8004436899209e-05;1.3519047570298e-07;1.3271932402859e-05;-1.6825682905619e-05;0.00027735467301682;-0.00050873053260148;-5.7287430536235e-05;-8.3429498772603e-05;-0.00010068785195472;-0.00015056873962749;4.4381034967955e-05;3.7435711419675e-05;-1.3165406926419e-05;-1.0210368600383e-05;-0.00022489667753689;0.001135072670877;2.1707237465307e-05;-0.00037752211210318;8.1898742791964e-06;-0.00024212549033109;2.0017310816911e-05;0.00021575058053713;9.9222352218931e-06;2.9711660317844e-05;-0.00015692699525971;-6.060262239771e-05;-7.2213806561194e-05;0.0001535425108159;-5.8755016652867e-05;-1.137269919127e-05;0.00029807339888066;5.8269350120099e-05;-0.00058612274006009;-3.5368128010305e-05;0.00044055780745111;-9.063530160347e-05;-5.3739935538033e-05;0.00020797296019737;0.0012252752203494;-0.00011348202679073;0.00071846425998956;6.8950728746131e-05;1.6936568499659e-05;-4.4321866880637e-05;6.803802534705e-05;9.2795839009341e-05;0.00040536691085435;-3.3167441870319e-05;0.00043979086331092;-6.6262757172808e-05;-0.00017047391156666;-0.00052403914742172;0.00069450295995921;0.00015341537073255;0.00026440757210366;-0.000944749917835;-0.00037461347528733;-0.00040159758646041;-0.00015924662875477;-0.0013156639179215;0.00014412705786526;-5.680969934474e-06;-1.0379098057456e-05;-0.00029939794330858;4.2347754060756e-05;6.5059888584074e-05;0.00020151287026238;-0.0002086494496325;1.913394589792e-05;0.0016596029745415;-0.00030865010921843;-0.00042157736606896;0.00013026790111326;-0.00011507681483636;1.9216380678699e-05;-5.5949981287995e-06;-0.00014093749632593;-0.0011120068375021;9.7395786724519e-07;-4.8204434278887e-05;-9.3862399808131e-05;0.00014806259423494;-0.00084076740313321;0.0002399688528385;-7.2479131631553e-05;0.00069625052856281;-0.00077143055386841;-0.00025649968301877;0.00036698512849398;4.1925290133804e-05;0.00036597321741283;0.00012647613766603;2.4143340851879e-05;3.8537145883311e-05;0.00053319043945521;1.2409558621584e-05;-0.00022889356478117;0.00022263283608481;-0.00039788475260139;-9.1630092356354e-05;-0.00031587711418979;-2.2484446162707e-05;-0.00024672990548424;3.8193884392967e-05;3.7328492908273e-05;-9.9028575277771e-06;-1.4395026482816e-05;-0.00017825303075369;0.00094560970319435;1.9118288037134e-05;-0.0003726028080564;2.099406265188e-05;-0.00019735684327316;0.00018483503663447;0.00012747047003359;-1.8789411114994e-05;-9.0429050032981e-05;-1.9890681869583e-05;-2.3718201191514e-05;2.3526094992121e-06;0.00014723394997418;0.00014733533316758;-4.6394867240451e-05;0.00025649333838373;4.2415027564857e-05;-0.00049520697211847;-3.1169882277027e-05;0.00038070292794146;-1.2810645785066e-05;-0.00012855567911174;0.00014486986037809;0.00093177717644721;-0.00011306445958326;0.0005734123988077;3.6841702240054e-05;5.5375135161739e-06;-3.8120637327665e-05;5.7262917835033e-05;2.1439303964144e-05;0.00052414333913475;-3.0659983167425e-05;0.00030832571792416;-4.1083138057729e-05;-0.00017319132166449;-0.0004151132889092;0.00049618678167462;0.00013714493252337;0.00021745423146058;-0.00066606869222596;-0.00025621303939261;-0.0003420518769417;-8.1121470429935e-05;-0.0011378843337297;0.0001113494290621;5.1292226999067e-05;8.5988103819545e-06;-0.00032338130404241;2.4703553208383e-05;0.00010898000618909;0.00012206451356178;-8.9519133325666e-05;4.9723123083822e-05;0.0011580999707803;-0.00022278544201981;-0.00050397665472701;0.00010772342648124;-8.56674159877e-05;2.423421756248e-05;-1.8251332221553e-05;-8.5922350990586e-05;-0.00096778641454875;1.6511097783223e-05;-0.00012962754408363;-7.955218461575e-05;0.0001157078295364;-0.00067234796006233;0.00013805665366817;-7.8200704592746e-05;0.00053977069910616;-0.00048947148025036;-0.00019938391051255;0.00036250369157642;-9.7237671070616e-06;0.00055531936232001;9.4926392193884e-05;4.425381848705e-05;2.1421454221127e-05;0.00041932860040106;8.581239853811e-06;-0.00014600979920942;0.00066419289214537;-0.00028587016277015;-0.00065045163501054;-6.2668732425664e-06;-0.00035166402813047;0.00021379932877608;-1.0035766536021e-05;-4.6881265006959e-05;-2.22091730393e-05;3.2806645322125e-05;-0.0014301117043942;0.00019549588614609;0.00012062763562426;6.1959426602698e-06;0.00025963337975554;1.8284768884769e-05;0.00032085622660816;-0.00042237641173415;-0.00011575876851566;0.00056335376575589;-0.00026262932806276;0.00030643580248579;0.00017109391046688;0.00094010430620983;-0.00011572233779589;-0.00026013804017566;-7.033976726234e-05;0.00066541653359309;-6.1465187172871e-05;-0.0003860630095005;1.9686542145791e-05;0.00023547674936708;-0.00027090794174001;0.0011828760616481;0.00025175526388921;0.00081368954852223;2.5151683075819e-05;5.1224691560492e-05;0.00010833331907634;4.4064527173759e-05;-3.1518593459623e-05;-5.6213848438347e-05;0.0002204634656664;0.00056432589190081;-1.2787524610758e-05;-6.4155421569012e-05;-8.5082465375308e-05;-0.0004358297737781;0.00081991718616337;0.00014154677046463;-0.0010740497382358;0.0001406515511917;-0.00040896941209212;-0.0004884953959845;-0.0011591872898862;-0.00027072249213234;-0.00017812801524997;0.00011515160440467;-0.00012178376346128;-5.0264541641809e-05;-6.8958099291194e-05;6.2426013755612e-05;-0.0003970215911977;0.00025972924777307;0.0020315384026617;-0.00010757887503132;-4.9920308811124e-05;-0.00026919378433377;-9.7370582807343e-05;0.00014175349497236;1.6312216757797e-05;1.0690671388147e-06;-0.00095240754308179;-0.0001434314326616;0.00011582417937461;-5.2648116252385e-05;0.00011766864190577;-8.2039536209777e-05;-0.00066946487640962;0.00047886048560031;-2.5551900762366e-05;-0.0011743381619453;0.00059094477910548;0.00017913630290423;-0.00033403935958631;-0.00015479998546652;0.00013586174463853;-1.4462616491073e-05;0.00011539825209184;0.00051515933591872;5.0657112296904e-05;-0.00025132883456536;2.5684223146527e-05;0.00076592131517828;-0.00031245575519279;-0.0010465338127688;-6.9652392994612e-05;-0.00051002576947212;0.00030148890800774;-1.0814979759743e-05;-5.3575979109155e-05;-2.9539718525484e-05;3.5464796383167e-05;-0.0015993086853996;0.00021043220476713;5.4349678975996e-05;2.546183850427e-06;0.00029413256561384;3.987964373664e-05;0.00058567890664563;-0.00052866351325065;-0.00015421232092194;0.00074894475983456;-0.00043115549487993;0.00040428075590171;0.00022435157734435;0.0012856064131483;-8.9135603047907e-05;-0.0002780367503874;-0.00011876937060151;0.00073930044891313;-6.9039037043694e-05;-0.00041018897900358;1.8729946532403e-05;0.00038591751945205;-0.0003863136516884;0.0013634803472087;0.00031239492818713;0.00090577459195629;8.4584236901719e-05;6.6462314862292e-05;0.00014767517859582;4.5452568883775e-05;-3.4401855373289e-05;-0.00026589192566462;0.00031174437026493;0.0006660875515081;-8.2868527897517e-06;-4.5359989599092e-05;-0.00010632174962666;-0.00046232299064286;0.001029018429108;0.00015234161401168;-0.0013260432751849;0.00010433443094371;-0.0004457434406504;-0.00062534306198359;-0.0011984289158136;-0.00036254301085137;-0.00024571496760473;0.00012446290929802;-7.4563118687365e-05;-7.7200566011015e-05;-0.00011626725608949;8.1015597970691e-05;-0.00055327959125862;0.00033854963839985;0.0024831746704876;-0.00018994919082616;9.1745685494971e-05;-0.00030782649992034;-0.00011544413428055;0.0001549504668219;2.8859551093774e-05;-7.359642040683e-06;-0.0010095520410687;-0.00018141232430935;0.00019804925250355;-8.4220322605688e-05;0.00013364040933084;-8.3531485870481e-05;-0.00069461873499677;0.00060461432440206;-9.4333408924285e-06;-0.0014894324121997;0.0006533320993185;0.0001421501947334;-0.00038567101000808;-0.0003982909838669;0.0002087336324621;-3.5096156352665e-05;0.00012929110380355;0.00058626162353903;6.7170840338804e-05;-0.00030757911736146;3.2173564250115e-05;0.00031895714346319;-9.2615184257738e-05;-0.0013580976519734;-0.00021383278362919;-0.00030002972926013;0.00030298181809485;1.2912651982333e-05;-4.0056809666567e-05;-1.9790779333562e-05;3.9595297494088e-06;-0.00041797207086347;5.1013135816902e-05;-0.00013517768820748;-2.2149013602757e-05;0.00011070491746068;7.8204524470493e-05;0.00096618896350265;-0.00031017931178212;-9.3332499091048e-05;0.00056254741502926;-0.00061206420650706;0.00020470708841458;0.00018149029347114;0.00090892164735124;9.2044429038651e-05;-0.00011011249443982;-0.00015768384037074;0.00019616681674961;-2.1261188521748e-05;-8.4874794993084e-05;-1.5702846667409e-06;0.00031426586792804;-0.00028354520327412;0.0009019008721225;0.00010012909478974;0.00056570605374873;0.00018517079297453;4.1276864067186e-05;0.00015410040214192;1.8226202882943e-05;-2.8676358851953e-05;-0.00049399840645492;0.00023893243633211;0.0003978798922617;-1.9427594452281e-05;4.6662276872667e-05;-6.2204446294345e-05;1.2795379916497e-05;0.00092960521578789;7.7618351497222e-05;-0.0012330234749243;-0.00014989275950938;-0.00024078460410237;-0.00054520252160728;-0.00048174191033468;-0.00019973368034698;-0.00022990045545157;2.8909385946463e-05;0.00010997032222804;-6.7871857027058e-05;-0.00015255443577189;6.5408290538471e-05;-0.00047519418876618;0.00023786140081938;0.001378700719215;-0.0002844447735697;0.00026112131308764;-0.00011214474216104;-7.8714292612858e-05;1.6484469597344e-05;3.8256581319729e-05;-2.0681749447249e-05;-0.0003170965355821;-0.00010372924589319;0.00020371304708533;-0.00010106018453371;5.9648486057995e-05;5.2737377700396e-06;-6.2168714066502e-05;0.00023346969101112;2.9872138838982e-05;-0.00081501522799954;0.0001967533462448;-1.5344274288509e-05;-8.62910746946e-05;-0.00059804081683978;0.00022975845786277;-2.1566214854829e-05;3.4864315239247e-05;0.00029190175700933;4.9742553528631e-05;-0.0001924377575051;1.6507869077032e-05;-0.0004875473678112;0.00050058629130945;-0.00064760213717818;0.00036542289308272;-1.6751138900872e-05;8.9651482994668e-05;-4.0532981074648e-05;7.0034686359577e-05;9.7809588623932e-06;-1.5102484212548e-05;0.00033052073558792;-0.00038156408118084;-4.9255846533924e-05;3.7429119402077e-05;1.8271308363182e-05;2.0804944142583e-05;0.00021297061175574;1.2920138033223e-05;-2.4720673536649e-05;0.00014564924640581;-0.00026022823294625;0.00014295820437837;-0.00013390656386036;0.00015880609862506;-3.4197645959466e-07;-2.5212240871042e-05;-5.577032425208e-05;-6.0245525673963e-05;0.00010983873653458;1.0908205467786e-06;-2.7954736651736e-05;0.00030140878516249;0.00010018627654063;-1.6639583918732e-05;-8.6184511019383e-05;0.00045497019891627;0.00043313830974512;0.00016812104149722;0.00020680493616965;-4.1880535718519e-05;-5.3522988309851e-05;-0.00046237360220402;-0.00023841341317166;0.0001725340844132;0.00010615459905239;8.6687912698835e-05;6.255090556806e-05;0.0012196983443573;0.0013212693156675;3.8613561628154e-05;-0.0014161012368277;-0.0012430115602911;-0.00037403905298561;-0.00048390118172392;0.00024865116574802;0.00018962887406815;-0.00031440670136362;-0.00025837938301265;-1.6686963135726e-06;-3.8988884625724e-05;-5.8410161727807e-05;-2.2496922611026e-05;-0.00043125927913934;-0.00023410000721924;0.0001391355326632;-0.00015920000441838;0.00062172242905945;0.00045655350550078;1.8745162378764e-05;-2.2901427655597e-05;-6.4708133322711e-06;-2.0904283246637e-06;0.00022450953838415;0.00016561744268984;4.5135642722016e-05;-9.0476814875728e-06;5.4936765081948e-05;6.5148815338034e-05;0.0016287829494104;0.00060546107124537;0.00010511504660826;-0.0011331452988088;-0.00089367770124227;-0.00028286306769587;-0.00020849055727012;-0.0003065888013225;-0.00011428493598942;-0.00017451980966143;-0.00012856432294939;-1.1547554095159e-05;-2.862168230422e-06;-4.1201178646588e-06;-5.1299516599101e-06;-0.00067995552672073;0.00067433516960591;-0.00084974063793197;0.000617032404989;-2.3348055037786e-05;0.00012953652185388;-5.525361848413e-05;9.7460811957717e-05;1.2024662282784e-05;-1.792978218873e-05;0.00049515481805429;-0.00051915860967711;-6.720677629346e-05;7.3016643000301e-05;1.6607013094472e-05;2.0403425878612e-05;0.00018867374456022;3.8129062886583e-05;-2.3966533262865e-05;0.00022011293913238;-0.00035717047285289;0.00018196327437181;-0.00020576023962349;0.00017915936768986;-7.183117850218e-05;-2.2466405425803e-05;-6.6636159317568e-05;-0.00010231800115434;0.0001501045335317;1.1265691682638e-05;-4.2238105379511e-05;0.00034968712134287;0.00018509232904762;-4.7463301598327e-05;-0.00012512729153968;0.00068693916546181;0.00062742322916165;0.00023998849792406;0.00028604638646357;-6.1354337958619e-05;-7.5908174039796e-05;-0.00056972465245053;-0.00037332394276746;0.00021931840456091;0.00015199507470243;0.00012217393668834;9.6936331829056e-05;0.0017858647042885;0.0019006545189768;6.2354134570342e-05;-0.0020257597789168;-0.0018229455454275;-0.00056537607451901;-0.00067603710340336;0.0003234216128476;0.00028812506934628;-0.00044075606274419;-0.00037596406764351;-1.3174270861782e-05;-4.2110514186788e-05;-7.1336740802508e-05;-3.96586037823e-05;-0.00056317978305742;-0.00036439491668716;5.4618252761429e-05;-0.00019533123122528;0.00084533682093024;0.00065222044941038;2.3855433028075e-05;-4.0121762140188e-05;-1.2524161320471e-05;4.7601670161157e-08;0.00033530610380694;0.00024305198166985;3.4175096516265e-05;-5.9264934861858e-06;7.7496537414845e-05;9.3041220679879e-05;0.0023338941391557;0.00081384065560997;0.00014651934907306;-0.0015285583212972;-0.0012804291909561;-0.00038132703048177;-0.00027801434043795;-0.00036281871143728;-0.00018619310867507;-0.00023844951647334;-0.00018040051509161;-2.7110501832794e-05;-2.0616707843146e-06;5.6122298701666e-06;-1.2174548828625e-05;-0.00070240767672658;0.00066832994343713;-0.00074419018346816;0.00071866007056087;-2.6209201678284e-05;0.00013476725143846;-5.6187924201367e-05;9.8707059805747e-05;1.3467275493895e-05;-1.7257958461414e-05;0.00052678771317005;-0.00050323054892942;-5.345800309442e-05;8.8799897639547e-05;4.8718379730417e-06;1.1683459888445e-05;4.9880211008713e-05;5.9066587709822e-05;-1.1792263649113e-05;0.00024322628451046;-0.00034719333052635;0.00016282378055621;-0.00022739593987353;0.00010312303493265;-0.00013660544937011;-3.8978005250101e-06;-5.576925832429e-05;-0.00011511966295075;0.00014232467219699;1.5229126802296e-05;-4.1032981243916e-05;0.00028678591479547;0.00024915207177401;-6.6979679104406e-05;-0.00011022594117094;0.00069880252704024;0.00061760161770508;0.00024668435798958;0.00028286722954363;-6.3080711697694e-05;-7.5010728323832e-05;-0.00050464941887185;-0.00043567109969445;0.00020312692504376;0.0001679273264017;0.00011727236415027;0.00010239490075037;0.0017905745189637;0.0019096512114629;6.2148021243047e-05;-0.0019999865908176;-0.001860655262135;-0.00059275893727317;-0.00065402855398133;0.00030470002093352;0.00031234417110682;-0.00043325778096914;-0.00038685853360221;-2.7842899726238e-05;-3.080586247961e-05;-5.97585021751e-05;-5.0462793296902e-05;-0.00051997863920406;-0.00041283274185844;-3.5147277230863e-05;-9.8169417469762e-05;0.00083738385001197;0.00068306381581351;2.8293296054471e-05;-4.1717550629983e-05;-1.7222453607246e-05;4.248664026818e-06;0.0003398576809559;0.00024248800764326;1.4723794265592e-05;1.6390822565882e-05;7.9256446042564e-05;9.3958638899494e-05;0.0023485023993999;0.00083384319441393;0.00014803765225224;-0.0015060021542013;-0.0013440409675241;-0.00038702369784005;-0.00028758801636286;-0.00031130900606513;-0.00024445066810586;-0.00024067849153653;-0.00018615790759213;-3.4088490792783e-05;4.4919579522684e-06;1.4218777323549e-05;-2.2351492589223e-05;-0.00053131498862058;0.00048998871352524;-0.0004535099142231;0.00055398652330041;-2.327164838789e-05;0.00010328507778468;-4.2315001337556e-05;7.3032970249187e-05;1.2614004845091e-05;-1.4338509572553e-05;0.00039070140337572;-0.00034781999420375;-2.3124637664296e-05;6.4909756474663e-05;-3.9392175494868e-06;4.5319443415792e-06;-4.255996827851e-05;5.3973639296601e-05;-1.5136230331336e-06;0.00018991404795088;-0.00024653872242197;0.00010768542415462;-0.00017717579612508;1.7751483028405e-05;-0.00012180372868897;9.4416573119815e-06;-3.5751480027102e-05;-8.5232793935575e-05;9.3977600045037e-05;8.6986310634529e-06;-2.4282877348014e-05;0.00018366795848124;0.00022309052292258;-4.9881906306837e-05;-5.6736436818028e-05;0.00047856275341474;0.00041484058601782;0.00018134580750484;0.00020180968567729;-4.5264670916367e-05;-5.2019695431227e-05;-0.0003407817275729;-0.00035633321385831;0.00014397224003915;0.00013780515291728;7.7526274253614e-05;7.2468872531317e-05;0.0012259349459782;0.0013422892661765;3.8848535041325e-05;-0.0013700834242627;-0.0013145064003766;-0.00042751990258694;-0.00044474273454398;0.00021110533270985;0.00023387458350044;-0.00030107225757092;-0.00027932360535488;-2.9939657906652e-05;-1.9148843421135e-05;-3.7045017961645e-05;-4.2743129597511e-05;-0.00035134350764565;-0.00032621537684463;-2.6269779482391e-05;2.9525823265431e-05;0.0006079935701564;0.00051719055045396;2.7829339160235e-05;-2.5562252631062e-05;-1.5067555978021e-05;5.7405914049014e-06;0.0002336852485314;0.00016295821114909;1.0191763067269e-05;3.4752421925077e-05;5.7846074923873e-05;6.7492583184503e-05;0.0016564878169447;0.00064485071925446;0.00010736079275375;-0.0010916801402345;-0.0010190543252975;-0.00029458914650604;-0.00022621727839578;-0.00021253725572024;-0.00022550250287168;-0.00017947515880223;-0.00014154493692331;-2.5611643650336e-05;9.176227649732e-06;1.2227572369738e-05;-2.4638466129545e-05;0.00022090446145739;-0.00043433802784421;-6.0958936956013e-06;0.00018622243078426;-0.00014041022222955;0.00012836515088566;1.5570485629723e-05;3.5812117857859e-05;-1.4956660379539e-05;4.930637715006e-06;-0.0001804958737921;0.00097163877217099;7.3647074714245e-06;-0.00016240344848484;-1.051100184668e-06;-0.00020119598775636;-0.00013400119496509;0.0002092060749419;4.9554193537915e-05;0.0001202116618515;-0.00022411793179344;-4.4406740926206e-05;-0.00018845630984288;0.00010798216680996;-0.00041582039557397;2.9353577701841e-05;0.00019444528152235;5.3090156143298e-05;-0.00048337649786845;-2.5095650926232e-05;0.0003215700853616;-0.00017669268709142;0.00010931921133306;0.00020632166706491;0.00084128289017826;-2.6642608645489e-05;0.00052568793762475;6.075101919123e-05;3.5275177651783e-05;-2.7351565222489e-05;4.1811545088422e-05;0.00016011846309993;0.00011249705130467;-1.4005227967573e-05;0.00036153360269964;-5.9680409322027e-05;-9.6723037131596e-05;-0.00036361123784445;0.00055971188703552;0.00010408141679363;0.00013901594502386;-0.00071949290577322;-0.00031334211234935;-0.00029474819893949;-0.000205584714422;-0.0008465014398098;0.00010536579793552;-6.6251115640625e-05;-3.5399363696342e-05;-0.00017042839317583;4.1994306229753e-05;1.1687129699567e-05;0.0001982678368222;-0.00025553719024174;-4.3508582166396e-05;0.0014482262777165;-0.00024302945530508;-0.00014791607100051;0.00011242668551859;-9.1041343694087e-05;1.4510620758301e-06;1.2980301107746e-05;-0.0001321756571997;-0.00074237439548597;-2.1824287614436e-05;5.0453549192753e-05;-6.7687295086216e-05;0.00010283892333973;-0.00058838375844061;0.00030541254091077;-3.942649345845e-05;0.00051918654935434;-0.00080216070637107;-0.00023914735356811;0.00021165354701225;8.7727428763174e-05;2.2111251382739e-05;9.6801079052966e-05;-2.9795830869261e-06;3.8798327295808e-05;0.00038766453508288;1.4611063306802e-05;-0.00019341887673363;0.00062909675762057;-0.00022084086958785;-0.0011674640700221;-0.00012927109492011;-0.00058712664758787;0.00029789333348162;-1.2354140380921e-05;-3.7753579817945e-05;-3.1856427085586e-05;2.9063559850329e-05;-0.0013390085659921;0.00013942933583166;-6.8675886723213e-05;3.1558147384203e-07;0.00025047385133803;5.1965140301036e-05;0.00069963041460142;-0.00049077591393143;-0.00016117408813443;0.00072690728120506;-0.00047973709297366;0.00042220938485116;0.00021579036547337;0.0013606254942715;-1.2764022358169e-05;-0.00020455551566556;-0.00014095196092967;0.0006174758891575;-5.2056984714e-05;-0.00031360151479021;9.0920602815459e-06;0.00053735164692625;-0.00045216482249089;0.0010096258483827;0.00032372050918639;0.00063411862356588;0.00015375726798084;7.3158262239303e-05;0.00014412403106689;2.5964605811168e-05;-2.0472652977332e-05;-0.00053016789024696;0.0003525044885464;0.00055425358004868;1.4274176464824e-05;-7.9598260072089e-07;-9.9527831480373e-05;-0.00035023313830607;0.00089441653108224;9.9953998869751e-05;-0.0010810208041221;1.498473693573e-06;-0.00030937310657464;-0.00056956539629027;-0.00070563901681453;-0.00039991975063458;-0.00025592243764549;8.8852160843089e-05;2.2825164705864e-05;-9.6168609161396e-05;-0.00013641710393131;7.6989097578917e-05;-0.00059678457910195;0.00033285820973106;0.0022927310783416;-0.00024718476925045;0.00032366890809499;-0.0002399113291176;-9.584484359948e-05;0.00013797896099277;3.4538155887276e-05;-1.9411454559304e-05;-0.00072073325281963;-0.00016996847989503;0.00024639992625453;-0.00010262500290992;0.00011391685984563;-6.0721209592884e-05;-0.00044562201946974;0.00068002479383722;2.5826577257249e-05;-0.0015527043724433;0.0004863754438702;8.0137979239225e-06;-0.00038180910632946;-0.00062305678147823;0.00024068490893114;-6.9195608375594e-05;0.00010308774653822;0.00047586834989488;6.6773929574993e-05;-0.00027687259716913;3.3697757316986e-05;0.00053579988889396;-0.00013925063831266;-0.001530681271106;-0.00023460708325729;-0.00060727965319529;0.00034730401239358;-4.4606781557377e-06;-4.2147326894337e-05;-3.395385647309e-05;2.0675166524597e-05;-0.0010941872606054;7.1086149546318e-05;-0.00016503564256709;-1.2914616490889e-05;0.00022465351503342;8.3368657215033e-05;0.0010121259838343;-0.0005060225375928;-0.00016945143579505;0.00079556048149243;-0.00065414723940194;0.00041856965981424;0.00025609001750126;0.0014650042867288;9.1963622253388e-05;-0.00017569735064171;-0.00019023308414035;0.00051334395539016;-3.499641752569e-05;-0.00023979232355487;-6.8701035615959e-07;0.00067572831176221;-0.00053014018340036;0.00096123496768996;0.00032383413054049;0.00056754372781143;0.00024023703008424;8.3208768046461e-05;0.00017893937183544;1.6377396605094e-05;-1.9186909412383e-05;-0.00079878233373165;0.00040924191125669;0.00054648244986311;2.1821519112564e-05;4.1940424125642e-05;-0.00010355969425291;-0.00023242396127898;0.0010169947054237;7.9062294389587e-05;-0.0012072366662323;-0.00011632833775366;-0.00026434843312018;-0.00065033679129556;-0.00046171774738468;-0.00043658760841936;-0.000306492758682;6.2604078266304e-05;0.00011548808106454;-0.00011883624392794;-0.00018117645231541;8.6415049736388e-05;-0.00071483768988401;0.00036513272789307;0.0023583641741425;-0.00035109426244162;0.00053226941963658;-0.00019058131147176;-9.6307892818004e-05;0.00011871886090375;4.4301184971118e-05;-3.1552055588691e-05;-0.00056492845760658;-0.00017298299644608;0.00030799425439909;-0.00013626270811073;0.00011267263471382;-3.6266977986088e-05;-0.0002246933436254;0.00075471366290003;5.8315901696915e-05;-0.001716522150673;0.00036199783789925;-9.2454880359583e-05;-0.0003760960244108;-0.0008755509625189;0.00030642552883364;-9.6303745522164e-05;8.1899772339966e-05;0.00045122180017643;7.4718394898809e-05;-0.00028873339761049;3.6422574339667e-05;0.00040722193080001;-7.1835573180579e-05;-0.0015912499511614;-0.00027055587270297;-0.00050723255844787;0.00034088402753696;3.6843109683105e-06;-4.1118670196738e-05;-3.0109551516944e-05;1.1703255040629e-05;-0.00077170878648758;1.98467168957e-05;-0.00019361688464414;-2.121897705365e-05;0.00017787276010495;9.3694936367683e-05;0.0011079217074439;-0.00044044826063327;-0.00014768823166378;0.00072962534613907;-0.00069810380227864;0.00034458181471564;0.00024584322818555;0.0013129725120962;0.00014506578736473;-0.00014284646022134;-0.00019761081784964;0.00037042438634671;-1.8993596313521e-05;-0.00016069180855993;-6.3129382397165e-06;0.00063173717353493;-0.00048662108019926;0.00087731145322323;0.00025370874209329;0.0005208263755776;0.00026521901600063;7.7696997323073e-05;0.00018429967167322;1.1228351468162e-05;-2.1063697204227e-05;-0.00081622740253806;0.00037640970549546;0.00048635303392075;1.4803146768827e-05;6.0405847762013e-05;-8.972485375125e-05;-9.0391091362108e-05;0.001029226812534;6.6543732827995e-05;-0.0012384788133204;-0.00019282700668555;-0.00023419293574989;-0.00064229650888592;-0.00033250873093493;-0.00037523763603531;-0.00030277759651653;3.5356752050575e-05;0.00014684392954223;-0.00011277902376605;-0.00018506217747927;8.2217906310689e-05;-0.00068713276414201;0.00033036345848814;0.0020481490064412;-0.00037663895636797;0.00054454506607726;-0.00012673066521529;-8.7318840087391e-05;8.1304337072652e-05;4.4694181269733e-05;-3.3640833862592e-05;-0.00040970745612867;-0.00014504980936181;0.00029229623032734;-0.00013959892385174;9.5389899797738e-05;-1.161298223451e-05;-3.6896086385241e-05;0.0006492254906334;6.4970969106071e-05;-0.0015272164018825;0.00022458322928287;-0.00011892666225322;-0.00029508004081436;-0.00087639811681584;0.00030570244416595;-8.8641965703573e-05;5.3081606893102e-05;0.00038196588866413;6.8638852098957e-05;-0.00025626554270275;3.1945179216564e-05;-0.00054390146397054;0.00054988032206893;-0.00048156260163523;0.0002527832693886;-7.3653382060002e-06;5.4470532631967e-05;-3.0699589842698e-05;5.3199957619654e-05;1.1027872460545e-05;-1.6160078303074e-05;0.00034986968967132;-0.00040144790546037;-4.6190598368412e-05;2.8010517780785e-05;7.188535619207e-06;2.8529562769108e-05;0.00017598131671548;3.5068908346148e-06;-2.2390453523258e-05;0.00015897858247627;-0.00025092379655689;9.2259870143607e-05;-7.269017805811e-05;6.6426495322958e-05;8.1884856626857e-05;-4.5265660446603e-06;-6.1218415794428e-05;-5.6182816479122e-05;0.00010542968084337;5.3740404837299e-06;-2.9542236006819e-05;0.00033773150062189;0.00011017729411833;-6.7779270466417e-05;-7.1483969804831e-05;0.00030378400697373;0.00032372013083659;0.00016497947217431;0.00019309857452754;-3.6553385143634e-05;-4.1827923269011e-05;-0.00050495471805334;-0.00025260625989176;0.00016263655561488;0.0001143714034697;7.5127856689505e-05;4.9469075747766e-05;0.00090975791681558;0.0010696979006752;-5.4104898481455e-06;-0.0010751262307167;-0.00097907637245953;-0.00028389575891197;-0.00038159752148204;0.00032068995642476;0.00019630246970337;-0.0002875198260881;-0.0002353098243475;7.5045436460641e-06;-3.8908288843231e-05;-5.5164236982819e-05;-2.1834537619725e-05;-0.00040904979687184;-0.00022228076704778;0.00026562772109173;-3.5273576941108e-05;0.00069920910755172;0.0005159757565707;3.8095211493783e-05;9.2590444182861e-06;-1.0809903869813e-05;-7.0776859502075e-06;0.0002028992457781;0.00014185093459673;5.8707111747935e-05;5.6520088946854e-06;5.953172876616e-05;6.211605068529e-05;0.0014886166900396;0.00082429539179429;0.00011427739809733;-0.0012895509134978;-0.0010053700534627;-0.0003554814029485;-0.0003024224715773;-0.00034308907925151;-0.00015073906979524;-0.00019555308972485;-0.00014256549184211;-4.7448029363295e-06;4.6576005843235e-06;-9.1332249212428e-06;-7.6295782491798e-06;-0.00077034143032506;0.00075467868009582;-0.00072700157761574;0.00053083396051079;-1.8138560335501e-05;9.9317468993831e-05;-3.8981084799161e-05;7.2383540100418e-05;1.0948785529763e-05;-1.6590618542978e-05;0.00056933413725346;-0.00057787721743807;-8.531182538718e-05;8.1396465247963e-05;-9.1414449343574e-07;3.3533753594384e-05;0.00016221882833634;2.6717378204921e-05;-2.0961966583855e-05;0.00028878421289846;-0.00040349111077376;0.00010599139204714;-0.00011734587315004;8.3250502939336e-05;1.3470149497152e-05;1.1114823792013e-05;-8.2987375208177e-05;-0.0001113941980293;0.0001527905697003;2.890387622756e-05;-5.4331561841536e-05;0.0003838584816549;0.00020913998014294;-9.3426373496186e-05;-0.00013027194654569;0.00057692569680512;0.00053941621445119;0.00025066948728636;0.00028671784093603;-5.7060919061769e-05;-6.6163614974357e-05;-0.00063312420388684;-0.00041498974314891;0.00021519006986637;0.00015988078666851;0.00011680448369589;8.9090841356665e-05;0.0015166606754065;0.0017308903625235;1.2155069271103e-05;-0.0017612872179598;-0.001609553815797;-0.00050406227819622;-0.00059854937717319;0.00040735190850683;0.0003273268812336;-0.00043796264799312;-0.00037223575054668;3.5003079119633e-06;-3.4981345379492e-05;-7.164450653363e-05;-4.0265404095408e-05;-0.00056062376825139;-0.00036933226510882;0.00018074476975016;-6.7537846916821e-05;0.00099675019737333;0.00078305695205927;4.569183147396e-05;-6.7550172389019e-06;-2.0196526747895e-05;-8.1071411841549e-06;0.00033266880200244;0.00023235841945279;3.7519821489695e-05;-8.210427040467e-07;9.1450383479241e-05;9.9669516202994e-05;0.0023230218794197;0.0011525700101629;0.00017250438395422;-0.0018216306343675;-0.0015335256466642;-0.00050017423927784;-0.00041499570943415;-0.00041269508074038;-0.00023318562307395;-0.0002737681788858;-0.00020838176715188;-1.2053863429173e-05;1.4437074241869e-05;-1.6189209190998e-06;-1.7040736565832e-05;-0.00079585704952478;0.00075095245847479;-0.00062371377134696;0.00063387065893039;-1.49904499267e-05;0.00010584583651507;-3.9457805542042e-05;7.3315903136972e-05;1.2595620319189e-05;-1.5403573343065e-05;0.00061098538571969;-0.00056308694183826;-7.071926665958e-05;0.0001006834427244;-1.4311341146822e-05;2.3766269805492e-05;2.6183219233644e-05;5.1839790103259e-05;-7.6381302278605e-06;0.00031077032326721;-0.00039583252510056;8.1583348219283e-05;-0.00013958800991531;-2.5777169412322e-06;-5.5998447351158e-05;3.0961917218519e-05;-7.204511348391e-05;-0.00012728657748085;0.00014419712533709;3.4393258829368e-05;-5.3437746828422e-05;0.00030279211932793;0.00028971204301342;-9.3980037490837e-05;-0.00013671300257556;0.00060183589812368;0.00051977729890496;0.00025657549849711;0.00028503587236628;-5.7184202887584e-05;-6.703739927616e-05;-0.00055245077237487;-0.00049317919183522;0.00020208198111504;0.00017120374832302;0.00011035002535209;9.6821982879192e-05;0.0015273668104783;0.0017429803265259;1.147335206042e-05;-0.0017546843737364;-0.0016370645025745;-0.00053477182518691;-0.00057415012270212;0.00036671545240097;0.00037598816561513;-0.00042982352897525;-0.00038511687307619;-1.4360532077262e-05;-1.9085384337814e-05;-5.957360190223e-05;-5.1535131206037e-05;-0.0005123105365783;-0.00042432046029717;7.5196563557256e-05;4.0844472096069e-05;0.00098010466899723;0.00082801090320572;5.1949929911643e-05;-1.1152686056448e-05;-2.5771110813366e-05;-3.3405849535484e-06;0.00033439343678765;0.00023614171368536;1.3978992683406e-05;2.3013688405626e-05;9.2460948508233e-05;0.00010244267468806;0.002345415763557;0.0011776486644521;0.00017548077448737;-0.0017824738752097;-0.0016243014251813;-0.00051065773004666;-0.00042410654714331;-0.00035090415622108;-0.00030138099100441;-0.00027311281883158;-0.00021668305271305;-1.7839942302089e-05;2.2213738702703e-05;7.9095570981735e-06;-2.88506889774e-05;-0.00056519283680245;0.0005210965173319;-0.00032310109236278;0.00042316294275224;-3.8155681068019e-06;7.3223265644629e-05;-3.1321666028816e-05;5.5202926887432e-05;1.2968762348464e-05;-1.4146921785141e-05;0.00040975341107696;-0.00035541201941669;-2.2560423531104e-05;5.727558163926e-05;-1.3991954801895e-05;1.1043450285797e-05;-4.0540551708546e-05;4.7236375394277e-05;9.309941333413e-07;0.00019069432164542;-0.00023965816944838;5.4576721595367e-05;-0.00011627683124971;-6.3024352130014e-05;-4.4640750274993e-05;2.5617298888392e-05;-4.1417475586059e-05;-8.3739105321001e-05;8.6059619206935e-05;1.5179212823568e-05;-2.5181665478158e-05;0.00018933886894956;0.00024168308300432;-5.8487737987889e-05;-8.0123463703785e-05;0.00035689628566615;0.00029543333221227;0.00017118820687756;0.00018751500465441;-3.6657158489106e-05;-4.3325355363777e-05;-0.00035295923589729;-0.00037169066490605;0.00013878432218917;0.000130858112243;6.4386651501991e-05;6.1389029724523e-05;0.00093296065460891;0.0010929577983916;-7.1879776442074e-07;-0.0010751144727692;-0.0010265918681398;-0.0003396900719963;-0.00034508464159444;0.00023457445786335;0.00026712368708104;-0.00027081737061962;-0.0002526942116674;-2.3128579414333e-05;-1.4059626664675e-05;-3.4643318940653e-05;-3.9302973164013e-05;-0.00032189142075367;-0.00030734049505554;7.2735121648293e-05;0.00013407302321866;0.00064642896177247;0.00056919734925032;4.5325879909797e-05;-7.5080743044964e-07;-1.8739072402241e-05;1.115768100135e-06;0.00020511995535344;0.00014394900063053;1.8110013115802e-05;4.4259511923883e-05;5.873695408809e-05;6.5653097408358e-05;0.0014993073418736;0.00081912253517658;0.00011381153308321;-0.0011750381672755;-0.0011172709055245;-0.00035454792669043;-0.00029767377418466;-0.0002313771401532;-0.00025285469018854;-0.00018737898790278;-0.00015284471737687;-1.605316901987e-05;1.5561268810416e-05;7.5154148362344e-06;-2.6261543098371e-05;-5.208257061895e-05;-0.00023424887331203;0.00033743664971553;0.0014123590663075;-0.00035217843833379;0.00052441895240918;1.2770410648955e-06;2.313392724318e-05;-4.8685542424209e-06;3.2971489417832e-05;8.0420672020409e-05;0.00056020426563919;2.4567956643295e-05;0.00025973666924983;-9.9354285339359e-05;-0.00015822137356736;-0.0011162450537086;0.00032616360113025;0.00013065464736428;0.00072147801984102;-0.00058455776888877;-0.00016058904293459;-0.00035763019695878;-0.00025287663447671;-0.0011907060397789;0.0002326914400328;6.9111323682591e-05;-2.4340415620827e-06;-0.00029500352684408;1.2168889043096e-05;0.00011220188025618;-0.0005995556130074;0.00075170956552029;0.00030325606348924;0.00042331832810305;0.00037111001438461;0.00024096804554574;0.00016562495147809;0.00010613370977808;-1.3404380297288e-05;-6.8246067712607e-06;0.00049416848924011;-0.00083317258395255;3.6492398066912e-05;0.00034426603815518;-7.5611147622112e-05;6.0317426687106e-05;7.4915937148035e-05;0.00093075376935303;2.5407480279682e-05;-0.00038309118826874;-0.00095929490635172;-0.00057267432566732;-0.00014427870337386;-0.00047114721382968;9.8045034974348e-05;-3.2749721867731e-06;-0.00027251100982539;-0.00015532660472672;0.00012284555123188;8.2222330092918e-05;-0.0001413878344465;0.00032384612131864;-0.00070389086613432;-0.00042629972449504;0.0018937054555863;-1.9714139853022e-05;0.00067441328428686;0.00011590100621106;-9.0534776973072e-05;-5.5069707741495e-05;6.0792619478889e-05;-0.00014194876712281;-0.00023858938948251;-0.00015044381143525;0.00031200030934997;4.7920416363922e-06;9.4393981271423e-05;0.00021300587104633;0.00086667347932234;8.0329955380876e-05;1.0215384463663e-05;-0.0017128874314949;-0.00038807565579191;-0.00019283882284071;0.00034123312798329;-0.0009171316633001;6.6534526013129e-06;-0.00012161344784545;6.6709697421174e-05;0.00030553663964383;3.5792170820059e-05;-0.00024695644970052;2.5953506337828e-05;-0.000345741660567;0.0003151758282911;0.0013717312831432;-0.00036886215093546;0.0006070255767554;-3.1728272915643e-06;3.4302360290894e-05;-9.9813887572964e-06;3.4549939300632e-05;7.7280319601414e-06;0.00079379940871149;2.1534666302614e-05;0.00023853237507865;-8.9012566604652e-05;-0.00019454510766082;-0.001059761387296;0.00036440702388063;0.0001463396474719;0.00068853911943734;-0.00061480503063649;-0.00015052105300128;-0.00042613138793968;-0.00019399791199248;-0.0013065463863313;0.00022493027790915;9.1420137323439e-05;1.8408067262499e-05;-0.00039808615110815;3.2165605716727e-06;0.00017357112665195;-0.00063582754228264;0.00077350973151624;0.00036119818105362;0.00050706352340057;0.0003401727299206;0.00027167514781468;0.00015809501928743;0.00010547031706665;-1.2165966836619e-05;-8.4031671576668e-07;0.00053165893768892;-0.0008093846263364;3.8650112401228e-05;0.00038762597250752;-8.885462739272e-05;4.2555526306387e-05;-4.8852434701985e-05;0.00090908486163244;3.6224166251486e-05;-0.00030071620130911;-0.00093896687030792;-0.00057509599719197;-0.00015988403174561;-0.00052979530300945;-9.2710397439077e-06;2.8235099307494e-05;-0.00026778239407577;-0.00016166939167306;9.7460520919412e-05;8.6940599430818e-05;-0.00013651371409651;0.0003624907694757;-0.00071776588447392;-0.00039764010580257;0.0021150826942176;-0.00010961902444251;0.00062993244500831;0.00013392906112131;-0.0001004987716442;-5.2390500059118e-05;6.4023261074908e-05;-0.00018134637502953;-0.000346476881532;-0.00014410651056096;0.00033206189982593;-1.4682652363263e-05;0.0001015618108795;2.7941555345024e-06;0.00086878961883485;6.5586471464485e-05;0.00017869404109661;-0.001769240014255;-0.00040807214099914;-0.00014745342195965;0.0003481448511593;-0.00092360301641747;3.8783840864198e-05;-0.00011809996794909;7.4153424066026e-05;0.00035067572025582;3.6321827792563e-05;-0.00027203056379221;9.1288806288503e-05;-0.0003559782053344;0.00019274451187812;0.00092980993213132;-0.00027733613387682;0.0005122153670527;-7.6986816566205e-06;3.6519479181152e-05;-1.2784952559741e-05;2.6636032998795e-05;-6.0150301578688e-05;0.00081248040078208;9.9330482044024e-06;0.00014683409244753;-5.2080486057093e-05;-0.00017901645333041;-0.00069105171132833;0.00029357307357714;0.00011968099715887;0.00045660327305086;-0.00046367480535991;-9.427636541659e-05;-0.00037210722803138;-7.687268225709e-05;-0.0010490989079699;0.00015142028860282;9.0970570454374e-05;3.2161187846214e-05;-0.00039557777927257;-5.7906563597498e-06;0.00019062432693318;-0.00048146062181331;0.00056504498934373;0.00030672017601319;0.00045036934898235;0.0002174506225856;0.00025061753694899;0.00010727875633165;7.8696662967559e-05;-9.2462842076202e-06;5.5538284868817e-06;0.00040675603668205;-0.00053395959548652;2.8161362934043e-05;0.00032430974533781;-7.3884904850274e-05;9.8316313597024e-06;-0.00013576437777374;0.00065467186504975;4.0346469177166e-05;-0.00015288572467398;-0.00068006018409505;-0.00041964833508246;-0.00014846822887193;-0.00042364627006464;-0.0001355155109195;4.6615037717856e-05;-0.00019032250565942;-0.0001193593343487;3.3541833545314e-05;6.6105421865359e-05;-8.7849439296406e-05;0.00028902621124871;-0.00052579079056159;-0.00026041790260933;0.0017174589447677;-0.00014903741248418;0.00039916223613545;0.00011568346235435;-8.2047576142941e-05;-3.4924451028928e-05;4.7688699851278e-05;-0.00015903945313767;-0.00036165295750834;-9.7671269031707e-05;0.00024678756017238;-2.8451488105929e-05;8.1105048593599e-05;-0.00017016971833073;0.00063890073215589;3.2550553441979e-05;0.0002663962659426;-0.0013370939996094;-0.0003209576534573;-5.758176848758e-05;0.00025080217164941;-0.00064188952092081;5.4560860007768e-05;-8.0185862316284e-05;5.8755824284162e-05;0.00029749545501545;2.7196570954402e-05;-0.0002166586345993;0.00033149096998386;-3.7892423279118e-05;-0.0010282370494679;-0.00019285765301902;-0.00049207895062864;0.00021430985361803;-1.1106036254205e-05;-1.7784028386814e-05;-2.5632267352194e-05;1.502927079855e-05;-0.00082627369556576;-1.5686147207816e-06;-0.00015022505249362;-9.733579645399e-06;0.00016810097440612;5.8932670071954e-05;0.00069079751847312;-0.00036001449916512;-0.00013530941214412;0.00053929851856083;-0.00042746830149554;0.00033798321965151;0.00018139382882509;0.0011126027675346;0.00011340875789756;-0.00011177377746208;-0.00013771984959021;0.00039672447019257;-1.355138465442e-05;-0.00017635509721003;-4.4911139411852e-06;0.00065582717070356;-0.00046759631368332;0.00043850371730514;0.00030227797105908;0.00020043105178047;0.00020869878062513;7.2313581767958e-05;0.00012060017616022;1.0742801350716e-06;-1.9945573512814e-06;-0.00074903067434207;0.00034421039163135;0.00034462613984942;4.380091195344e-05;3.900838419213e-05;-7.698881381657e-05;-0.00019081802747678;0.00059653562493622;2.1357607693062e-05;-0.00060479424428195;-0.00011468605953269;-9.8911601526197e-05;-0.00041811828850769;-3.0572897230741e-05;-0.00038817207678221;-0.00021837608073838;3.2354786526412e-05;0.00011098023242084;-0.00010528839629842;-0.00012720917584375;5.9956462791888e-05;-0.0005585189210251;0.00026895839255303;0.0017554183723405;-0.00027023331495002;0.00052514829440042;-0.0001037926049321;-5.5965927458601e-05;0.00010646878945408;3.0699477065355e-05;-2.8623220714508e-05;-0.00033162403269671;-0.00012455698742997;0.00024184602079913;-0.0001061232687789;8.1931124441326e-05;-2.6887877538684e-05;-6.5761581936385e-05;0.00071533763548359;6.1948419897817e-05;-0.0014535181690007;0.00018996116705239;-0.00014437599747907;-0.00034891336690634;-0.00072089250897989;0.00023019012587611;-0.00010306139301974;5.2735580538865e-05;0.00029449647990987;5.5521952162962e-05;-0.00019861616601702;3.0803494155407e-05;0.00027738831704482;3.2883377798498e-07;-0.0011876500211656;-0.00023146068269853;-0.00045226581278257;0.00023649579088669;-3.817262040684e-06;-2.3998496544664e-05;-2.5467863451922e-05;1.0286691576766e-05;-0.00066635973053053;-3.4227225114591e-05;-0.00017732541891746;-1.5774347048136e-05;0.00015109041123651;7.3838607931975e-05;0.00083348719635978;-0.00035505575942807;-0.00012991117546335;0.00055915582925081;-0.00051266566151753;0.00030646269442514;0.00019965473620687;0.0010951349977404;0.00015669234562665;-0.00010427641245769;-0.00015760866517667;0.00032949310843833;-4.128179170948e-06;-0.0001380226603942;-9.4941942734295e-06;0.0006552716367878;-0.00046351063065231;0.00047934518079273;0.00026834534946829;0.00024305646365974;0.00023930236056913;7.5636897236109e-05;0.00013992332969792;-5.8945761338691e-07;-6.2337294366444e-06;-0.00079885643208399;0.00034139899071306;0.00035069923615083;3.7747988244519e-05;5.473728015204e-05;-7.4539297202136e-05;-0.00010413165728096;0.0007046265527606;2.3060845705913e-05;-0.00075332261621952;-0.00017620342259761;-0.00011470522440504;-0.00046876759734005;-1.2091850294382e-05;-0.00036525665200315;-0.00024301781377289;1.8267641280545e-05;0.00013685286103282;-0.00010691898933146;-0.00014352782454807;6.3400591898244e-05;-0.00059333292301744;0.00027060392312706;0.0017233045073226;-0.00031514721922576;0.00057727337116376;-6.9456320488825e-05;-5.7975987147074e-05;9.1261899797246e-05;3.343230127939e-05;-3.2384748919867e-05;-0.00027614450664259;-0.00011635280679911;0.00025081759667955;-0.00011902984260814;8.2037186075468e-05;-1.2792875168088e-05;5.6132892495953e-05;0.0007117903442122;7.2104070568457e-05;-0.0014702001353726;0.00011570367496461;-0.00017038494115695;-0.00032838265178725;-0.00077981123467907;0.00025144426035695;-0.00010707489855122;3.8380996556953e-05;0.00028742715949193;5.6785411288729e-05;-0.0002007173752645;3.0689068807987e-05;-0.00064318964723498;0.00061984598869458;-0.00047830957919359;0.00037521382910199;-1.4375063805971e-08;5.553714800044e-05;-2.1793563064421e-05;4.3118048779434e-05;8.0965946835931e-06;-1.1874541087309e-05;0.00049705448327586;-0.00047772118705325;-7.5005023973063e-05;7.2223643655889e-05;-1.2872790648544e-05;3.1021590984892e-05;9.3785638455302e-05;2.1698775526602e-05;-1.1606283806032e-05;0.0002453844062984;-0.00032239133724943;3.4248871088494e-05;-4.7380031901412e-05;-8.2986598499701e-06;4.7384524805238e-05;2.9818171242368e-05;-7.0736969064455e-05;-9.7675787401386e-05;0.00011846351844724;3.5141656553606e-05;-4.9167105316883e-05;0.00028974228189327;0.00018693807942327;-9.7467323939782e-05;-0.00011644703045022;0.00038734308327548;0.00035787935485132;0.00019518125918694;0.00021752170869149;-4.1020910430234e-05;-4.6173096052371e-05;-0.00050004536751658;-0.0003549377724994;0.00015529846132267;0.00012194230657769;8.6109321273398e-05;6.6515065554995e-05;0.0010385758941993;0.0012277067871764;-1.7033868061844e-05;-0.0012138159945607;-0.001120604807511;-0.00035315359127708;-0.00040811483631842;0.00035091559402645;0.00029110710602254;-0.00032964182901196;-0.00028312677750364;1.1212418030482e-05;-1.6607937141089e-05;-5.2985011279816e-05;-3.2812546123751e-05;-0.00041705515468493;-0.00029413364245556;0.0001648131001275;1.9482704374241e-05;0.00083339592674747;0.00067496031988412;4.6397955884458e-05;9.0313869804959e-06;-2.0610945284716e-05;-9.9024191513308e-06;0.00025799588183872;0.00017701848992147;2.2445456124842e-05;2.4023802325246e-06;7.6987125794403e-05;8.0977828474715e-05;0.0017847995040938;0.0010564010590315;0.00014914720668457;-0.0015225989045575;-0.0013172820908949;-0.00044835975859314;-0.00038974269409664;-0.0003267866850365;-0.00021164340432733;-0.00022384228941519;-0.00017354029114358;-1.7591858068045e-06;2.1712339730584e-05;-3.1111542284634e-06;-1.7600077626412e-05;-0.00071038783062249;0.00065863627241924;-0.00037932037957944;0.00046660352381878;1.0637766536092e-05;5.8599391195457e-05;-2.1696598196286e-05;4.3348649342079e-05;1.0833433407242e-05;-1.13346541184e-05;0.00057088979519904;-0.00049416872207075;-6.352091440931e-05;9.5501090981998e-05;-2.9141974664526e-05;2.4103404939524e-05;-2.9033688406344e-05;4.6982520871097e-05;1.0761282283056e-06;0.00027759102522396;-0.00032949796877801;3.7425684240588e-07;-5.9280930145178e-05;-0.00011419999646023;-1.1194658782188e-06;5.4777490731794e-05;-6.6238957515452e-05;-0.00011736693704734;0.00011433509644121;4.302736124373e-05;-5.100820271764e-05;0.00021721763187088;0.00028944580117241;-8.6695072241127e-05;-0.00014771906717215;0.0004107195418328;0.00031841945019551;0.00020730655523948;0.00022474967408925;-3.9873670175439e-05;-4.887202885584e-05;-0.00044294510735199;-0.00046624432434328;0.00015354073548224;0.00013359036529437;7.9685283708386e-05;7.6197415182833e-05;0.0010404598433524;0.0012457732809708;-2.7826175937662e-05;-0.0012188244145364;-0.0011298636673018;-0.0003810703929048;-0.0003799925907515;0.00031779409619048;0.00038030761061236;-0.00033037579851225;-0.0003037026617676;-5.9892577155551e-06;3.7987949781382e-06;-4.3714968342101e-05;-4.5296856114874e-05;-0.00038345082430169;-0.00036422160337679;9.1771325969603e-05;0.000160815907293;0.00086195487529039;0.00077553925802931;5.9982081438648e-05;8.1385587691329e-06;-2.8459724489949e-05;-6.1554669628094e-06;0.00026034197071567;0.00018811663903762;1.3897883945901e-06;2.9602242648252e-05;8.1630816566758e-05;8.894111670088e-05;0.0018641365459189;0.0011804882669821;0.0001639781112317;-0.0015700919320807;-0.0015118585433811;-0.00050076039042324;-0.00043728938908316;-0.00028461153851822;-0.00030635081930086;-0.00023380310449284;-0.000193824103917;-1.9424924175837e-06;3.47308232449e-05;4.1165794755216e-06;-3.2854950404726e-05;-0.00021220374037512;3.4847118513426e-05;0.00024798369850032;0.0010130101582035;-0.00020101256086491;0.00028410903178155;5.9568214965111e-06;6.5378803810745e-06;2.0985057744838e-06;2.1659618141712e-05;0.00022753005032428;0.00011264545901213;1.042457188305e-05;0.0002182491007261;-8.7421882199124e-05;-7.4890849646181e-05;-0.00081304158084095;0.0001986318238778;7.9120531154331e-05;0.00054080580594018;-0.00039816205389798;-0.0001451013085898;-0.00017545833543409;-0.00028928089886904;-0.00070109276566654;0.00018082805036101;1.7022344763973e-05;-4.5675533328904e-05;-0.00010277335968567;2.9797089155181e-05;1.4857177120575e-05;-0.00040229340083897;0.00058366148732603;0.00017144235607702;9.5311588665936e-05;0.00032760773319751;9.5743736892473e-05;0.00013489909179043;9.8411786893848e-05;-8.4123339547659e-06;-1.9430237443885e-05;0.00029391417047009;-0.00068646972067654;4.1345305362483e-05;0.0001863089564722;-3.4887932997663e-05;6.8842688051518e-05;0.00022867273946758;0.00070403318386525;-7.9246228779084e-06;-0.00043380461283959;-0.00065906933741644;-0.00040484304190613;-8.5459192632698e-05;-0.00026991366758011;0.00030560544109903;-6.1146769439802e-05;-0.00021937988640275;-0.00010698254482122;0.00011739197361749;4.9067857617047e-05;-0.00010224281140836;0.00017072484479286;-0.0005375876207836;-0.00034827075432986;0.001178662176244;0.00017962919082493;0.0006837235414423;8.7455351604149e-05;-4.6596662286902e-05;-4.8898578825174e-05;3.5668319469551e-05;-3.6070865462534e-05;-2.3158505428e-05;-0.00012338084343355;0.00020409308490343;2.9484823244275e-05;7.6721349614672e-05;0.00057485635625198;0.00086024519987404;0.00010237492097076;-0.00034733617212623;-0.0014603339368477;-0.00036725588142872;-0.0002757006441243;0.00022416330466513;-0.00070189690450206;-5.1954772061436e-05;-0.00012941755994689;4.0923569031293e-05;0.00017372200090904;2.9048760552541e-05;-0.00015363708371297;-0.00018433471268509;-0.00010370430391049;0.00036984932376072;0.0013727564364672;-0.00029913257458247;0.00050404923968017;-1.1973961591139e-06;2.3757575036143e-05;-1.6664008626321e-06;3.1560790375806e-05;0.00020844755636062;0.00044859715853818;2.3393753508572e-05;0.00028452480910346;-0.0001094000908779;-0.00014687509974465;-0.0011056604562327;0.0003207380650565;0.00013331983063836;0.00070221337955445;-0.00056378712179139;-0.00018486463523004;-0.00034065818181261;-0.0003527041117195;-0.0011397501220927;0.0002428269945085;5.013828194933e-05;-3.368499892531e-05;-0.0002646895009093;2.5758146875887e-05;9.0178480604663e-05;-0.00065360270673409;0.00088321376824751;0.00033565645571798;0.00019176812202204;0.00042351425508969;9.168926771963e-05;0.00017056829528883;0.00012570100079756;-5.5441369113396e-06;-2.0611092622858e-05;0.00051076739327982;-0.00097394763724878;6.1474784160964e-05;0.00029554660432041;-7.1282076532952e-05;7.6576659921557e-05;0.00012982591579203;0.00087727745994925;-5.4609881772194e-06;-0.00046974283759482;-0.0008013341575861;-0.00055113073904067;-8.4991545008961e-05;-0.0005003945552744;0.00036515295505524;-3.4572643926367e-05;-0.00028455871506594;-0.00016921445785556;0.0001493615709478;7.8626981121488e-05;-0.00014033331535757;0.00030684325611219;-0.00075544381979853;-0.00045671183033846;0.0018963341135532;8.7887019617483e-05;0.00085948297055438;0.00013393900007941;-7.5559502874967e-05;-6.3698164012749e-05;5.730248085456e-05;-0.0001171876792796;-0.0001474100863561;-0.00016369692457374;0.00032152226776816;1.5456451365026e-05;0.0001026811733027;0.00045094251981936;0.0011030939640477;0.00011367419210728;-0.00019230917678215;-0.0019851243123412;-0.00048597069690004;-0.00030676173628308;0.00034178601345047;-0.0010028153192252;-2.2507032554131e-05;-0.00016365833289456;6.6392443841323e-05;0.0002798238710966;4.0396247641183e-05;-0.00023870336008258;-6.836952525191e-05;-0.00019832474936265;0.00027976464480162;0.0010203541023657;-0.00024366186698899;0.00050140789244324;-1.0694146112655e-05;3.3735599572537e-05;-6.6386987782607e-06;2.6367966711405e-05;9.1520749265328e-05;0.00062089029233903;1.7522874259157e-05;0.00020725134527311;-7.3285984399263e-05;-0.00015622231876478;-0.00080437806900591;0.00029056964558549;0.00012616517778952;0.00049926433712244;-0.00045999090070836;-0.000128944273456;-0.00035664107417688;-0.00022535728930961;-0.0010407689260319;0.00018096998974215;6.0684404161293e-05;-5.2910659178451e-06;-0.00032602102146484;9.9150956884841e-06;0.00013820586900692;-0.00058346567675471;0.000760059338063;0.00034558319021016;0.000176966728759;0.00031409208895639;4.8779726057546e-05;0.00012231388245709;9.8692267783917e-05;1.4387228475243e-07;-1.2569051250466e-05;0.0004679866542574;-0.00077659421367571;5.6476281315554e-05;0.00026427462580614;-7.1465110522695e-05;4.2526626202744e-05;-3.3090884244302e-05;0.00062631204491481;-2.3970546436658e-08;-0.00028928089886904;-0.00053929549176246;-0.0004243807925377;-5.5672830058029e-05;-0.00048567145131528;0.00024305454280693;5.2461437007878e-06;-0.0002137094270438;-0.00014756314340048;9.5979798061308e-05;6.7674918682314e-05;-0.00010337973799324;0.00028389706858434;-0.00060781568754464;-0.00033091366640292;0.0017133174696937;-2.9852892112103e-05;0.00063093827338889;0.00012373548815958;-6.6254498960916e-05;-4.7532477765344e-05;4.911554424325e-05;-0.00013515718455892;-0.00021338468650356;-0.00012228368723299;0.00027794431662187;-8.3763097791234e-06;8.2855447544716e-05;0.00012999333557673;0.00086310954065993;7.2445975092705e-05;3.0537659768015e-05;-0.0016081826761365;-0.00039813056355342;-0.00019650149624795;0.00027937107370235;-0.00080343999434263;1.6406240320066e-05;-0.00012500962475315;5.9523154050112e-05;0.0002546866890043;3.272837784607e-05;-0.00020777028112207;-0.00023442780366167;0.00028293803916313;-0.00023161621356849;-0.00015942483150866;-3.4230110031785e-05;-2.5261128030252e-05;-6.953579486435e-06;5.414147835836e-06;5.8663999880082e-07;-9.0960302259191e-06;6.9689740485046e-05;-0.00023012471501715;-7.0498128479812e-05;-1.7894479242386e-05;2.4334667614312e-05;3.9329803257715e-05;0.00026200330466963;-6.3616011175327e-05;-3.5693778045243e-05;6.2156170315575e-05;-0.00011938998795813;4.4339274609229e-05;8.1583399150986e-05;0.0001360457536066;0.00023964955471456;-4.9393565859646e-06;-6.1516431742348e-05;3.5464108805172e-05;5.0868758989964e-05;-1.0468886102899e-05;-1.9251898265793e-05;0.0004236891400069;-0.00017055179341696;-0.00017732178093866;9.767095616553e-05;-0.00018621393246576;9.692750609247e-05;5.818270801683e-05;6.4198386098724e-05;-1.5547038856312e-05;6.3288534875028e-06;-0.00053549266885966;6.76389754517e-05;5.5935350246727e-05;5.6132645113394e-05;3.8549940654775e-05;-1.629354119359e-05;1.9478033209452e-05;0.00012734346091747;-6.1049831856508e-05;2.2936219465919e-06;-0.00014019710943103;7.6522555900738e-05;-9.1756104666274e-05;0.00044698096462525;-9.1550260549411e-05;-0.00010296614345862;-4.6293480409076e-05;8.6949701653793e-05;-5.1576662372099e-05;-4.890901982435e-05;1.0896535968641e-05;-0.00028062242199667;3.5453700547805e-05;0.00056160183157772;-8.651013195049e-05;0.00050001754425466;0.00017553567886353;1.5733567124698e-05;5.4914478823775e-05;1.86559100257e-06;-2.0299934476498e-05;6.7033914092463e-05;-1.2085239475823e-08;9.6375217253808e-05;-3.9979346183827e-05;3.9543374441564e-05;1.4713365999341e-05;0.00043253862531856;0.00063905265415087;7.7795979450457e-05;-0.00093926483532414;-0.00034477742156014;-0.00025286091840826;-0.00026993325445801;-0.00038917060010135;3.8027992559364e-05;-0.00011432380415499;-4.0242168324767e-05;4.3786691094283e-05;1.9501720089465e-05;-4.6331701014424e-05;1.0836812180059e-05;-0.00028749988996424;0.00032382758217864;-0.00024152600963134;-0.00014672380348202;-1.0655335245247e-05;-2.7023475922761e-05;-5.6081071306835e-06;5.2605414566642e-06;1.8138837276638e-06;-1.0840287359315e-05;0.0001459636259824;-0.00026086691650562;-7.2411094151903e-05;-1.5026306755317e-05;1.5492891179747e-05;4.2338193452451e-05;0.00026585513842292;-5.3481184295379e-05;-3.0924289603718e-05;6.4766638388392e-05;-0.00013583709369414;2.6632817025529e-05;8.181382145267e-05;9.170360135613e-05;0.00024966266937554;1.4406502941711e-06;-6.4714266045485e-05;8.212299690058e-06;5.8862864534603e-05;2.3917948510643e-06;-2.2900920157554e-05;0.00040482342592441;-0.00013474868319463;-0.00017587114416528;6.6945402068086e-05;-0.00015440484276041;9.9547316494863e-05;6.6087202867493e-05;7.4019248131663e-05;-1.6835552742123e-05;2.8077092792955e-06;-0.00052804767619818;3.0036686439416e-05;5.8055880799657e-05;5.7024437410291e-05;4.23306664743e-05;-1.0202757948718e-05;7.6021846325602e-05;0.00018061147420667;-6.1741608078592e-05;-6.2411701946985e-05;-0.00018039281712845;5.4770564020146e-05;-0.0001026025347528;0.00044521747622639;-4.818454181077e-05;-0.00011651735258056;-6.1441023717634e-05;8.3215963968541e-05;-4.7205121518346e-05;-4.8984373279382e-05;8.076436643023e-06;-0.00029028006247245;1.2926456292917e-05;0.00051944085862488;-8.0973601143342e-05;0.0005430102464743;0.00022792871459387;2.1017516701249e-05;5.3485833632294e-05;-5.7524357544025e-07;-2.1146843209863e-05;9.527824295219e-05;1.5408884792123e-05;8.9972112618852e-05;-3.844032107736e-05;4.2842348193517e-05;2.1904375898885e-05;0.00054625159827992;0.0006956101860851;8.6948166426737e-05;-0.00099743960890919;-0.00044370180694386;-0.0002827569260262;-0.00028838802245446;-0.00039066380122676;2.1405085135484e-05;-0.00012614448496606;-5.5443146266043e-05;3.5966681025457e-05;1.8494127289159e-05;-4.1463361412752e-05;9.5257828434114e-06;-0.00055412674555555;0.00048270882689394;-2.9086904760334e-05;0.00032815837766975;3.5833596484736e-05;2.9180178898969e-05;-1.1884511877724e-05;2.3992433852982e-05;1.2376061931718e-05;-8.2186415966135e-06;0.00045585285988636;-0.00032264151377603;-1.81702489499e-05;8.1673999375198e-05;-4.283752059564e-05;6.5341159825039e-06;-0.00017122794815805;6.4310414018109e-05;1.9197770598112e-05;0.00019348003843334;-0.00019825498748105;-6.3939522078726e-05;-3.5263663448859e-05;-0.00025848756195046;-2.3096312361304e-05;7.3617149610072e-05;-3.8415284507209e-05;-9.2336202214938e-05;5.3852683777222e-05;3.4842305467464e-05;-2.7623307687463e-05;4.2165916966042e-05;0.00033943940070458;-2.6464487746125e-05;-0.00014866421406623;0.00019981020886917;5.1702812925214e-05;0.00013557625061367;0.00014055722567718;-1.6793679606053e-05;-2.9546896257671e-05;-0.00021149020176381;-0.00046295343781821;9.6526469860692e-05;9.6239782578778e-05;3.0009499823791e-05;5.2030904043932e-05;0.000467287551146;0.00062924681697041;-5.6329921790166e-05;-0.00058388675097376;-0.00052393571240827;-0.00020989637414459;-0.00012918906577397;0.00015803275164217;0.00038647965993732;-0.00018165135406889;-0.00019546451221686;-2.4694434614503e-05;3.4111049899366e-05;-1.4440288396145e-05;-4.3814980017487e-05;-0.00017563185247127;-0.00031682549160905;3.9939011912793e-05;0.00038670905632898;0.0005769677227363;0.0006445010076277;6.7691886215471e-05;1.5823379726498e-05;-2.9584569347207e-05;3.829096044683e-07;0.00013350106019061;0.00011309615365462;-1.566207720316e-05;6.985489744693e-05;5.3897834732197e-05;6.4566258515697e-05;0.0011367840925232;0.00099614774808288;0.0001268437190447;-0.0010536627378315;-0.0012515418929979;-0.00042015267536044;-0.00037675979547203;-0.00013992621097714;-0.00035380970803089;-0.0001570786407683;-0.00015253614401445;8.7023672676878e-06;4.7827787057031e-05;6.9469328991545e-06;-4.7012090362841e-05;-0.00047450253623538;0.00036294493474998;0.00014423116226681;0.00050793902482837;-9.7110869319295e-06;8.6900516180322e-05;-4.5939927986183e-06;1.4544735677191e-05;1.1252681360929e-05;6.1254979755176e-07;0.00042350150761195;-0.00020250890520401;9.8555752003904e-08;0.00012927810894325;-6.5538501075935e-05;-1.8139944586437e-05;-0.00040674049523659;0.0001088616263587;4.2849311284954e-05;0.00028248343733139;-0.00022694269136991;-0.00011614696995821;-6.4078652940225e-05;-0.00034707740996964;-0.0002130001957994;0.00011712600826286;-2.1144769561943e-05;-8.8888169557322e-05;5.5126779443526e-06;3.8577571103815e-05;-1.7700087482808e-05;-0.00015689448628109;0.0004781094903592;6.0335485613905e-05;-0.00014725018991157;0.00022188348521013;-3.6185458156979e-05;0.0001249932392966;0.00011839656508528;-7.3702453846636e-06;-2.7244977900409e-05;2.3548802801088e-06;-0.00058958132285625;7.5881907832809e-05;0.00010286850010743;1.3102624052408e-06;5.8616489695851e-05;0.0003048937942367;0.00052624364616349;-5.7186407502741e-05;-0.00045049184700474;-0.00040716314106248;-0.00023690974921919;-4.7133526095422e-05;-2.004704765568e-05;0.00045639762538485;-0.00012628649710678;-0.00018794694915414;-5.9501282521524e-05;7.7029573731124e-05;1.0627631127136e-05;-6.2749451899435e-05;-3.1481362384511e-05;-0.00040145294042304;-0.00011288591485936;0.00068838620791212;0.00044201596756466;0.00070397986564785;8.2004888099618e-05;2.0069223864994e-06;-3.9560400182381e-05;1.1413998436183e-05;6.7663284426089e-05;8.6284751887433e-05;-6.0293121350696e-05;0.00012284873810131;4.591155811795e-05;6.8502784415614e-05;0.00091989530483261;0.0010114316828549;0.00012604716175701;-0.00081265333574265;-0.0013800474116579;-0.00042747374391183;-0.00037691133911721;5.3022004067316e-06;-0.0005057193338871;-0.00012120301107643;-0.00015356262156274;2.0994189981138e-05;8.4306615462992e-05;1.6468391550006e-05;-8.2220074546058e-05;-0.00037583810626529;0.00021079849102534;0.000259288091911;0.00080113066360354;-9.8633077868726e-05;0.00020602735457942;-2.7836424010275e-07;1.2028663149977e-05;7.7808481364627e-06;1.2212291039759e-05;0.00036468173493631;-2.2048672690289e-05;1.2065013834217e-05;0.00019193161278963;-8.6047177319415e-05;-5.563955346588e-05;-0.00067452254006639;0.00017337191093247;7.2211834776681e-05;0.00042672298150137;-0.00031906936783344;-0.0001529367727926;-0.00013708892220166;-0.0003830989880953;-0.00050904485397041;0.00016531694564037;-6.2791471577839e-08;-7.6717340562027e-05;-6.74054317642e-05;3.8385238440242e-05;4.4783168959839e-06;-0.00036623797495849;0.00064042274607345;0.00016771070659161;-9.5351817435585e-05;0.00030192997655831;-5.0986622227356e-05;0.00013212372141425;0.00011272853589617;-2.4555481559219e-06;-2.7313168175169e-05;0.00021993434347678;-0.00074588693678379;6.7010376369581e-05;0.0001412082783645;-2.5936698875739e-05;6.9766938395333e-05;0.0002295856247656;0.00058130919933319;-4.4839383917861e-05;-0.00043938474846072;-0.00045494880760089;-0.00032911679591052;-2.257601954625e-05;-0.00021911274234299;0.00049606565153226;-8.8366818090435e-05;-0.00020986353047192;-0.00010220337571809;0.00011777024337789;3.6528042983264e-05;-8.9513356215321e-05;0.00010719797137426;-0.00052523252088577;-0.00027445307932794;0.00107746059075;0.0003050263330806;0.00078050832962617;9.856307588052e-05;-2.2921703930479e-05;-5.0066388212144e-05;2.689298162295e-05;-6.1207543922137e-07;3.8498244975926e-05;-0.00010706650937209;0.0001907757105073;3.7049798265798e-05;7.8550096077379e-05;0.00075497885700315;0.0010383741464466;0.00012529069499578;-0.00057429826119915;-0.0015847700415179;-0.00044236803660169;-0.00036519707646221;0.00015298317885026;-0.00069369707489386;-8.4380262705963e-05;-0.00015865510795265;3.6532575904857e-05;0.00013988009595778;2.6805375455297e-05;-0.00013164979463909;-0.00025844099582173;7.5050789746456e-05;0.00027430479531176;0.00078262254828587;-0.00012197710748296;0.00027479531127028;-4.6094828576315e-06;1.8176629964728e-05;3.7472643725778e-06;1.4912054211891e-05;0.00025910828844644;0.00017435394693166;1.8558148440206e-05;0.00018168702081311;-7.6355187047739e-05;-8.1588201283012e-05;-0.00066510209580883;0.00019510244601406;8.4801991761196e-05;0.00039662432391196;-0.00031600933289155;-0.00013711127394345;-0.00019408753723837;-0.00032861434738152;-0.0006237588240765;0.00015675160102546;1.8173865100835e-05;-5.0917758926516e-05;-0.00014090040349402;2.6410712962388e-05;4.4290802179603e-05;-0.00043867554632016;0.00066527008311823;0.00023340062762145;-5.6718094128883e-05;0.00028503948124126;-7.9625082435086e-05;0.00011262876796536;9.5558803877793e-05;2.6942375370709e-06;-2.2458467356046e-05;0.00031182292150334;-0.00073293555760756;6.2417435401585e-05;0.00015257197082974;-4.1848310502246e-05;5.7418448704993e-05;0.00010037226456916;0.00048807836719789;-3.531208858476e-05;-0.00033811340108514;-0.00035863526863977;-0.00031605662661605;6.0168322306708e-06;-0.00032001166255213;0.00044459162745625;-4.6480050514219e-05;-0.00018526570056565;-0.00011562560393941;0.00011196583363926;4.4908658310305e-05;-8.6994987213984e-05;0.00016743394371588;-0.00051130482461303;-0.00027755252085626;0.0012002339353785;0.00015641572827008;0.00068054045550525;9.9097756901756e-05;-3.2581774576101e-05;-4.5771710574627e-05;3.2453343010275e-05;-5.2456467528827e-05;-3.123550050077e-05;-0.00010504978854442;0.00020990158373024;1.8229266061098e-05;7.0833615609445e-05;0.00046760542318225;0.00089442019816488;9.8240183433518e-05;-0.00030875697848387;-0.0014601779403165;-0.00038886044058017;-0.00028796811238863;0.00019301551219542;-0.00069167045876384;-4.1291099478258e-05;-0.00013664324069396;4.1711689846125e-05;0.00015762099064887;2.7031910576625e-05;-0.00014346471289173;-1.5575236602672e-06;-7.4066888373636e-06;-9.9177589163446e-07;2.9648916097358e-05;-0.0001874883309938;7.0067137130536e-05;-0.0002557275001891;-0.00013684076839127;-7.126665150281e-05;0.00019993382738903;4.8778241762193e-05;4.3091473344248e-05;-7.8473080066033e-05;2.134288479283e-05;-0.00012770816101693;-0.00014392309822142;-5.9077574405819e-05;-7.2338603786193e-05;0.00022901088232175;0.00012509114458226;4.1743147448869e-05;0.00014840888616163;-0.00016065311501734;-1.2335799510765e-05;-0.00010979017679347;0.00028041383484378;0.00014049385208637;-3.6225857911631e-05;-2.1562407710007e-05;8.5607280198019e-05;1.9735625755857e-05;1.8910208382295e-05;-1.5288222130039e-05;-8.5108651546761e-05;-1.6809079170343e-05;0.00020724399655592;-0.00010142473183805;0.00032622384605929;-0.00022355260443874;-0.00068720331182703;0.0004703022132162;-5.3787320211995e-05;3.7906822399236e-05;-0.00014525427832268;-4.0136033931049e-05;0.00043329063919373;-0.00024938958813436;5.4719901527278e-05;1.870171581686e-05;0.00010258950351272;-0.00010033829312306;4.5862707338529e-05;-0.00021328256116249;6.1396232922561e-05;0.00019059286569245;-1.6417910956079e-05;-0.00037079933099449;0.00024491621297784;4.6958666644059e-05;-2.5985986212618e-05;7.5556981755653e-06;7.7606651757378e-05;3.4323916224821e-06;-1.0725429092417e-05;2.249654608022e-05;5.1788570999634e-05;0.00042746076360345;8.9235101768281e-05;0.00057163619203493;-8.5899657278787e-05;-0.00023982864513528;5.0028458645102e-05;3.9475846278947e-05;-2.2858087049826e-06;0.0001259931595996;-4.4956515921513e-05;-1.2568287274917e-05;-5.212531050347e-06;2.8048294552718e-05;0.00048765109386295;0.00025712128262967;-0.00016600197704975;-0.00019717798568308;-0.0008189455838874;-0.00017112733621616;-0.00014428469876293;-1.2940314263687e-05;-0.00031490158289671;4.4227061152924e-05;-5.1456834626151e-05;1.7459848095314e-05;4.2464740545256e-05;1.9793789761025e-05;1.8607972378959e-05;-1.6623198462185e-05;-1.6299656635965e-05;2.9066039132886e-05;6.8062683567405e-05;-6.167171522975e-05;0.00016788761422504;-0.00016502903599758;-0.00049098773160949;0.00050619302783161;-3.9478254620917e-05;3.1876872526482e-05;-1.1460291716503e-05;2.4820297767292e-05;0.00027152342954651;-0.00027436151867732;-8.3709346654359e-06;1.2581626833708e-05;-8.006452844711e-06;-6.7968639996252e-06;2.3411639631377e-06;-6.8082328652963e-05;5.8531994000077e-05;5.6052031141007e-05;-6.0558159020729e-05;-0.0002155148104066;0.00020418313215487;3.1767875043442e-05;-3.0963856261224e-05;-5.9192385378992e-05;4.9901369493455e-05;1.7874355080494e-06;2.952030627057e-06;-5.2414332458284e-05;-4.205104050925e-05;0.00012989119568374;0.00012961773609277;0.00015269228606485;0.00017485747230239;-0.00015304944827221;-0.00017888970614877;-1.589656676515e-05;-1.6328693163814e-05;-9.6385250799358e-05;-7.8101678809617e-05;0.00013559767103288;0.00014103896683082;7.4668176239356e-05;0.000142443459481;9.1650574177038e-05;-8.4621111454908e-05;-9.0262823505327e-05;-0.00018197241297457;-0.00017624457541388;9.9152020993643e-05;8.0373843957204e-05;-0.00015194501611404;-0.00016536077600904;2.0668188881245e-05;1.747150963638e-05;4.4703196181217e-05;4.3957654270343e-05;-7.9751889643376e-06;-2.9407644888124e-06;5.3426272643264e-05;3.7671947211493e-05;0.00030365056591108;0.00026223558234051;0.0001107186471927;0.00015817118401174;-7.7390155638568e-05;-0.00010847426892724;2.938218676718e-05;1.8227250620839e-05;4.5641867473023e-05;4.8710098781157e-05;3.0331002562889e-05;3.5282839235151e-05;1.317690112046e-05;0.00042928502080031;0.00040380418067798;-0.00017420401854906;-0.0001440156775061;-0.00048641365719959;-0.00050391949480399;-0.00013268087059259;-9.7421790997032e-05;-0.00010413311974844;-0.00011939504474867;-2.5632441520429e-06;-4.282965164748e-06;-7.1638878580416e-06;-6.7414021032164e-06;-7.2444627221557e-06;-1.199511757477e-06;-2.8858116820629e-06;4.1421699279454e-05;-0.00036158080911264;9.3031587311998e-05;-0.00030056957621127;-9.3532769824378e-05;0.00013793719699606;7.539865327999e-05;0.00011012916365871;2.775402754196e-05;-5.7062476116698e-05;2.3178015908343e-05;-0.0004438369651325;-7.2734437708277e-05;-9.3987189757172e-05;-0.00012932204117533;0.00017347044195049;0.00024844548897818;2.6879220968112e-05;0.00024122503236867;-0.0001400747714797;-6.5190994064324e-05;-9.9606484582182e-05;0.00051185756456107;7.9068471677601e-05;-0.00011218043800909;-1.0753538845165e-05;0.00020062304974999;1.3427088561002e-06;1.8758248188533e-05;-1.9198303562007e-05;-0.00010589546582196;1.6967268265944e-06;0.0002001763205044;-0.00010224575089524;0.00038862333167344;-0.00031220851815306;-0.00084394559962675;0.00060854811454192;-2.9101231120876e-05;5.0859336624853e-05;-0.00020195056276862;-4.2396655771881e-05;0.00041538089863025;-0.00032834240118973;4.6008364734007e-05;5.6101194786606e-05;0.00018680792709347;-7.7576529292855e-05;3.603882578318e-05;-0.00031026528449729;3.6842582630925e-05;0.00020942412083969;-4.8264395445585e-05;-0.00032479883520864;0.00033033904037438;2.2743675799575e-05;-3.2683536119293e-05;7.8066928836051e-05;9.2457383289002e-05;7.3306996455358e-06;-1.0335619663238e-05;3.695970372064e-05;7.1936592576094e-05;0.0004610667238012;2.1036621546955e-05;0.00077829137444496;-0.00010335594561184;-0.00027244869852439;7.776211714372e-05;2.6694031475927e-05;-2.1711657609558e-05;0.00018142507178709;-5.114388113725e-05;-4.4877273467137e-05;-1.3775367733615e-05;1.2428266018105e-05;0.00053742784075439;0.0001510082220193;-0.00015615827578586;-0.00022943201474845;-0.00096164474962279;-4.4849137339042e-05;-0.00017592326912563;1.7964195649256e-05;-0.00037524237995967;5.7779008784564e-05;-4.6034205297474e-05;2.539983324823e-05;2.2217534933588e-05;2.0204672182444e-05;-7.82454299042e-06;-7.1993003984971e-06;2.6088478080055e-06;4.6694036427652e-05;-0.00041108540608548;0.00016557621711399;-0.00051640556193888;-0.00015702069504187;5.2775802032556e-05;0.00019245341536589;0.00011052074114559;6.2471168348566e-05;-0.00012112918921048;3.6408488085726e-05;-0.0003774942306336;-0.00015810133481864;-0.00011059459211538;-0.00015136138244998;0.00037264515412971;0.00026362136122771;5.9797745052492e-05;0.00033566981437616;-0.00030891867936589;-5.0843475037254e-05;-0.0001743115572026;0.0006100467289798;0.00015319199883379;-9.2501250037458e-05;-2.7889356715605e-05;0.00019049375259783;1.7705262507661e-05;2.8956719688722e-05;-2.3128990505938e-05;-0.00014499355165754;-2.5628865842009e-05;0.00021402801212389;-0.00016549024439882;0.00044199789408594;-0.00037050902028568;-0.0010940558277071;0.00077876530122012;-7.5994939834345e-05;6.5865344367921e-05;-0.0002737765898928;-5.4374329920392e-05;0.00063679297454655;-0.00041896363836713;6.759417738067e-05;-5.4012703913031e-05;0.00015787889424246;-9.6172872872557e-05;0.00010732972441474;-0.00021747077698819;0.00010493752051843;0.00032739705056883;-4.2641455365811e-05;-0.00047267964691855;0.00040799428825267;6.6223103203811e-05;-4.600149259204e-05;4.6945639041951e-05;0.00012318826338742;9.4576744231745e-06;-1.7583390217624e-05;3.2740867027314e-05;8.96821875358e-05;0.000694363436196;9.3687267508358e-05;0.0010480139171705;-0.00016682241403032;-0.00042594166006893;0.00011517474194989;5.8355559303891e-05;-1.2182624232082e-05;0.00022754416568205;-7.9472520155832e-05;-3.4957647585543e-05;-2.1505982658709e-05;3.8649417547276e-05;0.00078244711039588;0.00034896677243523;-0.00025066416128539;-0.00032170792110264;-0.0013776443665847;-0.00018391091725789;-0.00023348855029326;-2.3143454654928e-06;-0.00055245007388294;9.3265894975048e-05;-8.768501720624e-05;3.1651310564484e-05;7.0131907705218e-05;3.4199281799374e-05;-5.7621350606496e-06;-1.0444127838127e-05;7.5993066275259e-06;3.6364002880873e-05;-0.00031271643820219;0.00017951766494662;-0.00054804480168968;-0.00015894279931672;-4.3955162254861e-05;0.00023908411094453;7.4734351073857e-05;7.3978102591354e-05;-0.00013871674309485;3.7958088796586e-05;-0.00019099452765658;-0.00018784134590533;-8.8426284492016e-05;-0.00011579674901441;0.00043719069799408;0.00018623906362336;6.8154971813783e-05;0.00030813956982456;-0.00036887143505737;-2.3198263079394e-05;-0.00018599496979732;0.00049408304039389;0.00016957279876806;-4.3649513827404e-05;-3.5260101867607e-05;0.00011780829663621;2.8191352612339e-05;2.8061384000466e-05;-1.736824742693e-05;-0.00013501114153769;-4.5388562284643e-05;0.00011417367204558;-0.00017063654377125;0.00031375337857753;-0.0002865559363272;-0.00093547505093738;0.0006582131027244;-9.1107052867301e-05;5.5279277148657e-05;-0.00025514798471704;-4.5903045247542e-05;0.00060150882927701;-0.00035162860876881;6.0191938246135e-05;-0.00017391874280293;5.7940480473917e-05;-5.9107573179062e-05;0.00014796431059949;-3.3921992326214e-06;0.00014430214650929;0.00033172310213558;-1.8751232346403e-05;-0.00041254333336838;0.00032972989720292;8.0456440628041e-05;-4.2221781768603e-05;1.2675524885708e-05;0.00010818359442055;8.5582487372449e-06;-1.8888877093559e-05;1.8270129658049e-05;7.5241659942549e-05;0.00067467708140612;0.00014236703282222;0.0009443779126741;-0.00017162167932838;-0.00043441585148685;0.00011026922584279;6.5676693338901e-05;3.5281516375107e-06;0.00018781248945743;-8.1038262578659e-05;-1.0893438229687e-05;-2.1013645891799e-05;4.9562913773116e-05;0.00075206079054624;0.00044115204946138;-0.00025407996145077;-0.0002990688662976;-0.0013075124006718;-0.00027509246137924;-0.00020560597477015;-2.5201386961271e-05;-0.00052518374286592;9.5395800599363e-05;-9.2616515757982e-05;2.6288129447494e-05;8.9163389930036e-05;3.7831308873137e-05;3.8128291635076e-05;-3.0797371437075e-05;-3.4264918213012e-05;5.8154295402346e-05;3.6345398257254e-05;-2.0281608158257e-05;0.00023514559143223;-0.00010025988012785;-0.0009797130478546;0.00098250748123974;-7.7929915278219e-05;5.486304871738e-05;-3.2240044674836e-05;8.7390581029467e-05;0.0005486806621775;-0.00052880751900375;-1.59192859428e-05;2.7817530281027e-05;-8.5519452113658e-05;5.05107382196e-05;-6.3992127252277e-05;-3.3707983675413e-05;2.1033425582573e-05;0.00011230885138502;-0.00011338050535414;-0.00035605166340247;0.00024743308313191;7.1571208536625e-05;-7.5176823884249e-05;-0.00014074667706154;0.00011689872917486;1.0472266694705e-05;1.6232321286225e-05;-0.00014425214612857;-0.00011440480011515;3.1131879950408e-05;0.00012508548388723;0.00023246226191986;0.00036547015770338;-0.00020342259085737;-0.00050257763359696;-5.2211922593415e-05;-7.2236151027028e-05;-0.00023905115085654;-0.00020990852499381;0.00022104047820903;0.00039311987347901;0.0001173603523057;-5.6155047786888e-05;-9.5429146313109e-05;1.2978067616132e-06;-8.500676631229e-05;-3.4406330087222e-06;-3.3385540518793e-06;0.0002877191582229;0.00026413312298246;-0.00021237824694254;-0.00038482289528474;5.0326845666859e-05;6.4600280893501e-05;0.00011289955727989;8.528440957889e-05;-1.70917937794e-05;-1.3587855391961e-06;0.00010554005712038;6.8877532612532e-05;0.00067019218113273;0.00059813354164362;0.00015584373613819;0.00037195332697593;-0.00018573839042801;-0.00032280446612276;6.9714937126264e-05;4.02904333896e-05;7.9290199209936e-05;0.00012204686208861;9.4386115961242e-05;0.00011933460336877;1.9970451830886e-05;0.00087472080485895;0.001090653706342;-0.00034489206154831;-0.00027951647643931;-0.0010731647489592;-0.0011670030653477;-0.00029802977223881;-0.00022060480841901;-0.00020545296138152;-0.00031319129629992;1.4444005955738e-06;-1.1137829460495e-05;-1.9043196516577e-05;-2.3363196305581e-05;7.5121579357074e-07;8.9725108409766e-06;-2.6972260457114e-05;1.4014582916388e-07;-0.00021689989080187;0.00041750923264772;1.8505850675865e-05;0.00053442141506821;5.9107089327881e-05;-0.00028687037411146;-4.3711985199479e-05;-9.0604611614253e-05;-3.7396170228021e-05;6.8546054535545e-05;-3.3465314572823e-06;0.00046506637590937;8.2373349869158e-05;0.00019444833742455;-0.00024394395586569;-4.0753915527603e-05;-0.00024050011415966;0.00028156698681414;-0.00044705797336064;0.00014576308603864;3.9307167753577e-05;6.5467129388708e-06;-0.00057393510360271;1.0239998118777e-05;9.5858697022777e-05;1.3741156180913e-05;-0.0001908725098474;-1.5534256817773e-05;1.5759367670398e-05;-3.8243269955274e-05;-9.4703915237915e-05;-9.9045653769281e-05;-6.2903563957661e-06;-0.00024291282170452;0.00015425593301188;0.00054446328431368;-0.00073572591645643;8.324786904268e-05;-1.7668755390332e-05;-2.795643376885e-05;-0.00021327094873413;-0.00032562119304202;0.00033926239120774;1.5627058019163e-05;-0.00022414982959162;0.00012050233635819;0.00017819332424551;2.2992011508904e-05;3.1235158530762e-05;0.00010101859515999;-8.3439765148796e-05;0.00019161407544743;0.00031443699845113;-0.00014759537589271;-5.2549679821823e-05;1.8416110833641e-05;0.00010072800068883;9.2955640866421e-05;-1.4669748452434e-05;1.6085750758066e-05;9.0882364020217e-05;-1.1989265658485e-05;-7.4817646236625e-05;0.00043811037903652;-0.00016726367175579;0.0012034804094583;0.00018172086856794;-0.00043828235357068;-3.2949741580524e-05;4.2662879423006e-05;-8.2709178968798e-05;0.0002045146538876;-7.0032372605056e-05;-0.00012649409472942;1.5425857782247e-05;0.0005996628315188;3.929096419597e-05;-0.00027852194034494;-9.4977869594004e-05;0.00011245522910031;-0.0012149633839726;5.8778790844372e-05;-0.00012643079389818;0.00013421685434878;-0.00048531009815633;2.9163336876081e-05;-0.0001042822987074;4.0948438254418e-05;0.00011629480286501;-4.2749443309731e-06;1.0753308743006e-05;-3.883692988893e-05;3.7936908938718e-06;-0.00018321620882489;0.00048907613381743;-1.7284194200329e-06;0.00043938861927018;0.00011365799582563;-0.00038742367178202;-2.0588289771695e-05;-0.00012119826715207;-3.6623128835345e-05;3.5263667086838e-05;-3.9170827221824e-05;0.00066357286414132;0.00010048865806311;0.00020260487508494;-0.00014133255172055;-1.8742897736956e-05;-0.00030362443067133;0.00019630018505268;-0.0004311419907026;0.00011308825196465;6.7331493482925e-05;3.6918878322467e-05;-0.00064970640232787;-4.939262154835e-08;0.00014553860819433;2.6160150810028e-05;-0.00026627903571352;-1.9114380847896e-05;1.5319394151447e-05;-1.5407025784953e-05;-0.00010277533147018;-8.7877844634932e-05;3.4171702282038e-05;-0.00029327761149034;0.00025975456810556;0.00060573156224564;-0.0008200058946386;8.8919114205055e-05;6.9128545874264e-06;-3.4395077818772e-05;-0.00022041745251045;-0.00036062617436983;0.0002903864660766;1.2666122529481e-05;-0.00013305321044754;0.00018793765048031;0.00013433169806376;2.4956436391221e-05;5.6285161917913e-06;-6.7872402723879e-05;-0.00010278289119015;0.00017428591672797;0.00036000731051899;-0.00014013161126059;-5.3423325880431e-05;-1.1138114132336e-05;0.00010939237836283;0.00015189661644399;-1.1789542440965e-05;1.5434803572134e-05;0.00010212779307039;2.9172610993555e-06;-0.00012047737254761;0.00042709254194051;-0.00015417228860315;0.0012667976552621;0.00017506255244371;-0.00041487679118291;-5.1087139581796e-05;3.1261224648915e-05;-8.1495840277057e-05;0.00022582104429603;-6.531997496495e-05;-0.00015174747386482;2.1222456325631e-06;0.00061674695461988;-4.1290510125691e-05;-0.00029346530209295;-8.3182952948846e-05;0.00018763658590615;-0.0012515393318608;8.6503336206079e-05;-0.00014217992429622;0.00012535105634015;-0.00047440530033782;3.4614815376699e-05;-8.8870263425633e-05;3.7287198210834e-05;8.9122986537404e-05;-1.7159420167445e-05;1.5851210264373e-05;1.4877443391015e-05;1.0864514479181e-05;-0.00035263286554255;0.0001452431170037;-0.00023623536981177;0.00011117711255793;0.00076320860534906;-0.00038144455174915;0.00027400651015341;-1.7243226466235e-05;0.00022591162996832;2.1056423520349e-06;-0.0011721265036613;0.00018836275557987;-0.00010382323671365;-0.00021585704234894;-3.8512487662956e-05;0.00031910600955598;9.7424253908684e-06;0.00036113912938163;-8.8561821030453e-05;-0.00032235382241197;-1.6314990716637e-05;0.00059532560408115;-0.00015597353922203;-0.00035018852213398;2.7144411433255e-05;0.00044958159560338;-4.52202912129e-05;-1.7365575331496e-05;1.7639449652052e-06;-0.00010919963096967;1.0887717508012e-05;-0.00052335619693622;8.6465952335857e-05;-0.00036710797576234;-0.00022532697767019;-0.00044855586020276;0.00045184246846475;0.00015350709145423;7.2652197559364e-05;-0.0004148414300289;1.9103828890366e-05;-0.00035191816277802;-0.000264589645667;-8.398485078942e-05;-0.00033429867471568;0.00033352803438902;0.00031452401890419;0.00016638847591821;0.00041491657611914;-0.00021784886484966;0.00014047475997359;-0.00016226175648626;0.00079964863834903;0.0002394686016487;-0.00013101412332617;-4.3021707824664e-05;0.0004343238833826;5.5195305321831e-05;1.7997694158112e-05;-1.986126335396e-06;1.8976945284521e-05;0.00011319414625177;0.00022140995133668;-0.00027244864031672;0.0014598403358832;-0.00015819272084627;-0.00040195265319198;0.00023706356296316;1.0600128916849e-05;-8.1235149991699e-05;0.00019427403458394;-5.4493768402608e-05;-0.00034139168565162;-8.777403854765e-05;-5.7556957472116e-05;0.00043445688788779;-0.00038048310671002;5.1552222430473e-05;-0.00023618765408173;-0.0011115208035335;0.00051428226288408;-0.00014513597125188;0.00012584877549671;-0.00028593969182111;0.0001200065453304;-5.4805153922644e-05;3.570436820155e-05;8.5392974142451e-05;3.0503240850521e-05;-5.392480034061e-06;-6.5119211285491e-06;5.2189207053743e-06;2.9908387659816e-05;-0.00027275332831778;0.00013887496606912;-0.00041852641152218;-0.00011248743248871;1.5207122487482e-05;0.00014962190471124;6.9877532951068e-05;5.1638886361616e-05;-9.6629832114559e-05;2.7326812414685e-05;-0.00021411510533653;-0.00012265067198314;-7.4235504143871e-05;-0.00010032183490694;0.00031521118944511;0.00016808831423987;4.7416506276932e-05;0.00025012399419211;-0.00026865251129493;-3.0234859877964e-05;-0.00013610481983051;0.00041961803799495;0.00011402017844375;-5.0550323067e-05;-2.3236510969582e-05;0.00011364046076778;1.6610338207101e-05;2.0720539396279e-05;-1.4097661733103e-05;-0.00010425058280816;-2.9369068215601e-05;9.0988069132436e-05;-0.00012434400559869;0.0002466240839567;-0.00023474606859963;-0.00073760381201282;0.00052555138245225;-6.2751038058195e-05;4.5272125134943e-05;-0.00020400439098012;-3.4460597817088e-05;0.00045080968993716;-0.00028285195003264;4.3730688048527e-05;-0.00011483646085253;6.8950866989326e-05;-4.435921437107e-05;0.00010717218538048;-2.9999639082234e-05;9.4181676104199e-05;0.00025053846184164;-2.3528662495664e-05;-0.00030120971496217;0.00026734688435681;5.6136090279324e-05;-3.3511794754304e-05;2.3171747670858e-05;8.4730163507629e-05;7.5485718298296e-06;-1.3707507605432e-05;1.5975821952452e-05;6.01858846494e-05;0.00050379749154672;8.4433486335911e-05;0.00075478432700038;-0.00013036211021245;-0.00032880558865145;8.9905232016463e-05;4.6331104385899e-05;-2.6555237582215e-06;0.00015519665612374;-6.0386744735297e-05;-1.9461585907266e-05;-1.8373762941337e-05;3.2357213058276e-05;0.00056167517323047;0.00028959009796381;-0.0001828818640206;-0.00022655233624391;-0.00099481653887779;-0.00016413889534306;-0.00015924217586871;-1.014415283862e-05;-0.00040630900184624;7.3735114710871e-05;-6.993547140155e-05;2.1353693227866e-05;6.3449697336182e-05;2.7453719667392e-05;-6.0157967709529e-06;-9.3302469394985e-06;1.1805580470536e-05;2.8236874641152e-05;-0.0002722074277699;0.00019003127817996;-0.00055475148838013;-0.00012322088878136;-1.4547252249031e-05;0.00018086770433001;6.2199120293371e-05;6.8449713580776e-05;-0.00012731437163893;3.277982614236e-05;-0.00014906497381162;-0.00014968778123148;-7.5132615165785e-05;-9.6515686891507e-05;0.00043556350283325;0.00015486893244088;5.86178030062e-05;0.00029463166720234;-0.00038096829666756;-2.3042230168357e-05;-0.00017011933960021;0.0004486468678806;0.00013162716641091;-2.8733596991515e-05;-3.1122162909014e-05;8.8935601525009e-05;2.451250111335e-05;2.3313667043112e-05;-1.1464117960713e-05;-0.000117132163723;-5.1428389269859e-05;-7.6670239650412e-06;-0.00015531494864263;0.00015911636000965;-0.00021225496311672;-0.00074498885078356;0.00053556077182293;-8.4480408986565e-05;4.6689514419995e-05;-0.00023889844305813;-3.0161738322931e-05;0.000493113999255;-0.0002887356095016;4.0119241020875e-05;-0.0002638986625243;-7.3647588578751e-06;-5.6398475862807e-06;0.00017348252004012;0.00018643084331416;0.00014867290155962;0.00030702428193763;-1.3005098480789e-05;-0.00027413186035119;0.00025860292953439;7.6681462815031e-05;-3.8473503082059e-05;7.9648407336208e-06;8.8267021055799e-05;1.0077079423354e-05;-1.722009437799e-05;5.9521471484913e-06;5.7799457863439e-05;0.00056012871209532;0.00012641589273699;0.00082835165085271;-0.00016332055383828;-0.00040069519309327;0.00010870041296585;5.5111111578299e-05;8.6157524492592e-06;0.00015759422967676;-7.39799143048e-05;-7.1449280767411e-06;-2.336323086638e-05;4.2872583435383e-05;0.00061440130230039;0.00039401167305186;-0.00020557449897751;-0.00023896776838228;-0.0010991712333634;-0.0002428212610539;-0.00015930588415358;-2.681747355382e-05;-0.00046384203596972;9.3084163381718e-05;-8.5349238361232e-05;2.1353673218982e-05;8.7330263340846e-05;3.5773202398559e-05;4.5965127355885e-05;-3.6628596717492e-05;-4.0321214328287e-05;8.0168749263976e-05;-4.4852404244011e-05;4.6118497266434e-05;9.6026160463225e-05;6.649019633187e-05;-0.0012508324580267;0.0012599710607901;-8.7291067757178e-05;7.2442329837941e-05;-8.7784115748946e-05;0.00016136124031618;0.00071159802610055;-0.00072376412572339;-3.5791377740679e-05;2.3664544642088e-05;-8.5719671915285e-05;0.00013596353528555;-0.00011604301107582;4.6357548853848e-05;-7.9218079918064e-05;0.00013267136819195;-0.00016127052367665;-0.00031534495064989;0.00021597795421258;0.00010525877587497;-0.00012129272363381;-0.0001944268879015;0.00018054609245155;3.0115603294689e-05;2.8112563086324e-05;-0.00024328990548383;-0.00017603448941372;-0.00022027471277397;-0.00010957086487906;0.00028523412765935;0.00035980029497296;-0.00031762282014824;-0.00057274039136246;-0.00011839006765513;-0.0001288609491894;-0.00035663219750859;-0.0003049707156606;0.00034948351094499;0.00050749495858327;0.00010676173405955;-0.00055638269986957;-0.00054217647993937;0.00019973520829808;6.0421694797697e-05;0.00047986969002523;0.00056177715305239;0.00051868456648663;0.00043976958841085;-0.00027967899222858;-0.00043492153054103;8.9998160547111e-05;0.00010407548688818;0.00013698730617762;0.00010322522575734;-2.252874946862e-05;-1.4173506315274e-06;0.00012042195885442;7.3809831519611e-05;0.00099045468959957;0.00084014254389331;0.0001804400671972;0.00039853603811935;-0.00033137042191811;-0.00050217425450683;0.00011233211262152;6.2076156609692e-05;7.8968259913381e-05;0.00011944738798775;0.0001669387856964;0.00021441276476253;3.8319929444697e-05;0.0011826097033918;0.0018328584264964;-0.00045500413398258;-0.00037228167639114;-0.0016224426217377;-0.0016567506827414;-0.00042071883217432;-0.00028881258913316;-0.00029219058342278;-0.00040819638525136;-1.3624542134494e-06;-9.4705346782575e-06;-8.2143578765681e-06;-1.8833061403711e-05;5.0393759011058e-05;-3.886096237693e-05;-4.6841476432746e-05;8.1614925875328e-05;-3.2823551009642e-05;4.0386679756921e-05;0.0001772513060132;7.0229158154689e-05;-0.0013281913707033;0.0013223377754912;-0.00010000680049416;7.2512331826147e-05;-7.7305943705142e-05;0.00016664068971295;0.0007576517527923;-0.00074486882658675;-2.8740147172357e-05;3.1324667361332e-05;-0.00014391138392966;0.00012494587281253;-0.00012478034477681;4.1585597500671e-05;-5.9287867770763e-05;0.00015304879343603;-0.000161235788255;-0.00038610349292867;0.00022054348664824;0.00010823788034031;-0.00012306368444115;-0.00020477382349782;0.00018209076370113;2.705897713895e-05;2.9224629543023e-05;-0.0002438515657559;-0.00018095730047207;-0.00018078940047417;-5.113400038681e-05;0.00029503018595278;0.00041070726001635;-0.00027525413315743;-0.00067298975773156;-0.00010727301560109;-0.00013317703269422;-0.00035937977372669;-0.00032394821755588;0.00032418279442936;0.00056873500579968;0.00012160120968474;-0.00048701098421589;-0.00048182849423029;0.00017957344243769;1.9104470993625e-05;0.00039419092354365;0.00048313208390027;0.00050302734598517;0.00045349265565164;-0.00027387755108066;-0.0004916075267829;8.397701458307e-05;0.00011098456889158;0.00015178002649918;0.00010727613698691;-2.5078821636271e-05;2.8536933882606e-07;0.00013108570419718;8.0013065598905e-05;0.0010095974430442;0.00087603559950367;0.00016767239139881;0.00047924957470968;-0.00031100283376873;-0.00053444277727976;0.00011499500396894;6.1865292082075e-05;8.0604484537616e-05;0.00014555589586962;0.00016207597218454;0.00021519677829929;3.6882942367811e-05;0.001234222901985;0.0018383999122307;-0.00047623715363443;-0.0003888068604283;-0.0016432799166068;-0.0017307461239398;-0.00043567645479925;-0.00030402088304982;-0.00028401025338098;-0.00045383145334199;1.2150137536082e-06;-1.4513346286549e-05;-1.0981052582792e-05;-2.2325391910272e-05;7.799845889167e-07;1.0891886631725e-05;-2.9246684789541e-05;-3.269804892625e-06;-0.00028234638739377;0.00050378689775243;9.433507329959e-06;0.00068324257154018;0.00010460938210599;-0.00038478773785755;-5.2471521485131e-05;-0.00010928529081866;-4.2441879486432e-05;7.2802431532182e-05;-2.4575732822996e-05;0.00057270063553005;9.7721509519033e-05;0.0002358685596846;-0.00031200208468363;-4.6868473873474e-05;-0.0002868065785151;0.00036631501279771;-0.00056236243108287;0.00017556358943693;5.3903699154034e-05;2.6037982024718e-05;-0.00069658632855862;9.6922340162564e-06;0.00011666877981042;1.9619887098088e-05;-0.00022658761008643;-1.4528718565998e-05;1.5358260498033e-05;-5.415634586825e-05;-0.0001079026988009;-9.8908210929949e-05;-0.00010177589138038;-0.00025599787477404;4.3702060793294e-05;0.00060955167282373;-0.00079984759213403;0.00010073817975353;-1.6633121049381e-05;-2.0326046069385e-05;-0.00027468809275888;-0.00036911229835823;0.00035226147156209;4.6785939957772e-06;-0.00035817420575768;0.00012631082790904;0.00025076273595914;6.5328524215147e-05;1.7849444702733e-05;0.00029392974101938;-0.00010925677634077;0.00023163158039097;0.00034429880906828;-6.5419917518739e-05;-6.4695726905484e-05;2.2271473426372e-05;0.00011239009472774;0.00012036002590321;-1.6501502614119e-05;2.1387575543486e-05;0.00010110235598404;-2.0433601093828e-05;-0.00011099037510576;0.0004786599020008;-0.00020035644411109;0.0014696641592309;0.00023139890981838;-0.00053621095139533;-3.9280421333387e-05;4.7681704018032e-05;-9.7705611551646e-05;0.00024561199825257;-9.1984686150681e-05;-0.00016733130905777;1.2263938515389e-05;0.00065893051214516;3.0142149398671e-07;-0.00030428750324063;-8.7421729404014e-05;0.00017189429490827;-0.0013947940897197;7.4991548899561e-05;-0.00013591547030956;0.00016566953854635;-0.00057864101836458;3.3068015909521e-05;-0.00012841563147958;5.0942198868142e-05;0.00014670235395897;-8.2642181951087e-06;1.5649375200155e-05;-4.6017114073038e-05;1.3101965805618e-06;-0.00026316332514398;0.00066035101190209;-3.7159388739383e-05;0.00059818912995979;0.00022331696527544;-0.00061449920758605;-1.9972159861936e-05;-0.00017612814554013;-4.6935132559156e-05;1.4571639439964e-05;-9.5292096375488e-05;0.00098032294772565;0.00013388218940236;0.00027977512218058;-0.00016745476750657;-2.0598818082362e-05;-0.00041157021769322;0.00027201406192034;-0.00060751411365345;0.0001386110088788;0.00011458583321655;9.1507645265665e-05;-0.00088268576655537;-6.4208347794192e-06;0.00021798875241075;4.3754964281106e-05;-0.00038215555832721;-1.9523335140548e-05;1.4451819879469e-05;-2.4265527827083e-05;-0.00013217180094216;-7.9944460594561e-05;-0.00010985595872626;-0.00035123343695886;0.00015956217248458;0.00074791687075049;-0.00097299093613401;0.00011974997323705;3.0591236281907e-05;-2.7518290153239e-05;-0.00032302457839251;-0.00045039635733701;0.00024506187764928;-1.076387889043e-05;-0.00029324609204195;0.00024457194376737;0.00022115155297797;0.00010954797471641;-2.9158331017243e-05;0.00012557917216327;-0.00015657610492781;0.00022551997972187;0.00043785772868432;2.030431824096e-05;-7.2524140705355e-05;-3.4363521990599e-05;0.0001329107908532;0.00025277936947532;-1.4191820810083e-05;2.2566560801351e-05;0.00013836959260516;-1.7679969914752e-06;-0.00020964587747585;0.00053258280968294;-0.00021600334730465;0.0018088150536641;0.00026396728935651;-0.00058714678743854;-7.6810691098217e-05;3.911865860573e-05;-0.00011233115219511;0.00030307023553178;-0.00010301014117431;-0.00024428369943053;-6.8689819272549e-06;0.00080083240754902;-0.00013234875223134;-0.00038425551610999;-7.901217759354e-05;0.00033126753987744;-0.0016928153345361;0.00013527310511563;-0.00018008773622569;0.00018241826910526;-0.00062879646429792;4.7041819925653e-05;-0.00012118463928346;5.4295367590385e-05;0.00013094244059175;-1.5904062820482e-05;1.5078936485224e-05;-3.5168635804439e-05;3.0475968060273e-07;-0.00017259070591535;0.00055000727297738;-0.00010244517034153;0.00030434058862738;0.00033435685327277;-0.00073677423642948;2.4224171284004e-05;-0.00019869166135322;-2.907285670517e-05;-0.00010654811194399;-0.00017144458252005;0.0011490888427943;0.00011652304237941;0.00023338828759734;5.0819086027332e-05;1.350391539745e-05;-0.00037895829882473;0.00010007161472458;-0.00046899923472665;4.0348644688493e-05;0.00017320972983725;0.00016160590166692;-0.00072302261833102;-2.663223494892e-05;0.00027439769473858;5.8361976698507e-05;-0.0004333789111115;-8.7606958913966e-06;-3.7099368910276e-07;1.0116747262146e-06;-0.00010262498108204;1.2089002666471e-05;-0.00027546036290005;-0.00027302405214868;-5.8682886447059e-05;0.00055841309949756;-0.00065918389009312;0.0001018462862703;0.00010007772652898;-2.6573839022603e-06;-0.00029754635761492;-0.00034207713906653;-0.00014363082300406;-5.8509438531473e-05;-0.00031077236053534;0.00027364451671019;0.00019260955741629;0.00020949567260686;-0.00011708942474797;0.00023983619757928;-0.00017595631652512;0.00012394608347677;0.00032936959178187;0.00038409061380662;-5.8693767641671e-05;-0.00010986311826855;9.3642745923717e-05;0.00037483117193915;-4.63617971036e-06;1.8220300262328e-05;0.00012693260214292;8.6897462097113e-06;-0.00028809512150474;0.00033224589424208;-0.0001699281274341;0.0016982526285574;0.000246798095759;-0.00048969982890412;-9.5480150775984e-05;1.437125774828e-05;-9.3792208645027e-05;0.00024505594046786;-0.00010004152136389;-0.00031427986687049;-3.8210004277062e-05;0.000625072454568;-0.00031391964876093;-0.00031354257953353;7.7059257819201e-06;0.00046746173757128;-0.0014299117028713;0.0001686550967861;-0.00014507201558445;0.00015528792573605;-0.00042963770101778;4.4636137317866e-05;-7.3259441705886e-05;4.7547233407386e-05;9.2573078291025e-05;-1.887136932055e-05;2.1447203835123e-05;2.4637523893034e-05;-1.4643681424786e-05;-0.00016334520478267;0.0001267666957574;-7.6446463936009e-05;0.00017804330855142;0.0010014533763751;-0.0005378911155276;0.00035259628202766;-3.5628454497783e-05;0.00041797439916991;-1.5518549844273e-05;-0.0014712942065671;0.00027224214863963;-8.3218968939036e-05;-0.00022385122429114;-0.00016810958913993;0.00026458685169928;9.5179884738172e-06;0.00032000170904212;-1.6820578821353e-05;-0.00047344961785711;3.4707751183305e-05;0.0004282642621547;-0.00022685481235385;-0.00047193191130646;4.2447129089851e-05;0.00055914046242833;-5.5951357353479e-05;-3.8737645809306e-05;1.5014104064903e-05;-0.00010874000145122;1.0544324140938e-05;-0.00086808786727488;0.00018680347420741;-0.00076810002792627;-0.00017253708210774;-0.00022393133258447;0.00035249724169262;0.00027201592456549;8.0712205090094e-05;-0.00050208711763844;4.3932359403698e-05;-0.00083557091420516;-0.0002181900490541;-0.00015001856081653;-0.00054024386918172;0.00042118260171264;0.00051038037054241;0.00023780518677086;0.00077883282210678;-0.00035519650555216;6.5702195570339e-05;-0.00021261224173941;0.0014227950014174;0.00018206733511761;-0.00024190825934056;-4.5224707719171e-05;0.00066407909616828;3.6821918911301e-05;2.0152487195446e-05;3.0714545573574e-06;1.3877867786505e-05;0.00013674567162525;3.425177783356e-05;-0.0003839903511107;0.0017801988869905;-0.00017545239825267;-0.00045624346239492;0.00030065487953834;5.6430826589349e-07;-0.00010771681991173;0.00014208766515367;-5.4828353313496e-05;-0.00054749561240897;-0.00011644412006717;-0.00010066883987747;0.00039358568028547;-0.00060720276087523;0.00017862545792013;-0.00024590402608737;-0.0011869899462909;0.00074077706085518;-0.0001185065775644;0.00016726848843973;-0.0001109810473281;0.00013880587357562;-3.8144535210449e-05;3.9705144445179e-05;0.00012296660861466;3.7229547160678e-05;-2.3377591787721e-05;2.41126272158e-05;3.0082217563177e-05;-4.2024489630421e-06;-0.00035633044899441;0.00020284602942411;-0.00025780673604459;0.0001909764832817;0.0011980768758804;-0.00061982980696484;0.0004224392469041;-2.998239142471e-05;0.00044025908573531;-9.745134775585e-06;-0.0017795716412365;0.00030803025583737;-0.00013006190420128;-0.0003088561934419;-0.000105223065475;0.00039784164982848;2.1480787836481e-05;0.00049282336840406;-0.00010650791227818;-0.00054176495177671;1.3278754522617e-06;0.0006972422124818;-0.00025438991724513;-0.00055510742822662;4.5775988837704e-05;0.00067587976809591;-6.6436965425964e-05;-3.8749909435865e-05;1.1961520613113e-05;-0.00014846178237349;7.0219603003352e-06;-0.00095995108131319;0.00018796816584654;-0.00081873178714886;-0.00026673995307647;-0.00046656240010634;0.00055597099708393;0.00028488642419688;0.00010848684905795;-0.00064002914587036;4.4893931772094e-05;-0.00078386248787865;-0.000335295451805;-0.00015889506903477;-0.00063192431116477;0.00051510211778805;0.00056093785678968;0.00029716789140366;0.00087395519949496;-0.00039908805047162;0.00015088426880538;-0.00025939795887098;0.0015225081006065;0.00028859724989161;-0.00024425185984001;-6.2968661950435e-05;0.000739598472137;6.4968815422617e-05;2.6773463105201e-05;6.6876140181193e-07;1.9610006347648e-05;0.00016693637007847;0.00019156756752636;-0.0004511519218795;0.0022511347196996;-0.00023232313105837;-0.00060575560200959;0.0003773421049118;1.2925761438964e-05;-0.00012730494199786;0.0002416400675429;-7.5764750363305e-05;-0.00060845696134493;-0.00014421570813283;-0.00010566870332696;0.00055971764959395;-0.00067973352270201;0.00015231463476084;-0.00032229052158073;-0.001579524949193;0.00086145574459806;-0.00018492780509405;0.00019978851196356;-0.00030310338479467;0.00018155761063099;-7.399580499623e-05;5.0850670959335e-05;0.0001519253855804;4.8008674639277e-05;-1.6616118955426e-05;1.6064494047896e-05;1.3341636076802e-05;1.2944878108101e-05;-0.00033862525015138;0.00012757562217303;-0.00018647559045348;0.00011055811773986;0.00078357610618696;-0.00038354215212166;0.00028056677547283;-2.2347425328917e-05;0.00023998477263376;-9.642153599998e-07;-0.0012235951144248;0.00018832902424037;-0.00010312627273379;-0.00020867244165856;-7.430918776663e-05;0.00032072115573101;8.200321417462e-07;0.00033658905886114;-5.2779072575504e-05;-0.00033201402402483;-5.0772555368894e-06;0.00058114359853789;-0.00015511142555624;-0.00036085196188651;2.9103670385666e-05;0.000467058212962;-4.4269680074649e-05;-1.926029290189e-05;3.2117395676323e-06;-0.00011053925118176;1.8667573385756e-05;-0.00054341874783859;9.2095004220027e-05;-0.00035644331364892;-0.00022431525576394;-0.00043539106263779;0.00044299114961177;0.00017446496349294;6.8371875386219e-05;-0.00041000009514391;1.7162383301184e-05;-0.00043901969911531;-0.00025730309425853;-9.3724229373038e-05;-0.0003243058163207;0.00034127378603444;0.00033903479925357;0.00015474793326575;0.0003911102830898;-0.00022131389414426;0.00012000950664515;-0.00016112542652991;0.00086141761858016;0.00023427308769897;-0.00015730019367766;-3.9853221096564e-05;0.00048062956193462;5.3852283599554e-05;1.8812434063875e-05;-1.92586776393e-06;2.9500290111173e-05;0.00011609477951424;0.00018041441217065;-0.0002640372258611;0.001438002451323;-0.0001519810030004;-0.00039370998274535;0.00023144154693;-7.4835215855273e-06;-8.0828460340854e-05;0.000180428600288;-5.3036605095258e-05;-0.00034230400342494;-8.5640022007283e-05;-6.9193592935335e-05;0.00042463661520742;-0.0003770319162868;6.7567103542387e-05;-0.00023169460473582;-0.0010873316787183;0.0005023866542615;-0.00013959559146315;0.0001211715862155;-0.00023489267914556;0.00011488121526781;-2.7582613256527e-05;3.5472359741107e-05;5.6109820434358e-05;3.134955841233e-05;3.0848630558467e-05;-2.4476017642883e-05;-2.4971557650133e-05;6.411770300474e-05;-0.0001054502572515;8.4491992311087e-05;-8.6424115579575e-05;0.00015047426859383;-0.00083902094047517;0.00085963495075703;-4.139191514696e-05;4.6987341193017e-05;-7.8191733337007e-05;0.0001305708574364;0.00046820277930237;-0.00051417876966298;-4.2577546992106e-05;-3.417796051508e-06;-2.1415105948108e-05;0.00018013484077528;-0.00012257564230822;6.1825907323509e-05;-8.7412277935073e-05;5.9898673498537e-05;-0.00011304000508972;-9.6409930847585e-05;8.0565943790134e-05;7.3854149377439e-05;-9.4255483418237e-05;-0.00014402055239771;0.00014762162754778;3.177681719535e-05;2.4371533072554e-05;-0.00019833783153445;-0.00013230509648565;-0.00032485681003891;-0.00024390053295065;0.00017577604739927;0.00018084976181854;-0.00027394434437156;-0.0003375262604095;-0.00011791530414484;-0.00011303393694106;-0.00029111886397004;-0.00023347079695668;0.00029042409732938;0.00034509800025262;3.1737119570607e-05;-0.00068775372346863;-0.00066738901659846;0.00026531671755947;0.00015385959704872;0.00066846358822659;0.00074760854477063;0.00045801978558302;0.0003611265856307;-0.00018838713003788;-0.00025893899146467;8.5235747974366e-05;8.8424872956239e-05;9.2114096332807e-05;6.8675748480018e-05;-1.1611372428888e-05;6.1712978549622e-07;7.0898975536693e-05;3.9338901842711e-05;0.00072566652670503;0.00057908543385565;0.00012167024397058;0.00019528254051693;-0.0002983559970744;-0.00038970104651526;8.2948303315789e-05;4.4295644329395e-05;6.0437210777309e-05;6.6294509451836e-05;0.00015179383626673;0.00019092363072559;2.1156065486139e-05;0.0007647299207747;0.0014985146699473;-0.00028687599115074;-0.00023162720026448;-0.0011947288876399;-0.0011476767249405;-0.00030947761842981;-0.00019656497170217;-0.00023680947197136;-0.00027902398142032;-2.7299506655254e-06;-1.0718849807745e-06;-1.0095754078066e-05;-1.7302643755102e-05;5.6068834965117e-05;-4.3086234654766e-05;-5.0161070248578e-05;0.000101283636468;-0.00012176376912976;0.00010632978955982;3.8355407014024e-05;0.00019645798602141;-0.0014600938884541;0.001466523273848;-8.7489002908114e-05;7.6238728070166e-05;-9.8536278528627e-05;0.00020330883853603;0.00081735756248236;-0.00084441323997453;-5.2408806368476e-05;7.089062819432e-06;-0.00012775018694811;0.00025067306705751;-0.00019777349370997;6.3016261265147e-05;-7.9501449363306e-05;0.00012682574742939;-0.00017642833699938;-0.00029500637901947;0.00016352192324121;0.00011949217878282;-0.00014893953630235;-0.00024273681628983;0.00023354623408522;4.3558775359998e-05;3.7595105823129e-05;-0.00030335548217408;-0.00020861356460955;-0.00037977262400091;-0.00024767967988737;0.00032777525484562;0.00037224750849418;-0.00038307197974063;-0.00068255519727245;-0.0001620483235456;-0.00017729063984007;-0.00045149933430366;-0.00039273386937566;0.00042559078428894;0.00062673364300281;8.3024337072857e-05;-0.00086580071365461;-0.00087297387653962;0.00033902630093507;0.00014272557746153;0.00079250539420173;0.00095139938639477;0.00067236548056826;0.00057038548402488;-0.00031676207436249;-0.00049395463429391;0.00012162221537437;0.00014634281978942;0.00016672184574418;0.00011849210568471;-2.2890877517057e-05;3.0353494366864e-06;0.00013264922017697;7.9072699008975e-05;0.0011704914504662;0.00096046930411831;0.00017854482575785;0.00043531294795685;-0.00042216619476676;-0.00064859742997214;0.00013381829194259;6.6539207182359e-05;0.00010381001629867;0.00015207030810416;0.00022544298553839;0.00029732717666775;3.015158836206e-05;0.0012960953172296;0.0023081924300641;-0.00048987125046551;-0.0004009302938357;-0.0019060249906033;-0.0018951088422909;-0.00051286304369569;-0.00033513977541588;-0.00035940817906521;-0.00050852837739512;-1.9502151360484e-07;-7.8807506724843e-06;-2.3446635168511e-05;-3.9971375372261e-05;5.8285200793762e-05;-4.2637300794013e-05;-5.7383749663131e-05;9.5755494839977e-05;-0.0001151168034994;0.00011391648149583;0.0001249252964044;0.00025124868261628;-0.0014674812555313;0.0014423774555326;-9.731667523738e-05;6.964398198761e-05;-8.1573278293945e-05;0.00020762064377777;0.00082991214003414;-0.00081440230133012;-3.7727248127339e-05;1.5425166566274e-05;-0.00021995615679771;0.00023413619783241;-0.00021306611597538;6.8937813921366e-05;-6.3137289544102e-05;0.00014506725710817;-0.00016264006262645;-0.00035502039827406;0.00011870821617777;0.00011714254651451;-0.00014622222806793;-0.00024563344777562;0.00022621170501225;3.98847660108e-05;3.8061196391936e-05;-0.00029364600777626;-0.0002055655058939;-0.00034984803642146;-0.00020684672927018;0.0003211542207282;0.00038765577482991;-0.00029072974575683;-0.00078070792369545;-0.00014393079618458;-0.00018093186372425;-0.00042947850306518;-0.0004060722712893;0.00036345518310554;0.00068093807203695;8.5825122368988e-05;-0.00080951274139807;-0.00081896741176024;0.00033366234856658;0.00010744295286713;0.00070627121021971;0.00090981816174462;0.00062830827664584;0.00057520938571543;-0.00028618460055441;-0.00052699336083606;0.00010799476149259;0.00015422099386342;0.00017538125393912;0.0001141317843576;-2.5240275135729e-05;6.5140347942361e-06;0.00013344830949791;8.012982289074e-05;0.0011346791870892;0.00095074268756434;0.00012838609109167;0.00051430211169645;-0.00037223065737635;-0.00067796785151586;0.00013367774954531;6.0911330365343e-05;9.1523543233052e-05;0.00017934232892003;0.00021060512517579;0.00029507628642023;2.5831073799054e-05;0.0012728098081425;0.0022369993384928;-0.00047785165952519;-0.00039500155253336;-0.001838956726715;-0.0018804096616805;-0.00050579657545313;-0.00033362570684403;-0.00031928488169797;-0.00055044394684955;3.4780075566232e-06;-1.3671519809577e-05;-2.2548982087756e-05;-4.542675378616e-05;4.2271462916688e-06;6.9535467446258e-06;-1.6140318621183e-05;-8.0897525549517e-06;-0.00025922726490535;0.00035204386222176;1.3634439710586e-05;0.00063222524477169;7.6625983638223e-05;-0.00026910976157524;-5.394442632678e-05;-6.2038881878834e-05;-2.8999835194554e-05;7.2705828642938e-05;-1.5567289665341e-05;0.00032421614741907;6.4526793721598e-05;0.00017022910469677;-0.00033295087632723;-4.0683800762054e-05;-0.00018379194079898;0.00036312313750386;-0.0004585987480823;0.00015584951324854;2.6194808015134e-05;1.4769781046198e-05;-0.00050420971820131;1.0591119462333e-05;5.5345866712742e-05;1.0005712283601e-05;-0.00011991539213341;-5.1946312851214e-06;8.8225342551596e-06;-6.4627885876689e-05;-7.0663292717654e-05;-7.2353701398242e-05;-0.00017501984257251;-0.00013332630624063;-0.0001591682957951;0.00039742168155499;-0.00049425620818511;7.4456678703427e-05;-2.6462390451343e-05;6.9692708848379e-07;-0.00022071308922023;-0.00024720290093683;0.00026902876561508;-5.2392601901374e-06;-0.00041334817069583;2.9931610697531e-05;0.00025637613725848;7.3187635280192e-05;1.9215794964111e-05;0.00049122469499707;-7.8087323345244e-05;0.00018875197565649;0.00020973132632207;2.8885020583402e-05;-5.128605698701e-05;3.9511054637842e-05;7.4336814577691e-05;5.5370688642142e-05;-1.2796894225175e-05;1.9553313904908e-05;5.2788418543059e-05;-2.866447539418e-05;-6.8171953898855e-05;0.00029041836387478;-0.00015026339679025;0.0010464395163581;0.00018319611262996;-0.00041429308475927;-1.3676597518497e-05;3.1676787330071e-05;-7.0277281338349e-05;0.00017262045003008;-7.654658111278e-05;-0.0001141927059507;7.9659048424219e-06;0.00037878678995185;1.2113557659177e-06;-0.00016454208525829;-3.8143276469782e-05;0.00010786185885081;-0.00088755541946739;3.7636633351212e-05;-6.7985325586051e-05;0.00012870090722572;-0.00043109993566759;1.7938862583833e-05;-0.00010276173998136;4.1862258512992e-05;0.00012231321306899;-2.4944467440946e-05;1.6363068425562e-05;-3.5096818464808e-06;-8.2467759057181e-06;-0.00016627747390885;0.00045368663268164;-0.00019545966642909;0.00013398064766079;0.00054489204194397;-0.0010760591831058;5.5275355407503e-05;-0.00027829394093715;-1.1437695320637e-05;-0.00032062703394331;-0.00029135157819837;0.0015820387052372;0.00010664567525964;0.00027785130077973;0.00022782248561271;1.0306431249774e-05;-0.00037168525159359;2.821248381224e-05;-0.00050890864804387;-2.9687565984204e-05;0.00031306664459407;0.00026969835744239;-0.00059742422308773;-5.0429905968485e-05;0.00041641149437055;8.1812409916893e-05;-0.00058372056810185;7.1774047682993e-06;-2.2818439902039e-05;-1.0918416592176e-05;-9.1716174210887e-05;0.0001534781040391;-0.00065484986407682;-0.00022301530407276;-0.00063770136330277;0.00047790669486858;-0.00041178773972206;0.00013057951582596;0.00021244349773042;4.130771412747e-05;-0.00039680124609731;-0.00031265988945961;-0.00066434813197702;-0.00014090155309532;-0.00064338743686676;0.00039616809226573;0.00034022005274892;0.00041079221409746;-0.00031083807698451;0.00081419543130323;-0.00027758357464336;5.0680533604464e-05;0.0002767764381133;0.0010737346019596;-7.1279799158219e-05;-0.00022112722217571;7.4972245784011e-05;0.0006313017802313;6.0106767705292e-06;1.9499544578139e-05;0.00015180908667389;-5.5070659072953e-06;-0.00050155777717009;0.00019079133926425;-0.00019513323786668;0.0023436003830284;0.00035374137223698;-0.00061540765454993;-0.00014904074487276;2.296180173289e-05;-0.00010842483607121;0.00023582339053974;-0.0001507996203145;-0.00061342847766355;-8.1925245467573e-05;0.00062388210790232;-0.00067893153754994;-0.00033435254590586;0.00014053532504477;0.00083564856322482;-0.0016880288021639;0.00027129764202982;-0.0001414894068148;0.0001968577853404;-0.00033071404322982;5.4463340347866e-05;-8.7294487457257e-05;6.313162157312e-05;0.00017198151908815;-2.3272308681044e-05;1.344403699477e-05;1.9835404145851e-06;-2.2773892851546e-06;-7.5656418630388e-05;0.0002839558001142;-0.0001794887939468;-7.4122632213403e-05;0.00047047898988239;-0.00090175698278472;6.6001040977426e-05;-0.00023619837884326;-3.3253766673624e-07;-0.00030576647259295;-0.00025731229106896;0.0013507991097867;7.0449663326144e-05;0.00018494520918466;0.00029804185032845;3.0726525437785e-05;-0.00027041469002143;-7.7976852480788e-05;-0.00030505214817822;-7.4989729910158e-05;0.00027497170958668;0.00023832826991566;-0.00038009134004824;-4.8704321670812e-05;0.00035980594111606;6.9815752794966e-05;-0.00050033407751471;1.004635123536e-05;-2.3155447706813e-05;8.6061236288515e-06;-6.3203100580722e-05;0.00014729700342286;-0.000571932294406;-0.00015511854144279;-0.00053434481378645;0.00030843156855553;-0.00020795957243536;9.1422494733706e-05;0.0002069622714771;3.712386751431e-05;-0.00028382078744471;-0.00020528631284833;-0.000741996394936;-0.0001344572956441;-0.0004911842988804;0.0003223950334359;0.00024337269132957;0.00037213184987195;-0.00026426222757436;0.00062894768780097;-0.00022006219660398;-1.5467301636818e-05;0.00018254031601828;0.0010010958649218;-4.7833906137384e-05;-0.00022772399825044;4.4572381739272e-05;0.00058286311104894;7.9277597251348e-06;1.2870868886239e-05;0.00012349782628007;2.5950751023629e-06;-0.00041340201278217;5.6931647122838e-05;-0.00013903556100558;0.0018020521383733;0.00026758501189761;-0.00044365171925165;-0.00012617066386156;2.2396397980629e-06;-8.0830475781113e-05;0.00013834578567185;-0.00011435697524576;-0.00052671483717859;-8.0049976531882e-05;0.00045428643352352;-0.0005838520010002;-0.00025547333643772;0.00014981620188337;0.00069510226603597;-0.0012647735420614;0.00022414913109969;-9.3326285423245e-05;0.00014355353778228;-0.00012840316048823;4.3599979107967e-05;-3.2716092391638e-05;4.7963916586014e-05;0.00011023948172806;-1.5996491129044e-05;2.2912099666428e-05;3.4271117328899e-05;-4.8827034333954e-05;0.00011489738972159;9.7078904218506e-05;0.00010202508565271;0.0002127006300725;0.0011403529206291;-0.00062401813920587;0.00039626695797779;-4.2619980376912e-05;0.00060554122319445;-3.6524928873405e-05;-0.0016101209912449;0.00031382316956297;-4.7345965867862e-05;-0.00022744716261514;-0.00027282180963084;0.00015225740207825;2.902201777033e-05;0.00026476089260541;4.6025568735786e-05;-0.0005927060265094;7.6477110269479e-05;0.00011637478019111;-0.00025675224605948;-0.00055278238141909;5.1370876462897e-05;0.00060670194216073;-5.489702016348e-05;-5.7399076467846e-05;2.6047480787383e-05;-9.4220027676784e-05;-3.3174485452037e-06;-0.0010313064558432;0.00026655168039724;-0.001119785476476;-0.00013232699711807;-3.9534388633911e-05;0.00027222724747844;0.00037050788523629;9.1222245828249e-05;-0.00053299317369238;5.7480348914396e-05;-0.001219104626216;-0.00018351897597313;-0.00018928683130071;-0.00069853645982221;0.00051988183986396;0.00060151191428304;0.00031437817960978;0.0010530010331422;-0.00048565631732345;-3.8794292777311e-05;-0.00025083223590627;0.0018773670308292;0.00014266374637373;-0.00033502030419186;-4.7252004151233e-05;0.00084015232278034;2.5892162739183e-05;1.8375696527073e-05;9.6422709248145e-06;1.1827186426672e-05;0.00014284205099102;-0.00014098525571171;-0.00047337784781121;0.0020200591534376;-0.00017783102521207;-0.00048839929513633;0.0003476329438854;-1.0184536449742e-06;-0.00012571352999657;7.0196947490331e-05;-5.1806433475576e-05;-0.00074946938548237;-0.00013921412755735;-0.00013350826338865;0.00031636378844269;-0.00080786988837644;0.00028143986128271;-0.00022558252385352;-0.001192415249534;0.00092376774409786;-9.9374177807476e-05;0.00019908786634915;9.3192364147399e-05;0.00014748843386769;-1.9939663616242e-05;3.9861213736003e-05;0.00016109134594444;4.3636220652843e-05;-1.6337469787686e-05;2.2530250134878e-05;3.8906749978196e-05;-3.9344628021354e-05;-4.0665916458238e-05;0.00015835744852666;-6.3291743572336e-05;0.00021142614423297;0.0012228261912242;-0.00065294420346618;0.00041684482130222;-3.3531749068061e-05;0.0005947514437139;-3.1938161555445e-05;-0.0017263687914237;0.00032403654768132;-8.1409605627414e-05;-0.00028335221577436;-0.00019488725229166;0.00024332304019481;4.002673085779e-05;0.000399112876039;-4.203082062304e-05;-0.00060606491751969;4.3446183553897e-05;0.00029981916304678;-0.00026344694197178;-0.00057649589143693;5.089377737022e-05;0.0006439772550948;-5.816831253469e-05;-5.6559656513855e-05;2.3998480173759e-05;-0.00011229661322432;-1.0460712474014e-05;-0.0010663366410881;0.00026214466197416;-0.0011566877365112;-0.00017672148533165;-0.00018417608225718;0.00038611996569671;0.00036025702138431;0.00010759324504761;-0.00061314250342548;5.92116957705e-05;-0.0011187347117811;-0.00024996307911351;-0.00018924263713416;-0.00075888360152021;0.00055767106823623;0.00061238132184371;0.0003556860901881;0.0011299330508336;-0.0005051473272033;2.1512272724067e-05;-0.00027437991229817;0.0018823524005711;0.00019904266810045;-0.00031236378708854;-5.8579920732882e-05;0.00084318674635142;4.258564877091e-05;2.2903510398464e-05;7.9949440987548e-06;1.4887880752212e-05;0.00014929981261957;-2.4286642656079e-05;-0.00050424679648131;0.0022564383689314;-0.0002068674803013;-0.00057702633785084;0.00039172454853542;8.2108244896517e-06;-0.00013080840290058;0.00015067814092617;-6.2797356804367e-05;-0.00074567546835169;-0.00015708763385192;-0.00013075843162369;0.00038153841160238;-0.00083837436977774;0.00025024835485965;-0.00024642774951644;-0.0013682264834642;0.00097357807680964;-0.00014295549772214;0.00021187124366406;-7.3862531280611e-05;0.00017250029486604;-4.9400830903323e-05;4.3895059206989e-05;0.00017251091776416;5.0521590310382e-05;2.5658562663011e-05;-2.0573914298438e-05;-6.7490277615434e-06;4.5535980461864e-05;-0.00012321492249612;5.9086680266773e-05;-2.9603914299514e-05;-1.1468771845102e-05;-0.0004988384898752;0.00055353954667225;-2.262261841679e-05;3.3548720239196e-05;-3.2474670206284e-06;3.6638408346334e-05;0.00022483842622023;-0.00031442168983631;-4.715131217381e-05;-2.9482720492524e-05;7.5814655247086e-06;0.00016204387065955;-7.7053446148057e-05;6.1944250774104e-05;-3.1310166377807e-05;1.2521369171736e-05;-6.9033099862281e-05;-4.4477685150923e-05;0.00011108456965303;2.9226881451905e-05;-4.6406265028054e-05;-8.9866167400032e-05;0.00010227292659692;1.4753281902813e-05;1.0201219993178e-05;-9.957468137145e-05;-5.617839997285e-05;-3.5157554520993e-05;-3.1715302611701e-05;0.00016025394143071;0.00011927216837648;-0.0002905614383053;-0.00016227072046604;-5.8779041864909e-05;-5.2209550631233e-05;-0.00020103483984713;-0.00014447949070018;0.0002132763620466;0.00016812984540593;2.2644930140814e-05;-0.00018294203619007;-0.00017777252651285;6.8948960688431e-05;2.8701579140034e-05;0.00013230757031124;0.00018696933693718;0.00024002375721466;0.00016736345423851;-0.00015040884318296;-0.00013676565140486;6.0830123402411e-05;5.1890943723265e-05;7.3701252404135e-05;6.0581336583709e-05;-3.0427349884121e-06;1.2058924312441e-06;6.8986424594186e-05;3.8481073715957e-05;0.00047037488548085;0.00032438090420328;0.00019408563093748;0.00014590790669899;-0.00018548028310761;-0.00019251431513112;4.1829222027445e-05;2.1496942281374e-05;0.00012834914377891;7.9893019574229e-05;9.9072924058419e-05;0.0001043495722115;-1.1777489817177e-05;0.00043384663877077;0.00072420173091814;-0.00017540740373079;-0.00012719639926217;-0.00068765803007409;-0.0005976150278002;-0.00024001798010431;-0.00013577852223534;-0.00023505465651397;-0.00018788567103911;-5.6233452596643e-06;-1.1588055031098e-06;-5.6102777307387e-05;-3.4148433769587e-05;3.9180082239909e-05;-3.0571478419006e-05;-2.5184051992255e-05;7.3951763624791e-05;-0.00014964367437642;9.6949035651051e-05;-4.7093271859922e-05;0.00010598277731333;-0.00090562249533832;0.00094506028108299;-4.1437004256295e-05;4.9470698286314e-05;-4.5036220399197e-05;0.00011120208364446;0.00046819329145364;-0.00054468086455017;-5.6998949730769e-05;-2.4933942768257e-05;-3.8095840864116e-05;0.00024235835007858;-0.0001514499890618;5.5682845413685e-05;-4.1104038245976e-05;4.4155454816064e-05;-0.00011225324851694;-0.00010883199138334;0.00010942456719931;6.6103333665524e-05;-9.2789996415377e-05;-0.00016049470286816;0.00016850722022355;3.1021521863295e-05;2.3532787963632e-05;-0.00019362311286386;-0.00012104531924706;-0.00023261760361493;-0.00017492749611847;0.00023019289074;0.00020629535720218;-0.00035488375579007;-0.00036680299672298;-0.00011586712207645;-0.00011478889791761;-0.00032565591391176;-0.00026042966055684;0.00032498070504516;0.00036428624298424;2.9592589271488e-05;-0.00056093756575137;-0.00057988479966298;0.0002231988182757;0.00011105400335509;0.00051966239698231;0.00062981975497678;0.00045735170715488;0.00035724675399251;-0.00022476936283056;-0.00027687815600075;9.6569703600835e-05;0.00010026488598669;0.00011320108023938;8.4840547060594e-05;-9.1780702859978e-06;3.1433382901014e-06;9.2181537183933e-05;5.2788043831242e-05;0.00077379791764542;0.00058187736431137;0.00018435672973283;0.00023483762925025;-0.00031082113855518;-0.00040219823131338;8.083362627076e-05;3.8755773857702e-05;0.00012580282054842;0.00010996525088558;0.00016809966473375;0.00020558081450872;4.6672192866026e-07;0.00076366018038243;0.0014712371630594;-0.00029243130120449;-0.00022946133685764;-0.0012121463660151;-0.0011225304333493;-0.00036348105641082;-0.00021858207765035;-0.00030377923394553;-0.00032582387211733;-3.765361952901e-06;-1.2485700153775e-06;-4.8218764277408e-05;-4.3718770029955e-05;5.8747904404299e-05;-4.3191852455493e-05;-5.4232888942352e-05;0.00010547183046583;-0.00016779033467174;0.00013149148435332;4.1346014768351e-05;0.00025159685174003;-0.0013933890732005;0.001391907222569;-6.3869629229885e-05;5.735987360822e-05;-6.090301394579e-05;0.00018849430489354;0.00075047241989523;-0.00078109506284818;-6.0232621763134e-05;-2.8210706659593e-05;-0.00017779106565285;0.00035351963015273;-0.00026782558416016;-8.636368875159e-06;4.6752800699323e-05;7.4658120865934e-05;-0.00013697748363484;-0.00023947760928422;7.6749158324674e-05;9.9502904049587e-05;-0.00013967188715469;-0.00024868993205018;0.00024391461920459;4.6730612666579e-05;3.8499449146912e-05;-0.00028061660123058;-0.00017888436559588;-0.00039327118429355;-0.00027468518237583;0.0003339676768519;0.00033003548742272;-0.00037104723742232;-0.00068836763966829;-0.00016607229190413;-0.00019084090308752;-0.00045166217023507;-0.0004081706283614;0.00040948172681965;0.00063817773479968;2.8850472517661e-05;-0.00086435320554301;-0.00099241838324815;0.00037086920929141;0.00015147580415942;0.0008282526396215;0.0010562923271209;0.00065825559431687;0.00056863896315917;-0.00030395635985769;-0.00047161389375106;0.00012970963143744;0.00016799800505396;0.00016832786786836;0.0001103967151721;-1.5853547665756e-05;9.9605886134668e-06;0.00012304798292462;7.4701063567773e-05;0.0010629651369527;0.00082421238766983;0.00012117670848966;0.00037796210381202;-0.00040798308327794;-0.00066373666049913;0.00011818247730844;4.5208307710709e-05;0.00013052934082225;0.00017987469618674;0.00024237523030024;0.00033067082404159;-9.1495250265083e-10;0.0010712188668549;0.0022291799541563;-0.00039847200969234;-0.00032886167173274;-0.001695002312772;-0.0016169390873984;-0.00050160102546215;-0.00030599388992414;-0.00035567372106016;-0.00052081636385992;3.7564782360278e-06;-2.4827158995322e-06;-5.5361844715662e-05;-7.6243362855166e-05;6.3323372160085e-05;-4.4252312363824e-05;-6.7476874392014e-05;0.00010143274994334;-0.00017906018183567;0.00017959499382414;0.00012445557513274;0.00038376441807486;-0.0014528608880937;0.0013975420733914;-7.8195378591772e-05;5.1985272875754e-05;-4.9431757361162e-05;0.00021041234140284;0.00080249010352418;-0.00076364260166883;-3.9259382901946e-05;-1.3433293133858e-05;-0.00030577802681364;0.00035049754660577;-0.00031291454797611;2.0096764274058e-05;2.973734990519e-05;0.00010393637057859;-0.00012900789442938;-0.00030971638625488;-1.270854681934e-05;0.00010255994857289;-0.00014495129289571;-0.00026483190595172;0.00024569232482463;4.6307646698551e-05;4.1678682464408e-05;-0.00028699330869131;-0.00018783591804095;-0.00041711083031259;-0.00027291435981169;0.00032555108191445;0.00034090908593498;-0.0002507799945306;-0.00085107749328017;-0.00015513358812314;-0.00020832984591834;-0.00044548025471158;-0.00045046972809359;0.00034425756894052;0.00074109138222411;2.5086497771554e-05;-0.00091224926291034;-0.0010223352583125;0.00041583416168578;0.00014149482012726;0.00082943664165214;0.0011389610590413;0.00064547051442787;0.0006135567673482;-0.00026700220769271;-0.00052346748998389;0.00011910140165128;0.00018937300774269;0.0001845938822953;0.00010847541852854;-1.9519244233379e-05;1.5240978427755e-05;0.00012226514809299;7.7868651715107e-05;0.0010708523914218;0.00085834262426943;5.3202413255349e-05;0.00050140230450779;-0.00036696816096082;-0.00074853096157312;0.00012735203199554;4.1252733353758e-05;0.00010952209413517;0.0002248953533126;0.00023439583310392;0.00035048712743446;-4.2282354115741e-06;0.0010841934708878;0.0022804781328887;-0.00039239571196958;-0.00033628169330768;-0.0017065382562578;-0.0016823813784868;-0.00051243073539808;-0.0003210379218217;-0.00031449759262614;-0.00060794968158007;6.9143602559052e-06;-1.075416457752e-05;-4.7282013838412e-05;-8.7870168499649e-05;4.9357404350303e-05;-3.3081614674302e-05;-5.6928394769784e-05;6.6173175582662e-05;-0.00017580977873877;0.00021726128761657;0.00013286464673001;0.0004224837757647;-0.001038083108142;0.00094633136177436;-6.9034533225931e-05;3.3764074032661e-05;-1.9269302356406e-05;0.00016145549307112;0.00058626534882933;-0.00049220235086977;-7.7046397564118e-06;1.1479136446724e-05;-0.00032629835186526;0.00025034585269168;-0.00027363933622837;9.4594863185193e-05;-6.4050465880428e-05;0.00010215049405815;-8.8421278633177e-05;-0.00025619601365179;-0.00011562623694772;7.1891779953148e-05;-0.00010384971392341;-0.00019976806652267;0.00017354452575091;3.1646028219257e-05;3.1482271879213e-05;-0.00020689077791758;-0.00013902214413974;-0.00030747320852242;-0.00019017154409084;0.00020665538613684;0.00022446627554018;-7.0808375312481e-05;-0.0007441183552146;-9.4943272415549e-05;-0.00015904333849903;-0.00031290191691369;-0.00036142522003502;0.0001771144598024;0.0006035435362719;9.2141153800185e-06;-0.00069838488707319;-0.00070196605520323;0.00034198557841592;9.9765886261594e-05;0.00056577794020995;0.0008698258898221;0.00043420339352451;0.00046622357331216;-0.00013876133016311;-0.00039206238579936;7.4893105193041e-05;0.00015335822536144;0.00014810930588283;7.9707941040397e-05;-1.5960289601935e-05;1.5965975762811e-05;8.5726242105011e-05;5.910852632951e-05;0.00076620618347079;0.00064617139287293;5.7583524721849e-06;0.00050692382501438;-0.00021854318038095;-0.00060604163445532;9.8444783361629e-05;2.7460457204143e-05;7.2807779361028e-05;0.00021658754849341;0.00015407349565066;0.00025994345196523;-1.2378603059915e-05;0.00076041760621592;0.0016046253731474;-0.00026297054137103;-0.00023725561914034;-0.0012022936716676;-0.0012443172745407;-0.00037814414827153;-0.00025118023040704;-0.00020187972404528;-0.00052866229088977;4.586256636685e-06;-1.8990609532921e-05;-2.9552484193118e-05;-7.6636919402517e-05;3.374891821295e-05;-2.2371285012923e-05;-4.0285834984388e-05;3.8162419514265e-05;-0.00014133407967165;0.00019774756219704;0.00010692019714043;0.00034718398819678;-0.00065767299383879;0.0005681500188075;-5.2639876230387e-05;2.0829813365708e-05;-3.4198451430711e-06;0.00010595410276437;0.00037872811662965;-0.00027616813895293;7.978075700521e-06;2.5174551410601e-05;-0.00025986379478127;0.00015327458095271;-0.00020264989871066;0.00011351620923961;-0.0001081876034732;8.345530659426e-05;-5.7108132750727e-05;-0.00018272592569701;-0.00013139919610694;4.4955315388506e-05;-6.4557701989543e-05;-0.00013214998762123;0.00010675508383429;1.8584923964227e-05;2.0529338144115e-05;-0.00013160642993171;-9.1572968813125e-05;-0.00018929739599116;-0.00010668130562408;0.00011352438741596;0.0001342918840237;1.5195917512756e-05;-0.00055312312906608;-4.889407864539e-05;-0.00010389226372354;-0.00019696749222931;-0.00025239589740522;7.3006427555811e-05;0.00042156697600149;3.448415782259e-06;-0.00045554898679256;-0.00040087700472213;0.00023601211432833;5.9157751820749e-05;0.00032283790642396;0.00055640988284722;0.00025582365924492;0.00030749017605558;-5.662066541845e-05;-0.00025736025418155;4.1304192563985e-05;0.00010579411173239;0.0001045453682309;5.5314441851806e-05;-1.1195200386283e-05;1.2556958608911e-05;5.5421111028409e-05;4.1565268475097e-05;0.00049033539835364;0.00044134352356195;-3.1441152259504e-06;0.00042585015762597;-0.00011303729115753;-0.00042427962762304;6.6251290263608e-05;1.7954665963771e-05;4.5820030209143e-05;0.00017427433340345;8.7715554400347e-05;0.00016595945635345;-1.2938335203216e-05;0.00049008725909516;0.00098977307789028;-0.00016339488502126;-0.00015427358448505;-0.00075760076288134;-0.00083379173884168;-0.00024742766981944;-0.00017825583927333;-0.00011994946544291;-0.000395605515223;2.0328193386376e-06;-1.9852646801155e-05;-1.5760135283927e-05;-5.6434131693095e-05;-2.6679432266974e-05;1.1110669220216e-05;5.3832180128666e-05;-1.2134745702497e-05;-9.4211238319986e-05;9.5022449386306e-05;-0.00023655510449316;-0.00018601882038638;0.00061508768703789;-0.0011656043352559;6.9041911046952e-05;-0.0002993504749611;2.0811065041926e-05;-0.0005286704399623;-0.00032899130019359;0.0016450501279905;4.4722251914209e-05;0.00026593825896271;0.00039875521906652;-1.8885293684434e-05;-0.00020612419757526;-8.3239341620356e-05;-0.00040268691373058;-0.000109703054477;0.00040639488724992;0.00029770581750199;-0.00011642917525023;-6.1658167396672e-05;0.00047925021499395;7.7213764598127e-05;-0.0006029944634065;2.3180784410215e-05;-4.2846742871916e-05;-3.5785989894066e-05;-5.0358325097477e-05;0.00027242928626947;-0.00081796472659335;-0.00013506034156308;-0.0011625378392637;0.00030216717277654;-6.2994593463372e-05;0.00014179760182742;0.00030010024784133;6.9877321948297e-05;-0.00037671654717997;-0.00022528499539476;-0.001128010218963;-0.00019152046297677;-0.00087169941980392;0.0004889223491773;0.0004571377648972;0.00048518576659262;-0.00047978071961552;0.0012471020454541;-0.00033118051942438;-8.6493309936486e-05;0.00018020525749307;0.0015727714635432;-7.0670459535904e-05;-0.00031482180929743;4.5936314563733e-05;0.00079691363498569;1.952278034878e-05;1.1890498171852e-05;0.00014186411863193;-2.3693006369285e-05;-0.00063043518457562;-2.9123106287443e-05;-0.00017683795886114;0.0026004174724221;0.00039607915095985;-0.00062193948542699;-0.00017776427557692;4.0765593439573e-05;-0.00010054462472908;0.00012314191553742;-0.0001736713165883;-0.00089599972125143;-0.00010998545621987;0.00048554645036347;-0.0009550719987601;-0.00028244391432963;0.00026288701337762;0.0010733085218817;-0.0016357462154701;0.00032929013832472;-0.00010978066711687;0.00019530749705154;-4.627636008081e-05;5.2619358029915e-05;-7.9264762462117e-05;6.8504828959703e-05;0.0002474327920936;-2.6825486202142e-05;1.0257394933433e-05;6.6643493482843e-05;-9.059785043064e-06;-2.0172648873995e-05;-8.781770884525e-05;-0.00022790099319536;-0.00038419387419708;0.00056979019427672;-0.0010573713807389;7.7551347203553e-05;-0.00028750064666383;3.0359675292857e-05;-0.00055680627701804;-0.00030816125217825;0.0015152948908508;1.1277363228146e-05;0.00020265238708816;0.0004694064555224;-1.3318813216756e-05;-0.00011056583753088;-0.0001739427971188;-0.00023714684357401;-0.00014918563829269;0.00041064235847443;0.00027721709921025;0.00010186073632212;-6.1300546803977e-05;0.00046556993038394;6.9545465521514e-05;-0.00056679814588279;2.5312778234365e-05;-4.4043619709555e-05;-2.8766651666956e-05;-3.4008942748187e-05;0.00027723156381398;-0.00076051620999351;-9.7370590083301e-05;-0.0011336174793541;0.00019818605505861;7.1986396505963e-05;0.00012232176959515;0.00030775275081396;6.7308326833881e-05;-0.00030635509756394;-0.000160949974088;-0.0012103718472645;-0.00018612618441693;-0.00079338951036334;0.00046488977386616;0.00041000585770234;0.00045738060725853;-0.00046817667316645;0.001152366050519;-0.00030294750467874;-0.00013846746878698;0.00012584304204211;0.0015584344509989;-5.7583623856772e-05;-0.00033276190515608;2.7752219466493e-05;0.00078868179116398;2.2020480173524e-05;5.3808512348041e-06;0.00013301181024872;-2.6941861506202e-05;-0.00059151247842237;-0.00012418116966728;-0.00014570500934497;0.0023441845551133;0.00034615278127603;-0.00052060163579881;-0.00017190178914461;4.2206382204313e-05;-8.4194667579141e-05;3.7729601899628e-05;-0.00015000210260041;-0.00091352418530732;-0.00010768730862765;0.00041527484427206;-0.0009216673206538;-0.00025964831002057;0.00028169044526294;0.001019329414703;-0.0014482783153653;0.00031190921436064;-7.9241486673709e-05;0.00016184874402825;0.00012746261199936;4.804117634194e-05;-5.6608056183904e-05;5.7902583648684e-05;0.00024755028425716;-1.0025110896095e-05;1.3893131836085e-05;1.1884330888279e-05;-9.8794916993938e-05;0.00084408157272264;-0.00011570726201171;0.00064437044784427;0.0001219900950673;0.00053120526717976;-0.00030649563996121;0.00022516508761328;-3.7677691580029e-05;0.00052363937720656;-5.3972249588696e-05;-0.00068939669290558;0.00015124355559237;0.00011188400821993;-9.2397040134529e-06;-0.00040857735439204;-0.0003069385420531;3.41249142366e-05;-0.0002239556342829;0.00027158233569935;-0.0004108851426281;0.00014698506856803;-0.00083775300299749;-0.0001172658012365;-0.00031810809741728;3.0713312298758e-05;0.00029248956707306;-1.0459303666721e-05;-3.7037123547634e-05;2.164897887269e-05;-1.6786882042652e-05;-2.2171512682689e-05;-0.00036675334558822;0.0001878306211438;-0.00076255790190771;-4.1027278712136e-06;0.00032258397550322;-6.4508370996919e-05;0.00028472641133703;3.8079077057773e-05;-7.1760630817153e-05;1.585121935932e-05;-0.0011693360283971;1.256225459656e-05;-9.3802955234423e-05;-0.00034805128234439;0.00034648212022148;0.00023931490432005;0.00018085404008161;0.00051821564557031;-0.00033663166686893;-0.00023927794245537;-0.00011478421947686;0.0012142502237111;-4.4412649913284e-06;-0.00032505701528862;-6.7820851654687e-06;0.00060984183801338;-8.3983732110937e-06;-5.9882640925935e-06;1.5918973076623e-05;-7.2180264396593e-06;6.7956636485178e-05;-0.00044813283602707;-0.00026593465008773;0.00089793954975903;-4.8688136303099e-05;-0.00011679762974381;0.00013598505756818;-5.5805826377764e-06;-7.5392199505586e-05;-0.0002946691820398;-7.4384925028426e-06;-0.00071900087641552;-5.1316372264409e-05;-9.1423462436069e-05;3.3020129194483e-05;-0.00053231243509799;0.00027721415972337;-8.4972081822343e-05;-0.00042305776150897;0.00055671209702268;5.055553992861e-05;0.00011395932961022;0.00074866891372949;3.395318708499e-05;7.9789751907811e-05;1.4826547158009e-05;0.00013509512064047;1.6328014680767e-05;-9.4503511718358e-06;1.8779264792101e-05;3.1722745916341e-05;-8.9075940195471e-05;0.00056942168157548;-3.8102614325908e-06;0.00041310754022561;0.00019002525368705;0.0009547554072924;-0.00053200771799311;0.00034244579728693;-4.1644110751804e-05;0.00068597850622609;-5.6360200687777e-05;-0.0012831226922572;0.00026397217880003;3.6336194170872e-05;-0.00014561673742719;-0.00037675927160308;-9.9750599474646e-05;4.7663692384958e-05;4.5953238441143e-05;0.00016435117868241;-0.00058137893211097;0.00012455333489925;-0.00046673725591972;-0.00020980456611142;-0.00049738475354388;4.7076140617719e-05;0.00049061799654737;-3.3856798836496e-05;-6.1154423747212e-05;3.0768067517783e-05;-4.7757101128809e-05;-2.2345997422235e-05;-0.00082347530405968;0.00027991060051136;-0.0011853183386847;-5.7716002629604e-05;0.00020511834009085;9.2477843281813e-05;0.00038991149631329;7.6897427788936e-05;-0.00036154655390419;4.7550915041938e-05;-0.0013842821354046;-8.6216008639894e-05;-0.0001693006925052;-0.00064404756994918;0.00051261723274365;0.0004869990516454;0.00030870304908603;0.00099032570142299;-0.00050518062198535;-0.00019005133071914;-0.00021738788927905;0.0018426583847031;6.2498897023033e-05;-0.00037533399881795;-3.2626245229039e-05;0.00083041557809338;6.8875701799698e-06;6.1948185248184e-06;1.676657666394e-05;4.4901098590344e-06;0.00011088266182924;-0.00035123640554957;-0.00044117963989265;0.0017012896714732;-0.00012352899648249;-0.00035730918170884;0.00028912434936501;3.5740472412726e-06;-0.00011421903764131;-0.00010617673979141;-3.1108509574551e-05;-0.00084749178495258;-0.00011764720693463;-0.00013321745791472;0.00014320616901387;-0.00081581686390564;0.00033190657268278;-0.00014639910659753;-0.00086682010442019;0.00087898905621842;-3.9293670852203e-05;0.00018235643801745;0.00045313904411159;0.00010564969852567;2.2525540771312e-05;2.8861531973234e-05;0.00017607388144825;3.6414530768525e-05;-8.2846454461105e-06;1.6990048607113e-05;3.0960585718276e-05;-6.2832710682414e-05;0.00026635362883098;7.4755160312634e-05;0.0001627495221328;0.00018308302969672;0.00099504180252552;-0.00054072507191449;0.0003348226309754;-3.1475934520131e-05;0.00059675937518477;-4.4369444367476e-05;-0.0013486461248249;0.00026660872390494;-1.5556239304715e-05;-0.00019883972709067;-0.00025898011517711;5.11832513439e-05;4.3810690840473e-05;0.0002162180171581;4.7311223170254e-05;-0.0005323295481503;7.6564101618715e-05;-0.00013369930093177;-0.00021369010210037;-0.00048208862426691;4.4498607167043e-05;0.00050231290515512;-3.8505739212269e-05;-5.7017801736947e-05;2.7294669052935e-05;-6.2952771259006e-05;-2.019779276452e-05;-0.00085996219422668;0.00025792664382607;-0.001136772101745;-9.0703353635035e-05;5.1169961807318e-05;0.00019388399960008;0.00035142846172675;8.4650142525788e-05;-0.00043543273932301;5.0334056140855e-05;-0.0011841005180031;-0.00014210188237485;-0.00016832089750096;-0.00066664919722825;0.0004970453446731;0.00049918494187295;0.00032014181488194;0.0010184255661443;-0.00048135861288756;-0.00010369905794505;-0.00022664578864351;0.0017463101539761;0.00010616436338751;-0.00031946881790645;-4.1224899177905e-05;0.00077226251596585;2.0385798052303e-05;1.377873650199e-05;1.2649456948566e-05;1.0745379768196e-05;0.00010897928586928;-0.00020497682271525;-0.00043969281250611;0.0018005140591413;-0.00014387392729986;-0.00042704716906883;0.0003171504358761;4.8983889655574e-07;-0.00010903731890721;1.4442278370552e-05;-4.0166949474951e-05;-0.00073604710632935;-0.00013107602717355;-0.00012574810534716;0.00018200278282166;-0.00078704388579354;0.00027904738090001;-0.00014730087423231;-0.00094931590138003;0.00086089759133756;-7.9116893175524e-05;0.0001789485104382;0.00019612436881289;0.00012645852984861;-5.4374399951485e-06;3.0405790312216e-05;0.00015124290075619;4.2003961425507e-05;2.1091211237945e-05;-1.688032898528e-05;-1.4344411738421e-06;3.5382603527978e-05;-0.00010993670730386;4.5292577851797e-05;-1.7476011635154e-05;-3.9199625462061e-05;-0.00036490158527158;0.00041923587559722;-1.6748987036408e-05;2.6514338969719e-05;1.0991701856256e-05;1.3604592822958e-05;0.00014937297964934;-0.0002350199065404;-4.1936043999158e-05;-2.990703251271e-05;1.2522733413789e-05;0.00013467445387505;-5.5914490076248e-05;5.7344823289895e-05;-2.0140587366768e-05;2.0269080778235e-06;-5.1035287469858e-05;-2.850397140719e-05;0.00010261936404277;1.7907572328113e-05;-3.1182418751996e-05;-6.8782232119702e-05;8.0417950812262e-05;9.577756827639e-06;6.2978424466564e-06;-6.7553832195699e-05;-3.4468655940145e-05;2.0275456336094e-05;9.7887159427046e-06;0.00013403224875219;9.1897294623777e-05;-0.00025216347421519;-0.0001066115728463;-4.0247348806588e-05;-3.4066466469085e-05;-0.00015561314648949;-0.00010712190123741;0.00016806699568406;0.00011157874541823;1.7445148841944e-05;-6.8273606302682e-05;-6.302421388682e-05;2.5177412680932e-05;3.1755230338604e-06;1.7952705093194e-05;5.9001387853641e-05;0.00016680659609847;0.00010878228931688;-0.0001210975824506;-9.5240313385148e-05;4.8415513447253e-05;3.7884372432018e-05;5.9239559050184e-05;5.0086538976757e-05;-1.2237373994139e-06;1.0269325230183e-06;5.9723108279286e-05;3.2488791475771e-05;0.00036168564110994;0.00023604714078829;0.00017821870278567;0.00011586225446081;-0.00013893813593313;-0.00012885135947727;2.8863327315776e-05;1.5245386748575e-05;0.00012373369827401;7.0474517997354e-05;7.7699289249722e-05;7.3837720265146e-05;-1.6021862393245e-05;0.00031426723580807;0.00048434574273415;-0.00013218697858974;-8.9908884547185e-05;-0.00050046166870743;-0.00041956632048823;-0.00019568110292312;-0.00010688829934224;-0.00020278528972995;-0.00014428357826546;-5.1679603529919e-06;-1.2334112398094e-06;-5.8433106460143e-05;-3.1887797376839e-05;4.8539448471274e-05;-3.3705302485032e-05;-5.1603121391963e-05;8.8022236013785e-05;-0.00012568892270792;8.4949089796282e-05;9.0020133939106e-05;0.00021589630341623;-0.001069026067853;0.0010492207948118;-2.0327539459686e-05;1.9367616914678e-05;-1.1205692317162e-05;0.00013797091378365;0.00055001769214869;-0.00055699475342408;-5.1349041314097e-05;-6.6097301896662e-05;-0.00020275806309655;0.0003863487218041;-0.00028888488304801;-0.00019775042892434;0.00029474750044756;-5.3260923777998e-06;-5.4310152336257e-05;-0.00016086394316517;-2.3024620531942e-05;5.7623434258858e-05;-9.9652344943024e-05;-0.00020406622206792;0.00019991060253233;4.0930706745712e-05;3.2010721042752e-05;-0.00018558021110948;-0.0001017758550006;-0.00031746353488415;-0.00022308024927042;0.0002860709792003;0.00025246557197534;-0.00025049585383385;-0.00057380768703297;-0.00013680921983905;-0.00016820173186716;-0.00034252606565133;-0.00033167735091411;0.00030332038295455;0.00053720257710665;-4.436979725142e-05;-0.00061564624775201;-0.00096701271831989;0.00031084197689779;0.0001094975596061;0.00068455311702564;0.00092224654508755;0.00049492000835016;0.00044310360681266;-0.00024220428895205;-0.00038154676440172;0.00010874767758651;0.0001578557130415;0.00012759909441229;7.0831381890457e-05;-4.8427300498588e-06;1.529910514364e-05;8.5814317571931e-05;5.7719149481272e-05;0.00067780492827296;0.00046980334445834;-2.52997433563e-05;0.00018867178005166;-0.00029930844902992;-0.00054177036508918;6.9828238338232e-05;5.8773562159331e-06;0.00010824333730852;0.00016102638619486;0.0002114294184139;0.00030630725086667;-2.7377996957512e-05;0.00061724131228402;0.0016975916223601;-0.00022368955251295;-0.00019682828860823;-0.0010669716866687;-0.00093222304712981;-0.00035849332925864;-0.00019434309797361;-0.00024223841319326;-0.00040549458935857;1.1400320545363e-05;8.5277742982726e-06;-7.12245964678e-05;-0.00010247981117573;5.5486700148322e-05;-3.7808495108038e-05;-6.3746745581739e-05;8.9392975496594e-05;-0.00015513424295932;0.00015197086031549;0.00014211692905519;0.00033513619564474;-0.0011797597398981;0.0011174828978255;-3.6051365896128e-05;2.2269658074947e-05;-4.5180408960732e-06;0.00016164177213795;0.00062521698419005;-0.0005785328685306;-3.7197649362497e-05;-5.4052583436714e-05;-0.00030019829864614;0.00039992842357606;-0.00033857498783618;-0.00014722468040418;0.00024327027495019;2.3656393750571e-05;-6.2743391026743e-05;-0.00022189518494997;-8.8901077106129e-05;6.4715837652329e-05;-0.00011109586193925;-0.00022965743846726;0.00021480674331542;4.2754189053085e-05;3.584239675547e-05;-0.00020523097191472;-0.00011908580199815;-0.00035013683373109;-0.00022793968673795;0.00029210490174592;0.00027177290758118;-0.00018577461014502;-0.00073126889765263;-0.0001361635804642;-0.00018842672579922;-0.00036551849916577;-0.00038617436075583;0.00027746552950703;0.0006419843994081;-4.4342221372062e-05;-0.00069672300014645;-0.0010076999897137;0.00036203788476996;0.00011301383347018;0.00071411358658224;0.0010186320869252;0.00051886617438868;0.000501875707414;-0.0002266022056574;-0.00043792658834718;0.00010832308180397;0.00018212299619336;0.0001500035286881;7.8100791142788e-05;-8.3010563685093e-06;1.9403632904869e-05;9.1677560703829e-05;6.6667817009147e-05;0.00075702060712501;0.00055286847054958;-4.5045511797071e-05;0.00031652796315029;-0.00029226025799289;-0.00063791440334171;8.581828296883e-05;7.3738510764088e-06;0.00010646151349647;0.00021255809406284;0.00021533499239013;0.00033714892924763;-3.1937699532136e-05;0.00068997719790787;0.0018382475245744;-0.00024022716388572;-0.00022316446120385;-0.0011874763295054;-0.0010744641767815;-0.00040087784873322;-0.00023127376334742;-0.00024284468963742;-0.00050762481987476;1.098260145227e-05;7.8830777283656e-07;-6.6937689553015e-05;-0.00011850745067932;4.6620774810435e-05;-3.1985826353775e-05;-5.3940406360198e-05;6.1362123233266e-05;-0.00016491347923875;0.00021671298600268;0.00013754490646534;0.00037489007809199;-0.0009266110137105;0.00083404162432998;-5.2408089686651e-05;2.5549303245498e-05;3.0916510240786e-06;0.00013194863277022;0.00051274022553116;-0.0004136688366998;-6.332936209219e-06;-4.8084018544614e-07;-0.00030037487158552;0.00026540062390268;-0.00028336571995169;3.2128478778759e-05;4.6825724098198e-07;6.7752334871329e-05;-6.6648935899138e-05;-0.00022335037647281;-0.00012880789290648;5.5458385759266e-05;-8.8186265202239e-05;-0.00018630344129633;0.00016166857676581;2.8927241146448e-05;2.8057542294846e-05;-0.00016860652249306;-0.00010886258678511;-0.00025400091544725;-0.00014296053268481;0.00019197721849196;0.00020691668032669;-5.8706402342068e-05;-0.00069058156805113;-8.5061787103768e-05;-0.00014555963571183;-0.00028337541152723;-0.00033067577169277;0.00015618751058355;0.00055061094462872;-1.4884175470797e-05;-0.00056694739032537;-0.00063886132556945;0.00029794528381899;7.8031698649283e-05;0.00047350060776807;0.00074975797906518;0.00037531481939368;0.00040708848973736;-0.00012477461132221;-0.00035583006683737;7.1967697294895e-05;0.00014747378008906;0.0001344368502032;7.1494330768473e-05;-1.0582972208795e-05;1.6577690985287e-05;7.4983479862567e-05;5.8930359955411e-05;0.00064464402385056;0.00053304724860936;-8.3810109572369e-06;0.00043748333700933;-0.00019005601643585;-0.00054635741980746;8.1112157204188e-05;1.5727282516309e-05;8.2364822446834e-05;0.00022016455477569;0.0001446284877602;0.00025097376783378;-2.6199893909506e-05;0.00060119072441012;0.0013877322198823;-0.00020117666281294;-0.00019365338084754;-0.00099190487526357;-0.00099467788822949;-0.00033688900293782;-0.0002259289030917;-0.00018745622946881;-0.00049032195238397;4.0638233258505e-06;-1.4452724826697e-05;-4.0166352846427e-05;-9.5418654382229e-05;3.2965308491839e-05;-2.3316024453379e-05;-3.7779191188747e-05;3.5121265682392e-05;-0.00013334401592147;0.00020913664775435;0.00011637984425761;0.00029764100327156;-0.00060143088921905;0.00051002640975639;-4.5800974476151e-05;1.9765862816712e-05;1.3518790183298e-05;8.0911740951706e-05;0.00034061254700646;-0.00022786276531406;1.0960632607748e-05;2.5613631805754e-05;-0.00023056482314132;0.00015278362843674;-0.00020817441691179;8.6703919805586e-05;-9.6570038294885e-05;6.636866601184e-05;-4.9877507990459e-05;-0.00017502649279777;-0.00012384456931613;3.5328666854184e-05;-5.3742471209262e-05;-0.00012592434359249;9.9419929028954e-05;1.5416622773046e-05;1.7678505173535e-05;-0.00010611899779178;-7.3997383879032e-05;-0.00012995369615965;-4.6825723984512e-05;0.00010450604895595;0.00013863742060494;1.6099576896522e-05;-0.00053209811449051;-3.9213511627167e-05;-9.1143876488786e-05;-0.00018297268252354;-0.00023381689970847;6.2034407164901e-05;0.00038656088872813;-3.712243596965e-06;-0.00033469119807705;-0.00030048831831664;0.00018936526612379;3.3153984986711e-05;0.00021608932001982;0.00041347843944095;0.00021292752353474;0.00026327435625717;-4.8700512707001e-05;-0.00024054205277935;3.9563015889144e-05;9.984533971874e-05;9.9443466751836e-05;5.6201079132734e-05;-7.8473403846147e-06;1.203777264891e-05;5.2500701713143e-05;4.6593031584052e-05;0.00043014291441068;0.00039521479629911;1.2122278349125e-05;0.00040870020166039;-9.4972194347065e-05;-0.00038186355959624;5.6358509027632e-05;1.3479550943885e-05;6.0536058299476e-05;0.0001879529299913;7.9143173934426e-05;0.00015583503409289;-2.2830568923382e-05;0.00041304365731776;0.00083151354920119;-0.00013307303015608;-0.00013559604121838;-0.00064420473063365;-0.00070729176513851;-0.00022922620701138;-0.00017719632887747;-0.00012356511433609;-0.00038314808625728;1.8260566037043e-07;-1.8325841665501e-05;-2.3747517843731e-05;-7.2468428697903e-05;1.9955183233833e-05;-1.4082828784012e-05;-2.3457401766791e-05;2.0542531274259e-05;-8.5780549852643e-05;0.00013524180394597;7.0862544816919e-05;0.00019264829461463;-0.00035499400109984;0.00029533330234699;-2.8451297112042e-05;1.1432829523983e-05;8.5542342276312e-06;4.8985435569193e-05;0.00020204902102705;-0.0001282465091208;8.5984956967877e-06;1.772164250724e-05;-0.00014648633077741;9.1035486548208e-05;-0.00012924784095958;6.1399390688166e-05;-6.9280511524994e-05;4.2896204831777e-05;-3.0215678634704e-05;-0.00010488213592907;-8.4264131146483e-05;2.0833282178501e-05;-3.1366722396342e-05;-7.5002295488957e-05;5.7668574299896e-05;9.1751089712488e-06;1.0418135389045e-05;-6.3746272644494e-05;-4.4489592255559e-05;-7.7436954597943e-05;-2.8912065317854e-05;5.976890315651e-05;7.3346636781935e-05;1.8379232642474e-05;-0.00032570032635704;-2.1556530555245e-05;-5.4226686188485e-05;-0.00010801840107888;-0.00014351226855069;3.1107956601772e-05;0.00023464918194804;-3.2370123790315e-06;-0.0002072031784337;-0.00017508192104287;0.00011825971159851;2.0659164874814e-05;0.00012550292012747;0.00025706802261993;0.00012356680235825;0.0001582558179507;-2.4556204152759e-05;-0.00014013423060533;2.2318165065371e-05;6.0507696616696e-05;6.0471887991298e-05;3.4356296964688e-05;-4.7188809730869e-06;7.6294209065964e-06;3.0426723242272e-05;2.763582051557e-05;0.0002541622670833;0.00023675597913098;5.7206302699342e-06;0.00026105382130481;-5.1730996347032e-05;-0.00023484932899009;3.4023276384687e-05;8.1212392615271e-06;3.5186054446967e-05;0.0001165579087683;4.4659609557129e-05;9.122489427682e-05;-1.4274206478149e-05;0.00024264378589578;0.00048826332204044;-7.6457341492642e-05;-7.9943172750063e-05;-0.00037982754292898;-0.00042289221892133;-0.00013633417256642;-0.00010693186777644;-7.1184535045177e-05;-0.00023669889196754;-1.2418901462752e-07;-1.2556492947624e-05;-1.291952230531e-05;-4.2621406464605e-05;-2.3055212295731e-05;4.2295482671761e-06;0.00011384375102352;3.3305570923403e-06;3.5983997804578e-05;-0.0003956722212024;-0.0002276997838635;-0.00061915285186842;0.00054320768686011;-0.0010039724875242;7.228902541101e-05;-0.00026790858828463;5.4100153647596e-05;-0.00063448859145865;-0.00028802308952436;0.0013834979617968;-5.3925199608784e-05;0.00018782088591252;0.0005627425853163;-4.2644423956517e-05;4.9214882892556e-05;-0.00024061115982477;-0.00015340212848969;-0.00019166537094861;0.00040820785216056;0.00025611964520067;0.00054721813648939;-5.9284349845257e-05;0.00045093000517227;5.2033752581337e-05;-0.00052326504373923;3.1566753023071e-05;-4.9345933803124e-05;-5.364082971937e-05;1.3984928273203e-06;0.00031404229230247;-0.00065903848735616;-5.4072166676633e-05;-0.0013572738971561;9.3883318186272e-05;0.00026448757853359;0.00012586983211804;0.00033544067991897;6.5176020143554e-05;-0.00020352604042273;-0.00010955939796986;-0.0014325701631606;-0.00019064176012762;-0.00085362611571327;0.00052005116594955;0.00047133670886979;0.00039632979314774;-0.00054554978851229;0.0012689057039097;-0.00030818674713373;-0.00025090447161347;8.2735990872607e-05;0.0016734878299758;-5.2279767260188e-05;-0.00038041503285058;1.6718489860068e-05;0.00083919998724014;3.1209860026138e-05;-2.951512897198e-06;0.00010439021571074;-3.8526581192855e-05;-0.00062698352849111;-0.0002655265852809;-0.00011772116704378;0.002328030532226;0.00034579634666443;-0.00047803169582039;-0.00017467424913775;5.2412731747609e-05;-7.2605165769346e-05;-9.462619345868e-05;-0.00015353017079178;-0.0010767342755571;-0.00011108032776974;0.00027295493055135;-0.0010379700688645;-0.00018767720030155;0.00032921848469414;0.0010944847017527;-0.0012931225355715;0.00032513352925889;-4.9913884140551e-05;0.00014468035078607;0.00040501041803509;4.0954007999972e-05;-2.7478750780574e-05;5.9916288591921e-05;0.00027496158145368;-2.5875291612465e-05;3.8826187847008e-06;0.00016406548093073;6.6825959947892e-06;0.0001545045961393;-0.00081818830221891;-0.00023786106612533;-0.0010274442611262;0.00053359259618446;-0.00095719401724637;8.6872183601372e-05;-0.00029180126148276;7.8550321632065e-05;-0.0007917265756987;-0.00028391322121024;0.0013369405642152;-0.00012629522825591;0.00012871810758952;0.0007389698876068;-6.2905615777709e-05;0.00024681913782842;-0.0004025261150673;8.0077959864866e-05;-0.00027384044369683;0.00048864161362872;0.00024715202744119;0.0010606367141008;-6.3693885749672e-05;0.0004981048987247;4.2921725253109e-05;-0.00053386768558994;3.8201735151233e-05;-5.692700506188e-05;-6.7870692873839e-05;2.5571878722985e-05;0.00036404520506039;-0.00061043031746522;-1.4908058801666e-05;-0.0015481434529647;-2.8446504074964e-05;0.000483848125441;0.00012508379586507;0.00039167873910628;6.7040578869637e-05;-0.00011868834553752;-4.41610791313e-05;-0.0017307047965005;-0.00019662262639031;-0.00088552414672449;0.00058134458959103;0.00050056690815836;0.00037106993841007;-0.00062152656028047;0.0013395701535046;-0.00031561605283059;-0.00036882862332277;2.9825458113919e-05;0.0018580798059702;-4.4464617531048e-05;-0.00046070059761405;-1.7429053968954e-06;0.00093937950441614;4.0541526686866e-05;-1.5825917216716e-05;0.00010735560499597;-5.9827390941791e-05;-0.00066923635313287;-0.00043538445606828;-9.4083050498739e-05;0.0023629092611372;0.00032739766174927;-0.00040973798604682;-0.00019479509501252;8.1690363003872e-05;-6.0117676184746e-05;-0.00026244760374539;-0.00014088388707023;-0.0013263312866911;-0.00011506057489896;0.00023647780471947;-0.0011520502157509;-0.0001971242018044;0.0004025719827041;0.0011934178182855;-0.0012743339175358;0.00035399323678575;-1.3658665920957e-05;0.00011754342995118;0.00075728545198217;4.0630053263158e-05;-1.4605305295845e-05;5.2709128794959e-05;0.00036098025157116;-1.6580994270043e-05;1.69816394191e-06;0.00015121244359761;1.4447748071689e-05;0.00021151441615075;-0.00093023397494107;-0.00014567202015314;-0.0010251135099679;0.00029381076456048;-0.00050274061504751;6.2857317971066e-05;-0.00018624757649377;7.288358756341e-05;-0.00059801246970892;-0.00015569420065731;0.00071212457260117;-0.00015927333151922;8.2879178080475e-06;0.00061103707412258;-5.4742573411204e-05;0.00036328894202597;-0.0003991590347141;0.00028991544968449;-0.00024485067115165;0.00034454293199815;0.00012981973122805;0.0011711306869984;-3.9953421946848e-05;0.00032206196920015;1.2693076314463e-05;-0.00031505242804997;2.8670887331828e-05;-3.8722733734176e-05;-5.4525156883756e-05;4.2477953684283e-05;0.00025234444183297;-0.00028065851074643;2.9845086828573e-05;-0.0010722639271989;-0.00014047874719836;0.00050825235666707;7.0419169787783e-05;0.00028111378196627;3.6298315535532e-05;4.6896839194233e-05;3.9849568565842e-05;-0.0013400198658928;-0.00012126340880059;-0.00054175610421225;0.00039354004547931;0.00032358802855015;0.00017989912885241;-0.00042935422970913;0.00083185022231191;-0.00018505961634219;-0.00034440128365532;-3.2630588975735e-05;0.0012520628515631;-1.6378146028728e-05;-0.00035601257695816;-1.8028860722552e-05;0.00065444497158751;3.2678315619705e-05;-2.1150915927137e-05;6.3201056036633e-05;-5.8098150475416e-05;-0.00042230053804815;-0.00045919523108751;-2.815957122948e-05;0.0013743914896622;0.00016759858408477;-0.00015871843788773;-0.00013105377729516;6.671943992842e-05;-2.2277508833213e-05;-0.00034971762215719;-6.7694782046601e-05;-0.0010302106384188;-7.3103350587189e-05;8.3587408880703e-05;-0.00077881762990728;-0.00011649459338514;0.00031786493491381;0.00078205968020484;-0.00068939215270802;0.00023009667347651;4.5588913053507e-05;3.8190933992155e-05;0.00085367960855365;2.2570822693524e-05;2.2696678570355e-05;2.451039472362e-05;0.0002809499274008;-1.9998689822387e-05;1.2905851690448e-05;-1.7597982150619e-05;-0.00013521623623092;0.0012858551926911;-0.00020972680067644;0.00094356463523582;7.8219840361271e-05;0.00022848276421428;-0.000140812859172;0.00016789697110653;-3.0214001526474e-05;0.00039318946073763;-5.6944245443447e-05;-0.00022024702047929;6.3583313021809e-05;0.00021313843899406;8.3372331573628e-05;-0.00048465569852851;-0.00056860112817958;4.380670725368e-05;-0.00045181161840446;0.00037350304774009;-0.00028874247800559;0.00017609026690479;-0.0014001028612256;-4.8477024392923e-05;-0.00018757427460514;1.4893242223479e-05;0.00016953657905106;1.268427240575e-05;-3.8397602111218e-06;8.8800015873858e-06;-2.1553192709689e-05;-5.1171049562981e-05;0.00017809403652791;0.0001107163116103;-0.00047186628216878;9.2041400421294e-06;0.00039893088978715;-0.00014992068463471;0.00017681060126051;2.4647648388054e-05;0.00023123063147068;-2.5509418264846e-05;-0.0010811754036695;6.0874146583956e-05;4.9076024879469e-06;-0.00012248639541212;0.00028376156114973;-7.0185342337936e-05;0.00012811915075872;0.00012468373461161;-0.00024478902923875;-0.00025360775180161;-3.8967449654592e-05;0.00064694008324295;-1.7207887140103e-05;-0.00031460053287446;1.0397624464531e-05;0.00047523167449981;-6.5496242314111e-06;-1.8255181203131e-05;1.7585196474101e-05;-2.8695068976958e-05;2.5547731638653e-05;-0.00049512123223394;-0.00016937278269324;0.00040426224586554;-7.5640473369276e-06;5.4743541113567e-05;3.5210599889979e-05;-4.4168532440381e-06;-5.1230235840194e-05;-0.00057679216843098;4.4630246520683e-06;-0.00078278500586748;-4.858522061113e-06;-3.7491630791919e-05;-1.3490031051333e-05;-0.00035860910429619;0.00019623979460448;-4.477522088564e-05;-0.00022217900550459;0.00037919063470326;0.00013253149518277;8.2323393144179e-05;0.0011946766171604;-1.2765658539138e-05;0.00014728536189068;4.4383450585883e-06;0.00014459053636529;5.3133289839025e-06;-7.1365179792338e-06;1.1002385690517e-05;-1.0944023642878e-06;-3.45783373632e-05;0.00014847420970909;2.3166336177383e-05;0.00016820074233692;0.00011976785754086;0.00062002905178815;-0.00033442277344875;0.00019954897288699;-2.73160640063e-05;0.000296454585623;-2.5923585781129e-05;-0.0008660331950523;0.0001665005547693;4.1674934436742e-06;-9.7589982033242e-05;-0.00021726114209741;3.2284817280015e-05;3.2452780374115e-07;9.3859365733806e-05;8.0955120211001e-05;-0.00027236194000579;6.3629478972871e-05;-6.2991508457344e-05;-0.0001386452204315;-0.00027588271768764;2.7673631848302e-05;0.00032999855466187;-2.48002979788e-05;-2.9632983569172e-05;1.5473860912607e-05;-4.1350667743245e-05;5.3856292652199e-06;-0.00049043406033888;0.00013774940453004;-0.00056433549616486;-6.3918094383553e-05;4.6423596359091e-05;0.00010633342753863;0.00021673607989214;3.9227703382494e-05;-0.00019837848958559;2.1196179659455e-05;-0.00082551996456459;-7.5487681897357e-05;-0.000109240601887;-0.00033708204864524;0.00027961883461103;0.00031178822973743;0.0001534047187306;0.00048332585720345;-0.00025211425963789;-8.4003426309209e-05;-0.00012104199413443;0.0010372884571552;6.4606967498548e-05;-0.00022469378018286;-1.6530690118088e-05;0.00050451298011467;1.0692244359234e-05;1.2414309821906e-05;5.5927807807166e-06;1.5718127542641e-05;7.2351591370534e-05;-0.00019719694682863;-0.00023948361922521;0.00096583290724084;-8.1281374150421e-05;-0.0002212293620687;0.00017216833657585;-4.1219813283533e-05;-6.319295061985e-05;-4.294730752008e-05;-2.4379660317209e-05;-0.00042305080569349;-7.1046968514565e-05;-8.9357170509174e-05;0.00010610241588438;-0.000432967528468;0.00018859528063331;-9.0850619017147e-05;-0.00052085111383349;0.00047648313920945;-1.2276007510081e-05;9.6995812782552e-05;0.00024305227270816;6.8952344008721e-05;5.5073131079553e-05;1.8628208636073e-05;2.7456213501864e-05;2.5914396246662e-05;3.4843647881644e-05;-2.2675207219436e-05;-4.1633185901446e-05;6.5630178141873e-05;-5.6128283176804e-05;3.2695909339964e-06;0.00013056323223282;0.00011059094686061;-0.00072474725311622;0.00070262979716063;2.2429632736021e-05;-1.371989310428e-05;2.2675780201098e-05;8.6219632066786e-05;0.00033968559000641;-0.0003383066796232;-4.4332424295135e-05;-0.00010359285806771;-0.00018118033767678;0.00038011479773559;-0.00026578424149193;-0.00040903376066126;0.00055719894589856;-7.9290352005046e-05;1.8723481844063e-05;-7.4840965680778e-05;-7.8254568506964e-05;1.7858701539808e-05;-5.7725424994715e-05;-0.00014489282330032;0.00014370426652022;3.3820670068962e-05;2.3808021069271e-05;-8.5773805039935e-05;-2.4019358534133e-05;-0.00021346918947529;-0.00014514272334054;0.0002394076436758;0.00018763393745758;-0.00015367341984529;-0.00040261729736812;-0.00010393791308161;-0.00013167998986319;-0.00022164420806803;-0.0002286564122187;0.00021108420332894;0.00039695133455098;-0.00011006757995347;-0.00030191359110177;-0.00088539271382615;0.00022070425620768;6.2003622588236e-05;0.00049172912258655;0.00068798713618889;0.00031789421336725;0.0002878074592445;-0.00019328034250066;-0.00028203020337969;8.3489445387386e-05;0.00013188784942031;7.7470693213399e-05;2.9619102861034e-05;5.1648466978804e-06;1.6838295778143e-05;5.3806521464139e-05;4.4148095184937e-05;0.00029318829183467;0.0001168170128949;-0.00014792250294704;-3.7656333006453e-05;-0.0001969137811102;-0.0003790789633058;1.8687511328608e-05;-3.0420836992562e-05;7.5881558586843e-05;0.00011309986439301;0.00017115639639087;0.00026065710699186;-4.1021092329174e-05;0.00025170497247018;0.0011338222539052;-9.0490953880362e-05;-9.8234406323172e-05;-0.00046663646935485;-0.00027196382870898;-0.00020064927230123;-7.3634895670693e-05;-0.00012690533185378;-0.00024547020439059;1.7409607607988e-05;2.1347286747186e-05;-7.5188851042185e-05;-0.00011154189996887;3.8028581911931e-05;-2.4881099307095e-05;-4.6506593207596e-05;6.4403204305563e-05;-6.7623695940711e-05;3.8699919969076e-05;0.00015760690439492;0.00015815047663637;-0.00077007530489936;0.00072918616933748;1.4847342754365e-05;-1.0215200745733e-05;2.9417213227134e-05;9.3657050456386e-05;0.00037065101787448;-0.0003452998935245;-3.6965455365134e-05;-0.00010181582183577;-0.00022438692394644;0.00038152449997142;-0.00028357017436065;-0.00037539182812907;0.00052350753685459;-6.6952321503777e-05;1.2418950063875e-05;-0.00010685196320992;-0.00010332166857552;1.9977249394287e-05;-6.2617058574688e-05;-0.0001561969256727;0.00015059583529364;3.4061027690768e-05;2.4808769012452e-05;-9.1916757810395e-05;-3.1052280974109e-05;-0.0002168481296394;-0.0001334635890089;0.00024441641289741;0.00019664377032313;-0.00012910731311422;-0.00047038006596267;-0.00010224361903965;-0.0001376945147058;-0.00023109732137527;-0.00025086684036069;0.00019875846919604;0.00043845802429132;-0.0001076071857824;-0.00031758504337631;-0.00087144586723298;0.00023345806403086;5.9308793424862e-05;0.00047820125473663;0.00069752207491547;0.00032385790836997;0.00030676100868732;-0.0001862934732344;-0.00030471989884973;8.2985759945586e-05;0.00014155416283756;8.7856569734868e-05;3.3669854019536e-05;3.4102420158888e-06;1.8448479750077e-05;5.7083423598669e-05;5.0418464525137e-05;0.00033792178146541;0.00015453576634172;-0.00014140381244943;2.018513805524e-05;-0.00019176975183655;-0.00041510275332257;2.7368780138204e-05;-2.9787523089908e-05;8.0084042565431e-05;0.00013972024316899;0.00017024230328389;0.00027314070030116;-4.3952972191619e-05;0.00028690756880678;0.0011752435239032;-9.7811411251314e-05;-0.00011252122203587;-0.00053361215395853;-0.0003245571278967;-0.0002242972550448;-9.2887232312933e-05;-0.00013319520803634;-0.0002919118560385;1.5710813386249e-05;1.7914187992574e-05;-7.38484741305e-05;-0.0001216766613652;-1.6786718333606e-05;3.5012928947253e-06;0.00013773792306893;4.2861680412898e-05;0.00015295430785045;-0.00072278786683455;-0.00017658178694546;-0.00093205773737282;0.00036028705653735;-0.00065476587042212;6.5582855313551e-05;-0.00019605857960414;6.4534695411567e-05;-0.00050028134137392;-0.00018949991499539;0.00091203860938549;-0.00014147190086078;7.0708752900828e-05;0.00063549604965374;-2.99670809909e-05;0.00024639317416586;-0.00036429351894185;0.00011809767602244;-0.00023132274509408;0.00027247433899902;0.00017262395704165;0.00099216343369335;-4.2228301026626e-05;0.00031886791111901;2.1325884517864e-05;-0.00038954630144872;2.3961662009242e-05;-2.9760116376565e-05;-4.6133052819641e-05;2.44010334427e-05;0.00022990953584667;-0.00022213307966013;-2.3738632080494e-05;-0.00099324912298471;-4.5582539314637e-05;0.00039448624011129;8.161629375536e-05;0.00027236604364589;2.1472107619047e-05;7.2562572313473e-05;-1.8278471543454e-05;-0.001401285873726;-0.00012918782886118;-0.00053241394925863;0.00043413692037575;0.00033745256951079;0.0001758829166647;-0.00042813294567168;0.00075424223905429;-0.0001979003282031;-0.00032557375379838;3.3967156923609e-05;0.0012200110359117;-2.0154011508566e-05;-0.00037608074489981;1.8347146806263e-06;0.00071130139986053;3.1876799766906e-05;-1.5379651813419e-05;5.6471697462257e-05;-4.3923115299549e-05;-0.00046030196244828;-0.00037425733171403;-4.7734443796799e-05;0.0015265943948179;0.00020796373428311;-0.00022438308224082;-0.00013360817683861;3.6821777030127e-05;-3.9062510040822e-05;-0.00033636888838373;-9.0849949629046e-05;-0.0010100267827511;-7.3693321610335e-05;0.00010854462743737;-0.00081578525714576;-0.0001032509826473;0.00027647375827655;0.00082993559772149;-0.00080510979751125;0.00024714597384445;2.4792861950118e-05;6.5724518208299e-05;0.00082487188046798;2.4784880224615e-05;6.5683292632457e-05;3.9573646063218e-05;0.00020647572819144;-1.9954244635301e-05;2.9717452889599e-06;0.00022974112653174;4.967644053977e-05;0.00030622628401034;-0.0014065520372242;-0.00019089410488959;-0.0015180641785264;0.00033993940451182;-0.00058610533596948;7.4049166869372e-05;-0.00023176296963356;0.00010188580927206;-0.00074631627649069;-0.00017455655324738;0.0007975977496244;-0.00025774785899557;3.2858082704479e-05;0.00088320870418102;-9.4081311544869e-05;0.00056438555475324;-0.00056873419089243;0.00038790763937868;-0.00033801497193053;0.00039016333175823;0.00015316237113439;0.001870205742307;-4.4292897655396e-05;0.00038514213520102;2.3182756194728e-06;-0.000394362694351;3.0883718864061e-05;-3.7087138480274e-05;-9.7547519544605e-05;5.7757864851737e-05;0.00030767288990319;-3.1381227017846e-05;1.8663333321456e-05;-0.0013769717188552;-0.00019026598602068;0.00068449060199782;0.00010223063873127;0.0003403831506148;1.8079408619087e-05;0.00021327946160454;4.913393422612e-05;-0.0017851438606158;-0.00011378782073734;-0.00062908953987062;0.00058077333960682;0.00044303594040684;5.58727333555e-05;-0.00058543926570565;0.00092564825899899;-0.00022506670211442;-0.00049820507410914;-1.3397031580098e-05;0.0014301346382126;-1.715736289043e-05;-0.00048470101319253;-1.3093600500724e-05;0.00084029487334192;4.9203867092729e-05;-3.8495167245856e-05;4.1667528421385e-05;-8.2840313552879e-05;-0.00056554889306426;-0.00055215216707438;-2.1088539142511e-05;0.0017320408951491;0.00020836052135564;-0.00016632647020742;-0.00016580216470174;0.00010592376929708;-2.5509940314805e-05;-0.00060520181432366;-8.6124171502888e-05;-0.0014552177162841;-5.9837850130862e-05;5.3912895964459e-05;-0.0010435667354614;-9.7554417152423e-05;0.00034563019289635;0.0010400339961052;-0.00086480303434655;0.00031049238168634;5.3733467211714e-05;3.8667676562909e-05;0.00134942389559;2.2385727788787e-05;6.6123662691098e-05;3.4873111872002e-05;0.00037759583210573;-1.5198250366666e-05;4.7146968427114e-06;0.00021864401060157;5.3372346883407e-05;0.0003326976147946;-0.0014609530335292;-0.00013214815407991;-0.0014828455168754;0.00019730540225282;-0.00031271571060643;5.8723093388835e-05;-0.00017449459119234;9.4234150310513e-05;-0.00060773181030527;-9.9558485089801e-05;0.00043246915447526;-0.00027736337506212;-5.0978593208129e-05;0.00078012241283432;-8.4185609011911e-05;0.00063370657153428;-0.00055280298693106;0.00052792782662436;-0.00031383291934617;0.00030587404035032;8.3569226262625e-05;0.001875288086012;-2.9039039873169e-05;0.00027947497437708;-1.2806050108338e-05;-0.0002714695292525;2.3451135348296e-05;-2.3243270334206e-05;-8.9611086877994e-05;5.9316946135368e-05;0.00022821918537375;0.00013788291835226;3.9881815609988e-05;-0.0010443269275129;-0.00023770779080223;0.00066615035757422;6.972803384997e-05;0.0002640109451022;-1.513570566658e-07;0.00030127688660286;8.8845044956543e-05;-0.0015128923114389;-6.5015505242627e-05;-0.0004246169119142;0.0004437402531039;0.00033314956817776;-4.8073783545988e-05;-0.0004472057626117;0.00061797013040632;-0.00014319618640002;-0.00045618761214428;-4.2869007302215e-05;0.0010389346862212;-2.0118989141338e-06;-0.00041403505019844;-2.0100453184568e-05;0.00065868708770722;4.1193798097083e-05;-3.8481535739265e-05;2.8017582735629e-05;-9.0142239059787e-05;-0.00040275361970998;-0.00057855423074216;1.1044496204704e-05;0.0011408700374886;0.00010804431076394;-1.7712256521918e-05;-0.00012796296505257;9.2021291493438e-05;-4.9075779315899e-06;-0.00065846327925101;-3.7456044083228e-05;-0.0012709208531305;-3.3681280910969e-05;6.8491863203235e-06;-0.00078855478204787;-8.1878737546504e-05;0.00030392594635487;0.00077351392246783;-0.00055783009156585;0.00023193114611786;0.00010935065074591;-8.1945390775218e-06;0.0013978414935991;1.3791563105769e-05;8.46862749313e-05;1.5977466318873e-05;0.00033843499841169;-5.4603209719062e-05;1.5301251551136e-05;-8.6043626652099e-05;-0.0001269440545002;0.0013274707598612;-0.00021278942585923;0.00094218557933345;8.1870457506739e-06;-0.00017899746308103;8.2834427303169e-05;9.4131486548577e-05;-1.3855011275155e-05;-0.00017485735588707;-2.331419091206e-05;0.00032418849878013;-4.4746277126251e-05;0.00029200810240582;0.00021399845718406;-0.00037688438897021;-0.0006841555587016;-9.9373000921332e-06;-0.00060571386711672;0.00033294726745225;5.429754673969e-05;0.00014204524632078;-0.0014067473821342;2.4136876163539e-05;6.9435773184523e-05;-1.45956828419e-05;6.7190361733083e-05;2.3826100004953e-05;7.7200907981023e-05;-2.460020914441e-05;-0.00011924056161661;-6.5008724050131e-05;0.00074193702312186;-7.2739145252854e-05;0.00027288126875646;-8.4384264482651e-06;0.00026072582113557;-0.00012719476944767;-0.00012262593372725;2.9341279059736e-06;0.00056247634347528;-7.9263416409958e-05;-0.000602601619903;5.7292581914226e-05;0.00015747360885143;0.00022457902377937;2.3209866412799e-05;-0.0004173491615802;-6.5224826357735e-06;-0.00047348931548186;3.8426795072155e-05;5.489915565704e-05;8.2543752796482e-05;-0.00045401559327729;1.3262008906167e-05;-0.00018661176727619;2.6701029128162e-05;0.00015108143270481;1.2076374332537e-05;-1.0385032283011e-06;-6.9245498934833e-07;-0.00011112500214949;-9.1949013949488e-06;-0.00050747964996845;6.4041822042782e-05;-0.00041855376912281;2.3796761524864e-05;0.00026635246467777;-0.00012106108624721;-8.4294413682073e-05;2.0156930986559e-06;-0.00091674958821386;1.1243148037465e-05;-0.00063820678042248;7.2214053943753e-05;5.8007361076307e-05;4.9319147365168e-05;9.0665082097985e-05;5.4869109590072e-05;-6.153746653581e-05;-2.4437169940938e-06;-4.5631917600986e-05;0.00038990550092421;-3.1756628686708e-06;0.0015799808315933;-6.9349203840829e-05;0.00024681357899681;-6.574584858754e-06;0.00010026032396127;-1.2376232007227e-05;-5.9951980801998e-05;2.1387690139818e-05;-6.1725462728646e-05;-0.0001821967161959;0.0019036205485463;-0.00031803868478164;0.0013538799248636;2.8132652005297e-05;-0.00013880465121474;6.1793711211067e-05;0.00016262620920315;-2.5444795028307e-05;9.1509311459959e-05;-5.0578400987433e-05;0.00032937794458121;-4.1281447920483e-05;0.00035150602343492;0.0002021596301347;-0.00059020199114457;-0.00090830441331491;4.4428637920646e-05;-0.00076242524664849;0.00050443509826437;-0.00013859066530131;0.00021195888984948;-0.002110184635967;2.559720633144e-05;-1.750249430188e-05;-8.0006866483018e-06;8.4264982433524e-05;3.6553650716087e-05;7.4223178671673e-05;-2.2188387447386e-05;-0.00012390727351885;-9.6331365057267e-05;0.00096047623082995;-2.1535004634643e-05;5.9354704717407e-05;-1.3497287909559e-05;0.00039679417386651;-0.00018408391042612;-5.5713797337376e-05;1.8131353499484e-05;0.00064747751457617;-9.3318740255199e-05;-0.00092996371677145;8.0495694419369e-05;0.00018431033822708;0.00021594989812002;0.00018815333896782;-0.00053067517001182;4.63203068648e-05;-0.00048579549184069;-9.0340552560519e-05;-5.757140024798e-05;6.5571082814131e-05;-0.0002952141512651;1.3354446309677e-05;-0.00029639378772117;2.9841245122952e-05;0.00030544027686119;1.0636299521138e-05;-2.6145920855924e-05;1.3470924386638e-05;-8.6627856944688e-05;-2.6894053007709e-05;-0.00045584607869387;-3.2691343221813e-05;-0.00020964187569916;1.8570484826341e-05;0.00027223626966588;-0.00010087124246638;-2.4772396500339e-05;-1.8185728549724e-05;-0.0010856501758099;1.0682048014132e-05;-0.00093346217181534;6.5814747358672e-05;7.2932532930281e-05;5.7412442401983e-05;-5.6361306633335e-05;6.6082784542232e-06;-4.6354929509107e-05;-0.00017158410628326;0.00012632143625524;0.00030201283516362;4.494938912103e-05;0.0019198697991669;-6.7145912908018e-05;0.00026695046108216;-6.647436748608e-06;0.00018076645210385;-9.7155279945582e-06;-4.9341717385687e-05;1.7217596905539e-05;-5.8957728469977e-05;-0.00011827053094748;0.0012433790834621;-0.00020779660553671;0.00093012733850628;3.3935033570742e-05;-5.0700029532891e-05;2.0037165086251e-05;0.00012608389079105;-2.2418129447033e-05;-5.1847859140253e-05;-3.0003924621269e-05;0.00015660627104808;-1.5758181689307e-05;0.00024113201652654;0.00013489009870682;-0.00043312198249623;-0.00058710348093882;9.1086785687367e-06;-0.00049764744471759;0.00035382391070016;-4.4625830923906e-05;0.00014771507994737;-0.0013704048469663;-8.4617016682387e-07;8.3760651250486e-06;-5.5836540013843e-06;0.00010031094279839;2.1684885723516e-05;6.173356086947e-05;-1.8449667550158e-05;-0.0001183850254165;-5.421532841865e-05;0.00063788134139031;-2.6017522031907e-05;0.0001222013233928;-2.0510246031336e-05;0.00026483469991945;-0.00011451657337602;-6.6070730099455e-05;8.3671611719183e-06;0.00047152256593108;-7.03076220816e-05;-0.00071424763882533;5.0350867240923e-05;0.00012591457925737;0.0001756516576279;0.00011410308070481;-0.00034281812258996;9.7733736765804e-06;-0.00039227539673448;-3.9504211599706e-05;3.367020690348e-05;5.0432463467587e-05;-0.00022393245308194;1.8383287169854e-05;-0.000212047205423;2.4131726604537e-05;0.00023466008133255;9.6857647804427e-06;-6.8173180807207e-06;5.2092577789153e-06;-6.2336672272068e-05;-1.7612394003663e-05;-0.00030474032973871;-1.8986349459738e-05;-0.00018453336087987;1.9198250811314e-06;0.00019018111925106;-6.7069071519654e-05;-6.1951046518516e-05;-9.5532614068361e-06;-0.00078848371049389;7.2288980845769e-07;-0.00061935751000419;4.3196567276027e-05;4.8109330236912e-05;5.092470019008e-05;-1.0629859389155e-05;-9.4772385637043e-06;-2.98851991829e-05;-0.00013978788047098;7.6355354394764e-05;0.00024616796872579;2.8178530556033e-05;0.0013881586492062;-3.8533573388122e-05;0.00022883981000632;-3.5011987620237e-06;6.7191722337157e-05;-1.8997038750967e-06;2.3497019356e-05;-1.4196500160324e-05;-2.4680824935785e-05;3.9992959500523e-05;-2.0044542736741e-07;-6.417027907446e-05;0.00016810168744996;-2.0091222268093e-06;-0.00046239094808698;0.00044677220284939;4.5219287130749e-05;-3.019318319275e-05;4.2292311263736e-05;4.5259483158588e-05;0.00017941037367564;-0.00017902463150676;-3.7821097066626e-05;-0.00012701137166005;-0.00015207417891361;0.00032928644213825;-0.00020697028958239;-0.00053436460439116;0.0007175758946687;-0.00011808991257567;6.0019865486538e-05;-2.0244437109795e-05;-8.9854904217646e-05;-8.7647504187771e-06;-2.61547484115e-05;-9.3483562523033e-05;9.4272305432241e-05;2.6598130716593e-05;1.6297204638249e-05;-1.3359051081352e-05;2.8616987037822e-05;-9.8393080406822e-05;-5.0800947064999e-05;0.00021096154523548;0.00015055063704494;-9.7574033134151e-05;-0.0002593710378278;-7.0715999754611e-05;-9.2043897893745e-05;-0.00012750567111652;-0.00014239821757656;0.00014293759886641;0.00027300789952278;-0.00014753876894247;-1.0399613529444e-05;-0.00071575690526515;0.00013524737732951;2.0666655473178e-05;0.00025586562696844;0.00039871691842563;0.00017020355153363;0.00015237391926348;-0.00015923555474728;-0.00020276862778701;5.9155350754736e-05;0.00010152380127693;4.1424780647503e-05;3.713445039466e-06;1.0244766599499e-05;1.5392239220091e-05;4.2370607843623e-05;4.2361301893834e-05;4.8112313379534e-05;-0.0001096984706237;-0.00019424507627264;-0.00017816004401539;-0.00011833177995868;-0.00023820989008527;-1.6335330656148e-05;-5.253745985101e-05;5.6548484280938e-05;7.2053990152199e-05;0.00013057481555734;0.00020644537289627;-4.2541079892544e-05;0.00010520780051593;0.00068052212009206;-4.3139945773873e-05;-6.7108499933966e-05;-9.7081894637085e-05;0.00013906201638747;-9.4128328782972e-05;7.2339971666224e-06;-5.3217074309941e-05;-0.00011959710536757;1.9212548068026e-05;2.844743175956e-05;-7.2898059443105e-05;-0.00010655976802809;2.4823633793858e-05;-1.517002874607e-05;-2.7319507353241e-05;3.8485104596475e-05;-2.576165343271e-06;-4.6576089516748e-05;0.00018216542957816;1.9006716684089e-05;-0.00047929165884852;0.00045540850260295;4.2413761548232e-05;-2.7866830350831e-05;4.6937984734541e-05;4.85472373839e-05;0.00019122955563944;-0.00018076876585837;-3.4078970202245e-05;-0.00013203070557211;-0.00017426742124371;0.00032972678309307;-0.00021258038759697;-0.0005160141736269;0.00070344825508073;-0.00011405403347453;5.6068158301059e-05;-3.6244608054403e-05;-0.00010142403334612;-8.616731975053e-06;-2.8521251806524e-05;-9.7987314802594e-05;9.7127529443242e-05;2.6683084797696e-05;1.6373893231503e-05;-1.457790403947e-05;2.5700639525894e-05;-9.8657721537165e-05;-4.1626430174801e-05;0.00021471444051713;0.00015173475549091;-8.8020758994389e-05;-0.00028606128762476;-7.0121444878168e-05;-9.3374117568601e-05;-0.00013063181540929;-0.00015111034736037;0.00013693659275305;0.0002892533375416;-0.00014602149894927;-1.1999904018012e-05;-0.00070274795871228;0.00013706069148611;1.9290298951091e-05;0.00024473373196088;0.00039520164136775;0.00017187015328091;0.00015754745982122;-0.00015626000822522;-0.00021084160835017;5.8756486396305e-05;0.00010539691720624;4.5744534872938e-05;5.0541575546958e-06;9.3123508122517e-06;1.6198448065552e-05;4.3163512600586e-05;4.5453321945388e-05;7.0998888986651e-05;-9.915904229274e-05;-0.00018547917716205;-0.0001586325088283;-0.00011515127698658;-0.00025129196001217;-1.1603082384681e-05;-5.306904859026e-05;5.9318121202523e-05;8.3531471318565e-05;0.0001285297475988;0.00021219254995231;-4.3993321014568e-05;0.00011698054004228;0.00069098867243156;-4.4160940888105e-05;-7.3207018431276e-05;-0.00013412618136499;0.0001323034230154;-0.00010577961074887;4.391185939312e-07;-5.7023818953894e-05;-0.00013805630442221;1.7785447198548e-05;2.735458110692e-05;-7.1782080340199e-05;-0.00011203483154532;-1.1493675629026e-05;6.3458737713518e-06;0.00014463413390331;6.4874431700446e-05;0.00019263051217422;-0.00088181544560939;-0.00012110181705793;-0.0010022491915151;0.00019150045409333;-0.00033609796082601;4.5533342927229e-05;-0.0001342601608485;5.9960078942822e-05;-0.00033485508174635;-9.7755349997897e-05;0.00045819557271898;-0.00018648934201337;9.2758809842053e-06;0.00058603443903849;-3.509263478918e-05;0.00035914804902859;-0.00037288668681867;0.00024689894053154;-0.00021584289788734;0.00015072824317031;9.5832110673655e-05;0.0012084032641724;-2.2273559807218e-05;0.00019119512580801;-2.380008027103e-06;-0.00025659662787803;1.2269337275939e-05;-7.0149098974071e-06;-5.3870728152106e-05;2.154065623472e-05;0.00014815363101661;0.00013934592425358;-8.2696215031319e-06;-0.00068047444801778;-0.00010968631249852;0.00040698071825318;5.6550547014922e-05;0.0001737487182254;-1.2173974937468e-05;0.00024183445202652;2.6692681785789e-05;-0.0011472839396447;-5.2686653361889e-05;-0.00028645643033087;0.00034595804754645;0.0002398147189524;-3.2840624044184e-05;-0.00031853560358286;0.0003711472672876;-0.00011025746789528;-0.00029471336165443;1.4009443475516e-05;0.00071570329600945;-2.61784975919e-06;-0.00031023679184727;-1.0988334224749e-06;0.00051446817815304;2.8620088414755e-05;-2.2154594262247e-05;1.1161999282194e-05;-5.7161945733242e-05;-0.00031546308309771;-0.00034128670813516;-5.3327485147747e-06;0.00090306950733066;0.00010479688353371;-5.331103966455e-05;-9.1978807176929e-05;4.0418133721687e-05;-1.5916190022836e-05;-0.00047713716048747;-4.3474614358274e-05;-0.00089333206415176;-2.100208257616e-05;1.5474302927032e-05;-0.00058792642084882;-4.2236755689373e-05;0.00017830441356637;0.00058646459365264;-0.00047390337567776;0.00017799399211071;6.792649946874e-05;1.362945749861e-05;0.0010014787549153;1.0889139957726e-05;9.9036486062687e-05;2.303173278051e-05;0.000179321563337;-1.5982554032234e-05;1.6136738850037e-05;0.00025894810096361;9.8443328170106e-05;0.00038037198828533;-0.0017577986000106;-0.00012232240987942;-0.001747299451381;9.7593758255243e-05;-0.00013594639312942;4.714914757642e-05;-0.00016555396723561;9.5921095635276e-05;-0.00046895505511202;-4.1006122046383e-05;0.00015171481936704;-0.00035061925882474;-3.5431712603895e-05;0.00088651041733101;-0.00011049276508857;0.00077119603520259;-0.00062258186517283;0.00058076484128833;-0.00033330477890559;0.00020141071581747;4.9299567763228e-05;0.0023607527837157;-1.275744943996e-05;0.00019681596313603;-3.4558339393698e-05;-0.00023841872462071;5.6848134590837e-06;1.2350570614217e-05;-0.00012349005555734;2.5683366402518e-05;0.00017328365356661;0.00066521199187264;1.0202298653894e-05;-0.00087702239397913;-0.00025202069082297;0.00067653250880539;7.9971854574978e-05;0.00017093001224566;-5.0688457122305e-05;0.00053929374553263;9.1049107140861e-05;-0.0014788685366511;2.8455493520596e-05;-0.00023540845722891;0.00050014024600387;0.00031679886160418;-0.00033765731495805;-0.00044009173871018;0.00027144810883328;-9.6917334303726e-05;-0.00042844450217672;-2.6320710730943e-06;0.0005831869202666;7.3382416303502e-06;-0.00041366959339939;-4.60806177216e-06;0.00058395741507411;4.6098055463517e-05;-5.2030518418178e-05;-3.8059595681261e-05;-0.00011516866652528;-0.00038100339588709;-0.00043793508666568;3.2877975172596e-05;0.00089092925190926;6.2942075601313e-05;8.3599785284605e-05;-0.00010907789692283;0.0001167157679447;1.3153343161321e-06;-0.00092900282470509;-1.8101292880601e-05;-0.0013919508783147;4.7356475988636e-05;-3.5461111110635e-05;-0.00072968436870724;-1.6504680388607e-05;0.00014357270265464;0.00072554725920781;-0.00050994957564399;0.00023046013666317;0.00012454976968002;-3.3152573450934e-05;0.0017756838351488;1.8745131455944e-06;0.00014531689521391;1.4945489056117e-05;0.00035329716047272;-1.4021603419678e-05;2.5212864784407e-05;0.00027420613332652;0.00012459322169889;0.00042874054634012;-0.0019792465027422;-8.0474965216126e-05;-0.0018650318961591;-1.5136271940719e-05;8.8290580606554e-05;3.6316425394034e-05;-0.00013815760030411;9.2386631877162e-05;-0.00032190885394812;1.73811786226e-05;-0.00013772827514913;-0.00041838569450192;-0.00013759007561021;0.00085805472917855;-9.606646199245e-05;0.00092214229516685;-0.0006545729120262;0.00078865670366213;-0.00033912059734575;0.00011808476847364;-2.5157401069009e-06;0.0025367536582053;2.4595908598712e-06;0.00011040896788472;-4.754551264341e-05;-0.00017618514539208;-4.7304642976087e-06;3.5432953154668e-05;-0.00013116050104145;1.4230580745789e-05;9.154636063613e-05;0.00088121165754274;1.8758590158541e-05;-0.00057141808792949;-0.00028852821560577;0.00068297365214676;6.0008085711161e-05;9.7270756668877e-05;-7.7917145972606e-05;0.00069373345468193;0.00011735011503333;-0.001368239056319;8.3851438830607e-05;-6.9145549787208e-05;0.00038915665936656;0.00024815191864036;-0.00046726418077014;-0.00032060386729427;-8.2048100011889e-06;-2.3002216039458e-05;-0.00039741021464579;-1.0894451406784e-05;0.00022395908308681;2.0420444343472e-05;-0.0003913180262316;-4.5157244130678e-06;0.0004762968455907;3.7961897760397e-05;-5.1001297833864e-05;-3.7813395465491e-05;-0.00015165902732406;-0.00024594177375548;-0.0005613174289465;5.7393473980483e-05;0.00042729283450171;-3.0306959160953e-05;0.00023291155230254;-8.4670340584125e-05;9.5890929515008e-05;1.7446942365495e-05;-0.0011170717189088;3.1835596018936e-05;-0.0013765093171969;7.9130113590509e-05;-2.694598515518e-05;-0.00052972417324781;-4.8332429287257e-05;0.00014049239689484;0.00052588910330087;-0.00032754405401647;0.00017444980039727;0.00024307260173373;-8.088397589745e-05;0.0020630280487239;-3.5379825931159e-06;0.00019467504171189;-2.2744654870621e-06;0.00035406407550909;-5.8769874158315e-06;2.6819725462701e-05;0.00016804470214993;0.00012872247316409;0.00025565212126821;-0.0012610899284482;-2.8587053748197e-05;-0.0011564164888114;-7.2348964749835e-05;0.00018124932830688;1.1796826584032e-05;-6.1610422562808e-05;4.289186472306e-05;6.5861037001014e-05;4.0499737224309e-05;-0.00024295516777784;-0.00031632898026146;-0.00016928714467213;0.00048189720837399;-1.0412354640721e-05;0.00063337991014123;-0.00038615425000899;0.00059081875951961;-0.00019660154066514;-8.4121762483846e-05;-1.8515665942687e-05;0.0015328116714954;1.6224505088758e-05;-3.1566800316796e-05;-3.2663861929905e-05;-0.00010213245695923;-1.4955719962018e-05;5.0135473429691e-05;-7.6165008067619e-05;-1.9715555026778e-05;-3.2355885196012e-05;0.0006812050123699;6.3540078372171e-06;-1.2416640856827e-05;-0.00017734480206855;0.00038949275040068;1.8740427549346e-05;-2.7155976567883e-05;-7.6055403042119e-05;0.0005731891724281;7.6282289228402e-05;-0.00078297598520294;8.945025911089e-05;0.00010055708116852;0.00011716007429641;8.6260573880281e-05;-0.00036328620626591;-6.6327142121736e-05;-0.00026481616077945;5.1835941121681e-05;-0.0001672460057307;4.4434204937716e-06;-0.00018579460447654;2.3863334718044e-05;-0.00021948429639451;3.8249309000093e-06;0.00021330069284886;1.068509027391e-05;-1.8019776689471e-05;-1.6937581676757e-05;-0.00013894698349759;-2.3647433408769e-05;-0.00049541046610102;5.016752766096e-05;-0.00015228481788654;-9.249520371668e-05;0.00026372729917057;-2.6999465262634e-05;9.7704514701036e-07;1.8801369151333e-05;-0.00087103206897154;5.805928594782e-05;-0.00080427003558725;7.0328431320377e-05;-8.8887327365228e-06;-0.00014022822142579;-6.2714025261812e-05;0.00010405441571493;0.00013815322017763;-3.5766417568084e-05;5.1995000831084e-05;0.00030639272881672;-8.4572333435062e-05;0.0015498126158491;-5.8010314205603e-06;0.0001955145271495;-1.0967634807457e-05;0.00017031366587617;-0.00010838479647646;3.4535412851255e-05;-4.6664055844303e-05;-0.00015991610416677;0.0018773680785671;-0.00028915129951201;0.0012179343029857;-3.6317531339591e-05;-0.00042679815669544;0.00022154769976623;0.00018566592189018;-1.6483958461322e-05;-0.00027758645592257;-1.8730572264758e-05;0.00069586362224072;-0.00011647774954326;0.00034363899612799;0.00024356873473153;-0.00042485605808906;-0.00091346749104559;3.5584751458373e-05;-0.00081931316526607;0.00041787003283389;-5.4020769312046e-05;0.00016155985940713;-0.0019701696000993;8.0983278166968e-05;0.00012796073860954;-2.6768408133648e-05;2.2591675588046e-05;3.8432997826021e-05;0.00015566068759654;-5.8786106819753e-05;-0.00028896174626425;-0.00011954978981521;0.0012651627184823;-0.00013834958372172;0.00058040913427249;-4.1897113987943e-05;0.00015537590661552;-8.2639875472523e-05;-0.00036115053808317;2.6227997295791e-05;0.00071857438888401;-0.00012011651415378;-0.00033157769939862;2.9937033104943e-05;0.00034035227145068;0.00043245582492091;6.3734573814145e-06;-0.00078163156285882;-4.3752246710937e-05;-0.00081240729195997;8.6942687630653e-05;0.00044371769763529;0.00012729947047774;-0.0011960701085627;6.2653321947437e-05;-0.00013394976849668;2.5796549380175e-05;2.0200972357998e-05;3.3699725463521e-05;-1.4649379409093e-05;-3.0490116387227e-06;-0.00015341385733336;-6.5594496845733e-05;-0.00012553704436868;0.00010816059511853;-0.00061720237135887;9.7077327154693e-06;0.00034704993595369;-0.00018720889056567;-4.3484822526807e-05;2.1594427380478e-05;-0.00126462650951;6.190826297825e-06;-0.00078327796654776;0.0001143057961599;0.0002034845383605;0.00024303150712512;0.00030217107268982;-0.00026846502441913;-9.1103553131688e-05;-0.00028541911160573;-0.00016293152293656;0.00042380354716443;1.0609544460749e-06;0.0019154958426952;-8.5132422100287e-05;0.00027474260423332;-1.3401730939222e-05;0.00021724108955823;-2.3542686903966e-05;-0.00012348823656794;4.2439271055628e-05;-2.6812713258551e-05;-0.00019346980843693;0.0022894714493304;-0.00036353498580866;0.0015172518324107;-3.0192501071724e-05;-0.00046976041630842;0.00025003755581565;0.00024086274788715;-2.3872757083154e-05;-0.00018737914797384;-3.0695326131536e-05;0.00081085035344586;-0.0001368072553305;0.00037528417306021;0.00021175280562602;-0.00058002327568829;-0.0010565958218649;8.1804508226924e-05;-0.00090606027515605;0.00054022204130888;-0.00016358576249331;0.00020152390061412;-0.0025127555709332;9.3693241069559e-05;0.00011061368422816;-2.6845738830161e-05;1.4773584553041e-05;5.1298389735166e-05;0.00017301575280726;-6.5327069023624e-05;-0.00033835592330433;-0.00014664771151729;0.0015603452920914;-0.00012508429063018;0.0005478635430336;-5.599972064374e-05;0.00021589144307654;-0.00011269391688984;-0.00039018926327117;3.7383259041235e-05;0.00082068197662011;-0.00014215988630895;-0.00045537657570094;4.2527775804047e-05;0.00040283618727699;0.00050608825404197;0.00011020458623534;-0.0009512078249827;-3.4129177947761e-05;-0.00095086562214419;2.2122212612885e-05;0.00048974895616993;0.0001321234885836;-0.0013227708404884;7.4243434937671e-05;-0.0001774684060365;3.0347142455867e-05;6.5404150518589e-05;3.7448731745826e-05;-3.3196098229382e-05;6.1677806115767e-06;-0.00013284235319588;-0.00010536960326135;0.00011526788875926;4.855294173467e-05;-0.00056468305410817;-1.8541757071944e-06;0.00036823147092946;-0.00018665018433239;4.2819951886486e-06;1.7307109374087e-05;-0.0014214268885553;-8.0384916145704e-07;-0.00095282681286335;0.00011516999074956;0.00025421628379263;0.00027770982705988;0.00027573780971579;-0.00043263679253869;-5.6906279496616e-05;-0.00046434754040092;-8.5060491983313e-05;0.00033041564165615;3.4911121474579e-05;0.0021494240500033;-7.8597004176117e-05;0.00029542960692197;-1.5474599422305e-05;0.00026018507196568;-2.0332934582257e-05;-8.9586857939139e-05;3.2092564651975e-05;1.126286406361e-05;-0.00012779609824065;0.0015977704897523;-0.00025293344515376;0.0010605163406581;-2.0533207134577e-05;-0.00031461249454878;0.00017266148643102;0.00019517268810887;-2.0007648345199e-05;-9.3030474090483e-05;-2.4472776203766e-05;0.00055301864631474;-9.6207681053784e-05;0.00022896489826962;0.00011365424870746;-0.00041672543738969;-0.00069865409750491;7.1280242991634e-05;-0.00059765332844108;0.00038170380867086;-0.00018947114585899;0.00013874791329727;-0.0017770517151803;6.6380038333591e-05;6.016801125952e-05;-1.5504607290495e-05;1.2723009604088e-05;3.8123736885609e-05;0.00011880775127793;-4.4589192839339e-05;-0.00026303567574359;-9.9197190138511e-05;0.0010765417246148;-7.0176647568587e-05;0.00034618785139173;-4.5015160139883e-05;0.00013650949404109;-7.1043665229809e-05;-0.0002688780950848;2.8323333026492e-05;0.00052552291890606;-9.7834046755452e-05;-0.00030810441239737;2.6994919608114e-05;0.00028334656963125;0.00035386788658798;0.00011509397882037;-0.00065255287336186;-2.6905991035164e-05;-0.00066074403002858;-1.5083397556737e-05;0.00040226642158814;8.2314989413135e-05;-0.0009088555816561;5.4731452109991e-05;-0.00012298705405556;2.0884683181066e-05;5.8015470131068e-05;2.5593633836252e-05;-2.1490694052773e-05;5.3273752200766e-06;-8.8942128058989e-05;-8.3319180703256e-05;0.00020805136591662;1.0207751074631e-05;-0.00033202592749149;-7.6916794569115e-06;0.00023566131130792;-0.00011676864232868;1.1260634892096e-05;1.2014721505693e-05;-0.00097503635333851;-1.3359796184886e-06;-0.00066611170768738;7.3998322477564e-05;0.0001852192071965;0.00019368570065126;0.00017346521781292;-0.00035332719562575;-2.0961841073586e-05;-0.00038507362478413;-2.6754492864711e-05;0.00019454536959529;3.1405525078299e-05;0.0014359074411914;-4.7955127229216e-05;0.00018941768212244;-1.1474217899377e-05;0.00019080385391135;-1.2702759704553e-05;-5.1278686441947e-05;1.7481586837675e-05;1.20833501569e-05;-5.7466466387268e-05;0.0007856500451453;-0.00011402304517105;0.00051969662308693;-1.0520637260925e-05;-0.00016179957310669;9.1720525233541e-05;0.00011513588106027;-1.0344825568609e-05;-0.000126134196762;-1.1437371540524e-05;0.00028722872957587;-5.1171380619053e-05;0.00010202122211922;4.7817557060625e-05;-0.00020452514581848;-0.00032589436159469;3.2168180041481e-05;-0.00027804629644379;0.00017910919268616;-9.2637528723571e-05;6.3597915868741e-05;-0.00087297725258395;3.2651427318342e-05;4.8327026888728e-05;-7.9685960372444e-06;2.0686962670879e-05;2.0849098291364e-05;6.367272726493e-05;-2.3195421817945e-05;-0.00017022027168423;-4.7216508392012e-05;0.0005294902366586;-3.316133734188e-05;0.00019526004325598;-2.4441133064101e-05;5.8205656387145e-05;-3.0336399504449e-05;-0.00015935326518957;1.3684679288417e-05;0.00025250669568777;-5.2127415983705e-05;-0.0001448264811188;1.1532051757968e-05;0.00015245977556333;0.00019091316789854;6.0850819863845e-05;-0.00032507060677744;-2.3909322408144e-05;-0.00034682400291786;-1.2457987395464e-05;0.00030137290013954;4.1936236812035e-05;-0.00050381943583488;3.003106394317e-05;-4.9152342398884e-05;1.1806411748694e-05;1.8075448679156e-05;1.4313998690341e-05;2.1747266600869e-06;-5.8104774325329e-07;-6.7763598053716e-05;-4.8517460527364e-05;0.00014024329720996;3.8869202398928e-06;-0.00018669887504075;-8.3365939644864e-06;0.00011964902660111;-5.655116183334e-05;-1.9624720152933e-05;1.0742948688858e-05;-0.00052688614232466;-1.7771100147002e-06;-0.0003329700557515;3.6056975659449e-05;9.848897025222e-05;8.3356542745605e-05;9.6315598057117e-05;-0.00019410187087487;4.5726842472504e-06;-0.00020006629347336;-1.1302070561214e-05;0.00014726322842762;1.2635386156035e-05;0.00074645667336881;-2.1797799490741e-05;9.8096745205112e-05;-6.5794511101558e-06;8.8354026956949e-05;-4.7394978537341e-06;1.231815895153e-05;-6.1699151956418e-06;-3.6947296848666e-06;1.2244403478689e-05;5.3245003073243e-05;-0.00012141360639362;0.0001853218418546;-8.9751723862719e-05;-0.00026308713131584;0.00025587092386559;5.2640378271462e-05;-3.5521057725418e-05;4.4557153159985e-05;1.8467060726834e-05;6.556977314176e-05;-6.8380068114493e-05;-2.9114975404809e-05;-0.00012878116103821;-0.00011711203842424;0.00023513349879067;-0.00012182239152025;-0.00057600752916187;0.00076610158430412;-0.00012740978854708;7.8765478974674e-05;1.0637560080795e-05;-7.7049822721165e-05;-2.2055090084905e-05;-5.1978418014187e-06;-4.8717669415055e-05;5.0413662393112e-05;2.0013612811454e-05;1.0288748853782e-05;2.61820423475e-05;5.1886701839976e-05;-1.9179824448656e-05;1.4098306564847e-05;0.00018182382336818;0.00012448856432457;-5.8010449720314e-05;-0.00014224427286536;-4.1486171539873e-05;-5.5095155403251e-05;-5.66835187783e-05;-7.3390787292738e-05;8.7454332970083e-05;0.0001655266241869;-0.00015471015649382;0.00017780250345822;-0.00053011428099126;7.7028635132592e-05;1.4653160178568e-06;6.9150679337326e-05;0.00015673802408855;6.3763625803404e-05;5.2649578719866e-05;-0.00012477101699915;-0.00013530885917135;3.5255325201433e-05;6.8204550188966e-05;1.6996886188281e-05;-9.8233786047786e-06;1.105419050873e-05;1.1868020919792e-05;3.9005848520901e-05;4.2506948375376e-05;-9.3798567831982e-05;-0.00022565799008589;-0.00019556695770007;-0.00024213714641519;-6.0737107560271e-05;-0.00012666478869505;-3.7178349884925e-05;-6.1309845477808e-05;3.2976389775285e-05;3.0712988518644e-05;8.9401473815087e-05;0.00014673922851216;-3.1954426958691e-05;0.00010645135625964;0.00035537566873245;-4.8894227802521e-05;-7.5492265750654e-05;8.6648207798135e-05;0.00032111944165081;-1.8458855265635e-05;5.839499499416e-05;1.7323681049675e-06;-2.1690086214221e-05;1.9998036805191e-05;3.1238982046489e-05;-5.9734342357842e-05;-8.5949184722267e-05;1.269935091841e-05;-6.4117339206859e-06;-5.3583157750836e-06;1.0950917385344e-05;5.5082789913286e-05;-0.00011383836681489;0.00019215575593989;-8.0154117313214e-05;-0.00026699196314439;0.00025657928199507;5.2242499805288e-05;-3.4265598515049e-05;4.7087130951695e-05;2.0779647456948e-05;6.8702982389368e-05;-6.7998815211467e-05;-2.7444400984677e-05;-0.00013675165246241;-0.00012939682346769;0.00023599973064847;-0.00012201997014927;-0.00056742713786662;0.00076427171006799;-0.00012709249858744;7.6360556704458e-05;3.4523318390711e-06;-8.3436330896802e-05;-2.2551846996066e-05;-6.4174832914432e-06;-4.9790887715062e-05;5.098328620079e-05;2.0142060748185e-05;1.0104147804668e-05;2.6684732802096e-05;5.0543272664072e-05;-2.0884270270471e-05;1.8659593479242e-05;0.00018401592387818;0.00012207827239763;-5.4295109293889e-05;-0.00014974192890804;-4.1726074414328e-05;-5.4764070227975e-05;-5.6865264923545e-05;-7.6027157774661e-05;8.4464496467263e-05;0.00017077237134799;-0.0001541557139717;0.00017782098439056;-0.00052530254470184;7.5919320806861e-05;2.1680143618141e-06;6.6145119490102e-05;0.00015461826114915;6.4499938162044e-05;5.2893341489835e-05;-0.00012348414747976;-0.00013694923836738;3.4880558814621e-05;6.9371715653688e-05;1.8311495296075e-05;-9.8981181508861e-06;1.0507999832043e-05;1.2353614692984e-05;3.863437086693e-05;4.3396459659562e-05;-8.3338301919866e-05;-0.000228607779718;-0.00018921663286164;-0.00024126720381901;-5.9038426115876e-05;-0.00013027015666012;-3.473045580904e-05;-6.2425198848359e-05;3.3579963201191e-05;3.3636624721112e-05;8.7288324721158e-05;0.00014929403550923;-3.2276730053127e-05;0.00010767576895887;0.0003562644997146;-4.7780507884454e-05;-7.7216151112225e-05;6.6334985604044e-05;0.00033320620423183;-2.3112863345887e-05;5.8568726672092e-05;7.3634197406136e-07;-2.6072624677909e-05;1.9098606571788e-05;3.1312669307226e-05;-5.8385008742334e-05;-8.8151180534624e-05;-2.1629170078086e-05;5.1084436563542e-05;0.00023035143385641;0.00010263120930176;0.00034770552883856;-0.001744755776599;-4.9516940634931e-05;-0.0015946904895827;-0.00011385595280444;0.0002488205791451;2.1100855519762e-05;-0.00014313476276584;6.0130401834613e-05;-3.8871468859725e-05;7.0941001467872e-05;-0.00038656944525428;-0.00034429095103405;-4.8928755859379e-05;0.00071901769842952;-0.00011214175901841;0.00077486428199336;-0.00053443829528987;0.00059893098659813;-0.00025523075601086;4.9256366764894e-05;-3.1128136470215e-05;0.0023014866746962;1.8134489437216e-05;-1.7554081068738e-06;-5.3035997552797e-05;-0.00012048177450197;-3.2504998671357e-05;8.1760998000391e-05;-0.00012905366020277;-0.000107131927507;3.1391780794365e-05;0.0011043669655919;-2.1288782591e-05;-0.00024016731185839;-0.00020216546545271;0.0004650974588003;6.892292003613e-05;-8.8488828623667e-05;-0.00010483878577361;0.0006657894118689;7.5435025792103e-05;-0.00087840465130284;0.00018708767311182;0.00014265967183746;0.00035086282878183;0.00014430802548304;-0.00061643758090213;-0.00024646343081258;-0.00032916510826908;1.3652583220392e-05;-4.9668382416712e-05;3.858642958221e-05;-0.00036155953421257;1.7597800251679e-05;-0.00024552852846682;1.6285208403133e-05;0.00024906222824939;2.7342313842382e-05;-4.2822826799238e-05;-0.00010951495642075;-0.00015972756955307;-0.00017548400501255;-5.8564950450091e-05;4.3257881770842e-05;0.00010953077435261;-5.7590412325226e-05;0.00024525556364097;-3.7122674257262e-05;9.6075229521375e-05;1.0708576155594e-05;-0.0011198316933587;3.9132180972956e-05;-0.0011110183550045;0.00018477129924577;1.5151072148001e-05;-0.00028915866278112;1.9565639377106e-05;-0.00017335207667202;0.00034401600714773;-0.00035790243418887;0.0001366137585137;0.00019966825493611;-6.8744244344998e-05;0.0018194960430264;-1.5399171388708e-05;0.00018835706578102;-9.0307645450594e-07;0.00029819548944943;-2.6074965717271e-05;7.1951668360271e-05;0.00027518125716597;0.00013486963871401;0.00043357536196709;-0.0021812506020069;-1.8928938516183e-05;-0.0018955578561872;-0.00021482945885509;0.00045317530748434;1.6810698070913e-05;-0.00015628694382031;6.2553612224292e-05;7.5055111665279e-05;0.00012371013872325;-0.00064517080318183;-0.0004498312191572;-0.00014778393961024;0.00077777454862371;-0.00011439104855526;0.0010145660489798;-0.00063065683934838;0.00087391922716051;-0.00029410887509584;7.6689448178513e-06;-7.5796488090418e-05;0.0027274808380753;3.3148869988509e-05;-6.2066319514997e-05;-6.7438355472405e-05;-0.00010126860433957;-5.1028058805969e-05;0.00012157380115241;-0.00016065208183136;-0.00014881438983139;-4.5766842958983e-05;0.0014353573787957;-2.9028173230472e-05;2.8807304261136e-05;-0.00022300935233943;0.00047901654033922;6.9602363510057e-05;-0.00018082793394569;-0.00014336050662678;0.00087763892952353;8.5278457845561e-05;-0.00086760561680421;0.00027326127747074;0.00029311113758013;0.00029020756483078;0.00011401727533666;-0.00081910809967667;-0.00016399484593421;-0.00060648407088593;7.6195377914701e-05;5.718060037907e-06;5.5991844419623e-05;-0.00075542408740148;2.6241612431477e-05;-0.00025788924540393;2.5579229259165e-05;0.00019539514323696;2.19026223931e-05;-4.9259517254541e-05;-0.00011424200056354;-0.0002131929359166;-8.2686710811686e-05;-0.00014167222252581;5.665912249242e-05;-0.00020595296518877;-0.00014063742128201;0.0003849726927001;-2.4006281819311e-05;9.515762940282e-05;2.0777013560291e-05;-0.0014369520358741;8.8390988821629e-05;-0.0012591244885698;0.00024887177278288;0.00010248959733872;-0.00013526959810406;-4.6459357690765e-05;-0.00022074891603552;0.00021630720584653;-0.00036089654895477;0.00011220997112105;0.00032524802372791;-0.00011236914724577;0.0022958158515394;-1.9799883375526e-05;0.00025630835443735;-1.6172301911865e-05;0.000354331365088;-1.9489303667797e-05;6.4840511186048e-05;0.00020877938368358;0.0001218312754645;0.00033137097489089;-0.0017222062451765;1.1975717825408e-05;-0.0014318668982014;-0.00021478258713614;0.00044760527089238;5.6776138990244e-06;-0.00011081704724347;3.9237867895281e-05;0.00019607413560152;0.00011858181096613;-0.00060887652216479;-0.00037910198443569;-0.00018793914932758;0.00052940048044547;-5.9424772189232e-05;0.00083709502359852;-0.00046398903941736;0.00077916140435264;-0.00021408367319964;-5.741486165789e-05;-7.9842735431157e-05;0.0020414006430656;3.4603399399202e-05;-0.00010114575707121;-5.3258208936313e-05;-6.3396750192624e-05;-4.8997539124684e-05;0.00011375515896361;-0.0001257751864614;-0.00013715984823648;-0.00010366949572926;0.0011854317272082;-2.8964937882847e-05;0.0002804663090501;-0.00014859702787362;0.0003020605945494;4.382058250485e-05;-0.00020011480955873;-0.00012630342098419;0.0007459768676199;5.6278946431121e-05;-0.00054809852736071;0.00024497698177584;0.00031746170134284;0.00012079273437848;4.3553147406783e-05;-0.00068414345150813;-2.1490570361493e-05;-0.00063430931186303;0.00010453547292855;6.8215391365811e-05;5.6836604926502e-05;-0.00083271466428414;2.4412902348558e-05;-0.00017467759607825;2.6582167265587e-05;7.9859099059831e-05;6.2449921642838e-06;-3.0076666007517e-05;-7.1608505095355e-05;-0.00019542894733604;4.1173607314704e-05;-0.0002156768750865;5.008409061702e-05;-0.00042655289871618;-0.00016270542982966;0.0003693250764627;-9.7880058547162e-07;4.0334234654438e-05;2.3790025807102e-05;-0.0012103266781196;9.9608463642653e-05;-0.00092684378614649;0.00020835858595092;0.00012884891475551;5.104098454467e-05;-9.0065695985686e-05;-0.00015423171862494;1.4800184544583e-05;-0.00019971426809207;4.164881829638e-05;0.00035836629103869;-0.00011265386274317;0.0019054908771068;-1.7000540537992e-05;0.00023328307725023;-2.3258242435986e-05;0.00026472460012883;-0.00017931667389348;6.273172039073e-05;4.4458309275797e-05;-0.0001403326750733;0.0019808292854577;-0.00027639244217426;0.0011556177632883;-7.0858142862562e-05;-0.00056398386368528;0.00029991124756634;0.00032848320552148;-2.6078425435117e-05;-0.00046654947800562;3.9828519220464e-06;0.0008758619078435;-0.00015155144501477;0.00027752143796533;0.00019020440231543;-0.00034431065432727;-0.00087942148093134;7.3399802204221e-05;-0.00082912377547473;0.00038554504862987;-0.00023250843514688;0.00013215954822954;-0.0019539026543498;0.00010483303049114;0.00017198795103468;-3.2981661206577e-05;2.4098946596496e-05;3.5685330658453e-05;0.00024197497987188;-9.6985095296986e-05;-0.0005485225119628;-0.00014320031914394;0.0013078965712339;-0.00016056811728049;0.00083134742453694;-6.3148734625429e-05;-4.4526201236295e-05;1.8384513168712e-05;-0.00066258013248444;5.6997232604772e-05;0.0006004361785017;-0.00012766626605298;7.9481294960715e-05;-2.4136457795976e-05;0.00049367389874533;0.0005412808386609;-5.6152184697567e-05;-0.00091839081142098;-0.00010691133502405;-0.00090435682795942;0.00011984979937552;0.0011495694052428;0.00013137314817868;-0.0017589784692973;0.00010197594383499;1.8779771835398e-06;1.1600146535784e-05;-0.00012385507579893;5.2259052608861e-05;-4.309675659897e-06;-1.6020025213948e-05;-0.00019028221140616;-0.0001247634208994;0.00053714617388323;0.00012039564899169;-0.00065980723593384;-4.090729271411e-05;0.00031746458262205;-0.00019966304535046;-4.2298004700569e-05;4.7390840336448e-05;-0.001393964397721;-1.517396322015e-05;-0.00069721619365737;0.0001269239874091;0.00036284647649154;0.00049476372078061;0.0005294953007251;-0.00069686339702457;-0.00011536280362634;-0.00070887350011617;-0.00026226713089272;0.00042303136433475;1.1291795090074e-05;0.00176007731352;-5.8010671637021e-05;0.00026448746211827;-1.7365329767927e-05;0.00027272719307803;-2.4893408408388e-05;-0.00020691218378488;7.4114184826612e-05;7.1494643634651e-05;-0.00015525065828115;0.0022730100899935;-0.00032192893559113;0.0013617111835629;-6.9735549914185e-05;-0.00062982900999486;0.00034167757257819;0.0003985507064499;-3.3712607546477e-05;-0.00051792309386656;2.6293143946532e-06;0.0010089529678226;-0.00017616305558477;0.00028179326909594;0.00014808526611887;-0.00045217041042633;-0.00095408782362938;0.00010836272122106;-0.00087402283679694;0.00046808007755317;-0.00031591323204339;0.00015202109352686;-0.0023282081820071;0.00011601066944422;0.00019250079640187;-3.5507368011167e-05;2.7030926503357e-05;4.5339493226493e-05;0.00027176158619113;-0.00010794078116305;-0.00064896902767941;-0.00016105380200315;0.0015347359003499;-0.00016335284453817;0.00090007926337421;-7.897137402324e-05;-2.9035831175861e-05;8.6229947555694e-06;-0.00075326813384891;6.4895102696028e-05;0.00067485123872757;-0.0001497997000115;4.8034071369329e-05;-1.9751034415094e-05;0.00056753581156954;0.00063549348851666;-2.8869912966911e-06;-0.0010623729322106;-0.00012545257050078;-0.0010635145008564;9.4352217274718e-05;0.0013594531919807;0.00014354493760038;-0.0019998054485768;0.00011692259431584;-1.6341587070201e-06;1.6228104868787e-05;-0.00012680843065027;5.8107016229769e-05;-7.7877384683234e-06;-1.3474629668053e-05;-0.00019107693515252;-0.00016862282063812;0.0008588153286837;8.3254293713253e-05;-0.00068603304680437;-6.3610430515837e-05;0.00034172559389845;-0.00020670448429883;-2.7240610506851e-05;5.2173025324009e-05;-0.0015599739272147;-2.7357747967471e-05;-0.00079373037442565;0.00013163653784432;0.00042755887261592;0.00055143795907497;0.0005771973519586;-0.00090417265892029;-8.0699799582362e-05;-0.00091178732691333;-0.00023328624956775;0.00037918443558738;3.432302037254e-05;0.0019437340088189;-4.6021850721445e-05;0.00028942650533281;-1.9093353330391e-05;0.00029131321934983;-2.1106237909407e-05;-0.00014562686556019;4.9176138418261e-05;3.7524514482357e-05;-9.3662994913757e-05;0.0014688308583573;-0.000183350770385;0.00088480924023315;-3.669249417726e-05;-0.00039426528383046;0.00021329153969418;0.00028726196615025;-2.2126840121928e-05;-0.00054184679174796;4.259856268618e-06;0.00063856062479317;-0.00010894948354689;0.0001837310846895;0.00010752337402664;-0.00029526907019317;-0.00060457427753136;4.7565496060997e-05;-0.00055848900228739;0.00028327788459137;-0.00015298493963201;9.3270551587921e-05;-0.0014687740476802;6.3146639149636e-05;0.00016627559671178;-2.4279914214276e-05;7.275879761437e-05;2.9628605261678e-05;0.0001774432748789;-6.7814704379998e-05;-0.00049020280130208;-9.8649754363578e-05;0.0009097633883357;-9.6690499049146e-05;0.00060269422829151;-4.4902884837938e-05;6.4866985667322e-06;-4.2736537579913e-06;-0.00051355257164687;3.7663496186724e-05;0.00042956628021784;-0.00010176308569498;-4.7922920202836e-05;-6.941306310182e-06;0.00037833579699509;0.00041493633762002;-7.0103133111843e-06;-0.00065025506773964;-9.8651573352981e-05;-0.0006773418863304;5.1195314881625e-05;0.0010502024088055;9.5431991212536e-05;-0.0013010400580242;7.0317481004167e-05;4.3425875446701e-06;1.4414339602808e-05;-7.3965056799352e-05;3.8184462027857e-05;3.2074327464215e-05;-1.8534050468588e-05;-0.00019694387447089;-0.00010947982082143;0.00044743926264346;5.7456083595753e-05;-0.00050735863624141;-4.4359680032358e-05;0.00024137427681126;-0.00013287975161802;-0.00010401437612018;4.1576397052268e-05;-0.0011357846669853;-1.8620658011059e-05;-0.00054894329514354;8.396234625252e-05;0.00026892271125689;0.00029877730412409;0.00036757948691957;-0.00053018965991214;-3.2307056244463e-05;-0.00053344084881246;-0.00013772259990219;0.00044130216701888;1.1999461094092e-05;0.0014288873644546;-3.0437227906077e-05;0.00021441194985528;-1.3014038813708e-05;0.00016792488167994;-9.6577650765539e-06;-2.8788603231078e-05;7.7150310971774e-05;6.0339916672092e-05;-1.953991704795e-05;8.5949650383554e-05;-0.00070899113779888;-1.9303594456233e-07;-0.00054952898062766;-0.00011628579522949;0.00022251774498727;1.1533684300957e-05;-0.00015774638450239;5.2599460786951e-07;0.00036063394509256;6.2732418882661e-05;-0.0003159279585816;-7.8328332165256e-05;1.7234633560292e-05;0.00021416229719762;-4.6111854317132e-05;0.00024243381631095;-0.00014770061534364;0.0001961393863894;-5.8115667343372e-05;7.3822142439894e-05;-2.4204753572121e-05;0.00082591659156606;1.7253480109503e-05;-9.8887539934367e-05;-2.4384911739617e-05;-9.3610557087231e-05;-4.301815351937e-05;9.3678412667941e-05;-3.0809867894277e-05;-0.00026539570535533;-1.1853376236104e-05;0.00043160578934476;-3.5708617360797e-05;0.00019985157996416;-2.573126948846e-05;5.0933416787302e-05;4.0785129385768e-05;-0.00023770912957843;-6.563790520886e-05;0.00019907114619855;5.3405333346745e-06;-0.00011598637502175;0.00016078910266515;0.00020597242109943;0.00010487326653674;-5.1764822273981e-05;-0.00025881349574775;-5.4489391914103e-05;-0.00034606677945703;2.0210569346091e-05;0.00055003608576953;4.7173278289847e-05;-0.00058432284276932;5.9930730458291e-06;3.3681128570606e-06;2.2115846149973e-05;-1.4490068679152e-05;-1.2040306501149e-05;2.4631099222461e-05;-8.7533684563823e-05;-0.00017243620823137;5.6553983540653e-07;0.00033941029687412;-4.9229606702283e-06;-0.00024171792028937;-5.6214943469968e-05;0.00013964386016596;2.8508195100585e-05;-3.6461209674599e-05;2.2234128209675e-06;-0.00070724578108639;3.3591535611777e-05;-0.00035894307075068;0.00018021212599706;8.7655673269182e-05;0.00010593166371109;1.8269249267178e-05;-0.00030281647923402;3.0458425044344e-06;-0.00028142228256911;1.5478331988561e-05;0.00026942795375362;-2.8358788767946e-05;0.00083255051868036;-1.6904607036849e-05;0.00011298089521006;-1.9889603208867e-06;0.00011488103336887;-4.1467988921795e-05;0.00011092493514298;0.00014324292715173;2.7993055482511e-05;0.00021480585564859;-0.0013898951001465;-1.0173964710702e-06;-0.0011109437327832;-0.00019173842156306;0.00038477263296954;1.6930092897383e-05;-0.00021713254682254;9.1380834419397e-06;0.0004352968535386;0.00010336714331061;-0.00053781503811479;-0.0002238133456558;-3.5046992707066e-05;0.00042967635090463;-7.8142395068426e-05;0.00056586239952594;-0.00033419125247747;0.00048544688615948;-0.00014016657951288;6.0064467106713e-05;-4.7016525059007e-05;0.0016307029873133;3.1737858080305e-05;-0.0001309915096499;-4.1142993723042e-05;-0.0001294406974921;-6.8555382313207e-05;0.0001493211457273;-8.8348126155324e-05;-0.00034664451959543;-3.770461626118e-05;0.00087047269335017;-4.4476462790044e-05;0.00027730289730243;-7.7142984082457e-05;0.00016495579620823;6.8894776632078e-05;-0.0003457386046648;-0.0001110689190682;0.0004659500264097;2.160951589758e-05;-0.00032366818049923;0.00027588909142651;0.00031182175735012;0.00015719694783911;-3.0301380320452e-05;-0.0005335503956303;-8.0392332165502e-05;-0.00054355699103326;5.0294373068027e-05;0.00063747400417924;6.9230911321938e-05;-0.00090178084792569;1.0300900612492e-05;-5.4691397963325e-05;3.4260636311956e-05;2.2645599528914e-05;-1.0311179721612e-05;9.9111794042983e-06;-0.00012615810555872;-0.00024374968779739;-6.7637474785442e-06;0.0003423441958148;4.2990491238015e-06;-0.00034135321038775;-0.00010856989683816;0.00026148036704399;2.7738742574002e-05;-1.0975438271998e-05;3.478582129901e-06;-0.0011768653057516;6.6396925831214e-05;-0.00072458939393982;0.0002873461053241;0.00018329263548367;0.00012128681555623;-2.3595353923156e-05;-0.0004253335937392;3.0261024221545e-05;-0.00044916223851033;4.7702760639368e-05;0.00038201385177672;-5.9778300055768e-05;0.0015401196433231;-2.3393198716803e-05;0.00020546461746562;-7.7708255048492e-06;0.0002252329577459;-5.4882064432604e-05;0.00014663560432382;0.00020613905508071;5.5243617680389e-05;0.00032969852327369;-0.0019707279279828;2.7991129172733e-05;-0.0015175228472799;-0.0003086039214395;0.00061831285711378;1.6884687283891e-05;-0.00026187568437308;9.098869668378e-06;0.00051775167230517;0.00016547352424823;-0.00084515137132257;-0.00034001289168373;-9.6265561296605e-05;0.00054037559311837;-0.0001142940891441;0.00085291377035901;-0.00047399965114892;0.00077551876893267;-0.00019159250950906;5.8401783462614e-05;-9.5685565611348e-05;0.0022512993309647;4.9465841584606e-05;-0.00018104171613231;-5.7683650084073e-05;-0.00011186504707439;-0.00010195690265391;0.00021529971854761;-0.00014516469673254;-0.0004347113717813;-0.00011011294554919;0.001338804140687;-6.4137711888179e-05;0.00054075109073892;-8.016599167604e-05;0.00015643917140551;9.2498594312929e-05;-0.00049976713489741;-0.00015847146278247;0.00070347997825593;1.6355339539587e-05;-0.00027285332907923;0.00041757666622289;0.00048450677422807;0.00013331259833649;-4.856754821958e-05;-0.00083963619545102;-2.6556988814264e-05;-0.00084957131184638;0.00010589618614176;0.00077692337799817;0.00010635163926054;-0.0014235974522308;1.2307935321587e-05;-5.723788854084e-05;5.2274794143159e-05;-4.0269074816024e-05;-1.1942871424253e-05;-1.2676468031714e-05;-0.00016056766617112;-0.00028643742552958;4.7909739805618e-05;0.00047896563773975;2.1377936718636e-06;-0.00056973291793838;-0.00018457732221577;0.00038460450014099;3.9363483665511e-05;3.3358963264618e-05;3.1697688882559e-06;-0.0015533966943622;0.0001133326877607;-0.00093535555060953;0.00041339520248584;0.00036484733573161;0.00028464486240409;-9.7723575890996e-05;-0.00062619906384498;-6.5817977883853e-05;-0.00064874731469899;5.3788706281921e-05;0.00043191446457058;-8.9935812866315e-05;0.0020456470083445;-2.9320630346774e-05;0.00027485517784953;-2.042725100182e-05;0.00032092334004119;-4.4873362639919e-05;0.00012565338693094;0.00017592807125766;5.8216599427396e-05;0.00028193549951538;-0.0017016254132614;4.332122989581e-05;-0.0012581823393703;-0.00028631105669774;0.00057597819250077;8.8207370936288e-06;-0.00020899744413327;4.2772644519573e-06;0.00046972697600722;0.00015167667879723;-0.00077044771751389;-0.00031323009170592;-0.00013761389709543;0.00040224698022939;-8.1544334534556e-05;0.00077152153244242;-0.00038666470209137;0.00073911342769861;-0.000156136622536;2.0265437342459e-05;-9.6709969511721e-05;0.0018634854350239;4.643033753382e-05;-0.00016981858061627;-4.8584981414024e-05;-7.7857293945272e-05;-9.1932750365231e-05;0.00019179104128852;-0.0001326637720922;-0.00036679342156276;-0.00013307755580172;0.0011843303218484;-5.6621567637194e-05;0.00059003179194406;-4.5470722398022e-05;7.9630823165644e-05;7.6129581429996e-05;-0.00044835155131295;-0.00013988179853186;0.00062806700589135;2.3138084088714e-06;-0.00013343390310183;0.00037797761615366;0.00044729394721799;4.82069553982e-05;-5.4265336075332e-05;-0.00075404939707369;3.7699712265749e-05;-0.00078674376709387;0.00011413015454309;0.00065650831675157;9.9437747849151e-05;-0.0013372033135965;9.818760190683e-06;-3.5386612580623e-05;4.9213456804864e-05;-7.6705531682819e-05;-1.553908441565e-05;-1.0813228072948e-05;-0.00011953403736698;-0.00025236079818569;0.00010238731920253;0.00031006149947643;6.3711313487147e-06;-0.00059832941042259;-0.00018517373246141;0.00035661918809637;4.0844934119377e-05;1.9145250917063e-05;8.2324231698294e-06;-0.0013453071005642;0.00011407551937737;-0.00076899147825316;0.00035690332879312;0.00035605818266049;0.0003219295758754;-0.00013104513345752;-0.00050611817277968;-0.00014348678814713;-0.00050998240476474;2.0956871594535e-05;0.00041518092621118;-9.1800095106009e-05;0.0017751089762896;-2.5267871023971e-05;0.00024374191707466;-2.4964048861875e-05;0.00028109629056416;-0.00024854019284248;9.2961498012301e-05;0.00019008896197192;-8.9490662503522e-05;0.0018122902838513;-0.00021874098456465;0.00088022259296849;-9.2631053121295e-05;-0.00054892542539164;0.00029135940712877;0.0004958770587109;-4.4819615141023e-05;-0.00056599022354931;2.4976230633911e-05;0.00081269996007904;-0.00013849639799446;0.0001348011137452;0.00011646610073512;-0.00018559333693702;-0.00069574388908222;9.9358541774563e-05;-0.00075268134241924;0.00029135413933545;-0.00053114903857931;8.8499444245826e-05;-0.0015281717060134;9.877637057798e-05;0.00015973555855453;-2.7300253350404e-05;5.9123267419636e-05;1.9683520804392e-05;0.00030044023878872;-0.00012205082020955;-0.00080127542605624;-0.00012519019946922;0.00077526539098471;-0.00011387488484615;0.00087473698658869;-4.6908950025681e-05;-0.00020784708613064;0.00010593818296911;-0.00088568503269926;8.2093560195062e-05;0.00023994862567633;-9.391363710165e-05;0.00037074615829624;-6.7476787080523e-05;0.00054598291171715;0.00047897803597152;-0.00013950913853478;-0.0007316212868318;-0.00016695841623005;-0.00065432820701972;0.00010825585923158;0.0018919636495411;8.8132990640588e-05;-0.0018115720013157;9.7125637694262e-05;0.00013598677469417;-9.3255048341234e-06;-0.00017290969844908;5.4851905588293e-05;3.2407744583907e-05;-3.7060231989017e-05;-0.00023143060388975;-0.00014846955309622;0.0010397027945146;0.00011156711843796;-0.00055375625379384;-9.3183960416354e-05;0.00021461633150466;-0.00016609684098512;-0.00010841525363503;6.8831192038488e-05;-0.0013407149817795;-3.2914165785769e-05;-0.0004919373895973;0.0001135886850534;0.00045683007920161;0.00067914294777438;0.00066013919422403;-0.00097723281942308;-0.00013956887414679;-0.0010360366431996;-0.00030471326317638;0.0004813697305508;1.3133792890585e-05;0.001327131409198;-1.6353978935513e-05;0.00023999455152079;-1.9138633433613e-05;0.00028001944883727;-2.145166763512e-05;-0.00027817618683912;0.00010518883937038;0.00023324487847276;-8.9967572421301e-05;0.0020082537084818;-0.00024785890127532;0.0010151877067983;-9.3388247478288e-05;-0.00060864473925903;0.00033125595655292;0.00057332403957844;-5.3432289860211e-05;-0.00064555858261883;2.7521005904418e-05;0.00092606263933703;-0.00016117596533149;0.00010802244651131;5.638004586217e-05;-0.00026461968082003;-0.00070792797487229;0.00013332557864487;-0.0007589099695906;0.00035144816501997;-0.00063466094434261;9.6204370493069e-05;-0.001776983612217;0.00010789059160743;0.00018518214346841;-2.8878474040539e-05;6.4671046857256e-05;2.7019821573049e-05;0.00032703566830605;-0.00013100552314427;-0.00090872414875776;-0.00013309356290847;0.0009286999120377;-0.00012236533802934;0.00097171205561608;-6.4908104832284e-05;-0.00021780392853543;0.0001085142721422;-0.00097935867961496;8.560062997276e-05;0.00028053633286618;-0.00011240239109611;0.00038437472539954;-6.7530032538343e-05;0.00060593045782298;0.00056343647884205;-0.00010758901771624;-0.00083051616093144;-0.00019318333943374;-0.00079977285349742;0.00010171969188377;0.0021458563860506;0.0001000103802653;-0.0020581535063684;0.00011295822332613;0.00014599166752305;-4.4750263441529e-06;-0.00019146590784658;5.9970530855935e-05;3.3748448913684e-05;-3.6108587664785e-05;-0.00023036831407808;-0.00018874308443628;0.0014247290091589;7.7671065810136e-05;-0.00058409792836756;-0.00012584748037625;0.00022798462305218;-0.00017082817794289;-9.9548502475955e-05;7.4449068051763e-05;-0.0014656299026683;-4.8116911784746e-05;-0.00053676648531109;0.00011790700955316;0.00051638565491885;0.00074616092024371;0.0007365265628323;-0.0011964520672336;-0.00010489999840502;-0.0012687280541286;-0.00028658067458309;0.00042699914774857;3.2804640795803e-05;0.0014225331833586;1.9872870780091e-06;0.00025366307818331;-1.9034090655623e-05;0.00028588695568033;-1.7686325008981e-05;-0.00017217615095433;5.96499958192e-05;0.00011951220221817;-4.7127821744652e-05;0.0012164051877335;-0.00011834050383186;0.00063119234982878;-4.7730591177242e-05;-0.00036890531191602;0.00020081170077901;0.00035927360295318;-2.8014726922265e-05;-0.00066816789330915;1.7664282495389e-05;0.00056818762095645;-9.7596617706586e-05;7.4719457188621e-05;5.8262321545044e-05;-0.00016539222269785;-0.00042333090095781;5.0025562813971e-05;-0.00045428739394993;0.00018505814659875;-0.00028201544773765;5.0109818403143e-05;-0.0010526257101446;5.5559710745001e-05;0.00017567518807482;-2.0204646716593e-05;0.00010407494119136;1.973378493858e-05;0.00018679756612983;-7.1473812568001e-05;-0.00061460258439183;-7.7540578786284e-05;0.00054209632799029;-7.2199247370008e-05;0.00062783167231828;-3.6484179872787e-05;-9.7017211373895e-05;4.8724799853517e-05;-0.0005871647153981;4.1512932511978e-05;0.00019707529281732;-8.0072371929418e-05;0.00014039964298718;-3.0575472919736e-05;0.00038307250360958;0.00036764610558748;-6.1069593357388e-05;-0.00049164664233103;-0.00013724337622989;-0.00052261701785028;5.3171330364421e-05;0.0014369685668498;7.2985829319805e-05;-0.0012923298636451;6.5316191466991e-05;8.2944781752303e-05;5.3756966735818e-06;-0.00011742263450287;3.7540165067185e-05;6.9691195676569e-05;-3.3399035601178e-05;-0.00024381100956816;-0.00011287844245089;0.0006563519127667;5.9088528360007e-05;-0.00046396665857174;-7.1842652687337e-05;0.00017839150677901;-0.00010871284030145;-0.00017324280634057;5.5125448852777e-05;-0.0010626949369907;-2.646807115525e-05;-0.00038597226375714;7.2690694651101e-05;0.00029171432834119;0.00034631244488992;0.00042945719906129;-0.00061480398289859;-3.1181258236757e-05;-0.00063993892399594;-0.00016054278239608;0.00054094358347356;1.9284132122266e-06;0.0011194203980267;-6.9557454480673e-06;0.0001799585588742;-1.2710093869828e-05;0.00015499658184126;-6.9492539296334e-06;-0.00010301798465662;3.3887336030602e-05;0.0001130127129727;-1.0141575330636e-06;0.00060162972658873;-3.2560670661042e-05;0.00028646661667153;-2.6892130335909e-05;-0.00019026664085686;0.0001108042706619;0.00024100409063976;-1.7342243154417e-05;-0.00052085320930928;7.2564985202916e-06;0.00029731876566075;-5.4996588005451e-05;-2.0274115740904e-05;3.6032355410498e-07;-6.9946232542861e-05;-0.00014126978931017;2.6872410671785e-05;-0.00018934618856292;6.7100139858667e-05;-0.00021582080808003;1.0751060472103e-05;-0.00046951990225352;2.8931524866493e-05;0.0001269924105145;-7.403476502077e-06;9.3197988462634e-05;1.4938318599889e-05;9.2917653091718e-05;-3.2845837267814e-05;-0.00041781051550061;-2.7456486350275e-05;0.0001858596369857;-2.5737726900843e-05;0.0003687898570206;-2.3538608729723e-05;-7.5242831371725e-05;3.612394357333e-05;-0.000324424210703;1.5535502825514e-05;3.5690725781024e-05;-4.5933396904729e-05;8.7658467236906e-05;-1.7443386241212e-05;0.00021173221466597;0.00021322732209228;-1.8343049305258e-05;-0.00020646522170864;-0.00010099412611453;-0.00029125483706594;9.9286680779187e-06;0.0010031795827672;3.671780359582e-05;-0.00074050284456462;3.6512647056952e-05;6.1004680901533e-05;7.5094221756444e-06;-7.4390358349774e-05;1.9995259208372e-05;7.7938835602254e-05;-2.6979823815054e-05;-0.00019558587518986;-6.7886197939515e-05;0.00042326058610342;2.265521834488e-05;-0.00027512726956047;-5.3068433771841e-05;8.944245200837e-05;-4.6830566134304e-05;-0.00017522243433632;3.9302154618781e-05;-0.00064049690263346;-1.527547101432e-05;-0.00018667477706913;3.3838638046291e-05;0.00015021106810309;0.00013710462371819;0.00024173392739613;-0.00033699220512062;2.3271464669961e-05;-0.00035936568747275;-6.4998515881598e-05;0.00044750337838195;-9.4012002591626e-06;0.00061425438616425;4.0124377846951e-06;8.9385539467912e-05;-7.5873858804698e-06;6.8005276261829e-05;-4.2724724380605e-07;-6.5466942032799e-05;2.0781842977158e-05;0.00010871861013584;1.5790064935572e-05;0.00033122338936664;-3.145255277559e-06;0.00014146704052109;-1.864209480118e-05;-0.00010772333916975;7.0074936957099e-05;0.00017499465320725;-1.2292560313654e-05;-0.00038688641507179;-7.4547580197759e-07;0.00017349034897052;-3.661859955173e-05;-5.9447393141454e-05;-2.7216507078265e-05;-3.4441611205693e-05;-2.231694816146e-05;2.1727961211582e-05;-7.3170973337255e-05;2.4309953005286e-05;-0.00019567995332181;-2.4320149805135e-06;-0.00023352143762168;2.0183113520034e-05;9.0959234512411e-05;-5.8787185253095e-07;7.2665832703933e-05;1.3948416381027e-05;4.8314290324925e-05;-1.5138470189413e-05;-0.00030042952857912;-5.2580458032025e-06;5.4955857194727e-05;-5.8745699789142e-06;0.00023652690288145;-1.9261931811343e-05;-6.4275103795808e-05;2.9071692551952e-05;-0.00018943412578665;4.3748364078056e-06;-2.6270039597875e-05;-2.9782848287141e-05;6.4920961449388e-05;-1.0987859241141e-05;0.00012527008948382;0.00014052887854632;8.8433880591765e-06;-8.5879786638543e-05;-7.6417069067247e-05;-0.00019188807345927;-1.1026586435037e-05;0.0007346051861532;1.8909322534455e-05;-0.00047161604743451;2.4339358787984e-05;4.3800617277157e-05;8.2718152043526e-06;-5.0597678637132e-05;1.1404565157136e-05;6.9937799707986e-05;-2.02410374186e-05;-0.0001503151434008;-4.58395552414e-05;0.00033015522058122;3.3438432183175e-06;-0.00016824636259116;-4.221575363772e-05;4.5204717025626e-05;-1.8414164514979e-05;-0.00014978060789872;2.8690230465145e-05;-0.00041338813025504;-8.7361795522156e-06;-9.5710769528523e-05;1.6402920664405e-05;8.2269812992308e-05;4.970574809704e-05;0.00014875760825817;-0.00021344993729144;4.4369648094289e-05;-0.0002379044162808;-1.8975406419486e-05;0.00034525123191997;-1.163794513559e-05;0.00035314122214913;7.7267104643397e-06;4.1649193008197e-05;-5.0897888286272e-06;3.2003972592065e-05;1.3353337635635e-06;-1.9934168449254e-05;5.2298277296359e-05;-8.5281624251365e-07;-8.4029903518967e-05;-1.7142120896096e-06;-0.00024914834648371;2.3774287001288e-06;-0.00015240916400217;-6.2616352806799e-05;0.00010336321429349;9.0035237008124e-06;-0.00012669597344939;1.0147780358238e-06;0.00029204617021605;3.5257649869891e-05;-0.0001539260847494;4.6820368879708e-05;6.4809901232366e-05;6.1873863160145e-05;-3.6975019611418e-05;4.710369012173e-06;-1.5684148820583e-05;-1.1567074579943e-05;-1.8587144268167e-06;0.00014494666538667;-1.3081227734801e-05;0.00026389266713522;3.60460921911e-06;-6.9641915615648e-05;-1.5203095244942e-05;-7.0681293436792e-05;-2.1252306396491e-05;4.645674925996e-05;1.6097870684462e-05;-0.00021451828069985;1.4409144569072e-05;9.375557419844e-05;-3.3380478271283e-05;0.00012690806761384;1.1858656762342e-05;-3.3843585697468e-05;2.0071473045391e-05;-0.00013934150047135;-3.3032647479558e-05;-1.8963959519169e-05;-6.0255074458837e-06;3.3954202081077e-05;7.007328531472e-05;0.00012753046758007;8.8298467744607e-05;-6.7282016971149e-05;-4.2488056351431e-05;-5.0775415729731e-05;-0.0002026606380241;-7.5399075285532e-06;0.00051032181363553;3.3366242860211e-05;-0.00034245260758325;3.4801062156475e-06;4.016981984023e-05;1.2858358786616e-05;-3.6053352232557e-05;-1.2828858416469e-05;4.060732680955e-05;-5.9317462728359e-05;-0.000130143147544;-4.6222257878981e-06;0.00036892871139571;-1.5187344615697e-05;-0.00014766133972444;-1.3142001989763e-05;4.4879787310492e-05;2.7688913178281e-05;-6.3201950979419e-05;2.3555815005238e-06;-0.00037873545079492;7.8505372584914e-06;-0.0001019494884531;9.5547628006898e-05;1.1729604921129e-05;8.7795320723671e-05;5.8208555856254e-05;-0.00021370373724494;6.2928671695772e-07;-0.00018705827824306;-6.9165666900517e-06;0.00021008669864386;-3.5728094189835e-06;0.00031210653833114;-1.198812151415e-05;3.2960775570245e-05;2.1938387817499e-06;4.6459663280984e-05;-3.5520530218491e-05;9.2091591795906e-05;3.0998264264781e-05;-7.7364966273308e-05;4.8424310080009e-05;-0.00060150085482746;8.2388842201908e-06;-0.00040163216181099;-0.00011869686568389;0.0002197115245508;1.4704132809129e-05;-0.0001943669776665;-6.7243477133161e-06;0.0004352098912932;6.310496974038e-05;-0.00030780560337007;-1.0275796739734e-05;4.9018664867617e-05;0.00014159476268105;-5.4485673899762e-05;0.00015335284115281;-9.0865854872391e-05;0.00013040154590271;-2.8287489840295e-05;0.00015714282926638;-2.5326320610475e-05;0.00062958052149042;1.4815294889559e-05;-0.00011016405187547;-2.1240917703835e-05;-0.00010413163545309;-4.6269324229797e-05;9.8480290034786e-05;-1.1952872227994e-05;-0.00033487702603452;-5.1556003199948e-07;0.00028517819009721;-4.1125065763481e-05;0.00024616412702017;5.7005713642866e-06;-2.0072990082554e-05;4.2237446905347e-05;-0.00027022577705793;-5.8914010878652e-05;7.9668840044178e-05;-7.582174930576e-06;8.2324168033665e-06;0.00016545613470953;0.00021338283841033;9.2109235993121e-05;-8.991621871246e-05;-0.00018417368119117;-5.0663747970248e-05;-0.00033179839374498;9.2742238848587e-06;0.00075033964822069;5.028649684391e-05;-0.00062333862297237;2.4102985207719e-06;4.7148478188319e-05;2.3763541321387e-05;-4.8407302529085e-05;-2.0943030904164e-05;4.5135358959669e-05;-9.2901027528569e-05;-0.00019817898282781;1.2357267223706e-05;0.00048330944264308;-1.9641796825454e-05;-0.00026613660156727;-4.8232857807307e-05;0.0001119309963542;4.1658513509901e-05;-7.1568829298485e-05;-2.7122308665639e-07;-0.00068945391103625;2.9227381673991e-05;-0.00025761354481801;0.00019383981998544;0.00010871278936975;0.00016636110376567;2.7820957257063e-05;-0.00036212310078554;-2.918560494436e-05;-0.00033471512142569;7.6434440643425e-07;0.00032131132320501;-1.6616751963738e-05;0.00068430876126513;-1.8563983758213e-05;9.4928916951176e-05;-8.4116703646941e-07;0.00010532054875512;-6.2844592321198e-05;0.000158681141329;7.4952069553547e-05;-9.1202098701615e-05;0.00012946494098287;-0.0011519307736307;2.7483980375109e-05;-0.0007412267732434;-0.00020843479433097;0.00040720199467614;2.5416580683668e-05;-0.00030744550167583;-2.1096375348861e-05;0.00063224061159417;0.00010671641211957;-0.00054674095008522;-8.3725637523457e-05;1.7395164832124e-05;0.00022756253019907;-9.0185007138643e-05;0.00038625876186416;-0.0001991489843931;0.00037753989454359;-6.3693514675833e-05;0.00022465862275567;-5.0774440751411e-05;0.0011312640272081;3.1397343263961e-05;-0.00016602106916253;-2.7791853426606e-05;-0.00014597176050302;-8.8452994532418e-05;0.00018349278252572;-5.7154684327543e-05;-0.00053550803568214;-2.7863245122717e-05;0.00052312237676233;-5.0859805924119e-05;0.0004656725213863;1.3326032785699e-05;-3.5520817618817e-05;7.9212470154744e-05;-0.00048497391981073;-9.3590788310394e-05;0.00019137875642627;-1.8427450413583e-05;3.4306111047044e-05;0.00032311491668224;0.00034090643748641;6.6340529883746e-05;-0.00013297364057507;-0.00038951673195697;-3.2642550650053e-05;-0.00050823204219341;3.5432934964774e-05;0.0011669335654005;7.6464661106002e-05;-0.0010732806986198;-3.0810165299044e-06;7.0898451667745e-05;4.1669532947708e-05;-8.0193618487101e-05;-3.6568264476955e-05;5.219296872383e-05;-0.00013804713671561;-0.00029579497640952;5.0837330491049e-05;0.00069645454641432;-3.6299905332271e-05;-0.00044550420716405;-0.0001043903757818;0.00020254419359844;6.5584601543378e-05;-8.8752232841216e-05;-7.4800655056606e-06;-0.0011419039219618;6.4884501625784e-05;-0.0004547298012767;0.00035377088352107;0.00031731897615828;0.00033215648727491;-4.5762197260046e-05;-0.00061866495525464;-0.00010489555279491;-0.00061901746084914;8.9097775344271e-06;0.00049226731061935;-3.1231356842909e-05;0.0011814238969237;-2.7594927814789e-05;0.00018458701379132;-7.3482801781211e-06;0.00020105320436414;-9.1874680947512e-05;0.00022106530377641;0.00011782605724875;-0.00011165918840561;0.00022773545060772;-0.0016621943796054;5.6537937780377e-05;-0.0010559916263446;-0.00032038136851043;0.00062538351630792;3.7243535189191e-05;-0.00040763872675598;-3.4840733860619e-05;0.00072407588595524;0.00016416545258835;-0.00083060638280585;-0.0001399113680236;1.9542605514289e-05;0.00031122341169976;-0.00014976566308178;0.00059321941807866;-0.00032177974935621;0.00059520534705371;-9.7066462330986e-05;0.0003176900499966;-9.1457295638975e-05;0.0016372428508475;4.719815478893e-05;-0.00020604727615137;-3.7234040064504e-05;-0.00013690603373107;-0.00013859370665159;0.0002800535003189;-0.00010680079867598;-0.00071612768806517;-8.1007769040298e-05;0.00087496126070619;-7.6094256655779e-05;0.00076302967499942;4.9485290219309e-05;-0.00011834177712444;0.0001196887678816;-0.00072854052996263;-0.00013218304957263;0.00032046207343228;-4.3632560846163e-05;0.0001972108730115;0.00049482838949189;0.00051350489957258;3.2017371268012e-05;-0.00018246659601573;-0.00065614026971161;1.5680328942835e-05;-0.00077826698543504;7.0642439823132e-05;0.0015460957074538;0.00012002810399281;-0.0016500661149621;-1.0367637514719e-05;0.00011622415331658;6.3784085796215e-05;-0.00015906714543235;-4.2556348489597e-05;2.7841992050526e-05;-0.00019444795907475;-0.00032160282717086;8.5829153249506e-05;0.0011573168449104;-6.9087487645447e-05;-0.00060819560894743;-0.00016264550504275;0.00027218161267228;8.5718245827593e-05;-3.2237418054137e-05;-2.2142799934954e-05;-0.0014823968522251;0.00010290709906258;-0.00057665642816573;0.00053619651589543;0.00061678269412369;0.00056675903033465;-0.00012913829414174;-0.0010045205708593;-0.00021372728224378;-0.0010372336255386;2.7715836040443e-05;0.00046465214109048;-3.303743142169e-05;0.0014969534240663;-3.4656542993616e-05;0.00024930559447967;-1.56127352966e-05;0.00028973558801226;-7.9304423707072e-05;0.00019448659440968;0.00010827651567524;-8.5956744442228e-05;0.0002021861000685;-0.0014948931057006;6.4513762481511e-05;-0.00090074440231547;-0.00028614158509299;0.00056707678595558;2.9253877073643e-05;-0.00034760474227369;-3.1139134080149e-05;0.00062989024445415;0.00014462305989582;-0.00073897250695154;-0.00015306477143895;-4.6299239329528e-05;0.00022020901087672;-0.00011354827438481;0.00057850731536746;-0.0002676076546777;0.00060925778234378;-8.4888808487449e-05;0.00025959694175981;-8.9053050032817e-05;0.0013896698364988;4.3430627556518e-05;-0.00018052312952932;-3.0142393370625e-05;-0.00011109453771496;-0.00012649054406211;0.00025320443091914;-0.0001056489199982;-0.0006248407298699;-8.7469146819785e-05;0.00075034372275695;-5.8982557675336e-05;0.00072077428922057;5.8838460972765e-05;-0.00013395606947597;0.00010820032912306;-0.00065429240930825;-0.00011289451504126;0.00028326275059953;-4.7559366066707e-05;0.0002256007574033;0.00045161831076257;0.00044407759560272;-2.6018296921393e-05;-0.00015864112356212;-0.00058998679742217;4.6014032704988e-05;-0.0006606203969568;7.1064197982196e-05;0.001346374861896;0.00010482518700883;-0.0014771337155253;-1.3119760296831e-05;0.00010993664182024;5.853137554368e-05;-0.00015501258894801;-4.3091327825096e-05;2.6302193873562e-05;-0.0001504961255705;-0.0002937093086075;0.00012110656825826;0.00086046662181616;-5.2537074225256e-05;-0.00057983916485682;-0.00015835861267988;0.00025159268989228;7.9665944213048e-05;-4.3140986235812e-05;-1.3122482414474e-05;-0.0013126292033121;0.00010101871885126;-0.00050029915291816;0.0004698148695752;0.00057458784431219;0.0005289830151014;-0.00016248832980637;-0.00082567369099706;-0.00024375921930186;-0.00085517670959234;5.906637852604e-06;0.00046866267803125;-4.2593015677994e-05;0.001342419302091;-3.1185347324936e-05;0.0002290288975928;-1.9319950297358e-05;0.00026786368107423;-0.00027933879755437;0.00010949786519632;0.00033079998684116;-3.8188096368685e-05;0.0015152113046497;-0.00015966063074302;0.00054670963436365;-0.00010077353363158;-0.00041522498941049;0.0002163913595723;0.0005951197235845;-6.2224622524809e-05;-0.00046743158600293;2.8952157663298e-05;0.0005835285410285;-9.376658272231e-05;-9.4363176685874e-06;6.748109444743e-05;-2.4094673790387e-05;-0.00048808491555974;0.00011129421181977;-0.00065560510847718;0.00019095771131106;-0.00083215069025755;5.6633030908415e-05;-0.00097059493418783;7.9311641457025e-05;9.6031333669089e-05;-1.2397018508636e-05;7.8870994911995e-05;2.1819350877195e-06;0.00029727941728197;-0.00012007584882667;-0.00089068425586447;-7.9135337728076e-05;7.5992661550117e-06;-2.9831164283678e-05;0.00069325778167695;-3.5394300539338e-06;-0.00025843767798506;0.00013616676733363;-0.00090805324725807;8.8216962467413e-05;-0.00015663570957258;-3.841552825179e-05;0.00043163189548068;-7.9008779721335e-05;0.00047127716243267;0.0002909307659138;-0.00019703528960235;-0.00035355580621399;-0.00018669091514312;-0.0002170119114453;6.0532300267369e-05;0.0022328572813421;2.3853699531173e-05;-0.0013662085402757;5.4138705309015e-05;0.00020188209600747;-2.5969769922085e-05;-0.00012046644405928;4.1131628677249e-05;7.3320734372828e-05;-5.4465665016323e-05;-0.00024911417858675;-0.00012498008436523;0.0011046598665416;9.2949034296907e-05;-0.00036991070373915;-0.00011251305841142;9.6796044090297e-05;-0.00010854900028789;-0.00020234084513504;7.6030417403672e-05;-0.001122176530771;-3.4001015592366e-05;-0.00026927734143101;8.2995655247942e-05;0.00043404207099229;0.00068800436565652;0.00062531296862289;-0.00095755385700613;-0.00014648323121946;-0.0010634685168043;-0.00027907697949558;0.00055958668235689;1.7608356301935e-06;0.00082824495621026;1.3159446098143e-05;0.00021110514353495;-1.9224818970542e-05;0.0002418945368845;-1.6726951798773e-05;-0.00027932794182561;0.00011092018394265;0.0003437596897129;-3.2072297472041e-05;0.0015332759357989;-0.00017495085194241;0.00061226735124364;-9.3044473032933e-05;-0.00043789675692096;0.0002379060460953;0.00061029882635921;-6.4927357016131e-05;-0.00046968876267783;3.0551989766536e-05;0.00064016127726063;-0.00010855658183573;-4.456531314645e-05;-1.4178034689394e-05;-9.838830010267e-05;-0.00043133075814694;0.00013980965013616;-0.00058328220620751;0.00023513451742474;-0.0008657164289616;5.6102522648871e-05;-0.0011017901124433;8.1812468124554e-05;0.00010555486369412;-1.2739484191115e-05;6.653594027739e-05;8.3643399193534e-06;0.00029427791014314;-0.00011716585868271;-0.00089137884788215;-7.8143057180569e-05;0.00018242307123728;-4.7392026317539e-05;0.00074367161141708;-2.7079857318313e-05;-0.00025993803865276;0.000134271060233;-0.00091196713037789;8.1875063187908e-05;-9.0617220848799e-05;-5.3296385885915e-05;0.00043898305739276;-7.5817173637915e-05;0.0004770701052621;0.00034666707506403;-0.00015480737783946;-0.00042394184856676;-0.00018944806652144;-0.00035625207237899;6.5426589571871e-05;0.0022346659097821;3.5939447116107e-05;-0.0015073644462973;7.036815804895e-05;0.00019419201998971;-1.8661092326511e-05;-0.00013948821288068;4.292760786484e-05;5.5452775995946e-05;-4.4432374124881e-05;-0.00019657556549646;-0.0001527079148218;0.0014711783733219;4.6218927309383e-05;-0.00034982548095286;-0.00014334752631839;9.3960530648474e-05;-0.00010370974632679;-0.00014180439757183;7.0413676439784e-05;-0.0010922735091299;-4.9691909225658e-05;-0.00026638704002835;8.1129757745657e-05;0.00045291500282474;0.00071863899938762;0.00066482339752838;-0.0011173886014149;-0.00010376134741819;-0.0012518833391368;-0.00023793775471859;0.00036888822796755;2.6453562895767e-05;0.0007773726247251;3.553499118425e-05;0.00019205428543501;-1.4935144463379e-05;0.00022395941778086;-1.2332819096628e-05;-1.33098965307e-05;3.6338671634439e-05;-1.6155223420355e-05;-0.00010564076364972;-1.8854538211599e-05;-0.00014469870075118;5.1136398724339e-06;-4.1770941606956e-05;-3.9789836591808e-05;5.9486035752343e-05;6.0739116634068e-06;-0.00010346760973334;4.6214413487178e-06;0.00025338999694213;2.3624450477655e-05;-9.0695204562508e-05;7.888552499935e-05;6.3748004322406e-05;1.1788729352702e-05;-3.6878300306853e-05;-4.1541024984326e-05;1.8248158085044e-05;-3.9111873775255e-05;1.1214339792787e-05;0.00016983717796393;-1.2130411960243e-05;9.6870462584775e-05;-1.3902654245612e-06;-5.5921238526935e-05;-1.1798247214756e-05;-6.6086467995774e-05;-9.0149405878037e-06;1.9456696463749e-05;2.550745375629e-05;-0.00017874705372378;2.280901389895e-05;-2.5524743250571e-05;-2.6960464310832e-05;8.1757221778389e-05;1.5757486835355e-05;-4.1779618186411e-05;1.0631483746693e-05;-6.7520661104936e-05;-2.0979319742764e-05;-8.2177160948049e-05;-6.1111763898225e-06;4.813016494154e-05;3.8313039112836e-05;8.6617008491885e-05;7.6377953519113e-05;-6.1916929553263e-05;2.5127887056442e-05;-5.0254111556569e-05;-0.0001261496799998;-1.3745806427323e-05;0.00043829952483065;2.4081240553642e-05;-0.00021743579418398;2.9032867132628e-06;3.2824740628712e-05;8.5647352534579e-06;-2.8841483072028e-05;-1.2880806934845e-05;4.7940531658242e-05;-4.2020805267384e-05;-0.00012052749661962;-8.8017313828459e-06;0.0002815006300807;-1.6497939213878e-05;-0.00010359955922468;-3.7457925827766e-07;1.8888109480031e-05;2.3576345483889e-05;-8.3019767771475e-05;1.4029594694875e-06;-0.00027577742002904;3.2324712151421e-07;-4.0747403545538e-05;5.4481464758283e-05;-1.9649778550956e-05;6.4252890297212e-05;6.352176569635e-05;-0.00013924365339335;9.3742564786226e-06;-0.00013137409405317;-1.1717304914782e-05;0.00023241553572007;3.3310950584564e-06;0.00017409728025086;-8.2455317169661e-06;2.6521056497586e-06;3.3041742426576e-06;3.3415512007196e-05;-6.9618428824469e-05;0.00016918552864809;2.6581248675939e-05;-0.00018260884098709;7.7791337389499e-05;-0.0009373530629091;4.275206811144e-05;-0.00044034566963091;-0.00017195584950969;0.00033738560159691;3.2262400054606e-05;-0.00033533590612933;-3.1299194233725e-05;0.00061582820490003;8.4151688497514e-05;-0.0004359346057754;1.9103355953121e-05;2.9671686206711e-05;7.2793889557943e-05;-9.6187170129269e-05;0.00026384496595711;-0.00010472473513801;0.0003188319678884;-1.9864421119564e-05;0.00036650628317147;-4.6192406443879e-05;0.00069668353535235;2.2940610506339e-05;-0.00014490314060822;-1.3383609257289e-05;-0.00014660731540062;-8.2881932030432e-05;0.00016788000357337;-3.3575950510567e-05;-0.00058139214524999;5.9683720792236e-06;0.00013807583309244;-3.4052263799822e-05;0.00043831771472469;5.4400527005782e-05;-0.00011987423204118;7.573286711704e-05;-0.00046486168866977;-6.0334106819937e-05;-4.4692304072669e-05;-3.4660377423279e-05;0.00017687448416837;0.00030222267378122;0.00026331728440709;3.5389880395087e-06;-0.00016544148093089;-0.00020783019135706;-2.4321123419213e-05;-0.00031173063325696;9.6575486168149e-06;0.0013255757512525;5.600804797723e-05;-0.0009034124086611;-1.3241496162664e-05;0.00011609833018156;3.6646062653745e-05;-8.8012122432701e-05;-5.1447936129989e-05;8.1950674939435e-05;-0.00011646126222331;-0.00030437784153037;6.5863197960425e-05;0.00070469983620569;-5.4490086768055e-05;-0.0003857824485749;-7.8236174886115e-05;0.00012735255586449;7.7313692600001e-05;-0.00015592029376421;-1.3290884453454e-05;-0.0009806000161916;5.0371316319797e-05;-0.00026083283592016;0.00033411342883483;0.00034898641752079;0.00037215583142824;-6.229033897398e-05;-0.00060095574008301;-0.00014307771925814;-0.00062456005252898;-1.1956875823671e-05;0.00057022541295737;-7.7788417911506e-06;0.00082582258619368;-2.5586792617105e-05;0.0001490360009484;-4.9196887630387e-06;0.00017467486031819;-0.00010778921568999;0.000243950940785;4.3772746721515e-05;-0.00026517070364207;0.0001516420597909;-0.0013172657927498;6.917036807863e-05;-0.00062083487864584;-0.00024958210997283;0.00048397641512565;5.6422228226438e-05;-0.00047321105375886;-4.6218101488193e-05;0.00064467621268705;0.00012251705629751;-0.00062336231349036;3.3723812521202e-05;6.8635716161225e-05;0.00011304325744277;-0.00016498970217071;0.0003735359350685;-0.00019296641403344;0.00046040734741837;-4.0463459299644e-05;0.00058214989257976;-7.5552365160547e-05;0.0010101865045726;2.9586020900751e-05;-0.00015481148147956;-1.5887346307863e-05;-0.00013929164560977;-0.00013182160910219;0.00026304161292501;-5.7626621128293e-05;-0.00079149508383125;-7.9595420174883e-06;0.00023897478240542;-5.0100574298995e-05;0.00066082697594538;0.00010335881233914;-0.00022457542945631;0.00011750460544135;-0.00071448273956776;-7.6545584306587e-05;-5.8397428801982e-05;-6.3377105107065e-05;0.0003555555595085;0.00043822429142892;0.00037133737350814;-3.2335676223738e-05;-0.00022599186922889;-0.00033457868266851;4.5088771827295e-08;-0.00044443854130805;1.2852457075496e-05;0.0018171463161707;8.430521847913e-05;-0.0013191603356972;-2.5677980374894e-05;0.0001823351776693;5.2811261411989e-05;-0.00013975468755234;-6.1634840676561e-05;6.8152534367982e-05;-0.00016745655739214;-0.00031705858418718;8.225464989664e-05;0.0012588142417371;-9.919536387315e-05;-0.00045833174954168;-0.0001075123436749;0.00013823539484292;0.00010004776413552;-0.00012225261889398;-2.9639440981555e-05;-0.0012199734337628;7.2321388870478e-05;-0.00028841450694017;0.00050255371024832;0.0006478414288722;0.00059392931871116;-0.00013241163105704;-0.0010027807438746;-0.00023290717217606;-0.0010812788968906;4.0973195609695e-06;0.00051817990606651;8.1090238381876e-06;0.00092804757878184;-3.3167994843097e-05;0.00020233323448338;-9.3779945018468e-06;0.00023847630654927;-0.0001067645571311;0.00024153738922905;4.213679858367e-05;-0.00027186490478925;0.00014611751248594;-0.0012936642160639;8.1686928751878e-05;-0.00053312146337703;-0.00022353421081789;0.00044457000331022;5.7459139497951e-05;-0.0004624763969332;-4.1692353988765e-05;0.00056466716341674;0.00010645682050381;-0.00055771257029846;2.0096214939258e-05;-4.9657219278743e-06;3.5815686715068e-05;-0.00014241559256334;0.00041074652108364;-0.0001612887281226;0.00053517840569839;-4.149102824158e-05;0.00060363783268258;-7.759020809317e-05;0.00086722389096394;2.5370996809215e-05;-0.00012905227777082;-9.4829292720533e-06;-0.00012558414891828;-0.00013084897364024;0.0002587414055597;-5.9869085816899e-05;-0.00076996680581942;6.1142600316089e-06;6.7965294874739e-05;-2.6825162422028e-05;0.00061264599207789;0.00011060434917454;-0.00023360433988273;0.00011924329010071;-0.00069723313208669;-5.6217781093437e-05;-0.00012631980644073;-6.7292567109689e-05;0.00036399479722604;0.00042477765236981;0.00030272104777396;-8.6180996731855e-05;-0.00021552755788434;-0.00026518365484662;7.5928646765533e-06;-0.0002960491401609;1.9369729216123e-06;0.001775614451617;6.4697247580625e-05;-0.0011679414892569;-3.2566353183938e-05;0.00018643851217348;4.8858582886169e-05;-0.00012031997175654;-6.9718385930173e-05;7.775620179018e-05;-0.00013356631097849;-0.0003234948089812;0.00012045933544869;0.00099022092763335;-8.299620822072e-05;-0.00043792903306894;-0.00010482433572179;0.00012197055184515;0.00010312271479052;-0.0001610829931451;-1.8973974874825e-05;-0.0011567522305995;7.1816248237155e-05;-0.00025119521887973;0.00047120565432124;0.00063611357472837;0.00056652468629181;-0.0001755086123012;-0.00087195489322767;-0.00026609824271873;-0.00094537000404671;-1.8930422811536e-05;0.00059883197536692;-3.9264227780222e-06;0.00086576724424958;-3.4516684536356e-05;0.00020931089238729;-1.2866567885794e-05;0.00023660541046411;-0.00022604488185607;9.171345300274e-05;0.00033638285822235;-1.1747730241041e-05;0.0010850778780878;-0.0001137792278314;0.00029284314950928;-8.3739025285468e-05;-0.00024340729578398;0.00012494550901465;0.00050084461690858;-5.8340752730146e-05;-0.00021950266091153;1.6186086213565e-05;0.00033112082746811;-4.9332225898979e-05;-7.1367358032148e-05;3.8476999179693e-05;4.4230047933524e-05;-0.00030913122463971;9.8549935501069e-05;-0.00048977509140968;0.00012055289698765;-0.00083392311353236;4.0601826185593e-05;-0.00054037914378569;5.667214281857e-05;2.6661313313525e-05;3.9007295526972e-07;4.9544334615348e-05;-4.3242412175459e-06;0.00021782268595416;-8.714205614524e-05;-0.00068376847775653;-3.5478718928061e-05;-0.00036220796755515;1.9970126231783e-05;0.00040834039100446;2.201823372161e-05;-0.00019557875930332;0.00010462346108397;-0.00067433778895065;6.7559689341579e-05;-0.00029272271785885;-1.3279247923492e-06;0.00030756450723857;-5.8962275943486e-05;0.00030177182634361;0.00011917911615456;-0.00016952054284047;-7.7734650403727e-05;-0.00014027270663064;5.6563898397144e-05;1.7053554984159e-05;0.0017770790727809;-1.4372943951457e-05;-0.00076009338954464;1.5732426618342e-05;0.0001674163795542;-2.6288935259799e-05;-4.5195280108601e-05;2.2309774067253e-05;7.1961469075177e-05;-4.82247050968e-05;-0.0001830842520576;-7.6364281994756e-05;0.00080598535714671;6.0513317293953e-05;-0.00018727881251834;-8.8228247477673e-05;2.0254436094547e-05;-5.4490799811902e-05;-0.00020141847198829;5.8673980674939e-05;-0.00073753396281973;-2.2057954993215e-05;-0.00010987451969413;4.7764351620572e-05;0.00030041672289371;0.00050454627489671;0.00043518928578123;-0.00067921128356829;-0.00011198246647837;-0.00078032718738541;-0.0001908225385705;0.00045060509000905;-6.2633553170599e-06;0.0004098984063603;2.0013812900288e-05;0.00015725269622635;-1.5203778275463e-05;0.00016062066424638;-1.1329299013596e-05;-0.00010677349200705;0.00023058376973495;-1.4609438494517e-06;-0.00040458686999045;0.00011691579129547;-0.0010781600140035;8.9721135736909e-05;-0.000230992140132;-0.00012148998939665;0.00025121853104793;7.2899500082713e-05;-0.00046380440471694;-2.2914762666915e-05;0.00029910341254435;5.2413561206777e-05;-0.00029712525429204;0.00013223831774667;-4.174225978204e-05;-0.00010926036338788;-0.00014282837219071;0.00031375154503621;-7.9473764344584e-05;0.00051369675202295;-3.0388971936191e-05;0.00084991630865261;-6.8311179347802e-05;0.00041380655602552;7.5747351502287e-07;-4.6635181206511e-05;4.7324119805126e-06;-9.5807132311165e-05;-9.3310911324807e-05;0.00018533469119575;-1.5898553101579e-05;-0.00067668984411284;8.5989398940001e-05;-0.00051252404227853;2.1398969693109e-05;0.00032875497709028;9.5672039606143e-05;-0.00019572050950956;9.3459013442043e-05;-0.00051428080769256;3.5435189147393e-06;-0.00039839511737227;-5.2662253438029e-05;0.00027044143644162;0.000290782074444;9.5496099675074e-05;-0.00011457059008535;-0.00019023410277441;5.8476653066464e-05;-4.1350092942594e-05;0.00011562096915441;-5.0510949222371e-05;0.00162597396411;3.0242711090978e-06;-0.00055108696687967;-3.7242374673951e-05;0.00016055730520748;2.5193601686624e-05;-1.5241839719238e-05;-8.3354192611296e-05;0.00012304009578656;-6.5829066443257e-05;-0.0003149526019115;0.00011485512368381;0.00054457550868392;-6.1963946791366e-05;-0.00025889734388329;-4.7147914301604e-05;2.1863314032089e-05;0.00010146417480428;-0.00029445166001096;-2.7246458103036e-06;-0.00087243196321651;3.6791316233575e-05;-7.9118741268758e-05;0.00032915489282459;0.00046532702981494;0.00040542174247093;-0.00015238001651596;-0.00056110543664545;-0.00021784946147818;-0.00063118833350018;-5.5073483963497e-05;0.00075114873470739;3.8776529436291e-06;0.00048019678797573;-3.3245651138714e-05;0.00018458039266989;-8.6645013652742e-06;0.00017808214761317;-0.00026296739815734;0.00011335103772581;0.00096964632393792;7.8038399806246e-05;0.0014314567670226;-0.00019891014380846;2.7911164579564e-05;-0.00015174575673882;1.5394080037368e-05;1.8458930526322e-06;0.00073124113259837;-0.00010718916746555;0.00060844601830468;-4.2038467654493e-05;7.3392902777414e-06;9.0961175374105e-06;-0.00048326997784898;-9.3601491244044e-05;0.00020090327598155;-0.00014406777336262;0.00027804548153654;-0.00064425315940753;0.00017771260172594;-0.0022679741960019;5.3542422392638e-05;-0.00022170091688167;9.7782431112137e-05;-0.00013228840543889;5.1530263590394e-05;-9.8057324066758e-05;-5.2185550885042e-06;-1.8342225303059e-05;2.7089510695077e-05;-0.00031467081862502;5.7618748542154e-05;-0.0012834272347391;8.0313984653912e-05;-3.3417789381929e-05;8.1535217759665e-05;-8.8929024059325e-05;4.9032598326448e-05;-0.00015735808119643;-1.3236160157248e-05;-0.00067369040334597;5.9134421462659e-05;4.0971019188873e-05;-2.6691212042351e-05;-6.9939960667398e-05;-0.00014985441521276;-0.00013262311404105;0.00042997792479582;-2.2504214939545e-05;0.00060029316227883;-9.6614174253773e-05;0.0013414690038189;-6.2235871155281e-05;0.00025859897141345;-4.2387891880935e-05;2.0967914679204e-05;-9.2918462542002e-06;0.00016253819921985;-1.4326316886581e-05;0.00018796541553456;-6.968710658839e-05;-7.6811666076537e-05;3.3569216611795e-05;0.00060967641184106;-7.5534262578003e-05;0.00014549047045875;-0.00013427477097139;-0.00015626987442374;6.5759872086346e-05;-0.00060838810168207;4.4922893721377e-05;-0.0003610790008679;-6.6098446040996e-06;0.00019823909678962;-1.9665996660478e-05;-2.3496369976783e-05;0.00020280039461795;0.00023036063066684;-0.00033971754601225;5.7478540838929e-05;-0.00062132306629792;3.9366648707073e-05;0.00072033167816699;-4.5246688387124e-05;-0.00030210858676583;8.6965439550113e-05;0.00019004361820407;-5.8020773394674e-06;3.9109760109568e-05;-6.0651768762909e-06;-0.00010643441783031;0.0002181027084589;-4.5178701839177e-05;-0.00062047445680946;0.00013335798576009;-0.0010341905290261;0.00010290569480276;-2.8688667953247e-05;-3.6013349017594e-05;7.6946700573899e-05;9.2490132374223e-05;-0.00048537741531618;8.1112357293023e-06;-3.9848000596976e-05;1.134214198828e-05;-8.4481362137012e-05;0.00029571380582638;-1.7864056644612e-05;-0.00019373938266654;-0.00019672812777571;0.00022024373174645;-6.052906246623e-05;0.0005130004719831;-3.4274868085049e-05;0.0012768534943461;-7.587257277919e-05;0.00013873213902116;-2.7623123969533e-05;3.0604223866249e-05;1.0098205166287e-05;-4.1184572182829e-05;-2.4622153432574e-05;5.9352794778533e-05;3.517284130794e-05;-0.00045134013635106;0.0001157485312433;-0.00092366547323763;5.2688978030346e-05;6.1930521042086e-05;6.0141064750496e-05;-0.00011817824997706;3.6762714444194e-05;-0.00023557424719911;4.2662075429689e-05;-0.0005568215274252;-3.0503922971548e-05;0.00011589146015467;8.5486804891843e-05;-6.7758992372546e-05;-0.0001014212903101;-0.00011299052857794;0.00030412166961469;-8.6963089415804e-05;0.00041066471021622;-7.5454161560629e-05;0.0012876658001915;-3.5215496609453e-05;5.3421190386871e-06;-2.5534305677866e-05;8.4287006757222e-05;1.9374258499738e-06;8.6187072156463e-05;-8.3647981227841e-05;0.0001643158175284;2.1329794890335e-06;-0.00025172613095492;4.7948513383744e-05;0.00024959788424894;-6.6421118390281e-05;-7.8140270488802e-05;1.2776816220139e-05;-6.5667372837197e-05;8.1775557191577e-05;-0.00044178974349052;5.0639673645492e-06;-0.0005997815169394;5.0348126023891e-07;6.6029308072757e-05;0.00012580274778884;0.00024500518338755;0.00025091791758314;-5.5289576266659e-05;-0.00027166487416252;-0.00010109443974216;-0.00040815060492605;-7.3642200732138e-05;0.00084528746083379;3.2084579288494e-05;0.00012821213749703;-2.3221100491355e-05;0.00015929205983412;-4.0352892938245e-06;0.00010752584057627;-9.3126771389507e-05;0.00019778564455919;-2.5110288333963e-05;-0.00046142388600856;9.9207267339807e-05;-0.00091329746646807;8.7252105004154e-05;-6.8120432842989e-05;-5.3921725339023e-05;0.00012127894297009;7.2690701927058e-05;-0.00041345084900968;-5.5077957767935e-06;0.00012096574209863;1.9099998098682e-05;-0.00013203777780291;0.00018862621800508;-6.4301399106625e-05;-0.00017204241885338;-0.00013740103167947;0.00025158128119074;-3.4746819437714e-05;0.00047786431969143;-2.4781487809378e-05;0.00093624176224694;-6.1524588090833e-05;0.00016501751088072;-1.3548399692809e-05;-4.6433624447673e-06;9.7436977739562e-06;-6.8368695792742e-05;-4.9061483878177e-05;0.00010038805339718;9.2568834588747e-06;-0.00051674002315849;0.00011187217751285;-0.00073639611946419;4.4678814447252e-05;0.00012535248242784;6.4007326727733e-05;-0.00012842805881519;5.7261837355327e-05;-0.00030144766787998;3.0610521207564e-05;-0.00047744158655405;-3.248729990446e-05;0.00014702801126987;0.00016986670379993;-1.9158533177688e-05;-0.00010388463851996;-0.00014413030294236;0.00021259891218506;-6.8578803620767e-05;0.00030735129257664;-6.3715080614202e-05;0.0012933645630255;-2.9908167562098e-05;-0.00013762582966592;-3.0259274353739e-05;0.0001030117055052;8.3178447312093e-06;5.4295709560392e-05;-8.4351071564015e-05;0.00014870222366881;-1.5388146493933e-05;-0.00029236011323519;9.6570678579155e-05;0.00013984559336677;-3.7220353988232e-05;-0.00015408443869092;-1.1785326933023e-05;-2.219121233793e-05;8.9976711024065e-05;-0.00037861574674025;1.0023259164882e-05;-0.0006622897926718;1.3016330740356e-05;-5.6285699656655e-07;0.00019074414740317;0.00027052173390985;0.0002485555014573;-0.00010343305621063;-0.00027486911858432;-0.00015443172014784;-0.00032314498093911;-7.5194351666141e-05;0.00084051542216912;3.930406364816e-06;0.00028306469903328;-2.8851307433797e-05;0.00016030287952162;-5.4075526350061e-06;0.00012841160059907;-0.00026791088748723;0.0001115419290727;0.001157135469839;8.978846744867e-05;0.001729161827825;-0.00023481214884669;2.5452369300183e-05;-0.00018445256864652;4.1052906453842e-05;-1.2392543794704e-05;0.0007566490676254;-0.00011088753672084;0.00079258868936449;-5.9869984397665e-05;-8.6346753960242e-06;1.6002255506464e-05;-0.00055342429550365;-5.3973748435965e-05;0.00026230816729367;-0.00023283675545827;0.00031868077348918;-0.00081655126996338;0.00019521825015545;-0.0026560418773443;6.0932550695725e-05;-0.00026533679920249;0.00012190148117952;-0.00012672935554292;5.9613488701871e-05;-0.00015129850362428;-2.8748672775691e-06;-9.7387681307737e-05;6.2940176576376e-05;-0.00016386534844059;6.1347287555691e-05;-0.0013431318802759;7.1956892497838e-05;-9.3418049800675e-05;0.00010062472574646;-5.8711706515169e-05;3.1581213988829e-05;1.279662228626e-05;-3.7020919990027e-05;-0.00069287064252421;6.0718430177076e-05;-3.4427786886226e-05;-2.252201011288e-05;-0.00014054407074582;-0.00013646474690177;-0.00012284380500205;0.00041183736175299;1.791761496861e-05;0.00064886885229498;-0.00013643862621393;0.0011387175181881;-5.3808100346942e-05;0.00041306455386803;-4.5351825974649e-05;-4.8603458708385e-05;-1.7692975688988e-06;0.0002145380130969;-1.7729325918481e-05;0.00024839720572345;-8.62555752974e-05;-7.661507697776e-05;7.7096316090319e-05;0.00022646541765425;-7.1343092713505e-05;0.00012844649609178;-0.00011294205614831;-0.00016588173457421;7.8041470260359e-05;-0.00086548988474533;5.3429012041306e-05;-0.00045429044985212;1.477047590015e-05;0.00021380050748121;-3.0789880838711e-05;-0.00013499692431651;9.90073531284e-05;0.00016950626741163;-0.00017129658954218;0.00010278684931109;-0.00041154184145853;4.1232473449782e-05;0.0010894525330514;-8.4983366832603e-05;-0.00024695202591829;8.1750695244409e-05;0.00027658528415486;-1.072712802852e-05;3.266860221629e-05;-9.3313719844446e-06;-0.00015660727513023;5.6095308536896e-05;0.00074361235601828;5.8577679737937e-05;0.0010282824514434;-9.6793752163649e-05;-6.5768079366535e-05;-0.00010955602192553;0.00014609748905059;-5.3567277063848e-05;0.00068645080318674;-6.5332955273334e-05;0.00091303914086893;-5.5354961659759e-05;-0.00012511381646618;4.17218907387e-05;-0.00037930038524792;-0.00029573717620224;8.6841071606614e-05;0.00025448366068304;0.00015639296907466;-0.00033002340933308;0.00021174941502977;-0.0023526242002845;4.6273908083094e-05;-7.6835553045385e-05;3.5015098546864e-05;-0.00015651555440854;4.4768981751986e-05;-0.00019597155915108;5.6996300372703e-06;-0.00017761830531526;0.00010938186460407;0.00065003708004951;0.00013127844431438;-0.0011729830875993;-8.2304090028629e-05;-0.00016364119073842;7.523985550506e-05;2.8640910386457e-05;-3.1055246836331e-06;-6.5033200371545e-05;-8.2273167208768e-05;-0.00033102184534073;4.1483675886411e-05;-0.00013492221478373;-2.4379281967413e-05;-0.00059920060448349;-0.00018442074360792;-8.7290994997602e-05;0.00030570215312764;0.00030731008155271;0.0005960896378383;-9.8459728178568e-05;0.0003350934421178;-4.9426111218054e-05;0.00052630482241511;1.8663193259272e-05;1.4287320482254e-05;2.4553133698646e-05;0.00010986279812641;-1.7848260540632e-05;0.00014650475350209;-1.2778859854734e-05;0.00028067885432392;0.0001899527705973;0.00062233832431957;-0.00022920515039004;0.00020431712619029;-0.00025262171402574;-0.0001629368198337;0.00010172669863096;-0.00065871013794094;-4.1786646761466e-05;3.6192432162352e-05;2.2426625946537e-05;0.00027234054869041;-1.1022508260794e-05;-0.00056194397620857;-0.00037972204154357;0.00015966666978784;0.00033303606323898;0.000292913406156;-0.00056548556312919;0.00040361826540902;0.00010786626808112;-6.5864318457898e-05;-0.00048328746925108;0.00011881756654475;0.00027444883016869;2.6012627131422e-05;-0.00013397743168753;-3.3515225368319e-05;-0.00018699516658671;6.8930770794395e-05;0.0011553337099031;9.2557129391935e-05;0.0017479935195297;-0.00022242697014008;1.891507235996e-05;-0.00018877178081311;6.4586616645101e-05;-2.4238859623438e-05;0.00058419251581654;-7.9912781075109e-05;0.00088925583986565;-7.0563597546425e-05;-1.2317357686698e-05;1.9396155039431e-05;-0.00053706782637164;-3.0118662834866e-05;0.0002724526275415;-0.0002503766445443;0.00030284133390523;-0.00084058591164649;0.00018776071374305;-0.0026283788029104;4.6420071157627e-05;-0.00028727375320159;0.00012608736869879;-6.5018051827792e-05;5.4410731536336e-05;-0.00021086665219627;3.7786742268509e-06;-0.0002171176020056;0.0001117243009503;0.00020717614097521;5.5399541452061e-05;-0.0010179789969698;1.6317579138558e-05;-0.00013464610674419;9.937535651261e-05;-6.4514729274379e-06;7.2305795129068e-07;0.00028984603704885;-7.138369983295e-05;-0.00050997734069824;3.9833445043769e-05;-0.00012525866623037;-1.6604901247774e-05;-0.00025162150268443;-3.1998533813749e-05;-6.2542269006371e-05;0.00019997588242404;0.00010408349771751;0.00050250516505912;-0.00017434774781577;0.00047527550486848;-2.0634282918763e-05;0.00048572599189356;-2.1630858100252e-05;-0.00015311485913116;1.4784429367865e-05;0.00022811852977611;-1.5555629943265e-05;0.00027350231539458;-8.1370875705034e-05;1.4349537195812e-05;0.00012983787746634;-0.00029182742582634;-7.8742908954155e-05;7.8261095040943e-05;-7.4726922321133e-05;-0.00014488719170913;8.1453894381411e-05;-0.0010783250909299;4.4260385038797e-05;-0.00047687656478956;4.0721777622821e-05;0.00019507638353389;-4.0286369767273e-05;-0.00032403349177912;-9.6021009085234e-05;6.0639711591648e-05;9.942875476554e-05;0.00018983543850482;-7.0114416303113e-05;6.2977276684251e-05;0.0013330996735021;-0.00012027347111143;-0.00012993006384932;6.8061010097153e-05;0.00035500354715623;-1.0964570719807e-05;5.7623051361588e-06;-1.3890531590732e-05;-0.00019678176613525;6.330283213174e-05;0.0014143430162221;0.00011106782767456;0.0021848026663065;-0.0002512019709684;-1.1596703188843e-06;-0.00024196211597882;0.0001432135613868;-5.2362855058163e-05;0.00079077063128352;-8.6765619926155e-05;0.0013778739375994;-0.00010196884977631;-6.2953731685411e-05;4.2022413254017e-05;-0.0006610177224502;-0.00019629206508398;0.00029091743635945;-9.0217574324924e-05;0.00034345220774412;-0.00096715451218188;0.00030864574364386;-0.0036284932866693;6.2625360442325e-05;-0.00036187598016113;0.00013666754239239;-0.0001064161551767;6.9644396717194e-05;-0.00034368043998256;1.0954486242554e-05;-0.00035995521466248;0.00018514112161938;0.0008463267586194;0.00011700262257364;-0.0012701746309176;-7.4803392635658e-05;-0.00022410792007577;0.00013891061826143;4.027564500575e-05;-1.8795744836098e-05;0.00035272529930808;-0.00012468874047045;-0.00047829136019573;4.1943440010073e-05;-0.00022393907420337;-3.2742507755756e-05;-0.00063468824373558;-8.2043407019228e-06;-6.6327178501524e-05;0.00011295954755042;0.00033384378184564;0.00065961544169113;-0.00026033434551209;0.00015269477444235;-2.7105494154966e-05;0.00071617215871811;1.4777690921619e-05;-0.00017475210188422;3.5424000088824e-05;0.00024856656091288;-1.7469232261647e-05;0.00031308573670685;-6.4207990362775e-05;0.00031548555125482;0.00024237854813691;-0.000126409024233;-0.0002233447303297;0.0001561480021337;-0.00018843049474526;-0.0002050027687801;0.00012904671893921;-0.0014344649389386;3.2111486234498e-06;-0.00038412402500398;5.729610711569e-05;0.00031698853126727;-4.9096652219305e-05;-0.000726368278265;-0.00037308773607947;9.3622431450058e-05;0.00034535781014711;0.00040882654138841;-0.00022306806931738;0.00028730524354614;0.0012828637845814;-0.00015129895473365;-0.00033054332016036;0.00012899929424748;0.00052346399752423;7.4124977800238e-06;-9.9851036793552e-05;-3.2193915103562e-05;-0.00019010345567949;6.151862180559e-05;0.0011175795225427;7.9110541264527e-05;0.0017445974517614;-0.00017397657211404;-3.8596564991167e-05;-0.00019311475625727;0.00017182780720759;-6.3345083617605e-05;0.00085593858966604;-7.9696168540977e-05;0.0013057893374935;-9.0140849351883e-05;-0.0001154599522124;5.2827675972367e-05;-0.00052387913456187;-0.00031056388979778;0.00018977487343363;0.00015590622206219;0.00024114396364894;-0.00068349501816556;0.0003068293153774;-0.0033300439827144;6.7516004492063e-05;-0.00024108853540383;8.2407306763344e-05;-0.00016553598106839;6.2049199186731e-05;-0.00030622677877545;1.0450315130583e-05;-0.00030718382913619;0.00016856665024534;0.00099583750125021;0.00014519033720717;-0.0013276188401505;-0.00011252104013693;-0.00022383537725545;0.00012501596938819;4.8939844418783e-05;-1.5948311556713e-05;0.00010001754708355;-0.00011788352276199;-0.00038932575262152;4.2573974496918e-05;-0.00020136615785304;-3.7398323911475e-05;-0.0007586955325678;-8.3621380326804e-05;-8.5123152530286e-05;0.00016080221394077;0.00040987553074956;0.00069872278254479;-0.00021484945318662;0.00017195072723553;-4.3282554543111e-05;0.00068814132828265;3.1358566047857e-05;-5.6235661759274e-05;3.5556695365813e-05;0.0001691782817943;-1.6839048839756e-05;0.00023386739485431;-2.8211379685672e-05;0.00041466500260867;0.00025505578378215;0.00036533706588671;-0.00028317427495494;0.00020821960060857;-0.0002722142089624;-0.00020360897178762;0.00013130142178852;-0.0011398355709389;-3.7944308132865e-05;-0.00011719906615326;4.3905234633712e-05;0.00033922077273019;-2.9522907425417e-05;-0.0007901027565822;-0.00048916944069788;0.00014957138046157;0.00043820997234434;0.00042945001041517;-0.00048153364332393;0.0004430694389157;0.00059631076874211;-0.00011450210877229;-0.00048651205725037;0.00014701452164445;0.000457220710814;2.4882983780117e-05;-0.00016307261830661;-4.0698705561226e-05;-6.5813706896733e-05;0.00016697951650713;-5.1330182031961e-05;-0.0010837460868061;0.00019553254242055;-0.0015536079881713;0.00015143197379075;6.4754371123854e-05;7.2558614192531e-05;-0.00018810032634065;8.6221923993435e-05;-0.00065862975316122;0.00010535540059209;-0.0011779174674302;-4.5783392124576e-05;0.00012720315135084;0.00049814116209745;0.00025188218569383;-0.00017076623043977;-0.00027119132573716;-6.1877210100647e-05;-0.00024221569765359;0.00059253827203065;-9.8574331786949e-05;0.0028993110172451;-8.9340530394111e-05;0.00021110336820129;-6.5236912632827e-05;0.0001378440647386;-1.2850231541961e-05;0.00027612384292297;0.00021551191457547;-0.00035545395803638;0.00017713899433147;0.0012076993007213;-0.00018772261682898;-0.0011549458140507;0.00010198103700532;-0.0002462363045197;-2.7438160032034e-05;7.759612344671e-05;-0.00016886895173229;0.00017352410941385;3.771794581553e-05;-0.00029158225515857;-3.7685065763071e-05;-0.00023751117987558;-0.00089763081632555;-6.6931745095644e-05;-4.8938909458229e-05;0.00052290153689682;6.5311658545397e-05;-0.00020737659360748;0.00064083986217156;-3.5056815249845e-05;-0.0001288469939027;6.7150118411519e-05;0.00068270473275334;4.8332763981307e-05;-6.7312583269086e-05;-1.8268749045092e-05;0.00015939743025228;1.0241759582641e-06;0.00018641439964995;0.00030812495970167;0.00044805553625338;-0.00030035109375603;0.00010897481115535;-0.00023878847423475;0.00013160065282136;0.00012518538278528;-0.00019764037278946;-7.3401221015956e-05;-0.0010782540775836;6.4993306295946e-05;-0.0002007892326219;-4.0529666875955e-05;0.00034321268321946;-0.00090603542048484;-0.00054814055329189;0.00014863882097416;0.00050092721357942;0.00056150683667511;0.00039804563857615;-0.00034717327798717;-0.0001445379020879;0.00066742656053975;0.00015332948532887;-0.00034791629877873;3.0683007935295e-05;0.00045557378325611;-4.2851050238824e-05;-0.00016730865172576;-7.1385729825124e-05;0.00017890328308567;-0.00010008097160608;-0.0014989172341302;0.00030907662585378;-0.0021140233147889;0.00021432967332657;4.3582622311078e-05;6.645741086686e-05;-0.00017298877355643;0.00010175098577747;-0.00061436556279659;0.00012804813741241;-0.0013306516921148;-3.3322903618682e-05;7.6227421232034e-05;0.00071277498500422;0.00015318437363021;-0.00029543659184128;-0.00042724527884275;0.00019015051657334;-0.00025865953648463;0.00092940800823271;-9.5584102382418e-05;0.0034150483552366;-0.00016610835155006;0.00034010081435554;-7.9741068475414e-05;7.4920957558788e-05;-1.5433130101883e-05;0.00033998020808212;0.00024868419859558;-0.00043626507977024;0.00016926736861933;0.0011513635981828;-0.0001558793883305;-0.0011469419114292;0.00011817152699223;-0.00026897908537649;-3.0937699193601e-05;7.1904622018337e-05;-0.00018903960881289;0.00047257277765311;3.9798833313398e-05;-0.00040616045589559;-3.6114750400884e-05;-0.00028062629280612;-0.00084522133693099;1.5886998880887e-05;-1.7722768461681e-05;0.00047571628238074;2.13312341657e-05;-0.00027532971580513;0.00062187161529437;-2.6125420845347e-05;-0.0001973501057364;5.6751719966996e-05;0.00076402683043852;5.249909372651e-05;-0.00021002630819567;-2.0009640138596e-05;0.0002628828806337;-4.1105005948339e-05;0.00028065071091987;0.00030799710657448;0.00042093559750356;-0.00026153444196098;-0.00034257568768226;-0.00017143040895462;8.5931249486748e-05;0.00013353144458961;-0.00021499930880964;-2.1965817722958e-05;-0.0014583786251023;8.0913509009406e-05;-0.00046935060527176;-6.641996151302e-05;0.0003535108116921;-0.00090739241568372;-0.00045605128980242;0.00010228683095193;0.00053197797387838;0.00045785689144395;0.00025995293981396;-0.00010664399451343;-0.00019975630857516;0.0013727942714468;0.00015034074021969;-0.00023282141773961;1.0896944331762e-05;0.00055473408428952;-3.3815198548837e-05;-0.0001200707629323;-7.2917588113341e-05;0.0001671599020483;-9.1358058853075e-05;-0.0012772507034242;0.00028663559351116;-0.0018043337622657;0.00018332857871428;1.0963249224005e-05;4.0663770050742e-05;-0.00010377857688582;9.5582377980463e-05;-0.00046853232197464;9.8460433946457e-05;-0.0009813760407269;-1.5723551769042e-05;2.5559702407918e-05;0.00060961680719629;2.6792744392878e-05;-0.00028122038929723;-0.00038556609069929;0.00030410225735977;-0.00018437721882947;0.00085767841665074;-7.6008000178263e-05;0.0026724745985121;-0.00015836927923374;0.00030535709811375;-6.6106105805375e-05;4.0823710151017e-05;-9.4528559202445e-06;0.00025117149925791;0.00017732649575919;-0.0003156496968586;0.00010736948024714;0.00063882936956361;-6.5108863054775e-05;-0.00088254583533853;9.0188121248502e-05;-0.00019261316629127;-1.6964535461739e-05;3.5188804758945e-05;-0.00013152998872101;0.00042712542926893;3.5332446714165e-05;-0.00039892995846458;-2.1857340470888e-05;-0.00020098908862565;-0.00050534651381895;1.2436327779142e-05;-1.2428726222424e-05;0.00026538196834736;7.0733549364377e-05;-0.00021087328786962;0.00046541629126295;-1.9685618099174e-05;-1.7024384533215e-06;1.9881363186869e-05;0.00056950026191771;3.3596719731577e-05;-0.00019602701650001;-1.6459043763462e-05;0.00024040449352469;-6.6457345383242e-05;0.00025981024373323;0.00020435321494006;0.00018993957201019;-0.00012931818491779;-0.00046433293027803;-8.0475329014007e-05;2.8574568204931e-05;9.4208771770354e-05;-0.00015939837612677;2.8252214178792e-05;-0.0011874787742272;6.4791609474923e-05;-0.00050482765072957;-5.6179334933404e-05;0.00024771766038612;-0.0005587346968241;-0.00023363034415524;5.9727877669502e-05;0.00033363015973009;0.000249890726991;8.6210457084235e-05;3.528879096848e-05;-0.00017381392535754;0.0013635096838698;9.3262111477088e-05;-8.4975639765617e-05;-8.6694053607062e-06;0.0004317689454183;-1.780791717465e-05;-4.4836782763014e-05;-0.00012260831135791;2.5727696993272e-05;0.0012783758575097;9.6565774583723e-05;0.0021235281601548;-0.00022731249919161;2.0489975213422e-05;-0.00024338587536477;0.0001366803626297;-4.8276102461386e-05;0.0006392584182322;-5.6745309848338e-05;0.0013832102995366;-0.00010430176189402;-3.2749030651757e-05;4.2364797991468e-05;-0.00057436851784587;-0.00020603023585863;0.00026979902759194;-7.2023372922558e-05;0.00029585312586278;-0.00094204291235656;0.00032338430173695;-0.0034125468228012;5.4178824939299e-05;-0.00041684307507239;0.0001296843693126;-5.6901881180238e-05;6.0040390962968e-05;-0.00037822607555427;1.5220233763102e-05;-0.00040687044383958;0.00019765614706557;0.001161060994491;0.00010692206706153;-0.00087532511679456;-0.00012194151349831;-0.00021355121862143;0.00014353540609591;6.33244853816e-05;-3.3301676012343e-05;0.00042772848973982;-0.0001303932222072;-0.0002718867326621;2.0087107259315e-05;-0.00023465740378015;-4.0835398976924e-05;-0.00069324782816693;0.00015537312719971;-2.0924009731971e-05;-0.00019190856255591;0.00039888682658784;0.00048279043403454;-0.00031444005435333;-0.00032399641349912;-8.3976956375409e-06;0.00063497154042125;4.5487944589695e-05;-0.00019485846860334;4.1775932913879e-05;0.00020421606313903;-7.2808129516488e-06;0.00027465066523291;-3.8933318137424e-05;0.00050999119412154;0.00024946787743829;-0.00027619316824712;-0.00024944037431851;0.00011698080197675;-0.00016304671589751;-0.00018057918350678;0.0001224475709023;-0.0014912901679054;-1.3923687220085e-05;-0.00033453697687946;6.1141239712015e-05;0.00030240873456933;-5.5111424444476e-05;-0.00083742954302579;-0.00041474506724626;5.2585008234018e-05;0.00035665818722919;0.00048561772564426;-8.6457010183949e-05;0.00027429210604168;0.001208511646837;-0.00014758911856916;-0.00026991864433512;0.00013088564446662;0.00057459820527583;1.1031887879653e-05;-0.00014051889593247;-3.1555155146634e-05;-0.00012953106488567;2.9037873900961e-05;0.0010476751485839;6.4552063122392e-05;0.0018597632879391;-0.00017327084788121;2.7878061246156e-06;-0.00021519760775845;0.00014868678408675;-5.4322215873981e-05;0.00071864994242787;-5.4075142543297e-05;0.0013089111307636;-9.7898315289058e-05;-6.5709289629012e-05;5.1402548706392e-05;-0.00044856310705654;-0.00026390759740025;0.00021290093718562;6.9554924266413e-05;0.00021180821931921;-0.00078254385152832;0.00032190524507314;-0.0031992259901017;6.494986882899e-05;-0.00034094418515451;9.261161176255e-05;-0.00011160279245814;5.5152726417873e-05;-0.00033752870513126;1.3970839063404e-05;-0.00036433050991036;0.00018255082250107;0.0012366630835459;0.00011605433974182;-0.00091518455883488;-0.00013752278755419;-0.00021206647215877;0.00014031433966011;6.5255160734523e-05;-3.0009423426236e-05;0.00023152529320214;-0.000120475589938;-0.00022572753368877;2.0351732018753e-05;-0.00020761965424754;-4.5304292143555e-05;-0.00074448715895414;0.0001218689722009;-3.7613779568346e-05;-0.00018570171960164;0.00043521565385163;0.00051654380513355;-0.00029554846696556;-0.00026148179313168;-1.8207440007245e-05;0.00060317321913317;5.3134099289309e-05;-0.00010065178503282;3.9178979932331e-05;0.00014545299927704;-5.349542334443e-06;0.00022207127767615;-1.6512285583303e-05;0.00054968456970528;0.00024991095415317;1.5710251318524e-05;-0.00027978533762507;0.0001411244738847;-0.00021440218552016;-0.00017478020163253;0.00012064396287315;-0.0012859471607953;-3.8092675822554e-05;-0.00017535108781885;5.1570579671534e-05;0.00030749986763112;-4.0045993955573e-05;-0.0008564317249693;-0.00049026624765247;8.8024346041493e-05;0.00042384810512885;0.00048695458099246;-0.00023872978636064;0.00037038413574919;0.00077709782635793;-0.00012134147254983;-0.00034733911161311;0.00013816606951877;0.00052748253801838;2.1299010768416e-05;-0.00017557977116667;-3.6867473681923e-05;2.5395522243343e-05;-2.5273548089899e-05;-0.00019779166905209;0.00013037463941146;0.00018571499094833;-7.3821378464345e-05;-6.7876506363973e-05;0.00010028079850599;1.1281126717222e-05;-1.1894083399966e-05;2.1687004846171e-05;-2.3768973278493e-06;3.3376880310243e-05;-3.242223556299e-06;5.0205675506731e-05;-4.12251574744e-05;8.9706772996578e-05;7.9239973274525e-05;-1.0804282283061e-05;-0.00069886766141281;0.00055175629677251;0.00023456005146727;-0.00029794473084621;0.00012443902960513;-0.00014906877186149;-0.00010270026541548;5.4372510930989e-05;-1.807205080695e-05;2.1102201571921e-05;-3.7841266021132e-05;2.5306979296147e-05;-4.6150016714819e-05;-2.2323394659907e-05;-0.00014881198876537;-0.00022095580061432;7.0349538873415e-05;8.6136955360416e-05;-6.003007729305e-05;-1.1320330486342e-05;-1.8461745639797e-05;-3.829549314105e-05;6.550429679919e-05;2.5421706595807e-05;-6.9647314376198e-05;-7.7797019912396e-05;1.8910546714324e-05;2.8242131520528e-05;0.0010485975071788;9.6655945526436e-05;0.00013741600560024;-0.00053507165284827;-0.00044639309635386;-5.7927691159421e-06;-9.8594340670388e-05;5.5378826800734e-05;0.00010999018559232;4.151014945819e-05;1.3675922673428e-05;-1.8175845980295e-05;3.2683749395801e-06;1.0216542250419e-05;6.5462136262795e-06;-5.3814022976439e-05;-3.1299769034376e-05;-0.00052137882448733;-0.00050639116670936;-0.00028544064844027;-0.00027752949972637;-6.5414824348409e-06;-5.7363053201698e-05;9.010767826112e-06;1.7722763004713e-05;0.00012333938502707;0.00011316388554405;-1.920225986396e-05;-3.7847108615097e-05;-5.2254330512369e-05;-3.1064028007677e-05;0.00038739925366826;-0.00042863888666034;3.7603425880661e-05;0.00064276671037078;0.00054242077749223;2.2865153368912e-05;0.00010067112452816;7.0898138801567e-05;0.00010103132808581;9.775780927157e-05;9.6028212283272e-05;-5.9428784879856e-05;-5.1800449000439e-05;3.3592994441278e-05;2.3722488549538e-05;2.3605705791852e-05;-2.4976041459013e-05;-0.00017683756595943;0.00014356218161993;0.00018144950445276;-7.4306699389126e-05;-6.7082291934639e-05;9.7522046416998e-05;1.0703439329518e-05;-1.1651398381218e-05;1.8026372345048e-05;-4.9339396355208e-06;3.4048262023134e-05;-9.5332251248692e-07;5.0166097935289e-05;-3.9876969822217e-05;6.0918682720512e-05;6.825674790889e-05;-1.0032757018053e-05;-0.0006805551238358;0.00055276264902204;0.0002321900537936;-0.00029047875432298;0.00011830463336082;-0.00015224561502691;-0.00010149949230254;5.3350442613009e-05;-1.6670148397679e-05;2.1816389562446e-05;-3.8107486034278e-05;2.3524389689555e-05;-4.4709602661896e-05;-2.2079235350247e-05;-0.00015996651200112;-0.00020799250341952;7.2752576670609e-05;8.2737118646037e-05;-5.8117690059589e-05;-1.1196054401807e-05;-1.9320414139656e-05;-3.6763387470273e-05;6.6976506786887e-05;2.2512957002618e-05;-7.1068359829951e-05;-7.4314055382274e-05;2.0068755475222e-05;2.6630910724634e-05;0.0010333982063457;9.5881885499693e-05;0.00013558092177846;-0.00052192894509062;-0.00044395448639989;-8.0572590377415e-06;-9.6806827059481e-05;6.0673683037749e-05;0.0001043250595103;3.7976478779456e-05;1.5050058209454e-05;-1.8817790987669e-05;3.912512511306e-06;1.108552714868e-05;5.5300056374108e-06;-5.1409704610705e-05;-3.3103773603216e-05;-0.00051078491378576;-0.00050037866458297;-0.00027199892792851;-0.00027856015367433;-7.4139211392321e-06;-5.4079377150629e-05;8.5187684817356e-06;1.7612930605537e-05;0.00012236346083228;0.00011207493662369;-2.0340259652585e-05;-3.6366192944115e-05;-4.9813039368019e-05;-3.2422278309241e-05;0.00038429419510067;-0.00041419445187785;3.7481036997633e-05;0.00060676014982164;0.00054953346261755;2.4055776520981e-05;9.1834583145101e-05;7.2238995926455e-05;9.7092502983287e-05;9.3172675406095e-05;9.7053954959847e-05;-5.8845020248555e-05;-5.1262704801047e-05;3.3370452001691e-05;2.3515529392171e-05;-2.6948007871397e-05;0.00010374767589383;-4.9568821850698e-05;-0.001075511216186;0.00019427575170994;-0.0016605112468824;0.00017007706628647;3.9876729715616e-05;6.7019354901277e-05;-0.00017534784274176;5.3193409257801e-05;-0.00052065477939323;0.00011359372001607;-0.0012211804278195;-4.364583583083e-05;8.1339814641979e-05;0.00046654485049658;0.00022955956228543;-0.00019040070765186;-0.00025688324240036;-9.3536918939208e-06;-0.00025591484154575;0.00066865963162854;-8.5724124801345e-05;0.0028664402198046;-0.00010070157441078;0.00029304384952411;-5.7227538491134e-05;7.171333709266e-05;-1.8106691641151e-05;0.00032859557541087;0.0002309999690624;-0.00040838326094672;0.00016580653027631;0.001443829969503;-0.00022391506354325;-0.00086247944273055;0.00011626439663814;-0.00024031994689722;-3.9800848753657e-05;9.4502989668399e-05;-0.00017569075862411;0.00029373678262345;2.0103298083995e-05;-0.00016788778884802;-4.6492943511112e-05;-0.0002576817641966;-0.00093043106608093;0.00010115915938513;-1.3752806808043e-05;0.00056925986427814;-0.00021247944096103;-0.00027504065656103;0.00050755206029862;-1.7594429664314e-05;-0.00047701166477054;9.2134941951372e-05;0.00063738570315763;5.3271112847142e-05;-0.00012314152263571;-9.7928159448202e-06;0.0001558895164635;1.9049983166042e-05;0.00017241611203644;0.00030897205579095;0.00063881371170282;-0.00032337338780053;-0.00013465411029756;-0.00019688793690875;8.3668179286178e-05;0.00012080829765182;-0.0001804246858228;-8.1288519140799e-05;-0.0012512768153101;7.1604175900575e-05;-0.0002371307782596;-5.334458546713e-05;0.00033580858143978;-0.0010113501921296;-0.00054515572264791;0.00010212706547463;0.00059419393073767;0.00050525029655546;0.00034242373658344;-0.00016344597679563;-0.00014984443259891;0.00080840406008065;0.00015757553046569;-0.00026858277851716;3.0173307095538e-05;0.00053875707089901;-4.0229584556073e-05;-0.00019305662135594;-2.503951327526e-05;0.00010517989721848;-0.00010372071119491;-0.0015421714633703;0.00031303137075156;-0.0022611727472395;0.00023494572087657;2.2679638277623e-05;6.5592721512076e-05;-0.00017437798669562;6.3781844801269e-05;-0.00046232924796641;0.00014103540161159;-0.0014541549608111;-3.2287076464854e-05;3.3053438528441e-05;0.00070843700086698;0.00015157075540628;-0.00031041444162838;-0.0004261861613486;0.00022733588411938;-0.0002826462732628;0.0010056579485536;-8.0558165791444e-05;0.0034962641075253;-0.00018014022498392;0.00043919452582486;-7.2183735028375e-05;-2.5465069484198e-06;-2.3155436792877e-05;0.00042532436782494;0.00028356252005324;-0.00052310520550236;0.00016990279254969;0.0015226759715006;-0.00022344608441927;-0.00084022944793105;0.00013293934171088;-0.00027147034415975;-4.8650199460099e-05;0.00010039671178674;-0.00021329254377633;0.00063194945687428;1.9154407709721e-05;-0.00024946848861873;-4.6857792767696e-05;-0.0003257493081037;-0.00095757405506447;0.00019651869661175;2.4812841729727e-05;0.00057470420142636;-0.00029022959643044;-0.00034952748683281;0.00047973150503822;-2.8342224140943e-06;-0.0006681049708277;9.4614864792675e-05;0.00074687821324915;6.4329018641729e-05;-0.00028504608781077;-1.2309124031162e-05;0.00026572437491268;-1.7362282960676e-05;0.00027052548830397;0.00033467909088358;0.00068015477154404;-0.00031010608654469;-0.0005978787667118;-0.0001392466656398;4.277756306692e-05;0.00013627531006932;-0.00020601648429874;-4.0337126847589e-05;-0.0017033438198268;9.3945047410671e-05;-0.00049651716835797;-8.3241313404869e-05;0.00036684790393338;-0.0010987002169713;-0.00049869267968461;5.4557844123337e-05;0.00067356316139922;0.00044370777322911;0.00022888061357662;8.0731449997984e-05;-0.00021486882178579;0.0015225240495056;0.00016447369125672;-0.00017434124310967;1.351267019345e-05;0.00067508284701034;-3.4281783882761e-05;-0.00016730478091631;-3.4879685699707e-05;9.8279560916126e-05;-8.923275890993e-05;-0.0011685396311805;0.00025589187862352;-0.0016461685299873;0.00016835836868268;5.7779188864515e-06;3.5904446122004e-05;-9.300879901275e-05;6.0058293456677e-05;-0.00029421492945403;9.2979847977404e-05;-0.00091734086163342;-1.0571667189652e-05;-4.4679066490971e-07;0.0005524784210138;8.1834396041813e-06;-0.00025874623679556;-0.00035034253960475;0.00030340132070705;-0.00015978392912075;0.0007874250295572;-5.1285718654981e-05;0.0023641735315323;-0.00015071882808115;0.00031093769939616;-5.348020567908e-05;-1.9387425709283e-05;-1.3229540854809e-05;0.00026752837584354;0.00018062275194097;-0.00033615215215832;9.0828660177067e-05;0.00073032855289057;-9.1140274889767e-05;-0.00058108323719352;7.9050128988456e-05;-0.00017046157154255;-2.6103920390597e-05;4.7419660404557e-05;-0.0001346392382402;0.00052401114953682;1.8047250705422e-05;-0.00026912728208117;-2.0268415028113e-05;-0.00021165405632928;-0.00048765586689115;0.0001007686732919;2.2868567612022e-05;0.00027191138360649;-8.4498322394211e-05;-0.00021372288756538;0.00030520002474077;2.6715056264948e-06;-0.00029644995811395;3.5601246054284e-05;0.0005008282023482;3.8368634704966e-05;-0.00024178459716495;-1.2117834558012e-05;0.00022833319962956;-5.2769686590182e-05;0.00023615465033799;0.00019522169895936;0.00026747866650112;-0.00012557925947476;-0.00062609749147668;-4.2670613765949e-05;-2.4274211227748e-06;8.4223480371293e-05;-0.00013355145347305;2.1906864276389e-05;-0.0011910297907889;6.73721297062e-05;-0.00047915315371938;-5.9445614169817e-05;0.00021692212612834;-0.00058319949312136;-0.00023952977790032;9.2192030933802e-06;0.0003588282270357;0.00024132036196534;4.9850230425363e-05;0.00018396867380943;-0.00016877635789569;0.0013546486152336;8.251555118477e-05;-2.5187122446368e-05;-8.8033548308886e-06;0.00043663172982633;-1.5190144949884e-05;-5.2851406508125e-05;-2.9001323127886e-05;-1.3347054846236e-05;0.00082572991959751;5.8585534134181e-05;0.0015425158198923;-0.00014548834587913;3.4537551982794e-05;-0.00018586475925986;9.3952752649784e-05;-3.1179126381176e-05;0.00035704518086277;-1.6248113752226e-05;0.0010361128952354;-7.8388147812802e-05;6.9804768827453e-06;3.3264299418079e-05;-0.00034586255787872;-0.00017297413432971;0.0001834258728195;-2.572599441919e-05;0.00017255153215956;-0.00068372394889593;0.00026148822507821;-0.0023742218036205;3.3167125366163e-05;-0.00036317037302069;8.8231900008395e-05;2.316484142284e-06;3.5687728086486e-05;-0.00031459121964872;1.4193567949405e-05;-0.0003313705092296;0.00015106367936824;0.0011447148863226;7.5482785177883e-05;-0.00033175802673213;-0.00012865653843619;-0.00014534723595716;0.00011640330194496;6.2096209148876e-05;-3.4412205422996e-05;0.00033736223122105;-9.6166178991552e-05;-3.2782485504868e-05;-2.2414455997932e-06;-0.00017261522589251;-4.1440398490522e-05;-0.00057180825388059;0.00027201574994251;1.8802096747095e-05;-0.00042296067113057;0.00035437909536995;0.00021776373614557;-0.00029329376411624;-0.00060217670397833;2.6795887606568e-06;0.00039043926517479;6.1728947912343e-05;-0.00014369528798852;3.4349548514001e-05;0.00010660328553058;4.8405204324808e-06;0.00016491713176947;-3.7397755932034e-06;0.00059508782578632;0.00018777049263008;-0.00028233049670234;-0.00021498587739188;5.2793646318605e-05;-9.9619101092685e-05;-0.00011674498091452;8.5935913375579e-05;-0.001182904583402;-2.6258607249474e-05;-0.00020612972730305;4.6297853259603e-05;0.00022426154464483;-4.8500292905373e-05;-0.00072523974813521;-0.00031092693097889;1.7268946976401e-05;0.00021515965636354;0.00043858861317858;2.2782925952924e-05;0.00017852800374385;0.00081691314699128;-0.00010348852083553;-0.00016216894437093;0.00010480610217201;0.00049256737111136;1.1773383448599e-05;-0.00015047664055601;-2.1938338250038e-05;-5.0922324589919e-05;-4.5579604375234e-06;0.00072441401425749;3.7225305277389e-05;0.0014851149171591;-0.00012010813225061;2.4064736862783e-05;-0.00018034006643575;0.0001050466162269;-3.7703386624344e-05;0.00047174919745885;-2.0569294065353e-05;0.0010259846458212;-8.0325778981205e-05;-2.2032494598534e-05;4.2181916796835e-05;-0.00027709710411727;-0.00020370713900775;0.0001693804806564;4.634516153601e-05;0.00012570366379805;-0.00064315105555579;0.0002692430280149;-0.0023926219437271;4.7390964027727e-05;-0.00032226863550022;7.0498521381523e-05;-5.2342689741636e-05;3.6605568311643e-05;-0.00028646612190641;1.3265513189253e-05;-0.00032203551381826;0.00015068057109602;0.0011884532868862;7.6694690505974e-05;-0.00043364489101805;-0.00013112397573423;-0.00015733586042188;0.00012242786760908;6.2914863519836e-05;-3.2864310924197e-05;0.00023732254339848;-9.4537230324931e-05;-4.9141359340865e-05;-3.7940832697814e-08;-0.00016289240738843;-4.3821255530929e-05;-0.00059986423002556;0.00024907183251344;3.0447713470494e-06;-0.00040779577102512;0.0003735359350685;0.00028036776348017;-0.00029467078275047;-0.00051428627921268;-8.224531597989e-07;0.00040826664189808;6.1391074268613e-05;-9.3366696091834e-05;3.3207161322935e-05;8.5912433860358e-05;4.949472440785e-06;0.00015216979954857;3.4855399917433e-06;0.00057473086053506;0.00019353645620868;-0.00014998576079961;-0.00023322289052885;7.1692040364724e-05;-0.00014066329458728;-0.00011936842201976;8.894999336917e-05;-0.0010984188411385;-3.762499181903e-05;-0.00014272614498623;4.2831281461986e-05;0.00022924110817257;-3.7845773476874e-05;-0.00074262282578275;-0.00039449601899832;3.7807018088643e-05;0.00031256477814168;0.00043917505536228;-6.2212995544542e-05;0.0002593481040094;0.00064535858109593;-9.3250346253626e-05;-0.00020455769845285;0.00010897304309765;0.00046798959374428;1.7524424038129e-05;-0.00016121775843203;-2.7163967388333e-05;-1.2031586038574e-06;3.9596670831088e-06;-0.00041195657104254;0.00029504223493859;0.0001732027012622;-3.8955004129093e-05;-7.9395496868528e-05;0.00012010330829071;8.317266292579e-06;-1.0397727237432e-05;7.4087365646847e-05;-5.4298579925671e-05;1.2417172001733e-05;1.9137249182677e-05;6.0374084569048e-05;-4.5995147957001e-05;0.00012240929936524;8.7987034930848e-05;-1.1389440260245e-05;-0.0006176886963658;0.00045082595897838;0.00027148917433806;-0.0003478272119537;0.00020284521451686;-0.00020880809461232;-0.00011619769065874;5.1557693950599e-05;-3.521355392877e-05;4.149087544647e-05;-3.2308842492057e-05;1.6388908989029e-05;-4.1717059502844e-05;-2.1064983229735e-05;-0.00011793643352576;-0.00022448696836364;0.00028009651578031;0.00025600148364902;-2.7623953428701e-05;2.5863279006444e-05;-2.7297086489853e-05;-4.9567239329917e-05;3.3503594750073e-05;-1.5229186089982e-07;-4.1828399844235e-05;-6.5160071244463e-05;4.5242879423313e-05;5.0144768465543e-05;0.0014572779182345;0.00052515568677336;0.00015520090528298;-0.0010320225264877;-0.00087862584041432;-0.00013192131882533;-0.00023140758275986;4.6190183638828e-05;0.000126247148728;-4.0600905776955e-05;-5.275627336232e-05;-1.8136770449928e-05;2.7205896913074e-06;-1.5536619457635e-06;2.1439308284243e-07;-0.00012044311006321;-7.3127841460519e-05;-0.00062310451176018;-0.00062357768183574;-0.00026431557489559;-0.00026150912162848;-3.6677480238723e-05;-9.5816831162665e-05;1.2424690794433e-05;2.0539468096104e-05;0.0001752803218551;0.00015174127474893;-4.0076392906485e-05;-5.9565958508756e-05;-4.2540017602732e-05;-1.5627492757631e-05;0.00073000707197934;-0.00060693710111082;3.42966086464e-05;0.00060730439145118;0.00050814572023228;9.6968746220227e-05;0.00019046542001888;8.0208439612761e-05;0.00012339028762653;9.4025599537417e-05;9.0346293291077e-05;-6.1658007325605e-05;-5.1321712817298e-05;3.7125322705833e-05;2.4029166524997e-05;-3.9600581658306e-06;2.9286004519236e-06;-0.00037390930810943;0.00031980863423087;0.00016823620535433;-4.276600520825e-05;-7.9850149631966e-05;0.00011853575415444;8.1346879596822e-06;-1.0281103641319e-05;6.9368717959151e-05;-5.6680109992158e-05;1.5190669728327e-05;2.2433592675952e-05;5.9888669056818e-05;-4.5860571844969e-05;7.3365983553231e-05;7.7901866461616e-05;-9.9291455626371e-06;-0.00060410372680053;0.00046334223588929;0.00027128029614687;-0.00034459322341718;0.00019017074373551;-0.00021779361122753;-0.00011371068831068;5.2706058340846e-05;-3.3574589906493e-05;4.2321025830461e-05;-3.3308901038254e-05;1.4707424270455e-05;-4.2644551285775e-05;-1.8999853637069e-05;-0.00014079950051382;-0.00020564501755871;0.0002765336248558;0.00025066966190934;-2.5972058210755e-05;2.3519243768533e-05;-2.8784494134015e-05;-4.7366102080559e-05;3.9769256545696e-05;-6.1348255258054e-06;-4.7580877435394e-05;-6.000150096952e-05;4.5914024667582e-05;4.8618119762978e-05;0.0014454837655649;0.00051546096801758;0.00015363497368526;-0.0010056652827188;-0.00088092626538128;-0.00013303854211699;-0.00022330317005981;5.7207689678762e-05;0.00011865086707985;-4.1505787521601e-05;-5.0432925490895e-05;-2.0014091205667e-05;4.3336031012586e-06;1.0692888281483e-06;-2.0501888684521e-06;-0.00011359868221916;-7.8122000559233e-05;-0.00062230363255367;-0.00061499839648604;-0.0002527815522626;-0.00026758611784317;-3.7815108953509e-05;-9.1920905106235e-05;1.1605548934313e-05;2.0980611225241e-05;0.00017572617798578;0.00015061668818817;-4.2425450374139e-05;-5.6493561714888e-05;-4.0067865484161e-05;-1.8402590285405e-05;0.00072412972804159;-0.00059664319269359;3.4469954698579e-05;0.00057635235134512;0.0005263450439088;9.9870281701442e-05;0.0001801363832783;8.5905667219777e-05;0.00011620231816778;8.931546472013e-05;9.3586801085621e-05;-6.2701838032808e-05;-5.0727030611597e-05;3.7873516703257e-05;2.3471397071262e-05;5.8329245803179e-05;-6.1293118051253e-05;-4.6849581849528e-05;-0.0007321544107981;0.00011830742732855;-0.0012299275258556;0.00013846249203198;5.7246934375144e-06;3.5133296478307e-05;-0.00010117549390998;-2.7479467462399e-05;-5.0523492973298e-05;8.4437044279184e-05;-0.00089320656843483;-2.3753815185046e-05;-2.7833944841404e-05;0.00029768678359687;0.00015434384113178;-0.00014760991325602;-0.00016120435611811;3.3429689210607e-05;-0.00018936727428809;0.00051428086590022;-1.7966645827983e-05;0.0018534231930971;-8.3056671428494e-05;0.00031652610050514;-2.2312155124382e-05;-9.971115650842e-05;-2.1426574676298e-05;0.00032676744740456;0.00016263558063656;-0.00033943034941331;0.00012017023254884;0.0013345491606742;-0.00019911595154554;-0.00014685736095998;9.6968658908736e-05;-0.00014278232993092;-4.341143721831e-05;8.3695325884037e-05;-0.0001165718131233;0.000392742222175;-1.0831143299583e-05;6.8767913035117e-05;-4.7450896090595e-05;-0.000207604811294;-0.00070041429717094;0.00034123854129575;5.4377389460569e-05;0.00044671905925497;-0.0005530898924917;-0.00029880256624892;0.00011967728642048;-7.2412672125211e-06;-0.00084776344010606;0.00010515097528696;0.00036086654290557;4.07574007113e-05;-0.00018534163245931;7.2596958489157e-06;0.00011113328218926;5.4398838983616e-05;7.5099917012267e-05;0.00020073469204362;0.00083997088950127;-0.00027383104315959;-0.00037676203646697;-6.109279638622e-05;-1.0043597285403e-05;7.7430064266082e-05;-0.00010409901005914;-7.4802846938837e-05;-0.0011590984649956;5.2723058615811e-05;-0.00020860905351583;-6.4176783780567e-05;0.0002388057182543;-0.00086931890109554;-0.0002843092661351;1.3015278454986e-05;0.00057669897796586;0.00011919938697247;0.00010965072578983;0.00012312151375227;-9.9531549494714e-05;0.00074476096779108;0.00012644937669393;-9.9242301075719e-05;2.2251721020439e-05;0.00051381316734478;-1.9703707948793e-05;-0.0001835028961068;6.0608501371462e-05;-5.7441204262432e-05;-7.8797704190947e-05;-0.0010437833843753;0.0001914576132549;-0.0016243915306404;0.00017915616626851;2.9081158459121e-07;4.0880040614866e-05;-0.00011892563634319;-2.1385993022704e-05;-5.282483107294e-05;0.00010646763257682;-0.0011164186289534;-2.0914789274684e-05;-4.1443352529313e-05;0.00045827878057025;0.00014307770470623;-0.00021009394549765;-0.00026740733301267;0.00013574839977082;-0.00022339340648614;0.00070892734220251;-1.9462902855594e-05;0.0023744620848447;-0.00012874133244622;0.00041024721576832;-3.3277694456046e-05;-0.00013023246719968;-2.6182593501289e-05;0.0004055165045429;0.00021882037981413;-0.00044410256668925;0.00013382478209678;0.0015453450614586;-0.00023868895368651;-0.00016419096209574;0.00011131857172586;-0.00017719056631904;-5.3271549404599e-05;0.00010035480954684;-0.00016050178965088;0.0005920123658143;-1.316755424341e-05;4.9959537136601e-05;-5.1577302656369e-05;-0.00026684271870181;-0.00081816484453157;0.000393659574911;7.4154595495202e-05;0.00052403972949833;-0.00062753347447142;-0.00034834767575376;0.00013045202649664;9.009154382511e-06;-0.0010531836887822;0.00012081850582035;0.00046003653551452;5.4831194574945e-05;-0.00027590218815021;4.8814122237673e-06;0.00016914747538976;4.060263017891e-05;0.00013510754797608;0.00025001366157085;0.00091669440735132;-0.0003042301395908;-0.00059979036450386;-5.6693257647566e-05;-1.7498672605143e-05;9.5536670414731e-05;-0.0001296080154134;-6.7892724473495e-05;-0.0014590456848964;7.1120106440503e-05;-0.00032700976589695;-8.1833968579303e-05;0.00027891510399058;-0.0010202437406406;-0.00033800644450821;-4.5892229536548e-06;0.00067494239192456;0.00017006268899422;0.00010537305206526;0.00022306345636025;-0.00014427670976147;0.0011059627868235;0.00014483845734503;-8.329215052072e-05;1.886950849439e-05;0.00061684066895396;-2.1920832296018e-05;-0.0001920114737004;0.00011237459693803;-6.7421999119688e-05;0.00045807100832462;6.0721868067048e-05;0.00077065627556294;-6.7712811869569e-05;2.1294927137205e-05;-9.9757686257362e-05;3.7894609704381e-05;-5.7903507695301e-06;-0.00015436697867699;3.4377157135168e-05;0.00056548014981672;-3.5977791412733e-05;6.5099549829029e-05;6.6433576648706e-06;-0.00022438234009314;-0.00011046399595216;8.6891377577558e-05;-8.6329337136704e-06;0.00011036056093872;-0.00032724248012528;0.00013448008394334;-0.0010627954034135;-2.747928192548e-05;-0.00025450540124439;5.5809930927353e-05;0.00015505589544773;5.9171238717681e-06;-0.00024786326684989;1.3264285371406e-05;-0.00020444329129532;7.399739115499e-05;0.00077181664528325;5.3602336265612e-05;0.00011779937631218;-8.5050451161806e-05;-5.6136614148272e-05;5.9820711612701e-05;4.2599760490702e-05;-2.7553000109037e-05;0.00035557022783905;-4.5034903450869e-05;0.0001042923759087;-1.4185329746397e-05;-0.00011950822954532;-2.6715635613073e-05;-0.00033589339000173;0.00028020839090459;5.868898369954e-05;-0.00041314802365378;0.00020434435282368;-4.8315818276023e-05;-0.00020351810962893;-0.00068922596983612;-3.1407448659593e-06;0.00016156458877958;5.4180833103601e-05;-0.00016899339971133;2.1005131202401e-05;7.1986672992352e-05;9.385096745973e-06;6.5773769165389e-05;1.8738510334515e-05;0.0005529512418434;9.6117866632994e-05;-0.00033881139825098;-0.00013373160618357;-4.0308732423e-06;2.5995959163083e-07;-5.4672997066518e-05;4.3995056330459e-05;-0.00082808773731813;-2.1181036572671e-05;-0.00015471718506888;2.6828896807274e-05;0.00012084418995073;-4.5312750444282e-05;-0.0004815666761715;-8.2592116086744e-05;-2.6066687496495e-05;-3.7369685742306e-05;0.00031647333526053;0.00014789530541748;3.7933895669084e-07;0.00059826439246535;-5.6781314924592e-05;-3.3868025639094e-05;6.4322943217121e-05;0.00034160946961492;6.7546620812209e-06;-9.6866722742561e-05;-5.5520695241285e-06;-6.9616427936126e-05;8.0925165093504e-05;-0.00058756303042173;0.00035979694803245;7.0075213443488e-05;4.3227995774942e-05;-5.2981482440373e-05;8.6892519902904e-05;1.7063398445316e-06;-4.9007999223249e-06;0.0001357216242468;-0.00012146754306741;-2.9521741453209e-05;3.9386522985296e-05;4.2774456233019e-05;-2.272365418321e-05;0.00018250825814903;5.9470508858794e-05;-1.2377998245938e-05;-0.00021626983652823;7.1217349614017e-05;0.00019295742094982;-0.00024115324777085;0.00023891254386399;-0.0001760939048836;-7.77038076194e-05;1.049614729709e-05;-4.6117744204821e-05;5.4954191000434e-05;-7.6563364928006e-06;-4.8756555770524e-06;1.2728123692796e-05;-2.7538733320398e-06;1.1444685696915e-05;-0.00014810416905675;0.00045009722816758;0.00038309098454192;4.0820454159984e-05;8.6102954810485e-05;-2.821159978339e-05;-4.8574933316559e-05;-7.2071707108989e-05;-4.551430902211e-05;3.7065310607431e-05;-1.5377467207145e-05;6.1913757235743e-05;5.769637573394e-05;0.0013599485391751;0.00093236943939701;0.00011818151688203;-0.0012924862094223;-0.0010722770821303;-0.00027001681155525;-0.00035750379902311;1.2981386134925e-05;0.00010727243352449;-0.00014757589087822;-0.00013080830103718;-6.4939063122438e-06;-4.3094869397464e-06;-2.3819880880183e-05;-5.8137916312262e-06;-0.00019568734569475;-0.00010452885908308;-0.00041225328459404;-0.00048376846825704;-4.2274281440768e-05;-5.3006591770099e-05;-4.5235559809953e-05;-9.6616167866159e-05;9.5833756859065e-06;1.2539435374492e-05;0.00017110136104748;0.00014095778169576;-3.5447501431918e-05;-6.0967679019086e-05;-6.2900980992708e-06;2.0227122149663e-05;0.00095838063862175;-0.00040154665475711;3.1348750781035e-05;0.00015107990475371;8.7899170466699e-05;7.4295829108451e-05;0.00016484811203554;5.5514751693408e-06;8.4381608758122e-05;2.7318194042891e-05;2.2044907382224e-05;-3.0355675335159e-05;-2.499120637367e-05;1.9473311112961e-05;1.1938403076783e-05;-0.00010336962441215;0.00011014097253792;-0.00076518475543708;0.00055123708443716;0.00011615423863987;4.0003564208746e-05;-8.2613820268307e-05;0.00013244194269646;3.3138146591227e-06;-7.4490808401606e-06;0.00018786566215567;-0.00016994586621877;-3.1069379474502e-05;5.8453202655073e-05;6.3897357904352e-05;-3.9919450500747e-05;0.00018393847858533;8.950057963375e-05;-1.4908609955455e-05;-0.00037511030677706;0.00018763179832604;0.00029240109142847;-0.00037262227851897;0.00031736015807837;-0.00027724247775041;-0.00011576465476537;2.8035774448654e-05;-6.561131158378e-05;7.9141755122691e-05;-1.5975991118466e-05;-4.7298576646426e-06;6.12000530964e-06;3.3584078664717e-06;-4.7930978325894e-05;-0.00021041164291091;0.00062108191195875;0.0005363454692997;5.2451508963713e-05;0.00011207278294023;-4.3511874537216e-05;-6.8635519710369e-05;-7.574259507237e-05;-7.2889881266747e-05;3.0453344152193e-05;-2.1884206944378e-05;8.8254899310414e-05;8.3825725596398e-05;0.0019993507303298;0.0012814326910302;0.00017533333448227;-0.0018046617042273;-0.0015497016720474;-0.00037457255530171;-0.00048563975724392;4.6806391765131e-05;0.00015604925283697;-0.00019901045016013;-0.00018077314598486;-1.649780824664e-05;-3.3422795695515e-06;-2.5911112970789e-05;-1.1819372957689e-05;-0.00026135775260627;-0.00016107098781504;-0.00065561442170292;-0.00070860865525901;-8.3870785601903e-05;-0.00010924838716164;-6.3985025917646e-05;-0.00013573713658843;1.2817965398426e-05;2.0440045773285e-05;0.00025787568301894;0.00020886946003884;-5.7952045608545e-05;-8.2428276073188e-05;-1.2968112059752e-05;2.0838031559833e-05;0.0013715360546485;-0.00060180103173479;4.622774940799e-05;0.00026143281138502;0.00019668132881634;0.00011284889478702;0.00023119278193917;3.4315482480451e-05;0.00011452307080617;4.4050506403437e-05;4.4130898459116e-05;-5.5915901612025e-05;-4.1183997382177e-05;3.5529159504222e-05;1.843258178269e-05;-0.00011259608436376;0.00010860506881727;-0.00067674525780603;0.000599778839387;0.00010559658403508;3.1656956707593e-05;-8.3190971054137e-05;0.00013026148371864;3.8210187085497e-06;-7.2620587161509e-06;0.00018324551638216;-0.00017045719141606;-2.3235004846356e-05;6.439772550948e-05;5.992852311465e-05;-4.1636361856945e-05;8.2914979429916e-05;8.1886071711779e-05;-1.0998164725606e-05;-0.00035382632631809;0.00021040959109087;0.00028740256675519;-0.00037073282874189;0.00028058190946467;-0.0002973570371978;-0.00010643267160049;3.2861826184671e-05;-6.3942279666662e-05;7.8822879004292e-05;-1.7317515812465e-05;-6.4418718466186e-06;-1.4285566294348e-06;1.5337085642386e-05;-9.2597998445854e-05;-0.00017372793809045;0.00060018722433597;0.00052309990860522;5.5813889048295e-05;0.00010540161747485;-4.590561366058e-05;-6.4243169617839e-05;-5.8288616855862e-05;-9.0577421360649e-05;1.670631536399e-05;-9.6397934612469e-06;8.6583160737064e-05;8.2064958405681e-05;0.0019611476454884;0.001247585634701;0.00017100005061366;-0.0017280394677073;-0.0015466760378331;-0.00037443861947395;-0.00046126445522532;6.8046167143621e-05;0.00014354463201016;-0.00019407307263464;-0.00017789444245864;-2.1643807485816e-05;4.5581924723592e-07;-1.9043251086259e-05;-1.7491829567007e-05;-0.00024110500817187;-0.00017595650570001;-0.0006646066904068;-0.00066894985502586;-6.6567699832376e-05;-0.00011140786955366;-6.3159568526316e-05;-0.00012827076716349;1.0518796443648e-05;2.1731824745075e-05;0.00025808552163653;0.00020417758787517;-6.2820596212987e-05;-7.2433584136888e-05;-9.2461114036269e-06;1.645331576583e-05;0.0013507093535736;-0.00057370256399736;4.6901554014767e-05;0.00022071630519349;0.00020794707234018;0.00011179347347934;0.00020998767286073;4.9153306463268e-05;9.1658504970837e-05;3.5501318052411e-05;4.7377896407852e-05;-5.9548419812927e-05;-3.8547492295038e-05;3.8151825719979e-05;1.5457399058505e-05;-8.7996217189357e-05;7.948176789796e-05;-0.00040787350735627;0.00042719460907392;5.1039660320384e-05;2.6317951778765e-05;-5.2655723266071e-05;8.135490497807e-05;3.0717783374712e-06;-4.9736822802515e-06;0.00012430622882675;-0.00011818915663753;-1.3354079783312e-05;4.6462373575196e-05;3.4052907722071e-05;-2.5239660317311e-05;1.6348574263247e-06;4.7937210183591e-05;-4.9755622058001e-06;-0.00017958634998649;0.00011186770279892;0.00017806282266974;-0.00023277635045815;0.00016282332944684;-0.00020202659652568;-5.8568395616021e-05;1.8976052160724e-05;-4.1658870031824e-05;5.2104562200839e-05;-1.0301966540283e-05;-6.512590971397e-06;1.0862140698009e-06;2.0899477021885e-05;-6.8387991632335e-05;-7.9595585702918e-05;0.00038955922354944;0.00034173644962721;4.4924108806299e-05;7.1017595473677e-05;-3.1295716325985e-05;-3.9249789551832e-05;-4.1210441850126e-05;-7.7338714618236e-05;1.1927441846638e-05;7.4882505032292e-06;5.589298234554e-05;5.2409672207432e-05;0.0012400223640725;0.00083053519483656;0.00010585798736429;-0.0011022144462913;-0.0010223872959614;-0.00025652488693595;-0.00029843373340555;5.2309049351607e-05;8.3510785771068e-05;-0.00013148071593605;-0.00012065475311829;-1.5917570635793e-05;2.000013637371e-06;-1.0771354027383e-05;-1.5713792890892e-05;-0.00015358674863819;-0.00012856847024523;-0.00041138374945149;-0.00038976906216703;-1.046758825396e-05;-5.1027705922024e-05;-4.0442981116939e-05;-7.9295714385808e-05;5.1571332733147e-06;1.4406967238756e-05;0.00016537281044293;0.00012696611520369;-4.1142473492073e-05;-3.9181246393127e-05;-3.8631924326182e-07;1.2045656148985e-05;0.00088616053108126;-0.0003304069978185;3.2265961635858e-05;7.6630400144495e-05;9.7042706329376e-05;6.4857536926866e-05;0.00011827114212792;2.8962715077796e-05;3.7361412978498e-05;1.1216209713893e-05;2.5443181584706e-05;-3.6553446989274e-05;-1.9394501578063e-05;2.3718872398604e-05;5.7276397456008e-06;0.0001512598246336;-0.00023831138969399;-4.0371531213168e-05;-0.00039316242327914;1.8552405890659e-05;-0.00080983422230929;0.00010769102664199;-8.4496571162163e-07;1.3228453099146e-05;-5.4851949244039e-05;-0.00011332535359543;0.00038743048207834;6.0309354012134e-05;-0.00065947731491178;-1.3851237781637e-05;-0.00011617777636275;0.00012640473141801;0.00016111879085656;-9.0125620772596e-05;-4.5724802475888e-05;-3.4359745768597e-05;-0.0001462265936425;0.00031277266680263;4.761574746226e-05;0.0010279526468366;-5.0244452722836e-05;0.00032290173112415;1.213226641994e-05;-0.00027026954921894;-2.6388219339424e-05;0.00035417702747509;8.7929671281017e-05;-0.00026640566647984;0.00012019448331557;0.0013793982798234;-0.00018688361160457;0.00037122538196854;9.0200846898369e-05;-7.0530179073103e-05;-4.791269384441e-05;8.0701916886028e-05;-5.1617778808577e-05;0.00042079508421011;-3.2870604627533e-05;0.00027814909117296;-5.643438998959e-05;-0.00017838584608398;-0.0006041185115464;0.00056200037943199;0.00010825844947249;0.00038678228156641;-0.00086055655265227;-0.00034869695082307;-0.0001649200276006;-3.1481398764299e-05;-0.0011700601316988;0.0001284707832383;0.00016128511924762;2.6620749849826e-05;-0.00022354537213687;2.4377241061302e-05;6.8030080001336e-05;0.00011476825602585;-4.2786461563082e-05;0.00012065339979017;0.0011847902787849;-0.00028595459298231;-0.00045298543409444;2.9247159545776e-05;-7.3468385380693e-05;4.8473066271981e-05;-5.1548242481658e-05;-9.9466822575778e-05;-0.0011376839829609;3.2591207855148e-05;-0.00013706157915294;-7.6556418207474e-05;0.00019148591673002;-0.00085815967759117;-7.937045302242e-05;-3.6810815799981e-05;0.00063535792287439;-0.00024131374084391;-5.191459422349e-05;0.00028046144871041;-4.1322429751744e-05;0.00058034487301484;0.0001226358290296;-1.6983362002065e-05;2.6796898964676e-05;0.00053327315254137;-5.5291125136137e-06;-0.00021196338639129;0.00011339134653099;-0.00016498939658049;-6.2421386246569e-05;-0.00064252648735419;9.3525435659103e-05;-0.0010544523829594;0.00012530737149063;-6.4330606619478e-06;1.9554750906536e-05;-6.9543428253382e-05;-7.6463664299808e-05;0.00024859749828465;7.1193724579643e-05;-0.00078165647573769;-9.9358303486952e-06;-9.3587965238839e-05;0.00026989629259333;0.00012582782073878;-0.00012863890151493;-0.000147535072756;6.4810330513865e-05;-0.0001574993802933;0.00044274830725044;2.9319904570002e-05;0.0014171788934618;-8.4395222074818e-05;0.00034869977389462;-3.7400559449452e-06;-0.00022146016999613;-2.5452802219661e-05;0.00036068027839065;0.00014068034943193;-0.00033036249806173;0.00010884465882555;0.0013545289402828;-0.00020692076941486;0.00024097261484712;8.6065199866425e-05;-9.6074800239876e-05;-4.8182166210609e-05;8.4256702393759e-05;-9.8431606602389e-05;0.00050457997713238;-2.8272192139411e-05;0.0002065587323159;-4.9631242291071e-05;-0.00020195060642436;-0.00063551875064149;0.00047534451005049;9.807113383431e-05;0.00041670681093819;-0.00074499036418274;-0.00031638468499295;-9.5141687779687e-05;-2.8570897825375e-07;-0.001132752513513;0.0001214732619701;0.00023831389262341;3.9271464629564e-05;-0.00024870314518921;1.5379020624096e-05;0.00010255540837534;7.4617993959691e-05;3.3297797926934e-05;0.0001626053272048;0.0010042161447927;-0.00026746740331873;-0.00053154688794166;1.028968290484e-05;-5.6695203966228e-05;6.0350106650731e-05;-7.194093632279e-05;-7.5812669820152e-05;-0.0011920103570446;4.7413046559086e-05;-0.00020734708232339;-7.6550481026061e-05;0.00020351297280286;-0.00085892941569909;-0.00015411739877891;-3.5705565096578e-05;0.00060950097395107;-8.8391738245264e-05;-1.342161976936e-05;0.0002840964589268;-8.3535225712694e-05;0.00077115301974118;0.00012018152483506;-2.0762459826074e-05;1.9317252736073e-05;0.00053142727119848;-9.6090361694223e-06;-0.00018813619681168;0.00041345600038767;-0.00019921411876567;-0.00054547848412767;-3.8646310713375e-05;3.2390253181802e-05;0.00016897695604712;1.3928080079495e-05;-7.0624017098453e-05;-4.0420371760774e-07;1.1134899068566e-05;-0.00067683332599699;0.00014053685299587;0.00020258528820705;-1.6148931536009e-05;0.00014251282846089;3.3407162845833e-05;0.0003494402335491;-0.00030189100652933;-3.9552796806674e-05;0.00041316013084725;-0.00026501415413804;5.7114808441838e-05;0.00017188153287861;0.00026252225507051;-5.3786519856658e-05;-0.00021463546727318;-5.5507618526462e-05;0.00033147813519463;-3.837539406959e-05;-0.00024296982155647;1.4556723726855e-05;-1.6787036656751e-05;-8.7995002104435e-05;0.0012308966834098;0.00010115003533429;0.00071475666482002;-3.6299639759818e-05;3.2952461879177e-06;0.00010802553151734;4.8203139158431e-05;-3.6512901715469e-05;4.7750458179507e-05;9.2791240604129e-05;0.00044749441440217;-3.624031887739e-05;-4.9095047870651e-05;-6.5097810875159e-05;-0.00033891884959303;0.00074639794183895;0.00012092182441847;-0.0010989991715178;0.00017861170636024;-0.00031909748213366;-0.00043232212192379;-0.0011021340033039;-0.00010599816596368;-0.00010445126827108;9.7293857834302e-05;-6.5858206653502e-05;-1.49138550114e-05;-7.54987122491e-05;4.8630812671036e-05;-0.00023206845798995;0.00017383383237757;0.0013770974474028;-3.8491412851727e-05;-0.00015635234012734;-0.00022607362188864;-7.7940712799318e-05;4.7417495807167e-05;8.0247345977114e-06;1.1957540664298e-05;-0.00077417405555025;-0.00010439249308547;7.7084994700272e-05;-2.5458613890805e-05;9.6040443168022e-05;-4.8935733502731e-05;-0.00059645541477948;8.4917941421736e-05;-2.8725982701872e-05;-0.00051428499864414;0.00048201708705164;0.00017900261445902;-9.4734197773505e-05;-5.3186326113064e-05;7.831044786144e-05;9.5305540526169e-06;8.7406915554311e-05;0.00042075381497853;3.7181060179137e-05;-0.00020664864860009;7.3460651037749e-06;-0.00017314698197879;0.00018828397151083;-0.00075538677629083;0.00045810994924977;3.0448596589849e-05;8.5609848611057e-05;-4.9754162319005e-05;8.5810839664191e-05;1.9642607185233e-07;-4.7219828047673e-06;0.00021264863607939;-0.00020949078316335;-5.5339110986097e-05;5.688760211342e-05;3.9962811570149e-05;-1.1201821507711e-05;0.00022605630510952;4.8822028475115e-05;-1.7056365322787e-05;-6.0940437833779e-05;-8.9682842371985e-05;0.00019124642130919;-0.00022628851002082;0.00028448886587285;-0.00017594640667085;-6.851353100501e-05;-1.2719069673039e-05;-6.0717458836734e-05;7.8773562563583e-05;1.9880112631654e-06;-1.842761230364e-05;7.9070254287217e-05;2.0390369172674e-05;3.8837792089907e-05;-0.00013943517114967;0.00059254723601043;0.00050414953147992;9.3451206339523e-05;0.00014230220403988;-3.7178360798862e-05;-5.8009834901895e-05;-0.00018067096243612;-0.00010174340422964;8.8874563516583e-05;1.8199256373919e-05;8.3740778791253e-05;7.1374997787643e-05;0.00155562418513;0.001300161704421;0.00011782797810156;-0.0016264908481389;-0.0013593578478321;-0.00038858543848619;-0.00048925855662674;4.7831257688813e-05;0.00013379115262069;-0.00023889295698609;-0.00020122493151575;-3.2597085919406e-06;-1.2206405699544e-05;-4.0033526602201e-05;-1.1826517038571e-05;-0.00029510090826079;-0.00015781943511683;-0.00032869182177819;-0.0004736675764434;0.00014986738096923;9.8046853963751e-05;-4.284971873858e-05;-9.7557196568232e-05;6.6645397964749e-06;9.0594730863813e-06;0.00021448290499393;0.00016948219854385;-2.8918637326569e-05;-6.4846251916606e-05;1.5996874935809e-05;4.2567375203362e-05;0.0013355755945668;-0.00019668049935717;5.2984923968324e-05;-0.000220010522753;-0.00021190034749452;4.7980679482862e-06;0.00010351689707022;-7.0255271566566e-05;5.2284827688709e-05;-2.6916692149825e-05;-2.1739229850937e-05;-2.2887234081281e-05;-1.6911542843445e-05;1.3780303561362e-05;7.6446476668934e-06;-0.00025031776749529;0.00025673862546682;-0.00099866196978837;0.00072220008587465;4.9072339606937e-05;0.0001032904983731;-7.0444664743263e-05;0.00012201620120322;-2.3451375454897e-06;-3.2621885566186e-06;0.00031190121080726;-0.00029769082902931;-7.8159799159039e-05;9.4844181148801e-05;5.5159107432701e-05;-2.4139517336152e-05;0.00021891381766181;7.7253040217329e-05;-1.8380111214356e-05;-9.8713870102074e-05;-8.5683066572528e-05;0.00026422794326209;-0.00033157703001052;0.00037659695954062;-0.00029211569926701;-9.4029455794953e-05;-4.0761733544059e-06;-9.2983449576423e-05;0.00011324042861816;6.9631400947401e-06;-2.9836794055882e-05;8.3529739640653e-05;4.409959728946e-05;-1.5075127521413e-05;-0.00019442534539849;0.00085850496543571;0.0007356345304288;0.00013694177323487;0.00019565797992982;-5.6869972468121e-05;-8.0801764852367e-05;-0.0002152743836632;-0.00016061442147475;0.00010128835856449;2.9724076739512e-05;0.00012222258374095;0.00010752654634416;0.0022792480885983;0.0018568825908005;0.00016900725313462;-0.0023052527103573;-0.0019975565373898;-0.00056920386850834;-0.00068201485555619;9.2581904027611e-05;0.0001949300931301;-0.00034274309291504;-0.00029537678346969;-1.1509983778524e-05;-1.1143930350954e-05;-4.7396493755514e-05;-2.2520773200085e-05;-0.00039291146094911;-0.00024535472039133;-0.00056610064348206;-0.00067884341115132;0.00020467244030442;0.0001321995514445;-6.3683575717732e-05;-0.00013858142483514;7.1921308517631e-06;1.4386519978871e-05;0.00032902209204622;0.00025214554625563;-6.2629216699861e-05;-9.1898735263385e-05;2.2807158529758e-05;5.6909357226687e-05;0.0019448833772913;-0.00029551738407463;7.4698640673887e-05;-0.00030342183890752;-0.00029092153999954;2.0489045709837e-05;0.00014702063344885;-5.2683983085444e-05;6.6917513322551e-05;-3.6165605706628e-05;-2.4504577595508e-05;-4.5957513066242e-05;-2.6061101380037e-05;3.0460592824966e-05;1.1432211067586e-05;-0.00026881083613262;0.0002581131120678;-0.00087910814909264;0.00078814546577632;3.5319229937159e-05;9.564795618644e-05;-7.0276430051308e-05;0.0001190479088109;-1.1115993174826e-06;-2.7905175556953e-06;0.00031468612723984;-0.00029580373666249;-6.6079657699447e-05;0.00010375702549936;4.6964843932074e-05;-2.7720188882085e-05;8.6828695202712e-05;7.7078584581614e-05;-1.1978179827565e-05;-6.6891312599182e-05;-6.6994536609855e-05;0.00025111914146692;-0.00033126649213955;0.00031687546288595;-0.00032293712138198;-7.7907519880682e-05;3.2345708405046e-06;-9.35322168516e-05;0.00011115336383227;6.4677242335165e-06;-3.1230658350978e-05;6.5791376982816e-05;7.1687347372063e-05;-6.3803578086663e-05;-0.00015242298832163;0.00082976394332945;0.00071886187652126;0.00014292323612608;0.00018840710981749;-5.9255766245769e-05;-7.5891060987487e-05;-0.00018748131697066;-0.00019348120258655;8.4694744145963e-05;4.7693010856165e-05;0.00011796397302533;0.00010712259972934;0.002221408765763;0.0018165078945458;0.00016218217206188;-0.002203265670687;-0.0019925362430513;-0.0005724675138481;-0.00064951041713357;0.00011298550816718;0.00018673705926631;-0.00033411482581869;-0.00029635391547345;-2.0095147192478e-05;-5.3889589253231e-06;-3.7692687328672e-05;-3.0969422368798e-05;-0.00036255255690776;-0.00027202046476305;-0.00058607739629224;-0.0006031944649294;0.00022667209850624;0.0001467078254791;-5.9273734223098e-05;-0.0001300650765188;3.2806663057272e-06;1.6483167200931e-05;0.00032833355362527;0.00024565443163738;-7.0128378865775e-05;-7.5049858423881e-05;2.7327674615663e-05;5.3515224863077e-05;0.001922570518218;-0.00024479426792823;7.6118201832287e-05;-0.00034838585997932;-0.00031574719469063;1.0523376658966e-05;0.00011861219536513;-2.9487589927157e-05;2.6426867407281e-05;-4.7925896069501e-05;-2.5583631213522e-05;-5.1120518037351e-05;-2.1111738533364e-05;3.4819397114916e-05;5.4734223340347e-06;-0.0002243501949124;0.00020620592113119;-0.000501130358316;0.00054372497834265;-2.5864071631077e-06;7.6054537203163e-05;-4.5831257011741e-05;7.567473949166e-05;3.6863887089567e-06;-5.4146457841853e-06;0.00021979340817779;-0.00020403233065736;-2.9959575840621e-05;6.6073414927814e-05;1.9974097085651e-05;-1.3794696315017e-05;-1.5001425708761e-05;4.8207515646936e-05;-4.4622138375416e-06;2.145364851458e-05;-7.9284924140666e-05;0.00015246492694132;-0.00021032901713625;0.00015239269123413;-0.00020806466636714;-3.0766761483392e-05;-4.4056719161745e-06;-6.0414458857849e-05;7.1410620876122e-05;1.6333966641469e-06;-1.8921664377558e-05;5.7716988521861e-05;8.1533682532609e-05;-4.2145162296947e-05;-5.0368435040582e-05;0.0005011071334593;0.00044004537630826;0.00010602441761876;0.00012859425623901;-3.9641501643928e-05;-4.6316064981511e-05;-0.0001430363918189;-0.0001707340561552;6.4589992689434e-05;5.855842755409e-05;7.1174152253661e-05;6.5939508203883e-05;0.0013339971192181;0.0011684332275763;9.4166985945776e-05;-0.0013458044268191;-0.0012675554025918;-0.00037698718369938;-0.0004082468803972;8.9019864390139e-05;0.00011727477249224;-0.00021653244039044;-0.00019753533706535;-1.9110471839667e-05;-4.0078271013044e-06;-2.2672478735331e-05;-2.7481824872666e-05;-0.00023615479585715;-0.00020694607519545;-0.0003060293092858;-0.00027117304853164;0.00021911064686719;0.0001573206827743;-2.6419222194818e-05;-7.1694390499033e-05;-1.5946982330206e-06;1.1409752914915e-05;0.0002012684562942;0.0001456319441786;-3.3130952942884e-05;-2.2893629648024e-05;2.5955612727557e-05;3.8256013795035e-05;0.0012464448809624;-2.6288633307558e-05;5.6820223107934e-05;-0.00035792589187622;-0.00031767715699971;-3.9739821659168e-05;2.2130603611004e-05;-4.6762008423684e-05;-4.3384432501625e-05;-5.8786554291146e-05;-3.5795903386315e-05;-2.9789385735057e-05;-4.813582108909e-06;1.9110544599243e-05;-6.459912583523e-06;0.00019491632701829;-0.00033481165883131;-4.1384219002794e-06;5.6903438235167e-05;-9.9992503237445e-05;-0.00029977812664583;6.5857791923918e-05;4.4936737140233e-06;-1.601997155376e-06;-1.7849290088634e-05;-0.0001584679557709;0.00060174422105774;3.2921470847214e-05;-0.00035824064980261;-1.5960134987836e-05;-0.00014734553406015;-0.00011287826782791;0.00018967805954162;-1.7456713976571e-05;0.00011744172661565;-0.00017562555149198;-0.00010732249938883;6.463989848271e-05;7.4641153332777e-05;0.00021171387925278;8.0505060395808e-06;0.00024608301464468;3.6617395380745e-05;-0.0003299224190414;-2.3995544324862e-05;0.00029968470335007;-1.711338700261e-05;-0.00011911686306121;0.00012357074592728;0.0012106753420085;-0.00012331920152064;0.00058175798039883;8.3778330008499e-05;-1.3330293768377e-05;-4.1128558223136e-05;6.3183477323037e-05;3.6867724702461e-05;0.00025020696921274;-3.6518238630379e-05;0.00036860964610241;-5.9842823247891e-05;-0.0001151989781647;-0.00045424274867401;0.00064316159114242;0.00011539056140464;0.00027242422220297;-0.00094704004004598;-0.00035719765583053;-0.00028306030435488;-8.1114674685523e-05;-0.0010989480651915;0.00012211913417559;-1.4991729813119e-06;1.1289456551822e-06;-0.00016631983453408;3.6669927794719e-05;5.4462057050841e-06;0.00016579273506068;-0.00016655208310112;2.5218190785381e-05;0.0013349356595427;-0.00027161679463461;-0.00028620313969441;6.9544832513202e-05;-9.5352836069651e-05;1.9662600607262e-05;-7.3266728577437e-06;-0.00012169106048532;-0.00089715118519962;1.3405634717856e-06;-9.9543376563815e-06;-6.840103014838e-05;0.00013901472266298;-0.00072139827534556;9.0654939413071e-05;-4.1124658309855e-05;0.00058673188323155;-0.00051117775728926;-0.00013427782687359;0.00025854914565571;3.6819707020186e-05;0.00021048993221484;0.00010840458708117;2.7565999971557e-06;3.4412361856084e-05;0.0004604353744071;4.4432508730097e-06;-0.00021697938791476;0.00048014207277447;-0.00021895521786064;-0.00074819131987169;-5.5706666898914e-05;-0.0001517208002042;0.00021466180623975;9.3974358605919e-06;-6.2611907196697e-05;-1.1707235898939e-05;1.7020545783453e-05;-0.00083808467024937;0.00015277838974725;0.00011026094580302;-8.8899678303278e-06;0.00016848884115461;3.8264104659902e-05;0.00045682929339819;-0.00035012766602449;-7.1246948209591e-05;0.00050718884449452;-0.00033716985490173;0.00015611170965713;0.0001812561386032;0.00059167429571971;-5.625421545119e-05;-0.00020607408077922;-7.9943129094318e-05;0.00039470632327721;-4.5508062612498e-05;-0.0002495659282431;1.2976888683625e-05;8.8019907707348e-05;-0.00016077360487543;0.0012058062711731;0.00013645771832671;0.00076806015567854;5.9849326135009e-06;2.4205563022406e-05;0.00011651172098937;4.2235435103066e-05;-3.4117125323974e-05;-6.4344094425905e-05;0.00014687869406771;0.00048850319581106;-3.0753602914046e-05;-3.1157127523329e-05;-7.2341375926044e-05;-0.00031645517447032;0.00081835512537509;0.00012550214887597;-0.0011580587597564;0.00012994532880839;-0.00035337280132808;-0.00047395713045262;-0.0010617772350088;-0.00015967794752214;-0.00016072888683993;9.6742682217155e-05;-4.470629937714e-05;-3.1081021006685e-05;-9.6210809715558e-05;5.6304143072339e-05;-0.00032268167706206;0.00021432733046822;0.0016039776382968;-9.5747578598093e-05;-4.2406434658915e-05;-0.00023229967337102;-8.8328080892097e-05;7.3714356403798e-05;1.7714761270327e-05;2.5257311335736e-06;-0.00075427966658026;-0.00012015104584862;0.00012267420243006;-4.5636192226084e-05;9.8953758424614e-05;-5.2697927458212e-05;-0.00055877590784803;0.0002320521598449;-1.7179881979246e-05;-0.00077488203532994;0.00049087905790657;0.00014733819989488;-0.00017092136840802;-0.00020532938651741;0.0001215200900333;-3.4113531910407e-06;9.1852511104662e-05;0.00043624095269479;4.3697084038286e-05;-0.00022763278684579;1.4893191291776e-05;0.00061005831230432;-0.00027151627000421;-0.0014876858331263;-0.00017216723063029;-0.00029903059476055;0.0003822079161182;1.8841865312424e-05;-8.1484940892551e-05;-1.9826671632472e-05;1.4929939425201e-05;-0.00088370015146211;0.00019067630637437;1.1419793736422e-05;-2.1468082195497e-05;0.00019148802675772;8.0634687037673e-05;0.00098669202998281;-0.00048108011833392;-0.00010924506204901;0.00078541366383433;-0.00067309848964214;0.00023916379723232;0.00026111525949091;0.0010106654372066;-1.3497184227163e-05;-0.00022765932953916;-0.00016318063717335;0.00040673432522453;-5.8932757383445e-05;-0.00023879726359155;1.2329176570347e-05;0.00017221439338755;-0.00025536015164107;0.0016632872866467;0.00013892343849875;0.0010445144725963;8.2826518337242e-05;3.2522413675906e-05;0.00018964415357914;5.1562739827204e-05;-4.9122616474051e-05;-0.00028588832356036;0.00023848580894992;0.00065869279205799;-5.0407863454893e-05;2.1881812699576e-06;-9.7986783657689e-05;-0.00027092435630038;0.0012600315967575;0.00016109584248625;-0.0017888145521283;6.5320178691763e-05;-0.00045703878276981;-0.00072721316246316;-0.0012897092383355;-0.0002153883833671;-0.00026558001991361;0.00010857790039154;3.3309239370283e-05;-5.5974644055823e-05;-0.00018020271090791;8.6414656834677e-05;-0.00051946606254205;0.00031796147231944;0.0021003074944019;-0.00022225725115277;5.4439911764348e-05;-0.00028917781310156;-0.00012570893159136;5.224118285696e-05;4.0758415707387e-05;-7.2826505856938e-06;-0.00082027987809852;-0.00016842491459101;0.00022993731545284;-9.0082139649894e-05;0.00011070756590925;-3.9009220927255e-05;-0.00059012300334871;0.00020476036297623;-6.5118219936267e-06;-0.00095331395277753;0.00057716999435797;0.00014645705232397;-0.00012911636440549;-0.00052412791410461;0.00022960944625083;4.6121872401272e-06;0.00010250274499413;0.00053739239228889;6.6211156081408e-05;-0.00030777405481786;1.7587346519576e-05;0.00052951439283788;-0.0002355917240493;-0.0019672850612551;-0.00027664258959703;-0.00028488872339949;0.00047218601685017;3.1227405997925e-05;-7.9146877396852e-05;-2.0730263713631e-05;2.4690182272025e-06;-0.00049292214680463;0.00016730299103074;-0.00010404064232716;-3.6636123695644e-05;0.00013861192564946;0.00011073010682594;0.0013965122634545;-0.00043801008723676;-0.00010272141662426;0.00082219985779375;-0.0009055626578629;0.00020548545580823;0.00026096816873178;0.0010873846476898;5.8322097174823e-05;-0.00018218693730887;-0.00021438296244014;0.00021973632101435;-5.2073781262152e-05;-0.00011755609011743;7.7274553405005e-06;0.0001462702639401;-0.0002462744305376;0.0017418183851987;3.5908375139115e-05;0.0010920667555183;0.0001626734592719;2.3714630515315e-05;0.00022610457381234;4.8973874072544e-05;-5.8272202295484e-05;-0.00041558954399079;0.0002486371085979;0.00064301054226235;-7.2916380304378e-05;4.4657190301223e-05;-8.906124276109e-05;-3.0370489184861e-05;0.0014642832102254;0.00015913261449896;-0.0021146142389625;-7.9624849604443e-05;-0.00044996425276622;-0.00082598236622289;-0.0011958625400439;-0.00016168631555047;-0.00030272878939286;7.5943185947835e-05;0.00012019219138892;-6.0566489992198e-05;-0.00022531412832905;9.544198110234e-05;-0.00056155357742682;0.00032178571564145;0.0018339193193242;-0.00032106006983668;6.8599190854002e-05;-0.00024188951647375;-0.00013396512076724;-2.2446100047091e-05;5.6375462008873e-05;-1.5091685781954e-05;-0.00060288811801001;-0.00015610735863447;0.00025808234931901;-0.00011548196926014;7.8507298894692e-05;5.7928091337089e-06;-0.00036748702405021;-4.4170708861202e-05;1.2014089634249e-07;-0.00064762885449454;0.00044827876263298;0.00013263101573102;4.9498685257277e-05;-0.00067582487827167;0.00028689097962342;4.0253111365018e-05;6.7195069277659e-05;0.00046962208580226;6.8249872128945e-05;-0.00029092689510435;1.0720052159741e-05;0.00043442242895253;-0.00017860248044599;-0.0019545173272491;-0.00029057238134556;-0.00027924016467296;0.00045217660954222;3.006860606547e-05;-6.2432838603854e-05;-2.1988422304275e-05;-1.1683600860124e-06;-0.00032910582376644;0.00012186866661068;-0.00016008272359613;-3.655797263491e-05;0.00011266617366346;0.00010938972991426;0.0014170128852129;-0.00036648052628152;-9.6180097898468e-05;0.00073462963337079;-0.0008989556808956;0.00019148203136865;0.00022490664559882;0.0010686836903915;9.1284797235858e-05;-0.0001457016041968;-0.0002135418180842;0.00014512438792735;-3.9472161006415e-05;-6.2459184846375e-05;3.343156322444e-06;0.00018240857752971;-0.00025241528055631;0.0014911768957973;6.3164375205815e-06;0.00095865404000506;0.00021228526020423;2.7700954888132e-05;0.0002168014907511;3.7704758142354e-05;-5.3724197641714e-05;-0.00047117727808654;0.00024860849953257;0.00055544404312968;-6.7137669248041e-05;6.0600734286709e-05;-7.364582415903e-05;0.00011295084550511;0.0013898403849453;0.00013557466445491;-0.0019804122857749;-0.00018497696146369;-0.00039145021582954;-0.0007779027801007;-0.0009375874651596;-0.00014615265536122;-0.00029553056810983;4.3250875023659e-05;0.00014239034499042;-6.3977095123846e-05;-0.00021475776156876;8.9138993644156e-05;-0.00054584810277447;0.0002915418590419;0.0015450718346983;-0.00035921100061387;0.00011306142550893;-0.0001738889986882;-0.00012067567149643;-4.0528135286877e-05;5.639325172524e-05;-1.9981947843917e-05;-0.00042449668399058;-0.00012813194189221;0.00023866663104855;-0.00012247914855834;5.7732991990633e-05;2.5025730792549e-05;-0.00015241102664731;-6.6302847699262e-05;9.5274062914541e-06;-0.00056184496497735;0.00030408456223086;9.1425608843565e-05;8.1265701737721e-05;-0.00067851861240342;0.00029271453968249;4.0747403545538e-05;3.9640537579544e-05;0.00038250329089351;6.1401857237797e-05;-0.0002468497841619;1.0364243280492e-05;-0.00026350273401476;0.00027482354198582;-0.00068018800811842;0.00042185222264379;-6.8854137680319e-06;9.0626766905189e-05;-3.5440749343252e-05;6.410193600459e-05;2.5156191441056e-07;-4.6657009988849e-06;0.00024834673968144;-0.00025881864712574;-6.3197338022292e-05;5.8006644394482e-05;2.520761154301e-05;3.4998527098651e-06;0.00019156376947649;2.6900448574452e-05;-1.7356431271764e-05;7.8464800026268e-05;-0.00019200365932193;0.00014022800314706;-0.00015343456470873;0.0002298054023413;-0.00011501022527227;-3.8869537092978e-05;-3.1546773243463e-05;-6.0503854911076e-05;8.4729319496546e-05;1.0191486580879e-05;-2.717647839745e-05;0.00014075130457059;4.659645492211e-05;1.9493529180181e-05;-0.00010223731806036;0.0005368497222662;0.00046742163249291;0.00012141671322752;0.00015951102250256;-3.7094123399584e-05;-5.1413975597825e-05;-0.00025971067952923;-0.00014434003969654;0.00011161871952936;4.9609174311627e-05;8.2193466369063e-05;6.5255429944955e-05;0.0013229534961283;0.0012676226906478;8.0336481914856e-05;-0.0014655945124105;-0.0012519808951765;-0.00038275588303804;-0.00046970476978458;0.00010821987962117;0.00013924285303801;-0.00026178301777691;-0.00021637187455781;7.4984643561038e-07;-1.7291275071329e-05;-4.388270463096e-05;-1.5681314835092e-05;-0.00032057840144262;-0.00017681860481389;-0.00014631329395343;-0.00032375534647144;0.00033504707971588;0.00024347291036975;-2.0299654352129e-05;-6.3318664615508e-05;7.314610428466e-08;2.5744432150532e-06;0.00020929888705723;0.00015740367234685;-1.0332797501178e-05;-4.6861667215126e-05;3.4440825402271e-05;5.1819653890561e-05;0.0013803711626679;0.00014000144437887;7.005211955402e-05;-0.00058842526050285;-0.00049175310414284;-0.00010301048314432;-2.4911902073654e-05;-0.00014217042189557;-8.3914846982225e-06;-8.3099614130333e-05;-6.3180639699567e-05;-1.3227203453425e-05;-5.6190351642726e-06;5.8455811995373e-06;1.6666532474119e-06;-0.00037914287531748;0.00037997742765583;-0.0010406750952825;0.00077009998494759;-1.2977144251636e-05;0.00013374086120166;-4.768735379912e-05;9.1921705461573e-05;-7.0067426349851e-06;1.259296709577e-06;0.00041058243368752;-0.00039677822496742;-0.00011758881009882;0.00012222657096572;3.4863500331994e-05;-3.4558038350951e-06;0.00020422678790055;5.4041134717409e-05;-1.9195937056793e-05;0.00014810642460361;-0.00029849208658561;0.0001923576783156;-0.00023551189224236;0.00035743543412536;-0.00025458756135777;-5.2227191190468e-05;-3.639621718321e-05;-0.00011091642954852;0.00013299637066666;3.2489107979927e-05;-5.3685304010287e-05;0.00015125445497688;8.1963858974632e-05;-2.3937212972669e-05;-0.0001713068340905;0.00092073221458122;0.00079265970271081;0.00019561847147997;0.00024423486320302;-6.2206301663537e-05;-8.0276993685402e-05;-0.00032786602969281;-0.00023184368910734;0.00014112210192252;6.961690087337e-05;0.00013634508650284;0.00011416610504966;0.0022030917461962;0.0020680837333202;0.00013540624058805;-0.0023763433564454;-0.0020867590792477;-0.00065103633096442;-0.00074900209438056;0.00016273235087283;0.00022521006758325;-0.00042235769797117;-0.0003572364221327;-1.1114086646558e-06;-1.3087579645799e-05;-5.8459270803723e-05;-2.9407465262921e-05;-0.00046259406371973;-0.00029522361001;-0.00040557089960203;-0.00055361789418384;0.00049546436639503;0.00037404874456115;-4.3232368625468e-05;-0.00010977403144352;-2.5524334432703e-06;4.4083362809033e-06;0.00036434523644857;0.00026598971453495;-5.9479476476554e-05;-8.9664747065399e-05;5.5500087910332e-05;8.2357415521983e-05;0.0022481940686703;0.00015829774201848;0.00010802598990267;-0.00087057997006923;-0.00076828867895529;-0.00012723625695799;-1.3066488463664e-05;-0.00013982602104079;2.4775022211543e-06;-0.00011658913717838;-8.9334942458663e-05;-3.1708907044958e-05;-7.2929874477268e-06;2.2451838958659e-05;4.0718364289205e-06;-0.00039493734948337;0.00037697787047364;-0.00093314796686172;0.0008541353745386;-2.3230861188495e-05;0.00012911907106172;-4.8391833843198e-05;9.1015477664769e-05;-5.610908374365e-06;2.3325171696342e-06;0.00041983078699559;-0.00039309021667577;-0.00010452557035023;0.00013525168469641;2.603806751722e-05;-9.5006471383385e-06;7.1334754466079e-05;6.2034494476393e-05;-1.1769405318773e-05;0.00017459304945078;-0.00028057070448995;0.00017985461454373;-0.00024437447427772;0.00029630085919052;-0.00030046913889237;-3.6195338907419e-05;-2.6904381229542e-05;-0.00011439465743024;0.00013082972145639;3.2637097319821e-05;-5.5171967687784e-05;0.00011921432451345;0.00011749265104299;-6.2350198277272e-05;-0.00014041297254153;0.00090947770513594;0.00078711687820032;0.00020169549679849;0.0002386339037912;-6.4445077441633e-05;-7.7427714131773e-05;-0.00028740896959789;-0.00027167980442755;0.00012428277113941;8.5570551163983e-05;0.00013198099622969;0.0001171937547042;0.002184956567362;0.0020554647780955;0.00013266487803776;-0.002315380377695;-0.0021117879077792;-0.00066496088402346;-0.00072507600998506;0.00016950871213339;0.0002270988188684;-0.00041418673936278;-0.00036368687869981;-1.1841400009871e-05;-4.8970928219205e-06;-4.8060057451949e-05;-3.8750520616304e-05;-0.00042905157897621;-0.00032873623422347;-0.00045778782805428;-0.00048168437206186;0.00050127791473642;0.00039032657514326;-3.9586437196704e-05;-0.00010727051994763;-6.7339137785893e-06;7.659619768674e-06;0.00036585127236322;0.00026423629606143;-7.2138514951803e-05;-7.3173294367734e-05;5.8779023675015e-05;8.0456324212719e-05;0.0022465416695923;0.00018501857994124;0.00010914370068349;-0.0008798268972896;-0.00080033508129418;-0.00013215545914136;-2.8556331017171e-05;-0.00010363970068283;-4.0630617149873e-05;-0.00012364897702355;-9.0205459855497e-05;-3.7774105294375e-05;-2.055109007415e-06;2.8624484912143e-05;-2.9251236810524e-06;-0.00029588202596642;0.00027329332078807;-0.00049967976519838;0.00054654869018123;-2.3535254513263e-05;8.7706503109075e-05;-3.5502001992427e-05;6.2330902437679e-05;2.6368861654191e-06;-3.9530277717859e-06;0.00026973255444318;-0.0002468534221407;-4.2432679038029e-05;7.5338917667978e-05;9.3200596893439e-06;-5.4013871704228e-06;-1.8693623133004e-05;4.3522337364266e-05;-3.7774450447614e-06;0.00012413722288329;-0.00017274577112403;0.00011469201126602;-0.00016748521011323;0.00012473537935875;-0.00018333477783017;-1.0883880349866e-05;-1.7806716641644e-05;-6.8660629040096e-05;7.7859520388301e-05;1.2059026630595e-05;-2.7285675969324e-05;8.7143504060805e-05;0.00011225227353862;-3.8284324546112e-05;-4.9545284127817e-05;0.00051140191499144;0.00044694732059725;0.00013172224862501;0.00015061029989738;-4.0336348320125e-05;-4.609459938365e-05;-0.00019486833480187;-0.00021415438095573;8.6086671217345e-05;7.8247125202324e-05;7.4214818596374e-05;6.8443259806372e-05;0.0012632744619623;0.0012332734186202;7.3292649176437e-05;-0.0013449054677039;-0.0012700711376965;-0.0004022630455438;-0.0004248650802765;0.00011730858386727;0.00014356856991071;-0.00024732470046729;-0.00022497870668303;-1.6772813978605e-05;-5.2071595746384e-06;-2.730770756898e-05;-3.0808085284662e-05;-0.00026403157971799;-0.00023333019635174;-0.00022004786296748;-0.00018311265739612;0.00034971089917235;0.00028051889967173;-1.2230798347446e-05;-5.6564927945146e-05;-6.6209227043146e-06;7.2691236709943e-06;0.00021071967785247;0.00014934007776901;-2.8683522032225e-05;-1.5416720998473e-05;3.9302060031332e-05;5.0019403715851e-05;0.0013644316932186;0.00020266206411179;7.1944385126699e-05;-0.00061244441894814;-0.00056397722801194;-0.00011769317643484;-5.7112596550724e-05;-8.8460088591091e-05;-8.6056985310279e-05;-9.5792747742962e-05;-6.9544803409372e-05;-2.3205131583381e-05;3.9847200241638e-06;1.5682868252043e-05;-1.1259498023719e-05;0.00012751127360389;-0.00028710454353131;0.00028357520932332;0.0016134695615619;-0.00046333350474015;0.00027470625354908;2.8404405384208e-05;-1.6945397874224e-05;2.1485950583155e-06;2.9493625333998e-05;-0.00010561673843767;0.00014083190762904;3.3746382541722e-05;0.00021730811567977;-9.8377968242858e-05;-7.5877607741859e-05;-0.0012882424052805;0.00021248251141515;6.1565297073685e-05;0.00087692681699991;-0.00054663931950927;-0.00011706529039657;-0.00015839601110201;-0.00010398304584669;-0.00089316157391295;0.00021936086704955;6.4142484916374e-05;3.5150984331267e-05;-5.7166686019627e-05;-3.3713247375999e-06;-5.5428636187571e-06;-0.00025145016843453;0.00018978003936354;-8.5186447904562e-06;0.00099872553255409;0.00024646261590533;0.00065685878507793;0.00017313672287855;3.6690085835289e-05;-4.5272427087184e-05;2.5875220671878e-05;0.00026697464636527;-0.00040984281804413;-5.5900669394759e-05;0.00037881307071075;-4.7497564082732e-05;5.7239976740675e-05;0.00023903242254164;0.0011583823943511;8.9415581896901e-05;-0.00029775456641801;-0.0015608469257131;-0.00061772885965183;-0.00029001725488342;-0.00014109638868831;-0.00051287905080244;6.6133534346591e-06;-0.00023837397748139;-7.5218071287964e-05;0.00011670200910885;7.4907482485287e-05;-0.00016321247676387;0.0002524379233364;-0.0004824073985219;-0.00037355374661274;0.0012033281382173;-8.5459134425037e-05;0.00019198637164664;-6.6469914372647e-07;-0.00011356541654095;-3.3468175388407e-05;6.0327147366479e-05;-0.00010661059059203;-0.00022866674407851;-0.00011730157712009;0.00020860203949269;3.0029348636162e-05;5.2486604545265e-05;5.2908402722096e-05;9.1372472525109e-05;2.1559568267548e-05;0.00013964956451673;-0.00062778778374195;-1.0929823474726e-05;3.8608653994743e-05;0.00029425349202938;-0.00060154922539368;3.0519690881192e-06;1.1447712495283e-05;4.8987589252647e-05;0.00027341715758666;1.4213626855053e-05;-0.00020670348021667;0.00017056948854588;-0.00034765209420584;0.00028280745027587;0.0016217663651332;-0.00048250280087814;0.00027959592989646;3.6432622437133e-05;-1.5583369531669e-05;1.2382391787469e-06;2.7455142117105e-05;-0.0001469551352784;0.00023746966326144;3.6867706512567e-05;0.00018097876454704;-9.9462864454836e-05;-9.2494366981555e-05;-0.001287302817218;0.00025365376495756;6.5159510995727e-05;0.00088570086518303;-0.00059429387329146;-0.00013358712021727;-0.00017087813466787;-8.1461723311804e-05;-0.00090179574908689;0.00022126188559923;8.6075058788992e-05;4.6471166569972e-05;-0.00010215784277534;-8.204553523683e-06;3.0828912713332e-05;-0.00024802843108773;0.00016835548740346;1.7675405615591e-05;0.0011752041755244;0.00019796811102424;0.00072943582199514;0.00017822133668233;3.1495106668444e-05;-4.8258210881613e-05;3.5389650292927e-05;0.000268186442554;-0.00038392029819079;-5.9760772273876e-05;0.00043637125054374;-6.023288005963e-05;4.4811931729782e-05;0.0001203572464874;0.0011956351809204;0.00010177311924053;-0.00020264452905394;-0.0016440392937511;-0.00064429960912094;-0.0003174309968017;-0.00015620916383341;-0.00067176239099354;3.620137431426e-05;-0.00023982438142411;-7.3400900873821e-05;0.00010429152462166;7.9384568380192e-05;-0.0001709458156256;0.00028443054179661;-0.00050058285705745;-0.00034201116068289;0.0014192543458194;-0.00015486242773477;0.00016466388478875;9.7230713436147e-06;-0.00012551042891573;-3.0587543733418e-05;6.2538303609472e-05;-0.00014049849414732;-0.00034005340421572;-0.00011091976921307;0.00023036208585836;1.5769755918882e-05;6.7245637183078e-05;-0.00012720118684229;9.1183457698207e-05;1.3492809557647e-05;0.00027188521926291;-0.00067997380392626;-2.3334639990935e-05;7.1149508585222e-05;0.00029537023510784;-0.00062036182498559;2.8505712180049e-05;1.0449308319949e-05;5.6880744523369e-05;0.00033125432673842;1.3034796211286e-05;-0.00024129619123414;0.00017141869466286;-0.00033295710454695;0.00018099356384482;0.0011029788292944;-0.00035064513213001;0.00018991019169334;3.7443543988047e-05;-6.9879583861621e-06;-2.4393330022576e-06;1.7648517314228e-05;-0.00014647271018475;0.00036272080615163;2.7011006750399e-05;6.0199483414181e-05;-6.8649052991532e-05;-0.00010437896708027;-0.00086439662845805;0.00023753268760629;5.0966984417755e-05;0.00061183696379885;-0.00047099444782361;-0.00011857674689963;-0.00013776270498056;-2.4516913981643e-05;-0.00064233544981107;0.00015245375107042;0.00010777220450109;4.4431602873374e-05;-0.00017068210581783;-1.0949568604701e-05;9.7425901913084e-05;-0.00018784435815178;0.00011346792598488;6.6380074713379e-05;0.0010485883103684;9.0014087618329e-05;0.00062939431518316;0.00013381084136199;2.4506029149052e-05;-3.8270660297712e-05;3.6271008866606e-05;0.00020001140364911;-0.00022462142806035;-4.3452848331071e-05;0.00039199960883707;-5.9667170717148e-05;8.5682722783531e-06;-6.9437497586478e-05;0.00091990194050595;9.333853085991e-05;-4.1819934267551e-05;-0.0012758198427036;-0.00050147960428149;-0.0002828442666214;-0.00014648550131824;-0.00069717515725642;6.2558618083131e-05;-0.00017669519002084;-5.2161500207148e-05;3.7154026358621e-05;6.2342420278583e-05;-0.00012053245882271;0.00024475794634782;-0.00039284440572374;-0.00021421453857329;0.0013642958365381;-0.00019090094428975;9.6259413112421e-05;3.792147981585e-05;-0.00010758746066131;-1.8544214981375e-05;4.4112744944869e-05;-0.00013830873649567;-0.000434598128777;-7.4152383604087e-05;0.00018062573508359;-1.3165786185709e-05;7.9522622399963e-05;-0.00030161600443535;0.00015054771210998;1.6940646219155e-06;0.00035838200710714;-0.0006798479007557;-8.4445164247882e-05;9.2501803010236e-05;0.00021155130525585;-0.00043457667925395;5.5173622968141e-05;-4.1133102968161e-06;4.9692487664288e-05;0.00033419474493712;1.160473402706e-05;-0.00022392263053916;0.00017606031906325;-0.00032274902332574;4.7429333790205e-05;0.00040277434163727;-0.00017573281365912;3.2104082947626e-06;3.775149161811e-05;6.5495801209181e-06;-5.8735172387969e-06;2.0381289687066e-06;-0.00014645436021965;0.00055192247964442;1.9018596503884e-05;-0.00013488926924765;-2.5963870939449e-05;-0.00013053735892754;-0.00032636866671965;0.0001908338163048;2.3439697542926e-05;0.00025381907471456;-0.00026454898761585;-8.4841522038914e-05;-7.047309918562e-05;5.0089591240976e-05;-0.00024353066692129;5.6259890698129e-05;0.00016081778449006;4.0394170355285e-05;-0.00027992253308184;-1.7281108739553e-05;0.0002067580644507;-0.00010037936590379;1.5016808902146e-05;0.00011109282058896;0.00094017438823357;-3.1198058422888e-05;0.00053536833729595;8.214995614253e-05;1.318717841059e-05;-3.156843376928e-05;4.2300758650526e-05;0.00010723238665378;4.1733223042684e-05;-2.9672048185603e-05;0.00034007773501799;-5.3985342674423e-05;-5.5624088417972e-05;-0.00027317425701767;0.00062900112243369;9.3387672677636e-05;0.0001271374640055;-0.00088540132855996;-0.00034441356547177;-0.00026165528106503;-0.00011802095832536;-0.00080260925460607;8.9572029537521e-05;-7.9595774877816e-05;-2.2433805497712e-05;-8.1137230154127e-05;4.135729977861e-05;-3.7920326576568e-05;0.00018113639089279;-0.00023921232786961;-6.2395447457675e-05;0.0012398413382471;-0.00021699682110921;-8.9937369921245e-05;6.6591259383131e-05;-8.9039480371866e-05;5.2442265996433e-07;1.5829211406526e-05;-0.00011884883861057;-0.00061333674238995;-2.6625955797499e-05;7.337711576838e-05;-4.6122509957058e-05;9.7073592769448e-05;-0.00049519154708833;0.0001652031642152;-2.2683148927172e-05;0.00044773847912438;-0.00059695541858673;-0.0001388000237057;0.00016535287431907;9.7565003670752e-05;-7.7753371442668e-05;8.0641868407838e-05;-3.147672259729e-06;3.6628774978453e-05;0.00035430587013252;9.0496787379379e-06;-0.00019381233141758;0.00049501750618219;-0.00019713869551197;-0.0012876577675343;-0.00015610120317433;-0.0003660463844426;0.00031838082941249;9.7993852250511e-06;-5.7575056416681e-05;-2.2828211513115e-05;1.5145393263083e-05;-0.00079149421071634;0.00013143425167073;-6.1327766161412e-05;-1.2393513316056e-05;0.00016697513638064;6.8992630986031e-05;0.00084081117529422;-0.00041523162508383;-0.00011047836596845;0.00067848293110728;-0.0005697674350813;0.00025984106468968;0.00021884651505388;0.0010138138895854;1.0538973583607e-05;-0.00016695143131074;-0.0001471407013014;0.00036241667112336;-4.4262797018746e-05;-0.00018966032075696;5.55915539735e-06;0.00028194216429256;-0.00028916134033352;0.0011729975230992;0.00016361557936762;0.0007494356832467;0.00011788432311732;4.3900185119128e-05;0.00015433716180269;3.0973460525274e-05;-3.1895884603728e-05;-0.00038379343459383;0.0002471900661476;0.00051393039757386;-2.2670456019114e-05;1.8488599380362e-05;-8.2535407273099e-05;-0.0001984396512853;0.00098872242961079;0.00011282593914075;-0.0013339954894036;-7.0691253313271e-06;-0.00033517292467877;-0.00058534386334941;-0.0008318031905219;-0.00023983426217455;-0.00024143223708961;7.6171309046913e-05;5.5593885917915e-05;-6.4075698901433e-05;-0.00015276898921002;7.1983311499935e-05;-0.00049598113400862;0.00028218168881722;0.0018305056728423;-0.00023181991127785;0.00021043061860837;-0.00021383553394116;-9.7053612989839e-05;6.5738197008613e-05;3.6000463296659e-05;-1.4677779290651e-05;-0.00059126719133928;-0.00014264199126046;0.00022076487948652;-9.1483423602767e-05;9.3495109467767e-05;-3.2126601581695e-05;-0.00037438407889567;0.00034880780731328;1.6718649931136e-05;-0.001045438926667;0.00041903168312274;4.2945528548444e-05;-0.00018852385983337;-0.00056435441365466;0.00022030284162611;-2.9496008210117e-05;8.0337988038082e-05;0.00041927327401936;5.7704281061888e-05;-0.00025254237698391;2.1388170353021e-05;0.00052692356985062;-0.00020092241175007;-0.0019135895418003;-0.00026689050719142;-0.00041556629003026;0.00044844186049886;2.3152602807386e-05;-7.1893606218509e-05;-2.8541322535602e-05;9.047711500898e-06;-0.00065173412440345;0.00013056621537544;-0.00015610277478117;-2.6372956199339e-05;0.0001627883175388;0.00010818627197295;0.0013231773627922;-0.00047492291196249;-0.00012691268057097;0.00085209967801347;-0.00086597440531477;0.00027843384305015;0.00027418971876614;0.0012641604989767;7.4070150731131e-05;-0.00017173087690026;-0.00021722282690462;0.00029581933631562;-4.5049728214508e-05;-0.00013900687918067;1.3766224356004e-06;0.00032866772380657;-0.0003457831335254;0.0014719162136316;0.00012331349716987;0.00095016311388463;0.00020789624250028;4.9948233936448e-05;0.00021688846754842;3.4375600080239e-05;-4.5514891098719e-05;-0.00056539283832535;0.000306671456201;0.00061108992667869;-4.2992298403988e-05;5.5466192861786e-05;-9.3300666776486e-05;-5.4015141358832e-05;0.0013655344955623;0.00013591980678029;-0.0018683451926336;-0.00012756681826431;-0.00040770202758722;-0.00079004716826603;-0.00093115272466093;-0.00025118020130321;-0.00032562331762165;6.5536551119294e-05;0.00013077967741992;-8.1564110587351e-05;-0.00021795324573759;9.3966737040319e-05;-0.00064048840431497;0.00034432727261446;0.0020342608913779;-0.00036377672222443;0.00029102127882652;-0.00021363416453823;-0.0001226657332154;2.8964148441446e-05;5.3674113587476e-05;-2.4362718249904e-05;-0.00055638223420829;-0.00016049430996645;0.00028581049991772;-0.00013268433394842;9.4208131486084e-05;-5.7241336435254e-06;-0.00025676403311081;0.00027742891688831;2.9276245186338e-05;-0.0010978442151099;0.00039377182838507;3.0020473786863e-05;-0.0001148508163169;-0.00079678551992401;0.00031222368124872;-1.7661017409409e-05;6.9260131567717e-05;0.00046130636474118;7.115826883819e-05;-0.00029481868841685;2.2224767235457e-05;0.00043469737283885;-0.00014626170741394;-0.0019766136538237;-0.00028882641345263;-0.00038534120540135;0.00044529384467751;2.6483205147088e-05;-6.2630606407765e-05;-2.9462986276485e-05;4.3296777221258e-06;-0.00045198918087408;8.5077786934562e-05;-0.00020711835531984;-2.809851866914e-05;0.00013509437849279;0.00011336391617078;0.0014020407106727;-0.00041492399759591;-0.00011780270142481;0.00079302833182737;-0.00090187869500369;0.00024846271844581;0.00025336863473058;0.0012336646905169;0.00011244610504946;-0.00014270334213506;-0.00022459322644863;0.0002067292080028;-3.1760871934239e-05;-7.9877150710672e-05;-4.1978728404501e-06;0.00034262874396518;-0.00034319941187277;0.0013130303705111;7.9741257650312e-05;0.0008825013646856;0.00026178697589785;5.3607713198289e-05;0.00021940782607999;2.5689223548397e-05;-4.5018390665064e-05;-0.00061537331202999;0.00030281423823908;0.00054794817697257;-4.3551655835472e-05;7.3853807407431e-05;-7.9512836236972e-05;0.0001043645752361;0.001371952239424;0.00012151161354268;-0.0018555232090876;-0.00024160002067219;-0.00037738750688732;-0.00078178540570661;-0.00074433896224946;-0.00022413811529987;-0.00033070525387302;3.3556341804797e-05;0.00015666242688894;-8.341178909177e-05;-0.00021628446120303;9.0773428382818e-05;-0.00063748750835657;0.00031901602051221;0.0017749515827745;-0.00041510243318044;0.00033163971966133;-0.0001453277800465;-0.00011420597729739;4.9262939683103e-06;5.459693420562e-05;-2.9231488952064e-05;-0.00039763853419572;-0.00013284313899931;0.00026873665046878;-0.00014385000395123;7.7658762165811e-05;1.6523417798453e-05;-3.3224747312488e-05;0.00023838794732001;3.8876372855157e-05;-0.0010123871034011;0.00024909756029956;-4.735765287478e-06;-7.0908201450948e-05;-0.00080742308637127;0.00032579587423243;-1.5145066754485e-05;4.0812818042468e-05;0.00039132247911766;6.5822787291836e-05;-0.00026014243485406;2.1488065613084e-05;-0.00041810120455921;0.00041013542795554;-0.00089083699276671;0.0006883175810799;-4.9633694288787e-05;0.00012740428792313;-2.2804601030657e-05;5.3628573368769e-05;-9.3583303168998e-06;4.8638435146131e-06;0.00044086834532209;-0.00041672334191389;-0.00013375400158111;0.00013076058530714;1.0427306733618e-05;1.3140886039764e-05;0.0001477267651353;3.0973573302617e-05;-1.5484058167203e-05;0.00028944958467036;-0.0003888032224495;0.00010199064854532;-0.00012367917224765;0.00027129516820423;-0.00018928553618025;-6.4535447563685e-06;-5.5797641834943e-05;-0.00011411790183047;0.00012852820509579;5.2021932788193e-05;-6.6699489252642e-05;0.00016431478434242;0.00010071397991851;-4.6972705604276e-05;-0.00014306799857877;0.00080317526590079;0.00069330836413428;0.00020303481142037;0.00023611282813363;-5.6205812143162e-05;-6.6892658651341e-05;-0.00034968002000824;-0.00025372864911333;0.00013469015539158;8.0119410995394e-05;0.00012468428758439;0.00010190599277848;0.0018020288553089;0.0018530477536842;8.8953180238605e-05;-0.0020177247934043;-0.0017965150764212;-0.00059527938719839;-0.00066299759782851;0.0002027160662692;0.0002279299806105;-0.00040531350532547;-0.00034134445013478;1.0374445082562e-05;-6.2248914218799e-06;-5.496960147866e-05;-3.0192994017852e-05;-0.00043335868394934;-0.0002879461098928;-0.00025631420430727;-0.00038455310277641;0.00064451195066795;0.00050574279157445;-1.7642963939579e-05;-6.8534973252099e-05;-1.1462049769762e-05;-4.7398480091942e-06;0.00034409767249599;0.00024149594537448;-5.445225542644e-05;-7.7912096458022e-05;7.1755937824491e-05;8.8448054157197e-05;0.0021352607291192;0.0005097987013869;0.00012583793431986;-0.0011591204674914;-0.0010164402192459;-0.00024127218057401;-0.00015308015281335;-0.00017715594731271;-4.7665143938502e-05;-0.00015772707411088;-0.00012206293467898;-1.6934654922807e-05;9.0428338808124e-06;1.4336783351609e-05;-1.9542087557056e-06;-0.00042986270273104;0.00040793739026412;-0.00081220641732216;0.00076126103522256;-5.4836262279423e-05;0.00012413192598615;-2.3491515094065e-05;5.3474115702556e-05;-8.1268663052469e-06;6.3106863308349e-06;0.00045040668919683;-0.00041640215204097;-0.00012243719538674;0.0001441060740035;3.2547359296586e-06;7.3009655352507e-06;4.4586548028747e-05;4.096389238839e-05;-9.5798468464636e-06;0.00030808712472208;-0.00037523530772887;9.1399866505526e-05;-0.00013321595906746;0.00022129746503197;-0.0002312360011274;5.8711630117614e-06;-4.756170528708e-05;-0.00011726042430382;0.0001278409617953;5.1959428674309e-05;-6.8737703259103e-05;0.00013224961003289;0.00013316246622708;-6.8272405769676e-05;-0.00012951501412317;0.00080365309258923;0.00069254136178643;0.00020767642126884;0.00023310676624533;-5.7353121519554e-05;-6.6083259298466e-05;-0.00031190691515803;-0.00028998416382819;0.00012290645099711;9.0155204816256e-05;0.00012077116116416;0.00010647414455889;0.0018058038549498;0.0018556123832241;8.8023851276375e-05;-0.001992077101022;-0.0018257743213326;-0.00061030581127852;-0.00064815900987014;0.000198494977667;0.00023929896997288;-0.00039921654388309;-0.0003495748678688;5.1204546025474e-07;2.2661620278086e-06;-4.6647808630951e-05;-3.7838628486497e-05;-0.00040555081795901;-0.00031792442314327;-0.00031149358255789;-0.00032922948594205;0.00064024183666334;0.00052372354548424;-1.4491605725198e-05;-6.979561294429e-05;-1.5116800568649e-05;-1.5794296359672e-06;0.00034420640440658;0.0002443132980261;-6.7331653553993e-05;-6.5308333432768e-05;7.3673254519235e-05;8.8036395027302e-05;0.0021455257665366;0.00052352144848555;0.00012700945080724;-0.0011496058432385;-0.0010524593526497;-0.00024453262449242;-0.00016019966278691;-0.000140930103953;-8.4734478150494e-05;-0.00016072481230367;-0.00012325479474384;-2.1331463358365e-05;1.3383711120696e-05;2.0007477360195e-05;-8.0476938819629e-06;6.8316869146656e-05;-0.00029280208400451;0.00033360999077559;0.0018419680418447;-0.00050544372061267;0.00041395297739655;2.7737856726162e-05;-1.0509756975807e-05;-1.236747607436e-06;3.9277663745452e-05;-3.4737171517918e-05;0.00026314507704228;2.9081627872074e-05;0.00029278185684234;-0.00011924792488571;-0.00011094896763097;-0.0014481687685475;0.00028810591902584;9.4072558567859e-05;0.00099229556508362;-0.00067115895217285;-0.0001620068505872;-0.00024285553081427;-0.00017647996719461;-0.0011580646969378;0.00026665403856896;6.6707078076433e-05;2.0767116438947e-05;-0.00012820270785596;7.7894155765534e-06;1.5600095139234e-05;-0.00041715984116308;0.00042728558764793;9.1788606368937e-05;0.00089178927009925;0.0003623514494393;0.0006257556960918;0.00020210804359522;7.6052485383116e-05;-4.072110823472e-05;1.2313942534092e-05;0.00038822431815788;-0.00063659087754786;-3.0428189347731e-05;0.00041089372825809;-6.0095342632849e-05;7.8348857641686e-05;0.0002840528904926;0.0012988277012482;8.2071288488805e-05;-0.00043851800728589;-0.0016120302025229;-0.00071228877641261;-0.00030189452809282;-0.00027458803378977;-0.00032638412085362;-1.1276499208179e-05;-0.00030453727231361;-0.00011572944640648;0.00014371208089869;8.8180007878691e-05;-0.00018151376571041;0.00031236041104421;-0.00065529212588444;-0.00049113522982225;0.0016154636396095;-3.7143185181776e-05;0.00046984251821414;4.7551075113006e-05;-0.00012108767259633;-5.0507504056441e-05;6.8553461460397e-05;-0.00012038279237458;-0.00022629131854046;-0.000159309245646;0.00027649378171191;3.0408045859076e-05;8.1386038800701e-05;0.00023759128816891;0.00046594068408012;5.8492052630754e-05;4.4102787796874e-05;-0.0012264521792531;-0.00018279183132108;-7.5135998486076e-05;0.00037118521868251;-0.00083351653302088;-5.7891261349141e-06;-5.0893242587335e-05;6.065696652513e-05;0.00031817541457713;2.8143966119387e-05;-0.00025061931228265;0.00012665752728935;-0.00035605451557785;0.00030417970265262;0.0016787886852399;-0.00048355406033807;0.00041531489114277;2.8867394576082e-05;-4.1627963582869e-06;-3.2536922844884e-06;3.4614866308402e-05;-9.5473325927742e-05;0.00039573761750944;2.9898510547355e-05;0.00023392711591441;-0.00010575934720691;-0.00012572357081808;-0.0013089869171381;0.0003079978923779;9.4850169261917e-05;0.00090002478100359;-0.00065781461307779;-0.00015496535343118;-0.00025903293862939;-0.00012424036685843;-0.0011101776035503;0.00024223898071796;8.4002480434719e-05;3.7090176192578e-05;-0.00018577586160973;-1.1955951322307e-06;6.1979764723219e-05;-0.00039016574737616;0.00037977276952006;0.00012340320972726;0.00098536990117282;0.00027509068604559;0.00063171930378303;0.00018431400530972;6.2788181821816e-05;-3.8662601582473e-05;2.132705776603e-05;0.00036955624818802;-0.00055595143930987;-3.0664119549328e-05;0.00043544243089855;-7.0356705691665e-05;5.600112490356e-05;0.00011378747149138;0.0011928838212043;8.6963380454108e-05;-0.00028341004508547;-0.0015200858470052;-0.00066621624864638;-0.00029508824809454;-0.00028307916363701;-0.00045906845480204;2.6775249352795e-05;-0.00027536819106899;-0.000106742772914;0.0001157460937975;8.5951942310203e-05;-0.00017203325114679;0.00032632780494168;-0.00061433739028871;-0.00040654372423887;0.00171989062801;-0.00012973985576537;0.0003818157420028;5.54768848815e-05;-0.00012353762576822;-4.2545441829134e-05;6.6657645220403e-05;-0.00015505919873249;-0.00032883509993553;-0.00013613763439935;0.00028065958758816;9.3265389295993e-06;8.5302650404628e-05;-2.2742058717995e-05;0.00040436783456244;3.9708655094728e-05;0.0002188752987422;-0.0011499957181513;-0.00017284641216975;-2.2452988559962e-05;0.00034175199107267;-0.00078464922262356;2.8093274522689e-05;-4.2222025513183e-05;6.4792679040693e-05;0.00034908010275103;2.4059330826276e-05;-0.00026454211911187;0.00011962797725573;-0.00030306377448142;0.00018745678244159;0.0010604094713926;-0.00032067624852061;0.00031666684662923;2.0029845472891e-05;5.260467332846e-06;-5.6138414947782e-06;2.2754285964766e-05;-9.4357739726547e-05;0.00044034677557647;1.8146638467442e-05;0.00012367860472295;-6.5079242631327e-05;-0.00011464759882074;-0.00081110140308738;0.00024545783526264;7.4131799919996e-05;0.00056426587980241;-0.00046599595225416;-0.00010984967229888;-0.00021393620409071;-5.6175173085649e-05;-0.00079105619806796;0.00015562791668344;8.0133926530834e-05;3.4332690120209e-05;-0.0002092999056913;-5.1153378990421e-06;9.7640571766533e-05;-0.00029069386073388;0.00028477466548793;0.00013870489783585;0.00073156831786036;0.0001535989867989;0.00044753024121746;0.00012064294423908;4.5723496441497e-05;-2.4706203475944e-05;1.8813036149368e-05;0.00026978875393979;-0.00036333731259219;-1.4707504305989e-05;0.0003332037886139;-5.9176731156185e-05;2.2226207875065e-05;-4.1169307223754e-05;0.00078873842721805;6.5097854530904e-05;-0.00011793693556683;-0.0010003809584305;-0.00045126673649065;-0.00021347335132305;-0.00023641009465791;-0.00039332767482847;4.3120511691086e-05;-0.00018465344328433;-7.6325610280037e-05;5.4486881708726e-05;6.0715599829564e-05;-0.00011116886889795;0.0002492360654287;-0.00043659147922881;-0.00024575032875873;0.0013918746262789;-0.0001462994114263;0.00025734078371897;6.1679231293965e-05;-9.0820656623691e-05;-2.7100240913569e-05;4.5320404751692e-05;-0.00013418124581221;-0.00032897503115237;-8.671211253386e-05;0.00020692603720818;-1.1975594134128e-05;7.3265982791781e-05;-0.00016754180251155;0.00034500446054153;2.148234489141e-05;0.00026249498478137;-0.0009148606332019;-0.00016903830692172;3.1977904200176e-06;0.00022937022731639;-0.00054048164747655;4.4298180000624e-05;-3.8800415495643e-05;5.0275797548238e-05;0.00028620491502807;1.792045077309e-05;-0.00020676337589975;0.00022768115741201;-4.0724309656071e-05;-0.0011782601941377;-0.00017324301006738;-0.00029028204153292;0.00025116739561781;1.2342564332357e-05;-3.3835680369521e-05;-2.1517278582905e-05;4.9218333515455e-06;-0.00031566640245728;3.8946204767853e-06;-0.00015918402641546;-1.0931315046037e-05;9.0980633103754e-05;7.0837639214005e-05;0.00082474242663011;-0.00026488825096749;-8.3567509136628e-05;0.00049163080984727;-0.00053594284690917;0.00018059881404042;0.00016501566278748;0.00082391867181286;9.6029951237142e-05;-7.7173259342089e-05;-0.00014157650002744;0.0001529145083623;-7.6852438724018e-06;-5.2481387683656e-05;-9.7174606707995e-06;0.00033792460453697;-0.00027511271764524;0.00060476741055027;0.00010046980605694;0.00042691096314229;0.00020376173779368;5.1085720770061e-05;0.00013244316505734;5.0494641072873e-06;-1.9694580259966e-05;-0.00049740815302357;0.0002195710549131;0.00030404646531679;-5.19528384757e-06;5.5164931836771e-05;-4.8656744183972e-05;7.937969348859e-05;0.00078820483759046;5.4342832299881e-05;-0.00098191271536052;-0.00020886496349704;-0.00019428352243267;-0.00045963999582455;-0.00024007227330003;-0.00019019799947273;-0.00021737630595453;4.843943315791e-06;0.00011032034672098;-6.5157058998011e-05;-0.00012833578512073;5.3621122788172e-05;-0.00044724965118803;0.00020213662355673;0.0011724681826308;-0.00029345828806981;0.00037056629662402;-4.5707918616245e-05;-5.9748941566795e-05;3.0766623240197e-05;3.0422543204622e-05;-2.4762595785432e-05;-0.00018525824998505;-7.6100652222522e-05;0.00017778515757527;-0.0001024736702675;5.8255394833395e-05;8.7236039689742e-06;0.00012034527753713;0.00036501447902992;4.8335747123929e-05;-0.0009205854148604;6.7304230469745e-05;-8.6180596554186e-05;-0.00014735068543814;-0.00057642720639706;0.00021659482445102;-5.1850962336175e-05;1.8143889974453e-05;0.00022514749434777;4.2025494622067e-05;-0.00015693689056206;2.005586065934e-05;0.00012254214379936;-1.9224660718464e-05;-0.00088709377450868;-8.223744953284e-05;-0.00017208074859809;0.00018743659893516;1.5107280887605e-05;-2.4730270524742e-05;-1.7442724129069e-05;3.1983738608687e-06;-8.7128493760247e-05;-1.3308703273651e-05;-0.00013541772204917;2.099736548189e-06;4.5709744881606e-05;5.1512255595298e-05;0.00060461804969236;-0.00015194089792203;-4.7280598664656e-05;0.00033810068271123;-0.00041626545134932;9.2644200776704e-05;0.00010506375838304;0.00054421793902293;5.0140763050877e-05;-4.0947063098429e-05;-0.00010129136353498;4.4102023821324e-05;1.8974734530275e-06;1.2174920129837e-06;-1.3218561434769e-05;0.00017235829727724;-0.00015258372877724;0.00039786455454305;1.3236593986221e-05;0.00037456408608705;0.00018665326933842;4.1835464799078e-05;0.00010063146328321;-8.0638346844353e-07;-1.9199764210498e-05;-0.00029644047026522;0.00012386610615067;0.00018906705372501;-1.366832475469e-05;5.0316422857577e-05;-1.9903880456695e-05;0.00021946858032607;0.00065979361534119;4.8398225771962e-05;-0.00082530971849337;-0.00026379519840702;-0.00018285188707523;-0.00035093462793157;-0.00016654790670145;-8.1328362284694e-05;-0.00017014113836922;-2.2450327378465e-05;7.676612585783e-05;-3.6729517887579e-05;-8.6541760538239e-05;3.4413122193655e-05;-0.00029942186665721;0.00011253327102168;0.00061538268346339;-0.00025071311392821;0.00026546505978331;1.8965740309795e-05;-4.1239549318561e-05;4.0154886846722e-06;1.9588092982303e-05;-1.9030647308682e-05;-4.9758898967411e-05;-2.356655386393e-05;9.5178234914783e-05;-8.1064594269264e-05;3.7005913327448e-05;2.0795319869649e-05;0.00026840576902032;0.00021757991635241;3.8358026358765e-05;-0.00058751634787768;-5.4369531426346e-05;-6.5329775679857e-05;-7.2406124672852e-05;-0.00036080743302591;0.00015725227422081;-3.3350799640175e-05;-5.8078981055587e-06;0.00012553983833641;2.4137767468346e-05;-8.9838533313014e-05;1.4018280126038e-05;-0.00036022838321514;0.00034935740404762;-0.00065758248092607;0.0005109648918733;-5.7019162341021e-05;0.00010389358067187;-7.2387465479551e-06;2.5781080694287e-05;-7.7225622590049e-06;4.4577454900718e-06;0.00037966534728184;-0.00034885271452367;-0.00011674493725877;0.00010910887795035;-4.7481894398516e-06;2.0467135982472e-05;0.00010393281991128;1.4376582839759e-05;-1.0795700291055e-05;0.00029898254433647;-0.00036021479172632;3.9917405956658e-05;-4.7407113015652e-05;0.00017583636508789;-0.00011700583127094;1.8923858078779e-05;-5.8076711866306e-05;-9.6209951152559e-05;0.00010164654668188;5.2413313824218e-05;-5.9878242609557e-05;0.00013793559628539;9.4014350906946e-05;-3.841308716801e-05;-0.00010507154365769;0.00058379594702274;0.00049935677088797;0.00016517860058229;0.00018654722953215;-4.1803581552813e-05;-4.7935238399077e-05;-0.00029685173649341;-0.00022046886442695;0.00010737792035798;6.8270433985163e-05;9.4096605607774e-05;7.5308067607693e-05;0.0012521026656032;0.0013787782518193;4.9607046094025e-05;-0.0014502014964819;-0.001292624976486;-0.00044736728887074;-0.00049011001829058;0.00017957168165594;0.00019162600801792;-0.00031524142832495;-0.00026414121384732;1.5629459085176e-05;-3.1905014452605e-07;-4.3958560127066e-05;-2.4688542907825e-05;-0.0003390125639271;-0.0002300978085259;-0.00012545674690045;-0.00022248046298046;0.00059915630845353;0.00047972865286283;7.3772461917088e-08;-3.4847933420679e-05;-1.3798581676383e-05;-8.5139936345513e-06;0.00026694833650254;0.00018263849779032;-3.8481084629893e-05;-5.5680193327134e-05;6.6023145336658e-05;7.5456599006429e-05;0.0016685796435922;0.00059974926989526;0.00011477091175038;-0.0010795656125993;-0.00095053086988628;-0.0002626528730616;-0.00020104266877752;-0.00017104143626057;-6.8638553784695e-05;-0.00014797592302784;-0.00011599698336795;-3.9319047573372e-06;1.6915393644013e-05;5.6813505580067e-06;-5.975764906907e-06;-0.00037847590283491;0.00035408581607044;-0.00057663710322231;0.00058821431593969;-6.1510276282206e-05;0.00010051323624793;-7.7696486187051e-06;2.5771301807254e-05;-6.0615416259679e-06;6.0404918258428e-06;0.00039288197876886;-0.00035523911355995;-0.00010443103383295;0.0001247401087312;-1.285557209485e-05;1.4608752280765e-05;-1.9807851003861e-06;2.7230005798629e-05;-4.9237228267884e-06;0.00032014280441217;-0.00035013922024518;2.6916266506305e-05;-5.6733235396678e-05;0.00011991422070423;-0.00015915808035061;3.2805022783577e-05;-5.0486931286287e-05;-9.902012970997e-05;0.00010244188160868;5.2025356126251e-05;-6.2909275584389e-05;0.00010631523036864;0.00013103973469697;-5.5864296882646e-05;-9.5575131126679e-05;0.00058311905013397;0.00049702677642927;0.00017090159235522;0.00018513832765166;-4.248882032698e-05;-4.7727837227285e-05;-0.00026158365653828;-0.00026419752975926;9.7670890681911e-05;7.8729877714068e-05;8.9348657638766e-05;8.1002173828892e-05;0.0012556546134874;0.0013840658357367;4.7140329115791e-05;-0.0014273161068559;-0.0013219327665865;-0.00046246882993728;-0.00047506659757346;0.00017464211850893;0.00021062718587928;-0.00030934318783693;-0.00027492712251842;5.097615030536e-06;9.8070267995354e-06;-3.5690427466761e-05;-3.3144729968626e-05;-0.000311516050715;-0.00026532294577919;-0.00017979368567467;-0.00015595817239955;0.00059781782329082;0.00051070092013106;5.0987164286198e-06;-3.6691253626486e-05;-1.8128692317987e-05;-5.0920098146889e-06;0.00026519523817115;0.00018758958321996;-5.1989303756272e-05;-4.1233412048314e-05;6.8131477746647e-05;7.6435935625341e-05;0.0016884395154193;0.00062915339367464;0.00011800510401372;-0.0010764000471681;-0.0010107249254361;-0.00027336098719388;-0.00021351952455007;-0.00013396372378338;-0.00011474514030851;-0.00015177171735559;-0.00011977223039139;-7.2810289566405e-06;2.2881284166942e-05;1.1440853086242e-05;-1.3625066458189e-05;-0.00012763218546752;-1.6293775843224e-05;0.00019424520723987;0.0011555182281882;-0.00026634955429472;0.00025212985929102;1.6501213394804e-05;-8.4424036685959e-06;2.3665052140132e-07;2.7055546524934e-05;0.00015708577120677;1.4882939467498e-05;2.0756501726282e-06;0.0002353643940296;-8.8597225840203e-05;-5.5792876082705e-05;-0.00089260633103549;0.00017085921717808;6.1414182709996e-05;0.00063718174351379;-0.000428893516073;-0.00013211308396421;-0.00012902342132293;-0.00020890387531836;-0.00069987575989217;0.0001844536018325;1.3650686014444e-05;-3.2992611522786e-05;-3.8054466131143e-05;2.8973443477298e-05;-2.605721965665e-05;-0.00031671742908657;0.0004179832758382;7.6982432801742e-05;0.00024523038882762;0.00034397045965306;0.00027538868016563;0.00014243490295485;8.6880805611145e-05;-1.9674289433169e-05;-1.4083439964452e-05;0.00024700455833226;-0.00055183720542118;1.086787051463e-05;0.00019450321269687;-2.2174992409418e-05;7.5323026976548e-05;0.00036061447462998;0.00085834611672908;2.4005028535612e-05;-0.00049775239313021;-0.00091662222985178;-0.00045587125350721;-0.0001722669985611;-0.00018507802451495;0.00012382362911012;-7.1167421992868e-05;-0.00022886654187459;-8.5648251115344e-05;0.00011354972230038;4.8460875404999e-05;-0.00010760893201223;0.000152743072249;-0.00049022294115275;-0.00039351731538773;0.00096587592270225;0.00017431353626307;0.00057966914027929;5.7508990721544e-05;-5.7187760830857e-05;-4.5696735469392e-05;3.5470497095957e-05;-1.1571623872442e-05;-1.3740442454946e-06;-0.00012948563380633;0.00016834761481732;3.9602906326763e-05;6.929394294275e-05;0.00062110740691423;0.00066925707506016;9.0070090664085e-05;-0.00033327334676869;-0.0012222619261593;-0.00027441824204288;-0.00021456963440869;0.00023711487301625;-0.00061409629415721;-5.6846787629183e-05;-9.8225253168494e-05;3.30772891175e-05;0.00016257032984868;2.7786278224085e-05;-0.00014106133312453;-4.9404719902668e-05;-0.00013608013978228;0.00026343981153332;0.0014204400358722;-0.00035848398692906;0.00034305395092815;1.9011829863302e-05;-6.5166273088835e-06;-1.0214093890681e-06;3.2817926694406e-05;8.0557663750369e-05;0.0001563607074786;1.425710888725e-05;0.00026433344464749;-0.00010086745896842;-8.4785373474006e-05;-0.0011104955337942;0.00022852829715703;8.05819654488e-05;0.00076840468682349;-0.00052861915901303;-0.00014691718388349;-0.00019363706815057;-0.00020477127691265;-0.00091895024525002;0.00021893966186326;3.5238910641056e-05;-1.0750160072348e-05;-9.4016722869128e-05;2.0089983081562e-05;-7.388728135993e-07;-0.00039135460974649;0.00046702299732715;0.00011240190360695;0.00045747592230327;0.00035616441164166;0.00037334085209295;0.00016260927077383;8.4644816524815e-05;-2.4518883947167e-05;-5.8238738347427e-06;0.00033226716914214;-0.00061919866129756;5.6683882121433e-07;0.00027607291121967;-4.1632116335677e-05;7.6723008533008e-05;0.00029950676253065;0.00099563703406602;4.218647518428e-05;-0.00046215730253607;-0.0011265114881098;-0.00054958136752248;-0.00020426901755854;-0.00025725696468726;-6.730598215654e-06;-4.2313818994444e-05;-0.00025793310487643;-0.00010559896327322;0.00012827351747546;6.5979962528218e-05;-0.00013599319208879;0.0002314949670108;-0.00057174410903826;-0.00043784393346868;0.0012884943280369;7.5535805081017e-05;0.00056580902310088;6.2082159274723e-05;-8.1411199062131e-05;-4.9115864385385e-05;4.9697297072271e-05;-6.6041400714312e-05;-9.2588197730947e-05;-0.00014398571511265;0.00022364947653841;3.2181342248805e-05;7.5458192441147e-05;0.00044349359814078;0.00062922551296651;7.9246994573623e-05;-0.00015981555043254;-0.0012883911840618;-0.00025850749807432;-0.00017090231995098;0.00030193506972864;-0.0007328987121582;-3.1300463888329e-05;-8.7142019765452e-05;4.6158282202668e-05;0.00022631432511844;2.9577018722193e-05;-0.00018866518803407;-0.00018436920072418;0.0002079666883219;-0.00019141426309943;-9.1451402113307e-05;-1.0819285307662e-05;-1.0451929483679e-05;-1.6820274595375e-06;1.0028645647253e-06;7.8079082754812e-08;-6.6467355281929e-06;0.00010834973363671;-0.00017294196004514;-5.5833992519183e-05;-7.1970830504142e-06;8.7381231423933e-06;3.0143821277306e-05;0.0001922826631926;-3.745613139472e-05;-2.0300127289374e-05;5.7259097957285e-05;-0.00010845713404706;1.4208441825758e-05;5.9205554862274e-05;7.3064467869699e-05;0.00016167404828593;2.8199931421113e-06;-4.6333974751178e-05;-1.0273597581545e-06;3.9803348045098e-05;7.0577543738182e-06;-1.7272066543228e-05;0.00026086808065884;-9.1084679297637e-05;-0.00011001531674992;4.0103263017954e-05;-8.3257975347806e-05;7.6055388490204e-05;4.444878504728e-05;5.0652841309784e-05;-1.1642104254861e-05;1.1259302254985e-06;-0.00034466997021809;2.3172913643066e-05;3.8048081478337e-05;3.4819327993318e-05;3.0366722057806e-05;-5.7835836742015e-06;6.9843306846451e-05;0.00014399905921891;-3.7248351873131e-05;-7.16444774298e-05;-0.00013574323384091;2.5619990992709e-05;-7.9072095104493e-05;0.00028733845101669;-3.141427441733e-05;-8.1636062532198e-05;-4.244737647241e-05;5.7095319789369e-05;-3.0336037525558e-05;-3.3522759622429e-05;5.9608510127873e-06;-0.00019873083510902;1.1167082448083e-05;0.00033626827644184;-7.1304675657302e-05;0.00037373989471234;0.00015693945169915;1.2747641449096e-05;3.4612017770996e-05;-4.5358524403127e-07;-1.5248582712957e-05;7.3340022936463e-05;1.284168138227e-05;5.7583747548051e-05;-3.0926028557587e-05;3.0110300940578e-05;1.6731926734792e-05;0.0003895832633134;0.00046917193685658;6.0744998336304e-05;-0.00067797442898154;-0.00030498264823109;-0.00019285583402961;-0.00019361086015124;-0.00026447404525243;2.2890015316079e-05;-8.5350846347865e-05;-3.8356505683623e-05;2.3913196855574e-05;1.2661211258091e-05;-2.7921150831389e-05;7.1433082666772e-06;-0.0002647656656336;0.00018081998859998;0.00011328531400068;0.00049920513993129;-5.9960828366457e-05;9.2421869339887e-05;3.3846711176011e-06;2.4126470634656e-06;5.3859266699874e-06;6.9344405346783e-06;0.00025611973251216;-0.00011412616731832;-2.287052666361e-06;0.00012051715020789;-5.4195726988837e-05;-1.795463685994e-05;-0.00039451051270589;8.7458101916127e-05;3.373617073521e-05;0.00028357692644931;-0.00020568126637954;-9.2926027718931e-05;-4.9002162995748e-05;-0.00022455387806986;-0.00024945760378614;0.00010090285650222;-1.0870003279706e-05;-5.6073022278724e-05;1.5633335124221e-06;2.9296317734406e-05;-2.0656052583945e-05;-0.00015743642870802;0.00033269249252044;4.9949103413383e-05;-5.0427974201739e-05;0.00019278733816464;2.6319741664338e-05;9.0049543359783e-05;7.6528049248736e-05;-6.6424413489585e-06;-1.7978933101404e-05;6.541634502355e-05;-0.00041452411096543;3.856926196022e-05;8.1095437053591e-05;-3.3912058370333e-06;4.7180536057567e-05;0.00023240729933605;0.000430943997344;-2.4102855604724e-05;-0.00033562182215974;-0.00037127049290575;-0.00021188602840994;-5.3885843954049e-05;-5.8275189076085e-05;0.00027897540712729;-7.8745615610387e-05;-0.00014010933227837;-4.804300624528e-05;6.6401793446857e-05;1.5732059182483e-05;-5.2707109716721e-05;2.1518746507354e-05;-0.00030901245190762;-0.00016225743456744;0.00053593859774992;0.00026802369393408;0.00050132937030867;5.5006057664286e-05;-9.5511095423717e-06;-3.1144008971751e-05;1.1933908353967e-05;3.5721423046198e-05;5.9600482927635e-05;-6.418381963158e-05;9.3898233899381e-05;3.3354121114826e-05;5.1010436436627e-05;0.00062148278811947;0.00067528686486185;8.7694250396453e-05;-0.00049316365038976;-0.00098185345996171;-0.00028386470512487;-0.00024958592257462;6.3578110712115e-05;-0.0003891178057529;-7.507593545597e-05;-0.00010289036436006;1.7318197933491e-05;7.2532129706815e-05;1.5467945559067e-05;-6.8994733737782e-05;-0.00022148160496727;0.00011112399806734;0.00016161338135134;0.0007290385547094;-0.00012834534572903;0.00015549559611827;7.8831462815288e-06;-1.0983552556354e-06;3.7437962419062e-06;1.4378177183971e-05;0.00022982466907706;-5.6393178965664e-05;1.3986980320624e-06;0.0001653859653743;-6.8699460825883e-05;-3.4094518923666e-05;-0.00058034772519022;0.0001224081061082;4.6852866944391e-05;0.00040590469143353;-0.00028261617990211;-0.00011361150245648;-8.2057362305932e-05;-0.00023743444762658;-0.00042120867874473;0.0001340754533885;-1.9896594949387e-06;-5.0296981498832e-05;-1.9846102077281e-05;3.0386614525924e-05;-1.999264350161e-05;-0.00024373544147238;0.0003973335842602;8.0383360909764e-05;2.0509141904768e-05;0.00025086963432841;7.7553391747642e-05;0.00010584779374767;7.9831603216007e-05;-8.5031706476002e-06;-1.8028069462162e-05;0.00015603327483404;-0.00049266865244135;3.1591222068528e-05;0.00011518852988956;-1.3489045159076e-05;5.8066965721082e-05;0.00025362166343257;0.00054978544358164;-1.1575027201616e-05;-0.0003807368921116;-0.00051165861077607;-0.000292372162221;-7.5712152465712e-05;-0.00013196385407355;0.0002662023762241;-7.1562855737284e-05;-0.00016899456386454;-6.7322805989534e-05;8.883279224392e-05;2.9140281185391e-05;-7.2467722930014e-05;8.314177102875e-05;-0.00038805490476079;-0.00025801744777709;0.00073217728640884;0.0002266173978569;0.00055772205814719;6.1251339502633e-05;-2.5658668164397e-05;-3.8032379961805e-05;2.0884450350422e-05;1.1092257409473e-05;4.207269375911e-05;-9.201503416989e-05;0.00012860145943705;3.4239114029333e-05;5.917083035456e-05;0.00061053695390001;0.00070581736508757;9.1859190433752e-05;-0.00042351850424893;-0.0011173307429999;-0.00029560262919404;-0.00025055749574676;0.00013929666602053;-0.00049646466504782;-6.588693941012e-05;-0.00010738218406914;2.4758724975982e-05;0.00010588242730591;2.121977013303e-05;-9.7820171504281e-05;-8.1807147580548e-06;-8.6051650214358e-06;1.4539740732289e-05;2.3439231881639e-05;-0.00030293001327664;0.00022404095216189;-0.00062891992274672;-0.00010391259274911;2.2626021745964e-05;0.00014927540905774;6.6141357820015e-05;7.3852832429111e-05;-0.0001409130054526;3.6603352782549e-05;-0.00016715463425498;-0.00013500974455383;-7.7060045441613e-05;-0.00011280026228633;0.00046995171578601;0.00016148110444192;6.8286382884253e-05;0.00034900102764368;-0.00043635841575451;-2.3299540771404e-05;-0.00018264196114615;0.0005000057280995;0.00011380763316993;-2.8178947104607e-05;-3.2678417483112e-05;9.3611335614696e-05;2.197956564487e-05;2.4619464966236e-05;-1.1599469871726e-05;-0.00012241468357388;-5.5704167607473e-05;-4.8425004933961e-05;-0.00016588610014878;0.00013396108988672;-0.00022268504835665;-0.00075496424688026;0.00055585597874597;-9.0326087956782e-05;5.0374466809444e-05;-0.00025250040926039;-2.6849800633499e-05;0.00050220364937559;-0.00030212837737054;3.5742134059547e-05;-0.00031153624877334;-1.809028799471e-05;1.4216265299183e-05;0.00019682588754222;0.00024650583509356;0.00016425132344011;0.00032682827441022;-1.7594889868633e-05;-0.00025660524261184;0.00027095602126792;8.1440935900901e-05;-4.156223803875e-05;5.7953579926107e-06;8.9295615907758e-05;1.0822327567439e-05;-1.8746932255453e-05;1.0506099670238e-06;6.3618426793255e-05;0.00061647256370634;0.00011690503015416;0.00091307301772758;-0.00019062081992161;-0.00044229338527657;0.00013284129090607;6.3278806919698e-05;6.9218976932461e-06;0.00016826645878609;-8.3077960880473e-05;-6.2193953453971e-06;-3.238522913307e-05;4.9754322390072e-05;0.00066578586120158;0.0004065835964866;-0.00022335982066579;-0.0002620353770908;-0.0012053698301315;-0.00022844319755677;-0.00016921444330364;-2.1577610823442e-05;-0.0005122430738993;0.00011248550435994;-9.7392323368695e-05;2.3635306206415e-05;0.00010195073991781;3.9533631934319e-05;-8.8962706286111e-06;-1.23855406855e-05;2.0815550669795e-05;2.6230884031975e-05;-0.00031769246561453;0.00027896749088541;-0.00078834895975888;-0.00012388121103868;-3.8363152270904e-05;0.00022344832541421;6.1308819567785e-05;9.6194067737088e-05;-0.00018655681924429;4.9272228352493e-05;-9.8761433036998e-05;-0.0001933438325068;-8.3826911577489e-05;-0.00011067302693846;0.00061155954608694;0.00015778813394718;8.3056671428494e-05;0.00040411777445115;-0.00056760030565783;-1.3176795619074e-05;-0.00023057870566845;0.0005530123016797;0.00015041335427668;-5.7055331126321e-06;-4.6007058699615e-05;7.4081617640331e-05;3.5531254980015e-05;3.0523275199812e-05;-9.9735316325678e-06;-0.00014994089724496;-8.213915862143e-05;-0.00013417583249975;-0.00022154609905556;9.7677009762265e-05;-0.0002210439852206;-0.00083659018855542;0.00060854514595121;-0.00012099121522624;5.1510345656425e-05;-0.00030194618739188;-3.086804645136e-05;0.00059264805167913;-0.00032596330856904;3.8899703213247e-05;-0.00047657097456977;-0.00010881926573347;5.1709666877287e-05;0.00027042327565141;0.00045041512930766;0.00025673423078842;0.00041344092460349;2.8705655950034e-06;-0.00027973306714557;0.00028205296257511;0.00010667982132873;-4.7091732994886e-05;-7.6054434430262e-06;0.00010086883412441;1.2341923138592e-05;-2.4093087631627e-05;-3.4126410355384e-06;6.7716020566877e-05;0.00074408791260794;0.00019773852545768;0.0010272873332724;-0.00023238352150656;-0.00054386118426919;0.00014377813204192;7.8719080192968e-05;2.160360054404e-05;0.00017666727944743;-0.00010440339246998;1.4884485608491e-05;-3.0881965358276e-05;6.7038570705336e-05;0.00080657441867515;0.00060283567290753;-0.00027932770899497;-0.00030790336313657;-0.0014375203754753;-0.00038133907946758;-0.00019261457782704;-4.7928868298186e-05;-0.00059857597807422;0.00013199618842918;-0.00011451384489192;2.5552137230989e-05;0.00012841222633142;5.1526069000829e-05;-5.4647971410304e-06;-8.9434934125165e-06;1.4718826605531e-05;1.72762083821e-05;-0.00019249146862421;0.00018823686696123;-0.00053994299378246;-6.1148464737926e-05;-8.2275189924985e-05;0.00019415326823946;3.0634360882686e-05;6.8419860326685e-05;-0.00014006819401402;4.5084248995408e-05;-2.1279065549606e-06;-0.00016338155546691;-5.19985514984e-05;-6.145378574729e-05;0.00041510505252518;8.8448003225494e-05;5.579408025369e-05;0.00026869727298617;-0.00040187296690419;3.2032401122706e-06;-0.00016148945724126;0.00034454048727639;0.00010288422345184;1.3264002518554e-05;-3.8950649468461e-05;2.8338079573587e-05;3.2811378332553e-05;2.283963294758e-05;-3.788185722442e-06;-0.00011131585051771;-6.6555381636135e-05;-0.00014663387264591;-0.00018191692652181;5.5591244745301e-05;-0.00012609237455763;-0.00052692199824378;0.00036711464053951;-9.1293841251172e-05;2.3557733584312e-05;-0.00020339174079709;-2.7746795240091e-05;0.00039251745329238;-0.00018588178500067;2.450270949339e-05;-0.00040351020288654;-0.00015446516044904;7.0524511102121e-05;0.00020337197929621;0.00039801609818824;0.00025528500555083;0.00030342064565048;3.1661609682487e-05;-0.00018330517923459;0.00016043471987359;7.5060772360303e-05;-2.6183621230302e-05;-8.7709368017386e-06;6.3875115301926e-05;5.7217748690164e-06;-1.731381053105e-05;-6.5805454596557e-07;4.3626372644212e-05;0.00054634280968457;0.00019228823657613;0.00064263440435752;-0.00015681691002101;-0.00037863367469981;6.8812507379334e-05;6.0346566897351e-05;2.332556687179e-05;9.9031793070026e-05;-7.6375225035008e-05;3.0514953323291e-05;-6.5529316088941e-06;5.3956133342581e-05;0.00060015090275556;0.00054693734273314;-0.00021475908579305;-0.00022393371909857;-0.001035523833707;-0.000372541078832;-0.00014005981211085;-4.9358241085429e-05;-0.00039226035005413;7.9818550148048e-05;-7.3138406150974e-05;1.643041105126e-05;8.9386165200267e-05;3.8600664993282e-05;1.0911082426901e-05;-1.0003219358623e-05;-9.6108724392252e-06;3.3163621992571e-05;-6.0347123508109e-05;6.7831817432307e-05;-0.00020056386711076;0.00019240839174017;-0.00051759381312877;0.00052699766820297;-3.0942228477215e-05;4.0329399780603e-05;-0.00011862968676724;0.00012967875227332;0.00034030541428365;-0.00036674650618806;-2.2997101041256e-05;1.5464023817913e-05;4.3924188503297e-05;6.0456997744041e-05;-3.5815897717839e-05;0.00011647468636511;-0.00019054125004914;6.5792955865618e-05;-0.00010207709419774;-2.1771644753699e-07;2.5703962819534e-05;7.1468683017883e-05;-7.9767087299842e-05;-8.8628883531783e-05;9.3570721219294e-05;2.8668260711129e-05;1.9406079445616e-05;-0.00016588164726272;-0.00011696911678882;-0.00039861720870249;-0.00032361230114475;7.0078342105262e-05;6.6187982156407e-05;-0.00015810372133274;-0.00014576782996301;-0.00010432067210786;-8.2862679846585e-05;-0.00018422317225486;-0.00013550903531723;0.00020760095503647;0.00019904643704649;1.7453648979426e-05;-0.00075926602585241;-0.00065353146055713;0.00028368827770464;0.00021144824859221;0.0007582267280668;0.00078566733282059;0.00037587955011986;0.00027896172832698;-0.00011065401486121;-0.00013487300020643;5.847178545082e-05;4.9240425141761e-05;3.4325574233662e-05;2.984061211464e-05;-1.3460115042108e-05;-5.7238421504735e-06;3.0297656849143e-05;1.4407219168788e-05;0.00057931331684813;0.00047731687664054;5.7906523579732e-05;5.6151486205636e-05;-0.00025057510356419;-0.00027191883418709;7.7126787800808e-05;4.8700712795835e-05;-3.0234103178373e-05;-2.7567892175284e-05;0.00011146896576975;0.00013219521497376;5.4665371862939e-05;0.00067063054302707;0.0012686006957665;-0.00025176798226312;-0.0002115450479323;-0.0010222353739664;-0.00097220612224191;-0.00019384214829188;-0.00012852350482717;-0.00013420172035694;-0.00013316066178959;-6.5250214902335e-06;9.5130570798574e-07;4.3713836930692e-05;3.0040948331589e-05;5.3365492931334e-06;5.0284506869502e-06;-8.5373258116306e-06;-3.5120049233228e-06;-0.00017379040946253;0.00020756844605785;2.7127542125527e-05;0.0004530034493655;-3.4760749258567e-05;-7.4485331424512e-05;-5.2308485464891e-05;-2.9506409191526e-05;-3.1091560231289e-05;9.0611814812291e-05;4.9468064389657e-05;0.00010893235594267;3.7155459722271e-05;0.00011504867870826;-0.00026269908994436;-4.5500964915846e-05;-9.7806303529069e-05;0.00027204674552195;-0.00030737463384867;0.00013108197890688;-4.0013824218477e-06;-2.9370929041761e-05;-0.00031832623062655;2.0451210730243e-05;9.0975863713538e-06;-7.0050832619017e-06;-5.18814449606e-05;-5.6892627071647e-06;1.2940989108756e-05;-5.0990140152862e-05;-6.2483013607562e-05;-0.00011017249926226;-5.8695790357888e-05;-0.00011467046715552;4.6474549890263e-05;0.00030590913956985;-0.00042105105239898;4.1649473132566e-05;-3.7995261664037e-05;-1.91583421838e-05;-0.00012940341548529;-0.00017884580302052;0.00026544043794274;1.226155745826e-05;-0.00026212490047328;-3.0235103622545e-05;0.00016759689606261;2.9236087357276e-05;0.00010188689338975;0.00023651521769352;-1.4532828572555e-05;0.00015550563693978;0.00016520213102922;-0.00012241974764038;-3.0976578273112e-05;3.5441513318801e-05;5.9279231209075e-05;1.4104424735706e-05;-1.511572918389e-05;1.0271180144628e-05;5.299219628796e-05;-1.6020836483222e-05;4.753005123348e-05;0.00033902347786352;-0.00013409454550128;0.00069584423908964;0.00011077824456152;-0.00032158600515686;4.5750061872241e-06;3.6203928175382e-05;-6.4130676037166e-05;0.00010433292482048;-4.0831451769918e-05;-3.0617236916441e-05;2.8273550924496e-05;0.0004368623776827;0.00021247121912893;-0.00019220294780098;-9.7867130534723e-05;-8.6874249973334e-05;-0.00083238177467138;-7.152552370826e-06;-7.7206430432852e-05;9.7077223472297e-05;-0.00032589625334367;1.4997856851551e-05;-7.0310707087629e-05;3.3697306207614e-05;8.7357722804882e-05;3.8094156025181e-06;7.2098860073311e-06;-1.5875300960033e-05;-3.2328575798601e-06;-0.0002197157300543;0.00032745386124589;2.4844979634508e-05;0.00055062893079594;2.0526666048681e-05;-0.00019509237608872;-5.441474422696e-05;-5.9955280448776e-05;-3.5023840609938e-05;8.5863750427961e-05;1.9431006876403e-05;0.00028520060004666;6.1425584135577e-05;0.0001681134745013;-0.00028833284159191;-5.057780072093e-05;-0.0001723916066112;0.00031402925378643;-0.00041533072362654;0.00015237429761328;1.6398898878833e-05;-1.0323122296541e-05;-0.00046881352318451;1.6339421563316e-05;5.0419916078681e-05;4.040407930006e-06;-0.00011903059203178;-1.0588446457405e-05;1.4343748262036e-05;-5.0754897529259e-05;-7.9808247392066e-05;-0.00010121376544703;-5.1978233386762e-05;-0.00017859252693597;5.8942616306012e-05;0.00043836666736752;-0.00058837619144469;6.8404042394832e-05;-3.1775158277014e-05;-1.9840368622681e-05;-0.00018560492026154;-0.00026276518474333;0.00032159898546524;1.300337316934e-05;-0.00027909447089769;4.8369616706623e-05;0.00019452707783785;2.9979681130499e-05;5.6493543524994e-05;0.00022796196572017;-5.7757973991102e-05;0.0001847291860031;0.00024522317107767;-0.00012252187298145;-4.570350938593e-05;3.4063843486365e-05;8.2511869550217e-05;4.7856399760349e-05;-1.5536712453468e-05;1.4828803614364e-05;7.328419451369e-05;-1.9488232283038e-05;-2.7697687983164e-05;0.00040201851516031;-0.0001613112835912;0.0010228342143819;0.00016514756134711;-0.00040961877675727;-1.520471778349e-05;4.3630789150484e-05;-7.6781165262219e-05;0.00016572704771534;-6.4631232817192e-05;-8.8604203483555e-05;2.3140855773818e-05;0.00052862224401906;0.00010774286783999;-0.00023948289162945;-9.549821697874e-05;3.543053753674e-05;-0.0010654486250132;3.046786696359e-05;-0.00010217913222732;0.00012710739974864;-0.00043869987712242;2.2412456019083e-05;-9.922702156473e-05;4.0074439311866e-05;0.00011693994019879;-1.1141141840199e-05;1.0321165973437e-05;2.4582803234807e-05;-1.3684109944734e-05;-0.00016473911819048;0.00015685203834437;-0.00025642177206464;9.3350885435939e-05;0.00059820810565725;-0.00031615298939869;0.00021073828975204;1.8230973637401e-06;0.00023665565822739;-3.951045073336e-06;-0.00082738365745172;0.00015405959857162;-6.5915402956307e-05;-0.00018357892986387;4.7860437916825e-05;0.00018261375953443;4.1766918002395e-05;0.00032523088157177;-0.00016027975652833;-0.00028618486248888;-2.9779270334984e-05;0.0003359388501849;-0.00012506336497609;-0.00027729224530049;1.8916256522061e-05;0.00031413804390468;-3.1489078537561e-05;-2.0742421838804e-05;6.7347509684623e-06;-7.5202486186754e-05;-2.2988722776063e-05;-0.00053567090071738;0.00010600443056319;-0.00057597673730925;-0.00012245286779944;-0.00024275667965412;0.00029825733508915;0.00012147759844083;7.0814479840919e-05;-0.00037660606903955;3.2553423807258e-05;-0.00029445067048073;-0.00018737860955298;-7.4392388341948e-05;-0.00043643795652315;0.00026686934870668;0.00027714992756955;0.00022071957937442;0.00064920599106699;-0.00023529026657343;0.00011923594138352;-0.0001488275884185;0.0007926607504487;0.00014963338617235;-8.3611615991686e-05;-4.2679967009462e-05;0.0003269377630204;3.7211215385469e-05;1.3748007404502e-05;7.2919351623568e-07;-1.3970724467072e-05;8.157902630046e-05;0.00017001174273901;-0.0002658971643541;0.0013275069650263;-0.00014301098417491;-0.00037252437323332;0.00023167072504293;4.6809898776701e-05;-6.8231172917876e-05;0.00015570189862046;-4.4272375816945e-05;-0.0003564395592548;-8.9999135525431e-05;-3.7561057979474e-05;0.00030560424784198;-0.00039243942592293;6.3260231399909e-05;-0.00017243162437808;-0.00090983911650255;0.00050245202146471;-0.00010994394688169;0.00011628379434114;-0.00026129855541512;0.00011383988749003;-0.00010039361950476;2.6804991648532e-05;0.00015476794214919;2.7482261430123e-05;-9.4741917564534e-06;-1.1860201084346e-05;2.7176276489627e-05;2.1230207494227e-05;-0.00028435935382731;0.00030393901397474;-0.0008391096489504;-0.0001028636470437;1.6979103747872e-05;0.00014766126696486;5.3308212955017e-05;9.1247988166288e-05;-0.00017387825937476;3.8307298382279e-05;-7.4397663411219e-05;-0.00014342792565003;-7.4482035415713e-05;-8.7158587120939e-05;0.00065565475961193;0.00013597920769826;6.7377230152488e-05;0.0003899271832779;-0.00060146680334583;-2.246434087283e-05;-0.00021822785492986;0.00053461478091776;0.00011437759530963;6.3793077060836e-06;-3.8884347304702e-05;4.8085308662849e-05;2.981008583447e-05;2.4726827177801e-05;-3.2810150969453e-06;-0.00013019351172261;-9.2939117166679e-05;-0.00028547836700454;-0.00021021810243838;-0.0001120878077927;-0.00014192076923791;-0.00065143423853442;0.00050519109936431;-0.00011645883205347;4.7109679144341e-05;-0.00030130610684864;-7.8880457294872e-06;0.00049423315795138;-0.00027935759862885;1.5304613043554e-05;-0.00061005569295958;-0.00018804965657182;0.00010995922639268;0.00032073311740533;0.0007244284497574;0.00025861625908874;0.00039688084507361;1.1738311513909e-06;-0.00011381079821149;0.00021720002405345;0.00010883298091358;-4.7849476686679e-05;-1.4825906873739e-05;8.2764876424335e-05;1.7740649127518e-05;-2.2221049221116e-05;-2.2266132873483e-05;4.1049726860365e-05;0.00056140311062336;0.00016623255214654;0.00091151753440499;-0.00022609732695855;-0.000509854988195;0.00015092242392711;5.7421795645496e-05;2.8942609787919e-05;0.00014997161633801;-9.634505113354e-05;1.0381701031292e-05;-3.6945839383407e-05;5.2555951697286e-05;0.00058778614038602;0.00050887314137071;-0.00019675625662785;-0.00021116336574778;-0.0011270102113485;-0.00031529867555946;-0.0001206198357977;-4.8720692575444e-05;-0.00053292361553758;0.00013359931472223;-0.00010727008339018;1.9305787645862e-05;0.00012627756223083;4.9511530960444e-05;2.5505119992886e-05;-1.9533084923751e-05;-2.6712154067354e-05;6.2794861150905e-05;-9.2040012532379e-05;8.9912202383857e-05;-0.00020703765039798;0.00032675440888852;-0.00095359812257811;0.00095516646979377;-5.6585366110085e-05;5.7171102525899e-05;-0.00016181838873308;0.00021303530957084;0.00059882592177019;-0.00062906963285059;-3.6405795981409e-05;2.1298406863934e-05;-2.7538450012798e-05;0.00013392684923019;-9.8719567176886e-05;0.00013958942145109;-0.00021268354612403;0.00010764277249109;-0.00014752935385332;-8.0802616139408e-05;3.4624252293725e-05;0.00011293713032501;-0.0001313591201324;-0.00016314089589287;0.00016538953059353;4.5325235987548e-05;3.4037526347674e-05;-0.00027315210900269;-0.00019096105825156;-0.00061230041319504;-0.00048657695879228;0.00014962929708418;0.00015637726755813;-0.00022769665520173;-0.00036213622661307;-0.00016284773300868;-0.00015097329742275;-0.00031510120606981;-0.00025959947379306;0.00031768475309946;0.00041106110438704;3.3708209230099e-05;-0.0011802884982899;-0.0010686462046579;0.00045428334851749;0.00029878359055147;0.0011650673113763;0.0012692918535322;0.00060894637135789;0.00048938946565613;-0.00018600362818688;-0.00028550825663842;9.3466034741141e-05;9.9540273367893e-05;8.0539684859104e-05;5.4660416935803e-05;-2.2128717318992e-05;-3.5807959193335e-06;6.0507740272442e-05;2.6086578145623e-05;0.0009211793076247;0.00077272619819269;4.2009327444248e-05;0.0001709675998427;-0.00037533970316872;-0.00050238624680787;0.00012115870777052;7.0485410105903e-05;-3.3001462725224e-05;-1.1327159654684e-06;0.00018405931768939;0.00023570079065394;6.9927235017531e-05;0.0010450839763507;0.0020790230482817;-0.00038820708869025;-0.00032164191361517;-0.0016041097696871;-0.0015839487314224;-0.00033564356272109;-0.00021763503900729;-0.00020100722031202;-0.00028293981449679;-1.5480870843021e-06;-1.3221812196207e-06;4.735926995636e-05;2.9298520530574e-05;2.9103448468959e-05;-1.8647317119758e-05;-3.4055323339999e-05;5.8851448557107e-05;-9.8810778581537e-05;7.7610988228116e-05;-9.3505492259283e-05;0.00037817991687916;-0.00094531296053901;0.00092565466184169;-6.4852189098019e-05;4.643738429877e-05;-0.00013098995259497;0.00021325197303668;0.00058562844060361;-0.0005988638731651;-2.7661364583764e-05;1.7878879589261e-05;-0.00015060818986967;0.00013363594189286;-0.00011256967991358;0.00014322265633382;-0.00015644222730771;0.00012115613208152;-0.00012425717432052;-0.00014197596465237;-7.5816888056579e-06;0.00010377290891483;-0.00012654210149776;-0.00016115988546517;0.00015945144696161;4.068466660101e-05;3.3507301850477e-05;-0.00025859544984996;-0.00017938822566066;-0.00054536818061024;-0.00043874120456167;0.00016255895025097;0.00015323027037084;-0.00015429389895871;-0.00044129352318123;-0.00013910605048295;-0.00015386857558042;-0.00028842178289779;-0.00027349425363354;0.00025517219910398;0.00045857860823162;3.5385000956012e-05;-0.0010819939197972;-0.00098971161060035;0.00043468113290146;0.00024735671468079;0.0010194194037467;0.0012132639531046;0.00054827833082527;0.00048657308798283;-0.00016550958389416;-0.0003062212781515;7.758157880744e-05;0.00010893066064455;9.2279529781081e-05;4.8526108002989e-05;-2.3949016394909e-05;1.8200840941063e-06;6.3811843574513e-05;2.3972843337106e-05;0.0008590430370532;0.00072502170223743;-1.0409251444798e-05;0.00025021200417541;-0.00030908812186681;-0.00052850355859846;0.00011695708235493;5.9430818510009e-05;-3.2596304663457e-05;2.8309503250057e-05;0.00016417707956862;0.0002308424009243;5.8831970818574e-05;0.00097269751131535;0.0019461420597509;-0.0003592491557356;-0.00029630813514814;-0.0014792841393501;-0.0015039738500491;-0.00033036663080566;-0.00020217856217641;-0.00015814966172911;-0.00032391451532021;3.7364575291576e-06;-7.5453403951542e-06;3.7100468034623e-05;2.3409240384353e-05;3.8769321690779e-06;9.5077466539806e-06;-1.86559100257e-05;-7.8283865150297e-06;-0.00030393991619349;0.00043689645826817;1.4121441381576e-05;0.0007426681695506;8.5036503151059e-05;-0.00032143393764272;-6.5069376432803e-05;-8.1497128121555e-05;-3.9944930904312e-05;9.1695423179772e-05;-1.3188478988013e-05;0.0004134169430472;8.0550787970424e-05;0.00021954838302918;-0.00037788655026816;-5.7833127357299e-05;-0.00022991985315457;0.00042243418283761;-0.00056044431403279;0.00018925646145362;3.3024323784048e-05;1.6496920579812e-05;-0.00062298681586981;1.4626447409682e-05;7.4490992119536e-05;1.2810273801733e-05;-0.00015982969489414;-9.6676112661953e-06;1.3530634532799e-05;-7.0535243139602e-05;-9.3438466137741e-05;-9.6347845101263e-05;-0.00016424102068413;-0.00019352065282874;-9.1158944997005e-05;0.00051804044051096;-0.0006621977663599;9.1854897618759e-05;-3.2470077712787e-05;-7.9692244980833e-06;-0.00026117890956812;-0.00031802835292183;0.00034903307096101;5.9846058775292e-07;-0.00044149241875857;6.0479214880615e-05;0.00028463712078519;7.5364107033238e-05;3.1044462957652e-05;0.00047113024629653;-9.4070870545693e-05;0.00023251118545886;0.00028220270178281;-2.4464488888043e-05;-6.1715894844383e-05;4.3285832362017e-05;9.6421113994438e-05;7.2364236984868e-05;-1.6968902855297e-05;2.1882857254241e-05;8.1510035670362e-05;-3.1866424251348e-05;-8.4734077972826e-05;0.00043110750266351;-0.00019683773280121;0.0013378279982135;0.00022677240485791;-0.00052029429934919;-2.3931856048875e-05;4.8677189624868e-05;-9.2249574663583e-05;0.00021801679395139;-9.2650094302371e-05;-0.00014164691674523;1.748370777932e-05;0.0005683753406629;3.0519568099407e-05;-0.0002558977867011;-7.6890180935152e-05;0.00012967585644219;-0.0012392507633194;5.4163276217878e-05;-0.00010736125841504;0.00016398074512836;-0.0005516271921806;2.6380024792161e-05;-0.00013124285032973;5.1036455261055e-05;0.00015604017244186;-1.0796965170812e-06;1.030525436363e-05;-1.9460470866761e-05;-4.7988346523198e-06;-0.00024623403442092;0.00042948382906616;-1.1767724572564e-05;0.00058466469636187;0.00012420257553458;-0.00036287802504376;-4.1499672079226e-05;-9.5909694209695e-05;-3.6475175875239e-05;5.2921204769518e-05;-4.3602129153442e-05;0.00050743878819048;8.1413920270279e-05;0.0002099068951793;-0.0002491878985893;-4.4148317101644e-05;-0.00024127740471158;0.00031297997338697;-0.00049564894288778;0.00014312056009658;5.2392315410543e-05;4.4902306399308e-05;-0.00059525243705139;5.9419630815682e-06;0.00010430005204398;2.1818364984938e-05;-0.00019657223310787;-1.0987153473252e-05;1.1382979209884e-05;-4.4858159526484e-05;-8.8180553575512e-05;-6.6188884375151e-05;-0.00013608548033517;-0.00020308158127591;-2.1937774363323e-05;0.00048651051474735;-0.00062187010189518;8.5663399659097e-05;-9.8124646683573e-06;-9.4653523774468e-06;-0.0002374768955633;-0.00029750796966255;0.0002545569150243;-4.4439611883718e-06;-0.00032793101854622;0.0001093939790735;0.00021861944696866;7.8574405051768e-05;-1.8529876797402e-06;0.00030458573019132;-0.00010118493810296;0.00019345805048943;0.00027425985899754;7.9558303696103e-06;-5.4646465287078e-05;1.555930248287e-05;8.8294698798563e-05;0.00010869665857172;-1.3175521416997e-05;1.8159318642574e-05;8.9075234427582e-05;-2.1146841390873e-05;-0.00012535379210021;0.00040731928311288;-0.00017530338664073;0.0012887896737084;0.00020791395218112;-0.00045987256453373;-4.0373146475758e-05;4.4283588067628e-05;-8.3852712123189e-05;0.00021073015523143;-8.3847953646909e-05;-0.00015771322068758;9.944504199666e-06;0.00056250975467265;-3.9983133319765e-05;-0.00026392584550194;-6.789673352614e-05;0.00019487507233862;-0.0012072927784175;7.8303390182555e-05;-0.00011532325879671;0.00014742797065992;-0.00049591361312196;2.9317574444576e-05;-0.00011563436419237;4.2987026972696e-05;0.00013497234613169;-8.9588747869129e-06;1.2455003343348e-05;4.3294010538375e-05;-4.5712647988694e-05;8.2748709246516e-05;0.00014506855222862;-0.00013413531996775;0.0001286038022954;0.0007291900110431;-0.00040617366903462;0.00026185187743977;-2.6200887077721e-06;0.00044133508345112;-2.2512456780532e-05;-0.00094892195193097;0.00019967484695371;-4.2015042708954e-05;-0.00019776591216214;-1.8002197975875e-05;8.8243272330146e-05;6.927564390935e-05;0.00029319507302716;-0.00013130430306774;-0.00042897509410977;1.2008049452561e-06;6.7101333115716e-05;-0.00015795504441485;-0.00036939056008123;2.8071033739252e-05;0.00035590905463323;-3.2774983992567e-05;-4.0689803427085e-05;1.7880624000099e-05;-6.4704559918027e-05;-4.4632895878749e-05;-0.00076380465179682;0.00020109394972678;-0.0010033742291853;-6.7888511694036e-05;-5.6170127209043e-05;0.00021292782912496;0.00020599321578629;8.7606138549745e-05;-0.00046155575546436;5.4960761190159e-05;-0.00059625430731103;-0.00015201114001684;-0.00011179986177012;-0.0006406347383745;0.00036410361644812;0.0003834995732177;0.00031579885398969;0.0010256465757266;-0.00038653161027469;5.6690321798669e-05;-0.00019743421580642;0.001264835242182;0.0001003577344818;-0.00014579495473299;-4.9858666898217e-05;0.00046702893450856;2.471670632076e-05;1.0842301890079e-05;7.8009989010752e-06;-2.8899065000587e-05;8.8003223936539e-05;4.9639209464658e-05;-0.00037312161293812;0.0016416669823229;-0.00015094676928129;-0.00042349440627731;0.0002879379899241;7.4627598223742e-05;-8.9896166173276e-05;0.00012311425234657;-4.1309984226245e-05;-0.00056771864183247;-0.00011548629117897;-5.9875623264816e-05;0.0002458373492118;-0.00061556871514767;0.00015467223420274;-0.00016333628445864;-0.00096540513914078;0.00071629416197538;-0.00010825294884853;0.00015704736870248;-0.00015254257596098;0.00012679112842306;-0.00012915970000904;2.812624006765e-05;0.00024097111599986;3.1641793611925e-05;-9.551444236422e-06;1.147614329966e-05;5.3623280109605e-05;-4.9592530558584e-05;-4.1404517105548e-05;0.00025660314713605;-0.00038976193172857;0.00014189186913427;0.00087641779100522;-0.00048175852862187;0.00029528816230595;1.6929647244979e-05;0.00046205075341277;-2.0020046576974e-05;-0.0010934324236587;0.0002318022743566;-7.118553185137e-05;-0.00027590949321166;0.00012508533836808;0.00016005238285288;9.9766257335432e-05;0.00049185729585588;-0.00030374020570889;-0.00047036685282364;-4.8433397751069e-05;0.00023406044056173;-0.00018189838738181;-0.00041121544199996;2.7281494112685e-05;0.00040195856126957;-3.7874095141888e-05;-4.5070039050188e-05;1.9914456061088e-05;-8.3959253970534e-05;-7.2944727435242e-05;-0.00093681446742266;0.00022001225443091;-0.0012583549832925;-8.87813148438e-05;-0.00015160605835263;0.00032083259429783;0.00020617566769943;0.00011713661660906;-0.00059760559815913;7.0841568231117e-05;-0.00054982944857329;-0.00022427576186601;-0.00012608974066097;-0.0008582107257098;0.00040978423203342;0.00044611957855523;0.0004353541880846;0.0013712110230699;-0.00044916087063029;0.00013404147466645;-0.00024396886874456;0.0014450751477852;0.00014701751933899;-0.00012308165605646;-7.0336383942049e-05;0.00049558409955353;4.0989503759192e-05;1.8875391106121e-05;6.4158516579482e-06;-4.456271926756e-05;9.5352828793693e-05;0.00015082649770193;-0.000450462277513;0.0020775333978236;-0.00020567329193;-0.00057967682369053;0.00038047321140766;9.6449999546167e-05;-0.00010025143274106;0.00020999854314141;-5.8765053836396e-05;-0.00063372234581038;-0.00015508897195105;-5.8885485486826e-05;0.00030089711071923;-0.00072543602436781;0.000151281041326;-0.00018292902677786;-0.0012123667402193;0.00085505458991975;-0.000140641714097;0.00018568387895357;-0.00034964678343385;0.00017588137416169;-0.00018755767086986;3.2996569643728e-05;0.00030291045550257;4.5035514631309e-05;-8.2769829532481e-06;-1.0022192327597e-05;2.8834825570812e-05;1.4820690921624e-05;-0.00020406316616572;0.0002828371070791;-0.00076756638009101;-6.8716013629455e-05;5.7153516536346e-05;5.973111547064e-05;3.4793891245499e-05;7.3164461355191e-05;-0.00013954039604869;2.283435787831e-05;-2.4867933461792e-05;-7.8795390436426e-05;-5.3573872719426e-05;-4.3488635128597e-05;0.00061039166757837;9.1475667431951e-05;3.8640937418677e-05;0.00030899830744602;-0.00054884125711396;-2.4473076337017e-05;-0.00017482593830209;0.0004319577710703;6.5263870055787e-05;2.1249823475955e-05;-2.6889436412603e-05;1.0808877959789e-05;2.0983772628824e-05;1.5478555724258e-05;4.1491534830129e-06;-9.1081463324372e-05;-9.1642548795789e-05;-0.00038749960367568;-0.00017656602722127;-0.00030163876363076;-4.1269697248936e-05;-0.00037236732896417;0.0003282222605776;-9.6612486231606e-05;3.4226974094054e-05;-0.00025307110627182;1.5220344721456e-05;0.00033251722925343;-0.00019100241479464;-8.7338557932526e-06;-0.00065991492010653;-0.00025389139773324;0.00014768660184927;0.00032600772101432;0.00089853024110198;0.00023788810358383;0.00032174383522943;4.186816568108e-06;5.5805034207879e-05;0.00011996453395113;9.661204967415e-05;-4.1112027247436e-05;-2.4458069674438e-05;5.2622286602855e-05;2.071822018479e-05;-1.7246560673811e-05;-3.8630147173535e-05;4.8826668717084e-06;0.0002863846893888;0.00012002595030935;0.00064044492319226;-0.00018425635062158;-0.00040044289198704;0.00013138269423507;2.5697432647576e-05;3.4922362829093e-05;9.589470573701e-05;-7.4601404776331e-05;1.0159791600017e-05;-3.6071436625207e-05;3.1086186936591e-05;0.00027255906024948;0.00035696115810424;-8.4345832874533e-05;-7.6631768024527e-05;-0.00062934914603829;-0.00022206698486116;-2.4908546038205e-05;-4.6171437134035e-05;-0.0003832511138171;0.00011372775770724;-8.1989099271595e-05;9.1978445198038e-06;0.00010456630116096;4.1350922401762e-05;1.9200258975616e-05;-1.5697060007369e-05;-1.9994329704787e-05;5.893579145777e-05;-9.1299414634705e-05;8.8350658188574e-05;-0.00024761373060755;0.00026465335395187;-0.00073640025220811;0.00074989633867517;-2.3396627511829e-05;3.8713969843229e-05;-0.00012790760956705;0.00016298069385812;0.00044926299597137;-0.00049107655650005;-4.1197603422916e-05;4.0609111238155e-06;3.5067947464995e-05;0.00017331285926048;-0.00011740007175831;6.2108381825965e-05;-0.00013454236614052;4.1510127630318e-05;-0.00010628857125994;1.1429775440774e-05;4.1797588892223e-06;8.4712315583602e-05;-0.00010280760761816;-0.0001352325634798;0.00014247828221414;4.1521656385157e-05;2.9517670554924e-05;-0.00022395342239179;-0.0001511376030976;-0.00058071443345398;-0.00046247482532635;9.6509887953289e-05;0.00010697553807404;-0.00021756265778095;-0.00024914494133554;-0.00015195355808828;-0.00013122780364938;-0.00028028915403411;-0.00021239755733404;0.00028437640867196;0.00031287563615479;-1.5871153209446e-06;-0.0010719903511927;-0.0010234927758574;0.00041405102820136;0.00029218665440567;0.0011249710805714;0.0011720485053957;0.00053812365513295;0.00040913181146607;-0.00014056780491956;-0.00020806248357985;9.1373738541733e-05;8.6714040662628e-05;6.1668943089899e-05;4.4510190491565e-05;-1.0820367606357e-05;-1.3256147894936e-06;3.5374123399379e-05;1.2176111340523e-05;0.00068022834602743;0.0005598088609986;2.0054125343449e-05;5.5655662436038e-05;-0.00033469093614258;-0.00039948991616257;8.5406922153197e-05;5.1041577535216e-05;-1.4452863979386e-05;-4.7158723646135e-06;0.00016809652152006;0.00020980434783269;3.9638453017687e-05;0.00069653382524848;0.0017121904529631;-0.000249185890425;-0.0002032137272181;-0.0011969216866419;-0.0011532756034285;-0.00025273076607846;-0.00016326157492585;-0.00017511961050332;-0.00020613287051674;8.360760261894e-07;6.0723350543412e-06;2.4202096028603e-05;8.2173755799886e-06;3.2703090255382e-05;-2.2358597561833e-05;-4.1728453652468e-05;8.5187071817927e-05;-0.00012106786743971;9.8119773610961e-05;-0.00023689799127169;0.00046326237497851;-0.0011594811221585;0.0011516427621245;-4.7166166041279e-05;4.8480138502782e-05;-0.00017363407823723;0.00026218270068057;0.00070711271837354;-0.00074632366886362;-5.0705013563856e-05;-6.4228009932776e-07;-9.4320901553147e-05;0.00025282558635809;-0.00018487815395929;7.7703451097477e-05;-0.00011787340190494;8.5623803897761e-05;-0.00013929045235272;-7.1567708801012e-05;-3.0298602723633e-05;0.00012543072807603;-0.00015805441944394;-0.00020786616369151;0.00021388081950136;6.0494232457131e-05;4.4960233935853e-05;-0.00033351467573084;-0.00022261592675932;-0.00082563696196303;-0.00067450065398589;0.00018924516916741;0.00016249519831035;-0.00025309802731499;-0.00047068230924197;-0.00021228780678939;-0.00020849313295912;-0.00039413617923856;-0.00034229768789373;0.00037677772343159;0.0005407843273133;3.7293873447197e-06;-0.0015496732667089;-0.001526344101876;0.00061714620096609;0.00039137905696407;0.0015782892005518;0.0017788992263377;0.00077084748772904;0.00063674652483314;-0.00021732518507633;-0.00034967297688127;0.00012150032125646;0.00014426086272579;0.00010356349957874;5.9160214732401e-05;-2.1592648408841e-05;2.8629540338443e-06;5.8620513300411e-05;1.9150806110702e-05;0.0010180460521951;0.00082806963473558;-4.3396765249781e-05;0.0001514215109637;-0.00044953724136576;-0.00065433053532615;0.00013435515575111;6.6925422288477e-05;-3.9863807614893e-05;1.0323189599148e-05;0.00024170039978344;0.00032544403802603;6.0384030803107e-05;0.0010591754689813;0.0025719266850501;-0.0003789275069721;-0.00031408018548973;-0.0017857558559626;-0.0017343311337754;-0.0003891879459843;-0.00023166203754954;-0.00021260807989165;-0.00035337879671715;7.6446121966001e-06;5.3617945923179e-06;3.6157151043881e-05;1.1083090612374e-05;3.6839206586592e-05;-2.0024355762871e-05;-5.2973555284552e-05;7.772433309583e-05;-0.00014938197273295;0.0001037452602759;-0.00012140643229941;0.00061131187248975;-0.0011609538923949;0.0011149562196806;-6.2355706177186e-05;3.6847242881777e-05;-0.00015044896281324;0.00028510831180029;0.00071135524194688;-0.00072288839146495;-3.6627967347158e-05;-5.1463939598761e-06;-0.0002809623547364;0.00025060249026865;-0.00020421280351002;0.00013007168308832;-9.1525893367361e-05;0.00011808754061349;-0.00011729959078366;-0.00013936808682047;-0.00012239145871717;0.00012098166916985;-0.00016151585441548;-0.00020976216183044;0.0002116147079505;5.8522975450614e-05;4.6177116018953e-05;-0.00033368219737895;-0.00021972249669489;-0.00080619176151231;-0.00068369117798284;0.00020602559379768;0.0001226190070156;-0.00014438670768868;-0.00057986343745142;-0.00019072685972787;-0.00022262631682679;-0.00036315087345429;-0.00037483091000468;0.00029754676506855;0.00062096392503008;5.2803039807259e-07;-0.0015591001138091;-0.001521218335256;0.00065051025012508;0.00036520720459521;0.0014992533251643;0.0018685725517571;0.00072436709888279;0.00066651968518272;-0.00018985025235452;-0.00036721376818605;0.00010182828555116;0.00016320272698067;0.00011718365567503;4.7226945753209e-05;-2.6848631023313e-05;1.0210053915216e-05;5.8798399550142e-05;1.3569749171438e-05;0.00099666754249483;0.00080218235962093;-0.00012335753126536;0.0002606104244478;-0.00037859618896618;-0.00072513014310971;0.00014196867414284;5.626717756968e-05;-5.7587996707298e-05;3.8839119952172e-05;0.00022218622325454;0.00033237299066968;5.5756576330168e-05;0.0010226715821773;0.0025314320810139;-0.00035941042006016;-0.00030120651354082;-0.001734746270813;-0.0017117604147643;-0.0003974953724537;-0.0002136620314559;-0.00015333030023612;-0.00041851922287606;1.2641638932109e-05;-3.936313532904e-06;3.6850826290902e-05;1.256187169929e-05;2.4559534722357e-05;-8.0195113696391e-06;-4.1308696381748e-05;4.1217095713364e-05;-0.00016362286987714;0.00010901153291343;-6.2101600633468e-05;0.00062891800189391;-0.00069656956475228;0.00062896212330088;-5.0783946790034e-05;1.246817282663e-05;-9.5556337328162e-05;0.00022321876895148;0.00044298710417934;-0.00043354471563362;-1.2567110388773e-05;-3.913980890502e-06;-0.00034826991031878;0.00016984583635349;-0.00015597569290549;0.00019178578804713;-0.00010773928079288;0.00010809241939569;-6.0112117353128e-05;-8.7237727711909e-05;-0.00022086768876761;7.7965429227334e-05;-0.00011359159543645;-0.00013429508544505;0.00013704557204619;4.1025687096408e-05;3.3015043300111e-05;-0.00023406992841046;-0.00014901437680237;-0.00060841965023428;-0.00056151323951781;0.00011796820763266;-2.5850617021206e-05;1.4185485269991e-05;-0.00043389163329266;-0.00011621366866166;-0.00016609230078757;-0.00021024720626883;-0.00027760185184889;0.00012202089419588;0.00046396558173001;-2.0891840904369e-05;-0.0012182656209916;-0.0011182082816958;0.0005349040729925;0.00028353556990623;0.0010840306058526;0.0015148025704548;0.00046250366722234;0.00048605239135213;-7.7030490501784e-05;-0.00021133075642865;5.1513103244361e-05;0.00012695044279099;8.0288104072679e-05;1.1880089914484e-05;-2.2006148356013e-05;1.3792377103528e-05;2.5603874746594e-05;-8.1497810242581e-06;0.00063238071743399;0.00049951969413087;-0.00017065339488909;0.00025030362303369;-0.0001966925628949;-0.00055585202062503;0.0001042267322191;3.0792387406109e-05;-7.1708309405949e-05;3.301413016743e-05;0.00013102337834425;0.00022910120605957;3.6739831557497e-05;0.00060799473430961;0.0016916107852012;-0.00020085288269911;-0.00017124861187767;-0.0011041057296097;-0.0011092629283667;-0.00025846654898487;-0.00011333339352859;-3.6776396882487e-05;-0.0003243365790695;1.109542154154e-05;-1.2732274626615e-05;3.6612440453609e-05;2.2366237317328e-05;1.7077469237847e-05;-4.7840972001723e-06;-2.8531063435366e-05;2.2537158656633e-05;-0.00013384819612838;9.9269171187188e-05;-1.9866756701958e-05;0.00047144963173196;-0.00042568915523589;0.00036574029945768;-4.0219631046057e-05;6.0985353229626e-06;-5.5525739298901e-05;0.00014924169227015;0.0002749479317572;-0.0002533127553761;-1.2864829841419e-06;4.9748555284168e-06;-0.00027959444560111;0.00010252155334456;-0.00010969996947097;0.00017328708781861;-0.00010847371595446;8.7158761743922e-05;-3.7112873542355e-05;-6.5798943978734e-05;-0.00018590697436593;4.8574020183878e-05;-7.2076916694641e-05;-8.4541505202651e-05;8.33910817164e-05;2.4985281925183e-05;2.1064035536256e-05;-0.00015022623119876;-9.5570605481043e-05;-0.00037903411430307;-0.00035965975257568;6.7498622229323e-05;-4.4294589315541e-05;5.0626345910132e-05;-0.00031548028346151;-6.3399282225873e-05;-0.00010773550457088;-0.00012500234879553;-0.00019129678548779;4.6322376874741e-05;0.00032019446371123;-1.4882575669617e-05;-0.00079170905519277;-0.00068376772105694;0.00035851131542586;0.00017761332856026;0.00065736070973799;0.00099219917319715;0.00027355022029951;0.0003167983959429;-2.8994958483963e-05;-0.00012999020691495;2.5383158572367e-05;8.6545114754699e-05;5.6721641158219e-05;5.6698431762925e-06;-1.5530715245404e-05;1.120548677136e-05;1.6569207218708e-05;-7.1228296292247e-06;0.00039718073094264;0.00032254573307;-0.00012055222759955;0.00023093562049326;-9.8934819106944e-05;-0.00038176006637514;6.9133100623731e-05;1.8919288777397e-05;-4.8701327614253e-05;3.8122336263768e-05;7.2224698669743e-05;0.00014065878349356;2.1784515411127e-05;0.00038390813278966;0.0010407886002213;-0.00012427919136826;-0.00010639870015439;-0.00068512209691107;-0.00072051060851663;-0.00016716285608709;-7.2578382969368e-05;-9.4564456958324e-06;-0.00024166856019292;6.7520263655751e-06;-1.5469602658413e-05;2.6068333681906e-05;1.8451893993188e-05;9.059681360668e-06;6.9461680141103e-06;-1.0172700967814e-05;-1.7556345483172e-05;-0.00036434261710383;0.00036854506470263;1.6730717106839e-05;0.00088943057926372;0.00010386822395958;-0.00030081314616837;-7.9337449278682e-05;-4.5514058001572e-05;-2.9348531825235e-05;0.00010607942385832;-2.5788749553612e-05;0.00024102092720568;6.1381440900732e-05;0.00018358704983257;-0.00051287747919559;-5.1608916692203e-05;-0.00016723178850953;0.00053740007570013;-0.00057507771998644;0.00020813543233089;1.3194133316574e-05;2.0944060452166e-05;-0.00055889412760735;1.510383663117e-05;2.1609079340124e-05;8.0655881902203e-06;-7.2537884989288e-05;2.4941634819697e-06;5.6841149671527e-06;-0.00010650233889464;-6.4950516389217e-05;-7.8842713264748e-05;-0.00035341319744475;-6.8282875872683e-05;-0.00046570488484576;0.00036495269159786;-0.00039943092269823;8.337930921698e-05;-4.7114936023718e-05;2.6465035261936e-05;-0.00027177162701264;-0.00023906365095172;0.00029635024839081;-2.1170459149289e-05;-0.00068313517840579;-5.983968367218e-05;0.00039081161958165;0.00012478981807362;3.0580969905714e-05;0.00095702474936843;-8.6389656644315e-05;0.00023338233586401;0.0001692020741757;0.00016233339556493;-6.2720173445996e-05;7.3929659265559e-05;6.8658824602608e-05;1.8293842003914e-05;-1.4862685020489e-05;2.7617945306702e-05;2.6358951799921e-05;-5.2422583394218e-05;-6.6197615524288e-05;0.00021839290275238;-0.00017139315605164;0.0011102635180578;0.00022415291459765;-0.00048500162665732;5.3728563216282e-06;2.7452015274321e-05;-7.6196949521545e-05;0.00017750737606548;-9.9128963483963e-05;-0.00011695224384312;5.6042540563794e-06;0.00025366470799781;-1.3651761946676e-05;-9.1589288786054e-05;2.8884940093121e-06;0.00010889516124735;-0.00076865282608196;2.0781086277566e-05;-2.3411776055582e-05;0.00015444761083927;-0.00047930108848959;1.0754569302662e-05;-0.00012387179594953;5.2995143050794e-05;0.00015548494411632;-1.1143222764076e-05;5.2268724175519e-06;4.6613189624622e-05;-2.7278418201604e-05;-0.00018236198229715;9.6871095593087e-05;-0.00012917052663397;0.00022091547725722;0.00036724310484715;-0.00068230001488701;-3.5952049870502e-07;-0.00016480681370012;3.1307845347328e-06;-0.00031059331377037;-0.00018992397235706;0.00083070667460561;3.8424001104431e-05;0.0002381706435699;2.2120058929431e-05;-7.4694245995488e-05;-0.00011567412002478;0.00016674418293405;-0.00044524215627462;2.0083081835764e-05;0.00024919590214267;0.000169528691913;-0.00012938845611643;-2.5958974219975e-05;0.00026565050939098;4.3133106373716e-05;-0.00029486158746295;1.6391992176068e-05;-2.8998707421124e-05;-7.9894132795744e-05;-3.2125597499544e-05;0.00019842745678034;-0.00063020217930898;-3.8271562516456e-05;-0.0010684384033084;0.00019211246399209;-2.6644240278983e-05;0.0001187531161122;0.00013702471915167;6.9833629822824e-05;-0.00034515897277743;-0.00015555575373583;-0.00044136529322714;-0.00010439904872328;-0.00079187558731064;0.00028748874319717;0.00042460463009775;0.00029535769135691;-0.00035297498106956;0.0012334719067439;-0.00024046342878137;3.8944606785662e-05;9.2933907581028e-05;0.0010014495346695;-6.5158259531017e-05;-0.0001017580361804;3.1983374356059e-05;0.00036450641346164;1.0668076356524e-05;1.2658555533562e-05;7.3971197707579e-05;-5.1909973990405e-05;-0.00043692596955225;6.8018533056602e-05;-0.0001408327370882;0.0018714820034802;0.00030697780312039;-0.00049870164366439;-0.00010586024291115;7.5123884016648e-05;-6.8524037487805e-05;0.00015494551917072;-0.00013732333900407;-0.00058866961626336;-4.7874538722681e-05;0.00029127666493878;-0.00064990535611287;-0.00016055470041465;0.00015522139437962;0.00073631235864013;-0.0011120656272396;0.00021613504213747;-7.8442732046824e-05;0.00015611470735166;-0.00025344447931275;2.9479178920155e-05;-0.00015442138828803;4.8819885705598e-05;0.00027825150755234;2.452037506373e-06;9.5473060355289e-06;7.6571886893362e-05;-0.00010140463564312;0.00049785559531301;0.00014401871885639;-1.4029948033567e-05;0.00014476409705821;0.0008070325711742;-0.00046170278801583;0.00028668221784756;1.0575317901385e-05;0.00074720522388816;-5.1988510676892e-05;-0.00090935674961656;0.00021945498883724;-3.2962968816719e-06;-0.00024069468781818;-4.0341423300561e-05;-9.1525005700532e-05;0.0001461462379666;0.00029645537142642;-0.00015050366346259;-0.00059975672047585;1.892705768114e-05;-0.00046645672409795;-0.00016071675054263;-0.0004526755947154;3.3043943403754e-05;0.0003245834086556;-2.0866456907243e-05;-6.9521789555438e-05;3.2361960620619e-05;-2.6400808565086e-05;-0.00010434543946758;-0.00088237627642229;0.00032353241113015;-0.0016504159430042;6.4478258536838e-06;0.00016812837566249;0.00011238505248912;0.00029848236590624;0.00012163056089776;-0.00054717116290703;7.9921890574042e-05;-0.00084670720389113;-0.00011865378473885;-0.00012927435454912;-0.0009235727484338;0.00052665476687253;0.0003981176414527;0.00048831640742719;0.0015534412814304;-0.00062025373335928;-6.2807310314383e-05;-0.00026171584613621;0.0017520856345072;4.7237073886208e-05;-0.0001915280445246;-6.4933585235849e-05;0.00057502737035975;1.5907373381197e-05;6.4060907334351e-07;2.1131703761057e-05;-4.6421500883298e-05;6.2498897023033e-05;-4.8900594265433e-05;-0.00052373233484104;0.0020590755157173;-0.00014847661077511;-0.00050118053331971;0.00037012351094745;0.00014184828614816;-0.00010879473848036;9.7181044111494e-05;-3.4209162549814e-05;-0.00084988074377179;-0.00015754846390337;-7.0562782639172e-05;8.5762061644346e-05;-0.00094107777113095;0.0002321575593669;-8.7397245806642e-05;-0.00095402571605518;0.0010030047269538;-0.00014159445709083;0.00021063900203444;-6.4630206907168e-05;0.00014393062156159;-0.00019608315778896;2.3300122848013e-05;0.00038284718175419;4.037515464006e-05;2.3884110760264e-06;8.0249637903762e-06;7.5494208431337e-05;-9.1433408670127e-05;0.00029961243853904;0.00023766489175614;-0.00024984835181385;0.0001525986881461;0.00091035891091451;-0.00051333534065634;0.00029700025334023;2.3852102458477e-05;0.0006988060194999;-4.5618689910043e-05;-0.0010213057976216;0.00024279943318106;-3.5198387195123e-05;-0.00029335796716623;8.1688980571926e-05;7.6813785199192e-06;0.00015081260062288;0.00046520814066753;-0.00028981157811359;-0.0005816642078571;-2.4813924028422e-05;-0.00023005383263808;-0.00018035899847746;-0.00046052571269684;3.186312460457e-05;0.00035803418722935;-2.6562529455987e-05;-6.9838832132518e-05;3.2800253393361e-05;-4.1402388887946e-05;-0.00011573082883842;-0.0010038128821179;0.00032122587435879;-0.0017614343669266;-8.8220549514517e-06;8.2462189311627e-05;0.00019438803428784;0.00028621812816709;0.00013657807721756;-0.00063283741474152;9.0028224803973e-05;-0.00078397197648883;-0.00017059840320144;-0.00014149607159197;-0.0010510799475014;0.0005268687964417;0.00044829800026491;0.00055289978627115;0.0017531020566821;-0.00063245923956856;4.3965123950329e-06;-0.00028557938640006;0.00182797270827;8.0358026025351e-05;-0.00016628668527119;-7.7315191447269e-05;0.00057758268667385;2.7486261387821e-05;1.0719903002609e-05;1.789928683138e-05;-5.364208118408e-05;6.3477935327683e-05;6.0914321693417e-06;-0.00055422401055694;0.0022763651795685;-0.0001803680206649;-0.00059981044614688;0.00042608886724338;0.00013413124543149;-0.00010857429879252;0.00017096336523537;-4.5495111407945e-05;-0.00083165627438575;-0.00018340644601267;-7.3419912951067e-05;9.7024916613009e-05;-0.00098396930843592;0.00022987632837612;-8.4112492913846e-05;-0.0010508034611121;0.0010546087287366;-0.00014692332479171;0.00021775122149847;-0.00022765448375139;0.00017537320673;-0.0002190452942159;2.4866267267498e-05;0.00038733126712032;5.0535760237835e-05;2.4603823476355e-05;-1.8123138943338e-05;-2.5612887839088e-05;6.0855276387883e-05;-9.7230971732643e-05;6.8031091359444e-05;-0.00013488077092916;0.00021663379448;-0.00073079142021015;0.00074372306698933;-2.0847102859989e-05;2.9920181987109e-05;-8.2920552813448e-05;0.00013773105456494;0.00041348274680786;-0.00045920864795335;-4.2739353375509e-05;-1.7528000171296e-05;-3.1567997211823e-05;0.00020763420616277;-0.00013815067359246;9.2376021711971e-06;-1.8833214198821e-05;2.8148784622317e-05;-8.2677499449346e-05;-3.179734267178e-05;8.9493714767741e-06;6.6841093939729e-05;-9.0379558969289e-05;-0.00013267461326905;0.00014017168723512;3.5975368518848e-05;2.5981607905123e-05;-0.00019165921548847;-0.00012204282393213;-0.00043229555012658;-0.00035086856223643;0.00014086485316511;0.00011936553346459;-0.0002219105954282;-0.00028212077450007;-0.00012881275324617;-0.00012313993647695;-0.00026522477855906;-0.00021741588716395;0.00026309987879358;0.00032279323204421;-4.214215095999e-06;-0.00082947080954909;-0.00086957094026729;0.00033170462120324;0.00020750293333549;0.00086435570847243;0.00097060989355668;0.00046461290912703;0.00036875912337564;-0.0001571478205733;-0.00021731952438131;8.4233855886851e-05;9.2039503215346e-05;7.3384144343436e-05;4.7931058361428e-05;-8.5444762589759e-06;3.0419298582274e-06;4.5325541577768e-05;2.0126899471506e-05;0.00061120744794607;0.0004708755586762;2.5858671506285e-05;8.7888874986675e-05;-0.00028860199381597;-0.00038419116754085;7.2808456025086e-05;3.3997672289843e-05;2.3807424440747e-05;3.2940442906693e-05;0.00015625821833964;0.00020342291099951;1.8969592929352e-05;0.00059606338618323;0.0014978244435042;-0.00021567643852904;-0.00017500959802419;-0.0010381459724158;-0.00096843321807683;-0.00025570363504812;-0.00014821811055299;-0.00017919480160344;-0.00022817638819106;2.8458023280109e-06;5.6209714784927e-06;-3.9832148104324e-06;-1.5005164641479e-05;3.427565752645e-05;-2.0697005311376e-05;-5.3677973482991e-05;9.190863056574e-05;-8.8860935647972e-05;3.9028465835145e-05;-0.00013110364670865;0.00043342134449631;-0.0011069560423493;0.0010886859381571;-1.2555786270241e-05;1.5611303751939e-05;-0.00011900116805919;0.0002352459996473;0.0006359206745401;-0.0006703304243274;-5.5411052017007e-05;-4.8678572056815e-05;-0.00016921763017308;0.00035764623316936;-0.00025512982392684;-0.00013756906264462;0.000184743621503;1.1241520041949e-05;-6.9543966674246e-05;-6.6293730924372e-05;-8.6823732999619e-05;9.5501978648826e-05;-0.0001387693482684;-0.00020465315901674;0.00021204174845479;6.0498554375954e-05;4.3805146560771e-05;-0.00028734336956404;-0.00017517992819194;-0.00077166181290522;-0.00064421631395817;0.00022588751744479;0.00015295928460546;-0.00021962533355691;-0.00048481873818673;-0.00020689751545433;-0.00021763633412775;-0.00036845437716693;-0.00034392374800518;0.0003454401739873;0.0005549187771976;-4.4496613554657e-05;-0.001389927463606;-0.0016314188251272;0.00058307958533987;0.00033787454594858;0.0015092240646482;0.0017858293140307;0.00071559863863513;0.00061086338246241;-0.00022410217206925;-0.00034940673504025;0.00012101390166208;0.00016247246821877;0.00010273031512043;4.6913704863982e-05;-1.2638788575714e-05;1.1707129488059e-05;4.4355056161294e-05;1.3201462934376e-05;0.00079201610060409;0.0005875481874682;-0.00015800671826582;4.771104795509e-05;-0.00040013456600718;-0.00064428395126015;0.00010061644570669;2.9195274692029e-05;-2.663503983058e-05;3.0467066608253e-05;0.00024711183505133;0.00035111428587697;2.5074627046706e-05;0.0007348774233833;0.0023717493750155;-0.00025075752637349;-0.00021436881797854;-0.0014066729927436;-0.0012892835075036;-0.00033186402288266;-0.00016386259812862;-0.00016120226064231;-0.00033187426743098;2.0043376935064e-05;1.7575068341102e-05;-1.0925734841294e-06;-3.1686173315393e-05;3.9263937651413e-05;-2.0216848497512e-05;-6.6527769376989e-05;8.7562795670237e-05;-0.00012271585001145;7.1496418968309e-05;-5.0662183639361e-05;0.00059988728025928;-0.0011561309220269;0.0010954568861052;-2.8331038265605e-05;9.4985189207364e-06;-0.00010809738159878;0.00026742822956294;0.00067479436984286;-0.00067178439348936;-4.1224448068533e-05;-5.10529098392e-05;-0.00033429509494454;0.00036522489972413;-0.00028699365793727;-7.4357449193485e-05;0.00017590643255971;4.5258486352395e-05;-6.0813159507234e-05;-0.00012620992492884;-0.00018266118422616;9.8009782959707e-05;-0.00014887959696352;-0.0002173771354137;0.00021854281658307;6.1887149058748e-05;4.6800938434899e-05;-0.00030274468008429;-0.00018454990640748;-0.00080344127491117;-0.00068252498749644;0.00024014097289182;0.00012010573846055;-0.00012375999358483;-0.00061277236090973;-0.00019822831382044;-0.00023866172705311;-0.0003599742485676;-0.00039073976222426;0.00028814116376452;0.0006527318037115;-4.9333146307617e-05;-0.0014849582221359;-0.001693980069831;0.00064811488846317;0.00033957249252126;0.0015239927452058;0.0019519346533343;0.00071148143615574;0.00066572293872014;-0.00020160674466752;-0.00037849869113415;0.00010952028969768;0.00018636544700712;0.00011903555423487;4.0225946577266e-05;-1.8064050891553e-05;1.8293909306522e-05;4.4069656723877e-05;1.0845945325855e-05;0.00082628201926127;0.00060657097492367;-0.00022371206432581;0.00015810648619663;-0.0003592811699491;-0.00073899468407035;0.00011565699242055;2.3304693968385e-05;-4.5316774048842e-05;6.1825427110307e-05;0.00023971826885827;0.00037287347367965;2.3156841052696e-05;0.00074902770575136;0.0024525984190404;-0.00024628185201436;-0.00021902161824983;-0.0014565067831427;-0.0013446904486045;-0.00035766078508459;-0.00016344019968528;-0.00012146135850344;-0.00041186509770341;2.2868365704198e-05;9.1270248958608e-06;5.1118117880833e-06;-3.3141142921522e-05;3.4676631912589e-05;-1.6424668501713e-05;-5.5578791943844e-05;5.729455006076e-05;-0.00017025595298037;0.00014149864728097;1.4518494708682e-06;0.00062042206991464;-0.00086659530643374;0.00078139628749341;-4.7846286179265e-05;1.1453976185294e-05;-7.3108356446028e-05;0.00022224023996387;0.00051966728642583;-0.000478870322695;-1.4304763681139e-05;-1.7172253137687e-05;-0.00038123250124045;0.00025159053620882;-0.00023462207172997;0.0001063322997652;-1.4205505067366e-05;9.0703055320773e-05;-5.8365738368593e-05;-0.00013492547441274;-0.00022833039110992;7.707322947681e-05;-0.00011782746878453;-0.00016893692372832;0.00016280220006593;4.4184340367792e-05;3.5954417398898e-05;-0.00024013315851334;-0.00015008168702479;-0.00059017550665885;-0.00051267020171508;0.00016455529839732;4.1287323256256e-05;-7.1257309173234e-06;-0.0005705498624593;-0.00012715853517875;-0.00018524379993323;-0.00026218011043966;-0.0003335349902045;0.00015357221127488;0.0005582487792708;-3.1362211302621e-05;-0.001175458310172;-0.0011830668663606;0.00053311744704843;0.00025413639377803;0.0010718679986894;0.0015182619681582;0.00050303229363635;0.00052785244770348;-0.00010894142906182;-0.00028740055859089;6.755578215234e-05;0.00015394591900986;0.00010683521395549;3.0675131711178e-05;-1.9013199562323e-05;1.8119972082786e-05;3.8005371607142e-05;8.9991990535054e-06;0.00067754479823634;0.00052212714217603;-0.00016698824765626;0.00030173768755049;-0.00022329337662086;-0.00062789593357593;0.0001041837313096;2.212051913375e-05;-3.5024488170166e-05;9.2539739853237e-05;0.00015802070265636;0.00027437569224276;1.629814687476e-05;0.00061660655774176;0.0018209405243397;-0.00019835223793052;-0.00017933888011612;-0.0011559758568183;-0.0011278862366453;-0.00030287023400888;-0.00014615287363995;-7.9808858572505e-05;-0.00040652108145878;1.3112598026055e-05;-1.0483319783816e-05;1.3040081284998e-05;-1.8167571397498e-05;2.3449585569324e-05;-1.1429475307523e-05;-3.4751294151647e-05;3.0422441341216e-05;-0.00013434220454656;0.00013173975457903;2.5849711164483e-05;0.00042447249870747;-0.00051808473654091;0.00044795664143749;-4.165327118244e-05;9.9641711130971e-06;-3.6668665416073e-05;0.00013443476927932;0.00031485839281231;-0.00026487442664802;6.6162010625703e-07;6.4874802774284e-06;-0.00027260469505563;0.00013362884055823;-0.00015045340114739;0.00013341606245376;-8.520526898792e-05;8.0343364970759e-05;-4.2529423808446e-05;-0.0001047207188094;-0.00016774510731921;4.6581531933043e-05;-6.9349960540421e-05;-0.00010305106843589;9.3196846137289e-05;2.3636377591174e-05;2.1026775357313e-05;-0.00014390680007637;-9.3003691290505e-05;-0.00031765075982548;-0.0002736923051998;8.8524415332358e-05;1.7348034816678e-05;3.3215179428225e-05;-0.00040079990867525;-6.1277707573026e-05;-0.00010826325888047;-0.00015410676132888;-0.00021628527611028;6.1663900851272e-05;0.000361051002983;-1.1895120223926e-05;-0.00067843589931726;-0.0006112510454841;0.00031813935493119;0.00013631395995617;0.00055566639639437;0.00085890496848151;0.00027385196881369;0.00031659845262766;-4.3905998609262e-05;-0.00017748333630152;3.3070857170969e-05;9.5567440439481e-05;7.400458707707e-05;2.3374224838335e-05;-1.3215070794104e-05;1.2236352631589e-05;2.8628848667722e-05;9.6523062893539e-06;0.00042434528586455;0.00035072572063655;-8.3618884673342e-05;0.00028746458701789;-0.00010854643187486;-0.00040084688225761;6.6966924350709e-05;1.6376559869968e-05;-1.4311722225102e-05;8.5906780441292e-05;8.1010606663767e-05;0.00015388189058285;7.6783699114458e-06;0.00040445971535519;0.0010362409520894;-0.00013062449579593;-0.00011839511716971;-0.00070384354330599;-0.00073665595846251;-0.00019463646458462;-0.00010601334361127;-4.9685888370732e-05;-0.00029450104921125;5.5076061471482e-06;-1.5741137758596e-05;9.7753882073448e-06;-1.0221901902696e-05;1.0180016943195e-05;4.11049268223e-06;-4.781914412888e-06;-1.9190629245713e-05;-0.00033242066274397;0.00027003532159142;1.372244059894e-05;0.000807688862551;0.00010160675446969;-0.00024390738690272;-7.1720824053045e-05;-1.8732715034275e-05;-1.804423845897e-05;9.238782513421e-05;-3.1978415790945e-05;0.0001142637047451;4.0844290197128e-05;0.00013024131476413;-0.00049179652705789;-3.6545534385368e-05;-0.00010663813736755;0.00050222093705088;-0.00048022056580521;0.00017989848856814;3.4360905942776e-07;2.2440537577495e-05;-0.00042692373972386;1.1774236554629e-05;-8.3222703324282e-06;5.202892680245e-06;-1.5738163710921e-05;8.6370810095104e-06;-1.7523062467717e-07;-0.000106253370177;-3.6676050513051e-05;-5.2990279073128e-05;-0.00038827728712931;1.0302456757927e-05;-0.00059154507471249;0.00021877681137994;-0.00018534350965638;6.4722604292911e-05;-4.4439588236855e-05;4.118090873817e-05;-0.00022923108190298;-0.0001554067566758;0.00021273954189382;-2.9181666832301e-05;-0.00068922620266676;-0.00010914513404714;0.00037792488001287;0.00012661034998018;2.0142908397247e-05;0.0010479707270861;-6.9326692027971e-05;0.00018789288878907;7.9470992204733e-05;0.00023850875732023;-5.2480834710877e-05;7.6280150096864e-05;4.1386410885025e-05;-1.2848757251049e-05;-1.0629201824486e-05;2.6064277335536e-05;-1.0499371455808e-05;-5.4486590670422e-05;-5.0248632760486e-05;5.1876653742511e-05;-0.00012421172868926;0.00078857049811631;0.00018425549205858;-0.00037751562194899;1.998282277782e-05;9.4857941803639e-06;-5.2918214350939e-05;0.00012409593909979;-8.6406806076411e-05;-8.520206756657e-05;-3.2794098387967e-06;2.1661820937879e-05;-5.0379545427859e-05;2.1763649783679e-05;5.0811555411201e-05;8.7970343884081e-05;-0.00035470651346259;8.1296218468196e-07;2.9611112040584e-05;0.00012124830391258;-0.00035210535861552;-1.9159593023232e-07;-9.7239673777949e-05;4.4816904846812e-05;0.00012699222133961;-1.3965253856441e-05;4.3730466359193e-07;0.00010364752233727;-4.2875322833424e-05;-0.00015056997654028;-0.00021030296920799;-0.00017038713849615;-2.512053697501e-06;0.00045889342436567;-0.00082848285092041;5.1065026127617e-06;-0.00021231560094748;2.9818420443917e-05;-0.00056830671383068;-0.00023574660008308;0.00097209744853899;-6.145239694888e-07;0.00028040781035088;0.00014718632155564;-0.00012988920207135;1.0120332262886e-05;0.0001106117197196;-0.00043358316179365;-3.2315350836143e-05;0.00039060713606887;0.00020272361871321;0.00028859206940979;-3.7364210584201e-05;0.00037230245652609;4.3102601921419e-05;-0.00034642382524908;3.0455623345915e-05;-5.1353963499423e-05;-0.00012560110189952;-4.6712507355551e-06;0.00033482900471427;-0.00080540461931378;1.4247045328375e-05;-0.0017026601126418;0.00010776307317428;0.00020529095490929;0.00015793908096384;0.00022650885512121;0.00010320296132704;-0.00040949758840725;-0.00012735545169562;-0.0007853478891775;-0.00014429134898819;-0.001106156851165;0.00044532271567732;0.00060257624136284;0.00035907980054617;-0.00057344365632161;0.001790399546735;-0.00033275960595347;-6.0551301430678e-05;4.6476892748615e-05;0.0015157473972067;-8.0573176092003e-05;-0.00017510550969746;1.9770621292992e-05;0.0005251636612229;2.5186061975546e-05;5.1773231461993e-06;7.3965769843198e-05;-7.9030396591406e-05;-0.00062332570087165;-5.7815570471575e-05;-0.00014650613593403;0.0024484796449542;0.00039408437442034;-0.00059679435798898;-0.00014846412523184;0.00012790618347935;-7.1002563345246e-05;0.00010736331023509;-0.00017828417185228;-0.00094412727048621;-6.9582070864271e-05;0.0002375366166234;-0.00099879247136414;-0.00014697377628181;0.00026508254813962;0.0010662004351616;-0.0012896478874609;0.00030471890931949;-8.8213506387547e-05;0.00017837683844846;-0.00011042177357012;3.2304735213984e-05;-0.00020727681112476;5.9178983065067e-05;0.00043069681851193;-1.4771302630834e-05;-1.2496562931119e-06;0.00012012690422125;-4.1594706999604e-05;-2.8735308660544e-05;-0.00046292270417325;-0.00015121331671253;-0.0003120934125036;0.00038087592110969;-0.00067361508263275;1.9455737856333e-05;-0.00019986309052911;4.4823027565144e-05;-0.00062723935116082;-0.00019601239182521;0.00081172003410757;-3.9985599869397e-05;0.00020444634719752;0.00027190265245736;-0.00012831526692025;0.00013180964742787;-4.4066673581256e-05;-0.00020202048472129;-9.2618611233775e-05;0.00040920177707449;0.00016318139387295;0.00060588197084144;-3.7270277971402e-05;0.00036193130654283;2.9788719984936e-05;-0.00030155823333189;3.0289671485662e-05;-5.1279854233144e-05;-0.00011225877824472;1.4317007298814e-05;0.00033076416002586;-0.0006389178452082;3.208315683878e-05;-0.0015776058426127;1.3092220797262e-05;0.00030940878787078;0.0001351804821752;0.00023801952193025;8.8747976406012e-05;-0.00030592334223911;-6.5318919951096e-05;-0.00085746712284163;-0.00012594753934536;-0.00093902868684381;0.00044667682959698;0.00052053102990612;0.00028378175920807;-0.00055794382933527;0.0015383722493425;-0.00029422243824229;-0.00013893991126679;6.8248959905759e-06;0.0014203860191628;-6.3258630689234e-05;-0.00020213199604768;4.5648275772692e-06;0.00051720422925428;2.9628643460455e-05;-7.0089258770167e-06;6.3851577579044e-05;-7.1744798333384e-05;-0.00057136756367981;-0.00012705739936791;-0.00010499992640689;0.0021284040994942;0.00032259992440231;-0.00046209178981371;-0.0001436632592231;0.0001365700882161;-5.1161532610422e-05;5.6697799664107e-06;-0.00014313455903903;-0.00096420862246305;-6.2230115872808e-05;0.00018371516489424;-0.0009422444854863;-0.00012962488108315;0.00026047401479445;0.00098920834716409;-0.0011018795194104;0.00028576501063071;-7.855094736442e-05;0.00013206453877501;0.00010405985085526;2.8062695491826e-05;-0.0001753921242198;4.4503631215775e-05;0.0004217830428388;7.0224546107056e-06;5.9780554693134e-06;7.7068754762877e-05;-0.00014048456796445;0.0012191806454211;-0.00012294063344598;0.00064217421459034;5.92989163124e-05;0.00027486617909744;-0.00016644662537146;0.00017107982421294;-3.2266038942907e-06;0.00080107420217246;-7.3187300586142e-05;-0.00017947735614143;6.718015356455e-05;0.00011994085798506;-5.7355486205779e-05;-0.00028754750383087;-0.00048929231707007;0.0001554811897222;-0.00021624910004903;0.00018646889657248;-0.00054416601778939;0.00011638757132459;-0.0014069932512939;-2.6703684852691e-05;-0.00030357381911017;2.1424499209388e-05;7.3536844865885e-05;1.9481107301544e-05;-5.2993145800428e-05;2.5210083549609e-05;3.8708061765647e-05;-0.00010475705494173;-0.00011074037320213;0.00024646462406963;-0.001173012657091;5.7295568694826e-05;0.00038476794725284;-0.00012790491746273;0.00025667366571724;7.2246213676408e-05;-0.00012540303578135;2.6897088901023e-05;-0.00079234928125516;3.134068538202e-05;-2.5670140530565e-05;-0.00045989456702955;0.0004518236964941;8.181668817997e-06;0.00030885639716871;0.00079371751053259;-0.0004931180155836;-0.00029211741639301;-0.00013780732115265;0.0010673513170332;-3.8128502637846e-05;-0.00021744892001152;-2.4199211111409e-05;0.00041402890929021;-8.0188683568849e-06;-3.6884313885821e-05;3.1746589229442e-05;-1.9651673937915e-05;-8.4258829247119e-08;-0.00018621304479893;-0.0003413331869524;0.0010733347153291;-2.57949486695e-05;-0.00014932647172827;0.0001586369908182;0.00016614534251858;-7.2712915425655e-05;-0.00020558462711051;5.2437703743635e-06;-0.0008280401234515;-6.5446314692963e-05;-2.5891398763633e-05;-8.0890415119939e-05;-0.00067119253799319;0.00015549194358755;1.0584399205982e-05;-0.000393170514144;0.00066723738564178;-0.00011286204244243;0.00014543134602718;0.00050735863624141;3.1808427593205e-05;-9.9508746643551e-05;4.4944217734155e-06;0.0003455601981841;1.1513459867274e-05;1.5384413927677e-05;5.3790281526744e-06;9.9948811111972e-05;-0.00015792131307535;0.001121744280681;1.3852923984814e-05;0.00039314801688306;0.00011717316374416;0.00062150746816769;-0.00036321202060208;0.0002510211779736;1.2660429092648e-05;0.0010143864201382;-8.3434009866323e-05;-0.00055541103938594;0.00016128085553646;7.5962285336573e-05;-0.00019854576385114;-0.00018907069170382;-0.00039215997094288;0.00020853204478044;7.3389419412706e-05;4.9334989853378e-06;-0.00070121744647622;7.8233009844553e-05;-0.0013029191177338;-9.9422912171576e-05;-0.00045261645573191;3.1890660466161e-05;0.00018850022752304;7.0026112553023e-06;-8.4855608292855e-05;3.9374215702992e-05;3.7071731640026e-05;-0.00014723233471159;-0.00054435105994344;0.00037506464286707;-0.0018803516868502;6.8722889409401e-05;0.0004052787553519;-5.5463198805228e-05;0.00035589336766861;0.00012419804988895;-0.00040677806828171;6.9353860453703e-05;-0.00098844373133034;-3.3258125768043e-05;-8.8146327470895e-05;-0.00088282930664718;0.00063563964795321;0.00019803942996077;0.00052367546595633;0.0015253964811563;-0.00073825079016387;-0.00028193058096804;-0.0002511287748348;0.001758802565746;-1.7826989278547e-05;-0.00024127459619194;-5.6568766012788e-05;0.00058115721913055;1.0216380132988e-06;-2.7518026399775e-05;3.7356538086897e-05;-3.6438323149923e-05;1.0619254680932e-05;-0.00015337434888352;-0.00055386818712577;0.001917467918247;-8.6033738625702e-05;-0.00039622676558793;0.00033255506423302;0.00020969864272047;-0.0001062118462869;-4.8829431761988e-05;-1.0435585863888e-05;-0.0010439725592732;-0.00014674810518045;-5.6125525588868e-05;-0.00011041440302506;-0.0010617586085573;0.00023633085947949;2.1111616661074e-05;-0.00069017510395497;0.0010605669813231;-0.00017962450510822;0.00022188732691575;0.00024804641725495;0.00010375438432675;-0.00020140116976108;1.0615125574986e-05;0.00046508479863405;3.4061165933963e-05;1.2507382052718e-05;3.5221787584305e-06;7.4680538091343e-05;-0.00010854691936402;0.00057475356152281;0.00014333022409119;-3.6672661281045e-06;0.00012389344919939;0.00071640079841018;-0.00040949290269054;0.00023318281455431;2.1293211830198e-05;0.0007611681940034;-5.8678779168986e-05;-0.0007183892885223;0.00018865548190661;9.7822539828485e-06;-0.0002369466383243;-1.3479932022165e-05;-0.00014293917047326;0.00016052056162152;0.00030459728441201;-0.00017261445464101;-0.0005507500609383;1.1232634278713e-05;-0.00065000698668882;-0.00013120913354214;-0.0004030313284602;2.8694164939225e-05;0.00024024503363762;-8.7069738583523e-06;-7.4068077083211e-05;3.4967422834598e-05;7.1351473707182e-06;-0.00012397223326843;-0.00072261970490217;0.00032373639987782;-0.0017258140724152;4.130945308134e-05;0.00024014193331823;5.5537570005981e-05;0.00029609646298923;0.00012021221482428;-0.00048236144357361;7.697908586124e-05;-0.00080840010195971;-9.1365684056655e-05;-0.00011053028720198;-0.00091649580281228;0.00052806118037552;0.00029931549215689;0.00050923001253977;0.0015642869984731;-0.00063833163585514;-0.00013902861974202;-0.00024878879776224;0.0016708910698071;2.0585433958331e-05;-0.00017914235650096;-6.2727565818932e-05;0.00052270613377914;1.2454376701498e-05;-3.6212459235685e-06;2.5255221771658e-05;-3.9909155020723e-05;1.9732582586585e-05;-0.00010408528760308;-0.00051034387433901;0.0019000840838999;-0.00011250814714003;-0.00046419599675573;0.00035722155007534;0.00014229948283173;-9.1292284196243e-05;7.6080308645032e-05;-2.3027940187603e-05;-0.00082837138324976;-0.00016047499957494;-6.5673186327331e-05;-8.7364482169505e-05;-0.00096743024187163;0.00022776836703997;1.775528107828e-05;-0.00068292778450996;0.00097168987849727;-0.00013650325126946;0.00019546950352378;-2.2273661670624e-05;0.00012930412776768;-0.00018637537141331;1.2095709280402e-05;0.00036885490408167;4.2767340346472e-05;2.6817795514944e-05;-1.3195873179939e-05;-5.7289300457342e-05;8.3303719293326e-05;1.7296599253314e-05;-8.7362182966899e-05;2.5368468413944e-05;0.00026943392003886;-0.00086055038264021;0.00083388376515359;4.2913528886857e-05;-3.2348856620956e-05;-4.5792494347552e-05;0.00016636196232866;0.00044848665129393;-0.00046509259846061;-5.2341289119795e-05;-0.00010831686086021;-0.00019982355297543;0.00042461539851502;-0.00029055518098176;-0.00049956468865275;0.00064390106126666;-0.00010029339318862;3.7286983570084e-05;-3.6527220800053e-05;-0.00013023147766944;4.3786600144813e-05;-9.0414090664126e-05;-0.00016236791270785;0.00016861096082721;5.2375813538674e-05;3.5427208786132e-05;-0.00017004247638397;-7.8012883022893e-05;-0.00058806873857975;-0.0004948127316311;0.00024207192473114;0.00014406882110052;-0.00013608316658065;-0.00039682281203568;-0.00017291444237344;-0.00019202507974114;-0.00026247691130266;-0.00026916194474325;0.00026066837017424;0.0004700681893155;-0.00011332342546666;-0.00091281475033611;-0.00157107017003;0.00043356951209716;0.00021418735559564;0.0012047331547365;0.0014837202616036;0.00052706454880536;0.00046296237269416;-0.00021192563872319;-0.00030376319773495;0.00010170742461924;0.00015432582586072;7.0861307904124e-05;1.5506277122768e-05;1.3219686252341e-06;1.8602613636176e-05;1.9407538275118e-05;7.6012070167053e-06;0.00033805085695349;0.00015753590560053;-0.00031934070284478;-0.00017406108963769;-0.00028343460871838;-0.00050931808073074;3.2726013159845e-05;-2.7455516828923e-05;-3.0928807973396e-05;2.1880192434764e-05;0.00022086972603574;0.00033188262023032;-1.0576603926893e-05;0.00025785164325498;0.0017706395592541;-7.6247670222074e-05;-8.4149971371517e-05;-0.00067673478042707;-0.0004860516928602;-0.00017307301459368;-3.2170573831536e-05;-4.6136872697389e-05;-0.00020636541012209;3.5914119507652e-05;3.7216766941128e-05;-3.8594065699726e-05;-7.6861309935339e-05;3.2623658626107e-05;-1.5587384041282e-05;-6.7150613176636e-05;8.2143254985567e-05;-2.1341942556319e-05;-3.644918979262e-05;6.6576489189174e-05;0.00039012485649437;-0.00093882449436933;0.00088383263209835;2.6782978238771e-05;-2.8037638912792e-05;-4.1363855416421e-05;0.00019245748990215;0.00050163170089945;-0.00049175095045939;-4.3297997763148e-05;-0.00011220824671909;-0.00030531783704646;0.00043353418004699;-0.00031513132853433;-0.00041589426109567;0.00058792374329641;-6.8536523031071e-05;2.6154100851272e-05;-8.4800507465843e-05;-0.00018663985247258;4.9923550250242e-05;-0.00010287047189195;-0.00017979361291509;0.00018128810916096;5.4397944040829e-05;3.7897923903074e-05;-0.00019158126087859;-9.4258590252139e-05;-0.00061654066666961;-0.00051488360622898;0.00025763377198018;0.00012982897169422;-9.4287774118129e-05;-0.00050354795530438;-0.0001719513675198;-0.00020746210066136;-0.00027726046391763;-0.00031441415194422;0.00023974011128303;0.00055019330466166;-0.00010970509174513;-0.0010037284810096;-0.0015975784044713;0.0004840278706979;0.000223022128921;0.001223259838298;0.0015943798935041;0.00054836791241542;0.00051222514593974;-0.00020397025218699;-0.00033388251904398;9.9081822554581e-05;0.00017331696290057;8.9033208496403e-05;1.8645858290256e-05;-3.3720878036547e-06;2.253933234897e-05;2.4174854843295e-05;1.1937001545448e-05;0.00043211822048761;0.00021812033082824;-0.00032113387715071;-7.299334538402e-05;-0.00027550835511647;-0.00058874755632132;5.2371146011865e-05;-2.6728430384537e-05;-3.055014894926e-05;5.4685162467649e-05;0.00022038776660338;0.0003531753027346;-1.1545331290108e-05;0.0003266149724368;0.0018891642102972;-9.3354894488584e-05;-0.00010699578706408;-0.00081927340943366;-0.00059636007063091;-0.0002208324149251;-5.3091458539711e-05;-5.0198661483591e-05;-0.00028366965125315;3.3619638998061e-05;3.0129645892885e-05;-3.3398730010958e-05;-8.1283411418553e-05;3.0724047974218e-05;-1.705531940388e-05;-4.8306454118574e-05;5.2867482736474e-05;-0.00010690740600694;9.7836651548278e-05;5.1982169679832e-05;0.00039263110375032;-0.00071968627162278;0.00065403652843088;-2.1762112737633e-05;2.9418188205454e-06;-3.0389281164389e-05;0.00014906338765286;0.00040615411126055;-0.00036399438977242;-1.5561876352876e-05;-3.4541764762253e-05;-0.00027629898977466;0.00025335367536172;-0.00022429386444855;-5.1908933528466e-05;0.00013414370187093;3.0272576623247e-05;-2.8836531782872e-05;-0.00011639831063803;-0.00015793011698406;4.8790607252158e-05;-8.3020633610431e-05;-0.00014180841390043;0.00013390272215474;3.4045307984343e-05;2.7083850000054e-05;-0.00016151394811459;-9.5017399871722e-05;-0.00039331932202913;-0.00031811094959266;0.00015923733008094;8.5845458670519e-05;-3.3800693927333e-05;-0.00047362662735395;-0.00010074257443193;-0.00014369303244166;-0.000217092470848;-0.00026385998353362;0.00014018664660398;0.00044612944475375;-4.2370476876386e-05;-0.0007501290529035;-0.00090997730148956;0.00035936824860983;0.00015195242303889;0.00074167567072436;0.0010500265052542;0.00037762819556519;0.00038757495349273;-0.00011121614807053;-0.00025514725712128;6.198622577358e-05;0.00012765514838975;8.8339351350442e-05;3.0882354622008e-05;-9.1602951215464e-06;1.5828669347684e-05;3.4515975130489e-05;1.959600194823e-05;0.0004702576843556;0.00033834582427517;-0.00013233441859484;0.00018941800226457;-0.00017915887292475;-0.00047581654507667;6.5581261878833e-05;3.2313225801772e-06;3.0713270007254e-06;9.9647928436752e-05;0.00013630115427077;0.0002326478715986;-5.8119180721405e-06;0.0004034289449919;0.0013531794538721;-0.00012661126675084;-0.00012486097693909;-0.00079249689588323;-0.00072117289528251;-0.00023115983640309;-0.0001123106922023;-8.2467966421973e-05;-0.00032049065339379;1.2518701623776e-05;-4.2216430529152e-07;-1.3736571418121e-05;-4.9558108003112e-05;-1.1969770639553e-05;-6.4848518377403e-06;0.00014055715291761;-4.0876770071918e-05;-3.9017973904265e-05;-0.00055117532610893;-0.00015633912698831;-0.00033574076951481;0.00039171247044578;-0.00069325842196122;1.0865514013858e-05;-0.00019141256052535;5.4265863582259e-05;-0.00068481633206829;-0.00019755568064284;0.00078160018892959;-5.6322471209569e-05;0.00023119639081415;0.00027870124904439;-0.0001529054279672;0.00017626566113904;-2.5394563635928e-05;-0.00024556761491112;-9.3657414254267e-05;0.0004157344228588;0.00016246203449555;0.0007699461420998;-3.7044508644613e-05;0.00036617397563532;2.4067816411844e-05;-0.00028400920564309;3.5026328987442e-05;-5.8391360653332e-05;-0.00013692417996936;3.4090349799953e-05;0.00036574742989615;-0.000619437021669;5.4318366892403e-05;-0.0018042055889964;-1.7589594790479e-05;0.00038884935202077;0.00014882656978443;0.00025787300546654;9.5849820354488e-05;-0.00029868632555008;-5.6509812566219e-05;-0.00092984066577628;-0.00012969342060387;-0.0010399038437754;0.00049789104377851;0.00059265620075166;0.00025727358297445;-0.00063035602215677;0.0017208894714713;-0.00031747319735587;-0.0001904736564029;-7.3170795076294e-06;0.0015288628637791;-6.8273169745225e-05;-0.0002149841748178;2.7255168788543e-06;0.00053917919285595;3.557768650353e-05;-9.6121266324189e-06;3.9473346987506e-05;-7.7427670476027e-05;-0.0006198612973094;-0.00018573607667349;-9.4104987510946e-05;0.0022350545041263;0.000350156245986;-0.00048573259846307;-0.00014508215826936;0.00014722016931046;-4.7354613343487e-05;-1.8037120753434e-05;-0.00016069484991021;-0.0010514270979911;-6.6571941715665e-05;7.5625102908816e-05;-0.001058962661773;-6.553180719493e-05;0.0002882854314521;0.0010731791844591;-0.0010229836916551;0.00030146661447361;-7.5717420259025e-05;0.0001356708817184;0.00015937248826958;2.2772563170292e-05;-0.00018142022599932;5.0833397835959e-05;0.00045157055137679;-1.5925528714433e-05;-9.8651844382402e-06;0.00021667940018233;-5.3995187045075e-05;0.00014049008314032;-0.0011736018350348;-0.00015734332555439;-0.00091210636310279;0.0003476629499346;-0.00059179373783991;2.666483487701e-05;-0.00022153359896038;9.3262584414333e-05;-0.00097259471658617;-0.0001703307061689;0.00065861432813108;-0.00014361349167302;0.00018640080816112;0.00052731903269887;-0.0002160463045584;0.00045608205255121;-0.00025827524950728;4.998747681384e-05;-0.00020444010442588;0.00056663545547053;0.00012699422950391;0.0015686108963564;-4.226030796417e-05;0.00044039165368304;3.7050331229693e-06;-0.00026577521930449;4.2088380723726e-05;-7.0505477197003e-05;-0.00016989480354823;7.1405258495361e-05;0.00044382378109731;-0.00044179914402775;8.8525725004729e-05;-0.0020981472916901;-0.00015377732052002;0.00063111796043813;0.00016029032121878;0.00033146471832879;9.319550008513e-05;-0.00019870634423569;1.3286024113768e-05;-0.0012265332043171;-0.00011642070603557;-0.0010647592134774;0.00064128544181585;0.00064657564507797;0.00015334304771386;-0.00077282317215577;0.0017862358363345;-0.0003385585732758;-0.00036102542071603;-5.6322856835322e-05;0.001706175156869;-6.2301609432325e-05;-0.00030497493571602;-1.4567044672731e-05;0.00064230419229716;5.2902010793332e-05;-3.561046833056e-05;2.9973176424392e-05;-9.2624730314128e-05;-0.00070407899329439;-0.00029277280555107;-6.279387162067e-05;0.0023691530805081;0.0003342401178088;-0.00041535418131389;-0.00017577587277628;0.00022253427596297;-3.1141902582021e-05;-0.00020374426094349;-0.00014770700363442;-0.0014006646815687;-5.7182514865417e-05;4.3948723032372e-05;-0.0012375492369756;-6.6554683144204e-05;0.00032985486905091;0.0012377868406475;-0.0010713541414589;0.00035517834476195;-9.5780429546721e-05;0.00010296912660124;0.0005494971992448;2.1941083105048e-05;-0.00019606397836469;4.1168568714056e-05;0.00059560628142208;-1.2328180673649e-05;-7.1888835009304e-06;0.00018944624753203;-4.125736450078e-05;0.00022846448700875;-0.0012110110837966;-8.9164997916669e-05;-0.0010041105560958;0.00016611223691143;-0.00026267670909874;2.819382098096e-05;-0.00015460088616237;8.75855985214e-05;-0.00079050048952922;-7.6462740253191e-05;0.00028461203328334;-0.0001614399952814;5.7977209507953e-05;0.00050234457012266;-0.00017174940148834;0.00050757615827024;-0.0003384267911315;0.00029005188844167;-0.00021114677656442;0.00045194654376246;4.2783496610355e-05;0.0015674747992307;-2.8733456929331e-05;0.00031266987207346;-1.4965399714129e-05;-0.00014147521869745;3.0195980798453e-05;-4.9455182306701e-05;-0.00012473481183406;7.0204077928793e-05;0.00031258221133612;-0.00012196211901028;7.8838995250408e-05;-0.0014392730081454;-0.00019612738105934;0.00056201813276857;0.00010084867244586;0.00025170846492983;5.0961378292413e-05;-2.4939299692051e-05;6.2113707826938e-05;-0.00097579351859167;-5.9452035202412e-05;-0.00064390373881906;0.00047493187594227;0.00042116237455048;1.1851954695885e-05;-0.00055155088193715;0.0010917034232989;-0.00021002170979045;-0.00034679431701079;-7.0420697738882e-05;0.0011375118046999;-3.0885690648574e-05;-0.00025632858159952;-2.1719468350057e-05;0.00046672942698933;4.3665531848092e-05;-4.0156963223126e-05;1.3635360119224e-05;-7.0295965997502e-05;-0.00046585767995566;-0.00029314777930267;-1.1700303730322e-05;0.0014679107116535;0.00017743704665918;-0.00017872688476928;-0.00012581095506903;0.00018238667689729;-5.0583330448717e-06;-0.0002885913127102;-7.2597402322572e-05;-0.0011055582435802;-2.8919765099999e-05;2.5756938271115e-07;-0.00085227336967364;-4.5373817556538e-05;0.00024116605345625;0.00083966803504154;-0.0006513285334222;0.0002447115839459;-5.2942479669582e-05;3.1241826945916e-05;0.00067500397562981;1.2316299944359e-05;-0.00011596141121117;1.5970990716596e-05;0.0004589295713231;5.1171550694562e-06;6.2632220760861e-06;8.1159210822079e-05;-0.00017300725448877;0.0016413948033005;-0.00022962152434047;0.00095396855613217;2.4622760975035e-05;4.0208014979726e-05;-3.0060820790823e-05;0.0001380241883453;-1.4546751572198e-06;0.00086263538105413;-8.2630242104642e-05;0.0001933952444233;-8.6964437286952e-06;0.00017637676501181;-3.3983655157499e-05;-0.00040617253398523;-0.00069080060347915;0.00019778985006269;-0.00037877020076849;0.00031790748471394;-0.00054769584676251;0.00015036828699522;-0.0020071575418115;3.6360790545586e-05;-0.00024662978830747;1.2886033800896e-05;-4.410694600665e-05;4.2310366552556e-05;-3.5164659493603e-05;1.6164531189133e-05;5.1422517572064e-05;-0.00013660220429301;0.00047378340968862;0.00020161014981568;-0.00099434237927198;4.6257457142929e-05;0.00041926596895792;-0.00018131991964765;0.0002081282727886;6.8487643147819e-05;0.00010340198059566;-1.0077897059091e-05;-0.00069228780921549;6.1939055740368e-05;6.941739411559e-05;-0.00024113476683851;0.00048852287000045;-0.00031492271227762;0.00027213239809498;0.00040937127778307;-0.0004716714611277;-0.00037789321504533;-8.667737711221e-05;0.00060200662119314;-3.170704076183e-05;-0.00022520759375766;-1.1827042726509e-05;0.00032354140421376;-4.6169475353963e-06;-6.7093911638949e-05;4.1895320464391e-05;8.4897446868126e-06;-5.4906391596887e-05;-2.7404605134507e-05;-0.00030831008916721;0.00078846450196579;8.0459140008315e-06;-3.6997080314904e-05;9.2303940618876e-05;0.00022625521523878;-5.8859481214313e-05;-0.00036629691021517;1.3468209544953e-05;-0.00089342298451811;-3.6678622564068e-05;3.4794855309883e-05;-0.00010680982813938;-0.0005799142527394;-6.4727528297226e-06;6.997737364145e-05;-0.00031909067183733;0.00057854171609506;-0.00019387794600334;0.00014179627760313;0.00075215240940452;1.3069761735096e-06;-7.481400098186e-05;-4.8238766794384e-06;0.00037394600803964;4.3349186853447e-06;2.2231783077586e-05;-4.576416472446e-07;8.6234511400107e-05;-0.00014985290181357;0.0012412106152624;-9.5516676083207e-05;0.00057878071675077;4.5025761210127e-05;0.00019557154155336;-0.00011877566430485;0.00012125290959375;1.6143849279615e-05;0.00088549876818433;-7.6184864155948e-05;2.6787862225319e-05;3.536646545399e-05;0.00010453766299179;-0.00013132100866642;-0.00023847902775742;-0.00049222429515794;0.00021030087373219;-8.7110835011117e-05;0.00011927932064282;-0.00052792637143284;8.6582229414489e-05;-0.0016022456111386;9.1248074340911e-07;-0.00027912447694689;1.5704861652921e-05;-2.4259445126518e-05;3.2056599593488e-05;-6.2054816226009e-05;2.672903247003e-05;7.7994183811825e-05;-0.00014589824422728;0.00013718286936637;0.00026634536334313;-0.0013554465258494;7.0885631430428e-05;0.00039334670873359;-0.00014043842384126;0.00024864156148396;8.8998807768803e-05;-0.00011330869892845;2.5278621251346e-05;-0.00060643086908385;2.9452392482199e-05;1.5541094398941e-05;-0.00047591791371815;0.00053119863150641;-0.00016123843670357;0.00036916005774401;0.00085133721586317;-0.00057463150005788;-0.00036478819674812;-0.00014592963270843;0.00093952636234462;-3.7358004192356e-05;-0.00017059140373021;-3.1427713111043e-05;0.00031734153162688;-3.4997233342438e-06;-5.2962321205996e-05;4.1273247916251e-05;3.0117957976472e-06;-5.8682813687483e-05;7.5147841016587e-06;-0.00039438554085791;0.0011422571260482;-8.7503522081533e-06;-0.00018112138786819;0.00018626033852343;0.00023491305182688;-6.3692408730276e-05;-0.00012623268412426;8.5161755123409e-06;-0.0008200315060094;-8.8070919446182e-05;8.5608235167456e-06;-0.00020312453852966;-0.00076504563912749;4.7102195821935e-05;0.00011963552242378;-0.00030519012943842;0.0007283961167559;-0.00023506155412178;0.00016199539822992;0.00033174801501445;4.0833288949216e-05;-0.00016063607472461;-5.031138243794e-06;0.0003879830474034;1.8018103219219e-05;4.7614616960345e-06;1.5089070757313e-06;-3.0587714718422e-05;4.5457141823135e-05;0.00014504723367281;-0.00022238846577238;0.00011419336806284;-3.7205350963632e-05;-0.00032418186310679;0.00031701155239716;8.2251892308705e-05;-6.465853221016e-05;7.2063598963723e-06;4.9062291509472e-05;0.00011969343177043;-0.00013113427849021;-3.5889443097403e-05;-0.00010509574349271;-7.9772486060392e-05;0.00030243568471633;-0.00018730435112957;-0.00071299076080322;0.00085894291987643;-0.00016802207392175;0.00011921817349503;3.5531316825654e-05;-8.2505168393254e-05;-1.1580491445784e-05;-1.4685366295453e-05;-5.5372031056322e-05;6.1052422097418e-05;2.7462116122479e-05;1.5807825548109e-05;-8.6605241449433e-06;3.3392527257092e-05;-0.00023550652258564;-0.00020885739650112;0.00016371889796574;0.00010752890375443;-3.7244288250804e-05;-0.00011635632108664;-8.7480664660688e-05;-9.6627249149606e-05;-7.0947739004623e-05;-8.2424812717363e-05;0.00011734170402633;0.00019051066192333;-0.00013191497419029;-0.00016838307783473;-0.0010142723331228;0.00014146686589811;4.0348473703489e-05;0.00056506658438593;0.00068822869798169;0.00018370774341747;0.00015943983453326;-0.00013911505811848;-0.00015025502943899;4.9395071982872e-05;7.8825323726051e-05;5.3858029787079e-06;-1.9581009837566e-05;1.3213079000707e-05;1.3344555554795e-05;-5.5816894928284e-06;-3.4851456121032e-07;-0.00021018728148192;-0.000262026587734;-0.00036493307561614;-0.00036103193997405;-0.00010244933946524;-0.00018349543097429;-4.8843823606148e-05;-6.2911909481045e-05;-5.0115493650082e-05;-3.4774075174937e-05;0.00012381214764901;0.00018550774257164;-1.8026968973572e-05;-0.00015743194671813;0.0006655547185801;5.4928284953348e-05;2.4553633920732e-05;0.00020494755881373;0.00031619475339539;6.3971398049034e-05;0.00010650499461917;8.7701329903211e-05;2.9103870474501e-05;4.1895971662598e-05;4.5931094064144e-05;-4.6066215872997e-05;-6.8940855271649e-05;1.7872520402307e-05;-5.8345362958789e-06;-5.0525311962701e-05;6.946152279852e-05;0.00012959398736712;-0.00023037425125949;0.00016728555783629;4.5618384319823e-05;-0.00062009744578972;0.00060000893427059;9.5926843641791e-05;-7.2890477895271e-05;1.1906516192539e-05;9.8878052085638e-05;0.00026107564917766;-0.00027400505496189;-5.3680832934333e-05;-0.00017008167924359;-0.00018580093455967;0.000467744510388;-0.00029254832770675;-0.00088915601372719;0.0011254255659878;-0.00020568513718899;0.00013035962183494;1.0276527063979e-05;-0.00014062292757444;-4.1829034671537e-06;-4.296926636016e-05;-0.00011375483882148;0.00012077579594916;4.4558011722984e-05;2.6502102628001e-05;-5.0360074965283e-05;2.0034492990817e-05;-0.00037460375460796;-0.00031194582697935;0.00026900402735919;0.00016081958892755;-8.8387831056025e-05;-0.0002749724953901;-0.0001380211324431;-0.00015653614536859;-0.00015855218225624;-0.00018004629237112;0.00020063221745659;0.00036291417200118;-0.00018680476932786;-0.00036459072725847;-0.0014684430789202;0.00026676830020733;9.0747249487322e-05;0.00084625603631139;0.001077544526197;0.00033364060800523;0.00029210431966931;-0.00021848340111319;-0.00026040838565677;8.3197628555354e-05;0.00013689033221453;3.4562832297524e-05;-1.4020391972736e-05;1.4195353287505e-05;2.1719963115174e-05;1.0235182344331e-05;1.4120621017355e-05;-8.068342867773e-05;-0.00024456501705572;-0.00044710942893289;-0.00041712628444657;-0.00018691495642997;-0.00035345400101505;-3.6453238863032e-05;-8.08527765912e-05;-3.3612577681197e-05;-3.6528770124278e-06;0.00019577467173804;0.00030386605067179;-3.1824216421228e-05;-5.8515102864476e-05;0.0011923059355468;2.4618135284982e-05;-1.6123505702126e-05;-2.5237755835406e-05;0.00024351991305593;-1.854099718912e-05;9.5399824203923e-05;5.0800052122213e-05;-5.8282912505092e-05;4.9524405767443e-05;5.8320631069364e-05;-6.9732581323478e-05;-0.00011171904043294;2.0146235328866e-05;-6.8783897404501e-06;-5.4293108405545e-05;6.2551691371482e-05;0.00011250068928348;-0.00019448091916274;0.00019309027993586;0.00010027514508693;-0.00063424330437556;0.00060140929417685;8.5079904238228e-05;-6.5205837017857e-05;1.8791713955579e-05;0.00010806588397827;0.00027552017127164;-0.00027631319244392;-4.619002356776e-05;-0.00018462543084752;-0.00024398828099947;0.00045295836753212;-0.0002833888574969;-0.00080291164340451;0.0010622937697917;-0.00018528834334575;0.00011638664727798;-2.3281654648599e-05;-0.00016163685359061;-2.9165973955969e-06;-4.8442714614794e-05;-0.00011739022738766;0.00012240569049027;4.3900461605517e-05;2.570028482296e-05;-5.6472865253454e-05;1.1346080100338e-05;-0.0003675211337395;-0.00029407744295895;0.00027641051565297;0.00014376293984242;-7.0524205511902e-05;-0.00031316350214183;-0.00013244373258203;-0.00015428855840582;-0.00015849637566134;-0.0001942552626133;0.0001818507007556;0.00038557837251574;-0.00017609875067137;-0.00037361370050348;-0.001399144413881;0.0002716027374845;8.8430613686796e-05;0.00079633266432211;0.0010607495205477;0.00033019387046807;0.0002966953907162;-0.00020908123406116;-0.00026276288554072;7.8081975516398e-05;0.00014006058336236;4.305468610255e-05;-1.1807420378318e-05;1.0405613465991e-05;2.3148859327193e-05;1.2742554645229e-05;1.9061957573285e-05;-7.8238572314149e-06;-0.00021992374968249;-0.00040812490624376;-0.00036497597466223;-0.00017512997146696;-0.00037247044383548;-2.1110628949828e-05;-8.0638383224141e-05;-2.6903788238997e-05;1.2656295439228e-05;0.00018424086738378;0.00030356252682395;-3.1118488550419e-05;-1.2051394151058e-05;0.0011905510909855;1.3357986972551e-05;-3.3794109185692e-05;-0.00013706195750274;0.00021583396301139;-5.1691342378035e-05;8.5865111032035e-05;3.9176677091746e-05;-8.9706511062104e-05;4.3994528823532e-05;5.4399773944169e-05;-6.3554223743267e-05;-0.00011291806731606;-1.287325812882e-05;-1.3781918823952e-05;0.00026432835147716;-3.3419528335799e-05;0.00032437496702187;-0.0016799824079499;-0.00010603333066683;-0.0014197516720742;0.00014033596380614;-0.00021568214287981;2.5307224859716e-05;-0.00016398479056079;0.000115480448585;-0.0010052851866931;-5.2850653446512e-05;0.00015422265278175;-0.0002308619878022;0.00012215712922625;0.00071125826798379;-0.00025816887500696;0.00070431153289974;-0.00047324583283626;0.00034027744550258;-0.00027482336736284;0.00051703373901546;2.4348468286917e-05;0.0023254675325006;-2.7384383429307e-05;0.00035350592224859;-3.6305358662503e-05;-0.0001179749815492;3.1715451768832e-05;-5.3389889217215e-05;-0.00018624089716468;0.00010574889165582;0.00036773717147298;0.00028593590832315;7.7746466558892e-05;-0.0017698848387226;-0.00026161959976889;0.0007165411952883;0.00013371216482483;0.00029607675969601;3.275847848272e-05;0.00012275064364076;8.2210746768396e-05;-0.0011640302836895;-1.2657815204875e-05;-0.00067496008705348;0.00067807850427926;0.0005302089266479;-0.00022363736934494;-0.00071848684456199;0.0011329281842336;-0.00023797249014024;-0.00052271818276495;-6.2538114434574e-05;0.0011445315321907;-3.2963162084343e-05;-0.00032846364774741;-1.899811286421e-05;0.00052988034440205;6.5524611272849e-05;-7.0974856498651e-05;-4.8378245992353e-05;-6.8116423790343e-05;-0.00059536605840549;-0.00023042511020321;1.1842636013171e-05;0.0017017109785229;0.00020596256945282;-0.00017487978038844;-0.00014433462638408;0.00026877140044235;1.4279052038546e-06;-0.00046009721700102;-8.9871929958463e-05;-0.0014305684017017;1.0283994924976e-05;-0.00010125194239663;-0.0010806829668581;4.6126355300657e-05;0.00017445576668251;0.0010462276404724;-0.00070351886097342;0.00031197996577248;-0.00013498445332516;2.6067094950122e-05;0.00098208361305296;3.7513914321607e-06;-0.00012283728574403;2.2159885702422e-05;0.00057791243307292;-1.2543786397146e-05;-9.1690317276516e-06;0.00025425478816032;-3.4636977943592e-05;0.00037096577580087;-0.001736419973895;-6.851465877844e-05;-0.0014638787833974;5.2606061217375e-05;-5.4183943575481e-05;2.6267422072124e-05;-0.00014222337631509;0.00011342376092216;-0.00092572037829086;-7.8539233072661e-06;-2.2663873096462e-05;-0.00024357798974961;4.6271255996544e-05;0.00068504578666762;-0.00023898159270175;0.00075088284211233;-0.00051101285498589;0.00049002392916009;-0.00027970064547844;0.00048734509618953;-1.9400195014896e-05;0.0023218465503305;-2.1007073883084e-05;0.00029912727768533;-4.4553748011822e-05;-6.2017745221965e-05;2.5391818780918e-05;-4.1686133045005e-05;-0.00016691612836439;9.8476593848318e-05;0.00030048817279749;0.00040041012107395;7.2665417974349e-05;-0.0014435581397265;-0.00027236840105616;0.00067010964266956;0.00010676341480576;0.00025341723812744;1.4400586223928e-05;0.00019270676421002;0.00010008563549491;-0.0010326901683584;1.488564612373e-05;-0.00049216696061194;0.00058222596999258;0.00042807255522348;-0.00027584758936428;-0.00060182990273461;0.00082707038382068;-0.00017688215302769;-0.00049479916924611;-6.6948938183486e-05;0.00087622279534116;-1.9723740479094e-05;-0.00030285349930637;-2.1303119865479e-05;0.00044618139509112;5.903347482672e-05;-7.1544272941537e-05;-4.2608739022398e-05;-6.5791187807918e-05;-0.00047552597243339;-0.00023991540365387;2.738989678619e-05;0.0013013405259699;0.00012958390288986;-6.7176013544668e-05;-0.00012368678289931;0.0002508235629648;1.176532896352e-05;-0.00050697260303423;-4.9975493311649e-05;-0.0013054885203019;2.4136526917573e-05;-7.367195939878e-05;-0.00087818986503407;2.1448808183777e-05;0.0001430624834029;0.00085167709039524;-0.00056697922991589;0.00025959988124669;-0.00010107034177054;-6.7965775087941e-06;0.001046251738444;1.8111826420864e-06;-9.1699126642197e-05;8.0664030974731e-06;0.00053110136650503;-2.5190116502927e-05;1.6001435142243e-05;6.6690292442217e-05;-0.00017292708798777;0.0018557941075414;-0.0003194191667717;0.0011924875434488;-1.6677096937201e-05;-0.00025776744587347;0.00014772344729863;0.0001262688456336;-8.0078298196895e-06;0.00063368683913723;-6.5551212173887e-05;0.0005878399242647;-9.9736222182401e-05;0.00020920461975038;-7.5286202445568e-06;-0.00050591002218425;-0.00078426639083773;0.00019857921870425;-0.00051956414245069;0.00044495932525024;-0.00044296029955149;0.00016519268683624;-0.0023296105209738;9.5384966698475e-05;-0.00011044079292333;-2.8578911042132e-06;-0.0001284509053221;5.7052257034229e-05;3.4111497370759e-05;-1.4720754734299e-05;-3.2225671020569e-05;-0.00014606441254728;0.001243713661097;5.1987171900691e-05;-0.0003203525848221;-2.104090708599e-05;0.00028002099134028;-0.00014681361790281;5.0392391131027e-06;5.1969789637951e-05;0.00043439213186502;-7.359263690887e-05;-0.00038924894761294;5.5401003919542e-05;0.0002245650975965;0.00018130600801669;0.00039734624442644;-0.00072917749639601;0.00012888877245132;-0.00036143200122751;-0.00027370694442652;-0.00021602818742394;1.6238722309936e-05;-0.00038014957681298;2.7008707547793e-05;-0.00019049896218348;8.6500349425478e-06;0.00014182024460752;1.2593367500813e-05;-9.3783826741856e-05;4.2137275158893e-05;4.7671124775661e-05;-0.00011644953337964;0.00038978672819212;-0.00018097316205967;0.00022052963322494;1.6063091607066e-05;0.00011908751912415;-2.640265665832e-05;0.00024607960949652;-2.5733737857081e-05;-0.00061201676726341;7.1725326051819e-06;-0.00080325396265835;2.1682184524252e-05;0.00015200035704765;4.3697331420844e-05;-0.00020920636598021;-0.0003584461810533;8.1234044046141e-05;-0.00039979178109206;0.0002855070924852;-0.00026880571385846;0.00011041839752579;0.0010183054255322;-2.7150441383128e-05;1.9363886167412e-05;-1.2597994100361e-05;0.00031989719718695;-6.0213492361072e-06;1.0847634257516e-05;-1.3435632126857e-06;-2.5015469873324e-05;3.6251123674447e-05;0.00018754262418952;-0.0003008279891219;0.00028168829157948;-0.00013958453200758;-0.00041588096064515;0.00040420336881652;0.00011156889377162;-8.253165287897e-05;5.1386748964433e-05;4.3758012907347e-05;0.00011162021110067;-0.00012111227988498;-4.7324025217677e-05;-0.00020445122208912;-0.00017245901108254;0.00040710959001444;-0.00022126013936941;-0.0010582774411887;0.001353218103759;-0.00024259694328066;0.00016714559751563;2.633248368511e-05;-0.00012255474575795;-3.4828557545552e-05;-8.2840833783848e-06;-6.8412897235248e-05;7.4072842835449e-05;3.4821681765607e-05;1.7468741134508e-05;3.5065757401753e-05;8.1637059338391e-05;-0.00014230435772333;-9.7151249065064e-05;0.00028807218768634;0.0001832646667026;-6.4000487327576e-05;-0.0001828349486459;-9.0151239419356e-05;-0.00010624058631947;-7.5033502071165e-05;-0.00010436970478622;0.00014092924539;0.00025733627262525;-0.00022752393851988;0.0001413721620338;-0.0011373276356608;0.00012582815543283;-1.5139917195484e-06;0.00037698252708651;0.00054008944425732;0.00014984920562711;0.00012633118603844;-0.00020908386795782;-0.00021448696497828;5.7882760302164e-05;0.0001078910427168;1.372282167722e-05;-2.6522518965066e-05;1.8538639778853e-05;1.9819226508844e-05;2.9592178179882e-05;3.9993356040213e-05;-0.00028088022372685;-0.00044884494855069;-0.00043617718620226;-0.00050143472617492;-0.00010369737719884;-0.00021164801728446;-7.4800103902817e-05;-0.00010870514233829;-1.5740450180601e-05;-1.0615040991979e-05;0.00015309637819882;0.00024775441852398;-3.530025787768e-05;-3.1925359508023e-05;0.0006799102993682;-3.6161625303066e-06;-5.5369557230733e-05;0.00027822458650917;0.00061261601513252;5.5221091315616e-05;0.00015569903189316;8.6502492194995e-05;3.3354674087605e-05;4.9658166972222e-05;6.4657549955882e-05;-8.2749036664609e-05;-0.00012313450861257;1.1876149073942e-05;-1.5860742905716e-06;-2.9382175853243e-05;3.157663741149e-05;0.00018746398563962;-0.00028505097725429;0.00030129193328321;-0.00011160693975398;-0.00042032581404783;0.00040231042657979;0.00010973556345562;-7.8819590271451e-05;5.8230332797393e-05;5.0573173211887e-05;0.00011596216791077;-0.00012028866331093;-4.3816406105179e-05;-0.00023129244800657;-0.0002127826155629;0.00040889336378314;-0.00021476019173861;-0.0010232949862257;0.0013485698727891;-0.00023948753369041;0.00016041338676587;7.3507185334165e-06;-0.00013877733726986;-3.6408739106264e-05;-1.1700592040143e-05;-6.9598667323589e-05;7.4731979111675e-05;3.5073739127256e-05;1.663477087277e-05;3.5511340684025e-05;7.8520766692236e-05;-0.00014381679648068;-8.4853505541105e-05;0.00029677344718948;0.00016996801423375;-5.6032389693428e-05;-0.00019674356735777;-8.9801891590469e-05;-0.00010407037188997;-7.3443188739475e-05;-0.0001103365138988;0.00013157248031348;0.00026849369169213;-0.00022482530039269;0.00014283596829046;-0.0011154371313751;0.00012379740655888;-1.5106782029761e-06;0.00035858419141732;0.00053387728985399;0.00015012738003861;0.00012442900333554;-0.0002064314467134;-0.0002144848840544;5.5738593800925e-05;0.00010998726065736;1.7101903722505e-05;-2.7239526389167e-05;1.6474685253343e-05;2.1317813661881e-05;2.8761429348378e-05;4.2300282075303e-05;-0.00024291145382449;-0.00046398869017139;-0.00041262214654125;-0.00050142651889473;-9.8309559689369e-05;-0.0002181396848755;-6.6021901147906e-05;-0.00011296373122605;-1.2418257938407e-05;-6.1483883655455e-06;0.00014608283527195;0.00025169248692691;-3.5376353480387e-05;-2.4920405849116e-05;0.00067516561830416;-2.3350594346994e-06;-6.1256127082743e-05;0.00021225333330221;0.00065244833240286;3.785319859162e-05;0.00016104444512166;8.1154008512385e-05;2.6274992706021e-05;4.6151239075698e-05;6.5268926846329e-05;-7.8768156527076e-05;-0.00012663725647144;-1.2425702152541e-05;-6.0713477978425e-06;0.00027303487877361;-3.0470353067358e-06;0.00041455854079686;-0.0018829727778211;-5.8016517868964e-05;-0.0016540407668799;-5.315471207723e-05;0.00012490816880018;1.7306840163656e-05;-0.00011249208910158;0.00010964251850965;-0.00084288802463561;5.4344840464182e-05;-0.00030011785565875;-0.00027163649792783;0.00010091874719365;0.00078324333298951;-0.00027333121397533;0.00080117711331695;-0.00057568692136556;0.00046817638212815;-0.00028463112539612;0.00038938139914535;-5.5774376960471e-05;0.0026959730312228;-6.8365125116543e-06;0.00022420067398343;-6.4465726609342e-05;7.2264055006599e-07;8.4351213445188e-06;-1.2936511666339e-05;-0.00018984188500326;8.4363709902391e-05;0.00022800578153692;0.0010232382919639;2.514783773222e-05;-0.0011863149702549;-0.00026738157612272;0.00062175351195037;0.00010764146281872;0.00018119926971849;-3.8911453884793e-05;0.00042075841338374;9.7103984444402e-05;-0.00089182337978855;0.00011494106729515;-0.00021851620113011;0.000644265266601;0.00037002225872129;-0.00060128379845992;-0.00056850764667615;0.00033443153370172;-0.0001173959026346;-0.00052520429017022;-1.6288431652356e-05;0.00033930773497559;-7.382717285509e-06;-0.00029762138728984;-6.2550875554734e-06;0.00034505003714003;6.8351750087459e-05;-9.8068740044255e-05;-0.00012529369269032;-4.0306804294232e-05;-0.00044412206625566;3.8899968785699e-05;5.26875955984e-05;0.0009876525728032;8.1845624663401e-05;2.5692528652144e-05;-9.8013872047886e-05;0.00029751798138022;1.8039336282527e-05;-0.0006709037697874;-3.3286811230937e-05;-0.0013061861973256;0.0001090997538995;-0.00012705319386441;-0.00077759468695149;0.00012239412171766;-9.2973838036414e-05;0.00075839890632778;-0.00048057304229587;0.00025075385929085;-0.00019166758283973;-2.6883944883593e-05;0.0012397351674736;-1.2332998267084e-05;-4.3135205487488e-05;7.3467654146953e-06;0.00050998048391193;-1.5051031368785e-05;3.4454380966054e-06;0.00028131352155469;-9.7332140285289e-06;0.00046581536298618;-0.0020470467861742;-2.7888660042663e-05;-0.0017498090164736;-0.00012362474808469;0.00025721694692038;1.76790090336e-05;-0.00011335060844431;0.00011139327398269;-0.00080511585110798;9.1507106844801e-05;-0.00045380266965367;-0.00029830227140337;4.2625921196304e-05;0.00077967956895009;-0.00027535742265172;0.00089247478172183;-0.00062158610671759;0.00062101567164063;-0.00029848684789613;0.00040098192403093;-9.3456335889641e-05;0.0028113378211856;-1.0005952617576e-06;0.00019147629791405;-7.2814647865016e-05;3.846395702567e-05;3.9608201518604e-07;2.6678387712309e-06;-0.00019132468150929;6.7506196501199e-05;0.00017494881467428;0.0011564312735572;1.7341784769087e-05;-0.00095976679585874;-0.00026727924705483;0.00058479252038524;9.7212774562649e-05;0.00013690412743017;-5.6680550187593e-05;0.00049381196731701;0.00010216246300843;-0.00080006115604192;0.00015277533384506;-9.9421988124959e-05;0.0005831949529238;0.00031802905141376;-0.00067855115048587;-0.00049093388952315;0.00012570177204907;-7.4238414526917e-05;-0.00048766168765724;-9.3060680228518e-06;0.00010266880417475;-5.2561307484211e-07;-0.00028518357430585;-3.5713244415092e-06;0.00028796045808122;6.3918181695044e-05;-0.00010144294355996;-0.00012066586350556;-4.9361253331881e-05;-0.00036699487827718;5.1692641136469e-05;5.6341687013628e-05;0.00074846559436992;2.7231621061219e-05;0.0001011996428133;-8.6636275227647e-05;0.00029567678575404;2.3319775209529e-05;-0.00076023541623726;-1.727786752781e-06;-0.0012806889135391;0.00013506774848793;-6.1174643633422e-05;-0.00063160323770717;8.1503596447874e-05;-0.00013496626343112;0.00063519971445203;-0.00046995340380818;0.00022265054576565;-0.00015857523248997;-4.9390921049053e-05;0.0013570844894275;-1.3127587408235e-05;-2.0011908418383e-05;-3.7743589018646e-06;0.0005109787452966;-9.5340801635757e-05;3.8327663787641e-05;8.3184066170361e-05;-0.0001366615324514;0.0017790516139939;-0.00031004621996544;0.0010941656073555;-6.4777319494169e-05;-0.00045545614557341;0.00025742634898052;0.0002011325705098;-1.998803600145e-05;0.00015681743388996;-2.9295042622834e-05;0.00075685192132369;-0.00014305033255368;0.00020231906091794;8.4488041466102e-05;-0.00039022919372655;-0.00076027191244066;0.00013875534932595;-0.00066303956555203;0.00041887341649272;-0.00037854863330722;0.00014064558490645;-0.0019831699319184;0.00012075629638275;3.1915977160679e-05;-1.619967406441e-05;-0.00010587173892418;4.7235200327123e-05;0.00013828030205332;-5.7824876421364e-05;-0.00024712202139199;-0.00012652276200242;0.0013833611737937;-0.00010915247548837;0.00045949482591823;-7.2252390964422e-05;9.9562357718241e-06;-1.8933573301183e-05;-0.00032644427847117;4.1995877836598e-05;0.00054261257173494;-0.00010561424278421;3.045493758691e-05;-9.0518705064824e-07;0.00034768762998283;0.00044509561848827;0.00011740475747501;-0.00084847648395225;-2.7483254598337e-05;-0.00081845751265064;1.6148793292814e-05;0.0003839400887955;9.611455607228e-05;-0.0012592781567946;8.7478088971693e-05;-7.7367600169964e-05;1.3970648069517e-05;-5.2732175390702e-05;3.4570883144625e-05;-7.1213413320947e-05;1.6946800315054e-05;-9.4017232186161e-06;-0.00011392563465051;0.00063998583937064;1.6655409126543e-05;-0.00031222932739183;-1.7608364942134e-05;0.00022016397269908;-0.00013710347411688;0.00014802975056227;1.2532405889942e-05;-0.00087590533075854;-5.5171381063701e-06;-0.00060621125157923;8.8424734713044e-05;0.00025961696519516;0.00035095011116937;0.00028615139308386;-0.00060389138525352;-4.1735263948794e-05;-0.00060981209389865;-9.4805960543454e-05;-7.4660703830887e-05;4.6741261030547e-05;0.0011771649587899;-4.4378295569913e-05;0.00012549440725707;-1.2531717402453e-05;0.00026384217198938;-2.1769141312689e-05;-9.0547218860593e-05;4.1835803131107e-05;0.00011686906509567;-0.0001847060630098;0.0023054229095578;-0.0004212218336761;0.0014901778195053;-6.4047853811644e-05;-0.00056164734996855;0.00032881580409594;0.00022160775552038;-2.1244542949717e-05;0.00047173941857181;-4.9300535465591e-05;0.0010140074882656;-0.00019301484280732;0.00022119504865259;-2.5003128030221e-05;-0.0006093890988268;-0.00092573574511334;0.00024577567819506;-0.00069255719427019;0.00058551097754389;-0.00054425623966381;0.00018428612384014;-0.0028469157405198;0.00015908997738734;-1.429222720617e-05;-1.6977241102722e-05;-0.00019795626576524;7.2479226219002e-05;0.00014167703920975;-6.1632643337362e-05;-0.00023212276573759;-0.0001806290820241;0.0020161310676485;-8.3551276475191e-05;0.00031780888093635;-9.9814045825042e-05;8.1183585280087e-05;-6.5410706156399e-05;-0.00030858087120578;6.1791630287189e-05;0.00069620087742805;-0.00013703838340007;-4.2319711610617e-06;1.8046783225145e-05;0.00043971394188702;0.0005707535892725;0.0003354697546456;-0.0011957335518673;1.1972247193626e-05;-0.0010580051457509;-0.000115353592264;0.00023671887174714;9.9797609436791e-05;-0.0014831074513495;0.00010918253974523;-0.00013051099085715;1.8244592865813e-05;-3.8252605008893e-05;3.9282054785872e-05;-0.000130813481519;4.3440722947707e-05;8.5530999058392e-05;-0.00019841718312819;0.0011725911172107;-0.00010253414802719;-0.00015871203504503;-1.9540699213394e-05;0.00022481681662612;-0.0001243725855602;0.00031730812042952;3.1605875392415e-06;-0.00093782145995647;-1.2327721378824e-05;-0.00080841203453019;7.9007586464286e-05;0.0003431114309933;0.00036060731508769;0.00019383754988667;-0.00091906089801341;5.7346220273757e-05;-0.00084759236779064;4.7628967877245e-05;-0.00042383818072267;0.00011112444917671;0.00126785680186;-3.1900966860121e-05;8.8233755377587e-05;-1.8571996406536e-05;0.0003552021807991;-1.6888832760742e-05;-6.4750864112284e-05;2.7189698812435e-05;5.4581083531957e-05;-0.00011962023563683;0.0014932675985619;-0.00026186543982476;0.00097605603514239;-3.4831722587114e-05;-0.00034039432648569;0.00019610376330093;0.0001533583708806;-1.5138517483138e-05;0.00018919273861684;-3.0179320674506e-05;0.00060867361025885;-0.0001137412400567;0.00016689149197191;2.7594256607699e-05;-0.00039296280010603;-0.00061857386026531;0.00012785418948624;-0.0004879184125457;0.00037233502371237;-0.00029723421903327;0.00012349322787486;-0.0017869777511805;9.0629131591413e-05;8.9154800662072e-06;-1.1727754099411e-05;-8.3928352978546e-05;4.370902388473e-05;9.5184426754713e-05;-3.9220682083396e-05;-0.00017512156045996;-0.00010785031190608;0.0012057998683304;-5.6641751143616e-05;0.00023668067296967;-5.7022680266527e-05;7.986602577148e-05;-5.2244678954594e-05;-0.00020652249804698;3.4569358831504e-05;0.00046286065480672;-8.9107743406203e-05;-0.00010129537258763;1.7539468899486e-05;0.00027341095847078;0.00035400039632805;0.00018446081958245;-0.00071462197229266;-1.9286464976176e-06;-0.00066152954241261;-5.6287768529728e-05;0.00020758819300681;6.8141540396027e-05;-0.00090935348998755;6.3155763200484e-05;-9.8151554993819e-05;1.4762717000849e-05;4.6477766773023e-06;2.4231560018961e-05;-6.3549901824445e-05;2.0795307136723e-05;8.7519374574185e-06;-0.00010912751895376;0.00055147323291749;-3.9508038753411e-05;-0.00016972543380689;-7.9680294220452e-06;0.00017157499678433;-9.0684363385662e-05;0.00014263253251556;4.4248126869206e-06;-0.00070447084726766;-3.8516418499057e-06;-0.00056119036162272;5.7639597798698e-05;0.00020103325368837;0.00020852072339039;0.00013096540351398;-0.00049226329429075;1.7598946215003e-05;-0.00047192798228934;1.3396573194768e-05;-0.00012218723713886;5.6355460401392e-05;0.00099554960615933;-3.1177201890387e-05;9.39208039199e-05;-1.1688092854456e-05;0.00021668936824426;-1.2002576113446e-05;4.4164589780848e-06;2.0170673451503e-06;1.8974769773195e-05;-1.1154978892591e-05;0.00021086196647957;-0.00033076779800467;0.00034972271532752;-0.00027168658562005;-0.00026022506062873;0.00025776741676964;0.00010399727761978;-7.3379487730563e-05;7.0516885898542e-05;5.7724178077478e-06;4.357169927971e-06;-1.2577035704453e-05;-3.8552043406526e-05;-0.00021224486408755;-0.00015263487875927;0.00027539764414541;-9.984814823838e-05;-0.0010964677203447;0.0014177454868332;-0.00023943807173055;0.00017072691116482;3.6617759178625e-05;-9.719975059852e-05;-4.9154692533193e-05;1.2735446944134e-05;-3.2370586268371e-05;3.6074321542401e-05;2.7794874768006e-05;1.1741098205675e-05;7.6084594184067e-05;0.00010474456212251;2.4158540327335e-05;6.5625950810499e-05;0.00029108367743902;0.00020497853984125;-5.4039508540882e-05;-0.00011705466022249;-4.4587952288566e-05;-5.8192727010464e-05;-2.1062860469101e-05;-5.0257844122825e-05;9.1325069661252e-05;0.00016713656077627;-0.00025600352091715;0.00047870451817289;-0.00077678164234385;6.8456545704976e-05;-2.2299736883724e-05;-2.5223620468751e-05;6.3194653193932e-05;1.3255746125651e-05;2.9137791557332e-07;-0.00018241039651912;-0.0001680247951299;3.3154912671307e-05;7.7227516158018e-05;4.6111854317132e-06;-2.7630600015982e-05;1.8560231183073e-05;1.5465169781237e-05;6.2724022427574e-05;7.1611335442867e-05;-0.00033783572143875;-0.00050793396076187;-0.00036216381704435;-0.0004902117070742;-4.7503133828286e-05;-0.00010455806477694;-9.252686140826e-05;-0.00011720709153451;5.7361371545994e-06;-1.1635421287792e-05;0.00010987588757416;0.00018609155085869;-2.9897812055424e-05;0.00023360933118965;0.00032218400156125;-0.00011104911391158;-0.00015652185538784;0.00033027332392521;0.00068421789910644;7.687381003052e-05;0.00016952221631072;8.9902772742789e-05;8.602395246271e-05;4.3598516640486e-05;6.2141138187144e-05;-8.2304613897577e-05;-0.00011706214718288;4.9655436669127e-06;1.9373378563614e-06;1.5057978089317e-05;-1.4671009012091e-05;0.00021669807028957;-0.00031888077501208;0.0003628162376117;-0.00025438313605264;-0.00026131368940696;0.00025524367811158;0.00010469230619492;-7.0447931648232e-05;7.639970863238e-05;1.1613738934102e-05;6.1291225392779e-06;-1.1139129128424e-05;-3.6682504287455e-05;-0.00024078247952275;-0.00018105347407982;0.00028064468642697;-9.3839131295681e-05;-0.0010759040014818;0.0014242586912587;-0.00024155728169717;0.0001647724857321;2.3363751097349e-05;-0.00011019115481758;-5.1095441449434e-05;1.0067860785057e-05;-3.287546132924e-05;3.6155401176075e-05;2.8164926334284e-05;1.1027900654881e-05;7.8541655966546e-05;0.00010213760106126;1.8951915990328e-05;7.5436379120219e-05;0.00029648808413185;0.0001955728221219;-5.0127575377701e-05;-0.00012227357365191;-4.6079341700533e-05;-5.5735050409567e-05;-1.9945222447859e-05;-5.2974311984144e-05;8.6117332102731e-05;0.00017303925415035;-0.00025499987532385;0.0004806283977814;-0.00076804857235402;6.294391641859e-05;-1.8960156012326e-05;-2.8697209927486e-05;5.6866068916861e-05;1.5511703168158e-05;-3.3344326766382e-06;-0.00018078280845657;-0.00016747727931943;3.2366722734878e-05;7.8231234510895e-05;6.1116097640479e-06;-2.870213938877e-05;1.7109838154283e-05;1.6746782421251e-05;6.1504921177402e-05;7.2259179432876e-05;-0.00031173098250292;-0.00052954349666834;-0.00034265729482286;-0.00050402781926095;-4.5252603740664e-05;-0.00010632658813847;-8.6505053332075e-05;-0.00012133130076109;7.6619608080364e-06;-1.092546426662e-05;0.00010442917846376;0.00019041117047891;-2.9974762583151e-05;0.0002304690569872;0.00031789546483196;-0.0001079844951164;-0.0001576160575496;0.00028024287894368;0.00073480053106323;6.5839325543493e-05;0.00017693423433229;8.6096777522471e-05;8.6199710494839e-05;4.0925722714746e-05;6.3613180827815e-05;-7.8865217801649e-05;-0.00012039881403325;-1.449219234928e-05;8.9175746325054e-06;0.00023165757011157;1.3457776731229e-05;0.00038710213266313;-0.0016905629308894;-2.2202259060577e-05;-0.0015146656660363;-0.00017588117043488;0.00033386988798156;7.6642818385153e-06;-7.7373384556267e-05;7.9517609265167e-05;-0.00055939517915249;0.00011852859461214;-0.00057255534920841;-0.0002386646810919;0.00011800999345724;0.00070270762080327;-0.00025439457385801;0.00070363929262385;-0.00053134735208005;0.00040717891533859;-0.00022994949540589;0.00024341575044673;-9.3748247309122e-05;0.0025152708403766;1.0614748134685e-05;9.4779046776239e-05;-7.1643451519776e-05;7.0544301706832e-05;-1.7253865735256e-05;3.1343628506875e-05;-0.00017100259719882;1.7269976524403e-05;9.574484283803e-05;0.0014276544097811;-2.9126040317351e-05;-0.00059015903389081;-0.00020040188974235;0.00041422940557823;8.5843385022599e-05;3.1434436095878e-05;-8.6679821833968e-05;0.00054807972628623;7.3438786785118e-05;-0.00049034476978704;0.00021335117344279;0.00014143572479952;0.0005412389873527;0.00020374824816827;-0.000808882759884;-0.00038775088614784;-0.0002853890764527;-2.2808782887296e-05;-0.00035445872345008;3.779692997341e-05;-0.00036684260703623;6.507522357424e-06;-0.00020869499712717;1.0893846592808e-05;0.00013978483912069;5.9665482694982e-05;-0.00010390982788522;-0.00017888117872644;-1.62167216331e-05;-0.0002924844447989;0.00038505956763402;5.9357229474699e-05;0.00039859497337602;-3.0889677873347e-06;0.000132965069497;-4.7395820729434e-05;0.00028763303998858;1.961335328815e-05;-0.00072661985177547;3.7377824355644e-06;-0.0010172502370551;0.0001953814207809;-8.2966638728976e-05;-0.00043655693298206;0.00016366843192372;-0.0003603445366025;0.00045691200648434;-0.0003644990210887;0.00018212225404568;-0.00023435887123924;-4.5197764848126e-05;0.0011785625247285;-2.3193972083391e-05;1.0166808351642e-05;-2.6691523657973e-07;0.00039979178109206;-3.0021745260456e-05;4.5474920625566e-05;0.00027942072483711;-1.5845718735363e-05;0.00051522307330742;-0.0022459872998297;2.2821706807008e-05;-0.0018704269314185;-0.00030184732167982;0.00057114235823974;1.4407173694053e-05;-0.00013689484330826;8.9030872914009e-05;-0.00054378132335842;0.00018714781617746;-0.0008664844208397;-0.0003088983357884;4.9892460083356e-05;0.00078144564758986;-0.00030051619978622;0.00095809355843812;-0.00067120068706572;0.00071949925040826;-0.00028300765552558;0.00035504123661667;-0.0001601648691576;0.0030442026909441;2.1290086806403e-05;6.2443039496429e-05;-9.1103778686374e-05;0.00010960437793983;-4.4152468035463e-05;8.4500039520208e-05;-0.00020604967721738;-6.7627392127179e-05;1.3780074368697e-05;0.0018174176802859;-5.9195019275649e-05;-0.00025790839572437;-0.00018340734823141;0.0003516097785905;9.6937859780155e-05;-9.3235401436687e-05;-0.00013038642646279;0.00072394125163555;6.3681138271932e-05;-0.00037707088631578;0.00032903286046349;0.00033250433625653;0.00050326285418123;0.00015894339594524;-0.0010490659624338;-0.00030639610486105;-0.00063877826323733;3.5931167076342e-05;-0.00020079486421309;7.8331555414479e-05;-0.00087925122352317;1.1451730642875e-05;-0.00020705202769022;2.6599862394505e-05;7.2445953264832e-05;5.6233628129121e-05;-0.00012152888666606;-0.00019418010197114;-4.883110159426e-05;-0.00021536531858146;0.00057870126329362;4.8148609494092e-05;0.00015035647084005;-8.220155723393e-05;0.00024380287504755;-3.5506833228283e-05;0.00032362269121222;2.1704092432628e-05;-0.0010340014705434;5.5019863793859e-05;-0.0011473161866888;0.00029867354896851;0.00012495802366175;-0.00021972801187076;7.4530755227897e-05;-0.000552432553377;0.00032448724959977;-0.00059529393911362;0.00017161187133752;-0.00020075793145224;-7.4196424975526e-05;0.0015529305674136;-2.6394052838441e-05;5.8710593293654e-05;-1.698133564787e-05;0.00048122354201041;-2.9749626264675e-05;5.8836125390371e-05;0.00020022429816891;-2.5734068913152e-05;0.00039549192297272;-0.0017603019950911;5.2423234592425e-05;-0.0013688404578716;-0.0002796117332764;0.00052911567036062;1.2575878827192e-05;-0.00012779342068825;5.8301469834987e-05;-0.00026111086481251;0.00016486119420733;-0.00074862240580842;-0.00024628388928249;-4.5317221520236e-05;0.00050433434080333;-0.00019914671429433;0.00077346514444798;-0.00049265433335677;0.0006862441659905;-0.00020520851830952;0.00027530087390915;-0.00014697501319461;0.0021853030193597;2.2399144654628e-05;-2.8759613996954e-06;-6.8506371462718e-05;8.9856104750652e-05;-5.0730297516566e-05;9.887417400023e-05;-0.0001494642929174;-0.00011569927301025;-7.7917706221342e-05;0.0014218512224033;-6.6035354393534e-05;0.00018550525419414;-7.811749674147e-05;0.00012926576891914;6.5100561187137e-05;-0.00017100747209042;-0.00011783665104304;0.00059344270266593;2.0378252884257e-05;-0.00011001689563273;0.00029547978192568;0.00037494616117328;0.00024555152049288;4.8789865104482e-05;-0.00082995684351772;-8.9913970441557e-05;-0.0007124794065021;7.8504876000807e-05;2.0013116227346e-05;8.9943976490758e-05;-0.0010012943530455;1.1339402590238e-05;-0.00011808543058578;3.2462266972288e-05;-2.2893449568073e-05;2.75616239378e-05;-8.2145154010504e-05;-0.00012473975948524;-6.5275307861157e-05;-4.0510683902539e-05;0.00045243286876939;2.3381673599943e-05;-0.00017002032836899;-0.00012071977835149;0.00024622594355606;-5.9421786318126e-06;0.00020464500994422;1.6918898836593e-05;-0.00089092465350404;7.8113975177985e-05;-0.0007741007138975;0.00026138508110307;0.00023738978779875;6.9419147621375e-05;-3.3250467822654e-05;-0.00046934117563069;5.2031966333743e-05;-0.00049729342572391;8.068455645116e-05;-5.3585681598634e-05;-7.3241339123342e-05;0.0012649772688746;-1.9544844690245e-05;8.974003867479e-05;-2.4308308638865e-05;0.00034003597102128;-0.00016235398652498;6.9164590968285e-05;0.00020205788314342;-0.00013461981143337;0.002084236824885;-0.00036732136504725;0.0012058452703059;-9.8555101430975e-05;-0.00060477649094537;0.00035026224213652;0.00034932218841277;-3.7968631659169e-05;0.00017997976101469;-1.9263483409304e-05;0.00097958731930703;-0.00019075119053014;0.00013788000796922;-3.5398177260504e-06;-0.00042132750968449;-0.00078703148756176;0.00021609793475363;-0.00071892526466399;0.00049278372898698;-0.0006752546178177;0.0001443639775971;-0.0022692934144288;0.00015863863518462;3.9111469959607e-05;-1.8509817891754e-05;-0.00015303304826375;5.319314004737e-05;0.00022760208230466;-9.742036490934e-05;-0.00045878341188654;-0.00015270926814992;0.0016621021786705;-0.00015038590936456;0.00074582395609468;-0.00011563005682547;-0.0001694059028523;6.9179965066724e-05;-0.00059986382257193;7.0310314185917e-05;0.00053046416724101;-0.00012669769057538;0.00037274131318554;-4.6917626605136e-05;0.00049871217925102;0.00061285210540518;0.00010203486453975;-0.0010778367286548;-8.4450373833533e-05;-0.0010696017416194;5.5721691751387e-05;0.00093055289471522;0.00011092874774477;-0.0018857632530853;0.0001403527421644;7.3269279710075e-06;6.2716489992454e-06;-0.00016026724188123;5.2755545766558e-05;-0.00010368185030529;1.9218925444875e-05;5.1667884690687e-05;-0.00018821354024112;0.0015654703602195;-3.5318894333614e-06;-0.00031621719244868;-8.294503641082e-05;0.00019319665443618;-0.00015290509327315;0.00023865494586062;2.7018420951208e-05;-0.00097214459674433;-3.4262197004864e-05;-0.00055342941777781;0.00010438182653161;0.00043256839853711;0.0006735801580362;0.00053808983648196;-0.0011697299778461;-5.8008376072394e-05;-0.0012006519827992;-0.00017338190809824;-0.00032987858867273;8.1126512668561e-05;0.0010231316555291;-7.8021566878306e-06;0.00012360184337012;-1.4178883247951e-05;0.00031251899781637;-2.3263808543561e-05;-0.00016929928096943;7.6472475484479e-05;0.00023076427169144;-0.00014408509014174;0.0022609599400312;-0.00041695017716847;0.0013883899664506;-9.0277368144598e-05;-0.00066999287810177;0.00039863502024673;0.00038027274422348;-4.2874540667981e-05;0.00030342291574925;-1.9586839698604e-05;0.0011345470556989;-0.00022297036775853;0.00010381118772784;-0.00013487997057382;-0.00056260731071234;-0.00077743263682351;0.00028666984871961;-0.00063526700250804;0.00058634416200221;-0.00077256135409698;0.00015481445007026;-0.0026887853164226;0.00017278020095546;2.8441014364944e-05;-2.0041326934006e-05;-0.00020438301726244;6.5669213654473e-05;0.00024479985586368;-0.00010546581324888;-0.00049245520494878;-0.00017360229685437;0.0020381463691592;-0.0001436799793737;0.0007353670662269;-0.00014434098557103;-0.00016259432595689;5.7524684962118e-05;-0.00064623827347532;8.0774378147908e-05;0.00060519867110997;-0.00014766241656616;0.00041216745739803;-4.0851911762729e-05;0.00056131830206141;0.00072260369779542;0.00022415765852202;-0.0012800631811842;-8.7303640611935e-05;-0.0012745548738167;-2.2831125079392e-06;0.00097037985688075;0.00011522787099238;-0.0021192352287471;0.00016111014701892;1.1640586308204e-06;1.0074193596665e-05;-0.00017616039258428;5.6477456382709e-05;-0.00014396174810827;3.5877077607438e-05;0.00014028022997081;-0.00025879466556944;0.0021710251457989;-8.8880537077785e-05;-0.00023539981339127;-0.00010630465840222;0.00017986248712987;-0.00014033052138984;0.00035606289748102;2.5248255042243e-05;-0.0009642566437833;-5.0205821025884e-05;-0.00059709278866649;9.5280345703941e-05;0.00051006022840738;0.0007274987292476;0.00054540892597288;-0.0015010350616649;2.1646195818903e-05;-0.0014723384520039;-9.9844874057453e-05;-0.00064698088681325;0.0001280655269511;0.00095085508655757;1.8460166756995e-05;0.00010122173262062;-1.6734122255002e-05;0.00033166937646456;-1.6361858797609e-05;-2.3409893401549e-06;4.7391963562404e-06;8.8753025920596e-05;-7.9872494097799e-05;0.00021300288790371;-0.00032372126588598;0.00036792331957258;-0.00034296038211323;-0.00013932558067609;0.00014481766265817;7.3746567068156e-05;-4.5156943087932e-05;7.5871685112361e-05;-2.0677431166405e-05;-6.5229163737968e-05;5.8763314882526e-05;-2.5143737730104e-05;-0.00018927677592728;-0.00012622479698621;4.6452405513264e-05;9.0260538854636e-05;-0.00099237821996212;0.0013002994237468;-0.00020333324209787;0.0001457170874346;3.6273828300182e-05;-6.4697473135311e-05;-4.8194411647273e-05;2.0982964997529e-05;-6.9628176788683e-06;7.8918055805843e-06;2.3336133381235e-05;9.4854121925891e-06;6.5197040385101e-05;8.1695878179744e-05;9.9973040050827e-05;0.00015577615704387;0.00026556177181192;0.00021478554117493;-5.0814884161809e-05;-7.4819603469223e-05;-1.2472794708174e-07;-1.1826019544969e-05;2.5180329430441e-06;-1.8680742869037e-05;4.3510426621651e-05;8.6594023741782e-05;-0.00026770331896842;0.00059723696904257;-0.00038740507443435;0.00011669894593069;4.9468431825517e-05;-0.00033142935717478;-0.00032600326812826;-7.1513881266583e-05;-8.1279096775688e-05;-0.00012356792285573;-0.00010950795694953;8.3132126746932e-06;4.4650205381913e-05;7.3146647991962e-06;-1.7440039300709e-05;1.5928326320136e-05;9.824719199969e-06;9.924696496455e-05;0.00010072171426145;-0.00027211333508603;-0.00043602893128991;-0.00022518607147504;-0.00038135700742714;-1.3097614100843e-05;-2.7899981432711e-05;-8.9677167125046e-05;-0.00010546865087235;3.0682418582728e-05;-4.2919482439174e-06;6.1933518736623e-05;0.0001157351580332;-2.3969496396603e-05;0.00070021324791014;9.8100419563707e-05;-0.00026592530775815;-0.00029228359926492;0.00015006976900622;0.00047657417599112;5.2497700380627e-05;0.00013874434807803;6.8064582592342e-05;0.00010291220678482;3.028909668501e-05;4.9436293920735e-05;-6.860386201879e-05;-9.5071707619354e-05;-2.0452100670809e-06;4.6647501221742e-06;8.616109698778e-05;-8.1835401942953e-05;0.0002207380020991;-0.00031365128234029;0.00037451984826475;-0.00033392250770703;-0.0001395643921569;0.00014304033538792;7.4903706263285e-05;-4.2993015085813e-05;8.0107303801924e-05;-1.6421143300249e-05;-6.378519901773e-05;6.0305475926725e-05;-2.4737273633946e-05;-0.00021212338469923;-0.00014182105951477;5.139691347722e-05;9.4750066637062e-05;-0.00098072516266257;0.0013061428908259;-0.00020692452380899;0.00014049097080715;2.7286803742754e-05;-7.3730734584387e-05;-4.9586564273341e-05;1.9232460545027e-05;-7.460991582775e-06;7.5872676461586e-06;2.3531167244073e-05;9.0598032329581e-06;6.8254244979471e-05;7.8990175097715e-05;9.5252507890109e-05;0.00016221622354351;0.00026661221636459;0.00021105246560182;-4.8888501623878e-05;-7.6781390816905e-05;-1.9354922642378e-06;-9.761670298758e-06;2.9085799724271e-06;-1.9757768313866e-05;4.1267510823673e-05;8.9118169853464e-05;-0.00026703788898885;0.00059853825950995;-0.00038396375020966;0.00010898464825004;5.5115677241702e-05;-0.00032682568416931;-0.00033398039522581;-6.9189933128655e-05;-8.4151251940057e-05;-0.00012227974366397;-0.00010933063458651;8.3910290413769e-06;4.4837724999525e-05;7.7316772149061e-06;-1.7977970856009e-05;1.4946998817322e-05;1.073772818927e-05;9.9140816018917e-05;9.9737924756482e-05;-0.0002564491587691;-0.0004519535577856;-0.00021156483853702;-0.00039469302282669;-1.260397311853e-05;-2.7816236979561e-05;-8.6495943833143e-05;-0.00010771286179079;3.14098506351e-05;-4.4231092033442e-06;5.830402369611e-05;0.00011902140977327;-2.3977951059351e-05;0.00069516024086624;9.5534676802345e-05;-0.00026520757819526;-0.00028967257821932;0.00011808073031716;0.00051415857160464;4.6969689719845e-05;0.00014352120342664;6.5696360252332e-05;0.00010454908624524;2.8753303922713e-05;5.0445501983631e-05;-6.6133892687503e-05;-9.7463438578416e-05;-5.9561192756519e-05;0.00012044126196997;0.00018820889818016;-8.020106179174e-05;0.00039422290865332;-0.0018559490563348;5.2223986131139e-05;-0.0014083540299907;-0.00032539363019168;0.00060904154088348;2.9486589482985e-05;-0.00024430942721665;3.1417122954736e-05;-6.8747205659747e-05;0.00018564522906672;-0.00085366261191666;-0.00019283781875856;5.4936579545029e-05;0.00053495023166761;-0.00024095483240671;0.00072541000554338;-0.00051400781376287;0.00063574797241017;-0.00019012371194549;0.00038001764914952;-0.00014316376473289;0.0022664919961244;2.979337114084e-05;-4.4336826249491e-05;-6.6069995227735e-05;4.9637699703453e-05;-9.1428417363204e-05;0.00017964640574064;-0.00014818475756329;-0.00033124827314168;-8.4334576968104e-05;0.0014588492922485;-9.1879621322732e-05;0.00039664172800258;-2.8801419830415e-05;2.7302581656841e-05;9.6573821792845e-05;-0.000394898961531;-0.00013556168414652;0.00055371248163283;-5.9877020248678e-06;4.1530238377163e-05;0.00039703075890429;0.00048212672118098;0.00023540617257822;-2.6178277039435e-05;-0.00088632543338463;-7.4040159233846e-05;-0.0008602756424807;7.5625925092027e-05;0.00053839816246182;0.00012130531104049;-0.0013731699436903;3.7612476262439e-06;-4.5562133891508e-05;4.7384444769705e-05;-7.7418291766662e-05;1.8426684619044e-05;-8.3055085269734e-05;-0.00018612101848703;-8.6537256720476e-05;-4.9632322770776e-05;0.0010836977744475;-2.8515016310848e-05;-0.00023498230439145;-0.00012981615145691;0.00023714127019048;1.7039577869582e-05;0.00022024622012395;-6.461329121521e-06;-0.0010851136175916;8.5284693341237e-05;-0.00074149470310658;0.00041040242649615;0.00046874210238457;0.00026839709607884;-5.0942187954206e-05;-0.00086977850878611;-4.9897867029358e-06;-0.00093152263434604;9.9991455499548e-05;-0.00010257473331876;-4.2224630306009e-05;0.0012870928039774;-2.5168948923238e-05;0.00012824285659008;-2.0588531697285e-05;0.00035481376107782;-5.7414235925535e-05;0.0001179541068268;0.00017810206918512;-9.3873451987747e-05;0.00038967793807387;-0.0018157431622967;7.4728362960741e-05;-0.0013084202073514;-0.00033404986606911;0.00062415841966867;2.7261607101536e-05;-0.00023133943614084;3.3159609301947e-05;-8.6099906184245e-05;0.0001893654698506;-0.00085681304335594;-0.00018926362099592;5.6199138498414e-07;0.00045123972813599;-0.0002257068263134;0.00073495006654412;-0.00048261226038449;0.00069593649823219;-0.00018075127445627;0.00039757683407515;-0.00015935822739266;0.002112282672897;2.8673892302322e-05;-4.4900050852448e-05;-6.4471460063942e-05;7.5187563197687e-05;-9.1678739408962e-05;0.00017744838260114;-0.00014693762932438;-0.00031426688656211;-0.00012224416423123;0.0014402533415705;-9.7703654319048e-05;0.00052601518109441;9.7679512691684e-06;-5.5308028095169e-05;8.9291017502546e-05;-0.00039338419446722;-0.00013468328688759;0.00053947983542457;-2.435562601022e-05;0.00016542116645724;0.00039957070839591;0.00050529709551483;0.00016665901057422;-4.2543171730358e-05;-0.00088225613581017;-9.1574402176775e-06;-0.00090784509666264;9.4617455033585e-05;0.00051520590204746;0.00013232670607977;-0.0014477854128927;2.5644542347436e-06;-2.8267018933548e-05;5.1339367928449e-05;-0.00011684112541843;1.3610972018796e-05;-8.1734840932768e-05;-0.00016117042105179;-7.7369179052766e-05;6.2800827436149e-06;0.0010144039988518;-3.0509014322888e-05;-0.00030791020253673;-0.00014537344395649;0.00023851275909692;2.206977478636e-05;0.00020824081730098;-3.8599287108809e-06;-0.0010232282802463;9.5942057669163e-05;-0.00065217219525948;0.00039656099397689;0.00051566318143159;0.00034673910704441;-9.5744348072913e-05;-0.00083386397454888;-8.9989771367982e-05;-0.00089875113917515;7.3980132583529e-05;-8.6917723820079e-05;-4.8013534978963e-05;0.001192199299112;-2.3098007659428e-05;0.00012255736510269;-2.6242685635225e-05;0.00033918797271326;-0.00023069824965205;0.00010001416376326;0.00033612645347603;-8.8220811448991e-05;0.0019280376145616;-0.00032467299024574;0.00097800837829709;-0.00010987342102453;-0.00056390621466562;0.00032856233883649;0.00051353464368731;-6.1069746152498e-05;0.00010042765643448;-2.4355713890145e-07;0.00088755140313879;-0.00017150423082057;5.3118988034839e-06;-8.3526458183769e-05;-0.00031056581065059;-0.00060553482035175;0.00023761397460476;-0.00064400862902403;0.00043398974230513;-0.00096524594118819;0.00011395290493965;-0.0018822378478944;0.00014431921590585;2.6363331926404e-05;-1.1745029951271e-05;-0.00011818615166703;3.7426223570947e-05;0.00029103990527801;-0.00012253555178177;-0.00067921343725175;-0.00012242984666955;0.0011306785745546;-0.00011839321814477;0.00081657542614266;-0.00010089646821143;-0.00029386929236352;0.00013930926797912;-0.00082361197564751;8.8598870206624e-05;0.00023812106519472;-9.6503375971224e-05;0.00055794377112761;-8.0567180702928e-05;0.00051652418915182;0.00054331764113158;3.7916167912044e-06;-0.00086285301949829;-0.00013817228318658;-0.00084707263158634;7.091389852576e-05;0.0016038656467572;7.270737842191e-05;-0.0019006582442671;0.00013353263784666;0.00011665531928884;-9.384139048052e-06;-0.00018053974781651;5.3125113481656e-05;-8.0984718806576e-05;3.5785483305517e-06;5.5264634283958e-05;-0.00020523522107396;0.0021069420035928;-1.8554648704594e-05;-0.00022972612350713;-0.00014700715837535;0.00010103195381816;-0.00012255145702511;0.00018980666936841;4.1446128307143e-05;-0.00090820068726316;-5.7075634686043e-05;-0.00035269631189294;9.354432404507e-05;0.00050856673624367;0.00087269250070676;0.00068968726554886;-0.0014556883834302;-8.3852246461902e-05;-0.0015713053289801;-0.00021100856247358;-0.00036618369631469;8.8024658907671e-05;0.00064362422563136;3.9375536289299e-05;0.00012733599578496;-1.2664135283558e-05;0.00028054081485607;-1.8727856513578e-05;-0.00025295015075244;0.00011465444549685;0.00039651122642681;-7.7434488048311e-05;0.0019874600693583;-0.00035906472476199;0.0010757729178295;-0.00010102207306772;-0.00060672260588035;0.00036677942262031;0.00058404542505741;-7.3707298724912e-05;0.00019333953969181;6.7549772211351e-06;0.00099081546068192;-0.00019597845675889;-7.6105578045826e-05;-0.00024769740412012;-0.00042711207061075;-0.0005026800208725;0.00030701822834089;-0.00051538128172979;0.00051443168194965;-0.0011313762515783;0.00011385953985155;-0.0021236394532025;0.00014995463425294;1.4316094166134e-05;-1.0871563972614e-05;-0.00015829932817724;4.4329051888781e-05;0.00032065119012259;-0.00013373381807469;-0.0007475443999283;-0.00012125846842537;0.0013288338668644;-0.00012058145512128;0.00086837739218026;-0.00013235126971267;-0.00032416265457869;0.00014901856775396;-0.00091962650185451;9.4929760962259e-05;0.00025302995345555;-0.0001095039624488;0.00063334446167573;-8.2432190538384e-05;0.00055117782903835;0.00062412192346528;7.6277472544461e-05;-0.00096121057868004;-0.00015585939399898;-0.0010111153824255;5.3011553973192e-05;0.001786578563042;7.1901973569766e-05;-0.0021281871013343;0.00015469457139261;0.00013453634164762;-6.0841084632557e-06;-0.00020212894014549;5.5294753110502e-05;-0.00011923145211767;1.7871272575576e-05;0.0001632671628613;-0.00026771996635944;0.0028898841701448;-0.00010197782103205;-0.00014385898248293;-0.0001991830940824;6.6648673964664e-05;-0.0001066252370947;0.00030525028705597;3.8731770473532e-05;-0.00084596133092418;-8.219137089327e-05;-0.00031710264738649;8.6258005467243e-05;0.0005867108120583;0.000991738634184;0.00077083968790248;-0.0018465693574399;-2.1052897864138e-05;-0.0019767084158957;-0.00015588547103107;-0.00074663804844022;0.00013451182167046;0.00044510958832689;8.1398356996942e-05;0.00010543562530074;-1.0808201295731e-05;0.00026987137971446;-1.2012797014904e-05;-5.3784983720107e-06;4.1744756344997e-06;0.00016763486200944;-0.00015214298036881;0.0001862471253844;-0.00027939211577177;0.00033785990672186;-0.00033907641773112;-7.5106137956027e-05;8.4881947259419e-05;3.25482324115e-05;-7.2483258009015e-06;7.6371106842998e-05;-3.5009725252166e-05;-8.9327288151253e-05;8.4347557276487e-05;-1.2502401659731e-05;-0.00014891949831508;-0.00010528120037634;-0.00021085274056531;0.00029719155281782;-0.00079812569310889;0.0010684876469895;-0.00015483966853935;0.00010447114618728;3.2620737329125e-05;-4.2363924876554e-05;-3.6804154660786e-05;1.7239375665667e-05;-1.7084771570808e-06;3.6234264477741e-09;2.2440493921749e-05;1.103882186726e-05;1.0493027730263e-05;2.443698940624e-05;7.0042493462097e-05;0.00015291449381039;0.00021754563204013;0.00020273464906495;-5.4730026022298e-05;-6.5357104176655e-05;3.3508713386254e-05;1.9994222384412e-05;-1.0129590009456e-05;-1.9380750018172e-05;1.0827156984305e-05;3.9081995055312e-05;-0.0002675425785128;0.00047702543088235;-8.4146275185049e-05;0.00026465079281479;0.00019849896489177;-0.00046826209290884;-0.00052593456348404;-8.9872832177207e-05;-0.00010265618766425;-4.7668621846242e-05;-5.0698614359135e-05;-8.3309787441976e-06;2.344127278775e-05;1.875779889815e-05;-2.72274701274e-06;1.5137737136683e-05;6.7878777372243e-06;0.00011730582627933;0.00011039888340747;-0.00014578778063878;-0.0003032045206055;-7.9017372627277e-05;-0.00023182772565633;-4.0575350794825e-06;3.9466776797781e-06;-7.0596361183561e-05;-8.0055491707753e-05;6.2047925894149e-05;1.6296939065796e-05;2.4320195734617e-05;6.0553964431165e-05;-3.4415832487866e-05;0.0011582929873839;2.5808563805185e-05;-0.00037711948971264;-0.00038477618363686;-0.00013595900963992;0.00014300226757769;-6.4930641201499e-06;7.9719633504283e-05;2.9087066650391e-05;8.4805920778308e-05;1.1259982784395e-05;2.9254813853186e-05;-5.2695653721457e-05;-7.202123379102e-05;-5.1561601139838e-06;4.0758195609669e-06;0.0001660493289819;-0.00015287665883079;0.00019553423044272;-0.00026916002389044;0.00034102593781427;-0.00033428787719458;-7.5369396654423e-05;8.3590144640766e-05;3.3583270123927e-05;-5.6089611462085e-06;7.9845187428873e-05;-3.1520026823273e-05;-8.7396452727262e-05;8.6268693848979e-05;-1.3520509128284e-05;-0.00016898676403798;-0.00011358456686139;-0.00020603538723662;0.0003008586645592;-0.00079089764039963;0.0010726681211963;-0.00015904333849903;9.9372475233395e-05;2.5080864361371e-05;-4.9746955482988e-05;-3.7753623473691e-05;1.606228579476e-05;-2.4423943614238e-06;-6.2825819213685e-07;2.2486292436952e-05;1.0773401299957e-05;1.4080262189964e-05;2.140125616279e-05;6.7196204327047e-05;0.00015682881348766;0.00021572246623691;0.00020286993822083;-5.3370502428152e-05;-6.6548607719596e-05;3.1746141758049e-05;2.172058702854e-05;-9.9526259873528e-06;-1.9940351194236e-05;1.0203509191342e-05;3.9908150938572e-05;-0.00026675246772356;0.00047840335173532;-8.264888310805e-05;0.00025409768568352;0.00020629759819712;-0.00045964473974891;-0.00053589441813529;-8.8170032540802e-05;-0.0001045343815349;-4.6848119382048e-05;-5.0669696065597e-05;-7.8116827353369e-06;2.324103115825e-05;1.8564407582744e-05;-2.7545563625608e-06;1.4289413229562e-05;7.5721600296674e-06;0.00011874990013894;0.00010769147775136;-0.00013602009858005;-0.00031458592275158;-6.9306981458794e-05;-0.00024284697428811;-4.178059498372e-06;4.5228184717416e-06;-6.9297806476243e-05;-8.0767917097546e-05;6.1864353483543e-05;1.6301675714203e-05;2.1717551135225e-05;6.3152590882964e-05;-3.4335236705374e-05;0.0011527211172506;2.421680437692e-05;-0.00037986997631378;-0.00037836143746972;-0.00015673816960771;0.00017025551642291;-8.5678020695923e-06;8.2161444879603e-05;2.7766944185714e-05;8.6315842054319e-05;1.0574729458313e-05;2.9672477467102e-05;-5.0815353461076e-05;-7.3855066148099e-05;-0.00010280087008141;0.00019368469656911;0.00010171749454457;-0.00023054517805576;0.00032693360117264;-0.0014782954240218;5.4521198762814e-05;-0.0010467977263033;-0.00033915479434654;0.0006017463747412;6.2573875766248e-05;-0.00038747274084017;-1.7163712982438e-05;5.0021597417071e-05;0.00018794996140059;-0.00083425786579028;3.3392843761249e-05;0.00029023486422375;0.00044339190935716;-0.00031036001746543;0.00037700531538576;-0.00044686903129332;0.00032839336199686;-0.00011321606143611;0.00063134939409792;-0.00012483086902648;0.0017809354467317;2.6081432224601e-05;-5.755337770097e-05;-4.78172696603e-05;4.7201516281348e-05;-0.00013774129911326;0.00026688564685173;-9.5839852292556e-05;-0.00059051782591268;-8.8169748778455e-05;0.0011847199639305;-0.00013410254905466;0.00072025967529044;0.00010107220441569;-0.00024786021094769;0.00012068284559064;-0.00066496303770691;-0.00012588688696269;0.00028429744997993;-6.44997053314e-05;0.00046083741472103;0.00046111614210531;0.00058483239263296;0.00016264471923932;-0.00017068297893275;-0.0007612113840878;-1.0212485221928e-06;-0.00098115287255496;5.2306248107925e-05;0.0012490353547037;0.0001582833356224;-0.0017172890948132;-1.1167638149345e-05;0.00010782373283291;6.0355381720001e-05;-0.00018304618424736;9.5436544143013e-06;-9.6017924079206e-05;-0.00025536247994751;3.959465175285e-06;-7.6178359449841e-05;0.0022706596646458;-0.00013909040717408;-0.00021733292669524;-0.00010050339915324;0.00010544817632763;4.6301251131808e-05;0.00026910091401078;-5.7171335356543e-05;-0.00092707457952201;7.0251146098599e-05;-0.00034395174589008;0.00057073222706094;0.00084692856762558;0.00062076700851321;-5.9403129853308e-05;-0.0015054751420394;-0.00012430727656465;-0.0016302319709212;0.00012209753913339;-0.00042880472028628;5.0462549552321e-05;0.00062737474218011;-2.4102540919557e-05;0.00011219154112041;-9.2642376330332e-06;0.00026845373213291;-9.4269511464518e-05;0.00018542908946984;0.00011219174484722;-0.00021983882470522;0.0003255374613218;-0.0015643590595573;7.8028562711552e-05;-0.0010070870630443;-0.0003251213056501;0.00059204088756815;5.514511212823e-05;-0.00036556526902132;-4.2828787627514e-06;4.6245859266492e-05;0.00017821833898779;-0.00080147036351264;-2.4157345251297e-05;0.00014383929374162;0.00034652114845812;-0.00026463827816769;0.00049732974730432;-0.00040938347228803;0.00050566351274028;-0.00012239633360878;0.00061400164850056;-0.0001381728798151;0.0016898139147088;2.4569639208494e-05;-5.3737996495329e-05;-4.5945813326398e-05;4.5850389142288e-05;-0.00013056762691122;0.00025172342429869;-0.00010745938197942;-0.00055177084868774;-9.8383628937881e-05;0.0010721473954618;-0.00011099949188065;0.00071607722202316;0.0001050360588124;-0.00024760930682532;0.00011616129631875;-0.00062083156080917;-0.00011603491293499;0.00027430680347607;-6.8600085796788e-05;0.00044573898776434;0.00045103282900527;0.00052731373580173;9.0950830781367e-05;-0.00014853189350106;-0.00072427454870194;2.581593071227e-05;-0.00086745747830719;5.9814283304149e-05;0.0011602492304519;0.00014525395818055;-0.0016173726180568;-1.4433159776672e-05;9.7670359537005e-05;5.985670213704e-05;-0.00017482248949818;-1.8554694634076e-06;-7.3396957304794e-05;-0.00020448345458135;-4.8304995289072e-05;-6.4194618971669e-06;0.0017956210067496;-0.00011097123206127;-0.00027406867593527;-0.00011673123663059;0.00013073225272819;4.932709998684e-05;0.00020030447922181;-3.9538062992506e-05;-0.00095145165687427;8.1552272604313e-05;-0.00036825280403718;0.00051864091074094;0.00079710449790582;0.00059172406326979;-0.00011916861694772;-0.0012665804242715;-0.00017571581702214;-0.0013961129589006;8.3615821495187e-05;-0.00021949921210762;1.9617416910478e-05;0.00073802820406854;-2.4241257051472e-05;0.00012495390546974;-1.6775029507698e-05;0.00028234533965588;-0.00026701425667852;0.00011577332043089;0.00044364234781824;-3.1938339816406e-05;0.0015402354765683;-0.00023245855118148;0.00058823364088312;-0.00010650506010279;-0.00038305841735564;0.0002206048957305;0.00061579659814015;-7.833082054276e-05;4.0300768887391e-05;8.8617198343854e-06;0.00057929259492084;-0.00010565916454652;-0.00011711147089954;-9.0838613687083e-05;-0.00012034812971251;-0.00038182159187272;0.00020634011889342;-0.00055148388491943;0.00029790020198561;-0.0011758102336898;7.8024793765508e-05;-0.0011532246135175;0.00010265036689816;-8.7575954239583e-06;2.0436873455765e-06;-4.8471029003849e-05;1.3131283594703e-05;0.00028633075999096;-0.00011625393381109;-0.00076372665353119;-5.7817982451525e-05;0.0001340374146821;-3.3087533665821e-05;0.00062297686235979;-3.4555898309918e-05;-0.00028851084061898;0.00014675265992992;-0.00085717369802296;8.5710329585709e-05;-0.00015726819401607;-3.3753436582629e-05;0.0004903954686597;-8.1041260273196e-05;0.00039228491368704;0.00028642165125348;-0.00011339153570589;-0.0003559204924386;-0.00015128194354475;-0.0002887875016313;4.548310971586e-05;0.0019848528318107;5.8320670177636e-06;-0.0013093744637445;7.104076212272e-05;0.00018264770915266;-2.3525475626229e-05;-0.00010481227946002;3.5516608477337e-05;-1.1903918675671e-05;-2.2329779312713e-05;-1.016958958644e-05;-0.00015209996490739;0.0018800990656018;-1.1895436728082e-05;-0.00012405290908646;-0.00016272852371912;8.1154184954357e-06;-6.9868568971287e-05;1.3851459698344e-05;4.9538946768735e-05;-0.00074910739203915;-5.39855354873e-05;-0.00014008225116413;6.5362910390832e-05;0.00043538608588278;0.00080523791257292;0.00064258568454534;-0.0012627850519493;-9.897627751343e-05;-0.0014540737029165;-0.00018995071877725;-0.00011914529022761;5.6323897297261e-05;0.00029772793641314;6.1052160162944e-05;0.00013982949894853;-1.1007343346137e-05;0.00020258720905986;-1.3535831385525e-05;-0.00030865368898958;0.000142128119478;0.00057507026940584;-5.1783795242955e-06;0.0015792974736542;-0.0002804514952004;0.0006552399136126;-0.00010056322207674;-0.00040778645779938;0.00025594266480766;0.00075145822484046;-0.00010406012734165;0.00024154153652489;1.6817955838633e-05;0.00065746100153774;-0.0001287306076847;-0.00026849823188968;-0.00033062027068809;-0.00025036491570063;-0.00018916356202681;0.00030742798116989;-0.00037747656460851;0.00040746913873591;-0.0015377945965156;7.8078119258862e-05;-0.0013530176365748;0.00010880712943617;-5.0624686991796e-05;8.6749432739452e-06;-0.00011111783533124;1.8687880583457e-05;0.00032760266913101;-0.0001297293783864;-0.00084097275976092;-3.5499928344507e-05;0.0002106827305397;-4.2663832573453e-05;0.00070267351111397;-7.4378687713761e-05;-0.00035126961302012;0.00017486653814558;-0.0010031142737716;8.9563895016909e-05;-0.00019325636094436;-3.9682661736151e-05;0.00060529279289767;-9.0100984380115e-05;0.00038641603896394;0.00033674985752441;-5.876293653273e-05;-0.00037596456240863;-0.00016533133748453;-0.00042357001802884;5.0986815040233e-05;0.002275793813169;-4.9419300012232e-06;-0.0015360568650067;9.729980956763e-05;0.0002182899042964;-2.0222614693921e-05;-0.00012620279449038;3.550306064426e-05;-6.8048218963668e-05;-2.2381429971574e-06;0.00017171743093058;-0.00021774502238259;0.0030572549439967;-0.00012993751442991;3.5355631553102e-05;-0.00025966647081077;-6.5626358264126e-05;-4.0746748709353e-05;0.00017924977873918;3.9104688767111e-05;-0.000576916791033;-9.3323622422758e-05;-2.5352373995702e-05;5.6181514082709e-05;0.00051912723574787;0.0010129794245586;0.0007964763790369;-0.0018022416625172;-3.3294541935902e-05;-0.0021136493887752;-0.00011305934458505;-0.00072491698665544;0.00011971040657954;-0.00011372024164302;0.0001316369016422;0.00010516545444261;-3.1731665330881e-06;0.00016619745292701;-6.5007266130124e-06;-6.3974530348787e-06;1.8339163716519e-06;0.00024600091273896;-0.00022188290313352;0.00017180273425765;-0.00023773488646839;0.00027621377375908;-0.0002874300989788;-3.671368904179e-05;4.8106536269188e-05;-8.3009726949967e-06;3.0810922908131e-05;7.6415235525928e-05;-4.3667321733665e-05;-8.6436964920722e-05;8.2655351434369e-05;5.2963537200412e-07;-9.8724027338903e-05;-8.6090272816364e-05;-0.00049153575673699;0.0005200388841331;-0.00056967872660607;0.00078587251482531;-0.00011066928709624;6.2764956965111e-05;2.1773295884486e-05;-2.239227615064e-05;-2.1105448468006e-05;7.94835978013e-06;-8.1037178460974e-06;4.0967624954646e-06;2.1798052330269e-05;1.3581857274403e-05;-7.2684895712882e-05;-5.6517030316172e-05;-4.1550989408279e-05;7.2656905103941e-05;0.00014936186198611;0.00016615503409412;-5.5098738812376e-05;-6.3939412939362e-05;5.9131049056305e-05;4.1345043428009e-05;-4.1226667235605e-05;-3.7586465623463e-05;-1.4343097063829e-05;8.1749731180025e-06;-0.00023388906265609;0.00018363665731158;0.00011677428119583;0.00045799481449649;0.00038227954064496;-0.00044824197539128;-0.00055187213001773;-6.1348728195298e-05;-8.0106219684239e-05;3.9677077438682e-05;1.3056327588856e-05;-1.9885250367224e-05;9.3733151516062e-06;3.1819108698983e-05;1.1474786333565e-05;1.7568969269632e-05;7.138994988054e-06;9.7906959126703e-05;8.5556079284288e-05;-4.1309274820378e-05;-0.00018454789824318;4.3973759602522e-05;-9.0254179667681e-05;-6.171483619255e-06;1.343105941487e-05;-4.3982920033159e-05;-4.7824138164287e-05;8.4937040810473e-05;3.3954558603e-05;-8.3585873653647e-06;1.4819930584054e-05;-5.8074634580407e-05;0.0014810067368671;3.4345073800068e-05;-0.00039260683115572;-0.00038954027695581;-0.00041075042099692;-0.00018811703193933;-6.0643909819191e-05;2.4424505681964e-05;2.4601420136605e-06;6.5751126385294e-05;-9.8514883575263e-06;5.8667505982157e-06;-3.3852629712783e-05;-4.7255987738026e-05;-6.1468572312151e-06;1.7356874195684e-06;0.00024551787646487;-0.00022134359460324;0.00018190563423559;-0.00022730005730409;0.00027742411475629;-0.00028502536588348;-3.7096349842614e-05;4.706348045147e-05;-7.7454142228817e-06;3.1890762329567e-05;7.9557772551198e-05;-4.050998177263e-05;-8.3924001955893e-05;8.501597767463e-05;-2.6091315703525e-06;-0.00011840430670418;-9.0291454398539e-05;-0.00048609427176416;0.00052396883256733;-0.00056436326121911;0.00078913744073361;-0.00011506846203702;5.7655441196403e-05;1.4609248864872e-05;-2.9123020794941e-05;-2.1667347027687e-05;7.211705451482e-06;-9.1207857622067e-06;3.1396909889736e-06;2.178893009841e-05;1.3343259524845e-05;-6.8941692006774e-05;-5.9658665122697e-05;-4.1614752262831e-05;7.3926174081862e-05;0.00014584619202651;0.0001686306350166;-5.3978663345333e-05;-6.4881838625297e-05;5.7602897868492e-05;4.2740153730847e-05;-4.0917693695519e-05;-3.8101330574136e-05;-1.382811296935e-05;7.8455377661157e-06;-0.00023278586741071;0.00018529449880589;0.00011749332043109;0.00044460556819104;0.0003920056624338;-0.00043792076758109;-0.000562951376196;-6.0472819313873e-05;-8.1030375440605e-05;3.9548627682962e-05;1.353301013296e-05;-1.9175766283297e-05;9.0081648522755e-06;3.1196061172523e-05;1.1851024282805e-05;1.6638605302433e-05;7.9728497439646e-06;0.00010129963629879;8.0770267231856e-05;-3.439163629082e-05;-0.00019353884272277;5.0852046115324e-05;-9.8918710136786e-05;-6.4763107729959e-06;1.4107395145402e-05;-4.3954700231552e-05;-4.7370915126521e-05;8.4163046267349e-05;3.4156419133069e-05;-1.0174089766224e-05;1.6746394976508e-05;-5.7876797654899e-05;0.0014752327697352;3.3241554774577e-05;-0.00039996058330871;-0.00037842718302272;-0.00042390241287649;-0.0001684758317424;-6.0688056692015e-05;2.5404584448552e-05;1.6215120695051e-06;6.7153298004996e-05;-9.8861646620207e-06;5.7270681281807e-06;-3.2438507332699e-05;-4.8606743803248e-05;-0.00013028259854764;0.00024052466324065;3.2247433409793e-05;-0.00038362355553545;0.00025945328525268;-0.0011881556129083;5.9310168580851e-05;-0.00066823541419581;-0.0002671598631423;0.00045888294698671;9.2860027507413e-05;-0.00049962988123298;-3.312388798804e-05;2.8601421945496e-05;0.00014345940144267;-0.00062954652821645;0.00020104435679968;0.00035838483017869;0.0002869782038033;-0.00032285033375956;0.00015532299585175;-0.00034887078800239;0.0001992920297198;-6.9833375164308e-05;0.00092148466501385;-9.793334902497e-05;0.0012091241078451;9.0763232947211e-06;-1.913983214763e-05;-2.510105696274e-05;2.7439151381259e-05;-0.00014203760656528;0.00028000207385048;-3.3203461498488e-05;-0.00069486384745687;-2.6141598937102e-05;0.00048331121797673;-0.00010482705692993;0.00067260424839333;0.00014691860997118;-0.00032935940544121;0.00012131265248172;-0.00074344547465444;-7.3961833550129e-05;-5.4567160987062e-05;-8.1361562479287e-05;0.00054692610865459;0.00038710015360266;0.00043294578790665;6.6855907789432e-05;-0.00021318608196452;-0.00040362871368416;3.9292776818911e-06;-0.00064044707687572;-6.8945782913943e-06;0.0016492877621204;0.00012295028136577;-0.0014231605455279;-2.4753109755693e-05;0.00018828496104106;5.0285150791751e-05;-0.00015687510313001;-8.4367138697417e-06;-6.1537226429209e-05;-0.00023253203835338;2.1230591300991e-05;-8.877353684511e-05;0.0025194655172527;-0.00019084529776592;-0.00010417406883789;-5.1573450036813e-05;-1.4311567611003e-05;5.7972876675194e-05;0.00018456646648701;-7.3694383900147e-05;-0.00072795915184543;4.4678025005851e-05;-6.837111141067e-05;0.00055243662791327;0.00092710833996534;0.00070316123310477;-6.8906498199794e-05;-0.0015746193239465;-0.00014112851931714;-0.0018013938097283;0.0001073338862625;-0.00042907355236821;0.00010143354302272;0.00014680603635497;-2.0352301362436e-05;0.00010555969492998;-1.7243538650291e-06;0.00018765409186017;-0.00011960422853008;0.00023086175497156;4.8410845920444e-05;-0.0003539304016158;0.00025290928897448;-0.0012957119615749;8.0046716902871e-05;-0.00065008795354515;-0.00025239432579838;0.00045324419625103;8.1819562183227e-05;-0.00046971414121799;-2.1239340640022e-05;6.7935034167022e-05;0.00013289347407408;-0.00060277420561761;0.00012225264799781;0.0001932470331667;0.00019242701819167;-0.0002677830925677;0.00030354663613252;-0.00030534726101905;0.00039050221676007;-7.9371959145647e-05;0.00085587886860594;-0.0001083292736439;0.0011463853297755;9.9287608463783e-06;-2.4789362214506e-05;-2.3231474187924e-05;1.201962641062e-05;-0.00013814074918628;0.00026918420917355;-5.2441726438701e-05;-0.00067912094527856;-2.2443073248724e-05;0.00038399841287173;-7.635094516445e-05;0.00064226519316435;0.00014219956938177;-0.00031110827694647;0.00012288447760511;-0.00070131261600181;-6.4735468185972e-05;-6.4040716097225e-05;-8.172989328159e-05;0.00050671008648351;0.00039905903395265;0.00037851865636185;5.7324773479195e-06;-0.00019666524895001;-0.00038267349009402;1.2066238014086e-05;-0.00051401677774265;-2.3909931314847e-06;0.0015792057383806;0.00010464167280588;-0.0013144859112799;-2.9714603442699e-05;0.00017553010547999;5.0075661420124e-05;-0.00014070000906941;-2.3220924049383e-05;-3.2011605071602e-05;-0.00018752063624561;-5.8194520534016e-05;-1.277447972825e-05;0.0019554535392672;-0.00014951775665395;-0.0001724405301502;-6.9372945290525e-05;2.1216070308583e-05;6.5944324887823e-05;0.00010011111589847;-5.2408558985917e-05;-0.00080260448157787;5.5262338719331e-05;-0.00012751269969158;0.00051225023344159;0.00085663964273408;0.00064597628079355;-0.00012823400902562;-0.0013158075744286;-0.00019238937238697;-0.0015067849308252;6.6629479988478e-05;-0.000150764171849;6.2283928855322e-05;0.00033229700056836;-2.3758882889524e-05;0.00012656961916946;-8.240295755968e-06;0.00021292481687851;-0.0002486485755071;0.00010956615733448;0.00047734155668877;-7.0590976974927e-07;0.0011954314541072;-0.00017503544222564;0.00032718028523959;-9.5318959210999e-05;-0.00022241332044359;0.00012972379045095;0.00059691909700632;-8.0939782492351e-05;0.0001293140812777;3.1367603696708e-06;0.00033255471498705;-5.661493196385e-05;-0.00018212581926491;-9.5497285656165e-05;-1.9274311853223e-05;-0.00022332757362165;0.00018141817417927;-0.00044718975550495;0.00021342057152651;-0.0012365439906716;5.961016722722e-05;-0.00067663489608094;7.4570787546691e-05;-5.0797556468751e-05;1.3532015145756e-05;-3.4422424505465e-05;1.7709894564177e-06;0.00022807302593719;-8.9163426309824e-05;-0.00064693577587605;-1.0535087312746e-05;-0.00041429814882576;1.9178027287126e-05;0.00038555637001991;7.144908522605e-06;-0.00022365030599758;0.00011803838424385;-0.00071519758785143;6.7203633079771e-05;-0.00033831951441243;6.2073650042294e-06;0.00035048651625402;-6.3904000853654e-05;0.00023815894383006;9.5160583441611e-05;-0.00014070208999328;-2.5863237169688e-05;-0.00011856917990372;6.3243795011658e-05;1.3042114915152e-05;0.0018078212160617;-3.3647676900728e-05;-0.00073890219209716;2.5060046027647e-05;0.00017620615835767;-2.5567680495442e-05;-3.3560216252226e-05;1.8234974049847e-05;2.056881567114e-05;-2.9040615117992e-05;-1.1401356459828e-05;-9.7936208476312e-05;0.0015174420550466;-2.5508057660772e-05;-1.5274305042112e-05;-0.0001506704284111;-5.0785987696145e-05;-2.4617880626465e-05;-7.2646420449018e-05;4.1659917769721e-05;-0.00050643674330786;-4.3540596379898e-05;-9.0992375589849e-07;3.7138936022529e-05;0.00031017829314806;0.00062767002964392;0.00050136999925599;-0.00096633966313675;-7.4971991125494e-05;-0.0011848395224661;-0.00012144051288487;-3.6206027289154e-05;3.5157117963536e-05;2.251960177091e-05;6.7868881160393e-05;0.00012422047439031;-7.5443658715812e-06;0.00012316182255745;-8.8454316937714e-06;-0.00032689579529688;0.00015331814938691;0.00076400919351727;4.1510553273838e-05;0.001355538610369;-0.00024374632630497;0.00031673366902396;-0.0001117355786846;-0.00017798812768888;0.0001286308397539;0.00085496908286586;-0.00012722075916827;0.00052442488959059;-2.5774907044251e-06;0.000309954630211;-5.815770055051e-05;-0.0004178614472039;-0.00035017603659071;-8.9334324002266e-05;-2.0135792055953e-06;0.000313458556775;-0.00035492950701155;0.00033856657682918;-0.002011134987697;7.2482580435462e-05;-0.00075494108023122;8.6860542069189e-05;-0.00014901040412951;3.4319684345974e-05;-0.0001202515559271;3.1972645047063e-06;0.00024895972455852;-8.8354674517177e-05;-0.00067431892966852;4.5582128223032e-05;-0.00077040039468557;2.6960478862748e-05;0.00036822576657869;-2.7185587896383e-06;-0.00026735936990008;0.0001416634186171;-0.00085507915355265;6.0404618125176e-05;-0.00051399075891823;2.6380626877653e-05;0.00040344940498471;-7.1864931669552e-05;0.00012124097702326;1.6507405234734e-05;-0.00013660616241395;0.00016848801169544;-9.5183699158952e-05;0.00018526217900217;1.017338490783e-05;0.0021824662107974;-7.1095280873124e-05;-0.00068504165392369;2.9530881874962e-05;0.00021906984329689;-2.3880984372227e-05;-7.6306578193908e-06;9.1601214080583e-06;-1.1456797437859e-05;-1.5462228475371e-05;0.00019368305220269;-0.00012472367961891;0.0026955776847899;-0.00016658312233631;0.00022018468007445;-0.00027868503821082;-0.00016918868641369;2.8988129997742e-05;1.2326870091783e-05;2.5173512767651e-05;-0.00024735878105275;-8.096155943349e-05;0.00019543830421753;2.018955819949e-05;0.00031804080936126;0.00079869327601045;0.00065339833963662;-0.0014161352301016;6.5584924868745e-07;-0.0018872921355069;5.8363807511341e-06;-0.00062225334113464;8.742167847231e-05;-0.00055490952217951;0.00015666009858251;0.00010949373245239;4.8514802983846e-06;5.2767507440876e-05;-4.3708118937502e-06;-4.3744912545662e-06;-2.9792286113661e-06;0.00030661877826788;-0.0002756450267043;0.00018626135715749;-0.00021489051869139;0.00019678581156768;-0.00020708744705189;-1.2052060810674e-05;2.3022052118904e-05;-4.1339306335431e-05;6.2481107306667e-05;7.8608580224682e-05;-4.9491103709443e-05;-6.525339995278e-05;6.296004721662e-05;1.4295090295491e-05;-4.6276654757094e-05;-6.8052802816965e-05;-0.000772264378611;0.00074132665758952;-0.00033891887869686;0.00049165735254064;-7.6169962994754e-05;2.563575617387e-05;-1.0159938028664e-06;4.3849385633621e-07;-5.7708025451575e-06;-2.2988865566731e-06;-2.1358617232181e-05;1.5148436432355e-05;1.7490190657554e-05;1.4127101167105e-05;-0.00016688414325472;-0.00014924186689314;-0.00018927316705231;-4.9156416935148e-05;6.8679393734783e-05;0.00011022815306205;-4.9309037422063e-05;-6.1355553043541e-05;7.9664365330245e-05;5.5341621191474e-05;-7.9272977018263e-05;-6.4567131630611e-05;-3.256110358052e-05;-1.1442106369941e-05;-0.0001388715027133;-0.00018877815455198;0.00022120730136521;0.00062427466036752;0.00054130068747327;-0.00031135763856582;-0.00044534789049067;-5.4095467021398e-06;-2.8568587367772e-05;0.00012504200276453;7.5704243499786e-05;-2.7446536478237e-05;7.8632353961439e-07;4.2469993786654e-05;2.252731610497e-05;2.2760710635339e-05;1.0784676305775e-05;2.7636999220704e-05;1.4642771930085e-05;-4.053549218952e-06;-0.00012477466952987;0.00012614332081284;1.5140960385907e-05;-1.0801690223161e-05;1.3424962162389e-05;-1.3693118489755e-05;-1.2440566024452e-05;9.2848247732036e-05;4.1353741835337e-05;-3.7866193451919e-05;-2.3046894057188e-05;-8.5066130850464e-05;0.0015701233642176;7.3694238380995e-05;-0.00028054325957783;-0.00027842540293932;-0.00059436069568619;-0.00042506415047683;-8.7945038103499e-05;-8.0202571552945e-06;6.9239001732058e-07;6.1399041442201e-05;-3.1109851988731e-05;-1.818446071411e-05;-1.3096094335197e-05;-2.2153419195092e-05;-4.0687327782507e-06;-3.0458709261438e-06;0.00030787655850872;-0.0002735918678809;0.0001959827641258;-0.00020515298820101;0.00019674270879477;-0.00020613789092749;-1.251068260899e-05;2.2135305698612e-05;-4.1652430809336e-05;6.285809649853e-05;8.1492478784639e-05;-4.6533983550034e-05;-6.2314669776242e-05;6.5615065977909e-05;8.0342042565462e-06;-6.6413158492651e-05;-6.9910747697577e-05;-0.00076596683356911;0.00074665033025667;-0.00033409256138839;0.00049459555884823;-8.0335608799942e-05;2.062639578071e-05;-7.8772254710202e-06;-5.7618572100182e-06;-5.8908285609505e-06;-2.6197324132227e-06;-2.2636420908384e-05;1.390467514284e-05;1.7595391909708e-05;1.3780510926154e-05;-0.00016400388267357;-0.00015191538841464;-0.0001864177029347;-5.0880913477158e-05;6.447646592278e-05;0.00011373096640455;-4.8455884098075e-05;-6.2052604334895e-05;7.8557910455856e-05;5.633204273181e-05;-7.8782395576127e-05;-6.5205153077841e-05;-3.1166218832368e-05;-1.2694531505986e-05;-0.00013750074140262;-0.00018744505359791;0.00022161549713928;0.0006095843273215;0.00055239372886717;-0.00030105875339359;-0.00045594456605613;-5.1077713578707e-06;-2.8710564947687e-05;0.00012368318857625;7.7147989941295e-05;-2.67586146947e-05;4.1839496134344e-07;4.1600855183788e-05;2.3183476514532e-05;2.1677080439986e-05;1.1736491615011e-05;3.3178788726218e-05;7.664041731914e-06;2.1032878976257e-06;-0.00013286051398609;0.00013067270629108;9.0428575276746e-06;-1.1130868188047e-05;1.4031792488822e-05;-1.4473140254267e-05;-1.112232075684e-05;9.1794769105036e-05;4.1631294152467e-05;-3.8874193705851e-05;-2.1991509129293e-05;-8.4766259533353e-05;0.0015651282155886;7.2991097113118e-05;-0.00029351960984059;-0.00026213741512038;-0.00060191343072802;-0.00041226268513128;-8.701335900696e-05;-7.8130933616194e-06;-2.1076333212022e-07;6.3011197198648e-05;-3.0659914045827e-05;-1.8822711354005e-05;-1.2141326806159e-05;-2.2950478523853e-05;-0.00012249009159859;0.00022989817080088;-3.4415151617395e-07;-0.00048154959222302;0.00020118027168792;-0.0010374342091382;7.9186851507984e-05;-0.00031492652487941;-0.00012889060599264;0.00022088280820753;0.00010133979230886;-0.00050486589316279;-4.4666007852356e-06;-0.0001381906477036;6.4600353653077e-05;-0.00029814499430358;0.00023732706904411;0.0001756243291311;5.0376616854919e-05;-0.00024730994482525;0.00015378868556581;-0.00021728638967033;0.00033586123026907;-6.8256071244832e-05;0.0011279183672741;-8.0714373325463e-05;0.0006185511010699;-1.6025313016144e-05;4.7799108870095e-05;-5.7981869758805e-06;2.2358710339176e-05;-8.519362017978e-05;0.00017877687059809;1.5804169379408e-05;-0.00049382972065359;3.8619673432549e-05;-0.00033083485323004;-1.4250370441005e-05;0.0003237048513256;0.00010160898818867;-0.00021132717665751;7.7849486842752e-05;-0.00053443852812052;-2.5196527531079e-06;-0.00029534078203142;-5.6644894357305e-05;0.00031091351411305;0.00016838949522935;0.00011333983275108;-5.0383034249535e-05;-0.00012202376819914;1.4533621651935e-05;-2.6926574719255e-05;-1.3373288311413e-05;-5.4897027439438e-05;0.0013938269112259;3.6702582292492e-05;-0.00059921131469309;-2.6697409339249e-05;0.0001589468884049;2.2150943550514e-05;-3.7275782233337e-05;-3.2171421480598e-05;2.0286614017095e-05;-9.7025826107711e-05;-3.3353815524606e-05;-4.2299827327952e-05;0.0014689243398607;-0.00014506226580124;-2.2991256628302e-05;-8.9217573986389e-06;-6.4197942265309e-05;5.0774462579284e-05;-5.9128320572199e-05;-3.8085712731117e-05;-0.00049867649795488;1.995430648094e-05;4.8902576963883e-05;0.00029606599127874;0.00058623979566619;0.00047321515739895;-6.39913851046e-05;-0.00089706265134737;-9.137545566773e-05;-0.0011566044995561;2.8742522772518e-05;-1.9107537809759e-05;7.8090670285746e-05;-8.9557506726123e-06;-1.5090100532689e-05;0.00012205251550768;-3.9277597352338e-06;0.00010478088370292;-0.00010616749932524;0.00020872485765722;1.1672205801005e-05;-0.00038268003845587;0.00016986044647638;-0.0010071500437334;7.7616808994208e-05;-0.00032394856680185;-0.00013784306065645;0.00025438077864237;8.0015204730444e-05;-0.00043569534318522;-1.1318468750687e-05;3.2421194191556e-05;6.7645596573129e-05;-0.0003263910766691;0.00015233522572089;8.1802703789435e-05;1.7424154066248e-05;-0.00019322657317389;0.00023199713905342;-0.00017116295930464;0.00038556885556318;-5.5572458222741e-05;0.00087628938490525;-7.6901269494556e-05;0.0005984011804685;-4.9777022468334e-06;6.4589844441798e-06;-5.2448203859967e-06;-1.4334877960209e-05;-9.6224488515873e-05;0.00019194980268367;-1.1073274436058e-05;-0.0005574815440923;4.2922081775032e-05;-0.00023260188754648;-1.1602483937168e-05;0.00035946848220192;0.0001031601568684;-0.00021530695084948;9.0211848146282e-05;-0.00052693055476993;-9.761273759068e-06;-0.00026496176724322;-5.7566914620111e-05;0.00032048800494522;0.00024707862758078;0.00014258845476434;-6.3616585975979e-05;-0.00015165815420914;-4.4936168706045e-05;-1.9509701814968e-05;-5.4527077736566e-05;-4.2176714487141e-05;0.0013916400494054;3.3938642445719e-05;-0.00066613173112273;-3.0947983759688e-05;0.00015399072435685;2.6980102120433e-05;-4.7401746996911e-05;-4.2804535041796e-05;3.4423606848577e-05;-9.6860690973699e-05;-0.00011722702765837;2.2057476599002e-05;0.0011455180356279;-0.00010523177479627;-0.00011391194857424;-3.2195024687098e-05;-1.8932982129627e-05;6.5074200392701e-05;-8.1125654105563e-05;-2.6815299861482e-05;-0.00061347434530035;3.071821629419e-05;-2.5102237486863e-05;0.00033150496892631;0.00057149125495926;0.00044663605513051;-0.00011208993964829;-0.0008048074087128;-0.00015317037468776;-0.00096524559194222;8.6738791651442e-06;0.00017481946269982;4.3774201913038e-05;0.00019302440341562;-2.1454658053699e-05;0.00012774768401869;-5.9959115787933e-06;0.00014098201063462;-0.00037268392043188;0.0001717428676784;0.001074853935279;7.8788812970743e-05;0.0015530302189291;-0.0002565800677985;0.00010485076199984;-0.00015394369256683;-3.8324569118231e-07;2.9269782316987e-05;0.0010408137459308;-0.00015616104064975;0.00086135271703824;-3.5880777431885e-05;5.6139069783967e-05;-1.9911913113901e-06;-0.00058017810806632;-0.00032520404784009;7.7220029197633e-05;3.9465237932745e-05;0.00035087123978883;-0.00053476629545912;0.00031886526267044;-0.0027829378377646;8.7210675701499e-05;-0.00040659651858732;9.414605301572e-05;-0.00023706084175501;6.2689112382941e-05;-0.00015180453192443;-5.137330845173e-06;0.00012792926281691;-2.4909213607316e-05;-0.00044810384861194;0.00011106791498605;-0.0016304126475006;6.9785972300451e-05;6.467829371104e-05;7.1104332164396e-05;-0.00016251506167464;9.5469506049994e-05;-0.00064532039687037;1.5849598639761e-05;-0.00077692558988929;7.7509561378974e-05;0.0001693236263236;-5.1209826779086e-05;-0.00014725896471646;-0.00024668060359545;-0.0002003334229812;0.00059925351524726;2.8755080165865e-06;0.00072772073326632;-4.6084031055216e-05;0.0020522244740278;-0.00011321019701427;7.3512172093615e-05;-2.7417789169704e-05;0.00017840867803898;-1.9002860426554e-05;0.00011692946281983;-1.4258142982726e-05;9.4345406978391e-05;-4.1835628508125e-05;0.00015070375229698;-1.1263316082477e-05;0.002089218236506;-0.00019295087258797;0.00031706018489785;-0.00029181290301494;-0.00023586237512063;8.5581588791683e-05;-0.00031470920657739;1.96689798031e-05;-0.00012877411791123;-5.3070180001669e-05;0.00033043534494936;-7.0231244535535e-06;6.4727988501545e-05;0.00048672917182557;0.00050262041622773;-0.00090414081932977;6.6472166508902e-05;-0.0015506846830249;0.00013786116323899;-0.00020988115284126;2.7593423510552e-05;-0.00074831576785073;0.00016751067596488;0.00017280272732023;9.2147283794475e-06;-2.3445192709914e-05;-8.7766829892644e-06;-0.00028653591289185;0.00013333496463019;0.00080421956954524;6.8301116698422e-05;0.001031921361573;-0.00017546128947288;2.8160509828012e-05;-0.00010264428419759;4.5041309931548e-05;2.9460991299857e-06;0.00084008561680093;-0.00012337291263975;0.00072267843643203;-2.5332621589769e-05;-1.8150591131416e-05;9.3249000201467e-06;-0.00046672215103172;-0.00032948312582448;2.9237866328913e-05;0.00017397831834387;0.00025865811039694;-0.00029196968534961;0.00025201897369698;-0.0021970486268401;6.3763021898922e-05;-0.00021246858523227;5.304663136485e-05;-0.00021059039863758;5.0508078857092e-05;-0.00012223205703776;-5.2127925300738e-06;9.2065332864877e-05;-1.0468313121237e-05;-0.00024503582972102;0.00011657793947961;-0.0014227734645829;3.8066275010351e-05;5.8745026763063e-06;5.3237952670315e-05;-0.00010494779417058;6.7553824919742e-05;-0.000534700055141;1.0699010317694e-06;-0.00060357205802575;6.8387846113183e-05;9.3798342277296e-05;-3.6266865208745e-05;-0.00022978488414083;-0.00027806824073195;-0.0001674183877185;0.00058142159832641;5.5383097787853e-05;0.00065270258346573;-1.2974820492673e-05;0.0015490754740313;-0.00010018385364674;0.00017088053573389;-2.0930765458615e-05;0.00015951819659676;-1.0643968380464e-05;8.8662993221078e-05;-1.6507083273609e-05;5.8462050219532e-05;-2.1496154658962e-05;0.00017070598551072;1.7140753698186e-05;0.0018067136406898;-0.00019076172611676;0.00029990676557645;-0.00027166053769179;-0.00020149401098024;8.0657213402446e-05;-0.00018086047202814;-4.2402839426359e-06;4.2319195927121e-05;-4.4007636461174e-05;0.00029972853371873;-3.8059620237618e-06;-2.5514002118143e-05;0.00029128431924619;0.00039853775524534;-0.00061521999305114;8.1139871326741e-05;-0.0013045979430899;0.00020155678794254;-0.00040695531060919;2.8255342840566e-05;-0.00071484048385173;0.00014644541079178;0.00011690727842506;1.631723716855e-05;-5.978854096611e-05;-1.0835165994649e-05;2.723091711232e-06;-1.1755755622289e-05;0.00032586039742455;-0.00029466688283719;0.00022817266290076;-0.0002109978813678;0.00011120503768325;-0.00011328222899465;3.6378739878273e-06;5.404828243627e-06;-6.1106846260373e-05;8.2677739555947e-05;8.2280668721069e-05;-5.2358111133799e-05;-3.1688854505774e-05;3.173195727868e-05;2.9637347324751e-05;2.4734376893321e-06;-5.1277820602991e-05;-0.0010170429013669;0.00093063345411792;-0.00012511738168541;0.00021140126045793;-4.7321278543677e-05;-9.1665251602535e-06;-3.703667971422e-05;2.7893651349586e-05;5.3611861403624e-06;-9.7475622169441e-06;-3.7272093322827e-05;2.8744208975695e-05;5.7963466133515e-06;9.8877135314979e-06;-0.0002524470037315;-0.00023992305796128;-0.00031454765121453;-0.00016359443543479;-1.2714338481601e-05;4.6035998821026e-05;-3.8831822166685e-05;-5.5666827392997e-05;9.7538890258875e-05;6.4481828303542e-05;-0.00011486184666865;-9.3446986284107e-05;-4.1383846109966e-05;-2.0435263650143e-05;4.6645269321743e-05;-0.00052348448662087;0.00024980882881209;0.00068085978273302;0.00060544966254383;-0.00011836724297609;-0.00026874375180341;5.7167129853042e-05;3.6259785701986e-05;0.00019070040434599;0.00012520153541118;-3.1394250981975e-05;-3.2083089536172e-06;4.81530369143e-05;2.9064887712593e-05;2.7915439204662e-05;1.5984376659617e-05;-9.9921722721774e-05;-0.00010798971197801;-5.0710608775262e-05;-0.0001418492756784;0.00015934783732519;6.9527326559182e-05;-1.2614577826753e-05;1.1790781172749e-05;1.9488537873258e-05;2.4528759240638e-05;8.3342340076342e-05;3.5316232242621e-05;-6.3638086430728e-05;-5.2415391110117e-05;-9.4891642220318e-05;0.0013710336061195;0.00010837162699318;-3.7083511415403e-05;-4.9511691031512e-05;-0.00063857523491606;-0.00051111896755174;-7.7858851000201e-05;-7.7004779086565e-06;2.5689821995911e-05;7.615057984367e-05;-5.106483513373e-05;-4.0860857552616e-05;7.9436613305006e-06;1.3744507896263e-06;2.9899626952101e-06;-1.1741639355023e-05;0.00033047000761144;-0.00029098786762916;0.00023642076121178;-0.00020340041373856;0.00011065167200286;-0.00011360380449332;3.1428774036613e-06;4.6990367081889e-06;-6.275849591475e-05;8.225794590544e-05;8.4877487097401e-05;-4.9625563406153e-05;-2.8717955501634e-05;3.4521945053712e-05;1.8959861336043e-05;-1.7939915778697e-05;-5.190758020035e-05;-0.0010108057176694;0.00093901960644871;-0.00012062694440829;0.00021503410243895;-5.1037775847362e-05;-1.3920856872573e-05;-4.3179577914998e-05;2.2532749426318e-05;5.7991369430965e-06;-9.6464518719586e-06;-3.8737067370676e-05;2.7260488423053e-05;6.3033480728336e-06;9.3209846454556e-06;-0.00025218000519089;-0.00024128504446708;-0.00030968867940828;-0.00016822874022182;-1.65679211932e-05;4.9617829063209e-05;-3.8439491618192e-05;-5.6052493164316e-05;9.7112068033312e-05;6.5023406932596e-05;-0.00011448108125478;-9.4133662059903e-05;-3.9454389479943e-05;-2.2443384295912e-05;4.7456425818382e-05;-0.00052352948114276;0.00025050833937712;0.00066857342608273;0.00061761203687638;-0.00011001955135725;-0.00027791145839728;5.758189217886e-05;3.6310026189312e-05;0.00018831416673493;0.00012790605251212;-3.0971550586401e-05;-3.4599752325448e-06;4.7362082113978e-05;2.9844793971279e-05;2.6775271180668e-05;1.6983030945994e-05;-9.201055218e-05;-0.00011649989028228;-4.3449264921946e-05;-0.00014974798250478;0.00016215855430346;6.6444459662307e-05;-1.2955873899045e-05;1.2249418432475e-05;1.8278200514033e-05;2.6351135602454e-05;8.2358150393702e-05;3.560458208085e-05;-6.3815889006946e-05;-5.2498035074677e-05;-9.4586845079903e-05;0.0013712734216824;0.00010828866652446;-5.7506153098075e-05;-2.932616371254e-05;-0.00064327660948038;-0.00050621700938791;-7.6860436820425e-05;-7.9220462794183e-06;2.4183611458284e-05;7.830468530301e-05;-5.0326849304838e-05;-4.1879244236043e-05;8.4444018284557e-06;1.1812478533102e-06;-0.0001379448804073;0.00025903861387633;-3.3149939554278e-05;-0.0006929743103683;0.00020239868899807;-0.0011040997924283;0.00010343451140216;-9.9561148090288e-05;-3.549723624019e-05;4.6928438678151e-05;0.00013034866424277;-0.00061628804542124;2.3249645892065e-05;-0.00039063458098099;1.2113583579776e-05;-7.4127499829046e-05;0.00035580809344538;0.00013508925621863;-8.710481779417e-05;-0.00025977435871027;0.00011321809142828;-0.00018211963470094;0.00044463819358498;-8.3193008322269e-05;0.0016245153965428;-7.9824465501588e-05;0.0002950698544737;-4.3382493458921e-05;0.00012172113201814;5.4756446843385e-06;4.6628436393803e-05;-2.6682471798267e-05;8.2931932411157e-05;7.4476301961113e-05;-0.00028072093846276;6.9748741225339e-05;-0.00099224632140249;4.7547688154737e-05;6.1433143855538e-05;6.4655490859877e-05;-0.00011814948811661;2.9821305361111e-05;-0.00039329432183877;4.8476009396836e-05;-0.0004908312112093;-3.8765974750277e-05;0.00012483166938182;-6.768786261091e-05;-0.0001176787118311;-0.00011558276310097;-1.9316843463457e-05;0.00033574155531824;-6.5132800955325e-05;0.00045317676267587;-9.3879927590024e-05;0.0012664905516431;-1.5039558093122e-05;2.191146450059e-06;-2.1003750589443e-05;0.0001373107515974;-5.6874728215917e-07;5.7748635299504e-05;-4.6212040615501e-05;8.7509972217958e-05;4.9487657634018e-06;-2.6814133889275e-05;-6.7826811573468e-05;0.00098710309248418;-0.00015437613183167;7.3817645898089e-05;3.7819150747964e-05;-0.00012655655154958;3.7775080272695e-05;-0.00027941804728471;-1.7820138964453e-05;-0.00034134645829909;-3.4933100323542e-06;0.00017046231369022;6.722046964569e-05;0.00032753896084614;0.0003495919809211;7.1368759790857e-07;-0.00047771126264706;8.6904037743807e-06;-0.00087324570631608;-2.0678369764937e-05;0.00022098039335106;9.0870562416967e-05;-0.00020217687415425;-7.2237235144712e-06;0.0001580973766977;-6.3504621721222e-06;2.8110134735471e-05;-0.00031036476138979;0.00013992229651194;0.00099355634301901;7.2304232162423e-05;0.00142391549889;-0.00022055105364416;4.1705618059495e-05;-0.00014708915841766;4.5694778236793e-05;-3.8864236557856e-06;0.00088603008771315;-0.00013152114115655;0.00081722176400945;-4.4473283196567e-05;-1.5074509974511e-05;1.3888459761802e-05;-0.00051409931620583;-0.000221466543735;0.00012987853551749;-1.3269402188598e-05;0.00029753736453131;-0.00055661442456767;0.00025325734168291;-0.0025371755473316;7.7767406764906e-05;-0.0002698544121813;8.7142529082485e-05;-0.00020591482461896;5.9242578572594e-05;-0.00014291334082372;-4.7966941565392e-06;3.7603018427035e-05;1.1474327948235e-05;-0.00023491171305068;0.00010157733777305;-0.0015040074940771;5.896031143493e-05;-4.2752257286338e-05;8.2535079855006e-05;-8.7948705186136e-05;5.5898377468111e-05;-0.00039081889553927;-8.521405106876e-06;-0.00067468907218426;7.2465409175493e-05;4.5762310037389e-05;-3.3749944122974e-05;-0.00020613058586605;-0.00024929604842328;-0.00017124504665844;0.00055599480401725;4.5304641389521e-05;0.00072143820580095;-6.5762258600444e-05;0.0015053403330967;-9.3077891506255e-05;0.00028964271768928;-3.5808741813526e-05;0.00010404134081909;-1.0415007636766e-05;0.00013865379150957;-1.7556920283823e-05;0.00012998926104046;-4.7683301090728e-05;8.7258697021753e-05;3.9359445509035e-05;0.0012854584492743;-0.00015083311882336;0.00024841126287356;-0.00022218782396521;-0.00019691411580425;8.2392230979167e-05;-0.00043955430737697;1.842889105319e-05;-0.00013858950114809;-2.3934084310895e-05;0.00028189990553074;-1.3921539903095e-05;-5.9330497606425e-05;0.00024382658011746;0.00033078817068599;-0.00048359320499003;8.5577099525835e-05;-0.0010244944132864;0.00014348294644151;0.00012557038280647;-1.2750683708873e-05;-0.00056763848988339;0.00012774653441738;0.00018779780657496;5.9842759583262e-06;-3.2050957088359e-05;-1.0495879905648e-05;-0.00021577610459644;8.3624770923052e-05;0.00081341143231839;7.4612900789361e-05;0.00092529290122911;-7.7499949838966e-05;-0.00013435450091492;-9.2483016487677e-05;0.00021266375551932;-7.7789685747121e-05;0.00093292607925832;-9.0284098405391e-05;0.0010838309535757;-5.3214353101794e-05;-0.00021449240739457;5.7385328545934e-05;-0.00046546277008019;-0.00047424391959794;3.181280408171e-05;0.00052471819799393;0.00016468969988637;-0.00016797971329652;0.00025247648591176;-0.00280333426781;5.2548159146681e-05;4.3382082367316e-05;6.6656352828431e-06;-0.00024408967874479;5.4421801905846e-05;-0.00020727088849526;3.8124019283714e-06;-0.00016007084923331;0.00011905575229321;0.00072967307642102;0.00019949344277848;-0.0017277498263866;-0.00010784985352075;-0.00020787875109818;7.2710528911557e-05;3.0961025913712e-05;6.1409314184857e-06;-0.00027044626767747;-9.8829288617708e-05;-0.0004603250999935;6.5760294091888e-05;-0.00015651009744033;-2.6670097213355e-05;-0.00082102615851909;-0.0003997471940238;-0.00014535916852765;0.00062972027808428;0.00040360129787587;0.00086223689140752;-4.1307175706606e-05;0.00066979276016355;-8.5465457232203e-05;0.00069233035901561;1.8746908608591e-05;9.5083109044936e-05;2.9211081709946e-05;0.00011434256884968;-2.9625103707076e-05;0.00014453353651334;-2.8112663130742e-06;0.00033416535006836;0.00024386648146901;0.0012689030263573;-0.00032178976107389;0.00032823174842633;-0.00039172370452434;-0.00022147755953483;0.00013469689292833;-0.00057333224685863;-7.432269921992e-05;0.00022735446691513;1.3761041373073e-05;0.00037312731728889;1.0464116257936e-06;-0.00068870937684551;-0.00051128916675225;0.00026725788484327;0.00043680553790182;0.00034172006417066;-0.00099991983734071;0.00062071258435026;-0.00034528964897618;-5.5621570936637e-05;-0.0007810031529516;0.00016566559497733;0.00026051187887788;4.4491716835182e-05;-0.00019236232037656;-4.7199173422996e-05;-0.0001608477323316;6.0910966567462e-05;0.00059366825735196;5.1406128477538e-05;0.0006612270954065;-4.5562996092485e-05;-0.00011150459613418;-6.2902887293603e-05;0.00016901294293348;-6.2433566199616e-05;0.00072181678842753;-6.5289561462123e-05;0.00082800525706261;-4.1530212911312e-05;-0.00017332701827399;4.5081636926625e-05;-0.00033615090069361;-0.00036637595621869;1.5461779184989e-05;0.00042625603964552;0.00011098039976787;-9.6016170573421e-05;0.00018302649550606;-0.0021338569931686;4.0119761251844e-05;5.3246643801685e-05;-1.2758678167302e-06;-0.00019145173428115;4.0419399738312e-05;-0.00015653048467357;4.4171029003337e-06;-0.00012489085202105;9.3000118795317e-05;0.0005897264345549;0.00015601464838255;-0.0013423090567812;-8.9305322035216e-05;-0.00016101179062389;5.1379258366069e-05;2.4799997845548e-05;4.3594213821052e-06;-0.00022004274069332;-7.7291559136938e-05;-0.000347808963852;4.9189166020369e-05;-0.00012189719564049;-1.9851477190969e-05;-0.00065095227910206;-0.00031925912480801;-0.00010867299715756;0.00049638247583061;0.00032163091236725;0.00066303391940892;-2.4992756152642e-05;0.00050478609045967;-6.5411775722168e-05;0.00053854921134189;1.7523325368529e-05;7.963739335537e-05;2.367466368014e-05;8.318623440573e-05;-2.317530925211e-05;0.00010917392501142;8.8535864506412e-07;0.00025605558766983;0.00019562702800613;0.00099510280415416;-0.00025201353128068;0.00025545514654368;-0.0003111224505119;-0.0001701025175862;0.00010496644972591;-0.00042711634887382;-6.2111226725392e-05;0.00019594823243096;1.2346001312835e-05;0.00028819657745771;3.5152663713234e-06;-0.00055327324662358;-0.00043240105151199;0.00020665190822911;0.00039254489820451;0.00026753256679513;-0.00078010174911469;0.0005025144200772;-0.00031151541043073;-4.3571140849963e-05;-0.00061053084209561;0.0001269759668503;0.00019598017388489;3.613626176957e-05;-0.00015319621888921;-3.8552785554202e-05;1.6144980691024e-05;-2.5375835321029e-05;0.00028045909130014;-0.00026204172172584;0.00028430970269255;-0.00021791354811285;3.0682298529427e-05;-1.9702636564034e-05;1.2317933396844e-05;-6.072405994928e-06;-6.4086125348695e-05;8.8129243522417e-05;8.3899933088105e-05;-5.0765858759405e-05;7.6443147918326e-06;-4.8336146392103e-06;5.0249971536687e-05;4.7372453991557e-05;-3.6436129448703e-05;-0.0011975185479969;0.0010597036452964;5.7607558119344e-05;-3.6664703657152e-05;-1.2701280866168e-05;-4.8052137572085e-05;-8.2209640822839e-05;5.8595069276635e-05;9.2953823696007e-06;-1.1399142749724e-05;-5.1569681090768e-05;4.0931416151579e-05;-1.5180111404334e-05;-6.5958374761976e-07;-0.00031337057589553;-0.00031681917607784;-0.00036322500091046;-0.00022117479238659;-8.0297293607146e-05;-1.1944287507504e-05;-2.7654103178065e-05;-4.9225956900045e-05;0.00011457570508355;7.0601599873044e-05;-0.00014104654837865;-0.00011905649444088;-3.8665337342536e-05;-1.7834354366641e-05;0.00034556980244815;-0.00070741632953286;0.00023400770442095;0.00056164839770645;0.00051382201490924;5.8478606661083e-05;-9.5468320068903e-05;0.00010732332157204;9.9641634733416e-05;0.00022148294374347;0.00014887543511577;-3.2435906177852e-05;-3.3940095818252e-06;4.8070356569951e-05;3.0770661396673e-05;2.7898655389436e-05;1.8848277250072e-05;-0.00028325992752798;-0.0002791668230202;-0.00017167621990666;-0.00022626279678661;0.0001456791505916;7.151800673455e-05;-9.1942947619827e-06;1.2527893886727e-05;5.7369630667381e-05;6.3108614995144e-05;5.7634508266347e-05;1.5782645277795e-05;-8.4291168604977e-05;-7.178799569374e-05;-5.6373577535851e-05;0.0009092750842683;0.00011989581253147;0.00030698493355885;0.00026095737121068;-0.00053941772785038;-0.00043859778088517;-3.1237770599546e-05;2.6082341719302e-05;7.1845126512926e-05;0.00010609333548928;-6.8893932620995e-05;-6.0469363234006e-05;2.7640066036838e-05;2.1487936464837e-05;1.6220921679633e-05;-2.5236598958145e-05;0.00029044019174762;-0.00025507246027701;0.0002895972575061;-0.00021288779680617;2.9932574761915e-05;-2.1150688553462e-05;1.1793869816756e-05;-6.5676485974109e-06;-6.750851025572e-05;8.6488944361918e-05;8.6206833657343e-05;-4.7999321395764e-05;1.0373420082033e-05;-1.9884498669853e-06;3.2155894587049e-05;2.6027189960587e-05;-3.6448833270697e-05;-0.0011886676074937;0.0010704882442951;6.1827049648855e-05;-3.1438441510545e-05;-1.6445304936497e-05;-5.2759463869734e-05;-8.7082757090684e-05;5.4112795623951e-05;1.0446682608745e-05;-1.0774170732475e-05;-5.3162057156442e-05;3.907831342076e-05;-1.3922261132393e-05;-1.6074694713097e-06;-0.00031728012254462;-0.00031475050491281;-0.00035691732773557;-0.00022807282221038;-8.3025704952888e-05;-8.964757398644e-06;-2.7843589123222e-05;-4.9049533117795e-05;0.00011484119750094;7.0385809522122e-05;-0.00014104240108281;-0.00011922275734833;-3.6318182537798e-05;-2.043899075943e-05;0.00034406108898111;-0.00070860993582755;0.00023465126287192;0.00055429997155443;0.00052557489834726;6.4014144300018e-05;-0.0001021554635372;0.00010891623969655;9.8758428066503e-05;0.00021786545403302;0.00015267160779331;-3.2398274925072e-05;-3.3628932669671e-06;4.7580346290488e-05;3.1362505978905e-05;2.6940921088681e-05;1.9714156223927e-05;-0.00027217975002714;-0.0002881602558773;-0.00016122189117596;-0.00023470987798646;0.00014689961972181;7.1288472099695e-05;-9.5904779300326e-06;1.2846762729168e-05;5.5886135669425e-05;6.5034153521992e-05;5.6816305004759e-05;1.6094971215352e-05;-8.3328661276028e-05;-7.307071791729e-05;-5.6407276133541e-05;0.0009150646510534;0.00012022165901726;0.00027641883934848;0.00028507137903944;-0.00054169236682355;-0.00044068766874261;-3.0564791813958e-05;2.5445853680139e-05;6.8942426878493e-05;0.00010903540533036;-6.79327204125e-05;-6.1639606428798e-05;2.765271710814e-05;2.1811560145579e-05;-7.2505317803007e-05;0.00016131234588102;-1.2609763871296e-05;-0.00049482873873785;6.7474611569196e-06;-0.00039515030221082;8.664816050441e-06;0.00015871661889832;8.2309590652585e-05;-0.00021316773199942;7.3911200161092e-05;-0.00067291926825419;4.7877889301162e-05;-0.00076319609070197;-5.2460323786363e-05;0.00023813564621378;0.00026681090821512;0.00037782199797221;4.1109233279712e-05;-7.84370713518e-05;-0.0004719614807982;-0.00012446820619516;-9.6437208412681e-05;-6.9713474658784e-05;0.0018740928499028;3.4204429539386e-05;-0.00013879720063414;-4.2663989006542e-05;0.00021969735098537;-5.2471641538432e-06;0.00011315099254716;0.00013497329200618;-0.00016457008314319;0.00020279435557313;0.00081278436118737;-0.0001656233362155;-0.0013940470525995;2.4590312023065e-05;-0.0001847080711741;-4.6009995458007e-06;5.1577222620836e-05;-0.0001251268258784;-0.00024891950306483;5.0320046284469e-05;-0.00028474500868469;-1.6759722711868e-05;-0.00015728225116618;-0.00084440829232335;-0.00040201071533374;-9.512880933471e-05;0.00045014676288702;0.00055422593140975;1.822865124268e-05;0.00069308298407122;-6.5623433329165e-05;0.00033880650880747;4.6927591029089e-05;0.0005893976194784;3.7157256883802e-05;0.00012501551827881;-2.886004949687e-05;5.238564699539e-05;3.1489151297137e-05;7.6724005339202e-05;0.00028787393239327;0.0002047642483376;-0.00027918658452109;0.00091095577226952;-0.00033381872344762;0.00023365850211121;0.00010959945211653;-0.00017954924260266;-0.00012155513104517;-0.00032478253706358;3.503542393446e-05;0.00018011670908891;6.5602066570136e-06;0.00030581949977204;-0.00070771906757727;-0.00060041877441108;0.00023550134210382;0.00029787307721563;0.00071161688538268;0.00057334813755006;-0.00080575770698488;-6.5209067543037e-05;-0.00036760486545973;0.00013221231347416;-0.00055744993733242;5.3662752179662e-05;0.00017278600716963;-5.1966340834042e-05;-0.00016457951278426;-9.0750523668248e-05;0.00019676456577145;-2.2497024474433e-05;-0.00063423992833123;4.2872998164967e-05;-0.00060314184520394;3.2778811146272e-05;0.00016013439744711;8.9301574917044e-05;-0.00023418436467182;9.5406707259826e-05;-0.00078473909525201;5.823827086715e-05;-0.0009158420143649;-5.9044581576018e-05;0.00025373106473126;0.00034356515971012;0.00043336569797248;2.4296859919559e-05;-0.00012300824164413;-0.00049349869368598;-0.00017614832904655;-1.801983853511e-05;-8.6716041550972e-05;0.0022556025069207;2.247983320558e-05;-0.00010348638897995;-5.35798681085e-05;0.00025102533982135;-4.0780387280392e-06;0.00014341104542837;0.00015585428627674;-0.00019474283908494;0.00022537031327374;0.00093263341113925;-0.00018078189168591;-0.0015654932940379;4.3751133489423e-05;-0.00021654705051333;-5.5880668696773e-06;5.8631998399505e-05;-0.00014168486814015;-0.00026495908969082;5.9233523643343e-05;-0.00033181163598783;-2.3264326955541e-05;-0.00017658402794041;-0.00094554742099717;-0.00041724665788934;-0.00011419619841035;0.0005094658699818;0.00056977575877681;-1.0640886102919e-05;0.00080229731975123;-7.5683245086111e-05;0.00038167700404301;5.0544913392514e-05;0.00066636083647609;4.07029328926e-05;0.00013323411985766;-3.0960080039222e-05;6.6198183048982e-05;3.1819072319195e-05;9.2533395218197e-05;0.00031439983285964;0.0002629344817251;-0.00032528550946154;0.0010169807355851;-0.00037258397787809;0.00026484811678529;0.00012566741497722;-0.00020903423137497;-0.00012985299690627;-0.00042219550232403;3.6096727853874e-05;0.00017251443932764;1.8447801721777e-06;0.00035444772220217;-0.00079010881017894;-0.00063426326960325;0.00026949791936204;0.00035380010376684;0.00071944145020097;0.00062635424546897;-0.00090880581410602;-7.2425085818395e-05;-0.00034372755908407;0.00015818979591131;-0.00062829779926687;5.7971072237706e-05;0.00021960109006613;-5.5842177971499e-05;-0.00018651972641237;-0.0001294578978559;0.00024398717505392;-3.8112928450573e-05;-0.00077279435936362;0.0002078254474327;-0.0011224393965676;0.0001087722266675;-3.2518830266781e-05;1.0871396625589e-05;-4.9364545702701e-05;0.00013258772378322;-0.0006346195586957;4.6840799768688e-05;-0.00063766294624656;-1.1863525287481e-05;2.8764412491e-05;0.00039499110425822;0.00015671418805141;-0.00010279341950081;-0.00026072477339767;5.4442640248453e-05;-0.00019739827257581;0.00045347824925557;-9.8702366813086e-05;0.0018959476146847;-7.738170097582e-05;0.00021575689606834;-5.5696054914733e-05;0.00016112173034344;4.0020322558121e-06;0.00010542687959969;3.3008625905495e-05;-1.8412525605527e-05;0.00010701333667384;7.9279547207989e-05;1.7068658053176e-05;-0.0010997445788234;6.5753098169807e-05;-7.0364752900787e-05;3.1021154427435e-05;-4.2071482312167e-05;-2.3302820409299e-05;-0.00025336514227092;5.6707805924816e-05;-0.00043488427763805;-2.9100709070917e-05;-3.369176738488e-06;-0.00029386792448349;-0.00018253132293466;-0.00011384228128009;0.00012155211879872;0.00036148462095298;-7.989100413397e-05;0.00057192373787984;-8.6351741629187e-05;0.00085450574988499;-1.1277896192041e-05;0.00027682408108376;-3.7319618968468e-06;9.4359646027442e-05;-1.1091838132415e-05;8.6699234088883e-05;-3.1956886232365e-05;9.8592696303967e-05;8.2435355579946e-05;8.664825145388e-05;-0.00012684414105024;0.00075730890966952;-0.00017151261272375;0.00013313752424438;6.5213702328037e-05;-0.00015153606364038;4.3511327021406e-06;-0.00039204946369864;-1.2203771575514e-06;-0.00018176065350417;-1.5637173419236e-05;0.0002297478786204;-0.00016494348528795;8.9884830231313e-05;0.00026094389613718;0.00010589402518235;-0.00017738375754561;0.00012523451005109;-0.00070677837356925;-4.1700564906932e-05;0.00019601456006058;0.00010483602090972;-0.00031952501740307;4.6218251554819e-06;0.00019491539569572;-1.2654436432058e-05;-4.4277563574724e-05;-0.00025136442855;9.2271613539197e-05;0.0011813340242952;8.543417789042e-05;0.0017764384392649;-0.00018962062313221;-5.4999425628921e-05;-0.00019750028150156;0.00020113654318266;-7.3950599471573e-05;0.0010418588062748;-0.00010703261796152;0.0014152374351397;-9.058287832886e-05;-0.000158672730322;6.2094812165014e-05;-0.00058096926659346;-0.00040162395453081;0.00017017984646372;0.00026140126283281;0.00026254946715198;-0.00065544905373827;0.00035481568193063;-0.0036236743908376;8.4099076048005e-05;-0.0002116640098393;7.5220261351205e-05;-0.00023808571859263;7.157119398471e-05;-0.00030707070254721;6.6180064095533e-06;-0.00028121322975494;0.00016827379295137;0.0010040015913546;0.00017860291700345;-0.0016387023497373;-0.00012006257747998;-0.00025295931845903;0.00013430367107503;5.237936420599e-05;-1.0311847290723e-05;-5.6789969676174e-05;-0.00012252751912456;-0.00046116183511913;5.987191980239e-05;-0.00020540396508295;-4.1151346522383e-05;-0.00086126202950254;-0.00020409049466252;-0.00013368522922974;0.00033086919574998;0.00045853899791837;0.00087495753541589;-0.00018882300355472;0.00040322222048417;-6.6100299591199e-05;0.00076944992179051;2.6085252102348e-05;9.3212174760993e-06;3.4796874388121e-05;0.00016184998094104;-2.2279526092461e-05;0.00022443715715781;-2.4507695343345e-05;0.00043740641558543;0.00027250524726696;0.00075683364411816;-0.00033099635038525;0.00027804149431176;-0.00034541677450761;-0.00023327590315603;0.00014575323439203;-0.0010452867718413;-5.2565079386113e-05;-3.0998730835563e-06;3.3981741580646e-05;0.00038999240496196;-2.2691714548273e-05;-0.00081642949953675;-0.00051414989866316;0.00021509705402423;0.00042754062451422;0.00044012442231178;-0.00073959119617939;0.00054528523469344;0.00030441302806139;-0.00010159634257434;-0.00064851035131142;0.00017405243124813;0.00043852854287252;3.3938737033168e-05;-0.00019396169227548;-4.5852320909034e-05;-0.00026226320187561;9.3643488071393e-05;0.0011558755068108;8.3324397564866e-05;0.0016690465854481;-0.0001495591859566;-0.0001066247059498;-0.00018101419846062;0.00024943289463408;-9.2685753770638e-05;0.0011773682199419;-0.00010802274482558;0.0015238706255332;-9.263710671803e-05;-0.00021963119797874;7.5097515946254e-05;-0.00058113288832828;-0.00051723216893151;0.00012925373448525;0.00046541367191821;0.00023017804778647;-0.00052514474373311;0.00036970790824853;-0.0038742844481021;8.5505940660369e-05;-0.00012256007175893;4.761522723129e-05;-0.00028535499586724;7.3552924732212e-05;-0.000319417740684;8.6785739767947e-06;-0.00029617754626088;0.00018416064267512;0.0011873280163854;0.00022004720813129;-0.0019302129512653;-0.00015426916070282;-0.00028502233908512;0.00013260409468785;6.0777532780776e-05;-9.2042746473453e-06;-0.00016557764320169;-0.00013792930985801;-0.00049949897220358;6.7729662987404e-05;-0.00022750344942324;-4.4313404941931e-05;-0.0010421263286844;-0.00030321633676067;-0.00015472987433895;0.00046064201160334;0.0005510076880455;0.0010110028088093;-0.00016940345813055;0.00048634415725246;-8.2172467955388e-05;0.00087718520080671;3.7155987229198e-05;5.6812263210304e-05;4.1275412513642e-05;0.00015482147864532;-2.7536534616956e-05;0.00022331799846143;-1.0661237865861e-05;0.00050454417942092;0.00032443823874928;0.0010865010553971;-0.00040182832162827;0.00034454936394468;-0.00044172460911795;-0.00026488283765502;0.00016852664703038;-0.001034451299347;-8.2401697000023e-05;0.0001270796492463;3.5088996810373e-05;0.00045005293213762;-1.267570314667e-05;-0.00097214867128059;-0.00069142156280577;0.0002681567275431;0.00061423721490428;0.00050457462202758;-0.0009639942436479;0.00072255387203768;2.0450381271075e-05;-0.00010111074516317;-0.00081530190072954;0.0002022169646807;0.00044931392767467;4.8570731451036e-05;-0.0002427247382002;-5.884585698368e-05;-0.00015740656817798;5.3669846238336e-05;0.00068575440673158;4.4052769226255e-05;0.0010006388183683;-7.580709643662e-05;-7.6895747042727e-05;-0.00010558392386883;0.0001643294817768;-6.1672180891037e-05;0.00075110583566129;-6.2112267187331e-05;0.00096077675698325;-5.9878861065954e-05;-0.00014798181655351;4.9132173444377e-05;-0.00033541541779414;-0.00033310748403892;7.0774534833618e-05;0.00032609325717203;0.00012341326510068;-0.00029313407139853;0.00022277024982031;-0.0024299495853484;5.3952426242176e-05;-5.6499953643652e-05;2.1745041522081e-05;-0.00018478691345081;4.4539341615746e-05;-0.00020003496319987;7.5186590038356e-06;-0.00019165562116541;0.00011859879305121;0.00080098392209038;0.00014154690143187;-0.0012314716586843;-0.00010596703941701;-0.00018151754920837;8.0020588939078e-05;3.9499340346083e-05;-6.4019836827356e-06;-0.0001203819483635;-8.8434411736671e-05;-0.00030555838020518;4.0400907892035e-05;-0.00014482086407952;-2.8103593649575e-05;-0.00068446039222181;-0.00019637931836769;-9.3214795924723e-05;0.00028979958733544;0.0003641648509074;0.00063760456396267;-0.00010459340410307;0.00028760032728314;-5.1323946536286e-05;0.00056007225066423;2.8347109036986e-05;4.4503383833217e-05;2.7555623091757e-05;9.0874134912156e-05;-1.7287329683313e-05;0.00013755405962002;-1.711342292765e-06;0.00032757854205556;0.00021449780615512;0.00071373430546373;-0.00026317784795538;0.00022191468451638;-0.00029341373010539;-0.00016781005251687;0.00010875969019253;-0.00064455711981282;-5.9005360526498e-05;0.00010648398165358;2.3979280740605e-05;0.00028756601386704;-4.7549774535582e-06;-0.00064951932290569;-0.00048918771790341;0.00017211931117345;0.00045755377504975;0.00033048604382202;-0.00062590150628239;0.00049125344958156;-4.4401378545444e-05;-6.3966253947001e-05;-0.00052911078091711;0.00012871476064902;0.00028273582574911;3.3416621590732e-05;-0.00016169066657312;-4.0140104829334e-05;3.5080960515188e-05;-4.2710886191344e-05;0.0001457243488403;-0.00016251222405117;0.00033644659561105;-0.00022016162984073;-3.78568583983e-05;6.5202119003516e-05;1.5600642655045e-05;-1.2447384506231e-05;-4.6981669584056e-05;7.6534553954843e-05;7.9156343417708e-05;-4.2090465285582e-05;4.6623641537735e-05;-4.0832368540578e-05;8.3246442954987e-05;9.0081935923081e-05;-2.462457450747e-05;-0.0012982541229576;0.0011094013461843;0.00020670804951806;-0.00024720528745092;4.3214775359957e-05;-0.00010151940659853;-0.00012996427540202;8.7758984591346e-05;3.5839116208081e-06;-4.8352771955251e-06;-6.0960490372963e-05;4.8592315579299e-05;-4.492291554925e-05;-1.7077227312257e-05;-0.00033796310890466;-0.00037451271782629;-0.00029645484755747;-0.00018315648776479;-0.00012254317698535;-4.9524493078934e-05;-2.0241812308086e-05;-4.6471031964757e-05;0.0001299133291468;7.3858114774339e-05;-0.00015322865510825;-0.0001382557238685;-2.3033040633891e-05;-2.5490635380265e-06;0.00078123860293999;-0.00065265560988337;0.00020769484399352;0.00021748257859144;0.0002223280898761;0.00015686622646172;6.3809980019869e-06;0.00013172037142795;0.00015209140838124;0.00020795725868084;0.00013701945135836;-3.1426883651875e-05;-7.5672761568057e-07;4.2163719626842e-05;2.8058539101039e-05;1.4174689567881e-05;1.3281870451465e-05;-0.00051675899885595;-0.00049362727440894;-0.00033647302188911;-0.00034938668250106;9.5823270385154e-05;2.8365171601763e-05;-7.2984585131053e-07;1.6909634723561e-05;0.00010471133282408;0.00010602740076138;1.9644301573862e-05;-1.5359417375294e-05;-9.8323296697345e-05;-7.9217446909752e-05;7.3555391281843e-05;0.00026578400866129;0.0001058592897607;0.00069880188675597;0.0005949018523097;-0.00033048450131901;-0.00023695999698248;4.1203671571566e-05;8.6780972196721e-05;0.00012826349120587;0.00014227733481675;-8.4634317317978e-05;-7.6163101766724e-05;4.4941585656488e-05;3.6810753954342e-05;3.4216551284771e-05;-4.1993414924946e-05;0.00016791095549706;-0.00014957755047362;0.00033702308428474;-0.00021798296074849;-3.7744928704342e-05;6.1118036683183e-05;1.4806902072451e-05;-1.2499621334428e-05;-5.3388826927403e-05;7.287828339031e-05;8.1310361565556e-05;-3.8512083847309e-05;4.8727666580817e-05;-3.7377158150775e-05;4.9606809625402e-05;6.404597661458e-05;-2.4285182007588e-05;-0.001279181567952;0.0011211698874831;0.00020849618886132;-0.00023576177773066;3.708769872901e-05;-0.00010651951015461;-0.00013283101725392;8.3699880633503e-05;5.9770136431325e-06;-3.5519769880921e-06;-6.2582461396232e-05;4.5714812586084e-05;-4.1928738937713e-05;-1.8352347979089e-05;-0.00034892620169558;-0.00036465976154432;-0.00028913686401211;-0.00019250668992754;-0.00012300058733672;-4.6913977712393e-05;-2.1228359400993e-05;-4.5243843487697e-05;0.00013078148185741;7.2143506258726e-05;-0.00015379933756776;-0.00013646291336045;-2.023216438829e-05;-6.1542104958789e-06;0.00076840061228722;-0.00065525906393304;0.00020755156583618;0.00022213424381334;0.00023621592845302;0.00015839400293771;1.9857047846017e-06;0.00013616911019199;0.00014782090147492;0.00020220818987582;0.00014185829786584;-3.196424950147e-05;-3.1916385978548e-07;4.2305069655413e-05;2.8119849957875e-05;1.3994039363752e-05;1.3651666449732e-05;-0.00049667514394969;-0.00049888878129423;-0.0003162840148434;-0.00035733997356147;9.6156480140053e-05;3.1945117370924e-05;-1.4942618236091e-06;1.7028229194693e-05;0.00010226698213955;0.00010720138379838;1.8959557564813e-05;-1.4610270227422e-05;-9.5366965979338e-05;-8.1921723904088e-05;7.1602014941163e-05;0.00028751094941981;0.00010667139576981;0.0006431583315134;0.00061985017964616;-0.00033307448029518;-0.00024931048392318;4.1027549741557e-05;8.4440063801594e-05;0.00012182318459963;0.00014599968562834;-8.3101076597814e-05;-7.6997544965707e-05;4.43114877271e-05;3.7466372305062e-05;-7.8709788795095e-05;0.00018431473290548;-6.906773251103e-06;-0.0006452954839915;4.6854689571774e-05;-0.00075079698581249;4.9605387175689e-05;0.00014440917584579;9.0747322246898e-05;-0.00023241837334353;8.3375234680716e-05;-0.00078495126217604;7.2203132731374e-05;-0.00096626445883885;-6.1167156673037e-05;0.00024191543343477;0.00030640882323496;0.00039503254811279;-6.0555071286217e-06;-0.00010923084482783;-0.00043349506449886;-0.00018122525943909;7.963821553858e-05;-9.6015442977659e-05;0.0023555266670883;1.2635896382562e-05;-5.659608359565e-05;-5.2837403927697e-05;0.0002451027976349;-8.3105114754289e-06;0.00016250637418125;0.00017589097842574;-0.00023982241691556;0.00021154184651095;0.0010894434526563;-0.00020282361947466;-0.0014802510850132;5.6926026445581e-05;-0.00023165608581621;-1.4021288734511e-05;7.1932394348551e-05;-0.00015157359302975;-0.0002060629776679;5.0156730139861e-05;-0.00029112806078047;-2.7492969820742e-05;-0.0001941400259966;-0.00097494747024029;-0.00034491188125685;-0.00010183116683038;0.0005495268269442;0.00043052341789007;-5.1857605285477e-05;0.00077880173921585;-6.0418686189223e-05;0.00022134486061987;6.1898317653686e-05;0.00067850359482691;4.4314463593764e-05;0.00011261923646089;-2.715357732086e-05;6.6668595536612e-05;3.4343822335359e-05;0.00010501863289392;0.00033220375189558;0.00030083960155025;-0.00033122667809948;0.00080567412078381;-0.00036233608261682;0.00023369233531412;0.00012592921848409;-0.00020002595556434;-0.00013268704060465;-0.00053459330229089;4.7232046199497e-05;0.0001282996381633;-1.6205663655455e-07;0.00034448449150659;-0.00087015016470104;-0.00071590894367546;0.0002387239219388;0.00040052342228591;0.00082397687947378;0.00063415989279747;-0.00077935890294611;-8.8143213361036e-05;-0.00020498120284174;0.00015425872697961;-0.00056095659965649;5.7340097555425e-05;0.00026563153369352;-5.8853282098426e-05;-0.0001929487043526;-0.00011718479072442;0.00026959905517288;-2.797162051138e-05;-0.0010808346560225;0.00014594552339986;-0.0014285903889686;0.00012210683780722;0.00014911421749275;0.0001151131655206;-0.00029709728551097;0.00013071268040221;-0.0010788318468258;0.00011288922542008;-0.0014371095458046;-7.9654142609797e-05;0.00028351758373901;0.00051138579146937;0.00049829942872748;-7.9812380135991e-05;-0.00022794742835686;-0.00043725268915296;-0.0003047841892112;0.00036264999653213;-0.00014487076259684;0.0035206493921578;-2.877267797885e-05;5.8143556088908e-05;-8.2224192738067e-05;0.00031591311562806;-1.0151135938941e-05;0.00026705005438998;0.00025512237334624;-0.00036705550155602;0.0002738113689702;0.0015354105271399;-0.00026762241031975;-0.0019240702968091;0.00010875066800509;-0.0003304296405986;-2.3516939108958e-05;0.00010174553608522;-0.00021269066201057;-0.00017115547962021;6.826568278484e-05;-0.00040528943645768;-4.513618114288e-05;-0.00027532837702893;-0.0013020429760218;-0.0003605381352827;-0.00013592257164419;0.00074818526627496;0.00042818480869755;-0.00014498895325232;0.0010537455091253;-7.6267453550827e-05;0.00020875528571196;8.2574428233784e-05;0.00092774821678177;6.0160251450725e-05;0.00010224798461422;-3.2963336707326e-05;0.00012031040387228;3.2269163057208e-05;0.00017313715943601;0.00043805650784634;0.00047544465633109;-0.00045003881677985;0.00088256713934243;-0.00045509391929954;0.0002891473704949;0.0001724906032905;-0.00027663380024023;-0.00015639991033822;-0.00093042571097612;6.6665023041423e-05;5.2199608035153e-05;-1.6083444279502e-05;0.00047558237565681;-0.0011851710733026;-0.00088809669250622;0.00030297809280455;0.00058659230126068;0.0009743485134095;0.00077824998879805;-0.00093570078024641;-0.00013627397129312;3.2397674658569e-05;0.0002174629480578;-0.00069747352972627;6.7888468038291e-05;0.00044015515595675;-7.3369832534809e-05;-0.00025687136803754;-0.00012549334496725;0.00027584284543991;-5.3290310461307e-05;-0.0012705873232335;0.00025029334938154;-0.001812132075429;0.00017573396326043;6.8975627073087e-05;8.8487759057898e-05;-0.00023151240020525;0.00014538732648361;-0.00096643931465223;0.0001189293252537;-0.0014130766503513;-6.025687980582e-05;0.00018580161849968;0.00060254731215537;0.00035189729533158;-0.00017329848196823;-0.00032979025854729;-0.00013607648725156;-0.00032430456485599;0.00066863116808236;-0.00014724278298672;0.0035313384141773;-9.4545357569586e-05;0.00022766548499931;-8.8067070464604e-05;0.00025186143466271;-8.0577792687109e-06;0.00029077829094604;0.00023424568644259;-0.00035614892840385;0.0002236329310108;0.0012959324521944;-0.00020244787447155;-0.0016271224012598;0.00012594771396834;-0.00029877413180657;-2.1086249034852e-05;8.1519676314201e-05;-0.00018778965750244;-4.811145572603e-06;6.3263403717428e-05;-0.00041758173028938;-4.5558052079286e-05;-0.00024913490051404;-0.0010683350265026;-0.00020873021276202;-0.00011285390792182;0.0006153792492114;0.00025801415904425;-0.00020515837240964;0.00091696053277701;-6.5298918343615e-05;0.00017046375432983;6.2004670326132e-05;0.00082218047464266;4.9986454541795e-05;1.6999223589664e-05;-2.588674215076e-05;0.00016018787573557;-1.7071296269933e-06;0.0002037094818661;0.00035745330387726;0.00045217960723676;-0.00036699665361084;0.00050746952183545;-0.00033718426129781;0.00021474109962583;0.00015192820865195;-0.00025283632567152;-9.2007692728657e-05;-0.0010815889108926;6.198235496413e-05;-0.00014655524864793;-3.6526704207063e-05;0.0004290597862564;-0.00098955677822232;-0.00060906133148819;0.00024541560560465;0.00053126981947571;0.00062075169989839;0.00053242867579684;-0.00067222828511149;-0.00014741756604053;0.00049249682342634;0.00019407655054238;-0.00052683119429275;4.117191201658e-05;0.00048115040408447;-5.2799419790972e-05;-0.00020398727792781;-0.00010759936412796;0.00021920545259491;-4.9961050535785e-05;-0.00098140956833959;0.00023553664505016;-0.0014316289452836;0.00014224846381694;-3.1209237931762e-06;3.8263697206276e-05;-0.00010432073031552;0.00012024945317535;-0.00062752986559644;7.82608622103e-05;-0.00088477967074141;-2.4243752704933e-05;6.329740426736e-05;0.00046907278010622;0.00012950303789694;-0.00017128675244749;-0.00029414024902508;0.0001113008838729;-0.00021177904272918;0.00062234856886789;-0.00010461235797266;0.0023664296604693;-0.00010334179387428;0.0002416585048195;-6.4235078752972e-05;0.00014452580944635;-2.6638949748303e-06;0.00018475178512745;0.00011810073192464;-0.00017937524535228;0.00012139388127252;0.00051499897381291;-5.5971795518417e-05;-0.0010597452055663;8.5397914517671e-05;-0.00016139805666171;9.8035506823635e-08;1.7568216208019e-05;-9.010133362608e-05;1.8486452972866e-05;4.8483550926903e-05;-0.00037828114000149;-2.7498655981617e-05;-0.00012196062016301;-0.00050298898713663;-0.00011815121979453;-7.8226439654827e-05;0.00026677953428589;0.0002171552478103;-0.00014273541455623;0.00058170466218144;-5.4351763537852e-05;0.00036249871482141;1.2274133950996e-05;0.00047442523646168;1.917347071867e-05;-1.2290674931137e-05;-1.5366731531685e-05;0.00013990451407153;-3.540245234035e-05;0.00016369402874261;0.00017366603424307;0.00018704935791902;-0.00016362004680559;0.00023089280875865;-0.00016004817734938;0.00010581198148429;8.7074586190283e-05;-0.00016182370018214;-7.4539229899528e-06;-0.00075227214256302;3.4384000173304e-05;-0.00025059192557819;-3.1701143598184e-05;0.00025957493926398;-0.0004476540198084;-0.00017236990970559;0.00016464291547891;0.00025429233210161;0.00015234139573295;0.00018670047575142;-0.00038509842124768;-0.00010409880633233;0.00060222920728847;0.00010888053657254;-0.0002619516744744;6.7638425207406e-06;0.00031848548678681;-2.1550531528192e-05;-8.0847035860643e-05;-0.00019516167230904;6.090240276535e-05;0.0011320546036586;6.7545101046562e-05;0.001960112946108;-0.00019701011478901;-3.522897941366e-06;-0.00022682265262119;0.00017318826576229;-6.3760810007807e-05;0.00091112242080271;-8.2068603660446e-05;0.0014276133151725;-0.00010240073606838;-0.00010192347690463;6.0033871704945e-05;-0.00050205417210236;-0.00032690993975848;0.00020881599630229;0.00013000072794966;0.00023648694332223;-0.00080338877160102;0.00036849913885817;-0.0035270475782454;8.5943094745744e-05;-0.00033379925298505;9.2104382929392e-05;-0.00018464570166543;6.5709049522411e-05;-0.00034051210968755;1.0896389539994e-05;-0.00035069073783234;0.00018731437739916;0.0012623791117221;0.00014200209989212;-0.0011765953386202;-0.00014687659859192;-0.00024034432135522;0.00015182068455033;6.9395493483171e-05;-2.6084620913025e-05;0.00010220418334939;-0.00012748337758239;-0.00028697427478619;3.4618231438799e-05;-0.00021177834423725;-4.945009277435e-05;-0.0008364602108486;2.8065827791579e-05;-7.8461787779815e-05;-5.7110817579087e-05;0.00048341669025831;0.00066861894447356;-0.00028100312920287;-7.5478928920347e-05;-3.4797481930582e-05;0.00067588803358376;4.9449623475084e-05;-4.3672131141648e-05;3.9255308365682e-05;0.00013853365089744;-9.700106602395e-06;0.00022241496481001;-1.677734326222e-05;0.00055949424859136;0.00026935615460388;0.00030938594136387;-0.00031760393176228;0.00019498022447806;-0.00027387935551815;-0.00019944837549701;0.00013321885489859;-0.0012274103937671;-4.8260710173054e-05;-9.244994726032e-05;4.5936980313854e-05;0.00034989879350178;-3.4825246984838e-05;-0.00088550843065605;-0.00052120647160336;0.00013890913396608;0.00043300865218043;0.0004978907527402;-0.00043601024663076;0.00045544159365818;0.00056760071311146;-0.00011580410500756;-0.00047256829566322;0.00015960294695105;0.00052008836064488;2.7808671802632e-05;-0.00020160152052995;-4.168257873971e-05;-0.00016518667689525;4.3868956709048e-05;0.00099070928990841;4.9719590606401e-05;0.0018171897390857;-0.00015139149036258;-2.0148350813542e-05;-0.00021091348025948;0.00018068430654239;-6.7668261181097e-05;0.00089598365593702;-6.5241743868683e-05;0.0013883955543861;-0.00010125864355359;-0.00011427025310695;6.4845982706174e-05;-0.00041657581459731;-0.00035279564326629;0.00018368361634202;0.00021303830726538;0.00017638196004555;-0.00071518437471241;0.00035509027657099;-0.0033973096869886;8.2077000115532e-05;-0.00029108009766787;7.0705369580537e-05;-0.00018542537873145;5.9327376220608e-05;-0.00033037844696082;1.3127365491528e-05;-0.00035738796577789;0.00018814791110344;0.001373476581648;0.00014213540998753;-0.0011437976500019;-0.00016014058201108;-0.00024042386212386;0.00014978856779635;7.2978276875801e-05;-2.8179340006318e-05;7.1289628976956e-05;-0.00012611212150659;-0.00024770403979346;2.8451275284169e-05;-0.00020964273426216;-5.1466311560944e-05;-0.00087087537394837;5.2103849156993e-05;-6.9199886638671e-05;-0.00011408680438763;0.00050814915448427;0.00064934295369312;-0.00028990907594562;-0.00014697031292599;-3.3046071621357e-05;0.00066771468846127;5.9020560001954e-05;-2.5386820198037e-05;4.0643015381647e-05;0.00011839130456792;-7.3041451287281e-06;0.00020470333402045;-2.6972090836352e-06;0.00059828424127772;0.00027850447804667;0.00033872268977575;-0.00033671996789053;0.00019498681649566;-0.00029583481955342;-0.00019456188601907;0.00013433932326734;-0.0012023065937683;-6.2828112277202e-05;-4.2800169467228e-05;4.6451375965262e-05;0.00034817660343833;-2.8536902391352e-05;-0.0009443245944567;-0.0006114094867371;0.00013924490485806;0.00053756596753374;0.00052383006550372;-0.00044744345359504;0.00051384180551395;0.00045164927723818;-0.00010953486344079;-0.00048091961070895;0.0001611771149328;0.0005183206521906;3.3548505598446e-05;-0.00021724007092416;-4.6189408749342e-05;-0.00011924300633837;3.4344720916124e-05;0.00062438403256238;3.0697105103172e-05;0.0010833634296432;-8.1870915892068e-05;-3.6593341064872e-05;-0.0001212185525219;0.00013284817396197;-5.0251983338967e-05;0.00063261209288612;-4.5699245674768e-05;0.00090257002739236;-6.3538129325025e-05;-0.00010072941950057;4.4536998757394e-05;-0.00027022467111237;-0.00025955645833164;9.8080126917921e-05;0.00020661992311943;0.00010534945613472;-0.00038853762089275;0.0002197975263698;-0.0022312644869089;5.3505998948822e-05;-0.00013505622337107;3.3922562579392e-05;-0.00014281399489846;3.9054997614585e-05;-0.00020391102589201;8.8218157543452e-06;-0.00021663126244675;0.00011976507812506;0.00086683203699067;0.00010641466360539;-0.00089565827511251;-0.00010568714787951;-0.00016369586228393;8.9410932559986e-05;4.5152271923143e-05;-1.4604359421355e-05;-1.6487581888214e-05;-8.2785896665882e-05;-0.00020138389663771;2.4376045985264e-05;-0.00013737086555921;-3.114895298495e-05;-0.00060252897674218;-4.4296681153355e-05;-5.9501777286641e-05;4.325346526457e-05;0.00034167256671935;0.00048828264698386;-0.00015724722470623;2.4229426344391e-05;-3.022856071766e-05;0.00047098263166845;3.5804299841402e-05;8.125045496854e-06;2.66640126938e-05;7.6877331594005e-05;-8.585134310124e-06;0.0001310466468567;8.3942516937441e-08;0.00035929650766775;0.00019241329573561;0.00037833920214325;-0.00023260146554094;0.00015626302047167;-0.00022827614156995;-0.0001369368401356;9.331879846286e-05;-0.0007161283865571;-4.876977254753e-05;2.5657582227723e-05;2.8436303182389e-05;0.00024112821847666;-1.1738605280698e-05;-0.00062742223963141;-0.0004473228182178;0.00011534411169123;0.00041576975490898;0.00033467294997536;-0.00039703093352728;0.00039631346589886;0.0001578098454047;-6.7464039602783e-05;-0.00037839967990294;0.00011038990487577;0.00031105140806176;2.6307245207136e-05;-0.00014734588330612;-3.4205459087389e-05;3.6090106732445e-05;-3.703280526679e-05;-0.00012050126679242;1.4140276107355e-05;0.0002347047557123;-0.00012027729098918;-6.2670987972524e-05;9.6424468210898e-05;1.0565714546829e-05;-1.022512333293e-05;9.2928667072556e-06;2.7117901481688e-05;3.6832330806646e-05;-1.5546322174487e-05;5.1876621000702e-05;-4.8546669859206e-05;0.00013104271783959;0.00010478837793926;-1.07944051706e-05;-0.0008390840375796;0.00065210339380428;0.00021678717166651;-0.00029105358407833;0.00010138240759261;-0.00011608720524237;-0.00011158343113493;7.0493755629286e-05;-1.3088325431454e-05;8.2214246504009e-06;-3.8479698559968e-05;3.3106869523181e-05;-5.4757259931648e-05;-2.3244450858328e-05;-0.00017745929653756;-0.00027471571229398;-4.3067168007838e-05;5.0626113079488e-06;-8.4336155850906e-05;-3.4021031751763e-05;-1.1305371117487e-05;-3.5020573704969e-05;8.2180165918544e-05;4.5548822527053e-05;-8.8354034232907e-05;-9.6657131507527e-05;4.1933190004784e-06;2.116091127391e-05;0.0009317371295765;-0.00014796059986111;0.0001251698267879;-0.00031594390748069;-0.00024228513939306;8.1912119640037e-05;-1.4847723832645e-05;6.8880952312611e-05;0.00012916643754579;8.9952569396701e-05;4.3736730731325e-05;-1.6669528122293e-05;1.7645736534178e-06;1.6449903341709e-05;1.3729037164012e-05;-2.3429576685885e-05;-7.5269986155035e-06;-0.00053133734036237;-0.00048827001592144;-0.00034372191294096;-0.00029771513072774;1.0108925380337e-05;-4.1823328501778e-05;8.4644225353259e-06;1.5906709450064e-05;0.00011196531704627;0.00010348406067351;-1.8442271539243e-05;-3.9495575038018e-05;-6.8477245804388e-05;-4.1706269257702e-05;0.0002506269083824;-0.00035945157287642;4.5722012146143e-05;0.00074825063347816;0.00055453414097428;-2.2434582206188e-05;6.1906335758977e-05;7.9807337897364e-05;0.00011107735917903;0.00012402978609316;0.00010787454812089;-6.2482693465427e-05;-5.4871423344593e-05;3.821110658464e-05;2.9216354960226e-05;5.3494204621529e-05;-5.6988727010321e-05;-0.00011809469287982;2.8951089916518e-05;0.000360863894457;-0.00019428953237366;-9.1229252575431e-05;0.00013764364121016;1.5220783097902e-05;-1.5057684322528e-05;-2.6410498321638e-06;4.1273127862951e-05;6.294809281826e-05;-2.2340593204717e-05;7.9650148109067e-05;-7.016806921456e-05;0.00013939183554612;0.00013212092744652;-1.7260796084884e-05;-0.0012963488698006;0.0010518266353756;0.00032774906139821;-0.00042352758464403;0.00014044613635633;-0.00018328581063543;-0.00017206031770911;0.00010703947918955;-1.4765410014661e-05;1.3555794794229e-05;-6.2809507653583e-05;4.8693123972043e-05;-7.8500903327949e-05;-3.6331759474706e-05;-0.00031131313880906;-0.00040776625974104;-7.7907388913445e-05;-1.3740214853897e-05;-0.00012814028013963;-5.1377224735916e-05;-2.1112853573868e-05;-5.2808245527558e-05;0.00013531823060475;6.9380956119858e-05;-0.00014430044393521;-0.00014668454241473;7.5537113843893e-06;2.7222700737184e-05;0.0013895570300519;-0.00026803516084328;0.00020132500503678;-0.00041395716834813;-0.00032215399551205;0.00012025535397697;-2.7751153538702e-05;0.00012022687587887;0.00018845715385396;0.00013951798609924;7.8749762906227e-05;-2.9277356588864e-05;3.4137131024181e-06;2.9340193577809e-05;2.0839426724706e-05;-2.9931459721411e-05;-1.1660486961773e-05;-0.00078773556742817;-0.00074483139906079;-0.00049406866310164;-0.0004651372146327;2.3254133338924e-05;-4.9887436034624e-05;1.094641720556e-05;2.439948002575e-05;0.00016911752754822;0.00015865980822127;-2.5199000447174e-05;-5.53690479137e-05;-0.0001022262731567;-7.060438656481e-05;0.00036627825465985;-0.00045031445915811;7.4917239544448e-05;0.0010573697509244;0.00087116798385978;-6.4851803472266e-05;4.5222466724226e-05;0.00011987906327704;0.00016201450489461;0.00017831283912528;0.00017068536544684;-9.7729978733696e-05;-8.6749845650047e-05;5.845687337569e-05;4.5615426643053e-05;4.9095917347586e-05;-5.4075710067991e-05;-7.148330041673e-05;5.3767278586747e-05;0.00034722682903521;-0.00019287646864541;-8.7044645624701e-05;0.00012655335012823;1.324248205492e-05;-1.3735703760176e-05;-1.2727295143122e-05;3.3518041163916e-05;6.3395425968338e-05;-1.6291311112582e-05;7.912016735645e-05;-6.4931584347505e-05;7.4759111157618e-05;9.70891705947e-05;-1.5989995517884e-05;-0.0012301290407777;0.0010390960378572;0.00031636055791751;-0.00039259824552573;0.00012567797966767;-0.00018597475718707;-0.00016838088049553;0.00010206906154053;-1.0456673408044e-05;1.5417635950143e-05;-6.2748302298132e-05;4.3054955312982e-05;-7.1733396907803e-05;-3.6722736695083e-05;-0.00032909511355683;-0.0003752681077458;-6.6713560954668e-05;-2.2047212041798e-05;-0.00012158911704319;-4.8201669414993e-05;-2.2790369257564e-05;-4.8677309678169e-05;0.00013480728375725;6.3276762375608e-05;-0.00014332818682306;-0.00013739605492447;1.0903529982897e-05;2.2321253709379e-05;0.0013300960417837;-0.00026274973060936;0.00019426665676292;-0.00038258082349785;-0.00030456579406746;0.00011254174023634;-2.8129194106441e-05;0.00012844891170971;0.00017352204304188;0.00012675441394094;8.115573291434e-05;-3.0180781322997e-05;4.4363791857904e-06;3.0168199373293e-05;1.9070203052252e-05;-2.7025993404095e-05;-1.3185002899263e-05;-0.0007403960917145;-0.00072453415486962;-0.00044843860086985;-0.00046090033720247;2.1922665837337e-05;-4.067996997037e-05;9.3145117716631e-06;2.37072345044e-05;0.00016260640404653;0.00015472757513635;-2.6595254894346e-05;-5.2661864174297e-05;-9.4185248599388e-05;-7.3269766289741e-05;0.00035588897299021;-0.00039705543895252;7.4007082730532e-05;0.00094022165285423;0.00087293930118904;-6.5550921135582e-05;2.0229272195138e-05;0.00011840487422887;0.00015304086264223;0.00016287606558762;0.00017131831555162;-9.3730457592756e-05;-8.4633757069241e-05;5.6308097555302e-05;4.532998718787e-05;-5.5750246247044e-05;0.00014222184836399;-7.205131282717e-07;-0.00058734905906022;6.5659747633617e-05;-0.00084906001575291;7.2293063567486e-05;8.8696680904832e-05;7.1667513111606e-05;-0.00018160164472647;6.2773411627859e-05;-0.00063799554482102;7.3059192800429e-05;-0.00086931744590402;-5.1157323468942e-05;0.00017131378990598;0.00024897788534872;0.00029520509997383;-4.6421777369687e-05;-0.00010018765897257;-0.00027465607854538;-0.00017930474132299;0.00021433540678117;-8.8452397903893e-05;0.0020892289467156;-9.9704266176559e-06;3.7892779801041e-05;-4.5218417653814e-05;0.00018808258755598;-9.1479714683373e-06;0.00016490326379426;0.00016470442642458;-0.00024574834969826;0.00015776863438077;0.0010542845120654;-0.00018421639106236;-0.001085932017304;6.9396279286593e-05;-0.0002039893734036;-1.9899540347978e-05;7.1366448537447e-05;-0.00013389380183071;-9.0865483798552e-05;3.2897445635172e-05;-0.00019376655109227;-2.9990360417287e-05;-0.00017354715964757;-0.00081743841292337;-0.00017293635755777;-7.2290422394872e-05;0.00048652509576641;0.0001619562972337;-0.00010543195821811;0.00060659792507067;-3.502917024889e-05;1.1069294032495e-06;6.1446917243302e-05;0.00055424292804673;3.9227878005477e-05;6.13747688476e-05;-1.6942105503404e-05;5.9020992921432e-05;2.9473481845343e-05;9.784399298951e-05;0.00027749323635362;0.00032467197161168;-0.0002843574329745;0.00045158213470131;-0.00027756777126342;0.0001601766271051;0.00010345547343604;-0.00015802340931259;-0.00010595681669656;-0.00058658950729296;4.55170229543e-05;4.3237720092293e-05;-7.655853551114e-06;0.00027864778530784;-0.00077870738459751;-0.00061203760560602;0.00016651683836244;0.00038741953903809;0.00067987485090271;0.0004981926176697;-0.0005080007831566;-8.4219143900555e-05;1.1533563338162e-05;0.00012960942694917;-0.00039351152372546;4.4302891183179e-05;0.00028115502209403;-4.7775218263268e-05;-0.00016630176105537;-7.6280281064101e-05;0.00020188963389955;-8.2042797657778e-06;-0.00095609371783212;0.0001403521746397;-0.0015020109713078;0.00014288978127297;9.2733534984291e-05;9.8473428806756e-05;-0.00024948638747446;9.176014282275e-05;-0.00090640218695626;0.00011755077866837;-0.0013427680823952;-7.2949660534505e-05;0.00021304596157279;0.00039727799594402;0.00039713288424537;-0.00011606830230448;-0.00017976327217184;-0.00029701724997722;-0.00029957754304633;0.00048685097135603;-0.00013536364713218;0.0032065452542156;-4.2936400859617e-05;0.00015410405467264;-6.9426139816642e-05;0.00025166501291096;-1.3823814697389e-05;0.00027590041281655;0.00025790021754801;-0.00040258615626954;0.00021420273697004;0.0016494463197887;-0.0002787082339637;-0.0014347286196426;0.00012478181452025;-0.00030761878588237;-3.623653537943e-05;0.0001140423482866;-0.00020404637325555;-3.4135147870984e-05;4.2001003748737e-05;-0.00024391844635829;-5.0761791499099e-05;-0.00026575080119073;-0.001188998692669;-0.0001402990455972;-9.5517119916622e-05;0.00073031085776165;5.2584709919756e-05;-0.00021594486315735;0.0008442722610198;-3.7976926250849e-05;-0.00016971564036794;9.6251933427993e-05;0.00079687405377626;5.9375910495874e-05;4.6847082558088e-05;-1.9829300072161e-05;9.7881165856961e-05;3.8869289710419e-05;0.00015850419003982;0.00040102313505486;0.00054936023661867;-0.00041904274257831;0.00043511754483916;-0.00037231616443023;0.00019995203183498;0.00014920400280971;-0.00022420243476517;-0.00014367888798006;-0.0010123164393008;7.1085691160988e-05;-1.7095984730986e-05;-2.1923402528046e-05;0.00040009635267779;-0.001170011004433;-0.00086596776964143;0.00021062469750177;0.00061350379837677;0.0009261139202863;0.00067240907810628;-0.00059741869335994;-0.0001353543048026;0.00023839292407501;0.00019181230163667;-0.00049961963668466;5.9064292145194e-05;0.00047383783385158;-6.6194370447192e-05;-0.00024382946139667;-7.5827869295608e-05;0.00019754318054765;-3.5221655707574e-05;-0.0011571352370083;0.00022381918097381;-0.0018430100753903;0.0001886251848191;3.9741418731865e-05;8.3840182924177e-05;-0.00021576571452897;9.9427197710611e-05;-0.00081642018631101;0.00012744244304486;-0.001406091498211;-6.0833426687168e-05;0.0001450547715649;0.00049925374332815;0.00031207170104608;-0.0001869879924925;-0.00026943307602778;-9.3180875410326e-05;-0.00032759897294454;0.00072522280970588;-0.0001349881204078;0.0033527470659465;-9.5413786766585e-05;0.00029378119506873;-7.5355863373261e-05;0.00019418280862737;-1.4147784895613e-05;0.00032465913682245;0.00026334056747146;-0.00043228693539277;0.00019234053615946;0.0016229456523433;-0.00026333041023463;-0.0011936277151108;0.00013983216194902;-0.00029367569368333;-3.9786573324818e-05;0.00011002706742147;-0.00020425222464837;0.00013205826689955;3.5279819712741e-05;-0.00022084581723902;-5.4521555284737e-05;-0.00026875460753217;-0.0011038015363738;-1.256528094018e-06;-6.7080953158438e-05;0.0006883287569508;-0.00012154220166849;-0.00027626322116703;0.00072799733607098;-2.5478368115728e-05;-0.00032880800426938;9.6073919849005e-05;0.00074596737977117;5.9012196288677e-05;-3.4391399822198e-05;-1.4870261111355e-05;0.00013137028145138;2.1485371689778e-05;0.00018326699500903;0.00036591457319446;0.00062563020037487;-0.0003870306245517;0.00015030623762868;-0.00029027348500676;0.00014742458006367;0.00014131146599539;-0.00021521835878957;-0.00010731925431173;-0.0012131835101172;7.3153358243871e-05;-0.00015608937246725;-4.3722175178118e-05;0.00039078728877939;-0.0011188626522198;-0.0006879418506287;0.00016693370707799;0.00063080160180107;0.00067600322654471;0.00050321244634688;-0.0003969710378442;-0.00015289129805751;0.00059679266996682;0.00018723178072833;-0.00039793932228349;4.2743758967845e-05;0.00054703245405108;-5.2917148423148e-05;-0.00022967158292886;-7.9899546108209e-05;1.1010487469321e-05;0.00072774657746777;3.5330303944647e-05;0.0014688275987282;-0.00012847571633756;2.554258753662e-05;-0.0001778724254109;0.00010655577352736;-3.8688038330292e-05;0.00053039868362248;-3.261520396336e-05;0.0010181623511016;-7.8802884672768e-05;-3.2864314562175e-05;4.2893465433735e-05;-0.00028407282661647;-0.00020625756587833;0.00016381897148676;4.7856516175671e-05;0.00013200500688981;-0.00063568016048521;0.00027374387718737;-0.0024009777698666;5.5818720284151e-05;-0.00031086095259525;6.9372217694763e-05;-8.2133265095763e-05;3.9570539229317e-05;-0.00027063192101195;1.1178995919181e-05;-0.00030194182181731;0.00014612592349295;0.0011337186442688;7.9400124377571e-05;-0.00048970320494846;-0.00012884476745967;-0.00015861359133851;0.00012069950753357;6.1204184021335e-05;-2.9837628972018e-05;0.00017871969612315;-9.3302733148448e-05;-6.4617430325598e-05;4.6637210289191e-06;-0.00015378462558147;-4.321848609834e-05;-0.00059721822617576;0.00020617184054572;-1.142076234828e-05;-0.00034851700183935;0.00037159299245104;0.00031498723546974;-0.00027464053709991;-0.00042674830183387;-4.4501866796054e-06;0.00040719649405219;5.6973549362738e-05;-6.6092630731873e-05;3.1678639061283e-05;7.6509757491294e-05;3.3095902836067e-06;0.00014667012146674;1.1416866527725e-06;0.00053962745005265;0.00019018520833924;-5.2525952924043e-05;-0.00023055447672959;8.3539838669822e-05;-0.00015047223132569;-0.00012026382319164;8.7740641902201e-05;-0.0010182268451899;-3.7356952816481e-05;-0.00011030214227503;3.9283382648136e-05;0.00022993257152848;-3.4344389860053e-05;-0.00070764502743259;-0.00037957771564834;5.1427126891213e-05;0.00029655738035217;0.00041617796523497;-0.00011828495189548;0.00026912483735941;0.00054685672512278;-8.8064531155396e-05;-0.00023062969557941;0.00010934617603198;0.00044071901356801;1.7959911929211e-05;-0.00016098635387607;-2.7054915335611e-05;-4.2214538552798e-05;-1.2350250472082e-05;0.00054614385589957;6.0685865719279e-06;0.0014240209711716;-7.9190336691681e-05;2.188648795709e-05;-0.00018008772167377;0.00011261478357483;-4.2682371713454e-05;0.00054441316751763;-1.1694570275722e-05;0.0010159617522731;-8.3764520240948e-05;-3.9133978134487e-05;5.3980114898877e-05;-0.00015509921649937;-0.00024750881129876;0.00015147108933888;0.00013893278082833;4.6681012463523e-05;-0.0006035283440724;0.00029037747299299;-0.0023451251909137;5.9916204918409e-05;-0.00030360108939931;4.7218010877259e-05;-9.1868278104812e-05;3.3365784474881e-05;-0.00026860539219342;1.3402601325652e-05;-0.00032875672332011;0.0001518137723906;0.0013660107506439;7.2673945396673e-05;-0.0004042741493322;-0.00014478407683782;-0.00016735504323151;0.00013774575199932;7.0821763074491e-05;-3.6259050830267e-05;0.00014813379675616;-9.0508918219712e-05;1.417954763383e-06;-5.8111254475079e-06;-0.00015282920503523;-5.1697385060834e-05;-0.00064468639902771;0.00030973271350376;1.2798180932805e-06;-0.00053694029338658;0.00041314592817798;0.00028999609639868;-0.00033428031019866;-0.00057964824372903;-4.6395996378124e-07;0.00039658558671363;7.1714857767802e-05;-4.2870484321611e-05;3.2668580388417e-05;4.697366966866e-05;1.0450397894601e-05;0.00012060293374816;2.380579826422e-05;0.00064494030084461;0.00019649288151413;-6.4098065195139e-05;-0.00026730372337624;7.616951916134e-05;-0.00017700831813272;-0.00011424970580265;9.0090594312642e-05;-0.0010492951842025;-5.7157016271958e-05;-6.5472871938255e-05;3.8061378290877e-05;0.00023124316066969;-2.8979722628719e-05;-0.00080510514089838;-0.00049570028204471;4.7949823056115e-05;0.00040458329021931;0.00047592233750038;-0.00010606730211293;0.00034100431366824;0.00044997964869253;-7.6568649092223e-05;-0.00022552748851012;0.00011677509610308;0.00046976140583865;2.583627065178e-05;-0.00018849859770853;-3.2186650059884e-05;2.4237371690106e-05;-2.0187660993543e-05;-0.00031266585574485;0.00015886042092461;0.00018076608830597;-6.0557391407201e-05;-6.3379709899891e-05;9.8604905360844e-05;6.0416414271458e-06;-7.379470844171e-06;4.9810209020507e-05;-1.758696998877e-05;1.0957903214148e-05;7.1383942668035e-06;5.2957686420996e-05;-4.3623760575429e-05;0.00015116836584639;9.1161396994721e-05;-9.6605017461115e-06;-0.00061544054187834;0.00044124826672487;0.0002168240462197;-0.00028806319460273;0.00016372413665522;-0.0001528396824142;-0.00010598082735669;5.3415194997797e-05;-2.6879330107477e-05;2.4603705242043e-05;-2.6579367840895e-05;1.9304538000142e-05;-5.0520073273219e-05;-2.5786279366002e-05;-0.00010246562305838;-0.00023143402358983;0.00016866307123564;0.00016324229363818;-4.4165557483211e-05;4.0953714233183e-06;-1.6859854440554e-05;-3.9661688788328e-05;4.8775706090964e-05;2.4537364879507e-05;-4.8692854761612e-05;-7.4325878813397e-05;2.8466716685216e-05;3.7510959373321e-05;0.0011503698769957;0.00027842330746353;0.00012366053124424;-0.00073729967698455;-0.0005960893468;-4.9556481826585e-05;-0.00014003885735292;3.2899992220337e-05;0.0001174089484266;6.7743678755505e-07;-2.0860850781901e-05;-1.1928990716115e-05;2.3201605472423e-06;1.8765313143376e-06;6.7578171183413e-06;-7.5078969530296e-05;-3.5621476854431e-05;-0.00054588727653027;-0.00053208856843412;-0.00029034054023214;-0.00025351098156534;-2.5039864340215e-05;-7.6916701800656e-05;1.1549087503226e-05;1.6384126865887e-05;0.00013610071619041;0.00012019152927678;-3.5417604522081e-05;-5.556901669479e-05;-4.8526588216191e-05;-2.0067440345883e-05;0.00049446831690148;-0.00052618474001065;2.8012005714118e-05;0.00063937460072339;0.00047489235294051;7.5703923357651e-05;0.00016350527585018;8.2644553913269e-05;0.00012392972712405;0.00010549812577665;8.8351574959233e-05;-5.2740095270565e-05;-4.6162705984898e-05;3.3771924790926e-05;2.4774715711828e-05;4.4642416469287e-05;-4.3422114686109e-05;-0.00041769869858399;0.00026307042571716;0.00033181527396664;-0.00014277154696174;-0.00010502891382203;0.0001608986640349;5.9386011344031e-06;-8.7579746832489e-06;6.1819315305911e-05;-2.2766947950004e-05;2.3006288756733e-05;1.3979160030431e-05;9.6457355539314e-05;-8.0233672633767e-05;0.00017446310084779;0.00013777245476376;-1.3060418496025e-05;-0.0010827241931111;0.00082798389485106;0.00035744509659708;-0.00047320665908046;0.00025002684560604;-0.00026023897225969;-0.00019002132466994;0.00010582924733171;-3.8146717997734e-05;3.8672758819303e-05;-4.7832148993621e-05;3.2089392334456e-05;-9.060087177204e-05;-4.69204824185e-05;-0.00024970227968879;-0.00039055760134943;0.00025523372460157;0.00024239368212875;-8.163096208591e-05;-7.9416704465984e-06;-2.9092268960085e-05;-6.0978229157627e-05;0.0001089894794859;4.7449106205022e-05;-0.00010346862109145;-0.00012784100545105;4.8384667024948e-05;5.9202582633588e-05;0.00190850708168;0.00036204230855219;0.00019764984608628;-0.0011331890709698;-0.000945434498135;-4.9819551350083e-05;-0.00018510490190238;8.7814216385596e-05;0.00019517586042639;7.9444907896686e-06;-2.1485198885784e-05;-2.4531183953513e-05;5.3386561376101e-06;1.0903614565905e-05;1.1269022252236e-05;-0.00010143331019208;-5.4410971642938e-05;-0.00093910511350259;-0.00090695649851114;-0.00050267594633624;-0.00046545846271329;-4.3013224058086e-05;-0.00011646706116153;1.8600989278639e-05;2.736186797847e-05;0.00023185303143691;0.00020288817177061;-7.1328271587845e-05;-9.5765601145104e-05;-8.4720719314646e-05;-4.6213914174587e-05;0.00078201398719102;-0.00087437761249021;4.5296794269234e-05;0.0010600379901007;0.00087242235895246;0.00013846055662725;0.00025445388746448;0.00016964766837191;0.00021619148901664;0.00018423836445436;0.00016583905380685;-9.5864663308021e-05;-8.2395337813068e-05;6.3526757003274e-05;4.7353758418467e-05;4.3197494960623e-05;-4.6149627451086e-05;-0.00035152811324224;0.00030762201640755;0.00032463431125507;-0.00015227435505949;-0.00010703453881433;0.00015743086987641;5.4393667596742e-06;-8.2815358837252e-06;4.8153884563362e-05;-2.9640215871041e-05;2.8441130780266e-05;2.060455881292e-05;9.764454443939e-05;-7.9476842074655e-05;8.4214647358749e-05;0.00010959223436657;-1.1406194971642e-05;-0.0010587726719677;0.0008605812327005;0.00036223957431503;-0.00046456666314043;0.00023111040354706;-0.00027632643468678;-0.00018856728274841;0.00010775443661259;-3.3270203857683e-05;4.1593099012971e-05;-5.1016049837926e-05;2.8056940209353e-05;-8.934205834521e-05;-4.8359535867348e-05;-0.00029323357739486;-0.00035795808071271;0.00025308015756309;0.0002317310863873;-7.9908939369489e-05;-1.2152328054071e-05;-3.2030227885116e-05;-5.6833559938241e-05;0.0001193794523715;4.0325216104975e-05;-0.00011368819832569;-0.00012046137271682;5.0913902668981e-05;5.5556483857799e-05;0.0018963300390169;0.00034477401641198;0.00019534744205885;-0.0010945087997243;-0.00094968162011355;-4.9696307542035e-05;-0.00017189985373989;0.0001085274561774;0.00018086099589709;4.3196364458709e-06;-1.5045416148496e-05;-2.7752521418734e-05;8.3297527453396e-06;1.5179000911303e-05;7.8977700468386e-06;-9.2220914666541e-05;-5.9261266869726e-05;-0.00093180983094499;-0.00090906559489667;-0.00048007562872954;-0.00048836210044101;-4.6595207095379e-05;-0.00010944251698675;1.7185057004099e-05;2.842321737262e-05;0.00023178016999736;0.00020314486755524;-7.506218389608e-05;-9.3166025180835e-05;-7.942028605612e-05;-5.3358602599474e-05;0.00077202584361658;-0.00086470477981493;4.5380471419776e-05;0.00099663739092648;0.0009301282116212;0.00014816694601905;0.00023742890334688;0.0001787726796465;0.00020968983881176;0.00017493410268798;0.00017631668015383;-9.7029827884398e-05;-8.2719627243932e-05;6.4161671616603e-05;4.8118286940735e-05;2.5218259906978e-05;-2.8813381504733e-05;-0.00019932076975238;0.00022639568487648;0.00018524621555116;-8.8750006398186e-05;-6.7388609750196e-05;9.5661285740789e-05;3.6654607811215e-06;-5.5561922636116e-06;2.6118941605091e-05;-2.5884701244649e-05;1.8462729713065e-05;1.7235974155483e-05;5.8970068494091e-05;-4.6695651690243e-05;6.4386754274892e-06;5.3139588999329e-05;-5.7549395933165e-06;-0.00060828606365249;0.00051638454897329;0.00022485990484711;-0.00028162210946903;0.00013576030323748;-0.00017941150872502;-0.00011117082613055;6.3431616581511e-05;-1.8867764083552e-05;2.8368469429552e-05;-3.181234569638e-05;1.3977180060465e-05;-5.3119372751098e-05;-3.0579620215576e-05;-0.00018843953148462;-0.00018971890676767;0.00016590238374192;0.00014617544366047;-4.4786102080252e-05;-7.1491958806291e-06;-2.1158486561035e-05;-3.2363281206926e-05;7.3172981501557e-05;1.7238215150428e-05;-7.0273468736559e-05;-6.6139917180408e-05;3.3241445635213e-05;3.2543586712563e-05;0.0011596381664276;0.00023580649576616;0.00011701488256222;-0.00067884585587308;-0.0006107313092798;-3.9637619920541e-05;-0.00010599832603475;7.1846712671686e-05;9.8741991678253e-05;-4.2216906877002e-06;-9.712085557112e-06;-1.7611262592254e-05;7.2544585236756e-06;9.9686558314716e-06;1.9406625142437e-06;-5.53323297936e-05;-4.142521720496e-05;-0.00056167610455304;-0.00055306171998382;-0.00027919225976802;-0.00030672296998091;-3.4329499612795e-05;-6.7154578573536e-05;1.0239875336993e-05;1.8172686395701e-05;0.0001406349329045;0.00012298102956265;-4.76795466966e-05;-5.5270949815167e-05;-4.3820116843563e-05;-3.3974269172177e-05;0.00047674388042651;-0.00054655491840094;2.6247591449646e-05;0.00057514786021784;0.00059567269636318;0.00010670314804884;0.00014739863399882;0.00011150431237184;0.00012244573736098;0.00010077788465424;0.00011123421427328;-5.7601173466537e-05;-4.8364065150963e-05;3.8078422221588e-05;2.8176822524983e-05;-5.9570829762379e-06;6.3650484662503e-05;-2.1947576897219e-05;-0.000794016814325;0.00015261786757037;-0.0014216889394447;0.00015642157814;-2.1731925698987e-06;5.2847812185064e-05;-0.00013807095820084;2.9649956559297e-05;-0.00042162486352026;9.9896875326522e-05;-0.0010451077250764;-4.1710245568538e-05;5.0303126045037e-05;0.00030888762557879;0.00020199992286507;-0.00015314844495151;-0.00016610434977338;-1.8355503925704e-05;-0.00025243760319427;0.00059885979862884;-8.0129422713071e-05;0.0023291036486626;-7.8618337283842e-05;0.00030304960091598;-4.3456406274345e-05;6.3728475652169e-05;-1.6098087144201e-05;0.000289628689643;0.00021141888282727;-0.00037890329258516;0.00012183624494355;0.0014809829881415;-0.0002433729096083;-0.00045612960821018;0.00011698578600772;-0.00019837490981445;-4.348475340521e-05;9.9147364380769e-05;-0.00015825558512006;0.00023113741190173;1.0498850997465e-06;1.3896180462325e-05;-5.1674611313501e-05;-0.00020882833632641;-0.0008397902129218;0.00022048910614103;-1.0978413911289e-06;0.00056163890985772;-0.0004577373911161;-0.00028288020985201;0.00033713720040396;8.1163652794203e-06;-0.00069050042657182;0.00010460569319548;0.00045877567026764;4.9718979425961e-05;-8.3116879977752e-05;7.1425716896556e-07;7.6496042311192e-05;4.1290950321127e-05;0.00010720256977947;0.00026346108643338;0.00069925509160385;-0.0003115156723652;-0.00016138743376359;-0.0001567830768181;4.6301334805321e-05;9.4528135377914e-05;-0.00012994310236536;-9.053396206582e-05;-0.0010608618613333;5.9239635447739e-05;-0.00013688641774934;-4.7127574362094e-05;0.0002695964940358;-0.00093732605455443;-0.00048533533117734;6.3887877331581e-05;0.00057292613200843;0.00040287282899953;0.00029306602664292;-6.8727822508663e-05;-0.00011263383203186;0.00055307813454419;0.00014136573008727;-0.00019337068079039;3.1396484700963e-05;0.0004884279333055;-3.4504042560002e-05;-0.0002009595191339;0.00010791821841849;-8.1281985330861e-05;-0.00022668119345326;-7.6999254815746e-05;0.00065759930294007;8.2543279859237e-05;2.5727693355293e-05;-0.00010673709766706;5.2629973652074e-05;-2.362498526054e-05;0.00021352151816245;5.8789002650883e-05;0.00048080159467645;-5.5691507441225e-05;2.0324304728092e-07;5.2358347602421e-05;0.00028951177955605;-0.00019783493189607;5.7855093473336e-05;0.00023874641919974;-0.00020490107999649;-0.00027381692780182;0.00019277671526652;-0.00091833685291931;3.7568544939859e-05;-0.00019197644724045;-2.5776154870982e-05;-3.1772149668541e-05;-2.9604977953568e-06;-0.00014320322952699;1.3043564649706e-05;-0.00023649075592402;8.0963138316292e-05;0.0013075221795589;2.029857114394e-06;0.00021229755657259;-0.00010061264038086;-9.2120710178278e-05;0.00012088360381313;6.1595907027368e-05;-3.9006772567518e-05;5.2141167543596e-05;-2.6564361178316e-05;0.00022725960297976;-3.8493897591252e-05;-6.9299690949265e-05;-4.9815895181382e-05;-0.00038232098449953;0.00052856164984405;5.2856237743981e-05;-0.00090987118892372;0.00028193558682688;-8.50648029882e-06;-0.00036149690276943;-0.00082151463720948;1.5019201782707e-05;0.00011548632755876;7.555845513707e-05;1.241921017936e-05;1.6053665603977e-05;-5.6175329518737e-05;2.9706921850448e-05;-2.185355151596e-05;7.6099990110379e-05;0.00065560278017074;8.5529347416013e-05;-0.00021308350551408;-0.00021471059881151;-1.4119602383289e-05;-0.00011608448403422;-2.8474691134761e-05;4.2890656914096e-05;-0.00066607329063118;-7.2980386903509e-05;3.5150846088072e-05;1.2366377632134e-05;0.00010320284491172;-7.5207904046692e-06;-0.00062482373323292;-0.00047916432959028;-9.7298816399416e-06;0.00037830832297914;0.00039780864608474;8.7164633441716e-05;0.00028229161398485;8.9898669102695e-05;-1.1297744322292e-06;-3.1135110475589e-05;7.1734699304216e-05;0.00033913410152309;2.93203684123e-05;-0.00016241549747065;-2.3204644094221e-05;-1.331437852059e-05;2.2975555111771e-05;-0.00054923392599449;0.00031726720044389;0.00012905501353089;5.6460021369276e-07;-5.9613244957291e-05;9.7817843197845e-05;3.4573734097876e-08;-3.3023727610271e-06;0.00011050389002776;-8.0911988334265e-05;-2.3898779545561e-05;3.449395444477e-05;5.4109277698444e-05;-3.6891950003337e-05;0.00019498758774716;8.1007339758798e-05;-1.0780240700115e-05;-0.00039542489685118;0.00021995275164954;0.00021277958876453;-0.00027921731816605;0.00024586837389506;-0.00019271970086265;-0.00010208738240181;3.3939086279133e-05;-4.4974673073739e-05;4.5867334847571e-05;-1.160930878541e-05;2.756174581009e-06;-3.116529842373e-05;-2.1811909391545e-05;-3.1878989830147e-05;-0.00020529142057057;0.00041166567825712;0.00035091702011414;7.9846768130665e-06;5.7603672757978e-05;-2.5364915927639e-05;-4.8810419684742e-05;-8.4339717432158e-06;-7.302553513e-06;5.3809560540685e-07;-4.8378937208327e-05;5.7304408983327e-05;5.7526212913217e-05;0.0014401003718376;0.00078159611439332;0.00012993790733162;-0.0012346579460427;-0.0010109530994669;-0.00021262152586132;-0.00030499530839734;8.2328006101307e-06;0.00011915386130568;-0.00010711585491663;-0.00010155097697861;-7.0389410211646e-06;1.1059339755093e-07;-1.5437752153957e-05;1.3844662305473e-07;-0.00015352318587247;-7.7639677328989e-05;-0.00055279314983636;-0.00058303028345108;-0.00018841748533305;-0.00016612681793049;-5.2258725190768e-05;-0.00010682649008231;1.3152221981727e-05;1.5256197912095e-05;0.00017710342945065;0.00014785258099437;-5.2019455324626e-05;-7.5146032031626e-05;-2.6587107640808e-05;5.5273662837863e-06;0.0008517651585862;-0.00058049766812474;2.3600108761457e-05;0.00043062565964647;0.00029767127125524;0.00012529853847809;0.00022183221881278;6.6209497163072e-05;0.00013181303802412;7.69663383835e-05;5.9081317886012e-05;-4.3096148147015e-05;-3.6718731280416e-05;2.9980703402543e-05;2.0945257347194e-05;-1.7698987448966e-06;7.4579215834092e-06;-0.00075233489042148;0.00050851405831054;0.00026087995502166;-6.4692088926677e-05;-9.5780269475654e-05;0.0001568097359268;-6.5582744355197e-06;1.0698647656682e-06;0.00015431010979228;-0.00011253458069405;-3.5770706745097e-05;6.0678627050947e-05;9.8860029538628e-05;-7.5530988397077e-05;0.00022190215531737;0.00013192868209444;-1.2134401913499e-05;-0.00075218710117042;0.0004960271762684;0.00033662019995973;-0.00045412857434712;0.00037028366932645;-0.0003284236008767;-0.00018500193255022;8.5412240878213e-05;-6.7872584622819e-05;6.8997476773802e-05;-2.0235482224962e-05;5.2034497457498e-06;-7.7742384746671e-05;-4.2969029891538e-05;-0.00016823886835482;-0.0003591850399971;0.00063432782189921;0.00054118252592161;-2.2008098312654e-06;6.7195964220446e-05;-4.1670919017633e-05;-7.2794187872205e-05;4.4092535972595e-05;5.4525239647774e-06;-4.045420064358e-05;-9.1974965471309e-05;9.3385904619936e-05;9.3045156972948e-05;0.0023619066923857;0.0011211368255317;0.00020057143410668;-0.0018801396945491;-0.0015908827772364;-0.00029749303939752;-0.00042098591802642;5.6503631640226e-05;0.00019868400704581;-0.00015763906412758;-0.00014925266441423;-1.7198814020958e-05;4.2119177123823e-06;-1.178545790026e-05;9.1098746679563e-07;-0.00020252478134353;-0.00011588256893447;-0.0010010146070272;-0.00099546054843813;-0.00037449217052199;-0.00034405870246701;-9.0235786046833e-05;-0.00016517052426934;2.1287632989697e-05;2.537851469242e-05;0.00030265594250523;0.00024705700343475;-0.0001108219512389;-0.00013228066381998;-5.3489748097491e-05;-8.3744243966066e-06;0.0013184956042096;-0.001003825222142;3.165318412357e-05;0.00078435003524646;0.00061385141452774;0.00024103578471113;0.00036600412568077;0.00017579078848939;0.00024106248747557;0.00015086305211298;0.00012602312199306;-8.622815948911e-05;-6.8797686253674e-05;6.3243554905057e-05;4.3905336497119e-05;-4.8488636821276e-06;2.9846228244423e-06;-0.00065013772109523;0.00055353250354528;0.00024936322006397;-7.9348392318934e-05;-9.7227515652776e-05;0.0001525755651528;-6.061638941901e-06;1.6916036429393e-06;0.00013817701255903;-0.00011520172847668;-2.6029181753984e-05;6.7001405113842e-05;9.6507515991107e-05;-7.6482363510877e-05;0.00010850460239453;0.00011079113755841;-9.6040275820997e-06;-0.00072946242289618;0.00053502625087276;0.00033609371166676;-0.00044499224168248;0.00033327756682411;-0.0003459214058239;-0.00017727914382704;9.0661051217467e-05;-6.1963364714757e-05;7.0138048613444e-05;-2.3862776288297e-05;2.0970014702471e-06;-7.996541535249e-05;-3.9336217014352e-05;-0.00022205435379874;-0.00031807870254852;0.00060558161931112;0.0005202874308452;-1.1200277185708e-06;5.7739689509617e-05;-4.4169752072776e-05;-6.7089807998855e-05;6.1377621022984e-05;-5.760953627032e-06;-5.6520362704759e-05;-8.1357480667066e-05;9.1828871518373e-05;8.9289642346557e-05;0.0023101468104869;0.0010657126549631;0.00019524498202372;-0.0017821517540142;-0.0015701132360846;-0.0002890604082495;-0.00038989607128315;8.2916893006768e-05;0.00018068644567393;-0.00015090429224074;-0.00014079034735914;-2.2197807993507e-05;8.311755664181e-06;-4.3602813093457e-06;-4.1972398321377e-06;-0.00018218808691017;-0.00012356803927105;-0.00099563505500555;-0.00097044103313237;-0.00035263612517156;-0.00036220299080014;-9.0335808636155e-05;-0.00015509316290263;1.8756953068078e-05;2.6816293029697e-05;0.00029911249293946;0.00024268277047668;-0.00011398772039684;-0.00012482999591157;-4.833272396354e-05;-1.6444975699414e-05;0.0012799000833184;-0.00097759382333606;3.1927509553498e-05;0.00072991463821381;0.00065916194580495;0.0002432723849779;0.00034148228587583;0.00018861953867599;0.00022499581973534;0.00013992475578561;0.00013552214659285;-8.8888060417958e-05;-6.7648237745743e-05;6.4640880736988e-05;4.3095475120936e-05;-1.1103254109912e-05;6.690882401017e-06;-0.0003301793767605;0.00034310121554881;0.00011948958854191;-3.2703748729546e-05;-5.9635189245455e-05;8.8876411609817e-05;1.0272813142365e-06;-3.102619530182e-06;7.1512375143357e-05;-6.8560097133741e-05;-3.5394346014073e-06;3.612723594415e-05;4.9430858780397e-05;-3.8755089917686e-05;9.8580567282625e-06;5.2518869779306e-05;-4.9564537221158e-06;-0.00038662517908961;0.00030448884353973;0.00020125119772274;-0.00025880348403007;0.00016713645891286;-0.00020172384392936;-8.9235181803815e-05;4.4768716179533e-05;-3.1595714972354e-05;4.0954320866149e-05;-1.8555623682914e-05;1.8419694924887e-06;-3.8028167182347e-05;-1.5758014342282e-05;-0.00012651341967285;-0.00013724411837757;0.00031259324168786;0.00027217093156651;1.6157325433142e-07;3.0695380701218e-05;-2.6459032596904e-05;-3.5940629459219e-05;2.9611506761285e-05;-1.8281760276295e-05;-3.2405409001512e-05;-3.4273933124496e-05;4.8221940232906e-05;4.5834021875635e-05;0.0012540468014777;0.00057933613425121;0.00011311536218273;-0.00095244986005127;-0.0008700109901838;-0.00016153998149093;-0.00021290597214829;5.2279465307947e-05;8.5930230852682e-05;-7.5567339081317e-05;-7.0633475843351e-05;-1.5150596482272e-05;6.3362554101332e-06;-6.7452606344887e-07;-6.4956025198626e-06;-0.00010033725993708;-7.9286197433248e-05;-0.00052700191736221;-0.00050922861555591;-0.00017563483561389;-0.00020352589490358;-4.80256821902e-05;-8.2877624663524e-05;9.3835196821601e-06;1.6727302863728e-05;0.00015829873154871;0.00012859349953942;-5.4143009037944e-05;-5.6793240219122e-05;-2.3013693862595e-05;-1.0729578207247e-05;0.00069157098187134;-0.0005254081916064;2.152098386432e-05;0.00037936432636343;0.00038985573337413;0.00012544913624879;0.00017232973186765;9.1064990556333e-05;0.00010074953024741;6.645899702562e-05;7.548962457804e-05;-4.7942266974133e-05;-3.4683802368818e-05;3.2707197533455e-05;1.9067456378252e-05;3.8576679799007e-05;-3.3086518669734e-05;-2.7590938771027e-05;-0.00052620290080085;9.4961134891491e-05;-0.0009542308980599;0.00011068464664277;-1.3094358109811e-05;2.6336247174186e-05;-7.5052324973512e-05;-1.5988473023754e-05;-8.2440623373259e-05;6.5672204073053e-05;-0.00069076521322131;-2.0583398509189e-05;-1.8621880371938e-05;0.00020394292369019;0.00011862795508932;-0.0001087248820113;-0.00011058753443649;2.4873846996343e-05;-0.00016285669698846;0.00041312663233839;-2.413736001472e-05;0.0014116695383564;-6.1745158745907e-05;0.00025812833337113;-1.8266195183969e-05;-5.0309536163695e-05;-1.5210357560136e-05;0.00024289511202369;0.00013820226013195;-0.00027543792384677;8.030774188228e-05;0.0011105078738183;-0.00018024380551651;-2.2825041014585e-05;7.9797187936492e-05;-0.00010808154183906;-3.5703294997802e-05;7.0787507866044e-05;-0.00010077870683745;0.00027033971855417;-1.3607540495286e-05;0.00011010096932296;-4.05222090194e-05;-0.0001484238600824;-0.00055968260858208;0.00029065509443171;3.9500060665887e-05;0.00038157653762028;-0.00050877610919997;-0.00023522287665401;6.8588342401199e-05;1.0541017218202e-05;-0.00073333835462108;8.9966670202557e-05;0.00024140074674506;3.4880642488133e-05;-0.00011684827768477;7.6435226219473e-06;5.4696323786629e-05;4.5700107875746e-05;4.8499416152481e-05;0.00015955322305672;0.00066653452813625;-0.00022098857152741;-0.00026866112602875;-4.9674399633659e-05;-1.1289957910776e-05;5.6374974519713e-05;-7.1691451012157e-05;-6.3544815930072e-05;-0.00085120153380558;4.0258131775772e-05;-0.00012207856343593;-4.7808960516704e-05;0.00017708190716803;-0.00068356626434252;-0.00023280997993425;7.1814497459854e-06;0.00045449717435986;9.9932061857544e-05;9.5963550847955e-05;9.6079311333597e-05;-7.3268834967166e-05;0.00048136844998226;9.9294004030526e-05;-7.3179668106604e-05;1.8815933799488e-05;0.00039306975668296;-1.5959703887347e-05;-0.00015448011981789;0.00025259892572649;-0.0001430029515177;-0.00063307787058875;-0.00010229661711492;0.00027107534697279;0.00017563975416124;2.5893670681398e-05;-8.2827638834715e-05;2.0246305211913e-05;-8.8624319687369e-06;-0.00011725288641173;0.00010775856208056;0.00024966668570414;-3.8787198718637e-05;5.3293151722755e-05;5.3414449212141e-05;0.00050326896598563;-0.00023556103406008;2.8471272344177e-06;0.00035836378810927;-0.00034073370625265;-8.9310044131707e-05;0.00017610102077015;-0.00016471084381919;9.4082779469318e-06;-0.00017396626935806;-6.5330546931364e-05;8.2322374510113e-05;-2.4545059204684e-05;-0.00013460968330037;1.2976343896298e-05;-0.00015171759878285;7.8965422289912e-06;0.0013434048742056;3.6382341477292e-06;0.00057385867694393;-5.7268374803243e-05;-4.2782114178408e-05;0.0001248224725714;5.5308766604867e-05;-4.1700393921928e-05;9.0171424744767e-06;3.3241674827877e-05;0.00037005459307693;-5.1710543630179e-05;-3.4867647627834e-05;-5.6600583775435e-05;-0.00027888192562386;0.00073138723382726;9.4809744041413e-05;-0.0011788792908192;0.00020025529374834;-0.00020122114801779;-0.00043304829159752;-0.0010068266419694;-1.5779340174049e-05;-3.9217069570441e-05;8.340178465005e-05;1.3179062989366e-05;7.6824909456263e-07;-9.9143959232606e-05;4.4600594264921e-05;-0.00014513070345856;0.00013135194603819;0.00093426270177588;-2.7538005724637e-06;-0.00021387015294749;-0.0002127785992343;-6.0898400988663e-05;-5.5835138482507e-05;5.8118444030697e-06;2.0832647351199e-05;-0.00061550794634968;-9.0476787590887e-05;8.4505685663316e-05;-1.2879521818832e-05;7.3768445872702e-05;-1.2702861567959e-05;-0.0005663723568432;-0.00031034342828207;-2.6643581804819e-05;7.6583244663198e-05;0.00041513922042213;0.00015989909297787;0.00016100105131045;-8.0191857705358e-05;5.8346780861029e-05;2.73789773928e-05;6.7090528318658e-05;0.0003478282596916;3.4725278965198e-05;-0.00018131392425857;-1.0826663128682e-05;0.00035453974851407;-0.00020759871404152;-0.0014631625963375;-0.00025269328034483;0.00011919486860279;0.00036997452843934;3.4021562896669e-05;-7.5775096775033e-05;1.3609379493573e-05;-1.8063683455694e-05;-1.1189666793143e-06;0.00017069197201636;9.4635397545062e-05;-5.8058190916199e-05;4.3765343434643e-05;9.1186877398286e-05;0.0011454989435151;-0.00026141636772081;-2.4918794224504e-05;0.00053827615920454;-0.00071656220825389;-1.5973717381712e-05;0.00018233867012896;0.00027834923821501;5.1009992603213e-05;-0.00015759238158353;-0.00015102517500054;5.2993914323451e-06;-4.5719210902462e-05;-6.205853424035e-05;1.9344826796441e-05;-0.000191267739865;-1.1783325135184e-05;0.0018491114024073;-9.1766007244587e-05;0.00089579995255917;-3.2675856687092e-07;-5.4296098824125e-05;0.00018715114856604;7.2279101004824e-05;-6.3680316088721e-05;-0.00012399960542098;8.2305043179076e-05;0.00052662694361061;-9.6028030384332e-05;-1.0586563803372e-06;-6.7714594479185e-05;-0.00012838996190112;0.0011564269661903;0.00013272489013616;-0.0018898614216596;0.00013042363571003;-0.00030154999694787;-0.0006524003110826;-0.0013094553723931;1.4520114746119e-05;-0.00012551178224385;8.8323089585174e-05;9.9130600574426e-05;-9.6095172921196e-06;-0.00018854771042243;7.2424241807312e-05;-0.0002559385902714;0.00019881245680153;0.0010240874253213;-9.6545911219437e-05;-0.00036836779327132;-0.00025429914239794;-0.00010977779311361;-0.00013645442959387;4.305060065235e-05;1.2555374269141e-05;-0.00056410604156554;-0.00012509981752373;0.00016283760487568;-4.0174185414799e-05;3.1847088393988e-05;2.7494497771841e-05;-0.00060086383018643;-0.00070965988561511;-5.1282095228089e-05;0.00048038849490695;0.00046575276064686;0.00026902306126431;0.000397984724259;-0.00031252668122761;0.00014312070561573;0.0001293546956731;5.2579740440706e-05;0.00037506929947995;5.1713665015996e-05;-0.00021874636877328;-2.1829560864717e-05;0.00042305319220759;-0.00025246074073948;-0.0021231325808913;-0.00038020766805857;2.4513754397049e-05;0.00052230060100555;3.8721638702555e-05;-5.8100496971747e-05;7.1665081122774e-06;-2.6334237190895e-05;0.00010915999882855;0.00021588688832708;-3.6680932680611e-05;-7.5278701842763e-05;3.7874495319556e-05;0.00011659843585221;0.0016856594011188;-0.00023189185594674;-4.249547055224e-05;0.0006130010006018;-0.0010146306594834;3.5067103453912e-05;0.00015372125199065;0.00062877417076379;8.8837907242123e-05;-0.00014790719433222;-0.00021561389439739;-6.1307750002015e-05;-6.1050071963109e-05;3.9867353507361e-07;2.6357352908235e-05;-0.00021335763449315;-3.5811586712953e-05;0.0021609927061945;-0.00018924444157165;0.0011034110793844;8.1174206570722e-05;-6.389769987436e-05;0.00023324249195866;8.2783604739234e-05;-8.1918085925281e-05;-0.00022683684073854;0.00013017417222727;0.00061354727949947;-0.00013357130228542;2.4685810785741e-05;-6.7363544076215e-05;8.4238163253758e-05;0.0014862661482766;0.00015801358676981;-0.0024348774459213;5.8749774325406e-06;-0.0003612452710513;-0.00081756222061813;-0.0014662945177406;4.5383912947727e-05;-0.00018169538816437;7.5408745033201e-05;0.00016169295122381;-2.0366176613607e-05;-0.00024626887170598;9.3421258497983e-05;-0.00033561591408215;0.00024282930826303;0.00096955784829333;-0.0002015262725763;-0.00052911025704816;-0.00026413056184538;-0.00014698450104333;-0.00021187018137425;7.1435504651163e-05;5.5598798098799e-06;-0.00048950308701023;-0.0001392075791955;0.00019745451572817;-6.7100816522725e-05;-9.4371334853349e-06;6.8176494096406e-05;-0.00054312264546752;-0.0010771695524454;-7.2366667154711e-05;0.00088499271078035;0.00045908280299045;0.00036496701068245;0.00061561848269776;-0.00044206186430529;0.00021965327323414;0.00022329861531034;2.9653238016181e-05;0.00037542256177403;6.1636485042982e-05;-0.00022960684145801;-3.0524923204212e-05;0.00037952992715873;-0.00022839811572339;-0.0020930268801749;-0.00038003068766557;-1.6378773580072e-05;0.00050581945106387;3.446333357715e-05;-3.291614484624e-05;7.0792407314002e-07;-2.5565861506038e-05;0.00014871991879772;0.00019808608340099;-0.00010447081876919;-7.0869435148779e-05;3.1637067877455e-05;0.00010608484444674;0.0016814542468637;-0.00015083346806932;-4.2267503886251e-05;0.00050658761756495;-0.00098684278782457;5.2190967835486e-05;9.5447700005025e-05;0.00070963654434308;9.3263115559239e-05;-0.00012185962987132;-0.00020809109264519;-8.4705359768122e-05;-5.7217534049414e-05;3.3870484912768e-05;2.5974906748161e-05;-0.00018175925652031;-4.7714696847834e-05;0.0018990901298821;-0.00021876956452616;0.0010127054993063;0.00013041296915617;-5.5532309488626e-05;0.00021486516925506;7.1745882451069e-05;-7.7621858508792e-05;-0.00023829167184886;0.00013765097537544;0.00053777865832672;-0.00013153690088075;3.5148423194187e-05;-5.0638627726585e-05;0.00023684653569944;0.001404969021678;0.00014316529268399;-0.0022970004938543;-0.00010229491454083;-0.0003290297172498;-0.00075898703653365;-0.001257386058569;5.7215598644689e-05;-0.00018041441217065;4.6670273150085e-05;0.0001627793390071;-2.3761713237036e-05;-0.00022806918423157;8.7764754425734e-05;-0.00031760189449415;0.00021884360467084;0.00071764428867027;-0.00024279406352434;-0.00053357030265033;-0.00021175744768698;-0.00014128354087006;-0.00021582773479167;7.3587674705777e-05;5.6608978837858e-08;-0.00034825777402148;-0.00011390916188248;0.00016762333689258;-7.368708611466e-05;-3.2409614505013e-05;8.040859393077e-05;-0.00036606393405236;-0.0010902311187238;-7.0949106884655e-05;0.00095798110123724;0.00035332120023668;0.00035625376040116;0.00062575447373092;-0.00040724905556999;0.00022798644204158;0.00023893738398328;7.8754637797829e-06;0.00030097586568445;5.3651245252695e-05;-0.00018693250603974;-2.8376696718624e-05;-5.780747596873e-05;6.8646630097646e-05;-0.00063933792989701;0.00038524644332938;8.2237842434552e-05;3.5403594665695e-05;-4.7353038098663e-05;8.3035411080346e-05;-4.8416050049127e-06;6.3700144892209e-07;0.0001507259439677;-0.00012660337961279;-4.9406928155804e-05;5.1831957534887e-05;4.77054672956e-05;-2.701445009734e-05;0.0002001889370149;6.4919193391688e-05;-1.1229931260459e-05;-0.00021319296502043;5.6003398640314e-05;0.00018052243103739;-0.00023360220075119;0.00027272690203972;-0.00019413761037868;-8.6392137745861e-05;1.6387375580962e-05;-5.4039592214394e-05;5.7486609875923e-05;2.0435102214833e-06;-1.0789422049129e-05;-3.4107163173758e-06;-1.135046750278e-05;-3.683488102979e-06;-0.00017648188804742;0.00052400544518605;0.0004379904421512;4.7385536163347e-05;9.2124377260916e-05;-2.9861848815926e-05;-5.050784238847e-05;-5.9388450608822e-05;-3.5465174732963e-05;3.3193537092302e-05;-2.383763785474e-05;7.1714814112056e-05;6.5286658355035e-05;0.0014818125637248;0.0010308484779671;0.00011998400441371;-0.0014190169749781;-0.0011742912465706;-0.00030272977892309;-0.00038700297591276;1.2142836567364e-05;0.00011747499229386;-0.00017312919953838;-0.00014932073827367;-2.827315711329e-06;-2.5006515897985e-06;-2.4990389647428e-05;-4.1668445192045e-06;-0.00019876653095707;-0.00010417769226478;-0.0004865973314736;-0.00054737913887948;-5.9426885854919e-05;-5.8917470596498e-05;-5.6459888583049e-05;-0.00010605448187562;1.0891833881033e-05;1.1219698535569e-05;0.00019609309674706;0.0001561047101859;-5.6742421293166e-05;-8.0322766734753e-05;-7.4247582233511e-06;2.2624100893154e-05;0.001047826022841;-0.00045372211025096;2.7906551622436e-05;0.00016358798893634;8.1994374340866e-05;0.00010409557580715;0.00019396412244532;3.5536493669497e-05;0.00011543712753337;3.9983984606806e-05;2.6758239982883e-05;-3.3816333598224e-05;-2.6658266506274e-05;2.5359979190398e-05;1.7082142221625e-05;-7.1902381023392e-05;7.8797616879456e-05;-0.00098724418785423;0.00068245508009568;0.0001646741584409;1.379281275149e-05;-7.0396527007688e-05;0.0001290058135055;-1.8166769223171e-05;1.1150006685057e-05;0.00024767499417067;-0.00020261148165446;-9.7090909548569e-05;0.00010544741235208;8.5378298535943e-05;-5.821164813824e-05;0.00024726236006245;0.00011277667363174;-1.2534047527879e-05;-0.00038676691474393;0.00015152462583501;0.00027280079666525;-0.00037357924156822;0.00044873388833366;-0.00035940314410254;-0.00015332220937125;5.1547784096329e-05;-9.4666494987905e-05;9.4704737421125e-05;1.357103974442e-05;-2.5402114260942e-05;-4.5442382543115e-05;-2.6210291252937e-05;-0.00010666076559573;-0.00031952298013493;0.00091462431009859;0.0007651558262296;7.9671553976368e-05;0.00014056671352591;-5.2599178161472e-05;-8.0172110756394e-05;-3.7335968954721e-05;-4.4628977775574e-05;1.8818833268597e-05;-5.0916063628392e-05;0.00012739696830977;0.00011655137495836;0.0025583193637431;0.0017118189716712;0.00019389502995182;-0.0023623928427696;-0.0020148346666247;-0.00051403389079496;-0.00062101968796924;5.0105732952943e-05;0.00020085490541533;-0.00030001031700522;-0.00025872979313135;-7.4403760663699e-06;2.5004405870277e-06;-3.0605857318733e-05;-7.7238910307642e-06;-0.00029174971859902;-0.00017270633543376;-0.00095169577980414;-0.00097509019542485;-0.00014150758215692;-0.00013497710460797;-0.00010570161248324;-0.00017723368364386;1.7333995856461e-05;1.7809958080761e-05;0.00035940413363278;0.00027646470698528;-0.00013437068264466;-0.00015404169971589;-1.6058678738773e-05;3.0292656447273e-05;0.0017800114583224;-0.00081841426435858;3.7903035263298e-05;0.00031173031311482;0.00018640779308043;0.00022063989308663;0.0003455339174252;0.00014029987505637;0.00022721232380718;8.5971820226405e-05;6.2964289099909e-05;-7.2028407885227e-05;-5.0012855353998e-05;5.8210654970026e-05;3.7397720006993e-05;-7.6372423791327e-05;7.4293144280091e-05;-0.00086650013690814;0.00071711972123012;0.00015183552750386;-3.3625967716944e-06;-6.9073736085556e-05;0.00012175841402495;-1.7667605789029e-05;1.2827707905672e-05;0.0002327116089873;-0.00020173848315608;-8.6084808572195e-05;0.00011237100989092;7.9902514698915e-05;-6.0252954426687e-05;0.00013135655899532;9.8798795079347e-05;-9.3956523414818e-06;-0.00035841282806359;0.00018251911387779;0.00026114872889593;-0.00035757359000854;0.00039869689499028;-0.00037455352139659;-0.00014093054051045;5.8664929383667e-05;-8.880040695658e-05;9.396240056958e-05;1.1204431757506e-05;-2.8452181140892e-05;-5.1693801651709e-05;-1.7312488125754e-05;-0.00015857980179135;-0.00028207286959514;0.00087078649085015;0.00073922309093177;8.0963887739927e-05;0.00012934551341459;-5.3745632612845e-05;-7.3895673267543e-05;-1.5576033547404e-05;-5.793897798867e-05;1.378890488013e-06;-3.9616501453565e-05;0.00012259610230103;0.00011361753422534;0.00246851448901;0.0016329578356817;0.00018423523579258;-0.0022260565310717;-0.0019672885537148;-0.00050009618280455;-0.00057974661467597;7.4838819273282e-05;0.00018538237782195;-0.0002874436613638;-0.00025178270880133;-1.3197592124925e-05;7.0637343014823e-06;-2.1699142962461e-05;-1.3161426068109e-05;-0.00026383198564872;-0.0001810377871152;-0.00094490475021303;-0.00092596525792032;-0.00011881558748428;-0.00013856336590834;-0.0001018142720568;-0.00016530782158952;1.3745613614446e-05;1.8951690435642e-05;0.0003522596671246;0.00026950406027026;-0.00013827531074639;-0.00014444687985815;-1.1120122508146e-05;2.3304808564717e-05;0.0017239443259314;-0.00076887873001397;3.7914152926533e-05;0.00025961545179598;0.00019649488967843;0.00021330353047233;0.00031600650982;0.00015681146760471;0.00020519802637864;7.4103620136157e-05;6.8298344558571e-05;-7.4789029895328e-05;-4.7641045966884e-05;6.0234408010729e-05;3.5701341403183e-05;0.00016975453763735;-0.00024709061835892;0.00029035547049716;0.0014012373285368;-0.00042101845610887;9.7645082860254e-05;1.4668765288661e-05;-1.7730568288243e-05;1.4297645066108e-05;8.529727892892e-06;-0.00017512631893624;-8.2416001532692e-05;5.2960062021157e-05;0.00012801682169084;-7.8130040492397e-05;-1.6441785192001e-05;-0.0012010356876999;9.129576937994e-05;2.6701669412432e-05;0.00076926534529775;-0.00036340003134683;-4.2464951548027e-05;-6.5337590058334e-05;-6.7450790083967e-05;-0.00054968369659036;0.00017446096171625;4.5431090256898e-05;5.0582682888489e-05;6.0301208577584e-05;-2.0788640540559e-05;-4.7388937673531e-05;-6.4277926867362e-05;-7.1440350438934e-05;-0.00013903879153077;0.0011624185135588;0.00010336408013245;0.00057954445946962;0.00014231077511795;-2.9200009521446e-05;-5.2099934691796e-05;5.0111906602979e-05;0.00013409781968221;-0.00021666052634828;-8.6497544543818e-05;0.00033295984030701;-3.2579322578385e-05;2.6589192202664e-05;0.00016884514479898;0.0009374205255881;7.5701660534833e-05;-0.00010319124703528;-0.0014727144734934;-0.00049184233648703;-0.00018934562103823;1.785283893696e-05;-0.00067317363573238;2.5892375560943e-05;-0.00012571008119266;-3.2419189665234e-05;0.00011569263733691;6.09830058238e-05;-0.00015359380631708;0.00017768233374227;-0.0002665618667379;-0.00020177847181913;0.00060190015938133;-0.00013406186189968;-0.00021760871459264;-9.8486358183436e-05;-9.9669385235757e-05;-1.0724090316216e-05;5.5158780014608e-05;-9.9028831755277e-05;-0.0001851548004197;-5.8823512517847e-05;0.00013525951362681;4.684195300797e-05;-5.2668551688839e-06;-0.0001992820907617;-0.00053600367391482;-2.7554116968531e-05;0.00022396763961297;0.00036697488394566;0.00030359963420779;0.00018478084530216;0.00019341536972206;-0.00034714772482403;7.338276475366e-08;0.00011704095959431;4.0283899579663e-05;0.00019498063193168;-1.2937324754603e-05;-0.00014187033229973;0.00012474819959607;-0.00021005197777413;3.168009016008e-06;6.7877357651014e-05;-7.0752554165665e-05;-0.00019778015848715;4.5457429223461e-05;-1.0086949941979e-06;-4.3990954168294e-07;-1.1457992513897e-05;-0.0001022293290589;0.00035332847619429;2.2208196241991e-05;-0.00022778718266636;-1.3234578545962e-05;-8.9081229816657e-05;-9.5394512754865e-05;0.00012663842062466;-1.1984088814643e-05;9.2603891971521e-05;-0.00012651800352614;-7.6611591794062e-05;4.9675927584758e-05;4.3951986299362e-05;0.0001418600731995;9.0893618107657e-06;0.00015651845023967;2.3467007849831e-05;-0.00019470327242743;-1.4851326341159e-05;0.00018329363956582;-2.389971541561e-06;-8.8412984041497e-05;7.2176677349489e-05;0.00081802718341351;-8.7956112110987e-05;0.00039526005275548;5.7454111811239e-05;-1.041080304276e-05;-2.7316535124555e-05;4.2041308915941e-05;1.7772341379896e-05;0.00015044523752294;-2.5947514586733e-05;0.00024841603590176;-4.007820825791e-05;-6.9027300924063e-05;-0.00029860777431168;0.0004306448972784;7.4597781349439e-05;0.00018829543842003;-0.00064696453046054;-0.00023767024686094;-0.0001860660413513;-4.3916363210883e-05;-0.0007278915727511;8.1466321717016e-05;-8.4998910097056e-06;2.3987174699869e-06;-9.5573916041758e-05;2.4398541427217e-05;-6.6649013206188e-06;0.00010873224528041;-0.00010931086580968;1.8531987734605e-05;0.00086509750690311;-0.00018043890304398;-0.00017616478726268;4.1169656469719e-05;-6.282778485911e-05;1.2318211702222e-05;-2.8918457246618e-06;-8.1227313785348e-05;-0.00056940614013001;9.4260235528054e-07;3.8449366002169e-06;-4.3186453694943e-05;8.9070344984066e-05;-0.0004750200023409;4.4503743993118e-05;-2.5794641260291e-05;0.00038504696567543;-0.00031576896435581;-7.7097749453969e-05;0.00016429847164545;2.4963492251118e-05;0.00010954149183817;7.1083210059442e-05;1.8047279581879e-06;2.3070131646818e-05;0.0002974632079713;2.1244527488307e-06;-0.00014447190915234;0.00042113749077544;-0.00021584096248262;-0.0015249538701028;-0.00022440966858994;-8.5612271504942e-05;0.00037878702278249;3.0375564165297e-05;-7.3975708801299e-05;-4.8258830247505e-06;-4.6779759941273e-06;-0.00026862093363889;0.00016509756096639;2.0556246909109e-06;-3.9952963561518e-05;8.8630949903745e-05;8.9007029600907e-05;0.0011130020720884;-0.0003311958280392;-5.8567329688231e-05;0.00063010910525918;-0.00071857520379126;8.9988163381349e-05;0.00020700693130493;0.00062968349084258;3.3352025639033e-05;-0.00015918926510494;-0.00016124689136632;0.00011974094377365;-4.7575809730915e-05;-9.1431444161572e-05;1.2678123312071e-05;-4.0222290408565e-05;-0.00010661809210433;0.0016542364610359;-2.2670190446661e-05;0.00094626762438565;5.7803837989923e-05;-1.1376809197827e-05;0.00018459743296262;5.5547752708662e-05;-5.5370699556079e-05;-0.00020670190860983;0.00014245262718759;0.00054450577590615;-7.8276563726831e-05;1.7474705600762e-05;-7.2884984547272e-05;-9.6880161436275e-05;0.0011924033751711;0.00013978101196699;-0.0018254882888868;4.5824283006368e-05;-0.00036610523238778;-0.00066892261384055;-0.0011960085248575;-6.2955681642052e-05;-0.00020068790763617;8.1578451499809e-05;8.7270440417342e-05;-2.8687407393591e-05;-0.0001858175965026;7.5931115134154e-05;-0.00036379159428179;0.0002368191635469;0.0013386340579018;-0.00017748191021383;-0.00014317451859824;-0.00023694703122601;-0.00011278744204901;-6.0912210756214e-05;4.447296669241e-05;-5.1022556135649e-07;-0.00056169246090576;-0.00012970693933312;0.00018952712707687;-6.7460583522916e-05;5.4264597565634e-05;8.1131174738402e-06;-0.00047883289516903;-0.00031424852204509;-2.5906721930369e-05;-0.00011561126302695;0.00044353140401654;0.00019192160107195;0.00017946986190509;-0.00043195855687372;0.00018874209490605;7.5416617619339e-05;6.0752536228392e-05;0.00039581200690009;5.3792111430084e-05;-0.00023657137353439;-3.675032985484e-06;0.00053819868480787;-0.00028277924866416;-0.0024800396058708;-0.00038789489190094;-0.00015558616723865;0.00059663684805855;4.715140312328e-05;-8.3654238551389e-05;-1.2246000551386e-05;-1.3990109437145e-05;-0.00013051542919129;0.00022167534916662;-0.00012150519614806;-6.3691921241116e-05;9.0762478066608e-05;0.00013775555999018;0.0018607283709571;-0.00038485074765049;-8.0904457718134e-05;0.00085023941937834;-0.001163489301689;0.00012755456555169;0.00024684917298146;0.0010320123983547;8.8034343207255e-05;-0.00018045828619506;-0.00025872979313135;4.3311512854416e-05;-6.4831947383936e-05;-3.2566811569268e-05;1.6824029444251e-05;-6.9149347837083e-05;-0.00014820288924966;0.002260516397655;-0.00012644332309719;0.0013402581680566;0.0001643389405217;-1.8455175450072e-05;0.00027409355971031;7.2285714850295e-05;-8.359641651623e-05;-0.00036310599534772;0.00021321534586605;0.00072226725751534;-0.0001286039914703;5.5750639148755e-05;-8.6365893366747e-05;0.00012236073962413;0.0017875990597531;0.00019183312542737;-0.0027457654941827;-9.6868338005152e-05;-0.00050394237041473;-0.00098161504138261;-0.0015424884622917;-4.1240546124754e-05;-0.00030680780764669;7.7621487434953e-05;0.00017467366706114;-4.4780703319702e-05;-0.00028040428878739;0.00011102193093393;-0.00052350212354213;0.00032279992592521;0.0015393610810861;-0.00033876794623211;-0.00024812677293085;-0.00027642349596135;-0.00016542508092243;-0.00014407394337468;7.6724107202608e-05;-8.6190821093624e-06;-0.00057284877402708;-0.00016072891594376;0.00026129858451895;-0.00011445595737314;3.4887907531811e-05;5.0770820962498e-05;-0.00044070649892092;-0.0006707432330586;-3.9668357203482e-05;0.00015568047820125;0.00048770665307529;0.00028439293964766;0.00040376660763286;-0.00066451035672799;0.00030933448579162;0.00015640923811588;4.7800665925024e-05;0.00046912158722989;7.2553200880066e-05;-0.00029396644094959;-1.0041309906228e-05;0.00047602388076484;-0.0002507267636247;-0.0024995063431561;-0.00039523199666291;-0.00016139094077516;0.00058759661624208;4.6287477744045e-05;-6.1224411183503e-05;-1.759883343766e-05;-1.5292054740712e-05;-1.595304820512e-05;0.00019621208775789;-0.00018862540309783;-6.1347702285275e-05;7.5738673331216e-05;0.00013152176688891;0.0019035803852603;-0.00029582850402221;-7.5423718953971e-05;0.00074250821489841;-0.0011641451856121;0.00012348136806395;0.00019182992400602;0.0010756311239675;0.0001015599409584;-0.00015441444702446;-0.00025562397786416;-1.2920130757266e-05;-5.7822751841741e-05;1.6049214536906e-05;1.5055617950566e-05;-5.5291351600317e-05;-0.000151236410602;0.0020262682810426;-0.00017708048108034;0.0012679334031418;0.00022933374566492;-1.2474199138524e-05;0.00026449764845893;6.1599392211065e-05;-8.2114624092355e-05;-0.00037859875010327;0.000216740052565;0.0006431975052692;-0.0001313194661634;7.0947411586531e-05;-6.721745012328e-05;0.00032257486600429;0.0017585402820259;0.00017871259478852;-0.0026846784166992;-0.00023659100406803;-0.00047630403423682;-0.00094761559739709;-0.0013352712849155;-1.4735306649527e-05;-0.00030886873719282;4.1651281208033e-05;0.00018461806757841;-4.7087734856177e-05;-0.00026660948060453;0.00010647996532498;-0.00050306494813412;0.00029312094557099;0.0012176713207737;-0.00039747709524818;-0.00026250895461999;-0.00021322967950255;-0.00015990766405594;-0.0001639150432311;7.9052813816816e-05;-1.3823976587446e-05;-0.00040691762114875;-0.00012821004202124;0.00022575235925615;-0.00012484574108385;9.1367328423075e-06;7.0999725721776e-05;-0.00021487129561137;-0.00073867809260264;-3.8673788367305e-05;0.00029380177147686;0.00035574362846091;0.00027899822453037;0.00045164659968577;-0.00062366074416786;0.00032396020833403;0.00017661850142758;1.9563911337173e-05;0.00038573908386752;6.361749547068e-05;-0.00024637178285047;-9.2668815341312e-06;-0.00013838686572853;0.00014113578072283;-0.0010243176948279;0.00074631028110161;5.9096262702951e-05;7.1179019869305e-05;-3.7830766814295e-05;8.4420476923697e-05;-2.5133798772004e-05;1.8658689441509e-05;0.00031095920712687;-0.00026659705326892;-0.00014139694394544;0.00013783489703201;5.7459616073174e-05;-3.3138370781671e-05;0.00020906695863232;7.8525183198508e-05;-1.1934183021367e-05;-4.685500607593e-05;-0.00012773377238773;0.00017950071196537;-0.00024815852520987;0.00044370032264851;-0.00034316623350605;-9.6709416538943e-05;1.3263264918351e-05;-0.00010938067134703;0.00010773829853861;4.4684689783026e-05;-5.2794443035964e-05;-8.8965998656931e-06;-2.6372615593573e-06;-8.2298829511274e-05;-0.00025846174685284;0.00099872483406216;0.0008347422699444;0.00013776500418317;0.00018255510076415;-5.6830253015505e-05;-7.6253301813267e-05;-0.00010427153029013;-9.0462264779489e-05;5.3400955948746e-05;-1.2626631360035e-05;0.00013854025746696;0.00012094018893549;0.0023801231291145;0.0019304456654936;0.00016645196592435;-0.002392111113295;-0.0020700418390334;-0.00061990134418011;-0.00069760764017701;7.0488866185769e-05;0.00019080814672634;-0.00037288750172593;-0.00031328995828517;2.9954430829093e-06;3.9327951526502e-06;-3.8866881368449e-05;-1.4470225323748e-05;-0.00033050743513741;-0.00020591061911546;-0.00079406466102228;-0.00083085859660059;0.00012981877080165;9.5771662017796e-05;-9.0670720965136e-05;-0.00014990144700278;7.4272229539929e-06;6.9009374783491e-06;0.00037698086816818;0.00027555899578147;-0.00013756917905994;-0.00015302338579204;2.0708295778604e-05;5.8237612392986e-05;0.0019868481904268;-0.00041129757300951;5.7589459174778e-05;-0.00021839136024937;-0.00026381248608232;0.00010641155677149;0.00021278193162289;8.0328667536378e-05;0.00017418003699277;5.7963488870882e-06;-3.4513464015618e-06;-5.4101579735288e-05;-2.8006794309476e-05;4.8149024223676e-05;2.8077665774617e-05;-0.00014384002133738;0.00013840207247995;-0.00094084063312039;0.00080951867857948;4.5464883442037e-05;6.1311176978052e-05;-3.8891867006896e-05;8.1673366366886e-05;-2.3964956199052e-05;2.040099388978e-05;0.00030382341356017;-0.00027173949638382;-0.00013050586858299;0.00014930611359887;5.2274717745604e-05;-3.675757398014e-05;0.00010270818893332;7.2747265221551e-05;-9.3493945314549e-06;-1.9452809283393e-05;-0.00010562876559561;0.00017576939717401;-0.00024632320855744;0.00040387758053839;-0.00037443285691552;-8.5387480794452e-05;2.0576797396643e-05;-0.00010614075290505;0.00011018809163943;4.1947114368668e-05;-5.6734206737019e-05;-1.9334829630679e-05;8.9341710918234e-06;-0.00012102185428375;-0.00022877450101078;0.00098289363086224;0.0008365722023882;0.00014217555872165;0.00017725644283928;-5.8905166952172e-05;-7.3460774729028e-05;-8.2952421507798e-05;-0.00010900176130235;3.970477700932e-05;-1.4915008250682e-06;0.00013561037485488;0.00012282749230508;0.0023640773724765;0.0019162565004081;0.0001643151481403;-0.0023363286163658;-0.0020898636430502;-0.00062643201090395;-0.00068112765438855;8.6475381976925e-05;0.00018189610273112;-0.00036678632022813;-0.00031698844395578;-3.8166044760146e-06;9.4092529252521e-06;-3.1124589440878e-05;-2.099369703501e-05;-0.00031106983078644;-0.00022290510241874;-0.00081562955165282;-0.00079890358028933;0.00014506706793327;9.6584975835867e-05;-8.8660657638684e-05;-0.00014623886090703;3.9654892134422e-06;9.2600994321401e-06;0.00037599782808684;0.00027638749452308;-0.00014433533942793;-0.00014555267989635;2.5492976419628e-05;5.4214560805121e-05;0.0019840237218887;-0.00038918637437746;5.8654382883105e-05;-0.00024753526668064;-0.00026516089565121;0.00010332464444218;0.00019841353059746;0.00010122248932021;0.00015229576092679;-4.089837148058e-06;8.1180638744627e-07;-5.740924825659e-05;-2.5598063075449e-05;5.1063616410829e-05;2.5494782676105e-05;0.00017942565318663;-0.00031730448245071;0.0003408630436752;0.0019081850768998;-0.00055287126451731;0.00023687275825068;2.6824480301002e-05;-2.8040667530149e-05;7.05916681909e-06;3.1966144888429e-05;-0.00016515939205419;-2.1506223220058e-06;4.7157773224171e-05;0.00025449864915572;-0.00010878170724027;-5.5533968406962e-05;-0.0015616446034983;0.00016640033572912;5.0419355829945e-05;0.0010394715936854;-0.00054995209211484;-9.2592650617007e-05;-0.0001267229381483;-9.8776836239267e-05;-0.00094228313537315;0.00024480209685862;6.2478895415552e-05;4.9974391004071e-05;2.3710868845228e-05;-1.1169093340868e-05;-5.7126831961796e-05;-0.00019424525089562;6.9084104325157e-05;-0.00012257434718776;0.0012376466766;0.00026472334866412;0.00080536620225757;0.00019614357734099;1.6427464288427e-05;-6.0260008467594e-05;3.8168378523551e-05;0.00024937014677562;-0.00037376701948233;-9.2064728960395e-05;0.00041556084761396;-4.018342224299e-05;6.6569788032211e-05;0.00037650726153515;0.0013454601867124;0.00010827394726221;-0.00034613301977515;-0.0019109266577289;-0.00069723225897178;-0.00033124090987258;-5.8369289035909e-05;-0.00067926669726148;-1.8643074781721e-06;-0.00024959989241324;-6.6761596826836e-05;0.00014339364133775;8.3268954767846e-05;-0.00019147497368976;0.00024986793869175;-0.0004612427437678;-0.00040915017598309;0.0010073848534375;-9.1881047410425e-05;1.1030519999622e-05;-5.6212480558315e-05;-0.00013174752530176;-3.1546198442811e-05;7.1271737397183e-05;-9.9041484645568e-05;-0.00019786199845839;-0.00012120525934733;0.00019304497982375;5.3689494961873e-05;2.484402830305e-05;5.8537953009363e-05;-0.00023276939464267;4.6701114797543e-07;0.00014660967281088;-0.00021022214787081;0.00016058741312008;0.00012857931142207;0.00031601966475137;-0.0005647229263559;-1.2787722880603e-05;7.9316356277559e-05;4.7454333980568e-05;0.00026386280660518;6.1856635511504e-06;-0.00019836256979033;0.00021826261945534;-0.00036894911318086;0.0003559507895261;0.0019578579813242;-0.00058303191326559;0.00023572612553835;3.6867229937343e-05;-2.787515950331e-05;8.6516365627176e-06;2.7061856599175e-05;-0.00020535214571282;4.7956633352442e-05;5.4021078540245e-05;0.00021764969278593;-0.0001148605151684;-6.1671671574004e-05;-0.0015986980870366;0.0002138154959539;5.3515293984674e-05;0.0010736281983554;-0.00061690277652815;-0.00011604281462496;-0.00013327530177776;-8.8012668129522e-05;-0.00093161396216601;0.00025398668367416;7.7455981227104e-05;6.0927588492632e-05;1.5625639662176e-06;-1.6035306543927e-05;-3.2575931982137e-05;-0.0001801377220545;3.4813532693079e-05;-0.00010331838711863;0.0014663090696558;0.00020330643747002;0.00087403005454689;0.00020569594926201;4.8508213694731e-06;-6.4588901295792e-05;5.0858299800893e-05;0.00024285986728501;-0.00036149105289951;-9.7908356110565e-05;0.00048028561286628;-5.4749245464336e-05;5.5223172239494e-05;0.00023879962100182;0.0013896479504183;0.00011824395187432;-0.0002275443112012;-0.0020231674425304;-0.00073044572491199;-0.00034703899291344;-6.4414205553476e-05;-0.00085463671712205;3.1265240977518e-05;-0.00024686814867891;-6.3249288359657e-05;0.00014285212091636;8.8412387412973e-05;-0.00020789561676793;0.00028347302577458;-0.00047872361028567;-0.00036547385388985;0.0012140938779339;-0.00016610552847851;-2.2764055756852e-05;-5.7144396123476e-05;-0.00014294493303169;-2.7719859645003e-05;7.4758245318662e-05;-0.0001386855437886;-0.00030039742705412;-0.00011209733202122;0.00022403916227631;4.304041431169e-05;3.669456782518e-05;-0.00014505319995806;-0.0002792993618641;-7.7967761171749e-06;0.00028323227888905;-0.00019944734231103;0.00017779787594918;0.00015977854491211;0.00031472684349865;-0.00060537207173184;1.1893972441612e-05;8.1488913565408e-05;5.7658420701046e-05;0.00031950435368344;1.8952853224619e-06;-0.00023505050921813;0.00014846089470666;-0.00026137247914448;0.00019485111988615;0.0011283920612186;-0.00034598310594447;0.00015169703692663;3.0925584724173e-05;-1.47051505337e-05;2.2644583168585e-06;1.612983578525e-05;-0.00013445049989969;0.00014379218919203;2.9841143259546e-05;9.7256495791953e-05;-6.8613888288382e-05;-5.9175643400522e-05;-0.00090287567581981;0.00017431046580896;3.7229885492707e-05;0.00062313745729625;-0.00041312593384646;-9.3176000518724e-05;-9.4103495939635e-05;-3.7565543607343e-05;-0.00056705134920776;0.00014992264914326;6.8856730649713e-05;3.9811977330828e-05;-5.7794710301096e-05;-9.8579030236579e-06;2.297134960827e-05;-0.00012514837726485;3.9762315282132e-05;-1.4939012544346e-05;0.00095877790590748;9.4569870270789e-05;0.0005720354965888;0.00012587767560035;9.2755471996497e-06;-3.8341422623489e-05;3.3429278119002e-05;0.00015481472655665;-0.00020674800907727;-5.3460553317564e-05;0.00032941717654467;-4.38610513811e-05;2.3755172151141e-05;4.270681165508e-05;0.00085600750753656;8.0102028732654e-05;-7.8409022535197e-05;-0.0012319625820965;-0.00045604302431457;-0.00023870148288552;-7.16755821486e-05;-0.00060153426602483;3.9548605855089e-05;-0.00015783194976393;-3.9845988794696e-05;6.7013803345617e-05;5.5485623306595e-05;-0.00012407725444064;0.00019666030129883;-0.00031915563158691;-0.00020529334142338;0.00096995959756896;-0.00014166694018058;2.8867438231828e-05;-6.3357929320773e-06;-9.324088023277e-05;-1.6445979781565e-05;4.3820939026773e-05;-0.00010601375834085;-0.00028100665076636;-6.6781292844098e-05;0.00015340332174674;8.7953048932832e-06;4.5170083467383e-05;-0.00019098198390566;-4.8332603910239e-05;-2.7211117412662e-06;0.00025498706963845;-0.00032780272886157;3.3678079489619e-05;9.450301877223e-05;0.00019144726684317;-0.00038884099922143;2.8825215849793e-05;2.6630608772393e-05;4.0298011299456e-05;0.00024677184410393;4.6227173697844e-06;-0.00017382109945174;0.00040772254578769;-0.00018834121874534;-0.0018496782286093;-0.00026674239779823;-0.00023256104032043;0.00043486134381965;3.310449392302e-05;-6.4113191911019e-05;-1.9709948901436e-05;-2.4785131245153e-06;-0.00022725702729076;0.00013535277685151;-0.00014720445324201;-3.4402033634251e-05;9.0356785221957e-05;0.00010360620217398;0.0013382331235334;-0.0003351449558977;-8.0229779996444e-05;0.00069213926326483;-0.00085697445319965;0.00015197729226202;0.00021076304255985;0.00094797107158229;6.9255707785487e-05;-0.00012910776422359;-0.00019907402747776;9.2238915385678e-05;-4.1806928493315e-05;-3.6870223993901e-05;4.1136167965306e-06;8.5258194303606e-05;-0.0001876544120023;0.0014692641561851;-3.2511492463527e-05;0.00095594418235123;0.00017508660675958;1.7146745449281e-05;0.00020230810332578;3.8550511817448e-05;-5.3383544582175e-05;-0.00037021827301942;0.00020365384989418;0.00052063912153244;-7.4850744567811e-05;5.7344488595845e-05;-6.6606276959646e-05;0.00011548830661923;0.0013202296104282;0.00013548013521358;-0.0019220475805923;-0.00014791186549701;-0.00038654389209114;-0.00072939367964864;-0.00096476246835664;-9.5969684480224e-05;-0.0002719204640016;4.5069809857523e-05;0.00013233062054496;-4.9330556066707e-05;-0.00020327849779278;8.2589009252843e-05;-0.00047224733862095;0.00026194733800367;0.0013448838144541;-0.0003174688317813;4.5146978663979e-05;-0.00017302465857938;-0.00011582620209083;-5.3395462600747e-05;5.3750503866468e-05;-1.6385998605983e-05;-0.0003896847483702;-0.00011752714635804;0.00021493549866136;-0.0001079280191334;4.7695171815576e-05;2.6481469831197e-05;-0.00018059686408378;-0.00016412013792433;4.6127681230246e-07;-0.00037216494092718;0.00030286781839095;0.00011373596498743;0.00012770232569892;-0.00060112081700936;0.00026397869805805;5.557596887229e-05;3.6955349060008e-05;0.00035078113432974;5.5166627134895e-05;-0.00022685150906909;6.2767276176601e-06;0.00039987912168726;-0.0001871679269243;-0.0021499379072338;-0.00030338781652972;-0.00023545986914542;0.00049397116526961;4.1469353163848e-05;-5.993538434268e-05;-2.6202482331428e-05;-4.9843665692606e-06;-9.6515650511719e-05;0.00013067420513835;-0.00021827899035998;-3.6607274523703e-05;8.1437756307423e-05;0.00011601394362515;0.0015789441531524;-0.00030376229551621;-7.9894591181073e-05;0.00070553459227085;-0.00099774671252817;0.00014449213631451;0.00020046463760082;0.0010691098868847;8.7851563876029e-05;-0.00012506678467616;-0.00022597674978897;2.7748710635933e-05;-3.9786686102161e-05;1.1746306881832e-05;1.3739024780079e-06;6.8155510234646e-05;-0.00019290544150863;0.0015220682835206;-0.00010309346544091;0.0010747984051704;0.00025748097687028;2.3186426915345e-05;0.0002288216346642;3.5812328860629e-05;-6.2711973441765e-05;-0.00040601752698421;0.00021957642456982;0.00052922160830349;-9.3804941570852e-05;8.0837809946388e-05;-5.7336386817042e-05;0.00033352646278217;0.0015326370485127;0.00014985448797233;-0.0022196718491614;-0.00030303731909953;-0.00043864993494935;-0.00082307099364698;-0.0009677218622528;-6.3462721300311e-05;-0.00031639129156247;1.7354783267365e-05;0.00015967950457707;-5.3193369240034e-05;-0.00022227270528674;9.0330075181555e-05;-0.00050966284470633;0.00026438498753123;0.0012002843432128;-0.00041764561319724;2.6346591766924e-05;-0.00013397648581304;-0.00012790347682312;-8.7479631474707e-05;6.2291874201037e-05;-2.2272672140389e-05;-0.00029570536571555;-9.8710457677953e-05;0.00020600137941074;-0.00013266580936033;3.2987227314152e-05;5.1982649893034e-05;1.7008924260153e-05;-0.00028089986881241;3.4115004154955e-07;-0.00026031240122393;0.00021418112737592;0.00013112877786625;0.00020920604583807;-0.0006293460028246;0.00031209329608828;8.3013059338555e-05;1.3817747458233e-05;0.00032673045643605;5.3803534683539e-05;-0.0002157324925065;6.7098485487804e-06;0.00021565875795204;-0.00010007235687226;-0.001434920122847;-0.00015875192184467;-0.00014274213754106;0.00032011105213314;3.1457297154702e-05;-3.4317174140597e-05;-2.2362270101439e-05;-1.6906436712816e-06;3.7755216908408e-05;5.7006345741684e-05;-0.00018175264995079;-1.2202656762383e-05;4.2132487578783e-05;7.4082905484829e-05;0.0010369069641456;-0.00015625974629074;-4.5096261601429e-05;0.00042956956895068;-0.0006697223871015;7.4896503065247e-05;0.00011255824210821;0.00070463569136336;4.6378321712837e-05;-6.8395063863136e-05;-0.00014620898582507;-2.8575006581377e-05;-1.5957401046762e-05;4.2388568544993e-05;-6.511098035844e-06;2.7972186217085e-05;-0.00011319825716782;0.00086400465806946;-0.0001114080514526;0.00073371414327994;0.00023500593670178;2.8379365176079e-05;0.00015326603897847;1.4002839634486e-05;-4.3165477109142e-05;-0.00024774658959359;0.00013107436825521;0.00030190515099093;-6.5032836573664e-05;6.8414105044212e-05;-2.1268782802508e-05;0.00041028944542632;0.0010804954217747;0.00010096801270265;-0.0015190257690847;-0.00035059594665654;-0.00031906843651086;-0.00055301073007286;-0.00053660507546738;-8.7491380327265e-06;-0.00023002065427136;-2.2529471607413e-05;0.0001048549747793;-3.1852538086241e-05;-0.00013625230349135;5.5183365475386e-05;-0.00032953690970317;0.00014337322500069;0.00056889955885708;-0.00033936213003471;5.8250345318811e-05;-2.3781540221535e-05;-7.9946905316319e-05;-6.5246946178377e-05;3.8315400161082e-05;-1.8651138816494e-05;-8.5332518210635e-05;-2.9045448172837e-05;0.00010116857447429;-0.00010151023889193;1.7136102542281e-05;4.7947472921805e-05;0.00025240198010579;-0.00016564651741646;9.0731155069079e-06;-0.00018767091387417;1.3002019841224e-05;6.4536245190538e-05;0.00013880083861295;-0.00037235661875457;0.00021785283752251;4.9236801714869e-05;-1.22194251162e-05;0.00016752688679844;2.7949952709605e-05;-0.0001129559459514;7.7917829912622e-06;-0.00017772131832317;0.00017720196046866;-0.00092200969811529;0.00069838610943407;-3.2226900657406e-05;0.00010874191502808;-1.232809972862e-05;4.2507734178798e-05;-2.407999636489e-05;1.9502358554746e-05;0.00032748360536061;-0.00028850871603936;-0.00015521590830758;0.00014567525067832;2.5938752514776e-05;-6.6180973590235e-06;0.00015415987581946;3.8239628338488e-05;-1.1715555046976e-05;0.0001978747168323;-0.00030087423510849;9.8089760285802e-05;-0.00012785798753612;0.00037813454400748;-0.00028635931084864;-3.5582579585025e-05;-2.3044736735756e-05;-0.00010786941129481;0.00010587371798465;6.1518599977717e-05;-6.7315959313419e-05;2.5839417503448e-05;1.7714193745633e-05;-5.497683014255e-05;-0.00018094212282449;0.00089537148596719;0.00075100315734744;0.00015729590086266;0.00018728512804955;-5.2417672122829e-05;-6.3922918343451e-05;-0.00015179434558377;-0.00012019694258925;6.9580783019774e-05;1.5832656572456e-05;0.00012578406312969;0.00010591469617793;0.0019228326855227;0.0017912980401888;0.00012766834697686;-0.0020604869350791;-0.0018030625069514;-0.00059900555061176;-0.00065187539439648;8.7207146862056e-05;0.00016526691615582;-0.0003652035666164;-0.0003031418309547;1.2675507605309e-05;6.6855673139798e-06;-4.0190079744207e-05;-1.803886880225e-05;-0.00032521353568882;-0.00020680314628407;-0.00055390264606103;-0.00061327568255365;0.00034736725501716;0.00026947175501846;-5.9110687288921e-05;-0.0001035761233652;-2.9742493552476e-06;-2.6371253625257e-06;0.00034308747854084;0.0002417785290163;-0.00011383439414203;-0.00012984052591491;4.7376390284626e-05;7.0794645580463e-05;0.001893850392662;1.7966547602555e-05;7.9726967669558e-05;-0.00062128558056429;-0.00058054662076756;-3.7458994484041e-05;4.5364133256953e-05;-3.0446607013346e-08;0.00010028191172751;-6.317703082459e-05;-5.326934842742e-05;-3.0870662158122e-05;-6.4876630858635e-06;3.0981926101958e-05;1.6246509403572e-05;-0.00018120897584595;0.0001711726654321;-0.00083855632692575;0.00078557943925261;-4.3598010961432e-05;9.922973549692e-05;-1.3463461073115e-05;4.1426472307649e-05;-2.3070411771187e-05;2.2333304514177e-05;0.00032162500428967;-0.00029531403561123;-0.00014257144357543;0.0001625049917493;2.0381290596561e-05;-1.3039726582065e-05;3.5098175430903e-05;4.2141618905589e-05;-8.1177777246921e-06;0.00022190780146047;-0.00027871984639205;9.2821879661642e-05;-0.00013403061893769;0.00033519335556775;-0.00033345373230986;-2.4280850993819e-05;-1.2582413546625e-05;-0.0001052351508406;0.00010973463213304;5.8524277847027e-05;-7.2431881562807e-05;6.0459587984951e-06;3.3616332075326e-05;-9.3055816250853e-05;-0.00015686113329139;0.00089354661758989;0.00076845457078889;0.00016303188749589;0.000183372743777;-5.4677850130247e-05;-6.2691688071936e-05;-0.0001204189757118;-0.00014392085722648;5.4238269513007e-05;2.6655354304239e-05;0.00012278561189305;0.00011162579176016;0.00194390444085;0.0018045970937237;0.00012845404853579;-0.0020368369296193;-0.0018579752650112;-0.00061613507568836;-0.00064344966085628;9.7205280326307e-05;0.0001617244706722;-0.00036025300505571;-0.00031384962494485;3.5326454508322e-06;1.444053123123e-05;-3.1058199965628e-05;-2.6047599021695e-05;-0.0003003494348377;-0.00023215702094603;-0.00060947734164074;-0.00058109353994951;0.00034543534275144;0.00027457947726361;-5.7835088227876e-05;-0.00010533280146774;-6.8133567765472e-06;8.8451037072446e-07;0.00034411891829222;0.00024770639720373;-0.00012722433893941;-0.00012194905866636;5.0691869546426e-05;6.8322355218697e-05;0.0019116613548249;1.8850398191717e-05;7.9747842391953e-05;-0.00061888579512015;-0.00059288955526426;-3.3796412026277e-05;4.2586878407747e-05;3.8192658394109e-05;7.3197195888497e-05;-6.8287314206827e-05;-4.9334397772327e-05;-3.6085904866923e-05;-3.4726879221125e-06;3.6761579394806e-05;1.2247322956682e-05;6.4065076003317e-05;-0.00016486967797391;0.00017517083324492;0.0013743607560173;-0.00037851839442737;0.00020514454809017;2.3373409931082e-05;-2.4535165721318e-05;-6.6382625618644e-07;3.2327632652596e-05;-3.3063606679207e-05;-4.2221814510413e-05;9.7592528618407e-06;0.00023553991923109;-8.1954211054835e-05;-3.9823939005146e-05;-0.0010644942522049;0.00012353993952274;3.8428188418038e-05;0.00075821182690561;-0.00042828693403862;-8.5192754340824e-05;-8.7865300884005e-05;-7.5736003054772e-05;-0.0007283688755706;0.00018108819494955;2.8428938094294e-05;1.1031962458219e-05;2.8025424398948e-05;1.0062341971206e-05;-6.2963561504148e-05;-0.000183322103112;0.00013363847392611;-7.2827511758078e-05;0.00062431342666969;0.00030839876853861;0.00056383467745036;0.00014819446369074;4.7824945795583e-05;-3.8955036870902e-05;6.2461622292176e-06;0.00019495794549584;-0.00032107488368638;-4.838731183554e-05;0.00024404360738117;-1.4141393876343e-05;7.1349437348545e-05;0.00045842866529711;0.0010465886443853;7.6083902968094e-05;-0.00046774491784163;-0.0013369868975133;-0.0005248638917692;-0.00027933390811086;-6.3326595409308e-05;-0.00027777580544353;-5.2166349632898e-05;-0.00022199137310963;-5.600316580967e-05;0.00010393831325928;5.4636886488879e-05;-0.00012357717787381;0.00014894855848979;-0.00037657760549337;-0.00039998418651521;0.0006656056502834;5.6721499277046e-05;0.00022465777874459;-9.9672142823692e-06;-8.3513637946453e-05;-3.294173075119e-05;4.3255411583232e-05;-1.4167841072776e-05;-4.2743336962303e-05;-0.00011795738100773;0.00012228007835802;4.6571880375268e-05;3.6548615753418e-05;0.00041136570507661;0.00012432820221875;3.4976488677785e-05;-0.00011631357483566;-0.000540099455975;-1.8707787603489e-05;-1.3919101547799e-05;0.00025008420925587;-0.00043559083133005;-3.8787198718637e-05;5.7636424344309e-07;2.4376098735956e-05;0.00015911387163214;1.829168832046e-05;-0.00012643124500755;0.00013421109179035;-0.00030098660499789;0.00032398797338828;0.0020331724081188;-0.00057419645600021;0.00032106306753121;3.4372238587821e-05;-3.0693976441398e-05;1.7281403188463e-06;4.2668350943131e-05;-0.00010257679241477;3.2111573091242e-05;3.1811410735827e-05;0.00031727101304568;-0.0001224765292136;-7.0830574259162e-05;-0.0016105083050206;0.00021590273536276;6.5029729739763e-05;0.0011130113853142;-0.00064842903520912;-0.00013261433923617;-0.00015835608064663;-0.0001241504214704;-0.0010947728296742;0.00027201769989915;5.6006072554737e-05;3.3713455195539e-05;3.0450448207375e-07;3.4206443615403e-06;-6.1211416323204e-05;-0.00028201166423969;0.00020099399262108;-7.2016504418571e-05;0.0010837364243343;0.00036723533412442;0.00081687833881006;0.00021399738034233;5.2595878514694e-05;-5.6482014770154e-05;2.1540285160881e-05;0.00030682742362842;-0.00048451410839334;-7.4308838520665e-05;0.00040989817352965;-4.0224738768302e-05;8.9598623162601e-05;0.00047791891847737;0.001465379493311;0.0001098347856896;-0.00050455838209018;-0.0019411608809605;-0.00075973221100867;-0.00037486598012038;-0.00012465604231693;-0.00052444019820541;-3.0562838219339e-05;-0.00030700047500432;-8.6635540355928e-05;0.00015394187357742;8.7172753410414e-05;-0.00019437934679445;0.00026828548288904;-0.00056562462123111;-0.00051976868417114;0.0011986232129857;-1.8760232705972e-05;0.00026291524409316;-1.4050878235139e-05;-0.00013091202708893;-4.4774755224353e-05;7.0703914389014e-05;-8.0725665611681e-05;-0.00015740656817798;-0.00015730770246591;0.00021977034339216;5.489985778695e-05;5.2381645218702e-05;0.00031115231104195;0.0001051393992384;3.5498444049153e-05;1.160035844805e-05;-0.0007178497617133;2.8935967293364e-06;2.0773659343831e-05;0.00036802815156989;-0.0006937708822079;-2.7341726308805e-05;1.642907045607e-05;4.8096484533744e-05;0.00027662559296004;2.0730120013468e-05;-0.00021625334920827;0.00014129531336948;-0.00029207396437414;0.00027524243341759;0.0016130411531776;-0.00046903229667805;0.00027404952561483;3.1248528102878e-05;-1.9987430277979e-05;1.8085629562847e-06;3.0103863537079e-05;-0.000119756332424;0.00012037103442708;3.211365401512e-05;0.00021982048929203;-9.815048542805e-05;-6.9755340518896e-05;-0.0012795450165868;0.00021279900101945;5.8740519307321e-05;0.00088025536388159;-0.00055495434207842;-0.00011861421808135;-0.00015006778994575;-9.0035806351807e-05;-0.00088349595898762;0.00021837923850399;5.9348643844714e-05;3.841052603093e-05;-4.3289139284752e-05;-3.5670248053066e-06;-1.4702740372741e-05;-0.00023065264394972;0.00015873833035585;-2.0518427845673e-05;0.0010119773214683;0.00023228696954902;0.00067175849108025;0.00017079531971831;3.3117055863841e-05;-4.5405635319185e-05;2.6591755158734e-05;0.00025244450080208;-0.0003848738851957;-5.9186240832787e-05;0.00037583615630865;-4.6867335186107e-05;5.841259189765e-05;0.00023163513105828;0.0011485203867778;9.1241199697834e-05;-0.00027866358868778;-0.0015615945449099;-0.00061027432093397;-0.00029439840000123;-0.0001254974049516;-0.00053557381033897;9.5152709036483e-06;-0.00023647086345591;-7.0038193371147e-05;0.00011728861863958;7.3602721386123e-05;-0.00016374650294892;0.00024865221348591;-0.00046593663864769;-0.00036402023397386;0.0011661881580949;-9.3001501227263e-05;0.00018045569595415;-4.2552183003863e-06;-0.00011244179040659;-3.2441730581922e-05;5.9861802583328e-05;-0.00010678030957934;-0.00022064529184718;-0.00011437893408583;0.00020613205560949;2.9603141229018e-05;5.0124333938584e-05;3.3742937375791e-05;6.4697436755523e-05;1.9203625925002e-05;0.00015211867867038;-0.00058527878718451;2.2822619030194e-06;4.3741485569626e-05;0.00028994688182138;-0.00059201766271144;5.0654048209253e-06;1.427412735211e-05;4.8042053094832e-05;0.00026710971724242;1.3275103810884e-05;-0.00020331909763627;9.4848743174225e-05;-2.0990075427108e-05;-0.00095700769452378;-2.5775514586712e-05;-0.00012993394921068;0.00020368046534713;2.1377934899647e-05;-2.344258246012e-05;-1.9385244740988e-05;3.1173908610072e-06;4.8523368604947e-05;-2.0350116756163e-05;-0.00015183388313744;1.3725378266827e-05;2.7693404263118e-05;5.0415797886671e-05;0.00062982697272673;-0.00010818680311786;-3.3640149922576e-05;0.00032407289836556;-0.00045821612002328;5.6353717809543e-05;8.2602149632294e-05;0.00050305272452533;1.5832732970011e-05;-3.2013325835578e-05;-9.9944489193149e-05;-2.1550866222242e-05;7.5272037065588e-06;3.7920341128483e-05;-1.8300381270819e-05;7.7347656770144e-05;-9.6328971267212e-05;0.00041310387314297;-5.9521284129005e-05;0.00049019244033843;0.00023619113198947;4.6282875700854e-05;0.00011143633309985;-3.3466792501713e-06;-2.7746324121836e-05;-0.00021453143563122;8.3351653302088e-05;0.00017232702521142;-2.8104528610129e-05;6.0574238887057e-05;-2.9103989618307e-06;0.00041891992441379;0.00080980028724298;6.5397493017372e-05;-0.0010324822505936;-0.00040444851038046;-0.00024820325779729;-0.00039384778938256;-0.00021335994824767;-1.3952365407022e-05;-0.00018903656746261;-5.1370163419051e-05;7.0756388595328e-05;-2.429365486023e-05;-8.3179176726844e-05;3.098198067164e-05;-0.00026834919117391;7.3153983976226e-05;0.00035539024975151;-0.00029117509257048;0.0002150482905563;6.4254716562573e-05;-4.4221291318536e-05;-2.4613013010821e-05;1.8611635823618e-05;-1.8259204807691e-05;1.9968831111328e-05;1.117965530284e-05;5.5805536248954e-05;-8.6914871644694e-05;2.8740978450514e-05;3.7424542824738e-05;0.00044837736641057;0.00010522791126277;3.477260179352e-05;-0.00043527394882403;-0.00014529173495248;-4.0418050048174e-05;-5.5045393310138e-06;-0.00027964141918346;0.00015552925469819;-1.6029254766181e-05;-2.414794289507e-05;9.315484930994e-05;1.764103944879e-05;-6.6270142269786e-05;1.1828229617095e-05;-9.6119692898355e-06;4.2194616980851e-05;-0.00075237499549985;0.00016536259499844;-9.7095355158672e-05;0.00014939640823286;1.6520561985089e-05;-1.1233692930546e-05;-1.8722923414316e-05;7.652382919332e-06;0.00014477926015388;-9.6372175903525e-05;-0.00014057572116144;5.1048820751021e-05;1.1213413017686e-05;3.2351585105062e-05;0.00037801818689331;-4.6748649765505e-05;-1.9086161046289e-05;0.0002724599908106;-0.00037293287459761;3.081967952312e-05;3.5750221286435e-05;0.00036462862044573;-5.7190267398255e-05;-8.765437087277e-06;-6.9661320594605e-05;-5.4611315135844e-05;3.3971864468185e-05;5.2456412959145e-05;-3.3641728805378e-05;4.7353165427921e-05;-4.2100404243683e-05;0.00017244099581148;-7.9439916589763e-05;0.00048697937745601;0.00032287929207087;7.2877359343693e-05;0.00010959948849631;-1.7605418179301e-05;-2.9611161153298e-05;-0.00015278247883543;8.9641289378051e-06;9.8556200100575e-05;-9.5279665401904e-06;6.7540728196036e-05;2.7152298571309e-05;0.00068255857331678;0.00088945799507201;6.3856932683848e-05;-0.0010361536405981;-0.00066540925763547;-0.00029626119066961;-0.00037731390330009;-6.3020874222275e-05;3.9230326365214e-05;-0.00020124518778175;-0.00011169968638569;4.3233627366135e-05;-9.7064912552014e-06;-5.1956241804874e-05;1.1153292689414e-05;-0.0002291332493769;-1.9880189938704e-05;3.0856583180139e-05;-0.00030474917730317;0.0002822928072419;0.000169570063008;-2.9114151402609e-05;-2.8783864763682e-05;5.1876004363294e-06;-1.53241744556e-05;0.00012956764840055;7.5184485467616e-05;-6.6227867137059e-06;-8.4367165982258e-05;3.4593424061313e-05;4.638560130843e-05;0.00080425018677488;0.00018782635743264;5.1165920012863e-05;-0.00051542831351981;-0.00034697449882515;-8.1865764514077e-05;-4.1413280996494e-05;-0.0001562162215123;0.00010556810593698;-4.6465720515698e-05;-4.6468736400129e-05;3.3206302759936e-05;9.1660567704821e-06;-2.2824020561529e-05;1.0810143976414e-05;-0.00015726494893897;0.00015995936701074;-0.00073618965689093;0.00049494241829962;-8.485257421853e-05;0.00012678948405664;4.871275905316e-06;1.0003092938859e-05;-1.7985441445489e-05;1.352871004201e-05;0.00027298825443722;-0.0002348155976506;-0.00013953071902506;0.00011373103188816;3.1889906040306e-06;1.57755548571e-05;0.00015541158791166;1.8181614223067e-06;-1.1491968507471e-05;0.00030116367270239;-0.00036325593828224;3.8219099224079e-05;-3.0893352231942e-05;0.00029359289328568;-0.00018002944125328;6.0090769693488e-06;-5.0105656555388e-05;-8.6209103756119e-05;7.9519457358401e-05;6.0252663388383e-05;-5.914036592003e-05;4.8445064749103e-05;2.218264307885e-05;1.3726432371186e-05;-0.00010086660040542;0.00064579379977658;0.00052644481183961;0.00013115709589329;0.00015349754539784;-3.7174286262598e-05;-4.4294825784164e-05;-0.00016781598969828;-0.00010815562563948;7.7746342867613e-05;2.604563087516e-05;9.2017522547394e-05;7.0154812419787e-05;0.0012316375505179;0.0013262404827401;8.0868347140495e-05;-0.0014506336301565;-0.0012334281345829;-0.00045253522694111;-0.00049488653894514;6.0337290051393e-05;0.0001160292304121;-0.00028287788154557;-0.00022400633315556;2.208236946899e-05;5.006675110053e-06;-3.9341215597233e-05;-1.3397358998191e-05;-0.00027203912031837;-0.00015527117648162;-0.0002458832168486;-0.00035611548810266;0.00041307980427518;0.0003185429086443;-2.6895864721155e-05;-5.3057956392877e-05;-6.7640526140167e-06;-9.1360134319984e-06;0.00024511519586667;0.00016454022261314;-6.3439656514674e-05;-8.8943852460943e-05;5.2323208365124e-05;6.5110107243527e-05;0.0014270830433816;0.00029215079848655;8.2638791354839e-05;-0.00073971605161205;-0.00064634240698069;-0.00013290692004375;-7.5921147072222e-05;-8.3518134488259e-05;3.722319524968e-05;-8.8937136752065e-05;-7.3224960942753e-05;-1.8620130504132e-06;1.0519655006647e-05;7.1356444095727e-06;4.5126707846066e-06;-0.00017134494555648;0.00015276341582648;-0.00056371244136244;0.00067214056616649;-0.00010823252523551;0.00011675406130962;3.5282703265693e-06;9.7583106253296e-06;-1.4797244148212e-05;1.8110851669917e-05;0.00026503135450184;-0.00024773355107754;-0.00011165897740284;0.00014699193707202;-1.0755592484202e-05;3.0496730687446e-06;-8.0451573012397e-05;2.5697027012939e-05;-2.5858257686195e-06;0.00034906025393866;-0.00033624839852564;2.0633644453483e-05;-5.0547714636195e-05;0.00019792813691311;-0.00027557832072489;3.2611998904031e-05;-3.1452094845008e-05;-8.0747260653879e-05;8.5623913037125e-05;5.3920521168038e-05;-6.7757493525278e-05;8.629955118522e-06;6.3070554460865e-05;-4.8775662435219e-05;-4.6271979954327e-05;0.00062488584080711;0.00055227731354535;0.00014236102288123;0.00014616792032029;-4.0345763409277e-05;-4.1870331187965e-05;-0.00010864387877518;-0.00016728714399505;5.0501170335338e-05;5.2538500312949e-05;8.2106613263022e-05;8.1468999269418e-05;0.0012434788513929;0.0013390415115282;7.9733632446732e-05;-0.0013802620815113;-0.0013267616741359;-0.00048083582078107;-0.00047207743045874;7.5366726377979e-05;0.00011096964590251;-0.00026602676371112;-0.00024600993492641;2.858146217477e-06;2.2101445210865e-05;-2.100769415847e-05;-3.1381845474243e-05;-0.00021617245511152;-0.00021676758478861;-0.00035322547773831;-0.0002439394738758;0.00039901668787934;0.00035287832724862;-1.9718234398169e-05;-5.8123750932282e-05;-1.4895259482728e-05;-1.3904840443502e-06;0.00023943756241351;0.00017128598119598;-8.917896047933e-05;-6.326699804049e-05;5.618172508548e-05;6.3981999119278e-05;0.0014452204341069;0.00031420623417944;8.4641345893033e-05;-0.00071442924672738;-0.00071560521610081;-0.00013771709927823;-8.7142710981425e-05;-5.6399985624012e-06;-4.2123087041546e-05;-9.5657094789203e-05;-7.2620438004378e-05;-1.0991294402629e-05;2.2235573851503e-05;1.9200038877898e-05;-9.6810817922233e-06;-5.7090644986602e-05;1.2280075679882e-05;-0.00017076109361369;0.00079181778710335;-0.00018636620370671;0.00012843894364778;1.3630165085488e-05;-1.0796701644722e-05;-8.2741116784746e-06;2.3120683181332e-05;0.00011942212586291;-0.00013314546959009;-5.0224760343553e-05;0.0001656839158386;-3.8789978134446e-05;-1.2057217645634e-05;-0.00043060092139058;5.1068196626147e-05;1.3411052350421e-05;0.00044481325312518;-0.00030647413223051;-3.462222230155e-05;-3.9985592593439e-05;4.565959534375e-05;-0.0003967329103034;8.7015840108506e-05;-7.0594301178062e-06;-3.7256624636939e-05;5.1368959248066e-05;3.3481912396383e-05;-6.0974500229349e-05;-8.4647144831251e-05;9.6646712336224e-05;-5.0784514314728e-05;0.00013427561498247;0.00040541187627241;0.00042783297249116;0.00011482109403005;8.4907791460864e-05;-2.9831209758413e-05;-2.010154457821e-05;4.5218210289022e-05;-0.00019773632811848;1.8303463775737e-06;9.1788060672116e-05;3.2505740819033e-05;6.6571097704582e-05;0.00071951001882553;0.00094776664627716;6.0556823882507e-05;-0.00078307092189789;-0.0010149884037673;-0.00039980642031878;-0.00030388336745091;4.1721417431972e-08;3.316171159895e-06;-0.00014122940774541;-0.00019247594173066;-2.2353769963956e-05;4.9575472075958e-05;1.2261720257811e-05;-5.3929161367705e-05;-3.5160268453183e-05;-0.00024007292813621;-0.00034323171712458;0.00011586464825086;0.00023362076899502;0.00030085415346548;-2.0797269826289e-06;-4.8427780711791e-05;-2.2902966520633e-05;1.1682506737998e-05;0.00011409716535127;8.8816464995034e-05;-9.5512645202689e-05;9.6584608400008e-06;4.5867152948631e-05;4.632582567865e-05;0.00086636806372553;0.00027778054936789;5.9852834965568e-05;-0.00042186479549855;-0.00061775685753673;-0.00010728320194175;-8.2027945609298e-05;0.00010947074770229;-0.00018120126333088;-6.7747525463346e-05;-4.8553683882346e-05;-2.3931946202538e-07;5.7642813771963e-05;2.0350777049316e-05;-4.419032484293e-05;-1.7866115740617e-05;-8.3611892478075e-05;9.7184652986471e-05;0.0012201644713059;-0.0003151468699798;0.00021154964633752;2.1966496206005e-05;-1.9618217265815e-05;-3.0808266728855e-06;3.1171362934401e-05;6.1042846937198e-05;-5.6057680922095e-05;-9.6540343292872e-06;0.00023379852063954;-7.7588461863343e-05;-3.7643374525942e-05;-0.00089446199126542;0.0001249533961527;3.9910835766932e-05;0.00068054656730965;-0.00042208441300318;-9.4082053692546e-05;-8.6853142420296e-05;-8.5183535702527e-05;-0.00067036697873846;0.00016750466602389;1.3660102013091e-05;-1.4691971955472e-05;1.9470971892588e-05;2.3882612367743e-05;-5.8815679949475e-05;-0.00020741242042277;0.00021360300888773;-2.6668809368857e-05;0.00038987546577118;0.00036087102489546;0.00046596510219388;0.00014271179679781;7.1891248808242e-05;-3.1767613108968e-05;-7.8591820056317e-06;0.00018333371554036;-0.00036634475691244;-2.0663046598202e-05;0.00019314490782563;-4.4753237489203e-06;7.6181349868421e-05;0.00051901175174862;0.0010028730612248;6.0568811022677e-05;-0.000579796906095;-0.0011694281129166;-0.00049225188558921;-0.00026774030993693;-8.7305255874526e-05;-8.586543117417e-05;-8.397018245887e-05;-0.00022700139379594;-5.8344321587356e-05;9.698962821858e-05;4.4097632780904e-05;-0.00010422366176499;0.00011092035856564;-0.00039268081309274;-0.00041356810834259;0.00063482666155323;0.00014715616998728;0.00038269645301625;1.5400668416987e-05;-6.8055363954045e-05;-3.6768797144759e-05;3.3450956834713e-05;2.226882679679e-05;1.2229828826094e-05;-0.00012452581722755;0.00011056449875468;4.6738710807404e-05;5.2464594773483e-05;0.00063076999504119;0.0003605336532928;6.2569401052315e-05;-0.00027776157367043;-0.00082162697799504;-0.00013161808601581;-0.00010414691496408;0.00022756136604585;-0.00044456656905822;-5.5306063586613e-05;-4.7861565690255e-05;2.0405565010151e-05;0.0001371173420921;2.413559195702e-05;-0.00011332394205965;2.4377330191783e-05;-0.00015011477808002;0.00019423471530899;0.0013596818316728;-0.00036570351221599;0.00025135962641798;2.3897875507828e-05;-1.9080634956481e-05;-1.0181618108618e-06;3.2004027161747e-05;7.383192951238e-06;1.9438884919509e-05;9.1947713372065e-06;0.00024181610206142;-8.7902575614862e-05;-5.2015158871654e-05;-0.0010482622310519;0.00016255908121821;5.1427752623567e-05;0.00074918090831488;-0.00046686729183421;-0.00010981803643517;-0.00011918079690076;-0.00011466551950434;-0.00077414739644155;0.00019144591351505;2.7064173991675e-05;2.8039412427461e-06;-1.0468422260601e-05;1.456608515582e-05;-4.319176878198e-05;-0.00024623025092296;0.0002411144960206;-4.8364381655119e-06;0.00054840365191922;0.00031401379965246;0.00048663615598343;0.00014901805843692;6.0081787523814e-05;-3.2587213354418e-05;1.324925847257e-06;0.00023256464919541;-0.00041161448461935;-2.9346791052376e-05;0.0002476139634382;-2.3402739316225e-05;7.2207214543596e-05;0.00038592348573729;0.0010008900426328;6.3115192460828e-05;-0.00045057394891046;-0.0012245075777173;-0.00051870499737561;-0.00024989878875203;-0.00012736419739667;-0.00017834421305452;-4.6937046136009e-05;-0.00022972071019467;-7.0257709012367e-05;0.00010962250962621;5.6351356761297e-05;-0.00012455417891033;0.00017481467511971;-0.0004379409365356;-0.00040402149898;0.00087609409820288;6.3916144426912e-05;0.00035866783582605;1.8344368072576e-05;-7.9753728641663e-05;-3.8230296922848e-05;4.3674292101059e-05;-3.2421699870611e-05;-5.6190074246842e-05;-0.0001248862099601;0.000156783265993;3.9674327126704e-05;5.2160463383188e-05;0.00041818755562417;0.00032106478465721;5.2634484745795e-05;-0.00013251132622827;-0.00081908114952967;-0.00011323747457936;-7.8597295214422e-05;0.00026262970641255;-0.00053739914437756;-3.4836139093386e-05;-3.6197649023961e-05;3.1721123377793e-05;0.00017939155804925;2.2248173991102e-05;-0.00014670223754365;-9.2859445430804e-06;-8.9112427303917e-06;2.4952765670605e-05;9.1325982793933e-06;-0.00026015460025519;0.00028167734853923;-0.0007491511059925;-6.2586696003564e-05;5.6089913414326e-05;8.2983504398726e-05;4.6228862629505e-05;8.0410471127834e-05;-0.00014707921945956;3.3877495297929e-05;-7.9324148828164e-05;-9.7641255706549e-05;-6.1430684581865e-05;-9.7319425549358e-05;0.00055645586689934;0.00011457423534011;7.1016955189407e-05;0.00038424681406468;-0.00054180377628654;-1.8903496311395e-05;-0.0001896428730106;0.00047370736137964;7.3040813731495e-05;3.6860751606582e-06;-3.276082497905e-05;4.3034306145273e-05;2.0879868316115e-05;2.0294459318393e-05;-3.0378671453946e-06;-0.00010824717173818;-7.8974167990964e-05;-0.00026921997778118;-0.00016496458556503;-0.00012977994629182;-0.00012441554281395;-0.0005303513025865;0.00042326041148044;-9.6848110842984e-05;4.454109875951e-05;-0.00026025215629488;-2.3860363853601e-06;0.00040182596421801;-0.0002374347532168;7.9051324064494e-06;-0.0005294683505781;-0.00013771675003227;0.00010588650184218;0.00027994473930448;0.00063639442669228;0.0001969989243662;0.00033515933318995;-1.0584514711809e-05;-6.0561163991224e-05;0.00018648843979463;9.2155292804819e-05;-4.2383104300825e-05;-1.1970880223089e-05;6.7741668317467e-05;1.4682300388813e-05;-1.8983080735779e-05;-2.3083772248356e-05;4.1721701563802e-05;0.00052411464275792;0.00010910031414824;0.00085595750715584;-0.00020937214139849;-0.00045745028182864;0.00015403052384499;5.9085239627166e-05;1.8087597709382e-05;0.00013961321383249;-8.5462430433836e-05;2.4068864945548e-07;-4.3418651330285e-05;4.9825866881292e-05;0.0005356483743526;0.0003944193595089;-0.00017970117914956;-0.00019959111523349;-0.0010408280650154;-0.00021216149616521;-0.00011469214223325;-2.8082187782275e-05;-0.00049204431707039;0.00012928585056216;-0.00010477449541213;1.8349368474446e-05;0.0001221975981025;4.3285075662425e-05;-1.0068059054902e-05;-1.1247499060119e-05;2.782520459732e-05;1.4937080777599e-05;-0.00027248365222476;0.00030881192651577;-0.00084315304411575;-7.1265130827669e-05;-7.2828161137295e-06;0.0001559855445521;4.3863750761375e-05;9.4069117039908e-05;-0.00018624549556989;4.7722794988658e-05;-2.9736713258899e-05;-0.00015333649935201;-6.7544810008258e-05;-8.8095694081858e-05;0.00064052821835503;0.00011636882118182;7.5402633228805e-05;0.00040674590854906;-0.00061885773902759;-9.5793420769041e-06;-0.00022106226242613;0.00051495456136763;0.00010154201299883;2.0353927538963e-05;-4.4377688027453e-05;3.1977768230718e-05;3.3247230021516e-05;2.6525001885602e-05;-2.04639468393e-06;-0.00013442923955154;-9.6815914730541e-05;-0.00031853377004154;-0.00022594397887588;-0.00010619722888805;-0.00013218481035437;-0.0006087890942581;0.00046697774087079;-0.00012169397086836;4.0028266084846e-05;-0.00028974830638617;-1.1791227734648e-05;0.00047598080709577;-0.00025227581500076;1.2721814528049e-05;-0.00064525933703408;-0.00022784106840845;0.0001348273945041;0.00032587710302323;0.0007534078322351;0.00030544414767064;0.0004048366099596;1.7523900169181e-05;-0.00011080279364251;0.00019797441200353;0.00010804743214976;-4.3309919419698e-05;-1.9600965970312e-05;7.7091317507438e-05;1.4372223631653e-05;-2.3143826183514e-05;-2.1225183445495e-05;4.5616125134984e-05;0.00062998954672366;0.00019414634152781;0.00089783180737868;-0.00023591503850184;-0.00052256044000387;0.00014164332242217;6.9288194936235e-05;3.1146471883403e-05;0.00013747015327681;-0.00010262352589052;2.6848385459743e-05;-3.1635659979656e-05;6.3650040829089e-05;0.0006627794355154;0.00059708743356168;-0.00023026562121231;-0.0002418780059088;-0.0012296373024583;-0.00037357019027695;-0.00013826477515977;-5.3968742577126e-05;-0.00053838890744373;0.00013516338367481;-0.0001087113560061;2.0188192138448e-05;0.00013263341679703;5.1934093789896e-05;-5.4955871746643e-06;-8.5313813542598e-06;1.6309011698468e-05;1.5904379324638e-05;-0.00016979678184725;0.00019475416047499;-0.00056323129683733;-1.0503782505111e-05;-0.00012411674833857;0.00021736561029684;2.0001711163786e-05;6.8559740611818e-05;-0.00015269772848114;5.9766014601337e-05;6.3784136727918e-05;-0.00018539858865552;-4.5813325414201e-05;-4.4555341446539e-05;0.00041336019057781;7.2132672357839e-05;4.7485569666605e-05;0.00026609995984472;-0.00042594154365361;1.1435640772106e-05;-0.00016135389159899;0.0003202973457519;8.1240650615655e-05;3.2486863347003e-05;-4.6879235014785e-05;1.6193398550968e-06;4.1712195525179e-05;2.4870578272385e-05;1.6717997368687e-06;-0.00012224474630784;-8.2646321970969e-05;-0.00026472314493731;-0.0002320738567505;-2.5448719043197e-06;-8.7241765868384e-05;-0.00043829088099301;0.00029129488393664;-0.00010249648767058;6.5184067352675e-06;-0.00020541073172353;-3.3652224374237e-05;0.00035654421662912;-0.00013163154653739;1.4191088666848e-05;-0.00055429874919355;-0.00029183414881118;0.00013953294546809;0.00024535207194276;0.00059312308439985;0.00038617732934654;0.00033513383823447;7.2907823778223e-05;-0.00013349037908483;0.0001123042893596;7.8294760896824e-05;-1.7822330846684e-05;-1.1499294487294e-05;5.3984411351848e-05;3.8482639865833e-06;-1.7472440958954e-05;-3.7648662782885e-06;3.4604872780619e-05;0.00055484205950052;0.00024851222406141;0.00055268028518185;-0.00015681846707594;-0.00038275244878605;2.9843495212845e-05;6.413728260668e-05;3.3391301258234e-05;6.8410176027101e-05;-8.1990932812914e-05;5.2346600568853e-05;1.2962546861672e-05;5.9475070884218e-05;0.00060925364959985;0.00070150580722839;-0.00022109525161795;-0.00021870611817576;-0.0010452261194587;-0.00048595675616525;-0.00013662868877873;-6.5794833062682e-05;-0.00035920727532357;6.7040578869637e-05;-6.5733867813833e-05;1.4757647477381e-05;9.1523186711129e-05;4.2013125494123e-05;-1.9957408312621e-06;-6.1607611314685e-06;8.2777387433453e-06;2.2261338017415e-05;-9.2488808149938e-05;0.00013014608703088;-0.00043775714584626;0.00012608291581273;-0.00028988075791858;0.00033331284066662;-1.8211591168438e-06;5.0972441385966e-05;-0.00015371013432741;0.00010205595754087;0.00021124884369783;-0.00026841345243156;-3.1442290492123e-05;2.0557631614793e-06;0.00025972962612286;5.1878338126699e-05;4.7670150706836e-06;0.00017448916332796;-0.00033006741432473;2.8938669856871e-05;-0.00012563241762109;0.00018779527454171;3.0849332688376e-05;6.20134305791e-05;-6.6057960793842e-05;-4.9761743866839e-05;6.8315013777465e-05;3.0393859560718e-05;1.3583334293799e-05;-0.00015145854558796;-0.00010762415331556;-0.00044502038508654;-0.0003618155606091;-4.3715294850699e-06;-1.7510157704237e-05;-0.00025201245443895;8.6681990069337e-05;-0.00011796080798376;-4.8180947487708e-05;-0.00018434385128785;-7.2939394158311e-05;0.00026460492517799;2.8797805498471e-05;4.4662388631878e-07;-0.00081035756738856;-0.00061984924832359;0.00027494871756062;0.00028360774740577;0.00086713634664193;0.00074411829700693;0.00038498226786032;0.00019828976655845;-9.3509195721708e-05;-6.0124866649858e-06;7.0772286562715e-05;1.5699280993431e-05;-1.8271299495609e-06;3.0730192520423e-05;-4.9542832130101e-06;-1.3148726793588e-05;2.475345354469e-06;1.2784797945642e-05;0.000540810986422;0.00038216836401261;0.00021898905106355;-0.00010524750541663;-0.00032054123585112;-0.00012927078932989;6.8986468249932e-05;4.9084053898696e-05;-1.6874488210306e-05;-7.9739249486011e-05;9.9441494967323e-05;8.6041662143543e-05;6.2803592300043e-05;0.00060571293579414;0.0010928065748885;-0.00022199146042112;-0.00019861123291776;-0.0010051018325612;-0.00076863775029778;-0.00014195861876942;-9.8028322099708e-05;-0.00020539716933854;-8.291255653603e-06;-2.8131216822658e-05;1.035944569594e-05;7.1485170337837e-05;4.1975181375165e-05;4.142816123931e-06;-6.6857937781606e-06;-1.7162369658763e-06;2.8571274015121e-05;-7.0721333031543e-05;9.1485679149628e-05;-0.00032428864506073;0.0002128344058292;-0.00043391538201831;0.00045230888645165;-1.9477382011246e-05;4.3218602513662e-05;-0.00014605862088501;0.00013366984785534;0.00030650899861939;-0.00034284850698896;-2.6059238734888e-05;1.5071711459314e-05;0.00012487253115978;5.5270906159421e-05;-2.117359690601e-05;0.0001453225268051;-0.00025945907691494;5.2413492085179e-05;-0.00011075891234213;8.6380932771135e-05;7.1469357862952e-06;7.482434011763e-05;-8.1021222285926e-05;-7.870007539168e-05;8.8840119133238e-05;3.2813641155371e-05;1.973155849555e-05;-0.00017374567687511;-0.00012277007044759;-0.00049535348080099;-0.00040684393025003;2.9871083825128e-05;2.2536996766576e-05;-0.00017588507034816;-5.4827058193041e-05;-0.00012104316556361;-8.0243371485267e-05;-0.0001855416194303;-0.0001142987239291;0.00022752174118068;0.00014331747661345;3.0267187867139e-06;-0.00090465176617727;-0.00075670686783269;0.00033253961009905;0.00027912622317672;0.00093547388678417;0.00091233727289364;0.00041153788333759;0.0002764989330899;-9.5433329988737e-05;-8.4936291386839e-05;6.5576772612985e-05;4.0214919863502e-05;1.6027637684601e-05;2.4128015866154e-05;-1.1682023796311e-05;-9.0048042693525e-06;1.5117570910661e-05;7.6386313594412e-06;0.00058403133880347;0.00046866657794453;7.7189048170112e-05;-2.9173785151215e-05;-0.00028877504519187;-0.00024067935009953;7.9134086263366e-05;5.3707091865363e-05;-4.7051245928742e-05;-6.3675994169898e-05;0.00011852876923513;0.00012935695121996;6.460961594712e-05;0.00066395028261468;0.0013229867909104;-0.00024585300707258;-0.00021020558779128;-0.0010606654686853;-0.00095754669746384;-0.00017399805074092;-0.00011819663632195;-0.0001435267040506;-8.0766323662829e-05;-1.1606135558395e-05;5.7788038247963e-06;6.0675371059915e-05;4.1035942558665e-05;8.4669181887875e-06;3.9355331864499e-06;-8.5339715951704e-06;1.032036379911e-06;-0.00015351825277321;8.5946841863915e-05;-3.0506920666085e-05;0.00049675937043503;-0.00020348124962766;0.00015261715452652;-5.2433548262343e-05;3.5137616123393e-06;-5.8019770222018e-05;0.00014403276145458;0.00016100009088404;-0.00016359607980121;5.7322699831275e-06;4.0190327126766e-05;-0.00029188324697316;8.6787105146868e-07;-3.6189008824294e-05;0.00027460773708299;-0.00021180404291954;0.00011903764243471;-3.1534822483081e-05;-3.3813594200183e-05;-0.00020965031580999;4.2293573642382e-05;-6.0706130170729e-05;-4.2918323742924e-05;4.8555390094407e-05;1.4218230717233e-05;1.7419502910343e-05;-0.0001138806619565;-7.7903525379952e-05;-0.0003026804770343;-0.00030418214737438;3.6590191143659e-07;-6.2259146943688e-05;0.00012657600746024;-0.00023410194262397;-2.6053732653963e-05;-8.0481462646276e-05;-5.2435429097386e-05;-0.00012482957390603;-3.5954006307293e-05;0.00024192572163884;-6.1946971072757e-06;-0.00064568314701319;-0.00045899633551016;0.00030220800545067;0.00014969026960898;0.00048469225293957;0.00076524406904355;0.00015729191363789;0.00023866273113526;3.6205881770002e-05;-8.4570136095863e-05;-1.5305353144868e-06;5.8677494962467e-05;3.6112411180511e-05;-1.7553440557094e-05;-1.9680255718413e-05;7.5496582212509e-06;2.2613510736846e-05;-1.909863021865e-05;0.00029038716456853;0.00033130656811409;-0.00014790544810239;0.00028994117747061;-1.455606707168e-05;-0.00032112837652676;5.7037144870264e-05;3.0136317946017e-05;-7.8693679824937e-05;1.0159638804907e-05;2.4532155293855e-05;8.5626990767196e-05;4.293581150705e-05;0.00041961995884776;0.0007552047027275;-0.00015872027142905;-0.00011861797247548;-0.00050749280489981;-0.00074467353988439;-0.00010737949924078;-5.3135147027206e-05;5.7836343330564e-05;-0.00021236945758574;8.0168720160145e-06;-2.9647591873072e-05;4.0938284655567e-05;5.9256468375679e-05;8.4782213889412e-06;5.3622497944161e-06;-4.1421021705901e-06;-6.4630221459083e-06;-0.00018995144637302;0.00012246322876308;5.3822031986783e-06;0.00054163468303159;-0.00012009555211989;5.4130723583512e-05;-6.3647661590949e-05;-1.1723769830496e-06;-4.4914551835973e-05;0.00013830934767611;0.00011010574235115;-9.420994319953e-05;1.5348850865848e-05;6.9005232944619e-05;-0.00033999083098024;-3.327881131554e-05;-3.6760153307114e-05;0.00033435542718507;-0.00027589753153734;0.0001443526125513;-2.7317248168401e-05;-4.003462890978e-05;-0.00025695495423861;3.5294397093821e-05;-4.8911970225163e-05;-2.7522757591214e-05;2.7042608053307e-05;6.513185780932e-06;1.5457148037967e-05;-9.2066722572781e-05;-6.7612454586197e-05;-0.00021683941304218;-0.00022808814537711;-3.1074916478246e-05;-6.1840582930017e-05;0.00019142955716234;-0.0002757529146038;4.8893411985773e-06;-6.7884073359892e-05;-2.5496527086943e-05;-0.00012057151616318;-9.6195377409458e-05;0.00024915585527197;-5.0096457471227e-07;-0.00051402824465185;-0.0002826138806995;0.00026232155505568;0.00010532145097386;0.0003097593144048;0.00059929897543043;7.7421282185242e-05;0.00020543705613818;7.953931344673e-05;-8.3734019426629e-05;-1.7703994672047e-05;5.4139520216268e-05;4.1334966226714e-05;-2.0014749679831e-05;-2.0648592908401e-05;9.1892343334621e-06;3.3079413697124e-05;-2.0934945496265e-05;0.00021408805332612;0.00034058906021528;-0.00015438384434674;0.00043567534885369;5.1092571084155e-05;-0.00032824790105224;4.5304273953661e-05;3.280653982074e-05;-7.6952463132329e-05;3.9462189306505e-05;-8.513717148162e-06;5.143591624801e-05;4.263279697625e-05;0.00043089865357615;0.00054573867237195;-0.00017228801152669;-0.00011915237701032;-0.000365657848306;-0.00077101058559492;-8.0824524047785e-05;-5.5467629863415e-05;8.614911348559e-05;-0.00026130242622457;9.0766270659515e-06;-4.6655928599648e-05;4.0760871343082e-05;7.406146323774e-05;6.4426008066221e-06;4.513235126069e-06;-4.3928912418778e-06;-4.9012674026017e-06;-0.00016326375771314;0.00014386109251063;1.9421364413574e-05;0.00044268849887885;-6.891639350215e-05;-6.105125976319e-06;-5.3753075917484e-05;-1.1565624845389e-05;-3.2860636565601e-05;0.00010340103472117;7.0983718615025e-05;-1.9665815216285e-06;2.2786260160501e-05;8.3948289102409e-05;-0.00027245056116953;-4.0026239730651e-05;-5.5268192227231e-05;0.00027456777752377;-0.00026249335496686;0.00012572573905345;-1.6360023437301e-05;-3.49163019564e-05;-0.0002508100878913;2.5083918444579e-05;-2.0154866433586e-05;-1.522396269138e-05;-7.9945702964324e-06;-4.6828770905449e-07;1.2706618690572e-05;-6.1314218328334e-05;-5.6561249948572e-05;-0.00013823743211105;-0.0001129339725594;-6.7039138230029e-05;3.0728251658729e-06;0.00022331890068017;-0.00031232711626217;2.2418867956731e-05;-4.6925535571063e-05;-1.871733184089e-05;-0.00010684393055271;-0.00012486753985286;0.00023226975463331;7.0305204644683e-06;-0.00032509156153537;-0.00012382274144329;0.00018345972057432;5.2349900215631e-05;0.00016891829727683;0.00034320366103202;2.324118213437e-05;0.00015628930123057;0.00011101440759376;-0.00010100172949024;-2.2270249246503e-05;3.9916340028867e-05;4.4901953515364e-05;-5.6902249525592e-06;-1.6234476788668e-05;8.412257557211e-06;3.9783146348782e-05;-1.6198750017793e-05;0.0001146813883679;0.00031087614479475;-0.00012904882896692;0.00050747516797855;7.654020737391e-05;-0.00028921168996021;2.2005257051205e-05;3.1887684599496e-05;-6.2498656916432e-05;6.4732688770164e-05;-2.4377415684285e-05;1.0743480743258e-05;3.312745684525e-05;0.00039481063140556;0.00032894726609811;-0.0001667494798312;-0.0001015967791318;-0.00019757142581511;-0.00072186865145341;-3.8880792999407e-05;-6.0892296460224e-05;8.3618651842698e-05;-0.0002656331344042;1.0648599527485e-05;-5.3138777730055e-05;3.3049120247597e-05;7.2561953857075e-05;-3.7563740988844e-06;-7.1552958615939e-06;3.4443768527126e-05;-1.6335996406269e-05;-0.00015927798813209;0.00029743521008641;-0.00071224337443709;-2.1012979232182e-06;0.00020481548563112;-8.8249478721991e-05;4.0298556996277e-05;6.7651024437509e-05;-1.9618255464593e-05;8.9617678895593e-06;-9.7469863248989e-05;1.5100810742297e-05;-4.153098052484e-05;-0.00011434859334258;0.00050511432345957;6.5400672610849e-05;7.5760945037473e-05;0.00040675440686755;-0.0005295081064105;-6.5377869759686e-05;-0.00014905180432834;0.00030615416471846;-9.0956655185437e-06;-2.1836469386471e-05;-1.5171444829321e-05;1.8624214135343e-05;5.613535449811e-06;-2.2354079192155e-06;8.9687755462364e-06;-5.2813764341408e-05;-9.4723007350694e-05;-0.00049014284741133;-3.8266709452728e-05;-0.00062997895292938;9.6368430604343e-06;-0.00015457140398212;0.00020528348977678;-4.2306568502681e-05;5.447052535601e-05;-0.00028441450558603;4.0342896681977e-05;0.00014479353558272;-0.00014087777526584;-3.3148509828607e-05;-0.0006851710495539;-8.7720152805559e-05;0.00017854337056633;0.00034921680344269;0.0010499231284484;1.0291236321791e-05;0.00023205552133732;-6.0620670410572e-05;0.00036853682831861;6.6429151047487e-05;7.5123098213226e-05;-4.6360564738279e-05;1.6683929061401e-05;3.3052754588425e-05;1.9334000171511e-05;-8.8767174020177e-06;-5.2731520554516e-05;1.9880662875948e-06;0.0002203627518611;-5.7579833082855e-05;0.00085089629283175;-0.00016307187615894;-0.00039169934461825;0.0001965847768588;4.8726462409832e-05;6.0437646425271e-06;0.00012944602349307;-5.632298780256e-05;-0.00010448373359395;-7.6966840424575e-05;1.8866694517783e-05;0.00014172903320286;-7.7208487709868e-06;-2.384977415204e-05;-3.5944463888882e-05;-0.0005469360621646;0.00010402294719825;-3.0114331821096e-05;1.63190998137e-05;-0.00040001363959163;0.00012486007472035;-0.00012401287676767;7.5349298640504e-06;0.0001557955838507;3.7814370443812e-05;-1.0844009921129e-05;-1.0749664397736e-05;4.1120911191683e-05;-1.1792320719906e-06;-0.00026791499112733;0.00039370122249238;-0.0010103706736118;-4.0624043322168e-05;0.00015621015336365;-1.0278976333211e-05;4.4639324187301e-05;9.645020327298e-05;-0.00014752642891835;2.7295240215608e-05;-6.0530262999237e-05;-4.8866462748265e-05;-6.2027625972405e-05;-0.00010339014988858;0.00075173482764512;0.00010478787589818;7.8372780990321e-05;0.00048670766409487;-0.00073560728924349;-3.9900805859361e-05;-0.00022260601690505;0.00053752266103402;3.6177265428705e-05;1.6975533071673e-05;-3.1538376788376e-05;1.4269086022978e-05;1.7990176274907e-05;1.4392445336853e-05;6.599457719858e-06;-0.00010383236804046;-0.00011945576989092;-0.00056990765733644;-0.0001696280669421;-0.00052351626800373;-3.6513862141874e-05;-0.00037780468119308;0.00036894020740874;-0.00010825465869857;5.4273870773613e-05;-0.00033766822889447;3.2170260965358e-05;0.00034815998515114;-0.00022500928025693;-2.4883374862839e-05;-0.00087306491332129;-0.00025727838510647;0.0002188732905779;0.00043466387433;0.0012299923691899;0.00021421580458991;0.0003888169885613;-2.5173127141898e-05;0.00020687033247668;0.00013437036250252;0.00011846793495351;-5.5924196203705e-05;-2.0749872419401e-05;5.7857621868607e-05;2.5430561436224e-05;-1.9945509848185e-05;-5.7945824664785e-05;1.3699685041502e-05;0.00040503099444322;7.1754606324248e-05;0.00096213357755914;-0.00024858873803169;-0.00053338072029874;0.0002123181038769;5.1597307901829e-05;2.9586655728053e-05;0.00014498099335469;-9.4269853434525e-05;-2.7176061848877e-05;-6.9393594458234e-05;4.2600349843269e-05;0.0003581344790291;0.00031896802829579;-0.00010665261652321;-0.00011177948181285;-0.0008811192237772;-0.00013654978829436;-4.82058567286e-05;-2.7857598979608e-05;-0.0005373673629947;0.00016504871018697;-0.00013189930177759;1.3639547432831e-05;0.00016446408699267;5.2743893320439e-05;-1.4093287973083e-05;-1.3471944839694e-05;4.5415450586006e-05;1.2540352145152e-05;-0.0003000502474606;0.00043447193456814;-0.001163108390756;-7.0530208176933e-05;9.8482814792078e-05;6.5385560446884e-05;4.8595255066175e-05;0.00011135008389829;-0.00021331763127819;3.920127346646e-05;-2.3006583433016e-05;-0.00010662331624189;-7.3879644332919e-05;-7.7655400673393e-05;0.00089912337716669;0.00012125037028454;7.0535570557695e-05;0.00049334275536239;-0.00084072048775852;-3.3591728424653e-05;-0.00026202021399513;0.00064259703503922;7.5360519986134e-05;3.8297432183754e-05;-4.2551695514703e-05;8.4236917246017e-06;3.0247283575591e-05;2.4026010578382e-05;7.0002829488658e-06;-0.00013760584988631;-0.00013923450023867;-0.00063018943183124;-0.00026675118715502;-0.00047129282029346;-5.4940155678196e-05;-0.0005079964757897;0.00046036689309403;-0.00014684940106235;4.9116606533062e-05;-0.00037305141449906;2.4779388695606e-05;0.00046622933587059;-0.00026795628946275;-1.9644516214612e-05;-0.0010219310643151;-0.00039722252404317;0.00025061948690563;0.00049704167759046;0.0013852358097211;0.00037388122291304;0.00048698345199227;9.3047810878488e-06;0.00011607036140049;0.00016643216076773;0.00014272610133048;-5.9883408539463e-05;-3.7790483474964e-05;7.2525974246673e-05;2.8631649911404e-05;-2.6239793442073e-05;-5.9582154790405e-05;1.3802903595206e-05;0.00048353310558014;0.00017681204190012;0.00097858055960387;-0.00029276678105816;-0.00060982612194493;0.00020171976939309;4.9920272431336e-05;4.9394919187762e-05;0.00013926746032666;-0.00011743572395062;1.7841772205429e-05;-5.454539495986e-05;5.4219344747253e-05;0.00046290998579934;0.0005629500374198;-0.00014637783169746;-0.00014156568795443;-0.0010347532806918;-0.00033073592931032;-5.1851260650437e-05;-6.418888369808e-05;-0.00058508146321401;0.00017933869094122;-0.00012878385314252;1.5957033610903e-05;0.00016640625835862;6.2448409153149e-05;-4.8567035264568e-06;-3.6902795272908e-06;8.3583381638164e-06;3.4982684155693e-05;-6.1883278249297e-05;0.00013571645831689;-0.00056099740322679;0.00026822838117369;-0.00042027520248666;0.00044615473598242;2.1221960651019e-06;4.5366279664449e-05;-0.00020249040971976;0.0001546243292978;0.00033421246916987;-0.00036446898593567;-3.4190121368738e-05;3.468202703516e-05;0.00028800245490856;7.9158337030094e-05;-4.3329229811206e-05;0.00012893410166726;-0.00035696729901247;1.3067890904495e-05;-0.00012412053183652;0.0002200177841587;-2.6676349079935e-05;9.5272320322692e-05;-9.2988419055473e-05;-9.4642193289474e-05;0.00010267564357491;4.5606833737111e-05;2.8127969926572e-05;-0.00021813283092342;-0.00016053352737799;-0.00081710104132071;-0.00062350748339668;-7.5662719609682e-05;1.690054887149e-05;-0.00017698720330372;1.6711334183128e-06;-0.00017765151278581;-0.00010451830894453;-0.00023718415468466;-0.00011081625416409;0.00027460596174933;0.00012821161362808;-2.9244027246023e-05;-0.0013675597729161;-0.0011675737332553;0.00050213100621477;0.00045058212708682;0.0015290344599634;0.0013369329972193;0.00056692771613598;0.00035102351102978;-4.4524771510623e-05;-7.3452152719256e-05;9.508544462733e-05;4.2093335650861e-05;-3.4266004149686e-06;1.8941434973385e-05;-5.8963105402654e-06;-1.3052766007604e-05;-1.3582602150564e-05;-1.2841758689319e-05;0.00058026920305565;0.00051831814926118;2.4362911062781e-05;-0.00016488398250658;-0.00038175264489837;-0.00025895415456034;7.7056254667696e-05;7.0405629230663e-05;-8.953784708865e-05;-0.00011282225023024;0.00016169897571672;0.00016404228517786;7.0701440563425e-05;0.00061907386407256;0.00165836350061;-0.00021254782041069;-0.00017867749556899;-0.001126924646087;-0.0010681640123948;-0.00013889267574996;-0.00012942354078405;-0.000140784191899;-3.0422250347328e-05;-8.543631338398e-06;1.4679751075164e-05;7.9071942309383e-05;4.9660688091535e-05;5.9756648624898e-06;-5.9797953326779e-06;-1.0127175301022e-05;4.9488906370243e-05;-8.5224615759216e-05;0.000109004911792;-0.00047387846279889;0.00045130055514164;-0.0007070149295032;0.00071121600922197;-2.227931690868e-05;4.5236374717206e-05;-0.00021980494784657;0.00023242362658493;0.00050499301869422;-0.00054318911861628;-3.7894777051406e-05;2.6997551685781e-05;9.960636816686e-05;0.00012332717597019;-8.0416677519679e-05;0.0001560251112096;-0.00030500403954647;5.9591238823486e-05;-0.00013144509284757;0.00011850617738673;-6.8965251557529e-05;0.00011952286877204;-0.00013299171405379;-0.00014011538587511;0.00015111577522475;5.6999531807378e-05;3.8442372897407e-05;-0.00029070570599288;-0.0002031575422734;-0.00094410637393594;-0.00077263353159651;2.2107449694886e-05;3.24908978655e-05;-0.00017010745068546;-0.00017016929632518;-0.00020588675397448;-0.00016253819921985;-0.00028832006501034;-0.00020507881708909;0.00030387274455279;0.00030397486989386;-2.1747100618086e-05;-0.0016588822472841;-0.0014861406525597;0.00063784397207201;0.00049275712808594;0.0017483400879428;0.0017704600468278;0.00069267104845494;0.00051378691568971;-0.00010418670717627;-0.00016999876243062;0.0001026635945891;8.677740697749e-05;2.9729832021985e-05;2.0741314074257e-05;-1.7846015907708e-05;-7.6559772423934e-06;7.9543051469955e-06;-1.1231389180466e-05;0.00081452156882733;0.00069790292764083;-6.8251101765782e-05;-6.6177424741909e-05;-0.00041937042260543;-0.00045865625725128;0.00011604595056269;7.7732955105603e-05;-0.00011792455916293;-0.00010203802958131;0.00020339582988527;0.00024649332044646;8.7452201114502e-05;0.00087317422730848;0.0022307545877993;-0.000307361187879;-0.00025706680025905;-0.0015177400782704;-0.0014720925828442;-0.00024340472009499;-0.00016451253031846;-0.00012973086268175;-0.00014771005953662;1.2399153774822e-06;1.141710072261e-05;8.3628707216121e-05;5.7056357036345e-05;1.3957389455754e-05;-3.7034608340036e-06;-2.3812768631615e-05;3.8957110518822e-05;-0.00011908008309547;7.5556890806183e-05;-0.0002251283149235;0.00055805075680837;-0.00066178455017507;0.00063085503643379;-4.248400364304e-05;2.4896429749788e-05;-0.0001516547636129;0.00023211911320686;0.00045242841588333;-0.00047978651127778;-2.2962729417486e-05;1.2475280527724e-05;-0.00017589962226339;0.00011819764040411;-9.2287496954668e-05;0.00019335404795129;-0.00019203938427381;9.6829811809584e-05;-8.5537292761728e-05;-6.006964667904e-06;-0.00014950214244891;9.6056981419679e-05;-0.00012307045108173;-0.00012647968833335;0.00013748533092439;4.6180251956685e-05;3.4888420486823e-05;-0.00025490709231235;-0.00017027971625794;-0.00074450933607295;-0.00066147395409644;7.6162737968843e-05;-8.9104178186972e-06;-4.9737693188945e-05;-0.00028992877923883;-0.00014838493370917;-0.00016161464736797;-0.00022051093401387;-0.00022801416344009;0.00018230757268611;0.00037610021536238;-1.5250289834512e-05;-0.0013940851204097;-0.0012526436476037;0.00057182367891073;0.00036973581882194;0.0013439079048112;0.0016104753594846;0.00054074986837804;0.00048852287000045;-8.4382962086238e-05;-0.00018270095461048;6.5191925386898e-05;0.00010291515354766;5.1810500735883e-05;6.5622984948277e-06;-2.3071303075994e-05;3.5099019441986e-06;1.9066254026257e-05;-1.4318644389277e-05;0.00070113589754328;0.00058818532852456;-0.00015030411304906;0.00010276383545715;-0.00027253164444119;-0.0005010087043047;0.00011058789823437;5.3255233069649e-05;-0.00010836826550076;-4.5410157326842e-05;0.00015308953879867;0.00022813412942924;6.7903732997365e-05;0.00074336741818115;0.0018981805769727;-0.00026012334274128;-0.00021510334045161;-0.0012709286529571;-0.0012839733390138;-0.00024222173669841;-0.00012399791739881;-4.9236870836467e-05;-0.00022775278193876;9.0240500867367e-06;-2.8860324619018e-06;6.2381986936089e-05;5.065096411272e-05;1.1692019143084e-05;4.2891001612588e-06;-1.9828463337035e-05;1.3000211765757e-05;-0.00017796063912101;8.3407954662107e-05;-0.00010494013986317;0.00067995878634974;-0.0003972222621087;0.00033921175054274;-5.4681717301719e-05;6.7931396188214e-06;-0.00010063500667457;0.00021532367100008;0.00029182826983742;-0.00031631541787647;-4.8859319576877e-06;1.8035552784568e-05;-0.00035978743107989;6.4269348513335e-05;-6.7161068727728e-05;0.00030574700213037;-0.00021216420282144;0.00012798440002371;-4.4037209590897e-05;-2.3392209186568e-05;-0.00026136182714254;6.8122280936223e-05;-0.00010150963498745;-8.2418344391044e-05;9.8637967312243e-05;3.3043241273845e-05;2.7915766622755e-05;-0.00019938561308663;-0.00012683776731137;-0.00057439575903118;-0.00058267160784453;4.8305013478966e-05;-0.0001240738783963;8.9538094471209e-05;-0.00027239107294008;-8.3565973909572e-05;-0.00013749879144598;-0.00011529356561368;-0.00019734472152777;3.5123368434142e-05;0.0003393427177798;-2.3809316189727e-05;-0.001166814006865;-0.00095544691430405;0.00051420839736238;0.00029328456730582;0.00098078232258558;0.0014209994114935;0.000346247543348;0.00040241374517791;-1.0072464647237e-05;-0.00010228124301648;2.1572486730292e-05;9.5374016382266e-05;4.4832126150141e-05;-2.1100073354319e-05;-2.5135326723102e-05;1.0619084605423e-05;1.1838602404168e-05;-2.9625207389472e-05;0.00049365597078577;0.00042942847358063;-0.0002125858591171;0.00021966709755361;-0.00011100708070444;-0.0004605183203239;9.4327566330321e-05;3.5250493965577e-05;-0.00011518248356879;-2.166123886127e-05;8.1280217273161e-05;0.00016907275130507;5.5400356359314e-05;0.00053143798140809;0.0013669942272827;-0.00018232909496874;-0.00014563441800419;-0.0008846297278069;-0.00098705594427884;-0.00018144029309042;-6.2335457187146e-05;4.7922945668688e-05;-0.00024037361436058;1.0893418220803e-05;-2.0002080418635e-05;5.7454988564132e-05;6.4271982409991e-05;-4.1222719460166e-07;7.0244163907773e-06;-9.5489713203278e-06;-4.6664495130244e-06;-0.00017614514217712;0.00028425254276954;-1.0319818102289e-05;0.00041911104926839;8.6708489106968e-05;-0.0002418777148705;-3.148304313072e-05;-6.0514623328345e-05;-2.5067864044104e-05;3.9944221498445e-05;-3.104367715423e-05;0.00031779060373083;5.2473555115284e-05;0.00014671937969979;-0.00018297552014701;-3.6093479138799e-05;-0.00015435989189427;0.00022896083828527;-0.00034951764973812;0.00010177183867199;3.2139600079972e-05;3.2438194466522e-05;-0.00039677336462773;5.0890816964966e-06;6.34243915556e-05;1.445796169719e-05;-0.00012150671682321;-6.7069845499645e-06;7.4552708611009e-06;-3.3943928428926e-05;-5.7623539760243e-05;-4.0761442505755e-05;-0.00011182320304215;-0.00012643837544601;-4.8708756366977e-05;0.00031327418400906;-0.00039478958933614;5.7977231335826e-05;-1.0362304237788e-05;-3.0468090699287e-06;-0.00016202653932851;-0.00019308166520204;0.00017261423636228;-4.5039969336358e-06;-0.00024323471006937;6.5940344939008e-05;0.00015731545863673;5.833887917106e-05;-3.965942596551e-06;0.0002488958707545;-6.9070054451004e-05;0.00013440020848066;0.0001748073118506;1.9522562070051e-05;-3.7201931263553e-05;1.5697572962381e-05;5.687195880455e-05;6.4178682805505e-05;-9.0870180429192e-06;1.2524236808531e-05;5.9502926887944e-05;-1.7803638911573e-05;-8.9394910901319e-05;0.00028029980603606;-0.00012234796304256;0.00087937992066145;0.00014584235032089;-0.00031686140573584;-2.7063962988905e-05;3.3139796869364e-05;-5.7219454902224e-05;0.0001426426024409;-5.9473073633853e-05;-0.0001072291561286;8.7850812633405e-06;0.00037931549013592;-2.9960345273139e-05;-0.00017798173939809;-4.6567281970056e-05;0.00013843992201146;-0.00082064024172723;5.412917380454e-05;-7.6488780905493e-05;0.00010350502998335;-0.00034356894320808;1.951289777935e-05;-8.3783466834575e-05;2.945196138171e-05;9.9000208138023e-05;8.0765194070409e-06;-5.3028884394735e-06;6.2288381741382e-05;-6.5605294366833e-05;2.8014450435876e-05;0.00035246476181783;-0.00068224512506276;7.4899340688717e-05;0.0005533040384762;-0.00032460354850627;0.00012345954019111;6.8340639700182e-05;0.00034690101165324;-2.2593712856178e-05;-0.00040953821735457;0.00014317641034722;-4.3213283788646e-05;-0.00025062402710319;0.00043259674566798;3.3189906389453e-05;0.00014885775453877;0.00058514071861282;-0.00056319520808756;-0.00028542833751999;-0.00012729498848785;1.4695581739943e-05;-9.96775488602e-05;-0.00020254330593161;5.4105271374283e-06;0.00010965510591632;-8.6059344539535e-06;-4.5529362978414e-05;2.5987490516854e-05;-1.7026572095347e-05;-0.00014480263052974;-0.00083704991266131;0.00019433283887338;-0.0015445944154635;7.6513169915415e-05;8.3103201177437e-05;0.00013295657117851;0.00010081923392136;0.00011507356975926;-0.00051363278180361;8.9942652266473e-05;-0.00022838778386358;-0.00013623361883219;-8.8003987912089e-05;-0.001043054042384;0.00022861993056722;0.00030083669116721;0.00055341428378597;0.0017754853470251;-0.00041110761230811;0.000124205937027;-0.00020273672998883;0.0012073664693162;2.5513178115943e-05;1.5569627066725e-05;-7.5216863479e-05;0.00021340770763345;2.4228469555965e-05;2.0256095012883e-05;7.7815575423301e-06;-8.0172154412139e-05;-7.8008415584918e-06;7.8601209679618e-05;-0.0003796776290983;0.0016560679068789;-0.00015959073789418;-0.00053415488218889;0.00036141817690805;0.0001099677028833;-4.4901426008437e-05;0.00021259218920022;-4.2877705709543e-05;-0.0004733563400805;-0.00016351135855075;-2.0418548956513e-05;-8.1663965829648e-05;-0.00067240773933008;0.00012840081762988;4.7860856284387e-05;-0.00058718811487779;0.00070616020821035;-6.875616236357e-05;0.00013208808377385;-0.00045718200271949;0.00016494905867148;-0.00023142987629399;7.0512833190151e-06;0.00032217553234659;4.9718801165e-05;4.0776590140013e-06;-9.4654697022634e-06;4.9152338760905e-05;-3.8404054066632e-05;-0.00011171809455846;0.00037482506013475;-0.00083039171295241;2.6870837245951e-05;0.00036403007106856;-0.00020798471814487;5.5279855587287e-05;7.8859105997253e-05;0.00011868221918121;-7.3891701504181e-06;-0.00017061490507331;8.0362035077997e-05;-4.4983888074057e-05;-0.00017790983838495;0.00057544402079657;5.5271211749641e-05;0.0001109787117457;0.0005454508936964;-0.00064017780823633;-0.0001356860739179;-0.00016253408102784;0.0002073981158901;-5.1360184443183e-05;-7.4095536547247e-05;-7.2527495831309e-06;2.3238588255481e-05;4.7568462946401e-08;-2.390515692241e-05;1.964720649994e-05;-2.630592098285e-05;-0.00013546366244555;-0.00070885650347918;6.6041517129634e-05;-0.0011852608295158;8.0992293078452e-05;7.8298562584678e-06;0.00014669305528514;6.626554295508e-06;8.5901607235428e-05;-0.00040355429518968;7.5329160608817e-05;1.2203016012791e-05;-0.00013241260603536;-6.1944250774104e-05;-0.00095391913782805;9.2804111773148e-06;0.0002415633352939;0.00049569259863347;0.0015817289240658;-0.00018131025717594;0.00019615520432126;-0.00012784308637492;0.00078728719381616;2.4372617190238e-05;7.4739073170349e-05;-6.4902480517048e-05;6.7400083935354e-05;2.6194586098427e-05;2.5271066988353e-05;-1.6503020106029e-06;-7.9358440416399e-05;-2.6071220418089e-05;9.0892586740665e-05;-0.0002091649803333;0.0011896380456164;-0.000159306669957;-0.00047101936070248;0.00028824832406826;6.716691859765e-05;-5.6619651331857e-06;0.00017717372975312;-4.8253721615765e-05;-0.00025071550044231;-0.00012799583782908;4.075845083662e-08;-8.5034211224411e-05;-0.00034704821882769;7.2069633461069e-05;6.9164234446362e-05;-0.00039759499486536;0.00038736598799005;-1.0242179996567e-05;6.114921416156e-05;-0.00046190028660931;0.00015012100629974;-0.00018224195810035;1.4286060832092e-06;0.00023632470401935;4.720498691313e-05;-1.1872444702021e-05;-1.3447409401124e-05;4.6714136260562e-05;1.5540139429504e-05;-0.00022666614677291;0.00041869611595757;-0.0011219439329579;-6.9620517024305e-05;0.0001382696791552;-1.035663899529e-05;3.3857293601613e-05;9.395200322615e-05;-0.00018021186406258;1.8042348528979e-05;1.6061690985225e-05;-4.7447883844143e-05;-5.9668305766536e-05;-1.9102997612208e-05;0.00090623687719926;9.1529895144049e-05;2.8865126296296e-05;0.00039075643871911;-0.00079965876648203;-4.0680642996449e-05;-0.00022437892039306;0.00056153384502977;4.5929507905385e-05;4.9840004066937e-05;-2.8191112505738e-05;-2.438968840579e-05;2.181219861086e-05;1.3748724995821e-05;1.456803693145e-05;-9.721835522214e-05;-0.00014213770919014;-0.00071599724469706;-0.00024052770459093;-0.0006839144625701;4.4713553506881e-05;-0.00027145052445121;0.00032056073541753;-0.00012921197048854;4.0040267776931e-05;-0.00033961079316214;5.0718339480227e-05;0.00034342569415458;-0.00020388544362504;-3.9578109863214e-05;-0.001086974516511;-0.00047077587805688;0.00026877759955823;0.00051698309835047;0.0015998509479687;0.00034992097062059;0.00041696245898493;8.512372005498e-06;0.00027265300741419;8.2843434938695e-05;0.0001380263856845;-5.7540615671314e-05;-5.2094317652518e-05;4.8612055252306e-05;3.5994213249069e-05;-2.1332245523809e-05;-8.0283025454264e-05;-3.4248685551574e-05;0.00013080313510727;0.00013071365538053;0.00069503631675616;-0.00024261414364446;-0.00050159945385531;0.00018538495351095;3.549323309926e-06;6.111048423918e-05;8.828315185383e-05;-9.2872818640899e-05;1.5017095392977e-05;-5.6475757446606e-05;2.4541417587898e-05;6.255383050302e-05;0.00037860943120904;-1.994340436795e-06;3.5111217584927e-05;-0.00041349726961926;-0.00023352394055109;7.3197537858505e-05;-6.7463668528944e-05;-0.00043019268196076;0.00015742328832857;-0.00010008516255766;2.9928205549368e-06;0.00014018929505255;5.567200423684e-05;-1.2771375850207e-06;-3.211524017388e-06;-2.4917490009102e-06;4.6524775825674e-05;-3.6526173062157e-05;9.2120433691889e-05;-0.00049381289863959;0.00032713753171265;-0.00052212976152077;0.00053468783153221;7.7452250479837e-06;2.9361093766056e-05;-0.00018967798678204;0.00017355392628815;0.00038474364555441;-0.00041169763426296;-3.6697460018331e-05;3.0621020414401e-05;0.00020130527263973;0.00012926354247611;-9.1040077677462e-05;3.9275946619455e-05;-0.00022925106168259;-5.1002493819396e-06;-9.4179580628406e-05;0.00017707422375679;-5.8643199736252e-05;9.6352152468171e-05;-0.00010096159530804;-0.00011517039820319;0.0001221018465003;5.0603641284397e-05;3.3781263482524e-05;-0.0002371371811023;-0.00016842817422003;-0.00090144400019199;-0.00070400559343398;-4.7506837290712e-05;3.4385218896205e-05;-0.00014138665574137;-8.3406986959744e-05;-0.0001926191180246;-0.00013691157801077;-0.0002525056770537;-0.00014801308861934;0.00026567763416097;0.00020986878371332;-4.1644630982773e-05;-0.0014994002413005;-0.0013919080374762;0.00056723202578723;0.00046719569945708;0.0016865142388269;0.0015739679802209;0.00061624724185094;0.00042429796303622;-5.1161441660952e-05;-0.00012239527131896;9.9566648714244e-05;6.6514912759885e-05;9.6386911536683e-06;1.4382637345989e-05;-5.7884030866262e-06;-7.4307477007096e-06;-1.6761312508606e-05;-2.3664706532145e-05;0.0005435905768536;0.00050810322863981;-9.9619675893337e-05;-0.00016529340064153;-0.00037120611523278;-0.00034108213731088;7.3302966484334e-05;6.3377076003235e-05;-0.00010793886031024;-0.00010304096213076;0.0001832000707509;0.0002089565678034;5.8153833379038e-05;0.00053464894881472;0.001834153663367;-0.00017144995217677;-0.0001398842287017;-0.0010760598815978;-0.0010816397843882;-0.0001400513574481;-0.00012228009290993;-9.111943654716e-05;-6.7469773057383e-05;6.4354539972555e-06;1.7635635231272e-05;6.303555710474e-05;3.7187317502685e-05;5.9598401094263e-06;-1.0324047252652e-06;-2.7531366868061e-05;6.6857195633929e-05;-3.5913450119551e-05;3.1346309697255e-05;-0.00045409877202474;0.00058148935204372;-0.00082612194819376;0.00081220892025158;6.4293435571017e-06;1.3330620276975e-05;-0.00021994780399837;0.000274993799394;0.00056739250430837;-0.00060859572840855;-4.6562334318878e-05;-2.3990164663701e-06;-2.1474888853845e-06;0.00023299951863009;-0.00016073147708084;-2.1512289094971e-05;-6.6584398155101e-05;1.3698147540708e-06;-7.4232491897419e-05;0.00012195379531477;-0.0001559855445521;0.00012129120295867;-0.00014931510668248;-0.00016841216711327;0.00018350160098635;7.1901529736351e-05;4.9075351853389e-05;-0.00033234187867492;-0.00021897924307268;-0.0011991879437119;-0.001013498287648;5.4324420489138e-05;1.3785220289719e-05;-0.00012515748676378;-0.00023895910999272;-0.00025397661374882;-0.00022389157675207;-0.00031789837521501;-0.00025877848383971;0.00031339257839136;0.00040922613698058;-6.4375337387901e-05;-0.0020419440697879;-0.0020564857404679;0.00080720527330413;0.00058462348533794;0.0022272376809269;0.0023776087909937;0.00082504656165838;0.00065232795896009;-0.00011540858395165;-0.00021227568504401;0.00011912917398149;0.00012781657278538;3.5578526876634e-05;4.8791871449794e-06;-1.5333329429268e-05;1.298980350839e-06;-1.731426709739e-05;-3.7188405258348e-05;0.00074195599881932;0.00061965017812327;-0.00028170362929814;-0.00018552852270659;-0.00044371988042258;-0.00058283022372052;0.00011070447362727;5.9417590819066e-05;-0.00016968949057627;-0.00012418003461789;0.00025205968995579;0.00033419375540689;7.2999668191187e-05;0.0006845963653177;0.0026208476629108;-0.00021340243984014;-0.00018005758465733;-0.0014606434851885;-0.0014052060432732;-0.00022242334671319;-0.00012002454604954;-4.6732813643757e-05;-0.0001535403134767;2.323819535377e-05;2.6507188522373e-05;7.2245020419359e-05;3.9803475374356e-05;1.3628062333737e-05;2.1372313767642e-06;-4.3649746658048e-05;5.6932709412649e-05;-9.1662244813051e-05;1.5438945411006e-05;-0.0002677928423509;0.00077612127643079;-0.00083160813665017;0.00077936158049852;-1.6268944818876e-05;-1.8338585050515e-06;-0.00017879261577036;0.00030688656261191;0.00055915059056133;-0.00059572188183665;-3.4325919841649e-05;-2.7558160581975e-05;-0.0002905921137426;0.00024106755154207;-0.00017274315177929;6.7338405642658e-05;-4.1752522861316e-07;4.9928756197914e-05;-4.2713509174064e-05;2.052133459074e-05;-0.00026579963741824;0.00011022809485439;-0.00015639020421077;-0.0001661448914092;0.00018527431529947;6.883057358209e-05;4.9079244490713e-05;-0.0003322480188217;-0.00020830598077737;-0.0011175562394783;-0.0010193702764809;0.00011763411748689;-6.5825421188492e-05;-2.0793373550987e-05;-0.00035520279197954;-0.0002198331640102;-0.00024119229055941;-0.00027267713448964;-0.00030510791111737;0.00022125986288302;0.00050577422371134;-6.4068612118717e-05;-0.0020033160690218;-0.0020054515916854;0.00083110184641555;0.00053053541341797;0.0020299893803895;0.0024779683444649;0.0007495436584577;0.00068578514037654;-0.00010901507630479;-0.0002179419825552;9.0231056674384e-05;0.00015429744962603;5.7048378948821e-05;-1.1173016901012e-05;-2.3888645955594e-05;1.2367606359476e-05;-1.1286270819255e-05;-4.3063129851362e-05;0.0007407374214381;0.00056324899196625;-0.00036206815275364;-4.459733463591e-05;-0.0003444601316005;-0.00067313469480723;0.00012570188846439;3.9820566598792e-05;-0.00017774490697775;-8.8079134002328e-05;0.0002213716506958;0.00034258043160662;6.5923391957767e-05;0.00064416648820043;0.0025381727609783;-0.00019399246957619;-0.00016672114725225;-0.0014201845042408;-0.0013397746952251;-0.00025483392528258;-8.4094128396828e-05;1.8796570657287e-05;-0.00023780463379808;2.7679141567205e-05;1.515145504527e-05;6.7428540205583e-05;4.2580977606121e-05;1.597564369149e-05;4.0395375435764e-06;-3.8562324334634e-05;2.9542645279435e-05;-0.00017812826263253;6.9679728767369e-05;-0.00013053040311206;0.00083024072228;-0.00059174821944907;0.00051692419219762;-4.4885346142109e-05;-2.2507410903927e-06;-0.00012207181134727;0.00027155029238202;0.00040909880772233;-0.00043251193710603;-1.3215349099482e-05;-1.5741203242214e-05;-0.00044180481927469;0.00016099624917842;-0.0001310684310738;0.00025349401403219;-0.0001147931907326;0.00011075138900196;-3.3838528906927e-05;-2.7198204406886e-05;-0.00032584025757387;8.3421291492414e-05;-0.00013044393563177;-0.00012228339619469;0.00014120183186606;5.0112772441935e-05;3.7913985579507e-05;-0.00026710936799645;-0.00016318561392836;-0.000819492561277;-0.000815364648588;9.7696101875044e-05;-0.00015749695012346;7.9286604886875e-05;-0.00035309183294885;-0.00013657058298122;-0.00019457669986878;-0.00017573751392774;-0.00027395406505093;8.7352156697307e-05;0.00045559994759969;-4.8444228013977e-05;-0.0016011426923797;-0.0014519413234666;0.00069716264260933;0.00040238548535854;0.0014345753006637;0.0020188966300339;0.0005146122421138;0.00055533921113238;-4.7731475206092e-05;-0.00014233183173928;4.4114822230767e-05;0.00013638772361446;5.8960213209502e-05;-2.2224516214919e-05;-2.6788162358571e-05;1.6863445125637e-05;-3.1030667742016e-06;-4.0611914300825e-05;0.00060979969566688;0.00045336797484197;-0.00030550675000995;0.00014965648006182;-0.00018653654842637;-0.00059857434825972;0.00011703538621077;2.8167216441943e-05;-0.00014395161997527;-3.4533153666416e-05;0.00013556361955125;0.00025392672978342;5.2521256293403e-05;0.00052844570018351;0.0018825290026143;-0.00015867603360675;-0.00013448129175231;-0.0011181876761839;-0.0010919531341642;-0.00023125547158998;-5.6054719607346e-05;5.2830637287116e-05;-0.00027443055296317;1.8198605175712e-05;-8.2740980360541e-06;6.1115410062484e-05;5.2897434215993e-05;1.2130696632084e-05;2.9220169039945e-07;-2.4267439584946e-05;1.664852425165e-05;-0.00012621242785826;6.9751062255818e-05;-5.0220300181536e-05;0.00050043978262693;-0.00035348939127289;0.00030042818980291;-3.4617209166754e-05;1.2001938785033e-06;-6.3907471485436e-05;0.00015618975157849;0.00024095740809571;-0.00024042456061579;-3.2206521609623e-06;-1.1621303883658e-06;-0.00028379840659909;8.9053683041129e-05;-8.536120003555e-05;0.00018170783005189;-0.00010130339796888;8.1013022281695e-05;-2.6232693926431e-05;-3.4897570003523e-05;-0.00020129678887315;4.7633180656703e-05;-7.3686424002517e-05;-7.2482296673115e-05;7.9134864790831e-05;2.6654042812879e-05;2.1166717488086e-05;-0.0001518764620414;-9.3882394139655e-05;-0.00042977961129509;-0.00042997227865271;5.6544216931798e-05;-9.0025998360943e-05;6.0959337133681e-05;-0.00024695086176507;-6.7689943534788e-05;-0.00010927167750197;-0.00010275927343173;-0.00017131898493972;3.6436311347643e-05;0.00028529847622849;-2.2683636416332e-05;-0.00087522005196661;-0.00075852882582694;0.00038934868643992;0.000210391372093;0.0007430444820784;0.0011030406458303;0.00027532433159649;0.00031657610088587;-2.0560622942867e-05;-9.1708679974545e-05;2.1427322280942e-05;8.1632475485094e-05;4.2568179196678e-05;-8.1834086813615e-06;-1.6229527318501e-05;1.0896866115218e-05;4.7331282075902e-06;-1.915328175528e-05;0.00036309010465629;0.00028155339532532;-0.00015752461331431;0.00016229663742706;-9.2216716438998e-05;-0.00036226658266969;6.898540596012e-05;1.7300000763498e-05;-7.2368813562207e-05;3.7421762044687e-06;6.9337373133749e-05;0.00013830214447808;2.7862111892318e-05;0.00033205031650141;0.0010396032594144;-0.00010294767707819;-8.6824678874109e-05;-0.0006476336857304;-0.00066227006027475;-0.00014434696640819;-4.4172622438055e-05;2.244710958621e-05;-0.00019578346109483;8.5877827586955e-06;-1.1765068848035e-05;3.3975287806243e-05;3.0740677175345e-05;1.5163774151006e-05;6.1721884776489e-06;-1.7190495782415e-07;-3.1899733585306e-05;-0.0004798581067007;0.00032553324126638;1.3627793123305e-05;0.0011702049523592;0.000155430068844;-0.00032511149765924;-0.0001036627436406;-9.6656713139964e-06;-2.1562878828263e-05;0.00013987963029649;-5.4646232456435e-05;7.0213529397734e-05;4.4002626964357e-05;0.000159421339049;-0.00073078990681097;-4.9912763643079e-05;-0.00010729214409366;0.0007377258152701;-0.00065462524071336;0.00025234746863134;-6.8471167651296e-06;3.8814316212665e-05;-0.00055722845718265;1.6699399566278e-05;-3.9353410102194e-05;6.674421911157e-06;2.0717272491311e-05;1.7342372302664e-05;-2.6262925985066e-06;-0.00016129523282871;-3.821525388048e-05;-7.380144961644e-05;-0.00063505093567073;7.3116578278132e-05;-0.00096215505618602;0.00022092802100815;-0.00011720704060281;8.1602694990579e-05;-7.0801906986162e-05;7.3427509050816e-05;-0.00030997069552541;-0.00017146217578556;0.00025703845312819;-5.0755090342136e-05;-0.00105707696639;-0.00022379746951628;0.00056371244136244;0.00020475353812799;4.6928613301134e-05;0.0016553530003875;-8.5802785179112e-05;0.00026225147303194;5.3238607506501e-05;0.00040879976586439;-7.1176669734996e-05;0.00011713754065568;4.1030230931938e-05;-4.5465931179933e-05;-1.4437840036408e-05;3.7967234675307e-05;-3.6649213143392e-05;-8.4822197095491e-05;-5.5423392041121e-05;-2.1147285224288e-05;-0.0001645622542128;0.00094477733364329;0.00024583766935393;-0.0004910621792078;4.0770049963612e-05;2.0213938114466e-06;-6.7578774178401e-05;0.00014199015276972;-0.00011767169053201;-9.6720075816847e-05;-7.6996211646474e-06;-9.865834726952e-05;-6.6910411987919e-05;9.5012772362679e-05;0.00010293444938725;0.00010168734297622;-0.000284600246232;-1.4560735507985e-05;8.2632614066824e-05;0.00016361188318115;-0.00043694267515093;-6.325777121674e-06;-0.00012558496382553;6.1253107560333e-05;0.00017086169100367;-9.7448662472743e-07;-1.3549729374063e-06;6.4101062889677e-05;-3.8244863389991e-05;-0.00024998941808008;1.5993713532225e-05;-8.828924910631e-05;0.00044187184539624;0.00027753639733419;-0.00048772190348245;-4.2944669985445e-05;-8.6638508946635e-05;4.7019584599184e-06;-0.00024717691121623;-0.00013606844004244;0.00040433887625113;1.6891046470846e-05;0.00024209079856519;-0.00017996545648202;-0.0001218592733494;-2.0848088752246e-05;0.00033048837212846;-0.00051346881082281;8.3793733210769e-05;0.0001782401377568;0.00011660877498798;-1.1271312359895e-05;-9.2858617790625e-06;0.00015450561477337;2.2990761863184e-05;-0.00011805088433903;2.1113282855367e-05;-3.0553386750398e-05;-0.00012699904618785;-2.1611681404465e-06;0.00020476612553466;-0.00064495368860662;6.4627143729012e-05;-0.0013215991202742;6.6007989516947e-05;0.0001435198209947;0.00011625968909357;7.5326104706619e-05;8.8881170086097e-05;-0.00033755003823899;-8.9434834080748e-05;-0.00023701263125986;-8.3222497778479e-05;-0.00092588842380792;0.00019491904822644;0.00049996579764411;0.00023528815654572;-0.00035464600659907;0.0015454081585631;-0.00021956277487334;6.581140041817e-05;2.4000967187021e-06;0.00092825363390148;-6.7053471866529e-05;-9.8307455118629e-06;1.4055881365493e-05;0.0001838642929215;1.0626627044985e-05;1.4461172213487e-05;1.6961066648946e-05;-7.4587936978787e-05;-0.00038863703957759;1.4500163160847e-05;-0.00011717542656697;0.0015929641667753;0.00029406361863948;-0.00046287025907077;-6.9474845076911e-05;8.7034102762118e-05;-5.0742386520142e-05;0.00014797224139329;-0.00013927233521827;-0.00050264841411263;-2.9100636311341e-05;6.15939788986e-05;-0.00061305687995628;-2.7138394216308e-05;0.00015284992696252;0.00065280316630378;-0.00073219533078372;0.00017235342238564;-3.6594134144252e-05;0.00014528645260725;-0.00029883606475778;1.2688993592747e-05;-0.00018754511256702;4.6776058297837e-05;0.0003069399681408;2.7163536287844e-05;-6.8938170443289e-06;8.7179410911631e-05;-0.00012056784908054;0.00059346773196012;0.00019890929979738;-0.00019425227947067;8.1722275353968e-05;0.00049110571853817;-0.00029921749955975;0.00012303590483498;5.6094151659636e-05;0.00073445501038805;-5.77122955292e-05;-0.0002580881700851;0.00012746363063343;1.3124800716469e-05;-0.00026211619842798;0.00016645102004986;-0.00020279902673792;0.00021745478443336;0.00040780974086374;-0.00033011951018125;-0.00045337487244979;-4.4365016947268e-05;-0.00080031849211082;-7.5281583121978e-05;-0.00028602851671167;1.4341397218232e-05;4.2133826354984e-05;9.2228565335972e-06;-7.8140321420506e-05;3.7032386899227e-05;5.6157154176617e-05;-0.00017696031136438;-0.00061825121520087;0.00033721886575222;-0.0019513245206326;0.0001327909558313;0.00034906039945781;-4.5493648940464e-05;0.00022147397976369;0.00013089759158902;-0.00047211040509865;9.0438574261498e-05;-0.00048488460015506;-4.7278263082262e-05;-7.1458707679994e-05;-0.0010099646169692;0.00047983948024921;0.00016563911049161;0.00058646802790463;0.0018095271661878;-0.00067614542786032;-0.00013635004870594;-0.00024081565788947;0.0014819775242358;-4.4018794142175e-05;-5.7637000281829e-05;-7.1346054028254e-05;0.00029844726668671;5.2110904107394e-06;-8.7098542280728e-06;2.9238721253932e-05;-5.9299134591129e-05;-4.7995392378652e-05;-1.0583999937808e-05;-0.00051328324479982;0.0017560856649652;-8.2959253631998e-05;-0.00045478253741749;0.00035902444506064;0.00019408190564718;-6.6421220253687e-05;0.00015273669851013;-1.3219318134361e-05;-0.00073063315358013;-0.00017339800251648;-2.4549442969146e-05;-0.0002883805136662;-0.00099476100876927;0.00016194467025343;0.0001510898291599;-0.00039469139301218;0.00094940449343994;-0.00015907769557089;0.0001858747418737;-0.00023935583885759;0.0001279070856981;-0.00026850192807615;-2.0625925571949e-06;0.00042122945887968;4.4047850678908e-05;2.7783844416263e-05;-1.0652375749487e-05;8.8174812844954e-05;-0.00011273775453446;0.00035448864218779;0.00035928416764364;-0.00057812058366835;9.399485134054e-05;0.00064156303415075;-0.00038757041329518;0.00013010854308959;8.1124671851285e-05;0.00066978199174628;-5.2107949159108e-05;-0.00037170993164182;0.00016902192146517;-2.1891968572163e-05;-0.00032308368827216;0.00039648069650866;-9.3992435722612e-05;0.00022545491810888;0.0006517336005345;-0.00058237958000973;-0.00042635371210054;-0.00011452396574896;-0.00050335796549916;-0.00010726907930803;-0.00028761694557033;1.2363797395665e-05;7.0240857894532e-05;1.7680018800093e-06;-8.1959631643258e-05;4.1507908463245e-05;4.1584371501813e-05;-0.00020731962285936;-0.00087999558309093;0.00034470873652026;-0.002256219740957;0.00015449282363988;0.0003136605664622;2.4102651877911e-05;0.0002055643562926;0.00015417173563037;-0.00060711556579918;0.00011652745888568;-0.0004356213612482;-0.00010114492761204;-9.7980017017107e-05;-0.0012929452350363;0.00044744787737727;0.00026688419166021;0.00072309793904424;0.002285014372319;-0.00070450297789648;-4.0399707359029e-05;-0.00027865418815054;0.001689859200269;-2.9737011573161e-05;-1.7735268556862e-05;-9.1994457761757e-05;0.00029941435786895;1.5286736015696e-05;9.4117467597243e-06;2.4713113816688e-05;-8.8662258349359e-05;-5.7666304201121e-05;-3.2008993002819e-05;-0.00056160194799304;0.0020583414006978;-0.00012518848234322;-0.00059995002811775;0.00044940708903596;0.00017826666589826;-6.0585476603592e-05;0.00023295205028262;-2.6079229428433e-05;-0.00073342077666894;-0.00021703743550461;-3.3575295674382e-05;-0.00036058627301827;-0.0010950865689665;0.0002058651734842;0.00019305059686303;-0.00041489565046504;0.0010406811488792;-0.00011897429067176;0.00019161772797816;-0.00043333458597772;0.00017424403631594;-0.00030797073850408;-3.8290513657557e-06;0.00045147803029977;6.0424568800954e-05;-7.7558825068991e-06;-1.2689275536104e-05;4.1627230530139e-05;1.6865287761902e-05;-0.00015374134818558;0.00036653448478319;-0.0009805845329538;-6.5434396674391e-05;0.00015351863112301;-6.3127510657068e-05;1.8065660697175e-05;7.2620649007149e-05;-0.000132872373797;3.4141240234931e-07;4.4010052079102e-05;-2.4830535494402e-07;-4.4564785639523e-05;2.2290363631328e-05;0.0008230991079472;6.3880936068017e-05;-3.5708476389118e-06;0.00028279700200073;-0.00069106160663068;-3.8990652683424e-05;-0.00017623712483328;0.0004388707166072;2.2253494535107e-05;5.1411330787232e-05;-1.4667743926111e-05;-4.6006669435883e-05;1.3366725397645e-05;3.475955736576e-06;1.8477316189092e-05;-5.4423460824182e-05;-0.00013064153608866;-0.00068196322536096;-0.00019155922927894;-0.0007796612335369;0.00010936748003587;-8.0079284089152e-05;0.0001930456928676;-0.00010002228373196;3.153290526825e-05;-0.00028225971618667;6.4218991610687e-05;0.00022930355044082;-0.00014118717808742;-4.6895631385269e-05;-0.0010135186603293;-0.00046107871457934;0.00023922936816234;0.00047854703734629;0.001584765734151;0.00028239114908502;0.00031394901452586;3.4084787330357e-06;0.00035429353010841;1.8024624296231e-05;0.00012158785830252;-5.0939848733833e-05;-5.9031477576355e-05;2.7642763598124e-05;3.789845504798e-05;-1.5113005247258e-05;-8.7719861767255e-05;-6.8761459260713e-05;-0.00014341429050546;7.492153235944e-05;0.00043607730185613;-0.00017797862528823;-0.00037743180291727;0.00016075911116786;-2.9625314709847e-05;6.3251864048652e-05;4.7401790652657e-05;-6.4571009716019e-05;7.2232460297528e-06;-5.6722459703451e-05;7.0359470782932e-07;-0.00024969669175334;0.00018316980276722;0.00010417126759421;0.0001683620212134;9.6171170298476e-05;-0.00012469371722545;0.00015708082355559;-6.0385340475477e-05;-0.00028402847237885;0.00012648504343815;-7.2660084697418e-05;-7.6998112490401e-06;0.00011049573367927;4.6329176257132e-05;4.5294523260964e-06;5.1608099056466e-06;-4.8106419853866e-05;7.4468705861364e-05;9.9548204161692e-05;-0.00015002157306299;-0.00021019084670115;0.00045856862561777;-0.00075709837255999;0.00073000957490876;6.1017763073323e-05;-4.4068230636185e-05;-0.00013571568706539;0.00022958969930187;0.00046575418673456;-0.00049998908070847;-4.8150268412428e-05;-7.2009192081168e-05;-0.00012849600170739;0.00034498740569688;-0.00023068390146364;-0.00042723742080852;0.00048479982069694;-0.00011353188165231;4.8972182412399e-05;7.1230992034543e-05;-0.00018810704932548;7.3291310400236e-05;-0.0001145345668192;-0.00014905103307683;0.00016506281099282;6.7885703174397e-05;4.4773256377084e-05;-0.00025113573065028;-0.0001417153107468;-0.0010576361091807;-0.00092700030654669;0.00014057494990993;2.7436039090389e-05;-6.1571721744258e-05;-0.00024586531799287;-0.00023543655697722;-0.0002290039556101;-0.00024839979596436;-0.00023923300614115;0.00025203422410414;0.00041492932359688;-0.0001097975691664;-0.0016752608353272;-0.0021570604294538;0.00068924261722714;0.0004489756829571;0.0020150789059699;0.0022855300921947;0.00070769008016214;0.00059312931261957;-0.00014677623403259;-0.00022336024267133;0.00010576254862826;0.00014292806736194;2.9663446184713e-05;-1.6380941815441e-05;-4.1277021409769e-06;1.339661412203e-05;-3.9326016121777e-05;-4.7538454964524e-05;0.00034876351128332;0.00022434322454501;-0.00048268600949086;-0.00035877121263184;-0.00034053152194247;-0.00053992157336324;5.203652108321e-05;-2.8120427941758e-06;-0.00017596542602405;-0.00011771743447753;0.00024357988149859;0.00035286924685352;3.0864084692439e-05;0.00020711528486572;0.0022458198945969;-2.8870126698166e-05;-3.7590962165268e-05;-0.00084060366498306;-0.00071025482611731;-0.00010048349213321;8.581681868236e-06;7.483266381314e-05;-8.3741826529149e-05;4.8252997657983e-05;4.8569581849733e-05;2.4202492568293e-05;-1.2285393495404e-05;1.0385894711362e-05;5.8208206610288e-06;-5.9776033594972e-05;6.9629488280043e-05;4.5898850657977e-05;-0.00012812539353035;-0.00013723973825108;0.00062571431044489;-0.00080712023191154;0.00075277977157384;4.2225863580825e-05;-4.5980403228896e-05;-0.00012590669211932;0.00026638343115337;0.00049814127851278;-0.00052499299636111;-4.0972394344863e-05;-9.0738969447557e-05;-0.00030343810794875;0.00035644942545332;-0.0002423771948088;-0.00032383913639933;0.00046660509542562;-7.2483475378249e-05;5.0610142352525e-05;1.6537082046852e-05;-0.00026836036704481;7.577717769891e-05;-0.000129181164084;-0.0001588053710293;0.00017637902055867;6.9949048338458e-05;4.7001689381432e-05;-0.0002734450972639;-0.00015252038429026;-0.0010755293769762;-0.00097745284438133;0.00017507829761598;-2.8107851903769e-05;-6.0776324062317e-06;-0.00033700477797538;-0.00022792421805207;-0.0002484301221557;-0.00024350096646231;-0.00028574257157743;0.00021341821411625;0.00049798563122749;-0.0001092934035114;-0.0017782631330192;-0.0022022780030966;0.00075291306711733;0.00045445584692061;0.0020089235622436;0.0024623463395983;0.00071063259383664;0.00064755044877529;-0.00014340663619805;-0.00023517440422438;9.4938783149701e-05;0.00016521599900443;4.6672041207785e-05;-2.2930071281735e-05;-1.122623871197e-05;1.9837094441755e-05;-3.586892853491e-05;-4.9918729928322e-05;0.0004321324522607;0.00024458108237013;-0.00051248708041385;-0.00026334359426983;-0.0003105686919298;-0.00062788475770503;7.4938528996427e-05;-8.8187871369882e-06;-0.00018362127593718;-9.6642623248044e-05;0.00023575557861477;0.0003728982701432;3.1950748962117e-05;0.00025199187803082;0.0023432986345142;-3.8865851820447e-05;-5.1015045755776e-05;-0.00096041260985658;-0.00077321019489318;-0.00014927396841813;1.4302297131508e-05;9.3989088782109e-05;-0.000153420100105;4.7432655264856e-05;4.1197628888767e-05;3.0012175557204e-05;-7.7395689004334e-06;1.6601610695943e-05;-1.1417299674576e-06;-4.2267154640285e-05;4.03465492127e-05;-9.6519819635432e-05;3.1828520150157e-05;-7.469832780771e-05;0.00059566542040557;-0.00059896497987211;0.00053748692153022;-1.7195545297e-05;-9.481600500294e-06;-8.8429820607416e-05;0.00021161159384064;0.00038141213008203;-0.00038460208452307;-1.7011961972457e-05;-3.3691874705255e-05;-0.00032657597330399;0.00020395705359988;-0.00016190667520277;4.2247658711858e-05;6.748472515028e-05;4.4388296373654e-05;-1.3265564120957e-05;-3.7820227589691e-05;-0.00023925055575091;6.4530919189565e-05;-0.00010389514500275;-0.00011991374776699;0.00012907135533169;4.456436727196e-05;3.2722120522521e-05;-0.0002144639584003;-0.00012775586219504;-0.00068007636582479;-0.00063848466379568;0.00011429145524744;-6.0204049077583e-05;2.9795815862599e-05;-0.00034119075280614;-0.00013075103925075;-0.00017086495063268;-0.00017939200915862;-0.00024438262335025;0.00011353338049958;0.00041252965456806;-5.1463997806422e-05;-0.0012620026245713;-0.0013100903015584;0.00055075623095036;0.00030766378040425;0.001228655455634;0.0016578548820689;0.00046427201596089;0.00047231477219611;-7.4546645919327e-05;-0.000171166844666;5.2987314120401e-05;0.00012438900012057;5.7316319725942e-05;-6.8099370764685e-06;-1.6489660993102e-05;1.5518749933108e-05;-2.2892443212186e-06;-2.483744174242e-05;0.00047203165013343;0.0003303166013211;-0.00026945245917886;6.3874213083182e-05;-0.00018809743050952;-0.0005091373459436;8.3840728620999e-05;1.1623432328633e-05;-0.00010204108548351;-1.1513025128806e-05;0.0001389844546793;0.00024182560446206;2.8611866582651e-05;0.00037546624662355;0.001634502899833;-0.00010474494774826;-9.6793293778319e-05;-0.00088390154996887;-0.000813351245597;-0.00018784789426718;-4.7573383199051e-05;2.370622678427e-05;-0.00023057714861352;2.0341130948509e-05;3.9648029996897e-06;3.1843930628384e-05;1.2194693226775e-05;1.6173178664758e-05;3.9176143218356e-06;-1.2754259159919e-06;-3.1097559258342e-05;-0.00046987188397907;0.00030123206670396;1.5439873095602e-05;0.0011381157673895;0.00015774549683556;-0.00031299001420848;-9.9973018222954e-05;-3.5953746646555e-07;-1.5950017768773e-05;0.00012857402907684;-5.9148911532247e-05;3.902354001184e-05;3.92002366425e-05;0.00013872337876819;-0.0007232443895191;-3.9393300539814e-05;-9.4216156867333e-05;0.0007242135470733;-0.00062274560332298;0.00024198446772061;-1.2640466593439e-05;3.8773468986619e-05;-0.00051133503438905;1.4094845028012e-05;-4.5366647100309e-05;6.3082156884775e-06;3.6088185879635e-05;1.9528497432475e-05;-6.2452372731059e-06;-0.00016097555635497;-2.5358878701809e-05;-5.6167740694946e-05;-0.00063099293038249;9.9224300356582e-05;-0.0010257341200486;0.00017508755263407;-4.7824330977164e-05;7.7787466580048e-05;-6.5462045313325e-05;7.9315235780086e-05;-0.00029901688685641;-0.00014656269922853;0.00023170131316874;-5.2285718993517e-05;-0.001052776700817;-0.00022432625701185;0.0005591344088316;0.00019502111535985;2.5567160264472e-05;0.0016869080718607;-8.6000858573243e-05;0.00023726632934995;2.4913539164118e-05;0.00044112189789303;-6.8795052357018e-05;0.00011783410445787;3.2817377359606e-05;-5.4703286878066e-05;-1.1807834198407e-05;3.8151112676132e-05;-5.5979726312216e-05;-8.5736719483975e-05;-5.9487472753972e-05;-0.00010853593266802;-0.00013827660586685;0.0008348073461093;0.00023478784714825;-0.00045105212484486;4.6275828935904e-05;-7.3662745307956e-06;-5.5649437854299e-05;0.00012690199946519;-0.00011650988744805;-9.2100737674627e-05;-1.4680469575978e-05;-0.00022172923490871;-0.00011509861360537;0.00015651136345696;0.00013174508058;0.00011154209641973;-8.2788828876801e-05;-1.9951146896346e-05;0.00010751233639894;0.00014854563050903;-0.00039067139732651;-1.2004310519842e-05;-0.0001164502609754;5.8847348554991e-05;0.00016024903743528;-1.0359841553509e-06;-9.2592990768026e-06;0.0001155299905804;-5.6823657359928e-05;-0.00024249283887912;-0.00023981522826944;-0.00011587580956984;0.00030816686921753;0.00034258954110555;-0.00058960716705769;-4.8313857405446e-05;-0.00011403835378587;2.7590660465648e-05;-0.00048525456804782;-0.00016573922766838;0.00046066302456893;-1.0468344953551e-05;0.00030318711651489;-0.00011183622700628;-0.00018883054144681;8.675928984303e-05;0.00032150637707673;-0.00055551633704454;5.7436474889982e-05;0.00029617748805322;0.00013461333583109;0.00037103614886291;-1.6505073290318e-05;0.00023817305918783;1.9503731891746e-05;-0.00013152064639144;3.3765565603971e-05;-5.3269337513484e-05;-0.00018236595497001;3.0146507924655e-05;0.0003385529271327;-0.00076615071156994;0.00011804595123976;-0.0019679521210492;-6.7294454311195e-06;0.00034326361492276;0.00015966218779795;0.0001458636688767;0.0001220837875735;-0.00041488560964353;-6.8951521825511e-05;-0.00044676897232421;-0.00010631631448632;-0.0012306366115808;0.00035557089722715;0.00068252626806498;0.0002539859560784;-0.00058039196301252;0.0021044434979558;-0.00031049133394845;-2.1772790205432e-05;-3.978897802881e-05;0.0013560703955591;-8.5566418420058e-05;-4.7082154196687e-05;5.2134009820293e-06;0.00027992553077638;2.5393735995749e-05;7.1918479989108e-06;-2.2447102310252e-06;-9.9108787253499e-05;-0.00056621932890266;-7.9648867540527e-05;-0.00011330506094964;0.0021138053853065;0.0003799983242061;-0.00056081457296386;-0.0001017172326101;0.00014512367488351;-4.8914880608208e-05;0.0001362406037515;-0.00018305362027604;-0.00080467382213101;-4.3342406570446e-05;-4.8783778765937e-05;-0.00095603137742728;2.8353688321658e-05;0.00023989008332137;0.00095975393196568;-0.00081837910693139;0.00025099675985985;-5.7061166444328e-05;0.00016565987607464;-0.00023871824669186;1.0932762961602e-05;-0.00025697244564071;5.7353809097549e-05;0.00045829502050765;-5.3701483011537e-06;-9.2331538326107e-06;0.00012512656394392;-5.2480343583738e-05;-6.0406939155655e-05;-0.00049961678450927;-9.7895346698351e-05;-0.00014282925985754;0.00025269907200709;-0.0004289329808671;-1.6683286958141e-05;-0.00011807400005637;4.3173644371564e-05;-0.00056234066141769;-0.00012145083746873;0.00037333506043069;-4.5551092625828e-05;0.00020973657956347;0.00010916443716269;-0.00017274446145166;0.00019347069610376;6.6554690420162e-05;-0.00024329917505383;-3.5198219848098e-05;0.00033302657539025;9.2621288786177e-05;0.00069662561872974;-2.0093435523449e-05;0.00025142915546894;7.6724072641809e-06;-0.00012243565288372;2.9295761123649e-05;-4.9911977839656e-05;-0.00014357356121764;4.0856539271772e-05;0.00031661347020417;-0.00050382787594572;9.1014364443254e-05;-0.0016295682871714;-6.442977610277e-05;0.00036852419725619;0.00012869939382654;0.00016895950830076;9.0516106865834e-05;-0.00028125452809036;-2.0808507542824e-05;-0.00053894933080301;-8.1201338616665e-05;-0.0009161937632598;0.00038485342520289;0.00052550999680534;0.00015866720059421;-0.0005398383946158;0.0015775269130245;-0.00025902426568791;-0.00011844028631458;-4.6366232709261e-05;0.0011731109116226;-6.1348044255283e-05;-9.8825024906546e-05;-4.3818563426612e-06;0.00030379529925995;2.9821214411641e-05;-9.9006729215034e-06;6.5551344050618e-06;-7.4280957051087e-05;-0.00050048687262461;-8.6974672740325e-05;-7.1508868131787e-05;0.0017604418098927;0.00028485670918599;-0.00039705345989205;-0.00010575516353128;0.0001545547565911;-3.1245876016328e-05;3.1658182706451e-05;-0.00013303755258676;-0.00081202673027292;-3.3657954190858e-05;-1.6175929431483e-06;-0.00085061870049685;-8.525921657565e-06;0.00020177839905955;0.00085604033665732;-0.00074031215626746;0.0002363692765357;-7.9802492109593e-05;0.00011035430361517;-7.3408460821156e-07;1.231689202541e-05;-0.00020708491501864;3.781522900681e-05;0.00042206238140352;2.3835114916437e-05;-2.4875744202291e-06;9.0362511400599e-05;-0.00013915661838837;0.0011520921252668;-8.6440908489749e-05;0.00049517164006829;2.6263480322086e-05;0.0001217256358359;-7.8312536061276e-05;8.8245287770405e-05;2.0662893803092e-05;0.00082641682820395;-7.1648908487987e-05;0.00012485796469264;1.5688154235249e-05;9.3770904641133e-05;-0.00011793984594988;-0.00017948378808796;-0.00046942289918661;0.00020628559286706;-8.1006553955376e-05;8.700558100827e-05;-0.00048508393228985;7.1136208134703e-05;-0.0014913128688931;1.9026372683584e-05;-0.00023488140141126;1.2283812793612e-05;-7.1616552304476e-05;3.3964231988648e-05;-6.0058617236791e-05;2.5618241124903e-05;8.4373808931559e-05;-0.00014096917584538;0.00010377766739111;0.00025149874272756;-0.0012894842075184;8.6031250248197e-05;0.00037844077451155;-0.00015016668476164;0.00021472421940416;8.2990460214205e-05;-0.00012319158122409;2.871458127629e-05;-0.00047498018830083;3.7534606235567e-05;1.60122399393e-05;-0.00045955250971019;0.00047299309517257;-0.00015328165318351;0.0003498392761685;0.00084485305706039;-0.00053546344861388;-0.00032862785155885;-0.00013450505502988;0.0008446968276985;-5.1159291615477e-05;-0.00012393246288411;-3.1039409805089e-05;0.00024019919510465;-5.8858522606897e-06;-4.9532460252522e-05;3.8398640754167e-05;8.2663621014945e-07;-6.2796563724987e-05;3.7556546885753e-05;-0.0003608513798099;0.0010226353770122;-3.4095769478881e-06;-0.00016532304289285;0.0001691179786576;0.00022899312898517;-5.506270827027e-05;-7.3207564128097e-05;9.1716219685622e-06;-0.00071358168497682;-8.1733160186559e-05;1.3639552889799e-05;-0.00021304957044777;-0.00069977156817913;3.1937885069055e-05;0.0001274140086025;-0.00023630795476492;0.00066032854374498;-0.00022942047507968;0.00014701021427754;0.00021856107923668;3.7254765629768e-05;-0.00017259716696572;-6.0156007748446e-06;0.00036415827344172;1.5656236428185e-05;4.7901525249472e-05;-1.2213808076922e-05;0.00011307489330648;-0.00017360702622682;0.0011285046348348;9.5774383225944e-05;0.00015899978461675;6.7923887399957e-05;0.00037601368967444;-0.00023396444157697;9.6296629635617e-05;6.1395374359563e-05;0.0010761916637421;-8.8506443717051e-05;1.5385032384074e-05;8.3473023551051e-05;6.2020706536714e-05;-0.00029029426514171;1.4251651009545e-05;-0.0004318633582443;0.00030133852851577;0.00030548789072782;-0.00020194197713863;-0.00058034551329911;1.2259965842532e-06;-0.0016139838844538;-2.7478876290843e-05;-0.00032659931457601;1.5535830243607e-05;-7.4902833148371e-05;3.4906537621282e-05;-0.00010363232286181;4.5668606617255e-05;0.0001305556652369;-0.00023112952476367;-0.00022485380759463;0.00041665867320262;-0.0023046794813126;0.00016992446035147;0.0005335250752978;-0.00016636609507259;0.00030585777130909;0.00014847435522825;-0.0003864687460009;8.1891907029785e-05;-0.00058310525491834;7.8334524005186e-06;-2.4403041607002e-05;-0.00099207111634314;0.00068291474599391;-7.1711969212629e-05;0.00065460475161672;0.0018245874671265;-0.00086903717601672;-0.00039059191476554;-0.00025622051907703;0.0015418236143887;-8.0223006079905e-05;-0.00010262883733958;-7.0585512730759e-05;0.00031581390067004;-2.4261876205856e-06;-4.3265627027722e-05;5.0555132474983e-05;-2.8336822651909e-05;-0.00011492446355987;1.9485381926643e-05;-0.00060939852846786;0.0018260910874233;-2.6241197701893e-05;-0.00041254394454882;0.00036445155274123;0.00029765631188639;-7.0726979174651e-05;9.6730116638355e-05;6.4189948716376e-06;-0.00094307371182367;-0.00018649866979104;-3.3193537092302e-06;-0.00049784156726673;-0.0012219593627378;0.00011641562741715;0.00028867251239717;-0.00021134430426173;0.0011079700198025;-0.00029078632360324;0.00022309619816951;-8.4030529251322e-05;0.00010614769416861;-0.00031281556584872;-1.4989926967246e-05;0.00052350159967318;4.4904601963935e-05;4.2066785681527e-05;-1.4797724361415e-05;8.3170823927503e-05;-0.00012203449296067;0.00055956171127036;0.00026469439035282;-0.00031609353027306;7.6392272603698e-05;0.00050667038885877;-0.00031020888127387;8.24926464702e-05;7.3579612944741e-05;0.0007786140195094;-6.422825390473e-05;-0.00017291016411036;0.00012863446318079;2.4702976588742e-06;-0.0003016929840669;0.00025937613099813;-0.00018473193631507;0.0002346524852328;0.00054090807680041;-0.0004431355628185;-0.00041267147753388;-7.6590651588049e-05;-0.00089213415049016;-7.1129456046037e-05;-0.00027004824369214;1.3023161045567e-05;-9.3385269792634e-06;1.5438770788023e-05;-9.2163681983948e-05;4.3495787394932e-05;9.3598828243557e-05;-0.00021159718744457;-0.00052711390890181;0.00036351842572913;-0.0022318894043565;0.00017093846690841;0.00041383059578948;-7.0992464316078e-05;0.00024312139430549;0.00014424466644414;-0.00048039757530205;0.00010001096234191;-0.000455286615761;-4.5989276259206e-05;-6.2141574744601e-05;-0.0011156619293615;0.00052521342877299;8.8012995547615e-05;0.00067051185760647;0.0020234356634319;-0.00075546972220764;-0.00021927134366706;-0.00025669051683508;0.0015489046927541;-5.9937890910078e-05;-4.2749401472975e-05;-7.9487334005535e-05;0.00027202654746361;5.9756503105746e-06;-8.7238113337662e-06;3.5173405194655e-05;-5.894237983739e-05;-0.0001049802522175;-9.01768435142e-05;-0.0005530747002922;0.0017886077985168;-5.104067895445e-05;-0.00048513078945689;0.00039679335895926;0.00020018477516714;-4.9522146582603e-05;0.00018003306468017;-3.0333346785483e-06;-0.00074985169339925;-0.00020417345513124;-2.719120857364e-05;-0.00054754392476752;-0.0011477256193757;0.00018486453336664;0.0003043657343369;-8.4148196037859e-05;0.0010147130815312;-0.0001581814722158;0.00018410824122839;-0.00028438415029086;0.00013111977023073;-0.00028665439458564;-1.6398529623984e-05;0.00043556181481108;5.5352054914692e-05;-2.1770438252133e-06;7.6621345215244e-06;-3.319165261928e-05;4.7967023419915e-05;0.00019618637452368;-0.00026570458430797;6.0416459746193e-05;1.4728041605849e-05;-0.00032022796222009;0.00031113455770537;9.3736496637575e-05;-7.4371353548486e-05;-1.6749443602748e-05;6.9013723987155e-05;0.00013749464415014;-0.0001527316053398;-3.495991404634e-05;-9.588101238478e-05;-6.5901876951102e-05;0.00029251846717671;-0.00018257535703015;-0.00073374656494707;0.00085631717229262;-0.00018447451293468;0.00013419378956314;5.4645577620249e-05;-9.5773197244853e-05;-3.7728143524873e-06;-2.1998648662702e-05;-5.4421292588813e-05;6.2644350691698e-05;3.2734977139626e-05;1.916136170621e-05;-3.566072700778e-05;1.3235855476523e-05;-0.00039264821680263;-0.00035469312570058;0.00014308058598544;8.0424433690496e-05;-1.3210064935265e-05;-8.3441540482454e-05;-0.00011151724902447;-0.00011417786299717;-7.0761532697361e-05;-7.958566857269e-05;0.00011797045590356;0.00018660844943952;-0.00012531831453089;-0.00041549853631295;-0.0012498206924647;0.00021566986106336;0.00010322264279239;0.00085064477752894;0.00098244717810303;0.00025223800912499;0.00021409995679278;-0.00012665073154494;-0.00013727838813793;5.2523286285577e-05;7.905737584224e-05;-4.6458662836812e-06;-2.8210712116561e-05;1.2328254342719e-05;1.2957338185515e-05;-2.8523714718176e-05;-2.1186549929553e-05;-0.00023233286628965;-0.00025986178661697;-0.00043843284947798;-0.00042774112080224;-0.00012074335245416;-0.00020441556989681;-4.691349749919e-05;-5.9374135162216e-05;-0.00010091743752128;-7.8584336733911e-05;0.00013484970259015;0.00019982787489425;-7.7050090112607e-06;-0.00022134224127512;0.00083879916928709;9.0623274445534e-05;5.6496293836972e-05;0.00018353731138632;0.00027049609343521;9.7292453574482e-05;0.00012751595932059;0.00013692896754947;6.6734508436639e-05;4.9882182793226e-05;5.2259925723774e-05;-2.9593229555758e-05;-5.2861618314637e-05;-1.1516823406055e-06;1.1639630429272e-05;-5.9828165831277e-05;7.9060417192522e-05;0.00028108691913076;-0.00036976239061914;3.3478154364275e-05;0.0001844174839789;-0.00062256550882012;0.0005972262006253;0.00013344490434974;-0.00010515503527131;-5.1464336138451e-05;0.00015546799113508;0.00031246832804754;-0.00033837155206129;-5.3530184231931e-05;-0.00015224920934997;-0.00015824516594876;0.00045928481267765;-0.00028986242250539;-0.00099266425240785;0.0011792357545346;-0.00026277362485416;0.00018227174587082;6.281491369009e-05;-0.00018153651035391;1.5289870134438e-05;-6.2918246840127e-05;-0.00011285840446362;0.00012774961942341;6.0463768022601e-05;3.6390945751918e-05;-0.00012326524301898;-3.0884042644175e-05;-0.00081448256969452;-0.00072491797618568;0.00022629005252384;8.9837223640643e-05;-2.3182175937109e-05;-0.00018761411774904;-0.00020823894010391;-0.00021040967840236;-0.00015810651530046;-0.00017539586406201;0.00020624065655284;0.00036102253943682;-0.00017648912034929;-0.001043671509251;-0.0021730954758823;0.00047556345816702;0.00026103938580491;0.0016527366824448;0.001925214775838;0.00052848114864901;0.00044979839003645;-0.0001943053357536;-0.00023125048028305;9.3470822321251e-05;0.00014195415133145;6.7650503297045e-06;-3.9960148569662e-05;1.2360756954877e-05;2.1637744794134e-05;-5.331134525477e-05;-4.3701049435185e-05;-0.00015810753393453;-0.00026187812909484;-0.00067541428143159;-0.00062561628874391;-0.00023935000353958;-0.00041933832108043;-3.4320073609706e-05;-7.5988042226527e-05;-0.00017679907614365;-0.00012773773050867;0.00023284525377676;0.00035326261422597;-4.7195358092722e-06;-0.00025296420790255;0.0016968445852399;0.00012867373879999;7.5932206527796e-05;-6.129925895948e-05;0.00014982419088483;7.7594224421773e-05;0.00016310470527969;0.00019461220654193;5.0196034862893e-05;7.4425908678677e-05;7.8812656283844e-05;-2.8229338568053e-05;-7.1352609666064e-05;2.0144464087934e-06;1.1543138498382e-05;-6.6126442106906e-05;7.0841728302184e-05;0.00025094236480072;-0.00034227097057737;7.514199387515e-05;0.00027044551097788;-0.00063730403780937;0.00059791264357045;0.00011998201080132;-9.9471042631194e-05;-4.2240168113494e-05;0.00017232510435861;0.00032575312070549;-0.00034601989318617;-4.6939247113187e-05;-0.00017769231635612;-0.00025731438654475;0.00045083923032507;-0.00027712824521586;-0.00088629650417715;0.0011288609821349;-0.00023519337992184;0.00017221040616278;2.2037647795514e-05;-0.00021682219812647;1.5876825273153e-05;-7.1046822995413e-05;-0.00011580395221245;0.00013094252790324;6.0385234974092e-05;3.5760152968578e-05;-0.00013355266128201;-3.9313294109888e-05;-0.00080792506923899;-0.00072431465378031;0.00024589843815193;5.2905073971488e-05;6.4219506157315e-07;-0.00022958376212046;-0.0002010114985751;-0.00021191996347625;-0.00015327062283177;-0.00019609581795521;0.00018080355948769;0.00039385014679283;-0.00016652786871418;-0.0010722160805017;-0.0021192105486989;0.00049324339488521;0.00025874542188831;0.0015981505857781;0.0019548607524484;0.00052351492922753;0.00046335754450411;-0.00018858641851693;-0.00022896313748788;8.5327585111372e-05;0.00014883682888467;1.7105769074988e-05;-4.0896266000345e-05;6.8891267801519e-06;2.4648845283082e-05;-5.0801187171601e-05;-4.0753056964604e-05;-6.9309797254391e-05;-0.00024985510390252;-0.00064323347760364;-0.00056987773859873;-0.00022146142146084;-0.00045023506390862;-1.3772711099591e-05;-7.9277982877102e-05;-0.0001713896781439;-0.0001140716849477;0.00021970392845105;0.00035552511690184;-3.2733821626607e-06;-0.00020743042114191;0.0017078570090234;0.00011776005703723;5.9233516367385e-05;-0.00019232937484048;0.0001323239703197;3.3927703043446e-05;0.00016372470417991;0.00018740120867733;1.5695233742008e-05;6.8509405537043e-05;7.4855575803667e-05;-2.1387246306404e-05;-6.9596106186509e-05;9.9266492270544e-07;-1.9515495296218e-05;0.00014147111505736;-5.6047450925689e-05;-0.00013240329280961;-0.00050262757577002;-0.00010362258035457;-1.105144565372e-05;0.00027861483977176;-0.00046949475654401;-3.9619189919904e-05;-9.3265727628022e-05;4.8907826567302e-05;-0.00062177993822843;-0.00012951946700923;0.00030936487019062;-4.4841937778983e-05;0.00027657634927891;3.2664553145878e-05;-0.00021193630527705;0.00020261549798306;0.00017914646014106;-0.00040753712528385;8.5906287949911e-07;0.00032264343462884;9.7015697974712e-05;0.00079948693746701;-1.8036960682366e-05;0.00024699245113879;3.0145952223393e-06;-7.9067060141824e-05;3.6950241337763e-05;-6.3609062635805e-05;-0.00018974003614858;7.1220645622816e-05;0.00037813716335222;-0.00051926914602518;0.00013617257354781;-0.0020487364381552;-0.00010003599891206;0.00046922455658205;0.00015538325533271;0.0001852692803368;0.00011179026478203;-0.00032492258469574;-1.5928239008645e-05;-0.00052628462435678;-8.2152830145787e-05;-0.0011164521565661;0.00045200498425402;0.0006548372330144;0.00012175174924778;-0.00066019932273775;0.001960932277143;-0.00030398002127185;-0.00016435484576505;-7.2682283644099e-05;0.0013320056023076;-7.5391450081952e-05;-7.9171259130817e-05;-6.4696828303568e-06;0.00028370026848279;3.7848869396839e-05;-9.4889919637353e-06;-4.5766373659717e-05;-8.4856677858625e-05;-0.00057869293959811;-0.00016374263213947;-5.1726892706938e-05;0.0019276393577456;0.00034141261130571;-0.0004587778239511;-9.8838638223242e-05;0.00017069409659598;-2.3440228687832e-05;5.8563939091982e-05;-0.00017069018213078;-0.00088558718562126;-3.975323488703e-05;-0.000230194607866;-0.0010468577966094;0.00013101402146276;0.00024206824309658;0.00098367419559509;-0.0005347533733584;0.00025362707674503;-7.5994139479008e-05;0.00012271472951397;-4.9981761549134e-05;2.3467599419291e-07;-0.00024301331723109;5.0019931222778e-05;0.00047264492604882;-3.5445291359792e-06;-2.4863371436368e-05;0.00021438453404699;-7.7440876339097e-05;7.0703055826016e-05;-0.0011056803632528;-9.6494382887613e-05;-0.00060221023159102;0.00020582650904544;-0.00032965029822662;-2.2365242330125e-05;-0.00011660169548122;8.7240907305386e-05;-0.00093119742814451;-8.5045823652763e-05;0.00015334013733082;-0.00011774680024246;0.00025074710720219;0.00030105965561233;-0.00029034385806881;0.00046576402382925;-8.2166872743983e-05;-0.00011586526670726;-0.00011151452781633;0.00048395138583146;4.642204294214e-05;0.0015971945831552;-2.2327254555421e-05;0.00031999114435166;-2.0938778106938e-05;-4.0627481212141e-05;4.1428887925576e-05;-7.5766845839098e-05;-0.00021834640938323;0.00011054852802772;0.00044932434684597;-0.00026253081159666;0.00014843081589788;-0.0022564614191651;-0.00021218846086413;0.00065007945522666;0.0001665124000283;0.00025279886904173;0.00010101787484018;-0.00022761619766243;4.3557804019656e-05;-0.00073104078182951;-5.4866148275323e-05;-0.0010676168603823;0.00061786727746949;0.00067864911397919;-2.1392439521151e-05;-0.00079891859786585;0.0018990782555193;-0.00031960438354872;-0.00033759805955924;-0.00010359968291596;0.001413858961314;-6.8370747612789e-05;-0.0001528423599666;-1.9237557353335e-05;0.00035484519321471;5.6337019486818e-05;-4.0923256165115e-05;-5.7318102335557e-05;-7.964748510858e-05;-0.00066248839721084;-0.00014705465582665;-2.4171744371415e-05;0.002049871487543;0.00031908569508232;-0.0003894436522387;-0.00013066439714748;0.00026147518656217;-1.0490317436052e-05;-7.5469382863957e-05;-0.00015444894961547;-0.0011780444765463;-1.9665883883135e-05;-0.00021077328710817;-0.0011881303507835;0.00011981165152974;0.00022220493701752;0.0011297485325485;-0.00065160181839019;0.00031122451764531;-0.00015532816178165;9.2765403678641e-05;0.0002412556350464;1.3595943073597e-06;-0.00026929896557704;3.8872200093465e-05;0.00060095149092376;-5.8875853028439e-06;-1.5647416148568e-05;0.00017964355356526;-6.112673872849e-05;0.00018767567235045;-0.0011169387726113;-4.9217913328903e-05;-0.0007902976940386;7.4208037403878e-05;-0.00010278896661475;6.4951808553815e-07;-9.3339331215248e-05;8.0973317380995e-05;-0.00076339382212609;-2.1251647922327e-05;-5.8836972129939e-06;-0.00012965156929567;0.00010780959564727;0.00036232141428627;-0.00021757709328085;0.00048088814946823;-0.00023518387752119;0.00017404032405466;-0.00015059940051287;0.00040912887197919;-8.7270309450105e-06;0.0015200475463644;-1.7037331417669e-05;0.00024233179283328;-2.9042959795333e-05;-6.1248874771991e-06;2.7364469133317e-05;-5.0795104471035e-05;-0.00014784952509217;8.7930427980609e-05;0.00030171850812621;1.733259523462e-05;9.4186900241766e-05;-0.0014506165171042;-0.00019725025049411;0.00050775689305738;0.00010401104373159;0.0001968975411728;5.0553328037495e-05;-5.3313851822168e-05;6.3522165874019e-05;-0.00060908141313121;-1.5672383597121e-05;-0.0006018546409905;0.00046227264101617;0.00041915138717741;-0.00010443828796269;-0.00054890278261155;0.0010743431048468;-0.00019416550640017;-0.00031725622829981;-7.866646774346e-05;0.00089320546248928;-3.4795939427568e-05;-0.00015346043801401;-1.9283723304397e-05;0.00027715650503524;4.5011420297669e-05;-4.5197819417808e-05;-3.5776000004262e-05;-4.9153190047946e-05;-0.00043589994311333;-0.00011394982720958;2.1437604118546e-06;0.0012841267744079;0.00016804980987217;-0.00017567651229911;-9.8854492534883e-05;0.00021174612629693;2.2652088773611e-06;-0.00017006108828355;-7.5707954238169e-05;-0.0009224399109371;2.152618776563e-07;-9.9977049103472e-05;-0.00078375969314948;4.979836739949e-05;0.00013377144932747;0.00075440964428708;-0.00047171310870908;0.00021876403479837;-0.00012632687867153;3.1660372769693e-05;0.00040503323543817;2.2248559616855e-06;-0.00016642226546537;1.4683262634207e-05;0.00044701213482767;3.8064008549554e-05;-5.4888855629542e-06;0.00010308439232176;-0.000170023587998;0.0015238088089973;-0.00019434995192569;0.00080886471550912;1.117520241678e-06;-8.6859385191929e-05;5.1160917792004e-05;3.9101400034269e-05;2.456998481648e-05;0.0010273262159899;-8.4630504716188e-05;0.000492011255119;-6.1477832787205e-05;0.00011628657375695;-0.00017568019393366;-0.00033818819792941;-0.00061135768191889;0.00028346420731395;-0.00013160388334654;0.00022854999406263;-0.00052171165589243;9.9949960713275e-05;-0.0021771034225821;8.1682876043487e-05;-0.00021264153474476;6.2985700424179e-06;-0.00021476598340087;6.054123150534e-05;-6.0058609960834e-05;2.1222689611022e-05;0.00013655236398336;-0.00018404464935884;0.0008319333428517;0.00023693269758951;-0.0012411412317306;6.1051432567183e-05;0.00040514225838706;-0.00019824173068628;0.00021718125208281;8.7631327915005e-05;8.2189078966621e-05;-8.7045436885091e-06;-0.00033737203921191;6.3147257606033e-05;0.00011822836677311;-0.00022614661429543;0.00061659357743338;-0.00055118388263509;0.00033383729169145;0.00044285575859249;-0.00059268495533615;-0.00053124211262912;-9.9822966149077e-05;0.00041605025762692;-3.380783891771e-05;-0.00013503062655218;-2.1494412067113e-05;0.00015185389202088;-1.4267612868935e-06;-9.8680866358336e-05;5.8899546274915e-05;8.1371399573982e-05;-0.00014998685219325;0.00040655100019649;-0.00039580659358762;0.00088561599841341;3.4944394428749e-05;-9.7841751994565e-05;0.00013627980661113;0.00035137363011017;-4.5558801502921e-05;-0.00010800166637637;1.4654065125796e-05;-0.00076372420880944;-7.5817028118763e-05;8.5895953816362e-05;-0.00028664077399299;-0.00070785090792924;-0.00022427388466895;0.00025149786961265;-0.00019165402045473;0.00065950321732089;-0.00048251924454235;0.0001705353934085;0.00026585138402879;2.22495818889e-05;-0.00019081016944256;-1.786320899555e-05;0.00039612295222469;1.5683874153183e-05;5.5786524171708e-05;-1.3847414265911e-05;8.9964822109323e-05;-0.00015844705922063;0.0012073195539415;-5.1225320930826e-05;0.00047656148672104;3.0054206945351e-05;8.2198406744283e-05;-5.2127743401797e-05;1.5808405805728e-05;4.5655338908546e-05;0.0010275540407747;-8.1425227108411e-05;0.00034729595063254;-9.9706676337519e-06;7.2679395088926e-05;-0.00025946425739676;-0.00018097872089129;-0.00046392239164561;0.00029068932053633;0.00015354379138444;1.9780343791354e-05;-0.0004615425132215;4.0115464798873e-05;-0.0018967002397403;3.8374531868612e-05;-0.00023369396512862;7.9653946158942e-06;-0.00018965131312143;5.1649891247507e-05;-8.67907947395e-05;3.3435921068303e-05;0.00016528024571016;-0.00020558494725265;0.00052097364095971;0.0003162338398397;-0.0017016519559547;0.00010972953168675;0.00046261787065305;-0.0001989133306779;0.00026564206928015;0.00011082170385635;-9.2095680884086e-05;2.6643485398381e-05;-0.0003637504123617;4.7860416088952e-05;6.7848872276954e-05;-0.00049660570221022;0.00067249580752105;-0.00041819084435701;0.00045748639968224;0.00095502589829266;-0.00072744663339108;-0.00054608815116808;-0.00016096982290037;0.00081624393351376;-5.7362402003491e-05;-0.00010422356717754;-4.0405364416074e-05;0.00017460815433878;-2.8682084121101e-06;-7.8561701229773e-05;5.8626301324693e-05;5.3624811698683e-05;-0.00016622409748379;0.00026942486874759;-0.00048837467329577;0.0011993343941867;3.8162237615325e-05;-0.0002190430968767;0.00023200949362945;0.00033341490780003;-4.528775025392e-05;3.657166598714e-05;1.8014265151578e-05;-0.00076939619611949;-0.00013198659871705;5.0423514039721e-05;-0.00049389369087294;-0.00096108950674534;-0.00010551057494013;0.00034633325412869;-1.8407929019304e-05;0.00083747541066259;-0.00043912822729908;0.00018642203940544;2.6380665076431e-05;5.1789829740301e-05;-0.00024799496168271;-2.4049668354564e-05;0.00041913229506463;3.1808773201192e-05;-6.0112975006632e-06;1.1625118531811e-05;-3.4378303098492e-05;5.326590326149e-05;0.00031391502125189;-0.00042032293276861;0.00018913453095593;-0.00015635158342775;-0.00030856564990245;0.00030361008248292;0.00013858024613;-0.00011177358101122;1.2853457519668e-05;4.0549890400143e-05;8.3202197856735e-05;-9.7808602731675e-05;-4.347773938207e-05;-0.00013382291945163;-6.1715196352452e-05;0.00036967487540096;-0.0002242863556603;-0.0011498425155878;0.0013364246115088;-0.00027643539942801;0.00021401370759122;6.7828783357982e-05;-8.9589484559838e-05;-2.9689952498302e-05;1.2061137795172e-06;-4.2018215026474e-05;5.0205217121402e-05;3.3250380511163e-05;1.7762045899872e-05;2.5708170142025e-05;7.2993891080841e-05;-0.00029090352472849;-0.00027118666912429;0.00021449117048178;0.00015155636356212;-9.8454847829998e-06;-6.5493783040438e-05;-0.00010882858623518;-0.00011610164801823;-3.6868255847367e-05;-5.4044532589614e-05;0.00012230535503477;0.0001808712258935;-0.00018158757302444;-8.8231310655829e-05;-0.0013935094466433;0.00012711646559183;1.4702979569847e-05;0.0007254189113155;0.00085318053606898;0.00018517865100875;0.00015952560352162;-0.00017862689855974;-0.0001702819718048;5.3326006309362e-05;8.5706582467537e-05;-1.6908978068386e-05;-4.0675604395801e-05;2.1511723389267e-05;1.5991938198567e-05;-2.2893958885106e-05;-9.7339807325625e-06;-0.00050392292905599;-0.00049810664495453;-0.00058715883642435;-0.000602685904596;-9.5232542662416e-05;-0.00016986903210636;-0.00010108610149473;-0.000100711149571;-0.00011480780813145;-9.6221985586453e-05;0.00015121077012736;0.00022263384016696;-1.5198324945231e-05;-0.00034049843088724;0.00069933146005496;0.00011572286166484;6.4881409343798e-05;0.00056317646522075;0.00064251985168085;0.00020016646885779;0.0002105874591507;0.0002079150872305;0.00014116571401246;7.1015529101714e-05;7.3690243880264e-05;-5.8809342590393e-05;-8.4583829448093e-05;-6.7733803916781e-06;1.6739193597459e-05;-5.7035649660975e-05;7.0624271756969e-05;0.00044446098036133;-0.00057429290609434;0.00027902578585781;-0.00013147195568308;-0.00048941368004307;0.0004726292390842;0.00019323409651406;-0.00015231779252645;2.1808238670928e-05;8.1981939729303e-05;0.00015697328490205;-0.00017714219575282;-5.8302452089265e-05;-0.0002324696542928;-0.00016668110038154;0.0005318263429217;-0.00030838549719192;-0.0015407796017826;0.0018549553351477;-0.00038806931115687;0.00029170443303883;6.094467244111e-05;-0.00015587877715006;-3.8304595364025e-05;-1.2565872566483e-05;-7.1413080149796e-05;8.4389706898946e-05;5.1573173550423e-05;2.6498793886276e-05;1.1329931112414e-05;8.2104481407441e-05;-0.00049661711091176;-0.00044106977293268;0.00032633289811201;0.00018215223099105;-9.8048922154703e-06;-0.00012565978977364;-0.00016887480160221;-0.0001753374672262;-6.7410612246022e-05;-0.00010295210813638;0.00017031455354299;0.00029445678228512;-0.0002482438867446;-0.00027402257546782;-0.0020458933431655;0.00023286088253371;5.7980174460681e-05;0.0011307434178889;0.0013632089830935;0.00031842081807554;0.00026883347891271;-0.00025269147590734;-0.00024529831716791;7.7591932495125e-05;0.00013191562902648;-1.4507888408843e-05;-5.793415766675e-05;2.5411582100787e-05;2.562700319686e-05;-3.8134141504997e-05;-1.5193447325146e-05;-0.00058774184435606;-0.00068696570815518;-0.0008018723456189;-0.00085534242680296;-0.0001474576711189;-0.00028431610553525;-0.00011712560080923;-0.00014477234799415;-0.00016419155872427;-0.00013581092935055;0.00021588912932202;0.00033877216628753;-2.1483509044629e-05;-0.0004535642801784;0.0011340285418555;0.00016926015086938;8.556430839235e-05;0.00058174895821139;0.00088409701129422;0.00023111679183785;0.00029823437216692;0.00028121794457547;0.00017810441204347;9.5123832579702e-05;0.00010618253872963;-7.4280425906181e-05;-0.00012212641013321;-5.0361222747597e-06;1.7468342775828e-05;-6.5797961724456e-05;5.8243622333976e-05;0.00044012159924023;-0.00055969209643081;0.00033096040715463;-7.7036813308951e-05;-0.00048012242768891;0.00045430564205162;0.00018953248218168;-0.00014636138803326;3.8386806409108e-05;9.4959017587826e-05;0.00015186598466244;-0.00017008825670928;-5.2684321417473e-05;-0.00029820381314494;-0.0002660796744749;0.000534808030352;-0.00028216841747053;-0.0014631213853136;0.0018665851093829;-0.00038005778333172;0.00028285285225138;2.1951791495667e-05;-0.00018741794337984;-4.3913481931668e-05;-1.8320961316931e-05;-6.863426824566e-05;8.2695405581035e-05;5.1622486353153e-05;2.3796195819159e-05;1.4497975826089e-05;8.0698569945525e-05;-0.00048237357987091;-0.00041168139432557;0.00035390895209275;0.00014183709572535;4.4075973164581e-06;-0.00013842583575752;-0.00016434761346318;-0.00016806661733426;-5.5250762670767e-05;-0.00011049376917072;0.00014616730913986;0.00030842746491544;-0.00024229321570601;-0.0002464507415425;-0.0019813366234303;0.00022337993141264;4.7947960410966e-05;0.0010554678738117;0.0013386629289016;0.0003070144157391;0.00025575305335224;-0.00025120991631411;-0.00023505331773777;6.9708847149741e-05;0.00013420161849353;-8.8134165707743e-06;-6.1703452956863e-05;2.0323090211605e-05;2.9189619453973e-05;-3.9564361941302e-05;-1.0204274076386e-05;-0.00050792907131836;-0.00074470246909186;-0.00074850214878097;-0.00086700415704399;-0.00013021657650825;-0.00028717567329295;-9.746101568453e-05;-0.00015808535681572;-0.00015539885498583;-0.00013385032070801;0.00019774203246925;0.00034096025046892;-2.0350740669528e-05;-0.00044165446888655;0.0010914653539658;0.0001712198718451;7.2442730015609e-05;0.00044957440695725;0.001002439763397;0.00019250973127782;0.00032327507506125;0.00027084213797934;0.00017691435641609;8.6883926996961e-05;0.00010903752263403;-6.6424057877157e-05;-0.00012629639240913;-6.891875727888e-06;1.5017473742773e-05;-4.4611115299631e-05;2.46400359174e-05;0.00034741821582429;-0.00042462386772968;0.00030070438515395;-0.00013067219697405;-0.00023122887068894;0.00021712793386541;0.0001406461087754;-0.00010398290760349;5.0361264584353e-05;4.5097855036147e-05;3.3503842132632e-05;-4.6369001211133e-05;-3.1589301215718e-05;-0.00025836561690085;-0.00020969173056073;0.00035210480564274;-0.00015367826563306;-0.0010621745605022;0.0014069080352783;-0.00028064617072232;0.00020777941972483;1.2697684041996e-06;-0.00012180768680992;-4.7638604883105e-05;1.5468746141778e-06;-2.211124956375e-05;3.1957013561623e-05;2.9910928788013e-05;9.6507565103821e-06;5.4968575568637e-05;8.455385977868e-05;-0.00021238024055492;-0.0001614080829313;0.00026267353678122;9.0406691015232e-05;1.4415240002563e-05;-4.4642747525359e-05;-9.1523594164755e-05;-8.6368250777014e-05;7.2788188845152e-06;-3.8528472941834e-05;6.7387598392088e-05;0.00016205120482482;-0.00016881541523617;9.357067028759e-05;-0.0011893577175215;5.3552124882117e-05;-3.3573756809346e-05;0.00048975547542796;0.00065900885965675;0.00012346722360235;8.7791566329543e-05;-0.00017303749336861;-0.00013673071225639;3.3590964449104e-05;7.6368007285055e-05;-1.4823881429038e-05;-4.9211746954825e-05;1.3771902558801e-05;2.0730674805236e-05;-2.5314080630778e-05;2.4603914425825e-06;-0.00042458722600713;-0.00065788626670837;-0.00048144778702408;-0.00066140678245574;-4.6156474127201e-05;-0.0001232078357134;-7.8195284004323e-05;-0.0001303479220951;-0.00010015098087024;-0.00010402425687062;0.00010578751243884;0.00020617886912078;-1.1090133739344e-05;-0.00034069101093337;0.00047888871631585;0.0001222557912115;4.1143230191665e-05;0.00041303248144686;0.00095955439610407;0.00016322050942108;0.00027476254035719;0.00020181406580377;0.00017886131536216;5.73893339606e-05;8.2332669990137e-05;-4.582195833791e-05;-9.185638919007e-05;-1.5850656609473e-06;-3.4468950616429e-05;0.00024657775065862;-6.5961226937361e-05;0.00025206385180354;-0.0014814579626545;-5.780741412309e-05;-0.0010776810813695;2.6567146051093e-05;-1.8489270587452e-05;-1.5705663827248e-05;-6.5411193645559e-05;0.00010644757276168;-0.0010286881588399;1.755613629939e-05;-0.00023831907310523;-0.00016550667351112;0.00023166810569819;0.00051339255878702;-0.00033686612732708;0.000626360764727;-0.00030990329105407;9.9703240266535e-05;-0.00018010837084148;0.00046228070277721;-4.1421553760301e-05;0.0022494834847748;-1.3185960597184e-05;0.0002712664718274;-5.4981843277346e-05;8.4181177953724e-05;3.2569627364865e-05;-6.7673085140996e-05;-0.00022502994397655;0.0001524614635855;0.00038443892844953;0.00048334000166506;0.00010923871013802;-0.0019234135979787;-0.00027813532506116;0.00066885759588331;0.00014316072338261;0.00024845910957083;4.1531344322721e-05;4.6965538786026e-05;9.0391040430404e-05;-0.00063603394664824;4.4475051254267e-05;-0.00064964959165081;0.00070513074751943;0.00054814107716084;-0.0003954527201131;-0.00076645385706797;0.0011907489970326;-0.00023373526346404;-0.00053269474301487;-8.5546176705975e-05;0.00088305695680901;-4.1642899304861e-05;-0.00018145242938772;-1.9387016436667e-05;0.00026333375717513;7.2875132900663e-05;-8.2382597611286e-05;-0.00013837953156326;-2.2429669115809e-05;-0.00059086596593261;3.1443538318854e-05;4.3227682908764e-05;0.0015071185771376;0.00021305069094524;-0.00019396096467972;-0.00010663656576071;0.000325484899804;1.5153274944169e-05;-0.00022847198124509;-0.00010931655560853;-0.0011654465924948;4.3752894271165e-05;-0.00032900163205341;-0.0010652163764462;0.00023933053307701;2.4720065994188e-05;0.00097833410836756;-0.00036851002369076;0.00028608474531211;-0.00027967698406428;3.1329302146332e-05;0.00050752278184518;-1.413440440956e-05;-0.00021780948736705;2.4236102035502e-05;0.00056857493473217;-4.6281957111205e-06;-2.7101119485451e-05;0.0002409023582004;-7.1558861236554e-05;0.00032830348936841;-0.0015790791949257;-2.82629243884e-05;-0.0012040786677971;-4.5647218939848e-05;0.00010708242916735;-4.4612911551667e-06;-6.5634449128993e-05;0.00010816040594364;-0.00098877225536853;5.4234002163867e-05;-0.00033546672784723;-0.00017898455553222;0.00015579411410727;0.00054508360335603;-0.00031830981606618;0.00067827705061063;-0.00039972818922251;0.00028610849403776;-0.00020789897826035;0.00047242408618331;-7.81852286309e-05;0.0022800671868026;-1.0825319805008e-05;0.00024517875863239;-6.1447841289919e-05;0.00010845489305211;2.5625186026446e-05;-5.5097953008953e-05;-0.00019886122026946;0.00013912086433265;0.00031277659581974;0.00060220621526241;8.2580460002646e-05;-0.0015497206477448;-0.0002657663426362;0.00059491803403944;0.0001170860050479;0.00021972188551445;1.8180575352744e-05;0.00012234615860507;9.6118652436417e-05;-0.00056821579346433;6.6320761106908e-05;-0.00045070817577653;0.00062797765713185;0.00043939307215624;-0.00043480977183208;-0.00064660701900721;0.00082877982640639;-0.00017589387425687;-0.00051304866792634;-7.0959060394671e-05;0.00063704611966386;-2.7687752663041e-05;-0.00018082684255205;-1.8209424524684e-05;0.00022621442622039;6.7400302214082e-05;-8.6971827840898e-05;-0.00011703169002431;-9.8134960353491e-06;-0.00049001903971657;8.5824540292379e-05;4.1624352888903e-05;0.0012068242067471;0.00014326145173982;-0.0001043363372446;-9.8035961855203e-05;0.00031632455647923;1.6287807738991e-05;-0.00027433509239927;-6.8993220338598e-05;-0.0010716749820858;5.8811718190555e-05;-0.00020792288705707;-0.00085762428352609;0.00016842008335516;-2.8820961233578e-05;0.00081037142081186;-0.00039730488788337;0.0002509695768822;-0.00028015478164889;7.9985566117102e-06;0.00057925813598558;-1.0024115908891e-05;-0.000182437710464;1.1141541108373e-05;0.00052098301239312;2.630274866533e-05;9.2503887572093e-07;8.6503168859053e-05;-0.00014619472494815;0.0014730952680111;-0.00026488752337173;0.00096371700055897;-1.772243740561e-05;-0.00029979419196025;0.00018972808902618;1.0692060641304e-05;1.4037643268239e-05;0.00089141522767022;-6.304730050033e-05;0.00075333233689889;-0.00013386993668973;8.7072810856625e-05;-0.00023747552768327;-0.00046868066419847;-0.00053790537640452;0.00029139363323338;-0.00010988642316079;0.00035426489193924;-0.00041714770486578;0.00010217812086921;-0.002326607471332;0.00011882402031915;-0.00011943106801482;-4.1129942474072e-06;-0.00028685491997749;7.013635331532e-05;-1.1128448022646e-05;-3.4580341434776e-06;9.4837771030143e-05;-0.00017659620789345;0.0016215471550822;0.00010176502109971;-0.00060631253290921;-3.2142703275895e-05;0.00022720897686668;-0.0001400334876962;8.2467209722381e-05;6.7590503022075e-05;0.00036132740206085;-6.8162415118422e-05;-2.3055101337377e-05;4.7946221457096e-05;0.00024566703359596;0.00021838724205736;0.00058954302221537;-0.00094151811208576;0.00017771299462765;-0.00038091139867902;-0.0004201619012747;-0.00049023720202968;-9.9126691566198e-06;-0.00046873409883119;3.8247850170592e-05;-0.00011223483306821;-5.4065060339781e-07;-2.7622847937891e-06;1.3653622772836e-05;-0.00014335721789394;6.7389366449788e-05;0.00019182641699445;-0.00022261340927798;0.0010523064993322;-0.0003174023295287;0.00045593341928907;3.403110531508e-05;2.0060131191713e-06;5.0045018724632e-05;0.00042383690015413;-2.0083432900719e-05;-0.00016059541667346;9.3688761637623e-08;-0.0005838563083671;-3.7894205888733e-05;0.00019676660303958;-0.00013045914238319;-0.00038492833846249;-0.00065756723051891;0.00029370651463978;-0.00035057557397522;0.0004193285421934;-0.00076001056004316;0.00015969783999026;0.00024730269797146;1.5838395484025e-05;-0.00013245904119685;-2.3239328584168e-05;0.00030253393924795;1.2398583749018e-05;-1.238046297658e-05;1.6313259038725e-05;-1.4995544916019e-05;3.3396332582925e-05;0.0004206043377053;-0.00055042403982952;0.00034139264607802;-0.00035780132748187;-0.0002312194701517;0.00023140742268879;0.00016178673831746;-0.00013255678641144;4.5292334107216e-05;-3.1959018542693e-06;-4.3962058953184e-06;-5.4837346397107e-06;-4.0561983041698e-05;-0.00015147076919675;-5.5121650802903e-05;0.00034027177025564;-0.00019033339049201;-0.0014491663314402;0.0016833581030369;-0.00033017405075952;0.00027111265808344;5.7370372815058e-05;-5.4117681429489e-05;-5.4948850447545e-05;2.979245800816e-05;-1.2418284313753e-05;1.8668073607842e-05;2.7193020287086e-05;1.1987001016678e-05;9.433177910978e-05;0.00012982726912014;-8.2853031926788e-05;-8.6513471615035e-05;0.00028256254154257;0.00022561868536286;-3.6404892398423e-06;-3.3526845072629e-05;-7.5844116508961e-05;-8.7743275798857e-05;2.0118281099712e-05;-7.4702534220705e-06;9.3258073320612e-05;0.00013082422083244;-0.00021662905055564;0.00039546360494569;-0.0012264336692169;-7.6286569310469e-06;-0.00010027924145106;0.00033583262120374;0.00043459949665703;4.9441016017227e-05;4.6822733565932e-05;-0.00020913322805427;-0.00017751495761331;3.685318006319e-05;7.1160728111863e-05;-2.5626895876485e-05;-4.5057051465847e-05;2.5345465473947e-05;1.4268991435529e-05;6.5760705183493e-06;2.3162425350165e-05;-0.00070101855089888;-0.00066116079688072;-0.00063225202029571;-0.00067334767663851;-3.8705955375917e-05;-8.9955763542093e-05;-0.0001468712289352;-0.00013245451555122;-0.00011255542631261;-0.00010214385110885;0.00013388908701017;0.00019749603234231;-8.232342224801e-06;-0.00023330967815127;0.00038891067379154;4.8068541218527e-05;-1.0879452020163e-05;0.0008227332145907;0.00088385760318488;0.00027995233540423;0.00026714717387222;0.0002559335262049;0.00020579343254212;8.3499755419325e-05;8.5734711319674e-05;-7.8238575952128e-05;-0.00010124319669558;-1.1570387869142e-05;1.9799603251158e-05;-2.748153747234e-05;3.5985282011097e-05;0.00054291117703542;-0.00070475006941706;0.00049011566443369;-0.00041235389653593;-0.00036345183616504;0.00035715979174711;0.00021630340779666;-0.00016886641969904;7.633984205313e-05;1.8364777133684e-05;2.0191811927361e-05;-3.4790893550962e-05;-5.6023218348855e-05;-0.00028582065715455;-0.00017022826068569;0.0004955125041306;-0.00024633307475597;-0.0018870736239478;0.002299852669239;-0.00044686149340123;0.0003482524480205;4.9446261982666e-05;-0.00011504376743687;-7.6161108154338e-05;2.6989544494427e-05;-3.0106770282146e-05;3.9692200516583e-05;4.1548835724825e-05;1.6892561689019e-05;0.0001169088500319;0.00016447016969323;-0.00015386723680422;-0.00012027037155349;0.00041426418465562;0.00027952381060459;-1.4722782907484e-05;-8.3197126514278e-05;-0.00011324841761962;-0.00012309108569752;8.8595625129528e-06;-3.7917368899798e-05;0.00012978227459826;0.00022013190027792;-0.00030617043375969;0.0004757548449561;-0.0016865802463144;2.8998381822021e-05;-0.00010301759903086;0.00047775989514776;0.00064396642846987;0.00010332327656215;8.0051409895532e-05;-0.00028932571876794;-0.00024902215227485;5.383356983657e-05;0.00010973001189996;-2.3597838662681e-05;-6.1771534092259e-05;3.0169894671417e-05;2.384526305832e-05;1.2975360732526e-05;3.9497565012425e-05;-0.00080920488107949;-0.00092144287191331;-0.00079547544009984;-0.00093731080414727;-6.7570515966509e-05;-0.00015607106615789;-0.00017263733025175;-0.00018992144032381;-0.00012993889686186;-0.00012674671597779;0.00018214517331216;0.00029572413768619;-1.7291404219577e-05;-0.0002577398554422;0.00061955390265211;5.4190437367652e-05;-3.6885430745315e-05;0.0008902556146495;0.0012628488475457;0.00030712760053575;0.00036808251752518;0.00030782024259679;0.00025636327336542;0.00010231304622721;0.00011948999599554;-0.00010329417273169;-0.0001508719578851;-9.6718922577566e-06;2.0309582396294e-05;-3.9275771996472e-05;2.3615677491762e-05;0.00054614950204268;-0.000685878272634;0.00053490459686145;-0.0003613568842411;-0.00035764806671068;0.00034505865187384;0.00021735159680247;-0.00016114322352223;9.4606293714605e-05;3.4933094866574e-05;1.6946280084085e-05;-3.0950737709645e-05;-5.2703977416968e-05;-0.00037829676875845;-0.0002691890404094;0.00051477149827406;-0.00021825896692462;-0.0018137019360438;0.0023339483886957;-0.0004488346457947;0.00033473354415037;1.280955166294e-05;-0.00015018353587948;-8.3004466432612e-05;1.9431145119597e-05;-2.8809508876293e-05;3.9338450733339e-05;4.2635416320991e-05;1.4163457308314e-05;0.00012252767919563;0.0001611236075405;-0.00015794736100361;-8.9590517745819e-05;0.00043974979780614;0.00024069995561149;-7.8271668826346e-06;-8.8982931629289e-05;-0.00011519216059241;-0.00011470352183096;1.6020894690882e-05;-4.4271662773099e-05;0.00011280519538559;0.00023358578619082;-0.00030330495792441;0.00049359747208655;-0.0016480552731082;1.6511679859832e-05;-0.0001031571009662;0.00043846588232554;0.00062538863858208;0.00010472966823727;6.4369167375844e-05;-0.00028882335755043;-0.00024077853595372;4.9430553190177e-05;0.00011211213859497;-1.9061420971411e-05;-6.622097134823e-05;2.5115521566477e-05;2.8096825190005e-05;9.4427869044011e-06;4.3263120460324e-05;-0.00071710912743583;-0.0010042531648651;-0.00072966545121744;-0.00098524696659297;-5.9966474509565e-05;-0.000155093614012;-0.00015086332859937;-0.0002065675216727;-0.00011903135600733;-0.00013006156950723;0.00016545176913496;0.00030454230727628;-1.6854379282449e-05;-0.00026256169076078;0.00059226824669167;6.2093553424347e-05;-4.4559528760146e-05;0.00073152373079211;0.0014328135875985;0.00026409089332446;0.00040131062269211;0.00029027747223154;0.00026625968166627;9.2369213234633e-05;0.00012563441123348;-9.413440420758e-05;-0.00015858508413658;-9.5176692411769e-06;1.7739304894349e-05;-3.6735014873557e-05;8.3530885603977e-06;0.00043413130333647;-0.00052180275088176;0.0004298230051063;-0.00027576345019042;-0.00020710652461275;0.00019800892914645;0.00016609353770036;-0.0001181109182653;8.1844307715073e-05;2.506485725462e-05;-1.9851384422509e-05;8.747623724048e-06;-3.4507549571572e-05;-0.00033361275563948;-0.0002391122689005;0.00037498088204302;-0.00013044980005361;-0.0013184089912102;0.0017627442721277;-0.00033851232728921;0.00024674728047103;-1.0697084690037e-05;-0.00011590880603762;-6.9876376073807e-05;1.7266920622205e-05;-6.6590937422006e-06;1.5087418432813e-05;2.8733227736666e-05;6.0025172388123e-06;0.00010982115782099;0.0001266683684662;-8.0930716649164e-05;-1.5626506865374e-05;0.00033206027001143;0.00015218190674204;6.7928440330434e-06;-3.2673120585969e-05;-7.8318007581402e-05;-6.7937457060907e-05;3.7919508031337e-05;-1.321656145592e-05;5.9692662034649e-05;0.00014680530875921;-0.00021112174727023;0.00045672905980609;-0.0011366186663508;-4.2794981709449e-05;-0.00010683046275517;0.00024145400675479;0.00036927199107595;4.5111937652109e-05;5.8026844271808e-06;-0.00020846337429248;-0.00015800063556526;2.7586698706727e-05;7.2839087806642e-05;-1.8750433810055e-05;-5.4190550144995e-05;1.5907035049167e-05;2.2149146388983e-05;-4.2724187210297e-07;3.1194977054838e-05;-0.00053405022481456;-0.00083620008081198;-0.00050116231432185;-0.0007786939968355;-2.2048649043427e-05;-7.6100353908259e-05;-0.00010699866106734;-0.00016634780331515;-9.0835492301267e-05;-0.00011241549509577;9.9563025287353e-05;0.00021048709459137;-6.8629224188044e-06;-0.00024782208492979;0.00030816125217825;6.4207342802547e-05;-2.5923623979907e-05;0.00053136399947107;0.0012389114126563;0.00020225708431099;0.00033700632047839;0.00022281522979029;0.00023565186711494;6.4202744397335e-05;9.8847551271319e-05;-6.0946549638174e-05;-0.00011589067435125;-3.487277581371e-06;-2.9681748856092e-05;0.000231251004152;-3.6290250136517e-05;0.00033942726440728;-0.001508857589215;-3.1398034479935e-05;-0.0012839476112276;-0.00011322370846756;0.00021298584761098;-7.3582414188422e-06;-3.1003386538941e-05;9.5160110504366e-05;-0.00089848617790267;9.3026988906786e-05;-0.00048941106069833;-0.00016859637980815;0.00022696613450535;0.0006253284518607;-0.00032691328669898;0.00061506364727393;-0.00043799396371469;0.0001848770189099;-0.00019726966274902;0.00035400324850343;-9.009447239805e-05;0.0024175301659852;-1.2705762628684e-06;0.00018690651631914;-7.0879592385609e-05;0.00014363671652973;1.163698379969e-05;-3.352211570018e-05;-0.00019785959739238;0.00013123694225214;0.00023405683168676;0.0011496300576255;2.3700265955995e-05;-0.0012321985559538;-0.0002385649131611;0.00050639233086258;0.00010729869973147;0.00017400679644197;-2.9370945412666e-05;0.00030861189588904;8.5711013525724e-05;-0.00042836499051191;0.0001427645329386;-0.00015708955470473;0.00067307997960597;0.00034810032229871;-0.00069567753234878;-0.00058519613230601;0.00029347484814934;-0.00011617490963545;-0.00056387390941381;-1.6080090063042e-05;0.00015753107436467;-1.358909321425e-05;-0.00018281135999132;-5.2474779295153e-06;0.00014838862989563;7.6282616646495e-05;-0.00011347935651429;-0.00018895232642535;3.9927967009135e-05;-0.00045211365795694;0.00038191347266547;6.2667320889886e-05;0.00090523046674207;0.00010276351531502;-3.2927884603851e-05;-7.3274211899843e-05;0.0003569393302314;1.9331773728481e-05;-0.00034988738480024;-5.7123779697577e-05;-0.00099462177604437;0.00012561325274874;-0.00025133474264294;-0.00074326479807496;0.00026472838362679;-0.00025751025532372;0.0006995847215876;-0.00030693819280714;0.00023668659559917;-0.00040799292037264;-4.5833462536393e-06;0.00064617412863299;-2.1681027646991e-05;-0.00013816090358887;1.2207912732265e-05;0.00046379506238736;-5.9600879467325e-06;-2.7206708182348e-05;0.00024740080698393;-5.3378211305244e-05;0.00040922904736362;-0.0016885926015675;-7.9588153312216e-06;-0.001419666223228;-0.00018011085921898;0.00032890547299758;-5.5771138249838e-06;-2.8979848138988e-05;0.00010293203376932;-0.00095707294531167;0.00013176302309148;-0.00063278549350798;-0.00018182001076639;0.00021689030108973;0.00066742952913046;-0.00035990623291582;0.00069599557900801;-0.00051179359434173;0.00029260170413181;-0.00021993093832862;0.00040225448901765;-0.00012964790221304;0.0026218600105494;1.8083376289724e-06;0.00017939254757948;-8.2607744843699e-05;0.00019453250570223;7.0990863605402e-06;-2.7962603780907e-05;-0.00020758435130119;0.00013578300422523;0.00020135346858297;0.0013467012904584;7.251534043462e-06;-0.0010966743575409;-0.00023709615925327;0.00047314169933088;0.00010371000826126;0.00015849765622988;-4.6858982386766e-05;0.00037161054206081;8.7937536591198e-05;-0.00033786619314924;0.00018082467431668;-4.8058809625218e-05;0.00067528791259974;0.00031827198108658;-0.00080682191764936;-0.00055449653882533;9.8767035524361e-05;-8.7476189946756e-05;-0.00058761675609276;-2.0393636077642e-06;-3.9603470213478e-05;-8.7725284174667e-06;-0.00017770015983842;-1.8393642449155e-06;0.0001022301876219;7.9579025623389e-05;-0.00012854422675446;-0.00019934626470786;6.1148180975579e-05;-0.00042986666085199;0.00052519963355735;5.8936879213434e-05;0.00080048729432747;7.2122711571865e-05;4.9614200179349e-06;-7.109379657777e-05;0.00039120207657106;1.782658182492e-05;-0.00037173979217187;-3.9331844163826e-05;-0.0009787903400138;0.00015569159586448;-0.00018008991901297;-0.00065308081684634;0.00024894950911403;-0.00035373598802835;0.00064367859158665;-0.00038296403363347;0.00023599725682288;-0.00047338492004201;-1.1132601684949e-05;0.00066135998349637;-2.1104529878357e-05;-0.00014054433268029;5.958959718555e-06;0.00047165044816211;-4.887458999292e-06;1.7517495507491e-05;0.00010650583863026;-0.00012000923015876;0.0014306382508948;-0.00031508030951954;0.0010750296059996;-2.6409434212837e-05;-0.00046904070768505;0.00030427274759859;4.7847333917161e-05;-1.7738723556704e-07;0.00079042947618291;-3.6622754123528e-05;0.00097631063545123;-0.00019425712525845;1.8492393792258e-05;-0.00037279754178599;-0.00059107673587278;-0.00041294042603113;0.00033113922108896;-1.1846774214064e-05;0.00045987957855687;-0.00042689414112829;9.3797279987484e-05;-0.0024794356431812;0.00014235450362321;-5.6336884881603e-05;-1.2777572919731e-05;-0.00033982351305895;7.6199416071177e-05;6.174743612064e-05;-3.7391615478555e-05;-1.9479719412629e-05;-0.00017759733600542;0.0023155598901212;-1.6487369066454e-05;-3.968928285758e-05;-0.00012968748342246;1.6115902326419e-05;-5.0017541070702e-05;-0.00012363190762699;6.4690037106629e-05;0.00056099088396877;-0.00012044191680616;0.00032728025689721;1.2077802239219e-05;0.00038787318044342;0.00059466977836564;0.00057809945428744;-0.0013040711637586;4.9404021410737e-05;-0.0010850408580154;-0.00027530587976798;-0.00024980574380606;5.7573430240154e-05;-0.001349973725155;0.00012127609807067;-6.739232048858e-05;1.1845630979224e-05;-0.00014593783998862;3.27479247062e-05;-0.00020001166558359;7.8822231444065e-05;0.00032873929012567;-0.00030965608311817;0.0020554149523377;-0.00029601986170746;0.00022393590188585;-1.3576980563812e-05;3.4959110053023e-05;-2.2838523818791e-06;0.00054837571224198;-1.6891723362278e-06;-0.00018631212878972;-3.1434261472896e-05;-0.00042463577119634;-1.1012007234967e-05;0.00035333429696038;0.00015439433627762;-4.697510303231e-05;-0.0012648896081373;0.00031772823422216;-0.00082662235945463;0.00024430631310679;-0.0011756386375055;0.00018066665506922;9.5956143923104e-05;4.2845200368902e-05;-0.00010233261127723;-2.4613995265099e-05;0.00024520204169676;1.3023785868427e-05;-1.357608834951e-05;1.6352300008293e-05;1.3868037967768e-05;9.8783368684963e-07;0.00041071636951528;-0.0005504481960088;0.00040489560342394;-0.00043659962830134;-0.00017185720207635;0.00017641145677771;0.00014569026825484;-0.00011922842531931;5.9875688748434e-05;-2.575990583864e-05;-5.4101881687529e-05;4.5925338781672e-05;-3.3849897590699e-05;-0.00015475033433177;-6.2843195337337e-05;0.00025131882284768;-0.00011068326421082;-0.0014300046022981;0.0016889441758394;-0.00030792373581789;0.00026096514193341;4.2541400034679e-05;-2.9594219085993e-05;-6.1344377172645e-05;3.9534261304652e-05;4.9121886149806e-06;-3.7390370266621e-07;2.193311775045e-05;7.8615312304464e-06;0.00011545156303328;0.00014210920198821;7.0693786256015e-05;6.1348408053163e-05;0.00030469702323899;0.00025268088211305;-1.2812370187021e-05;-2.6860387151828e-05;-4.0338301914744e-05;-5.469482857734e-05;4.376891956781e-05;1.3284609849507e-05;6.6286855144426e-05;9.2323542048689e-05;-0.00022720199194737;0.00066642742604017;-0.00091173534747213;-5.8614059526008e-05;-0.00013639539247379;-1.7011147065205e-05;5.4051783081377e-05;-4.4031032302883e-05;-3.4469303500373e-05;-0.00020241322636139;-0.00016284984303638;2.0432487872313e-05;5.4156138503458e-05;-2.0486351786531e-05;-3.7593650631607e-05;2.2116606487543e-05;1.058319958247e-05;4.5351342123467e-05;5.9189103922108e-05;-0.00065800314769149;-0.00064171437406912;-0.00053581764223054;-0.00060175388352945;-7.4902382038999e-06;-3.832946458715e-05;-0.00014903635019436;-0.0001358050503768;-8.0827987403609e-05;-8.3747225289699e-05;0.00010482966172276;0.00015717778296676;2.6385596356704e-06;6.22566731181e-05;0.00017997690883931;-7.8148834290914e-05;-0.00012915846309625;0.00074407266220078;0.00083068775711581;0.00025753295631148;0.00025473817368038;0.00022696948144585;0.00020370012498461;7.6003081630915e-05;8.1023230450228e-05;-7.9654324508738e-05;-9.9360295280349e-05;-1.4227930478228e-05;1.9788016288658e-05;3.4373653761577e-05;-2.7969670554739e-05;0.00053575314814225;-0.00071350164944306;0.00060304143698886;-0.00057717715390027;-0.00025618958170526;0.00026014857576229;0.00019211546168663;-0.00014569237828255;0.00010396158177173;-2.389048859186e-05;-7.5116542575415e-05;6.4005580497906e-05;-4.6934423153289e-05;-0.0002982469741255;-0.00016899923502933;0.00033228620304726;-9.3812232080381e-05;-0.0019114415626973;0.002371026435867;-0.00042167727951892;0.0003342502459418;3.8075224438217e-05;-7.636942609679e-05;-8.9161228970625e-05;4.5846103603253e-05;-8.4713974501938e-08;5.8207856454828e-06;3.3909200283233e-05;1.1024311788788e-05;0.00015689995780122;0.00018661230569705;0.00010668391769286;0.00014033605111763;0.00045081271673553;0.00034313020296395;-3.4402753954055e-05;-6.7155247961637e-05;-5.1611827075249e-05;-6.4078427385539e-05;4.735969559988e-05;8.3526447269833e-07;8.7852829892654e-05;0.0001496877084719;-0.00034681090619415;0.00096231803763658;-0.0011605595936999;-4.045761670568e-05;-0.00014056031068321;-0.00013293683878146;-4.7350713430205e-05;-6.2315426475834e-05;-6.9395457103383e-05;-0.00027564959600568;-0.00022530196292792;2.7067471819464e-05;8.0353987868875e-05;-1.6631835023873e-05;-4.9665170081425e-05;2.6862930099014e-05;1.7606713299756e-05;8.6547137470916e-05;0.00010554229811532;-0.0007633789209649;-0.00090858864132315;-0.00063973199576139;-0.00083824439207092;-1.7364882296533e-05;-6.0860442317789e-05;-0.00018488286877982;-0.00019838735170197;-7.2204675234389e-05;-9.5505762146786e-05;0.0001349813392153;0.00022917467867956;-2.7704827516573e-06;0.00030600040918216;0.00025452784029767;-0.00018223079678137;-0.00025466401712038;0.00077831832459196;0.001187207410112;0.00027686500106938;0.00034931756090373;0.00026061767130159;0.00026304618222639;9.0514906332828e-05;0.00011259527673246;-0.00010927368566627;-0.00015163677744567;-1.2695630175585e-05;2.0001651137136e-05;2.3350568881142e-05;-3.7988531403244e-05;0.00054784951498732;-0.00069061724934727;0.00063496746588498;-0.0005377676570788;-0.00025332719087601;0.00025278754765168;0.00019574024190661;-0.00013777460844722;0.00012052453530487;-7.9801011452219e-06;-7.5363983341958e-05;6.6770953708328e-05;-4.5290038542589e-05;-0.00038948890869506;-0.00024682813091204;0.00035486812703311;-6.9637288106605e-05;-0.0018529490334913;0.0024055200628936;-0.00043037050636485;0.00031846453202888;6.6400116338627e-06;-0.00010819340968737;-9.5335475634784e-05;3.8703208701918e-05;-2.0044957693699e-07;5.6197177400463e-06;3.5031476727454e-05;8.9173208834836e-06;0.00016436071018688;0.00018075728439726;9.2005568149034e-05;0.00016767345368862;0.0004661833809223;0.00031634204788134;-3.0589388188673e-05;-7.021680357866e-05;-5.6985991250258e-05;-5.5956897995202e-05;5.0216374802403e-05;-3.3597004858166e-06;7.7079639595468e-05;0.00016014231368899;-0.00034504910581745;0.00097138487035409;-0.0011400409275666;-5.6941149523482e-05;-0.00013168444274925;-0.00014021787501406;-6.7316417698748e-05;-5.4078220273368e-05;-8.3702892879955e-05;-0.00027348572621122;-0.00022095537860878;2.5623920009821e-05;8.1690777733456e-05;-1.3715112800128e-05;-5.3113122703508e-05;2.2661597540719e-05;2.1442841898534e-05;8.3448590885382e-05;0.00010659393592505;-0.00068344944156706;-0.00098586385138333;-0.00057888892479241;-0.00089428172213957;-1.5616726159351e-05;-5.8105688367505e-05;-0.00016695426893421;-0.00021236235625111;-6.33813906461e-05;-9.9954078905284e-05;0.00012124387285439;0.00023976710508578;-2.7716328077076e-06;0.00029279230511747;0.00023918341321405;-0.00017438219219912;-0.00025528616970405;0.0006351558258757;0.0013494632439688;0.00024172003031708;0.00037834004615434;0.00024385598953813;0.00027542974567041;8.1902355304919e-05;0.00011869973968714;-0.00010061911598314;-0.00015978309966158;-1.0723447303462e-05;1.6956995750661e-05;-7.1073309300118e-06;-1.9050630726269e-05;0.00043097473098896;-0.0005117726395838;0.00046836203546263;-0.00036344371619634;-0.00016243360005319;0.00015981994511094;0.00015268989955075;-0.00010419150930829;9.1901878477074e-05;3.7116742532817e-06;-5.8224733948009e-05;5.1910024922108e-05;-3.0686995160067e-05;-0.00033039556001313;-0.00021481211297214;0.00029412432922982;-6.1473656387534e-05;-0.0013164350530133;0.0017596471589059;-0.00032383765210398;0.00023203076852951;-1.6477873941767e-05;-8.8344830146525e-05;-7.3733201134019e-05;2.6210364012513e-05;5.9767244238174e-06;-1.1719336043825e-06;2.4041011783993e-05;3.4804152164725e-06;0.00012961054744665;0.0001329431834165;4.6964349166956e-05;0.00011750104022212;0.00033743926906027;0.00019818994041998;-7.4306112765044e-06;-2.8730801204802e-05;-4.9670445150696e-05;-3.8199417758733e-05;5.0590559112607e-05;6.6394504756317e-06;4.4905453250976e-05;0.00011019285739167;-0.00022383106988855;0.00069208577042446;-0.00086515152361244;-8.9827073679771e-05;-0.00012450580834411;-4.3699164962163e-05;1.05398503365e-05;-3.0576949939132e-05;-6.5306958276778e-05;-0.00019923690706491;-0.00015255868493114;1.6929772755248e-05;5.620371302939e-05;-1.4884088159306e-05;-4.4647676986642e-05;1.3994177606946e-05;1.7883277905639e-05;3.8929963920964e-05;6.277572538238e-05;-0.00050181039841846;-0.00079607812222093;-0.00041538832010701;-0.00071225926512852;-3.6427718441701e-06;-2.9708644433413e-05;-0.00011368724517524;-0.00016418278391939;-6.2164734117687e-05;-9.3921342340764e-05;7.7861637691967e-05;0.00017588055925444;2.9693076157855e-06;3.9218037272803e-05;0.00014230121450964;-6.2601808167528e-05;-0.00013384065823629;0.00046701161772944;0.0011505973525345;0.00018780904065352;0.00031385407783091;0.00019292438810226;0.0002309247647645;5.8759502280736e-05;9.3448827101383e-05;-6.3302461057901e-05;-0.00011455496860435;1.6175808923435e-06;-4.1779356251936e-05;0.00017437517817598;5.8893242567137e-06;0.00029152477509342;-0.0010828920640051;-3.3151674870169e-05;-0.0011382872471586;-0.00019810075173154;0.00033690061536618;-1.5420317140524e-05;4.6781377022853e-05;6.1582257330883e-05;-0.00072702195029706;0.0001402923517162;-0.00067054270766675;-8.9224988187198e-05;0.00036122751771472;0.00063773925649002;-0.00032195818494074;0.00036821624962613;-0.00040459787123837;-0.00010074541933136;-0.00013359785953071;0.00014499694225378;-9.8304401035421e-05;0.0022441716864705;1.1233193617954e-05;9.0791028924286e-05;-7.5826123065781e-05;0.00021411161287688;-5.720200988435e-06;-1.2188139407954e-05;-0.00017177818517666;0.0001228815963259;0.00013115002366249;0.0017641754820943;-5.5025706387823e-05;-0.00075989670585841;-0.00017886988644022;0.00031909282552078;8.4072198660579e-05;0.00010552891762927;-8.0485726357438e-05;0.00045832464820705;6.5727552282624e-05;-7.2687391366344e-05;0.00022989812714513;0.00025974560412578;0.00070097687421367;0.00017896955250762;-0.00097721663769335;-0.00047704571625218;-0.00043143282528035;-3.7547761166934e-05;-0.00059184053679928;5.0441947678337e-05;-0.00048265935038216;4.0172608350986e-06;-0.00013056410534773;9.1809797595488e-06;-1.922467527038e-05;8.5846899310127e-05;-0.00014544237637892;-0.00029140015249141;0.00013967674749438;-0.00038546245195903;0.0008950371411629;8.7463587988168e-05;0.00044567952863872;5.6757791753625e-05;3.1110619602259e-05;-2.9617933250847e-05;0.00040769594488665;1.9295805032016e-05;-0.00027013194630854;-5.0652502977755e-05;-0.00069046975113451;0.0002059917896986;-0.00033140217419714;-0.00054145063040778;0.00042493670480326;-0.00060443161055446;0.00049764651339501;-0.00011983675358351;0.0002020197280217;-0.00064715900225565;-7.1944045885175e-06;0.00041978663648479;-3.7177862395765e-05;-0.00011069143511122;1.6361202142434e-05;0.0003272143076174;-1.0555111657595e-05;-1.7674632545095e-05;0.00021719900541939;-3.5588331229519e-05;0.00041500822408125;-0.0015370929613709;5.2277114264143e-06;-0.0014125285670161;-0.00028374837711453;0.00049309269525111;-6.266051059356e-06;-3.6217379602022e-06;7.7226446592249e-05;-0.00079634186113253;0.00018841463315766;-0.00084629951743409;-0.00013854887220077;0.00030307951965369;0.00070141605101526;-0.00037145352689549;0.00057958764955401;-0.00053650978952646;0.00017855460464489;-0.0001887530379463;0.00029283890035003;-0.00015462553710677;0.002620522165671;1.4900811947882e-05;9.3970709713176e-05;-9.0805071522482e-05;0.00024937381385826;-1.9389499357203e-05;1.508221430413e-05;-0.00019735044043045;8.4501538367476e-05;6.9095294747967e-05;0.0019631974864751;-7.8304401540663e-05;-0.00052367383614182;-0.00015721443924122;0.00026082835393026;8.9324188593309e-05;4.4066884584026e-05;-0.00010705183376558;0.00055799860274419;5.4450472816825e-05;-5.6373642109975e-06;0.00029334038845263;0.00035765569191426;0.00065932027064264;0.00016407533257734;-0.0011072652414441;-0.00040777836693451;-0.00063728861277923;2.2441497549153e-06;-0.0005192446988076;8.0610559962224e-05;-0.00077525654342026;6.4766236391733e-06;-0.00013648570165969;1.972497375391e-05;-5.0051996367984e-05;8.4279534348752e-05;-0.00016156351193786;-0.00027655775193125;0.00013525843678508;-0.00034555757883936;0.0010787710780278;5.46730516362e-05;0.00037352120853029;8.6439094957314e-06;8.0997939221561e-05;-3.4834240068449e-05;0.00044560298556462;9.7149959401577e-06;-0.00041648888145573;-1.3540249710786e-05;-0.00076620368054137;0.00026472093304619;-8.666700887261e-05;-0.0003654214378912;0.00030792495817877;-0.00073472660733387;0.0004211547493469;-0.00044196157250553;0.0002082466671709;-0.00067110831150785;-1.2866796168964e-05;0.00059391383547336;-3.0665145459352e-05;-9.5287599833682e-05;3.813747298409e-06;0.0003822123107966;-2.3309443349717e-05;3.2063828257378e-05;0.0001577549992362;-6.3345956732519e-05;0.00033808354055509;-0.0013563120737672;4.7451547288802e-05;-0.0010650843614712;-0.000247514777584;0.00044563974370249;8.800066098047e-06;-8.0330813943874e-05;5.4254884162219e-05;-0.00041602752753533;0.00015187938697636;-0.00066389824496582;-0.00013720235438086;6.737911462551e-05;0.00042497861431912;-0.00022813373652752;0.00055674405302852;-0.00040929228998721;0.00042793483589776;-0.00015666193212382;0.00030788834556006;-0.00014019412628841;0.0018321011448279;1.3645078070113e-05;3.3044150768546e-05;-6.3298728491645e-05;0.00015096316928975;-3.6790792364627e-05;6.1973201809451e-05;-0.00013244338333607;-4.787304715137e-05;-4.6285229473142e-05;0.0013286810135469;-7.2744762292132e-05;5.9595233324217e-05;-4.4897653424414e-05;5.2752071496798e-05;5.9274436353007e-05;-0.00010022568312706;-9.447822230868e-05;0.00044050262658857;6.6857674028142e-06;8.5089021013118e-05;0.00025366112822667;0.00034107526880689;0.0002896852674894;4.982004975318e-05;-0.00076810974860564;-0.00012432488438208;-0.00063359795603901;5.1671573601197e-05;-9.3670860223938e-05;8.7938613432925e-05;-0.00086331117199734;5.7325273701281e-06;-7.3880393756554e-05;2.7784717531176e-05;-6.9288740633056e-05;3.8461064832518e-05;-9.7359603387304e-05;-0.00014443494728766;3.5617598769022e-05;-0.00010558916255832;0.00072770559927449;8.7155740402522e-06;6.8336594267748e-06;-6.3561790739186e-05;0.00013061780191492;-1.0139685400645e-05;0.00025571652804501;4.2077776924998e-06;-0.00050984282279387;4.0303391870111e-05;-0.00052775646327063;0.0002292249846505;0.00018863708828576;1.9568815332605e-05;4.8885238356888e-05;-0.00054783030645922;9.7154043032788e-05;-0.00050274271052331;9.8622127552517e-05;-0.0003019641735591;-2.9499895390472e-05;0.00066450546728447;-1.6640944522806e-05;1.8124143252862e-06;-1.3229588148533e-05;0.00027400293038227;-0.00010300429130439;5.1995473768329e-05;0.00019420911849011;-8.5193198174238e-05;0.0014202563324943;-0.00029507663566619;0.00088182737817988;-6.7773195041809e-05;-0.00046400507562794;0.00028761991416104;0.00024170493998099;-3.0793904443271e-05;0.00038979432429187;-1.4730559087184e-05;0.00079422985436395;-0.00016453271382488;6.7366145231063e-06;-0.00018450694915373;-0.00039003629353829;-0.00042746332474053;0.00023960269754753;-0.00032114493660629;0.00041173564386554;-0.00061520282179117;9.542682528263e-05;-0.0018036571564153;0.00013126473641023;-1.2316273569013e-05;-1.0124154869118e-05;-0.00020517317170743;4.8330723075196e-05;0.00016311499348376;-7.3947318014689e-05;-0.00029012409504503;-0.00011925218132092;0.0015642319340259;-0.000113612957648;0.00053521996596828;-0.00012918295396958;-0.00019924707885366;8.0579578934703e-05;-0.00043059478048235;5.8218065532856e-05;0.00040064120548777;-0.00010288801422575;0.00046400623978116;-4.7427303798031e-05;0.00038817551103421;0.00054612435633317;0.00019199325470254;-0.00095301086548716;-6.1464241298381e-05;-0.00098311481997371;3.892254881066e-06;0.00056302978191525;7.8246383054648e-05;-0.0015692979795858;0.00013596242934;2.3937585865497e-05;4.5921333367005e-06;-0.00017076104995795;4.1959912778111e-05;-0.00014241714961827;3.9234939322341e-05;0.00021466851467267;-0.00020789966220036;0.0019873448181897;-0.00010832675616257;-3.7259422242641e-05;-9.9132928880863e-05;5.9240817790851e-05;-7.2755072324071e-05;0.00036531963269226;1.051162416843e-05;-0.00041756866266951;-5.0775979616446e-05;-0.00026889922446571;5.1771061407635e-05;0.00038352850242518;0.00059443840291351;0.00041115199564956;-0.0012626493116841;4.0465325582772e-05;-0.001230385969393;-5.6039338232949e-05;-0.00080056890146807;0.00011780910426751;0.00023965757281985;4.4627064198721e-05;8.4028069977649e-06;-8.1449334174977e-06;0.00020132843928877;-6.677367764496e-06;-7.9856486991048e-05;5.3098487114767e-05;0.0002102235739585;-8.8445842266083e-05;0.001473150565289;-0.0003579632320907;0.0011107727186754;-4.280851862859e-05;-0.00057502201525494;0.00037779178819619;0.00020985484297853;-2.9383612854872e-05;0.00070155691355467;-1.0481485333003e-05;0.0010835246648639;-0.00022807362256572;-8.6460160673596e-05;-0.00049727893201634;-0.00064462557202205;-0.00028640928212553;0.00037905716453679;9.6482044682489e-06;0.00054738426115364;-0.00067729654256254;8.9709355961531e-05;-0.0024724863469601;0.00015488699136768;-3.5172921343474e-05;-1.4336745152832e-05;-0.00034689309541136;7.2334805736318e-05;0.00017051814938895;-8.2391241448931e-05;-0.00025525793898851;-0.00016075231542345;0.0024701179936528;-0.00010685109737096;0.00047702743904665;-0.0002000248641707;-0.00021734343317803;6.8420042225625e-05;-0.00044349129893817;7.4905743531417e-05;0.00056774006225169;-0.00014389673015103;0.00065056042512879;-4.0348386391997e-05;0.0004947729757987;0.00079317390918732;0.00047357319272123;-0.0014120979467407;-6.0020196542609e-05;-0.0014570269268006;-0.00011724876094377;0.00038147368468344;8.8474676886108e-05;-0.002035065786913;0.00018667969561648;1.6778445569798e-05;1.2053219506925e-05;-0.00024362531257793;4.9172555009136e-05;-0.00024371306062676;8.1275320553686e-05;0.00044651183998212;-0.00036225855001248;0.0032234927639365;-0.0002881656982936;0.00015114543202799;-0.00012295840133447;7.5555039984465e-06;-3.3695712772897e-05;0.00065482506761327;6.8406779973884e-06;-0.00021452194778249;-7.8501361713279e-05;-0.0002562266017776;1.886813697638e-05;0.00052269292064011;0.00062529498245567;0.00036903144791722;-0.0019206340657547;0.00024625335936435;-0.0016387428622693;9.2085530923214e-05;-0.0015774539206177;0.00021272922458593;-0.00014949371688999;9.798687096918e-05;-7.7405638876371e-05;-1.6019797840272e-05;0.00021261113579385;1.0591114005365e-05;-1.6456970115541e-05;1.7800219211495e-05;0.0001320553565165;-0.00012296503700782;0.00045087051694281;-0.00060949963517487;0.00059490039711818;-0.00060024386039004;-0.0001601929689059;0.00017158398986794;0.00012601958587766;-8.5886131273583e-05;0.00010836901492439;-4.6899880544515e-05;-0.00012331057223491;0.00011558105325093;-2.9456599804689e-05;-0.00026069371961057;-0.00015524169430137;2.2668216843158e-05;0.00015846168389544;-0.0016036602901295;0.0020368036348373;-0.00032883614767343;0.00025830802042037;2.3076521756593e-05;-4.1086208511842e-05;-7.6824806455988e-05;4.3262112740194e-05;1.4379083950189e-05;-1.2884844181826e-05;2.9720215025009e-05;1.0144598491024e-05;0.00011441022797953;0.00013299999409355;0.00020611450599972;0.00026988598983735;0.00040934784919955;0.00034828713978641;-5.5689622968202e-05;-6.794101500418e-05;8.3701370385825e-06;-4.8546407924732e-06;4.2335490434198e-05;9.4645965873497e-06;3.9916998503031e-05;8.0524885561317e-05;-0.00035938597284257;0.0010369418887421;-0.00054938445100561;6.9228022766765e-05;-1.2339541171968e-05;-0.00056148436851799;-0.00057179958093911;-0.00014669522352051;-0.00015255522157531;-0.000191486949916;-0.00015935537521727;-1.8437197013554e-07;4.5620276068803e-05;3.8997472984192e-06;-2.4056182155618e-05;1.9055480152019e-05;9.4001507022767e-06;0.00015579230966978;0.00015972448454704;-0.00049888179637492;-0.00067615002626553;-0.00036101331352256;-0.00057659699814394;3.786588422372e-06;-1.6740796127124e-06;-0.00015450331557076;-0.00016719127597753;-2.4987566575874e-06;-4.7357767471112e-05;7.3946466727648e-05;0.00014136583195068;6.684846994176e-06;0.0010955673642457;5.5210457503563e-05;-0.00045637480798177;-0.00049224321264774;0.00030334864277393;0.00070023478474468;0.0001602522097528;0.00024972436949611;0.00016104026872199;0.00020868412684649;6.0407386627048e-05;8.4461797086988e-05;-9.0412853751332e-05;-0.00012378943210933;-1.5621999409632e-05;1.7772696082829e-05;0.00012592363054864;-0.00012763128324877;0.00046480467426591;-0.00059074815362692;0.00060788949485868;-0.00058235879987478;-0.00015939881268423;0.00016844096535351;0.0001291875669267;-8.0816600529943e-05;0.00011832323798444;-3.7185975088505e-05;-0.00012128247180954;0.00011811575677712;-3.0200098990463e-05;-0.00031857698922977;-0.00019141960365232;3.8250800571404e-05;0.00017240757006221;-0.001573467743583;0.0020558836404234;-0.00033793301554397;0.00024633875000291;4.4194439396961e-06;-5.9973757743137e-05;-8.0191290180665e-05;3.9252157876035e-05;1.3344215403777e-05;-1.3547991329688e-05;3.0128438083921e-05;9.234967365046e-06;0.00012134380813222;0.00012698350474238;0.00019448396051303;0.00028495865990408;0.00041136439540423;0.00034032703842968;-5.3605021093972e-05;-6.9619032728951e-05;3.6592859942175e-06;3.1622289498046e-07;4.2489886254771e-05;7.9632736742496e-06;3.6145647754893e-05;8.4769322711509e-05;-0.00035809591645375;0.0010400885948911;-0.00054231047397479;5.2215422329027e-05;2.0721454063732e-07;-0.00054976588580757;-0.00059077813057229;-0.00013978026981931;-0.00016044973745011;-0.00018905816250481;-0.00015854308730923;4.0676539470041e-07;4.5540513383457e-05;4.585436272464e-06;-2.5206752980012e-05;1.6649708413752e-05;1.1698134585458e-05;0.00015583718777634;0.00015723396791145;-0.0004566757415887;-0.0007191818440333;-0.00032651107176207;-0.00061242538504303;2.7453154416435e-06;1.0677917998692e-06;-0.00014620489673689;-0.00017342195496894;1.365914613416e-06;-4.9914855480893e-05;6.6643835452851e-05;0.00014816402108409;6.5306066971971e-06;0.0010831071995199;4.9378086259821e-05;-0.00045518079423346;-0.00048532910295762;0.00022604313562624;0.00079244008520618;0.00014383900270332;0.00026408699341118;0.00015168737445492;0.00021670376008842;5.6174420024035e-05;8.7582739070058e-05;-8.5325467807706e-05;-0.00012880821304861;-4.4691045332002e-05;7.6957709097769e-05;0.00012764877465088;-0.00011476223153295;0.0003192822332494;-0.0012987782247365;5.995682295179e-05;-0.0009526798967272;-0.00026377188623883;0.00047084951074794;2.4823191779433e-05;-0.00016115340986289;3.2273681426886e-05;-0.00026831272407435;0.00015493159298785;-0.00066691834945232;-8.0483783676755e-05;9.2627728008665e-05;0.00036456636735238;-0.00022801586601418;0.00048116996185854;-0.00038889507413842;0.00042311067227274;-0.00013470253907144;0.00039829555316828;-0.00013677866081707;0.0016217506490648;1.5198809705907e-05;6.6321304075245e-06;-5.4037678637542e-05;0.00012390602205414;-6.6377710027155e-05;0.00012148755922681;-0.00011271364928689;-0.00019448064267635;-9.2191468866076e-05;0.0012207373511046;-9.6422496426385e-05;0.00037296759546734;3.2371855922975e-05;-0.00010210413165623;6.8831024691463e-05;-0.00026600042474456;-0.00010147863940801;0.00038042617961764;-3.0197030355339e-05;0.00026210831128992;0.00030249779229052;0.00041861261706799;0.0001838440366555;-2.9810795240337e-05;-0.00072638015262783;-2.4238162950496e-05;-0.00076316040940583;6.6055028582923e-05;0.0002889848256018;0.00011760337656597;-0.0011411042651162;4.9042023420043e-07;-9.7402635219623e-06;4.0051498217508e-05;-0.00012066921772202;2.6807787435246e-05;-9.7353804449085e-05;-0.00015165530203376;4.4648648326984e-05;-5.9442852943903e-05;0.0011618472635746;-4.6693905460415e-05;-9.1864843852818e-05;-8.1046033301391e-05;0.00011278977035545;6.3836878325674e-06;0.00025186626589857;-1.8283762983629e-05;-0.00055645132670179;5.4955235100351e-05;-0.00038326339563355;0.00031371603836305;0.00044689953210764;0.00026866843109019;-2.9083937988617e-05;-0.00080911529948935;-3.0595307180192e-05;-0.00085899425903335;9.0278270363342e-05;-0.0003540086618159;-1.7216950709553e-06;0.00054781086510047;-1.399349548592e-05;3.2068081054604e-05;-1.4327568351291e-05;0.00023915560450405;-0.00013687154569197;6.7683911765926e-05;0.00025320111308247;-6.0919686802663e-05;0.0013220907421783;-0.00027591353864409;0.00077772431541234;-6.8596251367126e-05;-0.00043513107812032;0.00027272244915366;0.00032476268825121;-4.4020955101587e-05;0.00034399141441099;-3.8933258110774e-06;0.00073179975152016;-0.00015260500367731;-5.9291334764566e-05;-0.00023129230248742;-0.00035139944520779;-0.00032212020596489;0.00024656517780386;-0.00027562901959755;0.00039334435132332;-0.00074968760600314;8.2559345173649e-05;-0.0016002975171432;0.00011939931573579;-1.9472705389489e-05;-6.6497259467724e-06;-0.00018174393335357;3.96906871174e-05;0.00019876941223629;-8.7160115072038e-05;-0.00039774022297934;-9.7376760095358e-05;0.0012812789063901;-0.0001057395566022;0.00059484544908628;-0.00012507452629507;-0.00025611848104745;0.00011418941721786;-0.00054846162674949;6.4401487179566e-05;0.0002719578333199;-8.8606007921044e-05;0.0005283203208819;-6.2412887928076e-05;0.00038324075285345;0.00050426699453965;0.00013076208415441;-0.00082135986303911;-8.8613473053556e-05;-0.00088222703197971;3.0329245419125e-05;0.00089632451999933;6.110319372965e-05;-0.0015718078939244;0.00013318617129698;7.2249829827342e-05;-1.3379099073063e-06;-0.00017252434918191;4.1335042624269e-05;-0.00013818257139064;3.3790318411775e-05;0.00023335522564594;-0.00021162877965253;0.0023092797491699;-0.00011676154099405;4.8059682740131e-06;-0.00014158348494675;1.5914267351036e-05;-6.0686314100167e-05;0.00035813634167425;1.3516046237783e-05;-0.00037703276029788;-6.605354428757e-05;-0.00016972562298179;4.9945854698308e-05;0.000418292125687;0.00072222348535433;0.00051135785179213;-0.0014195556286722;1.6264148143819e-05;-0.001472678151913;-7.6343341788743e-05;-0.00087108393199742;0.00012468532077037;5.8355199143989e-05;7.1773698437028e-05;1.3283118278196e-05;-4.6180439312593e-06;0.00017592152289581;-4.966431788489e-06;-0.00015918748977128;8.9860557636712e-05;0.00034240633249283;-2.7320287699695e-05;0.0012027552584186;-0.00031720395782031;0.00086665607523173;-4.0911421820056e-05;-0.00048955011880025;0.00033379101660103;0.00040980143239722;-6.4113664848264e-05;0.00058260548394173;1.557949326525e-05;0.00088898098329082;-0.00019430847896729;-0.0002406924177194;-0.00059577479260042;-0.00056510919239372;-1.8215245290776e-05;0.00038014521123841;9.9980963568669e-05;0.00051881076069549;-0.00099415192380548;6.4953346736729e-05;-0.0019216598011553;0.00012091126700398;-5.5261381930904e-05;-4.9752561608329e-06;-0.00027875162777491;4.9948823289014e-05;0.00025193474721164;-0.00010947717237286;-0.00048706316738389;-8.8898530520964e-05;0.0016948655247688;-0.00010922704677796;0.00067209778353572;-0.000195153610548;-0.0003442210436333;0.00014688681403641;-0.00071112089790404;7.7711731137242e-05;0.00028315480449237;-0.00010833817941602;0.00074262812267989;-7.1924296207726e-05;0.00043345981976017;0.00065769115462899;0.00028532967553474;-0.001005660626106;-0.00012200099445181;-0.0012103411136195;-1.6035243106671e-06;0.0011384027311578;5.2886221965309e-05;-0.0019850919488817;0.00017866394773591;0.00011671458196361;2.7407461402618e-06;-0.00022952936706133;4.448330582818e-05;-0.0002342563966522;6.8464025389403e-05;0.00049563607899472;-0.00034025363856927;0.0039381193928421;-0.00028929888503626;0.00022445908689406;-0.00023898690415081;-8.1260775914416e-05;-1.6978088751785e-05;0.00064037722768262;5.298516498442e-06;-0.00010915075836238;-0.00011622744204942;-2.2137313862913e-05;2.6326124498155e-05;0.00057125155581161;0.00095514010172337;0.00065203581470996;-0.0022198145743459;0.00014988407201599;-0.0022578660864383;3.0854516808176e-05;-0.0017649367218837;0.00022188381990418;-0.00053582643158734;0.0001602667325642;-5.8059973525815e-05;-1.1985554237981e-06;0.00013608377776109;1.0171945177717e-05;-1.6726149624446e-05;2.0434503312572e-05;4.2926316382363e-05;7.4184288678225e-05;-0.00056184217100963;2.4457682229695e-05;-2.3461054297513e-05;7.1118149207905e-05;-3.0860765036778e-06;3.723136978806e-05;7.4245275754947e-05;-2.2457123122877e-05;0.00011841111700051;4.2168558138655e-05;5.3728053899249e-05;-2.8845866836491e-05;-0.00023413359303959;-0.00042442802805454;-0.00024806798319332;0.00054142827866599;8.6337058746722e-05;0.00060445512644947;7.3332274041604e-05;-0.00010667065362213;-4.9271409807261e-05;-2.9764749342576e-05;-3.8963029510342e-05;-2.3180691641755e-05;-3.4127182857446e-07;-5.559936107602e-05;2.3811544451746e-06;7.8690085501876e-05;-2.8048840249539e-05;-0.00014918403758202;6.2724575400352e-05;0.00024515108088963;-1.915648317663e-05;0.00017564059817232;-0.00010531321458984;-0.00012364955910016;5.3348438086687e-05;-0.00022085431555752;-3.0889603408468e-07;-2.5478591851424e-05;-1.3676212802238e-05;0.00021353737975005;-7.6204487413634e-06;-2.2732025172445e-05;0.00010485689563211;0.0001327885693172;2.7500427677296e-05;-6.8008441303391e-05;-0.00038295181002468;5.2229825087124e-05;0.00038082469836809;-1.6996329577523e-05;-0.00041075845365413;5.1074810471619e-05;5.7854547776515e-05;1.096529467759e-05;-4.8230805987259e-05;-4.218742105877e-06;-9.7855678177439e-05;3.4241529647261e-05;0.00027062889421359;-0.00010283451410942;0.001838426454924;-0.00015087629435584;0.00020166984177195;-0.00011701698531397;-0.00010376425052527;4.1625375160947e-05;0.00032227634801529;-1.3938963093096e-05;0.0003277683572378;-5.024837446399e-05;0.00020562887948472;-1.7225169358426e-05;0.00013492711877916;0.00026559323305264;0.00020817255426664;-0.00080291891936213;0.00010154393385164;-0.00090655556414276;8.825384429656e-05;-0.0010393961565569;8.5810221207794e-05;-0.00068420119350776;8.9679240772966e-05;-7.6736614573747e-05;8.2634351201705e-06;-7.3024646553677e-05;1.2083954970876e-05;-1.9457562302705e-05;1.6068119293777e-05;0.00025061264750548;-0.00023102313571144;0.00037736332160421;-0.00051193666877225;0.00053546135313809;-0.00056044303346425;-9.7637392173056e-05;0.00011364507372491;5.6384531490039e-05;-2.2654543499812e-05;0.00010531666339375;-6.0343383665895e-05;-0.00013774367107544;0.00013144394324627;-1.1856638593599e-05;-0.00019890716066584;-0.00013452688290272;-0.00034589934512042;0.00045285205123946;-0.0012654297752306;0.0016414736164734;-0.00024127768119797;0.00018385823932476;1.5066529158503e-05;-1.4720239050803e-05;-5.4854244808666e-05;3.0807641451247e-05;1.3331938134797e-05;-1.4974197256379e-05;3.1061103072716e-05;1.4317723980639e-05;1.8985074348166e-05;3.922573159798e-05;0.00014993528020568;0.00025756994727999;0.00033667389652692;0.0003235213807784;-7.0968228101265e-05;-7.6879230618943e-05;5.4521438869415e-05;3.7630743463524e-05;8.3461281974451e-06;-6.3075299294724e-06;8.428324349552e-07;3.0538685678039e-05;-0.00036782657844014;0.00080338353291154;-0.00010317836131435;0.00031892859260552;0.00022712806821801;-0.00074145471444353;-0.00082942232256755;-0.00015527533832937;-0.00016804689948913;-8.0554040323477e-05;-7.9938618000597e-05;-2.0934414351359e-05;1.9821622117888e-05;2.7079435312771e-05;1.2751557960655e-06;1.5824874935788e-05;4.5004317144048e-06;0.0001947124110302;0.00018488339264877;-0.00024174581631087;-0.00042507154284976;-0.00011647217615973;-0.00031593162566423;3.3281155538134e-06;2.1198364265729e-05;-0.00011648388317553;-0.00012543983757496;5.4493048082804e-05;-4.3860809455509e-06;2.3021859306027e-05;6.7166474764235e-05;-3.6701424050989e-06;0.0018466815818101;1.1535034900589e-05;-0.00066078052623197;-0.00066555792000145;-0.00021166093938518;0.0001233673247043;4.191947664367e-05;0.00014229185762815;7.7846591011621e-05;0.00015090305532794;2.9130658731447e-05;5.208336369833e-05;-6.6842461819761e-05;-9.0844951046165e-05;-1.8797403754434e-05;1.5941504898365e-05;0.00024683171068318;-0.00023270890233107;0.00039438647218049;-0.00049273500917479;0.0005407152348198;-0.00055168644757941;-9.7551877843216e-05;0.00011165682371939;5.9118097851751e-05;-1.8909571736003e-05;0.00011318916949676;-5.2743573178304e-05;-0.00013411896361504;0.00013489117554855;-1.5218037333398e-05;-0.00024655391462147;-0.00015310132585;-0.00033187135704793;0.00046345801092684;-0.0012464103056118;0.0016540426295251;-0.00025136643671431;0.00017250097880606;-4.1114134319287e-08;-2.9486078346963e-05;-5.7012897741515e-05;2.8237109290785e-05;1.164162040368e-05;-1.6297346519423e-05;3.1000912713353e-05;1.3888371540816e-05;2.6992129278369e-05;3.2400392228737e-05;0.00014276771980803;0.00026638276176527;0.00033212613197975;0.00032452092273161;-6.9088091549929e-05;-7.8333447163459e-05;5.0279715651413e-05;4.1646530007711e-05;8.0765503298608e-06;-6.9740972321597e-06;2.8287760756029e-07;3.159713014611e-05;-0.00036606160574593;0.0008059695828706;-0.00010051042045234;0.00029648034251295;0.00024365342687815;-0.00072150654159486;-0.00085112417582422;-0.00015027131303214;-0.00017281342297792;-7.8918696090113e-05;-7.9882986028679e-05;-1.9485310986056e-05;1.9043296560994e-05;2.6480058295419e-05;1.3812305041938e-06;1.3849228707841e-05;6.4137939261855e-06;0.00019802212773357;0.00017864257097244;-0.00021559788729064;-0.00045434001367539;-9.3597664090339e-05;-0.00034249015152454;1.6737432133596e-06;2.3896509446786e-05;-0.0001130009040935;-0.00012764392886311;5.5736887588864e-05;-5.7871520766639e-06;1.832712587202e-05;7.2120288677979e-05;-3.7534455259447e-06;0.0018329527229071;8.3430304584908e-06;-0.00066644890466705;-0.00065049424301833;-0.00025910284603015;0.00018597017333377;3.4472403058317e-05;0.00014997988182586;7.1996808401309e-05;0.00015692869783379;2.7161795514985e-05;5.348209379008e-05;-6.3277177105192e-05;-9.4435556093231e-05;-8.1646365288179e-05;0.00010937998013105;1.7987229512073e-05;-0.00017979029507842;0.00023061921820045;-0.00043591737630777;-2.2728238036507e-05;-0.00064482854213566;-0.00027410942129791;0.00041485458496027;5.8019893913297e-05;-0.00022788585920352;-4.5690132537857e-05;-0.00024290828150697;0.00016345852054656;-0.00063757132738829;0.00024694504099898;0.00069705909118056;0.00054886564612389;-0.00037555154995061;-0.00023013637110125;-0.00040099886246026;-0.00044715381227434;-2.8617301722988e-05;0.00045340528595261;-6.3515231886413e-05;0.0012707246933132;1.5799336324562e-05;3.1134613891481e-06;-3.8731781387469e-05;0.00014754870790057;-0.0001130263262894;0.00020763269276358;-3.7247002182994e-05;-0.00039730442222208;-8.4017701738048e-05;0.0013858203310519;-0.00019918939506169;0.0006200167699717;0.00012955146667082;-0.0003295976202935;8.7938649812713e-05;-0.0005121196154505;-0.00011543511936907;0.00023525379947387;-6.6222622990608e-05;0.0006409760680981;0.0003461955639068;0.00064967008074746;0.00031868359656073;-0.00019073531439062;-0.00073425855953246;-1.3322155609785e-05;-0.001197837642394;3.5208529880038e-05;0.00079829915193841;0.00018346522119828;-0.0015885382890701;-4.3181018760663e-09;0.00011443530092947;4.8078738473123e-05;-0.00022236991208047;6.513324478874e-05;-0.0002009674499277;-0.00033404136775061;0.00034388958010823;-0.00027905331808142;0.0033364419359714;-0.00020146739552729;0.00014593434752896;-6.7747089360637e-07;-8.9386681793258e-05;6.6325965235592e-06;0.00054276455193758;-0.00010909741104115;-0.00014299992471933;2.5875494884531e-06;7.4293755460531e-05;0.00054047809680924;0.00085967557970434;0.0005800990620628;0.00013091733853798;-0.0019113287562504;1.7766154996934e-05;-0.0019654247444123;0.0002215957356384;-0.0013642811682075;0.00016097775369417;-0.00048081373097375;-7.7358427006402e-06;-5.0017359171761e-05;1.7461226889282e-05;9.06439308892e-05;-7.5492527685128e-05;0.00012538323062472;7.5448238931131e-05;-0.00019798993889708;0.00028485449729487;-0.0010432930430397;4.5831067836843e-05;-0.00077920005423948;-0.00026995484950021;0.00045744402450509;5.0388734962326e-05;-0.00025884338538162;-2.9462323709595e-06;-0.00020217700512148;0.00015545138739981;-0.00064882379956543;7.059118070174e-05;0.00029853504383937;0.00037124188384041;-0.00028681714320555;0.00022520551283378;-0.00037884080666117;0.00016642012633383;-9.1469286417123e-05;0.00054454727796838;-0.00011375625763321;0.0013900715857744;1.3303377272678e-05;2.9046357212792e-06;-4.2435141949682e-05;0.00011441762762843;-0.00010270314669469;0.00019155704649165;-7.7784221502952e-05;-0.00037665263516828;-9.1659749159589e-05;0.0011051489273086;-0.00013129026046954;0.00057925068540499;0.00010870818368858;-0.00026159035041928;8.9703709818423e-05;-0.00046453447430395;-0.00010043467773357;0.00024025393940974;-6.4427003962919e-05;0.00048917013918981;0.00034930303809233;0.00049871805822477;0.00016319564019796;-0.00012362505367491;-0.00066711148247123;1.313505890721e-05;-0.00088073645019904;4.7308221837739e-05;0.00076462043216452;0.00014615354302805;-0.0013912740396336;-8.046479706536e-06;8.0379664723296e-05;4.8713409341872e-05;-0.00017344960360788;2.9742093829555e-05;-0.00012609602708835;-0.00021738179202657;0.00014001689851284;-0.00011515569349285;0.0021448326297104;-0.00013384519843385;-2.6055640773848e-05;-5.5170898122014e-05;1.7657497664914e-05;1.7871250747703e-05;0.00033351438469253;-6.2159604567569e-05;-0.00045235600555316;4.1468760173302e-05;-0.00014883119729348;0.00044529911247082;0.00074711936758831;0.00050508882850409;-2.4923201635829e-05;-0.0013373553520069;-7.5450072472449e-05;-0.0014613185776398;0.00013181313988753;-0.00069316383451223;7.3290066211484e-05;0.00011405438999645;-1.1533737961145e-05;2.1827010641573e-05;-3.3367425658071e-06;0.0001805382053135;-0.00020975207735319;0.00011586159962462;0.00046958669554442;5.8185003581457e-05;0.00059979018988088;-0.00021651679708157;0.00043584426748566;-1.3098149793223e-05;-0.00026060026721098;0.00020923691045027;0.00057117675896734;-9.6182098786812e-05;0.00054521427955478;3.7674890336348e-05;0.00050168216694146;-0.00011940173862968;-0.00044333291589282;-0.00073036138201132;-0.00044433627044782;0.00041337168659084;0.00035819812910631;0.00035254139220342;0.00041886832332239;-0.0012957586441189;2.1090087102493e-05;-0.0010559431975707;5.4014737543184e-05;-0.00010954921890516;1.2373466233839e-05;-0.00020067206060048;2.0794215743081e-05;0.00027137878350914;-0.00010610408935463;-0.00058467662893236;2.5734640075825e-05;0.00047702351002954;-4.935137621942e-05;0.00055438344134018;-0.00014923415437806;-0.00034894907730632;0.00016506230167579;-0.00082684360677376;6.142765050754e-05;-0.00012875859101769;-3.843998638331e-05;0.00063451519235969;-7.0670059358235e-05;0.00020976574160159;0.00032178562832996;0.00012314092600718;-0.00030168809462339;-0.00012954094563611;-0.00062914117006585;5.1818751671817e-05;0.0016608224250376;-2.3901857275632e-05;-0.0013624462299049;0.00012031872029183;0.000195354281459;-4.7693815758976e-06;-0.00013827052316628;2.0253779439372e-05;-0.00019702411373146;5.4582014854532e-05;0.00053506525000557;-0.00027527826023288;0.0042698355391622;-0.00032474950421602;0.00039584981277585;-0.00033132871612906;-0.00020427354320418;4.3276249925839e-05;0.00056817720178515;-6.6119741859438e-06;0.00019261913257651;-0.00013664409925696;0.00026761667686515;5.2545187827491e-06;0.00048407696885988;0.0010084771784022;0.00073454296216369;-0.0021837158128619;0.00012065005284967;-0.0025380235165358;9.1460606199689e-05;-0.0019011348485947;0.00021439428383019;-0.0010786240454763;0.00022000558965374;-5.93080658291e-05;1.4574564374925e-05;1.9860087832058e-06;1.4272119187808e-05;-9.0543122496456e-05;6.3747684180271e-05;0.00021373038180172;9.8534772405401e-05;-0.00038500243681483;-5.8717520005303e-05;0.00012693472672254;6.9911700848024e-05;-9.386197780259e-05;0.00011492762132548;0.00028149026911706;-5.8817207900574e-05;0.00035178611869924;5.8558423916111e-05;0.00023889901058283;-7.4064555519726e-05;-0.0004165657737758;-0.00074756075628102;-0.0004319247091189;0.00074078841134906;0.00023624951427337;0.00078993546776474;0.00024312158348039;-0.00058942189207301;-4.460096170078e-05;-0.00042029022006318;-2.1120938981767e-05;-7.0285925175995e-05;4.4132043512946e-06;-0.00014032855688129;1.007762421068e-05;0.0001799474703148;-6.7991983087268e-05;-0.00035530520835891;7.1409856900573e-05;0.00043821183498949;-3.8148900785018e-05;0.00037034836714156;-0.00016307258920278;-0.00025620881933719;0.00011630108201643;-0.00053111457964405;2.3824441086617e-05;-7.2381539212074e-05;-2.760877214314e-05;0.00046298958477564;-3.5037690395257e-05;5.259009776637e-05;0.0002209208032582;0.0001850075495895;-9.5102084742393e-05;-0.00010946000111289;-0.00061355205252767;6.9189394707792e-05;0.00098155997693539;-2.7659214538289e-05;-0.00091938429977745;9.7906515293289e-05;0.00013498106272891;8.5829215095146e-06;-0.00010517421469558;3.4309398415644e-06;-0.00018784862186294;6.0941467381781e-05;0.00051249749958515;-0.00021893529628869;0.0036097834818065;-0.00030025758314878;0.000395986600779;-0.0002584713511169;-0.00019796343985945;6.6490727476776e-05;0.00057997065596282;-2.0977535314159e-05;0.00047077433555387;-0.00011110131890746;0.00033558960421942;-1.9436667571426e-05;0.00032709178049117;0.00067045068135485;0.00049482833128422;-0.0016992804594338;0.00016087963012978;-0.001951742102392;0.00014603283489123;-0.0018797280499712;0.00018265197286382;-0.001190394628793;0.00018750633171294;-0.00011591384827625;1.6396963474108e-05;-8.5891901107971e-05;2.0069861420779e-05;-2.8932279747096e-05;3.2545918656979e-05;7.0657311880495e-05;0.0001093051105272;-0.00081107451114804;3.0570110538974e-05;-2.7896499886992e-05;0.00010428351379232;-8.386844456254e-06;5.7803241361398e-05;0.00012057864660164;-3.493704207358e-05;0.00018230915884487;6.3240768213291e-05;8.5354680777527e-05;-4.4028663978679e-05;-0.0003515908611007;-0.00064061541343108;-0.00037260647513904;0.00080247211735696;0.00013550514995586;0.0008924743742682;0.00011805014946731;-0.000181017909199;-7.1686401497573e-05;-5.7992449001176e-05;-5.6738488638075e-05;-3.6550030927174e-05;-4.4242969465813e-07;-8.4040329966228e-05;3.3863741464302e-06;0.000121593096992;-4.3533593270695e-05;-0.00023153636720963;9.1853966296185e-05;0.00035121580003761;-2.9962337066536e-05;0.00026900382363237;-0.00015607173554599;-0.00018760726379696;8.188298670575e-05;-0.00034259678795934;1.1528317145348e-06;-4.2187661165372e-05;-2.0047997168149e-05;0.00032307617948391;-1.2980199244339e-05;-2.9613640435855e-05;0.00015201097994577;0.00019018485909328;4.0511131373933e-05;-0.00010007649689214;-0.00055981031619012;8.1183847214561e-05;0.00059681484708562;-2.5510222258163e-05;-0.00062208384042606;7.6566117058974e-05;8.9587752881926e-05;1.549028820591e-05;-7.2769696998876e-05;-5.7403840401093e-06;-0.00014845610712655;5.144781243871e-05;0.00040894074481912;-0.00015540771710221;0.0027878133114427;-0.00022927140526008;0.00030909152701497;-0.00018254652968608;-0.00015776656800881;6.1889717471786e-05;0.00048652311670594;-2.1538378859987e-05;0.00048776637413539;-7.8252800449263e-05;0.00030838890234008;-2.440115713398e-05;0.00020861887605861;0.00041956530185416;0.00032651051878929;-0.0012239123461768;0.00014688895316795;-0.0013985408004373;0.00013280363054946;-0.0015666325343773;0.00013198450324126;-0.0010286095784977;0.0001379805180477;-0.00011453946353868;1.3323642633623e-05;-0.00010759327415144;1.79309718078e-05;-2.2182864995557e-05;1.3894847143092e-05;0.00037463157786988;-0.00034137669717893;0.00034045911161229;-0.00043884915066883;0.00043742026900873;-0.00046780213597231;-5.492303534993e-05;7.2503098635934e-05;-8.9702361947275e-06;3.7822013837285e-05;0.00010213146742899;-6.8934758019168e-05;-0.00012448387860786;0.00011877469660249;6.7800297074427e-06;-0.00012342870468274;-0.00011161433940288;-0.00075867213308811;0.00078020530054346;-0.00091062212595716;0.0012073151301593;-0.00016888568643481;0.0001178473175969;4.3123183246507e-08;1.0616208783176e-05;-2.8421412935131e-05;1.2706896086456e-05;-3.1889381801875e-08;-3.9520364225609e-06;3.3421958505642e-05;2.0126351955696e-05;-0.00011635811824817;-8.7456581240986e-05;-3.0547122150892e-05;0.0001272637891816;0.00023410138965119;0.00026254329713993;-7.4987416155636e-05;-8.3482380432542e-05;8.9569664851297e-05;6.6625303588808e-05;-4.456781243789e-05;-3.9768110582372e-05;-3.2650645152899e-05;-5.8806813285628e-06;-0.00033721383078955;0.00032091070897877;0.00018261293007527;0.00064297381322831;0.00052582408534363;-0.00069017132045701;-0.00083540030755103;-0.00010140107769985;-0.00012605554366019;4.9498983571539e-05;1.2498941941885e-05;-3.6243731301511e-05;1.6371652691305e-06;4.9164056690643e-05;2.3412228983943e-05;1.8611855921336e-05;4.7881685532047e-06;0.0001783170591807;0.00016039033653215;-4.9759200919652e-05;-0.00022007926600054;7.8977966040839e-05;-8.7916821939871e-05;-7.2445463956683e-06;2.2662286937702e-05;-7.2902723331936e-05;-7.7014970884193e-05;9.2707690782845e-05;2.6796975362231e-05;-2.2943546355236e-05;3.3833355246315e-06;-3.5823108191835e-05;0.00239093368873;5.8585559600033e-05;-0.00072125269798562;-0.00070900528226048;-0.00067052629310638;-0.0004144957929384;-5.3704301535618e-05;5.0979531806661e-05;2.6656536647351e-05;0.00010834019485628;-3.1534789286525e-06;1.7054455383914e-05;-3.8761525502196e-05;-5.4601925512543e-05;-2.1409861801658e-05;1.3748771380051e-05;0.00037278741365299;-0.00034022037289105;0.00035947177093476;-0.00041885033715516;0.00043838360579684;-0.00046371555072255;-5.5207929108292e-05;7.0911810325924e-05;-7.0971113927953e-06;4.0381673898082e-05;0.00010937913611997;-6.2025457737036e-05;-0.00011938557145186;0.00012320843234193;-7.6696807127519e-07;-0.00016966894327197;-0.00012121562758693;-0.00074306916212663;0.00079074979294091;-0.00089567038230598;0.0012168769026175;-0.00017973614740185;0.00010627620940795;-1.4351332538354e-05;-2.756028152362e-06;-2.9750666726613e-05;1.1094761248387e-05;-2.4029636733758e-06;-5.96981635681e-06;3.3061896829167e-05;1.9837072613882e-05;-0.00010741723235697;-9.4894247013144e-05;-3.1624960683985e-05;0.00013022567145526;0.00022579266806133;0.00026841112412512;-7.3114068072755e-05;-8.4861079812981e-05;8.5904946899973e-05;6.9810215791222e-05;-4.4412594434107e-05;-4.0485829231329e-05;-3.0914772651158e-05;-7.0850824158697e-06;-0.00033430679468438;0.00032395825837739;0.00018333240586799;0.00061355595244095;0.00054617825662717;-0.0006662339437753;-0.00085861689876765;-9.8487937066238e-05;-0.00012832075299229;4.9123758799396e-05;1.3420342838799e-05;-3.441624721745e-05;5.6777383861117e-07;4.7588266170351e-05;2.442381628498e-05;1.6453874195577e-05;6.8574991018977e-06;0.00018560771422926;0.00014929805183783;-3.0833605705993e-05;-0.00024370261235163;9.4723611255176e-05;-0.00010843534982996;-8.9379418568569e-06;2.5189585358021e-05;-7.2461763920728e-05;-7.6422125857789e-05;9.2394911916927e-05;2.6027888452518e-05;-2.584956746432e-05;6.798205049563e-06;-3.5745564673562e-05;0.00237439526245;5.6304983445443e-05;-0.00073551095556468;-0.00068307889159769;-0.00069960951805115;-0.00036870484473184;-5.622082244372e-05;5.5262647947529e-05;2.2282014469965e-05;0.00011370595893823;-3.5585999285104e-06;1.7086904335883e-05;-3.6233472201275e-05;-5.7083521824097e-05;-7.0259338826872e-05;7.1107591793407e-05;-8.7064792751335e-05;-0.00014052516780794;4.8664122004993e-05;0.00059594493359327;-0.0001013259679894;-0.00010575268242974;-0.00012431057984941;0.00011126400204375;6.4717351051513e-05;-0.00017894111806527;-8.079208782874e-05;-0.00024188285169657;7.9335142800119e-05;-0.00022455737052951;0.00041785772191361;0.00089721236145124;0.00050187739543617;-0.00030510872602463;-0.00079710292629898;-0.00024428474716842;-0.0010221899719909;5.9428290114738e-05;0.00032967084553093;4.371454633656e-05;0.00036041872226633;1.4862324633214e-06;4.2798012145795e-05;-8.0968493421096e-06;0.0001066979530151;-7.7859062002972e-05;0.00016046555538196;8.9791858044919e-05;-0.00028948651743121;-3.7326135498006e-05;0.00058832234935835;-0.00018428909243084;0.00040731040644459;0.00011382778029656;-0.00027815671637654;3.5977689549327e-05;-0.00043679025839083;-5.1210125093348e-05;-6.8110525717202e-06;-4.096883276361e-05;0.00049083435442299;6.1418017139658e-05;0.00034937934833579;0.00026325153885409;-0.00016542678349651;-0.00014784387894906;3.5518871300155e-05;-0.00080488831736147;-2.9134360374883e-05;0.00073764537228271;0.00012808020983357;-0.00092859572032467;8.6359768829425e-06;0.00013841038162354;1.5272706150427e-05;-0.00014535555965267;7.8228040365502e-05;-0.00020135083468631;-0.00026511718169786;0.00044968174188398;-0.00035307073267177;0.0035025207325816;-0.00025519783957861;0.00035764946369454;7.3222487117164e-05;-0.00021569205273408;-3.0418270398513e-05;0.00057871203171089;-0.00012453769159038;0.00037346678436734;-3.5554916394176e-05;0.00037525495281443;0.0003627338737715;0.00069621385773644;0.00051680958131328;0.00019185729615856;-0.0017048711888492;0.000146087462781;-0.0019738003611565;0.00022536357573699;-0.0017009759321809;0.00021608243696392;-0.0011220686137676;1.4268623999669e-05;-0.0001217417884618;2.7006915843231e-05;-8.0762554716785e-05;-0.00010219546675216;0.00013968390703667;-2.9035058105364e-05;-0.0002507476892788;0.00019087339751422;-0.00017373751325067;-3.9127215131884e-05;-0.00045577200944535;-0.0002356033801334;0.00032822412322275;8.1669000792317e-05;-0.0003059504670091;-6.4831088820938e-05;-0.00024978280998766;0.00013947320985608;-0.00051267805974931;0.00036820070818067;0.00082189217209816;0.00052987912204117;-0.00039481034036726;-0.0004515164764598;-0.00037565719685517;-0.00063104904256761;-1.4043449709789e-06;0.00060377432964742;-3.2582851417828e-05;0.00096306018531322;6.972515166126e-06;2.8425100026652e-05;-2.4893170120777e-05;0.00012924637121614;-0.00012304708070587;0.00023686242639087;1.7926626242115e-05;-0.00048244860954583;-5.8818353863899e-05;0.00095906539354473;-0.00019697593234014;0.00063420436345041;0.00015731989697088;-0.00037620565854013;8.7531792814843e-05;-0.00061231857398525;-8.7914399045985e-05;6.0240057791816e-05;-7.3920615250245e-05;0.00066943868296221;0.00027768992003985;0.00054632307728752;0.00026351466658525;-0.00021692138398066;-0.00047535880003124;1.6951911675278e-05;-0.0010344412876293;-3.2473506053066e-06;0.0011043662671;0.00016970647266135;-0.0014588146004826;-4.8083606998262e-06;0.00016740504361223;4.0982686186908e-05;-0.00020428821153473;6.6057320509572e-05;-0.00020801686332561;-0.00033081319998018;0.00040263892151415;-0.00032252803794108;0.0038303460460156;-0.00026865309337154;0.00025746872415766;2.9878379791626e-05;-0.0001704178575892;-5.1461881866999e-07;0.00057536800159141;-0.00013482521171682;9.1632164185285e-06;-9.2807913461002e-06;0.00024088183999993;0.00055171066196635;0.00099788571242243;0.0006931780371815;0.00011804755195044;-0.0020881067030132;3.5458611819195e-05;-0.0023208924103528;0.00024108690558933;-0.0015777378575876;0.00021259888308123;-0.00081974390195683;1.468684217798e-06;-6.6384789533913e-05;2.2644842829322e-05;3.2032996386988e-05;-8.6997701146174e-05;0.00014464523701463;2.8921253033332e-05;-0.00024425238370895;0.00021764991106465;-0.00075130444020033;3.203890810255e-05;-0.00053166237194091;-0.00021434781956486;0.0003499832819216;6.3988503825385e-05;-0.00030367550789379;-2.0962308553862e-05;-0.00014506369188894;0.00012103868357372;-0.00049658631905913;0.00016152506577782;0.00035919336369261;0.00029637388070114;-0.00027448122273199;4.1939951188397e-05;-0.00030574656557292;1.4705408830196e-05;-5.4978034313535e-05;0.0006121308542788;-7.8719720477238e-05;0.00099142151884735;6.1868922784925e-06;1.2196590432723e-05;-2.5806570192799e-05;8.0645295383874e-05;-0.00010651371121639;0.00020333741849754;-3.3634194551269e-05;-0.00044327092473395;-5.0297305278946e-05;0.00066817412152886;-0.00011286295193713;0.00053906999528408;0.00012531685933936;-0.00028612447204068;8.873306796886e-05;-0.00051624956540763;-6.9315559812821e-05;5.3138242947171e-05;-6.7965498601552e-05;0.00049360492266715;0.00029557169182226;0.00039683605427854;0.00010759655560832;-0.00015200942289084;-0.00042724751983769;1.7723361452227e-05;-0.00067105371272191;9.8277059805696e-06;0.00099926709663123;0.00012019540008623;-0.0011848971480504;-1.4556659152731e-05;0.00012596273154486;4.0849088691175e-05;-0.00014920567627996;2.1723406462115e-05;-0.00010972495510941;-0.00020759939798154;0.00015368202002719;-0.00012986680667382;0.0023036669008434;-0.00016476838209201;4.0366929169977e-05;-2.4609485990368e-05;-4.9443435273133e-05;2.1842472051503e-05;0.00029752842965536;-7.5162584835198e-05;-0.00032640428980812;2.4504657631041e-05;9.0077392087551e-06;0.00043440121226013;0.0007829274982214;0.00054349040146917;-2.4297652998939e-05;-0.0013777172425762;-7.4030976975337e-05;-0.0015592040726915;0.00012917978165206;-0.00072258681757376;0.00010533353633946;-0.00015428973711096;-8.0505951700616e-06;1.8448397895554e-05;3.3806059036579e-06;0.00011827243724838;-0.00026670002262108;0.00013669916370418;0.00065402378095314;7.6386488217395e-05;0.00072723184712231;-0.00019789827638306;0.00020415034668986;-5.1354589231778e-05;-9.8972515843343e-05;0.00010569234291324;0.00074647925794125;-0.0001207019231515;0.00063537561800331;1.5475228792639e-05;0.00022522978542838;-5.4142201406648e-05;-0.00050199584802613;-0.00060453650075942;-0.00023029530711938;0.00038238949491642;0.00033044331939891;0.00011060596443713;0.00035293947439641;-0.0017851553857327;3.734506026376e-05;-0.00058167253155261;4.5910393964732e-05;-0.00017347963876091;3.3263600926148e-05;-0.00015668886771891;3.9524811654701e-06;0.00022849671950098;-7.8010431025177e-05;-0.0005258058081381;8.504912693752e-05;-0.00061132636619732;7.8518123700633e-06;0.00031511293491349;-5.0992959586438e-05;-0.00026019648066722;0.0001355426502414;-0.00079340551747009;4.316380363889e-05;-0.00043669302249327;2.375252188358e-05;0.00040835587424226;-6.0365440731402e-05;5.9212238738837e-06;-7.0550177042605e-06;-4.8222056648228e-05;0.00022246428125072;-6.4560917962808e-05;5.6252090871567e-05;3.6899069527863e-05;0.0018522015307099;-7.8762139310129e-05;-0.00062829972011968;4.6981127525214e-05;0.00021513666433748;-1.3188783668738e-05;-2.7554295229493e-05;1.257574012925e-06;-0.00010046041279566;2.3525844881078e-05;0.00041913846507668;-0.00015775329666212;0.0035115242935717;-0.00028794995159842;0.00042012811172754;-0.00034164389944635;-0.00023904567933641;7.1169444709085e-05;0.0002905756700784;-8.9019349616137e-06;0.00020702647452708;-0.00011338713375153;0.00034864322515205;-1.5174782674876e-06;0.00029807016835548;0.00081393599975854;0.00065540277864784;-0.0016555481124669;8.3598220953718e-05;-0.0022273408249021;0.000139833195135;-0.0014111530035734;0.0001518929930171;-0.0010857809102163;0.00021362410916481;4.5738634071313e-06;2.0009436411783e-05;-4.8586953198537e-05;6.3973006945162e-06;-2.1820520487381e-05;9.2153386503924e-06;0.00047815049765632;-0.00043307029409334;0.00035332224797457;-0.00040095046279021;0.00031674289493822;-0.00034075669827871;-2.495226362953e-05;4.1468916606391e-05;-6.1350692703854e-05;8.7966749561019e-05;0.00010311572987121;-7.5192539952695e-05;-8.9223925897386e-05;8.4677274571732e-05;2.5903269488481e-05;-4.6594886953244e-05;-8.8525885075796e-05;-0.0011750248959288;0.0011101122945547;-0.00056532543385401;0.00077093276195228;-0.00011628993524937;6.3178114942275e-05;-3.1343974114861e-05;4.101900049136e-05;-3.3045287182176e-06;-5.8632058426156e-06;-2.1728672436439e-05;1.551383320475e-05;3.0861687264405e-05;2.3290844183066e-05;-0.00026764662470669;-0.00023133856302593;-0.00026882454403676;-6.8528577685356e-05;0.00011225924390601;0.00017282181943301;-6.7260749347042e-05;-8.248416997958e-05;0.00011710527905961;8.5567655332852e-05;-0.00010468226537341;-8.2997932622675e-05;-5.817572309752e-05;-3.0367091312655e-05;-0.00022605885169469;-0.00028183232643642;0.00032270108931698;0.0009363898425363;0.0007984601543285;-0.00046428461791947;-0.00064711313461885;-8.6875752458582e-06;-4.375910066301e-05;0.00017815332103055;0.00010628830204951;-4.6301858674269e-05;-9.6100484370254e-06;6.6157575929537e-05;3.9896945963847e-05;2.7052179575549e-05;1.082549624698e-05;8.725708903512e-05;6.8538778577931e-05;2.745085839706e-05;-0.00011561701830942;0.00020745513029397;7.6473734225146e-05;-1.8294300389243e-05;1.5792504200363e-05;-2.6578476536088e-05;-2.5480208933004e-05;0.00010738435958046;4.070598151884e-05;-6.5131520386785e-05;-5.0236500101164e-05;-8.0153899034485e-05;0.0025762210134417;0.00013523850066122;-0.00058633316075429;-0.00057427416322753;-0.00097279454348609;-0.00079118018038571;-0.000103910380858;-2.7040332497563e-06;1.7508116798126e-05;9.4614333647769e-05;-3.5091074096272e-05;-1.8402522982797e-05;-8.2767173807952e-06;-1.8059261492454e-05;-2.0810779460589e-05;9.1127112682443e-06;0.00047932099550962;-0.00042883324204013;0.00037233607145026;-0.00038168489118107;0.00031473781564273;-0.00033919396810234;-2.5405402993783e-05;4.0057271689875e-05;-6.1095532146282e-05;8.9170949649997e-05;0.00011013350740541;-6.8507913965732e-05;-8.2918646512553e-05;8.9748980826698e-05;1.2199084267195e-05;-9.4633956905454e-05;-9.3227055913303e-05;-0.0011573602678254;0.0011237474391237;-0.00055059976875782;0.00077891180990264;-0.00012722522660624;5.1334638556e-05;-4.554129918688e-05;2.8532018404803e-05;-3.7443605833687e-06;-6.6539523686515e-06;-2.4800590836094e-05;1.2893611710751e-05;3.0509327189066e-05;2.2857024305267e-05;-0.00025960730272345;-0.00023873828467913;-0.00026377674657851;-7.2346905653831e-05;0.00010203679994447;0.00018068467034027;-6.5605745476205e-05;-8.3549341070466e-05;0.00011433344479883;8.7889413407538e-05;-0.00010401669715066;-8.4225037426222e-05;-5.4589203500655e-05;-3.3448766771471e-05;-0.00022170993906911;-0.00028014139388688;0.00032240018481389;0.00090245192404836;0.00082232104614377;-0.00043897470459342;-0.0006686860579066;-7.2777693276294e-06;-4.374046693556e-05;0.00017524436407257;0.00010935455793515;-4.4495940528577e-05;-1.0655693586159e-05;6.3946936279535e-05;4.1556253563613e-05;2.4474120436935e-05;1.3320456673682e-05;9.8895572591573e-05;5.175689511816e-05;4.408193854033e-05;-0.00013787075295113;0.0002179022267228;6.1331636970863e-05;-1.9876484657289e-05;1.8032023945125e-05;-2.811199738062e-05;-2.2697025997331e-05;0.00010628730524331;4.0120732592186e-05;-6.6348977270536e-05;-4.8687317757867e-05;-8.0014498962555e-05;0.00255789863877;0.0001336586283287;-0.0006108625093475;-0.00053544546244666;-0.00098908401560038;-0.00075850461144;-0.00010395900608273;2.4596353842554e-09;1.325033736066e-05;0.00010042391659226;-3.4360491554253e-05;-1.961207271961e-05;-6.6819006860896e-06;-1.9319819330121e-05;-4.2282485082978e-05;4.1547900764272e-05;-7.4556752224453e-05;-8.5509862401523e-05;-1.2218074516568e-05;0.00056359835434705;-7.8968761954457e-05;4.8955091187963e-05;-3.5515331546776e-05;-9.5689047157066e-06;4.3550069676712e-05;-0.00012177706958028;-5.3728483180748e-05;-0.00015055935364217;2.509572004783e-05;-2.4281074729515e-05;0.00028561451472342;0.00056495785247535;0.00028850141097791;-0.00015646326937713;-0.00060090969782323;-0.00011093055218225;-0.00071510148700327;4.9148944526678e-05;0.00021699670469388;5.2614803280449e-05;3.767183443415e-06;-3.8038324419176e-06;4.2019593820442e-05;2.2250740130403e-06;4.7581801482011e-05;-3.4925989893964e-05;8.5923333244864e-05;9.5503091870341e-05;-0.00014264583296608;-1.5721159797977e-05;4.2272713471903e-05;-0.00010253774962621;0.00018204336811323;5.9291593061062e-05;-0.00013792651589029;4.1923603930627e-06;-0.00026027087005787;-9.8490963864606e-06;-7.4160001531709e-05;-1.5095095477591e-05;0.00021932764502708;-7.1316411776934e-05;7.705639291089e-05;0.00012131334369769;-7.1819667937234e-05;0.00013118435163051;5.038655581302e-05;-0.00031693317578174;-3.8109265005914e-05;0.00046885767369531;5.8029912906932e-05;-0.00034458955633454;8.5269102783059e-06;9.0485780674499e-05;-1.7446889160055e-06;-5.674994099536e-05;4.7468260163441e-05;-0.00011161585280206;-0.00011550763156265;0.00026930269086733;-0.00021851957717445;0.0020721515174955;-0.00017340685008094;0.0002564350143075;5.7492838095641e-05;-0.00015036563854665;-3.2639531127643e-05;0.00034225516719744;-7.2162591095548e-05;0.00031762744765729;-2.3264536139322e-05;0.00027171589317732;0.00014399387873709;0.00035178440157324;0.00030060723656788;0.00011063714919146;-0.00088085199240595;0.00013286888133734;-0.0011872358154505;0.00012478748976719;-0.0010665430454537;0.00013587107241619;-0.00076783681288362;1.6524238162674e-05;-8.2924379967153e-05;1.350725597149e-05;-8.2156067946926e-05;-5.9506237448659e-05;5.7182402088074e-05;-0.00010330284567317;-0.00011607771011768;-1.1419409929658e-05;0.00078399799531326;-0.00011056185758207;5.6024055083981e-05;-5.5833228543634e-05;-4.0572949728812e-06;6.0849863075418e-05;-0.00016687945753802;-7.6809141319245e-05;-0.00021367573936004;3.866630140692e-05;-4.9172704166267e-05;0.00040248763980344;0.00081072899047285;0.00041619612602517;-0.00022877259470988;-0.00084605877054855;-0.00016648227756377;-0.0010136243654415;6.9173242081888e-05;0.00029579328838736;7.2239970904775e-05;3.2933938200586e-05;-4.4598541535379e-06;5.7328794355271e-05;2.5254562388e-06;7.0565321948379e-05;-5.1127859478584e-05;0.00012298287765589;0.00012863551091868;-0.00020303438941482;-2.4264862076961e-05;0.00011055253708037;-0.00014645798364654;0.00026628992054611;8.5346728155855e-05;-0.00019932683790103;8.3929489846923e-06;-0.00036849474417977;-1.7080768884625e-05;-9.1515961685218e-05;-2.2959933630773e-05;0.00032240169821307;-8.5466330347117e-05;0.00012831929780077;0.00017661129822955;-0.00010395874414826;0.00014919879322406;6.7663961090147e-05;-0.00047243447625078;-5.0625953008421e-05;0.00065330747747794;8.5315114120021e-05;-0.00052023096941411;1.1616835763562e-05;0.00012707043788396;-8.0499421528657e-07;-8.5920619312674e-05;6.8790839577559e-05;-0.00016307947225869;-0.00017309442046098;0.00039039977127686;-0.0003156843886245;0.0029712214600295;-0.00024692923761904;0.00036679510958493;8.0718491517473e-05;-0.00021310873853508;-4.5638516894542e-05;0.00049428921192884;-0.00010545863915468;0.00044904308742844;-3.3263331715716e-05;0.00038255495019257;0.00021711448789574;0.00051577121485025;0.00043100156472065;0.00016014701395761;-0.001285053556785;0.00018674872990232;-0.0017036619829014;0.00018315218039788;-0.0015278434148058;0.00019552317098714;-0.0010904578957707;2.3147524188971e-05;-0.00011926459410461;2.0111157937208e-05;-0.00011399188952055;-0.00033469533082098;0.00015969178639352;0.00090878480114043;8.1670797953848e-05;0.0011256322031841;-0.00021302013192326;6.1951730458532e-05;-0.00010917183681158;3.365931843291e-05;2.0177423721179e-05;0.00097702105995268;-0.00014728742826264;0.00085561460582539;-2.2064501536079e-05;1.5261912267306e-05;3.8974744143161e-07;-0.00055913691176102;-0.00046096407459117;-2.5726702006068e-05;0.00026828233967535;0.00032106245635077;-0.00024285497784149;0.00032545404974371;-0.0025052838027477;7.2273520345334e-05;-0.00031286256853491;5.8834641095018e-05;-0.00025128162815236;5.7260953326477e-05;-0.00015396387607325;-4.7094381443458e-06;0.00014267650840338;-2.847564064723e-05;-0.00033453622017987;0.00013641467376146;-0.0015437726397067;3.9602688048035e-05;5.6976678024512e-05;4.3920681491727e-05;-0.00014991132775322;9.1969464847352e-05;-0.0007018517353572;1.1009810805263e-05;-0.00067517079878598;7.4407500505913e-05;0.00016802678874228;-4.7378794988617e-05;-0.00023911656171549;-0.00029142692801543;-0.00017917079094332;0.00063497666269541;4.8181656893576e-05;0.00067420228151605;-2.6072564196511e-06;0.0018813669448718;-0.00011880091915373;6.4701547671575e-05;-1.2735189557134e-05;0.00020920175302308;-1.3796749044559e-05;7.7633354521822e-05;-1.6517469703103e-05;2.1873418518226e-05;-1.0664320143405e-05;0.00028239580569789;-1.8413138604956e-05;0.0025706652086228;-0.00025811578962021;0.00040176638867706;-0.00034487401717342;-0.00025194245972671;9.6505595138296e-05;-7.2967777668964e-05;-1.1372925655451e-05;0.00014184661267791;-7.1528003900312e-05;0.00037867442006245;-4.9735158427211e-06;3.5861587093677e-05;0.00046319226385094;0.00052882172167301;-0.00096614810172468;9.8618511401583e-05;-0.0017772687133402;0.00023900636006147;-0.00079420499969274;6.8163935793564e-05;-0.00097312813159078;0.00019381061429158;0.00010222945275018;2.2654687199974e-05;-8.2305356045254e-05;-8.1793659774121e-06;-0.00030850904295221;0.00014474481577054;0.00084310508100316;8.497953240294e-05;0.00091454415814951;-0.00016153790056705;-2.9167096727178e-05;-9.0123379777651e-05;0.00010304515308235;-1.8444055967848e-05;0.00096630054758862;-0.00013675718219019;0.0008668401860632;-2.3684186089667e-05;-8.9764020231087e-05;2.2220025130082e-05;-0.00053636159282178;-0.00047721687587909;-1.7656810086919e-05;0.00039107736665756;0.00026774290017784;-0.00015127056394704;0.00028941113851033;-0.0024743429385126;6.3319494074676e-05;-0.00011869153240696;3.1792460504221e-05;-0.00026296946452931;5.6988985306816e-05;-0.00014312058920041;-6.4946111706377e-06;8.5415791545529e-05;3.4816489460354e-06;-0.00011418911162764;0.00016702777065802;-0.0017384919337928;1.1805061149062e-05;-4.1559749661246e-05;5.2248946303735e-05;-8.9235218183603e-05;6.6493361373432e-05;-0.00062711688224226;-1.6320769645972e-05;-0.00064919656142592;8.2928534538951e-05;5.8670022553997e-05;-3.6255853046896e-05;-0.00041119771776721;-0.00041039224015549;-0.00019564885587897;0.00077013269765303;0.00013922237849329;0.00081277935532853;1.8248189007863e-05;0.0016296788817272;-0.00012231367873028;0.00031069564283825;-1.7548125470057e-05;0.00019925099331886;-4.6357126848307e-06;9.0624191216193e-05;-2.4600996766821e-05;4.5661683543585e-05;-8.0566242104396e-06;0.00026220694417134;5.5030031944625e-05;0.0022551827132702;-0.00027034731465392;0.00039855713839643;-0.00036555988481268;-0.00024425005540252;0.00010702767031034;-0.00011930169421248;-3.2240372092929e-05;0.0002250436518807;-5.2113809942966e-05;0.00038100959500298;-1.9792133798546e-07;-0.00013835058780387;0.00019299770065118;0.00045637154835276;-0.00055608397815377;0.00013694597873837;-0.0015867638867348;0.00035932764876634;-0.0007752520032227;4.0394472307526e-05;-0.0009544215281494;0.00018462548905518;0.00010765149636427;3.1073141144589e-05;-0.00011766198440455;-1.8505237676436e-05;-1.4172879673424e-05;-1.0747360192909e-06;0.00052360922563821;-0.00047520821681246;0.00040861664456315;-0.00039072037907317;0.00018707773415372;-0.00019659072859213;-4.7266680667235e-06;1.8041488146991e-05;-9.2793306976091e-05;0.00012040011642966;0.00010790421947604;-7.7801974839531e-05;-3.7301546399249e-05;3.6145302146906e-05;4.4835407607025e-05;1.8763621483231e-05;-6.6300577600487e-05;-0.0015285204863176;0.0013887247769162;-0.00024744402617216;0.00036057987017557;-7.8164222941268e-05;1.4879507943988e-05;-8.2198894233443e-05;7.7396252891049e-05;1.4970820302551e-05;-1.9800720110652e-05;-4.6829805796733e-05;3.7704216083512e-05;1.7038724763552e-05;1.9291241187602e-05;-0.00040266287396662;-0.00037047214573249;-0.00047494322643615;-0.0002564019523561;-1.2418089681887e-05;7.0731162850279e-05;-5.091713683214e-05;-7.3794661147986e-05;0.00013999776274431;9.7537224064581e-05;-0.0001595224312041;-0.00012740230886266;-6.9976304075681e-05;-4.1397379391128e-05;9.5560562840546e-06;-0.00082965532783419;0.00034710057661869;0.0010674273362383;0.00093700923025608;-0.00014995633682702;-0.00035412330180407;9.3391710834112e-05;5.7178709539585e-05;0.00027704570675269;0.00018180809274781;-5.0570386520121e-05;-1.4367646144819e-05;7.4410054367036e-05;4.9057853175327e-05;3.7549372791545e-05;2.0924273485434e-05;-8.8133790995926e-05;-0.00010112437303178;-3.0079772841418e-05;-0.00013761648733635;0.00025785324396566;0.00015631894348189;-2.3075379431248e-05;1.0100750841957e-05;2.1790954633616e-05;2.7399302780395e-05;9.6146686701104e-05;3.4334188967478e-05;-0.00010147995635634;-9.134178981185e-05;-0.00011122953583254;0.0022933348082006;0.0001921406656038;-0.00024152727564797;-0.0002452461339999;-0.0010438156314194;-0.00091579585568979;-9.5393239462283e-05;-5.5979658100114e-06;4.9892863899004e-05;0.00011299700418022;-6.483230390586e-05;-5.1830298616551e-05;2.186620804423e-05;1.5470715879928e-05;-1.3247156857688e-05;-9.3632360176343e-07;0.00053273647790775;-0.00046992342686281;0.00042650051182136;-0.00037689265445806;0.00018461429863237;-0.00019811683159787;-5.2769405556319e-06;1.6976144252112e-05;-9.5607960247435e-05;0.00012050860095769;0.0001146454087575;-7.1774113166612e-05;-3.097249646089e-05;4.1600484109949e-05;2.3338221581071e-05;-2.940194826806e-05;-6.8568588176277e-05;-0.0015168589306995;0.0014133631484583;-0.00023409948335029;0.00037036676076241;-8.8261076598428e-05;3.4972895264218e-06;-9.5355295343325e-05;6.6945467551704e-05;1.5777686712681e-05;-1.9857781808241e-05;-5.0425143854227e-05;3.4705615689745e-05;1.7474012565799e-05;1.8570637621451e-05;-0.00040057898149826;-0.00037741695996374;-0.00046719028614461;-0.00026747252559289;-2.2029214960639e-05;7.8877725172788e-05;-5.0199898396386e-05;-7.4608229624573e-05;0.00013916721218266;9.927895735018e-05;-0.0001593332272023;-0.00012939880252816;-6.5696738602128e-05;-4.618715684046e-05;1.2961229003849e-05;-0.00083409860963002;0.00034888504887931;0.0010413911659271;0.00096710538491607;-0.00012910690566059;-0.00037377534317784;9.4638475275133e-05;5.8421512221685e-05;0.00027308892458677;0.00018820250988938;-4.9565325753065e-05;-1.5247522242134e-05;7.2594702942297e-05;5.1248269301141e-05;3.4755186788971e-05;2.3713528207736e-05;-7.1441456384491e-05;-0.00012168308603577;-1.1506161172292e-05;-0.00015891977818683;0.00026569928741083;0.00014872755855322;-2.4651239073137e-05;1.1878316399816e-05;1.9141758457408e-05;3.1622097594664e-05;9.5349801995326e-05;3.3871732739499e-05;-0.0001014423178276;-9.2579073680099e-05;-0.00011118436668767;0.0022949154954404;0.0001927201228682;-0.00028249804745428;-0.00020009903528262;-0.0010584066621959;-0.00090407743118703;-9.5442243036814e-05;-3.9642354749958e-06;4.4829896069132e-05;0.00012003150186501;-6.3536972447764e-05;-5.4139240091899e-05;2.2646920115221e-05;1.5668138075853e-05;-0.00011358929623384;0.00020775874145329;-3.0853807402309e-05;-0.00055840180721134;0.00015492011152674;-0.00077632343163714;7.300795550691e-05;-3.0235230951803e-05;-2.0297050014051e-06;-2.2692433049087e-05;0.00011269786045887;-0.00052886357298121;2.4047776605585e-05;-0.00043598629417829;-4.9256404963671e-06;1.2909256838611e-05;0.00030939793214202;0.00017316383309662;-4.5669112296309e-05;-0.00020589238556568;-1.7581684005563e-05;-0.00016193595365621;0.00027055444661528;-7.4188872531522e-05;0.0014015542110428;-4.9471280362923e-05;0.00015868611808401;-4.197376256343e-05;0.00013785914052278;5.784727363789e-06;5.8272195019526e-05;-3.9445349102607e-06;4.5321583456825e-05;8.9843408204615e-05;-8.742119098315e-05;3.638035923359e-05;-0.00094787881243974;4.387672743178e-05;-1.6848085579113e-05;4.0100061596604e-05;-6.2177059589885e-05;4.3506206566235e-06;-0.00032321125036106;4.9978290917352e-05;-0.00038645675522275;-2.6276369681e-05;4.7368335799547e-05;-0.00018220147467218;-0.00017970165936276;-0.00010744878090918;5.290659100865e-05;0.00036527463817038;-3.9061273128027e-05;0.0004713938687928;-8.5735649918206e-05;0.0009144761133939;-1.4342219401442e-05;0.00014812973677181;-1.088219050871e-05;0.00012180148041807;-7.6240899034019e-06;5.0009577535093e-05;-2.0098015738768e-05;5.0142829422839e-05;3.4005352063105e-05;5.5918557336554e-05;-0.00010913493315456;0.00093829917022958;-0.000162786222063;0.00013798126019537;4.9242760724155e-05;-0.00013006843801122;1.6275688494716e-06;-0.00017436087364331;-1.8893455489888e-05;-0.00010559279326117;-6.8476642809401e-06;0.00019199738744646;-3.9623846532777e-05;0.00018357852241024;0.00027414452051744;4.2046471207868e-05;-0.00029911036835983;9.8680495284498e-05;-0.0007860166952014;-3.4159386359534e-06;-5.2197658078512e-05;9.5342424174305e-05;-0.00032599049154669;6.2628628256789e-06;0.00010979428043356;-7.65243476053e-06;-2.7274667445454e-05;-0.00030982430325821;0.00014376422041096;0.00088069908088073;7.7100208727643e-05;0.0010742731392384;-0.0001801710750442;-1.0635029866535e-05;-0.00010907384421444;9.4624156190548e-05;-1.9330645955051e-05;0.00094985048053786;-0.0001360500609735;0.00087172380881384;-3.3043357689166e-05;-7.9313511378132e-05;2.3015756596578e-05;-0.00051957811228931;-0.0003947108052671;3.0519840947818e-05;0.00026529547176324;0.00027134534320794;-0.00028421927709132;0.00028136363835074;-0.0025031701661646;7.2501978138462e-05;-0.00015782695845701;4.7949237341527e-05;-0.0002549726923462;5.8844896557275e-05;-0.00014500752149615;-5.943822543486e-06;6.6668981162366e-05;8.4575485743699e-06;-0.00011129759514006;0.00015034544048831;-0.0016894964501262;2.3297043298953e-05;-6.3000290538184e-05;6.6667787905317e-05;-7.5560514233075e-05;5.7677247241372e-05;-0.00055567448725924;-1.5786348740221e-05;-0.00064381910488009;8.1506987044122e-05;3.637139161583e-05;-3.4241711546201e-05;-0.0003735028731171;-0.00037799481651746;-0.00019359415455256;0.00071497680619359;0.00012706969573628;0.00081394525477663;-8.6377904153778e-06;0.0015434430679306;-0.00011535480734892;0.00034394089016132;-2.4885590391932e-05;0.00017461180686951;-6.031110387994e-06;0.00010294196545146;-2.3044429326546e-05;6.7729808506556e-05;-1.7555621525389e-05;0.00021771337196697;5.7752058637561e-05;0.0019227567827329;-0.00023803775548004;0.00035484362160787;-0.00032407572143711;-0.00022733277000953;0.0001003337019938;-0.00020567193860188;-2.1089777874295e-05;0.00014227199426387;-4.2332649172749e-05;0.00035008243867196;-3.8670923458994e-06;-0.00013566695270129;0.00017583764565643;0.00040562433423474;-0.00048611333477311;0.00012676950427704;-0.0013890413101763;0.0003103852213826;-0.00053196935914457;2.3880107619334e-05;-0.0008370874566026;0.00016672283527441;0.00012976641301066;2.4968003344839e-05;-0.00010070815915242;-1.6887966921786e-05;-0.00035311141982675;0.0001611365005374;0.00097679102327675;0.0001180512845167;0.00080955115845427;-0.00012153584248153;-0.0001704791066004;-7.8076285717543e-05;0.00024255800235551;-7.8638870036229e-05;0.0012577165616676;-0.00015851369244047;0.0011900295503438;-3.043301148864e-05;-0.00026911296299659;5.961696660961e-05;-0.00067197176394984;-0.00072019296931103;-5.5668046115898e-05;0.00079163879854605;0.00026504963170737;2.7309064535075e-05;0.00034283331478946;-0.0032198494300246;6.4181578636635e-05;0.00011863078543684;-9.119610695052e-06;-0.00036554993130267;7.1971167926677e-05;-0.00018613251450006;-8.6799600467202e-06;8.3342192738201e-06;6.3637249695603e-05;0.00029130943585187;0.00027459987904876;-0.0025142827071249;-5.8109060773859e-05;-0.00019231971236877;6.7161759943701e-05;-2.3909338779049e-05;4.8844227421796e-05;-0.00071572524029762;-7.324406033149e-05;-0.00076013751095161;0.00011527465539984;-8.3034858107567e-05;-3.2260773878079e-05;-0.00086445832857862;-0.00071681197732687;-0.00026654172688723;0.001185066299513;0.00036455746158026;0.0012335281353444;6.9283531047404e-05;0.0016722882864997;-0.00016003361088224;0.00074133195448667;-1.4073782949708e-05;0.00024786219000816;1.3943153135187e-05;0.00012231468281243;-4.4394426367944e-05;8.618259744253e-05;2.8711210688925e-06;0.00035981799010187;0.00019697179959621;0.0026483822148293;-0.00040910660754889;0.00053841678891331;-0.0005466770962812;-0.00031375465914607;0.00016190187307075;-0.00019968248670921;-8.7469779828098e-05;0.00047376318252645;-3.9796304918127e-05;0.00051222927868366;1.1386693586246e-05;-0.00050362874753773;-0.00022524477390107;0.00050815154099837;-6.8693872890435e-05;0.00027634756406769;-0.0018871680367738;0.00072621233994141;-0.0011427038116381;1.6114325262606e-05;-0.0012750644236803;0.00024010561173782;0.00014784032828175;5.9565896663116e-05;-0.00022263161372393;-4.4638905819738e-05;-0.00028481788467616;0.00012372687342577;0.00081319583114237;0.0001147788061644;0.00043082362390123;-3.0493927624775e-05;-0.00025366747286171;-3.0237646569731e-05;0.00029535192879848;-0.0001056503970176;0.0011666319333017;-0.00012555802823044;0.0011417055502534;-2.5250743419747e-05;-0.00034390416112728;7.1576105256099e-05;-0.00060108053730801;-0.00075359304901212;-9.7209929663222e-05;0.00097527168691158;0.00017686490900815;0.00024410989135504;0.00027633714489639;-0.0030024452134967;3.8247639167821e-05;0.00030137127032503;-5.0869784899987e-05;-0.00034416539710946;6.1517777794506e-05;-0.00017784305964597;-4.7236767386494e-06;-6.5537278715055e-05;0.00010146477870876;0.00057779520284384;0.0002981833240483;-0.0024948704522103;-0.0001165931171272;-0.00023836130276322;4.2682091589086e-05;1.9914141375921e-05;2.8627773644985e-05;-0.00060631177620962;-0.00010634608770488;-0.00065785157494247;0.00010649319301592;-0.00016094007878564;-2.1067937268526e-05;-0.0010402345797047;-0.0007827608496882;-0.00023791207058821;0.0012306569842622;0.00046534609282389;0.0012118107406422;0.00011086004087701;0.0012946871574968;-0.00014541328710038;0.00086537859169766;4.3939116949332e-06;0.00021957287390251;2.9779330361634e-05;0.00011652164539555;-4.9967580707744e-05;0.0001063923118636;1.2092711585865e-05;0.00034623785177246;0.00027782426332124;0.0023682352621108;-0.00042557279812172;0.00051830097800121;-0.00057327235117555;-0.00029653508681804;0.0001695912797004;-0.00024113836116157;-0.0001146529102698;0.00054831960005686;-1.4466911125055e-05;0.00049784197472036;2.1271362129482e-05;-0.00071537151234224;-0.00055930530652404;0.00043779498082586;0.00040662451647222;0.00033430647454225;-0.0017009758157656;0.00087410007836297;-0.0011665001511574;-1.5123149751162e-05;-0.0012328712036833;0.00022552661539521;0.00015318664372899;6.9434761826415e-05;-0.00025217930669896;-5.9116890042787e-05;-0.0001693027006695;6.992318230914e-05;0.00052382214926183;6.1817918322049e-05;0.0003760360123124;-2.156212576665e-05;-0.0001458501938032;-2.8950573323527e-05;0.00018051578081213;-6.5666506998241e-05;0.00072251399978995;-7.1591828600504e-05;0.00074321439024061;-2.4779274099274e-05;-0.00020348820544314;4.4536380300997e-05;-0.00035134103382006;-0.00042750150896609;-3.765161454794e-05;0.0005486331647262;0.00010361282329541;8.1892096204683e-05;0.00016612488252576;-0.0019404282793403;2.8898666641908e-05;0.00015218471526168;-2.3681630409556e-05;-0.00020651560043916;3.819445555564e-05;-0.00012404876179062;4.3922742065661e-07;-6.95514245308e-05;7.3654337029438e-05;0.00044057995546609;0.00017611069779377;-0.0014851010637358;-8.0273734056391e-05;-0.00015189329860732;3.1277941161534e-05;1.6350057194359e-05;1.3247838978714e-05;-0.00032525646383874;-7.0480149588548e-05;-0.00038742809556425;5.9690137277357e-05;-0.00010810153617058;-1.4435297089221e-05;-0.00065324926981702;-0.00043809998896904;-0.00013190756726544;0.00068612914765254;0.00030243510263972;0.00071898224996403;4.2892315832432e-05;0.00070103909820318;-8.1331978435628e-05;0.00054036016808823;8.7563912529731e-06;0.00011823203385575;2.0858089555986e-05;7.5329946412239e-05;-2.881574073399e-05;8.165819599526e-05;5.6055764616758e-06;0.00022098570480011;0.00018455855024513;0.0013068254338577;-0.00025856858701445;0.00029881368391216;-0.00034260062966496;-0.00017864372057375;0.00010541774099693;-0.00023839120694902;-6.9444802647922e-05;0.00029671247466467;-1.6989412188195e-07;0.0003011858498212;1.1062417797802e-05;-0.00048926414456218;-0.00039271343848668;0.00024841539561749;0.00032969014137052;0.00022642304247711;-0.00096051697619259;0.0005364561220631;-0.00059447210514918;-2.277689964103e-05;-0.00071331451181322;0.00013379863230512;0.00012638015323319;4.1150782635668e-05;-0.00015598500613123;-3.8277954445221e-05;3.3051574064302e-06;-1.9174885892426e-05;0.00048278400208801;-0.00044769863598049;0.00048545940080658;-0.00039836810901761;6.6630353103392e-05;-5.618507930194e-05;6.7688861236093e-06;2.1988037133269e-06;-0.00010000694601331;0.00013172760372981;0.00011094640649389;-7.5512165494729e-05;2.1332856704248e-05;-1.8601811461849e-05;6.9440488005057e-05;7.7363903983496e-05;-4.6103934437269e-05;-0.0017839171923697;0.0015773446066305;1.9727434846573e-05;3.351343139002e-06;-3.7527282984229e-05;-3.4467677323846e-05;-0.0001454501907574;0.00011889154848177;2.2540434656548e-05;-2.5203053155565e-05;-6.8973429733887e-05;5.7377168559469e-05;-1.1131201972603e-05;5.6029966799542e-06;-0.00050031649880111;-0.00048697571037337;-0.00057095155352727;-0.00036343481042422;-0.00011651635577437;-2.22348535317e-05;-3.2966276194202e-05;-6.2452352722175e-05;0.00016293606313411;0.00010613771883072;-0.00020057157962583;-0.00016651971964166;-6.5532665757928e-05;-3.6821129469899e-05;0.00039526229375042;-0.0011593042872846;0.00030639566830359;0.00095156067982316;0.00085711170686409;0.0001395884755766;-6.6709442762658e-05;0.00017637698329054;0.00015427889593411;0.00032541740802117;0.00022068919497542;-5.0417169404682e-05;-1.3544395187637e-05;7.4055817094631e-05;5.0986036512768e-05;4.4311185774859e-05;3.0051773137529e-05;-0.00034384839818813;-0.0003392081707716;-0.00020621018484235;-0.0002664930652827;0.00023590764612891;0.00015543453628197;-1.8625643861014e-05;9.9481858342187e-06;7.4319257691968e-05;8.0782767327037e-05;6.1695405747741e-05;8.7979751697276e-06;-0.00013034012226854;-0.00011820641520899;-8.9765148004517e-05;0.0016011112602428;0.0002058125246549;0.00026488039293326;0.00021675924654119;-0.00088749185670167;-0.00079168914817274;-3.0576939025195e-05;4.1590217733756e-05;0.00011495490616653;0.00015560819883831;-9.1473499196582e-05;-8.0900215834845e-05;4.9352816859027e-05;4.3510437535588e-05;4.2751362343552e-06;-1.9019769752049e-05;0.00050075328908861;-0.00043655512854457;0.00049796339590102;-0.00038977345684543;6.336608203128e-05;-5.9070083807455e-05;6.293780188571e-06;1.3583822919827e-06;-0.00010638153617037;0.0001295024267165;0.00011713890125975;-6.9693312980235e-05;2.7268830308458e-05;-1.3298836165632e-05;3.5569781175582e-05;2.9306707801879e-05;-4.7064673708519e-05;-0.0017711623804644;0.0016084576491266;3.3540363801876e-05;1.382347636536e-05;-4.6633420424769e-05;-4.5773627789458e-05;-0.00015619452460669;0.0001104788898374;2.4744342226768e-05;-2.4156141080311e-05;-7.295858085854e-05;5.3894083976047e-05;-9.4901452030172e-06;3.9351893974526e-06;-0.00050619419198483;-0.00048865121789277;-0.00056052848231047;-0.00037946735392325;-0.00012412952492014;-1.5942807294778e-05;-3.3325035474263e-05;-6.2354949477594e-05;0.00016384954506066;0.00010653924255166;-0.00020118901738897;-0.00016821883036755;-6.0616079281317e-05;-4.253630322637e-05;0.00039798294892535;-0.0011670425301418;0.00030857068486512;0.0009338241070509;0.00088544620666653;0.00015493590035476;-8.0449375673197e-05;0.00017934848438017;0.00015481750597246;0.00031962612411007;0.0002295705198776;-5.0289916543989e-05;-1.3727313671552e-05;7.2871080192272e-05;5.283553400659e-05;4.1658389818622e-05;3.2848322007339e-05;-0.00032313886913471;-0.00036332808667794;-0.00018439927953295;-0.00028976617613807;0.00023997329117265;0.00015361129771918;-2.0042569303769e-05;1.1368669220246e-05;7.1246788138524e-05;8.5823601693846e-05;6.1253755120561e-05;8.287714990729e-06;-0.00012835547386203;-0.00012197070464026;-9.012377995532e-05;0.0016094933962449;0.00020716802100651;0.0002097639371641;0.0002728246327024;-0.00089564948575571;-0.0007933207671158;-3.0901657737559e-05;4.28340426879e-05;0.00010811438551173;0.00016436194709968;-8.9833629317582e-05;-8.389622962568e-05;4.9187357944902e-05;4.4907214032719e-05;-8.037629595492e-05;0.0001738731371006;-1.7623035091674e-05;-0.00044759589945897;-4.2826806748053e-05;-0.0001134729682235;-3.5038792702835e-05;0.0002180742303608;9.8550124675967e-05;-0.00025466247461736;7.8360426414292e-05;-0.00073171261465177;3.5433029552223e-05;-0.00075675389962271;-5.9473240980878e-05;0.00030476899701171;0.00027794929337688;0.00045784685062245;0.00010400739120087;-5.1018250815105e-05;-0.0006469280924648;-9.528922237223e-05;-0.00031144224340096;-6.0391896113288e-05;0.0018566055223346;7.069264393067e-05;-0.00027053448138759;-4.1581388359191e-05;0.00025276982341893;-3.7758661619591e-06;9.1566012997646e-05;0.00013548696006183;-0.00014084590657149;0.00024804301210679;0.00079063622979447;-0.00018517536227591;-0.0016804682090878;-1.8934856598207e-06;-0.00019332341616973;8.0743546959638e-07;5.3730211220682e-05;-0.00013736431719735;-0.00035387487150729;6.3392348238267e-05;-0.00033504934981465;-9.6974763437174e-06;-0.00017438299255446;-0.00096268160268664;-0.00058442237786949;-0.00012008511112072;0.00049253646284342;0.00082776276394725;0.00010418691817904;0.00080498296301812;-8.4162864368409e-05;0.00050148391164839;4.6512115659425e-05;0.00067161273909733;4.1798357415246e-05;0.00017011645832099;-3.891506275977e-05;4.9253521865467e-05;3.9176506106742e-05;6.9084075221326e-05;0.00033532831002958;0.00015949262888171;-0.00030258265906014;0.0012104483321309;-0.00039933863445185;0.00029471490415744;0.00012145253276685;-0.00020190871146042;-0.00014956470113248;-0.00019684854487423;3.5063869290752e-05;0.000289530842565;1.8425975213177e-05;0.00033872650237754;-0.00076219218317419;-0.00068650132743642;0.00028764238231815;0.00027545000193641;0.00085839629173279;0.000686498824507;-0.0010261251591146;-6.2694256484974e-05;-0.00063762435456738;0.00014268906670623;-0.0006856091786176;6.7176741140429e-05;0.00012464199971873;-6.1777573137078e-05;-0.00018117246509064;-0.00012163301289547;0.00024953292449936;-3.5537537769414e-05;-0.00065184553386644;2.4698047127458e-06;-0.0003528430534061;-7.3675723797351e-06;0.00024365067656618;0.00011581750004552;-0.00030861102277413;0.00012414180673659;-0.00098401797004044;4.7013476432767e-05;-0.0010280943242833;-7.5801683124155e-05;0.00036121960147284;0.00041620098636486;0.000629807356745;0.00011157367407577;-0.00012090011296095;-0.00079473713412881;-0.00019632057228591;-0.00028272820054553;-9.0648522018455e-05;0.0025328963529319;6.8720051785931e-05;-0.00025924592046067;-6.2069739215076e-05;0.000337401550496;4.7774608447071e-07;0.00013147827121429;0.00016668323951308;-0.00017295993166044;0.00030618999153376;0.00099144538398832;-0.0002133023517672;-0.0021204240620136;2.7989091904601e-05;-0.00025403566542082;3.4603181120474e-06;6.317413499346e-05;-0.00016546262486372;-0.00047074406757019;8.6164312961046e-05;-0.0004445745726116;-2.1263249436743e-05;-0.00020069928723387;-0.0011832955060527;-0.00067618559114635;-0.00017092862981372;0.00061168434331194;0.00095089146634564;7.5962539995089e-05;0.0010643996065482;-0.00011507981980685;0.00069441745290533;5.1321632781764e-05;0.00082763150567189;4.7405770601472e-05;0.00022461476328317;-4.537127824733e-05;6.0891106841154e-05;4.8568614147371e-05;7.9732708400115e-05;0.00038608256727457;0.00025967886904255;-0.00041458726627752;0.0016528993146494;-0.00051195174455643;0.00039402558468282;0.00015715847257525;-0.00027008773759007;-0.00017941594705917;-0.0002709532273002;2.8560740247485e-05;0.00035401186323725;1.5659505152144e-05;0.00044930071453564;-0.00091150787193328;-0.00076745677506551;0.00038844044320285;0.00037383928429335;0.00088047701865435;0.00084809173131362;-0.0013779513537884;-5.8060279116035e-05;-0.00080314080696553;0.00020347480312921;-0.0009075595298782;8.2296588516328e-05;0.00017468181613367;-7.1754206146579e-05;-0.00023255392443389;-0.00013643229613081;0.00025951891439036;-5.0400256441208e-05;-0.00069876614725217;8.5829255112913e-05;-0.0005529947229661;3.2124764402397e-05;0.00015800930850673;8.073615754256e-05;-0.00023107898596209;0.00014275053399615;-0.00089030200615525;3.9785954868421e-05;-0.00092778686666861;-5.6459295592504e-05;0.00026040768716484;0.00045606735511683;0.0005555585375987;6.8988738348708e-05;-0.00019643374253064;-0.00058878213167191;-0.00023623240122106;-9.9589939054567e-05;-9.3363967607729e-05;0.0023372657597065;2.4076900444925e-05;-0.0001072030281648;-6.4617466705386e-05;0.00029685223125853;6.0598918025789e-06;0.00012641126522794;0.00011321995407343;-0.00010122431558557;0.00025074093719013;0.00066175812389702;-0.00012742867693305;-0.0018093555700034;4.5306056563277e-05;-0.00019546454132069;1.5591595001752e-05;2.4733031750657e-05;-0.0001136828068411;-0.00044724639155902;8.2496844697744e-05;-0.0004468138795346;-2.5914876459865e-05;-0.00012150630209362;-0.00089087535161525;-0.00051887187873945;-0.00016146135749295;0.00044259973219596;0.00077345641329885;2.0581284843502e-05;0.00092518603196368;-0.00011735212319763;0.00080253829946741;2.6699155569077e-05;0.00063676084391773;2.8335718525341e-05;0.00020196451805532;-3.4533441066742e-05;5.9762969613075e-05;3.1639527151128e-05;5.6900084018707e-05;0.00025725711020641;0.00026353166322224;-0.00035797219607048;0.0016433368436992;-0.00042146121268161;0.00036168613587506;0.00013320411380846;-0.00025090712006204;-0.00012475354014896;-0.00022649038874079;-4.6065983383414e-07;0.00026362668722868;6.8437196887317e-07;0.00041149739990942;-0.00062106025870889;-0.00039460495463572;0.000381272402592;0.0002937366371043;0.00035621205461212;0.00062025996157899;-0.0013247431488708;-2.0685827621492e-05;-0.00067343504633754;0.00019532347505447;-0.00083439046284184;6.0511702031363e-05;0.00015581712068524;-4.7055356844794e-05;-0.00018847704632208;-0.00012513023102656;0.00023013960162643;-3.7199777580099e-05;-0.00064183864742517;0.00015615833399352;-0.00079501786967739;7.2362119681202e-05;1.8007176549872e-05;2.5489329345874e-05;-8.800325304037e-05;0.00012836030509789;-0.00064094876870513;3.5014345485251e-05;-0.0006208642735146;-2.1324960471247e-05;8.7456392066088e-05;0.00036684685619548;0.00025886847288348;-3.1997602491174e-05;-0.00021858274703845;-0.00013638318341691;-0.00019211685867049;0.00022704714501742;-8.8761662482284e-05;0.0017385551473126;-3.8968308217591e-05;0.00010075611498905;-5.2829323976766e-05;0.00019005208741874;6.1241066759976e-06;8.8729968410917e-05;3.1582836527377e-05;-1.873838073152e-06;0.00013422343181446;0.00013201769615989;-3.208855559933e-06;-0.0012067296775058;5.2945375500713e-05;-8.821788651403e-05;2.8914908398292e-05;-2.8662796466961e-05;-3.0014371077414e-05;-0.00033773769973777;6.2450744735543e-05;-0.00040943495696411;-2.4996305000968e-05;-1.5465941032744e-05;-0.00038278146530502;-0.00027758025680669;-0.0001269736821996;0.00016439174942207;0.00047911013825797;-3.3386415452696e-05;0.00062614219496027;-9.6620336989872e-05;0.00085502432193607;-8.4222465375206e-06;0.00032345060026273;-3.4077493182849e-07;0.00013659197429661;-1.6066533135017e-05;6.1668128182646e-05;-8.115564014588e-06;5.6287623010576e-05;9.6654235676397e-05;0.00012459498248063;-0.00017690411186777;0.0010731867514551;-0.00022565890685655;0.00020461314124987;7.4633469921537e-05;-0.00016654268256389;-3.0386692742468e-05;-0.00021571460820269;-1.2984840395802e-05;1.7908557765622e-06;-8.670549505041e-06;0.00025896870647557;-0.00020569679327309;2.8328666303423e-05;0.00028819686849602;0.00011566447938094;-0.00012016632535961;0.00023225086624734;-0.00089467078214511;-1.114886799769e-05;-0.00018690293654799;0.00012325520219747;-0.00047179512330331;1.9867824448738e-05;0.00013181721442379;-1.6922102076933e-05;-7.78299436206e-05;-0.00031103123910725;0.00013088203559164;0.0010077123297378;9.7831165476236e-05;0.0011349098058417;-0.00012686365516856;-0.00015034392708912;-0.0001216914752149;0.00025694913347252;-9.2325346486177e-05;0.0012240112992004;-0.00013604326522909;0.0013249394251034;-5.7954777730629e-05;-0.00026898275245912;7.2150425694417e-05;-0.00060836359625682;-0.00063220650190488;2.4473039957229e-05;0.00066636886913329;0.00023160660930444;-0.0002044696448138;0.00035731651587412;-0.0034404285252094;7.7139739005361e-05;4.3007108615711e-05;9.4766537586111e-06;-0.00034394819522277;7.267118053278e-05;-0.00023414805764332;-2.6444511149748e-06;-0.00014118103717919;0.00012657210754696;0.00077108782716095;0.00025250544422306;-0.0022377895656973;-0.00011633096437436;-0.0002629418449942;0.00010141386883333;3.812666182057e-05;1.3338391909201e-05;-0.00046275061322376;-0.00010989399015671;-0.00059517764020711;9.4683338829782e-05;-0.00017458556976635;-3.5674886021297e-05;-0.00098822801373899;-0.00055805034935474;-0.000224765681196;0.00085952162044123;0.00048428602167405;0.0011612928938121;-3.0257551770774e-05;0.0010178214870393;-0.00012199550110381;0.0008450317545794;9.1643987616408e-06;0.00017073353228625;2.8428654331947e-05;0.00012308925215621;-3.7474099372048e-05;0.00014423743414227;-4.7089878307816e-07;0.00040552488644607;0.0002717298339121;0.0018396513769403;-0.00040831012302078;0.00044178467942402;-0.00050456530880183;-0.00027794938068837;0.00016232243797276;-0.00052733859047294;-9.3199516413733e-05;0.00035820752964355;-1.9703059024323e-06;0.00046446229680441;5.591997251031e-06;-0.00074857514118776;-0.00052509765373543;0.00037184590473771;0.00036752718733624;0.00038333647535183;-0.0013976958580315;0.00076738157076761;-0.00067204487277195;-3.9559698052472e-05;-0.0010343649191782;0.00021690555149689;0.00026526534929872;5.7670775277074e-05;-0.00023812035215087;-5.4182648455026e-05;-0.00027835869695991;0.00011492868361529;0.00086054479470477;9.7213924163952e-05;0.00075847655534744;-5.7986762840301e-05;-0.00021111313253641;-7.3021459684242e-05;0.00028521323110908;-0.00010499426571187;0.0011810299474746;-0.00011955244553974;0.0012351247714832;-4.4878364860779e-05;-0.00031803504680283;7.62577765272e-05;-0.00056362617760897;-0.00068691093474627;-3.4164291719208e-05;0.00083927396917716;0.00017339030455332;2.7031095669372e-05;0.00030741706723347;-0.0031975214369595;5.6519100326113e-05;0.00019138990319334;-2.7949039576924e-05;-0.00034080326440744;6.4259751525242e-05;-0.00020731771655846;-1.8378593722446e-06;-0.00013727364421356;0.00012962469190825;0.00080573069863021;0.00027360982494429;-0.0023279280867428;-0.0001373186823912;-0.00026976098888554;7.4493655120023e-05;4.5945620513521e-05;1.269904714718e-05;-0.00049296725774184;-0.00011815687321359;-0.00058221921790391;9.5585543022025e-05;-0.00019169961160515;-2.8034039132763e-05;-0.0010643813293427;-0.00066000147489831;-0.00022439550957642;0.00099570001475513;0.00051564659224823;0.0011822425294667;3.2474610634381e-05;0.0010024515213445;-0.00012498520663939;0.00088803604012355;1.4146520697977e-05;0.00018590495164972;3.3492506190669e-05;0.0001143332265201;-4.2995787225664e-05;0.00013679606490768;8.0362096923636e-06;0.00036884684232064;0.00030284721287899;0.0019293068908155;-0.00042245115037076;0.00046080342144705;-0.00054532941430807;-0.00027664221124724;0.00016678914835211;-0.00042794633191079;-0.00011189342330908;0.00044977274956182;2.273107156725e-06;0.00046506564831361;1.7569580450072e-05;-0.00081216392572969;-0.0006731852190569;0.00037357630208135;0.00057205394841731;0.00038585270522162;-0.0014460585080087;0.00087208254262805;-0.00086669356096536;-4.0316772356164e-05;-0.0010805074125528;0.00021451502107084;0.00022332546359394;6.6116226662416e-05;-0.00025002611801028;-6.2415056163445e-05;2.6880361474468e-05;-3.4448716178304e-05;0.00012253609020263;-0.00016724287706893;0.00031250240863301;-0.00021363042469602;-3.92500696762e-05;6.6550564952195e-05;9.6180301625282e-06;-7.3799574238365e-06;-3.294770795037e-05;6.8483132054098e-05;5.7106466556434e-05;-3.6630834074458e-05;4.8805690312292e-05;-4.9287598812953e-05;9.9313707323745e-05;0.00010571802704362;-1.467198762839e-05;-0.0011054745409638;0.00091522635193542;0.00017197012493853;-0.00023207180493046;3.4395408874843e-05;-6.7545362981036e-05;-0.00012173359573353;9.2897127615288e-05;3.9441110857297e-06;-9.854840754997e-06;-4.7352245019283e-05;4.3574971641647e-05;-4.3186049879296e-05;-1.3954440873931e-05;-0.00029244320467114;-0.00033784945844673;-0.00027235152083449;-0.00016894521832;-0.00011406593694119;-5.994075036142e-05;-8.5468218458118e-06;-3.1798081181478e-05;0.00010773263784358;6.5261730924249e-05;-0.00012837740359828;-0.00011742830974981;-2.2506523237098e-05;-7.4698931484818e-07;0.00065344315953553;-0.00061988906236365;0.00013493454025593;0.0001992759789573;0.00019353133393452;0.00019794462423306;9.0085784904659e-05;0.00012298361980356;0.00014506821753457;0.00017796552856453;0.00011121647548862;-2.3925476853037e-05;-2.7846524517372e-06;3.4623782994458e-05;2.4672506697243e-05;2.104831764882e-05;1.70123494172e-05;-0.00046138916513883;-0.00040957040619105;-0.00032765293144621;-0.00029372546123341;7.1139947976917e-05;2.464696081006e-05;7.9483174886263e-07;1.1564121450647e-05;9.0307214122731e-05;8.6300628026947e-05;-6.3419349771721e-07;-2.436992690491e-05;-8.9522327471059e-05;-6.8976565671619e-05;3.9874048525235e-05;0.00011438766523497;8.6804408056196e-05;0.00066630553919822;0.00049860205035657;-0.000235790386796;-0.000168802740518;5.9764170146082e-05;8.874975173967e-05;0.00013100744399708;0.00012331320613157;-7.041927165119e-05;-6.1944156186655e-05;4.425134829944e-05;3.6923589505022e-05;3.2287833164446e-05;-4.6758035750827e-05;0.00033318850910291;-0.00034187079290859;0.00056380697060376;-0.00040652367169969;-3.6693039874081e-05;7.142383401515e-05;1.1614089999057e-05;-7.2984980761248e-06;-8.1637343100738e-05;0.00012368259194773;0.00010705064050853;-6.6014901676681e-05;7.9080877185334e-05;-7.3021110438276e-05;0.00011248052760493;0.00013654585927725;-2.9441205697367e-05;-0.0019487427780405;0.0016719209961593;0.00023814823362045;-0.00030215652077459;2.6424822863191e-05;-9.8897435236722e-05;-0.00021329418814275;0.00016089573909994;1.6883363059605e-05;-2.0360010239528e-05;-8.4368584793992e-05;7.1643218689132e-05;-5.527243411052e-05;-1.7959660908673e-05;-0.00055272888857871;-0.00058184243971482;-0.00051823182730004;-0.00034594986937009;-0.00018843779980671;-9.0040521172341e-05;-1.9525155948941e-05;-5.5346099543385e-05;0.00018951777019538;0.00011499482934596;-0.00022660540707875;-0.00020002905512229;-4.4753338443115e-05;-1.5632132999599e-05;0.00096007605316117;-0.0011828490532935;0.0002516285458114;0.00054772233124822;0.00052039866568521;0.00032755485153757;0.00012920847802889;0.00022512982832268;0.00023738147865515;0.00031850763480179;0.00021456119429786;-4.7271969378926e-05;-8.466980943922e-06;6.6763299400918e-05;4.7497698687948e-05;4.013239959022e-05;3.255466799601e-05;-0.00068108644336462;-0.00064220686908811;-0.00046649857540615;-0.00046596402535215;0.00016098404012155;8.8747139670886e-05;-5.7219872360292e-06;1.6365031115129e-05;0.00013828024384566;0.00013897678581998;9.8164628070663e-06;-3.2959069358185e-05;-0.00015260525105987;-0.00013042495993432;2.7777314244304e-05;0.00062198779778555;0.00017694690905046;0.00088075804524124;0.0007417660090141;-0.00056246481835842;-0.00047184946015477;7.7006494393572e-05;0.00013050786219537;0.0002008950104937;0.00021160500182305;-0.0001169559545815;-0.00010603028931655;7.4197247158736e-05;6.5463296778034e-05;3.2306259527104e-05;-4.5848653826397e-05;0.00037851481465623;-0.00032099112286232;0.00057257758453488;-0.00040586787508801;-3.8694379327353e-05;6.3346524257213e-05;1.0868351637328e-05;-7.670369996049e-06;-9.6253199444618e-05;0.00011780069326051;0.00011456648644526;-5.8802514104173e-05;8.4795035945717e-05;-6.5964122768492e-05;4.6503504563589e-05;7.551258750027e-05;-3.0130760933389e-05;-0.0019345777109265;0.0017254697158933;0.00025098479818553;-0.0002810166333802;1.3675386071554e-05;-0.00011276925943093;-0.00022268778411672;0.00015330758469645;2.2225583961699e-05;-1.767812318576e-05;-8.979197446024e-05;6.6289670940023e-05;-4.9873833631864e-05;-2.1160747564863e-05;-0.00057734333677217;-0.00057362619554624;-0.00050872401334345;-0.00037287105806172;-0.00019361216982361;-8.437767974101e-05;-2.1916990590398e-05;-5.3959323849995e-05;0.00019328080816194;0.00011357761832187;-0.00023003318347037;-0.00020045391283929;-3.8998325180728e-05;-2.4325679987669e-05;0.00095046736532822;-0.0012041745940223;0.00025659572565928;0.0005564876482822;0.00056180584942922;0.0003369387704879;0.00011771536810556;0.00023469193547498;0.00023372076975647;0.00031104040681385;0.00022940785856918;-4.8896581574809e-05;-7.7748718467774e-06;6.7320928792469e-05;4.9071404646384e-05;3.7965834053466e-05;3.5412769648246e-05;-0.00064417545218021;-0.00066988740582019;-0.00042669905815274;-0.00049493432743475;0.00016503216465935;9.6288778877351e-05;-7.9305509643746e-06;1.7573767763679e-05;0.00013365177437663;0.00014491227921098;1.0479889169801e-05;-3.2871776056709e-05;-0.00014768695109524;-0.0001389645767631;2.4616545488243e-05;0.00067461625440046;0.0001817647862481;0.00077504909131676;0.00081409473204985;-0.00057887006551027;-0.00050275202374905;7.4208044679835e-05;0.00012954995327163;0.00018791601178236;0.00022488774266094;-0.00011466901923995;-0.0001099884393625;7.2958238888532e-05;6.8450972321443e-05;2.2956064640312e-05;-3.0467568649328e-05;0.00023339346807916;-0.00016492743452545;0.00034875539131463;-0.00023784232325852;-3.383662624401e-05;4.5302458602237e-05;7.2581633503432e-06;-6.5194981289096e-06;-6.3032777688932e-05;6.4863859734032e-05;7.0982547185849e-05;-2.9623801310663e-05;5.7406497944612e-05;-3.87745021726e-05;-5.4091069614515e-06;1.9086823158432e-05;-1.626155244594e-05;-0.0011564508313313;0.0010608652373776;0.0001765191409504;-0.00018571165855974;8.9431623564451e-06;-8.2180318713654e-05;-0.00014116076636128;8.8523316662759e-05;1.5340850950452e-05;-7.8820949056535e-06;-5.7140710850945e-05;3.7024576158728e-05;-3.1059025786817e-05;-1.7321744962828e-05;-0.00035983536508866;-0.00034104048972949;-0.00029358835308813;-0.00023595872335136;-0.00012407300528139;-5.293184221955e-05;-1.3242372006061e-05;-3.0500177672366e-05;0.00011888095468748;6.648635462625e-05;-0.00014131555508357;-0.00012232450535521;-1.8676755644265e-05;-1.796244396246e-05;0.000612270552665;-0.00072696263669059;0.00015128772065509;0.0002981697616633;0.00032310988171957;0.00022054911823943;8.0077588791028e-05;0.00014874174667057;0.00014331199054141;0.00018150970572606;0.00014531624037772;-2.9262388125062e-05;-3.0405619781959e-06;3.9790415030438e-05;2.9593918952742e-05;2.1476045731106e-05;2.2784355678596e-05;-0.00039612225373276;-0.000443187833298;-0.00025936996098608;-0.00033058933331631;9.1731897555292e-05;5.4306943638949e-05;-4.369511771074e-06;1.1985888704658e-05;8.2638172898442e-05;9.4875947979745e-05;2.0462368865992e-06;-2.2922140487935e-05;-8.7176318629645e-05;-8.8438064267393e-05;2.1301886590663e-05;0.00033318783971481;0.00010819006274687;0.00046677357750013;0.00057992135407403;-0.00031997001497075;-0.00028556946199387;5.2201183279976e-05;8.3412109233905e-05;0.000113723850518;0.00014691860997118;-6.8860637838952e-05;-6.9466681452468e-05;4.4603213609662e-05;4.3963016651105e-05;-8.0848563811742e-05;0.00018240352801513;-6.2367403188546e-06;-0.00052323070121929;3.0043565857341e-06;-0.00045418675290421;1.3019764082856e-05;0.00017455710622016;9.4453273050021e-05;-0.00024253490846604;8.2010061305482e-05;-0.00078031606972218;5.5160242482089e-05;-0.0008673882111907;-6.2793042161502e-05;0.00027407993911766;0.00027493271045387;0.00043752338388003;4.8137615522137e-05;-7.2111426561605e-05;-0.0005474520730786;-0.00015345007705037;-0.00010095736797666;-8.3854029071517e-05;0.0021153278648853;4.3007923522964e-05;-0.00015398355026264;-4.7725163312862e-05;0.00026101266848855;-5.2735072131327e-06;0.00012371173943393;0.00015851559874136;-0.0001946744741872;0.00022397132124752;0.00097746856044978;-0.00019797810819;-0.0015750583261251;3.6574427213054e-05;-0.00022153559257276;-8.3729601101368e-06;6.8011089751963e-05;-0.00014482472033706;-0.00029654023819603;5.6577675422886e-05;-0.00030097941635177;-2.0964380382793e-05;-0.00018313575128559;-0.00097444938728586;-0.00045419775415212;-0.00011934049689444;0.00053578760707751;0.00059020722983405;1.4339371773531e-05;0.00081333145499229;-7.0109068474267e-05;0.0003461992891971;5.4491862101713e-05;0.00067482731537893;4.2572359234327e-05;0.00015220633940771;-3.1678773666499e-05;4.8757945478428e-05;3.960078174714e-05;8.3282800915185e-05;0.00033376889768988;0.00023154405062087;-0.00032795546576381;0.0010053158039227;-0.00039034429937601;0.00026659993454814;0.00012368758325465;-0.00019887184316758;-0.00014515501970891;-0.00035192412906326;3.9712442230666e-05;0.00021992514666636;1.1534579243744e-05;0.00033637622254901;-0.00082516047405079;-0.00073082779999822;0.00026194227393717;0.00034800978028215;0.0008675484568812;0.00068465794902295;-0.00090358773013577;-7.0532376412302e-05;-0.00044731260277331;0.00015104525664356;-0.00061883416492492;6.4061423472594e-05;0.00019224440620746;-6.1689490394201e-05;-0.00018866240861826;-0.00012838694965467;0.00028572211158462;-1.0572714927548e-05;-0.00080887327203527;3.8929672882659e-05;-0.00085490790661424;5.1392562454566e-05;0.00022874788555782;0.00013592414325103;-0.00035102484980598;0.00013370970555115;-0.0012046996271238;8.6859035945963e-05;-0.0013446231605485;-9.7090618510265e-05;0.00039161034510471;0.00042307187686674;0.00067444454180077;4.8871504986892e-05;-0.00012488903303165;-0.00078912230674177;-0.00028815638506785;-3.7558158510365e-05;-0.00013864647189621;0.0032710337545723;5.0765087507898e-05;-0.00016108618001454;-7.6378812082112e-05;0.00040489123784937;-4.3425902731542e-06;0.00019438556046225;0.00024465293972753;-0.000307566835545;0.00031999553903006;0.0015348902670667;-0.00029721882310696;-0.0022963713854551;8.46465700306e-05;-0.00035005362587981;-1.6513205991942e-05;0.00011147335317219;-0.00021781949908473;-0.00044045542017557;8.5490282799583e-05;-0.00042633095290512;-3.9304402889684e-05;-0.00027113436954096;-0.0014508387539536;-0.00061408389592543;-0.00019585504196584;0.00082310097059235;0.00074603204848245;-2.9115883080522e-05;0.0012501898454502;-0.00010064946400234;0.00046120313345455;8.0051577242557e-05;0.00099792878609151;6.1937040300108e-05;0.00023090987815522;-4.3142605136381e-05;6.3952022173908e-05;6.0176524129929e-05;0.00012234278256074;0.00048599918955006;0.00038610078627244;-0.00051327847177163;0.0014570967759937;-0.00058621109928936;0.00039747686241753;0.00018435533274896;-0.00029554404318333;-0.00021505616314244;-0.00055897078709677;5.3551368182525e-05;0.00031325643067248;1.5074842849572e-05;0.0004965933621861;-0.0012329673627391;-0.0010852380655706;0.0003856067196466;0.00055106356739998;0.0012403142172843;0.0010288964258507;-0.0013265595771372;-9.6257201221306e-05;-0.00062908750260249;0.00023621751461178;-0.00090266857296228;9.5536830485798e-05;0.00030643478385173;-9.0759713202715e-05;-0.00028349558124319;-0.00013563279935624;0.00028242598637007;-3.3043874282157e-05;-0.0008889693999663;0.00012343865819275;-0.0010535910259932;8.8523680460639e-05;0.00014908978482708;0.00010416702571092;-0.00027763369143941;0.00014652650861535;-0.0010596853680909;8.1464182585478e-05;-0.001243761042133;-7.6111122325528e-05;0.00029159834957682;0.00047897556214593;0.00055983051424846;-6.3643674366176e-06;-0.00020558122196235;-0.00054628163343295;-0.00030566015630029;0.00016237943782471;-0.00013436266453937;0.0030530046205968;4.0045162563729e-07;-1.7490792743047e-05;-7.8174911323003e-05;0.00034190519363619;-1.8420476521896e-07;0.0001987982832361;0.00020047764701303;-0.00025468284729868;0.00026696841814555;0.0012229296844453;-0.00022095716849435;-0.0019255487713963;9.3818271125201e-05;-0.00029381783679128;-9.6987205324695e-06;8.1673446402419e-05;-0.00017617481353227;-0.00034330767812207;7.8828743426129e-05;-0.00040638656355441;-3.9604237827007e-05;-0.00021435208327603;-0.0011701690964401;-0.00045481990673579;-0.00017037082579918;0.0006581952329725;0.00057284050853923;-7.5180192652624e-05;0.0010658832034096;-9.5177536422852e-05;0.00046160246711224;5.8274676121073e-05;0.00082441966515034;4.7245204768842e-05;0.00017533838399686;-3.4091637644451e-05;7.584439299535e-05;3.8338243030012e-05;0.00011250728130108;0.00037015750422142;0.000390587199945;-0.00043515261495486;0.0012841341085732;-0.0004676439857576;0.00034138740738854;0.00015775230713189;-0.00026709062512964;-0.00015555440040771;-0.00057045504217967;3.3911379432539e-05;0.00019691987836268;-3.7638183130184e-06;0.00044847288518213;-0.00096500461222604;-0.00072199216810986;0.00034550201962702;0.00047112809261307;0.00075380591442809;0.00076629285467789;-0.0011575992684811;-7.6544951298274e-05;-0.00039178528822958;0.00021636101882905;-0.0007845867658034;7.0741007220931e-05;0.00030249336850829;-6.5366933995392e-05;-0.00023795211745892;-0.00019925925880671;7.6249976700637e-05;0.00080694421194494;5.7700610341271e-05;0.0012088817311451;-0.00012893647362944;-4.9081158067565e-05;-0.00013755861436948;0.00016031990526244;-5.8622415963328e-05;0.00082722952356562;-8.5433770436794e-05;0.0010482746874914;-6.3070459873416e-05;-0.00013846065849066;5.093192885397e-05;-0.00041040842188522;-0.00035374806611799;9.4292139692698e-05;0.00028144687530585;0.00017594666860532;-0.00040974238072522;0.00028213477344252;-0.0026505247224122;6.8043278588448e-05;-0.00012545737263281;4.1041301301448e-05;-0.00021004873269703;5.3558069339488e-05;-0.00021545926574618;2.8159943212813e-06;-0.00018746389832813;0.00011976325913565;0.00078910851152614;0.00014579510025214;-0.0012685944093391;-0.00010190690954914;-0.00019358757708687;0.00010046887473436;4.3754702346632e-05;-6.2055487433099e-06;-0.00014541822019964;-8.9755230874289e-05;-0.00032006335095502;4.8223519115709e-05;-0.0001448360417271;-3.3633761631791e-05;-0.00069041334791109;-0.00018855447706301;-0.00011625592014752;0.00027555398992263;0.00037234244518913;0.00069170584902167;-0.00012553069973364;0.0003349035687279;-5.7684363127919e-05;0.00056990468874574;2.2919741240912e-05;5.5371103371726e-05;2.5265631848015e-05;9.1547510237433e-05;-1.6724688975955e-05;0.00013643529382534;-6.1452669797291e-06;0.00036438315873966;0.00020434994075913;0.00079082883894444;-0.00027373127522878;0.00023558181419503;-0.00029240743606351;-0.00017649345682003;0.00011003630061168;-0.0006537432782352;-5.3737770940643e-05;0.00010349267540732;1.6884918295546e-05;0.00030222156783566;-1.039305152517e-05;-0.00061718502547592;-0.00040133777656592;0.00018865772290155;0.00031065318034962;0.00033317800262012;-0.00067703798413277;0.00046264586853795;-4.7668330807937e-05;-5.8393412473379e-05;-0.00055664166575298;0.00014100428961683;0.00029583211289719;3.2178904803004e-05;-0.00016716710524634;-3.6281744542066e-05;3.7591165892081e-05;-4.4312822865322e-05;3.6215475120116e-05;-0.00012262813106645;0.00034821615554392;-0.00022233003983274;-6.217765621841e-05;9.9910015705973e-05;8.945102308644e-06;-8.0468907981412e-06;-1.7739195754984e-05;6.3377316109836e-05;5.3032919822726e-05;-3.318738163216e-05;6.6038955992553e-05;-6.6405904362909e-05;0.00013716035755351;0.00013533735182136;-1.1483120943012e-05;-0.0011737975291908;0.00094137096311897;0.00022260054538492;-0.00031372779631056;6.8991583248135e-05;-9.3673064839095e-05;-0.00014748357352801;0.00010912455036305;-2.7022902031604e-06;-5.9607914408843e-06;-4.9870050133904e-05;4.7613750211895e-05;-6.1694656324107e-05;-2.266732735734e-05;-0.00029904951225035;-0.00037700450047851;-0.00021482628653757;-0.00012168133980595;-0.00012657916522585;-6.9675937993452e-05;-6.9021998569951e-06;-3.4197528293589e-05;0.00011831959272968;7.0718466304243e-05;-0.00013341850717552;-0.00012949781375937;-1.3171042155591e-05;1.1088284736616e-05;0.00090404838556424;-0.00053774245316163;0.00012877270637546;-1.0467487300048e-05;1.6526924810023e-05;0.00021479328279383;0.00010519356874283;0.000126530387206;0.0001710048672976;0.00016490038251504;9.6004660008475e-05;-2.322797809029e-05;-1.4405293313757e-06;3.1532024877379e-05;2.3810720449546e-05;1.2632927791856e-05;1.348111891275e-05;-0.00059895380400121;-0.00052486697677523;-0.00042967713670805;-0.00036205459036864;4.3248335714452e-05;-7.5279658631189e-06;6.4282376115443e-06;1.4799107702856e-05;0.00011801527580246;0.00010853364074137;-2.1020374333602e-05;-4.2493196815485e-05;-9.8638898634817e-05;-6.9358386099339e-05;0.00012613614671864;-0.00019825040362775;7.4138719355687e-05;0.00088171899551526;0.00064319506054744;-0.00012619307381101;-4.788676960743e-05;0.0001020288982545;0.00012761623656843;0.00016587074787822;0.00014237473078538;-7.9810743045527e-05;-6.9475630880333e-05;5.3097952331882e-05;4.2891828343272e-05;5.818487261422e-05;-6.9271598476917e-05;8.8324341049884e-05;-0.00016002515621949;0.00059722905280069;-0.0003922956821043;-9.5541188784409e-05;0.00015035427350085;6.6059728851542e-06;-6.6242896537005e-06;-3.9172187825898e-05;9.0410954726394e-05;8.3403458120301e-05;-4.3282871047268e-05;0.00012053264799761;-0.00011127608013339;0.00015814919606782;0.00017793552251533;-1.7349508198095e-05;-0.0019049175316468;0.001580445910804;0.00035365991061553;-0.00048060910194181;0.00011640836601146;-0.00016961824439932;-0.00026294874260202;0.00018862624710891;-4.5605239051838e-07;-5.1037136472587e-06;-8.2869897596538e-05;7.109108264558e-05;-9.8442527814768e-05;-4.3327137973392e-05;-0.00053942814702168;-0.00061832985375077;-0.00028279318939894;-0.00017481035320088;-0.00019877575687133;-0.00010575716441963;-1.5687850464019e-05;-5.4352218285203e-05;0.00020417994528543;0.00011723031639121;-0.00022026336228009;-0.00021005966118537;-8.9227232820122e-06;1.7351243513986e-05;0.0015562267508358;-0.00081481161760166;0.00020856816263404;-9.4318784249481e-05;-3.5183773434255e-05;0.00032727778307162;0.00015119726595003;0.00022186187561601;0.00027868460165337;0.00023568820324726;0.00014970262418501;-4.1837942262646e-05;-2.8379108698573e-06;5.2535204304149e-05;3.9435974031221e-05;1.3192064216128e-05;1.9193377738702e-05;-0.00097928533796221;-0.00090772972907871;-0.00067182001657784;-0.00061555637512356;6.4235980971716e-05;-4.412533598952e-06;9.4032102424535e-06;2.3655957193114e-05;0.0002032440243056;0.00018974886916112;-5.1066654123133e-05;-8.2117541751359e-05;-0.00015633550356142;-0.00012168466491858;0.0002779983333312;-0.00028857280267403;0.00012180305202492;0.0013119180221111;0.001087078708224;-0.00019432661065366;-9.9610733741429e-05;0.00019015626457985;0.00022732959769201;0.00026626282487996;0.00024728523567319;-0.00013096042675897;-0.00011731334961951;9.0874797024298e-05;7.7412019891199e-05;5.7778790505836e-05;-6.8359469878487e-05;0.00013523596862797;-0.00011502828419907;0.0005871873581782;-0.00039063193253241;-9.7065923910122e-05;0.00014057628868613;5.6170015341195e-06;-6.0678330555675e-06;-5.4699296015315e-05;7.833765266696e-05;8.8763081294019e-05;-3.3618707675487e-05;0.00012369539763313;-0.00010452165588504;7.0523121394217e-05;0.00011668625666061;-1.7493735867902e-05;-0.0018451985670254;0.0016032148851082;0.00036224682116881;-0.00045333066373132;0.00010292468505213;-0.00018570419342723;-0.00026491392054595;0.00018185701628681;5.3950848268869e-06;-1.9060169620388e-07;-8.6858017311897e-05;6.3643485191278e-05;-9.1647278168239e-05;-4.7684603487141e-05;-0.0005647130892612;-0.00058749021263793;-0.00025801709853113;-0.00018627393001225;-0.00019591324962676;-0.00010063540685223;-1.9224067727919e-05;-5.1030816393904e-05;0.00020698778098449;0.00011159175483044;-0.00022172485478222;-0.00020379232591949;-1.791256636352e-06;1.0395002391306e-05;0.0015404913574457;-0.00079907110193744;0.00020900332310703;-9.7750911663752e-05;-3.1425559427589e-05;0.00031892748665996;0.00013968057464808;0.0002318939223187;0.00026516080833972;0.00021940546866972;0.00015778635861352;-4.3785363232018e-05;-7.8720552210143e-07;5.3209223551676e-05;3.822519647656e-05;1.0888476026594e-05;1.8944152543554e-05;-0.00093477853806689;-0.0009258848731406;-0.00061965070199221;-0.00064032064983621;6.1287100834306e-05;2.9041941616015e-06;7.255271611939e-06;2.4799437596812e-05;0.00019805745978374;0.00019330382929184;-5.1476527005434e-05;-8.2228893006686e-05;-0.00014615326654166;-0.00012926480849274;0.00028270232724026;-0.00025567426928319;0.0001224399311468;0.0011823012027889;0.0011532705975696;-0.00019064315711148;-0.00012241220974829;0.00018801345140673;0.00022495449229609;0.00024690013378859;0.00025893002748489;-0.00012710671580862;-0.00011886301217601;8.7923122919165e-05;7.9582372563891e-05;3.6580808227882e-05;-4.2388954170747e-05;8.6046769865789e-05;-3.0918337870389e-05;0.00031442131148651;-0.00020274994312786;-5.9717156545958e-05;8.0481499026064e-05;6.0064880926802e-06;-6.7324754127185e-06;-3.7437908758875e-05;3.8061069062678e-05;5.4386528063333e-05;-1.4768627806916e-05;6.797855894547e-05;-5.1890590839321e-05;1.8866334983159e-07;4.1187846363755e-05;-1.022536707751e-05;-0.0010203381534666;0.00091631960822269;0.00022169713338371;-0.00025994834140874;5.6932527513709e-05;-0.00011977049143752;-0.00014417737838812;9.1608650109265e-05;4.4753405745723e-06;3.9234541873157e-06;-5.1749106205534e-05;3.2516531064175e-05;-4.9945578211918e-05;-3.0380082534975e-05;-0.00032240137807094;-0.00030864373547956;-0.00014022005780134;-0.000112920308311;-0.00011133549560327;-5.4080344852991e-05;-1.3504718481272e-05;-2.876834878407e-05;0.00011771571007557;5.8401441492606e-05;-0.00012782214616891;-0.00011325319064781;1.2247072618266e-06;2.0811025933654e-06;0.00087497709318995;-0.00043807295151055;0.00012821971904486;-6.324101559585e-05;-2.3103488274501e-05;0.00017075992946047;6.2620150856674e-05;0.00013251721975394;0.00014028526493348;0.00012318919470999;9.7521507996134e-05;-2.4917544578784e-05;2.3865056846262e-06;3.0411591069424e-05;2.0299214156694e-05;5.0118328545068e-06;9.347411833005e-06;-0.00051815179176629;-0.00053977116476744;-0.00033437320962548;-0.00038045368273742;3.2233427191386e-05;3.7198017821538e-07;3.8557004700124e-06;1.57778722496e-05;0.00010992468742188;0.00011200134758838;-2.4485801986884e-05;-4.2369782022433e-05;-7.8252043749671e-05;-7.5281772296876e-05;0.00015644216910005;-0.00015508789510932;6.9617017288692e-05;0.00064255675533786;0.00071195606142282;-0.00010282448783983;-7.1865797508508e-05;9.9713201052509e-05;0.00012018436973449;0.00013078784104437;0.00015172650455497;-7.0814778155182e-05;-6.8261833803263e-05;4.6908575313864e-05;4.3577329051914e-05;-7.179836393334e-05;0.0002027462614933;4.821357288165e-05;-0.0005581098375842;1.5086706298462e-05;-0.0010277545079589;8.912699559005e-05;0.00013798495638184;0.00011517149687279;-0.00028266268782318;7.4918338214047e-05;-0.0010476158931851;0.00010312373342458;-0.0012117369333282;-9.4513918156736e-05;0.00030237264581956;0.00017642417515162;0.00051202223403379;-1.7686745195533e-05;-8.5098799900152e-06;-0.00058110855752602;-0.00028678707894869;0.00019172215252183;-0.00014485641440842;0.0028743026778102;3.6994752008468e-05;-1.8514227122068e-05;-5.8028032071888e-05;0.00035476012271829;-1.0924792150036e-05;0.00018563725461718;0.00026136616361327;-0.00037910032551736;0.00021449146152008;0.0017876842757687;-0.00032114403438754;-0.0016231668414548;0.0001224608568009;-0.00033773831091821;-3.800455306191e-05;0.00013645374565385;-0.00020869103900623;-0.00028105056844652;4.4246269681025e-05;-0.00019360438454896;-5.0607028242666e-05;-0.00025416319840588;-0.0012977374717593;-0.00027962168678641;-0.00014877507055644;0.0008256928413175;0.00013628107262775;-0.00015466212062165;0.00099782354664057;-3.4175784094259e-05;-8.4415529272519e-05;0.00010073857265525;0.00082505168393254;6.066343121347e-05;0.0001803885679692;-2.1716910850955e-05;1.5032332157716e-05;6.9283494667616e-05;0.0001117415522458;0.00044972338946536;0.00042661209590733;-0.00047255892422982;0.00072078173980117;-0.00049148255493492;0.00025904981885105;0.00015138917660806;-0.00021281668159645;-0.00020312219567131;-0.00066575116943568;6.641724758083e-05;0.00020474861958064;1.7230922821909e-05;0.00036895766970702;-0.0012482454767451;-0.0011922892881557;0.00024325304548256;0.00059619668172672;0.0013626337749884;0.00095092359697446;-0.00079897663090378;-9.9980992672499e-05;-0.00031914474675432;0.00019230843463447;-0.00057586602633819;8.5586572822649e-05;0.00034937867894769;-8.7682783487253e-05;-0.00025829905644059;-8.2212020060979e-05;0.00020184050663374;5.3491176004172e-06;-0.00074139185016975;0.00011454404011602;-0.0012369483010843;0.00012241421791259;7.2491879109293e-05;8.7185966549441e-05;-0.00022083273506723;9.3725393526256e-05;-0.00087734457338229;9.7869822639041e-05;-0.001153412158601;-7.0481357397512e-05;0.0002073749928968;0.00030614036950283;0.00039158470463008;-7.5554191425908e-05;-0.0001279789430555;-0.00032847875263542;-0.00029132101917639;0.00038475383189507;-0.00013313975068741;0.0027463990263641;-2.171692540287e-05;0.00011583304149099;-6.2974082538858e-05;0.00027227535611019;-7.5867205850955e-06;0.00021159136667848;0.00022216788784135;-0.00033210733090527;0.00018430860654917;0.0014631254598498;-0.00025307736359537;-0.0012878926936537;0.00011820226791315;-0.00027684480301104;-3.0657189199701e-05;0.00010524993558647;-0.00017712585395202;-0.00014208826178219;4.0511356928619e-05;-0.00018889780039899;-4.782196629094e-05;-0.00021404160361271;-0.0010580723173916;-0.00015219701163005;-0.00011102705320809;0.00066660228185356;4.4553409679793e-05;-0.00018032189109363;0.00079487514449283;-3.4285378205823e-05;-9.5618248451501e-05;8.272314153146e-05;0.00067904044408351;5.021156539442e-05;0.00010047379328171;-1.6703317669453e-05;4.6734927309444e-05;4.3217150960118e-05;0.00011273226846242;0.00034779999987222;0.00046448261127807;-0.00038817079621367;0.00055724947014824;-0.00035906137782149;0.00020319729810581;0.00012872615479864;-0.00019350140064489;-0.00014031282626092;-0.00073794741183519;5.2147515816614e-05;7.4885399953928e-05;-9.4745091701043e-06;0.00034329487243667;-0.0010033266153187;-0.00078261602902785;0.00020587141625583;0.0005223962944001;0.00082786870189011;0.00064980564638972;-0.00063207524362952;-9.5334609795827e-05;-2.948553810711e-05;0.00017474767810199;-0.00048197130672634;5.8816574892262e-05;0.00036821258254349;-6.0606569604715e-05;-0.00022156727209222;0.00016990833682939;-0.00015224065282382;-0.0013035205192864;-0.00040800910210237;5.3902469517197e-05;0.00036187577643432;-2.1644207663485e-05;0.00010366763308411;4.0598541090731e-05;-5.3847754315939e-05;0.00036106625339016;0.00018680428911466;-5.6997905630851e-05;-9.1468908067327e-05;-5.8424062444828e-05;3.8401209167205e-05;0.0013332463568076;0.00031690631294623;-3.3785772757255e-06;-0.00013429349928629;-0.00064263440435752;3.608893166529e-05;-0.00025674872449599;0.00027461381978355;0.00010779021249618;1.8586550140753e-05;-0.00012382496788632;-0.00017408256826457;-5.9605186834233e-05;7.9949750215746e-05;5.7314562582178e-05;-0.00025617223582231;6.9664209149778e-05;0.0012643630616367;-0.00026091598556377;0.00010428771929583;-3.0741506634513e-05;-0.00014522050332744;5.9463000070537e-05;9.0306166384835e-05;-5.7651413953863e-05;-0.0001199454345624;3.4061984479195e-05;0.00023646814224776;-0.00010960056533804;-6.0107635363238e-05;2.4159107852029e-06;8.8819288066588e-05;0.00033635148429312;1.8004844605457e-05;-0.0010066498070955;0.00011848864960484;0.0001451868301956;-0.00019675755174831;-0.00071468169335276;0.00014362328511197;0.00016042398056015;3.1832583772484e-05;0.00013748268247582;4.5585179577756e-06;-0.00012778867676388;4.0430742956232e-05;1.7925509382621e-05;7.6666619861498e-05;-0.00040548018296249;7.0067959313747e-05;-0.0010947121772915;-0.00012730706657749;-9.6493131422903e-05;-0.00031657179351896;7.4306393798906e-05;1.6026495359256e-05;-7.9659999755677e-05;-9.2970469268039e-05;6.6222521127202e-05;2.80991262116e-05;-0.0001552876929054;0.00011940375406994;-0.00057844707043841;-0.0017721557524055;-0.00012076820712537;0.0024355140049011;0.0001944373070728;0.00046320611727424;0.00095816125394776;-6.4891966758296e-05;4.0327533497475e-05;0.00040146772516891;-5.164942558622e-05;6.2179155065678e-05;3.9739174098941e-05;-3.6144519981463e-05;-7.1211288741324e-05;6.7708970163949e-05;-7.3750343290158e-05;-0.00021511178056244;8.8575776317157e-05;0.0005514066433534;-0.00033347358112223;-0.00010686749010347;0.00016966555267572;-8.2964452303713e-06;4.0977324715641e-06;2.2805847038398e-05;2.7507976483321e-05;3.2304124033544e-05;-6.553015055033e-07;0.00013987597776577;-0.00012421705469023;0.00017662862956058;0.00017419559299015;-8.670680472278e-06;-0.0015750814927742;0.0012619898188859;0.00036089392961003;-0.00050813256530091;0.00022527988767251;-0.00024092066450976;-0.000279103172943;0.00018818725948222;-2.5366171030328e-05;1.9166833226336e-05;-6.0245227359701e-05;4.9601487262407e-05;-0.0001257257827092;-6.3791238062549e-05;-0.00046626676339656;-0.00058027234626934;0.00011758082109736;0.000121890756418;-0.00014340522466227;-6.4735955675133e-05;-2.1768340957351e-05;-5.6479279010091e-05;0.00019288380281068;0.00010495414608158;-0.00017601723084226;-0.00018811179324985;4.0992916183313e-05;5.4622934840154e-05;0.0020547169260681;-9.8946919024456e-05;0.00017821120854933;-0.00088215351570398;-0.00072003802051768;0.00014047524018679;1.1378172075638e-06;0.00017588908667676;0.0002727264945861;7.2703820478637e-05;3.1398983992403e-05;-3.3331394661218e-05;1.5074222119438e-06;3.1415089324582e-05;2.7936253900407e-05;-4.1128358134301e-05;-1.2348147720331e-05;-0.0011486692819744;-0.0010758826974779;-0.00071178795769811;-0.00063724158098921;-3.1154861062532e-05;-9.0920402726624e-05;2.0727122318931e-05;2.6611856810632e-05;0.00026335881557316;0.00022901660122443;-0.00011437932698755;-0.00013190480240155;-0.00013212366320658;-9.1459936811589e-05;0.00066364707890898;-0.00091329688439146;5.8987534430344e-05;0.0013526482507586;0.0011318152537569;0.00012851176143158;0.00021662669314537;0.0002781780785881;0.00030466902535409;0.00027795589994639;0.0002421320969006;-0.00012748865992762;-0.00011115710367449;9.6443312941119e-05;7.9614219430368e-05;7.046068640193e-05;-7.7348646300379e-05;-0.00016625657735858;0.00013875027070753;0.00054448907030746;-0.00034057162702084;-0.00011424400872784;0.0001692459336482;-6.8358608587005e-06;3.4190470614703e-06;7.1639979069005e-06;1.8291066226084e-05;4.1596344090067e-05;6.8131776060909e-06;0.00014258500596043;-0.00012254017929081;9.0997957158834e-05;0.00013329552893993;-9.4211045507109e-06;-0.0015638574259356;0.0013173931511119;0.00038441564538516;-0.00050710432697088;0.00021191181440372;-0.00026392392464913;-0.00028012305847369;0.00018829843611456;-1.9948318367824e-05;2.4300892619067e-05;-6.6638218413573e-05;4.5385200792225e-05;-0.00012347540177871;-6.8777371780016e-05;-0.00050321698654443;-0.00055515090934932;0.00011947425809922;0.00011006272688974;-0.0001454629964428;-6.7710272560362e-05;-2.5406843633391e-05;-5.4137010010891e-05;0.0002018517407123;9.9867989774793e-05;-0.00018596574955154;-0.00018488455680199;4.4669817725662e-05;5.0478760385886e-05;0.0020786274690181;-0.00010925979586318;0.00018339911184739;-0.00087358726887032;-0.00073339161463082;0.0001413050777046;4.5121478251531e-06;0.00019329630595166;0.00026209026691504;7.0657530159224e-05;4.1647876059869e-05;-3.6578658182407e-05;4.894454832538e-06;3.4714328648988e-05;2.5455485229031e-05;-3.9204500353662e-05;-1.4407783964998e-05;-0.0011434495681897;-0.0011089427862316;-0.00068939162883908;-0.00068014318821952;-3.4907468943857e-05;-8.7337626609951e-05;1.9172513930243e-05;2.9205200917204e-05;0.00026337636518292;0.00023495232744608;-0.00011387727136025;-0.00013182109978516;-0.00012605651863851;-0.00010127462883247;0.00066415534820408;-0.00092502165352926;6.0852740716655e-05;0.0013024886138737;0.0012313830666244;0.00013787104398943;0.00020581946591847;0.00028038237360306;0.00030487170442939;0.00026676416746341;0.00025972072035074;-0.00012821165728383;-0.00011441868264228;9.5337927632499e-05;8.2112557720393e-05;4.0192251617555e-05;-4.4513577449834e-05;-6.7517670686357e-05;0.0001071730221156;0.00026932018226944;-0.0001627102465136;-6.8569548602682e-05;9.5018396677915e-05;2.1532478058361e-06;-3.8301991480694e-06;-6.020919954608e-06;6.1029645621602e-06;3.297414878034e-05;3.8202670111787e-06;7.1614282205701e-05;-5.7563818700146e-05;4.4088051254221e-06;5.2457886340562e-05;-6.3373145167134e-06;-0.00083659932715818;0.00073417724343017;0.00023150494962465;-0.0002860157401301;0.00010560327064013;-0.00015609557158314;-0.00014013830514159;8.8736596808303e-05;-7.9303781603812e-06;1.6725032764953e-05;-4.158816227573e-05;2.3448234060197e-05;-6.1368285969365e-05;-3.7825215258636e-05;-0.00027196705923416;-0.00026527268346399;3.858173295157e-05;3.4340268030064e-05;-8.1935955677181e-05;-3.70811430912e-05;-1.6510355635546e-05;-2.9411077775876e-05;0.000107233550807;4.5495173253585e-05;-0.00010455044684932;-9.5690433226991e-05;2.1720583390561e-05;2.1429686967167e-05;0.0010969864670187;-8.2546677731443e-05;0.0001143228073488;-0.00043166065006517;-0.00037263092235662;7.4320443673059e-05;-6.1600012486451e-06;0.00010679703700589;0.00012694337056018;5.1403716497589e-05;3.8546946598217e-05;-2.0992512872908e-05;5.7922184169001e-06;2.0338156900834e-05;1.1351285138517e-05;-2.1058998754597e-05;-1.1540564628376e-05;-0.00059360644081607;-0.00059549516299739;-0.00035157072125003;-0.00038184097502381;-1.5111140783119e-05;-4.4017822801834e-05;9.3519001893583e-06;1.7927372027771e-05;0.00013470975682139;0.00012495579721872;-4.8712299758336e-05;-5.9880821936531e-05;-6.4243940869346e-05;-5.7659013691591e-05;0.00033138701110147;-0.00047759807785042;3.8657814002363e-05;0.000684515805915;0.00072350417030975;5.7439003285253e-05;8.870232704794e-05;0.00013255362864584;0.00014532782370225;0.00013170854072087;0.00014400779036805;-6.7961838794872e-05;-6.1803199059796e-05;4.6851841034368e-05;4.0500442992197e-05;4.9731956096366e-05;7.6627856060441e-07;0.00017529247270431;0.00035815165028907;-0.00018273455498274;-0.00037916706060059;3.0760817026021e-05;5.4154828831088e-05;6.7668952397071e-05;-0.00013641621626448;-6.7056142142974e-05;-0.00058924435870722;7.7149350545369e-05;-0.00048238219460472;-7.5208117777947e-05;0.00016916367167141;-0.00045895992661826;0.00022254821669776;5.1912529670517e-06;0.00033204106148332;-0.00039202565676533;-0.00011495331273181;5.6133550970117e-05;-9.7944073786493e-05;0.0010612118057907;9.3162889243104e-05;-3.0919276468921e-05;4.194389020995e-06;0.00024068681523204;-2.0197574485792e-05;2.9198468837421e-05;0.00017662603931967;-0.00030524912290275;2.4107257559081e-06;0.0015241910004988;-0.00023030723968986;-0.00048592302482575;0.0001066568584065;-0.00021058005222585;-4.705472747446e-05;0.00011640503362287;-0.00010678820399335;-0.00019357954442967;-2.6883582904702e-05;0.00012561643961817;-3.9333463064395e-05;-0.00012756224896293;-0.00067926099291071;0.00012742422404699;-6.0082209529355e-05;0.00053777382709086;-0.00054401787929237;-0.00020385145035107;0.00044697162229568;5.7638131693238e-05;-0.00052364123985171;8.6827742052265e-05;0.00036547685158439;3.4393415262457e-05;0.00015858870756347;1.1220102351217e-05;-9.4105744210538e-05;8.5417392256204e-05;2.0813713490497e-05;0.00026723314658739;0.00019130237342324;-0.00029623508453369;-0.00010537675552769;-0.00032247067429125;6.067514186725e-05;6.7630055127665e-05;-4.6094937715679e-05;-0.00016385590424761;-0.00030218527535908;5.0369810196571e-05;0.00016443977074232;4.9384227168048e-05;8.7373511632904e-05;-0.00087888905545697;-0.0012085915077478;3.9481794374296e-05;0.00041439506458119;0.001450005103834;0.00077968317782506;-0.00011815789912362;-2.9921136956546e-05;-0.00027004326693714;7.1001857577357e-05;-8.5727217083331e-05;6.5004496718757e-05;0.00018199617625214;-7.1337199187838e-05;-0.0001473209267715;1.7238487544091e-06;8.2526363257784e-05;0.00012285793491174;-3.1916861189529e-05;-8.7664979218971e-05;-0.00074531638529152;7.3779323429335e-05;6.8809735239483e-05;8.5428786405828e-05;-0.00019202353723813;-8.0093277574633e-06;-0.00078614539233968;9.3174923676997e-05;-0.00081971945473924;-8.578415872762e-05;0.00021370491595007;-0.00019664863066282;0.00034287720336579;-2.0001427401439e-05;0.00019170327868778;-0.00045400063390844;-0.00021476382971741;0.00018271165026817;-0.00012355633953121;0.0018718432402238;6.2617800722364e-05;1.549193621031e-05;-2.3318742023548e-05;0.00028982863295823;-1.5878944395809e-05;0.00010566906712484;0.0002270439726999;-0.00036456127418205;8.5208084783517e-05;0.0017588840564713;-0.00029321282636374;-0.00084581755800173;0.00012705722474493;-0.0002679136232473;-4.8207701183856e-05;0.00013333953393158;-0.00015983116463758;-0.00020563759608194;-2.577168515927e-06;4.5569853682537e-05;-5.106196840643e-05;-0.00018135042046197;-0.00097006425494328;3.0802602850599e-05;-8.9630142610986e-05;0.00069964415160939;-0.00039379371446557;-0.00022033846471459;0.00064083765028045;2.9837550755474e-05;-0.00047578499652445;0.00010486617247807;0.00053556583588943;4.8622063332004e-05;0.00016331607184839;1.103179670281e-06;-6.1915081460029e-05;8.4067862189841e-05;5.5110052926466e-05;0.00034940170007758;0.00035968120209873;-0.00038380982005037;0.00016359673463739;-0.00038116771611385;0.00012657043407671;0.00010077854676638;-0.00010824437777046;-0.0001844398357207;-0.00050565006677061;5.9964735555695e-05;0.0001753472170094;3.1532574212179e-05;0.0002007344737649;-0.0010771467350423;-0.0012031465303153;0.00010891648707911;0.00052943284390494;0.001389768673107;0.00083704304415733;-0.00034147736732848;-6.2662649725098e-05;-0.00025941943749785;0.00012567693192977;-0.00026164430892095;7.4011426477227e-05;0.00028000635211356;-7.7857992437202e-05;-0.00020497445075307;-2.9159504265408e-05;0.0001065934629878;3.1901417969493e-05;-0.00044646966853179;6.132734415587e-05;-0.0010075910249725;0.00010796507558553;2.6520629035076e-05;6.2448423705064e-05;-0.000152090418851;3.7876601709286e-05;-0.00060846674023196;8.4443185187411e-05;-0.00086484313942492;-5.6843004131224e-05;0.00012973306002095;0.00011675673886202;0.0002595387340989;-7.6855249062646e-05;-3.0942876037443e-05;-0.0002108321787091;-0.00022817091667093;0.00036573954275809;-0.00010223020944977;0.0019868575036526;-1.4705386092828e-05;0.00014257301518228;-3.8742095057387e-05;0.00018641212955117;-1.0362048669776e-05;0.00017161764844786;0.00019092040020041;-0.00031003821641207;0.00010608482261887;0.0013640616089106;-0.00023129775945563;-0.00068431167164817;0.00010802072938532;-0.00021040659339633;-3.5919394576922e-05;9.7974705568049e-05;-0.00014301436021924;-3.7581383367069e-05;9.3008957264828e-06;-1.4455685231951e-05;-4.52221793239e-05;-0.00016633282939438;-0.00081504898844287;5.3479558118852e-05;-5.6504253734602e-05;0.00055772199993953;-0.0002779147180263;-0.00020520712132566;0.00048822502139956;5.6750118346827e-06;-0.00039557789568789;8.602169691585e-05;0.00045714413863607;4.2700645281002e-05;5.7011060562218e-05;-2.7471724024508e-06;7.2378684308205e-06;4.8714959120844e-05;7.4236348154955e-05;0.00026961375260726;0.00044917021295987;-0.00030848511960357;0.00014736177399755;-0.00024814895004965;0.00010094796016347;8.9696179202292e-05;-0.00011808015551651;-0.0001174064600491;-0.00065123493550345;4.8058012907859e-05;3.6674824514193e-05;-8.230192179326e-06;0.00022682988492306;-0.00085413845954463;-0.00068718485999852;0.00010295679385308;0.00046554621076211;0.00071840471355245;0.00049364723963663;-0.00027999299345538;-7.5575619121082e-05;6.5025422372855e-05;0.00012560888717417;-0.0002564039605204;4.6028817450861e-05;0.00032594034564681;-4.8088193580043e-05;-0.00018149249081034;0.00011807457485702;-9.1741960204672e-05;-0.00056245038285851;-0.0001432169083273;0.00037077773595229;0.00015659115160815;1.8418753825244e-05;-5.7747238315642e-05;3.762096457649e-05;-2.4925289835664e-05;0.00023669408983551;8.20696586743e-05;0.00025249601458199;-5.2213468734408e-05;-1.644880103413e-05;5.1709754188778e-05;0.00053531350567937;-0.00011217458086321;2.6948520826409e-05;0.00021512090461329;-0.00032547622686252;-0.00014876163913868;0.00010657096572686;-0.00042146648047492;4.8619000153849e-05;-0.00011009138688678;-5.903072815272e-05;-7.8996148658916e-05;-1.6324098396581e-05;-5.2417701226659e-05;1.6457503079437e-05;-0.00022151724260766;7.2499133239035e-05;0.0012201104545966;-6.2619015807286e-05;0.00029760846518911;-7.5747135269921e-05;-8.4189836343285e-05;0.00010715668759076;6.0205820773263e-05;-4.0119874029187e-05;-1.255394272448e-05;-1.1180358342244e-05;0.00025048264069483;-5.403841714724e-05;-3.9776874473318e-05;-3.8838137697894e-05;-0.00022742254077457;0.00052300450624898;5.0001268391497e-05;-0.00096622115233913;0.00021462474251166;-3.1702835258329e-05;-0.00032856853795238;-0.0007807711372152;4.6881286834832e-05;5.8484361943556e-05;6.2531529692933e-05;5.827834320371e-05;1.1655756679829e-05;-9.1390851594042e-05;3.3132877433673e-05;-3.3054628147511e-05;7.5464231485967e-05;0.00038120645331219;5.9255966334604e-05;-0.00035047516576014;-0.00017689121887088;-3.9662918425165e-05;-0.00014590824139304;6.8959666350565e-06;2.7518330171006e-05;-0.00040739573887549;-7.3026523750741e-05;6.6149223130196e-05;9.6976227723644e-06;2.5547255063429e-05;2.3394208255922e-05;-0.00052599277114496;-0.00070350203895941;-3.8066140405135e-05;0.0007370087550953;0.00031358192791231;0.00016975194739643;0.00040211202576756;-3.8674537790939e-05;1.9503206203808e-05;7.4136994953733e-05;3.6364679544931e-05;0.00022574316244572;2.9901413654443e-05;-0.00012033904931741;-3.024435864063e-05;0.00021992497204337;-0.00016825983766466;-0.0013235229998827;-0.00031845271587372;0.00024940026924014;0.0003507029323373;1.5385237929877e-05;-2.3308068193728e-05;4.1353952838108e-05;-4.1642771975603e-05;0.00036211268161424;0.00016732435324229;0.00012661196524277;-8.1311300164089e-05;-3.6095250834478e-05;7.8788434620947e-05;0.0011885704007;-4.9414709792472e-05;5.4837796596985e-06;0.00028378266142681;-0.00067699863575399;-7.6790558523498e-05;4.0212446037913e-05;-4.7381668991875e-05;8.9339817350265e-05;-8.4221217548475e-05;-0.00013547405251302;-0.0001585905556567;-4.4960601371713e-05;1.3600786587631e-05;3.3830259781098e-05;-0.00031549102277495;8.7231346697081e-05;0.0017891220049933;-0.00018214531883132;0.00052618986228481;-6.2392726249527e-05;-0.00012449186760932;0.00015168910613284;9.1950925707351e-05;-6.5619547967799e-05;-9.6140887762886e-05;1.7130947526312e-05;0.00040033904951997;-0.00010558376379777;-3.4152057196479e-05;-4.387931767269e-05;-0.00012720642553177;0.0008223841432482;7.4958901677746e-05;-0.0015876301331446;0.0002165896439692;-6.1155442381278e-05;-0.00048315926687792;-0.0011391068110242;0.00010532920714468;4.1363393393112e-05;7.4758143455256e-05;0.00013561719970312;9.0115981947747e-06;-0.00017283212218899;5.7321351050632e-05;-7.2459719376639e-05;0.00012366224837024;0.00027204112848267;4.1344519559061e-05;-0.00074928067624569;-0.00023059549857862;-9.3981441750657e-05;-0.00027031218633056;5.0309725338593e-05;2.622604915814e-05;-0.0003682536771521;-0.00011390363215469;0.00012146153312642;7.5698985710915e-06;-4.9457823479315e-05;7.649738836335e-05;-0.00069665862247348;-0.0014008992584422;-9.3200200353749e-05;0.001620678929612;0.00038965354906395;0.00037411949597299;0.00078794831642881;-0.00016791711095721;6.6100255935453e-05;0.00024839609977789;1.2491899724409e-05;0.00023447196872439;4.793486368726e-05;-0.00013813105761074;-5.5856959079392e-05;0.00029350054683164;-0.00022757933766115;-0.0019269447075203;-0.00047982891555876;0.0001659796689637;0.00050538434879854;8.3261847976246e-06;2.8896265575895e-05;4.2443582060514e-05;-5.6810134992702e-05;0.00046138057950884;0.00023924397828523;5.1557153710746e-06;-0.00010906143143075;-4.7803303459659e-05;9.0761626779567e-05;0.0017579082632437;9.0418216132093e-05;-7.1490358095616e-06;0.00022111342696007;-0.00095131254056469;-1.7684233171167e-05;-7.8358156315517e-05;0.00028382873279043;0.00012724634143524;-6.3422718085349e-05;-0.00019054232689086;-0.00021995039423928;-7.0024965680204e-05;7.121913949959e-05;5.3665542509407e-05;-0.0003756734658964;8.7733460532036e-05;0.0021180275361985;-0.00030462795984931;0.00062427530065179;-2.0513169147307e-05;-0.00015954197442625;0.00017251934332307;0.00011481171532068;-8.5702238720842e-05;-0.00015927103231661;5.2009319915669e-05;0.00047327959327959;-0.0001502610539319;-3.4786669857567e-05;-3.563026257325e-05;5.0716655096039e-05;0.00099717359989882;8.5933112131897e-05;-0.0020037502981722;0.00015534619160462;-4.6039043809287e-05;-0.00056550395675004;-0.0013185105053708;0.00016047566896304;5.209720984567e-05;6.7982793552801e-05;0.00019010540563613;3.8069406400609e-06;-0.0002209413505625;7.4459036113694e-05;-8.9423905592412e-05;0.00015315318887588;3.8816913729534e-05;5.6497856348869e-06;-0.0011458311928436;-0.00024949037469923;-0.00013849724200554;-0.00037934465217404;8.6445899796672e-05;2.386294909229e-05;-0.00030164903728291;-0.00013562112872023;0.00013544125249609;3.9161550375866e-06;-0.0001249407796422;0.00012794966460206;-0.00077093101572245;-0.002030162140727;-0.00014114062651061;0.0024728535208851;0.00040566458483227;0.00055863586021587;0.0011282440973446;-0.00020753953140229;0.00010888979159063;0.00041694194078445;-2.0003157260362e-05;0.0002171688247472;5.8656547480496e-05;-0.00013055263843853;-7.7163385867607e-05;0.00027621307526715;-0.00022017874289304;-0.0019171350868419;-0.00050234369700775;0.0001092204474844;0.00050011335406452;-7.8353139087994e-07;7.0146073994692e-05;3.6869867471978e-05;-5.7747452956391e-05;0.00044730477384292;0.00024126456992235;-6.6838932980318e-05;-0.00011001304665115;-4.6712539187865e-05;7.4598792707548e-05;0.0017993946094066;0.00021631528215948;-9.034058166435e-06;6.2004612118471e-05;-0.00092757923994213;1.642748429731e-05;-0.00017730992112774;0.00041670326027088;0.00013033019786235;-4.0015667764237e-05;-0.00018213492876384;-0.00021923609892838;-7.3337243520655e-05;9.3198817921802e-05;6.0294925788185e-05;-0.00034491386031732;7.2120594268199e-05;0.0018840782577172;-0.00033963829628192;0.00051478639943525;1.5073460417625e-05;-0.00015722619718872;0.00014276003639679;0.00010870880942093;-8.2649232354015e-05;-0.00016156850324478;6.568044773303e-05;0.00040928303496912;-0.00015299231745303;-3.5511337046046e-05;-1.7315038348897e-05;0.00018807484593708;0.00086834101239219;7.1736445534043e-05;-0.0018367904704064;7.1884511271492e-05;-4.6841779521856e-07;-0.00048074286314659;-0.0011464894050732;0.00017340084013995;7.1643698902335e-05;4.5649601815967e-05;0.00018512722454034;4.6322831792622e-08;-0.0002016099751927;6.9520356191788e-05;-6.9302295742091e-05;0.00013686611782759;-0.00019397682626732;-2.0146877432126e-05;-0.001230166410096;-0.0002069191832561;-0.00013976685295347;-0.00038357567973435;9.3093512987252e-05;1.8293067114428e-05;-0.00019306007015985;-0.00011909701424884;0.00010642486449797;2.2587244075112e-06;-0.0001565397833474;0.0001399108878104;-0.00066293502459303;-0.0020966273732483;-0.00014613717212342;0.0026534332428128;0.00032560669933446;0.00057966989697888;0.001152109936811;-0.00016054666775744;0.00011361863289494;0.00046016348642297;-4.1570099710952e-05;0.00015593040734529;5.2520917961374e-05;-9.2356836830731e-05;-7.7176198828965e-05;6.2124971009325e-05;-6.3440282247029e-05;-0.0005480531253852;0.00032619436387904;0.00046117245801724;-0.00024140885216184;-9.2777547251899e-05;0.00016065612726379;-2.389481778664e-05;1.6240035620285e-05;0.0001024359735311;-4.1835268348223e-05;-3.3798860386014e-05;4.719818389276e-05;0.00013967616541777;-0.00011944305151701;0.00022542366059497;0.00017108730389737;-4.4159341996419e-06;-0.0011753382859752;0.00086323404684663;0.00031893642153591;-0.00047323515173048;0.00034839054569602;-0.00030669223633595;-0.00026734033599496;0.00016564315592404;-5.7019115047297e-05;4.4939773943042e-05;-2.5409692170797e-05;2.0749288523803e-05;-0.00014083739370108;-7.3888855695259e-05;-0.00036411840119399;-0.0005340421339497;0.00053555628983304;0.00044594146311283;-6.3000887166709e-05;3.9905294215714e-06;-3.261733945692e-05;-6.4790525357239e-05;0.00016171202878468;8.5382023826241e-05;-0.00011902280675713;-0.00015836670354474;8.8903383584693e-05;9.1490575869102e-05;0.0024606618098915;0.00069629441713914;0.00017371532157995;-0.0016420633764938;-0.0013727684272453;-0.0001236321113538;-0.00023523208801635;0.0001155796344392;0.00025719861150719;-0.00010041265340988;-0.00010024473886006;-2.2443506168202e-05;3.9096053114918e-06;9.1674464783864e-06;1.7978711184696e-05;-0.00011100486153737;-5.4613330576103e-05;-0.0012505789054558;-0.0011720674810931;-0.0006429327186197;-0.00054690224351361;-9.8764270660467e-05;-0.0001571674074512;2.7003125069314e-05;2.4925993784564e-05;0.00032646738691255;0.00026428437558934;-0.00016626484284643;-0.00017410323198419;-9.9899560154881e-05;-4.8696718295105e-05;0.0011162355076522;-0.0012219744967297;1.5390149201266e-05;0.0011874495539814;0.00093810114776716;0.00032708037178963;0.00042257556924596;0.00032546458533034;0.00035351738915779;0.00025747224572115;0.00020302883058321;-0.00011903463746421;-9.7569391073193e-05;9.7065916634165e-05;7.5511903560255e-05;6.0980248235865e-05;-6.4223837398458e-05;-0.00048470610636286;0.00037071990664117;0.00044716379488818;-0.00025255515356548;-9.667868289398e-05;0.00015688491112087;-2.2606294805882e-05;1.6975709513645e-05;8.768532279646e-05;-5.04849376739e-05;-2.4593240596005e-05;5.4860280215507e-05;0.0001387158408761;-0.00011928684398299;0.00013643226702698;0.00013969419524074;-5.0690978241619e-06;-0.0011466862633824;0.00089942297199741;0.00032972623012029;-0.00046312020276673;0.00032487366115674;-0.00032496431958862;-0.0002618592698127;0.00016858370508999;-5.0968672439922e-05;4.89350350108e-05;-3.0302113373182e-05;1.6451036572107e-05;-0.00013743218732998;-7.5341093179304e-05;-0.00040046745561995;-0.00050361413741484;0.00052306504221633;0.00043684936827049;-6.1473983805627e-05;-5.2887020274284e-07;-3.525478678057e-05;-6.135613512015e-05;0.00016929546836764;7.7929304097779e-05;-0.00012860077549703;-0.00015089090447873;8.932406490203e-05;8.8880726252683e-05;0.0024447285104543;0.00067507335916162;0.00017273754929192;-0.0015967399813235;-0.0013749266508967;-0.00012234534369782;-0.00022228129091673;0.00013508443953469;0.00024352218315471;-9.917895658873e-05;-9.4924005679786e-05;-2.6150086341659e-05;7.0950973167783e-06;1.3666912309418e-05;1.4254635061661e-05;-0.00010517850023462;-5.8461275330046e-05;-0.0012346974108368;-0.0011751940473914;-0.00061106233624741;-0.00057032890617847;-9.9456330644898e-05;-0.0001506745320512;2.4423850845778e-05;2.6846044420381e-05;0.00032339862082154;0.00026556925149634;-0.00016538756608497;-0.00017221106099896;-9.2618160124402e-05;-5.6807995861163e-05;0.0011067166924477;-0.0012038414133713;1.72625441337e-05;0.0011234945850447;0.00098999228794128;0.00032673144596629;0.00040433861431666;0.00032633534283377;0.0003477638529148;0.00024269615823869;0.00021495939290617;-0.00011898914817721;-9.8190474091098e-05;9.5729330496397e-05;7.6841271948069e-05;0.00016233677160926;-0.00017312340787612;0.00037182026426308;0.0012007105397061;-0.00035289081279188;1.4298542510005e-06;-5.8323566918261e-05;2.4403011593677e-06;2.8573187591974e-05;-5.9963899730064e-06;-0.00020991876954213;-0.00023168206098489;7.9963247117121e-05;0.00013131197192706;-3.799552723649e-05;2.3862070520408e-05;-0.0012182380305603;-0.00019166458514519;4.6013124119781e-06;0.00062356633134186;4.809295933228e-05;0.00015858387632761;-4.4507007260108e-05;-8.4170111222193e-05;-0.0004166965954937;0.00012130472168792;7.7184076872072e-06;6.3933111960068e-05;0.00013649290485773;-4.7390523832291e-05;-9.4144401373342e-05;2.0908582882839e-05;-0.00017793173901737;-0.00028157533961348;0.00095011346274987;6.2450126279145e-05;0.00027246965328231;7.7221971878316e-05;-8.2827798905782e-05;-5.1507693569874e-05;6.2855280702934e-05;8.494796929881e-05;-0.00013089532149024;-0.00010937714250758;0.00020576720999088;4.1778680497373e-06;-8.5563933680533e-06;0.00030264715314843;0.00053149840096012;2.9632974474225e-05;-7.8028817370068e-05;-0.0011072979541495;-0.00026342386263423;1.2809010513593e-05;0.00013526136172004;-0.00050825264770538;2.1824591840414e-06;1.5344225175795e-05;-1.6282232536469e-05;0.00011917680240003;4.6051005483605e-05;-0.00011955860827584;8.9732748165261e-05;-6.8644672865048e-05;-8.3518621977419e-05;-0.00021744475816377;-8.5301966464613e-05;-0.0007193242199719;-0.00019692906062119;-8.5519575804938e-05;9.9384476470732e-07;6.2240622355603e-05;-6.6396627516951e-05;-1.2849955965066e-05;-1.0322742127755e-05;3.2375901355408e-05;8.5844752902631e-05;-0.00011030261521228;-0.00025380883016624;-0.001188438734971;-7.5355732406024e-05;0.00013252047938295;0.0015286846319214;0.00062321044970304;0.0003353008069098;0.000108983796963;-7.0357644290198e-05;-4.6199085772969e-05;0.00028344383463264;2.6862426238949e-05;4.878697291133e-05;-3.9230446418514e-05;-2.9035873012617e-05;8.7133754277602e-05;-6.085074346629e-05;0.00021390600886662;0.00062025932129472;-0.00023781784693711;-0.00026482425164431;2.339384991501e-05;2.7394360586186e-05;5.2577041060431e-05;-9.2790221970063e-05;-0.00010762564488687;-0.00046776270028204;7.3414106736891e-05;-0.00030293318559416;-7.0940506702755e-05;0.00012094005796826;-0.00065596005879343;0.00014952493074816;3.5153714179614e-06;0.00043364620069042;-0.00033271120628342;-7.822264888091e-05;4.4900603825226e-05;-8.7221080320887e-05;0.00061307474970818;0.00010652125638444;-8.7949429143919e-06;2.0531630070764e-05;0.00020487059373409;-2.332703115826e-05;-3.8217485780478e-06;0.00014066977018956;-0.00028020437457599;-6.2919767515268e-05;0.0014461216051131;-0.00017190635844599;-0.00014936760999262;0.00011002102837665;-0.00016598984075245;-4.9249116273131e-05;0.00010187616862822;-6.2944636738393e-05;-0.00016435435099993;-5.004987178836e-05;0.00019562192028388;-3.6603662010748e-05;-8.4273582615424e-05;-0.00045300324563868;0.00031919989851303;-2.2586269551539e-05;0.00040323240682483;-0.00080510083353147;-0.00025853820261545;0.0002647501823958;7.7420321758837e-05;-0.00062089087441564;7.7129152487032e-05;0.00022556880139746;2.2826447093394e-05;0.00014555858797394;2.3736445655231e-05;-0.00011575018288568;9.6159004897345e-05;-2.0937153749401e-05;0.00017366110114381;0.00019400211749598;-0.00025067140813917;-0.00025957025354728;-0.00026647170307115;8.2716906035785e-06;4.5899018005002e-05;-1.0119522812602e-05;-0.00014419539365917;-0.00024989343364723;3.3644024370005e-05;0.00013984757242724;5.1899278332712e-05;3.5791061236523e-05;-0.00073276669718325;-0.0011266071815044;1.8521218692058e-07;0.00036935298703611;0.0013272219803184;0.00068885035580024;3.0490424251184e-05;8.7348353190464e-06;-0.00023727990628686;4.5284628868103e-05;1.7086409570766e-05;5.60810258321e-05;0.00016424435307272;-6.0052607295802e-05;-0.00012814190995414;3.6505094612949e-05;3.2097309485835e-06;0.00012686883565038;0.00023942180268932;-0.00012416884419508;-0.00038301444146782;4.091851587873e-05;2.9856915716664e-05;5.0177262892248e-05;-0.00010288807970937;-4.5887121814303e-05;-0.00046441185986623;6.247222336242e-05;-0.00041440947097726;-5.9751138905995e-05;0.00012121134932386;-0.00032966278376989;0.00018678023479879;-8.2473561633378e-06;0.00024289469001815;-0.00029897326021455;-0.00011741466732929;9.6139883680735e-05;-7.8617013059556e-05;0.00090956839267164;6.3954605138861e-05;1.0194254173257e-05;-3.3567607715668e-07;0.00018470593204256;-1.4255829228205e-05;3.7157828046475e-05;0.00014109199400991;-0.00024838218814693;5.0661687964748e-06;0.0012355088256299;-0.00018180438200943;-0.00031669496092945;9.245696128346e-05;-0.0001598849776201;-3.7612873711623e-05;8.9168468548451e-05;-8.5621039033867e-05;-0.00013329037756193;-2.2327138140099e-05;0.00011202484165551;-3.5391029086895e-05;-9.5466930360999e-05;-0.00053681206190959;0.00016284247976728;-3.7066693039378e-05;0.00042276180465706;-0.0005013874033466;-0.00019234709907323;0.00031487894011661;4.4257703848416e-05;-0.00045688977115788;7.2760849434417e-05;0.00026752607664093;2.751718784566e-05;0.00011599941353779;1.0961350199068e-05;-7.3844064900186e-05;7.0597146986984e-05;7.8003786256886e-06;0.00019457632151898;0.00023463244724553;-0.00024105486227199;-5.2317205700092e-05;-0.00023586075985804;4.3639345676638e-05;5.3079405915923e-05;-4.0037270082394e-05;-0.0001247898908332;-0.00028930374537595;3.5061882954324e-05;0.00012063134636264;2.9726970751653e-05;8.5111350927036e-05;-0.00068605708656833;-0.0008627928327769;3.5441447835183e-05;0.00034741396666504;0.00099493842571974;0.00056086393306032;-9.7066775197163e-05;-1.9114188035019e-05;-0.00018956992425956;6.474773545051e-05;-8.1751386460382e-05;4.8871577746468e-05;0.00017165904864669;-5.0978022045456e-05;-0.00012809879262932;0.00027768212021329;-0.00018656482279766;-0.0014713577693328;-0.00030108340433799;0.00014740503684152;0.00037514237919822;2.5250998078263e-05;-4.0888662624639e-05;2.3617121769348e-05;-3.0441755370703e-05;0.0002256601001136;0.00017111864872277;6.100346945459e-05;-6.9715511926915e-05;-3.6361971069709e-06;8.5557010606863e-05;0.0012297842185944;-0.00013007633970119;-1.163960678241e-05;0.00039538062992506;-0.00072637881385162;-3.4279542887816e-05;9.2935493739787e-05;0.00019464876095299;7.495419413317e-05;-0.00010409300011816;-0.00014966654998716;-0.00010469877452124;-4.6792814828223e-05;4.4251009967411e-06;2.6748284653877e-05;-0.00026052925386466;4.1556450014468e-05;0.0017789339181036;-0.00016470866103191;0.00072871008887887;-1.4672408724437e-05;-8.7242988229264e-05;0.00016867012891453;7.9304052633233e-05;-6.5202664700337e-05;-0.00011632381210802;5.061814954388e-05;0.00045223557390273;-0.00010634354111971;-7.3473711381666e-06;-5.0926020776387e-05;-5.629245788441e-05;0.0010048319818452;0.00010387934889877;-0.0017695607384667;0.00013469948316924;-0.00018760382954497;-0.00056722207227722;-0.0011904869461432;7.5949421443511e-05;-5.5502012401121e-05;7.2972870839294e-05;0.00012777658412233;-6.3137065353658e-07;-0.00018494708638173;6.5405110944994e-05;-0.00015947814972606;0.0001553857291583;0.00053618120728061;-4.5193733967608e-05;-0.00058584683574736;-0.0002274058497278;-0.00010530241706874;-0.00021469021157827;5.2435774705373e-05;1.6402320397901e-05;-0.00039553205715492;-0.00011285075743217;0.00013872917043045;-1.9115428585792e-05;-2.5449184249737e-05;6.1198850744404e-05;-0.00059159781085327;-0.0011163713643327;-7.6988057116978e-05;0.0011450814781711;0.00039379976806231;0.00033570069354028;0.00062882562633604;-0.00024880064302124;0.00011212861863896;0.00020971098274458;2.212625258835e-05;0.00027193772257306;4.7831283154665e-05;-0.00016295051318593;-3.9902482967591e-05;0.000415260263253;-0.00028358804411255;-0.0024446423631161;-0.00051051256014034;0.00010653751087375;0.00061256129993126;3.2976171496557e-05;-1.8204900698038e-05;2.3317419618252e-05;-4.739598807646e-05;0.00037751393392682;0.00026913732290268;-5.2802006393904e-05;-0.00010720174759626;-8.051511940721e-06;0.0001232427166542;0.0020677852444351;-7.6038821134716e-05;-2.7444772058516e-05;0.00048614622210152;-0.001178412581794;5.106856860948e-06;4.4392563722795e-05;0.00058530207024887;0.00012711113959085;-0.00012234268069733;-0.00024195194419008;-0.00019059354963247;-7.7416036219802e-05;6.4526386267971e-05;4.5682361815125e-05;-0.00036375486524776;3.7388555938378e-05;0.0024938667193055;-0.00032047717832029;0.0010802020551637;5.7978366385214e-05;-0.00012508071085904;0.00024420727277175;0.00011173490202054;-9.9937664344907e-05;-0.00021523227042053;0.00010668807954062;0.00063388113630936;-0.0001740231673466;7.734775863355e-06;-5.7171859225491e-05;0.00016327714547515;0.0015233719022945;0.00015036531840451;-0.0026957702357322;4.4605669245357e-05;-0.00027149586821906;-0.00083610997535288;-0.0016318737762049;0.00013914122246206;-0.00010332919191569;7.5681695307139e-05;0.00021122732141521;-9.4255528892973e-06;-0.00027814385248348;0.0001004738805932;-0.00024652705178596;0.00022682995768264;0.00050692132208496;-0.00014467482105829;-0.00099501200020313;-0.00029111071489751;-0.00017178989946842;-0.00035264066536911;9.5831310318317e-05;1.4916045074642e-05;-0.00041730669909157;-0.00015110164531507;0.00018501248268876;-4.3085143261123e-05;-8.7423293734901e-05;0.00012064084876329;-0.00070236838655546;-0.0018549134256318;-0.00012926370254718;0.0020007209386677;0.0004840569163207;0.00055650633294135;0.0010426975786686;-0.00037092744605616;0.00020451590535231;0.0003876767877955;-7.0810972374602e-07;0.0003269808657933;6.7155589931644e-05;-0.00019985607650597;-6.1753766203765e-05;0.00039239693433046;-0.00027167276130058;-0.0024619505275041;-0.00051941198762506;6.5920845372602e-05;0.00060441601090133;2.9969151000842e-05;1.2270101251488e-05;1.2892614904558e-05;-4.5193126425147e-05;0.00038303059409373;0.00026154122315347;-0.00013213969941717;-0.00010393249249319;-3.0597550448874e-06;0.00011000441736542;0.002109533874318;2.3783921278664e-05;-2.8071686756448e-05;0.00035270105581731;-0.0011629732325673;2.7493668312673e-05;-2.9337003070395e-05;0.00072342756902799;0.00012807060556952;-0.00010957591439364;-0.00023438245989382;-0.00019940576748922;-7.6855918450747e-05;9.2720496468246e-05;4.7789406380616e-05;-0.00033064570743591;1.6174657503143e-05;0.0022394647821784;-0.00036486456519924;0.0010316689731553;0.00012560930917971;-0.000113559399324;0.00022686079319101;0.00010038272012025;-9.7799551440403e-05;-0.00021934208052699;0.00012565364886541;0.00056755909463391;-0.00017819355707616;1.9981534933322e-05;-3.8224054151215e-05;0.00036908400943503;0.001482158433646;0.0001425197115168;-0.0026211438234895;-9.8275508207735e-05;-0.00025989767163992;-0.00079245143570006;-0.0014456984354183;0.000153523782501;-0.00011394583270885;4.3566669774009e-05;0.00020779446640518;-1.4992280739534e-05;-0.00026047643041238;9.750785829965e-05;-0.00023971468908712;0.00020941528782714;0.00026480157976039;-0.00021275103790686;-0.0010298128472641;-0.00024208547256421;-0.00017341246712022;-0.000354128977051;0.0001006073289318;7.9252313298639e-06;-0.0002887440205086;-0.00012383627472445;0.00014804930833634;-5.5727523431415e-05;-0.00011259906023042;0.00013304417370819;-0.00050842150812969;-0.0018802182748914;-0.00013077234325465;0.0020790337584913;0.0003867854247801;0.000567821203731;0.0010522725060582;-0.00032192267826758;0.00022664525022265;0.00041672409861349;-2.2455316866399e-05;0.00026148179313168;5.822442471981e-05;-0.00015888978668954;-5.7338977057952e-05;4.1384304495296e-05;-3.9300219214056e-05;-0.00082210754044354;0.00051087443716824;0.00032823547371663;-0.00012570718536153;-6.3015286286827e-05;0.00012884009629488;-3.5844495869242e-05;2.5973495212384e-05;0.00018065424228553;-0.00010752460366348;-0.00010092496086145;9.2353518994059e-05;0.00011964730947511;-9.6720599685796e-05;0.00026819115737453;0.00015466536569875;-3.327792910568e-06;-0.00073155481368303;0.00043613414163701;0.00024441981804557;-0.00038527185097337;0.00044699231511913;-0.00034776428947225;-0.00022351958614308;0.00012079696898581;-8.6727683083154e-05;6.7017586843576e-05;1.4528831343341e-05;-1.1398148672015e-05;-0.00013704126467928;-7.1068090619519e-05;-0.00025114612071775;-0.00046783915604465;0.00086487818043679;0.00070357625372708;2.11559690797e-05;7.775351696182e-05;-4.3286498112138e-05;-7.2163398726843e-05;0.00011175997497048;5.691401383956e-05;-5.9382575273048e-05;-0.00012189639528515;0.0001243486040039;0.00011681881005643;0.0026247445493937;0.0013627621810883;0.000177292196895;-0.0021732572931796;-0.0018229035194963;-0.000379532284569;-0.00046930677490309;5.9073787269881e-05;0.00023133396462072;-0.0002467464946676;-0.00021149864187464;-9.6899821073748e-06;5.3253447731549e-06;-1.0766965715447e-05;9.7880611065193e-06;-0.00017820371431299;-9.6635863883421e-05;-0.0012320855166763;-0.0011573712108657;-0.00045786178088747;-0.00035745001514442;-0.00012880860595033;-0.00018626239034347;2.6078345399583e-05;1.7905853383127e-05;0.00037225705455057;0.00028377663693391;-0.00019499180780258;-0.00019749549392145;-6.0632854001597e-05;-2.2517538127431e-06;0.0015112593537197;-0.0011808091076091;-1.0224937341263e-06;0.00081973825581372;0.00056131498422474;0.00037669643643312;0.00047901755897328;0.00031713806674816;0.00035611377097666;0.00020021742966492;0.00013563632091973;-0.0001034872548189;-7.7343174780253e-05;9.0087589342147e-05;6.5475425799377e-05;3.7592577427858e-05;-3.8445650716312e-05;-0.00073934282409027;0.00056492176372558;0.00030713342130184;-0.00013927002146374;-6.6000604419969e-05;0.00012352125486359;-3.3906839234987e-05;2.7456475436338e-05;0.00016402333858423;-0.00011847198766191;-8.8941917056218e-05;0.00010261092393193;0.00011573451774893;-9.7508542239666e-05;0.00016003887867555;0.00012679384963121;-4.0187915146817e-06;-0.00069123442517594;0.0004684574669227;0.00025066061061807;-0.00037194319884293;0.00041210249764845;-0.00037013832479715;-0.0002123796439264;0.0001255706010852;-7.9133322287817e-05;7.1796195697971e-05;9.1275560407666e-06;-1.6805781342555e-05;-0.00013267392932903;-7.022619683994e-05;-0.00029338139574975;-0.00043004789040424;0.00083894602721557;0.00069698551669717;2.469206447131e-05;7.1865229983814e-05;-4.5784054236719e-05;-6.8174813350197e-05;0.00012015265383525;4.5867371227359e-05;-7.1193833719008e-05;-0.00011074030771852;0.0001221802958753;0.00011551748320926;0.0025891005061567;0.0013329009525478;0.00017427396960557;-0.002099804347381;-0.0018235171446577;-0.00037824964965694;-0.00045080602285452;8.3650331362151e-05;0.00021429540356621;-0.0002412152098259;-0.00020920869428664;-1.4724214452144e-05;9.3217167886905e-06;-4.3403447307355e-06;4.3385562094045e-06;-0.00016920597408898;-0.00010392504191259;-0.0012129060924053;-0.0011437451466918;-0.00041598279494792;-0.0003701829991769;-0.00012662430526689;-0.00017770736303646;2.2191828975338e-05;1.9956254618592e-05;0.00036744229146279;0.00028402256430127;-0.00019392512331251;-0.00019359699217603;-5.1699047617149e-05;-1.0129280781257e-05;0.0015000890707597;-0.0011394793400541;2.2785195596953e-06;0.0007422401686199;0.00058895396068692;0.00036675517912954;0.00045234413119033;0.0003183385997545;0.00034369426430203;0.00018082195310853;0.00014534250658471;-0.0001034313972923;-7.6581520261243e-05;8.8765344116837e-05;6.5885753429029e-05;0.0002120000863215;-0.00025005938368849;0.00043063907651231;0.0016561560332775;-0.00048328877892345;2.5125877073151e-05;-3.4395194234094e-05;-1.3880191545468e-05;2.6873151000473e-05;5.9081062318e-06;-0.00025103150983341;-0.0002574565296527;8.7262844317593e-05;0.00018268896383233;-6.7555389250629e-05;9.7203601399087e-06;-0.0015636404277757;-0.00011372617154848;1.1071378139604e-05;0.00087529362645;-0.00012560619506985;0.00010064122761833;-4.7385416110046e-05;-9.5237948698923e-05;-0.00060619268333539;0.00017851064330898;3.54424919351e-05;7.4259587563574e-05;0.00015639199409634;-4.6052340621827e-05;-0.00011247728252783;-6.9155016717559e-06;-0.00019391569367144;-0.00032185640884563;0.0012865063035861;0.00013058187323622;0.00055616378085688;0.0001374702405883;-7.513360469602e-05;-6.7578243033495e-05;6.9357651227619e-05;0.00013162032701075;-0.00019048547255807;-0.00013489311095327;0.0003149212570861;-8.0286581578548e-06;1.9102451915387e-05;0.00041074297041632;0.00094213424017653;6.6849970608018e-05;-0.00017344047955703;-0.001670969533734;-0.0004732632660307;-0.00011226594506297;0.00013470216072164;-0.00072145479498431;1.1557918924154e-06;-7.183276466094e-05;-2.8163538445369e-05;0.00015103137411643;6.7366825533099e-05;-0.00016951022553258;0.00014453424955718;-0.00017160312563647;-0.00019887658709195;2.6688239813666e-05;-0.00011848850408569;-0.0006873820675537;-0.00020799483172596;-0.00011793046724051;-5.0892122089863e-06;7.5924501288682e-05;-8.1086669524666e-05;-6.9101930421311e-05;-4.3490395910339e-05;7.2525697760284e-05;9.4608600193169e-05;-9.5095914730337e-05;-0.00021646724781021;-0.0012250972213224;-7.7592107118107e-05;0.00018700477085076;0.0014031971804798;0.0006550457328558;0.00037127142422833;0.00018951145466417;-0.00018813060887624;-4.2734613089124e-05;0.0002881521359086;3.4464796044631e-05;0.00011594374518609;-3.4529341064626e-05;-7.8181714343373e-05;0.00020481061073951;-0.00025299008120783;0.00038265745388344;0.0015888053458184;-0.00047954736510292;2.372522794758e-05;-4.1049993342313e-06;-1.5381016055471e-05;2.7040112399845e-05;-4.0144959712052e-06;-0.00023134093498811;-0.0002438212686684;7.9031080531422e-05;0.00011713406274794;-8.1556609075051e-05;1.6462367057102e-05;-0.0014453154290095;8.3513732533902e-06;1.6496618627571e-05;0.00087027344852686;-0.00028919221949764;1.5644405721105e-05;-4.0782382711768e-05;-8.7571126641706e-05;-0.00048599386354908;0.00018772289331537;3.6367109714774e-05;6.6092979977839e-05;0.00014387072587851;-3.6281038774177e-05;-8.6592881416436e-05;1.5481615491808e-06;-0.00019178677757736;-0.0002446033176966;0.00142541306559;7.4481955380179e-05;0.00056909490376711;0.00015255744801834;-7.5476338679437e-05;-6.5967797127087e-05;7.3654628067743e-05;0.00010868592653424;-0.0002039286919171;-0.00011846574489027;0.00035265798214823;-2.5976858523791e-05;1.3271092029754e-05;0.00021069541980978;0.00096983165713027;6.9431960582733e-05;-5.7719407777768e-05;-0.001673636958003;-0.00050810485845432;-0.00012322521070018;9.9620192486327e-05;-0.0008045407012105;2.841970854206e-05;-7.2099966928363e-05;-2.2687388991471e-05;0.00015090608212631;6.5990214352496e-05;-0.00017804031085689;0.00016634206986055;-0.0002030721079791;-0.00015681430522818;0.000302981963614;-0.00016179855447263;-0.00051544164307415;-0.00018931859813165;-0.00010831817053258;-1.0576521844996e-06;6.5305262978654e-05;-0.0001087540294975;-0.0001540947414469;-4.0209673898062e-05;0.00011718884343281;7.7019234595355e-05;-5.1748666010099e-05;-0.00032692571403459;-0.0010543375974521;-5.9316655097064e-05;0.0002616026904434;0.0011035287752748;0.00058011466171592;0.00029931784956716;0.00018002883007284;-0.00027920724824071;-1.543933103676e-05;0.0002141545410268;4.3844360334333e-05;0.0001685301103862;-3.3434298529755e-05;-0.00012067017087247;0.00011316539166728;-0.00012203373626107;0.0002226859505754;0.00084144162246957;-0.0002733992296271;-9.0243993327022e-05;1.1212621757295e-05;1.7587916545381e-06;2.9375160011114e-05;-3.5319502785569e-05;-0.00013031184789725;-0.00026746818912216;5.7034416386159e-05;-6.92426765454e-05;-5.8959623856936e-05;5.1348564738873e-05;-0.00079178775195032;6.874533573864e-05;6.8834533522022e-06;0.00049735856009647;-0.00024919741554186;-3.1975945603335e-05;6.0134298109915e-06;-6.3861021772027e-05;4.343608088675e-05;0.00011226967035327;1.221413276653e-05;3.3208001696039e-05;0.00013229984324425;-2.1883797671762e-05;-3.4766231692629e-05;5.9207501180936e-05;-0.00018612437997945;-0.000115139875561;0.0011125487508252;-4.654625809053e-05;0.00018897093832493;0.00010138648940483;-9.014445822686e-05;-4.3920230382355e-05;6.6926586441696e-05;1.2389097719279e-05;-0.0001332541287411;-6.4539592131041e-05;0.00021919567370787;-2.5939130864572e-05;-2.4919489078457e-05;-0.00010666673915694;0.00050308596109971;2.0932777260896e-05;0.00014540199481416;-0.00096258422126994;-0.00029694818658754;3.9487171306973e-05;6.9527428422589e-05;-0.00056916021276265;4.4423934014048e-05;4.9496746214572e-05;1.5159552049226e-06;0.00011181260197191;3.4463697375031e-05;-0.00011488634481793;0.0001010114865494;-8.5786443378311e-05;1.116221119446e-05;0.00021085656771902;-0.00016118261555675;-0.00029435029136948;-0.00016863008204382;-4.0424205508316e-05;1.657957000134e-05;2.220941860287e-05;-9.8119358881377e-05;-0.00016033186693676;-1.3416170077107e-06;0.00010013554856414;4.6863537136232e-05;-5.7561737776268e-06;-0.0004155466449447;-0.00081543769920245;-2.4538210709579e-05;0.00025023933267221;0.00089962186757475;0.00047277990961447;0.00013141847739462;6.961973849684e-05;-0.00019911413255613;1.346876979369e-05;8.8624554337002e-05;3.8256279367488e-05;0.00013016983575653;-3.5239900171291e-05;-9.7217824077234e-05;0.00038038854836486;-0.00023102411068976;-0.0020907560829073;-0.00037062703631818;-2.9171314963605e-05;0.00050496438052505;3.7460111343535e-05;-3.9552385715069e-05;-1.8159769297199e-06;-2.3720109311398e-05;0.0001516091870144;0.00019931985298172;-0.00011369613639545;-6.763449346181e-05;3.0722461815458e-05;0.00010754761024145;0.0016614287160337;-0.00017029959417414;-4.2590276279952e-05;0.00053283607121557;-0.00098603195510805;5.0988670409424e-05;0.00011140764399897;0.00072173564694822;8.7571359472349e-05;-0.00011908754822798;-0.00020855752518401;-8.9233319158666e-05;-5.7501252740622e-05;3.9595881389687e-05;2.3723130652797e-05;-0.00018978101434186;-4.2066945752595e-05;0.0018917770357803;-0.00021841278066859;0.0010444795479998;0.0001273218949791;-5.0782415200956e-05;0.00021637212194037;6.9372363213915e-05;-7.6655000157189e-05;-0.00022740512213204;0.00013315406977199;0.00053940317593515;-0.00013136352936272;4.0570968849352e-05;-5.2055143896723e-05;0.00023405949468724;0.0014200626173988;0.00014638291031588;-0.0023082196712494;-9.9434757430572e-05;-0.00034803547896445;-0.00076462957076728;-0.0012657144106925;5.9625421272358e-05;-0.00019429290841799;4.7968085709726e-05;0.00016218943346757;-2.2519208869198e-05;-0.00022910097322892;8.7729618826415e-05;-0.00031586902332492;0.00021746172569692;0.00072607904439792;-0.00024354601919185;-0.0005068548489362;-0.00021128737716936;-0.00014086985902395;-0.00020842102821916;7.306583574973e-05;-8.5288866102928e-07;-0.00034122233046219;-0.00011235127749387;0.00016827628132887;-7.4432173278183e-05;-2.9704244298046e-05;7.7619530202355e-05;-0.00035737612051889;-0.0010521276853979;-6.9601082941517e-05;0.00089972303248942;0.00035306892823428;0.00034940472687595;0.000605630048085;-0.00041221169522032;0.00022789358627051;0.00023134925868362;9.5143595899572e-06;0.00029859261121601;5.2570485422621e-05;-0.00018689624266699;-2.6625610189512e-05;0.00041746915667318;-0.00025941012427211;-0.0025346237234771;-0.00043608326814137;-4.5314271119423e-05;0.00059269811026752;4.7192006604746e-05;-2.5955538148992e-05;-1.4472135262622e-05;-2.4922892407631e-05;0.0002415297931293;0.00022140302462503;-0.0002147015184164;-7.396857108688e-05;3.7339930713642e-05;0.00011804112727987;0.0020268268417567;-0.00011650712258415;-4.6703964471817e-05;0.00051898881793022;-0.0011716521112248;6.2351369706448e-05;7.7051096013747e-05;0.00096746877534315;0.00010183936683461;-0.00013376932474785;-0.00024138709704857;-0.00014076141815167;-6.3828483689576e-05;8.7537031504326e-05;2.6324953068979e-05;-0.00021399569232017;-6.2288658227772e-05;0.0020061577670276;-0.00032370482222177;0.0012524335179478;0.00024367150035687;-4.4542335672304e-05;0.00025125872343779;6.8385888880584e-05;-9.145590593107e-05;-0.00026257574791089;0.00017276030848734;0.00057278026361018;-0.0001649387559155;7.0216541644186e-05;-4.0686576539883e-05;0.00055112555855885;0.0017322241328657;0.00017353049770463;-0.0027737950440496;-0.00031266669975594;-0.00043306782026775;-0.00090310256928205;-0.0013283141888678;9.9098710052203e-05;-0.00026143924333155;1.5827550669201e-05;0.00019261943816673;-3.0689589038957e-05;-0.0002573398523964;0.00010251305502607;-0.00036897507379763;0.00023452028108295;0.00056746444897726;-0.00039106086478569;-0.00061447080224752;-0.00019381371384952;-0.00016919300833251;-0.00025561926304363;8.9845307229552e-05;-8.2211981862201e-06;-0.00025455659488216;-9.4087052275427e-05;0.00015340877871495;-0.00010916290193563;-5.6767883506836e-05;0.0001082050948753;-0.00015460060967598;-0.0012824162840843;-8.2600483438e-05;0.0011253367410973;0.00030142904142849;0.00042391993338242;0.00074039219180122;-0.00042847829172388;0.00030478709959425;0.00029651957447641;-1.2923411304655e-05;0.00028261070838198;5.054242501501e-05;-0.00017700412718114;-2.5030112738023e-05;0.00025004491908476;-0.00015923974569887;-0.0016381816240028;-0.00024465628666803;-1.5947942301864e-05;0.00035890788421966;3.4048258385155e-05;-9.4022143457551e-06;-2.0297866285546e-05;-9.9306571428315e-06;0.00018059245485347;0.00012566517398227;-0.00017998434486799;-3.6361161619425e-05;3.2346462830901e-05;6.6029278968927e-05;0.0012921267189085;-3.789616675931e-05;-2.6366707970737e-05;0.00026160586276092;-0.00072342588100582;3.6904490116285e-05;2.5423336410313e-05;0.0006807298050262;4.6856701374054e-05;-9.513021359453e-05;-0.00014200549048837;-0.00010563451360213;-3.445845504757e-05;7.5242009188514e-05;1.2395912563079e-05;-0.00013547427079175;-5.0658600230236e-05;0.0011145703028888;-0.00025569161516614;0.00086787028703839;0.00024137120635714;-1.0915141501755e-05;0.00016201751714107;3.1250219763024e-05;-6.0138729168102e-05;-0.00014464156993199;0.00012181711645098;0.00032419004128315;-0.00011367594561307;6.5463733335491e-05;-9.9926519396831e-06;0.00059717841213569;0.0012039333814755;0.0001198265599669;-0.0018711383454502;-0.00038354657590389;-0.00032479592482559;-0.00060000398661941;-0.00074875506106764;8.4335224528331e-05;-0.00020766045781784;-2.343035521335e-05;0.00011643009202089;-2.1584532078123e-05;-0.00015311359311454;6.4963249315042e-05;-0.00024050544016063;0.0001332717074547;0.00018070318037644;-0.00035802135244012;-0.00036849876050837;-9.5991905254778e-05;-0.00011148150952067;-0.00016108812997118;5.6613080232637e-05;-9.8661021183943e-06;-7.2203431045637e-05;-2.3494070774177e-05;5.9507266996661e-05;-9.3186295998748e-05;-4.0673294279259e-05;7.4024974310305e-05;0.00013452496204991;-0.00080288125900552;-4.9083304475062e-05;0.0006625559180975;0.00013130594743416;0.00027431128546596;0.00046313117491081;-0.00021892129734624;0.000231688565691;0.00019048430840485;-1.6222347767325e-05;0.00014111990458332;2.1009174815845e-05;-8.6223473772407e-05;-5.9094891184941e-06;8.7425351011916e-06;-5.4712450037186e-06;-0.00092310435138643;0.00059228297322989;0.00017793200095184;-1.9554499885999e-05;-3.0890601919964e-05;8.4548068116419e-05;-3.9241003833013e-05;2.9711718525505e-05;0.00022778910351917;-0.00015352945774794;-0.00014310918049887;0.00012058475840604;8.4703307948075e-05;-6.2871229602024e-05;0.00025917851598933;0.00011625847400865;-4.1988250814029e-06;-0.00031489951652475;7.7283155405894e-05;0.00015963868645485;-0.00026372986030765;0.00046693807234988;-0.00034145370591432;-0.00015423419245053;6.5909793192986e-05;-0.00010115771874553;7.8332421253435e-05;4.5392167521641e-05;-3.7780377169838e-05;-0.0001100014342228;-5.4975225793896e-05;-0.00015178791363724;-0.00036928916233592;0.0009828363545239;0.00079489295603707;8.2224432844669e-05;0.00012641922512557;-4.7632784117013e-05;-7.0432681241073e-05;5.1502469432307e-05;2.1003415895393e-05;-1.0965458386636e-05;-8.0422738392372e-05;0.00013426782970782;0.00011981966235908;0.0024132805410773;0.0016633586492389;0.0001663211005507;-0.0022624463308603;-0.0019027006346732;-0.0005239472957328;-0.00059169315500185;2.524557930883e-05;0.00019197534129489;-0.00032010179711506;-0.00026471697492525;1.7980249822358e-06;6.6038924160239e-06;-2.3219114154927e-05;2.7834091724799e-06;-0.0002166324557038;-0.00012333061022218;-0.0010523026576266;-0.0010002653580159;-0.00020180718274787;-0.0001312975800829;-0.00011962877761107;-0.00017040722013917;1.8178257960244e-05;8.1965354183922e-06;0.00037117625470273;0.0002709821856115;-0.00018815243674908;-0.00019008104573004;-2.0223174942657e-05;3.3152846299345e-05;0.0016730756033212;-0.00085134530672804;7.2385719249723e-06;0.00034322697320022;0.00013751309597865;0.00029309536330402;0.00038893535383977;0.00024989360827021;0.00030203748610802;0.00011622736201389;6.0956088418607e-05;-7.9397912486456e-05;-5.2519066230161e-05;7.3140938184224e-05;5.0364134949632e-05;3.9746601032675e-06;-4.3781642489193e-06;-0.00083226797869429;0.00067304371623322;0.00014882467803545;-3.2643936719978e-05;-3.3949600037886e-05;7.9007244494278e-05;-3.6830853787251e-05;3.213881427655e-05;0.00021022403961979;-0.00017013408069033;-0.00012909954239149;0.00013657844101544;7.8658827987965e-05;-6.4775049395394e-05;0.00012727930152323;9.1012567281723e-05;-4.9759387366066e-06;-0.00026083385455422;0.00010554290929576;0.00016542024968658;-0.00025179871590808;0.00042647399823181;-0.00037700188113376;-0.00013861479237676;7.2176633693743e-05;-9.2752234195359e-05;8.5944368038327e-05;3.9415434002876e-05;-4.5659267925657e-05;-0.00010644365829648;-5.3255724196788e-05;-0.00020156471873634;-0.00032562963315286;0.00096020620549098;0.0008043356356211;8.9258697698824e-05;0.00012170500849606;-5.1007242291234e-05;-6.7078741267323e-05;6.2536353652831e-05;6.2184753915062e-06;-2.5369887225679e-05;-6.6215638071299e-05;0.00013163177936804;0.0001215642405441;0.0023951230105013;0.0016557369381189;0.00016528549895156;-0.002198173198849;-0.0019346651388332;-0.00053330766968429;-0.00058017310220748;5.4275675211102e-05;0.00017238767759409;-0.0003152672725264;-0.00026937804068439;-4.9849963943416e-06;1.1934893336729e-05;-1.4973308680055e-05;-4.7119374357862e-06;-0.00020725713693537;-0.00013684925215784;-0.0010460776975378;-0.00098574138246477;-0.00015132210683078;-0.0001355152198812;-0.0001165481589851;-0.00016286429308821;1.3064801350993e-05;1.0759658835013e-05;0.00036929681664333;0.00027491871151142;-0.00018983817426488;-0.00018631073180586;-9.1586289272527e-06;2.6200337742921e-05;0.001686797128059;-0.00080199941294268;1.1852637726406e-05;0.00025459681637585;0.00014704851491842;0.00027920448337682;0.00036028400063515;0.00025657322839834;0.00028583739185706;9.2476897407323e-05;6.9198511482682e-05;-8.0427431385033e-05;-5.1216684369138e-05;7.2807968535926e-05;5.0208353059134e-05;0.00020707552903332;-0.00028811825904995;0.00038760196184739;0.0018504977924749;-0.00053654704242945;0.00012308231089264;-1.7715382227834e-07;-2.7770076485467e-05;1.5475541658816e-05;2.4385490178247e-05;-0.00021868906333111;-0.00016527622938156;6.6491214965936e-05;0.00024055325775407;-9.0352026745677e-05;-2.109174420184e-05;-0.0016138512874022;1.9076838725596e-05;2.6486117349123e-05;0.00099457753822207;-0.00034205903648399;2.7829776172439e-06;-7.2905568231363e-05;-9.0013549197465e-05;-0.00080365448957309;0.00021632813150063;5.0978389481315e-05;6.4215724705718e-05;0.00011159751738887;-2.8063514037058e-05;-0.00010263721196679;-8.8638422312215e-05;-9.0023888333235e-05;-0.0002558916748967;0.0012728328583762;0.00022138070198707;0.00074860668973997;0.00017442344687879;-2.6396612156532e-05;-6.6798289481085e-05;5.1512328354875e-05;0.00018800808175001;-0.00026290628011338;-0.00012239028001204;0.00036568753421307;-2.0345645680209e-05;5.3235977247823e-05;0.00046900706365705;0.0012185006635264;9.6732743259054e-05;-0.00030849419999868;-0.0018915415275842;-0.00061505130724981;-0.00025632185861468;6.0319634940242e-05;-0.00072174711385742;-9.7978763733408e-06;-0.00018086229101755;-4.5939261326566e-05;0.00014986994210631;7.7355005487334e-05;-0.00018432619981468;0.00019015946600121;-0.0003096814325545;-0.00033512865775265;0.00044508487917483;-9.3348702648655e-05;-0.00035643510636874;-0.00013786695490126;-0.0001285989274038;-1.9410257664276e-05;7.4970688729081e-05;-7.6161239121575e-05;-0.00011040380923077;-8.8723063527141e-05;0.00012043470633216;7.9184035712387e-05;-4.0038994484348e-05;-1.8696202459978e-05;-0.00076324207475409;-4.2575840780046e-05;0.00014548249600921;0.00062964321114123;0.00042668799869716;0.00026668017380871;0.00026398358750157;-0.00035413849400356;-3.4468797821319e-05;0.00019327196059749;3.6526111216517e-05;0.00017944138380699;-1.2428318768798e-05;-0.00013020379992668;0.00018434542289469;-0.00026177635299973;0.00032014754833654;0.001552295521833;-0.00046149114496075;0.00010829028906301;1.2228808373038e-05;-2.2478463506559e-05;1.4401350199478e-05;1.4208270840754e-05;-0.00019168702419847;-0.00011397855269024;5.6779568694765e-05;0.00016629723540973;-8.3197919593658e-05;-1.6633957784506e-05;-0.0013339264551178;7.4114730523434e-05;2.6334224457969e-05;0.00084702193271369;-0.00036783900577575;-3.3016927773133e-05;-6.5611755417194e-05;-7.2621638537385e-05;-0.00063301244517788;0.00018935673870146;4.6118482714519e-05;5.5562028137501e-05;8.0307174357586e-05;-2.2668902602163e-05;-6.786883022869e-05;-6.7308261350263e-05;-8.4023209637962e-05;-0.00017762854986358;0.0012084676418453;0.00013643236889038;0.0006465149926953;0.00015370405162685;-2.811806552927e-05;-5.688000965165e-05;5.0539965741336e-05;0.0001476232719142;-0.00022725881717633;-9.8582648206502e-05;0.00034647970460355;-2.9551847546827e-05;3.6668527172878e-05;0.00025867955991998;0.0010341670131311;8.382806845475e-05;-0.00016165479610208;-0.001617448637262;-0.00053449108963832;-0.00021671588183381;3.4403441532049e-05;-0.00070007372414693;1.6208079614444e-05;-0.00014690264652018;-3.56219970854e-05;0.0001272713416256;6.6317094024271e-05;-0.00016504494124092;0.00018181320047006;-0.00027893649530597;-0.00024193976423703;0.00055516447173432;-0.00012336358486209;-0.00025894743157551;-0.00011053771595471;-0.00010909667616943;-1.3495829989552e-05;6.1648352129851e-05;-9.2552145360969e-05;-0.00016122538363561;-6.7887180193793e-05;0.00013192025653552;5.6646207667654e-05;-1.6113646779559e-05;-0.00014717393787578;-0.00060670351376757;-3.2882733648876e-05;0.00020307827799115;0.0004455054004211;0.00034216974745505;0.00021143778576516;0.00021527893841267;-0.00035188515903428;-1.0084386303788e-05;0.00014051437028684;3.9136473787948e-05;0.00019012365373783;-1.281735876546e-05;-0.00013879417383578;0.00029249250655994;-0.00016279509873129;-0.001774332486093;-0.00026508918381296;-0.00011099013499916;0.00040761125274003;3.7033063563285e-05;-3.3278593036812e-05;-1.982372123166e-05;-9.3884427769808e-06;9.0927838755306e-05;0.00012518381117843;-0.00018868590996135;-3.6695149901789e-05;4.1034960304387e-05;8.7817119492684e-05;0.0013543191598728;-0.00014874451153446;-4.5097476686351e-05;0.00045465078437701;-0.00082157243741676;7.0804679126013e-05;0.00010373975237599;0.00078717130236328;6.6321757913101e-05;-9.1104673629161e-05;-0.00017539036343805;-6.2444625655189e-05;-3.6254903534427e-05;5.5497923312942e-05;7.0817814048496e-06;-6.2347149651032e-05;-9.1245245130267e-05;0.0012509592343122;-0.0001797703007469;0.00090087589342147;0.00021499043214135;6.6524313524496e-07;0.00018081269809045;3.2949057640508e-05;-5.7729819673114e-05;-0.00023578721447848;0.00014448539877776;0.00039249021210708;-9.9496828624979e-05;6.6739652538672e-05;-3.0839571991237e-05;0.00041258687269874;0.0012581795454025;0.00012492794485297;-0.0018969398224726;-0.00029115434153937;-0.00035056355409324;-0.00065430579707026;-0.00081773154670373;2.6316976800445e-05;-0.0002347268309677;-3.1204459105538e-07;0.0001305851037614;-3.0732051527593e-05;-0.00017520914843772;7.1326867328025e-05;-0.00032852389267646;0.00017749141261447;0.00058108160737902;-0.00033732518204488;-0.00018583722703625;-9.7160977020394e-05;-0.00010930656571873;-0.00012514168338384;5.584366954281e-05;-1.4318525245471e-05;-0.00015610673290212;-5.7299112086184e-05;0.0001209293550346;-9.8683623946272e-05;-9.4337920018006e-06;6.3792802393436e-05;5.3281812142814e-05;-0.00054956821259111;-2.6279720259481e-05;0.0002757461334113;0.00014291309344117;0.00019407278159633;0.00034051606780849;-0.0003832831280306;0.00024177743762266;0.00013537750055548;-7.7944932854734e-06;0.00020673056133091;3.4737076930469e-05;-0.00013485917588696;-3.3692681427056e-06;0.00022150852601044;-0.00012480725126807;-0.0014610918005928;-0.0001955460611498;-8.3747036114801e-05;0.00032648493652232;3.2722960895626e-05;-2.377426608291e-05;-2.0894909539493e-05;-5.4398446991399e-06;0.00010820562602021;8.9419067080598e-05;-0.00017708966333885;-2.3443684767699e-05;3.313001798233e-05;6.8537119659595e-05;0.0011059715179726;-9.8351651104167e-05;-3.3832060580608e-05;0.00034223339753225;-0.00066939234966412;5.0983981054742e-05;7.2756047302391e-05;0.00066248985240236;4.601359978551e-05;-7.3664850788191e-05;-0.00013935893366579;-6.7577704612631e-05;-2.4849869078025e-05;6.0077927628299e-05;2.3273705664906e-06;-5.3984633268556e-05;-7.5032345193904e-05;0.00093453336739913;-0.00017274644051213;0.00076326978160068;0.00022032539709471;9.6744806796778e-06;0.00014919393288437;2.0583764126059e-05;-4.823528797715e-05;-0.00018118678417522;0.00011866238492075;0.0002956981479656;-8.4600418631453e-05;6.4695930632297e-05;-1.5900819562376e-05;0.00046137368190102;0.0010781846940517;0.00010546863632044;-0.0015952320536599;-0.00033468630863354;-0.00030963902827352;-0.00054568843916059;-0.00061045575421304;3.5921024391428e-05;-0.00020996951207053;-1.9847098883474e-05;0.00010452661081217;-2.5050079784705e-05;-0.00013691335334443;5.7056557125179e-05;-0.0002691191912163;0.00013201290857978;0.00036168427322991;-0.00032644069870003;-0.00013104642857797;-5.1313236326678e-05;-8.8913977378979e-05;-0.00010329521319363;4.4484106183518e-05;-1.4332088539959e-05;-7.1178132202476e-05;-2.5882611225825e-05;7.758429273963e-05;-9.1935369709972e-05;-9.7511892818147e-06;5.7675602874951e-05;0.00018217698379885;-0.00043468462536111;-1.7619340724195e-05;0.00019868266826961;5.9796650020871e-05;0.00015229827840813;0.0002739320625551;-0.00028511017444544;0.00021259544882923;0.00010850782564376;-1.5334981071646e-05;0.00014461563841905;2.3001832232694e-05;-9.4366914709099e-05;1.2756059959429e-06;-4.1566945583327e-05;4.2824263800867e-05;-0.00071737274993211;0.00053744809702039;3.8444184610853e-05;3.7689369492e-05;-1.2173275536043e-05;4.1774710553e-05;-2.7283385861665e-05;2.3031416276353e-05;0.00020620060968213;-0.00016856881848071;-0.00012273130414542;0.00011494624777697;4.0652477764525e-05;-2.7341340683051e-05;0.00012971428805031;5.2187759138178e-05;-6.1354980971373e-06;-3.06886204271e-06;-0.00010540900984779;9.151751146419e-05;-0.0001370958489133;0.00033944242750295;-0.00026801601052284;-6.8033747083973e-05;1.8050403014058e-05;-8.1744947237894e-05;7.3659073677845e-05;4.6113596908981e-05;-4.7154670028249e-05;-4.7275807446567e-05;-2.4130604288075e-05;-9.3193390057422e-05;-0.00020774612494279;0.00076463224831969;0.00063539197435603;9.8091957625002e-05;0.00012227121624164;-4.073370291735e-05;-5.2020415751031e-05;-1.6005536963348e-05;-2.7221301934333e-05;1.425386108167e-05;-2.7451278583612e-05;0.00010417809971841;9.1606794740073e-05;0.0017106453888118;0.0013910291017964;0.00011989524500677;-0.001709757023491;-0.0014860206283629;-0.00046441331505775;-0.0005021978286095;3.7903897464275e-05;0.00012679066276178;-0.00027450843481347;-0.00022874065325595;5.0628700591915e-06;7.8853636296117e-06;-2.1682382794097e-05;-6.5402273321524e-06;-0.00020153479999863;-0.00012556937872432;-0.00066280626924708;-0.0006557583110407;6.2640800024383e-05;5.1136696129106e-05;-7.3442111897748e-05;-0.0001082504822989;4.6116301746224e-06;1.5409996194649e-06;0.00028599819052033;0.00020555587252602;-0.00012932989920955;-0.00013381292228587;1.4859772818454e-05;4.1142302507069e-05;0.0014136744430289;-0.00033854148932733;3.0364199119504e-05;-0.00012125882494729;-0.00017072015907615;0.00011318719043629;0.00017861512606032;0.00012108070950489;0.00017286255024374;1.7006350390147e-05;4.6222139644669e-06;-4.5398966904031e-05;-2.4133823899319e-05;4.3102852941956e-05;2.8555466997204e-05;-2.7775196940638e-05;2.6021078156191e-05;-0.00068167876452208;0.00062180426903069;3.1069623219082e-05;2.1853793441551e-05;-1.3262954780657e-05;3.9853603084339e-05;-2.9130276743672e-05;2.8256614314159e-05;0.0001946112170117;-0.00017700750322547;-0.00011935815564357;0.00013397175644059;4.1126761061605e-05;-3.4800745197572e-05;4.0330709452974e-05;4.5643413614016e-05;-5.6458015933458e-06;1.2390902156767e-05;-7.4974923336413e-05;9.5608738774899e-05;-0.00013935806055088;0.00033199141034856;-0.00031714551732875;-6.6513195633888e-05;3.0981584131951e-05;-7.9596051364206e-05;8.0756122770254e-05;4.4823173084296e-05;-5.4847620049259e-05;-6.3839150243439e-05;-2.9294282285264e-05;-0.00014133409422357;-0.00020213815150782;0.00080415123375133;0.00068889593239874;0.00010495556489332;0.00012149331450928;-4.4829503167421e-05;-5.2866958867526e-05;1.4924445167708e-05;-2.6826361136045e-05;-3.0367750696314e-06;-2.6287734726793e-05;0.00010834069689736;0.00010047177784145;0.001817233976908;0.0014614888932556;0.00012824735313188;-0.0017691776156425;-0.0015997851733118;-0.00049858924467117;-0.00052056252025068;5.1312053983565e-05;0.00012002135190414;-0.00028401834424585;-0.00024551013484597;-9.7016231848102e-07;1.2915355000587e-05;-1.4491407455353e-05;-1.0894260412897e-05;-0.00019018702732865;-0.00013614863564726;-0.00074389140354469;-0.00070360844256356;5.7401764934184e-05;2.8756468964275e-05;-7.9723511589691e-05;-0.00011423334944993;2.3345626232185e-06;3.9474452933064e-06;0.00030189080280252;0.00022203258413356;-0.00014780517085455;-0.0001435098820366;1.8882003132603e-05;3.712271063705e-05;0.0014815723989159;-0.00038648195913993;2.7132638933836e-05;-0.00011597881530179;-0.0001370814134134;0.00013824463530909;0.00019771466031671;0.00016315591346938;0.00018597370944917;1.4714308235853e-05;1.6420146494056e-05;-5.3166710131336e-05;-2.772837797238e-05;4.9902009777725e-05;3.2345997169614e-05;7.9606572398916e-05;-0.00014955484948587;0.00016321313160006;0.0011287525994703;-0.0003169362898916;0.00014157984696794;1.5919016732369e-05;-2.1786318029626e-05;9.9469900760596e-07;2.5576946427464e-05;-6.1759797972627e-05;-5.8050576626556e-05;1.522496677353e-05;0.00018657148757484;-6.3414263422601e-05;-2.6931249522022e-05;-0.00089960847981274;7.553454634035e-05;2.5527906473144e-05;0.00061912118690088;-0.00031207434949465;-5.1493880164344e-05;-5.9169437008677e-05;-5.2408118790481e-05;-0.00057362503139302;0.00014286366058514;2.5671593903098e-05;1.8146496586269e-05;4.0268216253025e-05;1.8859519741454e-06;-5.9646175941452e-05;-0.00011916029325221;5.3600266255671e-05;-9.5425588369835e-05;0.00056728441268206;0.00022775765683036;0.00048008174053393;0.00011712516425177;2.5995210307883e-05;-3.4420416341163e-05;1.0337844287278e-05;0.00014616244880017;-0.00021885865135118;-5.1709153922275e-05;0.00020038410730194;-1.0077967999678e-05;5.4670781537425e-05;0.0003737403312698;0.00083842902677134;6.5168227592949e-05;-0.00034448050428182;-0.0011219597654417;-0.00041854433948174;-0.00022232902119868;-2.1377521989052e-05;-0.00028624309925362;-3.5694636608241e-05;-0.00016805397171993;-3.9881273551146e-05;8.4300569142215e-05;4.5373995817499e-05;-0.00010219551768387;0.00011696534056682;-0.00026907603023574;-0.00030695379246026;0.00044025084935129;2.2231639377424e-05;7.8062599641271e-05;-2.733850851655e-05;-7.0450107159559e-05;-2.3209704522742e-05;3.7259429518599e-05;-1.4430393093789e-05;-3.4756361856125e-05;-8.7718057329766e-05;8.6328225734178e-05;4.0990293200593e-05;1.5186616110441e-05;0.00026614926173352;-4.7822468332015e-05;1.3161883543944e-05;-5.1684794016182e-05;-0.00022536373580806;5.6827506341506e-05;3.7059304304421e-05;0.00019728044571821;-0.00030418898677453;-3.021563134098e-05;3.0935603717808e-05;1.7713355191518e-05;0.00011871167953359;1.0620627108437e-05;-9.2526090156753e-05;0.00012717265053652;-0.00021487721824087;0.00025039006141014;0.0014704352943227;-0.00042007784941234;0.00016805261839181;1.6236886949628e-05;-2.605163717817e-05;4.6311565711221e-06;2.8830290830228e-05;-0.00011553860531421;-7.160559471231e-05;3.1768267945154e-05;0.00022428629745264;-8.068019815255e-05;-3.2273677788908e-05;-0.0012057003332302;8.6837426351849e-05;3.1846964702709e-05;0.00080175325274467;-0.00038008054252714;-5.3055417083669e-05;-7.7645483543165e-05;-7.1859642048366e-05;-0.00072345160879195;0.00018407095922157;3.7155808968237e-05;3.4352135116933e-05;5.4093376093078e-05;-6.033519639459e-06;-7.298215496121e-05;-0.00013445335207507;3.395144813112e-05;-0.00013558795035351;0.00084145850269124;0.00024401709379163;0.00061460107099265;0.00014775665476918;1.636197703192e-05;-4.6398203267017e-05;2.2813874238636e-05;0.00018204418302048;-0.00026702333707362;-7.5061958341394e-05;0.00027892255457118;-1.8457190890331e-05;6.0902566474397e-05;0.00040971921407618;0.0010403873166069;8.2232225395273e-05;-0.00035231141373515;-0.0014600943541154;-0.00052614568267018;-0.00026026961859316;-1.4826963706582e-05;-0.00044824092765339;-2.5857050786726e-05;-0.00019595486810431;-4.8454585339641e-05;0.00011220008309465;6.0858230426675e-05;-0.00013908960681874;0.00016231417248491;-0.0003258268116042;-0.00034806778421625;0.00056735007092357;-1.8973219994223e-05;-5.7328688853886e-06;-5.3130919695832e-05;-9.553627751302e-05;-2.5724801162141e-05;5.2669594879262e-05;-4.2884268623311e-05;-7.5527706940193e-05;-9.9010598205496e-05;0.00011756636376958;5.2433646487771e-05;6.7448654590407e-06;0.00018943147733808;-0.00021016148093622;1.1956389016632e-06;1.806229010981e-05;-8.3243321569171e-05;0.00014438964717556;9.6141775429714e-05;0.0002435657515889;-0.00038039559149183;-2.9709679438383e-05;7.0832233177498e-05;2.7333679099684e-05;0.00016015749133658;6.4413097788929e-06;-0.00012270465958863;-2.9003504664615e-07;2.1815081709065e-05;-0.00052240764489397;0.00010182790720137;-6.6270389652345e-05;0.00010456900781719;1.3112553460815e-05;-9.0070516307605e-06;-1.392309241055e-05;5.5041632549546e-06;0.00010178667434957;-6.0085825680289e-05;-0.0001014852168737;3.3665492082946e-05;7.1786125772633e-06;2.2845999410492e-05;0.00027214147849008;-2.9952370823594e-05;-1.2537177099148e-05;0.00018347284640186;-0.00026036618510261;1.7449901861255e-05;2.6825651730178e-05;0.00025714639923535;-3.6312714655651e-05;-5.9112871895195e-06;-4.8600748414174e-05;-4.0856622945284e-05;2.1811365513713e-05;3.9713810110698e-05;-2.2860591343488e-05;2.7115596822114e-05;-3.0835424695397e-05;0.00011199743312318;-6.1136510339566e-05;0.00033691566204652;0.00022144371178001;4.8894002247835e-05;7.3603594501037e-05;-1.2305149539316e-05;-2.0106876036152e-05;-9.6321877208538e-05;1.2368819625408e-05;6.3292223785538e-05;-1.0177620424656e-05;4.7150599129964e-05;1.8657399778021e-05;0.00046664345427416;0.00060299201868474;4.4880482164444e-05;-0.00070440856507048;-0.00044758088188246;-0.0002034317003563;-0.00025767777697183;-4.3215401092311e-05;2.7376074285712e-05;-0.00013780769950245;-7.517565973103e-05;2.9671649826923e-05;-7.0152505031729e-06;-3.4677261282923e-05;8.8709230112727e-06;-0.0001535311457701;-9.6848862085608e-06;3.5784660212812e-06;-0.00022044412617106;0.00019285437883809;0.0001183345229947;-1.9448190869298e-05;-1.8829307009582e-05;3.5193395433453e-06;-1.1641868695733e-05;9.5844741736073e-05;5.2885559853166e-05;-7.9155106504913e-06;-6.1004368035356e-05;2.3033513571136e-05;3.2875970646273e-05;0.00055588269606233;0.00012840855924878;3.4481636248529e-05;-0.00034844889887609;-0.00024094262334984;-5.6060700444505e-05;-2.7658896215144e-05;-0.00010064873640658;8.0727746535558e-05;-3.1283216230804e-05;-3.3958061976591e-05;1.8949842342408e-05;4.498830094235e-06;-1.3298001249495e-05;8.9227260104963e-06;-2.9662242013728e-05;2.0075003703823e-06;-0.00010808154183906;0.00053401425248012;-0.00012860100832768;8.206709753722e-05;9.9205408332637e-06;-9.5344985311385e-06;-6.0012566791556e-06;1.6706562746549e-05;7.3140901804436e-05;-9.2245762061793e-05;-3.370421109139e-05;0.00011418390204199;-2.6180901841144e-05;-7.576880761917e-06;-0.00029810384148732;2.8619120712392e-05;7.890595952631e-06;0.00030335609335452;-0.0001994993945118;-2.2951195205678e-05;-2.0863124518655e-05;3.2334712159354e-05;-0.00026842154329643;5.8849160268437e-05;-3.9534729694424e-06;-2.3897882783785e-05;3.7759138649562e-05;2.2637721485808e-05;-4.4208583858563e-05;-5.6589495216031e-05;5.629447332467e-05;-4.4012445869157e-05;8.4792976849712e-05;0.00027424425934441;0.00029314515995793;7.6079471909907e-05;5.5381631682394e-05;-2.0276507711969e-05;-1.3586854038294e-05;3.5343808121979e-05;-0.00012151136616012;-3.0864157452015e-06;5.7057543017436e-05;2.2634872948402e-05;4.5516902900999e-05;0.00048852805048227;0.00063315691659227;4.2366471461719e-05;-0.00052226765546948;-0.00068054528674111;-0.00026864698156714;-0.00020566491002683;3.5538346310204e-06;-5.2466702982201e-07;-9.4812858151272e-05;-0.00012873364903498;-1.4825744983682e-05;3.2673906389391e-05;9.2271193352644e-06;-3.491261304589e-05;-2.2181049644132e-05;-0.00015485036419705;-0.00024326902348548;5.0512175221229e-05;0.0001602277479833;0.0001971784804482;-2.0350862541818e-06;-3.12061929435e-05;-1.5831405107747e-05;7.1236431722355e-06;8.0744488514028e-05;6.5807151258923e-05;-6.7136199504603e-05;8.4096285490887e-07;3.2183990697376e-05;3.0055476599955e-05;0.00059126934502274;0.0001807888620533;3.9188620576169e-05;-0.00028845496126451;-0.00040209974395111;-6.8236258812249e-05;-5.3830684919376e-05;8.0746358435135e-05;-0.00010886201198446;-4.7899928176776e-05;-3.1434476113645e-05;-2.5749600354175e-06;3.424424721743e-05;1.4922463378753e-05;-2.5931669370038e-05;7.718972483417e-06;6.4952037064359e-06;-2.1973544335196e-06;-1.0965509318339e-05;-0.00020251145178918;0.00010845510405488;-7.8587413554487e-07;0.00056774821132421;-7.0489957579412e-05;1.1131183782709e-05;-5.9845555369975e-05;9.7525662567932e-07;-3.7548772525042e-05;0.00013361152377911;7.6862175774295e-05;-9.441131260246e-05;1.1767879186664e-05;5.4745749366703e-05;-0.00036219533649273;-2.585792208265e-05;-2.5064862711588e-05;0.00035079201916233;-0.00026623115991242;0.00013689007028006;-2.0975197912776e-05;-2.1013815057813e-05;-0.0002590385847725;2.9790224289172e-05;-5.357940972317e-05;-2.1294887119438e-05;3.7023408367531e-05;9.4147744675865e-06;1.2573807907756e-05;-9.3757487775292e-05;-5.6115168263204e-05;-0.00020432102610357;-0.00029221345903352;8.657514740662e-07;-0.00016977440100163;0.00014954652579036;-0.00018227697000839;3.8907915040909e-06;-6.6857952333521e-05;-7.7624727055081e-06;-0.00011789522250183;-7.9170524259098e-05;0.00020436463819351;-1.1977883332293e-05;-0.00056465301895514;-0.00030659569893032;0.00028270820621401;0.00012601396883838;0.00029743066988885;0.00071954779559746;6.7913460952695e-05;0.00019635193166323;5.1094513764838e-05;-6.9398511186591e-06;-1.9172492102371e-05;5.6417979067191e-05;3.0027988032089e-05;-2.8679183742497e-05;-1.8852702851291e-05;1.1054520655307e-05;1.6727990441723e-05;-2.7031228455598e-05;0.00018682618974708;0.00024694259627722;-0.00014943727001082;0.00035602619755082;5.5212527513504e-05;-0.00029671887750737;4.7508892748738e-05;2.2101936338004e-05;-7.1186652348842e-05;2.6366446036263e-05;-1.1813373021141e-05;5.0031383580063e-05;3.399130582693e-05;0.00030379972304218;0.0004761952732224;-0.00011272891424596;-7.9107870988082e-05;-0.00031663014669903;-0.00058596482267603;-7.7352939115372e-05;-2.3432436137227e-05;8.7454318418168e-05;-0.00022171289310791;5.9283361224516e-06;-4.0785089368001e-05;3.8061403756728e-05;6.8526147515513e-05;-9.4509305199608e-06;-1.2222397344885e-05;4.6943332563387e-05;-3.9611401803086e-07;-0.00022474231082015;0.00042654341086745;-0.0010951936710626;-3.0093879104243e-05;0.00018792864284478;-7.0790723839309e-05;2.4977407520055e-05;9.3254486273509e-05;-0.0001443524233764;1.5577927115373e-05;1.0365128218837e-05;-8.9084132923745e-06;-5.2689563744934e-05;-5.81885324209e-05;0.00084361841436476;7.90102276369e-05;5.1047729357379e-05;0.00045372440945357;-0.00079377478687093;-3.7446501664817e-05;-0.00021542787726503;0.00050880538765341;9.3407015810953e-06;4.4244115997571e-05;-2.5284627554356e-05;-3.1918531021802e-05;1.5499974324484e-05;7.4628737820603e-06;1.5834959413041e-05;-7.8949968155939e-05;-0.00014140339044388;-0.00073733017779887;-0.0001813070703065;-0.0007889352273196;6.4532534452155e-05;-0.00016642574337311;0.00025282255955972;-0.00010983357788064;4.6560013288399e-05;-0.00033468901528977;5.8563859056449e-05;0.00026764190988615;-0.00017241328896489;-4.7680096031399e-05;-0.0010722113074735;-0.00039539439603686;0.00027508891071193;0.0005143252783455;0.001614069682546;0.00025670681498013;0.00037224660627544;-1.4977757018642e-05;0.00037443792098202;5.6080469221342e-05;0.00012982918997295;-5.7441917306278e-05;-4.5365308324108e-05;3.8154568755999e-05;3.3488860935904e-05;-1.77694910235e-05;-8.2093822129536e-05;-3.4770888305502e-05;0.00013230793410912;6.3200794102158e-05;0.00074702926212922;-0.0002292074059369;-0.00048448657616973;0.0002050093607977;1.5577992598992e-05;4.93980369356e-05;0.00010206224396825;-8.4110841271468e-05;-1.5348066881415e-05;-7.1067697717808e-05;2.3325575966737e-05;2.6294490453438e-05;0.00024241422943305;6.7643845795828e-06;4.5418219087878e-05;-0.00039277403266169;-0.00011154094681842;6.0517671954585e-05;-4.2851443140535e-05;-0.00043969191028737;0.00015866599278525;-0.00011441751121311;2.0860088625341e-06;0.0001534530747449;5.3116546041565e-05;-1.5734136468382e-05;-1.1323058060952e-05;5.1454331696732e-05;9.7828569778358e-06;-0.0002105535386363;0.00043276912765577;-0.001178334467113;-2.4793072952889e-05;0.00013270675844979;-1.6137728380272e-05;3.4002176107606e-05;9.5516203145962e-05;-0.00020168560149614;3.0229095500545e-05;4.9056994612329e-05;-5.3521966037806e-05;-5.4779826314189e-05;-1.6688887626515e-05;0.00092527706874534;7.7393524406943e-05;3.2235759135801e-05;0.00040197829366662;-0.00083632732275873;-4.5665823563468e-05;-0.00022682225971948;0.00058135483413935;2.13896673813e-05;6.4508720242884e-05;-3.4801949368557e-05;-3.8869882700965e-05;2.6384066586616e-05;1.8674378225114e-05;1.8004462617682e-05;-0.00011347638064763;-0.00015569153765682;-0.00085124047473073;-0.0003049532242585;-0.00071344216121361;5.8171230193693e-05;-0.00022024265490472;0.00029257658752613;-0.00014776524039917;2.8138920242782e-05;-0.00034421673626639;5.0474132876843e-05;0.00032248249044642;-0.0001809865643736;-5.2389321353985e-05;-0.0012439930578694;-0.0006070714443922;0.00034587105619721;0.00056767032947391;0.0017887824214995;0.00049131351988763;0.00046754296636209;4.0063940105028e-05;0.00030832621268928;6.3919222156983e-05;0.00014259798626881;-5.3732681408292e-05;-5.6692348152865e-05;4.1283998143626e-05;3.4098040487152e-05;-2.29794295592e-05;-8.5049781773705e-05;-3.3829808671726e-05;0.00018208324036095;0.00016901682829484;0.00065795070258901;-0.00028149803983979;-0.00052210659487173;0.00016711608623154;1.2345607501629e-05;6.6299384343438e-05;6.5059291955549e-05;-0.0001094413237297;3.4945693187183e-05;-3.9793321775505e-05;3.3400756365154e-05;0.00011630071821855;0.0005333719891496;-1.7927859516931e-05;1.47680812006e-05;-0.00051605579210445;-0.0003108030941803;6.6149201302323e-05;-7.511125295423e-05;-0.00042034036596306;0.00016798519936856;-9.7991207439918e-05;6.6226116359758e-06;0.00014742094208486;5.799353675684e-05;-1.9401260942686e-05;-2.9959232961119e-06;3.9485898014391e-05;1.8264556274517e-05;-6.1654995079152e-05;0.00026220793370157;-0.00086559681221843;6.810222112108e-05;-2.1775244022137e-05;7.7099015470594e-05;3.3884636650328e-05;5.4658605222357e-05;-0.00019806069030892;5.8207820984535e-05;0.00013716128887609;-0.00011537595128175;-3.2270745577989e-05;5.5001841246849e-05;0.00066643365425989;3.9172864489956e-05;-1.8286864360562e-05;0.00015080523735378;-0.00056273158406839;-5.6324097386096e-05;-0.00014031048340257;0.00042533557279967;-1.0188171472691e-05;7.7427677751984e-05;-4.3297040974721e-05;-5.7522469433025e-05;4.2543437302811e-05;2.9938890293124e-05;2.2333519154927e-05;-0.00013510086864699;-0.0001400072069373;-0.00087372970301658;-0.00046284819836728;-0.00043702695984393;5.847895226907e-05;-0.00010420446051285;0.000166076089954;-0.00015938749129418;-3.2242514862446e-05;-0.00023836160835344;1.3990656043461e-05;0.00022859123419039;-6.715959898429e-05;-5.7930108596338e-05;-0.001268700696528;-0.00090389739489183;0.00041932382737286;0.00050628720782697;0.0016867715166882;0.00086893007392064;0.00047314565745182;0.00016040801710915;0.000183125725016;5.3107573876332e-06;0.00010984652180923;-1.7456837667851e-05;-5.0222508434672e-05;1.5717616406619e-05;1.9708388208528e-05;-1.9559369320632e-05;-6.6586762841325e-05;-3.7764242733829e-05;0.00016447177040391;0.00028034756542183;0.00017763450159691;-0.00027927284827456;-0.00038179405964911;1.6005652696549e-06;1.0287654731655e-05;7.0763497205917e-05;-5.1366499974392e-05;-0.00011923646525247;0.0001019274131977;4.9806436436484e-05;3.71035275748e-05;0.00014749275578652;0.00092357210814953;-2.4312528694281e-05;-2.5971219201892e-06;-0.00047661110875197;-0.00054389954311773;5.6171578762587e-05;-9.2903268523514e-05;-0.00017826267867349;0.00011472838377813;-3.1523322832072e-05;1.2287753634155e-05;9.2500973551068e-05;4.5284938096302e-05;-1.90655428014e-05;1.5414921108459e-06;2.6977642846759e-05;3.1514253350906e-05;-7.5845605351788e-06;0.00017190306971315;-0.00077591702574864;0.00022878378513269;-0.00024514386313967;0.00027435773517936;3.2305899367202e-05;3.8775011489633e-05;-0.00023051368771121;0.00012738135410473;0.00027466204483062;-0.00026705712662078;-3.2003106753109e-05;7.2573115176056e-05;0.00050646445015445;6.098273297539e-05;-5.365882316255e-05;5.9483430959517e-05;-0.00043766252929345;-5.1850453019142e-05;-0.00011345736129442;0.00035811017733067;-4.9527148803463e-05;0.00010110843868461;-7.7523814979941e-05;-9.0272857050877e-05;8.4313272964209e-05;4.8014302592492e-05;3.2130294130184e-05;-0.00020820170175284;-0.00017082110571209;-0.0010647027520463;-0.00072412192821503;-0.00026729752426036;3.7274436181178e-05;-9.7038078820333e-05;8.5225234215613e-05;-0.00020596089598257;-9.9558710644487e-05;-0.00024071588995866;-5.1895640353905e-05;0.00024878102703951;5.085681550554e-05;-6.5787040512078e-05;-0.001627191202715;-0.0013815532438457;0.00058865337632596;0.00057447224389762;0.0019785698968917;0.0014741122722626;0.00061607907991856;0.00033350262674503;8.134453673847e-05;-4.4271142542129e-05;0.0001115626655519;2.2091862774687e-05;-3.8501882954733e-05;4.9480308916827e-06;6.6748948484019e-06;-1.7598804333829e-05;-5.5788637837395e-05;-4.2182517063338e-05;0.00035110180033371;0.00044852818246;-6.307459261734e-05;-0.00031452457187697;-0.00040075567085296;-0.00018046978220809;4.1711562516866e-05;8.1172001955565e-05;-0.00013182080874685;-0.00015354933566414;0.00017211835074704;0.00015144684584811;5.9116031479789e-05;0.00034540618071333;0.0015937002608553;-9.2447742645163e-05;-6.8026478402317e-05;-0.00081385613884777;-0.00092019280418754;-1.5627208995284e-05;-0.00011684150376823;-8.6910557001829e-05;6.5920990891755e-05;-1.3263185110191e-06;2.1153118723305e-05;8.6230065790005e-05;5.0713199016172e-05;-9.5356808742508e-06;3.5378573102207e-06;3.6883304801449e-06;3.4363096347079e-05;1.9203973522508e-08;6.5616171923466e-05;-0.00051397510105744;0.00033306659315713;-0.00038382332422771;0.00039039834518917;1.9250939658377e-05;1.8428003386362e-05;-0.00018873973749578;0.00016250742191914;0.00032122063566931;-0.0003374750376679;-2.9558148526121e-05;3.195696262992e-05;0.00021335177007131;9.659899660619e-05;-6.8378481955733e-05;1.743506618368e-05;-0.00021288725838531;-2.5243674826925e-05;-6.9112524215598e-05;0.00020838432828896;-8.6402047600131e-05;9.0303459728602e-05;-9.058641444426e-05;-9.6602328994777e-05;0.00010219260002486;4.9168196710525e-05;3.2528856536373e-05;-0.00021763617405668;-0.00015681098739151;-0.00094416050706059;-0.00073832849739119;-9.1166686615907e-05;1.7629095054872e-06;-7.6483105658554e-05;-2.1811280021211e-05;-0.00018801221449394;-0.00012929274816997;-0.00020663258328568;-0.00010829667007783;0.00021505734184757;0.00015731442545075;-5.4723506764276e-05;-0.0015206139069051;-0.0014155326643959;0.00057720427867025;0.00048588257050142;0.0017369416309521;0.0015982094919309;0.00058009166968986;0.00039383993134834;-7.3753144533839e-06;-8.0632496974431e-05;8.9187131379731e-05;5.4360752983484e-05;-1.1182236448803e-05;-2.8575886972249e-06;-4.736879873235e-06;-8.1514608609723e-06;-3.528708111844e-05;-3.633940286818e-05;0.00043255224591121;0.00042655624565668;-0.00016528669220861;-0.00024361886607949;-0.00033547237399034;-0.00029069840093143;6.2813371187076e-05;5.8920981246047e-05;-0.00014092928904574;-0.00013399538875092;0.00017119738913607;0.00019307807087898;5.9704241721192e-05;0.00040827310294844;0.0017068433808163;-0.00012014737876598;-9.8546501249075e-05;-0.0009146787924692;-0.0009317584335804;-8.3404294855427e-05;-8.7092150351964e-05;-3.1240204407368e-05;-4.3614768401312e-06;1.0935019417957e-05;2.2070742488722e-05;6.9764748332091e-05;4.3035521230195e-05;7.2285342866962e-06;9.6405456133652e-06;-1.3909116205468e-05;-2.3224220058182e-06;-0.00018796806398313;6.3371902797371e-05;-6.6612694354262e-05;0.00069475220516324;-0.0002032062766375;0.00014355321764015;-4.7587618610123e-05;-3.8969733395788e-06;-6.9204754254315e-05;0.00018680383800529;0.00016909143596422;-0.00021211899002083;1.2400586513195e-07;1.0609588571242e-05;-0.00040988935506903;4.1962925024563e-05;-4.3179432395846e-05;0.00032582352287136;-0.00019040849292651;0.00011648100917228;-1.2133727977925e-05;-1.0573102144917e-06;-0.0002948202600237;4.6553344873246e-05;-8.5122737800702e-05;-5.0338487199042e-05;7.7780670835637e-05;2.7760663215304e-05;2.1207053578109e-05;-0.0001634985092096;-9.2077920271549e-05;-0.00047448897385038;-0.0005743523943238;4.837865344598e-05;-0.00024317030329257;0.0001142412511399;-0.00016478444740642;-5.4135092796059e-05;-0.00011735669249902;-4.8608035285724e-05;-0.00016440273611806;-1.7624135580263e-05;0.00025761153665371;-3.6013945646118e-05;-0.0010499368654564;-0.00081014953320846;0.00047563019325025;0.00026583322323859;0.00078887114068493;0.0013551007723436;0.00023893499746919;0.00033325009280816;6.5570561673667e-06;1.5215107396216e-06;1.3613450846606e-06;8.5107865743339e-05;2.743521508819e-05;-3.8202982977964e-05;-2.1824072973686e-05;1.4166507753544e-05;-7.4268509706599e-06;-4.217580135446e-05;0.0003245864645578;0.00024896775721572;-0.0002299858169863;0.00018304548575543;-3.3047741453629e-05;-0.00038093863986433;7.7622498793062e-05;1.6754005628172e-05;-0.00011108595208498;-2.605429108371e-05;4.3320553231752e-05;0.00012734388292301;3.897072019754e-05;0.00028742867289111;0.00098803429864347;-8.2935352111235e-05;-6.4659470808692e-05;-0.00059041799977422;-0.00064217299222946;-0.00012555722787511;-1.6405011820098e-06;9.4033865025267e-05;-0.0001875827438198;1.0176828254771e-05;-2.0845182007179e-05;4.989016088075e-05;6.4009007473942e-05;9.6317889983766e-06;9.2980690169497e-06;-3.8901061998331e-06;-1.6966785551631e-05;-0.00028062437195331;0.00013315909018274;-1.5625657397322e-05;0.00079636328155175;-5.3754760301672e-05;-2.3518234229414e-05;-7.1752023359295e-05;1.3759014336756e-06;-4.4342592445901e-05;0.00017138539988082;7.3905088356696e-05;-0.00012522978067864;1.2132468327763e-05;5.5116674047895e-05;-0.00050602509872988;-1.317037276749e-05;-3.2814084988786e-05;0.00047316640848294;-0.00033740495564416;0.00016825288184918;-1.8386883311905e-05;-2.3430256987922e-06;-0.00035334180574864;3.3877193345688e-05;-7.4580937507562e-05;-2.4150140234269e-05;6.0257363657001e-05;1.8171471310779e-05;1.3274995581014e-05;-0.00013657688396052;-6.4641717472114e-05;-0.00027875340310857;-0.0004963509272784;4.4632033677772e-05;-0.00038579475949518;0.00014764444495086;-0.00013854801363777;8.5735976540491e-08;-9.1830064775422e-05;4.0499999158783e-06;-0.00017035820928868;-7.8932214819361e-05;0.00023232873354573;-3.1536666938337e-05;-0.0008726236410439;-0.0004848332318943;0.00042618907173164;0.00020420228247531;0.00042418000521138;0.0011920783435926;9.4579321739729e-05;0.00026677624555305;2.9717335564783e-05;9.3320566520561e-05;-2.5550056307111e-05;8.3272272604518e-05;2.8500582629931e-05;-4.6673678298248e-05;-2.149786814698e-05;1.8643137082108e-05;-3.8215812310227e-06;-4.7060791985132e-05;0.00020835577743128;0.00019159802468494;-0.00019115352188237;0.00038993533235043;7.0593428972643e-05;-0.00036979673313908;6.500485324068e-05;1.3844962268195e-05;-8.8016080553643e-05;2.300394953636e-05;-1.6743349988246e-05;6.0621383454418e-05;3.0348481232068e-05;0.00021678475604858;0.00056653685169294;-5.9119698562426e-05;-3.99874188588e-05;-0.00035820971243083;-0.00053315376862884;-9.489303920418e-05;1.5110312233446e-05;0.00011393412569305;-0.00025188800645992;3.7959011933708e-06;-4.9162514187628e-05;4.8704489017837e-05;8.768831321504e-05;1.4160730643198e-05;1.0052414836537e-05;3.116522293567e-07;-3.2236435799859e-05;-0.00043501297477633;0.00021957629360259;5.2409632189665e-06;0.0011177744017914;8.5295760072768e-05;-0.00019962294027209;-9.8604847153183e-05;5.9916014834016e-06;-2.8945418307558e-05;0.00018560589523986;-1.056735709426e-05;-8.1290600064676e-05;2.2362186427927e-05;9.1913934738841e-05;-0.00072747212834656;-3.0645551305497e-05;-4.5875924115535e-05;0.00070123589830473;-0.00052392785437405;0.00023328006500378;-1.8369717508904e-05;2.4607705199742e-05;-0.00049205927643925;2.5099659978878e-05;-8.3586499386001e-05;-6.0865932027809e-06;7.1794915129431e-05;2.186983692809e-05;4.6076033868303e-06;-0.00016554995090701;-4.5104134187568e-05;-0.00018562494369689;-0.00067401985870674;0.00010459265467944;-0.00081362994387746;0.00015015120152384;-4.1399016481591e-05;4.0580689528724e-05;-9.5217044872697e-05;5.9451656852616e-05;-0.00024726151605137;-0.00011405982513679;0.00023635038814973;-5.2287152357167e-05;-0.0010921754874289;-0.0004238813999109;0.00055419944692403;0.00023823544324841;0.00025333854136989;0.0016541540389881;3.6239673590899e-06;0.00028460708563216;9.3414510047296e-06;0.00031934914295562;-5.3366846259451e-05;0.00011568808258744;2.5933164579328e-05;-7.2497350629419e-05;-2.0052193576703e-05;3.2928473956417e-05;-3.7891561078141e-05;-7.8061486419756e-05;9.1360052465461e-05;7.2172324507846e-06;-0.00018725694098976;0.00059392332332209;0.00017092769849114;-0.00043293961789459;6.8236731749494e-05;-4.9885375119629e-06;-7.8464356192853e-05;6.5802996687125e-05;-7.4476782174315e-05;2.5329670734209e-06;8.3801014625351e-06;-4.5534601667896e-05;0.00024818346719258;7.2268121584784e-05;6.2236664234661e-05;-0.00014561135321856;-0.00025450912653469;-7.3330804298166e-05;9.1669950052164e-05;0.00015021052968223;-0.0003298356605228;-6.2814583543513e-06;-8.3707207522821e-05;5.7812278100755e-05;0.00012925111514051;1.4787301552133e-05;8.0294967119698e-06;5.2327804951346e-06;-3.4536609746283e-05;-0.00046088179806247;0.00024764420231804;5.3824091992283e-06;0.0011468816082925;0.00013365384074859;-0.00025918008759618;-0.00010198345262324;7.2668672146392e-06;-2.2214562704903e-05;0.00016320207214449;-4.2887819290627e-05;-4.5787859562552e-05;2.6552534109214e-05;0.00011995767999906;-0.00073500612052158;-4.4015865569236e-05;-5.5094678828027e-05;0.00072829535929486;-0.00058416544925421;0.00024039609706961;-1.7087169908336e-05;3.771205956582e-05;-0.0004965320113115;2.0104833311052e-05;-7.3729723226279e-05;1.395811295879e-06;6.6608306951821e-05;2.1366704459069e-05;-6.6709787915897e-07;-0.00016477891767863;-3.2646101317368e-05;-0.00011412118328735;-0.00068527570692822;0.00011656496644719;-0.00094693864230067;0.00013670456246473;-1.0781518540171e-06;5.8118588640355e-05;-8.4114275523461e-05;7.5113617640454e-05;-0.00026817916659638;-0.00011711686966009;0.00021654985903297;-5.5895507102832e-05;-0.0010895992163569;-0.00033425088622607;0.00056179380044341;0.00022920210903976;0.00013570243027061;0.0017072815680876;-4.2490060877753e-05;0.00026386295212433;1.0992034731316e-06;0.00040281357360072;-6.0747748648282e-05;0.00011897988588316;2.3919044906506e-05;-7.1173381002154e-05;-1.633074862184e-05;3.5465553082759e-05;-4.6293094783323e-05;-8.4112456534058e-05;1.2777324627677e-05;-4.9375354137737e-05;-0.00016630761092529;0.00069481460377574;0.00020429422147572;-0.00043494964484125;5.7233519328292e-05;-5.8315240494267e-06;-6.707674037898e-05;9.0858746261802e-05;-9.6020543423947e-05;-3.9675018342678e-05;-1.4220804587239e-06;-0.00013340482837521;6.4906620536931e-05;0.00011266290675849;9.6325253252871e-05;-1.1449546946096e-05;-0.00016516346659046;-4.5953271182952e-05;0.00010355487029301;0.00015213663573377;-0.00035539065720513;-9.0906987679773e-06;-0.00010005904186983;5.7258006563643e-05;0.00014561807620339;1.9158844224876e-05;-1.4575045497622e-05;5.5877117119962e-05;-5.8597066527e-05;-2.1660925995093e-05;0.00040093428106047;-0.00083625444676727;3.9949747588253e-05;0.00040776637615636;-0.00025470380205661;2.8816422855016e-05;8.8041299022734e-05;0.00025640471721999;-2.3184627934825e-05;-0.000102743433672;0.0001064203606802;-3.9970560465008e-05;-0.00022803797037341;0.00058126484509557;1.7466372810304e-05;0.00014751443814021;0.00063488172600046;-0.00068058882607147;-0.00015679017815273;-0.00016424834029749;-2.242155460408e-05;-6.420928548323e-05;-9.0468456619419e-05;-2.8763340651494e-06;-2.6157540560234e-05;2.9918337531853e-06;-4.6503701014444e-05;2.9223438104964e-05;2.2788079149905e-05;-0.00017242181638721;-0.00074062193743885;0.00016810598026495;-0.0016387762734666;0.00015794730279595;0.00019581922970247;4.0954055293696e-05;5.3732139349449e-05;0.0001075174077414;-0.00044837887980975;9.767970914254e-05;-7.2380724304821e-05;-9.2131609562784e-05;-6.8377215939108e-05;-0.0010947837727144;0.00012127766240155;0.00021184833894949;0.00059081165818498;0.0019147987477481;-0.00037053861888126;9.4204187917057e-05;-0.00017324567306787;0.0010537627385929;-3.4238553780597e-05;7.8762066550553e-05;-7.4711613706313e-05;7.2635979449842e-05;1.5241563232848e-05;2.40415083681e-05;8.4453013187158e-06;-8.9074856077787e-05;-7.5345793447923e-05;-3.9595786802238e-05;-0.00032545265275985;0.0013123004464433;-0.00011281581828371;-0.00047792203258723;0.0003353850916028;8.6440944869537e-05;-7.250825092342e-06;0.00020957429660484;-2.8825836125179e-05;-0.00034596642944962;-0.0001648441539146;-1.1567944966373e-05;-0.00037578595220111;-0.00064885965548456;0.00013862347987015;0.00021833751816303;-8.3882783656009e-05;0.00059696938842535;-5.3179624046606e-06;9.1406873252708e-05;-0.0004809177480638;0.00014749825641047;-0.00022201545652933;-1.0935780665022e-05;0.00028441194444895;5.2942472393624e-05;1.4963440662541e-05;-1.9533115846571e-05;5.6517641496612e-05;-3.6174729757477e-05;-0.00016809228691272;0.00051585637265816;-0.0011696686269715;6.4981163632183e-06;0.00039167629438452;-0.00024310532899108;4.3897543946514e-06;0.00010830142855411;0.00010313639359083;-1.7050559108611e-05;-2.0773926735274e-05;9.4876289949752e-05;-5.5941163736861e-05;-0.0001820405741455;0.00086085882503539;6.5520849602763e-05;0.00011486656148918;0.00069567054742947;-0.00089949939865619;-8.7713080574758e-05;-0.00022449935204349;0.00022800004808232;-4.8784077080199e-05;-2.0771487470483e-05;-9.57766224019e-06;-6.3882296672091e-05;5.9750700529548e-06;-3.6240551708033e-05;3.1262985430658e-05;6.1668738453591e-06;-0.00019600492669269;-0.00086252868641168;6.1593425925821e-05;-0.0016692755743861;0.0001903944357764;0.00015162897761911;9.3577706138603e-05;-9.6598187155905e-06;0.0001004869263852;-0.00046540022594854;0.00010992008901667;7.4070463597309e-05;-0.00012619751214515;-7.2926974098664e-05;-0.0013026740634814;-9.9791250249837e-05;0.0002534091763664;0.00067868392216042;0.0022209929302335;-0.00019399281882215;0.00019886165682692;-0.0001395130821038;0.0009667226113379;-3.1889998354018e-05;0.00013086959370412;-8.2518025010359e-05;-1.6343768720617e-06;2.1606148948194e-05;3.865514008794e-05;2.7468556318411e-09;-0.00011247876682319;-0.00010461381316418;-0.0001289330975851;-0.00022819872538093;0.0011705111246556;-0.00014849069702905;-0.00053185736760497;0.00034227260039188;4.485564204515e-05;2.9328788514249e-05;0.00019896657613572;-4.3689542508218e-05;-0.00023566337767988;-0.00016481449711137;-9.3785120043322e-06;-0.00049013388343155;-0.00047898010234348;0.00016329897334799;0.00029126458684914;0.00011428389552748;0.00042401836253703;8.4671330114361e-05;3.940108945244e-05;-0.00053259707055986;0.00016923648945522;-0.00020686141215265;-1.7505592040834e-05;0.00026001178775914;6.3417348428629e-05;-1.3690074638362e-06;-2.1517673303606e-05;6.5904692746699e-05;-1.2641850162254e-06;-0.00025011229445226;0.00061446626204997;-0.001532663940452;-5.0646762247197e-05;0.00033799716038629;-0.0001991176395677;5.2218756536604e-06;0.00012160497135483;-0.00011125639139209;-8.5256178863347e-06;6.4194959122688e-05;6.1761333199684e-05;-6.5283646108583e-05;-5.4127656767378e-05;0.0012207647087052;8.8626700744499e-05;4.4458560296334e-05;0.00061034265672788;-0.0011183226015419;-5.3653646318708e-05;-0.00027775292983279;0.00056053337175399;-1.5215948224068e-05;6.2418970628642e-05;-1.779230296961e-05;-9.2143629444763e-05;1.2469645298552e-05;-1.2848878213845e-05;3.3324442483718e-05;-4.2574312828947e-05;-0.00021865843154956;-0.0010941168293357;-0.00015911477385089;-0.0015523920301348;0.00021929126523901;5.5590950069018e-05;0.00019129387510475;-0.00010969357390422;7.3917872214224e-05;-0.00047011880087666;0.00011994781380054;0.00024322541139554;-0.0001773242111085;-8.4386214439292e-05;-0.0016068554250523;-0.00052689219592139;0.00036179623566568;0.00078368891263381;0.0026120003312826;0.00019504697411321;0.00039363963878714;-5.7687295338837e-05;0.00079990964150056;-1.9183267795597e-05;0.00018433430523146;-8.6939107859507e-05;-7.8196593676694e-05;2.9974386052345e-05;5.7057310186792e-05;-1.5118508599699e-05;-0.00014294251741376;-0.00012523285113275;-0.00026039272779599;-2.7061605578638e-05;0.00086429907241836;-0.00023263980983756;-0.00058478995924816;0.00030909426277503;-2.2270118279266e-05;8.1419624621049e-05;0.00012505281483755;-7.8366509114858e-05;-7.4584670073818e-05;-0.00013143420801498;-6.7466648943082e-06;-0.00054330326383933;-5.6068867706927e-05;0.0001984701375477;0.0003323282871861;0.00027792921173386;6.879678403493e-05;0.00022452720440924;-4.8308993427781e-05;-0.00049863255117089;0.00019786682969425;-0.00015571579569951;-1.9013843484572e-05;0.00021279907377902;7.2982831625268e-05;-1.5091487512109e-05;-1.7193879102706e-05;6.7686181864701e-05;1.7666157873464e-05;-0.00021057776757516;0.00056240643607453;-0.0015070502413437;-7.3862647695933e-05;0.00024789816234261;-0.00012094219709979;2.9120714316377e-05;0.000109700478788;-0.00020698914886452;3.2266680136672e-06;7.6937583799008e-05;1.2336494364718e-05;-6.0869122535223e-05;3.163695873809e-05;0.001249204040505;7.8357174061239e-05;1.2458481251088e-06;0.00043296534568071;-0.0010620839893818;-6.8572684540413e-05;-0.00026360776973888;0.00066951679764315;1.3830192074238e-05;8.4259867435321e-05;-2.3362861611531e-05;-7.6903437729925e-05;1.9112241716357e-05;7.1441349973611e-06;2.9741586331511e-05;-8.7114785856102e-05;-0.0002038020757027;-0.0011299711186439;-0.00030807970324531;-0.0012183375656605;0.00018144476052839;-6.4357227529399e-05;0.00026252365205437;-0.0001595724170329;4.404332867125e-05;-0.00042817235225812;0.00010259929695167;0.0003116826119367;-0.00019751104991883;-8.153331145877e-05;-0.0016150630544871;-0.00075572804780677;0.00041153255733661;0.00075110356556252;0.002511152299121;0.00047487588017248;0.0004986563581042;1.3036898963037e-05;0.00058658845955506;1.034008073475e-05;0.00018467575137038;-7.6476782851387e-05;-9.0503519459162e-05;3.5081877285847e-05;5.6933884479804e-05;-2.3476941350964e-05;-0.00013834206038155;-0.00010209111496806;-0.00021026471222285;0.00011590143549256;0.00064039282733575;-0.00028992566512898;-0.00057045568246394;0.00023982032143977;-4.2480955016799e-05;9.5411975053139e-05;5.7894027122529e-05;-0.00010429583198857;1.4182060112944e-05;-8.0144294770434e-05;3.1435679375136e-06;-0.00036530039506033;0.00031755422241986;0.00016169878654182;0.0002462636330165;0.00011120003910037;-0.00019304164743517;0.00024308712454513;-9.0035071480088e-05;-0.00041530729504302;0.00019918085308746;-0.00010923661466222;-9.3942626335775e-06;0.00017187734192703;6.9250396336429e-05;-2.0202223822707e-05;6.425240826502e-06;1.631742088648e-05;4.0504895878257e-05;6.5354011894669e-05;7.842545164749e-05;-0.00067420623963699;0.0002789607970044;-0.0002995495160576;0.00031107215909287;4.8453646741109e-05;1.0782584467961e-05;-0.00021397687669378;0.00014168316556606;0.00029731268296018;-0.00028909053071402;-3.0369545129361e-05;7.5590134656522e-05;0.00040330289630219;9.4315852038562e-05;-9.4939539849292e-05;-9.4177390565164e-05;-0.00024422199930996;-8.7993445049506e-05;-5.8012283261633e-05;0.00031048391247168;-8.4778330347035e-05;9.5901945314836e-05;-7.9786899732426e-05;-9.8058066214435e-05;9.4476105005015e-05;5.3094721806701e-05;3.6641922633862e-05;-0.00021774496417493;-0.00016841910837684;-0.0011488487944007;-0.00083681789692491;-0.00021794262283947;3.1430939998245e-05;-4.2037703678943e-05;4.0189250285039e-05;-0.00021950167138129;-0.00013252126518637;-0.00022296773386188;-7.1785558247939e-05;0.0002214824926341;0.00010595021012705;-8.0506208178122e-05;-0.0017461786046624;-0.0016455792356282;0.00064668362028897;0.00058450637152418;0.0021287892013788;0.0017554140649736;0.00064555316930637;0.00039982059388421;6.5126987465192e-05;-6.9153080403339e-05;0.00010821188334376;4.264438393875e-05;-3.6519151763059e-05;-9.0163193817716e-06;7.124910098355e-06;-1.1716054359567e-05;-6.9676185376011e-05;-6.1235172324814e-05;0.0002359582867939;0.00038702882011421;-0.0002549487107899;-0.00036154288682155;-0.00036183503107168;-0.00024677254259586;2.8773913072655e-05;6.9244313635863e-05;-0.00017736792506184;-0.0001634838845348;0.00018982935580425;0.00019389344379306;4.7014178562677e-05;0.00018083218310494;0.0017205638578162;-1.6838383089635e-05;-3.6279243431636e-06;-0.00065698771504685;-0.0008497012895532;2.1700871002395e-05;-8.4233244706411e-05;1.4739512153028e-05;6.2403072661255e-05;2.1513023966691e-05;2.7788786610472e-05;7.0425485318992e-05;4.1132931073662e-05;-1.8235357856611e-05;1.6431062249467e-05;-1.2837122994824e-05;5.0817303417716e-05;0.00012171761773061;-8.4588682511821e-05;-0.00052780739497393;0.00050166429718956;-0.00048190003144555;0.00046784518053755;6.7699118517339e-05;-2.966022475448e-05;-0.00020799528283533;0.0002224191557616;0.00038801599293947;-0.00041442725341767;-3.8241050788201e-05;3.4616034554347e-06;0.00011625303159235;0.00020099451649003;-0.00014218332944438;-0.00024524354375899;0.00010307672346244;-0.00011863176041516;1.9685490769916e-05;0.00023690762463957;-0.00019338142010383;9.5808798505459e-05;-0.00011222824105062;-0.00012194657756481;0.00013650979963131;7.1320348070003e-05;4.6925746573834e-05;-0.00027815889916383;-0.00018265987455379;-0.0013629422755912;-0.0011427301215008;-5.9758880524896e-05;-4.7253346565412e-05;-3.7566458104266e-06;-3.7033045373391e-05;-0.00026327863452025;-0.00021154123533051;-0.0002215932472609;-0.00015052138769533;0.00022258363605943;0.00024871944333427;-0.0001101868256228;-0.0021347154397517;-0.0022730315104127;0.00083053967682645;0.00064794905483723;0.0025032416451722;0.002522396389395;0.00077471201075241;0.00058232631999999;-1.7268097508349e-05;-0.0001025169112836;0.0001082243034034;9.7706164524425e-05;-2.2850954337628e-05;-3.4847456845455e-05;-2.3523841718998e-06;6.8791098328802e-07;-8.3990955317859e-05;-8.191293454729e-05;0.00030617709853686;0.00031378993298858;-0.00049602839862928;-0.00048597771092318;-0.00037138850893825;-0.00042832526378334;5.4362764785765e-05;3.8597914681304e-05;-0.00025155852199532;-0.00020970735931769;0.00023794919252396;0.0003057970025111;5.3663075959776e-05;0.00014056573854759;0.0022725388407707;1.5432264262927e-05;1.0856630069611e-05;-0.0008348316187039;-0.00084627943579108;-1.8204293155577e-05;-8.28110933071e-06;0.00012112931290176;4.9083635531133e-05;4.4543547119247e-05;4.8204023187282e-05;7.0036570832599e-05;3.5422923247097e-05;-9.0974899649154e-06;2.0829253116972e-05;-3.2779935281724e-05;3.5561617551139e-05;6.1382408603095e-05;-0.00014403888781089;-0.00026716396678239;0.00066714629065245;-0.00044974152115174;0.00040687253931537;4.6423221647274e-05;-4.8860139941098e-05;-0.00014180930156726;0.00024303770624101;0.00033644132781774;-0.00038592136115767;-2.9327366064535e-05;-5.847770080436e-05;-0.00023441298981197;0.00021776735957246;-0.00013067656254862;-0.00015508473734371;0.00024968438083306;-7.1084519731812e-05;6.6703163611237e-05;0.00011066404840676;-0.00028871884569526;7.0567599323113e-05;-0.00011444069241406;-0.00010515098256292;0.00013370608212426;6.5335480030626e-05;4.2347426642664e-05;-0.00026014909963124;-0.00015023718879092;-0.0011643886100501;-0.0011058489326388;6.1747603467666e-05;-0.00016953410522547;6.743217818439e-05;-0.00010529308201512;-0.00021238285989966;-0.00021836956148036;-0.00014877262583468;-0.00018827554595191;0.00012741227692459;0.00031351076904684;-0.00010502809891477;-0.0019422656623647;-0.0021026849281043;0.00079527555499226;0.00054250610992312;0.0020976031664759;0.0025212708860636;0.00064327794825658;0.00057934265350923;-4.7382272896357e-05;-7.1514215960633e-05;6.8941233621445e-05;0.0001213500945596;-1.6685139598849e-06;-5.3558149375021e-05;-1.2135256838519e-05;1.4124882000033e-05;-7.6220632763579e-05;-8.349751442438e-05;0.00029903967515565;0.00016324994794559;-0.0005390954320319;-0.00037783419247717;-0.000247029151069;-0.00047930469736457;7.1940550697036e-05;2.5696733700897e-06;-0.00023838347988203;-0.00017562320863362;0.0001911467697937;0.00030110904481262;4.1259037971031e-05;4.8549904022366e-05;0.0020311833359301;5.162777233636e-05;3.4047967346851e-05;-0.00075959804235026;-0.00060563074657694;-6.2979976064526e-05;6.2272156355903e-05;0.00017798092449084;-8.5245656009647e-06;4.4666066969512e-05;4.1766721551539e-05;5.7742618082557e-05;3.1579926144332e-05;2.5259864742111e-06;1.6288611732307e-05;-2.7937270715483e-05;7.6647602327284e-06;-0.00012025237811031;-2.7871694328496e-05;-0.0001216307937284;0.00077367364428937;-0.00029611645732075;0.00023720102035441;-1.5118953342608e-05;-2.4590741304564e-05;-9.0983958216384e-05;0.00022714883380104;0.00023258946021087;-0.00029235478723422;-1.2073749530828e-05;-4.7277590056183e-05;-0.00043651161831804;0.00012779388634954;-7.0545604103245e-05;0.00019864059868269;-4.493320830079e-06;5.5403503210982e-05;2.7619746106211e-05;3.0451608836302e-05;-0.00033321505179629;5.4306354286382e-05;-0.00010562663374003;-7.2590650233906e-05;0.00010788318468258;4.581284156302e-05;3.028354512935e-05;-0.00021777601796202;-0.00011855964839924;-0.0007778875879012;-0.00086135836318135;8.1563819549046e-05;-0.00028555589960888;0.00010513038432691;-0.0001353762781946;-0.00011771853314713;-0.00016909414262045;-7.8221273724921e-05;-0.00019144013640471;2.7950814910582e-05;0.00029568662284873;-6.8871384428348e-05;-0.001514138886705;-0.0013889264082536;0.00065607816213742;0.00040070054819807;0.0013432413106784;0.0019928191322833;0.00040831169462763;0.00046084693167359;-2.2748752599e-05;1.1256563539064e-06;2.2647671357845e-05;0.00011018922668882;1.7990814740187e-05;-5.2705967391375e-05;-2.1012767319917e-05;1.8409951735521e-05;-4.3899224692723e-05;-6.5340551373083e-05;0.00035573507193476;0.0001658479886828;-0.0003634276217781;-6.5091699070763e-05;-0.00011001506936736;-0.00043925354839303;9.1368936409708e-05;8.202057415474e-07;-0.00016388802032452;-9.2685004347004e-05;0.00010005983494921;0.00020816423057113;3.5429886338534e-05;0.00013842666521668;0.0014398009516299;1.4605882370233e-06;-3.6058072510059e-06;-0.00071311264764518;-0.00055211974540725;-0.00012851381325163;4.9932241381612e-05;0.00013500644126907;-0.00011257546429988;2.1167979866732e-05;7.517322046624e-06;5.5436139518861e-05;4.9956575821852e-05;2.1445192032843e-05;1.2090252312191e-05;-5.4100569286675e-06;-4.8691599658923e-05;-0.00062959094066173;0.00029914567130618;2.5249333702959e-05;0.0015892141964287;0.00019314693054184;-0.00035245440085419;-0.00013162799587008;1.2218028132338e-05;-2.0306948499638e-05;0.00023451329616364;-6.8745568569284e-05;-9.0585555881262e-05;3.0442855859292e-05;9.4977600383572e-05;-0.0010668986942619;-1.7618207493797e-05;-6.0240578022785e-05;0.0010037898318842;-0.00070589332608506;0.0003169038973283;-1.8469947463018e-05;4.766155325342e-05;-0.0006819540867582;2.1703486709157e-05;-0.00011304621148156;2.8489528176578e-06;0.00010618302621879;3.4096447052434e-05;-2.7949622563028e-06;-0.00023365182278212;-3.5169468901586e-05;-0.00019048333342653;-0.00099548418074846;0.00020054887863807;-0.0013766812626272;0.00015729683218524;6.8762165028602e-05;6.8420587922446e-05;-0.00012151915143477;0.00011533704673639;-0.00035992910852656;-0.00014630531950388;0.00028458615997806;-8.3713101048488e-05;-0.0015712002059445;-0.00055848900228739;0.00080039701424539;0.00032618013210595;0.00024418780230917;0.0024991831742227;-3.8694099202985e-05;0.00036198014277034;-2.7867386961589e-05;0.00058478076243773;-8.2737111370079e-05;0.00017023883992806;2.4286380721605e-05;-0.00011556279059732;-2.1584335627267e-05;5.3322441090131e-05;-9.7536059911363e-05;-0.00012359180254862;4.1999279346783e-05;-0.00025154094328173;-0.00021180519252084;0.00073083775350824;0.00025963320513256;-0.00054612394887954;9.7666445071809e-05;-3.7540172343142e-05;-8.3198603533674e-05;8.6587890109513e-05;-0.00012441628496163;-2.5693019779283e-05;-1.6594329281361e-05;-0.00040620667277835;8.6471511167474e-05;0.00026542445993982;0.00019903443171643;-5.0048660341417e-05;0.00013444069190882;-8.8310407591052e-05;0.00021153298439458;0.00019719357078429;-0.00039893013308756;-2.0573621441144e-05;-0.0001120264569181;7.7098862675484e-05;0.00017447709979024;2.5048384486581e-05;8.9285986177856e-06;7.9396231740247e-06;-5.6097327615134e-05;-0.00074782175943255;0.00039905394078232;1.3240124644653e-05;0.00182841764763;0.00025943591026589;-0.00046743566053919;-0.00015981146134436;1.4072796147957e-05;-2.3486511054216e-05;0.00022097512555774;-0.00010115995246451;-4.223755968269e-05;4.4337244617054e-05;0.00019179303490091;-0.0011783906957135;-6.4152540289797e-05;-9.2821908765472e-05;0.001169725204818;-0.00094651890685782;0.00037794164381921;-2.1440453565447e-05;7.0969625085127e-05;-0.0007629151805304;2.3830029022065e-05;-0.00010418709280202;8.8002798293019e-06;0.00010396775905974;3.6462872230913e-05;-9.862312253972e-06;-0.00026717310538515;-3.1336920073954e-05;-0.00010926308459602;-0.0011166284093633;0.00021783534612041;-0.0017189007485285;0.00018211168935522;7.9402838309761e-05;0.00010759857104858;-0.00011777524196077;0.00013984527322464;-0.0004519464855548;-0.0001777521247277;0.00031141765066423;-9.5001523732208e-05;-0.0017693188274279;-0.00046313687926158;0.00091871398035437;0.00035357876913622;9.9372191471048e-05;0.0028571595903486;-0.00011095160880359;0.00038647023029625;-2.375837721047e-05;0.00076422089478001;-0.00010385693894932;0.0001941255904967;3.2088875741465e-05;-0.00011374158202671;-1.9744034943869e-05;6.0534010117408e-05;-0.00010296091932105;-0.00014321385242511;-6.08457121416e-05;-0.0002370816655457;-0.00022316258400679;0.0011273159179837;0.00034845364280045;-0.00066940212855116;8.6389612988569e-05;-2.1286157789291e-05;-8.7114683992695e-05;0.0001566136488691;-0.00017258420120925;-0.00011107483442174;-2.198761467298e-05;-0.00043156833271496;-0.0001173757846118;0.00028624548576772;0.00022746331524104;0.00012291618622839;2.1487476260518e-05;-5.1264498324599e-05;0.00020656069682445;0.00023172749206424;-0.00054735026787966;-2.2372787498171e-05;-0.0001680308196228;9.0201312559657e-05;0.00024251212016679;1.6004672943382e-05;-3.418183496251e-07;3.0755072657485e-05;-4.2318366467953e-05;-0.00050609558820724;0.00024330381711479;-2.2073541913414e-05;0.0011791459983215;0.00022737945255358;-0.00038983236299828;-0.00011020487727365;4.5485526243283e-06;-1.0943555025733e-05;4.2641626350814e-05;-9.8310963949189e-05;2.9157548851799e-05;2.9897111744503e-05;0.00021120351448189;-0.00071376282721758;-9.4206006906461e-05;-5.427848736872e-05;0.0007738140411675;-0.00074482697527856;0.00024687388213351;1.6338757632184e-05;7.4797615525313e-05;-0.00038986853905953;1.2308008990658e-05;-2.8341981305857e-05;1.051206527336e-05;5.6724089517957e-05;2.7408785172156e-05;-1.9371673261048e-05;-0.00019333859381732;-1.8448934042681e-06;5.2713872719323e-05;-0.00080256070941687;0.00016661100380588;-0.0014757423195988;7.2215407271869e-05;0.00015524518676102;0.00010238714457955;-4.4023985537933e-05;0.00011280569015071;-0.00035905404365622;-0.00010191499313805;0.00012387843162287;-7.3965922638308e-05;-0.0012631637509912;-0.00014795841707382;0.00066722778137773;0.00024268274137285;-0.00012927825446241;0.0021087385248393;-0.00014791022113059;0.00021495739929378;-4.1182163840858e-05;0.0007370775565505;-7.9514938988723e-05;0.00012326455907896;1.5520972738159e-05;-4.1910148866009e-05;-4.2993347051379e-06;3.8108013541205e-05;-7.0830217737239e-05;-0.00010428087261971;-0.00018917700799648;-0.00015173578867689;-0.00013297633267939;0.0010952883167192;0.00029121903935447;-0.00049705378478393;2.6412471925141e-05;1.8000258933171e-05;-5.1554870879045e-05;0.00015121739124879;-0.00014853998436593;-0.00021152665431146;-2.1856803869014e-05;-0.00031657796353102;-0.0003483779146336;0.00020387439872138;0.00018063044990413;0.00032500174711458;-8.072194759734e-05;3.3804968552431e-05;0.00010624143033056;0.00016480300109833;-0.0004246681346558;-1.4001274394104e-05;-0.00016369759396184;6.3282481278293e-05;0.00023399254132528;7.5491989264265e-06;-3.5466237022774e-06;5.2506664360408e-05;-3.8452271837741e-05;-0.00034147332189605;9.9709592177533e-05;-5.358532507671e-05;0.00072981195989996;0.0002244668721687;-0.00038166591548361;-7.4206305725966e-05;-2.6445337425685e-05;-1.914555014082e-06;-0.00011243517656112;-0.00010369648953201;0.00014978527906351;1.8572201952338e-05;0.00023053563199937;-0.00039326370460913;-0.00012015306128887;-1.9849898308166e-05;0.00050210801418871;-0.0006021133158356;0.0001521769881947;8.452311885776e-05;8.5321204096545e-05;-0.00012643857917283;2.9605362215079e-06;5.225853601587e-05;1.3168353689252e-05;-6.2143276409188e-06;2.2676798835164e-05;-2.5739864213392e-05;-0.00015160437033046;7.3725273068703e-06;0.00015197804896161;-0.00065671803895384;0.00012022032751702;-0.0013576396740973;2.9940940294182e-05;0.00018182864005212;0.00010519243369345;1.4799601558479e-05;9.6425137598999e-05;-0.00032337193260901;-7.0334426709451e-05;-4.4739485019818e-05;-6.9283007178456e-05;-0.0010038947220892;5.8037723647431e-05;0.00053882302017882;0.0002050024777418;-0.0002714540460147;0.0017047845758498;-0.0001809757668525;0.00011637961870292;-3.5886510886485e-05;0.00078799290349707;-6.7672102886718e-05;6.1258469941095e-05;9.0648027253337e-06;4.7535795602016e-05;5.368819074647e-06;2.2336038455251e-05;-3.0288105335785e-05;-8.2796279457398e-05;-0.00029441560036503;-4.831274782191e-05;-0.00010471580753801;0.0012570639373735;0.00027363613480702;-0.00043517607264221;-2.4702334485482e-05;5.8852812799159e-05;-4.2100004066015e-05;0.00014944151917007;-0.00013668168685399;-0.00033999214065261;-2.0680077795987e-05;-0.00013656438386533;-0.00049394252710044;9.3004113296047e-05;0.00014796633331571;0.00049309118185192;-0.00035965431015939;0.00010747271880973;2.0472023606999e-05;0.00013960516662337;-0.00035241016303189;-1.7174116919705e-06;-0.00017524498980492;4.9113528802991e-05;0.00026197033002973;4.2246225348208e-05;-1.7629170542932e-05;6.5943924710155e-05;-9.8571726994123e-05;0.00037388573400676;0.00025888113304973;-0.00040053646080196;4.7620691475458e-05;0.00032580218976364;-0.00021025113528594;4.9358818614564e-06;7.7433025580831e-05;0.00057826976990327;-4.7990422899602e-05;5.2711104217451e-05;8.0951336713042e-05;-5.8495043049334e-06;-0.00027297958149575;0.0003078589506913;-0.00013712313375436;0.0002128359337803;0.00053875491721556;-0.00045453125494532;-0.000252654455835;-9.6959047368728e-05;-0.00070881022838876;-3.8981313991826e-05;-0.00015059790166561;3.0377880193555e-06;-9.6811229013838e-05;1.9107956177322e-05;-7.6174881542102e-05;3.636785550043e-05;9.9310600489844e-05;-0.00019493882427923;-0.00040185340913013;0.00029801062191837;-0.0019134043250233;0.00018351402832195;0.000383555656299;-0.00010153591574635;0.00015710399020463;0.00012132029951317;-0.00038641071296297;8.8583641627338e-05;-0.00021687021944672;-1.8794689822244e-05;-3.6732133594342e-05;-0.00095963262720034;0.00039178706356324;2.1174551875447e-05;0.00058260752120987;0.0017735825385898;-0.00062349520158023;-0.00016905427037273;-0.00020431248412933;0.0011729162652045;-7.9092475061771e-05;2.7044266971643e-05;-6.8841385655105e-05;0.00011238303704886;1.8815560451912e-06;-6.0581219258893e-06;2.9297319997568e-05;-5.0429225666448e-05;-0.00012226657418068;-2.1123576516402e-05;-0.00044999568490312;0.0013648548629135;-2.8675754947471e-05;-0.00039637586451136;0.00032792612910271;0.00016955139290076;-2.4853252398316e-05;0.00020306120859459;4.8824730924935e-08;-0.00051784742390737;-0.00017650866357144;-5.5500399867014e-06;-0.00056060776114464;-0.00094038218958303;0.00011270418326603;0.00032766544609331;9.8937365692109e-05;0.00080624548718333;-0.00013717230467591;0.00014215853298083;-0.00037053209962323;0.00011067107698182;-0.00025762993027456;-2.0879293515463e-05;0.00034518988104537;4.8576061089989e-05;5.3809402743354e-05;-3.0084331228863e-05;7.2372087743133e-05;-9.441671136301e-05;0.00010108123387909;0.00053659017430618;-0.0010435464791954;4.8158151912503e-05;0.00050949695287272;-0.00033190831891261;-2.7760694138124e-05;0.0001290265499847;0.00052679429063573;-5.0771650421666e-05;5.0053742597811e-05;0.00013602861145046;-4.8049478209578e-05;-0.0003535007708706;0.00075141375418752;-2.6627460101736e-05;0.00023554664221592;0.00092976453015581;-0.00091892218915746;-0.00019194115884602;-0.00021934807591606;-0.00043315338552929;-7.0532099925913e-05;-0.00012082284229109;-1.0098239044964e-06;-0.00013418956950773;1.6448879250675e-05;-9.326988219982e-05;5.0337948778179e-05;0.00011457655637059;-0.00027625189977698;-0.00077198434155434;0.0003293878689874;-0.0026540206745267;0.0002893241471611;0.0004660171107389;-7.5700139859691e-05;0.00014066878065933;0.00016273588698823;-0.00058305449783802;0.00014251747052185;-0.0001325610501226;-6.8809145886917e-05;-7.0602101914119e-05;-0.0015141745097935;0.00032629340421408;0.00012177884491393;0.00086939369793981;0.0027594522107393;-0.00071467878296971;-8.8161606981885e-05;-0.00026504384004511;0.0015621358761564;-0.00010757650306914;0.00010738122364273;-0.00010544546239544;6.9900866947137e-05;9.4324932433665e-06;2.2246818843996e-05;2.7331961973687e-05;-0.00010953532910207;-0.00019204501586501;-0.00021732924506068;-0.00053651194320992;0.0017294897697866;-5.4759919294156e-05;-0.00060179788852111;0.00047485315008089;0.00014499251847155;3.9575847949891e-06;0.0003059103328269;-5.6297885748791e-06;-0.00054439291125163;-0.0002580173604656;-2.2955278836889e-05;-0.00095168821280822;-0.0012040378060192;0.0002352337614866;0.00054196309065446;0.00045904779108241;0.00097114616073668;-2.7134035917697e-05;0.00013932901492808;-0.00062699936097488;0.00017185806063935;-0.00032931461464614;-3.8256697735051e-05;0.00041422119829804;7.8824181400705e-05;4.9539175961399e-05;-3.7319648981793e-05;4.7267323679989e-05;-3.1653162295697e-05;-0.00024388231395278;0.00065689539769664;-0.0014281783951446;-9.9426715678419e-06;0.00044586270814762;-0.0002970306086354;-8.5084066085983e-05;0.00013859962928109;0.00021784803539049;-3.8815385778435e-05;0.00015380773402285;0.00012203131336719;-7.9544734035153e-05;-0.00023635267280042;0.001076661515981;0.00010970183211612;0.00012718656216748;0.00094140856526792;-0.001134997815825;-4.2759866119013e-06;-0.00028311251662672;3.4284512366867e-05;-4.960818841937e-05;6.0723700698873e-06;-5.3979670155968e-06;-0.00017579698760528;1.3826546819473e-05;-7.4006398790516e-05;4.8771660658531e-05;0.00010136359924218;-0.00027043512091041;-0.00076245429227129;0.00015531312965322;-0.0024213206488639;0.00032064571860246;0.000384859071346;-1.7588050468476e-05;4.786167119164e-05;0.00013035864685662;-0.00051510834600776;0.00014696494326927;0.00010107550042449;-9.8686388810165e-05;-6.5621505200397e-05;-0.0015733244363219;-8.6652880781912e-06;0.00011744470975827;0.00086937198648229;0.0028267349116504;-0.00041421013884246;8.0533072832623e-06;-0.00018800493853632;0.0012371686752886;-0.00010602989641484;0.00017182440205943;-0.00010252132778987;-6.3457002397627e-05;1.3621925063489e-05;4.5479064283427e-05;1.4393923265743e-05;-0.00012985778448638;-0.00024434606893919;-0.00047440812340938;-0.00034562801010907;0.0011825658148155;-4.7280791477533e-05;-0.00056426995433867;0.00042497392860241;3.9168629882624e-05;6.7995577410329e-05;0.00026144730509259;-8.2985479821218e-06;-0.00029023722163402;-0.00023832227452658;-3.1305426091421e-05;-0.0012254298198968;-0.00093267287593335;0.00029393073054962;0.00069324515061453;0.0010534457396716;0.00063093192875385;0.00015236539184116;3.8560883695027e-05;-0.00060706399381161;0.00016413728008047;-0.00025230119354092;-5.4314652516041e-05;0.00029694510158151;8.6150335846469e-05;2.1885398382437e-05;-3.1937208404997e-05;5.1971423090436e-05;1.1010894013452e-05;-0.00028823135653511;0.0006578792235814;-0.00158132892102;-7.0529305958189e-05;0.00037165530375205;-0.00024464511079714;-5.2155824960209e-05;0.00012457233970053;-2.7268879421172e-05;-3.0344981496455e-05;0.00015262547822203;9.6496063633822e-05;-7.680595444981e-05;-5.5774358770577e-05;0.001286608632654;0.00012223314843141;2.1607484086417e-05;0.00068150699371472;-0.0011735681910068;5.8243240346201e-06;-0.00028450976242311;0.00040674541378394;-1.9487277313601e-05;7.2120281402022e-05;-6.864381248306e-06;-0.00015289442671929;1.1603463462961e-05;-3.975683284807e-05;4.3552827264648e-05;3.4172622690676e-05;-0.00024536368437111;-0.00094820896629244;-7.5726617069449e-05;-0.001968692522496;0.00030992573010735;0.0002429044834571;8.5526808106806e-05;-5.6139164371416e-05;8.5900159319863e-05;-0.00046200834913179;0.00014291623665486;0.00021912882220931;-0.00014025346899871;-7.7677512308583e-05;-0.0016501443460584;-0.00043941746116616;0.00023966682783794;0.00084112415788695;0.0028375417459756;1.9228484234191e-05;0.00021655227465089;-8.9258719526697e-05;0.00094827997963876;-8.0582525697537e-05;0.00019514480663929;-9.3672017101198e-05;-0.00011320161138428;1.8537752112024e-05;6.2269245972857e-05;-3.6376379739522e-06;-0.00015205788076855;-0.00022141529188957;-0.00060792261501774;-0.00011998924310319;0.00073030829662457;-0.00012732001778204;-0.00053238711552694;0.00034042028710246;-4.7070236178115e-05;0.00010427272354718;0.00014489419118036;-3.9481194107793e-05;-0.00010672675125534;-0.0001744244073052;-3.365245720488e-05;-0.0011248819064349;-0.00043150779674761;0.00032604509033263;0.00063016329659149;0.0011002724058926;0.00023741734912619;0.00030515101389028;-4.6759556425968e-05;-0.00046550945262425;0.00017211156955454;-0.00016330525977537;-4.6449447836494e-05;0.00021013869263697;8.1034042523243e-05;-7.7308231993811e-06;-1.9339322534506e-05;6.0788632254116e-05;2.6658795832191e-05;-0.00015871207870077;0.00052665546536446;-0.0014079774264246;-9.9902841611765e-05;0.00026170740602538;-0.00015917046403047;1.1324679690006e-05;9.3174479843583e-05;-0.00015630558482371;-1.8660142814042e-05;0.0001033899243339;5.1432205509627e-05;-5.3851021220908e-05;7.5820382335223e-05;0.0012204268714413;6.8233006459195e-05;-3.6512436054181e-05;0.00033660445478745;-0.00098344951402396;-6.1695798649453e-05;-0.00022891543630976;0.00055775401415303;1.017227259581e-05;8.2827638834715e-05;-8.8245451479452e-06;-9.7662901680451e-05;1.1740038644348e-05;-6.1645896494156e-06;3.3626940421527e-05;-3.8716912968084e-05;-0.00019761046860367;-0.0010463731596246;-0.00025062140775844;-0.0013535048346967;0.00024295441107824;8.0152945884038e-05;0.00017133235814981;-0.00012700831575785;4.2553405364743e-05;-0.00038777154986747;0.00011751298734453;0.00024413944629487;-0.00015906342014205;-8.0740450357553e-05;-0.0015370065812021;-0.0007186860893853;0.00034376521944068;0.00072388694388792;0.0025130938738585;0.0003716346109286;0.00038584831054322;-1.8971800272993e-06;0.00065418728627264;-3.9554695831612e-05;0.00017636515258346;-7.4903626227751e-05;-0.00010303771705367;2.1607354938169e-05;6.2095103203319e-05;-1.704751412035e-05;-0.00014840878429823;-0.00014804292004555;-0.00052308704471216;5.2556155424099e-05;0.00042440355173312;-0.00021481829753611;-0.00046836916590109;0.00023244328622241;-8.1394435255788e-05;0.00010236970410915;3.2567029847996e-05;-7.288913911907e-05;-2.3276830063423e-07;-9.2373207735363e-05;-2.3853499442339e-05;-0.00073877320392057;7.0914378738962e-05;0.00028064171783626;0.00041450239950791;0.00070139410672709;-7.0389098254964e-05;0.00034036888973787;-8.5750027210452e-05;-0.00029798288596794;0.00017006511916406;-8.8309323473368e-05;-2.3786895326339e-05;0.00014710208051838;6.4084633777384e-05;-2.3889630028862e-05;2.7606294679572e-05;-3.9590850064997e-05;6.2544932006858e-05;0.00035792283597402;-0.00037843713653274;-0.00020870279695373;0.00033186547807418;-0.0004567586875055;0.00043065461795777;0.00014110881602392;-0.00010624905553414;-0.00011823862587335;0.00017945899162441;0.00030185864306986;-0.00032966615981422;-4.0276390791405e-05;-7.7080323535483e-05;-3.8192225474631e-05;0.00031671478063799;-0.00020911439787596;-0.00080036924919114;0.00083206308772787;-0.00027067284099758;0.0001826381922001;0.00014563460717909;-0.00019804362091236;4.1941624658648e-05;-7.5290474342182e-05;-9.7922114946414e-05;0.00011648166400846;6.8865338107571e-05;4.2845931602642e-05;-0.00019582583627198;-9.9625409347937e-05;-0.0012340563116595;-0.0010919690830633;8.3137900219299e-05;-1.3313606359588e-05;5.8114816056332e-05;-3.5034350730712e-05;-0.00025377018027939;-0.00022756755060982;-0.0001380543835694;-0.00012743963452522;0.0001657915126998;0.00025962910149246;-0.00014590154751204;-0.0017452866304666;-0.0025011538527906;0.00069081736728549;0.00048422507825308;0.0023248784709722;0.0025139094796032;0.00067245803074911;0.00054380670189857;-8.6297892266884e-05;-0.00012910713849124;9.2371781647671e-05;0.00011495399667183;-3.1156232580543e-05;-6.0246100474615e-05;8.3379700299702e-06;1.3877873243473e-05;-0.00011266459478065;-9.7427116998006e-05;-0.00014299190661404;-0.00013598769146483;-0.0007679684786126;-0.00072520098183304;-0.00026340107433498;-0.0003942200273741;-1.3868910173187e-05;-3.5659177228808e-05;-0.00028970060520805;-0.00023100060934667;0.00023592039360665;0.00033853272907436;1.7362668586429e-05;-0.00037153600715101;0.0019625490531325;0.00021487451158464;0.00016140134539455;-0.00017723278142512;-0.00010116364865098;0.0001383706839988;0.00015682088269386;0.00029124048887752;0.00015307957073674;8.093014912447e-05;8.0512560089119e-05;2.2399881345336e-05;-1.6187212168006e-05;-1.9101427824353e-05;2.9470795197994e-05;-5.0764050683938e-05;5.372061059461e-05;0.00031566547113471;-0.00039289929554798;-0.00011309058754705;0.00043407871271484;-0.00045846274588257;0.00041991347097792;0.00012910824443679;-0.00011042349069612;-9.5036673883442e-05;0.00019949061970692;0.00029351611738093;-0.00033302677911706;-3.7803500163136e-05;-0.00012472581875045;-0.00020620042050723;0.00033256917959079;-0.00019637333753053;-0.00071890593972057;0.00087702658493072;-0.00024273715098388;0.00019438379968051;9.3405702500604e-05;-0.00024987812503241;3.4471635444788e-05;-8.2529775681905e-05;-9.4941751740407e-05;0.00012007990881102;6.8486260715872e-05;4.158867886872e-05;-0.00019902845087927;-9.3641792773269e-05;-0.0011819846695289;-0.0011000053491443;0.00013777265849058;-7.8460878285114e-05;8.3786435425282e-05;-6.8121058575343e-05;-0.00023829827841837;-0.00023386112297885;-0.00011525247100508;-0.00015172790153883;0.00013118887727614;0.00029744644416496;-0.0001440965133952;-0.0017251411918551;-0.0024612210690975;0.00070115632843226;0.00045875916839577;0.0021997292060405;0.0025733709335327;0.00063905224669725;0.00055654183961451;-0.00010016776650446;-0.00011503275163705;7.7673612395301e-05;0.00012803642312065;-2.0239394871169e-05;-6.8308203481138e-05;2.0537349882943e-06;2.0184021195746e-05;-0.00010975662735291;-9.6988267614506e-05;-8.3270198956598e-05;-0.00019281257118564;-0.00076371751492843;-0.00069104175781831;-0.00022606264974456;-0.0004273918166291;5.7221045608458e-06;-5.2038969442947e-05;-0.00028213299810886;-0.00022156289196573;0.00021927595662419;0.00034437837894075;1.5447834812221e-05;-0.00037576755858026;0.001927254605107;0.00021893797384109;0.00015909393550828;-0.00024623307399452;-1.5971096217982e-05;9.4014962087385e-05;0.00018846659804694;0.00029945975984447;0.00012800731929019;7.6748765422963e-05;7.9686877143104e-05;2.2932857973501e-05;-1.6917694665608e-05;2.2918773538549e-05;8.3141731010983e-06;-1.1674071174639e-05;-4.5799675717717e-05;-0.00061492144595832;0.00028793202363886;3.4717104426818e-05;0.0015302288811654;0.00020884115656372;-0.0003586090169847;-0.00012371172488201;1.9804272596957e-05;-9.5959567261161e-06;0.0002109690249199;-8.4658546256833e-05;-9.0537047071848e-05;2.8864998967038e-05;6.6138432885054e-05;-0.0010482665384188;3.1365552786156e-06;-5.8282777899876e-05;0.00097598310094327;-0.00066119077382609;0.00030077289557084;-2.4333468900295e-05;4.7701956646051e-05;-0.00063622929155827;1.4744457985216e-05;-0.00010934619058389;6.0398451751098e-06;0.00011004882253474;3.5144807043253e-05;-9.0395251390873e-06;-0.00022661799448542;-1.5602428902639e-05;-0.00014464171545114;-0.0009541236795485;0.00022352610540111;-0.0014545064186677;0.00011662321048789;0.0001332183892373;7.0255759055726e-05;-0.00010727905464591;0.00012408060138114;-0.00035037015913986;-0.00012795564543922;0.00025805312907323;-8.2121885498054e-05;-0.0015200073830783;-0.00051208812510595;0.00077740760752931;0.00029387752874754;0.00017236793064512;0.002484934637323;-5.581152436207e-05;0.00031642778776586;-5.1913706556661e-05;0.00062393635744229;-8.2236263551749e-05;0.00016871314437594;1.737080856401e-05;-0.00012162231723778;-1.6627769582556e-05;5.5066768254619e-05;-0.00012567082012538;-0.00012505198537838;8.868857548805e-06;-0.00040324847213924;-0.00016185559798032;0.00061456393450499;0.0002534668892622;-0.00048717323807068;0.00010031915735453;-5.5212673032656e-05;-6.0992424550932e-05;7.725696923444e-05;-0.0001295963593293;-3.4299831895623e-05;-3.213051968487e-05;-0.00060808297712356;-5.3671534260502e-05;0.00036362861283123;0.00025427987566218;1.1404958968342e-05;0.00045426236465573;-8.5769563156646e-05;0.00025285151787102;0.00017302139895037;-0.00034167585545219;-2.9292816179805e-05;-0.00010161200771108;7.3144059570041e-05;0.00015982912736945;2.743542609096e-05;2.8601182293642e-06;7.9246422046708e-07;-5.0986567657674e-05;-0.00072716735303402;0.00038321476313286;2.1142248442629e-05;0.0017511750338599;0.00026604626327753;-0.00045983647578396;-0.00015128287486732;2.7682983272825e-05;-1.2499791409937e-05;0.00018922654271591;-0.00011124499724247;-5.9463662182679e-05;4.2149564251304e-05;0.0001604096905794;-0.0011492514749989;-4.095742770005e-05;-9.014338866109e-05;0.0011339536868036;-0.00089830427896231;0.00035905509139411;-3.4055596188409e-05;6.8815592385363e-05;-0.00068848102819175;1.7241036402993e-05;-0.00010224651487079;9.8564833024284e-06;0.00011486453877296;3.861897130264e-05;-1.8087321222993e-05;-0.00026220505242236;-6.3516099544358e-06;-6.1697792261839e-05;-0.0010535208275542;0.00024598551681265;-0.0018196337623522;0.00012793134374078;0.00016090407734737;0.0001075726468116;-9.9256561952643e-05;0.00014742853818461;-0.00043729963363148;-0.0001507610140834;0.00028343734447844;-9.1380177764222e-05;-0.0017164752352983;-0.00041373798740096;0.00089622032828629;0.00030877345125191;2.4662107534823e-05;0.002846984192729;-0.00012458191486076;0.00032540201209486;-5.4737487516832e-05;0.0008051919285208;-0.00010187302541453;0.00019234708452132;2.3327302187681e-05;-0.00012318724475335;-1.3367985957302e-05;6.1355291109066e-05;-0.00014142891450319;-0.00014296163863037;-8.8853419583756e-05;-0.00041205686284229;-0.00016197480726987;0.00096966879209504;0.00033574420376681;-0.0005990868085064;9.2993162979838e-05;-3.9768761780579e-05;-6.0962083807681e-05;0.00014237200957723;-0.00017650946392678;-0.00011734892905224;-3.8886846596142e-05;-0.0006807473837398;-0.0002632025280036;0.00041175531805493;0.00028793033561669;0.00017579417908564;0.00041462277295068;-5.3243118600221e-05;0.00025054311845452;0.00020043762924615;-0.00047513886238448;-3.3862073905766e-05;-0.00015457459085155;8.6483654740732e-05;0.00022427459771279;2.2331854779623e-05;-8.4933699326939e-06;2.805908661685e-05;-4.1482435335638e-05;-0.00057165080215782;0.00027567090000957;-1.7712151020532e-05;0.00130246556364;0.00025503721553832;-0.00042462805868126;-0.00012347831216175;2.7873455110239e-05;-4.2265655793017e-06;2.3359443730442e-05;-0.00011288677342236;-1.3934302842245e-05;3.3512547815917e-05;0.00022108064149506;-0.00080481759505346;-9.0203146100976e-05;-6.3137129473034e-05;0.00087338575394824;-0.00083572464063764;0.0002750372805167;-8.1100470197271e-06;7.9277015174739e-05;-0.00036598660517484;1.049982256518e-05;-3.9709673728794e-05;9.98319228529e-06;8.8607870566193e-05;3.4180811780971e-05;-3.0837167287245e-05;-0.00022269855253398;2.5057282982743e-05;9.5436102128588e-05;-0.00082646642113104;0.00021699229546357;-0.0017967673484236;3.2350806577597e-05;0.00025210148305632;0.00011649118096102;-3.3012773201335e-05;0.00013384324847721;-0.0003908242797479;-9.134550782619e-05;0.00013684466830455;-7.6650496339425e-05;-0.0014053611084819;-0.00012596191663761;0.00075250404188409;0.00021732579625677;-0.00020939405658282;0.0024119266308844;-0.00017601730360184;0.00017808427219279;-7.4701601988636e-05;0.00086010037921369;-8.8972483354155e-05;0.00014283331984188;1.0386121175543e-05;-6.744745769538e-05;1.4760884141651e-06;4.3208823626628e-05;-0.00012801674893126;-0.00011643883044599;-0.00022671734041069;-0.00033321513910778;-9.1934336523991e-05;0.0010759553406388;0.00031995997414924;-0.00050615612417459;4.4072796299588e-05;5.2328869060148e-06;-3.4068671084242e-05;0.00015833845827729;-0.00017451973690186;-0.00023566764139105;-3.825654857792e-05;-0.00062537012854591;-0.00051665568025783;0.00037407313357107;0.00025518942857161;0.00039400203968398;0.0003183176741004;2.6820576749742e-05;0.00015811232151464;0.00015834739315324;-0.00042188132647425;-2.9665019610547e-05;-0.00017352642316837;7.1178626967594e-05;0.00024780409876257;1.1424941476434e-05;-1.323925152974e-05;7.4020041211043e-05;-4.4851294660475e-05;-0.00036700261989608;1.4773913790123e-05;-6.2762628658675e-05;0.00072903442196548;0.00025430257664993;-0.00042435602517799;-8.5077634139452e-05;-1.8203145373263e-05;1.0241148629575e-05;-0.00022777447884437;-0.00011629719665507;0.00012571406841744;1.104559032683e-05;0.00027474417584017;-0.00040018730214797;-0.00015514934784733;1.781487299013e-05;0.00054353690939024;-0.00068236741935834;0.00015724955301266;0.00011314969015075;9.0715948317666e-05;6.6730768594425e-05;4.4062269921596e-07;7.7322758443188e-05;9.3933294920134e-06;1.5613024515915e-05;3.1074639991857e-05;-4.2205228965031e-05;-0.00019102514488623;3.9255322917597e-05;0.00023517984664068;-0.00068017939338461;0.00016554827743676;-0.0017912950133905;-2.442677396175e-05;0.00031268951715901;0.00013147691788618;5.0268790801056e-05;0.00011863395775435;-0.00036708585685119;-5.3909574489808e-05;-0.00010276686953148;-7.439506589435e-05;-0.0011821754742414;0.00015480277943425;0.0006528464728035;0.0001777811703505;-0.00041877958574332;0.0020616864785552;-0.00023359534679912;4.9209011194762e-05;-6.992861017352e-05;0.0010055615566671;-7.9676974564791e-05;6.0318794567138e-05;2.9591676593554e-06;6.2152059399523e-05;1.570160020492e-05;1.9930574126192e-05;-7.3627699748613e-05;-9.4434530183207e-05;-0.00039064287557267;-0.00015677472401876;-7.6727294072043e-05;0.0014515513321385;0.00032241534790955;-0.00047632944188081;-2.8273772841203e-05;8.1799407780636e-05;-3.0682786018588e-05;0.00015745422570035;-0.0001687199837761;-0.00046828595804982;-3.1805935577722e-05;-0.00035042475792579;-0.00072773400461301;0.00021417076641228;0.00020790628332179;0.00065692252246663;-0.00017810364079196;0.00013776084233541;2.4232103896793e-05;0.00014262562035583;-0.00034318142570555;-1.1570236893022e-05;-0.0002124580059899;5.7409542932874e-05;0.00032989689498208;8.0055382568389e-05;-3.0413855711231e-05;6.1561862821691e-05;-0.00012276144116186;0.00055175489978865;0.00023821799550205;-0.00025819506845437;4.4984011765337e-05;0.00023814140877221;-0.00015717369387858;-8.1242869782727e-05;9.4838316726964e-05;0.00083786336472258;-6.5505439124536e-05;0.00033129611983895;4.2491363274166e-05;-8.3922695921501e-06;-0.00038545727147721;0.00022239446116146;-0.00018819549586624;0.00029177882242948;0.00068371027009562;-0.00043471928802319;-0.00023276300635189;-0.00010049257252831;-0.0013029000256211;-6.156059953355e-06;-0.00015274777251761;9.7574354640528e-07;-0.00023450765002053;4.1559727833373e-05;-0.00010987024870701;4.6103152271826e-05;0.00020341332128737;-0.00025545820244588;0.00013581854000222;0.00038121078978293;-0.0023204211611301;0.00021692359587178;0.00052990112453699;-0.00020211387891322;0.0002394754847046;0.00014300405746326;-0.00030345021514222;8.0381287261844e-05;-0.0001704160385998;2.1889147319598e-05;2.3565764422528e-05;-0.00091269938275218;0.00063307024538517;-0.00029948825249448;0.00065735261887312;0.0017659245058894;-0.00084826909005642;-0.00047671241918579;-0.00022405393247027;0.0011394437169656;-0.00010414735152153;2.1511892555282e-05;-7.1427479269914e-05;6.0885715356562e-05;-1.3472888440447e-06;-3.9472310163546e-05;5.343802695279e-05;6.816711902502e-06;-0.0002397403732175;9.0728855866473e-05;-0.00056905881501734;0.0014015274355188;5.650145249092e-05;-0.00038239912828431;0.00036073077353649;0.0002683119091671;-1.1405952136556e-05;0.00026440669898875;2.3728960513836e-05;-0.00060454610502347;-0.00021820937399752;2.1856791136088e-05;-0.00094636698486283;-0.0012446123873815;1.2844993761973e-05;0.00059319799765944;0.00051413977053016;0.00097559212008491;-0.00032407735125162;0.00017488363664597;-0.00043195666512474;9.7255542641506e-05;-0.0003124205104541;-4.4868069380755e-05;0.00039210164686665;6.1070757510606e-05;8.2980652223341e-05;-3.9555667171953e-05;4.5344248064794e-05;-8.6102088971529e-05;0.00012351870827843;0.00047462939983234;-0.0008338094339706;3.9864469727036e-05;0.00040190172148868;-0.00026627341867425;-0.00010763775208034;0.00012463962775655;0.00063936220249161;-5.8814381191041e-05;0.00023055415658746;0.00010178113006987;-5.3914754971629e-05;-0.00038329561357386;0.00060667120851576;-1.3628971828439e-05;0.00023854585015215;0.00095564016373828;-0.00080903683556244;-0.00010128150461242;-0.00020041530660819;-0.00077698344830424;-4.4444132072385e-05;-0.00010342205496272;6.3311313169834e-07;-0.00021583928901237;2.8388012651703e-05;-0.00011419349903008;5.3633688366972e-05;0.00019535426690709;-0.00028176640626043;-0.00023339077597484;0.00037119816988707;-0.002685341052711;0.00029218089184724;0.00054604758042842;-0.00016017160669435;0.00020547265012283;0.00015729587175883;-0.00044692694791593;0.00012223022349644;-9.5079623861238e-05;-2.1664545784006e-05;-1.9825954950647e-05;-0.0012643873924389;0.00049246120033786;-0.00015150674153119;0.00080544984666631;0.0024043354205787;-0.0008318250766024;-0.00035850270069204;-0.00025287046446465;0.0013762366725132;-0.00012461701408029;8.7563246779609e-05;-9.3533089966513e-05;2.3008760763332e-05;3.134407734251e-06;8.3416944107739e-07;4.2957562982338e-05;-5.913829227211e-05;-0.00027646237867884;-0.00025831759558059;-0.00056132610188797;0.0014627171913162;5.8610195992514e-05;-0.00049222243251279;0.00044034025631845;0.00017440201190766;2.2989817807684e-05;0.00031485495856032;2.7556456188904e-05;-0.00053224549628794;-0.00026679213624448;-1.6091382349259e-05;-0.0012890567304567;-0.00137391500175;0.00019179753144272;0.00075120205292478;0.00098725268617272;0.00098950159735978;-0.00011165146133862;0.00013552651216742;-0.00056893337750807;0.00012400811829139;-0.00031798367854208;-6.0258513258304e-05;0.00037901537143625;8.0828147474676e-05;9.615981252864e-05;-5.3397667215904e-05;-1.2799611795344e-05;3.4721172141872e-06;-0.00045933245564811;0.00062546075787395;-0.0012416470563039;-7.4525505624479e-06;0.00036281681968831;-0.00024736148770899;-0.00021000872948207;0.00013285124441609;0.000308234593831;-4.3250802264083e-05;0.00031162559753284;0.00010134421609109;-0.00011560953134904;-0.00029585466836579;0.00089911016402766;0.00024574072449468;9.990810212912e-05;0.001098194043152;-0.001038774731569;0.00020614512322936;-0.00027858169050887;-0.0002448272134643;-3.9129117794801e-05;3.1911542464513e-05;-3.7067511016176e-07;-0.00025570899015293;2.1132118490641e-05;-0.00010570964514045;5.2325012802612e-05;0.00021531441598199;-0.00025953279691748;6.4575219766994e-06;0.00024266172840726;-0.0024713131133467;0.00031607152777724;0.00047215860104188;-0.00012017499830108;0.00014775079034735;0.00012406399764586;-0.0003474778495729;0.00012198906915728;0.00016821231110953;-4.1811104892986e-05;-3.6186793295201e-06;-0.0011678513837978;0.00027392501942813;-0.00025633844779804;0.00074711046181619;0.0022684305440634;-0.00062657840317115;-0.00038184787263162;-0.00018775144417305;0.00099581596441567;-0.00012347254960332;0.00014943412679713;-8.6385138274636e-05;-0.00012752099428326;5.6632552514202e-06;2.3137959942687e-05;3.5233166272519e-05;-6.1554994317703e-05;-0.00036544405156747;-0.00057540240231901;-0.00040016553248279;0.00084139651153237;0.00013838356244378;-0.00042292778380215;0.00039788722642697;6.2528903072234e-05;9.5745032012928e-05;0.00031823350582272;4.7410128900083e-05;-0.00024764362024143;-0.00026933941990137;-3.1339048291557e-05;-0.0017631922382861;-0.0012685602996498;0.00025426535285078;0.0010136479977518;0.0019077468896285;0.00069401564542204;5.0043683586409e-05;3.3031585189747e-05;-0.00059454224538058;9.4123672170099e-05;-0.00023975597287063;-8.9369379566051e-05;0.0002295676531503;9.2838548880536e-05;6.528652011184e-05;-4.0898961742641e-05;-1.3938976735517e-05;2.9732187613263e-05;-0.00045919805415906;0.00051373365567997;-0.0010865656659007;-3.1132494768826e-05;0.00026878243079409;-0.00018024467863142;-0.00015612179413438;9.9625045550056e-05;0.00011119776900159;-2.8367601771606e-05;0.00022448213712778;7.3924413300119e-05;-9.9022945505567e-05;-0.00015467964112759;0.00081869680434465;0.00023522340052295;2.0797924662475e-05;0.00078806781675667;-0.00086085667135194;0.00019442541815806;-0.00022927240934223;3.2480951631442e-05;-2.2779990104027e-05;5.7485904108034e-05;-4.9663543677525e-07;-0.00018411671044305;1.375089505018e-05;-6.7735563789029e-05;3.8246536860242e-05;0.00013853667769581;-0.00018667966651265;-5.407107892097e-05;9.2311864136718e-05;-0.0017362823709846;0.00023853205493651;0.00029225382604636;-3.8460279029096e-05;7.1033013227861e-05;7.7624645200558e-05;-0.00025289636687376;9.4204573542811e-05;0.00019919747137465;-5.672935367329e-05;-1.03092934296e-05;-0.00093139702221379;3.7437308492372e-05;-0.00015010355855338;0.00056425941875204;0.0017581160645932;-0.00030912485090084;-0.0002119543205481;-0.00010725215543061;0.00064287433633581;-8.0884514318313e-05;0.00013015100557823;-6.3893450715113e-05;-0.00012468213390093;7.6772603279096e-06;2.6777119273902e-05;1.9277686078567e-05;-5.6059692724375e-05;-0.00027807205333374;-0.00050267280312255;-0.00021452206419781;0.00047501688823104;7.8602526627947e-05;-0.0003283483965788;0.00028330186614767;1.0213393579761e-05;9.2703921836801e-05;0.00021346868015826;2.4872899302864e-05;-0.00010350484080845;-0.00018937964341603;-2.5253861167585e-05;-0.0013473394792527;-0.0007919886847958;0.00020689444500022;0.00077294965740293;0.001540137687698;0.00036980744334869;0.00010076124453917;-1.3836809557688e-05;-0.00043305917643011;7.8456214396283e-05;-0.00015174501459114;-6.7957305873279e-05;0.00013794163533021;7.2556453233119e-05;-3.1305222364608e-05;3.6106870538788e-05;-5.5669010180281e-05;7.1781352744438e-05;0.00062236154917628;-0.00067800568649545;0.0001068387136911;6.6669740590442e-06;-0.00040054047713056;0.00037615021574311;0.00022340728901327;-0.00017813296290115;-2.9517545044655e-05;0.0001067804187187;0.00018280070798937;-0.0002031226613326;-4.478809205466e-05;-0.00015790920588188;-8.5207240772434e-05;0.00042690458940342;-0.00026814651209861;-0.0014797045150772;0.0016486051026732;-0.00044246815377846;0.00033849457395263;8.6280408140738e-05;-0.00015447779151145;-1.8020915376837e-05;-2.3075321223587e-05;-6.3201485318132e-05;8.0114077718463e-05;6.1021852161502e-05;3.4163203963544e-05;-6.8600398662966e-05;1.2058984793839e-05;-0.00096754659898579;-0.00087366282241419;0.00022136245388538;9.319022501586e-05;8.328437252203e-05;-4.9198060878552e-06;-0.00023010811128188;-0.00021481754083652;-5.1062321290374e-05;-7.1745263994671e-05;0.00013143802061677;0.0002282158966409;-0.00019167657592334;-0.0010396869620308;-0.0025615193881094;0.00043322696001269;0.00024873320944607;0.0019321644213051;0.0021441213320941;0.00050519732758403;0.00041660768329166;-0.00016903193318285;-0.00017151499923784;7.9608900705352e-05;0.00011629220534815;-4.6645451220684e-05;-7.8148805187084e-05;2.3408994820784e-05;2.2178819563123e-05;-0.00012080793385394;-8.8894841610454e-05;-0.00066092901397496;-0.00062199612148106;-0.00098278955556452;-0.00098766887094826;-0.00016491592396051;-0.0002952650829684;-0.0001076122498489;-0.00011582337174332;-0.00030629363027401;-0.00024814487551339;0.0002288972173119;0.00034702461562119;-8.5939382188371e-06;-0.0007742348825559;0.0014808303676546;0.00034647906431928;0.00024892916553654;0.0005725187365897;0.00071410258533433;0.00033300000359304;0.00032410497078672;0.00043030321830884;0.00028559393831529;0.00011541828280315;0.00011569333582884;-3.0098210118013e-05;-7.4414776463527e-05;-2.7839079848491e-05;3.7101322959643e-05;-6.5148895373568e-05;6.2124461692292e-05;0.00058859895216301;-0.00067690899595618;0.00015827617608011;7.7924545621499e-05;-0.00040102103957906;0.00037105125375092;0.00021526920318138;-0.00017559363914188;-1.4730294424226e-05;0.00012361096742097;0.00017979209951591;-0.00020877162751276;-4.4114498450654e-05;-0.00021825141448062;-0.00020105973817408;0.00044293559039943;-0.00024548664805479;-0.0013904082588851;0.0016679792897776;-0.00042306049726903;0.00033656251616776;5.2559636969818e-05;-0.00018922820163425;-2.246876101708e-05;-3.0698440241395e-05;-6.2081810028758e-05;8.3085731603205e-05;6.1680366343353e-05;3.2664331229171e-05;-7.2857881605159e-05;1.2077286555723e-05;-0.00094666471704841;-0.00087300559971482;0.00025726406602189;4.3647702113958e-05;9.131824481301e-05;-1.9221490219934e-05;-0.0002239258174086;-0.00021510740043595;-4.0502942283638e-05;-8.6922089394648e-05;0.000112914472993;0.00024947634665295;-0.00018899176211562;-0.0010389806702733;-0.0025243235286325;0.00044197044917382;0.00024066520563792;0.0018601595656946;0.002175489673391;0.00049444939941168;0.00041973293991759;-0.00017713426495902;-0.00015856612299103;7.144155097194e-05;0.00012326390424278;-3.9267200918403e-05;-8.2744096289389e-05;1.7797643522499e-05;2.6522056941758e-05;-0.00011953261127928;-8.5900705016684e-05;-0.00057073112111539;-0.00067140813916922;-0.00094187929062173;-0.0009893715614453;-0.00015179261390585;-0.00030928847263567;-8.5184474301059e-05;-0.00012937028077431;-0.00029423384694383;-0.00024693727027625;0.00021657822071575;0.00035228606429882;-8.0068339229911e-06;-0.00075783632928506;0.0014700280735269;0.00034311998751946;0.00023851834703237;0.0004455100861378;0.00079884490696713;0.0002833821636159;0.0003500361344777;0.00041604565922171;0.00027911041979678;0.00010733905946836;0.00011809458374046;-2.5299306798843e-05;-7.6440526754595e-05;1.6052666978794e-05;-3.3839878597064e-05;9.0939887741115e-05;-3.3378866646672e-05;-0.00025452536647208;-0.00015712305321358;-6.2324244936462e-05;0.0003761236439459;0.00019785451877397;-0.00031931846751831;-7.3239280027337e-05;1.9655237338156e-05;3.0444613003056e-05;-0.00040126810199581;-8.5450526967179e-05;-1.8146211004932e-06;-4.8694723773224e-06;0.00028555432800204;-0.00019986707775388;-0.00017903767002281;7.6446463936009e-05;0.00037965906085446;-0.00060606386978179;0.00010017598833656;0.00010803740588017;6.1972910771146e-05;0.00051389128202572;-3.7125660128368e-06;9.9048498668708e-05;-5.4013007684262e-06;6.5377847931813e-05;3.4696222428465e-05;-6.2187507865019e-05;-0.00019293173681945;0.00010148652654607;0.00032300723250955;-0.00030921690631658;0.00017487755394541;-0.0019404019694775;-0.00012926409544889;0.00044714385876432;0.00013366916391533;0.00011606499174377;0.00010696681420086;-0.00027970160590485;4.2243432289979e-06;-0.00016138695355039;-3.9359529182548e-05;-0.00098762556444854;0.00035478171776049;0.00059769331710413;-1.9212991901441e-05;-0.00058565783547238;0.001828967127949;-0.00024787199799903;-0.00016258952382486;-0.00010132216993952;0.00098630657885224;-6.922529428266e-05;2.8286454835325e-05;-9.4003698904999e-06;5.9184152632952e-05;3.5288674553158e-05;-6.9573616201524e-07;-0.00014823381206952;-6.5275104134344e-05;-0.00045071970089339;-0.00025425862986594;2.5649384042481e-05;0.001266979961656;0.00029320496832952;-0.00036092440132052;-2.5943665605155e-05;0.00011459660890978;8.785128557065e-06;0.00012171743583167;-0.00017032549658325;-0.00054703705245629;-3.2882609957596e-05;-0.00066801463253796;-0.00094919611001387;0.00040201703086495;0.00020704738562927;0.00075017416384071;0.00028123645461164;0.00015445481403731;-2.3246462660609e-05;8.7105210695881e-05;-0.00020147462782916;-2.95193913189e-05;-0.00020860339282081;5.1919592806371e-05;0.00033617395092733;7.4484364631644e-06;-3.10030845867e-05;0.00013085732643958;-4.5574237446999e-05;-3.4548302210169e-05;-0.0005663683405146;-5.1636197895277e-05;-0.00016793442773633;0.00010530849976931;-0.00016205072461162;-4.2422667320352e-05;-8.7830148913781e-06;5.1154456741642e-05;-0.00057410635054111;-3.4911794500658e-05;-8.3977392932866e-05;-5.1584396715043e-05;0.00023640398285352;8.0229656305164e-05;-0.00021748487779405;0.00024496039259247;7.792603719281e-05;-0.00028226856375113;-1.0848329111468e-05;0.00022314881789498;1.4889699741616e-05;0.0010034460574389;-6.4279720390914e-06;0.00014772715803701;-2.1538986402447e-05;6.9969137257431e-05;3.0100418371148e-05;-5.9186364524066e-05;-0.0001729572104523;0.00010803817713168;0.00031668148585595;-5.2681407396449e-05;0.00013166962889954;-0.0016774875111878;-0.0001697060506558;0.00046156445750967;0.00011848816211568;0.00014745109365322;7.4135103204753e-05;-0.00016137417696882;3.9195303543238e-05;-0.00027854123618454;-1.1274124517513e-05;-0.00073696399340406;0.0004331975360401;0.00048966694157571;-0.00011858018115163;-0.0005811759037897;0.0013738056877628;-0.0002159503637813;-0.00025776284746826;-9.0395631559659e-05;0.00084919127402827;-5.0692065997282e-05;-3.4986682294402e-05;-1.406064893672e-05;0.00011059109237976;4.2575698898872e-05;-2.7196208975511e-05;-0.00011485854338389;-3.7557849282166e-05;-0.00044560284004547;-9.073310502572e-05;2.4684553864063e-05;0.001199732767418;0.00022623313998338;-0.00025970512069762;-5.5079130106606e-05;0.00017262900655624;8.1372709246352e-06;3.0249288101913e-05;-0.00012579646136146;-0.00065336015541106;-5.9761332522612e-06;-0.00042638255399652;-0.00085678714094684;0.00027153073460795;0.00011409358558012;0.00073503563180566;-2.6450172299519e-05;0.00018426919996273;-0.0001225801097462;5.867760773981e-05;-4.6301083784783e-06;-1.7260796084884e-05;-0.00019660052203108;3.372095306986e-05;0.00036498744157143;6.4264306274708e-05;-1.6737945770728e-05;5.4914933571126e-05;-0.00011349241685821;0.00091596698621288;-0.00010377189755673;0.00050987466238439;3.3950602755795e-06;-0.00014112384815235;9.2311602202244e-05;-7.9088873462752e-05;3.8391066482291e-05;0.00084542977856472;-5.7549823395675e-05;0.00058841687859967;-8.3112696302123e-05;2.9211378205218e-05;-0.00029053140315227;-0.00025921093765646;-0.00031597338966094;0.00026737203006633;0.00020612034131773;0.00011095685476903;-0.00025570855359547;2.8808284696424e-05;-0.0017780910711735;7.9316196206491e-05;-0.00011312681454001;-1.9857081952068e-06;-0.00028395236586221;5.8707399148261e-05;-6.5075662860181e-05;1.9164608602296e-05;0.00018515597912483;-0.00017396740440745;0.0011505018919706;0.00019422253535595;-0.0010751088848338;3.8854639569763e-05;0.0003018040151801;-0.00016808816872071;0.00018567295046523;7.582078978885e-05;0.00013584774569608;-2.0033909095218e-05;-1.1562909094209e-05;5.2473074902082e-05;0.00014756523887627;-5.62876703043e-05;0.00061086460482329;-0.00070830160984769;0.00027331011369824;0.00017303731874563;-0.00054542714497074;-0.00061054527759552;-7.167826697696e-05;5.9547684941208e-05;-1.4233753063309e-05;-5.6235814554384e-05;-1.703811904008e-05;-1.3444780051941e-05;3.1860915896686e-06;-0.00010597131040413;6.2277678807732e-05;0.00015198504843283;-0.00022416091815103;0.00068954372545704;-0.00037459560553543;0.00064687384292483;7.1212802140508e-05;-0.00010049170668935;0.0001362023758702;0.00035613085492514;-1.3278046026244e-05;0.00010866748925764;1.4485029169009e-05;-0.00044676807010546;-9.7333293524571e-05;0.00011181735317223;-0.00046111724805087;-0.00066266272915527;-0.00039596520946361;0.00041608142782934;0.00010102389205713;0.00055288011208177;-0.00063765316735953;0.00014916353393346;-0.00013921299250796;3.0451346901827e-05;-0.0001965407282114;-3.1311261409428e-05;0.0002601602463983;2.8105518140364e-05;0.0001131896788138;-3.6953882954549e-05;2.446434518788e-05;-0.00011100339179393;0.00062211375916377;6.9000030634925e-05;0.00019258858810645;3.5527929867385e-05;-2.6295767383999e-05;2.0858289644821e-05;-0.00018430293130223;7.9409233876504e-05;0.00098679144866765;-6.1675367760472e-05;0.0006705341511406;-5.6937849876704e-05;-2.9649330826942e-05;-0.0004844922805205;-0.00012044989853166;-0.0001520510413684;0.00032900780206546;0.00069561076816171;-0.00014727642701473;-0.00011792839359259;-5.695396248484e-05;-0.0018850638298318;5.2641476941062e-05;-0.00011394551984267;-4.2681176637416e-06;-0.00036813586484641;6.5646323491819e-05;-0.00011339018237777;3.7447833165061e-05;0.00028908930835314;-0.00024735744227655;0.0013090461725369;0.00032520643435419;-0.0018621598137543;0.00011398365313653;0.00046269316226244;-0.0002357934426982;0.00027984316693619;0.00011708636156982;3.8996651710477e-05;8.5088349806028e-06;3.8082816899987e-05;6.0592425143113e-05;0.00015262166562025;-0.00029932535835542;0.00084261066513136;-0.00085317256161943;0.00046523933997378;0.00069082691334188;-0.000842405250296;-0.00085006159497425;-0.00014473198098131;0.00037656785571016;-5.1728828111663e-05;-1.8564409401733e-05;-3.9236063457793e-05;-5.2217124903109e-05;1.7008916302075e-06;-0.00011110121704405;8.0761339631863e-05;0.00017037706857082;-0.00034950309782289;0.00066519237589091;-0.00055797590175644;0.00097445002757013;0.00014176178956404;-0.00022442142653745;0.00026772639830597;0.00041327832150273;5.7964921325038e-06;0.00030169193632901;3.5276094422443e-05;-0.0005011519533582;-0.00019404364866205;0.00010615371138556;-0.001015811576508;-0.0011562429135665;-0.00037969535333104;0.00075487646972761;0.00065614428604022;0.00085184653289616;-0.0007442282512784;0.00018564586935099;-0.00044943505781703;5.5275970225921e-05;-0.00029398681363091;-6.0069283790654e-05;0.0003129942342639;5.8417590480531e-05;0.00014414466568269;-6.8540721258614e-05;-0.00011495488433866;8.4954430349171e-05;-0.00096328899962828;0.00054975849343464;-0.00097631540847942;7.3273002954011e-07;0.00020995338854846;-0.00013993632455822;-0.00035928163561039;0.00010792805551318;0.00024377832596656;-2.4889728592825e-05;0.00043287003063597;5.3529300203081e-05;-0.00018497357086744;-0.00034060658072121;0.00060727109666914;0.00053594406927004;9.6366220532218e-06;0.0012533559929579;-0.00083723629359156;0.00055935815908015;-0.00026670881197788;-0.00030414992943406;-2.9075268685119e-05;9.3723108875565e-05;2.3537127162854e-06;-0.00030325542320497;2.3921471438371e-05;-0.00011825106776087;4.4466341933003e-05;0.00030902319122106;-0.00018628526595421;0.0011346671963111;0.00023191353830043;-0.0019418746232986;0.00021415376977529;0.00038962249527685;-0.00015524012269452;0.00022445061767939;8.1106496509165e-05;-3.9113532693591e-05;5.9221925766906e-05;0.00035008427221328;3.7039828839625e-06;8.4576895460486e-05;-0.00039848426240496;0.00051819893997163;-0.0007274798117578;0.00043388406629674;0.0010163738625124;-0.00066422531381249;-0.00080210750456899;-0.00012456830882002;0.00030867496388964;-8.4574305219576e-05;0.00010953234595945;-4.6932247641962e-05;-0.00022639823146164;1.8797156826622e-06;-1.4628079043177e-05;5.4011237807572e-05;6.6645276092459e-05;-0.00047430535778403;-0.00043106244993396;-0.00034665080602281;0.00020036099886056;0.00032783776987344;-0.00021017760445829;0.00029923272086307;9.43660561461e-05;0.00013139296788722;0.0003834450035356;9.5603078079876e-05;-4.6146717068041e-05;-0.00026445457478985;-5.3745138757222e-06;-0.0021128959488124;-0.0013451915001497;5.6678123655729e-05;0.0012652989244089;0.0026452171150595;0.00053263618610799;-0.00017170743376482;-1.1749930308724e-06;-0.00059632101329044;7.110626938811e-06;-0.00017697508155834;-0.00011987310426775;6.3447034335695e-05;9.3656024546362e-05;0.00011725947842933;-5.8276447816752e-05;-9.7823336545844e-05;8.777641778579e-05;-0.00086155731696635;0.00048306433018297;-0.00088693248108029;-1.7539830878377e-05;0.00018618770991452;-0.0001239671400981;-0.00029706995701417;8.7828491814435e-05;0.00014716527948622;-2.2704680304741e-05;0.00033791046007536;5.1588991482276e-05;-0.0001581403776072;-0.00022672733757645;0.00058722938410938;0.00046897379797883;-3.39080215781e-05;0.0010054899612442;-0.00074000080348924;0.00048566443729214;-0.00022925314260647;-0.00013981918164063;-2.1977453798172e-05;8.9529035903979e-05;4.6780505726929e-06;-0.00024185964139178;1.7211350495927e-05;-9.5339615654666e-05;3.7163641536608e-05;0.00024944424512796;-0.00014545310114045;0.00090481340885162;0.00016741231956985;-0.0015915289986879;0.00018732028547674;0.00030674735899083;-0.00011087309394497;0.00017657371063251;6.0600970755331e-05;-3.8466343539767e-05;5.4214942792896e-05;0.0003088858211413;-6.9661141424149e-06;6.0987400502199e-05;-0.00034688063897192;0.00036492137587629;-0.00057745596859604;0.00035465045948513;0.00088151404634118;-0.00050346850184724;-0.0006428228225559;-9.5500217867084e-05;0.00024470122298226;-7.111575541785e-05;9.7549149359111e-05;-3.8960966776358e-05;-0.00019466727098916;1.999011828957e-06;-2.9284849460964e-06;4.0815670217853e-05;4.1495495679555e-05;-0.00039569963701069;-0.00047720142174512;-0.0002509138721507;8.7332773546223e-05;0.00027718499768525;-0.00017466727877036;0.0002455958747305;4.7668036131654e-05;0.00011992228246527;0.00030067094485275;8.1161379057448e-05;-1.2304293704801e-05;-0.00021874620870221;-1.3642610610987e-05;-0.0018156777368858;-0.0010929852724075;9.1150250227656e-05;0.0010705449385568;0.0023461608216166;0.00038512077298947;-7.5852934969589e-05;-2.2226169676287e-05;-0.00046845653560013;2.9891748454247e-06;-0.00013223163841758;-0.00010251461935695;3.878779898514e-05;7.9447498137597e-05;-1.8502834791434e-05;2.1176872905926e-05;-2.7175776267541e-05;4.4898446503794e-05;0.00047858495963737;-0.00057019112864509;0.00027998985024169;-0.00029642909066752;-0.00022181257372722;0.00021769688464701;0.00017209377256222;-0.0001412560523022;3.1127929105423e-05;6.3902261899784e-06;1.9393040929572e-05;-2.6944315322908e-05;-3.5917772038374e-05;-0.00012704446271528;-3.1396546546603e-05;0.00032803750946186;-0.00020064724958502;-0.0013989178696647;0.0015769456513226;-0.00034649873850867;0.00028171166195534;5.0060258217854e-05;-4.9249207222601e-05;-4.8035111831268e-05;2.5084449589485e-05;-1.3950407264929e-05;2.0777635654667e-05;2.8531781936181e-05;1.3625481187773e-05;6.8421191826928e-05;0.00010465711238794;-0.0002344950044062;-0.00022578447533306;0.00024108972866088;0.00019019954197574;2.4868284526747e-05;-6.0337238210195e-06;-9.8480421002023e-05;-0.00010299445420969;1.8559961972642e-05;-4.1786179281189e-06;8.5111998487264e-05;0.00011988393816864;-0.00017741207557265;0.00012936911662109;-0.001397124840878;3.1386647606269e-05;-5.8146284573013e-05;0.00062369916122407;0.00071804324397817;0.00012001575669274;0.00010486554674571;-0.00018362425907981;-0.00015975856513251;4.0210579754785e-05;6.8316112447064e-05;-3.3446784073021e-05;-4.9375663365936e-05;2.4994251361932e-05;1.4328964425658e-05;-3.109689350822e-05;-1.0430913789605e-05;-0.00072642491431907;-0.00064025021856651;-0.00068245956208557;-0.0007008210523054;-4.5875425712438e-05;-0.00010175854549743;-0.00014112508506514;-0.00012122354382882;-0.00015777006046847;-0.00013265242159832;0.00013675037189387;0.00020139456319157;-7.52908317736e-06;-0.00043836375698447;0.00050054542953148;0.00014625748735853;8.0691264884081e-05;0.00083740171976388;0.00085186213254929;0.00031452265102416;0.00027433963259682;0.0002998462296091;0.00022802552848589;8.9213986939285e-05;8.7150765466504e-05;-6.3179439166561e-05;-8.6364037997555e-05;-3.6631314287661e-05;4.1397655877518e-05;-5.5348529713228e-05;6.7926404881291e-05;0.00085231487173587;-0.00095687067368999;0.00043768438627012;-0.0003889100626111;-0.00035161882988177;0.00033668207470328;0.0002930810151156;-0.00023559262626804;5.1951181376353e-05;2.991706787725e-05;5.2895178669132e-05;-6.5555468609091e-05;-5.1433336921036e-05;-0.00024542861501686;-0.00010542781819822;0.00051592767704278;-0.00029866787372157;-0.0021904732566327;0.0025066300295293;-0.000590804615058;0.00047025096137077;4.5329776185099e-05;-9.6911084256135e-05;-7.6439362601377e-05;3.0821709515294e-05;-2.4010609195102e-05;3.7314053770388e-05;5.0699640269158e-05;2.3202406737255e-05;8.0611287557986e-05;0.00013964829850011;-0.00056335865519941;-0.00051149952923879;0.00038311869138852;0.00025162432575598;7.3454233643133e-05;1.3490648598236e-05;-0.00018688135605771;-0.0001806979853427;3.3349544537487e-05;-9.3793350970373e-06;0.00011442518007243;0.00019214661733713;-0.0002569108910393;-7.4711177148856e-05;-0.0024389713071287;0.00011548340989975;-3.1835119443713e-05;0.0012863257434219;0.0014658613363281;0.00027904254966415;0.00022802986495662;-0.00027254107408226;-0.00023381509527098;6.4725114498287e-05;0.00011096880916739;-5.7719807955436e-05;-8.7886211986188e-05;3.5931985621573e-05;2.5960111088352e-05;-8.5059415141586e-05;-4.2350180592621e-05;-0.0011174120008945;-0.0010629955213517;-0.0011215318227187;-0.0012059018481523;-7.8160148405004e-05;-0.00018090996309184;-0.00020604513701983;-0.00019794287800323;-0.00029536228976212;-0.00025169301079586;0.00021790176106151;0.0003419480053708;-1.1879147677973e-05;-0.00085312349256128;0.00094823085237294;0.00032116429065354;0.00019615422934294;0.0012153079733253;0.0014262816403061;0.00050438055768609;0.00047336163697764;0.00052189105190337;0.00040315196383744;0.00014469043526333;0.00014894202467985;-8.3014834672213e-05;-0.00013191670586821;-3.3157321013277e-05;4.2330608266639e-05;-6.9115776568651e-05;5.2815747039858e-05;0.00082797737559304;-0.00094563682796434;0.00049134920118377;-0.00031935525476001;-0.00034418483846821;0.00032534461934119;0.00028912851121277;-0.00022763446031604;7.2271424869541e-05;5.0471444410505e-05;4.6298158849822e-05;-6.6794258600567e-05;-5.0830185500672e-05;-0.00035385700175539;-0.0002371051668888;0.0005432243924588;-0.00025956277386285;-0.0020794372539967;0.0025448268279433;-0.00058015051763505;0.00045824627159163;5.8003106460092e-06;-0.00013727189798374;-8.3764083683491e-05;2.110726745741e-05;-2.1955078409519e-05;3.8620604755124e-05;5.2038467401871e-05;2.0148496332695e-05;8.1840742495842e-05;0.00013814825797454;-0.00055310293100774;-0.00048592599341646;0.0004210309125483;0.00019570376025513;7.6191739935894e-05;8.8553451860207e-06;-0.00018542869656812;-0.00017326358647551;4.3018997530453e-05;-2.0215291442582e-05;9.5657305791974e-05;0.00020881375530735;-0.00025403645122424;-5.7769764680415e-05;-0.0023847005795687;0.00011151143553434;-3.6622255720431e-05;0.001214548246935;0.0014614191604778;0.00027539479197003;0.00021440612908918;-0.000278050894849;-0.00021839115652256;5.7688303058967e-05;0.00011537057434907;-5.0912611186504e-05;-9.3366295914166e-05;2.8905737053719e-05;3.1344738090411e-05;-8.6147607362363e-05;-3.675543848658e-05;-0.0009867416229099;-0.0011568828485906;-0.0010390819516033;-0.0012519138399512;-7.0825481088832e-05;-0.0001813811250031;-0.00017540175758768;-0.00021889500203542;-0.0002762884250842;-0.00025680896942504;0.00019994738977402;0.00034987111575902;-1.0541863957769e-05;-0.00083998299669474;0.00092125881928951;0.00032073701731861;0.0001815822761273;0.0010143043473363;0.0016046206001192;0.00043868387001567;0.00051513873040676;0.00049212673911825;0.00041398030589335;0.00013113315799274;0.00015610393893439;-7.3619034083094e-05;-0.00013847085938323;-1.5371788322227e-05;2.2931852072361e-05;-4.6567842218792e-05;2.1134675989742e-05;0.00047491164878011;-0.0005552259972319;0.00036631015245803;-0.00021719356300309;-0.00019575470651034;0.00018490977527108;0.00017285988724325;-0.0001294710818911;6.450113869505e-05;3.1489496905124e-05;8.362258085981e-07;-1.5000332496129e-05;-3.1880474125501e-05;-0.00029083559638821;-0.00021141649631318;0.00035964456037618;-0.00014087995805312;-0.0012666605180129;0.0016512145521119;-0.0003459426225163;0.00026399045600556;-1.1216391612834e-05;-0.00010394222772447;-6.1746119172312e-05;1.3901141755923e-05;-7.2029047260003e-06;1.7673095499049e-05;2.977452459163e-05;7.9274759627879e-06;7.9757628554944e-05;0.00010501421638764;-0.00021788690355606;-0.00016492354916409;0.0002939865225926;0.00011464029375929;3.2651336368872e-05;-2.8054298581992e-06;-9.6992254839279e-05;-8.578434062656e-05;3.8235371903284e-05;-1.0556002962403e-05;5.2612642321037e-05;0.00013360622688197;-0.00017201894661412;0.00019171583699062;-0.0013020859332755;4.3447712414491e-06;-7.1941685746424e-05;0.00050844013458118;0.00066406215773895;0.0001087514901883;6.8070527049713e-05;-0.00018725123663899;-0.00013668261817656;2.944321022369e-05;7.0481386501342e-05;-2.6343353965785e-05;-5.8243553212378e-05;1.5676208931836e-05;2.1801683033118e-05;-3.5936300264439e-05;-1.9413744212216e-06;-0.00056430336553603;-0.00080217816866934;-0.00056137813953683;-0.0007887709653005;-2.8354686946841e-05;-8.8288652477786e-05;-0.00010196440416621;-0.00015393226931337;-0.00013439658505376;-0.00014297368761618;0.00010535588080529;0.00020990398479626;-5.7934034884966e-06;-0.00044200944830664;0.00041876500472426;0.00015639280900359;6.3302453781944e-05;0.0005698159802705;0.0011680729221553;0.00023561897978652;0.00034202632377855;0.00026611259090714;0.00025600811932236;7.0642228820361e-05;9.9137323559262e-05;-4.8552039515926e-05;-9.7859046945814e-05;6.3045037677512e-05;-0.00010985934204655;-0.00011616426490946;0.00011545031884452;-0.00049479876179248;0.0010175997158512;-2.9502001780202e-05;0.00081278180005029;0.00010599623055896;-0.00016434969438706;-9.0449742856435e-05;0.00030362725374289;-1.0541804158493e-06;-4.2748419218697e-05;-4.7536770580336e-05;-0.00031717418460175;0.00014700464089401;0.0002612788521219;-0.00038379844045267;8.1888138083741e-05;-0.00050844845827669;0.00064537016442046;-0.0011232956312597;0.00025639878003858;-0.00055328966118395;5.459574458655e-05;2.156737173209e-05;-2.916762696259e-06;-0.00012450916983653;-8.1727130236686e-06;0.00023146417515818;3.0061519282754e-05;-8.791758591542e-05;-9.4132388767321e-05;0.00023370297276415;0.00026906427228823;0.0010239800903946;0.00014613084204029;-0.0015727715799585;-0.00017860789375845;0.00037194901960902;5.8921632444253e-05;0.00015099147276487;5.2147108362988e-05;8.7498574430356e-07;4.8050907935249e-05;0.00038578928797506;7.9331963206641e-05;-7.9341021773871e-05;0.00052780233090743;0.00019632394833025;-0.00063344254158437;-0.00060194358229637;0.00057459878735244;-0.00013442338968161;-0.00060539832338691;-9.4916249508969e-05;0.00012636037718039;-2.5901415938279e-05;0.00010862273484236;-1.5279947547242e-05;-0.00026062835240737;6.3176725234371e-05;-1.4217180250853e-05;-0.00050780392484739;6.4353756897617e-05;-0.00023897943901829;-0.000684650731273;0.00039460897096433;-0.00042810340528376;0.00018313423788641;-1.9126997358399e-05;0.00015062482270878;1.3624936400447e-05;0.00014447628927883;0.00022525039094035;-0.00020610945648514;8.0165591498371e-05;-4.4396314478945e-05;-0.00226920703426;-0.0011873337207362;0.0013722381554544;0.00013408740051091;0.00034940801560879;0.0030449780169874;-6.1951381212566e-05;-2.1159372408874e-05;-7.7584896644112e-05;-0.00028522111824714;-0.00013156882778276;-6.916286656633e-05;6.8684967118315e-05;-4.2235566070303e-05;1.2399109436956e-05;-4.9659956857795e-05;0.00015021787839942;-3.5648721677717e-05;6.5157400968019e-05;-0.00073424342554063;-3.8873400626471e-05;-0.00044930574949831;3.2912703318289e-06;9.8138934845338e-06;-4.2656101868488e-05;4.3932228436461e-05;6.4205756643787e-05;-0.00070630852133036;2.6496427381062e-05;-0.00032966837170534;-6.1545222706627e-05;0.00028546992689371;0.00023598158441018;-0.00026864738902077;0.00029966933652759;-5.287423482514e-05;-0.00025825612829067;-4.4083313696319e-05;0.00019676942611113;-3.4353786759311e-05;0.00146201136522;-2.0869897525699e-06;0.00013239055988379;-4.4278534915065e-05;0.00016468360263389;2.8979613489355e-05;-6.8242283305153e-05;-0.00018828532483894;0.00016285915626213;0.00032055444899015;0.00049469980876893;0.00011044121492887;-0.0016472643474117;-0.00022549752611667;0.00050335499690846;0.00011437403736636;0.00017736904555932;4.235420783516e-05;-1.283968322241e-05;7.2398317570332e-05;-0.00019683831487782;5.5404841987183e-05;-0.00049057544674724;0.00057760265190154;0.0004333162214607;-0.00040471437387168;-0.00064631027635187;0.00098899879958481;-0.00018714295583777;-0.00045569692156278;-8.3398816059344e-05;0.00057992764050141;-3.7758003600175e-05;-4.8877802328207e-05;-1.5659883501939e-05;4.6466961066471e-05;6.1634185840376e-05;-6.0330563428579e-05;-0.00020178417616989;1.8327631551074e-05;-0.00046219874639064;5.9634065110004e-05;8.7013431766536e-05;0.00095425947802141;0.00018875101523008;-0.00016574436449446;-4.0723676647758e-05;0.00023806477838662;2.9000899303355e-05;3.0407684334932e-06;-0.00011980685667368;-0.00065481872297823;3.1775125535205e-05;-0.00062456668820232;-0.00090627843746915;0.00043696159264073;-2.7477994080982e-05;0.00072499952511862;0.00025670428294688;0.00018881492724176;-0.00026272120885551;2.5533276129863e-05;6.167680840008e-05;-3.3022803108906e-05;-0.00019327645713929;3.1105420930544e-05;0.00035545349237509;2.9791276574542e-06;-3.4177832276328e-05;0.00016000833420549;-4.9027519708034e-05;0.00020241850870661;-0.00096694473177195;-1.2977518053958e-05;-0.00073077925480902;-7.6959586294834e-05;0.00014309291145764;-1.9325047105667e-05;1.0559638212726e-05;6.9884765252937e-05;-0.00070952397072688;6.7847613536287e-05;-0.00039000192191452;-8.866930147633e-05;0.0002044517750619;0.00035390147240832;-0.00026478173094802;0.00039988951175474;-0.00023305139620788;2.2743946828996e-05;-0.00010738767741714;0.00026912876637653;-7.4337098340038e-05;0.0016093970043585;-1.318798695138e-06;0.00013392200344242;-5.211867755861e-05;0.00016115669859573;1.809794230212e-05;-4.7009878471727e-05;-0.00015701875963714;0.00013174954801798;0.00022384864860214;0.0006564327632077;5.3589585149894e-05;-0.0011398722417653;-0.00018946772615891;0.00039151319651864;8.6805572209414e-05;0.00014684637426399;5.9360759223637e-06;9.8516291473061e-05;6.7904904426541e-05;-0.00018851147615351;8.2193437265232e-05;-0.00024542576284148;0.00050211849156767;0.00030681482166983;-0.000447993632406;-0.00049223564565182;0.00049616093747318;-0.00011829776485683;-0.00042418605880812;-4.3723492126446e-05;0.00028206221759319;-2.0351895727799e-05;-7.7917698945384e-05;-9.9203680292703e-06;5.1341616199352e-05;5.653942207573e-05;-7.5190553616267e-05;-0.00015057258133311;4.2005227442132e-05;-0.00036927207838744;0.00026969361351803;4.9178353947354e-05;0.00075604039011523;0.000111796449346;-8.4499981312547e-05;-5.0295802793698e-05;0.00025781017029658;1.4226102393877e-05;-7.5777730671689e-05;-6.6533306380734e-05;-0.00061614089645445;6.598205800401e-05;-0.00029099534731358;-0.00062336144037545;0.00025877193547785;-0.00015013905067462;0.00056087406119332;-0.00010465275408933;0.00017673158436082;-0.00032429190468974;1.4334389561554e-05;0.00017948189633898;-1.785088898032e-05;-0.00015527357754763;1.4762945284019e-05;0.00032661930890754;8.5619845776819e-05;-2.0253524780856e-05;2.6540914404904e-05;-9.2179921921343e-05;0.00076786655699834;-0.00014186381304171;0.00063545117154717;1.1605824511207e-05;-0.00027726107509807;0.00019133089517709;-0.0001499770587543;3.8431724533439e-05;0.00090423936489969;-4.272562728147e-05;0.0008239233866334;-0.00014242641918827;-3.4403252357151e-05;-0.00046777358511463;-0.0004258927074261;-0.00015970674576238;0.00031765113817528;0.00043662422103807;0.00020323941134848;-0.00014156621182337;1.4681907487102e-05;-0.0020715727005154;0.00010139936057385;-7.1582195232622e-05;-9.1095125753782e-06;-0.00038318947190419;7.2878181526903e-05;-5.3509134886554e-05;7.7255508585949e-06;0.00022007148072589;-0.00018825064762495;0.0020632208324969;0.00013300735736266;-0.00080384459579363;-4.5839515223633e-05;0.00019784714095294;-0.00014253982226364;0.00016054458683357;7.0106660132296e-05;0.00036648951936513;-7.0518857683055e-05;0.00025250724866055;4.7091099986574e-05;0.00026141619309783;0.00032102040131576;0.00075825076783076;-0.0011587905464694;0.00018581743643153;-0.000515574705787;-0.000532413541805;-0.00079478631960228;-1.9997451090603e-05;-0.00059407541994005;4.9080947064795e-05;-5.3061434300616e-05;-1.8624094764164e-06;-0.0001334230764769;1.4290034414444e-05;-0.0001716489350656;8.6596221080981e-05;0.00031321097048931;-0.00034164599492215;0.0014662569155917;-0.00041534073534422;0.00049202202353626;8.9198030764237e-05;-7.2433809691574e-05;0.00011678695591399;0.00051288609392941;3.6401106626727e-06;0.0002163384197047;2.7571384180192e-06;-0.00032312073744833;-0.00010369303345215;0.00021676449978258;-0.0004701936559286;-0.00058441620785743;-0.00086523900972679;0.00057636509882286;1.8186996385339e-05;0.00050075841136277;-0.0011070421896875;0.00017908230074681;-0.00036512370570563;4.3187090341235e-05;-0.00021046042093076;-4.2761752411025e-05;0.0002013021876337;3.7780886486871e-05;0.00017041793034878;-5.3860952903051e-05;-8.2300175563432e-05;-2.3454735128325e-05;-0.00011180739238625;8.4531784523278e-05;0.0002080633857986;6.3664701883681e-05;-0.00018672151782084;0.00014611726510338;-0.00036975694820285;7.9359771916643e-05;0.00091830868041143;-2.3238326321007e-05;0.00092691206373274;-0.00012831958883908;-0.00017251780082006;-0.00075121701229364;-0.00033467906177975;0.0003135281149298;0.00032479796209373;0.0012204456143081;-8.2235426816624e-05;0.00029227769118734;-0.00011440301750554;-0.0019313084194437;5.8133449783782e-05;-1.1936761438847e-05;-1.3792670870316e-05;-0.00049162894720212;7.6620257459581e-05;-0.00011228773655603;2.514768493711e-05;0.00038044661050662;-0.00022595209884457;0.0027426793240011;0.00023203089949675;-0.00137096690014;-2.1509209545911e-05;0.00028814713004977;-0.00020028397557326;0.0002889012102969;8.7357409938704e-05;0.00039352136082016;-6.6341381170787e-05;0.00046839888091199;6.2042134231888e-05;0.00029482037643902;0.00038705838960595;0.0010694100055844;-0.0015070573426783;0.000251118268352;-0.00052276183851063;-0.00080394168617204;-0.0012451773509383;-5.8776102378033e-05;-0.000615720578935;3.7423160392791e-05;-8.437905307801e-06;-7.6364494816517e-06;-0.00025407070643269;1.2418371625245e-05;-0.00019397855794523;0.0001142732653534;0.00041291079833172;-0.00054241588804871;0.0016005981015041;-0.00057032407494262;0.00051793031161651;0.00023856779444031;-0.00014174700481817;0.00022593182802666;0.00058853626251221;5.1957922551082e-05;0.00054075533989817;3.8590194890276e-05;-0.00017673446564004;-0.00021460953576025;0.00022273734793998;-0.001265843398869;-0.0010994374752045;-0.00097638537408784;0.0010977981146425;0.00099814403802156;0.00069959589745849;-0.0013784852344543;0.00019055421580561;-0.00085790298180655;4.6498425945174e-05;-0.00028960171039216;-8.922229608288e-05;0.0001334443804808;7.7863725891802e-05;0.00020897881768178;-7.6486401667353e-05;-0.00018923198513221;8.6676089267712e-05;-0.0010751138906926;0.0003209471469745;-0.00030370996682905;7.7478507591877e-05;-5.603817771771e-05;6.3187319028657e-05;-0.00050459458725527;9.2508511443157e-05;0.00058470026124269;1.153798393716e-06;0.00078491220483556;-7.321713201236e-05;-0.0002694871800486;-0.00073649187106639;-8.9332294010092e-05;0.00074973166920245;0.0001613591593923;0.0016313714440912;-0.00038826678064652;0.00073648249963298;-0.00022084798547439;-0.0011882428079844;1.0857470442716e-06;8.0532619904261e-05;-1.0238162758469e-05;-0.00045573269017041;5.5926047934918e-05;-0.00013148960715625;3.1641673558624e-05;0.00042761888471432;-0.0001790622191038;0.0028684425633401;0.00023895138292573;-0.0014457487268373;5.7270108300145e-06;0.00027854854124598;-0.00019311136566103;0.00032642859150656;6.7082328314427e-05;0.00038218894042075;-5.0335314881522e-05;0.0005884719430469;5.6496384786442e-05;0.00026286102365702;0.00047756664571352;0.001061076647602;-0.0015158557798713;0.00018124867347069;-0.00058126839576289;-0.0008148729102686;-0.001378737972118;-6.1315557104535e-05;-0.00063392071751878;2.0493867850746e-05;3.1346578907687e-05;-4.2124042920477e-06;-0.00032395994639955;7.6992546382826e-06;-0.000153416665853;0.00010795225534821;0.00038284383481368;-0.0006226432742551;0.0010505333775654;-0.0004999540396966;0.00013391034735832;0.00038874309393577;-0.00010755609400803;0.00024436457897536;0.00045162643073127;0.00011214613186894;0.00062766717746854;8.6301180999726e-05;3.3220112527488e-05;-0.00026415049796924;0.00015833848738112;-0.0019220423419029;-0.00133515172638;-0.00075671478407457;0.0014113675570115;0.0021459511481225;0.00060075469082221;-0.001156136742793;0.00010606442083372;-0.00095383037114516;1.1139749176436e-06;-0.00024258473422378;-0.00012627663090825;-2.0457099481064e-07;9.7763680969365e-05;0.00020531802147161;-8.5511703218799e-05;-0.00020876270718873;0.00014100583211984;-0.0014248051447794;0.0005000060191378;-0.00072956341318786;4.2184779886156e-05;8.6348089098465e-05;-4.1113453335129e-05;-0.0005157896084711;0.00010020247282228;0.00033930814242922;-4.8529900595895e-06;0.00061417487449944;-3.8723751458747e-06;-0.00027743628015742;-0.00054399709915742;0.00027411369956098;0.00084804807556793;1.1092361091869e-05;0.0016264008590952;-0.00067499175202101;0.00086792377987877;-0.00027673307340592;-0.00060950755141675;-2.6481644454179e-05;0.00012247254198883;-4.6446652390841e-07;-0.0003914195112884;3.6703138903249e-05;-0.00013775826664641;3.9454098441638e-05;0.00041444864473306;-0.00015470576181542;0.0023928273003548;0.00024936071713455;-0.001671783044003;9.6553609182592e-05;0.00032548644230701;-0.00018468176131137;0.00032020744401962;6.0960905102547e-05;0.00024458553525619;-4.8210195018328e-06;0.0005504657747224;3.9085400203476e-05;0.00018854295194615;0.00025397157878615;0.00088717415928841;-0.0012744778068736;0.0002214199048467;-9.3493115855381e-05;-0.00078942510299385;-0.0012748067965731;-8.6116808233783e-05;-0.00032191426726058;-2.8053726055077e-05;6.9183479354251e-05;-1.5961824828992e-05;-0.00031819174182601;2.4631046926515e-06;-8.5304345702752e-05;8.6936488514766e-05;0.00025397079298273;-0.00061490235384554;0.00019198619702365;-0.00040758756222203;-6.2039180193096e-05;0.00046233177999966;-0.00011016119242413;0.00026848894776776;0.00025814713444561;0.00015051099762786;0.00055769650498405;0.00012066885392414;7.5870666478295e-05;-0.00028928328538314;6.7637382016983e-05;-0.0023577311076224;-0.0014935361687094;-0.00034654949558899;0.001530718174763;0.0029885966796428;0.00052641215734184;-0.00068258814280853;2.2834241462988e-05;-0.00081692665116861;-3.0253235308919e-05;-0.0001939024659805;-0.00014560435374733;-3.1950919947121e-05;0.00010551336163189;0.00014881543756928;-6.6583685111254e-05;-0.00015422598517034;0.00012490377412178;-0.0011311556445435;0.00043188931886107;-0.00069159711711109;3.9695378291071e-06;0.00011089898180217;-6.6221051383764e-05;-0.00037966508534737;7.5502728577703e-05;0.00017555837985128;-1.1406230441935e-05;0.00040559205808677;2.2424977942137e-05;-0.00020388350822031;-0.00030456716194749;0.00036307700793259;0.00064042065059766;-5.5743599659763e-05;0.001155074685812;-0.00060533866053447;0.00066745496587828;-0.00022102882212494;-0.00027120497543365;-2.1741787350038e-05;0.00010387057409389;5.3394214774016e-06;-0.00027156685246155;2.1137690055184e-05;-0.00010429028043291;3.2433752494399e-05;0.00030348997097462;-0.00010750044020824;0.0016066114185378;0.00018483071471564;-0.0013405357021838;0.00011305161024211;0.00026121558039449;-0.00013160293747205;0.00023368913389277;4.2888568714261e-05;0.00013164988195058;1.5138193703024e-05;0.0003974745341111;1.963961221918e-05;0.00011388832353987;9.9552256870084e-05;0.0005785989924334;-0.00086559314513579;0.00018409706535749;0.00013605681306217;-0.00057326856767759;-0.00090706523042172;-7.2093222115654e-05;-0.00012574650463648;-4.0600989450468e-05;6.5775129769463e-05;-1.6974510799628e-05;-0.00023515966313425;3.4963380812769e-07;-3.7600726500386e-05;5.6575154303573e-05;0.00013866888184566;-0.0004566921852529;-0.00020395297906362;-0.0002648078952916;-0.00012803706340492;0.00037027263897471;-8.4353014244698e-05;0.00020932705956511;0.00011740862100851;0.00012798710667994;0.00037660959060304;0.00010227126767859;6.3303545175586e-05;-0.00022422599431593;1.7646007108851e-05;-0.0019282326102257;-0.0011693249689415;-0.0001014673980535;0.0011877764482051;0.002569695468992;0.00035654730163515;-0.00031815428519621;-1.6193989722524e-05;-0.00053817860316485;-3.3529166103108e-05;-0.00012498542491812;-0.00011604489554884;-2.9866876502638e-05;8.155893010553e-05;-2.9394039302133e-05;2.9681345040444e-05;-7.0727728598285e-06;3.400512287044e-05;0.0006972944829613;-0.00081935513298959;0.00049747462617233;-0.00058364123106003;-0.00020831087022088;0.00020853678870481;0.00022563409584109;-0.00018880410061684;6.786864832975e-05;-4.3137915781699e-05;-5.4807747801533e-05;5.3692496294389e-05;-3.7190318835201e-05;-0.00013763231982011;-7.1756526267563e-06;0.00033534204703756;-0.00020445803238545;-0.0019898035097867;0.0022100547794253;-0.00046488104271702;0.00039387913420796;3.6064713640371e-05;1.0786120583361e-06;-8.0710044130683e-05;6.0800899518654e-05;1.2900661204185e-05;-7.9337651186506e-06;2.5834895495791e-05;1.0035560080723e-05;0.00015023325977381;0.0001809995592339;-3.4504784707678e-05;-5.3772640967509e-05;0.00036171931424178;0.00032760150497779;2.7349740776117e-05;9.3978105724091e-06;-7.8221819421742e-05;-9.1511174105108e-05;7.4828734796029e-05;4.0192076994572e-05;7.580136298202e-05;9.3669834313914e-05;-0.00023399251222145;0.00069700798485428;-0.0014449561713263;-0.00012435078679118;-0.00020940545073245;0.00029354484286159;0.00036547510535456;-2.6685136162996e-06;9.15909458854e-06;-0.00025440976605751;-0.00020966118609067;3.0477613108815e-05;6.4072824898176e-05;-4.3791744246846e-05;-5.6154567573685e-05;3.3223874197574e-05;1.3000219951209e-05;2.9795946829836e-06;2.8483076675911e-05;-0.0010651730699465;-0.00087403593352064;-0.00084806041559204;-0.00085223582573235;2.1518219455174e-06;-4.5951179345138e-05;-0.00022019105381332;-0.0001708522613626;-0.00018654846644495;-0.00015547564544249;0.000143848155858;0.00020660102018155;5.9287158364896e-06;-0.00033137903665192;0.00028471479890868;6.7541717726272e-05;-1.3060367564321e-05;0.0012476476840675;0.0011522093554959;0.00046346909948625;0.0003661920200102;0.00040381649159826;0.00031825201585889;0.00012168240209576;0.00011260698374826;-9.5394731033593e-05;-0.00011599104618654;-4.0869192162063e-05;4.4625387090491e-05;-2.2018766685505e-05;3.0887236789567e-05;0.00099809106905013;-0.0011519645340741;0.00073050177888945;-0.00074627832509577;-0.00030003883875906;0.00029733491828665;0.00032240006839857;-0.00025882548652589;0.00011493543570396;-3.6769110010937e-05;-6.6770982812159e-05;6.0230886447243e-05;-5.2006773330504e-05;-0.00031388728530146;-0.00012570775288623;0.0004932300071232;-0.00023868436983321;-0.0026900086086243;0.0031384159810841;-0.0006669515860267;0.00054527138127014;5.3935500545776e-06;-3.3296510082437e-05;-0.00011908841406694;7.3009941843338e-05;1.5107586477825e-05;-6.2686381170352e-06;3.9990729419515e-05;1.268847972824e-05;0.0002016058715526;0.00023853406310081;-0.00012006771430606;-9.7035015642177e-05;0.00053423026110977;0.00041426761890762;4.155217538937e-05;1.1879108569701e-05;-0.00012383802095428;-0.00012628542026505;0.00010265733726555;4.5061333366903e-05;9.2143149231561e-05;0.00014703758643009;-0.00032072895555757;0.00089413241948932;-0.0020583886653185;-0.00015455008542631;-0.00026420946232975;0.0004735118127428;0.00059409026289359;3.8147343730088e-05;2.1652318537235e-05;-0.00035228428896517;-0.00028258934617043;4.1424016671954e-05;9.3786322395317e-05;-5.5368629546138e-05;-8.3046594227199e-05;3.8812057027826e-05;2.32008369494e-05;-1.4380244692802e-06;4.1125284042209e-05;-0.0013369038933888;-0.0013048183172941;-0.001108207157813;-0.0012709642760456;-7.1288704930339e-06;-7.2377340984531e-05;-0.00027495648828335;-0.00025813368847594;-0.00025462062330917;-0.00023501199029852;0.00018995456048287;0.00030823706765659;1.1846592315123e-05;-0.00044843353680335;0.00046310556354001;9.7811527666636e-05;-2.7636573577183e-05;0.0014794293092564;0.0017620393773541;0.00058437854750082;0.00055426388280466;0.00054039055248722;0.00046771168126725;0.00015835574595258;0.00016856240108609;-0.00011949837062275;-0.00016909568512347;-3.683802424348e-05;4.5368440623861e-05;-4.0973704017233e-05;1.2343793969194e-05;0.00098187371622771;-0.0011301136109978;0.00078313669655472;-0.00067499576834962;-0.00029326698859222;0.00028859940357506;0.0003227700071875;-0.00024630446569063;0.00014088666648604;-1.021446496452e-05;-7.1464353823103e-05;5.8688237913884e-05;-5.3328902140493e-05;-0.00047170219477266;-0.00027258071349934;0.00053884327644482;-0.00018714531324804;-0.0025594548787922;0.0031985307577997;-0.00066603603772819;0.00052345008589327;-4.0763716242509e-05;-8.1798192695715e-05;-0.00012867631448898;6.0424667026382e-05;1.5769825040479e-05;-5.0278799790249e-06;4.2053798097186e-05;8.9429404397379e-06;0.00020755646983162;0.0002329843264306;-0.00012791047629435;-5.5010885262163e-05;0.00056906358804554;0.00035905346157961;4.0159218769986e-05;1.0306630429113e-05;-0.00012894884275738;-0.00011380844807718;0.00010772688256111;3.5881868825527e-05;7.5828058470506e-05;0.00016427913215011;-0.00031814226531424;0.00091212260304019;-0.0020066299475729;-0.00016917684115469;-0.00025970776914619;0.000426008424256;0.00056949572172016;4.7138306399575e-05;-1.4255518863138e-06;-0.0003546628577169;-0.00026982571580447;3.7158919440117e-05;9.7010859462898e-05;-4.8659425374353e-05;-8.8862172560766e-05;3.0483808586723e-05;3.0035098461667e-05;-4.02064915761e-06;4.6381570427911e-05;-0.0011685469653457;-0.0014377717161551;-0.00099207449238747;-0.0013585834531114;-8.3205595728941e-06;-6.5508786065038e-05;-0.00023708374646958;-0.00028523942455649;-0.00022947175602894;-0.00024550946545787;0.00016900440095924;0.00032201479189098;1.2937247447553e-05;-0.00044581605470739;0.00043854236719199;0.00010058547923109;-3.9143840695033e-05;0.0012122736079618;0.0020202605519444;0.00050327205099165;0.00060973729705438;0.00049607682740316;0.00049197056796402;0.00014030039892532;0.00017999375995714;-0.00010643581481418;-0.00018034316599369;-2.2323565644911e-05;3.0986950150691e-05;-4.2003717680927e-05;-1.2142041896368e-06;0.00067445414606482;-0.00077675504144281;0.00059706822503358;-0.00045771221630275;-0.00019176765636075;0.00018855027155951;0.00022786531189922;-0.00016459550533909;0.00011713424464688;5.0042494876834e-06;-6.6220905864611e-05;5.4146246839082e-05;-3.8678877899656e-05;-0.00043376788380556;-0.00027686974499375;0.00041774727287702;-0.00010725344327511;-0.0017524760914966;0.0023249597288668;-0.00046677418868057;0.00035158221726306;-5.0469887355575e-05;-8.7566942966077e-05;-9.9388227681629e-05;3.7994941521902e-05;1.5232129953802e-05;-6.8877416197211e-06;2.947587017843e-05;2.562183453847e-06;0.00016405053611379;0.00017164174641948;-4.6534030843759e-05;3.5329390811967e-05;0.00042641963227652;0.00022638717200607;2.3827424229239e-05;9.6499261417193e-06;-8.7719185103197e-05;-6.575482984772e-05;8.5071347712073e-05;2.5810242732405e-05;4.4738913857145e-05;0.00012275468907319;-0.00022881658514962;0.00074558571213856;-0.0013384588528425;-0.00015858410915826;-0.0002042059059022;0.00019695230002981;0.00029939840896986;1.2208295629534e-05;-4.0390063077211e-05;-0.00025782320881262;-0.00018599916074891;2.2489664843306e-05;6.8709392508026e-05;-3.1747647881275e-05;-6.702928658342e-05;1.7884180124383e-05;2.5497791284579e-05;-2.183752712881e-06;3.9508788177045e-05;-0.00075451924931258;-0.001127797877416;-0.00062638462986797;-0.0010212364140898;7.5182151704212e-07;-2.8514528821688e-05;-0.00015053727838676;-0.00022205349523574;-0.00013952256995253;-0.00017554085934535;0.00010301961447112;0.00023121864069253;8.4029616118642e-06;-0.00032613051007502;0.0002263920760015;7.3059578426182e-05;-3.7025420169812e-05;0.00074914930155501;0.0016487939283252;0.00031497882446274;0.00047096007619984;0.00032124909921549;0.00036652045673691;8.7801250629127e-05;0.00013438599125948;-7.0597183366772e-05;-0.00013753052917309;5.987914846628e-05;-0.00010491019202163;-0.00013133391621523;0.00012005938333459;-0.00043873165850528;0.0010118698701262;-2.11016558751e-05;0.00068724615266547;8.4505758422893e-05;-0.00013252248754725;-7.1780108555686e-05;0.00028868365916423;-8.5092659674046e-07;-1.6457419405924e-05;-4.0293150959769e-05;-0.0002731597633101;0.00014502654084936;0.00019418177544139;-0.00032258583814837;0.00012344231072348;-0.00051338481716812;0.00055727083235979;-0.00098775583319366;0.00022505424567498;-0.00054994772654027;4.7676610847702e-05;-1.0622259651427e-05;-6.3816605688771e-06;-0.00011721514601959;-6.3334828155348e-06;0.00020047184079885;2.4432523787254e-05;-7.9196361184586e-05;-5.3330935770646e-05;0.00021518296853174;0.00023090357717592;0.0010977819329128;0.00010877112072194;-0.0012755985371768;-0.00015219811757561;0.00029869930585846;3.8332873373292e-05;0.00014895736239851;3.4616266930243e-05;4.3591469875537e-05;4.4398086174624e-05;0.00036796802305616;8.0316116509493e-05;0.00010388161172159;0.00050464982632548;8.6475716670975e-05;-0.00062725698808208;-0.00053041696082801;0.00024360003590118;-0.00010413535346743;-0.00059978273930028;-7.2783463110682e-05;2.056912990156e-06;-1.4076669685892e-05;8.7088570580818e-05;-1.3645053513756e-05;-0.00023928309383336;5.9052996220998e-05;-1.7581127394806e-05;-0.00047301035374403;7.6207696110941e-05;-0.00018626239034347;-0.00062191829783842;0.00038764721830375;-0.00053173484047875;0.00014730551629327;2.1277151972754e-05;0.00014462406397797;1.1711724255292e-05;0.00014076891238801;0.00020327839592937;-0.00018283493409399;0.00011373705638107;-3.6473091313383e-05;-0.0021105937194079;-0.0010700491257012;0.0012753639603034;9.284884436056e-05;0.00026209189672954;0.0029166350141168;-7.2375172749162e-05;-3.9871301851235e-05;-8.8208900706377e-05;-0.00024088784994092;-0.00012398215767462;-4.691477806773e-05;6.1190679844003e-05;-7.1043206844479e-05;7.9742982052267e-05;-0.00015460132271983;-0.00016306695761159;0.00017957446107175;-0.00055708037689328;0.0014655636623502;-7.083619129844e-05;0.0008278451859951;8.0693680502009e-05;-0.00014377724437509;-0.00010039997869171;0.0004150151507929;-1.7064150597434e-05;-8.8608452642802e-05;-2.8157963242847e-05;-0.00041243544546887;0.00022728503972758;0.0004411905829329;-0.00026188549236394;8.3310551417526e-05;-0.00078055023914203;0.00067348656011745;-0.001543203019537;0.00030556449200958;-0.00078424357343465;7.4184070399497e-05;0.00012661064101849;-3.1007593292998e-07;-0.00014941480185371;-1.5736219211249e-05;0.00029130442999303;2.947251778096e-05;-0.0001057736662915;-7.3207869718317e-05;0.00029611878562719;0.00031316254171543;0.0017289743991569;9.2610425781459e-05;-0.0016532976878807;-0.00020424961985555;0.0003722935798578;5.4796837503091e-05;0.00021193531574681;2.3468550352845e-05;0.00010994237527484;6.5461194026284e-05;0.00053478666814044;0.00012992623669561;0.00024722749367356;0.00080203003017232;9.2496797151398e-05;-0.00093925598775968;-0.00073968898504972;7.2849412390497e-05;-0.00013632247282658;-0.00087550230091438;-6.6922570113093e-05;-0.00012892665108666;-1.225879714184e-05;0.0001059729111148;-1.5873240045039e-05;-0.00033224627259187;9.27094151848e-05;-5.5998036259552e-05;-0.00065452809212729;0.0001660828711465;-0.00031538179609925;-0.00037829752545804;0.00049292366020381;-0.00057085766457021;0.00020688265794888;-2.2419410328212e-08;0.00017600702994969;0.00011354577873135;0.00017152199870907;0.00034959215554409;-0.00024895623209886;0.00015875817916822;-4.7356193135784e-06;-0.0026690193917602;-0.0014033938059583;0.001691713812761;-8.7018219346646e-05;0.00040571531280875;0.0035476251505315;-4.8857076762943e-05;-0.00030349972075783;-9.5121649792418e-05;-0.00047410646220669;-0.00016000344476197;-9.8955191788264e-05;8.450954919681e-05;-8.8835258793551e-05;6.3322237110697e-05;-0.00014106102753431;-0.00011231229291297;0.00016225966101047;-0.00039174317498691;0.0012387956958264;-9.5391653303523e-05;0.00051306717796251;1.5654886738048e-05;-5.5038570280885e-05;-8.3432169049047e-05;0.00036606079083867;-2.6194125894108e-05;-0.00017929699970409;1.3245180525701e-05;-0.00042001315159723;0.00021718050993513;0.00056016381131485;-6.258339908527e-06;-3.3987835195148e-05;-0.00071173277683556;0.00043263717088848;-0.0014573677908629;0.00024035894603003;-0.00066695065470412;6.023913010722e-05;0.00034860073355958;7.9003857536009e-06;-0.00010880656918744;-2.3805561795598e-05;0.00027390630566515;2.0085524738533e-05;-8.6347630713135e-05;-6.9417052145582e-05;0.00025748446932994;0.00025409139925614;0.001762684318237;1.7458007278037e-05;-0.0012824875302613;-0.00016971255536191;0.00027611330733635;4.9630903959041e-05;0.00018767987785395;-9.7395759439678e-06;0.00016792354290374;6.025959373801e-05;0.00049088976811618;0.00014411965094041;0.00034345069434494;0.00079765869304538;5.1393311878201e-05;-0.00092280382523313;-0.00063850777223706;-0.0002482368145138;-0.00010211214248557;-0.00081340101314709;-1.8490542061045e-05;-0.00028947106329724;-2.4559562916693e-06;7.1288202889264e-05;-9.2678592409356e-06;-0.00028975988971069;9.3635913799517e-05;-8.8336593762506e-05;-0.00056817277800292;0.00021806274889968;-0.00034211532329209;0.00024584750644863;0.00036892032949254;-0.00031496916199103;0.00017671236128081;-2.6700838134275e-05;0.00012306141434237;0.00021478257258423;0.00011795588216046;0.0003661353548523;-0.00020613289962057;0.00012923617032357;5.5901080486365e-05;-0.0019962054211646;-0.0011053412454203;0.0013724822783843;-0.00034306122688577;0.00039797136560082;0.0024756838101894;2.1929809008725e-05;-0.00055387982865795;-4.8496829549549e-05;-0.00054934225045145;-0.00012370674812701;-0.00012207367399242;7.1650159952696e-05;-6.1434038798325e-05;2.2879062271386e-06;-4.248275217833e-05;0.00015388494648505;-3.0473489459837e-05;0.00025643047410995;-0.0009151172125712;-1.5879511920502e-05;-0.00086981302592903;-0.00016168600996025;0.00027001206763089;-1.6757145203883e-05;4.567734504235e-05;5.9786456404254e-05;-0.00072657351847738;0.00011830870062113;-0.0005556580144912;-5.6606499128975e-05;0.00032080718665384;0.00048850860912353;-0.0003097039880231;0.00032177232787944;-0.00032854598248377;-8.4189981862437e-05;-0.00010974649194395;0.00020546767336782;-9.7222633485217e-05;0.0018138905288652;6.0583884078369e-06;0.00010399932943983;-6.486246275017e-05;0.00021842673595529;5.8803839237953e-06;-3.2947904401226e-05;-0.00015507453645114;0.00013967417180538;0.00014747549721505;0.0012587936362252;-2.0826470063184e-05;-0.0008088166359812;-0.00015762334805913;0.00028133709565736;7.5616844696924e-05;0.00012350323959254;-4.3847678171005e-05;0.00027047013281845;5.8115012507187e-05;-1.082374365069e-05;0.00016221844998654;8.3399136201479e-05;0.000581034575589;0.00020403999951668;-0.00073245505336672;-0.00043724520946853;-0.00010956764162984;-5.8251614973415e-05;-0.00052132795099169;1.8229626221e-05;-0.00020692052203231;-5.1205975069024e-06;-8.2042744907085e-05;2.0187057998555e-06;-2.8914888389409e-05;7.2786926466506e-05;-0.00012050756049575;-0.00022361268929671;0.00013836783182342;-0.00036830475437455;0.00079993630060926;4.6465702325804e-05;0.00056075939210132;7.8511286119465e-05;-4.1437509935349e-05;-3.8881538785063e-05;0.00035524839768186;3.7479946968233e-06;-5.538082041312e-05;-5.5849104683148e-05;-0.00051370251458138;0.00014709704555571;-0.00022398910368793;-0.00048198623699136;0.00032962128170766;-0.00048149976646528;0.00047602868289687;-0.0002271222329;0.00019062579667661;-0.00060193857643753;2.1102780010551e-05;9.1454341600183e-05;-2.264164868393e-05;-0.0001486650435254;1.5893627278274e-05;0.00027787178987637;9.8658150818665e-05;-1.6862231859704e-05;-4.1223970583815e-06;-4.6899887820473e-05;0.00039333465974778;-0.00016494737064932;0.00070069299545139;4.1917479393305e-05;-0.00039280569762923;0.00028754826053046;-0.00019895550212823;3.1545125239063e-05;0.00090966513380408;-8.5371348177432e-06;0.0010104038519785;-0.00020027825667057;-0.00015996514412109;-0.00075859582284465;-0.00063923065317795;0.00016606423014309;0.00038299360312521;0.00082798051880673;0.00030916061950848;-1.4465802451014e-05;-1.7379948985763e-05;-0.0022122173104435;0.00010273214866174;-2.786021468637e-05;-1.7901675164467e-05;-0.00046288425801322;8.1212339864578e-05;-1.7247239156859e-05;-1.4416083104152e-05;0.00020508469606284;-0.00018754629127216;0.0030561392195523;3.7649711885024e-05;-0.00035677308915183;-0.00017357410979457;3.4406718896207e-06;-6.8017536250409e-05;6.901819142513e-05;6.2565966800321e-05;0.00060321815544739;-0.00013077982293908;0.00060685619246215;2.2233538402361e-05;0.00039172871038318;0.00077361409785226;0.00089736469089985;-0.0016300678253174;5.7476499932818e-05;-0.0013790121302009;-0.00046022707829252;-0.00085809157462791;4.1856110328808e-05;-0.0014360662316903;0.00014400418149307;-3.3500175049994e-05;1.5968953448464e-05;-0.00027285929536447;2.9958660888951e-05;-0.00026388387777843;0.00011663591430988;0.00055492843966931;-0.0004769931838382;0.0027888007462025;-0.00048137659905478;0.00039970164652914;5.2484978368739e-05;-8.618034189567e-05;0.00010520794603508;0.00074308976763859;1.5549083400401e-05;0.00041872018482536;-3.533764538588e-05;-0.00010024083894677;-0.00010958870552713;0.00037622431409545;-0.0002799560315907;-0.00037043209886178;-0.0016065498348325;0.00071017991285771;-0.00044631416676566;0.00042725418461487;-0.0018409863114357;0.00023541005793959;-0.00081179628614336;9.2622249212582e-05;-0.00023548377794214;-4.672963405028e-05;0.00010373639088357;5.1303697546246e-05;0.00018529510998633;-5.1157639973098e-05;-0.00013201835099608;3.5332031984581e-05;-0.00060052348999307;5.2401053835638e-05;0.00028640535310842;0.00010369725350756;-0.00027947887429036;0.00023082409461495;-0.00041996166692115;6.4537169237155e-05;0.00086794287199154;1.6177582438104e-05;0.0010155489435419;-0.00017725386715028;-0.00029736646683887;-0.0010048020631075;-0.00057846494019032;0.00068099185591564;0.00035223795566708;0.0015793503262103;5.2414474339457e-05;0.00046344348811544;-0.0001380560133839;-0.001910007908009;4.6886281779734e-05;2.6873060051003e-05;-2.0941217371728e-05;-0.00052945234347135;7.9126155469567e-05;-7.6914264354855e-05;4.2240535549354e-06;0.00035913949250244;-0.00018983737390954;0.0036069413181394;0.00012530040112324;-0.00079715566243976;-0.00016572314780205;7.7050128311384e-05;-0.00011992096551694;0.00021656759781763;6.4402825955767e-05;0.00061984750209376;-0.00012597994646057;0.00075606122845784;4.3143583752681e-05;0.00038683251477778;0.00086991704301909;0.0011735702864826;-0.0018617365276441;7.0985457568895e-05;-0.0014715641736984;-0.00067666568793356;-0.0013087971601635;8.9151444626623e-06;-0.0013951328583062;0.0001315410627285;-6.9036086642882e-06;1.7036694771377e-05;-0.00035834847949445;2.3203454475151e-05;-0.00027830724138767;0.00013926999235991;0.00064265279797837;-0.00063577061519027;0.0028199884109199;-0.00059434620197862;0.00037331916973926;0.00019944440282416;-0.0001327118370682;0.00019330187933519;0.00079519051359966;5.6961565860547e-05;0.00074146600672975;1.7234833649127e-06;6.4874671807047e-05;-0.00020539117394947;0.00035436369944364;-0.0010039580520242;-0.00082715111784637;-0.0016382507747039;0.001158460159786;0.00049770175246522;0.00057644484331831;-0.0020700360182673;0.00023249162768479;-0.0012587381061167;8.4970357420389e-05;-0.00029907468706369;-8.6728301539551e-05;1.211257858813e-05;8.5726089309901e-05;0.00022733630612493;-7.6623720815405e-05;-0.00023081919061951;0.00012056811829098;-0.0013946689432487;0.00028148657293059;-0.00018270437431056;0.00011799908679677;-0.0001208928442793;0.00012486374180298;-0.00054948497563601;8.2586309872568e-05;0.00060135911917314;2.7547885110835e-05;0.00084519217489287;-0.00011150844511576;-0.00035090887104161;-0.00092851195950061;-0.00031855041743256;0.00099515181500465;0.00019152017193846;0.0018972544930875;-0.00026385328965262;0.00086136895697564;-0.00022958539193496;-0.0012611093698069;-8.6162199295359e-06;9.1929061454721e-05;-1.561935096106e-05;-0.0004831095575355;6.0403086536098e-05;-0.0001139922751463;1.9395743947825e-05;0.00042415081406944;-0.00015078946307767;0.0035055566113442;0.00018582210759632;-0.0010836670408025;-0.00010487713734619;0.00015056150732562;-0.00015159539179876;0.00030734387109987;5.1499722758308e-05;0.00054135918617249;-9.4417329819407e-05;0.00074706401210278;5.3382762416732e-05;0.00031954937730916;0.00082777295028791;0.0011921084951609;-0.0017601092113182;5.1855236961273e-05;-0.0012827295577154;-0.00076111149974167;-0.0014806555118412;-2.1654161173501e-05;-0.0011260488536209;8.5281062638387e-05;1.6435404177173e-05;1.5158710994001e-05;-0.00037534852162935;1.2698516911769e-05;-0.00021728919818997;0.00012802188575733;0.00054708815878257;-0.00067879661219195;0.001926135388203;-0.00053455925080925;0.00010036926687462;0.00036563831963576;-0.00010302531154593;0.0002256002771901;0.00061989738605917;0.00010689636837924;0.00077894498826936;6.2579340010416e-05;0.00015951556270011;-0.00025925840600394;0.00024694111198187;-0.0017113331705332;-0.0011830547591671;-0.0012146480148658;0.0014330028789118;0.0017361080972478;0.00055160379270092;-0.0016775832045823;0.00014558093971573;-0.0012286033015698;2.4945678887889e-05;-0.00026458408683538;-0.00012257767957635;-6.5793334215414e-05;0.00010223687422695;0.00020465369743761;-7.789944356773e-05;-0.0002287565584993;0.00015027126937639;-0.0015213913284242;0.00038512167520821;-0.00046398025006056;7.9480967542622e-05;3.6138351333648e-06;2.8378481147229e-05;-0.0005105581949465;7.8803401265759e-05;0.00034479409805499;1.7477772416896e-05;0.0006072778487578;-4.3558418838074e-05;-0.00030771511956118;-0.00064542976906523;-1.6477823010064e-05;0.00094740296481177;3.7711342883995e-05;0.0016624383861199;-0.00045057907118462;0.00089587399270386;-0.00024236380704679;-0.00067685538670048;-2.9736576834694e-05;0.00011271243420197;-5.3103467507754e-06;-0.00037412706296891;3.8726877392037e-05;-0.00011388150596758;2.5716302843648e-05;0.00037986991810612;-0.00010650933108991;0.0027509729843587;0.0001947703276528;-0.0011579298879951;-2.0070476239198e-05;0.00019070458074566;-0.00014527389430441;0.00029564526630566;3.861518780468e-05;0.00037390866782516;-4.8059133405332e-05;0.0006014559767209;4.4424621592043e-05;0.0002172464155592;0.00059081008657813;0.00095668580615893;-0.0013658101670444;5.9226829762338e-05;-0.00079477950930595;-0.00068785040639341;-0.0012843038421124;-4.4139571400592e-05;-0.00070939672878012;2.9960032406962e-05;3.4867658541771e-05;6.518746886286e-06;-0.00031773481168784;4.3398481466284e-06;-0.00013169627345633;9.5633047749288e-05;0.0003654986503534;-0.00058854761300609;0.00088478345423937;-0.00039314152672887;-9.7218318842351e-05;0.00041282767779194;-7.115604239516e-05;0.00021333346376196;0.00037677923683077;0.0001254159869859;0.00061960559105501;9.4719980552327e-05;0.00015490176156163;-0.00025103983352892;0.00013002791092731;-0.0019184997072443;-0.0012310467427596;-0.00068065751111135;0.0013707374455407;0.002333102049306;0.00043523471686058;-0.0010519797215238;5.5146902013803e-05;-0.00092747167218477;-2.0332297935965e-05;-0.00019165378762409;-0.00012702253297903;-8.1637343100738e-05;9.5352996140718e-05;0.00013219748507254;-5.4326628742274e-05;-0.00014536203525495;0.00010804974590428;-0.001019598916173;0.00030650207190774;-0.00043365982128307;2.8983895390411e-05;4.5009150198894e-05;-1.4979320440034e-05;-0.00033332631574012;5.5807398894103e-05;0.00018209165136795;2.111532694471e-06;0.00036704938975163;-6.3031961872184e-06;-0.00019323674496263;-0.00034135454916395;0.00013217936793808;0.0006052273674868;-1.9141776647302e-05;0.0010460680350661;-0.00039345363620669;0.00059471029089764;-0.00017245000344701;-0.00032745001954027;-1.9891738702427e-05;8.2025355368387e-05;9.9518229035311e-07;-0.0002360206854064;2.1547470169025e-05;-8.0450110544916e-05;2.1376528820838e-05;0.00025248160818592;-7.2233720857184e-05;0.001631093560718;0.00014096453378443;-0.00091209448873997;3.2575146178715e-05;0.00016307558689732;-0.00010105942055816;0.00019788634381257;2.7740959922085e-05;0.00019022737978958;-1.2315326785028e-05;0.00037242486723699;2.4033553927438e-05;0.00011864940461237;0.00027533373213373;0.00057114398805425;-0.00082337309140712;7.7729971962981e-05;-0.00027562389732338;-0.00046585703967139;-0.00081800954649225;-4.2937019316014e-05;-0.0003190811839886;-3.7442625853146e-06;3.6417579394765e-05;-2.5152264697681e-06;-0.00020500882237684;1.1484549986562e-06;-6.1828002799302e-05;5.606263584923e-05;0.00018768543668557;-0.00038707492058165;0.00023902911925688;-0.00023704608611297;-0.0001039238559315;0.00029729012749158;-5.3693362133345e-05;0.00015524686023127;0.00018024786550086;9.53432318056e-05;0.00037111461278982;7.5356882007327e-05;8.7439955677837e-05;-0.00017669681983534;5.2652841986855e-05;-0.0014374664751813;-0.00089423055760562;-0.00028654758352786;0.00095157593023032;0.0018557934090495;0.00028234077035449;-0.00050650694174692;1.0277646651957e-05;-0.00054187042405829;-2.330144343432e-05;-0.00011491958139231;-9.1055182565469e-05;-4.7002642531879e-05;6.5706524765119e-05;-2.8906939405715e-05;2.9007967896177e-05;4.092174640391e-05;-1.8599621398607e-05;0.00065785174956545;-0.00082595268031582;0.00059644790599123;-0.00068710261257365;-0.0001707009942038;0.00017882697284222;0.00019783107563853;-0.00016682448040228;8.4514300397132e-05;-6.4643652876839e-05;-0.00010848060628632;0.00010354039113736;-3.23680578731e-05;-0.00015737519424874;-4.0855018596631e-05;0.00022136441839393;-8.4969185991213e-05;-0.0019881946500391;0.0022792313247919;-0.00042517378460616;0.00037760406848975;2.2706357412972e-05;2.4617980670882e-05;-8.6809239292052e-05;6.8164539698046e-05;2.9888267818023e-05;-2.5562589144101e-05;2.2342883312376e-05;6.3545476223226e-06;0.0001681624999037;0.00019621549290605;0.00018307213031221;0.00015481650189031;0.00041783769847825;0.00037661712849513;-3.7832121506653e-06;-6.3352767938341e-06;-2.9894335966674e-05;-5.0572722102515e-05;9.2404981842265e-05;5.2192288421793e-05;5.4435502534034e-05;6.6484135459177e-05;-0.00027104493346997;0.0010772795649245;-0.0010420579928905;-0.0001583799457876;-0.00024513487005606;-0.00021382562408689;-0.00015272210293915;-0.00012248181155883;-9.383684664499e-05;-0.00026066447026096;-0.00020455528283492;1.0551028026384e-05;4.8598911234876e-05;-2.9076592909405e-05;-4.2999206925742e-05;2.6947182050208e-05;7.9156234278344e-06;7.6849515608046e-05;9.6151903562713e-05;-0.00094623048789799;-0.0008280428010039;-0.00069982698187232;-0.00074563105590641;2.5130098947557e-05;-1.1314023140585e-06;-0.00021850885241292;-0.00018094445113093;-0.00013120549556334;-0.00012537295697257;0.00011332448048051;0.00016476311429869;2.965263047372e-05;0.00024977591237985;8.5861291154288e-05;-0.00018217843899038;-0.00024752123863436;0.0010317991254851;0.0010070482967421;0.00040206927224062;0.00034598563797772;0.00034161497023888;0.00029990749317221;0.00011000427912222;0.00010853081039386;-9.9575619969983e-05;-0.00011716186418198;-4.0932307456387e-05;4.3046828068327e-05;5.7783090596786e-05;-5.1788967539323e-05;0.00096220680279657;-0.0011570727219805;0.00088599097216502;-0.00093588384333998;-0.00024221578496508;0.00025217494112439;0.00028244138229638;-0.00022327913029585;0.00014526018640026;-7.6207681559026e-05;-0.00015046753105707;0.00014480664685834;-4.4320720917312e-05;-0.00034123691148125;-0.00015259263454936;0.00030609910027124;-5.147900810698e-05;-0.0027179538737983;0.003252787515521;-0.00061818503309041;0.00051721121417359;-2.0591742213583e-05;1.2067359421053e-05;-0.00013001258776058;8.7388209067285e-05;4.1130300814984e-05;-3.617404945544e-05;3.2947558793239e-05;6.7908536038885e-06;0.00023911308380775;0.00026169311604463;0.00023584481095895;0.00025699238176458;0.00061095727141947;0.00051322171930224;-9.6467301773373e-06;-1.5925146726659e-05;-4.682673534262e-05;-5.7191635278286e-05;0.00012715964112431;6.7756751377601e-05;6.1736420320813e-05;9.9601063993759e-05;-0.00037775651435368;0.0015335599891841;-0.0014019461814314;-0.00023460916418117;-0.00032294818083756;-0.00033495665411465;-0.00028455728897825;-0.00015645477105863;-0.00015090417582542;-0.00035847892286256;-0.00028157309861854;1.2095344573027e-05;6.6536653321236e-05;-3.2806638046168e-05;-5.9424801293062e-05;2.9936994906166e-05;1.4382213521458e-05;0.00012002708535874;0.00014814216410741;-0.0011735010193661;-0.0012251302832738;-0.00087008980335668;-0.0010946779511869;2.8773132726201e-05;3.6089406876272e-06;-0.000281000189716;-0.00027129054069519;-0.00016793256509118;-0.00018268120766152;0.00013986531121191;0.00023926989524625;5.0217742682435e-05;0.00048034597421065;0.00012727851571981;-0.00030796017381363;-0.00039936500252225;0.0011658560251817;0.0015246897237375;0.00050341029418632;0.00051549932686612;0.00044354985584505;0.00043558381730691;0.00014173057570588;0.00016048552060965;-0.00012695464829449;-0.00017206964548677;-3.7862369936192e-05;4.3443760660011e-05;3.9876234950498e-05;-6.7378074163571e-05;0.00096939638024196;-0.0011263188207522;0.00092556554591283;-0.00088091241195798;-0.00023774972942192;0.00024576668511145;0.00028784290771;-0.00021031491633039;0.00017068673332687;-5.0779024604708e-05;-0.00015075769624673;0.00014580093557015;-4.6429348003585e-05;-0.00049780227709562;-0.00027054466772825;0.00035258123534732;-6.0054608184146e-06;-0.0026136271189898;0.0033130687661469;-0.00063085556030273;0.00049131718697026;-6.461568409577e-05;-3.3991491363849e-05;-0.00013926302199252;7.5864183600061e-05;4.0039132727543e-05;-3.6041987186763e-05;3.4711276384769e-05;3.813806870312e-06;0.00025018930318765;0.00025153791648336;0.00021088974608574;0.0002985670871567;0.00062963209347799;0.00047712126979604;-9.7047277449747e-06;-1.6714742741897e-05;-5.6925273383968e-05;-4.3953052227153e-05;0.00012794420763385;6.2532250012737e-05;5.0275764806429e-05;0.00011289888789179;-0.00037548807449639;0.0015434828819707;-0.0013721579452977;-0.0002601238375064;-0.00030540194711648;-0.00033622240880504;-0.00031958890031092;-0.00013893721916247;-0.00017395758186467;-0.0003556375449989;-0.00027541758026928;1.1589196219575e-05;6.7629494878929e-05;-2.8715567168547e-05;-6.3868828874547e-05;2.2887777959113e-05;2.076091550407e-05;0.00011729949619621;0.00014846681733616;-0.0010309591889381;-0.0013528749113902;-0.0007648296887055;-0.001192026422359;2.3780672563589e-05;1.2873710147687e-05;-0.00025025615468621;-0.00029426458058879;-0.00014858914073557;-0.00019347220950294;0.00012119217717554;0.00025517155881971;5.0133188779e-05;0.00046249924344011;0.0001104291077354;-0.00030140054877847;-0.00039708850090392;0.00092885416233912;0.0017801789799705;0.00043880852172151;0.00056486821267754;0.00040598138002679;0.00046226260019466;0.00012646459799726;0.00017138455586974;-0.00011418553913245;-0.00018435070523992;-2.3475997295463e-05;2.9711338356719e-05;7.759697837173e-06;-4.8230056563625e-05;0.00067688839044422;-0.00076697149779648;0.00067439273698255;-0.00058450241340324;-0.00016151885211002;0.00016547609993722;0.00020887682330795;-0.0001420784246875;0.00013301643775776;-1.7221780581167e-05;-0.00011019715020666;0.00010624869901221;-3.4828637581086e-05;-0.00044924175017513;-0.00026307499501854;0.00030514833633788;-7.2228124281537e-07;-0.00179741717875;0.0023933569900692;-0.00045110768405721;0.00032842953805812;-6.164579099277e-05;-6.1911217926536e-05;-0.00010474639566382;4.6587902033934e-05;2.8517904866021e-05;-2.5518887923681e-05;2.5663670385256e-05;4.5297016981749e-07;0.0001896744070109;0.0001780838065315;0.00013760477304459;0.00023800868075341;0.0004555195919238;0.00030736828921363;-4.4432204049372e-06;-6.796936304454e-06;-4.8582041927148e-05;-2.4857135940692e-05;9.4508097390644e-05;4.2973908421118e-05;3.1903222406982e-05;9.1306668764446e-05;-0.00026656876434572;0.0011034265626222;-0.0009818896651268;-0.000208377969102;-0.00021532554819714;-0.00022298161638901;-0.00022488123795483;-9.0517743956298e-05;-0.00013980457151774;-0.00025542089133523;-0.00019295718811918;9.2172822405701e-06;5.0482634833315e-05;-2.1130073946551e-05;-5.16600375704e-05;1.3779501387035e-05;1.9681081539602e-05;7.1245318395086e-05;9.8389064078219e-05;-0.00067949231015518;-0.0010695634409785;-0.00049968512030318;-0.00093015056336299;1.6748243069742e-05;1.6995865735225e-05;-0.00016107015835587;-0.00022462806373369;-9.5375464297831e-05;-0.00014546142483596;7.6936928962823e-05;0.00019475728913676;3.014612957486e-05;0.00021987456420902;4.9987535021501e-05;-0.0001697472325759;-0.00024764935369603;0.0005825828993693;0.0014935315120965;0.00028209039010108;0.00043913195258938;0.00027212072745897;0.00035002126242034;8.1294252595399e-05;0.0001292441302212;-7.515568722738e-05;-0.00014057994121686;7.283860759344e-05;-0.00016473353025503;-0.0001662789582042;0.00021144421771169;-0.00045260199112818;0.0016477833269164;-0.00012656222679652;0.00056911056162789;1.3574061085819e-05;-6.7634144215845e-05;-8.2670769188553e-05;0.00042808672878891;-4.485368845053e-05;-0.00013233696518;1.4368749361893e-05;-0.00040770572377369;0.00028116558678448;0.00063859618967399;5.4105035815155e-05;1.2426327884896e-05;-0.00094428996089846;0.00046704916167073;-0.0017181922448799;0.00027867994504049;-0.00084377540042624;8.7277745478787e-05;0.00024123965704348;8.0158624768956e-06;-0.00013046195090283;-2.150960972358e-05;0.00027784548001364;1.5737972717034e-05;-8.692125993548e-05;-2.3025721020531e-05;0.00026684516342357;0.00025269607431255;0.0021328134462237;-3.4588596463436e-05;-0.0011643109610304;-0.00015962557517923;0.00022557636839338;3.297857256257e-05;0.0002083413710352;-3.0323359169415e-05;0.00023040729865897;6.3725266954862e-05;0.00057276547886431;0.00015624273510184;0.00059638160746545;0.00092052656691521;-6.9717068981845e-05;-0.0010344062466174;-0.00065534590976313;-0.00067946576746181;-8.9790650235955e-05;-0.00092391116777435;9.1813744802494e-06;-0.00048185064224526;1.1352169167367e-05;6.6553315264173e-05;-9.6582025435055e-06;-0.00031918362947181;0.00010666600428522;-0.00011091668420704;-0.00063261378090829;0.00028160042711534;-0.00034349077031948;0.00046403004671447;0.00042041460983455;-0.00046318932436407;0.0001772771938704;-6.3396018958883e-06;0.00013925613893662;0.00026642219745554;0.00013154059706721;0.00044358382001519;-0.00022245067520998;0.00022366987832356;7.7803706517443e-05;-0.0021589158568531;-0.0011554097291082;0.001511674374342;-0.00048529639025219;0.00036455373628996;0.0027207175735384;1.2929588592669e-05;-0.00073022692231461;-6.1506179918069e-05;-0.00066998123656958;-0.00013696691894438;-0.00012586997763719;7.9009878390934e-05;-0.00011797581828432;6.6037820943166e-05;-0.00017348444089293;-0.00012535495625343;0.00021316818310879;-0.00034208365832455;0.0015376746887341;-0.00015748974692542;0.00030907554901205;-5.8064768381882e-05;2.9846205507056e-05;-8.0692523624748e-05;0.00043552066199481;-5.2022292948095e-05;-0.00029371990240179;6.3971761846915e-05;-0.0005349469720386;0.00030354331829585;0.00086280994582921;0.0003054108528886;-0.00012808426981792;-0.00096362561453134;0.00029033757164143;-0.0018601481569931;0.00024876720272005;-0.00080682011321187;7.2531445766799e-05;0.0006383090512827;1.695028913673e-05;-0.00010523189121159;-3.7451853131643e-05;0.00032526656286791;9.3412991191144e-06;-8.0730183981359e-05;-4.8981575673679e-05;0.00027685085660778;0.00023224392498378;0.0025323450099677;-9.8978875030298e-05;-0.0010687751928344;-0.00015729019651189;0.00019141494703945;4.2696454329416e-05;0.00020973032223992;-6.5803549659904e-05;0.00033597758738324;6.6237669670954e-05;0.00062702456489205;0.00021031538199168;0.00072829099372029;0.0010549282887951;-7.1695263613947e-05;-0.0012292886385694;-0.00067344115814194;-0.00099617068190128;-7.2250411903951e-05;-0.0010093309683725;5.5353291827487e-05;-0.000723508419469;1.8033637388726e-05;4.4486809201771e-05;-2.8094980280002e-06;-0.00033621635520831;0.00012817127571907;-0.00016689604672138;-0.00066566560417414;0.0003815078525804;-0.00045038288226351;0.0011927779996768;0.00035368229146115;-0.00024161522742361;0.00018326264398638;-4.4290580262896e-05;0.00010882009519264;0.00042605446651578;9.4803377578501e-05;0.00050992937758565;-0.00021835674124304;0.00019014561257791;0.00016307695477735;-0.0018504096660763;-0.0010568716097623;0.0014607083285227;-0.00084538082592189;0.00044587245793082;0.0020637975540012;9.8032396635972e-05;-0.0011120513081551;-1.5563386114081e-05;-0.00082979036960751;-0.00012384170258883;-0.00017571583157405;8.0398313002661e-05;-8.4209248598199e-05;3.0848568712827e-05;-0.00011430149606895;2.6924002668238e-05;0.00010372933320468;1.5101132703421e-05;0.00031492798007093;-0.00010233825014438;-0.00041629231418483;-0.00016977885388769;0.00023363373475149;-4.8088051698869e-05;0.00025886468938552;-6.4073929024744e-06;-0.00056101760128513;0.00012954586418346;-0.00065983308013529;0.00014951695629861;0.00074773468077183;0.00054796045878902;-0.00029754664865322;-0.00037703767884523;-0.00012197201431263;-0.0011015816126019;6.2328559579328e-05;-0.00032505346462131;-2.3553629944217e-05;0.0014433066826314;1.9065610104008e-05;-8.1194702943321e-06;-6.1454491515178e-05;0.00031088778632693;-9.1675377689171e-07;-4.7632907808293e-05;-0.00011710613034666;0.00021588797972072;0.00014262544573285;0.002337759360671;-0.00011883769911947;-0.0007481919019483;-0.00013604253763333;0.0001656447420828;6.0066678997828e-05;0.00015318977239076;-9.2530186520889e-05;0.00042589037911966;5.3969699365553e-05;0.00041893552406691;0.00025117446784861;0.0006058577564545;0.00090177037054673;2.4864466467989e-05;-0.0012036376865581;-0.00053654762450606;-0.000945262494497;-2.9385124435066e-05;-0.00083904498023912;8.6890315287746e-05;-0.00079719960922375;1.4742045095772e-05;-2.7279857022222e-05;9.7508664111956e-06;-0.0002294044388691;0.00011620441364357;-0.00018620220362209;-0.00049694161862135;0.00034595950273797;-0.00045790994772688;0.0015450995415449;0.00016755376418587;0.00016823408077471;0.00012277081259526;-4.6665099944221e-05;2.9675597033929e-05;0.000494678854011;2.6534407879808e-05;0.00026605377206579;-0.00013363581092563;-0.00011798171908595;0.00023079088714439;-0.00088178645819426;-0.00066325574880466;0.0009144808864221;-0.00097345211543143;0.00045783011591993;0.00059023982612416;0.0001875145098893;-0.001134347752668;3.0099805371719e-05;-0.00048780473298393;-7.0453635999002e-05;-0.00017643971659709;5.114659506944e-05;8.2009115430992e-05;8.7885837274371e-06;-7.8103519626893e-05;9.7236035799142e-05;3.1479146855418e-05;0.00020729617972393;-0.00030306473490782;-6.6234584664926e-05;-0.00077874475391582;-0.00023989645706024;0.00035624322481453;-2.6412595616421e-05;0.00015633479051758;1.5703417375335e-05;-0.00070979312295094;0.0001697778061498;-0.00074215047061443;9.0668982011266e-05;0.00070167431840673;0.00066758884349838;-0.00039131290395744;-9.9553661129903e-05;-0.00034411036176607;-0.00071051705162972;-3.2383271900471e-05;-4.2552470404189e-05;-8.0124016676564e-05;0.0018394330982119;1.9016446458409e-05;4.2501105781412e-05;-7.4112642323598e-05;0.0003153246070724;-1.1125316632388e-05;-2.095261879731e-05;-0.00014563303557225;0.00016716604295652;7.7867785876151e-05;0.0022551845759153;-0.00013989971193951;-0.00050130469026044;-0.00010460917110322;0.00010837220179383;6.7639040935319e-05;9.6216543170158e-05;-0.0001092439488275;0.00046784945880063;3.856563125737e-05;0.00037414365215227;0.00027861294802278;0.00057423039106652;0.0008038129308261;5.5204694945132e-05;-0.0011939838295802;-0.00043527194065973;-0.00098346022423357;7.1502633147702e-08;-0.00070278282510117;0.00011369588901289;-0.00091758748749271;1.3298265912454e-05;-5.0208960601594e-05;1.8720840671449e-05;-0.00019458867609501;0.00011232159886276;-0.00020751873671543;-0.00041610549669713;0.00035891981679015;-0.00046340585686266;0.0019355034455657;4.9850208597491e-05;0.00037993167643435;9.0417815954424e-05;-6.2138205976225e-05;-1.1919313692488e-05;0.00056006974773481;-1.9799530491582e-05;0.00018204856314696;-8.7954089394771e-05;-0.00022164784604684;0.00028838383150287;-0.00029498426010832;-0.00038786063669249;0.00061728741275147;-0.0011476895306259;0.00043706389260478;-0.00031153234886006;0.00024112894607242;-0.0012438045814633;6.8988352722954e-05;-0.00041074983892031;-3.9732731238473e-05;-0.00018560075841378;3.6675755836768e-05;0.00015385271399282;5.2667186537292e-05;7.2867524067988e-06;3.9659960748395e-05;-2.4034163743636e-06;0.00015493604587391;-0.0001752873940859;0.00065346027258784;5.6039163609967e-05;-0.00040128853288479;0.00030594784766436;-9.2144386144355e-05;5.2974123718741e-06;0.00078829267295077;2.2411539248424e-05;0.00094655650900677;-0.00020494333875831;-0.00026559224352241;-0.00088962452718988;-0.00070655666058883;0.00039961605216376;0.00039428751915693;0.00094482203712687;0.00037509217509069;-0.0001226107851835;-2.8851743991254e-05;-0.0019470403203741;8.2117818237748e-05;-2.0180352294119e-05;-1.7874304830912e-05;-0.00042379944352433;6.9706555223092e-05;5.8892070228467e-05;-4.3897536670556e-05;4.0883529436542e-05;-0.00013972711167298;0.0029900004155934;-4.08095511375e-05;9.1957197582815e-05;-0.00024014720111154;-0.00017643018509261;2.6485640773899e-05;-0.000143024357385;5.5535791034345e-05;0.00058344984427094;-0.00014246466162149;0.00076827162411064;-1.2543840057333e-05;0.00040996863390319;0.00089070707326755;0.0007843371713534;-0.001557253417559;-4.6308417950058e-05;-0.0016610936727375;-0.00028686158475466;-0.00041186215821654;6.3753446738701e-05;-0.0018179941689596;0.000190731472685;1.409358537785e-05;2.1329185983632e-05;-0.00030617398442701;3.6195142456563e-05;-0.00030266167595983;0.00011972649372183;0.00067638099426404;-0.00048518629046157;0.0037521575577557;-0.0004736824776046;0.00038543785922229;-5.9516241890378e-05;-0.00012349680764601;8.4565850556828e-05;0.00084294856060296;8.970268027042e-06;0.00049643602687865;-8.220957533922e-05;8.496852387907e-05;-8.3664992416743e-05;0.0004765004850924;0.00015994039131328;-3.7056136079627e-06;-0.0020864156540483;0.00060447346186265;-0.0012018550187349;0.00030924123711884;-0.0022464040666819;0.00026394627639093;-0.0010949374409392;0.00014801765792072;-0.00022155104670674;-3.0114690162009e-05;3.2390034903074e-05;4.9299760576105e-05;0.00013365934137255;-2.5171124434564e-05;-9.1751746367663e-05;6.8760033173021e-05;-0.00076424825238064;4.9988570935966e-06;0.00030014920048416;0.00011944294237765;-0.00027513891109265;0.00024073796521407;-0.00029236034606583;3.1705680157756e-05;0.00072024622932076;4.5322351070354e-05;0.00086291827028617;-0.00017562317952979;-0.00036766609991901;-0.0010670038172975;-0.00067154905991629;0.00084660085849464;0.0003445741313044;0.0015566977672279;0.00017030503659043;0.00032957471557893;-0.00012424286978785;-0.0015601856866851;2.3442058591172e-05;1.9323815649841e-05;-2.0139608750469e-05;-0.00044749325024895;6.4114741689991e-05;-2.710198486966e-06;-2.202759787906e-05;0.00018913236272056;-0.00011950212501688;0.0032871386501938;2.9256303605507e-05;-0.00024241757637355;-0.00023833446903154;-0.00010413487325422;-2.1987669242662e-05;2.3549306206405e-05;4.5386379497359e-05;0.00058019667631015;-0.00013386852515396;0.00080890743993223;1.3065899111098e-05;0.00035821556230076;0.00093655328964815;0.00098691880702972;-0.0016258136602119;-4.6759851102252e-05;-0.0017185879405588;-0.00043241010280326;-0.00084040715591982;3.6235065635992e-05;-0.0016460418701172;0.000173221618752;1.7598926206119e-05;2.6176228857366e-05;-0.00034191185841337;2.5362895030412e-05;-0.00030486413743347;0.00013438802852761;0.00072894059121609;-0.00057319027837366;0.0036210590042174;-0.00054309976985678;0.0003681227681227;5.6351444072789e-05;-0.00015461565635633;0.0001498287456343;0.00086525938240811;3.3448424801463e-05;0.00078240351285785;-5.0439044571249e-05;0.00022370256192517;-0.00015434269153047;0.0004189905594103;-0.00040244133560918;-0.00036565301707014;-0.0019891411066055;0.00091181130846962;-0.00043608894338831;0.00042243249481544;-0.0023830677382648;0.00025208259467036;-0.0014352976577356;0.00013522134395316;-0.00027185553335585;-5.6295320973732e-05;-5.7251876569353e-05;7.3601309850346e-05;0.00017156040121336;-5.1355778850848e-05;-0.00017950174515136;0.00010675257362891;-0.0012005541939288;0.00017043988918886;-3.945897333324e-05;0.00011807963892352;-0.00013567160931416;0.00013803101319354;-0.00040799187263474;5.2201663493179e-05;0.00049060821766034;3.9987295167521e-05;0.00067751976894215;-0.00011213412653888;-0.00032849007402547;-0.0008622232126072;-0.00041163296555169;0.0009090814855881;0.00019041947962251;0.0016026365337893;-9.1657100711018e-05;0.0006539310561493;-0.00017386180115864;-0.001030104001984;-1.2757816875819e-05;6.4839070546441e-05;-1.5653624359402e-05;-0.00038184766890481;4.8808477004059e-05;-5.9476715250639e-05;2.0481829778873e-06;0.00028240526444279;-9.6196075901389e-05;0.0029675357509404;9.617957402952e-05;-0.00055728852748871;-0.00015654515300412;1.515223266324e-05;-7.5132251367904e-05;0.00017541930719744;3.2570813345956e-05;0.00048873503692448;-9.8163327493239e-05;0.00067052565282211;3.2598807592876e-05;0.00027376692742109;0.00080376805271953;0.00095870939549059;-0.0014398063067347;-3.0128143407637e-05;-0.0013736776309088;-0.00051267864182591;-0.0010744063183665;6.739033779013e-06;-0.0011792903533205;0.00011095997615485;1.0778664545796e-05;2.2063357391744e-05;-0.00031072346610017;1.3556831618189e-05;-0.00021729618310928;0.00011166057083756;0.00054448930313811;-0.00054163875756785;0.0022725062444806;-0.00044475396862254;0.00013731326907873;0.00021490411018021;-0.00010081645450555;0.00016261667769868;0.0006182158831507;6.7649481934495e-05;0.00070526933996007;1.5757026631036e-05;0.00020506077271421;-0.00018620018090587;0.00026615895330906;-0.0010111592710018;-0.00071488291723654;-0.001318973605521;0.0010463257785887;0.00076027977047488;0.0003971153346356;-0.0017178870039061;0.00015420126146637;-0.0011693111155182;5.6028333347058e-05;-0.00022554116731044;-8.2179984019604e-05;-8.3535851445049e-05;7.8624572779518e-05;0.0001430904812878;-4.9065696657635e-05;-0.00015948807413224;0.00010312531230738;-0.0010826177895069;0.00021218290203251;-0.00019173276086804;7.8949015005492e-05;-4.6629127609776e-05;6.2436323787551e-05;-0.000349478359567;4.7892583097564e-05;0.00030078727286309;2.4196930098697e-05;0.0004699774144683;-5.830356531078e-05;-0.00024664922966622;-0.00057056930381805;-0.00017331671551801;0.0007287134649232;7.7589269494638e-05;0.0012510392116383;-0.00020207186753396;0.00060416402993724;-0.00015849639021326;-0.00060939014656469;-1.9858049199684e-05;6.8202345573809e-05;-7.7990516729187e-06;-0.00027902552392334;3.2145046134247e-05;-6.318926170934e-05;9.6747398856678e-06;0.00024439123808406;-6.6982836870011e-05;0.0021661440841854;0.00010693322838051;-0.00061207247199491;-7.5313066190574e-05;6.7189401306678e-05;-7.9209625255316e-05;0.00017616062541492;2.3581293135067e-05;0.00032850066781975;-5.6602424592711e-05;0.0004810553509742;2.9614207960549e-05;0.00017896509962156;0.00054650433594361;0.00072609982453287;-0.0010438205208629;-4.8915458137344e-06;-0.0008673713891767;-0.00044245333992876;-0.00088656303705648;-1.2936257007823e-05;-0.00072869879659265;5.6150285672629e-05;1.552319554321e-05;1.2909655197291e-05;-0.00023527134908363;5.9786193560285e-06;-0.00013290764763951;7.8137687523849e-05;0.00034887151559815;-0.00042222248157486;0.001225086976774;-0.00030965937185101;5.669849088008e-06;0.00023730973771308;-6.2800711020827e-05;0.00013909820700064;0.00038047347334214;7.1980321081355e-05;0.00050897215260193;4.1632549255155e-05;0.00014692633703817;-0.00016350852092728;0.00014948881289456;-0.0010857912711799;-0.00072088581509888;-0.00076629151590168;0.00090187246678397;0.0011474071070552;0.00030170643003657;-0.0010675498051569;7.7253171184566e-05;-0.00080322177382186;1.2342666195764e-05;-0.00015668591368012;-7.8163946454879e-05;-6.9777153839823e-05;6.5236388763878e-05;-2.8467295123846e-05;2.6540381441009e-05;0.00011652348621283;-9.7340940556023e-05;0.00054398406064138;-0.00071617355570197;0.00058183528017253;-0.00066142884315923;-0.00011907419684576;0.00013249374751467;0.00013298587873578;-0.00011043145059375;8.3080434706062e-05;-7.2686263592914e-05;-0.00013070128625259;0.00012250346480869;-1.7579814084456e-05;-0.00013328331988305;-6.0430422308855e-05;-1.9342576706549e-05;0.00011688298400259;-0.00166025175713;0.0019515923922881;-0.00032331218244508;0.00030141140450723;5.0742214625643e-06;4.6104793000268e-05;-7.2134098445531e-05;5.810783841298e-05;3.6365556297824e-05;-3.2848052796908e-05;2.0662429960794e-05;5.8697864915302e-06;0.00011870265734615;0.00014692421245854;0.00026648832135834;0.00026330159744248;0.00039317354094237;0.00036188881495036;-3.1816056434764e-05;-2.588347888377e-05;1.8551700122771e-05;-4.4701350816467e-06;7.7230790338945e-05;4.4960910599912e-05;2.0503930500126e-05;2.9801947675878e-05;-0.0002785551478155;0.0011047682492062;-0.00052305782446638;-4.9149519327329e-05;-0.00014349042612594;-0.00057548494078219;-0.00055006332695484;-0.00017884743283503;-0.00015091765089892;-0.00019662086560857;-0.00015447437181138;-1.1016388270946e-05;2.4895012757042e-05;-4.591454853653e-06;-1.9284912923467e-05;1.6696121747373e-05;7.7747552040819e-07;0.00014193866809364;0.00015265861293301;-0.00063622940797359;-0.00059488217812032;-0.00042769176070578;-0.00049457157729194;3.0014844014659e-05;2.5606110284571e-05;-0.00017699948512018;-0.00015516289568041;-6.2533174059354e-05;-7.8882090747356e-05;6.3882762333378e-05;9.724815026857e-05;4.789939703187e-05;0.00097732874564826;-2.0865774786216e-05;-0.00044538016663864;-0.00048731951392256;0.00051441445248201;0.00054068141616881;0.00026541214901954;0.0002546262985561;0.0002302775537828;0.00022986275143921;7.9734862083569e-05;8.4731233073398e-05;-8.0514248111285e-05;-9.2759357357863e-05;-4.2216714064125e-05;4.0397750126431e-05;0.00018600224575493;-0.00017471326282248;0.00083704380085692;-0.0010373004479334;0.00089617329649627;-0.00096379307797179;-0.0001807285589166;0.00019981944933534;0.00019616070494521;-0.00014712380652782;0.00014790806744713;-9.5983981736936e-05;-0.00019011713447981;0.00018429449119139;-2.695644616324e-05;-0.00030353464535438;-0.00015744233678561;-5.381036316976e-05;0.00025065170484595;-0.0023894971236587;0.0029196934774518;-0.00049709971062839;0.00042397642391734;-3.6462581192609e-05;4.7102050302783e-05;-0.00011217391875107;7.8116892836988e-05;5.0149013986811e-05;-4.853528298554e-05;3.2199113775278e-05;8.0484869613429e-06;0.00017821103392635;0.00019798193534371;0.00038318207953125;0.00043798543629237;0.0005913651548326;0.00053700234275311;-5.6000488257268e-05;-5.1724473451031e-05;2.6549898393569e-05;1.0085345820698e-05;0.00010541500523686;5.9816757129738e-05;2.1408868633443e-05;4.8079542466439e-05;-0.00042141057201661;0.0016614351188764;-0.0006838875124231;-7.4284784204792e-05;-0.00016559564392082;-0.00090022973017767;-0.00093425140948966;-0.00025609190925024;-0.00024644131190144;-0.0002777348854579;-0.00022465267102234;-1.7616985132918e-05;3.3744359825505e-05;1.5258025314324e-06;-2.411396962998e-05;1.7431446394767e-05;3.1597000997863e-06;0.00023629829229321;0.00024316785857081;-0.000787366356235;-0.00090484140673652;-0.00051426095888019;-0.00074991828296334;3.4058986784657e-05;4.1817165765679e-05;-0.00024244563246612;-0.00023975846124813;-7.0966532803141e-05;-0.00011372716107871;7.657686364837e-05;0.0001479406200815;8.0198682553601e-05;0.0016622040420771;-2.3285847419174e-05;-0.0007536523626186;-0.00079491944052279;0.0004771814274136;0.00083426828496158;0.00033296254696324;0.00038640372804366;0.00029728174558841;0.00034159980714321;0.00010585051495582;0.00012891707592644;-0.00010833142732736;-0.00014384495443664;-4.001245542895e-05;4.0420469304081e-05;0.00017207171185873;-0.00018487930356059;0.00085992744425312;-0.0010009937686846;0.00091810151934624;-0.00092976400628686;-0.0001781598693924;0.00019549287389964;0.00020342321658973;-0.00013569823931903;0.00016952458827291;-7.4752308137249e-05;-0.00018611938867252;0.00018818619719241;-3.1499141186941e-05;-0.00043855610419996;-0.00023390766000375;-1.225502910529e-05;0.00028635145281442;-0.0023159510456026;0.0029664929024875;-0.00051731092389673;0.00039722886867821;-7.3579678428359e-05;8.7482931121485e-06;-0.00011938211537199;6.9322552008089e-05;4.7411351260962e-05;-4.9882542953128e-05;3.2982316042762e-05;6.3268544181483e-06;0.00019322302250657;0.00018424088193569;0.00035521521931514;0.0004707311745733;0.00059192214393988;0.00052367034368217;-5.4414027545135e-05;-5.2879615395796e-05;1.5016897123132e-05;2.1910964278504e-05;0.00010353694960941;5.7898952945834e-05;1.6040732589317e-05;5.5189593695104e-05;-0.00041884733946063;0.0016655571525916;-0.00067027751356363;-0.00011059866665164;-0.00013671985652763;-0.00086764321895316;-0.0009780356194824;-0.00023765776131768;-0.00026470408192836;-0.00027219043113291;-0.00022350286599249;-1.5194927073026e-05;3.270458910265e-05;2.5500112315058e-06;-2.6051775421365e-05;1.1979230293946e-05;8.4737139331992e-06;0.0002371366135776;0.00023675951524638;-0.00068543822271749;-0.0010052082361653;-0.00043411256046966;-0.00083436333807185;2.7466579922475e-05;5.1392689783825e-05;-0.00022279338736553;-0.00025429020752199;-5.897906885366e-05;-0.00012205862731207;6.2689003243577e-05;0.00016183211118914;7.9372446634807e-05;0.0016330679645762;-3.3415322832298e-05;-0.00075225229375064;-0.00077669013990089;0.00030384166166186;0.0010387102374807;0.00029120876570232;0.00042122567538172;0.00027002234128304;0.00036458886461332;9.553469135426e-05;0.00013666902668774;-9.8053809779231e-05;-0.0001543159596622;-2.4711040168768e-05;2.6575162337394e-05;9.1584719484672e-05;-0.00011605815234361;0.00058920442825183;-0.00065061077475548;0.00062584812985733;-0.00059906725073233;-0.00011460563109722;0.00012455786054488;0.00014674979320262;-8.958932448877e-05;0.00012300803791732;-3.4302054700674e-05;-0.00012433119991329;0.00012932330719195;-2.4302638848894e-05;-0.00037537314346991;-0.00020177225815132;5.2910058002453e-05;0.0001801800535759;-0.0015307997819036;0.0020380951464176;-0.00036121584707871;0.00025310661294498;-6.4120591559913e-05;-2.3485043129767e-05;-8.5727544501424e-05;4.2081792344106e-05;3.1987598049454e-05;-3.5140339605277e-05;2.2151340090204e-05;2.4327769096999e-06;0.00014585717872251;0.00012340756074991;0.00021774972265121;0.00032689410727471;0.00039798914804123;0.00033561879536137;-2.9997727324371e-05;-2.7392139600124e-05;-1.8860486079575e-06;1.734577017487e-05;7.4229777965229e-05;4.1561223042663e-05;9.8897726275027e-06;4.331863601692e-05;-0.00027355260681361;0.0011192174861208;-0.00049497274449095;-0.00011577500845306;-9.5655806944706e-05;-0.00052460673032328;-0.00063279620371759;-0.00014615156396758;-0.00018588060629554;-0.00018725806148723;-0.00015249675197992;-7.1274480433203e-06;2.3190732463263e-05;-2.1344376364141e-06;-2.3170145141194e-05;6.7666128416022e-06;1.0191266483162e-05;0.00014301689225249;0.00014321549679153;-0.00044925982365385;-0.00077796203549951;-0.00027904097805731;-0.0006491006934084;1.8414415535517e-05;4.3098356400151e-05;-0.00014096056111157;-0.0001824205101002;-4.0821360016707e-05;-9.4000897661317e-05;3.7609104765579e-05;0.00012287698336877;4.7381177864736e-05;0.00093074707547203;-4.0756145608611e-05;-0.00044354613055475;-0.00046036287676543;0.0001921968505485;0.00091606855858117;0.00018934343825094;0.00031858292641118;0.00018091683159582;0.00027132549439557;6.0742728237528e-05;9.9248049082235e-05;-6.142097117845e-05;-0.00011208924115635;5.706420779461e-05;-0.00014468176232185;-0.00015622374485247;0.00020269375818316;-0.00035005464451388;0.001617080764845;-0.00014715737779625;0.00040497374720871;-1.455768597225e-05;-3.9003967685858e-05;-5.9412035625428e-05;0.00037004917976446;-6.2061182688922e-05;-0.00010144674160983;2.8946062229807e-05;-0.00031022835173644;0.00029038172215223;0.00068378215655684;0.00021377296070568;-2.3606860850123e-05;-0.00096194026991725;0.00030150765087456;-0.001628435915336;0.00023593545483891;-0.00077174935722724;9.4435723440256e-05;0.00016219570534304;1.171476651507e-05;-0.00010484629456187;-1.7368402041029e-05;0.00021824067516718;3.7877928207308e-06;-5.6780758313835e-05;1.9620518287411e-05;0.00019322661682963;0.00017081086116377;0.0019736671820283;-0.0001053919622791;-0.00068205583374947;-9.8853088275064e-05;9.1259302280378e-05;1.2817306014767e-05;0.00015725294360891;-5.31014338776e-05;0.00024476918042637;4.884912414127e-05;0.00051737221656367;0.00013379532902036;0.00068259960971773;0.00082446489250287;-0.00015552205150016;-0.00088072643848136;-0.00048085101298057;-0.00098940276075155;-5.0254086090717e-05;-0.00076437671668828;5.2689934818773e-05;-0.00060590245993808;2.3025566406432e-05;4.2374482291052e-05;-5.1625702326419e-06;-0.00026400171918795;9.8470423836261e-05;-0.00012819808034692;-0.00052159442566335;0.00031723277061246;-0.00030779704684392;0.0009774740319699;0.00029815585003234;-0.00031704988214187;0.000138336661621;-2.5879035092657e-05;9.6098476205952e-05;0.00032415037276223;8.1139485700987e-05;0.00046171047142707;-0.00017478455265518;0.00026476680068299;0.00011771333811339;-0.001497856574133;-0.00079938559792936;0.0011680007446557;-0.0006780966068618;0.0002754230517894;0.0017542737768963;4.827017619391e-05;-0.00091175513807684;-2.0984283764847e-05;-0.00074532319558784;-0.00010024008952314;-0.00012556514411699;6.5387714130338e-05;-0.00013209447206464;5.3824154747417e-05;-0.00016022007912397;-0.00016423845954705;0.00022913624707144;-0.00032439193455502;0.001863190671429;-0.00019617284124251;0.00033061022986658;-5.6456236052327e-05;-7.4643276093411e-07;-5.7412387832301e-05;0.00040112002170645;-8.8154978584498e-05;-0.00016789126675576;5.9293524827808e-05;-0.00036998762516305;0.00037083751522005;0.00095931475516409;0.00042209378443658;-0.00011907840234926;-0.0011774351587519;0.00020745805522893;-0.0019718534313142;0.00025227334117517;-0.00084038433851674;0.00011179264402017;0.0002880547544919;1.9447081285762e-05;-0.00010115547775058;-2.332111580472e-05;0.00025045344955288;-5.7413194554101e-06;-4.4387335947249e-05;2.7135853088112e-05;0.00018632461433299;0.00014741322956979;0.0023622764274478;-0.00017935567302629;-0.00054396234918386;-7.986858690856e-05;2.3593522200827e-05;1.3048605069343e-05;0.00013992977619637;-8.4593732026406e-05;0.00032308828667738;4.6504115744028e-05;0.00062275526579469;0.00016962260997389;0.00085924513405189;0.00095596013125032;-0.00020664835756179;-0.0010310111101717;-0.00047845061635599;-0.0013779794098809;-3.4679716918617e-05;-0.00081177504034713;0.00010149656009162;-0.00087408319814131;3.2573709177086e-05;3.9971113437787e-05;-1.6602292873813e-07;-0.00029823643853888;0.00012282081297599;-0.00018771800387185;-0.0005840677767992;0.00044712823000737;-0.00040812880615704;0.0018127704970539;0.00024311622837558;-0.00018158041348215;0.00015348347369581;-7.3913703090511e-05;7.8996235970408e-05;0.00048966228496283;4.6392386138905e-05;0.00060243852203712;-0.00018331223691348;0.0003407743643038;0.00020376869360916;-0.0012904827017337;-0.00069934775820002;0.0011969150509685;-0.0010929489508271;0.00032665775506757;0.0012390043120831;0.00011970569175901;-0.0013679801486433;3.0165792850312e-05;-0.0010371539974585;-9.2973896244075e-05;-0.00017344046500511;7.2893279138952e-05;-0.00015364491264336;-4.4842327042716e-06;-6.4179250330199e-05;-4.038610313728e-06;4.7370991524076e-05;9.6063624368981e-05;0.00048871856415644;-0.00011350771819707;-0.00038631184725091;-0.00020228922949173;0.00025001197354868;-7.4922672865796e-06;0.00014136487152427;-4.7135370550677e-05;-0.00046702902182005;0.00014227665087674;-0.00054297322640195;0.00026458298088983;0.0009361895499751;0.00066036090720445;-0.0003710871678777;-0.00059059233171865;-0.00028233716147952;-0.0011588408378884;5.2586197853088e-05;-0.00015766824071761;-8.1261405284749e-06;0.0010914304293692;2.053542266367e-05;6.2721601352678e-06;-4.6831744839437e-05;0.00025716004893184;-3.4066557418555e-05;2.7235781089985e-05;-5.8736899518408e-05;5.4314517910825e-05;-7.7728955147904e-06;0.0020899530500174;-0.00021282977832016;5.4079714573163e-06;8.356402759091e-06;-0.00012663773668464;4.2683226638474e-05;-3.7744026485598e-05;-0.00011815274046967;0.00038689572829753;-2.6980344500771e-06;0.00056815147399902;0.0002513158833608;0.00072844844544306;0.00068586715497077;-0.00010209604079137;-0.0010190891334787;-0.00024111392849591;-0.0013376291608438;2.9567712772405e-05;-0.00039550475776196;0.00016396403952967;-0.0011708695674315;2.1340651073842e-05;1.4540868505719e-05;2.5369055947522e-05;-0.00023847067495808;0.00011537680256879;-0.00024210252740886;-0.00042713576112874;0.00050678261322901;-0.00046070473035797;0.0029216636903584;-6.5450127294753e-05;0.00035030674189329;9.6768664661795e-05;-0.00015028391499072;-1.2579610483954e-05;0.00064423424191773;-8.0692501796875e-05;0.00045247486559674;-8.7949112639762e-05;0.00017736191512085;0.00036449072649702;0.00010733032831922;-1.3161648894311e-05;0.00054381490917876;-0.0016169740119949;0.00029539968818426;-0.00098056555725634;0.00026396592147648;-0.0016830966342241;0.0001551390014356;-0.00098947680089623;-2.0803190636798e-05;-0.00019195268396288;4.6473513066303e-05;-1.8654804080143e-05;-4.3792926589958e-05;4.744237230625e-05;0.00016561127267778;3.9278555050259e-05;7.2832313890103e-05;-0.00016204033454414;0.00047010957496241;4.6750839828746e-05;-0.00029255289700814;0.00023810329730622;0.00015244736277964;-3.6279558116803e-05;0.0005889039603062;4.0535924199503e-05;0.00064439867855981;-0.00015268259448931;-0.0003451150842011;-0.00083234813064337;-0.00059339945437387;0.00051503552822396;0.00034502812195569;0.00077659660018981;0.00037154337042011;-0.00047692464431748;-2.0497422156041e-05;-0.0013000187464058;4.5526503527071e-05;-5.1021761464654e-05;-6.5287749748677e-06;-0.00028798842686228;4.1046394471778e-05;0.00015151186380535;-7.0078014687169e-05;-0.00022281006386038;-4.4123771658633e-05;0.0017679280135781;-6.539023888763e-05;0.00036943043232895;-0.00021343684056774;-0.00027153757400811;0.00010139044024982;-0.00042470058542676;4.781019379152e-05;0.00027201778721064;-9.3330207164399e-05;0.00068174704210833;-3.9919403207023e-05;0.00028038880554959;0.00060651107924059;0.0004452423308976;-0.0008917860686779;-9.5990246336441e-05;-0.0012129836250097;-7.1810514782555e-05;0.00045325740939006;2.9211483706604e-05;-0.0015559849562123;0.00016197357035708;8.9030203525908e-05;1.2765312931151e-05;-0.00022302486468107;2.6690959202824e-05;-0.00026750125107355;9.354944631923e-05;0.00063904287526384;-0.00036661062040366;0.0040341527201235;-0.0003944921772927;0.00040968472603709;-0.00020342072821222;-0.00016958902415354;6.3814681197982e-05;0.00076011480996385;-9.2712034529541e-06;0.00045558402780443;-0.00011752212594729;0.00021948209905531;-3.8404337828979e-05;0.00046516594011337;0.00062350934604183;0.00038242863956839;-0.0021164692007005;0.00033355227787979;-0.0019077257020399;0.000189902697457;-0.0021918120328337;0.00024569153902121;-0.0011719352332875;0.00018950921366923;-0.00016555569891352;-9.499023576609e-07;-1.7125086742453e-05;3.319939787616e-05;1.3616724572785e-05;2.3598349798704e-05;5.7658213336254e-05;8.0944315413944e-05;-0.00056445645168424;-4.9238515202887e-05;0.00023504634737037;9.6429757832084e-05;-0.00018332080799155;0.00017885674606077;1.6226460502367e-05;-1.9250604964327e-05;0.00050663424190134;5.639563096338e-05;0.00050731014925987;-0.00012391549535096;-0.0003869557112921;-0.00090879306662828;-0.00057528028264642;0.00079332961468026;0.00029166767490096;0.0011284786742181;0.00024729580036364;-0.00014756960445084;-7.414636638714e-05;-0.00092205288819969;-2.2893884761288e-06;-3.1326340831583e-05;-8.4460289144772e-06;-0.00027030031196773;3.3853273635032e-05;0.00010373406257713;-5.0020858907374e-05;-0.00011242702021264;-1.3196436157159e-05;0.0017403998645023;-3.2158022804651e-05;0.00018825830193236;-0.00021314622426871;-0.00021392578491941;6.8536784965545e-05;-0.00028788411873393;3.0920142307878e-05;0.00025156588526443;-8.1321195466444e-05;0.00062269245972857;-1.8311689927941e-05;0.00019329543283675;0.00055838830303401;0.0005202823667787;-0.00078516034409404;-8.9217748609371e-05;-0.0011738792527467;-0.00011187942436663;0.00015331163012888;1.2041302397847e-05;-0.0013011876726523;0.00014321687922347;7.6308424468152e-05;1.8320395611227e-05;-0.00021284323884174;1.5286868801923e-05;-0.00025815423578024;9.7902346169576e-05;0.00064287800341845;-0.00036906453897245;0.0037878737784922;-0.00041153890197165;0.00041490572039038;-0.00014990026829764;-0.00018443266162649;9.6156240033451e-05;0.00075575185474008;-6.6681950556813e-06;0.00064416549867019;-9.8988726676907e-05;0.0002995751274284;-6.9737441663165e-05;0.00038588605821133;0.00032897386699915;0.00019256892846897;-0.0019117825431749;0.00044318175059743;-0.0014906518626958;0.00025409265072085;-0.0022178250364959;0.00022919305774849;-0.0013400567695498;0.00017782523354981;-0.00019616649660747;-7.831407856429e-06;-8.051231270656e-05;4.2381445382489e-05;-2.6324174541514e-05;2.1606336304103e-05;0.00020652907551266;-0.00018636621825863;0.00038421436329372;-0.00053454079898074;0.00046445697080344;-0.00051947549218312;-7.4341376603115e-05;8.9716348156799e-05;5.3763560572406e-05;-3.7488851376111e-05;6.9956702645868e-05;-6.5702792198863e-05;-0.00011883464321727;0.00010674908844521;-2.5774053824534e-07;-8.4747189248446e-05;-6.8559085775632e-05;-0.00031670727184974;0.00035548626328819;-0.0011551614152268;0.0014004197437316;-0.00020101614063606;0.00019521283684298;2.3969887479325e-06;4.5667926315218e-05;-4.3458498112159e-05;3.3550186344655e-05;2.5496357920929e-05;-2.2240994439926e-05;2.3731117835268e-05;1.0395064236945e-05;9.6127141659963e-06;4.508509664447e-05;0.0001634998479858;0.00021612353157252;0.00029610231285915;0.00028322770958766;-4.8943264118861e-05;-4.4562119001057e-05;5.1048322347924e-05;2.8896414733026e-05;2.7885149393114e-05;1.388421151205e-05;-9.3748049039277e-06;4.7197077037708e-06;-0.00027478431002237;0.00072892557363957;-0.0001097128551919;0.00022056096349843;0.00010171018220717;-0.00064370693871751;-0.00066010875161737;-0.00014730545808561;-0.00013872266572434;-8.1125806900673e-05;-7.3464267188683e-05;-2.4810382456053e-05;6.9047587203386e-06;2.0778532416443e-05;3.5304256016389e-06;1.1190777513548e-05;-2.4990522433654e-06;0.00016371501260437;0.00016959349159151;-0.00028435030253604;-0.00031206358107738;-0.00014727916277479;-0.00022107668337412;1.4055685824133e-05;2.4135122657754e-05;-0.00011254323180765;-0.00010707556793932;5.6397807384201e-06;-2.835911254806e-05;1.6787953427411e-05;3.5274166293675e-05;3.3911306672962e-05;0.0015707279089838;-3.3245662507397e-06;-0.00058941025054082;-0.00061750982422382;-7.5354953878559e-05;-1.0822372132679e-05;9.9918659543619e-05;0.00013433818821795;0.00011209757940378;0.00014205758634489;3.8979378587101e-05;4.9476537242299e-05;-5.1240702305222e-05;-5.8989735407522e-05;-4.6212786401156e-05;3.8684982428094e-05;0.0003524852800183;-0.00032733305124566;0.00070117978611961;-0.0008773595909588;0.0007962187519297;-0.00086617056513205;-0.00012671430886257;0.00015051802620292;9.1392910690047e-05;-5.2914663683623e-05;0.00013683921133634;-0.00010305825708201;-0.00018828600877896;0.00018118463049177;-4.0558720684203e-06;-0.00022031221305951;-0.0001449401024729;-0.00054296769667417;0.00064219901105389;-0.0018793077906594;0.0023373975418508;-0.00035961560206488;0.00030978958238848;-4.6514593122993e-05;7.2304712375626e-05;-7.582926627947e-05;5.1971583161503e-05;4.0125807572622e-05;-4.0699680539547e-05;3.864105019602e-05;1.6381227396778e-05;2.8212061806698e-05;5.9347086789785e-05;0.00028507391107269;0.00040502776391804;0.00048978184349835;0.00048680137842894;-8.5409024904948e-05;-8.3019956946373e-05;8.4652871009894e-05;6.2892708228901e-05;4.4264685129747e-05;2.3352567950496e-05;-2.2005438950146e-05;2.2031954358681e-06;-0.00045031931949779;0.0012637985637411;-9.9248209153302e-05;0.00031446581124328;0.00018943872419186;-0.0011039967648685;-0.0012181602651253;-0.00024577710428275;-0.0002501874405425;-0.000127914827317;-0.00012211163993925;-4.2336883780081e-05;4.5224287532619e-06;3.9056973037077e-05;1.2572009836731e-05;9.5262448667199e-06;-4.6523455239367e-06;0.00030786346178502;0.00029573778738268;-0.00035264858161099;-0.00050469936104491;-0.0001496201439295;-0.00035790228866972;1.5590210750815e-05;4.448513573152e-05;-0.00017953092174139;-0.00018113714759238;1.4166457731335e-05;-4.728610656457e-05;1.2013668310829e-05;5.5659165809629e-05;8.0204983532894e-05;0.0028043161146343;-1.042242956828e-06;-0.0011001044185832;-0.0010969948489219;-0.00034328948822804;-4.700620775111e-05;0.00013875353033654;0.00022425076167565;0.00015754552441649;0.00023328032693826;6.0343962104525e-05;8.4026440163143e-05;-7.3662064096425e-05;-9.8187672847416e-05;-4.4399377657101e-05;3.8463138480438e-05;0.0003430382348597;-0.00033097626874223;0.00073208747198805;-0.00083895778516307;0.00080406933557242;-0.00084885861724615;-0.00012560276081786;0.00014735008880962;9.7929587354884e-05;-4.4399777834769e-05;0.0001543206453789;-8.6218438809738e-05;-0.0001808324304875;0.00018764582637232;-1.3160552043701e-05;-0.00033139061997645;-0.00018611304403748;-0.00050567783182487;0.00066891848109663;-0.0018304756376892;0.0023685346823186;-0.00038222369039431;0.00028435970307328;-7.728002674412e-05;4.1591611079639e-05;-8.0616046034265e-05;4.6250410377979e-05;3.6130211810814e-05;-4.3506548536243e-05;3.8256566767814e-05;1.5667916159146e-05;4.6125056542223e-05;4.3895477574551e-05;0.00026728207012638;0.00042437243973836;0.00047785395872779;0.00049030344234779;-8.2484802987892e-05;-8.492250344716e-05;7.449046097463e-05;7.203544373624e-05;4.2516239773249e-05;2.2665790311294e-05;-2.1909097995376e-05;3.5586092508311e-06;-0.00044613442150876;0.001267270068638;-9.4747738330625e-05;0.00026586491730995;0.00022533352603205;-0.0010563287651166;-0.0012649644631892;-0.00023255722771864;-0.00026128682657145;-0.00012420149869286;-0.00012222937948536;-3.8517526263604e-05;2.33087939705e-06;3.7397567211883e-05;1.3063804544799e-05;5.0409776122251e-06;-1.091865939884e-07;0.00031484841019846;0.00028112466679886;-0.00028827946516685;-0.00057533103972673;-9.7142699814867e-05;-0.00041999283712357;9.7931751952274e-06;5.2492734539555e-05;-0.00017060509708244;-0.00018684477254283;1.9446388250799e-05;-5.2296581998235e-05;3.2369334803661e-06;6.563683564309e-05;7.9305908002425e-05;0.0027679505292326;-7.4963290899177e-06;-0.0011102452408522;-0.0010606142459437;-0.00044915426406078;9.5755451184232e-05;0.00011774372978834;0.00024445704184473;0.00014013078180142;0.00025033749989234;5.5241049267352e-05;8.7732740212232e-05;-6.6561929997988e-05;-0.00010560121882008;-2.3438567950507e-05;2.1028909031884e-05;0.0001906401157612;-0.00019094535673503;0.00043952459236607;-0.00046826532343403;0.00048066227464005;-0.00048846460413188;-7.2948809247464e-05;8.4001338109374e-05;6.4954889239743e-05;-2.3719179807813e-05;9.9153759947512e-05;-3.786579327425e-05;-0.00010672368080122;0.00011726716911653;-1.3733447303821e-05;-0.00026221870211884;-0.00013761363516096;-0.00025772725348361;0.00039424115675502;-0.0010789252119139;0.0014486236032099;-0.00023919623345137;0.00015301682287827;-5.0412640121067e-05;-6.0475476857391e-06;-5.1678893214557e-05;2.4172015400836e-05;1.9336221157573e-05;-2.669807872735e-05;2.3073453121469e-05;8.8120286818594e-06;3.9378010114888e-05;2.1340976672946e-05;0.00013674859656021;0.0002502876741346;0.0002794929605443;0.00028632456087507;-4.4557989895111e-05;-4.7313264076365e-05;3.4828382922569e-05;4.3682350224117e-05;2.5718194592628e-05;1.2536667782115e-05;-9.9305507319514e-06;7.903334335424e-06;-0.00026638701092452;0.00074011989636347;-0.00010104286775459;0.00013740560098086;0.00015577733574901;-0.00057044957065955;-0.00073691201396286;-0.00012652769510169;-0.00015759452071507;-7.6072945375927e-05;-7.3677918408066e-05;-1.8974355043611e-05;3.7890195017098e-06;1.8410193661111e-05;3.8114385461085e-06;3.8923526517465e-06;4.7780431486899e-06;0.00017398975614924;0.00014608539640903;-0.00018043736054096;-0.00042792066233233;-6.0389742429834e-05;-0.00032410424319096;5.4431889111584e-06;3.6757417547051e-05;-9.8066280770581e-05;-0.00011646698840195;1.3230523109087e-05;-3.5978042433271e-05;1.3283736279845e-06;5.257188968244e-05;3.3010121114785e-05;0.0015070379013196;-1.543795588077e-05;-0.00060354568995535;-0.00055859086569399;-0.00025039279717021;0.00022950586571824;6.7265587858856e-05;0.00016700351261534;8.513274951838e-05;0.00016871075786185;3.0648570827907e-05;5.5616961617488e-05;-3.9076388929971e-05;-7.1602007665206e-05;2.324978413526e-05;-0.00011419239308452;-0.00015133236593101;0.00017575934180059;-0.00020768713147845;0.0017354126321152;-0.00020269013475627;0.00019911759591196;-8.2463026046753e-05;2.262853377033e-05;-2.3568825781695e-05;0.00027836760273203;-0.00010662167915143;-0.00015469228674192;7.0659305492882e-05;-0.00027560730814002;0.00040885683847591;0.0010566856944934;0.00055402109865099;-0.00019409231026657;-0.0012014369713143;2.3511574909207e-05;-0.0018605068325996;0.00020612870866898;-0.00063098565442488;0.0001146011709352;0.00020406376279425;2.0334120563348e-05;-6.3359060732182e-05;-1.6115021935548e-05;0.00019195316417608;-2.6789899493451e-05;1.2524400517577e-05;6.0341855714796e-05;5.8465448091738e-05;4.8425801651319e-05;0.0019837212748826;-0.00023167944164015;-6.2147388234735e-05;1.8762184481602e-06;-0.00012814233195968;4.7423309297301e-06;1.9111400888505e-06;-9.5000643341336e-05;0.00028346208273433;1.6572010281379e-05;0.00059181090909988;0.00014017446665093;0.00081449368735775;0.00076739612268284;-0.00024295871844515;-0.00079451606143266;-0.00025970058050007;-0.0014788933331147;-3.8891539588803e-06;-0.00044743495527655;0.00014110843767412;-0.00099612423218787;3.5313649277668e-05;4.5668730308535e-05;6.8499466578942e-06;-0.00024758180370554;0.00011713496496668;-0.00021919861319475;-0.00047735378029756;0.00051559513667598;-0.00041064483230002;0.0026709949597716;4.9019334255718e-05;6.4381449192297e-05;0.0001258151314687;-0.0001403047790518;2.7419831894804e-05;0.00058945524506271;-3.3256983442698e-05;0.00064358289819211;-0.00013250403571874;0.00041476936894469;0.000279234664049;-0.00045796565245837;-0.0002194282860728;0.00081388914259151;-0.001441681291908;0.0002541450667195;-9.8098054877482e-05;0.00018491079390515;-0.0016801592428237;0.00011509621253936;-0.0012211279245093;-4.6664983528899e-05;-0.00018234780873172;6.0699931054842e-05;-0.00016540776414331;-1.3314032003109e-05;-6.7631903220899e-05;-0.00014269902021624;9.8162905487698e-05;-9.1158057330176e-05;0.0016339421272278;-0.00021432289213408;4.0654824260855e-05;-0.0001410179247614;8.9624263637234e-05;1.0831467079697e-05;0.00015508687647525;-0.00012718718789984;-0.0002554715028964;0.00010456414020155;-0.00032019967329688;0.00051074015209451;0.0013241183478385;0.00074995483737439;-0.00034194486215711;-0.0013231721241027;-0.00017669227963779;-0.0019577711354941;0.0001763301261235;-0.00037584846722893;0.00010808498336701;0.00036571020609699;2.1145706341485e-05;-2.3477879949496e-05;-1.8113762052963e-05;0.00020107167074457;-5.7050016039284e-05;8.1382713688072e-05;7.3005016020034e-05;-7.004733197391e-05;-2.3866376068327e-05;0.001944140298292;-0.00029438774799928;0.00028142097289674;7.4650837632362e-05;-0.00027359882369637;1.6929890989559e-05;-0.0001801172766136;-0.00011495739454404;0.0002779942296911;-1.4729213035025e-05;0.00070067815249786;0.00016146851703525;0.00084789615357295;0.00070851965574548;-0.00026691105449572;-0.00075703946640715;-0.00013454181316774;-0.001668646116741;1.1301332051517e-05;-8.2883991126437e-05;0.00019532730220817;-0.0013080675853416;3.4848286304623e-05;8.0158635682892e-05;1.8084581824951e-05;-0.00026096231886186;0.00013557578495238;-0.00029391201678663;-0.00048780153156258;0.00067697733175009;-0.00052084616618231;0.0040586069226265;-0.000141415730468;0.00034593208692968;0.00013013325224165;-0.00024060790019576;-1.4109067706158e-05;0.00080153538146988;-0.00011949387408094;0.00075637362897396;-0.00011108985927422;0.00052471086382866;0.00042561575537547;0.00024512794334441;0.00019479637558106;0.00062960450304672;-0.0020988043397665;0.00026602527941577;-0.0014436364872381;0.00029552972409874;-0.0022924242075533;0.00022899844043422;-0.0015984970377758;-1.3773495993519e-05;-0.00022433239792008;6.1027083575027e-05;-0.00017582623695489;-3.8286714698188e-05;-1.9215123757022e-05;-7.6122771133669e-05;1.4445736269408e-06;6.5857340814546e-05;0.00094138813437894;-0.00015769830497447;-0.00026154131046496;-0.00021650438429788;0.00023320884793065;2.7790096282843e-05;4.3674852349795e-05;-0.00010085275425809;-0.00037498530582525;0.00014659659063909;-0.00049286801367998;0.00045626467908733;0.0012598416069523;0.00078492017928511;-0.00043483541230671;-0.0010088781127706;-0.00033213663846254;-0.0015694297617301;0.00010004712385125;-7.3938172135968e-05;3.9356054912787e-05;0.00083603395614773;2.0721905457322e-05;2.5751792236406e-06;-3.2650328648742e-05;0.00023022209643386;-7.7400196460076e-05;0.00012050576333422;1.4559532246494e-05;-0.00014716046280228;-6.1449689383153e-05;0.0020289695821702;-0.00029143929714337;0.00041831642738543;0.00010348168143537;-0.00032452927553095;4.674866431742e-05;-0.00028007102082483;-0.00013204662536737;0.0003216490149498;-3.8485588447656e-05;0.00076295563485473;0.00025908471434377;0.00086042319890112;0.00064631877467036;-0.00023242631868925;-0.00090175052173436;-0.00010856624430744;-0.001668966957368;3.0982551834313e-05;0.00011402510426706;0.00021882166038267;-0.0015504311304539;2.4477149054292e-05;8.866838470567e-05;3.3695436286507e-05;-0.000278959836578;0.00013294414384291;-0.00031218613730744;-0.0004875079030171;0.00068236869992688;-0.00053498230408877;0.0043990695849061;-0.00021029027993791;0.00043652654858306;0.00010763559112092;-0.00024471880169585;-2.3274995328393e-05;0.00084065791452304;-0.00015007307229098;0.00060452579054981;-8.5062565631233e-05;0.00043175116297789;0.00052428938215598;0.00061696406919509;0.00038029666757211;0.00048884708667174;-0.0023457875940949;0.00023655152472202;-0.0020039640367031;0.00033667936804704;-0.0023291290272027;0.00025702596758492;-0.0014852045569569;-4.1295352275483e-06;-0.00021383710554801;5.4899075621506e-05;-0.00010088460840052;-0.00010763166937977;7.5912830652669e-05;0.00026975612854585;8.9470653620083e-05;-0.00018529912631493;-0.00011620789882727;0.00022955109307077;5.5208278354257e-05;-0.00014941590779927;0.00015563177294098;0.00033187834196724;-6.7782893893309e-05;0.00049377424875274;5.6080123613356e-05;0.00035511996247806;-9.824142762227e-05;-0.00045657230657525;-0.00085958803538233;-0.00050050194840878;0.00073320680530742;0.00031282400595956;0.00079832092160359;0.00033249304397032;-0.00076258182525635;-3.1860170565778e-05;-0.00069186760811135;1.2513362435129e-06;-9.0462177467998e-05;5.7444913181826e-06;-0.00019535573665053;1.7144691810245e-05;0.00020231146481819;-7.9544428444933e-05;-0.0003799656406045;4.7914050810505e-05;0.00066820799838752;-4.6415014367085e-05;0.0004076455370523;-0.00017609671340324;-0.00029257964342833;0.00013169327576179;-0.00060267158551142;3.7765530578326e-05;-3.85753592127e-05;-3.9429611206288e-05;0.0005655731074512;-4.6623288653791e-05;0.00011404105316615;0.00030174420680851;0.00022426583745982;-0.00026815579622053;-0.00010670321353246;-0.00071967061376199;4.3659445509547e-05;0.0010627129813656;-2.2938555048313e-05;-0.0011362620862201;0.00011843073298223;0.00015301186067518;5.8083555813937e-06;-0.00013974132889416;1.0587414180918e-05;-0.00023593452351633;7.7010416134726e-05;0.00062953704036772;-0.00028128860867582;0.0042562829330564;-0.00037647865246981;0.00049284007400274;-0.00030656240414828;-0.00023403977684211;7.8390527050942e-05;0.00069947924930602;-2.5054690922843e-05;0.00054784858366475;-0.00013907015090808;0.00037018611328676;-2.4723954993533e-05;0.0004121569218114;0.00082320859655738;0.00057464250130579;-0.002071904251352;0.00020233598479535;-0.0023213212843984;0.00018064369214699;-0.002221962204203;0.00023367317044176;-0.001385968294926;0.00022921312483959;-0.00014257649309002;1.9122608136968e-05;-8.584551687818e-05;2.6159279514104e-05;-5.4226809879765e-05;5.6280881835846e-05;0.00014670802920591;0.00013880316691939;-0.00090925622498617;-1.5548492228845e-05;5.4420452215709e-05;0.00012660028005484;-6.3886880525388e-05;0.00011813015589723;0.00021240911155473;-5.5691496527288e-05;0.00040279130917042;8.4371924458537e-05;0.00023678128491156;-8.3333950897213e-05;-0.00052293343469501;-0.0010127163259313;-0.00057682365877554;0.0011007598368451;0.00027106946799904;0.001244799932465;0.00025509961415082;-0.00041950619197451;-8.6926527728792e-05;-0.00035733645199798;-5.5623488151468e-05;-7.2212031227536e-05;5.3727126214653e-07;-0.00017492337792646;1.1382622687961e-05;0.00018471691873856;-6.9420937506948e-05;-0.00032529380405322;9.6705996838864e-05;0.00069426326081157;-4.567722135107e-05;0.00036734822788276;-0.00021796640066896;-0.0002804173855111;0.0001219823534484;-0.00053701904835179;1.7247371943085e-05;-2.6541189072304e-05;-3.6900230043102e-05;0.00054083182476461;-2.8795220714528e-05;1.8334756532568e-05;0.00026879867073148;0.00029690511291847;-0.00012575861182995;-0.00011865519627463;-0.0008222772157751;7.4698225944303e-05;0.00088012969354168;-3.259330696892e-05;-0.0010394395794719;0.00012147529196227;0.00014402918168344;1.6844731362653e-05;-0.00013689133629669;-6.6490531480667e-07;-0.00025360565632582;8.8434833742213e-05;0.00068088289117441;-0.00028128630947322;0.004460206720978;-0.00040535358130001;0.00053342245519161;-0.00030322646489367;-0.00025607089628465;0.00010125738481293;0.00079267757246271;-3.4511540434323e-05;0.00076243065996096;-0.00013682487769984;0.0004585285205394;-4.0976752643473e-05;0.00036698736948892;0.00069417990744114;0.00051180785521865;-0.0020388618577272;0.00026209492352791;-0.002269531134516;0.00024198667961173;-0.0025009193923324;0.00023698731092736;-0.0016207762528211;0.00023510983737651;-0.00018888383056037;2.1160929463804e-05;-0.00014874212502036;3.1414860131918e-05;5.1925294428656e-06;2.2283584257821e-05;-1.4403916793526e-05;0.00015089215594344;-0.0013648266904056;9.6068848506548e-05;-0.00013020601181779;0.00016461149789393;3.8221063732635e-05;4.3614276364679e-05;4.3842457671417e-05;-2.9572602215922e-05;0.0001230900088558;9.0833978902083e-05;2.4895891328924e-05;-4.1429284465266e-05;-0.00042380299419165;-0.00080730771878734;-0.00047186471056193;0.0011161135043949;0.00012293405598029;0.0012747582513839;8.5617473814636e-05;5.956667882856e-05;-0.00011499904212542;0.00014074107457418;-0.00010037849278888;-2.2949379854253e-05;-5.576228886639e-06;-7.5744152127299e-05;-2.1623075951993e-07;0.00012636104656849;-4.3703268602258e-05;-0.00022984585666563;0.00012934664846398;0.00044529023580253;-3.8505550037371e-05;0.00029881499358453;-0.00020486285211518;-0.00020497365039773;8.7011991126928e-05;-0.00033626594813541;-1.1275122233201e-05;-2.1307481802069e-05;-2.3820328351576e-05;0.00034430719097145;-3.6885242025164e-06;-8.0182973761111e-05;0.00016103989037219;0.00025444646598771;0.00011579259444261;-0.00012488508946262;-0.00071689626201987;0.00012015945685562;0.00053509027929977;-2.9515054848162e-05;-0.00065882166381925;9.0113193436991e-05;8.9453606051393e-05;2.4496852347511e-05;-8.07517717476e-05;-1.2422981853888e-05;-0.00017914205091074;6.43879029667e-05;0.00048615760169923;-0.00017312675481662;0.0032224399037659;-0.00026728218654171;0.00036414267378859;-0.00020085753931198;-0.00018444584566168;7.8367032983806e-05;0.00060516753001139;-3.0206801966415e-05;0.00066364713711664;-8.7797445303295e-05;0.00038919053622521;-3.4609329304658e-05;0.0002139419229934;0.00041581966797821;0.00033676804741845;-0.0013552259188145;0.00018636843014974;-0.0015442729927599;0.00017334462609142;-0.0019115426111966;0.00015080759476405;-0.0012673765886575;0.00015629718836863;-0.00015591582632624;1.6812095054775e-05;-0.00015501309826504;2.3155078451964e-05;7.4608551585698e-06;1.3359583135752e-05;-1.9142024029861e-05;0.00010808934894158;-0.0010012969141826;7.6908094342798e-05;-0.00010406455112388;0.00011928089224966;3.4013148251688e-05;2.5829333026195e-05;2.0326231606305e-05;-1.9235400031903e-05;7.0804730057716e-05;6.390215276042e-05;3.7001145756221e-06;-2.6661473384593e-05;-0.00029308375087567;-0.00055028992937878;-0.00032605492742732;0.0007901054341346;7.3817209340632e-05;0.0009042204474099;4.5376411435427e-05;7.2597067628521e-05;-8.3049708337057e-05;0.0001325629564235;-7.3689909186214e-05;-1.3303664673003e-05;-4.0716358853388e-06;-4.7891480789986e-05;-5.1863440830857e-07;8.5584848420694e-05;-2.9031871235929e-05;-0.0001562581746839;9.5878996944521e-05;0.00030239712214097;-2.6075285859406e-05;0.00020636296540033;-0.00014558917609975;-0.00014028699661139;5.8945712225977e-05;-0.00022440761676989;-1.0498093615752e-05;-1.4772517715755e-05;-1.6005284123821e-05;0.00023146490275394;-3.314613081784e-07;-6.6892986069433e-05;0.00010807270882651;0.00018182139319833;0.00010365484195063;-9.0143526904285e-05;-0.00050872360588983;8.7536434875801e-05;0.00035401518107392;-2.1356498109526e-05;-0.00044171488843858;6.1869803175796e-05;5.9731362853199e-05;1.8306849597138e-05;-5.3603314881912e-05;-9.9517856142484e-06;-0.00012119348684791;4.3863808969036e-05;0.00033038246328942;-0.00011398331844248;0.0021972483955324;-0.00017745050718077;0.0002433070767438;-0.00013198172382545;-0.00012508349027485;5.414988117991e-05;0.0004161004035268;-2.0892126485705e-05;0.00046524291974492;-5.7325283705723e-05;0.00027165931533091;-2.467638842063e-05;0.0001387762313243;0.0002705124206841;0.00022238421661314;-0.00090870429994538;0.00012725390843116;-0.0010335613042116;0.00011569343041629;-0.0013167712604627;9.901473094942e-05;-0.00087513698963448;0.00010358340659877;-0.00010837667650776;1.1186357369297e-05;-0.00011105835437775;1.5836332750041e-05;-2.9743281629635e-05;2.0892763131997e-05;0.00031467247754335;-0.00028833298711106;0.00032771495170891;-0.00045670545659959;0.00037643651012331;-0.00041687759221531;-4.6641500375699e-05;6.3016377680469e-05;-6.3235911511583e-06;1.9729299310711e-05;6.3655847043265e-05;-6.7601715272758e-05;-0.00010273338557454;8.6293250205927e-05;1.9747927581193e-05;-2.1661348000634e-05;-6.5292413637508e-05;-0.00066164101008326;0.00062743964372203;-0.00082005729200318;0.0010082384105772;-0.00012781606346834;0.00013293359370437;-8.3257364167366e-06;6.0764828958781e-05;-1.8833630747395e-05;1.2902586604469e-05;1.2340630746621e-05;-8.1921280070674e-06;2.9082368200761e-05;1.6759362551966e-05;-0.00011674628331093;-6.637998012593e-05;-7.3288601925015e-06;0.00010559278598521;0.00021045160247013;0.0002165911719203;-5.5824235460022e-05;-5.6168424634961e-05;7.7593831520062e-05;5.2793890063185e-05;-2.298687104485e-05;-1.9177379726898e-05;-3.7703965062974e-05;-1.647063618293e-05;-0.00026741324109025;0.00027856213273481;0.00013498519547284;0.00053541560191661;0.00037125375820324;-0.00059127679560333;-0.00063915539067239;-8.9896631834563e-05;-0.00010058346379083;3.2872241717996e-05;3.3653707305348e-06;-3.6909848859068e-05;-6.4749301600386e-06;4.3055340938736e-05;2.2122338123154e-05;1.2482793863455e-05;-3.032221002286e-06;0.00015724202967249;0.00016731645155232;-6.9510700996034e-05;-0.00011326754611218;4.5445653086063e-05;-1.5149889804889e-05;-1.645507950343e-06;1.5783874914632e-05;-6.6241089371033e-05;-6.8309054768179e-05;4.5186796342023e-05;1.9664455521706e-06;-2.3014614271233e-05;-1.4795670722378e-05;1.0600846508169e-05;0.0020960934925824;6.1831684433855e-05;-0.00066761771449819;-0.00070360145764425;-0.00054098851978779;-0.0004922307562083;-5.0148532864114e-06;5.0952028686879e-05;5.2488583605736e-05;9.2537549789995e-05;7.9265073509305e-06;2.0854269678239e-05;-2.5238525267923e-05;-2.9050954253762e-05;-5.3014344302937e-05;3.8771297113271e-05;0.00053746980847791;-0.00049309543101117;0.00063112383941188;-0.00076731643639505;0.00065348163479939;-0.00071589654544368;-8.4553408669308e-05;0.00010953710443573;-5.9091976254422e-06;3.6463152355282e-05;0.00012677619815804;-0.00010852423292818;-0.0001595745125087;0.00015013750817161;2.1633813958033e-05;-0.00011474222992547;-0.00012353582133073;-0.0011100230040029;0.0010915107559413;-0.0013759492430836;0.0017293107230216;-0.00025006229407154;0.00021522751194425;-6.4200721681118e-05;0.0001007113896776;-3.461822780082e-05;2.0286659491831e-05;1.7240574379684e-05;-1.8666376490728e-05;4.794535561814e-05;2.7776006390923e-05;-0.00017770167323761;-0.00012448805500753;1.1257630831096e-05;0.00020830194989685;0.00034711192711256;0.00038912892341614;-9.4594288384542e-05;-0.00010073533485411;0.00012890821381006;9.9664852314163e-05;-3.6235825973563e-05;-3.0094122848823e-05;-6.3982683059294e-05;-3.5354969440959e-05;-0.0004428718239069;0.00052515213610604;0.00027005886659026;0.0008253482519649;0.00064306397689506;-0.00099961017258465;-0.0011725628282875;-0.00015600699407514;-0.00018257347983308;5.2527742809616e-05;3.4138442970288e-06;-6.1845712480135e-05;-1.7360127458232e-05;7.2874710895121e-05;4.3483705667313e-05;1.1373531378922e-05;-5.4053334679338e-06;0.00030761116067879;0.00028643012046814;-3.2037467462942e-05;-0.00018068173085339;0.00013923681399319;-2.1217570974841e-05;-9.9700910141109e-06;2.893546843552e-05;-0.00011416851339163;-0.00011587191693252;7.0847614551894e-05;-1.1597939675312e-07;-4.8463640268892e-05;-2.6513735065237e-05;4.5773813326377e-05;0.0036802270915359;0.00011458221706562;-0.0012552636908367;-0.0012311327736825;-0.0010593963088468;-0.0008577472763136;-1.359836460324e-05;8.846174023347e-05;7.1559705247637e-05;0.00015674550377298;1.4921125512046e-05;3.6715133319376e-05;-3.3616874134168e-05;-4.8219615564449e-05;-5.0802835176e-05;3.8426816900028e-05;0.00053063681116328;-0.00048967433394864;0.00066691887332126;-0.00072609446942806;0.0006517504225485;-0.00070737669011578;-8.4267056081444e-05;0.00010680722334655;-6.6636414430832e-07;4.2257215682184e-05;0.00014316232409328;-9.2992755526211e-05;-0.00014848313003313;0.00015875148528721;3.8471221159853e-06;-0.00022282529971562;-0.00014534500951413;-0.0010669468902051;0.0011158317793161;-0.0013351637171581;0.0017519609536976;-0.00027509842766449;0.00018896913388744;-9.3926275440026e-05;7.2737399023026e-05;-3.7748985050712e-05;1.6685000446159e-05;1.167748359876e-05;-2.3007778509054e-05;4.6493121772073e-05;2.7417812816566e-05;-0.00015610085392836;-0.00014161290891934;7.7120403148001e-06;0.00021466164616868;0.00032685132464394;0.00040240772068501;-9.083285840461e-05;-0.00010284614836564;0.00011989920312772;0.00010675876546884;-3.652143641375e-05;-3.1102394132176e-05;-5.8996283769375e-05;-3.855919567286e-05;-0.0004345380293671;0.00053045438835397;0.00026911438908428;0.00075753452256322;0.00068548863055184;-0.00094200763851404;-0.0012202681973577;-0.00014792621368542;-0.00018744170665741;5.1356142648729e-05;5.0970002121176e-06;-5.7149132771883e-05;-2.0046882127644e-05;6.8824279878754e-05;4.5878783566877e-05;6.4493833633605e-06;-3.8603420193795e-07;0.00032244974863715;0.00025995424948633;1.4263235243561e-05;-0.0002394695620751;0.00017404099344276;-6.9599613198079e-05;-1.5078802789503e-05;3.6004923458677e-05;-0.0001122977482737;-0.00011504053691169;7.2059083322529e-05;-3.5841082990373e-06;-5.3182578994893e-05;-1.9864974092343e-05;4.5072520151734e-05;0.0036276914179325;0.00010916846804321;-0.0012801236007363;-0.0011674669804052;-0.0011200341396034;-0.00074858183506876;-2.2640595489065e-05;0.00010128503345186;5.8304111007601e-05;0.00017184183525387;1.3536471669795e-05;3.7180645449553e-05;-2.8837550416938e-05;-5.3113592002774e-05;-2.5496805392322e-05;1.9405779312365e-05;0.00029892384191044;-0.00027645617956296;0.00038450842839666;-0.00037910844548605;0.00037135893944651;-0.0003954803396482;-4.603333218256e-05;5.7151741202688e-05;2.6285329113307e-06;2.8274007490836e-05;8.9443681645207e-05;-4.1603430872783e-05;-8.3906095824204e-05;9.9597222288139e-05;-7.6871001510881e-06;-0.00018828974862117;-9.9357828730717e-05;-0.00058621482457966;0.00065154302865267;-0.00075079494854435;0.0010291546350345;-0.00016717839753255;8.8176449935418e-05;-5.6745026085991e-05;1.2357542800601e-05;-2.3988433895283e-05;7.2552229539724e-06;3.4245331335114e-06;-1.4862704119878e-05;2.6281122700311e-05;1.5439109120052e-05;-8.0151927249972e-05;-9.0949666628148e-05;-1.0890387784457e-05;0.00011577050463529;0.00017755746375769;0.00023324764333665;-4.9318310630042e-05;-5.8581750636222e-05;6.2675040680915e-05;6.2823950429447e-05;-2.2726098904968e-05;-2.0983459762647e-05;-2.9329215976759e-05;-2.0087234588573e-05;-0.00024841231061146;0.00028871587710455;0.00012968400551472;0.00041624534060247;0.00042996733100154;-0.00049390603089705;-0.00070636515738443;-7.6673306466546e-05;-0.00010724429739639;2.9427741537802e-05;5.7339120758115e-06;-2.9100672691129e-05;-9.7886404546443e-06;3.6061632272322e-05;2.4877812393242e-05;5.0438220569049e-06;5.1080442062812e-06;0.00017545623995829;0.00012068566138623;-3.3753769912437e-06;-0.00020965035946574;9.7332922450732e-05;-9.6818701422308e-05;-8.5715810200782e-06;2.6650250219973e-05;-6.3143044826575e-05;-6.5665575675666e-05;4.5448956370819e-05;-2.5156261926895e-06;-3.0851915653329e-05;-2.2644344426226e-06;7.9624496720498e-06;0.0019676822703332;4.9548889364814e-05;-0.00068862410262227;-0.00058516638819128;-0.00062138825887814;-0.00029771382105537;-1.5740679373266e-05;7.0159512688406e-05;3.3712898584781e-05;0.00011474151688162;5.6856702030927e-06;2.1134428607184e-05;-1.7266685972572e-05;-3.7597015762003e-05;-5.8236757467967e-05;2.4342429242097e-05;-0.00013536810001824;-6.0309350374155e-05;-1.929295649461e-05;0.0012377189705148;-0.00017190542712342;1.8678611013456e-05;-0.00011842181993416;5.8337351219961e-05;5.7331053540111e-05;-8.1880447396543e-05;-0.00011569376511034;-0.00028450787067413;8.2563085015863e-05;-0.00019777660781983;0.00053765677148476;0.0012235130416229;0.00066661654273048;-0.00035062737879343;-0.0012086217757314;-0.00024417790700682;-0.0015988860977814;0.00012039490684401;0.00010697293328121;9.4997594715096e-05;0.00023652281379327;6.0871552705066e-06;3.810326961684e-05;-6.4571622715448e-06;0.00014232705871109;-7.3345530836377e-05;0.00014744470536243;0.00012342289846856;-0.00022457419254351;-4.1551102185622e-05;0.00093736621784046;-0.00024614023277536;0.00039817474316806;0.0001142773180618;-0.00030278018675745;2.1225545424386e-05;-0.00039984544855542;-6.7335815401748e-05;5.3835730795981e-05;-3.2948752050288e-05;0.00058020430151373;3.0796480132267e-05;0.00047959364019334;0.00042021370609291;-0.00020301029144321;-0.00023265251365956;1.4762418686587e-05;-0.0011138642439619;-2.9097554943291e-05;0.00054514239309356;0.00015941449964885;-0.0010461247293279;2.1537394786719e-05;0.00013920229685027;1.1482295121823e-05;-0.0001848259853432;0.00011454574996606;-0.00026931171305478;-0.0003532309201546;0.00062581960810348;-0.00048510657506995;0.0042958664707839;-0.00028499349718913;0.00048194755800068;0.00011635951523203;-0.00028487740200944;-4.651853669202e-05;0.00076800043461844;-0.00015223807713483;0.00068035308504477;-6.8991612351965e-05;0.00053455581655726;0.00039614483830519;0.00066754344152287;0.00050180405378342;0.00035159467370249;-0.0020519385579973;0.00024488565395586;-0.0021973452530801;0.00029304172494449;-0.0022695281077176;0.00027174546266906;-0.0015845019370317;1.7423999452149e-05;-0.0001957598287845;4.2990581277991e-05;-0.00016028103709687;-6.6114094806835e-05;3.6262059438741e-05;-0.00010558592475718;-8.5815889178775e-05;5.4117765103001e-05;0.00095610035350546;-0.00014849570288789;-0.00013223251153249;-0.0001694062812021;0.0001499968348071;5.9824538766406e-05;-9.6606847364455e-05;-0.00010880830814131;-0.00032490701414645;0.00011224217450945;-0.00032731791725382;0.00051853439072147;0.0012373338686302;0.00070590700488538;-0.00041310145752504;-0.0010798014700413;-0.00032206409377977;-0.001483850646764;9.5129704277497e-05;0.00016824073099997;6.0140075220261e-05;0.00051292439457029;9.4487240858143e-06;3.4157583286287e-05;-1.5332901966758e-05;0.00016908090037759;-9.011881047627e-05;0.00016852312546689;7.6511831139214e-05;-0.00027181711629964;-5.8239926147508e-05;0.0012450508074835;-0.00025917516904883;0.00049688207218423;0.00013466454402078;-0.00035292367101647;4.4004056690028e-05;-0.00043347978498787;-9.0690322394948e-05;0.00012130008690292;-4.9154536100104e-05;0.00068000389728695;0.00014787529653404;0.00060972047504038;0.00044617190724239;-0.00022339027782436;-0.00046299278619699;-2.8071885935788e-06;-0.0012846513418481;-7.390870450763e-06;0.00057807069970295;0.00018628856923897;-0.0013088587438688;1.6315261746058e-05;0.00013977829075884;2.5148485292448e-05;-0.00022061888012104;0.00011966663441854;-0.00029668817296624;-0.00040621066000313;0.0006699341465719;-0.00051206059288234;0.0046206396073103;-0.00030351214809343;0.00051540415734053;0.00010856125300052;-0.00029125733999535;-4.0885894122766e-05;0.00081978860544041;-0.00017471009050496;0.00062593299662694;-6.6586151660886e-05;0.00051304145017639;0.00050144182750955;0.00087384530343115;0.00058383983559906;0.0003303014091216;-0.00234389398247;0.00020989420590922;-0.0024655535817146;0.00033173002884723;-0.0023625979665667;0.00029334338614717;-0.0015884113963693;1.5895055184956e-05;-0.00019855200662278;4.758906288771e-05;-0.00012992920528632;-0.00013376148126554;8.2240971096326e-05;0.00032117764931172;9.3074195319787e-05;-0.00014506989100482;-8.8125991169363e-05;8.1812737334985e-05;3.5800840123557e-05;-4.8862886615098e-05;8.4576626250055e-05;0.00040602160152048;-7.6153235568199e-05;0.00043080025352538;4.5305318053579e-05;0.00015688242274337;-5.1897099183407e-05;-0.00043882554746233;-0.00071307417238131;-0.00034616960329004;0.00067024485906586;0.0002561463334132;0.00060357700567693;0.00026593185612001;-0.00091098551638424;-2.1986501451465e-05;-0.00032435046159662;-1.1561775863811e-05;-0.00011106611054856;1.4675578313472e-05;-0.00013003378990106;3.655783530121e-06;0.00018383278802503;-6.5045976953115e-05;-0.00036908042966388;8.4800172771793e-05;-0.00010254253720632;-1.698645974102e-05;0.00028303769067861;-0.00010761815065052;-0.00022515562886838;0.00011138266563648;-0.00058553263079375;2.6409392376081e-05;-0.00021857646061108;1.7165799590657e-06;0.00038103846600279;-3.8727157516405e-05;-1.3170634701964e-05;5.0166545406682e-05;6.8469293182716e-05;0.00012132578558521;-6.6701890318654e-05;-0.0002374935138505;6.9357098254841e-05;0.0011977528920397;-5.3947129345033e-05;-0.00064039521384984;6.5267129684798e-05;0.00016160000814125;-4.3535482063817e-07;-6.3464074628428e-05;-1.2833004348067e-06;-0.00016626916476525;5.2812636567978e-05;0.00049859215505421;-0.00018206967797596;0.0035237888805568;-0.00031138840131462;0.00045430022873916;-0.00030438785324804;-0.00022642328985967;7.7687203884125e-05;0.00051149562932551;-2.8201917302795e-05;0.00048368988791481;-0.00011939103569603;0.00036835207720287;-1.5706282283645e-05;0.00028521110652946;0.00070504716131836;0.00053573551122099;-0.0016100074863061;0.00012437869736459;-0.0020525720901787;0.00017879105871543;-0.0017860529478639;0.00018077406275552;-0.0012290438171476;0.00020716778817587;-9.7472104243934e-05;2.4590342945885e-05;-9.9970508017577e-05;1.6542015146115e-05;-7.4264695285819e-05;5.8592748246156e-05;0.0001622215640964;0.00012632562720682;-0.00080089044058695;4.5361889533524e-06;-6.10191746091e-05;0.00010331554949516;2.4696926629986e-05;5.0804374041036e-05;0.00027515841065906;-5.9031637647422e-05;0.00031622496317141;7.0849571784493e-05;4.6564644435421e-05;-3.8166559534147e-05;-0.00046039861626923;-0.00083642214303836;-0.00042101027793251;0.00098051794338971;0.00020495287026279;0.00099096912890673;0.00019913037249353;-0.00052019936265424;-6.8482775532175e-05;-2.3739763491903e-05;-6.5841566538438e-05;-9.0302361059003e-05;6.9129546318436e-06;-0.00010082672088174;-1.1777742656705e-06;0.00016359440633096;-5.2462481107796e-05;-0.00029253034153953;0.00012478193093557;-0.0001210272530443;-3.0668641556986e-05;0.0002397284260951;-0.00014225556515157;-0.00019649618479889;9.7532574727666e-05;-0.00051632383838296;5.5408854677808e-06;-0.00017870977171697;4.4331009121379e-06;0.00032603720319457;-2.0981000488973e-05;-0.00012036559201078;-3.503706830088e-05;0.00010527169069974;0.00028072416898794;-4.8520883865422e-05;-0.00027409923495725;0.00012452692317311;0.00098164309747517;-5.8602599892765e-05;-0.00051765708485618;6.6299879108556e-05;0.00014835722686257;9.8837526820716e-06;-6.1051912780385e-05;-1.1565788554435e-05;-0.00018224226369057;6.4274237956852e-05;0.000518866290804;-0.00016152138414327;0.0035940248053521;-0.00033215485746041;0.00048666339716874;-0.00031461179605685;-0.00023301166947931;9.1120469733141e-05;0.00061219220515341;-4.4892203732161e-05;0.00066512438934296;-0.00011663699115161;0.00041164801223204;-2.0208079149597e-05;0.00021930999355391;0.00056190707255155;0.00048460109974258;-0.0014696796424687;0.00015489864745177;-0.0020027332939208;0.00025807018391788;-0.002022972330451;0.00018230493878946;-0.0013662963174284;0.00020789852715097;-0.00014727031521033;3.1076204322744e-05;-0.0001463106891606;1.6561192751396e-05;-3.6827939766226e-05;2.2788241039962e-05;0.00043930724496022;-0.00040539875044487;0.00035517939249985;-0.00045862194383517;0.0003072454710491;-0.00033486355096102;-2.9843702577637e-05;4.6470257075271e-05;-5.4954198276391e-05;6.8605688284151e-05;6.4641797507647e-05;-7.6703654485755e-05;-7.9905221355148e-05;5.8650002756622e-05;4.4318090658635e-05;5.1700859330595e-05;-5.8028399507748e-05;-0.0010692555224523;0.00094828492728993;-0.00058494979748502;0.00070900557329878;-8.7143293058034e-05;9.9455748568289e-05;-3.5205193853471e-05;9.2796035460196e-05;3.3631120004429e-06;-6.0865277191624e-06;-3.8163129829627e-06;9.7915899459622e-06;3.4254884667462e-05;2.3483777113142e-05;-0.00026471714954823;-0.00019532749138307;-0.00022648078447673;-4.8980386054609e-05;0.00012722611427307;0.0001502999512013;-5.5394706578227e-05;-6.2472121499013e-05;0.00010391564137535;7.3351911851205e-05;-7.7461496402975e-05;-5.6505323300371e-05;-6.603189103771e-05;-3.4965407394338e-05;-0.00023416339536197;-0.00024210535048041;0.00027442077407613;0.00087899679783732;0.00065656087826937;-0.0004501573566813;-0.00052148272516206;-1.1787810763053e-05;-4.1358020098414e-05;0.00014963919238653;8.0823207099456e-05;-4.888248804491e-05;-1.7404119716957e-05;6.421611760743e-05;3.848874985124e-05;1.9251547200838e-05;-5.9745565295088e-07;0.00011611462832661;0.00013950305583421;4.3202293454669e-05;1.4094621292315e-05;0.00018635843298398;0.00014692333934363;-1.6225010767812e-05;4.2729384404083e-06;-2.8241396648809e-05;-3.427108458709e-05;6.4113199186977e-05;1.6752414012444e-05;-6.2873717979528e-05;-6.0568276239792e-05;-1.8863000150304e-05;0.0025523067452013;0.00015166385855991;-0.00067434384254739;-0.00073902314761654;-0.00092585978563875;-0.00091476464876905;-6.5201602410525e-05;-8.6133798049559e-07;3.6313154851086e-05;7.3376148066018e-05;-1.930612961587e-05;-4.912217718811e-06;1.3785315786663e-06;2.8762224246748e-07;-5.8060686569661e-05;3.7383986636996e-05;0.00070688634878024;-0.00064410862978548;0.00063748884713277;-0.00071550789289176;0.00048791794688441;-0.00053320481674746;-5.1950464694528e-05;7.5091913458891e-05;-8.4744140622206e-05;0.00011163327872055;0.00012410405906849;-0.00011418383655837;-0.00010783787729451;9.7032585472334e-05;4.7605582949473e-05;-8.0320960478275e-06;-9.9155615316704e-05;-0.0016934765735641;0.0015556919388473;-0.00090727122733369;0.0011421173112467;-0.0001747749192873;0.00014265612117015;-0.00010200139513472;0.00013775555999018;4.0727686609898e-06;-1.097907897929e-05;-1.4972939425206e-05;1.2824018085666e-05;5.2111296099611e-05;3.6662109778263e-05;-0.00040742996498011;-0.00033303562668152;-0.00034986255923286;-8.3621511294041e-05;0.00017872240277939;0.00025485877995379;-8.5320025391411e-05;-0.00010257616668241;0.00016326601326;0.00012394296936691;-0.00012361504195724;-9.3325274065137e-05;-9.8422315204516e-05;-6.2478218751494e-05;-0.00034661981044337;-0.00038632622454315;0.00044124890700914;0.001319887698628;0.0010849181562662;-0.00066048500593752;-0.000870690215379;-1.5125333447941e-05;-6.336498336168e-05;0.00023427697306033;0.00013445090735331;-7.5278388976585e-05;-3.1319839763455e-05;9.8586409876589e-05;6.596388266189e-05;2.3466589482268e-05;2.8591332466021e-06;0.00020940434478689;0.0001898918999359;0.00011315250594635;-7.9611863839091e-06;0.00032953571644612;0.00021859353000764;-3.1814539397601e-05;9.2682585091097e-06;-4.9163551011588e-05;-4.8582562158117e-05;9.5890994998626e-05;2.2967196855461e-05;-0.0001048717458616;-9.6729105280247e-05;-1.7769445548765e-05;0.0040702405385673;0.00024944357573986;-0.00114105863031;-0.0011207113275304;-0.0015389511827379;-0.0014291385887191;-9.8989250545856e-05;6.2374001572607e-06;4.8662743211025e-05;0.00012707355199382;-2.9443686798913e-05;-1.0694810043788e-05;8.1840726124938e-06;1.0074269312099e-06;-5.4831369197927e-05;3.6902110878145e-05;0.00070272805169225;-0.00063191750086844;0.00067423918517306;-0.00067206815583631;0.00047717749839649;-0.00052719470113516;-5.1874198106816e-05;7.226499292301e-05;-8.1914600741584e-05;0.0001144075213233;0.00014076523075346;-9.8182295914739e-05;-9.272746683564e-05;0.00010671195195755;1.6503829101566e-05;-0.00012459636491258;-0.00011049060412915;-0.0016390680102631;0.0015832707285881;-0.00086142454529181;0.001156774465926;-0.00020151831267867;0.00011411531886552;-0.00013281845895108;0.00011048509622924;2.594853640403e-06;-1.2918997526867e-05;-2.2537371478393e-05;7.142095000745e-06;4.9863330787048e-05;3.5990924516227e-05;-0.00038431043503806;-0.00035146743175574;-0.00033910962520167;-9.31754038902e-05;0.00015204753435683;0.00027145692729391;-8.1055928603746e-05;-0.00010385818313807;0.00015540233289357;0.00012892484664917;-0.00012224454258103;-9.5764320576563e-05;-8.8730368588585e-05;-6.9562898715958e-05;-0.00033079300192185;-0.00038457452319562;0.00043477531289682;0.0012318830704316;0.0011332051362842;-0.00059220724506304;-0.00091045582666993;-1.0274135092914e-05;-6.1588107200805e-05;0.00022671633632854;0.00014076518709771;-7.0097572461236e-05;-3.3857264497783e-05;9.2389447672758e-05;6.9706416979898e-05;1.737178354233e-05;9.329025488114e-06;0.00023190658248495;0.00014672969700769;0.00015246833208948;-6.7843146098312e-05;0.00035117982770316;0.00017914503405336;-3.639560600277e-05;1.570431413711e-05;-5.1759125199169e-05;-4.2110656067962e-05;9.4643655756954e-05;1.9540470020729e-05;-0.00010565514821792;-9.3730675871484e-05;-1.8865841411753e-05;0.0039878766983747;0.00024417109671049;-0.0011794220190495;-0.0010171466274187;-0.0015638986369595;-0.001336537534371;-0.00010139564255951;1.6650161342113e-05;3.6028184695169e-05;0.00014361800276674;-2.8145188480266e-05;-1.3298305930221e-05;1.1032811016776e-05;-1.1914485185116e-06;-2.7651763957692e-05;1.8501466911403e-05;0.00040650035953149;-0.00035968379233964;0.00039282543002628;-0.00034973779111169;0.00026873519527726;-0.00029746620566584;-2.7138605219079e-05;3.7167756090639e-05;-4.7484067181358e-05;6.9978770625312e-05;8.876170613803e-05;-4.5809785660822e-05;-5.0617807573872e-05;7.137430657167e-05;-6.5334588725818e-06;-0.00013276854588185;-7.267776527442e-05;-0.00093146198196337;0.00093968398869038;-0.00047318442375399;0.00067804579157382;-0.00012433297524694;4.3141913920408e-05;-8.1455385952722e-05;3.7346115277614e-05;5.4068300414656e-07;-8.8295828390983e-06;-1.7117179595516e-05;1.3476533240464e-06;2.7771060558734e-05;2.0218536519678e-05;-0.00021526192722376;-0.00021618025493808;-0.00020347807731014;-6.7955304984935e-05;7.3905233875848e-05;0.00016341303125955;-4.5068652980262e-05;-6.0759433836211e-05;8.6290325270966e-05;7.6426615123637e-05;-7.3328614234924e-05;-6.0086702433182e-05;-4.5842349209124e-05;-4.2202522308799e-05;-0.00018460233695805;-0.00024001477868296;0.00024190056137741;0.00068882334744558;0.0006993911229074;-0.00030240800697356;-0.00054383766837418;-3.6954695303848e-08;-3.2411553547718e-05;0.00013131651212461;8.8617591245566e-05;-3.7302757846192e-05;-1.8655171516002e-05;5.027088263887e-05;4.1088293073699e-05;1.0708919035096e-05;1.1210992852284e-05;0.00012975686695427;4.8435205826536e-05;8.1456484622322e-05;-0.00010091697913595;0.00020260209566914;6.3267696532421e-05;-2.0951451006113e-05;1.5075290320965e-05;-2.9818720577168e-05;-1.9397963114898e-05;5.9126770793227e-05;1.2401817002683e-05;-6.129767280072e-05;-4.9998710892396e-05;-2.864690941351e-05;0.0022117088083178;0.00012887550110463;-0.00065274449298158;-0.00049076729919761;-0.00088540458818898;-0.00067833240609616;-6.1322629335336e-05;1.6200303434744e-05;1.9133391106152e-05;9.7660122264642e-05;-1.7839905922301e-05;-1.0624306924001e-05;5.5020418585627e-06;-5.0582229960128e-06;-7.1951020800043e-05;5.8413192164153e-05;-0.0001573323388584;-0.00011311108391965;-6.0605099861277e-05;0.0013117456110194;-0.00017357006436214;0.00017516780644655;-4.3254964111838e-05;-7.1221635153051e-05;7.7742530265823e-05;-0.00020054889318999;-0.00011296594311716;-0.00028052015113644;3.4054384741466e-05;2.3038412109599e-05;0.00056242605205625;0.001155914622359;0.00057566486066207;-0.00028492664569058;-0.0012848074547946;-0.00019914667063858;-0.0015207136748359;0.0001131694734795;0.00032558347447775;0.00012729840818793;-0.00013609020970762;-6.3805650825088e-06;8.3701321273111e-05;9.1561023509712e-06;8.4070139564574e-05;-5.3705967729911e-05;0.0001453681034036;0.00020106417650823;-0.00020389693963807;-3.8144051359268e-05;-1.6018977476051e-05;-0.00019499525660649;0.00029751367401332;0.00010210571053904;-0.00023454887559637;-7.4535169005685e-06;-0.00046775053488091;-1.090021305572e-05;-0.00013894008588977;-2.1233374354779e-05;0.00036914917291142;-0.00020803073130082;7.8738754382357e-05;0.00022205473214854;-0.00010376338468632;0.00033222784986719;0.00011457675282145;-0.00053391756955534;-7.6828771852888e-05;0.00080150086432695;0.00010453175491421;-0.00053934491006657;2.1003465008107e-05;0.00016824535850901;-9.6561761893099e-06;-9.8951022664551e-05;9.957355359802e-05;-0.00022214448836166;-0.00020494738419075;0.00054633268155158;-0.00045042918645777;0.0039985091425478;-0.00035287259379402;0.0005419707740657;0.00012204708036734;-0.00030386666185223;-7.8941106039565e-05;0.00068600423401222;-0.00014362104411703;0.00071843183832243;-4.7953799366951e-05;0.00055222510127351;0.00022378012363333;0.00061248225392774;0.00055773957865313;0.00023469836742152;-0.0016140043735504;0.0003137817257084;-0.0022912074346095;0.00024905437021516;-0.0021518224384636;0.00027333322213963;-0.0015665421960875;3.9784765249351e-05;-0.0001796080468921;2.5867364456644e-05;-0.00018765529966913;-5.5617900216021e-05;4.0644783439348e-05;-0.00010203658166574;-8.6116226157174e-05;1.8116381852451e-06;0.0008562901057303;-0.00011969843035331;2.7445563318906e-05;-7.6388125307858e-05;2.1378893507062e-05;5.6228891480714e-05;-0.00012361459084786;-8.4208688349463e-05;-0.00023595192760695;5.2517883887049e-05;-0.00010111660958501;0.00041957304347306;0.00091278384206817;0.00048023590352386;-0.00026994943618774;-0.00090219819685444;-0.00020271813264117;-0.0011321062920615;7.7284443250392e-05;0.00021214732259978;7.1231632318813e-05;0.00011977187386947;-5.6178879503932e-07;4.9873768148245e-05;-7.0909743499215e-07;9.3772454420105e-05;-5.7262306654593e-05;0.0001251745125046;0.00010868375102291;-0.00019644389976747;-3.210075374227e-05;0.00039691690471955;-0.00016705472080503;0.00030128474463709;9.2489979579113e-05;-0.00022506427194458;1.5930037989165e-05;-0.00035591894993559;-3.3934298699023e-05;-2.7509109713719e-05;-2.7966352718067e-05;0.00039290005224757;-2.6144422008656e-05;0.00023884473193903;0.00023538497043774;-0.00012488242646214;-1.5424519006046e-05;4.7029308916535e-05;-0.00064711971208453;-3.7085355870659e-05;0.00056537718046457;0.00010582021786831;-0.00067571934778243;1.2345036338957e-05;0.00012225117825437;5.3441463023773e-06;-0.00011614632967394;8.4088700532448e-05;-0.00020138944091741;-0.00023213872918859;0.0004755596164614;-0.00037254361086525;0.0033402487169951;-0.00026062328834087;0.00042654722346924;9.0178895334247e-05;-0.00023660584702156;-4.7993999032769e-05;0.00058232608716935;-0.00012791907647625;0.00053310673683882;-4.4094969780417e-05;0.00041981315007433;0.00028304889565334;0.0006114185671322;0.00045494723599404;0.00020158493134659;-0.0015409793704748;0.0001969877484953;-0.0018793831113726;0.00022807993809693;-0.0017496296204627;0.00022437317238655;-0.0012370446929708;2.3623633751413e-05;-0.00014788501721341;2.9056878702249e-05;-0.00012675915786531;-0.00010850674880203;5.8761124819284e-05;0.00016971729928628;0.00014223251491785;-0.0011723496718332;0.00015835200611036;-0.00038140689139254;0.00015325369895436;0.00027779515949078;-9.8203010566067e-05;0.0005482435808517;-6.2385784985963e-05;0.00038504155236296;5.9264555602567e-05;-0.00037733887438662;4.8892463382799e-05;-0.0004487082187552;-0.00079140823800117;-0.00031079351902008;0.0013028527610004;3.2193351216847e-05;0.0010725724278018;5.4362451919587e-05;-0.0010042112553492;-7.0578113081865e-05;0.00072240782901645;-0.00015232688747346;-0.00019259522377979;1.842315941758e-05;-1.991960198211e-05;-1.3633909475175e-05;6.5989384893328e-05;3.280901000835e-05;0.00010256363020744;0.00028890446992591;-0.0018949796212837;-9.3109563749749e-05;-0.00011046721192542;-8.6045794887468e-05;-1.139766709457e-06;3.6551286029862e-05;-0.00055053544929251;-7.8450728324242e-05;-0.00045055366354063;8.7199281551875e-05;-0.0001075646141544;1.6478752513649e-05;-0.0008015547064133;-0.00086688128067181;-0.00015492750389967;0.0014067004667595;0.00027603426133282;0.00078137789387256;0.00032851987634785;0.0010794861009344;-0.00012896109547;0.0005942135467194;5.8283080761612e-07;0.0001938506757142;2.8376698537613e-05;6.1601225752383e-05;-5.6068391131703e-05;-1.2196062925796e-05;3.3981446904363e-05;0.00020242786558811;0.00018401314446237;0.0024544198531657;-0.00031496261362918;0.00046884606126696;-0.00046827405458316;-0.00022115717001725;0.00012201123900013;0.00034685526043177;-0.00011270883987891;0.00073520420119166;-3.5370583645999e-05;0.00039401921094395;3.1089413823793e-05;-0.00040523079223931;-0.00037651543971151;0.00037420922308229;0.00021735893096775;0.00015404092846438;-0.0015819338150322;0.00071916723391041;-0.0016639293171465;3.7581976357615e-05;-0.0011726587545127;0.00016677344683558;-9.2307229351718e-05;6.5783540776465e-05;-0.00020960211986676;-4.0936116420198e-05;-2.9160695703467e-05;1.4405426554731e-05;0.00044209699262865;-0.0004119134391658;0.00035131949698552;-0.00039204041240737;0.0001851028209785;-0.00019604834960774;-1.3037901226198e-05;2.573752135504e-05;-7.2161965363193e-05;9.0271722001489e-05;6.5079715568572e-05;-6.8866604124196e-05;-3.6435088986764e-05;2.0628256606869e-05;5.3595485951519e-05;7.549044676125e-05;-4.4355365389492e-05;-0.0012140707112849;0.0010619665263221;-0.0002974582312163;0.00036007972084917;-5.8578760217642e-05;5.3396397561301e-05;-6.3983847212512e-05;9.8309341410641e-05;1.5834508303669e-05;-1.834435533965e-05;-2.3248980141943e-05;2.6390309358248e-05;2.3722932382952e-05;2.0852681700489e-05;-0.00033680931665003;-0.000281807850115;-0.00037683051778004;-0.00018860051932279;2.1478253984242e-05;6.1091093812138e-05;-3.8356974982889e-05;-5.1952669309685e-05;0.00010617967927828;7.5233001552988e-05;-0.00011290299153188;-8.4951672761235e-05;-6.7723463871516e-05;-3.703701440827e-05;-8.1512458564248e-05;-0.00064901355654001;0.00025831864331849;0.0009319448727183;0.00074135226896033;-0.00016216914809775;-0.00025817917776294;6.9902358518448e-05;3.5021788789891e-05;0.00021208697580732;0.00012914717081003;-4.5137207052903e-05;-1.8029091734206e-05;6.3869498262648e-05;4.0812374209054e-05;2.8101645511924e-05;9.2424006652436e-06;-1.1995896784356e-05;1.489263104304e-05;9.2716709332308e-06;-1.3055726412858e-05;0.00021195881708991;0.00017623446183279;-1.9977325791842e-05;-1.945610108578e-07;9.2034451881773e-06;4.0389777495875e-06;5.7933368225349e-05;1.5414272638736e-05;-8.247828372987e-05;-7.9357458162121e-05;-6.0506030422403e-05;0.0021147532388568;0.00017695786664262;-0.0003612672444433;-0.00043600663775578;-0.00090423598885536;-0.00088703108485788;-6.5232110500801e-05;-6.0875418057549e-06;4.8983747547027e-05;7.8145894804038e-05;-4.0762577555142e-05;-2.812141974573e-05;2.1272899175528e-05;1.9904558939743e-05;-5.2678766223835e-05;2.8554939490277e-05;0.00078994606155902;-0.00071891339030117;0.00069692416582257;-0.00068655790528283;0.00030328659340739;-0.0003253273316659;-2.7762438548962e-05;4.5865359425079e-05;-0.00013056927127764;0.00015943418839015;0.00012946453352924;-0.00011328403343214;-3.3036987588275e-05;2.7861507987836e-05;6.5682645072229e-05;6.2222658016253e-05;-7.3798924859148e-05;-0.0021409695036709;0.0019198388326913;-0.00046580616617575;0.00058856990654022;-0.00012993783457205;7.9551515227649e-05;-0.00016675003280398;0.00017703736375552;3.1919636967359e-05;-3.4858669096138e-05;-5.1778937631752e-05;4.5870256144553e-05;3.9660259062657e-05;3.5418048355496e-05;-0.00059929920826107;-0.00052803877042606;-0.00066043564584106;-0.00036778312642127;7.8169641426484e-08;0.00010342569294153;-6.0503771237563e-05;-8.8725915702526e-05;0.00018618049216457;0.00013689008483198;-0.00019905636145268;-0.00015439443814103;-0.0001112262980314;-7.3752096795943e-05;-9.011643123813e-05;-0.0012121992185712;0.00044011833961122;0.0015625809319317;0.0013399882009253;-0.0001787050277926;-0.00041744631016627;0.00013807490176987;8.0941623309627e-05;0.00036862678825855;0.0002395010960754;-7.8220218711067e-05;-3.6382058169693e-05;0.00010800458403537;7.6795593486167e-05;4.0713501221035e-05;1.9924467778765e-05;-3.6092346817895e-06;-2.1130234017619e-05;5.7195000408683e-05;-3.5393823054619e-05;0.00039850705070421;0.00031990231946111;-4.1562077967683e-05;-2.7143914849148e-06;1.4977515093051e-05;1.9939661797252e-05;8.4958999650553e-05;1.7957347154152e-05;-0.00015017192345113;-0.00014734546130057;-8.3286475273781e-05;0.0036787828430533;0.00033160741440952;-0.00069943390553817;-0.00068504642695189;-0.0016347569180652;-0.0015752604231238;-9.8286320280749e-05;-2.4640323772473e-06;8.3099694165867e-05;0.00014653822290711;-6.9589601480402e-05;-5.5297601647908e-05;4.7321511374321e-05;4.3923399061896e-05;-5.0426806410542e-05;2.9195929528214e-05;0.00081194314407185;-0.00071643199771643;0.00074015505379066;-0.00066265015630051;0.00029580405680463;-0.00033029072801583;-2.8127022233093e-05;4.4201038690517e-05;-0.00013597452198155;0.0001627885067137;0.00014673387340736;-0.00010003615170717;-1.8679394997889e-05;3.8932575989747e-05;2.1914736862527e-05;-5.2587434765883e-05;-8.0786754551809e-05;-0.0021294692996889;0.0019961236976087;-0.00042871446930803;0.00061344198184088;-0.00015559243911412;5.2683612011606e-05;-0.00019710422202479;0.00015631171118002;3.3574429835426e-05;-3.6032815842191e-05;-6.0817881603725e-05;3.9917944377521e-05;3.9519680285593e-05;3.5086464777123e-05;-0.00059505348326638;-0.00055458152201027;-0.00065278302645311;-0.00039811473106965;-2.5090183044085e-05;0.00012221962970216;-5.8909143263008e-05;-9.1008907475043e-05;0.00018489969079383;0.00014263663615566;-0.00020075539941899;-0.00016086544201244;-0.00010210502659902;-8.5690226114821e-05;-7.9691366408952e-05;-0.0012405837187544;0.00044625080772676;0.001513438182883;0.0014229853404686;-0.00012407850590535;-0.00046043645124882;0.00014275213470683;8.7194763182197e-05;0.00036438112147152;0.00025638367515057;-7.5929092417937e-05;-3.9305992686423e-05;0.00010415854194434;8.3075610746164e-05;3.4262327972101e-05;2.7345900889486e-05;3.1639403459849e-05;-7.0977526775096e-05;0.00010326765914215;-8.9301902335137e-05;0.00042143228347413;0.00030340405646712;-4.6646357077407e-05;2.3404320472764e-06;9.7796373665915e-06;3.0060458811931e-05;8.5625579231419e-05;1.5234615602822e-05;-0.00015060714213178;-0.00015254503523465;-8.5135456174612e-05;0.0036988891661167;0.00033626795629971;-0.00078573939390481;-0.00058411556528881;-0.0016834064153954;-0.0015551195247099;-0.0001028640253935;4.5976962610439e-06;6.9729823735543e-05;0.00016651363694109;-6.769326137146e-05;-6.1110506067052e-05;4.9142618081532e-05;4.5729080738965e-05;-2.9158067263779e-05;1.7473606931162e-05;0.00051372189773247;-0.00043987089884467;0.00046695896890014;-0.0003797288518399;0.00017944016144611;-0.0002075163210975;-1.5694582543802e-05;2.4179944375646e-05;-8.7708431237843e-05;0.00010331728844903;9.760008106241e-05;-5.1672774134204e-05;-8.18230000732e-06;3.556792580639e-05;-1.1165119758516e-05;-9.7173506219406e-05;-5.4199641454034e-05;-0.0013031522976235;0.0012686313129961;-0.00024640571791679;0.0003956378204748;-0.00010551659943303;1.1958009054069e-05;-0.00012958073057234;7.4995550676249e-05;2.1587704395643e-05;-2.2934505977901e-05;-4.1110270103673e-05;1.9700390112121e-05;2.5265002477681e-05;2.1732899767812e-05;-0.00036297901533544;-0.00035466891131364;-0.00040220050141215;-0.00026490725576878;-2.7448277251096e-05;8.8952852820512e-05;-3.6067322071176e-05;-5.7790650316747e-05;0.0001120068700402;9.0181201812811e-05;-0.00012501666788012;-0.00010309444041923;-5.8386311138747e-05;-6.0214224504307e-05;-5.7867495343089e-05;-0.00078022998059168;0.00028144946554676;0.00091987726045772;0.00093852891586721;-5.3263898735167e-05;-0.00031928409589455;8.9719440438785e-05;5.5510168749606e-05;0.0002240175526822;0.0001693180820439;-4.5061748096487e-05;-2.5099996491917e-05;6.2259619880933e-05;5.4761483625043e-05;1.9023575077881e-05;2.1844112779945e-05;4.0645307308296e-05;-7.0956826675683e-05;8.5016283264849e-05;-9.068437066162e-05;0.00026985807926394;0.0001713850942906;-3.0548231734429e-05;5.7134693633998e-06;2.5810136321525e-06;2.448005216138e-05;5.6584194680909e-05;1.0645785550878e-05;-9.2656766355503e-05;-9.5488037914038e-05;-6.2835984863341e-05;0.0022932030260563;0.00020551765919663;-0.00052755733486265;-0.00029716832796112;-0.0010595903731883;-0.000937057309784;-6.9938534579705e-05;2.9653519959538e-06;3.5498847864801e-05;0.00011428366997279;-4.0708931919653e-05;-4.0976563468575e-05;2.9703483960475e-05;2.7218420655117e-05;-7.3335679189768e-05;9.309254528489e-05;-0.00011690157407429;-0.00019273262296338;-5.4640710004605e-05;0.00082782324170694;-0.00011300625192234;0.00021588904201053;2.1769124941784e-05;-0.00014927696611267;8.0501471529715e-05;-0.00033855665242299;-6.46931148367e-05;-0.00034824400790967;-1.0703171028581e-05;0.00016108386626001;0.00044243107549846;0.00083074741996825;0.00035453547025099;-0.00017893442418426;-0.00099671829957515;-0.00014612782979384;-0.001004007877782;5.5117965530371e-05;0.00069554272340611;0.00010679948900361;-0.00027393823256716;-1.9994518879685e-05;0.00013149395817891;1.298408369621e-05;5.2000545110786e-05;1.1377809414626e-06;6.5297186665703e-05;0.00021030967764091;3.9369355363306e-05;-5.2993847930338e-05;-0.00074968783883378;-9.5335126388818e-05;7.939305214677e-05;5.5612239520997e-05;-9.9826058431063e-05;-4.3382045987528e-05;-0.00040784361772239;3.2813630241435e-05;-0.00023681460879743;-9.8202972367289e-06;0.00011344360973453;-0.00042788297287188;-0.00024171386030503;3.4427903301548e-05;8.1523954577278e-05;0.00060547958128154;0.00012192747817608;9.6800344181247e-05;-9.0920453658327e-05;0.00072346703382209;4.8488509492017e-05;1.1390307008696e-05;2.0686511561507e-05;0.00016027422680054;-2.3394501113216e-05;-2.2227157387533e-05;6.6549619077705e-05;-0.00011106621241197;-1.2102692380722e-05;0.00034868615330197;-0.00034750488703139;0.0026861671358347;-0.00033523689489812;0.0004320923180785;0.00010680099512683;-0.00024196573940571;-9.3335067504086e-05;0.00038023520028219;-8.2027429016307e-05;0.00054336216999218;-1.9671715563163e-05;0.00042533094529063;-7.5971933256369e-05;0.00019852201512549;0.00042260691407137;0.00017859066429082;-0.00068560469662771;0.00038669296191074;-0.0016864648787305;0.00013341166777536;-0.0014756302116439;0.00020630877406802;-0.0011373906163499;4.745347177959e-05;-8.9156099420507e-05;-2.3412844711856e-06;-0.00016734066593926;-0.00024105061311275;0.00011549006012501;0.00055971392430365;0.00013542592932936;-0.0002663160848897;3.0055263778195e-05;-0.00031147836125456;4.2766780097736e-05;0.00029360098415054;-0.0001023259901558;0.00097414094489068;-0.0001167513692053;0.00083801691653207;1.6423171473434e-05;-0.00037100876215845;6.4506020862609e-05;-0.00058164028450847;-0.00084380834596232;-0.00020610727369785;0.0011773474980146;0.00014504104910884;0.00062782969325781;0.000223959737923;-0.0022166655398905;-2.4844746349117e-06;0.00049062102334574;-9.5906572823878e-05;-0.00031223020050675;4.8032921768026e-05;-0.00010174691124121;-1.3451184713631e-05;3.2810145057738e-05;5.7719411415746e-05;0.00028007791843265;0.00030788159347139;-0.0024356821086258;-9.1242800408509e-05;-0.00019982512458228;-1.9593866795731e-07;9.8887894637301e-06;3.7749672628706e-05;-0.00069331610575318;-8.5716397734359e-05;-0.00062922411598265;0.00011273864947725;-0.00013076180766802;-7.4628242145991e-06;-0.00094557780539617;-0.00090119463857263;-0.00024702280643396;0.0014227891806513;0.00038367765955627;0.0011599372373894;0.00022020783217158;0.0014199673896655;-0.00015827933384571;0.0007814749260433;-1.0078458217322e-05;0.00025009753881022;2.3364038497675e-05;9.0185152657796e-05;-5.4986707255011e-05;3.0293967938633e-05;2.6580079065752e-05;0.0003012562810909;0.00021910904615652;0.0027336003258824;-0.00040878908475861;0.00055426085600629;-0.0005705127841793;-0.00028330119675957;0.00015432469081134;0.00013464171206579;-0.00011991054634564;0.00070812139892951;-4.160585012869e-05;0.00047825035289861;2.9007635021117e-05;-0.00052798760589212;-0.00040656261262484;0.0004662036371883;0.00018906872719526;0.00024313858011737;-0.0018668856937438;0.00084279762813821;-0.001610430306755;3.4319342375966e-05;-0.0013210450997576;0.00022226602595765;7.7492877608165e-06;7.327977073146e-05;-0.00024142241454683;-4.9816098908195e-05;-0.00022466669906862;0.00010714422387537;0.00046888209180906;0.00015962606994435;-0.00078858097549528;0.0001223075814778;-0.00043156818719581;0.00011384153185645;0.00036828996962868;-0.00013306627806742;0.0010101119987667;-0.00010918756015599;0.00082536676200107;3.6374814953888e-05;-0.0004813352425117;7.669363549212e-05;-0.00061447644839063;-0.00099540839437395;-0.00030111693195067;0.0015269429422915;9.1006535512861e-05;0.00099624774884433;0.00017298861348536;-0.0021684509702027;-3.4322787541896e-05;0.00074943504296243;-0.00015393379726447;-0.00033341464586556;4.3016050767619e-05;-8.4626233729068e-05;-1.4120458217803e-05;2.9767794330837e-05;7.43499622331e-05;0.00036615412682295;0.0003763010900002;-0.0027964198961854;-0.00013554900942836;-0.00022775177785661;-4.3567386455834e-05;2.3715288989479e-05;3.9435679354938e-05;-0.00076831551268697;-0.00011353287118254;-0.00067210872657597;0.00012576972949319;-0.00017910826136358;4.4773937588616e-06;-0.0011666667414829;-0.0011367397382855;-0.00026376231107861;0.0017748407553881;0.0004692968504969;0.0012857810361311;0.00033728856942616;0.0014998209662735;-0.00017683071200736;0.00093350105453283;-2.4392300019827e-06;0.00028003999614157;3.5763918276643e-05;9.6651092462707e-05;-7.0163056079764e-05;3.7070400139783e-05;3.5351389669813e-05;0.00028510982519947;0.00029502587858588;0.0030654985457659;-0.00045961714931764;0.00062630471074954;-0.00066991877974942;-0.00031059831962921;0.00017683157057036;0.00023065725690685;-0.00015380248078145;0.00088212679838762;-3.4197521017632e-05;0.00053292687516659;4.4361218897393e-05;-0.00068438128801063;-0.00064683414530009;0.00050423218635842;0.00049210496945307;0.00027350382879376;-0.0020757464226335;0.0010496230097488;-0.0019624293781817;2.4387643861701e-05;-0.0015063749160618;0.00023789577244315;-2.8654691050178e-05;9.0189023467246e-05;-0.0002848906442523;-6.5755084506236e-05;-2.2097379769548e-05;7.5829211709788e-06;0.00042252708226442;-0.00039608022780158;0.0003767765883822;-0.00036715797614306;0.00010757548443507;-0.00010732474765973;-6.4678588387324e-06;1.5623269064236e-05;-7.5942094554193e-05;9.6431540441699e-05;6.6638101998251e-05;-6.3030143792275e-05;-5.5701377732476e-07;-9.0989697127952e-06;5.7547840697225e-05;8.5338557255454e-05;-3.3139931474579e-05;-0.0012854604283348;0.0011180557776242;-0.00012943183537573;0.00014959678810555;-4.5603941543959e-05;2.6830746719497e-05;-9.7125077445526e-05;0.00010987697169185;2.1406625819509e-05;-2.3672055249335e-05;-3.6198787711328e-05;3.6580226151273e-05;1.1655377420539e-05;1.5566456568195e-05;-0.00037689635064453;-0.00033661545603536;-0.00043845362961292;-0.00026178822736256;-4.493099913816e-05;4.1723501453816e-06;-2.4967108402052e-05;-4.2407620640006e-05;0.00010900145571213;7.6064781751484e-05;-0.0001310737861786;-0.00010233306238661;-6.2701932620257e-05;-3.4992102882825e-05;7.6290270953905e-05;-0.00085814791964367;0.00021728799038101;0.000878193997778;0.00072827428812161;3.5966193536296e-05;-7.1935828600544e-05;0.00011976897076238;8.8377426436637e-05;0.00023445871192962;0.00015040356083773;-4.1679966670927e-05;-1.7494818166597e-05;6.0285958170425e-05;4.0651029848959e-05;3.2754294807091e-05;1.6469755792059e-05;-0.0001221137936227;-9.6370560640935e-05;-5.9407080698293e-05;-7.1515896706842e-05;0.00020223089086358;0.0001711118966341;-1.9257789972471e-05;-1.6372327991121e-06;3.3420208637835e-05;3.0420576877077e-05;4.0546692616772e-05;4.979644472769e-06;-9.394355583936e-05;-8.9425651822239e-05;-6.9956266088411e-05;0.0016796084819362;0.00018067700148094;-0.00010662453132682;-0.00017922003462445;-0.00080669106682763;-0.0007895830203779;-3.7224868719932e-05;1.1469527635199e-05;7.3170202085748e-05;9.3145165010355e-05;-5.2831317589153e-05;-4.2590105294948e-05;3.5120301618008e-05;3.3268133847741e-05;-3.53896721208e-05;1.0559401744104e-05;0.00076649821130559;-0.00070367142325267;0.00077743933070451;-0.00068087881663814;0.00013854219287168;-0.00013406004291028;-1.3972655324324e-05;2.5806242774706e-05;-0.00014349639241118;0.00017673661932349;0.00013284932356328;-0.0001076109110727;4.5648026571143e-05;-4.4698936108034e-05;8.4776416770183e-05;0.00011866471322719;-4.9802776629804e-05;-0.0024217355530709;0.0021371687762439;-0.00011150502541568;0.00012993747077417;-9.0750872914214e-05;2.4454013328068e-05;-0.00024262808437925;0.00022148195421323;4.4941585656488e-05;-4.6314286009874e-05;-8.2206999650225e-05;7.3218216130044e-05;9.1939582489431e-06;2.1347623260226e-05;-0.00073111691744998;-0.00067859009141102;-0.00081241584848613;-0.00053730013314635;-0.00014327824464999;-2.9984386856086e-05;-3.3715445169946e-05;-6.93602123647e-05;0.00020784314256161;0.00014461716637015;-0.00025160115910694;-0.00020384709932841;-0.00010238245158689;-6.6126413003076e-05;0.00032721846946515;-0.0017166216857731;0.00035278865834698;0.0014805099926889;0.001306421472691;0.00024889316409826;1.1548349903023e-05;0.00025909024407156;0.00021212363208178;0.00042888327152468;0.00029257862479426;-7.4929128459189e-05;-3.4098462492693e-05;0.00010503565135878;7.7274351497181e-05;5.6507473345846e-05;3.7783142033732e-05;-0.00030561740277335;-0.00030676901224069;-0.00016011888510548;-0.00020802549261134;0.00036322476807982;0.00030769480508752;-3.6436671507545e-05;-4.2834235500777e-06;7.7923519711476e-05;8.4003600932192e-05;4.4797128794016e-05;-1.0516801012272e-05;-0.0001824238570407;-0.00017760039190762;-0.00010076152830152;0.0027202547062188;0.00033907662145793;-5.1968247134937e-05;-7.426185766235e-05;-0.0013973836321384;-0.0013658597599715;-2.1282883608365e-05;5.4071308113635e-05;0.00015898019773886;0.00019754508684855;-0.00010337876301492;-9.2411952209659e-05;7.9930337960832e-05;7.7307835454121e-05;-3.1833962566452e-05;1.0135565389646e-05;0.00079198472667485;-0.00068940198980272;0.00080532662104815;-0.00066547706956044;0.00012702058302239;-0.00013647096056957;-1.3597194083559e-05;2.4062923330348e-05;-0.00015291044837795;0.00017569166084286;0.00014717005251441;-9.6115807536989e-05;5.8574434660841e-05;-3.6253801226849e-05;3.0028804758331e-05;1.8835906303138e-05;-5.3467534598894e-05;-0.002408420201391;0.0022121507208794;-7.0675254391972e-05;0.00014371809083968;-0.000109736356535;-4.9018484560293e-07;-0.000265640206635;0.00020647022756748;4.8198387958109e-05;-4.5356289774645e-05;-9.115063585341e-05;6.7629283876158e-05;9.3928065325599e-06;1.8995569917024e-05;-0.0007365916389972;-0.0006957306759432;-0.00079813378397375;-0.00057203957112506;-0.00016391201643273;-1.8552216715761e-05;-3.3543743484188e-05;-6.9768160756212e-05;0.00020975050574634;0.00014742703933734;-0.00025402687606402;-0.00021035636018496;-9.2637113993987e-05;-7.7340424468275e-05;0.00034859744482674;-0.0017442901153117;0.00035698016290553;0.0014357094187289;0.0013674655929208;0.0002920757397078;-1.1382690900064e-05;0.00026460480876267;0.00021945500338916;0.00042148743523285;0.0003113797865808;-7.3957846325357e-05;-3.5120530810673e-05;0.00010198880045209;8.2073718658648e-05;5.069152393844e-05;4.5095661334926e-05;-0.00027597404550761;-0.00036544690374285;-0.00012312858598307;-0.00026514465571381;0.00037344067823142;0.00029937564977445;-3.9925274904817e-05;-1.4869364406422e-07;7.3356342909392e-05;9.589921683073e-05;4.5537613914348e-05;-1.3757499800704e-05;-0.00017959208344109;-0.00018614069267642;-0.0001026651225402;0.0027099710423499;0.00034196017077193;-0.00012807462189812;5.0823615310946e-05;-0.0014147508190945;-0.0013549870345742;-2.389362998656e-05;6.2047671235632e-05;0.00014628370990977;0.00021898010163568;-0.00010137068602489;-9.9535740446299e-05;7.9881545389071e-05;8.1191639765166e-05;-1.318272552453e-05;2.2799849830335e-06;0.00045602879254147;-0.00037680883542635;0.00044625563896261;-0.00034341265563853;7.2547460149508e-05;-8.4662504377775e-05;-4.5923129619041e-06;9.6471903816564e-06;-9.0902598458342e-05;9.9286044132896e-05;8.972582872957e-05;-4.6756929805269e-05;2.9842194635421e-05;-5.5374953262799e-06;-1.0201957593381e-05;-4.1481140215183e-05;-3.446034679655e-05;-0.0013459454057738;0.0012774238130078;-2.9390434065135e-05;0.00010244643635815;-6.6391003201716e-05;-2.0152436263743e-05;-0.00014705509238411;9.3115449999459e-05;2.6982263079844e-05;-2.3554581275675e-05;-5.4047897720011e-05;3.295524220448e-05;5.8791579249373e-06;9.0881394498865e-06;-0.00040838718996383;-0.00039064031443559;-0.00044093179167248;-0.00033235820592381;-9.5655239420012e-05;5.2872828746331e-06;-2.1842888600077e-05;-4.268287011655e-05;0.00011875481141033;8.3744700532407e-05;-0.00014524308789987;-0.00012215515016578;-4.8298832552973e-05;-4.9721977120498e-05;0.00018876949616242;-0.00096659123664722;0.00021978393488098;0.00079711398575455;0.00081152148777619;0.00015313499898184;-6.1239319620654e-05;0.00014461349928752;0.00011872925824719;0.00023684193729423;0.00018636193999555;-4.0547995013185e-05;-1.8467979316483e-05;5.6665474403417e-05;4.8473928472959e-05;2.7354206395103e-05;2.924986074504e-05;-0.00013857074372936;-0.00023238691210281;-5.4113806982059e-05;-0.00018486451881472;0.00021475518587977;0.00015426974277943;-2.2801379600423e-05;4.6930667849665e-06;3.7516052543651e-05;5.9241730923532e-05;3.4465014323359e-05;-2.8391471005307e-06;-9.8903408797923e-05;-0.00010563746036496;-7.0916874392424e-05;0.0015439823037013;0.00018706849368755;-0.00010442180064274;9.5058574515861e-05;-0.00080782477743924;-0.00074583309469745;-2.407227839285e-05;3.1213530746754e-05;7.313780952245e-05;0.00013296378892846;-5.666177457897e-05;-5.9495749155758e-05;4.1548257286195e-05;4.2826068238355e-05;-5.3937244956614e-05;0.00011826185073005;-1.7721931726555e-05;-0.00022317349794321;-0.00012927255011164;0.00043599453056231;-0.00011072085908381;0.00025442114565521;9.663071250543e-05;-0.00024228257825598;4.5090451749275e-05;-0.00053153152111918;4.4197249735589e-06;-0.00047102005919442;-4.8423764383188e-05;0.00031719973776489;0.00018796035146806;0.00037940201582387;0.00016821062308736;2.9005837859586e-05;-0.00068600609665737;3.1665284041082e-05;-0.0005751455319114;-1.5932137102936e-05;0.0011496661463752;0.00010922970250249;-0.00042354909237474;-2.1149362510187e-05;0.00019860443717334;-3.8549737837457e-06;2.795856926241e-05;9.7738193289842e-05;-6.6745313233696e-05;0.0002443422563374;0.0004929875722155;-0.00016971453442238;-0.0015818135580048;-6.2767190684099e-05;-0.00013730762293562;7.2407597144775e-06;4.3550848204177e-05;-0.00011997637921013;-0.00035456492332742;6.0477665101644e-05;-0.00029650903888978;1.0820192983374e-05;-0.00016598404909018;-0.00085686636157334;-0.0007248098263517;-0.00010855568689294;0.0004058719787281;0.0010565326083452;0.00024383616982959;0.00068771076621488;-7.9684927186463e-05;0.00053779897280037;3.4797049011104e-05;0.00060450454475358;3.9665450458415e-05;0.00016114585741889;-4.5197153667687e-05;4.1475697798887e-05;3.3903470466612e-05;4.9133679567603e-05;0.00033029617043212;7.0529436015931e-06;-0.00020941911498085;0.0011433901963755;-0.00035502633545548;0.00027495741960593;9.7252246632706e-05;-0.00016200260142796;-0.00014572039071936;3.4139873605454e-05;3.6161829484627e-05;0.00034258465166204;3.2994084904203e-05;0.00026500775129534;-0.00063456705538556;-0.00063038809457794;0.00025579068460502;0.00012814928777516;0.00091646931832656;0.00062363361939788;-0.00095846300246194;-6.0546437453013e-05;-0.00077303388388827;9.5920418971218e-05;-0.0006162176723592;6.6218912252225e-05;1.4320966329251e-05;-6.0009890148649e-05;-0.00014198302233126;-9.624724771129e-05;0.00019299499399494;-4.2010495235445e-05;-0.00039047258906066;-9.6314863185398e-05;0.00027592258993536;-8.4620660345536e-05;0.00030019815312698;0.00011678926966852;-0.00031066508381628;9.4062670541462e-05;-0.00081575120566413;1.0359512089053e-05;-0.00076241517672315;-7.0932750531938e-05;0.00039138837018982;0.00033840813557617;0.00065316632390022;0.00020530421170406;-3.9971328078536e-05;-0.00095291726756841;-0.00010326428309781;-0.00063269812380895;-4.1831684939098e-05;0.0018516471609473;0.00012172637070762;-0.0004399246245157;-4.2824503907468e-05;0.00030100092408247;3.2902753446251e-06;6.6602864535525e-05;0.00013422926713247;-0.00010495791502763;0.00031232761102729;0.00076377956429496;-0.00020493498595897;-0.0020629158243537;-2.4569459128543e-05;-0.00021142934565432;9.1080155470991e-06;5.7078519603238e-05;-0.00015271482698154;-0.00050843675853685;8.5513464000542e-05;-0.00040193914901465;-4.090276433999e-06;-0.00018904665193986;-0.0011203116737306;-0.00081093690823764;-0.00016642677655909;0.00055040972074494;0.0011598352575675;0.00020048355509061;0.00098425196483731;-0.00011544284643605;0.0007359633455053;4.2634586861823e-05;0.00077099184272811;4.6623499656562e-05;0.00023573327052873;-5.1617695135064e-05;4.0807437471813e-05;5.4510215704795e-05;4.486067336984e-05;0.00037639247602783;0.00014140861458145;-0.00037101909401827;0.0017601712606847;-0.00050716771511361;0.00040744798025116;0.00014201914018486;-0.00024407400633208;-0.00018942532187793;2.4427849893982e-06;2.1508843929041e-05;0.00046726348227821;3.1610084988642e-05;0.00039933485095389;-0.00081062084063888;-0.00076435215305537;0.00037702557165176;0.00027065919130109;0.00093761255266145;0.00086034188279882;-0.0014126115711406;-3.7029683880974e-05;-0.001078104833141;0.00017690102686174;-0.00091544853057712;8.7751308456063e-05;5.1962153520435e-05;-7.2175396780949e-05;-0.00020919486996718;-0.00010765370097943;0.00019168050494045;-6.9878224167041e-05;-0.00044329478987493;-9.7760857897811e-06;0.00012355447688606;-4.3927579099545e-05;0.00022353992972057;7.7114382293075e-05;-0.0002365623076912;0.00011292249109829;-0.00070941000012681;-1.5100250720934e-06;-0.00070164643693715;-5.049728861195e-05;0.00028125054086559;0.0004185009165667;0.00067951693199575;0.00019467793754302;-0.00014310321421362;-0.00083669880405068;-0.00017861556261778;-0.00053191761253402;-3.4629403671715e-05;0.0016892357962206;8.0442463513464e-05;-0.00027312294696458;-4.6045872295508e-05;0.00025537912733853;9.3663029474556e-06;8.1108082667924e-05;8.5649233369622e-05;-4.9295420467388e-05;0.00025941291823983;0.00050780485616997;-0.00012593207065947;-0.0016153557226062;-9.7447400548845e-06;-0.00013385940110311;2.3033357138047e-05;6.3186971601681e-06;-0.00010445160296513;-0.00046590995043516;7.3121831519529e-05;-0.00037267722655088;-1.4020367416379e-05;-8.3135295426473e-05;-0.00083149300189689;-0.00054955651285127;-0.00012081366730854;0.00037610559957102;0.0008613871759735;0.00010638449748512;0.00074407202191651;-0.00011299305333523;0.0007666710880585;3.2382915378548e-05;0.00051857403013855;3.0630177207058e-05;0.00020613534434233;-3.7286292354111e-05;2.8840606319136e-05;5.0852078857133e-05;-1.5725968296465e-06;0.0002134790411219;0.00025198169169016;-0.00036542469752021;0.0019964752718806;-0.00042866281000897;0.00040653825271875;0.00012796345981769;-0.00024582276819274;-0.0001386337535223;4.7601344704162e-05;-2.1303671019268e-05;0.00043000755249523;5.5754385357432e-06;0.00040870442171581;-0.00051535514649004;-0.00033432204509154;0.00039239230682142;0.00025029026437551;0.00023060294915922;0.00063716870499775;-0.0014715295983478;2.6004045139416e-05;-0.0010693051153794;0.00019573398458306;-0.0009555434808135;6.7050495999865e-05;4.0815379179548e-05;-4.1599432734074e-05;-0.00019016138685402;-0.00023217489069793;0.00010387066140538;0.00059261365095153;9.6067495178431e-05;0.00021142959303688;-1.4227162864699e-05;-0.00022305108723231;-1.5734587577754e-05;0.00025170133449137;-9.1155874542892e-05;0.00095392554067075;-0.00010553967149463;0.00089160923380405;-1.2699028957286e-05;-0.00030457726097666;6.33727904642e-05;-0.00048311456339434;-0.00066620239522308;-0.00010376470163465;0.00087572773918509;0.00013239355757833;0.00027649296680465;0.00023912836331874;-0.0023268347140402;2.89074741886e-05;0.00029786551021971;-5.5102376791183e-05;-0.00029723279294558;4.9473408580525e-05;-0.00012525924830697;-7.9090323197306e-06;-4.1187427996192e-05;8.1088983279187e-05;0.00048270102706738;0.00025170380831696;-0.0020879865624011;-0.00010122972889803;-0.00021740187366959;3.8722435419913e-05;3.2991880289046e-05;1.9373079339857e-05;-0.00053848995594308;-8.8054141087923e-05;-0.00051597296260297;9.27118526306e-05;-0.00014545700105373;-1.5909108697088e-05;-0.00088193023111671;-0.00069635274121538;-0.0002174553956138;0.0010554960463196;0.00040313135832548;0.0010517317568883;0.00011153660307173;0.0010475175222382;-0.00012441464059521;0.0007392184343189;-6.9739218133691e-07;0.000203286355827;2.3662018065806e-05;8.0018697190098e-05;-4.2352508899057e-05;6.7167507950217e-05;1.6650088582537e-05;0.00027292704908177;0.00022975006140769;0.002008679555729;-0.00036357180215418;0.00044003434595652;-0.00049238646170124;-0.000236931067775;0.0001373373233946;-8.1985963333864e-05;-0.00010440823825775;0.00052255840273574;-1.7695165297482e-05;0.00039723425288685;2.4460339773213e-05;-0.00058236386394128;-0.00050148379523307;0.00035979066160508;0.00037583045195788;0.00026904535479844;-0.0014296277659014;0.00076875928789377;-0.0011227267095819;3.7357438031904e-07;-0.0010288639459759;0.00018807841115631;8.3476392319426e-05;6.2328079366125e-05;-0.00021215119340923;-5.0285059842281e-05;-0.00022937120229471;0.00010068059782498;0.00049945007776842;0.00010801491589518;-0.00019277045794297;6.5089043346234e-05;-0.00032341899350286;3.8445537938969e-05;0.00032017967896536;-0.00011957711831201;0.0010453658178449;-0.00010159433441004;0.00091044552391395;1.0522064712859e-06;-0.00040670702583157;7.8092401963659e-05;-0.00049450452206656;-0.00082014524377882;-0.00018500910664443;0.0011989132035524;7.7772463555448e-05;0.00057763955555856;0.00021543866023421;-0.0023688913788646;1.0145575288334e-05;0.00051325553795323;-0.0001075657637557;-0.00033957010600716;4.650465780287e-05;-0.00010870203550439;-8.6583095253445e-06;-4.7657478717156e-05;9.9853488791268e-05;0.00060967379249632;0.0003116016741842;-0.0024817804805934;-0.00014631888188887;-0.00025969068519771;1.3406198377197e-05;5.0940358050866e-05;2.0228178982507e-05;-0.00064769230084494;-0.00011326543608448;-0.00056359043810517;0.00010692734940676;-0.00019004235218745;-9.431738362764e-06;-0.0011064290301874;-0.00091937748948112;-0.00025132656446658;0.0013592422474176;0.00050753739196807;0.0012304717674851;0.00020442713866942;0.0011533221695572;-0.0001432270364603;0.00089792773360386;5.9689364206861e-06;0.00025115004973486;3.3720651117619e-05;7.8324708738364e-05;-5.4893902415643e-05;7.3980198067147e-05;2.6809768314706e-05;0.00024958167341538;0.00030764917028137;0.0023371304851025;-0.00042851734906435;0.00051583797903731;-0.00061052321689203;-0.00026402951334603;0.00016069182311185;1.9796356355073e-05;-0.00014165107859299;0.00069415586767718;-1.1752596037695e-05;0.00044466476538219;4.4162457925268e-05;-0.00075102434493601;-0.00078021018998697;0.00040383770829067;0.00071971135912463;0.00030995215638541;-0.0016540149226785;0.0010124072432518;-0.0014853301690891;-5.6920716815512e-06;-0.0012021877337247;0.00020813736773562;4.7209447075147e-05;8.11888530734e-05;-0.00025308987824246;-6.8881679908372e-05;-4.5212605073175e-06;-1.7788290278986e-05;0.0006105811917223;-0.00058027100749314;0.00084577011875808;-0.00066844531102106;3.9483466025558e-06;2.7277857952868e-05;-1.0438535355206e-05;1.5214900486171e-05;-0.00012385865557007;0.00016347406199202;0.00012490327935666;-9.1022418928333e-05;0.00012012062506983;-0.00011168739729328;0.00010870956612052;0.00015848835755605;-2.7696622055373e-05;-0.0024938869755715;0.0021671124268323;0.00015462892770302;-0.00022787545458414;-3.3427506423322e-05;-3.883875979227e-05;-0.00031945176306181;0.00026232871459797;4.1315601265524e-05;-4.3458934669616e-05;-9.9989658338018e-05;8.8784661784302e-05;-3.9865190046839e-05;-6.1687292145507e-06;-0.00078511383617297;-0.00077288394095376;-0.00073854753281921;-0.0005305302911438;-0.00023323731147684;-0.00012238719500601;-1.2550430255942e-05;-5.1988859922858e-05;0.00023053203767631;0.00015053451352287;-0.00027477528783493;-0.0002368218410993;-6.9463327236008e-05;-3.9050126360962e-05;0.00091345986584201;-0.0017638504505157;0.00023891859746072;0.0010085416724905;0.00093053304590285;0.00051980325952172;0.00030466113821603;0.00032441111397929;0.00031125106033869;0.00039835533243604;0.00027891472564079;-6.6541419073474e-05;-2.6588975742925e-05;9.0753732365556e-05;6.9694586272817e-05;6.0883307014592e-05;4.9555295845494e-05;-0.00067098817089573;-0.00064669834682718;-0.00046860444126651;-0.00046183666563593;0.00024988775840029;0.00020755044533871;-1.9008923118236e-05;3.4619845337147e-06;0.00014460137754213;0.000146360573126;-2.0176803445793e-05;-5.9090769354952e-05;-0.00019889770192094;-0.00018579233437777;-1.4782170183025e-05;0.0013650981709361;0.00027493329253048;0.00067946274066344;0.00060018739895895;-0.00090411386918277;-0.00087909470312297;0.00011478231317597;0.0001621309784241;0.00025351435760967;0.00026046347920783;-0.00012974871788174;-0.0001205533335451;0.00010564268450253;0.00010087086411659;-1.6166068235179e-06;-1.8099868611898e-05;0.00065513123990968;-0.00056562310783193;0.0008565210737288;-0.00066571211209521;-3.8996417970338e-06;2.038614002231e-05;-8.8578062786837e-06;1.3733193554799e-05;-0.00013911460700911;0.00016084971139207;0.0001377944718115;-8.2434700743761e-05;0.00012674962636083;-0.0001032216969179;4.2205072531942e-05;7.4808405770455e-05;-3.1611230951967e-05;-0.0024949638172984;0.0022553419694304;0.00018761662067845;-0.00020828051492572;-4.9710124585545e-05;-5.9906895330641e-05;-0.00033058479311876;0.00025191257009283;4.6526536607416e-05;-4.1239600250265e-05;-0.00010834538261406;8.3645703853108e-05;-3.6428136809263e-05;-9.0166868176311e-06;-0.00080584705574438;-0.00077925255754963;-0.00073742348467931;-0.00057076214579865;-0.00024595586000942;-0.00011548554175533;-1.4987728718552e-05;-5.1958559197374e-05;0.00023537057859357;0.00015133508713916;-0.0002807280397974;-0.00024237603065558;-6.3029016018845e-05;-5.0180951802758e-05;0.00091567594790831;-0.0018072806997225;0.00024981974274851;0.001014863839373;0.000997623661533;0.00054211897077039;0.00028842990286648;0.00033354718470946;0.00031395835685544;0.00039656140143052;0.00030124990735203;-6.77525458741e-05;-2.6135847292608e-05;9.0831410489045e-05;7.3214971052948e-05;5.7236196880694e-05;5.6041662901407e-05;-0.00063551857601851;-0.00069579400587827;-0.00042593161924742;-0.00051314698066562;0.00025845132768154;0.00021106723579578;-2.2308919142233e-05;6.8547910814232e-06;0.00013957988994662;0.00015631524729542;-1.4377578736458e-05;-6.0009697335772e-05;-0.00019404474005569;-0.00019773608073592;-2.5120987629634e-05;0.0014093103818595;0.00028114541782998;0.00058788282331079;0.00071179430233315;-0.00093080889200792;-0.00090355286374688;0.0001047854530043;0.00016585784032941;0.00023728866653983;0.00028194685000926;-0.00012829228944611;-0.00012763266568072;0.00010338440915802;0.00010533336899243;4.416368483362e-06;-1.3957556802779e-05;0.00036667962558568;-0.00028843389009126;0.00043057254515588;-0.00031671061879024;5.6206044973806e-07;1.2515145044745e-06;8.786030889496e-07;1.4558369230144e-06;-8.2411483163014e-05;8.6116044258233e-05;8.1846672401298e-05;-3.9793874748284e-05;5.7840334193315e-05;-3.6084496969124e-05;-8.8105798567994e-06;-2.7713097097148e-06;-2.1449643099913e-05;-0.0013231851626188;0.0012335497885942;0.00011059419193771;-9.1886206064373e-05;-3.0532719392795e-05;-5.0041006034007e-05;-0.00016249582404271;0.00010724736057455;2.523762123019e-05;-1.8856935639633e-05;-6.0691039834637e-05;3.9863680285634e-05;-1.5649107808713e-05;-5.7154584283126e-06;-0.00042068836046383;-0.0003993917198386;-0.00040166088729165;-0.00032355100847781;-0.00013124740507919;-4.6193967136787e-05;-1.3003344975004e-05;-3.2296160497935e-05;0.00012530243839137;7.8616860264447e-05;-0.00015322968829423;-0.00013152536121197;-3.3541771699674e-05;-3.4609147405718e-05;0.00044855932355858;-0.00096032576402649;0.00016559312643949;0.00057260185712948;0.00059273571241647;0.00026142873684876;9.1033871285617e-05;0.00017070966714527;0.00015533731493633;0.00022039128816687;0.00017772700812202;-3.5849290725309e-05;-1.1462792826933e-05;4.9365906306775e-05;4.0538114262745e-05;2.9526796424761e-05;3.1625575502403e-05;-0.00030574723496102;-0.00037877282011323;-0.00019348364730831;-0.00028919870965183;0.0001489925198257;0.00011009255831596;-1.3165971722628e-05;7.3348028308828e-06;6.7389715695754e-05;8.5577288700733e-05;9.3308426585281e-06;-2.0316278096288e-05;-9.9750512163155e-05;-0.00010636748629622;-3.7886966310907e-05;0.00084000459173694;0.00015218657790683;0.00025879417080432;0.00042204651981592;-0.00053840118926018;-0.00050710648065433;3.0803745175945e-05;7.1296257374343e-05;0.00010943465167657;0.00015342391270678;-6.753604975529e-05;-7.067782280501e-05;4.9175534513779e-05;5.1375172915868e-05;-9.3934664619155e-05;0.00020777121244464;-5.792378942715e-06;-0.00040467933285981;-7.4309151386842e-05;-0.00010629760799929;-3.0954590329202e-05;0.00026287318905815;0.00012391514610499;-0.00031894125277176;9.2298585514072e-05;-0.0009569795220159;4.0050163079286e-05;-0.00092580798082054;-8.6778163677081e-05;0.00039266271051019;0.00026940507814288;0.0006584029761143;0.0001470673159929;-1.0942576409434e-05;-0.00090863119112328;-0.00018023794109467;-0.00040514903957956;-8.2177277363371e-05;0.0022324237506837;0.00010817583097378;-0.00033927164622582;-4.9371421482647e-05;0.00035184700391255;6.0910650745427e-07;9.2753551143687e-05;0.00018455270037521;-0.00019829184748232;0.00028995025786571;0.0011590620269999;-0.00025613157777116;-0.002074685646221;3.39178404829e-05;-0.0002878298109863;-9.1556803454296e-06;9.8974705906585e-05;-0.00017862336244434;-0.00049328344175592;8.0088757385965e-05;-0.00034774793311954;-1.9907305613742e-05;-0.00022693601204082;-0.0012465980835259;-0.00071460142498836;-0.00019416827126406;0.00069240288576111;0.00088875408982858;9.7143492894247e-05;0.0011130969505757;-9.4970833742991e-05;0.00051517755491659;5.8329176681582e-05;0.00085175025742501;5.216979116085e-05;0.00024923245655373;-4.4599884859053e-05;2.2928214093554e-05;6.373283395078e-05;6.8700646806974e-05;0.00042929797200486;0.00019033416174352;-0.00043328589526936;0.0014639464206994;-0.00055049790535122;0.0003834231174551;0.00015133892884478;-0.00023819526541047;-0.0002118303818861;-0.00016158357902896;3.8168967876118e-05;0.00042459001997486;3.7956411688356e-05;0.00038606216548942;-0.0010087015107274;-0.0010409033857286;0.00034267120645382;0.00039193802513182;0.001250944333151;0.0010002860799432;-0.0012668102281168;-5.5472090025432e-05;-0.00092690199380741;0.00018814056238625;-0.00082550919614732;9.5679693913553e-05;0.0001263069716515;-8.6132597061805e-05;-0.00022769450151827;-0.00010127296263818;0.00019978593627457;-3.5130691685481e-05;-0.00049189548008144;1.6476536984555e-05;-0.00027261700597592;3.8794337342551e-06;0.00018144692876376;8.6434265540447e-05;-0.00023728422820568;0.00010615403880365;-0.00078050722368062;3.1144882086664e-05;-0.00080801092553884;-6.1002621805528e-05;0.00027799163945019;0.00034382351441309;0.00055335543584079;0.00010056386963697;-0.00011010112939402;-0.00066442583920434;-0.00019663563580252;-0.00023246907221619;-7.1799848228693e-05;0.001963805174455;5.4406074923463e-05;-0.00018602526688483;-5.0813869165722e-05;0.0002751823340077;4.681699010689e-06;0.0001008600811474;0.00012782440171577;-0.00012937730934937;0.00023471422900911;0.00078346388181672;-0.00016381501336582;-0.0016268970211968;3.550540714059e-05;-0.00020659201254603;2.0864476937277e-06;5.3535270126304e-05;-0.00012685509864241;-0.00039115955587476;6.9882902607787e-05;-0.00032887971610762;-2.029309689533e-05;-0.00014725136861671;-0.00091548671480268;-0.00051047571469098;-0.00014774383453187;0.00048388139111921;0.00069209700450301;4.2756222683238e-05;0.00085569219663739;-9.1811001766473e-05;0.00053710024803877;3.7176370824454e-05;0.00062743457965553;3.5178985854145e-05;0.00018765639106277;-3.3752872695914e-05;3.4404358302709e-05;4.4047315896023e-05;4.4243068259675e-05;0.00027999372105114;0.00023243130999617;-0.00035334061249159;0.0014087480958551;-0.00041539373341948;0.00033340655500069;0.00012378131214064;-0.00021525744523387;-0.00014400055806618;-0.00015577684098389;9.3758944785804e-06;0.00031873097759672;1.1932642337342e-05;0.00035398127511144;-0.00068278051912785;-0.00056987081188709;0.00031499008764513;0.00030556376441382;0.00059851119294763;0.00068347970955074;-0.0011459053494036;-2.2061118215788e-05;-0.00072983163408935;0.0001735125988489;-0.00074838689761236;6.7081986344419e-05;0.00011798083141912;-5.3658674005419e-05;-0.00018552814435679;-0.00011999416165054;4.812623228645e-05;0.00019647573935799;3.5936565836892e-05;-4.5798151404597e-05;4.892506331089e-05;-0.00016457098536193;1.0522246157052e-05;0.00017491809558123;-6.7976630816702e-05;0.00061263068346307;-4.7552879550494e-05;0.00050928042037413;-7.3795263233478e-06;-0.00022534841264132;4.9370853957953e-05;-0.00019555821199901;-0.00043975230073556;-8.9677043433767e-05;0.00065243657445535;9.4505054448746e-07;0.00026913499459624;0.00013087627303321;-0.0013120153453201;1.7438500435674e-05;0.00026205711765215;-6.3401996158063e-05;-0.00020705423958134;2.3852688173065e-05;-5.3512645536102e-05;-3.3345290830766e-06;-6.1841274145991e-05;7.1635608037468e-05;0.00050585140706971;0.00015751803584863;-0.0012946520000696;-0.0001034309680108;-0.00016307288024109;2.3866095943958e-05;4.4092001189711e-05;3.3617814096942e-06;-0.00035306144854985;-6.9317196903285e-05;-0.00025402157916687;5.1846582209691e-05;-0.00011291369446553;-1.0877275599341e-05;-0.00064809276955202;-0.00045482226414606;-0.00013802513421979;0.00061645539244637;0.0003303763223812;0.00068068713881075;7.7533237345051e-05;0.000486669188831;-6.6477921791375e-05;0.00050038855988532;1.2797713679902e-05;0.00015107564104255;2.088555447699e-05;2.1305600967025e-05;-2.573938400019e-05;4.8415899073007e-05;1.8454460587236e-05;0.00011576087126741;0.00019508121476974;0.0011035579955205;-0.00024731969460845;0.00025942307547666;-0.00035244811442681;-0.00012935516133439;8.7000924395397e-05;-5.4555298447667e-06;-8.7825625087135e-05;0.00037734099896625;2.9490900033124e-06;0.00021585004287772;3.2940981327556e-05;-0.00049082556506619;-0.00058999471366405;0.00019269311451353;0.00061022565932944;0.00020048108126502;-0.00080584781244397;0.00063201651209965;-0.00078900688095018;-1.1922092198802e-05;-0.00058634771266952;0.00010792074317578;3.315566573292e-05;4.8114769015228e-05;-0.00013957728515379;-4.5456901716534e-05;8.3905630162917e-05;-0.000104466387711;-0.00084333913400769;-0.00039280313649215;-9.6674120868556e-05;0.00028941212804057;-5.9341415180825e-05;0.00019212956249248;5.7307319366373e-05;-6.4721119997557e-05;0.00028651536558755;0.0001665128802415;-9.5202689408325e-05;-8.9130968262907e-05;-9.4370705483016e-05;-1.7957704585569e-06;0.0010810336098075;0.00058985635405406;-2.3657594283577e-06;-0.00044582024565898;-0.00045784853864461;9.8382581199985e-05;-0.00046967389062047;0.00025998195633292;0.00010468963591848;0.00013354372640606;-8.4179009718355e-05;-0.00013653207861353;-5.9582263929769e-05;8.4705221524928e-05;6.9871362939011e-05;-0.00017337595636491;7.0746275014244e-05;0.00071285490412265;-0.00020093497005291;-0.00045652585686184;-0.00010771137021948;-0.00015230591816362;-5.908928142162e-05;8.6935178842396e-05;-3.6566354538081e-05;-0.00010720790305641;4.7653488763899e-06;7.0572888944298e-05;-7.6278207416181e-05;-0.00011861342500197;3.3527045161463e-05;-6.0630249208771e-05;-0.00036087006446905;-4.3410622311058e-05;-2.8136482796981e-05;0.00021982059115544;0.00035862677032128;0.00018035534594674;-0.00030716552282684;0.0001283534365939;0.00033041197457351;2.4727076379349e-05;0.00010410280083306;1.1329869266774e-05;-5.7278641179437e-05;8.9713139459491e-06;0.00011766771058319;2.2642303520115e-05;-0.00071658409433439;0.00022255563817453;-0.001150359865278;-9.7539023045101e-06;-6.2956853071228e-05;-0.00027220053016208;7.0200359914452e-05;9.9248400147189e-06;4.8431997129228e-05;-8.709618850844e-05;4.4596028601518e-05;7.0033769588917e-05;-0.00018931110389531;0.00011902247206308;-0.00060745229711756;-0.0016377571737394;-0.00010121225204784;0.0026623895391822;6.2178887674236e-06;0.00038331234827638;0.00084135477663949;4.2134368527513e-07;-5.2470251830528e-05;0.00041782043990679;-8.9252738689538e-05;-3.7436559068738e-05;3.5082728572888e-05;2.041392326646e-05;-7.8244207543321e-05;2.6109373720828e-05;-3.5632841900224e-05;0.00012795941438526;-0.00018868701590691;0.00042234107968397;-0.00029584305593744;-5.1946884923382e-05;8.826546400087e-05;-4.448741321994e-07;3.5360983474675e-07;-3.0557734135073e-05;7.1790607762523e-05;5.1798313506879e-05;-3.7009904190199e-05;8.1092897744384e-05;-8.0187361163553e-05;0.00012060687731719;0.00013533346646;-7.7933736974956e-06;-0.0012672379380092;0.0010345740010962;0.00018940046720672;-0.00028444422059692;4.6501969336532e-05;-6.815845699748e-05;-0.00017792647122405;0.00013878704339731;5.4891879699426e-06;-1.3755158761342e-05;-5.1206912758062e-05;5.0428450776963e-05;-5.7898454542737e-05;-2.092026079481e-05;-0.00036857725353912;-0.0004203004646115;-0.00025929350522347;-0.00016927126853261;-0.00013703087461181;-8.3636834460776e-05;-2.4000348730624e-06;-2.7939284336753e-05;0.00012918475840706;8.0290046753362e-05;-0.00014363726950251;-0.00013535843754653;-1.6038497051341e-05;5.8587106650521e-06;0.00085840868996456;-0.00069288903614506;9.9749755463563e-05;0.00011355510650901;0.00012322720431257;0.00028249001479708;0.00018283887766302;0.00015906529733911;0.00018994481069967;0.00017171222134493;0.00010662368731573;-2.6696805434767e-05;-6.1418004406733e-06;3.6499459383776e-05;2.8581489459611e-05;2.5828065190581e-05;2.2404459741665e-05;-0.00058887858176604;-0.00051615451229736;-0.00043883669422939;-0.00036630939575844;5.3410247346619e-05;1.8763243133435e-05;4.489072580327e-06;1.0554846994637e-05;0.00011778836051235;0.00010691133502405;-3.7978912587278e-05;-5.2935643907404e-05;-0.00010830387327587;-8.2825652498286e-05;9.4189788796939e-05;-8.2797465438489e-05;8.583469025325e-05;0.00082270050188527;0.0006179217598401;-0.00016199256060645;-0.00011433431791374;0.00012790538312402;0.0001424840738764;0.00018303214164916;0.00015522656030953;-8.1806370872073e-05;-7.1908994868863e-05;6.2387705838773e-05;5.3230669436743e-05;3.2675798138371e-05;-5.1603943575174e-05;0.00035280210431665;-0.00039495539385825;0.00086825637845322;-0.00063836062327027;-7.7547148976009e-05;0.00013474853767548;-1.4291145816969e-05;1.3373198271438e-05;-7.8468779975083e-05;0.00013285705063026;9.7861120593734e-05;-6.679385114694e-05;0.00016963432426564;-0.00015962701581884;0.00016097031766549;0.00020901732204948;-1.2336503459665e-05;-0.0024202396161854;0.0020396849140525;0.00030577552388422;-0.00045719626359642;5.80623964197e-05;-0.00010888004908338;-0.00037025625351816;0.00028995014145039;2.2119127606857e-05;-2.9883298338973e-05;-9.8758355306927e-05;9.1409863671288e-05;-9.6970950835384e-05;-3.8669000787195e-05;-0.00077337777474895;-0.00081766064977273;-0.00048509088810533;-0.00035082807880826;-0.00025542787625454;-0.00015747536963318;-4.4043276830052e-06;-4.6011333324714e-05;0.00025360879953951;0.00015797892410774;-0.00027425098232925;-0.00025364375323988;-2.5843328330666e-05;2.4851908619894e-06;0.0015603476203978;-0.0013944710372016;0.00016423680062871;0.00030488526681438;0.00032204299350269;0.00056119385408238;0.00038279901491478;0.00032966447179206;0.00036524995812215;0.00030493628582917;0.00020659914298449;-5.6657172535779e-05;-1.7285909052589e-05;7.3287032137159e-05;5.8753230405273e-05;5.0746060878737e-05;4.7889690904412e-05;-0.0010428414680064;-0.00096190883778036;-0.00076564180199057;-0.00068191363243386;0.00011526358866831;7.4432275141589e-05;3.195548288204e-06;1.4770342204429e-05;0.00021685480896849;0.00020152027718723;-8.9876615675166e-05;-0.00011324771185173;-0.00020323340140749;-0.00017274728452321;0.00018807248852681;7.9867386375554e-05;0.0001787248038454;0.0013166564749554;0.0011055277427658;-0.00037007802166045;-0.00033048223122023;0.00026079657254741;0.00028301464044489;0.00033924743183888;0.00030619296012446;-0.00015045306645334;-0.00013697741087526;0.00012391533527989;0.00011271311086603;3.1411625968758e-05;-4.7551202442264e-05;0.00039755387115292;-0.00036088618799113;0.00085569760994986;-0.0006416643736884;-7.8715391282458e-05;0.00011921273107873;-1.5140360119403e-05;1.5471399819944e-05;-9.334651986137e-05;0.00012149809481343;0.00010519425995881;-5.6312863307539e-05;0.00017227293574251;-0.00015263531531673;7.6356336649042e-05;0.00012910128862131;-1.5179906768026e-05;-0.0023407081607729;0.0020630916114897;0.00031538325129077;-0.00041231431532651;3.8814621802885e-05;-0.00012192929716548;-0.00037154374876991;0.0002841122332029;2.8360715077724e-05;-2.5795259716688e-05;-0.000103130012576;8.3320490375627e-05;-8.885572606232e-05;-4.1331524698762e-05;-0.00078720157034695;-0.0007935332832858;-0.00045850771130063;-0.00036567007191479;-0.00025220582028851;-0.00014967389870435;-7.4165418482153e-06;-4.256073225406e-05;0.00025325940805487;0.00015328444715124;-0.0002718144969549;-0.00024750610464253;-1.8335191271035e-05;-5.7724910220713e-06;0.001525103347376;-0.0013798554427922;0.00016229045286309;0.0003018343122676;0.00034465090720914;0.00055467808851972;0.00036883074790239;0.00033454119693488;0.00035408930853009;0.00028623413527384;0.00021463829034474;-5.8261080994271e-05;-1.6469704860356e-05;7.2717346483842e-05;5.8819445257541e-05;4.4742871978087e-05;5.0733011448756e-05;-0.00097509025363252;-0.00097703491337597;-0.0006932417745702;-0.00070670153945684;0.00011590709618758;8.3018618170172e-05;-5.3002776212452e-07;1.6313799278578e-05;0.00020714721176773;0.00020427913113963;-8.6715932411607e-05;-0.00011583280866034;-0.00018987884686794;-0.00018189626280218;0.0001904840755742;0.00013792274694424;0.00018039085261989;0.0011555552482605;0.0011582155711949;-0.00037874767440371;-0.00035789812682196;0.00024970731465146;0.00028472385019995;0.00031200083321892;0.00031977883190848;-0.00014389946591109;-0.00013854390999768;0.00011866143177031;0.00011642905883491;8.9504217612557e-05;-6.3214312831406e-05;0.00034310467890464;0.00054393213940784;-0.00021852775535081;0.00019659727695398;-0.00017072535410989;6.5322237787768e-05;5.0873386499006e-05;-5.0226786697749e-05;-0.00017009652219713;-0.00013751667574979;7.7087839599699e-05;0.00011656648712233;1.4053232916922e-05;8.8626293290872e-05;-0.00080380856525153;-0.00049627618864179;1.7231357560377e-05;0.00030785932904109;0.00040598108898848;0.00041258166311309;-0.00015547680959571;-8.1962964031845e-05;-0.00029059979715385;5.7811757869786e-05;-0.00014900568930898;6.1251135775819e-05;8.2300946814939e-05;-6.3804909586906e-05;-7.9442790593021e-05;4.7390425606864e-05;-9.5354567747563e-05;-0.00017359601042699;0.00032372600981034;-0.00011101709969807;-0.00052166462410241;-8.89535585884e-05;-9.9849348771386e-05;-2.08090095839e-05;6.5244305005763e-05;1.1163259841851e-05;-9.6016316092573e-05;-5.9317178966012e-05;2.0872651020909e-06;3.8762056647101e-05;-0.00011213001562282;-2.8861451937701e-05;-0.00050269428174943;-5.6805616623024e-05;0.00018032082880381;0.00027177832089365;0.00027463134028949;0.00033749916474335;0.00011749699478969;-5.787981353933e-05;1.6548534404137e-05;0.00028218794614077;4.0531831473345e-06;7.506556721637e-05;-3.7205842318144e-07;-2.2634185370407e-05;1.0972406016663e-05;9.1173998953309e-05;0.00022430038370658;-0.0006517069414258;5.9660043916665e-05;-0.00085896271048114;-0.0001768985966919;-2.3405140382238e-05;2.1910989289609e-06;5.2169121772749e-05;-8.1374892033637e-05;0.00012071576929884;7.0033704105299e-05;4.1486928239465e-06;9.1395428171381e-05;-0.00016558672359679;-0.00043560270569287;-0.0011436756467447;-5.0927683332702e-05;-0.00010103608656209;0.0020562359131873;0.00055815407540649;0.00021689725690521;-6.6399399656802e-05;3.0631505069323e-05;-9.3638103862759e-05;0.00031835719710216;3.0834933568258e-05;-7.7386073826347e-05;-6.2517050537281e-05;5.1246115617687e-05;9.7986458058585e-06;4.9637154006632e-05;0.00011675740097417;0.00016160390805453;-0.00014811978326179;-0.00017758247849997;-3.5514415230864e-06;0.00010773631220218;7.5696654675994e-05;-0.00016653767670505;-2.518202381907e-05;-0.00059517211047933;5.5672488088021e-05;-0.00048566190525889;-6.761122494936e-05;0.00021438424300868;-0.00024448952171952;0.00028062585624866;4.8110105126398e-05;0.00022025026555639;-0.00046927569201216;-8.9542911155149e-05;-0.00010488921543583;-7.9597579315305e-05;0.001117366598919;9.2353948275559e-05;-0.00013799038424622;-5.991543730488e-06;0.00024032421060838;-1.3453381143336e-05;2.4331051463378e-05;0.00015908923523966;-0.00023593343212269;7.0072914240882e-05;0.0012118134181947;-0.00021851215569768;-0.0008686616201885;6.7118460719939e-05;-0.00021447386825457;-3.2571839255979e-05;0.00010550105071161;-0.0001150778552983;-0.00025295335217379;5.1751521823462e-06;-6.4169848883466e-06;-2.5362163796672e-05;-0.00014600559370592;-0.00074615888297558;-0.00017777705215849;-0.00010084743553307;0.00052838766714558;-4.0873484977055e-05;-6.2805265770294e-05;0.00059921905631199;1.6709480405552e-05;-0.00018640041525941;6.5954620367847e-05;0.00046200313954614;3.5365930671105e-05;0.00016749637143221;-6.8357912823558e-06;-5.6239288824145e-05;6.298551306827e-05;4.5127209887141e-05;0.00030255498131737;6.2737410189584e-05;-0.00027936670812778;0.00019206927390769;-0.00035164257860743;0.00012775538198184;7.7449592936318e-05;-7.6086260378361e-05;-0.00016030459664762;-0.00017261919856537;5.0703027227428e-05;0.00021073316747788;5.1161092414986e-05;0.00011761759378714;-0.00081871607108042;-0.0011293824063614;9.0702953457367e-05;0.00033392154728062;0.00141054042615;0.00079292594455183;-0.00033668504329398;-4.5195552957011e-05;-0.00039857052615844;7.6839685789309e-05;-0.00021185973309912;6.687045970466e-05;0.00011087571328972;-7.3001472628675e-05;-0.0001301408483414;-3.7263700505719e-05;0.00013191983452998;7.4437608418521e-05;-0.00011443601397332;-0.00011446430289652;-0.00029357516905293;3.7008924209658e-06;0.00017569343617652;0.00010714381642174;-0.00025549382553436;2.8722408387694e-05;-0.00085290987044573;6.2594102928415e-05;-0.00079594046110287;-8.762622019276e-05;0.00031586916884407;-2.91356791422e-05;0.00048345525283366;7.6937576523051e-05;0.00013418745948002;-0.00070146849611774;-0.00016863137716427;-0.00017055490752682;-9.9005323136225e-05;0.0018740374362096;0.00010094213212142;-0.00020788115216419;-2.9864777388866e-05;0.00032487028511241;-8.386359695578e-06;7.2126225859392e-05;0.00020637721172534;-0.00027638347819448;0.00017740657494869;0.0014458539662883;-0.00028270052280277;-0.0014856477500871;7.565961277578e-05;-0.00029096018988639;-3.1297768146032e-05;0.0001273020170629;-0.00016954050806817;-0.00036706612445414;3.8747246435378e-05;-0.00013533481978811;-3.1258048693417e-05;-0.00021255783212837;-0.0011079903924838;-0.00040657195495442;-0.00015792717749719;0.00071227602893487;0.00029329711105675;-2.7710353606381e-05;0.00091714243171737;-2.6135518055526e-05;1.3397373550106e-05;7.7821176091675e-05;0.00070849497569725;5.028783925809e-05;0.00021827663294971;-2.3155085727922e-05;-3.0102673918009e-05;7.1552487497684e-05;6.981040496612e-05;0.00041317063733004;0.00016343058086932;-0.00039486898458563;0.00068127299891785;-0.00048165253247134;0.00024436102830805;0.00012123004853493;-0.00015461798466276;-0.00020633263920899;-0.00025550319696777;5.7717850722838e-05;0.00031087262323126;4.9296158977086e-05;0.00024894505622797;-0.0010589559096843;-0.0012676441110671;0.00019943882944062;0.00043693982297555;0.0015490620862693;0.00099125481210649;-0.00073145842179656;-6.6068118030671e-05;-0.00061293068574741;0.00013884584768675;-0.0004802749317605;8.8578599388711e-05;0.00016038821195252;-9.0009736595675e-05;-0.00019585073459893;-7.6521762821358e-05;2.8346103135846e-05;9.5027222414501e-05;1.3411363397609e-05;2.4666715034982e-06;3.8283425965346e-05;-0.00010261661373079;8.6299775148291e-07;0.00011548933252925;-4.5963028242113e-05;0.00042565577314235;-2.7701255021384e-05;0.00034518993925303;-8.7096532297437e-06;-0.00014979677507654;3.5983652196592e-05;-9.5311828772537e-05;-0.00028961570933461;-5.3640000260202e-05;0.00043245617416687;-1.8677315893001e-05;0.00015428211190738;9.506681089988e-05;-0.00088262098142877;1.7007278074743e-05;0.00016260542906821;-4.3923548219027e-05;-0.00014696166908834;1.5139752576943e-05;-3.3596414141357e-05;-1.6174800521185e-06;-5.9397112636361e-05;5.5945583881112e-05;0.0004216723900754;9.7902811830863e-05;-0.00081896205665544;-7.9673845903017e-05;-0.00011636882845778;2.4221923013101e-05;3.5992241464555e-05;-1.2818004506698e-06;-0.00023143267026171;-4.9569738621358e-05;-0.00014137060497887;3.0717157642357e-05;-7.7618373325095e-05;-1.0408520211058e-05;-0.00044885990791954;-0.00026999579858966;-8.9813496742863e-05;0.00033800906385295;0.00024322386889253;0.00044835629523732;3.1324772862718e-05;0.00024965885677375;-3.7990626879036e-05;0.00033203352359124;1.3682076314581e-05;0.00010589060548227;1.5100015843927e-05;3.730662911039e-06;-1.4718407328473e-05;3.538305463735e-05;1.425689606549e-05;7.3342416726518e-05;0.00014069728786126;0.00065403286134824;-0.00017080997349694;0.00016134833276737;-0.00024129654048011;-7.9290541179944e-05;5.7424716942478e-05;-1.622995841899e-05;-6.2782106397208e-05;0.00024802319239825;6.0309739637887e-06;0.00013193933409639;2.5257088054786e-05;-0.00036276385071687;-0.00046177030890249;0.00011521562555572;0.00049521611072123;0.00014937538071536;-0.00048942549619824;0.00045226712245494;-0.00050981534877792;-1.1694698514475e-05;-0.00035745953209698;6.9502239057329e-05;2.7906660761801e-05;3.3482352591818e-05;-9.3927403213456e-05;-3.3435855584685e-05;0.0001618998212507;-0.00016475301526953;-0.0014094922225922;-0.00049439433496445;4.3506061047083e-05;0.00041903791134246;-4.0699556848267e-05;0.00015087354404386;6.0825019318145e-05;-7.2618960984983e-05;0.00047058626660146;0.00022018814343028;-5.8547513617668e-05;-0.00011225741036469;-9.4999886641745e-05;3.7804391467944e-05;0.0015218376647681;0.00045156182022765;-1.3496788824341e-06;-0.00023491549654864;-0.00072676001582295;5.2271170716267e-05;-0.00036632214323618;0.0002454025670886;0.00013554767065216;6.5855892898981e-05;-0.00014151442155708;-0.00022416330466513;-7.2503797127865e-05;0.00010475075396243;7.3343107942492e-05;-0.00031107544782571;0.00010687667963794;0.0014277929440141;-0.00029395156889223;-0.00011061137047363;-9.0192603238393e-05;-0.00020174332894385;4.2755917093018e-05;0.00011869257286889;-6.4023392042145e-05;-0.00014963703870308;1.5898160199868e-05;0.00023272547696251;-0.00011839398212032;-9.9327146017458e-05;8.86396264832e-06;-1.3448674508254e-05;0.00014638438005932;-1.8307346181246e-05;-0.00089233741164207;0.00023986310407054;0.00030986301135272;-0.00011150482896483;-0.00075081287650391;0.00017495367501397;0.00028056054725312;4.0612583688926e-05;0.00016954976308625;1.1107917998743e-05;-0.00013869862596039;3.7564976082649e-05;9.1832036559936e-05;6.5571315644775e-05;-0.00068645260762423;0.0001897670008475;-0.0014524714788422;-0.00014061118417885;-0.00010864677460631;-0.00041320626041852;9.2548478278331e-05;2.385483821854e-05;-4.5560333091998e-05;-0.0001205121006933;7.0365487772506e-05;6.3388113630936e-05;-0.00021725200349465;0.00015576608711854;-0.00080219242954627;-0.0023175843525678;-0.00016279885312542;0.0032809756230563;0.00020859553478658;0.0005933974753134;0.0012550244573504;-3.1276693334803e-05;-4.0207410165749e-06;0.00052547588711604;-7.5917356298305e-05;2.8099726478104e-05;5.0663638830883e-05;-1.5984880519682e-05;-0.00010083762754221;0.00017289385141339;-0.00017912831390277;-0.001513859606348;-0.0005611052038148;2.2197185899131e-05;0.00045116705587134;-5.0539973017294e-05;0.00019485625671223;6.5159270889126e-05;-8.1063415564131e-05;0.00048498538671993;0.00024656215100549;-9.4760820502415e-05;-0.00012681975204032;-0.00010185255814577;2.8412370738806e-05;0.0016917125321925;0.00059942959342152;-1.1332620175608e-07;-0.00038831905112602;-0.00076991372043267;7.2743576311041e-05;-0.00047898085904308;0.00033574312692508;0.00015104837075341;8.4339240856934e-05;-0.00014509783068206;-0.00023225083714351;-8.2688173279166e-05;0.0001178930469905;8.7350483227056e-05;-0.00031977021717466;0.00010633060446708;0.0014284311328083;-0.00033817239454947;-0.00019935824093409;-9.0909496066161e-05;-0.00021621337509714;1.776586213964e-05;0.00012621753558051;-6.7848566686735e-05;-0.00015558120503556;2.5637807993917e-05;0.00022149067081045;-0.00013266458699945;-0.00011646966595436;2.1451685825014e-05;4.3439787987154e-05;4.6428209316218e-05;-2.2170377633302e-05;-0.00083082780474797;0.00023204817262013;0.00035789835965261;-4.965866173734e-05;-0.00073881563730538;0.00019822611648124;0.00032865806133486;3.7463258195203e-05;0.00017525539442431;1.0805982128659e-05;-0.00013658660463989;3.7498175515793e-05;0.00010612294136081;6.6601118305698e-05;-0.00083010463276878;0.00019875456928276;-0.0016192694893107;-0.0001207502282341;-0.00011687007645378;-0.00043538058525883;0.00010301002475899;2.1405026927823e-05;-1.7492651750217e-05;-0.00012457360571716;6.6009648435283e-05;6.8817287683487e-05;-0.00024846830638126;0.0001711451477604;-0.00083601480582729;-0.0024958001449704;-0.00017021635721903;0.0036434484645724;0.00017585913883522;0.00063525699079037;0.0013307720655575;-1.5251726836141e-05;-4.7792577788641e-06;0.00059052824508399;-9.4322087534238e-05;1.1825863111881e-05;5.1895058277296e-05;-4.6257996473287e-06;-0.00010753192327684;6.1680024373345e-05;-7.4852381658275e-05;3.3527121559018e-05;-0.00014493205526378;0.0008021600660868;-0.00055739091476426;-9.8568219982553e-05;0.00016663945280015;-2.7799540475826e-05;2.1898558770772e-05;-1.7099822798627e-05;7.6984448242001e-05;4.5142329327064e-05;-2.4828763343976e-05;0.00018913802341558;-0.00017404659593012;0.0001887528487714;0.00020958133973181;-2.0844736354775e-06;-0.0020470786839724;0.0016745624598116;0.00032646305044182;-0.00050514750182629;0.00016865029465407;-0.00017873148317449;-0.00038060572114773;0.00028376028058119;-5.963727744529e-06;-6.5449039539089e-06;-7.4287941970397e-05;7.1022383053787e-05;-0.00014110753545538;-6.7909379140474e-05;-0.00068291713250801;-0.00077476032311097;-4.9292160838377e-05;-2.9509159503505e-05;-0.00020155214588158;-0.00012268406862859;-9.6100275186473e-06;-4.6656823542435e-05;0.00025707844179124;0.00015563312626909;-0.00023373651492875;-0.000237668005866;3.0138438887661e-05;4.6080705942586e-05;0.0020803560037166;-0.00062671571504325;0.00012547674123198;-0.0005450175376609;-0.00041083266842179;0.00036767969140783;0.00023464068362955;0.00027205914375372;0.00035691040102392;0.00013119864161126;8.0878759035841e-05;-4.466683458304e-05;-9.5060322564677e-06;5.0183494749945e-05;4.5827851863578e-05;1.4251661923481e-05;2.8897364245495e-05;-0.0012658023042604;-0.0011627712519839;-0.00087842380162328;-0.00075779791222885;-8.918972525862e-06;-4.5214350393508e-05;2.0464838598855e-05;2.1637206373271e-05;0.00027718220371753;0.00024027345352806;-0.00015716135385446;-0.00016478270117659;-0.00017808831762522;-0.0001368945086142;0.00051891827024519;-0.00082227046368644;7.8499033406842e-05;0.0015198732726276;0.0012692178133875;8.1649828644004e-05;0.00012677782797255;0.00037552823778242;0.00037972794962116;0.00036377977812663;0.0003058424917981;-0.00015159801114351;-0.00013439118629321;0.00012880717986263;0.00011278685269644;6.2332299421541e-05;-7.3508046625648e-05;8.3447252109181e-05;-0.00010575979831629;0.0007886869716458;-0.0005698692984879;-0.00010467803076608;0.00015903613530099;-2.6611123757903e-05;2.3227199562825e-05;-3.3292377338512e-05;6.6281580075156e-05;5.5161861382658e-05;-1.5798023014213e-05;0.00019089849956799;-0.00017187943740282;0.00010242594726151;0.00014830037252977;-5.4197644203668e-06;-0.0020023114047945;0.0017214950639755;0.00034756810055114;-0.0004815129796043;0.00014903496776242;-0.00019613931362983;-0.00037930614780635;0.00028455897700042;7.4249260251236e-07;-1.846172722253e-06;-8.0530960985925e-05;6.5265121520497e-05;-0.00013500661589205;-7.1856266004033e-05;-0.0007092590094544;-0.00075247883796692;-4.4976684876019e-05;-4.3994743464282e-05;-0.00020134838996455;-0.00012321633403189;-1.2491280358518e-05;-4.340887608123e-05;0.00026057989452966;0.0001510092697572;-0.00023836802574806;-0.00023311338736676;3.4180695365649e-05;4.0781684219837e-05;0.0020719086751342;-0.00063685019267723;0.00012494462134782;-0.00052976934239268;-0.00040394044481218;0.00036962179001421;0.00023855740437284;0.00028552394360304;0.00034722621785477;0.00012447175686248;8.9636989287101e-05;-4.7393132263096e-05;-7.3179930950573e-06;5.2089304517722e-05;4.4257292756811e-05;1.1595073374338e-05;3.0877701647114e-05;-0.0012267961865291;-0.0011889155721292;-0.00082866713637486;-0.00079692405415699;-1.0265861419612e-05;-3.8889698771527e-05;1.7328380636172e-05;2.417551149847e-05;0.0002714391448535;0.00024474004749209;-0.00015298074868042;-0.00016762953600846;-0.00016732806398068;-0.00014820555225015;0.0005160957807675;-0.00080357532715425;8.0499514297117e-05;0.0014204335166141;0.0013484829105437;8.1163605500478e-05;0.00010953887976939;0.00036697299219668;0.00038401613710448;0.00034243028494529;0.00032433617161587;-0.00014843314420432;-0.00013728314661421;0.0001246313622687;0.00011713703133864;0.00012642017100006;-0.00010404886415927;0.00040882409666665;0.00082609138917178;-0.00027879443950951;0.00010487654799363;-0.00015259328938555;4.8281250201399e-05;4.855321458308e-05;-3.8354741263902e-05;-0.00020971646881662;-0.00020408409181982;9.2209818831179e-05;0.00012861180584878;1.5553680441371e-06;7.200275285868e-05;-0.0010566129349172;-0.00046548794489354;9.2712270998163e-06;0.00043577078031376;0.00037761012208648;0.00038010056596249;-0.00011750465637306;-9.7849137091544e-05;-0.00034401446464472;7.8714925621171e-05;-9.6202682470903e-05;7.124271360226e-05;0.00011910755711142;-6.8735665990971e-05;-9.524494089419e-05;5.1466176955728e-05;-0.00015107120270841;-0.00025651391479187;0.00058672693558037;-6.3069659518078e-05;-0.00030029693152755;-3.8934158510529e-05;-0.00011496753722895;-3.5166576708434e-05;7.4268973548897e-05;3.8139900425449e-05;-0.00011036664363928;-8.8964086899068e-05;6.9414731115103e-05;3.2449770515086e-05;-8.6975349404383e-05;0.00011546548921615;-0.00020254365517758;-3.7942631024634e-05;0.00011023592378478;-0.0002091865753755;0.00011899517267011;0.00028211815515533;0.00015191597049125;-0.00022560589422937;1.1172194717801e-05;0.0002239895547973;-2.631856204971e-06;0.00010113007738255;1.7046351786121e-05;-6.0298716562102e-05;3.4050153772114e-05;6.4386826124974e-05;0.00014388457930181;-0.00065065250964835;3.5000286970899e-06;-0.00098237162455916;-0.00021954608382657;-5.0692389777396e-05;4.2054484765686e-06;6.3726103689987e-05;-8.267931843875e-05;9.5667841378599e-05;5.3008279792266e-05;-9.6113438985412e-08;0.00010343439498683;-0.00017809215933084;-0.00043550875852816;-0.0013927555410191;-7.6536620326806e-05;-1.2070659067831e-05;0.002237904118374;0.00069770548725501;0.00032067784923129;-1.4553222172253e-05;3.8035974284867e-05;-8.7737404101063e-05;0.00036822137190029;3.1298150133807e-05;-5.2217379561625e-05;-6.4113584812731e-05;3.9916765672388e-05;5.5675107432762e-05;-6.4918197040242e-07;0.00020365277305245;0.00045702196075581;-0.0002305622183485;-0.00023311481345445;1.5710418210801e-06;8.3752274804283e-05;7.8438264608849e-05;-0.00015604194777552;-8.1650367064867e-05;-0.00063495885115117;7.7223681728356e-05;-0.00045117910485715;-7.9948265920393e-05;0.00020715336722787;-0.00053658860269934;0.00022827817883808;3.223146268283e-05;0.00038530954043381;-0.0004531106678769;-7.7631200838368e-05;-4.6668599679833e-05;-0.00010067944822367;0.00099912169389427;0.00011821897351183;-0.00010432442650199;1.0548137652222e-05;0.00026965042343363;-2.3545218937215e-05;2.8060301247024e-06;0.00018746127898339;-0.00031177274649963;5.139283985045e-07;0.0015656792093068;-0.00025049116811715;-0.0006502375472337;9.7920994448941e-05;-0.0002368602581555;-4.8741090722615e-05;0.00012951547978446;-0.00011484866263345;-0.0002486199082341;-2.5134066163446e-05;0.00011051188630518;-3.4363449231023e-05;-0.00014508576714434;-0.00073590670945123;1.018524835672e-05;-8.583575981902e-05;0.00058536004507914;-0.0004334649129305;-0.00015436006651726;0.0005525496089831;6.3337909523398e-05;-0.00047312691458501;8.5674102592748e-05;0.00042933158692904;3.6898629332427e-05;0.00018985054339282;7.3215969678131e-06;-0.0001032629807014;8.5149011283647e-05;3.7979290937074e-05;0.00031925120856613;5.0764469051501e-05;-0.0003061372844968;-0.00014405269757845;-0.00038119353121147;7.6920492574573e-05;7.3137009167112e-05;-4.3448468204588e-05;-0.00018485652981326;-0.00021674727031495;6.2198327213991e-05;0.00020121311536059;6.9639783760067e-05;6.4823958382476e-05;-0.00095442385645583;-0.0014536671806127;3.7248435546644e-05;0.0004053351294715;0.0018157464219257;0.00093570473836735;-0.00013416666479316;-4.0448601794196e-05;-0.00035331299295649;6.1744118283968e-05;-7.4480572948232e-05;7.4657415098045e-05;0.00013781858433504;-8.6198597273324e-05;-0.00013619716628455;8.1532862168388e-06;5.7930628827307e-05;0.00011906268628081;0.00012093134137103;-0.00013090077845845;-0.00034602006780915;2.2801839804742e-05;9.1460271505639e-05;7.738707063254e-05;-0.0001711031945888;-2.0392681108206e-05;-0.00065192166948691;6.6360786149744e-05;-0.00057691184338182;-7.3943119787145e-05;0.00021219889458735;-0.00023761020565871;0.00030290288850665;2.7041120119975e-05;0.00021756673231721;-0.00046977537567727;-0.00013389735249802;-1.2817519746022e-05;-9.316042996943e-05;0.0013208179734647;8.4226463513914e-05;-8.84335313458e-05;-1.0991512681358e-05;0.00025719427503645;-1.3414848581306e-05;4.525789336185e-05;0.00018108355288859;-0.00027722527738661;7.1278780524153e-05;0.0013928925618529;-0.00024431166821159;-0.00082812702748924;8.8693399447948e-05;-0.00023044073896017;-3.8073656469351e-05;0.00011521335545694;-0.00012939913722221;-0.00023966653679963;1.7111724446295e-06;2.2968280973146e-05;-3.4620934457052e-05;-0.00015323130355682;-0.00081216293619946;-9.7471966000739e-05;-9.6867319371086e-05;0.0005849621957168;-0.00017957217642106;-0.00011821715452243;0.0006020509172231;2.3217718990054e-05;-0.00029721806640737;7.9259974882007e-05;0.00047244885354303;3.9466642192565e-05;0.00016882110503502;-3.4004960980383e-06;-6.4062143792398e-05;7.0319605583791e-05;4.5600372686749e-05;0.00031519791809842;0.00015456945402548;-0.00031183948158287;0.0001684051239863;-0.00035856655449606;0.00012346083531156;8.2877617387567e-05;-8.1762613262981e-05;-0.00016828613297548;-0.00026431039441377;5.3338739235187e-05;0.00020291605324019;4.5782042434439e-05;0.00013624016719405;-0.00089533801656216;-0.0011558043770492;9.1036847152282e-05;0.00039544265018776;0.0014034525956959;0.00080687878653407;-0.00032303473562934;-4.9079731979873e-05;-0.00036304877721705;9.0676221589092e-05;-0.00021678682242054;6.9194495154079e-05;0.00015861666179262;-7.4489325925242e-05;-0.00015165924560279;0.0001738628197927;-0.00014563134755008;-0.001210578950122;-0.00032667294726707;0.00014897559594829;0.00032860293867998;4.2180538173398e-08;2.4356231733691e-05;3.8848385884194e-05;-4.3805826862808e-05;0.00036267854738981;0.00016011443221942;4.2725696403068e-05;-7.804009510437e-05;-4.9031783419196e-05;5.944475196884e-05;0.0011417618952692;8.0957892350852e-05;1.3729492138737e-06;0.00012277901987545;-0.00061451934743673;-2.8226895665284e-05;-6.6590087953955e-05;6.6587606852408e-05;9.0829496912193e-05;-2.9853228625143e-05;-0.0001228115579579;-0.00016778048302513;-4.671392889577e-05;4.7493889724137e-05;3.8822072383482e-05;-0.0002802123199217;8.4089020674583e-05;0.0014646134804934;-0.00019921302737202;0.00032068623113446;-5.4439718951471e-05;-0.00012757771764882;0.00010857992310775;8.5943793237675e-05;-5.7332024880452e-05;-0.00010024900984718;1.4465168533206e-05;0.00030591216636822;-9.778123057913e-05;-3.9630980609218e-05;-2.4373544874834e-05;-5.3161333198659e-05;0.00056995719205588;4.2123847379116e-05;-0.0012453512754291;0.00018009150517173;3.41026498063e-05;-0.00033744459506124;-0.00088998751016334;0.00011645514314296;8.5416890215129e-05;5.3504314564634e-05;0.00013281009159982;8.2313636085019e-06;-0.00014616288535763;4.5934451918583e-05;-1.6942516595009e-05;8.9894303528126e-05;-6.0379607020877e-05;6.7366294388194e-05;-0.00085034378571436;-0.00017731310799718;-8.8083608716261e-05;-0.00028094323351979;5.76022612222e-05;2.1669797206414e-05;-0.00020630593644455;-9.8389049526304e-05;9.082328324439e-05;2.0156199752819e-05;-9.4421091489494e-05;9.1309251729399e-05;-0.00061383727006614;-0.0015002464642748;-0.00010458876931807;0.0018862938741222;0.00028740608831868;0.00039673736318946;0.00083449046360329;-0.0001125221097027;4.2755884351209e-05;0.00029817255563103;-1.4935983926989e-05;0.00013554919860326;4.1686376789585e-05;-8.1391895946581e-05;-6.1268809076864e-05;0.00026659367722459;-0.00023438087373506;-0.002013046760112;-0.00058628362603486;0.00013983414100949;0.00055166915990412;-1.5057294149301e-05;0.00010457571625011;5.7942128478317e-05;-7.6122261816636e-05;0.00058248819550499;0.00027571668033488;-4.3573214497883e-05;-0.00013253053475637;-8.4586317825597e-05;7.7111872087698e-05;0.0019744578748941;0.00032279282459058;-2.4867445063137e-06;-1.5451267245226e-05;-0.0010065458482131;1.0788538020279e-05;-0.00026065186830238;0.00032507113064639;0.00015852075011935;-4.4069406612834e-06;-0.00019796051492449;-0.00028005815693177;-8.5505802417174e-05;0.00011565500608413;7.5430347351357e-05;-0.00042525006574579;0.00012298223737162;0.0021198124159127;-0.00037655964842997;0.00035063296672888;-5.6965822295751e-05;-0.00021515552361961;0.00013544298417401;0.00013805500930175;-9.0478359197732e-05;-0.00017589968047105;3.9278373151319e-05;0.00042121380101889;-0.00016480224439874;-7.1484406362288e-05;-1.5688541679992e-05;6.4505300542805e-05;0.00072605593595654;4.2481031414354e-05;-0.0017957272939384;0.00021625519730151;0.000143846438732;-0.0004235609958414;-0.0012419200502336;0.00021197796741035;0.00018208105757367;6.1202372307889e-05;0.00021820624533575;9.1126530605834e-06;-0.00021824271243531;6.8593355535995e-05;1.2389133189572e-05;0.00012504711048678;-0.00045522916479968;0.00010793927503983;-0.0015889732167125;-0.00023550630430691;-0.00015190748672467;-0.00048355048056692;0.0001095957995858;2.8601771191461e-05;-0.00018279447976965;-0.00014790995919611;0.00011177353007952;3.9791073504603e-05;-0.00021348033624236;0.00017347768880427;-0.00091789016732946;-0.0026573343202472;-0.00019067620451096;0.0034985886886716;0.00036732765147462;0.00071575085166842;0.0014589678030461;-0.00011892681504833;6.5299202105962e-05;0.00057905883295462;-5.9768441133201e-05;0.00013184966519475;6.3270024838857e-05;-7.7514712756965e-05;-0.00010726584150689;0.00025858436129056;-0.00023091415641829;-0.0020012964960188;-0.00060308916727081;0.00011639125295915;0.00053872360149398;-1.755250741553e-05;0.00013568536087405;4.8488705942873e-05;-7.4011804827023e-05;0.00054949196055532;0.00027808171580546;-0.00010265535092913;-0.00013319709978532;-7.3040529969148e-05;6.1140875914134e-05;0.0020084222778678;0.00043236682540737;-1.0643447012626e-06;-0.00017035051132552;-0.00097561330767348;2.7267256882624e-05;-0.00034099788172171;0.00044691321090795;0.00015893740055617;-2.8224071684235e-06;-0.00018551740504336;-0.00026903496473096;-8.8223692728207e-05;0.00012778310338035;8.1103607953992e-05;-0.00039623072370887;0.0001034645611071;0.0019080679630861;-0.00041320765740238;0.0003072201507166;-1.4173006093188e-05;-0.00020504913118202;0.00011154473031638;0.00012939498992637;-8.8194647105411e-05;-0.00016552890883759;5.7183748140233e-05;0.00037222844548523;-0.00017020206723828;-6.6831526055466e-05;2.4034585521804e-07;0.00021945757907815;0.00065515044843778;3.8732796383556e-05;-0.0016988917486742;0.00011836189514725;0.0001516137708677;-0.00036609810194932;-0.0011085729347542;0.00022373901447281;0.00017882129759528;4.0548449760536e-05;0.00020694028353319;4.5441024667525e-06;-0.00020041788229719;6.6143737058155e-05;1.7678525182419e-05;0.00011504640133353;-0.00061265449039638;6.0303547797957e-05;-0.0016361870802939;-0.00019896069716197;-0.00015511433593929;-0.00047144133714028;0.00011390021245461;2.2109288693173e-05;-0.0001076765183825;-0.00012903677998111;8.0990052083507e-05;3.1571431463817e-05;-0.00023319308820646;0.0001780351594789;-0.00079527968773618;-0.0026455500628799;-0.00019022769993171;0.003550416091457;0.00030237817554735;0.00072677835123613;0.0014356909086928;-6.9357942265924e-05;8.0071840784512e-05;0.00060822296654806;-7.4514886364341e-05;9.138149471255e-05;5.5759446695447e-05;-4.9085265345639e-05;-0.00010205405123997;8.3759383414872e-05;-9.1472960775718e-05;-0.00032708700746298;9.1997135314159e-05;0.00067835027584806;-0.00042584229959175;-8.6527012172155e-05;0.00016275295638479;-4.1262799641117e-05;3.0502887966577e-05;5.8828278270084e-05;2.1495083274203e-05;-2.3547532691737e-05;1.96430592041e-05;0.00018274413014296;-0.00016363071335945;0.00025872880360112;0.00021532826940529;4.0157656258089e-06;-0.0015854162629694;0.0011999949347228;0.00028400670271367;-0.00047924782847986;0.00029925713897683;-0.00024173042038456;-0.00035554423811845;0.00024696553009562;-4.1776191210374e-05;1.7271468095714e-05;-3.522483893903e-05;4.266832547728e-05;-0.00017504088464193;-8.666514622746e-05;-0.00053832592675462;-0.00070677831536159;0.00040543457726017;0.00031997714540921;-0.00011862355313497;-5.3525811381405e-05;-2.0406534531503e-05;-5.5069514928618e-05;0.00024238870537374;0.00014787648979109;-0.00017607600602787;-0.00021147249208298;8.0865531344898e-05;8.6108993855305e-05;0.0024623486679047;0.00023795742890798;0.00012569573300425;-0.0013521974906325;-0.0010914832819253;7.4111012509093e-05;-2.7274963940727e-05;0.00018027216719929;0.0003253341128584;-4.7895573516143e-05;-5.45536277059e-05;-2.9989911126904e-05;-4.0023910514719e-06;2.5804396500462e-05;3.5206459870096e-05;-3.6168457882013e-05;-1.3871566579837e-06;-0.0013997507048771;-0.0012626246316358;-0.00086907314835116;-0.00069536094088107;-9.6871161076706e-05;-0.00013710360508412;3.1841747841099e-05;2.2397436623578e-05;0.00033266874379478;0.00026767436065711;-0.00020893781038467;-0.00020303059136495;-0.00014495692448691;-8.5096755356062e-05;0.00090061454102397;-0.0013328184140846;3.7017598515376e-06;0.0014908433659002;0.00114967871923;0.00037601389340125;0.00044020495261066;0.00044235080713406;0.00043689814629033;0.00035217011463828;0.00026179148699157;-0.00014483887935057;-0.00012112980039092;0.00012704296386801;0.00010325602488592;8.1825215602294e-05;-8.8264168880414e-05;-0.0002536027750466;0.00014177073899191;0.00065488344989717;-0.00044345296919346;-9.3163253040984e-05;0.00015505040937569;-3.8658123230562e-05;3.2063144317362e-05;3.8312515243888e-05;7.6925098255742e-06;-9.6710264188005e-06;3.0128889193293e-05;0.00018121891480405;-0.00016277635586448;0.00014894398918841;0.00015807279851288;1.121279709082e-07;-0.0015338428784162;0.0012506057973951;0.00030492502264678;-0.00045554697862826;0.00026832314324565;-0.00026222414453514;-0.00034727822639979;0.00025052932323888;-3.2468120480189e-05;2.3169377527665e-05;-4.3012823880417e-05;3.6334498872748e-05;-0.00016535182658117;-8.9957538875751e-05;-0.00057507446035743;-0.00067178497556597;0.00038680332363583;0.00030434926156886;-0.0001169358365587;-5.8032077504322e-05;-2.3329923351412e-05;-5.0790204113582e-05;0.0002451371983625;0.00013964362733532;-0.00018430431373417;-0.00020248176588211;8.1239391874988e-05;8.1806450907607e-05;0.0024315908085555;0.00020759008475579;0.00012332381447777;-0.0012947983341292;-0.0010816603899002;7.9222525528166e-05;-1.1534953046066e-05;0.00020276907889638;0.00030949388747104;-4.6832992666168e-05;-4.6668821596541e-05;-3.4176278859377e-05;-7.5448662073541e-07;3.018967618118e-05;3.1310020858655e-05;-3.6469402402872e-05;-1.9072174382018e-06;-0.0013527973787859;-0.0012739328667521;-0.00080792413791642;-0.00072968273889273;-9.5738992968109e-05;-0.00012728938600048;2.7475216484163e-05;2.5209859813913e-05;0.00032456932240166;0.00027015261002816;-0.00020208481873851;-0.00020350774866529;-0.00013216961815488;-9.7688243840821e-05;0.00088951963698491;-0.0012922671157867;8.1149091784027e-06;0.0013793507823721;0.0012177233584225;0.0003654737083707;0.00041133200284094;0.00042947978363372;0.00043483841000125;0.00032525186543353;0.00028026010841131;-0.0001414859725628;-0.00012278559734114;0.00012197944306536;0.00010700014536269;0.00019943821826018;-0.0001903558295453;0.00051684927893803;0.0014025119598955;-0.00041768865776248;-1.4271713553171e-05;-0.00011343518417561;1.8847949831979e-05;4.5627628423972e-05;-2.044002758339e-05;-0.00028155752806924;-0.0003270824381616;0.00011525762965903;0.00015529550728388;-3.031541564269e-05;5.0366532377666e-05;-0.0015378503594548;-0.00037248310400173;1.5993259694369e-06;0.0007191871991381;0.00023975467775017;0.00029963071574457;-6.5531974541955e-05;-0.00012096029240638;-0.00046421732986346;0.00013276471872814;-1.6874608263606e-05;8.8433080236427e-05;0.00018823410209734;-7.374314009212e-05;-0.00012699094077107;5.6218526879093e-05;-0.00025098118931055;-0.00038849958218634;0.0011249593226239;2.7299072826281e-05;0.00013273015792947;5.9299156419002e-05;-0.00013414886780083;-6.2819621234667e-05;9.0468340204097e-05;8.6317319073714e-05;-0.00014955649385229;-0.00014144174929243;0.00021010800264776;1.776238786988e-05;-4.0835566323949e-05;0.0003470488882158;0.00040473949047737;6.4495334299863e-06;-1.9371140297153e-05;-0.001133885816671;-0.0001954768813448;0.0001469233102398;0.00020460762607399;-0.00056561606470495;4.7492208068434e-06;0.00010932391160168;-1.4069225471758e-05;0.00015302083920687;4.9801397835836e-05;-0.00013512439909391;8.6180276412051e-05;-8.3816557889804e-06;-1.0588969416858e-05;-0.00055860093561932;-9.4281924248207e-05;-0.0011291748378426;-0.00028949751867913;-9.908880747389e-05;6.5790959524747e-06;8.2801780081354e-05;-9.0221023128834e-05;3.6125293263467e-05;1.665880336077e-05;1.3121007214068e-05;0.00012372416676953;-0.00018465332686901;-0.00042905565351248;-0.0017727577360347;-0.00011225841444684;0.0001419121545041;0.0024544743355364;0.00091876141959801;0.00047426187666133;8.8337619672529e-05;-1.6929758430706e-06;-7.5672869570553e-05;0.00043039192678407;3.4976954339072e-05;1.0379126251792e-05;-6.5126427216455e-05;2.3671586859564e-06;0.00016016371955629;-0.00014988888869993;0.00039566666237079;0.0011413290631026;-0.00035746299545281;-5.363485252019e-05;-6.2124847318046e-05;1.651476486586e-05;4.276719482732e-05;-3.5090903111268e-05;-0.00021842888963874;-0.00034181805676781;9.281874372391e-05;3.9294751331909e-05;-4.4390282710083e-05;6.5652784542181e-05;-0.0012084842892364;-0.00017748530081008;5.0777257456502e-06;0.00062283297302201;1.8133207049686e-05;0.00015744018310215;-3.6907968024025e-05;-0.0001000837146421;-0.00018430264026392;0.00012601348862518;-1.6989928553812e-05;6.502238829853e-05;0.00018325452401768;-5.2441406296566e-05;-9.2447182396427e-05;7.8395380114671e-05;-0.00024680583737791;-0.00027211767155677;0.0011707060039043;-3.0077591873123e-05;0.00010104179091286;7.8904027759563e-05;-0.00013209019380156;-5.5735381465638e-05;8.7681852164678e-05;3.7396232073661e-05;-0.00014641290181316;-0.00010705630847951;0.00020935894281138;-2.0305085399741e-06;-4.1949690057663e-05;9.8109514510725e-05;0.00040348913171329;1.029048462442e-06;0.00010245974408463;-0.0010313929524273;-0.00022591043671127;0.00014846766134724;0.00015621639613528;-0.00057425996055827;2.6141893613385e-05;0.00011268442904111;-2.8057916097168e-06;0.00014496376388706;4.109341170988e-05;-0.00012949398660567;8.5047977336217e-05;-1.4575319255528e-05;4.2061088606715e-05;-0.00030496643739752;-0.00013609640882351;-0.00082420144462958;-0.00026595761300996;-6.842289440101e-05;1.6214153220062e-05;5.5848173360573e-05;-0.00010187300358666;-3.5883545933757e-05;2.088451947202e-05;5.1055831136182e-05;9.7435789939482e-05;-0.00011723476200132;-0.00048717192839831;-0.0014966713497415;-8.2775986811612e-05;0.00020462476823013;0.0019737218972296;0.00080778903793544;0.00034359295386821;6.1750193708576e-05;-7.5992444180883e-05;-3.818673940259e-05;0.00029567361343652;3.9618353184778e-05;4.8162732127821e-05;-6.0684593336191e-05;-3.2786578231025e-05;9.2812297225464e-05;-6.7079687141813e-05;0.00024144593044184;0.00067808158928528;-0.00025107097462751;-0.00014736063894816;-9.9440721896826e-06;3.5310571547598e-05;5.0609010941116e-05;-8.1449405115563e-05;-0.00012403920118231;-0.00042191322427243;7.1156086050905e-05;-0.00019762082956731;-5.8886627812171e-05;0.00011570200149436;-0.00072053476469591;6.1268001445569e-05;1.2602698006958e-05;0.00043817271944135;-0.00023747293744236;-1.9287006125523e-06;-1.2861872164649e-05;-8.3655591879506e-05;0.00038909364957362;0.00010669772746041;-4.0520000766264e-05;2.9728646040894e-05;0.00019471964333206;-2.8990329155931e-05;-3.2071729947347e-05;0.00012354174396023;-0.0002524736628402;-0.00010071107681142;0.0012549824314192;-0.00014071240730118;-0.0001751184463501;8.6531734268647e-05;-0.00015720546070952;-4.5960656279931e-05;9.5291681645904e-05;-4.4262786104809e-05;-0.00016290677012876;-5.5045511544449e-05;0.00016536349721719;-2.3104839783628e-05;-7.76400702307e-05;-0.000328713998897;0.00022947030083742;-2.9900005756645e-05;0.00033262264332734;-0.0006957005825825;-0.00019358580175322;0.00027340502128936;9.0948560682591e-05;-0.00051938224351034;5.8817837270908e-05;0.0002167699567508;1.7576207028469e-05;0.00014317553723231;2.2036290829419e-05;-0.0001081091031665;7.9184508649632e-05;1.1965499879807e-06;0.0001638723333599;-1.9018340026378e-05;-0.00020493149349932;-0.00038862533983774;-0.00026867043925449;-1.3530632259062e-07;3.8734964618925e-05;4.9180016503669e-06;-0.00012948973744642;-0.0001435556623619;3.6692275898531e-05;0.00011670897947624;6.5648695454001e-05;-1.2118593076593e-05;-0.0006520981551148;-0.0012195396702737;-2.022109401878e-05;0.00029308462399058;0.0015290202572942;0.00072329805698246;9.1741945652757e-05;6.397589459084e-06;-0.00019704014994204;1.8398159227218e-05;8.3353363152128e-05;5.092967330711e-05;0.00010058938642032;-6.220363866305e-05;-8.6121814092621e-05;0.00027143507031724;-0.00021072679373901;-0.0018392839701846;-0.00045265827793628;0.00010211601329502;0.00047235077363439;1.054860149452e-05;4.0609822463011e-05;2.6946549041895e-05;-4.8511530621909e-05;0.00040741317206994;0.00022334734967444;-6.9060290115885e-05;-9.7265328804497e-05;-3.4671720641199e-05;7.8079727245495e-05;0.0016722708242014;0.0001278155395994;-9.8515802164911e-06;0.00014899630332366;-0.00088960991706699;3.4514696380938e-06;-0.00010438798926771;0.00041810801485553;0.00011628453648882;-5.4593838285655e-05;-0.00017637954442762;-0.00020341116760392;-6.7128930822946e-05;8.7862310465425e-05;4.9904752813745e-05;-0.00032743674819358;6.5740481659304e-05;0.001818654127419;-0.0003120468754787;0.00061683007515967;2.4671646315255e-05;-0.00013321537699085;0.00015445354802068;9.7164986073039e-05;-7.8006538387854e-05;-0.00014694004494231;6.3350322307087e-05;0.00041494550532661;-0.00014376640319824;-1.5950152373989e-05;-2.438883529976e-05;0.00018242583610117;0.00094469427131116;8.1385333032813e-05;-0.0018691968871281;5.2430939831538e-05;-6.9127869210206e-05;-0.00051781057845801;-0.001138077583164;0.00015727643040009;1.348881960439e-05;4.5484219299396e-05;0.00017426896374673;-1.0863296893149e-06;-0.00019989065185655;6.96753631928e-05;-8.6914638814051e-05;0.00013564205437433;-8.1079044321086e-05;-4.2465035221539e-05;-0.0010852185077965;-0.0002035627985606;-0.00013596267672256;-0.00034409438376315;8.6620464571752e-05;1.5582079868182e-05;-0.00019978005730081;-0.00011037968943128;0.00010267254401697;-5.8385335250932e-06;-0.00013392175605986;0.00012436138058547;-0.0005929809412919;-0.0018731136806309;-0.0001361330068903;0.0022877168375999;0.0003237507189624;0.00053966575069353;0.0010359822772443;-0.00016761355800554;0.00011896203795914;0.0004116258060094;-3.1255778594641e-05;0.00016303274605889;4.8795718612382e-05;-9.6835108706728e-05;-6.7261113144923e-05;0.00029673881363124;-0.00023439350479748;-0.0020941651891917;-0.00051717821042985;0.00011453438492026;0.00051745906239375;1.4567736798199e-05;6.7526336351875e-05;1.6794487237348e-05;-4.9918933655135e-05;0.00044824188807979;0.0002499088877812;-0.00014046535943635;-0.0001072569648386;-2.3563799913973e-05;7.4081515776925e-05;0.0019270370248705;0.00022878387244418;-8.1826801761054e-06;3.2158761314349e-05;-0.00097798265051097;9.5854202299961e-06;-0.00017641059821472;0.00059374660486355;0.00012780251563527;-7.2931390604936e-05;-0.0001863432553364;-0.00022956694010645;-7.610931788804e-05;0.00011675510904752;5.8746405557031e-05;-0.00034981517819688;5.4203104809858e-05;0.0018461694708094;-0.00040458995499648;0.00072003982495517;9.797781240195e-05;-0.00013573066098616;0.00016376668645535;9.8130178230349e-05;-8.7717518908903e-05;-0.00015062326565385;9.2844406026416e-05;0.00042155315168202;-0.00017150041821878;-1.8055667396766e-06;-1.1240967978665e-05;0.00042922038119286;0.0010850040707737;9.3940339866094e-05;-0.0021249251440167;-9.0339977759868e-05;-9.9246346508153e-05;-0.00056942680384964;-0.0011581997387111;0.00019562779925764;-1.4523428944813e-05;2.2637281290372e-05;0.00018788335728459;-6.6288921516389e-06;-0.0002113773371093;7.869339606259e-05;-9.7481410193723e-05;0.00014142305008136;-0.00027904083253816;-0.00013229686010163;-0.00126200215891;-0.00019906120724045;-0.00016015167057049;-0.00038239583955146;0.00010193623893429;1.1131529390696e-05;-0.00013474375009537;-9.6595045761205e-05;7.5464355177246e-05;-2.3299538952415e-05;-0.00016941553622019;0.00014645315241069;-0.00048705274821259;-0.0021208671387285;-0.00015640771016479;0.0026040428783745;0.00030439012334682;0.00063237367430702;0.0011626371415332;-0.00012609537225217;0.00016452446288895;0.00049211079021916;-4.8219288146356e-05;0.00013888138346374;4.4862568756798e-05;-7.7004784543533e-05;-6.8100394855719e-05;9.4836897915229e-05;-9.697864879854e-05;-0.00066317041637376;0.00026753774727695;0.00049649103311822;-0.0002479302638676;-5.3949643188389e-05;0.0001313107641181;-4.9732367187971e-05;3.4658794902498e-05;0.0001344057964161;-2.3365890228888e-05;-9.5568757387809e-05;5.7575231039664e-05;0.00015114074631128;-0.00012810291082133;0.00035389504046179;0.00020956934895366;6.2810790950607e-06;-0.0010556918568909;0.0006586717790924;0.00020248358487152;-0.00039298299816437;0.00041821695049293;-0.00027613114798442;-0.00029166071908548;0.00017732061678544;-7.7230055467226e-05;3.5328816011315e-05;1.108761443902e-05;1.1683840057231e-05;-0.00018825041479431;-8.8988686911762e-05;-0.00034161738585681;-0.00060653209220618;0.00077012047404423;0.00059519510250539;-3.0242967113736e-05;2.7565693017095e-05;-3.0398547096411e-05;-6.4142470364459e-05;0.00020089339523111;0.00012975165736862;-0.000104260223452;-0.00017527698946651;0.00011570154310903;0.00011040383105865;0.0025536299217492;0.00098507234361023;0.00014268199447542;-0.0019262783462182;-0.0015401463024318;-0.00022337668633554;-0.00030790458549745;6.7002176365349e-05;0.00027481696452014;-0.00019590905867517;-0.00016479447367601;-1.1993869520666e-05;-1.1127702919111e-06;7.9056019330892e-07;2.7600221073953e-05;-9.0035850007553e-05;-3.2932355679804e-05;-0.0013753537787125;-0.0012174147414044;-0.00072259025182575;-0.00050089583965018;-0.00013752850645687;-0.00018433091463521;3.5123917768942e-05;1.5990661268006e-05;0.00036131317028776;0.00027114758267999;-0.00022970110876486;-0.00021632849529851;-0.00010458468750585;-2.5336534235976e-05;0.0012158780591562;-0.0014116872334853;-3.4647655411391e-05;0.0012246029218659;0.00078929448500276;0.00048095273086801;0.00056772888638079;0.0004347400390543;0.00043447862844914;0.00029844685923308;0.00017778854817152;-0.00012544865603559;-9.7076517704409e-05;0.00011418883514125;8.4217776020523e-05;8.4624152805191e-05;-8.6992018623278e-05;-0.00053891161223873;0.00034162457450293;0.00045338133350015;-0.00026798847829923;-6.087910514907e-05;0.0001211827257066;-4.4539814552991e-05;3.6147997889202e-05;0.00010522623051656;-4.5575321564684e-05;-7.3297225753777e-05;7.2323950007558e-05;0.00014356953033712;-0.00012656672333833;0.00019006332149729;0.00014970793563407;1.8355300426265e-06;-0.00097688578534871;0.00071074336301535;0.00022135803010315;-0.0003635081811808;0.00036156660644338;-0.00030336956842802;-0.000270508317044;0.00018119179003406;-6.2288992921822e-05;4.4098556827521e-05;-1.526560140519e-07;2.8181973448227e-06;-0.00016869080718607;-8.9540575572755e-05;-0.0003965835494455;-0.00054348260164261;0.0007106619887054;0.00057131587527692;-2.5612929675844e-05;1.9135692127747e-05;-3.3722550142556e-05;-5.7761582866078e-05;0.00019909413822461;0.0001120733722928;-0.00011734546569642;-0.00015631313726772;0.00011036010255339;0.00010580960224615;0.0024653407745063;0.00091811135644093;0.00013696459063794;-0.0017875345656648;-0.001511566573754;-0.00021197267051321;-0.00027608490199782;0.0001070624566637;0.00024659500923008;-0.00018328048463445;-0.00015672293375246;-1.9004379282705e-05;3.8298348954413e-06;9.2466061687446e-06;1.9618286387413e-05;-8.7612694187555e-05;-4.0185728721553e-05;-0.0012982505140826;-0.001192850060761;-0.00062396883731708;-0.0005164765752852;-0.0001291486696573;-0.00016579210932832;2.7659463739838e-05;1.9033475837205e-05;0.00034676707582548;0.00026995028019883;-0.00021743636170868;-0.00020993239013478;-8.6329986515921e-05;-3.9355894841719e-05;0.0011936218943447;-0.0013012014096603;-2.3700256861048e-05;0.001053623505868;0.00082466442836449;0.00044144966523163;0.00050502299563959;0.00041111349128187;0.00041366461664438;0.00025600689696148;0.00019314108067192;-0.0001204934596899;-9.5754410722293e-05;0.00010702446161304;8.5746112745255e-05;0.00015902718587313;-0.00016195335774682;0.00036882751737721;0.0011515381047502;-0.00030526431510225;-6.3491192122456e-05;-5.9164223785046e-05;-8.2612796177273e-06;1.9488999896566e-05;1.2053375940013e-05;-0.00020746092195623;-0.00022138735221233;7.8066899732221e-05;0.00016051586135291;-2.2567397536477e-05;-1.1473374570414e-06;-0.0011945621808991;-0.00023576345120091;-6.5486633502587e-06;0.00055249262368307;0.00017236948770005;0.0001755625999067;-1.4008013749844e-05;-7.7868986409158e-05;-0.00045620978926308;9.3683855084237e-05;4.3720054236474e-05;6.3595987739973e-05;0.00013365500490181;-4.8699854232837e-05;-0.0001002391873044;8.9835530161508e-06;-0.000176164045115;-0.00034058999153785;0.00077581172809005;0.00013189531455282;0.00035480275982991;7.6056494435761e-05;-6.8909968831576e-05;-5.0379516324028e-05;4.9409733037464e-05;0.00010627757728798;-9.0323621407151e-05;-0.0001198896788992;0.00017041021783371;1.5662593796151e-05;1.4026002645551e-05;0.00051133369561285;0.0005856464849785;3.6730489227921e-05;-0.00021546873904299;-0.0011654101544991;-0.00027236295863986;-3.0344128390425e-05;0.00015749585872982;-0.00043528617243282;-2.5549705242156e-05;-2.8666194339166e-05;-2.1781312170788e-05;0.0001050066712196;4.8412181058666e-05;-0.00010683521395549;6.8257570092101e-05;-4.6581819333369e-05;-0.00016501898062415;-0.00038052228046581;-6.8724250013474e-05;-0.00076267030090094;-0.00018702943634707;-9.1267917014193e-05;-2.184332743127e-06;6.3087529269978e-05;-2.6125369913643e-05;3.5841167118633e-05;-2.6176852770732e-05;-1.5343084669439e-05;8.4816289017908e-05;-0.00012437126133591;-9.515570855001e-05;-0.0011836015619338;-8.5509964264929e-05;0.00010119975922862;0.0015041156439111;0.00061021646251902;0.00037576394970529;0.00013280713756103;2.7472058718558e-05;-5.0840899348259e-05;0.00030638364842162;1.1364954843884e-05;1.6314636013703e-05;-2.8732752980432e-05;2.215903123215e-06;0.00023375540331472;-0.00024530448717996;0.00052819028496742;0.0017192822415382;-0.00048973300727084;-3.60369340342e-05;-7.6552096288651e-05;-7.880373232183e-06;3.4453430998838e-05;4.6498607844114e-06;-0.00030095819965936;-0.00033178058220074;0.0001120498709497;0.00020976048836019;-4.9901915190276e-05;1.8545933926362e-05;-0.00174263457302;-0.00028229274903424;-6.3414569240194e-07;0.00087739975424483;0.00010769246728159;0.00021949381334707;-3.7076559237903e-05;-0.00011583090963541;-0.00062919571064413;0.00016400071035605;3.553810165613e-05;9.1537694970611e-05;0.00019793612591457;-6.6613079980016e-05;-0.00014186085900292;2.5603801987018e-05;-0.00025943995569833;-0.00043708010343835;0.0012884063180536;0.00013300143473316;0.00048232576227747;0.00011888428707607;-0.00010775588452816;-7.3976392741315e-05;8.1492435128894e-05;0.00013255541853141;-0.0001630935294088;-0.00016319235146511;0.00028501599445008;9.8955897556152e-06;7.0176010922296e-06;0.0005519698606804;0.00084277964197099;5.0838094466599e-05;-0.00019339993014;-0.001677131280303;-0.00040921609615907;-2.8082877179259e-05;0.00020687520736828;-0.00070987059734762;-1.2595195585163e-05;-1.9879696992575e-05;-2.636362114572e-05;0.00016426926595159;6.8939822085667e-05;-0.00016879291797522;0.00011764259397751;-8.9711327746045e-05;-0.0001702599984128;-0.00038442449294962;-0.00011311178241158;-0.0010433428687975;-0.00027516923728399;-0.00012812689237762;-7.872162655076e-07;9.0158224338666e-05;-7.2040245868266e-05;5.9033309298684e-06;-2.5403111067135e-05;1.9983775928267e-05;0.00012255468755029;-0.00016381076420657;-0.00026579154655337;-0.0016881608171389;-0.00011615980474744;0.0001732276432449;0.0021351103205234;0.00088266166858375;0.00050882820505649;0.0001726807677187;-4.835013896809e-05;-6.8949659180362e-05;0.00041610281914473;2.9791639462928e-05;5.4858384828549e-05;-4.9837184633361e-05;-2.6066898499266e-05;0.00017535188817419;-0.0001884877710836;0.00037735686055385;0.0012945948401466;-0.00038768706144765;-1.7911726899911e-05;-3.9102516893763e-05;-3.762433607335e-06;2.9921893656137e-05;-9.1626652647392e-06;-0.00021963614562992;-0.00027068023337051;8.1930491433013e-05;0.00010864788782783;-5.2081071771681e-05;3.0190669349395e-05;-0.0012738447403535;-0.00012608693214133;5.4108568292577e-06;0.00069257366703823;-5.7036781072384e-05;0.00010902648500632;-2.9884211471654e-05;-8.6511754489038e-05;-0.00037854458787479;0.00013983571261633;1.5351268302766e-05;6.5015483414754e-05;0.00015568078379147;-4.4586300646188e-05;-9.5881900051609e-05;3.6284083762439e-05;-0.00020993819634896;-0.0002780839568004;0.0011395765468478;4.6312557969941e-05;0.00035094222403131;0.00010354394908063;-9.1476518718991e-05;-5.6953427701956e-05;7.0572175900452e-05;7.6225493103266e-05;-0.00014380308857653;-0.00011325952800689;0.00024984762421809;-6.3332781792269e-06;-4.387351054902e-06;0.00024287958513014;0.00065254740184173;3.6554520193022e-05;-3.5102955735056e-05;-0.0012860456481576;-0.00033643768983893;-7.6364676715457e-06;0.0001377706794301;-0.00061993324197829;1.3887640307075e-05;1.3143543355909e-06;-1.3795971426589e-05;0.00013387588842306;5.118938133819e-05;-0.00014013676263858;0.0001054043896147;-8.4692488599103e-05;-7.6817123044748e-05;-0.00011906596046174;-0.00012060194421792;-0.00070040248101577;-0.00021278619533405;-8.9542612840887e-05;4.3962372728856e-06;6.2037630414125e-05;-8.2394857599866e-05;-5.2296221838333e-05;-1.108698961616e-05;5.3462390496861e-05;8.637643622933e-05;-9.8521370091476e-05;-0.00032030112924986;-0.0012402926804498;-7.8106495493557e-05;0.00018908332276624;0.0015222491929308;0.00066404725657776;0.00034249399323016;0.00011697474110406;-0.00011223297042307;-3.5786826629192e-05;0.0002718920877669;3.2833078876138e-05;7.6840624387842e-05;-4.2521092836978e-05;-5.064190554549e-05;0.00025442079640925;-0.00018030288629234;-0.0017048201989383;-0.00032427639234811;4.1330804378958e-05;0.00038978972588666;2.7533278625924e-05;1.6545278413105e-05;-8.8085853349185e-06;-2.1911182557233e-05;0.00026529291062616;0.00016533743473701;-0.00015943302423693;-5.8850626373896e-05;1.4024212759978e-05;6.3471285102423e-05;0.0014391632284969;5.7790319260675e-05;-1.6749869246269e-05;0.00015502741734963;-0.00076307530980557;2.0665944248321e-05;-4.599115709425e-05;0.00061734608607367;6.8788402131759e-05;-8.8622473413125e-05;-0.00014615322288591;-0.00014553352957591;-4.7760888264747e-05;8.7633765360806e-05;2.8128462872701e-05;-0.00021314524929039;-8.0125355452765e-06;0.0013003810308874;-0.0003049905935768;0.00080121628707275;0.00018488126806915;-5.1443712436594e-05;0.00015521221212111;5.1036797231063e-05;-6.6952583438251e-05;-0.00012306805001572;0.00010498159826966;0.0003389316261746;-0.00013090393622406;4.284365058993e-05;-8.9569448391558e-06;0.00053838576423004;0.0011208940995857;0.0001085305120796;-0.0018921977607533;-0.00027763383695856;-0.00024428204051219;-0.00056516064796597;-0.00085809675510973;0.0001252738002222;-0.00013973178283777;-7.9273086157627e-06;0.00013202875561547;-1.4761789316253e-05;-0.00016429198149126;6.6959881223738e-05;-0.00017081323312595;0.00012613997387234;-1.7581309293746e-05;-0.00027063509332947;-0.00067450333153829;-0.00013197792577557;-0.00012453430099413;-0.00022936418827157;6.9667483330704e-05;-1.899036760733e-06;-8.5763975221198e-05;-4.3272633774905e-05;5.3898183978163e-05;-6.5140426158905e-05;-8.5239298641682e-05;9.421726281289e-05;-7.6908538176212e-05;-0.0012332700425759;-8.7455475295428e-05;0.0013127255951986;0.00019383325707167;0.00039725404349156;0.00068686640588567;-0.00015420133422595;0.00019896568846889;0.00028999551432207;-2.5003613700392e-05;0.00012826835154556;2.577424129413e-05;-7.4142029916402e-05;-2.5900157197611e-05;0.00018766263383441;-0.00013601165846922;-0.0013045558007434;-0.00017367795226164;7.3761177191045e-05;0.0002477771777194;2.4630478947074e-05;1.8209369955002e-05;-2.3265472918865e-05;-4.7457556320296e-06;0.00019803465693258;0.00010287885379512;-0.00015899701975286;-2.5418599761906e-05;3.5373072023503e-05;2.9984594220878e-05;0.0010524495737627;6.6580636485014e-05;-9.5630448413431e-06;1.5089895896381e-05;-0.00049882364692166;1.9787912606262e-05;-5.911611879128e-05;0.00054604856995866;9.7720412668423e-06;-0.00010266844037687;-8.2740560173988e-05;-0.00011253565753577;-2.5617460778449e-05;7.5195472163614e-05;1.4501150872093e-05;-0.00016001272888388;-3.0664792575408e-05;0.00077573693124577;-0.0003004647733178;0.00075293064583093;0.00027503108140081;-1.2728971341858e-05;0.00012377185339574;2.0733632482006e-05;-5.4913114581723e-05;-5.1349798013689e-05;0.00010298773122486;0.00021185980585869;-0.00011384313984308;6.3639796280768e-05;1.4958282008593e-05;0.00080043688649312;0.0010394791606814;0.00010372060205555;-0.001654616324231;-0.00050500605721027;-0.00027501405565999;-0.00048437874647789;-0.00054629723308608;0.00012010091450065;-0.00017588275659364;-5.2526575018419e-05;8.5003688582219e-05;-1.4415288205782e-05;-0.00010998621291947;5.1709506806219e-05;-0.00014934927457944;7.982302486198e-05;-0.00021042993466835;-0.00039568156353198;-0.00046957543236203;-0.00010101974476129;-0.00010445405496284;-0.00016587623395026;5.0284659664612e-05;-5.7692586779012e-06;2.6804191293195e-05;2.1952984752716e-05;-1.1974453627772e-05;-9.0464556706138e-05;-6.1729522712994e-05;6.7994886194356e-05;0.00026736600557342;-0.00091084284940735;-6.0335387388477e-05;0.00085759325884283;0.00013228300667834;0.00031706300796941;0.00049648701678962;-3.6278230254538e-05;0.00021890518837608;0.00021428566833492;-1.1760605048039e-05;6.1635000747629e-05;1.5258170833476e-06;-2.8489441319834e-05;2.6809333419919e-08;0.0001269191125175;-0.00010948004637612;-0.00095970887923613;1.1024775631086e-05;0.0002136971015716;6.3021318055689e-05;1.0723618288466e-05;5.2401344873942e-05;-4.0448478102917e-05;1.4522866877087e-05;0.00017817212210502;4.3960590119241e-05;-0.00015371400513686;1.2606845302798e-05;7.1887821832206e-05;-2.997275441885e-05;0.0007187481969595;0.00016282011347357;5.2139280342089e-06;-0.00033886200981215;-0.00013251074415166;3.2491614547325e-05;-0.00016713970398996;0.00047522888053209;-9.0669593191706e-05;-0.00015694188186899;1.5860179701122e-05;-0.00010172389738727;-3.0567892395084e-07;6.4822765125427e-05;7.3544906626921e-06;-0.00016523839440197;-4.9624235543888e-05;0.00022353447275236;-0.00040194630855694;0.0007769686053507;0.00045418323134072;9.5871791927493e-06;9.0190886112396e-05;-7.4966192187276e-06;-5.443246482173e-05;7.0221700298134e-05;0.0001113821126637;5.9179546951782e-05;-0.00012586366210598;9.0845904196613e-05;6.2016726587899e-05;0.0014432650059462;0.0010723189916462;0.00011080528202001;-0.0016828493680805;-0.00096144492272288;-0.00030803849222139;-0.00042555714026093;-0.00023534521460533;0.00017042843683157;-0.00021101976744831;-0.00012795066868421;3.6531950172503e-05;-1.0518554518057e-05;-5.2219915232854e-05;3.8085803680588e-05;-0.00010121410741704;1.6258520190604e-05;-0.00073397718369961;-0.00066566350869834;-0.00049658981151879;-0.00014913128688931;-0.00010986331471941;-0.00015863816952333;3.9254202420125e-05;-3.3777707812988e-06;0.00019550394790713;0.00012612409773283;-0.00012665460235439;-0.00013724844029639;-6.9940084358677e-05;4.705723040388e-05;0.00073841010453179;-0.00098004599567503;-5.6898625189206e-05;0.00084641965804622;0.00019143770623486;0.00036639935569838;0.00048701022751629;0.00020311702974141;0.0002876047801692;0.00021936027042102;2.1769916202174e-05;-3.6299657949712e-05;-3.6639790778281e-05;4.5646720536752e-05;3.0808634619461e-05;9.4842005637474e-05;-9.0490917500574e-05;-0.00084630912169814;0.00030002358835191;0.00031134305754676;-8.2177240983583e-05;-1.9342111045262e-05;8.7167471065186e-05;-4.9146598030347e-05;3.1465402571484e-05;0.00017548372852616;-3.7651712773368e-05;-0.00014045865100343;6.9423622335307e-05;0.00010787870269269;-8.0599333159626e-05;0.00043873535469174;0.00017643977480475;5.1336000979063e-06;-0.0005834216135554;0.00020285023492761;0.00011626843479462;-0.00027247375692241;0.00046743295388296;-0.000248233176535;-0.00021062590531074;9.7417454526294e-05;-9.5707750006113e-05;3.7631238228641e-05;4.5645545469597e-05;-8.5442643467104e-06;-0.0001733762328513;-7.4963398219552e-05;-0.00012887816410512;-0.00048389640869573;0.00090179091785103;0.0006677518831566;2.6536392397247e-05;8.2065453170799e-05;-3.1119165214477e-05;-6.406259490177e-05;0.00013905474042986;0.00010585707786959;-3.2862360967556e-05;-0.00013644350110553;0.00012140629405621;0.00010585496784188;0.0022301368881017;0.0013106401311234;0.00014339419431053;-0.0020318659953773;-0.0015505155315623;-0.00038304846384563;-0.00046203297097236;-4.1392515413463e-05;0.00021532352548093;-0.00026113117928617;-0.00020266469800845;6.1428813751263e-06;-1.5569796687487e-06;-2.0550996850943e-05;2.4405801013927e-05;-0.00012213081936352;-4.2602368921507e-05;-0.0011448168661445;-0.0010157899232581;-0.00050987070426345;-0.00027468986809254;-0.00013243498688098;-0.0001793286355678;3.1965362722985e-05;6.1456707953766e-06;0.00032975390786305;0.0002345203247387;-0.00020497979130596;-0.00019602800603025;-6.7308894358575e-05;1.9964913008153e-05;0.0012571500847116;-0.0011619756696746;-4.099841680727e-05;0.00085196411237121;0.00038773057167418;0.00042715581366792;0.00052427710033953;0.00034739371039905;0.00037332688225433;0.00022317015100271;8.9230699813925e-05;-9.1418405645527e-05;-6.77507778164e-05;8.7708060164005e-05;6.0666596255032e-05;6.3559207774233e-05;-6.2762708694208e-05;-0.00063430884620175;0.00045491542550735;0.00021693660528399;-9.7233831183985e-05;-2.707645035116e-05;7.0405032602139e-05;-3.9258931792574e-05;3.3336593332933e-05;0.00013550059520639;-8.7360982433893e-05;-0.00010499326162972;9.9752061942127e-05;8.7256492406595e-05;-7.5178519182373e-05;0.00014907454897184;9.9788456282113e-05;-5.374396323532e-07;-0.00041188337490894;0.00023639858409297;0.00013275501260068;-0.00022639428789262;0.00036382902180776;-0.00030061762663536;-0.0001603651617188;9.7225798526779e-05;-7.1876609581523e-05;5.6353273976129e-05;2.9573433494079e-05;-2.6812143914867e-05;-0.00013309885980561;-6.9840658397879e-05;-0.00022378971334547;-0.00035901428782381;0.00079442007699981;0.00065052497666329;4.4260312279221e-05;7.3350704042241e-05;-3.767848102143e-05;-5.4343508963939e-05;0.00012575194705278;6.4500847656745e-05;-5.418001092039e-05;-9.4606999482494e-05;0.00010992157331202;0.00010267485777149;0.0020646608900279;0.0012357191881165;0.00013404435594566;-0.001788726542145;-0.0015364326536655;-0.00038353298441507;-0.00042290677083656;3.7281064578565e-05;0.00016193273768295;-0.00024091618251987;-0.00020333996508271;-6.6713155320031e-06;7.5428483796713e-06;-4.6759455472056e-06;7.1685758484819e-06;-0.00012080446322216;-7.0206551754382e-05;-0.001017376082018;-0.00093287049094215;-0.00031270264298655;-0.00024257216136903;-0.00011242255277466;-0.00014667924551759;1.7511156329419e-05;9.8526588772074e-06;0.00031115018646233;0.00023299815075006;-0.00018619702314027;-0.00017843037494458;-3.3201689802809e-05;5.8366167650092e-06;0.00126681861002;-0.00091174512635916;-1.765049273672e-05;0.00051699340110645;0.00034212903119624;0.00033493983210064;0.00039812905015424;0.00030554909608327;0.00031507379026152;0.00014092162018642;9.5251278253272e-05;-8.440778037766e-05;-6.0522910644067e-05;7.7029137173668e-05;5.7605979236541e-05;0.00013249219045974;-0.00014385496615432;0.00028012238908559;0.0010022750357166;-0.00027269750717096;-2.4214188670157e-05;-3.4456545108696e-05;-1.2034748579026e-05;1.3142905118002e-05;1.374522162223e-05;-0.00016253406647593;-0.00017034403572325;5.650431921822e-05;0.00014283615746535;-2.771008075797e-05;-4.464666290005e-06;-0.00098566873930395;-0.00014400581130758;-1.79838002623e-06;0.00049927271902561;5.3253639634931e-05;0.00010681078128982;-1.3548463357438e-05;-5.6493077863706e-05;-0.0004114355542697;9.0569708845578e-05;3.6459670809563e-05;4.8773541493574e-05;0.00010502952500246;-3.3317828638246e-05;-8.2709200796671e-05;-5.4330930652213e-06;-0.00013026586384512;-0.00025996938347816;0.00065903208451346;0.00013180583482608;0.00036228698445484;7.6827447628602e-05;-4.286405237508e-05;-4.2034371290356e-05;3.5893564927392e-05;9.4402770628221e-05;-8.5350489825942e-05;-9.4988405180629e-05;0.00015691517910454;8.7894522948773e-06;2.199490518251e-05;0.00042503839358687;0.00058246671687812;4.201581759844e-05;-0.00021153345005587;-0.0010425972286612;-0.00027595111168921;-7.7064258221071e-05;0.0001125964554376;-0.00037744772271253;-2.3695380150457e-05;-5.5959782912396e-05;-2.0151534044999e-05;8.6371430370491e-05;4.2097603000002e-05;-9.3228496552911e-05;6.5542575612199e-05;-7.1027308877092e-05;-0.00016937038162723;-0.00020265355124138;-4.8812675231602e-05;-0.00052438589045778;-0.00013676568050869;-7.667356840102e-05;-4.6401019062614e-06;4.9766287702369e-05;-1.8616712623043e-05;1.5918561985018e-05;-3.3074775274144e-05;7.2135537720897e-07;6.5804248151835e-05;-8.3135826571379e-05;-2.3264776245924e-05;-0.00084882177179679;-6.0904614656465e-05;7.1131107688416e-05;0.0010173376649618;0.00044331813114695;0.00027817019145004;0.00012671302829403;-2.0453817342059e-05;-3.9659629692324e-05;0.00021840461704414;9.5884788606782e-06;3.1285206205212e-05;-1.8004389858106e-05;-1.343593976344e-05;0.00017040102102328;-0.00019836069259327;0.00034764385782182;0.0013467640383169;-0.00038184420554899;1.4132260730548e-05;-3.0941653676564e-05;-1.676401552686e-05;1.7261132597923e-05;1.5368479580502e-05;-0.00020192415104248;-0.00020178192062303;6.7899374698754e-05;0.00018148221715819;-4.890883792541e-05;-3.2674147405487e-06;-0.0012755846837536;-0.00012215159949847;5.1756496759481e-06;0.00069851003354415;-4.9499176384415e-05;9.5442614110652e-05;-3.0034221708775e-05;-7.3456190875731e-05;-0.00054973200894892;0.00013733566447627;3.8375455915229e-05;6.0226484492887e-05;0.00012593748397194;-3.7025987694506e-05;-0.00010067896801047;-1.7425645637559e-05;-0.00014720959006809;-0.00028959364863113;0.00092876487178728;0.00015364892897196;0.0004923238302581;0.00011052116315113;-4.887382601737e-05;-5.3929703426547e-05;4.7253488446586e-05;0.00012150855036452;-0.0001398738095304;-0.0001137496510637;0.00023318090825342;1.0947078408208e-06;2.8922453566338e-05;0.00045464001595974;0.0007991052698344;5.9102439990966e-05;-0.00023125116422307;-0.0013769650831819;-0.00039017337257974;-0.0001213618015754;0.00011750065459637;-0.00052876624977216;-1.799156962079e-05;-8.5016064986121e-05;-2.6890247681877e-05;0.00011591990914894;5.5651729780948e-05;-0.00013006741937716;0.00010472950089024;-0.00013269997725729;-0.00020964794384781;-7.2795752203092e-05;-6.879340071464e-05;-0.00056734151439741;-0.00016060991038103;-9.8481388704386e-05;-7.7131817306508e-06;6.2872604758013e-05;-4.1727915231604e-05;-1.6385736671509e-05;-4.5387318095891e-05;3.3914235245902e-05;7.92925056885e-05;-8.5610554378945e-05;-6.1333907069638e-05;-0.00096837239107117;-6.6369131673127e-05;0.00010415105498396;0.0011048609158024;0.00051401217933744;0.0003151319688186;0.00016807086649351;-0.00010844832286239;-4.4369346142048e-05;0.00024446457973681;1.9685010556714e-05;7.1802911406849e-05;-2.2216505385586e-05;-4.4684180465993e-05;8.3180289948359e-05;-7.2012844611891e-05;-0.00063638784922659;4.3609411477519e-06;0.0001307226048084;4.906821413897e-05;9.6536432465655e-06;3.1459097954212e-05;-2.7379390303395e-05;9.6930598374456e-06;0.00011886806896655;2.923525244114e-05;-0.00010654982179403;8.5675037553301e-06;4.5363263780018e-05;-1.7091935660574e-05;0.00047723256284371;0.00010559416841716;3.532855771482e-06;-0.00020316259178799;-0.00010769852087833;1.5865283785388e-05;-0.00010232977365376;0.00031887451768853;-5.6630673498148e-05;-9.9122436949983e-05;6.307692729024e-06;-6.8358807766344e-05;-4.5713977669948e-07;4.5854321797378e-05;3.748427843675e-06;-0.00010718923294917;-3.2789313991088e-05;0.00014258647570387;-0.0002617705904413;0.00051775935571641;0.00030251676798798;1.0160604688281e-05;6.1424529121723e-05;-6.0099391703261e-06;-3.5508906876203e-05;4.6388722694246e-05;7.4139432399534e-05;3.8461890653707e-05;-8.1919664808083e-05;6.1123020714149e-05;4.0656337660039e-05;0.00093561428366229;0.00071621825918555;7.3730523581617e-05;-0.0011025465792045;-0.00063040392706171;-0.0002122140431311;-0.00028648771694861;-0.00015202695794869;0.00011009269655915;-0.00014373171143234;-8.60299624037e-05;2.3805308956071e-05;-7.4747217695403e-06;-3.3921452995855e-05;2.534646409913e-05;-6.7834473156836e-05;1.0443189239595e-05;-0.00047819261089899;-0.00043396043474786;-0.0003045177727472;-8.0215082562063e-05;-6.9901172537357e-05;-0.00010046559327748;2.4890710847103e-05;-3.6404449019756e-06;0.00013280578423291;8.3318831457291e-05;-8.4284562035464e-05;-9.0948335127905e-05;-4.3353305954952e-05;3.3339518267894e-05;0.00050222937716171;-0.00060944864526391;-3.5811037378153e-05;0.00051636778516695;9.4595357950311e-05;0.00023003104433883;0.00030690009589307;0.00013204538845457;0.00018905896286014;0.00013688008766621;7.8122411650838e-06;-2.5149658540613e-05;-2.3918595616124e-05;3.0553521355614e-05;2.036982550635e-05;3.2316453143721e-05;-3.2248801289825e-05;-0.0004459593037609;0.00045704594231211;5.6691918871365e-05;-2.79231917375e-05;-1.0610651770548e-05;2.9495315175154e-05;-2.637127363414e-05;2.7476760806167e-05;0.00010191598994425;-0.00010228125029244;-8.166216139216e-05;0.00010276454122504;4.1436018364038e-05;-4.0541497583035e-05;-1.0675918929337e-05;3.4212473110529e-05;-3.3406715829187e-06;-7.1254144131672e-05;4.2444124119356e-05;7.5745520007331e-05;-0.00011015377094736;0.00024791757459752;-0.00026022319798358;-6.9748450187035e-05;4.975384217687e-05;-5.115083331475e-05;5.6151682656491e-05;2.8533209842863e-05;-3.9756221667631e-05;-7.9739918874111e-05;-4.6298737288453e-05;-0.00016144108667504;-0.00018239174096379;0.00061375240329653;0.00053592585027218;6.5251726482529e-05;7.3058981797658e-05;-3.3405183785362e-05;-3.8481433875859e-05;7.2887080023065e-05;2.1126432329766e-05;-3.186977119185e-05;-3.9970276702661e-05;8.2011276390404e-05;7.976663619047e-05;0.0014320944901556;0.0010477094911039;0.00010154741903534;-0.0013118917122483;-0.001209924579598;-0.00036060475395061;-0.00036856540828012;3.8095702620922e-05;8.2324761024211e-05;-0.00020139523257967;-0.00017813945305534;-6.1432724578481e-06;1.0658725841495e-05;-1.4454127494901e-06;-4.5030451474304e-06;-0.00010433744319016;-7.6482043368742e-05;-0.0006697874632664;-0.00061997619923204;-6.0590089560719e-05;-7.5763236964121e-05;-7.21488322597e-05;-9.3929971626494e-05;3.9357187233691e-06;5.1589863687695e-06;0.00023025805421639;0.00017420807853341;-0.000132758563268;-0.00012573260755744;4.5134611355024e-06;1.4943761016184e-05;0.0010427295928821;-0.0004636364756152;-5.0893468994673e-08;8.5609535744879e-05;6.5810068917926e-05;0.00018069082580041;0.00021794420899823;0.00019482307834551;0.00019497610628605;4.0281855035573e-05;4.2108182242373e-05;-5.3134168410907e-05;-3.402537186048e-05;4.8361038352596e-05;3.6000885302201e-05;2.8704480428132e-05;-2.8636373826885e-05;-0.00027364198467694;0.00033868668833748;2.078204852296e-05;-1.9615197743406e-05;-5.9414924180601e-06;1.5055617041071e-05;-1.7598254999029e-05;2.0405423128977e-05;5.7868965086527e-05;-7.2287446528208e-05;-5.2013641834492e-05;7.7039054303896e-05;2.4618997485959e-05;-2.7292111553834e-05;-5.2682556997752e-05;1.319423881796e-05;-2.8491745069914e-06;-1.2531386346382e-05;2.4800350729492e-05;4.8573230742477e-05;-6.3653678807896e-05;0.0001579068339197;-0.00019122344383504;-3.9366917917505e-05;3.4826676710509e-05;-3.1124953238759e-05;4.0783150325296e-05;1.8459271814208e-05;-3.1246407161234e-05;-5.5002641602186e-05;-3.4774977393681e-05;-0.00012128229718655;-0.00010649207979441;0.00041522667743266;0.00037541988422163;4.8002115363488e-05;4.8775451432448e-05;-2.3644473913009e-05;-2.5034873033292e-05;5.680242611561e-05;1.519428951724e-05;-2.6345876904088e-05;-2.2988391719991e-05;5.4682786867488e-05;5.5372995120706e-05;0.00095411634538323;0.00071917485911399;6.9700567109976e-05;-0.00086913700215518;-0.00083254947094247;-0.00025478904717602;-0.00025312515208498;2.9804135920131e-05;4.3669220758602e-05;-0.00013610837049782;-0.00012435912503861;-5.9195858739258e-06;8.9476898210705e-06;1.8620047512741e-06;-5.1980996431666e-06;-6.4852101786528e-05;-5.2564548241207e-05;-0.00045291436254047;-0.00041776060243137;-2.5069019102375e-05;-5.1758659537882e-05;-4.8536741815042e-05;-6.1622638895642e-05;9.5211828465835e-07;3.9886531340017e-06;0.00015406576858368;0.00011883963452419;-9.1788126155734e-05;-8.5743828094564e-05;7.5669549914892e-06;8.6510572145926e-06;0.00070531072560698;-0.00030263385269791;-1.2459084928196e-06;2.9325181458262e-05;4.4339016312733e-05;0.00012271926971152;0.00014369348355103;0.00013838370796293;0.00013170173042454;1.8691007426241e-05;2.999779280799e-05;-3.6160399758955e-05;-2.3056869395077e-05;3.2570878829574e-05;2.4910728825489e-05;-2.5939669285435e-05;4.2488599660828e-07;4.4058673665859e-05;2.5328965421068e-05;4.2146166379098e-05;0.00021534593543038;-0.00082594150444493;3.4916040021926e-05;7.2069360612659e-06;2.4930501240306e-05;4.8015390348155e-05;3.3431475458201e-05;-0.00019474496366456;3.8424121157732e-05;0.00013765004405286;-7.3142851761077e-05;-2.0358018446132e-05;0.00012509635416791;0.00070179556496441;9.823322216107e-06;-5.9558187786024e-05;-2.5135250325548e-05;-0.00048585829790682;-9.789843170438e-05;-9.7916235972662e-05;0.00041054090252146;-1.4286322766566e-05;8.0615434853826e-05;-2.9864655516576e-05;-6.2920727941673e-05;3.381445640116e-05;2.9918381187599e-05;2.5518340407871e-05;-0.00011973231448792;-0.00013436056906357;-0.00095645611872897;-0.00050841207848862;-0.00047087893472053;0.00010400788596598;-5.4459474085888e-07;0.00013443343050312;-0.00016584516561124;-4.481459109229e-05;-0.00020137129467912;3.5937635402661e-05;0.00017102403216995;-5.9506372053875e-05;-7.2253969847225e-05;-0.0013196666259319;-0.0010469018016011;0.0004433176945895;0.00051694095600396;0.0018221730133519;0.00095334195066243;0.00046439949073829;0.00017435646441299;0.00022107023687568;-2.1498561181943e-05;0.0001059982314473;-1.7321424820693e-05;-6.481211312348e-05;1.9386950498301e-06;2.5775168978726e-05;-1.9349288777448e-05;-8.485589933116e-05;-6.2223087297752e-05;-8.3565719251055e-05;0.00026177143445238;-6.8303372245282e-05;-0.00030350047745742;-0.00030940811848268;-1.0065432434203e-05;-2.9821974749211e-05;7.8813995060045e-05;-0.00011069176252931;-0.0001209900729009;0.00011850474402308;6.1902996094432e-05;1.8766731955111e-05;-9.4137860287447e-05;0.00088901777053252;7.8957615187392e-05;9.5415271061938e-05;-9.6794356068131e-05;-0.00050034665036947;0.00015990577230696;-9.6179479442071e-05;-4.051376163261e-05;0.00012547057121992;1.0034971182904e-06;1.1036219802918e-05;6.7013534135185e-05;3.7391968362499e-05;-2.5353790988447e-05;3.9116130210459e-06;3.5398948966758e-05;2.7251131541561e-05;6.6094456997234e-05;0.00014949498290662;-0.00073140161111951;0.00010944435780402;-7.9893761721905e-05;0.00010108971036971;4.9217102059629e-05;2.1993682821631e-05;-0.00019492681894917;6.8116125476081e-05;0.00017755609587766;-0.00013316211698111;-2.0160430722171e-05;0.00011182485468453;0.00057395990006626;2.3587923351442e-05;-6.4592495618854e-05;-6.4170533732977e-05;-0.00037962381611578;-9.6792784461286e-05;-7.4143295933027e-05;0.00036059954436496;-3.5277451388538e-05;8.237380097853e-05;-4.3487943912623e-05;-6.8696805101354e-05;4.97694236401e-05;3.7378453271231e-05;2.7826534278574e-05;-0.00014706142246723;-0.00013749965000898;-0.00098732486367226;-0.00061045977054164;-0.0003478103899397;7.235294469865e-05;-8.1170874182135e-06;0.00010965592082357;-0.00017823730013333;-7.2819122578949e-05;-0.00018629475380294;5.64409629078e-06;0.0001707247865852;-1.3132692401996e-05;-7.3392693593632e-05;-0.0014053761260584;-0.0012113356497139;0.00049714610213414;0.00051816774066538;0.0018373719649389;0.0011927823070437;0.00050373695557937;0.00024165588547476;0.00015340065874625;-2.9233313398436e-05;9.8662734671962e-05;1.3017096307522e-06;-5.5625107052037e-05;-4.0889358388085e-06;1.7034253687598e-05;-1.72231139004e-05;-7.4877840233967e-05;-5.7412147725699e-05;3.2679818104953e-05;0.00030447589233518;-0.0001569994201418;-0.00032867980189621;-0.00030504303867929;-8.4505838458426e-05;-8.0815198089113e-06;7.4385701736901e-05;-0.00013910001143813;-0.0001376823784085;0.00014192095841281;0.00010574988846201;3.0188863092917e-05;1.6892876374186e-05;0.0011475315550342;3.7808127672179e-05;5.0045702664647e-05;-0.00029017252381891;-0.00061195599846542;0.00010668110189727;-9.1276393504813e-05;-2.574793597887e-06;0.00011030036694137;1.2193262591609e-05;1.8139040548704e-05;6.2780309235677e-05;3.6777139030164e-05;-7.0590649556834e-06;-1.6967876945273e-05;5.6962937378557e-05;1.5695144611527e-05;-0.00014096053200774;0.00048844504635781;-0.0012805736623704;-7.3691342549864e-05;0.00025931638083421;-0.00017355082673021;5.1360602810746e-06;8.5933585069142e-05;-0.00013516565377358;-1.8280828953721e-05;9.7458279924467e-05;6.5596243075561e-05;-4.3840867874678e-05;5.3588417358696e-05;0.0010920042404905;5.0028407713398e-05;-2.1740637748735e-05;0.00033548116334714;-0.00090354081476107;-5.3769432270201e-05;-0.0002067424939014;0.00049426284385845;-7.2122015808418e-06;7.8122386184987e-05;-7.0922310442256e-06;-9.5310715551022e-05;7.468098829122e-06;-7.5740572356153e-06;3.1327985198004e-05;-2.8561758881551e-05;-0.00018228942644782;-0.00099507160484791;-0.00020054138440173;-0.0012885103933513;0.00023796121240593;0.00013180877431296;0.00011769124830607;-0.00011209087097086;4.232721767039e-05;-0.00035311304964125;0.00011258837912465;0.00018421548884362;-0.00012756619253196;-7.916685717646e-05;-0.0014128779293969;-0.00063021504320204;0.00032888661371544;0.00066572107607499;0.0023266945499927;0.00029736451688223;0.00034322266583331;-1.2579861504491e-05;0.00065289944177493;-5.3873773140367e-05;0.00015965447528288;-6.8993591412436e-05;-9.3612186901737e-05;1.4274242857937e-05;5.7065404689638e-05;-1.4411701158679e-05;-0.00013920590572525;-0.00013577473873738;-0.00050199526594952;2.373815914325e-05;0.0003837310068775;-0.00018481057486497;-0.00040870180237107;0.00021535529231187;-7.6027732575312e-05;8.9768975158222e-05;2.9819373594364e-05;-6.0430502344389e-05;-9.1281590357539e-06;-8.8627399236429e-05;-2.5506948077236e-05;-0.00070464314194396;4.6693912736373e-06;0.00027279969071969;0.00038801721530035;0.00067574868444353;-1.6160722225322e-05;0.00031979632331058;-7.0948830398265e-05;-0.00026231777155772;0.00015158153837547;-8.1997968663927e-05;-2.2843456463306e-05;0.00013508449774235;5.635705019813e-05;-2.2935690140002e-05;-1.2112876902393e-05;6.8239794927649e-05;3.2992345950333e-05;-4.5909775508335e-05;0.00046246108831838;-0.0013633063063025;-9.4851413450669e-05;0.00022092991275713;-0.00014509633183479;3.9975286199478e-05;7.2644033934921e-05;-0.00021005471353419;-1.3943759768154e-05;0.0001176274890895;4.2976604163414e-05;-3.8032721931813e-05;0.00015510537195951;0.0012252337764949;2.8897557058372e-05;-7.5320793257561e-05;0.0001337924040854;-0.00089717068476602;-0.00011039144737879;-0.00019010785035789;0.00060535140801221;4.5685492295888e-06;9.7833188192453e-05;-8.7210592027986e-06;-9.3665774329565e-05;1.2992397387279e-05;8.9025452325586e-06;3.4798100386979e-05;-6.945819768589e-05;-0.00019185636483599;-0.0012180625926703;-0.00038828843389638;-0.0011844352120534;0.00025171859306283;0.000105792634713;0.00016631877224427;-0.000169025384821;1.1661459211609e-05;-0.00035091605968773;0.00011661880853353;0.00021762581309304;-0.00014361101784743;-9.6244635642506e-05;-0.001654171035625;-0.00099834986031055;0.00044577219523489;0.00073250161949545;0.0026256027631462;0.00065427285153419;0.00047999055823311;6.3375635363627e-05;0.00059285323368385;-5.2713807235705e-05;0.00017276700236835;-6.4953703258652e-05;-0.00011009061563527;1.1604334758886e-05;6.3470433815382e-05;-2.1976726202411e-05;-0.00015916393022053;-0.00013884974760003;-0.00058637437177822;0.00013118403148837;0.0001622990675969;-0.00028150333673693;-0.00042423300328664;0.00016885303193703;-0.00010682771971915;0.00011013050243491;-5.2618615882238e-05;-9.6871561254375e-05;5.8059606089955e-05;-4.2978579585906e-05;-2.4410312107648e-05;-0.00070366909494624;0.0003494274278637;0.00030897921533324;0.00038477423368022;0.000693179666996;-0.00021551387908403;0.00039811222814023;-0.00010608448792482;-0.00016109003627207;0.000178393223905;-4.3960095354123e-05;-1.4475959687843e-05;0.00011738501052605;5.6353801483056e-05;-4.0503797208657e-05;7.8110377899065e-07;6.7177854361944e-05;4.9677280912874e-05;0.00017075451614801;0.00027331500314176;-0.0011591668007895;-6.1418199038599e-05;9.599400073057e-05;-6.284833943937e-05;8.5895175288897e-05;2.4138347725966e-05;-0.00024524264154024;6.0180436776136e-06;0.00016075922758318;-1.3935482456873e-05;-1.9641531253001e-05;0.00026011318550445;0.0011104692239314;-5.2471345952654e-06;-0.0001430232077837;-0.00024755496997386;-0.00061095255659893;-0.00019469157268759;-9.4533010269515e-05;0.00056875252630562;-3.6955066207156e-06;0.00010439492325531;-1.293144759984e-05;-8.9100911282003e-05;2.6246741981595e-05;3.1423496693606e-05;3.8576028600801e-05;-0.00011791029101005;-0.00017898732039612;-0.0013839600142092;-0.00066570949275047;-0.00084739492740482;0.00023238894937094;0.0001244004961336;0.00016133999451995;-0.00022190157324076;-5.5065891501727e-05;-0.00026853682356887;9.45100618992e-05;0.00018603210628498;-0.00010015600855695;-0.00011220106534893;-0.0018234710441902;-0.0015098247677088;0.00057534693041816;0.00072636554250494;0.0027309851720929;0.0012280911905691;0.00059282139409333;0.00020524655701593;0.0004247723845765;-6.5185289713554e-05;0.00015450714272447;-3.6414508940652e-05;-0.00011275467841187;-7.3337578214705e-06;5.562229489442e-05;-2.4565484636696e-05;-0.00016038506873883;-0.00013468813267536;-0.00061336968792602;0.00023959003738128;-0.00029369894764386;-0.00041030597640201;-0.00035089638549834;3.2378618925577e-05;-0.00012067474017385;0.0001150790048996;-0.00019191026512999;-0.00014739984180778;0.00014629808720201;5.8094257838093e-05;-1.6491625501658e-05;-0.00064450292848051;0.00089214596664533;0.00032145617296919;0.00034495606087148;0.00063180236611515;-0.00045073832734488;0.00042846341966651;-0.00011812230513897;7.393002306344e-05;0.00019092940783594;2.58366962953e-05;5.1240349421278e-06;7.2353512223344e-05;4.3689680751413e-05;-3.8339519960573e-05;1.1232766155445e-05;4.0376879042014e-05;4.5633172703674e-05;0.00021525828924496;7.8891855082475e-05;-0.00084283784963191;0.00011198674474144;-8.4991777839605e-05;9.5528004749212e-05;9.3202455900609e-05;-8.5857782323728e-06;-0.00022321626602206;7.2485374403186e-05;0.00021035100508016;-0.00013747758930549;-1.9936249373131e-05;0.00017716514412314;0.00070824974682182;4.2570994992275e-05;-0.00013228511670604;-0.0003268466971349;-0.00026599114062265;-0.0001928377605509;-2.1205778466538e-05;0.00042703657527454;-5.8891077060252e-05;9.227663394995e-05;-4.1458257328486e-05;-8.5034931544214e-05;5.7690165704116e-05;4.8229998355964e-05;3.8798971218057e-05;-0.00017127706087194;-0.00016274309018627;-0.0013402481563389;-0.00085827300790697;-0.00045496609527618;0.00011299536708975;7.3571769462433e-05;0.00012564119242597;-0.00023558361863252;-0.0001138749794336;-0.00020592460350599;1.9366962078493e-05;0.00017342125647701;-3.0974015317042e-06;-0.00010983297397615;-0.0018510119989514;-0.0017801549984142;0.00065195455681533;0.00066164549207315;0.002512743929401;0.0017025454435498;0.00063982815481722;0.00033652407000773;0.00021631579147652;-5.4838128562551e-05;0.00012286377022974;9.3568851298187e-06;-8.2070429925807e-05;-2.1906935216975e-05;3.0096529371804e-05;-1.701155633782e-05;-0.0001266205945285;-0.0001052819789038;-0.00026169783086516;0.00025988472043537;-0.00043368674232624;-0.00048825450357981;-0.00032311814720742;-0.00012262361997273;-5.455411519506e-05;8.2782506069634e-05;-0.00023435059119947;-0.00018642476061359;0.00018609630933497;0.00015422432625201;1.3373214642343e-05;-0.00032430220744573;0.001399704022333;0.00019929218979087;0.00019730691565201;6.6891370806843e-05;-0.00057451258180663;0.00025821223971434;-7.0752023020759e-05;0.00013825128553435;0.00016917899483815;4.4669748604065e-05;2.8701473638648e-05;5.9616613725666e-05;3.4908789530164e-05;-3.0166505894158e-05;2.4203953216784e-05;-4.1215816963813e-06;3.8826572563266e-05;0.00025729383924045;-0.00018591120897327;-0.00042227937956341;0.00030583224724978;-0.00021607613598462;0.00020158574625384;0.00010444232611917;-6.2399143644143e-05;-0.00014623890456278;0.00013512917212211;0.00021611746342387;-0.00021928548812866;-2.5012308469741e-05;1.877557770058e-05;0.00017380961799063;0.00015328904555645;-0.00012732854520436;-0.00045079810661264;0.00028552510775626;-0.00020134741498623;9.8840311693493e-05;0.00023209548089653;-0.00015795158105902;5.6794746342348e-05;-6.1382837884594e-05;-7.4655188655015e-05;8.2393096818123e-05;5.6704997405177e-05;3.7561760109384e-05;-0.00018542181351222;-0.00012172260903753;-0.0012077016290277;-0.00099799165036529;-0.00011161919974256;-3.8191654311959e-05;8.2293430750724e-05;6.7020577262156e-05;-0.00022210051247384;-0.00016990581934806;-0.00012288500147406;-5.7626828493085e-05;0.00012209625856485;0.00011783376976382;-0.00011512758646859;-0.0017554358346388;-0.0020258307922632;0.00066842109663412;0.00054357445333153;0.0022183151450008;0.0021330101881176;0.00060047797160223;0.00043771674972959;4.3085248762509e-05;-4.1474908357486e-05;8.350391726708e-05;6.4085936173797e-05;-5.1873561460525e-05;-5.0792365072994e-05;1.0242967618979e-05;1.9328251710249e-06;-0.00011542615538929;-9.9922981462441e-05;-0.00012182276259409;2.6923644327326e-05;-0.00059128046268597;-0.00058525992790237;-0.00024071313964669;-0.00025685413856991;-9.3364533313434e-06;1.2993134077988e-05;-0.0002607015776448;-0.00021385563013609;0.00018751133757178;0.00023644277825952;1.8499638827052e-05;-0.00033053362858482;0.0015962609322742;0.00020220564329065;0.0001696596009424;-0.00014560637646355;-0.00027870174380951;0.00014910539903212;7.0100162702147e-05;0.00023351662093773;0.00016310019418597;5.9009300457546e-05;5.4575426474912e-05;4.2721123463707e-05;1.5214181985357e-05;-1.9880406398443e-05;2.9044260372757e-05;-2.6372301363153e-05;2.0790454072994e-05;0.00016477251483593;-0.00024835061049089;-0.00018719768559095;0.00050888274563476;-0.00020788752590306;0.00017418750212528;7.936566544231e-05;-7.4987132393289e-05;-9.0660665591713e-05;0.00017287218361162;0.00017819817003328;-0.00023021426750347;-2.2921753043192e-05;-7.6053802331444e-05;-0.00020236193086021;0.0001851799315773;-9.4419337983709e-05;-0.00029657615232281;0.00041677459375933;-0.00014089742035139;0.00013468961697072;0.00011712229752447;-0.00025409954832867;3.555243529263e-05;-7.54643115215e-05;-6.0155824030517e-05;9.106829384109e-05;5.5246346164495e-05;3.3154785342049e-05;-0.00018840443226509;-9.6985735581256e-05;-0.0010329771321267;-0.0010210692416877;4.7811194235692e-05;-0.00020692367979791;0.00010533929889789;3.5615266824607e-05;-0.00018134665151592;-0.00018283831013832;-5.9538378991419e-05;-0.00010712168295868;5.8172976423521e-05;0.00017737754387781;-0.0001099175424315;-0.0016521813813597;-0.0019080998608842;0.00066884804982692;0.00046689549344592;0.0018518812721595;0.0022517889738083;0.00050393026322126;0.00045724556548521;-2.0266244973755e-05;1.5006976354925e-05;4.7240970161511e-05;9.1990739747416e-05;-3.0272802177933e-05;-6.9602559960913e-05;-3.3901865208463e-06;1.5450692444574e-05;-0.00010641627159202;-9.7494281362742e-05;-6.652124284301e-06;-0.00011607722990448;-0.00058328727027401;-0.00052342156413943;-0.00015294791955967;-0.00031398903229274;3.0403964046855e-05;-2.5861128960969e-05;-0.00023996892559808;-0.00019809338846244;0.00014995280071162;0.00024382054107264;1.4456388271356e-05;-0.00034547297400422;0.0014769146218896;0.00020955671789125;0.00016377597057726;-0.00026316786534153;-6.3618877902627e-05;5.4774198360974e-05;0.00014807964907959;0.00025309465127066;0.00012120168685215;5.1103739679093e-05;5.4092877689982e-05;3.8775659049861e-05;1.4404898138309e-05;-4.1154303289659e-06;2.630915150803e-05;-3.0612631235272e-05;-1.1656099559332e-05;-9.4641407486051e-05;-0.00012927998614032;-5.0269023631699e-05;0.00078654784010723;-7.7914708526805e-05;2.5792211090447e-05;7.9822175393929e-06;-4.7381941840285e-05;-4.4487896957435e-05;0.00019771012011915;8.8526903709862e-05;-0.00019257245003246;-1.2861668437836e-05;-0.00011478848318802;-0.00054119812557474;0.00013744062744081;-2.6039626391139e-05;0.000178488495294;0.00015232931764331;1.3692697393708e-05;9.2900772870053e-05;4.4654716475634e-05;-0.00036356959026307;2.2916588932276e-05;-9.0625871962402e-05;-3.4717184462352e-05;9.1440422693267e-05;4.4930453441339e-05;2.2599555450142e-05;-0.00018851994536817;-7.6266391261015e-05;-0.00071973633021116;-0.00094653439009562;0.00012549739039969;-0.00047991232713684;0.00011224468471482;4.3592805013759e-05;-9.8611846624408e-05;-0.00015801198605914;8.3448585428414e-06;-0.00015380904369522;-2.0490886527114e-05;0.00018844041915145;-8.8637018052395e-05;-0.0014878002693877;-0.0013702276628464;0.0006502642063424;0.00039411851321347;0.0012225196696818;0.002119667828083;0.00031713303178549;0.00040554272709414;-3.2929940061877e-05;0.00015279625949915;2.3278056460185e-07;0.0001045931931003;-8.6818490672158e-06;-8.2348655269016e-05;-1.6473986761412e-05;2.6679837901611e-05;-9.0773100964725e-05;-9.0794252173509e-05;0.00015736237401143;-0.00018449862545822;-0.00039860486867838;-0.0002650692476891;-3.5739030863624e-05;-0.00032088145962916;8.086006710073e-05;-4.3192601879127e-05;-0.00016375731502194;-0.00013249146286398;6.5585350967012e-05;0.00017801305511966;4.9878167374118e-06;-0.00031046316144057;0.0010361975291744;0.00019831722602248;0.0001502291415818;-0.00038134900387377;8.3994942542631e-05;-6.89851003699e-05;0.00017895562632475;0.00019565982802305;2.0490810129559e-05;1.9195807908545e-05;2.5118128178292e-05;4.5112694351701e-05;3.6313049349701e-05;8.1004673120333e-06;2.1867961550015e-05;-2.7592497644946e-05;-3.4771066566464e-05;-0.00033396240905859;2.0304985810071e-05;2.3277130821953e-05;0.001101739006117;8.6119871411938e-05;-0.00016729580238461;-5.0024245865643e-05;-1.9744167730096e-05;-1.3082682016829e-05;0.00021271294099279;-1.6981342923827e-05;-0.00014156618271954;8.7124658421089e-07;-9.0893096057698e-05;-0.00081636680988595;9.0568370069377e-05;-6.3109705479292e-06;0.00056639726972207;-0.00014324438234325;0.00014204194303602;5.0234171794727e-05;3.1329826015281e-05;-0.00049179972847924;1.1654092304525e-05;-0.00010359682346461;-8.4321272879606e-06;9.8444994364399e-05;3.8747912185499e-05;9.1218444140395e-06;-0.0001937134511536;-4.4043310481356e-05;-0.00044262470328249;-0.00094282469945028;0.00018740042287391;-0.0008802015800029;0.00010668317554519;0.00011386542610126;-2.1615072910208e-05;-0.0001351393002551;7.6941083534621e-05;-0.00021576591825578;-7.7434131526388e-05;0.00019168654398527;-8.523665019311e-05;-0.0014391414588317;-0.0009542359621264;0.00067806540755555;0.00034418617724441;0.00070282421074808;0.0022042931523174;0.00013597773795482;0.00035355365253054;-4.8874961066758e-05;0.00035776876029558;-4.0802446164889e-05;0.00012741347018164;-5.6125321634681e-07;-0.00010631404438755;-1.9514853192959e-05;4.0527746023145e-05;-0.00010698348341975;-0.0001035114764818;0.00013441067130771;-0.00035159417893738;-0.00026904614060186;-5.68529173961e-07;9.1025664005429e-05;-0.00033905479358509;0.00010212511551799;-6.4670319261495e-05;-0.00010548445425229;-6.2062070355751e-05;-2.1797059162054e-05;9.8889526270796e-05;-1.6120222426252e-05;-0.00048712352872826;0.00050919875502586;0.00028749834746122;0.00020972501079086;-0.00025031421682797;0.00039442733395845;-0.00010576962085906;0.00024122311151586;0.00017440144438297;-8.2376463979017e-05;-6.9672159952461e-06;-1.3041312740825e-05;5.2594859880628e-05;6.9952380727045e-05;1.9830908058793e-05;1.4496154108201e-05;-1.7841213775682e-05;-4.6988181566121e-05;-0.00057520240079612;0.00022223687847145;3.6683886719402e-05;0.0015062254387885;0.00018762498802971;-0.00031991739524528;-0.00011074028589064;1.0316955922463e-05;-1.0733252565842e-05;0.00023923873959575;-7.2093331255019e-05;-0.0001214609364979;2.0260740711819e-05;1.2041527043039e-05;-0.0010580894304439;3.1606472475687e-05;-3.8018140912754e-05;0.00092794356169179;-0.00053783319890499;0.00027546740602702;-5.9972817325615e-06;4.4383585191099e-05;-0.00064668786944821;1.4910021491232e-05;-0.00012171855632914;2.9198340598668e-06;0.00011713447747752;3.7910893297521e-05;-2.3136783511291e-06;-0.00022891722619534;-2.7243133445154e-05;-0.00025001735775732;-0.0010180021636188;0.00022964979871176;-0.0013392469845712;0.00011701794574037;0.00014000774535816;4.4397827878129e-05;-0.00012722940300591;0.00011857736535603;-0.00032226776238531;-0.0001192212512251;0.00025159560027532;-8.8494001829531e-05;-0.0015820293920115;-0.00068834878038615;0.00078966695582494;0.00033372090547346;0.00035343060153536;0.0025342376902699;3.2039197321865e-06;0.00035380636109039;-5.6807708460838e-05;0.00056739361025393;-7.4289775511716e-05;0.00016663396672811;1.2017416338495e-05;-0.00012883996532764;-2.0130877601332e-05;5.4334464948624e-05;-0.00012524126213975;-0.00012528950173873;7.105762779247e-05;-0.00041425586096011;-0.00020231508824509;0.0004173667402938;0.00021298399951775;-0.00045891391346231;0.00011169297795277;-6.6104308643844e-05;-7.686554454267e-05;3.1079751352081e-05;-0.00010120944352821;1.9891622287105e-05;-2.8480191758717e-05;-0.00059838203014806;0.00013911694986746;0.00035653135273606;0.00025288280448876;-0.00010049757838715;0.00047393949353136;-0.00010876174201258;0.00027065817266703;0.000180703427759;-0.00027046591276303;-2.4898572519305e-05;-7.3543247708585e-05;7.0156092988327e-05;0.00013295956887305;2.2162465029396e-05;7.2516950240242e-06;-7.6122555583424e-06;-4.3801781430375e-05;-0.00060189270880073;0.00029350959812291;2.6243114916724e-05;0.0014874832704663;0.00021066545741633;-0.00035438852501102;-0.0001220101621584;2.3546899683424e-05;-1.0659922736522e-05;0.00020413080346771;-8.7501925008837e-05;-9.0576177171897e-05;2.8836944693467e-05;8.2969352661166e-05;-0.0010038495529443;-7.5101256697963e-06;-5.9750993386842e-05;0.00095050275558606;-0.00067217467585579;0.00029475768678822;-3.0808925657766e-05;5.2648574637715e-05;-0.00061596120940521;1.4849006220174e-05;-0.00010822701005964;7.098466539901e-06;0.00011006992281182;3.365755037521e-05;-9.4119041023077e-06;-0.00021905498579144;-1.2412433534337e-05;-0.00012261014489923;-0.00092393445083871;0.00021848763572052;-0.0014253999106586;0.00010041378845926;0.00014588095655199;7.0812609919813e-05;-0.00010275338718202;0.00012173353752587;-0.00033850342151709;-0.0001177745507448;0.00024304157705046;-7.966831617523e-05;-0.001463980297558;-0.00047297345008701;0.00074993394082412;0.00028339447453618;0.00014208308130037;0.0023999609984457;-6.1973500123713e-05;0.00030128686921671;-5.538615732803e-05;0.00061605282826349;-7.9780955275055e-05;0.00016408735245932;1.501353472122e-05;-0.00012022278679069;-1.5117640941753e-05;5.291759953252e-05;-0.00012260895164218;-0.00012041340960423;-6.2809290284349e-06;-0.00038634249358438;-0.00015038139827084;0.0006017136038281;0.00024752275203355;-0.00046488357475027;9.4211740361061e-05;-5.2285871788627e-05;-5.5884098401293e-05;8.0052101111505e-05;-0.00012777776282746;-3.512185139698e-05;-3.1791580113349e-05;-0.00059648475144058;-8.1925150880124e-05;0.0003562044876162;0.00024633988505229;3.5516583011486e-05;0.00044479896314442;-7.6949523645453e-05;0.00024132612452377;0.00016529853746761;-0.00033663815702312;-2.8785263566533e-05;-0.00010024428047473;6.9775189331267e-05;0.00015423914010171;5.7855340855895e-05;-3.2759351597633e-05;2.4604449208709e-05;-4.0745839214651e-05;-0.00013517904153559;0.00045487776515074;-0.00091768358834088;1.3586249224318e-05;0.00031214786577038;-0.0002150218206225;-0.00010861655027838;0.00010598836524878;0.00029859220376238;-3.5423017834546e-05;0.00019816828717012;8.7560911197215e-05;-5.8746947615873e-05;-0.00026138767134398;0.00065832544350997;7.0352405600715e-05;0.00014288208330981;0.00079977599671111;-0.00077433109981939;2.3523147319793e-05;-0.0001981666428037;-0.00025683455169201;-3.866325278068e-05;-9.1551937657641e-06;-3.1530566957372e-06;-0.0001781439059414;1.5771029211464e-05;-7.6788142905571e-05;4.0413571696263e-05;0.00013450098049361;-0.00021779132657684;-0.00034329027403146;0.00022458078456111;-0.0020182507578284;0.00025870412355289;0.00040053101838566;-0.00010425782966195;9.5239498477895e-05;0.00011263647320447;-0.00035757920704782;0.00010663589637261;3.5053504689131e-05;-2.9970706236782e-05;-2.7467736799736e-05;-0.0010771356755868;0.00020519217650872;-4.8049427277874e-05;0.00064523669425398;0.0020261919125915;-0.00052000267896801;-0.00016585038974881;-0.00017365178791806;0.00099080486688763;-0.00010798328003148;0.00011688865924953;-7.5918003858533e-05;-5.188315117266e-05;3.2601838029223e-06;2.1152927729418e-05;2.3532677005278e-05;-7.319865108002e-05;-0.00022532562434208;-0.0003453788231127;-0.00035968955489807;0.00092474574921653;3.8878795749042e-05;-0.00037924438947812;0.00033063979935832;6.5051164710894e-05;4.3798496335512e-05;0.00024092860985547;1.8828202883014e-05;-0.00027259584749117;-0.00020290387328714;-2.2848607841297e-05;-0.0011053760536015;-0.0009552717092447;0.00020567110914271;0.00063071522163227;0.0010001973714679;0.00063878169748932;4.0529601392336e-05;6.2022263591643e-05;-0.00047825876390561;9.9844022770412e-05;-0.00021376066433731;-5.1836646889569e-05;0.00023468059953302;6.569084507646e-05;5.1793231250485e-05;-3.772139098146e-05;2.4798791855574e-05;-6.3861889429973e-06;-0.00028298763209023;0.00058019888820127;-0.001273401780054;-3.2595322409179e-05;0.00034627525019459;-0.00024508000933565;-0.00011912445916096;0.00011777507461375;0.0001434034347767;-3.87296131521e-05;0.00022242173145059;0.00010615802602842;-7.5248754001223e-05;-0.00016705370217096;0.00098574266303331;0.00012858469563071;7.102767995093e-05;0.00080027151852846;-0.00100080401171;7.7156066254247e-05;-0.0002492353960406;4.1865092498483e-05;-3.3154403354274e-05;4.8597219574731e-05;-1.5227841458909e-06;-0.00019502954091877;1.2005556527583e-05;-6.9878660724498e-05;4.5122302253731e-05;0.00012269083526917;-0.00023843464441597;-0.00053804781055078;0.0001191989867948;-0.0021272448357195;0.00031970720738173;0.00039936020039022;-6.2808736402076e-05;4.1528583096806e-05;0.00010355598351452;-0.00038908733404242;0.0001312914682785;0.00013262584980112;-6.3859268266242e-05;-4.4183230784256e-05;-0.0013286859029904;-5.7434863265371e-05;2.1763853510492e-05;0.00074466067599133;0.0024473175872117;-0.00034176858025603;-6.5219064708799e-05;-0.00014440332597587;0.00099076528567821;-0.00012134716234868;0.0001631628110772;-8.5926643805578e-05;-0.00011023443221347;5.8128580349148e-06;4.5297590986593e-05;1.4669140000478e-05;-0.00011526938760653;-0.00026801714557223;-0.00064674415625632;-0.00027234642766416;0.00071223953273147;2.186703204643e-05;-0.00041123494156636;0.00034029045491479;-1.2404691005941e-05;8.6794265371282e-05;0.0002032533811871;1.3128363207215e-05;-0.00017853859753814;-0.00020754055003636;-4.2039660911541e-05;-0.0013897282769904;-0.00086742598796263;0.0003246670239605;0.00077115144813433;0.0014654456172138;0.00049823994049802;0.00021992792608216;2.7875155410584e-06;-0.00045612966641784;0.00011457018263172;-0.00018299269140698;-6.3756153394934e-05;0.0002036916121142;7.6147349318489e-05;5.1566757974797e-06;-2.7078900529887e-05;6.0516758821905e-05;3.1181480153464e-05;-0.00015568037633784;0.00060014892369509;-0.0015395543305203;-0.00012551671534311;0.00033448415342718;-0.00024507494526915;-2.6409490601509e-05;9.8979289759882e-05;-0.000104590326373;-4.5171695091994e-05;0.00016901982598938;0.00011304857616778;-5.4399981308961e-05;9.6833624411374e-05;0.0013656022492796;6.6294647695031e-05;-5.9309270000085e-05;0.00037914511631243;-0.0010948273120448;-3.837475378532e-05;-0.00024094049877021;0.00048453704221174;-3.7043753309263e-06;9.7885123977903e-05;4.2893334466498e-06;-0.00015097760478966;4.4877474465466e-06;-2.8915834263898e-05;4.4266020267969e-05;2.5813689717324e-05;-0.00023226329358295;-0.0010997374774888;-0.00016927205433603;-0.0018294448964298;0.00036298774648458;0.00030054521630518;6.1007780459477e-05;-9.643379598856e-05;5.9518391935853e-05;-0.00041362855699845;0.00015581802290399;0.00019368223729543;-0.00012760169920512;-8.9038090663962e-05;-0.0016912232385948;-0.00069736887235194;0.00029947885195725;0.0008223166805692;0.0029379336629063;0.00020981674606446;0.00028392052627169;-4.2132949602092e-05;0.00089377048425376;-0.00011469997116365;0.00019848249212373;-8.8510707428213e-05;-0.00013761181617156;8.5246529124561e-06;7.7769553172402e-05;-9.8563978099264e-06;-0.00018444513261784;-0.00023324019275606;-0.000967878382653;-4.4583415728994e-05;0.00030517237610184;-0.00012996069563087;-0.0004252610669937;0.00027685545501299;-0.00013349991058931;0.00012499162403401;3.1338313419838e-05;-3.6828205338679e-05;-3.4929675166495e-05;-0.00013784637849312;-6.0600756114582e-05;-0.0013313625240698;-0.00031170548754744;0.00046733373892494;0.00070077861892059;0.0015310631133616;0.00012104072084185;0.00049978611059487;-8.6424246546812e-05;-0.00024435250088573;0.00015542244364042;-9.1667112428695e-05;-4.9273508921033e-05;0.00015142667689361;7.0736787165515e-05;-2.5047926101252e-05;-1.5993611668819e-05;7.7189673902467e-05;5.8410911151441e-05;4.1521558159729e-05;0.00049501727335155;-0.0015037803677842;-0.00018796438234858;0.0002687014057301;-0.00020398769993335;4.5278175093699e-05;6.2560495280195e-05;-0.00021617773745675;-4.9377067625755e-05;0.00014825437392574;9.5603354566265e-05;-3.3830969186965e-05;0.00028256254154257;0.0014728594105691;1.0077749720949e-05;-0.0001558228104841;-4.8546862672083e-05;-0.00095983006758615;-0.00014723822823726;-0.00018092284153681;0.0006379735423252;2.4862198188202e-05;0.00011237971193623;1.0835623470484e-05;-0.00011900478421012;3.4372458230791e-06;-1.0669517678252e-06;4.3298838136252e-05;-3.2709234801587e-05;-0.00021200973424129;-0.0013521406799555;-0.00040575960883871;-0.0014807678526267;0.000367639149772;0.00023664963373449;0.00013273271906655;-0.00017489047604613;1.1628410902631e-05;-0.00037043384509161;0.00015791608893778;0.00020884102559648;-0.00015117703878786;-0.00010856428707484;-0.0018285856349394;-0.001170382834971;0.000440687086666;0.00081552914343774;0.0030754711478949;0.00066744966898113;0.00046756200026721;5.8609231928131e-05;0.00073295581387356;-0.00010642304550856;0.00019818985310849;-7.7799530117773e-05;-0.00014667300274596;4.2238998503308e-06;8.7477077613585e-05;-2.2129688659334e-05;-0.00020995379600208;-0.00021007464965805;-0.0011290316469967;9.9439930636436e-05;-8.6116524471436e-05;-0.00025269089383073;-0.00038481410592794;0.00019336039258633;-0.0001954898762051;0.00014126251335256;-0.00010895285231527;-7.94612133177e-05;6.330270844046e-05;-6.4027917687781e-05;-6.5026863012463e-05;-0.001263453043066;0.00014487978478428;0.00052898691501468;0.00063999812118709;0.0015408323379233;-0.00013839716848452;0.00063654652331024;-0.00012974363926332;-3.1452247640118e-05;0.00018074840772897;-1.5932422684273e-05;-3.2902560633374e-05;0.00010302325972589;5.9793135733344e-05;-3.9162307075458e-05;-2.1956022919767e-06;6.8197885411792e-05;6.3726489315741e-05;0.00024165021022782;0.00025357614504173;-0.0011013643816113;-0.00017968878091779;0.0001516442571301;-0.00012702636013273;8.9417204435449e-05;9.417816727364e-06;-0.00020927193691023;-4.0261104004458e-05;0.00013032522110734;5.7722892961465e-05;-1.1660040399875e-05;0.00033628183882684;0.0011866925051436;-2.6841986255022e-05;-0.0001912441366585;-0.00040571240242571;-0.00055413827067241;-0.00021783355623484;-6.6993874497712e-05;0.00052745256107301;3.0213093850762e-05;9.2438152933028e-05;1.3996982488607e-05;-8.5103034507483e-05;5.7445058700978e-06;1.6728614355088e-05;3.7495428841794e-05;-5.8924633776769e-05;-0.00015883779269643;-0.0012685334077105;-0.00053685397142544;-0.00096937327180058;0.0003048645448871;0.00020121342095081;0.00012925681949127;-0.00019037464517169;-3.6996181734139e-05;-0.0002470210311003;0.00012672014418058;0.00014969639596529;-0.00011462750262581;-0.00010381789616076;-0.0016140029765666;-0.0013704525772482;0.00045422249240801;0.00066173420054838;0.0026427423581481;0.00095755810616538;0.00048307998804376;0.00014233322872315;0.00048669512034394;-9.4167327915784e-05;0.00015259957581293;-4.8229623644147e-05;-0.00012549542589113;-9.2322934506228e-06;7.1459791797679e-05;-2.1932261006441e-05;-0.00018412069766782;-0.00016837977454998;-0.0010303165763617;0.00013690556806978;-0.00041701149893925;-0.00032864659442566;-0.00026337444433011;7.9410441685468e-05;-0.00018918370187748;0.00011814113531727;-0.00020162988221273;-0.00010674741497496;0.00011633493704721;1.6484540537931e-05;-5.2996503654867e-05;-0.0010453823488206;0.0004756847047247;0.00047754711704329;0.00050936709158123;0.0013043861836195;-0.00023854366736487;0.00059240934206173;-0.00011039785022149;0.00016381822933909;0.00017681161989458;4.2998308344977e-05;-1.0133790965483e-05;4.9982936616288e-05;3.7054927815916e-05;-4.7067722334759e-05;4.3613683374133e-05;-3.0099939976935e-05;5.9066936955787e-05;0.00063863978721201;-0.00059659930411726;-0.00012820477422792;0.00010622353147482;-0.00023089208116289;0.00020566723833326;0.00021304703841452;-0.00016377345309593;-7.5724623457063e-05;9.9577817309182e-05;0.00016307670739479;-0.00016948410484474;-2.8348053092486e-05;-4.2449530155864e-05;7.73882275098e-05;0.00026753614656627;-0.0002050036273431;-0.0012008459307253;0.0011551410425454;-0.00042509712511674;0.00030976458219811;0.00015131731925067;-0.00014062981063034;6.4376208683825e-06;-2.5633980840212e-05;-5.3778785513714e-05;6.7135151766706e-05;6.2307000916917e-05;3.8511210732395e-05;-0.00012594090367202;-5.316300666891e-05;-0.001272217836231;-0.0011171639198437;4.3312775233062e-05;2.1775289496873e-05;0.0001525467087049;0.00010661841952242;-0.00025281423586421;-0.00021375372307375;-4.3738822569139e-05;-2.5548577468726e-05;8.4821273048874e-05;0.00012162879284006;-0.00015184949734248;-0.001596997724846;-0.0026182837318629;0.00059483054792508;0.00043853229726665;0.0023968946188688;0.0024562783073634;0.00059758714633062;0.00046904222108424;-3.9059832488419e-05;-7.8822740761098e-05;7.84134681453e-05;8.3736718806904e-05;-7.3888208135031e-05;-8.3594044554047e-05;2.363641942793e-05;1.3625165593112e-05;-0.00016946652613115;-0.00013527971168514;-0.00065675552468747;-0.00043731523328461;-0.0010004509240389;-0.00096010486595333;-0.00016453031275887;-0.00024366781872232;-9.2691334430128e-05;-6.1511738749687e-05;-0.00036646751686931;-0.00029078256920911;0.00021698568889406;0.00030362705001608;-1.089666147891e-05;-0.00093023508088663;0.0015371239278466;0.00045039725955576;0.00035885741817765;0.00055129919201136;0.00043501410982572;0.0003735585778486;0.00026148252072744;0.00047928187996149;0.0003291594912298;0.0001143362824223;0.00010195554932579;1.9258486645413e-06;-3.2110558095155e-05;-3.9918937545735e-05;4.647617606679e-05;-4.6918710722821e-05;4.3452142563183e-05;0.00056154053891078;-0.00062724109739065;-1.4517643649015e-05;0.00023071301984601;-0.00022829780937172;0.00019880650506821;0.0001965886040125;-0.00016559495998081;-4.5670160034206e-05;0.00012820845586248;0.00014575211389456;-0.00018479637219571;-3.1790255889064e-05;-0.000144729972817;-0.00015154120046645;0.00030410845647566;-0.00016354709805455;-0.0010539921931922;0.0012286871206015;-0.00038385088555515;0.00032106891740113;9.1138870629948e-05;-0.00019777253328357;-4.5268361645867e-06;-3.8301124732243e-05;-4.7719062422402e-05;7.4185874836985e-05;6.302021938609e-05;3.5864428355126e-05;-0.00013355788541958;-4.4344018533593e-05;-0.0011925719445571;-0.0011336741736159;0.00013393668632489;-8.1181875430048e-05;0.00015209801495075;9.7156655101571e-05;-0.00023503016564064;-0.0002191031962866;-1.5803465430508e-05;-5.4494114010595e-05;5.6632721680216e-05;0.00015324920241255;-0.00014926372386981;-0.0015677615301684;-0.0025517458561808;0.00060635973932222;0.00040966927190311;0.0022114245221019;0.0025330341886729;0.00056000158656389;0.0004797583387699;-7.5327254307922e-05;-4.3331045162631e-05;6.0175687394803e-05;9.8857730336022e-05;-6.0600643337239e-05;-9.3448041297961e-05;1.3225243492343e-05;2.1910957002547e-05;-0.00016334066458512;-0.00012997508747503;-0.00050453114090487;-0.0005366318509914;-0.0009405225282535;-0.00096527603454888;-0.00013742804003414;-0.00026629742933437;-5.3450665291166e-05;-8.9034227130469e-05;-0.00034144721576013;-0.00029202064615674;0.00019712680659723;0.00031193540780805;-9.9183125712443e-06;-0.00090204016305506;0.001506402855739;0.00043924385681748;0.00034110189881176;0.0003569285327103;0.00058878213167191;0.0002817714412231;0.0003158898325637;0.00045554371899925;0.00032292172545567;0.00010108691640198;0.000107351996121;5.6042886171781e-06;-3.4913598938147e-05;1.3419276911009e-05;1.3743670933763e-05;-2.4525596018066e-05;-3.4221015084768e-05;-0.00039013571222313;0.00010351251694374;3.702798858285e-05;0.0010928264819086;0.00012606130621862;-0.00021159832249396;-6.7136556026526e-05;1.1930806067539e-06;-3.4182639865321e-06;0.00018746269051917;-4.7304667532444e-05;-0.00011308075045235;8.2933174780919e-06;-5.6575107009849e-05;-0.00080614525359124;6.4960673626047e-05;-1.51385238496e-05;0.00064183922950178;-0.00026970490580425;0.00017635599942878;1.2022670489387e-05;2.7978119760519e-05;-0.00047237705439329;7.571484275104e-06;-9.6672578365542e-05;-6.8762759042329e-08;9.3834576546215e-05;3.2446885597892e-05;-9.7520221231662e-08;-0.00017471556202509;-2.0494408090599e-05;-0.00026499488740228;-0.0008031451725401;0.00018962388276123;-0.00097477302188054;7.8629098425154e-05;0.00013328582281247;1.2314992090978e-05;-0.00010462047794135;8.8736007455736e-05;-0.0002228022494819;-7.866070518503e-05;0.00018090459343512;-7.1271664637607e-05;-0.0012440163409337;-0.00066100247204304;0.00060687935911119;0.00026692321989685;0.00039770727744326;0.0019871005788445;4.6792167267995e-05;0.00027678554761223;-5.5406653700629e-05;0.00040515800355934;-4.988085856894e-05;0.00012485901243053;2.7203395802644e-06;-0.00010498479241505;-1.5396410162793e-05;4.2032334022224e-05;-0.00011225460184505;-9.7885807917919e-05;8.4647166659124e-05;-0.0004088704881724;-0.00016781450540293;0.00011275571159786;0.00012822616554331;-0.00030861460254528;9.5949748356361e-05;-6.751454930054e-05;-6.3508421590086e-05;-1.8188738977187e-05;-5.7134078815579e-05;5.0232065404998e-05;-2.6758996682474e-05;-0.00056144333211705;0.00020000663062092;0.00032228478812613;0.00022350324434228;-0.00013531127478927;0.00054437376093119;-9.8261720268056e-05;0.00024350652529392;0.00013570694136433;-0.00012205370148877;-1.9505956515786e-05;-3.0106357371551e-05;5.0714970711851e-05;7.6683463703375e-05;2.5889892640407e-05;1.0108382412e-05;-2.8647684302996e-05;-4.82798423036e-05;-0.00065093004377559;0.00026766682276502;5.5749380408088e-05;0.0016451365081593;0.00022721313871443;-0.00036655607982539;-0.00012232051813044;2.7133641196997e-05;-6.8668299491037e-07;0.0002489012258593;-9.8095435532741e-05;-0.00013937399489805;2.3536989829154e-05;-1.2450259418983e-05;-0.0011798053747043;5.5073378462112e-05;-4.6122862841003e-05;0.0010433151619509;-0.00059183733537793;0.0003066502395086;-2.9476692361641e-05;4.5950404455652e-05;-0.00068604660918936;1.0034419574367e-05;-0.00013606647553388;7.135719897633e-06;0.0001372005790472;4.2154038965236e-05;-1.0766600098577e-05;-0.00024659317568876;-5.9306889852451e-06;-0.00020111899357289;-0.0010564015246928;0.00028007800574414;-0.0015914087416604;8.8658394815866e-05;0.00021528899378609;5.8145862567471e-05;-0.00012299786612857;0.00014215154806152;-0.00035221801954322;-0.00011723340139724;0.00026726259966381;-9.1947338660248e-05;-0.0016771594528109;-0.00066586659522727;0.00084619701374322;0.00031785891042091;0.00026431909645908;0.0027736050542444;-2.8934044166817e-05;0.00033402640838176;-8.7284955952782e-05;0.00066957791568711;-8.4555329522118e-05;0.00018688572163228;8.6862264652154e-06;-0.00015447914483957;-1.7279555322602e-05;6.3793020672165e-05;-0.00017320533515885;-0.0001410541444784;4.9339763791068e-05;-0.00063746306113899;-0.00015069008804858;0.00035904519609176;0.00023917331418488;-0.00045163475442678;0.00013121336814947;-9.5653667813167e-05;-5.3764753829455e-05;3.3734580938471e-05;-0.00012680700456258;1.2743457773468e-05;-4.9641908844933e-05;-0.00090115983039141;-3.8896225305507e-05;0.00051379465730861;0.00034224020782858;-4.7639165131841e-05;0.00090943370014429;-0.00012556355795823;0.00035102255060337;0.00016761370352469;-0.00025637942599133;-4.1097340726992e-05;-7.3487004556227e-05;7.5683747127187e-05;0.00013258554099593;3.1820858566789e-05;-2.0047373254783e-06;-2.1536456188187e-05;-4.2294719605707e-05;-0.00071959896013141;0.00037916039582342;4.0753715438768e-05;0.0017210253281519;0.00026287129730918;-0.00042022278648801;-0.00014165211177897;5.5593547585886e-05;-1.0770497738122e-06;0.0002139044663636;-0.00011822075612145;-0.00013535234029405;3.6866909795208e-05;7.2680071752984e-05;-0.0011808946728706;1.8801420083037e-05;-8.529526530765e-05;0.0011272792471573;-0.00079637003364041;0.00034519020118751;-7.6268486736808e-05;6.1154234572314e-05;-0.00066390895517543;1.0676782039809e-05;-0.00013290117203724;1.025642905006e-05;0.00014956371160224;4.2310221033404e-05;-2.3683556719334e-05;-0.00025588739663363;2.1824018404004e-05;-6.7281347583048e-05;-0.00098388805054128;0.00029438591445796;-0.0018534619593993;5.4523723520106e-05;0.00026889954460785;8.9617722551338e-05;-9.5701718237251e-05;0.00015490829537157;-0.00038826986565255;-0.0001103301619878;0.00027729145949706;-8.5230938566383e-05;-0.0016604163683951;-0.00046344028669409;0.00086289143655449;0.00025855776038952;3.7997218896635e-05;0.0028323284350336;-0.00010122263483936;0.00026789211551659;-0.00010220017429674;0.00077876314753667;-9.4489427283406e-05;0.00019824561604764;9.011682777782e-06;-0.00016394442354795;-9.3728704086971e-06;6.5436572185718e-05;-0.00020440023217816;-0.00014330084377434;-4.592095137923e-05;-0.0006973342387937;-8.5495892562903e-05;0.00053086498519406;0.00028906733496115;-0.00047275554970838;0.00012510507076513;-8.8332511950284e-05;-2.7512425731402e-05;8.9384455350228e-05;-0.00016673647041898;-4.4930260628462e-05;-6.0555736126844e-05;-0.0010695233941078;-0.00032513847691007;0.00061028148047626;0.00037325700395741;0.00011677366273943;0.001088981050998;-9.8195654572919e-05;0.00034764860174619;0.00015368459571619;-0.0003332031192258;-5.3094590839464e-05;-0.00010604338604026;8.1193902587984e-05;0.0001601678377483;3.0562063329853e-05;-2.2493624783237e-05;-1.1597007869568e-05;-1.3810412383464e-05;-0.00054875988280401;0.00038094280171208;5.1928341235907e-06;0.0012230441207066;0.00020958385721315;-0.00033019870170392;-0.00011265080684097;8.5512423538603e-05;1.1662872339002e-06;7.3308889113832e-05;-9.6059528004844e-05;-0.00012423121370375;4.3299405660946e-05;0.00014608881610911;-0.00078288983786479;-1.7768297766452e-05;-0.00011665772763081;0.00083325593732297;-0.0007697666878812;0.00026547201559879;-0.00012113487900933;5.9130998124601e-05;-0.0003484919143375;6.6108500504924e-06;-8.7206492025871e-05;6.4283017309208e-06;0.00013411746476777;3.3653774153208e-05;-3.7766349123558e-05;-0.00019360918668099;6.5226297010668e-05;8.9907422079705e-05;-0.00051863701082766;0.00023005472030491;-0.0016568737337366;-2.8791842851206e-05;0.00029629821074195;8.9695029600989e-05;-1.954659637704e-05;0.00012018182314932;-0.00029038518550806;-5.082473217044e-05;0.00020065317221452;-4.5910557673778e-05;-0.0011362521909177;-0.0001039713533828;0.00062456342857331;6.6984161094297e-05;-0.000211573424167;0.0020542724523693;-0.00013702275464311;5.4963205911918e-05;-0.00010021823982242;0.00066399510251358;-7.2491624450777e-05;0.0001473103184253;5.1443919346639e-07;-0.00013439889880829;8.3110198829672e-06;4.1852832509903e-05;-0.00021296537306625;-9.3295850092545e-05;-0.00015243959205691;-0.00059032859280705;2.7035421226174e-05;0.00046745949657634;0.00024802764528431;-0.00033119349973276;8.7468906713184e-05;-4.5511817006627e-05;1.386036274198e-05;0.00011882380931638;-0.00016025417426135;-9.4280127086677e-05;-5.4520973208128e-05;-0.0010814382694662;-0.0005718864267692;0.00062279758276418;0.00029720162274316;0.00027534857508726;0.0011580932186916;-3.6419532989385e-05;0.00022527770488523;8.6103893409017e-05;-0.00029095684294589;-5.6097233027685e-05;-0.0001077949127648;6.4353080233559e-05;0.00013736812979914;8.8767483248375e-05;-3.6301305954112e-05;1.2770226476277e-06;-5.7898705563275e-05;6.0712620324921e-05;0.00025926064699888;-0.00037959916517138;3.079204907408e-05;0.00013271444186103;-9.1312249423936e-05;-0.00017260129970964;8.7557746155653e-05;0.00054101075511426;-3.9035985537339e-05;0.00039594518602826;1.7385207684129e-05;-5.2738894737558e-05;-0.00036153921973892;0.00023866244009696;2.7506839614944e-05;0.00020570575725287;0.00076805258868262;-0.00043959461618215;4.7885638196021e-05;-0.00012897467240691;-0.00088134442921728;-1.5415673715324e-06;-3.5035212931689e-05;-4.3743057176471e-06;-0.00025613800971769;3.4793221857399e-05;-9.6564719569869e-05;3.7789832276758e-05;0.00021773150365334;-0.00020727055380121;0.00045221150503494;0.00028778566047549;-0.0018208714900538;0.00018501744489186;0.00042356859194115;-0.00018566538346931;0.00018686334078666;0.0001054067761288;-0.0001543338294141;5.5585700465599e-05;5.0450220442144e-05;2.9968277885928e-05;5.3083538659848e-05;-0.00059149833396077;0.00052222976228222;-0.00042173551628366;0.00048936303937808;0.0012257293565199;-0.00068120821379125;-0.00051056937081739;-0.00015567571972497;0.00065659353276715;-9.0042085503228e-05;5.8834739320446e-05;-5.2063020120841e-05;-6.9514353526756e-05;-1.2002763014607e-06;-3.1372652301798e-05;4.7139343223535e-05;3.65670894098e-05;-0.00027756692725234;2.4671451683389e-05;-0.00042645348003134;0.0007894312730059;0.00012763774429914;-0.00025131835718639;0.00027285821852274;0.00018479021673556;3.007464511029e-05;0.00028238599770702;3.9659851609031e-05;-0.00030127321952023;-0.00019263377180323;2.1360030586948e-05;-0.0011108351172879;-0.0010539491195232;-2.444793790346e-05;0.00069829297717661;0.00099712738301605;0.00069799768971279;-0.00026774508296512;0.00010486768587725;-0.00046261420357041;5.4622498282697e-05;-0.00022459262982011;-5.8845263993135e-05;0.00021538170403801;5.8781912230188e-05;0.00011193779209862;-5.3176758228801e-05;-1.9354965843377e-05;-2.9361970518949e-05;-0.00029978377278894;0.00050733605166897;-0.0009214281453751;2.365749423916e-05;0.00027666226378642;-0.00019313182565384;-0.00024340541858692;0.00012729862646665;0.0004687404143624;-4.3439024011604e-05;0.000418902549427;6.9442387029994e-05;-0.00010061829379993;-0.0004033702716697;0.00061438389820978;0.00018436829850543;0.00017997945542447;0.0011227332288399;-0.00083717878442258;0.00019723396690097;-0.00023637877893634;-0.00062916829483584;-2.9382026696112e-05;1.1371272194083e-05;-3.8022460557841e-06;-0.00030168527155183;3.0618150049122e-05;-0.0001207568711834;5.1845094276359e-05;0.00026517739752308;-0.00026611730572768;0.00031368652707897;0.0003310602332931;-0.0024638881441206;0.00029281561728567;0.00053874839795753;-0.00020355641026981;0.00020072408369742;0.00013262916763779;-0.00027261622017249;9.9987999419682e-05;0.00013022875646129;8.3987415564479e-06;3.429444404901e-05;-0.00095437053823844;0.00050143315456808;-0.00042059534462169;0.00068899581674486;0.0019397620344535;-0.00079656456364319;-0.0005508191534318;-0.00020170040079392;0.00093641772400588;-0.00013268984912429;0.00012282945681363;-7.778532744851e-05;-0.00012769279419445;1.1840766234172e-07;-2.4405662770732e-06;4.8534591769567e-05;-1.4018120964465e-05;-0.00038028811104596;-0.00037085905205458;-0.00048536524991505;0.000867722381372;0.00018627839745022;-0.00035388019750826;0.00037696995423175;0.00012672318553086;7.4783500167541e-05;0.00035498768556863;6.1398546677083e-05;-0.0002899547398556;-0.00026913805049844;-1.2673408491537e-05;-0.0017308589303866;-0.0013929061824456;0.00015315707423724;0.0010230062762275;0.0018015013774857;0.00081889017019421;-0.0001041096256813;7.8247612691484e-05;-0.00060782238142565;7.0740468800068e-05;-0.00025811995146796;-9.0008819825016e-05;0.00023317345767282;8.6328756879084e-05;0.00011138684203615;-6.0648970247712e-05;-4.4200096454006e-05;3.1854142434895e-05;-0.00061173236463219;0.0006316996878013;-0.0012457823613659;-2.3840510039008e-05;0.00031366656185128;-0.00022674958745483;-0.00027405074797571;0.00012940369197167;0.00024995062267408;-4.3736374209402e-05;0.00039475059020333;9.8447599157225e-05;-0.00012977920414414;-0.00027672731084749;0.0009016806143336;0.00031785291503184;5.6859986216296e-05;0.0011256042635068;-0.001035125576891;0.00033782154787332;-0.00028442058828659;-0.00021869322517887;-3.2034797186498e-05;7.9225043009501e-05;2.227502363894e-06;-0.00029477846692316;1.9868619347108e-05;-0.00011523169814609;5.3705352911493e-05;0.00026419985806569;-0.00025440394529141;0.0002641559985932;0.00024418695829809;-0.0024330995511264;0.00033894507214427;0.0005172438104637;-0.00016832830442581;0.00016309422790073;0.00011344619997544;-0.00026148365577683;0.00011700489267241;0.00023360890918411;-1.7105079678004e-05;2.2652884581476e-05;-0.0010180005338043;0.00028932784334756;-0.00039858021773398;0.00069313420681283;0.002088065026328;-0.00064742140239105;-0.00051002315012738;-0.00016956299077719;0.00084485375555232;-0.00014383133384399;0.00015852732758503;-7.9757221101318e-05;-0.00019024063658435;9.1742759877889e-07;2.7496684197104e-05;3.9053469663486e-05;-5.478223101818e-05;-0.00042934843804687;-0.00081454316386953;-0.00037613735185005;0.0004855400766246;0.00023312389384955;-0.00032116958755068;0.00036279004416429;1.2675368452619e-05;0.00012513624096755;0.00030826288275421;7.7151729783509e-05;-0.00015584917855449;-0.00027426707674749;-4.7224591980921e-05;-0.002125364728272;-0.0013693841174245;0.00031597533961758;0.0012058926513419;0.0025336716789752;0.0006477979477495;0.00012899017019663;1.3347356571103e-06;-0.00053319643484429;5.2736872021342e-05;-0.00019831680401694;-0.00011003536928911;0.00015745249402244;9.4536815595347e-05;-6.2239530961961e-05;5.8140496548731e-05;-4.734883987112e-05;7.6044379966334e-05;0.0010377707658336;-0.0010069803101942;0.00022137517225929;-0.00026438370696269;-0.00023089670867193;0.00020543769642245;0.00032125570578501;-0.000257871724898;9.1899646577076e-06;2.7009362383978e-05;7.5531810580287e-05;-7.270051719388e-05;-3.099018431385e-05;-0.00010107244452229;5.3001826017862e-05;0.0003674314066302;-0.00027442630380392;-0.0020568687468767;0.0021099604200572;-0.00065232673659921;0.00050994340563193;6.3759296608623e-05;-6.4051673689391e-05;-5.4583309974987e-05;2.9127320885891e-05;-1.9984487153124e-05;3.1746218155604e-05;5.6849119573599e-05;3.1728879548609e-05;-6.4748460317787e-06;5.4515887313755e-05;-0.0010806130012497;-0.00097038311650977;0.00021408054453786;0.00016812235116959;0.00018233695300296;0.00013653331552632;-0.00024844284052961;-0.00021807296434417;4.2636533180485e-05;3.120713881799e-05;5.9879588661715e-05;9.785543079488e-05;-0.00018105162598658;-0.00094710692064837;-0.0028775881510228;0.00033236318267882;0.00019285026064608;0.0021544224582613;0.0022379793226719;0.00047879572957754;0.00038452746230178;-0.00014400314830709;-0.000145731610246;6.9447276473511e-05;8.7174936197698e-05;-9.194287849823e-05;-0.00010189532622462;3.980395194958e-05;2.1092868337291e-05;-0.00018864097364713;-0.00013578204379883;-0.0012504297774285;-0.00092894362751395;-0.0013058631448075;-0.0012720261001959;-7.6086529588792e-05;-0.0001679532288108;-0.00020305838552304;-0.00014515429211315;-0.00043042609468102;-0.00033728941343725;0.0002250686957268;0.00033028234611265;-2.7695172320819e-05;-0.0013625922147185;0.0011964632431045;0.00059855217114091;0.00045729894191027;0.0013415790162981;0.0012053995160386;0.00062571431044489;0.00044933668687008;0.00067682180088013;0.00048768674605526;0.0001649729674682;0.0001459338091081;-4.7506033297395e-05;-8.6559834016953e-05;-5.5064123444026e-05;5.9834186686203e-05;-6.4159845351242e-05;5.7788107369561e-05;0.00094952509971336;-0.0010133337927982;0.00028834358090535;-0.00015618483303115;-0.00022667141456623;0.00020338738977443;0.00030478139524348;-0.00025121713406406;3.160905544064e-05;5.5810989579186e-05;6.4879219280556e-05;-9.0082845417783e-05;-3.7355137465056e-05;-0.00022908227401786;-0.00013891406706534;0.00041122172842734;-0.00021868303883821;-0.0018716908525676;0.0021493779495358;-0.00061106868088245;0.0005039747338742;2.160890653613e-05;-0.00011271240509814;-6.1803140852135e-05;1.4674228623335e-05;-1.739682375046e-05;3.8603822758887e-05;5.8599453041097e-05;2.9065637136227e-05;-1.6690877600922e-05;5.5673965107417e-05;-0.0010344197507948;-0.00097413075855002;0.00027927893097512;7.9038567491807e-05;0.00017054528871085;0.00013550398580264;-0.00023884134134278;-0.00021718493371736;5.6244221923407e-05;8.3089225881849e-06;4.360527600511e-05;0.00012020223948639;-0.00017907809524331;-0.00094571226509288;-0.0028037899173796;0.00034948927350342;0.00018474379612599;0.0020214365795255;0.0022845936473459;0.00046354596270248;0.00038615861558355;-0.000168005208252;-0.00011401472147554;5.7412311434746e-05;9.7291216661688e-05;-8.0398793215863e-05;-0.00010847121302504;2.9053740945528e-05;2.8209811716806e-05;-0.00018229716806673;-0.00012752214388456;-0.0010453878203407;-0.0010225818259642;-0.0011980516137555;-0.0013055896852165;-7.3430441261735e-05;-0.00017520200344734;-0.00015596853336319;-0.00017103500431404;-0.00039550857036375;-0.00034443507320248;0.00020818278426304;0.00033810967579484;-2.4419554392807e-05;-0.0013042723294348;0.0011907482985407;0.00057481147814542;0.00042926860623993;0.0010653752833605;0.0013597049983218;0.0005154317477718;0.00049923779442906;0.00062229501781985;0.00049528566887602;0.00014531487249769;0.00015405727026518;-3.8821279304102e-05;-9.0563931735232e-05;5.2805698942393e-05;-7.1833856054582e-05;-5.8292112953495e-05;4.4933782191947e-05;-0.0005839578807354;0.00067154271528125;-2.9391082989605e-06;0.0011347539257258;0.00019245425937697;-0.00028494960861281;-0.00011631845700322;0.00021340117382351;1.0790298802021e-05;-7.0455962486449e-06;-9.1992718807887e-05;-0.00026309711392969;8.4861283539794e-05;0.00019215335487388;-0.0006864782772027;3.2752795959823e-05;-0.00027692219009623;0.00084243505261838;-0.00099580420646816;0.00028513267170638;-0.00034285767469555;5.8803718275158e-05;-0.00013166335702408;-6.0891244402228e-07;-0.00011609485954978;-1.2944460081599e-07;0.00021416468371172;3.9726481190883e-05;-7.8392389696091e-05;-0.00018075140542351;0.00018400121189188;0.0002572376979515;0.00015503929171246;0.00025863019982353;-0.0020057463552803;-0.00016364095790777;0.00046424072934315;9.5955459983088e-05;7.9701108916197e-05;0.00011497321247589;-0.00019663797866087;1.6772057279013e-05;0.00028537504840642;1.3741987459071e-05;-0.00077909417450428;0.00024629771360196;0.0005091477651149;-0.00029748005908914;-0.00053546280832961;0.0017081181285903;-0.00018027050828096;-0.00030628649983555;-0.0001479114725953;0.00058883300516754;-6.2306819017977e-05;0.00015217719192151;-1.4329010809888e-05;-0.00022165785776451;3.9369453588733e-05;2.9751816327916e-05;-0.00041569527820684;-4.9596492317505e-05;-0.00024272078007925;-0.00098427571356297;0.00027538911672309;-1.7420403310098e-05;0.00024339600349776;-0.00016442376363557;0.00013723729352932;-6.1569466197398e-05;0.00010860585462069;0.0001597436494194;-0.00021144672064111;-4.9677768402034e-05;-8.4212726505939e-05;-0.0020640008151531;-0.0011193276150152;0.0011892183683813;0.00037309125764295;0.00041543840779923;0.0026314021088183;-5.879480522708e-05;0.00024140437017195;-1.6577814676566e-05;-0.0002373218012508;-0.00011291327245999;-9.0788715169765e-05;7.2234237450175e-05;6.4482184825465e-05;3.7707661249442e-05;-6.3311665144283e-05;-2.17696629079e-06;2.8023328923155e-05;-0.00038671435322613;0.0003831458161585;-3.3010961487889e-05;0.00069056736538187;0.00014336334425025;-0.00021948177891318;-9.048144420376e-05;0.00015873553638812;1.2522487850219e-05;-0.0001670705532888;-6.1624334193766e-05;-0.00021047711197753;5.9090805734741e-05;0.00026535446522757;-0.00036572487442754;-6.6431930463295e-05;-0.00017023088003043;0.00055112922564149;-0.00083890208043158;0.0001908471895149;-0.00020603490702342;4.8688536480768e-05;0.0001883309596451;1.354375513074e-06;-4.0522550989408e-05;-7.2203824856842e-06;0.00017055562057067;3.3059233828681e-05;-7.0834357757121e-05;-0.00016228036838584;0.00016057855100371;0.00027718750061467;0.00018607966194395;0.00018922732851934;-0.0017594756791368;-0.00016104790847749;0.00042107704211958;9.7773387096822e-05;9.952177060768e-05;8.8352069724351e-05;-0.00016374855476897;2.822022906912e-05;0.00014862355601508;1.6003303244361e-05;-0.00064106972422451;0.00034800422145054;0.00044226201134734;-0.00027224337100051;-0.00054989557247609;0.0013793270336464;-0.00018299526709598;-0.00030629968387075;-0.00011582008301048;0.00057313998695463;-5.2245133701945e-05;9.5929368399084e-05;-1.3078753909213e-05;-0.00013333170500118;4.1813200368779e-05;4.8324268391298e-06;-0.00031614635372534;-2.1036965335952e-05;-0.00031053568818606;-0.00054813647875562;0.00019454520952422;0.00033480511046946;0.00022486606030725;-0.00017946350271814;7.0480695285369e-05;2.676748772501e-05;7.3700866778381e-05;0.00016083719674498;-0.00017828153795563;-0.00017817800107878;-4.7338580770884e-05;-0.0014606845797971;-0.00099238031543791;0.00087049853755161;0.00021644397929776;0.0005023232079111;0.001678688917309;2.7463922378956e-05;5.5922399042174e-05;6.7948485593661e-06;-0.00024024187587202;-7.9061464930419e-05;-0.0001239629345946;5.732379577239e-05;0.00012734046322294;0.0001351014507236;-5.0711198127829e-05;-5.5638287449256e-05;-3.0273551601567e-05;-0.00016313047672156;0.00023614751989953;-0.00024487104383297;4.4235290260985e-05;2.079080149997e-05;-9.6360745374113e-06;-0.00029722359613515;9.1665533545893e-05;0.0006446149200201;-3.1482995836996e-05;0.00061411561910063;-3.2308995287167e-05;-0.00010864783689613;-0.00051349343266338;6.4646679675207e-05;0.00019683245045599;0.00023062012041919;0.0010304269380867;-0.00036553005338646;0.0002464848512318;-0.00014463701518252;-0.00120262010023;1.6078111002571e-05;-1.6142860204127e-06;-8.2729347923305e-06;-0.00036134384572506;4.9675400077831e-05;-0.00011829121649498;3.8181598938536e-05;0.00031925871735439;-0.0002184947807109;0.0013918512267992;0.00029027211712673;-0.001753295888193;0.00012875771790277;0.00041007739491761;-0.00021786826255266;0.00025751226348802;9.8467717180029e-05;5.7632649259176e-05;1.3516220860765e-05;0.00023197564587463;5.2652219892479e-05;0.00014633449609391;-0.00020549328473862;0.00076281587826088;-0.00088045478332788;0.00040199465001933;0.00058891286607832;-0.00077944126678631;-0.00088383804541081;-0.0001241155405296;0.0002047402667813;-5.7571942306822e-05;4.3371743231546e-05;-3.590232154238e-05;-0.00016520598728675;1.647869567023e-06;-8.0732570495456e-05;7.2760980401654e-05;0.0001626498560654;-0.00041067163692787;0.00039128956268542;-0.00047915283357725;0.00057489052414894;0.00022852087568026;-0.00018626822566148;0.00025944781373255;0.00029469706350937;5.5683060054434e-05;0.00039643247146159;5.900145333726e-05;-0.00021804089192301;-0.00021785347780678;7.408235251205e-05;-0.0014218975557014;-0.0011934806825593;-0.00028875484713353;0.00096965400734916;0.001404435839504;0.00070683268131688;-0.00059538177447394;0.00011780585919041;-0.00061218888731673;3.1380975997308e-05;-0.00023954601783771;-8.389561844524e-05;0.00015696375339758;7.1335722168442e-05;0.00018395442748442;-7.8272823884618e-05;-0.00014064737479202;5.4003965487937e-05;-0.00092078273883089;0.00050663272850215;-0.00079470209311694;4.3179599742871e-05;0.00013733051309828;-9.1057343524881e-05;-0.0004529032157734;0.00012399270781316;0.00046063790796325;-2.3197231712402e-05;0.00063850870355964;1.5572979464196e-05;-0.00019886359223165;-0.00055375578813255;0.00038611708441749;0.00055037502897903;0.00012747933214996;0.0015129817184061;-0.00075370667036623;0.00063162157312036;-0.00026927940780297;-0.00078907189890742;-2.1430174456327e-05;8.8944936578628e-05;-5.7581942201068e-06;-0.0004086957196705;4.0791113860905e-05;-0.00015290209557861;5.1004848501179e-05;0.00041371173574589;-0.00023829625570215;0.001686101895757;0.0003323279961478;-0.0022033560089767;0.00020628946367651;0.00049410329665989;-0.0002492880448699;0.00031255045905709;0.0001041314098984;5.1260951295262e-05;3.7927380617475e-05;0.00039494223892689;4.8120011342689e-05;0.00015454906679224;-0.0002525610034354;0.00082680286141112;-0.0010544002288952;0.0004621020052582;0.00081863132072613;-0.00091120548313484;-0.0011129316408187;-0.00014583465235773;0.00023552357743029;-9.1220266767778e-05;9.8870346846525e-05;-4.5823839172954e-05;-0.00027149199740961;3.6072361808692e-07;-5.1064536819467e-05;7.8017787018325e-05;0.00013974227476865;-0.00056957750348374;-0.00016963058442343;-0.00049151148414239;0.00029098888626322;0.00040286005241796;-0.00018746967543848;0.00032370956614614;0.00019667169544846;0.00012967045768164;0.00049098196905106;0.0001141540487879;-8.8176246208604e-05;-0.00030136003624648;2.6207462724415e-05;-0.0023521301336586;-0.0016220684628934;-9.1067617177032e-05;0.0014642386231571;0.002809626981616;0.00073659350164235;-0.00040935116703622;5.235185744823e-05;-0.0007360759191215;-3.5779908102995e-06;-0.00022904538491275;-0.00013636842777487;7.9959878348745e-05;0.00010270012717228;0.00018966806237586;-8.8987042545341e-05;-0.00016719395352993;0.00011671184620354;-0.0012693939497694;0.00066340569173917;-0.001148889772594;2.7415783279139e-06;0.00022363112657331;-0.00015606656961609;-0.0004872637509834;0.00012993812561035;0.00027572416001931;-2.8388922146405e-05;0.00057271524565294;6.1593076679856e-05;-0.00023010703444015;-0.00042006684816442;0.00069278496084735;0.0006932454998605;-5.2422356020543e-06;0.0015635594027117;-0.00099696172401309;0.0007804615306668;-0.00032555786310695;-0.00038708749343641;-3.4673590562306e-05;0.00013816935825162;3.3230730878131e-06;-0.00039018670213409;2.8394777473295e-05;-0.00015670071297791;5.5691332818242e-05;0.00042107017361559;-0.00022436845756602;0.0015967402141541;0.00030629220418632;-0.0023433929309249;0.00026714726118371;0.00050930492579937;-0.00023052531469148;0.00030503314337693;9.443330054637e-05;1.3779446817352e-05;6.4358609961346e-05;0.00045075063826516;2.6862238883041e-05;0.00012795184738934;-0.00034255301579833;0.00069744128268212;-0.0010078479535878;0.00047913636080921;0.0010566326091066;-0.0008662156178616;-0.001104592345655;-0.00014525275037158;0.00029277085559443;-0.00011457483196864;0.00013060971105006;-5.1819053624058e-05;-0.00030740498914383;-7.5829166235053e-07;-1.4229891348805e-05;6.9135763624217e-05;8.2152619143017e-05;-0.00061790487961844;-0.00071894557913765;-0.00041848994442262;2.9431168513838e-05;0.0004793461994268;-0.0001784513151506;0.00034016184508801;7.8497600043193e-05;0.00017623224994168;0.00045944954035804;0.00014199591532815;-1.3729297279497e-05;-0.00032810537959449;-2.1753665350843e-05;-0.0028211406897753;-0.0017494726926088;0.00012932172103319;0.0016678320243955;0.0036439669784158;0.00064494967227802;-0.00014223813195713;-1.7735344954417e-05;-0.00067124119959772;-2.7331501769368e-05;-0.00018927807104774;-0.00016083207447082;3.3621843613219e-05;0.00011478455417091;0.00012966329813935;-6.2355800764635e-05;-0.00012349252938293;0.00010369951633038;-0.00095371704082936;0.00045987477642484;-0.00079984258627519;-1.4738028767169e-05;0.00015330508176703;-0.00010564397234702;-0.00033595721470192;8.1245205365121e-05;0.00013815176498611;-2.0726092770929e-05;0.00036194967105985;4.6328252210515e-05;-0.00016541677177884;-0.00022572392481379;0.00050613493658602;0.00051490578334779;-5.6871482229326e-05;0.0010216819355264;-0.00068452715640888;0.0005712402635254;-0.0002214585110778;-0.0001704965980025;-2.1169127649046e-05;0.00010204378486378;6.4852620198508e-06;-0.00025074474979192;1.6172090909095e-05;-0.00010392365948064;3.6399615055416e-05;0.00028357803239487;-0.000129689622554;0.0011590453796089;0.00018988236843143;-0.0015008199261501;0.00017443862452637;0.00031505565857515;-0.00013947677507531;0.00020851350564044;5.3134346671868e-05;3.119631219306e-05;4.1572384361643e-05;0.00032649148488417;1.24636117107e-05;8.4359373431653e-05;-0.00014941624249332;0.00044943083776161;-0.00069747655652463;0.00027497581322677;0.00059419369790703;-0.00055498100118712;-0.0007668276084587;-8.8092208898161e-05;0.00012735529162455;-7.2209753852803e-05;8.5127539932728e-05;-3.0427554520429e-05;-0.00021332858887035;-5.4439169616671e-07;-5.6631670304341e-06;4.4759552110918e-05;5.6526812841184e-05;-0.00042285068775527;-0.00057011854369193;-0.0002464602002874;-8.9626701083034e-05;0.0003473513352219;-0.00010231389023829;0.0002195749693783;3.2451058359584e-05;0.00012896941916551;0.00030012484057806;0.00010247992759105;2.085566848109e-05;-0.00022091147548053;-1.9622049876489e-05;-0.0019666333682835;-0.0011754792649299;0.00010301167640137;0.0011510618496686;0.0026367295067757;0.00037352531217039;-6.4159568864852e-05;-3.185190143995e-05;-0.00042589238728397;-3.0021830752958e-05;-0.00011106755846413;-0.00011311125854263;-2.6496110194785e-07;7.8626762842759e-05;-7.0011345087551e-05;6.5190506575163e-05;-4.5431781472871e-05;7.2120084951166e-05;0.001329347374849;-0.0013295297976583;0.00059201545082033;-0.000689055188559;-0.00023443045211025;0.00021722441306338;0.00039235810982063;-0.00031853100517765;9.1373301984277e-05;-5.1077731768601e-05;-2.6074749257532e-05;3.8964280975051e-05;-3.339579780004e-05;-0.00017084863793571;3.2119285606313e-05;0.00042379929800518;-0.0002931984490715;-0.0028016050346196;0.0029799439944327;-0.00080774567322806;0.00065014336723834;-2.2469039322459e-05;3.0355344279087e-05;-0.00011182845628355;8.3204242400825e-05;1.9232002159697e-05;-1.2158033314336e-05;4.3386207835283e-05;1.9134895410389e-05;0.00014189552166499;0.00017934426432475;-0.00063074822537601;-0.00056860432960093;0.00040732728666626;0.00036277587059885;0.00015915981202852;0.00012760038953274;-0.00020080785907339;-0.0001817013398977;0.00012180988414912;8.7040571088437e-05;4.7546018322464e-05;7.2644201281946e-05;-0.00021201254276093;0.00010782674507936;-0.0027039963752031;-4.4750653614756e-05;-0.00014241301687434;0.0014311486156657;0.0014860455412418;0.00025169813307002;0.00020060836686753;-0.00026650927611627;-0.00023121650156099;5.2017079724465e-05;7.9039178672247e-05;-9.361605043523e-05;-0.00010167250729864;4.8422069085063e-05;2.2419872038881e-05;-0.0001390358665958;-7.8462304372806e-05;-0.0016672026831657;-0.001306556747295;-0.0014168946072459;-0.0014259063173085;5.9928988775937e-06;-7.1616159402765e-05;-0.00030256030731834;-0.00022509698465001;-0.00042954835225828;-0.00034005948691629;0.0002094131486956;0.00031886572833173;-1.094089657272e-05;-0.0013002038467675;0.00071160506922752;0.00050719093997031;0.00034581072395667;0.0018834699876606;0.0017719629686326;0.00080065365182236;0.0005898610688746;0.00076714577153325;0.00058469682699069;0.0001976287458092;0.00017800790374167;-9.3757786089554e-05;-0.00013530506112147;-6.2517690821551e-05;6.5540982177481e-05;-6.2988423451316e-05;5.1020135288127e-05;0.0012385213049129;-0.0013091998407617;0.00063461245736107;-0.0005930766928941;-0.00022842730686534;0.00021602798369713;0.00037637646892108;-0.00030374396010302;0.0001118852160289;-2.1682644728571e-05;-3.2748033845564e-05;2.4421347916359e-05;-4.0604147216072e-05;-0.00032482758979313;-0.00013935929746367;0.00047263779561035;-0.00022674538195133;-0.0025885093491524;0.0029968249145895;-0.00076870637713;0.0006270679878071;-5.8611854910851e-05;-1.596332367626e-05;-0.00011761743371608;6.7613276769407e-05;1.9587589122239e-05;-6.8080116761848e-06;4.5268774556462e-05;1.5834952137084e-05;0.00013495348684955;0.00017534867220093;-0.00060035736532882;-0.0005407024291344;0.00045272399438545;0.00028811322408728;0.00014292809646577;0.00012592044367921;-0.00019615649944171;-0.00017253712576348;0.00012568046804518;6.9110101321712e-05;3.6038349207956e-05;9.1208072262816e-05;-0.00020968024909962;0.00011647259088932;-0.0026022945530713;-3.6429737519938e-05;-0.00014147894398775;0.0013166053686291;0.0014732860727236;0.00024773561744951;0.00018674389866646;-0.00027869388577528;-0.00020648667123169;4.4111697206972e-05;8.4762665210292e-05;-8.2464612205513e-05;-0.00010556443885434;3.7158250052016e-05;2.9044387702015e-05;-0.00013086778926663;-6.7090360971633e-05;-0.0014253047993407;-0.001401585759595;-0.0012692013988271;-0.0014733074931428;-3.1380836844619e-06;-6.8643836129922e-05;-0.00025057746097445;-0.00025053133140318;-0.00038619735278189;-0.00034739842521958;0.00019076761964243;0.00032558460952714;-6.0285397012194e-06;-0.0012170748086646;0.00070381950354204;0.00047196791274473;0.00030782740213908;0.0015474397223443;0.0019424349302426;0.00067742913961411;0.00063693581614643;0.00069139723200351;0.00059722410514951;0.00017322509665973;0.00018711548182182;-8.1454054452479e-05;-0.00014096945233177;6.8750625359826e-05;-9.9809331004508e-05;-0.00014803939848207;0.00010109990398632;-0.00057514198124409;0.0009495037375018;2.9928234653198e-05;0.00099997769575566;0.00015495232946705;-0.0002140781871276;-9.0503643150441e-05;0.00029129543690942;2.0658413632191e-05;4.4747870560968e-05;-8.5270876297727e-05;-0.00029568059835583;0.00011870147864101;3.9365324482787e-05;-0.00064876384567469;0.00020280573517084;-0.00043312067282386;0.00079459469998255;-0.00091196241555735;0.00027243167278357;-0.00053513515740633;4.2169765947619e-05;-0.00015651689318474;-1.4963683497626e-05;-0.00014856561028864;1.1550667977644e-06;0.0002254144201288;3.623534576036e-05;-9.4279013865162e-05;-0.00010216986265732;0.00024433189537376;0.00027245160890743;0.00079547747736797;0.00023066214635037;-0.0017553719226271;-0.0001925060787471;0.00043931111576967;5.6980537920026e-05;0.00014170550275594;8.5628184024245e-05;-5.3090054279892e-05;4.316584818298e-05;0.0003749186580535;6.4336607465521e-05;-0.00021850527264178;0.00038807390956208;0.00024080462753773;-0.00057741545606405;-0.00059635587967932;0.00094327609986067;-0.00014091488264967;-0.00056142575340346;-0.00014260603347793;0.00027593088452704;-3.6294935853221e-05;0.00013274620869197;-1.9514154701028e-05;-0.00027558740111999;5.2141607739031e-05;2.4507855414413e-05;-0.00053772248793393;-7.3231835813203e-06;-0.00016894872533157;-0.0013327578781173;0.00046480857417919;-0.00070900953141972;0.00017974580987357;3.0315235562739e-05;0.0001921390357893;-0.00011346616520314;0.00017950030451175;0.00013809750089422;-0.00021642494539265;9.581873746356e-05;-0.0001032106592902;-0.0027118911966681;-0.0013150862650946;0.0015426328172907;0.00041107565630227;0.00029555865330622;0.0038303923793137;-0.00013416232832242;0.00029833355802111;-0.00011510409967741;-0.00010265282617183;-0.00015283479297068;-2.0820452846237e-05;7.1195201599039e-05;-6.4847503381316e-05;8.735870505916e-05;-0.00014014850603417;-0.00014893763000146;0.00013495775056072;-0.00073750742012635;0.0012674370082095;-1.4969459698477e-05;0.0012770731700584;0.00018772853945848;-0.00027454283554107;-0.00013594821211882;0.00039767904672772;1.0321891750209e-05;-3.0561186576961e-05;-9.0671826910693e-05;-0.00043416317203082;0.00017114420188591;0.00027602346381173;-0.00070329022128135;0.00012923663598485;-0.00059647823218256;0.0010032001882792;-0.0014575949171558;0.0003696536005009;-0.00070287194103003;7.1558904892299e-05;-4.4848075049231e-05;-6.5445669861219e-06;-0.00018013716908172;-6.8390336309676e-06;0.0003226813278161;4.8190602683462e-05;-0.00012638050247915;-0.00016728228365537;0.00032542287954129;0.00039219507016242;0.001091335201636;0.00027466233586892;-0.0024323842953891;-0.00026651515509002;0.00059393822448328;9.6434574516024e-05;0.00019344719476067;0.00010452912829351;-7.8058408689685e-05;6.4044979808386e-05;0.0004983950057067;9.0734058176167e-05;-0.0003723758563865;0.00062537111807615;0.00039032608037814;-0.00077987450640649;-0.00084931467426941;0.0012948792427778;-0.00020993484940846;-0.00075796694727615;-0.00017327997193206;0.00039168170769699;-5.1495604566298e-05;0.00017417511844542;-2.4001203200896e-05;-0.00036089826608077;7.7880969911348e-05;9.7946804089588e-06;-0.00069855013862252;2.4006296371226e-05;-0.00031960601336323;-0.0013408210361376;0.00055526272626594;-0.0005940297851339;0.00026960359537043;-3.7248359149089e-05;0.0002218497247668;-5.9194979257882e-05;0.00021020356507506;0.00025803578319028;-0.00029380724299699;7.0985210186336e-05;-0.00010203678539256;-0.0033197859302163;-0.0017227624775842;0.0019471695413813;0.0003883368044626;0.00051004253327847;0.0044838050380349;-0.00011033985356335;0.0001916162436828;-0.00011214458208997;-0.00029833032749593;-0.00018829172768164;-8.3244885900058e-05;9.6751347882673e-05;-3.5149947507307e-05;6.4751875470392e-05;-0.0001209789479617;-6.0315625887597e-05;0.00010066234244732;-0.00049999915063381;0.00086310057668015;-5.0346890930086e-05;0.00081651221262291;0.00011052165064029;-0.00016951421275735;-0.00011514770449139;0.00032204543822445;5.1318561418157e-06;-0.0001964160182979;-3.9347502024611e-05;-0.00042701500933617;0.00013611884787679;0.00041902260272764;-0.00034942358615808;-4.4636024540523e-05;-0.00043631668086164;0.00066899770172313;-0.0012985409703106;0.00026859214995056;-0.00050517456838861;5.1706861995626e-05;0.00031535947346129;3.8684884202667e-06;-0.00010762528108899;-1.8917244233307e-05;0.0002933232462965;3.9524027670268e-05;-0.00010775940609165;-0.00017142680007964;0.00027977221179754;0.00036170493694954;0.0010077736806124;0.00019342619634699;-0.0020839117933065;-0.00024401789414696;0.00051558017730713;0.00010036736057373;0.0001778172008926;7.1804301114753e-05;-4.4661017454928e-05;6.7014065280091e-05;0.00037869953666814;9.3430164270103e-05;-0.00033086218172684;0.00064971146639436;0.0003746893198695;-0.00070514855906367;-0.00077811704250053;0.0010337065905333;-0.00019305072783027;-0.00067373481579125;-0.00012774528295267;0.00033115461701527;-4.3399744754424e-05;0.00012495201372076;-1.8695851395023e-05;-0.00027859688270837;7.6272073783912e-05;-2.2791584342485e-05;-0.00055757135851309;6.2992483435664e-05;-0.00038033464807086;-0.00063963059801608;0.00039368643774651;-0.00012601148046087;0.00024302357633132;-8.8380416855216e-05;0.00013904669322073;6.0317961469991e-05;0.00014301309420262;0.00026809866540134;-0.00024109128571581;-4.0905179048423e-05;-4.001654451713e-05;-0.0024057207629085;-0.0014028635341674;0.0014808868290856;0.00013473725994118;0.00056441139895469;0.0030198616441339;-4.2042056520586e-06;-7.3185001383536e-05;-5.3899246267974e-05;-0.00036259766784497;-0.00013714234228246;-0.00012650991266128;7.8099379607011e-05;3.8408295949921e-05;3.4391854569549e-05;-8.2043326983694e-05;2.5161272787955e-05;4.6382028813241e-05;-0.00017506319272798;0.00022204978449736;-5.0293176173e-05;0.00016173589392565;1.4561803254765e-05;-2.4924716854002e-05;-6.7832115746569e-05;0.00018903966702055;1.5477717170143e-05;-0.00035621933056973;1.4998599908722e-05;-0.00036524084862322;6.3800747739151e-05;0.00038504751864821;1.7246311472263e-05;-0.00015418870316353;-0.00015834992518649;0.000229078301345;-0.00078749289968982;0.00010783474863274;-0.00020556093659252;7.4916461016983e-06;0.00071039859903976;5.993520062475e-06;-1.1412938874855e-05;-2.9407543479465e-05;0.00021733960602432;2.5513974833302e-05;-7.4002266046591e-05;-0.0001403830392519;0.0001975954946829;0.00026596972020343;0.00084754609270021;9.273936302634e-05;-0.0014167518820614;-0.00018699195061345;0.00037291541229934;8.1664104072843e-05;0.00014755876327399;2.8712620405713e-05;2.2637033907813e-05;5.9599973610602e-05;0.00017563343863003;8.6496307631023e-05;-0.00018986576469615;0.00056061876239255;0.00027758773649111;-0.00055942754261196;-0.00058179680490866;0.00057125795865431;-0.00013762646995019;-0.00052414211677387;-6.6672495449893e-05;0.00020241003949195;-2.6249354050378e-05;4.1967545257648e-05;-1.1638063369901e-05;-0.00014287653903011;6.3793959270697e-05;-5.0649839977268e-05;-0.00034716405207291;8.3523096691351e-05;-0.00035532825859264;1.7770502154235e-06;0.00020271354878787;0.00025372338132001;0.0001695804821793;-9.4295035523828e-05;4.6314075007103e-05;0.00015763865667395;6.711672176607e-05;0.00018324276607018;-0.00015046783664729;-0.00018291595915798;2.1775927962153e-05;-0.0012505573686212;-0.00090812239795923;0.00084100035019219;-9.3082489911467e-05;0.00050258211558685;0.0013400998432189;8.2037862739526e-05;-0.00027230349951424;-6.5100011852337e-06;-0.00025827210629359;-7.2543298301753e-05;-0.00013592011237051;4.7259320126614e-05;0.00011395319597796;0.00018254909082316;-6.2821789470036e-05;-0.00013876587036066;2.6797653845279e-05;-0.00064044405007735;0.00020991735800635;-0.00011484471178846;7.7749689808115e-05;-9.6935269539244e-05;8.7513733888045e-05;-0.0004282419977244;8.6922147602309e-05;0.00066976353991777;-4.2446663428564e-06;0.00078700028825551;-9.0029243438039e-05;-0.00021116288553458;-0.00073657202301547;-0.00018684093083721;0.00052824878366664;0.00024338152434211;0.001409808639437;-0.00024822540581226;0.000525594339706;-0.0001698963023955;-0.0013708327896893;1.8481099687051e-05;4.377877121442e-05;-1.4466687389358e-05;-0.00044330707169138;6.012498124619e-05;-0.00012233428424224;2.9549164537457e-05;0.00039527923217975;-0.00019963301019743;0.0025697310920805;0.00022964001982473;-0.0013664722209796;2.0469435639825e-06;0.00027678185142577;-0.00019158379291184;0.00029770936816931;7.5758318416774e-05;0.00034431461244822;-5.1419647206785e-05;0.00050351384561509;5.7293378631584e-05;0.00025949260452762;0.00036693862057291;0.00099747360218316;-0.0014071421464905;0.00022375442495104;-0.00043999109766446;-0.0007742666057311;-0.0012440229766071;-6.0313588619465e-05;-0.00053462682990357;2.1362833649619e-05;2.1679030396626e-05;-8.470454304188e-06;-0.00028155837208033;9.5161640274455e-06;-0.00015629608242307;0.00010275738168275;0.00036575336707756;-0.00054819462820888;0.0012037464184687;-0.00051399838412181;0.00032299759914167;0.00029250144143589;-0.0001279610733036;0.0002294091245858;0.0004683182341978;7.7934957516845e-05;0.00057974737137556;5.743687870563e-05;-3.2556006772211e-05;-0.00023092106857803;0.00017057468357962;-0.0015248362906277;-0.0011614327086136;-0.00078437151387334;0.0011912998743355;0.0015003078151494;0.00063102407148108;-0.0011561930878088;0.000140945208841;-0.00090428825933486;2.7562586183194e-05;-0.00025075135636143;-0.0001013143119053;4.6296565415105e-05;8.4501050878316e-05;0.00025640445528552;-9.9478733318392e-05;-0.00025827807257883;0.00012927653733641;-0.0015574645949528;0.00049381802091375;-0.00062586960848421;9.2496018623933e-05;1.8100912711816e-05;1.1341378922225e-05;-0.00064058456337079;0.00012104088818887;0.00052764132851735;5.7459046729491e-06;0.00083575758617371;-4.6592602302553e-05;-0.00032304000342265;-0.00081272056559101;6.9699315645266e-05;0.00096999871311709;0.00012480621808209;0.0020195061806589;-0.00063391879666597;0.0010231507476419;-0.00030425487784669;-0.0010400495957583;-2.517470420571e-05;0.00013352509995457;-1.0889168152062e-05;-0.00050804042257369;5.4047101002652e-05;-0.00017390192078892;4.5544569729827e-05;0.00053366780048236;-0.00021037683472969;0.0031652394682169;0.00031372919329442;-0.0018859056290239;6.4232488512062e-05;0.00038548282464035;-0.00025043365894817;0.00041375530418009;7.9541161539964e-05;0.00038183951983228;-3.6182635085424e-05;0.00067365571158007;6.9571171479765e-05;0.00028180205845274;0.00046077204751782;0.0012057006824762;-0.0017057799268514;0.00024037991533987;-0.00041840510675684;-0.0010018643224612;-0.0016506621614099;-8.9746281446423e-05;-0.00054169236682355;-1.1148297744512e-05;6.0489197494462e-05;-1.2257414709893e-05;-0.00039236107841134;5.3144835874264e-06;-0.00013508535630535;0.00011613983224379;0.00036618555895984;-0.00074723153375089;0.00061540462775156;-0.00055402150610462;3.7186562167335e-06;0.00053550058510154;-0.00010608602315187;0.00030113061075099;0.00039319050847553;0.00015963782789186;0.00071350403595716;0.00013278683763929;8.3520404587034e-05;-0.00033481838181615;0.00012019366113236;-0.0026448934804648;-0.001748300739564;-0.00059471646090969;0.0017957091331482;0.0031902936752886;0.00070293893804774;-0.0010281985159963;7.6051808719058e-05;-0.0010494035668671;-2.9540989999077e-05;-0.00025219755480066;-0.00016659556422383;-3.6530247598421e-05;0.00012171315756859;0.00024538082652725;-0.00010500574717298;-0.00026931203319691;0.00018485238251742;-0.0018031933577731;0.00062306557083502;-0.00093128514708951;4.5598579163197e-05;0.00012339980457909;-7.0798945671413e-05;-0.00063230202067643;0.00011734087456716;0.00029520504176617;-3.7047436762805e-06;0.00067166669759899;1.4133178410702e-05;-0.00031894678249955;-0.00057181750889868;0.00038149586180225;0.0010226571466774;-4.1543768020347e-05;0.0018916022963822;-0.00084527902072296;0.0011139594716951;-0.00033534827525727;-0.00052871735533699;-4.1147610318149e-05;0.00016777619021013;1.527082758912e-06;-0.00043629840365611;3.5039709473494e-05;-0.00017231119272765;4.9100370233646e-05;0.00050831498811021;-0.00017031499010045;0.0027637358289212;0.00030699040507898;-0.0019562935922295;0.00013602357648779;0.00040535285370424;-0.00023512820189353;0.00039924931479618;6.5347587224096e-05;0.00028473915881477;-3.5353620031486e-10;0.00062875117873773;5.394070467446e-05;0.00021818267123308;0.00034041336039081;0.0010227664606646;-0.0014888920122758;0.00022563060338143;-0.00011077131784987;-0.00094258738681674;-0.0015397826209664;-0.00010011137055699;-0.00032831582939252;-5.0471335271141e-05;8.35139217088e-05;-1.7935262803803e-05;-0.00037935317959636;2.1557595175636e-07;-7.262086000992e-05;9.4800270744599e-05;0.00024621788179502;-0.000726968573872;-0.00021480205759872;-0.00043509568786249;-0.00026805515517481;0.00061127316439524;-7.2245617047884e-05;0.00029727956280112;0.00020401432993822;0.00019481226627249;0.00060485955327749;0.00016716215759516;0.00012077585415682;-0.00034339076955803;3.7207359127933e-05;-0.0030001269187778;-0.0018426433671266;-0.00021325466514099;0.0018712250748649;0.003967696800828;0.00058019731659442;-0.00056542176753283;-1.0392132026027e-05;-0.00084120774408802;-7.1549759013578e-05;-0.0001877209142549;-0.00018296434427612;-7.2974267823156e-05;0.00012391280324664;0.00015824120782781;-7.2829956479836e-05;-0.00017454545013607;0.0001460328057874;-0.001233049784787;0.00046563753858209;-0.00074199785012752;-7.6010678640159e-06;0.00012039367720718;-7.9555684351362e-05;-0.00041333443368785;7.5718460720964e-05;0.00012911716476083;-1.4571316569345e-05;0.0004032549331896;3.5241500881966e-05;-0.0002055659861071;-0.00025133549934253;0.00041825583321042;0.00067205150844529;-0.00010453579307068;0.0011561090359464;-0.00065495952730998;0.00075057242065668;-0.00023184902966022;-0.00019769799837377;-2.3387343389913e-05;0.00012238204362802;9.0856001406792e-06;-0.00027224424411543;1.6967193005257e-05;-0.00011699544120347;3.5335011489224e-05;0.0003372807695996;-0.00010274677333655;0.0017012908356264;0.00020639553258661;-0.0013882573693991;0.00013509164273273;0.00029106042347848;-0.00015334048657678;0.00026401079958305;3.9820264646551e-05;0.0001491472357884;1.8340275346418e-05;0.00040623673703521;2.7229007173446e-05;0.00012392118514981;0.00016966660041362;0.00060266413493082;-0.00093040941283107;0.00015545178030152;9.8797288956121e-05;-0.00062133185565472;-0.00099670421332121;-7.3535353294574e-05;-0.00012128394882893;-5.4906977311475e-05;6.7155044234823e-05;-1.6293606677209e-05;-0.00025167598505504;-1.4130938552626e-06;-2.1912661395618e-05;5.5137017625384e-05;0.00011232822726015;-0.00048732344293967;-0.00053597736405209;-0.00024647024110891;-0.00029501269455068;0.00044632508070208;-3.7434994737851e-05;0.00020301445329096;5.4465479479404e-05;0.00014811220171396;0.00035117572406307;0.00012795403017662;8.2296814071015e-05;-0.00023764015350025;-9.0156545411446e-06;-0.0022028314415365;-0.0013014408759773;2.458374001435e-05;0.001307898433879;0.0030584558844566;0.00034430652158335;-0.00016746738401707;-4.3705833377317e-05;-0.00046243905671872;-6.5114349126816e-05;-0.00010053092410089;-0.00013167955330573;-5.5316399084404e-05;8.5259220213629e-05;-5.1025785069214e-05;4.2781452066265e-05;6.1419100347848e-06;4.0111990529113e-05;0.0010203788988292;-0.0010388473747298;0.00061048660427332;-0.00079959584400058;-0.00015914595860522;0.00015333165356424;0.00028151186415926;-0.00023687597422395;8.9634821051732e-05;-0.00010274697706336;-9.1850553872064e-05;0.00011516008089529;-1.8376060324954e-05;-3.2812142308103e-05;0.00011340020864736;0.00023518936359324;-0.00021255925821606;-0.0023927034344524;0.0024461427237839;-0.00059264694573358;0.00049804663285613;-2.6815201636055e-05;0.00010779429430841;-0.00010008678509621;9.6798532467801e-05;4.0844362956705e-05;-4.1667124605738e-05;1.6629270248814e-05;5.7908691815101e-06;0.00019561054068618;0.00020788639085367;-2.5254951196985e-07;-2.2956643078942e-05;0.00038264572503977;0.00042765404214151;7.2621602157596e-05;5.4957119573373e-05;-7.3661962233018e-05;-8.458383672405e-05;0.00012739807425532;9.8089054517914e-05;3.5708169889404e-05;2.2594125766773e-05;-0.0001839379692683;0.00092809443594888;-0.0014966300223023;-0.00028312832000665;-0.00032778090098873;0.00026219949359074;0.00024092296371236;-4.7911769797793e-05;-2.1606143491226e-05;-0.00025678286328912;-0.00022426343639381;1.9848730516969e-05;3.9984264731174e-05;-5.9748599596787e-05;-5.5389791668858e-05;4.0823892049957e-05;7.0756664172222e-06;-1.6696958482498e-05;1.6886817320483e-05;-0.0014246999053285;-0.00094161916058511;-0.0010154818883166;-0.00089101778576151;6.3631683588028e-05;1.3340915756999e-05;-0.00029184826416895;-0.00017686623323243;-0.00027262195362709;-0.00019086900283583;0.00013093823508825;0.00017696007853374;1.8255343093188e-05;-0.00050397089216858;0.00010449597903062;0.00013243887224235;3.4262004191987e-05;0.0016709980554879;0.0012210359564051;0.00066888978471979;0.00040717728552409;0.00055794202489778;0.00039260575431399;0.00015873319352977;0.00012208937550895;-0.0001015771922539;-0.00011131161591038;-7.3786803113762e-05;6.9241927121766e-05;-1.1093823559349e-05;3.1629835575586e-05;0.0015052384696901;-0.0015746528515592;0.00094576686387882;-0.0010886858217418;-0.00024148912052624;0.00023868442804087;0.00042216514702886;-0.00034478228189982;0.000159727409482;-0.00011636604176601;-0.00012836766836699;0.00014432397438213;-3.5886205296265e-05;-0.00025714034563862;-1.5289429939003e-05;0.00040671267197467;-0.00022512802388519;-0.0033751097507775;0.0037243205588311;-0.00088731554569677;0.0007356476271525;-9.4106304459274e-05;0.00011472906771814;-0.00015706359408796;0.00012515041453298;5.7741286582313e-05;-5.481626430992e-05;3.0459030313068e-05;6.4499790823902e-06;0.00027483480516821;0.00029133199132048;-8.2566701166797e-05;-6.4687141275499e-05;0.00061268819263205;0.00056719442363828;0.00010027064126916;9.0628855105024e-05;-0.00012754948693328;-0.00012235714530107;0.00018582164193504;0.00013065604434814;3.9361279050354e-05;5.0779268349288e-05;-0.00026513155899011;0.0012755760690197;-0.0022619015071541;-0.00039078688132577;-0.00045320283970796;0.00045184502960183;0.0004712934314739;-1.6045669326559e-05;-2.2824897314422e-05;-0.00038367920205928;-0.00031218290678225;2.6855725081987e-05;6.446801853599e-05;-7.9493096563965e-05;-8.8105494796764e-05;4.6090281102806e-05;1.7858954379335e-05;-2.289519761689e-05;3.3029467886081e-05;-0.00182871427387;-0.0015271086012945;-0.0013603802071884;-0.0014501491095871;6.4856605604291e-05;1.739874278428e-05;-0.00037355459062383;-0.00029645167523995;-0.00038208009209484;-0.00031946858507581;0.00018072745297104;0.00028683998971246;4.1595299990149e-05;-0.00066325522493571;0.00026223913300782;0.00016102541121654;1.0227566235699e-05;0.0020275146234781;0.0020215837284923;0.00086769118206576;0.00067837676033378;0.00076358299702406;0.00063064147252589;0.0002127475454472;0.00020156661048532;-0.00012911147496197;-0.00017242519243155;-6.5593216277193e-05;6.9839683419559e-05;-3.7773846997879e-05;4.3837153498316e-06;0.0014293546555564;-0.0015493419487029;0.0009953249245882;-0.00099454633891582;-0.00023325302754529;0.00023776575108059;0.00041360160685144;-0.00032499097869731;0.00019057386089116;-7.9415411164518e-05;-0.00013462836795952;0.00013314613897819;-4.6043809561525e-05;-0.00049131794366986;-0.00021673541050404;0.00048530322965235;-0.00013649967149831;-0.0031376115512103;0.0037913608830422;-0.00086408137576655;0.00070249743293971;-0.00014348461991176;5.7215660490328e-05;-0.00016729279013816;0.00010650828335201;5.6986384151969e-05;-5.1251845434308e-05;3.3094373065978e-05;1.6630453956168e-06;0.00027688566478901;0.00028366263723001;-7.5519812526181e-05;-4.7768139666005e-06;0.00065487035317346;0.00049547833623365;8.3248152805027e-05;9.1080633865204e-05;-0.00013181427493691;-0.00010456336167408;0.00018567756342236;0.00011681507021422;2.7056241378887e-05;7.0698566560168e-05;-0.00026199160492979;0.0013005442451686;-0.0021593510173261;-0.00040278691449203;-0.00044702005106956;0.00036263090441935;0.00041863197111525;-4.8467277338204e-06;-5.4728432587581e-05;-0.00038999886601232;-0.00029302734765224;2.2080468625063e-05;6.7959634179715e-05;-6.859989662189e-05;-9.3052796728443e-05;3.2829524570843e-05;2.7239206247032e-05;-1.844654980232e-05;4.3451746023493e-05;-0.0015379544347525;-0.0016970237484202;-0.0011660614982247;-0.0015626449603587;4.7558140067849e-05;3.3745553082554e-05;-0.00031104832305573;-0.0003342563577462;-0.00032987864688039;-0.00033626137883402;0.00015636820171494;0.00030068308115005;4.5296485041035e-05;-0.00060974451480433;0.00024167977971956;0.00013695533561986;-1.8901055227616e-05;0.0016062521608546;0.0023340904153883;0.00072326778899878;0.00075366016244516;0.00066924066049978;0.00066745316144079;0.00018180071492679;0.00021801903494634;-0.00011193871614523;-0.00018543090845924;-3.5473865864333e-05;4.2991545342375e-05;-4.1659332055133e-05;-1.1473200174805e-05;0.00087431777501479;-0.00098044786136597;0.00069907301804051;-0.00063355744350702;-0.00014400958025362;0.00015271041775122;0.00026335619622841;-0.00019664975116029;0.0001459292252548;-3.5964258131571e-05;-0.00010377315629739;9.6056704933289e-05;-3.6451285268413e-05;-0.00046524408389814;-0.00025126538821496;0.00037563449586742;-4.5893772039562e-05;-0.001943672192283;0.0025552636943758;-0.00054550805361941;0.00042976008262485;-0.00011716735752998;5.383541520132e-06;-0.00011846605775645;6.2544626416638e-05;3.9638540329179e-05;-3.5983091947855e-05;2.0868681531283e-05;-3.7272163808666e-06;0.00020166984177195;0.00019464000070002;2.8931606721017e-05;0.00011292771523586;0.00045859077363275;0.00030144295305945;3.6189532693243e-05;5.3166288125794e-05;-7.9054647358134e-05;-4.7327921492979e-05;0.00012472216621973;7.3778071964625e-05;1.449745377613e-05;5.8204885135638e-05;-0.00017703484627418;0.0010057387407869;-0.0012690622825176;-0.00031576454057358;-0.00032377065508626;6.4853869844228e-05;9.3596434453502e-05;-3.3017062378349e-05;-9.0715548139997e-05;-0.00026724897907116;-0.00019188341684639;1.1065300896007e-05;4.4666598114418e-05;-3.8310394302243e-05;-6.2633436755277e-05;1.5938701835694e-05;2.3664686523261e-05;-4.1971065911639e-06;4.1050465370063e-05;-0.00087132654152811;-0.0012452402152121;-0.00063559133559465;-0.0010886271484196;2.9431341317832e-05;4.7432626161026e-05;-0.00017512979684398;-0.00024592547561042;-0.00017031552852131;-0.00021832343190908;8.3649698353838e-05;0.00019921806233469;2.7554220650927e-05;-0.00036942609585822;5.3624549764208e-05;7.1673624916002e-05;-3.5765202483162e-05;0.00086815463146195;0.0017853059107438;0.00039579535950907;0.00054112554062158;0.00037290435284376;0.00045649008825421;9.9543998658191e-05;0.0001516751217423;-6.9090718170628e-05;-0.00013527440023609;7.4891053372994e-05;-0.00011993362568319;-0.00017070364265237;0.00013530284923036;-0.00057342293439433;0.0011665221536532;3.6555752558343e-06;0.00093483069213107;0.00013168748409953;-0.00019046491070185;-8.8371765741613e-05;0.00033929027267732;9.7389010988991e-06;3.0281702493085e-05;-7.0394788053818e-05;-0.0003126775554847;0.00015435085515492;0.00011492445628392;-0.00053351500537246;0.00020787623361684;-0.00056316884001717;0.0007569047738798;-0.0010738298296928;0.00028080004267395;-0.00064791936893016;5.2557050366886e-05;-0.00011603224993451;-1.3184373528929e-05;-0.00015377026284114;-2.0671691345342e-06;0.00023584214795846;3.3276599424426e-05;-0.00010002784256358;-7.2419985372107e-05;0.00026543362764642;0.00028660561656579;0.0011612207163125;0.00018020434072241;-0.0016506018582731;-0.00019449720275588;0.00040312498458661;4.7302339226007e-05;0.00017580720304977;6.1556842410937e-05;1.4567044672731e-05;5.2294359193183e-05;0.00042697440949269;8.796726615401e-05;3.0108316423139e-05;0.00053145195124671;0.00013645770377479;-0.00071393680991605;-0.00064290117006749;0.00052845210302621;-0.00013243171270005;-0.00069286749931052;-0.00011671270476654;0.00011075695510954;-2.3754597350489e-05;0.00011826766422018;-1.9017132217414e-05;-0.00029266157071106;6.3562707509845e-05;3.7972747577442e-06;-0.0005798414349556;4.3696843931684e-05;-0.00018646572425496;-0.0011449015000835;0.00050601421389729;-0.00078017287887633;0.00017543957801536;5.3328516514739e-05;0.00019570217409637;-6.4918880525511e-05;0.00018973389524035;0.00019107322441414;-0.00022518438345287;0.00013684458099306;-8.1367077655159e-05;-0.0027809448074549;-0.0013662630226463;0.0016199859092012;0.00028905723593198;0.0002939626283478;0.0039362870156765;-0.00012672992306761;0.00015397412062157;-0.00012872443767264;-0.00017798325279728;-0.00016047124518082;-2.9086384529364e-05;7.4352756200824e-05;-9.3757720605936e-05;0.00010022025526268;-0.00018284558609594;-0.00020840115030296;0.00021258110064082;-0.00072415411705151;0.0017427916172892;-6.4033498347271e-05;0.0011167108314112;0.00012961520405952;-0.0002083456638502;-0.0001259328564629;0.00050048768753186;-1.309943945671e-05;-4.9490856326884e-05;-5.6391287216684e-05;-0.00047722939052619;0.00025366217596456;0.00042594835394993;-0.00045284416410141;0.00015537046419922;-0.00089330435730517;0.00090560695389286;-0.0017753248102963;0.00038368461537175;-0.00095051020616665;8.945519948611e-05;3.3400705433451e-05;-4.2630645111785e-06;-0.00019554603204597;-1.2972981494386e-05;0.0003451541706454;4.0188140701503e-05;-0.00013588900037576;-9.7796350019053e-05;0.0003702225512825;0.00039644719799981;0.0019339866703376;0.00015977001748979;-0.0021198801696301;-0.00026332377456129;0.00049765186849982;6.8188746809028e-05;0.00026084599085152;4.7258778067771e-05;9.3226131866686e-05;8.1184633017983e-05;0.00062673090724275;0.00015103595796973;0.00021389583707787;0.00090954836923629;0.00014017667854205;-0.0011010690359399;-0.00091270479606465;0.000313143216772;-0.00017400865908712;-0.0010442833881825;-0.00011111720959889;-3.4995420719497e-05;-2.1313502656994e-05;0.00014065466530155;-2.2132408048492e-05;-0.00040564284427091;0.00010392498370493;-3.9199785533128e-05;-0.00080238690134138;0.00014670043310616;-0.00034371865331195;-0.00090646999888122;0.00064528733491898;-0.00084011763101444;0.00024671319988556;3.4689306630753e-05;0.00023561171838082;4.6885037590982e-05;0.00023194489767775;0.00036827634903602;-0.00030681325006299;0.00019255086954217;-4.9963564379141e-05;-0.0034964384976774;-0.0017958871321753;0.0021401930134743;9.9262520961929e-05;0.00047572545008734;0.0047607636079192;-0.00010111812298419;-0.00013832381227985;-0.00014363740046974;-0.00045260830665939;-0.0002061862469418;-8.9495835709386e-05;0.00010256995301461;-0.00011873373296112;7.6644348155241e-05;-0.00016702513676137;-0.00011802728840848;0.00018315309716854;-0.00048675510333851;0.0013971041189507;-0.00010713867231971;0.00067782233236358;3.5666085750563e-05;-8.4867489931639e-05;-0.00010909012053162;0.00043570957495831;-2.5901663320838e-05;-0.0002250752877444;7.3372857514187e-06;-0.00051600072765723;0.0002414587943349;0.00066133291693404;-6.9955902290531e-05;-5.8301207900513e-05;-0.00078899651998654;0.00056171155301854;-0.0017273785779253;0.00029455000185408;-0.00076915789395571;6.94303525961e-05;0.00042264061630704;1.0135429874936e-05;-0.00013168480654713;-2.8173186365166e-05;0.00033883316791616;2.9520453608711e-05;-0.00011248458758928;-0.00011330931010889;0.00032433701562695;0.0003329795144964;0.0019652238115668;6.0882088291692e-05;-0.0017267507500947;-0.00022566562984139;0.00038968108128756;7.2477232606616e-05;0.00023031118325889;5.0024455049424e-06;0.0001575125643285;7.6320866355672e-05;0.00057024689158425;0.00016933582082856;0.00026731260004453;0.00093427789397538;0.00013803123147227;-0.0010819658637047;-0.00080824375618249;-1.3207843949203e-05;-0.00014197785640135;-0.00096518197096884;-4.7312390961451e-05;-0.00020939880050719;-1.2376367521938e-05;9.8195050668437e-05;-1.3055776435067e-05;-0.00035071690217592;0.00010914479207713;-9.1384456027299e-05;-0.00068454828578979;0.0002296755410498;-0.0004280706634745;9.2514310381375e-05;0.00044966986752115;-0.00033710635034367;0.00022631797764916;-4.3062449549325e-05;0.00015127132064663;0.00022015813738108;0.00014676262799185;0.00042693573050201;-0.00025581894442439;0.00012554116256069;4.5043576392345e-05;-0.0024990909732878;-0.0014008765574545;0.0016825085040182;-0.00030462938593701;0.00052540661999956;0.0031007064972073;2.4448203475913e-05;-0.00055459229042754;-5.8829849876929e-05;-0.00063000101363286;-0.00015173577412497;-0.00014778545300942;8.758989861235e-05;-5.6162272812799e-05;4.5301003410714e-05;-0.00011758409527829;-3.262066093157e-05;0.00011437667126302;-0.00021985521016177;0.00076008966425434;-9.1250702098478e-05;0.00022024966892786;-3.2532072509639e-05;2.2128087948659e-05;-7.2142465796787e-05;0.00029094301862642;-1.694672209851e-05;-0.00030976487323642;4.4752905523637e-05;-0.00044782436452806;0.00016418973973487;0.00060434581246227;0.00015168311074376;-0.00016319447604474;-0.00048972509102896;0.00022200209787115;-0.0012168929679319;0.00016212099581026;-0.00045100064016879;2.8010859750793e-05;0.00064268911955878;1.3372633475228e-05;-5.8514640841167e-05;-3.3045271266019e-05;0.00026663890457712;1.7679483789834e-05;-7.6173630077392e-05;-0.00010669305629563;0.0002340123464819;0.00022285220620688;0.0015683884266764;1.8900395843957e-06;-0.0011474960483611;-0.00015936433919705;0.00025672733318061;6.1115024436731e-05;0.00016626766591799;-1.9231538317399e-05;0.00016972253797576;5.6460819905624e-05;0.00040079987957142;0.00015204123337753;0.00023460773809347;0.0007333715329878;0.00011720276233973;-0.00086280470713973;-0.00057846662821248;-0.00016468406829517;-9.0587527665775e-05;-0.0007208704482764;-4.2799733819265e-06;-0.00026008181157522;-6.0142697293486e-06;4.7375746362377e-05;-4.4407479435904e-06;-0.00023932580370456;8.8356144260615e-05;-0.0001005436424748;-0.00047157664084807;0.0002208350924775;-0.0003829374036286;0.0005796387558803;0.00024400505935773;1.2069888725819e-05;0.00016231842164416;-6.8993547756691e-05;7.1385533374269e-05;0.00026463071117178;6.7919900175184e-05;0.0003390824131202;-0.00016920820053201;3.104175630142e-05;8.9428802311886e-05;-0.0014075547223911;-0.00088328286074102;0.0010623305570334;-0.00045106583274901;0.00044257857371122;0.0015215921448544;9.0522866230458e-05;-0.00063978967955336;-9.6836697593972e-07;-0.00054173829266801;-8.8768814748619e-05;-0.00014475353236776;5.9215271903668e-05;4.229603746353e-06;0.00011602370068431;-2.7552847313927e-05;-7.6068266935181e-05;5.2984769354225e-06;-0.00024151385878213;-4.4496980990516e-05;0.00034261497785337;6.7912784288637e-05;-0.00025443194317631;0.00020268253865652;-0.00026094471104443;3.6258399632061e-05;0.00062526343390346;1.4217949683371e-05;0.00073983112815768;-0.00014708233356941;-0.00019234089995734;-0.00072311860276386;-0.00049879983998835;0.0004062885127496;0.00028460533940233;0.00099513295572251;0.00015796118532307;0.00024529342772439;-6.6469241573941e-05;-0.001438575098291;4.8240664909827e-05;1.263744343305e-05;-1.7739723261911e-05;-0.00036943494342268;5.8306424762122e-05;-4.1110935853794e-05;-3.5254161048215e-06;0.00023619696730748;-0.00013826956273988;0.002654024399817;3.0256192985689e-05;-0.00029535972862504;-0.00015901059668977;-2.311724347237e-05;-4.8302976210834e-05;0.000123157951748;4.0083286876325e-05;0.00050567352445796;-0.00010948171984637;0.00057021545944735;1.7766145901987e-05;0.0003078792069573;0.00071354885585606;0.00078343477798626;-0.0013821775792167;1.5504949260503e-05;-0.0012587048113346;-0.00038795766886324;-0.00088668294483796;3.895403642673e-05;-0.0011919948738068;0.00012572410923894;-1.6627702279948e-05;1.7284830391873e-05;-0.00026058126240969;2.3200133000501e-05;-0.00021663471125066;9.9203280115034e-05;0.00049652875168249;-0.00042605798807926;0.0023217843845487;-0.00040898576844484;0.00028256856603548;7.525004184572e-05;-9.3060894869268e-05;0.00010967245907523;0.00060420378576964;2.540324749134e-05;0.00051793904276565;-2.6191672077402e-05;7.6164986239746e-05;-0.00011762564099627;0.00029231605003588;-0.00039672281127423;-0.00037872709799558;-0.0013313029194251;0.00069335853913799;-0.00011539539264049;0.00034970516571775;-0.0015885789180174;0.00018625651136972;-0.00091520370915532;8.2502367149573e-05;-0.00020394708553795;-4.5934353693156e-05;-2.6570971840556e-06;5.4168998758541e-05;0.00020262697944418;-6.0875652707182e-05;-0.00018529618682805;6.2948362028692e-05;-0.00095334550132975;0.00012991702533327;8.9408065832686e-05;0.00011886233551195;-0.00021147492225282;0.00018709563300945;-0.00047838137834333;7.2096423537005e-05;0.0007100849179551;2.7953998142038e-05;0.00090305955382064;-0.00015031796647236;-0.00030902904109098;-0.00098928424995393;-0.00049715337809175;0.00080738723045215;0.00029800299671479;0.0017001234227791;-4.8749290726846e-05;0.00065330893266946;-0.00017113961803261;-0.0015411839121953;1.8179596736445e-05;5.9301248256816e-05;-2.2117688786238e-05;-0.00049038435099646;6.8376488343347e-05;-9.7795280453283e-05;1.2017274457321e-05;0.00039776525227353;-0.00017502144328319;0.0035154500510544;0.00012994736607652;-0.00081294710980728;-0.0001525772822788;8.1991631304845e-05;-0.00012202370271552;0.00026682109455578;5.4675361752743e-05;0.00059618894010782;-0.00011812336015282;0.00074569479329512;4.4540691305883e-05;0.0003612537693698;0.00086833548266441;0.0011473530903459;-0.0018075957195833;5.2780680562137e-05;-0.0014335541054606;-0.00067198841134086;-0.0013956024777144;9.1187266662018e-06;-0.0012903383467346;0.00012035377585562;-1.5616263908669e-06;1.7703963749227e-05;-0.00036344173713587;2.0578756448231e-05;-0.00024982175091282;0.00013108519488014;0.00060117995599285;-0.00062997901113704;0.00245466013439;-0.00055875704856589;0.00026579209952615;0.0002425560815027;-0.00012131572293583;0.00019678119861055;0.00070557883009315;7.0815171056893e-05;0.00077139295171946;1.6530148059246e-05;0.00014291009574663;-0.00021736363123637;0.00030680157942697;-0.0011844937689602;-0.00089907692745328;-0.0014570147031918;0.0012093199184164;0.0008626445196569;0.00054488354362547;-0.0018829246982932;0.00020014487381559;-0.0012679834617302;6.8121378717478e-05;-0.00027658679755405;-9.3845148512628e-05;-4.1966370190494e-05;8.9931403636001e-05;0.0002621128805913;-9.2958427558187e-05;-0.00029679367435165;0.00015722190437373;-0.0017959433607757;0.00038613239303231;-0.00037398232962005;0.00013688637409359;-7.1881964686327e-05;9.2698355729226e-05;-0.0006511498359032;9.7452764748596e-05;0.00051382184028625;3.7071102269692e-05;0.00083468772936612;-9.3765513156541e-05;-0.00038481564843096;-0.00096699385903776;-0.00024973953259178;0.0011703430209309;0.00014756052405573;0.0021477213595062;-0.00039986034971662;0.001107151969336;-0.00028095406014472;-0.0010757776908576;-3.3105879992945e-05;0.00013153892359696;-1.6829868400237e-05;-0.00049378979019821;5.5940712627489e-05;-0.00014398142229766;2.8083575671189e-05;0.00049775041406974;-0.00015437793626916;0.003744238987565;0.00022096718021203;-0.0012442972511053;-8.8632084953133e-05;0.00019166481797583;-0.00017967767780647;0.00038189964834601;4.9945745558944e-05;0.00056679069530219;-9.3047463451512e-05;0.00079281610669568;6.3170708017424e-05;0.00033220567274839;0.00090098090004176;0.0012851879000664;-0.0018868894549087;4.1204595618183e-05;-0.0013305473839864;-0.00085260486230254;-0.0016948675038293;-2.7923719244427e-05;-0.0011109233601019;7.4269417382311e-05;2.2412234102376e-05;1.5754985724925e-05;-0.00041244379826821;1.0870408004848e-05;-0.00020258600125089;0.00013082056830171;0.00053406244842336;-0.00074443488847464;0.0015945323975757;-0.00054242514306679;-4.2213501728838e-05;0.00046850991202518;-8.0435973359272e-05;0.0002452805347275;0.0005657515139319;0.00013684110308532;0.00082767457934096;9.4227121735457e-05;0.00021372707851697;-0.00029659629217349;0.00021557744184975;-0.0021410386543721;-0.0014148694463074;-0.0010891370475292;0.0016503313090652;0.0024131229147315;0.00057609350187704;-0.0015664556995034;0.00011766106035793;-0.0012619228800759;-4.3289560380799e-06;-0.00025684694992378;-0.00014687774819322;-0.00010940308129648;0.00011535899102455;0.00022422811889555;-8.8441236584913e-05;-0.00027007635799237;0.00017482128168922;-0.0017455607885495;0.00045283301733434;-0.00058132380945608;8.6013758846093e-05;3.5139069950674e-05;3.1163517633104e-06;-0.00057290180120617;8.6826912593096e-05;0.00026973459171131;2.1259827917675e-05;0.00058987317606807;-2.7385000066715e-05;-0.00031701664556749;-0.00062659318791702;4.715667819255e-05;0.0010281400755048;-7.9615210779593e-06;0.0017668956425041;-0.00054542755242437;0.0010525521356612;-0.00027163545018993;-0.00053720991127193;-4.4164924474899e-05;0.00014039326924831;-4.8256351874443e-06;-0.00037234465708025;3.3884585718624e-05;-0.00013473913713824;3.1493935239268e-05;0.00042819697409868;-0.00010618373198668;0.0028662569820881;0.000222481743549;-0.0012546450598165;-7.3760048735494e-07;0.00022670546604786;-0.0001695105311228;0.00034796440741047;3.6443288990995e-05;0.00038688257336617;-4.5025921281194e-05;0.00061231578001752;5.3158542868914e-05;0.00022614459157921;0.00064580980688334;0.0010041823843494;-0.0014381690416485;4.1700961446622e-05;-0.00081317510921508;-0.00075033737812191;-0.0014208301436156;-4.8058216634672e-05;-0.00067386694718152;1.6388305084547e-05;3.6501205613604e-05;6.7103151195624e-06;-0.00033653402351774;2.4754845071584e-06;-0.00011202132009203;9.4026407168712e-05;0.00033202764461748;-0.00062528578564525;0.00049872096860781;-0.0003788988396991;-0.00024619168834761;0.00049938628217205;-3.4434673580108e-05;0.0002165142504964;0.00030602893093601;0.00014888637815602;0.00061144074425101;0.00012355970102362;0.00017885716806632;-0.00027261005016044;9.6026677056216e-05;-0.0022477300371975;-0.0014015716733411;-0.0005240153404884;0.0015160907059908;0.0028928541578352;0.00043565992382355;-0.00088013074127957;2.4617711460451e-05;-0.00087399093899876;-5.3152140026214e-05;-0.00017186922195833;-0.00014549281331711;-0.00010950450814562;0.00010220221156487;-4.0562543290434e-05;3.7140602216823e-05;4.5817003410775e-05;-1.9906006855308e-05;0.00082335533807054;-0.00094212905969471;0.00065656442893669;-0.00078450533328578;-0.00014677995932288;0.00015315583732445;0.00022068375255913;-0.00018793423078023;9.5890478405636e-05;-9.1992602392565e-05;-0.00012209462875035;0.00012720633822028;-2.1791229301016e-05;-0.0001176475052489;2.6490690743231e-06;0.00015927175991237;-6.9972818891983e-05;-0.0021351573523134;0.0023612536024302;-0.00047885117237456;0.00042606514762156;-2.8143776944489e-05;8.7989603343885e-05;-9.5323746791109e-05;8.388399874093e-05;4.583202462527e-05;-4.3966923840344e-05;1.6065872841864e-05;2.6973705189448e-06;0.00018848283798434;0.00020595247042365;0.00022320046264213;0.00018866553728003;0.00043353723594919;0.00042157608550042;1.4059838576941e-05;1.5183358300419e-05;-2.3324353605858e-05;-4.1917504859157e-05;0.00011984881712124;8.0671350588091e-05;3.0124869226711e-05;2.7324374968885e-05;-0.00022618922230322;0.001217300654389;-0.0010089263087139;-0.00026469645672478;-0.00032543911947869;-0.0002726984093897;-0.00024964252952486;-0.00014989110059105;-0.00011332173744449;-0.00026272467221133;-0.00020879287330899;1.844640564741e-06;3.2643161830492e-05;-3.2910025765887e-05;-3.8704703911208e-05;2.5656647267169e-05;3.500144885038e-06;7.7161093940958e-05;9.8573436844163e-05;-0.001056109322235;-0.00083118508337066;-0.00073371676262468;-0.00073459511622787;5.1953982620034e-05;2.898676575569e-05;-0.00024423364084214;-0.00018408622418065;-0.00017294567078352;-0.00014654216647614;9.8565062216949e-05;0.00014141733117867;5.286118175718e-05;0.00025151410955004;2.7734263312595e-06;-0.00019891427655239;-0.00026553124189377;0.0011319753248245;0.00098084437195212;0.00048602075548843;0.00036610121605918;0.00040206854464486;0.00033218145836145;0.00012512106331997;0.00011365467798896;-9.4794486358296e-05;-0.00010827665391844;-6.9622597948182e-05;6.6114756918978e-05;7.7731434430461e-05;-6.7959263105877e-05;0.0013999363873154;-0.001545072067529;0.0011084565194324;-0.0012405695160851;-0.00022616190835834;0.00023910129675642;0.00035768857924268;-0.00029041376546957;0.00018724848632701;-0.00014034209016245;-0.0001917354966281;0.0002000995882554;-3.1073206628207e-05;-0.00031807052437216;-9.5124472863972e-05;0.00020988055621274;-4.320791902046e-07;-0.0032892578747123;0.0037890942767262;-0.00079258851474151;0.00067768531152979;-0.00013521485379897;0.00015355236246251;-0.00016163056716323;0.00012769654858857;7.7614175097551e-05;-7.6631433330476e-05;2.3751388653181e-05;-2.4639973617013e-07;0.00030147403595038;0.00030877767130733;0.00035631231730804;0.00036417614319362;0.00071613036561757;0.00066381791839376;1.5576637451886e-05;2.4670025595697e-05;-3.6639510653913e-05;-4.3435265979497e-05;0.00019247669843026;0.00013100492651574;2.1364112399169e-05;2.9872253435315e-05;-0.00032288883812726;0.0020034313201904;-0.0014612154336646;-0.00047947096754797;-0.00053085276158527;-0.00052116223378107;-0.00053518445929512;-0.00022781724692322;-0.00020893648616038;-0.00040476772119291;-0.00032098012161441;-5.2000818868692e-06;4.0016373532126e-05;-4.0181323129218e-05;-5.387336932472e-05;2.668840897968e-05;6.2048152358329e-06;0.00014683209883515;0.00017981814744417;-0.0014549641637132;-0.0013501397334039;-0.00099233060609549;-0.00117895193398;7.4437593866605e-05;6.5171479946002e-05;-0.00035451716394164;-0.00031111351563595;-0.00026292257825844;-0.00025081934290938;0.00012372017954476;0.00021386044682004;0.0001160730025731;0.00064631260465831;-2.7360499643692e-06;-0.00043157831532881;-0.00052660290384665;0.0013936514733359;0.0015847522299737;0.00070214184233919;0.00061725883278996;0.00059127679560333;0.00055055855773389;0.00018382882990409;0.00019080904894508;-0.00012744875857607;-0.00016927119577304;-6.4619991462678e-05;6.656637560809e-05;5.5330252507702e-05;-8.7022635852918e-05;0.0013786221388727;-0.0015161854680628;0.0011416947236285;-0.0011790991993621;-0.00021988181106281;0.00023636184050702;0.00036009500036016;-0.00027460523415357;0.00021455758542288;-0.00011051556066377;-0.00019259445252828;0.00019701867131516;-3.8708858483005e-05;-0.00051408505532891;-0.0002338195045013;0.00027672492433339;6.3446983403992e-05;-0.0031362068839371;0.0038572559133172;-0.00079678959446028;0.00064734846819192;-0.00017805518291425;0.00010478532931302;-0.0001710831274977;0.00011375130998204;7.5451855082065e-05;-7.5738775194623e-05;2.5801051378949e-05;-3.4501633763284e-06;0.00031097716419026;0.00029687871574424;0.00033060082932934;0.00041095723281614;0.00073303893441334;0.00062403577612713;9.583130122337e-06;2.5854582418106e-05;-4.8146404878935e-05;-2.7811460313387e-05;0.00018982244364452;0.00012514380796347;1.2663032975979e-05;4.3028692743974e-05;-0.0003206187102478;0.0020085708238184;-0.0014174145180732;-0.00050223711878061;-0.00050969835137948;-0.00052571477135643;-0.00057844241382554;-0.0002055791701423;-0.00023565419542138;-0.00040183233795688;-0.00031304531148635;-4.8967231123243e-06;4.0620645449962e-05;-3.5156597732566e-05;-5.787859481643e-05;1.7715599824442e-05;1.4051051948627e-05;0.00014570854546037;0.00018020154675469;-0.0012609261320904;-0.0015013001393527;-0.00085536227561533;-0.0012936467537656;6.0868875152664e-05;8.0778539995663e-05;-0.00031283378484659;-0.0003393231309019;-0.00023116430384107;-0.00026636203983799;0.0001050307037076;0.00022969330893829;0.00011551388161024;0.00063483597477898;-1.7367787222611e-05;-0.00043034710688516;-0.00052370870253071;0.0010979553917423;0.0018728466238827;0.00060950714396313;0.00067821203265339;0.0005308894906193;0.00058710837038234;0.00016278558177873;0.00020451037562452;-0.00011348818952683;-0.00018238263146486;-3.2945066777756e-05;3.7817979318788e-05;9.7301253845217e-06;-5.2916529966751e-05;0.00080349791096523;-0.00088965892791748;0.00072355492739007;-0.00068106467369944;-0.00013743329327554;0.00014751589333173;0.00022667160374112;-0.00016048431280069;0.00014423868560698;-4.1876435716404e-05;-0.00012439163401723;0.00012346592848189;-3.0995372071629e-05;-0.00044195243390277;-0.00023396189499181;0.00026228718343191;3.4163498639828e-05;-0.001892410684377;0.0024790710303932;-0.00049147597746924;0.00037372292717919;-0.00010690884664655;4.3964564611088e-06;-0.0001125157577917;6.0328449762892e-05;4.3253185140202e-05;-4.2724044760689e-05;1.9511893697199e-05;-3.3207522847079e-06;0.00020643901370931;0.00018755363998935;0.00018537594587542;0.00027928044437431;0.00046913578989916;0.00035281194141135;3.2722707601351e-06;1.6435080397059e-05;-4.1772793338168e-05;-1.4024057236384e-05;0.0001166889196611;7.086074037943e-05;1.3097224837111e-05;5.0937156629516e-05;-0.00022184144472703;0.0012456761905923;-0.00092563679208979;-0.00030977491405793;-0.0002965914318338;-0.000297968799714;-0.00033845999860205;-0.00011528410686878;-0.0001631295599509;-0.00025881986948662;-0.00019640928076115;1.3787202988169e-06;3.3749016438378e-05;-2.3341895939666e-05;-4.5828313886886e-05;1.0405483408249e-05;1.6206333384616e-05;7.6072930824012e-05;0.00010339113941882;-0.00072982377605513;-0.0010852721752599;-0.00049767590826377;-0.0009277606732212;3.1491006666329e-05;5.4406315030064e-05;-0.00017510689212941;-0.00023250334197655;-0.00012135595898144;-0.00017118034884334;6.3924926507752e-05;0.00016915037122089;5.4473384807352e-05;0.00025076261954382;-2.7068073904957e-05;-0.00020277249859646;-0.0002740760683082;0.00061972212279215;0.0014729410177097;0.00033330050064251;0.00046827920596115;0.00030343170510605;0.00039101368747652;9.0012217697222e-05;0.00013699095870834;-7.0032780058682e-05;-0.00013134756591171;8.6874046246521e-05;-0.00018654922314454;-0.0002063690481009;0.00024621092597954;-0.00055486452765763;0.0019094934687018;-0.00013214856153354;0.00073479348793626;4.0342954889638e-05;-0.00010662969725672;-9.5298564701807e-05;0.00049217720516026;-4.9213111196877e-05;-8.2602789916564e-05;-1.783195216376e-06;-0.00042230138205923;0.00030722829978913;0.00063595309620723;-3.0110419174889e-05;7.1295660745818e-05;-0.0010604650015011;0.00059557030908763;-0.0018895601388067;0.00032880448270589;-0.0009896638803184;0.0001041638533934;0.00012927454372402;6.2504404922947e-06;-0.00016193499322981;-1.7950980691239e-05;0.00029901272500865;2.0649264115491e-05;-0.00010572588507785;-1.9872511984431e-05;0.0003123402420897;0.00029584651929326;0.0023346820380539;-1.5495237676078e-05;-0.0013412580592558;-0.00018691732839216;0.00027096495614387;3.2649029890308e-05;0.00024834787473083;-2.5132698283414e-05;0.00023951061302796;7.360901508946e-05;0.00063431810121983;0.00017329298134428;0.00067396758822724;0.0010065366514027;-9.4236958830152e-05;-0.0011509521864355;-0.00074764690361917;-0.00070404162397608;-0.00010230320913251;-0.0010542209492996;-6.1368705246423e-06;-0.00048025109572336;1.1617466952885e-05;7.966002158355e-05;-1.2959033483639e-05;-0.00036084183375351;0.00011344502127031;-0.00010267545440001;-0.00072030583396554;0.00027985026827082;-0.00034610024886206;0.00016787287313491;0.00052164751105011;-0.00067275698529556;0.0001916784531204;2.9107399313943e-05;0.00017627471243031;0.00022599319345318;0.0001700127904769;0.00046627465053461;-0.00025414902484044;0.0002722829231061;5.2035065891687e-05;-0.0026448119897395;-0.0013754193205386;0.0017767099197954;-0.00039073210791685;0.00038050810690038;0.0034650086890906;-2.3594155209139e-05;-0.00064690783619881;-9.7459043900017e-05;-0.00066818058257923;-0.00016492583381478;-0.00011408668069635;8.9140761701856e-05;-0.00015573705604766;7.6675445598084e-05;-0.00019811542006209;-0.00015711033483967;0.00025368985370733;-0.00042074095108546;0.0018747641006485;-0.00018366432050243;0.00046059361193329;-4.521659866441e-05;-1.7504818288216e-06;-9.3364411441144e-05;0.00050286448094994;-6.8530855060089e-05;-0.000260031723883;5.9004825743614e-05;-0.00054754706798121;0.00035384553484619;0.00097665062639862;0.00030371267348528;-0.00012508235522546;-0.00114406645298;0.00036740428186022;-0.0021478238049895;0.00030022166902199;-0.00096045952523127;9.7022420959547e-05;0.00052397680701688;2.003576446441e-05;-0.00013180151290726;-3.5085671697743e-05;0.00034992938162759;1.2191111636639e-05;-9.508849325357e-05;-4.7252808144549e-05;0.00031478601158597;0.00025617168284953;0.0027649712283164;-0.00010786724305945;-0.001164278248325;-0.00016870457329787;0.00019851898832712;4.2386578570586e-05;0.000240472247242;-6.9998095568735e-05;0.00035267457133159;7.1635775384493e-05;0.00071506440872326;0.00022882202756591;0.00081746315117925;0.0011529445182532;-9.5314258942381e-05;-0.0013449365505949;-0.0007367777870968;-0.001104484545067;-7.7435448474716e-05;-0.0011266838992015;5.8905668993248e-05;-0.00078141648555174;2.0244144252501e-05;5.8466230257181e-05;-3.6912629184371e-06;-0.00038178867544048;0.00013958850468043;-0.00017750079859979;-0.0007430839468725;0.0004243393195793;-0.00048942188732326;0.0012588984100148;0.00040013794205151;-0.00031871264218353;0.00020505797874648;-4.9985053919954e-05;0.00012829169281758;0.00044517143396661;0.00010656979429768;0.0006061572348699;-0.00024693403975107;0.00027762181707658;0.00016785389743745;-0.0021116142161191;-0.0011760991765186;0.0016500784549862;-0.00090748094953597;0.00047745258780196;0.0023987260647118;9.7448770247865e-05;-0.0012016171822324;-1.7100541299442e-05;-0.00097863399423659;-0.00013937264156993;-0.00018801874830388;9.1526053438429e-05;-0.00012934401456732;4.7667785111116e-05;-0.00015742721734568;-5.5918742873473e-05;0.0001793996343622;-0.0001554330374347;0.0011636374983937;-0.00016041418712121;-5.6711369325058e-06;-0.00013561439118348;0.00014259609451983;-6.7557892180048e-05;0.00038102755206637;-5.2530154789565e-05;-0.00043517301674001;0.00011335370072629;-0.00061341124819592;0.00028642799588852;0.0010103879030794;0.00053003412904218;-0.00028830516384915;-0.00083626713603735;3.6831068428e-05;-0.0017387570114806;0.00017834876780398;-0.00063277420122176;3.8296118873404e-05;0.00097493693465367;2.5254223146476e-05;-6.4699561335146e-05;-4.9799164116848e-05;0.00034155382309109;1.7433171706216e-06;-6.6299791797064e-05;-8.7649430497549e-05;0.0002628679794725;0.00015790632460266;0.0026436918415129;-0.00015453112428077;-0.00077673560008407;-0.00012078636791557;0.00010450120316818;4.9106802180177e-05;0.00018242743681185;-9.9142685940024e-05;0.00041350850369781;5.1227762014605e-05;0.00063721969490871;0.00025991327129304;0.00077848555520177;0.0010284171439707;-5.1568229537224e-05;-0.0013203131966293;-0.00058266159612685;-0.0012042337330058;-3.0667142709717e-05;-0.00097503536380827;0.00010550099250395;-0.00093183788703755;2.0768222384504e-05;1.97582430701e-05;9.1124138634768e-06;-0.00032469475991093;0.00013473267608788;-0.00021027251204941;-0.00061682512750849;0.00046088141971268;-0.00052036345005035;0.0019280294654891;0.00020710268290713;5.7343757362105e-05;0.00016707174654584;-9.6601528639439e-05;5.9280882851453e-05;0.00054682564223185;2.6753907150123e-05;0.00055129057727754;-0.00018390433979221;0.0001737348648021;0.00024789918097667;-0.0011887560831383;-0.00075286405626684;0.0011941979173571;-0.0011879368685186;0.00046862644376233;0.00094632979016751;0.00019121494551655;-0.0014143562875688;5.6642667914275e-05;-0.00096826715162024;-8.8374355982523e-05;-0.0002089720510412;7.2997980169021e-05;-5.3462787036551e-05;1.9580213120207e-05;-9.8226722911932e-05;6.046983799024e-06;9.2509726528078e-05;3.5513232433004e-05;0.00049838580889627;-0.00010582922550384;-0.00029856114997528;-0.00016976190090645;0.00021366188593674;-3.4014163247775e-05;0.00022570363944396;-2.9937229555799e-05;-0.00045509563642554;0.00012585004151333;-0.00054558186093345;0.00019577580678742;0.0008052580524236;0.00055017019622028;-0.00031158892670646;-0.00049096834845841;-0.00016868414240889;-0.0011188366916031;6.7927001509815e-05;-0.00029802715289406;-1.0344519978389e-05;0.0010677406098694;2.1043064407422e-05;-1.3104619029036e-05;-4.9252892495133e-05;0.00027264884556644;-8.6337022366934e-06;-2.9226708647911e-05;-8.6349085904658e-05;0.00017010436567944;5.3370535169961e-05;0.0021239074412733;-0.00016049650730565;-0.00032674128306098;-5.5960888857953e-05;2.1242126422294e-06;4.0425278712064e-05;9.793432400329e-05;-0.00010203204874415;0.00038762728217989;2.308830335096e-05;0.00049446732737124;0.00023655465338379;0.00065828405786306;0.00074759434210137;-4.2214851418976e-05;-0.0010743696475402;-0.00035868107806891;-0.0011194833787158;1.1907327461813e-05;-0.00068057543830946;0.00012171446724096;-0.00091829436132684;1.8935545085697e-05;-6.0121537899249e-06;1.7042468243744e-05;-0.00023601079010405;0.0001071059377864;-0.0001949981378857;-0.00043195401667617;0.00040707614971325;-0.00042590530938469;0.0020216971170157;5.4193274991121e-05;0.00022227590670809;0.00010639369429555;-9.8551630799193e-05;1.1052356967411e-05;0.00051244389032945;-2.6300471290597e-05;0.00040638475911692;-0.00010907322575804;9.5906376373023e-05;0.00026080498355441;-0.00040101353079081;-0.00032729367376305;0.0007002575439401;-0.0011762212961912;0.00034212321043015;-9.4988514319994e-05;0.00020564434817061;-0.0013014728901908;8.9002212916967e-05;-0.00077819870784879;-4.2451789340703e-05;-0.00017614413809497;4.8167519707931e-05;-5.9617991610139e-06;9.9747601780109e-05;-1.882928336272e-05;-6.7276167101227e-05;2.0898340153508e-05;-0.00033929673372768;-5.3917341574561e-05;0.00033389087184332;7.6351141615305e-05;-0.00025086101959459;0.00020581575518008;-0.00022152134624775;2.5407727662241e-05;0.00056624383432791;2.6999297915609e-05;0.00068922131322324;-0.00014646827185061;-0.00022554253519047;-0.0007643690914847;-0.00053391890833154;0.00049146369565278;0.00028393478714861;0.0010228861356154;0.00019395283015911;0.00021668222325388;-6.6968241299037e-05;-0.0013075941242278;3.7208272260614e-05;1.2884010175185e-05;-1.7943522834685e-05;-0.00034172253799625;5.2641305956058e-05;-1.340547169093e-05;-1.3943734302302e-05;0.00017486831347924;-0.0001155391219072;0.0025945464149117;-6.3600286921428e-06;-9.2500151367858e-05;-0.00018887576879933;-9.5151975983754e-05;-9.5387276815018e-06;5.1733633881668e-05;3.4242941183038e-05;0.00050077383639291;-0.00011452740727691;0.00060763745568693;4.7642906793044e-06;0.00030705635435879;0.00075546425068751;0.0007264272426255;-0.0013279466656968;-2.9285407435964e-05;-0.0013762239832431;-0.00030346104176715;-0.00072606845060363;5.0430022383807e-05;-0.0013174274936318;0.0001448042166885;-6.5149170040968e-06;2.0605724785128e-05;-0.0002616505662445;2.5066081434488e-05;-0.00023174384841695;9.9487682746258e-05;0.00054148794151843;-0.00041444966336712;0.0026788241229951;-0.00039860038668849;0.00028883686172776;2.2799898943049e-05;-0.00010664919682313;9.7512544016354e-05;0.00064339023083448;1.809809509723e-05;0.00054628361249343;-4.7361594624817e-05;0.00014122184074949;-0.00010233408829663;0.00032654733513482;-0.00017640602891333;-0.00021278210624587;-0.0015021745348349;0.00061762984842062;-0.0004672471259255;0.00029592277132906;-0.0017405920661986;0.00019804331532214;-0.0010083856759593;0.00010484196536709;-0.00019834023260046;-3.5786168155028e-05;-2.968434819195e-05;5.1609084039228e-05;0.00015871737559792;-4.0969865949592e-05;-0.00015388276369777;6.9797359174117e-05;-0.00092260510427877;6.3035513448995e-05;0.00015710963634774;0.00012092015094822;-0.00021061261941213;0.00019149732543156;-0.00036920307320543;4.5609722292284e-05;0.00058136967709288;4.3087002268294e-05;0.00074818712892011;-0.00014575201203115;-0.00031328533077613;-0.00094815576449037;-0.00055791618069634;0.0008130333153531;0.00027816859073937;0.0015181376365945;6.9127563619986e-05;0.00052596681052819;-0.00013783249596599;-0.0012697437778115;7.0789265009807e-06;4.5367840357358e-05;-2.1205847588135e-05;-0.00040104176150635;5.5995082220761e-05;-4.7561999963364e-05;-4.6162381295289e-06;0.00027219444746152;-0.00012034695828333;0.0031265737488866;4.6955658035586e-05;-0.00034434327972122;-0.00020178272097837;-4.9058347940445e-05;-4.7662826546002e-05;0.00014591521176044;3.5767825465882e-05;0.0005610587541014;-0.00012224678357597;0.00071190629387274;2.2667938537779e-05;0.00032550914329477;0.00088342389790341;0.00095157162286341;-0.0015573975397274;-3.4912765841e-05;-0.0015679367352277;-0.00045258397585712;-0.0010498897172511;3.5838882467942e-05;-0.0013910687994212;0.00014692102558911;-1.7324211967207e-06;2.4989765734063e-05;-0.00031983229564503;2.1679150449927e-05;-0.00025450176326558;0.00011923097190447;0.00061777787050232;-0.00053204997675493;0.0028122642543167;-0.00048089583287947;0.00026167716714554;0.00012344316928647;-0.00012135856377427;0.00014634408580605;0.00071388034848496;4.4036227336619e-05;0.00073156302096322;-2.2629059458268e-05;0.00021243975788821;-0.00016101240180433;0.00033131832606159;-0.00063277431763709;-0.00050598045345396;-0.0015908625209704;0.00092009012587368;0.0001000850534183;0.00039731900324114;-0.0019635162316263;0.0002041576517513;-0.0012598125031218;9.5836476248223e-05;-0.00024225981906056;-6.3175997638609e-05;-7.3816052463371e-05;7.318196730921e-05;0.00017704404308461;-5.5096814321587e-05;-0.00019969475397374;0.00010606408613967;-0.0012481324374676;0.00018526731582824;-8.3656574133784e-05;0.00012112517288188;-0.00011567374895094;0.00012226785474923;-0.00042824927368201;5.5849290220067e-05;0.00043218527571298;4.1788756789174e-05;0.00063303677598014;-0.00010227131861029;-0.00031047969241627;-0.00083055271534249;-0.00038200785638765;0.00089767022291198;0.00017289722745772;0.0015860424609855;-0.00011688877566485;0.00071475672302768;-0.00017747218953446;-0.00091738096671179;-2.0001878510811e-05;7.4658761150204e-05;-1.6773452443886e-05;-0.00036128974170424;4.4968230213271e-05;-7.2173206717707e-05;6.6586308093974e-06;0.00030482237343676;-9.7040763648693e-05;0.0028982756193727;9.7987758636009e-05;-0.00056170113384724;-0.00014659320004284;2.7047075491282e-05;-8.1056467024609e-05;0.00020872327149846;2.9374821679085e-05;0.00048260562471114;-9.5517243607901e-05;0.00063852622406557;3.4910255635623e-05;0.00026773320860229;0.00079257338074967;0.00093721755547449;-0.0014174822717905;-3.1115127058001e-05;-0.0013322851154953;-0.00051050633192062;-0.0011250929674134;9.3220833150554e-06;-0.0011057506781071;0.00010388495138614;5.1703627832467e-06;2.1671630747733e-05;-0.00030311351292767;1.2923037502333e-05;-0.00020009271975141;0.00010587821452646;0.00050676678074524;-0.00052591925486922;0.0020108025055379;-0.00042196869617328;9.3750313681085e-05;0.00023201902513392;-8.6238971562125e-05;0.00015710476145614;0.00056278938427567;7.0720081566833e-05;0.00068099767668173;2.299104926351e-05;0.000207551769563;-0.00018519874720369;0.00023930340830702;-0.0010667940368876;-0.00074132159352303;-0.0011918774107471;0.001040066126734;0.00090541021199897;0.00038367038359866;-0.0015696622431278;0.00013913586735725;-0.0011049452004954;4.3968120735371e-05;-0.00021070307411719;-8.3378392446321e-05;-9.249914000975e-05;7.767370698275e-05;-3.5790264519164e-05;3.2730124075897e-05;9.8417287517805e-05;-7.9748147982173e-05;0.00066845386754721;-0.00080705346772447;0.00062413315754384;-0.00072008941788226;-0.0001194695578306;0.00013118503557052;0.00015760114183649;-0.00013351271627471;9.093685366679e-05;-8.571965736337e-05;-0.0001292406959692;0.00012756406795233;-1.4465018466581e-05;-0.00012327737931628;-3.8907466660021e-05;1.266766162189e-06;8.1342928751837e-05;-0.0017848721472546;0.002045797649771;-0.00037070756661706;0.00034264556597918;-3.6339122743811e-05;8.6370331700891e-05;-7.9913043009583e-05;6.8522189394571e-05;4.546160926111e-05;-4.3322972487658e-05;1.565881575516e-05;2.4185435449908e-06;0.00014593255764339;0.00016513241280336;0.00030551722738892;0.00028774573002011;0.0004121127713006;0.00039216445293278;-2.0170016796328e-05;-1.273372254218e-05;1.5216635802062e-05;-5.2168697948218e-06;9.8239528597333e-05;6.3720013713464e-05;1.2671377589868e-05;1.3841347026755e-05;-0.00023654087272007;0.0012282460229471;-0.00056583393597975;-0.00017392878362443;-0.00024181744083762;-0.00057766452664509;-0.0005652992404066;-0.00019171573512722;-0.00015744277334306;-0.00021680304780602;-0.00017029445734806;-1.3167468750908e-05;1.8038974303636e-05;-9.3196840680321e-06;-1.870784581115e-05;1.3673930880032e-05;-2.009944182646e-06;0.00014105394075159;0.00015146726218518;-0.00071555783506483;-0.00061726866988465;-0.00046925389324315;-0.0005143983871676;4.176062066108e-05;3.6591722164303e-05;-0.00019584318215493;-0.00016259521362372;-0.00010055089660455;-0.00010136759374291;6.0758204199374e-05;9.2604394012596e-05;7.4823292379733e-05;0.00088798807701096;-4.6782290155534e-05;-0.00044798679300584;-0.00048580602742732;0.00061209418345243;0.00058001861907542;0.00033262846409343;0.00028324913000688;0.00027494854293764;0.00025490424013697;9.3698166892864e-05;9.3095397460274e-05;-7.7078984759282e-05;-8.8858432718553e-05;-7.0189140387811e-05;6.3829182181507e-05;0.00022320046264213;-0.0002090801281156;0.0012330580502748;-0.0014019822701812;0.0011147104669362;-0.0012373360805213;-0.00019590240844991;0.00021858949912712;0.00025258757523261;-0.00019958381017204;0.00018457722035237;-0.0001491255388828;-0.00021449975611176;0.00021774621563964;-1.4976302736613e-05;-0.0002893915225286;-0.00012631039135158;-0.00017098554235417;0.00033001092378981;-0.0029004800599068;0.0034207503776997;-0.00064158503664657;0.00056499778293073;-0.00015547646034975;0.0001815513096517;-0.0001366639189655;0.00010843253403436;8.0069694377016e-05;-8.0542791693006e-05;2.6114448701264e-05;2.4884484446375e-06;0.00022329777129926;0.00023522273113485;0.00053777114953846;0.0005770951975137;0.00070748035795987;0.00068270834162831;-5.1166640332667e-05;-3.7661200622097e-05;4.4806030928157e-05;2.8599082725123e-05;0.00015581400657538;0.00010621095862007;-9.4370197984972e-06;-1.3199629620431e-06;-0.00038298167055473;0.0021428924519569;-0.00067523086909205;-0.00028847079374827;-0.00035783057683147;-0.0011610114015639;-0.0012348123127595;-0.00033206306397915;-0.00030751936719753;-0.00032915524207056;-0.00026940202224068;-3.6023800930707e-05;1.0031462807092e-05;5.3006565394753e-06;-1.1747185453714e-05;6.3094894358073e-06;-8.5123310782365e-06;0.00030688307015225;0.00031136578763835;-0.00092300452524796;-0.00093740626471117;-0.0005553204100579;-0.0007584088598378;5.7726054365048e-05;7.5549847679213e-05;-0.00030228265677579;-0.00027914930251427;-0.00014857214409858;-0.00017032280447893;5.832061287947e-05;0.00012206801329739;0.00017945437866729;0.0021644202060997;-7.4431482062209e-05;-0.0010457719909027;-0.001072722254321;0.00047028943663463;0.00070319115184247;0.00047849814291112;0.00046596472384408;0.0003971821279265;0.00041772745316848;0.00014201695739757;0.00015731531311758;-0.00010245505836792;-0.00013592273171525;-6.6711727413349e-05;6.3811443396844e-05;0.00020552123896778;-0.00022096680186223;0.0012353439815342;-0.0013661370612681;0.0011284684296697;-0.0011984087759629;-0.00019095194875263;0.00021532690152526;0.00025848048971966;-0.00018626009114087;0.00020654159015976;-0.00012514444824774;-0.00021071734954603;0.00021943694446236;-2.3117676391848e-05;-0.00044895484461449;-0.00021310326701496;-0.00011409712169552;0.00037645833799616;-0.0027943337336183;0.0034695493523031;-0.00065665179863572;0.00053505349205807;-0.00018908341007773;0.00014127173926681;-0.00014372065197676;9.8134471045341e-05;7.6356205681805e-05;-8.1393940490671e-05;2.7124378902954e-05;9.1028880433441e-07;0.00023691414389759;0.00021930679213256;0.00050139217637479;0.00060902576660737;0.0007029656553641;0.00066711782710627;-5.1103583246004e-05;-3.7380519643193e-05;3.1060317269294e-05;4.1628711187514e-05;0.00015125839854591;0.00010446867963765;-1.3234579455457e-05;5.5101354519138e-06;-0.00038089696317911;0.0021322867833078;-0.00066036381758749;-0.00031857521389611;-0.00032329803798348;-0.0011169441277161;-0.0012745511485264;-0.00030763680115342;-0.00032688782084733;-0.00032134875073098;-0.00026728032389656;-3.2473646569997e-05;8.4991088442621e-06;6.1543269112008e-06;-1.364812032989e-05;1.7281899999944e-07;-2.0681197838712e-06;0.00030609333771281;0.00030304977553897;-0.00079550431109965;-0.0010549218859524;-0.00046131649287418;-0.00085507740732282;4.6411008952418e-05;8.9087479864247e-05;-0.00027614133432508;-0.0002965340972878;-0.00012942880857736;-0.0001819686149247;4.5406090066535e-05;0.00013583635154646;0.00017615006072447;0.0021210513077676;-8.3466329670046e-05;-0.0010376834543422;-0.0010461484780535;0.00027356061036699;0.00093248439952731;0.00042080762796104;0.00050847145030275;0.00035755120916292;0.00044788664672524;0.00012834832887165;0.00016660493565723;-9.198572661262e-05;-0.00014672841643915;-3.1356361432699e-05;3.3000156690832e-05;7.2363269282505e-05;-0.00010084448149428;0.00068882125196978;-0.00075457745697349;0.00066426169360057;-0.00065751926740631;-0.00011373597226338;0.00012609641999006;0.00016885515651666;-0.00011267143418081;0.00012873740342911;-4.8273930588039e-05;-0.00012555571447592;0.000130353946588;-2.2123245798866e-05;-0.00036779974470846;-0.0001872205757536;7.87462486187e-05;0.00015197883476503;-0.0016359202563763;0.0021355936769396;-0.0003992942511104;0.0002979876298923;-9.8157048341818e-05;2.2113619706943e-05;-9.2990238044877e-05;5.2109044190729e-05;4.1502520616632e-05;-4.4480941141956e-05;1.7565680536791e-05;-1.0582440381768e-06;0.00016774928371888;0.00014431953604799;0.00025699535035528;0.00035227995249443;0.00041949877049774;0.00036218299646862;-2.2153148165671e-05;-1.2632657671929e-05;-4.4700072976411e-06;1.6547446648474e-05;9.3305956397671e-05;6.0522248531925e-05;2.8710405786114e-06;2.7430689442554e-05;-0.00023293736740015;0.0012389004696161;-0.00053118198411539;-0.00022530592104886;-0.00020135809609201;-0.00053927558474243;-0.00064199382904917;-0.00015743782569189;-0.00019359162251931;-0.00020744191715494;-0.00016768295608927;-9.6244548331015e-06;1.6416850485257e-05;-5.7388774621359e-06;-2.270187906106e-05;3.5224566090619e-06;7.4205090641044e-06;0.00014049814490136;0.00014651086530648;-0.00050798471784219;-0.00080471381079406;-0.00031128103728406;-0.00066901475656778;2.6165265808231e-05;5.6729175412329e-05;-0.00015390681801364;-0.00019339712162036;-7.159385131672e-05;-0.0001193426141981;3.6307184927864e-05;0.00011609706416493;7.4064999353141e-05;0.00085322873201221;-6.4592088165227e-05;-0.00044469052227214;-0.00046887516509742;0.00027239412884228;0.00095176679315045;0.00024158119049389;0.00035299477167428;0.00021454927627929;0.000300592626445;7.1800692239776e-05;0.00010925439710263;-5.8785681176232e-05;-0.00010730007488746;6.3474399212282e-05;-0.00015954309492372;-0.00017530699551571;0.00022930590785109;-0.00038713635876775;0.0017966800369322;-0.00016244970902335;0.00045750057324767;-1.1806974725914e-05;-4.8679648898542e-05;-6.486639904324e-05;0.00040960559272207;-7.0854126533959e-05;-8.53540332173e-05;2.8410733648343e-05;-0.00032035107142292;0.00031583974487148;0.00073890580097213;0.00022845971398056;-1.5869125491008e-05;-0.0010596995707601;0.00033302159863524;-0.0017752000130713;0.00026054363115691;-0.00086484232451767;0.00010713839583332;0.00012541898468044;1.3255114936328e-05;-0.00011864104453707;-1.6666861483827e-05;0.00022970708960202;4.4523380893224e-06;-6.4067920902744e-05;2.4626127924421e-05;0.00021398493845481;0.00018089260265697;0.002153055742383;-0.00011735117732314;-0.00070440710987896;-0.00010470631241333;9.0776782599278e-05;1.0435281183163e-05;0.00017866415146273;-5.9656140365405e-05;0.00027084417524748;5.2688636060338e-05;0.00056063145166263;0.00014915216888767;0.00076859153341502;0.00088972417870536;-0.00018510739027988;-0.00096380885224789;-0.00051394902402535;-0.0011130576021969;-4.8755518946564e-05;-0.00084541336400434;5.8880370488623e-05;-0.00066548166796565;2.6400373826618e-05;4.3118528992636e-05;-5.3679600569012e-06;-0.00028578951605596;0.00010549739090493;-0.0001363086339552;-0.00056580471573398;0.00034260074608028;-0.0003242356760893;0.0010136759374291;0.0003295776550658;-0.00037735825753771;0.00014530115004163;-1.916849942063e-05;0.00010710024798755;0.00033877845271491;8.9574074081611e-05;0.00050194602226838;-0.0001883799850475;0.000302476080833;0.00012369571777526;-0.0016413175035268;-0.00086506578372791;0.0012718631187454;-0.00071940530324355;0.00028554906020872;0.0019495408050716;4.6854645916028e-05;-0.00096500647487119;-2.6673338652472e-05;-0.00080228626029566;-0.00010947390546789;-0.00012972965487279;7.0823029091116e-05;-0.00015464024909306;6.8562650994863e-05;-0.00020706205395982;-0.00020726016373374;0.00030887915636413;-0.00039488327456638;0.002414072630927;-0.00025961099890992;0.00040969424298964;-7.4987074185628e-05;-1.0907835985563e-06;-7.201742118923e-05;0.00051791884470731;-0.00012146111112088;-0.00017839635256678;7.6999836892355e-05;-0.00043511489639059;0.00047034336603247;0.0012484097387642;0.00057586742332205;-0.00016213080380112;-0.0015176928136498;0.00022784342581872;-0.0025166682898998;0.00031806551851332;-0.0011034602066502;0.00014938926324248;0.00029502401594073;2.8089716579416e-05;-0.00013084361853544;-2.6771218472277e-05;0.00030029119807296;-7.3897031143133e-06;-5.8467652706895e-05;3.7177491321927e-05;0.00023966138542164;0.00015943216567393;0.0030166369397193;-0.00024796690559015;-0.00054953171638772;-8.5350628069136e-05;-8.9233271864941e-06;8.9564437075751e-06;0.00019051332492381;-0.00011766441457439;0.00043103177449666;5.4625124903396e-05;0.00078276405110955;0.00022451099357568;0.0011448768200353;0.001191574614495;-0.00029001070652157;-0.0013174324994907;-0.00056238519027829;-0.0018671430880204;-2.3872786186985e-05;-0.0010522872908041;0.00014349205594044;-0.0011534269433469;4.5271764975041e-05;3.8514204788953e-05;2.2982901555224e-06;-0.00036948459455743;0.00015340480604209;-0.00024059790302999;-0.00072009436553344;0.00057878071675077;-0.00050911260768771;0.0023686171043664;0.00028325780294836;-0.00021359612583183;0.00018346378055867;-9.4310067652259e-05;9.2680791567545e-05;0.00062186917057261;4.5344957470661e-05;0.00078267848584801;-0.00022205749701243;0.00046095042489469;0.00026560272090137;-0.0014982785796747;-0.00080682465340942;0.0014490737812594;-0.0014207131462172;0.00038871628930792;0.0013871222035959;0.00016026340017561;-0.0017543421126902;4.8231522669084e-05;-0.0013427207013592;-0.00010966745321639;-0.00021672033471987;9.0479414211586e-05;-0.00021150185784791;3.8839447370265e-05;-0.00015956556308083;-0.00012332103506196;0.00022592238383368;-0.00018086454656441;0.0017704769270495;-0.00022297271061689;9.4983537564985e-05;-0.00013660678814631;0.00010004289651988;-4.754234032589e-05;0.00038608626346104;-0.00010670284973457;-0.00029796664603055;0.00011172273661941;-0.00046888861106709;0.00041708807111718;0.0012602986535057;0.00069399271160364;-0.0002995714021381;-0.0012421756982803;-2.8538042897708e-05;-0.0021200787741691;0.00021878870029468;-0.00076982646714896;9.7758718766272e-05;0.00058228056877851;3.0195626095519e-05;-7.5650590588339e-05;-3.4362845326541e-05;0.00028615785413422;-1.8043678210233e-05;-2.6211535441689e-05;-6.8696726884809e-06;0.00017724529607221;6.4697764173616e-05;0.0027369712479413;-0.00026251078816131;-0.00023218886053655;-3.1689913157606e-05;-9.5899820735212e-05;1.9540217181202e-05;0.00010622143599903;-0.00013053065049462;0.00044075277401134;2.6300014724256e-05;0.00072822091169655;0.00024618205497973;0.0010197015944868;0.0010013313731179;-0.00021899199055042;-0.0012404789449647;-0.00040229147998616;-0.0017754770815372;1.3541444786824e-05;-0.00082586763892323;0.00017351748829242;-0.0012399103725329;3.8796166336397e-05;2.4638497052365e-05;1.4824448953732e-05;-0.00032552031916566;0.00014588613703381;-0.0002647667133715;-0.00060895725619048;0.00061155325965956;-0.00053635070798919;0.0029648102354258;9.0524743427522e-05;0.00012210670683999;0.00015644275117666;-0.00015507930947933;3.5595214285422e-05;0.0006938055739738;-3.46098713635e-05;0.0007473953301087;-0.0001680311979726;0.00040841242298484;0.00033741071820259;-0.00066534156212583;-0.00039335395558737;0.0010451956186444;-0.0016757362755015;0.00036973264650442;7.3377203079872e-05;0.0002419920056127;-0.0019206495489925;0.00012964285269845;-0.001376194995828;-6.2757309933659e-05;-0.00023030885495245;7.6063472079113e-05;-0.00015780951071065;1.2416261597537e-05;-0.00010375231795479;-4.9386075261282e-05;0.00012311234604567;-2.5699457637529e-06;0.0010247329482809;-0.0001578625960974;-0.00017910944006871;-0.00017703179037198;0.00018656365864445;-2.3009395590634e-05;0.00024179711181205;-7.4365532782394e-05;-0.00038828610558994;0.00013058932381682;-0.00049309869064018;0.00032806894159876;0.0010868546087295;0.00068253820063546;-0.000355048046913;-0.00086335570085794;-0.00020073798077647;-0.0015469483332708;0.00011720419570338;-0.00040769457700662;3.5039178328589e-05;0.00083037954755127;2.5557586923242e-05;-2.6632544177119e-05;-4.03470985475e-05;0.00026438222266734;-2.6234705728712e-05;2.2888589228387e-06;-4.1464769310551e-05;0.00011375244503142;-2.0560289613059e-06;0.0023505941499025;-0.00024175662838388;-1.0973393727909e-05;7.2015723162622e-06;-0.00014444749103859;2.9354318030528e-05;2.7302163289278e-05;-0.00012801730190404;0.0004171927284915;2.1729019863415e-06;0.00064468773780391;0.00025283981813118;0.00086117803584784;0.00078643561573699;-0.00015179636829998;-0.0011155088432133;-0.00027290626894683;-0.0015567986993119;3.6676876334241e-05;-0.00058513291878626;0.00017782776558306;-0.0012262604432181;2.9293620173121e-05;1.6316525943694e-05;2.3731301553198e-05;-0.00027549275546335;0.00012750635505654;-0.00025647174334154;-0.00048931036144495;0.00057148875202984;-0.00049689953448251;0.003055804874748;-3.1760580895934e-05;0.00029904066468589;0.00012092659017071;-0.00017011517775245;1.2305144458935e-08;0.00067418703110889;-7.8082899563015e-05;0.00061827694298699;-0.00011694295244524;0.00031441194005311;0.00036166320205666;-8.5378640505951e-05;-9.9010547273792e-05;0.00069942994741723;-0.0016966061666608;0.00031201826641336;-0.00073192815762013;0.00026770585100166;-0.001831051777117;0.00016346624761354;-0.0012242767261341;-3.0201010304154e-05;-0.00021229994308669;5.9170470194658e-05;-9.4773284217808e-05;-7.7870012319181e-05;6.5428845118731e-05;0.00042547631892376;-0.00039538857527077;0.0010755358962342;-0.0012166544329375;0.00098770274780691;-0.0010927878320217;-0.00015687696577515;0.00018349390302319;0.00012417291873135;-8.5310348367784e-05;0.00016708807379473;-0.00014825304970145;-0.00019269910990261;0.00019274360965937;1.0152134564123e-05;-0.0001987559517147;-0.00012486020568758;-0.0007337152492255;0.00078343931818381;-0.0022894425783306;0.0027325786650181;-0.00047577871009707;0.00042948470218107;-0.00017637440760154;0.00020756217418239;-8.8814864284359e-05;7.0057241828181e-05;6.210156425368e-05;-6.3435712945648e-05;3.8329730159603e-05;1.4565485798812e-05;3.2906526030274e-05;6.4858599216677e-05;0.00041093752952293;0.00052754813805223;0.00058705714764073;0.00060990039492026;-8.9999462943524e-05;-8.4506595158018e-05;0.00010901810310315;8.7532309407834e-05;7.7144708484411e-05;5.5091295507737e-05;-5.2725459681824e-05;-3.9086266042432e-05;-0.00043202113010921;0.0016221862751991;-2.7993259209325e-05;0.00019341205188539;7.4739400588442e-05;-0.0013552129967138;-0.001503758947365;-0.00030560285085812;-0.00030104190227576;-0.00015887260087766;-0.00015500349400099;-6.3277766457759e-05;-2.1162601115066e-05;5.2742703701369e-05;3.2294912671205e-05;-9.5394116215175e-06;-2.0641291484935e-05;0.00042103670421056;0.00039866167935543;-0.00033347427961417;-0.00041286798659712;-9.8931945103686e-05;-0.00026920100208372;1.8543087207945e-05;5.3487976401811e-05;-0.00022339903807733;-0.00021292017481755;-5.3142433898756e-05;-9.4486807938665e-05;-1.4563930562872e-05;2.0721077817143e-05;0.00021223450312391;0.0036721997894347;3.3380067179678e-05;-0.0015656736213714;-0.0015274445759133;-0.00061718974029645;-0.00043200305663049;0.0002346866967855;0.00027122016763315;0.00021606193331536;0.00027093593962491;8.968490146799e-05;0.00010737818229245;-5.5916156270541e-05;-7.8837278124411e-05;-7.5362477218732e-05;6.5223364799749e-05;0.00041431543650106;-0.00039904526784085;0.0010829492239282;-0.0011870271991938;0.0009851697832346;-0.0010760602308437;-0.00015373808855657;0.00018129825184587;0.00012874708045274;-7.7282289566938e-05;0.00018082020687871;-0.00013303742161952;-0.00018664709932636;0.00019655191863421;-5.3337521421781e-07;-0.00030617116135545;-0.00016279687406495;-0.00068951543653384;0.00081264332402498;-0.00222545908764;0.0027578072622418;-0.00049027369823307;0.00040688022272661;-0.00019653420895338;0.00018234015442431;-9.2354530352168e-05;6.458027928602e-05;5.7953773648478e-05;-6.5441825427115e-05;3.7886020436417e-05;1.44065134009e-05;4.7120272938628e-05;4.9926013161894e-05;0.00038906728150323;0.00053953105816618;0.00057152373483405;0.00061189488042146;-8.7484608229715e-05;-8.52146622492e-05;9.8771655757446e-05;9.5435600087512e-05;7.3898263508454e-05;5.4784384701634e-05;-5.1134858949808e-05;-3.8641966966679e-05;-0.0004287049814593;0.0016099450876936;-2.710646003834e-05;0.00015860621351749;0.00010914807353402;-0.0013028153916821;-0.001533966162242;-0.00029027016717009;-0.00030938713462092;-0.00015398058167193;-0.00015432157670148;-5.9005036746385e-05;-2.3442047677236e-05;5.0648668548092e-05;3.2881951483432e-05;-1.3412865882856e-05;-1.5999818060664e-05;0.00042478065006435;0.00038364759529941;-0.00026861901278608;-0.0004817295121029;-5.2302890253486e-05;-0.00032585966982879;1.1198284482816e-05;6.2387953221332e-05;-0.00021239905618131;-0.00021877409017179;-4.4209340558155e-05;-0.00010089265560964;-1.9788738427451e-05;2.7948490242125e-05;0.00020854314789176;0.0036215614527464;2.8489559554146e-05;-0.001564483391121;-0.0014861840754747;-0.00070657645119354;-0.00030159027664922;0.00020789554400835;0.00029270039522089;0.00019442169286776;0.00028986134566367;8.3721810369752e-05;0.00011095632362412;-5.0800907047233e-05;-8.4491468442138e-05;3.5530396417016e-05;-0.00014319819456432;-0.00016873648564797;0.00023086670262273;-0.00024871129426174;0.0019971909932792;-0.00023107108427212;0.00025317497784272;-8.0750098277349e-05;9.2304353529471e-06;-3.5197244869778e-05;0.00035034568281844;-0.00012076753773727;-0.00012944426271133;7.2445116529707e-05;-0.00027989453519695;0.000432586442912;0.0011500780237839;0.00060228299116716;-0.00019458703172859;-0.0013326336629689;4.8352809244534e-05;-0.0020778873004019;0.00023705670901109;-0.00079787621507421;0.00013472736463882;0.00015711641754024;2.5185965569108e-05;-8.2218204624951e-05;-1.600498217158e-05;0.00020280707394704;-2.2512589566759e-05;-4.3193163037358e-06;6.1593513237312e-05;9.9973425676581e-05;5.3173178457655e-05;0.0022499258629978;-0.00025552333681844;-7.5848780397791e-05;-6.1450796238205e-06;-0.00012912694364786;-1.0501541964913e-06;5.5976419389481e-05;-0.00010805828787852;0.00033560965675861;2.2955477106734e-05;0.00063029769808054;0.00016046533710323;0.00092865474289283;0.0008588217315264;-0.0002754170272965;-0.0009121770854108;-0.00029371635173447;-0.001669863355346;4.8900787987805e-06;-0.00060882838442922;0.00015413563232869;-0.0010675998637453;4.1474795580143e-05;3.387642573216e-05;6.8841882239212e-06;-0.0002685216604732;0.00012637447798625;-0.00023207082995214;-0.00052148720715195;0.00055114331189543;-0.00043582750367932;0.0027300342917442;7.9087680205703e-05;3.5729717637878e-05;0.0001351101527689;-0.00013887825480197;3.4267017326783e-05;0.00061766628641635;-2.8543792723212e-05;0.00070955068804324;-0.00014760601334274;0.00045071906060912;0.00028718975954689;-0.0005767498514615;-0.00029136706143618;0.00090930564329028;-0.0014961989363655;0.00027198172756471;6.2219412939157e-05;0.00019181125389878;-0.0017625687178224;0.00011256098514423;-0.001301376032643;-5.3969492000761e-05;-0.00019594693731051;6.7332715843804e-05;-0.00018949354125652;2.1121633835719e-05;-0.00014146983448882;-0.00017072462651413;0.00023610584321432;-0.00018586302758195;0.0021674130111933;-0.00026924649137072;0.00016838269948494;-0.00012800701369997;5.1295457524247e-05;-2.2627857106272e-05;0.0003367206081748;-0.00015096749120858;-0.00018991577962879;0.00010325562470825;-0.00032069598091766;0.00052837980911136;0.0014719686005265;0.00082005292642862;-0.00032620370620862;-0.0015506453346461;-0.00010281354479957;-0.0023743030615151;0.00024087114434224;-0.00078233506064862;0.00014821304648649;0.00025520715280436;3.2247786293738e-05;-6.8818488216493e-05;-1.8393204300082e-05;0.00022179509687703;-3.9631719118915e-05;2.7818452508654e-05;6.1867707700003e-05;5.3153657063376e-05;-8.2338310676278e-06;0.0025082717183977;-0.00032981106778607;0.00018405637820251;4.3782074499177e-05;-0.00024387866142206;2.9656016522495e-06;-1.679768502072e-05;-0.00013950213906355;0.00039854182978161;3.5684670365299e-06;0.00074711150955409;0.00020316777226981;0.0010595340281725;0.00089848227798939;-0.00031160685466602;-0.001019868068397;-0.00022200695821084;-0.0020061349496245;3.1790517823538e-05;-0.00052206387044862;0.0002129657077603;-0.0013850043760613;4.7053457819857e-05;4.1319108277094e-05;1.694867205515e-05;-0.00029785867081955;0.00015159256872721;-0.00030916329706088;-0.00056941533694044;0.00072474603075534;-0.00055964244529605;0.0039297565817833;-5.6309832871193e-05;0.00027906597824767;0.00014991879288573;-0.00022744821035303;2.1083335468575e-06;0.00082675903104246;-0.00010097747144755;0.00088229484390467;-0.0001446360402042;0.00056709226919338;0.00041699886787683;-7.438640750479e-05;-1.7580907297088e-05;0.00083231570897624;-0.0020952136255801;0.00030643277568743;-0.00094147119671106;0.00029877442284487;-0.0023564635775983;0.00020999622938689;-0.0016996178310364;-3.1012259569252e-05;-0.0002513455983717;7.478103361791e-05;-0.00021794949134346;-6.9062375587237e-06;-7.742598245386e-05;-9.875901741907e-05;0.0001088861390599;-2.8270900656935e-05;0.0013548528077081;-0.00018800536054187;-6.3519742980134e-05;-0.00016104307724163;0.00013459908950608;1.038038135448e-06;0.00017905847926158;-0.00011022037506336;-0.00028878735611215;0.00011693902342813;-0.00037355543463491;0.00043691077735275;0.0012522205943242;0.00073914224049076;-0.00036867000744678;-0.001130607095547;-0.00022773951059207;-0.0017603262094781;0.00014427959104069;-0.00037619832437485;7.7023207268212e-05;0.00052523467456922;2.4347049475182e-05;-2.3393373339786e-05;-2.4830391339492e-05;0.00021372678747866;-4.927513509756e-05;5.7859208027367e-05;1.7945181753021e-05;-1.4451708921115e-05;-4.5274911826709e-05;0.0020971272606403;-0.00028176762862131;0.000283897126792;7.0341753598768e-05;-0.00026351909036748;2.2941172574065e-05;-0.00011194949183846;-0.00012694604811259;0.00034598025376908;-1.9580042135203e-05;0.00068826321512461;0.00021972897229716;0.00087003450607881;0.00069149018963799;-0.00022705645824317;-0.00091464549768716;-0.00014359773194883;-0.0016666400479153;3.8093883631518e-05;-0.00024707755073905;0.00020130258053541;-0.001337883179076;3.1655097700423e-05;5.1584585889941e-05;2.5427680157009e-05;-0.00026400812203065;0.00013290607603267;-0.0002929356705863;-0.00047922332305461;0.00067042501177639;-0.00052206427790225;0.0038906692061573;-0.00014593126252294;0.00039919643313624;0.00012271334708203;-0.00023597624385729;-1.8684713722905e-05;0.00077994295861572;-0.00013033233699389;0.00072990462649614;-0.00010529462451814;0.00047099776566029;0.00043688967707567;0.00034377965494059;0.00019656348740682;0.00057251326506957;-0.0020782318897545;0.00025816864217632;-0.0014949705218896;0.00031093994039111;-0.00219716434367;0.00023238973517437;-0.0015213247388601;-9.3000999186188e-06;-0.00022529147099704;6.115253927419e-05;-0.00015242666995618;5.5959895689739e-05;-4.8271922423737e-06;-0.00015517609426752;0.00015202902432065;-0.0016654941719025;0.00016998463252094;-0.00025317026302218;0.00019234832143411;0.00010410769027658;-6.2935250753071e-06;-9.868734923657e-05;-6.7192399910709e-06;-8.5573126852978e-05;9.8264717962593e-05;-0.00011096429807367;-1.3401132491708e-05;-0.00034009088994935;-0.00069085595896468;-0.00040624773828313;0.0011167395859957;3.1402203603648e-05;0.0013025040971115;-2.0307783415774e-05;0.00044985153363086;-0.00013612199109048;0.00046375783858821;-0.0001327268400928;1.7293290511589e-05;-1.2702017556876e-05;-6.0802344705735e-06;-8.8029182734317e-06;7.8822209616192e-05;-2.4036702598096e-05;-0.0001429698895663;0.00013628153828904;0.00030438878457062;-3.7972127756802e-05;0.00023121891717892;-0.00018905400065705;-0.00013894950097892;5.7423945690971e-05;-0.0001766102068359;-2.868652518373e-05;5.5021823754942e-06;-1.6519794371561e-05;0.00019717880059034;1.3693927940039e-05;-0.00013213032798376;7.6397984230425e-05;0.00021505731274374;0.0002370206057094;-0.00011264227941865;-0.00061005866155028;0.00014989147894084;0.00023772206623107;-2.1850763005204e-05;-0.0003866242186632;6.7356319050305e-05;4.5622760808328e-05;2.8177692001918e-05;-4.4893218728248e-05;-1.8758282749332e-05;-0.00012970100215171;4.8890382458922e-05;0.00034359368146397;-0.00010323943570256;0.0022899797186255;-0.00018173982971348;0.00025361205916852;-0.00013627811858896;-0.00013063559890725;6.0848953580717e-05;0.00047633465146646;-2.8455760912038e-05;0.00058147573145106;-5.713545033359e-05;0.00032008183188736;-2.7988349756924e-05;0.00011040908430004;0.0002059219405055;0.00020808615954593;-0.00085742975352332;0.00013962687808089;-0.0010273125953972;0.00014604990428779;-0.0014694768469781;9.7930533229373e-05;-0.00098386022727937;0.0001040595016093;-0.00013558064529207;1.4788348380534e-05;-0.00015008593618404;1.7230238881893e-05;-9.0866007667501e-05;7.0735026383772e-05;0.00065714184893295;-0.00060184189351276;0.00099681573919952;-0.0011033730115741;0.00082498387200758;-0.0009111751569435;-0.00012326941941865;0.0001502116501797;6.0752904573746e-06;2.0566092644003e-05;0.00015019666170701;-0.00015000761777628;-0.00015108259685803;0.0001459701161366;3.7970494304318e-05;-7.5710500823334e-05;-0.00010705719614634;-0.0013851859839633;0.0012995102442801;-0.0017383785452694;0.0020660487934947;-0.00034729499020614;0.00032607445609756;-0.00019572710152715;0.00023743536439724;-3.6613007978303e-05;2.7872662030859e-05;3.2276100682793e-05;-3.2301315513905e-05;5.6574281188659e-05;3.1571591534885e-05;-0.00022196501959115;-0.00015251251170412;7.9830599133857e-05;0.00028563541127369;0.00042532288352959;0.000487006502226;-0.00010191022010986;-0.0001085579424398;0.00015737906505819;0.00012701950618066;-1.6949426935753e-05;-9.4964125310071e-06;-9.6305200713687e-05;-7.1483031206299e-05;-0.00046595951425843;0.00071361276786774;0.00035127866431139;0.00084298313595355;0.00063656840939075;-0.001201611245051;-0.0013947150437161;-0.00019472037092783;-0.00021818172535859;4.3970794649795e-05;-1.4247149010771e-05;-8.5702129581477e-05;-4.4137348595541e-05;9.2981485067867e-05;6.6719199821819e-05;-1.1495718354126e-05;-2.4291632144013e-05;0.00045598702854477;0.00042092325747944;8.0007790529635e-05;-1.1671627362375e-06;0.00024151046818588;0.00013391448010225;-2.1539961380768e-05;1.8628381440067e-05;-0.0001499611971667;-0.00014330136764329;8.5225528891897e-06;-4.1716371924849e-05;-7.9925754107535e-05;-6.7588814999908e-05;0.00019689509645104;0.0048593925312161;0.00021922454470769;-0.0018601685296744;-0.0017898384248838;-0.001514982082881;-0.0014420152874663;5.2616625907831e-05;0.00011235525744269;0.00010920928616542;0.00017090440087486;4.0517265006201e-05;5.6736022088444e-05;-8.5112751548877e-06;-2.0841423975071e-05;-8.8366585259791e-05;7.0840666012373e-05;0.00064788036979735;-0.00060010224115103;0.001014253590256;-0.00107706268318;0.00081708090147004;-0.00090592127526179;-0.00012154986325186;0.00014908815501258;1.1083313438576e-05;2.5657700462034e-05;0.00016405586211476;-0.00013664137804881;-0.00014181829465088;0.00015178028843366;1.9749490093091e-05;-0.00018281230586581;-0.00012804238940589;-0.0013346205232665;0.0013279401464388;-0.0016881652409211;0.0020921777468175;-0.0003673876344692;0.0003046509809792;-0.00021694527822547;0.00021692174777854;-3.9299909985857e-05;2.455791036482e-05;2.6969859391102e-05;-3.5953133192379e-05;5.4697018640582e-05;3.190026836819e-05;-0.00020187927293591;-0.00016921124188229;7.4421033787075e-05;0.00028881753678434;0.00040433154208586;0.00049951387336478;-9.8430675279815e-05;-0.00010984872642439;0.0001481953804614;0.0001334821281489;-1.7939721146831e-05;-9.8005584732164e-06;-9.0539935627021e-05;-7.5344170909375e-05;-0.00045812575262971;0.00071205553831533;0.00034734632936306;0.0007847603992559;0.00067355175269768;-0.0011447785655037;-0.0014302150812;-0.00018571644613985;-0.00022154588077683;4.3035972339567e-05;-1.282171888306e-05;-8.0712125054561e-05;-4.7166522563202e-05;8.8659384346101e-05;6.9308334786911e-05;-1.6142403183039e-05;-1.9330522263772e-05;0.00046857103006914;0.00039647339144722;0.00012833627988584;-5.9066849644296e-05;0.00027139147277921;9.0940928203054e-05;-2.7761145247496e-05;2.6293733753846e-05;-0.00014635360275861;-0.00014378828927875;1.2814116416848e-05;-4.7407607780769e-05;-8.1414029409643e-05;-6.3768697145861e-05;0.00019532385340426;0.0048020393587649;0.00021518625726458;-0.0018775010248646;-0.0017295884899795;-0.0015646053943783;-0.0013444998767227;3.8050195144024e-05;0.00012846969184466;9.2211412265897e-05;0.00018835454829969;3.8630929338979e-05;5.7651486713439e-05;-5.5871232689242e-06;-2.3923390472191e-05;-2.6851821530727e-05;-2.111089452228e-05;-8.4954845078755e-05;2.2045111109037e-05;2.8029667191731e-06;0.00097454153001308;-0.00013657154340763;-4.5327069528867e-05;-0.00012081730528735;9.3481292424258e-05;2.3278040316654e-05;4.2682695493568e-05;-8.9956090960186e-05;-0.00022320011339616;8.4462262748275e-05;-0.0002443406265229;0.00038047134876251;0.00099378568120301;0.00056737288832664;-0.00030469553894363;-0.00090078054927289;-0.00021427503088489;-0.001304263365455;9.9084158136975e-05;-0.0001131647368311;6.1276004998945e-05;0.00033935037208721;1.3486283933162e-05;3.2596024084341e-06;-1.2975618119526e-05;0.00014190492220223;-5.3668503824156e-05;8.7082051322795e-05;3.9777714846423e-05;-0.00010914250015048;-4.55010413134e-05;0.0012753248447552;-0.00021220282360446;0.00032205361640081;8.3876577264164e-05;-0.00024620283511467;2.3664584659855e-05;-0.00020687803043984;-8.389049617108e-05;0.00017899650265463;-2.8009260859108e-05;0.00052604003576562;0.00013749967911281;0.00056996673811227;0.00043020906741731;-0.00017732419655658;-0.00051802338566631;-4.3659227230819e-05;-0.0011475945357233;1.3983830285724e-05;0.00012037210399285;0.00015142014308367;-0.0010148807195947;1.9035067452933e-05;7.2795628511813e-05;1.9435372450971e-05;-0.00018455598910805;0.00010083292727359;-0.00023729690292384;-0.00034407948260196;0.00054581480799243;-0.00041404750663787;0.0034089768305421;-0.00019081347272731;0.00039239606121555;9.3968999863137e-05;-0.0002200165472459;-2.8348089472274e-05;0.00064140348695219;-0.00012943871843163;0.00057375046890229;-6.8179768277332e-05;0.00040953102870844;0.0003714042250067;0.00053594989003614;0.0003317030495964;0.00033515071845613;-0.0017696265131235;0.00018155066936743;-0.0016413414850831;0.00026201986474916;-0.0018372252816334;0.00021811173064634;-0.0012756013311446;6.9238653850334e-06;-0.00017387967091054;4.4326683564577e-05;-0.00012392058852129;-4.6929777454352e-05;4.0284645365318e-05;6.2232102209236e-05;0.00012471964873839;-0.001045107957907;7.9696008469909e-05;-0.00020412736921571;0.00012445899483282;0.0001203430510941;-1.4748811736354e-05;0.00023259111912921;-4.430008266354e-05;0.0001853646535892;6.9833280576859e-05;-0.00013430848775897;3.4223086231577e-07;-0.00038750362000428;-0.00072644918691367;-0.00033940485445783;0.0010151169262826;0.00010577128705336;0.00098653475288302;0.00010076725448016;-0.00034346306347288;-7.7866818173788e-05;0.00034187798155472;-0.00010114066390088;-8.6751126218587e-05;5.2345976655488e-06;-3.3381173125235e-05;-9.6855465017143e-06;0.00011655664275168;-2.3048369257594e-05;-0.00016706073074602;0.00016214390052482;-0.00067006651079282;-3.6739860661328e-05;9.0251975052524e-05;-0.00010705177555792;-9.6863397629932e-05;6.0186444898136e-05;-0.00042215967550874;-2.0687293726951e-05;-0.0002297419559909;3.2524669222767e-05;0.00011747838289011;-4.0700038539399e-07;-0.00030286479159258;-0.0003165990638081;6.5451234831926e-07;0.00064532982651144;3.938971349271e-05;0.00010122788808076;0.00018991804972757;0.00082260888302699;-7.3846211307682e-05;-5.0875289161922e-05;2.7920235879719e-05;0.00013177462096792;1.3577996469394e-05;-7.6906771937502e-06;-2.5841109163594e-05;-0.00011632191308308;4.8187961510848e-05;0.00034664056147449;-3.8608552131336e-05;0.0026885117404163;-0.00026916328351945;0.00041557414806448;-0.00030615332070738;-0.00019225929281674;8.4664781752508e-05;0.00048840569797903;-6.0526130255312e-05;0.00063009071163833;-8.0664358392823e-05;0.00034857093123719;-2.8815341011068e-06;2.0999041225878e-05;0.00023073253396433;0.00037254905328155;-0.00075834308518097;0.00010903303336818;-0.0015647573163733;0.00033946215989999;-0.0016531399451196;0.00011899571836693;-0.001117862877436;0.00016371569654439;-0.00013282051077113;3.8618396501988e-05;-0.00015128981613088;3.9621525615985e-08;1.0147711691388e-05;-2.7242003852734e-05;-4.6084449422779e-05;-8.9862012828235e-05;-0.0011426883284003;0.00021454320813064;-0.00013637056690641;0.00026263319887221;0.00010663463763194;-7.274287781911e-05;-0.00012808387691621;6.2752260419074e-05;-0.00029046661802568;-2.0364535885165e-05;-0.00024457593099214;-2.5543304218445e-05;0.00024954898981377;0.00081716169370338;-6.680836668238e-05;-0.00026102582341991;-0.00026941375108436;0.00040274587809108;-0.00063530658371747;0.00062414049170911;-3.6774929412786e-07;0.00061712349997833;-6.0149704950163e-05;3.7630637962138e-05;-2.8305157684372e-05;9.9001539638266e-05;4.1337942093378e-05;8.12984580989e-05;1.1492564226501e-05;-0.00035791835398413;0.00016680685803294;-0.00082444126019254;-0.00012011514627375;0.00011324829392834;-0.00027841664268635;-1.383968447044e-05;1.0893113540078e-05;-3.3851989428513e-05;-6.3047795265447e-05;-0.00011817583435914;1.0954168828903e-05;-0.00016890793631319;7.9777142673265e-05;-0.00048500162665732;-0.00091886299196631;0.00010786014172481;0.001641605515033;0.00011167537013534;-0.00015840651758481;0.00057882315013558;0.00022052237181924;-2.2058227841626e-05;0.00035369081888348;2.600314837764e-05;-1.9006560251e-05;3.6987410567235e-05;8.3292281487957e-05;-5.2880292059854e-05;9.2330454208422e-05;-4.2007748561446e-05;-0.00035545259015635;0.00040530902333558;-0.0001274809037568;0.00043902202742174;3.2605134947516e-06;0.00015458602865692;2.833794678736e-05;-3.3024913136614e-05;0.00018958283180837;-5.1170984079363e-05;0.00016738247359172;0.00010349654621677;-3.2751417165855e-05;2.8572238079505e-05;-0.0002699953620322;0.00031043880153447;5.9554935432971e-05;0.00092900806339458;-0.00064668996492401;-0.00018280518997926;-0.00037915291613899;-0.00030698193586431;-0.00020389864221215;1.174350745714e-05;-0.00016880707698874;-0.00010061571811093;1.7739979739417e-05;-1.1978917427768e-05;-2.7551022867556e-05;-4.8434947530041e-05;3.3364281989634e-05;0.0004608572635334;-0.00042149587534368;0.000438867660705;-0.00051545747555792;0.00032483079121448;-0.00035345644573681;-3.9998660213314e-05;5.4863714467501e-05;-5.6099914218066e-05;6.5155887568835e-05;6.4852341893129e-05;-8.0967314715963e-05;-6.4874526287895e-05;4.8281199269695e-05;4.3614203605102e-05;5.9885718656005e-05;-4.8477224481758e-05;-0.0010975947370753;0.00096187059534714;-0.00061916769482195;0.00071987719275057;-0.00010404250497231;0.00011930690379813;-7.715819083387e-05;0.00012621388304979;7.2901666499092e-06;-7.4870345088129e-06;-1.6889537164388e-06;7.2697380346654e-06;3.8211492210394e-05;2.5062410713872e-05;-0.00027591895195656;-0.00020297788432799;-0.00021333669428714;-4.4579017412616e-05;0.00012893482926302;0.00015753982006572;-5.2718645747518e-05;-6.055730409571e-05;0.00010489233682165;7.7210512245074e-05;-6.9548870669678e-05;-4.8947484174278e-05;-7.2264410846401e-05;-4.4208707549842e-05;-0.00024166675575543;-0.00024295013281517;0.00028599603683688;0.00086680182721466;0.00065462733618915;-0.00044667045585811;-0.00052274117479101;-1.2887753655377e-05;-4.2358911741758e-05;0.00014534745423589;7.7654294727836e-05;-5.3524767281488e-05;-2.5718885808601e-05;6.7077526182402e-05;4.4220902054803e-05;8.9398699856247e-06;-6.9087195697648e-06;0.00016965447866824;0.00017945932631847;0.00011403846292524;0.00010204734280705;0.00022659235401079;0.00020858168136328;-2.2979293134995e-05;-4.5116516957933e-06;-3.4212509490317e-05;-3.6818408261752e-05;4.1198029066436e-05;5.4687043302692e-06;-7.0649854023941e-05;-7.1797971031629e-05;3.2834977901075e-05;0.002813583239913;0.0001922420487972;-0.00086131581338122;-0.00088799966033548;-0.0010619856184348;-0.0010922356741503;-5.075559602119e-05;-4.582594101521e-06;3.6228899261914e-05;6.2970902945381e-05;-1.1335042472638e-05;-4.3512901015674e-07;1.2610886187758e-05;1.2072439858457e-05;-0.00010270092025166;7.4730392952915e-05;0.00088408100418746;-0.00080236617941409;0.00098487257491797;-0.0010466062230989;0.0006340152467601;-0.00069324520882219;-9.1943191364408e-05;0.00011644566257019;-9.5351017080247e-05;0.00011400505172787;0.00014031979662832;-0.00015377209638245;-9.0741545136552e-05;7.9512756201439e-05;6.6640488512348e-05;5.5833388614701e-05;-8.4862309449818e-05;-0.0020726558286697;0.0018457246478647;-0.0012170498957857;0.0014127921313047;-0.00025228699087165;0.00024594346177764;-0.00022632154286839;0.00027325682458468;1.3821899301547e-05;-1.4300148905022e-05;-7.3399992288614e-06;9.5475988928229e-06;7.1422837208956e-05;4.7305620682891e-05;-0.00051411287859082;-0.00040275795618072;-0.00037249678280205;-8.0958096077666e-05;0.00023094278003555;0.00031628413125873;-9.1621608589776e-05;-0.00011082640412496;0.00019499480549712;0.00015232691657729;-0.00012001486902591;-8.5092033259571e-05;-0.00013447814853862;-9.5250135927927e-05;-0.00042218383168802;-0.0004365258209873;0.00051329069538042;0.0015268879942596;0.0012237764894962;-0.00077817164128646;-0.00098646769765764;-2.1885214664508e-05;-7.5347714300733e-05;0.00025684977299534;0.00014025792188477;-0.00010219251998933;-5.8310328313382e-05;0.00012387751485221;9.0476263721939e-05;2.5026135972439e-06;-1.5673609595979e-05;0.00037433271063492;0.00034356262767687;0.0002765073440969;0.00022466253722087;0.00046370559721254;0.00042009528260678;-5.2541712648235e-05;-1.432815224689e-05;-7.6425407314673e-05;-7.0775073254481e-05;4.1818537283689e-05;-1.1710349099303e-05;-0.00014118770195637;-0.00014405568072107;0.00012486008927226;0.0054641962051392;0.00040302149136551;-0.0018134504789487;-0.0017500955145806;-0.0021147262305021;-0.0021545183844864;-5.8958612498827e-05;1.0344584552513e-05;7.4993753514718e-05;0.00012729768059216;-9.9197868621559e-06;4.095692474948e-06;3.8000202039257e-05;3.4369382774457e-05;-9.9177254014648e-05;7.5210984505247e-05;0.00086938554886729;-0.00078752863919362;0.001014192821458;-0.0010181633988395;0.00061710260342807;-0.00068960728822276;-9.1401496320032e-05;0.00011586050823098;-8.855811029207e-05;0.00011475732026156;0.00015744935080875;-0.00013822423352394;-7.4198404035997e-05;8.5487532487605e-05;3.3581884054001e-05;-7.6417592936195e-05;-9.7903423011303e-05;-0.0019894705619663;0.0018686895491555;-0.0011589138302952;0.0014366242103279;-0.00028188290889375;0.0002218719891971;-0.00025637578801252;0.00025346016627736;1.139191135735e-05;-1.6029711332521e-05;-1.5062806596688e-05;3.8489415601362e-06;6.7325461714063e-05;4.7192508645821e-05;-0.00048290519043803;-0.00042101906728931;-0.00035650929203257;-8.890857861843e-05;0.00020171931828372;0.0003332486958243;-8.6059131717775e-05;-0.00011053714843001;0.00018431307398714;0.00015697219350841;-0.00011688579979818;-8.5605439380743e-05;-0.00012264140241314;-0.00010304775787517;-0.00039950539940037;-0.00042717269388959;0.0004965090774931;0.0014176722615957;0.0012560173636302;-0.00069935276405886;-0.0010137762874365;-1.6641446563881e-05;-7.2108065069187e-05;0.00024501694133505;0.00014373491285369;-9.5542134658899e-05;-6.175966700539e-05;0.00011581965372898;9.4435883511323e-05;-4.872070348938e-06;-8.8238903117599e-06;0.00039642307092436;0.00029896278283559;0.00032228516647592;0.00015765969874337;0.00048147473717108;0.00037829481880181;-5.8572655689204e-05;-6.8703457145602e-06;-7.7960110502318e-05;-6.6205837356392e-05;4.0659782825969e-05;-2.0081046386622e-05;-0.00013849828974344;-0.00014260239549913;0.0001270103675779;0.0053420225158334;0.00039750864380039;-0.0018440232379362;-0.0016403672052547;-0.0021250103600323;-0.002048579743132;-6.3979379774537e-05;2.9016557164141e-05;5.8153418649454e-05;0.00014836667105556;-7.9981773524196e-06;2.8205952276039e-06;3.9840841054684e-05;3.3945001632674e-05;-9.4575862021884e-06;-1.7927517546923e-05;-0.00012228303239681;7.9644123616163e-05;-0.0001753629767336;0.0013446533121169;-0.00017568127077539;0.00026933819754049;3.2287112844642e-05;-0.00013806288188789;1.5415467714774e-05;9.830833732849e-06;-8.861163223628e-05;3.8917078200029e-05;-7.6891028584214e-06;0.00017776068125386;0.00028020865283906;0.00058239098871127;0.00033366534626111;-2.6512554541114e-05;-0.00090224226005375;4.8124951717909e-05;-0.0011249158997089;0.00011822833766928;-0.00021752178145107;0.00013947645493317;-0.00047711012302898;7.0036348915892e-06;1.245197836397e-05;1.2815046829928e-05;-1.8833618014469e-05;-1.6965714166872e-05;7.5793286669068e-05;0.00018037592235487;-0.00014594127424061;-3.3344491384923e-05;-0.00032337085576728;-0.00014557884423994;0.00014361063949764;4.0540948248236e-05;-8.5118241258897e-05;-3.8904890971025e-05;-0.00019987556152046;1.1592989721976e-05;-0.00010726138862083;1.7269730960834e-05;6.5286993049085e-05;-0.00025872600963339;-0.00018243667727802;9.9053104349878e-05;-5.3013271099189e-05;0.00059766840422526;0.0001953775936272;-0.00022191082825884;-5.2971572586102e-05;0.00038182284333743;3.8674694224028e-05;-4.3859745346708e-05;2.4936789486674e-05;6.8498797190841e-05;-2.5494568035356e-05;-5.7287884374091e-06;4.4544038246386e-05;-9.0047207777388e-05;-9.0644916781457e-06;0.00018202122009825;-0.00015531695680693;0.0017846672562882;-0.00016528191918042;0.00024891717475839;5.8533787523629e-05;-0.00013656566443387;-5.8427911426406e-05;0.0003790034679696;-4.634427750716e-05;0.00043633725726977;-1.3181217582314e-05;0.00027882182621397;9.8184664238943e-06;0.00016272992070299;0.00023997954849619;4.4696931581711e-05;-0.00045755170867778;0.00017647114873398;-0.0010121209779754;7.7001277531963e-05;-0.0010989538859576;9.9410499387886e-05;-0.00077452207915485;2.8743788789143e-05;-0.00012185704690637;3.0211274406611e-06;-0.00011548322800081;-3.7442208849825e-05;1.805802276067e-05;-0.00013715332897846;-9.0615694716689e-06;-0.00011987526522717;0.0012753339251503;-0.0001612917840248;0.00024527581990696;1.0397768164694e-05;-0.00012466538464651;4.527957571554e-05;-9.3787391961087e-05;-9.5614283054601e-05;-9.9320575827733e-05;1.3111940688759e-06;0.00013681745622307;0.0003976192092523;0.00081414147280157;0.00040618286584504;-0.00013433866843116;-0.0010478135664016;-6.7396817030385e-05;-0.0012318451190367;0.00011078712850576;5.1995662943227e-05;0.00013217935338616;-0.00036576404818334;-1.5324726518884e-06;4.8773836169858e-05;1.4592442312278e-05;1.8156748410547e-05;-2.8113809094066e-05;9.7847907454707e-05;0.00018717275816016;-0.00014767784159631;-2.8217124054208e-05;-0.00030814448837191;-0.00014255633868743;0.00017250717792194;6.0072958149249e-05;-0.0001283576420974;-2.6515683202888e-05;-0.00030793470796198;1.0837265108421e-05;-0.00014086777810007;1.0195499271504e-06;0.00015735792112537;-0.00025241330149584;-0.00010917506006081;0.00011338599870214;-5.5608441471122e-05;0.00050794373964891;0.00015025888569653;-0.00023962795967236;-6.8201632529963e-05;0.00056191149633378;5.358389171306e-05;-0.00016937183681875;2.0892706743325e-05;0.00011104540317319;-1.9857385268551e-05;-3.3196636650246e-05;6.5588901634328e-05;-0.00013906450476497;-8.1518075603526e-05;0.00033229705877602;-0.00028198340442032;0.0026054300833493;-0.00024955865228549;0.00037825183244422;8.5364074038807e-05;-0.0002064848667942;-6.8719280534424e-05;0.00047956765047275;-8.8800006778911e-05;0.00055135344155133;-2.6465764676686e-05;0.00038758269511163;8.1350168329664e-05;0.00034098557080142;0.00036784016992897;0.00012122555926908;-0.00089265580754727;0.00024292460875586;-0.0015213945880532;0.00014827567792963;-0.0014838754432276;0.00017509449389763;-0.0010830119717866;3.541410114849e-05;-0.00013899272016715;1.183986387332e-05;-0.00014786094834562;-6.4931642555166e-05;4.7014334995765e-05;6.0057089285692e-05;0.00015374865324702;-0.0014044888084754;0.0001530075824121;-0.00035744276829064;0.00016919150948524;0.00023185310419649;-7.0726877311245e-05;0.00035874894820154;-5.2788418543059e-05;0.00022086651006248;8.0635778431315e-05;-0.00031175441108644;3.1183226383291e-05;-0.00044986052671447;-0.0008403766551055;-0.00036553593236022;0.0013193298364058;5.9643796703313e-05;0.0012106674257666;6.1659571656492e-05;-0.0005253492272459;-9.4890216132626e-05;0.00068105943500996;-0.00015280606749002;-0.00013627951557282;9.3993066911935e-06;-4.4013113438268e-06;-1.6433728887932e-05;0.00011158801498823;5.7564005118138e-08;-8.5031366324984e-05;0.00025259362882935;-0.0014622375601903;-6.2801635067444e-05;-2.625258093758e-05;-0.00010706383181969;-3.9710499549983e-05;4.8198853619397e-05;-0.00051908363820985;-5.2961589972256e-05;-0.00037359149428084;7.0852009230293e-05;-2.3075222998159e-05;1.5032052942843e-05;-0.00060159584973007;-0.00070567737566307;-0.00010133694013348;0.0012078090803698;0.00016222459089477;0.00052509683882818;0.00031092306016944;0.0010300609283149;-0.00011570788774407;0.00035228105843998;5.3062876759213e-06;0.00017395832401235;2.1784102500533e-05;3.6048728361493e-05;-4.768762664753e-05;-7.8338875027839e-05;4.5979937567608e-05;0.00027987055364065;7.9191842814907e-05;0.0027505203615874;-0.00030699916533194;0.00048223428893834;-0.00041628952021711;-0.00021865221788175;0.0001088187636924;0.00050409435061738;-9.6505616966169e-05;0.0007697525434196;-6.5981119405478e-05;0.00039494820521213;1.7197095075971e-05;-0.00019189731392544;-6.8588393332902e-05;0.00039814069168642;-0.00027408305322751;0.00011887168511748;-0.001690654666163;0.00056845304789022;-0.0018327988218516;8.9082277554553e-05;-0.0012356946244836;0.00017550072516315;-0.00014739762991667;5.8434157836018e-05;-0.00019612678443082;-2.1082742023282e-05;-6.1541992181446e-05;4.4489035644801e-05;8.3332779468037e-06;0.00018656284373719;-0.0019386815838516;0.00025055662263185;-0.0004980827216059;0.00024561944883317;0.00032141178962775;-0.00011159038695041;0.00041269217035733;-5.0919141358463e-05;0.00020397143089212;0.00010111294250237;-0.00045053768553771;4.7589619498467e-05;-0.00050322990864515;-0.00095849903300405;-0.00044407605309971;0.001659871195443;4.8535326868659e-07;0.0015653023729101;-1.3646908882947e-05;-0.00051828735740855;-0.00012767816951964;0.00099416833836585;-0.0002131777437171;-0.00016094722377602;6.6900838646688e-06;2.0886123820674e-05;-1.8846754755941e-05;0.00011725850345101;1.582993172633e-05;-4.9091195251094e-05;0.00033843668643385;-0.0019736122339964;-0.0001006046004477;-6.8655965151265e-05;-0.00015286014240701;-1.8041118892143e-05;4.8245216021314e-05;-0.00060005392879248;-8.4341430920176e-05;-0.00046014494728297;9.2977534222882e-05;-0.00010037052561529;3.2483683753526e-05;-0.00085067807231098;-0.0010159874800593;-0.00013639927783515;0.0016933092847466;0.00024490256328136;0.00071832217508927;0.00045641389442608;0.0011815869947895;-0.00014374573947862;0.00058084056945518;3.2695488698664e-06;0.00020376981410664;3.4473738196539e-05;6.0507885791594e-05;-6.8041394115426e-05;-5.2577652240871e-05;4.6283905248856e-05;0.00021876495156903;0.00017633505922277;0.0029544183053076;-0.00033238212927245;0.00053650781046599;-0.00050438090693206;-0.00024120132729877;0.00012933973630425;0.0005676705040969;-0.00012724689440802;0.00091461802367121;-4.9708891310729e-05;0.00044403632637113;3.4028373192996e-05;-0.00036233323044144;-0.00033306219847873;0.00042348215356469;0.00011181640729774;0.00012726020941045;-0.001833604532294;0.0007621327531524;-0.0020924692507833;6.149059481686e-05;-0.0013820750173181;0.00017944008868653;-0.00017568738257978;7.3926967161242e-05;-0.00023571937344968;-3.9103557355702e-05;1.4344452210935e-05;-2.8929562176927e-05;-8.9703389676288e-05;-8.16354440758e-05;-0.0012363529531285;0.00024858929100446;-0.0001812015689211;0.00028983151423745;0.00012434796371963;-8.0315054219682e-05;-0.00010433886927785;6.5180320234504e-05;-0.00028415650012903;-9.3349553935695e-06;-0.00025627450668253;-2.3629674615222e-05;0.00024029143969528;0.00070753501495346;-9.8189331765752e-05;-0.00013826653594151;-0.00027438608231023;0.00053221907000989;-0.00064223888330162;0.0006145458901301;-1.4876639397698e-05;0.00065429438836873;-8.2776037743315e-05;2.7185642466065e-05;-3.1294232030632e-05;9.881937148748e-05;4.0715829527471e-05;8.1436635809951e-05;1.3356361705519e-05;-0.00033757605706342;0.0001677407999523;-0.00096676708199084;-0.00013546159607358;7.1188907895703e-05;-0.00028228230075911;-1.0343309213567e-06;1.3442798262986e-05;-7.300081779249e-05;-6.5216212533414e-05;-0.00014116099919192;1.6404937923653e-05;-0.0001753388060024;8.1508522271179e-05;-0.00050745130283758;-0.0010241742711514;5.9893616707996e-05;0.0016863677883521;0.00014363293303177;-3.9758820093994e-06;0.00063035567291081;0.00028815199038945;-2.2416214051191e-05;0.00040116210584529;2.2753049051971e-05;-1.881635398604e-06;3.7181100196904e-05;7.9769699368626e-05;-5.6609376770211e-05;9.8284770501778e-05;-3.631396612036e-05;-0.00040332184289582;0.00039366882992908;-8.0266756413039e-05;0.0003596979950089;2.1343774278648e-05;7.4189381848555e-05;2.0397957996465e-05;-2.0114624931011e-05;0.00022291792265605;-5.9261881688144e-05;0.00020036497153342;9.9964403489139e-05;-2.7068823328591e-05;4.0429989894619e-05;-0.00032317361910827;2.0108822354814e-05;5.393036553869e-05;0.0011208124924451;-0.00053553789621219;-0.00018758361693472;-0.0001732119708322;-0.00037703028647229;-0.0001887997641461;-2.0902860342176e-05;-0.00014872297469992;-0.00011631012603175;2.2467778762802e-05;-1.4829264728178e-05;-3.6129240470473e-05;1.2720144695777e-05;-3.6964811442886e-05;-0.00010201230179518;-0.00013714750821237;-0.0014033534098417;0.00029016190092079;-0.00019595574121922;0.00035384632064961;0.00014150577771943;-9.6796160505619e-05;-0.00012170158152003;8.8514170784038e-05;-0.00034649635199457;-2.5558156266925e-05;-0.00030179636087269;-3.4653370676097e-05;0.00036069692578167;0.00098104670178145;-9.5408446213696e-05;-0.00032232544617727;-0.00033671694109216;0.00056127324933186;-0.00082110753282905;0.00074333493830636;5.4071801969258e-07;0.0007616164512001;-8.6709718743805e-05;3.2195952371694e-05;-4.0842416638043e-05;0.00012142374180257;5.6669170589885e-05;9.2965761723462e-05;1.9381181118661e-05;-0.00041167644667439;0.00018344086129218;-0.0011787338880822;-0.00017352856229991;8.5991217929404e-05;-0.00034940568730235;1.3040945532339e-06;1.3867183952243e-05;-7.4314360972494e-05;-7.6650590926874e-05;-0.00016672830679454;1.3846018191543e-05;-0.00022146929404698;0.00010120068327524;-0.0006070647505112;-0.001281495555304;7.8432662121486e-05;0.0020770949777216;0.00019188754959032;-9.3614926299779e-06;0.00078209541970864;0.00032621136051603;-1.6782118109404e-05;0.00049976608715951;3.0293913368951e-05;-6.6427460296836e-06;4.4554752093973e-05;9.884617611533e-05;-6.732608017046e-05;0.00013137744099367;-4.8477322707186e-05;-0.00053693051449955;0.00050350266974419;-0.00023407068511005;0.00047704481403343;1.50382229549e-05;0.00011195354454685;3.3765878470149e-05;-3.0931962101022e-05;0.00025629933224991;-7.2548435127828e-05;0.00021527793433052;0.00012938397412654;-5.7472090702504e-05;5.1446124416543e-05;-0.00040877726860344;5.8381559938425e-05;6.2238381360658e-05;0.0014666052302346;-0.00070786022115499;-0.00019700582197402;-0.00025757338153198;-0.00039165085763671;-0.00024385102733504;3.6941215512343e-05;-0.00019687735766638;-0.00013947435945738;2.6585998057271e-05;-7.104245469236e-06;-4.5236833102535e-05;-0.00010277602996211;7.1545211540069e-05;0.0010065585374832;-0.00090909522259608;0.0010482741054147;-0.0010079442290589;0.00041034605237655;-0.00044194763177074;-6.7019173002336e-05;8.5134648543317e-05;-0.00015369078028016;0.00017356150783598;0.00014689116505906;-0.00014750030823052;3.4219649478473e-06;-5.0421494961483e-06;7.4731673521455e-05;0.00010641443805071;-6.0866401327075e-05;-0.0025633864570409;0.0022699704859406;-0.00069888029247522;0.00078777625458315;-0.00020955374930054;0.00017502556147519;-0.00030189217068255;0.00031050865072757;5.057597081759e-05;-4.7705896577099e-05;-5.4623276810162e-05;5.1187707867939e-05;6.4694591856096e-05;5.1027123845415e-05;-0.00075045635458082;-0.00064237049082294;-0.00076354900375009;-0.00044881558278576;1.0369389201514e-05;0.00012567352678161;-5.8472498494666e-05;-9.0250679932069e-05;0.00021384685533121;0.00016458558093291;-0.00020638092246372;-0.00015646377869416;-0.00014385061513167;-0.00010538264905335;-0.00018361107504461;-0.0014961436390877;0.00046322410344146;0.0018740013474599;0.0015989195089787;-0.00014550592459273;-0.00038929164293222;0.00017119188851211;0.00010226695303572;0.00040932514821179;0.00026632790104486;-0.00010368580842623;-6.3800420321058e-05;0.00013142618990969;0.00010115103941644;2.3422215235769e-05;7.6619362516794e-06;0.00015693476598244;0.00011177024862263;0.00022991609876044;0.00018132686091121;0.00053878914332017;0.00052425620378926;-6.7119472078048e-05;-3.1492600101046e-05;-5.3865310292167e-06;5.3870344345341e-06;3.1035513529787e-05;-1.7287044101977e-05;-0.00018860743148252;-0.00019850174430758;3.271047535236e-05;0.0050025498494506;0.00050201360136271;-0.0013430947437882;-0.001248411135748;-0.0022144773975015;-0.0022909170947969;-6.4378429669887e-05;2.0324132492533e-06;0.0001071785154636;0.00015065890329424;-5.5064083426259e-05;-4.6745779400226e-05;8.1465332186781e-05;8.2374332123436e-05;-9.9562283139676e-05;7.2391914727632e-05;0.001028383616358;-0.00091566983610392;0.0010739744175225;-0.00099007319658995;0.00039994670078158;-0.00045250591938384;-6.4747830037959e-05;8.4017308836337e-05;-0.00015838154649828;0.00018020436982624;0.00016551751468796;-0.00013377868162934;1.3852656593372e-05;7.4369022513565e-06;3.0139532100293e-05;-3.0153209081618e-05;-7.3675459134392e-05;-0.0025465346407145;0.0023676410783082;-0.00064754975028336;0.00082922261208296;-0.00023507345758844;0.00014649608056061;-0.00032400790951215;0.00028967024991289;5.1493094360922e-05;-4.9851805670187e-05;-6.3972322095651e-05;4.5149728975957e-05;6.3778177718632e-05;5.2675201004604e-05;-0.0007418409222737;-0.00067602581111714;-0.00076353433541954;-0.00048349634744227;-1.6265432350338e-05;0.00014798152551521;-5.7693054259289e-05;-9.3659858976025e-05;0.00021149715757929;0.00017191788356286;-0.00020970309560653;-0.00016427972877864;-0.0001345707278233;-0.00011910802277271;-0.00018329122394789;-0.0015341165708378;0.00047513464232907;0.0018394388025627;0.0017029424197972;-9.3438575277105e-05;-0.00044178665848449;0.00017547736933921;0.00010897558240686;0.00040878902655095;0.0002860531094484;-0.00010054594895337;-6.7539032897912e-05;0.00012740746024065;0.00010882700007642;1.701991277514e-05;1.6707852410036e-05;0.00019564881222323;6.1851751524955e-05;0.00028873048722744;0.00011645053746179;0.0005660803290084;0.00050556717906147;-7.3779621743597e-05;-2.413165748294e-05;-9.2825230240123e-06;1.4176683180267e-05;3.9564285543747e-05;-2.0753073840751e-05;-0.00018694474420045;-0.00020596783724613;2.3249147488968e-05;0.0050425315275788;0.00050644931616262;-0.0014284742064774;-0.0011474762577564;-0.0022770604118705;-0.0022706624586135;-8.2479047705419e-05;1.2773381058651e-05;8.5930791101418e-05;0.0001758787111612;-5.4345477110473e-05;-5.2722916734638e-05;8.0970152339432e-05;8.4499290096574e-05;-4.413210626808e-05;3.1246621801984e-05;0.00054157455451787;-0.00047290517250076;0.00052868790226057;-0.00045668130042031;0.00019459474424366;-0.00022652692859992;-2.5817456844379e-05;3.5257322451798e-05;-8.8569984654896e-05;0.00010181954712607;9.2842972662766e-05;-5.9820005844813e-05;2.8186236704641e-06;1.9378687284188e-05;-1.8350543768975e-06;-6.8695248046424e-05;-4.5373948523775e-05;-0.0013317592674866;0.0012769656023011;-0.00028943197685294;0.00041806299122982;-0.00011879265366588;4.4489806896308e-05;-0.00015681610966567;0.00011648685176624;2.6601610443322e-05;-2.6534813514445e-05;-3.8030739233363e-05;2.0894998669974e-05;3.1918334570946e-05;2.6995698135579e-05;-0.00038210951606743;-0.00036492853541858;-0.00041283649625257;-0.00027450831839815;-2.3370430426439e-05;8.552276995033e-05;-3.2283318432746e-05;-5.3339834266808e-05;0.00011049058957724;9.1594651166815e-05;-0.00011744126823032;-9.4744209491182e-05;-6.5921150962822e-05;-6.6147316829301e-05;-9.7283933428116e-05;-0.00082824868150055;0.00026986445300281;0.00096766441129148;0.00095549161778763;-3.6325563996797e-05;-0.0002731182903517;9.4064045697451e-05;5.9330031945137e-05;0.00022321409778669;0.00016516142932232;-4.9672009481583e-05;-3.2947355066426e-05;6.5202140831389e-05;5.8711913879961e-05;1.1667632861645e-05;1.5346966392826e-05;9.4774004537612e-05;-9.3905791800353e-06;0.00014862180978525;5.1761749091384e-06;0.00029893522150815;0.00023567797325086;-3.7778521800647e-05;-5.2293758017186e-06;-3.030754669453e-06;1.6425730791525e-05;3.7494821299333e-05;-1.279927687392e-06;-9.6797775768209e-05;-0.00010619380918797;-2.1673633455066e-05;0.0025651794858277;0.00024923781165853;-0.00070036464603618;-0.00048327635158785;-0.0011789056006819;-0.0011207961943001;-6.1764621932525e-05;9.336170592178e-07;3.5159886465408e-05;0.00010220772674074;-3.3063370210584e-05;-3.4429838706274e-05;3.8087608118076e-05;3.9048449252732e-05;5.0311824452365e-05;-3.2997086236719e-05;0.00013305974425748;0.0001151380565716;-0.00033196515869349;0.0013969687279314;-0.00035268208011985;0.00020801760547329;0.00010554424807196;-0.00016357467393391;-0.00011427083518356;0.00014316209126264;1.8608889149618e-05;0.00030173422419466;2.455604771967e-05;0.00031618901994079;-0.00033216967131011;-0.00085843249689788;0.00011959399853367;0.00035127886803821;0.00019538901688065;0.00078751094406471;-0.00063559744739905;1.9964332750533e-05;-0.00069169368362054;0.00011220535816392;-0.00072574726073071;5.0563867262099e-05;-3.6265340895625e-05;-5.5915668781381e-05;-0.00011848538269987;2.73702571576e-05;7.8564167779405e-05;0.00020537628734019;-0.00039291410939768;-0.00023229168436956;-0.0011523368302733;-0.0003657694614958;0.00014704660861753;1.8703038222156e-05;-3.1186941669148e-06;-0.00010135424963664;-7.010722765699e-05;5.0118796934839e-06;-0.00016075446910691;9.6106421551667e-05;-0.00024240018683486;-0.00061345304129645;-0.0012500683078542;7.9624456702732e-05;0.00019840800086968;0.0020323335193098;0.0008186589111574;-7.9585763160139e-05;6.1525524870376e-06;0.00032552384072915;5.6760298321024e-05;0.00048052711645141;5.2319795941003e-05;-4.929526653541e-07;-6.7836830567103e-05;0.000103996724647;-4.1287017666036e-05;0.00011417378118495;0.00056916888570413;-0.0005783686065115;0.00050566368736327;-0.00024665036471561;6.8982670200057e-05;2.7121900529892e-06;-2.9295038984856e-05;3.6634333810071e-05;-0.00010069874406327;0.00027901417342946;0.00014953712525312;0.00016241619596258;6.7435481469147e-05;-6.0896323702764e-05;-0.00043101000483148;-6.2128689023666e-05;7.6733180321753e-05;-0.00073388172313571;0.001550181186758;-0.00016350466466974;-0.00020956627849955;-0.00028151148580946;-0.00032301063765772;-0.00021641148487106;5.4843403631821e-05;3.8848258554935e-05;-0.00015374014037661;-5.8373396313982e-05;1.3990105799166e-05;4.656223609345e-05;-3.5849356208928e-05;9.0211564383935e-05;0.00012954443809576;-0.00033136527054012;0.0014105485752225;-0.00033197196898982;0.00022376130800694;0.00010042252688436;-0.00016522407531738;-9.8797041573562e-05;0.00013192102778703;2.3590250748384e-06;0.00028268329333514;1.597244408913e-05;0.00030813229386695;-0.00026084325509146;-0.00068404979538172;0.00013999492512085;0.00033391325268894;3.5574990761233e-05;0.00070202903589234;-0.00069405609974638;3.8543083064724e-05;-0.00065459235338494;0.00012353596684989;-0.00071558984927833;4.4853615690954e-05;-3.1608065910405e-05;-4.5212156692287e-05;-0.00011140426067868;2.4038950868999e-05;7.5097523222212e-05;0.0002122180594597;-0.00034911467810161;-0.00020362553186715;-0.0010784511687234;-0.00033356269705109;0.00013462801871356;1.8399332475383e-05;-3.9682663555141e-06;-9.819919068832e-05;-7.9909106716514e-05;1.0422727427795e-05;-0.00015290261944756;8.8515153038315e-05;-0.00021962242317386;-0.00058549206005409;-0.0011275432771072;7.059801282594e-05;0.00016669789329171;0.0018672340083867;0.00074273685459048;-6.6998305555899e-05;-5.3055791795487e-06;0.00031783594749868;4.8742353101261e-05;0.00044265764881857;5.0207301683258e-05;5.741574568674e-06;-6.4779887907207e-05;9.3703376478516e-05;-3.284575723228e-05;9.6589312306605e-05;0.0005069391336292;-0.00050512020243332;0.0004264140734449;-0.00010899134940701;3.8366128137568e-05;1.368712673866e-05;-1.9714032532647e-05;2.4202316126321e-05;-9.5939380116761e-05;0.00027529962244444;0.0001315768022323;0.00018063645984512;6.1525490309577e-05;-3.2720097806305e-05;-0.00039686777745374;-0.00011622855527094;7.4569165008143e-05;-0.00062292721122503;0.0013839399907738;-9.3060800281819e-05;-0.0002244569332106;-0.00024569549714215;-0.0003672172606457;-0.00018467224435881;-6.4740461311885e-06;3.7887246435275e-05;-0.00014620703586843;-5.4214764531935e-05;1.7200779893756e-06;-4.4057003833586e-05;4.0414786781184e-05;-0.00011246240319451;-6.5035463194363e-05;-8.2774306065403e-05;0.00094914500368759;-0.00011997913679807;0.00021272148296703;1.8541013560025e-05;-0.00012423821317498;5.1434228225844e-05;-0.00016262712597381;-7.1901027695276e-05;-0.00015893352974672;-7.184340574895e-06;0.00014133768854663;0.00035491038579494;0.0006989830872044;0.00032077444484457;-0.00012592982966453;-0.00088321598013863;-8.343951049028e-05;-0.00096869736444205;7.652587373741e-05;0.00025373251992278;0.00010667346941773;-0.00031164922984317;-8.2162505350425e-06;7.0667083491571e-05;1.3817229046253e-05;2.0662484530476e-05;-1.36718763315e-05;7.3623494245112e-05;0.00017058885714505;-6.7906134063378e-05;-2.8071579436073e-05;-0.00048853107728064;-9.7392352472525e-05;9.8086253274232e-05;4.6777477109572e-05;-8.9498025772627e-05;-2.8814698453061e-05;-0.00029823745717295;2.2337824702845e-05;-0.0001663039874984;-1.2363877885946e-06;9.8725373391062e-05;-0.00028601638041437;-0.0001753094693413;4.9829159252113e-05;6.3873221733957e-06;0.00050853751599789;0.0001236632670043;-2.8506017770269e-05;-7.0551672251895e-05;0.00054939929395914;3.6299286875874e-05;-3.6063560401089e-05;1.6750514987507e-05;0.00011235110287089;-1.9774028260144e-05;-1.7472051695222e-05;5.5389224144164e-05;-0.00010715227836045;-3.9064394513844e-05;0.00028219353407621;-0.00026124317082576;0.0022098564077169;-0.00024533845135011;0.00034654961200431;7.978301437106e-05;-0.00018779517267831;-6.8860215833411e-05;0.00037427799543366;-7.4306066380814e-05;0.00047227856703103;-1.8786264263326e-05;0.00033946210169233;9.6026333267218e-06;0.00024033000227064;0.00033147775684483;0.00011399775394239;-0.00066259852610528;0.00026065632118843;-0.0013499292545021;0.00012101639003959;-0.0012511555105448;0.00016011750267353;-0.0009342742851004;3.5879595088772e-05;-0.00010398766607977;4.6758364078414e-06;-0.00013305300672073;-0.00012231151049491;6.8099368945695e-05;0.00019878713646904;0.00014540199481416;-0.0010979229118675;0.00013138800568413;-0.00036738798371516;0.00013753031089436;0.00027113675605506;-9.2825932370033e-05;0.00057481683325022;-7.184697460616e-05;0.0004099564102944;5.972559665679e-05;-0.00036575717967935;4.8431291361339e-05;-0.00047763271140866;-0.00083347136387601;-0.00031083665089682;0.0013028787216172;6.5132982854266e-05;0.0010441496269777;9.5834329840727e-05;-0.0010668452596292;-6.5103100496344e-05;0.00068433908745646;-0.00014431138697546;-0.00020283981575631;2.1588173694909e-05;-2.4045239115367e-05;-1.6058591427281e-05;8.4226012404542e-05;2.4452778234263e-05;5.4611013183603e-05;0.00028561626095325;-0.0019599134102464;-7.9659112088848e-05;-0.00012083726323908;-6.9779285695404e-05;-1.8782030792863e-06;3.8731464883313e-05;-0.00059142167447135;-7.0050402428024e-05;-0.00047791033284739;9.3266957264859e-05;-9.9232616776135e-05;1.2521317330538e-05;-0.00077925116056576;-0.00087857688777149;-0.00017926214786712;0.0014113833894953;0.00027065305039287;0.00084927718853578;0.00031531395507045;0.001178385457024;-0.00013734547246713;0.00059634086210281;-7.1568015300727e-06;0.00020750850671902;2.3473670808016e-05;6.1345504946075e-05;-5.4832835303387e-05;-2.9756656658719e-05;3.7799196434207e-05;0.00023631230578758;0.0001601935364306;0.0026318889576942;-0.00033720879582688;0.00050299271242693;-0.00048576504923403;-0.00023365340894088;0.00012453692033887;0.00039188138907775;-0.0001130540840677;0.00076200912008062;-4.9672009481583e-05;0.00040716855437495;2.9687362257391e-05;-0.00035919187939726;-0.00029103987617418;0.00040766887832433;7.3729257564992e-05;0.0001527050480945;-0.0017069326713681;0.00071746454341337;-0.0017551995115355;5.8551417168928e-05;-0.0012304310221225;0.00018369234749116;-0.00010573925101198;6.7598339228425e-05;-0.00021074576943647;-3.7489964597626e-05;-0.00011993499356322;6.6114320361521e-05;0.00012843057629652;0.00017767344252206;-0.0017226740019396;0.00024259653582703;-0.00051981338765472;0.00022996935877018;0.00036852349876426;-0.00013454598956741;0.00065091450233012;-6.8849069066346e-05;0.0004045368405059;8.3852602983825e-05;-0.00051316939061508;6.3549596234225e-05;-0.00053471623687074;-0.00099517707712948;-0.00042123266030103;0.0017143250443041;2.132750751116e-06;0.0014833222376183;1.7778527762857e-05;-0.0010691900970414;-0.00010124762775376;0.001019085641019;-0.00021507190831471;-0.0002376894117333;1.7296082660323e-05;2.6384748252894e-07;-1.7053605915862e-05;9.7492651548237e-05;4.1033224988496e-05;9.5102092018351e-05;0.00038269805372693;-0.002552425255999;-0.00013118977949489;-0.0001634074433241;-0.00012813505600207;1.6275651432807e-05;4.3354139052099e-05;-0.00071563362143934;-0.00010453023423906;-0.00057610555086285;0.00011769297998399;-0.00017060595564544;3.0475001040031e-05;-0.001072242972441;-0.0012541750911623;-0.00022164524125401;0.0019751889631152;0.00037893201806583;0.0010776064591482;0.00049464724725112;0.0013904744992033;-0.00016954750753939;0.00083006464410573;-4.9148184189107e-06;0.00025248999008909;3.7835136026843e-05;8.0956910096575e-05;-7.7761025750078e-05;-9.6859694167506e-06;4.2505642340984e-05;0.00017668823420536;0.00026989061734639;0.0030298233032227;-0.00038618745747954;0.00059396686265245;-0.00061285827541724;-0.00026909436564893;0.00015208087279461;0.00051149626960978;-0.00015432527288795;0.00096357450820506;-3.6630470276577e-05;0.00047263159649447;5.2007875638083e-05;-0.00055413326481357;-0.00059215712826699;0.00046281548566185;0.00049352052155882;0.00016614793275949;-0.0019800779409707;0.00097513501532376;-0.002168208360672;3.7083435017848e-05;-0.0014520711265504;0.00019828209769912;-0.00015284532855731;8.8784290710464e-05;-0.00025856253341772;-5.9597245126497e-05;8.2299393397989e-06;-4.1865416278597e-05;-0.00017214338004123;-0.00021319123334251;-0.00108659255784;0.00027723531820811;-0.00017608611960895;0.00035101058892906;0.00012511861859821;-9.3719070719089e-05;-4.0839542634785e-05;0.00010781288438011;-0.00029148085741326;-4.2636795114959e-05;-0.00025352879310958;-4.0684699342819e-05;0.00050305074546486;0.00097561278380454;-7.1443006163463e-05;-0.00047823804197833;-0.00031741862767376;0.00046546413796023;-0.0008167423075065;0.0006170294363983;2.9002756491536e-05;0.0006230985163711;-7.7251941547729e-05;2.5435422230657e-06;-4.8587251512799e-05;0.00011038498632843;6.6855318436865e-05;5.7273544371128e-05;3.0002904168214e-05;-0.00029205772443675;9.7536096291151e-05;-0.0012520486488938;-0.00019447501108516;-1.3612478824143e-06;-0.00031620226218365;3.2045089028543e-05;7.6957885539741e-06;-9.4172872195486e-05;-6.111148832133e-05;-0.00016273210349027;3.0475907806249e-06;-0.00022434520360548;9.4483846623916e-05;-0.00052641821093857;-0.0013511911965907;4.4029033574589e-07;0.0018908563069999;0.00026337159215473;0.00024353362096008;0.00078453292371705;0.00031270596082322;1.5358342352556e-05;0.00054300774354488;2.645971653692e-05;1.5220969544316e-05;3.6269921110943e-05;8.073057688307e-05;-5.8456836995902e-05;0.00015530340897385;-4.2700514313765e-05;-0.00067812856286764;0.00048154368414544;-0.0005136436666362;0.00037815258838236;1.4052204278414e-05;9.4481611085939e-06;4.1248662455473e-05;-2.1875437596464e-05;0.00023757899180055;-7.9627825471107e-05;0.00016331854567397;0.00012562924530357;-0.00011092090426246;7.3560491728131e-05;-0.00049087475053966;-0.0003826440370176;3.2957061193883e-05;0.0019082009093836;-0.00057252898113802;-8.786549733486e-05;2.4644321456435e-05;-0.00027246351237409;-0.00021978977019899;0.00015557547158096;-0.00017836014740169;-0.00014093139907345;3.0233599318308e-05;1.9445455109235e-05;-5.8537771110423e-05;-8.7893888121471e-05;5.6142715038732e-05;0.0010132635943592;-0.00091843219706789;0.0011134167434648;-0.00098694546613842;0.00020852104353253;-0.00021001436107326;-4.9224629037781e-05;6.0515114455484e-05;-0.00017512185149826;0.0001996741630137;0.000150834210217;-0.00013829894305672;9.4605340564158e-05;-8.9614841272123e-05;8.5633873823099e-05;0.00015035778051242;-3.853638554574e-05;-0.0028661456890404;0.0025249139871448;-0.00027319742366672;0.00026305264327675;-0.00017178265261464;0.00011515269579832;-0.00037748375325464;0.00035021768417209;6.9631481892429e-05;-6.626912363572e-05;-9.3147842562757e-05;8.6176049080677e-05;3.6181456380291e-05;3.9459362596972e-05;-0.00091764685930684;-0.00082664017099887;-0.00097911723423749;-0.00068447418743744;-0.00016612802573945;-4.4314991100691e-05;-2.4445971575915e-05;-6.3344530644827e-05;0.00023263471666723;0.0001709775388008;-0.00026948319282383;-0.00021554976410698;-0.00013038601900917;-9.4262424681801e-05;0.00022678323148284;-0.0021830899640918;0.00032787278178148;0.001869137166068;0.0016475040465593;0.00040543702198192;0.000167871141457;0.00032790791010484;0.00026321879704483;0.00048154554679058;0.00033463147701696;-9.7799020295497e-05;-5.9762118326034e-05;0.00012581827468239;9.946376667358e-05;4.9743401177693e-05;3.5349519748706e-05;-0.00017692842811812;-0.00020873098401353;-3.0210916520446e-05;-5.0562648539199e-05;0.00048494988004677;0.0004881085769739;-6.0110971389804e-05;-3.1437306461157e-05;6.4601328631397e-05;7.5701660534833e-05;-5.530132966669e-06;-4.4827607780462e-05;-0.00022125097166281;-0.00023000228975434;-3.9645285141887e-05;0.0038099156226963;0.00049208471318707;-0.00056658918038011;-0.00050040433416143;-0.0018875987734646;-0.0019749093335122;1.4300769180409e-05;6.6883752879221e-05;0.00018929019279312;0.00021306291455403;-9.5975476142485e-05;-9.0845824161079e-05;0.00011449827434262;0.00011706969962688;-8.4478517237585e-05;5.723624053644e-05;0.0010300759458914;-0.00090954673942178;0.0011229778174311;-0.00098021246958524;0.00019733441877179;-0.00021976062271278;-4.7684286982985e-05;6.0653168475255e-05;-0.00018102006288245;0.00019944162340835;0.00016458712343592;-0.00012674508616328;0.00010320117144147;-8.1293641414959e-05;3.3883341529872e-05;3.5167024179827e-05;-4.7040004574228e-05;-0.0028228466399014;0.0025931517593563;-0.0002297326864209;0.00029958997038193;-0.00019158991926815;9.3657261459157e-05;-0.00039189454400912;0.00033781790989451;7.1495742304251e-05;-6.5970125433523e-05;-0.0001006425882224;8.0187317507807e-05;3.580208067433e-05;3.9442344132112e-05;-0.00091001228429377;-0.00084371637785807;-0.00096067145932466;-0.00071390304947272;-0.00018274248577654;-2.9788281608489e-05;-2.4581169782323e-05;-6.3743369537406e-05;0.00023142821737565;0.00017383744125254;-0.00026883359532803;-0.00022026931401342;-0.00012040390720358;-0.00010567132994765;0.00023129124019761;-0.0021958609577268;0.00033106564660557;0.0018233597511426;0.0017095740186051;0.00043815647950396;0.00013875668810215;0.00032786733936518;0.0002687243395485;0.00047144253039733;0.00035053194733337;-9.584215877112e-05;-6.1640268540941e-05;0.0001217434546561;0.00010465653758729;4.2486302845646e-05;4.3260497477604e-05;-0.0001360306632705;-0.00025668775197119;2.2332735170494e-05;-0.00010790228407132;0.00049580587074161;0.00047818632447161;-6.4794898207765e-05;-2.6212033844786e-05;5.9095673350384e-05;8.3815037214663e-05;3.122052874005e-07;-5.0192440539831e-05;-0.00021456216927618;-0.00023891071032267;-4.2797968490049e-05;0.0038125119172037;0.00049337709788233;-0.00065417040605098;-0.00039816103526391;-0.0019093893934041;-0.0019599043298513;9.3308977966444e-07;7.9303586971946e-05;0.0001685311581241;0.00023601458815392;-9.2827140178997e-05;-9.6152805781458e-05;0.00011162750888616;0.00012110258830944;4.8341153160436e-05;-2.5517634639982e-05;0.00017810215649661;0.00010864566866076;-0.00029713861295022;0.0012090423842892;-0.00034121386124752;0.00018527850625105;9.9753837275784e-05;-0.0001478198391851;-0.00012248476559762;0.00011735862790374;3.1343697628472e-05;0.00027595841675065;3.130604090984e-05;0.00028503706562333;-0.00038437786861323;-0.00087891786824912;9.9155571660958e-05;0.00031081290217116;0.00031900985050015;0.00077601335942745;-0.0005497855017893;-2.163796352761e-06;-0.00062676967354491;9.3385839136317e-05;-0.00064597459277138;5.3936793847242e-05;-2.7903879527003e-05;-6.1731421737932e-05;-0.00011068256571889;3.1050403777044e-05;6.9225119659677e-05;0.00015580536273774;-0.00037056879955344;-0.00024750374723226;-0.0011884002014995;-0.00034962594509125;0.00010293286322849;1.6817735740915e-05;1.0683546861401e-05;-8.9958462922368e-05;-7.3102455644403e-05;1.3549272352975e-06;-0.00016049355326686;9.1803805844393e-05;-0.00024317565839738;-0.00057573348749429;-0.0013187311124057;4.0045859350357e-05;0.00025280774571002;0.0019779382273555;0.00082659162580967;5.3380070312414e-05;2.1342106265365e-05;0.00032782595371827;5.5182648793561e-05;0.00049714517081156;4.5928944018669e-05;4.0477434595232e-06;-6.3257051806431e-05;9.8640688520391e-05;-4.1768067603698e-05;0.00012473977403715;0.00056588917504996;-0.00062716915272176;0.00047899706987664;-0.00037031405372545;4.4333854020806e-05;1.561084172863e-05;-2.8568689231179e-05;3.8665199099341e-05;-0.00010224628204014;0.00026496441569179;0.00014680362073705;0.00013045444211457;7.2882605309132e-05;-9.2057525762357e-05;-0.00045223490451463;-0.00014684660709463;7.3033566877712e-05;-0.00070992071414366;0.0016777964774519;-0.00010215189831797;-0.00019550633442122;-0.00027308095013723;-0.00025305189774372;-0.00020921711984556;0.00011318543693051;3.9717288018437e-05;-0.00015305585111491;-6.1348582676146e-05;3.1464907806367e-05;-1.3465178199112e-05;4.9849015340442e-05;9.107850928558e-06;-9.4992628874024e-06;-0.00023176438116934;0.00093832769198343;-0.00020157247490715;0.00028129451675341;9.9963217508048e-05;-0.00022643931151833;-9.3361995823216e-06;-0.00028913936694153;-1.3090977518004e-05;-0.00016429273819085;-3.1596271583112e-05;0.00032728505902924;3.0317292839754e-05;0.00013725165626965;0.00019926358072553;0.00014614856627304;-0.00057790026767179;0.00024120246234816;-0.00076174415880814;2.2322854420054e-05;0.00040431492379867;0.0001398576569045;-0.0005770162679255;5.6841340665414e-06;0.00012228729610797;-1.2996289115108e-05;-3.4624641557457e-05;6.9685112976003e-05;-1.0183613085246e-05;0.00023277843138203;0.00020354123262223;-0.00017774841398932;-0.0014728230889887;-0.00014700599422213;-7.4683011916932e-05;1.0064647540275e-05;4.0094666474033e-05;-0.00011065031139879;-0.00029127128073014;5.0106769776903e-05;-0.00024458265397698;3.8637303077849e-05;-0.00018747513240669;-0.00076723238453269;-0.00092028983635828;-8.2754515460692e-05;0.00033786371932365;0.0013504069065675;0.00043080758769065;0.00053285993635654;-5.9403384511825e-05;0.00049002445302904;3.006131555594e-05;0.00056871911510825;4.1725310438778e-05;0.00012279763177503;-5.369651626097e-05;4.962593811797e-05;1.7488366211182e-05;5.9630212490447e-05;0.00037837494164705;-0.00021122884936631;-4.7044672101038e-05;0.00074769178172573;-0.00027175000286661;0.00020575264352374;6.3378181948792e-05;-9.9296725238673e-05;-0.00013915893214289;0.00018647412071005;6.2031140259933e-05;0.00032471606391482;5.2290062740212e-05;0.00015195133164525;-0.00056525232503191;-0.00062444893410429;0.00018573795387056;-7.1387250500266e-05;0.0011879798257723;0.000512698024977;-0.0007173540070653;-0.00010259028931614;-0.00071679725078866;1.3366522580327e-05;-0.00042104796739295;6.2334416725207e-05;-7.3509858339094e-05;-6.3615443650633e-05;-8.7413143774029e-05;-4.4238116970519e-05;9.6841256890912e-05;-1.9691116904141e-05;-0.00012486045307014;-0.00014799660129938;0.00055928813526407;-0.00011708501551766;0.00025532324798405;9.2665686679538e-05;-0.00023208277707454;3.615639070631e-05;-0.00047338203876279;-6.3822926676949e-06;-0.00038321563624777;-4.8734171286924e-05;0.00031208986183628;0.00015429478662554;0.0003954099083785;0.00018259037460666;5.3559539082926e-05;-0.00071812089299783;3.1307721656049e-05;-0.00062636088114232;-3.4104712085536e-06;0.00092530203983188;0.00012006798351649;-0.0004467170801945;-1.575990972924e-05;0.00018624278891366;-6.5968157514362e-07;7.5574266702461e-06;8.9698332885746e-05;-5.389538637246e-05;0.00023116424563341;0.00045374949695542;-0.00016307237092406;-0.0015048417262733;-5.9403279010439e-05;-0.00013853386917617;4.9543295972398e-06;5.0697963160928e-05;-0.00011354875459801;-0.00035192634095438;6.0013735492248e-05;-0.00026095224893652;1.2526320460893e-05;-0.00016317109111696;-0.0008140251156874;-0.00072530301986262;-0.00011912801710423;0.00039222338818945;0.0010266563622281;0.00025144044775516;0.00068211235338822;-7.585009734612e-05;0.00049845676403493;2.8445618227124e-05;0.00057746435049921;3.7305573641788e-05;0.000161024989211;-4.4056963815819e-05;2.9774131689919e-05;3.546429798007e-05;3.8306261558319e-05;0.00031538822804578;-2.6106661607628e-05;-0.00020360141934361;0.0010711582144722;-0.00034932358539663;0.00026627437910065;8.9150526036974e-05;-0.00014436972560361;-0.00014562233991455;0.00010267389006913;3.2092593755806e-05;0.00035656994441524;3.8637917896267e-05;0.0002291649725521;-0.00059608300216496;-0.00065103528322652;0.00023307514493354;0.00011379119678168;0.00093394564464688;0.00063320994377136;-0.00090079812798649;-4.9099235184258e-05;-0.00080127752153203;8.7715037807357e-05;-0.00057045673020184;6.673923053313e-05;-1.8277718481841e-05;-5.9634388890117e-05;-0.00012767159205396;-0.00012687779963017;6.0526701417984e-05;0.0002028651360888;0.00010546832345426;-0.00078545598080382;0.00012806194717996;-0.00032677798299119;0.00010926971299341;0.000263770140009;-9.8339354735799e-05;0.00063303473871201;-6.1396618548315e-05;0.00047291157534346;3.4169599530287e-05;-0.00035616749664769;5.4600739531452e-05;-0.00037334917578846;-0.00068873603595421;-0.00023661757586524;0.0011218747822568;1.6960859284154e-05;0.0008106604218483;7.8932702308521e-05;-0.0012389637995511;-3.6560977605404e-05;0.00060380232753232;-0.00012838558177464;-0.00021919327264186;2.2421088942792e-05;-3.2665757316863e-05;-9.8434566098149e-06;2.0791521819774e-05;5.3811927500647e-05;0.00026967146550305;0.0002648388617672;-0.0019335149554536;-0.00010914185986621;-0.00016846094513312;-4.5789980504196e-05;3.1425948691322e-05;2.2635167624685e-05;-0.00052333372877911;-8.3534920122474e-05;-0.00042673645657487;8.6316642409656e-05;-0.00014421217201743;9.7123047453351e-06;-0.00083833030657843;-0.00085567770292982;-0.00018629894475453;0.0012947482755408;0.00034580321516842;0.00089727569138631;0.00027993501862511;0.00095804018201306;-0.00011903075210284;0.00067098211729899;-7.3435933245491e-07;0.00019507299293764;2.7397718440625e-05;5.7643355830805e-05;-5.1305254601175e-05;2.5509147235425e-05;2.6680696464609e-05;0.00013361177116167;0.00022807366622146;0.0019945132080466;-0.00030793089536019;0.00041712407255545;-0.00047126700519584;-0.00019657988741528;0.00011746217205655;0.00022663876006845;-0.00011585403990466;0.00063671742100269;-1.5771332982695e-05;0.00033584667835385;4.1043025703402e-05;-0.00050780415767804;-0.0005717987078242;0.00032085838029161;0.00053823157213628;0.00017723848577589;-0.0013565159169957;0.00078143057180569;-0.0014012194005772;9.8018253993359e-06;-0.00098759855609387;0.00014991743955761;-5.2337323722895e-05;6.6033273469657e-05;-0.00019063186482526;-5.1422932301648e-05;1.4800662938796e-05;-5.5515345593449e-05;-0.00032761361217126;-0.00031079302425496;-0.00063887663418427;0.00025781692238525;-0.00013057545584161;0.00031716679222882;9.5501396572217e-05;-8.4225059254095e-05;7.4949755799025e-05;0.00013357949501369;-0.00021645608649123;-6.7877233959734e-05;-0.00018269145220984;-4.1007097024703e-05;0.00071980810025707;0.00093696056865156;-3.2745952921687e-05;-0.00064026081236079;-0.00031867760117166;0.00029771309345961;-0.00075746374204755;0.00045889074681327;6.9687994255219e-05;0.00041694755782373;-6.3501072872896e-05;-4.2914547520922e-05;-5.6467888498446e-05;9.7178810392506e-05;7.6660755439661e-05;-1.3312722330738e-05;4.5745011448162e-05;-3.3673022699077e-05;-2.8636555725825e-05;-0.0011235163547099;-0.00019200090900995;-8.5667510575149e-05;-0.00024587288498878;6.1648031987716e-05;-5.1843189794454e-06;-9.9453667644411e-05;-3.6409241147339e-05;-0.00011388972052373;-2.2495412849821e-05;-0.00020306125225034;7.8679557191208e-05;-0.00036307290429249;-0.0012048196513206;-5.5735610658303e-05;0.0013885973021388;0.00030000778497197;0.00041990837780759;0.00067070248769596;0.00017818668857217;6.4467290940229e-05;0.00052181381033733;2.3944028725964e-05;4.3597152398434e-05;2.5335699319839e-05;4.2647538066376e-05;-3.8479007343994e-05;0.00017117982497439;-2.9201062716311e-05;-0.00080779899144545;0.0004199149843771;-0.00087793316924945;0.00024572052643634;-9.7531637948123e-06;-0.00010483747610124;5.5785258155083e-05;-1.1506093869684e-05;0.00018708396237344;-8.3522951172199e-05;9.1132205852773e-05;0.00011510284093674;-0.00017047011351679;9.6599185781088e-05;-0.00056679476983845;-0.00092107872478664;-1.9782803065027e-05;0.0023801729548723;-0.00037944421637803;0.00010513826418901;0.00035937974462286;-0.00010528309212532;-0.0001754336990416;0.00030877717654221;-0.00015311104652938;-0.0001245062740054;3.1905343348626e-05;4.3546653614612e-05;-7.0981332100928e-05;-5.6444569054293e-05;2.7199006581213e-05;0.00088552996749058;-0.00081639911513776;0.0011454101186246;-0.00094937556423247;4.91438768222e-05;-2.2251864720602e-05;-3.9743583329255e-05;4.4186581362737e-05;-0.00016159981896635;0.00019352546951268;0.0001433272700524;-0.00011996705870843;0.00017012064927258;-0.00015952682588249;0.00010105744149769;0.00018051198276225;-1.9422515833867e-05;-0.0029321447946131;0.0025646472349763;4.0127684769686e-05;-0.00013248148025014;-0.00011823629029095;5.1159237045795e-05;-0.0004395678115543;0.00037877963040955;6.9069159508217e-05;-6.7976572609041e-05;-0.00011506370356074;0.00010640610707924;-1.3003254935029e-05;1.2557781701616e-05;-0.000989900669083;-0.00093460583593696;-0.00094663997879252;-0.00071705196751282;-0.00027293930179439;-0.00015953464026097;2.7718311912395e-07;-4.0834165702108e-05;0.00025401150924154;0.00017604965250939;-0.00030163995688781;-0.00025550642749295;-9.3735470727552e-05;-6.3384737586603e-05;0.00078361184569076;-0.0023343649227172;0.00018389729666524;0.0014614838873968;0.0013305717147887;0.00074116507312283;0.00053354015108198;0.00041611021151766;0.000378193333745;0.00045796085032634;0.00032995367655531;-8.6225540144369e-05;-4.8963473091135e-05;0.00010977146303048;8.9174638560507e-05;7.0268630224746e-05;5.9066733228974e-05;-0.00057371018920094;-0.00057368312263861;-0.00040105968946591;-0.0003784105356317;0.00034343340666965;0.00035038508940488;-3.6971705412725e-05;-1.7539305190439e-05;0.0001337795984;0.00013937252515461;-6.0627637139987e-05;-8.7729742517695e-05;-0.00023609264462721;-0.00023627516929992;-3.5272925742902e-05;0.0021855540107936;0.00038907863199711;0.00032366524101235;0.00032253001700155;-0.0012692571617663;-0.0013406008947641;0.00015092563990038;0.00018179096514359;0.0002902330015786;0.00028771749930456;-0.0001294056273764;-0.00012475904077291;0.00013637487427332;0.00013721936556976;-5.3104507969692e-05;2.8823505999753e-05;0.00091348425485194;-0.00079951056977734;0.0011437226785347;-0.00095320818945765;3.7608580896631e-05;-3.2947657018667e-05;-3.7946861993987e-05;4.4984932173975e-05;-0.00017232698155567;0.00018953064864036;0.00015603929932695;-0.00010895993909799;0.00017671492241789;-0.00015309515583795;3.3789900044212e-05;7.1568414568901e-05;-2.6886764317169e-05;-0.0028838485013694;0.0026366852689534;8.2236663729418e-05;-9.5501462055836e-05;-0.00013702969590668;3.1123072403716e-05;-0.00044796356814913;0.00037159651401453;7.3033988883253e-05;-6.6111628257204e-05;-0.00012266558769625;0.00010016428132076;-1.1255440767854e-05;1.1297714081593e-05;-0.00099242373835295;-0.00094264902872965;-0.00092750892508775;-0.00075094471685588;-0.00028397393180057;-0.00015090972010512;-1.2531578477137e-06;-3.9439011743525e-05;0.00025488570099697;0.00017640937585384;-0.00030147409415804;-0.00025916413869709;-8.4369654359762e-05;-7.4550283898134e-05;0.00078391673741862;-0.0023518912494183;0.00018562650075182;0.0014332099817693;0.0013842433691025;0.00076337374048308;0.00051978859119117;0.00041793077252805;0.00038252418744378;0.00044623695430346;0.00034768777550198;-8.5947518527973e-05;-4.9473132094136e-05;0.00010705646127462;9.3039889179636e-05;6.2592844187748e-05;6.7409200710244e-05;-0.00052487448556349;-0.00062454264843836;-0.00034266954753548;-0.00043822935549542;0.00034812433295883;0.00034899287857115;-4.1303439502371e-05;-1.3100374417263e-05;0.00012689875438809;0.00014797825133428;-5.3458014008356e-05;-9.408039477421e-05;-0.00022583267127629;-0.00024905952159315;-3.9545819163322e-05;0.0021950437221676;0.00039114442188293;0.00021825642033946;0.00043454483966343;-0.0012809582985938;-0.0013422784395516;0.00013529091665987;0.00019541040819604;0.00026608648477122;0.000313252909109;-0.00012515916023403;-0.00013081447104923;0.00013146306446288;0.0001434172882;-4.7668345359853e-05;0.00011031564645236;-3.0084313493717e-06;-0.00013527419650927;-0.0001137999133789;0.00026137061649933;-6.5614600316621e-05;0.00021712374291383;8.9795394160319e-05;-0.00022558927594218;4.2807139834622e-05;-0.00057041860418394;1.0497507901164e-05;-0.00049227214185521;-5.8774508943316e-05;0.00029486024868675;0.00012904100003652;0.00044273262028582;0.00014345689851325;5.0123067921959e-05;-0.00070026848698035;-5.8920224546455e-05;-0.00045618077274412;-3.0911018257029e-05;0.001180172432214;0.00010499731433811;-0.0003452438977547;-2.2607782739215e-05;0.00022196504869498;7.3212839879488e-07;2.6561427148408e-05;0.00011577770783333;-0.00010793054389069;0.00020611779473256;0.00069600925780833;-0.00017996020324063;-0.0014536756789312;-5.488110218721e-06;-0.00018868788902182;-5.7651905081002e-06;7.3234943556599e-05;-0.00012144490756327;-0.00035198204568587;5.6734261306701e-05;-0.00022261583944783;-2.5599092623452e-06;-0.00016728490300011;-0.00085225939983502;-0.00060433545149863;-0.00013989300350659;0.00046453706454486;0.0007645130972378;0.0001472409494454;0.00076158047886565;-6.5089443523902e-05;0.00036952720256522;3.4736069210339e-05;0.00059256021631882;3.6966190236853e-05;0.00017477678193245;-3.5930177546106e-05;1.0590737474558e-05;4.3358475522837e-05;4.3309857574059e-05;0.00031571302679367;2.8410368031473e-05;-0.00026467544375919;0.00094359845388681;-0.00037962608621456;0.0002571391814854;9.5613773737568e-05;-0.00014347983233165;-0.00015418328985106;1.151162723545e-05;3.2523359550396e-05;0.00033070071367547;3.947714867536e-05;0.0002240535832243;-0.00067973945988342;-0.00079257355537266;0.00021493670647033;0.00021275403560139;0.001023936085403;0.00072067836299539;-0.00082881114212796;-4.2723873775685e-05;-0.00072241789894179;0.00010582704271656;-0.00052845641039312;6.9802874349989e-05;2.5742074285517e-05;-6.4522915636189e-05;-0.0001378769375151;5.2947223593947e-05;-9.4264949439093e-05;-0.00070648436667398;-0.00044417506433092;-0.00026670985971577;0.00030369238811545;-9.3857495812699e-05;0.00028731755446643;7.7120930654928e-05;-8.2878184912261e-05;0.0002478270616848;0.00018217657634523;-0.00015879517013673;-0.00010045379167423;-0.00013510187272914;-2.7771457098424e-05;0.0011090449988842;0.0008906886796467;-4.923201231577e-06;-0.00071452412521467;-0.00043885433115065;0.00016728264745325;-0.00070173991844058;0.00036302176886238;0.00011703457857948;0.00024737339117564;-7.71052800701e-05;-0.00011911418550881;-7.029249536572e-05;0.00010220736294286;8.9310589828528e-05;-0.00013051743735559;7.37825394026e-05;0.00045146202319302;-0.00017894209304359;-0.00088753900490701;-0.0001744130422594;-0.00016770215006545;-0.00015644780069124;9.6093637694139e-05;-2.7757378120441e-05;-0.00011873360926984;-1.0689721420931e-05;-1.6379539374611e-05;-6.5288113546558e-05;-0.0001796570722945;6.1078899307176e-05;-0.00018515159899835;-0.00088328483980149;-8.0763624282554e-05;0.00064873992232606;0.00031476831645705;0.00052145152585581;0.00046913235564716;-0.00010098172788275;0.00013054256851319;0.0004899994819425;2.5807898055064e-05;9.4029950560071e-05;1.7415157344658e-05;-1.8848886611522e-05;-1.1206610906811e-05;0.00018282544624526;-3.5728496641241e-06;-0.00096723751630634;0.00035931298043579;-0.0013337022392079;9.4475180958398e-05;-5.2961284382036e-05;-0.00025938707403839;7.9927121987566e-05;2.4749163003435e-06;0.00013017273158766;-9.9213088105898e-05;4.6152559662005e-05;0.00010695544915507;-0.00023594955564477;0.00013433056301437;-0.00070882210275158;-0.0016942265210673;-9.4049595645629e-05;0.0031305511947721;-0.00015492420061491;0.00036711536813527;0.00082218647003174;1.5989278836059e-05;-0.00012211783905514;0.00048674317076802;-0.00013469890109263;-9.7306656243745e-05;3.8714719266864e-05;5.2306011639303e-05;-9.2063848569524e-05;-1.4596244909626e-05;-1.0488103725947e-05;0.00063659338047728;-0.00062451267149299;0.0011162123410031;-0.00087698368588462;-4.7427027311642e-05;9.9566990684252e-05;-3.9113059756346e-05;3.7367270124378e-05;-0.00011909172462765;0.00016229898028541;0.00011546067253221;-9.2338654212654e-05;0.00021581635519397;-0.00020322654745542;0.00013380264863372;0.00021274303435348;-4.5725328163826e-06;-0.002764385426417;0.0023719139862806;0.00021439214469865;-0.00037446856731549;-3.4669687011046e-05;-1.6939105989877e-05;-0.00047044645179994;0.00038705315091647;5.0490973080741e-05;-5.501534906216e-05;-0.00011376388283679;0.00010832677799044;-7.2185110184364e-05;-2.283228423039e-05;-0.00096387113444507;-0.0009565755026415;-0.00068052031565458;-0.00053625000873581;-0.00029568182071671;-0.00020186870824546;9.7111324066645e-06;-3.0285404136521e-05;0.00027445575688034;0.00018093863036484;-0.00030022830469534;-0.00027038471307606;-4.334751793067e-05;-1.7915264834301e-05;0.0013834617566317;-0.0019458396127447;8.7447428086307e-05;0.00075008126441389;0.00071850745007396;0.00079192139673978;0.00063037272775546;0.00042300729546696;0.00042780555668287;0.0003514313721098;0.00025337407714687;-7.2042035753839e-05;-3.5564909921959e-05;8.8668472017162e-05;7.4208350270055e-05;7.4597308412194e-05;6.7823115387e-05;-0.00095086789224297;-0.00089483190095052;-0.00074200530070812;-0.00065477140014991;0.00017498222587164;0.00017713307170197;-8.4091916505713e-06;-4.8774239758131e-08;0.00020027997379657;0.00019041425548494;-0.00012309673184063;-0.00013506646791939;-0.00023240517475642;-0.00021594732243102;9.1447545855772e-05;0.00061671552248299;0.0002453253546264;0.0010723867453635;0.00095280853565782;-0.0005893703782931;-0.00063111400231719;0.00030138486181386;0.00030566842178814;0.00037412540405057;0.00033662116038613;-0.00015162305498961;-0.00014278951857705;0.00014798526535742;0.0001426483358955;-1.1845540029753e-05;-7.7541035352624e-06;0.00067798828240484;-0.00059571157908067;0.0011041779071093;-0.00089239893713966;-5.8471250667935e-05;8.6565654783044e-05;-3.7414974940475e-05;3.9553906390211e-05;-0.00013456880697049;0.00015347347653005;0.00012842936848756;-8.0524856457487e-05;0.00022074868320487;-0.00019898625032511;4.502785668592e-05;0.00010369939991506;-1.2210537533974e-05;-0.0026999074034393;0.0024441783316433;0.000254133308772;-0.00033126966445707;-5.6482716900064e-05;-3.6758516216651e-05;-0.00047395343426615;0.00038550575845875;5.6725199101493e-05;-5.1361279474804e-05;-0.00012172543210909;0.00010113813914359;-6.7694832978304e-05;-2.5730099878274e-05;-0.00097652844851837;-0.00095207337290049;-0.00066013907780871;-0.00056640879483894;-0.0003008394560311;-0.00019736643298529;7.0697983574064e-06;-2.712652531045e-05;0.00027644771034829;0.0001790307869669;-0.00030063732992858;-0.00027077354025096;-3.4550233976915e-05;-2.8010636015097e-05;0.0013779604341835;-0.0019588116556406;8.6408435890917e-05;0.00073513656388968;0.00075590697815642;0.00080410717055202;0.00062694743974134;0.00042860792018473;0.00042725671664812;0.0003371836792212;0.00026929232990369;-7.3327282734681e-05;-3.4929231333081e-05;8.7411695858464e-05;7.6179341704119e-05;6.6163644078188e-05;7.6134972914588e-05;-0.00089077709708363;-0.00094549258938059;-0.0006713182083331;-0.00071785872569308;0.00017555394151714;0.00018132176774088;-1.3058778677077e-05;4.1018752199307e-06;0.00019177641661372;0.00019850541139022;-0.00011505147267599;-0.00014314972213469;-0.00021798277157359;-0.00023192574735731;8.8492684881203e-05;0.00063289789250121;0.00024737074272707;0.00094019871903583;0.0010692147770897;-0.00059417798183858;-0.00064248486887664;0.00028337791445665;0.0003214874304831;0.00034432060783729;0.00036520627327263;-0.00014597708650399;-0.00014868189464323;0.00014121813001111;0.00015059368161019;9.9587727163453e-05;-5.7268822274636e-05;0.00044876275933348;0.00055478437570855;-0.00027748927823268;0.00039685709634796;-0.00027459711418487;0.00011192537931493;7.8201905125752e-05;-8.4819388575852e-05;-0.00021740022930317;-0.00013456567830872;9.9180688266642e-05;0.00017504929564893;3.2311370887328e-05;0.00014866662968416;-0.00096826435765252;-0.0007833662093617;3.3455438824603e-05;0.00035594246583059;0.00063082575798035;0.00065284193260595;-0.00026713745319284;-0.00010613337508403;-0.00041061188676395;6.9838868512306e-05;-0.00027782318647951;8.2784739788622e-05;8.5348110587802e-05;-9.0098037617281e-05;-0.00010678957187338;6.5179738157894e-05;-8.4947780123912e-05;-0.00017647094500717;0.0002206553472206;-0.00020928938465659;-0.0009882899466902;-0.00018231722060591;-0.00013094616588205;-1.7001344531309e-05;8.8743683591019e-05;-9.2696154752048e-06;-0.00012978828453925;-5.8894638641505e-05;-5.9122863603989e-05;6.4872067014221e-05;-0.00019267258176114;-0.00018393513164483;-0.0010408686939627;-0.00010402170300949;0.00033219449687749;0.00087802449706942;0.00056395318824798;0.00055196054745466;0.0001409221731592;7.4788957135752e-05;2.8033337002853e-05;0.00047509747673757;1.2467062333599e-05;8.5952953668311e-05;-1.7822063455242e-05;2.812886123138e-06;-6.5364529291401e-06;0.00016044425137807;0.00041739575681277;-0.00097375042969361;0.00015562385669909;-0.0011731067206711;-0.00021913055388723;-1.0519313036639e-05;-6.2540124190491e-07;6.8965317041148e-05;-0.00012060943117831;0.00020783161744475;0.00012135808356106;8.5701003627037e-06;0.0001266553736059;-0.00023893668549135;-0.00064338953234255;-0.0014534718357027;-5.2339953981573e-05;-0.00025601792731322;0.0028882827609777;0.00068981264485046;0.00022797874407843;-0.00015088732470758;4.0278955566464e-05;-0.00015047365741339;0.00043424859177321;4.626696681953e-05;-0.00014069731696509;-9.2175570898689e-05;8.8955152023118e-05;7.3571238317527e-05;-3.7712063203799e-05;0.00033747631823644;0.00039743285742588;-0.00025656635989435;0.00050866149831563;-0.00025636760983616;0.00012643579975702;7.5510120950639e-05;-9.4316594186239e-05;-0.00016957588377409;-9.3422313511837e-05;7.0043068262748e-05;0.00015732758038212;2.4456938263029e-05;0.00016301737923641;-0.00072088395245373;-0.0006508378428407;5.2217525080778e-05;0.00030542293097824;0.00044126791181043;0.00058063794858754;-0.00032073157490231;-7.1555317845196e-05;-0.00035917907371186;7.5357405876275e-05;-0.0003218115598429;6.6765380324796e-05;6.3178478740156e-05;-7.1697366365697e-05;-9.4122886366677e-05;5.8397974498803e-05;-4.7539553634124e-05;-8.16272731754e-05;0.00010768604988698;-0.00020500789105427;-0.0010220194235444;-0.00018201769853476;-0.00010889110853896;-8.9001614469453e-06;7.7501703344751e-05;-3.1548006518278e-05;-0.00012718835205305;-2.9530081519624e-05;-8.3357248513494e-05;6.074784687371e-05;-0.00019012048142031;-0.00029245583573356;-0.0010532859014347;-0.000103497193777;0.00032940719393082;0.0010345389600843;0.00056528963614255;0.00052077457075939;9.3458707851823e-05;0.00014805493992753;2.5162706151605e-05;0.00046594438026659;1.7862557797343e-05;7.1461319748778e-05;-2.7678695914801e-05;1.8376480511506e-05;-1.3683486940863e-05;0.00015012547373772;0.0004242907743901;-0.00084275077097118;0.00015620731574018;-0.00092819443671033;-0.0001910077262437;5.8840191741183e-06;2.1686651052732e-06;5.2944160415791e-05;-0.00011531521886354;0.000206264317967;0.00011844918481074;3.3687661925796e-05;0.00011078927491326;-0.00019427343795542;-0.00059394672280177;-0.0012217513285577;-3.5061286325799e-05;-0.00025781503063627;0.0024883910082281;0.00058706378331408;0.0001438914478058;-0.00016163958935067;-1.9608174625318e-05;-0.00013576085621025;0.00033361802343279;4.5654000132345e-05;-0.00013818939623889;-8.5471969214268e-05;7.5040290539619e-05;-3.010181535501e-05;8.7176500528585e-05;2.7197391318623e-05;-6.0980852140347e-05;-9.8190641438123e-05;5.2883031457895e-05;-3.0199897082639e-05;0.00015587209782097;7.5737101724371e-05;-0.00018426285532769;2.44830698648e-05;-0.00053030496928841;2.4003771613934e-05;-0.00046080196625553;-5.6483517255401e-05;0.00023847895499784;2.7173822672921e-05;0.00035955544444732;9.2665068223141e-05;8.1460755609442e-05;-0.00055662170052528;-8.0617108324077e-05;-0.00027256962493993;-4.5280023186933e-05;0.0010916576720774;8.5040381236468e-05;-0.00023260753368959;-1.8147673472413e-05;0.00020785802917089;-2.1135224415048e-06;2.8040640245308e-05;0.00012158004392404;-0.00014101510168985;0.00014687166549265;0.0008018861990422;-0.00017833786841948;-0.0011363985249773;2.4794062483124e-05;-0.00018760810780805;-1.4701382497151e-05;8.0535770393908e-05;-0.00011120744602522;-0.00028248521266505;3.8106958527351e-05;-0.00013197340012994;-1.1262899533904e-05;-0.00014817374176346;-0.00075080076931044;-0.00041542237158865;-0.00012117400910938;0.000453930842923;0.00043281752732582;6.0461792600108e-05;0.00065835792338476;-3.5320648748893e-05;0.00015083742619026;4.0722094126977e-05;0.00050210719928145;3.3203410566784e-05;0.0001540525117889;-2.360510006838e-05;-1.0778953765112e-05;4.3429143261164e-05;4.3682543036994e-05;0.00028463007765822;3.9760361687513e-05;-0.00024870652123354;0.00059275981038809;-0.00033427102607675;0.00019041866471525;8.1085920101032e-05;-0.000107943022158;-0.00014065059076529;-5.8880261349259e-05;3.6216941225575e-05;0.00025375376571901;3.8484042306663e-05;0.00016627980221529;-0.00066395930480212;-0.00082609138917178;0.00015058826829772;0.00023952330229804;0.001041715615429;0.00067635293817148;-0.00057934422511607;-4.220184564474e-05;-0.00052899291040376;8.8485139713157e-05;-0.00036953712697141;6.1991886468604e-05;5.3352192480816e-05;-6.1305210692808e-05;-0.0001206270098919;7.3985254857689e-05;-9.133834100794e-05;-0.00079428474418819;-0.00032105096033774;-2.0018282157253e-05;0.0002606671769172;-4.2177587602055e-05;0.00012628734111786;4.8737925681053e-05;-5.3264688176569e-05;0.00031255613430403;0.0001373846171191;-4.5487951865653e-05;-7.2627604822628e-05;-8.0204496043734e-05;1.5675996110076e-05;0.00092484691413119;0.00036109093343839;-2.7569767553359e-06;-0.00022100603382569;-0.00043288676533848;5.9601250541164e-05;-0.00029823370277882;0.00013438900350593;9.0175759396516e-05;8.5688727267552e-05;-8.643016917631e-05;-0.00014801992801949;-4.7489811549895e-05;7.4973861046601e-05;5.1217153668404e-05;-0.00018579361494631;7.7076860179659e-05;0.00080168043496087;-0.00017139907868113;-0.00028974356246181;-8.9761415438261e-05;-0.00015041428559925;-1.1378509725546e-06;8.3752616774291e-05;-3.6522571463138e-05;-0.00011034523777198;-3.3372164125467e-06;9.9321558082011e-05;-6.4180043409579e-05;-8.7863110820763e-05;1.3851511539542e-05;-8.4246588812675e-05;-0.00013629901513923;-4.6284338168334e-05;-0.00028100327472202;0.00021170913532842;0.0003176117897965;4.2790074076038e-05;-0.00036118747084402;0.0001093966056942;0.00025694948271848;2.3407672415487e-05;0.00011138152331114;9.9427816167008e-06;-7.364710472757e-05;1.4293753338279e-05;0.00010700523125706;2.2584699763684e-05;-0.00060859206132591;0.00019462451746222;-0.0010372498072684;-7.2195354732685e-05;-6.3775994931348e-05;-0.00028925371589139;6.2961444200482e-05;1.743832763168e-05;2.5301373170805e-05;-8.3017454016954e-05;3.8690908695571e-05;6.1565915530082e-05;-0.00016617809887975;0.00011131250357721;-0.00057613849639893;-0.0016272381180897;-0.00011599375284277;0.0023865734692663;9.897249401547e-05;0.00040425968472846;0.00088095827959478;8.3619761426235e-06;-3.9236379961949e-05;0.00037310426705517;-6.2931590946391e-05;-2.4581040634075e-05;3.4775701351464e-05;1.3971662156109e-05;-7.6080701546744e-05;0.00012470722140279;-0.00014973992074374;-0.0012845332967117;-0.00052251975284889;-1.2497347597673e-05;0.00041467792470939;-6.0919966927031e-05;0.00020441695232876;7.1228801971301e-05;-8.2753009337466e-05;0.00047935859765857;0.00022396005806513;-8.5678722825833e-05;-0.00011826697300421;-0.00011688960512402;2.1511648810701e-05;0.0015059654833749;0.00060894369380549;8.058518830012e-08;-0.00040181042277254;-0.00069232360692695;8.1434540334158e-05;-0.00049145595403388;0.00025423394981772;0.00014573897351511;0.00012005578901153;-0.00013400042371359;-0.00022802558669355;-7.7511198469438e-05;0.00011872515460709;8.3886370703112e-05;-0.00029312967672013;0.00011665063357214;0.001253945287317;-0.00028826916241087;-0.00041311094537377;-0.00013098474300932;-0.000230714736972;-4.7488697418885e-06;0.00012948860239703;-5.8488803915679e-05;-0.00016318632697221;2.2887134036864e-06;0.00016236711235251;-0.00010767022467917;-0.00013423481141217;2.4169010430342e-05;-8.3242899563629e-05;-0.00019079131016042;-6.4656996983103e-05;-0.00048519988195039;0.00030817900551483;0.00047430116683245;6.3219500589184e-05;-0.00058404635637999;0.00017981287965085;0.00038915508775972;3.5256791306892e-05;0.00017095172370318;1.4169151654642e-05;-0.00011614595132414;2.4667029720149e-05;0.00016165150736924;3.8568367017433e-05;-0.00095906521892175;0.00028817466227338;-0.0016603124095127;-0.00010505966929486;-0.00010651187767508;-0.00044549268204719;0.0001018142720568;2.4605071303085e-05;3.3884840377141e-05;-0.00012742550461553;5.1366376283113e-05;9.3151000328362e-05;-0.00026540664839558;0.00017473648767918;-0.00088552018860355;-0.0025433604605496;-0.00018270881264471;0.0037516849115491;0.00014636552077718;0.00064817437669262;0.0013655824586749;3.0675004381919e-05;-5.3981613746146e-05;0.00060191680677235;-0.00010234403453069;-3.3998578146566e-05;5.3022413339932e-05;2.2995762265055e-05;-0.00011718208406819;0.00012194748705951;-0.00015343420091085;-0.0012725706910715;-0.00057394948089495;-4.628733950085e-05;0.00041839489131235;-6.9610250648111e-05;0.000256564875599;7.1812806709204e-05;-8.8658969616517e-05;0.00044780722237192;0.0002419050433673;-0.00013131706509739;-0.00012985213834327;-0.00011890449241037;2.6606880965119e-06;0.0015956948045641;0.00080330111086369;5.0566300160426e-06;-0.00062178779626265;-0.00068217515945435;9.6733223472256e-05;-0.00063051329925656;0.00035595428198576;0.00015709560830146;0.000143218334415;-0.00012335547944531;-0.00021428261243273;-8.6071260739118e-05;0.00012635889288504;9.8264223197475e-05;-0.00027471309294924;0.00010844426287804;0.0011095808586106;-0.00031709944596514;-0.00054665456991643;-0.00013728243357036;-0.00023059915110935;-5.2724142733496e-05;0.00012948641960975;-5.6592085456941e-05;-0.00015254577738233;1.0735775504145e-05;0.00012506583880167;-0.00011526478920132;-0.0001540488738101;4.168828309048e-05;-3.1466410291614e-05;-0.00038790717371739;-6.9482171966229e-05;-0.00025789919891395;0.00029663246823475;0.00051547848852351;0.00018561439355835;-0.00049898074939847;0.00019591111049522;0.00043858159915544;3.0550247174688e-05;0.0001599815004738;1.3770764780929e-05;-9.7771415312309e-05;1.950951264007e-05;0.00017776644381229;3.2207273761742e-05;-0.0010865052463487;0.00030278551275842;-0.0017671597888693;-5.1302082283655e-05;-0.00010760892473627;-0.00042715630843304;0.00010840567119885;1.7359529010719e-05;7.0068745117169e-05;-0.00012422184227034;3.8353464333341e-05;9.9141070677433e-05;-0.00029023707611486;0.00018004290177487;-0.00087701337179169;-0.0025404619518667;-0.00017521655536257;0.0039488137699664;6.4756808569655e-05;0.00064569368259981;0.0013265579473227;5.9557860367931e-05;-6.4431282225996e-05;0.00064812216442078;-0.00012437597615644;-5.6939916248666e-05;5.052116830484e-05;3.9834438211983e-05;-0.00011735814041458;3.1411567761097e-05;-4.9840316933114e-05;0.00028948934050277;-0.00036293570883572;0.00099205446895212;-0.00074042269261554;-8.3552855357993e-05;0.0001495381584391;-4.4338736188365e-05;3.7547350075329e-05;-5.5607386457268e-05;0.00011171062942594;6.4529056544416e-05;-5.1890732720494e-05;0.0002252056292491;-0.0002101725403918;0.00017303023196291;0.00021749768347945;4.4691360017168e-06;-0.0023287285584956;0.0019417420262471;0.00026615988463163;-0.00045593798859045;7.8912693425082e-05;-9.0613575594034e-05;-0.00045496388338506;0.00035794521681964;1.7957338059205e-05;-3.0925522878533e-05;-8.8346379925497e-05;8.9076362201013e-05;-0.00012863735901192;-5.7992416259367e-05;-0.00083268561866134;-0.00088850513566285;-0.00022728089243174;-0.00019524661183823;-0.0002414714981569;-0.0001691253419267;3.8715488699381e-06;-3.16851765092e-05;0.00028209638549015;0.00018057064153254;-0.00026142148999497;-0.00025722666759975;1.5564633940812e-05;3.0981387681095e-05;0.0018977705622092;-0.0011142381699756;5.3885498346062e-05;-0.00014629730139859;-5.3346819186118e-05;0.00057648977963254;0.00046123002539389;0.00034837287967093;0.00040964607615024;0.00017687007493805;0.00012443536252249;-5.5087239161367e-05;-2.2389771402231e-05;6.2839346355759e-05;5.8013367379317e-05;5.4442105465569e-05;5.8727633586386e-05;-0.0012147128582001;-0.0011130475904793;-0.00092757289530709;-0.0007891419227235;2.1138945157873e-05;1.3999943803356e-05;1.6184107153094e-05;1.4003241631144e-05;0.00025635419297032;0.00022534195159096;-0.00017878638755064;-0.00017691204266157;-0.00020426392438821;-0.00017072199261747;0.00034134319867007;-0.00058908760547638;0.00010127913265023;0.0014737249584869;0.0012555250432342;-3.6886585803586e-06;-1.1245720997977e-05;0.00041951658204198;0.00040437278221361;0.00040443101897836;0.00033747998531908;-0.00015690673899371;-0.00014260919124354;0.00014656866551377;0.0001342641771771;3.3454056392657e-05;-4.6530352847185e-05;0.00035549630410969;-0.00032263246248476;0.00097516155801713;-0.00077041139593348;-9.637835319154e-05;0.00013822423352394;-4.1817806049949e-05;4.0461716707796e-05;-7.7931807027198e-05;9.8894524853677e-05;8.0963880463969e-05;-3.9527512853965e-05;0.00022913851717021;-0.00020978671091143;5.8305111451773e-05;0.00011379214265617;-3.6311730582383e-06;-0.0022711094934493;0.0020325742661953;0.00030904429149814;-0.00041660826536827;4.950919537805e-05;-0.00011283730418654;-0.00045494717778638;0.00036378399818204;2.7532874810277e-05;-2.5532850486343e-05;-9.860961290542e-05;8.1955644418485e-05;-0.00012094876728952;-6.3170104112942e-05;-0.00086509942775592;-0.00087311601964757;-0.00022602504759561;-0.00022534506570082;-0.00024524965556338;-0.00017209703219123;8.3642356685232e-07;-2.6967663870892e-05;0.00028620936791413;0.00017684779595584;-0.0002672384143807;-0.00025485540390946;2.1436320821522e-05;2.2724940208718e-05;0.0018914141692221;-0.0011490505421534;4.9976373702521e-05;-0.00012621533824131;-2.6443814931554e-05;0.00059247156605124;0.00047721707960591;0.00036585150519386;0.00040421620360576;0.00016921191127039;0.00014004689001013;-5.8407847973285e-05;-2.0224340914865e-05;6.4560073951725e-05;5.7433815527475e-05;4.7900863137329e-05;6.7022185248788e-05;-0.001154457568191;-0.0011666432255879;-0.00085589260561392;-0.00086414109682664;1.9417266230448e-05;2.1395529984147e-05;1.1231122698518e-05;1.867969695013e-05;0.0002471954212524;0.00023340359621216;-0.00016935561143328;-0.00018573980196379;-0.00018820678815246;-0.00019085094390903;0.00033049425110221;-0.00057953892974183;0.00010373142868048;0.0013432636624202;0.0013921215431765;-3.4140432489949e-06;-2.6666715712054e-05;0.00040067944792099;0.00042174095869996;0.00037257038638927;0.0003719727974385;-0.00015173001156654;-0.00014902703696862;0.00013910849520471;0.00014373587328009;0.00012547086225823;-9.0373017883394e-05;0.00047032508882694;0.00077451730612665;-0.00028930266853422;0.00019015384896193;-0.00021472835214809;7.2208138590213e-05;6.2336213886738e-05;-5.4141568398336e-05;-0.00023309810785577;-0.0001932873565238;0.00010572888277238;0.00016140981460921;1.8358367015026e-05;9.8776836239267e-05;-0.0011187228374183;-0.000653310213238;1.3694238987227e-05;0.0004251073114574;0.00056125700939447;0.00052833958761767;-0.00016674963990226;-0.00011416157940403;-0.00040126382373273;7.3982606409118e-05;-0.0001581017713761;8.3255297795404e-05;0.00011541232379386;-8.5154824773781e-05;-0.00010793789260788;6.0877046053065e-05;-0.000139592870255;-0.00026466613053344;0.00046470644883811;-0.00011960580013692;-0.00058624567463994;-9.8019780125469e-05;-0.00013492831203621;-3.0856903322274e-05;8.6245629063342e-05;2.6972049454344e-05;-0.00011960665142396;-8.7227068434004e-05;1.9789826183114e-05;4.946070475853e-05;-0.00013223136193119;4.432807691046e-05;-0.00055626680841669;-7.2345057560597e-05;0.00019588008581195;0.00018889959028456;0.00030861815321259;0.00042371905874461;0.00016802649770398;-0.00011595559772104;1.4412224118132e-05;0.00033616891596466;1.480989681113e-06;0.00010176017531194;5.6679809858906e-06;-3.9465419831686e-05;1.615087967366e-05;0.00011870381422341;0.00025981204817072;-0.00088435132056475;6.1119426391087e-05;-0.0011988069163635;-0.00024254788877442;-4.3501862819539e-05;2.528411869207e-06;7.4222894909326e-05;-0.00010020783520304;0.00015554486890323;8.5286788817029e-05;-1.2688466995314e-05;0.00012332366895862;-0.00022934001754038;-0.00054715288570151;-0.0015837907558307;-8.3280858234502e-05;-0.00010457903408678;0.0027441992424428;0.00077645952114835;0.00034483955823816;-6.9459820224438e-05;7.9574572737329e-05;-0.00012161018094048;0.00044951279414818;3.782803833019e-05;-9.9837918241974e-05;-8.1231890362687e-05;7.3281211371068e-05;3.8110159948701e-05;-4.2947031033691e-06;0.00013424341159407;0.00031308815232478;-0.00015503613394685;-0.00011637924035313;-4.6158752411429e-06;5.4493360948982e-05;4.9846534238895e-05;-9.7368036222178e-05;-5.6399418099318e-05;-0.00039327153353952;4.8198577133007e-05;-0.00026375878951512;-5.0129820010625e-05;0.00013214112550486;-0.00035809306427836;0.00013270387717057;2.292093813594e-05;0.00025565319810994;-0.00028331571957096;-3.7557747418759e-05;-4.2312080040574e-05;-6.2668630562257e-05;0.0005828159628436;7.8247976489365e-05;-7.5412492151372e-05;8.8961478468264e-06;0.00016963487723842;-1.5628607798135e-05;-4.7523785724479e-06;0.00011868448927999;-0.00019586078997236;-3.4157901609433e-06;0.00098145531956106;-0.00016090222925413;-0.000412656692788;5.9277677792124e-05;-0.00015117091243155;-3.0984363547759e-05;8.3497310697567e-05;-7.2574592195451e-05;-0.00015875641838647;-1.6381851310143e-05;7.3161405452993e-05;-2.0561394194374e-05;-9.2608184786513e-05;-0.00046246132114902;-1.0411891707918e-05;-5.7109169574687e-05;0.00037331026396714;-0.00026150638586842;-8.7078769865911e-05;0.00035490491427481;4.2605144699337e-05;-0.00030005571898073;5.3607549489243e-05;0.00027206345112063;2.329738708795e-05;0.00012153459829278;4.319510935602e-06;-6.7222506913822e-05;5.2041406888748e-05;2.8712951461785e-05;0.00021046369511168;-3.6992507830291e-06;-0.00018782830738928;-0.00013744234456681;-0.00024448017938994;4.4068357965443e-05;4.4955682824366e-05;-2.223903175036e-05;-0.00011844779510284;-0.0001197227902594;4.2863379349001e-05;0.00012496166164055;4.8051242629299e-05;2.8021926482324e-05;-0.0006090221577324;-0.00096203020075336;1.5049793546495e-05;0.00024884307640605;0.0012166999513283;0.00061088718939573;-5.8914822147926e-05;-2.9708826332353e-05;-0.000217390988837;3.3076150430134e-05;-2.5977014956879e-05;4.7872461436782e-05;7.6321441156324e-05;-5.6959041103255e-05;-7.9027595347725e-05;0.0001544606348034;-0.00015661551151425;-0.0013503881637007;-0.00046563395881094;6.0569422203116e-05;0.00039278605254367;-3.0102475648164e-05;0.00013539014616981;4.9536836741026e-05;-6.4849038608372e-05;0.0004411680274643;0.00020781040075235;-6.9810412242077e-05;-0.00010469787230249;-7.9777040809859e-05;3.5899942304241e-05;0.0014452115865424;0.00041814247379079;1.8543661326476e-06;-0.00022523241932504;-0.0006898493738845;3.4112701541744e-05;-0.00033223110949621;0.00026294458075427;0.00012761418474838;4.4295891711954e-05;-0.0001322718890151;-0.00021285518596414;-6.8465364165604e-05;0.00010328966163797;6.7692948505282e-05;-0.00029716754215769;9.9021395726595e-05;0.0013386229984462;-0.00029114499920979;-2.9086328140693e-05;-6.8148328864481e-05;-0.0001836447045207;4.9757429223973e-05;0.00010863136412809;-6.1063496104907e-05;-0.00013207690790296;1.9402110410738e-05;0.00022661461844109;-0.00011501445260365;-8.1694735854398e-05;7.4504664553388e-06;3.9213708078023e-05;0.00020611393847503;-1.2106138456147e-05;-0.00092966592637822;0.00019348412752151;0.0002604148176033;-0.00013558764476329;-0.00072074745548889;0.00017018451762851;0.0002326500689378;3.3948344935197e-05;0.00015892197552603;8.8485940068495e-06;-0.00013429291720968;3.8161149859661e-05;8.5145591583569e-05;6.0533348005265e-05;-0.00066795287420973;0.00015816993254703;-0.0013929021079093;-0.00013421790208668;-0.00011041798279621;-0.00038803429924883;9.0305802586954e-05;2.1009291231167e-05;-3.3394844649592e-05;-0.00010791222302942;5.1307692046976e-05;5.5881107982714e-05;-0.00021016129176132;0.00014741841005161;-0.00071989756543189;-0.0021944160107523;-0.00016189411689993;0.0030692415311933;0.00019971330766566;0.00058924203040078;0.0011878637596965;-1.7262232177018e-06;4.3349305087759e-06;0.00050965516129509;-7.232888310682e-05;2.1815558284288e-05;4.5475655497285e-05;-8.5290766946855e-06;-9.332788613392e-05;0.00016898203466553;-0.00017135804228019;-0.0014691059477627;-0.00051524228183553;8.414605690632e-05;0.00040958056342788;-2.7513537133927e-05;0.00015948254440445;4.2638199374778e-05;-6.5885011281352e-05;0.00044977487414144;0.0002281562628923;-0.00011000103404513;-0.0001143536210293;-6.9143723521847e-05;2.7697467885446e-05;0.0015968031948432;0.00051705655641854;6.4800842665136e-06;-0.00035532584297471;-0.00072072347393259;3.127118179691e-05;-0.00040037801954895;0.00036596498102881;0.00013730801583733;2.7794114430435e-05;-0.00013066129758954;-0.00022017996525392;-7.5813914008904e-05;0.00011579293641262;7.6756623457186e-05;-0.00030922307632864;9.1980065917596e-05;0.0013276687823236;-0.00035221705911681;1.4479349374596e-05;-3.3252457797062e-05;-0.00018485116015654;4.4441629142966e-05;0.00010890504927374;-6.5980071667582e-05;-0.00012294606131036;3.7884990888415e-05;0.00022555538453162;-0.00013356423005462;-7.7279393735807e-05;1.751835043251e-05;0.00018842615827452;0.00024340001982637;-4.45807881988e-06;-0.0010331985540688;0.00011821505904663;0.00024770930758677;-0.00013863047934137;-0.00072686374187469;0.00019702360441443;0.00022362735762727;2.2690153855365e-05;0.00016086742107291;5.6803351071721e-06;-0.00013639462122228;4.2785955884028e-05;8.4236198745202e-05;6.3450133893639e-05;-0.00078927405411378;0.00011089185863966;-0.0015185888623819;-0.00012765658902936;-0.00012478885764722;-0.00040114251896739;9.9712095106952e-05;1.7327784007648e-05;-3.4686097478698e-06;-9.9664874142036e-05;3.1033683626447e-05;4.7556528443238e-05;-0.00023373559815809;0.00015751129831187;-0.00067160569597036;-0.0023213527165353;-0.00017186501645483;0.0032716817222536;0.00018649885896593;0.0006433071102947;0.001240685232915;3.6970312066842e-05;2.7452546419227e-05;0.00056467932881787;-8.2690639828797e-05;9.0711246230057e-06;4.1974635678343e-05;4.4324283408059e-06;-9.26388456719e-05;6.707564170938e-05;-8.0365149187855e-05;-8.9032531832345e-05;-0.00013820103777107;0.00081977725494653;-0.00055251608137041;-7.4744908488356e-05;0.00015330745372921;-5.1190752856201e-05;3.8161524571478e-05;2.0378951376188e-05;6.7622153437696e-05;-2.36054142988e-06;-1.5206434909487e-05;0.00020578733528964;-0.00018803426064551;0.00027053232770413;0.0002400466328254;1.1770663149946e-05;-0.0018069084035233;0.0013819318264723;0.00022579498181585;-0.00044565938878804;0.00020689102530014;-0.00014209467917681;-0.00040481970063411;0.00029639172134921;-2.1177895177971e-05;-9.4468214228982e-06;-4.6626137191197e-05;6.2915190937929e-05;-0.00016993591270875;-7.773518882459e-05;-0.00063122500432655;-0.00078426633263007;0.00022203756088857;0.00015385796723422;-0.00015660501958337;-9.8134492873214e-05;-6.294783361227e-06;-4.0586590330349e-05;0.00026682190946303;0.00017343158833683;-0.00019890423573088;-0.00022896930749994;6.3108920585364e-05;7.0580972533207e-05;0.0021912448573858;-0.00021941335580777;6.1577273299918e-05;-0.00093690206995234;-0.00071086938260123;0.00026256224373356;0.00017687020590529;0.00022796918347012;0.00035967733128928;5.9772251006507e-06;-7.512123829656e-06;-3.5937693610322e-05;-1.3929231499787e-05;3.5887926060241e-05;4.5615561248269e-05;2.1095624106238e-05;3.5606673918664e-05;-0.0013430984690785;-0.0011722299968824;-0.00096445728559047;-0.00073391909245402;-7.9492630902678e-05;-0.00010050480341306;3.2475636544405e-05;1.7825699615059e-05;0.00029579328838736;0.00023768859682605;-0.00021712288435083;-0.00019833445549011;-0.00017074405332096;-0.00010757663403638;0.00062103022355586;-0.0012473607202992;-4.9842378757603e-07;0.0015714506153017;0.0011791317956522;0.00035769870737568;0.0003876150585711;0.00048056442756206;0.00044417721801437;0.00039605493657291;0.00028053735150024;-0.00014945380098652;-0.00012641042121686;0.00013863417552784;0.00011382364755264;6.4883868617471e-05;-7.3109906225e-05;2.0106846932322e-05;-7.9857716627885e-05;0.00078359158942476;-0.00058828276814893;-8.8002692791633e-05;0.00013960088836029;-4.6170676796464e-05;4.092510062037e-05;-1.2509062798927e-05;4.8379068175564e-05;2.1360323444242e-05;-7.6512930036188e-07;0.00020429988217074;-0.00018722075037658;0.00010977862984873;0.00013244754518382;2.483409616616e-06;-0.0017284853383899;0.0014802158111706;0.00026914800400846;-0.00040027219802141;0.00015832863573451;-0.00016775043332018;-0.00039313346496783;0.00030374858761206;-5.9723861340899e-06;-1.5985249319783e-06;-6.0267891967669e-05;5.4100764828036e-05;-0.00015276437625289;-8.2981030573137e-05;-0.00067973631666973;-0.0007405286305584;0.00018443221051712;0.00011427945719333;-0.00015778125089128;-0.00010664269939298;-9.8134123618365e-06;-3.367124372744e-05;0.00026726655778475;0.00016315675748046;-0.00020906096324325;-0.00021817543893121;6.3197905546986e-05;6.1646234826185e-05;0.0021313275210559;-0.0002924959117081;5.5769731261535e-05;-0.0008378125494346;-0.0006654501776211;0.00028357247356325;0.00021022139117122;0.00025949141127057;0.0003405139723327;1.0443835890328e-05;1.0560019291006e-05;-4.1628121834947e-05;-9.994012543757e-06;4.1311999666505e-05;4.1344745113747e-05;1.5867186448304e-05;4.1368883103132e-05;-0.0012484948383644;-0.0012002972653136;-0.00085947045590729;-0.00080174783943221;-7.590236782562e-05;-8.3589693531394e-05;2.50885841524e-05;2.2687656382914e-05;0.00027909598429687;0.0002413175534457;-0.00020036201749463;-0.00020220813166816;-0.00014939231914468;-0.00013109076826368;0.00059025001246482;-0.0011783939553425;8.0514701039647e-06;0.0013888716930524;0.0013045072555542;0.0003337970119901;0.00033986839116551;0.00044747811625712;0.00044904937385581;0.00035018418566324;0.00031568968552165;-0.00014179728168529;-0.00013073596346658;0.00012786508887075;0.00012244474783074;0.00011640963930404;-9.9922792287543e-05;0.00038751002284698;0.00074910366674885;-0.0001356993598165;-0.00015256054757629;-9.6683579613455e-05;1.1514160178194e-05;1.9398370568524e-05;6.5690715018718e-06;-0.00018704879039433;-0.00017459732771385;8.728273678571e-05;0.0001165038192994;2.1471840227605e-05;-1.0654773177521e-05;-0.00095602514920756;-0.00035158396349289;-1.4792733963986e-05;0.00022455550788436;0.00050126371206716;0.00027037833933719;-2.1939753423794e-05;-9.1217385488562e-05;-0.00031783757731318;1.4659290172858e-05;5.4358246416086e-05;6.2503531808034e-05;0.00010303436283721;-6.2653365603182e-05;-7.3299219366163e-05;1.7076779840863e-05;-0.00015040377911646;-0.00036136124981567;0.00044276847620495;4.7994468332035e-05;5.8529625675874e-05;3.1932122510625e-06;-9.3097602075431e-05;-3.5551827750169e-05;4.8081263230415e-05;9.2920767201576e-05;-4.5181186578702e-05;-0.00011365250975359;6.9669818913098e-05;2.8089638362871e-05;-1.5683959645685e-05;0.00049641239456832;0.00010543973621679;-8.7320831880788e-06;-0.00010630684118951;-0.00063858565408736;-2.4875400413293e-05;0.00014751052367501;0.00017792054859456;-0.00022581829398405;-1.3926728570368e-05;6.622417276958e-05;-1.8746888599708e-05;7.7554024755955e-05;3.4680651879171e-05;-6.2142105889507e-05;3.4648517612368e-05;3.9639620808885e-05;-9.888643398881e-05;-0.0006253047613427;-8.7176005763467e-05;-0.00089976261369884;-0.00017933300114237;-6.7176217271481e-05;1.7974906540985e-06;5.8320394600742e-05;-1.6366100680898e-05;8.3913415437564e-05;-2.9357254334172e-06;-5.8014360547531e-05;7.0528280048165e-05;-0.00016059400513768;-0.00017124201986007;-0.0012266127159819;-8.3914143033326e-05;0.00012515397975221;0.0017686372157186;0.00060161243891343;0.00036658759927377;8.4045728726778e-05;0.00014743603242096;-3.7201276427368e-05;0.00035083573311567;1.8130729131371e-06;-4.25557300332e-05;-2.8847895009676e-05;5.0953418394784e-05;0.0001701527799014;-0.00014855884364806;0.00050615367945284;0.0011441841488704;-0.00032622661092319;-3.7241938116495e-05;-0.0001376122381771;2.4825676518958e-05;4.2970470531145e-05;-1.6851989130373e-05;-0.00026255947886966;-0.00027738293283619;0.00011379729403416;0.00015825081209186;-3.8138894069562e-06;4.0837603592081e-05;-0.0013703218428418;-0.00046774125075899;-5.2205136853445e-06;0.00054841872770339;0.00043261828250252;0.0003638885973487;-6.1626989918295e-05;-0.00012105981295463;-0.00043345862650312;8.8914057414513e-05;-1.6984706235235e-05;8.6106301750988e-05;0.00016120813961606;-7.8640237916261e-05;-0.0001170247560367;5.2547333325492e-05;-0.00021821058180649;-0.00039054060471244;0.00082978850696236;1.0083717825182e-05;-2.1359068341553e-05;1.4688980627398e-05;-0.00013202617992647;-5.1715996960411e-05;8.1895210314542e-05;8.0728430475574e-05;-0.00011226680362597;-0.00013168989971746;0.0001355521089863;3.0021310521988e-05;-5.1340557547519e-05;0.00037190128932707;0.00013975414913148;-1.713461097097e-05;-1.0199517419096e-05;-0.00078554142965004;-5.0417904276401e-05;0.00021743158868048;0.00020856338960584;-0.00039607696817257;-3.0388414415938e-06;0.00014538520190399;-1.3352126188693e-05;0.00012770575995091;3.9261813071789e-05;-0.00010039770131698;5.3965231927577e-05;4.730590080726e-05;2.5442233891226e-05;-0.00073956046253443;-6.1907965573482e-05;-0.0011941482080147;-0.00027041844441555;-8.7012544099707e-05;5.1461634029693e-06;8.0858029832598e-05;-7.2018818173092e-05;8.8466695160605e-05;2.9565138902399e-05;-2.7044787202612e-05;0.00011856399942189;-0.00020860922813881;-0.00039889974868856;-0.0017293789424002;-0.00011482289119158;8.9158143964596e-05;0.0025254129432142;0.00087621301645413;0.00047487235860899;5.40032851859e-05;9.5094001153484e-05;-8.2869410107378e-05;0.00045586939086206;2.6296476789867e-05;-3.8987069274299e-05;-6.354357174132e-05;4.2989158828277e-05;0.0001251627545571;-0.0001119697408285;0.00034243540721945;0.00086485553765669;-0.00026160042034462;-3.2415056921309e-05;-7.5869509601034e-05;1.4916583495506e-05;3.2617936085444e-05;-1.9298115148558e-05;-0.00018326565623283;-0.00023657790734433;7.8340344771277e-05;7.7562268415932e-05;-1.8701870430959e-05;4.1126098949462e-05;-0.00097670033574104;-0.00024659570772201;-4.7808777026148e-07;0.00044805914512835;0.00016937314649113;0.00019798692665063;-3.5449716961011e-05;-8.4156141383573e-05;-0.00023662018065806;8.2605569332372e-05;-1.4177577213559e-05;5.7738030591281e-05;0.0001320956798736;-4.9678961659083e-05;-8.1320460594725e-05;5.3079154895386e-05;-0.0001792559196474;-0.00025089201517403;0.00076235987944528;-1.2214564776514e-05;3.0705676181242e-05;3.6281686334405e-05;-0.00010183644917561;-4.0678569348529e-05;6.5096573962364e-05;4.1599341784604e-05;-9.6963231044356e-05;-8.9877750724554e-05;0.00013194033817854;1.0066213690152e-05;-3.5177919926355e-05;0.00016889793914743;0.00020156773098279;-7.9093160820776e-06;4.4189855543664e-05;-0.00068645272403955;-0.00010355019185226;0.00014248576189857;0.00013970778672956;-0.00037135143065825;9.4810566224623e-06;9.7998614364769e-05;-5.4542060752283e-06;0.00010412091069156;3.0181283364072e-05;-8.8145527115557e-05;5.036005313741e-05;1.8663013179321e-05;3.650271173683e-05;-0.0004139386001043;-7.4712916102726e-05;-0.00078803388169035;-0.00020698063599411;-6.0430065786932e-05;8.4841558418702e-06;5.328941551852e-05;-6.7400724219624e-05;2.3770506231813e-05;2.2601079763263e-05;6.2522581174562e-06;8.3640552475117e-05;-0.00012855495151598;-0.00034714234061539;-0.0012502197641879;-8.0033314588945e-05;0.0001120538363466;0.0017414805479348;0.00065280654234812;0.00032444999669679;3.8320758903865e-05;1.607777812751e-05;-4.7892008296913e-05;0.00029348966199905;2.5554232706781e-05;-8.2635636999839e-07;-4.9088670493802e-05;7.4569938988134e-06;0.00015936631825753;-0.00014578276022803;-0.0012559376191348;-0.00037300479016267;0.00013878513709642;0.00029444886604324;6.710234856655e-07;9.0995657956228e-05;9.129085810855e-06;-3.5535922506824e-05;0.00032298936275765;0.00017201944137923;-0.00011038227967219;-7.9300785728265e-05;-1.3161915376259e-05;2.1222800569376e-05;0.0012696088524535;0.00031786586623639;7.4573927122401e-06;-0.00025382329476997;-0.00054190499940887;-8.5403922867044e-07;-0.00024073502572719;0.00037781908758916;8.9014516561292e-05;-5.181258165976e-05;-9.0775909484364e-05;-0.00016429823881481;-5.4505824664375e-05;8.8774009782355e-05;5.1648512453539e-05;-0.00024618383031338;4.5854067138862e-05;0.001016067690216;-0.00033197889570147;0.00033262249780819;7.4661249527708e-05;-0.00010867606761167;7.2456052294001e-05;6.6507680458017e-05;-5.6735854741419e-05;-6.2025450461078e-05;6.1323851696216e-05;0.00020359590416774;-0.00012331076140981;-1.1898992852366e-05;1.3104706340528e-05;0.00042894473881461;0.00052784202853218;3.7688474549213e-05;-0.0012272878084332;-0.00010863014176721;2.8264425054658e-05;-0.00026034394977614;-0.00062160653760657;0.00016773361130618;4.2528638005024e-05;-2.8914505492139e-06;0.00011559770064196;-3.049080078199e-06;-0.00011614859977271;4.5974098611623e-05;8.3977474787389e-06;6.3588966440875e-05;-0.00054678611923009;-8.8178021542262e-05;-0.0010696126846597;-0.00012983581109438;-0.00011231620010221;-0.00028370224754326;7.541618833784e-05;8.4864504970028e-06;2.1492017765468e-07;-4.4920907384949e-05;-2.7778901312558e-06;-5.5814389270381e-06;-0.00015982589684427;0.00010841798939509;-0.00029811399872415;-0.0016643626149744;-0.00012799042451661;0.0021735350601375;0.00019095141033176;0.00050768960500136;0.00088685360969976;5.2241899538785e-05;9.7627700597513e-05;0.00041106337448582;-4.3912546971114e-05;2.4045661120908e-05;2.0055687855347e-05;-7.8920021451268e-07;-4.9880207370734e-05;9.77231975412e-05;-9.7549011115916e-05;-0.00076443649595603;-0.00021967703651171;0.00022949180856813;9.1548805357888e-05;2.6145203264605e-06;7.7675998909399e-05;-1.4889233170834e-05;-9.3987182481214e-06;0.00019509316189215;0.00010492445289856;-9.2735972430091e-05;-4.4805576180806e-05;3.5226719774073e-05;-2.1581343389698e-05;0.00079991965321824;0.00027390793547966;1.524010895082e-05;-0.00043975943117402;-0.00016217119991779;-5.925747245783e-06;-0.00021911761723459;0.0002941231650766;2.8177939384477e-05;-0.00011003705731127;-2.8766389732482e-06;-0.00010245665180264;-3.1166222470347e-05;5.5273088946706e-05;3.7643378163921e-05;-0.0001733576937113;6.0144916460558e-06;0.00041420332854614;-0.00033739340142347;0.00034733390202746;0.00016291862993967;-6.1047030612826e-05;3.9586830098415e-05;2.817344648065e-05;-4.1366871300852e-05;2.885733738367e-05;7.4474322900642e-05;7.4884788773488e-05;-0.00010991349699907;2.2375088519766e-05;3.2203086448135e-05;0.0007445149240084;0.00044970537419431;3.9311187720159e-05;-0.0010094727622345;-0.00034348486224189;-2.6411442377139e-05;-0.00018142799672205;-0.00029391932184808;0.00015950872329995;-3.0395251087612e-05;-4.0621747757541e-05;5.4270094551612e-05;-7.0023020271037e-06;-5.6852022680687e-05;3.4330667403992e-05;9.591773050488e-06;3.0202174457372e-05;-0.00063091906486079;-0.0002736235037446;-0.00078108941670507;-0.00014409777941182;-9.0741719759535e-05;-0.00018413610814605;5.0908787670778e-05;3.6036569781572e-06;8.5765743278898e-05;2.8445068892324e-05;-7.1873255365063e-05;-4.5734355808236e-05;-0.00012040069123032;5.8754496421898e-05;7.0655791205354e-05;-0.001188411260955;-8.96380879567e-05;0.0014631696976721;0.00020941790717188;0.00040085313958116;0.0005997892585583;0.00017135185771622;0.00014438017387874;0.00030715137836523;-3.0298253932415e-06;-2.7513573513716e-05;-1.1750884368666e-05;3.809711051872e-05;-9.178411346511e-06;8.6823107267264e-05;-9.4880699180067e-05;-0.00061713776085526;-0.00013591707102023;0.00041337221045978;-8.4248225903139e-05;-3.116576181128e-06;9.7835407359526e-05;-4.0953327697935e-05;1.2901008631161e-05;0.00014920595276635;7.7712691563647e-05;-0.00010181940160692;-2.3774578949087e-05;9.8053300462198e-05;-7.5554409704637e-05;0.00065404042834416;0.00031351990764961;2.3633039745619e-05;-0.00080492079723626;0.00018908148922492;1.4994575394667e-05;-0.00028833487886004;0.00032756887958385;-3.8030473660911e-05;-0.00021443140576594;8.8493252405897e-05;-8.2902486610692e-05;-1.7809908968047e-05;3.8768554077251e-05;3.7828238419024e-05;-0.00017686747014523;-3.4993314329768e-05;1.4108844879956e-05;-0.00048871868057176;0.00050275569083169;0.00032032997114584;-4.663668005378e-05;2.2372829334927e-05;3.9039709918143e-06;-4.5360913645709e-05;0.00012708488793578;0.0001198024401674;-1.8041033399641e-05;-0.00014592279330827;6.3164814491756e-05;6.4998748712242e-05;0.0014145033201203;0.00056370277889073;6.1073260440025e-05;-0.0012544107157737;-0.00074145512189716;-8.1041878729593e-05;-0.00018085705232807;-0.00010487055260455;0.00021989838569425;-0.00010600218229229;-9.1905036242679e-05;1.8437756807543e-05;-1.2262499694771e-05;-2.394044167886e-05;3.7148747651372e-05;1.3576365063273e-06;1.5265111869667e-05;-0.0009627144318074;-0.00061640469357371;-0.00080702413106337;-0.00025717509561218;-0.00010776339331642;-0.00016683687863406;4.6463745093206e-05;2.7068244889961e-06;0.00020034356566612;0.00011830525181722;-0.00016066858370323;-0.00011349540000083;-0.00012646341929212;2.6956493456964e-05;0.00047647455357946;-0.0012380356201902;-8.1504891568329e-05;0.0013752818340436;0.00037923245690763;0.00045350415166467;0.00057140900753438;0.00033844172139652;0.0002678697637748;0.00032559008104727;5.39769353054e-05;-8.1543716078158e-05;-5.0121398089686e-05;8.4906358097214e-05;3.1666215363657e-05;9.3701914011035e-05;-0.00010083596134791;-0.00050230108899996;2.3307700757869e-05;0.00056606065481901;-0.00028365658363327;-3.8354326534318e-05;0.00012340194371063;-5.2185423555784e-05;3.2190800993703e-05;0.00010766913328553;3.7688889278797e-05;-8.0756261013448e-05;1.3092623703415e-05;0.00015326727589127;-0.00013107508129906;0.00043798677506857;0.0002564606256783;1.5370449546026e-05;-0.0011641477467492;0.00067998585291207;0.00013289719936438;-0.00036417561932467;0.00034249288728461;-0.00016055627202149;-0.00030490933568217;0.00018633407307789;-6.5695094235707e-05;5.0058938541042e-06;8.7672342488077e-06;3.2966876460705e-05;-0.00019009243987966;-7.515763718402e-05;-0.00031904334900901;-0.0006316754152067;0.00059365591732785;0.00042891770135611;-6.1519305745605e-05;-4.1319703996123e-06;-1.4501970326819e-05;-5.2050381782465e-05;0.00021102504979353;0.00015077729767654;-0.00010514849418541;-0.00018530373927206;9.2299786047079e-05;9.0780660684686e-05;0.0021410237532109;0.00059927866095677;9.2926668003201e-05;-0.0015162158524618;-0.0011205248301849;-7.603667472722e-05;-0.00015679214266129;5.3154879424255e-05;0.0002823697286658;-0.00013529197894968;-0.00011411852756282;-9.5094856078504e-06;-9.2675609266735e-06;2.993216185132e-06;3.7178389902692e-05;-2.4612418201286e-05;6.2412896113528e-06;-0.0012746552238241;-0.0010409574024379;-0.00083514174912125;-0.00049233285244554;-0.00012322275142651;-0.00016391763347201;3.9746581023792e-05;1.1463923328847e-05;0.00030134984990582;0.00021754867339041;-0.00021842935530003;-0.00018843809084501;-0.00012898302520625;-2.7664234949043e-05;0.00084401061758399;-0.0013830451061949;-5.4927277233219e-05;0.0013842383632436;0.0007666174788028;0.00048572497325949;0.00056297413539141;0.00044656608952209;0.00040654285112396;0.00033941562287509;0.00016447591769975;-0.00012238671479281;-9.2701287940145e-05;0.00011599281424424;7.8505996498279e-05;7.1912043495104e-05;-7.6488206104841e-05;-0.00027393354685046;8.7470216385555e-05;0.00049901305465028;-0.00032274561817758;-5.1706443628063e-05;0.00010496708273422;-4.0914212149801e-05;3.2095358619699e-05;5.1382143283263e-05;1.0347822353651e-05;-3.6816320061916e-05;2.5886321964208e-05;0.00014033536717761;-0.00012566307850648;0.00018879851268139;0.00014386116527021;5.6037470130832e-06;-0.0010568044381216;0.00079366046702489;0.00017052468319889;-0.00030672131106257;0.00023633652017452;-0.00017793239385355;-0.0002697691670619;0.00019014411373064;-3.6113033274887e-05;1.3912941540184e-05;-1.4216627278074e-05;2.3572843929287e-05;-0.00014539755648002;-7.272631773958e-05;-0.00039668459794484;-0.0005296251620166;0.0004328447394073;0.00032735356944613;-6.4332351030316e-05;-2.5347326300107e-05;-1.6881302144611e-05;-3.9140752051026e-05;0.00019528515986167;0.00012226341641508;-0.00012243688979652;-0.00015540109598078;7.6467993494589e-05;7.4205876444466e-05;0.0018867962062359;0.00036923511652276;7.7007913205307e-05;-0.0011718705063686;-0.00094552332302555;-1.233060083905e-05;-6.6401655203663e-05;0.0001185226792586;0.00023812326253392;-9.3803588242736e-05;-7.868449029047e-05;-2.0287963707233e-05;-3.8525545278389e-06;1.5883679225226e-05;2.6738418455352e-05;-2.2949710910325e-05;4.8093502300617e-06;-0.0010722820879892;-0.00096685800235718;-0.00064973201369867;-0.00051658775191754;-9.7686250228435e-05;-0.00011916151561309;2.615669836814e-05;1.5436620742548e-05;0.00025871861726046;0.00020376639440656;-0.00018119155720342;-0.00017088142340071;-9.913766552927e-05;-5.5761636758689e-05;0.00073103158501908;-0.0011181312147528;-2.7665450033965e-05;0.0010681574931368;0.00082585134077817;0.00037766186869703;0.00041538203367963;0.00037407051422633;0.0003624816017691;0.00026227792841382;0.00019064388470724;-0.00010794220725074;-8.9872220996767e-05;9.8156720923726e-05;8.1238082202617e-05;0.00013322939048521;-0.00012452778173611;0.0003627045371104;0.00091607781359926;-0.00022052014537621;-0.0001044308883138;-7.5168580224272e-05;-9.2595075784629e-07;1.8803822968039e-05;1.004078603728e-05;-0.00019112508744001;-0.00019408838124946;7.9554774856661e-05;0.00013683273573406;-1.5732591691631e-06;-5.13518216394e-06;-0.0010397273581475;-0.000293277669698;-1.2023757335555e-05;0.00039306943654083;0.00032124790595844;0.00021681682846975;-8.9049672169494e-06;-8.1497099017724e-05;-0.00037449336377904;5.4916705266805e-05;4.6653662138851e-05;6.1011993238935e-05;0.00011592070950428;-5.3359122830443e-05;-8.6102525528986e-05;1.4741273844265e-05;-0.00016027926176321;-0.00033814102062024;0.00058375124353915;9.5689436420798e-05;0.00021067079796921;4.1218849219149e-05;-7.5782285421155e-05;-4.1779618186411e-05;4.6219582145568e-05;9.4368602731265e-05;-6.1517559515778e-05;-0.00011176870611962;0.00011448303121142;2.2166896087583e-05;1.1067622835981e-06;0.00048944709124044;0.0003529439563863;1.4527708117384e-05;-0.00016714629600756;-0.00088031002087519;-0.0001523102982901;4.6906719944673e-05;0.00016229516768362;-0.0003182812652085;-2.3508797312388e-05;1.339911341347e-05;-1.9231145415688e-05;8.7393185822293e-05;3.9793914766051e-05;-8.1067126302514e-05;4.536002597888e-05;2.5753986392374e-06;-0.00011971693311352;-0.00050572637701407;-6.476890121121e-05;-0.00081268255598843;-0.00017903423577081;-7.7870521636214e-05;-1.4558716543434e-07;5.898410017835e-05;-1.9082852304564e-05;6.1949998780619e-05;-1.1951263331866e-05;-4.0447775973007e-05;7.8007986303419e-05;-0.00013939342170488;-0.00012116470315959;-0.00117685389705;-8.6291336629074e-05;9.3470924184658e-05;0.001592313288711;0.00059382076142356;0.0003698150976561;0.00010014137660619;9.6851756097749e-05;-4.8100122512551e-05;0.00032030715374276;6.3212601162377e-06;-1.6714440789656e-05;-2.929142829089e-05;2.9317243388505e-05;0.00015837374667171;-0.00015068108041305;0.00041405839147046;0.0011078299721703;-0.00030223815701902;-6.518999725813e-05;-8.5146741184872e-05;1.732864461701e-06;2.7192791094421e-05;2.5366623503942e-06;-0.00022387232456822;-0.00023746061197016;9.0626010205597e-05;0.00015366161824204;-1.4708281014464e-05;1.2280216651561e-05;-0.0012251220177859;-0.00031791272340342;-8.0220243035001e-06;0.00053322635358199;0.00027258368209004;0.00023873531608842;-2.2386651835404e-05;-9.439694986213e-05;-0.00042847794247791;8.8065266027115e-05;2.5500927222311e-05;7.0928996137809e-05;0.00014087531599216;-5.9049867559224e-05;-0.00010354283585912;2.8104183002142e-05;-0.00019068032270297;-0.00035296921851113;0.00077737361425534;7.8950339229777e-05;0.00021562266920228;5.2939732995583e-05;-9.1426329163369e-05;-4.9363912694389e-05;6.0065558500355e-05;9.214058809448e-05;-9.1815229097847e-05;-0.00012142894411227;0.00015398120740429;1.9491657440085e-05;-8.6872742031119e-06;0.0004420785990078;0.00040662646642886;1.5210629499052e-05;-0.0001249768974958;-0.0010005083167925;-0.00018498591089156;6.199656490935e-05;0.00017487430886831;-0.00041417317697778;-1.5393496141769e-05;3.2892185117817e-05;-1.7918540834216e-05;0.00011001121310983;4.4134183553979e-05;-0.00010216618829872;5.9447895182529e-05;-4.5587412387249e-06;-8.2014477811754e-05;-0.00051310745766386;-6.6885782871395e-05;-0.00091947143664584;-0.00021440518321469;-8.8283741206396e-05;1.0719786587288e-06;6.8653127527796e-05;-4.3394124077167e-05;5.322583092493e-05;-2.2477274796984e-06;-2.3195751055027e-05;9.5270122983493e-05;-0.00015539072046522;-0.00021630388800986;-0.0013699177652597;-9.841635619523e-05;9.92799323285e-05;0.0018600428011268;0.0007005765219219;0.00041420015622862;9.609430708224e-05;6.3519975810777e-05;-6.1479418945964e-05;0.00035960815148428;1.655691266933e-05;-6.5623135014903e-06;-4.1902832890628e-05;1.9990036889794e-05;9.021060395753e-05;-8.9084205683321e-05;-0.0006583058857359;-3.0351731766132e-05;0.00029197055846453;-3.1762665457791e-05;3.5017906157009e-06;6.7307024437468e-05;-3.9468624891015e-05;1.5660163626308e-05;0.00013833938282914;4.6705841668881e-05;-0.00011432266182965;7.8019814964136e-07;8.0877689470071e-05;-5.3489529818762e-05;0.00056372676044703;0.00021514373656828;1.4283227756096e-05;-0.00053473620209843;6.3033621700015e-05;1.9796369087999e-05;-0.00020615725952666;0.00035147948074155;-6.9837864430156e-05;-0.00017238243890461;5.8077814173885e-05;-7.9184879723471e-05;-4.7147887016763e-06;4.4846830860479e-05;1.8057640772895e-05;-0.00015221981448121;-4.2616295104381e-05;3.2857584301382e-05;-0.00040781585266814;0.00059334479738027;0.00037806661566719;-8.8151382442447e-06;4.9091911932919e-05;-6.7593196035887e-06;-4.4424596126191e-05;0.00010605750139803;0.00010712362563936;-9.8930826197829e-08;-0.00012252466694918;7.4833616963588e-05;6.2751350924373e-05;0.001356793101877;0.00076062383595854;8.0188008723781e-05;-0.0013292079092935;-0.000828463351354;-0.00019385415362194;-0.00027580326423049;-0.00011394866305636;0.00017735449364409;-0.00015497716958635;-0.00011051588808186;1.7238555301446e-05;-1.0341220331611e-05;-2.6351230189903e-05;3.2412466680398e-05;-4.103275568923e-05;7.7408731158357e-06;-0.00080968689871952;-0.00061084993649274;-0.00056356948334724;-0.00018269580323249;-9.756918734638e-05;-0.00014081735571381;3.5889217542717e-05;-6.1677087614953e-07;0.00019658447126858;0.00012285349657759;-0.00014315279258881;-0.00012015397078358;-8.4376115410123e-05;3.0252280339482e-05;0.00061348400777206;-0.00097513070795685;-6.1451144574676e-05;0.00094418198568746;0.00025329616619274;0.00036879794788547;0.00046205284888856;0.00027126152417623;0.0002607723872643;0.00023527751909569;3.6639437894337e-05;-6.349974864861e-05;-4.3998741602991e-05;6.6462605900597e-05;3.305472273496e-05;8.4461185906548e-05;-8.541682473151e-05;-0.0005869198939763;7.5196447141934e-05;0.00033847580198199;-0.00011081626144005;-1.1481180081319e-05;7.7972938015591e-05;-4.2856303480221e-05;2.3961101760506e-05;0.0001225589949172;1.7687814761302e-05;-0.00010222934361082;2.3037839127937e-05;9.9154756753705e-05;-7.6438263931777e-05;0.00043024201295339;0.00019469291146379;1.148549017671e-05;-0.00064819410908967;0.00024841632694006;6.534739077324e-05;-0.00023783011420164;0.00034155958564952;-0.00013297304394655;-0.00019978986529168;9.8066448117606e-05;-7.1091169957072e-05;9.472317287873e-06;3.2002153602662e-05;1.2244892786839e-05;-0.00015386860468425;-5.7616369304014e-05;-0.00012156397860963;-0.00044642004650086;0.00063014292391017;0.00044520979281515;-7.4915560617228e-06;4.0222716052085e-05;-1.6022208001232e-05;-4.6907418436604e-05;0.00013904724619351;0.00011139536218252;-4.0460738091497e-05;-0.00013054134615231;8.6487525550183e-05;7.7302778663579e-05;0.0016636154614389;0.00080950453411788;9.2466798378155e-05;-0.0014368505217135;-0.0010309146018699;-0.00020717168808915;-0.00027348601724952;-3.3136111596832e-05;0.00019523179798853;-0.0001698365813354;-0.00013078893243801;3.6385913517734e-06;-7.2229427132697e-06;-1.2362621419015e-05;2.8396900233929e-05;-5.0530601583887e-05;-6.3671709540358e-06;-0.00094911456108093;-0.00077347847400233;-0.00055570341646671;-0.00026339644682594;-0.00010461018246133;-0.00014183552411851;3.1637606298318e-05;3.7321553918446e-06;0.00024322289391421;0.00016655969375279;-0.00016998162027448;-0.00014858673966955;-8.0817786511034e-05;1.049102320394e-05;0.00079632643610239;-0.0010298407869413;-5.139956556377e-05;0.00091916642850265;0.00038433319423348;0.00038382591446862;0.00046041651512496;0.00032121638651006;0.00030769253498875;0.00023143892758526;7.7325334132183e-05;-8.2583028415684e-05;-5.9679878177121e-05;8.0450874520466e-05;5.0089787691832e-05;-4.3948864913546e-05;6.4167456912401e-06;5.7809502322925e-05;5.8994788560085e-05;0.0003373404906597;9.7440773970447e-05;-0.00081511319149286;-0.00014931893383618;7.7825010521337e-05;-7.4790004873648e-05;0.00010902228677878;-2.0639348804252e-05;-0.00018505215120967;-2.7896287065232e-05;0.00011609710054472;2.8147833290859e-05;-9.9493468042056e-07;0.00032041300437413;0.00093859183834866;-3.7007110222476e-05;-0.00018789820023812;-0.00055896013509482;-0.00028159451903775;-0.00024699314963073;2.1214748358034e-06;0.0004244239826221;2.4021122953855e-05;7.3949420766439e-05;1.2297324246902e-05;-6.3677180150989e-05;8.9713303168537e-06;2.632385258039e-05;3.2877960620681e-05;-7.3646435339469e-05;-0.00012420910934452;-0.0011668993392959;-0.00059516163310036;-0.00063895923085511;0.00024474979727529;0.00017193297389895;0.00012158360914327;-0.00018969531811308;-6.358086830005e-05;-0.00016777089331299;9.9888711702079e-05;0.00010718616977101;-8.5000341641717e-05;-9.780764230527e-05;-0.0014397398335859;-0.0014265939826146;0.0004488835693337;0.0005534419324249;0.0022876320872456;0.0010991834569722;0.00047135970089585;0.00018668266420718;0.00032833375735208;-7.9344616096932e-05;0.00011862692190334;-2.775301982183e-05;-0.00010505189857213;-1.747288115439e-05;5.5617594625801e-05;-1.9542996597011e-05;-0.00015652198635507;-0.00013494085578714;-0.00086418731370941;0.00013722103904001;-0.00055103347403929;-0.00037478623562492;-0.00019305272144265;1.1122201613034e-05;-0.0001623379503144;9.4522052677348e-05;-0.00023630876967218;-0.00012349661847111;0.00013656266673934;6.4754247432575e-05;-3.8996178773232e-05;-0.00083941972116008;0.0006649766000919;0.00040640102815814;0.00039859977550805;0.0010256074601784;-0.00026614026864991;0.00050778209697455;-8.4014260210097e-05;0.00024812837364152;0.00017375130846631;6.7525295889936e-05;6.4311452661059e-06;2.3664884793106e-05;2.2111547878012e-05;-4.6467554057017e-05;1.4124169865681e-05;4.5122382289264e-05;5.7963356084656e-05;0.00041958256042562;-4.7677625843789e-05;-0.00063603860326111;-0.00012036284169881;1.6516609321116e-05;-2.2148420612211e-05;0.0001296993723372;-4.935259494232e-05;-0.00016018305905163;-1.1585016181925e-05;0.00011753257422242;-6.8112035478407e-06;-6.5453133402116e-07;0.0002786586410366;0.00076305167749524;-1.1173427083122e-05;-0.00018677522893995;-0.0006969504756853;-1.8542286852608e-05;-0.00028319051489234;6.5627493313514e-05;0.00034947795211338;1.2041452464473e-05;5.8181616623187e-05;8.5236697486835e-06;-5.4504987929249e-05;1.6314908862114e-05;3.3034393709386e-05;3.2245359761873e-05;-8.430726302322e-05;-0.00010529868450249;-0.0011422450188547;-0.00068151159211993;-0.00045213574776426;0.00020338679314591;0.00015641763457097;0.00012383321882226;-0.00019616220379248;-9.0348461526446e-05;-0.00012677675113082;7.8900113294367e-05;9.2578447947744e-05;-5.7514265790815e-05;-9.8471660749055e-05;-0.0014011050807312;-0.0015870850766078;0.00045769865391776;0.00050401134649292;0.0021881135180593;0.001305480953306;0.00048131929361261;0.00023634839453734;0.00023168799816631;-7.3049683123827e-05;0.00010233250213787;-9.563103049004e-06;-9.4883362180553e-05;-2.6930734748021e-05;4.6145753003657e-05;-1.5505609553657e-05;-0.00014799273048993;-0.00012433786469046;-0.00078001752262935;7.9706886026543e-05;-0.00064289820147678;-0.00046115825534798;-0.00017115060472861;-3.7268899177434e-05;-0.00014409514551517;7.0190631959122e-05;-0.00026446659467183;-0.00015210003766697;0.0001515807089163;0.00010721213766374;-2.861857865355e-05;-0.00077224057167768;0.00083775637904182;0.00038169615436345;0.00035485383705236;0.00087009352864698;-0.0002121081633959;0.00046358021791093;-3.7134945159778e-05;0.00030190314282663;0.00019533929298632;8.0389763752464e-05;2.3529495592811e-05;1.4826704500592e-05;1.2289136975596e-05;-8.3143395386287e-06;2.9801711207256e-05;-3.6045679735253e-05;-1.7615542674321e-05;1.0185032806476e-05;-0.00025081241619773;5.5855998652987e-05;0.00055364827858284;8.9098757598549e-06;-3.9265436498681e-05;3.6724624806084e-05;-6.7205248342361e-05;3.600438731155e-06;0.00013774065882899;9.695763765194e-06;-0.00011123900912935;-1.6145871995832e-05;-0.00018087570788339;-0.00050148239824921;0.00014829465362709;1.1983023796347e-05;2.2297499526758e-05;0.0003876521368511;-4.9512655095896e-05;0.00014481997641269;6.6807983785111e-06;-0.00027574840351008;-5.68373434362e-06;-5.8859808632405e-05;-9.647231308918e-06;6.0562986618606e-05;3.5960671084467e-05;1.5956535207806e-05;-0.00012786693696398;-3.7131307180971e-05;-0.00057070603361353;-0.0007965614204295;0.00014999674749561;-0.00040359343984164;9.8050128144678e-05;0.00010774903057609;-8.0835387052502e-05;-0.00012825445446651;5.0983791879844e-05;-9.2160087660886e-05;-4.1651936044218e-05;9.9906246759929e-05;-7.7356911788229e-05;-0.0011281557381153;-0.0011739340843633;0.00048806224367581;0.00029247812926769;0.00095847417833284;0.0017410126747563;0.00022905305377208;0.00030712754232809;-4.5864187995903e-05;0.00015621133206878;-8.7214448285522e-06;7.9096855188254e-05;-1.8809836547007e-05;-7.8515920904465e-05;-1.1414011169109e-05;2.6568097382551e-05;-9.7520191047806e-05;-8.4840554336552e-05;2.2064641598263e-05;-0.0003818805271294;-0.00036397454096004;-0.00041204571607523;-2.5605213522795e-06;-0.00018156868463848;5.8219742641086e-05;-7.0547757786699e-05;-0.00013731067883782;-0.00014739940525033;4.7230485506589e-05;0.00014661958266515;-1.4303587704489e-05;-0.00051277369493619;0.00067771365866065;0.00027143213083036;0.00021113557158969;-0.00014536023081746;0.00047157990047708;-2.4383367417613e-05;0.00023395207244903;0.00019822391914204;0.00012842459545936;1.9201426766813e-05;4.5079141273163e-05;2.4590193788754e-05;5.8483251450525e-06;3.3792449016801e-07;2.1380657926784e-05;-2.5840976377367e-05;-2.3792163119651e-05;-0.00014146213652566;-9.5236122433562e-05;3.6060231650481e-05;0.00066553731448948;4.6846114855725e-05;-8.8382592366543e-05;-7.964102223923e-06;-3.437154009589e-05;-1.0659917961675e-06;0.00014277751324698;-8.8449787654099e-06;-0.00010013345308835;-7.3942510425695e-06;-0.00012086812057532;-0.00054160825675353;9.6049559942912e-05;1.2797614544979e-05;0.0002609773655422;9.738422522787e-05;4.2802272218978e-05;7.8408396802843e-05;1.2791258086509e-05;-0.00030994304688647;1.5589705526509e-06;-6.6397915361449e-05;-5.7812299019133e-06;6.3377483456861e-05;2.9523926059483e-05;1.0477472642378e-05;-0.00012828268518206;-3.3494325180072e-05;-0.00040048695518635;-0.00069865706609562;0.00013779989967588;-0.0005082972929813;7.9874567745719e-05;9.3753718829248e-05;-3.9670216210652e-05;-0.00010536958143348;5.4171679948922e-05;-0.00011922445992241;-5.0128364819102e-05;0.0001096600535675;-6.5360036387574e-05;-0.0010229450417683;-0.0008351348224096;0.00046580034540966;0.00025915852165781;0.00065002922201529;0.0015630968846381;0.00014262029435486;0.000264073634753;-3.8331130781444e-05;0.00020721467444673;-2.1198942704359e-05;8.1002173828892e-05;-7.7303184298216e-06;-7.3945870099124e-05;-1.3671400665771e-05;2.6704807169153e-05;-7.9123085015453e-05;-7.356140849879e-05;8.7559295934625e-05;-0.00029287184588611;-0.00024298494099639;-0.00018183395150118;3.3994747354882e-05;-0.00019844123744406;6.9182147854008e-05;-5.5186188546941e-05;-9.2906942882109e-05;-8.7485961557832e-05;1.013691053231e-05;9.995345317293e-05;-1.2124139175285e-05;-0.00038720256998204;0.00047479098429903;0.00021696131443605;0.00016457239689771;-0.00018777983495966;0.00034991235588677;-6.542448682012e-05;0.00019031613192055;0.00014288068632595;2.7347789000487e-05;3.2245493457594e-06;1.5662737496314e-05;3.0268569389591e-05;2.7129122827318e-05;-9.5408786364715e-06;-1.7930464309757e-05;4.8074067308335e-05;6.3973486248869e-05;3.7026871723356e-05;0.00037361509748735;-0.0010789734078571;-0.00019649778550956;0.00021390937035903;-0.00018688966520131;6.4725318225101e-06;3.6913854273735e-05;-0.00014102157729212;-6.3865700212773e-05;0.00013686205784325;0.00011370243009878;-2.0956113075954e-05;0.00028814267716371;0.001142906374298;5.2742161642527e-06;-0.00017486365686636;-0.00012577274173964;-0.00070435687666759;-7.4856776336674e-05;-0.0001213504729094;0.00041855228482746;3.038168506464e-05;9.2228467110544e-05;2.4892588044167e-05;-0.00010824389755726;-7.8080338425934e-06;-1.7617107005208e-05;3.505725908326e-05;3.5456898331176e-05;-0.00015249064017553;-0.00086914515122771;-0.00021153678244445;-0.0012568684760481;0.00034623185638338;0.00029307510703802;2.1303783796611e-05;-9.5004375907592e-05;1.5200162124529e-05;-0.00024134358682204;0.00013525020040106;0.00012798396346625;-8.8887070887722e-05;-6.8995497713331e-05;-0.0012311504688114;-0.00078271242091432;0.00021274424216244;0.00056855042930692;0.0022614719346166;0.00031632784521207;0.00021790452592541;1.367730419588e-05;0.00059297779807821;-0.00012646293907892;0.00014858099166304;-6.1360653489828e-05;-0.0001345191267319;-3.7000186239311e-06;7.9981560702436e-05;-1.1622573765635e-05;-0.00017907518486027;-0.00021653246949427;-0.0013032632414252;2.4397817469435e-05;-0.00031700474210083;-5.9948361013085e-05;-0.00017536972882226;0.00014543696306646;-0.00021895178360865;0.00012445216998458;-0.00010873544670176;-9.6673593361629e-06;4.2361229134258e-05;-7.6502648880705e-05;-8.8347704149783e-05;-0.0014346290845424;-0.00023355206940323;0.00056602316908538;0.00070179038448259;0.0019612857140601;8.7966409410001e-06;0.00064722879324108;-0.0001113049002015;0.00010261537681799;8.6772692156956e-05;1.8056020053336e-05;-4.9266051064478e-05;4.1157414671034e-05;4.3417516280897e-05;-3.9965270843823e-05;-9.979566129914e-06;7.7201577369124e-05;0.00010242434655083;0.00033373280894011;0.00030410729232244;-0.0012033408274874;-0.00033280186471529;0.0002096069365507;-0.00020440870139282;8.8392778707203e-05;-2.791806082314e-06;-0.00021958083380014;-9.7813826869242e-05;0.00014432326133829;0.00014112496864982;-2.0803850020457e-07;0.00053782557370141;0.0014771627029404;-6.6970198531635e-05;-0.00031206617131829;-0.00066051364410669;-0.00063604075694457;-0.00024103194300551;-5.8939611335518e-05;0.00056221423437819;7.3002782301046e-05;0.00010709749767557;4.6327670133905e-05;-0.0001033325897879;-1.4758750694455e-05;-1.3605633739644e-06;4.3195686885156e-05;9.0613102656789e-06;-0.00016297340334859;-0.0012814855435863;-0.00045371105079539;-0.0012754823546857;0.0004531430604402;0.00034649448934942;7.2713657573331e-05;-0.00017501211550552;-2.4593397029093e-05;-0.00024970594677143;0.00017694533744361;0.00013526924885809;-0.00012568461534102;-0.00010206680599367;-0.001595641602762;-0.0013960099313408;0.00035920101800002;0.00067611568374559;0.002917819423601;0.00076668540714309;0.00040001989691518;9.8728451121133e-05;0.0006221144576557;-0.00016218049859162;0.00017541943816468;-6.6236119891983e-05;-0.00016777993005235;-1.3002850209887e-05;0.00010713053052314;-2.2241798433242e-05;-0.00024749702424742;-0.00025354768149555;-0.0018366588046774;9.373343345942e-05;-0.0007589390152134;-0.00019410011009313;-0.00015727746358607;0.00011399861250538;-0.00032999087125063;0.00015816077939235;-0.00026775975129567;-4.9355974624632e-05;0.00011251280375291;-3.1158957426669e-05;-0.00011805185931735;-0.0018034079112113;2.5598772481317e-05;0.0007871090201661;0.00084507378051057;0.0025552541483194;-0.00011275520955678;0.00094393594190478;-0.00015137341688387;0.00035526280407794;0.00013910478446633;8.935020014178e-05;-4.4101430830779e-05;1.3050635061518e-05;3.8941030652495e-05;-6.1697501223534e-05;7.7930772022228e-06;7.8030752774794e-05;0.00010354308324168;0.00059934909222648;5.3699404816143e-05;-0.00097919045947492;-0.00035077871871181;0.00013193821359891;-0.00014374224701896;0.00016606811550446;-5.8327928854851e-05;-0.00021354823547881;-8.9106964878738e-05;0.00012824901205022;0.00010430333350087;1.1151627404615e-05;0.00055042305029929;0.0013388757361099;-7.8176664828788e-05;-0.00033254758454859;-0.0010585675481707;-0.00022252678172663;-0.00038662203587592;6.0044061683584e-05;0.00051560666179284;7.9629033280071e-05;8.3576131146401e-05;4.8605052143103e-05;-7.6973017712589e-05;-9.0796866061282e-06;2.1860520064365e-05;4.3085165088996e-05;-3.5918041248806e-05;-0.00013661725097336;-0.0014469937887043;-0.00069691252429038;-0.00092372624203563;0.00041388568934053;0.00030727687408216;0.00013191925245337;-0.00022835553681944;-7.7949414844625e-05;-0.00018858436669689;0.00016583765682299;0.00010927903349511;-0.00012402824359015;-0.00012024113675579;-0.0016884724609554;-0.0018666710238904;0.00046519457828254;0.0006498986040242;0.0029789854306728;0.0012667245464399;0.00052634120220318;0.00020456885977183;0.00046724444837309;-0.00014447543071583;0.00015559508756269;-4.4775686546927e-05;-0.00015635919407941;-2.7616351871984e-05;9.4560498837382e-05;-2.3630585928913e-05;-0.00024342289543711;-0.00022120214998722;-0.0016992157325149;6.7656794271898e-05;-0.00097136845579371;-0.0004335867415648;-0.00014834987814538;4.4296772102825e-05;-0.00031096834572963;0.0001287950144615;-0.00035902523086406;-0.00012815141235478;0.00016449439863209;5.6749326176941e-05;-9.4917799287941e-05;-0.0016099299537018;0.00049726013094187;0.0007449317490682;0.00072730664396659;0.0021977277938277;-0.00013272624346428;0.00090553687186912;-9.8698656074703e-05;0.00048699980834499;0.00022027792874724;0.00012574302672874;-5.1663641897903e-06;-1.8640845382834e-06;1.98879151867e-05;-7.4887408118229e-05;3.1402432796312e-05;4.6668985305587e-05;0.00010327477502869;0.00091983407037333;-0.00040188123239204;-0.00047980804811232;-0.00039789816946723;2.5205525162164e-05;-5.4926149459789e-05;0.00025114094023593;-0.00015355381765403;-0.00012825314479414;-8.1144637078978e-05;8.7581232946832e-05;6.8817469582427e-05;1.3450684491545e-05;0.00044190589687787;0.00094423617701977;-5.0975445446966e-06;-0.000341158505762;-0.0016082377405837;0.00062933098524809;-0.00054809730499983;0.00026954992790706;0.00032359751639888;8.0451463873032e-05;2.6063768018503e-05;5.9851739933947e-05;-3.9895188820083e-05;-7.524636657763e-06;3.5364457289688e-05;3.8764464989072e-05;-2.7888994736713e-05;-6.2510720454156e-05;-0.0013578196521848;-0.00086518237367272;-0.00045571970986202;0.00034988726838492;0.00028352762456052;0.00016626625438221;-0.0002426132268738;-0.00013771939848084;-6.6854867327493e-05;0.0001423716021236;5.7452620239928e-05;-8.7824766524136e-05;-0.00012456058175303;-0.0014355464372784;-0.0022946028038859;0.0004148255684413;0.00047019473277032;0.0026969229802489;0.0016831355169415;0.00051967467879876;0.00028978026239201;0.00023098877863958;-0.00013339864381123;0.00011363787052687;-6.8237973209762e-06;-0.00013890601985622;-5.4822659876663e-05;7.797779107932e-05;-1.2541710930236e-05;-0.0002369926078245;-0.0001984899136005;-0.0016775514231995;-0.00022330998035613;-0.0012416945537552;-0.00073202332714573;-7.2305367211811e-05;-2.3315555154113e-05;-0.00029873417224735;4.7469813580392e-05;-0.00044017634354532;-0.00021206322708167;0.00019278435502201;0.00015141849871725;-7.8393961302936e-05;-0.0016145119443536;0.00074883969500661;0.00075206032488495;0.00066825904650614;0.0020637789275497;0.00025110566639341;0.00088017096277326;6.9622365117539e-05;0.00066273752599955;0.00033108436036855;0.00016613883781247;4.7887155233184e-05;-3.214646858396e-05;-1.7084754290408e-05;-6.2830324168317e-05;4.794626875082e-05;-1.2277155292395e-05;6.8634202762041e-05;0.00087737030116841;-0.00070654490264133;-6.0242207837291e-05;-0.00019330067152623;-7.8680306614842e-05;5.3362524340628e-05;0.00026018539210781;-0.00019744290329982;-3.7722951674368e-05;-1.3628628039442e-06;6.4627623942215e-05;-2.4388100428041e-05;-1.0746872249001e-05;7.9133540566545e-05;0.00029371245182119;0.00017841201042756;-0.00023304263595492;-0.0015536936698481;0.0012893409002572;-0.0005391287850216;0.00038284348556772;0.00013488526747096;-2.5434212147957e-05;-1.9649485693662e-05;2.9312126571313e-05;-2.1285693946993e-05;1.8007676771958e-05;4.7253979573725e-05;3.2549374736845e-05;-4.5422297262121e-05;-1.2413556760293e-05;-0.0011724785435945;-0.00097163626924157;-3.7217487260932e-05;0.00014019041555002;0.00021606207883451;0.00017023753025569;-0.00023020520166028;-0.00017959666729439;1.394823902956e-05;6.4860221755225e-05;2.8376212867443e-05;5.0205244406243e-06;-0.00013146235141903;-0.0012569486862049;-0.0024496994446963;0.00041279269498773;0.00033616356085986;0.0022563806269318;0.0020512170158327;0.00048461082042195;0.00035794739960693;1.6178137229872e-05;-7.9206380178221e-05;7.0477370172739e-05;4.5508524635807e-05;-0.00010110666335095;-8.2381309766788e-05;4.3781532440335e-05;9.0051908046007e-06;-0.00020405904797371;-0.00015951512614265;-0.0011785285314545;-0.00058072380488738;-0.0011478398228064;-0.00098665000405163;-6.2913983128965e-05;-0.00010036951425718;-0.00018694529717322;-6.0005026170984e-05;-0.00040233827894554;-0.00028246268630028;0.00018715902115218;0.0002369639405515;-4.6775850933045e-05;-0.0013786846539006;0.00099133979529142;0.00063752912683412;0.00052584352670237;0.0013272063806653;0.00074076815508306;0.00060909939929843;0.00027965428307652;0.00061263813404366;0.00040666991844773;0.00014364227536134;9.9781667813659e-05;-2.7550011509447e-05;-4.5720724301646e-05;-4.7655845264671e-05;5.2944149501855e-05;-4.6784596634097e-05;3.3307969715679e-05;0.00069587246980518;-0.00076461379649118;0.0001266126637347;2.2706559320795e-05;-7.8350058174692e-05;5.9833175328095e-05;0.00022557520424016;-0.00019307243928779;1.49419729496e-05;5.5304681154666e-05;3.3329502912238e-05;-6.7852932261303e-05;-2.5488443498034e-05;-0.00016792237875052;-0.00013612241309602;0.00026726932264864;-0.00012133720883867;-0.0012069235090166;0.0014243240002543;-0.00045027839951217;0.00039173176628537;3.3317657653242e-05;-0.00011606789485086;-3.9184385968838e-05;1.4551085314451e-06;-1.0266282515659e-05;3.3394408092136e-05;5.0064925744664e-05;2.6692378014559e-05;-6.6077089286409e-05;1.5330502947108e-06;-0.0010134482290596;-0.00099445739760995;0.00014928211749066;-5.6534121540608e-05;0.00017442098760512;0.00017810273857322;-0.00020078358647879;-0.00018457938858774;5.6596592912683e-05;1.2766159670718e-05;-2.93804237117e-06;4.779970186064e-05;-0.00012484090984799;-0.0011952786007896;-0.002287968294695;0.0004326197959017;0.00028873520204797;0.0018811140907928;0.0021620988845825;0.00042808035505004;0.00037042566691525;-6.8389526859391e-05;-3.2903710689425e-06;3.8834295992274e-05;7.0253554440569e-05;-7.4503506766632e-05;-9.6331474196631e-05;2.0320401745266e-05;2.3667447749176e-05;-0.0001841631019488;-0.00013834882702213;-0.00075763824861497;-0.0007706904434599;-0.00094385829288512;-0.0010471822461113;-4.94990417792e-05;-0.00011846924462589;-9.0615270892158e-05;-0.00011652120883809;-0.0003305216669105;-0.00029852928128093;0.00015439915296156;0.00025322451256216;-3.7373720260803e-05;-0.0012302802642807;0.00097863702103496;0.00057236372958869;0.00045433326158673;0.0007713864906691;0.0010363179026172;0.0003776416706387;0.00038657640106976;0.00050777097931132;0.00042185204802081;0.00010620582179399;0.00011774719314417;-1.490461636422e-05;-5.3848540119361e-05;-2.6683766918723e-05;4.6931807446526e-05;-5.9858986787731e-05;-5.6604253586556e-06;0.00036376286880113;-0.00061264930991456;0.00018620636546984;0.0002558124542702;4.8702399908507e-06;-1.5191602869891e-05;0.00014124084555078;-0.0001446644164389;4.7469151468249e-05;8.9797569671646e-05;-1.860610973381e-05;-7.2149479819927e-05;-2.9676735721296e-05;-0.00030623312341049;-0.00044126811553724;0.00025662389816716;3.5557816318033e-06;-0.00056405714713037;0.0010937378974631;-0.00026572949718684;0.0003090905956924;-2.7818034141092e-05;-0.00018521198944654;-4.1745264752535e-05;-2.3772827262292e-05;2.6723912469606e-06;3.920496601495e-05;4.2272389691789e-05;1.7979176845984e-05;-8.576567779528e-05;-2.5944518711185e-06;-0.00074684503488243;-0.00089640315854922;0.00020903346012346;-0.00026822998188436;0.00012726712157018;0.00018611097766552;-0.00013515510363504;-0.00015281766536646;8.48227791721e-05;-2.7163099730387e-05;-4.2571671656333e-05;4.6735585783608e-05;-9.4740200438537e-05;-0.0010886762756854;-0.0016954721650109;0.00042831659084186;0.00025935730081983;0.0013098063645884;0.0019417161820456;0.00030223929206841;0.00032056597410701;-8.1594851508271e-05;0.00010654015932232;3.9692608879704e-06;7.2816110332496e-05;-4.6966844820417e-05;-9.4552502559964e-05;9.7831900802703e-07;3.2097334042192e-05;-0.00015597122546751;-0.00011605013423832;-0.0003211198200006;-0.00078270229278132;-0.00059649354079738;-0.00087618891848251;-1.3975525689602e-05;-8.7654101662338e-05;5.2659829634649e-06;-0.00013044661318418;-0.00020898420189042;-0.0002517910907045;8.7126551079564e-05;0.00019869061361533;-4.0652557800058e-05;-0.0010345575865358;0.00069115642691031;0.00049355620285496;0.00039017794188112;0.000273351353826;0.0011113103246316;0.00013473368017003;0.00039390224264935;0.00033352267928421;0.00035842630313709;5.1467690354912e-05;0.00010244289296679;1.2184489150968e-06;-4.2837298678933e-05;2.1644942535204e-05;1.1192942110938e-06;-3.1610590667697e-05;-2.6843823434319e-05;-0.00045602326281369;0.00020931898325216;4.9560600018594e-05;0.0011043269187212;0.00016536847397219;-0.00025001569883898;-8.2068356277887e-05;3.6165027267998e-05;7.7343111115624e-06;0.00016602156392764;-7.8810298873577e-05;-0.00011086498125223;1.7269887393923e-05;-4.0731196349952e-05;-0.00081479467917234;6.4628962718416e-05;-3.9895694499137e-05;0.00072485761484131;-0.00039110364741646;0.00021035288227722;-4.9575355660636e-05;2.8806023692596e-05;-0.00044823961798102;1.7785663430914e-06;-9.9740231235046e-05;7.2658422141103e-06;0.00010409750393592;2.9406608518912e-05;-1.4238084077078e-05;-0.00016191358736251;1.7995453163167e-05;-8.8587468781043e-05;-0.00064324424602091;0.00021316073252819;-0.0011571010109037;2.2610412997892e-05;0.00019972849986516;4.2105861211894e-05;-6.9504196289927e-05;0.0001034219894791;-0.00022646080469713;-6.3582374423277e-05;0.00017911079339683;-5.5549477110617e-05;-0.001074300496839;-0.00039370468584821;0.00054848514264449;0.00016562818200327;9.8186188552063e-05;0.0018501036101952;-3.5921952076023e-05;0.00017336044402327;-8.1517282524146e-05;0.00046995660522953;-5.7340530474903e-05;0.0001296545524383;1.0440425057823e-06;-0.00012099288142053;-7.3782016443147e-06;4.6791250497336e-05;-0.00015577524027321;-9.7488780738786e-05;2.3439642973244e-05;-0.00061298068612814;-3.5338027373655e-05;8.9353976363782e-05;0.00015598168829456;-0.00024666197714396;0.0001018012771965;-9.0201174316462e-05;-8.0821573646972e-06;1.3437672350847e-05;-9.5179231720977e-05;1.7846014088718e-05;-5.0705697503872e-05;-0.00085917668184265;-0.0001700185239315;0.00047470699064434;0.00029270444065332;-3.0992969186627e-06;0.001020452240482;-9.8981559858657e-05;0.00029279888258316;8.1671845691744e-05;-0.00012023496674374;-4.1678864363348e-05;-3.5078195651295e-05;4.9863352614921e-05;6.7210057750344e-05;2.9137900128262e-05;-1.1145934877277e-05;-4.3938554881606e-05;-1.5178272406047e-05;-0.00050976371858269;0.00031131238210946;4.9829850468086e-05;0.0011660632444546;0.00018508618813939;-0.0002725287922658;-9.1454181529116e-05;7.0526395575143e-05;1.1349468877597e-05;0.00015850791533012;-9.2273206973914e-05;-0.00013467484677676;2.813133141899e-05;-2.880350984924e-05;-0.00084700010484084;7.9109748185147e-05;-8.1079080700874e-05;0.00079292431473732;-0.00049462739843875;0.00023588299518451;-0.00011109426122857;3.4773038350977e-05;-0.00044110647286288;-6.89212299676e-07;-0.0001110451266868;8.8512661022833e-06;0.00012491659435909;3.1612667953596e-05;-2.6850148060475e-05;-0.0001657397224335;5.09124402015e-05;-1.0729062523751e-05;-0.00053146563004702;0.00023823326046113;-0.0013539943611249;-1.7210888472619e-05;0.00026241189334542;5.4622851166641e-05;-4.5558372221421e-05;0.00011292366252746;-0.00023147418687586;-4.9360114644514e-05;0.00020257331198081;-4.5165204937803e-05;-0.0010354288388044;-0.00028165100957267;0.00054599990835413;8.7527434516232e-05;-3.944979107473e-05;0.0018804733408615;-7.0851216150913e-05;9.3349823146127e-05;-0.00010389772796771;0.0005172491655685;-6.1028928030282e-05;0.00014090021431912;-2.3287009298656e-06;-0.00014660607848782;-9.5404807609611e-08;5.0765367632266e-05;-0.00021316223137546;-9.9998971563764e-05;-1.6984626199701e-05;-0.0008010397432372;4.5131335355109e-05;1.2439199053915e-05;0.00017365349049214;-0.00021742963872384;0.00011683438060572;-0.00010918970656348;2.4409147954429e-05;3.0558614525944e-05;-0.00012175121810287;1.3530590877053e-05;-6.8796507548541e-05;-0.0011828992282972;-0.00039389258017763;0.00065035099396482;0.00035755345015787;7.2741233452689e-05;0.0014919968089089;-0.00010553439642536;0.00033961309236474;5.2640887588495e-05;-0.00011685148638207;-6.0582875448745e-05;-3.6342535167933e-05;5.4339954658644e-05;5.7992736401502e-05;7.1818540163804e-05;-4.3640658986988e-05;-4.5610358938575e-05;6.7191023845226e-05;-0.00048248996608891;0.00042962608858943;-0.00089500553440303;-7.7474949648604e-05;0.0001903170341393;-0.0001538176293252;-0.00019538817286957;6.9872483436484e-05;4.9880207370734e-05;-4.0596660255687e-05;0.00027094953111373;8.3274724602234e-05;-9.0432076831348e-05;-3.9992108213482e-05;0.00074031017720699;0.0002536355459597;-7.2215472755488e-05;0.00057612615637481;-0.00070324767148122;0.00028562336228788;-0.0001818499295041;2.3772880012984e-05;-5.4783822633908e-06;9.2613103333861e-05;1.2768205124303e-05;-0.00019541291112546;4.8734186748334e-06;-7.5421798101161e-05;3.7097819586052e-05;0.00019316954421811;-0.00015357113443315;0.00022449795505963;9.2692171165254e-05;-0.0015202338108793;0.0002693775750231;0.00036125580663793;-0.00011434016050771;9.3238733825274e-05;5.2837665862171e-05;-0.00011482644913485;8.6793101218063e-05;0.00019932398572564;-1.3933592526882e-05;2.0295798094594e-05;-0.00062860880279914;1.9600513041951e-05;-0.00030602893093601;0.00042102704173885;0.0013818552251905;-0.0003117383166682;-0.0003600810887292;-7.4939533078577e-05;0.00044452233123593;-0.00011538730905158;0.00011526355956448;-4.9065078201238e-05;-0.00017152895452455;-3.143855565213e-06;3.8751513784518e-05;2.1534902771236e-05;-6.5969004936051e-05;-0.00033385830465704;-0.0010040398919955;-0.00017148617189378;-0.00013296007819008;0.00021432308130898;-0.00011403377720853;0.00019665180298034;-9.5267365395557e-05;0.00012179042823846;0.0001230127963936;7.2367038228549e-05;-8.7521484601893e-06;-0.00017190293874592;-6.6167456679977e-05;-0.0018112579127774;-0.00091413100017235;0.00037462409818545;0.00098101375624537;0.0024241721257567;0.00030926300678402;0.00030497479019687;-5.6754081015242e-05;-0.00017861911328509;2.2544554667547e-06;-6.0802925872849e-05;-9.0662819275167e-05;2.9746885047643e-05;6.2184415583033e-05;4.5694710024691e-06;-2.4006609237404e-05;2.5588213247829e-05;9.0728070063051e-05;2.9980330964463e-06;0.00033945919130929;-0.00095876480918378;-0.00023683726612944;0.00018661304784473;-0.00017983310681302;-2.9852202715119e-05;2.2170579541125e-05;-0.0001180535327876;-7.977313362062e-05;0.00016722950385883;0.00012632927973755;-2.4639006369398e-05;0.0003457763523329;0.0011012874310836;3.4969722037204e-05;-0.00023292495461646;-0.00020560597477015;-0.0006263111717999;-1.0104937246069e-05;-9.9440876510926e-05;0.00033324185642414;4.6104585635476e-05;9.7229523817077e-05;3.7145993701415e-05;-0.00012246225378476;-1.2830967534683e-05;-3.3746480767149e-05;3.5796758311335e-05;9.4744311354589e-05;-0.00013404077617452;-0.00056918361224234;-0.00014658716099802;-0.0012628893600777;0.00037250696914271;0.00034734173095785;-3.2850144634722e-05;-4.8264326323988e-05;1.1820971849374e-05;-0.00016997486818582;0.00013329873036128;0.0001318433060078;-6.5024185460061e-05;-4.2004507122329e-05;-0.0009862253209576;-0.00067024055169895;4.2146562918788e-05;0.00047637493116781;0.0020025386475027;0.00017927573935594;4.6294302592287e-05;4.2318411033193e-06;0.0005164053873159;-0.00014908726734575;0.00013706528989132;-5.5828862969065e-05;-0.00015767787408549;-8.060148502409e-06;8.5242849308997e-05;-5.351530489861e-06;-0.00017844425747171;-0.00027115148259327;-0.0016291440697387;-3.9518031371699e-06;-0.00058045866899192;6.2425635405816e-05;-6.4632666180842e-05;0.00012671558943111;-0.00026793856523;0.00014067951997276;-0.00012616495951079;3.2746807846706e-05;5.550204514293e-05;-9.3668648332823e-05;-0.00011373896268196;-0.0018226273823529;-0.00048446608707309;0.00066607986809686;0.0008876608335413;0.0026347343809903;6.4581618062221e-05;0.00074689142638817;-0.000123673962662;0.0002082201972371;3.6036191886524e-05;4.8860572860576e-05;-7.0595720899291e-05;-3.0627679734607e-06;4.2694038711488e-05;-2.7350139134796e-05;-1.2390069969115e-05;5.4922220442677e-05;0.00010916465544142;0.00030639590113424;0.00022096614702605;-0.00089785398449749;-0.00034111572313122;0.00016035928274505;-0.00017339862824883;5.9987651184201e-05;-1.8214384908788e-05;-0.00016669469187036;-0.00010478443437023;0.00012661784421653;0.00014065214782022;5.2700347623613e-06;0.00054071098566055;0.0012364289723337;-6.2214145145845e-05;-0.00032501269015484;-0.00069692317629233;-0.00046178814955056;-0.00018025604367722;-2.3910302843433e-05;0.00041217549005523;8.4820225310978e-05;8.8004679128062e-05;5.4309413826559e-05;-8.8037093519233e-05;-2.0842020603595e-05;-1.4170647773426e-05;3.5499535442796e-05;5.6869685067795e-05;-0.00011420236842241;-0.00086297007510439;-0.00030000429251231;-0.0010720649734139;0.00041788240196183;0.00033461378188804;1.6801042875159e-05;-0.00011038702359656;-1.9833194528474e-05;-0.00016172119649127;0.00015295810590032;0.00010330569784855;-9.1014240751974e-05;-6.476334965555e-05;-0.0010992119787261;-0.0010661095147952;0.0001637112145545;0.00047218063264154;0.0022294714581221;0.00048190605593845;0.00020829340792261;6.2178667576518e-05;0.00048401407548226;-0.00016114363097586;0.00013784303155262;-5.3745210607303e-05;-0.0001530925364932;-1.3094552741677e-05;0.00010017040767707;-1.5659807104385e-05;-0.00021818748791702;-0.00024831492919475;-0.0018940129084513;5.1774335588561e-05;-0.00084953539771959;-4.9362159188604e-05;-3.3284741220996e-05;8.6192216258496e-05;-0.00033717809128575;0.00014412350719795;-0.00025150217697956;-2.688858842248e-07;9.3288101197686e-05;-4.5018816308584e-05;-0.00012646123650484;-0.0018380758119747;-0.00023327361850534;0.00077445030910894;0.00085070118075237;0.0027482016012073;-3.333151107654e-05;0.00092552427668124;-0.00013866063090973;0.00041041249642149;7.0511283411179e-05;0.00010490507702343;-5.5097149015637e-05;-2.3423695893143e-05;3.0394374334719e-05;-8.9067500084639e-05;4.9193102313438e-05;2.4010694687604e-05;0.00012497401621658;0.0013415274443105;-0.00087532226461917;1.9669923858601e-05;-0.00068055477458984;-4.1606119339122e-05;-1.7911002032633e-06;0.00034876077552326;-0.00026003542006947;-2.7593649065238e-05;-0.00013661351113115;1.9111435904051e-05;0.00011134282249259;2.0702898837044e-05;0.00043900989112444;0.00076256651664153;4.6623183152406e-05;-0.00041408638935536;-0.0024321128148586;0.0015699814539403;-0.00074977084295824;0.00049596431199461;0.00013785416376777;0.00016168344882317;-4.051382347825e-05;0.00010663503780961;3.0683763725392e-06;-3.3611308026593e-05;2.8443460905692e-05;3.0170060199453e-05;6.9152745709289e-05;4.9080455937656e-05;-0.0010550330625847;-0.00077795842662454;-0.00013284861051943;0.00043045642087236;0.00028924163780175;0.00017634980031289;-0.00021904696768615;-0.00016180246893782;5.2398954721866e-05;0.00016389707161579;1.6779222278274e-05;-8.3076971350238e-05;-0.00011041333345929;-0.00074358726851642;-0.0024991272948682;0.00013090917491354;0.00015405933663715;0.0022268330212682;0.001582728466019;0.00037508679088205;0.00026121104019694;4.3575440940913e-05;-0.00017954201030079;8.1721998867579e-05;1.0076841135742e-05;-0.00013789402146358;-7.1841452154331e-05;8.4530598542187e-05;-3.9663336792728e-06;-0.00024596144794486;-0.00019487344252411;-0.0021619880571961;-0.00061528413789347;-0.0015722560929134;-0.00093188171740621;5.207180583966e-05;-1.1147993063787e-05;-0.00038723988109268;-3.1190553272609e-05;-0.00052192190196365;-0.0002506202145014;0.00019346810586285;0.00018431247735862;-8.4002298535779e-05;-0.0019306220347062;0.00050937663763762;0.00086276873480529;0.00072455412009731;0.0026866577100009;0.00082409626338631;0.0010850168764591;0.00024227242101915;0.00089073152048513;0.00043341223499738;0.00022281662677415;8.4908599092159e-05;-8.0135570897255e-05;-5.7903191191144e-05;-9.3711802037433e-05;7.3685456300154e-05;-2.7895111998077e-05;0.00010249361366732;0.001503431936726;-0.0012875042157248;0.00030652529676445;-0.00061709736473858;-0.00011693193664541;8.357573824469e-05;0.00042142625898123;-0.00033574638655409;4.0081613406073e-05;-8.0374971730635e-05;3.5915804801334e-06;5.212059841142e-05;-9.0240091594751e-06;8.6416963313241e-05;0.00033793447073549;0.00026671608793549;-0.00034650854649954;-0.002736025955528;0.0024593234993517;-0.00087913690367714;0.00066948559833691;3.8616995880147e-05;8.0005927884486e-05;-8.4185470768716e-05;9.2421600129455e-05;1.2129620699852e-05;-1.5840090782149e-05;4.8278179747285e-05;3.1180876248982e-05;6.0267288063187e-05;8.9709355961531e-05;-0.0011838558129966;-0.0010205408325419;0.00015244178939611;0.00032574299257249;0.00028104413649999;0.00022948655532673;-0.00026638788403943;-0.0002210236270912;0.00010818709415616;0.00013297719124239;6.4934083638946e-06;-2.3227534256876e-05;-0.00015561326290481;-0.00082512339577079;-0.0031512400601059;0.00019798337598331;0.00012388819595799;0.002405992243439;0.0022223393898457;0.00045893382048234;0.00035732568358071;-0.00010060492786579;-0.00016361306188628;7.0335845521186e-05;5.4346630349755e-05;-0.00013473001308739;-0.00011099354014732;6.7055065301247e-05;1.5767362128827e-05;-0.00026167475152761;-0.00019172587781213;-0.0020010739099234;-0.001114116050303;-0.0016833888366818;-0.0014300621114671;2.0729392417707e-05;-5.4555381211685e-05;-0.00033689785050228;-0.0001453705917811;-0.00056109647266567;-0.00038314019911923;0.00022783000895288;0.00030049419729039;-6.4852290961426e-05;-0.0020330063998699;0.00086816994007677;0.00089442747412249;0.00071343925083056;0.0023530900944024;0.0015188499819487;0.00099479011259973;0.00050351722165942;0.00094667711528018;0.00062735407846048;0.0002273721183883;0.00015840427658986;-7.8401295468211e-05;-9.8605538369156e-05;-7.3433206125628e-05;7.6661293860525e-05;-6.8489716795739e-05;5.3582782129524e-05;0.0012255937326699;-0.001285454723984;0.00043266353895888;-0.0003494666016195;-0.00010476993338671;8.830608567223e-05;0.00036944297607988;-0.00031080716871656;8.7326552602462e-05;-7.2727320912236e-06;-2.164748548239e-05;-2.4398389086855e-06;-3.1733197829453e-05;-0.00025058491155505;-0.00012638491170947;0.00038273914833553;-0.00018534372793511;-0.0021892122458667;0.0025018763262779;-0.00075096444925293;0.0006396378739737;-4.6518001909135e-05;-2.9589740734082e-05;-9.7565585747361e-05;5.3110165026737e-05;1.6917305401876e-05;3.8204652810236e-06;5.3112795285415e-05;2.4809656679281e-05;2.5344883397338e-05;8.7916865595616e-05;-0.0010573618346825;-0.0010313510429114;0.00030994179542176;0.00010033301805379;0.00022412666294258;0.00024130553356372;-0.00024131777172443;-0.00021612594719045;0.00013181776739657;7.558803918073e-05;-1.7961025150726e-05;2.0193518139422e-05;-0.00015083936159499;-0.00083945423830301;-0.0029192219953984;0.00025352911325172;0.00011809016723419;0.0020541651174426;0.0023149044718593;0.00042624739580788;0.00036035463563167;-0.00016450975090265;-7.5312127592042e-05;4.218400499667e-05;7.6700016506948e-05;-0.0001044329474098;-0.00012277718633413;3.7684309063479e-05;3.1973435397958e-05;-0.00023611685901415;-0.00016366421186831;-0.0013903999933973;-0.0013114695902914;-0.0013490578858182;-0.0015139009337872;4.5658663339054e-07;-5.8852045185631e-05;-0.00020323583157733;-0.00020623713498935;-0.00045240108738653;-0.00040408110362478;0.00018980421009474;0.00031483641942032;-5.1475155487424e-05;-0.0017982716672122;0.00088572315871716;0.00079285242827609;0.00061382551211864;0.0015414983499795;0.0018397159874439;0.00067380536347628;0.00061526073841378;0.00076186971273273;0.00065150222508237;0.00016875407891348;0.00017957085219678;-5.3548727009911e-05;-0.00010642108827597;-3.6830984754488e-05;5.2676801715279e-05;-6.6243672335986e-05;7.2427924351359e-06;0.00059171923203394;-0.00079590181121603;0.00028698824462481;1.6553662135266e-05;-1.2070959201083e-05;8.4900784713682e-06;0.00019979255739599;-0.00018460465071257;7.3859016993083e-05;4.420139521244e-05;-3.5631379432743e-05;-3.3294727472821e-05;-3.1206694984576e-05;-0.00032256686245091;-0.00034936322481371;0.00029154439107515;-2.5568791897967e-05;-0.00097830989398062;0.0014865683624521;-0.00039130329969339;0.00039156654383987;-5.6887402024586e-05;-0.00010529671999393;-6.383161235135e-05;5.8896398513753e-06;1.2843442164012e-05;1.8976474166266e-05;3.9549919165438e-05;1.5461571820197e-05;-3.3746000553947e-05;3.4114684240194e-05;-0.00072218454442918;-0.00081560818944126;0.00024232018040493;-0.00014109209587332;0.00013566184497904;0.00020007745479234;-0.00014812465815339;-0.00014955992810428;0.0001029308186844;1.3928613952885e-05;-3.8973692426225e-05;2.0565668819472e-05;-9.3329603259917e-05;-0.00082821917021647;-0.0018330571474507;0.00029657638515346;0.0001602732372703;0.0013142196694389;0.0017968617612496;0.00028926742379554;0.00027957907877862;-0.0001089323850465;5.0895989261335e-05;1.0129019756278e-05;6.3718485762365e-05;-5.8609806728782e-05;-9.4694609288126e-05;1.077528395399e-05;3.2168289180845e-05;-0.000171618827153;-0.00012003579468001;-0.0005893946508877;-0.0009651318541728;-0.00071613461477682;-0.0010366956703365;-1.7281556665694e-06;-3.4464017517166e-05;-4.8567719204584e-05;-0.00015788551536389;-0.00024294348258991;-0.0002810335427057;9.9081058579031e-05;0.0002070561167784;-4.7912817535689e-05;-0.0012429428752512;0.00058010558132082;0.00056972907623276;0.00044708658242598;0.00061454100068659;0.0014008171856403;0.00026372232241556;0.0004599133390002;0.00041030827560462;0.00044644952868111;7.4270064942539e-05;0.00012389158655424;-1.697965853964e-05;-6.6446082200855e-05;4.513105523074e-05;-4.5028151362203e-05;-9.14724660106e-05;3.0111741580185e-05;-0.00051427312428132;0.00051869003800675;5.5585456721019e-05;0.0010347855277359;0.0001726573536871;-0.00023550368496217;-8.3184808318038e-05;0.00015607028035447;2.2752141376259e-05;0.00011575067765079;-9.5104674983304e-05;-0.00019435468129814;5.3479827329284e-05;-6.1922619352117e-05;-0.00076074548996985;0.00015679464559071;-0.00019194814376533;0.00076510081999004;-0.00056114385370165;0.00023377873003483;-0.00027316200430505;3.0597559089074e-05;-0.00031477463198826;-1.0922847650363e-05;-0.00012536661233753;7.9802975960774e-06;0.00015964166959748;3.2879735954339e-05;-5.6445536756655e-05;-0.00013033114373684;0.00013722140283789;0.00013069316628389;-2.7758064291561e-08;0.00025030967663042;-0.0014977399259806;-0.00011223660840187;0.00036097218981013;5.3668045438826e-05;3.5148455935996e-05;0.00010475765157025;-0.00015231582801789;8.8338532577836e-07;0.00024689029669389;2.3120499008655e-06;-0.0006443276652135;6.7679957282962e-07;0.00038634773227386;-0.00019110651919618;-0.00029942675610073;0.0014546872116625;-0.0001039434428094;-0.00018340029055253;-0.00013628166925628;0.00043479830492288;-4.925143730361e-05;0.00013469214900397;-1.2757688637066e-05;-0.00019734600209631;2.0317220332799e-05;4.8260044422932e-05;-0.00035129152820446;-7.6366835855879e-05;-6.9470646849368e-05;-0.0012067091884091;0.00025874556740746;-0.00042023960850202;0.00015567481750622;-5.5858927225927e-05;0.00015256468032021;-0.00014837055641692;0.00010726462642197;4.1170686017722e-05;-0.00015511827950832;4.9909431254491e-05;-0.00010202556586592;-0.001932228798978;-0.00083344819722697;0.0010589105077088;0.0004574831109494;0.00016671900812071;0.0026902300305665;-0.00013019291509409;0.00040873617399484;-4.4773740228266e-05;-2.3044607587508e-05;-0.00010423363710288;-7.0687910920242e-06;5.5783399147913e-05;-1.1327395441185e-05;4.9861559091369e-05;-6.2870378314983e-05;-8.4056082414463e-05;4.9132308049593e-05;-0.00051818374777213;0.00063227210193872;2.3399139536195e-05;0.00099467008840293;0.00016479585610796;-0.00022990824072622;-9.19463855098e-05;0.00019728696497623;1.5354800780187e-05;5.9821282775374e-05;-8.6502128397115e-05;-0.00023017697094474;7.2434777393937e-05;5.5331584007945e-05;-0.00065550324507058;0.00010948306589853;-0.00025583905517124;0.0007483396329917;-0.00075417780317366;0.00024569532251917;-0.00034106604289263;4.2520663555479e-05;-0.00020755641162395;-6.5985714172712e-06;-0.00012315767526161;3.7379384139058e-06;0.0001834056165535;3.3847707527457e-05;-6.9178531703074e-05;-0.00013475908781402;0.00016965786926448;0.00020715975551866;0.00020262636826374;0.00023816656903364;-0.00163618568331;-0.00015120142779779;0.00040276657091454;6.6776919993572e-05;6.9947171141393e-05;9.8498989245854e-05;-0.00013824824418407;2.1500360162463e-05;0.0002664341009222;1.9767690901062e-05;-0.00055862631415948;0.00017330900300294;0.00037181997322477;-0.00029388855909929;-0.0004379736201372;0.0013477178290486;-0.00013450282858685;-0.00029198252013884;-0.00013964922982268;0.00043818503036164;-4.7876077587716e-05;0.00013389652303886;-1.5218928638205e-05;-0.0002127873885911;3.1867024517851e-05;3.7435456761159e-05;-0.00039281908539124;-5.4011070460547e-05;-0.00014335931336973;-0.0011417103232816;0.00030560372397304;-0.00036265439121053;0.00017333563300781;-5.05182397319e-05;0.00014799328346271;-0.00011627199273789;0.00012316227366682;9.1151501692366e-05;-0.00017544454021845;2.8609358196263e-05;-9.7749492852017e-05;-0.0020641749724746;-0.00099980179220438;0.0011559977428988;0.00042018975364044;0.00027259188937023;0.0028148086275905;-0.00010284644667991;0.00033311889274046;-5.739674452343e-05;-8.8250075350516e-05;-0.00011304969666526;-3.0185268769856e-05;5.915857036598e-05;-4.780395556736e-06;0.00014522421406582;-6.3518113165628e-05;-0.00014561451098416;8.3296305092517e-05;-0.0009662916418165;0.00040835578693077;-0.00065341492881998;2.9128459573258e-05;0.00010276547254762;-6.9417437771335e-05;-0.00037725144647993;8.5370258602779e-05;0.00020243650942575;-7.7175673141028e-06;0.00042981040314771;2.0115250663366e-05;-0.00017018095240928;-0.00036596338031814;0.00030861215782352;0.00053529173601419;1.8155253201257e-05;0.00115981628187;-0.00058445398462936;0.00062388816149905;-0.00021453367662616;-0.00034920425969176;-2.6833869924303e-05;0.00010286496399203;-1.9903980046365e-06;-0.00028094073059037;2.2195579731488e-05;-0.00011523357534315;3.6337911296869e-05;0.00032234808895737;-0.00014528514293488;0.0014145955210552;0.000222193353693;-0.0014556931564584;0.00014044153795112;0.00033127190545201;-0.0001781346363714;0.00024232269788627;5.8591449487722e-05;9.7409218142275e-05;1.9881921616616e-05;0.00033894096850418;3.8160000258358e-05;0.00012294496991672;-1.5271272786777e-05;0.00059475150192156;-0.00084008323028684;0.00024983790353872;0.00034856851561926;-0.00063355942256749;-0.00089203257812187;-8.5082356235944e-05;2.7243044314673e-05;-6.2754857935943e-05;7.1362010203302e-05;-2.4625565856695e-05;-0.00022860088211019;-8.457935223305e-07;-2.4270188077935e-05;5.4402156820288e-05;9.4548318884335e-05;-0.00044615138904192;-0.00038708656211384;-0.00029759929748252;-9.1950096248183e-05;0.00037176097976044;-6.2224418797996e-05;0.00020370891434141;7.5580501288641e-05;0.00012114208220737;0.00033875033841468;0.00010782185563585;2.7851090635522e-05;-0.00022055234876461;-5.0866688070528e-06;-0.0019659830722958;-0.0012205254752189;2.0734491045005e-05;0.0011849554721266;0.0025497586466372;0.00044087090645917;-0.00018389240722172;-5.3191647566564e-06;-0.00046904373448342;-4.0898266888689e-05;-0.0001190058683278;-0.00011498957610456;-1.4146093235468e-05;7.683892181376e-05;0.00014706174260937;-7.0206471718848e-05;-0.00014847559214104;0.0001126986098825;-0.0010757949203253;0.00050997320795432;-0.00088490755297244;-8.1084226621897e-06;0.00016076782776508;-0.00011816430196632;-0.00039083638694137;9.1897687525488e-05;0.00012909257202409;-1.950582372956e-05;0.00041813094867393;5.3500887588598e-05;-0.0001789778470993;-0.00026918030926026;0.00054273329442367;0.0005724789807573;-5.5117183364928e-05;0.0011540345149115;-0.00075638410635293;0.00066953274654225;-0.00024763270630501;-0.00017473290790804;-2.8185510018375e-05;0.00012787483865395;5.4077950153442e-06;-0.00028506555827335;1.6090043573058e-05;-0.00012132016854594;4.1974028135883e-05;0.00033405126305297;-0.00015470676589757;0.0012906392803416;0.00021596274746116;-0.0016738038975745;0.00020675956329796;0.00038353935815394;-0.00018173809803557;0.00023805540695321;5.9738908021245e-05;5.1845876441803e-05;4.5819047954865e-05;0.00035827167448588;2.5985562388087e-05;0.00010537463822402;-0.00016142915410455;0.00049877149285749;-0.00080441666068509;0.00030959481955506;0.00067204074002802;-0.00062813988188282;-0.00088043528376147;-9.326225699624e-05;0.00014299369649962;-9.1520189016592e-05;9.7223150078207e-05;-3.4092146961484e-05;-0.00025142019148916;-2.3565812625748e-06;1.3188206366976e-06;4.9824906454887e-05;4.6029104851186e-05;-0.00048737475299276;-0.00080074003199115;-0.00027303176466376;-0.0002227781660622;0.00041759695159271;-6.6531829361338e-05;0.00022682356939185;-1.7533278651172e-06;0.00015189217810985;0.00030899251578376;0.00012614198203664;4.3513635318959e-05;-0.00024377243244089;-3.9277143514482e-05;-0.0023324450012296;-0.0013502180809155;0.00019402831094339;0.0013467726530507;0.0031434181146324;0.00042574174585752;1.5767334843986e-05;-4.4933487515664e-05;-0.00041255415999331;-5.1138220442226e-05;-0.00010191226465395;-0.00013242536806501;-2.2805714252172e-05;8.5829844465479e-05;-6.9554043875542e-05;2.9321472538868e-05;3.5612381907413e-05;0.00013034329458605;0.0011285524815321;-0.00065276765963063;0.00010557486530161;-0.0007024509832263;-3.879637006321e-05;-1.0937980732706e-05;0.0002663723716978;-0.00020848159329034;-1.605106444913e-05;-0.00016354666149709;-4.7227595132426e-06;0.00013782960013486;3.7602501834044e-05;0.00058027525665238;0.00075363332871348;-6.0788639530074e-05;-0.00042734949965961;-0.0021444966550916;0.0011610254878178;-0.00058357056695968;0.00038715277332813;7.6382741099223e-05;0.00020697849686258;-3.6431851185625e-05;0.00011382472439436;1.6927882825257e-05;-4.7463439841522e-05;2.349651822442e-06;1.787915971363e-05;0.00012244752724655;7.963949610712e-05;-0.00049952237168327;-0.00036911788629368;-0.00011332817666698;0.00043821457074955;0.00022752297809348;9.0936300694011e-05;-0.00011467430158518;-0.00010109857248608;6.825433956692e-05;0.00014746247325093;1.1593477211136e-05;-7.9733697930351e-05;-4.8379115469288e-05;-8.0525613157079e-05;-0.0016046378295869;-0.00012827001046389;-6.0369915445335e-05;0.0012903532478958;0.00072962464764714;0.00012459421122912;0.00012071985111106;1.0275277418259e-05;-0.00018185641965829;5.4200016165851e-05;-5.2525379032886e-06;-0.00010855314758373;-4.0747647290118e-05;8.4013423474971e-05;-9.59952831181e-06;-0.00018830006592907;-0.00015707177226432;-0.0021222762297839;-0.00038643745938316;-0.0013511067954823;-0.00047671914217062;0.0001354008418275;1.164787045127e-05;-0.00039555603871122;5.3867352107773e-06;-0.00042391571332701;-0.00011713755520759;0.0001277696719626;8.5368119471241e-05;-8.4653991507366e-05;-0.0016538011841476;-8.0607896961737e-06;0.00072615739190951;0.00061937666032463;0.0027566836215556;0.00052559608593583;0.0010427815141156;0.00011747993994504;0.00078695255797356;0.00024509648210369;0.00020368208060972;3.3631888072705e-05;-9.2525828222279e-05;-3.9862938137958e-05;-9.8365329904482e-05;5.6977311032824e-05;2.1489538994501e-05;0.00014414300676435;0.001646502292715;-0.0011851357994601;0.00037168891867623;-0.00098876503761858;-9.3381975602824e-05;4.3551455746638e-05;0.000411236891523;-0.00032802467467263;3.6549583455781e-05;-0.00019853716366924;-3.6849934986094e-05;0.00016587742720731;2.8846408895333e-05;0.0004969026776962;0.0007338059367612;5.4176271078177e-05;-0.00048390499432571;-0.0031114325392991;0.0022368426434696;-0.00088394962949678;0.0006402584258467;2.3226219127537e-05;0.00025706659653224;-8.6128566181287e-05;0.00015114828420337;3.6967110645492e-05;-6.2781233282294e-05;1.4628042663389e-05;2.0615590983653e-05;0.00017726680380292;0.00015099353913683;-0.00066680728923529;-0.00053680647397414;7.5522162660491e-05;0.00056669436162338;0.00027275402680971;0.00015856804384384;-0.00017583626322448;-0.0001553698675707;0.00013097850023769;0.0001916157634696;5.9102412706125e-06;-8.7210944911931e-05;-9.5336865342688e-05;6.7120847234037e-05;-0.0024365319404751;-0.00019661655824166;-0.00016222869453486;0.0016455178847536;0.001147054717876;0.00019145836995449;0.00017158477567136;-9.455574763706e-05;-0.00024639404728077;6.0611659137066e-05;1.2277453606657e-05;-0.00013567657151725;-7.1801499871071e-05;9.3586575530935e-05;-3.5739435588766e-06;-0.00022414591512643;-0.00016909436089918;-0.0026003536768258;-0.00084134377539158;-0.0017715500434861;-0.00097658089362085;0.00014343029761221;1.9546381736291e-05;-0.00048347527626902;-8.0582067312207e-05;-0.00056506850523874;-0.00024900029529817;0.0001856631715782;0.00017902255058289;-7.2712580731604e-05;-0.0019955483730882;0.00019038876052946;0.00084954046178609;0.000687449821271;0.0032582809217274;0.0011336237657815;0.0012836856767535;0.00033578113652766;0.0010341282468289;0.000474344502436;0.0002662671613507;0.00010192810441367;-0.00011924919090234;-8.4388702816796e-05;-0.00010570680751698;8.3778984844685e-05;-2.5511801140965e-05;0.00010543441021582;0.0018749224254861;-0.001669522956945;0.00071072101127356;-0.001059950562194;-0.00016492560098413;0.00013605481944978;0.00050236703827977;-0.00040853445534594;0.00012148890527897;-0.00016027285892051;-7.3714705649763e-05;0.00013927415420767;-6.9686429924332e-06;5.7554061640985e-05;0.00032540783286095;0.00029794077272527;-0.00037643473478965;-0.0035628904588521;0.0033620810136199;-0.0010573054896668;0.0008335227612406;-8.2082813605666e-05;0.00020359153859317;-0.00014154150267132;0.00014825425751042;5.1793147576973e-05;-5.8823632571148e-05;3.2609903428238e-05;1.7933325580088e-05;0.0002077662065858;0.00021598281455226;-0.00071597762871534;-0.00062620255630463;0.00037842162419111;0.00054483383428305;0.00025223003467545;0.00020595699606929;-0.00021938845748082;-0.00019182727555744;0.00018755004566628;0.00018298343638889;-9.5635323305032e-07;-3.9174923585961e-05;-0.00015637508477084;0.00027242457144894;-0.0030132930260152;-0.00022520138008986;-0.00025997901684605;0.0016726587200537;0.0014943521237001;0.00023907482682262;0.00019465228251647;-0.00024585810024291;-0.0002660515892785;5.1529212214518e-05;4.723353049485e-05;-0.00013192878395785;-0.00010597951768432;7.405984797515e-05;1.4913166523911e-05;-0.00020903321274091;-0.00013334052346181;-0.0024349112063646;-0.0014383656671271;-0.0018230243586004;-0.0015439182752743;0.00010092563752551;1.6642885384499e-05;-0.00044510938460007;-0.0002215927670477;-0.00058635685127228;-0.0003921288298443;0.00021506054326892;0.00029090588213876;-3.2300693419529e-05;-0.0019137810450047;0.00045962483272888;0.00077490467811003;0.00057604326866567;0.0028788226190954;0.0019593311008066;0.0011987450998276;0.00063940876862034;0.0010630855103955;0.00071113725425676;0.00026914940099232;0.00018997219740413;-0.00012027328921249;-0.00013859670434613;-8.3631144661922e-05;8.0759149568621e-05;-5.7443325204076e-05;5.4274387366604e-05;0.0015562248881906;-0.0015650682616979;0.00074934813892469;-0.00082340458175167;-0.00015282303502318;0.00014433890464716;0.00043804894085042;-0.00035892621963285;0.0001512675662525;-9.2561727797147e-05;-8.3206163253635e-05;9.2227630375419e-05;-2.8905802537338e-05;-0.00026901019737124;-3.9376620406983e-05;0.000394305359805;-0.00020715389109682;-0.0029317019507289;0.0032468908466399;-0.00090856029419228;0.00075012218439952;-0.00013604511332233;0.00010923287482001;-0.00014381780056283;0.00010834044223884;4.8831425374374e-05;-4.2576761188684e-05;3.5623914300231e-05;1.1197370440641e-05;0.0001766871282598;0.0001999026426347;-0.00059698801487684;-0.00054417835781351;0.00046260500675999;0.00037400485598482;0.00018817375530489;0.00019515404710546;-0.0001962158276001;-0.00016640739340801;0.00018099986482412;0.00013465546362568;-1.2188190339657e-05;-1.7889863102027e-06;-0.00015030249778647;0.00028841814491898;-0.0026499184314162;-0.00018512662791181;-0.00024658182519488;0.0013246347662061;0.0013880823971704;0.00021671027934644;0.00016145878180396;-0.00027054830570705;-0.00020252871036064;3.3210875699297e-05;5.7388464483665e-05;-0.00010041758650914;-0.00010571705934126;4.4932323362445e-05;2.6445310140844e-05;-0.00016719003906474;-9.3394468422048e-05;-0.0017581423744559;-0.0015332624316216;-0.0014071284094825;-0.0015603620558977;5.7922388805309e-05;2.2827003704151e-05;-0.00030872941715643;-0.00026326286024414;-0.00045599666191265;-0.00039230674155988;0.00017456104978919;0.0002897052327171;-1.1959484254476e-05;-0.0015400219708681;0.00046724986168556;0.0006086541689001;0.00042809231672436;0.0019768427591771;0.0021340753883123;0.00085710053099319;0.00069943640846759;0.00082710257265717;0.00070472515653819;0.00020233019313309;0.00020140463311691;-9.0111010649707e-05;-0.00014153953816276;6.842875154689e-05;-8.4254148532636e-05;-0.00016709104238544;8.2093582022935e-05;-0.00060087034944445;0.00082303042290732;8.0248762969859e-05;0.0010811517713591;0.00018183233623859;-0.00023489112209063;-8.3147999248467e-05;0.0002594827383291;3.7866568163736e-05;0.00011009872832801;-0.00010935404861812;-0.00026682874886319;9.0894216555171e-05;-0.00014373465091921;-0.00082505715545267;0.00028970764833502;-0.00034752319334075;0.000861577806063;-0.00067206763196737;0.00026707898359746;-0.00047868452384137;2.6440628062119e-05;-0.00028021275647916;-2.4515878976672e-05;-0.00015862654254306;8.5367410065373e-06;0.00020839013450313;3.8255049730651e-05;-9.1506757598836e-05;-0.00010373477562098;0.0002360065409448;0.00024602116900496;0.00057549535995349;0.00028356068651192;-0.0017724820645526;-0.00018757540965453;0.0004605536814779;5.053724089521e-05;0.00011958874529228;0.00010604001727188;-8.4956212958787e-05;3.3939715649467e-05;0.00035026454133913;5.2077728469158e-05;-0.00031487693195231;0.00023801479255781;0.0002620376762934;-0.00050579046364874;-0.00053881597705185;0.0011722685303539;-0.00013123826647643;-0.00048505811719224;-0.00016933641745709;0.00035376989399083;-4.2192044929834e-05;0.00014397986524273;-2.0991941710236e-05;-0.00027385586872697;4.1236467950512e-05;5.1050526963081e-05;-0.00053529976867139;-5.8211444411427e-05;-0.00010163146362174;-0.0017382592195645;0.0004881544446107;-0.00091031042393297;0.00016326989862137;7.1293346991297e-05;0.0002154318644898;-0.00020269511151128;0.00019463815260679;5.8724494010676e-05;-0.0002097950928146;0.00011039181845263;-0.00014019620721228;-0.0029055145569146;-0.0013194709317759;0.0015954450936988;0.00059061165666208;0.00022782562882639;0.0042191608808935;-0.00018398255633656;0.00051897508092225;-0.00013562958338298;4.8480334953638e-05;-0.00016069332195912;2.1078576537548e-05;6.8853762059007e-05;-8.2932405348402e-05;7.6578202424571e-05;-0.00011144827294629;-0.00015038720448501;0.00011124573211418;-0.00066273892298341;0.0010598502121866;1.756226629368e-05;0.0011673984117806;0.00018219769117422;-0.00025227005244233;-0.00011155289394083;0.00032909607398324;1.6994672478177e-05;5.4112326324685e-05;-9.7205054771621e-05;-0.00033849073224701;0.00012871262151748;9.3830603873357e-05;-0.00072702276520431;0.00019055602024309;-0.00047158208326437;0.00091891776537523;-0.0010925147216767;0.00031922472408041;-0.0005990729550831;5.6262459111167e-05;-0.00018540763994679;-1.1784793059633e-05;-0.00017071029287763;1.284995619244e-06;0.00025836366694421;4.2397216020618e-05;-0.00010821738396771;-0.00013454638246913;0.00027676526224241;0.00032309084781446;0.0008030190365389;0.00026966087170877;-0.0020546212326735;-0.00023000955116004;0.00052053021499887;7.3647090175655e-05;0.00015623158833478;0.00010123397078132;-8.2499223935883e-05;5.3378338634502e-05;0.00041032547596842;7.0836445956957e-05;-0.00033425042056479;0.00044072791934013;0.00031822081655264;-0.00062465021619573;-0.00069246347993612;0.0011974591761827;-0.00016994164616335;-0.00061122252373025;-0.00016908136603888;0.00037648188299499;-4.5369637518888e-05;0.00015624609659426;-2.2599244402954e-05;-0.00031077992753126;5.7389777794015e-05;3.3973570680246e-05;-0.00060237490106374;-2.4537037461414e-05;-0.00020320429757703;-0.0015574638964608;0.00052194617455825;-0.00075931689934805;0.00020572812354658;3.0824263376417e-05;0.00021506613120437;-0.00014180161815602;0.00020398694323376;0.000150311505422;-0.0002445726422593;9.3591523182113e-05;-0.00012721441453323;-0.0030724303796887;-0.001502683153376;0.0017410441068932;0.00051078689284623;0.00036570397787727;0.0042963335290551;-0.00014813014422543;0.00037686215364374;-0.00013061240315437;-0.00010730218491517;-0.0001722712040646;-2.440277239657e-05;7.9517005360685e-05;-6.4747684518807e-05;5.0985247071367e-05;-8.3826744230464e-05;-7.1843016485218e-05;7.5845571700484e-05;-0.00042207486694679;0.00069230975350365;-1.3808741641697e-05;0.00072971358895302;0.0001065215546987;-0.00015297475329135;-8.4283477917779e-05;0.00023696350399405;6.9598008849425e-06;-4.7494442696916e-05;-4.9324662541039e-05;-0.0002813731553033;9.3673726951238e-05;0.00019577713101171;-0.00039064176962711;4.3473984987941e-05;-0.00032230399665423;0.00057801511138678;-0.00087638717377558;0.00021475442918018;-0.00039981011650525;3.9827878936194e-05;4.0545226511313e-05;-1.6564157476751e-06;-0.00010346786439186;-6.4192204263236e-06;0.00020232396491338;3.0333700124174e-05;-7.9367950093001e-05;-0.00011624878970906;0.00020383029186632;0.00025530290440656;0.00062446756055579;0.00017395241593476;-0.0015241550281644;-0.00017823817324825;0.00038580922409892;6.5635424107313e-05;0.00011955037916778;6.4851294155233e-05;-5.3669849876314e-05;4.6371609641938e-05;0.00028463755734265;5.8838282711804e-05;-0.00026404432719573;0.00039382424438372;0.00026315459399484;-0.00047467107651755;-0.00054191524395719;0.00085141137242317;-0.00013520514767151;-0.00045938772382215;-0.000112698180601;0.00027737152413465;-3.35046715918e-05;0.00010575073974906;-1.5500931112911e-05;-0.00021648606343661;4.7660414566053e-05;7.4256995503674e-06;-0.00042038180981763;7.4533527367748e-06;-0.00021290620497894;-0.00083583546802402;0.0003352994681336;-0.00033067326876335;0.00016135438636411;-1.5959474694682e-05;0.00012916805280838;-3.9668677345617e-05;0.00012809281179216;0.00014837530034129;-0.00017574647790752;2.1204583390499e-05;-6.6190186771564e-05;-0.0020072739571333;-0.0010629493044689;0.0011751115089282;0.00025688338791952;0.00034385244362056;0.0026809782721102;-5.6732045777608e-05;0.00013369365478866;-6.9658504799008e-05;-0.00016257693641819;-0.0001128758667619;-5.1781793445116e-05;5.6505505199311e-05;-1.1848985195684e-05;0.00019126593542751;-7.8840181231499e-05;-0.00022249641187955;0.00013212503108662;-0.0014038649387658;0.00043677553185262;-0.00062301830621436;6.2545179389417e-05;6.7100292653777e-05;-3.3161846658913e-05;-0.00049659988144413;8.8097192929126e-05;0.00021614271099679;9.3060543804313e-06;0.00051096157403663;-3.1717133879283e-06;-0.00024215917801484;-0.00050114223267883;0.00016932150174398;0.00079574040137231;4.9551721303942e-07;0.001488609937951;-0.00057018484221771;0.00088695797603577;-0.00024740947992541;-0.00042099348502234;-3.8623435102636e-05;0.00013061067147646;-4.4183125282871e-06;-0.0003271039458923;2.7132586183143e-05;-0.00013421842595562;3.591256972868e-05;0.00039869130705483;-0.00012828411126975;0.0022074817679822;0.00023241978487931;-0.0013581876410171;7.1780261350796e-05;0.00028902423218824;-0.00018583907512948;0.00031781653524376;4.6651857701363e-05;0.00025854218984023;-1.5786152289365e-05;0.00047770235687494;5.1629180234158e-05;0.00018578580056783;0.00036242516944185;0.00082591734826565;-0.0011875673662871;0.00013196862710174;-0.00028208375442773;-0.00071800826117396;-0.0012178107863292;-6.4266401750501e-05;-0.00033049168996513;-2.5740158889676e-05;5.1074628572678e-05;-7.7348786362563e-06;-0.0002895008365158;6.9581318484779e-07;-6.0841670347145e-05;7.3757873906288e-05;0.00019954337039962;-0.00054782960796729;-9.7468357125763e-05;-0.00033359369263053;-0.00024269302957691;0.00046916236169636;-2.1926216504653e-05;0.00020293515990488;0.00015981419710442;0.00014247743820306;0.00046165712410584;0.00012736323697027;0.00011174668907188;-0.00025015696883202;3.1474457500735e-05;-0.0022219133097678;-0.0013657076051459;-0.00018749028095044;0.001400493318215;0.0029152892529964;0.00044024278759025;-0.0004574496706482;-3.3739851801329e-07;-0.00063147785840556;-6.2962346419226e-05;-0.00013276183744892;-0.00013665306323674;-7.4936651799362e-05;9.0242348960601e-05;0.00019811076344922;-8.7529755546711e-05;-0.00023966940352693;0.00017491461767349;-0.0015887640183792;0.00052714353660122;-0.00079758267384022;3.0454199077212e-05;0.00011649183579721;-7.4252631748095e-05;-0.00052419246640056;8.8777211203706e-05;0.00012353173224255;-1.0136964334606e-07;0.00047323937178589;2.8290782211116e-05;-0.00025306854513474;-0.00037469615926966;0.00035334573476575;0.00085969350766391;-0.00010299899440724;0.0014731402043253;-0.00071287789614871;0.00098320795223117;-0.00027461029822007;-0.00022066562087275;-4.2459050746402e-05;0.00015536264982074;4.5290803427633e-06;-0.00031609626603313;1.9331997464178e-05;-0.00014265095524024;3.9704831579002e-05;0.00041614385554567;-0.00011266751243966;0.0022006477229297;0.00024484834284522;-0.0014788064872846;0.000116445866297;0.00032057106727734;-0.00019199389498681;0.00033509629429318;4.0673901821719e-05;0.00023894477635622;1.4449004765993e-06;0.00049070990644395;4.718315176433e-05;0.00017086915613618;0.00035811439738609;0.00079035939415917;-0.0011820745421574;0.00011891264148289;-0.00017982703866437;-0.00074062659405172;-0.0012610617559403;-7.1967355324887e-05;-0.00026680942391977;-4.8703146603657e-05;6.3458763179369e-05;-1.0239750736218e-05;-0.00030467714532278;-2.0233112536516e-06;-3.3703465305734e-05;6.8382592871785e-05;0.0001532662572572;-0.00058144360082224;-0.00056581589160487;-0.00028900583856739;-0.00043431526864879;0.00055393681395799;5.155907729204e-06;0.00021134880080353;7.1270696935244e-05;0.00017358335026074;0.00042695179581642;0.0001576042996021;0.00013373022375163;-0.00027250434504822;-8.0449481174583e-06;-0.0025908064562827;-0.0015239749336615;-2.348953330511e-06;0.0015519871376455;0.0035914320033044;0.00039608014049008;-0.00024173251586035;-4.8979454732034e-05;-0.00054424605332315;-9.4804192485753e-05;-0.00010514874884393;-0.00015696370974183;-9.8748139862437e-05;9.7856347565539e-05;0.00012695242185146;-6.0112557548564e-05;-0.00015475098916795;0.00013923201186117;-0.0010485186940059;0.00036818301305175;-0.00056437123566866;-1.7719567040331e-05;8.8995031546801e-05;-6.3886946009006e-05;-0.00033990715746768;5.1047274610028e-05;3.8604055589531e-05;-1.2374139259919e-05;0.00028450982063077;3.5714176192414e-05;-0.00015920330770314;-0.00011752024875022;0.00033904780866578;0.00055050675291568;-0.00014424786786549;0.00084082479588687;-0.00051134137902409;0.00065343477763236;-0.00017792168364394;-6.0553116782103e-05;-1.8312957763555e-05;0.0001082312737708;1.1692000043695e-05;-0.00019389619410504;7.6628339229501e-06;-9.6544339612592e-05;2.6842675652006e-05;0.0002801617665682;-5.6924011005322e-05;0.0014386397087947;0.00016562831297051;-0.00098197825718671;0.00010344503971282;0.00021756134810857;-0.00012502857134677;0.00022734778758604;2.0183610104141e-05;0.00015236121544149;9.8060863820137e-06;0.00031944652437232;2.6681047529564e-05;0.00010667205060599;0.00027808552840725;0.00048239072202705;-0.00077767798211426;4.4426487875171e-05;-0.00010880375339184;-0.00049318943638355;-0.00084257149137557;-4.8051308112917e-05;-0.0001566923892824;-4.4926138798473e-05;4.338557846495e-05;-6.7204387050879e-06;-0.0002015780628426;-2.3792626961949e-06;-4.1974899431807e-06;3.9802052924642e-05;6.8490393459797e-05;-0.00039006685256027;-0.00069183885352686;-0.00014927405572962;-0.00042679303442128;0.00041488805436529;3.3263186196564e-05;0.00013309648784343;-1.7393373127561e-05;0.0001303895842284;0.00023362012871075;0.00012185288505862;9.2570189735852e-05;-0.00018510541121941;-2.9172426366131e-05;-0.0018810096662492;-0.0010727235348895;0.00011737119348254;0.0010794908739626;0.0027476090472192;0.00021209953411017;1.1334416285536e-06;-6.3794526795391e-05;-0.00025978658231907;-8.6012179963291e-05;-4.3403495510574e-05;-0.0001132593897637;-7.7783312008251e-05;6.5937325416598e-05;-7.9863501014188e-05;5.4786662076367e-05;1.2793857422366e-05;9.0348687081132e-05;0.0014503212878481;-0.0012235236354172;0.000608075177297;-0.00098890182562172;-0.00012999289901927;0.0001029625418596;0.0003649934369605;-0.00030193934799172;9.0521069068927e-05;-0.00017373690207023;-8.2635269791353e-05;0.00015623999934178;1.0594883860904e-05;0.00023176544345915;0.0003986784722656;0.00012054790568072;-0.00033596812863834;-0.0028922085184604;0.0024990399833769;-0.00078085763379931;0.00061525515047833;-6.7340923123993e-05;0.00023278783191927;-0.0001090599107556;0.00013820012100041;5.3766274504596e-05;-6.565019430127e-05;8.6813415691722e-06;7.608409759996e-06;0.00021829378965776;0.00020696026331279;-0.00019694185175467;-0.00018486705084797;0.00030017466633581;0.00053402344929054;0.00016237406816799;0.00010848249075934;-0.00010739565914264;-0.00010990696318913;0.00015649938723072;0.00015777711814735;5.8686437114375e-06;-4.90842248837e-05;-0.00010571415623417;0.00077871716348454;-0.0018582238117233;-0.00037605670513585;-0.00036846537841484;0.00071808428037912;0.00050258752889931;1.3472288628691e-05;3.9295522583416e-05;-0.00021315227786545;-0.00024625100195408;2.8683447453659e-05;1.9461436750134e-05;-9.2287482402753e-05;-5.869877350051e-05;6.4100611780304e-05;2.9806352586093e-07;-0.00010686413588701;-6.0605398175539e-05;-0.0020497958175838;-0.00093170622130856;-0.0013804285554215;-0.00092325231526047;0.00012798036914319;3.9148897485575e-05;-0.00040104342042468;-0.0001439210755052;-0.00042709079571068;-0.00022584685939364;0.00014290223771241;0.00016263066208921;-8.9541190391174e-06;-0.0011842743260786;3.9678096072748e-05;0.00044607935706154;0.00031290564220399;0.0024878887925297;0.0012207487598062;0.0010072244331241;0.00040035220445134;0.00081592780770734;0.0004498811904341;0.00021893125085626;0.0001182940977742;-0.00011206591443624;-9.9123419204261e-05;-0.00010158216173295;8.5957020928618e-05;2.5195017769875e-06;4.6053082769504e-05;0.001927308505401;-0.0018489309586585;0.0010574655607343;-0.0013442541239783;-0.00020284629135858;0.00019427394727245;0.00049498252337798;-0.00040723057463765;0.00019184434495401;-0.00019701130804606;-0.00014892056060489;0.00019731724751182;-1.2904489267385e-05;-0.00010860960901482;0.00015757995424792;0.00027468640473671;-0.00023883210087661;-0.0038154823705554;0.0039216447621584;-0.0010585723211989;0.00086994405137375;-0.00019642857660074;0.00027528300415725;-0.00017919923993759;0.00017021899111569;8.477053779643e-05;-9.1044821601827e-05;1.733091994538e-05;1.4325530628412e-06;0.00031821554875933;0.00031186462729238;-8.267599332612e-05;-6.0627913626377e-05;0.00061442336300388;0.0006936673889868;0.00015172353596427;0.00013792059326079;-0.00012973387492821;-0.00011921698023798;0.0002332258009119;0.00019541206711438;-5.96506652073e-06;-3.7052828702144e-05;-0.00017119443509728;0.0014728596433997;-0.0023303625639528;-0.00059175898786634;-0.00059968797722831;0.00049732025945559;0.00037948545650579;-3.4878055885201e-05;-3.2605508749839e-05;-0.00037394629907794;-0.00033199557219632;1.8461470972397e-05;3.3888911275426e-05;-9.5012866950128e-05;-8.0517267633695e-05;5.4528260079678e-05;9.8253358373768e-06;-5.5713422625558e-05;8.195822374546e-06;-0.0022249144967645;-0.0015455229440704;-0.0015385348815471;-0.0014513997593895;0.00012720651284326;8.0518737377133e-05;-0.00045322152436711;-0.00029221686418168;-0.00048811821034178;-0.00035898105124943;0.00016544816025998;0.00024587233201601;5.5401298595825e-05;-0.00092498975573108;9.0228830231354e-05;0.00026489578885958;9.9612698249985e-05;0.0024970488157123;0.0020066588185728;0.0011084392899647;0.00070729909930378;0.00093774648848921;0.00070371280889958;0.00025542665389366;0.00020848408166785;-0.0001323786273133;-0.00016055813466664;-8.5518819105346e-05;8.5633480921388e-05;-3.5425451642368e-05;3.198017793693e-06;0.0017295978032053;-0.0018062583403662;0.0011016051284969;-0.0012011631624773;-0.00018990397802554;0.00020197220146656;0.00046384890447371;-0.00037341180723161;0.0002274657599628;-0.00014372242731042;-0.00015866359171923;0.0001711782097118;-3.5750406823354e-05;-0.00045432994375005;-0.00013917796604801;0.00039707979885861;-8.8563530880492e-05;-0.0033723881933838;0.0039644269272685;-0.00098115089349449;0.00081483612302691;-0.00024930585641414;0.00020238167780917;-0.0001884262310341;0.00014139707491267;8.2274083979428e-05;-8.3734776126221e-05;2.030663563346e-05;-5.3483854571823e-06;0.00031090938136913;0.00030160206370056;-2.9623319278471e-05;3.4633831091924e-05;0.00067174469586462;0.00058643001830205;0.00010980227671098;0.00013583723921329;-0.00012615881860256;-9.2210691946093e-05;0.00022675050422549;0.00017063674749807;-1.5087340216269e-05;-1.0894133993133e-05;-0.00016591434541624;0.001519002020359;-0.0021043526940048;-0.00059532927116379;-0.00059621490072459;0.00029548953170888;0.00026512690237723;-3.2307394576492e-05;-7.929509592941e-05;-0.00038692919770256;-0.00029847931000404;1.0008116987592e-05;3.8247217162279e-05;-7.5311909313314e-05;-8.3070415712427e-05;3.2538064260734e-05;2.26623560593e-05;-3.622147050919e-05;3.0877123208484e-05;-0.0017192478990182;-0.001748382113874;-0.0012076980201527;-0.0015720108058304;8.8036184024531e-05;0.00010860266775126;-0.00034763509756885;-0.00034415285335854;-0.00038763668271713;-0.00037922480260022;0.00013310214853846;0.00025469184038229;6.4919731812552e-05;-0.00075308204395697;6.615006714128e-05;0.00018360816466156;2.7370764655643e-05;0.0018091491656378;0.0023633884266019;0.00085223658243194;0.00080416438868269;0.00075629324419424;0.00074762589065358;0.00020197797857691;0.00022984466340858;-0.00010802035831148;-0.00017392729932908;-4.1296745621366e-05;5.0028145778924e-05;-5.9048146795249e-05;-7.5015659604105e-06;0.00095022690948099;-0.0010797961149365;0.00069544283905998;-0.00068146409466863;-0.00010558529174887;0.00012597830209415;0.0002740666968748;-0.00021394579380285;0.00016015903383959;-6.309719174169e-05;-0.00010542103700573;9.8120581242256e-05;-3.6566187191056e-05;-0.00048169502406381;-0.00023243925534189;0.00035251237568446;-2.3679325522608e-07;-0.0018473970703781;0.0024821946863085;-0.00056541711091995;0.00046909699449316;-0.00017556495731696;8.7892440205906e-05;-0.00012344947026577;7.5042575190309e-05;4.9310216127196e-05;-5.0150021706941e-05;1.1969306797255e-05;-8.9932846094598e-06;0.00020141004642937;0.00018977832223754;2.2272079149843e-05;0.00010263809235767;0.00042954986565746;0.0003071226819884;4.8119632992893e-05;8.5411222244147e-05;-7.821069448255e-05;-3.9398451917805e-05;0.000136782793561;9.8461539892014e-05;-9.3001744971843e-06;8.4856746980222e-06;-9.0141300461255e-05;0.00099711120128632;-0.0011771034915;-0.00040591639117338;-0.00039456321974285;8.4171282651369e-05;7.7669792517554e-05;-2.3404236344504e-05;-8.848101424519e-05;-0.00024569855304435;-0.00017489424499217;5.3640096666641e-06;2.5681643819553e-05;-4.0439521399094e-05;-5.5454642279074e-05;1.3463896721078e-05;2.4416365704383e-05;-3.8302958273562e-05;1.1952672139159e-05;-0.00086610787548125;-0.0012748292647302;-0.00058323953999206;-0.0010802561882883;3.993871723651e-05;0.00010090759315062;-0.00016330867947545;-0.00024690822465345;-0.00018028664635494;-0.00024515151744708;6.4454106905032e-05;0.00016188515292015;2.4074937755358e-05;-0.00060467125149444;-5.4928623285377e-05;0.000175809909706;7.1137699706014e-05;0.00088998203864321;0.0018308992730454;0.00041081351810135;0.00057151593500748;0.00037378922570497;0.00050291384104639;9.4594623078592e-05;0.00015525595517829;-5.8281999372412e-05;-0.0001215326556121;6.7717330239248e-05;-9.8587181128096e-05;-0.00016691020573489;0.00011295296280878;-0.00053418060997501;0.00098330480977893;2.9847311452613e-05;0.00088743621017784;0.00013763109745923;-0.00018712900055107;-7.4966228567064e-05;0.00028752305661328;1.7421703887521e-05;8.0983467341866e-05;-7.9940778960008e-05;-0.00024891720386222;0.00011809054558398;-2.1655585442204e-05;-0.00058327888837084;0.00024816376389936;-0.00045082636643201;0.00072460557566956;-0.00081125658471137;0.00024986985954456;-0.00055880716536194;4.122143946006e-05;-0.00020546159066726;-1.7256459614146e-05;-0.00014540836855303;3.8749226405344e-06;0.00019393805996515;3.1002877221908e-05;-8.9866007328965e-05;-6.0752539866371e-05;0.00023479103401769;0.00024891449720599;0.0009053917019628;0.00019157417409588;-0.0014718789607286;-0.00017426130943932;0.00037343733129092;3.7133937439648e-05;0.00015083808102645;6.6435604821891e-05;-7.3402693487878e-06;4.397934753797e-05;0.00035755385761149;7.2303482738789e-05;-5.3594540077029e-06;0.00039561121957377;0.00011815399921034;-0.00059554137988016;-0.00055044726468623;0.00058001792058349;-0.00011365811951691;-0.00058320281095803;-0.00012192084250273;0.00015567080117762;-2.3664444597671e-05;0.00010996388300555;-1.8410733900964e-05;-0.00025646967696957;4.8455753130838e-05;2.5157365598716e-05;-0.00051465292926878;-2.385671450611e-06;-0.00011519924009917;-0.0013596339849755;0.0004831091791857;-0.00085470778867602;0.00014141020074021;8.7754997366574e-05;0.00019194078049622;-0.000130954242195;0.00018632260616869;0.00011049853492295;-0.00019644761050586;0.00013011813280173;-0.00010491057037143;-0.0026436899788678;-0.0012465688632801;0.001488936599344;0.00040934042772278;0.00021665674285032;0.0038388867396861;-0.000152081149281;0.00031718643731438;-0.00013914902228862;-3.6544333852362e-05;-0.00015060497389641;7.2053549047268e-06;6.3963278080337e-05;-9.941262396751e-05;8.4196348325349e-05;-0.000136011352879;-0.00020044615666848;0.00016751367365941;-0.00063236791174859;0.0013738648267463;-1.5691748558311e-05;0.0009961158502847;0.0001419377658749;-0.00020486177527346;-9.4858827651478e-05;0.00038652657531202;-2.2005590949448e-07;7.8006385592744e-05;-7.6590455137193e-05;-0.0003071287937928;0.000172418076545;0.00012109414092265;-0.00053526950068772;0.000249050965067;-0.00065425795037299;0.00082038633991033;-0.0011997405672446;0.00031242708791979;-0.00076860515400767;7.0687026891392e-05;-0.00020018662326038;-1.2060650988133e-05;-0.00017479706730228;8.4026504509893e-07;0.00023802928626537;3.4177217457909e-05;-0.00011265357898083;-5.7611261581769e-05;0.00029587605968118;0.00031623171526007;0.0013651264598593;0.00016962371591944;-0.0016583275282755;-0.00021238639601506;0.00041117012733594;4.1780724131968e-05;0.00021146355720703;5.3249554184731e-05;4.3492946133483e-05;6.3735882577021e-05;0.00045716259046458;0.00010943174129352;0.00018003837612923;0.00062392768450081;6.9299261667766e-05;-0.00081603776197881;-0.00070461712311953;0.00033867821912281;-0.00013209928874858;-0.00080168334534392;-0.00011620366421994;6.2078761402518e-05;-1.7778349501896e-05;0.00011544395965757;-2.0704886992462e-05;-0.00031188540742733;6.7541994212661e-05;1.1471615835035e-05;-0.00063582923030481;3.793651558226e-05;-0.00017129987827502;-0.0013946725521237;0.00059496314497665;-0.00099292770028114;0.00016559055075049;0.00011383349919925;0.00022216785873752;-0.00010561314411461;0.00022537655604538;0.00018531995010562;-0.000238171312958;0.00017388562264387;-0.00010622798436088;-0.0031274133361876;-0.0015139315510169;0.0018003683071584;0.00037931487895548;0.00028980206116103;0.0044846525415778;-0.00016010762192309;0.00023678263823967;-0.0001723895984469;-0.00012767620501108;-0.0001812676055124;-6.5824006014736e-06;7.7252858318388e-05;-0.00013215055514593;0.00018609581456985;-7.2448274295311e-05;-0.00023534016509075;0.00013999955262989;-0.0014653005637228;0.00036052856012248;-0.00045625178609043;8.6057007138152e-05;2.447346378176e-05;6.0172746998433e-06;-0.00047966709826142;7.1480171754956e-05;0.00019230325415265;2.5101877326961e-05;0.00046543654752895;-2.5144496248686e-05;-0.00025625646230765;-0.00053962919628248;-7.6220740083954e-06;0.00085286586545408;3.9681067391939e-06;0.0014707887312397;-0.00042290447163396;0.00089753448264673;-0.00022158371575642;-0.0004019777989015;-4.3596173782134e-05;0.00011996258399449;-7.1722784014128e-06;-0.00029384653316811;2.6127892851946e-05;-0.00011436825298006;2.5923911380232e-05;0.00035981644759886;-8.6749372712802e-05;0.0023690119851381;0.00017971386841964;-0.00095922726904973;-1.3301470971783e-05;0.00017680697783362;-0.00014154419477563;0.0002971911453642;2.7460535420687e-05;0.00033298940979876;-4.3700169044314e-05;0.00049293116899207;4.8017765948316e-05;0.00019489214173518;0.00057469651801512;0.00083335104864091;-0.001197446603328;1.3824671441398e-05;-0.00074562866939232;-0.00060965382726863;-0.00118931918405;-3.1914674764266e-05;-0.00057221786119044;1.8281270968146e-05;2.3230053557199e-05;8.0211939348374e-06;-0.00027348232106306;2.3936295292515e-06;-8.8358319771942e-05;7.5703086622525e-05;0.0002644355117809;-0.00050599314272404;0.00035519083030522;-0.00030347384745255;-0.0002390815934632;0.00041498837526888;-7.3050246101047e-06;0.00016368628712371;0.00023238906578626;0.00012109982344555;0.00048855011118576;0.00010332808597013;0.00015791211626492;-0.00021704834944103;7.2021430241875e-05;-0.001833647955209;-0.0011338839540258;-0.0004002497298643;0.0012318277731538;0.0023660329170525;0.00035076023777947;-0.00068097468465567;1.8279095456819e-05;-0.00068696850212291;-5.1115741371177e-05;-0.00012897347914986;-0.00011856610217365;-0.00010201046825387;8.1446160038467e-05;0.00018946468480863;-7.816961442586e-05;-0.00025262398412451;0.00017209493671544;-0.0016291472129524;0.00042118871351704;-0.00056704872986302;7.2237678978126e-05;6.5497377363499e-05;-2.6418876586831e-05;-0.00049743964336812;6.9831039581914e-05;9.6820775070228e-05;2.1868412659387e-05;0.00040111891576089;-7.6895946676814e-07;-0.00025849379017018;-0.00043000117875636;0.00010321268200641;0.00089878920698538;-8.1836245954037e-05;0.0014456792268902;-0.00051602919120342;0.00098328082822263;-0.00023756879090797;-0.00020052208856214;-5.2590050472645e-05;0.00013673056673724;-1.3864478205505e-06;-0.00026627330225892;1.8503036699258e-05;-0.00011829602590296;2.77482013189e-05;0.0003605809470173;-6.1264130636118e-05;0.0023046177811921;0.0001915282336995;-0.00098794535733759;8.4263292592368e-06;0.00018937766435556;-0.00014399306382984;0.00031204789411277;1.9037634046981e-05;0.00031050515826792;-3.2296931749443e-05;0.00047575196367688;4.8170779336942e-05;0.00017178058624268;0.00058893515961245;0.0008064538706094;-0.00114172603935;-2.0424020476639e-05;-0.00071753311203793;-0.00061347096925601;-0.001202886691317;-3.8026373658795e-05;-0.00050392927369103;2.4561450118199e-06;2.6014286049758e-05;8.8059505287674e-06;-0.00026931325555779;-1.1333451084283e-06;-6.3082181441132e-05;6.8175831984263e-05;0.00021770916646346;-0.00050580612150952;-3.000291690114e-05;-0.00025075123994611;-0.00038314377889037;0.00047761265886948;2.1645239030477e-05;0.00016013902495615;0.00015423046716023;0.00013911879796069;0.000448666367447;0.00012691578012891;0.00017075959476642;-0.00022614959743805;3.4952809073729e-05;-0.0020383780356497;-0.0012238520430401;-0.00023321635671891;0.0012899185530841;0.0028032516129315;0.00029679556610063;-0.00048914639046416;-2.2673184503219e-05;-0.00059239641996101;-8.1476573541295e-05;-0.00010218012903351;-0.00013005897926632;-0.0001213650975842;8.3787403127644e-05;-9.1294205049053e-05;8.1651349319145e-05;9.7516822279431e-05;-8.0399426224176e-05;0.0017024148255587;-0.0017513752682135;0.001204832457006;-0.0013940065400675;-0.00021171353000682;0.00022465270012617;0.00039152448880486;-0.00032251226366498;0.00021921361621935;-0.0001960018707905;-0.00018975409329869;0.0002137788978871;-1.1057769370382e-05;-0.00023927193251438;-2.2818632714916e-05;5.6560365919722e-05;6.1540376918856e-05;-0.0034390294458717;0.0038148439489305;-0.00088814448099583;0.00076241983333603;-0.00026827008696273;0.0003002556913998;-0.00017455162014812;0.00015325823915191;9.8142263595946e-05;-0.00010240454139421;9.7555239335634e-06;-7.9159281085595e-06;0.0003223318781238;0.00031304056756198;0.00044215226080269;0.00044240537681617;0.00073764397529885;0.00074481684714556;2.6993870051228e-05;3.9865954022389e-05;-2.0330258848844e-05;-2.3970467736945e-05;0.00021945155458525;0.00016733685333747;-2.0157458493486e-05;-3.6260371416574e-05;-0.00020867632701993;0.0022447207011282;-0.0012864422751591;-0.00068507966352627;-0.00069121504202485;-0.00067521200980991;-0.00075833039591089;-0.00025975101743825;-0.0002323128428543;-0.00039842407568358;-0.00032778718741611;-2.0702613255708e-05;9.4425122370012e-06;-3.3626864023972e-05;-3.3763120882213e-05;1.6948670236161e-05;-5.0260946409253e-06;0.00016948372649495;0.00020061695249751;-0.001479274709709;-0.0012271848972887;-0.00094071746570989;-0.0010491417488083;0.00010073203156935;0.00010192637273576;-0.00037822130252607;-0.00030548093491234;-0.00031860591843724;-0.00027499921270646;8.8684690126684e-05;0.00015858715050854;0.00017860224761534;0.00085979927098379;-8.8304994278587e-05;-0.00055773713393137;-0.0006379279657267;0.0013227207819;0.0013077480252832;0.00079149269731715;0.00061646592803299;0.00064205774106085;0.00056472717551515;0.0002000606036745;0.00019269640324637;-0.00010840319737326;-0.00014232464309316;-8.4505954873748e-05;8.1571924965829e-05;7.4696843512356e-05;-9.6853007562459e-05;0.0016352668171749;-0.0017259218730032;0.0012122391490266;-0.0013340696459636;-0.00020299128664192;0.00022451937547885;0.00038582805427723;-0.00030752859311178;0.0002374976320425;-0.00016927249089349;-0.00019049052207265;0.00020639713329729;-2.3671471353737e-05;-0.00042132590897381;-0.00014559301780537;0.00013082211080473;0.00012676938786171;-0.0032518717925996;0.0038516239728779;-0.00087110768072307;0.0007340403390117;-0.00029157375684008;0.00026076132780872;-0.00017982005374506;0.00014020690286998;9.4785420515109e-05;-0.00010042934445664;1.1549238479347e-05;-1.0190800821874e-05;0.00032442342489958;0.00030143524054438;0.00042120466241613;0.00047267565969378;0.00074296171078458;0.00070661265635863;1.8058268324239e-05;4.1908824641723e-05;-2.9247208658489e-05;-1.1529556104506e-05;0.00021364336134866;0.00016089626296889;-2.3375563614536e-05;-2.6419262212585e-05;-0.00020701045286842;0.0022234413772821;-0.0012370307231322;-0.00068931782152504;-0.00066708587110043;-0.00067682302324101;-0.00078321486944333;-0.00023905918351375;-0.00025119032943621;-0.00039445408037864;-0.0003173844597768;-1.9753571905312e-05;9.8881773737958e-06;-2.9362254281295e-05;-3.6249995901017e-05;8.7604939835728e-06;2.4895623482735e-06;0.00016791539383121;0.00019785572658293;-0.0012836626265198;-0.0013545623514801;-0.00081102474359795;-0.0011419914662838;8.2561855379026e-05;0.00011872081813635;-0.00033452056231909;-0.00032924639526755;-0.00028036860749125;-0.00028945776284672;7.6246702519711e-05;0.00016841490287334;0.00017445742560085;0.0008390232687816;-9.748763841344e-05;-0.0005523330764845;-0.00062375690322369;0.0010578144574538;0.0015410359483212;0.0006909990333952;0.0006690351292491;0.000572006450966;0.00059835577849299;0.00017784908413887;0.00020400734501891;-9.7563082817942e-05;-0.00015157404413912;6.8375673436094e-05;-0.00012368481839076;-0.00017542502610013;0.00016812302055769;-0.00046746598673053;0.0013009291142225;-5.2990995754953e-05;0.00066358671756461;7.841234037187e-05;-0.00012763994163834;-6.7812201450579e-05;0.0003403797163628;-1.9224453353672e-05;5.1794937462546e-05;-3.8598038372584e-05;-0.00023325327492785;0.00017506585572846;0.00020392956503201;-0.0002409815788269;0.00018165745132137;-0.00065672269556671;0.00055902707390487;-0.0011093573411927;0.00024485416361131;-0.00070778070949018;7.1367794589605e-05;-0.00012578511086758;-4.874781552644e-06;-0.0001348119112663;-2.022033868343e-06;0.00018092752725352;2.034259341599e-05;-8.6639323853888e-05;-4.7850458031462e-06;0.00023462812532671;0.00023535676882602;0.0014322834322229;5.2771330956602e-05;-0.0010454645380378;-0.0001493485760875;0.00024239312915597;1.7050491806003e-05;0.00019175827037543;6.9235238697729e-06;0.00011584864842007;5.4665008065058e-05;0.00039625534554943;0.00010886091331486;0.00043028834625147;0.00062143860850483;-7.8193748777267e-05;-0.00075111637124792;-0.00054846092825755;-0.00027684879023582;-8.0631136370357e-05;-0.00073261081706733;-4.6485572966048e-05;-0.00016947007679846;3.0860087463225e-06;6.4678024500608e-05;-1.3766499250778e-05;-0.0002448070445098;6.3073610363062e-05;-1.9340730432305e-05;-0.00051060039550066;9.4546150648966e-05;-0.00014608500350732;-0.00072641886072233;0.00047045573592186;-0.00078642094740644;0.00011554617231013;0.00010282012226526;0.00016421035979874;-9.1073388830409e-06;0.00017090856272262;0.00020683502953034;-0.00018224609084427;0.00018281415395904;-4.6165605454007e-05;-0.0023169796913862;-0.0011342770885676;0.0013879607431591;0.00010631721670507;0.00020542253332678;0.0033064570743591;-0.0001041445939336;-2.7974048862234e-05;-0.00013557850616053;-0.00020420392684173;-0.00013885067892261;-1.7225313058589e-05;6.0320853663143e-05;-0.00013206955918577;0.00012633806909434;-5.2293034968898e-05;-0.00017690485401545;0.00012261647498235;-0.0011455102358013;0.00028174871113151;-0.00037302687996998;5.4152220400283e-05;4.8116497055162e-05;-1.9611670722952e-05;-0.00033382052788511;4.359551530797e-05;3.1504961953033e-05;1.8260068827658e-05;0.00023572405916639;1.4925307141311e-06;-0.00017379118071403;-0.0002693607530091;5.5208653066074e-05;0.00062049552798271;-7.3222916398663e-05;0.00096081849187613;-0.00033945773611777;0.00068429263774306;-0.00015776125655975;-7.0348825829569e-05;-4.0764312871033e-05;9.308238804806e-05;-7.893805218373e-07;-0.00016080359637272;1.0020372428698e-05;-7.5958792876918e-05;1.7083057173295e-05;0.00023057106591295;-2.5444045604672e-05;0.0015290501760319;0.00012262542441022;-0.00058728962903842;-7.2094007919077e-06;0.00010895888408413;-8.9277004008181e-05;0.00020901208335999;6.9353468461486e-06;0.00021113532420713;-2.3913007680676e-05;0.00030763921677135;3.2851789001143e-05;0.00010733610542957;0.00042978784767911;0.00053412863053381;-0.00073400465771556;-4.4787593651563e-05;-0.00055574649013579;-0.00038841078639962;-0.00079554202966392;-2.1839729015483e-05;-0.0003509336092975;5.6878784562286e-06;1.1713752428477e-05;9.2035343186581e-06;-0.00017160661809612;-1.7567052736922e-06;-3.9875169022707e-05;4.3226173147559e-05;0.00014219757576939;-0.0003231952432543;-3.5054610634688e-05;-0.00014651834499091;-0.00028078287141398;0.00032205478055403;2.40375429712e-05;9.7640979220159e-05;9.5732633781154e-05;9.1434878413565e-05;0.00029273104155436;8.5707164544147e-05;0.00012266961857677;-0.00014552532229573;2.0087067241548e-05;-0.0013181684771553;-0.00079003139398992;-0.0001467516849516;0.00082891760393977;0.0018480084836483;0.00016777450218797;-0.00031478476012126;-2.1592308257823e-05;-0.00037849301588722;-6.018835483701e-05;-6.1069717048667e-05;-8.5069259512238e-05;-8.9255852799397e-05;5.4136336984811e-05;-9.3760034360457e-05;8.1953294284176e-05;0.00025844044284895;-0.0002368695277255;0.0015311592724174;-0.0016217424999923;0.0012207028921694;-0.0013747736811638;-0.00020600401330739;0.00022866282961331;0.00027699969359674;-0.00022612139582634;0.00021301365632098;-0.00019736756803468;-0.00020129501353949;0.00021433040092234;4.9666459744913e-06;-0.00021346294670366;-7.7027005318087e-05;-0.00034151793806814;0.00041071145096794;-0.0030542151071131;0.003470083931461;-0.00072601425927132;0.00064926140476018;-0.00029452031594701;0.00032538524828851;-0.00014538282994181;0.00012719551159535;9.7164091130253e-05;-9.9956771009602e-05;1.5277180864359e-05;-4.1238554331358e-06;0.00023321600747295;0.00023814360611141;0.00065368140349165;0.00067660387139767;0.00074901402695104;0.00076029449701309;-5.3579857194563e-05;-3.7704568967456e-05;6.7237138864584e-05;4.9697493523126e-05;0.00017674569971859;0.00013192818732932;-4.4231706851861e-05;-5.1550578064052e-05;-0.00028456439031288;0.0024126044008881;-0.00048398159560747;-0.00047660150448792;-0.00051986594917253;-0.0013702951837331;-0.0014763660728931;-0.00037137608160265;-0.00033366665593348;-0.00033401141990907;-0.00028211914468557;-5.352411972126e-05;-1.7574173398316e-05;1.9266566596343e-05;1.142670862464e-05;-1.1121164789074e-05;-2.3899312509457e-05;0.00037070573307574;0.00036902690771967;-0.00084439432248473;-0.00074690231122077;-0.00045589308138005;-0.0005825653206557;6.5823456679936e-05;8.7622393039055e-05;-0.00032055645715445;-0.00027844283613376;-0.00020134575606789;-0.00019419673481025;2.3543918359792e-05;6.977825978538e-05;0.00028149670106359;0.0026866979897022;-7.8774712164886e-05;-0.0013350027147681;-0.0013353605754673;0.00021527531498577;0.00027088521164842;0.00053995318012312;0.00045834388583899;0.00042223787750117;0.00040939822793007;0.00015774970233906;0.00016175817290787;-7.7426397183444e-05;-0.00010441529593663;-8.8132917881012e-05;8.0714700743556e-05;0.00023830712598283;-0.00024364607816096;0.0014818421332166;-0.0015756220091134;0.0011982634896412;-0.0013260941486806;-0.00019599316874519;0.00022364674077835;0.00027495509129949;-0.00021229898266029;0.00022370443912223;-0.00017467299767304;-0.00019622848776635;0.00021197684691288;-7.4834028964688e-06;-0.00035417408798821;-0.00014340174675453;-0.00027403916465119;0.00045138041605242;-0.0029048097785562;0.0034665002021939;-0.00071875483263284;0.00061653897864744;-0.00030323007376865;0.00028866188949905;-0.00014728341193404;0.00011691457621055;9.1350309958216e-05;-9.8891723609995e-05;1.6461937775603e-05;-4.2318374653405e-06;0.00023728366068099;0.00021915353136137;0.00060158944688737;0.00067734165349975;0.00072428508428857;0.00073944916948676;-5.1540057029342e-05;-3.5315191780683e-05;5.3097675845493e-05;5.8030309446622e-05;0.00016816303832456;0.00012918695574626;-4.3093070416944e-05;-4.6960794861661e-05;-0.00028425952768885;0.0023373910225928;-0.00048282847274095;-0.00047542978427373;-0.00046943477354944;-0.0012869617203251;-0.0014653437538072;-0.00034092689747922;-0.00034007415524684;-0.00032026987173595;-0.00027536644483916;-4.8149642680073e-05;-1.8685166651267e-05;1.7726388250594e-05;9.7112861112691e-06;-1.501824499428e-05;-1.7128708350356e-05;0.00036166474455968;0.00035104420385323;-0.00073342229006812;-0.00084466184489429;-0.00038331336691044;-0.00066105037694797;5.2558767492883e-05;0.00010032995487563;-0.0002931448398158;-0.00028894274146296;-0.00017831465811469;-0.0002036194637185;1.7949107132154e-05;7.9041543358471e-05;0.00026802852516994;0.0025793712120503;-8.2332546298858e-05;-0.0012932987883687;-0.0012724234256893;8.0485355283599e-05;0.0004620561376214;0.000479718495626;0.00049051985843107;0.00037962466012686;0.00043561623897403;0.00014347514661495;0.00016726175090298;-7.0652640715707e-05;-0.00011142173025291;4.4126627471996e-05;-0.00013092714652885;-0.00013472104910761;0.00020139863772783;-0.00025358382845297;0.0015493865357712;-0.00016652552585583;0.00026763373170979;-4.1699058783706e-05;-9.508605216979e-06;-4.4770004024031e-05;0.00032825517700985;-7.9061319411267e-05;-8.4859922935721e-05;4.4559878006112e-05;-0.00024691087310202;0.00029233450186439;0.00076806399738416;0.00035927319549955;-8.7481792434119e-05;-0.0009606052772142;0.00014765243395232;-0.0015731487656012;0.00020121088891756;-0.00071384268812835;9.9194970971439e-05;0.00013017236778978;1.7957052477868e-05;-8.4623658040073e-05;-1.4594776985177e-05;0.00017564432346262;-4.2549077079457e-06;-3.7766592868138e-05;3.1499552278547e-05;0.00014880926755723;9.586923988536e-05;0.001870650681667;-0.00015985027130228;-0.00030213448917493;-5.0292303058086e-05;-1.3981287338538e-05;9.4811923645466e-07;0.00012605923984665;-7.4878109444398e-05;0.00026940365205519;3.4586621040944e-05;0.00047554072807543;0.00013634115748573;0.00073620997136459;0.00073818385135382;-0.00019953153969254;-0.0008071901393123;-0.00033931824145839;-0.0012050289660692;-1.0856088920264e-05;-0.00066306523513049;9.1011344920844e-05;-0.00071446620859206;3.0303493986139e-05;1.9265029550297e-05;9.5669906841067e-07;-0.00022302428260446;9.2975111328997e-05;-0.00014493097842205;-0.00043889405787922;0.00035164065775461;-0.00030096195405349;0.0014129457995296;0.00018220848869532;-0.00015885947505012;0.00010857602319447;-4.9557413149159e-05;5.8738656662172e-05;0.00037264538696036;3.1252257031156e-05;0.00047985737910494;-0.00013526511611417;0.00029148836620152;0.00015742353571113;-0.00093561154790223;-0.00049819808918983;0.00089023599866778;-0.00085211481200531;0.00022641530085821;0.00089595397002995;9.150528057944e-05;-0.0010589477606118;2.3434333343175e-05;-0.0008146510226652;-6.8141460360494e-05;-0.00012830240302719;5.5103457270889e-05;-0.000137963987072;9.0259447460994e-05;-2.2629068553215e-05;-0.00023537391098216;0.00012752374459524;-0.0016080896602944;0.00017093328642659;-0.00027754876646213;0.00017759905313142;0.00011116720270365;-2.1149544409127e-05;-0.00020619985298254;1.1093856301159e-05;-0.00019729550695047;9.4142182206269e-05;-0.00013664434663951;-2.4377650333918e-06;-0.00025381485465914;-0.00060753367142752;-0.0003400738351047;0.00098030362278223;1.4574979104509e-05;0.0011866447748616;-3.8808564568171e-05;0.00067571952240542;-0.00013377994764596;0.00052731769392267;-0.00012902975140605;5.0429967814125e-05;-1.8047749108518e-05;2.3181974029285e-05;-1.2434367818059e-05;2.5554782041581e-05;-9.4188080765889e-06;-3.3018426620401e-05;8.8044500444084e-05;0.00049000885337591;-3.7513549614232e-05;0.0001969861186808;-0.00015694893954787;-0.00010109962749993;3.6343088140711e-05;-1.7677906726021e-05;-2.8704798751278e-05;8.6429965449497e-05;-2.6903318939731e-05;0.0001368871453451;1.4689942872792e-05;-6.1847968026996e-05;0.00016841778415255;0.00020670327648986;3.195443059667e-05;-0.00011029175948352;-0.00062340148724616;9.915090049617e-05;-9.917846909957e-05;5.4636516324535e-06;-0.00031744738225825;6.084384949645e-05;1.7363894357914e-06;2.5841551178019e-05;-4.0066384826787e-05;-1.1537413229235e-05;-0.00010419321188238;3.9972212107386e-05;0.00027252617292106;-9.6674797532614e-05;0.0015750740421936;-0.00013822053733747;0.00017109667533077;-7.7240132668521e-05;-8.9804350864142e-05;4.5141929149395e-05;0.00035263487370685;-1.7754276996129e-05;0.00047135300701484;-4.5533084630733e-05;0.00025479053147137;-2.9079134037602e-05;9.0448498667683e-05;0.00012428002082743;0.00011094879300799;-0.00064011086942628;0.00012994238932151;-0.00063581793801859;9.5139585027937e-05;-0.0010629114694893;7.9261808423325e-05;-0.00073954579420388;7.5863958045375e-05;-0.0001068796555046;8.8467086243327e-06;-0.00013257210957818;1.9016051737708e-05;-0.00010654606012395;8.8587767095305e-05;0.0004845162620768;-0.00044315564446151;0.0013946084072813;-0.0014859443763271;0.0011231550015509;-0.0012524117482826;-0.00018717697821558;0.00021373636263888;0.00014648577780463;-0.00011321021156618;0.0001912800653372;-0.00019478860485833;-0.00017970397311728;0.00018447224283591;2.9652093871846e-05;-0.00011911051115021;-8.5850078903604e-05;-0.00091638707090169;0.00087479338981211;-0.0025556851178408;0.0029116051737219;-0.00056623935233802;0.00053216889500618;-0.00030739404610358;0.00034865128691308;-9.5524759672116e-05;8.5744541138411e-05;7.822008774383e-05;-7.8548691817559e-05;3.5011857107747e-05;1.1323953003739e-05;3.2027393899625e-05;7.2810616984498e-05;0.00053549878066406;0.00063395348843187;0.00065534008899704;0.00069683254696429;-9.7812080639414e-05;-9.1263631475158e-05;0.00013385886268225;0.00010673888027668;9.9923898233101e-05;7.874709990574e-05;-8.1613514339551e-05;-7.5815703894477e-05;-0.00038432015571743;0.0019128116546199;0.00010355885024182;6.073564873077e-05;-6.6765627707355e-05;-0.0015865827444941;-0.0017348721157759;-0.00035410979762673;-0.0003338186070323;-0.00017829328135122;-0.00017908433801495;-8.2493526861072e-05;-4.4978994992562e-05;6.9006666308269e-05;5.3643954743166e-05;-3.1470190151595e-05;-4.0395174437435e-05;0.00052972143748775;0.00050130247836933;-0.00023268657969311;-0.00019817889551632;-8.5140218288871e-06;-9.220856736647e-05;1.5274183169822e-05;4.6815384848742e-05;-0.00025224915589206;-0.00022555988107342;-0.00011269548122073;-0.00012436397082638;-4.1989336750703e-05;-2.1303201720002e-05;0.00035054355976172;0.0044921943917871;9.5318595413119e-05;-0.0020172756630927;-0.0019511786522344;-0.00094956153770909;-0.00095637387130409;0.0003003113088198;0.00027155785937794;0.00024318386567757;0.00025936571182683;0.00011265802459093;0.00011998420814052;-3.2537569495616e-05;-4.9689380830387e-05;-0.00010125560220331;8.7193970102817e-05;0.00046506963553838;-0.00044381699990481;0.0013603426050395;-0.0014398387866095;0.0010934973834082;-0.001219883793965;-0.00017846743867267;0.00020889907318633;0.00014743092469871;-0.00010218084207736;0.00020098112872802;-0.00017535797087476;-0.00017197176930495;0.00018589204410091;1.3265786947159e-05;-0.00024851370835677;-0.00012521918688435;-0.00084535236237571;0.00090720062144101;-0.0024345675483346;0.0029068174771965;-0.00056776823475957;0.00050049874698743;-0.00031377654522657;0.00031733253854327;-9.6917872724589e-05;7.8283665061463e-05;7.1570066211279e-05;-7.9386918514501e-05;3.4372616937617e-05;1.2100664207537e-05;4.4130516471341e-05;5.1734459702857e-05;0.00049279432278126;0.00062726717442274;0.00062175473431125;0.00069162290310487;-9.2664908152074e-05;-9.0106368588749e-05;0.0001194087381009;0.00011352754518157;9.2888069048058e-05;7.746306800982e-05;-7.6499964052346e-05;-7.5690637459047e-05;-0.00038039532955736;0.0018475037068129;9.2352966021281e-05;3.9466602174798e-05;-1.3652284906129e-05;-0.0014886242570356;-0.0017303578788415;-0.000328353169607;-0.00033543878816999;-0.00016758777201176;-0.00017462526739109;-7.5438707426656e-05;-4.7221550630638e-05;6.4444560848642e-05;5.3824373026146e-05;-3.4410099033266e-05;-3.3669239201117e-05;0.00052396999672055;0.00047369892126881;-0.0001617013476789;-0.00028220401145518;3.5186709283153e-05;-0.00015769629681017;5.2553677960532e-06;5.8122514019487e-05;-0.00023535953368992;-0.00022934428125154;-9.6988289442379e-05;-0.00013154222688172;-4.3331390770618e-05;-1.4568672668247e-05;0.00033552749664523;0.0043557086028159;8.9278735686094e-05;-0.0019754951354116;-0.001863757846877;-0.0010152503382415;-0.00079529569484293;0.00026124407304451;0.00029513277695514;0.00021265860414132;0.00028257313533686;0.00010369101073593;0.00012223541853018;-2.8913926144014e-05;-5.4754873417551e-05;2.1346397261368e-05;-0.00010628280142555;-0.0001325614284724;0.00020871625747532;-0.00016587995924056;0.001665819552727;-0.00019989513384644;0.0002137255796697;-5.0236107199453e-05;-2.8140166250523e-05;-1.8775195712806e-05;0.00025182380340993;-0.00011732671555365;-2.5990848371293e-06;4.6074525016593e-05;-8.9871107775252e-05;0.00034999806666747;0.00097906240262091;0.00053239375120029;-0.00017531496996526;-0.0011198851279914;-3.8963520637481e-05;-0.001642152084969;0.00017994425434154;-0.0006493532564491;0.00013153151667211;-0.00010124506661668;2.4333805413335e-05;-5.8771642216016e-05;-7.9470231639789e-07;9.3278198619373e-05;-2.1542633476201e-05;1.3546250556828e-05;6.4324231061619e-05;2.7930407668464e-05;-2.0357188986964e-05;0.0014558696420863;-0.0002191537496401;0.00019965325191151;3.5201494029025e-05;-0.0001655908417888;-1.3255062185635e-05;1.2741920727422e-05;-8.5527273768093e-05;0.00023699006123934;4.8627880460117e-06;0.00041089512524195;9.5218973001465e-05;0.00065413425909355;0.00052649428835139;-0.0002234919811599;-0.0005350389983505;-8.4705221524928e-05;-0.0012891843216494;2.7607871743385e-05;-0.00033898584661074;0.00013302032311913;-0.00079742976231501;3.4677465009736e-05;1.2208779480716e-05;6.8295089477033e-06;-0.00015794375212863;9.0578032541089e-05;-0.00018798754899763;-0.00032415983150713;0.00044846354285255;-0.00032844507950358;0.0024195646401495;-5.0638816901483e-05;0.00018227142572869;8.8398395746481e-05;-0.00014480308163911;-5.2871068874083e-06;0.00050647876923904;-7.0156929723453e-05;0.00058220059145242;-8.3714359789155e-05;0.00038257095729932;0.00024394317006227;2.478694113961e-05;3.5535613278626e-05;0.00046028807992116;-0.0012656709877774;0.00016834914276842;-0.00066520733525977;0.00018200352496933;-0.0014622519956902;0.00013476650929078;-0.001080441987142;-1.1923049896723e-05;-0.00015558081213385;4.5360011426965e-05;-0.00015929034270812;0.00010273357474944;-2.5109200578299e-05;-0.00027432435308583;0.0001560394448461;-0.0019409183878452;0.00021043435845058;-0.00033829748281278;0.00021586484217551;0.00013983376265969;-2.9244520192151e-05;-0.00022925960365683;1.1084614925494e-05;-0.00023309042444453;0.00011279615864623;-0.00017733736603986;-8.0882887232292e-07;-0.0003089192614425;-0.00071979634230956;-0.00040576083119959;0.001187453744933;8.9101149569615e-06;0.0014230503002182;-5.4151449148776e-05;0.00078180513810366;-0.00016013742424548;0.00065427494700998;-0.00015759625239298;5.4866282880539e-05;-2.067314744636e-05;3.1556613976136e-05;-1.5278836144716e-05;3.9729053241899e-05;-1.2497353964136e-05;-6.1863342125434e-05;0.00011844983964693;0.00046033511171117;-4.3954114516964e-05;0.00022558847558685;-0.00018759633530863;-0.00011655077832984;4.3953845306532e-05;-4.7433597501367e-05;-3.5846365790349e-05;7.4600931839086e-05;-2.5482560886303e-05;0.00014866763376631;1.941945629369e-05;-0.00010479031334398;0.00013935637252871;0.000227865006309;0.00013412670523394;-0.00012322382826824;-0.00068064086372033;0.00013972960005049;-4.6743945858907e-05;-1.8109121810994e-06;-0.00033394873025827;6.75097326166e-05;9.334560672869e-06;3.0840707040625e-05;-4.0244820411317e-05;-1.6879144823179e-05;-0.00012169974797871;4.6801702410448e-05;0.00031629326986149;-0.00010155460040551;0.0019113478483632;-0.00016227869491559;0.00021388741151895;-0.00010331407975173;-0.00011033075134037;5.4718850151403e-05;0.0004298756539356;-2.4880278942874e-05;0.00056992226745933;-5.3439114708453e-05;0.00030454431544058;-3.1319144909503e-05;9.5217517809942e-05;0.00014702443149872;0.00014594753156416;-0.00073325034463778;0.00014111948257778;-0.00080018542939797;0.00012482499005273;-0.0012944132322446;9.1252222773619e-05;-0.00089121528435498;9.0836161689367e-05;-0.00013092342123855;1.287809391215e-05;-0.00015798017557245;2.0292774934205e-05;9.9154065537732e-05;-2.1975891286274e-05;-0.0002816689084284;0.00018609639664646;-0.0022414347622544;0.00025535194436088;-0.00039366210694425;0.00025640203966759;0.00017330390983261;-4.0599239582662e-05;-0.00020145662711002;6.0160314205859e-06;-0.00023408405832015;0.00012707481801044;-0.00022748021001462;1.9178635284334e-06;-0.00036795041523874;-0.00079787702998146;-0.00046466398634948;0.0013892764691263;-1.292319939239e-05;0.0016334466636181;-8.5182880866341e-05;0.00078469055006281;-0.00018095540872309;0.00078158284304664;-0.00018635274318513;4.334879849921e-05;-2.0614415916498e-05;3.7846850318601e-05;-1.6627500372124e-05;6.8345099862199e-05;-1.6376316125388e-05;-0.00012006619363092;0.00017234658298548;0.00022560689831153;-5.0743048632285e-05;0.00023329678515438;-0.00022067583631724;-0.00012526135833468;5.2141342166578e-05;-0.00012835566303693;-4.6455515985144e-05;1.4329993973661e-05;-1.3309479982127e-05;0.00014193750394043;2.7535386834643e-05;-0.00020826354739256;3.860777724185e-06;0.0002242040791316;0.00039838528027758;-0.00011572914809221;-0.00063475430943072;0.00021480099530891;0.00013125222176313;-2.3637419872102e-05;-0.00028196958010085;6.7181979829911e-05;3.2296662539011e-05;3.6436555092223e-05;-3.0634728318546e-05;-2.7725978725357e-05;-0.00012765356223099;5.0659073167481e-05;0.00032812220160849;-7.7200129453558e-05;0.0022557654883713;-0.00017864935216494;0.00025766127509996;-0.00014386986731552;-0.00013106146070641;6.5486507082824e-05;0.00051121669821441;-3.7400353903649e-05;0.00066859280923381;-5.3316271078074e-05;0.00034917186712846;-2.7142037652084e-05;6.2122860981617e-05;0.00011486103903735;0.0001882378855953;-0.00072051165625453;0.00013992685126141;-0.00098433124367148;0.00018602647469379;-0.0015465054893866;8.9911722170655e-05;-0.0010383037151769;0.00010012541315518;-0.00015660093049519;1.9389462977415e-05;-0.00018040250870399;1.5670864740969e-05;-0.00012811255874112;0.00010129106522072;0.00075946247670799;-0.00068760639987886;0.0013324326137081;-0.0014017480425537;0.00096490659052506;-0.0010634053032845;-0.00016399219748564;0.00019001898181159;1.5113508197828e-05;1.5294785953301e-06;0.00016852490080055;-0.00019549789431039;-0.00013162594405003;0.00012657007027883;6.1500541050918e-05;2.2858748707222e-05;-7.4393850809429e-05;-0.0016326900804415;0.0014354146551341;-0.0020345221273601;0.0022701572161168;-0.00043272346374579;0.00043728528544307;-0.00032762897899374;0.00038194539956748;-3.5368466342334e-05;3.5691289667739e-05;4.4827196688857e-05;-4.0214683394879e-05;6.4486601331737e-05;3.4020813473035e-05;-0.00026222690939903;-0.00016222504200414;0.00015498648281209;0.00035943806869909;0.00049225217662752;0.00055824936134741;-0.0001103369431803;-0.00011738103785319;0.00018412619829178;0.00014687248039991;6.6155132572021e-07;1.0325198672945e-05;-0.00012793377391063;-0.00010186174040427;-0.00047784444177523;0.00088301853975281;0.00045331416185945;0.00084226409671828;0.00058130652178079;-0.0013950119027868;-0.0015638747718185;-0.00023036827042233;-0.00024569843662903;3.6865189031232e-05;-3.2344865758205e-05;-0.00010871407721424;-6.8418274167925e-05;0.00011387610720703;8.8177010184154e-05;-3.8841022615088e-05;-4.940648432239e-05;0.000612813513726;0.00057452620239928;0.00025427443324588;0.00028813304379582;0.00036304947570898;0.00035149560426362;-3.8310718082357e-05;-6.5926624301937e-06;-0.00017970992485061;-0.00016183248953894;-5.4681098845322e-05;-7.3377370426897e-05;-0.00010863057104871;-0.00010885806841543;0.0003688404976856;0.0060374336317182;0.00035541274701245;-0.0024895663373172;-0.0023929120507091;-0.0020112697966397;-0.0021410386543721;0.0001042560688802;0.0001022282303893;0.00012687742128037;0.00014449383888859;6.5535321482457e-05;7.3127273935825e-05;2.0161805878161e-05;1.2368292118481e-05;-0.00012349258759059;0.00010126982670045;0.0007434367435053;-0.00068755616666749;0.0013256981037557;-0.0013740306021646;0.00094202783657238;-0.0010554457549006;-0.00015859033737797;0.00018873358203564;2.0166235117358e-05;9.0348094090587e-06;0.00018359554815106;-0.00017873018805403;-0.00012132905976614;0.00013209984172136;3.5552919143811e-05;-0.00012600298214238;-0.00010250751074636;-0.0015542117180303;0.0014814040623605;-0.00194356078282;0.0023009974975139;-0.00045044149737805;0.00041025329846889;-0.00034305357257836;0.00035855217720382;-3.8066289562266e-05;3.0963085009716e-05;3.7320169212762e-05;-4.4086911657359e-05;6.1428458138835e-05;3.5457494959701e-05;-0.00023726416111458;-0.00018672655278351;0.0001407280942658;0.00035532106994651;0.00045923385187052;0.00057246978394687;-0.00010534381726757;-0.00011856917990372;0.00017112691421062;0.00015478453133255;-2.471284915373e-06;9.4428478405462e-06;-0.00011874576739501;-0.00010748706699815;-0.00046880624722689;0.00086047360673547;0.00044480583164841;0.00077955343294889;0.0006348104798235;-0.0013113002059981;-0.001594721688889;-0.00021589985408355;-0.00024677350302227;3.7945475924062e-05;-2.8904783903272e-05;-0.00010110977746081;-7.2525646828581e-05;0.00010729563655332;9.1772039013449e-05;-4.40348230768e-05;-4.2128591303481e-05;0.00062400713795796;0.00053977279458195;0.00031847960781306;0.00020788243273273;0.00039641090552323;0.00029739161254838;-4.7411798732355e-05;4.521402388491e-06;-0.00017194602696691;-0.00016259493713733;-4.3581399950199e-05;-8.1828882684931e-05;-0.00010694130469346;-0.00010626953735482;0.00036076348624192;0.0059358789585531;0.00034941214835271;-0.0024917270056903;-0.0023014883045107;-0.0020589183550328;-0.002013849793002;7.6450065535028e-05;0.00012562413758133;9.9403761851136e-05;0.00016999737999868;6.1596940213349e-05;7.3829927714542e-05;2.1630810806528e-05;9.6673693406046e-06;1.8423934307066e-05;-8.5252184362616e-05;-0.00010968434798997;0.00017773165018298;-0.00014299571921583;0.0013638657983392;-0.00016139280342031;0.00020066479919478;-2.6118232199224e-05;-4.4319072912913e-05;-1.5064966646605e-05;0.00020102060807403;-9.6561234386172e-05;4.0180009818869e-05;2.7250114726485e-05;-2.4827369998093e-05;0.00027150282403454;0.00075703178299591;0.00040614098543301;-0.00012069035437889;-0.00089833961101249;-2.0238145225449e-05;-0.0012893942184746;0.0001457107719034;-0.00054100749548525;0.00011336430907249;-0.00017366329848301;1.9513612642186e-05;-4.8864028940443e-05;3.578867563192e-06;5.2433049859246e-05;-1.5580026229145e-05;1.1218877261854e-05;5.9564001276158e-05;1.2856931789429e-05;-1.9669489120133e-05;0.001020384952426;-0.00016736859106459;0.00017531216144562;2.9153363357182e-05;-0.00012690004950855;-1.5062571947055e-05;1.1707814337569e-05;-6.1447157349903e-05;0.00016659765969962;4.8187821448664e-06;0.00028374654357322;5.4541473218706e-05;0.00047061668010429;0.00037541601341218;-0.00017455927445553;-0.00034394377144054;-4.0349936170969e-05;-0.00095681933453307;2.0919278540532e-05;-0.00024106625642162;9.7672964329831e-05;-0.00056208804016933;2.7469961423776e-05;6.0385432334442e-06;3.1690924515715e-06;-0.00010635062062647;6.6499429522082e-05;-0.00013971686712466;-0.00022936763707548;0.00033508977503516;-0.00023964933643583;0.0018183293286711;-4.7542580432491e-05;0.000147137165186;6.4869353082031e-05;-0.00011182520393049;-7.6328433351591e-06;0.00037985929520801;-5.6357243011007e-05;0.00044927219278179;-5.978588887956e-05;0.00029637882835232;0.00017727822705638;5.5104432249209e-05;4.9649333959678e-05;0.00031775937532075;-0.00093675486277789;0.00011954613000853;-0.00054969132179394;0.00013597572979052;-0.0011013847542927;0.00010405412467662;-0.00082074955571443;-5.3728094826511e-06;-0.0001175594079541;3.3279935450992e-05;-0.00012669235002249;6.2949533457868e-05;-1.1151321814395e-05;-0.00022425847419072;0.00016371483798139;-0.0020202109590173;0.00025138189084828;-0.00039315430331044;0.00024258540361188;0.000197356697754;-6.1504710174631e-05;-7.7485623478424e-05;-5.0943367568834e-07;-0.000171933308593;0.00010945269605145;-0.00027915183454752;1.4942150301067e-05;-0.00032743430347182;-0.00068981107324362;-0.0004005394584965;0.0012834662338719;-4.1930288716685e-05;0.0014539378462359;-0.00010559870861471;0.00052594463340938;-0.00015430104394909;0.00081259536091238;-0.00018137008009944;3.2035381991591e-06;-1.5271602023859e-05;4.9550864787307e-05;-1.5464929674636e-05;7.8566728916485e-05;-7.5338107308198e-06;-0.00012684796820395;0.00020175095414743;-0.00042860934627242;-5.8292367612012e-05;0.00011873918992933;-0.00018707872368395;-6.9945308496244e-05;4.0780993003864e-05;-0.00021155481226742;-5.307743413141e-05;-0.00010839025344467;1.9071540009463e-05;3.0956940463511e-05;3.3285807148786e-05;-0.00036116284900345;-0.00033378400257789;9.2676367785316e-05;0.00079026177991182;-1.0193083653576e-05;-0.00018108745280188;0.0002938948746305;0.00036556689883582;-5.3237767133396e-05;2.6998284738511e-05;3.6060522688786e-05;6.2269740737975e-05;3.2474425097462e-05;6.0915444919374e-06;-3.865148028126e-05;-8.1953177868854e-05;3.8533966289833e-05;0.00020125685841776;2.0214796677465e-05;0.001953445142135;-0.00016068066179287;0.00026971200713888;-0.00020016382040922;-0.00012613111175597;6.5897111198865e-05;0.0004625930741895;-5.6202898122137e-05;0.00062257039826363;-3.6038774851477e-05;0.00029908193391748;-2.8595652565855e-06;-6.83923062752e-05;-5.2112911362201e-05;0.00020045577548444;-0.00028619740623981;8.3617807831615e-05;-0.00097597885178402;0.00029582536080852;-0.0014131035422906;5.5532138503622e-05;-0.00091493350919336;8.8459804828744e-05;-0.00014986483438406;3.0672774300911e-05;-0.00016010140825529;-3.1543011118629e-06;1.572102883074e-05;-2.7630641852738e-05;-6.084851702326e-05;-6.3134379161056e-05;-0.0012503552716225;0.00023447889543604;-0.00016010941180866;0.00027282428345643;0.0001161273685284;-7.577065116493e-05;-0.00014018690853845;5.8468562201597e-05;-0.00030398045782931;-8.9441373347654e-06;-0.0002570093201939;-2.2260945115704e-05;0.00020977413805667;0.00074961461359635;-8.6821732111275e-05;-0.00015253397577908;-0.00028013784321956;0.00048222084296867;-0.00062903400976211;0.00065890693804249;-1.5997404261725e-05;0.00065883924253285;-7.4267962190788e-05;4.0758175600786e-05;-2.7737669370254e-05;0.00010195832146564;3.7068784877192e-05;8.7772015831433e-05;9.054982001544e-06;-0.00036750521394424;0.00018500167061575;-0.00084123970009387;-0.00011746062227758;0.00011508471652633;-0.00028264729189686;-1.4707823538629e-05;1.3193378435972e-05;-4.3383835873101e-05;-6.6576445533428e-05;-0.00012253598833922;1.5645022358513e-05;-0.00016828111256473;8.0910336691886e-05;-0.0004993915790692;-0.00092021806631237;0.00010219649993815;0.0016587249701843;9.9457916803658e-05;-0.0001513707684353;0.00058902334421873;0.00024014797236305;-2.903104723373e-05;0.00035432176082395;2.4175416911021e-05;-1.7016414858517e-05;3.8379068428185e-05;8.3835933764931e-05;-5.5559121392434e-05;8.6658270447515e-05;-4.0002803871175e-05;-0.00033802582765929;0.00039559538709;-5.3099840442883e-05;0.00041915796464309;8.4868379417458e-06;0.00013977050548419;2.4200620828196e-05;-2.9720906240982e-05;0.00020538500393741;-5.179248546483e-05;0.00018746501882561;0.00010040714550996;-1.9416092982283e-05;2.9003520467086e-05;-0.00026549235917628;0.0002675520372577;6.0315185692161e-05;0.00089464074699208;-0.00061481719603762;-0.00019563813111745;-0.00034204756957479;-0.00035242008743808;-0.00019814050756395;-2.3607650291524e-05;-0.00016207883891184;-0.00010513386223465;1.8720054868027e-05;-1.8159458704758e-05;-2.7764672267949e-05;8.1564303400228e-06;-3.0726139812032e-05;-1.2824293662561e-05;-0.00011041758261854;-0.0013873735442758;0.00024315880727954;-0.00013902195496485;0.00031154378666542;0.00012222357327119;-8.6002808529884e-05;-0.00018743304826785;7.4164192483295e-05;-0.00037611633888446;-2.9764994906145e-05;-0.00030398371745832;-3.31455412379e-05;0.00029945102869533;0.0010982236126438;-6.5996311604977e-05;-0.00040260926471092;-0.00033122400054708;0.00041892734589055;-0.00078891823068261;0.00080118991900235;6.6276375036978e-06;0.00076000898843631;-6.0698279412463e-05;5.838258221047e-05;-3.3018288377207e-05;0.00012672103184741;5.0495393224992e-05;0.0001107907955884;1.1298665413051e-05;-0.00049107929226011;0.00021977638243698;-0.00097305123927072;-0.00014067448501009;0.00017528864555061;-0.00034942539059557;-2.625322122185e-05;1.2760645404342e-05;-1.793499905034e-05;-7.8910583397374e-05;-0.00013921040226705;1.4432803254749e-05;-0.00021508321515284;9.9404351203702e-05;-0.00061262783128768;-0.0011089937761426;0.00016472084098496;0.0020851697772741;0.00012293757754378;-0.00029537812224589;0.00070253014564514;0.00025124102830887;-3.4074186260113e-05;0.00042391088209115;3.3655662264209e-05;-3.8142112316564e-05;4.6048498916207e-05;0.00011218549479963;-6.5313222876284e-05;0.0001082485250663;-5.8798443205887e-05;-0.00039415620267391;0.00052820629207417;-0.00015241699293256;0.00062526867259294;6.5391609496146e-06;0.00025950695271604;3.7541514757322e-05;-5.303492071107e-05;0.00021927540365141;-5.9699759731302e-05;0.00018805229046848;0.0001307834754698;-4.4510616135085e-05;2.6804456865648e-05;-0.00028673326596618;0.0006891026860103;9.6479503554292e-05;0.00096248026238754;-0.0009301159880124;-0.00028449529781938;-0.00066459056688473;-0.00034647370921448;-0.0002694723661989;2.8427855795599e-05;-0.00022756140970159;-0.00011648573854472;2.0470488379942e-05;-1.1274398275418e-05;-2.7367894290364e-05;-0.00014964523143135;0.00011334006558172;0.0010287496261299;-0.00092222186503932;0.0013284903252497;-0.0013525791000575;0.00075894751353189;-0.00081486097769812;-0.00013733012019657;0.00015844077279326;-0.00010187445877818;0.00010474563896423;0.00015063596947584;-0.0001977005158551;-6.0036934883101e-05;4.4763866753783e-05;9.5078896265477e-05;0.00018780847312883;-5.1860482926713e-05;-0.0023795920424163;0.0020080502144992;-0.001501667778939;0.0015767535660416;-0.00032915620249696;0.00036204056232236;-0.00036060964339413;0.00042068815673701;2.5436689611524e-05;-1.5712401363999e-05;3.5704883316612e-07;1.0520385330892e-05;9.2053502157796e-05;5.6158849474741e-05;-0.00060315616428852;-0.00043535226723179;-0.00037852363311686;-7.1660710091237e-05;0.00027908987249248;0.00035068544093519;-9.4682254712097e-05;-0.00011440506204963;0.00021925884357188;0.00016919546760619;-0.0001078406785382;-6.8398097937461e-05;-0.00017056708747987;-0.00012096471618861;-0.00049456517444924;-0.00047247513430193;0.00056918314658105;0.0016817082650959;0.0012744952691719;-0.00087109213927761;-0.0010237540118396;-2.9704582630075e-05;-8.5335574112833e-05;0.00026964530115947;0.00013535089965444;-0.00012833734217566;-8.3208695286885e-05;0.00014728643873241;0.00010991208546329;-2.7320433218847e-05;-4.4362328480929e-05;0.00056398753076792;0.00053678854601458;0.0005030760075897;0.0005811887094751;0.00060734606813639;0.00067368079908192;-7.8763550845906e-05;-5.5060620070435e-05;-0.00010464856313774;-9.1051806521136e-05;-2.7008609322365e-05;-4.3325038859621e-05;-0.00017244869377464;-0.00018534588161856;0.00031148607376963;0.0068501178175211;0.00059506593970582;-0.0025506326928735;-0.0024694446474314;-0.002718937350437;-0.0029802010394633;-1.6187976143556e-05;-1.380328740197e-05;8.8138396677095e-05;8.511158375768e-05;1.5541319953627e-05;2.1807483790326e-05;7.2862283559516e-05;7.2343842475675e-05;-0.00014345969248097;0.00011403367534513;0.0010087235132232;-0.0009151270496659;0.0013363517355174;-0.0013341328594834;0.00073499331483617;-0.00082277122419327;-0.00013313430827111;0.00015942193567753;-9.233094897354e-05;0.00010852979903575;0.00017346687673125;-0.00017922722327057;-4.5486503950087e-05;5.4224183259066e-05;5.0522321544122e-05;-1.161865384347e-05;-7.7398355642799e-05;-0.0022641853429377;0.002069195266813;-0.0014123200671747;0.0016421031905338;-0.00036354246549308;0.00033346773125231;-0.00038511192542501;0.00039858312811702;2.0935249267495e-05;-1.8355201973463e-05;-9.6204812507494e-06;3.2704047043808e-06;8.5348277934827e-05;5.7989647757495e-05;-0.00055894331308082;-0.00046530202962458;-0.00036010058829561;-8.0575482570566e-05;0.00024240852508228;0.00037919625174254;-8.9277906226926e-05;-0.00011602686572587;0.00020538516400848;0.00017760173068382;-0.00010594196646707;-7.0386835432146e-05;-0.00015399642870761;-0.00013238230894785;-0.0004736578266602;-0.00045773561578244;0.00055589538533241;0.0015569761162624;0.001331330742687;-0.0007853627903387;-0.0010778676951304;-2.5296541934949e-05;-8.2700200437102e-05;0.00025648679002188;0.00014104301226325;-0.0001186966401292;-8.8407541625202e-05;0.0001365677890135;0.00011642898607533;-3.5679226130014e-05;-3.3836040529422e-05;0.00059067126130685;0.00047948383144103;0.00056873430730775;0.00047600624384359;0.0006296731880866;0.00061504851328209;-8.7455366156064e-05;-4.1679901187308e-05;-0.00010368452785769;-8.8295062596444e-05;-1.7166228644783e-05;-5.5214954045368e-05;-0.00016533913731109;-0.00018624203221407;0.0003046172496397;0.0067095067352057;0.00058246141998097;-0.0025782955344766;-0.0023276205174625;-0.0027333055622876;-0.0028366798069328;-3.9346916310024e-05;1.7224592738785e-05;5.7503886637278e-05;0.00012006230826955;1.5755895219627e-05;2.0438934370759e-05;7.1108275733422e-05;7.1543930971529e-05;4.4538664951688e-05;-2.8551585273817e-05;9.7605232440401e-05;7.2265516791958e-05;-0.00028501317137852;0.0011897321091965;-0.000297312886687;0.00014725455548614;8.9723507699091e-05;-0.00013033555296715;-9.3621922133025e-05;0.00015372787311208;2.0566081730067e-05;0.00028121547074988;2.2023828933015e-05;0.00027357527869754;-0.00028348399791867;-0.00086332368664443;7.5458439823706e-05;0.00034444863558747;0.00023241425515153;0.00070743879768997;-0.00045122986193746;1.4622303751821e-05;-0.00063661619788036;8.7133259512484e-05;-0.0006257148925215;4.0412633097731e-05;-4.4463220547186e-05;-4.7874953452265e-05;-0.00010661446867744;1.9044800865231e-05;7.3916431574617e-05;0.0002001265384024;-0.00037821783917025;-0.00018533274123911;-0.00088986079208553;-0.00032715097768232;0.00017877024947666;1.6333373423549e-05;-1.5932779206196e-05;-9.2026522906963e-05;-2.8746502721333e-05;2.2314870875562e-06;-0.00012432459334377;8.59887295519e-05;-0.00021027174079791;-0.00052169663831592;-0.00098900264129043;0.00010946753900498;0.00011274542339379;0.0017582528525963;0.00069162779254839;-0.00022727830219083;1.9013691598957e-06;0.00023874365433585;5.0448412366677e-05;0.00038098092772998;4.8467267333763e-05;-1.779764170351e-05;-5.9365404013079e-05;9.7958334663417e-05;-4.3738331442e-05;9.6765230409801e-05;0.00050688430201262;-0.00046880973968655;0.00051785790128633;-0.00026685142074712;0.00012439765851013;-3.2486139389221e-05;-3.8156027585501e-05;4.5148910430726e-05;-7.6483949669637e-05;0.00021765372366644;0.00013677524111699;0.00011755093146348;5.290409171721e-05;-5.5386750318576e-05;-0.00032856356119737;0.00012874096864834;6.0021280660294e-05;-0.0007257079705596;0.0012078582076356;-0.00029253386310302;-0.00012896419502795;-0.0002662134647835;-0.00022673622879665;-0.00021368740999606;7.7485281508416e-05;2.8746388125001e-05;-0.00012073315156158;-4.5067772589391e-05;1.1329970220686e-05;9.6926460173563e-06;-3.8605841837125e-05;-0.00010038960317615;0.00013472356658895;-0.00021796436340082;0.0013808937510476;-0.00019382649043109;0.00027910698554479;4.879130210611e-05;-0.00014723105414305;-8.5534047684632e-06;7.0179426984396e-05;-7.9299381468445e-05;0.00012881401926279;-1.1594668649195e-05;0.00020875039626844;0.00017879913502838;0.00037874828558415;0.00028222546097822;5.8582554629538e-05;-0.00076654431177303;0.00015164107026067;-0.0010379907907918;0.0001173613127321;-0.0003866947372444;0.00014389528951142;-0.00055171852000058;1.4279180504673e-05;-8.8198330558953e-06;8.2515007306938e-06;-4.5502907596529e-05;-7.1792255766923e-06;6.3163686718326e-05;0.00017959871911444;-0.00015324648120441;-4.8943140427582e-05;-0.00040620646905154;-0.00015756498032715;0.00012047586642439;2.7948393835686e-05;-5.2739618695341e-05;-5.0390746764606e-05;-0.00013663526624441;1.3600538295577e-05;-9.3846894742455e-05;3.0933781090425e-05;-8.1407342804596e-06;-0.00029143312713131;-0.00030163867631927;8.1000311183743e-05;-2.8941645723535e-05;0.00074014405254275;0.00026015640469268;-0.0001754071272444;-4.2662755731726e-05;0.00028553797164932;2.981853322126e-05;6.6818873165175e-05;2.8788821509806e-05;4.2367933929199e-05;-3.1702169508208e-05;1.6325178876286e-05;2.7544743716135e-05;-4.8165529733524e-05;6.8954825110268e-05;4.5376382331597e-05;-5.1442857511574e-05;0.0011879306985065;-0.00011215855192859;0.00016248722386081;3.890182779287e-05;-8.6611864389852e-05;-5.6748955103103e-05;0.00031373894307762;-1.0185724022449e-05;0.00035005930112675;1.1602567155933e-06;0.00019295889069326;-6.5676540543791e-05;1.9652483388199e-05;0.00015772500773892;-3.6187917430652e-05;-6.5429798269179e-05;0.00013959851639811;-0.00067528750514612;1.5507814168814e-05;-0.00082873238716274;3.9238777389983e-05;-0.00054302491480485;2.6485671696719e-05;-0.00011325402738294;-7.2923930929392e-06;-8.7122498371173e-05;1.4070697034185e-05;8.021185749385e-06;-0.00015619756595697;0.00016324224998243;-0.002053978620097;0.00027631482225843;-0.00045367665006779;0.00026372657157481;0.00026129200705327;-9.3053211458027e-05;0.00012005829194095;-1.4724570064573e-05;-5.4812313464936e-05;0.00010481222852832;-0.0003794913936872;3.0871720809955e-05;-0.00036152231041342;-0.00073527818312868;-0.00041134475031868;0.0014154948294163;-5.9248955949442e-05;0.0015093043912202;-0.00011900428216904;0.00015565966896247;-0.00014293033746071;0.00095059297746047;-0.00020386806863826;-6.5014217398129e-05;-9.0608718892327e-06;5.476338264998e-05;-1.5018591511762e-05;0.00010403533815406;4.1992961996584e-06;-0.00012778447126038;0.00027401567786001;-0.0013052356662229;-8.6190615547821e-05;4.0008180803852e-06;-0.00018091811216436;-2.5867557269521e-05;3.9482096326537e-05;-0.00038885491085239;-7.1056994784158e-05;-0.00028652689070441;6.0568672779482e-05;-7.2390103014186e-05;4.1487954149488e-05;-0.0006295177154243;-0.00079429318429902;-4.4279415305937e-05;0.0013829841045663;0.00013455779117066;0.00033804087433964;0.00043362771975808;0.00076429097680375;-9.9571821920108e-05;0.00037498827441595;1.2115814570279e-05;0.00012511599925347;3.3938733395189e-05;4.2860701796599e-05;-5.7823261158774e-05;-4.8294437874574e-05;3.5478398785926e-05;0.0001178319871542;0.00013591344759334;0.0021769998129457;-0.00020461592066567;0.00037086740485393;-0.00033833447378129;-0.0001620144903427;8.8434258941561e-05;0.00051277346210554;-9.4336181064136e-05;0.00072707899380475;-2.832797508745e-05;0.00032404431840405;2.5241937692044e-05;-0.00024836143711582;-0.0002715191221796;0.00028127388213761;0.00013371625391301;5.996112304274e-05;-0.0012760602403432;0.00053192512132227;-0.0016396986320615;3.5694749385584e-05;-0.001029759994708;0.00010860287147807;-0.00017251075769309;5.2864579629386e-05;-0.00017760206537787;-2.7266734832665e-05;1.8637121684151e-05;-3.5938712244388e-05;-0.0001132397519541;-9.3170609034132e-05;-0.0016027443343773;0.00032274317345582;-0.00023705816420261;0.00037308176979423;0.00016087446419988;-0.00010343098256271;-0.00013924788800068;8.0581768997945e-05;-0.00036860691034235;-7.2710208769422e-06;-0.00033071081270464;-2.9064773116261e-05;0.00028890839894302;0.00088265002705157;-0.00013025937369093;-0.00014495885989163;-0.00035393773578107;0.0006969406385906;-0.00081670784857124;0.00079529004869983;-2.4321831006091e-05;0.00084638025145978;-0.00011022159014829;3.6668545362772e-05;-3.959392051911e-05;0.00012776986113749;4.9959133320954e-05;0.00010990400187438;1.5496496416745e-05;-0.0004462878277991;0.00022325945610646;-0.0012695973273367;-0.000172741827555;8.6345891759265e-05;-0.00036083676968701;1.3185522220738e-06;1.7985759768635e-05;-9.891769150272e-05;-8.4567844169214e-05;-0.00018610892584547;2.5400780941709e-05;-0.0002288862306159;0.00010467755055288;-0.00065968878334388;-0.0013317958218977;6.4771345932968e-05;0.0021838138345629;0.00018483849999029;2.4050872525549e-05;0.00081706431228667;0.00038793022395112;-3.3749616704881e-05;0.0005245081265457;2.6292087568436e-05;-1.9625988443295e-06;4.7347966756206e-05;0.0001041149298544;-7.397939771181e-05;0.0001244602171937;-4.6938759624027e-05;-0.00051207392243668;0.00050449493573979;-8.8862194388639e-05;0.00045605830382556;3.2527143048355e-05;8.8275337475352e-05;2.4641280106152e-05;-2.5422090402571e-05;0.00029022537637502;-7.6610187534243e-05;0.00025698696845211;0.00012651446741074;-3.4630982554518e-05;5.3086107072886e-05;-0.00040950940456241;2.1413272406789e-05;7.2242983151227e-05;0.0014184999745339;-0.00068252271739766;-0.00025168395950459;-0.00021011458011344;-0.0004865026276093;-0.00024042377481237;-3.0347111533047e-05;-0.00018823704158422;-0.00015093621914275;2.9849805287085e-05;-1.765271917975e-05;-4.6807781473035e-05;1.0704005944717e-05;-4.2385148844915e-05;-8.5447914898396e-05;-0.00016477103054058;-0.0016975342296064;0.00034709268948063;-0.00022282627469394;0.00043421777081676;0.00016628825687803;-0.00011718038877007;-0.00017572176875547;0.00010591941827442;-0.00044156782678328;-3.2895597541938e-05;-0.00036865146830678;-4.5590593799716e-05;0.00043338918476366;0.0012783416314051;-0.00010344209294999;-0.00046397896949202;-0.00041727893403731;0.00063463317928836;-0.0010283491574228;0.00093911483418196;3.5314221804583e-06;0.00093007372925058;-9.8776952654589e-05;5.0806698709494e-05;-4.9408277845941e-05;0.00015203468501568;6.9659035943914e-05;0.00012740364763886;2.0318051610957e-05;-0.00056451035197824;0.00023783941287547;-0.0014621553709731;-0.00021326540445443;0.00011973321670666;-0.00043827141053043;-2.0424451463441e-07;1.7931874026544e-05;-7.7538963523693e-05;-9.5541501650587e-05;-0.00020729668904096;2.1178591850912e-05;-0.00028237805236131;0.00012678670464084;-0.0007602862897329;-0.0016093738377094;9.9738485005219e-05;0.0026350500993431;0.0002329699927941;-3.1837422284298e-05;0.00098298129159957;0.00040966353844851;-2.677938209672e-05;0.00062094925669953;3.5742225009017e-05;-1.9123583115288e-05;5.4653683037031e-05;0.00013046656385995;-8.4844243247062e-05;0.00016099607455544;-6.5919775806833e-05;-0.00064530072268099;0.00064111244864762;-0.0003145556547679;0.00064149324316531;2.0080044123461e-05;0.0001775322452886;4.4304513721727e-05;-4.6901932364563e-05;0.0003065243945457;-8.6950720287859e-05;0.00024248252157122;0.00016200641402975;-8.0569225247018e-05;6.025864786352e-05;-0.00047360404278152;0.00024497951380908;9.0450834250078e-05;0.0017059809761122;-0.00095402769511566;-0.00027015397790819;-0.00043043028563261;-0.00043978888425045;-0.0003138100146316;6.9841546064708e-05;-0.00025601673405617;-0.00016884684737306;3.2228817872237e-05;-8.202434287341e-07;-5.2575498557417e-05;-0.00015537177387159;0.00011620402074186;0.0011918528471142;-0.0010682656429708;0.0013712872751057;-0.0013065072707832;0.00051211769459769;-0.00054088979959488;-0.00010885454685194;0.00012470477668103;-0.00017170564387925;0.00017733106506057;0.00015841021377128;-0.00018763322441373;3.9599308365723e-05;-4.5329568820307e-05;9.6054129244294e-05;0.00021117289725225;-3.6666158848675e-05;-0.0029005676042289;0.002489430597052;-0.00093856255989522;0.00093703053425997;-0.00028748728800565;0.00028717747773044;-0.00042831187602133;0.00044809296377935;6.9086985604372e-05;-5.7914756325772e-05;-5.4552514484385e-05;5.9067398979096e-05;9.4371709565166e-05;6.7402746935841e-05;-0.0008731012349017;-0.00070829363539815;-0.00085415440844372;-0.00051379372598603;2.9934566555312e-05;0.00013241059787106;-5.5634787713643e-05;-8.8672924903221e-05;0.00023187701299321;0.0001804788626032;-0.0002021514083026;-0.00014623033348471;-0.00017884888802655;-0.00013034738367423;-0.00031971911084838;-0.0017397877527401;0.00047640103730373;0.0021722677629441;0.0017912032781169;-0.00012663187226281;-0.00032129470491782;0.00019268714822829;0.00011215249105589;0.00044196366798133;0.00028056625160389;-0.00012880851863883;-8.8901062554214e-05;0.00015323891420849;0.00011941569391638;-2.2353201529768e-06;-1.6057751054177e-05;0.00035960745299235;0.00030985634657554;0.00047042916412465;0.00051670311950147;0.00068598880898207;0.00076776597416028;-9.7141666628886e-05;-7.3479808634147e-05;-3.1346367904916e-05;-1.5809722754057e-05;-2.67515079031e-05;-4.5631957618752e-05;-0.00021836860105395;-0.00023973555653356;0.00018369581084698;0.0063976147212088;0.00070218974724412;-0.0020762495696545;-0.0019485623342916;-0.0028326811734587;-0.003099623369053;-4.1807325033005e-05;-2.3825970856706e-05;0.00011192246165592;0.00011370112042641;-3.3361920941388e-05;-3.1237028451869e-05;0.00011483758135;0.00011959474795731;-0.00014968165487517;0.0001180026010843;0.0011882679536939;-0.0010651904158294;0.0013749343343079;-0.0012995407450944;0.00049160025082529;-0.00055714329937473;-0.00010500970529392;0.00012640305794775;-0.00016898867033888;0.00018075785192195;0.00017936751828529;-0.0001705759059405;5.1348106353544e-05;-3.4454096748959e-05;4.0597813494969e-05;1.6180383681785e-05;-5.8093210100196e-05;-0.0028033452108502;0.0025753129739314;-0.00085856713121757;0.0010094797471538;-0.00031798210693523;0.00025944373919629;-0.00044756985153072;0.00043027763604186;6.7144406784791e-05;-5.9771045926027e-05;-6.4302170358133e-05;5.1096802053507e-05;8.947795140557e-05;7.009747059783e-05;-0.00083813478704542;-0.00074089335976169;-0.00082880532136187;-0.00053970306180418;-1.3791565223187e-08;0.00016049334954005;-5.3113151807338e-05;-9.0504239778966e-05;0.00022312899818644;0.0001877359172795;-0.00019939320918638;-0.00015114925918169;-0.0001629537291592;-0.00014540569100063;-0.00031070099794306;-0.0017373698065057;0.00047400090261362;0.0020739594474435;0.0018716048216447;-6.4381565607619e-05;-0.00037603318924084;0.00019086890097242;0.00011873346375069;0.00042741908691823;0.00029494857881218;-0.00012191772839287;-9.3877628387418e-05;0.00014422662206925;0.00012765495921485;-1.2215484275657e-05;-4.8954393605527e-06;0.00040519129834138;0.00025078566977754;0.00054615287808701;0.0004245376039762;0.00070628069806844;0.00073279766365886;-0.00010541101073613;-6.2727587646805e-05;-3.4699445677688e-05;-9.9191729532322e-06;-1.5410740161315e-05;-5.6461016356479e-05;-0.00020911946194246;-0.0002473188797012;0.00017836582264863;0.0063457903452218;0.00069759890902787;-0.0021568876691163;-0.0018174544675276;-0.0028621398378164;-0.0030228327959776;-6.7618762841448e-05;2.5750061922736e-06;7.9255056334659e-05;0.00014831445878372;-3.080949318246e-05;-3.524517887854e-05;0.00011098077811766;0.00012254001921974;6.8763925810345e-05;-4.31294356531e-05;0.00018385374278296;0.00014107674360275;-0.00044861677451991;0.0018612879794091;-0.00048149982467294;0.00026531415642239;0.00014291315164883;-0.00021487378398888;-0.00015652993170079;0.00020860227232333;2.9169097615522e-05;0.00042148382635787;3.6565736081684e-05;0.00042552393279038;-0.00046591483987868;-0.0012447336921468;0.0001467307592975;0.00049401755677536;0.0003335531509947;0.0010963896056637;-0.00080611323937774;2.2372892999556e-05;-0.00095868000062183;0.00014590895443689;-0.00097570987418294;6.9279056333471e-05;-5.5923672334757e-05;-7.7864053309895e-05;-0.00016321742441505;3.5602468415163e-05;0.00011171719233971;0.00028159172507003;-0.00056536484044045;-0.0003181109786965;-0.0015636427560821;-0.00050537032075226;0.00021178643510211;2.6116160370293e-05;-5.1284850997035e-06;-0.00013893144205213;-8.2061415014323e-05;7.1554404712515e-06;-0.00021620163170155;0.00013300318096299;-0.00033754101605155;-0.00083285069558769;-0.0017193797975779;0.00010888450196944;0.00026441173395142;0.0028017282020301;0.0011332746362314;-0.0001257788244402;9.5710083769518e-06;0.00043698123772629;7.6714692113455e-05;0.00065545208053663;7.1635658969171e-05;-9.2917262008996e-06;-9.3412418209482e-05;0.00014743996143807;-6.1937382270116e-05;0.00015946239000186;0.0007923110970296;-0.00079526245826855;0.00072905444540083;-0.00040136839379556;0.00011671479296638;-2.9663322038687e-06;-4.6889148507034e-05;5.6581709941383e-05;-0.00013421122275759;0.00036939585697837;0.00020754325669259;0.00020078412489966;9.2942442279309e-05;-9.7272823040839e-05;-0.00057451543398201;-1.346587214357e-05;0.00010532869055169;-0.0010539771756157;0.0020997817628086;-0.00027962931198999;-0.00027208728715777;-0.00039596721762791;-0.00039483903674409;-0.00030839553801343;0.00010943585948553;5.2169540140312e-05;-0.00020641503215302;-7.8846438555047e-05;2.6540250473772e-05;6.8404791818466e-05;-5.4243675549515e-05;0.00012341803812888;0.00020685835625045;-0.00049968267558143;0.0021075294353068;-0.00049445399781689;0.00034570606658235;0.00014926526637282;-0.00024913117522374;-0.00014419543731492;0.00018835955415852;-4.0824652387528e-06;0.00041628695908003;2.1145922801225e-05;0.00045781413791701;-0.0003721235843841;-0.00094708416145295;0.0002212436957052;0.00049384473823011;-6.610528089368e-06;0.0010209290776402;-0.001071359263733;6.5057000028901e-05;-0.00096339557785541;0.00019232407794334;-0.0010659673716873;6.6582811996341e-05;-4.3446038034745e-05;-6.3953979406506e-05;-0.00016504015366081;3.5721146559808e-05;0.00011204068141524;0.00031573354499415;-0.00050708465278149;-0.00030007486930117;-0.0016441612970084;-0.0004856416489929;0.00018032886146102;2.7748215870815e-05;5.9256097983962e-07;-0.00014572130749002;-0.00013100734213367;2.0744948415086e-05;-0.00023162536672316;0.00013011941337027;-0.00032808072865009;-0.0008733362192288;-0.0016970238648355;7.8830278653186e-05;0.00025820973678492;0.0027599772438407;0.0011039826786146;-2.4418899556622e-05;-1.2034833162033e-05;0.00049133552238345;6.6869804868475e-05;0.00067041942384094;7.3485825851094e-05;1.3523177585739e-05;-9.6912306617014e-05;0.00013746035983786;-4.6407749323407e-05;0.00014190057117958;0.00074261479312554;-0.00074980221688747;0.00059654691722244;-0.00013298908015713;2.6680852897698e-05;3.7953108403599e-05;-2.4489421775797e-05;2.9722821636824e-05;-0.00014584817108698;0.0004155550559517;0.00018910384096671;0.00027456879615784;9.4577524578199e-05;-4.771852036356e-05;-0.00059526908444241;-0.00024306082923431;0.00011466779687908;-0.00088440725812688;0.0020710134413093;-7.0776288339403e-05;-0.00035813008435071;-0.00035204261075705;-0.00056063412921503;-0.00026108699967153;-2.2318112314679e-05;5.9030517149949e-05;-0.00022023571364116;-8.2531703810673e-05;3.8118155316624e-06;4.2407373257447e-05;-4.7068591811694e-05;1.5778481611051e-05;0.00020313820277806;-0.0003865831240546;0.0017754911677912;-0.00035295751877129;0.00033719907514751;0.00010965522233164;-0.0002168995415559;-8.0986690591089e-05;9.9951350421179e-05;-4.2020972614409e-05;0.00026880978839472;-2.7668493203237e-06;0.00036068836925551;-0.00012174158473499;-0.00026884416001849;0.00025277331587858;0.00030808406881988;-0.00043047167127952;0.00059670727932826;-0.0010817387374118;9.2421469162218e-05;-0.00064927351195365;0.00018304672266822;-0.00085274752927944;4.1570088797016e-05;-1.2665570466197e-05;-2.7365358619136e-05;-0.00011359059863025;2.4488097551512e-05;7.8284188930411e-05;0.00025830639060587;-0.00028027623193339;-0.00018647829710972;-0.0012090775417164;-0.0003139712207485;0.00010363574256189;2.2562911908608e-05;-1.8224519635623e-06;-0.00010743076563813;-0.00015499764413107;2.708648389671e-05;-0.00018177159654442;8.4108825831208e-05;-0.0002056739613181;-0.00065082841319963;-0.0011129671474919;3.7028523365734e-05;0.0001661862625042;0.0018473345553502;0.00071305013261735;5.4621938033961e-05;-3.3209515095223e-05;0.00041286813211627;4.0174130845116e-05;0.00046382329310291;5.2835377573501e-05;3.9452770579373e-05;-6.9291971158236e-05;8.1948965089396e-05;-1.0362871762482e-05;6.6246037022211e-05;0.00044626175076701;-0.00042246765224263;0.00025388563517481;0.00037832968519069;-8.2474580267444e-05;9.6440104243811e-05;1.1648262443487e-05;-2.2935109882383e-05;-0.00011510077456478;0.00035700184525922;0.00010128544090549;0.00030619354220107;6.0689351812471e-05;5.0961345550604e-05;-0.00041532760951668;-0.00032462211675011;0.00011731059203157;-0.00042991898953915;0.0012776425573975;0.00015369533502962;-0.00045188728836365;-0.00018209955305792;-0.00065772002562881;-0.00011492503108457;-0.00023444026010111;4.9100821343018e-05;-0.00017011705494951;-5.6642798881512e-05;-3.5650580684887e-05;2.2359094145941e-05;-4.4003401853843e-05;-6.2001898186281e-05;0.00016262584540527;-0.00026765905204229;0.0014546734746546;-0.00023490746389143;0.00028979073977098;6.8276887759566e-05;-0.00016506281099282;-3.2804524380481e-05;8.7299406004604e-05;-6.5097265178338e-05;0.00018321734387428;-1.0557433597569e-05;0.00025320108397864;7.0023939770181e-05;0.00014869694132358;0.00025374299730174;0.0001450556301279;-0.00062655931105837;0.00028953567380086;-0.00099824659992009;0.00010710521019064;-0.00048121213330887;0.00015212141443044;-0.00063705164939165;2.2676698790747e-05;-1.3339529687073e-05;-2.2535482457897e-06;-6.9645779149141e-05;3.9820033634896e-06;6.3838728237897e-05;0.00019763664749917;-0.00018705520778894;-8.8128785137087e-05;-0.00066275463905185;-0.00019588667782955;0.00010023004870163;2.2292448193184e-05;-2.6703421099228e-05;-6.7347646108828e-05;-0.00012746291758958;1.9710219930857e-05;-0.00011693570559146;4.7914119932102e-05;-8.3577186160255e-05;-0.00039546503103338;-0.00055974180577323;5.427086216514e-05;3.6354944313644e-05;0.0010708549525589;0.00039445128641091;-7.0040900027379e-05;-3.8960148231126e-05;0.00030154315754771;2.7453652364784e-05;0.00021160341566429;3.5072160244454e-05;3.5738426959142e-05;-4.31283369835e-05;4.024133522762e-05;1.2285046068428e-05;-4.9908044275071e-06;0.0001908721314976;-0.00011868777801283;5.52175406483e-05;0.0007894835434854;-9.2866423074156e-05;0.00012295329361223;2.6092180632986e-05;-5.5581465858268e-05;-7.1857713919599e-05;0.00030177907319739;2.8776661565644e-05;0.00030717809568159;2.181274794566e-05;0.00012636590690818;-0.00018042170268018;-0.00011471549805719;0.00012452037481125;-0.00016171477909666;0.00040593848098069;0.0001389190874761;-0.0005222043255344;-5.3021885833004e-05;-0.00069403799716383;-1.7084268620238e-05;-0.00038655396201648;3.21556799463e-05;-0.00012418447295204;-2.3731334295007e-05;-6.2695486121811e-05;-1.6072208381956e-05;1.3293158190208e-05;-0.00010932658915408;0.0001158931554528;-0.0017970141489059;0.00027310033328831;-0.00042405797285028;0.00026073135086335;0.00026411053841002;-0.00010415459837532;0.00021779649250675;-1.0351131095376e-05;4.6600061978097e-06;7.9429824836552e-05;-0.00039292164728977;3.2357296731789e-05;-0.00026826924295165;-0.00054689607350156;-0.00034978610347025;0.0012079597217962;-9.7696793091018e-05;0.0013119725044817;-0.00017879634106066;-4.7279103455367e-05;-0.00010849327372853;0.00091376999625936;-0.00019031790725421;-9.6134674095083e-05;-8.1137686720467e-06;5.6711443903623e-05;-6.1042169363645e-06;9.8736323707271e-05;1.7355259842589e-05;-0.00010168079461437;0.00027981388848275;-0.0016995558980852;-0.00011180542060174;-7.321478187805e-05;-0.0001735182304401;1.2567223166116e-05;3.0978662834968e-05;-0.00042799900984392;-7.8350087278523e-05;-0.00034564646193758;7.5124247814529e-05;-0.00014409855066333;4.7476674808422e-05;-0.00074269255856052;-0.0010532796150073;-0.00011914797505597;0.0016507062828168;0.00023412737937178;0.00061652419390157;0.00051244476344436;0.00086269702296704;-0.0001073692983482;0.00056882441276684;-2.6839484235097e-07;0.00014142516010907;3.3329873986077e-05;6.1225815443322e-05;-6.4730178564787e-05;4.2235992623318e-06;2.1751015083282e-05;-4.0985269151861e-05;0.00023538284585811;0.001786231296137;-0.00016513575974386;0.00035145372385159;-0.00036672386340797;-0.00014443443797063;8.4813102148473e-05;0.00046000702423044;-0.00010900667257374;0.00066173425875604;-6.3998390942288e-07;0.0002604277106002;4.7735396947246e-05;-0.00038467886042781;-0.00048309381236322;0.00026168164913543;0.00063080480322242;3.4924016745208e-06;-0.0011677887523547;0.00062238739337772;-0.0014681875472888;-1.0162675607717e-05;-0.00086851650848985;8.0529403930996e-05;-0.00016581700765528;5.9661193517968e-05;-0.00015118313604034;-4.5962471631356e-05;8.1339085227228e-06;-1.4066719813854e-05;-0.00017631251830608;6.0461807152024e-06;-0.0015739144291729;0.0002984598686453;-0.00032838142942637;0.00029975475626998;0.00020337682508398;-9.9746896012221e-05;6.3365849200636e-05;3.7266672734404e-05;-0.00016858550952747;4.0533726860303e-05;-0.00033462065039203;6.8929603003198e-06;3.2883435778785e-05;4.5976550609339e-05;-0.00023752018751111;0.00057946081506088;-0.00021829824254382;0.00098771473858505;-0.00043443622416817;0.0003467787464615;-6.7394284997135e-05;0.00081271171802655;-0.00015686887491029;-4.1926326957764e-05;-2.5338347768411e-05;8.9808010670822e-05;1.8245847968501e-05;8.9930494141299e-05;2.0418809071998e-05;-0.0002001168904826;0.00022230818285607;-0.0015406541060656;-0.00014477505465038;-6.4464307797607e-05;-0.00022704273578711;3.5145207220921e-05;1.9174081899109e-05;-0.0002807721903082;-7.4886891525239e-05;-0.00025863450719044;5.5292024626397e-05;-0.00019270442135166;6.8699628172908e-05;-0.00067350280005485;-0.0012172510614619;-9.7898242529482e-05;0.0017839302308857;0.00025150470901281;0.00052428455092013;0.00064370635664091;0.00061882910085842;-6.6912267357111e-05;0.00058137800078839;2.4923845103331e-06;8.4476072515827e-05;3.4350621717749e-05;6.9160836574156e-05;-6.546587246703e-05;7.778184954077e-05;-9.3159760581329e-06;-0.00035955573548563;0.0003476103884168;0.00062998331850395;5.3179104725132e-05;0.00017964934522752;-0.00022212121984921;-5.0168739107903e-05;3.7615944165736e-05;0.00036769104190171;-9.7434676717967e-05;0.00041577758383937;6.0278896853561e-05;7.116275082808e-05;6.7263696109876e-05;-0.00044467163388617;-0.00059329374926165;0.00012479860743042;0.0012852555373684;-0.00020551613124553;-0.00057433353504166;0.0004468493280001;-0.00087498524226248;-0.00010636351362336;-0.00035511146415956;-3.6101973819314e-05;-0.00016405784117524;4.8040936235338e-05;-6.229177233763e-05;-5.7615143305156e-05;1.2331239304331e-05;-3.4835757105611e-05;-0.00015726826677565;-0.00011421840463299;-0.0016382319154218;0.00035368045791984;-0.00028411348466761;0.00040882747271098;0.00018428730254527;-0.00011524805449881;-7.3146387876477e-05;8.8239154138137e-05;-0.0003408849297557;-2.2786650788476e-06;-0.00034867360955104;-2.8560805731104e-05;0.00031819322612137;0.00078768149251118;-0.00016187844448723;-7.0262816734612e-05;-0.0003504581109155;0.00081543601118028;-0.00083552557043731;0.00072169763734564;-2.6671874366002e-05;0.0008772392757237;-0.00013275360106491;1.0596243555483e-05;-4.5352906454355e-05;0.00012859450362157;5.355964822229e-05;0.00011223269393668;2.2326910766424e-05;-0.00042332164593972;0.0002161193988286;-0.0016289587365463;-0.00020725937793031;-1.4709935385326e-06;-0.00036248468677513;3.2397860195488e-05;1.8973969417857e-05;-0.00017520265828352;-8.6412648670375e-05;-0.00024205230874941;3.7631245504599e-05;-0.00026196020189673;0.00010785139602376;-0.00072971888585016;-0.0016018797177821;-3.2932435715338e-05;0.0023642340674996;0.0002833032340277;0.00035812458372675;0.00092220056103542;0.00053516303887591;-3.5897683119401e-05;0.00066069938475266;1.8181139239459e-05;3.0071129003773e-05;4.5312270231079e-05;0.00010499540076125;-8.0266334407497e-05;0.00014645993360318;-4.3302792619215e-05;-0.00063131615752354;0.00053020322229713;-8.6134969023988e-05;0.00036213814746588;7.929171260912e-05;-4.0386887121713e-05;1.2472538401198e-05;-8.1159478213522e-06;0.00034296195372008;-9.7115429525729e-05;0.00029571985942312;0.00012610031990334;-4.8505527956877e-05;7.813866250217e-05;-0.00052095053251833;-0.00037765363231301;8.1600359408185e-05;0.0018266707193106;-0.00058430095668882;-0.00031441511237063;9.2093709099572e-05;-0.00057089456822723;-0.00022978529159445;-4.2055136873387e-05;-0.00016512097499799;-0.00018011176143773;4.1575611248845e-05;-1.0454215953359e-05;-6.480686715804e-05;3.7070876715006e-06;-4.7461297072005e-05;-0.0001598819217179;-0.00024909144849516;-0.0015034539392218;0.00036584568442777;-0.00024098242283799;0.00047388472012244;0.00016804937331472;-0.00012466567568481;-9.1348076239228e-05;0.00013179547386244;-0.00040203923708759;-4.6447359636659e-05;-0.00034266509464942;-5.5758267990313e-05;0.00058646296383813;0.0012900641886517;-0.00010052927245852;-0.00060398149071261;-0.00040893800905906;0.00064142100745812;-0.0010920047061518;0.00084345397772267;2.5990611902671e-05;0.00085413327906281;-0.00010422299965285;1.9474713553791e-05;-6.1869875935372e-05;0.00014647624630015;8.4581690316554e-05;0.0001046823526849;3.2469317375217e-05;-0.0004931049188599;0.00016418437007815;-0.0017484519630671;-0.00026169879129156;2.8094084427721e-06;-0.00043454655678943;4.1510989831295e-05;1.526796950202e-05;-0.00012843940930907;-8.6107989773154e-05;-0.0002390721347183;1.7551370547153e-05;-0.00030825825524516;0.00012895939289592;-0.00074075954034925;-0.0018872425425798;-1.5774454368511e-05;0.0026721437461674;0.00035209240741096;0.00035654936800711;0.0010951289441437;0.00048892892664298;2.8133745217929e-06;0.00074176356429234;3.0466675525531e-05;1.1567618457775e-05;4.8606540076435e-05;0.00012019959103782;-8.4239443822298e-05;0.00020264925842639;-6.2166538555175e-05;-0.0008691344410181;0.00065266847377643;-0.00060351501451805;0.00052672618767247;3.2625273888698e-05;3.126374213025e-05;4.949946742272e-05;-3.2049661967903e-05;0.00032794839353301;-0.00010410939285066;0.00021790593746118;0.00016649936151225;-0.0001404201175319;9.391281491844e-05;-0.00062029907712713;-0.00037664579576813;6.1186889070086e-05;0.002385935978964;-0.00080147321568802;-0.00017401005607098;-3.4696182410698e-05;-0.0003740519459825;-0.00030023668659851;0.00018178910249844;-0.00023886178678367;-0.00019319039711263;4.065514440299e-05;2.8736219974235e-05;-7.5141826528125e-05;-0.00014118338003755;0.00010308482887922;0.0012144346255809;-0.0010900789638981;0.0013889957917854;-0.0012427296023816;0.00027783692348748;-0.00027975608827546;-8.3363920566626e-05;9.3013448349666e-05;-0.00019867249648087;0.0002108115440933;0.0001645185839152;-0.0001705858448986;0.0001337532303296;-0.00012943969340995;9.0831235866062e-05;0.00020887251594104;-2.1667641703971e-05;-0.0031594096217304;0.0027484591118991;-0.00044706161133945;0.00038294406840578;-0.00025325902970508;0.00021599864703603;-0.00048808922292665;0.00046417643898167;9.1836911451537e-05;-8.2178405136801e-05;-9.9540993687697e-05;9.7448632004671e-05;7.0043584855739e-05;6.016389670549e-05;-0.0010455469600856;-0.00090738973813131;-0.0011220837477595;-0.00080760539276525;-0.00017372170987073;-6.0050573665649e-05;-1.5236556464515e-05;-5.4990337957861e-05;0.0002398411888862;0.00018235243624076;-0.00026875163894147;-0.00020942355331499;-0.0001589723106008;-0.00011812776210718;4.1688545024954e-05;-0.0025617065839469;0.00029541741241701;0.0022324626334012;0.001933325547725;0.00052592146676034;0.000322135980241;0.00037172096199356;0.00028974082670175;0.00052040908485651;0.00036234330036677;-0.0001180335166282;-8.2573897088878e-05;0.00014194508548826;0.00011470237950562;3.2775107683847e-05;2.1636575183948e-05;1.9913612050004e-05;-3.2375479349867e-05;0.00017889165610541;0.00020881109230686;0.00060805241810158;0.00068514159647748;-8.7116008216981e-05;-6.6487074946053e-05;3.8612561183982e-05;5.5145090300357e-05;-4.9536854930921e-05;-6.7423541622702e-05;-0.00024505518376827;-0.00026680424343795;4.2404546547914e-05;0.004951483104378;0.00065845955396071;-0.0011871634051204;-0.0010572043247521;-0.0023966571316123;-0.0026272067334503;2.4397944798693e-05;4.5378405047813e-05;0.00018935330444947;0.00018899036513176;-7.8016768384259e-05;-7.9082827141974e-05;0.00014166678010952;0.00014901571557857;-0.0001355659624096;0.00010577065404505;0.0012241749791428;-0.0010823184857145;0.001384029397741;-0.0012464919127524;0.0002570946526248;-0.00029772298876196;-7.9630277468823e-05;9.5151910500135e-05;-0.00020257508731447;0.00021118849690538;0.00018341830582358;-0.00015424372395501;0.00014390876458492;-0.00011995057866443;2.018422310357e-05;2.1742533135694e-05;-3.9561640733154e-05;-0.0030659255571663;0.0028458177112043;-0.00037013029213995;0.00045295685413294;-0.00028037739684805;0.00018929378711618;-0.00050182989798486;0.0004517400811892;9.2727757873945e-05;-8.2666847447399e-05;-0.00010937100159936;8.9161687355954e-05;6.7158449382987e-05;6.2368271755986e-05;-0.0010212014894933;-0.00093637633835897;-0.0010904467198998;-0.00084890495054424;-0.00019716365204658;-3.8894235331099e-05;-1.4766756976314e-05;-5.4881456890143e-05;0.00023504595446866;0.00018671374709811;-0.0002649255329743;-0.00021582821500488;-0.00014328767429106;-0.00013477800530382;4.5602584577864e-05;-0.0025720533449203;0.00029418698977679;0.0021532897371799;0.0020187187474221;0.00057384558022022;0.00028601184021682;0.00036740067298524;0.00030016977689229;0.00050247961189598;0.00038337905425578;-0.00011362580698915;-8.6240062955767e-05;0.00013421890616883;0.00012278427311685;2.1181014744798e-05;3.4105738450307e-05;7.9995174019132e-05;-9.9121054518037e-05;0.00026129090110771;0.00011832949530799;0.00062089087441564;0.00066715746652335;-9.4598690338898e-05;-5.780659193988e-05;3.1922587368172e-05;6.3973828218877e-05;-3.7457008147612e-05;-7.9066638136283e-05;-0.00023203175805975;-0.00028062923229299;3.7103447539266e-05;0.004929568618536;0.00065763684688136;-0.0013021274935454;-0.00091383780818433;-0.0024186864029616;-0.0025891568511724;-2.8618042051676e-06;7.1589151048101e-05;0.00015420105773956;0.00022585995611735;-7.3161209002137e-05;-8.5501233115792e-05;0.00013535063771997;0.00015588704263791;7.3406379669905e-05;-3.2631985959597e-05;0.00031855038832873;0.00016529166896362;-0.00043274144991301;0.0017029765294865;-0.00052327994490042;0.00026782823260874;0.00014987544273026;-0.00021456372633111;-0.00019877236627508;0.00016071730351541;5.918556053075e-05;0.00040943652857095;5.5559747124789e-05;0.00041313536348753;-0.00064920866861939;-0.0013880636543036;0.000136086368002;0.00045083172153682;0.00061380281113088;0.001200218917802;-0.00077647354919463;-2.2946449462324e-05;-0.00092187069822103;0.00012920089648105;-0.00092965643852949;8.7817956227809e-05;-3.6532386729959e-05;-0.00010132088209502;-0.0001658597466303;5.144607348484e-05;0.00010092705633724;0.00019583065295592;-0.00056335725821555;-0.00040059228194878;-0.0019013211131096;-0.00052925234194845;0.00011424918920966;2.4906352336984e-05;3.2056861527963e-05;-0.0001296669797739;-0.00011751251440728;6.0074722796344e-07;-0.00025072289281525;0.00013943969679531;-0.00038248443161137;-0.00086208200082183;-0.0021384463179857;1.4881247807352e-05;0.00044863973744214;0.0030401251278818;0.0013048964319751;0.00023334275465459;4.7107911086641e-05;0.00051917205564678;8.2257291069254e-05;0.00079566735075787;6.5255189838354e-05;9.9772860266967e-06;-9.4943527074065e-05;0.00014960273983888;-6.6569802584127e-05;0.00020579861302394;0.00088146229973063;-0.0010304206516594;0.00072002253727987;-0.00070771673927084;4.0624665416544e-05;4.0270260797115e-05;-4.4126878492534e-05;6.2338673160411e-05;-0.00016146224515978;0.00040094173164107;0.0002254757710034;0.00016922173381317;0.00012069405784132;-0.00017796173051465;-0.00072479632217437;-0.00032219997956418;0.00011069158063037;-0.001085058436729;0.0027479734271765;-8.9445216872264e-05;-0.00029245976475067;-0.000417083123466;-0.00032012339215726;-0.00031906919321045;0.00023901124950498;6.3630584918428e-05;-0.00023930633324198;-9.9292017694097e-05;6.8934743467253e-05;7.3891707870644e-05;-4.4424345105654e-05;0.00022597199131269;0.00024594241403975;-0.00050635315710679;0.0019799086730927;-0.00052669475553557;0.000348458182998;0.00015872067888267;-0.00025484879733995;-0.00017728269449435;0.00012411257193889;2.0977240637876e-05;0.00039542841841467;3.0563511245418e-05;0.0004598647064995;-0.00053375988500193;-0.0010636226506904;0.00021005237067584;0.00049891363596544;0.00018388924945612;0.0011021629907191;-0.0010370613308623;2.7635540391202e-05;-0.00090095878113061;0.00018773425836116;-0.0010403746273369;8.0039208114613e-05;-1.6451926057925e-05;-8.1639402196743e-05;-0.00017079486860894;5.3807107178727e-05;9.6723633760121e-05;0.00026147390599363;-0.00046148849651217;-0.00036318023921922;-0.0019764322787523;-0.00049689115257934;8.8714601588435e-05;2.4258990379167e-05;3.8583799323533e-05;-0.00014480366371572;-0.00017495005158707;2.0964538634871e-05;-0.00026361807249486;0.00013608386507258;-0.00037582073127851;-0.00093489553546533;-0.0020394532475621;-9.0270241344115e-06;0.00041448752745055;0.0029650696087629;0.0012351593468338;0.00030610969406553;1.1438384717621e-05;0.00056153145851567;6.6462773247622e-05;0.00081405730452389;7.0196263550315e-05;3.7604091630783e-05;-0.00010030888370238;0.00013814253907185;-5.0569327868288e-05;0.00018732914759312;0.00083698728121817;-0.00096666591707617;0.00058178009930998;-0.00043286246364005;-5.5781030823709e-05;6.5791922679637e-05;-1.9374128896743e-05;3.7075133150211e-05;-0.00017556564125698;0.00043787976028398;0.00021067576017231;0.00024880800629035;0.00012426690955181;-0.00011829708091682;-0.00075769156683236;-0.00060622987803072;0.00010800884047057;-0.00089431862579659;0.0027182120829821;0.00014701340114698;-0.00033742547384463;-0.00037752062780783;-0.0004936364130117;-0.00027337469509803;9.7913565696217e-05;7.202300184872e-05;-0.00024682056391612;-0.00010585526615614;3.8223795854719e-05;4.1857929318212e-05;-2.5484045181656e-05;8.9763496362139e-05;0.00020808195404243;-0.0003996221057605;0.0016317744739354;-0.00037151286960579;0.00033704191446304;0.00012444664025679;-0.00023488831357099;-9.892610978568e-05;-8.5167612269288e-06;-1.6071144273155e-05;0.00020180318097118;-2.8531860607472e-06;0.0003858053823933;-0.00024249579291791;-0.00037631092709489;0.00023265903291758;0.00034105684608221;-0.00030662646167912;0.00065595435444266;-0.0010124017717317;5.4391166486312e-05;-0.00046689796727151;0.00018288216961082;-0.00084504944970831;4.6914981794544e-05;3.0046145184315e-05;-4.0603601519251e-05;-0.00011621914018178;4.9506823415868e-05;5.5562013585586e-05;0.00024375870998483;-0.00017790164565668;-0.0002430892927805;-0.0015942940954119;-0.0003167234826833;1.7003158063744e-05;1.7048105291906e-05;3.6618948797695e-05;-0.00011976101086475;-0.00021469946659636;3.5089284210699e-05;-0.00022626455756836;8.8820401288103e-05;-0.00026436793268658;-0.00078239775029942;-0.0014084315625951;-4.1180988773704e-05;0.00031868618680164;0.0020720632746816;0.00081219058483839;0.00036659985198639;-2.5739986085682e-05;0.00049061089521274;3.9289676351473e-05;0.0006361041450873;5.4079046094557e-05;7.1244423452299e-05;-7.5663789175451e-05;8.6240062955767e-05;-1.4293957065092e-05;0.00011247604561504;0.00056112563470379;-0.00059890770353377;0.00024419749388471;0.00012826197780669;-0.0001636938250158;0.00011661891039694;1.9925329979742e-05;-2.0100867914152e-05;-0.00014918598753866;0.0003520964528434;0.0001288267376367;0.00029040320077911;8.8771441369317e-05;3.4848112591135e-06;-0.00060684006894007;-0.0006797633250244;0.00011496554361656;-0.00043711537728086;0.0018998829182237;0.00036318702041171;-0.00043788825860247;-0.00022007638472132;-0.00060884060803801;-0.00012798857642338;-0.00014460542297456;6.3964253058657e-05;-0.00018024486780632;-8.2011574704666e-05;-1.6630978279863e-05;9.1802903625648e-06;-1.4396113328985e-05;-0.00017531937919557;-1.2569504178828e-05;-0.0010493823792785;0.0002221825561719;-0.00022470651310869;0.00020781239436474;0.00013971063890494;-7.1330556238536e-05;6.523141200887e-05;3.2755942811491e-05;-0.00012095165584469;2.4754785044934e-05;-0.0002302208886249;8.0615654951544e-06;7.6450829510577e-05;3.5920289519709e-05;-0.0001574309571879;0.00039200641913339;-0.00017996222595684;0.00066310487454757;-0.00030275253811851;0.00024558161385357;-4.1016675822902e-05;0.00055008917115629;-0.00011486491712276;-4.027115937788e-05;-1.9996325136162e-05;6.8415400164668e-05;1.3913631846663e-05;4.9702521209838e-05;2.1721005396103e-05;-7.8366683737841e-05;0.00014529562031385;-0.0011383193777874;-0.00011134702072013;-8.2306149124634e-05;-0.00014564687444363;4.3081570765935e-05;8.5678966570413e-06;-0.00020529843459371;-5.3945670515532e-05;-0.00017273340199608;4.0610779251438e-05;-0.00015019267448224;4.7075300244614e-05;-0.00049147574463859;-0.00089567131362855;-9.9543001851998e-05;0.0012324929703027;0.00021426916646305;0.00046701956307516;0.00045551688526757;0.00040810820064507;-4.354229895398e-05;0.00044849814730696;-1.6084844673969e-06;6.8623732659034e-05;2.3231779778143e-05;4.1550869354978e-05;-4.5368877181318e-05;7.7497978054453e-05;-9.267056157114e-06;-0.00035198626574129;0.00026909678126685;0.00020271315588616;1.5304038242903e-05;0.00010234866931569;-0.00019563977548387;-1.9963450540672e-05;2.7882482754649e-05;0.00025134749012068;-7.5621464930009e-05;0.0002588584611658;5.3702598961536e-05;9.3673406809103e-06;6.2391351093538e-05;-0.0003803537983913;-0.00067237921757624;4.9172056606039e-05;0.0012068388750777;-0.00010412606206955;-0.00027165544452146;0.00045272879651748;-0.00052624853560701;-8.4477913333103e-05;-0.00015159530448727;-3.2475876651006e-05;-0.00012156313459855;3.6854988138657e-05;-2.6635549147613e-05;-5.2116211008979e-05;-1.5940686353133e-06;-5.0737697165459e-05;-0.00024285256222356;-0.00034476927248761;-0.00076584157068282;0.00027662012143992;-0.00015147849626373;0.00038760236930102;0.00010758850112325;-9.72578782239e-05;3.0346653147717e-05;0.00014567219477613;-0.00027132572722621;-7.5304444180802e-05;-0.00021023758745287;-5.9244699514238e-05;0.0007512423908338;0.0011726567754522;-3.1849482184043e-05;-0.00083744234871119;-0.00032400028430857;0.00033760408405215;-0.00093320937594399;0.00056077528279275;7.7038450399414e-05;0.00049841305008158;-6.0779249906773e-05;-2.3228938516695e-05;-6.4522326283623e-05;0.00010971579467878;9.0400521003176e-05;2.4536320779589e-05;4.4234930101084e-05;-0.000225379539188;-4.7768389777048e-06;-0.0014320688787848;-0.00024160866450984;-9.2810805654153e-05;-0.00032028785790317;6.8802342866547e-05;1.5220197155941e-06;-0.00010604529961711;-4.6913639380364e-05;-0.0001693595550023;-1.3003429558012e-05;-0.00025110255228356;9.9156575743109e-05;-0.00046365804155357;-0.0015906651969999;-8.2515136455186e-05;0.0018939726287499;0.00036886063753627;0.00053115451009944;0.00088816415518522;0.00031525397207588;6.1728431319352e-05;0.00063758058240637;2.5396504497621e-05;3.2647858461132e-05;2.964817758766e-05;7.1248236054089e-05;-5.37124069524e-05;0.0002076940581901;-4.5703076466452e-05;-0.00094647478545085;0.00051930971676484;-0.00099948234856129;0.0003384328156244;-2.3454549591406e-06;-7.9839875979815e-05;6.3301682530437e-05;-2.0426668925211e-05;0.00023354010772891;-9.2844704340678e-05;9.0280460426584e-05;0.00014018650108483;-0.00020307234080974;0.00010592488251859;-0.00062899204203859;-0.00088740943465382;-6.6026336753566e-06;0.0026474182959646;-0.00051902636187151;7.7375836553983e-05;0.0002982358855661;-9.5324910944328e-05;-0.00022618180082645;0.00036018219543621;-0.00018942158203572;-0.00015841846470721;3.5205739550292e-05;6.3446190324612e-05;-7.8967830631882e-05;-0.00010496047616471;7.1712274802849e-05;0.001075685955584;-0.00097284704679623;0.0013339821016416;-0.0011301522608846;8.673476986587e-05;-6.5155072661582e-05;-6.2826722569298e-05;6.6389540734235e-05;-0.00018506674678065;0.0002055842342088;0.00015680040814914;-0.00014260968600865;0.00020256752031855;-0.00019024054927286;8.6138825281523e-05;0.00019104951934423;-8.8570695879753e-06;-0.0031028722878546;0.0027222142089158;-6.9241534220055e-05;-3.9761929656379e-05;-0.0002003243425861;0.00013806468632538;-0.00051647704094648;0.0004556262283586;9.1050082119182e-05;-8.5418789240066e-05;-0.00012363024870865;0.00011684130731737;2.0746914742631e-05;3.4059714380419e-05;-0.0010881708003581;-0.00099721865262836;-0.0010980318766087;-0.0008629661751911;-0.00029282088507898;-0.00018601345072966;1.3087212209939e-05;-2.6695766791818e-05;0.00024750272859819;0.00017918918456417;-0.0002983860031236;-0.00024852392380126;-0.00011325933155604;-8.4556362708099e-05;0.00054693233687431;-0.002730131149292;0.00011768073454732;0.0018188352696598;0.0016435962170362;0.00090716424165294;0.00072394101880491;0.00046490921522491;0.00040735077345744;0.00048870878526941;0.00036082917358726;-9.8758762760554e-05;-6.6469721787143e-05;0.00011818401981145;9.9285440228414e-05;6.6152817453258e-05;5.7516645028954e-05;-0.00038976725772955;-0.00042174602276646;-0.00025482647470199;-0.00022176041966304;0.00042009382741526;0.00047694760723971;-5.518143370864e-05;-4.0103379433276e-05;0.00010348508658353;0.00011666895443341;-8.6015788838267e-05;-9.9763004982378e-05;-0.0002488448517397;-0.00026314763817936;-4.9775862862589e-05;0.0029055157210678;0.00048873224295676;-0.00011231451208005;-2.8131506041973e-05;-0.0015783422859386;-0.001742938067764;0.0001507727720309;0.00016393065743614;0.00028602627571672;0.00027638801839203;-0.00011396840272937;-0.0001157543156296;0.00015173820429482;0.00015841225103941;-9.9307078926358e-05;7.563762483187e-05;0.0011098704999313;-0.00095790746854618;0.0013223738642409;-0.0011460228124633;6.2064202211332e-05;-8.1983205745928e-05;-5.8549172536004e-05;6.8632361944765e-05;-0.00019882086780854;0.00020244180632289;0.00017651008965913;-0.00012490936205722;0.00021298005594872;-0.0001828928507166;-1.2684951798292e-05;5.9410058383946e-07;-2.4506056433893e-05;-0.0030163177289069;0.002848494797945;1.4749843103345e-05;2.4605651560705e-05;-0.00022878928575665;0.00010799595474964;-0.00052674999460578;0.00044827902456746;9.6351250249427e-05;-8.4459497884382e-05;-0.00013564019172918;0.0001079593639588;2.1244522940833e-05;3.4965290979017e-05;-0.0010831374675035;-0.001024438184686;-0.001071261591278;-0.00092942459741607;-0.00031403775210492;-0.00017530952754896;1.1979637747572e-05;-2.3499924282078e-05;0.00024675609893166;0.00018046032346319;-0.00029616794199683;-0.00025709686451592;-9.7688687674236e-05;-0.00010367161303293;0.00054668949451298;-0.0027782677207142;0.00011356946924934;0.0017714620335028;0.0017458834918216;0.00095703941769898;0.00071915751323104;0.00046534722787328;0.00042328611016273;0.00047028827248141;0.00039228366222233;-9.7110729257111e-05;-6.8436980654951e-05;0.00011216994607821;0.00010696707613533;5.269436587696e-05;7.3656126915012e-05;-0.00031160566140898;-0.00050907669356093;-0.00016011566913221;-0.0003296121431049;0.00042617504368536;0.00047297895071097;-6.266419950407e-05;-3.2178024412133e-05;9.3340793682728e-05;0.00013032798597123;-7.1556256443728e-05;-0.00011389842984499;-0.00023099256213754;-0.00028629519511014;-6.1461832956411e-05;0.0028958602342755;0.00049130478873849;-0.00026401385548525;0.00016100365610328;-0.001591450185515;-0.0017341355560347;0.00011922057456104;0.00019434199202806;0.00024536112323403;0.00032283912878484;-0.000107072875835;-0.00012620641791727;0.00014253353583626;0.00017069729801733;7.3446331953164e-05;-2.2251573682297e-05;0.00043528649257496;0.00023000370129012;-0.0003309792955406;0.0011013238690794;-0.00045440782560036;0.0002055466757156;0.00012455251999199;-0.00016153707110789;-0.0002189255610574;4.9645590479486e-05;9.0195790107828e-05;0.00031186538399197;6.4834937802516e-05;0.00029940807144158;-0.00080491864355281;-0.0012710350565612;8.5109561041463e-05;0.00033450007322244;0.00083699083188549;0.0010626977309585;-0.00054746452951804;-8.1411737482995e-05;-0.00069536047521979;8.1926380516961e-05;-0.00065030687255785;9.4190509116743e-05;5.2859390962112e-06;-0.0001104752154788;-0.00013773659884464;6.2231883930508e-05;4.3555490265135e-05;1.8853683286579e-05;-0.00036136084236205;-0.00039283648948185;-0.0017905117711052;-0.00042681497870944;-2.9609351258841e-05;1.3064177437627e-05;7.147323776735e-05;-8.2718768680934e-05;-0.00013053399743512;-1.914699896588e-05;-0.00021447749168146;0.00011588290362852;-0.00034052517730743;-0.00064506806666031;-0.0020569686312228;-9.0415800514165e-05;0.00053371000103652;0.0024896410759538;0.0011727233650163;0.0005732670542784;9.8362463177182e-05;0.00044281338341534;6.7770248278975e-05;0.00076146831270307;4.1934697946999e-05;3.7977024476277e-05;-7.0343514380511e-05;0.00010660298721632;-5.3711086366093e-05;0.00022306368919089;0.0007738919230178;-0.0011433426989242;0.00052100227912888;-0.0010562149109319;-7.8569224569947e-05;4.7570632887073e-05;-2.9059336156934e-05;6.8335015384946e-05;-0.00015796822845004;0.00034765346208587;0.00020053799380548;8.048044401221e-05;0.00013321475125849;-0.00025034014834091;-0.00077082839561626;-0.00083190633449703;5.5358766985592e-05;-0.0008166748448275;0.0031008042860776;0.00025290151825175;-0.00011799096682807;-0.0003425260365475;-0.00011886889114976;-0.00026376789901406;0.00038989400491118;6.1627550167032e-05;-0.00022639789676759;-0.00010593199840514;0.00010776249109767;7.4541065259837e-05;-3.5914468753617e-05;0.000316149846185;0.00031876447610557;-0.00040925847133622;0.0013497894397005;-0.00043579839984886;0.00026654949760996;0.00012994863209315;-0.00019452803826425;-0.00018853445362765;1.1577260011109e-05;4.9975682486547e-05;0.0002948728215415;3.269541048212e-05;0.00034242778201587;-0.00067153904819861;-0.00093738303985447;0.00014635175466537;0.00041683134622872;0.00036342631210573;0.00092912104446441;-0.00075260736048222;-2.7701302315108e-05;-0.00066486391006038;0.00014225106860977;-0.00074648106237873;8.127299224725e-05;2.6568592147669e-05;-8.5266881796997e-05;-0.00014323857612908;6.4911881054286e-05;3.4730925108306e-05;0.00010186438157689;-0.0002235498977825;-0.00033404940040782;-0.0017764730146155;-0.00037583606899716;-4.2695628508227e-05;9.7459378594067e-06;7.5358686444815e-05;-0.00010103357635671;-0.00018001413263846;4.2252599996573e-06;-0.00020964317081962;0.00010886741802096;-0.00032575978548266;-0.00071907404344529;-0.0018383645219728;-9.8467586212792e-05;0.00046735623618588;0.0023173959925771;0.0010406572837383;0.00057882774854079;5.3066258260515e-05;0.00044147844891995;4.8306930693798e-05;0.00075053243199363;4.7751473175595e-05;6.3637184211984e-05;-7.4142029916402e-05;9.038839925779e-05;-3.9123369788285e-05;0.00020013358152937;0.00072474777698517;-0.0010439384495839;0.00039325808756985;-0.00080009014345706;-0.00015980257012416;5.3065639804117e-05;-6.5330409597664e-06;4.8666923248675e-05;-0.00016825225611683;0.00036585467751138;0.00018723687389866;0.00015027842891868;0.00013532956654672;-0.00018858996918425;-0.00078510522143915;-0.0010866086231545;3.8058340578573e-05;-0.0006270119920373;0.0029881603550166;0.00046315358486027;-0.00011047658335883;-0.00030636839801446;-0.00026805320521817;-0.00022326438920572;0.00025817647110671;6.8732486397494e-05;-0.00022379674192052;-0.0001116375788115;7.3799856181722e-05;5.230138413026e-05;-2.9389926567092e-05;0.00017791120626498;0.00026804191293195;-0.00034583130036481;0.0012052840320393;-0.00032871530856937;0.00025205634301528;0.0001050555074471;-0.00017695676069707;-0.00012423902808223;-2.1050494979136e-05;1.4227682186174e-05;0.00020322695490904;8.2081533037126e-06;0.00029754254501313;-0.00041264510946348;-0.00050056405598298;0.00015861279098317;0.00033067361800931;-5.4784786698292e-06;0.00063388934358954;-0.00073276879265904;8.8110309661715e-06;-0.00046229138388298;0.00014179488061927;-0.00064540305174887;5.471132681123e-05;3.5109271266265e-05;-5.1397302740952e-05;-0.00011072697816417;5.2902738389093e-05;2.6299749151804e-05;0.00012937784777023;-0.00010816745634656;-0.00023877789499238;-0.001434740726836;-0.00026680319570005;-4.7480531065958e-05;7.2604866545589e-06;6.1298509535845e-05;-9.0305155026726e-05;-0.00017921184189618;1.8959150111186e-05;-0.00017488379671704;7.9590536188334e-05;-0.00024874988594092;-0.00062471762066707;-0.0013588379370049;-8.8366308773402e-05;0.00035258405841887;0.001762789208442;0.0007524048560299;0.00049036496784538;1.2980927749595e-05;0.00037700319080614;2.9867964258301e-05;0.00059629592578858;4.026063834317e-05;6.7394801590126e-05;-6.0827682318632e-05;6.4234431192745e-05;-2.0278737792978e-05;0.00013937197218183;0.00053678470430896;-0.00073617824818939;0.00022260856349021;-0.00038777026929893;-0.00017578768893145;6.6642300225794e-05;1.0455522897246e-05;1.7062142433133e-05;-0.00013932665751781;0.00030278641497716;0.0001338191650575;0.00017361267236993;0.00010298533015884;-9.8875010735355e-05;-0.00062124489340931;-0.00093686336185783;4.0313683712156e-05;-0.00038190264604054;0.0022141363006085;0.00046916186693124;-0.00015969274681993;-0.00021315453341231;-0.00033587357029319;-0.00014064661809243;8.874852937879e-05;5.8699439250631e-05;-0.00017450224549975;-8.8369597506244e-05;3.3278152841376e-05;7.1857198236103e-06;-1.2353515558061e-05;-0.00014983318396844;-1.8733266188065e-05;-0.00074098148616031;0.00016808544751257;-0.00016149708244484;0.00015138198796194;0.0001014333756757;-5.3084677347215e-05;6.1311002355069e-05;2.7181153200218e-05;-8.6638334323652e-05;1.5539075320703e-05;-0.00016736441466492;7.1922540882952e-06;8.2627826486714e-05;3.2857293263078e-05;-0.00011086269660154;0.00027625967049971;-0.00014430312148761;0.0004702195583377;-0.00022268062457442;0.00017304040375166;-2.5955107048503e-05;0.00039383099647239;-8.5804364061914e-05;-3.5775621654466e-05;-1.5644942322979e-05;5.2214134484529e-05;1.1152546903759e-05;2.9247035854496e-05;1.9860004613292e-05;-2.5147926862701e-05;0.00010113578173332;-0.00085717561887577;-8.6803222075105e-05;-7.501570507884e-05;-0.00010126420966117;3.8813042920083e-05;4.226747478242e-06;-0.00015502711175941;-4.0417526179226e-05;-0.00012255417823326;2.9860704671592e-05;-0.00011585597530939;3.3833344787126e-05;-0.00036998227005824;-0.00067144830245525;-8.4211140347179e-05;0.00089239870430902;0.00017464923439547;0.00038048456190154;0.00033425953006372;0.00028610456502065;-2.9623332011397e-05;0.00034525207593106;-1.7551818700667e-06;5.512156712939e-05;1.6843845514813e-05;2.7006011805497e-05;-3.2815016311361e-05;6.7240944190416e-05;-8.0099280239665e-06;-0.00030165398493409;0.00021022322471254;5.047325976193e-05;2.8826143534388e-06;6.5871594415512e-05;-0.00016079458873719;-8.5756400949322e-06;2.1275734980009e-05;0.00018147782247979;-5.9012712881668e-05;0.00017763573850971;4.4641143176705e-05;-9.5828036137391e-06;5.2363742724992e-05;-0.00031105778180063;-0.00060216122074053;2.0860839867964e-05;0.0010214172070846;-6.1495185946114e-05;-0.00014747689419892;0.00039126246701926;-0.00035241528530605;-6.6901942773256e-05;-7.1801681770012e-05;-2.7156816940987e-05;-9.172732825391e-05;2.8542121071951e-05;-1.2935680388182e-05;-4.3408930650912e-05;1.2348483323876e-05;-6.5897678723559e-05;-0.00042763055535033;-0.00042551039950922;-0.00029852052102797;0.00024541767197661;-9.674080502009e-05;0.0003226758853998;7.2441216616426e-05;-8.1460260844324e-05;0.00015238694322761;0.00016556242189836;-0.00018529569206294;-9.689548460301e-05;-0.0001306396588916;-5.2224149840185e-05;0.00094498769612983;0.0010423416970298;4.8784499995236e-06;-0.00091428076848388;-0.00031965828384273;0.00015967330546118;-0.00079974194522947;0.00038832006976008;0.00011400518997107;0.00027002519345842;-4.6409451897489e-05;-7.2998096584342e-05;-6.8757064582314e-05;9.3741691671312e-05;9.3854905571789e-05;-6.0772086726502e-05;5.972666258458e-05;9.976165893022e-05;-0.000138791903737;-0.0011262777261436;-0.00021341136016417;-0.00015789778262842;-0.00022126871044748;8.9283174020238e-05;-1.3784627299174e-05;-0.00010019788896898;-1.8192478819401e-05;-9.2371788923629e-05;-4.4446125684772e-05;-0.00020399500499479;7.4965282692574e-05;-0.00025007882504724;-0.0012472661910579;-0.00011048375745304;0.001169960713014;0.00036036648089066;0.00060410046717152;0.00067178386962041;0.00011126355093438;0.0001126573770307;0.00054737972095609;2.3620816136827e-05;6.2086219259072e-05;1.7544534784975e-05;2.157304334105e-05;-2.6837375116884e-05;0.00020741600019392;-2.6289095330867e-05;-0.0010132167953998;0.00041509160655551;-0.0013020951300859;0.00017798022599891;-3.6054487281945e-05;-0.00018876310787164;7.6470343628898e-05;-7.8913599281805e-06;0.00016851421969477;-9.0587505837902e-05;2.0659206711571e-05;0.0001201071208925;-0.00024535835837014;0.00012156077718828;-0.00066682707984;-0.0013981772353873;-6.8257912062109e-05;0.0029673047829419;-0.00027972139650956;0.00029157038079575;0.00062477472238243;6.4010106143542e-05;-0.00016272465290967;0.00048647556104697;-0.00015196735330392;-0.00012964627239853;3.3853029890452e-05;7.7708624303341e-05;-8.5918931290507e-05;-6.0545513406396e-05;3.1777493859408e-05;0.00081957492511719;-0.00076702842488885;0.0012167078675702;-0.00098193762823939;-2.1746061975136e-05;6.9187452027109e-05;-5.2864823373966e-05;5.0127826398239e-05;-0.00014205498155206;0.00017341191414744;0.00012705930566881;-0.0001119775333791;0.00023201305884868;-0.00021946971537545;0.00011011416791007;0.00021525660122279;3.858150648739e-06;-0.0028086591046304;0.002419319935143;0.00012392082135193;-0.00029296459979378;-0.0001205099906656;6.9940753746778e-05;-0.00050626305164769;0.00042751684668474;7.1535185270477e-05;-7.2230148361996e-05;-0.00011983441072516;0.00011676367284963;-3.4575416066218e-05;-1.7378043537519e-07;-0.0010186014696956;-0.00096974964253604;-0.00084278191206977;-0.00068268371978775;-0.00031105056405067;-0.00022881159384269;2.3444310500054e-05;-1.3288836271386e-05;0.00025288961478509;0.00017388563719578;-0.00029076970531605;-0.00025429608649574;-6.215520988917e-05;-3.6885532608721e-05;0.001038872404024;-0.0023116488009691;9.9449553090381e-06;0.0011368206469342;0.0010483388323337;0.00094951107166708;0.00081489683361724;0.00046352541539818;0.00043881253805012;0.0003805975720752;0.00028130429564044;-7.8629411291331e-05;-4.8015346692409e-05;9.2853515525348e-05;7.8419267083518e-05;8.339141641045e-05;7.1753675001673e-05;-0.00074673962080851;-0.00070712948217988;-0.00062868895474821;-0.00053046218818054;0.00022230633476283;0.00025934574659914;-1.9723929653992e-05;-1.5012255971669e-05;0.00015751998580527;0.00015560204337817;-0.00012897634587716;-0.00012872276420239;-0.00023574156512041;-0.00022895468282513;-1.8944643670693e-05;0.0010927338153124;0.00029600152629428;0.00074717774987221;0.00068366125924513;-0.00077129015699029;-0.00087672518566251;0.0002838360669557;0.00026875056209974;0.00036129573709331;0.00031734650838189;-0.00013488023250829;-0.00013039745681453;0.00015182986680884;0.00014983721484896;-5.4035233915783e-05;3.6451896448852e-05;0.00087647914187983;-0.00073634571162984;0.0011974317021668;-0.0010175995994359;-4.6626864786958e-05;4.8124420573004e-05;-4.8617566790199e-05;5.4269879910862e-05;-0.00016446031804662;0.00016385916387662;0.00014982813445386;-9.2627051344607e-05;0.00024172196572181;-0.00021474040113389;-2.4669903723407e-05;1.2711708222923e-05;-1.2746139873343e-05;-0.0027118660509586;0.0025699029210955;0.0002101854479406;-0.00021814250794705;-0.00015473000530619;3.698215004988e-05;-0.00051355769392103;0.00042845963616855;8.0418612924404e-05;-6.8422159529291e-05;-0.00013396960275713;0.00010633005877025;-3.1179126381176e-05;-2.5902352263074e-06;-0.0010309288045391;-0.00098597200121731;-0.00081056175986305;-0.00074927066452801;-0.00032592768548056;-0.00022318596893456;2.0026376660098e-05;-8.2312244558125e-06;0.00025650227325968;0.00017353976727463;-0.00029064199770801;-0.0002613928518258;-4.6290246245917e-05;-5.5829466873547e-05;0.0010437859455124;-0.0023579602129757;6.5770145738497e-06;0.0011011402821168;0.0011350772110745;0.00098566920496523;0.00081977585796267;0.00046853898675181;0.00045091327046975;0.00035851917346008;0.00031429994851351;-7.9671961429995e-05;-4.8278041504091e-05;8.9039182057604e-05;8.4507817518897e-05;6.7272929300088e-05;9.0186287707184e-05;-0.00065085745882243;-0.00081133260391653;-0.00051291874842718;-0.00065630953758955;0.00022411077225115;0.00026436915504746;-2.8053538699169e-05;-6.9078305386938e-06;0.00014475214993581;0.0001717644627206;-0.00011218116560485;-0.00014697716687806;-0.00021178417955525;-0.00025975244352594;-2.7782349206973e-05;0.0010992764728144;0.00030033790972084;0.00054906716104597;0.00090503308456391;-0.00078048976138234;-0.00088698230683804;0.0002474918437656;0.00030654002330266;0.0003112374979537;0.00037367138429545;-0.00012592240818776;-0.00014295270375442;0.00013964368554298;0.0001664493320277;9.0960500529036e-05;-3.370021659066e-05;0.00052607042016461;0.0004086734552402;-0.000299562321743;0.00066205370239913;-0.0003930714156013;0.00015822917339392;0.00010603586997604;-0.00012122440966778;-0.00024614171707071;-6.5287887991872e-05;0.00011507499584695;0.00024676573229954;6.1121092585381e-05;0.00021595352154691;-0.0010089428396896;-0.0011467329459265;4.8183006583713e-05;0.00033399442327209;0.00092309952015057;0.00093638809630647;-0.00038072941242717;-0.00012328747834545;-0.00055312208132818;6.5054926380981e-05;-0.00043920733151026;0.00010048102558358;5.5086242355173e-05;-0.00011579508282011;-0.00012642050569411;7.354115950875e-05;-3.0396564397961e-05;-0.00013173990009818;-7.2771559644025e-05;-0.00034305025474168;-0.0015528312651441;-0.00032100899261422;-0.00012923438043799;-3.1783256417839e-06;9.9854973086622e-05;-4.108996654395e-05;-0.00014357719919644;-4.564693881548e-05;-0.00015270612493623;9.6107745775953e-05;-0.00028982167714275;-0.00041584347491153;-0.0017660412704572;-0.00014374972670339;0.00052004522876814;0.0018052350496873;0.00096500030485913;0.0007377247675322;0.00014628400094807;0.00029385052039288;4.9596153985476e-05;0.000689112523105;2.4320390366483e-05;7.1779657446314e-05;-4.4857264583698e-05;5.5092441471061e-05;-3.5631870559882e-05;0.00022931971761864;0.00065445672953501;-0.0012401614803821;0.00033419943065383;-0.0013750419020653;-0.00019394556875341;2.0345656594145e-05;-1.3435244909488e-05;8.0555357271805e-05;-0.00015457830158994;0.00030036122188903;0.00017876311903819;1.6171517927432e-05;0.0001488953421358;-0.00030115581466816;-0.00081080640666187;-0.0014160238206387;-1.8316881323699e-05;-0.00053873163415119;0.0034689237363636;0.00061334390193224;0.00012490057270043;-0.00026711582904682;3.4311226045247e-05;-0.00022082481882535;0.00051611935487017;5.9456942835823e-05;-0.0002084820298478;-0.00011390813597245;0.00012803584104404;8.6618128989358e-05;-3.9799517253414e-05;0.00040669910958968;0.0004406726511661;-0.00036140732117929;0.00088215316645801;-0.00037394155515358;0.00020103921997361;0.00011040257959394;-0.00014787164400332;-0.00021194019063842;-8.2191319961566e-05;7.8733050031587e-05;0.00023454720212612;3.3247604733333e-05;0.00025628678849898;-0.00085487525211647;-0.00089044577907771;9.378552203998e-05;0.0004047527036164;0.00052353361388668;0.0008252250845544;-0.00052895717089996;-7.5030227890238e-05;-0.00052651012083516;0.0001138799416367;-0.00052814476657659;8.6529347754549e-05;6.563363422174e-05;-9.2162408691365e-05;-0.00013046200911049;7.624981662957e-05;-2.8126678444096e-05;-3.6275032471167e-05;1.056571090885e-05;-0.00030269016860984;-0.0015548433875665;-0.00028465551440604;-0.00012900211731903;-4.250097390468e-06;0.0001007521423162;-6.4900181314442e-05;-0.00017887316062115;-1.9223312847316e-05;-0.0001508586719865;9.003360173665e-05;-0.00028334651142359;-0.00052270415471867;-0.0016085834940895;-0.00014573235239368;0.00047762473695911;0.001737236045301;0.00086875370470807;0.00072083354461938;9.7950505733024e-05;0.00029963973793201;3.5980967368232e-05;0.00068411696702242;3.1499952456215e-05;8.6679741798434e-05;-5.1175928092562e-05;4.732361776405e-05;-2.8929924155818e-05;0.00021255316096358;0.00063999689882621;-0.0011376229813322;0.00026056685601361;-0.0011541271815076;-0.000239804488956;2.3563123249914e-05;1.6840411944941e-06;6.5655221987981e-05;-0.00016337171837222;0.00031075446167961;0.00017381901852787;7.0758964284323e-05;0.00014873624604661;-0.00024991368991323;-0.00081886164844036;-0.0015322890831158;-2.9325381547096e-05;-0.00042594590922818;0.0033065287861973;0.00072775897569954;0.00012058723950759;-0.00025441613979638;-8.1918165960815e-05;-0.00019607963622548;0.00040708779124543;6.5821601310745e-05;-0.00020555286027957;-0.00011850009468617;0.0001007864048006;5.3730578656541e-05;-2.7475247406983e-05;0.00021752287284471;0.00028919804026373;-0.00028157752240077;0.00082053360529244;-0.0002679243334569;0.00018064568575937;8.4034822066315e-05;-0.00012903203605674;-0.00012760137906298;-5.1055056246696e-05;3.248254142818e-05;0.00016480454360135;1.1803297638835e-05;0.00021862692665309;-0.00048225151840597;-0.00049660255899653;0.00010312361700926;0.00029371003620327;0.00014951256162021;0.00054500723490492;-0.00050412811106071;-2.2030775653548e-05;-0.00037135451566428;0.00010578057117527;-0.00046017585555092;5.3553889301838e-05;4.4665957830148e-05;-5.2889590733685e-05;-9.4638329755981e-05;5.3098028729437e-05;-4.0707241169002e-06;4.2811807361431e-05;-8.8759470600053e-06;-0.00020939069509041;-0.0011826057452708;-0.00020380728528835;-8.2221478805877e-05;-1.388338120023e-07;6.8580055085476e-05;-6.3391715229955e-05;-0.00014914947678335;4.1792955016717e-06;-0.00012533775588963;6.4055362599902e-05;-0.00020858927746303;-0.00046505467616953;-0.0011493298225105;-0.00010259808186674;0.00033411840558983;0.0013429227983579;0.00061706831911579;0.0005073556676507;3.8088826840976e-05;0.0002622839238029;2.2954100131756e-05;0.00050745287444443;2.8133745217929e-05;6.5645224822219e-05;-4.3954943976132e-05;3.9767957787262e-05;-1.8027727492154e-05;0.00013898308679927;0.0004602839180734;-0.00073533045360819;0.00016644397692289;-0.00061138026649132;-0.00018014543456957;3.5554399801185e-05;8.0081963460543e-06;3.1986961403163e-05;-0.00012180416524643;0.00024090058286674;0.00012050804070896;9.7957861726172e-05;0.00010099598148372;-0.00013774969556835;-0.00057866197312251;-0.0010355416452512;-3.4449774375389e-06;-0.00028393455431797;0.0021921412553638;0.000517675827723;2.4820669750625e-06;-0.00018000976706389;-0.00016596072237007;-0.00012632727157325;0.0001948439021362;5.0550093874335e-05;-0.00014980392006692;-8.3765553426929e-05;5.257198063191e-05;6.0419173678383e-05;-8.7846470705699e-05;-0.00073374347994104;-0.00035883087548427;-4.1624043660704e-05;0.00026126619195566;-4.9097383453045e-05;0.00017254259728361;4.8943198635243e-05;-5.8780180552276e-05;0.0002836647327058;0.00014858770009596;-8.1727805081755e-05;-8.1397920439485e-05;-8.2217833551113e-05;-8.9910417955252e-07;0.00096620694966987;0.00053366634529084;4.3427771743154e-06;-0.00041433010483161;-0.00041848493856378;6.3627972849645e-05;-0.00041995718493126;0.00020081110415049;0.00010083519737236;0.00010605370334815;-7.7132048318163e-05;-0.00013474289153237;-5.419211811386e-05;8.1135243817698e-05;6.2901461205911e-05;-0.00016399717424065;7.3715338658076e-05;0.00065123522654176;-0.00018112407997251;-0.00046001828741282;-0.00010962610394927;-0.0001592487533344;-4.4526143028634e-05;8.7389533291571e-05;-3.2760803151177e-05;-0.00010584502888378;-2.6938578230329e-06;5.7746536185732e-05;-6.2902749050409e-05;-0.00011038404045394;2.8059012038284e-05;-8.6540065240115e-05;-0.00036754389293492;-6.7101980675943e-05;-7.1020781433617e-06;0.00023372266150545;0.00039691073470749;0.00017458613729104;-0.0002591568918433;0.00011692166299326;0.00031668355222791;1.9438430172158e-05;0.00010224375728285;1.0125861990673e-05;-5.5051688832464e-05;6.8451236074907e-06;0.00013950085849501;9.7001275207731e-06;-0.00075870030559599;0.00024226958339568;-0.0011899842647836;-2.6652522137738e-05;-6.8104185629636e-05;-0.00028467699303292;7.1562411903869e-05;1.267582319997e-05;6.1485276091844e-05;-8.4410996350925e-05;1.635435182834e-05;7.7021228207741e-05;-0.00019944427185692;0.00012015982792946;-0.0006048291688785;-0.0016913278959692;-0.00012263705139048;0.0026388966944069;3.1565603421768e-05;0.00043736048974097;0.00088719720952213;6.4822343119886e-05;-6.5880522015505e-05;0.00043590454151854;-8.579391578678e-05;-5.4362259106711e-05;3.4432916436344e-05;3.7993679143256e-05;-8.2098718849011e-05;5.0982238462893e-05;-8.9483357442077e-05;-0.00070632220013067;-0.00041908872663043;-9.189158299705e-05;0.00027344463160262;-6.3602667069063e-05;0.00023440331278834;5.6157245126087e-05;-6.9309462560341e-05;0.00026643738965504;0.000168883765582;-0.00012208143016323;-9.5538700406905e-05;-9.5955583674368e-05;-1.9511113350745e-05;0.0010601551039144;0.00075232796370983;8.9277873485116e-06;-0.00064159504836425;-0.00041807582601905;8.4775681898464e-05;-0.00057963805738837;0.00028056171140634;0.00011674047709676;0.00014852172171231;-7.0065922045615e-05;-0.00012652031728067;-6.4219246269204e-05;9.1077818069607e-05;7.9502395237796e-05;-0.00014781013305765;7.3638257163111e-05;0.00052591582061723;-0.00019790935039055;-0.00068189931334928;-0.00014285488578025;-0.00017235516861547;-0.00010142542305402;9.4534225354437e-05;-3.0238741601352e-05;-0.00010714116797317;-2.9811806143698e-06;1.5875762983342e-05;-6.61327430862e-05;-0.0001445244270144;4.593513222062e-05;-0.0001064130483428;-0.00065458903554827;-8.5703344666399e-05;0.00032087563886307;0.000275953207165;0.00049090094398707;0.00033751223236322;-0.00016648818564136;0.00013115284673404;0.00040523713687435;1.9795830667135e-05;9.6835232398007e-05;1.1932363122469e-05;-3.615907553467e-05;-1.4693822549816e-06;0.00017200587899424;-2.9633483222824e-07;-0.00091813906328753;0.00030257616890594;-0.0013476421590894;3.1694777135272e-05;-6.7047294578515e-05;-0.00027968530775979;8.0338490079157e-05;6.817083885835e-06;0.00010055612074211;-9.0445588284638e-05;9.9659964689636e-06;9.4248163804878e-05;-0.00023428145505022;0.00013110002328176;-0.00066032860195264;-0.001757956109941;-0.00011890004680026;0.002974963048473;-5.7789671700448e-05;0.00044255901593715;0.0008865010458976;8.8587512436789e-05;-9.543990745442e-05;0.00049885752378032;-0.00011332041322021;-8.3062092016917e-05;3.5729604860535e-05;5.6969343859237e-05;-8.9135712187272e-05;-1.6320598206221e-06;-1.6647143638693e-05;0.0004261891299393;-0.00044082643580623;0.00094739272026345;-0.00073747156420723;-6.2612511101179e-05;0.00011334083683323;-4.5542943553301e-05;4.0191836887971e-05;-7.5193791417405e-05;0.00011199594882783;7.5045907578897e-05;-6.2879182223696e-05;0.00021046859910712;-0.00019729185441975;0.00011526859452715;0.0001744701876305;6.9006650846859e-06;-0.0021183586213738;0.0018049981445074;0.00019018542661797;-0.000346497137798;-7.6831565820612e-06;-1.5799079847056e-05;-0.00042590481461957;0.00034551150747575;3.3991960663116e-05;-4.0977476601256e-05;-8.7611049821135e-05;8.6977226601448e-05;-8.9196961198468e-05;-3.7507903471123e-05;-0.00078824488446116;-0.00080053356941789;-0.00033620939939283;-0.00029717746656388;-0.00023039798543323;-0.00017370538262185;1.2405273992044e-05;-1.5404983059852e-05;0.00024174194550142;0.00015860608255025;-0.00023314777354244;-0.00022182078100741;2.9138573154341e-07;1.1963631550316e-05;0.0014204052276909;-0.0012898615095764;-4.1481639527774e-06;0.00018551394168753;0.00022695933876093;0.0006341875414364;0.00054802204249427;0.00034415288246237;0.00037236037314869;0.00018594338325784;0.0001406929368386;-5.4055093642091e-05;-2.7338550353306e-05;6.0512589698192e-05;5.4991789511405e-05;6.5781881858129e-05;6.4623287471477e-05;-0.00093552388716489;-0.0008714240975678;-0.00077285093721002;-0.00066859909566119;4.4869018893223e-05;5.9036221500719e-05;8.4467365013552e-06;6.6261532083445e-06;0.00019074403098784;0.00017396488692611;-0.00015415891539305;-0.00014915490464773;-0.0001839459000621;-0.00016666487499606;0.00015670941502322;-0.00027559316367842;0.00010909373668255;0.0011457289801911;0.0010266641620547;-9.1249028628226e-05;-0.00013508133997675;0.00035849423147738;0.00033826133585535;0.00035189467598684;0.00030116763082333;-0.00013013661373407;-0.00012227462138981;0.00013010484690312;0.00012444623280317;3.6704082049255e-06;-1.1466531759652e-05;0.00053551938617602;-0.00039816458593123;0.00094361562514678;-0.00081424316158518;-9.1121517471038e-05;9.9278091511223e-05;-4.2068808397744e-05;4.6725970605621e-05;-0.00011167679622304;9.6145704446826e-05;0.00010402085172245;-4.439270196599e-05;0.00022466902737506;-0.00020462642714847;-6.2197686929721e-05;-9.1124547907384e-06;-8.7355792857124e-06;-0.0020715629216284;0.0020128637552261;0.00028004960040562;-0.00028780670254491;-5.508515459951e-05;-4.9586971726967e-05;-0.0004387007211335;0.00036753158201464;4.9782069254434e-05;-3.4704931749729e-05;-0.00010713558731368;7.851718692109e-05;-8.1772028352134e-05;-4.6779972763034e-05;-0.00085362675599754;-0.00080919108586386;-0.0003381498681847;-0.00036291449214332;-0.00024649302940816;-0.00018625786469784;9.174395017908e-06;-6.9085872382857e-06;0.0002541791764088;0.00015872123185545;-0.00024657812900841;-0.00022736558457837;1.1841852938232e-05;-1.8823915297617e-06;0.0014553709188476;-0.0013907798565924;-1.8616061424837e-05;0.00020620302530006;0.00028488450334407;0.00069110584445298;0.0006031725788489;0.00037822721060365;0.00038161984412;0.00017535767983645;0.00017236392886844;-5.948607577011e-05;-2.4992372345878e-05;6.2832812545821e-05;5.6739248975646e-05;5.6005072110565e-05;8.6060004832689e-05;-0.0008621450397186;-0.0010015496518463;-0.00068653060588986;-0.00083760573761538;3.6717108741868e-05;6.5819898736663e-05;1.3963816627438e-06;1.6048985344241e-05;0.00018012666259892;0.00019290571799502;-0.0001411327830283;-0.00017259822925553;-0.00016147180576809;-0.00020733301062137;0.00013025088992435;-0.0003341008850839;0.00010899586050073;0.00099180662073195;0.0013220492983237;-6.5865708165802e-05;-0.00013093899178784;0.00033537391573191;0.00038903814856894;0.00031055355793796;0.0003750522446353;-0.00012455810792744;-0.00013822385517415;0.0001197692254209;0.00014608482888434;9.340174983663e-06;-2.7187404327833e-08;0.00043818398262374;-0.00017907840083353;0.00052972044795752;-0.00055363198043779;-9.5247793069575e-05;4.593107587425e-05;-1.9237211745349e-05;3.3765816624509e-05;-0.00010822476178873;3.5908211430069e-05;9.3451853899751e-05;-1.3103045830576e-06;0.00014871773601044;-0.00012713622709271;-0.00025383348111063;-0.00024086220946629;-2.2875272406964e-05;-0.0011007745051757;0.0013912258436903;0.00028228806331754;-0.00010012553684646;-9.1186411736999e-05;-6.7419648985378e-05;-0.00026639032876119;0.00023459682415705;4.824391726288e-05;-1.3304502317624e-05;-8.5196232248563e-05;3.4488020901335e-05;-3.8652939110762e-05;-3.8092472095741e-05;-0.00055853481171653;-0.00047213421203196;-0.00019554990285542;-0.00030762591632083;-0.00016566316480748;-0.00012874383537564;3.8593493627559e-06;1.0613860467856e-05;0.00015706644626334;8.8608103396837e-05;-0.00015371275367215;-0.00013699743431062;2.3247615899891e-05;-2.0214803953422e-05;0.00085831119213253;-0.00094033143250272;-4.7481509682257e-05;0.00013780668086838;0.0002491264604032;0.0004915869794786;0.00044539078953676;0.0002567759656813;0.00023495810455643;8.2762038800865e-05;0.00014238976291381;-3.8315673009492e-05;-1.0441994163557e-05;3.5757078876486e-05;3.423244561418e-05;2.469563150953e-05;8.2255377492402e-05;-0.00040246490971185;-0.00074425630737096;-0.00031947865500115;-0.00072677235584706;-5.8174828154733e-06;3.2616499083815e-05;-4.8400547711935e-06;2.3320744730881e-05;8.5386549471878e-05;0.00013270365889184;-6.5282154537272e-05;-0.00012888008495793;-6.4077459683176e-05;-0.00017116608796641;2.3877241801529e-06;-0.00040229316800833;4.4817294110544e-05;0.00043715137871914;0.0011972360080108;6.241537630558e-05;-4.6193467824196e-06;0.0001698467094684;0.00029311893740669;0.00013460534682963;0.00031584149110131;-6.3428451539949e-05;-0.00010024380753748;5.4141146392794e-05;0.00011108050239272;8.6611726146657e-05;-4.5612006942974e-05;0.00041050717118196;0.00047055960749276;-0.00024823320563883;0.00035496402415447;-0.00025644578272477;9.8969998362008e-05;7.1089998527896e-05;-7.4418283475097e-05;-0.00019704415171873;-0.00010987593850587;9.0766625362448e-05;0.00016743535525165;3.3027979952749e-05;0.00013202476839069;-0.00086993828881532;-0.00075101689435542;2.6387020625407e-05;0.00031918656895868;0.00061545596690848;0.00061378563987091;-0.00023042225802783;-9.8929915111512e-05;-0.00038462589145638;5.9980087826261e-05;-0.00025110912974924;7.61660412536e-05;7.131584425224e-05;-8.3322323916946e-05;-9.7240335890092e-05;5.8803234423976e-05;-6.9024732511025e-05;-0.00015692583110649;0.00015175259613898;-0.00019607119611464;-0.00093186367303133;-0.00017341210332233;-0.00012059412983945;-1.3504679373e-05;8.1390979175922e-05;-1.071887982107e-05;-0.0001137538056355;-4.9749676691135e-05;-6.2813407566864e-05;6.1230755818542e-05;-0.00017945053696167;-0.00017755707085598;-0.0010043561924249;-0.0001039108610712;0.0003126218507532;0.00087064114632085;0.00054377951892093;0.00052410358330235;0.00012694766337518;9.3893620942254e-05;2.3292766854865e-05;0.00044085650006309;1.1451321370259e-05;7.3734321631491e-05;-1.8659198758542e-05;7.866088708397e-06;-1.2669199350057e-05;0.000158396185725;0.00040326413000003;-0.0009260416845791;0.00015669819549657;-0.0011205674381927;-0.00019814319966827;-1.2068276191712e-05;-1.8891138324761e-06;6.6263142798562e-05;-0.00011044773418689;0.00019718940893654;0.00011724780779332;-4.6012960410735e-06;0.00011835683108075;-0.00023031824093778;-0.00059399154270068;-0.0013407295336947;-5.500982661033e-05;-0.00025392472161911;0.0026812027208507;0.0006322082481347;0.00023060807143338;-0.00015077191346791;6.6461005189922e-05;-0.00014467794972006;0.0004181094118394;4.2605726775946e-05;-0.00013738127017859;-8.6782165453769e-05;9.1404290287755e-05;6.8664478021674e-05;-3.3427502785344e-05;0.00032199473935179;0.00036847870796919;-0.00024006352759898;0.00044968517613597;-0.00024022403522395;0.00011203125905013;6.945676432224e-05;-8.3207822171971e-05;-0.00016078367480077;-8.4399551269598e-05;6.7313856561668e-05;0.00015276172780432;2.4274879251607e-05;0.00014546094462276;-0.00068560981890187;-0.00063127640169114;4.3110947444802e-05;0.00029195591923781;0.00044279749272391;0.00054982863366604;-0.0002789291611407;-7.0428985054605e-05;-0.00034438859438524;6.8766741605941e-05;-0.00028825449408032;6.3595820392948e-05;5.7690929679666e-05;-6.8128152634017e-05;-8.8747205154505e-05;5.5019270803314e-05;-4.4327574869385e-05;-8.2300881331321e-05;9.051788947545e-05;-0.00019075843738392;-0.00094978522974998;-0.00016823851910885;-0.00010581159585854;-8.2896249296027e-06;7.3947652708739e-05;-2.8689844839391e-05;-0.00011549134069355;-2.7207879611524e-05;-7.6991716923658e-05;5.6991480960278e-05;-0.00017658295109868;-0.0002650311216712;-0.00099176459480077;-0.00010285209282301;0.00030974057153799;0.00096247438341379;0.000531209516339;0.00049918028526008;8.9576453319751e-05;0.0001389618992107;2.1105797713972e-05;0.00043275329517201;1.5909177818685e-05;6.5610533056315e-05;-2.5697281671455e-05;1.6822445104481e-05;-1.6456348021165e-05;0.00014910555910319;0.0004064290842507;-0.00082211941480637;0.00014866885612719;-0.00093319354346022;-0.00018304011609871;-1.1570389233384e-06;1.5283317225112e-06;5.4059775720816e-05;-0.00010796999413287;0.00019464633078314;0.00011495425133035;1.7695276255836e-05;0.00010722369916039;-0.00019473780412227;-0.00056299625430256;-0.0011928532039747;-4.471877036849e-05;-0.00024144271446858;0.0023892489261925;0.00057246157666668;0.00017432965978514;-0.00015700708900113;1.4918839042366e-05;-0.00013177818618715;0.00033941262518056;4.2860974645009e-05;-0.00013406659127213;-8.2676851889119e-05;7.8670163929928e-05;1.3726702491113e-05;-3.0323673854582e-05;-9.7902622655965e-05;-0.00018012043437921;0.00035580346593633;-0.00014699647726957;-5.4386191550293e-06;7.6006064773537e-05;-2.5644858396845e-05;7.6922378866584e-06;4.3475611164467e-05;5.8361583796795e-05;-2.5425597414142e-05;-3.6794244806515e-05;7.5568372267298e-05;-6.8524524976965e-05;0.00030680058989674;0.0002588840725366;2.4504641260137e-05;-0.00073810311732814;0.00031716612284072;-1.151226751972e-05;-0.00021924298198428;9.4026712758932e-05;2.2994268874754e-05;-0.00015970352978911;9.3964066763874e-05;-2.1672085495084e-05;-2.105157909682e-05;1.044168413955e-07;3.9377660868922e-05;-7.675099914195e-05;-1.3400428542809e-05;-0.00015095427806955;-0.00030859978869557;6.3552106439602e-05;5.5452677770518e-05;-6.0744303482352e-05;-3.5824421502184e-05;9.1372357928776e-06;-1.5401712516905e-05;8.6657819338143e-05;6.8769142671954e-05;-5.4108149925014e-05;-8.5937615949661e-05;1.4663537513115e-05;3.1345731258625e-05;0.00068305723834783;-9.3239170382731e-05;-6.2598660406366e-06;-0.00031886782380752;-0.00019694968068507;0.00012318603694439;8.6595922766719e-05;4.4951968448004e-05;0.00014440501399804;1.0969703907904e-05;-1.676230749581e-05;-3.4658351069083e-06;-1.0367320101068e-05;5.2653672355518e-06;1.9624219930847e-05;4.6061766624916e-05;1.0997823665093e-05;-0.00057075062068179;-0.0002831413585227;-0.00056298612616956;-0.00018040926079266;-4.6239842049545e-05;-6.8737579567824e-05;2.6885203624261e-05;1.5030965414553e-06;0.00010056529572466;5.4873271437827e-05;-0.00010029866825789;-4.611533950083e-05;-9.8469732620288e-05;-3.7233869534248e-06;9.8352626082487e-05;-0.00065982370870188;-4.0783852455206e-05;0.0009135608561337;0.00027632658020593;0.00023791384592187;0.00027054813108407;0.00023537875676993;0.00012432027142495;0.00022689378238283;4.7727466153447e-05;-6.2426115619019e-05;-3.3208158129128e-05;6.4907100750133e-05;2.0297871742514e-05;2.2910349798622e-05;-4.279802669771e-05;-0.00011320524936309;-0.00023380892525893;0.00050891010323539;-0.00024078349815682;-1.3549602044804e-05;0.00010132478928426;-3.6433011700865e-05;1.4473603187071e-05;5.0075552280759e-05;7.6187898230273e-05;-2.8030081011821e-05;-4.540464215097e-05;0.00011228373477934;-0.00010124779510079;0.00038111751200631;0.00031547076650895;2.9184031518525e-05;-0.0010507324477658;0.00052866869373247;9.0350185928401e-06;-0.000291972537525;0.00012608128599823;1.6468449757667e-05;-0.00023349597177003;0.00014492690388579;-2.6121868359041e-05;-2.64565442194e-05;-5.9419421631901e-06;5.2863444579998e-05;-0.00010744992323453;-2.4427879907307e-05;-0.00024822636623867;-0.00044892824371345;0.00010553510219324;7.8935343481135e-05;-8.6732616182417e-05;-5.2190713176969e-05;9.6549665613566e-06;-2.162299824704e-05;0.00013211493205745;0.00010119137732545;-8.4038088971283e-05;-0.00012590068217833;2.5543629817548e-05;4.3344214645913e-05;0.0010267291218042;-0.0001342557661701;-2.6715674721345e-06;-0.00047229527262971;-0.00029755118885078;0.0001713745878078;0.00012183864600956;7.6943986641709e-05;0.00020878802752122;8.520834853698e-06;-1.9852697732858e-05;-8.7691614680807e-06;-1.4513676433126e-05;1.0102233318321e-05;2.8809901778004e-05;5.4828025895404e-05;1.9675209841807e-05;-0.00079420628026128;-0.00045959567069076;-0.00074448314262554;-0.00029254000401124;-6.1396320234053e-05;-8.7037995399442e-05;3.3842905395431e-05;3.3248361432925e-06;0.00014636991545558;8.9289263996761e-05;-0.00013980694347993;-7.7785764005966e-05;-0.00013045080413576;-1.8249589629704e-05;0.00017987277533393;-0.00088394485646859;-4.6694414777448e-05;0.0012004389427602;0.00045068556210026;0.00031085289083421;0.00034825439797714;0.0003238936769776;0.00019792470266111;0.00030146323842928;8.8285669335164e-05;-8.7269741925411e-05;-5.3093528549653e-05;8.9516594016459e-05;3.8036476325942e-05;2.736809074122e-05;-4.3137970351381e-05;0.00011990732309641;-0.00026197655824944;0.00074903073254973;-0.00052414101082832;-5.5022996093612e-05;0.00012046913616359;-4.4367934606271e-05;3.2693209504941e-05;-1.2564768439915e-05;7.9160294262692e-05;2.264549038955e-05;-3.9327904232778e-05;0.00017818724154495;-0.00016523286467418;0.00020439793297555;0.00021404078870546;1.5305429769796e-05;-0.001601449213922;0.0012353005586192;0.00014556424866896;-0.00034412590321153;8.1805301306304e-05;-4.1226907342207e-05;-0.00035298106377013;0.00026753931888379;1.51404378812e-06;-2.4676744942553e-05;-5.0726790504996e-05;6.6029424488079e-05;-0.00011812112643383;-4.9675374611979e-05;-0.0005676030414179;-0.00065652129705995;1.7345338392261e-06;-2.1675470634364e-05;-0.0001545991981402;-0.00011321806960041;5.5308773880824e-06;-2.0847999621765e-05;0.00021465378813446;0.00014263021876104;-0.0001726247719489;-0.00018611444102135;3.2410523999715e-05;4.2075262172148e-05;0.0015096940333024;-0.0005466578877531;6.404939085769e-07;-0.00039209597161971;-0.00026574893854558;0.00036325416294858;0.0003049804654438;0.00022599674412049;0.00030530750518665;5.6750912335701e-05;3.4839165891754e-05;-3.4172015148215e-05;-1.7502236005384e-05;3.6140478187008e-05;4.0538667235523e-05;5.2979423344368e-05;4.6224362449721e-05;-0.0009932896355167;-0.00083281326806173;-0.00082045659655705;-0.00060081045376137;-4.5680557377636e-05;-4.9798145482782e-05;2.539251181588e-05;1.1886467291333e-05;0.00020024536934216;0.00016257763491012;-0.00016888805839699;-0.00014318147441372;-0.00015344301937148;-0.00010209085303359;0.00027722434606403;-0.00089344481239095;3.527630269673e-06;0.0012886724434793;0.00095076014986262;0.00024945760378614;0.00024731806479394;0.00039040870615281;0.00033376240753569;0.00034041778417304;0.00023412403243128;-0.00011922896374017;-0.00010090870637214;0.00011549436021596;9.3561211542692e-05;3.1705585570307e-05;-3.5915574699175e-05;0.00027066713664681;-0.00017481185204815;0.00070146279176697;-0.0005984622403048;-8.1556274381001e-05;9.8201482614968e-05;-3.7196674384177e-05;3.9028338505886e-05;-6.3558763940819e-05;5.0202979764435e-05;5.8791232731892e-05;-1.4754196854483e-05;0.00018143917259295;-0.00016754040552769;-4.3081476178486e-05;1.4841487427475e-05;-3.1298034173233e-06;-0.0014909021556377;0.0014323898358271;0.00023467125720344;-0.00026641367003322;1.7136611859314e-05;-8.6398104031105e-05;-0.00034359231358394;0.00028614565962926;2.379366014793e-05;-1.2200492164993e-05;-7.2889924922492e-05;5.1926752348663e-05;-9.7233154519927e-05;-6.2272069044411e-05;-0.00064483773894608;-0.00061070959782228;-3.2965454010991e-05;-8.4927400166634e-05;-0.00016085867537186;-0.00012798367242794;-2.248610968536e-07;-1.0118987120222e-05;0.00022090660058893;0.0001330669329036;-0.0001887848629849;-0.00017727955128066;3.7417838029796e-05;2.7334777769283e-05;0.0014745687367395;-0.00065404566703364;-8.6027293946245e-06;-0.00029014120809734;-0.00020894731278531;0.00040136682218872;0.00035944022238255;0.00027087889611721;0.00028607939020731;5.6374989071628e-05;6.6939268435817e-05;-4.214402360958e-05;-1.1427412573539e-05;4.2792889871635e-05;3.6337070923764e-05;3.938849476981e-05;6.4114465203602e-05;-0.00085890566697344;-0.00093451351858675;-0.0006644397508353;-0.00075577880488709;-4.6556040615542e-05;-2.8125847165938e-05;1.4274314708018e-05;2.1355303033488e-05;0.00017909919552039;0.0001763971085893;-0.00014339451445267;-0.00016118398343679;-0.00011908707529074;-0.00014699809253216;0.00024103005125653;-0.00084613141370937;1.4013067811902e-05;0.0010208716848865;0.0012257943162695;0.00023406746913679;0.00019650928152259;0.00033964513568208;0.00036850466858596;0.00027092811069451;0.00030810694443062;-0.0001076389089576;-0.0001133074547397;9.7899290267378e-05;0.0001140621243394;3.3043710573111e-05;-2.3996706659091e-05;0.00033364872797392;5.4605097830063e-06;0.00039014726644382;-0.00044996762881055;-8.401766535826e-05;4.5222368498798e-05;-1.605536454008e-05;3.0148938094499e-05;-9.7971191280521e-05;-3.9102442315198e-06;7.4006034992635e-05;1.8640952475835e-05;0.00012018070992781;-0.00010855599975912;-0.00030613239505328;-0.00019380953744985;-1.7704223864712e-05;-0.00080399750731885;0.0010898120235652;0.00024365902936552;-9.9722114100587e-05;-5.7459310482955e-05;-0.00010640624532243;-0.00020769395632669;0.00019880826584995;3.9032100175973e-05;8.8555661932332e-06;-6.8952569563407e-05;1.5686464394093e-05;-4.3170457502129e-05;-6.148919055704e-05;-0.00048494854127057;-0.0003061899333261;-4.7049885324668e-05;-0.00011765235103667;-0.00010860879410757;-0.00010432935960125;-5.3687081162934e-06;9.9357184808468e-06;0.00014881171227898;7.1782182203606e-05;-0.00013672534259968;-9.7894691862166e-05;3.0901941499906e-05;1.2963297422175e-06;0.00089747190941125;-0.00051023467676714;-2.9559174436145e-05;-9.6461531938985e-05;-0.00010841267794603;0.00030042679281905;0.00030616144067608;0.00021662842482328;0.00014675721467938;3.0712995794602e-05;7.8067860158626e-05;-3.2354186259909e-05;4.4421130951378e-06;3.2650470529916e-05;1.4402370652533e-05;2.3804721422493e-05;6.7022680013906e-05;-0.00042534925159998;-0.00072026363341138;-0.00032976997317746;-0.00071343057788908;-5.8221703511663e-05;-1.6496702301083e-05;2.9965174235258e-06;2.8400290830177e-05;8.5038227553014e-05;0.0001239919802174;-6.8405526690185e-05;-0.00012083262845408;-4.1294581023976e-05;-0.00014522357378155;4.9628779379418e-05;-0.00070709217106923;-7.8884040703997e-06;0.00048451690236107;0.0012063032481819;0.00024411850608885;0.00017045816639438;0.00018389677279629;0.0002795473264996;0.00011825150431832;0.00029265185003169;-5.6526205298724e-05;-8.5884887084831e-05;4.2817628127523e-05;9.3234739324544e-05;5.873064219486e-05;-4.5659417082788e-05;0.00029871342121623;0.0002948705223389;9.6747135103215e-05;-0.00025662902044132;-7.5989664765075e-05;1.8653970982996e-05;1.4754045878362e-06;1.7008032955346e-05;-0.00011698150046868;-7.1851398388389e-05;6.7780056269839e-05;5.6653439969523e-05;5.8108747907681e-05;-5.0550825108076e-05;-0.00052129972027615;-0.00025118669145741;-1.7130294509116e-05;-0.00021055273828097;0.00066068134037778;0.00021814116917085;-3.0970899388194e-05;-6.6746448283084e-05;-0.00016940447676461;-7.7428754593711e-05;0.00010680830018828;4.2211253457936e-05;4.4108004658483e-05;-5.458208033815e-05;-2.3727536245133e-05;-9.9390972536639e-06;-8.4362865891308e-05;-0.00034220906672999;4.2285479139537e-05;1.0207142622676e-05;-2.3430944565916e-05;-4.1390168917133e-05;-7.8523662523367e-05;-1.6446028894279e-05;2.3453294488718e-05;9.7543255833443e-05;1.3263253094919e-05;-9.9473072623368e-05;-1.3980286894366e-05;2.6041754608741e-05;-5.2764030442631e-06;0.00056212284835055;-0.00015855864330661;-1.8889359125751e-05;-9.1645866632462e-05;-0.00029536228976212;0.00011107284080936;0.00018325936980546;0.00015963206533343;-2.4637547539896e-05;1.2142662342285e-07;5.6034845329123e-05;-2.1131174435141e-05;3.1431096431334e-05;2.6577186872601e-05;-1.7789334378904e-05;1.9573932149797e-05;4.9528240197105e-05;-0.00019387970678508;-0.00056264048907906;-0.00015156314475462;-0.00067449134076014;-9.8449840152171e-05;-3.6050834751222e-05;1.4419591707338e-06;3.6369026929606e-05;2.6447340133018e-05;8.6153668235056e-05;-2.5152201487799e-05;-7.893252040958e-05;1.6595535271335e-05;-0.00012795308430213;-4.9806181777967e-05;-0.00080044736387208;-4.3281113903504e-05;0.00022002818877809;0.0012279298389331;0.00035342000774108;0.00023401700309478;0.00010104929970112;0.00018846211605705;2.3818563931854e-05;0.00026853717281483;-2.0998277250328e-05;-5.5467597121606e-05;2.9599684694404e-06;6.278179353103e-05;3.976232255809e-05;-5.3623032727046e-05;-0.00028753286460415;-0.0001675419480307;0.0003807018219959;-0.00012317355140112;-1.9115393570246e-06;8.2081867731176e-05;-3.2775376894278e-05;1.0313389793737e-05;8.2165694038849e-05;6.5941210777964e-05;-5.4798278142698e-05;-3.3007505408023e-05;8.5085259343032e-05;-7.0965434133541e-05;0.00043758645188063;0.00028134946478531;2.5308785552625e-05;-0.00075635552639142;0.00025803886819631;-9.9777244031429e-06;-0.00023993878858164;0.00017950308392756;4.6732989176235e-06;-0.0001823629863793;9.1960020654369e-05;-4.4098374928581e-05;-2.0302173652453e-05;1.5007514775789e-05;3.8886075344635e-05;-0.00011434786574682;-2.2063810320105e-05;-9.4643357442692e-05;-0.00037715976941399;0.00024638389004394;0.0001652174978517;-5.0678478146438e-05;-1.1146466931677e-05;5.7660950005811e-06;-2.6681898816605e-05;0.00010505632235436;8.9886787463911e-05;-4.0695656934986e-05;-0.00010839111928362;3.5586082958616e-05;4.487393744057e-05;0.00096086668781936;0.00017852237215266;2.014823621721e-05;-0.00068492244463414;-0.00041356959263794;3.2308867957909e-05;-2.408926593489e-05;-1.0367551112722e-05;0.00017230355297215;-4.1935738408938e-05;-4.9274727643933e-05;3.4283411878278e-06;-1.1966206329816e-05;-5.1263100431242e-06;2.6711551981862e-05;2.9649647331098e-05;1.2308334589761e-05;-0.00071470253169537;-0.00040505608194508;-0.00064476387342438;-0.00020022697572131;-6.9628629717045e-05;-0.00010403591295471;3.3851880289149e-05;1.3259875686344e-06;0.00013811628741678;7.8547876910307e-05;-0.00012530329695437;-7.1897411544342e-05;-0.00010688655311242;9.2971786216367e-06;0.00024921543081291;-0.00086516025476158;-5.7955327065429e-05;0.0010616317158565;0.00029838999034837;0.0003205549728591;0.00038116661016829;0.00027850986225531;0.00017894303891808;0.00025977898621932;4.6202883822843e-05;-6.9897723733447e-05;-3.9511713112006e-05;7.2909075242933e-05;2.462652810209e-05;-4.6933531848481e-05;-1.4632398688263e-06;6.8224857386667e-05;0.00010965899127768;0.00052381865680218;8.5016879893374e-05;-0.00074662256520241;-0.00038649971247651;0.00012211409921292;-0.00014945586735848;0.00012219809286762;-5.0839458708651e-05;-0.00016611498722341;-0.00011324162915116;9.6360381576233e-05;0.00013579307415057;2.354672869842e-05;0.00060383439995348;0.0011955513618886;-0.00011630552035058;-0.00035107124131173;-0.001002230681479;-0.00024602268240415;-0.00030002134735696;4.6047975047259e-05;0.00039329659193754;0.00010464783554198;6.8997869675513e-05;6.2120481743477e-05;-6.0831054724986e-05;-2.3574673832627e-05;1.6777288465164e-06;3.3217263990082e-05;2.6010466172011e-05;-9.3248527264223e-05;-0.00099952332675457;-0.00040865677874535;-0.00084293313557282;0.00041214490192942;0.00030698062619194;5.1538634579629e-05;-0.0001473059237469;-4.4534739572555e-05;-0.00013255089288577;0.00015390753105748;7.0526126364712e-05;-0.00010001385089708;-7.6618482125923e-05;-0.0011130397906527;-0.0013002274790779;0.0002368827117607;0.00044073251774535;0.0022312619257718;0.00070375436916947;0.0003049390797969;0.00010761799785541;0.00041070408769883;-0.00015513798280153;0.0001246121537406;-4.6149791160133e-05;-0.00013848148228135;-1.8085813280777e-05;9.6982083050534e-05;-1.9317396436236e-05;-0.0002207401121268;-0.00021531179663725;-0.0018649876583368;5.9585185226751e-05;-0.00097075471421704;-0.0001599393581273;-1.0754144568637e-05;4.9437687266618e-05;-0.00034178796340711;0.00012860386050306;-0.00031548168044537;-3.4666547435336e-05;0.00011283754429314;3.9051303701854e-07;-0.00011937703675358;-0.0016924333758652;-3.9803230720281e-06;0.00076674512820318;0.00075642776209861;0.0025485681835562;-6.5117914346047e-05;0.00093778682639822;-0.00012186259846203;0.00051355274626985;0.00010514733730815;0.00013236231461633;-3.4542797948234e-05;-3.4264110581717e-05;1.6892417988856e-05;-6.7016248067375e-05;1.1382669981685e-05;7.4965180829167e-05;0.00012513184628915;0.00081570725888014;-0.00012383314606268;-0.00061881286092103;-0.00048896565567702;8.5037609096617e-05;-0.00012658142077271;0.00019758417329285;-0.00010534800821915;-0.00015444109158125;-0.00013365765335038;8.6315485532396e-05;0.00013850665709469;3.492581890896e-05;0.00068352546077222;0.0012260277289897;-0.0001375816646032;-0.00041101154056378;-0.0014688533265144;9.8359108960722e-05;-0.0004566507122945;0.00015650500427;0.00036482440191321;0.00013877438323107;4.9160382332047e-05;7.9290875873994e-05;-4.5628985390067e-05;-2.764170858427e-05;1.3289586604515e-05;3.5804223443847e-05;1.7669075532467e-05;-7.3839175456669e-05;-0.0011608103523031;-0.00058292766334489;-0.00069876085035503;0.00044877271284349;0.00032052979804575;9.5833522209432e-05;-0.00018898984126281;-8.2879218098242e-05;-9.6046940598171e-05;0.00016980663349386;5.4228923545452e-05;-0.0001148958253907;-9.089382365346e-05;-0.0011954420479015;-0.0017351413844153;0.00027960931765847;0.00043187642586417;0.0024518868885934;0.001048659090884;0.00038812021375634;0.00017591020150576;0.00034751769271679;-0.00016655499348417;0.00012147596862633;-3.811190254055e-05;-0.00014568080950994;-3.0015531592653e-05;0.00010050684068119;-2.0934514395776e-05;-0.00024293428577948;-0.00022025716316421;-0.0020456502679735;-5.0275189096283e-06;-0.0012240200303495;-0.00034233633778058;6.8525723690982e-06;2.3614755264134e-05;-0.00037637751665898;0.00011484771675896;-0.00040918742888607;-8.9547414972913e-05;0.00014883310359437;5.1672777772183e-05;-0.00011911825276911;-0.0018101920140907;0.00021818587265443;0.00083880068268627;0.00078064028639346;0.0026978654786944;7.4332609756311e-07;0.0010394111741334;-8.0481608165428e-05;0.00066929316380993;0.000180615708814;0.00017181248404086;-1.0745592589956e-05;-4.9481997848488e-05;2.5959579943446e-06;-6.954913988011e-05;2.4500957806595e-05;5.2353061619215e-05;0.00010885368101299;0.0009209553245455;-0.00036806188290939;-0.00033098208950832;-0.00048245160724036;3.0289651476778e-05;-7.00551099726e-05;0.00023158501426224;-0.00014697041478939;-9.4674382125959e-05;-0.00011783955415012;5.600911390502e-05;0.00010746949556051;2.8750340788974e-05;0.00053188466699794;0.00092494126874954;-7.5256764830556e-05;-0.00036061814171262;-0.0016214206116274;0.00056224351283163;-0.00051538326079026;0.00025706316228025;0.00024185370421037;0.00013111974112689;1.3151410712453e-05;7.7932978456374e-05;-2.3012087694951e-05;-2.4681979994057e-05;2.0738520106534e-05;3.0867151508573e-05;1.683431037236e-05;-3.1764815503266e-05;-0.0010520310606807;-0.00063650665106252;-0.00040607698610984;0.00038037565536797;0.00027255900204182;0.00012180337216705;-0.0001877132744994;-0.00010670986375771;-3.316155198263e-05;0.0001474656019127;2.8708538593492e-05;-9.6169969765469e-05;-8.8648419477977e-05;-0.00099628057796508;-0.0018488680943847;0.00024103905889206;0.00031755742384121;0.0021568788215518;0.0012017394183204;0.00037218772922643;0.00020638181013055;0.0002025120484177;-0.00014323317736853;9.2544105427805e-05;-1.7182788724313e-05;-0.00012466302723624;-4.1182196582668e-05;8.0681827967055e-05;-1.3831096111971e-05;-0.00021545319759753;-0.00018390550394543;-0.0017868969589472;-0.00017372673028149;-0.0012079225853086;-0.00051834137411788;1.6152904208866e-05;4.5302610374165e-07;-0.00032469851430506;5.6846689403756e-05;-0.00040819487185217;-0.00014215032570064;0.00015227482072078;9.9131582828704e-05;-9.116066939896e-05;-0.0015998746966943;0.00037726058508269;0.00074077863246202;0.0006574317230843;0.0022818935103714;0.00021916659898125;0.00090996746439487;2.7085819965578e-05;0.00067197339376435;0.00024971651146188;0.0001699556451058;2.4943945390987e-05;-5.2221639634809e-05;-1.7336353266728e-05;-1.8969854863826e-05;4.1152587073157e-05;-6.3838335336186e-05;-1.6015183064155e-05;0.0002864878915716;-0.0005705245421268;0.0002242390619358;0.00017133934306912;3.1105581001611e-05;-2.5674233256723e-05;0.00011781233479269;-0.00012515524576884;6.9389752752613e-05;6.479820876848e-05;-4.5280165068107e-05;-4.5647018851014e-05;-3.2283343898598e-05;-0.00035980687243864;-0.0004520230286289;0.00024837336968631;5.495960067492e-05;-0.00040868215728551;0.001019288552925;-0.00021835362713318;0.00027616863371804;-6.2561884988099e-05;-0.00013331856462173;-4.86717253807e-05;-1.4812229892414e-05;1.1554277079995e-05;2.4948783902801e-05;3.2467909477418e-05;1.1207198440388e-05;-5.9457990573719e-05;1.0206665137957e-05;-0.00054238829761744;-0.00070378318196163;0.00021388896857388;-0.00024770616437308;8.746193634579e-05;0.00018133175035473;-0.00010044644295704;-0.00011693343549268;8.9744673459791e-05;-1.4028629266249e-05;-4.6454075345537e-05;1.6313539163093e-05;-6.8188004661351e-05;-0.00079525448381901;-0.0012940901797265;0.00031001391471364;0.00017716495494824;0.00092967640375718;0.0015178190078586;0.00021489622304216;0.00023739217431284;-8.6442458268721e-05;0.00011052020272473;-5.6171556934714e-06;5.6594431953272e-05;-3.6327528505353e-05;-7.9581841418985e-05;-1.5405566955451e-06;3.1975945603335e-05;-0.00013748749915976;-9.6261886938009e-05;-0.00021184541401453;-0.0008050735341385;-0.00040599019848742;-0.00081213127123192;-4.2746296458063e-06;-1.3449019206746e-05;2.2930804334464e-05;-0.00013625601422973;-0.00013742207374889;-0.00022094248561189;5.6047720136121e-05;0.00015284333494492;-4.7401339543285e-05;-0.00096704729367048;0.00041325428173877;0.00045668767415918;0.00036359549267218;0.00018251007713843;0.0011983748991042;6.841526919743e-05;0.00038565025897697;0.00023645343026146;0.0003531557158567;2.8818207283621e-05;9.8454234830569e-05;-1.9479789443722e-06;-5.009613596485e-05;-1.1246468602621e-05;3.2086230930872e-05;-5.7035213103518e-05;-1.9065777451033e-05;0.00017550797201693;-0.00044397290912457;0.00019117050396744;0.00016190846508835;3.8160822441569e-05;-2.8915772418259e-05;8.2913546066266e-05;-9.342822158942e-05;6.2886494561099e-05;5.6807337386999e-05;-4.6343400754267e-05;-3.7421476008603e-05;-2.9082986657158e-05;-0.00033181431354024;-0.00041481695370749;0.00021215422020759;6.8389112129807e-05;-0.00022830712259747;0.00079506303882226;-0.00014820843352936;0.00021061999723315;-5.9320136642782e-05;-0.00011424929107307;-4.0897102735471e-05;-1.5598589016008e-05;1.1375511348888e-05;2.0680894522229e-05;2.4776636564638e-05;7.0913702074904e-06;-4.8693109420128e-05;1.0081678738061e-05;-0.00038720201700926;-0.00054473784985021;0.00018322595860809;-0.00023616012185812;5.6736625992926e-05;0.0001536950294394;-7.0641872298438e-05;-8.7882312072907e-05;7.6277523476165e-05;-1.6265863450826e-05;-3.9237889723154e-05;1.0870917321881e-05;-5.0019847549265e-05;-0.00061095762066543;-0.00094611704116687;0.00024186473456211;0.0001331597159151;0.00065141334198415;0.0011800195788965;0.00015127290680539;0.00017820269567892;-7.5265539635438e-05;0.00010791333625093;-9.1305109890527e-06;4.6114510041662e-05;-2.5810002625803e-05;-6.4595049479976e-05;-3.2087032195705e-06;2.8605621992028e-05;-0.00011245218047407;-7.666143210372e-05;-0.00010962777014356;-0.00069949444150552;-0.00025789355277084;-0.00066027801949531;-2.2098402041593e-06;8.3578133853734e-06;3.4133070585085e-05;-0.00011963544238824;-8.4643812442664e-05;-0.00017513369675726;3.4183110983577e-05;0.00011429515143391;-4.4112144678365e-05;-0.00080144114326686;0.00025700073456392;0.00037946863449179;0.00030318251810968;8.3947867096867e-05;0.0010617000516504;1.6874753782758e-05;0.00032946758437902;0.00015404890291393;0.00029171476489864;1.2012553270324e-05;8.1066806160379e-05;-5.7755139559745e-10;-4.3267085857224e-05;-1.7343319996144e-05;-1.140287531598e-05;3.6573208490154e-05;9.2107999080326e-05;0.00023730566317681;0.00015643052756786;-0.000635341682937;-0.0002814982435666;0.00011527694732649;-0.00013215187937021;3.7421166780405e-05;-1.9404589693295e-05;-0.00011813197488664;-8.8001193944365e-05;9.955232962966e-05;0.00011553334479686;5.7710440160008e-06;0.00044220880954526;0.00093261519214138;-4.7302040911745e-05;-0.00027102066087537;-0.0005775733734481;-0.00032293904223479;-0.00012359833635855;-9.5008617790882e-06;0.00028577484772541;7.2591239586473e-05;6.628059054492e-05;4.7101028030738e-05;-6.8209577875677e-05;-1.9124297978124e-05;-1.6963751477306e-05;2.6687239369494e-05;6.5632280893624e-05;-7.859413017286e-05;-0.00056239787954837;-0.00018768791051116;-0.0008243428892456;0.00033290503779426;0.00027465613675304;-8.6742438725196e-06;-6.7159868194722e-05;-1.3340086297831e-05;-0.00010414553980809;0.0001175099023385;7.4683142884169e-05;-6.1309547163546e-05;-3.9609920349903e-05;-0.00073304591933265;-0.00075517740333453;6.2807761423755e-05;0.0003200120117981;0.0016019071917981;0.000287703005597;0.00010122016828973;3.6195680877427e-05;0.00035566816222854;-0.00013362638128456;0.00010135857883142;-4.0179667848861e-05;-0.00012186176900286;-1.0829392522282e-05;8.1227321061306e-05;-1.0165615094593e-05;-0.00017221219604835;-0.00020618611597456;-0.0016036522574723;2.2538626581081e-05;-0.00073679420165718;1.6508438420715e-05;1.943635106727e-05;6.1251143051777e-05;-0.00028401470626704;0.00011443979747128;-0.00020234781550243;1.9719493138837e-05;6.8357352574822e-05;-4.3491232645465e-05;-0.00011015214113286;-0.0015541344182566;-0.00030081314616837;0.00064613559516147;0.00071587151614949;0.0023664650507271;1.1274803910055e-05;0.00076574337435886;-0.00010946173279081;0.00036171299871057;3.111348269158e-05;9.2538211902138e-05;-5.0653503421927e-05;-3.2509895390831e-05;2.2255364456214e-05;-5.2041115850443e-05;-2.8509782623587e-06;7.1008485974744e-05;0.00014904957788531;0.00068015063880011;1.8187307432527e-05;-0.00070287060225382;-0.00052456569392234;0.00011400825314922;-0.00015986851940397;0.00014384476526175;-8.3277991507202e-05;-0.00016790113295428;-0.00015433959197253;0.00010068841220345;0.00017285997455474;3.5177730751457e-05;0.0007886789389886;0.0013527892297134;-0.00014658487634733;-0.00046952735283412;-0.0013725893804803;-0.00013324587780517;-0.00035443098749965;9.8260148661211e-05;0.00038622977444902;0.00015296952915378;6.7648026742972e-05;8.8739398051985e-05;-6.0094123909948e-05;-3.610189378378e-05;-9.2392219812609e-06;3.5636188840726e-05;7.669125625398e-05;-7.2524708230048e-05;-0.00092781079001725;-0.00039182414184324;-0.00090457312762737;0.00050468102563173;0.00036773172905669;3.2632517104503e-05;-0.00013499305350706;-5.3798306907993e-05;-0.00010349757940276;0.00017903411935549;7.2266353527084e-05;-0.00010581893729977;-6.4907697378658e-05;-0.00098018196877092;-0.0014124555746093;0.00012381406850182;0.00037785957101732;0.0022867145016789;0.00066000095102936;0.00023325550137088;0.00010508289415156;0.00040861713932827;-0.00019789779616985;0.00012991472613066;-4.8956706450554e-05;-0.00016336269618478;-2.2090338461567e-05;0.00012104991765227;-2.0306080841692e-05;-0.00026331972912885;-0.00026790198171511;-0.002468767343089;2.4786082576611e-05;-0.001299936324358;-0.00010184352140641;7.4188144935761e-05;4.8333178710891e-05;-0.00045172637328506;0.00014914818166289;-0.00039453280624002;-9.3759217634215e-06;0.00012530165258795;-1.2140144463046e-05;-0.00015756269567646;-0.002192250918597;-0.00022220144455787;0.00097567623015493;0.00096453173318878;0.0034352687653154;2.8196855055285e-06;0.0012098761508241;-0.00013658314128406;0.00070188927929848;8.8392531324644e-05;0.00018162096966989;-5.0643619033508e-05;-6.858522829134e-05;1.4794718481426e-05;-8.4743711340707e-05;1.8839049516828e-05;8.0725432781037e-05;0.00017578565166332;0.001214632182382;-0.00038580698310398;-0.00035615044180304;-0.00074800616130233;3.7544883525698e-05;-0.00010852357081603;0.00027571662212722;-0.00018424708105158;-0.0001164919231087;-0.00020255721756257;6.0758560721297e-05;0.00018709940195549;5.9555412008194e-05;0.00093118124641478;0.0013386657228693;-0.0001954065519385;-0.00057519326219335;-0.0022402396425605;0.00055756676010787;-0.00062950333813205;0.00030647445237264;0.00027543073520064;0.00023386665270664;1.7091871995945e-05;0.00012670316209551;-2.0662735551014e-05;-5.0105147238355e-05;3.6920125694451e-06;3.4443899494363e-05;9.0727779024746e-05;-9.6389821919729e-06;-0.0010184248676524;-0.00056745857000351;-0.0005841018864885;0.00057183601893485;0.00036761056981049;9.3174072389957e-05;-0.00017764851509128;-0.00010749845387181;-2.1409605324152e-05;0.00020270798995625;3.4107917599613e-05;-0.00012740762031171;-7.0479582063854e-05;-0.00082414364442229;-0.001967265503481;8.2673439464998e-05;0.00024592893896624;0.0023369553964585;0.0010223785648122;0.00029621354769915;0.00017919029050972;0.00026068920851685;-0.00022214639466256;0.00011135735257994;-3.4598011552589e-05;-0.00016322929877788;-3.8235983083723e-05;0.000126276674564;-2.1589596144622e-05;-0.00028854390257038;-0.00026026868727058;-0.0028039671014994;-0.00013573102478404;-0.001684028073214;-0.00035753950942308;0.0001360389724141;1.6419460735051e-05;-0.00051849760347977;0.00011017227370758;-0.00053543603280559;-8.2788057625294e-05;0.00016236993542407;5.8060410083272e-05;-0.00015514310507569;-0.0023498402442783;-1.5104958038137e-05;0.0010751633672044;0.00097144424216822;0.0037280414253473;0.00019913549476769;0.0013883716892451;-4.5881744881626e-05;0.00096175016369671;0.00019863861962222;0.00024699728237465;-1.1529587027326e-05;-9.9149750894867e-05;-1.384111965308e-05;-9.6644929726608e-05;4.4246629840927e-05;4.6711327740923e-05;0.00015165349759627;0.001465926063247;-0.00082800112431869;-1.0797916729643e-05;-0.00080889096716419;-2.22808412218e-05;-3.6582696338883e-05;0.00036047521280125;-0.00026454369071871;-3.6594148696167e-05;-0.00018707261187956;1.8589971659821e-05;0.000157505783136;4.1631574276835e-05;0.00065832969266921;0.00098889600485563;-5.8461300795898e-05;-0.00049961439799517;-0.0026304391212761;0.0014166691107675;-0.00079004501458257;0.00049429602222517;0.00014392849698197;0.00022945496311877;-3.6402336263563e-05;0.00013150773884263;6.0631800806732e-06;-4.951419759891e-05;1.9002674889634e-05;3.0715113098267e-05;9.5786730526015e-05;4.8807472921908e-05;-0.0010354563128203;-0.00071489083347842;-0.00023518720990978;0.00052387750474736;0.00032940664095804;0.00015984717174433;-0.00020926979777869;-0.00015083004836924;5.223361949902e-05;0.0001943130773725;7.9254687079811e-06;-0.00011459305824246;-8.926371083362e-05;-0.00066823256202042;-0.0024160915054381;6.0921895055799e-05;0.00013094897440169;0.0022545906249434;0.0013981957454234;0.00034019965096377;0.00023516523651779;9.2963098722976e-05;-0.0002084675070364;8.7576685473323e-05;-7.2102716330846e-06;-0.0001504922111053;-6.2492370489053e-05;0.00010372874385212;-1.0561339877313e-05;-0.00027171144029126;-0.00022266285668593;-0.0025589622091502;-0.00050854176515713;-0.0017267651855946;-0.00078161334386095;0.00011226677452214;8.1881771620829e-06;-0.00046594871673733;9.2130530902068e-06;-0.0005648504011333;-0.00020497497462202;0.00018602957425173;0.0001455324672861;-0.00011379543138901;-0.0021958432625979;0.00028468904201873;0.00099039787892252;0.00084574235370383;0.0032630383502692;0.00069423281820491;0.0012750988826156;0.0001667499600444;0.00099718384444714;0.00038297014543787;0.00025154920876957;5.8820412959903e-05;-9.862727165455e-05;-5.0573351472849e-05;-8.4493942267727e-05;6.1024107708363e-05;-1.0242986718367e-05;9.4240931503009e-05;0.0013848062371835;-0.0011178700951859;0.00032848044065759;-0.00068269891198725;-6.6346387029625e-05;3.5240282159066e-05;0.00036731763975695;-0.00029278188594617;5.6446904636687e-05;-0.00012276541383471;-2.6848314519157e-05;9.7961674327962e-05;6.4832793214009e-06;0.00017738503811415;0.00039298940100707;0.00014421022206079;-0.00031024485360831;-0.0024562228936702;0.0020657407585531;-0.0007787502836436;0.00058586156228557;-1.3375978596741e-05;0.00015263217210304;-8.2698068581522e-05;0.00010583634139039;2.578522071417e-05;-3.7102279748069e-05;2.8558941266965e-05;2.1298788851709e-05;9.3205475423019e-05;9.6363335615024e-05;-0.0008490898180753;-0.00071472179843113;0.00011279180034762;0.00035331305116415;0.00024603921337985;0.00019051389244851;-0.00019751682702918;-0.00016214256174862;0.00011344025551807;0.0001450326963095;-1.6472951756441e-05;-6.4838495745789e-05;-9.6137759101111e-05;-0.00040199188515544;-0.0024158575106412;2.0229923393345e-05;1.7458286265537e-06;0.001784065621905;0.0015215434832498;0.0003028022183571;0.0002364764950471;-7.5521726103034e-05;-0.00015294687182177;5.1231367251603e-05;2.5572155209375e-05;-0.00011532140342752;-8.166487532435e-05;6.510076491395e-05;8.9720906544244e-06;-0.0002219626767328;-0.00016281509306282;-0.0019061738857999;-0.00091857218649238;-0.0014428769936785;-0.0010982666863129;7.5478288636077e-05;8.7697526396369e-06;-0.00033071887446567;-0.00011068319145124;-0.00047757549327798;-0.00029060844099149;0.0001670523051871;0.00020492963085417;-6.6942746343557e-05;-0.001816060161218;0.00042906796443276;0.00079580774763599;0.000640727521386;0.0023127805907279;0.0012775326613337;0.00094203627668321;0.00039704932714812;0.00084263703320175;0.00051317841280252;0.00020423661044333;0.00012093493569409;-8.0266770964954e-05;-8.2768616266549e-05;-6.2656108639203e-05;6.3695697463118e-05;-5.2944324124837e-05;4.0763035940472e-05;0.001074805855751;-0.0011091534979641;0.00043365836609155;-0.00041574295028113;-5.1621031161631e-05;4.3907239160035e-05;0.00031055338331498;-0.00026302292826585;0.00010074565943796;-4.7078767238418e-05;-5.144912211108e-05;4.0060742321657e-05;-2.0982948626624e-05;-0.00019434851128608;-7.5112577178515e-05;0.00027446655440144;-0.00012949576193932;-0.0018558009760454;0.0020994979422539;-0.00063861365197226;0.00054795463802293;-8.8817068899516e-05;4.4697193516186e-05;-9.4296679890249e-05;6.4303036197089e-05;2.9062020985293e-05;-1.7034672055161e-05;3.4001284802798e-05;1.4777086107642e-05;5.5039057770045e-05;9.2047819634899e-05;-0.00072409183485433;-0.00071794097311795;0.00026595973758958;0.00012766581494361;0.00017859668878373;0.00020666902128141;-0.00017357568140142;-0.00015417709073517;0.00013095613394398;8.808470738586e-05;-3.5013021260966e-05;-2.5073066353798e-05;-9.2864451289643e-05;-0.00042153548565693;-0.0021618169266731;8.1346268416382e-05;3.5809150631394e-06;0.0014280815375969;0.0015943568432704;0.00027571618556976;0.00023477346985601;-0.00013794231927022;-6.2793464167044e-05;2.4470129574183e-05;4.6343691792572e-05;-8.3990365965292e-05;-9.1651796537917e-05;3.3418531529605e-05;2.510508238629e-05;-0.00019097568292636;-0.00012941799650434;-0.0012245087418705;-0.001118317595683;-0.0010612682672217;-0.0011994757223874;3.8151327316882e-05;1.4299598660727e-05;-0.00018450831703376;-0.00017419341020286;-0.00035449262941256;-0.00031658392981626;0.00013027325621806;0.00021842611022294;-4.9558871978661e-05;-0.0015301380772144;0.00046374276280403;0.00066874083131552;0.00052163569489494;0.0014067061711103;0.0016001970507205;0.000588251685258;0.00051157327834517;0.00062547059496865;0.00054736091988161;0.00013839974417351;0.00014514441136271;-5.2138137107249e-05;-9.1319547209423e-05;-3.1232397304848e-05;5.109295307193e-05;-7.3142356995959e-05;-4.3242198444204e-06;0.00052264623809606;-0.00078240211587399;0.00031856694840826;1.2647185940295e-05;1.4663091860712e-05;-8.1050393418991e-06;0.00018202584760729;-0.0001741277956171;9.2340887931641e-05;3.8068075809861e-05;-5.6293913075933e-05;-2.3850532670622e-05;-3.4803546441253e-05;-0.00038613722426817;-0.00041288576903753;0.00029504558187909;2.3892254830571e-05;-0.00082038843538612;0.0014397634658962;-0.00035294535337016;0.00037718593375757;-8.6911022663116e-05;-9.0226953034289e-05;-6.9399859057739e-05;6.5522904151294e-06;1.9129172869725e-05;1.3556511476054e-05;3.4994813177036e-05;1.1476965482871e-05;-2.8634605769184e-05;3.7755085941171e-05;-0.00061848311452195;-0.00074550480348989;0.00025684825959615;-0.00017219339497387;0.00011399746290408;0.00020873626635876;-0.00012747016444337;-0.00013277753896546;0.00011177853593836;1.483956566517e-05;-4.8810317821335e-05;3.6380406527314e-06;-7.5734744314104e-05;-0.00072274886770174;-0.0016106811817735;0.00025508232647553;0.00012807465100195;0.0011045869905502;0.0016342903254554;0.0002433587651467;0.0002450370520819;-0.00011316121526761;7.4813309765887e-05;7.1796216616349e-07;5.7706038205652e-05;-5.1402912504273e-05;-9.0129498858005e-05;7.1058830144466e-06;3.5000193747692e-05;-0.00016830090316944;-0.00011446428834461;-0.00048392382450402;-0.0010173018090427;-0.00058679573703557;-0.0010189282475039;6.5088293013105e-06;9.3832886705059e-06;-2.4451615900034e-05;-0.00016854009300005;-0.00019632623298094;-0.00027047417825088;7.6212309068069e-05;0.00018164179346059;-5.6303306337213e-05;-0.001246923697181;0.00041706449701451;0.00057269167155027;0.00045303031220101;0.0005095656379126;0.0015134252607822;0.00020044740813319;0.00047548103611916;0.00034682295517996;0.00045406146091409;5.5844542657724e-05;0.00012424591113813;-1.5615114534739e-05;-7.0183908974286e-05;-1.4541419659508e-05;3.477150312392e-05;-6.1507314967457e-05;-1.5586130757583e-05;0.00024583877529949;-0.00050743605243042;0.00022110214922577;0.00010899466724368;3.2430903956993e-05;-2.205373311881e-05;0.00010247694444843;-0.00010737215779955;7.0815563958604e-05;4.8147605411941e-05;-4.9506255891174e-05;-3.0382305340027e-05;-3.0293527743197e-05;-0.00034795049577951;-0.00040410124347545;0.00023042112297844;6.1068843933754e-05;-0.00034865390625782;0.00092632416635752;-0.00018874550005421;0.00023942405823618;-6.8480650952552e-05;-9.9015538580716e-05;-4.7646401071688e-05;-8.8604565462447e-06;1.3698628208658e-05;1.6618159861537e-05;2.5224209821317e-05;6.5567846831982e-06;-3.7518522731261e-05;1.9634962882265e-05;-0.00040386710315943;-0.00054438720690086;0.00019611780589912;-0.00021188470418565;6.3304149080068e-05;0.00016088651318569;-7.845665095374e-05;-9.0499583166093e-05;8.2282211224083e-05;-6.812030733272e-06;-3.9507791370852e-05;7.6111191447126e-06;-5.027457154938e-05;-0.00057326053502038;-0.0010289147030562;0.00021742614626419;0.00011152910883538;0.00069258938310668;0.0011959538096562;0.0001582796103321;0.00017503467097413;-8.3530241681729e-05;9.5107818196993e-05;-7.0464907366841e-06;4.5904460421298e-05;-2.9974435165059e-05;-6.7508233769331e-05;-6.5007543526008e-07;2.99579314742e-05;-0.00012277350469958;-8.2202110206708e-05;-0.00018696386541706;-0.00077551929280162;-0.00030280809733085;-0.00072699162410572;4.933465902468e-07;1.8523856851971e-05;2.1209572878433e-05;-0.00013143446994945;-9.9161166872364e-05;-0.00019018174498342;3.893610482919e-05;0.00012205819075461;-4.7567446017638e-05;-0.00089452444808558;0.00024607661180198;0.00041822844650596;0.0003328422899358;0.00017765657685231;0.001178911770694;5.366907134885e-05;0.00036096482654102;0.00018241230282001;0.00032453014864586;1.8742992324405e-05;8.9485518401489e-05;-3.836510131805e-06;-5.0085265684174e-05;-5.1670245738933e-05;6.2936364884081e-06;5.3816263971385e-05;0.000133651366923;0.00076122983591631;-0.00019587759743445;-0.000298675353406;-0.00052847858751193;3.8294427213259e-05;-8.7715852714609e-05;0.00016416385187767;-0.00011607774649747;-9.5799754490145e-05;-0.00014659977750853;4.7102719690884e-05;0.00014178993296809;4.025191810797e-05;0.00069560972042382;0.0009895385010168;-0.00013534446770791;-0.00042705901432782;-0.001497886958532;0.00026990278274752;-0.0003806036838796;0.00018166165682487;0.00021707941778004;0.00016573764150962;2.2542102669831e-05;9.0451190772001e-05;-1.9737701222766e-05;-3.7590350984829e-05;-7.3481596700731e-06;2.3621380023542e-05;8.7756081484258e-05;-3.7833813166799e-06;-0.00058864592574537;-0.00030839219107293;-0.00048480360419489;0.00041718664579093;0.00026590365450829;3.9919461414684e-05;-9.7418575023767e-05;-6.2512750446331e-05;-1.8736047422863e-05;0.00014242058387026;3.7389756471384e-05;-8.4264276665635e-05;-3.7366124161053e-05;-0.00046295596985146;-0.0012162673519924;-1.372875249217e-05;0.00014005917182658;0.001524688443169;0.00053664372535422;0.00013354660768528;9.3801951152273e-05;0.00019900687038898;-0.00016590248560533;8.0568723205943e-05;-2.7884654627996e-05;-0.00012014468666166;-2.2358099158737e-05;9.6225390734617e-05;-1.5725856428617e-05;-0.00020600286370609;-0.00019733990484383;-0.0021137823350728;-6.4368512539659e-05;-0.0011941090924665;-0.00013995959307067;0.0001165153371403;2.0326759113232e-05;-0.00039149995427579;9.2899492301513e-05;-0.00036414686474018;-2.3226719349623e-05;0.00010550793376751;1.2967803741049e-05;-0.00012031415099045;-0.0017587804468349;-0.00018113419355359;0.00078872521407902;0.0007368425722234;0.0028800664003938;0.0001079478970496;0.0010333827231079;-6.1331164033618e-05;0.00067420449340716;9.5504692581017e-05;0.00017514683713671;-2.5426736101508e-05;-7.6192191045266e-05;-2.923033434854e-06;-8.6980646301527e-05;2.5748153348104e-05;6.7808097810484e-05;0.00018320072558708;0.0013665984151885;-0.00061031157383695;-4.0931165131042e-05;-0.0008604793692939;-1.9064396838075e-05;-5.6663280702196e-05;0.00030665521626361;-0.00022980950598139;-5.9412766859168e-05;-0.00022241463011596;2.0030718587805e-05;0.00018921046284959;6.4330473833252e-05;0.00092829862842336;0.0011655191192403;-0.00018136700964533;-0.00059804017655551;-0.0025670407339931;0.00099449709523469;-0.00068749149795622;0.00040625804103911;0.00015164061915129;0.00027664247318171;-1.9989976863144e-05;0.0001450746494811;9.0299918156234e-06;-6.0546146414708e-05;-3.4215045161545e-06;2.5854920750135e-05;0.00014191336231306;6.232251325855e-05;-0.00069223676109686;-0.00045290449634194;-0.0003242224920541;0.0005780624342151;0.0003192582516931;9.0349887614138e-05;-0.00013900455087423;-0.00011382281081751;5.0774524424924e-05;0.00019423679623287;1.9280167180113e-05;-0.00011654942500172;-4.3799365812447e-05;-0.0002811151498463;-0.0018731985474005;-0.00012384630099405;6.439758635679e-06;0.0017778844339773;0.0008332843426615;0.00016583847173024;0.00014953238132875;0.00010736274998635;-0.00023157797113527;8.1038764619734e-05;-2.1880483473069e-05;-0.00014597745030187;-3.9876511436887e-05;0.00012076312123099;-1.8684804672375e-05;-0.00026297057047486;-0.00023020763183013;-0.0028690008912235;-0.0002689566463232;-0.0017415871843696;-0.00038382376078516;0.00019361510931049;1.2611116289918e-05;-0.00053589447634295;6.8480476329569e-05;-0.00054526684107259;-8.7955944763962e-05;0.00015173194697127;6.583164940821e-05;-0.00013780863082502;-0.0022628384176642;-0.00013303407467902;0.0010180877288803;0.00089187128469348;0.0037922572810203;0.00037478483864106;0.0014098263345659;2.5804849428823e-05;0.0010174748022109;0.00021512329112738;0.00026338759926148;4.0303157220478e-06;-0.00011814016761491;-2.9511635148083e-05;-0.00011045448627556;5.4999531130306e-05;4.5792894525221e-05;0.00017595644749235;0.0018373555503786;-0.0011786287650466;0.00036211113911122;-0.0011165089672431;-8.7601998529863e-05;1.8751255993266e-05;0.00043715603533201;-0.00034399985452183;3.1395393307321e-05;-0.00025095074670389;-3.1337061955128e-05;0.00020119413966313;5.4253061534837e-05;0.000748754828237;0.00096248602494597;-6.8866946094204e-05;-0.00058329629246145;-0.0033770760055631;0.0021085774060339;-0.00095509382663295;0.00066117476671934;1.1081483535236e-05;0.00033530904329382;-8.5438499809243e-05;0.00017763732466847;4.2181873141089e-05;-7.6914788223803e-05;5.9932285694231e-06;2.1429974367493e-05;0.00019783223979175;0.00015119269664865;-0.00067484477767721;-0.00052459596190602;1.7536070799906e-06;0.00065396027639508;0.00031055294675753;0.00015216620522551;-0.00017244505579583;-0.00015476527914871;0.00013522019435186;0.00021962767641526;-4.1198140934284e-06;-0.00012080869782949;-6.2167637224775e-05;0.00010525806283113;-0.0024312091991305;-0.00026596055249684;-0.00019353178504389;0.0017197895795107;0.0010612931801006;0.00017606558685657;0.00017117762763519;-5.9140449593542e-05;-0.00027120052254759;6.5069885749836e-05;-2.4610042146378e-06;-0.00014757690951228;-6.3555387896486e-05;0.00011263433407294;-1.0862209819607e-05;-0.00025768499472179;-0.00020106819283683;-0.0030097989365458;-0.00072062027174979;-0.0019572703167796;-0.00084015796892345;0.00020098112872802;2.7712203518604e-05;-0.00056414445862174;-3.865425605909e-05;-0.00062847597291693;-0.00021428479522001;0.00018223708320875;0.00014769213157706;-9.9661650892813e-05;-0.0022812867537141;3.1249361200025e-05;0.00099287589546293;0.00081567058805376;0.0038258961867541;0.0009713668259792;0.0014894210034981;0.00026217117556371;0.0011648624204099;0.00043010679655708;0.0003003177116625;7.8134929935914e-05;-0.00013482831127476;-7.4530580604915e-05;-0.00010077600018121;7.3870876803994e-05;-6.6164016061521e-06;0.00010228852625005;0.0017711822874844;-0.0014856414636597;0.00064816873054951;-0.0010449008550495;-0.00011936241207877;8.8479137048125e-05;0.00045258726458997;-0.00036752535379492;0.00011830699804705;-0.00018794121569954;-7.5141848355997e-05;0.00015629029076081;1.0436839147587e-05;0.00018228341650683;0.00041032503941096;0.00015973432164174;-0.00034918490564451;-0.003225669497624;0.0028472577687353;-0.00096600683173165;0.00074979191413149;-0.00011411413288442;0.00026166636962444;-0.00012899983266834;0.00015249286661856;5.6180055253208e-05;-6.9461864768527e-05;1.8453934899298e-05;1.2732374671032e-05;0.00020282412879169;0.00019290158525109;-0.00056299305288121;-0.00048174383118749;0.00029694152181037;0.00053953769383952;0.00023621002037544;0.00018230611749459;-0.00017671275418252;-0.00015381991397589;0.00017655684496276;0.00018733758770395;-2.1658908735844e-05;-7.874438597355e-05;-9.0061774244532e-05;0.00037413678364828;-0.0024773967452347;-0.00029780378099531;-0.00029136452940293;0.0013635336654261;0.0011044219136238;0.00016967550618574;0.00014338898472488;-0.00019230606267229;-0.00023975846124813;4.0061415347736e-05;2.2130223442218e-05;-0.00011790147254942;-8.0884528870229e-05;7.2175498644356e-05;7.4046874942724e-06;-0.00019315043755341;-0.0001269138592761;-0.0023144478909671;-0.001174598117359;-0.0016309423372149;-0.0012317553628236;0.00013215535727795;4.986963540432e-05;-0.00042835931526497;-0.00017032577306964;-0.00053500104695559;-0.00031981678330339;0.00016920515918173;0.00021170439140406;-3.6964480386814e-05;-0.0017794034210965;0.0002113802038366;0.00072988035390154;0.00055423245066777;0.0027809056919068;0.0015987096121535;0.0011487473966554;0.0005151613149792;0.00098244182299823;0.00060037063667551;0.0002490340557415;0.0001514221803518;-0.00011120563431177;-0.00011191593512194;-7.6276970503386e-05;7.1078291512094e-05;-4.2873802158283e-05;4.5231397962198e-05;0.0014093493809924;-0.0013831300893798;0.00067761115496978;-0.00079644110519439;-0.00010424188803881;0.00010000544716604;0.00038142700213939;-0.00031450364622287;0.00014712681877427;-0.00011435436317697;-8.6191008449532e-05;0.00010434961586725;-1.7548034520587e-05;-0.00019011863332707;1.7024014596245e-05;0.00027765691629611;-0.00015647381951567;-0.0025310006458312;0.0027405472937971;-0.00079956307308748;0.00066201866138726;-0.00016200206300709;0.00016217386291828;-0.00013030895206612;0.00010917487088591;5.2306048019091e-05;-5.2052779210499e-05;2.2194355551619e-05;5.7274505707028e-06;0.00016817217692733;0.00017623606254347;-0.00043672384344973;-0.00039563805330545;0.00038559880340472;0.00035974709317088;0.00016348768258467;0.00017420604126528;-0.00015275810437743;-0.00012664914538618;0.00016763783060014;0.00013673199282493;-2.9678605642403e-05;-4.0899169107433e-05;-8.6489941168111e-05;0.00038912289892323;-0.0020938857924193;-0.00025033997371793;-0.00027454624068923;0.0009955654386431;0.0009911279194057;0.00014773210568819;0.00010722960723797;-0.00021996890427545;-0.00017195033433381;2.1346466382965e-05;3.2605312298983e-05;-8.4638617408928e-05;-8.0302517744713e-05;3.9736598409945e-05;1.9786597476923e-05;-0.0001447571121389;-8.1635356764309e-05;-0.0015597220044583;-0.001283610239625;-0.0011714394204319;-0.0012661369983107;7.6163640187588e-05;6.1678503698204e-05;-0.00027689672424458;-0.00021786798606627;-0.00038946917629801;-0.00032609191839583;0.00012925504415762;0.00021112654940225;-1.2006694305455e-05;-0.0013534356839955;0.00023569150653202;0.00053611857583746;0.00038559082895517;0.0017791837453842;0.0017884420230985;0.00076815887587145;0.0005851787282154;0.00071554549504071;0.00060382776428014;0.00017479044618085;0.00016658582899254;-7.8284181654453e-05;-0.00011550722410902;2.4638646209496e-05;-2.5400843242096e-06;-0.00014310027472675;-6.5477101998113e-06;-0.0001093583778129;-0.0001497039484093;0.00022495159646496;0.00020150523050688;6.8572982854676e-05;-3.546469451976e-05;3.6237899621483e-05;1.4300426300906e-05;9.1311711003073e-05;7.176573126344e-05;-7.8322380431928e-05;-5.4076630476629e-05;-2.8781700166292e-05;-0.00063084717839956;-0.00059481267817318;0.00040300207911059;7.8913442848716e-05;0.0002208160731243;0.00066620338475332;-1.391249588778e-05;-4.0844988689059e-06;-8.6937274318188e-05;-0.0001170730101876;-5.4284897487378e-05;-4.2782463424373e-05;1.7013853721437e-05;3.3397191145923e-05;1.2788656931662e-05;-3.5782704799203e-05;2.0783721993212e-05;0.00010937759361695;6.1259328504093e-05;0.00018039964197669;0.00020798739569727;-0.00048616054118611;-6.1913466197439e-05;0.00018420252308715;-1.7104270227719e-05;3.8715639675502e-05;6.6312597482465e-05;-1.9533006252459e-06;-1.6202433243961e-06;8.8141670858022e-05;3.6815508792643e-05;0.00012881701695733;-0.00014783836377319;-7.2036105848383e-05;-0.00025708583416417;-0.00014697220467497;0.00037170242285356;-1.1580171303649e-05;-0.00017395918257535;-0.00011419023212511;9.6022500656545e-05;-1.2837364920415e-05;4.5407232391881e-05;-1.1457645086921e-05;-9.6241812570952e-05;3.0981816507847e-06;5.5108564993134e-05;-0.00023146100284066;-7.8649827628396e-05;6.8022884079255e-05;-0.0014806594699621;0.00028108741389588;-0.00094543740851805;7.4849226621154e-06;0.00018499090219848;0.00012418584083207;-0.00023983359278645;0.00011566672765184;-0.00014785620442126;-6.4908395870589e-05;7.8090102761053e-05;-0.00010488054249436;-0.0015946128405631;-0.00059516477631405;0.00077514041913673;0.00049612042494118;-4.4943091779714e-05;0.0026824176311493;-0.00015107056242414;0.00058726908173412;-0.00011110900959466;0.00038235678221099;-8.1059784861282e-05;0.00010709279740695;1.7348596884403e-05;-9.3834729341324e-05;3.5950000892626e-05;-2.998885793204e-05;-0.00012683081149589;2.5075769372052e-05;-0.00027421530103311;0.00022324091696646;0.00013084360398352;0.00048933812649921;9.9681397841778e-05;-0.00010266428580508;-1.4161722901918e-05;9.7672098490875e-05;5.5040905863279e-05;8.2213729911018e-05;-7.6971875387244e-05;-0.00011612358503044;1.6609308659099e-05;-0.00035513431066647;-0.0005803105304949;0.00029535917565227;-8.0973855801858e-05;0.00042465951992199;7.4599178333301e-05;9.2540634796023e-05;-0.00017220787412953;-2.8788939744118e-05;-0.00017146965546999;-3.3488722692709e-05;-7.8363060310949e-05;1.1397827620385e-05;8.7471249571536e-05;1.9673791030073e-05;-4.8428901209263e-05;-2.8585613108589e-05;0.00013198563829064;0.00011252964759478;0.00026268261717632;0.00019876520673279;-0.00085297774057835;-9.5961571787484e-05;0.00025067810202017;9.7185566119151e-06;5.7978675613413e-05;6.9173518568277e-05;-3.4037580917357e-05;1.1564357009775e-05;0.00016159268852789;3.3461728889961e-05;-6.8541368818842e-05;6.6659017647908e-06;6.5269501646981e-05;-0.00028575654141605;-0.00025204382836819;0.0006079314625822;-5.0714934332063e-05;-0.00024369478342123;-0.00011435044871178;0.00017788153490983;-2.1237958208076e-05;7.2962189733516e-05;-1.2945958587807e-05;-0.00014123792061582;1.5053848073876e-05;4.6830340579618e-05;-0.00029771542176604;-6.3665444031358e-05;6.9177967816358e-06;-0.0013510490534827;0.0003108961682301;-0.00079075014218688;5.6864828366088e-05;0.00012022151349811;0.00013767107157037;-0.00019350866205059;0.00012687225535046;-5.7425811974099e-05;-0.00010293575178366;7.7546348620672e-05;-0.00010474142618477;-0.001799329300411;-0.00074581149965525;0.00093548436416313;0.00046521570766345;5.004691411159e-05;0.0027891464997083;-0.00014379317872226;0.00048132686060853;-0.00010611485049594;0.00021503496100195;-9.6378680609632e-05;6.2857347074896e-05;3.1841096642893e-05;-7.6608594099525e-05;7.6168711530045e-05;-3.7615511246258e-05;-9.5293253252748e-05;9.5666764536873e-05;-0.00064130494138226;0.00022841306054033;-0.00034418379073031;-2.4258564735646e-05;5.4680473112967e-05;-4.2495932575548e-05;-0.00020637418492697;2.701219455048e-05;2.4639045932418e-06;-1.1610804904194e-05;0.00016033681458794;2.7690293791238e-05;-9.2927322839387e-05;-1.6317088011419e-05;0.00023698335280642;0.00032872764859349;-0.00012137232261011;0.00045365121331997;-0.0003202821535524;0.00040589523268864;-0.00010549083526712;-2.1237062810542e-06;-7.5730758908321e-06;6.8796587584075e-05;1.0577047760307e-05;-0.00011007765715476;2.237873559352e-06;-6.039692016202e-05;1.6224008504651e-05;0.00017533735081088;-2.5514727894915e-05;0.00089411064982414;0.00010290054342477;-0.00057551095960662;6.95478884154e-05;0.00013144266267773;-7.6540396548808e-05;0.00014407894923352;8.4114617493469e-06;9.8887656349689e-05;7.1577751441509e-06;0.0001926066033775;1.5971290849848e-05;6.6518165112939e-05;0.00021241928334348;0.00028564181411639;-0.00048515418893658;1.3357235957301e-06;-0.00010342960740672;-0.00030356447678059;-0.00052749225869775;-2.7243288059253e-05;-0.00010355244012317;-3.091760299867e-05;2.4492979719071e-05;-2.8840497634519e-06;-0.00012306435382925;-1.8195652273789e-06;5.0163657761004e-06;2.20963065658e-05;2.8239859602763e-05;-0.00024072224914562;-0.00056602369295433;-7.0716625486966e-05;-0.0003373486106284;0.00027964898617938;4.2042007407872e-05;7.3404735303484e-05;-4.0830254874891e-05;8.6508196545765e-05;0.00011828300921479;8.3634207840078e-05;6.1049235227983e-05;-0.00011357516632415;-2.8824044420617e-05;-0.0012225550599396;-0.00068220123648643;0.00012511701788753;0.00068282900610939;0.0018446471076459;0.00010460120392963;7.3782241088338e-05;-5.3301286243368e-05;-0.0001063915915438;-6.6373169829603e-05;-1.1843862012029e-05;-7.3654853622429e-05;-5.6719127314864e-05;4.0181388612837e-05;-8.5903906438034e-05;5.1499446271919e-05;2.7917478291783e-05;0.0001103029717342;0.001523309503682;-0.0011481083929539;0.00055866042384878;-0.0010013573337346;-0.00011334154260112;7.2777402237989e-05;0.00036254146834835;-0.00029698948492296;8.3707476733252e-05;-0.00020374153973535;-6.7573324486148e-05;0.00016431861149613;3.277082942077e-05;0.00042067014146596;0.0005403688410297;-8.3680379248108e-07;-0.00038376965676434;-0.0028584864921868;0.0021753506734967;-0.00078799662878737;0.00059629208408296;-9.3662980361842e-05;0.00029007162083872;-0.00010162968101213;0.00014905235730112;5.5898140999489e-05;-7.2111834015232e-05;-7.764958454004e-09;6.7199134718976e-06;0.00021209909755271;0.00018789083696902;-0.00020316353766248;-0.0001916199689731;0.00022861344041303;0.00054819020442665;0.00018024187011179;0.00010496928734938;-9.8589844128583e-05;-0.00010456144082127;0.00015188328688964;0.0001678255648585;-9.3823691713624e-06;-7.9875921073835e-05;-4.722053927253e-05;0.00071518268669024;-0.0017190594226122;-0.00041452830191702;-0.00037780238199048;0.00074310263153166;0.00045076146489009;1.2474082723202e-05;5.1621929742396e-05;-0.0001705503964331;-0.00023716155556031;2.7272764782538e-05;4.769401584781e-06;-9.3188704340719e-05;-4.6906436182326e-05;7.1705602749716e-05;-6.0287966334727e-06;-0.0001317206188105;-8.5995656263549e-05;-0.0021814976353198;-0.00074511457933113;-0.0014087206218392;-0.0007400966132991;0.00016199336096179;4.2446696170373e-05;-0.0004258016415406;-9.7255207947455e-05;-0.00045343779493123;-0.00019000835891347;0.0001257795811398;0.00012259274080861;-2.4453420337522e-05;-0.0013380621094257;-6.065403795219e-05;0.0005354187451303;0.00039870463660918;0.0026882600504905;0.00096686568576843;0.001086704665795;0.00031223031692207;0.00085944659076631;0.00038512851460837;0.00022821246238891;9.1238602180965e-05;-0.00010947704868158;-7.8404111263808e-05;-9.7267999080941e-05;7.7827193308622e-05;1.4520622244163e-05;4.5324395614443e-05;0.0018068335484713;-0.0016519905766472;0.00094354484463111;-0.0012498684227467;-0.00016333608073182;0.00015212374273688;0.00044194803922437;-0.00036492792423815;0.00017997076793108;-0.00021014717640355;-0.00012772307673004;0.00018559777527116;3.9355240915029e-06;1.0775575901789e-05;0.00022508374240715;0.00013890005357098;-0.00020667460921686;-0.0033648109529167;0.0032986891455948;-0.00095807382604107;0.00078156695235521;-0.00023014598991722;0.00032306788489223;-0.00015979046293069;0.00016522349324077;8.2695201854222e-05;-9.2871261585969e-05;5.2204800340405e-06;-2.5137940156128e-06;0.0002878139493987;0.00027048427728005;-1.901790528791e-05;-6.0551033129741e-06;0.00051542441360652;0.00064760621171445;0.00013977734488435;0.00012112372496631;-9.9998134828638e-05;-9.257544297725e-05;0.00021113980619702;0.00018868168990593;-2.5869092496578e-05;-7.0886533649173e-05;-8.4426734247245e-05;0.0013864457141608;-0.0018725072732195;-0.00061789905885234;-0.00059573713224381;0.00034214637707919;0.00017821363871917;-5.3151823522057e-05;-4.0100636397256e-05;-0.00030789352604188;-0.00029025645926595;9.6842040875345e-06;1.2036347470712e-05;-8.0105201050173e-05;-5.6804292398738e-05;4.8585407057544e-05;2.4784289962554e-06;-5.1865106797777e-05;3.1103368201002e-06;-0.0020092129707336;-0.0012330800527707;-0.0013270346680656;-0.0011369786225259;0.00013794862024952;9.2568239779212e-05;-0.00041419608169235;-0.00023316226725001;-0.00044604533468373;-0.0002998897980433;0.00012368161696941;0.00017412098532077;5.635772322421e-05;-0.00081661937292665;-3.2157520763576e-05;0.00023652084928472;9.6029354608618e-05;0.0022617790382355;0.0015658956253901;0.0010259638074785;0.00057630840456113;0.00084525858983397;0.00058923551114276;0.00023026604321785;0.00016963959205896;-0.00011119083501399;-0.00012431558570825;-7.8469711297657e-05;7.7872071415186e-05;-3.1046958611114e-05;-1.2394757504808e-06;0.0015646812971681;-0.0016203034901991;0.00097570364596322;-0.0011011561146006;-0.0001463155640522;0.0001632017956581;0.00040503509808332;-0.00033019291004166;0.00021469591592904;-0.00015320164675359;-0.00013867556117475;0.00015504423936363;-2.6553288989817e-05;-0.00038430801942013;-9.6661235147621e-05;0.00029099258244969;-3.3876429370139e-05;-0.0028582131490111;0.0033562767785043;-0.00086360541172326;0.0007265962776728;-0.00027623228379525;0.00024982399190776;-0.00016823515761644;0.00013444507203531;7.9023047874216e-05;-8.5105435573496e-05;8.4992761912872e-06;-9.671030966274e-06;0.00027730708825402;0.0002601986634545;3.5634016967379e-05;9.0058470959775e-05;0.00057029444724321;0.00053428625687957;9.2614798631985e-05;0.00012193599104648;-9.6757874416653e-05;-6.4415762608405e-05;0.00020211211813148;0.00016334155225195;-3.1852330721449e-05;-4.5241304178489e-05;-7.8258170105983e-05;0.0014236837159842;-0.001634756103158;-0.0006159664480947;-0.00059190182946622;0.00013668418978341;6.5306448959745e-05;-4.7938108764356e-05;-8.853392500896e-05;-0.0003213741874788;-0.0002540146233514;1.7020656741806e-06;1.6303658412653e-05;-5.9947091358481e-05;-5.9334040997783e-05;2.4669645426911e-05;1.7211605154444e-05;-3.3256514143432e-05;2.4355111236218e-05;-0.00144970160909;-0.0014693994307891;-0.00096324144396931;-0.0012823693687096;8.832599996822e-05;0.00013017923629377;-0.0002953385701403;-0.00029230481595732;-0.00033093488309532;-0.00032780595938675;9.2622300144285e-05;0.00018219210323878;6.417887925636e-05;-0.00065558752976358;-5.6106629926944e-05;0.00015751396131236;3.1825053156354e-05;0.0015189659316093;0.0019692715723068;0.00073839258402586;0.00068982248194516;0.00063728989334777;0.00064884871244431;0.00016979935753625;0.00019508179684635;-8.5698382463306e-05;-0.00013880105689168;-3.3887565223267e-05;4.9433885578765e-05;-8.6501822806895e-05;-1.6676098312018e-05;0.00083991145947948;-0.0010534944012761;0.0006501191528514;-0.00063095416408032;-7.1669041062705e-05;0.0001099812288885;0.00024944197502919;-0.00019843388872687;0.0001712692755973;-6.1522165196948e-05;-0.00010082530934596;8.3551771240309e-05;-4.6371289499803e-05;-0.00060235528508201;-0.00030349427834153;0.00037947914097458;8.3721795817837e-05;-0.001478997990489;0.0022849394008517;-0.00050554424524307;0.00044187137973495;-0.000214345564018;0.00011779119085986;-0.00012141376646468;6.9741188781336e-05;4.8891779442783e-05;-5.3657618991565e-05;5.4577431001235e-06;-1.5160206203291e-05;0.00018689423450269;0.00017281099280808;4.2898496758426e-05;0.00014324615767691;0.00038769477396272;0.00025657782680355;3.4760509151965e-05;9.5364630396944e-05;-7.0532216341235e-05;-1.9444449208095e-05;0.00012692224117927;9.9666096502915e-05;-2.1741065211245e-05;-1.2604822586582e-05;-2.1993424525135e-05;0.00095142767531797;-0.00093529891455546;-0.00044548211735673;-0.00042169864173047;1.5191584679997e-05;-6.9473876465054e-06;-1.557040559419e-05;-0.00010510982974665;-0.0002157390845241;-0.0001457887556171;1.0709170510381e-06;1.3189288438298e-05;-3.2606629247312e-05;-4.7455250751227e-05;6.5510057538631e-06;3.079531234107e-05;-6.620075146202e-05;-1.0973000826198e-05;-0.00064984092023224;-0.0013357300776988;-0.00038080490776338;-0.001065717660822;2.8356393158901e-05;0.00015285014524125;-0.00010615668725222;-0.00025488369283266;-0.00012576494191308;-0.00025163966347463;3.6100962461205e-05;0.00012685364345089;6.0469992604339e-06;-0.00077932799467817;-0.00018309055303689;0.00026537897065282;0.00016796143609099;0.00066045654239133;0.0019657264929265;0.00030155861168168;0.00060204096371308;0.00027190387481824;0.00052607583347708;6.1411330534611e-05;0.00015576025180053;-4.1862251237035e-05;-0.00011383564560674;5.2972765843151e-05;-8.5681174823549e-05;-0.00013881914492231;0.00011639831791399;-0.0003794516378548;0.00090302882017568;-1.6893742213142e-05;0.00056132621830329;8.1475969636813e-05;-0.00011736961459974;-5.13582417625e-05;0.00024311995366588;-5.1932584028691e-06;8.1502454122528e-05;-4.5977656554896e-05;-0.00015169678954408;0.00010687699978007;3.8842495996505e-05;-0.00029053082107566;0.00018748408183455;-0.00042601602035575;0.00047994533088058;-0.00070419872645289;0.00018628795805853;-0.00050931144505739;4.8970498028211e-05;-0.00017642801685724;-7.9349065345014e-06;-0.00010830014070962;2.9841744435544e-06;0.00012394529767334;1.8249289496453e-05;-6.9886686105747e-05;-8.0620529843145e-06;0.00018200260819867;0.0001874210574897;0.00093398184981197;7.677152461838e-05;-0.00085059698903933;-0.0001213967698277;0.00021246736287139;1.3142859643267e-05;0.00014519211254083;1.9113389498671e-05;5.5765900469851e-05;4.1215043893317e-05;0.00026966235600412;7.6227937825024e-05;0.0002652496623341;0.00040832292870618;-4.3647989514284e-05;-0.00052865967154503;-0.00041906294063665;-4.2968651541742e-05;-6.5511005232111e-05;-0.00052684097317979;-5.7573153753765e-05;-3.2273084798362e-05;-2.2874482965562e-06;5.5058102589101e-05;-1.206181696034e-05;-0.00017901472165249;3.9091035432648e-05;1.1775874554587e-05;-0.00038417420000769;1.7900254533743e-05;-6.8989211285952e-05;-0.00095627619884908;0.00039483161526732;-0.00072873546741903;7.7391814556904e-05;0.00011511285993038;0.00014140515122563;-8.9871464297175e-05;0.00015084115148056;8.9702618424781e-05;-0.00013674331421498;0.00012548638915177;-7.5739582825918e-05;-0.0019532693549991;-0.0009244098328054;0.0011060128454119;0.00027113893884234;0.00013457587920129;0.0028719883412123;-0.00011714184074663;0.00019336554396432;-0.00013071861758363;-1.6530630091438e-05;-0.0001142028850154;1.7789920093492e-05;4.342607644503e-05;-0.00010503370140214;-9.397957182955e-05;8.1001591752283e-05;0.00010457656026119;-7.8090160968713e-05;0.0017039087833837;-0.0016882345080376;0.0011586830951273;-0.0013554749311879;-0.00019809455261566;0.00020926633442286;0.00036663768696599;-0.00030774041078985;0.00022107295808382;-0.00021788003505208;-0.00016535380564164;0.00019452723790891;5.3154403758526e-06;-0.00013356584531721;2.6854095267481e-05;-6.07975271123e-05;8.4056147898082e-05;-0.0031709801405668;0.0034037523437291;-0.00084760709432885;0.00073485937900841;-0.00033644682844169;0.00037548490217887;-0.00016541990044061;0.00015570987307001;0.00010040659981314;-0.00010644769645296;-3.5143787044944e-06;-1.4080512301007e-05;0.00031082239001989;0.00029588185134344;0.00053684815065935;0.00050799391465262;0.00069510983303189;0.00072909775190055;1.2954090379935e-05;2.5895153157762e-05;5.1080414777971e-06;-5.3209250836517e-06;0.00020975647203159;0.0001652781793382;-3.9247304812307e-05;-6.6478416556492e-05;-0.00010520949581405;0.0022931422572583;-0.00093384308274835;-0.00079073221422732;-0.00077496154699475;-0.00085192936239764;-0.00093987194122747;-0.00028225476853549;-0.00023681462334935;-0.00036726426333189;-0.0003063993062824;-3.0734845495317e-05;-9.2755271907663e-06;-1.8221768186777e-05;-1.1733711289708e-05;6.4212472352665e-06;-1.4642109817942e-05;0.00018722772074398;0.00021180414478295;-0.0012844332959503;-0.00094821804668754;-0.00076658494072035;-0.00078327604569495;0.00010437588935019;0.00010441368795;-0.00035156554076821;-0.00026490152231418;-0.00030552572570741;-0.00024329361622222;5.3992607718101e-05;9.9624710856006e-05;0.00021335695055313;0.0010547690326348;-0.00014103362627793;-0.00065343809546903;-0.00071129197021946;0.001068991725333;0.0008763181976974;0.00074331124778837;0.00052481947932392;0.00057909201132134;0.00047816909500398;0.0001864811492851;0.00016801274614409;-8.5414278146345e-05;-0.00010756290430436;-8.433336915914e-05;7.9632707638666e-05;7.2794318839442e-05;-8.9784000010695e-05;0.0015900556463748;-0.0016445494256914;0.0011319362092763;-0.0012769468594342;-0.00018291825836059;0.00020592394866981;0.00035590285551734;-0.00029075998463668;0.00023265359050129;-0.00018728020950221;-0.00016357419372071;0.00018381047993898;-1.265076934942e-05;-0.00033204079954885;-9.3405156803783e-05;4.0988605178427e-05;0.00014735951845068;-0.002922540763393;0.0034021309111267;-0.00081373826833442;0.00069873733446002;-0.00034203327959403;0.00032989701139741;-0.00016739568673074;0.00014081169501878;9.4139439170249e-05;-0.00010282318544341;-1.1764049077101e-06;-1.5459527276107e-05;0.00030696680187248;0.00027893588412553;0.00048509825137444;0.00051105988677591;0.00067791872425005;0.0006813682266511;7.8676548582735e-06;3.1480019970331e-05;-8.7988755694823e-06;4.1897069422703e-06;0.00019922594947275;0.00015833237557672;-3.8648373447359e-05;-5.6902586948127e-05;-0.00010364186164225;0.0021990076638758;-0.0009080097079277;-0.00077186030102894;-0.00072926434222609;-0.00078952067997307;-0.00091090146452188;-0.00024726591072977;-0.00024572515394539;-0.00035491265589371;-0.00029201287543401;-2.665721149242e-05;-8.3198847278254e-06;-1.6919562767725e-05;-1.5453730156878e-05;-1.8108110566573e-07;-5.2075442908972e-06;0.0001724972971715;0.00019519816851243;-0.0010889606783167;-0.0010897406609729;-0.00064345495775342;-0.00088944454910234;8.2197489973623e-05;0.0001241818536073;-0.00030159301240928;-0.00028603567625396;-0.0002615659032017;-0.00025923052453436;4.6199842472561e-05;0.00011005716078216;0.00019630156748462;0.00092785054584965;-0.00014765220112167;-0.00059672025963664;-0.00064355047652498;0.00083799811545759;0.0011440725065768;0.00063285080250353;0.00057836569612846;0.00050156464567408;0.00051705993246287;0.00016103481175378;0.00017825866234489;-7.5796866440214e-05;-0.00011655464913929;5.0158760132035e-05;-8.507413440384e-05;-0.00013700399722438;0.0001215215670527;-0.00034311669878662;0.00091759662609547;-2.9586859454866e-05;0.00047956610796973;6.5627602452878e-05;-9.9247481557541e-05;-4.4656731915893e-05;0.00023792187857907;-1.1515996447997e-05;7.9219134931918e-05;-3.6392364563653e-05;-0.00013027408567723;0.00011114258813905;6.1841470596846e-05;-0.00021060983999632;0.00017641186423134;-0.00044284938485362;0.00041760958265513;-0.00069980451371521;0.00017217254207935;-0.00051150715444237;5.1690371037694e-05;-0.00016623240662739;-6.0480915635708e-06;-9.978956222767e-05;2.4582166133769e-06;0.0001087709897547;1.4538488358085e-05;-6.4285522967111e-05;1.0258086149406e-05;0.00016852191765793;0.00016850607062224;0.00098774407524616;4.1770887037273e-05;-0.00068384368205443;-0.00010492845467525;0.00016537652118132;5.0712928896246e-06;0.000145523386891;5.1634356168506e-06;7.9921170254238e-05;3.9638427551836e-05;0.00025811631348915;7.7877906733193e-05;0.00035743697662838;0.00042211942491122;-9.530962415738e-05;-0.00052424124442041;-0.00038360062171705;-0.00024465436581522;-5.1453920605127e-05;-0.00052498723380268;-3.732533150469e-05;-0.00010458296310389;4.5103220145393e-06;4.0211485611508e-05;-1.040156257659e-05;-0.0001626917073736;3.8534992199857e-05;2.9465986699506e-06;-0.00035556423244998;3.5473036405165e-05;-6.0828060668427e-05;-0.00078220036812127;0.00036920045386069;-0.00068458798341453;6.4849911723286e-05;0.00011391026055207;0.00012783298734576;-6.3239283917937e-05;0.00013868550013285;9.9542921816465e-05;-0.00012399101979099;0.00013159100490157;-5.9328624047339e-05;-0.0017580660060048;-0.00083573313895613;0.0010083770612255;0.00019548143609427;0.00010948204726446;0.0025956847239286;-0.00010432088311063;0.00011904404527741;-0.00012364925350994;-4.1275914554717e-05;-0.00010450958507136;1.4684192137793e-05;3.9708902477287e-05;-0.00010773591202451;-0.00010033196303993;8.4441322542261e-05;0.00025808284408413;-0.00022122275549918;0.0015884065069258;-0.0016093761660159;0.0011892432812601;-0.0013431902043521;-0.00020676698477473;0.00022421967878472;0.00026749810785986;-0.00022757648548577;0.00021285000548232;-0.00022023922065273;-0.00017139493138529;0.00018714854377322;2.3387434339384e-05;-8.0180638178717e-05;-1.907743535412e-05;-0.00043291892507114;0.00038564173155464;-0.0029024260584265;0.0031446092762053;-0.00071427383227274;0.00065182376420125;-0.00036393775371835;0.00040351500501856;-0.00013852813572157;0.00013205714640208;9.9866731034126e-05;-0.00010134974581888;3.4066101761709e-06;-1.0186357030761e-05;0.00022809402435087;0.00023673905525357;0.00073789595626295;0.00071426265640184;0.00072616391116753;0.0007445482769981;-6.1518403526861e-05;-4.5094016968505e-05;8.536729728803e-05;5.6102169764927e-05;0.0001746924535837;0.00013182072143536;-5.8905185142066e-05;-7.3390852776356e-05;-0.00018121756147593;0.00246866280213;-0.00025905386428349;-0.00060181110166013;-0.00064104545162991;-0.0014845501864329;-0.0015529230004176;-0.00038716959534213;-0.0003235837793909;-0.0003218203491997;-0.00027139694429934;-6.1826358432882e-05;-3.0685070669279e-05;3.075923450524e-05;2.7662939828588e-05;-2.2277154130279e-05;-3.5608743928606e-05;0.00038895721081644;0.00038591597694904;-0.00070746027631685;-0.0004781938623637;-0.00034581404179335;-0.00035129702882841;6.668741843896e-05;7.5115298386663e-05;-0.00030754279578105;-0.00024491050862707;-0.00021556235151365;-0.00017746789671946;-3.1216302431858e-07;2.5531528081046e-05;0.00033459611586295;0.0028500407934189;-7.2418966738041e-05;-0.0014396676560864;-0.001428744290024;3.1599625799572e-05;-0.00014552044740412;0.00053217454114929;0.00038354279240593;0.00039298969204538;0.00033254397567362;0.00015539530431852;0.00014439928054344;-5.5642874940531e-05;-7.1048525569495e-05;-8.6845495388843e-05;7.7945318480488e-05;0.00021992018446326;-0.00021793600171804;0.0014115665107965;-0.0014661711174995;0.0010752853704616;-0.0012084769550711;-0.00017866955022328;0.00020339427283034;0.00024749309523031;-0.00019860967586283;0.00020636015688069;-0.00017961818957701;-0.00015777896624058;0.00017480508540757;2.9916698167654e-06;-0.00024820797261782;-8.8879096438177e-05;-0.00031643378315493;0.00041688716737553;-0.002559095621109;0.0029748093802482;-0.00065680523402989;0.00057735264999792;-0.00033072999212891;0.00033148581860587;-0.00013035246229265;0.00011183870083187;8.551990322303e-05;-9.3045266112313e-05;7.0375472205342e-06;-7.5916273090115e-06;0.00021057389676571;0.00019534361490514;0.00059393554693088;0.00063798861810938;0.00064148072851822;0.00067547574872151;-4.9422051233705e-05;-3.527851367835e-05;5.9119611250935e-05;5.8423149312148e-05;0.00015214363520499;0.00012159418838564;-5.1312614232302e-05;-6.3947802118491e-05;-0.00018560801981948;0.0021627619862556;-0.00029849782004021;-0.00051830132724717;-0.00050824281061068;-0.0012325765565038;-0.0013876542216167;-0.00031619184301235;-0.00030219493783079;-0.00028038109303452;-0.00024531362578273;-4.9568239774089e-05;-2.8950966225239e-05;2.3497432266595e-05;2.1658484911313e-05;-2.2187976355781e-05;-2.3739909011056e-05;0.00034502911148593;0.00033256632741541;-0.00057614740217105;-0.0005936804227531;-0.00027463189326227;-0.00044832576531917;4.682075814344e-05;8.738484029891e-05;-0.00025972665753216;-0.00024354334163945;-0.00017610189388506;-0.00018168720998801;2.2696116275256e-07;3.8240887079155e-05;0.00028491122066043;0.0024858175311238;-6.6694010456558e-05;-0.0012639126507565;-0.0012316333595663;-5.8598801842891e-05;0.00012449866335373;0.00043692180770449;0.00040524246287532;0.00032928181462921;0.00035606868914329;0.00013048984692432;0.00014308105164673;-4.890560376225e-05;-7.7065036748536e-05;-0.00011684869969031;9.498337021796e-05;0.0004832447739318;-0.00042735689203255;0.0014792804140598;-0.0015150584513322;0.0011053489288315;-0.0012283381074667;-0.00019691554189194;0.00021763768745586;0.00014505420404021;-0.00012323797272984;0.00018862466095015;-0.00021544039191213;-0.00014887322322465;0.00015312030154746;4.8171677917708e-05;1.0578511137282e-05;-3.4970988053828e-05;-0.00097875494975597;0.00082459696568549;-0.0024910431820899;0.0026862297672778;-0.00057096313685179;0.00055627542315051;-0.00037154255551286;0.00042233319254592;-8.9457513240632e-05;8.9861474407371e-05;8.0784826423042e-05;-7.7324562880676e-05;2.8398108042893e-05;6.8884273787262e-06;2.6467347197467e-05;8.2408027083147e-05;0.00059498363407329;0.00065497396280989;0.00064527691574767;0.00067981833126396;-0.0001002103817882;-9.3092865427025e-05;0.000144113713759;0.00010619228123687;0.00010332761303289;8.2807113358285e-05;-9.3528637080453e-05;-8.9066852524411e-05;-0.00030855581280775;0.0019529754063115;0.0002222345356131;-4.12175359088e-05;-0.00018981007451657;-0.001642290269956;-0.0017328683752567;-0.00036189297679812;-0.0003213127492927;-0.00017627139459364;-0.00017823046073318;-8.9440523879603e-05;-5.4407999414252e-05;7.7378914284054e-05;6.3952596974559e-05;-4.5288914407138e-05;-5.4736494348617e-05;0.00056417746236548;0.00054079783149064;-0.00010808846127475;5.723752110498e-05;6.8360212026164e-05;9.9779601441696e-05;9.5312116172863e-06;2.4223490981967e-05;-0.0002475194633007;-0.00020467182912398;-0.00014219866716303;-0.00012128240632592;-5.7044067943934e-05;-5.10099089297e-05;0.00042679341277108;0.0047210324555635;0.00015220380737446;-0.0021792978513986;-0.0021134426351637;-0.0011301754275337;-0.0013550749281421;0.00030977561254986;0.00021550126257353;0.00022882301709615;0.00019339300342835;0.00011784172966145;0.0001124471964431;-1.1759469998651e-05;-2.0328268874437e-05;-0.00010261023271596;8.766858081799e-05;0.00043508800445125;-0.00040947966044769;0.0013270331546664;-0.0013755464460701;0.00099442759528756;-0.001117586507462;-0.00017127992759924;0.00019782797608059;0.00013440314796753;-0.00010096083133249;0.0001853412395576;-0.00017827449482866;-0.00013392524851952;0.00014705646026414;2.2083951989771e-05;-0.00015837485261727;-8.1605932791717e-05;-0.00083452148828655;0.00083341990830377;-0.002191660925746;0.0025390509981662;-0.00053128728177398;0.00048526271712035;-0.00034149910788983;0.00035559508251026;-8.4229366621003e-05;7.4524446972646e-05;6.6834945755545e-05;-7.2776143497322e-05;2.7794349080068e-05;9.1563269961625e-06;3.0485529350699e-05;4.5202308683656e-05;0.00048137918929569;0.00058518757577986;0.00055938848527148;0.00063135416712612;-8.5270054114517e-05;-8.4165018051863e-05;0.00011650566011667;0.00010680991545087;8.6338615801651e-05;7.5436822953634e-05;-8.0558587796986e-05;-8.3749371697195e-05;-0.00029841929790564;0.0017055213684216;0.00016789046640042;-2.2236205040826e-05;-8.1201120337937e-05;-0.0013919702032581;-0.0015915613621473;-0.00030183844501153;-0.00029860206996091;-0.00014726068184245;-0.00015865750901867;-7.4717841926031e-05;-5.323760342435e-05;6.5712782088667e-05;5.9281825087965e-05;-4.3536409066292e-05;-4.1505041735945e-05;0.00051640375750139;0.00046894591650926;-3.8757014408475e-05;-7.3248091212008e-05;9.9473283626139e-05;-1.4989856254033e-06;-3.013302148247e-06;3.8513091567438e-05;-0.00021246883261483;-0.00019836208957713;-0.00011145867756568;-0.00012447035987861;-5.163085370441e-05;-3.8934660551604e-05;0.00037074176361784;0.0042452081106603;0.00013554080214817;-0.0019713127985597;-0.0018575777066872;-0.0011068545281887;-0.0010540230432525;0.00024348933948204;0.00023715884890407;0.00018222841026727;0.0002195496490458;9.9308119388297e-05;0.00010862595081562;-9.9046537798131e-06;-2.6630212232703e-05;-0.00014833819295745;0.00011590401845751;0.0007899971678853;-0.00070043059531599;0.0014657871797681;-0.0014984024455771;0.0009867021581158;-0.0010699158301577;-0.00018495194672141;0.00020496749493759;1.2354138561932e-05;-1.1146952601848e-05;0.00016303577285726;-0.00022183793771546;-0.00010511015716475;9.2747977760155e-05;8.8886125013232e-05;0.00017929785826709;-3.03993729176e-05;-0.0017392641166225;0.0013997305650264;-0.0020865921396762;0.0021582029294223;-0.00044934946345165;0.00049152883002535;-0.00039535446558148;0.00046773834037594;-2.7394415155868e-05;3.8158315874171e-05;5.0201284466311e-05;-3.6752000596607e-05;6.889031647006e-05;3.3316897315672e-05;-0.00028925921651535;-0.00014571474457625;0.00018742316751741;0.00038026683614589;0.00050689594354481;0.00054704130161554;-0.00011290748807369;-0.00011852832540171;0.00019508706463967;0.00014583056326956;8.1688413047232e-06;2.0639374270104e-05;-0.00014701725740451;-0.00011109092883999;-0.0004661745915655;0.00090480438666418;0.00052748614689335;0.00083602371159941;0.00048991094809026;-0.0014605225296691;-0.0015432053478435;-0.00023837799380999;-0.000244111099164;4.0504139178665e-05;-3.8846686948091e-05;-0.00012072758545401;-7.8620207204949e-05;0.00012639723718166;9.6417184977327e-05;-5.8749039453687e-05;-7.1861009928398e-05;0.00069984927540645;0.00068206479772925;0.00042368413414806;0.00060252955881879;0.00045238848542795;0.00055827078176662;-5.3194533393253e-05;-4.15613540099e-05;-0.00018448407354299;-0.00015723897377029;-9.5742652774788e-05;-7.8817065514158e-05;-0.00012331461766735;-0.00013286668399815;0.00049004517495632;0.0066439639776945;0.00047446924145333;-0.0028436533175409;-0.0027738767676055;-0.002327928552404;-0.0026800259947777;0.00011763225484174;4.8182355385507e-05;0.0001166614893009;7.4008596129715e-05;7.8114673669916e-05;7.6757401984651e-05;4.3686668504961e-05;4.1005936509464e-05;-0.00013901334023103;0.00011471312609501;0.00075879046926275;-0.00069781887577847;0.0014147995971143;-0.0014457054203376;0.0009270011796616;-0.001040549017489;-0.00017202274466399;0.00020012914319523;1.6011419575079e-05;1.8551639868747e-06;0.00018013324006461;-0.00019568951393012;-8.8507513282821e-05;9.6654861408751e-05;4.7469438868575e-05;-4.6516743168468e-05;-7.0376132498495e-05;-0.0016050884732977;0.0014682208420709;-0.0019003337947652;0.0021645051892847;-0.00046102327178232;0.00044674272066914;-0.00040354736847803;0.00043164644739591;-2.9092307158862e-05;2.9732496841461e-05;3.7099602195667e-05;-4.0220460505225e-05;6.3441642851103e-05;3.6346631532069e-05;-0.00025569551507942;-0.00018727421411313;0.00015214734594338;0.00035225719329901;0.00044410247937776;0.00055525894276798;-0.00010317053965991;-0.00011829127470264;0.00017397885676473;0.0001550637971377;1.0486652399777e-06;1.6739279089961e-05;-0.00013051490532234;-0.00011871009337483;-0.00044832544517703;0.00081948359729722;0.00050483352970332;0.00075737264705822;0.00058038241695613;-0.0013022291241214;-0.0015438596019521;-0.00021038773411419;-0.00023561151465401;4.5913926442154e-05;-2.8433894840418e-05;-0.00010765424667625;-8.3769104094245e-05;0.0001145652422565;0.00010099095379701;-6.4729058067314e-05;-5.9598245570669e-05;0.0007035929011181;0.00061876262770966;0.0005123553564772;0.00048127362970263;0.00049082626355812;0.00048158731078729;-6.6492473706603e-05;-2.5831246603047e-05;-0.00016847359074745;-0.00015452320803888;-7.4638039222918e-05;-9.003140439745e-05;-0.00011702173651429;-0.00013065787788946;0.00046680818195455;0.0064056678675115;0.00046377742546611;-0.0027989046648145;-0.0025951620191336;-0.0023590784985572;-0.0024799529928714;6.9294117565732e-05;8.0524172517471e-05;7.2212300437968e-05;0.00011042741243728;7.0129695814103e-05;7.5071860919707e-05;4.3934629502473e-05;3.884943362209e-05;-2.1857102183276e-05;-1.2861607501691e-05;0.0001582283875905;-0.00016946591495071;-0.0008829107391648;7.7173368481454e-05;1.5549016097793e-05;0.00019846681971103;6.1242448282428e-05;-5.4376116167987e-05;-0.00020397354091983;6.512452091556e-05;-0.00032868221751414;-6.3221559685189e-05;-0.00024441952700727;-3.9357990317512e-05;0.00030805863207206;0.0012817142996937;1.6636548025417e-05;-0.00080252892803401;-0.00020296130969655;-1.4528355677612e-05;-0.00065891025587916;0.00066665658960119;6.429915811168e-05;0.00055606581736356;2.0761925043189e-05;7.1515765739605e-05;-2.5477738745394e-05;0.00011352958972566;5.05100688315e-05;0.0001143407280324;9.2541249614442e-06;-0.00054357084445655;0.00017871189629659;-0.00075836875475943;-0.00011478088708827;0.00023206883633975;-0.00029728069785051;-4.2838822992053e-05;2.588481265775e-06;5.508097819984e-05;-5.9506641264306e-05;-0.00010666366142686;7.1808044594945e-06;-0.00021237568580545;8.1334925198462e-05;-0.00056266662431881;-0.00094110163627192;0.00023338921891991;0.0019789449870586;0.00014172020019032;-0.00048842758405954;0.00054293201537803;0.0001530497247586;-3.7374084058683e-05;0.00035769218811765;3.9291302528e-05;-7.2645489126444e-05;3.4471795515856e-05;0.00012407786562108;-4.8528614570387e-05;8.5062238213141e-05;-7.3637762397993e-05;-0.00023151887580752;0.00056752865202725;-0.00017899947124533;0.00081165897427127;4.5512217184296e-05;0.00043749355245382;3.6235021980247e-05;-8.4781117038801e-05;0.00012719290680252;-4.6793637011433e-05;8.3727471064776e-05;0.00012102832261007;-7.6487893238664e-05;-2.4509001832485e-06;-0.00012408134352881;0.0016762730665505;0.00018135180289391;0.00032752862898633;-0.0012858986156061;-0.00052528775995597;-0.0012306007556617;-0.00015983020421118;-0.00028751709032804;0.00010852785635507;-0.00025321246357635;-7.3971328674816e-05;1.5546185750281e-05;1.4442500287259e-05;-4.0400959733233e-06;-6.5631043980829e-05;2.1981681129546e-05;0.00039211346302181;-0.00030027702450752;-0.00013819732703269;-0.00024917963310145;0.00021988050139043;-2.2772195734433e-05;-1.6008751117624e-05;2.3993789000087e-06;-0.00017771050625015;5.5511383834528e-05;-0.0001986517891055;-0.00010657539678505;-0.00015169596008491;-3.9502163417637e-05;0.00026912440080196;0.0012076490093023;7.4669755122159e-05;-0.0012438524281606;0.00017371101421304;-0.00052102078916505;-0.00025776363327168;0.00036400154931471;0.00015390240878332;0.00023299249005504;0.0001462233485654;6.8535693571903e-05;-1.6832600522321e-05;7.8422177466564e-05;4.4552933104569e-05;0.0001069327845471;1.4565274796041e-05;-0.00054663029732183;6.0385977121769e-05;-0.00051189016085118;-8.7593769421801e-05;0.00025545421522111;-0.00016214809147641;-5.6919601775007e-05;-1.8322565665585e-05;0.00011713786807377;-1.3587238754553e-05;-7.650196494069e-05;-5.4339766393241e-06;-0.00018939233268611;3.5520541132428e-05;-0.00048697114107199;-0.00071476609446108;0.0003083907358814;0.0017258368898183;0.00028549871058203;-0.00062103412346914;0.00021468052000273;5.8052490203409e-05;-4.0908991650213e-05;0.00027425342705101;5.2101950132055e-05;-9.7491472843103e-05;6.8341673795658e-06;0.00012607910321094;-1.2132884876337e-05;4.0209673898062e-05;-7.9847755841911e-05;3.7753339711344e-05;0.00057943956926465;4.5824447170162e-07;0.00093158707022667;0.00017038069199771;0.00060243176994845;8.684340173204e-06;-0.00010563336400082;2.760492861853e-05;-4.0379200072493e-05;-7.5580428529065e-06;8.2118000136688e-05;-0.00010033267608378;-4.9353635404259e-05;8.6628591816407e-05;0.0030704839155078;0.00032302291947417;-0.00062514893943444;-0.0016937712207437;-0.0010458604665473;-0.0018878545379266;-2.6823519874597e-05;-0.00025763004668988;0.00012741234968416;-0.0002263698115712;-2.4832537746988e-05;1.3963733181299e-05;4.0798920963425e-05;2.841769673978e-05;-0.00011279086174909;6.5963831730187e-05;0.00065687188180164;-0.0005303104990162;0.00055441737640649;-0.00069909461308271;0.00044168357271701;-0.00031501008197665;-8.1379032053519e-05;6.988435779931e-05;-0.00014481857942883;6.3566563767381e-05;-5.9241428971291e-05;-0.00015519090811722;-8.7540771346539e-05;-2.9055787308607e-05;0.00022257117961999;0.00094411621103063;6.7652996222023e-05;-0.0017326127272099;0.00079385557910427;-0.00097413605544716;0.000357536948286;6.0586411564145e-05;0.00026437305496074;-5.7684886996867e-05;0.0002909311442636;5.7260767789558e-05;-1.4918451597623e-05;4.6442728489637e-05;3.6070046917303e-05;0.00010493238369236;3.0174462153809e-05;-0.00057260983157903;-0.00011180527508259;-0.00042199520976283;-7.7261014666874e-05;0.00026654283283278;1.7393005691702e-05;-6.9402434746735e-05;-5.1185255870223e-05;0.00016119293286465;5.1125760364812e-05;-7.5469120929483e-05;-2.1250745703583e-05;-0.00018532034300733;-2.4781038518995e-05;-0.00048865017015487;-0.0006132711423561;0.00041065839468502;0.001670413184911;0.00060515885706991;-0.00071638426743448;-0.00020488417067099;1.248520493391e-05;-5.4661639296683e-05;0.00025779166026041;7.6667609391734e-05;-0.00011578297562664;-3.1185179977911e-05;0.00013614738418255;3.5216198739363e-05;-4.3910429781135e-07;-8.1290403613821e-05;0.00030907589825802;0.00062939588679001;0.00028484297217801;0.00099402945488691;0.00037392182275653;0.00074058416066691;-3.4123921068385e-05;-0.00011197824642295;-3.9154529076768e-05;-5.5987726227613e-05;-5.2253490139265e-05;3.2312313123839e-05;-0.00013234303332865;-0.00010635788203217;0.0002594344841782;0.0048321750946343;0.00050160149112344;-0.0016081723151729;-0.0022176415659487;-0.0018324939301237;-0.002597167622298;8.1947064245469e-06;-0.00020100836991332;0.00011109476326965;-0.00015786213043611;5.3686108003603e-06;2.0346142264316e-05;6.6870379669126e-05;5.9026384406025e-05;-0.00018622449715622;0.00013733141531702;0.0011246090289205;-0.00098188209813088;0.0014763087965548;-0.0014977278187871;0.00082600064342842;-0.00083163433009759;-0.00016755241085775;0.00017830774595495;-0.00012678190250881;9.6800584287848e-05;0.0001198134268634;-0.00023846555268392;-4.988698856323e-05;3.5202851904614e-06;0.00016064006194938;0.00051715987501666;2.9202215046098e-06;-0.002635604236275;0.0019606817513704;-0.0016876817680895;0.0014793063746765;-0.00031457564909942;0.00045145640615374;-0.00040632335003465;0.00052543426863849;4.4356482248986e-05;-1.7407370251021e-05;1.5528705262113e-05;2.1571961042355e-05;0.00011924361024285;6.1323175032157e-05;-0.00070349941961467;-0.00040154549060389;-0.0004277627740521;-7.3955772677436e-05;0.00033236423041672;0.00031310180202127;-0.00010115461918758;-0.00011337133037159;0.0002399653167231;0.00016242857964244;-0.00010148680303246;-5.1326795073692e-05;-0.00021466270845849;-0.00012235605390742;-0.00060627126367763;-0.00057884264970198;0.00063535827212036;0.0019494991283864;0.0012513543479145;-0.00098660867661238;-0.0009298610384576;-3.1363550078822e-05;-9.4331160653383e-05;0.0003028160717804;0.00013076128379907;-0.00015457013796549;-9.2834889073856e-05;0.00017450387531426;0.00011308539251331;-4.8126999899978e-05;-8.2856466178782e-05;0.0007059900672175;0.00076894171070307;0.00071184936678037;0.0010626778239384;0.00072181137511507;0.00096299068536609;-9.8252123279963e-05;-0.00011217836436117;-0.00011694669956341;-0.00010204053978669;-7.8612887591589e-05;-4.1368115489604e-05;-0.00019596591300797;-0.00020786824461538;0.00047376574366353;0.0080338912084699;0.00078808999387547;-0.0031229052692652;-0.0032020241487771;-0.00322932517156;-0.0038241324946284;-1.7651965436016e-06;-0.00010528422717471;9.1369503934402e-05;-2.4687664335943e-05;3.304532947368e-05;3.527171065798e-05;0.00010216938972007;0.00010247640602756;-0.00016888437676243;0.00013661017874256;0.0010532792657614;-0.00095296435756609;0.0014673407422379;-0.001465420005843;0.00076209247345105;-0.00084807816892862;-0.00015584829088766;0.00018061403534375;-9.6366500656586e-05;9.9061762739439e-05;0.00017047702567652;-0.00020159909036011;-1.9130204236717e-05;2.1219015252427e-05;6.4882871811278e-05;7.227054447867e-05;-5.1858492952306e-05;-0.0023317926097661;0.0020666178315878;-0.0014789275592193;0.0016271335771307;-0.0003909767838195;0.00039722272776999;-0.00044994565541856;0.00048258935566992;3.0570281523978e-05;-2.0528261302388e-05;-6.5133590396727e-06;6.8522917899827e-06;9.8102565971203e-05;6.4377716626041e-05;-0.00058594200527295;-0.00045973208034411;-0.00036246969830245;-8.6581138020847e-05;0.0002513995859772;0.00037248566513881;-8.7586871813983e-05;-0.00011452315811766;0.00020692302496172;0.00017744167416822;-9.3675211246591e-05;-5.5503274779767e-05;-0.00017152655345853;-0.0001440363121219;-0.00053255195962265;-0.00050621380796656;0.00058477849233896;0.0016180687816814;0.0013251857599244;-0.00079658848699182;-0.0010278224945068;-2.7843680072692e-05;-8.3652579633053e-05;0.00026101421099156;0.00013701061834581;-0.00012972786498722;-0.00010179905802943;0.00014604793977924;0.00012494031398091;-6.2707120378036e-05;-5.7620727602625e-05;0.00073387759039178;0.00062413210980594;0.00080628588330001;0.00079618790186942;0.00073428539326414;0.00081226939801127;-0.00011197777348571;-7.9385812568944e-05;-0.00011368019477231;-9.6254851086996e-05;-5.5011958465911e-05;-6.8931018176954e-05;-0.00017334819131065;-0.00020705698989332;0.00044409770634957;0.0075141708366573;0.00073384627467021;-0.0030757391359657;-0.0028139231726527;-0.0031398548744619;-0.0034147424157709;-4.5674223656533e-05;-2.6813380827662e-05;2.9736858778051e-05;5.7140779972542e-05;3.3122159948107e-05;3.183439548593e-05;9.278224024456e-05;9.8952514235862e-05;4.0907121729106e-05;-2.4477556507918e-05;9.3443763034884e-05;5.1678482122952e-05;-0.00025817358982749;0.0010641999542713;-0.00027453983784653;0.00012226117542014;8.2043967267964e-05;-0.00011456701759016;-8.6952626588754e-05;0.00015011861978564;2.2556778276339e-05;0.00026398239424452;2.2867463485454e-05;0.00024844324798323;-0.00027023325674236;-0.00085155537817627;5.7544584706193e-05;0.00032407636172138;0.00026707100914791;0.00066983647411689;-0.00037217867793515;9.2568034233409e-06;-0.00059296347899362;7.4240895628463e-05;-0.0005664054187946;3.7414039979922e-05;-4.529860598268e-05;-4.5775650505675e-05;-9.8822121799458e-05;1.6476116798003e-05;7.1109934651759e-05;0.00018491760420147;-0.00036943159648217;-0.00017351275891997;-0.00081270642112941;-0.00030777958454564;0.00017470400780439;1.5612660718034e-05;-1.6559557479923e-05;-8.5166284407023e-05;-1.6749763744883e-05;1.2550168548842e-06;-0.00011309260298731;8.0494050052948e-05;-0.00019800251175184;-0.00047870975686237;-0.00092143059009686;0.00010492206638446;0.00010091019066749;0.0016445267247036;0.00064942555036396;-0.00022932131832931;3.2875766464713e-06;0.00021522279712372;4.7655481466791e-05;0.00035016558831558;4.4979835365666e-05;-2.2432859623223e-05;-5.5130094551714e-05;9.4360504590441e-05;-4.4024094677297e-05;9.1268542746548e-05;0.00047844412620179;-0.0004336406418588;0.00050745852058753;-0.00028226335416548;0.00013336328265723;-3.3632175473031e-05;-4.0170314605348e-05;4.5570825022878e-05;-6.8017296143807e-05;0.00019241559493821;0.00012877504923381;9.5185256213881e-05;4.8559766582912e-05;-5.9246525779599e-05;-0.00029299399466254;0.00018312198517378;5.8198660553899e-05;-0.00070959946606308;0.0010953336022794;-0.00031850664527155;-0.0001170840478153;-0.00025447265943512;-0.00018085209012497;-0.000206474258448;9.1984693426639e-05;2.5575873223715e-05;-0.00010852415289264;-4.047728725709e-05;1.4723235835845e-05;-4.6681789171998e-06;-2.8148726414656e-05;6.1649070630665e-06;-0.00015832182543818;-0.0011476204963401;0.00022571656154469;-0.00011515721416799;0.00031893968116492;0.00010627001756802;-8.360916399397e-05;-0.00015854061348364;8.3913320850115e-05;-0.00034772360231727;-4.1807605157373e-05;-0.00026871770387515;-4.3019143049605e-05;0.00037143978988752;0.0011689143721014;-3.9122543967096e-05;-0.00058752339100465;-0.00030764151597396;0.00031618398497812;-0.00082122528692707;0.00072282529436052;2.6832225557882e-05;0.00066211569355801;-4.70902887173e-05;5.1138915296178e-05;-3.8018242776161e-05;0.00011862566316267;5.8875055401586e-05;0.00010806073260028;1.4253484550864e-05;-0.00050190993351862;0.00017735478468239;-0.0011143446899951;-0.00016718206461519;0.00011676533176797;-0.00034481668262742;-4.1202611100744e-06;1.1708862075466e-05;-2.6877754862653e-05;-7.0732865424361e-05;-0.00015548948431388;1.5025987522677e-05;-0.00023271051759366;9.9036544270348e-05;-0.0005915547371842;-0.0012761404505;9.8242417152505e-05;0.002125677652657;0.00019278973923065;-8.4019135101698e-05;0.00076640484621748;0.00029616232495755;-2.0784684238606e-05;0.00048390988376923;2.9675480618607e-05;-3.340985495015e-05;4.0233717299998e-05;0.00011295849981252;-6.4167143136729e-05;0.00012741393584292;-6.2102873926051e-05;-0.0004848254902754;0.0005414608749561;-0.00034353882074356;0.00060721777845174;1.9196200810256e-05;0.00021963396284264;4.1161692934111e-05;-5.3826130169909e-05;0.00020563187717926;-6.3762970967218e-05;0.0001357705477858;0.00013177670189179;-9.0074034233112e-05;4.0044833440334e-05;-0.00032333144918084;0.00055055291159078;9.8132833954878e-05;0.0011841960949823;-0.00091772485757247;-0.00026744324713945;-0.00057048979215324;-0.00023779974435456;-0.00026906310813501;0.00012264157703612;-0.00022610613086727;-0.00012000868446194;2.3376387616736e-05;1.6565099940635e-05;-3.4675980714383e-05;-0.00019083378720097;0.00014412017480936;0.0012666415423155;-0.0011201652232558;0.0015112634282559;-0.0014300907496363;0.00056553195463493;-0.00056795059936121;-0.00013597196084447;0.00014505497529171;-0.00018205988453701;0.00016822086763568;0.00014639085566159;-0.00021510213264264;5.6930140999611e-05;-7.6313386671245e-05;0.00013016589218751;0.00038806273369119;-1.843322820605e-06;-0.0030054117087275;0.0024282669182867;-0.0010949642164633;0.00093147886218503;-0.00031296175438911;0.00036710934364237;-0.00048156786942855;0.00052604789379984;8.2914695667569e-05;-6.1745959101245e-05;-4.6987832320156e-05;6.5770153014455e-05;0.00012185219384264;7.7996839536354e-05;-0.00092280155513436;-0.00068054912844673;-0.0009050170192495;-0.00053774856496602;5.6095494073816e-05;0.00011004866973963;-5.2828690968454e-05;-8.2426930021029e-05;0.00023027407587506;0.00017247954383492;-0.00018511393864173;-0.00012312989565544;-0.00020674511324614;-0.00013619213132188;-0.00047647778410465;-0.0018592081032693;0.00047515842015855;0.0023761002812535;0.001833405229263;-0.00013776688138023;-0.00021726019622292;0.0001933590247063;0.000102102283563;0.00045656473957933;0.00027479755226523;-0.00014472790644504;-0.0001001737327897;0.00016631222388241;0.00012162084749434;-2.7212156055612e-05;-4.680194251705e-05;0.0005375953624025;0.00052441947627813;0.0007030515698716;0.00089841423323378;0.00078477151691914;0.00097572494996712;-0.00012002116272924;-0.00011835974146379;-5.2563482313417e-05;-3.5163007851224e-05;-6.8528184783645e-05;-5.0219852710143e-05;-0.00022722833091393;-0.00025084707885981;0.00032185873715207;0.007374816108495;0.00086563971126452;-0.0026490583550185;-0.0025767991319299;-0.0032668251078576;-0.003739426843822;-4.2361425585113e-05;-9.0153967903461e-05;9.3324619228952e-05;2.9887260097894e-05;-1.0849865248019e-05;-1.2809699001082e-05;0.00013529567513615;0.00014043008559383;-0.00017876761558;0.0001474900636822;0.0012385968584567;-0.0011145840398967;0.0014927836600691;-0.0014309043763205;0.00052036211127415;-0.00059962517116219;-0.00012697352212854;0.00014974195801187;-0.00017109033069573;0.00017333608411718;0.00018264123355038;-0.00018554383132141;7.6374635682441e-05;-5.9630103351083e-05;3.3712847653078e-05;1.2389501534926e-05;-4.6189434215194e-05;-0.0027878568507731;0.0025751634966582;-0.00093000067863613;0.0010776983108371;-0.00036417521187104;0.00032323176856153;-0.00050778215518221;0.00049975363072008;7.6824384450447e-05;-6.5262851421721e-05;-6.3659870647825e-05;5.1945531595265e-05;0.00010928605479421;8.4265644545667e-05;-0.00084358482854441;-0.00074036000296474;-0.00084852922009304;-0.00057994289090857;1.1428313655415e-06;0.00016078843327705;-4.7008932597237e-05;-8.4869374404661e-05;0.00021093264513183;0.00018521489982959;-0.00017709338862915;-0.00013128481805325;-0.00017509215103928;-0.00016266290913336;-0.00045266974484548;-0.0018361473921686;0.0004611914337147;0.0021694307215512;0.0019592687021941;-2.2465237634606e-05;-0.00030773546313867;0.00018580928735901;0.0001164734858321;0.00042441984987818;0.00029695313423872;-0.00012973774573766;-0.00010957565245917;0.00014714237477165;0.0001364403142361;-4.4840136979474e-05;-2.6220208383165e-05;0.00060932367341593;0.00041750288801268;0.00083223340334371;0.00072087469743565;0.00081112008774653;0.00090412492863834;-0.0001342594914604;-9.7511845524423e-05;-5.5746644648025e-05;-2.7535046683624e-05;-4.5397773646982e-05;-7.3016453825403e-05;-0.00020682559988927;-0.00026367112877779;0.00031020768801682;0.0072062090039253;0.00084938912186772;-0.0027548519428819;-0.0023291707038879;-0.0032842976506799;-0.0035641805734485;-9.2893787950743e-05;-3.4254375350429e-05;3.2255375117529e-05;9.5038500148803e-05;-6.7572500483948e-06;-1.8551836546976e-05;0.00012601302296389;0.00014568962797057;5.7916444347939e-05;-3.072388790315e-05;0.00018285136320628;7.6909273047931e-05;-0.0003663637326099;0.0015044441679493;-0.00041938529466279;0.00019594699551817;0.00012131150288042;-0.00017042786930688;-0.00014039930829313;0.00020080005924683;3.6965939216316e-05;0.00037361233262345;4.1039154893951e-05;0.00035325708449818;-0.00043459059088491;-0.0012207332765684;9.6090807346627e-05;0.0004223772266414;0.0004552335885819;0.00099661911372095;-0.00058560282923281;3.96909445044e-06;-0.00083881814498454;0.00010621206456563;-0.00080697453813627;6.2130755395629e-05;-5.947363388259e-05;-7.3719733336475e-05;-0.00014047409058549;2.8955284506083e-05;0.00010509572166484;0.00023214146494865;-0.0005512191564776;-0.00029309789533727;-0.0013639440294355;-0.00045469208271243;0.00019498639449012;2.4272971131722e-05;-5.5076147873478e-06;-0.000118489995657;-4.8113226512214e-05;3.578340056265e-06;-0.00018742072279565;0.00011786066170316;-0.00030441640410572;-0.00071438599843532;-0.0015645776875317;9.360427793581e-05;0.00024751096498221;0.0025099774356931;0.0010292854858562;-0.00011581998114707;1.6131225493154e-05;0.00037728925235569;7.0749163569417e-05;0.00057523499708623;6.1173319409136e-05;-2.2541205908055e-05;-8.1512414908502e-05;0.00013789119839203;-6.3085164583754e-05;0.0001460632920498;0.0007171462639235;-0.00070614914875478;0.00070283486275002;-0.00045484906877391;0.00014340874622576;-4.282160261937e-06;-5.2757019147975e-05;5.8004079619423e-05;-0.0001111916571972;0.0003011398948729;0.00018616433953866;0.00013721101277042;8.0547761172056e-05;-0.00011135914974147;-0.00047946310951374;0.00014622812159359;0.00010113196185557;-0.0010166080901399;0.0018029089551419;-0.00035739748273045;-0.00024326262064278;-0.00036478336551227;-0.00026412119041197;-0.00028893788112327;0.00015465127944481;4.3246993300272e-05;-0.0001743428001646;-6.6076798248105e-05;3.7979072658345e-05;5.5690474255243e-05;-3.7808076740475e-05;0.00012781629629899;0.00012192747090012;-0.00038246312760748;0.0015583905624226;-0.00039947128971107;0.00023342380882241;0.00011743185314117;-0.00017970308545046;-0.00012365251313895;0.00017705804202706;1.2606659765879e-05;0.00034967178362422;2.7322797905072e-05;0.00034865556517616;-0.00035072298487648;-0.00095502461772412;0.00013386624050327;0.00040791390347295;0.00020514862262644;0.00088481185957789;-0.00070892809890211;3.3231852285098e-05;-0.0007944309618324;0.00013126447447576;-0.00080919486936182;5.612850873149e-05;-4.850890400121e-05;-5.9418543969514e-05;-0.00013303372543305;2.6672129024519e-05;9.7555013780948e-05;0.00024057587143034;-0.00047436787281185;-0.00025751115754247;-0.0013158072251827;-0.00040979793993756;0.00016007751401048;2.3067057554726e-05;-4.2682788858883e-08;-0.00011523081047926;-7.2998707764782e-05;1.2797900126316e-05;-0.00018195317534264;0.00010879351611948;-0.00027868387405761;-0.00068889441899955;-0.0014361361972988;6.6656633862294e-05;0.00021952460519969;0.0023041376844049;0.00093803118215874;-4.3199957872275e-05;1.5859446023114e-07;0.00037932061241008;5.7455661590211e-05;0.00054557633120567;5.8509729569778e-05;-7.6339783845469e-06;-7.864859799156e-05;0.0001219966361532;-4.9439368012827e-05;0.00012737007637043;0.00063527497695759;-0.00063817296177149;0.00056888203835115;-0.00029596770764329;7.540121441707e-05;1.1143861229357e-05;-3.5168148315279e-05;4.0986538806465e-05;-0.00011012304457836;0.00030447024619207;0.00016405005590059;0.00016696605598554;7.7559147030115e-05;-7.7315322414506e-05;-0.0004642597050406;-5.1158422138542e-05;8.8976412371267e-05;-0.00082694011507556;0.0016904552467167;-0.00018513025133871;-0.00024005475279409;-0.00031394520192407;-0.00033068837365136;-0.00024179737374652;7.6731994340662e-05;4.4142798287794e-05;-0.00016986246919259;-6.5128435380757e-05;2.2740954591427e-05;3.8804378164059e-06;-2.8009733796353e-05;-9.0180357801728e-05;-0.00012309037265368;-0.0011131177889183;0.0002603467728477;-0.00018379233370069;0.00032203033333644;0.00012211702414788;-8.5608633526135e-05;-7.9179648309946e-05;7.7209951996338e-05;-0.00027697166660801;-1.5643578080926e-05;-0.00024273684539367;-3.2491130696144e-05;0.00031265520374291;0.00077639287337661;-8.7539941887371e-05;-0.00027211112319492;-0.00027621301705949;0.00050406757509336;-0.00070932827657089;0.00058063061442226;-3.0728160709259e-06;0.00061457022093236;-8.4182764112484e-05;1.9693588910741e-05;-3.8410664274124e-05;9.8690718004946e-05;4.939544305671e-05;8.8913206127472e-05;1.6407044313382e-05;-0.00037565821548924;0.00014508148888126;-0.0012466779444367;-0.00017185001343023;-2.5877932330332e-06;-0.00029337845626287;2.9087876100675e-05;1.3815287275065e-05;-0.00010316041152691;-6.2805142079014e-05;-0.0001783529878594;2.468187813065e-05;-0.00021190843835939;8.7350395915564e-05;-0.00053661776473746;-0.0013064712984487;-2.9895258194301e-05;0.0018736706115305;0.00023236910055857;0.00028457111329772;0.00075546256266534;0.00038796439184807;-1.6643085473333e-05;0.00051525013986975;1.4786876818107e-05;8.4970924945083e-06;3.3416217775084e-05;8.639079896966e-05;-6.1709375586361e-05;0.00012765017163474;-4.1327348299092e-05;-0.00054285652004182;0.00043210995499976;-0.00028860315796919;0.00033521963632666;3.7456185964402e-05;7.0285764195432e-06;2.480343755451e-05;-1.7805887182476e-05;0.00023502502881456;-7.0644375227857e-05;0.00016549657448195;0.00010712812945712;-7.7278491517063e-05;6.2223953136709e-05;-0.00039975243271329;-0.00023810539278202;5.095547385281e-05;0.0014916608342901;-0.00051702151540667;-0.00016396955470555;-4.5391361709335e-06;-0.0003003791498486;-0.00019668861932587;7.3474308010191e-05;-0.00015046236512717;-0.00013388982915785;2.9202326913946e-05;1.4066815310798e-05;-5.0177586672362e-05;-6.0514153119584e-06;-3.5695968108485e-05;-7.4058509198949e-05;-0.00021964179177303;-0.0011551483767107;0.00028785201720893;-0.00017397862393409;0.00039796798955649;0.00012574181891978;-0.00010072425357066;-0.00010332641249988;0.00011042912956327;-0.0003447440394666;-4.559292938211e-05;-0.00026920370873995;-5.4472529882332e-05;0.00049930345267057;0.0011935010552406;-5.8076388086192e-05;-0.00065203860867769;-0.00033338891807944;0.00044281606096774;-0.00095105625223368;0.00071380246663466;3.1255407520803e-05;0.00067367096198723;-7.1635935455561e-05;2.9846878533135e-05;-5.222865001997e-05;0.00012055523257004;7.4320822022855e-05;0.00010088137059938;2.3502025214839e-05;-0.00048775871982798;0.00013569147267845;-0.0014824672834948;-0.00022693278151564;6.1955047385709e-06;-0.00037557512405328;3.5669861972565e-05;1.4057368389331e-05;-8.6722000560258e-05;-7.0587266236544e-05;-0.00020351582497824;1.7013026081258e-05;-0.00026746446383186;0.00011081787670264;-0.00061756873037666;-0.0016523826634511;-1.958310167538e-05;0.0023256873246282;0.00030527991475537;0.0003085203061346;0.00095768988830969;0.00042134351679124;2.0912236777804e-06;0.00062882085330784;2.4596356524853e-05;-4.1877592593664e-06;3.9276430470636e-05;0.00010975840268657;-7.2146947786678e-05;0.00017500156536698;-5.9572517784545e-05;-0.00073621096089482;0.00056683260481805;-0.00059898314066231;0.0004944879328832;2.2390595404431e-05;6.641246000072e-05;4.7473076847382e-05;-3.6642533814302e-05;0.00025656304205768;-8.3137463661842e-05;0.00014081232075114;0.00014409911818802;-0.00013897979806643;7.6382013503462e-05;-0.0004954244941473;-0.00017172147636302;5.7963945437223e-05;0.0019455169094726;-0.00074660324025899;-0.00014122396532912;-0.0001347309735138;-0.00022764725144953;-0.00026686329510994;0.00020639688591473;-0.00021546536299866;-0.00015826041635592;3.2254287361866e-05;3.9280508644879e-05;-6.0400332586141e-05;-0.0001719677093206;0.00013011996634305;0.0012489301152527;-0.0011084256693721;0.0014447490684688;-0.0012927901698276;0.00031924896757118;-0.00030831125332043;-0.00010235401714453;0.00010733946692199;-0.00019954994786531;0.00019689981127158;0.00015404510486405;-0.00018465284665581;0.00013943196972832;-0.00014179540448822;0.00010270457278239;0.00030009454349056;1.1240297226323e-06;-0.0030705980025232;0.0025812273379415;-0.00057815638137981;0.00042386440327391;-0.00028520458727144;0.00028115848544985;-0.00050912279402837;0.00049928162479773;0.00010086733527714;-8.4756960859522e-05;-9.0644192823675e-05;9.7243129857816e-05;9.9626551673282e-05;7.3656796303112e-05;-0.0010307239135727;-0.00084304233314469;-0.0011485825525597;-0.00082350603770465;-0.00014868318976369;-6.8912624556106e-05;-9.423068149772e-06;-4.5122833398636e-05;0.00021631416166201;0.00016521364159416;-0.00023674478870817;-0.00017522176494822;-0.00017578004917596;-0.00012387962487992;-0.00019168753351551;-0.0026090953033417;0.00026112922932953;0.0023808237165213;0.0019837566651404;0.00052707083523273;0.00040073395939544;0.00035707172355615;0.00026316792354919;0.00051301153143868;0.00034843277535401;-0.00012485822662711;-9.0789464593399e-05;0.00014394124445971;0.00011210265074624;8.7033158706618e-06;-3.7702384361182e-06;0.00022963641094975;0.00018844888836611;0.00040807042387314;0.00051963125588372;0.00067303579999134;0.00081975106149912;-0.00010561172530288;-9.8941673059016e-05;6.9350357989606e-06;2.6096447982127e-05;-7.3066301411018e-05;-6.471967935795e-05;-0.00023644806060474;-0.00026165574672632;0.00013226580631454;0.0056559555232525;0.00076681224163622;-0.0017076077638194;-0.0015857691178098;-0.0026915648486465;-0.003050398780033;3.270539764344e-06;-1.8306638594368e-05;0.0001500738580944;0.00011210382217541;-5.0473019655328e-05;-5.5392669310095e-05;0.00014758101315238;0.00015535457350779;-0.00016127550043166;0.00013539139763452;0.0012502931058407;-0.0011046327417716;0.0014198247808963;-0.0013082255609334;0.00027629768010229;-0.00034141371725127;-9.3844086222816e-05;0.00011202379391761;-0.00020143824804109;0.0002003511908697;0.00018591106345411;-0.00015654726303183;0.00015595463628415;-0.00012681112275459;-1.2123392480134e-05;-5.1025239372393e-05;-3.6148019717075e-05;-0.0028868450317532;0.0027578426524997;-0.00042309990385547;0.00055846921168268;-0.00032885067048483;0.0002378258650424;-0.0005276151932776;0.00048037691158243;0.00010027306416305;-8.7340413301717e-05;-0.00010715964890551;8.3560269558802e-05;9.1496731329244e-05;8.028373849811e-05;-0.00097532488871366;-0.00090389139950275;-0.0010938597843051;-0.00090021273354068;-0.00019351774244569;-3.1014911655802e-05;-7.2602679210831e-06;-4.4943884859094e-05;0.00020472586038522;0.00017392313748132;-0.00022844101476949;-0.0001878200127976;-0.00014700207975693;-0.00015398742107209;-0.00018470177019481;-0.0026318652089685;0.00025426395586692;0.0022312218789011;0.0021413122303784;0.00062108976999298;0.00034272542688996;0.00034678637166508;0.00028658020892181;0.00048131510266103;0.00038569685420953;-0.00011496401566546;-9.8533011623658e-05;0.00012829837214667;0.00012762058759108;-1.1135806744278e-05;1.882519791252e-05;0.00032731390092522;7.3341550887562e-05;0.00054987717885524;0.00035444850800559;0.00069422548403963;0.00078289350494742;-0.00011899432138307;-8.2636332081165e-05;-1.8176224330091e-06;3.9332102460321e-05;-4.8904043069342e-05;-8.7304732005578e-05;-0.00021292397286743;-0.00028565266984515;0.00011891368922079;0.0055861682631075;0.00076287431875244;-0.0018800481921062;-0.0013350518420339;-0.0027225364465266;-0.0029646568000317;-5.0270926294615e-05;3.3169166272273e-05;8.7254054960795e-05;0.00017896907229442;-4.3133866711287e-05;-6.5802334574983e-05;0.00013572341413237;0.00016754011448938;9.0024259407073e-06;3.4521974157542e-05;0.00044298631837592;-0.00020739217870869;4.5246004447108e-05;0.00031101057538763;-0.00026947670266964;-1.5670798347855e-06;5.9714930102928e-05;-4.8984245950123e-05;-0.00015157605230343;0.00013563391985372;0.00011122821888421;0.00019102432997897;9.4709990662523e-05;0.00013872394629288;-0.00050041620852426;-0.0012526927748695;-3.3446471206844e-05;-0.00013667161692865;0.0012842009309679;0.00077515229349956;2.0142957509961e-05;-0.00013708908227272;-0.00040947075467557;-8.3259146776982e-05;-0.00027288697310723;6.9652327510994e-05;-5.299310942064e-05;-9.9438773759175e-05;-6.5589971200097e-05;3.6455090594245e-05;8.3741622802336e-05;-8.2675178418867e-05;-0.00059103599051014;-0.00041679604328237;-0.0012328517623246;-0.00036984193138778;5.2983832574682e-05;2.087482062052e-05;1.7492931874585e-05;-3.386791649973e-05;8.28762040328e-06;-3.8219386624405e-05;-0.00017046181892511;6.8511144490913e-05;-0.00025461663608439;-0.00044264033203945;-0.0018026640173048;-1.5684438494645e-06;0.00059324712492526;0.0021573253907263;0.00098434509709477;0.00027180463075638;0.00010893978469539;0.00034918086021207;0.00011180980800418;0.00051364384125918;1.5780005924171e-05;-3.9451981137972e-05;-3.7942751077935e-05;0.00012021049042232;-6.7243323428556e-05;0.00014043603732716;0.00062900967895985;-0.00063145556487143;0.00068365497281775;-0.00060386379482225;0.00021200800256338;0.00014587558689527;-7.2963848651852e-05;3.7578927731374e-05;-7.8870449215174e-05;0.0001838985044742;0.0001298931601923;-1.9933382645831e-05;4.5832282921765e-05;-0.00021173455752432;-0.00033221594640054;0.00093902472872287;0.0002123947488144;-0.0011594769312069;0.0013536751503125;-0.00069545471342281;-0.00062620267271996;-0.00029453728348017;2.9565844670287e-05;-0.00022807702771388;0.00030827362206765;2.7934589525103e-05;-0.00013274529192131;-3.1846306228545e-05;0.0001075652326108;5.5268705182243e-05;-9.5836267064442e-06;0.00036659810575657;2.2733123842045e-05;-0.00029600178822875;0.001273567089811;-0.00046788775944151;0.00017572582873981;0.00012556707952172;-0.0001598491508048;-0.00019049855472986;0.00018070674559567;8.1324498751201e-05;0.00036643858766183;7.5454983743839e-05;0.00032940178061835;-0.00063170248176903;-0.001486842520535;6.7816807131749e-05;0.00029847066616639;0.00093225826276466;0.0011473189806566;-0.00049055658746511;-6.2781269662082e-05;-0.00081142876297235;5.8512614486972e-05;-0.00073517527198419;8.5325606050901e-05;-5.4599255236099e-05;-0.00010686161112972;-0.00013872073031962;4.3786450987682e-05;0.00010861258488148;0.00011910297325812;-0.00064690026920289;-0.00042035253136419;-0.0017494395142421;-0.00051016599172726;0.00010876402666327;2.6795571102411e-05;2.6816705940291e-05;-0.00010423952335259;-6.3858147768769e-05;-1.026934296533e-05;-0.00023420923389494;0.00012580110342242;-0.00036029392504133;-0.00074809353100136;-0.0021410929039121;7.1984718488238e-06;0.00049604324158281;0.0029170529451221;0.0012829005718231;0.00024214149743784;6.8620560341515e-05;0.00048660993343219;9.2301343102008e-05;0.00073108612559736;5.2454546676017e-05;-1.7393826055923e-05;-8.264604548458e-05;0.00015286602138076;-7.5265699706506e-05;0.00019676290685311;0.00084163731662557;-0.00094806804554537;0.00077116512693465;-0.00077218376100063;0.00012085087655578;6.1898877902422e-05;-6.1624115915038e-05;6.4083738834597e-05;-0.00013508058327716;0.00033300276845694;0.00020733769633807;9.0230845671613e-05;0.00010146419663215;-0.00020848275744356;-0.00060799240600318;0.00011717576126102;0.00014192303933669;-0.0011849965667352;0.002381585072726;-0.00033808476291597;-0.00037102127680555;-0.00040557750617154;-0.0001650690974202;-0.00031516244052909;0.00030595425050706;5.2332597988425e-05;-0.00021046747860964;-8.0161327787209e-05;9.1832807811443e-05;5.5232998420252e-05;-2.9173137590988e-05;0.00019460759358481;0.00011595930118347;-0.00036219015601091;0.0014430589508265;-0.00041307846549898;0.00022606126731262;0.00011892061593244;-0.0001756817655405;-0.00014158750127535;0.00015241805522237;2.8938216928509e-05;0.00033605442149565;3.7384557799669e-05;0.00033706019166857;-0.00043182336958125;-0.0010300313588232;0.00012245278048795;0.00037409990909509;0.00036214391002432;0.00092647131532431;-0.00066679017618299;7.5896182352153e-06;-0.00075661088339984;0.0001172574920929;-0.00077103020157665;6.4091524109244e-05;-3.9596710848855e-05;-7.0703339588363e-05;-0.00013150557060726;3.4197710192529e-05;9.4286675448529e-05;0.00019724514277186;-0.00048109210911207;-0.00029990851180628;-0.0014858816284686;-0.00041848563705571;0.00010870667756535;2.251731166325e-05;1.8992108380189e-05;-0.00010986228880938;-8.8991633674596e-05;1.1011585229426e-05;-0.00020049526938237;0.0001106291092583;-0.00030082525336184;-0.00070534268161282;-0.0016513324808329;1.7082133126678e-05;0.00031915612635203;0.0024265786632895;0.0010209415340796;0.00014449484297074;1.6962265362963e-05;0.00042403163388371;6.0183720052009e-05;0.00061541446484625;5.4447111324407e-05;4.1320993204863e-07;-7.9063865996432e-05;0.00012398937542457;-5.2755891374545e-05;0.00014965240552556;0.00068018800811842;-0.0007436903542839;0.00056913611479104;-0.00044501016964205;4.3665480916388e-05;3.575572554837e-05;-3.4792898077285e-05;4.3138024921063e-05;-0.00012243985838722;0.00031387025956064;0.00017199626017828;0.00014624338655267;8.9740424300544e-05;-0.00011835510667879;-0.00053131533786654;-0.00016155943740159;9.5225834229495e-05;-0.00085329735884443;0.00197479641065;-0.00011223791807424;-0.0002619881706778;-0.00032494385959581;-0.00028429084341042;-0.00024652143474668;0.0001429226831533;4.9458962166682e-05;-0.00018342745897826;-7.4105890234932e-05;4.4941982196178e-05;-1.5584688298986e-05;-3.3287644328084e-05;-0.00010124863183592;-0.00029300726600923;-0.00059444981161505;0.00020456423226278;-0.00011567177716643;0.00033603265183046;8.1462138041388e-05;-7.9113859101199e-05;-1.4673837540613e-05;0.00011876587814186;-0.00023672029783484;-6.5715277742129e-05;-0.00016387198411394;-6.1081271269359e-05;0.00059283728478476;0.0010747399646789;-1.2183870239824e-05;-0.00083364668535069;-0.00022690324112773;0.00023953472555149;-0.00082745339022949;0.00048024582793005;6.8576577177737e-05;0.00039944238960743;-3.3948985219467e-05;4.5422535777107e-07;-5.4424446716439e-05;8.6991443822626e-05;7.9339639341924e-05;4.6070730604697e-05;3.0844134016661e-05;-0.00032009699498303;1.1354131856933e-06;-0.0012740704696625;-0.00022064310905989;-7.5865682447329e-05;-0.0002930021728389;5.6683464208618e-05;5.9050921663584e-06;-7.3953437095042e-05;-3.9252237911569e-05;-0.00016348171629943;-5.4340739552572e-06;-0.000220704372623;8.7927910499275e-05;-0.00039929928607307;-0.0014763213694096;-8.2034603110515e-05;0.0017683730693534;0.00033161463215947;0.00047993284533732;0.00082418759120628;0.00032700234442018;4.8938640247798e-05;0.00055313820485026;2.1732996174251e-05;1.1987880498054e-05;2.3804717784515e-05;7.4440868047532e-05;-4.9561065679882e-05;0.00018026836914942;-4.6074521378614e-05;-0.00080108625115827;0.00045273348223418;-0.00086440774612129;0.00032602014834993;1.5997935634005e-06;-2.843465154001e-05;5.4201605962589e-05;-2.4411710910499e-05;0.00019602147222031;-7.30830070097e-05;5.092125502415e-05;0.00012127181980759;-0.00018143717898056;8.2860220572911e-05;-0.00050326029304415;-0.00059115287149325;6.9666798481194e-06;0.0021387883462012;-0.00049583939835429;4.0621787775308e-05;0.0001439479237888;-3.1800289434614e-05;-0.00020410730212461;0.00032423119409941;-0.00016789311484899;-0.00013809875235893;2.6918949515675e-05;6.589645636268e-05;-6.2182458350435e-05;-0.00011839456419693;8.8349057477899e-05;0.0010094321332872;-0.00090118357911706;0.0012072671670467;-0.0010278917616233;9.6161864348687e-05;-8.1859216152225e-05;-6.4104082412086e-05;6.6168846387882e-05;-0.00016907323151827;0.00017850653966889;0.0001405226503266;-0.00013270747149363;0.00018267499399371;-0.00016996011254378;6.2025013903622e-05;0.00016547761333641;-4.0211588725469e-08;-0.0026644323952496;0.0023385479580611;-0.00012565715587698;2.2677400920657e-05;-0.0002194047847297;0.00016655743820593;-0.00046681263484061;0.0004144188715145;8.9582681539468e-05;-8.1310849054717e-05;-0.00010824346827576;0.00010270543862134;4.4048036215827e-05;4.5529690396506e-05;-0.00094771845033392;-0.00085191172547638;-0.0010304192546755;-0.00083141069626436;-0.00025677512167022;-0.00017018357175402;1.8606864614412e-05;-1.3718992704526e-05;0.00019378335855436;0.00014472201291937;-0.00024196947924793;-0.00019899333710782;-0.00011004768748535;-8.7856911704876e-05;0.00024877511896193;-0.0025434501003474;6.2909144617151e-05;0.0017797738546506;0.0016077414620668;0.00085921649588272;0.00071872578701004;0.00040969141991809;0.0003509602684062;0.00043497537262738;0.00032870646100491;-8.9412897068541e-05;-6.5582709794398e-05;0.00010282819130225;8.8457280071452e-05;4.7621280828025e-05;4.3159663619008e-05;-0.00016890111146495;-0.0002253734273836;-7.6447882747743e-05;-4.7762536269147e-05;0.00040986624662764;0.00048989383503795;-6.0270649555605e-05;-5.0061145884683e-05;5.9943398809992e-05;7.9633660789113e-05;-7.8437275078613e-05;-8.2206548540853e-05;-0.00021133867267054;-0.00023336938465945;-5.3628042223863e-05;0.0029754093848169;0.00048502930440009;-0.00043233690666966;-0.00029358285246417;-0.001560504664667;-0.0017603002488613;0.00010309037315892;0.00010432984709041;0.00022072189312894;0.00021078226563986;-8.1107806181535e-05;-8.8333450548816e-05;0.00013231245975476;0.00014216901035979;-0.00010962072701659;9.7756455943454e-05;0.0010851144324988;-0.00089995533926412;0.0011910988250747;-0.0010568557772785;3.5114699130645e-05;-0.00010061485227197;-5.3616106015397e-05;6.7827677412424e-05;-0.00019760950817727;0.00018143137276638;0.00017681394820102;-9.8565426014829e-05;0.00020696528372355;-0.00015920482110232;-0.00011331161658745;-0.0001970724115381;-2.8156255211798e-05;-0.002547487616539;0.0026213391683996;6.3255254644901e-05;0.00011405804980313;-0.00026999361580238;0.0001066882032319;-0.00048826148849912;0.00039959256537259;0.00010182411642745;-8.4088904259261e-05;-0.0001334212574875;8.895557402866e-05;4.505438846536e-05;5.2146628149785e-05;-0.00094994652317837;-0.00093657674733549;-0.0010222099954262;-0.0010171710746363;-0.00031424631015398;-0.00016427924856544;2.0012432287331e-05;-4.6420018406934e-06;0.00019112197333016;0.00014668815128971;-0.00024131072859745;-0.00022460355830844;-8.2027509051841e-05;-0.00012981791223865;0.00023786537349224;-0.0027549869846553;4.0657243516762e-05;0.0017458465881646;0.0018846705788746;0.0010155914351344;0.00077193108154461;0.00042140178265981;0.00040564275695942;0.00041397367022;0.0004085328837391;-8.5759871581104e-05;-7.0429516199511e-05;9.0657718828879e-05;0.00010621330875438;2.5102752260864e-05;7.926575926831e-05;-2.9619071938214e-05;-0.00040978664765134;8.2890401245095e-05;-0.00027440671692602;0.00041994208004326;0.00048643472837284;-7.4096591561101e-05;-3.4944736398757e-05;4.2229032260366e-05;0.00011078343959525;-4.9159731133841e-05;-0.00010974383621942;-0.0001813505514292;-0.00028412343817763;-0.00010332926467527;0.0029208678752184;0.00049339450197294;-0.00067246076650918;0.00011830886796815;-0.0015785688301548;-0.0017455694032833;4.1142229747493e-05;0.0001651422935538;0.00015147033263929;0.0003080673632212;-7.0363195845857e-05;-0.00011328247637721;0.00011599681602092;0.00016976667393465;-4.0921360778157e-05;6.2594146584161e-05;0.0007210576441139;-0.00046585532254539;0.00056818983284757;-0.00048511222121306;-0.0001324298500549;-2.3301250621444e-05;4.5717789021182e-07;1.8670109056984e-05;-0.00016742853040341;0.00011284853098914;0.00014356504834723;2.5091248971876e-05;0.00015545384667348;-5.4489850299433e-05;-0.00035701651358977;-0.00067670544376597;-3.9533599192509e-05;-0.0011946714948863;0.0018518477445468;0.00043088238453493;5.5714936024742e-05;-0.00020590772328433;-9.4495429948438e-05;-0.00027634127764031;0.00013321496953722;8.3019287558272e-05;-5.3542942623608e-05;-0.00011687259393511;2.2018521121936e-05;3.0787155992584e-05;4.3457592255436e-05;-0.00052663841051981;-0.00066836964106187;-0.00062068674014881;-0.0010078789200634;-0.00030379623058252;-0.00011487979645608;2.0555591618177e-05;2.3963541025296e-05;8.7316788267344e-05;6.5326377807651e-05;-0.00013380782911554;-0.00017969681357499;3.0461858386843e-06;-0.00015501379675698;6.0730133554898e-05;-0.0020720020402223;-5.6456963648088e-05;0.00098254717886448;0.001640647999011;0.00094753707526252;0.00065127370180562;0.00027110485825688;0.0003560510231182;0.00021135712449905;0.00040652786265127;-3.559449032764e-05;-3.9680679037701e-05;2.3921093088575e-05;8.8351109297946e-05;-1.1858597645187e-05;0.00011893502232851;0.00019330486247782;-0.00060479389503598;0.00021835656662006;-0.00061654177261516;0.00020000952645205;0.00023610256903339;-5.4085096053313e-05;1.1367368642823e-05;-1.0782331628434e-05;0.0001356861757813;2.8380107323756e-05;-9.1535170213319e-05;-4.8903351853369e-05;-0.00024688593111932;-0.00024443652364425;0.0011243605986238;0.00025122889201157;-0.00057495367946103;0.0010409612441435;-0.00071692810161039;-0.00080208561848849;-7.5455580372363e-05;0.00017598463455215;-1.218551369675e-05;0.00034750823397189;-2.2768566850573e-05;-0.0001197747697006;3.1488285458181e-05;0.00014030034071766;4.7308139983215e-06;4.1917428461602e-05;0.00058680470101535;-0.00023110832262319;0.00016790989320725;5.3802101319889e-05;-0.00027999194571748;2.2341324438457e-05;5.130045246915e-05;-3.5211869544582e-05;-0.00018388210446574;0.00010676186502678;0.00013602098624688;0.0001538504002383;0.00012621909263544;7.4772324296646e-05;-0.00058821152197197;-0.0011851157760248;-3.5974571801489e-05;-0.00040913544944488;0.001577403745614;0.00078516214853153;-1.3911742826167e-05;-0.00017614007811062;-0.00034034156124108;-0.00013801142631564;-0.0001496801560279;8.5729952843394e-05;-4.4050535507267e-05;-0.00012045918992953;-4.3500829633558e-05;3.8128564483486e-05;6.1310980527196e-05;-0.00025631065363996;-0.0006119292229414;-0.00049384427256882;-0.0013224377762526;-0.00037274841452017;-5.3388619562611e-05;2.1449279302033e-05;4.108304347028e-05;6.8953404479544e-06;6.3080342442845e-06;-7.1901493356563e-05;-0.00019088888075203;6.2219478422776e-05;-0.00024165265494958;-0.00025616088532843;-0.0020690953824669;-7.9248537076637e-05;0.00072795333107933;0.0020790866110474;0.0010852037230507;0.00057780847419053;0.00018357882800046;0.00039559107972309;0.00013021411723457;0.00054548121988773;1.657056429849e-07;-2.6422938390169e-05;-2.4244480300695e-05;0.00010779641888803;-4.963365427102e-05;0.00016962426889222;0.00051617668941617;-0.00082283193478361;0.00048578053247184;-0.00088000105461106;0.00013030265108682;0.00014292905689217;-5.879965465283e-05;4.4109161535744e-05;-7.1350987127516e-05;0.00019853984122165;0.00011461557005532;-5.9794387198053e-05;4.0005124901654e-05;-0.00026542853447609;-0.00042230682447553;0.00045804446563125;0.00017329091497231;-0.00086371757788584;0.0018268396379426;-0.00043218937935308;-0.0004888063413091;-0.00023323501227424;0.00013316435797606;-0.00016859357128851;0.0004123225226067;1.6843418052304e-05;-0.00015476360567845;-3.0059034543228e-05;0.00013892335118726;4.4011914724251e-05;8.4083176261629e-06;0.00047908831038512;8.5660685726907e-06;-0.00013820617459714;0.00064337666844949;-0.00038758921436965;0.00011382049706299;9.3987458967604e-05;-0.0001016856476781;-0.00019947346299887;9.326799045084e-05;0.00011025943240384;0.00025591428857297;9.2223650426604e-05;0.00020018362556584;-0.00071016448782757;-0.0013253624783829;1.7880147424876e-05;7.7051721746102e-05;0.0011866049608216;0.0009823216823861;-0.00026832250296138;-0.00012056784908054;-0.00056138064246625;-1.0308446690033e-05;-0.00043385138269514;8.8743669039104e-05;-2.6045820050058e-05;-0.00011491563782329;-9.7836600616574e-05;4.7287718189182e-05;6.2455590523314e-05;-7.0676629547961e-05;-0.00051273556891829;-0.00042112989467569;-0.0015809119213372;-0.00041347197839059;-2.3083655833034e-05;1.8808370441548e-05;5.5131560657173e-05;-4.9948248488363e-05;-5.9968664572807e-05;-3.4554257581476e-05;-0.00020447678980418;9.8334428912494e-05;-0.00030205887742341;-0.00049120985204354;-0.0020584559533745;-8.3647850260604e-05;0.00058038276620209;0.0023643989115953;0.0011530449846759;0.00054034887580201;0.00012401565618347;0.00042727525578812;8.6452680989169e-05;0.00066299171885476;2.6583045837469e-05;2.2807516586454e-07;-5.5326483561657e-05;0.00011391701264074;-5.9420817706268e-05;0.00020272610709071;0.00068681820994243;-0.0010001566261053;0.00055317813530564;-0.0010135617339984;3.1192965252558e-05;7.3503164458089e-05;-4.7053737944225e-05;6.333168130368e-05;-0.00011842037201859;0.00027385356952436;0.0001706511102384;5.7373013078177e-06;9.6587980806362e-05;-0.00026037215138786;-0.00060397014021873;-0.00023739757307339;9.9383825727273e-05;-0.00088855676585808;0.0025144086685032;-8.3748040196951e-05;-0.00024008318723645;-0.00031421714811586;2.1385631043813e-05;-0.00024171339464374;0.00041596469236538;4.2777752241818e-05;-0.00019216806686018;-7.4748531915247e-05;0.00012408748443704;-2.2735403035767e-05;-2.8486003429862e-05;-9.6251096692868e-05;-0.00035145386937074;-0.00015439205162693;0.00010633836791385;-6.6768028773367e-05;0.00027363476692699;4.4334683479974e-05;-5.7768327678787e-05;4.0622933738632e-05;0.00012270268052816;-0.00015076667477842;-8.0628742580302e-05;-7.8032666351646e-05;-6.8202840338927e-05;0.00063208857318386;0.0009465265320614;2.03629333555e-05;-0.00098218850325793;-8.4982966654934e-05;8.4424107626546e-05;-0.00069977185921744;0.00030012772185728;9.7025040304288e-05;0.0001797844452085;7.2573097895656e-06;-1.7083842976717e-05;-5.5101147154346e-05;5.7660712627694e-05;8.1723170296755e-05;3.3212413654837e-06;3.4546763345134e-05;-0.00020724681962747;-0.00011710913531715;-0.0010431595146656;-0.00021623805514537;-0.00012422283180058;-0.00022538306075148;6.4940846641548e-05;-4.8108046257767e-07;-5.0043701776303e-05;-1.0705333806982e-05;-0.0001279071875615;-2.8931519409525e-05;-0.0001743545581121;6.6260363382753e-05;-0.00019723456352949;-0.0012954646954313;-0.00010939845378743;0.0012921844609082;0.0003464286273811;0.0005549521301873;0.00069442641688511;0.00023971914197318;9.1215610154904e-05;0.00046517382725142;2.577396480774e-05;1.8904602256953e-05;1.0560450391495e-05;4.7671321226517e-05;-2.8199212465552e-05;0.00017314396973234;-3.2339499739464e-05;-0.00080502382479608;0.00033547962084413;-0.00099825626239181;0.00019248695753049;-8.8140404841397e-06;-7.3776755016297e-05;5.5584136134712e-05;-1.679182787484e-05;0.00014652423851658;-5.8364697906654e-05;-1.446962414775e-05;9.5260351372417e-05;-0.00020289405074436;7.5317038863432e-05;-0.00047312086098827;-0.00077377824345604;-1.8921853552456e-05;0.002132422523573;-0.00030087781487964;0.00013760976435151;0.00027553655672818;0.00010519468924031;-0.00014372647274286;0.00039028073661029;-0.00012131086259615;-0.00011806804104708;1.8390141121927e-05;8.1941318057943e-05;-5.4637246648781e-05;-4.3132647988386e-05;-1.5284955452444e-06;0.0001221417915076;-0.00036891043419018;0.00021869996271562;-0.00010036277672043;-2.3758831957821e-05;0.00018599312170409;5.2747254812857e-06;-2.4591548935859e-05;3.2363266200264e-06;0.00010338091669837;-6.3370680436492e-05;-8.0705525761005e-05;1.174680164695e-05;-8.6802938312758e-05;0.00043923809425905;0.0007164433482103;3.6947691114619e-05;-0.001140791689977;0.00028174623730592;-1.8820752302418e-05;-0.00050780177116394;0.00012336962390691;0.00010380916501163;-2.1948289941065e-05;8.5522457084153e-05;6.4856931203394e-06;-4.8706202505855e-05;1.1041507605114e-05;7.6155054557603e-05;5.5752961998223e-06;2.2948832338443e-05;-0.00031810719519854;-0.00022585356782656;-0.00078837922774255;-0.00024313201720361;-0.00013120127550792;-0.00018250054563396;4.8695001169108e-05;2.051593583019e-06;9.9020016932627e-06;2.0887835489702e-05;-0.00012283847900108;-5.1010447350563e-05;-0.00011661801545415;3.8694324757671e-05;1.4652594472864e-05;-0.0012094378471375;-0.00010023303184425;0.0010098378406838;0.00038874670281075;0.00053927948465571;0.00060570292407647;0.000238296968746;0.00012695844634436;0.00033971815719269;4.9555357691133e-05;-5.2304544624349e-06;-4.4871785576106e-06;4.4647942559095e-05;-7.121965609258e-06;0.00012937895371579;-1.5934705515974e-05;-0.00061711587477475;0.00015142184565775;-0.00077756174141541;8.4126222645864e-05;2.2755284589948e-05;-9.2276741270325e-07;3.4557881008368e-05;-1.7731001207721e-05;0.00010118739737663;-1.9440187315922e-05;-5.7274450227851e-05;4.6253790060291e-05;-0.00017442736134399;2.0433384634089e-05;-0.00030457941466011;-0.00031637976644561;2.7388923626859e-05;0.001444177585654;-0.00015338268713094;1.0191349275601e-07;3.529735840857e-05;0.0001654651860008;-6.4914471295197e-05;0.00032982006086968;-4.6162829676177e-05;-9.1889851319138e-05;-4.1657431211206e-06;8.4916558989789e-05;-1.5399482435896e-05;-6.5688604081515e-05;2.343267260585e-05;0.00036980060394853;-0.00049239135114476;0.00058909563813359;-0.00036466406891122;-2.0806235170312e-06;0.0001342045434285;-2.3971775590326e-05;3.2347852538805e-06;-3.9083653973648e-05;0.00011503177665872;8.5813726400374e-06;-9.61080295383e-05;9.3900176580064e-05;-0.00012582520139404;0.00032625117455609;0.00057222420582548;4.273737067706e-05;-0.0015711525920779;0.00083020172314718;-5.6141128879972e-05;-0.00040469851228409;-7.1178019425133e-06;0.00012453568342607;-0.00020434358157218;0.00019046428496949;3.1102819775697e-05;-5.5829827033449e-05;-3.3369342418155e-05;8.7667336629238e-05;4.5110086830391e-06;1.9654507923406e-05;-0.00050566042773426;-0.00041928567225114;-0.00074313930235803;-0.00036753877066076;-0.00017436272173654;-0.00018604917568155;4.1609488107497e-05;3.2417690363218e-06;7.5341384217609e-05;6.1183549405541e-05;-0.00015209501725622;-9.7163137979805e-05;-8.9117238530889e-05;1.2882145711046e-05;0.00023571867495775;-0.0014762892387807;-9.432098158868e-05;0.0010066200047731;0.00059213524218649;0.0006534771528095;0.00066359585616738;0.00029007598641329;0.00020771150593646;0.00030996208079159;0.00010715409007389;-2.9712857212871e-05;-2.1110852685524e-05;5.343482553144e-05;1.7536091036163e-05;0.00010857346933335;5.6578842304589e-06;-0.0005514191580005;-3.6680990888271e-05;-0.00067000224953517;-3.845425817417e-05;8.0300713307224e-05;8.9722321718e-05;1.5599291145918e-05;-2.1478408598341e-05;8.8271088316105e-05;2.0745874280692e-05;-9.0484056272544e-05;-1.1976533187408e-06;-0.00018062634626403;-4.6391291107284e-05;-0.00021222443319857;0.00019069810514338;0.00010537506022956;0.0010401441249996;-2.3850313937146e-06;-0.00022610569430981;-0.00026807692483999;0.00021361705148593;1.5894349417067e-05;0.0003205161774531;4.1119448724203e-05;-8.8812659669202e-05;-3.3639356843196e-05;0.00010162885882892;3.0114642868284e-05;-8.5051920905244e-05;5.4787946282886e-05;0.00075954274507239;-0.00072006677510217;0.0010074756573886;-0.00079758570063859;1.0327704558222e-06;5.171236989554e-05;-4.5845641579945e-05;3.9692225982435e-05;-0.00012291311577428;0.00015255056496244;0.00010208000458078;-0.00010901465429924;0.00018258017371409;-0.00017755557200871;0.00012385068112053;0.00025293743237853;1.4599049791286e-05;-0.0022932291030884;0.0018857275135815;2.6045026970678e-05;-0.00023031696036924;-0.0001411101402482;0.00012068181968061;-0.00040363686275668;0.00034579008934088;6.9594265369233e-05;-7.1731818025e-05;-9.5408497145399e-05;0.00010278636182193;7.7789036367903e-06;2.3402679289575e-05;-0.00082608015509322;-0.0007558535435237;-0.00087613723007962;-0.00067817175295204;-0.00026546799927019;-0.00020978042448405;3.2442974770674e-05;4.212185160668e-07;0.00016824486374389;0.00012224091915414;-0.00022436225845013;-0.00018476213153917;-7.8346369264182e-05;-4.2799263610505e-05;0.00048839510418475;-0.0021863975562155;-4.5694745494984e-05;0.0013026198139414;0.0011328617110848;0.00089646270498633;0.00080610724398866;0.00039916107198223;0.00034890789538622;0.00036298323539086;0.000252119905781;-6.4465268224012e-05;-4.522025847109e-05;7.7736629464198e-05;6.1652091972064e-05;7.8313452831935e-05;4.9705515266396e-05;-0.00045369053259492;-0.00035422111977823;-0.00044519104994833;-0.00026500699459575;0.00022080729831941;0.00026699487352744;-2.1869229385629e-05;-2.5569641366019e-05;9.2620968644042e-05;8.8306594989263e-05;-9.7122894658241e-05;-7.6063872256782e-05;-0.00019934415468015;-0.00017718806338962;-0.00013047216634732;0.0012573782587424;0.0002810847654473;0.00044266053009778;0.00025862196343951;-0.0007805927307345;-0.00089916941942647;0.00019652301853057;0.00014333432773128;0.00028942117933184;0.00020890339510515;-9.7011827165261e-05;-8.8074804807547e-05;0.00012386104208417;0.00011205128248548;-7.1950737037696e-05;6.4849540649448e-05;0.00085254851728678;-0.00068476505111903;0.00097434327472001;-0.00085450796177611;-5.1146071200492e-05;8.3369186540949e-06;-3.6636538425228e-05;4.6393623051699e-05;-0.00016143095854204;0.00014251963875722;0.00014533562352881;-7.0282316301018e-05;0.00020293227862567;-0.00016340575530194;-0.00011456440552138;-0.00016629086167086;-1.8227761756862e-05;-0.002112885704264;0.0021960071753711;0.00020703347399831;-8.0725912994239e-05;-0.00020238199795131;5.4013380577089e-05;-0.00042070986819454;0.00033889460610226;8.4580831753556e-05;-6.7891574872192e-05;-0.00012250982399564;8.2524536992423e-05;1.1103575161542e-05;2.4883049263735e-05;-0.00082917412510142;-0.00081783294444904;-0.00080642371904105;-0.00084458966739476;-0.00030196938314475;-0.00019430898828432;2.6131825507036e-05;9.4640045062988e-06;0.00017325376393273;0.00012296746717766;-0.00021836734958924;-0.00020737481827382;-4.4214644731255e-05;-8.7585816800129e-05;0.00048661511391401;-0.0023081419058144;-4.8384026740678e-05;0.0012220302596688;0.0013697386020795;0.00098100118339062;0.00081328547094017;0.00039521927828901;0.00039049150655046;0.00031762354774401;0.00033163229818456;-6.479137664428e-05;-4.8251316911774e-05;6.6659886215348e-05;7.9309153079521e-05;4.1961659007939e-05;8.8973945821635e-05;-0.00024931109510362;-0.00056682794820517;-0.00019898152095266;-0.00050619710236788;0.00023247009085026;0.00028418176225387;-3.9951482904144e-05;-1.0430866495881e-05;6.6068532760255e-05;0.00012389243056532;-6.0315698647173e-05;-0.00011242381151533;-0.00015220491332002;-0.00023995847732294;-0.00014522197307087;0.0013261954300106;0.00029890344012529;2.3579637854709e-05;0.00068627798464149;-0.00083103129873052;-0.00094990170327947;0.00011404509132262;0.00021726851991843;0.0001865530066425;0.00031967624090612;-7.7773562225047e-05;-0.00011540426203283;9.8885444458574e-05;0.00014700255997013;-3.0841474654153e-05;5.4869058658369e-05;0.00069675053237006;-0.00040878119762056;0.0005599627038464;-0.00054094567894936;-0.00015039814752527;4.7591061047569e-06;-1.045871158567e-06;2.2604339392274e-05;-0.00016503810184076;9.0893750893883e-05;0.00014383636880666;1.9131563021801e-05;0.00016564200632274;-8.2587335782591e-05;-0.00038609839975834;-0.00064619118347764;-4.16095390392e-05;-0.0011606941698119;0.001832133391872;0.00045756544568576;1.6053572835517e-05;-0.00020127088646404;-8.2509010098875e-05;-0.0002822482783813;0.00017152090731543;8.1675658293534e-05;-4.5358880015556e-05;-0.00011970700143138;2.7926827897318e-05;1.7322901840089e-05;2.4390052203671e-05;-0.00055586057715118;-0.00063982425490394;-0.00054866360733286;-0.00091880303807557;-0.00029043218819425;-0.00014519270916935;2.0394738385221e-05;3.0709663406014e-05;0.00010287705663359;6.6314561991021e-05;-0.00014087941963226;-0.00017713887791615;1.3137654605089e-05;-0.00012975951540284;0.00024581901379861;-0.0019343132153153;-9.3318412837107e-05;0.00081794714787975;0.00138016033452;0.0009252336458303;0.00070845533628017;0.00028689633472823;0.0003529149107635;0.00018019617709797;0.00036932076909579;-3.633711457951e-05;-3.1144583772402e-05;2.3911550670164e-05;7.5665688200388e-05;-2.2702845399181e-06;0.00012674866593443;7.2933318733703e-05;-0.00070487166522071;7.500789797632e-05;-0.00075807311804965;0.00012598840112332;0.00017398710770067;-4.0603405068396e-05;2.0260580640752e-05;4.567656560539e-06;0.00014086857845541;1.3670527550858e-05;-0.00011073368659709;-4.4278272980591e-05;-0.00024751081946306;-0.0002485740405973;0.00054700835607946;0.00018227582040709;-0.00028901503537782;0.0012963120825589;-0.00043426133925095;-0.00052757625235245;-2.3755432266626e-05;0.00023410221911035;1.8409205949865e-05;0.00038041718653403;-3.0559305741917e-05;-0.00012415696983226;3.0526887712767e-05;0.00014315506268758;5.3443709475687e-06;3.6004981666338e-05;0.00055211334256455;-0.00017889817536343;0.00019259123655502;-0.00010229425970465;-0.00023502837575506;2.6940011593979e-05;3.7463243643288e-05;-1.9674569557537e-05;-0.00016848384984769;6.4611922425684e-05;0.00012617051834241;0.00010808583465405;0.00011953801003983;2.6316220100853e-05;-0.00054953020298854;-0.00095236743800342;-3.4425447665853e-05;-0.00044479020289145;0.0014420583611354;0.00065275601809844;-1.453490494896e-05;-0.00016642030095682;-0.0002444498531986;-0.00014057115186006;-5.2940042223781e-05;7.8298515290953e-05;-2.7645759473671e-05;-0.0001100022054743;-2.6235840778099e-05;3.0824976420263e-05;3.2568426831858e-05;-0.00030098398565315;-0.00049239723011851;-0.00042124241008423;-0.00109791115392;-0.00030060627614148;-9.5869814686012e-05;1.6308431440848e-05;4.5818800572306e-05;2.8950264095329e-05;4.6087179725873e-06;-7.7367141784634e-05;-0.00016230784240179;4.9949252570514e-05;-0.00018781865946949;-8.4447099652607e-05;-0.001772562856786;-0.00010307248157915;0.00062396028079093;0.0015996191650629;0.00091843103291467;0.00061329337768257;0.00018925798940472;0.00033533424721099;0.00010807791113621;0.00045348599087447;-7.8255716289277e-06;-1.294504818361e-05;-1.2348901691439e-05;7.9217643360607e-05;-3.2094554626383e-05;0.00015547807561234;0.00035830656997859;-0.0007910150452517;0.00029198385891505;-0.00089289806783199;5.6223150750156e-05;0.00010615669452818;-4.0253580664285e-05;4.1966934077209e-05;-5.3706618928118e-05;0.00017014952027239;8.5366096755024e-05;-7.4311610660516e-05;3.3241289202124e-05;-0.00024729102733545;-0.00038904944085516;5.8675374020822e-05;0.00011243116750848;-0.00054316810565069;0.0017850531730801;-0.0001850807457231;-0.00029226727201603;-0.00015585692017339;0.00017444616241846;-0.00010970245057251;0.00040116859599948;8.2296955952188e-06;-0.0001380143512506;-2.5093175281654e-05;0.00013092668086756;4.100658770767e-05;7.4405261329957e-06;0.00047018183977343;5.9922458603978e-05;-7.3572744440753e-05;0.00030059888376854;-0.00030412140768021;8.0149671703111e-05;6.9557761889882e-05;-6.5840009483509e-05;-0.00018411022028886;2.5998078854172e-05;0.00010876196756726;0.00017815528553911;8.3907434600405e-05;0.00012009780766675;-0.00069259881274775;-0.001059148227796;-1.2502473509812e-06;5.1003394219151e-06;0.0011053333291784;0.00077945127850398;-0.00015927851200104;-0.00012881601287518;-0.00039115053368732;-2.9201890356489e-05;-0.0002506954187993;8.0310164776165e-05;-7.3544521228541e-07;-0.00010362835018896;-7.182562694652e-05;4.4400199840311e-05;2.0417239284143e-05;-0.00015437514230143;-0.00033080135472119;-0.00034830579534173;-0.0012669079005718;-0.00030604761559516;-8.3578554040287e-05;9.8091113613918e-06;6.313192716334e-05;-1.6927240721998e-05;-5.7126078900183e-05;-4.4815853470936e-05;-0.00015558271843474;7.4101459176745e-05;-0.0002318017068319;-0.00028524591471069;-0.001682560541667;-0.00011180598812643;0.00051118311239406;0.0017143253935501;0.00091219897149131;0.00059526570839807;0.00013720511924475;0.00032032397575676;6.7033499362879e-05;0.00053878745529801;1.1766846910177e-05;1.6173617041204e-05;-3.4151617001044e-05;7.3910392529797e-05;-4.081516090082e-05;0.00018176970479544;0.00051402550889179;-0.0009273219620809;0.00035193431540392;-0.0010391335235909;-3.9386155549437e-05;5.3192783525446e-05;-3.0034645533306e-05;5.8784618886421e-05;-9.7808850114234e-05;0.00021666994143743;0.00013263168511912;-3.0547187634511e-05;8.7412583525293e-05;-0.00025199461379088;-0.00054491200717166;-0.00053608132293448;4.6468845539493e-05;-0.00058224896201864;0.0023701367899776;0.00013320478319656;-8.0391131632496e-05;-0.00022385499323718;0.00010347778879805;-0.00017467423458584;0.00042271558777429;3.3598582376726e-05;-0.00016121246153489;-6.6661305027083e-05;0.00012105506903026;-4.8101235734066e-05;1.5965100828907e-05;0.00024900893913582;-0.0003468360810075;0.00043345033191144;-0.0002468227467034;1.9319113562233e-06;0.00010068632400362;-1.949786201294e-05;1.8763679463518e-06;-2.1647381799994e-05;8.0706355220173e-05;4.6736331569264e-06;-7.0879970735405e-05;7.0015972596593e-05;-9.0637309767772e-05;0.00025231292238459;0.00043784783338197;3.6132434615865e-05;-0.0011125869350508;0.00054254778660834;-5.948821126367e-05;-0.00030183556373231;-6.768836556148e-06;9.4721821369603e-05;-0.00015234711463563;0.00013375964772422;2.0268435036996e-05;-3.956802902394e-05;-2.2529902707902e-05;6.3641338783782e-05;3.9350368297164e-07;1.2842225260101e-05;-0.00034984588273801;-0.00029231718508527;-0.00050177314551547;-0.00023707209038548;-0.00011993327643722;-0.00013027731620241;2.994765418407e-05;2.3447425974155e-06;5.3774459956912e-05;4.3714160710806e-05;-0.00010459413897479;-6.6989814513363e-05;-6.0115766245872e-05;1.3555299119616e-05;0.00018571762484498;-0.00099797791335732;-7.2742579504848e-05;0.00066740508191288;0.00037570321001112;0.00045264448272064;0.00046316592488438;0.00020102834969293;0.00014550113701262;0.00020886000129394;6.4925516198855e-05;-2.0411869627424e-05;-1.4823516721663e-05;3.6305482353782e-05;1.1045558494516e-05;8.0283105489798e-05;1.6744996855778e-06;-0.0004117758362554;-1.7393176676705e-05;-0.00050954119069502;-2.0746922018589e-05;4.5632885303348e-05;5.1303733926034e-05;1.4190069123288e-05;-1.5114223970158e-05;6.2460014305543e-05;1.2708484064206e-05;-7.145033305278e-05;1.3130784282112e-06;-0.00013021181803197;-2.5467763407505e-05;-0.00014876680506859;4.9332709750161e-05;6.1142760387156e-05;0.00078884098911658;-6.7588575802802e-06;-0.00011274770804448;-0.00014256198483054;0.000169166145497;9.1891497504548e-06;0.00023820321075618;2.1077272322145e-05;-6.348206079565e-05;-2.1878386178287e-05;7.3835966759361e-05;1.7543041394674e-05;-8.8864280769485e-06;2.5130908397841e-05;0.00045555384713225;-0.00022532430011779;0.00041577618685551;-0.00045238391612656;-0.00010151544847758;1.5845280358917e-05;-7.6179962889e-06;2.4790726456558e-05;-0.00011029816960217;4.4515381887322e-05;9.8104734206572e-05;7.1452282099926e-06;0.00012489737127908;-8.6807289335411e-05;-0.00028079492039979;-0.00038771686377004;-3.0651201086584e-05;-0.00083911727415398;0.0012770461617038;0.00030488456832245;-9.5019822765607e-06;-0.00012648226402234;-5.2760260587092e-05;-0.00021420216944534;0.00016856027650647;5.2781539125135e-05;-2.2293752408586e-05;-8.3016639109701e-05;2.4338687580894e-05;-7.4270474215155e-06;-6.4673376982682e-06;-0.00043605803512037;-0.00042890381882899;-0.00027677306206897;-0.00047658832045272;-0.00017616921104491;-0.00011030583118554;9.4716069725109e-06;1.8725757399807e-05;0.00010135385673493;5.9817710280186e-05;-0.00011294427531539;-0.00012074762344128;1.7703410776448e-05;-5.7752582506509e-05;0.00043149027624168;-0.0011107509490103;-6.5579719375819e-05;0.00035636944812723;0.00062157562933862;0.00055559969041497;0.00046332948841155;0.00021371123148128;0.00022906594676897;9.2604161181953e-05;0.00019721825083252;-2.9534445275203e-05;-1.6064628653112e-05;2.223832962045e-05;4.1792158299359e-05;6.5125809669553e-06;8.644483750686e-05;-0.00010820211900864;-0.00058078719303012;-8.2356440543663e-05;-0.00061556632863358;3.7552359572146e-05;7.3834300565068e-05;-1.7769936675904e-05;1.9428822270129e-05;3.0841230909573e-05;0.00010527564154472;-1.6703557776054e-05;-9.951301763067e-05;-3.5009488783544e-05;-0.00016832424444146;-0.00010693311196519;-9.8229347713641e-06;7.8149845649023e-05;4.1030885768123e-05;0.0010271064238623;-0.00010936379840132;-0.00017110953922383;5.1676463044714e-05;0.00022052673739381;5.001172030461e-05;0.00028445583302528;-3.405287861824e-05;-8.8397217041347e-05;2.8920501790708e-05;0.00010214364010608;-5.8744630223373e-05;1.307937236561e-05;5.8465378970141e-05;0.0001228127948707;0.00088920822599903;-0.00030212081037462;-9.9716075055767e-05;-0.00053479865891859;-3.7961137877573e-06;-5.3165869758232e-05;0.0001946434204001;-0.00013381740427576;-5.1889743190259e-05;-0.00014796832692809;2.6792477001436e-05;0.0001252635702258;5.1354807510506e-05;0.00068365997867659;0.00084448023699224;-0.00017355018644594;-0.00040770554915071;-0.0016138784121722;0.0004399927565828;-0.00044495821930468;0.00022765369794797;0.00011648082727334;0.00018052867380902;-3.5459727314446e-06;9.2458103608806e-05;1.2406484017902e-07;-3.734240817721e-05;-4.6893146077309e-07;1.9023918866878e-05;7.3066941695288e-05;1.6106294424389e-05;-0.00054628873476759;-0.00032224957249127;-0.00028175374609418;0.00037950580008328;0.00022149198048282;5.3360301535577e-05;-0.00010042909707408;-7.0651338319294e-05;1.1989706763416e-05;0.00012879242422059;9.9330000011832e-06;-8.2639504398685e-05;-2.9674172765226e-05;-0.00034245089045726;-0.0012035340769216;-1.7899532394949e-05;7.3633724241517e-05;0.0012946657370776;0.00056995020713657;0.0001489041314926;0.00010711693175836;0.00011791219731094;-0.00014790051500313;5.9378035075497e-05;-2.0359166228445e-05;-9.6640993433539e-05;-2.1891106371186e-05;8.2866012235172e-05;-1.476153920521e-05;-0.00018182941130362;-0.00015971712127794;-0.0018920435104519;-7.6455049565993e-05;-0.0011367144761607;-0.0001799772871891;0.00012794838403352;1.107010348278e-06;-0.00035342323826626;6.9752408307977e-05;-0.00036060708225705;-3.7851859815419e-05;9.561260958435e-05;3.3469754271209e-05;-0.00010246352030663;-0.0015100253513083;-8.0383142631035e-05;0.00069887383142486;0.00061281921807677;0.0025033808778971;0.00011324986553518;0.00093306787312031;-3.523234045133e-05;0.00066882919054478;0.00010514398309169;0.00017189787467942;-1.0861521332117e-05;-7.4031137046404e-05;-1.164149853139e-05;-6.6788401454687e-05;1.8642762370291e-05;5.8698111388367e-05;0.00013852887786925;0.0010707759065554;-0.00045765191316605;5.1939230615972e-05;-0.00065192364854738;-3.3814507332863e-05;-3.0555569537682e-05;0.00023346324451268;-0.0001726813352434;-2.5978326448239e-05;-0.00017440810916014;9.3808494057157e-06;0.00013837871665601;5.9222602430964e-05;0.0007504690438509;0.00084451696602628;-0.00018606949015521;-0.00045909892651252;-0.0019568186253309;0.00071990746073425;-0.00052760186372325;0.0003065146447625;6.2052815337665e-05;0.0002241818147013;-2.3879090804257e-05;0.00011191399971722;1.5304531189031e-05;-4.6621673391201e-05;-4.3853206079802e-06;1.6455493096146e-05;0.00010758046846604;5.5376509408234e-05;-0.000436753151007;-0.00029803477809764;-0.0001763680629665;0.00042357610072941;0.00021778645168524;5.9488767874427e-05;-9.1613328550011e-05;-8.1619349657558e-05;4.9122972995974e-05;0.00013805920025334;4.0888025978347e-06;-8.6964901129249e-05;-1.6894948203117e-05;-9.4551010988653e-05;-0.0012854688102379;-0.00013063712685835;-4.5373264583759e-05;0.001144977635704;0.00053360557649285;9.9408025562298e-05;0.00010385895438958;5.1290317060193e-05;-0.00016805430641398;5.0255956011824e-05;-1.6046844393713e-05;-9.743393457029e-05;-2.4732089514146e-05;8.8071683421731e-05;-1.5063751561684e-05;-0.00018667234689929;-0.00015924377657939;-0.0021089820656925;-0.0001535866613267;-0.0012739462545142;-0.00021872429351788;0.00016526711988263;9.5326214477609e-07;-0.00039727444527671;5.445057831821e-05;-0.0004027854593005;-4.7623518184992e-05;9.9912133009639e-05;4.1239931306336e-05;-0.00010129584552487;-0.0016057525062934;-0.0001389570243191;0.00073406792944297;0.00062782072927803;0.002772027393803;0.00021304521942511;0.0010378588922322;3.2777330716272e-07;0.00076192908454686;0.00012860535935033;0.00019695240189321;-2.6879831693805e-06;-8.9342676801607e-05;-2.0591014617821e-05;-7.1891430707183e-05;2.939237128885e-05;4.6185505198082e-05;0.00012799483374692;0.0012073332909495;-0.00067924684844911;0.000245437346166;-0.00073757593054324;-6.5356034610886e-05;8.3080703916494e-06;0.00027201877674088;-0.00021188947721384;1.9722152501345e-05;-0.00018149612878915;-1.6085898096208e-05;0.00013637018855661;5.2653227612609e-05;0.00063946639420465;0.00070018193218857;-0.00013516056060325;-0.0004261328431312;-0.0021890262141824;0.001154875382781;-0.0006043070461601;0.00039932801155373;-1.6022026102291e-05;0.00024749973090366;-5.2686926210299e-05;0.00012181349302409;3.1144867534749e-05;-5.2848175982945e-05;-3.3349929253745e-06;1.1908064152522e-05;0.00013413043052424;9.8446769698057e-05;-0.00033305829856545;-0.00026962748961523;-9.223229426425e-06;0.00043584330705926;0.00019150116713718;7.5983174610883e-05;-8.912638440961e-05;-9.0320863819215e-05;8.706416701898e-05;0.0001392107369611;-6.0154156926728e-06;-8.4038285422139e-05;-1.3470967132889e-05;0.00017510533507448;-0.0013703469885513;-0.00022661998809781;-0.00016803029575385;0.00093902909429744;0.00051448633894324;6.848486373201e-05;9.4612070824951e-05;-3.5878154449165e-05;-0.00017689514788799;3.6639099562308e-05;-7.472080142179e-06;-8.8708795374259e-05;-3.0277315090643e-05;7.8191864304245e-05;-1.1682082003972e-05;-0.0001645387528697;-0.00013038988981862;-0.0020299276802689;-0.00032044280669652;-0.0012658048653975;-0.00036589452065527;0.00016292836517096;1.0219719115412e-05;-0.00038580413092859;5.7628935792309e-06;-0.00040601807995699;-9.0740097220987e-05;0.00010166301944992;6.5468084358145e-05;-7.3501672886778e-05;-0.0014665658818558;-9.8856653494295e-05;0.00065121008083224;0.00053370994282886;0.0026090652681887;0.00042626660433598;0.0010043444344774;9.547366789775e-05;0.00076779321534559;0.00020058122754563;0.00019933038856834;2.669530294952e-05;-9.1495654487517e-05;-3.7041208997834e-05;8.7725061348465e-07;3.1846055208007e-05;-0.00014298854512163;-3.6720241041621e-05;0.00027562334435061;-0.00069437961792573;0.00041122522088699;-0.00026454767794348;2.6907187020697e-06;6.4157931774389e-05;0.00013185539864935;-0.00010619553358993;0.00015000822895672;6.0538013713085e-06;-7.7842742030043e-05;1.9093522496405e-05;-6.9139969127718e-05;-0.00085160951130092;-0.00052570237312466;0.00047462157090195;0.00022386678028852;-0.00033724069362506;0.0015172770945355;-0.00022964940581005;0.00025086317327805;-0.00018852093489841;3.621646828833e-05;-9.0146619186271e-05;1.9963586964877e-05;2.7891332138097e-05;-2.9447597626131e-05;3.8252942431427e-06;-2.2013329726178e-05;0.00010082277731271;0.00010553383617662;1.7020885934471e-05;0.00014072874910198;0.00025384221225977;-9.5251643870142e-06;-1.1673835615511e-05;0.00010460792691447;-5.2078572480241e-05;1.3668472092832e-05;7.5054973422084e-05;5.2637296903413e-05;-2.190484701714e-05;2.8038350592396e-06;4.3087322410429e-05;0.00050444982480258;-0.00041374753345735;-0.00029270327650011;-0.0002972447546199;-4.0423488826491e-05;4.5820572267985e-05;2.4882863726816e-05;-0.0001095412808354;-0.00013209260941949;-3.7044061173219e-05;-3.0054616217967e-06;1.1206532690267e-05;-1.2333748600213e-05;-4.4661435822491e-05;-6.7230353124614e-06;4.9499081796966e-05;-0.00013132969615981;-6.2238730606623e-05;-1.6975767721306e-05;-0.0014184295432642;0.0001168181115645;-0.0010094394674525;-2.1946874767309e-05;0.0002124301972799;6.077666694182e-05;-0.00025564740644768;4.7351000830531e-05;-0.00022424021153711;-1.6133049939526e-05;7.9087432823144e-05;-6.3415660406463e-05;-0.0011364506790414;-0.00036101834848523;0.00048313313163817;0.00038681348087266;-5.6121348279703e-06;0.0022593825124204;-5.6712513469392e-05;0.00061612395802513;-2.8459809982451e-05;0.00050310598453507;-3.4920118196169e-05;0.0001407037343597;-4.3268009903841e-06;-0.00010120525257662;9.723500625114e-06;3.0446784876403e-05;-0.00017824601673055;-4.2168045183644e-05;0.00018360702961218;-0.00069191679358482;0.00042278657201678;-0.0001985075941775;2.3377977413475e-05;5.5744825658621e-05;0.00012506556231529;-9.5470197265968e-05;0.00016263109864667;3.1644623959437e-05;-9.0410532720853e-05;7.5764610301121e-06;-8.0966972745955e-05;-0.0010213408386335;-0.00066255388082936;0.00057408836437389;0.00026417200569995;-0.00016655729268678;0.0015871799550951;-0.00019885084475391;0.00023154313385021;-0.00019611933385022;-1.1887494792973e-06;-9.6259005658794e-05;6.8324188760016e-06;2.8534521334223e-05;-2.4398816094617e-05;5.729691565648e-06;-2.8588305212907e-05;9.8609627457336e-05;0.00011668351362459;2.5405834094272e-05;0.0001765400666045;0.00027276313630864;-0.00010311525693396;-2.6815225282917e-05;0.00013321882579476;-5.4223077313509e-05;2.5015688152052e-05;7.9527198977303e-05;4.9152069550473e-05;-2.0666762793553e-05;1.8097112842952e-05;5.390557271312e-05;0.00049495766870677;-0.00038592764758505;-0.00029563999851234;-0.00032605289015919;-6.9920351961628e-05;9.1585112386383e-05;2.7495547328726e-05;-0.0001421347114956;-0.0001423620415153;-1.4448850379267e-05;-4.5062147364661e-06;1.7580247003934e-05;-1.2459139725252e-05;-5.9406491345726e-05;-7.9622177509009e-06;6.3763523939997e-05;-0.00017965769802686;-8.593325765105e-05;6.8516361352522e-05;-0.0017409519059584;0.00022788599017076;-0.001207223511301;-3.2072410249384e-05;0.00026320799952373;0.0001026754398481;-0.00030831893673167;9.1655369033106e-05;-0.00025782387820072;-3.080833266722e-05;8.9281777036376e-05;-9.4882678240538e-05;-0.0014833033783361;-0.0004919110215269;0.00065209297463298;0.00051827117567882;-8.8615968707018e-05;0.0028265174478292;-0.0001277300179936;0.00074545392999426;-8.815716864774e-05;0.0005923142307438;-6.1326936702244e-05;0.00016427504306193;1.5139041806833e-06;-0.00012074581172783;1.7656417185208e-05;1.8262149751536e-05;-0.00017283075430896;-3.1229461455951e-05;3.9223108615261e-05;-0.00048316441825591;0.00033884399454109;-4.0494083805243e-05;4.4705095206155e-05;2.1781514078612e-05;8.7010943389032e-05;-5.2092898840783e-05;0.00013497614418156;5.654558117385e-05;-8.683062333148e-05;-1.2971460819244e-05;-6.6600296122488e-05;-0.0009207206312567;-0.00065862160408869;0.00053464062511921;0.00021141892648302;3.7079913454363e-05;0.0012475684052333;-0.00011531154450495;0.00013648413005285;-0.00015119698946364;-5.8139030443272e-05;-7.9769721196499e-05;-1.4447779904003e-05;2.3622913431609e-05;-5.3985977501725e-06;8.0706777225714e-06;-3.1551327992929e-05;6.9763576902915e-05;0.00011134043597849;3.9628095692024e-05;0.00018402302521281;0.00024149841920007;-0.00023961112310644;-4.1960603994085e-05;0.00014943635324016;-4.082607847522e-05;3.3015359804267e-05;7.1350448706653e-05;3.0191869882401e-05;-1.2174626135675e-05;4.3055759306299e-05;4.9276146455668e-05;0.00035872281296179;-0.00027583612245508;-0.00021542063041124;-0.00029568662284873;-0.00010172092152061;0.00017340708291158;1.4844924407953e-05;-0.00015728075231891;-0.00012850905477535;2.6297353542759e-05;-6.7412283897283e-06;2.6654799512471e-05;-1.1509094292705e-05;-7.1748960181139e-05;-4.7731182348798e-06;6.4785373979248e-05;-0.00020523113198578;-9.1579437139444e-05;0.00010212628694717;-0.0017205908661708;0.00028175569605082;-0.0011569177731872;-2.5780746000237e-05;0.00025223617558368;0.00012152019917266;-0.00029667039052583;0.00011511181219248;-0.00022860428725835;-4.4145323045086e-05;8.5207881056704e-05;-0.00010925510287052;-0.0015910684596747;-0.00055386713938788;0.00072728091618046;0.00054958340479061;-0.00010428903624415;0.0028819120489061;-0.00015969660307746;0.00072005024412647;-0.00011944521247642;0.0005437609506771;-7.5666677730624e-05;0.00015036195691209;7.8745524660917e-06;-0.00011598625860643;-6.1015962273814e-05;2.9689770599362e-05;3.2429496059194e-05;9.7042269771919e-05;0.0010632026242092;-0.00068922067293897;0.00032748770900071;-0.00067454040981829;-7.4348092311993e-05;3.2995241781464e-05;0.00024209862749558;-0.00019524864910636;4.2835417843889e-05;-0.00015504658222198;-3.2148400350707e-05;0.00011544051812962;3.8921280065551e-05;0.00045795764890499;0.0004900082712993;-8.1223792221863e-05;-0.00032817487954162;-0.0019498794572428;0.0012284296099097;-0.0005335352034308;0.00038011086871848;-5.7780529459706e-05;0.00021974643459544;-6.0464815760497e-05;0.00010705964814406;3.6274101148592e-05;-4.910206553177e-05;-4.2994224713766e-06;5.8348191487312e-06;0.00013700415729545;0.00011470057506813;-0.00015316702774726;-0.0001526396808913;9.7571370133664e-05;0.00037863894249313;0.00013538764324039;6.3712148403283e-05;-6.2518811319023e-05;-7.3073599196505e-05;9.5450064691249e-05;0.00011560731945792;-7.7270524343476e-06;-6.4741565438453e-05;-9.4617571448907e-06;0.00040468815132044;-0.0011155643733218;-0.00027810377650894;-0.00024105978081934;0.00055762106785551;0.00031346754985861;1.0179001947108e-05;5.215612691245e-05;-8.8142878666986e-05;-0.00015809794422239;2.0782588762813e-05;-1.8886516954808e-06;-6.6155291278847e-05;-2.6159996195929e-05;5.8190522395307e-05;-8.3852182797273e-06;-0.00011143009032821;-8.0959238403011e-05;-0.001630507176742;-0.000363189203199;-0.0010218559764326;-0.00036873601493426;0.00013512256555259;1.7219217625097e-05;-0.0003161113418173;-2.7146357751917e-05;-0.00032967928564176;-9.4310846179724e-05;8.1565587606747e-05;6.2937637267169e-05;-3.7346810131567e-05;-0.0010601973626763;-9.5177216280717e-05;0.00045083439908922;0.00035138017847203;0.0020571642089635;0.00046919623855501;0.00081108993617818;0.00013590835442301;0.00062765396432951;0.00020112552738283;0.00016545406833757;3.8775931898272e-05;-7.7957934990991e-05;-4.062830703333e-05;-6.4007490436779e-06;3.8332291296683e-05;-0.00014538953837473;-3.6016517697135e-05;0.0004282777372282;-0.0008355465834029;0.00050190911861137;-0.00038675434188917;-1.5990621250239e-05;8.3949853433296e-05;0.00017046942957677;-0.00013503486115951;0.00016954806051217;-9.9862481874879e-06;-8.8506494648755e-05;3.841714351438e-05;-7.1590118750464e-05;-0.00088676030281931;-0.00051690329564735;0.00050162442494184;0.00021852442296222;-0.00061748409643769;0.0018298133509234;-0.00031290418701246;0.00031265479628928;-0.00021496278350241;6.3488558225799e-05;-0.00010574179032119;3.4227421565447e-05;3.5075889172731e-05;-4.0339935367228e-05;2.8494314392447e-06;-2.343233609281e-05;0.00013772172678728;0.00013162165123504;4.3174994061701e-05;0.00019269240146969;0.00030160608002916;7.3240822530352e-05;-3.8129103359097e-06;0.00010294194362359;-6.0285572544672e-05;1.3437414054351e-05;9.0346627985127e-05;7.1462316554971e-05;-2.2884350983077e-05;-1.74429976596e-06;3.8875979953445e-05;0.00070824573049322;-0.00052878499263898;-0.00038489658618346;-0.00037025500205345;-6.2746032199357e-05;-3.9641938201385e-05;1.3345548723009e-05;-0.00013178341032472;-0.00016091382713057;-7.6025280577596e-05;-1.1686761354213e-06;9.2428708740044e-06;-1.6834326743265e-05;-4.559594890452e-05;-5.5165155572467e-06;4.9103509809356e-05;-0.00012183890794404;-5.2730476454599e-05;-0.00014243808982428;-0.0015149848768488;3.2709565857658e-05;-0.0011000393424183;-1.4455891687248e-05;0.00022044453362469;2.931847848231e-05;-0.00027765647973865;1.6565469195484e-05;-0.00024836143711582;-7.344971436396e-06;9.3625683803111e-05;-4.8946345486911e-05;-0.0011198734864593;-0.00036074410309084;0.00045485404552892;0.00035700126318261;0.00011884587729583;0.0023738190066069;1.3342375495995e-05;0.00066438788780943;2.725253762037e-05;0.00054976489627734;-1.736162994348e-05;0.0001561565004522;-1.2459099707485e-05;-0.00011243986227782;7.7322119977907e-06;3.1907693482935e-05;-0.0001799575984478;-4.1924657125492e-05;0.00023267953656614;-0.00072861078660935;0.00044488182174973;-0.00026014450122602;1.373785562464e-05;6.7142202169634e-05;0.00013710504572373;-0.0001025649253279;0.00016764915199019;2.4922099328251e-05;-9.0566616563592e-05;1.9086075553787e-05;-8.2976876001339e-05;-0.0010412458796054;-0.00064070394728333;0.00058552721748129;0.00026689376682043;-0.00025196719798259;0.0016812591347843;-0.0002251009864267;0.00024491947260685;-0.00020450320153031;1.3766511074209e-05;-0.00010049317643279;1.3302738807397e-05;3.0216964660212e-05;-3.1969109841157e-05;3.5952948564955e-06;-2.9500433811336e-05;0.00011960681149503;0.00012442481238395;4.8017147491919e-05;0.00023694447008893;0.00027553076506592;-3.6576373531716e-05;-2.3907552531455e-05;0.00011825841647806;-5.7125609600917e-05;3.1740299164085e-05;7.8635690442752e-05;6.0595692048082e-05;-1.9440771211521e-05;1.4005781849846e-05;5.8039626310347e-05;0.000620836566668;-0.00038051937008277;-0.00035753691918217;-0.00036358277429827;-0.00010015584848588;-3.3534368412802e-05;2.1410956833279e-05;-0.00016320573922712;-0.00014576157263946;-4.4366031943355e-05;-1.6229658967859e-06;1.1804743735411e-05;-1.2740062629746e-05;-5.3870699048275e-05;-8.6204672697932e-06;6.234194006538e-05;-0.00016689342737664;-7.8703713370487e-05;4.5323031372391e-05;-0.001741464366205;0.00021421462588478;-0.001214413321577;-3.2879677746678e-05;0.00026684513431974;9.1425630671438e-05;-0.00031144262175076;8.4624050941784e-05;-0.00026191535289399;-2.7826228688355e-05;9.0018816990778e-05;-8.5238971223589e-05;-0.0014202373567969;-0.00048955663805827;0.00061087385984138;0.00048895372310653;-7.1728114562575e-05;0.0028064507059753;-0.00010887140524574;0.00074927910463884;-7.892041321611e-05;0.00060030026361346;-5.5641823564656e-05;0.00016761277220212;-9.1667271817641e-07;-0.00012299312220421;1.3537086488213e-05;2.1174704670557e-05;-0.00016426996444352;-3.2640360586811e-05;9.6146490250248e-05;-0.00052304606651887;0.00034061435144395;-0.00013105249672662;2.8382855816744e-05;4.0110586269293e-05;9.6523064712528e-05;-6.3822233641986e-05;0.00013394861889537;4.2522045987425e-05;-7.8957898949739e-05;4.7107369027799e-06;-6.9168403570075e-05;-0.00090660515706986;-0.0005887764855288;0.00051858311053365;0.00022018639720045;-5.3151219617575e-05;0.0012995612341911;-0.00014118824037723;0.00015732458268758;-0.00015558226732537;-2.7642132408801e-05;-7.9800505773164e-05;-2.6181364773947e-06;2.3418358978233e-05;-1.8422661014483e-05;4.5884135033702e-06;-2.8532447686302e-05;8.8399014202878e-05;0.00010560486407485;4.6179662604118e-05;0.00022094754967839;0.0002219059097115;-0.00011332873691572;-3.1482199119637e-05;0.00011436270870036;-4.4329375668894e-05;3.5470959119266e-05;6.2776482081972e-05;4.3452615500428e-05;-1.2298833098612e-05;2.6831938157557e-05;5.2066381613258e-05;0.00046472941176035;-0.00025946789537556;-0.00027135937125422;-0.00030349459848367;-0.00010412398114568;8.8457300080336e-06;1.6297501133522e-05;-0.00015752173203509;-0.00011837740021292;-1.5691892258474e-05;-2.1818407276442e-06;1.4824056961515e-05;-1.0222391210846e-05;-5.4870481108082e-05;-6.5232234192081e-06;5.8973866543965e-05;-0.00017042848048732;-7.9449091572315e-05;9.154364670394e-05;-0.0015903069870546;0.00025072414427996;-0.0010850125690922;-3.1189934816211e-05;0.00024342944379896;0.00010265562013956;-0.00027909039636143;0.00010039139306173;-0.00022337898553815;-3.4111893910449e-05;7.7876917202957e-05;-9.2108006356284e-05;-0.0013838462764397;-0.0004892093129456;0.00061496574198827;0.00048305731615983;-0.00010459600161994;0.0026143179275095;-0.00013638500240631;0.00067366065923125;-0.00010650479089236;0.00052496086573228;-6.4001033024397e-05;0.00014563287550118;4.0206682569988e-06;-0.00011006907880073;-6.6273023549002e-05;5.6024382502073e-05;9.51670226641e-05;-7.1421505708713e-05;0.0011738177854568;-0.0011543832952157;0.00083069415995851;-0.00094622559845448;-0.00014724701759405;0.00015587048255838;0.00023292540572584;-0.00020054771448486;0.00016060878988355;-0.00016389387019444;-0.00011019198427675;0.00012624052760657;1.3270461749926e-05;-4.4119868107373e-05;1.2799443538825e-05;-0.00013275003584567;0.00010035606828751;-0.0020996076054871;0.0022225021384656;-0.0005571250221692;0.00049623113591224;-0.00027735985349864;0.00030086890910752;-0.00011234984413022;0.00010863719217014;7.3319984949194e-05;-7.583771366626e-05;-9.6119601948885e-06;-1.4498776181426e-05;0.00021751006715931;0.0002105497114826;0.0005285581573844;0.00047483298112638;0.00050855055451393;0.00051600817823783;-2.3071357645676e-05;-9.0263702077209e-06;3.5057797504123e-05;1.5770408936078e-05;0.00014115904923528;0.00010619570093695;-3.3787546271924e-05;-5.1548795454437e-05;-3.7138350307941e-05;0.0018041104776785;-0.00034754144144244;-0.00062862585764378;-0.00062088028062135;-0.00090086943237111;-0.00092493189731613;-0.00025277235545218;-0.00019883728236891;-0.00026114194770344;-0.00021086043852847;-3.2639181881677e-05;-1.445881480322e-05;5.6610847423144e-06;8.277956112579e-06;-6.7566393227025e-06;-1.8540597011452e-05;0.00018414130317979;0.00019443963537924;-0.00069637777050957;-0.00046953934361227;-0.00037685054121539;-0.00035814606235363;6.7287874117028e-05;6.5714819356799e-05;-0.00022710343182553;-0.00017085026775021;-0.0001848730025813;-0.00014149400522001;1.4352348443936e-05;3.5169112379663e-05;0.00019467192760203;0.0011822029482573;-0.00012004069139948;-0.00066844333196059;-0.00068903475767002;0.00044097215868533;0.00026894963230006;0.00045335188042372;0.00030843575950712;0.00033388109295629;0.00026518941740505;0.00011878802615684;0.00010490739077795;-4.6968652895885e-05;-5.7436183851678e-05;-5.5176227760967e-05;5.0790749810403e-05;5.1656763389474e-05;-5.5957927543204e-05;0.0010365198832005;-0.0010573074687272;0.00074247387237847;-0.00084174366202205;-0.00012492868700065;0.00013954285532236;0.00022340382565744;-0.00018659504712559;0.0001541790261399;-0.00013445851800498;-0.00010077587648993;0.00011492839985294;-2.2213021111384e-06;-0.00016704089648556;-4.0989682020154e-05;-1.3418360140349e-05;9.459414286539e-05;-0.0018509534420446;0.0021073240786791;-0.00051617057761177;0.00045046111335978;-0.00024776792270131;0.00024777901126072;-0.00010789619409479;9.5636685728095e-05;6.3477004005108e-05;-6.9365582021419e-05;-7.3876390160876e-06;-1.3587314242614e-05;0.00020818290067837;0.00018922379240394;0.00041158983367495;0.00040370336500928;0.0004472499131225;0.00045656898873858;-9.9554044936667e-06;4.6246195779531e-06;1.0840190043382e-05;1.147245438915e-05;0.0001275770337088;0.00010081604705192;-2.7371308533475e-05;-4.2720716010081e-05;-3.1766980100656e-05;0.0015664896927774;-0.0004220116243232;-0.0005786397960037;-0.00054641929455101;-0.00067839154507965;-0.00074659293750301;-0.00019355624681339;-0.0001759316510288;-0.00023520462855231;-0.00019356208213139;-2.2056638044887e-05;-1.0641123481037e-05;-2.5682145405881e-06;2.6301986366661e-08;-4.5858409976063e-06;-8.5070278146304e-06;0.00013293340452947;0.00014397589256987;-0.00063489243621007;-0.00058780208928511;-0.00035178833059035;-0.00046023001777939;5.4938653192949e-05;7.7250020694919e-05;-0.00019150754087605;-0.00017245621711481;-0.00016016849258449;-0.00014993372315075;1.8850958440453e-05;4.9695383495418e-05;0.00014912542246748;0.00076546799391508;-0.00012237933697179;-0.0004706320760306;-0.00049098790623248;0.00044847041135654;0.00054760812781751;0.00039321271469817;0.00033587918733247;0.00029683782486245;0.00029240918229334;0.00010118137288373;0.00010624370770529;-4.3945576180704e-05;-6.426362961065e-05;-5.1752205763478e-05;3.9025107980706e-05;0.00012974670971744;-8.3482700574677e-05;0.00080870813690126;-0.0007659430266358;0.00059317448176444;-0.00065453228307888;-0.00011274998541921;0.00011207152419956;0.00012626170064323;-0.00011786624236265;9.8205171525478e-05;-0.00012610979320016;-7.70680126152e-05;8.1915946793742e-05;2.9669583454961e-05;0.00012352819612715;4.5936616515974e-05;-0.00027585521456786;0.0001140237072832;-0.0014438877115026;0.0013746353797615;-0.00033988468931057;0.00032493975595571;-0.00020044761186;0.00023582403082401;-6.5482840000186e-05;7.2215996624436e-05;5.4675536375726e-05;-4.9495189159643e-05;-6.9512288973783e-06;-9.6604935606592e-06;0.00012211690773256;0.00014085683505982;0.0004919123603031;0.00039975810796022;0.00038227785262279;0.00035968009615317;-4.5468037569663e-05;-3.2250223739538e-05;6.4961554016918e-05;2.4667086108821e-05;9.3524111434817e-05;6.0024889535271e-05;-3.0849845643388e-05;-3.810601629084e-05;-3.8669706555083e-05;0.0013682773569599;1.2307338693063e-05;-0.00039478571852669;-0.00043705094140023;-0.00091715797316283;-0.00084763421909884;-0.00023899375810288;-0.00015896806144156;-0.0001792631810531;-0.00013419755850919;-3.8285434129648e-05;-1.5029927453725e-05;2.2894124413142e-05;2.0063765987288e-05;-1.2881926522823e-05;-2.61016539298e-05;0.0002026955189649;0.00020583980949596;-0.00035224415478297;-5.9542508097365e-05;-0.00016098521882668;-1.9369346773601e-05;4.4827938836534e-05;1.9083590814262e-05;-0.00016101606888697;-9.7433257906232e-05;-0.00011815585457953;-6.306578143267e-05;-7.7173162935651e-06;-7.8724042396061e-06;0.00019165956473444;0.0014981615822762;-5.101567148813e-05;-0.00076344097033143;-0.0007683226140216;3.1991388823371e-05;-0.00033277232432738;0.00028710815240629;0.0001285007892875;0.00019799520669039;9.8109034297522e-05;8.2202554040123e-05;5.7113727962133e-05;-2.3904784029583e-05;-1.9447110389592e-05;-7.8727833169978e-05;6.2093182350509e-05;0.00020263940677978;-0.0001497533521615;0.0012186607345939;-0.0011819670908153;0.00089025811757892;-0.00099107576534152;-0.0001654135849094;0.00017054368800018;0.00019139448704664;-0.00017275389109273;0.00015535835700575;-0.000183782496606;-0.00011553927470231;0.00012467066699173;3.607289181673e-05;9.4160299340729e-05;3.6644007195719e-05;-0.00040654710028321;0.00023827677068766;-0.0021456265822053;0.0021488391794264;-0.00052148808026686;0.00049112108536065;-0.00030431922641583;0.00034732912899926;-9.9431759736035e-05;0.00010433176066726;7.8352750279009e-05;-7.4320611020084e-05;-5.6196099649242e-06;-1.2106802387279e-05;0.00017185496108141;0.00019311436335556;0.00066621165024117;0.0005814537871629;0.00055802275892347;0.00054715201258659;-6.1936341808178e-05;-4.5991346269147e-05;8.6846317572054e-05;4.2171948734904e-05;0.00013279421546031;9.2389753262978e-05;-4.8748239350971e-05;-5.9301775763743e-05;-8.0929014075082e-05;0.0019700659904629;-2.6043569960166e-05;-0.00053516641492024;-0.00058823806466535;-0.0012890226207674;-0.001251392881386;-0.00032924782135524;-0.0002406317362329;-0.00025105703389272;-0.00019993173191324;-5.4518324759556e-05;-2.5353374439874e-05;3.3299435017398e-05;2.9859622372896e-05;-2.1458536139107e-05;-3.6455607187236e-05;0.00031090321135707;0.00031213698093779;-0.00047641957644373;-0.00014811774599366;-0.0002127797488356;-8.3430917584337e-05;5.5810713092797e-05;3.6503286537481e-05;-0.00023194633831736;-0.00015811427147128;-0.00016913353465497;-0.00010815465066116;-1.2035508007102e-05;-6.5916033236135e-06;0.00028646242571995;0.0023151021450758;-5.1980608986923e-05;-0.0011718409368768;-0.001169195631519;-5.0239068514202e-05;-0.00043624857789837;0.00040420590084977;0.00021927134366706;0.00028269441099837;0.00017628252680879;0.00011841566447401;9.3054732133169e-05;-3.3255419111811e-05;-3.3445041481173e-05;-9.2356647655834e-05;7.2163413278759e-05;0.0003695570921991;-0.00030926364706829;0.0011353031732142;-0.001122584566474;0.00080924166832119;-0.00088656065054238;-0.00015388161409646;0.00016274386143778;0.00010273446969222;-9.5387702458538e-05;0.0001354409760097;-0.000174040265847;-9.5224764663726e-05;9.4913906650618e-05;5.2318151574582e-05;0.00013099006901029;1.2990263712709e-05;-0.00079493410885334;0.00057318876497447;-0.0018311646999791;0.001835961593315;-0.00042054883670062;0.00042475672671571;-0.00030097350827418;0.00034931980189867;-6.1249520513229e-05;6.8896340962965e-05;6.0446953284554e-05;-5.2796673116973e-05;1.8531141904532e-05;3.074734877373e-06;6.6955481088371e-06;6.8682857090607e-05;0.00047358666779473;0.00048413666081615;0.0004783549811691;0.0004825000942219;-7.8814722655807e-05;-7.1634152845945e-05;0.00011746768723242;7.4481082265265e-05;7.5993302743882e-05;5.7842502428684e-05;-7.5263880717102e-05;-6.8059380282648e-05;-0.00019616993085947;0.0014497854281217;0.00023110935580917;-5.0288970669499e-05;-0.00019866735965479;-0.0012662009103224;-0.0012624728260562;-0.00027627297095023;-0.00022513722069561;-0.00012852266081609;-0.00012674908793997;-7.1559719799552e-05;-4.148127118242e-05;6.3701598264743e-05;5.1351493311813e-05;-3.8356523873517e-05;-4.9487960495753e-05;0.00043381037539802;0.0004259557754267;-3.0655559385195e-05;0.00021143308549654;7.9445795563515e-05;0.00019970315042883;6.0887787185493e-06;-2.405327904853e-06;-0.00018349310266785;-0.00013509018754121;-0.00012003332813038;-7.881684723543e-05;-4.9358106480213e-05;-5.270945985103e-05;0.00035244188620709;0.0036560238804668;0.00015244793030433;-0.0016984742833301;-0.0016657316591591;-0.00091871898621321;-0.0012690076837316;0.00023714292910881;0.00011202717723791;0.00016663392307237;9.2099500761833e-05;9.0300054580439e-05;7.5272699177731e-05;6.1918689198137e-07;8.9300834815731e-07;-0.00012761079415213;9.7971998911817e-05;0.00065183581318706;-0.00056605244753882;0.0012150106485933;-0.0012103508925065;0.00077495945151895;-0.00082468200707808;-0.00015572240226902;0.00016650858742651;2.4894786747609e-06;-1.0025617484644e-05;0.00012539530871436;-0.00018906843615696;-6.5796615672298e-05;5.1439765229588e-05;8.8327447883785e-05;0.00024838652461767;3.4865900033765e-06;-0.0014635181287304;0.0010965445544571;-0.001645696000196;0.0015888274647295;-0.00035792429116555;0.00040947800152935;-0.00034340654383413;0.00040852770325728;-1.4446276509261e-05;2.8952530556126e-05;3.8796311855549e-05;-2.2637717847829e-05;5.8231402363162e-05;2.6969817554345e-05;-0.0002565739559941;-0.00011441989045125;0.00013793453399558;0.00028618020587601;0.00039629777893424;0.00040913705015555;-9.0822744823527e-05;-9.4882547273301e-05;0.00016111833974719;0.00011294265277684;3.6506130527414e-06;1.5580933904857e-05;-0.00012636987958103;-8.9820066932589e-05;-0.00036876410013065;0.00065426621586084;0.00045969517668709;0.00070484500611201;0.00037383104790933;-0.0011626825435087;-0.0011716762091964;-0.00018342371913604;-0.00018267253472004;4.5626118662767e-05;-2.4466073227813e-05;-0.00010171362373512;-6.5456857555546e-05;0.0001076374828699;7.9800374805927e-05;-5.618706200039e-05;-6.9222798629198e-05;0.00059766002232209;0.00059612758923322;0.00044507096754387;0.00067442131694406;0.00041436671745032;0.00057063024723902;-5.2866667829221e-05;-5.7849512813846e-05;-0.00014421895320993;-0.00011562879080884;-9.2281625256874e-05;-5.796334517072e-05;-0.00010569185542408;-0.00011769839329645;0.00044749552034773;0.0056107817217708;0.00045758919441141;-0.0024365137796849;-0.0023998946417123;-0.0020417645573616;-0.0024549511726946;8.7117572547868e-05;-7.243371783261e-06;7.9533223470207e-05;8.0621848610463e-06;6.5465152147226e-05;5.8524070482235e-05;4.8120426072273e-05;4.9010825023288e-05;-0.00011603604070842;9.5233241154347e-05;0.00062913971487433;-0.00057300803018734;0.00109308201354;-0.0011041455436498;0.00065711117349565;-0.00073475367389619;-0.00013265987217892;0.00015179222100414;-1.2544479432108e-05;1.7288853996433e-05;0.00013053732982371;-0.00015562707267236;-4.1031860746443e-05;4.3835127144121e-05;4.5811295422027e-05;3.1526516977465e-05;-3.4460783354007e-05;-0.0013534757308662;0.0011911598267034;-0.0013239027466625;0.0014519356191158;-0.00033245742088184;0.00033965028706007;-0.00033151655225083;0.00036094899405725;-6.4682626543799e-06;1.239801531483e-05;1.966544186871e-05;-1.9027584130527e-05;5.5639902711846e-05;3.3028663892765e-05;-0.00025465156068094;-0.00018218471086584;3.6473276850302e-05;0.00019452738342807;0.0002945787855424;0.00037631965824403;-7.6986012572888e-05;-9.1788831923623e-05;0.00013863145431969;0.00012003964366158;-1.5454870663234e-05;2.0646862139984e-06;-0.00011016167263733;-9.6315699920524e-05;-0.0003572326968424;0.00037778826663271;0.00044171130866744;0.00071988074341789;0.0005440060631372;-0.000911483715754;-0.0010667332680896;-0.00012939270527568;-0.0001500409853179;7.721949077677e-05;7.970192200446e-06;-8.7754669948481e-05;-7.0129841333255e-05;9.6108706202358e-05;8.4323022747412e-05;-6.0488302551676e-05;-5.5494667321909e-05;0.00058845325838774;0.00052020419389009;0.00056945928372443;0.00059080478968099;0.00047107873251662;0.00052813976071775;-7.0651971327607e-05;-4.9024161853595e-05;-0.00011411395098548;-0.0001005312151392;-6.1248822021298e-05;-6.1287071730476e-05;-0.00010074979945784;-0.00012123924534535;0.00040767990867607;0.0053354501724243;0.00046800143900327;-0.0023514039348811;-0.0021824270952493;-0.0021067610941827;-0.0023128348402679;1.2022680493828e-05;3.8838043110445e-06;1.9965196770499e-05;2.9346783776418e-05;4.9936723371502e-05;4.8793626774568e-05;5.173295721761e-05;5.3303036111174e-05;-3.7932873965474e-05;2.8706551802316e-06;0.00024125014897436;-0.00017394599854015;-0.00036983087193221;-5.1081511628581e-05;0.00010748147178674;8.436969073955e-05;1.0252480933559e-05;-2.2110130885267e-05;-0.00016698580293451;4.5424796553561e-05;-0.00022059066395741;-7.1027825470082e-05;-0.00015279860235751;-3.6223256756784e-05;0.00024017180840019;0.0011085143778473;6.2526218243875e-05;-0.00088246737141162;-6.1917031416669e-05;-0.00027575684362091;-0.00043198096682318;0.00042326169204898;8.7734013504814e-05;0.00030410123872571;7.015864684945e-05;6.3604129536543e-05;-1.5544517736998e-05;7.8243683674373e-05;4.0229206206277e-05;9.2405265604611e-05;6.8106951403024e-06;-0.00045975399552844;0.00010989501606673;-0.00046693949843757;-8.1854283052962e-05;0.00021489259961527;-0.00020177735132165;-4.4763597543351e-05;-3.7872937355132e-06;8.6036838183645e-05;-3.3956777770072e-05;-6.5368934883736e-05;9.3117620281191e-08;-0.00016301071445923;5.0900136557175e-05;-0.00041443965164945;-0.00064943276811391;0.00022706236632075;0.0014928093878552;0.00013835931895301;-0.00049592001596466;0.00033030079794116;6.4735912019387e-05;-2.9442640880006e-05;0.00023902728571557;3.7849320506211e-05;-7.7613578469027e-05;1.9208715457353e-05;0.00010441371705383;-2.673933886399e-05;4.7990401071729e-05;-6.6467313445173e-05;-6.0484304412967e-05;0.00046995512093417;-0.00010053927690024;0.00076071836519986;7.4434974521864e-05;0.00046094003482722;2.2302472643787e-05;-8.6924970673863e-05;4.5618373405887e-05;-2.8459235181799e-05;8.4918574430048e-06;8.6278683738783e-05;-7.4604380642995e-05;-2.2749665731681e-05;1.2777460142388e-05;0.0019977132324129;0.00021152777480893;-0.00019381851598155;-0.0012473969254643;-0.00061584037030116;-0.0013520433567464;-3.2829950214364e-05;-0.00023596732353326;0.00011507240560604;-0.00021288133575581;-3.1391595257446e-05;9.2138934633113e-06;2.5728224500199e-05;1.3635130926559e-05;-8.7330539827235e-05;3.1567797122989e-05;0.0004955044714734;-0.00035154647775926;8.6356041720137e-05;-0.00030743575189263;0.0002714529982768;-2.6688669095165e-05;-3.9657988963882e-05;9.786775081011e-06;-0.00018781410472002;6.0239926824579e-05;-0.00018365010328125;-0.00012799621617887;-0.00012352158955764;-5.6651810155017e-05;0.00030976999551058;0.0014018613146618;0.00011952880595345;-0.0015306788263842;0.00022383844770957;-0.00069077924126759;-0.00031516820308752;0.00031149314600043;0.0001862754143076;0.00014890449529048;0.00018638075562194;7.8657474659849e-05;-1.9195218555978e-05;7.1473652496934e-05;5.5023210734362e-05;0.00011867783905473;1.603843884368e-05;-0.00062415259890258;3.5100918466924e-05;-0.00056085106916726;-0.00012592629354913;0.00025671214098111;-0.0001818134333007;-5.6684792070882e-05;-1.7684611520963e-05;0.00014027219731361;-9.581748599885e-06;-8.2175385614391e-05;-9.1970714493073e-06;-0.00020506653527264;3.4589960705489e-05;-0.00050211703637615;-0.00086110871052369;0.00031219318043441;0.0018695096950978;0.00035476181074046;-0.00059847853844985;0.00027904997114092;6.8738299887627e-05;-2.9697159334319e-05;0.00029714874108322;6.3654770201538e-05;-0.00011297889432171;2.9792333862133e-06;0.00013810390373692;-1.0017244676419e-05;3.7677804357372e-05;-9.1459834948182e-05;7.5697811553255e-05;0.00063474237686023;2.8394356377248e-07;0.0010759879369289;0.00021127158834133;0.00070094363763928;3.3671526580292e-06;-0.00012742842955049;4.5532297008322e-06;-3.6400990211405e-05;-4.9623933591647e-05;8.4799365140498e-05;-0.00012434979726095;-5.8776535297511e-05;0.00014050390745979;0.0035561870317906;0.00039685372030362;-0.00083127222023904;-0.0019201776012778;-0.001232234062627;-0.0022026693914086;3.5181041312171e-05;-0.00028882423066534;0.00016594331827946;-0.00025678012752905;-1.590617284819e-05;1.2919838809466e-05;6.0083435528213e-05;3.8906222471269e-05;-0.00013053367729299;7.2556715167593e-05;0.000729066261556;-0.00056801666505635;0.00066448119468987;-0.0007131458260119;0.00045163059257902;-0.00027320469962433;-9.3191418272909e-05;6.8744084273931e-05;-0.00015974730195012;7.0596172008663e-05;-6.469088839367e-05;-0.0001725069450913;-6.8978733906988e-05;-5.3423562349053e-05;0.00027243362274021;0.0011616767151281;0.00010584033589112;-0.0019613057374954;0.00078846298856661;-0.001043796306476;0.00020656835113186;5.4199943406275e-05;0.00028846925124526;-9.51619585976e-05;0.00031990860588849;6.9588859332725e-05;-2.0273726477171e-05;4.3460222514113e-05;5.0293529056944e-05;0.0001196066805278;3.2322994229617e-05;-0.00065713014919311;-0.00012258430069778;-0.00053271546494216;-0.00013674110232387;0.00025476756854914;-3.4835917176679e-05;-6.4908446802292e-05;-4.5879653043812e-05;0.00017166582983918;4.6607277909061e-05;-8.8061693531927e-05;-2.3316126316786e-05;-0.00020650285296142;-1.8818720491254e-05;-0.00052409345516935;-0.00084895349573344;0.00039976491825655;0.0018826532177627;0.00066768802935258;-0.000643192732241;-5.1301958592376e-05;4.7476478357567e-05;-3.6750829167431e-05;0.00030168911325745;9.0138491941616e-05;-0.00012711704766843;-3.1612187740393e-05;0.00014830472355243;3.1830903026275e-05;1.1114921107946e-06;-9.4712115242146e-05;0.00031720206607133;0.00069925573188812;0.00030204319045879;0.0011682768817991;0.00041248259367421;0.0008405894623138;-4.0069200622384e-05;-0.00013686837337445;-4.198028909741e-05;-5.1906223234255e-05;-7.9462450230494e-05;4.1324110497953e-05;-0.00015237930347212;-0.00011039876699215;0.00029294501291588;0.0051816678605974;0.00058031902881339;-0.0017095095245168;-0.0024322331883013;-0.0019995961338282;-0.0028862208127975;3.5209784982726e-05;-0.0002477451635059;0.00013600644888356;-0.00020429129654076;6.1021805777273e-06;1.9746559701161e-05;8.4749095549341e-05;6.8341061705723e-05;-0.00017002905951813;0.00012225270620547;0.00096632546046749;-0.00082623632624745;0.0012811380438507;-0.0012626203242689;0.00069142098072916;-0.00065998593345284;-0.00015073901158758;0.00015116688155103;-0.00011551902571227;7.7287688327488e-05;8.5801460954826e-05;-0.00021424950682558;-2.8825574190705e-05;-2.155190850317e-05;0.00017010794545058;0.00061060045845807;3.5986467992188e-05;-0.0022910465486348;0.0015576088335365;-0.0014462801627815;0.0010984465479851;-0.00025470604305156;0.00040657649515197;-0.00035849533742294;0.00047230286872946;4.6765057049925e-05;-1.650329977565e-05;1.5882151274127e-05;2.7117937861476e-05;0.00011186165647814;5.2898467401974e-05;-0.00062803918262944;-0.00031216206843965;-0.00040421378798783;-8.4013328887522e-05;0.00028077242313884;0.00021977360302117;-8.2825303252321e-05;-9.0302222815808e-05;0.00020278882584535;0.00012597149179783;-8.4140388935339e-05;-3.5915112675866e-05;-0.00019646543660201;-9.7342184744775e-05;-0.00055281462846324;-0.00059204833814874;0.00053815671708435;0.001747639849782;0.0010294404346496;-0.00081118050729856;-0.00066339125623927;-1.4462863873632e-05;-7.3842697020154e-05;0.0002735284215305;0.00011001544771716;-0.00013754326209892;-7.846351218177e-05;0.00015482307935599;9.1495487140492e-05;-4.9669804866426e-05;-8.8102300651371e-05;0.00064287567511201;0.00074317544931546;0.00070166197838262;0.0011329911649227;0.00065249303588644;0.00093551649479195;-9.3030670541339e-05;-0.00012490108201746;-9.9156655778643e-05;-8.4194674855098e-05;-8.923168934416e-05;-2.7492747904034e-05;-0.0001715702819638;-0.00017670533270575;0.00046718478552066;0.0071255993098021;0.00075560074765235;-0.0028211730532348;-0.0029733167029917;-0.0029068603180349;-0.0035552019253373;-4.6520270302608e-07;-0.00014542213466484;7.0706242695451e-05;-8.7068074208219e-05;3.4199769288534e-05;3.3570791856619e-05;9.9895012681372e-05;9.8092408734374e-05;-0.00014763418585062;0.00012111312389607;0.00087585998699069;-0.00079260760685429;0.0012265281984583;-0.0012227890547365;0.00060521339764819;-0.00067581044277176;-0.00013339126599021;0.00015291590534616;-8.4821811469737e-05;8.1300990132149e-05;0.00013739700079896;-0.00017010790179484;2.331294126634e-06;-1.3917056094215e-06;5.3960731747793e-05;7.9248427937273e-05;-3.1175157346297e-05;-0.0019134493777528;0.0016849586972967;-0.0011697221780196;0.0012625327799469;-0.00032495128107257;0.00034084782237187;-0.00039130545337684;0.00042220330215059;3.2144103897735e-05;-2.0899518858641e-05;-8.3520026237238e-06;9.853330993792e-06;8.7001491920091e-05;5.7717497838894e-05;-0.00048969290219247;-0.00038055828190409;-0.00032425747485831;-0.00010667713650037;0.0001872113061836;0.00028492027195171;-6.8164503318258e-05;-9.1750618594233e-05;0.00016442772175651;0.0001421738852514;-7.4230207246728e-05;-4.2266427044524e-05;-0.00014568891492672;-0.00012350268661976;-0.00047427820391022;-0.00051563564920798;0.00048762236838229;0.0013721336144954;0.00112213275861;-0.00060085800942034;-0.00077099353075027;-1.4314051441033e-05;-5.8294695918448e-05;0.00022439890017267;0.00012117842561565;-0.00010850029502762;-8.8760163635015e-05;0.00012151027476648;0.00010599511733744;-6.6961620177608e-05;-5.8496250858298e-05;0.000677929376252;0.00057575665414333;0.00082109705545008;0.00083270971663296;0.00066434050677344;0.00077214615885168;-0.0001086159463739;-8.7953689217102e-05;-9.258023055736e-05;-7.6295160397422e-05;-5.6146403949242e-05;-5.8235997130396e-05;-0.00014216273848433;-0.00017850878066383;0.00042983578168787;0.0065238308161497;0.00069292885018513;-0.0027668334078044;-0.0025221642572433;-0.0027982105966657;-0.0030998312868178;-6.2443868955597e-05;-5.7468063459964e-05;-7.2437651397195e-06;5.078653430246e-06;3.3608659578022e-05;2.8373366149026e-05;8.6672822362743e-05;9.584359213477e-05;-2.0333862266853e-05;4.4902219087817e-05;0.00024939767899923;-0.00028179763467051;0.0001885616366053;-0.00020518229575828;-2.2999722204986e-05;-0.00016985759430099;2.0887457594654e-06;3.1526436941931e-05;-5.2029066864634e-05;9.1035122750327e-05;8.2179249147885e-05;5.2164326916682e-05;4.9275025958195e-05;3.850692519336e-05;-0.00018708882271312;-0.0008022632682696;-9.584853250999e-05;-0.00019048662215937;0.00091458088718355;0.00025335585814901;0.00043997226748616;-0.00011932935740333;-8.7402644567192e-05;-0.0001192748095491;3.5522903090168e-06;2.2363632524502e-05;-4.0999464545166e-05;-4.5270840928424e-05;-2.3297794541577e-05;1.9506229364197e-05;5.4523316066479e-05;-4.7386678488692e-05;-0.00034716396476142;-0.00020930101163685;-0.00035899053909816;-0.00015673848974984;0.00013999611837789;5.457005045173e-06;-2.8379659852362e-05;-7.7010481618345e-06;6.8871704570483e-05;-2.6909025109489e-05;-5.1794540922856e-05;1.1589149835345e-05;-0.0001202908315463;-0.00024932547239587;-0.00068527617258951;0.00011667211947497;0.00033425402943976;0.001030478393659;0.00033549245563336;-0.00021278198983055;4.0740233089309e-05;7.5934367487207e-05;8.4509505541064e-05;0.00016675052756909;-1.1162527613351e-07;-5.7238336012233e-05;-2.5977335553762e-06;7.7212032920215e-05;-5.7997345720651e-05;3.1589617719874e-05;0.00040204223478213;-4.805566277355e-05;0.00063072110060602;-5.2998799219495e-05;0.00032272073440254;0.0001628269237699;-7.7733784564771e-05;6.2582512327936e-06;-2.0765126464539e-05;1.3913328075432e-05;5.225600398262e-05;-5.2262603276176e-05;-8.8953502199729e-06;-0.00010310507786926;5.3551888413494e-05;0.0018414322985336;0.00024682533694431;-0.0011329206172377;-0.00023619095736649;-0.001081277616322;-0.00079044583253562;-0.0001890627463581;5.6607514125062e-05;-0.00015882482693996;0.0001281629956793;9.7825495686266e-06;-1.8546203136793e-05;1.4702663065691e-05;5.5689066357445e-05;-0.00010848881356651;4.5136177504901e-05;0.00057785253738984;-0.00043000283767469;0.00040383040322922;-0.00036928625195287;0.00026064325356856;-9.0947205535485e-06;-5.6109634897439e-05;1.6761567167123e-05;-0.00015937774151098;7.4755320383701e-05;-0.00011225949856453;-0.00013650860637426;-4.9939240852837e-05;-8.0304576840717e-05;0.00032753657433204;0.0013309601927176;0.00013127872080076;-0.0017395807662979;0.00039825410931371;-0.00069987523602322;-0.00033452178467996;0.00015824104775675;0.00020332583517302;-1.042679650709e-05;0.00021418849064503;7.6984419138171e-05;-2.9861494112993e-05;3.7582605727948e-05;6.8306660978124e-05;0.00011906616418855;2.248114469694e-05;-0.0006641632062383;-7.0218222390395e-05;-0.00074254052015021;-0.00023373859585263;0.00013788741489407;-0.00018980851746164;-2.6624476959114e-05;-1.1533034012245e-05;0.0001223062427016;7.1946124080569e-06;-0.00010799802839756;-1.7351851056446e-05;-0.00019993308524136;2.3263668481377e-05;-0.00045637876610272;-0.0012276999186724;0.0002005009300774;0.0019143489189446;0.0005593040259555;-0.00020898012735415;0.00043265672866255;0.00015978921146598;1.3115977708367e-05;0.0003490537928883;8.3873885159846e-05;-0.00010389991803095;-9.3878725238028e-06;0.00012903007154819;-3.6167414236843e-06;4.1561153921066e-05;-8.4601735579781e-05;4.4431395508582e-05;0.00058838888071477;-1.5650774003007e-05;0.00099863356444985;0.00026460882509127;0.0006512877298519;-1.2562504707603e-05;-0.00012293859617785;1.0743699476734e-06;-3.1782012229087e-05;-8.148820779752e-05;6.8693261709996e-05;-0.00015059958968777;-5.9287402109476e-05;0.00012178580800537;0.0034518851898611;0.00043402405572124;-0.00076253717998043;-0.0018088782671839;-0.0013269317569211;-0.0021133492700756;8.0382531450596e-05;-0.00026198488194495;0.00019208388403058;-0.00022297144460026;-2.0907998987241e-05;1.0532185115153e-05;8.4888139099348e-05;4.2210740502924e-05;-0.00014732354611624;8.1680758739822e-05;0.00081677705748007;-0.00064938614377752;0.00080638896906748;-0.00071102258516476;0.00038239857531153;-0.00017559583648108;-9.2190850409679e-05;5.951895218459e-05;-0.00016817079449538;9.8411670478527e-05;-3.9402271795552e-05;-0.00017584770102985;-1.358502322546e-05;-9.060251613846e-05;0.00030321988742799;0.0012008561752737;0.00011800292122643;-0.0022109118290246;0.00094260816695169;-0.00091996078845114;-1.0520456328322e-07;5.6262106227223e-06;0.00028464503702708;-0.00017234156257473;0.00033284624805674;8.3261060353834e-05;-3.8968508306425e-05;1.596579386387e-05;7.320773875108e-05;0.00013103570381645;4.0910879761213e-05;-0.0007677492685616;-0.00022833664843347;-0.00081711634993553;-0.00032344949431717;0.00013044876686763;-0.00011714266292984;-3.5097244108329e-05;-3.1072751880856e-05;0.00015802119742148;5.0881037168438e-05;-0.00012720531958621;-4.0288839954883e-05;-0.00021610051044263;-2.0191684598103e-05;-0.00051917333621532;-0.0014561386778951;0.00028739252593368;0.0021536680869758;0.0009314299095422;-0.00021348058362491;0.00028311210917309;0.00016883075295482;3.169514820911e-05;0.0003924735065084;0.0001353394909529;-0.00012387991591822;-3.7310612242436e-05;0.00014759779151063;3.0897055694368e-05;1.4238471521821e-05;-8.9135879534297e-05;0.00024484575260431;0.0006641183863394;0.00026927696308121;0.001148727722466;0.00045400558155961;0.00083516479935497;-5.1471553888405e-05;-0.00014263141201809;-2.358759593335e-05;-3.8764883356635e-05;-9.5362825959455e-05;3.9483813452534e-05;-0.00017944962019101;-0.00011486931907712;0.00023861583031248;0.005024740472436;0.00063018477521837;-0.0015238421037793;-0.0023128271568567;-0.0020729056559503;-0.0028689329046756;5.0016999011859e-05;-0.00025222045951523;0.00016281836724374;-0.00019520973728504;-1.0107789421454e-05;1.0442128768773e-05;0.00010852290142793;7.6116273703519e-05;-0.00018495169933885;0.00013376590504777;0.0011167724151164;-0.00096539087826386;0.0013166000135243;-0.0012198238400742;0.00051197101129219;-0.00045740386121906;-0.00012938982399646;0.0001254226808669;-0.00017074204515666;0.00013894953008275;9.3661074060947e-05;-0.00020374463929329;4.4965596316615e-05;-8.5024345025886e-05;0.00017436675261706;0.00061168405227363;3.9922419091454e-05;-0.0026662545278668;0.0019051728304476;-0.0010525778634474;0.00066465797135606;-0.0002392642054474;0.0003580708289519;-0.00040543466457166;0.0004773942346219;8.3411345258355e-05;-5.4716474551242e-05;-2.7705849788617e-05;6.5636231738608e-05;0.00013075178139843;7.1713497163728e-05;-0.00084022508235648;-0.00051963212899864;-0.00085978209972382;-0.00047375459689647;7.6074495154899e-05;4.5593878894579e-05;-4.4200274714967e-05;-6.4317231590394e-05;0.00019440974574536;0.00012971664546058;-0.00015143015480135;-8.494128996972e-05;-0.0002083124127239;-0.00010636630759109;-0.00055565586080775;-0.001716818776913;0.00040802379953675;0.002281189430505;0.001563161262311;-0.00014421064406633;-5.5021344451234e-05;0.00017279421444982;7.1246075094678e-05;0.00042368643335067;0.00022694945801049;-0.00013698269322049;-8.5400686657522e-05;0.00015652763249818;9.5213232270908e-05;-3.3074731618399e-05;-7.0505324401893e-05;0.00055000715656206;0.00064024573657662;0.00072679755976424;0.0011134601663798;0.00072622060542926;0.00099187507294118;-0.00011327410902595;-0.00014062580885366;-5.4180720326258e-05;-4.3237145291641e-05;-8.4501873061527e-05;-2.5811532395892e-05;-0.00020306288206484;-0.00020727775699925;0.00036233844002709;0.0069542112760246;0.00085624592611566;-0.002574923215434;-0.0027039984706789;-0.0030661898199469;-0.0036645266227424;-3.7943409552099e-05;-0.00016429435345344;7.6771837484557e-05;-7.2033471951727e-05;2.4333378405572e-06;3.1958093131834e-06;0.00012962914479431;0.00012602948118001;-0.00015988636005204;0.00014021841343492;0.0010469886474311;-0.00095774314831942;0.0012528625084087;-0.0012227043043822;0.00041623634751886;-0.00052051851525903;-0.00010956690675812;0.00013463677896652;-0.0001475589670008;0.00015072943642735;0.00015989481471479;-0.00014593130617868;7.9837074736133e-05;-5.2472143579507e-05;-9.4626448117197e-06;-0.00013683496217709;-4.8921312554739e-05;-0.0022156939376146;0.0021888378541917;-0.00071080710040405;0.00095396093092859;-0.00032881851075217;0.00027326145209372;-0.00044524914119393;0.00042678651516326;7.0500558649655e-05;-6.2535073084291e-05;-5.866486026207e-05;3.8617778045591e-05;0.00010372479300713;8.6485692008864e-05;-0.00067317351931706;-0.00064140243921429;-0.0007393675041385;-0.00056189793394879;-3.1153820600593e-05;0.00014533881039824;-3.290565291536e-05;-6.9356698077172e-05;0.00015514202823397;0.00015415521920659;-0.00013260841660667;-0.00010230181214865;-0.00014468206791207;-0.00015962524048518;-0.00051292893476784;-0.0016666847513989;0.00038257447886281;0.0018666387768462;0.0018139476887882;7.4731331551448e-05;-0.00023031001910567;0.0001503803068772;0.00010388368536951;0.00035727643989958;0.00027215055888519;-0.00010638403182384;-0.00010452089918545;0.00011726803495549;0.00012560602044687;-6.7604945797939e-05;-3.0822619009996e-05;0.00068846944486722;0.00043647855636664;0.00097980629652739;0.00077658123336732;0.00077295047231019;0.00085817911894992;-0.00014045338321012;-0.00010089293209603;-5.879431773792e-05;-2.8919863325427e-05;-3.6613637348637e-05;-7.001305493759e-05;-0.00016098478226922;-0.00023272579710465;0.00033980075386353;0.0066179377026856;0.00082412362098694;-0.0027724544052035;-0.0022308770567179;-0.0030903357546777;-0.0033309408463538;-0.00014199300494511;-5.6380617024843e-05;-4.4668795453617e-05;5.1817038183799e-05;1.0416891200293e-05;-7.8635584941367e-06;0.0001097805070458;0.00013699792907573;-7.8619705163874e-05;9.3921058578417e-05;0.00061382091371343;-0.00060174230020493;0.00063079531537369;-0.00065558822825551;0.00011243126937188;-0.0003136548330076;-3.7909627280897e-05;7.5923388067167e-05;-0.00010218172246823;0.0001290362997679;0.00013299504644237;-1.6917083485168e-05;8.2589547673706e-05;-2.4106154796755e-06;-0.00017391875735484;-0.00073070242069662;-9.719913941808e-05;-0.00099752994719893;0.0016190094174817;-8.9993227447849e-06;0.00068480393383652;-0.00023082380357664;4.2776155169122e-05;-0.0002742285723798;0.00017929151363205;4.8699959734222e-05;-5.9004385548178e-05;-6.6360771597829e-05;1.6974072423181e-06;5.5911721574375e-05;7.9869576438796e-05;-0.00030962395248935;-0.00054669525707141;-0.0004849566903431;-0.00058042490854859;-0.00016131180746015;0.00013331524678506;-2.5985318643507e-06;-3.9811049646232e-05;5.0714872486424e-05;0.00010817676957231;-7.2721988544799e-05;-8.9075758296531e-05;-4.188687671558e-05;-0.00016051622515079;-0.00039282371290028;-0.0013336015399545;0.0001985669368878;0.0010158034274355;0.0015835395315662;0.00039480710984208;-0.00013341987505555;0.00010569009464234;0.00013181519170757;0.00020726077491418;0.00026045192498714;-4.0052083932096e-05;-8.4474180766847e-05;3.8823964132462e-05;0.00010924721573247;-7.405204087263e-05;1.8375621948508e-05;0.00059116346528754;9.8984892247245e-05;0.00089188438141719;0.00024097232380882;0.00054488895693794;0.00046908212243579;-0.00011746169184335;-3.7393543607322e-05;-3.8610647607129e-05;7.6644419095828e-06;2.8134358217358e-05;-7.218850805657e-05;-6.3933017372619e-05;-0.00017856381600723;0.00016014184802771;0.0039184438064694;0.00052482588216662;-0.0019554863683879;-0.00096204981673509;-0.0020226987544447;-0.0019123058300465;-0.00021183730859775;2.6922150937025e-05;-0.00014935083163437;0.00012834304652642;1.2529356354207e-05;-2.3284788767342e-05;5.2966966904933e-05;0.00010389354429208;-3.4948898246512e-05;6.5970270952675e-05;0.00039161668973975;-0.00041016971226782;0.00030595299904235;-0.00032368657412007;-2.4824124920997e-05;-0.0002231624093838;-1.069125119102e-06;4.3248779547866e-05;-8.0760888522491e-05;0.0001222023711307;0.00011396942863939;5.7671768445289e-05;7.2830698627513e-05;4.052806616528e-05;-0.00025269293109886;-0.0010170963359997;-0.00011663548502838;-0.00038229304482229;0.0013037592871115;0.00031053932616487;0.00056276936084032;-0.00017118123651017;-9.7016352810897e-05;-0.0001756057899911;2.883736124204e-05;3.6426219594432e-05;-5.5835516832303e-05;-6.4999410824385e-05;-2.4344784833374e-05;3.2041974918684e-05;7.5891628512181e-05;-0.00011379191710148;-0.00049049104563892;-0.00033248940599151;-0.0005642460891977;-0.00021254416787997;0.00015460478607565;7.7265094660106e-06;-3.113928323728e-05;-4.2372730035822e-07;8.7209235061891e-05;-4.1467308619758e-05;-8.0982346844394e-05;8.6165919128689e-06;-0.00016539616626687;-0.00034871912794188;-0.0010839444585145;0.00013825853238814;0.00057153141824529;0.001467986498028;0.0004916595062241;-0.00017566618043929;6.9239846197888e-05;0.00013163764378987;0.00012921995949;0.00025212421314791;-6.8901094891771e-06;-7.4816452979576e-05;1.2245865264049e-06;0.00010403481428511;-7.5963136623614e-05;4.4223681470612e-05;0.00054838985670358;-7.2161601565313e-05;0.00083370925858617;-4.6414836106123e-05;0.00042986145126633;0.00026309071108699;-0.00010338501306251;-1.7930253193299e-07;-3.2672407542123e-05;2.6797777536558e-05;6.4476662373636e-05;-6.8750683567487e-05;-1.6453233911307e-05;-0.00015086703933775;6.1123144405428e-05;0.0025964095257223;0.00035893981112167;-0.0015555470017716;-0.00031904020579532;-0.0014822853263468;-0.0011844084365293;-0.00024549046065658;6.6205975599587e-05;-0.00019928632536903;0.00017147710605059;1.4224754522729e-05;-3.1639261578675e-05;2.2058504328015e-05;8.3556093159132e-05;-0.00011028184235329;4.4875974708702e-05;0.00055947725195438;-0.00043585523962975;0.00049703137483448;-0.00032713319524191;0.0002047082525678;4.6861914597685e-05;-5.2861414587824e-05;9.9198259704281e-06;-0.00013219958054833;8.2006503362209e-05;-7.727910997346e-05;-0.00012857936962973;-6.9991624513932e-06;-9.3007693067193e-05;0.00034024805063382;0.0012422463623807;0.00012781970144715;-0.0017276405123994;0.00041334275738336;-0.00059504149248824;-0.00041183992289007;9.0026231191587e-05;0.00018967779760715;-7.5207273766864e-05;0.00019823771435767;7.1474845753983e-05;-3.6849436582997e-05;1.6959575077635e-05;7.5861120421905e-05;0.00011236799764447;2.3435954062734e-05;-0.00065432355040684;-0.00011857888603117;-0.00086665101116523;-0.00029384001391008;3.996430314146e-05;-0.00020903303811792;4.5485839450521e-07;-2.14849387703e-06;9.3044640379958e-05;1.0466064850334e-05;-0.00012468533532228;-1.9221322872909e-05;-0.0001876829774119;2.4620319891255e-05;-0.00039485754678026;-0.0014461963437498;8.6049862147775e-05;0.0018617763416842;0.00062617898220196;0.00011085082223872;0.00058064475888386;0.00023193801462185;4.376318611321e-05;0.00037753305514343;8.6169806309044e-05;-8.7031628936529e-05;-1.2029915524181e-05;0.00011380589421606;-6.7848159233108e-06;5.6431450502714e-05;-7.323118916247e-05;-5.9997953940183e-05;0.00051123538287356;-0.00013108248822391;0.00083709601312876;0.0002436150534777;0.00052880903240293;-1.1867286048073e-05;-0.00010587066208245;1.2839930604969e-05;-2.8054741051164e-05;-9.2019741714466e-05;6.2454499129672e-05;-0.00016143215179909;-4.3825071770698e-05;4.6983652282506e-05;0.0027896482497454;0.00038407414103858;-0.00040594741585664;-0.0015031599905342;-0.0011398963397369;-0.0017332723364234;0.00011308520333841;-0.00022982187510934;0.00021914888930041;-0.00018852841458283;-3.2771891710581e-05;8.2388050941518e-06;9.4411523605231e-05;3.2707685022615e-05;-0.00013330961519387;7.3385461291764e-05;0.00073752267053351;-0.00060139608103782;0.00076146010542288;-0.00059706374304369;0.00027055412647314;-8.0731661000755e-05;-7.4411116656847e-05;4.2790215957211e-05;-0.00014468707377091;0.00010175043280469;-1.6931315258262e-05;-0.00014969173935242;2.4105196644086e-05;-0.00010058662883239;0.00027831489569508;0.0010235697263852;0.00010258008842357;-0.0020205576438457;0.00090165471192449;-0.00067811162443832;-0.0001323629549006;-2.3718339434708e-05;0.00023627246264368;-0.0001914474851219;0.00028643588302657;7.7649587183259e-05;-4.532022649073e-05;-4.8610640988045e-06;7.7142722147983e-05;0.00011556874960661;3.9310900319833e-05;-0.00071945891249925;-0.00026627143961377;-0.00088422023691237;-0.0003948369412683;2.340815262869e-05;-0.00015344659914263;-7.8674920587218e-06;-1.5570829418721e-05;0.00012220718781464;4.6175500756362e-05;-0.00013550437870435;-4.6147357352311e-05;-0.00018706975970417;-1.6349837096641e-05;-0.00041706988122314;-0.0016310297651216;0.00015535514103249;0.0019824868068099;0.00095015909755602;0.00012207015242893;0.00046799713163637;0.00022908707614988;7.4886411312036e-05;0.00039200508035719;0.00014185601321515;-0.00010014538565883;-3.4447126381565e-05;0.0001224436564371;2.4418817702099e-05;2.7417865567259e-05;-6.7805704020429e-05;0.00012131665425841;0.00051577884005383;0.00014481450489257;0.00089870777446777;0.00038910846342333;0.00066715251887217;-4.5496708480641e-05;-0.00011732994607883;-4.111358521186e-06;-2.4753246179898e-05;-8.9479115558788e-05;3.1640858651372e-05;-0.00017089996254072;-9.7401651146356e-05;0.00013733489322476;0.00394990388304;0.00053439947078004;-0.001042015152052;-0.0017851495649666;-0.0017082634149119;-0.0022959860507399;6.1957638536114e-05;-0.0002036345686065;0.00016841645992827;-0.00014608773926739;-2.3114962459658e-05;1.8540973769632e-06;0.00010588067380013;6.5844455093611e-05;-0.00016025381046347;0.0001161728068837;0.0010093098971993;-0.00087891385192052;0.0011470975587144;-0.0010106625268236;0.00032035200274549;-0.00026395681197755;-9.5923642220441e-05;9.0083078248426e-05;-0.00016512938600499;0.00014646277122665;9.1118374257348e-05;-0.00016540355863981;8.6826767073944e-05;-0.00011080838885391;0.00014458215446211;0.00049078202573583;3.4381500881864e-05;-0.0024402062408626;0.0018056012922898;-0.00065294635714963;0.00031831016531214;-0.00020694186969195;0.00027478352421895;-0.00037922710180283;0.00040658283978701;8.6940737674013e-05;-6.5500840719324e-05;-5.1422022806946e-05;7.7909055107739e-05;0.00011254373384872;6.7012770159636e-05;-0.00082149374065921;-0.000563494337257;-0.00096740550361574;-0.00061879772692919;-6.0724349168595e-05;-6.3958912505768e-05;-1.0921807188424e-05;-3.5065044357907e-05;0.00015827374591026;0.00011116396490252;-0.00016671368211973;-0.00010277519322699;-0.00017393518646713;-9.1374320618343e-05;-0.00040088110836223;-0.0020627591293305;0.0002300343621755;0.0021398758981377;0.0015705520054325;0.00030037085525692;0.0003302656696178;0.00026025387342088;0.00015445057942998;0.00042973391828127;0.00025276964879595;-0.0001111146848416;-7.325409387704e-05;0.00012755958596244;7.9808276495896e-05;-9.1789752332261e-06;-4.0430608351016e-05;0.00034357942058705;0.00041517365025356;0.00050990941235796;0.00080242083640769;0.00060313852736726;0.00080108130350709;-9.6629730251152e-05;-0.00011537413229235;-1.8120628737961e-05;-9.9549197329907e-06;-7.360648305621e-05;-2.7165659048478e-05;-0.00018869670748245;-0.00018916314002126;0.0002057889214484;0.0053555220365524;0.0007222427520901;-0.0018159098690376;-0.0019161485834047;-0.0024760358501226;-0.0029209314379841;-2.1055675460957e-05;-0.00011697876470862;9.4889473984949e-05;-2.2435533537646e-05;-1.9615330529632e-05;-1.8077715139952e-05;0.00012339020031504;0.00011837321653729;-0.00013839793973602;0.00012385842273943;0.00096686638426036;-0.00087591004557908;0.0010827202349901;-0.0010289697675034;0.00024131539976224;-0.00033106477349065;-7.899555930635e-05;9.9511882581282e-05;-0.00015370541950688;0.00015606266970281;0.00014692643890157;-0.00011451872705948;0.00011336617171764;-8.0139645433519e-05;-3.6207791708875e-05;-0.00017491682956461;-4.1183790017385e-05;-0.002053271047771;0.0020888436120003;-0.00036106546758674;0.00058881373843178;-0.00028075702721253;0.0001995206985157;-0.00040724483551458;0.00036685902159661;7.8747136285529e-05;-7.1595852205064e-05;-7.7872842666693e-05;5.2405768656172e-05;9.0636007371359e-05;8.1816178862937e-05;-0.00068109226413071;-0.00067577592562884;-0.00084194488590583;-0.0007232028292492;-0.00014284903591033;2.2202737454791e-05;-5.7396155170863e-06;-3.8803696952527e-05;0.00013040794874541;0.00013063399819657;-0.00014612972154282;-0.00012284735566936;-0.00011796053877333;-0.00014438011567108;-0.00038086224230938;-0.0020275244023651;0.00022238737437874;0.0017979181138799;0.0018260565120727;0.00045615408453159;0.00017531457706355;0.00022749298659619;0.0001904096279759;0.00036458173417486;0.00030672425054945;-8.7999513198156e-05;-8.9826542534865e-05;9.4747767434455e-05;0.0001094548497349;-4.4349046220304e-05;-3.6322785490484e-06;0.00050203152932227;0.00023011185112409;0.0007629735628143;0.00051938404794782;0.00064511288655922;0.00071556289913133;-0.0001211275884998;-8.4001185314264e-05;-2.8707696401398e-05;7.0620421865897e-06;-2.8584550818778e-05;-6.6926215367857e-05;-0.00014708525850438;-0.00022187370632309;0.000192212901311;0.0051922840066254;0.00070763315306976;-0.002085977466777;-0.0015129839302972;-0.0025300295092165;-0.0027197073213756;-0.00012092659744667;-2.4656061214046e-05;-1.9844599592034e-05;8.8832857727539e-05;-8.1698508438421e-06;-3.1421219318872e-05;0.00010249630577164;0.00013430605758913;-7.3368231824134e-05;9.0549168817233e-05;0.00061468838248402;-0.00058038189308718;0.00058778235688806;-0.00059598806547001;5.4120675486047e-05;-0.00024908542400226;-2.791111546685e-05;6.2537219491787e-05;-0.00011125882883789;0.00012984128261451;0.0001307908387389;-7.3554701884859e-06;9.5175520982593e-05;-1.1054392416554e-05;-0.00019693274225574;-0.00073309539584443;-8.7330423411913e-05;-0.00097987416666001;0.0016187590081245;9.9079268693458e-05;0.00055165390949696;-0.00022067505051382;1.7943912098417e-05;-0.00026383300428279;0.00016008668171708;5.4955911764409e-05;-6.1473991081584e-05;-7.498954073526e-05;6.6437323766877e-06;5.4577267292188e-05;8.009972225409e-05;-0.00032812243443914;-0.00056909496197477;-0.00053367036161944;-0.00069102103589103;-0.00019906007219106;7.8545810538344e-05;5.847673946846e-06;-2.5014040147653e-05;4.5904267608421e-05;9.4959861598909e-05;-7.6807213190477e-05;-0.000103243823105;-3.3537893614266e-05;-0.00016153945762198;-0.00036584516055882;-0.0015306359855458;0.0001347031648038;0.0010415044380352;0.0016484980005771;0.00054073048522696;5.2429251809372e-05;0.0001331951643806;0.00017878206563182;0.00021154749265406;0.00029342964990065;-3.6489927879302e-05;-7.7535114542115e-05;3.1866191420704e-05;0.00010499699419597;-6.6231215896551e-05;3.2288877264364e-05;0.00054568046471104;7.7664099080721e-06;0.0008109308546409;0.00013891868002247;0.00049068685621023;0.00043557229219005;-0.00010897908941843;-3.3069125493057e-05;-3.5281133023091e-05;2.7267285986454e-05;3.1751889764564e-05;-6.9791603891645e-05;-5.7324574299855e-05;-0.00018361458205618;9.1771828010678e-05;0.0034523361828178;0.00048897747183219;-0.0017459886148572;-0.00066490680910647;-0.0018174487631768;-0.0017408895073459;-0.0002037111989921;3.4999393392354e-05;-0.00013755755207967;0.00014852083404548;8.9625336840982e-06;-3.7124445952941e-05;4.7861907660263e-05;0.00010762418241939;-2.8548307454912e-05;6.2810933741275e-05;0.0004363642365206;-0.0003824973537121;0.00026691044331528;-0.00021224962256383;-9.1537534899544e-05;-0.00015751148748677;1.2555797184177e-05;2.1674426534446e-05;-0.00010489091073396;0.00012503468315117;0.00011621254088823;8.1042657257058e-05;8.5674575529993e-05;5.0515682232799e-05;-0.00031853173277341;-0.0010505433892831;-9.2394984676503e-05;-0.00038933369796723;0.001357123372145;0.00042997920536436;0.00040514965075999;-0.00016936632164288;-0.00015588778478559;-0.00016257209063042;-2.2189316950971e-05;4.905150126433e-05;-5.6806340580806e-05;-7.7971628343221e-05;-2.7267191399005e-05;3.5754903365159e-05;8.0151607107837e-05;-0.00014011839812156;-0.00053645140724257;-0.00039314245805144;-0.00079299579374492;-0.00025895400904119;9.6092349849641e-05;1.3441428563965e-05;-1.1491079931147e-05;-3.5080342968286e-06;6.377818499459e-05;-4.3810468923766e-05;-0.00011134684609715;2.0678600776591e-05;-0.00018798516248353;-0.00037047671503387;-0.0013974866596982;7.5326279329602e-05;0.0006536707514897;0.0016906458185986;0.00066830188734457;4.535914195003e-05;9.3160895630717e-05;0.00021126482170075;0.00013400366879068;0.00033588986843824;-4.8919455366558e-06;-6.4648207626306e-05;-7.1256413320953e-06;0.00010691258648876;-7.1709117037244e-05;7.1076341555454e-05;0.0005618596333079;-0.0002262398484163;0.00077447202056646;-0.00019251527555753;0.00036484788870439;0.0002526632451918;-9.4160714070313e-05;4.9327677515976e-06;-4.4884574890602e-05;6.9379544584081e-05;7.7215241617523e-05;-5.9747129853349e-05;-2.5038987132575e-06;-0.00017462299729232;-5.000970850233e-05;0.0021721723023802;0.00033160136081278;-0.0014353758888319;0.00013272615615278;-0.0012691910378635;-0.0010799408191815;-0.00025082187494263;6.1643026128877e-05;-0.00019607835565694;0.00021133379777893;1.724381945678e-05;-6.0981521528447e-05;9.5594568847446e-06;9.6056282927748e-05;-8.0115714808926e-05;2.9528488084907e-05;0.00038946932181716;-0.00030785740818828;0.00036005032598041;-0.00020002186647616;0.00013329632929526;6.3594212406315e-05;-3.6060413549421e-05;1.5573746168229e-06;-8.9916720753536e-05;6.0902417317266e-05;-5.8227407862432e-05;-9.2345268058125e-05;-5.0191420797319e-08;-7.1117225161288e-05;0.00027054795646109;0.00094224547501653;9.8051656095777e-05;-0.0012566752266139;0.00024673412553966;-0.00041407759999856;-0.00036080396967009;6.7520246375352e-05;0.00013393003609963;-5.5775024520699e-05;0.00013308123743627;5.0836075388361e-05;-2.8107004254707e-05;1.1349100532243e-05;5.8456644183025e-05;8.1531899922993e-05;1.5610426999046e-05;-0.00047771036042832;-8.0319456174038e-05;-0.00067408761242405;-0.00021600291074719;1.0632063094818e-05;-0.00016628329467494;7.6472033470054e-06;1.7713166471367e-06;5.9059999330202e-05;4.3190802898607e-06;-9.5968447567429e-05;-1.1150305908814e-05;-0.00013805345224682;2.4534125259379e-05;-0.00027646153466776;-0.0011003093095496;3.0027562388568e-05;0.0013627732405439;0.00043667736463249;0.00015086228086147;0.00047752651153132;0.00019009670359083;3.4834640246117e-05;0.0002875612990465;5.6123564718291e-05;-5.9270994825056e-05;-6.7004302763962e-06;8.0615354818292e-05;-9.8864938991028e-06;5.1653780246852e-05;-5.3016177844256e-05;-0.00010247157479171;0.00036566058406606;-0.00017845498223323;0.00057583663146943;0.00015490165969823;0.00034450826933607;-2.8149627269158e-06;-7.2825692768674e-05;1.5017524674477e-05;-2.1497731722775e-05;-7.2439135692548e-05;5.0237056711921e-05;-0.00012389595212881;-2.1113135517226e-05;2.6948254117087e-07;0.0017579102423042;0.00025021767942235;-0.00011105685553048;-0.0010125722037628;-0.00072052952600643;-0.00111908337567;0.0001034373199218;-0.00016768195200711;0.00018237535550725;-0.00013837567530572;-2.9485390768969e-05;6.7887176555814e-06;7.176463259384e-05;1.6735457393224e-05; + 7182 + 31 + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mCBoxAlgorithmViz.cpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mCBoxAlgorithmViz.cpp new file mode 100644 index 0000000..071cbdb --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mCBoxAlgorithmViz.cpp @@ -0,0 +1,553 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include "mCBoxAlgorithmViz.hpp" + +// OpenGL 1.2 +#ifndef GL_BGRA +# define GL_BGRA 0x80E1 +#endif // GL_BGRA + +namespace OpenViBE { +namespace AdvancedVisualization { + +template +class toolbar_sort_changed_ +{ +public: + static void callback(GtkButton* /*button*/, CBoxAlgorithmViz* box) + { + box->m_RendererCtx->sortSelectedChannel(i); + box->m_RedrawNeeded = true; + } +}; + +static void ChannelSelectionChanged(GtkTreeSelection* selection, CRendererContext* ctx) +{ + size_t i = 0; + GtkTreeView* treeView = gtk_tree_selection_get_tree_view(selection); + GtkTreeModel* treeModel = gtk_tree_view_get_model(treeView); + if (treeModel != nullptr) + { + GtkTreeIter iter; + if (gtk_tree_model_get_iter_first(treeModel, &iter) != 0) + { + do + { + if (gtk_tree_selection_iter_is_selected(selection, &iter) != 0) { ctx->selectChannel(i); } + else { ctx->unselectChannel(i); } + i++; + } while (gtk_tree_model_iter_next(treeModel, &iter) != 0); + } + } +} + +static void SpinbuttonTimeScaleChangeValueCB(GtkSpinButton* button, CRendererContext* ctx) +{ + ctx->setTimeScale(size_t(gtk_spin_button_get_value(button) * (1LL << 32))); +} + +static void SpinbuttonElementCountChangeValueCB(GtkSpinButton* button, CRendererContext* ctx) +{ + ctx->setElementCount(size_t(gtk_spin_button_get_value(button))); +} + +static void CheckbuttonPositiveToggledCB(GtkToggleButton* button, CRendererContext* ctx) { ctx->setPositiveOnly(gtk_toggle_button_get_active(button) != 0); } + +static void CheckbuttonShowScaleToggledCB(GtkToggleButton* button, CRendererContext* ctx) +{ + ctx->setScaleVisibility(gtk_toggle_button_get_active(button) != 0); +} + +static void ButtonVideoRecordingPressedCB(GtkButton* button, CBoxAlgorithmViz* box) +{ + box->m_IsVideoOutputWorking = !box->m_IsVideoOutputWorking; + gtk_button_set_label(button, box->m_IsVideoOutputWorking ? GTK_STOCK_MEDIA_PAUSE : GTK_STOCK_MEDIA_RECORD); +} + +static void RangeERPValueChangedCB(GtkRange* range, GtkLabel* label) +{ + char str[1024]; + sprintf(str, "%.02f%%", gtk_range_get_value(range) * 100); + gtk_label_set_text(label, str); + getContext().stepERPFractionBy(float(gtk_range_get_value(range)) - getContext().getERPFraction()); +} + +static void ButtonERPPlayPausePressedCB(GtkButton* /*button*/, CRendererContext* ctx) { ctx->setERPPlayerActive(!ctx->isERPPlayerActive()); } + +static void SpinbuttonFreqBandMinChangeValueCB(GtkSpinButton* button, CRendererContext* ctx) +{ + ctx->setMinimumSpectrumFrequency(size_t(gtk_spin_button_get_value(button))); +} + +static void SpinbuttonFreqBandMaxChangeValueCB(GtkSpinButton* button, CRendererContext* ctx) +{ + ctx->setMaximumSpectrumFrequency(size_t(gtk_spin_button_get_value(button))); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmViz::initialize() + +{ + m_RendererCtx = new CRendererContext(); + m_SubRendererCtx = new CRendererContext(); + + // Sets default setting values + m_Colors.clear(); + m_Localisation = CString(""); + m_TemporalCoherence = ETemporalCoherence::TimeLocked; + m_NElement = 50; + m_TimeScale = 10LL << 32; + m_IsPositive = false; + m_IsTimeLocked = true; + m_IsScaleVisible = true; + m_TextureID = 0; + m_lastProcessTime = 0; + m_Time1 = 0; + m_Time2 = 0; + CString color = CString("100,100,100"); + m_ColorGradient = CString("0:0,0,0; 100:100,100,100"); + m_XYZPlotHasDepth = false; + m_DataScale = 1; + m_Translucency = 1; + + + // Initializes fast forward behavior + m_fastForwardMaxFactorHD = float(this->getConfigurationManager().expandAsFloat("${AdvancedViz_HighDefinition_FastForwardFactor}", 5.F)); + m_fastForwardMaxFactorLD = float(this->getConfigurationManager().expandAsFloat("${AdvancedViz_LowDefinition_FastForwardFactor}", 20.F)); + + // Gets data stream type + this->getStaticBoxContext().getInputType(0, m_TypeID); + + // Prepares GUI + m_Builder = gtk_builder_new(); + gtk_builder_add_from_file(m_Builder, std::string(Directories::getDataDir() + "/plugins/advanced-visualization.ui").c_str(), nullptr); + + GtkWidget* main = GTK_WIDGET(gtk_builder_get_object(m_Builder, "table")); + GtkWidget* toolbar = GTK_WIDGET(gtk_builder_get_object(m_Builder, "toolbar-window")); + m_Viewport = GTK_WIDGET(gtk_builder_get_object(m_Builder, "viewport")); + m_Top = GTK_WIDGET(gtk_builder_get_object(m_Builder, "label_top")); + m_Left = GTK_WIDGET(gtk_builder_get_object(m_Builder, "drawingarea_left")); + m_Right = GTK_WIDGET(gtk_builder_get_object(m_Builder, "drawingarea_right")); + m_Bottom = GTK_WIDGET(gtk_builder_get_object(m_Builder, "drawingarea_bottom")); + m_CornerLeft = GTK_WIDGET(gtk_builder_get_object(m_Builder, "label_corner_left")); + m_CornerRight = GTK_WIDGET(gtk_builder_get_object(m_Builder, "label_corner_right")); + + // Gets important widgets + m_TimeScaleW = GTK_WIDGET(gtk_builder_get_object(m_Builder, "spinbutton_time_scale")); + m_nElementW = GTK_WIDGET(gtk_builder_get_object(m_Builder, "spinbutton_element_count")); + m_ERPRange = GTK_WIDGET(gtk_builder_get_object(m_Builder, "range_erp")); + m_ERPPlayerButton = GTK_WIDGET(gtk_builder_get_object(m_Builder, "button_erp_play_pause")); + m_ERPPlayer = GTK_WIDGET(gtk_builder_get_object(m_Builder, "table_erp")); + m_ScaleVisible = GTK_WIDGET(gtk_builder_get_object(m_Builder, "checkbutton_show_scale")); + m_FrequencyBandMin = GTK_WIDGET(gtk_builder_get_object(m_Builder, "spinbutton_freq_band_min")); + m_FrequencyBandMax = GTK_WIDGET(gtk_builder_get_object(m_Builder, "spinbutton_freq_band_max")); + + m_ChannelTreeView = GTK_TREE_VIEW(gtk_builder_get_object(m_Builder, "expander_select_treeview")); + m_ChannelListStore = GTK_LIST_STORE(gtk_builder_get_object(m_Builder, "liststore_select")); + + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(m_ChannelTreeView), GTK_SELECTION_MULTIPLE); + + // Sets default spectrum frequency range + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_FrequencyBandMin), 2); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_FrequencyBandMax), 48); + + // Connects GTK signals + g_signal_connect(gtk_builder_get_object(m_Builder, "expander_sort_button_default"), "pressed", G_CALLBACK(toolbar_sort_changed_<1>::callback), this); + g_signal_connect(gtk_builder_get_object(m_Builder, "expander_sort_button_alpha"), "pressed", G_CALLBACK(toolbar_sort_changed_<2>::callback), this); + g_signal_connect(gtk_builder_get_object(m_Builder, "expander_sort_button_reversed"), "pressed", G_CALLBACK(toolbar_sort_changed_<3>::callback), this); + g_signal_connect(gtk_builder_get_object(m_Builder, "expander_sort_button_left_right"), "pressed", G_CALLBACK(toolbar_sort_changed_<4>::callback), this); + g_signal_connect(gtk_builder_get_object(m_Builder, "expander_sort_button_front_back"), "pressed", G_CALLBACK(toolbar_sort_changed_<5>::callback), this); + g_signal_connect(gtk_builder_get_object(m_Builder, "spinbutton_time_scale"), "value-changed", G_CALLBACK(SpinbuttonTimeScaleChangeValueCB), m_RendererCtx); + g_signal_connect(gtk_builder_get_object(m_Builder, "spinbutton_element_count"), "value-changed", G_CALLBACK(SpinbuttonElementCountChangeValueCB), + m_RendererCtx); + g_signal_connect(gtk_builder_get_object(m_Builder, "spinbutton_element_count"), "value-changed", G_CALLBACK(SpinbuttonElementCountChangeValueCB), + m_SubRendererCtx); + g_signal_connect(gtk_builder_get_object(m_Builder, "checkbutton_positive"), "toggled", G_CALLBACK(CheckbuttonPositiveToggledCB), m_RendererCtx); + g_signal_connect(gtk_builder_get_object(m_Builder, "checkbutton_show_scale"), "toggled", G_CALLBACK(CheckbuttonShowScaleToggledCB), + &OpenViBE::AdvancedVisualization::getContext()); + g_signal_connect(gtk_builder_get_object(m_Builder, "button_erp_play_pause"), "pressed", G_CALLBACK(ButtonERPPlayPausePressedCB), + &OpenViBE::AdvancedVisualization::getContext()); + g_signal_connect(gtk_builder_get_object(m_Builder, "button_video_recording"), "pressed", G_CALLBACK(ButtonVideoRecordingPressedCB), this); + g_signal_connect(gtk_builder_get_object(m_Builder, "range_erp"), "value-changed", G_CALLBACK(RangeERPValueChangedCB), + gtk_builder_get_object(m_Builder, "label_erp_progress")); + g_signal_connect(gtk_builder_get_object(m_Builder, "spinbutton_freq_band_min"), "value-changed", G_CALLBACK(SpinbuttonFreqBandMinChangeValueCB), + m_RendererCtx); + g_signal_connect(gtk_builder_get_object(m_Builder, "spinbutton_freq_band_max"), "value-changed", G_CALLBACK(SpinbuttonFreqBandMaxChangeValueCB), + m_RendererCtx); + + g_signal_connect(gtk_tree_view_get_selection(m_ChannelTreeView), "changed", G_CALLBACK(ChannelSelectionChanged), m_RendererCtx); + + // Hides unnecessary widgets + if (std::find(m_Parameters.begin(), m_Parameters.end(), S_DataScale) == m_Parameters.end()) + { + gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(m_Builder, "checkbutton_positive"))); + } + if (std::find(m_Parameters.begin(), m_Parameters.end(), S_ChannelLocalisation) == m_Parameters.end()) + { + gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(m_Builder, "expander_sort"))); + } + if (m_TypeID != OV_TypeId_Spectrum) { gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(m_Builder, "expander_freq_band"))); } + gtk_widget_hide(m_ERPPlayer); + + // Prepares 3D View + m_GtkGLWidget.initialize(*this, m_Viewport, m_Left, m_Right, m_Bottom); + m_GtkGLWidget.setPointSmoothingActive(this->getConfigurationManager().expandAsBoolean("${AdvancedViz_SmoothPoint}", false)); + + // Fowards widgets to the OpenViBE viz context + if (!this->canCreatePluginObject(OVP_ClassId_Plugin_VisualizationCtx)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Visualization framework is not loaded" << "\n"; + return false; + } + + m_visualizationCtx = dynamic_cast(this->createPluginObject(OVP_ClassId_Plugin_VisualizationCtx)); + m_visualizationCtx->setWidget(*this, main); + m_visualizationCtx->setToolbar(*this, toolbar); + + // Parses box settings + size_t settingIndex = 0; + for (int iParameter : m_Parameters) + { + double value; + switch (iParameter) + { + case S_ChannelLocalisation: + m_Localisation = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), settingIndex); + break; + case S_Caption: + m_Caption = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), settingIndex); + break; + case S_Color: + color = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), settingIndex); + break; + case S_ColorGradient: + m_ColorGradient = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), settingIndex); + break; + case S_DataPositive: + m_IsPositive = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), settingIndex); + break; + case S_TemporalCoherence: + m_TemporalCoherence = ETemporalCoherence(size_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), settingIndex))); + break; + case S_TimeScale: + value = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), settingIndex); + m_TimeScale = size_t(value * (1LL << 32)); + break; + case S_ElementCount: + m_NElement = size_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), settingIndex)); + break; + case S_DataScale: + m_DataScale = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), settingIndex); + break; + case S_FlowerRingCount: + m_NFlowerRing = size_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), settingIndex)); + break; + case S_Translucency: + m_Translucency = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), settingIndex); + break; + case S_ShowAxis: + m_ShowAxis = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), settingIndex); + break; + case S_XYZPlotHasDepth: + m_XYZPlotHasDepth = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), settingIndex); + break; + + case F_FixedChannelOrder: + settingIndex--; + gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(m_Builder, "expander_sort"))); + break; + case F_FixedChannelSelection: + settingIndex--; + gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(m_Builder, "expander_select"))); + break; + default: + settingIndex--; + break; + } + + settingIndex++; + } + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_Builder, "checkbutton_positive")), gboolean(m_IsPositive)); + + // Parses color string + parseColor(m_Color, color.toASCIIString()); + m_Colors.push_back(m_Color); + + // Parses color string - special for instant oscilloscope which can have several inputs + for (size_t i = settingIndex; i < this->getStaticBoxContext().getSettingCount(); ++i) + { + color = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i); + parseColor(m_Color, color.toASCIIString()); + m_Colors.push_back(m_Color); + } + + // Sets caption + if (m_Caption != CString("")) { gtk_label_set_text(GTK_LABEL(m_Top), std::string(m_Caption.toASCIIString()).c_str()); } + + // Sets time scale + if (m_TemporalCoherence == ETemporalCoherence::TimeLocked) + { + gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_builder_get_object(m_Builder, "spinbutton_time_scale")), (m_TimeScale >> 22) / 1024.); + m_IsTimeLocked = true; + } + else { gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(m_Builder, "vbox_time_scale"))); } + + // Sets matrix count + if (m_TemporalCoherence == ETemporalCoherence::Independant) + { + gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_builder_get_object(m_Builder, "spinbutton_element_count")), double(m_NElement)); + m_IsTimeLocked = false; + } + else { gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(m_Builder, "vbox_element_count"))); } + + // Shows / hides scale + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_ScaleVisible), gboolean(m_RendererCtx->getScaleVisibility())); + + // Reads channel localisation + if (m_Localisation != CString("")) + { + Kernel::IAlgorithmProxy* channelPosReader = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_OVMatrixFileReader)); + channelPosReader->initialize(); + + const Kernel::TParameterHandler ip_filename( + channelPosReader->getInputParameter(OVP_GD_Algorithm_OVMatrixFileReader_InputParameterId_Filename)); + Kernel::TParameterHandler op_matrix(channelPosReader->getOutputParameter(OVP_GD_Algorithm_OVMatrixFileReader_OutputParameterId_Matrix)); + + *ip_filename = m_Localisation; + + channelPosReader->process(); + + if (op_matrix->getDimensionCount() != 2 || op_matrix->getDimensionSize(1) != 3) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Invalid channel localisation file " << m_Localisation << "\n"; + } + else + { + const size_t nChannel = op_matrix->getDimensionSize(0); + double* buffer = op_matrix->getBuffer(); + for (size_t i = 0; i < nChannel; ++i) + { + std::string name = trim(op_matrix->getDimensionLabel(0, i)); + std::transform(name.begin(), name.end(), name.begin(), tolower); + m_ChannelPositions[name] = CVertex(-buffer[1], buffer[2], -buffer[0]); + buffer += 3; + } + } + + channelPosReader->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*channelPosReader); + channelPosReader = nullptr; + } + + // Gets frame base path for video output, if the variable is not defined, no video output is performed + const CString basePath = this->getConfigurationManager().expand("${AdvancedVisualization_VideoOutputPath}"); + const CString sessionId = this->getConfigurationManager().expand("[$core{date}-$core{time}]"); + const CString widgetName = this->getStaticBoxContext().getName(); + m_FrameFilenameFormat = basePath + sessionId + widgetName + CString("-%06i.png"); + m_IsVideoOutputEnabled = (basePath != CString("")); + m_IsVideoOutputWorking = false; + m_FrameId = 0; + gtk_widget_set_visible(GTK_WIDGET(gtk_builder_get_object(m_Builder, "hbox_video_recording")), m_IsVideoOutputEnabled ? TRUE : FALSE); + gtk_label_set_markup(GTK_LABEL(gtk_builder_get_object(m_Builder, "label_video_recording_filename")), + (CString("") + m_FrameFilenameFormat + CString("")).toASCIIString()); + + m_Width = 0; + m_Height = 0; + + return true; +} + +bool CBoxAlgorithmViz::uninitialize() + +{ + g_object_unref(m_Builder); + m_Builder = nullptr; + + getContext().stepERPFractionBy(-getContext().getERPFraction()); + getContext().setERPPlayerActive(false); + + delete m_SubRendererCtx; + m_SubRendererCtx = nullptr; + + delete m_RendererCtx; + m_RendererCtx = nullptr; + + this->releasePluginObject(m_visualizationCtx); + + return true; +} + +bool CBoxAlgorithmViz::processClock(Kernel::CMessageClock& /*msg*/) +{ + const uint64_t currentTime = this->getPlayerContext().getCurrentTime(); + + const uint64_t minDeltaTimeHD = (1LL << 32) / 16; + const uint64_t minDeltaTimeLD = (1LL << 32); + const uint64_t minDeltaTimeLD2 = (1LL << 32) * 5; + + uint64_t minDeltaTime; + if (this->getPlayerContext().getStatus() == Kernel::EPlayerStatus::Play) { minDeltaTime = minDeltaTimeHD; } + else + { + const auto fastForwardMaxFactor = float(this->getPlayerContext().getCurrentFastForwardMaximumFactor()); + if (fastForwardMaxFactor <= m_fastForwardMaxFactorHD) { minDeltaTime = minDeltaTimeHD; } + else if (fastForwardMaxFactor <= m_fastForwardMaxFactorLD) + { + const float alpha = (fastForwardMaxFactor - m_fastForwardMaxFactorHD) / (m_fastForwardMaxFactorLD - m_fastForwardMaxFactorHD); + minDeltaTime = uint64_t((minDeltaTimeLD * alpha) + minDeltaTimeHD * (1.F - alpha)); + } + else { minDeltaTime = minDeltaTimeLD2; } + } + + if (currentTime > m_lastProcessTime + minDeltaTime || this->getPlayerContext().getStatus() == Kernel::EPlayerStatus::Step + || this->getPlayerContext().getStatus() == Kernel::EPlayerStatus::Pause) + { + m_lastProcessTime = currentTime; + this->m_RedrawNeeded = true; + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + } + + this->updateRulerVisibility(); + return true; +} + +void CBoxAlgorithmViz::updateRulerVisibility() +{ + if (m_IsScaleVisible != m_RendererCtx->getScaleVisibility()) + { + m_IsScaleVisible = m_RendererCtx->getScaleVisibility(); + + if ((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_ScaleVisible)) != 0) != m_IsScaleVisible) + { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_ScaleVisible), gboolean(m_IsScaleVisible)); + } + + void (*action)(GtkWidget*) = m_IsScaleVisible ? gtk_widget_show : gtk_widget_hide; + (*action)(this->m_Top); + (*action)(this->m_Left); + (*action)(this->m_Right); + (*action)(this->m_Bottom); + (*action)(this->m_CornerLeft); + (*action)(this->m_CornerRight); + } +} + +void CBoxAlgorithmViz::reshape(const int width, const int height) +{ + m_Width = size_t(width); + m_Height = size_t(height); + m_RendererCtx->setAspect(float(width) / float(height)); +} + +void CBoxAlgorithmViz::preDraw() +{ + this->updateRulerVisibility(); + + if (m_TextureID == 0U) { m_TextureID = m_GtkGLWidget.createTexture(m_ColorGradient.toASCIIString()); } + glBindTexture(GL_TEXTURE_1D, m_TextureID); + + m_RendererCtx->setAspect(m_Viewport->allocation.width * 1.F / m_Viewport->allocation.height); +} + +void CBoxAlgorithmViz::postDraw() + +{ + glPushAttrib(GL_ALL_ATTRIB_BITS); + if (m_Ruler != nullptr) { m_Ruler->doRender(); } + glPopAttrib(); + + if (m_IsVideoOutputEnabled && m_IsVideoOutputWorking && m_Width > 0 && m_Height > 0) + { + // Builds up filename to save PNG to + char filename[1024]; + sprintf(filename, m_FrameFilenameFormat.toASCIIString(), ++m_FrameId); + + // Reads OpenGL buffer and stores it to a cairo surface + cairo_surface_t* cairoSurface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, int(m_Width), int(m_Height)); + glReadPixels(0, 0, GLsizei(m_Width), GLsizei(m_Height), GL_BGRA, GL_UNSIGNED_BYTE, cairo_image_surface_get_data(cairoSurface)); + + // OpenGL buffers are defined bottom to top while PNG are defined top to bottom, this flips the acquired image + const size_t size = 4; // should be 3 + std::vector swaps(m_Width * size); + unsigned char* swap = &swaps[0]; + unsigned char* src1 = cairo_image_surface_get_data(cairoSurface); + unsigned char* src2 = cairo_image_surface_get_data(cairoSurface) + m_Width * (m_Height - 1) * size; + for (size_t i = 0; i < m_Height / 2; ++i) + { + memcpy(swap, src1, m_Width * size); + memcpy(src1, src2, m_Width * size); + memcpy(src2, swap, m_Width * size); + src1 += m_Width * size; + src2 -= m_Width * size; + } + + // Pixels are ready to save + cairo_surface_write_to_png(cairoSurface, filename); + cairo_surface_destroy(cairoSurface); + } +} + +void CBoxAlgorithmViz::mouseButton(const int x, const int y, const int button, const int status) +{ + // Mouse interacts with local renderer context + // m_MouseHandler.mouseButton(*m_rendererCtx, x, y, button, status); + // Mouse interacts with global renderer context + m_MouseHandler.mouseButton(getContext(), x, y, button, status); + this->redraw(); +} + +void CBoxAlgorithmViz::mouseMotion(const int x, const int y) +{ + // Mouse interacts with local renderer context + // m_MouseHandler.mouseMotion(*m_rendererCtx, x, y); + // Mouse interacts with global renderer context + m_MouseHandler.mouseMotion(getContext(), x, y); + if (m_MouseHandler.hasButtonPressed()) { this->redraw(); } +} + +void CBoxAlgorithmViz::keyboard(const int x, const int y, const size_t key, const bool status) +{ + std::cout << "keyboard : x=" << x << " y=" << y << " key=" << key << " status=" << (status ? "pressed" : "released"); +} + +void CBoxAlgorithmViz::parseColor(color_t& rColor, const std::string& sColor) +{ + float r, g, b; + if (sscanf(sColor.c_str(), "%f,%f,%f", &r, &g, &b) == 3) + { + rColor.r = r * .01F; + rColor.g = g * .01F; + rColor.b = b * .01F; + } + else + { + rColor.r = 1; + rColor.g = 1; + rColor.b = 1; + } +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mCBoxAlgorithmViz.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mCBoxAlgorithmViz.hpp new file mode 100644 index 0000000..171b479 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mCBoxAlgorithmViz.hpp @@ -0,0 +1,385 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#pragma once + +#include "m_defines.hpp" + +#include +#include +#include + +#include + +#include + +#include "mTGtkGLWidget.hpp" +#include "mCMouse.hpp" + +#include "mIRuler.hpp" + +#include +#include +#include +#include +#include + +namespace OpenViBE { +namespace AdvancedVisualization { +enum EParameter +{ + // Parameter + P_None, + + // Input + I_Matrix, I_Signal, I_Spectrum, I_TimeFrequency, I_Covariance, I_Stimulations, + + // Setting + S_ChannelLocalisation, S_TemporalCoherence, S_TimeScale, S_ElementCount, S_DataScale, S_Caption, S_DataPositive, + S_Translucency, S_FlowerRingCount, S_Color, S_ColorGradient, S_ShowAxis, S_XYZPlotHasDepth, + + // Flag + F_CanAddInput, F_FixedChannelOrder, F_FixedChannelSelection, F_Unstable +}; + +class CParameterSet +{ +public: + + explicit CParameterSet(int p, ...) + { + va_list args; + va_start(args, p); + while (p != P_None) + { + m_parameters.push_back(p); + p = va_arg(args, int); + } + va_end(args); + } + + explicit operator const std::vector&() const { return m_parameters; } + +protected: + + std::vector m_parameters; +}; + +class CBoxAlgorithmViz : public Toolkit::TBoxAlgorithm +{ +public: + + typedef struct + { + float r, g, b; + } color_t; + + CBoxAlgorithmViz(const CIdentifier& classID, const std::vector& parameters) + : m_ClassID(classID), m_Parameters(parameters), m_MouseHandler(*this) + { + m_Color.r = 1; + m_Color.g = 1; + m_Color.b = 1; + } + + void release() override { delete this; } + + uint64_t getClockFrequency() override { return (32LL << 32); } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t /*index*/) override { return true; } + bool processClock(Kernel::CMessageClock& msg) override; + + virtual void redrawTopLevelWindow(const bool immediate = false) { m_GtkGLWidget.redrawTopLevelWindow(immediate); } + + virtual void redraw(const bool immediate = false) + { + const uint64_t currentTime = System::Time::zgetTime(); + if (m_RedrawNeeded || currentTime - m_LastRenderTime > ((1LL << 32) / 16)) + { + // immediate |= (currentTime - m_lastRenderTime > ((1LL<<32)/4)); + m_GtkGLWidget.redraw(immediate); + m_GtkGLWidget.redrawLeft(immediate); + m_GtkGLWidget.redrawRight(immediate); + m_GtkGLWidget.redrawBottom(immediate); + m_LastRenderTime = currentTime; + m_RedrawNeeded = false; + } + } + + virtual void updateRulerVisibility(); + virtual void reshape(int width, int height); + virtual void preDraw(); + virtual void postDraw(); + virtual void draw() { } + virtual void drawLeft() { if (m_Ruler != nullptr) { m_Ruler->doRenderLeft(m_Left); } } + virtual void drawRight() { if (m_Ruler != nullptr) { m_Ruler->doRenderRight(m_Right); } } + virtual void drawBottom() { if (m_Ruler != nullptr) { m_Ruler->doRenderBottom(m_Bottom); } } + virtual void mouseButton(int x, int y, int button, int status); + virtual void mouseMotion(int x, int y); + virtual void keyboard(int x, int y, size_t key, bool status); + +protected: + + static void parseColor(color_t& rColor, const std::string& sColor); + +public: + + CIdentifier m_ClassID = CIdentifier::undefined(); + std::vector m_Parameters; + uint64_t m_lastProcessTime = 0; + + TGtkGLWidget m_GtkGLWidget; + std::map m_ChannelPositions; + + CRendererContext* m_RendererCtx = nullptr; + CRendererContext* m_SubRendererCtx = nullptr; + IRuler* m_Ruler = nullptr; + CMouse m_MouseHandler; + + CString m_Localisation; + ETemporalCoherence m_TemporalCoherence = ETemporalCoherence::TimeLocked; + uint64_t m_TimeScale = 0; + size_t m_NElement = 0; + double m_DataScale = 0.0; + CString m_Caption; + uint32_t m_TextureID = 0; + size_t m_NFlowerRing = 0; + double m_Translucency = 0.0; + CString m_ColorGradient; + bool m_ShowAxis = false; + bool m_XYZPlotHasDepth = false; + bool m_IsPositive = false; + bool m_IsTimeLocked = false; + bool m_IsScaleVisible = false; + std::vector m_Colors; + color_t m_Color; + + CIdentifier m_TypeID = CIdentifier::undefined(); + uint64_t m_Time1 = 0; + uint64_t m_Time2 = 0; + + float m_fastForwardMaxFactorHD = 0.0; + float m_fastForwardMaxFactorLD = 0.0; + + std::vector m_Swaps; + + GtkBuilder* m_Builder = nullptr; + + GtkWidget* m_Viewport = nullptr; + GtkWidget* m_Top = nullptr; + GtkWidget* m_Left = nullptr; + GtkWidget* m_Right = nullptr; + GtkWidget* m_Bottom = nullptr; + GtkWidget* m_CornerLeft = nullptr; + GtkWidget* m_CornerRight = nullptr; + + GtkWidget* m_TimeScaleW = nullptr; + GtkWidget* m_nElementW = nullptr; + GtkWidget* m_ERPRange = nullptr; + GtkWidget* m_ERPPlayerButton = nullptr; + GtkWidget* m_ERPPlayer = nullptr; + GtkWidget* m_ScaleVisible = nullptr; + GtkWidget* m_FrequencyBandMin = nullptr; + GtkWidget* m_FrequencyBandMax = nullptr; + + GtkTreeView* m_ChannelTreeView = nullptr; + GtkListStore* m_ChannelListStore = nullptr; + + size_t m_Width = 0; + size_t m_Height = 0; + + bool m_RebuildNeeded = false; + bool m_RefreshNeeded = false; + bool m_RedrawNeeded = false; + uint64_t m_LastRenderTime = 0; + + bool m_IsVideoOutputEnabled = false; // for video output + bool m_IsVideoOutputWorking = false; + size_t m_FrameId = 0; + CString m_FrameFilenameFormat; + +private: + VisualizationToolkit::IVisualizationContext* m_visualizationCtx = nullptr; +}; + +class CBoxAlgorithmVizListener : public Toolkit::TBoxListener +{ +public: + + explicit CBoxAlgorithmVizListener(const std::vector& parameters) : m_Parameters(parameters) { } + + size_t getBaseSettingCount() + { + size_t result = 0; + for (const auto& p : m_Parameters) + { + // if(p == I_Matrix) { result++; } + // if(p == I_Signal) { result++; } + // if(p == I_Spectrum) { result++; } + // if(p == I_Covariance) { result++; } + // if(p == I_Stimulations) { result++; } + if (p == S_ChannelLocalisation) { result++; } + if (p == S_TemporalCoherence) { result++; } + if (p == S_TimeScale) { result++; } + if (p == S_ElementCount) { result++; } + if (p == S_DataScale) { result++; } + if (p == S_Caption) { result++; } + if (p == S_DataPositive) { result++; } + if (p == S_Translucency) { result++; } + if (p == S_FlowerRingCount) { result++; } + if (p == S_Color) { result++; } + if (p == S_ColorGradient) { result++; } + if (p == S_ShowAxis) { result++; } + if (p == S_XYZPlotHasDepth) { result++; } + // if(p == F_CanAddInput) { result++; } + // if(p == F_FixedChannelOrder) { result++; } + // if(p == F_FixedChannelSelection) { result++; } + } + return result; + } + + bool onInitialized(Kernel::IBox& /*box*/) override + { +#ifdef TARGET_OS_Windows + //box.addAttribute(OV_AttributeId_Box_DocumentationURLBase, OpenViBE::CString("${Path_Root}/doc/Mensia Advanced Visualization Toolkit/Mensia Advanced Visualization Toolkit.chm::")); +#endif + return true; + } + + bool onDefaultInitialized(Kernel::IBox& box) override + { + const bool isSignal = (std::find(m_Parameters.begin(), m_Parameters.end(), I_Signal) != m_Parameters.end()); + const bool isSpectrum = (std::find(m_Parameters.begin(), m_Parameters.end(), I_Spectrum) != m_Parameters.end()); + const bool isCovariance = (std::find(m_Parameters.begin(), m_Parameters.end(), I_Covariance) != m_Parameters.end()); + CIdentifier typeID = CIdentifier::undefined(); + + for (size_t i = 0; i < box.getInputCount(); ++i) + { + box.getInputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) + { + if (isSignal) { box.setInputType(i, OV_TypeId_Signal); } + if (isSpectrum) { box.setInputType(i, OV_TypeId_Spectrum); } + if (isCovariance) { box.setInputType(i, OV_TypeId_CovarianceMatrix); } + } + } + return true; + } + + _IsDerivedFromClass_Final_(OpenViBE::Toolkit::TBoxListener, OpenViBE::CIdentifier::undefined()) + + std::vector m_Parameters; +}; + +class CBoxAlgorithmVizDesc : public Plugins::IBoxAlgorithmDesc +{ +public: + + CString m_Name; + CString m_CategoryName; + CString m_ShortDesc; + CString m_DetailedDesc; + CIdentifier m_DescClassID = CIdentifier::undefined(); + CIdentifier m_ClassID = CIdentifier::undefined(); + CString m_AddedSoftwareVersion; + CString m_UpdatedSoftwareVersion; + std::vector m_Parameters; + + CBoxAlgorithmVizDesc(const CString& name, const CIdentifier& descClassID, const CIdentifier& classID, + const CString& addedSoftwareVersion, const CString& updatedSoftwareVersion, + const CParameterSet& parameterSet, const CString& shortDesc, const CString& detailedDesc) + : m_ShortDesc(shortDesc), m_DetailedDesc(detailedDesc), m_DescClassID(descClassID), m_ClassID(classID), + m_AddedSoftwareVersion(addedSoftwareVersion), m_UpdatedSoftwareVersion(updatedSoftwareVersion), m_Parameters(parameterSet) + { + const std::string fullname(name.toASCIIString()); + const size_t i = fullname.rfind('/'); + if (i != std::string::npos) + { + m_Name = CString(fullname.substr(i + 1).c_str()); + m_CategoryName = CString(fullname.substr(0, i).c_str()); + } + else + { + m_Name = CString(name); + m_CategoryName = CString(""); + } + } + + void release() override { } + + CString getName() const override { return m_Name; } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("Mensia Technologies SA"); } + CString getShortDescription() const override { return m_ShortDesc; } + CString getDetailedDescription() const override { return m_DetailedDesc; } + // virtual OpenViBE::CString getCategory() const { return OpenViBE::CString(""); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return "openvibe-designer"; } + CString getAddedSoftwareVersion() const override { return m_AddedSoftwareVersion; } + CString getUpdatedSoftwareVersion() const override { return m_UpdatedSoftwareVersion; } + CString getStockItemName() const override { return CString("gtk-find"); } + CIdentifier getCreatedClass() const override { return m_ClassID; } + + void releaseBoxListener(Plugins::IBoxListener* listener) const override { delete listener; } + + bool hasFunctionality(const Plugins::EPluginFunctionality functionality) const override + { + return functionality == Plugins::EPluginFunctionality::Visualization; + } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + for (auto p : m_Parameters) + { + if (p == I_Matrix) { prototype.addInput("Matrix", OV_TypeId_StreamedMatrix); } + if (p == I_Signal) { prototype.addInput("Matrix", OV_TypeId_StreamedMatrix); } // This is later changed in the listener + if (p == I_Spectrum) { prototype.addInput("Matrix", OV_TypeId_StreamedMatrix); } // This is later changed in the listener + if (p == I_TimeFrequency) { prototype.addInput("Matrix", OV_TypeId_TimeFrequency); } // This is later changed in the listener + if (p == I_Covariance) { prototype.addInput("Matrix", OV_TypeId_StreamedMatrix); } // This is later changed in the listener + if (p == I_Stimulations) { prototype.addInput("Markers", OV_TypeId_Stimulations); } + if (p == S_ChannelLocalisation + ) + { + prototype.addSetting("Channel Localisation", OV_TypeId_Filename, "${AdvancedViz_ChannelLocalisation}"); + } // "../share/electrode_sets/electrode_set_standard_cartesian.txt" + if (p == S_DataPositive) { prototype.addSetting("Positive Data Only ?", OV_TypeId_Boolean, "false"); } + if (p == S_TemporalCoherence) { prototype.addSetting("Temporal Coherence", OVP_TypeId_TemporalCoherence, "Time Locked"); } + if (p == S_TimeScale) { prototype.addSetting("Time Scale", OV_TypeId_Float, "20"); } + if (p == S_ElementCount) { prototype.addSetting("Matrix Count", OV_TypeId_Integer, "50"); } + if (p == S_DataScale) { prototype.addSetting("Gain", OV_TypeId_Float, "1"); } + if (p == S_Caption) { prototype.addSetting("Caption", OV_TypeId_String, ""); } + if (p == S_FlowerRingCount) { prototype.addSetting("Flower Ring Count", OV_TypeId_Integer, "1"); } + if (p == S_Translucency) { prototype.addSetting("Translucency", OV_TypeId_Float, "1"); } + if (p == S_ShowAxis) { prototype.addSetting("Show Axis", OV_TypeId_Boolean, "true"); } + if (p == S_XYZPlotHasDepth) { prototype.addSetting("Use third channel as depth", OV_TypeId_Boolean, "false"); } // XYZ Plot + if (p == S_Color) { prototype.addSetting("Color", OV_TypeId_Color, "${AdvancedViz_DefaultColor}"); } + if (p == S_ColorGradient) { prototype.addSetting("Color", OV_TypeId_ColorGradient, "${AdvancedViz_DefaultColorGradient}"); } + if (p == F_CanAddInput) { prototype.addFlag(Kernel::BoxFlag_CanAddInput); } + if (p == F_FixedChannelOrder) {} // prototype.addFlag(OpenViBE::Kernel::BoxFlag_); + if (p == F_FixedChannelSelection) {} // prototype.addFlag(OpenViBE::Kernel::BoxFlag_); + } + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + return true; + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mCMouse.cpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mCMouse.cpp new file mode 100644 index 0000000..bd8a82f --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mCMouse.cpp @@ -0,0 +1,66 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include "mCMouse.hpp" +#include "mCBoxAlgorithmViz.hpp" + +#include + +namespace OpenViBE { +namespace AdvancedVisualization { + +void CMouse::mouseButton(CRendererContext& ctx, const int x, const int y, const int button, const int status) +{ + m_Buttons[button] = status; + + if (m_Buttons[1] == 2) + { + ctx.setScaleVisibility(!ctx.getScaleVisibility()); + m_BoxAlgorithmViz.redrawTopLevelWindow(); + } + + m_X = x; + m_Y = y; +} + +void CMouse::mouseMotion(CRendererContext& ctx, const int x, const int y) +{ + if (m_Buttons[3]) { ctx.scaleBy(powf(.99F, float(y - m_Y))); } + if (m_Buttons[2]) { ctx.zoomBy(powf(.99F, float(y - m_Y))); } + if (m_Buttons[1]) + { + ctx.rotateByY(float(x - m_X) * .1F); + ctx.rotateByX(float(y - m_Y) * .1F); + } + + m_X = x; + m_Y = y; +} + +bool CMouse::hasButtonPressed() + +{ + for (const auto& button : m_Buttons) { if (button.second) { return true; } } + return false; +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mCMouse.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mCMouse.hpp new file mode 100644 index 0000000..84502e1 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mCMouse.hpp @@ -0,0 +1,48 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#pragma once + +#include + +#include + +namespace OpenViBE { +namespace AdvancedVisualization { +class CBoxAlgorithmViz; + +class CMouse +{ +public: + + explicit CMouse(CBoxAlgorithmViz& boxAlgorithmViz) : m_BoxAlgorithmViz(boxAlgorithmViz) { } + void mouseButton(CRendererContext& ctx, const int x, const int y, const int button, const int status); + void mouseMotion(CRendererContext& ctx, const int x, const int y); + bool hasButtonPressed(); + + + CBoxAlgorithmViz& m_BoxAlgorithmViz; + std::map m_Buttons; + int m_X = 0; + int m_Y = 0; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mIRuler.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mIRuler.hpp new file mode 100644 index 0000000..73d326b --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mIRuler.hpp @@ -0,0 +1,107 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include + +#include + +#if defined TARGET_OS_Windows +#include +#endif + +#include +#include + +#include +#include +#include + +#define IRuler_SplitCount 5 + +namespace OpenViBE { +namespace AdvancedVisualization { +class IRuler +{ +public: + + IRuler() { } + IRuler(const IRuler&) = delete; + virtual ~IRuler() = default; + + virtual void setRendererContext(const CRendererContext* ctx) { m_rendererCtx = ctx; } + virtual void setRenderer(const IRenderer* renderer) { m_renderer = renderer; } + + virtual void doRender() { this->render(); } + virtual void doRenderLeft(GtkWidget* widget) { if (m_rendererCtx->getScaleVisibility()) { this->renderLeft(widget); } } + virtual void doRenderRight(GtkWidget* widget) { if (m_rendererCtx->getScaleVisibility()) { this->renderRight(widget); } } + virtual void doRenderBottom(GtkWidget* widget) { if (m_rendererCtx->getScaleVisibility()) { this->renderBottom(widget); } } + +protected: + + virtual void render() { } + virtual void renderLeft(GtkWidget* /*widget*/) { } + virtual void renderRight(GtkWidget* /*widget*/) { } + virtual void renderBottom(GtkWidget* /*widget*/) { } + + std::vector splitRange(const double start, const double stop, const size_t count = 10) const + { + std::vector res; + const double range = stop - start; + const double order = floor(log(range) / log(10.) - .1F); + double step = pow(10, order); + double nStep = trunc(range / step); + + while (nStep < count) + { + nStep *= 2; + step /= 2; + } + while (nStep > count) + { + nStep /= 2; + step *= 2; + } + + double value = trunc(start / step) * step; + while (value < start) { value += step; } + while (value <= stop) + { + res.push_back(std::abs(value) < std::abs(range / 1000) ? 0 : value); + value += step; + } + return res; + } + + static std::string getLabel(const double v) + { + char label[1024]; + (fabs(v) < 1E-10) ? sprintf(label, "0") : sprintf(label, "%g", v); + return label; + } + + const CRendererContext* m_rendererCtx = nullptr; + const IRenderer* m_renderer = nullptr; + float m_blackAlpha = 0.9F; + float m_whiteAlpha = 1.0F; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTBoxAlgorithmContinuousViz.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTBoxAlgorithmContinuousViz.hpp new file mode 100644 index 0000000..83862e1 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTBoxAlgorithmContinuousViz.hpp @@ -0,0 +1,314 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#pragma once + +#include "mCBoxAlgorithmViz.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +template +class TBoxAlgorithmContinuousViz final : public CBoxAlgorithmViz +{ +public: + + TBoxAlgorithmContinuousViz(const CIdentifier& classID, const std::vector& parameters); + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(CBoxAlgorithmViz, m_ClassID) + + Toolkit::TStreamedMatrixDecoder> m_oMatrixDecoder; + Toolkit::TStimulationDecoder> m_oStimulationDecoder; + TRendererFactoryClass m_RendererFactory; + IRenderer* m_Renderer = nullptr; + +protected: + + void draw() override; +}; + +class CBoxAlgorithmContinuousVizListener final : public CBoxAlgorithmVizListener +{ +public: + + explicit CBoxAlgorithmContinuousVizListener(const std::vector& parameters) : CBoxAlgorithmVizListener(parameters) { } + + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(index, typeID); + if (!this->getTypeManager().isDerivedFromStream(typeID, OV_TypeId_StreamedMatrix)) { box.setInputType(index, OV_TypeId_StreamedMatrix); } + box.setInputType(1, OV_TypeId_Stimulations); + return true; + } +}; + +template +class TBoxAlgorithmContinuousVizDesc final : public CBoxAlgorithmVizDesc +{ +public: + + TBoxAlgorithmContinuousVizDesc(const CString& name, const CIdentifier& descClassID, const CIdentifier& classID, + const CString& addedSoftwareVersion, const CString& updatedSoftwareVersion, + const CParameterSet& parameterSet, const CString& shortDesc, const CString& detailedDesc) + : CBoxAlgorithmVizDesc(name, descClassID, classID, addedSoftwareVersion, updatedSoftwareVersion, parameterSet, shortDesc, detailedDesc) { } + + Plugins::IPluginObject* create() override { return new TBoxAlgorithmContinuousViz(m_ClassID, m_Parameters); } + Plugins::IBoxListener* createBoxListener() const override { return new CBoxAlgorithmContinuousVizListener(m_Parameters); } + CString getCategory() const override { return CString("Advanced Visualization/") + m_CategoryName; } + + _IsDerivedFromClass_Final_(OpenViBE::Plugins::IBoxAlgorithmDesc, m_DescClassID) +}; + +template +TBoxAlgorithmContinuousViz::TBoxAlgorithmContinuousViz( + const CIdentifier& classID, const std::vector& parameters) : CBoxAlgorithmViz(classID, parameters) { } + +template +bool TBoxAlgorithmContinuousViz::initialize() +{ + const bool res = CBoxAlgorithmViz::initialize(); + + m_oMatrixDecoder.initialize(*this, 0); + m_oStimulationDecoder.initialize(*this, 1); + + m_Renderer = m_RendererFactory.create(); + + m_Ruler = new TRulerClass; + m_Ruler->setRendererContext(m_RendererCtx); + m_Ruler->setRenderer(m_Renderer); + + return res; +} + +template +bool TBoxAlgorithmContinuousViz::uninitialize() +{ + m_RendererFactory.release(m_Renderer); + m_Renderer = nullptr; + + delete m_Ruler; + m_Ruler = nullptr; + + m_oStimulationDecoder.uninitialize(); + m_oMatrixDecoder.uninitialize(); + + return CBoxAlgorithmViz::uninitialize(); +} + +template +bool TBoxAlgorithmContinuousViz::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_oMatrixDecoder.decode(i); + + CMatrix* matrix = m_oMatrixDecoder.getOutputMatrix(); + size_t nChannel = matrix->getDimensionSize(0); + size_t nSample = matrix->getDimensionSize(1); + + if (nChannel == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Input stream " << i << " has 0 channels\n"; + return false; + } + + if (matrix->getDimensionCount() == 1) + { + nChannel = matrix->getDimensionSize(0); + nSample = 1; + } + + if (m_oMatrixDecoder.isHeaderReceived()) + { + GtkTreeIter gtkTreeIt; + gtk_list_store_clear(m_ChannelListStore); + + m_Swaps.resize(size_t(nChannel)); + + m_RendererCtx->clear(); + m_RendererCtx->setTranslucency(float(m_Translucency)); + m_RendererCtx->setFlowerRingCount(m_NFlowerRing); + m_RendererCtx->setTimeScale(m_TimeScale); + m_RendererCtx->setElementCount(m_NElement); + m_RendererCtx->scaleBy(float(m_DataScale)); + m_RendererCtx->setAxisDisplay(m_ShowAxis); + m_RendererCtx->setPositiveOnly(m_IsPositive); + m_RendererCtx->setParentRendererContext(&getContext()); + m_RendererCtx->setTimeLocked(m_IsTimeLocked); + m_RendererCtx->setXYZPlotDepth(m_XYZPlotHasDepth); + + gtk_tree_view_set_model(m_ChannelTreeView, nullptr); + for (size_t j = 0; j < nChannel; ++j) + { + std::string name = trim(matrix->getDimensionLabel(0, j)); + std::string subname = name; + std::transform(name.begin(), name.end(), subname.begin(), tolower); + const CVertex v = m_ChannelPositions[subname]; + + if (name.empty()) { name = "Channel " + std::to_string(j + 1); } + + m_RendererCtx->addChannel(name, v.x, v.y, v.z); + gtk_list_store_append(m_ChannelListStore, >kTreeIt); + gtk_list_store_set(m_ChannelListStore, >kTreeIt, 0, j + 1, 1, name.c_str(), -1); + } + gtk_tree_view_set_model(m_ChannelTreeView, GTK_TREE_MODEL(m_ChannelListStore)); + gtk_tree_selection_select_all(gtk_tree_view_get_selection(m_ChannelTreeView)); + + m_Renderer->setChannelCount(nChannel); + + if (m_TypeID == OV_TypeId_Signal) { m_RendererCtx->setDataType(CRendererContext::EDataType::Signal); } + else if (m_TypeID == OV_TypeId_Spectrum) { m_RendererCtx->setDataType(CRendererContext::EDataType::Spectrum); } + else { m_RendererCtx->setDataType(CRendererContext::EDataType::Matrix); } + + if (nSample != 1) + { + //bool warned = false; + if (m_TypeID == OV_TypeId_Spectrum) + { + //warned = true; + this->getLogManager() << Kernel::LogLevel_Warning << "Input matrix has 'spectrum' type\n"; + this->getLogManager() << Kernel::LogLevel_Warning << "Such configuration is uncommon for a 'continous' kind of visualization !\n"; + this->getLogManager() << Kernel::LogLevel_Warning << + "You might want to consider the 'stacked' kind of visualization for time/frequency analysis for instance\n"; + this->getLogManager() << Kernel::LogLevel_Warning << "Please double check your scenario\n"; + } + else + { + if (!m_RendererCtx->isTimeLocked()) + { + //warned = true; + this->getLogManager() << Kernel::LogLevel_Warning << "Input matrix has " << nSample + << " elements and the box settings say the elements are independant with " << m_NElement << " elements to render\n"; + this->getLogManager() << Kernel::LogLevel_Warning << + "Such configuration is uncommon for a 'continous' kind of visualization !\n"; + this->getLogManager() << Kernel::LogLevel_Warning << "You might want either of the following alternative :\n"; + this->getLogManager() << Kernel::LogLevel_Warning << " - an 'instant' kind of visualization to highlight the " << m_NElement + << " elements of the matrix\n"; + this->getLogManager() << Kernel::LogLevel_Warning << + " - a 'time locked' kind of elements (thus the scenario must refresh the matrix on a regular basis)\n"; + this->getLogManager() << Kernel::LogLevel_Warning << "Please double check your scenario and box settings\n"; + } + } + } + + m_RebuildNeeded = true; + m_RefreshNeeded = true; + m_RedrawNeeded = true; + } + if (m_oMatrixDecoder.isBufferReceived()) + { + m_Time1 = m_Time2; + m_Time2 = boxContext.getInputChunkEndTime(0, i); + const uint64_t duration = (m_Time2 - m_Time1) / nSample; + if ((duration & ~0xf) != (m_RendererCtx->getSampleDuration() & ~0xf) && duration != 0) // 0xf mask avoids rounding errors + { + m_RendererCtx->setSampleDuration(duration); + } + m_RendererCtx->setSpectrumFrequencyRange( + size_t((uint64_t(nSample) << 32) / (boxContext.getInputChunkEndTime(0, i) - boxContext.getInputChunkStartTime(0, i)))); + m_RendererCtx->setMinimumSpectrumFrequency(size_t(gtk_spin_button_get_value(GTK_SPIN_BUTTON(m_FrequencyBandMin)))); + m_RendererCtx->setMaximumSpectrumFrequency(size_t(gtk_spin_button_get_value(GTK_SPIN_BUTTON(m_FrequencyBandMax)))); + + // Feed renderer with actual samples + for (size_t j = 0; j < nSample; ++j) + { + for (size_t k = 0; k < nChannel; ++k) { m_Swaps[k] = float(matrix->getBuffer()[k * nSample + j]); } + m_Renderer->feed(&m_Swaps[0]); + } + + // Adjust feeding depending on theoretical dates + if (m_RendererCtx->isTimeLocked() && m_RendererCtx->getSampleDuration()) + { + const auto nTheoreticalSample = size_t(m_Time2 / m_RendererCtx->getSampleDuration()); + if (nTheoreticalSample > m_Renderer->getHistoryCount()) { m_Renderer->prefeed(nTheoreticalSample - m_Renderer->getHistoryCount()); } + } + + m_RefreshNeeded = true; + m_RedrawNeeded = true; + } + } + + const size_t nInput = this->getStaticBoxContext().getInputCount(); + if (nInput > 1) + { + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + m_oStimulationDecoder.decode(i); + if (m_oStimulationDecoder.isBufferReceived()) + { + IStimulationSet* stimulationSet = m_oStimulationDecoder.getOutputStimulationSet(); + for (size_t j = 0; j < stimulationSet->getStimulationCount(); ++j) + { + m_Renderer->feed(stimulationSet->getStimulationDate(j), stimulationSet->getStimulationIdentifier(j)); + m_RedrawNeeded = true; + } + } + } + } + + size_t rendererSampleCount = 0; + if (m_RendererCtx->isTimeLocked()) + { + if (0 != m_RendererCtx->getSampleDuration()) { rendererSampleCount = size_t(m_RendererCtx->getTimeScale() / m_RendererCtx->getSampleDuration()); } + } + else + { + rendererSampleCount = size_t(m_RendererCtx->getElementCount()); // *nSample; + } + + if (rendererSampleCount != 0 && rendererSampleCount != m_Renderer->getSampleCount()) + { + m_Renderer->setSampleCount(rendererSampleCount); + m_RebuildNeeded = true; + m_RefreshNeeded = true; + m_RedrawNeeded = true; + } + + if (m_RebuildNeeded) { m_Renderer->rebuild(*m_RendererCtx); } + if (m_RefreshNeeded) { m_Renderer->refresh(*m_RendererCtx); } + if (m_RedrawNeeded) { this->redraw(); } + + m_RebuildNeeded = false; + m_RefreshNeeded = false; + m_RedrawNeeded = false; + + return true; +} + +template +void TBoxAlgorithmContinuousViz::draw() + +{ + CBoxAlgorithmViz::preDraw(); + + glPushAttrib(GL_ALL_ATTRIB_BITS); + glColor4f(m_Color.r, m_Color.g, m_Color.b, m_RendererCtx->getTranslucency()); + m_Renderer->render(*m_RendererCtx); + glPopAttrib(); + + CBoxAlgorithmViz::postDraw(); +} +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTBoxAlgorithmInstantLoretaViz.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTBoxAlgorithmInstantLoretaViz.hpp new file mode 100644 index 0000000..1361afe --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTBoxAlgorithmInstantLoretaViz.hpp @@ -0,0 +1,123 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#pragma once + +#include "mTBoxAlgorithmInstantViz.hpp" +#include + +namespace OpenViBE { +namespace AdvancedVisualization { +template +class TBoxAlgorithmInstantLoretaViz final : public TBoxAlgorithmInstantViz +{ +public: + + TBoxAlgorithmInstantLoretaViz(const CIdentifier& classID, const std::vector& parameters) + : TBoxAlgorithmInstantViz(classID, parameters) { } + + static void callback(GtkTreeSelection* selection, TBoxAlgorithmInstantLoretaViz* box) + { + box->regionSelectionChanged(selection); + } + + void regionSelectionChanged(GtkTreeSelection* pTreeSelection) + { + m_Renderer->clearRegionSelection(); + + GtkTreeIter iter; + + char* value = nullptr; + for (size_t i = 0; i < 3; ++i) + { + GtkTreeSelection* selection = gtk_tree_view_get_selection(m_LookupTreeView[i]); + + if (selection == pTreeSelection) + { + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_LookupListStore[i]), &iter)) + { + do + { + if (gtk_tree_selection_iter_is_selected(selection, &iter)) + { + gtk_tree_model_get(GTK_TREE_MODEL(m_LookupListStore[i]), &iter, 0, &value, -1); + m_Renderer->selectRegion(i, value); + } + } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(m_LookupListStore[i]), &iter)); + } + } + else { gtk_tree_selection_unselect_all(selection); } + } + } + + void fillRegion(GtkListStore* listStore, GtkTreeView* view, IRenderer* renderer, const size_t category) const + { + GtkTreeIter gtkTreeIter; + + gtk_list_store_clear(listStore); + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(view), GTK_SELECTION_MULTIPLE); + for (size_t i = 0; i < renderer->getRegionCount(category); ++i) + { + const char* name = m_Renderer->getRegionName(category, i); + gtk_list_store_append((listStore), >kTreeIter); + gtk_list_store_set(listStore, >kTreeIter, 0, name ? name : "", -1); + gtk_tree_selection_select_iter(gtk_tree_view_get_selection(view), >kTreeIter); + } + } + + using TBoxAlgorithmInstantViz::m_Renderers; + using TBoxAlgorithmInstantViz::m_Builder; + + bool initialize() override + + { + TBoxAlgorithmInstantViz::initialize(); + + m_Renderer = m_Renderers[0]; + + gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(m_Builder, "expander_select"))); + gtk_widget_show(GTK_WIDGET(gtk_builder_get_object(m_Builder, "expander_select_sLORETA"))); + + m_LookupTreeView[0] = GTK_TREE_VIEW(gtk_builder_get_object(m_Builder, "expander_select_broadmann_treeview")); + m_LookupTreeView[1] = GTK_TREE_VIEW(gtk_builder_get_object(m_Builder, "expander_select_neuro_1_treeview")); + m_LookupTreeView[2] = GTK_TREE_VIEW(gtk_builder_get_object(m_Builder, "expander_select_neuro_2_treeview")); + m_LookupListStore[0] = GTK_LIST_STORE(gtk_builder_get_object(m_Builder, "liststore_select_broadmann")); + m_LookupListStore[1] = GTK_LIST_STORE(gtk_builder_get_object(m_Builder, "liststore_select_neuro_1")); + m_LookupListStore[2] = GTK_LIST_STORE(gtk_builder_get_object(m_Builder, "liststore_select_neuro_2")); + + for (size_t i = 0; i < m_Renderer->getRegionCategoryCount() && i < 3; ++i) + { + this->fillRegion(m_LookupListStore[i], m_LookupTreeView[i], m_Renderer, i); + } + + g_signal_connect(gtk_tree_view_get_selection(m_LookupTreeView[0]), "changed", G_CALLBACK(callback), this); + g_signal_connect(gtk_tree_view_get_selection(m_LookupTreeView[1]), "changed", G_CALLBACK(callback), this); + g_signal_connect(gtk_tree_view_get_selection(m_LookupTreeView[2]), "changed", G_CALLBACK(callback), this); + + return true; + } + + IRenderer* m_Renderer = nullptr; + std::array m_LookupTreeView{}; + std::array m_LookupListStore{}; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTBoxAlgorithmInstantViz.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTBoxAlgorithmInstantViz.hpp new file mode 100644 index 0000000..84721b4 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTBoxAlgorithmInstantViz.hpp @@ -0,0 +1,304 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#pragma once + +#include "mCBoxAlgorithmViz.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +template +class TBoxAlgorithmInstantViz : public CBoxAlgorithmViz +{ +public: + + TBoxAlgorithmInstantViz(const CIdentifier& classID, const std::vector& params); + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(CBoxAlgorithmViz, m_ClassID) + + TRendererFactoryClass m_RendererFactory; + + size_t m_NInput = 0; + std::vector m_Renderers; + std::vector>> m_Decoder; + + double m_LastERPFraction = 0; + +protected: + + void draw() override; +}; + +class CBoxAlgorithmInstantVizListener final : public CBoxAlgorithmVizListener +{ +public: + + explicit CBoxAlgorithmInstantVizListener(const std::vector& parameters) : CBoxAlgorithmVizListener(parameters) { } + + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(index, typeID); + if (!this->getTypeManager().isDerivedFromStream(typeID, OV_TypeId_StreamedMatrix)) { box.setInputType(index, OV_TypeId_StreamedMatrix); } + else { for (size_t i = 0; i < box.getInputCount(); ++i) { box.setInputType(i, typeID); } } + return true; + } + + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(0, typeID); + box.setInputType(index, typeID); + box.setInputName(index, "Matrix"); + box.addSetting("Color", OV_TypeId_Color, "${AdvancedViz_DefaultColor}"); + return true; + } + + bool onInputRemoved(Kernel::IBox& box, const size_t index) override + { + box.removeSetting(this->getBaseSettingCount() + index - 1); + return true; + } +}; + +template class TBoxAlgorithm = TBoxAlgorithmInstantViz> +class TBoxAlgorithmInstantVizDesc : public CBoxAlgorithmVizDesc +{ +public: + + TBoxAlgorithmInstantVizDesc(const CString& name, const CIdentifier& descClassID, const CIdentifier& classID, + const CString& addedSoftwareVersion, const CString& updatedSoftwareVersion, + const CParameterSet& parameterSet, const CString& shortDesc, const CString& detailedDesc) + : CBoxAlgorithmVizDesc(name, descClassID, classID, addedSoftwareVersion, updatedSoftwareVersion, parameterSet, shortDesc, detailedDesc) { } + + Plugins::IPluginObject* create() override { return new TBoxAlgorithm(m_ClassID, m_Parameters); } + Plugins::IBoxListener* createBoxListener() const override { return new CBoxAlgorithmInstantVizListener(m_Parameters); } + CString getCategory() const override { return CString("Advanced Visualization/") + m_CategoryName; } + + _IsDerivedFromClass_Final_(OpenViBE::Plugins::IBoxAlgorithmDesc, m_DescClassID) +}; + + +template +TBoxAlgorithmInstantViz::TBoxAlgorithmInstantViz(const CIdentifier& classID, const std::vector& params) + : CBoxAlgorithmViz(classID, params) { } + +template +bool TBoxAlgorithmInstantViz::initialize() +{ + bool res = CBoxAlgorithmViz::initialize(); + + m_LastERPFraction = 0; + + m_NInput = this->getStaticBoxContext().getInputCount(); + m_Renderers.resize(m_NInput); + m_Decoder.resize(m_NInput); + for (size_t i = 0; i < m_NInput; ++i) + { + m_Renderers[i] = m_RendererFactory.create(); + m_Decoder[i].initialize(*this, i); + if (!m_Renderers[i]) + { + this->getLogManager() << Kernel::LogLevel_Error << "Could not create renderer, it might have been disabled at compile time\n"; + res = false; + } + } + + m_Ruler = new TRulerClass; + m_Ruler->setRendererContext(m_RendererCtx); + m_Ruler->setRenderer(m_Renderers[0]); + + gtk_widget_set_sensitive(m_TimeScaleW, false); + + return res; +} + +template +bool TBoxAlgorithmInstantViz::uninitialize() +{ + for (size_t i = 0; i < m_NInput; ++i) + { + m_RendererFactory.release(m_Renderers[i]); + m_Decoder[i].uninitialize(); + } + + m_Decoder.clear(); + m_Renderers.clear(); + + return CBoxAlgorithmViz::uninitialize(); +} + +template +bool TBoxAlgorithmInstantViz::process() + +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + for (size_t i = 0; i < nInput; ++i) + { + for (size_t j = 0; j < boxContext.getInputChunkCount(i); ++j) + { + m_Decoder[i].decode(j); + + CMatrix* matrix = m_Decoder[i].getOutputMatrix(); + size_t nChannel = matrix->getDimensionSize(0); + size_t nSample = matrix->getDimensionSize(1); + + if (nChannel == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Input stream " << i << " has 0 channels\n"; + return false; + } + + if (matrix->getDimensionCount() == 1) + { + nChannel = 1; + nSample = matrix->getDimensionSize(0); + } + + if (m_Decoder[i].isHeaderReceived()) + { + // TODO + // Check dimension coherence + // Only apply renderer context when first header is received + + GtkTreeIter gtkTreeIter; + gtk_list_store_clear(m_ChannelListStore); + + m_Swaps.resize(nChannel); + + m_RendererCtx->clear(); + m_RendererCtx->setTranslucency(float(m_Translucency)); + m_RendererCtx->setFlowerRingCount(m_NFlowerRing); + // m_rendererCtx->setTimeScale(1); // Won't be used + m_RendererCtx->scaleBy(float(m_DataScale)); + m_RendererCtx->setPositiveOnly(m_IsPositive); + m_RendererCtx->setAxisDisplay(m_ShowAxis); + m_RendererCtx->setParentRendererContext(&getContext()); + m_RendererCtx->setXYZPlotDepth(m_XYZPlotHasDepth); + + gtk_tree_view_set_model(m_ChannelTreeView, nullptr); + for (j = 0; j < nChannel; ++j) + { + std::string name = trim(matrix->getDimensionLabel(0, j)); + std::string subname = name; + std::transform(name.begin(), name.end(), subname.begin(), tolower); + const CVertex v = m_ChannelPositions[subname]; + + if (name.empty()) { name = "Channel " + std::to_string(j + 1); } + + m_RendererCtx->addChannel(name, v.x, v.y, v.z); + gtk_list_store_append(m_ChannelListStore, >kTreeIter); + gtk_list_store_set(m_ChannelListStore, >kTreeIter, 0, j + 1, 1, name.c_str(), -1); + } + gtk_tree_view_set_model(m_ChannelTreeView, GTK_TREE_MODEL(m_ChannelListStore)); + gtk_tree_selection_select_all(gtk_tree_view_get_selection(m_ChannelTreeView)); + + m_Renderers[i]->setChannelCount(nChannel); + m_Renderers[i]->setSampleCount(nSample); + + if (nSample > 1 && m_TypeID != OV_TypeId_Spectrum) { gtk_widget_show(m_ERPPlayer); } + + if (m_TypeID == OV_TypeId_Signal) { m_RendererCtx->setDataType(CRendererContext::EDataType::Signal); } + else if (m_TypeID == OV_TypeId_Spectrum) { m_RendererCtx->setDataType(CRendererContext::EDataType::Spectrum); } + else { m_RendererCtx->setDataType(CRendererContext::EDataType::Matrix); } + + m_RebuildNeeded = true; + m_RefreshNeeded = true; + m_RedrawNeeded = true; + } + if (m_Decoder[i].isBufferReceived()) + { + const uint64_t chunkDuration = (boxContext.getInputChunkEndTime(i, j) - boxContext.getInputChunkStartTime(i, j)); + + m_RendererCtx->setSampleDuration(chunkDuration / nSample); + m_RendererCtx->setSpectrumFrequencyRange(size_t((uint64_t(nSample) << 32) / chunkDuration)); + m_RendererCtx->setMinimumSpectrumFrequency(size_t(gtk_spin_button_get_value(GTK_SPIN_BUTTON(m_FrequencyBandMin)))); + m_RendererCtx->setMaximumSpectrumFrequency(size_t(gtk_spin_button_get_value(GTK_SPIN_BUTTON(m_FrequencyBandMax)))); + + // Sets time scale + gtk_spin_button_set_value( + GTK_SPIN_BUTTON(gtk_builder_get_object(m_Builder, "spinbutton_time_scale")), (chunkDuration >> 22) / 1024.); + + m_Renderers[i]->clear(0); // Drop last samples as they will be fed again + for (size_t k = 0; k < nSample; ++k) + { + for (size_t l = 0; l < nChannel; ++l) { m_Swaps[l] = float(matrix->getBuffer()[l * nSample + k]); } + m_Renderers[i]->feed(&m_Swaps[0]); + } + + m_RefreshNeeded = true; + m_RedrawNeeded = true; + } + } + } + + double erpFraction = getContext().getERPFraction(); + if (m_RendererCtx->isERPPlayerActive()) + { + erpFraction += .0025; + if (erpFraction > 1) { erpFraction = 0; } + } + if (m_LastERPFraction != erpFraction) + { + gtk_range_set_value(GTK_RANGE(m_ERPRange), erpFraction); + m_LastERPFraction = erpFraction; + m_RefreshNeeded = true; + m_RedrawNeeded = true; + } + + if (m_RebuildNeeded) { for (auto& renderer : m_Renderers) { renderer->rebuild(*m_RendererCtx); } } + if (m_RefreshNeeded) { for (auto& renderer : m_Renderers) { renderer->refresh(*m_RendererCtx); } } + if (m_RedrawNeeded) { this->redraw(); } + + m_RebuildNeeded = false; + m_RefreshNeeded = false; + m_RedrawNeeded = false; + + if (m_RendererCtx->isERPPlayerActive()) { gtk_button_set_label(GTK_BUTTON(m_ERPPlayerButton), GTK_STOCK_MEDIA_PAUSE); } + else { gtk_button_set_label(GTK_BUTTON(m_ERPPlayerButton), GTK_STOCK_MEDIA_PLAY); } + + return true; +} + +template +void TBoxAlgorithmInstantViz::draw() + +{ + CBoxAlgorithmViz::preDraw(); + + for (size_t i = 0; i < m_NInput; ++i) + { + glPushAttrib(GL_ALL_ATTRIB_BITS); + if (i < m_Colors.size()) { glColor4f(m_Colors[i].r, m_Colors[i].g, m_Colors[i].b, m_RendererCtx->getTranslucency()); } + else { glColor4f(m_Color.r, m_Color.g, m_Color.b, m_RendererCtx->getTranslucency()); } + if (m_Renderers[i]) { m_Renderers[i]->render(*m_RendererCtx); } + glPopAttrib(); + } + + CBoxAlgorithmViz::postDraw(); +} +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTBoxAlgorithmStackedContinuousViz.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTBoxAlgorithmStackedContinuousViz.hpp new file mode 100644 index 0000000..0c0ff3e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTBoxAlgorithmStackedContinuousViz.hpp @@ -0,0 +1,392 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#pragma once + +#include "mCBoxAlgorithmViz.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +template +class TBoxAlgorithmStackedContinuousViz : public CBoxAlgorithmViz +{ +public: + + TBoxAlgorithmStackedContinuousViz(const CIdentifier& classID, const std::vector& parameters); + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(CBoxAlgorithmViz, m_ClassID) + + Toolkit::TStimulationDecoder> m_StimDecoder; + Toolkit::TStreamedMatrixDecoder> + m_MatrixDecoder; + + TRendererFactoryClass m_RendererFactory; + std::vector m_Renderers; + +protected: + + void draw() override; +}; + +class CBoxAlgorithmStackedContinuousVizListener final : public CBoxAlgorithmVizListener +{ +public: + + explicit CBoxAlgorithmStackedContinuousVizListener(const std::vector& parameters) : CBoxAlgorithmVizListener(parameters) { } + + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(index, typeID); + if (!this->getTypeManager().isDerivedFromStream(typeID, OV_TypeId_StreamedMatrix)) { box.setInputType(index, OV_TypeId_StreamedMatrix); } + box.setInputType(1, OV_TypeId_Stimulations); + return true; + } +}; + +template +class TBoxAlgorithmStackedContinuousVizDesc : public CBoxAlgorithmVizDesc +{ +public: + + TBoxAlgorithmStackedContinuousVizDesc(const CString& name, const CIdentifier& descClassID, + const CIdentifier& classID, const CString& addedSoftwareVersion, + const CString& updatedSoftwareVersion, const CParameterSet& parameterSet, + const CString& shortDesc, const CString& detailedDesc) + : CBoxAlgorithmVizDesc(name, descClassID, classID, addedSoftwareVersion, updatedSoftwareVersion, parameterSet, shortDesc, detailedDesc) { } + + Plugins::IPluginObject* create() override + { + return new TBoxAlgorithmStackedContinuousViz(m_ClassID, m_Parameters); + } + + Plugins::IBoxListener* createBoxListener() const override { return new CBoxAlgorithmStackedContinuousVizListener(m_Parameters); } + + CString getCategory() const override { return CString("Advanced Visualization/") + m_CategoryName; } + + _IsDerivedFromClass_Final_(OpenViBE::Plugins::IBoxAlgorithmDesc, m_DescClassID) +}; + + +template +TBoxAlgorithmStackedContinuousViz::TBoxAlgorithmStackedContinuousViz( + const CIdentifier& classID, const std::vector& parameters) : CBoxAlgorithmViz(classID, parameters) { } + +template +bool TBoxAlgorithmStackedContinuousViz::initialize() + +{ + const bool res = CBoxAlgorithmViz::initialize(); + + m_MatrixDecoder.initialize(*this, 0); + m_StimDecoder.initialize(*this, 1); + + m_RendererCtx->clear(); + m_RendererCtx->setTranslucency(float(m_Translucency)); + // m_rendererCtx->setTranslucency(m_nFlowerRing); + m_RendererCtx->scaleBy(float(m_DataScale)); + m_RendererCtx->setPositiveOnly(m_IsPositive); + m_RendererCtx->setAxisDisplay(m_ShowAxis); + m_RendererCtx->setParentRendererContext(&getContext()); + + m_SubRendererCtx->clear(); + m_SubRendererCtx->setParentRendererContext(m_RendererCtx); + + m_Ruler = new TRulerClass; + m_Ruler->setRendererContext(m_RendererCtx); + + return res; +} + +template +bool TBoxAlgorithmStackedContinuousViz::uninitialize() + +{ + for (size_t i = 0; i < m_Renderers.size(); ++i) { m_RendererFactory.release(m_Renderers[i]); } + m_Renderers.clear(); + + delete m_SubRendererCtx; + m_SubRendererCtx = nullptr; + + delete m_RendererCtx; + m_RendererCtx = nullptr; + + delete m_Ruler; + m_Ruler = nullptr; + + m_StimDecoder.uninitialize(); + m_MatrixDecoder.uninitialize(); + + return CBoxAlgorithmViz::uninitialize(); +} + +template +bool TBoxAlgorithmStackedContinuousViz::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + size_t i, j; + + for (i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_MatrixDecoder.decode(size_t(i)); + + CMatrix* matrix = m_MatrixDecoder.getOutputMatrix(); + size_t nChannel = matrix->getDimensionSize(0); + size_t nSample = matrix->getDimensionSize(1); + + if (nChannel == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Input stream " << i << " has 0 channels\n"; + return false; + } + + if (matrix->getDimensionCount() == 1) + { + nChannel = matrix->getDimensionSize(0); + nSample = 1; + } + + if (m_MatrixDecoder.isHeaderReceived()) + { + GtkTreeIter gtkTreeIter; + gtk_list_store_clear(m_ChannelListStore); + + m_Swaps.resize(nSample); + + for (j = 0; j < m_Renderers.size(); ++j) { m_RendererFactory.release(m_Renderers[j]); } + m_Renderers.clear(); + m_Renderers.resize(nChannel); + + m_SubRendererCtx->clear(); + m_SubRendererCtx->setParentRendererContext(m_RendererCtx); + m_SubRendererCtx->setTimeLocked(m_IsTimeLocked); + m_SubRendererCtx->setStackCount(nChannel); + for (j = 0; j < nSample; ++j) + { + std::string name = trim(matrix->getDimensionLabel(1, size_t(j))); + std::string subname = name; + std::transform(name.begin(), name.end(), subname.begin(), tolower); + const CVertex v = m_ChannelPositions[subname]; + m_SubRendererCtx->addChannel(name, v.x, v.y, v.z); + } + + m_RendererCtx->clear(); + m_RendererCtx->setTranslucency(float(m_Translucency)); + m_RendererCtx->setTimeScale(m_TimeScale); + m_RendererCtx->setElementCount(m_NElement); + m_RendererCtx->scaleBy(float(m_DataScale)); + m_RendererCtx->setParentRendererContext(&getContext()); + m_RendererCtx->setTimeLocked(m_IsTimeLocked); + m_RendererCtx->setXYZPlotDepth(m_XYZPlotHasDepth); + + gtk_tree_view_set_model(m_ChannelTreeView, nullptr); + for (j = 0; j < nChannel; ++j) + { + std::string name = trim(matrix->getDimensionLabel(0, size_t(j))); + std::string subname = name; + std::transform(name.begin(), name.end(), subname.begin(), tolower); + const CVertex v = m_ChannelPositions[subname]; + + if (name.empty()) { name = "Channel " + std::to_string(j + 1); } + + m_Renderers[j] = m_RendererFactory.create(); + m_Renderers[j]->setChannelCount(nSample); + m_Renderers[j]->setSampleCount(size_t(m_NElement)); // $$$ + // m_Renderers[j]->setSampleCount(size_t(m_TimeScaleW)); // $$$ + + m_RendererCtx->addChannel(name, v.x, v.y, v.z); + // m_rendererCtx->addChannel(sanitize(matrix->getDimensionLabel(0, j))); + gtk_list_store_append(m_ChannelListStore, >kTreeIter); + gtk_list_store_set(m_ChannelListStore, >kTreeIter, 0, j + 1, 1, name.c_str(), -1); + } + gtk_tree_view_set_model(m_ChannelTreeView, GTK_TREE_MODEL(m_ChannelListStore)); + gtk_tree_selection_select_all(gtk_tree_view_get_selection(m_ChannelTreeView)); + + if (m_TypeID == OV_TypeId_Signal) + { + m_RendererCtx->setDataType(CRendererContext::EDataType::Signal); + m_SubRendererCtx->setDataType(CRendererContext::EDataType::Signal); + } + else if (m_TypeID == OV_TypeId_Spectrum) + { + m_RendererCtx->setDataType(CRendererContext::EDataType::Spectrum); + m_SubRendererCtx->setDataType(CRendererContext::EDataType::Spectrum); + } + else + { + m_RendererCtx->setDataType(CRendererContext::EDataType::Matrix); + m_SubRendererCtx->setDataType(CRendererContext::EDataType::Matrix); + } + + m_Ruler->setRenderer(nChannel ? m_Renderers[0] : nullptr); + + m_RebuildNeeded = true; + m_RefreshNeeded = true; + m_RedrawNeeded = true; + } + if (m_MatrixDecoder.isBufferReceived()) + { + m_Time1 = m_Time2; + m_Time2 = boxContext.getInputChunkEndTime(0, size_t(i)); + const uint64_t interChunkDuration = m_Time2 - m_Time1; + const uint64_t chunkDuration = (boxContext.getInputChunkEndTime(0, size_t(i)) - boxContext.getInputChunkStartTime(0, size_t(i))); + const uint64_t sampleDuration = chunkDuration / m_NElement; + if (m_RendererCtx->isTimeLocked()) + { + if ((interChunkDuration & ~0xf) != (m_RendererCtx->getSampleDuration() & ~0xf) && interChunkDuration != 0 + ) // 0xf mask avoids rounding errors + { + m_SubRendererCtx->setSampleDuration(interChunkDuration); + m_RendererCtx->setSampleDuration(interChunkDuration); + } + } + else + { + m_SubRendererCtx->setSampleDuration(sampleDuration); + m_RendererCtx->setSampleDuration(sampleDuration); + } + + m_RendererCtx->setSpectrumFrequencyRange(size_t((uint64_t(nSample) << 32) / chunkDuration)); + m_RendererCtx->setMinimumSpectrumFrequency(size_t(gtk_spin_button_get_value(GTK_SPIN_BUTTON(m_FrequencyBandMin)))); + m_RendererCtx->setMaximumSpectrumFrequency(size_t(gtk_spin_button_get_value(GTK_SPIN_BUTTON(m_FrequencyBandMax)))); + + for (j = 0; j < nChannel; ++j) + { + // Feed renderer with actual samples + for (size_t k = 0; k < nSample; ++k) { m_Swaps[nSample - k - 1] = float(matrix->getBuffer()[j * nSample + k]); } + m_Renderers[j]->feed(&m_Swaps[0]); + + // Adjust feeding depending on theoretical dates + if (m_RendererCtx->isTimeLocked() && m_RendererCtx->getSampleDuration()) + { + const auto nTheoreticalSample = size_t(m_Time2 / m_RendererCtx->getSampleDuration()); + if (nTheoreticalSample > m_Renderers[j]->getHistoryCount()) + { + m_Renderers[j]->prefeed(nTheoreticalSample - m_Renderers[j]->getHistoryCount()); + } + } + } + + m_RefreshNeeded = true; + m_RedrawNeeded = true; + } + } + + if (nInput > 1) + { + for (i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + m_StimDecoder.decode(size_t(i)); + if (m_StimDecoder.isBufferReceived()) + { + IStimulationSet* stimulationSet = m_StimDecoder.getOutputStimulationSet(); + for (j = 0; j < stimulationSet->getStimulationCount(); ++j) + { + m_Renderers[0]->feed(stimulationSet->getStimulationDate(j), stimulationSet->getStimulationIdentifier(j)); + m_RedrawNeeded = true; + } + } + } + } + + size_t rendererSampleCount = 0; + if (m_RendererCtx->isTimeLocked()) + { + if (0 != m_RendererCtx->getSampleDuration()) { rendererSampleCount = size_t(m_RendererCtx->getTimeScale() / m_RendererCtx->getSampleDuration()); } + } + else { rendererSampleCount = size_t(m_RendererCtx->getElementCount()); } + + if (rendererSampleCount != 0) + { + for (j = 0; j < m_Renderers.size(); ++j) + { + if (rendererSampleCount != m_Renderers[j]->getSampleCount()) + { + m_Renderers[j]->setSampleCount(rendererSampleCount); + m_RebuildNeeded = true; + m_RefreshNeeded = true; + m_RedrawNeeded = true; + } + } + } + + if (m_RebuildNeeded) { for (auto& renderer : m_Renderers) { renderer->rebuild(*m_SubRendererCtx); } } + if (m_RefreshNeeded) { for (auto& renderer : m_Renderers) { renderer->refresh(*m_SubRendererCtx); } } + if (m_RedrawNeeded) { this->redraw(); } + + m_RebuildNeeded = false; + m_RefreshNeeded = false; + m_RedrawNeeded = false; + + return true; +} + +template +void TBoxAlgorithmStackedContinuousViz::draw() + +{ + CBoxAlgorithmViz::preDraw(); + + if (m_RendererCtx->getSelectedCount() != 0) + { + glPushMatrix(); + glScalef(1, 1.F / m_RendererCtx->getSelectedCount(), 1); + for (size_t i = 0; i < m_RendererCtx->getSelectedCount(); ++i) + { + glPushAttrib(GL_ALL_ATTRIB_BITS); + glPushMatrix(); + glColor4f(m_Color.r, m_Color.g, m_Color.b, m_RendererCtx->getTranslucency()); + glTranslatef(0, m_RendererCtx->getSelectedCount() - i - 1.F, 0); + if (!bHorizontalStack) + { + glScalef(1, -1, 1); + glRotatef(-90, 0, 0, 1); + } + m_SubRendererCtx->setAspect(m_RendererCtx->getAspect()); + m_SubRendererCtx->setStackCount(m_RendererCtx->getSelectedCount()); + m_SubRendererCtx->setStackIndex(i); + m_Renderers[m_RendererCtx->getSelected(i)]->render(*m_SubRendererCtx); + if (bDrawBorders) + { + glDisable(GL_TEXTURE_1D); + glDisable(GL_BLEND); + glColor3f(0, 0, 0); + glBegin(GL_LINE_LOOP); + glVertex2f(0, 0); + glVertex2f(1, 0); + glVertex2f(1, 1); + glVertex2f(0, 1); + glEnd(); + } + glPopMatrix(); + glPopAttrib(); + } + glPopMatrix(); + } + + CBoxAlgorithmViz::postDraw(); +} +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTBoxAlgorithmStackedInstantViz.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTBoxAlgorithmStackedInstantViz.hpp new file mode 100644 index 0000000..2654523 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTBoxAlgorithmStackedInstantViz.hpp @@ -0,0 +1,375 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#pragma once + +#include + +#include "mCBoxAlgorithmViz.hpp" + +#if defined TARGET_OS_Windows +#define snprintf _snprintf +#endif + +namespace OpenViBE { +namespace AdvancedVisualization { +template +class TBoxAlgorithmStackedInstantViz : public CBoxAlgorithmViz +{ +public: + + TBoxAlgorithmStackedInstantViz(const CIdentifier& classId, const std::vector& parameters); + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(CBoxAlgorithmViz, m_ClassID) + + Toolkit::TStimulationDecoder> m_StimDecoder; + Toolkit::TStreamedMatrixDecoder> m_MatrixDecoder; + + TRendererFactoryClass m_RendererFactory; + std::vector m_Renderers; + +protected: + + void draw() override; +}; + +class CBoxAlgorithmStackedInstantVizListener final : public CBoxAlgorithmVizListener +{ +public: + + CBoxAlgorithmStackedInstantVizListener(const std::vector& parameters) : CBoxAlgorithmVizListener(parameters) { } + + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(index, typeID); + if (!this->getTypeManager().isDerivedFromStream(typeID, OV_TypeId_TimeFrequency)) { box.setInputType(index, OV_TypeId_TimeFrequency); } + box.setInputType(1, OV_TypeId_Stimulations); + return true; + } +}; + +template +class TBoxAlgorithmStackedInstantVizDesc : public CBoxAlgorithmVizDesc +{ +public: + + TBoxAlgorithmStackedInstantVizDesc(const CString& name, const CIdentifier& descClassID, const CIdentifier& classID, + const CString& addedSoftwareVersion, const CString& updatedSoftwareVersion, + const CParameterSet& parameterSet, const CString& shortDesc, const CString& detailedDesc) + : CBoxAlgorithmVizDesc(name, descClassID, classID, addedSoftwareVersion, updatedSoftwareVersion, parameterSet, shortDesc, detailedDesc) { } + + Plugins::IPluginObject* create() override + { + return new TBoxAlgorithmStackedInstantViz(m_ClassID, m_Parameters); + } + + Plugins::IBoxListener* createBoxListener() const override { return new CBoxAlgorithmStackedInstantVizListener(m_Parameters); } + + CString getCategory() const override { return CString("Advanced Visualization/") + m_CategoryName; } + + _IsDerivedFromClass_Final_(OpenViBE::Plugins::IBoxAlgorithmDesc, m_DescClassID) +}; + + +template +TBoxAlgorithmStackedInstantViz::TBoxAlgorithmStackedInstantViz( + const CIdentifier& classId, const std::vector& parameters) + : CBoxAlgorithmViz(classId, parameters) { } + +template +bool TBoxAlgorithmStackedInstantViz::initialize() + +{ + const bool res = CBoxAlgorithmViz::initialize(); + + m_MatrixDecoder.initialize(*this, 0); + m_StimDecoder.initialize(*this, 1); + + m_RendererCtx->clear(); + m_RendererCtx->setTranslucency(float(m_Translucency)); + m_RendererCtx->scaleBy(float(m_DataScale)); + m_RendererCtx->setPositiveOnly(true); + m_RendererCtx->setAxisDisplay(m_ShowAxis); + m_RendererCtx->setParentRendererContext(&getContext()); + + m_SubRendererCtx->clear(); + m_SubRendererCtx->setParentRendererContext(m_RendererCtx); + + m_Ruler = new TRulerClass; + m_Ruler->setRendererContext(m_RendererCtx); + + CMatrix gradientMatrix; + VisualizationToolkit::ColorGradient::parse(gradientMatrix, m_ColorGradient); + for (size_t step = 0; step < gradientMatrix.getDimensionSize(1); ++step) + { + const double currentStepValue = gradientMatrix.getBuffer()[4 * step + 0]; + gradientMatrix.getBuffer()[4 * step + 0] = (currentStepValue / 100.0) * 50.0 + 50.0; + } + VisualizationToolkit::ColorGradient::format(m_ColorGradient, gradientMatrix); + + return res; +} + +template +bool TBoxAlgorithmStackedInstantViz::uninitialize() + +{ + for (size_t i = 0; i < m_Renderers.size(); ++i) { m_RendererFactory.release(m_Renderers[i]); } + m_Renderers.clear(); + + delete m_SubRendererCtx; + m_SubRendererCtx = nullptr; + + delete m_RendererCtx; + m_RendererCtx = nullptr; + + delete m_Ruler; + m_Ruler = nullptr; + + m_StimDecoder.uninitialize(); + m_MatrixDecoder.uninitialize(); + + return CBoxAlgorithmViz::uninitialize(); +} + +template +bool TBoxAlgorithmStackedInstantViz::process() + +{ + const Kernel::IBox& staticBoxContext = this->getStaticBoxContext(); + Kernel::IBoxIO& dynamicBoxContext = this->getDynamicBoxContext(); + + for (size_t chunk = 0; chunk < dynamicBoxContext.getInputChunkCount(0); ++chunk) + { + m_MatrixDecoder.decode(chunk); + + CMatrix* inputMatrix = m_MatrixDecoder.getOutputMatrix(); + const size_t nChannel = inputMatrix->getDimensionSize(0); + + if (nChannel == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Input stream " << chunk << " has 0 channels\n"; + return false; + } + + if (m_MatrixDecoder.isHeaderReceived()) + { + for (auto renderer : m_Renderers) { m_RendererFactory.release(renderer); } + m_Renderers.clear(); + m_Renderers.resize(nChannel); + + m_SubRendererCtx->clear(); + m_SubRendererCtx->setParentRendererContext(m_RendererCtx); + m_SubRendererCtx->setTimeLocked(false); + m_SubRendererCtx->setStackCount(nChannel); + m_SubRendererCtx->setPositiveOnly(true); + + + m_RendererCtx->clear(); + m_RendererCtx->setTranslucency(float(m_Translucency)); + m_RendererCtx->setTimeScale(1); + m_RendererCtx->scaleBy(float(m_DataScale)); + m_RendererCtx->setParentRendererContext(&getContext()); + m_RendererCtx->setTimeLocked(false); + m_RendererCtx->setXYZPlotDepth(false); + m_RendererCtx->setPositiveOnly(true); + + if (m_TypeID == OV_TypeId_TimeFrequency) + { + GtkTreeIter gtkTreeIter; + gtk_list_store_clear(m_ChannelListStore); + + const size_t frequencyCount = inputMatrix->getDimensionSize(1); + const size_t nSample = inputMatrix->getDimensionSize(2); + + // I do not know what this is for... + for (size_t frequency = 0; frequency < frequencyCount; ++frequency) + { + try + { + const double frequencyValue = std::stod(inputMatrix->getDimensionLabel(1, frequency), nullptr); + const int stringSize = snprintf(nullptr, 0, "%.2f", frequencyValue) + 1; + if (stringSize > 0) + { + std::unique_ptr buffer(new char[stringSize]); + snprintf(buffer.get(), size_t(stringSize), "%.2f", frequencyValue); + m_RendererCtx->setDimensionLabel(1, frequencyCount - frequency - 1, buffer.get()); + } + } + catch (...) { m_RendererCtx->setDimensionLabel(1, frequencyCount - frequency - 1, "NaN"); } + m_SubRendererCtx->addChannel("", 0, 0, 0); + } + + + m_RendererCtx->setDataType(CRendererContext::EDataType::TimeFrequency); + m_SubRendererCtx->setDataType(CRendererContext::EDataType::TimeFrequency); + + m_RendererCtx->setElementCount(nSample); + m_SubRendererCtx->setElementCount(nSample); + gtk_tree_view_set_model(m_ChannelTreeView, nullptr); + + for (size_t channel = 0; channel < nChannel; ++channel) + { + std::string channelName = trim(inputMatrix->getDimensionLabel(0, channel)); + std::string lowercaseChannelName = channelName; + std::transform(channelName.begin(), channelName.end(), lowercaseChannelName.begin(), tolower); + const CVertex v = m_ChannelPositions[lowercaseChannelName]; + + if (channelName.empty()) { channelName = "Channel " + std::to_string(channel + 1); } + + m_Renderers[channel] = m_RendererFactory.create(); + + // The channels in the sub-renderer are the frequencies in the spectrum + m_Renderers[channel]->setChannelCount(frequencyCount); + m_Renderers[channel]->setSampleCount(nSample); + + m_RendererCtx->addChannel(channelName, v.x, v.y, v.z); + gtk_list_store_append(m_ChannelListStore, >kTreeIter); + gtk_list_store_set(m_ChannelListStore, >kTreeIter, 0, channel + 1, 1, channelName.c_str(), -1); + } + gtk_tree_view_set_model(m_ChannelTreeView, GTK_TREE_MODEL(m_ChannelListStore)); + gtk_tree_selection_select_all(gtk_tree_view_get_selection(m_ChannelTreeView)); + } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Input stream type is not supported\n"; + return false; + } + + m_Ruler->setRenderer(nChannel ? m_Renderers[0] : nullptr); + + m_RebuildNeeded = true; + m_RefreshNeeded = true; + m_RedrawNeeded = true; + } + + if (m_MatrixDecoder.isBufferReceived()) + { + if (m_TypeID == OV_TypeId_TimeFrequency) + { + m_Time1 = m_Time2; + m_Time2 = dynamicBoxContext.getInputChunkEndTime(0, chunk); + + const size_t frequencyCount = inputMatrix->getDimensionSize(1); + const size_t nSample = inputMatrix->getDimensionSize(2); + + const uint64_t chunkDuration = dynamicBoxContext.getInputChunkEndTime(0, chunk) - dynamicBoxContext.getInputChunkStartTime(0, chunk); + const uint64_t sampleDuration = chunkDuration / nSample; + + m_SubRendererCtx->setSampleDuration(sampleDuration); + m_RendererCtx->setSampleDuration(sampleDuration); + + for (size_t channel = 0; channel < nChannel; ++channel) + { + // Feed renderer with actual samples + for (size_t sample = 0; sample < nSample; ++sample) + { + m_Swaps.resize(frequencyCount); + for (size_t frequency = 0; frequency < frequencyCount; ++frequency) + { + m_Swaps[frequencyCount - frequency - 1] = float( + inputMatrix->getBuffer()[sample + frequency * nSample + channel * nSample * frequencyCount]); + } + m_Renderers[channel]->feed(&m_Swaps[0]); + } + } + + m_RefreshNeeded = true; + m_RedrawNeeded = true; + } + } + } + + if (staticBoxContext.getInputCount() > 1) + { + for (size_t i = 0; i < dynamicBoxContext.getInputChunkCount(1); ++i) + { + m_StimDecoder.decode(i); + if (m_StimDecoder.isBufferReceived()) + { + IStimulationSet* stimSet = m_StimDecoder.getOutputStimulationSet(); + for (size_t j = 0; j < stimSet->getStimulationCount(); ++j) + { + m_Renderers[0]->feed(stimSet->getStimulationDate(j), stimSet->getStimulationIdentifier(j)); + m_RedrawNeeded = true; + } + } + } + } + + if (m_RebuildNeeded) { for (auto& renderer : m_Renderers) { renderer->rebuild(*m_SubRendererCtx); } } + if (m_RefreshNeeded) { for (auto& renderer : m_Renderers) { renderer->refresh(*m_SubRendererCtx); } } + if (m_RedrawNeeded) { this->redraw(); } + + m_RebuildNeeded = false; + m_RefreshNeeded = false; + m_RedrawNeeded = false; + + return true; +} + +template +void TBoxAlgorithmStackedInstantViz::draw() + +{ + CBoxAlgorithmViz::preDraw(); + + if (m_RendererCtx->getSelectedCount() != 0) + { + glPushMatrix(); + glScalef(1, 1.F / m_RendererCtx->getSelectedCount(), 1); + for (size_t i = 0; i < m_RendererCtx->getSelectedCount(); ++i) + { + glPushAttrib(GL_ALL_ATTRIB_BITS); + glPushMatrix(); + glColor4f(m_Color.r, m_Color.g, m_Color.b, m_RendererCtx->getTranslucency()); + glTranslatef(0, m_RendererCtx->getSelectedCount() - i - 1.F, 0); + + m_SubRendererCtx->setAspect(m_RendererCtx->getAspect()); + m_SubRendererCtx->setStackCount(m_RendererCtx->getSelectedCount()); + m_SubRendererCtx->setStackIndex(i); + m_Renderers[m_RendererCtx->getSelected(i)]->render(*m_SubRendererCtx); + if (bDrawBorders) + { + glDisable(GL_TEXTURE_1D); + glDisable(GL_BLEND); + glColor3f(0, 0, 0); + glBegin(GL_LINE_LOOP); + glVertex2f(0, 0); + glVertex2f(1, 0); + glVertex2f(1, 1); + glVertex2f(0, 1); + glEnd(); + } + glPopMatrix(); + glPopAttrib(); + } + glPopMatrix(); + } + + CBoxAlgorithmViz::postDraw(); +} +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTGtkGLWidget.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTGtkGLWidget.hpp new file mode 100644 index 0000000..5daf6ca --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/mTGtkGLWidget.hpp @@ -0,0 +1,354 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "m_defines.hpp" +#include "m_VisualizationTools.hpp" +#include "m_GtkGL.hpp" + +#include +#include + +#if defined TARGET_OS_Windows +#include +#endif + +#include +#include +#include + +#include + +// #define __DIRECT_RENDER__ + +namespace OpenViBE { +namespace AdvancedVisualization { +template +class TGtkGLWidget +{ +public: + + TGtkGLWidget() : m_box(nullptr) { } + + virtual ~TGtkGLWidget() + { + if (m_widget) + { + if (m_textureId) + { + GtkGL::preRender(m_widget); + glDeleteTextures(1, &m_textureId); + GtkGL::postRender(m_widget); + } + if (m_timeoutSrc) { g_source_destroy(m_timeoutSrc); } + GtkGL::uninitialize(m_widget); + } + } + + virtual void initialize(TBox& box, GtkWidget* widget, GtkWidget* left, GtkWidget* right, GtkWidget* bottom) + { + GtkGL::initialize(widget); + { + m_box = &box; + m_widget = widget; + m_left = left; + m_right = right; + m_bottom = bottom; + + ::g_signal_connect(widget, "configure-event", G_CALLBACK(TGtkGLWidget::configureCB), m_box); + ::g_signal_connect(widget, "expose-event", G_CALLBACK(TGtkGLWidget::exposeCB), m_box); + ::g_signal_connect(widget, "button-press-event", G_CALLBACK(TGtkGLWidget::mouseButtonCB), m_box); + ::g_signal_connect(widget, "button-release-event", G_CALLBACK(TGtkGLWidget::mouseButtonCB), m_box); + ::g_signal_connect(widget, "motion-notify-event", G_CALLBACK(TGtkGLWidget::motionNotifyCB), m_box); + ::g_signal_connect(widget, "enter-notify-event", G_CALLBACK(TGtkGLWidget::enterNotifyCB), m_box); + ::g_signal_connect(gtk_widget_get_parent(widget), "key-press-event", G_CALLBACK(TGtkGLWidget::keyPressCB), m_box); + ::g_signal_connect(gtk_widget_get_parent(widget), "key-release-event", G_CALLBACK(TGtkGLWidget::keyReleaseCB), m_box); + + ::g_signal_connect_after(left, "expose-event", G_CALLBACK(TGtkGLWidget::exposeLeftCB), m_box); + ::g_signal_connect_after(right, "expose-event", G_CALLBACK(TGtkGLWidget::exposeRightCB), m_box); + ::g_signal_connect_after(bottom, "expose-event", G_CALLBACK(TGtkGLWidget::exposeBottomCB), m_box); + + m_timeoutSrc = g_timeout_source_new(250); // timeouts every 50 ms + g_source_set_priority(m_timeoutSrc, G_PRIORITY_LOW); + g_source_set_callback(m_timeoutSrc, GSourceFunc(timeoutRedrawCB), m_box, nullptr); + g_source_attach(m_timeoutSrc, nullptr); + + gtk_widget_queue_resize(widget); + } + } + + virtual void redrawTopLevelWindow(const bool immediate = false) + { + GtkWidget* top = gtk_widget_get_toplevel(m_widget); + if (top != nullptr) + { + if (immediate) + { + gdk_window_process_updates(top->window, false); + gtk_widget_queue_draw(top); + } + else { gdk_window_invalidate_rect(top->window, nullptr, true); } + } + } + + virtual void redraw(const bool immediate = false) + { + if (immediate) + { + gdk_window_process_updates(m_widget->window, false); + gtk_widget_queue_draw(m_widget); + } + else { gdk_window_invalidate_rect(m_widget->window, nullptr, true); } + } + + virtual void redrawLeft(const bool immediate = false) + { + if (immediate) + { + gdk_window_process_updates(m_left->window, false); + gtk_widget_queue_draw(m_left); + } + else { gdk_window_invalidate_rect(m_left->window, nullptr, true); } + } + + virtual void redrawRight(const bool immediate = false) + { + if (immediate) + { + gdk_window_process_updates(m_right->window, false); + gtk_widget_queue_draw(m_right); + } + else { gdk_window_invalidate_rect(m_right->window, nullptr, true); } + } + + virtual void redrawBottom(const bool immediate = false) + { + if (immediate) + { + gdk_window_process_updates(m_bottom->window, false); + gtk_widget_queue_draw(m_bottom); + } + else { gdk_window_invalidate_rect(m_bottom->window, nullptr, true); } + } + + virtual void setPointSmoothingActive(const bool active = false) + { + if (active) { glEnable(GL_POINT_SMOOTH); } + else { glDisable(GL_POINT_SMOOTH); } + } + + virtual uint32_t createTexture(const std::string& value) + { +#define M_GRADIENT_SIZE 128 + + if (m_textureId == 0) + { + const std::string str = (value.empty() ? "0:0,0,100; 25:0,100,100; 50:0,49,0; 75:100,100,0; 100:100,0,0" : value); + + CMatrix gradientBase, gradient; + VisualizationToolkit::ColorGradient::parse(gradientBase, str.c_str()); + VisualizationToolkit::ColorGradient::interpolate(gradient, gradientBase, M_GRADIENT_SIZE); + + float texture[M_GRADIENT_SIZE][3]; + for (size_t i = 0; i < M_GRADIENT_SIZE; ++i) + { + texture[i][0] = float(gradient[i * 4 + 1] * .01); + texture[i][1] = float(gradient[i * 4 + 2] * .01); + texture[i][2] = float(gradient[i * 4 + 3] * .01); + } + + glGenTextures(1, &m_textureId); + glBindTexture(GL_TEXTURE_1D, m_textureId); + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // GL_LINEAR); + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP); + //glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + //glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, __SIZE__, 0, GL_RGB, GL_UNSIGNED_BYTE, texture); + gluBuild1DMipmaps(GL_TEXTURE_1D, GL_RGB, M_GRADIENT_SIZE, GL_RGB, GL_FLOAT, texture); + } + +#undef M_GRADIENT_SIZE + + return m_textureId; + } + +protected: + + GtkWidget* m_widget = nullptr; + GtkWidget* m_left = nullptr; + GtkWidget* m_right = nullptr; + GtkWidget* m_bottom = nullptr; + GSource* m_timeoutSrc = nullptr; + + TBox* m_box = nullptr; + + uint32_t m_textureId = 0; + +private: + + + static gboolean timeoutRedrawCB(TBox* box) + { + box->redraw(); + return TRUE; + } + + static gboolean configureCB(GtkWidget* widget, GdkEventConfigure* /*event*/, TBox* box) + { + GtkGL::preRender(widget); + glViewport(0, 0, widget->allocation.width, widget->allocation.height); + box->reshape(widget->allocation.width, widget->allocation.height); + GtkGL::postRender(widget); + return TRUE; + } + + static gboolean exposeCB(GtkWidget* widget, GdkEventExpose* /*event*/, TBox* box) + { + const float d = 1.F; + const float dx = d / (widget->allocation.width - d); + const float dy = d / (widget->allocation.height - d); + + GtkGL::preRender(widget); + + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + glTranslatef(0.5, 0, 0); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0 - dx, 1 + dx, 0 - dy, 1 + dy); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glEnable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(1.0, 1.0); + + glEnable(GL_LINE_SMOOTH); + glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + glLineWidth(1); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + + glEnable(GL_TEXTURE_1D); + + glDisable(GL_DEPTH_TEST); + glClearDepth(100); + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glColor3f(1, 1, 1); + + // Lighting + const float fAmbient = 0.0F; + const float fDiffuse = 1.0F; + const float fSpecular = 1.0F; + GLfloat ambient[] = { fAmbient, fAmbient, fAmbient, 1 }; + GLfloat diffuse[] = { fDiffuse, fDiffuse, fDiffuse, 1 }; + GLfloat specular[] = { fSpecular, fSpecular, fSpecular, 1 }; + GLfloat position0[] = { 3, 1, 2, 1 }; + GLfloat position1[] = { -3, 0, -2, 1 }; + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); + glLightfv(GL_LIGHT0, GL_SPECULAR, specular); + glLightfv(GL_LIGHT0, GL_POSITION, position0); + glLightfv(GL_LIGHT1, GL_AMBIENT, ambient); + glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse); + glLightfv(GL_LIGHT1, GL_SPECULAR, specular); + glLightfv(GL_LIGHT1, GL_POSITION, position1); + glShadeModel(GL_SMOOTH); + glEnable(GL_LIGHT0); + glEnable(GL_LIGHT1); + glEnable(GL_COLOR_MATERIAL); + glDisable(GL_LIGHTING); + + box->draw(); + + GtkGL::postRender(widget); + + return TRUE; + } + + static gboolean enterNotifyCB(GtkWidget* /*widget*/, GdkEventCrossing* /*event*/, TBox* box) + { + box->redraw(); + //box->request(); + //box->m_redrawNeeded = true; + return TRUE; + } + + static gboolean exposeLeftCB(GtkWidget* /*widget*/, GdkEventExpose* /*event*/, TBox* box) + { + box->drawLeft(); + return TRUE; + } + + static gboolean exposeRightCB(GtkWidget* /*widget*/, GdkEventExpose* /*event*/, TBox* box) + { + box->drawRight(); + return TRUE; + } + + static gboolean exposeBottomCB(GtkWidget* /*widget*/, GdkEventExpose* /*event*/, TBox* box) + { + box->drawBottom(); + return TRUE; + } + + static gboolean mouseButtonCB(GtkWidget* /*widget*/, GdkEventButton* event, TBox* box) + { + int status = 0; + switch (event->type) + { + case GDK_BUTTON_PRESS: status = 1; + break; + case GDK_2BUTTON_PRESS: status = 2; + break; + case GDK_3BUTTON_PRESS: status = 3; + break; + default: break; + } + box->mouseButton(int(event->x), int(event->y), event->button, status); + box->draw(); + return TRUE; + } + + static gboolean motionNotifyCB(GtkWidget* /*widget*/, GdkEventMotion* event, TBox* box) + { + box->mouseMotion(int(event->x), int(event->y)); + return TRUE; + } + + static gboolean keyPressCB(GtkWidget* /*widget*/, GdkEventKey* event, TBox* box) + { + box->keyboard(0, 0, /*event->x, event->y,*/ event->keyval, true); + return TRUE; + } + + static gboolean keyReleaseCB(GtkWidget* /*widget*/, GdkEventKey* event, TBox* box) + { + box->keyboard(0, 0, /*event->x, event->y,*/ event->keyval, false); + return TRUE; + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_GtkGL.cpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_GtkGL.cpp new file mode 100644 index 0000000..5969d77 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_GtkGL.cpp @@ -0,0 +1,311 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include "m_GtkGL.hpp" +#include "m_defines.hpp" + +#include +#include +#if defined TARGET_OS_Windows +#include +#include +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS +#include +#include +#else +#error unsupported platform +#endif + +// ########################################################################################################################################################### +// ########################################################################################################################################################### +// +// GtkGL implementation +// +// ########################################################################################################################################################### +// ########################################################################################################################################################### + +#define GTK_GL_RENDERING_CONTEXT_NAME "GL Rendering Context" +#define GTK_GL_DEVICE_CONTEXT_NAME "Device Context" +#define GTK_GL_DEBUG(s) // g_debug("GtkGL : "#s); +#define GTK_GL_WARNING(s) g_warning("GtkGL : "#s); + +#if defined TARGET_OS_Windows + +namespace { +typedef bool (*gl_swap_interval_ext_t)(int); +gl_swap_interval_ext_t wglSwapIntervalEXT = nullptr; +} // namespace + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + +namespace +{ + typedef void (*glXSwapIntervalEXT_t)(Display*, GLXDrawable, int); + glXSwapIntervalEXT_t glXSwapIntervalEXT = nullptr; +} + +#endif + +// ## WINDOWS ############################################################################################################################################## + +#if defined TARGET_OS_Windows + +namespace { +void on_realize_cb(GtkWidget* widget, void* /*data*/) +{ + GTK_GL_DEBUG("realize-callback"); + + gdk_window_ensure_native(gtk_widget_get_window(widget)); + + const HWND window = HWND(GDK_WINDOW_HWND(gtk_widget_get_window(widget))); + const HDC drawingCtx = GetDC(window); + + PIXELFORMATDESCRIPTOR pixelFormatDesc; + pixelFormatDesc.nSize = sizeof(pixelFormatDesc); + pixelFormatDesc.nVersion = 1; + pixelFormatDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; + pixelFormatDesc.iPixelType = PFD_TYPE_RGBA; + pixelFormatDesc.cColorBits = 24; + pixelFormatDesc.cAlphaBits = 8; + pixelFormatDesc.cDepthBits = 32; + pixelFormatDesc.iLayerType = PFD_MAIN_PLANE; + + const int pixelFormatID = ChoosePixelFormat(drawingCtx, &pixelFormatDesc); + + if (pixelFormatID == 0) + { + GTK_GL_WARNING("ChoosePixelFormat failed"); + GTK_GL_DEBUG("realize-callback::failed"); + return; + } + + if (SetPixelFormat(drawingCtx, pixelFormatID, &pixelFormatDesc) == 0) + { + GTK_GL_WARNING("SetPixelFormat failed"); + GTK_GL_DEBUG("realize-callback::failed"); + return; + } + + const HGLRC glRenderingCtx = wglCreateContext(drawingCtx); + if (glRenderingCtx == nullptr) + { + GTK_GL_WARNING("wglCreateContext failed"); + GTK_GL_DEBUG("realize-callback::failed"); + return; + } + + g_object_set_data(G_OBJECT(widget), GTK_GL_RENDERING_CONTEXT_NAME, glRenderingCtx); + g_object_set_data(G_OBJECT(widget), GTK_GL_DEVICE_CONTEXT_NAME, drawingCtx); + + gtk_widget_queue_resize(widget); + gtk_widget_set_double_buffered(widget, FALSE); + + wglSwapIntervalEXT = gl_swap_interval_ext_t(wglGetProcAddress("wglSwapIntervalEXT")); + + GTK_GL_DEBUG("realize-callback::success"); +} +} // namespace + +void OpenViBE::AdvancedVisualization::GtkGL::initialize(GtkWidget* widget) +{ + GTK_GL_DEBUG("initialize"); + g_signal_connect(widget, "realize", G_CALLBACK(on_realize_cb), nullptr); + GTK_GL_DEBUG("initialize::success"); +} + +void OpenViBE::AdvancedVisualization::GtkGL::uninitialize(GtkWidget* widget) +{ + GTK_GL_DEBUG("uninitialize"); + + const HWND window = HWND(GDK_WINDOW_HWND(gtk_widget_get_window(widget))); + + const auto glRenderingCtx = HGLRC(g_object_get_data(G_OBJECT(widget), GTK_GL_RENDERING_CONTEXT_NAME)); + wglDeleteContext(glRenderingCtx); + + const HDC drawingCtx = HDC(g_object_get_data(G_OBJECT(widget), GTK_GL_DEVICE_CONTEXT_NAME)); + ReleaseDC(window, drawingCtx); + + GTK_GL_DEBUG("uninitialize::success"); +} + +void OpenViBE::AdvancedVisualization::GtkGL::preRender(GtkWidget* widget, const bool verticalSync) +{ + GTK_GL_DEBUG("pre-render"); + + const HDC drawingCtx = HDC(g_object_get_data(G_OBJECT(widget), GTK_GL_DEVICE_CONTEXT_NAME)); + const auto glRenderingCtx = HGLRC(g_object_get_data(G_OBJECT(widget), GTK_GL_RENDERING_CONTEXT_NAME)); + + if (glRenderingCtx == nullptr) + { + GTK_GL_DEBUG("Rendering context not ready"); + GTK_GL_DEBUG("pre-render::failed"); + return; + } + + if (wglMakeCurrent(drawingCtx, glRenderingCtx) == 0) + { + GTK_GL_WARNING("wglMakeCurrent failed"); + GTK_GL_DEBUG("pre-render::failed"); + return; + } + + // Enable / Disable vsync + if (wglSwapIntervalEXT != nullptr) { wglSwapIntervalEXT(verticalSync ? 1 : 0); } + + GTK_GL_DEBUG("pre-render::success"); +} + +void OpenViBE::AdvancedVisualization::GtkGL::postRender(GtkWidget* widget) +{ + GTK_GL_DEBUG("post-render"); + + const HDC drawingCtx = HDC(g_object_get_data(G_OBJECT(widget), GTK_GL_DEVICE_CONTEXT_NAME)); + + if (drawingCtx == nullptr) + { + GTK_GL_DEBUG("Rendering context not ready"); + GTK_GL_DEBUG("post-render::failed"); + } + else if (SwapBuffers(drawingCtx) == 0) + { + GTK_GL_WARNING("SwapBuffers failed"); + GTK_GL_DEBUG("post-render::failed"); + } + else if (wglMakeCurrent(drawingCtx, nullptr) == 0) + { + GTK_GL_WARNING("wglMakeCurrent failed"); + GTK_GL_DEBUG("post-render::failed"); + } + else { GTK_GL_DEBUG("post-render::success"); } +} + +// ## WINDOWS ############################################################################################################################################## + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + +// ## LINUX ################################################################################################################################################ + +void OpenViBE::AdvancedVisualization::GtkGL::initialize(GtkWidget * widget) +{ + GTK_GL_DEBUG("initialize"); + + // ::gdk_window_ensure_native(gtk_widget_get_window(widget)); + + ::GdkScreen* screen = ::gdk_screen_get_default(); + ::Display* display = GDK_SCREEN_XDISPLAY(screen); + ::gint screenNumber = GDK_SCREEN_XNUMBER(screen); + + int visualInfoAttributes[] = + { + GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + GLX_ALPHA_SIZE, 1, + GLX_DOUBLEBUFFER, + GLX_DEPTH_SIZE, 1, + None + }; + + if (!::glXQueryVersion(display, nullptr, nullptr)) + { + GTK_GL_WARNING("initialize::failed"); + return; + } + + ::XVisualInfo* visualInfo = ::glXChooseVisual(display, screenNumber, visualInfoAttributes); + ::GLXContext glRenderingCtx = glXCreateContext(display, visualInfo, nullptr, True); + g_object_set_data(G_OBJECT(widget), GTK_GL_RENDERING_CONTEXT_NAME, glRenderingCtx); + +#if 1 + /* Fix up colormap */ + ::GdkVisual* visual = ::gdk_x11_screen_lookup_visual(screen, visualInfo->visualid); + ::GdkColormap* colorMap = ::gdk_colormap_new(visual, FALSE); + ::gtk_widget_set_colormap(widget, colorMap); +#endif + + ::gtk_widget_queue_resize(widget); + ::gtk_widget_set_double_buffered(widget, FALSE); + + glXSwapIntervalEXT = (glXSwapIntervalEXT_t) ::glXGetProcAddressARB(reinterpret_cast ("glXSwapIntervalEXT")); + + GTK_GL_DEBUG("initialize::success"); +} + +void OpenViBE::AdvancedVisualization::GtkGL::uninitialize(GtkWidget * widget) +{ + GTK_GL_DEBUG("uninitialize"); + + ::Display* display = GDK_SCREEN_XDISPLAY(gtk_widget_get_screen(widget)); + ::GLXContext glRenderingCtx = (GLXContext) g_object_get_data(G_OBJECT(widget), GTK_GL_RENDERING_CONTEXT_NAME); + if (!display || !glRenderingCtx) + { + GTK_GL_WARNING("uninitialize::failed"); + return; + } + ::glXMakeCurrent(display, None, nullptr); + ::glXDestroyContext(display, glRenderingCtx); + + GTK_GL_DEBUG("uninitialize::success"); +} + +void OpenViBE::AdvancedVisualization::GtkGL::preRender(GtkWidget * widget, bool bVerticalSync) +{ + GTK_GL_DEBUG("pre-render"); + + ::Display* display = GDK_SCREEN_XDISPLAY(gtk_widget_get_screen(widget)); + ::Window window = GDK_WINDOW_XID(gtk_widget_get_window(widget)); + ::GLXContext glRenderingCtx = (GLXContext) g_object_get_data(G_OBJECT(widget), GTK_GL_RENDERING_CONTEXT_NAME); + if (!display || !glRenderingCtx) + { + GTK_GL_WARNING("pre-render::failed"); + return; + } + ::glXMakeCurrent(display, window, glRenderingCtx); + + // Enable / Disable vsync + if (glXSwapIntervalEXT) + { + glXSwapIntervalEXT(display, ::glXGetCurrentDrawable(), bVerticalSync ? 1 : 0); + } + + GTK_GL_DEBUG("pre-render::success"); +} + +void OpenViBE::AdvancedVisualization::GtkGL::postRender(GtkWidget * widget) +{ + GTK_GL_DEBUG("post-render"); + + ::Display* display = GDK_SCREEN_XDISPLAY(gtk_widget_get_screen(widget)); + ::Window window = GDK_WINDOW_XID(gtk_widget_get_window(widget)); + if (!display) + { + GTK_GL_WARNING("post-render::failed"); + return; + } + ::glXSwapBuffers(display, window); + + GTK_GL_DEBUG("post-render::success"); +} + +// ## LINUX ################################################################################################################################################ + +#endif diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_GtkGL.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_GtkGL.hpp new file mode 100644 index 0000000..1bb7933 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_GtkGL.hpp @@ -0,0 +1,35 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include + +namespace OpenViBE { +namespace AdvancedVisualization { +namespace GtkGL { +void initialize(GtkWidget* widget); +void uninitialize(GtkWidget* widget); + +void preRender(GtkWidget* widget, bool verticalSync = false); +void postRender(GtkWidget* widget); +} // namespace GtkGL +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_VisualizationTools.cpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_VisualizationTools.cpp new file mode 100644 index 0000000..4413f21 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_VisualizationTools.cpp @@ -0,0 +1,44 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include "m_VisualizationTools.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { + +std::string trim(const std::string& value) +{ + if (value.length() == 0) { return ""; } + size_t i = 0; + size_t j = value.length() - 1; + while (i < value.length() && value[i] == ' ') { i++; } + while (j > i && value[j] == ' ') { j--; } + return value.substr(i, j - i + 1); +} + +CRendererContext& getContext() +{ + static CRendererContext* ctx = new CRendererContext(); + return *ctx; +} + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_VisualizationTools.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_VisualizationTools.hpp new file mode 100644 index 0000000..301828b --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_VisualizationTools.hpp @@ -0,0 +1,34 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "m_defines.hpp" + +#include + +#include + +namespace OpenViBE { +namespace AdvancedVisualization { +std::string trim(const std::string& value); +CRendererContext& getContext(); +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_defines.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_defines.hpp new file mode 100644 index 0000000..6e9c19d --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_defines.hpp @@ -0,0 +1,29 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#pragma once + +// Temporal coherence definition +#define OVP_TypeId_TemporalCoherence OpenViBE::CIdentifier(0x8F02E3F6, 0xFFB00F4B) + +enum class ETemporalCoherence { TimeLocked, Independant }; + +#define OV_TypeId_TimeFrequency OpenViBE::CIdentifier(0x5A90816B, 0xFF2AFF72) diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_main.cpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_main.cpp new file mode 100644 index 0000000..ef89c20 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/m_main.cpp @@ -0,0 +1,221 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include "m_defines.hpp" + +// #define TARGET_Has_Experimental + +#include "mTBoxAlgorithmStackedContinuousViz.hpp" +#include "mTBoxAlgorithmStackedInstantViz.hpp" +#include "mTBoxAlgorithmContinuousViz.hpp" +#include "mTBoxAlgorithmInstantViz.hpp" +#include "mTBoxAlgorithmInstantLoretaViz.hpp" + +#include "ruler/mTRulerAutoType.hpp" +#include "ruler/mTRulerPair.hpp" +#include "ruler/mTRulerConditionalPair.hpp" +#include "ruler/mCRulerConditionIsTimeLocked.hpp" + +#include "ruler/mCRulerProgress.hpp" +#include "ruler/mCRulerProgressH.hpp" +#include "ruler/mCRulerProgressV.hpp" +#include "ruler/mCRulerERPProgress.hpp" + +#include "ruler/mCRulerBottomCount.hpp" +#include "ruler/mCRulerBottomERPCount.hpp" +#include "ruler/mCRulerBottomERPTime.hpp" +#include "ruler/mCRulerBottomFrequency.hpp" +#include "ruler/mCRulerBottomPercent.hpp" +#include "ruler/mCRulerBottomTexture.hpp" +#include "ruler/mCRulerBottomTime.hpp" + +#include "ruler/mCRulerLeftChannelNames.hpp" +#include "ruler/mCRulerLeftTexture.hpp" + +#include "ruler/mCRulerRightCount.hpp" +#include "ruler/mCRulerRightFrequency.hpp" +#include "ruler/mCRulerRightMonoScale.hpp" +#include "ruler/mCRulerRightTexture.hpp" +#include "ruler/mCRulerRightScale.hpp" +#include "ruler/mCRulerRightLabels.hpp" + +#include + +#include + +namespace OpenViBE { +namespace AdvancedVisualization { +// Prototype to create and release final renderer instances from the renderer API + +template +class TRendererProto +{ +public: + + static IRenderer* create() { return IRenderer::create(TType, TStimulation); } + static void release(IRenderer* renderer) { return IRenderer::release(renderer); } +}; + +// Type definitions of our OpenViBE boxes + +typedef TBoxAlgorithmContinuousVizDesc, TRulerPair< + CRulerProgressV, TRulerPair< + TRulerAutoType, + IRuler>, TRulerPair>>> bitmap_t; +typedef TBoxAlgorithmContinuousVizDesc, TRulerPair< + CRulerProgressV, TRulerPair< + TRulerAutoType, + IRuler>, TRulerPair>>> oscilloscope_t; +typedef TBoxAlgorithmContinuousVizDesc, TRulerPair< + CRulerProgressV, TRulerPair< + TRulerAutoType, + IRuler>, TRulerPair>>> bars_t; +typedef TBoxAlgorithmContinuousVizDesc, TRulerPair< + CRulerProgressV, TRulerPair< + TRulerAutoType, + IRuler>, TRulerPair, CRulerRightMonoScale>>>> MOscilloscope; +typedef TBoxAlgorithmContinuousVizDesc> xyz_plot_t; + +typedef TBoxAlgorithmInstantVizDesc, TRulerPair< + CRulerERPProgress, TRulerPair< + TRulerAutoType, TRulerPair< + CRulerLeftChannelNames, CRulerRightTexture>>>> i_bitmap_t; +typedef TBoxAlgorithmInstantVizDesc, TRulerPair< + CRulerERPProgress, TRulerPair< + TRulerAutoType, TRulerPair< + CRulerLeftChannelNames, CRulerRightScale>>>> i_oscilloscope_t; +typedef TBoxAlgorithmInstantVizDesc, TRulerPair< + CRulerERPProgress, TRulerPair< + TRulerAutoType, TRulerPair< + CRulerLeftChannelNames, CRulerRightScale>>>> i_bars_t; +typedef TBoxAlgorithmInstantVizDesc, TRulerPair< + CRulerERPProgress, TRulerPair< + TRulerAutoType, TRulerPair< + TRulerPair, CRulerRightMonoScale>>>> MIOscilloscope; +typedef TBoxAlgorithmInstantVizDesc> i_xyz_plot_t; + +typedef TBoxAlgorithmStackedContinuousVizDesc, TRulerPair< + TRulerAutoType, TRulerPair< + CRulerLeftChannelNames, CRulerProgressH>>> sv_bitmap_t; +typedef TBoxAlgorithmStackedContinuousVizDesc, TRulerPair< + TRulerConditionalPair, TRulerPair< + TRulerAutoType, TRulerPair> + >> sh_bitmap_t; +typedef TBoxAlgorithmStackedInstantVizDesc, TRulerPair< + CRulerBottomERPTime, TRulerPair, TRulerPair>>> +si_bitmap_t; + +typedef TBoxAlgorithmInstantVizDesc, CRulerBottomTexture> topography_2d_t; +typedef TBoxAlgorithmInstantVizDesc, CRulerBottomTexture> topography_3d_t; +typedef TBoxAlgorithmInstantVizDesc, CRulerBottomTexture, TBoxAlgorithmInstantLoretaViz> loreta_t; +typedef TBoxAlgorithmInstantVizDesc, CRulerBottomTexture> cubes_t; + +OVP_Declare_Begin() + context.getTypeManager().registerEnumerationType(OVP_TypeId_TemporalCoherence, "Temporal Coherence"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_TemporalCoherence, "Time Locked", size_t(ETemporalCoherence::TimeLocked)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_TemporalCoherence, "Independant", size_t(ETemporalCoherence::Independant)); + + OVP_Declare_New(bitmap_t("Continuous bitmap_t", CIdentifier(0x0BE99978487D3DC6), CIdentifier(0x9E1CD34586569E7E), "0.0.0", "0.0.0", + CParameterSet(I_Matrix,I_Stimulations, S_ChannelLocalisation, S_TemporalCoherence, S_TimeScale, S_ElementCount, S_DataScale, S_Caption, S_ColorGradient, + P_None), + "Displays the input matrices as a map of colored tiles, or bitmap, continuously.", "")) + + OVP_Declare_New(oscilloscope_t("Continuous oscilloscope_t", CIdentifier(0x6D63896D86685134), CIdentifier(0x0842BCD1D53C1C89), "0.0.0", "0.0.0", + CParameterSet(I_Signal, I_Stimulations, S_ChannelLocalisation, S_TemporalCoherence, S_TimeScale, S_ElementCount, S_DataPositive, S_DataScale, S_Caption, + S_Translucency, S_Color, P_None), + "Displays the input matrices as a series of curves.\nChannels are vertically distributed.","")) + + OVP_Declare_New(bars_t("Continuous bars_t", CIdentifier(0xE6B2C8A8B43DE2C3), CIdentifier(0x24510F3EFCBE83A2), "0.0.0", "0.0.0", + CParameterSet(I_Matrix,I_Stimulations, S_ChannelLocalisation, S_TemporalCoherence, S_TimeScale, S_ElementCount, S_DataPositive, S_DataScale, S_Caption, + S_Translucency,S_ColorGradient, P_None), + "Displays the input matrices as a series of colored bars.\nChannels are vertically distributed.","")) + + OVP_Declare_New(MOscilloscope("Continuous Multi oscilloscope_t", CIdentifier(0xD4C4DCEE6F5D47E1), CIdentifier(0xA927FB20C4089F99), "0.0.0", "0.0.0", + CParameterSet(I_Signal, I_Stimulations, S_ChannelLocalisation, S_TemporalCoherence, S_TimeScale, S_ElementCount, S_DataPositive, S_DataScale, + S_Caption, S_Translucency, S_ColorGradient, P_None), + "Displays the input matrices as a series of curves.\nAll channels are rendered on the same vertical axis, with different colors.", "")) + + OVP_Declare_New(xyz_plot_t("Continuous XYZ Plot", CIdentifier(0xAAFD16CF57DC7138), CIdentifier(0xDDA9A9D9D04F2C14), "0.0.0", "0.0.0", + CParameterSet(I_Signal, S_TemporalCoherence, S_TimeScale, S_ElementCount, S_DataScale, S_Caption, S_Translucency, S_ShowAxis,S_XYZPlotHasDepth, + S_ColorGradient, F_FixedChannelOrder, F_FixedChannelSelection, P_None), + "Displays the input matrices as a series of points in 2D or 3D space, continuously.", "")) + + + OVP_Declare_New(i_bitmap_t("Instant bitmap_t", CIdentifier(0x942CDA76A437E83E), CIdentifier(0xF862765845247823), "0.0.0", "0.0.0", + CParameterSet(I_Spectrum, S_ChannelLocalisation, S_DataScale, S_Caption, S_ColorGradient, P_None), + "Displays each and every input matrix as a map of colored tiles, or bitmap, instantly.", "")) + + OVP_Declare_New(i_oscilloscope_t("Instant oscilloscope_t", CIdentifier(0x1207B96D19A805B4), CIdentifier(0x997B654D0CDB3102), "0.0.0", "0.0.0", + CParameterSet(I_Signal, S_ChannelLocalisation, S_DataPositive, S_DataScale, S_Caption, S_Translucency, S_Color, F_CanAddInput, P_None), + "Displays each and every input matrix as a series of curves, instantly.\nChannels are vertically distributed.", "")) + + OVP_Declare_New(i_bars_t("Instant bars_t", CIdentifier(0xD401BE1F25F01E4E), CIdentifier(0xECB4608196DA0D49), "0.0.0", "0.0.0", + CParameterSet(I_Spectrum,S_ChannelLocalisation, S_DataPositive, S_DataScale, S_Caption, S_Translucency, S_ColorGradient, P_None), + "Displays each and every input matrix as a series of colored bars, instantly.\nChannels are vertically distributed.", "")) + + OVP_Declare_New(MIOscilloscope("Instant Multi oscilloscope_t", CIdentifier(0x4F142FE87C7773E3), CIdentifier(0x072B75A9C28D588A), "0.0.0", "0.0.0", + CParameterSet(I_Signal, S_ChannelLocalisation, S_DataPositive, S_DataScale, S_Caption, S_Translucency, S_ColorGradient, P_None), + "Displays each and every input matrix as a series of curves, instantly.\nAll channels are rendered on the same vertical axis, with different colors.", + "")) + + OVP_Declare_New(i_xyz_plot_t("Instant XYZ Plot", CIdentifier(0x1353BED819EC86A5), CIdentifier(0xDB19374A41A22DD3), "0.0.0", "0.0.0", + CParameterSet(I_Signal, S_DataScale, S_Caption, S_Translucency, S_ShowAxis, S_XYZPlotHasDepth, S_ColorGradient,F_FixedChannelOrder, + F_FixedChannelSelection, P_None), + "Displays the input matrices as a series of points in 2D or 3D space, instantly.", "")) + + + OVP_Declare_New(sv_bitmap_t("Stacked bitmap_t (Vertical)", CIdentifier(0x93F400CF9F6C5AFD), CIdentifier(0x9926A761BA82D233), "0.0.0", "0.0.0", + CParameterSet(I_Matrix, I_Stimulations, S_ChannelLocalisation, S_TemporalCoherence, S_TimeScale, S_ElementCount, S_DataScale, S_Caption, S_ColorGradient + ,P_None), + "Displays the input matrices as a map of colored tiles, or bitmap, continuously.\nAll the bitmaps are stacked vertically, starting from the bottom edge of the window" + , "")) + + OVP_Declare_New(sh_bitmap_t("Stacked bitmap_t (Horizontal)", CIdentifier(0x6B22DC653AB0EC0F), CIdentifier(0x7B0DDB65FDC51488), "0.0.0", "0.0.0", + CParameterSet(I_Matrix, I_Stimulations, S_ChannelLocalisation, S_TemporalCoherence, S_TimeScale, S_ElementCount, S_DataScale, S_Caption, S_ColorGradient + , P_None), + "Displays the input matrices as a map of colored tiles, or bitmap, continuously.\nAll the bitmaps are stacked horizontally, starting from the left edge of the window" + , "")) + + OVP_Declare_New(si_bitmap_t("Instant bitmap_t (3D Stream)", CIdentifier(0x0C61E7632A5C3178), CIdentifier(0xC3CC8B43EE985C1D), "0.1.0", "0.1.0", + CParameterSet(I_TimeFrequency, I_Stimulations, S_ChannelLocalisation, S_DataScale, S_Caption, S_ColorGradient, P_None), + "Displays the input matrices as a map of colored tiles, or bitmap, continuously.", "")) + + OVP_Declare_New(topography_2d_t("2D Topography", CIdentifier(0x0A0C12A7E695F3FB), CIdentifier(0x7C3A05B8C45386F8), "0.0.0", "0.0.0", + CParameterSet(I_Signal, S_ChannelLocalisation, S_DataScale, S_Caption, S_ColorGradient, F_FixedChannelOrder, P_None), + "The input is mapped to a 2 dimensional plane model of the scalp surface, using a color gradient and interpolation.", "")) + + OVP_Declare_New(topography_3d_t("3D Topography", CIdentifier(0xA3F1CF20DEC477F3), CIdentifier(0xC709EA84B577D910), "0.0.0", "0.0.0", + CParameterSet(I_Signal,S_ChannelLocalisation, S_DataScale, S_Caption, S_ColorGradient, F_FixedChannelOrder, P_None), + "The input is mapped to a 3D model of the scalp, using a color gradient and interpolation.", "")) + + OVP_Declare_New(cubes_t("3D cubes_t", CIdentifier(0x6307469DF938EF27), CIdentifier(0xE028305D4ACF9D1A), "0.0.0", "0.0.0", + CParameterSet(I_Signal,S_ChannelLocalisation, S_DataScale, S_Caption, S_ColorGradient, F_FixedChannelOrder, P_None), + "The input is mapped to a 3D representation of the EEG setup where electrodes are symbolized with cubes,\nusing a color gradient and interpolation.", "" + )) + + OVP_Declare_New(loreta_t("3D Tomographic Visualization", CIdentifier(0xD5F62E7685E0D97C), CIdentifier(0xFD0826035C47E922), "0.0.0", "0.0.0", + CParameterSet(I_Signal, S_DataScale, S_Caption, S_Translucency, S_ColorGradient, F_FixedChannelOrder, P_None), + "Displays sources activity by mapping it to voxels in a 3D model of the scalp.", "")) + +OVP_Declare_End() + +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomCount.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomCount.hpp new file mode 100644 index 0000000..a48fce2 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomCount.hpp @@ -0,0 +1,80 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerBottomCount : public IRuler +{ +public: + + void renderBottom(GtkWidget* widget) override + { + if (m_renderer == nullptr) { return; } + if (m_renderer->getSampleCount() == 0) { return; } + if (m_renderer->getHistoryCount() == 0) { return; } + if (m_renderer->getHistoryIndex() == 0) { return; } + + const size_t nSample = m_renderer->getSampleCount(); + const size_t historyIdx = m_renderer->getHistoryIndex(); + + + const size_t leftIdx1 = historyIdx - historyIdx % nSample; + const size_t leftIdx2 = historyIdx; + const size_t rightIdx1 = leftIdx2 - nSample; + const size_t rightIdx2 = leftIdx1; + + std::vector range1 = splitRange(double(leftIdx1), double(leftIdx1 + nSample), 10); + std::vector range2 = splitRange(double(rightIdx1), double(rightIdx1 + nSample), 10); + + gint w, h, x; + + gdk_drawable_get_size(widget->window, &w, &h); + GdkGC* drawGC = gdk_gc_new(widget->window); + for (const auto& i : range1) + { + if (i >= leftIdx1 && i < leftIdx2) + { + x = gint(((i - leftIdx1) / nSample) * w); + PangoLayout* layout = gtk_widget_create_pango_layout(widget, getLabel(i).c_str()); + gdk_draw_layout(widget->window, drawGC, x, 5, layout); + gdk_draw_line(widget->window, drawGC, x, 0, x, 3); + g_object_unref(layout); + } + } + for (const auto& i : range2) + { + if (i >= rightIdx1 && i < rightIdx2) + { + x = gint(((i + nSample - leftIdx1) / nSample) * w); + PangoLayout* layout = gtk_widget_create_pango_layout(widget, getLabel(i).c_str()); + gdk_draw_layout(widget->window, drawGC, x, 5, layout); + gdk_draw_line(widget->window, drawGC, x, 0, x, 3); + g_object_unref(layout); + } + } + g_object_unref(drawGC); + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomERPCount.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomERPCount.hpp new file mode 100644 index 0000000..10aa372 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomERPCount.hpp @@ -0,0 +1,59 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerBottomERPCount : public IRuler +{ +public: + + void renderBottom(GtkWidget* widget) override + { + if (m_renderer == nullptr) { return; } + if (m_renderer->getSampleCount() == 0) { return; } + if (m_renderer->getHistoryCount() == 0) { return; } + if (m_renderer->getHistoryIndex() == 0) { return; } + + const size_t nSample = m_renderer->getSampleCount(); + const double duration = nSample * 1.; + + std::vector range = splitRange(0, duration, 10); + + gint w, h; + + gdk_drawable_get_size(widget->window, &w, &h); + GdkGC* drawGC = gdk_gc_new(widget->window); + for (const auto& i : range) + { + const gint x = gint((i / duration) * w); + PangoLayout* layout = gtk_widget_create_pango_layout(widget, getLabel(i).c_str()); + gdk_draw_layout(widget->window, drawGC, x, 5, layout); + gdk_draw_line(widget->window, drawGC, x, 0, x, 3); + g_object_unref(layout); + } + g_object_unref(drawGC); + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomERPTime.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomERPTime.hpp new file mode 100644 index 0000000..16c124e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomERPTime.hpp @@ -0,0 +1,60 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerBottomERPTime : public IRuler +{ +public: + + void renderBottom(GtkWidget* widget) override + { + if (m_renderer == nullptr) { return; } + if (m_renderer->getSampleCount() == 0) { return; } + if (m_renderer->getHistoryCount() == 0) { return; } + if (m_renderer->getHistoryIndex() == 0) { return; } + + const size_t nSample = m_renderer->getSampleCount(); + const uint64_t sampleDuration = m_rendererCtx->getSampleDuration(); + const double duration = double((nSample * sampleDuration) >> 16) / 65536.; + + std::vector range = splitRange(0, duration, 10); + + gint w, h; + + gdk_drawable_get_size(widget->window, &w, &h); + GdkGC* drawGC = gdk_gc_new(widget->window); + for (const auto& i : range) + { + const gint x = gint((i / duration) * w); + PangoLayout* layout = gtk_widget_create_pango_layout(widget, getLabel(i).c_str()); + gdk_draw_layout(widget->window, drawGC, x, 5, layout); + gdk_draw_line(widget->window, drawGC, x, 0, x, 3); + g_object_unref(layout); + } + g_object_unref(drawGC); + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomFrequency.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomFrequency.hpp new file mode 100644 index 0000000..fb9e7ec --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomFrequency.hpp @@ -0,0 +1,60 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerBottomFrequency : public IRuler +{ +public: + + void renderBottom(GtkWidget* widget) override + { + const auto scale = float(m_rendererCtx->getSpectrumFrequencyRange()); + if (m_lastScale != scale) + { + m_range = splitRange(0, scale); + m_lastScale = scale; + } + + gint w, h; + + gdk_drawable_get_size(widget->window, &w, &h); + GdkGC* drawGC = gdk_gc_new(widget->window); + for (const auto& i : m_range) + { + const gint x = gint((i / scale) * w); + PangoLayout* layout = gtk_widget_create_pango_layout(widget, getLabel(i).c_str()); + gdk_draw_layout(widget->window, drawGC, x, 5, layout); + gdk_draw_line(widget->window, drawGC, x, 0, x, 3); + g_object_unref(layout); + } + g_object_unref(drawGC); + } + +protected: + float m_lastScale = 0; + std::vector m_range; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomPercent.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomPercent.hpp new file mode 100644 index 0000000..21087b8 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomPercent.hpp @@ -0,0 +1,54 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerBottomPercent : public IRuler +{ +public: + + void renderBottom(GtkWidget* widget) override + { + gint w, h; + gint lw, lh; + + gdk_drawable_get_size(widget->window, &w, &h); + GdkGC* drawGC = gdk_gc_new(widget->window); + for (int i = 0; i <= 10; i += 2) + { + const gint x = (i * (w - 1)) / 10; + const std::string label = (std::to_string(i * 10) + "%"); + PangoLayout* layout = gtk_widget_create_pango_layout(widget, label.c_str()); + pango_layout_get_size(layout, &lw, &lh); + lw /= PANGO_SCALE; + lh /= PANGO_SCALE; + gdk_draw_layout(widget->window, drawGC, x, 4, layout); + gdk_draw_line(widget->window, drawGC, x, 0, x, 3); + g_object_unref(layout); + } + g_object_unref(drawGC); + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomTexture.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomTexture.hpp new file mode 100644 index 0000000..f4a0019 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomTexture.hpp @@ -0,0 +1,90 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "mCRulerTexture.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerBottomTexture : public CRulerTexture +{ +public: + + void render() override + + { + this->preRender(); + + glColor4f(0, 0, 0, m_blackAlpha); + glBegin(GL_QUADS); + glTexCoord1f(0); + glVertex2f(0, 0.00F); + glVertex2f(0, 0.05F); + glTexCoord1f(1); + glVertex2f(1, 0.05F); + glVertex2f(1, 0.00F); + glEnd(); + + glColor4f(1, 1, 1, m_whiteAlpha); + glBegin(GL_QUADS); + glTexCoord1f(0); + glVertex2f(0, 0.00F); + glVertex2f(0, 0.04F); + glTexCoord1f(1); + glVertex2f(1, 0.04F); + glVertex2f(1, 0.00F); + glEnd(); + + this->postRender(); + } + + void renderBottom(GtkWidget* widget) override + { + const float scale = 1.F / m_rendererCtx->getScale(); + if (m_lastScale != scale) + { + m_range = splitRange(-scale * .5, scale * .5); + m_lastScale = scale; + } + + gint w, h; + gint lw, lh; + + gdk_drawable_get_size(widget->window, &w, &h); + GdkGC* drawGC = gdk_gc_new(widget->window); + for (const auto& i : m_range) + { + PangoLayout* layout = gtk_widget_create_pango_layout(widget, getLabel(i).c_str()); + pango_layout_get_size(layout, &lw, &lh); + lw /= PANGO_SCALE; + lh /= PANGO_SCALE; + gdk_draw_layout(widget->window, drawGC, gint((.5 + i / scale) * w - lw * .5), 0, layout); + g_object_unref(layout); + } + g_object_unref(drawGC); + } + +protected: + float m_lastScale = 0; + std::vector m_range; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomTime.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomTime.hpp new file mode 100644 index 0000000..8633cea --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerBottomTime.hpp @@ -0,0 +1,85 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerBottomTime : public IRuler +{ +public: + + void renderBottom(GtkWidget* widget) override + { + if (m_renderer == nullptr) { return; } + if (m_renderer->getSampleCount() == 0) { return; } + if (m_renderer->getHistoryCount() == 0) { return; } + if (m_renderer->getHistoryIndex() == 0) { return; } + + const size_t nSample = m_renderer->getSampleCount(); + const size_t historyIdx = m_renderer->getHistoryIndex(); + const uint64_t sampleDuration = m_rendererCtx->getSampleDuration(); + + const size_t leftIdx = historyIdx - historyIdx % nSample; + const size_t midIdx = historyIdx; + double startTime = double((leftIdx * sampleDuration) >> 16) / 65536.; + double midTime = double((midIdx * sampleDuration) >> 16) / 65536.; + const double duration = double((nSample * sampleDuration) >> 16) / 65536.; + + const double offset = (m_renderer->getTimeOffset() >> 16) / 65536.; + startTime += offset; + midTime += offset; + + std::vector range1 = this->splitRange(startTime - duration, startTime, 10); + std::vector range2 = this->splitRange(startTime, startTime + duration, 10); + + gint w, h, x; + + gdk_drawable_get_size(widget->window, &w, &h); + GdkGC* drawGC = gdk_gc_new(widget->window); + for (const auto& i : range1) + { + if (i >= 0 && i + duration > midTime) + { + x = gint(((i + duration - startTime) / duration) * w); + PangoLayout* layout = gtk_widget_create_pango_layout(widget, getLabel(i).c_str()); + gdk_draw_layout(widget->window, drawGC, x, 5, layout); + gdk_draw_line(widget->window, drawGC, x, 0, x, 3); + g_object_unref(layout); + } + } + for (const auto& i : range2) + { + if (i >= 0 && i < midTime) + { + x = gint(((i - startTime) / duration) * w); + PangoLayout* layout = gtk_widget_create_pango_layout(widget, getLabel(i).c_str()); + gdk_draw_layout(widget->window, drawGC, x, 5, layout); + gdk_draw_line(widget->window, drawGC, x, 0, x, 3); + g_object_unref(layout); + } + } + g_object_unref(drawGC); + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerConditionIsTimeLocked.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerConditionIsTimeLocked.hpp new file mode 100644 index 0000000..2b63783 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerConditionIsTimeLocked.hpp @@ -0,0 +1,43 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerConditionIsTimeLocked : public IRuler +{ +public: + + CRulerConditionIsTimeLocked() : m_rendererCtx(nullptr), m_renderer(nullptr) { } + + void setRendererContext(const CRendererContext* ctx) override { m_rendererCtx = ctx; } + void setRenderer(const IRenderer* renderer) override { m_renderer = renderer; } + + bool operator()() const { return m_rendererCtx->isTimeLocked(); } + +protected: + const CRendererContext* m_rendererCtx; + const IRenderer* m_renderer; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerERPProgress.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerERPProgress.hpp new file mode 100644 index 0000000..9d53973 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerERPProgress.hpp @@ -0,0 +1,60 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerERPProgress : public IRuler +{ +public: + + void render() override + { + if (m_renderer == nullptr) { return; } + if (m_renderer->getSampleCount() == 0) { return; } + if (m_renderer->getHistoryCount() == 0) { return; } + if (m_renderer->getHistoryIndex() == 0) { return; } + + const float progress = m_rendererCtx->getERPFraction(); + if (progress != 0 && progress != 1) + { + glDisable(GL_TEXTURE_1D); + + glLineWidth(4); + glColor3f(0, 0, 0); + glBegin(GL_LINES); + glVertex2f(progress, 0); + glVertex2f(progress, 1); + glEnd(); + + glLineWidth(2); + glColor3f(0.25, 1, 0.25); + glBegin(GL_LINES); + glVertex2f(progress, 0); + glVertex2f(progress, 1); + glEnd(); + } + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerLeftChannelNames.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerLeftChannelNames.hpp new file mode 100644 index 0000000..a0d8b04 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerLeftChannelNames.hpp @@ -0,0 +1,53 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +#include + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerLeftChannelNames : public IRuler +{ +public: + + void renderLeft(GtkWidget* widget) override + { + gint w, h, lw, lh; + gdk_drawable_get_size(widget->window, &w, &h); + GdkGC* drawGC = gdk_gc_new(widget->window); + for (size_t i = 0; i < m_rendererCtx->getSelectedCount(); ++i) + { + const size_t idx = m_rendererCtx->getSelected(i); + const std::string label = (m_rendererCtx->getChannelName(idx) + " (" + std::to_string(idx + 1) + ")"); + PangoLayout* layout = gtk_widget_create_pango_layout(widget, label.c_str()); + pango_layout_get_size(layout, &lw, &lh); + lw /= PANGO_SCALE; + lh /= PANGO_SCALE; + gdk_draw_layout(widget->window, drawGC, w - lw, gint(((i + 0.5) * h) / m_rendererCtx->getSelectedCount() - float(lh) / 2), layout); + g_object_unref(layout); + } + g_object_unref(drawGC); + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerLeftTexture.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerLeftTexture.hpp new file mode 100644 index 0000000..5a96477 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerLeftTexture.hpp @@ -0,0 +1,60 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "mCRulerTexture.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerLeftTexture : public CRulerTexture +{ +public: + + void render() override + + { + this->preRender(); + + glColor4f(0, 0, 0, m_blackAlpha); + glBegin(GL_QUADS); + glTexCoord1f(0); + glVertex2f(0.00F, 0); + glVertex2f(0.05F, 0); + glTexCoord1f(1); + glVertex2f(0.05F, 1); + glVertex2f(0.00F, 1); + glEnd(); + + glColor4f(1, 1, 1, m_whiteAlpha); + glBegin(GL_QUADS); + glTexCoord1f(0); + glVertex2f(0.00F, 0); + glVertex2f(0.04F, 0); + glTexCoord1f(1); + glVertex2f(0.04F, 1); + glVertex2f(0.00F, 1); + glEnd(); + + this->postRender(); + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerProgress.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerProgress.hpp new file mode 100644 index 0000000..575bef3 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerProgress.hpp @@ -0,0 +1,48 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerProgress : public IRuler +{ +public: + + virtual void renderFinal(const float progress) = 0; + + void render() override + { + if (m_renderer == nullptr) { return; } + if (m_renderer->getSampleCount() == 0) { return; } + if (m_renderer->getHistoryCount() == 0) { return; } + if (m_renderer->getHistoryIndex() == 0) { return; } + + const size_t nSample = m_renderer->getSampleCount(); + const size_t historyIdx = m_renderer->getHistoryIndex(); + + const float progress = float(historyIdx - (float(historyIdx) / nSample) * nSample) / nSample; + if (progress != 0 && progress != 1) { this->renderFinal(progress); } + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerProgressH.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerProgressH.hpp new file mode 100644 index 0000000..6d55c2b --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerProgressH.hpp @@ -0,0 +1,59 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "mCRulerProgress.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerProgressH : public CRulerProgress +{ +public: + + void renderFinal(const float progress) override + { + const size_t selectedCount = m_rendererCtx->getSelectedCount(); + glDisable(GL_TEXTURE_1D); + glDisable(GL_BLEND); + + glLineWidth(4); + glColor3f(0, 0, 0); + glBegin(GL_LINES); + for (size_t i = 0; i < selectedCount; ++i) + { + glVertex2f(0, (i + progress) / selectedCount); + glVertex2f(1, (i + progress) / selectedCount); + } + glEnd(); + + glLineWidth(2); + glColor3f(0.25, 1, 0.25); + glBegin(GL_LINES); + for (size_t i = 0; i < selectedCount; ++i) + { + glVertex2f(0, (i + progress) / selectedCount); + glVertex2f(1, (i + progress) / selectedCount); + } + glEnd(); + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerProgressV.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerProgressV.hpp new file mode 100644 index 0000000..730b01d --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerProgressV.hpp @@ -0,0 +1,52 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "mCRulerProgress.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerProgressV : public CRulerProgress +{ +public: + + void renderFinal(const float progress) override + { + glDisable(GL_TEXTURE_1D); + glDisable(GL_BLEND); + + glLineWidth(4); + glColor3f(0, 0, 0); + glBegin(GL_LINES); + glVertex2f(progress, 0); + glVertex2f(progress, 1); + glEnd(); + + glLineWidth(2); + glColor3f(0.25, 1, 0.25); + glBegin(GL_LINES); + glVertex2f(progress, 0); + glVertex2f(progress, 1); + glEnd(); + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightCount.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightCount.hpp new file mode 100644 index 0000000..9832458 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightCount.hpp @@ -0,0 +1,80 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerRightCount : public IRuler +{ +public: + + void renderRight(GtkWidget* widget) override + { + if (m_renderer == nullptr) { return; } + if (m_renderer->getSampleCount() == 0) { return; } + if (m_renderer->getHistoryCount() == 0) { return; } + if (m_renderer->getHistoryIndex() == 0) { return; } + + const size_t nSample = m_renderer->getSampleCount(); + const size_t historyIdx = m_renderer->getHistoryIndex(); + + const size_t leftIdx1 = historyIdx - historyIdx % nSample; + const size_t leftIdx2 = historyIdx; + const size_t rightIdx1 = leftIdx2 - nSample; + const size_t rightIdx2 = leftIdx1; + + std::vector range1 = splitRange(double(leftIdx1), double(leftIdx1 + nSample), 10); + std::vector range2 = splitRange(double(rightIdx1), double(rightIdx1 + nSample), 10); + + gint w, h, y; + + gdk_drawable_get_size(widget->window, &w, &h); + GdkGC* drawGC = gdk_gc_new(widget->window); + + for (const auto& i : range1) + { + if (i >= leftIdx1 && i < leftIdx2) + { + y = gint(((i - leftIdx1) / nSample) * h); + PangoLayout* layout = gtk_widget_create_pango_layout(widget, getLabel(i).c_str()); + gdk_draw_layout(widget->window, drawGC, 5, y, layout); + gdk_draw_line(widget->window, drawGC, 0, y, 3, y); + g_object_unref(layout); + } + } + for (const auto& i : range2) + { + if (i >= rightIdx1 && i < rightIdx2) + { + y = gint(((i + nSample - leftIdx1) / nSample) * h); + PangoLayout* layout = gtk_widget_create_pango_layout(widget, getLabel(i).c_str()); + gdk_draw_layout(widget->window, drawGC, 5, y, layout); + gdk_draw_line(widget->window, drawGC, 0, y, 3, y); + g_object_unref(layout); + } + } + g_object_unref(drawGC); + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightFrequency.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightFrequency.hpp new file mode 100644 index 0000000..ac0e238 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightFrequency.hpp @@ -0,0 +1,68 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerRightFrequency : public IRuler +{ +public: + + void renderRight(GtkWidget* widget) override + { + const auto scale = float(m_rendererCtx->getSpectrumFrequencyRange()); + if (m_lastScale != scale) + { + m_range = splitRange(0, scale); + m_lastScale = scale; + } + + gint w, h; + gint lw, lh; + + const size_t nChannel = m_rendererCtx->getSelectedCount(); + for (size_t i = 0; i < nChannel; ++i) + { + gdk_drawable_get_size(widget->window, &w, &h); + GdkGC* drawGC = gdk_gc_new(widget->window); + for (const auto& r : m_range) + { + const gint y = gint((i + r / scale) * (h * 1.F / nChannel)); + PangoLayout* layout = gtk_widget_create_pango_layout(widget, getLabel(r).c_str()); + pango_layout_get_size(layout, &lw, &lh); + lw /= PANGO_SCALE; + lh /= PANGO_SCALE; + gdk_draw_layout(widget->window, drawGC, 8, h - y - lh / 2, layout); + gdk_draw_line(widget->window, drawGC, 0, h - y, 3, h - y); + g_object_unref(layout); + } + g_object_unref(drawGC); + } + } + +protected: + float m_lastScale = 1; + std::vector m_range; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightLabels.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightLabels.hpp new file mode 100644 index 0000000..da92e9d --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightLabels.hpp @@ -0,0 +1,66 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +template +class CRulerRightLabels : public IRuler +{ +public: + + void renderRight(GtkWidget* widget) override + { + gint w, h, lw, lh; + + const size_t nChannel = m_rendererCtx->getSelectedCount(); + for (size_t channel = 0; channel < nChannel; ++channel) + { + gdk_drawable_get_size(widget->window, &w, &h); + GdkGC* drawGC = gdk_gc_new(widget->window); + + const auto labelCount = float(m_rendererCtx->getDimensionLabelCount(TDim)); + + gint lastY = gint((channel + (-1 + 0.5F) / labelCount) * (h * 1.F / nChannel)); + + for (size_t label = 0; label < m_rendererCtx->getDimensionLabelCount(TDim); ++label) + { + const gint y = gint((channel + (label + 0.5F) / labelCount) * (h * 1.F / nChannel)); + if (y >= lastY + 10) + { + PangoLayout* layout = gtk_widget_create_pango_layout(widget, m_rendererCtx->getDimensionLabel(TDim, label)); + pango_layout_get_size(layout, &lw, &lh); + lw /= PANGO_SCALE; + lh /= PANGO_SCALE; + gdk_draw_layout(widget->window, drawGC, 8, h - y - lh / 2, layout); + gdk_draw_line(widget->window, drawGC, 0, h - y, 3, h - y); + g_object_unref(layout); + lastY = y; + } + } + g_object_unref(drawGC); + } + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightMonoScale.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightMonoScale.hpp new file mode 100644 index 0000000..16c8a03 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightMonoScale.hpp @@ -0,0 +1,68 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerRightMonoScale : public IRuler +{ +public: + + CRulerRightMonoScale() : m_lastScale(-1) { } + + void renderRight(GtkWidget* widget) override + { + const float scale = 1.F / m_rendererCtx->getScale(); + if (m_lastScale != scale) + { + if (m_rendererCtx->isPositiveOnly()) { m_range = splitRange(0, scale, IRuler_SplitCount); } + else { m_range = splitRange(-scale * .5, scale * .5, IRuler_SplitCount); } + m_lastScale = scale; + } + + const float offset = m_rendererCtx->isPositiveOnly() ? 0 : 0.5F; + + gint w, h, lw, lh; + + gdk_drawable_get_size(widget->window, &w, &h); + GdkGC* drawGC = gdk_gc_new(widget->window); + for (const auto& i : m_range) + { + PangoLayout* layout = gtk_widget_create_pango_layout(widget, getLabel(i).c_str()); + pango_layout_get_size(layout, &lw, &lh); + lw /= PANGO_SCALE; + lh /= PANGO_SCALE; + const gint y = gint((1 - (offset + i / scale)) * h); + gdk_draw_layout(widget->window, drawGC, 8, y - lh / 2, layout); + gdk_draw_line(widget->window, drawGC, 0, y, 3, y); + g_object_unref(layout); + } + g_object_unref(drawGC); + } + +protected: + float m_lastScale = 1; + std::vector m_range; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightScale.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightScale.hpp new file mode 100644 index 0000000..89b8bd7 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightScale.hpp @@ -0,0 +1,74 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerRightScale : public IRuler +{ +public: + + CRulerRightScale() : m_lastScale(-1) { } + + void renderRight(GtkWidget* pWidget) override + { + const size_t nSelected = m_rendererCtx->getSelectedCount(); + if (!nSelected) { return; } + + const float scale = 1.F / m_rendererCtx->getScale(); + if (m_lastScale != scale) + { + if (m_rendererCtx->isPositiveOnly()) { m_range = splitRange(0, scale, IRuler_SplitCount); } + else { m_range = splitRange(-scale * .5, scale * .5, IRuler_SplitCount); } + m_lastScale = scale; + } + + const float offset = m_rendererCtx->isPositiveOnly() ? 0.0F : 0.5F; + + gint w, h, lw, lh; + + gdk_drawable_get_size(pWidget->window, &w, &h); + GdkGC* drawGC = gdk_gc_new(pWidget->window); + for (size_t i = 0; i < m_rendererCtx->getSelectedCount(); ++i) + { + for (const auto& j : m_range) + { + PangoLayout* layout = gtk_widget_create_pango_layout(pWidget, getLabel(j).c_str()); + pango_layout_get_size(layout, &lw, &lh); + lw /= PANGO_SCALE; + lh /= PANGO_SCALE; + const gint y = gint((1 - (float(i) + offset + j / scale) / nSelected) * h); + gdk_draw_layout(pWidget->window, drawGC, 8, y - lh / 2, layout); + gdk_draw_line(pWidget->window, drawGC, 0, y, 3, y); + g_object_unref(layout); + } + } + g_object_unref(drawGC); + } + +protected: + float m_lastScale = 1; + std::vector m_range; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightTexture.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightTexture.hpp new file mode 100644 index 0000000..a6665fb --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerRightTexture.hpp @@ -0,0 +1,90 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "mCRulerTexture.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerRightTexture : public CRulerTexture +{ +public: + + CRulerRightTexture() : m_lastScale(-1) { } + + void render() override + { + this->preRender(); + + glColor4f(0, 0, 0, m_blackAlpha); + glBegin(GL_QUADS); + glTexCoord1f(0); + glVertex2f(0.95F, 0); + glVertex2f(1.00F, 0); + glTexCoord1f(1); + glVertex2f(1.00F, 1); + glVertex2f(0.95F, 1); + glEnd(); + + glColor4f(1, 1, 1, m_whiteAlpha); + glBegin(GL_QUADS); + glTexCoord1f(0); + glVertex2f(0.96F, 0); + glVertex2f(1.00F, 0); + glTexCoord1f(1); + glVertex2f(1.00F, 1); + glVertex2f(0.96F, 1); + glEnd(); + + this->postRender(); + } + + void renderRight(GtkWidget* widget) override + { + const float scale = 1.F / m_rendererCtx->getScale(); + if (m_lastScale != scale) + { + m_range = this->splitRange(-scale * .5, scale * .5); + m_lastScale = scale; + } + + gint w, h, lw, lh; + + gdk_drawable_get_size(widget->window, &w, &h); + GdkGC* drawGC = gdk_gc_new(widget->window); + for (const auto& i : m_range) + { + PangoLayout* layout = gtk_widget_create_pango_layout(widget, getLabel(i).c_str()); + pango_layout_get_size(layout, &lw, &lh); + lw /= PANGO_SCALE; + lh /= PANGO_SCALE; + gdk_draw_layout(widget->window, drawGC, 0, gint((.5 - i / scale) * h - lh * .5), layout); + g_object_unref(layout); + } + g_object_unref(drawGC); + } + +protected: + float m_lastScale; + std::vector m_range; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerTexture.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerTexture.hpp new file mode 100644 index 0000000..386efd3 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mCRulerTexture.hpp @@ -0,0 +1,61 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +class CRulerTexture : public IRuler +{ +protected: + + virtual void preRender() + + { + glDisable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + glEnable(GL_TEXTURE_1D); + glColor3f(1, 1, 1); + + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glLoadIdentity(); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + } + + virtual void postRender() + + { + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + + glMatrixMode(GL_TEXTURE); + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + } +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mTRulerAutoType.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mTRulerAutoType.hpp new file mode 100644 index 0000000..83c46d7 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mTRulerAutoType.hpp @@ -0,0 +1,89 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" +#include "../m_VisualizationTools.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +template +class TRulerAutoType : public IRuler +{ +public: + + void setRendererContext(const CRendererContext* ctx) override + { + IRuler::setRendererContext(ctx); + m_rulerSignal.setRendererContext(ctx); + m_rulerSpectrum.setRendererContext(ctx); + m_rulerMatrix.setRendererContext(ctx); + } + + void setRenderer(const IRenderer* renderer) override + { + IRuler::setRenderer(renderer); + m_rulerSignal.setRenderer(renderer); + m_rulerSpectrum.setRenderer(renderer); + m_rulerMatrix.setRenderer(renderer); + } + + void render() override + { + const CRendererContext::EDataType dataType = m_rendererCtx->getDataType(); + if (dataType == CRendererContext::EDataType::Signal) { m_rulerSignal.doRender(); } + else if (dataType == CRendererContext::EDataType::Spectrum) { m_rulerSpectrum.doRender(); } + else { m_rulerMatrix.doRender(); } + } + + void renderLeft(GtkWidget* widget) override + { + const CRendererContext::EDataType dataType = m_rendererCtx->getDataType(); + if (dataType == CRendererContext::EDataType::Signal) { m_rulerSignal.doRenderLeft(widget); } + else if (dataType == CRendererContext::EDataType::Spectrum) { m_rulerSpectrum.doRenderLeft(widget); } + else { m_rulerMatrix.doRenderLeft(widget); } + } + + void renderRight(GtkWidget* widget) override + { + const CRendererContext::EDataType dataType = m_rendererCtx->getDataType(); + if (dataType == CRendererContext::EDataType::Signal) { m_rulerSignal.doRenderRight(widget); } + else if (dataType == CRendererContext::EDataType::Spectrum) { m_rulerSpectrum.doRenderRight(widget); } + else { m_rulerMatrix.doRenderRight(widget); } + } + + void renderBottom(GtkWidget* widget) override + { + const CRendererContext::EDataType dataType = m_rendererCtx->getDataType(); + + if (dataType == CRendererContext::EDataType::Signal) { m_rulerSignal.doRenderBottom(widget); } + else if (dataType == CRendererContext::EDataType::Spectrum) { m_rulerSpectrum.doRenderBottom(widget); } + else { m_rulerMatrix.doRenderBottom(widget); } + } + +protected: + + TRulerMatrix m_rulerMatrix; + TRulerSignal m_rulerSignal; + TRulerSpectrum m_rulerSpectrum; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mTRulerConditionalPair.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mTRulerConditionalPair.hpp new file mode 100644 index 0000000..641e2e8 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mTRulerConditionalPair.hpp @@ -0,0 +1,58 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +template +class TRulerConditionalPair : public IRuler +{ +public: + + void setRendererContext(const CRendererContext* ctx) override + { + IRuler::setRendererContext(ctx); + condition.setRendererContext(ctx); + first.setRendererContext(ctx); + second.setRendererContext(ctx); + } + + void setRenderer(const IRenderer* renderer) override + { + IRuler::setRenderer(renderer); + condition.setRenderer(renderer); + first.setRenderer(renderer); + second.setRenderer(renderer); + } + + void render() override { condition() ? first.doRender() : second.doRender(); } + void renderLeft(GtkWidget* widget) override { condition() ? first.doRenderLeft(widget) : second.doRenderLeft(widget); } + void renderRight(GtkWidget* widget) override { condition() ? first.doRenderRight(widget) : second.doRenderRight(widget); } + void renderBottom(GtkWidget* widget) override { condition() ? first.doRenderBottom(widget) : second.doRenderBottom(widget); } + + TCondition condition; + T1 first; + T2 second; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mTRulerPair.hpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mTRulerPair.hpp new file mode 100644 index 0000000..d636bfe --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/ovp-advanced-visualization/src/ruler/mTRulerPair.hpp @@ -0,0 +1,74 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE Designer + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../mIRuler.hpp" + +namespace OpenViBE { +namespace AdvancedVisualization { +template +class TRulerPair : public IRuler +{ +public: + + void setRendererContext(const CRendererContext* ctx) override + { + IRuler::setRendererContext(ctx); + first.setRendererContext(ctx); + second.setRendererContext(ctx); + } + + void setRenderer(const IRenderer* renderer) override + { + IRuler::setRenderer(renderer); + first.setRenderer(renderer); + second.setRenderer(renderer); + } + + void render() override + { + first.doRender(); + second.doRender(); + } + + void renderLeft(GtkWidget* widget) override + { + first.doRenderLeft(widget); + second.doRenderLeft(widget); + } + + void renderRight(GtkWidget* widget) override + { + first.doRenderRight(widget); + second.doRenderRight(widget); + } + + void renderBottom(GtkWidget* widget) override + { + first.doRenderBottom(widget); + second.doRenderBottom(widget); + } + + T1 first; + T2 second; +}; +} // namespace AdvancedVisualization +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/CMakeLists.txt b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/CMakeLists.txt new file mode 100644 index 0000000..21c43e4 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/CMakeLists.txt @@ -0,0 +1,33 @@ +PROJECT(openvibe-plugins-designer-simple-visualization) +MESSAGE(STATUS "Now building ${PROJECT_NAME} ${PROJECT_VERSION} (${OV_PROJECT_BRANCH}~${OV_PROJECT_COMMITHASH})" ) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl) +INCLUDE("FindSourceRCProperties") +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +ADD_DEFINITIONS(-D_USE_MATH_DEFINES) # Definition for constant math as M_PI + +INCLUDE("AddOpenViBESDKComponents") +INCLUDE("FindOpenViBEVisualizationToolkit") +INCLUDE("FindThirdPartyGTK") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/plugins/simple-visualization) diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/Doc_BoxAlgorithm_2DTopographicMap.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/Doc_BoxAlgorithm_2DTopographicMap.dox-part new file mode 100644 index 0000000..fa04b99 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/Doc_BoxAlgorithm_2DTopographicMap.dox-part @@ -0,0 +1,117 @@ +/** + * \page BoxAlgorithm_2DTopographicMap 2D topographic map +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_2DTopographicMap_Description| + The 2D Topographic Map plugin is one possible way to combine signal measures and topographical information. It interpolates measured potentials + and maps them over the scalp surface using a color scale, making it easy to locate areas where brain activity is the most intense at any given time. + + Since this is a 2D plugin, one cannot freely move the camera around the head, as is the case with the 3D Topographic Map plugin + (see \ref BoxAlgorithm_3DTopographicMap). However, the user may switch between several views which, when combined, cover the whole of the skull area + over which potentials may be mapped. + + This plugin uses a spherical spline algorithm to interpolate potentials measured at electrode locations over an area of interest (which varies depending on the active view). + One can choose to interpolate potentials (which is done by interpolating along a spline whose control points lie at electrode locations) or current densities (which are + computed using the spline laplacian). +* |OVP_DocEnd_BoxAlgorithm_2DTopographicMap_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_2DTopographicMap_Inputs| +Note: the channel names specified on the 'Signal' and 'Channel Localization' input streams should match. Mismatches may not be reported by the box. For example, if electrode localisation file reader provides the positions of the electrodes from some configuration file, the channel names in that file should correspend to the names of the signal channels delivered in the Signal stream. + * |OVP_DocEnd_BoxAlgorithm_2DTopographicMap_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_2DTopographicMap_Input1| + * |OVP_DocEnd_BoxAlgorithm_2DTopographicMap_Input1| + +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_2DTopographicMap_Settings| +Offline options include interpolation type (direct spline interpolation for potentials, or spline laplacian to map currents) and delay applied when mapping data (0 by default). The latter +can prove useful in the case of e.g. neurofeedback experiments. Indeed, subjects may find it easier to observe their mental activity and the effect mental tasks can have on it +when it is displayed with a small delay (on the order of a few hundreds of milliseconds). + * |OVP_DocEnd_BoxAlgorithm_2DTopographicMap_Settings| + + * |OVP_DocBegin_BoxAlgorithm_2DTopographicMap_Setting1| + Spline or laplacian interpolation. + * |OVP_DocEnd_BoxAlgorithm_2DTopographicMap_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_2DTopographicMap_Setting2| + Delay to apply to displayed data, in seconds + * |OVP_DocEnd_BoxAlgorithm_2DTopographicMap_Setting2| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_2DTopographicMap_OnlineVisualizationSettings| + Online options include : + + - Radial/Axial Projection : these settings control the projection mode. Radial projection displays a greater mapping area, but localisation is less intuitive than + with axial projection. + - Map Potentials/Currents : these settings control the nature of mapped values. While potentials are computed from spline values, currents computation uses the spline laplacian. + - Toggle Electrodes : toggle electrodes on/off. + - Top/Left/Right/Back View : these buttons enable view switching. + - Delay : this cursor defines the delay to apply to the values that are drawn. + + \image html topographicmap2ddisplay_toolbar.png "2D Topographic Map toolbar." + * |OVP_DocEnd_BoxAlgorithm_2DTopographicMap_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_2DTopographicMap_Examples| + Practical example : + + This example is based on the following scenario file : + +\code +box-tutorials/topographic_map.xml +\endcode + + To see this plugin in action, one should first locate a file corresponding to a prerecorded EEG or MEG session and play it back using e. g. a GDF file reader or some other suitable plugin. + The GDF file used by default in this scenario is the following : + +\code +signals/real-hand-movements.gdf +\endcode + + Signal data read by this box can be forwarded to the 2D Topographic Map plugin, which has a single input connector. However, interpolating unprocessed data will not deliver very meaningful + results. To make it easier to analyse, one can restrict signals to a frequency band of interest. Also, it can be desirable to average out signals using DSPs (a typical formula + consists in visualising log(1+X*X) where X represents incoming signals) and epoch average boxes. This should result in smoothed out signals where peak activity areas will move gradually + between frames, thus making them easily identifiable on the map. + + Let's use a temporal filter box (found under 'Signal Processing > Filters') to restrict incoming signals to a frequency band of our choice, e.g. the Beta range, about 16-24 Hz. + Appropriate settings could go like this : 'Butterworth' filter type, 'Band Pass' filtering, 16Hz low pass band edge, 24Hz high pass band edge). + + Next, one can average out signals by applying the typical log(1+X*X) formula. A 'Simple DSP' (found under 'Signal Processing > Basic') can compute the square of the signal ('Equation' + should read 'X*X'), its output is averaged using a Signal Average box (found under 'Signal Processing > Basic'), and the decimal log of its output is obtained using another + Simple DSP box (formula : 'log(X)')). + + Finally, once data has been restricted to a given frequency band and averaged out, it can be further smoothed out in time using an Epoch Average box ('Signal Processing > Averaging'). + This allows to average data over a number of epochs. re information. + + Here is what an EEG recording may look like using the scenario that was just described : + + \image html topographicmap2ddisplay_online.png "Top view mapping of potentials interpolated from 9 EEG electrodes." + \image latex topographicmap2ddisplay_online.png "Top view mapping of potentials interpolated from 9 EEG electrodes." width=10cm + + * |OVP_DocEnd_BoxAlgorithm_2DTopographicMap_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_2DTopographicMap_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_2DTopographicMap_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/Doc_BoxAlgorithm_MatrixDisplay.dox-part b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/Doc_BoxAlgorithm_MatrixDisplay.dox-part new file mode 100644 index 0000000..dc03f17 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/Doc_BoxAlgorithm_MatrixDisplay.dox-part @@ -0,0 +1,81 @@ +/** + * \page BoxAlgorithm_MatrixDisplay Matrix display +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixDisplay_Description| + This box displays an input matrix in a table of gradient-colored squares. + WARNING : The color gradient is centered (50%) at the value 0. + The limits of colors match the minimum and maximum values, ever received or in real time if the corresponding setting is set. + These values can evolve symmetrically, using the maximum absolute value. + * |OVP_DocEnd_BoxAlgorithm_MatrixDisplay_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixDisplay_Inputs| + * |OVP_DocEnd_BoxAlgorithm_MatrixDisplay_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_MatrixDisplay_Input1| + The matrix to display. + * |OVP_DocEnd_BoxAlgorithm_MatrixDisplay_Input1| + +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixDisplay_Settings| + * |OVP_DocEnd_BoxAlgorithm_MatrixDisplay_Settings| + + * |OVP_DocBegin_BoxAlgorithm_MatrixDisplay_Setting1| +The color gradient used. + * |OVP_DocEnd_BoxAlgorithm_MatrixDisplay_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_MatrixDisplay_Setting2| + The number of color steps used in the gradient. The more you have steps, the smoother the gradient will be . + * |OVP_DocEnd_BoxAlgorithm_MatrixDisplay_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_MatrixDisplay_Setting3| + This parameter determines if the minimum and maximum values, matching the 0% and 100% color in the gradient, + should change symmetrically using the maximum absolute value and its opposite. + * |OVP_DocEnd_BoxAlgorithm_MatrixDisplay_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_MatrixDisplay_Setting4| + This parameter determines if the minimum and maximum values, matching the 0% and 100% color in the gradient, + should be recomputed for each matrix received. + * |OVP_DocEnd_BoxAlgorithm_MatrixDisplay_Setting4| +__________________________________________________________________ + +Online visualisation settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixDisplay_OnlineVisualizationSettings| + Online settings : + - Setting1 : Show/hide values + - Setting2 : Show/hide colors + + * |OVP_DocEnd_BoxAlgorithm_MatrixDisplay_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixDisplay_Examples| + Here is an example using a \ref BoxAlgorithm_ConfusionMatrix box that computes confusion matrix from classifier results. + + \image html "matrix_display_online.png" "Confusion matrix displayed using the Matrix Display" + \image latex "matrix_display_online.png" "Confusion matrix displayed using the Matrix Display" width=10cm + * |OVP_DocEnd_BoxAlgorithm_MatrixDisplay_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixDisplay_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_MatrixDisplay_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/Doc_BoxAlgorithm_2DTopographicMap.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/Doc_BoxAlgorithm_2DTopographicMap.rst new file mode 100644 index 0000000..b70e491 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/Doc_BoxAlgorithm_2DTopographicMap.rst @@ -0,0 +1,129 @@ +.. _Doc_BoxAlgorithm_2DTopographicMap: + +2D topographic map +================== + +.. container:: attribution + + :Author: + Vincent Delannoy + :Company: + INRIA/IRISA + +.. image:: images/Doc_BoxAlgorithm_2DTopographicMap.png + +The 2D Topographic Map plugin is one possible way to combine signal measures and topographical information. It interpolates measured potentials +and maps them over the scalp surface using a color scale, making it easy to locate areas where brain activity is the most intense at any given time. + +Since this is a 2D plugin, one cannot freely move the camera around the head. However, the user may switch between several views which, +when combined, cover the whole of the skull area over which potentials may be mapped. + +This plugin uses a spherical spline algorithm to interpolate potentials measured at electrode locations over an area of interest (which varies depending on the active view). +One can choose to interpolate potentials (which is done by interpolating along a spline whose control points lie at electrode locations) or current densities (which are +computed using the spline laplacian). + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Signal", "Streamed matrix" + "Channel localization", "Channel localisation" + +Note: the channel names specified on the 'Signal' and 'Channel Localization' input streams should match. Mismatches may not be reported by the box. For example, if electrode localisation file reader provides the positions of the electrodes from some configuration file, the channel names in that file should correspend to the names of the signal channels delivered in the Signal stream. + +.. _Doc_BoxAlgorithm_2DTopographicMap_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Interpolation type", "Spherical linear interpolation type", "1" + "Delay (in s)", "Float", "0" + +Offline options include interpolation type (direct spline interpolation for potentials, or spline laplacian to map currents) and delay applied when mapping data (0 by default). The latter +can prove useful in the case of e.g. neurofeedback experiments. Indeed, subjects may find it easier to observe their mental activity and the effect mental tasks can have on it +when it is displayed with a small delay (on the order of a few hundreds of milliseconds). + +Interpolation type +~~~~~~~~~~~~~~~~~~ + +Spline or laplacian interpolation. + +Delay (in s) +~~~~~~~~~~~~ + +Delay to apply to displayed data, in seconds + +.. _Doc_BoxAlgorithm_2DTopographicMap_VizSettings: + +Visualization Settings +---------------------- + +Online options include : + + +- Radial/Axial Projection : these settings control the projection mode. Radial projection displays a greater mapping area, but localisation is less intuitive than + +with axial projection. + +- Map Potentials/Currents : these settings control the nature of mapped values. While potentials are computed from spline values, currents computation uses the spline laplacian. +- Toggle Electrodes : toggle electrodes on/off. +- Top/Left/Right/Back View : these buttons enable view switching. +- Delay : this cursor defines the delay to apply to the values that are drawn. + + +.. figure:: images/topographicmap2ddisplay_toolbar.png + :alt: 2D Topographic Map toolbar. + :align: center + + 2D Topographic Map toolbar. + +.. _Doc_BoxAlgorithm_2DTopographicMap_Examples: + +Examples +-------- + +Practical example : + +This example is based on the following scenario file : + + +.. code:: + + box-tutorials/topographic_map.xml + +To see this plugin in action, one should first locate a file corresponding to a prerecorded EEG or MEG session and play it back using e. g. a GDF file reader or some other suitable plugin. +The GDF file used by default in this scenario is the following : + + +.. code:: + + signals/real-hand-movements.gdf + +Signal data read by this box can be forwarded to the 2D Topographic Map plugin, which has a single input connector. However, interpolating unprocessed data will not deliver very meaningful +results. To make it easier to analyse, one can restrict signals to a frequency band of interest. Also, it can be desirable to average out signals using DSPs (a typical formula +consists in visualising log(1+X\*X) where X represents incoming signals) and epoch average boxes. This should result in smoothed out signals where peak activity areas will move gradually +between frames, thus making them easily identifiable on the map. + +Let's use a temporal filter box (found under 'Signal Processing > Filters') to restrict incoming signals to a frequency band of our choice, e.g. the Beta range, about 16-24 Hz. +Appropriate settings could go like this : 'Butterworth' filter type, 'Band Pass' filtering, 16Hz low pass band edge, 24Hz high pass band edge). + +Next, one can average out signals by applying the typical log(1+X\*X) formula. A 'Simple DSP' (found under 'Signal Processing > Basic') can compute the square of the signal ('Equation' +should read 'X\*X'), its output is averaged using a Signal Average box (found under 'Signal Processing > Basic'), and the decimal log of its output is obtained using another +Simple DSP box (formula : 'log(X)')). + +Finally, once data has been restricted to a given frequency band and averaged out, it can be further smoothed out in time using an Epoch Average box ('Signal Processing > Averaging'). +This allows to average data over a number of epochs. re information. + +Here is what an EEG recording may look like using the scenario that was just described : + +.. figure:: images/topographicmap2ddisplay_online.png + :alt: Top view mapping of potentials interpolated from 9 EEG electrodes. + :align: center + + Top view mapping of potentials interpolated from 9 EEG electrodes. + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/Doc_BoxAlgorithm_MatrixDisplay.rst b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/Doc_BoxAlgorithm_MatrixDisplay.rst new file mode 100644 index 0000000..dccefa7 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/Doc_BoxAlgorithm_MatrixDisplay.rst @@ -0,0 +1,94 @@ +.. _Doc_BoxAlgorithm_MatrixDisplay: + +Matrix Display +============== + +.. container:: attribution + + :Author: + Laurent Bonnet + :Company: + INRIA/IRISA + +.. image:: images/Doc_BoxAlgorithm_MatrixDisplay.png + +The streamed matrix can be visualized using a table of values and/or a color gradient. + +This box displays an input matrix in a table of gradient-colored squares. +**WARNING : The color gradient is centered (50%) at the value 0.** +The limits of colors match the minimum and maximum values, ever received or in real time if the corresponding setting is set. +These values can evolve symmetrically, using the maximum absolute value. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Matrix", "Streamed matrix" + +Matrix +~~~~~~ + +The matrix to display. + +.. _Doc_BoxAlgorithm_MatrixDisplay_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Color gradient", "Color Gradient", "0:2,36,58; 50:100,100,100; 100:83,17,20" + "Steps", "Integer", "100" + "Symetric min/max", "Boolean", "false" + "Real time min/max", "Boolean", "false" + +Color gradient +~~~~~~~~~~~~~~ + +The color gradient used. + +Steps +~~~~~ + +The number of color steps used in the gradient. The more you have steps, the smoother the gradient will be . + +Symetric min/max +~~~~~~~~~~~~~~~~ + +This parameter determines if the minimum and maximum values, matching the 0% and 100% color in the gradient, +should change symmetrically using the maximum absolute value and its opposite. + +Real time min/max +~~~~~~~~~~~~~~~~~ + +This parameter determines if the minimum and maximum values, matching the 0% and 100% color in the gradient, +should be recomputed for each matrix received. + +.. _Doc_BoxAlgorithm_MatrixDisplay_VizSettings: + +Visualization Settings +---------------------- + +Online settings : + +- Setting1 : Show/hide values +- Setting2 : Show/hide colors + + + +.. _Doc_BoxAlgorithm_MatrixDisplay_Examples: + +Examples +-------- + +Here is an example using a :ref:`Doc_BoxAlgorithm_ConfusionMatrix` box that computes confusion matrix from classifier results. + +.. figure:: images/matrix_display_online.png + :alt: Confusion matrix displayed using the Matrix Display + :align: center + + Confusion matrix displayed using the Matrix Display + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/images/Doc_BoxAlgorithm_2DTopographicMap.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/images/Doc_BoxAlgorithm_2DTopographicMap.png new file mode 100644 index 0000000..76f5bce Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/images/Doc_BoxAlgorithm_2DTopographicMap.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/images/Doc_BoxAlgorithm_MatrixDisplay.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/images/Doc_BoxAlgorithm_MatrixDisplay.png new file mode 100644 index 0000000..7d1bbf9 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/images/Doc_BoxAlgorithm_MatrixDisplay.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/images/matrix_display_online.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/images/matrix_display_online.png new file mode 100644 index 0000000..811751c Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/images/matrix_display_online.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/images/topographicmap2ddisplay_online.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/images/topographicmap2ddisplay_online.png new file mode 100644 index 0000000..36411b7 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/images/topographicmap2ddisplay_online.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/images/topographicmap2ddisplay_toolbar.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/images/topographicmap2ddisplay_toolbar.png new file mode 100644 index 0000000..3c4d70f Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/boxes/images/topographicmap2ddisplay_toolbar.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/matrix_display_online.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/matrix_display_online.png new file mode 100644 index 0000000..811751c Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/matrix_display_online.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/topographicmap2ddisplay_online.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/topographicmap2ddisplay_online.png new file mode 100644 index 0000000..36411b7 Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/topographicmap2ddisplay_online.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/topographicmap2ddisplay_toolbar.png b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/topographicmap2ddisplay_toolbar.png new file mode 100644 index 0000000..3c4d70f Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/doc/topographicmap2ddisplay_toolbar.png differ diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/share/openvibe-simple-visualization-MatrixDisplay.ui b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/share/openvibe-simple-visualization-MatrixDisplay.ui new file mode 100644 index 0000000..059ef7e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/share/openvibe-simple-visualization-MatrixDisplay.ui @@ -0,0 +1,80 @@ + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 8 + 8 + 8 + True + + + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Matrix Display + dialog + + + True + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + show values + gtk-refresh + True + + + False + True + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + show colors + gtk-select-color + True + + + False + True + + + + + + + + + True + + + True + X + + + + + + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/share/openvibe-simple-visualization-TopographicMap2D.ui b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/share/openvibe-simple-visualization-TopographicMap2D.ui new file mode 100644 index 0000000..f6f2c95 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/share/openvibe-simple-visualization-TopographicMap2D.ui @@ -0,0 +1,208 @@ + + + + + + 2 + 0.10000000000000001 + 0.5 + 10 + + + 2D Topographic Map Toolbar + False + mouse + dialog + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + both + False + + + True + Radial Projection + gtk-convert + True + + + False + True + + + + + True + Axial Projection + gtk-convert + RadialProjection + + + False + True + + + + + True + + + False + + + + + True + Map Potentials + gtk-preferences + True + + + False + True + + + + + True + Map Currents + gtk-preferences + MapPotentials + + + False + True + + + + + True + + + False + + + + + True + Toggle Electrodes + gtk-info + + + False + True + + + + + True + + + False + + + + + True + Top View + gtk-orientation-portrait + True + + + False + True + + + + + True + Left View + gtk-orientation-portrait + TopView + + + False + True + + + + + True + Right View + gtk-orientation-portrait + TopView + + + False + True + + + + + True + Back View + gtk-orientation-portrait + TopView + + + False + True + + + + + True + + + False + + + + + True + + + True + + + 100 + True + True + adjustment1 + on + on + False + 0 + + + 0 + + + + + True + Delay (s) + + + 1 + + + + + + + False + + + + + + + + + True + + + + diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/linpack-license.txt b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/linpack-license.txt new file mode 100644 index 0000000..02bbb60 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/linpack-license.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. \ No newline at end of file diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/linpack.cpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/linpack.cpp new file mode 100644 index 0000000..9215f2a --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/linpack.cpp @@ -0,0 +1,613 @@ +/*****************************************************************************/ +/** **/ +/** linpack : matrix computation **/ +/** **/ +/** from Linpack User's guide **/ +/** J.J. Dongarra, J.R. Brunch, C.B. Moler, G.W. Stewart **/ +/** SIAM Philadelphia 1979 **/ +/** **/ +/** Routines are translated to C from original FORTRAN code **/ +/** **/ +/*****************************************************************************/ + +/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/ +/*& Libraries to include &*/ +/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/ + +#include +#include + +#define dmax(x,y) (((x) > (y)) ? (x) : (y)) + +void saxpy(const int* n, const double* sa, const double* sx, const int* incx, double* sy, const int* incy); +double sdot(const int* n, const double* sx, const int* incx, const double* sy, const int* incy); +void sswap(const int* n, double* sx, const int* incx, double* sy, const int* incy); +int isamax(const int* n, const double* sx, const int* incx); + +/************************************************************************/ +/* sspfa */ +/* */ +/* Factorization of a symmetric matrix A (n x n) */ +/* by elimination with symmetric pivoting */ +/* */ +/* to solve A * X = B, follow sspfa by sspl */ +/* */ +/* IN */ +/* ap : 1-D array (double) */ +/* the packed form of the symmetric matrix A */ +/* the columns of the upper triangle are stored sequentially */ +/* in a 1-dimensional array of length n*(n+1)/2 */ +/* n : order of matrix A (integer) */ +/* */ +/* OUT */ +/* ap : 1-D array (double) */ +/* a block diagonal matrix and the multipliers which were used */ +/* to obtain it stored in packed form. */ +/* the factorization can be written A = U * D * trans(U) */ +/* where U is a product of permutation and unit upper triangular*/ +/* matrices, trans(U) is the transpose of U, and D is block */ +/* diagonal with 1 by 1 and 2 by 2 blocks. */ +/* kpvt : 1-D array (integer) */ +/* vector of pivot indices */ +/* info : return code (integer) */ +/* = 0 normal value */ +/* = k if the k-th pivot block is singular */ +/* */ +/************************************************************************/ + +void sspfa(double* ap, const int* n, int* kpvt, int* info) +{ + double alpha, ak, bk, denom, t, tulk, tulkm1, absakk; + double akm1, bkm1, colmax, rowmax; + int ij, ik, ikm1, im = 0, imj, imk, imax, imaxp1, imim; + int j, jj, jk, jkm1, jmax, jmim; + int k, kk, km1, km2, km1K, km1Km1; + int kstep, swap; + int one, itmp; + + one = 1; + alpha = 0.6404; + *info = 0; + k = *n; + ik = (*n * (*n - 1)) / 2; + +begin_dspfa:; + if (k == 0) { goto end_dspfa; } + if (k <= 1) + { + *kpvt = 1; + if (*ap == 0.0) { *info = 1; } + goto end_dspfa; + } + km1 = k - 1; + kk = ik + k; + absakk = fabs(*(ap + kk - 1)); + itmp = k - 1; + imax = isamax(&itmp, (ap + ik), &one); + imk = ik + imax; + colmax = fabs(*(ap + imk - 1)); + if (absakk >= (alpha * colmax)) + { + kstep = 1; + swap = 0; + } + else + { + rowmax = 0.0; + imaxp1 = imax + 1; + im = (imax * (imax - 1)) / 2; + imj = im + 2 * imax; + for (j = imaxp1; j <= k; ++j) + { + rowmax = dmax(rowmax, fabs(*(ap + imj - 1))); + imj += j; + } + if (imax != 1) + { + itmp = imax - 1; + jmax = isamax(&itmp, (ap + im), &one); + jmim = jmax + im; + rowmax = dmax(rowmax, fabs(*(ap + jmim - 1))); + } + imim = imax + im; + if (fabs(*(ap + imim - 1)) >= (alpha * rowmax)) + { + kstep = 1; + swap = 1; + } + else + { + if (absakk >= (alpha * colmax * (colmax / rowmax))) + { + kstep = 1; + swap = 0; + } + else + { + kstep = 2; + swap = (imax != km1); + } + } + } + if (dmax(absakk, colmax) == 0.0) + { + *(kpvt + k - 1) = k; + *info = k; + } + else + { + if (kstep != 2) + { + if (swap) + { + sswap(&imax, (ap + im), &one, (ap + ik), &one); + imj = ik + imax; + for (jj = imax; jj <= k; ++jj) + { + j = k + imax - jj; + jk = ik + j; + t = *(ap + jk - 1); + *(ap + jk - 1) = *(ap + imj - 1); + *(ap + imj - 1) = t; + imj -= j - 1; + } + } + ij = ik - (k - 1); + for (jj = 1; jj <= km1; ++jj) + { + j = k - jj; + jk = ik + j; + tulk = -(*(ap + jk - 1)) / (*(ap + kk - 1)); + t = tulk; + saxpy(&j, &t, (ap + ik), &one, (ap + ij), &one); + // FIXME is it necessary to keep next line uncomment ? + //ijj = ij + j; + *(ap + jk - 1) = tulk; + ij -= j - 1; + } + *(kpvt + k - 1) = k; + if (swap) { *(kpvt + k - 1) = imax; } + } + else + { + km1K = ik + k - 1; + ikm1 = ik - (k - 1); + if (swap) + { + sswap(&imax, (ap + im), &one, (ap + ikm1), &one); + imj = ikm1 + imax; + for (jj = imax; jj <= km1; ++jj) + { + j = km1 + imax - jj; + jkm1 = ikm1 + j; + t = *(ap + jkm1 - 1); + *(ap + jkm1 - 1) = *(ap + imj - 1); + *(ap + imj - 1) = t; + imj -= j - 1; + } + t = *(ap + km1K - 1); + *(ap + km1K - 1) = *(ap + imk - 1); + *(ap + imk - 1) = t; + } + km2 = k - 2; + if (km2 != 0) + { + ak = *(ap + kk - 1) / (*(ap + km1K - 1)); + km1Km1 = ikm1 + k - 1; + akm1 = *(ap + km1Km1 - 1) / (*(ap + km1K - 1)); + denom = 1.0 - ak * akm1; + ij = ik - (k - 1) - (k - 2); + for (jj = 1; jj <= km2; ++jj) + { + j = km1 - jj; + jk = ik + j; + bk = *(ap + jk - 1) / (*(ap + km1K - 1)); + jkm1 = ikm1 + j; + bkm1 = *(ap + jkm1 - 1) / (*(ap + km1K - 1)); + tulk = (akm1 * bk - bkm1) / denom; + tulkm1 = (ak * bkm1 - bk) / denom; + t = tulk; + saxpy(&j, &t, (ap + ik), &one, (ap + ij), &one); + t = tulkm1; + saxpy(&j, &t, (ap + ikm1), &one, (ap + ij), &one); + *(ap + jk - 1) = tulk; + *(ap + jkm1 - 1) = tulkm1; + // FIXME is it necessary to keep next line uncomment ? + //ijj = ij + j; + ij -= j - 1; + } + } + *(kpvt + k - 1) = 1 - k; + if (swap) { *(kpvt + k - 1) = -imax; } + *(kpvt + k - 2) = *(kpvt + k - 1); + } + } + ik -= k - 1; + if (kstep == 2) { ik -= k - 2; } + k -= kstep; + goto begin_dspfa; +end_dspfa:; +} + +/************************************************************************/ +/* sspsl */ +/* */ +/* Solving a symmetric system A * X = B using the factorization */ +/* computed by sspfa (with return code = 0) */ +/* */ +/* IN */ +/* ap : 1-D array (double) */ +/* the output array from sspfa */ +/* n : order of matrix A (integer) */ +/* kpvt : 1-D array (integer) */ +/* the pivot vector from sspfa */ +/* b : 1-D array (double) */ +/* the right hand side vector */ +/* */ +/* OUT */ +/* b : 1-D array (double) */ +/* the solution vector X */ +/* */ +/************************************************************************/ + +void sspsl(double* ap, const int* n, const int* kpvt, double* b) +{ + double temp; + int kp; + int one, oneb, itmp; + + one = 1; + oneb = 1; + int k = *n; + int ik = (*n * (*n - 1)) / 2; + + while (k > 0) + { + int kk = ik + k; + if (*(kpvt + k - 1) >= 0) + { + if (k != 1) + { + kp = *(kpvt + k - 1); + if (kp != k) + { + temp = *(b + k - 1); + *(b + k - 1) = *(b + kp - 1); + *(b + kp - 1) = temp; + } + itmp = k - 1; + saxpy(&itmp, (b + k - 1), (ap + ik), &one, b, &oneb); + } + *(b + k - 1) /= *(ap + kk - 1); + k--; + ik -= k; + } + else + { + const int ikm1 = ik - (k - 1); + if (ik != 2) + { + kp = abs(*(kpvt + k - 1)); + if (kp != (k - 1)) + { + temp = *(b + k - 2); + *(b + k - 2) = *(b + kp - 1); + *(b + kp - 1) = temp; + } + itmp = k - 2; + saxpy(&itmp, (b + k - 1), (ap + ik), &one, b, &oneb); + saxpy(&itmp, (b + k - 2), (ap + ikm1), &one, b, &oneb); + } + const int km1k = ik + k - 1; + kk = ik + k; + const double ak = *(ap + kk - 1) / (*(ap + km1k - 1)); + const int km1km1 = ikm1 + k - 1; + const double akm1 = *(ap + km1km1 - 1) / (*(ap + km1k - 1)); + const double bk = *(b + k - 1) / (*(ap + km1k - 1)); + const double bkm1 = *(b + k - 2) / (*(ap + km1k - 1)); + const double denom = ak * akm1 - 1.0; + *(b + k - 1) = (akm1 * bk - bkm1) / denom; + *(b + k - 2) = (ak * bkm1 - bk) / denom; + k -= 2; + ik -= (2 * k + 1); + } + } + { + k = 1; + ik = 0; + while (k <= *n) + { + if (*(kpvt + k - 1) >= 0) + { + if (k != 1) + { + itmp = k - 1; + *(b + k - 1) += sdot(&itmp, (ap + ik), &one, b, &oneb); + kp = *(kpvt + k - 1); + if (kp != k) + { + temp = *(b + k - 1); + *(b + k - 1) = *(b + kp - 1); + *(b + kp - 1) = temp; + } + } + ik += k; + k++; + } + else + { + if (k != 1) + { + itmp = k - 1; + *(b + k - 1) += sdot(&itmp, (ap + ik), &one, b, &oneb); + const int ikp1 = ik + k; + *(b + k) += sdot(&itmp, (ap + ikp1), &one, b, &oneb); + kp = abs(*(kpvt + k - 1)); + if (kp != k) + { + temp = *(b + k - 1); + *(b + k - 1) = *(b + kp - 1); + *(b + kp - 1) = temp; + } + } + ik += (2 * k + 1); + k += 2; + } + } + } +} + +/************************************************************************/ +/* saxpy */ +/* */ +/* Constant times a vector plus a vector */ +/* Y = A*X + Y */ +/* uses enrolled loops for increments equal to 1 */ +/* */ +/* IN */ +/* n : length of vector X and Y (integer) */ +/* sa : real constant A (double) */ +/* sx : vector X (double) */ +/* incx : increment for X (integer) */ +/* sy : vector Y (double) */ +/* incy : increment for Y (integer) */ +/* */ +/* OUT */ +/* sy : the result vector A*X + Y (double) */ +/* */ +/************************************************************************/ + +void saxpy(const int* n, const double* sa, const double* sx, const int* incx, double* sy, const int* incy) +{ + int i; + + if (*n > 0) + { + if (*sa != 0) + { + if ((*incx != 1) || (*incy != 1)) + { + int ix = 1; + int iy = 1; + if (*incx < 0) { ix = (1 - *n) * (*incx) + 1; } + if (*incy < 0) { iy = (1 - *n) * (*incy) + 1; } + for (i = 1; i <= *n; ++i) + { + *(sy + iy - 1) += *sa * (*(sx + ix - 1)); + ix += *incx; + iy += *incy; + } + } + else + { + int ok = 1; + int m = int(fmod(double(*n), 4.0)); + if (m != 0) + { + for (i = 1; i <= m; ++i) { *(sy + i - 1) += *sa * (*(sx + i - 1)); } + if (*n < 4) { ok = 0; } + } + if (ok == 1) + { + for (i = ++m; i <= *n; i += 4) + { + *(sy + i - 1) += *sa * (*(sx + i - 1)); + *(sy + i) += *sa * (*(sx + i)); + *(sy + i + 1) += *sa * (*(sx + i + 1)); + *(sy + i + 2) += *sa * (*(sx + i + 2)); + } + } + } + } + } +} + +/************************************************************************/ +/* sdot */ +/* */ +/* Forms the dot product of 2 vectors */ +/* = X.Y */ +/* uses enrolled loops for increments equal to 1 */ +/* */ +/* IN */ +/* n : length of vector X and Y (integer) */ +/* sx : vector X (double) */ +/* incx : increment for X (integer) */ +/* sy : vector Y (double) */ +/* incy : increment for Y (integer) */ +/* */ +/* OUT */ +/* function value : the result value X.Y (double) */ +/* */ +/************************************************************************/ + +double sdot(const int* n, const double* sx, const int* incx, const double* sy, const int* incy) +{ + int i; + double stemp = 0.0; + + if (*n > 0) + { + if ((*incx != 1) || (*incy != 1)) + { + int ix = 1; + int iy = 1; + if (*incx < 0) { ix = (1 - *n) * (*incx) + 1; } + if (*incy < 0) { iy = (1 - *n) * (*incy) + 1; } + for (i = 1; i <= *n; ++i) + { + stemp += *(sx + ix - 1) * (*(sy + iy - 1)); + ix += *incx; + iy += *incy; + } + } + else + { + int ok = 1; + int m = int(fmod(double(*n), 5.0)); + if (m != 0) + { + for (i = 1; i <= m; ++i) { stemp += *(sx + i - 1) * (*(sy + i - 1)); } + if (*n < 5) { ok = 0; } + } + if (ok == 1) + { + for (i = ++m; i <= *n; i += 5) + { + stemp += *(sx + i - 1) * (*(sy + i - 1)) + *(sx + i) * (*(sy + i)) + + *(sx + i + 1) * (*(sy + i + 1)) + *(sx + i + 2) * (*(sy + i + 2)) + + *(sx + i + 3) * (*(sy + i + 3)); + } + } + } + } + return stemp; +} + +/************************************************************************/ +/* sswap */ +/* */ +/* Interchanges 2 vectors X and Y */ +/* uses enrolled loops for increments equal to 1 */ +/* */ +/* IN */ +/* n : length of vector X and Y (integer) */ +/* sx : vector X (double) */ +/* incx : increment for X (integer) */ +/* sy : vector Y (double) */ +/* incy : increment for Y (integer) */ +/* */ +/* OUT */ +/* sx : vector Y (double) */ +/* sy : vector X (double) */ +/* */ +/************************************************************************/ + +void sswap(const int* n, double* sx, const int* incx, double* sy, const int* incy) +{ + double stemp; + int i; + + if (*n > 0) + { + if ((*incx != 1) || (*incy != 1)) + { + int ix = 1; + int iy = 1; + if (*incx < 0) { ix = (1 - *n) * (*incx) + 1; } + if (*incy < 0) { iy = (1 - *n) * (*incy) + 1; } + for (i = 1; i <= *n; ++i) + { + stemp = *(sx + ix - 1); + *(sx + ix - 1) = *(sy + iy - 1); + *(sy + iy - 1) = stemp; + ix += *incx; + iy += *incy; + } + } + else + { + int ok = 1; + int m = int(fmod(double(*n), 3.0)); + if (m != 0) + { + for (i = 1; i <= m; ++i) + { + stemp = *(sx + i - 1); + *(sx + i - 1) = *(sy + i - 1); + *(sy + i - 1) = stemp; + } + if (*n < 3) { ok = 0; } + } + if (ok == 1) + { + for (i = ++m; i <= *n; i += 3) + { + stemp = *(sx + i - 1); + *(sx + i - 1) = *(sy + i - 1); + *(sy + i - 1) = stemp; + stemp = *(sx + i); + *(sx + i) = *(sy + i); + *(sy + i) = stemp; + stemp = *(sx + i + 1); + *(sx + i + 1) = *(sy + i + 1); + *(sy + i + 1) = stemp; + } + } + } + } +} + +/************************************************************************/ +/* isamax */ +/* */ +/* Finds the index of element having max absolute value in vector X */ +/* */ +/* IN */ +/* n : length of vector X (integer) */ +/* sx : vector X (double) */ +/* incx : increment for X (integer) */ +/* */ +/* OUT */ +/* function value : index of max absolute value of X (integer) */ +/* */ +/************************************************************************/ + +int isamax(const int* n, const double* sx, const int* incx) +{ + double smax; + int i; + + int ida = 0; + if (*n < 1) { return ida; } + ida = 1; + if (*n == 1) { return ida; } + if (*incx != 1) + { + int ix = 1; + smax = fabs(*sx); + ix += *incx; + for (i = 2; i <= *n; ++i) + { + if (fabs(*(sx + ix - 1)) > smax) + { + ida = i; + smax = fabs(*(sx + ix - 1)); + } + ix += *incx; + } + } + else + { + smax = fabs(*sx); + for (i = 2; i <= *n; ++i) + { + if (fabs(*(sx + i - 1)) > smax) + { + ida = i; + smax = fabs(*(sx + i - 1)); + } + } + } + return ida; +} diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/linpack.h b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/linpack.h new file mode 100644 index 0000000..719685d --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/linpack.h @@ -0,0 +1,11 @@ +/*************************************************************************************/ +/* linpack.h */ +/*************************************************************************************/ + +/*************************************************************************************/ +/* Linpack subroutines */ +/*************************************************************************************/ +#pragma once + +void sspfa(double* ap, const int* n, int* kpvt, int* info); +void sspsl(double* ap, const int* n, const int* kpvt, double* b); diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/ovpCAlgorithmSphericalSplineInterpolation.cpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/ovpCAlgorithmSphericalSplineInterpolation.cpp new file mode 100644 index 0000000..8370b79 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/ovpCAlgorithmSphericalSplineInterpolation.cpp @@ -0,0 +1,267 @@ +#include "ovpCAlgorithmSphericalSplineInterpolation.h" + +//INSERM lib +#include "spline_sph.h" + +#include //DBL_MAX +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Test { + +bool CAlgorithmSphericalSplineInterpolation::initialize() + +{ + m_firstProcess = true; + m_coords.clear(); + m_coordsPtr.clear(); + m_splineCoefs.clear(); + m_laplacianCoefs.clear(); + + ip_splineOrder.initialize(getInputParameter(OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_SplineOrder)); + ip_nControlPoints.initialize(getInputParameter(OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsCount)); + ip_controlPointsCoords.initialize(getInputParameter(OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsCoordinates)); + ip_controlPointsValues.initialize(getInputParameter(OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsValues)); + ip_samplePointsCoords.initialize(getInputParameter(OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_SamplePointsCoordinates)); + + op_samplePointsValues.initialize(getOutputParameter(OVP_Algorithm_SphericalSplineInterpolation_OutputParameterId_SamplePointsValues)); + op_samplePointsValues->setDimensionCount(1); + op_minSamplePointValue.initialize(getOutputParameter(OVP_Algorithm_SphericalSplineInterpolation_OutputParameterId_MinSamplePointValue)); + op_maxSamplePointValue.initialize(getOutputParameter(OVP_Algorithm_SphericalSplineInterpolation_OutputParameterId_MaxSamplePointValue)); + + return true; +} + +bool CAlgorithmSphericalSplineInterpolation::uninitialize() + +{ + ip_splineOrder.uninitialize(); + ip_nControlPoints.uninitialize(); + ip_controlPointsCoords.uninitialize(); + ip_controlPointsValues.uninitialize(); + ip_samplePointsCoords.uninitialize(); + + op_samplePointsValues.uninitialize(); + op_minSamplePointValue.uninitialize(); + op_maxSamplePointValue.uninitialize(); + + m_coords.clear(); + m_coordsPtr.clear(); + m_splineCoefs.clear(); + m_laplacianCoefs.clear(); + + return true; +} + +bool CAlgorithmSphericalSplineInterpolation::process() + +{ + if (m_firstProcess) + { + //store coords as doubles + m_coords.resize(3 * size_t(ip_nControlPoints)); + //set up matrix of pointers to double coords matrix + m_coordsPtr.resize(size_t(ip_nControlPoints)); + //fill both matrices + for (size_t i = 0; i < size_t(ip_nControlPoints); ++i) + { + const size_t id = 3 * i; + m_coords[id] = double((*ip_controlPointsCoords)[id]); + m_coords[id + 1] = double((*ip_controlPointsCoords)[id + 1]); + m_coords[id + 2] = double((*ip_controlPointsCoords)[id + 2]); + m_coordsPtr[i] = id + m_coords.data(); + } + m_firstProcess = false; + } + + //do we want to precompute tables? + if (isInputTriggerActive(OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_PrecomputeTables)) + { + //compute cos/sin values used in spline polynomias + const int result = SplineTables(int(ip_splineOrder), m_pot.data(), m_scd.data()); + + if (result != 0) + { + getLogManager() << Kernel::LogLevel_ImportantWarning << "Spline tables precomputation failed!\n"; + activateOutputTrigger(OVP_Algorithm_SphericalSplineInterpolation_OutputTriggerId_Error, true); + } + } + + if (isInputTriggerActive(OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_ComputeSplineCoefs)) + { + if (m_splineCoefs.empty() && size_t(ip_nControlPoints) != 0) { m_splineCoefs.resize(size_t(ip_nControlPoints) + 1); } + + //compute spline ponderation coefficients using spline values + //FIXME : have a working copy of control points values stored as doubles? + const int result = SplineCoef(int(ip_nControlPoints), m_coordsPtr.data(), ip_controlPointsValues->getBuffer(), m_pot.data(), m_splineCoefs.data()); + + if (result != 0) + { + getLogManager() << Kernel::LogLevel_ImportantWarning << "Spline coefficients computation failed!\n"; + + const Kernel::ELogLevel level = Kernel::LogLevel_Debug; + + getLogManager() << level << "CtrlPointsCount = " << int(ip_nControlPoints) << "\n"; + const auto size = size_t(ip_nControlPoints); + std::stringstream ss; + ss.fill('0'); + ss.precision(1); + + ss << "CtrlPointsCoords = "; + for (size_t i = 0; i < size; ++i) { ss << std::fixed << "[" << m_coordsPtr[i][0] << " " << m_coordsPtr[i][1] << " " << m_coordsPtr[i][2] << "] "; } + ss << "\n"; + getLogManager() << level << ss.str(); + + ss.str("CtrlPointsValues = "); + for (size_t i = 0; i < size; ++i) { ss << std::fixed << *(ip_controlPointsValues->getBuffer() + i) << " "; } + ss << "\n"; + getLogManager() << level << ss.str(); + + ss.str("Spline Coeffs = "); + for (size_t i = 0; i <= size; ++i) { ss << std::fixed << m_splineCoefs[i] << " "; } + ss << "\n"; + getLogManager() << level << ss.str(); + + ss.str("PotTable coeffs = "); + for (size_t i = 0; i < 10; ++i) { ss << std::fixed << m_pot[i] << " "; } + ss << " ... "; + for (size_t i = 2001; i < 2004; ++i) { ss << std::fixed << m_pot[i] << " "; } + ss << "\n"; + getLogManager() << level << ss.str(); + + activateOutputTrigger(OVP_Algorithm_SphericalSplineInterpolation_OutputTriggerId_Error, true); + } + } + + if (isInputTriggerActive(OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_ComputeLaplacianCoefs)) + { + if (m_laplacianCoefs.empty() && size_t(ip_nControlPoints) != 0) { m_laplacianCoefs.resize(size_t(ip_nControlPoints) + 1); } + + //compute spline ponderation coefficients using spline values + //FIXME : have a working copy of control points values stored as doubles? + const int result = SplineCoef(int(ip_nControlPoints), m_coordsPtr.data(), ip_controlPointsValues->getBuffer(), m_pot.data(), + m_laplacianCoefs.data()); + m_laplacianCoefs[int(ip_nControlPoints)] = 0; + + if (result != 0) + { + getLogManager() << Kernel::LogLevel_ImportantWarning << "Laplacian coefficients computation failed!\n"; + activateOutputTrigger(OVP_Algorithm_SphericalSplineInterpolation_OutputTriggerId_Error, true); + } + } + + if (isInputTriggerActive(OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_InterpolateSpline)) + { + bool ok = true; + + //ensure we got enough storage space for interpolated values + if (op_samplePointsValues->getDimensionSize(0) != ip_samplePointsCoords->getDimensionSize(0)) + { + op_samplePointsValues->setDimensionSize(0, ip_samplePointsCoords->getDimensionSize(0)); + } + + //compute interpolated values using spline + double* sampleValue = static_cast(op_samplePointsValues->getBuffer()); + + op_minSamplePointValue = +DBL_MAX; + op_maxSamplePointValue = -DBL_MAX; + + for (size_t i = 0; i < ip_samplePointsCoords->getDimensionSize(0); i++, sampleValue++) + { +#if defined TARGET_OS_Windows +#ifndef NDEBUG + if (_finite(*(ip_samplePointsCoords->getBuffer() + 3 * i)) == 0 || + _finite(*(ip_samplePointsCoords->getBuffer() + 3 * i + 1)) == 0 || + _finite(*(ip_samplePointsCoords->getBuffer() + 3 * i + 2)) == 0) //tests whether a double is infinite or a NaN + { + getLogManager() << Kernel::LogLevel_ImportantWarning << "Bad interpolation point coordinates !\n"; + getLogManager() << Kernel::LogLevel_ImportantWarning << *(ip_samplePointsCoords->getBuffer() + 3 * i) << "\n"; + getLogManager() << Kernel::LogLevel_ImportantWarning << *(ip_samplePointsCoords->getBuffer() + 3 * i + 1) << "\n"; + getLogManager() << Kernel::LogLevel_ImportantWarning << *(ip_samplePointsCoords->getBuffer() + 3 * i + 2) << "\n"; + ok = false; + } +#endif +#endif + + *sampleValue = SplineInterp(int(ip_nControlPoints), //number of fixed values + m_coordsPtr.data(), //coordinates of fixed values + m_pot.data(), //sin/cos table for spline + m_splineCoefs.data(), //spline coefficients + *(ip_samplePointsCoords->getBuffer() + 3 * i), + *(ip_samplePointsCoords->getBuffer() + 3 * i + 1), + *(ip_samplePointsCoords->getBuffer() + 3 * i + 2) //coordinate where to interpolate + ); + +#if defined TARGET_OS_Windows +#ifndef NDEBUG + if (_finite(*sampleValue) == 0) //tests whether a double is infinite or a NaN + { + getLogManager() << Kernel::LogLevel_ImportantWarning << "Interpolation fails !\n"; + getLogManager() << Kernel::LogLevel_ImportantWarning << *(ip_samplePointsCoords->getBuffer() + 3 * i) << "\n"; + getLogManager() << Kernel::LogLevel_ImportantWarning << *(ip_samplePointsCoords->getBuffer() + 3 * i + 1) << "\n"; + getLogManager() << Kernel::LogLevel_ImportantWarning << *(ip_samplePointsCoords->getBuffer() + 3 * i + 2) << "\n"; + ok = false; + break; + } +#endif +#endif + + if (*sampleValue < op_minSamplePointValue) { op_minSamplePointValue = *sampleValue; } + if (*sampleValue > op_maxSamplePointValue) { op_maxSamplePointValue = *sampleValue; } + } + + if (!ok) { activateOutputTrigger(OVP_Algorithm_SphericalSplineInterpolation_OutputTriggerId_Error, true); } + } + else if (isInputTriggerActive(OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_InterpolateLaplacian)) + { + const bool ok = true; + //ensure we got enough storage space for interpolated values + if (op_samplePointsValues->getDimensionSize(0) != ip_samplePointsCoords->getDimensionSize(0)) + { + op_samplePointsValues->setDimensionSize(0, ip_samplePointsCoords->getDimensionSize(0)); + } + + //compute interpolated values using spline + auto* sampleValue = static_cast(op_samplePointsValues->getBuffer()); + + op_minSamplePointValue = +DBL_MAX; + op_maxSamplePointValue = -DBL_MAX; + + for (size_t i = 0; i < ip_samplePointsCoords->getDimensionSize(0); i++, sampleValue++) + { + *sampleValue = SplineInterp(int(ip_nControlPoints), //number of fixed values + m_coordsPtr.data(), //coordinates of fixed values + m_scd.data(), //sin/cos table for laplacian + m_laplacianCoefs.data(), //laplacian coefficients + *(ip_samplePointsCoords->getBuffer() + 3 * i), + *(ip_samplePointsCoords->getBuffer() + 3 * i + 1), + *(ip_samplePointsCoords->getBuffer() + 3 * i + 2)); //coordinate where to interpolate + + /***************************************************************************/ + /*** Units : potential values being very often expressed as micro-Volts ***/ + /*** SCD values should be multiplied by a scaling factor ***/ + /*** to get nano-Amperes/m3 ***/ + /*** Since the output of SplineInterp corresponds to the ***/ + /*** Laplacian operator only, SCD are obtained with a scaling ***/ + /*** factor equal to 10-3 * sigma / (R*R) ***/ + /*** with sigma = conductivity of the scalp = 0.45 Siemens/m ***/ + /*** and R = radius of the spherical head = 0.09 m ***/ + /***************************************************************************/ + *sampleValue = *sampleValue * (0.001 * 0.45 / 0.09 / 0.09); + + if (*sampleValue < op_minSamplePointValue) { op_minSamplePointValue = *sampleValue; } + if (*sampleValue > op_maxSamplePointValue) { op_maxSamplePointValue = *sampleValue; } + } + + if (!ok) { activateOutputTrigger(OVP_Algorithm_SphericalSplineInterpolation_OutputTriggerId_Error, true); } + } + + return true; +} + +} // namespace Test +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/ovpCAlgorithmSphericalSplineInterpolation.h b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/ovpCAlgorithmSphericalSplineInterpolation.h new file mode 100644 index 0000000..d696c48 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/ovpCAlgorithmSphericalSplineInterpolation.h @@ -0,0 +1,106 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Test { +class CAlgorithmSphericalSplineInterpolation final : public Toolkit::TAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_SphericalSplineInterpolation) + +protected: + + //input parameters + //---------------- + Kernel::TParameterHandler ip_splineOrder; + Kernel::TParameterHandler ip_nControlPoints; + Kernel::TParameterHandler ip_controlPointsCoords; + Kernel::TParameterHandler ip_controlPointsValues; + Kernel::TParameterHandler ip_samplePointsCoords; + + //output parameters + //----------------- + Kernel::TParameterHandler op_samplePointsValues; + Kernel::TParameterHandler op_minSamplePointValue; + Kernel::TParameterHandler op_maxSamplePointValue; + + //internal data + //------------- + bool m_firstProcess = true; + std::vector m_coords; + std::vector m_coordsPtr; + std::vector m_splineCoefs; + std::vector m_laplacianCoefs; + std::array m_scd{}; + std::array m_pot{}; +}; + +class CAlgorithmSphericalSplineInterpolationDesc final : public IAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Spherical spline interpolation"); } + CString getAuthorName() const override { return CString("Vincent Delannoy"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Interpolates potentials/laplacians using a spherical spline"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Algorithm/Signal processing"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-designer"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_SphericalSplineInterpolation; } + IPluginObject* create() override { return new CAlgorithmSphericalSplineInterpolation(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + //input parameters + prototype.addInputParameter(OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_SplineOrder, "Spline order", Kernel::ParameterType_Integer); + prototype.addInputParameter( + OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsCount, "Number of values", Kernel::ParameterType_Integer); + prototype.addInputParameter( + OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsCoordinates, "Values coordinates", Kernel::ParameterType_Matrix); + prototype.addInputParameter(OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsValues, "Values", Kernel::ParameterType_Matrix); + prototype.addInputParameter( + OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_SamplePointsCoordinates, "Coordinates where to interpolate values", + Kernel::ParameterType_Matrix); + //input triggers + prototype.addInputTrigger(OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_PrecomputeTables, CString("Precomputation")); + prototype.addInputTrigger(OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_ComputeSplineCoefs, CString("Spline coefficients computation")); + prototype.addInputTrigger( + OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_ComputeLaplacianCoefs, CString("Laplacian coefficients computation")); + prototype.addInputTrigger( + OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_InterpolateSpline, CString("Interpolation using spline coefficients")); + prototype.addInputTrigger( + OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_InterpolateLaplacian, CString("Interpolation using laplacian coefficients")); + //output parameters + prototype.addOutputParameter( + OVP_Algorithm_SphericalSplineInterpolation_OutputParameterId_SamplePointsValues, "Interpolated values", Kernel::ParameterType_Matrix); + prototype.addOutputParameter( + OVP_Algorithm_SphericalSplineInterpolation_OutputParameterId_MinSamplePointValue, "Min interpolated value", Kernel::ParameterType_Float); + prototype.addOutputParameter( + OVP_Algorithm_SphericalSplineInterpolation_OutputParameterId_MaxSamplePointValue, "Max interpolated value", Kernel::ParameterType_Float); + + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_SphericalSplineInterpolationDesc) +}; +} // namespace Test +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/spline_sph.cpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/spline_sph.cpp new file mode 100644 index 0000000..0452961 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/spline_sph.cpp @@ -0,0 +1,317 @@ +/*****************************************************************************/ +/*****************************************************************************/ +/** **/ +/** spline_sph : **/ +/** **/ +/** SplineTables **/ +/** SplineCoef **/ +/** SplineInterp **/ +/** **/ +/** note : SplineCoef calls linpack routines (linpack.c) **/ +/** **/ +/*****************************************************************************/ +/*****************************************************************************/ + +/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/ +/*& Libraries to include &*/ +/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/ + +#include +#include +#include + +#include "linpack.h" +#include + +/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/ +/*& Define &*/ +/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/ + +#define imin(x,y) (((x) < (y)) ? (x) : (y)) + +/**********************************************************************************/ +/* SplineTables */ +/* */ +/* Computes the tabulated functions km(cos(gamma)) and hm(cos(gamma)) */ +/* for cos(gamma) varying from -1 to 1 (see Patent, columns 2 and 6) */ +/* km and hm consist in series of Legendre polynomials */ +/* km and hm are used for potential and SCD interpolation respectively */ +/* m is the order of the spline interpolation function */ +/* */ +/* IN */ +/* order : spline order m (integer) */ +/* */ +/* OUT */ +/* pot_table : vector of tabulated km (array of 2004 double) */ +/* scd_table : vector of tabulated hm (array of 2004 double) */ +/* function value : return code (integer) */ +/* = 0 normal value */ +/* = -1 error */ +/* */ +/* Note : this function should be called once at the beginning of the program */ +/* */ +/**********************************************************************************/ + +int SplineTables(const int order, double* pot, double* scd) +{ + if (order <= 2) + { + std::cout << "spline_table error : spline order <= 2\n"; + return -1; + } + + double cnpn, fn; + int j, n; + + /*===========================================================*/ + /* Estimate the number of terms for the Legendre series */ + /* to have an error lower than 1e-10 */ + /*===========================================================*/ + double dexp = 10. / float(2 * order - 2); + const int kv = imin(400, int(pow(10.0, dexp) - 1.0)); + double fsv = 1.0; + if (int(fmod(double(kv), 2.0)) == 1) { fsv = -1.0; } + + dexp = 10. / float(2 * order - 4); + const int kc = imin(400, int(pow(10.0, dexp) - 1.0)); + double fsc = 1.0; + if (int(fmod(double(kc), 2.0)) == 1) { fsc = -1.0; } + + double* c = static_cast(malloc(sizeof(double) * kc)); + double* p = static_cast(malloc(sizeof(double) * kc)); + + /*=========================*/ + /* Coefficient computation */ + /*=========================*/ + double cn = 1.0; + for (j = 1; j < order; ++j) { cn /= 2.0; } + c[0] = cn * 3.0; + for (n = 2; n <= kc; ++n) + { + fn = double(n); + const double cx = (fn - 1.0) / (fn + 1.0); + for (j = 1; j < order; ++j) { cn *= cx; } + c[n - 1] = (2.0 * fn + 1.0) * cn; + } + + /*========================*/ + /* Table generation */ + /*========================*/ + for (int ig = 0; ig <= 1000; ++ig) + { + /*-------------------------*/ + /* Pn polynomial */ + /*-------------------------*/ + double gamma = double(ig) / 1000.0; + gamma = 1.0 - gamma; + double p0 = 1.0; + double p1 = gamma; + p[0] = p1; + for (n = 2; n <= kc; ++n) + { + fn = double(n); + const double usfn = 1.0 / fn; + const double pn = (2.0 - usfn) * gamma * p1 - (1.0 - usfn) * p0; + p0 = p1; + p1 = pn; + p[n - 1] = pn; + } + + /*-----------------------*/ + /* pot_table computation */ + /*-----------------------*/ + double s1 = 0.0; + double s2 = 0.0; + double fs = fsv; + for (n = kv; n >= 1; n--) + { + fn = double(n); + cnpn = c[n - 1] * p[n - 1] / (fn * (fn + 1.0)); + s1 += cnpn; + s2 += fs * cnpn; + fs = -fs; + } + *(pot + 2001 - ig) = s1 * 1000.0; + *(pot + 1 + ig) = s2 * 1000.0; + + /*-----------------------*/ + /* scd_table computation */ + /*-----------------------*/ + s1 = 0.0; + s2 = 0.0; + fs = fsc; + for (n = kc; n >= 1; n--) + { + cnpn = c[n - 1] * p[n - 1]; + s1 += cnpn; + s2 += fs * cnpn; + fs = -fs; + } + *(scd + 2001 - ig) = s1 * 1000.0; + *(scd + 1 + ig) = s2 * 1000.0; + } + + *(pot + 2002) = *(pot + 2001); + *(scd + 2002) = *(scd + 2001); + *(pot + 2003) = *(pot + 2002); + *(scd + 2003) = *(scd + 2002); + *pot = *(pot + 1); + *scd = *(scd + 1); + + free(c); + free(p); + return 0; +} + +/**********************************************************************************/ +/* SplineCoef */ +/* */ +/* Computes the interpolation coefficients P=(p1,p2,...,pn) and q */ +/* (see Patent, columns 2 and 6) */ +/* */ +/* IN */ +/* nb_value : number of electrodes and related potential values (integer) */ +/* xyz : array[nb_value] of array[3] of double */ +/* X, Y, Z electrode coordinates on a spherical surface */ +/* values : array[nb_value] of double */ +/* potential values at the electrode locations */ +/* table : array[2004] of double */ +/* tabulated function km (array pot_table computed by SplineTables */ +/* */ +/* OUT */ +/* coef : array[nb_value + 1] of double */ +/* spline coefficients P=(p1,p2,...,pn) and q */ +/* function value : return code (integer) */ +/* = 0 normal value */ +/* = -1 error */ +/* */ +/* Note : this function should be called once for a given set of electrodes */ +/* and a set of potential values */ +/* */ +/**********************************************************************************/ + +int SplineCoef(const int n, double** xyz, const double* values, const double* table, double* coef) +{ + int i, info, itmp; + + /*=========================================*/ + /* allocation of temporary arrays */ + /*=========================================*/ + double* p_mat_a = static_cast(malloc(sizeof(double) * ((n + 1) * (n + 2)) / 2)); + if (p_mat_a == nullptr) + { + std::cout << "SplineCoef error : allocation p_mat_a\n"; + return (-1); + } + int* p_iwork = static_cast(malloc(sizeof(int) * (n + 1))); + if (p_iwork == nullptr) + { + std::cout << "SplineCoef error : allocation p_iwork\n"; + return (-1); + } + + /*================================*/ + /* Initialization of matrix A */ + /*================================*/ + const int l0 = ((n + 1) * (n)) / 2; + for (i = l0; i < l0 + n; ++i) { *(p_mat_a + i) = 1.0; } + *(p_mat_a + i) = 0.0; + + /*=========================*/ + /* computation of matrix A */ + /*=========================*/ + int ih = 0; + for (int j = 0; j < n; ++j) + { + const double xj = xyz[j][0]; + const double yj = xyz[j][1]; + const double zj = xyz[j][2]; + for (i = 0; i < j; ++i) + { + const double t1 = xyz[i][0] - xj; + const double t2 = xyz[i][1] - yj; + const double t3 = xyz[i][2] - zj; + const double tp = (t1 * t1 + t2 * t2 + t3 * t3) / 2.0; + double fgam = (1.0 - tp) * 1000.0 + 1002.0; + const int igam = int(fgam); + fgam -= float(igam); + const double v1 = *(table + igam - 1); + const double v2 = *(table + igam) - v1; + *(p_mat_a + ih++) = v2 * fgam + v1; + } + *(p_mat_a + ih++) = *(table + 2001); + } + + /*=================================*/ + /* Triangularization of matrix A */ + /*=================================*/ + itmp = n + 1; + sspfa(p_mat_a, &itmp, p_iwork, &info); + if (info != 0) + { + printf("SplineCoef error : triangularization of matrix a (sspfa : %d) \n", info); + return (-1); + } + + /*=======================================================*/ + /* Coefficient computation (solving a triangular system) */ + /*=======================================================*/ + for (i = 0; i < n; ++i) { coef[i] = values[i]; } + coef[n] = 0.0; + sspsl(p_mat_a, &itmp, p_iwork, coef); + free(p_mat_a); + free(p_iwork); + return 0; +} + +/**********************************************************************************/ +/* SplineInterp */ +/* */ +/* Computes the interpolated potential or SCD value at a location on the sphere */ +/* (see Patent, columns 2, 4, 7 and 9) */ +/* */ +/* IN */ +/* nb_value : number of electrodes and related potential values (integer) */ +/* xyz : array[nb_value] of array[3] of double */ +/* X, Y, Z electrode coordinates on a spherical surface (radius = 1) */ +/* table : array[2004] of double */ +/* tabulated function computed by SplineTables */ +/* use pot_table (km) for potential interpolation */ +/* use scd_table (hm) for SCD interpolation */ +/* coef : array[nb_value + 1] of double */ +/* spline coefficients P=(p1,p2,...,pn) and q */ +/* array coef computed by SplineCoef */ +/* IMPORTANT : coef[nb_value] should be set to 0.0 for computing */ +/* the interpolated SCD (this corresponds to q=0) */ +/* xx, yy, zz : double */ +/* X, Y, Z coordinates of a point on a spherical surface (radius = 1)*/ +/* where to compute the interpolated value */ +/* */ +/* OUT */ +/* function value : interpolated potential or SCD value (double) */ +/* */ +/* Note : this function should be called for every point of the spherical surface */ +/* where the potential or the SCD value should be estimated */ +/* */ +/**********************************************************************************/ + +double SplineInterp(const int n, double** xyz, const double* table, const double* coef, const double xx, const double yy, const double zz) +{ + double ffn = coef[n]; + int k = 0; + for (int i = 0; i < n; ++i) + { + const double t1 = xx - xyz[i][0]; + const double t2 = yy - xyz[i][1]; + const double t3 = zz - xyz[i][2]; + const double t123 = (t1 * t1 + t2 * t2 + t3 * t3) / 2.; + double fgam = (1.0 - t123) * 1000. + 1002.; + const int igam = int(fgam); + fgam -= double(igam); + const double v1 = table[igam - 1]; + const double v2 = table[igam] - v1; + ffn += coef[k] * (v2 * fgam + v1); + k++; + } + return ffn; +} diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/spline_sph.h b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/spline_sph.h new file mode 100644 index 0000000..e83348a --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/algorithms/spline_sph.h @@ -0,0 +1,12 @@ +/*************************************************************************************/ +/* spline_sph.h */ +/*************************************************************************************/ + +/*************************************************************************************/ +/* spline subroutines */ +/*************************************************************************************/ +#pragma once + +int SplineTables(int order, double* pot, double* scd); +int SplineCoef(int n, double** xyz, const double* values, const double* table, double* coef); +double SplineInterp(int n, double** xyz, const double* table, const double* coef, double xx, double yy, double zz); diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmMatrixDisplay.cpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmMatrixDisplay.cpp new file mode 100644 index 0000000..be24941 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmMatrixDisplay.cpp @@ -0,0 +1,364 @@ +#include "ovpCBoxAlgorithmMatrixDisplay.h" + +#include +#include +#include + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +static void ShowValuesToggleButtonCB(GtkToggleToolButton* button, gpointer data) +{ + auto* display = reinterpret_cast(data); + display->m_ShowValues = (gtk_toggle_tool_button_get_active(button) != 0); +} + +static void ShowColorsToggleButtonCB(GtkToggleToolButton* button, gpointer data) +{ + auto* display = reinterpret_cast(data); + display->m_ShowColors = (gtk_toggle_tool_button_get_active(button) != 0); + display->resetColors(); +} + +bool CBoxAlgorithmMatrixDisplay::resetColors() + +{ + if (m_ShowColors) + { + //we take colors from cache and re-put it in the table + for (auto it = m_eventBoxCache.begin(); it != m_eventBoxCache.end(); ++it) { gtk_widget_modify_bg((*it).first, GTK_STATE_NORMAL, &(*it).second); } + } + else + { + for (auto it = m_eventBoxCache.begin(); it != m_eventBoxCache.end(); ++it) + { + GdkColor white; + white.red = 65535; + white.green = 65535; + white.blue = 65535; + gtk_widget_modify_bg((*it).first, GTK_STATE_NORMAL, &white); + } + } + + return true; +} + +bool CBoxAlgorithmMatrixDisplay::initialize() + +{ + //targets decoder + iMatrix = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixDecoder)); + iMatrix->initialize(); + + //IO for the targets MemoryBuffer -> StreamedMatrix + ip_buffer.initialize(iMatrix->getInputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_InputParameterId_MemoryBufferToDecode)); + op_matrix.initialize(iMatrix->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + + //widgets + m_mainWidgetInterface = gtk_builder_new(); + m_toolbarWidgetInterface = gtk_builder_new(); + // glade_xml_new(Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-MatrixDisplay.ui", "matrix-display-table", nullptr); + // glade_xml_new(Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-MatrixDisplay.ui", "matrix-display-toolbar", nullptr); + gtk_builder_add_from_file(m_mainWidgetInterface, Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-MatrixDisplay.ui", + nullptr); + gtk_builder_add_from_file(m_toolbarWidgetInterface, + Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-MatrixDisplay.ui", nullptr); + + gtk_builder_connect_signals(m_mainWidgetInterface, nullptr); + gtk_builder_connect_signals(m_toolbarWidgetInterface, nullptr); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_toolbarWidgetInterface, "show-values-toggle-button")), "toggled", + G_CALLBACK(ShowValuesToggleButtonCB), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_toolbarWidgetInterface, "show-colors-toggle-button")), "toggled", + G_CALLBACK(ShowColorsToggleButtonCB), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_toolbarWidgetInterface, "matrix-display-toolbar")), "delete_event", G_CALLBACK(gtk_widget_hide), + nullptr); + + m_mainWidget = GTK_WIDGET(gtk_builder_get_object(m_mainWidgetInterface, "matrix-display-table")); + m_toolbarWidget = GTK_WIDGET(gtk_builder_get_object(m_toolbarWidgetInterface, "matrix-display-toolbar")); + + if (!this->canCreatePluginObject(OVP_ClassId_Plugin_VisualizationCtx)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Visualization framework is not loaded" << "\n"; + return false; + } + + m_visualizationCtx = dynamic_cast(this->createPluginObject(OVP_ClassId_Plugin_VisualizationCtx)); + m_visualizationCtx->setWidget(*this, m_mainWidget); + m_visualizationCtx->setToolbar(*this, m_toolbarWidget); + + m_ShowValues = (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_toolbarWidgetInterface, "show-values-toggle-button"))) != + 0); + m_ShowColors = (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_toolbarWidgetInterface, "show-colors-toggle-button"))) != + 0); + + CString gradientSetting; + getBoxAlgorithmContext()->getStaticBoxContext()->getSettingValue(0, gradientSetting); + VisualizationToolkit::ColorGradient::parse(m_colorGradient, gradientSetting); + + CString gradientStepsSetting; + getBoxAlgorithmContext()->getStaticBoxContext()->getSettingValue(1, gradientStepsSetting); + m_gradientSteps = strtol(gradientStepsSetting, nullptr, 10); + VisualizationToolkit::ColorGradient::interpolate(m_interpolatedColorGardient, m_colorGradient, m_gradientSteps); + m_max = 0; + m_min = 0; + + CString symetricMinMaxSetting; + getBoxAlgorithmContext()->getStaticBoxContext()->getSettingValue(2, symetricMinMaxSetting); + m_symetricMinMax = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + + CString realTimeMinMaxSetting; + getBoxAlgorithmContext()->getStaticBoxContext()->getSettingValue(3, realTimeMinMaxSetting); + m_realTimeMinMax = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + + return true; +} + +bool CBoxAlgorithmMatrixDisplay::uninitialize() + +{ + op_matrix.uninitialize(); + ip_buffer.uninitialize(); + + //decoders + iMatrix->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*iMatrix); + + //widgets + g_object_unref(m_toolbarWidgetInterface); + m_toolbarWidgetInterface = nullptr; + + g_object_unref(m_mainWidgetInterface); + m_mainWidgetInterface = nullptr; + + this->releasePluginObject(m_visualizationCtx); + + return true; +} + +bool CBoxAlgorithmMatrixDisplay::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} + +bool CBoxAlgorithmMatrixDisplay::process() + +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + ip_buffer = boxContext.getInputChunk(0, i); + iMatrix->process(); + + if (iMatrix->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedHeader)) + { + //header received + //adding the event to the window + GtkTable* table = GTK_TABLE(gtk_builder_get_object(m_mainWidgetInterface, "matrix-display-table")); + guint nRow, nCol; + if (op_matrix->getDimensionCount() == 1) + { + //getLogManager() << Kernel::LogLevel_Warning<< "The streamed matrix received has 1 dimensions (found "<< op_matrix->getDimensionCount() <<" dimensions)\n"; + nRow = 1; + nCol = guint(op_matrix->getDimensionSize(0)); + //return false; + } + else if (op_matrix->getDimensionCount() != 2) + { + getLogManager() << Kernel::LogLevel_Error << "The streamed matrix received has more than 2 dimensions (found " << op_matrix->getDimensionCount() + << + " dimensions)\n"; + return false; + } + else + { + nRow = guint(op_matrix->getDimensionSize(0)); + nCol = guint(op_matrix->getDimensionSize(1)); + } + + gtk_table_resize(table, nRow + 1, nCol + 1); + + //first line : labels + guint row = 0; + for (guint c = 1; c < nCol + 1; ++c) + { + GtkWidget* label = gtk_label_new(""); + gtk_widget_set_visible(label, 1); + gtk_table_attach(table, label, c, c + 1, row, row + 1, GtkAttachOptions(GTK_EXPAND | GTK_FILL), GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0); + //g_object_unref(l_pGtkBuilderLabel); + + const char* cstr = std::to_string(c).c_str(); + gtk_label_set_label(GTK_LABEL(label), cstr); + m_columnLabelCache.emplace_back(GTK_LABEL(label), cstr); + } + + //first column : labels + guint col = 0; + for (guint r = 1; r < nRow + 1; ++r) + { + GtkWidget* label = gtk_label_new(""); + gtk_widget_set_visible(label, 1); + gtk_table_attach(table, label, col, col + 1, r, r + 1, GtkAttachOptions(GTK_EXPAND | GTK_FILL), GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0); + + std::stringstream ss; + ss << char(r - 1 + int('A')); + gtk_label_set_label(GTK_LABEL(label), ss.str().c_str()); + m_rowLabelCache.emplace_back(GTK_LABEL(label), ss.str().c_str()); + } + + for (guint r = 1; r < nRow + 1; ++r) + { + for (guint c = 1; c < nCol + 1; ++c) + { + GtkWidget* eventBox = gtk_event_box_new(); + gtk_widget_set_visible(eventBox, 1); + GtkWidget* label = gtk_label_new(""); + gtk_widget_set_visible(label, 1); + gtk_container_add(GTK_CONTAINER(eventBox), label); + gtk_table_attach(table, eventBox, c, c + 1, r, r + 1, GtkAttachOptions(GTK_EXPAND | GTK_FILL), GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, + 0); + + GdkColor white; + white.red = 65535; + white.green = 65535; + white.blue = 65535; + gtk_widget_modify_bg(eventBox, GTK_STATE_NORMAL, &white); + m_eventBoxCache.emplace_back(eventBox, white); + + gtk_label_set_label(GTK_LABEL(label), "X"); + m_labelCache.emplace_back(GTK_LABEL(label), "X"); + } + } + } + + if (iMatrix->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedBuffer)) + { + //buffer received + //2-dimension-matrix values + size_t nRow, nCol; + if (op_matrix->getDimensionCount() == 1) + { + nRow = 1; + nCol = op_matrix->getDimensionSize(0); + } + else + { + nRow = op_matrix->getDimensionSize(0); + nCol = op_matrix->getDimensionSize(1); + } + + if (m_realTimeMinMax || // we need recompute the min max at each loop call + (m_max == 0 && m_min == 0)) // we have never computed the min max values. + { + if (op_matrix->getBufferElementCount() != 0) // if the matrix is not empty. + { + m_max = op_matrix->getBuffer()[0]; + m_min = op_matrix->getBuffer()[0]; + } + } + + // MIN-MAX computation + for (size_t r = 0; r < nRow; ++r) + { + for (size_t c = 0; c < nCol; ++c) + { + double value = op_matrix->getBuffer()[r * nCol + c]; + m_max = (value > m_max ? value : m_max); + m_min = (value < m_min ? value : m_min); + + if (m_symetricMinMax) + { + double maxAbsValue = (fabs(m_max) > fabs(m_min) ? fabs(m_max) : fabs(m_min)); + m_max = maxAbsValue; + m_min = -maxAbsValue; + } + } + } + + for (size_t r = 0; r < nRow; ++r) + { + for (size_t c = 0; c < nCol; ++c) + { + double value = op_matrix->getBuffer()[r * nCol + c]; + if (m_max != 0 || m_min != 0) // if the first value ever sent is 0, both are 0, and we dont want to divide by 0 :) + { + const size_t step = size_t(((value - m_min) / (m_max - m_min)) * (m_gradientSteps - 1)); + + // gtk_widget_modify_bg uses 16bit colors, the interpolated gradients gives 8bits colors. + GdkColor color; + color.red = uint16_t(m_interpolatedColorGardient[step * 4 + 1] * 65535. / 100.); + color.green = uint16_t(m_interpolatedColorGardient[step * 4 + 2] * 65535. / 100.); + color.blue = uint16_t(m_interpolatedColorGardient[step * 4 + 3] * 65535. / 100.); + + if (memcmp(&(m_eventBoxCache[r * nCol + c].second), &color, sizeof(GdkColor)) != 0 && m_ShowColors) + { + gtk_widget_modify_bg(m_eventBoxCache[r * nCol + c].first, GTK_STATE_NORMAL, &color); + } + m_eventBoxCache[r * nCol + c].second = color; + + std::stringstream ss; + ss << std::fixed; + ss << std::setprecision(2); + if (m_ShowValues) { ss << value; } + + if (ss.str() != m_labelCache[r * nCol + c].second) { gtk_label_set_label(m_labelCache[r * nCol + c].first, ss.str().c_str()); } + m_labelCache[r * nCol + c].second = ss.str(); + } + } + } + + if (op_matrix->getDimensionCount() != 1) + { + //first line : labels + for (size_t c = 0; c < nCol; ++c) + { + if (m_columnLabelCache[c].second != op_matrix->getDimensionLabel(1, c) && !std::string(op_matrix->getDimensionLabel(1, c)).empty()) + { + gtk_label_set_label(GTK_LABEL(m_columnLabelCache[c].first), op_matrix->getDimensionLabel(1, c)); + m_columnLabelCache[c].second = op_matrix->getDimensionLabel(1, c); + } + } + + //first column : labels + for (size_t r = 0; r < nRow; ++r) + { + if (m_rowLabelCache[r].second != op_matrix->getDimensionLabel(0, r) && !std::string(op_matrix->getDimensionLabel(0, r)).empty()) + { + gtk_label_set_label(GTK_LABEL(m_rowLabelCache[r].first), op_matrix->getDimensionLabel(0, r)); + m_rowLabelCache[r].second = op_matrix->getDimensionLabel(0, r); + } + } + } + else + { + //first line : labels + for (size_t c = 0; c < nCol; ++c) + { + if (m_columnLabelCache[c].second != op_matrix->getDimensionLabel(0, c) && !std::string(op_matrix->getDimensionLabel(0, c)).empty()) + { + gtk_label_set_label(GTK_LABEL(m_columnLabelCache[c].first), op_matrix->getDimensionLabel(0, c)); + m_columnLabelCache[c].second = op_matrix->getDimensionLabel(0, c); + } + } + } + } + + /*if(iMatrix->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedEnd)) { }*/ + + boxContext.markInputAsDeprecated(0, i); + } + + return true; +} + +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmMatrixDisplay.h b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmMatrixDisplay.h new file mode 100644 index 0000000..ffe3197 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmMatrixDisplay.h @@ -0,0 +1,111 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +class CBoxAlgorithmMatrixDisplay final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_MatrixDisplay) + +protected: + + // we need an algorithm to decode the EBML stream (memory buffer) into a Streamed Matrix + + // for the TARGET + Toolkit::TStreamedMatrixDecoder m_decoder; + Kernel::IAlgorithmProxy* iMatrix = nullptr; + Kernel::TParameterHandler ip_buffer; + Kernel::TParameterHandler op_matrix; + + // Outputs: visualization in a gtk window + GtkBuilder* m_mainWidgetInterface = nullptr; + GtkBuilder* m_toolbarWidgetInterface = nullptr; + GtkWidget* m_mainWidget = nullptr; + GtkWidget* m_toolbarWidget = nullptr; + + std::vector> m_eventBoxCache; + std::vector> m_labelCache; + std::vector> m_rowLabelCache; + std::vector> m_columnLabelCache; + + CMatrix m_interpolatedColorGardient; + CMatrix m_colorGradient; + size_t m_gradientSteps = 0; + double m_max = 0; + double m_min = 0; + + bool m_symetricMinMax = false; + bool m_realTimeMinMax = false; + + VisualizationToolkit::IVisualizationContext* m_visualizationCtx{}; + +public: + + bool m_ShowValues = false; + bool m_ShowColors = false; + + bool resetColors(); +}; + +class CBoxAlgorithmMatrixDisplayDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Matrix Display"); } + CString getAuthorName() const override { return CString("Laurent Bonnet"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Display a streamed matrix"); } + + CString getDetailedDescription() const override + { + return CString("The streamed matrix can be visualized using a table of values and/or a color gradient."); + } + + CString getCategory() const override { return CString("Visualization/Basic"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-select-color"); } + CString getSoftwareComponent() const override { return CString("openvibe-designer"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_MatrixDisplay; } + IPluginObject* create() override { return new CBoxAlgorithmMatrixDisplay; } + + bool hasFunctionality(const EPluginFunctionality functionality) const override { return functionality == EPluginFunctionality::Visualization; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("Color gradient", OV_TypeId_ColorGradient, "0:2,36,58; 50:100,100,100; 100:83,17,20"); + prototype.addSetting("Steps", OV_TypeId_Integer, "100"); + prototype.addSetting("Symetric min/max", OV_TypeId_Boolean, "false"); + prototype.addSetting("Real time min/max", OV_TypeId_Boolean, "false"); + prototype.addInput("Matrix", OV_TypeId_StreamedMatrix); + // prototype.addFlag (Kernel::BoxFlag_IsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_MatrixDisplayDesc) +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmTopographicMap2DDisplay.cpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmTopographicMap2DDisplay.cpp new file mode 100644 index 0000000..f960a16 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmTopographicMap2DDisplay.cpp @@ -0,0 +1,135 @@ +#include "ovpCBoxAlgorithmTopographicMap2DDisplay.h" +#include "../algorithms/ovpCAlgorithmSphericalSplineInterpolation.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +bool CBoxAlgorithmTopographicMap2DDisplay::initialize() + +{ + m_hasFirstBuffer = false; + m_decoder.initialize(*this, 0); + + m_interpolation = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_SphericalSplineInterpolation)); + m_interpolation->initialize(); + + //create topographic map database + m_database = new CTopographicMapDatabase(*this, *m_interpolation); + + //retrieve settings + CString interpolationValue; + getStaticBoxContext().getSettingValue(0, interpolationValue); + CString delayValue; + getStaticBoxContext().getSettingValue(1, delayValue); + + //create topographic map view (handling GUI interaction) + m_view = new CTopographicMap2DView( + *m_database, EInterpolationType(getTypeManager().getEnumerationEntryValueFromName(OVP_TypeId_SphericalLinearInterpolationType, interpolationValue)), + strtod(delayValue, nullptr)); + + //have database notify us when new data is available + m_database->setDrawable(m_view); + //ask not to be notified when new data is available (refresh is handled separately) + m_database->setRedrawOnNewData(false); + + //send widget pointers to visualisation context for parenting + GtkWidget* widget = nullptr; + GtkWidget* toolbarWidget = nullptr; + dynamic_cast(m_view)->getWidgets(widget, toolbarWidget); + + if (!this->canCreatePluginObject(OVP_ClassId_Plugin_VisualizationCtx)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Visualization framework is not loaded" << "\n"; + return false; + } + + m_visualizationCtx = dynamic_cast(this->createPluginObject(OVP_ClassId_Plugin_VisualizationCtx)); + m_visualizationCtx->setWidget(*this, widget); + m_visualizationCtx->setToolbar(*this, toolbarWidget); + + return true; +} + +bool CBoxAlgorithmTopographicMap2DDisplay::uninitialize() +{ + m_decoder.uninitialize(); + + delete m_view; + m_view = nullptr; + delete m_database; + m_database = nullptr; + + m_interpolation->uninitialize(); + + getAlgorithmManager().releaseAlgorithm(*m_interpolation); + + return true; +} + +bool CBoxAlgorithmTopographicMap2DDisplay::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmTopographicMap2DDisplay::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmTopographicMap2DDisplay::process() + +{ + IDynamicBoxContext* context = getBoxAlgorithmContext()->getDynamicBoxContext(); + + //decode signal data + for (size_t i = 0; i < context->getInputChunkCount(0); ++i) + { + m_decoder.decode(i); + if (m_decoder.isBufferReceived()) + { + CMatrix* iMatrix = m_decoder.getOutputMatrix(); + + //do we need to recopy this for each chunk? + if (!m_hasFirstBuffer) + { + m_database->setMatrixDimensionCount(iMatrix->getDimensionCount()); + for (size_t dimension = 0; dimension < iMatrix->getDimensionCount(); ++dimension) + { + m_database->setMatrixDimensionSize(dimension, iMatrix->getDimensionSize(dimension)); + for (size_t entryIndex = 0; entryIndex < iMatrix->getDimensionSize(dimension); ++entryIndex) + { + m_database->setMatrixDimensionLabel(dimension, entryIndex, iMatrix->getDimensionLabel(dimension, entryIndex)); + } + } + m_hasFirstBuffer = true; + } + // + + if (!m_database->setMatrixBuffer(iMatrix->getBuffer(), context->getInputChunkStartTime(0, i), context->getInputChunkEndTime(0, i))) + { + return false; + } + } + } + + //decode channel localisation data + for (size_t i = 0; i < context->getInputChunkCount(1); ++i) + { + const IMemoryBuffer* buf = context->getInputChunk(1, i); + m_database->decodeChannelLocalisationMemoryBuffer(buf, context->getInputChunkStartTime(1, i), context->getInputChunkEndTime(1, i)); + context->markInputAsDeprecated(1, i); + } + + const bool processValues = m_database->processValues(); + + //disable plugin upon errors + return processValues; +} + +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmTopographicMap2DDisplay.h b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmTopographicMap2DDisplay.h new file mode 100644 index 0000000..d995039 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmTopographicMap2DDisplay.h @@ -0,0 +1,79 @@ +#pragma once + +#include "../ovp_defines.h" + +#include +#include +#include + +#include "topographicMap2DDisplay/ovpCTopographicMapDatabase.h" +#include "topographicMap2DDisplay/ovpCTopographicMap2DView.h" + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +class CBoxAlgorithmTopographicMap2DDisplay final : public Toolkit::TBoxAlgorithm +{ +public: + CBoxAlgorithmTopographicMap2DDisplay() = default; + + void release() override { delete this; } + + uint64_t getClockFrequency() override { return uint64_t(1LL) << 37; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_TopographicMap2DDisplay) + +protected: + Toolkit::TStreamedMatrixDecoder m_decoder; + + VisualizationToolkit::IVisualizationContext* m_visualizationCtx = nullptr; + Kernel::IAlgorithmProxy* m_interpolation = nullptr; + CTopographicMapDatabase* m_database = nullptr; + CSignalDisplayDrawable* m_view = nullptr; //main object used for the display (contains all the GUI code) + bool m_hasFirstBuffer = false; +}; + +class CBoxAlgorithmTopographicMap2DDisplayDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("2D topographic map"); } + CString getAuthorName() const override { return CString("Vincent Delannoy"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + + CString getShortDescription() const override { return CString("This box demonstrates how to perform spherical spline interpolation"); } + + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Visualization/Topography"); } + CString getVersion() const override { return CString("2.0"); } + CString getStockItemName() const override { return CString(GTK_STOCK_EXECUTE); } + CString getSoftwareComponent() const override { return CString("openvibe-designer"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_TopographicMap2DDisplay; } + IPluginObject* create() override { return new CBoxAlgorithmTopographicMap2DDisplay(); } + + bool hasFunctionality(const EPluginFunctionality functionality) const override { return functionality == EPluginFunctionality::Visualization; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("Interpolation type", OVP_TypeId_SphericalLinearInterpolationType, "1"); + prototype.addSetting("Delay (in s)", OV_TypeId_Float, "0"); + prototype.addInput("Signal", OV_TypeId_StreamedMatrix); + prototype.addInput("Channel localization", OV_TypeId_ChannelLocalisation); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_TopographicMap2DDisplayDesc) +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCBufferDatabase.cpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCBufferDatabase.cpp new file mode 100644 index 0000000..26a14c9 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCBufferDatabase.cpp @@ -0,0 +1,682 @@ +#include "ovpCBufferDatabase.h" + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +CBufferDatabase::CBufferDatabase(Toolkit::TBoxAlgorithm& plugin) : m_ParentPlugin(plugin) +{ + m_decoder = &m_ParentPlugin.getAlgorithmManager().getAlgorithm( + m_ParentPlugin.getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_ChannelLocalisationDecoder)); + m_decoder->initialize(); + m_DimSizes.fill(0); +} + +CBufferDatabase::~CBufferDatabase() +{ + m_decoder->uninitialize(); + m_ParentPlugin.getAlgorithmManager().releaseAlgorithm(*m_decoder); + + //delete all the remaining buffers + while (!m_SampleBuffers.empty()) + { + delete[] m_SampleBuffers.front(); + m_SampleBuffers.pop_front(); + } + + //delete channel localisation matrices + while (!m_channelLocalisationCoords.empty()) + { + delete m_channelLocalisationCoords.front().first; + m_channelLocalisationCoords.pop_front(); + } + + /*while(m_oChannelLocalisationAlternateCoords.size() > 0) + { + delete[] m_oChannelLocalisationAlternateCoords.front().first; + m_oChannelLocalisationAlternateCoords.pop_front(); + }*/ +} + +bool CBufferDatabase::decodeChannelLocalisationMemoryBuffer(const IMemoryBuffer* buffer, uint64_t startTime, uint64_t endTime) +{ + //feed memory buffer to decoder + m_decoder->getInputParameter(OVP_GD_Algorithm_ChannelLocalisationDecoder_InputParameterId_MemoryBufferToDecode)->setReferenceTarget(&buffer); + + //process buffer + m_decoder->process(); + + //copy header if needed + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputTriggerId_ReceivedHeader)) + { + //retrieve matrix header + Kernel::TParameterHandler matrix; + matrix.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputParameterId_Matrix)); + + //copy channel labels + m_channelLocalisationLabels.resize(matrix->getDimensionSize(0)); + for (size_t i = 0; i < m_channelLocalisationLabels.size(); ++i) { m_channelLocalisationLabels[i] = matrix->getDimensionLabel(0, i); } + + //retrieve dynamic flag + Kernel::TParameterHandler dynamic; + dynamic.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputParameterId_Dynamic)); + m_dynamicChannelLocalisation = dynamic; + + if (matrix->getDimensionSize(1) == 3) + { + m_cartesianCoords = true; + /*m_channelLocalisationCartesianCoords = &m_channelLocalisationCoords; + m_channelLocalisationSphericalCoords = &m_oChannelLocalisationAlternateCoords;*/ + } + else if (matrix->getDimensionSize(1) == 2) + { + m_cartesianCoords = false; + /*m_channelLocalisationCartesianCoords = &m_oChannelLocalisationAlternateCoords; + m_channelLocalisationSphericalCoords = &m_channelLocalisationCoords;*/ + } + else + { + m_ParentPlugin.getLogManager() << Kernel::LogLevel_Error + << "Wrong size found for dimension 1 of Channel localisation header! Can't process header!\n"; + return false; + } + + //header information received + m_channelLocalisationHeaderReceived = true; + } + + //has a chanloc buffer been received? + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputTriggerId_ReceivedBuffer)) + { + //number of buffers required to cover displayed time range + size_t maxNBuffer = 1; + + //resize channel localisation queue if necessary + if (m_dynamicChannelLocalisation) + { + const uint64_t bufferDuration = endTime - startTime; + if (bufferDuration != 0) + { + maxNBuffer = size_t(ceil(m_TotalDuration / bufferDuration)); + if (maxNBuffer == 0) { maxNBuffer = 1; } + } + + //if new number of buffers decreased, resize list and destroy useless buffers + while (m_channelLocalisationCoords.size() > maxNBuffer) + { + delete[] m_channelLocalisationCoords.front().first; + m_channelLocalisationCoords.pop_front(); + // delete[] m_oChannelLocalisationAlternateCoords.front().first; + // m_oChannelLocalisationAlternateCoords.pop_front(); + m_channelLocalisationTimes.pop_front(); + } + } + + //retrieve coordinates matrix + Kernel::TParameterHandler matrix; + matrix.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputParameterId_Matrix)); + + //get pointer to destination matrix + CMatrix* channelLocalisation; + //CMatrix* alternateChannelLocalisation = nullptr; + if (m_channelLocalisationCoords.size() < maxNBuffer) + { + //create a new matrix and resize it + channelLocalisation = new CMatrix(); + channelLocalisation->copyDescription(*matrix); + // alternateChannelLocalisation = new CMatrix(); + // TODO : resize it appropriately depending on whether it is spherical or cartesian + } + else //m_channelLocalisationCoords.size() == maxNBuffer + { + channelLocalisation = m_channelLocalisationCoords.front().first; + m_channelLocalisationCoords.pop_front(); + // alternateChannelLocalisation = m_oChannelLocalisationAlternateCoords.front().first; + // m_oChannelLocalisationAlternateCoords.pop_front(); + m_channelLocalisationTimes.pop_front(); + } + + if (channelLocalisation) + { + //copy coordinates and times + channelLocalisation->copyContent(*matrix); + m_channelLocalisationCoords.emplace_back(channelLocalisation, true); + //m_oChannelLocalisationAlternateCoords.push_back(std::pair(alternateChannelLocalisation, true)); + m_channelLocalisationTimes.emplace_back(startTime, endTime); + } + } + + return true; +} + +bool CBufferDatabase::onChannelLocalisationBufferReceived(const size_t index) +{ + m_channelLocalisationCoords[index].second = false; + return true; +} + +bool CBufferDatabase::isFirstChannelLocalisationBufferProcessed() +{ + //at least one chanloc buffer must have been received and processed + return (!m_channelLocalisationCoords.empty()) && (!m_channelLocalisationCoords[0].second); +} + +bool CBufferDatabase::adjustNumberOfDisplayedBuffers(const double time) +{ + bool nBufferToDisplayChanged = false; + + if (time > 0) + { + m_TotalDuration = time; + m_ovTotalDuration = 0; + m_TotalStep = 0; + } + + //return if buffer length is not known yet + if (m_DimSizes[1] == 0) { return false; } + + size_t newNbufferToDisplay = size_t(ceil((m_TotalDuration * m_Sampling) / m_DimSizes[1])); + + //displays at least one buffer + newNbufferToDisplay = (newNbufferToDisplay == 0) ? 1 : newNbufferToDisplay; + if (newNbufferToDisplay != m_NBufferToDisplay || time <= 0) + { + m_NBufferToDisplay = newNbufferToDisplay; + nBufferToDisplayChanged = true; + + //if new number of buffers decreased, resize lists and destroy useless buffers + while (m_NBufferToDisplay < m_SampleBuffers.size()) + { + delete[] m_SampleBuffers.front(); + m_SampleBuffers.pop_front(); + m_StartTime.pop_front(); + m_EndTime.pop_front(); + + //suppress the corresponding minmax values + for (size_t c = 0; c < m_DimSizes[0]; ++c) { m_LocalMinMaxValue[c].pop_front(); } + } + } + + return nBufferToDisplayChanged; +} + +size_t CBufferDatabase::getChannelCount() const { return m_DimSizes[0]; } + +double CBufferDatabase::getDisplayedTimeIntervalWidth() const { return (m_NBufferToDisplay * ((m_DimSizes[1] * 1000.0) / m_Sampling)); } + +void CBufferDatabase::setMatrixDimensionCount(const size_t n) +{ + if (n != 2) + { + m_Error = true; + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error << "Caller tried to set a " << n + << "-dimensional matrix. Only 2-dimensional matrices are supported (e.g. [rows X cols]).\n"; + } + if (n == 1) + { + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error + << "Note: For 1-dimensional matrices, you may try Matrix Transpose box to upgrade the stream to [N X 1] first.\n"; + } +} + +void CBufferDatabase::setMatrixDimensionSize(const size_t index, const size_t size) +{ + if (index >= 2) + { + m_Error = true; + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error << "Tried to access dimension " + << index << ", only 0 and 1 supported\n"; + return; + } + + if (m_DimSizes[index] != 0 && m_DimSizes[index] != size) + { + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error + << "Upstream tried to change the data chunk size after the first header, this is not supported.\n"; + m_Error = true; + return; + } + + m_DimSizes[index] = size; + m_DimLabels[index].resize(size); + + if (index == 0) + { + m_NElectrodes = m_DimSizes[index]; + + //resize min/max values vector + m_LocalMinMaxValue.resize(size_t(m_NElectrodes)); + } +} + +void CBufferDatabase::setMatrixDimensionLabel(const size_t idx1, const size_t idx2, const char* label) +{ + if (m_Error) { return; } + + if (idx1 >= 2) + { + m_Error = true; + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error << "Tried to access dimension " << idx1 + << ", only 0 and 1 supported\n"; + return; + } + + m_DimLabels[idx1][idx2] = label; +} + +bool CBufferDatabase::setMatrixBuffer(const double* buffer, const uint64_t startTime, const uint64_t endTime) +{ + //if an error has occurred, do nothing + if (m_Error) { return false; } + + // Check for time-continuity + if (startTime < m_LastBufferEndTime && !m_WarningPrinted) + { + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Warning + << "Your signal does not appear to be continuous in time. " + << "Previously inserted buffer ended at " << CTime(m_LastBufferEndTime).toSeconds() + << "s, the current starts at " << CTime(startTime).toSeconds() + << "s. The display may be incorrect.\n"; + m_WarningPrinted = true; + } + m_LastBufferEndTime = endTime; + + + //if this the first buffer, perform some precomputations + if (!m_HasFirstBuffer) + { + m_BufferDuration = endTime - startTime; + + //test if it is equal to zero : Error + if (m_BufferDuration == 0) + { + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Warning << + "Error : buffer start time and end time are equal : " << startTime << "\n"; + m_Error = true; + return false; + } + + //computes the sampling frequency for sanity checking or if the setter has not been called + const uint64_t duration = (uint64_t(1) << 32) * m_DimSizes[1]; + size_t sampling = size_t(duration / m_BufferDuration); + if (sampling == 0) + { + // Complain if estimate is bad + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Warning + << "The integer sampling frequency was estimated from the chunk size to be 0" + << " (nSamples " << m_DimSizes[1] << " / bufferLength " << CTime(m_BufferDuration).toSeconds() + << "s = 0). This is not supported. Forcing the rate to 1. This may lead to problems.\n"; + sampling = 1; + } + if (m_Sampling == 0) + { + // use chunking duration estimate if setter hasn't been used + m_Sampling = sampling; + } + if (m_Sampling != sampling) + { + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Warning + << "Sampling rate [" << sampling << "] suggested by chunk properties differs from stream-specified rate [" + << m_Sampling << "]. There may be a problem with an upstream box. Trying to use the estimated rate.\n"; + m_Sampling = sampling; + } + + //computes the number of buffer necessary to display the interval + adjustNumberOfDisplayedBuffers(-1); + + m_Drawable->init(); + + m_HasFirstBuffer = true; + } + + if (!m_ChannelLookupTableInitialized) + { + fillChannelLookupTable(); //to retrieve the unrecognized electrode warning + // The above call will fail if no electrode localisation data... + // m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error << "Unable to fill lookup table\n"; + // return false; + } + else + { + //look for chanloc buffers recently received + for (size_t i = 0; i < m_channelLocalisationCoords.size(); ++i) + { + //if a new set of coordinates was received + if (m_channelLocalisationCoords[i].second) { onChannelLocalisationBufferReceived(i); } + } + } + + double* bufferToWrite = nullptr; + const size_t nSamplesPerBuffer = m_DimSizes[0] * m_DimSizes[1]; + + //if old buffers need to be removed + if (m_SampleBuffers.size() == m_NBufferToDisplay) + { + if (m_ovTotalDuration == 0) { m_ovTotalDuration = (m_StartTime.back() - m_StartTime.front()) + (m_EndTime.back() - m_StartTime.back()); } + if (m_BufferStep == 0) + { + if (m_StartTime.size() <= 1) { m_BufferStep = size_t(m_ovTotalDuration); } + else { m_BufferStep = m_StartTime[1] - m_StartTime[0]; } + } + if (m_TotalStep == 0) { m_TotalStep = (m_StartTime.back() - m_StartTime.front()) + m_BufferStep; } + + //save first buffer pointer + bufferToWrite = m_SampleBuffers.front(); + + //pop first element from queues + m_SampleBuffers.pop_front(); + m_StartTime.pop_front(); + m_EndTime.pop_front(); + for (size_t c = 0; c < size_t(m_DimSizes[0]); ++c) { m_LocalMinMaxValue[c].pop_front(); } + } + + //do we need to allocate a new buffer? + if (bufferToWrite == nullptr) { bufferToWrite = new double[nSamplesPerBuffer]; } + + //copy new buffer into internal buffer + if (nSamplesPerBuffer != 0) { memcpy(bufferToWrite, buffer, nSamplesPerBuffer * sizeof(double)); } + + //push new buffer and its timestamps + m_SampleBuffers.push_back(bufferToWrite); + m_StartTime.push_back(startTime); + m_EndTime.push_back(endTime); + + //compute and push min and max values of new buffer + size_t currentSample = 0; + //for each channel + for (size_t c = 0; c < size_t(m_DimSizes[0]); ++c) + { + double localMin = DBL_MAX; + double localMax = -DBL_MAX; + + //for each sample + for (size_t i = 0; i < m_DimSizes[1]; i++, currentSample++) + { + //get channel local min/max + if (buffer[currentSample] < localMin) { localMin = buffer[currentSample]; } + if (buffer[currentSample] > localMax) { localMax = buffer[currentSample]; } + } + + //adds the minmax pair to the corresponding channel's list + m_LocalMinMaxValue[c].emplace_back(localMin, localMax); + + if (localMax > m_MaxValue) { m_MaxValue = localMax; } + if (localMin < m_MinValue) { m_MinValue = localMin; } + } + + //tells the drawable to redraw himself since the signal information has been updated + if (m_RedrawOnNewData) { m_Drawable->redraw(); } + return true; +} + +bool CBufferDatabase::setSampling(const size_t sampling) +{ + m_Sampling = sampling; + return true; +} + +void CBufferDatabase::getDisplayedChannelLocalMinMaxValue(const size_t channel, double& min, double& max) +{ + min = +DBL_MAX; + max = -DBL_MAX; + + for (size_t i = 0; i < m_LocalMinMaxValue[channel].size(); ++i) + { + if (min > m_LocalMinMaxValue[channel][i].first) { min = m_LocalMinMaxValue[channel][i].first; } + if (max < m_LocalMinMaxValue[channel][i].second) { max = m_LocalMinMaxValue[channel][i].second; } + } +} + +bool CBufferDatabase::isTimeInDisplayedInterval(const uint64_t& time) const +{ + if (m_StartTime.empty()) { return false; } + + return time >= m_StartTime.front() && time <= m_EndTime.back(); +} + +bool CBufferDatabase::getIndexOfBufferStartingAtTime(const uint64_t& time, size_t& index) const +{ + index = 0; + + if (m_SampleBuffers.empty() || time < m_StartTime.front() || time > m_StartTime.back()) { return false; } + + for (size_t i = 0; i < m_StartTime.size(); ++i) + { + if (m_StartTime[i] == time) + { + index = i; + return true; + } + } + + return false; +} + +void CBufferDatabase::getDisplayedGlobalMinMaxValue(double& min, double& max) +{ + min = +DBL_MAX; + max = -DBL_MAX; + + for (auto& pairs : m_LocalMinMaxValue) + { + for (const auto& pair : pairs) + { + if (min > pair.first) { min = pair.first; } + if (max < pair.second) { max = pair.second; } + } + } +} + +void CBufferDatabase::getLastBufferChannelLocalMinMaxValue(const size_t channel, double& min, double& max) +{ + min = m_LocalMinMaxValue[channel].back().first; + max = m_LocalMinMaxValue[channel].back().second; +} + +void CBufferDatabase::getLastBufferMinMaxValue(double& min, double& max) +{ + min = +DBL_MAX; + max = -DBL_MAX; + + for (auto& localValue : m_LocalMinMaxValue) + { + min = (localValue.back().first < min) ? localValue.back().first : min; + max = (localValue.back().second > max) ? localValue.back().second : max; + } +} + +bool CBufferDatabase::getElectrodePosition(const size_t index, double* position) +{ + //TODO : add time parameter and look for coordinates closest to that time! + if (index < m_channelLocalisationLabels.size()) + { + //if(m_cartesianCoords == true) + //{ + *position = *(m_channelLocalisationCoords[0].first->getBuffer() + 3 * index); + *(position + 1) = *(m_channelLocalisationCoords[0].first->getBuffer() + 3 * index + 1); + *(position + 2) = *(m_channelLocalisationCoords[0].first->getBuffer() + 3 * index + 2); + //} + return true; + } + return false; +} + +bool CBufferDatabase::getElectrodePosition(const CString& label, double* position) +{ + //TODO : add time parameter and look for coordinates closest to that time! + for (size_t i = 0; i < m_channelLocalisationLabels.size(); ++i) + { + if (strcmp(label.toASCIIString(), m_channelLocalisationLabels[i].toASCIIString()) == 0) + { + //if(m_cartesianCoords == true) + //{ + *position = *(m_channelLocalisationCoords[0].first->getBuffer() + 3 * i); + *(position + 1) = *(m_channelLocalisationCoords[0].first->getBuffer() + 3 * i + 1); + *(position + 2) = *(m_channelLocalisationCoords[0].first->getBuffer() + 3 * i + 2); + //} + return true; + } + } + + return false; +} + +bool CBufferDatabase::getElectrodeLabel(const size_t index, CString& label) +{ + if (index >= m_channelLocalisationLabels.size()) { return false; } + label = m_channelLocalisationLabels[index].toASCIIString(); + return true; +} + +bool CBufferDatabase::getChannelPosition(const size_t index, double*& position) +{ + //TODO : add time parameter and look for coordinates closest to that time! + if (index >= 0 && index < m_ChannelLookupIndices.size()) + { + if (m_cartesianCoords) { position = m_channelLocalisationCoords[0].first->getBuffer() + 3 * m_ChannelLookupIndices[index]; } + // else { } //TODO + return true; + } + + return false; +} + +bool CBufferDatabase::getChannelSphericalCoordinates(const size_t index, double& theta, double& phi) +{ + //TODO : add time parameter and look for coordinates closest to that time! + if (index >= 0 && index < m_ChannelLookupIndices.size()) + { + if (m_cartesianCoords) + { + //get cartesian coords + double* coords = m_channelLocalisationCoords[0].first->getBuffer() + 3 * m_ChannelLookupIndices[index]; + + //convert to spherical coords + return convertCartesianToSpherical(coords, theta, phi); + } + //streamed coordinates are spherical already + //TODO + return false; + } + return false; +} + +bool CBufferDatabase::getChannelLabel(const size_t index, CString& label) +{ + if (index >= 0 && index < m_ChannelLookupIndices.size()) + { + label = m_channelLocalisationLabels[m_ChannelLookupIndices[index]]; + return true; + } + label = ""; + return false; +} + + +void CBufferDatabase::setStimulation(const size_t /*index*/, const uint64_t id, const uint64_t date) +{ + m_Stimulations.emplace_back(date, id); + + if (!m_StartTime.empty()) + { + while (m_Stimulations.begin() != m_Stimulations.end() && m_Stimulations.begin()->first < m_StartTime.front()) { m_Stimulations.pop_front(); } + } +} + +bool CBufferDatabase::fillChannelLookupTable() +{ + if (!m_HasFirstBuffer || !m_channelLocalisationHeaderReceived) { return false; } + + bool res = true; + + //resize lookup array and initialize lookup indices to 0 + m_ChannelLookupIndices.resize(size_t(m_NElectrodes), 0); + + //for all channels + for (size_t i = 0; i < m_DimSizes[0]; ++i) + { + //trim leading spaces + size_t firstNonWhitespaceChar = 0; + for (; firstNonWhitespaceChar < m_DimLabels[0][i].size(); ++firstNonWhitespaceChar) + { + if (isspace(m_DimLabels[0][i][firstNonWhitespaceChar]) == 0) { break; } + } + + //trim trailing spaces + size_t lastNonWhitespaceChar = 0; + if (!m_DimLabels[0][i].empty()) + { + for (lastNonWhitespaceChar = m_DimLabels[0][i].size() - 1; lastNonWhitespaceChar >= 0; lastNonWhitespaceChar--) + { + if (isspace(m_DimLabels[0][i][lastNonWhitespaceChar]) == 0) { break; } + } + } + + //look for label in channel localisation labels database + bool labelRecognized = false; + + if (firstNonWhitespaceChar < lastNonWhitespaceChar) + { + std::string channelLabel(m_DimLabels[0][i].substr(firstNonWhitespaceChar, lastNonWhitespaceChar - firstNonWhitespaceChar + 1)); + + for (size_t j = 0; j < m_channelLocalisationLabels.size(); ++j) + { + if (strcmp(channelLabel.c_str(), m_channelLocalisationLabels[j].toASCIIString()) == 0) + { + labelRecognized = true; + m_ChannelLookupIndices[i] = j; + break; + } + } + } + + //unrecognized electrode! + if (!labelRecognized) + { + m_ParentPlugin.getLogManager() << Kernel::LogLevel_Warning << "Unrecognized electrode name (index=" << i + << ", name=" << m_DimLabels[0][i] << ")!\n"; + res = false; + } + } + + m_ParentPlugin.getLogManager() << Kernel::LogLevel_Trace << "Electrodes list : "; + + for (size_t i = 0; i < size_t(m_DimSizes[0]); ++i) + { + m_ParentPlugin.getLogManager() << m_DimLabels[0][i].c_str(); + if (i < m_DimSizes[0] - 1) { m_ParentPlugin.getLogManager() << ", "; } + else { m_ParentPlugin.getLogManager() << "\n"; } + } + + if (res) { m_ChannelLookupTableInitialized = true; } + + return res; +} + +bool CBufferDatabase::convertCartesianToSpherical(const double* cartesian, double& theta, double& phi) const +{ + const double threshold = 1e-3; + const double radToDeg = 57.2957795131; // 180 / pi + + //compute theta + theta = acos(cartesian[2]) * radToDeg; + + //compute phi so that it lies in [0, 360] + if (fabs(cartesian[0]) < threshold) { phi = (cartesian[1] > 0) ? 90 : 270; } + else + { + phi = atan(cartesian[1] / cartesian[0]) * radToDeg; + if (cartesian[0] < 0) { phi += 180; } + else if (cartesian[1] < 0) { phi += 360; } + } + + return true; +} + +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCBufferDatabase.h b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCBufferDatabase.h new file mode 100644 index 0000000..e68b4ff --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCBufferDatabase.h @@ -0,0 +1,322 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +#include +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +class CSignalDisplayDrawable; + +/** +* Abtract class of objects than can be updated by a CBufferDatabase +*/ +class CSignalDisplayDrawable +{ +public: + + virtual ~CSignalDisplayDrawable() = default; + virtual void init() = 0; + virtual void redraw() = 0; +}; + +/** +* This class is used to store information about the incoming signal stream. It can request a CSignalDisplayDrawable +* object to redraw himself in case of some changes in its data. +*/ +class CBufferDatabase +{ +public: + int64_t m_NElectrodes = 0; ///< Number of channels + std::array m_DimSizes; ///< Number of channels and number of samples per buffer + std::vector m_DimLabels[2]; ///< Channel labels, buffer labels + bool m_HasFirstBuffer = false; ///< Flag set to true once first buffer is received + size_t m_Sampling = 0; ///< Sampling frequency of the incoming stream + std::deque m_SampleBuffers; ///< double-linked list of pointers to the samples buffers of the current time window + std::deque> m_Stimulations; ///< stimulations to display. pair values are + + bool m_ChannelLookupTableInitialized = false; ///< flag set to true once channel lookup indices are determined + std::vector m_ChannelLookupIndices; ///< indices of electrodes in channel localisation database + + //CMatrix m_electrodesSphericalCoords; ///< electrode spherical coordinates (in degrees) + //std::vector m_oElectrodesLabels; ///< electrode labels (standardized) + + size_t m_NBufferToDisplay = 2; ///< Number of buffer to display at the same time + double m_MaxValue = -DBL_MAX; ///< The global maximum value of the signal (up to now) + double m_MinValue = +DBL_MAX; ///< The global minimum value of the signal (up to now) + std::deque m_StartTime; ///< Double-linked list of the start times of the current buffers + std::deque m_EndTime; ///< Double-linked list of the end times of the current buffers + double m_TotalDuration = 0; ///< Duration to display in seconds + + /*! Duration to display in openvibe time units. + Computed once every time the user changes the total duration to display, + when the maximum number of buffers to store are received.*/ + uint64_t m_ovTotalDuration = 0; + + /*! Duration of a single buffer. + Computed once, but not constant when sampling frequency is not a multiple of buffer size!*/ + uint64_t m_BufferDuration = 0; + + /*! Time step separating the start times of m_NBufferToDisplay+1 buffers. + Recomputed once every time the user changes the total duration to display, + but not constant when sampling frequency is not a multiple of buffer size!*/ + size_t m_TotalStep = 0; + + /*! Time step separating the start times of 2 consecutive buffers. + Computed once, but not constant when sampling frequency is not a multiple of buffer size!*/ + size_t m_BufferStep = 0; + + uint64_t m_LastBufferEndTime = 0; ///< When did the last inserted buffer end + bool m_WarningPrinted = false; ///< Did we print a warning about noncontinuity? + + CSignalDisplayDrawable* m_Drawable = nullptr;///< Pointer to the drawable object to update (if needed) + + std::vector>> m_LocalMinMaxValue; + + Toolkit::TBoxAlgorithm& m_ParentPlugin; + + bool m_Error = false; + + //! Redraws the associated SignalDisplayDrawable upon new data reception if true (default) + bool m_RedrawOnNewData = true; + +protected: + /* \name Channel localisation */ + //@{ + //channel localisation decoder + Kernel::IAlgorithmProxy* m_decoder = nullptr; + //flag set to true once channel localisation buffer is received + bool m_channelLocalisationHeaderReceived = false; + //dynamic channel localisation flag (e.g. localisation is constantly updated with MEG) + bool m_dynamicChannelLocalisation = false; + //channel labels database + std::vector m_channelLocalisationLabels; + //flag stating whether streamed coordinates are cartesian (as opposed to spherical) + bool m_cartesianCoords = false; + //! double-linked list of streamed channel coordinates (if cartesian, expressed in normalized space (X right Y front Z up)) + std::deque> m_channelLocalisationCoords; + //! double-linked list of channel coordinates (spherical if streamed coords aere cartesian and vice versa) + //std::deque< std::pair > m_oChannelLocalisationAlternateCoords; + //pointer to double linked list of cartesian coordinates + //std::deque< std::pair > * m_channelLocalisationCartesianCoords; + //pointer to double linked list of spherical coordinates + //std::deque< std::pair > * m_channelLocalisationSphericalCoords; + //! double-linked list of start/end times of channel coordinates + std::deque> m_channelLocalisationTimes; + //@} + + //! Redraw mode (shift or scan) + ESignalDisplayMode m_displayMode = ESignalDisplayMode::Scan; + +public: + explicit CBufferDatabase(Toolkit::TBoxAlgorithm& plugin); + + virtual ~CBufferDatabase(); + + /** + * \brief Decode a channel localisation memory buffer + * \param buffer Memory buffer to decode + * \param startTime Start time of memory buffer + * \param endTime End time of memory buffer + * \return True if memory buffer could be properly decoded, false otherwise + */ + virtual bool decodeChannelLocalisationMemoryBuffer(const IMemoryBuffer* buffer, uint64_t startTime, uint64_t endTime); + + /** + * \brief Callback called upon channel localisation buffer reception + * \param index Index of newly received channel localisation buffer + * \return True if buffer data was correctly processed, false otherwise + */ + virtual bool onChannelLocalisationBufferReceived(const size_t index); + + /** + * \brief Sets the drawable object to update. + * \param drawable drawable object to update. + */ + virtual void setDrawable(CSignalDisplayDrawable* drawable) { m_Drawable = drawable; } + + /** + * \brief Get error status + * \return Error status. If true, an error occurred. + */ + virtual bool getErrorStatus() { return m_Error; } + + /** + * \brief Determines whether first buffer has been received yet + * \return True if first buffer has been received already, false otherwise + */ + virtual bool hasFirstBuffer() { return m_HasFirstBuffer; } + + /** + * \brief Determines whether first channel localisation buffer has been processed yet + * When this condition is true, channel coordinates may be retrieved using the + * corresponding methods in this class. + * \return True if first chanloc buffer was processed + */ + virtual bool isFirstChannelLocalisationBufferProcessed(); + + /** + * Compute the number of buffers needed to display the signal for a certain time period. + * \param time the time window's width in seconds. + */ + virtual bool adjustNumberOfDisplayedBuffers(const double time); + + /** + * \brief Get time interval covered by data held in this object + * \return Time interval in ms + */ + virtual double getDisplayedTimeIntervalWidth() const; + + /** + * \brief Determine whether time passed in parameter lies in displayed data interval + * \param time Time to test + * \return True if time lies in displayed time interval, false otherwise + */ + virtual bool isTimeInDisplayedInterval(const uint64_t& time) const; + + /** + * \brief Get index of sample buffer which starts at a given time + * \param time[in] Start time of buffer + * \param index[out] Buffer index + * \return True if buffer index could be determined, false otherwise + */ + virtual bool getIndexOfBufferStartingAtTime(const uint64_t& time, size_t& index) const; + + //! Returns the min/max values currently displayed for the given channel + virtual void getDisplayedChannelLocalMinMaxValue(const size_t channel, double& min, double& max); + //! Returns the min/max values currently displayed (all channels taken into account) + virtual void getDisplayedGlobalMinMaxValue(double& min, double& max); + + virtual void getDisplayedChannelLocalMeanValue(size_t /*channel*/, double& /*mean*/) { } + + //! Returns the min/max values of the last buffer arrived for the given channel + virtual void getLastBufferChannelLocalMinMaxValue(const size_t channel, double& min, double& max); + + //! Returns the min/max values of the last buffer arrived (all channels taken into account) + virtual void getLastBufferMinMaxValue(double& min, double& max); + + /** + * \brief Get number of eletrodes in database + * \return Number of electrodes + */ + virtual size_t getElectrodeCount() { return m_channelLocalisationLabels.size(); } + + /** + * \brief Get electrode normalized position + * \remarks Position expressed in normalized cartesian frame where X is right, Y front, Z up + * \param[in] index Index of electrode in database whose position is to be retrieved + * \param[out] position Pointer to an array of 3 floats where to store coordinates + * \return True if electrode position could be retrieved + */ + virtual bool getElectrodePosition(const size_t index, double* position); + + /** + * \brief Get electrode normalized position + * \remarks Position expressed in normalized cartesian frame where X is right, Y front, Z up + * \param[in] label Label of electrode whose position is to be retrieved + * \param[out] position Pointer to an array of 3 floats where to store coordinates + * \return True if electrode position could be retrieved + */ + virtual bool getElectrodePosition(const CString& label, double* position); + + /** + * \brief Get electrode label + * \param[in] index Index of electrode in database whose label is to be retrieved + * \param[out] label Electrode label + * \return True if electrode label could be retrieved + */ + virtual bool getElectrodeLabel(const size_t index, CString& label); + + /** + * \brief Get number of channels + * \return Number of channels + */ + virtual size_t getChannelCount() const; + + /** + * \brief Get channel normalized position + * \remarks Position expressed in normalized cartesian frame where X is right, Y front, Z up + * \param[in] index Index of channel whose position is to be retrieved + * \param[out] position Reference on a double pointer + * \return True if channel position could be retrieved (rChannelPosition then points to an array of 3 floats) + */ + virtual bool getChannelPosition(const size_t index, double*& position); + + /** + * \brief Get channel spherical coordinates in degrees + * \param[in] index Index of channel whose coordinates are to be retrieved + * \param[out] theta Reference on a float to be set with theta angle + * \param[out] phi Reference on a float to be set with phi angle + * \return True if channel coordinates could be retrieved + */ + virtual bool getChannelSphericalCoordinates(const size_t index, double& theta, double& phi); + + /** + * \brief Get channel label + * \param[in] index Index of channel whose label is to be retrieved + * \param[out] label Channel label + * \return True if channel label could be retrieved + */ + virtual bool getChannelLabel(const size_t index, CString& label); + + virtual void setMatrixDimensionCount(const size_t n); + virtual void setMatrixDimensionSize(const size_t index, const size_t size); + virtual void setMatrixDimensionLabel(const size_t idx1, const size_t idx2, const char* label); + + // Returns false on failure + virtual bool setMatrixBuffer(const double* buffer, const uint64_t startTime, const uint64_t endTime); + + // Sets the sampling frequency. If this is not called, the frequency is estimated from the stream chunk properties. + // Mainly used to force a warning if stream-specified rate differs from the chunk-estimated rate. + virtual bool setSampling(const size_t sampling); + + virtual void setStimulationCount(const size_t /*n*/) { } + virtual void setStimulation(const size_t index, const uint64_t id, const uint64_t date); + + /** + * \brief Set display mode + * \remarks Used by signal display and time ruler to determine how they should be updated + * \param mode New display mode + */ + virtual void setDisplayMode(const ESignalDisplayMode mode) { m_displayMode = mode; } + + /** + * \brief Get current display mode + * \return Current display mode + */ + virtual ESignalDisplayMode getDisplayMode() { return m_displayMode; } + + /** + * \brief Set flag stating whether to redraw associated SignalDisplayDrawable objet when new data is available + * \param redraw Value to set flag with + */ + virtual void setRedrawOnNewData(const bool redraw) { m_RedrawOnNewData = redraw; } + +protected: + /** + * \brief Initialize table storing indices of electrodes in channel localisation database + * \return True if table could be initialized + */ + virtual bool fillChannelLookupTable(); + + /** + * \brief Convert a cartesian coordinates triplet to spherical coordinates + * \param[in] cartesian Pointer to cartesian coordinates triplet + * \param[out] theta Equivalent theta angle + * \param[out] phi Equivalent phi angle + * \return True if coordinates were successfully converted + */ + bool convertCartesianToSpherical(const double* cartesian, double& theta, double& phi) const; +}; + +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCTopographicMap2DView.cpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCTopographicMap2DView.cpp new file mode 100644 index 0000000..6101407 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCTopographicMap2DView.cpp @@ -0,0 +1,1318 @@ +#include "ovpCTopographicMap2DView.h" + +#include + +#include +#include +#include + +#ifdef TARGET_OS_Windows +#ifndef NDEBUG +#include +#endif +#endif + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +//#define INTERPOLATE_AT_CHANNEL_LOCATION + +static const int NB_COLORS = 13; +static std::array palette; +static std::array palette8; + +static double Deg2Rad(const double x) { return x * 0.01745329251994329576923690768489; } +static gboolean redrawCallback(GtkWidget* widget, GdkEventExpose* event, gpointer data); +static gboolean resizeCallback(GtkWidget* widget, GtkAllocation* allocation, gpointer data); +static void toggleElectrodesCallback(GtkWidget* widget, gpointer data); +static void setProjectionCallback(GtkWidget* widget, gpointer data); +static void setViewCallback(GtkWidget* widget, gpointer data); +static void setInterpolationCallback(GtkWidget* widget, gpointer data); +static void setDelayCallback(GtkRange* range, gpointer data); + +CTopographicMap2DView::CTopographicMap2DView(CTopographicMapDatabase& mapDatabase, const EInterpolationType interpolation, double delay) + : m_mapDatabase(mapDatabase), m_currentInterpolation(interpolation) +{ + m_sampleCoordinatesMatrix.setDimensionCount(2); + + //load the gtk builder interface + m_builderInterface = gtk_builder_new(); + gtk_builder_add_from_file(m_builderInterface, Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-TopographicMap2D.ui", + nullptr); + + if (m_builderInterface == nullptr) + { + g_warning("Couldn't load the interface!"); + return; + } + + gtk_builder_connect_signals(m_builderInterface, nullptr); + + m_bgColor.pixel = 0; + m_bgColor.red = 0xFFFF; + m_bgColor.green = 0;//0xFFFF; + m_bgColor.blue = 0;//0xFFFF; + + //toolbar + //------- + + //get pointers to projection mode buttons + m_axialProjectionButton = GTK_RADIO_TOOL_BUTTON(gtk_builder_get_object(m_builderInterface, "AxialProjection")); + m_radialProjectionButton = GTK_RADIO_TOOL_BUTTON(gtk_builder_get_object(m_builderInterface, "RadialProjection")); + + g_signal_connect(G_OBJECT(m_axialProjectionButton), "toggled", G_CALLBACK(setProjectionCallback), this); + g_signal_connect(G_OBJECT(m_radialProjectionButton), "toggled", G_CALLBACK(setProjectionCallback), this); + + //get pointers to view buttons + m_topViewButton = GTK_RADIO_TOOL_BUTTON(gtk_builder_get_object(m_builderInterface, "TopView")); + m_leftViewButton = GTK_RADIO_TOOL_BUTTON(gtk_builder_get_object(m_builderInterface, "LeftView")); + m_rightViewButton = GTK_RADIO_TOOL_BUTTON(gtk_builder_get_object(m_builderInterface, "RightView")); + m_backViewButton = GTK_RADIO_TOOL_BUTTON(gtk_builder_get_object(m_builderInterface, "BackView")); + + g_signal_connect(G_OBJECT(m_topViewButton), "toggled", G_CALLBACK(setViewCallback), this); + g_signal_connect(G_OBJECT(m_leftViewButton), "toggled", G_CALLBACK(setViewCallback), this); + g_signal_connect(G_OBJECT(m_rightViewButton), "toggled", G_CALLBACK(setViewCallback), this); + g_signal_connect(G_OBJECT(m_backViewButton), "toggled", G_CALLBACK(setViewCallback), this); + + //get pointers to interpolation type buttons + m_mapPotentials = GTK_RADIO_TOOL_BUTTON(gtk_builder_get_object(m_builderInterface, "MapPotentials")); + m_mapCurrents = GTK_RADIO_TOOL_BUTTON(gtk_builder_get_object(m_builderInterface, "MapCurrents")); + + g_signal_connect(G_OBJECT(m_mapPotentials), "toggled", G_CALLBACK(setInterpolationCallback), this); + g_signal_connect(G_OBJECT(m_mapCurrents), "toggled", G_CALLBACK(setInterpolationCallback), this); + + //get pointer to electrodes toggle button + m_electrodesToggleButton = GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_builderInterface, "ToggleElectrodes")); + + g_signal_connect(G_OBJECT(m_electrodesToggleButton), "toggled", G_CALLBACK(toggleElectrodesCallback), this); + + //tell database about maximum delay + m_mapDatabase.adjustNumberOfDisplayedBuffers(m_maxDelay); + //ensure default delay lies in [0, m_maxDelay] + if (delay > m_maxDelay) { delay = m_maxDelay; } + //set default delay + setDelayCB(delay); + //configure delay slider + GtkWidget* delayScale = gtk_hscale_new_with_range(0.0, m_maxDelay, 0.1); + gtk_range_set_value(GTK_RANGE(delayScale), delay); + gtk_scale_set_value_pos(GTK_SCALE(delayScale), GTK_POS_TOP); + gtk_range_set_update_policy(GTK_RANGE(delayScale), GTK_UPDATE_CONTINUOUS); + gtk_widget_set_size_request(delayScale, 100, -1); + gtk_widget_show_all(delayScale); + g_signal_connect(G_OBJECT(delayScale), "value_changed", G_CALLBACK(setDelayCallback), this); + + //replace existing scale (which somehow can't be used) with the newly created one + GtkWidget* oldScale = GTK_WIDGET(gtk_builder_get_object(m_builderInterface, "DelayScale")); + GtkWidget* scaleParent = gtk_widget_get_parent(oldScale); + if (scaleParent != nullptr && GTK_IS_CONTAINER(scaleParent)) + { + gtk_container_remove(GTK_CONTAINER(scaleParent), oldScale); + if (GTK_IS_BOX(scaleParent)) + { + gtk_box_pack_start(GTK_BOX(scaleParent), delayScale, TRUE, TRUE, 0); + gtk_box_reorder_child(GTK_BOX(scaleParent), delayScale, 0); + } + } + + //color palettes + palette[0].red = 255 * 65535 / 255; + palette[0].green = 0 * 65535 / 255; + palette[0].blue = 0 * 65535 / 255; + palette[1].red = 234 * 65535 / 255; + palette[1].green = 1 * 65535 / 255; + palette[1].blue = 0 * 65535 / 255; + palette[2].red = 205 * 65535 / 255; + palette[2].green = 0 * 65535 / 255; + palette[2].blue = 101 * 65535 / 255; + palette[3].red = 153 * 65535 / 255; + palette[3].green = 0 * 65535 / 255; + palette[3].blue = 178 * 65535 / 255; + palette[4].red = 115 * 65535 / 255; + palette[4].green = 1 * 65535 / 255; + palette[4].blue = 177 * 65535 / 255; + palette[5].red = 77 * 65535 / 255; + palette[5].green = 0 * 65535 / 255; + palette[5].blue = 178 * 65535 / 255; + palette[6].red = 0 * 65535 / 255; + palette[6].green = 0 * 65535 / 255; + palette[6].blue = 152 * 65535 / 255; + palette[7].red = 0 * 65535 / 255; + palette[7].green = 97 * 65535 / 255; + palette[7].blue = 121 * 65535 / 255; + palette[8].red = 0 * 65535 / 255; + palette[8].green = 164 * 65535 / 255; + palette[8].blue = 100 * 65535 / 255; + palette[9].red = 0 * 65535 / 255; + palette[9].green = 225 * 65535 / 255; + palette[9].blue = 25 * 65535 / 255; + palette[10].red = 150 * 65535 / 255; + palette[10].green = 255 * 65535 / 255; + palette[10].blue = 0 * 65535 / 255; + palette[11].red = 200 * 65535 / 255; + palette[11].green = 255 * 65535 / 255; + palette[11].blue = 0 * 65535 / 255; + palette[12].red = 255 * 65535 / 255; + palette[12].green = 255 * 65535 / 255; + palette[12].blue = 0 * 65535 / 255; + + palette8[0] = 255; + palette8[1] = 0; + palette8[2] = 0; + palette8[3] = 234; + palette8[4] = 1; + palette8[5] = 0; + palette8[6] = 205; + palette8[7] = 0; + palette8[8] = 101; + palette8[9] = 153; + palette8[10] = 0; + palette8[11] = 178; + palette8[12] = 115; + palette8[13] = 1; + palette8[14] = 177; + palette8[15] = 77; + palette8[16] = 0; + palette8[17] = 178; + palette8[18] = 0; + palette8[19] = 0; + palette8[20] = 152; + palette8[21] = 0; + palette8[22] = 97; + palette8[23] = 121; + palette8[24] = 0; + palette8[25] = 164; + palette8[26] = 100; + palette8[27] = 0; + palette8[28] = 225; + palette8[29] = 25; + palette8[30] = 150; + palette8[31] = 255; + palette8[32] = 0; + palette8[33] = 200; + palette8[34] = 255; + palette8[35] = 0; + palette8[36] = 255; + palette8[37] = 255; + palette8[38] = 0; +} + +CTopographicMap2DView::~CTopographicMap2DView() +{ + //destroy clip mask + if (m_clipmask != nullptr) + { + g_object_unref(m_clipmask); + m_clipmask = nullptr; + } + if (m_clipmaskGC != nullptr) + { + g_object_unref(m_clipmaskGC); + m_clipmaskGC = nullptr; + } + //destroy visible region + if (m_visibleRegion != nullptr) + { + gdk_region_destroy(m_visibleRegion); + m_visibleRegion = nullptr; + } + //destroy pixmap + m_skullRGBBuffer.clear(); + + //unref the xml file as it's not needed anymore + g_object_unref(G_OBJECT(m_builderInterface)); + m_builderInterface = nullptr; +} + +void CTopographicMap2DView::init() +{ + m_drawingArea = GTK_WIDGET(gtk_builder_get_object(m_builderInterface, "TopographicMap2DDrawingArea")); + + gtk_widget_set_double_buffered(m_drawingArea, TRUE); + + g_signal_connect(G_OBJECT(m_drawingArea), "expose_event", G_CALLBACK(redrawCallback), this); + g_signal_connect(G_OBJECT(m_drawingArea), "size-allocate", G_CALLBACK(resizeCallback), this); + + gtk_widget_show(m_drawingArea); + + //set radial projection by default + m_currentProjection = EProjection::Radial; + enableProjectionButtonSignals(false); + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(m_radialProjectionButton), TRUE); + enableProjectionButtonSignals(true); + + //set top view by default + m_currentView = EView::Top; + enableViewButtonSignals(false); + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(m_topViewButton), TRUE); + enableViewButtonSignals(true); + + //reflect default interpolation type + m_mapDatabase.setInterpolationType(m_currentInterpolation); + enableInterpolationButtonSignals(false); + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(m_mapPotentials), gboolean(m_currentInterpolation == EInterpolationType::Spline)); + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(m_mapCurrents), gboolean(m_currentInterpolation == EInterpolationType::Laplacian)); + enableInterpolationButtonSignals(true); + + //hide electrodes by default + m_electrodesToggledOn = false; + enableElectrodeButtonSignals(false); + gtk_toggle_tool_button_set_active(m_electrodesToggleButton, gboolean(m_electrodesToggledOn)); + enableElectrodeButtonSignals(true); + + //recompute sample points coordinates + m_needResize = true; +} + +void CTopographicMap2DView::redraw() +{ + if (m_drawingArea != nullptr && GTK_WIDGET_VISIBLE(m_drawingArea)) + { + if (m_needResize) { resizeData(); } + + //draw face + drawFace(0, 0, m_headWindowWidth, m_headWindowHeight); + + //draw head + drawHead(); + + //draw palette + drawPalette(0, m_headWindowHeight, m_paletteWindowWidth, m_paletteWindowHeight); + + //don't clear screen at every redraw, it introduces major flickering + //gdk_window_invalidate_rect(m_drawingArea->window, nullptr, true); + } +} + +void CTopographicMap2DView::getWidgets(GtkWidget* & widget, GtkWidget* & toolbar) const +{ + widget = GTK_WIDGET(gtk_builder_get_object(m_builderInterface, "TopographicMap2DDrawingArea")); + toolbar = GTK_WIDGET(gtk_builder_get_object(m_builderInterface, "Toolbar")); +} + +CMatrix* CTopographicMap2DView::getSampleCoordinatesMatrix() +{ + if (m_needResize) { resizeData(); } + return &m_sampleCoordinatesMatrix; +} + +bool CTopographicMap2DView::setSampleValuesMatrix(CMatrix* matrix) +{ + //ensure matrix has the right size + if (matrix == nullptr || matrix->getBufferElementCount() < m_sampleValues.size()) { return false; } + + //retrieve min/max potentials + double minPotential, maxPotential; + m_mapDatabase.getLastBufferInterpolatedMinMaxValue(minPotential, maxPotential); + + const int colorStartIdx = 0; + const int colorEndIdx = NB_COLORS - 1; + + double invPotentialStep = 0; + + if (minPotential < maxPotential) { invPotentialStep = (colorEndIdx - colorStartIdx + 1) / (maxPotential - minPotential); } + + //determine color index of each sample + for (size_t i = 0; i < m_sampleValues.size(); ++i) + { + const double value = *(matrix->getBuffer() + i); + int colorIdx; + + if (value < minPotential) { colorIdx = 0; } + else if (value > maxPotential) { colorIdx = NB_COLORS - 1; } + else //linear itp + { + colorIdx = colorStartIdx + int((value - minPotential) * invPotentialStep); + if (colorIdx > NB_COLORS - 1) { colorIdx = NB_COLORS - 1; } + } + m_sampleValues[i] = colorIdx; + } + + refreshPotentials(); + + //force redraw + + return true; +} + +void CTopographicMap2DView::toggleElectrodesCB() +{ + m_electrodesToggledOn = !m_electrodesToggledOn; + + if (!m_electrodesToggledOn) + { + //clear screen so that electrode labels are hidden + if (m_drawingArea->window != nullptr) { gdk_window_invalidate_rect(m_drawingArea->window, nullptr, 1); } + } +} + +void CTopographicMap2DView::setProjectionCB(GtkWidget* widget) +{ + if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget)) == FALSE) { return; } + + if (widget == GTK_WIDGET(m_axialProjectionButton)) { m_currentProjection = EProjection::Axial; } + else if (widget == GTK_WIDGET(m_radialProjectionButton)) { m_currentProjection = EProjection::Radial; } + + //recompute sample points coordinates + m_needResize = true; + + //clear screen + if (m_drawingArea->window != nullptr) { gdk_window_invalidate_rect(m_drawingArea->window, nullptr, 1); } +} + +void CTopographicMap2DView::setViewCB(GtkWidget* widget) +{ + if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget)) == FALSE) { return; } + + if (widget == GTK_WIDGET(m_topViewButton)) { m_currentView = EView::Top; } + else if (widget == GTK_WIDGET(m_leftViewButton)) { m_currentView = EView::Left; } + else if (widget == GTK_WIDGET(m_rightViewButton)) { m_currentView = EView::Right; } + else if (widget == GTK_WIDGET(m_backViewButton)) { m_currentView = EView::Back; } + + //recompute sample points coordinates, update clipmask + m_needResize = true; + + //clear screen + if (m_drawingArea->window != nullptr) { gdk_window_invalidate_rect(m_drawingArea->window, nullptr, 1); } +} + +void CTopographicMap2DView::setInterpolationCB(GtkWidget* widget) +{ + if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget)) == FALSE) { return; } + + if (widget == GTK_WIDGET(m_mapPotentials)) + { + m_currentInterpolation = EInterpolationType::Spline; + m_mapDatabase.setInterpolationType(EInterpolationType::Spline); + } + else if (widget == GTK_WIDGET(m_mapCurrents)) + { + m_currentInterpolation = EInterpolationType::Laplacian; + m_mapDatabase.setInterpolationType(EInterpolationType::Laplacian); + } + + //recompute sample points coordinates + m_needResize = true; +} + +void CTopographicMap2DView::drawPalette(const size_t x, const size_t y, const size_t width, const size_t height) const +{ + if (width == 0 || height == 0) { return; } + + // FIXME is it necessary to keep next line uncomment ? + //bool drawText = true; + + //retrieve text size + PangoLayout* text = gtk_widget_create_pango_layout(GTK_WIDGET(m_drawingArea), "0"); + gint textHeight; + pango_layout_get_pixel_size(text, nullptr, &textHeight); + + //don't draw text if not enough room + if (textHeight >= gint(height - m_minPaletteBarHeight)) + { + // FIXME is it necessary to keep next line uncomment ? + //drawText = false; + } + //determine palette bar dims + const gint barWidth = gint(0.9 * width); + gint barHeight = gint(height - textHeight); + if (barHeight < gint(m_minPaletteBarHeight)) { barHeight = gint(m_minPaletteBarHeight); } + else if (barHeight > gint(m_maxPaletteBarHeight)) { barHeight = gint(m_maxPaletteBarHeight); } + const gint barStartX = gint(x + (width - barWidth) / 2); + const gint barStartY = gint(y); + + gint textWidth; + const gint labelY = gint(barStartY + barHeight + (height - barHeight - textHeight) / 2); + + //draw 0 label + pango_layout_get_pixel_size(text, &textWidth, nullptr); + gint labelX = gint(x + (width - textWidth) / 2); + + gdk_draw_layout(m_drawingArea->window, m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], labelX, labelY, text); + + //draw + label + pango_layout_set_text(text, "+", 1); + pango_layout_get_pixel_size(text, &textWidth, nullptr); + labelX = barStartX - textWidth / 2; + if (labelX < 0) { labelX = 0; } + gdk_draw_layout(m_drawingArea->window, m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], labelX, labelY, text); + + //draw - label + pango_layout_set_text(text, "-", 1); + pango_layout_get_pixel_size(text, &textWidth, nullptr); + labelX = barStartX + barWidth - textWidth / 2; + if (labelX + textWidth >= gint(width)) { labelX = gint(width) - textWidth; } + gdk_draw_layout(m_drawingArea->window, m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], + labelX, labelY, text); + + //draw palette bar (typically reversed : high potentials to the left; low potentials to the right) + gint currentX = barStartX; + + for (int i = NB_COLORS - 1; i >= 0; i--) + { + gdk_gc_set_rgb_fg_color(m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], &palette[i]); + + gdk_draw_rectangle(m_drawingArea->window, m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], + TRUE, currentX, barStartY, barWidth / NB_COLORS, barHeight); + + currentX += barWidth / 13; + } + + //restore default black color + GdkColor black; + black.red = black.green = black.blue = 0; + gdk_gc_set_rgb_fg_color(m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], &black); + + //delete pango layout + g_object_unref(text); +} + +void CTopographicMap2DView::drawFace(size_t /*X*/, size_t /*Y*/, size_t /*width*/, size_t /*height*/) const +{ + gdk_gc_set_line_attributes(m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], 2, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_BEVEL); + + //head center + const gint skullCenterX = gint(m_skullX + m_skullDiameter / 2); + const gint skullCenterY = gint(m_skullY + m_skullDiameter / 2); + + if (m_currentView == EView::Top) + { + const float noseHalfAngle = 6; + //nose lower left/right anchor + const gint lx = gint(size_t(skullCenterX + 1.0 * m_skullDiameter / 2 * cos(Deg2Rad(90 + noseHalfAngle)))); + const gint ly = gint(size_t(skullCenterY - 1.0 * m_skullDiameter / 2 * sin(Deg2Rad(90 + noseHalfAngle)))); + const gint rx = gint(size_t(skullCenterX + 1.0 * m_skullDiameter / 2 * cos(Deg2Rad(90 - noseHalfAngle)))); + const gint ry = gint(size_t(skullCenterY - 1.0 * m_skullDiameter / 2 * sin(Deg2Rad(90 - noseHalfAngle)))); + + gdk_draw_line(m_drawingArea->window, m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], lx, ly, skullCenterX, gint(m_noseY)); + gdk_draw_line(m_drawingArea->window, m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], rx, ry, skullCenterX, gint(m_noseY)); + } + else if (m_currentView == EView::Back) + { + gdk_draw_line(m_drawingArea->window, m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], gint(m_skullOutlineLeftPointX), + gint(m_skullOutlineLeftPointY), gint(m_leftNeckX), gint(m_leftNeckY)); + gdk_draw_line(m_drawingArea->window, m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], gint(m_skullOutlineRightPointX), + gint(m_skullOutlineRightPointY), gint(m_rightNeckX), gint(m_rightNeckY)); + } + else if (m_currentView == EView::Left || m_currentView == EView::Right) + { + gdk_draw_line(m_drawingArea->window, m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], gint(m_noseTopX), gint(m_noseTopY), + gint(m_noseBumpX), gint(m_noseBumpY)); + gdk_draw_line(m_drawingArea->window, m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], gint(m_noseBumpX), gint(m_noseBumpY), + gint(m_noseTipX), gint(m_noseTipY)); + gdk_draw_line(m_drawingArea->window, m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], gint(m_noseTipX), gint(m_noseTipY), + gint(m_noseBaseX), gint(m_noseBaseY)); + gdk_draw_line(m_drawingArea->window, m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], gint(m_noseBaseX), gint(m_noseBaseY), + gint(m_noseBottomX), gint(m_noseBottomY)); + } +} + +void CTopographicMap2DView::drawHead() const +{ + //draw head outline + gdk_gc_set_line_attributes(m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], 2, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_BEVEL); + gdk_draw_arc(m_drawingArea->window, m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], FALSE, gint(m_skullX), gint(m_skullY), + gint(m_skullDiameter), gint(m_skullDiameter), gint(64 * m_skullOutlineStartAngle), + gint(64 * (m_skullOutlineEndAngle - m_skullOutlineStartAngle))); + gdk_gc_set_line_attributes(m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], 1, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_BEVEL); + gdk_gc_set_clip_origin(m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], gint(m_skullX), gint(m_skullY)); + gdk_gc_set_clip_mask(m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], m_clipmask); + + drawPotentials(); + drawElectrodes(); + + gdk_gc_set_clip_mask(m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], nullptr); +} + +void CTopographicMap2DView::resizeData() +{ + //window size + const size_t width = m_drawingArea->allocation.width; + const size_t height = m_drawingArea->allocation.height; + + //retrieve text size + PangoLayout* text = gtk_widget_create_pango_layout(GTK_WIDGET(m_drawingArea), "0"); + int textHeight; + pango_layout_get_pixel_size(text, nullptr, &textHeight); + g_object_unref(text); + text = nullptr; + + //palette sub-window dims + m_paletteWindowWidth = width; + m_paletteWindowHeight = size_t(0.1 * height); + if (m_paletteWindowHeight > size_t(m_maxPaletteBarHeight + textHeight + 4)) { m_paletteWindowHeight = m_maxPaletteBarHeight + textHeight + 4; } + else if (m_paletteWindowHeight < size_t(m_minPaletteBarHeight + textHeight)) { m_paletteWindowHeight = size_t(m_minPaletteBarHeight + textHeight); } + + //return if not enough room available + if (m_paletteWindowHeight > height) { return; } + + //head sub-window dims + m_headWindowWidth = width; + m_headWindowHeight = height - m_paletteWindowHeight; + + size_t headMaxSize; + if (m_headWindowWidth < m_headWindowHeight) { headMaxSize = size_t(0.9 * m_headWindowWidth); } + else { headMaxSize = size_t(0.9 * m_headWindowHeight); } + + if (m_currentView == EView::Top) + { + //height used up by nose + const auto noseProtrudingHeight = size_t(0.1 * headMaxSize); + //Y coordinate where nose starts + m_noseY = size_t((m_headWindowHeight - headMaxSize) / 2); + //skull diameter + m_skullDiameter = headMaxSize - noseProtrudingHeight; + //skull upper left corner + m_skullX = (m_headWindowWidth - m_skullDiameter) / 2; + m_skullY = m_noseY + noseProtrudingHeight; + + //skull outline and filled area start/end angles + m_skullOutlineStartAngle = 0; + m_skullOutlineEndAngle = 360; + m_skullFillStartAngle = 0; + m_skullFillEndAngle = 360; + + //clip mask + m_clipmaskWidth = m_skullDiameter; + m_clipmaskHeight = m_skullDiameter; + } + else if (m_currentView == EView::Back) + { + //FIXME take into account width used up by ears + + //height used up by neck + const size_t neckProtrudingHeight = size_t(0.072 * headMaxSize); + + //skull diameter + m_skullDiameter = headMaxSize - neckProtrudingHeight; + //skull upper left corner + m_skullX = (m_headWindowWidth - m_skullDiameter) / 2; + m_skullY = (m_headWindowHeight - headMaxSize) / 2; + + //skull outline and filled area start/end angles + m_skullOutlineStartAngle = -38; + m_skullOutlineEndAngle = 180 - m_skullOutlineStartAngle; + m_skullFillStartAngle = -30; + m_skullFillEndAngle = 180 - m_skullFillStartAngle; + + const size_t skullCenterX = m_skullX + m_skullDiameter / 2; + const size_t skullCenterY = m_skullY + m_skullDiameter / 2; + + m_skullOutlineLeftPointX = skullCenterX + size_t(1.0 * m_skullDiameter / 2 * cosf(float(Deg2Rad(m_skullOutlineEndAngle)))); + m_skullOutlineLeftPointY = skullCenterY - size_t(1.0 * m_skullDiameter / 2 * sinf(float(Deg2Rad(m_skullOutlineEndAngle)))); + m_skullOutlineRightPointX = skullCenterX + size_t(1.0 * m_skullDiameter / 2 * cosf(float(Deg2Rad(m_skullOutlineStartAngle)))); + m_skullOutlineRightPointY = skullCenterY - size_t(1.0 * m_skullDiameter / 2 * sinf(float(Deg2Rad(m_skullOutlineStartAngle)))); + + m_skullFillLeftPointX = skullCenterX + size_t(1.0 * m_skullDiameter / 2 * cosf(float(Deg2Rad(m_skullFillEndAngle)))); + m_skullFillLeftPointY = skullCenterY - size_t(1.0 * m_skullDiameter / 2 * sinf(float(Deg2Rad(m_skullFillEndAngle)))); + m_skullFillRightPointX = skullCenterX + size_t(1.0 * m_skullDiameter / 2 * cosf(float(Deg2Rad(m_skullFillStartAngle)))); + m_skullFillRightPointY = skullCenterY - size_t(1.0 * m_skullDiameter / 2 * sinf(float(Deg2Rad(m_skullFillStartAngle)))); + m_skullFillBottomPointX = m_skullX + m_skullDiameter / 2; + m_skullFillBottomPointY = m_skullFillRightPointY; + + //neck extremities + m_leftNeckX = m_skullOutlineLeftPointX + size_t(0.025F * m_skullDiameter); + m_leftNeckY = m_skullOutlineLeftPointY + neckProtrudingHeight; + m_rightNeckX = m_skullOutlineRightPointX - size_t(0.025F * m_skullDiameter); + m_rightNeckY = m_leftNeckY; + + //clip mask + m_clipmaskWidth = m_skullDiameter; + m_clipmaskHeight = m_skullFillBottomPointY - m_skullY + 1; + } + else if (m_currentView == EView::Left || m_currentView == EView::Right) + { + //width used up by nose + const auto noseProtrudingWidth = size_t(0.06 * m_skullDiameter);//size_t(0.047 * m_skullDiameter); + + //skull diameter + m_skullDiameter = headMaxSize - noseProtrudingWidth; + + //topmost skull coordinate + m_skullY = (m_headWindowHeight - m_skullDiameter) / 2; + + if (m_currentView == EView::Left) + { + //X coordinate of nose tip + m_noseTipX = (m_headWindowWidth - headMaxSize) / 2; + //leftmost skull coordinate + m_skullX = m_noseTipX + noseProtrudingWidth; + //skull outline and filled area start/end angles + m_skullOutlineStartAngle = -41; + m_skullOutlineEndAngle = 193;//194; + m_skullFillStartAngle = -22; + m_skullFillEndAngle = 188; + + const size_t skullCenterX = m_skullX + m_skullDiameter / 2; + const size_t skullCenterY = m_skullY + m_skullDiameter / 2; + + //nose top = head outline left boundary + m_noseTopX = skullCenterX + size_t(float(m_skullDiameter) / 2 * cosf(float(Deg2Rad(m_skullOutlineEndAngle)))); + m_noseTopY = skullCenterY - size_t(float(m_skullDiameter) / 2 * sinf(float(Deg2Rad(m_skullOutlineEndAngle)))); + //nose bump + m_noseBumpX = m_noseTipX; + m_noseBumpY = m_noseTopY + size_t(0.15F * m_skullDiameter);//size_t(0.179f * m_skullDiameter); + //nose tip + //m_noseTipX = m_noseBumpX; + m_noseTipY = m_noseBumpY + size_t(0.03F * m_skullDiameter);//size_t(0.021f * m_skullDiameter); + //nose base + m_noseBaseX = m_noseTipX + size_t(0.1F * m_skullDiameter); + m_noseBaseY = m_noseTipY; + //nose bottom + m_noseBottomX = m_noseBaseX; + m_noseBottomY = m_noseBaseY + size_t(0.02F * m_skullDiameter);//size_t(0.016f * m_skullDiameter); + } + else + { + //X coordinate of nose tip + m_noseTipX = (m_headWindowWidth + headMaxSize) / 2; + //leftmost skull coordinate + m_skullX = (m_headWindowWidth - headMaxSize) / 2; + //skull outline and filled area start/end angles + m_skullOutlineStartAngle = -13; //-14; + m_skullOutlineEndAngle = 221; + m_skullFillStartAngle = -8; + m_skullFillEndAngle = 202; + + const size_t skullCenterX = m_skullX + m_skullDiameter / 2; + const size_t skullCenterY = m_skullY + m_skullDiameter / 2; + + //nose top = head outline right boundary + m_noseTopX = skullCenterX + size_t(float(m_skullDiameter) / 2 * cosf(float(Deg2Rad(m_skullOutlineStartAngle)))); + m_noseTopY = skullCenterY - size_t(float(m_skullDiameter) / 2 * sinf(float(Deg2Rad(m_skullOutlineStartAngle)))); + //nose bump + m_noseBumpX = m_noseTipX; + m_noseBumpY = m_noseTopY + size_t(0.15F * m_skullDiameter);//size_t(0.179f * m_skullDiameter); + //nose tip + //m_noseTipX = m_noseBumpX; + m_noseTipY = m_noseBumpY + size_t(0.03F * m_skullDiameter);//size_t(0.021f * m_skullDiameter); + //nose base + m_noseBaseX = m_noseTipX - size_t(0.1F * m_skullDiameter); + m_noseBaseY = m_noseTipY; + //nose bottom + m_noseBottomX = m_noseBaseX; + m_noseBottomY = m_noseBaseY + size_t(0.02F * m_skullDiameter);//size_t(0.016f * m_skullDiameter); + } + + const size_t skullCenterX = m_skullX + m_skullDiameter / 2; + const size_t skullCenterY = m_skullY + m_skullDiameter / 2; + m_skullFillLeftPointX = skullCenterX + size_t(float(m_skullDiameter) / 2 * cosf(float(Deg2Rad(m_skullFillEndAngle)))); + m_skullFillLeftPointY = skullCenterY - size_t(float(m_skullDiameter) / 2 * sinf(float(Deg2Rad(m_skullFillEndAngle)))); + m_skullFillRightPointX = skullCenterX + size_t(float(m_skullDiameter) / 2 * cosf(float(Deg2Rad(m_skullFillStartAngle)))); + m_skullFillRightPointY = skullCenterY - size_t(float(m_skullDiameter) / 2 * sinf(float(Deg2Rad(m_skullFillStartAngle)))); + + m_skullFillBottomPointX = m_skullX + m_skullDiameter / 2; + m_skullFillBottomPointY = m_skullY + size_t(0.684F * m_skullDiameter); + + //clip mask + m_clipmaskWidth = m_skullDiameter; + m_clipmaskHeight = m_skullFillBottomPointY - m_skullY + 1; + } + + //free existing clipmask, if any + if (m_clipmaskGC != nullptr) { g_object_unref(m_clipmaskGC); } + if (m_clipmask != nullptr) { g_object_unref(m_clipmask); } + + //allocate clipmask + m_clipmask = gdk_pixmap_new(m_drawingArea->window, gint(m_clipmaskWidth), gint(m_clipmaskHeight), 1); + m_clipmaskGC = gdk_gc_new(GDK_DRAWABLE(m_clipmask)); + gdk_gc_set_colormap(m_clipmaskGC, gdk_gc_get_colormap(m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)])); + + //redraw it + redrawClipmask(); + + //allocate main pixmap + //TODO! + + //allocate RGB pixmap + + m_skullRGBBuffer.clear(); + + //align lines on 32bit boundaries + m_rowStride = ((m_skullDiameter * 3) % 4 == 0) ? (m_skullDiameter * 3) : ((((m_skullDiameter * 3) >> 2) + 1) << 2); + m_skullRGBBuffer.resize(m_rowStride * m_skullDiameter); + + //determine size of colored cells +#if 1 + const size_t cellMinSize = 6; + const size_t cellMaxSize = 6; + const double cellOverSkullSizeRatio = 0.02; + m_cellSize = size_t(m_skullDiameter * cellOverSkullSizeRatio); + + if (m_cellSize < cellMinSize) { m_cellSize = cellMinSize; } + else if (m_cellSize > cellMaxSize) { m_cellSize = cellMaxSize; } +#else + m_cellSize = m_skullDiameter / 2; +#endif + if (m_cellSize == 0) { return; } + + //number of samples in a row or column + m_gridSize = size_t(ceil(m_skullDiameter / double(m_cellSize))); + + //determine number of samples lying within skull + const size_t nSamples = computeSamplesNormalizedCoordinates(false); + + //resize sample grids accordingly + m_sample2DCoordinates.resize(nSamples); + m_sampleCoordinatesMatrix.resize(nSamples, 3); + m_sampleValues.resize(nSamples); + + //compute samples normalized coordinates + computeSamplesNormalizedCoordinates(true); + + //resizing completed + m_needResize = false; +} + +void CTopographicMap2DView::redrawClipmask() +{ + //clear clipmask by drawing a black rectangle + GdkColor black; + black.red = black.green = black.blue = 0; + gdk_gc_set_rgb_fg_color(m_clipmaskGC, &black); + gdk_draw_rectangle(m_clipmask, m_clipmaskGC, TRUE, 0, 0, gint(m_clipmaskWidth), gint(m_clipmaskHeight)); + + //draw visible circular region with a white filled arc + GdkColor white; + white.red = white.green = white.blue = 65535; + gdk_gc_set_rgb_fg_color(m_clipmaskGC, &white); + gdk_draw_arc(m_clipmask, m_clipmaskGC, TRUE, 0, 0, gint(m_skullDiameter), gint(m_skullDiameter), gint(64 * m_skullFillStartAngle), + gint(64 * (m_skullFillEndAngle - m_skullFillStartAngle))); + + //views other than top have an extra non-clipped area + if (m_currentView == EView::Left || m_currentView == EView::Right || m_currentView == EView::Back) + { + //draw polygon : { skullCenter, skullFillStartPoint, skullFillBottomPoint, skullFillEndPoint, skullCenter } + GdkPoint polygon[4]; + polygon[0].x = gint(m_skullX + m_skullDiameter / 2 - m_skullX); + polygon[0].y = gint(m_skullY + m_skullDiameter / 2 - m_skullY - 2); + polygon[1].x = gint(m_skullFillRightPointX - m_skullX); + polygon[1].y = gint(m_skullFillRightPointY - m_skullY - 2); + polygon[2].x = gint(m_skullFillBottomPointX - m_skullX); + polygon[2].y = gint(m_skullFillBottomPointY - m_skullY - 2); + polygon[3].x = gint(m_skullFillLeftPointX - m_skullX); + polygon[3].y = gint(m_skullFillLeftPointY - m_skullY - 2); + gdk_draw_polygon(m_clipmask, m_clipmaskGC, TRUE, polygon, 4); + } + + //restore default black color + gdk_gc_set_rgb_fg_color(m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], &black); + + //update visible region + if (m_visibleRegion != nullptr) { gdk_region_destroy(m_visibleRegion); } + m_visibleRegion = gdk_drawable_get_visible_region(GDK_DRAWABLE(m_clipmask)); +} + +void CTopographicMap2DView::refreshPotentials() +{ + size_t w, h; + +#ifdef INTERPOLATE_AT_CHANNEL_LOCATION + for (size_t i = size_t(m_mapDatabase.getChannelCount()); i < m_sampleValues.size(); ++i) +#else + for (size_t i = 0; i < m_sampleValues.size(); ++i) +#endif + { + //cells of last row and last column may be smaller than other ones + if (m_sample2DCoordinates[i].first + m_cellSize >= m_skullDiameter) { w = m_skullDiameter - m_sample2DCoordinates[i].first; } + else { w = m_cellSize; } + + if (m_sample2DCoordinates[i].second + m_cellSize >= m_skullDiameter) { h = m_skullDiameter - m_sample2DCoordinates[i].second; } + else { h = m_cellSize; } + + size_t index = m_sampleValues[i]; + if (index > 12) { index = 12; } + + drawBoxToBuffer(m_sample2DCoordinates[i].first, m_sample2DCoordinates[i].second, w, h, palette8[3 * index], palette8[3 * index + 1], + palette8[3 * index + 2]); + } +} + +void CTopographicMap2DView::drawPotentials() const +{ + gdk_draw_rgb_image(m_drawingArea->window, m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], gint(m_skullX), gint(m_skullY), + gint(m_skullDiameter), gint(m_skullDiameter), GDK_RGB_DITHER_NONE, m_skullRGBBuffer.data(), gint(m_rowStride)); +} + +void CTopographicMap2DView::drawElectrodes() const +{ + if (!m_electrodesToggledOn) { return; } + + +#if 0 + //determine size of electrode rings + const double electrodeRingOverSkullSizeRatio = 0.05; + gint electrodeRingSize = gint(m_skullDiameter * electrodeRingOverSkullSizeRatio); + if (electrodeRingSize < (gint)electrodeRingMinSize) { electrodeRingSize = (gint)electrodeRingMinSize; } + else if (electrodeRingSize > (gint)electrodeRingMaxSize) { electrodeRingSize = (gint)electrodeRingMaxSize; } + if (electrodeRingSize == 0) { return; } +#else + const gint electrodeRingSize = 5; +#endif + + GdkColor white; + white.red = 65535; + white.green = 65535; + white.blue = 65535; + + GdkColor black; + black.red = 0; + black.green = 0; + black.blue = 0; + + //set electrode ring thickness + const gint electrodeRingThickness = 1; + gdk_gc_set_line_attributes(m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], electrodeRingThickness, GDK_LINE_SOLID, GDK_CAP_BUTT, + GDK_JOIN_BEVEL); + + //electrode label + CString electrodeLabel; + PangoLayout* electrodeLabelLayout = gtk_widget_create_pango_layout(GTK_WIDGET(m_drawingArea), " "); + gint textHeight, textWidth; + pango_layout_get_pixel_size(electrodeLabelLayout, nullptr, &textHeight); + + //draw rings + const size_t nChannel = size_t(m_mapDatabase.getChannelCount()); + gint channelX, channelY; + + for (size_t i = 0; i < nChannel; ++i) + { + if (!getChannel2DPosition(i, channelX, channelY)) { continue; } + +#ifdef INTERPOLATE_AT_CHANNEL_LOCATION + //disk colored according to value interpolated at this channel location + gdk_gc_set_rgb_fg_color(m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], &PALETTE[m_sampleValues[i]]); +#else + //fill ring with white + gdk_gc_set_rgb_fg_color(m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], &white); +#endif + gdk_draw_arc(m_drawingArea->window, m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], TRUE, + channelX - electrodeRingSize / 2, channelY - electrodeRingSize / 2, electrodeRingSize, electrodeRingSize, 0, 64 * 360); + + //ring centered on channel location + gdk_gc_set_rgb_fg_color(m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], &black); + + gdk_draw_arc(m_drawingArea->window, + m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], FALSE, + channelX - electrodeRingSize / 2, channelY - electrodeRingSize / 2, + electrodeRingSize, electrodeRingSize, 0, 64 * 360); + + //channel label + gdk_gc_set_rgb_fg_color(m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], &black/*&white*/); + + m_mapDatabase.getChannelLabel(i, electrodeLabel); + pango_layout_set_text(electrodeLabelLayout, electrodeLabel, int(strlen(electrodeLabel))); + pango_layout_get_pixel_size(electrodeLabelLayout, &textWidth, nullptr); + gdk_draw_layout(m_drawingArea->window, m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], + channelX - textWidth / 2, + channelY - electrodeRingSize / 2 - textHeight - 5, + electrodeLabelLayout); + } + + //restore default line thickness + gdk_gc_set_line_attributes(m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], 1, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_BEVEL); + + //restore default black color + gdk_gc_set_rgb_fg_color(m_drawingArea->style->fg_gc[GTK_WIDGET_STATE(m_drawingArea)], &black); + + //delete pango layout + g_object_unref(electrodeLabelLayout); +} + +bool CTopographicMap2DView::getChannel2DPosition(const size_t index, gint& x, gint& y) const +{ + const size_t skullCenterX = m_skullX + m_skullDiameter / 2; + const size_t skullCenterY = m_skullY + m_skullDiameter / 2; + //get normalized coordinates + double* originaPosition; + m_mapDatabase.getChannelPosition(index, originaPosition); + + /* flip the eletrode positions in order to use the mensia coordinate system */ + + const std::array position = { originaPosition[0], originaPosition[1], originaPosition[2] }; + + if (m_currentView == EView::Top) + { + if (m_currentProjection == EProjection::Axial) + { + x = gint(skullCenterX + position[0] * m_skullDiameter / 2); + y = gint(skullCenterY - position[1] * m_skullDiameter / 2); + } + else //radial + { + //compute back frame 2D coordinates + const double theta = getThetaFromCartesianCoordinates(position); + const double phi = getPhiFromCartesianCoordinates(position); + compute2DCoordinates(theta, phi, skullCenterX, skullCenterY, x, y); + } + } + else if (m_currentView == EView::Back) + { + //if(electrodePosition[1] > 0) //electrode not visible + if (position[1] > sin(1.F / 90 * M_PI / 2)) { return false; } + + if (m_currentProjection == EProjection::Axial) + { + x = gint(skullCenterX + position[0] * m_skullDiameter / 2); + y = gint(skullCenterY - position[2] * m_skullDiameter / 2); + } + else //radial + { + //transform coordinates from top frame to back frame + const std::array backPosition = { position[0], position[2], -position[1] }; + //compute back frame 2D coordinates + const double theta = getThetaFromCartesianCoordinates(backPosition); + const double phi = getPhiFromCartesianCoordinates(backPosition); + compute2DCoordinates(theta, phi, skullCenterX, skullCenterY, x, y); + } + } + else if (m_currentView == EView::Left) + { + //if(electrodePosition[0] > 0) //electrode not visible + if (position[0] > cos(89.F / 90 * M_PI / 2)) { return false; } + + if (m_currentProjection == EProjection::Axial) + { + x = gint(skullCenterX - position[1] * m_skullDiameter / 2); + y = gint(skullCenterY - position[2] * m_skullDiameter / 2); + } + else //radial + { + //transform coordinates from top frame to left frame + const std::array backPosition = { -position[1], position[2], -position[0] }; + //compute back frame 2D coordinates + const double theta = getThetaFromCartesianCoordinates(backPosition); + const double phi = getPhiFromCartesianCoordinates(backPosition); + compute2DCoordinates(theta, phi, skullCenterX, skullCenterY, x, y); + } + } + else if (m_currentView == EView::Right) + { + //if(electrodePosition[0] < 0) //electrode not visible + if (position[0] < -cos(89.F / 90 * M_PI / 2)) { return false; } + + if (m_currentProjection == EProjection::Axial) + { + x = gint(skullCenterX + position[1] * m_skullDiameter / 2); + y = gint(skullCenterY - position[2] * m_skullDiameter / 2); + } + else //radial + { + //transform coordinates from top frame to left frame + const std::array backPosition = { position[1], position[2], position[0] }; + //compute back frame 2D coordinates + const double theta = getThetaFromCartesianCoordinates(backPosition); + const double phi = getPhiFromCartesianCoordinates(backPosition); + compute2DCoordinates(theta, phi, skullCenterX, skullCenterY, x, y); + } + } + + //make sure electrode is in the non clipped area of the display + //TODO : perform this test once per view only! + return gdk_region_point_in(m_visibleRegion, x - int(m_skullX), y - int(m_skullY)) != 0; +} + +void CTopographicMap2DView::drawBoxToBuffer(const size_t x, const size_t y, const size_t width, const size_t height, + const uint8_t red, const uint8_t green, const uint8_t blue) const +{ +#ifdef TARGET_OS_Windows +#ifndef NDEBUG + //m_skullRGBBuffer == m_rowStride*m_skullDiameter + assert(x < m_skullDiameter); + assert(y < m_skullDiameter); + assert((m_rowStride * y) + (x * 3) + 2 < m_rowStride * m_skullDiameter); +#endif +#endif + guchar* lineBase = const_cast(m_skullRGBBuffer.data()) + (m_rowStride * y) + (x * 3); + + for (size_t j = 0; j < height; ++j) + { + for (size_t i = 0; i < (width * 3); i += 3) + { + *(lineBase + i) = red; + *(lineBase + i + 1) = green; + *(lineBase + i + 2) = blue; + } + + lineBase += (m_rowStride); + } +} + +size_t CTopographicMap2DView::computeSamplesNormalizedCoordinates(const bool all) +{ + size_t curSample = 0; + +#ifdef INTERPOLATE_AT_CHANNEL_LOCATION + size_t nChannel = (size_t)m_topographicMapDatabase.getChannelCount(); + double* electrodePosition = nullptr; + + //sampling at electrode locations + for (curSample = 0; curSample < nChannel; ++curSample) + { + m_topographicMapDatabase.getChannelPosition(curSample, electrodePosition); + + //dummy 2D coords - actual coords are computed when drawing electrode rings + m_sample2DCoordinates[curSample].first = 0; + m_sample2DCoordinates[curSample].second = 0; + + *(m_sampleCoordinatesMatrix.getBuffer() + 3 * curSample) = *electrodePosition; + *(m_sampleCoordinatesMatrix.getBuffer() + 3 * curSample + 1) = *(electrodePosition + 1); + *(m_sampleCoordinatesMatrix.getBuffer() + 3 * curSample + 2) = *(electrodePosition + 2); + } +#endif + + //sampling over skull area + const float skullCenterX = m_skullX + m_skullDiameter / 2.F; + const float skullCenterY = m_skullY + m_skullDiameter / 2.F; + double* buffer = m_sampleCoordinatesMatrix.getBuffer(); + + //for each row + float curY = float(m_skullY); + for (size_t i = 0; i < m_gridSize; ++i) + { + //for each column + float curX = float(m_skullX); + for (size_t j = 0; j < m_gridSize; ++j) + { + //find corner closest to skull center + const float closestX = fabs(curX - skullCenterX) < fabs(curX + m_cellSize - skullCenterX) ? curX : (curX + m_cellSize); + const float closestY = fabs(curY - skullCenterY) < fabs(curY + m_cellSize - skullCenterY) ? curY : (curY + m_cellSize); + + //make sure electrode is in the non clipped area of the display + //TODO : perform this test once per view only! + //ensure closest corner lies within "skull sphere" + if ((closestX - skullCenterX) * (closestX - skullCenterX) + + (closestY - skullCenterY) * (closestY - skullCenterY) <= (float(m_skullDiameter * m_skullDiameter) / 4.F)) + { + //ensure this point is in the non clipped skull area + //FIXME : the previous test remains necessary to get rid of all points lying outside "skull sphere"... Bug in gdk_region_point_in()? + if (gdk_region_point_in(m_visibleRegion, int(closestX - m_skullX), int(closestY - m_skullY))) + { + if (all) + { + m_sample2DCoordinates[curSample].first = size_t(j * m_cellSize); + m_sample2DCoordinates[curSample].second = size_t(i * m_cellSize); + + //compute normalized coordinates to be fed to spherical spline algorithm + //---------------------------------------------------------------------- + const size_t baseIndex = 3 * curSample; + + //normalized X, Y coords in (X, Y) projection plane + const float x = (closestX - skullCenterX) / (m_skullDiameter / 2.F); + const float y = -(closestY - skullCenterY) / (m_skullDiameter / 2.F); //y axis down in 2D but up in 3D convention + + if (m_currentProjection == EProjection::Axial) + { + if (m_currentView == EView::Top) + { + *(buffer + baseIndex) = x; + *(buffer + baseIndex + 1) = y; + //z = sqrt(1-x*x-y*y) + const float squareXYSum = x * x + y * y; + *(buffer + baseIndex + 2) = (squareXYSum >= 1) ? 0 : sqrt(1 - squareXYSum); + } + else if (m_currentView == EView::Back) + { + *(buffer + baseIndex) = x; + *(buffer + baseIndex + 2) = y; + //y = sqrt(1-x*x-z*z) + const float squareXYSum = x * x + y * y; + *(buffer + baseIndex + 1) = (squareXYSum >= 1) ? 0 : sqrt(1 - squareXYSum); + } + else if (m_currentView == EView::Left) + { + *(buffer + baseIndex + 1) = -x; + *(buffer + baseIndex + 2) = y; + //x = sqrt(1-y*y-z*z) + const float squareXYSum = x * x + y * y; + *(buffer + baseIndex) = (squareXYSum >= 1) ? 0 : sqrt(1 - squareXYSum); + } + else if (m_currentView == EView::Right) + { + *(buffer + baseIndex + 1) = x; + *(buffer + baseIndex + 2) = y; + //x = sqrt(1-y*y-z*z) + const float squareXYSum = x * x + y * y; + *(buffer + baseIndex) = (squareXYSum >= 1) ? 0 : sqrt(1 - squareXYSum); + } + } + else //radial + { + //theta = (X,Y) arc length + const float theta = float(M_PI / 2 * sqrtf(x * x + y * y)); + const float scalingFactor = (theta <= 1e-3) ? 0 : (sinf(theta) / theta); + std::array sampleLocalCoordinates; + //x = sin(theta) / theta * X + sampleLocalCoordinates[0] = float(scalingFactor * x * (M_PI / 2)); + //y = sin(theta) / theta * Y + sampleLocalCoordinates[1] = float(scalingFactor * y * (M_PI / 2)); + //z = cos(theta) + sampleLocalCoordinates[2] = cosf(theta); + + if (m_currentView == EView::Top) + { + *(buffer + baseIndex) = sampleLocalCoordinates[0]; + *(buffer + baseIndex + 1) = sampleLocalCoordinates[1]; + *(buffer + baseIndex + 2) = sampleLocalCoordinates[2]; + } + else if (m_currentView == EView::Back) + { + *(buffer + baseIndex) = sampleLocalCoordinates[0]; + *(buffer + baseIndex + 1) = -sampleLocalCoordinates[2]; + *(buffer + baseIndex + 2) = sampleLocalCoordinates[1]; + } + else if (m_currentView == EView::Left) + { + *(buffer + baseIndex) = -sampleLocalCoordinates[2]; + *(buffer + baseIndex + 1) = -sampleLocalCoordinates[0]; + *(buffer + baseIndex + 2) = sampleLocalCoordinates[1]; + } + else if (m_currentView == EView::Right) + { + *(buffer + baseIndex) = sampleLocalCoordinates[2]; + *(buffer + baseIndex + 1) = sampleLocalCoordinates[0]; + *(buffer + baseIndex + 2) = sampleLocalCoordinates[1]; + } + } + } + + curSample++; + } //point in non clipped area + } //point in "skull sphere" + curX += m_cellSize; + } + curY += m_cellSize; + } + + return curSample; +} + +void CTopographicMap2DView::enableElectrodeButtonSignals(const bool enable) +{ + if (enable) { g_signal_connect(G_OBJECT(m_electrodesToggleButton), "toggled", G_CALLBACK(toggleElectrodesCallback), this); } + else { g_signal_handlers_disconnect_by_func(G_OBJECT(m_electrodesToggleButton), reinterpret_cast(G_CALLBACK(toggleElectrodesCallback)), this); } +} + +void CTopographicMap2DView::enableProjectionButtonSignals(const bool enable) +{ + if (enable) + { + g_signal_connect(G_OBJECT(m_axialProjectionButton), "toggled", G_CALLBACK(setProjectionCallback), this); + g_signal_connect(G_OBJECT(m_radialProjectionButton), "toggled", G_CALLBACK(setProjectionCallback), this); + } + else + { + g_signal_handlers_disconnect_by_func(G_OBJECT(m_axialProjectionButton), reinterpret_cast(G_CALLBACK(setProjectionCallback)), this); + g_signal_handlers_disconnect_by_func(G_OBJECT(m_radialProjectionButton), reinterpret_cast(G_CALLBACK(setProjectionCallback)), this); + } +} + +void CTopographicMap2DView::enableViewButtonSignals(const bool enable) +{ + if (enable) + { + g_signal_connect(G_OBJECT(m_topViewButton), "toggled", G_CALLBACK(setViewCallback), this); + g_signal_connect(G_OBJECT(m_leftViewButton), "toggled", G_CALLBACK(setViewCallback), this); + g_signal_connect(G_OBJECT(m_rightViewButton), "toggled", G_CALLBACK(setViewCallback), this); + g_signal_connect(G_OBJECT(m_backViewButton), "toggled", G_CALLBACK(setViewCallback), this); + } + else + { + g_signal_handlers_disconnect_by_func(G_OBJECT(m_topViewButton), reinterpret_cast(G_CALLBACK(setViewCallback)), this); + g_signal_handlers_disconnect_by_func(G_OBJECT(m_leftViewButton), reinterpret_cast(G_CALLBACK(setViewCallback)), this); + g_signal_handlers_disconnect_by_func(G_OBJECT(m_rightViewButton), reinterpret_cast(G_CALLBACK(setViewCallback)), this); + g_signal_handlers_disconnect_by_func(G_OBJECT(m_backViewButton), reinterpret_cast(G_CALLBACK(setViewCallback)), this); + } +} + +void CTopographicMap2DView::enableInterpolationButtonSignals(const bool enable) +{ + if (enable) + { + g_signal_connect(G_OBJECT(m_mapPotentials), "toggled", G_CALLBACK(setInterpolationCallback), this); + g_signal_connect(G_OBJECT(m_mapCurrents), "toggled", G_CALLBACK(setInterpolationCallback), this); + } + else + { + g_signal_handlers_disconnect_by_func(G_OBJECT(m_mapPotentials), reinterpret_cast(G_CALLBACK(setInterpolationCallback)), this); + g_signal_handlers_disconnect_by_func(G_OBJECT(m_mapCurrents), reinterpret_cast(G_CALLBACK(setInterpolationCallback)), this); + } +} + +double CTopographicMap2DView::getThetaFromCartesianCoordinates(const std::array& cartesian) const { return acos(cartesian[2]); } + +double CTopographicMap2DView::getPhiFromCartesianCoordinates(const std::array& cartesian) const +{ + double phi; + if (cartesian[0] > 0.001) + { + phi = atan(cartesian[1] / cartesian[0]); + if (phi < 0) { phi += 2 * M_PI; } + } + else if (cartesian[0] < -0.001) { phi = atan(cartesian[1] / cartesian[0]) + M_PI; } + else { phi = cartesian[1] > 0 ? (M_PI / 2) : (3 * M_PI / 2); } + + return phi; +} + +bool CTopographicMap2DView::compute2DCoordinates(const double theta, const double phi, const size_t skullCenterX, const size_t skullCenterY, gint& x, + gint& y) const +{ + //linear plotting along radius + const double length = theta / (M_PI / 2) * m_skullDiameter / 2; + //determine coordinates on unit circle + const double x1 = cos(phi); + const double y1 = sin(phi); + //scale vector so that it is length long + x = gint(skullCenterX + length * x1); + y = gint(skullCenterY - length * y1); + return true; +} + +//CALLBACKS + +gboolean redrawCallback(GtkWidget* /*widget*/, GdkEventExpose* /*event*/, gpointer data) +{ + reinterpret_cast(data)->redraw(); + return TRUE; +} + +gboolean resizeCallback(GtkWidget* /*pWidget*/, GtkAllocation* allocation, gpointer data) +{ + reinterpret_cast(data)->resizeCB(allocation->width, allocation->height); + return FALSE; +} + +void toggleElectrodesCallback(GtkWidget* /*pWidget*/, gpointer data) +{ + auto* view = reinterpret_cast(data); + view->toggleElectrodesCB(); +} + +void setProjectionCallback(GtkWidget* widget, gpointer data) +{ + auto* view = reinterpret_cast(data); + view->setProjectionCB(widget); +} + +void setViewCallback(GtkWidget* widget, gpointer data) +{ + auto* view = reinterpret_cast(data); + view->setViewCB(widget); +} + +void setInterpolationCallback(GtkWidget* widget, gpointer data) +{ + auto* view = reinterpret_cast(data); + view->setInterpolationCB(widget); +} + +void setDelayCallback(GtkRange* range, gpointer data) +{ + auto* view = reinterpret_cast(data); + view->setDelayCB(gtk_range_get_value(range)); +} + +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCTopographicMap2DView.h b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCTopographicMap2DView.h new file mode 100644 index 0000000..fea2710 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCTopographicMap2DView.h @@ -0,0 +1,274 @@ +#pragma once + +#include "../../ovp_defines.h" + +#include +#include + +#include + +#include "ovpCTopographicMapDatabase.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +/** + * This class contains everything necessary to setup a GTK window and display + * a 2D topographic map + */ +class CTopographicMap2DView final : public CTopographicMapDrawable +{ +public: + enum class EProjection { Axial, Radial, NumProjection }; + + enum class EView { Top, Left, Right, Back }; + + /** + * \brief Constructor + * \param mapDatabase Datastore + * \param interpolation Interpolation mode + * \param delay Delay to apply to displayed data + */ + CTopographicMap2DView(CTopographicMapDatabase& mapDatabase, EInterpolationType interpolation, double delay); + + /** + * \brief Destructor + */ + ~CTopographicMap2DView() override; + + /** \name CSignalDisplayDrawable implementation */ + //@{ + + /** + * \brief Initialize widgets + */ + void init() override; + + /** + * \brief Redraw map + */ + void redraw() override; + + //@} + + /** \name CTopographicMapDrawable implementation */ + //@{ + + /** + * \brief Get matrix of sample points coordinates (places where to interpolate values) + * \return Pointer to matrix of sample points coordinates + */ + CMatrix* getSampleCoordinatesMatrix() override; + + /** + * \brief Set matrix of sample points values (values interpolated at places specified in sample coordinates matrix) + * \param [in] matrix Pointer to matrix of sample points values + * \return True if values were successfully set, false otherwise + */ + bool setSampleValuesMatrix(CMatrix* matrix) override; + + //@} + + /** + * \brief Get pointers to plugin main widget and (optional) toolbar widget + * \param [out] widget Pointer to main widget + * \param [out] toolbar Pointer to (optional) toolbar widget + */ + void getWidgets(GtkWidget*& widget, GtkWidget*& toolbar) const; + + /** + * \brief Get ID of current view + * \return ID of current view + */ + EView getCurrentView() const { return m_currentView; } + + /** \name Callbacks */ + //@{ + + void resizeCB(size_t /*width*/, size_t /*height*/) { m_needResize = true; } + void toggleElectrodesCB(); + void setProjectionCB(GtkWidget* widget); + void setViewCB(GtkWidget* widget); + void setInterpolationCB(GtkWidget* widget); + void setDelayCB(const double delay) const { m_mapDatabase.setDelay(delay); } + + //@} + +private: + //draw color palette + void drawPalette(size_t x, size_t y, size_t width, size_t height) const; + + //draw face (ears, nose, neck) + void drawFace(size_t x, size_t y, size_t width, size_t height) const; + + //draw head + void drawHead() const; + + //draw RGB buffer + void drawPotentials() const; + + //draw electrodes corresponding to visible channels as rings + void drawElectrodes() const; + + /** + * \brief Get channel position in 2D + * \param index[in] Index of channel which position is to be retrieved + * \param x[out] X coordinate of channel location, if channel is visible + * \param y[out] Y coordinate of channel location, if channel is visible + * \return True if channel is visible in current view, false otherwise + */ + bool getChannel2DPosition(size_t index, gint& x, gint& y) const; + + //update RGB buffer with interpolated values + void refreshPotentials(); + + //draw a box in RGB buffer + void drawBoxToBuffer(size_t x, size_t y, size_t width, size_t height, uint8_t red, uint8_t green, uint8_t blue) const; + + void enableElectrodeButtonSignals(bool enable); + void enableProjectionButtonSignals(bool enable); + void enableViewButtonSignals(bool enable); + void enableInterpolationButtonSignals(bool enable); + + /** + * \brief Compute normalized coordinates of 2D samples + * \remarks This method should first be called with bComputeCoordinates = false, allowing caller + * to resize data structures appropriately, and then it may be called with bComputeCoordinates = true + * \param all If false, this method only computes the number of visible samples + * \return Number of visible samples (samples lying within the actual skull area) + */ + size_t computeSamplesNormalizedCoordinates(bool all); + + void resizeData(); + + void redrawClipmask(); + + double getThetaFromCartesianCoordinates(const std::array& cartesian) const; + + double getPhiFromCartesianCoordinates(const std::array& cartesian) const; + + bool compute2DCoordinates(double theta, double phi, size_t skullCenterX, size_t skullCenterY, gint& x, gint& y) const; + + //! The database that contains the information to use to draw the signals + CTopographicMapDatabase& m_mapDatabase; + + //Maximum delay that can be applied to displayed data + double m_maxDelay = 2.0; + + GtkBuilder* m_builderInterface = nullptr; + + GtkWidget* m_drawingArea = nullptr; + GdkBitmap* m_clipmask = nullptr; //origin (m_skullX, m_skullY) + size_t m_clipmaskWidth = 0; + size_t m_clipmaskHeight = 0; + GdkGC* m_clipmaskGC = nullptr; + GdkRegion* m_visibleRegion = nullptr; //reallocated whenever clipmask changes + + GdkColor m_bgColor; + + //! Active projection + EProjection m_currentProjection = EProjection::Radial; + //! Projection radio buttons + GtkRadioToolButton* m_axialProjectionButton = nullptr; + GtkRadioToolButton* m_radialProjectionButton = nullptr; + + //! Active view + EView m_currentView = EView::Top; + //! View radio buttons + GtkRadioToolButton* m_topViewButton = nullptr; + GtkRadioToolButton* m_leftViewButton = nullptr; + GtkRadioToolButton* m_rightViewButton = nullptr; + GtkRadioToolButton* m_backViewButton = nullptr; + + //! Interpolation type + EInterpolationType m_currentInterpolation = EInterpolationType::Laplacian; + GtkRadioToolButton* m_mapPotentials = nullptr; + GtkRadioToolButton* m_mapCurrents = nullptr; + + //! Electrodes toggle button + GtkToggleToolButton* m_electrodesToggleButton = nullptr; + //! Electrodes toggle state + bool m_electrodesToggledOn = true; + + bool m_needResize = true; + + size_t m_gridSize = 0, m_cellSize = 0; + + CMatrix m_sampleCoordinatesMatrix; + + std::vector m_sampleValues; + std::vector> m_sample2DCoordinates; //in skull coords + + size_t m_minPaletteBarHeight = 10, m_maxPaletteBarHeight = 30; + size_t m_headWindowWidth = 00, m_headWindowHeight = 00; + size_t m_paletteWindowWidth = 00, m_paletteWindowHeight = 00; + + size_t m_skullX = 0, m_skullY = 0, m_skullDiameter = 0; + //angles relative to 3 o'clock position, CCW, in degrees + float m_skullOutlineStartAngle = 0.0, m_skullOutlineEndAngle = 0.0; + float m_skullFillStartAngle = 0.0, m_skullFillEndAngle = 0.0; + + //determined from m_skullOutlineEndAngle + size_t m_skullOutlineLeftPointX = 0, m_skullOutlineLeftPointY = 0; + //determined from m_skullOutlineStartAngle + size_t m_skullOutlineRightPointX = 0, m_skullOutlineRightPointY = 0; + + //determined from m_skullFillEndAngle + size_t m_skullFillLeftPointX = 0, m_skullFillLeftPointY = 0; + //determined from m_skullFillStartAngle + size_t m_skullFillRightPointX = 0, m_skullFillRightPointY = 0; + + size_t m_skullFillBottomPointX = 0, m_skullFillBottomPointY = 0; + + ///////////////////////////// + // TOP VIEW + ///////////////////////////// + size_t m_noseY = 0; + + ///////////////////////////// + // BOTTOM VIEW + ///////////////////////////// + size_t m_leftNeckX = 0, m_leftNeckY = 0; + size_t m_rightNeckX = 0, m_rightNeckY = 0; + + ////////////////////////////////// + // LEFT/RIGHT VIEWS + ////////////////////////////////// + /* + + A + / + / + / + + B + | C + +----+ D + | + + E + */ + size_t m_noseTopX = 0, m_noseTopY = 0; //A + size_t m_noseBumpX = 0, m_noseBumpY = 0; //B + size_t m_noseTipX = 0, m_noseTipY = 0; //C + size_t m_noseBaseX = 0, m_noseBaseY = 0; //D + size_t m_noseBottomX = 0, m_noseBottomY = 0; //E + + /** + * \brief Main pixmap + * \remarks This pixmap is 32-bit aligned. Each row is m_rowStride wide, and the pixmap has the height of the DrawingArea's + * window. It is pasted into the DrawingArea's window upon redraw + */ + //TODO + //GdkPixmap* m_pixmap; + + /** + * \brief Skull pixmap + * \remarks This pixmap is 32-bit aligned. Each row is m_rowStride wide, and the pixmap has m_skullDiameter rows. + * It is pasted into the main pixmap everytime changes happen (window resizing, display options toggled on/off, etc) + */ + std::vector m_skullRGBBuffer; + size_t m_rowStride = 0; +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCTopographicMapDatabase.cpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCTopographicMapDatabase.cpp new file mode 100644 index 0000000..b31e8ba --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCTopographicMapDatabase.cpp @@ -0,0 +1,283 @@ +#include "ovpCTopographicMapDatabase.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +CTopographicMapDatabase::CTopographicMapDatabase(Toolkit::TBoxAlgorithm& plugin, Kernel::IAlgorithmProxy& interpolation) + : CBufferDatabase(plugin), m_interpolation(interpolation) +{ + //map input parameters + //-------------------- + + //spline order + m_interpolation.getInputParameter(OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_SplineOrder)->setReferenceTarget(&m_splineOrder); + //number of channels (or electrodes) + m_interpolation.getInputParameter(OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsCount)->setReferenceTarget(&m_NElectrodes); + //matrix of pointers to electrode coordinates + m_pElectrodeCoords = &m_electrodeCoords; + m_interpolation.getInputParameter(OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsCoordinates)->setReferenceTarget( + &m_pElectrodeCoords); + //matrix of potentials measured at each electrode + m_pElectrodePotentials = &m_electrodePotentials; + m_interpolation.getInputParameter(OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsValues)->setReferenceTarget( + &m_pElectrodePotentials); + //matrix holding sample coordinates mapped at runtime (its size is not known a priori and may vary) + // + + //map output parameters + //--------------------- + m_minSamplePointValue.initialize(m_interpolation.getOutputParameter(OVP_Algorithm_SphericalSplineInterpolation_OutputParameterId_MinSamplePointValue)); + m_maxSamplePointValue.initialize(m_interpolation.getOutputParameter(OVP_Algorithm_SphericalSplineInterpolation_OutputParameterId_MaxSamplePointValue)); +} + +void CTopographicMapDatabase::setMatrixDimensionSize(const size_t index, const size_t size) +{ + CBufferDatabase::setMatrixDimensionSize(index, size); + + if (index == 0) { m_electrodePotentials.resize(size_t(m_NElectrodes)); } +} + +bool CTopographicMapDatabase::onChannelLocalisationBufferReceived(const size_t bufferIndex) +{ + CBufferDatabase::onChannelLocalisationBufferReceived(bufferIndex); + + if (!m_ChannelLookupTableInitialized || m_channelLocalisationCoords.empty() || m_NElectrodes == 0) + { + m_ParentPlugin.getLogManager() << Kernel::LogLevel_Warning + << "Channel localisation buffer received before channel lookup table was initialized! Can't process buffer!\n"; + } + + //static electrode coordinates + if (!m_dynamicChannelLocalisation) + { + //if streamed coordinates are cartesian + if (m_cartesianCoords) + { + //fill electrode coordinates matrix + m_electrodeCoords.resize(size_t(3 * m_NElectrodes)); + const double* coords = m_channelLocalisationCoords[0].first->getBuffer(); + for (size_t i = 0; i < size_t(m_NElectrodes); ++i) + { + const size_t lookupIdx = m_ChannelLookupIndices[i]; + m_electrodeCoords[3 * i] = *(coords + 3 * lookupIdx); + m_electrodeCoords[3 * i + 1] = *(coords + 3 * lookupIdx + 1); + m_electrodeCoords[3 * i + 2] = *(coords + 3 * lookupIdx + 2); + } + + //electrode coordinates initialized : it is now possible to interpolate potentials + m_electrodeCoordsInitialized = true; + } + } + + return true; +} + +void CTopographicMapDatabase::getLastBufferInterpolatedMinMaxValue(double& min, double& max) const +{ + min = m_minSamplePointValue; + max = m_maxSamplePointValue; +} + +bool CTopographicMapDatabase::processValues() +{ + //wait for electrode coordinates + if (!m_electrodeCoordsInitialized) { return true; } + + if (m_firstProcess) + { + //done in CBufferDatabase::setMatrixBuffer + //initialize the drawable object + //m_Drawable->init(); + + if (!checkElectrodeCoordinates()) { return false; } + + //precompute sin/cos tables + m_interpolation.activateInputTrigger(OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_PrecomputeTables, true); + + m_firstProcess = false; + } + + //retrieve electrode values + //determine what buffer to use from delay + size_t bufferIdx = 0; + const uint64_t currentTime = m_ParentPlugin.getPlayerContext().getCurrentTime(); + const uint64_t displayTime = currentTime - m_delay; + getBufferIndexFromTime(displayTime, bufferIdx); + + //determine what sample to use + size_t sampleIdx; + if (displayTime <= m_StartTime[bufferIdx]) { sampleIdx = 0; } + else if (displayTime >= m_EndTime[bufferIdx]) { sampleIdx = m_DimSizes[1] - 1; } + else { sampleIdx = size_t(double(displayTime - m_StartTime[bufferIdx]) / double(m_BufferDuration) * m_DimSizes[1]); } + + for (int64_t i = 0; i < m_NElectrodes; ++i) { *(m_electrodePotentials.getBuffer() + i) = m_SampleBuffers[bufferIdx][i * m_DimSizes[1] + sampleIdx]; } + + //interpolate spline values (potentials) + if (m_interpolationType == EInterpolationType::Spline) + { + m_interpolation.activateInputTrigger(OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_ComputeSplineCoefs, true); + } + else //interpolate spline laplacian (currents) + { + m_interpolation.activateInputTrigger(OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_ComputeLaplacianCoefs, true); + } + + //retrieve up-to-date pointer to sample matrix + m_samplePointCoords = dynamic_cast(m_Drawable)->getSampleCoordinatesMatrix(); + + if (m_samplePointCoords != nullptr) + { + //map pointer to input parameter + m_interpolation.getInputParameter(OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_SamplePointsCoordinates)-> + setReferenceTarget(&m_samplePointCoords); + + if (m_interpolationType == EInterpolationType::Spline) + { + m_interpolation.activateInputTrigger(OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_InterpolateSpline, true); + } + else { m_interpolation.activateInputTrigger(OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_InterpolateLaplacian, true); } + } + + m_interpolation.process(); + bool process = true; + if (m_interpolation.isOutputTriggerActive(OVP_Algorithm_SphericalSplineInterpolation_OutputTriggerId_Error)) + { + m_ParentPlugin.getLogManager() << Kernel::LogLevel_Warning << "An error occurred while interpolating potentials!\n"; + process = false; + } + else + { + if (m_samplePointCoords != nullptr) + { + //retrieve interpolation results + Kernel::TParameterHandler sampleValuesMatrix; + sampleValuesMatrix.initialize( + m_interpolation.getOutputParameter(OVP_Algorithm_SphericalSplineInterpolation_OutputParameterId_SamplePointsValues)); + dynamic_cast(m_Drawable)->setSampleValuesMatrix(sampleValuesMatrix); + + //tells the drawable to redraw itself since the signal information has been updated + m_Drawable->redraw(); + } + } + + return process; +} + +bool CTopographicMapDatabase::setDelay(const double delay) +{ + if (delay > m_TotalDuration) { return false; } + + //convert delay to 32:32 format + m_delay = int64_t(delay * (1LL << 32)); // $$$ Casted in (int64_t) because of Ubuntu 7.10 crash ! + return true; +} + +bool CTopographicMapDatabase::interpolateValues() +{ + //can't interpolate before first buffer has been received + if (m_firstProcess) { return false; } + + //retrieve up-to-date pointer to sample matrix + m_samplePointCoords = dynamic_cast(m_Drawable)->getSampleCoordinatesMatrix(); + + if (m_samplePointCoords != nullptr) + { + //map pointer to input parameter + m_interpolation.getInputParameter(OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_SamplePointsCoordinates)-> + setReferenceTarget(&m_samplePointCoords); + + //interpolate using spline or laplacian coefficients depending on interpolation mode + if (m_interpolationType == EInterpolationType::Spline) + { + m_interpolation.activateInputTrigger(OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_InterpolateSpline, true); + } + else { m_interpolation.activateInputTrigger(OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_InterpolateLaplacian, true); } + } + + m_interpolation.process(); + + if (m_interpolation.isOutputTriggerActive(OVP_Algorithm_SphericalSplineInterpolation_OutputTriggerId_Error)) + { + m_ParentPlugin.getLogManager() << Kernel::LogLevel_Warning << "An error occurred while interpolating potentials!\n"; + } + else + { + if (m_samplePointCoords != nullptr) + { + //retrieve interpolation results + Kernel::TParameterHandler sampleValuesMatrix; + sampleValuesMatrix.initialize(m_interpolation.getOutputParameter(OVP_Algorithm_SphericalSplineInterpolation_OutputParameterId_SamplePointsValues)); + dynamic_cast(m_Drawable)->setSampleValuesMatrix(sampleValuesMatrix); + } + } + + return true; +} + +bool CTopographicMapDatabase::getBufferIndexFromTime(const uint64_t time, size_t& bufferIndex) +{ + if (m_SampleBuffers.empty()) { return false; } + + if (time < m_StartTime[0]) + { + bufferIndex = 0; + return false; + } + if (time > m_EndTime.back()) + { + bufferIndex = size_t(m_SampleBuffers.size() - 1); + return false; + } + for (size_t i = 0; i < m_SampleBuffers.size(); ++i) + { + if (time <= m_EndTime[i]) + { + bufferIndex = i; + break; + } + } + + return true; +} + +bool CTopographicMapDatabase::checkElectrodeCoordinates() +{ + const size_t nChannel = getChannelCount(); + + for (size_t i = 0; i < nChannel; ++i) + { + double* normalizedChannelCoords = nullptr; + if (!getChannelPosition(i, normalizedChannelCoords)) + { + CString channelLabel; + getChannelLabel(i, channelLabel); + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error + << "Couldn't retrieve coordinates of electrode #" << i + << "(" << channelLabel << "), aborting model frame electrode coordinates computation\n"; + return false; + } + +#define MY_THRESHOLD 0.01 + if (fabs(normalizedChannelCoords[0] * normalizedChannelCoords[0] + + normalizedChannelCoords[1] * normalizedChannelCoords[1] + + normalizedChannelCoords[2] * normalizedChannelCoords[2] - 1.) > MY_THRESHOLD) +#undef MY_THRESHOLD + { + CString channelLabel; + getChannelLabel(i, channelLabel); + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error + << "Coordinates of electrode #" << i << "(" << channelLabel + << "), are not normalized, aborting model frame electrode coordinates computation\n"; + return false; + } + } + + return true; +} + +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCTopographicMapDatabase.h b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCTopographicMapDatabase.h new file mode 100644 index 0000000..da0dbf7 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/box-algorithms/topographicMap2DDisplay/ovpCTopographicMapDatabase.h @@ -0,0 +1,106 @@ +#pragma once + +#include "../../ovp_defines.h" + +#include "ovpCBufferDatabase.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +class CTopographicMapDrawable : public CSignalDisplayDrawable +{ +public: + ~CTopographicMapDrawable() override = default; + virtual CMatrix* getSampleCoordinatesMatrix() = 0; + virtual bool setSampleValuesMatrix(CMatrix* pSampleValuesMatrix) = 0; +}; + +/** +* This class is used to store information about the incoming signal stream. It can request a CSignalDisplayDrawable +* object to redraw himself in case of some changes in its data. +*/ +class CTopographicMapDatabase : public CBufferDatabase +{ +public: + CTopographicMapDatabase(Toolkit::TBoxAlgorithm& plugin, Kernel::IAlgorithmProxy& interpolation); + ~CTopographicMapDatabase() override = default; + + void setMatrixDimensionSize(const size_t index, const size_t size) override; + + /** + * \brief Callback called upon channel localisation buffer reception + * \param bufferIndex Index of newly received channel localisation buffer + * \return True if buffer data was correctly processed, false otherwise + */ + bool onChannelLocalisationBufferReceived(const size_t bufferIndex) override; + + bool setDelay(double delay); + + /** + * \brief Set interpolation type + * Spline values (potentials) can be interpolated directly, but the spline laplacian (currents) may + * be used as well + * \sa OVP_TypeId_SphericalLinearInterpolationType enumeration + */ + void setInterpolationType(const EInterpolationType type) { m_interpolationType = type; } + + bool processValues(); + + bool interpolateValues(); + + //! Returns min/max interpolated values using the last buffer arrived (all channels taken into account) + void getLastBufferInterpolatedMinMaxValue(double& min, double& max) const; + +private: + /** + * \brief Looks for buffer whose timeframe contains time passed as parameter + * \param time [in] Time of buffer to be retrieved + * \param bufferIndex [out] Index of buffer closest to time passed as parameter + * \return True if time passed as parameter lies within a buffer's timeframe, false otherwise + */ + bool getBufferIndexFromTime(uint64_t time, size_t& bufferIndex); + + /** + * \brief Ensure electrode coordinates are normalized + * \return True if all electrode coordinates are normalized, false otherwise + */ + bool checkElectrodeCoordinates(); + + //true until process() is called for the first time + bool m_firstProcess = true; + //spherical spline interpolation + Kernel::IAlgorithmProxy& m_interpolation; + //order of spherical spline used for interpolation - mapped to OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_SplineOrder + int64_t m_splineOrder = 4; + /** + * \brief Type of interpolation + * \sa OVP_TypeId_SphericalLinearInterpolationType enumeration + */ + EInterpolationType m_interpolationType = EInterpolationType::Spline; + //number of electrodes (see CBufferDatabase) - mapped to OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsCount + //int64_t m_NElectrodes = 0; + //flag set to true once electrode coordinates have been initialized + bool m_electrodeCoordsInitialized = false; + //electrode cartesian coordinates, in normalized space (X right Y front Z up) + CMatrix m_electrodeCoords; + //pointer to electrode coordinates matrix - mapped to OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsCoordinates + CMatrix* m_pElectrodeCoords = nullptr; + //electrode potentials + CMatrix m_electrodePotentials; + //pointer to electrode potentials matrix - mapped to OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsValues + CMatrix* m_pElectrodePotentials = nullptr; + //pointer to sample points coordinates matrix - mapped to OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_SamplePointsCoordinates + CMatrix* m_samplePointCoords = nullptr; + //minimum interpolated value + Kernel::TParameterHandler m_minSamplePointValue; + //maximum interpolated value + Kernel::TParameterHandler m_maxSamplePointValue; + //delay to apply to interpolated values + uint64_t m_delay = 0; +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/ovp_defines.h b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/ovp_defines.h new file mode 100644 index 0000000..a57f5ec --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/ovp_defines.h @@ -0,0 +1,70 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_LevelMeasure OpenViBE::CIdentifier(0x657138E4, 0x46D6586F) +#define OVP_ClassId_BoxAlgorithm_LevelMeasureDesc OpenViBE::CIdentifier(0x4D061428, 0x11B02233) +#define OVP_ClassId_Algorithm_LevelMeasure OpenViBE::CIdentifier(0x63C71764, 0x34A9717F) +#define OVP_ClassId_Algorithm_LevelMeasureDesc OpenViBE::CIdentifier(0x3EB6754F, 0x22FB1722) +#define OVP_ClassId_Algorithm_SphericalSplineInterpolation OpenViBE::CIdentifier(0x4F112803, 0x661D4029) +#define OVP_ClassId_Algorithm_SphericalSplineInterpolationDesc OpenViBE::CIdentifier(0x00D67A20, 0x3D3D4729) +#define OVP_ClassId_SignalDisplay OpenViBE::CIdentifier(0x0055BE5F, 0x087BDD12) +#define OVP_ClassId_SignalDisplayDesc OpenViBE::CIdentifier(0x00C4F2D5, 0x58810276) +#define OVP_ClassId_GrazVisualization OpenViBE::CIdentifier(0x00DD290D, 0x5F142820) +#define OVP_ClassId_GrazVisualizationDesc OpenViBE::CIdentifier(0x00F1955D, 0x38813A6A) +#define OVP_ClassId_PowerSpectrumDisplay OpenViBE::CIdentifier(0x004C0EA4, 0x713EC6D9) +#define OVP_ClassId_PowerSpectrumDisplayDesc OpenViBE::CIdentifier(0x00116B40, 0x69E1B00D) +#define OVP_ClassId_TopographicMap2DDisplay OpenViBE::CIdentifier(0x0B104632, 0x451C265F) +#define OVP_ClassId_TopographicMap2DDisplayDesc OpenViBE::CIdentifier(0x7154037A, 0x4BC52A9F) +#define OVP_ClassId_Simple3DDisplay OpenViBE::CIdentifier(0x31A00483, 0x35924E6B) +#define OVP_ClassId_Simple3DDisplayDesc OpenViBE::CIdentifier(0x443E145F, 0x77205DA0) +#define OVP_ClassId_TopographicMap3DDisplay OpenViBE::CIdentifier(0x36F95BE4, 0x0EF06290) +#define OVP_ClassId_TopographicMap3DDisplayDesc OpenViBE::CIdentifier(0x6AD52C48, 0x6E1C1746) +#define OVP_ClassId_VoxelDisplay OpenViBE::CIdentifier(0x76E42EA2, 0x66FB5265) +#define OVP_ClassId_VoxelDisplayDesc OpenViBE::CIdentifier(0x79321659, 0x642D3D0C) +#define OVP_ClassId_TimeFrequencyMapDisplay OpenViBE::CIdentifier(0x3AE63330, 0x76532117) +#define OVP_ClassId_TimeFrequencyMapDisplayDesc OpenViBE::CIdentifier(0x1BAE74F3, 0x20FB7C89) +#define OVP_ClassId_BoxAlgorithm_P300IdentifierCardVisualisation OpenViBE::CIdentifier(0x3AF7FF20, 0xA68745DB) +#define OVP_ClassId_BoxAlgorithm_P300IdentifierCardVisualisationDesc OpenViBE::CIdentifier(0x84F146EF, 0x4AA712A4) +#define OVP_ClassId_BoxAlgorithm_MatrixDisplay OpenViBE::CIdentifier(0x54F0796D, 0x3EDE2CC0) +#define OVP_ClassId_BoxAlgorithm_MatrixDisplayDesc OpenViBE::CIdentifier(0x63AB4BA7, 0x022C1524) + + +// Type definitions +//--------------------------------------------------------------------------------------------------- +#define OVP_TypeId_SphericalLinearInterpolationType OpenViBE::CIdentifier(0x44B76D9E, 0x618229BC) +#define OVP_TypeId_SignalDisplayMode OpenViBE::CIdentifier(0x5DE046A6, 0x086340AA) + +enum class EInterpolationType { Spline = 1, Laplacian = 2 }; + +enum class ESignalDisplayMode { Scroll, Scan }; + +enum class EDisplayMode { ZoomIn, ZoomOut, GlobalBestFit }; + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#define OVP_Algorithm_LevelMeasure_InputParameterId_Matrix OpenViBE::CIdentifier(0x59430053, 0x67C23A83) +#define OVP_Algorithm_LevelMeasure_OutputParameterId_MainWidget OpenViBE::CIdentifier(0x101C4641, 0x466C71E3) +#define OVP_Algorithm_LevelMeasure_OutputParameterId_ToolbarWidget OpenViBE::CIdentifier(0x14905FFC, 0x6FE425B2) +#define OVP_Algorithm_LevelMeasure_InputTriggerId_Reset OpenViBE::CIdentifier(0x3EAF36C5, 0x74490C56) +#define OVP_Algorithm_LevelMeasure_InputTriggerId_Refresh OpenViBE::CIdentifier(0x71356FE4, 0x3E8F62DC) +#define OVP_Algorithm_LevelMeasure_OutputTriggerId_Refreshed OpenViBE::CIdentifier(0x3C3C1B06, 0x360305D9) + +#define OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_SplineOrder OpenViBE::CIdentifier(0x3B8200F6, 0x205162C7) +#define OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsCount OpenViBE::CIdentifier(0x2ABF11FC, 0x174A2CFE) +#define OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsCoordinates OpenViBE::CIdentifier(0x36F743FE, 0x37897AB9) +#define OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsValues OpenViBE::CIdentifier(0x4EA55599, 0x670274A7) +#define OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_SamplePointsCoordinates OpenViBE::CIdentifier(0x280A531D, 0x339C18AA) +#define OVP_Algorithm_SphericalSplineInterpolation_OutputParameterId_SamplePointsValues OpenViBE::CIdentifier(0x12D0319C, 0x51ED4D8B) +#define OVP_Algorithm_SphericalSplineInterpolation_OutputParameterId_MinSamplePointValue OpenViBE::CIdentifier(0x0CEE2041, 0x79455EED) +#define OVP_Algorithm_SphericalSplineInterpolation_OutputParameterId_MaxSamplePointValue OpenViBE::CIdentifier(0x1ECB03E3, 0x40EF757F) +#define OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_PrecomputeTables OpenViBE::CIdentifier(0x42A650DA, 0x62B35F76) +#define OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_ComputeSplineCoefs OpenViBE::CIdentifier(0x5B353712, 0x069F3D3B) +#define OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_ComputeLaplacianCoefs OpenViBE::CIdentifier(0x7D8C545E, 0x7C086660) +#define OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_InterpolateSpline OpenViBE::CIdentifier(0x1241610E, 0x03CB1AD9) +#define OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_InterpolateLaplacian OpenViBE::CIdentifier(0x11CE0AC3, 0x0FD85469) +#define OVP_Algorithm_SphericalSplineInterpolation_OutputTriggerId_Error OpenViBE::CIdentifier(0x08CB0679, 0x3A6F3C3A) diff --git a/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/ovp_main.cpp b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/ovp_main.cpp new file mode 100644 index 0000000..e7cc8ee --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/plugins/visualization/simple-visualization/src/ovp_main.cpp @@ -0,0 +1,20 @@ +#include "ovp_defines.h" + +#include "algorithms/ovpCAlgorithmSphericalSplineInterpolation.h" + +#include "box-algorithms/ovpCBoxAlgorithmTopographicMap2DDisplay.h" +#include "box-algorithms/ovpCBoxAlgorithmMatrixDisplay.h" + +OVP_Declare_Begin() + context.getTypeManager().registerEnumerationType(OVP_TypeId_SphericalLinearInterpolationType, "Spherical linear interpolation type"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SphericalLinearInterpolationType, "Spline (potentials)", size_t(EInterpolationType::Spline)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SphericalLinearInterpolationType, "Spline laplacian (currents)", + size_t(EInterpolationType::Laplacian)); + + OVP_Declare_New(OpenViBE::Plugins::Test::CAlgorithmSphericalSplineInterpolationDesc) + + OVP_Declare_New(OpenViBE::Plugins::SimpleVisualization::CBoxAlgorithmTopographicMap2DDisplayDesc) + OVP_Declare_New(OpenViBE::Plugins::SimpleVisualization::CBoxAlgorithmMatrixDisplayDesc) + + +OVP_Declare_End() diff --git a/Masterarbeit/openvibe/designer-master/scripts/dependencies-sdk-ubuntu-14.04.txt b/Masterarbeit/openvibe/designer-master/scripts/dependencies-sdk-ubuntu-14.04.txt new file mode 100644 index 0000000..ca1e31a --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/dependencies-sdk-ubuntu-14.04.txt @@ -0,0 +1,2 @@ +build/linux/OpenViBE-Release-2.0.0.112-Ubuntu14.04.zip;openvibe-sdk-release;2.0.0.112 +build/linux/OpenViBE-Debug-2.0.0.112-Ubuntu14.04.zip;openvibe-sdk-debug;2.0.0.112 diff --git a/Masterarbeit/openvibe/designer-master/scripts/dependencies-sdk-ubuntu-16.04.txt b/Masterarbeit/openvibe/designer-master/scripts/dependencies-sdk-ubuntu-16.04.txt new file mode 100644 index 0000000..fd1524f --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/dependencies-sdk-ubuntu-16.04.txt @@ -0,0 +1,2 @@ +build/linux/OpenViBE-Release-2.0.0.112-Ubuntu16.04.zip;openvibe-sdk-release;2.0.0.112 +build/linux/OpenViBE-Debug-2.0.0.112-Ubuntu16.04.zip;openvibe-sdk-debug;2.0.0.112 diff --git a/Masterarbeit/openvibe/designer-master/scripts/icons/designer.ico b/Masterarbeit/openvibe/designer-master/scripts/icons/designer.ico new file mode 100644 index 0000000..dde314e Binary files /dev/null and b/Masterarbeit/openvibe/designer-master/scripts/icons/designer.ico differ diff --git a/Masterarbeit/openvibe/designer-master/scripts/linux-dep-helpers/README b/Masterarbeit/openvibe/designer-master/scripts/linux-dep-helpers/README new file mode 100644 index 0000000..defa367 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/linux-dep-helpers/README @@ -0,0 +1,5 @@ + +You can drop perl scripts here to install dependencies. See +the corresponding folder in sdk. + + diff --git a/Masterarbeit/openvibe/designer-master/scripts/linux-dependencies-fedora.txt b/Masterarbeit/openvibe/designer-master/scripts/linux-dependencies-fedora.txt new file mode 100644 index 0000000..75aca43 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/linux-dependencies-fedora.txt @@ -0,0 +1,2 @@ +gtk2-devel +libglade2-devel diff --git a/Masterarbeit/openvibe/designer-master/scripts/linux-dependencies-ubuntu1404.txt b/Masterarbeit/openvibe/designer-master/scripts/linux-dependencies-ubuntu1404.txt new file mode 100755 index 0000000..d0666cb --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/linux-dependencies-ubuntu1404.txt @@ -0,0 +1,2 @@ +libgtk2.0-dev +libglade2-dev diff --git a/Masterarbeit/openvibe/designer-master/scripts/linux-dependencies-ubuntu16_plus.txt b/Masterarbeit/openvibe/designer-master/scripts/linux-dependencies-ubuntu16_plus.txt new file mode 100755 index 0000000..d0666cb --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/linux-dependencies-ubuntu16_plus.txt @@ -0,0 +1,2 @@ +libgtk2.0-dev +libglade2-dev diff --git a/Masterarbeit/openvibe/designer-master/scripts/unix-build b/Masterarbeit/openvibe/designer-master/scripts/unix-build new file mode 100755 index 0000000..6d90346 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/unix-build @@ -0,0 +1,193 @@ +#!/bin/bash + +# This is the build script to configure and build OpenViBE on +# unix-based platform. + +# Functions definition + +function usage() +{ + echo "usage: ./unix-build [options]" + echo "" + echo "-h | --help : usage" + echo "-v | --verbose : verbose output at building step" + echo "--build-type= : build type" + echo "--build-dir= : build directory" + echo "--install-dir= : binaries deployment directory" + echo "--test-data-dir= : test data directory" + echo "--make-package : a package will be created in build directory" + echo "--hide-error-location : do not display complete error locations" + echo "--sdk= : path to the Openvibe SDK" + echo "--oem-distribution= : distribution name, can be openvibe or mensia" + echo "--userdata-subdir= name of the userdata sub directory" +} + +# Script starting point + +# As options are not mandatory, set some default values for each target +# variables +ov_script_dir="${PWD}" +ov_build_type=Release +ov_test_data_dir="${ov_script_dir}/../dependencies/test-data" +ov_oem_distribution="openvibe" +verbose="OFF" +package_option="FALSE" +display_error_location="ON" + +# Parse arguments +for i in "$@" +do + case $i in + -h | --help) + usage + exit + ;; + -v | --verbose) + verbose="ON" + shift + ;; + --build-type=*) + ov_build_type="${i#*=}" + shift + ;; + --build-dir=*) + ov_build_dir="${i#*=}" + shift + ;; + --install-dir=*) + ov_install_dir="${i#*=}" + shift + ;; + --make-package) + package_option="TRUE" + display_error_location="OFF" + shift + ;; + --hide-error-location) + display_error_location="OFF" + ;; + --test-data-dir=*) + ov_test_data_dir="${i#*=}" + shift + ;; + --sdk=*) + ov_sdk_dir="${i#*=}" + shift + ;; + --oem-distribution=*) + ov_oem_distribution="${i#*=}" + shift + ;; + --userdata-subdir=*) + UserDataSubdir="-DOV_CONFIG_SUBDIR=${i#*=}" + shift + ;; + *) + echo "ERROR: Unknown parameter $i" + exit 1 + ;; + esac +done + +# Check parameters validity +if [[ ${ov_build_type} != "Debug" ]] \ + && [[ ${ov_build_type} != "Release" ]] \ + && [[ ${ov_build_type} != "RelWithDebInfo" ]] +then + echo "ERROR: ${ov_build_type} not handled as build type" + exit 1 +fi + +if [[ ${ov_build_type} == "Debug" ]]; then + sdk_affix="debug" +elif [[ ${ov_build_type} == "Release" ]] || [[ ${ov_build_type} == "RelWithDebInfo" ]]; then + sdk_affix="release" +fi +if [[ ! -v ov_sdk_dir ]]; then + ov_sdk_dir="${ov_script_dir}/../dependencies/openvibe-sdk-${sdk_affix}" +fi +if [[ ! -v ov_build_dir ]]; then + ov_build_dir="${ov_script_dir}/../../openvibe-designer-build/build-${ov_build_type}" +fi +if [[ ! -v ov_install_dir ]]; then + ov_install_dir="${ov_script_dir}/../../openvibe-designer-build/dist-${ov_build_type}" +fi + +echo "**************************************" +echo "Build with parameters:" +echo "[build-type] = ${ov_build_type}" +echo "[build-dir] = ${ov_build_dir}" +echo "[install-dir] = ${ov_install_dir}" +echo "[test-data-dir] = ${ov_test_data_dir}" +echo "[sdk] = ${ov_sdk_dir}" +echo "[oem-distribution] = ${ov_oem_distribution}" +echo "[display-error-location] = ${display_error_location}" +echo "**************************************" +echo "" +echo "" + +# Special configuration for MacOS +uname_string=$(uname) + +if [[ "$uname_string" == 'Darwin' ]]; then + export PKG_CONFIG_PATH="/opt/X11/lib/pkgconfig:$PKG_CONFIG_PATH" +fi + +# Create necessary directories +mkdir -p "${ov_build_dir}" &> /dev/null + +# Change directory to build directory as cmake has to be run from build +# directory +pushd "${ov_build_dir}" &> /dev/null + +echo "Generating build system files with cmake..." + +cmake ${ov_script_dir}/.. \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=${ov_build_type} \ + -DCMAKE_INSTALL_PREFIX=${ov_install_dir} \ + -DOV_PACKAGE=${package_option} \ + -DOV_DISPLAY_ERROR_LOCATION=${display_error_location} \ + -DOVT_TEST_DATA_DIR=${ov_test_data_dir} \ + -DFlag_VerboseOutput=${verbose} \ + -DOPENVIBE_SDK_PATH=${ov_sdk_dir} \ + -DOEM_DISTRIBUTION=${ov_oem_distribution} \ + ${UserDataSubdir} + + + +if [[ $? == 0 ]]; then + echo "Generation succeeded!" +else + echo "ERROR: Generation failed" + exit 1 +fi + +echo "Building project..." + +if [[ $verbose == "ON" ]]; then + ninja -v install +else + ninja install +fi + +if [[ $? == 0 ]]; then + echo "Build succeeded!" +else + echo "ERROR: Build failed" + exit 1 +fi + +if [[ ${package_option} == "TRUE" ]]; then + cmake --build . --target package + if [[ $? == 0 ]]; then + echo "Package succeeded!" + else + echo "ERROR: Package failed" + exit 1 + fi +fi + +popd &> /dev/null + +exit diff --git a/Masterarbeit/openvibe/designer-master/scripts/unix-get-dependencies.sh b/Masterarbeit/openvibe/designer-master/scripts/unix-get-dependencies.sh new file mode 100755 index 0000000..9d94f9f --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/unix-get-dependencies.sh @@ -0,0 +1,106 @@ +#! /bin/bash +## Get needed dependencies from cache or remote server and unzip into +## dest folder. +# + +DEPENDENCIES="./tests-data.txt" +CACHE_DIR="../dependencies/arch" +if [ ! -z $DEPENDENCY_CACHE ]; then + CACHE_DIR=$DEPENDENCY_CACHE +fi +OUTPUT_DIR="../dependencies" + +function usage () { + cat <] + echo [--build-dir ^] build directory + echo [--install-dir ^] binaries deployment directory + echo [--oem-distribution ^] + echo [--userdata-subdir ^] name of the userdata sub directory + echo [--vsproject] Create visual studio project (.sln) + echo [--vsbuild] Create visual studio project (.sln) and compiles it + echo [--platform-target ^] Create a 32 or 64 bit. 32bit is the default + echo -- Build Type option can be : --release (-r) or --debug (-d). Default is Release. + exit /b + +:parameter_parse +if /i "%1"=="-h" ( + goto print_help +) else if /i "%1"=="--help" ( + goto print_help +) else if /i "%1"=="--no-pause" ( + set PauseCommand=echo "" + SHIFT + Goto parameter_parse +) else if /i "%1"=="-d" ( + set BuildType=Debug + SHIFT + Goto parameter_parse +) else if /i "%1"=="--debug" ( + set BuildType=Debug + SHIFT + Goto parameter_parse +) else if /i "%1"=="-r" ( + set BuildType=Release + SHIFT + Goto parameter_parse +) else if /i "%1"=="--release" ( + set BuildType=Release + SHIFT + Goto parameter_parse +) else if /i "%1"=="--make-package" ( + set PackageOption=TRUE + set DisplayErrorLocation=OFF + SHIFT + Goto parameter_parse +) else if /i "%1" == "--hide-error-location" ( + set DisplayErrorLocation=OFF + SHIFT + Goto parameter_parse +) else if /i "%1"=="-f" ( + set RefreshCMake=T + SHIFT + Goto parameter_parse +) else if /i "%1"=="--force" ( + set RefreshCMake=T + SHIFT + Goto parameter_parse +) else if /i "%1"=="-v" ( + set VerboseOutput=ON + SHIFT + Goto parameter_parse +) else if /i "%%1"=="--verbose" ( + set VerboseOutput=ON + SHIFT + Goto parameter_parse +) else if /i "%1"=="--sdk" ( + set PathSDK=%2 + set sdk_dir=-DOPENVIBE_SDK_PATH=%2% + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--dependencies-dir" ( + set dependencies_dir=-DLIST_DEPENDENCIES_PATH=%2 + set initialize_env_args=%2 + set initialize_env_args=!initialize_env_args:;= ! + set initialize_env_args=--dependencies-dir !initialize_env_args:"=! + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--oem-distribution" ( + set OEMDistribution=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1" == "--userdata-subdir" ( + set UserDataSubdir="-DOV_CONFIG_SUBDIR=%2" + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--build-dir" ( + set build_dir=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--install-dir" ( + set install_dir=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--vsproject" ( + set vsgenerate=TRUE + set builder=None + SHIFT + Goto parameter_parse +) else if /i "%1"=="--vsbuild" ( + set vsgenerate=TRUE + set builder=Visual + SHIFT + Goto parameter_parse +) else if /i "%1"=="--platform-target" ( + set PlatformTarget=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if not "%1" == "" ( + echo unrecognized option [%1] + Goto terminate_error +) + +if defined vsgenerate ( + echo Build type is set to: MultiType. +) else ( + echo Build type is set to: %BuildType%. +) + +setlocal + +call "windows-initialize-environment.cmd" --platform-target %PlatformTarget% %initialize_env_args% +if defined vsgenerate ( + if /i "%PlatformTarget%" == "x64" ( + set generator=-G"%VSCMake% Win64" -T "v120" + ) else ( + set generator=-G"%VSCMake%" -T "v120" + ) + if not defined build_dir ( + set build_dir=%root_dir%\..\openvibe-designer-build\vs-project-%PlatformTarget% + ) + if not defined install_dir ( + set install_dir=%root_dir%\..\openvibe-designer-build\dist-%BuildType%-%PlatformTarget% + ) +) else ( + set build_type="-DCMAKE_BUILD_TYPE=%BuildType%" + if not defined build_dir ( + set build_dir=%root_dir%\..\openvibe-designer-build\build-%BuildType%-%PlatformTarget% + ) + if not defined install_dir ( + set install_dir=%root_dir%\..\openvibe-designer-build\dist-%BuildType%-%PlatformTarget% + ) +) + +mkdir %build_dir% 2>NUL +pushd %build_dir% + +if defined PathSDK ( + echo SDK is located at %PathSDK% +) else ( + echo "Using default for SDK path (check CMake for inferred value)" +) + +set CallCmake=false +if not exist "%build_dir%\CMakeCache.txt" set CallCmake="true" +if %RefreshCMake%==T set CallCmake="true" +if %CallCmake%=="true" ( + cmake %root_dir%\ %generator% ^ + %build_type% ^ + -DCMAKE_INSTALL_PREFIX=%install_dir% ^ + !sdk_dir! ^ + -DOV_DISPLAY_ERROR_LOCATION=%DisplayErrorLocation% ^ + -DOEM_DISTRIBUTION=%OEMDistribution% ^ + %UserDataSubdir% ^ + -DOV_PACKAGE=%PackageOption% ^ + -DFlag_VerboseOutput=%VerboseOutput% ^ + %dependencies_dir% +) +if not "!ERRORLEVEL!" == "0" goto terminate_error + +if !builder! == None ( + goto terminate_success +) else if !builder! == Ninja ( + ninja install + if not "!ERRORLEVEL!" == "0" goto terminate_error +) else if !builder! == Visual ( + if %PlatformTarget% == x86 ( + set msplatform=Win32 + ) else ( + set msplatform=%PlatformTarget% + ) + msbuild Designer.sln /verbosity:normal /p:Configuration=%BuildType% /p:Platform="!msplatform!" + + if not "!ERRORLEVEL!" == "0" goto terminate_error + + cmake --build . --config %BuildType% --target install + if not "!ERRORLEVEL!" == "0" goto terminate_error +) + +if %PackageOption% == TRUE ( + cmake --build . --target package + if not "!ERRORLEVEL!" == "0" goto terminate_error +) + +goto terminate_success + +:terminate_error + +echo An error occured during building process ! + +%PauseCommand% + +goto terminate + +:terminate_success + +%PauseCommand% + +goto terminate + +:terminate + +popd + +endlocal + diff --git a/Masterarbeit/openvibe/designer-master/scripts/windows-dependencies-sdk-x64.txt b/Masterarbeit/openvibe/designer-master/scripts/windows-dependencies-sdk-x64.txt new file mode 100644 index 0000000..654ad80 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/windows-dependencies-sdk-x64.txt @@ -0,0 +1,4 @@ +build/windows/boost_1.58_x64_vc120_dev.zip;boost;1.58 +build/windows/eigen-3.2.0.zip;eigen;3.2.0 +build/windows/OpenViBE-Release-2.0.0.118-win64.zip;openvibe-sdk-release;2.0.0.118 +build/windows/OpenViBE-Debug-2.0.0.118-win64.zip;openvibe-sdk-debug;2.0.0.118 diff --git a/Masterarbeit/openvibe/designer-master/scripts/windows-dependencies-sdk.txt b/Masterarbeit/openvibe/designer-master/scripts/windows-dependencies-sdk.txt new file mode 100644 index 0000000..9b08136 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/windows-dependencies-sdk.txt @@ -0,0 +1,4 @@ +build/windows/boost_1.58_x86_vc120_dev.zip;boost;1.58 +build/windows/eigen-3.2.0.zip;eigen;3.2.0 +build/windows/OpenViBE-Release-2.0.0.118-win32.zip;openvibe-sdk-release;2.0.0.118 +build/windows/OpenViBE-Debug-2.0.0.118-win32.zip;openvibe-sdk-debug;2.0.0.118 diff --git a/Masterarbeit/openvibe/designer-master/scripts/windows-dependencies-x64.txt b/Masterarbeit/openvibe/designer-master/scripts/windows-dependencies-x64.txt new file mode 100644 index 0000000..e6c1436 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/windows-dependencies-x64.txt @@ -0,0 +1,2 @@ +build/windows/gtk_2.24.31_x64_vc120_dev.zip;gtk;2.24.31 +build/windows/gtk_2.24.31_x64_vc120_runtime.zip;gtk;2.24.31 diff --git a/Masterarbeit/openvibe/designer-master/scripts/windows-dependencies.txt b/Masterarbeit/openvibe/designer-master/scripts/windows-dependencies.txt new file mode 100644 index 0000000..c11a893 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/windows-dependencies.txt @@ -0,0 +1,2 @@ +build/windows/gtk-2.22.1-dev.zip;gtk;2.22.1 +build/windows/gtk-2.22.1-runtime.zip;gtk;2.22.1 diff --git a/Masterarbeit/openvibe/designer-master/scripts/windows-generate-vs-project.cmd b/Masterarbeit/openvibe/designer-master/scripts/windows-generate-vs-project.cmd new file mode 100644 index 0000000..3b4f18f --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/windows-generate-vs-project.cmd @@ -0,0 +1,3 @@ +@echo off + +call "windows-build.cmd" --vsproject %* diff --git a/Masterarbeit/openvibe/designer-master/scripts/windows-get-dependencies.ps1 b/Masterarbeit/openvibe/designer-master/scripts/windows-get-dependencies.ps1 new file mode 100644 index 0000000..435a187 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/windows-get-dependencies.ps1 @@ -0,0 +1,268 @@ +<# +.SYNOPSIS + This script aims at installing dependencies from a manifest file. +.DESCRIPTION + Script workflow is as follows: + - Check for a cache directory + - Parse input dependencies manifest + - Download dependencies if: (Currently does not download!) + * cache found but dependency not found in the cache + * cache not found (old archives are overwritten) + - Extract dependencies in destination folder (old dependencies are overwritten) if: + * dependencies were never unzipped + * the version of unzipped dependency is correct (read from manifest version file) + - write manifest version file, named after the manifest file name and suffixed with "-version", + it contains the version of lastly unzipped dependencies such as: + folder_to_unzip=version_number + +.PARAMETER dependencies_file + The manifest file containing the required archives to install. + + First line is the base URL of the dependencies, following lines are formatted as: + archive_name;folder_to_unzip;version_number + archive_name;folder_to_unzip;version_number + ... + + The `folder_to_unzip` can be the same for several dependencies, but in this case you have to make sure + that the archives share the same `version_number`. + If this is not the case an error will be thrown. + +.PARAMETER dest_dir + Optional: if unspecified then by default it will be set to $script_root\..\dependencies + Destination directory for extracted archives. Each archive found in the manifest file + is extracted in 'dest_dir\folder_to_unzip'. + + Note that if no cache is found, archives are also downloaded in 'dest_dir\arch'. +.PARAMETER cache_dir + Cache directory for extracted archives. Each archive found in the manifest file + is extracted from cache_dir to 'dest_dir\folder_to_unzip'. + +.NOTES + File Name : windows-get-dependencies.ps1 + Prerequisite : Tested with PS v4.0 on windows 10 pro. + + Environment variables will be used if set: + * PROXYPASS: Used to set credentials, should be formed as user:passwd + * ZIP_EXECUTABLE: should be set to the path to 7zip executable. If unset, script will try to read registry keys. +.LINK + Detailed specifications: + https://jira.mensiatech.com/confluence/pages/viewpage.action?spaceKey=CT&title=Dependency+management +.EXAMPLE + powershell.exe -NoExit -NoProfile -ExecutionPolicy Bypass -File \absolute\path\to\windows-get-dependencies.ps1 -manifest_file .\windows-dependencies.txt +.EXAMPLE + powershell.exe -NoExit -NoProfile -ExecutionPolicy Bypass -File \absolute\path\to\windows-get-dependencies.ps1 -manifest_file .\windows-dependencies.txt + -dest_dir \absolute\path\to\dep\ -cache_dir \absolute\path\to\cache +#> + +# +# script parameters +# +Param( +[parameter(Mandatory=$true)][ValidateScript({Test-Path $_ })][string]$manifest_file, +[parameter(Mandatory=$false)][string]$cache_dir, +[parameter(Mandatory=$false)][ValidateNotNullOrEmpty()][string]$dest_dir = ".\..\dependencies" +) + +$manifest_file = [System.IO.Path]::GetFullPath($manifest_file) +$dest_dir = [System.IO.Path]::GetFullPath($dest_dir) + +# +# input validation +# +Write-Host "===Input validation===" +if (Test-Path $dest_dir){ + Write-Host "Destination directory found" +} else { + Write-Host "Destination directory not found" + New-Item $dest_dir -itemtype directory | Out-Null + Write-Host "Created destination directory: " $dest_dir +} + +# if -cache_dir is specified, use its value, otherwise check if an environment variable exists +if($cache_dir) { + Write-Host "Cache directory provided by parameter: $cache_dir" +} elseif ($env:DEPENDENCY_CACHE -and (Test-Path $env:DEPENDENCY_CACHE)) { + Write-Host "Found cache directory: " ($env:DEPENDENCY_CACHE) + $cache_dir = $env:DEPENDENCY_CACHE +} else { + $cache_dir = $dest_dir + "\arch" + Write-Host "Found no cache directory. Set it to default value: $cache_dir" +} +if(-Not (Test-Path $cache_dir)) { + New-Item $cache_dir -itemtype directory | Out-Null + Write-Host "Created archive directory in destination: " $cache_dir +} +Write-Host "All archives will be downloaded in " $cache_dir +Write-Host "" + +Write-Host "Configure Web client" + +# Base URL of dependency server is read in environment variable +$Script:dependency_server = $env:URL + +$WebClient = New-Object System.Net.WebClient +if($env:PROXYPASS){ + $Username, $Password = $env:PROXYPASS.split(':',2) + Write-Host "Credentials are provided. Try to download from server with username [$Username]." + $WebClient.Credentials = New-Object System.Net.Networkcredential($Username, $Password) +} else { + Write-Host "Credentials were not provided. If your dependencies are not up-to-date, you won't be able to download new files." +} +Write-Host "" + +if ($env:ZIP_EXECUTABLE) { + $Script:7zip_executable=$env:ZIP_EXECUTABLE +} else { + Try { + $Script:7zip_executable=(Get-ItemProperty HKLM:\Software\7-Zip).Path + "\7z.exe" + } Catch { + Write-Host "7-Zip was not found in register keys. Install it will fasten unzip." + } +} +if ($Script:7zip_executable -and (Test-Path $Script:7zip_executable)) { + Write-Host "Found 7-Zip in registry keys. It will be used to unzip archives." +} else { + Write-Host "7-Zip was not found in register keys. Install it will quicken the unzipping." + $Script:7zip_executable="" +} + +Write-Host "===Parameters===" +Write-Host "Dependencies file = $manifest_file" +Write-Host "Destination directory = $dest_dir" +Write-Host "" + +# +# script variables +# + +# monitoring variables +$Script:extract_count = 0 +$Script:download_count = 0 +$Script:new_versions = @{} + +# +# script functions +# + +function ExpandZipFile($zip, $dest) +{ + Write-Host "Extract: [" $zip "] -> [" $dest "]" + $shell = New-Object -ComObject Shell.Application + + if ([string]::IsNullOrEmpty($Script:7zip_executable)){ + # create dest if it does not exists + if(-Not (Test-Path $dest)) { + New-Item $dest -itemtype directory | Out-Null + } + + $folder = $shell.NameSpace("$zip") + + # Progress based on count is pretty dumb. However + # the sizes retrieved by $folder.GetDetailsOf($item, 2) + # or $item.Size are unreliable. At least, it allows the script + # user to see something is going on. + $count = 0 + $total_count = $folder.Items().Count + ForEach($item in $folder.Items()) { + + $item_name = $folder.GetDetailsOf($item, 0) + $percent_complete = [System.Math]::Floor(100 * $count / $total_count) + Write-Progress ` + -Status "Progress: $percent_complete%" ` + -Activity ("Extracting " + (Split-Path -Leaf $zip) + " to " + (Split-Path -Leaf $dest)) ` + -CurrentOperation "Copying $item_name (this can take a long time...)" ` + -PercentComplete $percent_complete + + # 0x14 = sum of options 4 (donnot display windows box) and 16 (answer yes to all) + $shell.Namespace("$dest").CopyHere($item, 0x14) + + $count++ + } + } else { + $7z_Arguments = @( + 'x' ## extract files with full paths + '-y' ## assume Yes on all queries + $zip ## archive path + "`"-o$dest`"" ## dest path + + ) + & $7zip_executable $7z_Arguments + } + $Script:extract_count++ + +} + +function InstallDeps($arch, $dir, $version) +{ + $zip = $Script:cache_dir + "\" + $arch + + if(-Not (Test-Path $zip)) { + if($Username -and $Script:dependency_server){ + $url = $Script:dependency_server + "/" + $arch + } else { + Write-Error "- Credentials or $Script:dependency_server are not specified, can not download dependency. " + Write-Error "- They have to be set through environment variables: PROXYPASS and URL." + exit + } + + Write-Host "Download: [" $url "] -> [" $zip "]." + $Script:WebClient.DownloadFile( $url, $zip ) + $Script:download_count++ + } + if(-Not (Test-Path $zip)) { + Write-Error "Archive [$zip] was not found in cache and could not be downloaded." + exit + } + + if(Test-Path $dest_dir\$dir-version.txt) { + $old_dep_version=$(Get-Content $dest_dir\$dir-version.txt) + } + if((Test-Path ($Script:dest_dir + "\" + $dir)) -and ($old_dep_version -eq $version)) { + Write-Host "No need to unzip dependency. Already at the good version: " $old_dep_version "." + } else { + Write-Host "Dependency version is not the good one: [" $old_dep_version "]. Should be " $version + if((Test-Path ($Script:dest_dir + "\" + $dir)) -and (-Not $Script:new_versions.ContainsKey($dir))) { + Remove-item ($Script:dest_dir + "\" + $dir) -Force -Recurse + } + ExpandZipFile $zip ($Script:dest_dir + "\" + $dir) + } + # Add new version to table + if($Script:new_versions.ContainsKey($dir)) { + # If (during this install process) an archive was already extracted to this folder and its version is + # not the same as new version, we raise an error + if($Script:new_versions[$dir] -ne $version) { + Write-Error "- Several dependencies are extracted in the same folder with different versions. + You have to make sure that they carry the same version." + exit + } + } else { + $Script:new_versions.Add($dir, $version) + } +} + +# +# core script +# + +Write-Host "" +Write-Host "===Installing dependencies===" + +$Script:timer = [System.Diagnostics.Stopwatch]::StartNew() +foreach ($dep in Get-Content $manifest_file) { + $arch, $dir, $version = $dep.split(';',3) + InstallDeps $arch $dir $version +} +$timer.Stop() + +Write-Host "Write token version files, to quicken next dependencies " +foreach ($new_version in $Script:new_versions.GetEnumerator()) { + $new_version.Value > $dest_dir\$($new_version.Key)-version.txt +} + +Write-Host "" +Write-Host "===Install Summary===" +Write-Host "State = Success" +Write-Host "Number of archives downloaded = $Script:download_count" +Write-Host "Number of archives extracted = $Script:extract_count" +Write-Host "Installation time = " $([string]::Format("{0:d2}h:{1:d2}mn:{2:d2}s", $timer.Elapsed.hours, $timer.Elapsed.minutes, $timer.Elapsed.seconds)) -nonewline +Write-Host "" diff --git a/Masterarbeit/openvibe/designer-master/scripts/windows-initialize-environment.cmd b/Masterarbeit/openvibe/designer-master/scripts/windows-initialize-environment.cmd new file mode 100644 index 0000000..3fdfce8 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/windows-initialize-environment.cmd @@ -0,0 +1,131 @@ +@echo off +REM setlocal EnableDelayedExpansion +REM setlocal enableextensions + +set PATH=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin;%PATH% +set "SCRIPT_PATH=%~dp0" + +:parameter_parse + + if /i "%1" == "--dependencies-dir" ( + set "PATH_DEPENDENCIES=%2" + SHIFT + SHIFT + Goto parameter_parse + ) else if /i "%1" == "--platform-target" ( + if "%2"=="x64" ( + set PLATFORM=x64 + set VSPLATFORMGENERATOR=Win64 + ) else if "%2"=="x86" ( + set PLATFORM=x86 + set VSPLATFORMGENERATOR= + ) else ( + echo Unknown platform %2 target + Goto terminate + ) + SHIFT + SHIFT + + Goto parameter_parse +) else if not "%1" == "" ( + echo unrecognized option [%1] + Goto terminate_error +) + +if not defined PATH_DEPENDENCIES ( + if %PLATFORM%==x64 ( + SET "PATH_DEPENDENCIES=%SCRIPT_PATH%../dependencies_x64" + ) else ( + SET "PATH_DEPENDENCIES=%SCRIPT_PATH%../dependencies" + ) + + set "PATH=!PATH_DEPENDENCIES!/cmake/bin;!PATH!" + set "PATH=!PATH_DEPENDENCIES!/ninja;!PATH!" + set "PATH=!PATH_DEPENDENCIES!/gtk/bin;!PATH!" +) else ( + for %%A in (%PATH_DEPENDENCIES%) DO ( + if exist "%%A\cmake\bin\" ( + set "PATH=%%A\cmake\bin;!PATH!" + ) + + if exist "%%A\gtk\bin\" ( + set "PATH=%%A\gtk\bin;!PATH!" + ) + + if exist "%%A\ninja\" ( + set "PATH=%%A\ninja;!PATH!" + ) + ) +) + +REM ######################################################################################################################## + +REM # Set to 1 to skip new compilers. +if not defined SKIP_VS2017 ( + SET SKIP_VS2017=1 +) +if not defined SKIP_VS2015 ( + SET SKIP_VS2015=1 +) +if not defined SKIP_VS2013 ( + SET SKIP_VS2013=0 +) + +SET VSTOOLS= +SET VSCMake= +set VCVARSALLPATH=../../VC/vcvarsall.bat + +if %SKIP_VS2017% == 0 ( + set "VSTOOLS=%VS150COMNTOOLS%" + set VSCMake=Visual Studio 15 2017 +) else if %SKIP_VS2015% == 0 ( + echo Visual Studio 2017 detection skipped as requested + set "VSTOOLS=%VS140COMNTOOLS%" + set VSCMake=Visual Studio 14 2015 +) else ( + echo Visual Studio 2017 detection skipped as requested + echo Visual Studio 2015 detection skipped as requested + set "VSTOOLS=%VS120COMNTOOLS%" + set VSCMake=Visual Studio 12 2013 +) + + +if exist "!VSTOOLS!%VCVARSALLPATH%" ( + if %PLATFORM% == x64 ( + if exist "!VSTOOLS!../../VC/bin/x64" ( + echo Found %VSCMake% tools: !VSTOOLS!%VCVARSALLPATH% %PLATFORM% + call "!VSTOOLS!%VCVARSALLPATH%" %PLATFORM% + ) else ( + echo Found %VSCMake% tools: !VSTOOLS!%VCVARSALLPATH% x86_amd64 + call "!VSTOOLS!%VCVARSALLPATH%" x86_amd64 + ) + ) else ( + echo Found %VSCMake% tools: !VSTOOLS!vsvars32.bat + call "!VSTOOLS!vsvars32.bat" + ) + goto terminate +) + +set VSCMake=!VSCMake! %VSPLATFORMGENERATOR% + +goto terminate_success + +:terminate_error + +echo ###################################################################################### +echo ## ## +echo ## ERROR : Microsoft Visual Studio Common tools initialisation script not found ## +echo ## ## +echo ###################################################################################### +echo An error occured during environment initializing ! + +pause +exit 1 + +REM ####################################################################################### +:terminate_success + +goto terminate + +REM ####################################################################################### +:terminate diff --git a/Masterarbeit/openvibe/designer-master/scripts/windows-install-dependencies-x64.cmd b/Masterarbeit/openvibe/designer-master/scripts/windows-install-dependencies-x64.cmd new file mode 100644 index 0000000..4b7ad14 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/windows-install-dependencies-x64.cmd @@ -0,0 +1,24 @@ +REM Install Designer dependencies +REM This script can be copied, renamed as `windows-install-dependencies-custom.cmd` +REM and updated with the right credentials in PROXYPASS, such as username:password +REM +@echo off + +echo Install all dependencies + +REM In order to download dependencies, PROXYPASS must be changed with appropriate credentials +REM set PROXYPASS=XXX:XXX +set URL=https://extranet.mensiatech.com/dependencies + +if not exist "..\dependencies\arch\build\windows" ( mkdir "..\dependencies\arch\build\windows" ) +if not exist "..\dependencies_x64\arch\build\windows" ( mkdir "..\dependencies_x64\arch\build\windows" ) + +REM Install build tools, CMake, Ninja, comment line if you already have an instance of CMake installed +powershell.exe -NoProfile -ExecutionPolicy Bypass -file "windows-get-dependencies.ps1" -manifest_file .\windows-build-tools.txt + +REM Install OV SDK and its dependencies - x64 +powershell.exe -NoProfile -ExecutionPolicy Bypass -file "windows-get-dependencies.ps1" -manifest_file .\windows-dependencies-sdk-x64.txt -dest_dir .\..\dependencies_x64 +REM Install Designer dependencies - x64 +powershell.exe -NoProfile -ExecutionPolicy Bypass -file "windows-get-dependencies.ps1" -manifest_file .\windows-dependencies-x64.txt -dest_dir .\..\dependencies_x64 + +pause diff --git a/Masterarbeit/openvibe/designer-master/scripts/windows-install-dependencies.cmd b/Masterarbeit/openvibe/designer-master/scripts/windows-install-dependencies.cmd new file mode 100644 index 0000000..6e419b2 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/windows-install-dependencies.cmd @@ -0,0 +1,23 @@ +REM Install Designer dependencies +REM This script can be copied, renamed as `windows-install-dependencies-custom.cmd` +REM and updated with the right credentials in PROXYPASS, such as username:password +REM +@echo off + +echo Install all dependencies + +REM In order to download dependencies, PROXYPASS must be changed with appropriate credentials +REM set PROXYPASS=XXX:XXX +set URL=https://extranet.mensiatech.com/dependencies + +if not exist "..\dependencies\arch\build\windows" ( mkdir "..\dependencies\arch\build\windows" ) + +REM Install build tools specifically needed by Designer project +REM powershell.exe -NoProfile -ExecutionPolicy Bypass -file "windows-get-dependencies.ps1" -manifest_file .\windows-build-tools.txt + +REM Install OV SDK and its dependencies +powershell.exe -NoProfile -ExecutionPolicy Bypass -file "windows-get-dependencies.ps1" -manifest_file .\windows-dependencies-sdk.txt +REM Install Designer dependencies +powershell.exe -NoProfile -ExecutionPolicy Bypass -file "windows-get-dependencies.ps1" -manifest_file .\windows-dependencies.txt + +pause diff --git a/Masterarbeit/openvibe/designer-master/scripts/windows-launch-visual-studio-debug.cmd b/Masterarbeit/openvibe/designer-master/scripts/windows-launch-visual-studio-debug.cmd new file mode 100644 index 0000000..cd09f81 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/windows-launch-visual-studio-debug.cmd @@ -0,0 +1,3 @@ +@echo off + +call windows-launch-visual-studio.cmd --debug %* diff --git a/Masterarbeit/openvibe/designer-master/scripts/windows-launch-visual-studio.cmd b/Masterarbeit/openvibe/designer-master/scripts/windows-launch-visual-studio.cmd new file mode 100644 index 0000000..49c7523 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/windows-launch-visual-studio.cmd @@ -0,0 +1,69 @@ +@echo off +setlocal EnableDelayedExpansion +setlocal enableextensions + +set script_dir=%CD% + +set PathSDK="%script_dir%\..\dependencies\openvibe-sdk-release" +set VerboseOuptut=OFF +set PlatformTarget=x86 +set PATH_DEPENDENCIES= + +set BuildType=Release + +goto parameter_parse + +:print_help + echo Usage: windows-launch-visual-studio.cmd [--debug] [--sdk ^] [--dependencies-dir ^] + exit /b + +:parameter_parse +if /i "%1" == "--dependencies-dir" ( + set "PATH_DEPENDENCIES=%2" + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--debug" ( + set BuildType=Debug + set PathSDK="%script_dir%\..\dependencies\openvibe-sdk-debug" + SHIFT +) else if /i "%1"=="--sdk" ( + set PathSDK=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1" == "--platform-target" ( + if "%2"=="x64" ( + set PlatformTarget=%2 + SHIFT + SHIFT + + Goto parameter_parse + ) +) + + +call "windows-initialize-environment.cmd" --platform-target %PlatformTarget% + +SET "OV_PATH_ROOT=%CD%\..\..\openvibe-designer-build\dist\%BuildType%-%PlatformTarget%" +SET "PATH=%OV_PATH_ROOT%\bin;%PATH%" + +REM for visual studio express... +if not defined USE_EXPRESS ( + SET USE_EXPRESS=1 +) + +set SolutionPath=%CD%\..\..\openvibe-designer-build\vs-project-%PlatformTarget%\Designer.sln + +if %USE_EXPRESS% == 1 ( + echo Use %VSCMake% Express Edition + + if "%VSCMake%"=="Visual Studio 12" ( + start /b "%VSINSTALLDIR%\Common7\IDE\WDExpress.exe" %SolutionPath% + ) else ( + "%VSINSTALLDIR%\Common7\IDE\VCExpress.exe" %SolutionPath% + ) +) else ( + echo Use %VSCMake% Community Edition + "%VSINSTALLDIR%\Common7\IDE\devenv.exe" %SolutionPath% +) diff --git a/Masterarbeit/openvibe/designer-master/scripts/windows-set-studio-environment.cmd-base b/Masterarbeit/openvibe/designer-master/scripts/windows-set-studio-environment.cmd-base new file mode 100644 index 0000000..7e8f0f4 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/scripts/windows-set-studio-environment.cmd-base @@ -0,0 +1,5 @@ +set PATH=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin;%PATH% +set "SCRIPT_PATH=%~dp0" +set "PATH_DEPENDENCIES=@ABSOLUTE_PATH_DEPENDENCIES@" + +set PATH=%PATH_DEPENDENCIES%\gtk\bin;%PATH% diff --git a/Masterarbeit/openvibe/designer-master/visualization-toolkit/CMakeLists.txt b/Masterarbeit/openvibe/designer-master/visualization-toolkit/CMakeLists.txt new file mode 100644 index 0000000..d3fdfaf --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/visualization-toolkit/CMakeLists.txt @@ -0,0 +1,35 @@ +project(openvibe-visualization-toolkit) +MESSAGE(STATUS "Now building ${PROJECT_NAME} ${PROJECT_VERSION} (${OV_PROJECT_BRANCH}~${OV_PROJECT_COMMITHASH})" ) + +OV_ADD_THIS_TO_PROJECT_LIST() + +file(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp include/*.h include/*.hpp) +include("FindSourceRCProperties") + +include_directories(${openvibe-visualization-toolkit_SOURCE_DIR}/include/) +include_directories(${openvibe-visualization-toolkit_SOURCE_DIR}/include/visualization-toolkit) + +add_library(${PROJECT_NAME} SHARED ${SRC_FILES}) +set_target_properties(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + COMPILE_FLAGS "-DOVVIZ_Exports -DOVVIZ_Shared") + +include("AddOpenViBESDKComponents") +include("FindThirdPartyGTK") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +install(DIRECTORY include/ DESTINATION ${DIST_INCLUDEDIR} FILES_MATCHING PATTERN "*.h") diff --git a/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovvizColorGradient.h b/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovvizColorGradient.h new file mode 100644 index 0000000..9c73024 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovvizColorGradient.h @@ -0,0 +1,13 @@ +#pragma once + +#include "ovviz_base.h" + +namespace OpenViBE { +namespace VisualizationToolkit { +namespace ColorGradient { +OVVIZ_API bool parse(CMatrix& colorGradient, const CString& string); +OVVIZ_API bool format(CString& string, const CMatrix& colorGradient); +OVVIZ_API bool interpolate(CMatrix& interpolatedColorGradient, const CMatrix& colorGradient, size_t steps); +} // namespace ColorGradient +} // namespace VisualizationToolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovvizIVisualizationContext.h b/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovvizIVisualizationContext.h new file mode 100644 index 0000000..5c7ce81 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovvizIVisualizationContext.h @@ -0,0 +1,45 @@ +#pragma once + +#include +#include +#include + +#include "ovvizIVisualizationManager.h" + +#define OV_ClassId_VisualizationCtx OpenViBE::CIdentifier(0xE06B92EF, 0xB6B68081) + +namespace OpenViBE { +namespace VisualizationToolkit { +class IVisualizationContext : public Plugins::IPluginObject +{ +public: + /** + * @brief Assing a visualization manager to the visualization context singleton + * @param visualizationManager The visualization manager that handles visualization widgets for the application + * @retval true In case of success. + * @retval false In case of error. + */ + virtual bool setManager(IVisualizationManager* visualizationManager) = 0; + + /** + * @brief Forward a GtkWidget which displays content to the visualization manager + * @param box The current box. + * @param widget The Gtk widget used to display the content. + * @retval true In case of success. + * @retval false In case of error. + */ + virtual bool setWidget(Toolkit::TBoxAlgorithm& box, GtkWidget* widget) = 0; + + /** + * @brief Forward a GtkWidget which displays the box toolbar to the visualization manager + * @param box The current box. + * @param toolbarWidget The Gtk widget used to display the controls of the visualization. + * @retval true In case of success. + * @retval false In case of error. + */ + virtual bool setToolbar(Toolkit::TBoxAlgorithm& box, GtkWidget* toolbarWidget) = 0; + + _IsDerivedFromClass_(Plugins::IPluginObject, OV_ClassId_VisualizationCtx) +}; +} // namespace VisualizationToolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovvizIVisualizationManager.h b/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovvizIVisualizationManager.h new file mode 100644 index 0000000..9213886 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovvizIVisualizationManager.h @@ -0,0 +1,83 @@ +#pragma once + +#include "ovvizIVisualizationTree.h" + +#include + +typedef struct _GtkWidget GtkWidget; + +namespace OpenViBE { +namespace VisualizationToolkit { +/** + * \class IVisualizationManager + * \author Vincent Delannoy (INRIA/IRISA) + * \date 2007-11 + * \brief The VisualizationManager handles IVisualizationTree objects + * It maintains a list of IVisualizationTree objects, each of which is associated to a scenario. This + * manager is used both at scenario creation time (to load or create IVisualizationTree objects), and when the + * scenario is being run (to forward IVisualizationWidget pointers to the related IVisualizationTree). + */ +class IVisualizationManager +{ +public: + virtual ~IVisualizationManager() = default; + + /** + * \brief An interface used to iteratively notify its creator of the existence of IVisualizationTree objects + */ + class IVisualizationTreeEnum + { + public: + virtual ~IVisualizationTreeEnum() = default; + /** + * \brief Callback method called iteratively as the IVisualizationManager goes through a set of IVisualizationTree objects + * \param visualizationTreeIdentifier identifier of an IVisualizationTree object + * \param visualizationTree corresponding IVisualizationTree object + * \return True if IVisualizationTree object was successfully registered, false otherwise + */ + virtual bool callback(const CIdentifier& visualizationTreeIdentifier, const IVisualizationTree& visualizationTree) = 0; + }; + + /** + * \brief Creates an IVisualizationTree object. + * \param visualizationTreeIdentifier [out] identifier of the IVisualizationTree object created by this method + * \return True if object was successfully created, false otherwise + */ + virtual bool createVisualizationTree(CIdentifier& visualizationTreeIdentifier) = 0; + /** + * \brief Releases an IVisualizationTree object. + * \param visualizationTreeIdentifier identifier of the IVisualizationTree object to be released + * \return True if object was successfully released, false otherwise + */ + virtual bool releaseVisualizationTree(const CIdentifier& visualizationTreeIdentifier) = 0; + /** + * \brief Looks for an IVisualizationTree object. + * \param visualizationTreeIdentifier identifier of the IVisualizationTree object to be returned + * \return Reference on IVisualizationTree looked for, OV_Undefined otherwise + */ + virtual IVisualizationTree& getVisualizationTree(const CIdentifier& visualizationTreeIdentifier) = 0; + + /** + * \brief Set the toolbar of a visualization plugin. + * This method is to be called by visualization plugins as they are being initialized. It lets them send + * a pointer to their toolbar (if they have one) to the scenario's IVisualizationTree. + * \param visualizationTreeIdentifier identifier of IVisualizationTree to which the toolbar pointer is to be forwarded + * \param boxID Identifier of IBox whose toolbar pointer is being set + * \param toolbar pointer to the toolbar of the widget + * \return True if pointer was successfully forwarded to IVisualizationTree, false otherwise + */ + virtual bool setToolbar(const CIdentifier& visualizationTreeIdentifier, const CIdentifier& boxID, GtkWidget* toolbar) = 0; + + /** + * \brief Set the topmost widget of a visualization plugin. + * This method is to be called by visualization plugins as they are being initialized. It lets them send + * a pointer to their topmost widget to the scenario's IVisualizationTree. + * \param visualizationTreeIdentifier identifier of IVisualizationTree to which the toolbar pointer is to be forwarded + * \param boxID Identifier of IBox whose topmost widget pointer is being set + * \param widget pointer to the main window of the widget + * \return True if pointer was successfully forwarded to IVisualizationTree, false otherwise + */ + virtual bool setWidget(const CIdentifier& visualizationTreeIdentifier, const CIdentifier& boxID, GtkWidget* widget) = 0; +}; +} // namespace VisualizationToolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovvizIVisualizationTree.h b/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovvizIVisualizationTree.h new file mode 100644 index 0000000..d2e2a3e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovvizIVisualizationTree.h @@ -0,0 +1,483 @@ +#pragma once + +#include "ovvizIVisualizationWidget.h" + +typedef struct _GtkWidget GtkWidget; +typedef struct _GtkTreeView GtkTreeView; +typedef struct _GtkTreeIter GtkTreeIter; +typedef struct _GtkTreePath GtkTreePath; + +namespace OpenViBE { +namespace VisualizationToolkit { +/** + * \brief Drag locations around a widget + */ +enum class EDragLocation { Left, Right, Top, Bottom }; + +/** + * \brief Column types in a visualization tree + */ +enum class EVisualizationTreeColumn +{ + /** + * \brief Node name + * Depending on the node type, it refers to : + * the name given to the window for EVisualizationTreeNode::VisualizationWindow nodes, + * the name of the notebook tab for EVisualizationTreeNode::VisualizationPanel nodes, + * the name of the related IBox for EVisualizationTreeNode::VisualizationBox nodes, + * "Vertical split" for EVisualizationTreeNode::VerticalSplit nodes, + * "Horizontal split" for EVisualizationTreeNode::HorizontalSplit nodes, + * "Unaffected display plugins" for the EVisualizationTreeNode::Unaffected node + */ + StringName, + /** + * \brief Icon associated to a node + * Constant except for type EVisualizationTreeNode::VisualizationBox, for which it can be specified in the plugin descriptor + */ + StringStockIcon, + ULongNodeType, ///< EVisualizationTreeNode type + StringIdentifier, ///< IVisualizationWidget identifier + PointerWidget ///< Pointer to the GtkWidget associated to the node (if any) +}; + +/** + * \brief Node types in a visualization tree + */ +enum class EVisualizationTreeNode +{ + Undefined, ///< May be used for placeholders + VPU, ///< Not used yet + VisualizationWindow, ///< A top level window + VisualizationPanel, ///< A notebook tab inside a window + VisualizationBox, ///< A visualization box (a plugin which displays something) + VerticalSplit, ///< A vertical split widget + HorizontalSplit, ///< A horizontal split widget + Unaffected ///< A special node parent to all unaffected visualization boxes +}; + +class IVisualizationTree; + +/** + * \brief Tree view interface + * It must be implemented by classes which communicate with the IVisualizationTree class in order + * to display the contents of the visualization tree. + */ +struct ITreeViewCB +{ + virtual ~ITreeViewCB() = default; + + /** + * \brief Notifies the tree view that a new widget is being created + * \param widget pointer to the newly created widget + */ + virtual void createTreeWidget(IVisualizationWidget* widget) { } + + /** + * \brief Notifies the tree view that a widget is being loaded. + * This method must return a Gtk widget that matches the description passed in parameter, or nullptr if + * it doesn't wish to support a specific kind of widget (e.g. top level windows are not instantiated by the + * offline window manager). The widget pointer returned is stored in the EVisualizationTreeColumn::PointerWidget + * column of the corresponding tree node. + * \param widget pointer to loaded visualization widget + * \return GtkWidget* pointer to Gtk widget associated to visualization widget (possibly nullptr) + */ + virtual GtkWidget* loadTreeWidget(IVisualizationWidget* widget) { return nullptr; } + + /** + * \brief Notifies the tree view that a widget hierarchy has been loaded + * This method lets the tree view perform additional loading operations at the end of the loading + * process + * \param widget pointer to visualization widget + */ + virtual void endLoadTreeWidget(IVisualizationWidget* widget) { } + + /** + * \brief Asks for the visualization (visible) widget associated to the tree widget passed in parameter + * In some cases the Gtk 'tree widget' associated to a tree node is a table comprising several widgets. + * For example, in the offline window manager, a widget is often stored in the central cell of a 3x3 table and is surrounded + * by transparent event boxes for drag n' drop purposes. + * This callback returns the central 'visualization widget' (the visible widget) contained in such a table if any, otherwise + * it returns the tree widget itself. + * \param widget pointer to the Gtk widget associated to a tree node (as stored in the EVisualizationTreeColumn::PointerWidget + * column of a tree store) + * \return pointer to the visible Gtk widget if pTreeWidget is a table, pTreeWidget itself otherwise(default) + * \sa getTreeWidget() + */ + virtual GtkWidget* getVisualizationWidget(GtkWidget* widget) { return widget; } + + /** + * \brief Asks for the tree widget associated to a visualization widget + * In some cases a Gtk widget is inserted in a 3x3 table for drag n' drop purposes. In such cases, a distinction is + * made between the 'visualization widget' (the actual visible widget) and the widget stored in the EVisualizationTreeColumn::PointerWidget + * column of a tree store. + * \param widget pointer to visualization widget + * \return parent table if any, visualizationWidget otherwise (default) + * \sa getVisualizationWidget() + */ + virtual GtkWidget* getTreeWidget(GtkWidget* widget) { return widget; } + + /** + * \brief Icon associated to a visualization tree node + * Each node has a Gtk icon. It is defined by the tree view, but can be customised for nodes of type EVisualizationTreeNode::VisualizationBox. + * This method asks the tree view what icon is to be used for a given type of node. + * \param nodeType type of node whose icon name is to be retrieved + * \return name of stock icon to be associated to the type of node passed in parameter + */ + virtual const char* getTreeWidgetIcon(EVisualizationTreeNode nodeType) { return ""; } + + /** + * \brief Set toolbar pointer of a visualization box + * Forwards pointer to the toolbar of a visualization box as the player is launched and each visualization + * box contained in the active scenario is being instantiated. + * \param boxID Identifier of IBox whose toolbar is being set + * \param toolbar pointer to toolbar of visualization box + * \return true if widget was successfully registered, false otherwise + */ + virtual bool setToolbar(const CIdentifier& boxID, GtkWidget* toolbar) { return false; } + + /** + * \brief Set topmost widget pointer of a visualization box + * Forwards pointer to the topmost widget of a visualization box as the player is launched and each visualization + * box contained in the active scenario is being instantiated. Used to position each box at the appropriate position, as defined + * using the offline window manager. + * \param boxID Identifier of IBox whose toolbar is being set + * \param widget pointer to main window of visualization box + * \return true if widget was successfully registered, false otherwise + */ + virtual bool setWidget(const CIdentifier& boxID, GtkWidget* widget) { return false; } +}; + +/** + * \class IVisualizationTree + * \author Vincent Delannoy (INRIA/IRISA) + * \date 2007-11 + * \brief Handles visualization widgets and their arrangement in space + * This interface lets applications configure visualization widgets by adding them to windows and + * tabs, positioning them next to each other using paned widgets, and resizing them as the user + * sees fit. All widgets are saved in a symbolic way as IVisualizationWidget instances referenced in a tree store. + * Methods of this class are essentially meant to be called from an external class inheriting from the ITreeViewCB + * interface, for offline design or online use of the widgets. + */ +class IVisualizationTree +{ +public: + virtual ~IVisualizationTree() = default; + /** + * \brief Initializes the visualization tree + * This method registers the scenario associated to this tree and creates a tree store. + * \param scenario scenario associated to this tree store + * \return true if tree was successfully initialized, false otherwise + */ + virtual bool init(const Kernel::IScenario* scenario) = 0; + + /** + * \name IVisualizationWidget management + */ + //@{ + + /** + * \brief Iterates through IVisualizationWidget instances managed by this tree + * Upon first call, this method should be passed an identifier initialized with CIdentifier::undefined(). + * It is modified at each subsequent call until all widgets have been returned (in which + * case the identifier is reset to OV_Undefined) + * \param id [in/out] identifier of current visualization widget when calling the method and of next widget upon return + * \return true if a widget was found, false if past beyond last one + */ + virtual bool getNextVisualizationWidgetIdentifier(CIdentifier& id) const = 0; + + /** + * \brief Iterates through IVisualizationWidget instances of type type managed by this tree + * \param id [in/out] identifier of current visualization widget when calling the method and of next widget upon return + * \param type restricts search to IVisualizationWidget instances of type type + * \return true if a widget was found, false if past beyond last one + * \sa getNextVisualizationWidgetIdentifier() + */ + virtual bool getNextVisualizationWidgetIdentifier(CIdentifier& id, EVisualizationWidget type) const = 0; + + /** + * \brief Tests whether an identifier corresponds to an IVisualizationWidget instance + * This method browses the internal tree store to look for a node whose EVisualizationTreeColumn::StringIdentifier field + * equals 'identifier' once converted to CString format. + * \param id identifier to look for in the internal tree store + * \return true if identifier corresponds to an IVisualizationWidget instance stored in this tree, false otherwise + */ + virtual bool isVisualizationWidget(const CIdentifier& id) const = 0; + + /** + * \brief Returns the IVisualizationWidget instance whose identifier is passed in parameter + * \param id identifier to look for in the internal tree store + * \return pointer to IVisualizationWidget whose identifier matches 'identifier' if any, nullptr otherwise + */ + virtual IVisualizationWidget* getVisualizationWidget(const CIdentifier& id) const = 0; + + /** + * \brief Returns the IVisualizationWidget instance whose corresponding IBox identifier matches 'boxID' + * This method inherently restricts the search to nodes of type EVisualizationTreeNode::VisualizationBox + * since only these nodes are associated to an IBox instance. + * \param boxID identifier of IBox whose associated IVisualizationWidget is to be retrieved + * \return IVisualizationWidget whose associated IBox identifier matches 'boxID' if any, nullptr otherwise + */ + virtual IVisualizationWidget* getVisualizationWidgetFromBoxIdentifier(const CIdentifier& boxID) const = 0; + + /** + * \brief Adds an IVisualizationWidget instance to the tree + * Seven parameters describe the IVisualizationWidget to be created. Not all are relevant for every type of widget. + * \param id identifier of the widget to be created + * \param name name of the widget + * \param type type of the widget + * \param parentID parent widget identifier (CIdentifier::undefined() for top-level widgets) + * \param parentIdx index where this widget is to be parented (irrelevant for top-level widgets) + * \param boxID identifier of associated IBox (for widgets of type EVisualizationWidget::Box only) + * \param nChild number of children of this widget (none for a visualization box, 1 for a visualization panel, 2 for split widgets, variable number for windows) + * \param suggestedID a suggestion as to the identifier to use + * \return true if widget successfully added to the internal tree store, false otherwise + */ + virtual bool addVisualizationWidget(CIdentifier& id, const CString& name, + EVisualizationWidget type, const CIdentifier& parentID, + size_t parentIdx, const CIdentifier& boxID, + size_t nChild, const CIdentifier& suggestedID) = 0; + + /** + * \brief Returns the index where a widget is parented + * Irrelevant for top level windows. + * \param id identifier of the IVisualizationWidget whose index is to be retrieved + * \param index [out] index where the widget is parented + * \return true if widget index could be determined, false otherwise + */ + virtual bool getVisualizationWidgetIndex(const CIdentifier& id, size_t& index) const = 0; + + /** + * \brief Unparents a widget from its parent, if any + * \param id identifier of widget to be unparented + * \param index [out] index where this widget was parented + * \return true if widget could be removed from its parent, false otherwise + */ + virtual bool unparentVisualizationWidget(const CIdentifier& id, size_t& index) = 0; + + /** + * \brief Parents a widget to a parent widget + * \param id identifier of widget to be parented + * \param parentID identifier of parent widget + * \param index index where widget is to be parented + * \return true if widget could be parented as desired, false otherwise + */ + virtual bool parentVisualizationWidget(const CIdentifier& id, const CIdentifier& parentID, const size_t index) = 0; + + /** + * \brief Destroys a widget hierarchy + * \param id identifier of widget that is to be destroyed, along with all widgets in its subtree + * \param destroy if false, widgets of type EVisualizationTreeNode::VisualizationBox are unaffected only (as opposed to destroyed) + * \return true if hierarchy was successfully destroyed, false otherwise + */ + virtual bool destroyHierarchy(const CIdentifier& id, bool destroy = true) = 0; + //@} + + /** + * \name Tree view creation/registration + */ + //@{ + + /** + * \brief Creates a tree view from the internal tree store/model + * \return pointer to newly created tree view + */ + virtual GtkTreeView* createTreeViewWithModel() = 0; + + /** + * \brief Sets the instance implementing the ITreeViewCB interface that is to be used with the visualization tree + * \param callback pointer to an implementation of the ITreeViewCB interface + * \return true if tree view was successfully registered, false otherwise + * \sa ITreeViewCB + */ + virtual bool setTreeViewCB(ITreeViewCB* callback) = 0; + //@} + + /** + * \brief Recreates Gtk widgets based on the widgets description stored in the internal tree store. + * To be called upon widget creation, deletion or repositioning. Side effects : all tree iterators + * and GtkWidget pointers are invalidated and replaced with new values. + * \return true if widgets were successfully reloaded, false otherwise + */ + virtual bool reloadTree() = 0; + + /** + * \name Helper functions + */ + //@{ + + /** + * \brief Returns currently selected node + * \param treeView pointer to tree view whose selected node is to be retrieved + * \param iter [out] pointer to selected node + * \return true if a node is selected, false otherwise + */ + virtual bool getTreeSelection(GtkTreeView* treeView, GtkTreeIter* iter) = 0; + + /** + * \brief Returns tree path of a given node + * \param iter pointer to node whose path is to be retrieved + * \return pointer to path of node + */ + virtual GtkTreePath* getTreePath(GtkTreeIter* iter) const = 0; + + /** + * \brief Returns size_t value stored in the 'colType' column of node 'iter' + * \param iter pointer to node + * \param colType index of column where size_t value is stored + * \return size_t value retrieved at the specified column of the specified node, if any, 0 otherwise. + */ + virtual size_t getULongValueFromTreeIter(GtkTreeIter* iter, EVisualizationTreeColumn colType) const = 0; + + /** + * \brief Returns string stored in the 'colType' column of node 'iter' + * \param iter pointer to node + * \param string [out] string to be retrieved + * \param colType index of column where string is stored + * \return true if string was successfully retrieved at the specified column of the specified node, 0 otherwise. + */ + virtual bool getStringValueFromTreeIter(GtkTreeIter* iter, char*& string, EVisualizationTreeColumn colType) const = 0; + + /** + * \brief Returns pointer stored in the 'colType' column of node 'iter' + * \param iter pointer to node + * \param pointer [out] pointer to be retrieved + * \param colType index of column where pointer is stored + * \return true if pointer was successfully retrieved at the specified column of the specified node, 0 otherwise. + */ + virtual bool getPointerValueFromTreeIter(GtkTreeIter* iter, void*& pointer, EVisualizationTreeColumn colType) const = 0; + + /** + * \brief Returns identifier stored in the 'colType' column of node 'iter' + * \param iter pointer to node + * \param id [out] identifier to be retrieved + * \param colType index of column where identifier is stored + * \return true if identifier was successfully retrieved at the specified column of the specified node, 0 otherwise. + */ + virtual bool getIdentifierFromTreeIter(GtkTreeIter* iter, CIdentifier& id, EVisualizationTreeColumn colType) const = 0; + //@} + + /** + * \name Node searching + */ + //@{ + + /** + * \brief Looks for a node of name 'label' and type 'type' from the root of the internal tree store + * \param iter [out] pointer to node to be retrieved + * \param label label of node to be retrieved, as stored in the EVisualizationTreeColumn::StringName column + * \param type type of node to be retrieved, as stored in the EVisualizationTreeColumn::ULongNodtype column + * \return true if node was found, false otherwise + */ + virtual bool findChildNodeFromRoot(GtkTreeIter* iter, const char* label, EVisualizationTreeNode type) = 0; + + /** + * \brief Looks for a node of name 'label' and type 'type' from a given node in the internal tree store + * \param iter [in/out] pointer to node from which to start searching when calling function and to node found upon return + * \param label label of node to be retrieved, as stored in the EVisualizationTreeColumn::StringName column + * \param type type of node to be retrieved, as stored in the EVisualizationTreeColumn::ULongNodtype column + * \return true if node was found, false otherwise + */ + virtual bool findChildNodeFromParent(GtkTreeIter* iter, const char* label, EVisualizationTreeNode type) = 0; + + /** + * \brief Looks for a node whose associated Gtk widget matches 'widget' from the root of the internal tree store + * \param iter [out] pointer to node to be retrieved + * \param widget pointer to Gtk widget of node to be retrieved, as stored in the EVisualizationTreeColumn::PointerWidget column + * \return true if node was found, false otherwise + */ + virtual bool findChildNodeFromRoot(GtkTreeIter* iter, void* widget) = 0; + + /** + * \brief Looks for a node whose associated Gtk widget matches 'widget' from a given node in the internal tree store + * \param iter [in/out] pointer to node from which to start searching when calling function and to node found upon return + * \param widget pointer to Gtk widget of node to be retrieved, as stored in the EVisualizationTreeColumn::PointerWidget column + * \return true if node was found, false otherwise + */ + virtual bool findChildNodeFromParent(GtkTreeIter* iter, void* widget) = 0; + + /** + * \brief Looks for a node whose identifier matches 'identifier' from the root of the internal tree store + * \param iter [out] pointer to node to be retrieved + * \param id identifier of node to be retrieved, as stored in the EVisualizationTreeColumn::StringIdentifier column + * \return true if node was found, false otherwise + */ + virtual bool findChildNodeFromRoot(GtkTreeIter* iter, CIdentifier id) = 0; + + /** + * \brief Looks for a node whose identifier matches 'identifier' from a given node in the internal tree store + * \param iter [in/out] pointer to node from which to start searching when calling function and to node found upon return + * \param id identifier of node to be retrieved, as stored in the EVisualizationTreeColumn::StringIdentifier column + * \return true if node was found, false otherwise + */ + virtual bool findChildNodeFromParent(GtkTreeIter* iter, CIdentifier id) = 0; + + /** + * \brief Find first parent node of a given type + * Looks for first parent node of type 'type' from a given node in the internal tree store + * \param iter [in/out] pointer to node from which to start searching when calling function and to node found upon return + * \param type type of parent node looked for, as stored in the EVisualizationTreeColumn::ULongNodtype column + * \return true if node was found, false otherwise + */ + virtual bool findParentNode(GtkTreeIter* iter, EVisualizationTreeNode type) = 0; + //@} + + /** + * \name Drag n' drop functions + */ + //@{ + + /** + * \brief Handles drop of a widget in an existing widget + * This operation replaces the existing widget with the one passed in parameter. The existing widget + * is unaffected if it is of type EVisualizationTreeNode::VisualizationBox, or destroyed if it is of + * type EVisualizationTreeNode::Undefined (placeholder widget). + * \param srcWidgetID identifier of widget being dropped + * \param dstWidget pointer to widget on which the drop operation is performed + * \return true if drop operation was successfully completed, false otherwise + */ + virtual bool dragDataReceivedInWidgetCB(const CIdentifier& srcWidgetID, GtkWidget* dstWidget) = 0; + + /** + * \brief Handles drop of a widget in an event box + * This operation adds a widget to the tree and changes the tree structure. + * If a widget is moved from one place to the other in the tree, it is automatically + * simplified to avoid placeholders creation. + * \param srcWidgetID identifier of widget being dropped + * \param dstWidget pointer to widget on which the drop operation is performed + * \param location + * \return true if drop operation was successfully completed, false otherwise + */ + virtual bool dragDataReceivedOutsideWidgetCB(const CIdentifier& srcWidgetID, GtkWidget* dstWidget, EDragLocation location) = 0; + //@} + + /** + * \brief Forward pointer to the toolbar of a visualization plugin (if any) to the tree view + * \param boxID Identifier of IBox whose toolbar pointer is being set + * \param toolbar pointer to toolbar + * \return \e true in case of success, \e false otherwise. + */ + virtual bool setToolbar(const CIdentifier& boxID, GtkWidget* toolbar) = 0; + + /** + * \brief Forward pointer to the main widget of a visualization plugin to the tree view + * \param boxID Identifier of IBox whose topmost widget pointer is being set + * \param widget pointer to main window + * \return \e true in case of success, \e false otherwise. + */ + virtual bool setWidget(const CIdentifier& boxID, GtkWidget* widget) = 0; + + /** + * \return String representation of the visualization tree + */ + virtual CString serialize() const = 0; + + /** + * \brief Initializes the visualization tree from a string representation + * \param tree The string representation of the new tree + * \retval true In case of success + * \retval false In case of error + */ + virtual bool deserialize(const CString& tree) = 0; +}; +} // namespace VisualizationToolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovvizIVisualizationWidget.h b/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovvizIVisualizationWidget.h new file mode 100644 index 0000000..f49854c --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovvizIVisualizationWidget.h @@ -0,0 +1,146 @@ +#pragma once + +#include + +namespace OpenViBE { +namespace VisualizationToolkit { +/// This enum lists the different types of IVisualizationWidget supported by the platform. +enum class EVisualizationWidget +{ + Undefined, ///< Undefined widget (empty slot in an IVisualizationTree) + Window, ///< Top-level IVisualizationWidget container + Panel, ///< Notebook tab containing IVisualizationWidget objects + Box, ///< Visualization plugin + VerticalSplit, ///< Split widget that divides its client area vertically in two + HorizontalSplit ///< Split widget that divides its client area horizontally in two +}; + +/** + * \class IVisualizationWidget + * \author Vincent Delannoy (INRIA/IRISA) + * \date 2007-11 + * \brief Interface of visualization widgets that are handled by an IVisualizationTree + * These objects are stored in an IVisualizationTree object as they are being created and modified + * to suit the graphical needs of a scenario. + */ +class IVisualizationWidget +{ +public: + virtual ~IVisualizationWidget() = default; + /** + * \brief Initializes the widget + * \param identifier identifier of the widget + * \param name name of the widget (optional) + * \param type type of the widget + * \param parentID parent widget identifier (OV_Undefined for top-level widgets) + * \param boxID if widget type is EVisualizationWidget::Box, identifier of corresponding IBox + * \param nChild number of children of this widget (none for a visualization box, 1 for a visualization panel, 2 for split widgets, variable number for windows) + * \return True if widget was successfully initialized, false otherwise + */ + virtual bool initialize(const CIdentifier& identifier, const CString& name, + const EVisualizationWidget type, const CIdentifier& parentID, + const CIdentifier& boxID, const size_t nChild) = 0; + + /** + * \brief Returns the identifier of the widget + * \return Widget identifier + */ + virtual CIdentifier getIdentifier() const = 0; + + /** + * \brief Returns the name of the widget + * \return Widget name + */ + virtual const CString& getName() const = 0; + + /** + * \brief Sets the name of the widget + * \param name name to give to the widget + */ + virtual void setName(const CString& name) = 0; + + /** + * \brief Returns the type of the widget + * \return Widget type + */ + virtual EVisualizationWidget getType() const = 0; + + /** + * \brief Returns the identifier of the widget's parent (if any) + * \return Widget's parent identifier if any, OV_Undefined otherwise + */ + virtual CIdentifier getParentIdentifier() const = 0; + /** + * \brief Sets the identifier of the widget's parent + * \param parentID identifier of the widget's parent + */ + virtual void setParentIdentifier(const CIdentifier& parentID) = 0; + + /** + * \brief Returns the identifier of the IBox associated to this widget. + * + * This only applies to widgets of type EVisualizationWidget::Box. + * \return Identifier of IBox associated to this widget + */ + virtual CIdentifier getBoxIdentifier() const = 0; + + /** + * \brief Returns the number of children of this widget + * \return Number of child widgets + */ + virtual size_t getNbChildren() const = 0; + + /** + * \brief Returns the index of a given child + * \param identifier identifier of a child widget + * \param index [out] index at which the child widget is stored + * \return True if the child was found, false otherwise + */ + virtual bool getChildIndex(const CIdentifier& identifier, size_t& index) const = 0; + + /** + * \brief Adds a child to a widget + * + * Only useful for top-level widgets (EVisualizationWidget::Window) since the number + * of tabs their notebook may contain is unknown a priori. The child is added after existing children. + * \param childIdentifier identifier of child to be added to widget + * \return True if child was successfully added + */ + virtual bool addChild(const CIdentifier& childIdentifier) = 0; + + /** + * \brief Removes a child from a widget + * \param childIdentifier identifier of child to be removed to the widget + * \return True if the child was successfully removed + */ + virtual bool removeChild(const CIdentifier& childIdentifier) = 0; + + /** + * \brief Returns the identifier of a given child + * \param childIndex index of child whose identifier is to be retrieved + * \param childIdentifier [out] identifier of child + * \return True if child identifier was successfully returned, false otherwise + */ + virtual bool getChildIdentifier(const size_t childIndex, CIdentifier& childIdentifier) const = 0; + + /** + * \brief Sets the identifier of a child + * \param childIndex index of child whose identifier is to be set + * \param childIdentifier identifier of the child to be added to the widget + * \return True if the child was successfully set + */ + virtual bool setChildIdentifier(const size_t childIndex, const CIdentifier& childIdentifier) = 0; + + + virtual void setWidth(const size_t width) = 0; + virtual void setHeight(const size_t height) = 0; + virtual size_t getWidth() = 0; + virtual size_t getHeight() = 0; + + virtual void setDividerPosition(const int dividerPosition) = 0; + virtual void setMaxDividerPosition(const int maxDividerPosition) = 0; + virtual int getDividerPosition() = 0; + virtual int getMaxDividerPosition() = 0; +}; +} // namespace VisualizationToolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovviz_all.h b/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovviz_all.h new file mode 100644 index 0000000..b46df1f --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovviz_all.h @@ -0,0 +1,29 @@ +#pragma once + +#include "ovp_global_defines.h" + +//___________________________________________________________________// +// // +// Basic includes // +//___________________________________________________________________// + +#include "ovviz_defines.h" +#include "ovviz_base.h" + +//___________________________________________________________________// +// // +// Tools // +//___________________________________________________________________// + +#include "ovvizColorGradient.h" +#include "ovvizIVisualizationContext.h" +#include "ovvizIVisualizationManager.h" +#include "ovvizIVisualizationTree.h" +#include "ovvizIVisualizationWidget.h" + +namespace OpenViBE { +namespace VisualizationToolkit { +OVVIZ_API bool initialize(const Kernel::IKernelContext& ctx); +OVVIZ_API bool uninitialize(const Kernel::IKernelContext& ctx); +} // namespace VisualizationToolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovviz_base.h b/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovviz_base.h new file mode 100644 index 0000000..0f62491 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovviz_base.h @@ -0,0 +1,5 @@ +#pragma once + +#include "ovviz_defines.h" + +#include diff --git a/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovviz_defines.h b/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovviz_defines.h new file mode 100644 index 0000000..3b0f76e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/visualization-toolkit/include/visualization-toolkit/ovviz_defines.h @@ -0,0 +1,38 @@ +#pragma once + +#define OV_TypeId_Color OpenViBE::CIdentifier(0x7F45A2A9, 0x7DB12219) +#define OV_TypeId_ColorGradient OpenViBE::CIdentifier(0x3D3C7C7F, 0xEF0E7129) + +#define OVP_ClassId_Plugin_VisualizationCtx OpenViBE::CIdentifier(0x05A7171D, 0x78E4FE3C) +#define OVVIZ_MetadataIdentifier_VisualizationTree OpenViBE::CIdentifier(0x3BCCE5D2, 0x43F2D968) + +//___________________________________________________________________// +// // +// API Definition // +//___________________________________________________________________// +// // + +// Taken from +// - http://people.redhat.com/drepper/dsohowto.pdf +// - http://www.nedprod.com/programs/gccvisibility.html +#if defined OVVIZ_Shared +#if defined TARGET_OS_Windows +#define OVVIZ_API_Export __declspec(dllexport) +#define OVVIZ_API_Import __declspec(dllimport) +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS +#define OVVIZ_API_Export __attribute__((visibility("default"))) +#define OVVIZ_API_Import __attribute__((visibility("default"))) +#else +#define OVVIZ_API_Export +#define OVVIZ_API_Import +#endif +#else +#define OVVIZ_API_Export +#define OVVIZ_API_Import +#endif + +#if defined OVVIZ_Exports +#define OVVIZ_API OVVIZ_API_Export +#else +#define OVVIZ_API OVVIZ_API_Import +#endif diff --git a/Masterarbeit/openvibe/designer-master/visualization-toolkit/src/ovvizCVisualizationContext.cpp b/Masterarbeit/openvibe/designer-master/visualization-toolkit/src/ovvizCVisualizationContext.cpp new file mode 100644 index 0000000..bd56d9e --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/visualization-toolkit/src/ovvizCVisualizationContext.cpp @@ -0,0 +1,33 @@ +#include "ovvizCVisualizationContext.hpp" + +namespace OpenViBE { +namespace VisualizationToolkit { + +bool CVisualizationContext::setWidget(Toolkit::TBoxAlgorithm& box, GtkWidget* widget) +{ + const CIdentifier boxID = box.getStaticBoxContext().getIdentifier(); + CIdentifier treeIdentifier = CIdentifier::undefined(); + + // When a scenario is created in the designer, the designer creates a visualization tree for it. The box will then need to add + // visualization widgets into this tree. The designer can not pass this information directly to a box in a way that can be read + // here (for example an Attribute could be written in the designer but then it is not possible to read it here). + // + // What we do is that we write the visualization tree identifier into the local scenario configuration manager. This manager + // can be accessed as long as we have the boxAlgorithm. + if (!treeIdentifier.fromString(box.getConfigurationManager().lookUpConfigurationTokenValue("VisualizationContext_VisualizationTreeId"))) { return false; } + + return m_VisualizationManager->setWidget(treeIdentifier, boxID, widget); +} + +bool CVisualizationContext::setToolbar(Toolkit::TBoxAlgorithm& box, GtkWidget* toolbarWidget) +{ + const CIdentifier boxID = box.getStaticBoxContext().getIdentifier(); + CIdentifier treeIdentifier = CIdentifier::undefined(); + + if (!treeIdentifier.fromString(box.getConfigurationManager().lookUpConfigurationTokenValue("VisualizationContext_VisualizationTreeId"))) { return false; } + + return m_VisualizationManager->setToolbar(treeIdentifier, boxID, toolbarWidget); +} + +} // namespace VisualizationToolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/visualization-toolkit/src/ovvizCVisualizationContext.hpp b/Masterarbeit/openvibe/designer-master/visualization-toolkit/src/ovvizCVisualizationContext.hpp new file mode 100644 index 0000000..3606ff6 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/visualization-toolkit/src/ovvizCVisualizationContext.hpp @@ -0,0 +1,93 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include "ovvizIVisualizationManager.h" +#include "ovvizIVisualizationContext.h" + +#define OVP_ClassId_Plugin_VisualizationCtx OpenViBE::CIdentifier(0x05A7171D, 0x78E4FE3C) +#define OVP_ClassId_Plugin_VisualizationCtxDesc OpenViBE::CIdentifier(0x35A11438, 0x764F72E8) + +namespace OpenViBE { +namespace VisualizationToolkit { +/** + * @brief The CVisualizationContext class is a singleton used for passing visualization related information between the application + * and visualization plugins. + */ +class CVisualizationContext final : public IVisualizationContext +{ +public: + + /** + * The release function is neutralized. The object is only allocated once in the descriptor as a unique_ptr + * and will be released at its destruction. + */ + void release() override { } + + bool setManager(IVisualizationManager* visualizationManager) override + { + m_VisualizationManager = visualizationManager; + return true; + } + + bool setWidget(Toolkit::TBoxAlgorithm& box, GtkWidget* widget) override; + + bool setToolbar(Toolkit::TBoxAlgorithm& box, GtkWidget* toolbarWidget) override; + + bool isDerivedFromClass(const CIdentifier& classIdentifier) const override + { + return ((classIdentifier == OVP_ClassId_Plugin_VisualizationCtx) || IVisualizationContext::isDerivedFromClass(classIdentifier)); + } + + CIdentifier getClassIdentifier() const override { return OVP_ClassId_Plugin_VisualizationCtx; } + + CVisualizationContext() = default; + +private: + IVisualizationManager* m_VisualizationManager = nullptr; +}; + +class CVisualizationContextDesc final : public Plugins::IPluginObjectDesc +{ +public: + + CVisualizationContextDesc() : m_visualizationCtx(new CVisualizationContext()) {} + + void release() override { } + + CString getName() const override { return CString("Visualization Context"); } + CString getAuthorName() const override { return CString("Jozef Legény"); } + CString getAuthorCompanyName() const override { return CString("Mensia Technologies"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString(""); } + CString getVersion() const override { return CString("1.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Plugin_VisualizationCtx; } + + /** + * The create function usage is different from standard plugins. As we need to be able to pass data between + * the application and the plugins, we need a permanent object that can be accessed by both. We achieve this + * by saving the object within the plugin descriptor and returning the pointer to the same object to all + * plugins. + * + * @return The singleton visualizationContext object + */ + Plugins::IPluginObject* create() override { return m_visualizationCtx.get(); } + + bool isDerivedFromClass(const CIdentifier& classIdentifier) const override + { + return ((classIdentifier == OVP_ClassId_Plugin_VisualizationCtxDesc) || IPluginObjectDesc::isDerivedFromClass(classIdentifier)); + } + + CIdentifier getClassIdentifier() const override { return OVP_ClassId_Plugin_VisualizationCtxDesc; } + +private: + std::unique_ptr m_visualizationCtx; +}; +} // namespace VisualizationToolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/visualization-toolkit/src/ovvizColorGradient.cpp b/Masterarbeit/openvibe/designer-master/visualization-toolkit/src/ovvizColorGradient.cpp new file mode 100644 index 0000000..0b30eb7 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/visualization-toolkit/src/ovvizColorGradient.cpp @@ -0,0 +1,144 @@ +#include "ovvizColorGradient.h" + +#include +#include +#include + +namespace OpenViBE { +namespace VisualizationToolkit { +namespace { +typedef struct +{ + double percent, red, green, blue; +} SColor; +} // namespace + +bool ColorGradient::parse(CMatrix& colorGradient, const CString& string) +{ + const std::string colorString(string.toASCIIString()); + size_t startPosition = 0; + + std::map colorGradientVector; + + do + { + size_t endPosition = colorString.find(OV_Value_EnumeratedStringSeparator, startPosition); + if (endPosition == std::string::npos) { endPosition = colorString.length(); } + + std::string colorSubString; + colorSubString.assign(colorString, startPosition, endPosition - startPosition); + + int p, r, g, b; + if (sscanf(colorSubString.c_str(), "%i:%i,%i,%i", &p, &r, &g, &b) == 4) + { + SColor color; + color.percent = p; + color.red = r; + color.green = g; + color.blue = b; + colorGradientVector[color.percent] = color; + } + + startPosition = endPosition + 1; + } while (startPosition < colorString.length()); + + colorGradient.resize(4, colorGradientVector.size()); + + size_t i = 0; + for (auto it = colorGradientVector.begin(); it != colorGradientVector.end(); ++it, i++) + { + colorGradient[i * 4] = it->second.percent; + colorGradient[i * 4 + 1] = it->second.red; + colorGradient[i * 4 + 2] = it->second.green; + colorGradient[i * 4 + 3] = it->second.blue; + } + + return true; +} + +bool ColorGradient::format(CString& string, const CMatrix& colorGradient) +{ + if (colorGradient.getDimensionCount() != 2) { return false; } + + if (colorGradient.getDimensionSize(0) != 4) { return false; } + + std::string separator(" "); + separator[0] = OV_Value_EnumeratedStringSeparator; + + std::string result; + for (size_t i = 0; i < colorGradient.getDimensionSize(1); ++i) + { + char buffer[1024]; + sprintf(buffer, "%.0lf:%i,%i,%i", colorGradient[i * 4], int(colorGradient[i * 4 + 1]), int(colorGradient[i * 4 + 2]), int(colorGradient[i * 4 + 3])); + result += (i == 0 ? "" : separator); + result += buffer; + } + + string = result.c_str(); + return true; +} + +bool ColorGradient::interpolate(CMatrix& interpolatedColorGradient, const CMatrix& colorGradient, const size_t steps) +{ + size_t i; + + if (colorGradient.getDimensionCount() != 2 || colorGradient.getDimensionSize(0) != 4) { return false; } + + if (steps <= 1) { return false; } + + interpolatedColorGradient.resize(4, steps); + + std::map colors; + + for (i = 0; i < colorGradient.getDimensionSize(1); ++i) + { + SColor color; + color.percent = colorGradient[i * 4]; + color.red = colorGradient[i * 4 + 1]; + color.green = colorGradient[i * 4 + 2]; + color.blue = colorGradient[i * 4 + 3]; + colors[color.percent] = color; + } + + if (colors.find(0) == colors.end()) + { + SColor color = colors.begin()->second; + color.percent = 0; + colors[0] = color; + } + + if (colors.find(100) == colors.end()) + { + SColor color = colors.rbegin()->second; + color.percent = 100; + colors[100] = color; + } + + auto it1 = colors.begin(); + auto it2 = colors.begin(); + ++it2; + + for (i = 0; i < steps; ++i) + { + const double t = double(100 * i) / (steps - 1); + while (it2->first < t) + { + ++it1; + ++it2; + } + + const double a = it2->first - t; + const double b = t - it1->first; + const double d = it2->first - it1->first; + + interpolatedColorGradient[i * 4] = t; + interpolatedColorGradient[i * 4 + 1] = (it1->second.red * a + it2->second.red * b) / d; + interpolatedColorGradient[i * 4 + 2] = (it1->second.green * a + it2->second.green * b) / d; + interpolatedColorGradient[i * 4 + 3] = (it1->second.blue * a + it2->second.blue * b) / d; + } + + return true; +} + +} // namespace VisualizationToolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/designer-master/visualization-toolkit/src/ovviz_main.cpp b/Masterarbeit/openvibe/designer-master/visualization-toolkit/src/ovviz_main.cpp new file mode 100644 index 0000000..0b0a7f1 --- /dev/null +++ b/Masterarbeit/openvibe/designer-master/visualization-toolkit/src/ovviz_main.cpp @@ -0,0 +1,25 @@ +#include "visualization-toolkit/ovviz_all.h" +#include "ovvizCVisualizationContext.hpp" + +namespace OpenViBE { + +namespace { +VisualizationToolkit::CVisualizationContextDesc visualizationContextDesc; +} // namespace + +bool VisualizationToolkit::initialize(const Kernel::IKernelContext& ctx) +{ + Kernel::ITypeManager& typeManager = ctx.getTypeManager(); + Kernel::IPluginManager& pluginManager = ctx.getPluginManager(); + + typeManager.registerType(OV_TypeId_Color, "Color"); + typeManager.registerType(OV_TypeId_ColorGradient, "Color Gradient"); + + pluginManager.registerPluginDesc(visualizationContextDesc); + + return true; +} + +bool VisualizationToolkit::uninitialize(const Kernel::IKernelContext& /*ctx*/) { return true; } + +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master.tar b/Masterarbeit/openvibe/extras-master.tar new file mode 100644 index 0000000..24699c6 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master.tar differ diff --git a/Masterarbeit/openvibe/extras-master/.gitattributes b/Masterarbeit/openvibe/extras-master/.gitattributes new file mode 100644 index 0000000..017ebd9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/.gitattributes @@ -0,0 +1,13 @@ +# Auto detect text files and perform LF normalization +* text=auto + +*.cmd text eol=crlf +*.cmd-base text eol=crlf +*.nsi text eol=crlf + +*.m text eol=lf +*.sh text eol=lf +*.sh-base text eol=lf + +scripts/linux* text eol=lf + diff --git a/Masterarbeit/openvibe/extras-master/.gitignore b/Masterarbeit/openvibe/extras-master/.gitignore new file mode 100644 index 0000000..d30fb36 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/.gitignore @@ -0,0 +1,22 @@ +# The following are automatically generated by the build or dep installer +local-tmp +dependencies +scripts/win32-dependencies.cmd +dist +build +plugins/processing/matlab/share/OV_stimulations.m +toolkit/include/toolkit/ovtk_stimulations.h +toolkit/src/ovtk_stimulations.cpp +# Editor swap files etc ... +CMakeLists.txt.* +.*.swp +*~ +*.swp +.project +.cproject +# Third party stuff +externals/*/ + +# Temp & Software Folder +.vs/ +.vscode/ \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/CMakeLists.txt new file mode 100644 index 0000000..0861dc1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/CMakeLists.txt @@ -0,0 +1,365 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 3.4) + +# Here we set a few policies to get rid of warnings on newer cmakes. +# we should update the scripts after upgrading each platform's cmake to 3.x. +cmake_policy(SET CMP0026 OLD) +cmake_policy(SET CMP0043 OLD) +cmake_policy(SET CMP0048 OLD) +cmake_policy(SET CMP0057 NEW) # IF(IN_LIST) + +PROJECT(OpenViBE) + +# These versions are used by the subprojects by default. +# If you wish to maintain specific version numbers for a subproject, please do so in the projects CMakeLists.txt +SET(OV_GLOBAL_VERSION_MAJOR 3) +SET(OV_GLOBAL_VERSION_MINOR 1) +SET(OV_GLOBAL_VERSION_PATCH 0) +SET(OV_GLOBAL_VERSION_EXTRA "") +SET(OV_GLOBAL_VERSION_STRING "${OV_GLOBAL_VERSION_MAJOR}.${OV_GLOBAL_VERSION_MINOR}.${OV_GLOBAL_VERSION_PATCH}${OV_GLOBAL_VERSION_EXTRA}") + +# Sort target into directories for better visualization in IDE +SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON) +SET(APP_FOLDER Applications) +SET(MODULES_FOLDER Modules) +SET(PLUGINS_FOLDER Plugins) +SET(TESTS_FOLDER Unit-Tests) +SET(VALIDATION_FOLDER Validation-Tests) + +SET(DOCUMENTATION_TEMP_DIRECTORY "${CMAKE_INSTALL_PREFIX}/doc-tmp") + +MESSAGE(STATUS "Appending compilation flags...") + +IF(WIN32) + IF("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + SET(OV_DEPENDENCIES_PLATFORM_FOLDER_NAME "dependencies_x64") + ELSEIF("${CMAKE_SIZEOF_VOID_P}" EQUAL "4") + SET(OV_DEPENDENCIES_PLATFORM_FOLDER_NAME "dependencies") + ELSE() + SET(OV_DEPENDENCIES_PLATFORM_FOLDER_NAME "dependencies") + ENDIF() +ELSE() + SET(OV_DEPENDENCIES_PLATFORM_FOLDER_NAME "dependencies") +ENDIF() + +# Setup knowledge of GNU-style install path variables +INCLUDE("GNUInstallDirs") + +if(NOT CMAKE_BUILD_TYPE AND CMAKE_GENERATOR MATCHES "Visual Studio*") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_INSTALL_PREFIX}/bin" ) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_INSTALL_PREFIX}/lib" ) + foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} ) + string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU ) + string(CONCAT DIST_ROOT ${DIST_ROOT} $<$:${CMAKE_INSTALL_PREFIX}/${OUTPUTCONFIG}>) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIGU} "${CMAKE_INSTALL_PREFIX}/${OUTPUTCONFIG}/bin" ) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIGU} "${CMAKE_INSTALL_PREFIX}/${OUTPUTCONFIG}/lib" ) + endforeach() + set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "OV_CMAKE_PATH_ROOT=\"${DIST_ROOT}\"") + set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "OV_CMAKE_PATH_BIN=\"${DIST_ROOT}/bin\"") + set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "OV_CMAKE_PATH_LIB=\"${DIST_ROOT}/lib\"") + set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "OV_CMAKE_PATH_DATA=\"${DIST_ROOT}/share/openvibe\"") + set(DIST_BINDIR ${DIST_ROOT}/bin) + set(DIST_LIBDIR ${DIST_ROOT}/lib) + set(DIST_INCLUDEDIR ${DIST_ROOT}/include) + set(DIST_DATADIR ${DIST_ROOT}/share) + set(DIST_DOCDIR ${DIST_ROOT}/doc) + set(DIST_DOCTMP ${DIST_ROOT}/doc-tmp) + set(DIST_SYSCONFDIR ${DIST_ROOT}/etc) +elseif(CMAKE_BUILD_TYPE AND OV_PACKAGE) + message(FATAL_ERROR "Package function not implemented (yet) !") +elseif(CMAKE_BUILD_TYPE) + # Add directories that OpenViBE will use to look for its components runtime, unless overridden by environment variables in the launch scripts. + # These defines should only be used in "openvibe/ov_directories.h". + add_definitions(-DOV_CMAKE_PATH_ROOT="${CMAKE_INSTALL_PREFIX}") + add_definitions(-DOV_CMAKE_PATH_BIN="${CMAKE_INSTALL_FULL_BINDIR}") + add_definitions(-DOV_CMAKE_PATH_LIB="${CMAKE_INSTALL_FULL_LIBDIR}") + add_definitions(-DOV_CMAKE_PATH_DATA="${CMAKE_INSTALL_FULL_DATADIR}/openvibe") + + set(DIST_ROOT ${CMAKE_INSTALL_PREFIX}) + set(DIST_BINDIR ${DIST_ROOT}/bin) + set(DIST_LIBDIR ${DIST_ROOT}/lib) + set(DIST_INCLUDEDIR ${DIST_ROOT}/include) + set(DIST_DATADIR ${DIST_ROOT}/share) + set(DIST_DOCDIR ${DIST_ROOT}/doc) + set(DIST_SYSCONFDIR ${DIST_ROOT}/etc) +else() + message(FATAL_ERROR "Build should specify a type or use a multi-type generator (like Visual Studio)") +endif() + +# Create a path usable by Unix shell scripts (used by .sh launchers) +SET(OV_PATH_DEPENCENCY_LIBS "") +FOREACH(TMP ${LIST_DEPENDENCIES_PATH}) + LIST(APPEND OV_PATH_DEPENDENCY_LIBS "${TMP}/lib") +ENDFOREACH() +string(REPLACE ";" ":" OV_PATH_PATH_DEPENDENCY_LIBS "${OV_PATH_DEPENDENCY_LIBS}") + +if(CMAKE_BUILD_TYPE) + string(TOLOWER ${CMAKE_BUILD_TYPE}"" CMAKE_BUILD_TYPE_LOWER) + find_path(SDK_MODULE_PATH NAMES AddOpenViBESDKComponents.cmake PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES openvibe-sdk-${CMAKE_BUILD_TYPE}/share NO_DEFAULT_PATH) # Find "regular builds +endif() +find_path(SDK_MODULE_PATH NAMES AddOpenViBESDKComponents.cmake PATHS ${OPENVIBE_SDK_PATH} PATH_SUFFIXES share NO_DEFAULT_PATH) # Finds multi-type builds and dev builds +LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake-modules") +if(SDK_MODULE_PATH) + LIST(APPEND CMAKE_MODULE_PATH ${SDK_MODULE_PATH}) +endif() + +SET(OV_LAUNCHER_SOURCE_PATH "${CMAKE_SOURCE_DIR}/cmake-modules/launchers") +# OpenViBE-specific helper functions that are used by the CMakeLists of the subprojects. +#INCLUDE("OvAddSingleProject") +INCLUDE("OvAddProjects") +INCLUDE("OvInstallLaunchScript") +INCLUDE("OvLinkBoostLib") +INCLUDE("OvPrint") +INCLUDE("OvMessages") +#Install early, so they can be overwritten ! +set(INSTALL_SDK 1) +set(INSTALL_DESIGNER 1) +include(FindOVSDK) +include(FindOVDesigner) +# Path to the OpenViBE SDK and designer extracted packages +include(AddOpenViBESDKComponents) + +ADD_DEFINITIONS("-DOV_PROJECT_NAME=\"${PROJECT_NAME}\"") +ADD_DEFINITIONS("-DOV_VERSION_MAJOR=\"${OV_GLOBAL_VERSION_MAJOR}\"") +ADD_DEFINITIONS("-DOV_VERSION_MINOR=\"${OV_GLOBAL_VERSION_MINOR}\"") +ADD_DEFINITIONS("-DOV_VERSION_PATCH=\"${OV_GLOBAL_VERSION_PATCH}\"") + +SET(OV_CONFIG_SUBDIR OpenVIBE CACHE STRING "Subdirectory under user directory when configuration and logs will be saved") + +ADD_DEFINITIONS("-DOV_CONFIG_SUBDIR=\"${OV_CONFIG_SUBDIR}\"") + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +IF(WIN32) + # Switch /arch:SSE2 enables vectorization. Remove if your CPU/compiler doesn't support it. + IF("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + ELSEIF("${CMAKE_SIZEOF_VOID_P}" EQUAL "4") + SET(OV_EIGEN_FLAGS "/arch:SSE2") + ENDIF() + # The following is needed to keep OpenMP from hogging all the cores. Note that this env var works only for VS2013+. + # On VS2010, it may be better to disable OpenMP. + SET(OV_OMP_WAIT_POLICY "PASSIVE") + # Disable /MP if you don't like VS using all the cores for compilation + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4355 /MP ${OV_EIGEN_FLAGS}") + ADD_DEFINITIONS("-DNOMINMAX -DBOOST_ALL_NO_LIB") + # At least Windows Vista target - if you target Windows XP (0x0501), some components may not compile + ADD_DEFINITIONS("-D_WIN32_WINNT=0x0600") + + # Find out the compiler version, deps may use this + SET(MSVC_SERVICE_PACK "unknown") + # MESSAGE(STATUS "st ${CMAKE_CXX_COMPILER_VERSION}") + IF(${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER "18.0.0") + SET(MSVC_SERVICE_PACK "vc120") + ELSEIF(${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER "17.0.0") + SET(MSVC_SERVICE_PACK "vc110") + ELSEIF(${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER "16.0.0") + SET(MSVC_SERVICE_PACK "vc100") + ENDIF() + + STRING(REGEX MATCH "vc120.*" MSVC_VER120 ${MSVC_SERVICE_PACK}) + IF(MSVC_VER120) + # Boost 1.55 asio causes several compiler warnings on VS2013 we cannot do much about. try removing the following when boost is upgraded. + ADD_DEFINITIONS("-D_WINSOCK_DEPRECATED_NO_WARNINGS") + + # If OpenMP is available, using it will allow Eigen to use multiple cores in matrix math. Only used on VS120, + # as VS100 allocates the cores too aggressively when OpenMP is enabled. + INCLUDE("FindOpenMP") + IF(OPENMP_FOUND) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") + ENDIF() + ENDIF() + MESSAGE(STATUS "MSVC version is ${MSVC_SERVICE_PACK}") + + SET(OV_WIN32_BOOST_VERSION "1_58") +ELSEIF(UNIX) + # If OpenMP is available, using it will allow Eigen to use multiple cores in matrix math. + INCLUDE("FindOpenMP") + IF(OPENMP_FOUND) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") + ENDIF() + + # Switch -msse2 enables vectorization. Remove if your CPU/compiler doesn't support it. + SET(OV_EIGEN_FLAGS "-msse2") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall ${OV_EIGEN_FLAGS}") + # This ENV var is needed to locate our custom IT++ on Linux + SET(ENV{PKG_CONFIG_PATH} "${LIST_DEPENDENCIES_PATH}/lib/pkgconfig") + + if (${CMAKE_SYSTEM_PROCESSOR} MATCHES i386|i586|i686) + set ( BIT_MODE "32") + else () + set ( BIT_MODE "64") + endif () + + if(EXISTS "/etc/debian_version") + set (PLATFORM "Debian") + ADD_DEFINITIONS("-DTARGET_OS_Linux_Debian") + endif(EXISTS "/etc/debian_version") + + if(EXISTS "/etc/fedora-release") + set (PLATFORM "Fedora") + ADD_DEFINITIONS("-DTARGET_OS_Linux_Fedora") + endif(EXISTS "/etc/fedora-release") +ELSE() + MESSAGE(WARNING "Warning: unknown platform") +ENDIF() + +# IF(NOT CMAKE_BUILD_TYPE) + # MESSAGE(STATUS "Setting default build type to Release") + # SET(CMAKE_BUILD_TYPE "Release") +# ENDIF() + +FUNCTION(SET_BUILD_PLATFORM) + IF("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + ADD_DEFINITIONS(-DTARGET_ARCHITECTURE_x64) + SET(PLATFORM_TARGET "x64" PARENT_SCOPE) + ELSEIF("${CMAKE_SIZEOF_VOID_P}" EQUAL "4") + ADD_DEFINITIONS(-DTARGET_ARCHITECTURE_i386) + SET(PLATFORM_TARGET "x86" PARENT_SCOPE) + ELSE() + ADD_DEFINITIONS(-DTARGET_ARCHITECTURE_Unknown) + SET(PLATFORM_TARGET "unknown" PARENT_SCOPE) + ENDIF() + + IF(WIN32) + ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE) + ADD_DEFINITIONS(-DTARGET_OS_Windows) + ADD_DEFINITIONS(-DTARGET_COMPILER_VisualStudio) + ELSEIF(APPLE) + ADD_DEFINITIONS(-fnon-call-exceptions) + ADD_DEFINITIONS(-DTARGET_OS_MacOS) + ADD_DEFINITIONS(-DTARGET_COMPILER_LLVM) + ELSEIF(UNIX) + # ADD_DEFINITIONS(-fvisibility=hidden) # This flag should be present... man gcc + ADD_DEFINITIONS(-fnon-call-exceptions) + ADD_DEFINITIONS(-DTARGET_OS_Linux) + ADD_DEFINITIONS(-DTARGET_COMPILER_GCC) + ENDIF() +ENDFUNCTION() + +# In extras/ we assume that everything is built onto the same platform. +# It is very error prone to leave this to the modules. +SET_BUILD_PLATFORM() + +# Print the used compilation parameters (for transparency) +GET_DIRECTORY_PROPERTY(TMP_DEFINITIONS COMPILE_DEFINITIONS) +MESSAGE(STATUS "Compilation flags used at source root: ") +MESSAGE(STATUS " COMPILE_DEFINITIONS = '${TMP_DEFINITIONS}'") +MESSAGE(STATUS " CMAKE_CXX_FLAGS = '${CMAKE_CXX_FLAGS}'") +MESSAGE(STATUS " CMAKE_CXX_FLAGS_RELEASE = '${CMAKE_CXX_FLAGS_RELEASE}'") +MESSAGE(STATUS " CMAKE_CXX_FLAGS_DEBUG = '${CMAKE_CXX_FLAGS_DEBUG}'") + +# if want to compile tests, use the following. +SET(OV_COMPILE_TESTS "true") + +# if you don't want an Ogre dependency, use the following. All 3D visualizations and 3D apps will be unavailable. The result will compile faster. +# SET(OV_DISABLE_OGRE "true") + +# if you don't want a GTK dependency, set the following. Note that most applications including Acquisition Server and Designer will NOT be built. +# This option is mostly of interest to hackers who are interested in using a minimal OpenViBE kernel in their own projects. +# SET(OV_DISABLE_GTK "true") + +# By setting SKIP[_FOLDER]* you can skip a subtree (example: SKIP_A_B_C skips folder a/b/c and all its subfolders if any) + +# Skip building documentation +SET(SKIP_DOCUMENTATION "1") + +# Only build the python plugin for one version of python. +# On windows, it can work with both, with the right configuration. +# On linux, compilation is easier, but runtime is not possible with both versions. Python.h is not namespaced and +# both plugins end up using the same Python API version (e.g. Python3 plugin calling python2 API). +SET(SKIP_CONTRIB_PLUGINS_PROCESSING_PYTHON2 "1") +#SET(SKIP_CONTRIB_PLUGINS_PROCESSING_PYTHON3 "1") + +# Skipping demos can speed up compilation a lot, if you don't need them +#SET(SKIP_APPLICATIONS_DEMOS "1") +#SET(SKIP_CONTRIB_APPLICATIONS "1") + +IF(UNIX) + # On Linux, the presence of matlab plugin .so can cause crashes in Simple DSP box as the two may use different versions of boost which are + # then wrongly exposed to the other party due to the dlopen() flag RTLD_GLOBAL. Unfortunately this flag is needed or the python plugin + # imports no longer work... You may enable the Matlab plugin compilation and possibly set the flag to RTLD_LOCAL in ovCKernelLoader.cpp, + # but be aware of the consequences. + MESSAGE(STATUS "Note: Disabling Matlab plugin compilation by default") + SET(SKIP_PLUGINS_PROCESSING_MATLAB "1") +ENDIF() + +#SET(SKIP_MODULES_AUTOMATON "1") +#SET(SKIP_MODULES_EBML "1") +#SET(SKIP_MODULES_FS "1") +#SET(SKIP_MODULES_SOCKET "1") +#SET(SKIP_MODULES_STREAM "1") +#SET(SKIP_MODULES_SYSTEM "1") +#SET(SKIP_MODULES_XML "1") +#SET(SKIP_APPLICATIONS_PLATFORM_ACQUISITION-SERVER "1") +#SET(SKIP_PLUGINS_PROCESSING_EXAMPLES "1") + +# FIXME CERT > From OpenViBE designer repo in the future +# Designer is currently in another repository; taken from there +SET(SKIP_APPLICATIONS_PLATFORM_DESIGNER "0") +SET(SKIP_APPLICATIONS_EXAMPLES_CONVERT "0") # Convert depends on Designer + +# If you wish you can uncomment the next line and add a file with additional information called OVBranches.cmake to +# the cmake-modules folder. It makes modifying this very CMake file easier. +#INCLUDE("OVCustomSettings") + +# a list of all project which will be filled by the directory traversal. This is needed to generate the documentation. +SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS "") +SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS_BUILD_DIR "") + +# Used by the various Find* scripts to locate OpenViBE modules +# Used by the various Find* scripts to locate OpenViBE modules +SET(OV_BASE_DIR ${CMAKE_SOURCE_DIR}) + +# needed for making visual studio projects when this script is called without CMAKE_BUILD_TYPE +SET_PROPERTY(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_DEBUG "TARGET_BUILDTYPE_Debug") +SET_PROPERTY(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_RELEASE "TARGET_BUILDTYPE_Release") +SET_PROPERTY(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_RELWITHDEBINFO "TARGET_BUILDTYPE_Release") + +SET(CMAKE_INSTALL_FULL_DOCDIR "${CMAKE_INSTALL_FULL_BINDIR}/../doc/html") + +ADD_SUBDIRECTORY("build-tool/") +# Traverse these directories and build their components +ADD_SUBDIRECTORY("modules/") +ADD_SUBDIRECTORY("plugins/") +ADD_SUBDIRECTORY("applications/") +ADD_SUBDIRECTORY("externals/") +ADD_SUBDIRECTORY("contrib/") +ADD_SUBDIRECTORY("documentation/") # needs to be the last since it uses the list of collected projects + +#add dependency to plugin inspector to the documentation +IF(openvibe-documentation) + ADD_DEPENDENCIES(openvibe-documentation openvibe-plugin-inspector) +ENDIF(openvibe-documentation) + +# make a copy of the dependency script, this is done so we can use the same launch scripts both in win install and win devel situations. +IF(WIN32) + FIND_PATH(OV_DEPENDENCY_CMD_PATH windows-dependencies.cmd PATHS ${LIST_DEPENDENCIES_PATH} NO_DEFAULT_PATH) + IF(NOT OV_DEPENDENCY_CMD_PATH) + MESSAGE(FATAL_ERROR "Dependency installer should have generated 'windows-dependencies.cmd'. Looked from ${LIST_DEPENDENCIES_PATH}.") + ENDIF() + INSTALL(PROGRAMS ${OV_DEPENDENCY_CMD_PATH}/windows-dependencies.cmd DESTINATION ${DIST_BINDIR} RENAME "openvibe-set-env.cmd") +ENDIF(WIN32) + + +# ---------------------- +# Generate 'external application launcher' script +# ---------------------- +IF(WIN32) + SET(OV_EXT_CMD_FILE "openvibe-external-application-launcher.cmd") +ELSEIF(UNIX) + SET(OV_EXT_CMD_FILE "openvibe-external-application-launcher") +ENDIF() + +CONFIGURE_FILE("${OV_LAUNCHER_SOURCE_PATH}/${OV_EXT_CMD_FILE}-base" "${CMAKE_CURRENT_BINARY_DIR}/${OV_EXT_CMD_FILE}") +INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${OV_EXT_CMD_FILE} DESTINATION ${DIST_BINDIR}) + +# create the openvibe-ogre-plugins.cfg file for Ogre on UNIX +IF(UNIX) + execute_process(COMMAND pkg-config --variable=plugindir OGRE OUTPUT_VARIABLE OGRE3D_PLUGIN_PATH) + CONFIGURE_FILE("${OV_LAUNCHER_SOURCE_PATH}/openvibe-ogre-plugins.cfg-base" "${CMAKE_CURRENT_BINARY_DIR}/openvibe-ogre-plugins.cfg") + INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/openvibe-ogre-plugins.cfg DESTINATION ${DIST_DATADIR}/openvibe) +ENDIF() + +SET(INCLUDED_OV_SDK_COMPONENTS DEPENDENCIES ALLPLUGINS) +INCLUDE("AddOpenViBESDKComponents") + +configure_file(test/CTestTestfile.cmake . @ONLY) diff --git a/Masterarbeit/openvibe/extras-master/COPYING b/Masterarbeit/openvibe/extras-master/COPYING new file mode 100644 index 0000000..dba13ed --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/COPYING @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/Masterarbeit/openvibe/extras-master/INSTALL b/Masterarbeit/openvibe/extras-master/INSTALL new file mode 100644 index 0000000..ad0b3a5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/INSTALL @@ -0,0 +1,160 @@ +This document is outdated. While some informations in this document may still be relevant, you should exert caution while reading it. +You can find an up to date version of this document in the meta repo, see https://gitlab.inria.fr/openvibe/meta/blob/master/README.md + + *========================================* + |OpenViBE| |INSTALL| + *========================================* + +|Introduction| + +This document explains how to build the OpenViBE platform from the sources. +More up-to-date information may be available at + +http://openvibe.inria.fr/build-instructions/ + +|Repository.organisation| + +Please refer to the README file to have information on the repository +organisation. + +|Build.target| + +Windows: OpenViBE should compile on x86 / x86_64 architecture running Microsoft +Windows 2k/XP/Vista/7 with Visual C++ 2008 or 2010 Express Edition (take care +of having the up-to-date platform SDK from Microsoft installed). + +Linux: OpenViBE should compile on x86 / x86_64 architectures running Linux with gcc 4.* + +Please consider that trying to compile OpenViBE on other hardware/OS/compiler +is experimental and has not been tested. If you wish to try and get OpenViBE +to run on other hardware/OS/compilers, your efforts are welcome +but you should not expect to get support on the short term. + +|Building.on.Windows| + +1. Short story: + +For command line -style building using NMake, double-click: + +# win32-install_dependencies +# win32-build + +For IDE style building using Visual Studio, double-click: + +# win32-install_dependencies +# win32-generate-vcproj +# win32-launch-vc + +You may have to tweak the last script to find your particular version of Visual Studio. + +The built openvibe should now be in "dist\" folder. If it didn't work, read the longer description for hints. + +|Detailed.building.instructions.for.Windows| + +1. Install dependencies + +In order to build the software, you must install several dependencies. +This may be done using the provided installation scripts which will automatically +set up your environment. Run the following *inside* the scripts/ directory: + + installs the dependencies under Windows. + +The Windows installer uses prebuilt packages and is quite fast. + +2. Prepare the environment + +The 'scripts' directory contains the necessary files to build the whole platform and plugins. +The sets the build environment. You may have to tune this +and other scripts by hand due to installation specifics such as Visual Studio paths. + +3a. Build using NMake + +If you want to build all projects without an IDE, you can use the script. +The script calls , which must be able to set the development +environment correctly. + +3b. Build using Visual Studio + +Use in scripts\ directory to generate a Visual Studio +solution to "local-tmp\visual\". The script calls , +which must be able to set up the development environment correctly. + +Script can then be used to launch Visual Studio 2010 Express +while taking care that all the environment variables have been set. To use other +version of Visual Studio, change the path on the last line of the script to +point to your version. + +Note the following when using Visual Studio with OpenViBE: + +- When launching Visual Studio, the OpenViBE environment variables must have +already been set (as done by ) +- Always compile the INSTALL target to get everything copied under "dist\". This +is required so that the compiled OpenViBE applications can find the DLL files. +- When debugging an OpenViBE executable in Visual Studio, you may have to set the +correct Properties->Debugging->Working Directory by finding "dist\bin\" with browse. +- All Visual Studio projects are created by CMake, so any changes to the project +configurations should be made to the CMake scripts. +- If you want to add any files to the build tree, delete "local-tmp\visual\CMakeCache.txt" +and run the again. + +4. If you made it this far, congratulations : you should now have OpenViBE working, +and the freshly built OpenViBE in "dist\". + + +|Building.on.Linux| + +1. Short story + +# cd scripts +# ./linux-install_dependencies +# ./linux-build + +The built OpenViBE should be in "dist/". If not, please read the longer description for hints. + +|Detailed.building.instructions.on.Linux| + +1. Install dependencies + +In order to build the software, you must install several dependencies. This may be +done using a provided script. Run the following *inside* the scripts/ directory: + + installs dependencies under Linux. + +The Linux installer processes a few source packages and builds them from scratch. Most +of the packages are installed from your Linux distribution. Hence this script requires +root access. If you don't have one, please ask your IT support to install the OpenViBE +dependencies for you as listed in the script. + +2. Build the platform + +To build OpenViBE, you can use the script while in the scripts/ directory. + +Finally, the script will launch the most interesting applications for you. + +If you want to build only some specific subtree, first build the whole OpenViBE +and then change to the appropriate subtree under local-tmp/. There you can call +"make" and "make install" to build only that component. + +3. If you made it this far, congratulations : you should now have OpenViBE freshly +built to "dist/". + +|Elementary Linux packaging| + +To build an elementary Debian/Ubuntu/Mint package from the official tarball (>= 0.16.0) +using debhelper, do the following: + +# mv openvibe-X.Y.Z.tar.gz openvibe_X.Y.Z.orig.tar.gz +# tar xzvf openvibe_X.Y.Z.orig.tar.gz +# cd openvibe-X.Y.Z +# debuild -uc -us + +|Contribution.rules| + +Please see + +http://openvibe.inria.fr/contribution-rules/ + + +|End.of.file| + + vim:tw=78:ts=8:ft=help:norl: diff --git a/Masterarbeit/openvibe/extras-master/README b/Masterarbeit/openvibe/extras-master/README new file mode 100644 index 0000000..7bf0d27 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/README @@ -0,0 +1,75 @@ +This document is outdated. While some informations in this document may still be relevant, you should exert caution while reading it. +You can find an up to date version of this document in the meta repo, see https://gitlab.inria.fr/openvibe/meta/blob/master/README.md + + *========================================* + |OpenViBE| |README| + *========================================* + +|Introduction| + +OpenViBE is a software platform for the design, test and use of +Brain-Computer Interfaces. This document provides basic +information on what you just downloaded. + +|Code.source.access| + +The source code of the project can be found by following links +on the OpenViBE homepage : + +http://openvibe.inria.fr/ + +|Repository.organisation| + +The project repository is composed of several software modules. Each software +module can have its own branches and tags and is compiled separately +from other modules. The repository basically looks like this : + +root of the repository + + (API / specifications) + + (kernel implementation) + + (development help components) + + (OpenViBE user applications) + + + + + + + + ... + + (OpenViBE plugin collections) + + + + + + ... + + (abstraction and portability components) + + + + + + ... + + (third-party components, author retains code ownership) + + ... + +Each software module is organized as a UNIX-like tree (empty folders not +included): + ++ (any pre-compiled binaries) ++ (target folder for API headers) ++ (any pre-compiled libraries) ++ (shared file folder for all data) ++ (source code of the module) ++ (documentation files for the module) ++ (unit test source code for the module) + +|Support| + +Please follow the links on the OpenViBE homepage: + +http://openvibe.inria.fr/ + +|Licence| + +Please refer to the COPYING file to get details regarding the OpenViBE license. + +|Building.the.software| + +Please refer to the INSTALL file for instructions on how to build the +platform. + +|End.of.file| + + vim:tw=78:ts=8:ft=help:norl: diff --git a/Masterarbeit/openvibe/extras-master/applications/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/CMakeLists.txt new file mode 100644 index 0000000..9bae9bd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/CMakeLists.txt @@ -0,0 +1,3 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("APPLICATIONS") diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/demos/CMakeLists.txt new file mode 100644 index 0000000..74f4e1d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/CMakeLists.txt @@ -0,0 +1,4 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("APPLICATIONS_DEMOS") + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/CMakeLists.txt new file mode 100644 index 0000000..3b1b1e1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/CMakeLists.txt @@ -0,0 +1,2 @@ + +INSTALL(DIRECTORY bci-examples DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/assets/rest.png b/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/assets/rest.png new file mode 100644 index 0000000..47c0e14 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/assets/rest.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/erp-1-monitor-signal.xml b/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/erp-1-monitor-signal.xml new file mode 100644 index 0000000..056fac8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/erp-1-monitor-signal.xml @@ -0,0 +1,589 @@ + + 1 + OpenViBE + 1.3.0+git + + + (0x000003fe, 0x00000ecb) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Global + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 544.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 100 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002a23aa) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00002726, 0x0000531f) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 544.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xad100179, 0xa3c984ab) + 121 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0057d189) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00006c8d, 0x00005eff) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x330306dd, 0x74a95f98) + Filename + ${Player_ScenarioDirectory}/signals/record-[$core{date}-$core{time}].ov + ${Player_ScenarioDirectory}/signals/record-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 384.000000 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00023a6b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007e7f, 0x00001714) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 672.000000 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00119045) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000018f6, 0x000043dd) + + (0x00002726, 0x0000531f) + 2 + + + (0x000003fe, 0x00000ecb) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 178 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 544 + + + + + (0x00002193, 0x00006de6) + + (0x00002726, 0x0000531f) + 4 + + + (0x000003fe, 0x00000ecb) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 178 + + + (0x358ae8b5, 0x0f8bacd1) + 574 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 559 + + + + + (0x0000350a, 0x00003b44) + + (0x00002726, 0x0000531f) + 2 + + + (0x00006c8d, 0x00005eff) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 178 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 391 + + + + + (0x00003d3c, 0x000078c6) + + (0x00002726, 0x0000531f) + 2 + + + (0x00007e7f, 0x00001714) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 178 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 672 + + + + + (0x00006ce3, 0x00001abc) + + (0x00002726, 0x0000531f) + 1 + + + (0x00006c8d, 0x00005eff) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 178 + + + (0x358ae8b5, 0x0f8bacd1) + 529 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 376 + + + + + (0x00007437, 0x0000097c) + + (0x00002726, 0x0000531f) + 1 + + + (0x000003fe, 0x00000ecb) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 178 + + + (0x358ae8b5, 0x0f8bacd1) + 529 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 529 + + + + + + + (0x0000430c, 0x00007f16) + This set of scenarios illustrates how to make +<b>event related potential (ERP)</b> recordings with +OpenViBE. + +The main scenario is the #2. It displays cues and +records data meanwhile, taking care to tag the data +with the events appropriately. + +What is actually done with the recording is outside +the scope of this tutorial. In principle you can +try to classify it, convert it to Matlab for further +analysis, etc. + + + (0x473d9a43, 0x97fc0a97) + 208.000000 + + + (0x7234b86b, 0x2b8651a5) + 112.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x000003fe, 0x00000ecb)","childCount":0,"identifier":"(0x00004ed7, 0x00002591)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00007ad6, 0x00004865)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000025c7, 0x00007b2b)","index":0,"name":"Default tab","parentIdentifier":"(0x00007ad6, 0x00004865)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000334d, 0x00001f2e)","index":0,"name":"Empty","parentIdentifier":"(0x000025c7, 0x00007b2b)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + ERP : Monitor signal + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/erp-2-record-signal.xml b/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/erp-2-record-signal.xml new file mode 100644 index 0000000..1736143 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/erp-2-record-signal.xml @@ -0,0 +1,1519 @@ + + 1 + OpenViBE + 1.3.0+git + + + (0x00000351, 0x00005cd9) + Debug: Timeline finally from server + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 714.000000 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xad100179, 0xa3c984ab) + 235 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001376d1) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001c2b, 0x000032e5) + Debug: display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336.000000 + + + (0x1fa963f5, 0x1a638cd4) + 53 + + + (0x207c9054, 0x3c841b63) + 336.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0004534c) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0x341d3912, 0x1478de86) + 1 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00002726, 0x0000531f) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 544.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xad100179, 0xa3c984ab) + 121 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005b6c24) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00003631, 0x00001ebf) + Sound Player + (0x7ac2396f, 0x7ee52efe) + + + (0x6f752dd0, 0x082a321e) + Input triggers + + + + + (0x6f752dd0, 0x082a321e) + Resync triggers (deprecated) + + + + + (0x2c132d6e, 0x44ab0d97) + PLAY trigger + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Beep + false + + + (0x2c132d6e, 0x44ab0d97) + STOP trigger + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_00 + false + + + (0x330306dd, 0x74a95f98) + File to play + ${Path_Data}/plugins/stimulation/ov_beep.wav + ${Path_Data}/plugins/stimulation/ov_beep.wav + false + + + (0x2cdb2f0b, 0x12f231ea) + Loop + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 1056.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd327e20a, 0xaae6b1f8) + + + (0xad100179, 0xa3c984ab) + 94 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00570835) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000045e9, 0x00003a99) + Display cue image + (0x005789a4, 0x3ab78a36) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x6f752dd0, 0x082a321e) + Stimulations (deprecated) + + + + + (0x2cdb2f0b, 0x12f231ea) + Display images in full screen + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Scale images to fit + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Clear screen Stimulation + OVTK_StimulationId_VisualStimulationStop + OVTK_StimulationId_VisualStimulationStop + false + + + (0x330306dd, 0x74a95f98) + Cue Image 1 + ${Path_Data}/plugins/simple-visualization/p300-magic-card/01.png + ${Path_Data}/plugins/simple-visualization/p300-magic-card/01.png + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 1 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x330306dd, 0x74a95f98) + Cue Image 2 + ${Path_Data}/plugins/simple-visualization/p300-magic-card/02.png + ${Path_Data}/plugins/simple-visualization/p300-magic-card/02.png + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 2 + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x330306dd, 0x74a95f98) + Cue Image 3 + ${Path_Data}/plugins/simple-visualization/p300-magic-card/03.png + ${Path_Data}/plugins/simple-visualization/p300-magic-card/03.png + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 3 + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0x330306dd, 0x74a95f98) + Cue Image 4 + ${Path_Data}/plugins/simple-visualization/p300-magic-card/04.png + ${Path_Data}/applications/vr-demo/handball/scene-graz-cross/cross.png + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 4 + OVTK_StimulationId_Label_04 + OVTK_GDF_Cross_On_Screen + false + + + (0x330306dd, 0x74a95f98) + Cue Image 5 + ${Path_Data}/plugins/simple-visualization/p300-magic-card/07.png + ${Player_ScenarioDirectory}/assets/rest.png + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 5 + OVTK_StimulationId_Label_07 + OVTK_StimulationId_RestStart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 928.000000 + + + (0x4e7b798a, 0x183beafb) + (0x18869d2c, 0x1a544d63) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 127 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00558637) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004f7f, 0x000035b1) + Stream to file + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + (0x6ab26b81, 0x0f8c02f3) + Input stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].ov + ${Player_ScenarioDirectory}/signals/record-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 496.000000 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 115 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0035ac8f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000523b, 0x000018be) + Beep + (0x02f96101, 0x5e647cb8) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x6f752dd0, 0x082a321e) + Modified Stimulations + + + + + (0x09e59e57, 0x8d4a553a) + Default action + Reject + Reject + false + + + (0x512a166f, 0x5c3ef83f) + Time range begin + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time range end + 0 + 0 + false + + + (0x09e59e57, 0x8d4a553a) + Action to perform + Select + Select + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range begin + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Beep + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range end + OVTK_StimulationId_Label_0F + OVTK_StimulationId_Beep + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 1056.000000 + + + (0x4e7b798a, 0x183beafb) + (0x47859b3f, 0x1dfdf5cd) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 94 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004a0e3d) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000523b, 0x000018bf) + Non-beep + (0x02f96101, 0x5e647cb8) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x6f752dd0, 0x082a321e) + Modified Stimulations + + + + + (0x09e59e57, 0x8d4a553a) + Default action + Reject + Select + false + + + (0x512a166f, 0x5c3ef83f) + Time range begin + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time range end + 0 + 0 + false + + + (0x09e59e57, 0x8d4a553a) + Action to perform + Select + Reject + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range begin + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Beep + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range end + OVTK_StimulationId_Label_0F + OVTK_StimulationId_Beep + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 928.000000 + + + (0x4e7b798a, 0x183beafb) + (0x47859b3f, 0x1dfdf5cd) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 94 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00700058) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000733d, 0x00004c0a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 441.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 592.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000da1a8) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000075ac, 0x000054c7) + Debug: Generated timeline + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224.000000 + + + (0x1fa963f5, 0x1a638cd4) + 53 + + + (0x207c9054, 0x3c841b63) + 1232.000000 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xad100179, 0xa3c984ab) + 182 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000357a3) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0x341d3912, 0x1478de86) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000079ff, 0x00004013) + Timeline generator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/experiment-timeline.lua + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 144.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 1008.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 132 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c00550) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00000289, 0x00006d09) + + (0x0000523b, 0x000018be) + 0 + + + (0x00003631, 0x00001ebf) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 252 + + + (0x358ae8b5, 0x0f8bacd1) + 1056 + + + (0x3f0a3b27, 0x570913d2) + 272 + + + (0x6267b5c5, 0x676e3e42) + 1056 + + + + + (0x000003f1, 0x00007639) + + (0x00002726, 0x0000531f) + 2 + + + (0x00004f7f, 0x000035b1) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 178 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 342 + + + (0x6267b5c5, 0x676e3e42) + 503 + + + + + (0x00000da6, 0x00004161) + + (0x000079ff, 0x00004013) + 0 + + + (0x0000523b, 0x000018bf) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 172 + + + (0x358ae8b5, 0x0f8bacd1) + 1008 + + + (0x3f0a3b27, 0x570913d2) + 198 + + + (0x6267b5c5, 0x676e3e42) + 928 + + + + + (0x00001c92, 0x00005942) + + (0x00002726, 0x0000531f) + 0 + + + (0x00004f7f, 0x000035b1) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 178 + + + (0x358ae8b5, 0x0f8bacd1) + 514 + + + (0x3f0a3b27, 0x570913d2) + 342 + + + (0x6267b5c5, 0x676e3e42) + 473 + + + + + (0x000036b4, 0x00001fe9) + + (0x000079ff, 0x00004013) + 0 + + + (0x000075ac, 0x000054c7) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 172 + + + (0x358ae8b5, 0x0f8bacd1) + 1008 + + + (0x3f0a3b27, 0x570913d2) + 193 + + + (0x6267b5c5, 0x676e3e42) + 1232 + + + + + (0x00003b15, 0x00000638) + + (0x000079ff, 0x00004013) + 0 + + + (0x0000523b, 0x000018be) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 172 + + + (0x358ae8b5, 0x0f8bacd1) + 1008 + + + (0x3f0a3b27, 0x570913d2) + 198 + + + (0x6267b5c5, 0x676e3e42) + 1056 + + + + + (0x000045d2, 0x00007327) + + (0x00002726, 0x0000531f) + 2 + + + (0x0000733d, 0x00004c0a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 178 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 425 + + + (0x6267b5c5, 0x676e3e42) + 592 + + + + + (0x00004eb3, 0x00004933) + + (0x00002726, 0x0000531f) + 1 + + + (0x00001c2b, 0x000032e5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 178 + + + (0x358ae8b5, 0x0f8bacd1) + 529 + + + (0x3f0a3b27, 0x570913d2) + 305 + + + (0x6267b5c5, 0x676e3e42) + 321 + + + + + (0x00005625, 0x000071d7) + + (0x00002726, 0x0000531f) + 1 + + + (0x00004f7f, 0x000035b1) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 178 + + + (0x358ae8b5, 0x0f8bacd1) + 529 + + + (0x3f0a3b27, 0x570913d2) + 342 + + + (0x6267b5c5, 0x676e3e42) + 488 + + + + + (0x000058cc, 0x000024cb) + + (0x00002726, 0x0000531f) + 2 + + + (0x00000351, 0x00005cd9) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 178 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 342 + + + (0x6267b5c5, 0x676e3e42) + 714 + + + + + (0x00005922, 0x00002e7f) + + (0x0000523b, 0x000018bf) + 0 + + + (0x000045e9, 0x00003a99) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 252 + + + (0x358ae8b5, 0x0f8bacd1) + 928 + + + (0x3f0a3b27, 0x570913d2) + 267 + + + (0x6267b5c5, 0x676e3e42) + 928 + + + + + (0x0000687a, 0x00000efb) + + (0x00002726, 0x0000531f) + 4 + + + (0x00004f7f, 0x000035b1) + 3 + + + + (0x1b32c44c, 0x1905e0e9) + 178 + + + (0x358ae8b5, 0x0f8bacd1) + 574 + + + (0x3f0a3b27, 0x570913d2) + 342 + + + (0x6267b5c5, 0x676e3e42) + 518 + + + + + (0x000077bc, 0x00006b79) + + (0x00002726, 0x0000531f) + 2 + + + (0x00001c2b, 0x000032e5) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 178 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 305 + + + (0x6267b5c5, 0x676e3e42) + 336 + + + + + + + (0x000021c9, 0x00004ebe) + NOTE: When recording, + +- Acquisition Server must of course be in acquiring state +- drift correction in acquisition server should be <b>DISABLED</b> +- remember to <b>check impedances</b> every time +- <b>do NOT move</b> AS or Designer windows during recording +- <b>visually check the signal</b> with the other scenario +to make sure the amp or AS hasn't crashed +- all boxes marked as debug should be <b>muted</b> during run +- set the Display Cue Image box to <b>fullscreen</b> + + + (0x473d9a43, 0x97fc0a97) + 224.000000 + + + (0x7234b86b, 0x2b8651a5) + 144.000000 + + + + + (0x00004d5e, 0x00003487) + Modify the lua script in the box to change +what is displayed and when + + + (0x473d9a43, 0x97fc0a97) + 1232.000000 + + + (0x7234b86b, 0x2b8651a5) + 128.000000 + + + + + (0x0000577e, 0x00002151) + The main <b>ERP Recording</b> scenario + + + (0x473d9a43, 0x97fc0a97) + 712.000000 + + + (0x7234b86b, 0x2b8651a5) + 48.000000 + + + + + (0x0000782d, 0x00001ec8) + These two boxes will pass their stimulations +directly to the Acquisition Server using TCP Tagging. +The markers related to rendered cues/audio +are delayed to be immediately post-stimulus. + +The stimulation filtering is to make sure AS +doesn't receive the same markers twice. + + + (0x473d9a43, 0x97fc0a97) + 1024.000000 + + + (0x7234b86b, 0x2b8651a5) + 400.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00001c2b, 0x000032e5)","childCount":0,"identifier":"(0x0000051c, 0x000021be)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0x000045e9, 0x00003a99)","childCount":0,"identifier":"(0x000021b3, 0x0000695a)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00007ad6, 0x00004865)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000025c7, 0x00007b2b)","index":0,"name":"Default tab","parentIdentifier":"(0x00007ad6, 0x00004865)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000334d, 0x00001f2e)","index":0,"name":"Empty","parentIdentifier":"(0x000025c7, 0x00007b2b)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + ERP : Record Signal + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/erp-3-replay-file.xml b/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/erp-3-replay-file.xml new file mode 100644 index 0000000..c0b8ec3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/erp-3-replay-file.xml @@ -0,0 +1,413 @@ + + 1 + OpenViBE + 1.3.0+git + + + (0x000003fe, 0x00000ecb) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Global + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 544.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 100 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000037b1, 0x000072fb) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 416.000000 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004c3f, 0x00001a0e) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + (0x403488e7, 0x565d70b6) + Output stream 3 + + + (0x6ab26b81, 0x0f8c02f3) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + FILL ME + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 175.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 544.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 153 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + + + (0x00001177, 0x00007f10) + + (0x00004c3f, 0x00001a0e) + 3 + + + (0x000003fe, 0x00000ecb) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 198 + + + (0x358ae8b5, 0x0f8bacd1) + 566 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 559 + + + + + (0x00001546, 0x000066da) + + (0x00004c3f, 0x00001a0e) + 1 + + + (0x000037b1, 0x000072fb) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 198 + + + (0x358ae8b5, 0x0f8bacd1) + 536 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 416 + + + + + (0x00002351, 0x00001e6b) + + (0x00004c3f, 0x00001a0e) + 0 + + + (0x000003fe, 0x00000ecb) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 198 + + + (0x358ae8b5, 0x0f8bacd1) + 521 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 529 + + + + + (0x00005ba6, 0x00007ece) + + (0x00004c3f, 0x00001a0e) + 1 + + + (0x000003fe, 0x00000ecb) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 198 + + + (0x358ae8b5, 0x0f8bacd1) + 536 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 544 + + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x000003fe, 0x00000ecb)","childCount":0,"identifier":"(0x00004ed7, 0x00002591)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00007ad6, 0x00004865)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000025c7, 0x00007b2b)","index":0,"name":"Default tab","parentIdentifier":"(0x00007ad6, 0x00004865)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000334d, 0x00001f2e)","index":0,"name":"Empty","parentIdentifier":"(0x000025c7, 0x00007b2b)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + ERP : Replay File + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/scripts/experiment-timeline.lua b/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/scripts/experiment-timeline.lua new file mode 100644 index 0000000..f3ee611 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/scripts/experiment-timeline.lua @@ -0,0 +1,82 @@ + +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + -- each stimulation sent that gets rendered by Display Cue Image box + -- should probably have a little period of time before the next one or the box wont be happy + pre_baseline_duration = 1 + baseline_duration = 10 + post_baseline_duration = 1 + cross_duration = 1 + post_cross_duration = 1 + display_cue_duration = 3 + post_cue_duration = 3 + rest_duration = 5 + post_end_duration = 1 + + sequence = { + OVTK_StimulationId_Label_01, + OVTK_StimulationId_Label_02, + OVTK_StimulationId_Label_03, + OVTK_StimulationId_Label_02, + OVTK_StimulationId_Label_03, + OVTK_StimulationId_Label_01, + } + +end + +function process(box) + + local t = 0 + + -- Delays before the trial sequence starts + box:send_stimulation(1, OVTK_StimulationId_ExperimentStart, t, 0) + t = t + pre_baseline_duration + + box:send_stimulation(1, OVTK_StimulationId_BaselineStart, t, 0) + t = t + baseline_duration + + box:send_stimulation(1, OVTK_StimulationId_BaselineStop, t, 0) + t = t + post_baseline_duration + + -- creates each trial + for i = 1, #sequence do + + -- first display a cross on screen + box:send_stimulation(1, OVTK_GDF_Start_Of_Trial, t, 0) + box:send_stimulation(1, OVTK_GDF_Cross_On_Screen, t, 0) + box:send_stimulation(1, OVTK_StimulationId_Beep, t, 0) + t = t + cross_duration + + -- Clear cross. + box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStop, t, 0) + t = t + post_cross_duration + + -- display cue + box:send_stimulation(1, sequence[i], t, 0) + t = t + display_cue_duration + + -- clear cue. + box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStop, t, 0) + t = t + post_cue_duration + + -- rest period + box:send_stimulation(1, OVTK_StimulationId_RestStart, t, 0) + t = t + rest_duration + + -- end of rest and trial + box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStop, t, 0) + box:send_stimulation(1, OVTK_StimulationId_RestStop, t, 0) + box:send_stimulation(1, OVTK_GDF_End_Of_Trial, t, 0) + t = t + post_end_duration + end + + -- send end for completeness + box:send_stimulation(1, OVTK_GDF_End_Of_Session, t, 0) + t = t + 5 + + -- used to cause the acquisition scenario to stop and denote final end of file + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, t, 0) + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/signals/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/signals/README.txt new file mode 100644 index 0000000..6f98072 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/erp-recording/bci-examples/erp-recording/signals/README.txt @@ -0,0 +1,3 @@ + +Signal data will be written here. + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/CMakeLists.txt new file mode 100644 index 0000000..d450338 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/CMakeLists.txt @@ -0,0 +1,6 @@ + +# INSTALL(DIRECTORY signals DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) +INSTALL(DIRECTORY bci-examples DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/csp-spatial-filter.cfg b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/csp-spatial-filter.cfg new file mode 100644 index 0000000..2c0b040 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/csp-spatial-filter.cfg @@ -0,0 +1,6 @@ + + 2.703843e-01 -2.033501e-01 2.403197e-01 2.356381e-01 3.924335e-01 2.392063e-01 1.126995e-01 5.732521e-01 3.104990e-01 2.895368e-01 1.986909e-01 -2.802677e-01 8.642671e-02 -2.668902e-01 -2.873131e-01 -3.079679e-01 -2.311899e-01 -3.049967e-01 -3.204300e-01 -4.425812e-01 -2.982544e-01 -3.624583e-01 -1.743516e-02 -7.034854e-01 -5.985984e-03 -1.229407e-01 1.248006e-01 2.071428e-02 6.843323e-02 -2.541336e-01 -2.561801e-01 -3.879860e-01 4.338449e-01 1.443236e-01 3.069893e-01 3.027873e-01 3.956782e-01 2.813831e-01 2.775939e-01 3.539175e-01 2.829925e-01 3.027860e-01 3.108203e-01 2.946542e-01 8.225417e-01 2.972165e-01 1.898254e-01 2.250985e-01 1.687560e-01 -1.534876e-01 -2.300926e-01 4.962169e-02 1.434810e-01 1.137737e-01 8.608912e-02 2.163422e-01 2.683768e-01 3.076638e-01 3.600548e-01 3.077418e-01 2.519825e-01 2.256518e-01 3.292366e-01 2.892911e-01 3.994613e-01 3.099987e-01 + 6 + 11 + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-0-signal-monitoring.xml b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-0-signal-monitoring.xml new file mode 100644 index 0000000..f6815ea --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-0-signal-monitoring.xml @@ -0,0 +1,824 @@ + + 1 + OpenVIBE + 0.0.2 + + + (0x000007a2, 0x000015ab) + Filtered signals + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 544.000000 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 1040.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00001011, 0x000029a5) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 928 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xac367a9c, 0x2da95abe) + 6 + + + (0xad100179, 0xa3c984ab) + 67 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006ca56c) + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000105e, 0x00007603) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 40.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 119 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0056a91f) + + + + + (0x00001a86, 0x00007cb2) + Raw signals + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 544.000000 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 816.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 98 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00005792, 0x00005c0c) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112.000000 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 912.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + + + (0x000004fc, 0x00001d75) + + (0x00005792, 0x00005c0c) + 1 + + + (0x00001011, 0x000029a5) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 131 + + + (0x358ae8b5, 0x0f8bacd1) + 897 + + + (0x3f0a3b27, 0x570913d2) + 376 + + + (0x6267b5c5, 0x676e3e42) + 928 + + + + + (0x00001077, 0x00002042) + + (0x00001011, 0x000029a5) + 1 + + + (0x000007a2, 0x000015ab) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 425 + + + (0x358ae8b5, 0x0f8bacd1) + 928 + + + (0x3f0a3b27, 0x570913d2) + 514 + + + (0x6267b5c5, 0x676e3e42) + 1025 + + + + + (0x0000269d, 0x00005b82) + + (0x0000105e, 0x00007603) + 0 + + + (0x00001011, 0x000029a5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 275 + + + (0x358ae8b5, 0x0f8bacd1) + 832 + + + (0x3f0a3b27, 0x570913d2) + 376 + + + (0x6267b5c5, 0x676e3e42) + 913 + + + + + (0x00002791, 0x00006c0c) + + (0x00001011, 0x000029a5) + 0 + + + (0x00001a86, 0x00007cb2) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 425 + + + (0x358ae8b5, 0x0f8bacd1) + 913 + + + (0x3f0a3b27, 0x570913d2) + 514 + + + (0x6267b5c5, 0x676e3e42) + 801 + + + + + (0x00003bae, 0x00001eed) + + (0x00005792, 0x00005c0c) + 2 + + + (0x00001011, 0x000029a5) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 131 + + + (0x358ae8b5, 0x0f8bacd1) + 912 + + + (0x3f0a3b27, 0x570913d2) + 376 + + + (0x6267b5c5, 0x676e3e42) + 943 + + + + + (0x00004f68, 0x00003ee2) + + (0x00001011, 0x000029a5) + 2 + + + (0x00001a86, 0x00007cb2) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 425 + + + (0x358ae8b5, 0x0f8bacd1) + 943 + + + (0x3f0a3b27, 0x570913d2) + 514 + + + (0x6267b5c5, 0x676e3e42) + 816 + + + + + (0x00005550, 0x00005aee) + + (0x00001011, 0x000029a5) + 2 + + + (0x000007a2, 0x000015ab) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 425 + + + (0x358ae8b5, 0x0f8bacd1) + 943 + + + (0x3f0a3b27, 0x570913d2) + 514 + + + (0x6267b5c5, 0x676e3e42) + 1040 + + + + + (0x00005e82, 0x00000023) + + (0x00005792, 0x00005c0c) + 1 + + + (0x0000105e, 0x00007603) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 131 + + + (0x358ae8b5, 0x0f8bacd1) + 897 + + + (0x3f0a3b27, 0x570913d2) + 239 + + + (0x6267b5c5, 0x676e3e42) + 832 + + + + + + + (0x00002041, 0x00001ef0) + <u><b><big>Overview</big></b></u> + +This scenario can be used in order +to check the quality of the signals +before starting an experiment. + +One should <u>definitely</u> +check the quality of the signals +and ensure that : + +- <b>eye blinks</b> are visible +- <b>jaw clenching</b> are visible +- <b>alpha waves</b> are visible when closing eyes + + + (0x473d9a43, 0x97fc0a97) + 1184 + + + (0x7234b86b, 0x2b8651a5) + 272 + + + + + (0x0000569e, 0x00003097) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 944 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + (0x000061e1, 0x00003276) + The <i>Temporal Filter</i> +box transform the signal +so you can see what is actually +used online. + + + (0x473d9a43, 0x97fc0a97) + 640 + + + (0x7234b86b, 0x2b8651a5) + 256 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":635,"identifier":"(0x00002a99, 0x00002db8)","index":0,"name":"","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":783},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006615, 0x00007f04)","index":0,"name":"Default tab","parentIdentifier":"(0x00002a99, 0x00002db8)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":293,"identifier":"(0x000013c9, 0x00002d1a)","index":0,"maxDividerPosition":590,"name":"Vertical split","parentIdentifier":"(0x00006615, 0x00007f04)","type":4},{"boxIdentifier":"(0x00001a86, 0x00007cb2)","childCount":0,"identifier":"(0x00000d3a, 0x00003c74)","index":0,"parentIdentifier":"(0x000013c9, 0x00002d1a)","type":3},{"boxIdentifier":"(0x000007a2, 0x000015ab)","childCount":0,"identifier":"(0x000017eb, 0x0000380b)","index":1,"parentIdentifier":"(0x000013c9, 0x00002d1a)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renard + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Signal Monitoring + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Motor Imagery + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-1-acquisition.xml b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-1-acquisition.xml new file mode 100644 index 0000000..cbe2503 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-1-acquisition.xml @@ -0,0 +1,584 @@ + + 2 + OpenViBE Designer + 3.1.0 + + + + + + (0x00001d3f, 0x00006e8a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002117, 0x000005ce) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -64 + + + (0x207c9054, 0x3c841b63) + 656 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00005a9c, 0x00004eff) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/motor-imagery-csp-1-acquisition-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 572 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002730c3) + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006ea1, 0x00004c67) + Graz Motor Imagery BCI Stimulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/motor-imagery-bci-graz-stimulator.lua + false + + + (0x007deef9, 0x2f3e95c6) + Number of Trials for Each Class + 20 + 20 + false + + + (0x2c132d6e, 0x44ab0d97) + First Class + OVTK_GDF_Left + OVTK_GDF_Left + false + + + (0x2c132d6e, 0x44ab0d97) + Second Class + OVTK_GDF_Right + OVTK_GDF_Right + false + + + (0x512a166f, 0x5c3ef83f) + Baseline Duration (in sec) + 20 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Wait For Beep Duration (in sec) + 2 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + Wait For Cue Duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Display Cue Duration (in sec) + 1.250 + 1.250 + false + + + (0x512a166f, 0x5c3ef83f) + Feedback Duration (in sec) + 3.750 + 3.750 + false + + + (0x512a166f, 0x5c3ef83f) + End of Trial Minimum Duration (in sec) + 1.500 + 1.500 + false + + + (0x512a166f, 0x5c3ef83f) + End of Trial Maximum Duration (in sec) + 3.500 + 3.500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x207c9054, 0x3c841b63) + 656 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x022844b3, 0x367522a4) + Graz visualization + (0x00dd290d, 0x5f142820) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Show feedback + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive feedback only + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x207c9054, 0x3c841b63) + 656 + + + (0x4e7b798a, 0x183beafb) + (0x602ceb3f, 0xd3bc74aa) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + + + (0x00000545, 0x00002c8b) + + (0x00002117, 0x000005ce) + 2 + + + (0x00005a9c, 0x00004eff) + 2 + + + + (0x00001f15, 0x00005eef) + + (0x00002117, 0x000005ce) + 1 + + + (0x00005a9c, 0x00004eff) + 1 + + + + (0x0000440e, 0x000000f9) + + (0x00002117, 0x000005ce) + 2 + + + (0x00001d3f, 0x00006e8a) + 0 + + + + (0x0000710b, 0x00002d2b) + + (0x00002117, 0x000005ce) + 0 + + + (0x00005a9c, 0x00004eff) + 0 + + + + (0x000078b6, 0x00007452) + + (0x00006ea1, 0x00004c67) + 0 + + + (0x022844b3, 0x367522a4) + 0 + + + + + + (0x0000159f, 0x00004fe3) + <u><b>Note:</b></u> It is always a good idea to +monitor the signals during an experiment + + + (0x473d9a43, 0x97fc0a97) + 992 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + (0x00001bd9, 0x00000872) + <u><b><big>Overview</big></b></u> + +This scenario can be used as a first +step to collect some training data. Those +data will later be used to train a classifier +for online use. + +When you start this scenario, just wait 40 +seconds before it starts the instruction sequence. + +You will then be presented left / right arrows to +let you imagine left / right hand movements. +There will be 20 arrows of each side. + +<small><i><b>note:</b> the recorded files go to the +folder where the scenario xml is located +(<span color="darkblue">${Player_ScenarioDirectory}/</span>).</i></small> + + + (0x473d9a43, 0x97fc0a97) + 992 + + + (0x7234b86b, 0x2b8651a5) + -176 + + + + + (0x00002ba5, 0x000028e3) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 544 + + + (0x7234b86b, 0x2b8651a5) + -288 + + + + + (0x00003f81, 0x00006bfa) + The Graz Visualization box will send the timeline +markers directly to Acquisition Server using the +TCP Tagging plugin. The server will then attach them +appropriately to the EEG stream. + + + (0x473d9a43, 0x97fc0a97) + 304.000000 + + + (0x7234b86b, 0x2b8651a5) + -112.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":505,"identifier":"(0x00000878, 0x000036c2)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":608},{"boxIdentifier":"(0x022844b3, 0x367522a4)","childCount":0,"identifier":"(0x55032c6f, 0x5edaffba)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004626, 0x00001cdf)","index":0,"name":"Default tab","parentIdentifier":"(0x00000878, 0x000036c2)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000027da, 0x00000e29)","index":0,"name":"Empty","parentIdentifier":"(0x00004626, 0x00001cdf)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renard / Fabien Lotte + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Data Acquisition + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Motor Imagery + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-2-train-CSP.xml b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-2-train-CSP.xml new file mode 100644 index 0000000..ea0fdc7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-2-train-CSP.xml @@ -0,0 +1,925 @@ + + 1 + OpenViBE + 1.1.0+git + + + (0x000016d5, 0x000033f1) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000027da, 0x00005cde) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 992 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 59 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002d82, 0x00002d33) + Left trials + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_GDF_Left + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 145 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004125, 0x0000536f) + CSP Spatial Filter Trainer + (0x51db0d64, 0x2109714e) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Signal condition 1 + + + (0x5ba36127, 0x195feae1) + Signal condition 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_GDF_End_Of_Session + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Spatial filter configuration + + ${Player_ScenarioDirectory}/csp-spatial-filter.cfg + false + + + (0x007deef9, 0x2f3e95c6) + Filter dimension + 2 + 6 + false + + + (0x2cdb2f0b, 0x12f231ea) + Save as box config + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 992 + + + (0x4e7b798a, 0x183beafb) + (0x4b49a133, 0x42f38d94) + + + (0xad100179, 0xa3c984ab) + 172 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00005277, 0x000014a2) + Right trials + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_GDF_Right + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 1104 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 145 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000055dc, 0x0000109e) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 992 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 153 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005e1c11) + + + + + (0x0000743e, 0x000010d2) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 992 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000ec1, 0x00004f9e) + + (0x00002d82, 0x00002d33) + 0 + + + (0x00004125, 0x0000536f) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 7 + + + (0x358ae8b5, 0x0f8bacd1) + 872 + + + (0x3f0a3b27, 0x570913d2) + 96 + + + (0x6267b5c5, 0x676e3e42) + 992 + + + + + (0x000017e6, 0x00004537) + + (0x000027da, 0x00005cde) + 0 + + + (0x00005277, 0x000014a2) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -105 + + + (0x358ae8b5, 0x0f8bacd1) + 984 + + + (0x3f0a3b27, 0x570913d2) + -37 + + + (0x6267b5c5, 0x676e3e42) + 1096 + + + + + (0x00003ec1, 0x00007d99) + + (0x000055dc, 0x0000109e) + 1 + + + (0x000016d5, 0x000033f1) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -313 + + + (0x358ae8b5, 0x0f8bacd1) + 992 + + + (0x3f0a3b27, 0x570913d2) + -240 + + + (0x6267b5c5, 0x676e3e42) + 896 + + + + + (0x000042fc, 0x00007f51) + + (0x000016d5, 0x000033f1) + 0 + + + (0x000027da, 0x00005cde) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -206 + + + (0x358ae8b5, 0x0f8bacd1) + 896 + + + (0x3f0a3b27, 0x570913d2) + -149 + + + (0x6267b5c5, 0x676e3e42) + 984 + + + + + (0x00004a99, 0x00007f97) + + (0x000027da, 0x00005cde) + 1 + + + (0x00005277, 0x000014a2) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -105 + + + (0x358ae8b5, 0x0f8bacd1) + 999 + + + (0x3f0a3b27, 0x570913d2) + -37 + + + (0x6267b5c5, 0x676e3e42) + 1111 + + + + + (0x00006640, 0x000019bb) + + (0x000055dc, 0x0000109e) + 2 + + + (0x000027da, 0x00005cde) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -313 + + + (0x358ae8b5, 0x0f8bacd1) + 1007 + + + (0x3f0a3b27, 0x570913d2) + -149 + + + (0x6267b5c5, 0x676e3e42) + 999 + + + + + (0x000068fa, 0x00007623) + + (0x000027da, 0x00005cde) + 0 + + + (0x00002d82, 0x00002d33) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -105 + + + (0x358ae8b5, 0x0f8bacd1) + 984 + + + (0x3f0a3b27, 0x570913d2) + -37 + + + (0x6267b5c5, 0x676e3e42) + 872 + + + + + (0x00006f78, 0x00003d05) + + (0x000027da, 0x00005cde) + 1 + + + (0x00002d82, 0x00002d33) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -105 + + + (0x358ae8b5, 0x0f8bacd1) + 999 + + + (0x3f0a3b27, 0x570913d2) + -37 + + + (0x6267b5c5, 0x676e3e42) + 887 + + + + + (0x00007621, 0x0000772e) + + (0x000027da, 0x00005cde) + 1 + + + (0x00004125, 0x0000536f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -105 + + + (0x358ae8b5, 0x0f8bacd1) + 999 + + + (0x3f0a3b27, 0x570913d2) + 96 + + + (0x6267b5c5, 0x676e3e42) + 977 + + + + + (0x000077f9, 0x00001114) + + (0x00004125, 0x0000536f) + 0 + + + (0x0000743e, 0x000010d2) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 130 + + + (0x358ae8b5, 0x0f8bacd1) + 992 + + + (0x3f0a3b27, 0x570913d2) + 176 + + + (0x6267b5c5, 0x676e3e42) + 992 + + + + + (0x00007a10, 0x000008c3) + + (0x00005277, 0x000014a2) + 0 + + + (0x00004125, 0x0000536f) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 7 + + + (0x358ae8b5, 0x0f8bacd1) + 1096 + + + (0x3f0a3b27, 0x570913d2) + 96 + + + (0x6267b5c5, 0x676e3e42) + 1007 + + + + + + + (0x000008e3, 0x00002907) + <b>--::</b> Remember to <b>change the file</b> +to the one you recorded before! + + + (0x473d9a43, 0x97fc0a97) + 1232.000000 + + + (0x7234b86b, 0x2b8651a5) + -336.000000 + + + + + (0x00003594, 0x000016a6) + <u><b><big>Overview</big></b></u> + +This scenario trains the <i>Common Spatial Pattern</i> spatial filter +that will be used in the further steps. + +The EEG signal is filtered in a large frequency band [8-30 Hz]. + +Then the <i>Stimulation based epoching</i> boxes +provide examples for the <i>CSP Spatial Filter Trainer</i> : +class 1: LEFT trials +class 2: RIGHT trials + +At the end of the training process, +the CSP trainer outputs the stimulation +<b>OVTK_StimulationId_TrainCompleted</b> on success, +telling the <i>Player Controller</i> to pause the scenario. + + + (0x473d9a43, 0x97fc0a97) + 576.000000 + + + (0x7234b86b, 0x2b8651a5) + -208.000000 + + + + + (0x00007e47, 0x000066f8) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 992 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":400,"identifier":"(0x00001209, 0x000052ed)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":400},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00002598, 0x00002e05)","index":0,"name":"Default tab","parentIdentifier":"(0x00001209, 0x000052ed)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000121e, 0x000031a2)","index":0,"name":"Empty","parentIdentifier":"(0x00002598, 0x00002e05)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-3-classifier-trainer.xml b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-3-classifier-trainer.xml new file mode 100644 index 0000000..6f5203b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-3-classifier-trainer.xml @@ -0,0 +1,2088 @@ + + 1 + OpenViBE + 1.1.0+git + + + (0x024f66fc, 0x20e58fa8) + Left trials + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_GDF_Left + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 145 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x038cae1a, 0x03e0da64) + CSP Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/csp-spatial-filter.cfg + + + (0xad100179, 0xa3c984ab) + 122 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x04a03512, 0x1acdb2f3) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 82 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0a5a6a4a, 0x1d92a778) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/motor-imagery-bci-config-classifier.cfg + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_GDF_Left + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_GDF_Right + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 544.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 864.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x122ee495, 0x1815b528) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -64 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 59 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc7a) + + + (0xfba64161, 0x65304e21) + + + + + + (0x1a3f9b29, 0x7bb960b3) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 82 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x24757b65, 0x29027b6f) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 608 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x287d352b, 0x4f872476) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 82 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2f50951f, 0x121e5699) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 95 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001919ab) + + + + + (0x312e1662, 0x0673d431) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -208.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 864.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 153 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005e1c11) + + + + + (0x38f7f16e, 0x716e5783) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 768.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x3c4172c4, 0x6848868e) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 95 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001882b5) + + + + + (0x3df5daf3, 0x1ac83545) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xad100179, 0xa3c984ab) + 147 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00183f8d) + + + + + (0x479f679f, 0x4034ae9f) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xad100179, 0xa3c984ab) + 147 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc72) + + + + + (0x4bfa765b, 0x56988125) + Right trials + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_GDF_Right + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 145 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x5370ebed, 0x0c585b3e) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 82 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x588d7801, 0x046ccfd0) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5bdc6ef9, 0x5aa3869a) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00e8c51f, 0x7307b641) + + (0x3c4172c4, 0x6848868e) + 0 + + + (0x04a03512, 0x1acdb2f3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 338 + + + (0x358ae8b5, 0x0f8bacd1) + 768 + + + (0x3f0a3b27, 0x570913d2) + 347 + + + (0x6267b5c5, 0x676e3e42) + 768 + + + + + (0x04ce1e05, 0x6618d639) + + (0x287d352b, 0x4f872476) + 0 + + + (0x588d7801, 0x046ccfd0) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 391 + + + (0x358ae8b5, 0x0f8bacd1) + 960 + + + (0x3f0a3b27, 0x570913d2) + 427 + + + (0x6267b5c5, 0x676e3e42) + 960 + + + + + (0x15759e10, 0x340cf814) + + (0x122ee495, 0x1815b528) + 1 + + + (0x0a5a6a4a, 0x1d92a778) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -41 + + + (0x358ae8b5, 0x0f8bacd1) + 871 + + + (0x3f0a3b27, 0x570913d2) + 523 + + + (0x6267b5c5, 0x676e3e42) + 849 + + + + + (0x28100d7e, 0x160f0e08) + + (0x122ee495, 0x1815b528) + 1 + + + (0x4bfa765b, 0x56988125) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -41 + + + (0x358ae8b5, 0x0f8bacd1) + 871 + + + (0x3f0a3b27, 0x570913d2) + 123 + + + (0x6267b5c5, 0x676e3e42) + 967 + + + + + (0x30874552, 0x325b714b) + + (0x024f66fc, 0x20e58fa8) + 0 + + + (0x3df5daf3, 0x1ac83545) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 167 + + + (0x358ae8b5, 0x0f8bacd1) + 760 + + + (0x3f0a3b27, 0x570913d2) + 187 + + + (0x6267b5c5, 0x676e3e42) + 768 + + + + + (0x30d28136, 0x1f69c6b4) + + (0x312e1662, 0x0673d431) + 2 + + + (0x122ee495, 0x1815b528) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -185 + + + (0x358ae8b5, 0x0f8bacd1) + 879 + + + (0x3f0a3b27, 0x570913d2) + -85 + + + (0x6267b5c5, 0x676e3e42) + 871 + + + + + (0x313a4ad2, 0x56bc07db) + + (0x38f7f16e, 0x716e5783) + 0 + + + (0x122ee495, 0x1815b528) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -110 + + + (0x358ae8b5, 0x0f8bacd1) + 768 + + + (0x3f0a3b27, 0x570913d2) + -85 + + + (0x6267b5c5, 0x676e3e42) + 856 + + + + + (0x3160bce4, 0x0914bd54) + + (0x038cae1a, 0x03e0da64) + 0 + + + (0x024f66fc, 0x20e58fa8) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 60 + + + (0x358ae8b5, 0x0f8bacd1) + 864 + + + (0x3f0a3b27, 0x570913d2) + 123 + + + (0x6267b5c5, 0x676e3e42) + 760 + + + + + (0x37d8fd2e, 0x06fefab6) + + (0x04a03512, 0x1acdb2f3) + 0 + + + (0x5bdc6ef9, 0x5aa3869a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 391 + + + (0x358ae8b5, 0x0f8bacd1) + 768 + + + (0x3f0a3b27, 0x570913d2) + 427 + + + (0x6267b5c5, 0x676e3e42) + 768 + + + + + (0x44cb5f82, 0x735c7482) + + (0x5bdc6ef9, 0x5aa3869a) + 0 + + + (0x0a5a6a4a, 0x1d92a778) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 471 + + + (0x358ae8b5, 0x0f8bacd1) + 768 + + + (0x3f0a3b27, 0x570913d2) + 523 + + + (0x6267b5c5, 0x676e3e42) + 864 + + + + + (0x44f06b2c, 0x76de91f1) + + (0x5370ebed, 0x0c585b3e) + 0 + + + (0x2f50951f, 0x121e5699) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 295 + + + (0x358ae8b5, 0x0f8bacd1) + 960 + + + (0x3f0a3b27, 0x570913d2) + 304 + + + (0x6267b5c5, 0x676e3e42) + 960 + + + + + (0x492bf2ad, 0x55e3beba) + + (0x3df5daf3, 0x1ac83545) + 0 + + + (0x1a3f9b29, 0x7bb960b3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 231 + + + (0x358ae8b5, 0x0f8bacd1) + 768 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 768 + + + + + (0x4e615cc5, 0x614b5cc1) + + (0x479f679f, 0x4034ae9f) + 0 + + + (0x5370ebed, 0x0c585b3e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 231 + + + (0x358ae8b5, 0x0f8bacd1) + 960 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 960 + + + + + (0x514389a6, 0x441cd26b) + + (0x038cae1a, 0x03e0da64) + 0 + + + (0x4bfa765b, 0x56988125) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 60 + + + (0x358ae8b5, 0x0f8bacd1) + 864 + + + (0x3f0a3b27, 0x570913d2) + 123 + + + (0x6267b5c5, 0x676e3e42) + 952 + + + + + (0x5dbeaea6, 0x410f90ca) + + (0x122ee495, 0x1815b528) + 1 + + + (0x024f66fc, 0x20e58fa8) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -41 + + + (0x358ae8b5, 0x0f8bacd1) + 871 + + + (0x3f0a3b27, 0x570913d2) + 123 + + + (0x6267b5c5, 0x676e3e42) + 775 + + + + + (0x5eea855c, 0x250861a8) + + (0x122ee495, 0x1815b528) + 0 + + + (0x038cae1a, 0x03e0da64) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -41 + + + (0x358ae8b5, 0x0f8bacd1) + 856 + + + (0x3f0a3b27, 0x570913d2) + 6 + + + (0x6267b5c5, 0x676e3e42) + 864 + + + + + (0x61ac1023, 0x7f32c06b) + + (0x4bfa765b, 0x56988125) + 0 + + + (0x479f679f, 0x4034ae9f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 167 + + + (0x358ae8b5, 0x0f8bacd1) + 952 + + + (0x3f0a3b27, 0x570913d2) + 187 + + + (0x6267b5c5, 0x676e3e42) + 960 + + + + + (0x621ab2f1, 0x729e8025) + + (0x588d7801, 0x046ccfd0) + 0 + + + (0x0a5a6a4a, 0x1d92a778) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 471 + + + (0x358ae8b5, 0x0f8bacd1) + 960 + + + (0x3f0a3b27, 0x570913d2) + 523 + + + (0x6267b5c5, 0x676e3e42) + 879 + + + + + (0x6a37d427, 0x667a2e29) + + (0x1a3f9b29, 0x7bb960b3) + 0 + + + (0x3c4172c4, 0x6848868e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 295 + + + (0x358ae8b5, 0x0f8bacd1) + 768 + + + (0x3f0a3b27, 0x570913d2) + 304 + + + (0x6267b5c5, 0x676e3e42) + 768 + + + + + (0x6d36bf35, 0x589752d1) + + (0x2f50951f, 0x121e5699) + 0 + + + (0x287d352b, 0x4f872476) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 338 + + + (0x358ae8b5, 0x0f8bacd1) + 960 + + + (0x3f0a3b27, 0x570913d2) + 347 + + + (0x6267b5c5, 0x676e3e42) + 960 + + + + + (0x75fc2227, 0x282c4631) + + (0x0a5a6a4a, 0x1d92a778) + 0 + + + (0x24757b65, 0x29027b6f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 567 + + + (0x358ae8b5, 0x0f8bacd1) + 864 + + + (0x3f0a3b27, 0x570913d2) + 592 + + + (0x6267b5c5, 0x676e3e42) + 864 + + + + + (0x7f026ae0, 0x522c4ec6) + + (0x312e1662, 0x0673d431) + 1 + + + (0x38f7f16e, 0x716e5783) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -185 + + + (0x358ae8b5, 0x0f8bacd1) + 864 + + + (0x3f0a3b27, 0x570913d2) + -144 + + + (0x6267b5c5, 0x676e3e42) + 768 + + + + + + + (0x000008e3, 0x00002907) + <b>--::</b> Remember to <b>change the file</b> +to the one you recorded before! + + + (0x473d9a43, 0x97fc0a97) + 1104.000000 + + + (0x7234b86b, 0x2b8651a5) + -192.000000 + + + + + (0x1ee30aab, 0x79e9ca6b) + <u><b><big>Overview</big></b></u> + +This scenario should be used to train +the LDA classifier used to detect +left / right hand movements + +Just configure the <i>Generic Stream Reader</i> +box to point to the last file you recorded with +scenario <i>1-acquisition</i> or <i>4-online</i> and fast forward +this scenario. + +At the end of the training, you will have an estimation +of the classifier performance printed in the console. +If this performance is lower than 65%, just run a new +<i>1-acquisition</i> session to have better results. + + + (0x473d9a43, 0x97fc0a97) + 416.000000 + + + (0x7234b86b, 0x2b8651a5) + -160.000000 + + + + + (0x41cd6b6e, 0x28466307) + Then comes the <u>feature extraction part</u>. + +The signal is filtered in a large alpha/beta [8 30] Hz range. + +Then the <i><b>Stimulation Based Epoching</b></i> box +is used to select four seconds of signal half a second +after the instruction was shown to the user +(<i>OVTK_GDF_Left</i> and <i>OVTK_GDF_Right</i>). + +The signal is then splitted in blocks of 1 second +every 16th second and the logarithmic band power is +computed thanks to the two <i>Simple DSP</i> and +the <i>Signal Average</i> boxes. + +The matrices can then be converted in feature vectors. + +<small><i><b>note:</b> depending on what frequency range +reacts best for the subject, you may have to tune +this part of the scenario</i></small> + +<small><i><b>note:</b> whatever change you do on this +scenario, don't forget to do the same on the +classifier trainer scenario</i></small> + + + (0x473d9a43, 0x97fc0a97) + 416.000000 + + + (0x7234b86b, 0x2b8651a5) + 288.000000 + + + + + (0x55744f04, 0x18caf000) + The <i><b>Classifier Trainer</b></i> box produces a +configuration file at the end of the experiment +which will be used during online sessions. + +When the training is completed the box +outputs a stimulation <b>OVTK_StimulationId_TrainCompleted</b> +to stop the scenario through a <b><i>Player Controller</i></b> + + + (0x473d9a43, 0x97fc0a97) + 400 + + + (0x7234b86b, 0x2b8651a5) + 560 + + + + + (0x5a795b87, 0x3aac19c1) + The <b>CSP spatial filter</b> produced in the previous +scenario is used prior to the feature extraction. + + + (0x473d9a43, 0x97fc0a97) + 416.000000 + + + (0x7234b86b, 0x2b8651a5) + 32.000000 + + + + + (0x679cd99d, 0x186f367c) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 912 + + + (0x7234b86b, 0x2b8651a5) + -288 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x654b96a2, 0x47f682cd)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x2789bef1, 0x33acf367)","index":0,"name":"Default tab","parentIdentifier":"(0x654b96a2, 0x47f682cd)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x2941df8e, 0x6c7a2a1d)","index":0,"name":"Empty","parentIdentifier":"(0x2789bef1, 0x33acf367)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renard / Fabien Lotte + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Classifier Training + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Motor Imagery + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-4-online.xml b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-4-online.xml new file mode 100644 index 0000000..9a2d873 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-4-online.xml @@ -0,0 +1,1144 @@ + + 2 + OpenViBE Designer + 3.1.0 + + + + + + (0x00c4af19, 0x360e4025) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004da903) + + + + + (0x14e0f923, 0x0df1c5d6) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x32a27c59, 0x7f1e980d) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -288 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x3840709a, 0x3442f13a) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006bdf4b) + + + + + (0x3eea244d, 0x54616491) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/motor-imagery-csp-4-online-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002730c3) + + + (0xfba64161, 0x65304e21) + + + + + + (0x4a392c61, 0x765069ec) + CSP Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/csp-spatial-filter.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5a8c1c13, 0x68a2baa7) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5e704572, 0x05e86e99) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/motor-imagery-bci-config-classifier.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x5f46e728, 0x65c0dbad) + Graz Motor Imagery BCI Stimulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/motor-imagery-bci-graz-stimulator.lua + false + + + (0x007deef9, 0x2f3e95c6) + Number of Trials for Each Class + 20 + 20 + false + + + (0x2c132d6e, 0x44ab0d97) + First Class + OVTK_GDF_Left + OVTK_GDF_Left + false + + + (0x2c132d6e, 0x44ab0d97) + Second Class + OVTK_GDF_Right + OVTK_GDF_Right + false + + + (0x512a166f, 0x5c3ef83f) + Baseline Duration (in sec) + 20 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Wait For Beep Duration (in sec) + 2 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + Wait For Cue Duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Display Cue Duration (in sec) + 1.250 + 1.250 + false + + + (0x512a166f, 0x5c3ef83f) + Feedback Duration (in sec) + 3.750 + 3.750 + false + + + (0x512a166f, 0x5c3ef83f) + End of Trial Minimum Duration (in sec) + 1.500 + 1.500 + false + + + (0x512a166f, 0x5c3ef83f) + End of Trial Maximum Duration (in sec) + 3.500 + 3.500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x602bbc4d, 0x5f35c1a9) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x661c8098, 0x37ddbba0) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6e3a7dec, 0x7cf506cf) + Graz visualization + (0x00dd290d, 0x5f142820) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Show feedback + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive feedback only + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 544 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x602ceb3f, 0xd3bc74aa) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + + + (0x000046de, 0x000007d4) + + (0x32a27c59, 0x7f1e980d) + 2 + + + (0x3eea244d, 0x54616491) + 2 + + + + (0x000051d6, 0x00003d9a) + + (0x661c8098, 0x37ddbba0) + 0 + + + (0x4a392c61, 0x765069ec) + 0 + + + + (0x0000528b, 0x00002906) + + (0x5f46e728, 0x65c0dbad) + 0 + + + (0x6e3a7dec, 0x7cf506cf) + 0 + + + + (0x079f2cb9, 0x48d845f3) + + (0x32a27c59, 0x7f1e980d) + 1 + + + (0x661c8098, 0x37ddbba0) + 0 + + + + (0x1ffeda13, 0x64e650ab) + + (0x00c4af19, 0x360e4025) + 0 + + + (0x14e0f923, 0x0df1c5d6) + 0 + + + + (0x20c34aa8, 0x70492be9) + + (0x32a27c59, 0x7f1e980d) + 1 + + + (0x3eea244d, 0x54616491) + 1 + + + + (0x25ef8382, 0x4e0eb6d4) + + (0x602bbc4d, 0x5f35c1a9) + 0 + + + (0x00c4af19, 0x360e4025) + 0 + + + + (0x4974c8f6, 0x44a49857) + + (0x5e704572, 0x05e86e99) + 1 + + + (0x6e3a7dec, 0x7cf506cf) + 1 + + + + (0x4de99f33, 0x7af5f3ac) + + (0x32a27c59, 0x7f1e980d) + 0 + + + (0x3eea244d, 0x54616491) + 0 + + + + (0x4e438da6, 0x0517340b) + + (0x4a392c61, 0x765069ec) + 0 + + + (0x3840709a, 0x3442f13a) + 0 + + + + (0x6de2fa86, 0x52bb1938) + + (0x3840709a, 0x3442f13a) + 0 + + + (0x602bbc4d, 0x5f35c1a9) + 0 + + + + (0x75200afd, 0x542620b3) + + (0x5a8c1c13, 0x68a2baa7) + 0 + + + (0x5e704572, 0x05e86e99) + 0 + + + + (0x7f9a37a2, 0x75d653ba) + + (0x14e0f923, 0x0df1c5d6) + 0 + + + (0x5a8c1c13, 0x68a2baa7) + 0 + + + + + + (0x039c8963, 0x6dc2ad09) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 640 + + + (0x7234b86b, 0x2b8651a5) + -368 + + + + + (0x22059e42, 0x2f518659) + Then comes the <u>feature extraction part</u>. + +The signal is filtered in a large alpha/beta [8 30] Hz range. +The filtered signal is then splitted in blocks of 1 second +every 16th second and the logarithmic band power is +computed thanks to the two <i>Simple DSP</i> and +the <i>Signal Average</i> boxes. + +The matrices can then be converted in feature vectors. + +<small><i><b>note:</b> depending on what frequency range +reacts best for the subject, you may have to tune +this part of the scenario</i></small> + +<small><i><b>note:</b> whatever change you do on this +scenario, don't forget to do the same on the +classifier trainer scenario</i></small> + + + (0x473d9a43, 0x97fc0a97) + 240 + + + (0x7234b86b, 0x2b8651a5) + 176 + + + + + (0x322d63e9, 0x08221edb) + <u><b><big>Overview</big></b></u> + +This scenario can be used online once the +CSP spatial filter and the classifier is trained. + +<small><i><b>note:</b> the recorded files go to the +folder where the scenario xml is located +(<span color="darkblue">${Player_ScenarioDirectory}/</span>).</i></small> + + + (0x473d9a43, 0x97fc0a97) + 320.000000 + + + (0x7234b86b, 0x2b8651a5) + -176.000000 + + + + + (0x58e1b3e5, 0x57269422) + Finally, the feature vectors are classifier with an LDA +classifier. Note that the state vector of the classifier +(which in the case of the LDA is the distance to the +separation plane) is sent to the <i><b>Graz Visualization</b></i> +box for feedback ! + +In order to display correct feedback, +the <i><b>Graz Visualization</b></i> box expects a negative +value for one class and a positive value for the other +class. + + + + (0x473d9a43, 0x97fc0a97) + 240 + + + (0x7234b86b, 0x2b8651a5) + 448 + + + + + (0x651859f7, 0x3bdcf9ff) + The <b>CSP spatial filter</b> produced in the previous +scenario is used prior to the feature extraction. + + + (0x473d9a43, 0x97fc0a97) + 240 + + + (0x7234b86b, 0x2b8651a5) + -16 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x6e3a7dec, 0x7cf506cf)","childCount":0,"identifier":"(0x64aa5b42, 0x12135d0a)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":505,"identifier":"(0x786b4ac2, 0x1b97fc59)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":603},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x6464f9a2, 0x664e4548)","index":0,"name":"Default tab","parentIdentifier":"(0x786b4ac2, 0x1b97fc59)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x3d476141, 0x6a464a67)","index":0,"name":"Empty","parentIdentifier":"(0x6464f9a2, 0x664e4548)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renard / Fabien Lotte + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Online Use + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Motor Imagery + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-5-replay.xml b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-5-replay.xml new file mode 100644 index 0000000..b4e8675 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-5-replay.xml @@ -0,0 +1,1720 @@ + + 2 + OpenViBE Designer + 3.1.0 + + + + + + (0x00000043, 0x00007650) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0053c72e) + + + + + (0x0000041b, 0x00004394) + Stimulation Filter + (0x02f96101, 0x5e647cb8) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x6f752dd0, 0x082a321e) + Modified Stimulations + + + + + (0x09e59e57, 0x8d4a553a) + Default action + Reject + Reject + false + + + (0x512a166f, 0x5c3ef83f) + Time range begin + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time range end + 0 + 0 + false + + + (0x09e59e57, 0x8d4a553a) + Action to perform + Select + Select + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range begin + OVTK_StimulationId_Label_00 + OVTK_GDF_Left + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range end + OVTK_StimulationId_Label_0F + OVTK_GDF_Left + false + + + (0x09e59e57, 0x8d4a553a) + Action to perform(1) + Select + Select + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range begin(1) + OVTK_StimulationId_Label_00 + OVTK_GDF_Right + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range end(1) + OVTK_StimulationId_Label_0F + OVTK_GDF_Right + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 479 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0x47859b3f, 0x1dfdf5cd) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00571289) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000483, 0x00002eb9) + Switch director + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/motor-imagery-bci-epoch-selector.lua + false + + + (0x512a166f, 0x5c3ef83f) + offset + 0.5 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + duration + 4.0 + 4.0 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x057c1227) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000079c, 0x00005479) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004c4c0d) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001124, 0x00007915) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x5ba36127, 0x195feae1) + Output + + + (0x5ba36127, 0x195feae1) + Output(1) + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_GDF_Correct + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_GDF_Incorrect + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x020b7c9c) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000011ba, 0x0000150f) + Confusion Matrix + (0x1ab625da, 0x3b2502ce) + + + (0x6f752dd0, 0x082a321e) + Targets + + + (0x6f752dd0, 0x082a321e) + Classification results + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Percentages + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Sums + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_StimulationId_Label_00 + OVTK_GDF_Left + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_StimulationId_Label_01 + OVTK_GDF_Right + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 559 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0x05cf579a, 0x80d8b480) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00549fe0) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001988, 0x0000550d) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -320 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x016c3085) + + + + + (0x00002a91, 0x00000f38) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x207c9054, 0x3c841b63) + 560 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005a4c52) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003664, 0x00003b68) + CSP Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 2.703847e-001 -2.033485e-001 2.403200e-001 2.356385e-001 3.924334e-001 2.392066e-001 1.127002e-001 5.732516e-001 3.104992e-001 2.895371e-001 1.986914e-001 -2.802680e-001 8.642486e-002 -2.668905e-001 -2.873133e-001 -3.079680e-001 -2.311904e-001 -3.049968e-001 -3.204301e-001 -4.425807e-001 -2.982545e-001 -3.624581e-001 -1.744479e-002 -7.034878e-001 -5.995533e-003 -1.229489e-001 1.247895e-001 2.070440e-002 6.842287e-002 -2.541404e-001 -2.561868e-001 -3.879915e-001 4.338307e-001 1.443247e-001 3.069893e-001 3.027873e-001 3.956776e-001 2.813833e-001 2.775941e-001 3.539172e-001 2.829927e-001 3.027860e-001 3.108204e-001 2.946543e-001 8.225412e-001 2.972170e-001 1.898263e-001 2.250992e-001 1.687568e-001 -1.534859e-001 -2.300909e-001 4.962294e-002 1.434820e-001 1.137746e-001 8.609021e-002 2.163431e-001 2.683773e-001 3.076638e-001 3.600542e-001 3.077418e-001 2.519831e-001 2.256527e-001 3.292362e-001 2.892913e-001 3.994603e-001 3.099987e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 11 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/csp-spatial-filter.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00565146) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000368c, 0x0000054c) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004e7e49) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000043ad, 0x00005e02) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005a1d73) + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000545c, 0x00005cb8) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0056b4d4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000055d7, 0x000022f8) + Accuracy Measure + (0x48395ce7, 0x17d62550) + + + (0x6f752dd0, 0x082a321e) + Targets + + + (0x6f752dd0, 0x082a321e) + LDA + + + + + (0x1fa7a38f, 0x54edbe0b) + 671 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0x8942cf6b, 0x91b31641) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00582ba6) + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000648e, 0x00007040) + Confusion Matrix + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 623 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00513160) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006732, 0x00007630) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01297a6b) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007377, 0x00000002) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0050b081) + + + + + (0x1c7891ae, 0x64ebeedf) + Graz visualization + (0x00dd290d, 0x5f142820) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Show feedback + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive feedback only + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x602ceb3f, 0xd3bc74aa) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x43e647bb, 0x1d54f89c) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/motor-imagery-bci-config-classifier.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 656 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + + + (0x000002ee, 0x00005db9) + + (0x00001988, 0x0000550d) + 1 + + + (0x00006732, 0x00007630) + 0 + + + + (0x000003fb, 0x000047fe) + + (0x00007377, 0x00000002) + 0 + + + (0x0000368c, 0x0000054c) + 0 + + + + (0x00000948, 0x00000383) + + (0x0000079c, 0x00005479) + 0 + + + (0x00007377, 0x00000002) + 0 + + + + (0x00000a11, 0x000076e8) + + (0x0000041b, 0x00004394) + 0 + + + (0x000011ba, 0x0000150f) + 0 + + + + (0x00002eee, 0x00004d50) + + (0x00001988, 0x0000550d) + 2 + + + (0x00002a91, 0x00000f38) + 0 + + + + (0x00003301, 0x00003b8f) + + (0x00000483, 0x00002eb9) + 0 + + + (0x00001124, 0x00007915) + 0 + + + + (0x000036ad, 0x000016e4) + + (0x00000043, 0x00007650) + 0 + + + (0x0000079c, 0x00005479) + 0 + + + + (0x000037ca, 0x0000376b) + + (0x00001988, 0x0000550d) + 2 + + + (0x00000483, 0x00002eb9) + 0 + + + + (0x00003ac6, 0x00000e82) + + (0x000043ad, 0x00005e02) + 1 + + + (0x0000041b, 0x00004394) + 0 + + + + (0x000044e5, 0x000078b9) + + (0x00003664, 0x00003b68) + 0 + + + (0x00000043, 0x00007650) + 0 + + + + (0x000045ce, 0x00001ae9) + + (0x00001988, 0x0000550d) + 2 + + + (0x000043ad, 0x00005e02) + 1 + + + + (0x00004b17, 0x00005ab2) + + (0x00006732, 0x00007630) + 0 + + + (0x00001124, 0x00007915) + 1 + + + + (0x000054a8, 0x000025b7) + + (0x00001124, 0x00007915) + 0 + + + (0x00003664, 0x00003b68) + 0 + + + + (0x000061ca, 0x000004b5) + + (0x000011ba, 0x0000150f) + 0 + + + (0x0000648e, 0x00007040) + 0 + + + + (0x00007915, 0x000064f0) + + (0x0000041b, 0x00004394) + 0 + + + (0x000055d7, 0x000022f8) + 0 + + + + (0x000079d9, 0x00005bbe) + + (0x0000368c, 0x0000054c) + 0 + + + (0x0000545c, 0x00005cb8) + 0 + + + + (0x0a4a78cb, 0x6f39bd72) + + (0x43e647bb, 0x1d54f89c) + 1 + + + (0x1c7891ae, 0x64ebeedf) + 1 + + + + (0x10fcdb78, 0x79105253) + + (0x43e647bb, 0x1d54f89c) + 0 + + + (0x000011ba, 0x0000150f) + 1 + + + + (0x11774b65, 0x3894ad15) + + (0x43e647bb, 0x1d54f89c) + 0 + + + (0x000055d7, 0x000022f8) + 1 + + + + (0x58745ed2, 0x740965b9) + + (0x0000545c, 0x00005cb8) + 0 + + + (0x43e647bb, 0x1d54f89c) + 0 + + + + (0x63eabb71, 0x3166b393) + + (0x000043ad, 0x00005e02) + 1 + + + (0x1c7891ae, 0x64ebeedf) + 0 + + + + + + (0x000007fb, 0x000049d1) + <i>The Classifier Processor</i> classifies + everytime it receives a new feature vector. + +If we want an accurate performance computation, +we need to classify only when the participant +is actually doing the task, i.e. +when an instruction (left or right) is received. +This is achieved by the switch above. + + + (0x473d9a43, 0x97fc0a97) + 1024.000000 + + + (0x7234b86b, 0x2b8651a5) + 384.000000 + + + + + (0x00000f95, 0x0000367f) + Then comes the <u>feature extraction part</u>. + +The signal is filtered in a large alpha/beta [8 30] Hz range. +The filtered signal is then splitted in blocks of 1 second +every 16th second and the logarithmic band power is +computed thanks to the two <i>Simple DSP</i> and +the <i>Signal Average</i> boxes. + +The matrices can then be converted in feature vectors. + +<small><i><b>note:</b> depending on what frequency range +reacts best for the subject, you may have to tune +this part of the scenario</i></small> + +<small><i><b>note:</b> whatever change you do on this +scenario, don't forget to do the same on the +classifier trainer scenario</i></small> + + + (0x473d9a43, 0x97fc0a97) + 259.000000 + + + (0x7234b86b, 0x2b8651a5) + 192.000000 + + + + + (0x000018cb, 0x000046cb) + The <b>CSP spatial filter</b> produced in the previous +scenario is used prior to the feature extraction. + + + (0x473d9a43, 0x97fc0a97) + 259.000000 + + + (0x7234b86b, 0x2b8651a5) + 0.000000 + + + + + (0x00002c9f, 0x00007ffe) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 592 + + + (0x7234b86b, 0x2b8651a5) + -368 + + + + + (0x000040df, 0x000021a2) + The <b>Confusion Matrix</b> computation needs +the instruction flow, and the classification flow +to compare them, for each class. + +As the instructions (OVTK_StimulationId_Left and _Right) +are included in the stimulation stream, we need to filter +away the other information in it with <b>Stimulation Filter</b>. + +Same goes for the <b>Classifier Accuracy Measure</b> that +computes the global performance of the classifier. + + + (0x473d9a43, 0x97fc0a97) + 1024.000000 + + + (0x7234b86b, 0x2b8651a5) + 608.000000 + + + + + (0x00004b27, 0x00001dea) + <u><b><big>Overview</big></b></u> + +This scenario can be used to replay online sessions. +The scenario displays the classification confusion matrix, +along with the global performance evolving during the sessions. + +With this scenario, you can watch the performance of the classifier +during <b>time</b>, and for <b>each class</b>. + + + (0x473d9a43, 0x97fc0a97) + 272.000000 + + + (0x7234b86b, 0x2b8651a5) + -224.000000 + + + + + (0x00007101, 0x0000027a) + Here we want to classify only during trials. This is achieved by +a simple lua script and a stream switch. + +The <b>Switch Director</b> is a Lua scripting box +that controls a <b>Stream Switch</b> box. +When an instruction is received (OVTK_StimulationId_Right / Left) +the switch director tells the stream switch to redirect +its signal input to the first output (i.e. routed to a classifier). +Otherwise, the feature input is redirected to the second output, +i.e. nothing. + + + (0x473d9a43, 0x97fc0a97) + 1056.000000 + + + (0x7234b86b, 0x2b8651a5) + -192.000000 + + + + + (0x00007f45, 0x00000c77) + Finally, the feature vectors are classified with an LDA +classifier. Note that the state vector of the classifier +(which in the case of the LDA is the distance to the +separation plane) is sent to the <i><b>Graz Visualization</b></i> +box for feedback ! + +In order to display correct feedback, +the <i><b>Graz Visualization</b></i> box expects a negative +value for one class and a positive value for the other +class. + + + + (0x473d9a43, 0x97fc0a97) + 256.000000 + + + (0x7234b86b, 0x2b8651a5) + 576.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":669,"identifier":"(0x00000356, 0x00001399)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":725},{"boxIdentifier":"(0x1c7891ae, 0x64ebeedf)","childCount":0,"identifier":"(0x1bc5ceb7, 0x05a89b21)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000031be, 0x00007b71)","index":0,"name":"Default tab","parentIdentifier":"(0x00000356, 0x00001399)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":414,"identifier":"(0x0000076f, 0x00001d59)","index":0,"maxDividerPosition":689,"name":"Horizontal split","parentIdentifier":"(0x000031be, 0x00007b71)","type":5},{"boxIdentifier":"(0x0000648e, 0x00007040)","childCount":0,"identifier":"(0x000050d5, 0x00006da6)","index":0,"parentIdentifier":"(0x0000076f, 0x00001d59)","type":3},{"boxIdentifier":"(0x000055d7, 0x000022f8)","childCount":0,"identifier":"(0x00006c94, 0x00003e16)","index":1,"parentIdentifier":"(0x0000076f, 0x00001d59)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renad / Fabien Lotte + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + File Replay + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Motor Imagery + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/motor-imagery-bci-epoch-selector.lua b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/motor-imagery-bci-epoch-selector.lua new file mode 100644 index 0000000..3959368 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/motor-imagery-bci-epoch-selector.lua @@ -0,0 +1,50 @@ + +g_offset = nil +g_duration = nil + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + g_offset = box:get_setting(2) + g_duration = box:get_setting(3) +end + +-- this function is called when the box is uninitialized +function uninitialize(box) + +end + +function wait_until(box, time) + while box:get_current_time() < time do + box:sleep() + end +end + + +function wait_for(box, duration) + wait_until(box, box:get_current_time() + duration) +end + + + +function process(box) + -- loops on every received stimulation for a given input + while box:keep_processing() do + for stimulation = 1, box:get_stimulation_count(1) do + + -- gets the received stimulation + identifier, date, duration = box:get_stimulation(1, 1) + -- discards it + box:remove_stimulation(1, 1) + + -- delay the OVTK_GDF_Left and Right + if identifier == OVTK_GDF_Left or identifier == OVTK_GDF_Right then + box:send_stimulation(1, OVTK_GDF_Correct, date+g_offset, 0) + box:send_stimulation(1, OVTK_GDF_Incorrect, date+g_offset+g_duration, 0) + end + end + box:sleep() + end +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/motor-imagery-bci-graz-stimulator.lua b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/motor-imagery-bci-graz-stimulator.lua new file mode 100644 index 0000000..d84746f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/motor-imagery-bci-graz-stimulator.lua @@ -0,0 +1,97 @@ + +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + number_of_trials = box:get_setting(2) + first_class = _G[box:get_setting(3)] + second_class = _G[box:get_setting(4)] + baseline_duration = box:get_setting(5) + wait_for_beep_duration = box:get_setting(6) + wait_for_cue_duration = box:get_setting(7) + display_cue_duration = box:get_setting(8) + feedback_duration = box:get_setting(9) + end_of_trial_min_duration = box:get_setting(10) + end_of_trial_max_duration = box:get_setting(11) + + -- initializes random seed + math.randomseed(os.time()) + + -- fill the sequence table with predifined order + sequence = {} + for i = 1, number_of_trials do + table.insert(sequence, 1, first_class) + table.insert(sequence, 1, second_class) + end + + -- randomize the sequence + for i = 1, number_of_trials do + a = math.random(1, number_of_trials*2) + b = math.random(1, number_of_trials*2) + swap = sequence[a] + sequence[a] = sequence[b] + sequence[b] = swap + end + +end + +function process(box) + + local t=0 + + -- manages baseline + + box:send_stimulation(1, OVTK_StimulationId_ExperimentStart, t, 0) + t = t + 5 + + box:send_stimulation(1, OVTK_StimulationId_BaselineStart, t, 0) + box:send_stimulation(1, OVTK_StimulationId_Beep, t, 0) + t = t + baseline_duration + + box:send_stimulation(1, OVTK_StimulationId_BaselineStop, t, 0) + box:send_stimulation(1, OVTK_StimulationId_Beep, t, 0) + t = t + 5 + + -- manages trials + + for i = 1, number_of_trials*2 do + + -- first display cross on screen + + box:send_stimulation(1, OVTK_GDF_Start_Of_Trial, t, 0) + box:send_stimulation(1, OVTK_GDF_Cross_On_Screen, t, 0) + t = t + wait_for_beep_duration + + -- warn the user the cue is going to appear + + box:send_stimulation(1, OVTK_StimulationId_Beep, t, 0) + t = t + wait_for_cue_duration + + -- display cue + + box:send_stimulation(1, sequence[i], t, 0) + t = t + display_cue_duration + + -- provide feedback + + box:send_stimulation(1, OVTK_GDF_Feedback_Continuous, t, 0) + t = t + feedback_duration + + -- ends trial + + box:send_stimulation(1, OVTK_GDF_End_Of_Trial, t, 0) + t = t + math.random(end_of_trial_min_duration, end_of_trial_max_duration) + + end + + -- send end for completeness + box:send_stimulation(1, OVTK_GDF_End_Of_Session, t, 0) + t = t + 5 + + box:send_stimulation(1, OVTK_StimulationId_Train, t, 0) + t = t + 1 + + -- used to cause the acquisition scenario to stop + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, t, 0) + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/signals/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/signals/README.txt new file mode 100644 index 0000000..8eaa204 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/signals/README.txt @@ -0,0 +1,3 @@ + +The scenario will record its signals here. + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-0-signal-monitoring.xml b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-0-signal-monitoring.xml new file mode 100644 index 0000000..b1a5eef --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-0-signal-monitoring.xml @@ -0,0 +1,816 @@ + + 1 + OpenVIBE + 0.0.2 + + + (0x00002f18, 0x00001286) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 928 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xac367a9c, 0x2da95abe) + 6 + + + (0xad100179, 0xa3c984ab) + 67 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005659, 0x0000361f) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112.000000 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 960.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00005c3e, 0x00007498) + Filtered + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 543.000000 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 880.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00006ead, 0x00003c67) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 40.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 119 + + + + + (0x00007c73, 0x00000356) + Raw + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 544.000000 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 992.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + + + (0x00000753, 0x000018d0) + + (0x00006ead, 0x00003c67) + 0 + + + (0x00002f18, 0x00001286) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 275 + + + (0x358ae8b5, 0x0f8bacd1) + 832 + + + (0x3f0a3b27, 0x570913d2) + 376 + + + (0x6267b5c5, 0x676e3e42) + 913 + + + + + (0x00000ec5, 0x00003e89) + + (0x00002f18, 0x00001286) + 0 + + + (0x00005c3e, 0x00007498) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 425 + + + (0x358ae8b5, 0x0f8bacd1) + 913 + + + (0x3f0a3b27, 0x570913d2) + 513 + + + (0x6267b5c5, 0x676e3e42) + 865 + + + + + (0x0000136c, 0x0000090f) + + (0x00005659, 0x0000361f) + 1 + + + (0x00006ead, 0x00003c67) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 131 + + + (0x358ae8b5, 0x0f8bacd1) + 945 + + + (0x3f0a3b27, 0x570913d2) + 239 + + + (0x6267b5c5, 0x676e3e42) + 832 + + + + + (0x00001c54, 0x00000572) + + (0x00002f18, 0x00001286) + 2 + + + (0x00005c3e, 0x00007498) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 425 + + + (0x358ae8b5, 0x0f8bacd1) + 943 + + + (0x3f0a3b27, 0x570913d2) + 513 + + + (0x6267b5c5, 0x676e3e42) + 880 + + + + + (0x000039c1, 0x00001feb) + + (0x00002f18, 0x00001286) + 1 + + + (0x00007c73, 0x00000356) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 425 + + + (0x358ae8b5, 0x0f8bacd1) + 928 + + + (0x3f0a3b27, 0x570913d2) + 514 + + + (0x6267b5c5, 0x676e3e42) + 977 + + + + + (0x00005e63, 0x00002c5c) + + (0x00005659, 0x0000361f) + 2 + + + (0x00002f18, 0x00001286) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 131 + + + (0x358ae8b5, 0x0f8bacd1) + 960 + + + (0x3f0a3b27, 0x570913d2) + 376 + + + (0x6267b5c5, 0x676e3e42) + 943 + + + + + (0x00006235, 0x0000125e) + + (0x00005659, 0x0000361f) + 1 + + + (0x00002f18, 0x00001286) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 131 + + + (0x358ae8b5, 0x0f8bacd1) + 945 + + + (0x3f0a3b27, 0x570913d2) + 376 + + + (0x6267b5c5, 0x676e3e42) + 928 + + + + + (0x00007df2, 0x00006240) + + (0x00002f18, 0x00001286) + 2 + + + (0x00007c73, 0x00000356) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 425 + + + (0x358ae8b5, 0x0f8bacd1) + 943 + + + (0x3f0a3b27, 0x570913d2) + 514 + + + (0x6267b5c5, 0x676e3e42) + 992 + + + + + + + (0x0000327c, 0x00001ecb) + The <i>Temporal Filter</i> +box transform the signal +so you can see what is actually +used online. + + + (0x473d9a43, 0x97fc0a97) + 640 + + + (0x7234b86b, 0x2b8651a5) + 256 + + + + + (0x00005da0, 0x00001433) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 944 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + (0x00006516, 0x00003c62) + <u><b><big>Overview</big></b></u> + +This scenario can be used in order +to check the quality of the signals +before starting an experiment. + +One should <u>definitely</u> +check the quality of the signals +and ensure that : + +- <b>eye blinks</b> are visible +- <b>jaw clenching</b> are visible +- <b>alpha waves</b> are visible when closing eyes + + + (0x473d9a43, 0x97fc0a97) + 1184 + + + (0x7234b86b, 0x2b8651a5) + 272 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":635,"identifier":"(0x0000553d, 0x000030ba)","index":0,"name":"signals","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":783},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000018cd, 0x00004f25)","index":0,"name":"tab","parentIdentifier":"(0x0000553d, 0x000030ba)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":293,"identifier":"(0x00001b03, 0x00002a97)","index":0,"maxDividerPosition":590,"name":"Vertical split","parentIdentifier":"(0x000018cd, 0x00004f25)","type":4},{"boxIdentifier":"(0x00007c73, 0x00000356)","childCount":0,"identifier":"(0x00002e79, 0x000049e3)","index":0,"parentIdentifier":"(0x00001b03, 0x00002a97)","type":3},{"boxIdentifier":"(0x00005c3e, 0x00007498)","childCount":0,"identifier":"(0x00000c4b, 0x00007127)","index":1,"parentIdentifier":"(0x00001b03, 0x00002a97)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renard + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Signal Monitoring + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Motor Imagery + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-1-acquisition.xml b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-1-acquisition.xml new file mode 100644 index 0000000..7a2de65 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-1-acquisition.xml @@ -0,0 +1,584 @@ + + 2 + OpenViBE Designer + 3.0.0 + + + + + + (0x00000de5, 0x00006f3d) + Graz Motor Imagery BCI Stimulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/motor-imagery-bci-graz-stimulator.lua + false + + + (0x007deef9, 0x2f3e95c6) + Number of Trials for Each Class + 20 + 20 + false + + + (0x2c132d6e, 0x44ab0d97) + First Class + OVTK_GDF_Left + OVTK_GDF_Left + false + + + (0x2c132d6e, 0x44ab0d97) + Second Class + OVTK_GDF_Right + OVTK_GDF_Right + false + + + (0x512a166f, 0x5c3ef83f) + Baseline Duration (in sec) + 20 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Wait For Beep Duration (in sec) + 2 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + Wait For Cue Duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Display Cue Duration (in sec) + 1.250 + 1.250 + false + + + (0x512a166f, 0x5c3ef83f) + Feedback Duration (in sec) + 3.750 + 3.750 + false + + + (0x512a166f, 0x5c3ef83f) + End of Trial Minimum Duration (in sec) + 1.500 + 1.500 + false + + + (0x512a166f, 0x5c3ef83f) + End of Trial Maximum Duration (in sec) + 3.500 + 3.500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x000013d3, 0x000029d9) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/motor-imagery-1-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002730c3) + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003f97, 0x0000658d) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000430f, 0x00004aa4) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x42570b5c, 0x0bba079c) + Graz visualization + (0x00dd290d, 0x5f142820) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Show feedback + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive feedback only + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 611 + + + (0x4e7b798a, 0x183beafb) + (0x602ceb3f, 0xd3bc74aa) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + + + (0x00000477, 0x000079b6) + + (0x00000de5, 0x00006f3d) + 0 + + + (0x42570b5c, 0x0bba079c) + 0 + + + + (0x000012ec, 0x00006d3e) + + (0x0000430f, 0x00004aa4) + 2 + + + (0x000013d3, 0x000029d9) + 2 + + + + (0x000017d1, 0x000042cf) + + (0x0000430f, 0x00004aa4) + 2 + + + (0x00003f97, 0x0000658d) + 0 + + + + (0x000020ed, 0x00002f60) + + (0x0000430f, 0x00004aa4) + 1 + + + (0x000013d3, 0x000029d9) + 1 + + + + (0x00006ce5, 0x00005a2d) + + (0x0000430f, 0x00004aa4) + 0 + + + (0x000013d3, 0x000029d9) + 0 + + + + + + (0x00003459, 0x0000263e) + <u><b>Note:</b></u> It is always a good idea to +monitor the signals during an experiment + + + (0x473d9a43, 0x97fc0a97) + 976 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + (0x00003f81, 0x00006bfa) + The Graz Visualization box will send the timeline +markers directly to Acquisition Server using the +TCP Tagging plugin. The server will then attach them +appropriately to the EEG stream. + + + (0x473d9a43, 0x97fc0a97) + 288.000000 + + + (0x7234b86b, 0x2b8651a5) + -128.000000 + + + + + (0x000045c5, 0x00003961) + <u><b><big>Overview</big></b></u> + +This scenario can be used as a first +step to collect some training data. This +data will later be used to train a classifier +for online use. + +When you start this scenario, just wait 30 +seconds before it starts the instruction sequence. + +You will then be presented left / right arrows to +let you imagine left / right hand movements. +There will be 20 arrows of each side. + +<small><i><b>note:</b> the recorded files go to the +folder where the scenario xml is located +(<span color="darkblue">${Player_ScenarioDirectory}/</span>).</i></small> + + + (0x473d9a43, 0x97fc0a97) + 976 + + + (0x7234b86b, 0x2b8651a5) + -176 + + + + + (0x0000520b, 0x000068f6) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 544 + + + (0x7234b86b, 0x2b8651a5) + -288 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":505,"identifier":"(0x00006479, 0x00004325)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":608},{"boxIdentifier":"(0x42570b5c, 0x0bba079c)","childCount":0,"identifier":"(0x1dfd166f, 0x4da413ec)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00000940, 0x00007014)","index":0,"name":"Default tab","parentIdentifier":"(0x00006479, 0x00004325)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000053b1, 0x0000293b)","index":0,"name":"Empty","parentIdentifier":"(0x00000940, 0x00007014)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renard / Fabien Lotte + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Data Acquisition + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Motor Imagery + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-2-classifier-trainer.xml b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-2-classifier-trainer.xml new file mode 100644 index 0000000..e70c94c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-2-classifier-trainer.xml @@ -0,0 +1,2397 @@ + + 1 + OpenViBE + 1.1.0+git + + + (0x02e67945, 0x5ea8d309) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/motor-imagery-bci-config-classifier.cfg + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_GDF_Left + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_GDF_Right + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 7 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 752.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 256.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0841694e, 0x28e40f42) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.500000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_GDF_Right + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 189 + + + + + (0x09529b60, 0x70991eff) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 480 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 82 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1074abc4, 0x70c7daba) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 82 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x11a6038b, 0x7157c282) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 512 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 153 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005e1c11) + + + + + (0x1396fde6, 0x1c649749) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 512 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 59 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc7a) + + + (0xfba64161, 0x65304e21) + + + + + + (0x1807c3c8, 0x2e5c15b2) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 95 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001919ab) + + + + + (0x1a88b934, 0x580bfc30) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 82 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1f046833, 0x21a8a876) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 59 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001882ae) + + + (0xfba64161, 0x65304e21) + + + + + + (0x2b88852d, 0x43d7a771) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xad100179, 0xa3c984ab) + 132 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4c1eab6f, 0x0e8c522c) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.500000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_GDF_Left + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 189 + + + + + (0x4cd78e38, 0x35301f84) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5045ebd9, 0x67325c0b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 848 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e001785) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x52a5790c, 0x13d24266) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xad100179, 0xa3c984ab) + 147 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc72) + + + + + (0x52e2d2a3, 0x4d9f5ea9) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 95 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001882b5) + + + + + (0x558c587f, 0x223f3b66) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a79f8) + + + + + (0x71322e63, 0x41ba161a) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xad100179, 0xa3c984ab) + 147 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00183f8d) + + + + + (0x75beae35, 0x606e8c20) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 480 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 82 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x75e5990a, 0x59c95a67) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x76b6b638, 0x0c6e446a) + Surface Laplacian + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 4;0;-1;0;-1;-1;0;0;-1;0;0;4;0;-1;0;0;-1;-1;0;-1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 2 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 10 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 125 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000045ca, 0x00002f8b) + + (0x1f046833, 0x21a8a876) + 1 + + + (0x02e67945, 0x5ea8d309) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 263 + + + (0x358ae8b5, 0x0f8bacd1) + 263 + + + (0x3f0a3b27, 0x570913d2) + 731 + + + (0x6267b5c5, 0x676e3e42) + 241 + + + + + (0x017d7261, 0x49255256) + + (0x11a6038b, 0x7157c282) + 1 + + + (0x1396fde6, 0x1c649749) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -121 + + + (0x358ae8b5, 0x0f8bacd1) + 512 + + + (0x3f0a3b27, 0x570913d2) + -101 + + + (0x6267b5c5, 0x676e3e42) + 504 + + + + + (0x06e5f642, 0x7af6948a) + + (0x75beae35, 0x606e8c20) + 0 + + + (0x1807c3c8, 0x2e5c15b2) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 503 + + + (0x358ae8b5, 0x0f8bacd1) + 384 + + + (0x3f0a3b27, 0x570913d2) + 512 + + + (0x6267b5c5, 0x676e3e42) + 384 + + + + + (0x076b541e, 0x4295b37a) + + (0x1807c3c8, 0x2e5c15b2) + 0 + + + (0x1074abc4, 0x70c7daba) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 546 + + + (0x358ae8b5, 0x0f8bacd1) + 384 + + + (0x3f0a3b27, 0x570913d2) + 555 + + + (0x6267b5c5, 0x676e3e42) + 384 + + + + + (0x0fb9552e, 0x72e04408) + + (0x1f046833, 0x21a8a876) + 0 + + + (0x0841694e, 0x28e40f42) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 263 + + + (0x358ae8b5, 0x0f8bacd1) + 248 + + + (0x3f0a3b27, 0x570913d2) + 336 + + + (0x6267b5c5, 0x676e3e42) + 376 + + + + + (0x1658a066, 0x2ce1e19e) + + (0x1f046833, 0x21a8a876) + 0 + + + (0x4c1eab6f, 0x0e8c522c) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 263 + + + (0x358ae8b5, 0x0f8bacd1) + 248 + + + (0x3f0a3b27, 0x570913d2) + 336 + + + (0x6267b5c5, 0x676e3e42) + 120 + + + + + (0x17c7ef69, 0x6457db07) + + (0x75e5990a, 0x59c95a67) + 0 + + + (0x02e67945, 0x5ea8d309) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 663 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 731 + + + (0x6267b5c5, 0x676e3e42) + 256 + + + + + (0x1bb3cb29, 0x04e6f5f4) + + (0x1a88b934, 0x580bfc30) + 0 + + + (0x75e5990a, 0x59c95a67) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 599 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 619 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x1e23e99e, 0x6b3cf5e0) + + (0x2b88852d, 0x43d7a771) + 0 + + + (0x5194b6cb, 0x7e001785) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -14 + + + (0x358ae8b5, 0x0f8bacd1) + 256 + + + (0x3f0a3b27, 0x570913d2) + -5 + + + (0x6267b5c5, 0x676e3e42) + 256 + + + + + (0x21356122, 0x4785d4bd) + + (0x1396fde6, 0x1c649749) + 1 + + + (0x1f046833, 0x21a8a876) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -57 + + + (0x358ae8b5, 0x0f8bacd1) + 519 + + + (0x3f0a3b27, 0x570913d2) + 219 + + + (0x6267b5c5, 0x676e3e42) + 263 + + + + + (0x2d71872c, 0x4af9aa82) + + (0x0841694e, 0x28e40f42) + 0 + + + (0x52a5790c, 0x13d24266) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 370 + + + (0x358ae8b5, 0x0f8bacd1) + 376 + + + (0x3f0a3b27, 0x570913d2) + 395 + + + (0x6267b5c5, 0x676e3e42) + 384 + + + + + (0x32d337b3, 0x44da5cbe) + + (0x1f046833, 0x21a8a876) + 1 + + + (0x0841694e, 0x28e40f42) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 263 + + + (0x358ae8b5, 0x0f8bacd1) + 263 + + + (0x3f0a3b27, 0x570913d2) + 336 + + + (0x6267b5c5, 0x676e3e42) + 391 + + + + + (0x34a10a1a, 0x549b90c5) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x2b88852d, 0x43d7a771) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -57 + + + (0x358ae8b5, 0x0f8bacd1) + 504 + + + (0x3f0a3b27, 0x570913d2) + -48 + + + (0x6267b5c5, 0x676e3e42) + 256 + + + + + (0x3bcdecce, 0x2f4ac910) + + (0x52e2d2a3, 0x4d9f5ea9) + 0 + + + (0x1a88b934, 0x580bfc30) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 546 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 555 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x4dec0a97, 0x70c962ab) + + (0x558c587f, 0x223f3b66) + 0 + + + (0x1f046833, 0x21a8a876) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 178 + + + (0x358ae8b5, 0x0f8bacd1) + 256 + + + (0x3f0a3b27, 0x570913d2) + 219 + + + (0x6267b5c5, 0x676e3e42) + 248 + + + + + (0x4fe0a074, 0x3d4b5f31) + + (0x52a5790c, 0x13d24266) + 0 + + + (0x75beae35, 0x606e8c20) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 439 + + + (0x358ae8b5, 0x0f8bacd1) + 384 + + + (0x3f0a3b27, 0x570913d2) + 459 + + + (0x6267b5c5, 0x676e3e42) + 384 + + + + + (0x51d497fe, 0x51620de7) + + (0x4cd78e38, 0x35301f84) + 0 + + + (0x02e67945, 0x5ea8d309) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 663 + + + (0x358ae8b5, 0x0f8bacd1) + 384 + + + (0x3f0a3b27, 0x570913d2) + 731 + + + (0x6267b5c5, 0x676e3e42) + 271 + + + + + (0x539c3289, 0x4a4821c9) + + (0x02e67945, 0x5ea8d309) + 0 + + + (0x5045ebd9, 0x67325c0b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 775 + + + (0x358ae8b5, 0x0f8bacd1) + 256 + + + (0x3f0a3b27, 0x570913d2) + 832 + + + (0x6267b5c5, 0x676e3e42) + 256 + + + + + (0x63796305, 0x4f357282) + + (0x4c1eab6f, 0x0e8c522c) + 0 + + + (0x71322e63, 0x41ba161a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 370 + + + (0x358ae8b5, 0x0f8bacd1) + 120 + + + (0x3f0a3b27, 0x570913d2) + 395 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x640c71b7, 0x1e64acbd) + + (0x1f046833, 0x21a8a876) + 1 + + + (0x4c1eab6f, 0x0e8c522c) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 263 + + + (0x358ae8b5, 0x0f8bacd1) + 263 + + + (0x3f0a3b27, 0x570913d2) + 336 + + + (0x6267b5c5, 0x676e3e42) + 135 + + + + + (0x6610ecd1, 0x258f3dbd) + + (0x76b6b638, 0x0c6e446a) + 0 + + + (0x558c587f, 0x223f3b66) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 124 + + + (0x358ae8b5, 0x0f8bacd1) + 256 + + + (0x3f0a3b27, 0x570913d2) + 144 + + + (0x6267b5c5, 0x676e3e42) + 256 + + + + + (0x6ed7fa34, 0x08297094) + + (0x5194b6cb, 0x7e001785) + 0 + + + (0x76b6b638, 0x0c6e446a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 39 + + + (0x358ae8b5, 0x0f8bacd1) + 256 + + + (0x3f0a3b27, 0x570913d2) + 70 + + + (0x6267b5c5, 0x676e3e42) + 256 + + + + + (0x71e176ce, 0x7030de6a) + + (0x1074abc4, 0x70c7daba) + 0 + + + (0x4cd78e38, 0x35301f84) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 599 + + + (0x358ae8b5, 0x0f8bacd1) + 384 + + + (0x3f0a3b27, 0x570913d2) + 619 + + + (0x6267b5c5, 0x676e3e42) + 384 + + + + + (0x78701b64, 0x712c2db1) + + (0x09529b60, 0x70991eff) + 0 + + + (0x52e2d2a3, 0x4d9f5ea9) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 503 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 512 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x791e2919, 0x0c35d8ac) + + (0x71322e63, 0x41ba161a) + 0 + + + (0x09529b60, 0x70991eff) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 439 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 459 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x7f0f3845, 0x79748fc5) + + (0x11a6038b, 0x7157c282) + 2 + + + (0x1396fde6, 0x1c649749) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -121 + + + (0x358ae8b5, 0x0f8bacd1) + 527 + + + (0x3f0a3b27, 0x570913d2) + -101 + + + (0x6267b5c5, 0x676e3e42) + 519 + + + + + + + (0x000008e3, 0x00002907) + <b>--::</b> Remember to <b>change the file</b> +to the one you recorded before! + + + (0x473d9a43, 0x97fc0a97) + 736.000000 + + + (0x7234b86b, 0x2b8651a5) + -144.000000 + + + + + (0x054fe269, 0x76eae246) + Then comes the <u>feature extraction part</u>. + +The signal is filtered in the alpha/beta [8 24] Hz range. + +Then the <i><b>Stimulation Based Epoching</b></i> box +is used to select four seconds of signal half a second +after the instruction was shown to the user +(<i>OVTK_GDF_Left</i> and <i>OVTK_GDF_Right</i>). + +The signal is then splitted in blocks of 1 second +every 16th second and the logarithmic band power is +computed thanks to the two <i>Simple DSP</i> and +the <i>Signal Average</i> boxes. + +The matrices can then be converted in feature vectors. + +<small><i><b>note:</b> depending on what frequency range +reacts best for the subject, you may have to tune +this part of the scenario</i></small> + +<small><i><b>note:</b> whatever change you do on this +scenario, don't forget to do the same on the +classifier trainer scenario</i></small> + + + (0x473d9a43, 0x97fc0a97) + -144 + + + (0x7234b86b, 0x2b8651a5) + 496 + + + + + (0x1fa8bff9, 0x19c74725) + The <u>preprocessing</u> of this scenario consists +in re-referencing all the channels to the +channel 2 (which was located on the nose) and +to select the 10 channels over the motor cortex +of the hands. The <i>Spatial Filter</i> box computes +a surface laplacian filter and reduces the output +to two channels: one on the left and one on the right. + +<small><i><b>note:</b> depending on your acquisition device, +you may have to tune this part of the scenario</i></small> + +<small><i><b>note:</b> whatever change you do on this +scenario, don't forget to do the same on the +online scenario</i></small> + + + (0x473d9a43, 0x97fc0a97) + -144 + + + (0x7234b86b, 0x2b8651a5) + 96 + + + + + (0x48235cd5, 0x3443cc5c) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 80.000000 + + + (0x7234b86b, 0x2b8651a5) + -208.000000 + + + + + (0x6160f9b8, 0x37b083c2) + <u><b><big>Overview</big></b></u> + +This scenario should be used to train +the LDA classifier used to detect +left / right hand movements + +Just configure the <i>Generic Stream Reader</i> +box to point to the last file you recorded with +scenario <i>1-acquisition</i> and fast forward +this scenario. + +At the end of the training, you will have an estimation +of the classifier performance printed in the console. +If this performance is lower than 65%, just run a new +<i>1-acquisition</i> session to have better results. + + + (0x473d9a43, 0x97fc0a97) + 736 + + + (0x7234b86b, 0x2b8651a5) + 160 + + + + + (0x7712b550, 0x7b357b74) + The <i><b>Classifier Trainer</b></i> box produces a +configuration file at the end of the experiment +which will be used during online sessions. + +The box raised the stimulation +<b>OVTK_StimulationId_TrainCompleted</b> +at the end of the training process. This stimulation is +used to stop the scenario with a <i><b>Player Controller</b></i>. + + + (0x473d9a43, 0x97fc0a97) + -144 + + + (0x7234b86b, 0x2b8651a5) + 784 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x0c60317a, 0x7480157f)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x4eff2d5e, 0x057e5a93)","index":0,"name":"Default tab","parentIdentifier":"(0x0c60317a, 0x7480157f)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00b5ee2a, 0x40e0a42c)","index":0,"name":"Empty","parentIdentifier":"(0x4eff2d5e, 0x057e5a93)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renard / Fabien Lotte + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Classifier Training + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Motor Imagery + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-3-online-incremental.xml b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-3-online-incremental.xml new file mode 100644 index 0000000..8efcf52 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-3-online-incremental.xml @@ -0,0 +1,2777 @@ + + 2 + OpenViBE Designer + 3.0.0 + + + + + + (0x000009e5, 0x0000326e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00311280) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003ed2, 0x000000ab) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/motor-imagery-bci-config-incremental-classifier.cfg + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 0 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000705e, 0x00005604) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/motor-imagery-bci-config-incremental-classifier.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 672 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x007a5f2f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x04fbf442, 0x73f1714a) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00815973) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0841694e, 0x28e40f42) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.500000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_GDF_Right + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0d63b6b1) + + + + + (0x09529b60, 0x70991eff) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002ca259) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0b67ca3f, 0x2a759530) + Identity + (0x5dffe431, 0x35215c50) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -176 + + + (0x207c9054, 0x3c841b63) + 367 + + + (0x30a4e5c9, 0x83502953) + + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00569d3e) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xfba64161, 0x65304e21) + + + + + + (0x0b67ca3f, 0x2a759531) + Identity + (0x5dffe431, 0x35215c50) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -176 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d961d4) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xfba64161, 0x65304e21) + + + + + + (0x1074abc4, 0x70c7daba) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002c8ae8) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x178d65c9, 0x79dd6c95) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x009264a3) + + + + + (0x1807c3c8, 0x2e5c15b2) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002c2d2a) + + + + + (0x1a0ac1f5, 0x2780b3ba) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x008d67dd) + + + + + (0x1a88b934, 0x580bfc30) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002ca824) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x413bfcbc, 0x6232e64c) + Graz Motor Imagery BCI Stimulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/motor-imagery-bci-graz-stimulator.lua + false + + + (0x007deef9, 0x2f3e95c6) + Number of Trials for Each Class + 20 + 10 + false + + + (0x2c132d6e, 0x44ab0d97) + First Class + OVTK_GDF_Left + OVTK_GDF_Left + false + + + (0x2c132d6e, 0x44ab0d97) + Second Class + OVTK_GDF_Right + OVTK_GDF_Right + false + + + (0x512a166f, 0x5c3ef83f) + Baseline Duration (in sec) + 20 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Wait For Beep Duration (in sec) + 2 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + Wait For Cue Duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Display Cue Duration (in sec) + 1.250 + 1.250 + false + + + (0x512a166f, 0x5c3ef83f) + Feedback Duration (in sec) + 3.750 + 3.750 + false + + + (0x512a166f, 0x5c3ef83f) + End of Trial Minimum Duration (in sec) + 1.500 + 1.500 + false + + + (0x512a166f, 0x5c3ef83f) + End of Trial Maximum Duration (in sec) + 3.500 + 3.500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00fc79f1) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x421b6208, 0x5c202058) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -64 + + + (0x207c9054, 0x3c841b63) + 512 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004d8e06) + + + (0xfba64161, 0x65304e21) + + + + + + (0x44c6fe5a, 0x0ee5bb56) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00776bae) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4c1eab6f, 0x0e8c522c) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.500000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_GDF_Left + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0d300af6) + + + + + (0x4cd78e38, 0x35301f84) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 563 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002cb3d2) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x52a5790c, 0x13d24266) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002ce2b7) + + + + + (0x52e2d2a3, 0x4d9f5ea9) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002c5628) + + + + + (0x5aeca777, 0x638f5d84) + Surface Laplacian + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 4;0;-1;0;-1;-1;0;0;-1;0;0;4;0;-1;0;0;-1;-1;0;-1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 2 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 10 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00765e39) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5d4f86a8, 0x1842e6f7) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x30a4e5c9, 0x83502953) + + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00f698b9) + + + (0xc73e83ec, 0xf855c5bc) + true + + + + + (0x6492829d, 0x1e24b4da) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00526d72) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x6964e610, 0x45e898f1) + Graz visualization + (0x00dd290d, 0x5f142820) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Show feedback + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + true + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive feedback only + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 768 + + + (0x207c9054, 0x3c841b63) + 512 + + + (0x4e7b798a, 0x183beafb) + (0x602ceb3f, 0xd3bc74aa) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6fa99403, 0x5d1e43cf) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00afbebb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x71322e63, 0x41ba161a) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002cb9ba) + + + + + (0x71ba6a0d, 0x3efa7d76) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004f1c45) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x72b5d43b, 0x7fb6910f) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/incremental-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -47 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0122d781) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xfba64161, 0x65304e21) + + + + + + (0x75beae35, 0x606e8c20) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002c850d) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x75e5990a, 0x59c95a67) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00302e0d) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x7847d16b, 0x67e6919b) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00720b56) + + + + + (0x793df69e, 0x0103251a) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0057933d) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00000395, 0x00003649) + + (0x5d4f86a8, 0x1842e6f7) + 2 + + + (0x0b67ca3f, 0x2a759530) + 2 + + + + (0x000008fb, 0x00001252) + + (0x178d65c9, 0x79dd6c95) + 0 + + + (0x0841694e, 0x28e40f42) + 0 + + + + (0x000009e8, 0x00000e63) + + (0x5d4f86a8, 0x1842e6f7) + 0 + + + (0x0b67ca3f, 0x2a759530) + 0 + + + + (0x00000b58, 0x00003fc4) + + (0x421b6208, 0x5c202058) + 0 + + + (0x04fbf442, 0x73f1714a) + 0 + + + + (0x00000ee2, 0x00001ff5) + + (0x75e5990a, 0x59c95a67) + 0 + + + (0x00003ed2, 0x000000ab) + 1 + + + + (0x0000120b, 0x00002dc1) + + (0x1074abc4, 0x70c7daba) + 0 + + + (0x4cd78e38, 0x35301f84) + 0 + + + + (0x000015d4, 0x000074ed) + + (0x71ba6a0d, 0x3efa7d76) + 1 + + + (0x0b67ca3f, 0x2a759531) + 1 + + + + (0x00001c7b, 0x00007564) + + (0x000009e5, 0x0000326e) + 0 + + + (0x00003ed2, 0x000000ab) + 0 + + + + (0x00001cdf, 0x00003e07) + + (0x1a88b934, 0x580bfc30) + 0 + + + (0x75e5990a, 0x59c95a67) + 0 + + + + (0x00002625, 0x00002ca4) + + (0x00003ed2, 0x000000ab) + 0 + + + (0x0000705e, 0x00005604) + 1 + + + + (0x000029c7, 0x000061a3) + + (0x71ba6a0d, 0x3efa7d76) + 2 + + + (0x0b67ca3f, 0x2a759531) + 2 + + + + (0x00002c2f, 0x000043b2) + + (0x413bfcbc, 0x6232e64c) + 0 + + + (0x6964e610, 0x45e898f1) + 0 + + + + (0x00002e82, 0x000069ca) + + (0x0b67ca3f, 0x2a759531) + 1 + + + (0x72b5d43b, 0x7fb6910f) + 1 + + + + (0x00002e85, 0x00001180) + + (0x4cd78e38, 0x35301f84) + 0 + + + (0x00003ed2, 0x000000ab) + 2 + + + + (0x00002fea, 0x00000821) + + (0x0b67ca3f, 0x2a759531) + 0 + + + (0x72b5d43b, 0x7fb6910f) + 0 + + + + (0x00003607, 0x00005c1b) + + (0x000009e5, 0x0000326e) + 0 + + + (0x4c1eab6f, 0x0e8c522c) + 1 + + + + (0x00004486, 0x00007ac6) + + (0x71ba6a0d, 0x3efa7d76) + 0 + + + (0x0b67ca3f, 0x2a759531) + 0 + + + + (0x00004b2f, 0x000060a6) + + (0x178d65c9, 0x79dd6c95) + 0 + + + (0x4c1eab6f, 0x0e8c522c) + 0 + + + + (0x000060a0, 0x00001457) + + (0x793df69e, 0x0103251a) + 0 + + + (0x0000705e, 0x00005604) + 0 + + + + (0x00006c6f, 0x00006a8d) + + (0x5aeca777, 0x638f5d84) + 0 + + + (0x178d65c9, 0x79dd6c95) + 0 + + + + (0x00006ef2, 0x00001663) + + (0x000009e5, 0x0000326e) + 0 + + + (0x0841694e, 0x28e40f42) + 1 + + + + (0x000072e2, 0x00004c7d) + + (0x0b67ca3f, 0x2a759531) + 2 + + + (0x72b5d43b, 0x7fb6910f) + 2 + + + + (0x000075aa, 0x00007297) + + (0x5d4f86a8, 0x1842e6f7) + 1 + + + (0x0b67ca3f, 0x2a759530) + 1 + + + + (0x00007925, 0x000001d5) + + (0x0b67ca3f, 0x2a759531) + 1 + + + (0x421b6208, 0x5c202058) + 0 + + + + (0x000079ef, 0x0000404b) + + (0x421b6208, 0x5c202058) + 1 + + + (0x000009e5, 0x0000326e) + 0 + + + + (0x00007df6, 0x00004072) + + (0x0b67ca3f, 0x2a759531) + 2 + + + (0x421b6208, 0x5c202058) + 1 + + + + (0x03b0182e, 0x28a00e60) + + (0x44c6fe5a, 0x0ee5bb56) + 0 + + + (0x5aeca777, 0x638f5d84) + 0 + + + + (0x06e5f642, 0x7af6948a) + + (0x75beae35, 0x606e8c20) + 0 + + + (0x1807c3c8, 0x2e5c15b2) + 0 + + + + (0x076b541e, 0x4295b37a) + + (0x1807c3c8, 0x2e5c15b2) + 0 + + + (0x1074abc4, 0x70c7daba) + 0 + + + + (0x19180ac5, 0x739b8505) + + (0x1a0ac1f5, 0x2780b3ba) + 0 + + + (0x6fa99403, 0x5d1e43cf) + 0 + + + + (0x2d71872c, 0x4af9aa82) + + (0x0841694e, 0x28e40f42) + 0 + + + (0x52a5790c, 0x13d24266) + 0 + + + + (0x341db2c7, 0x33d65dd7) + + (0x04fbf442, 0x73f1714a) + 0 + + + (0x44c6fe5a, 0x0ee5bb56) + 0 + + + + (0x3bcdecce, 0x2f4ac910) + + (0x52e2d2a3, 0x4d9f5ea9) + 0 + + + (0x1a88b934, 0x580bfc30) + 0 + + + + (0x3d934ab6, 0x40dfd9e6) + + (0x7847d16b, 0x67e6919b) + 0 + + + (0x6492829d, 0x1e24b4da) + 0 + + + + (0x4fe0a074, 0x3d4b5f31) + + (0x52a5790c, 0x13d24266) + 0 + + + (0x75beae35, 0x606e8c20) + 0 + + + + (0x5f5fdf49, 0x0e7e8ddc) + + (0x6492829d, 0x1e24b4da) + 0 + + + (0x793df69e, 0x0103251a) + 0 + + + + (0x63796305, 0x4f357282) + + (0x4c1eab6f, 0x0e8c522c) + 0 + + + (0x71322e63, 0x41ba161a) + 0 + + + + (0x68538cef, 0x27c57e19) + + (0x0000705e, 0x00005604) + 2 + + + (0x6964e610, 0x45e898f1) + 1 + + + + (0x6a456414, 0x658272b6) + + (0x6fa99403, 0x5d1e43cf) + 0 + + + (0x7847d16b, 0x67e6919b) + 0 + + + + (0x720deb5e, 0x09e29398) + + (0x178d65c9, 0x79dd6c95) + 0 + + + (0x1a0ac1f5, 0x2780b3ba) + 0 + + + + (0x78701b64, 0x712c2db1) + + (0x09529b60, 0x70991eff) + 0 + + + (0x52e2d2a3, 0x4d9f5ea9) + 0 + + + + (0x791e2919, 0x0c35d8ac) + + (0x71322e63, 0x41ba161a) + 0 + + + (0x09529b60, 0x70991eff) + 0 + + + + + + (0x286e9396, 0x260e7be2) + Finally, the feature vectors are classifier with an LDA +classifier. Note that the probability vector of the classifier +is sent to the <i><b>Graz Visulization</b></i> +box for feedback ! + +In order to display correct feedback, +the <i><b>Graz Visulization</b></i> box expects a +two-dimensional input describing probabilities +of each class. + + + (0x473d9a43, 0x97fc0a97) + -64.000000 + + + (0x7234b86b, 0x2b8651a5) + 608.000000 + + + + + (0x305c36f8, 0x1988d842) + Then comes the <u>feature extraction part</u>. + +The signal is filtered in the alpha/beta [8 24] Hz range. +The filtered signal is then splitted in blocks of 1 second +every 16th second and the logarithmic band power is +computed thanks to the two <i>Simple DSP</i> and +the <i>Signal Average</i> boxes. + +The matrices can then be converted in feature vectors. + +<small><i><b>note:</b> depending on what frequency range +reacts best for the subject, you may have to tune +this part of the scenario</i></small> + + + + + (0x473d9a43, 0x97fc0a97) + -16 + + + (0x7234b86b, 0x2b8651a5) + 352 + + + + + (0x345411d4, 0x75233553) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 496 + + + (0x7234b86b, 0x2b8651a5) + -320 + + + + + (0x3c112fb0, 0x543c16a1) + <u><b><big>Overview</big></b></u> + +This scenario demonstrates Motor Imagery with +incremental learning. Its based on the original +offline-trained scenario by +Yann Renard and Fabien Lotte. + +<small><i><b>note:</b> the recorded files go to the +folder where the scenario xml is located +(<span color="darkblue">${Player_ScenarioDirectory}/</span>).</i></small> + + + (0x473d9a43, 0x97fc0a97) + 0.000000 + + + (0x7234b86b, 0x2b8651a5) + -192.000000 + + + + + (0x7b42f8a7, 0x7e2c91b9) + The <u>preprocessing</u> of this scenario consists +in re-referencing all the channels to the +channel 2 (which was located on the nose) and +to select the 10 channels over the motor cortex +of the hands. The <i>Spatial Filter</i> box computes +a surface laplacian filter and reduces the output +to two channels: one on the left and one on the right. + +<small><i><b>note:</b> depending on your acquisition device, +you may have to tune this part of the scenario</i></small> + + + + (0x473d9a43, 0x97fc0a97) + -16.000000 + + + (0x7234b86b, 0x2b8651a5) + 48.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":505,"identifier":"(0x4a4285fb, 0x630ff778)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":608},{"boxIdentifier":"(0x6964e610, 0x45e898f1)","childCount":0,"identifier":"(0x68375664, 0x141964c2)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x1d5c7e39, 0x292c8798)","index":0,"name":"Default tab","parentIdentifier":"(0x4a4285fb, 0x630ff778)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x382ac9ba, 0x2bd3a30f)","index":0,"name":"Empty","parentIdentifier":"(0x1d5c7e39, 0x292c8798)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Incremental Motor Imagery + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Motor Imagery + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-3-online.xml b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-3-online.xml new file mode 100644 index 0000000..927c5a1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-3-online.xml @@ -0,0 +1,1473 @@ + + 2 + OpenViBE Designer + 3.0.0 + + + + + + (0x00005008, 0x00001e3b) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/motor-imagery-bci-config-classifier.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x04fbf442, 0x73f1714a) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0b67ca3f, 0x2a759530) + Identity + (0x5dffe431, 0x35215c50) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005b9e8d) + + + (0xfba64161, 0x65304e21) + + + + + + (0x178d65c9, 0x79dd6c95) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x016b7673) + + + + + (0x1a0ac1f5, 0x2780b3ba) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006bdf4b) + + + + + (0x1e45df99, 0x3627801c) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x544a003e, 0x6dcba5f6) + Input - A + + + + + (0x544a003e, 0x6dcba5f6) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x413bfcbc, 0x6232e64c) + Graz Motor Imagery BCI Stimulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/motor-imagery-bci-graz-stimulator.lua + false + + + (0x007deef9, 0x2f3e95c6) + Number of Trials for Each Class + 20 + 20 + false + + + (0x2c132d6e, 0x44ab0d97) + First Class + OVTK_GDF_Left + OVTK_GDF_Left + false + + + (0x2c132d6e, 0x44ab0d97) + Second Class + OVTK_GDF_Right + OVTK_GDF_Right + false + + + (0x512a166f, 0x5c3ef83f) + Baseline Duration (in sec) + 20 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Wait For Beep Duration (in sec) + 2 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + Wait For Cue Duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Display Cue Duration (in sec) + 1.250 + 1.250 + false + + + (0x512a166f, 0x5c3ef83f) + Feedback Duration (in sec) + 3.750 + 3.750 + false + + + (0x512a166f, 0x5c3ef83f) + End of Trial Minimum Duration (in sec) + 1.500 + 1.500 + false + + + (0x512a166f, 0x5c3ef83f) + End of Trial Maximum Duration (in sec) + 3.500 + 3.500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x44c6fe5a, 0x0ee5bb56) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5aeca777, 0x638f5d84) + Surface Laplacian + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 4;0;-1;0;-1;-1;0;0;-1;0;0;4;0;-1;0;0;-1;-1;0;-1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 2 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 10 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6492829d, 0x1e24b4da) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x65d24383, 0x61b7fd55) + Graz visualization + (0x00dd290d, 0x5f142820) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Show feedback + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive feedback only + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 784 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x4e7b798a, 0x183beafb) + (0x602ceb3f, 0xd3bc74aa) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6fa99403, 0x5d1e43cf) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x71ba6a0d, 0x3efa7d76) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x72b5d43b, 0x7fb6910f) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/record-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -64 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002730c3) + + + (0xfba64161, 0x65304e21) + + + + + + (0x7847d16b, 0x67e6919b) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004da903) + + + + + (0x793df69e, 0x0103251a) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00000b62, 0x00000693) + + (0x71ba6a0d, 0x3efa7d76) + 2 + + + (0x0b67ca3f, 0x2a759530) + 2 + + + + (0x00002278, 0x00000b59) + + (0x0b67ca3f, 0x2a759530) + 1 + + + (0x04fbf442, 0x73f1714a) + 0 + + + + (0x00005e57, 0x00003458) + + (0x793df69e, 0x0103251a) + 0 + + + (0x00005008, 0x00001e3b) + 0 + + + + (0x0000655c, 0x00000044) + + (0x413bfcbc, 0x6232e64c) + 0 + + + (0x65d24383, 0x61b7fd55) + 0 + + + + (0x00006bff, 0x000061fb) + + (0x00005008, 0x00001e3b) + 1 + + + (0x1e45df99, 0x3627801c) + 0 + + + + (0x03b0182e, 0x28a00e60) + + (0x44c6fe5a, 0x0ee5bb56) + 0 + + + (0x5aeca777, 0x638f5d84) + 0 + + + + (0x188d2388, 0x2448dfbc) + + (0x1e45df99, 0x3627801c) + 0 + + + (0x65d24383, 0x61b7fd55) + 1 + + + + (0x19180ac5, 0x739b8505) + + (0x1a0ac1f5, 0x2780b3ba) + 0 + + + (0x6fa99403, 0x5d1e43cf) + 0 + + + + (0x341db2c7, 0x33d65dd7) + + (0x04fbf442, 0x73f1714a) + 0 + + + (0x44c6fe5a, 0x0ee5bb56) + 0 + + + + (0x3cd31959, 0x7d08f814) + + (0x71ba6a0d, 0x3efa7d76) + 1 + + + (0x0b67ca3f, 0x2a759530) + 1 + + + + (0x3d934ab6, 0x40dfd9e6) + + (0x7847d16b, 0x67e6919b) + 0 + + + (0x6492829d, 0x1e24b4da) + 0 + + + + (0x48b4e63f, 0x5b38bb95) + + (0x71ba6a0d, 0x3efa7d76) + 0 + + + (0x0b67ca3f, 0x2a759530) + 0 + + + + (0x50841110, 0x3919a70a) + + (0x0b67ca3f, 0x2a759530) + 2 + + + (0x72b5d43b, 0x7fb6910f) + 2 + + + + (0x5b5d7d40, 0x486fbc1f) + + (0x0b67ca3f, 0x2a759530) + 0 + + + (0x72b5d43b, 0x7fb6910f) + 0 + + + + (0x5f5fdf49, 0x0e7e8ddc) + + (0x6492829d, 0x1e24b4da) + 0 + + + (0x793df69e, 0x0103251a) + 0 + + + + (0x609a5ac2, 0x1a7da35c) + + (0x5aeca777, 0x638f5d84) + 0 + + + (0x178d65c9, 0x79dd6c95) + 0 + + + + (0x6405b028, 0x3a4c86c2) + + (0x0b67ca3f, 0x2a759530) + 1 + + + (0x72b5d43b, 0x7fb6910f) + 1 + + + + (0x6a456414, 0x658272b6) + + (0x6fa99403, 0x5d1e43cf) + 0 + + + (0x7847d16b, 0x67e6919b) + 0 + + + + (0x720deb5e, 0x09e29398) + + (0x178d65c9, 0x79dd6c95) + 0 + + + (0x1a0ac1f5, 0x2780b3ba) + 0 + + + + + + (0x286e9396, 0x260e7be2) + Finally, the feature vectors are classifier with an LDA +classifier. Note that the state vector of the classifier +(which in the case of the LDA is the distance to the +separation plane) is sent to the <i><b>Graz Visulization</b></i> +box for feedback ! + +In order to display correct feedback, +the <i><b>Graz Visulization</b></i> box expects a negative +value for one class and a positive value for the other +class. + + + (0x473d9a43, 0x97fc0a97) + 0.000000 + + + (0x7234b86b, 0x2b8651a5) + 688.000000 + + + + + (0x305c36f8, 0x1988d842) + Then comes the <u>feature extraction part</u>. + +The signal is filtered in the alpha/beta [8 24] Hz range. +The filtered signal is then splitted in blocks of 1 second +every 16th second and the logarithmic band power is +computed thanks to the two <i>Simple DSP</i> and +the <i>Signal Average</i> boxes. + +The matrices can then be converted in feature vectors. + +<small><i><b>note:</b> depending on what frequency range +reacts best for the subject, you may have to tune +this part of the scenario</i></small> + +<small><i><b>note:</b> whatever change you do on this +scenario, don't forget to do the same on the +classifier trainer scenario</i></small> + + + (0x473d9a43, 0x97fc0a97) + 0.000000 + + + (0x7234b86b, 0x2b8651a5) + 384.000000 + + + + + (0x345411d4, 0x75233553) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 496 + + + (0x7234b86b, 0x2b8651a5) + -320 + + + + + (0x3c112fb0, 0x543c16a1) + <u><b><big>Overview</big></b></u> + +This scenario can be used online once the +classifiers is trained. + +<small><i><b>note:</b> the recorded files go to the +folder where the scenario xml is located +(<span color="darkblue">${Player_ScenarioDirectory}/</span>).</i></small> + + + (0x473d9a43, 0x97fc0a97) + 144.000000 + + + (0x7234b86b, 0x2b8651a5) + -160.000000 + + + + + (0x7b42f8a7, 0x7e2c91b9) + The <u>preprocessing</u> of this scenario consists +in re-referencing all the channels to the +channel 2 (which was located on the nose) and +to select the 10 channels over the motor cortex +of the hands. The <i>Spatial Filter</i> box computes +a surface laplacian filter and reduces the output +to two channels: one on the left and one on the right. + +<small><i><b>note:</b> depending on your acquisition device, +you may have to tune this part of the scenario</i></small> + +<small><i><b>note:</b> whatever change you do on this +scenario, don't forget to do the same on the +classifier trainer scenario</i></small> + + + (0x473d9a43, 0x97fc0a97) + 16.000000 + + + (0x7234b86b, 0x2b8651a5) + 96.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x65d24383, 0x61b7fd55)","childCount":0,"identifier":"(0x48dfd2e6, 0x09f7b835)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":505,"identifier":"(0x4a4285fb, 0x630ff778)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":608},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x1d5c7e39, 0x292c8798)","index":0,"name":"Default tab","parentIdentifier":"(0x4a4285fb, 0x630ff778)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x382ac9ba, 0x2bd3a30f)","index":0,"name":"Empty","parentIdentifier":"(0x1d5c7e39, 0x292c8798)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renard / Fabien Lotte + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Online Use + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Motor Imagery + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-4-replay.xml b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-4-replay.xml new file mode 100644 index 0000000..f47b38b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-4-replay.xml @@ -0,0 +1,1144 @@ + + 2 + OpenViBE Designer + 3.0.0 + + + + + + (0x00006be7, 0x0000270b) + Graz visualization + (0x00dd290d, 0x5f142820) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Show feedback + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive feedback only + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 752 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0x602ceb3f, 0xd3bc74aa) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x3ac8853d, 0x5101c67f) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x3d734c98, 0x52ca1e64) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3e343902, 0x201965d5) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 480 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3e5ff1d5, 0x253635cc) + Surface Laplacian + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 4;0;-1;0;-1;-1;0;0;-1;0;0;4;0;-1;0;0;-1;-1;0;-1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 2 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 10 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x46241df7, 0x30260558) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x016b7673) + + + + + (0x46e10f90, 0x7f1009d3) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x544a003e, 0x6dcba5f6) + Input - A + + + + + (0x544a003e, 0x6dcba5f6) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 672 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x58d2f847, 0x1efebeb6) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/motor-imagery-bci-config-classifier.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x59e9e84f, 0x3aeea63d) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5d4f86a8, 0x1842e6f7) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b124ce) + + + + + (0x5fb5bb23, 0x497dafe3) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006bdf4b) + + + + + (0x63dc90f9, 0x033682c0) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004da903) + + + + + (0x6cdfdf3c, 0x441bc59d) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -64 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005b9e8d) + + + (0xfba64161, 0x65304e21) + + + + + + (0x74af3475, 0x27f8ac97) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x0000009d, 0x00002a28) + + (0x6cdfdf3c, 0x441bc59d) + 1 + + + (0x00006be7, 0x0000270b) + 0 + + + + (0x00004abe, 0x00006dce) + + (0x46e10f90, 0x7f1009d3) + 0 + + + (0x00006be7, 0x0000270b) + 1 + + + + (0x0e2a4811, 0x5655378b) + + (0x63dc90f9, 0x033682c0) + 0 + + + (0x59e9e84f, 0x3aeea63d) + 0 + + + + (0x0f5b98f8, 0x3d288193) + + (0x3d734c98, 0x52ca1e64) + 0 + + + (0x63dc90f9, 0x033682c0) + 0 + + + + (0x0f7427fa, 0x4a241e37) + + (0x5fb5bb23, 0x497dafe3) + 0 + + + (0x3d734c98, 0x52ca1e64) + 0 + + + + (0x30e2414f, 0x5a7eff30) + + (0x5d4f86a8, 0x1842e6f7) + 2 + + + (0x6cdfdf3c, 0x441bc59d) + 1 + + + + (0x3b1e0268, 0x17fc3749) + + (0x58d2f847, 0x1efebeb6) + 1 + + + (0x46e10f90, 0x7f1009d3) + 0 + + + + (0x4483f1a9, 0x1e443bd2) + + (0x5d4f86a8, 0x1842e6f7) + 1 + + + (0x6cdfdf3c, 0x441bc59d) + 0 + + + + (0x46f54223, 0x5e039f44) + + (0x6cdfdf3c, 0x441bc59d) + 0 + + + (0x3ac8853d, 0x5101c67f) + 0 + + + + (0x4841fa41, 0x654c5ed3) + + (0x3e343902, 0x201965d5) + 0 + + + (0x58d2f847, 0x1efebeb6) + 0 + + + + (0x49342808, 0x02d97c87) + + (0x59e9e84f, 0x3aeea63d) + 0 + + + (0x3e343902, 0x201965d5) + 0 + + + + (0x7e4de420, 0x36140745) + + (0x3e5ff1d5, 0x253635cc) + 0 + + + (0x46241df7, 0x30260558) + 0 + + + + (0x7e75d094, 0x6f423325) + + (0x46241df7, 0x30260558) + 0 + + + (0x5fb5bb23, 0x497dafe3) + 0 + + + + (0x7f91b726, 0x0d19601b) + + (0x74af3475, 0x27f8ac97) + 0 + + + (0x3e5ff1d5, 0x253635cc) + 0 + + + + (0x7fb534fa, 0x3caa0998) + + (0x3ac8853d, 0x5101c67f) + 0 + + + (0x74af3475, 0x27f8ac97) + 0 + + + + + + (0x0eaafbe3, 0x189f5a5a) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 304 + + + (0x7234b86b, 0x2b8651a5) + -208 + + + + + (0x755a38e0, 0x6bfa828c) + <u><b><big>Overview</big></b></u> + +This scenario allows to quickly replay +an online session recorded file. The +main difference between this scenario and +scenario <i>3-online</i> is basically +all the acquisition / stimulation part +being replaced by a file reader. + +<u><b>Note:</b></u> refer to scenario <i>3-online</i> for +details about the processing. + + + (0x473d9a43, 0x97fc0a97) + 592 + + + (0x7234b86b, 0x2b8651a5) + 48 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00006be7, 0x0000270b)","childCount":0,"identifier":"(0x0000597f, 0x00000177)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":505,"identifier":"(0x78c33b00, 0x4bb1f7c0)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":608},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x64a8661d, 0x78786ffa)","index":0,"name":"Default tab","parentIdentifier":"(0x78c33b00, 0x4bb1f7c0)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x085c0157, 0x7403ff15)","index":0,"name":"Empty","parentIdentifier":"(0x64a8661d, 0x78786ffa)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renad / Fabien Lotte + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + File Replay + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Motor Imagery + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-config-incremental-classifier.cfg b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-config-incremental-classifier.cfg new file mode 100644 index 0000000..76bd231 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-config-incremental-classifier.cfg @@ -0,0 +1,23 @@ + + Native + Linear Discrimimant Analysis (LDA) + + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_02 + + + + 0 1 + + + 5.482270e+001 2.478968e+001 + -66.7812 + + + 5.275779e+001 2.744076e+001 + -68.0094 + + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-graz-stimulator.lua b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-graz-stimulator.lua new file mode 100644 index 0000000..9a64494 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-graz-stimulator.lua @@ -0,0 +1,97 @@ + +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + number_of_trials = box:get_setting(2) + first_class = _G[box:get_setting(3)] + second_class = _G[box:get_setting(4)] + baseline_duration = box:get_setting(5) + wait_for_beep_duration = box:get_setting(6) + wait_for_cue_duration = box:get_setting(7) + display_cue_duration = box:get_setting(8) + feedback_duration = box:get_setting(9) + end_of_trial_min_duration = box:get_setting(10) + end_of_trial_max_duration = box:get_setting(11) + + -- initializes random seed + math.randomseed(os.time()) + + -- fill the sequence table with predifined order + sequence = {} + for i = 1, number_of_trials do + table.insert(sequence, 1, first_class) + table.insert(sequence, 1, second_class) + end + + -- randomize the sequence + for i = 1, number_of_trials do + a = math.random(1, number_of_trials*2) + b = math.random(1, number_of_trials*2) + swap = sequence[a] + sequence[a] = sequence[b] + sequence[b] = swap + end + +end + +function process(box) + + local t=0 + + -- manages baseline + + box:send_stimulation(1, OVTK_StimulationId_ExperimentStart, t, 0) + t = t + 5 + + box:send_stimulation(1, OVTK_StimulationId_BaselineStart, t, 0) + box:send_stimulation(1, OVTK_StimulationId_Beep, t, 0) + t = t + baseline_duration + + box:send_stimulation(1, OVTK_StimulationId_BaselineStop, t, 0) + box:send_stimulation(1, OVTK_StimulationId_Beep, t, 0) + t = t + 5 + + -- manages trials + + for i = 1, number_of_trials*2 do + + -- first display cross on screen + + box:send_stimulation(1, OVTK_GDF_Start_Of_Trial, t, 0) + box:send_stimulation(1, OVTK_GDF_Cross_On_Screen, t, 0) + t = t + wait_for_beep_duration + + -- warn the user the cue is going to appear + + box:send_stimulation(1, OVTK_StimulationId_Beep, t, 0) + t = t + wait_for_cue_duration + + -- display cue + + box:send_stimulation(1, sequence[i], t, 0) + t = t + display_cue_duration + + -- provide feedback + + box:send_stimulation(1, OVTK_GDF_Feedback_Continuous, t, 0) + t = t + feedback_duration + + -- ends trial + + box:send_stimulation(1, OVTK_GDF_End_Of_Trial, t, 0) + t = t + math.random(end_of_trial_min_duration, end_of_trial_max_duration) + + end + + -- send end for completeness + box:send_stimulation(1, OVTK_GDF_End_Of_Session, t, 0) + t = t + 5 + + box:send_stimulation(1, OVTK_StimulationId_Train, t, 0) + t = t + 1 + + -- used to cause the acquisition scenario to stop + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, t, 0) + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/signals/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/signals/README.txt new file mode 100644 index 0000000..8eaa204 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/motor-imagery/bci-examples/motor-imagery/signals/README.txt @@ -0,0 +1,3 @@ + +The scenario will record its signals here. + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/neurofeedback/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/demos/neurofeedback/CMakeLists.txt new file mode 100755 index 0000000..f2c5f96 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/neurofeedback/CMakeLists.txt @@ -0,0 +1,3 @@ + +INSTALL(DIRECTORY signals DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) +INSTALL(DIRECTORY bci-examples DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/neurofeedback/bci-examples/neurofeedback/neurofeedback.xml b/Masterarbeit/openvibe/extras-master/applications/demos/neurofeedback/bci-examples/neurofeedback/neurofeedback.xml new file mode 100644 index 0000000..951d236 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/neurofeedback/bci-examples/neurofeedback/neurofeedback.xml @@ -0,0 +1,1789 @@ + + 1 + OpenViBE + 1.2.1+git + + + (0x00000de2, 0x00000f63) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Reference + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 161.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 240.000000 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xad100179, 0xa3c984ab) + 132 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00153bcb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001342, 0x00005cc2) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 16.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001d29dc) + + + + + (0x000013c1, 0x0000395b) + GDF file reader + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/neurofeedback.gdf + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + False + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002ea966) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00003418, 0x000038d7) + Beta power + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scroll + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + None + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 30 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 20 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 863.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 224.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 84 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000cd857) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00003cd9, 0x00004082) + Beta signal + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 368.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 83 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00239610) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000048d9, 0x0000347d) + Crop + (0x7f1a3002, 0x358117ba) + + + (0x5ba36127, 0x195feae1) + Input matrix + + + + + (0x5ba36127, 0x195feae1) + Output matrix + + + + + (0xd0643f9e, 0x8e35fe0a) + Crop method + Min + Min/Max + false + + + (0x512a166f, 0x5c3ef83f) + Min crop value + -1 + 12.033257 + false + + + (0x512a166f, 0x5c3ef83f) + Max crop value + 1 + 40.740842 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 656 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x1b151919, 0x63b9f9c9) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 59 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000a8d19) + + + + + (0x00004b73, 0x000059fc) + Cz + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + Cz + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 240.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 92 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000ee075) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000054bc, 0x000033b3) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x-26.387050 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 752 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 82 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000b998a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005aff, 0x0000311f) + Beta Power as color + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 400.000000 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xad100179, 0xa3c984ab) + 139 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00101f34) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005c1f, 0x000045a1) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 95 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000b34e8) + + + + + (0x0000619a, 0x00007f4b) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 82 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0015e399) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000654e, 0x00004072) + Identity + (0x5dffe431, 0x35215c50) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + (0x013df452, 0xa3a8879a) + Input stream 4 + + + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 59 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00126a6c) + + + (0xfba64161, 0x65304e21) + + + + + + (0x000069ef, 0x00005c93) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.100000 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xad100179, 0xa3c984ab) + 147 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0013cab5) + + + + + (0x00007095, 0x00000179) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Epoch block average + Moving epoch average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000c9539) + + + + + + + (0x00000056, 0x00005e46) + + (0x00005c1f, 0x000045a1) + 0 + + + (0x00007095, 0x00000179) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 530 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 539 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x000009b3, 0x000064c9) + + (0x000054bc, 0x000033b3) + 0 + + + (0x00005aff, 0x0000311f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 775 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 843 + + + (0x6267b5c5, 0x676e3e42) + 400 + + + + + (0x00000abd, 0x000072ca) + + (0x000048d9, 0x0000347d) + 0 + + + (0x000054bc, 0x000033b3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 679 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 731 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x0000147d, 0x00004650) + + (0x00001342, 0x00005cc2) + 0 + + + (0x000069ef, 0x00005c93) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 290 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 379 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x0000380e, 0x00007621) + + (0x000054bc, 0x000033b3) + 0 + + + (0x00003418, 0x000038d7) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 775 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 837 + + + (0x6267b5c5, 0x676e3e42) + 209 + + + + + (0x0000413e, 0x00007b92) + + (0x00000de2, 0x00000f63) + 0 + + + (0x00004b73, 0x000059fc) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 179 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 198 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x0000486d, 0x00001e7e) + + (0x000013c1, 0x0000395b) + 1 + + + (0x0000654e, 0x00004072) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 18 + + + (0x358ae8b5, 0x0f8bacd1) + 416 + + + (0x3f0a3b27, 0x570913d2) + 75 + + + (0x6267b5c5, 0x676e3e42) + 408 + + + + + (0x00005203, 0x00007a75) + + (0x0000654e, 0x00004072) + 2 + + + (0x00003cd9, 0x00004082) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 119 + + + (0x358ae8b5, 0x0f8bacd1) + 423 + + + (0x3f0a3b27, 0x570913d2) + 310 + + + (0x6267b5c5, 0x676e3e42) + 368 + + + + + (0x000059c3, 0x00007103) + + (0x00004b73, 0x000059fc) + 0 + + + (0x00001342, 0x00005cc2) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 252 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 256 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x00005ec2, 0x0000171e) + + (0x000069ef, 0x00005c93) + 0 + + + (0x0000619a, 0x00007f4b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 423 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 443 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x00006673, 0x00000a36) + + (0x00001342, 0x00005cc2) + 0 + + + (0x00003cd9, 0x00004082) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 290 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 310 + + + (0x6267b5c5, 0x676e3e42) + 353 + + + + + (0x00006688, 0x00005cff) + + (0x00007095, 0x00000179) + 0 + + + (0x000048d9, 0x0000347d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 583 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 635 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x000070c4, 0x00003ea9) + + (0x0000619a, 0x00007f4b) + 0 + + + (0x00005c1f, 0x000045a1) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 487 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 496 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x00007d90, 0x00003f2b) + + (0x0000654e, 0x00004072) + 1 + + + (0x00000de2, 0x00000f63) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 119 + + + (0x358ae8b5, 0x0f8bacd1) + 408 + + + (0x3f0a3b27, 0x570913d2) + 145 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x00007e19, 0x000037dd) + + (0x000013c1, 0x0000395b) + 2 + + + (0x0000654e, 0x00004072) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 18 + + + (0x358ae8b5, 0x0f8bacd1) + 431 + + + (0x3f0a3b27, 0x570913d2) + 75 + + + (0x6267b5c5, 0x676e3e42) + 423 + + + + + + + (0x00000162, 0x00001957) + The signal display provides +real-time and asynchronous feedback of the user's +brain activity in the Beta band, +related to feet movement. + + + (0x473d9a43, 0x97fc0a97) + 688.000000 + + + (0x7234b86b, 0x2b8651a5) + 832.000000 + + + + + (0x00000b69, 0x00000961) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 368 + + + (0x7234b86b, 0x2b8651a5) + -32 + + + + + (0x0000195a, 0x000050fd) + <u><b><big>Overview</big></b></u> + +This scenario allows to quickly replay +an online session of <b>feet motor imagery</b>, and watch the corresponding feedback. + +The feedback is presented through signal displays : one for the brain +activity on the Cz electrode, and one for the band power in +the beta activity,related to (imagined) feet movement. + + + (0x473d9a43, 0x97fc0a97) + 768 + + + (0x7234b86b, 0x2b8651a5) + 96 + + + + + (0x000023b0, 0x000053b2) + Crop the signal between +<i>Mean + 3 * Variance</i> +and +<i>Mean + 6 * Variance</i> + + + (0x473d9a43, 0x97fc0a97) + 496 + + + (0x7234b86b, 0x2b8651a5) + 656 + + + + + (0x000023d3, 0x00006cca) + Averaging the 4 last epochs + + + (0x473d9a43, 0x97fc0a97) + 496 + + + (0x7234b86b, 0x2b8651a5) + 560 + + + + + (0x00002b4c, 0x00000503) + + +This two boxes are configured +with respect to a previous <b>calibration</b> session. + +The calibration computed the <b><i>Mean</i></b> and <i><b>Variance</b></i> +of the Beta activity during 30sec of inactivity. + + + + + + (0x473d9a43, 0x97fc0a97) + 784 + + + (0x7234b86b, 0x2b8651a5) + 688 + + + + + (0x000030e7, 0x00006ef1) + Center all values on +<i>Mean + 3 * Variance</i> + + + (0x473d9a43, 0x97fc0a97) + 496 + + + (0x7234b86b, 0x2b8651a5) + 736 + + + + + (0x000034ee, 0x000071b3) + Filtering in the <b>[16-24Hz]</b> frequency band +and display + + + (0x473d9a43, 0x97fc0a97) + 608 + + + (0x7234b86b, 0x2b8651a5) + 288 + + + + + (0x00004572, 0x00005e16) + Averaging the squared signal + + + (0x473d9a43, 0x97fc0a97) + 496 + + + (0x7234b86b, 0x2b8651a5) + 480 + + + + + (0x000075fd, 0x00003910) + Selection of 1sec epochs +every 0.1sec. + + + (0x473d9a43, 0x97fc0a97) + 496 + + + (0x7234b86b, 0x2b8651a5) + 400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":400,"identifier":"(0x00003aab, 0x00002c17)","index":0,"name":"Operator","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":372},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000221e, 0x00005cd6)","index":0,"name":"Default tab","parentIdentifier":"(0x00003aab, 0x00002c17)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":267,"identifier":"(0x000054b1, 0x00006a27)","index":0,"maxDividerPosition":355,"name":"Vertical split","parentIdentifier":"(0x0000221e, 0x00005cd6)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":123,"identifier":"(0x00002440, 0x00003f75)","index":0,"maxDividerPosition":251,"name":"Vertical split","parentIdentifier":"(0x000054b1, 0x00006a27)","type":4},{"boxIdentifier":"(0x00005aff, 0x0000311f)","childCount":0,"identifier":"(0x00001ffd, 0x00007f5a)","index":1,"parentIdentifier":"(0x000054b1, 0x00006a27)","type":3},{"boxIdentifier":"(0x00003cd9, 0x00004082)","childCount":0,"identifier":"(0x000073b3, 0x00005c8f)","index":0,"parentIdentifier":"(0x00002440, 0x00003f75)","type":3},{"boxIdentifier":"(0x00003418, 0x000038d7)","childCount":0,"identifier":"(0x00006cd9, 0x0000558d)","index":1,"parentIdentifier":"(0x00002440, 0x00003f75)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Neurofeedback example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + bci-examples + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/neurofeedback/signals/neurofeedback.gdf b/Masterarbeit/openvibe/extras-master/applications/demos/neurofeedback/signals/neurofeedback.gdf new file mode 100644 index 0000000..1b06694 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/neurofeedback/signals/neurofeedback.gdf differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/demos/p300/CMakeLists.txt new file mode 100644 index 0000000..6ecf627 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/CMakeLists.txt @@ -0,0 +1,26 @@ + +# FILE(GLOB FILENAMES "bci-examples/*") +# FOREACH(FULLPATH ${FILENAMES}) +# IF(IS_DIRECTORY ${FULLPATH} AND NOT ${FULLPATH} MATCHES ".*\\.svn") +# GET_FILENAME_COMPONENT(DIRNAME ${FULLPATH} NAME) +# IF(${DIRNAME} != "signals") +# # MESSAGE(STATUS "HEP ${DIRNAME}") +# INSTALL(DIRECTORY ${DIRNAME} DESTINATION ${DIST_DATADIR}/openvibe/scenarios/bci-examples/) +# ENDIF(${DIRNAME} != sig +# ENDIF(IS_DIRECTORY ${FULLPATH} AND NOT ${FULLPATH} MATCHES ".*\\.svn") +#ENDFOREACH(FULLPATH ${FILENAMES}) + +# INSTALL(DIRECTORY p300-speller/ DESTINATION ${DIST_DATADIR}/openvibe/bci-examples) +# INSTALL(DIRECTORY p300-speller-xDAWN/ DESTINATION ${DIST_DATADIR}/openvibe/bci-examples) + +# INSTALL(DIRECTORY signals DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) +INSTALL(DIRECTORY bci-examples DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) + +# FILE(GLOB FILENAMES "*") +# FOREACH(FULLPATH ${FILENAMES}) +# IF(IS_DIRECTORY ${FULLPATH} AND NOT ${FULLPATH} MATCHES ".*\\.svn") +# GET_FILENAME_COMPONENT(DIRNAME ${FULLPATH} NAME) +# INSTALL(DIRECTORY ${DIRNAME} DESTINATION ${DIST_DATADIR}/openvibe/scenarios) +# ENDIF(IS_DIRECTORY ${FULLPATH} AND NOT ${FULLPATH} MATCHES ".*\\.svn") +#ENDFOREACH(FULLPATH ${FILENAMES}) + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-epoch-average.cfg b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-epoch-average.cfg new file mode 100644 index 0000000..f6b5fdd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-epoch-average.cfg @@ -0,0 +1,4 @@ + + Epoch block average + 1 + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-1-acquisition.xml b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-1-acquisition.xml new file mode 100644 index 0000000..6bfeb24 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-1-acquisition.xml @@ -0,0 +1,1527 @@ + + 1 + OpenViBE Designer + 2.1.0 + + + + + + (0x000000ea, 0x000057a1) + Launch + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-magic-card-launch.lua + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to send + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x512a166f, 0x5c3ef83f) + Time to send + 20 + 20 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -309.000000 + + + (0x207c9054, 0x3c841b63) + 576.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x03413982) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000646, 0x00007f3d) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/current-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128.000000 + + + (0x207c9054, 0x3c841b63) + 544.000000 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01692b36) + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000676, 0x00006650) + P300 Magic Card Visualisation + (0x841f46ef, 0x471aa2a4) + + + (0x6f752dd0, 0x082a321e) + Sequence stimulations + + + (0x6f752dd0, 0x082a321e) + Target stimulations + + + (0x6f752dd0, 0x082a321e) + Card selection stimulations + + + + + (0x6f752dd0, 0x082a321e) + Target / Non target flagging (deprecated) + + + + + (0x330306dd, 0x74a95f98) + Interface filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card.ui + ${Path_Data}/plugins/simple-visualisation/p300-magic-card.ui + false + + + (0x7f45a2a9, 0x7db12219) + Background color + 90,90,90 + 90,90,90 + false + + + (0x7f45a2a9, 0x7db12219) + Target background color + 10,40,10 + 10,40,10 + false + + + (0x7f45a2a9, 0x7db12219) + Selected background color + 70,20,20 + 70,20,20 + false + + + (0x2c132d6e, 0x44ab0d97) + Card stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x79a9edeb, 0x245d83fc) + TCP Tagging Host address + localhost + localhost + false + + + (0x007deef9, 0x2f3e95c6) + TCP Tagging Host port + 15361 + 15361 + false + + + (0x330306dd, 0x74a95f98) + Background filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/openvibe-logo.png-offscreen + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/openvibe-logo.png-offscreen + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/01.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/01.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/02.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/02.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/03.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/03.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/04.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/04.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/05.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/05.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/06.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/06.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/07.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/07.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/08.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/08.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/09.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/09.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/10.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/10.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/11.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/11.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/12.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/12.png + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -96.000000 + + + (0x207c9054, 0x3c841b63) + 592.000000 + + + (0x4e7b798a, 0x183beafb) + (0x847d7465, 0xabf7d754) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x06f9335e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 20 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000092f, 0x00006b0c) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432.000000 + + + (0x207c9054, 0x3c841b63) + 256.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000d801b) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00000b5c, 0x00005880) + Cz;O1;O2 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + Cz;O1;O2 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192.000000 + + + (0x207c9054, 0x3c841b63) + 240.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00154c95) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000013fa, 0x00002713) + P300 Speller Stimulator + (0x88857f9a, 0xf560d3eb) + + + (0x6f752dd0, 0x082a321e) + Incoming stimulations + + + + + (0x6f752dd0, 0x082a321e) + Produced stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Start stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x007deef9, 0x2f3e95c6) + Number of rows + 6 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of columns + 6 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of repetitions + 5 + 12 + false + + + (0x007deef9, 0x2f3e95c6) + Number of trials + 5 + 10 + false + + + (0x512a166f, 0x5c3ef83f) + Flash duration (in sec) + 0.075 + 0.200000 + false + + + (0x512a166f, 0x5c3ef83f) + No flash duration (in sec) + 0.125 + 0.100000 + false + + + (0x512a166f, 0x5c3ef83f) + Inter-repetition delay (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Inter-trial delay (in sec) + 2 + 3.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Avoid neighbor flashing + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x8137c905, 0x9ae4ae4b) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x042224e8) + + + + + (0x000017e5, 0x0000150d) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256.000000 + + + (0x207c9054, 0x3c841b63) + 224.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000e7bc9) + + + (0xc73e83ec, 0xf855c5bc) + true + + + + + (0x000019a0, 0x00002a4a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240.000000 + + + (0x207c9054, 0x3c841b63) + 512.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c4ce05) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000355e, 0x00007a77) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000355e, 0x00007a78) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004326, 0x00000921) + Target Card Generation + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-magic-card-stimulations-targets.lua + false + + + (0x007deef9, 0x2f3e95c6) + Card Count + 12 + 12 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation Base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x512a166f, 0x5c3ef83f) + Delay Before Sending (in sec) + 2 + 2 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -176 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0813fd09) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004a89, 0x000051c4) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x207c9054, 0x3c841b63) + 352.000000 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x6cc575bf) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005bc1, 0x00001477) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304.000000 + + + (0x207c9054, 0x3c841b63) + 224.000000 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001669d3) + + + (0xc73e83ec, 0xf855c5bc) + true + + + + + (0x0000667e, 0x000067a8) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32.000000 + + + (0x207c9054, 0x3c841b63) + 400.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x016af041) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + + + (0x0000024e, 0x0000554b) + + (0x00005bc1, 0x00001477) + 0 + + + (0x0000355e, 0x00007a78) + 0 + + + + (0x00000311, 0x00001217) + + (0x0000355e, 0x00007a77) + 0 + + + (0x00000b5c, 0x00005880) + 0 + + + + (0x00000435, 0x00003ae2) + + (0x000013fa, 0x00002713) + 0 + + + (0x00000676, 0x00006650) + 0 + + + + (0x00000906, 0x00000e3d) + + (0x0000355e, 0x00007a78) + 0 + + + (0x0000092f, 0x00006b0c) + 0 + + + + (0x00000b31, 0x0000339f) + + (0x00000b5c, 0x00005880) + 0 + + + (0x000017e5, 0x0000150d) + 0 + + + + (0x0000128f, 0x0000032c) + + (0x0000667e, 0x000067a8) + 2 + + + (0x00004a89, 0x000051c4) + 0 + + + + (0x00001600, 0x00006b67) + + (0x000017e5, 0x0000150d) + 0 + + + (0x00005bc1, 0x00001477) + 0 + + + + (0x000033a2, 0x000026b3) + + (0x0000667e, 0x000067a8) + 1 + + + (0x0000355e, 0x00007a77) + 0 + + + + (0x000037be, 0x00006017) + + (0x0000667e, 0x000067a8) + 0 + + + (0x00000646, 0x00007f3d) + 0 + + + + (0x00004503, 0x00004056) + + (0x0000667e, 0x000067a8) + 2 + + + (0x00000646, 0x00007f3d) + 2 + + + + (0x000052bd, 0x00005e13) + + (0x000000ea, 0x000057a1) + 0 + + + (0x000013fa, 0x00002713) + 0 + + + + (0x00005377, 0x0000722c) + + (0x0000355e, 0x00007a78) + 1 + + + (0x0000092f, 0x00006b0c) + 1 + + + + (0x00005bdb, 0x00005b47) + + (0x0000667e, 0x000067a8) + 1 + + + (0x00000646, 0x00007f3d) + 1 + + + + (0x00005e13, 0x0000304c) + + (0x00004326, 0x00000921) + 0 + + + (0x00000676, 0x00006650) + 1 + + + + (0x00006136, 0x00007c5a) + + (0x000013fa, 0x00002713) + 0 + + + (0x00004326, 0x00000921) + 0 + + + + (0x000066cf, 0x00001437) + + (0x0000355e, 0x00007a77) + 1 + + + (0x0000355e, 0x00007a78) + 1 + + + + (0x00006f1d, 0x00007a62) + + (0x0000667e, 0x000067a8) + 2 + + + (0x0000355e, 0x00007a77) + 1 + + + + (0x00007c62, 0x00001d51) + + (0x0000667e, 0x000067a8) + 2 + + + (0x000019a0, 0x00002a4a) + 0 + + + + + + (0x000026c2, 0x00001bda) + Debug block, not normally used + + + (0x473d9a43, 0x97fc0a97) + 240.000000 + + + (0x7234b86b, 0x2b8651a5) + 496.000000 + + + + + (0x0000286c, 0x000052e9) + Credits: + +The images flashed in this and the other related +P300 card scenarios were created by <i>zcool</i>, +<i>http://www.zcool.com.cn/</i>. Please see +'license.txt' in the image folder for details. + + + (0x473d9a43, 0x97fc0a97) + 960.000000 + + + (0x7234b86b, 0x2b8651a5) + -224.000000 + + + + + (0x00003250, 0x00002099) + File writing block + + + (0x473d9a43, 0x97fc0a97) + 720.000000 + + + (0x7234b86b, 0x2b8651a5) + 128.000000 + + + + + (0x00004c33, 0x00007234) + Stimulations (experiment timeline) will be sent +to the Acquisition Server by TCP Tagging + + + (0x473d9a43, 0x97fc0a97) + 864.000000 + + + (0x7234b86b, 0x2b8651a5) + -96.000000 + + + + + (0x00007504, 0x00000aa5) + P300 Magic Card + +Training data collection scenario + +Flashing will start automatically +after 20 secs + + + (0x473d9a43, 0x97fc0a97) + 320.000000 + + + (0x7234b86b, 0x2b8651a5) + -224.000000 + + + + + + + (0x000033a2, 0x000026b4) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00000676, 0x00006650)","childCount":0,"identifier":"(0x0000355e, 0x00007a77)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0x0000092f, 0x00006b0c)","childCount":0,"identifier":"(0x00006b70, 0x000013ef)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3}] + + + + + (0x4c90d4ad, 0x7a2554ec) + 1119 + + + (0x790d75b8, 0x3bb90c33) + + + + (0x7b814cca, 0x271df6dd) + 1394 + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + P300 Magic Card + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + bci-examples + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-2-train-classifier.xml b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-2-train-classifier.xml new file mode 100644 index 0000000..b7d0b1e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-2-train-classifier.xml @@ -0,0 +1,1140 @@ + + 1 + OpenViBE Designer + 2.1.0 + + + + + + (0x0000033f, 0x000020d9) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + CHANGE_ME + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -160.000000 + + + (0x207c9054, 0x3c841b63) + 496.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x020d562a) + + + + + (0x00004375, 0x000055be) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64.000000 + + + (0x207c9054, 0x3c841b63) + 416.000000 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00f8f8a1) + + + + + (0x0000554a, 0x000038d8) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 512 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005c6a, 0x00006ccd) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.6 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00005c6a, 0x00006cce) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.6 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_NonTarget + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00005d74, 0x00000b47) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 640.000000 + + + (0x207c9054, 0x3c841b63) + 528.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a2a90c) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000060fa, 0x00005b23) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Epoch block average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-epoch-average.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000060fa, 0x00005b24) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Epoch block average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-epoch-average.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000657e, 0x000036e1) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + Cz;O1;O2 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48.000000 + + + (0x207c9054, 0x3c841b63) + 416.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00fe692e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006a0d, 0x00006861) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x007b56b5) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000777a, 0x00001cfd) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005ed49c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007f97, 0x00003689) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16.000000 + + + (0x207c9054, 0x3c841b63) + 416.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0154eb12) + + + + + (0x1a538d37, 0x06b8561f) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/p300-classifier.cfg + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Target + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_NonTarget + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 576.000000 + + + (0x207c9054, 0x3c841b63) + 528.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x016b441d) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x0000042f, 0x000018ba) + + (0x0000657e, 0x000036e1) + 0 + + + (0x00007f97, 0x00003689) + 0 + + + + (0x0000057e, 0x00006489) + + (0x00004375, 0x000055be) + 0 + + + (0x00005c6a, 0x00006cce) + 0 + + + + (0x00000f98, 0x00000815) + + (0x0000554a, 0x000038d8) + 0 + + + (0x1a538d37, 0x06b8561f) + 0 + + + + (0x000015a6, 0x00003eb8) + + (0x0000554a, 0x000038d8) + 0 + + + (0x00005c6a, 0x00006cce) + 1 + + + + (0x00001c81, 0x00001a2e) + + (0x1a538d37, 0x06b8561f) + 0 + + + (0x00005d74, 0x00000b47) + 0 + + + + (0x00001e8e, 0x0000342c) + + (0x000060fa, 0x00005b23) + 0 + + + (0x0000777a, 0x00001cfd) + 0 + + + + (0x00002898, 0x00000eeb) + + (0x00005c6a, 0x00006cce) + 0 + + + (0x000060fa, 0x00005b24) + 0 + + + + (0x00002a69, 0x00002092) + + (0x00007f97, 0x00003689) + 0 + + + (0x00004375, 0x000055be) + 0 + + + + (0x00002d41, 0x0000465d) + + (0x0000033f, 0x000020d9) + 2 + + + (0x0000554a, 0x000038d8) + 0 + + + + (0x00003a7d, 0x00003daf) + + (0x000060fa, 0x00005b24) + 0 + + + (0x00006a0d, 0x00006861) + 0 + + + + (0x000049b1, 0x00005623) + + (0x00004375, 0x000055be) + 0 + + + (0x00005c6a, 0x00006ccd) + 0 + + + + (0x00004fef, 0x00007768) + + (0x0000554a, 0x000038d8) + 0 + + + (0x00005c6a, 0x00006ccd) + 1 + + + + (0x00005f25, 0x000032cb) + + (0x00005c6a, 0x00006ccd) + 0 + + + (0x000060fa, 0x00005b23) + 0 + + + + (0x0000753f, 0x00001b1c) + + (0x0000033f, 0x000020d9) + 1 + + + (0x0000657e, 0x000036e1) + 0 + + + + (0x02a1b5cd, 0x3034ab1a) + + (0x0000777a, 0x00001cfd) + 0 + + + (0x1a538d37, 0x06b8561f) + 1 + + + + (0x7ca548f4, 0x590c35f5) + + (0x00006a0d, 0x00006861) + 0 + + + (0x1a538d37, 0x06b8561f) + 2 + + + + + + (0x00007504, 0x00000aa5) + P300 Magic Card + +Classifier training scenario + +Remember to change the +filename in the Generic Stream +Reader box + + + (0x473d9a43, 0x97fc0a97) + 224.000000 + + + (0x7234b86b, 0x2b8651a5) + -128.000000 + + + + + + + (0x00002715, 0x0000246a) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 903 + + + (0x790d75b8, 0x3bb90c33) + + + + (0x7b814cca, 0x271df6dd) + 1263 + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + P300 Magic Card + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + bci-examples + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-3-online.xml b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-3-online.xml new file mode 100644 index 0000000..c6bc534 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-3-online.xml @@ -0,0 +1,1510 @@ + + 1 + OpenViBE Designer + 2.1.0 + + + + + + (0x000000ea, 0x000057a1) + Launch + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-magic-card-launch.lua + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to send + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x512a166f, 0x5c3ef83f) + Time to send + 20 + 20 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 496.000000 + + + (0x207c9054, 0x3c841b63) + 128.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x03adf2ea) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x000011e6, 0x0000013f) + P300 Magic Card Visualisation + (0x841f46ef, 0x471aa2a4) + + + (0x6f752dd0, 0x082a321e) + Sequence stimulations + + + (0x6f752dd0, 0x082a321e) + Target stimulations + + + (0x6f752dd0, 0x082a321e) + Card selection stimulations + + + + + (0x6f752dd0, 0x082a321e) + Target / Non target flagging (deprecated) + + + + + (0x330306dd, 0x74a95f98) + Interface filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card.ui + ${Path_Data}/plugins/simple-visualisation/p300-magic-card.ui + false + + + (0x7f45a2a9, 0x7db12219) + Background color + 90,90,90 + 90,90,90 + false + + + (0x7f45a2a9, 0x7db12219) + Target background color + 10,40,10 + 10,40,10 + false + + + (0x7f45a2a9, 0x7db12219) + Selected background color + 70,20,20 + 70,20,20 + false + + + (0x2c132d6e, 0x44ab0d97) + Card stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x79a9edeb, 0x245d83fc) + TCP Tagging Host address + localhost + localhost + false + + + (0x007deef9, 0x2f3e95c6) + TCP Tagging Host port + 15361 + 15361 + false + + + (0x330306dd, 0x74a95f98) + Background filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/openvibe-logo.png-offscreen + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/openvibe-logo.png-offscreen + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/01.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/01.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/02.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/02.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/03.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/03.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/04.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/04.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/05.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/05.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/06.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/06.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/07.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/07.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/08.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/08.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/09.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/09.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/10.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/10.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/11.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/11.png + false + + + (0x330306dd, 0x74a95f98) + Card filename + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/12.png + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/12.png + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 739.000000 + + + (0x207c9054, 0x3c841b63) + 208.000000 + + + (0x4e7b798a, 0x183beafb) + (0x847d7465, 0xabf7d754) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x089320e1) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 20 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000016ac, 0x00007204) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + Cz;O1;O2 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 99.000000 + + + (0x207c9054, 0x3c841b63) + 288.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00f25a1f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001c1d, 0x00005925) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 435.000000 + + + (0x207c9054, 0x3c841b63) + 336.000000 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006759ac) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000025d7, 0x000027f6) + Target Card Generation + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-magic-card-stimulations-targets.lua + false + + + (0x007deef9, 0x2f3e95c6) + Card Count + 12 + 12 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation Base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x512a166f, 0x5c3ef83f) + Delay Before Sending (in sec) + 2 + 2 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 659.000000 + + + (0x207c9054, 0x3c841b63) + 256.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0839abee) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002abc, 0x000064b8) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Epoch block average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002c9d, 0x00004ec3) + P300 Speller Stimulator + (0x88857f9a, 0xf560d3eb) + + + (0x6f752dd0, 0x082a321e) + Incoming stimulations + + + + + (0x6f752dd0, 0x082a321e) + Produced stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Start stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x007deef9, 0x2f3e95c6) + Number of rows + 6 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of columns + 6 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of repetitions + 5 + 12 + false + + + (0x007deef9, 0x2f3e95c6) + Number of trials + 5 + 10 + false + + + (0x512a166f, 0x5c3ef83f) + Flash duration (in sec) + 0.075 + 0.200000 + false + + + (0x512a166f, 0x5c3ef83f) + No flash duration (in sec) + 0.125 + 0.100000 + false + + + (0x512a166f, 0x5c3ef83f) + Inter-repetition delay (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Inter-trial delay (in sec) + 2 + 3.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Avoid neighbor flashing + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 579.000000 + + + (0x207c9054, 0x3c841b63) + 128.000000 + + + (0x4e7b798a, 0x183beafb) + (0x8137c905, 0x9ae4ae4b) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0470435c) + + + + + (0x0000445b, 0x000068e3) + P300 accumulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-magic-card-accumulator.lua + false + + + (0x2c132d6e, 0x44ab0d97) + Card stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Segment start + OVTK_StimulationId_SegmentStart + OVTK_StimulationId_TrialStart + false + + + (0x2c132d6e, 0x44ab0d97) + Segment stop + OVTK_StimulationId_SegmentStop + OVTK_StimulationId_TrialStop + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 595.000000 + + + (0x207c9054, 0x3c841b63) + 528.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x06d13944) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004535, 0x00003b18) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/current-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -13.000000 + + + (0x207c9054, 0x3c841b63) + 480.000000 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x018a32e4) + + + (0xfba64161, 0x65304e21) + + + + + + (0x000046f3, 0x00007b73) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 211.000000 + + + (0x207c9054, 0x3c841b63) + 272.000000 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00f6273e) + + + + + (0x00004f1d, 0x0000163c) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -125.000000 + + + (0x207c9054, 0x3c841b63) + 336.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01d2285e) + + + + + (0x00005af6, 0x00007fb7) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 163.000000 + + + (0x207c9054, 0x3c841b63) + 272.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0169e3c3) + + + + + (0x000067b7, 0x00007638) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006874, 0x00002b34) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.6 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_VisualStimulationStart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x5c153f57, 0x0936c9ef) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/p300-classifier.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 499.000000 + + + (0x207c9054, 0x3c841b63) + 352.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00816f00) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + + + (0x00000b2f, 0x0000525f) + + (0x00004f1d, 0x0000163c) + 1 + + + (0x00004535, 0x00003b18) + 1 + + + + (0x000010b7, 0x000031ee) + + (0x00004f1d, 0x0000163c) + 2 + + + (0x00004535, 0x00003b18) + 2 + + + + (0x0000205c, 0x00003b44) + + (0x00001c1d, 0x00005925) + 0 + + + (0x5c153f57, 0x0936c9ef) + 0 + + + + (0x00002966, 0x00007215) + + (0x00004f1d, 0x0000163c) + 1 + + + (0x000016ac, 0x00007204) + 0 + + + + (0x00002e62, 0x00003c46) + + (0x5c153f57, 0x0936c9ef) + 0 + + + (0x0000445b, 0x000068e3) + 0 + + + + (0x00004020, 0x00004283) + + (0x000067b7, 0x00007638) + 0 + + + (0x00006874, 0x00002b34) + 1 + + + + (0x000047ec, 0x000003c3) + + (0x000000ea, 0x000057a1) + 0 + + + (0x00002c9d, 0x00004ec3) + 0 + + + + (0x000048c7, 0x0000530d) + + (0x00004f1d, 0x0000163c) + 0 + + + (0x00004535, 0x00003b18) + 0 + + + + (0x00004d10, 0x00006f03) + + (0x000067b7, 0x00007638) + 0 + + + (0x0000445b, 0x000068e3) + 1 + + + + (0x00005339, 0x000020a6) + + (0x00002c9d, 0x00004ec3) + 0 + + + (0x000011e6, 0x0000013f) + 0 + + + + (0x0000593a, 0x00007147) + + (0x0000445b, 0x000068e3) + 0 + + + (0x000011e6, 0x0000013f) + 2 + + + + (0x00005967, 0x00003678) + + (0x00006874, 0x00002b34) + 0 + + + (0x00002abc, 0x000064b8) + 0 + + + + (0x00005c60, 0x00006c9d) + + (0x00004f1d, 0x0000163c) + 2 + + + (0x000067b7, 0x00007638) + 0 + + + + (0x00006064, 0x00004e8d) + + (0x000016ac, 0x00007204) + 0 + + + (0x00005af6, 0x00007fb7) + 0 + + + + (0x000063c3, 0x00005d47) + + (0x000046f3, 0x00007b73) + 0 + + + (0x00006874, 0x00002b34) + 0 + + + + (0x00006875, 0x00000e10) + + (0x00002c9d, 0x00004ec3) + 0 + + + (0x000025d7, 0x000027f6) + 0 + + + + (0x00006893, 0x000069fa) + + (0x00002abc, 0x000064b8) + 0 + + + (0x00001c1d, 0x00005925) + 0 + + + + (0x00007b58, 0x00007e8b) + + (0x00005af6, 0x00007fb7) + 0 + + + (0x000046f3, 0x00007b73) + 0 + + + + (0x00007ed6, 0x0000785b) + + (0x000025d7, 0x000027f6) + 0 + + + (0x000011e6, 0x0000013f) + 1 + + + + + + (0x00007504, 0x00000aa5) + P300 Magic Card + +Online scenario using +previously trained classifier + +Flashing will start after +20 secs + + + (0x473d9a43, 0x97fc0a97) + 80.000000 + + + (0x7234b86b, 0x2b8651a5) + -48.000000 + + + + + + + (0x0000284a, 0x00004ea9) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x000011e6, 0x0000013f)","childCount":0,"identifier":"(0x00007424, 0x00003375)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3}] + + + + + (0x4c90d4ad, 0x7a2554ec) + 903 + + + (0x790d75b8, 0x3bb90c33) + + + + (0x7b814cca, 0x271df6dd) + 1111 + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + P300 Magic Card + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + bci-examples + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-accumulator.lua b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-accumulator.lua new file mode 100644 index 0000000..f37b47e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-accumulator.lua @@ -0,0 +1,179 @@ + +function arrayMax(a) + if #a == 0 then return nil, nil end + local maxIdx, maxValue = 0, a[0] + for i = 1, (#a -1 ) do + if maxValue < a[i] then + maxIdx, maxValue = i, a[i] + end + end + return maxIdx, maxValue +end + +-- For handling target fifo + +List = {} +function List.new () + return {first = 0, last = -1} +end + +function List.pushright (list, value) + local last = list.last + 1 + list.last = last + list[last] = value +end + +function List.popleft (list) + local first = list.first + if first > list.last then + error("list is empty") + end + local value = list[first] + list[first] = nil -- to allow garbage collection + list.first = first + 1 + return value +end + +function List.isempty (list) + if list.first > list.last then + return true + else + return false + end +end + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + row_base = _G[box:get_setting(2)] + segment_start = _G[box:get_setting(3)] + segment_stop = _G[box:get_setting(4)] + + -- 0 inactive, 1 segment started, 2 segment stopped (can vote) + segment_status = 0 + + -- the idea is to push the flash states to the fifo, and when predictions arrive (with some delay), they are matched in oldest-first fashion. + target_fifo = List.new() + + -- box:log("Info", string.format("pop %d %d", id[1], id[2])) + + row_votes = {} + + do_debug = false + +end + +-- this function is called when the box is uninitialized +function uninitialize(box) + +end + +function process(box) + -- loops until box is stopped + while box:keep_processing() do + + -- first, parse the timeline stream + for stimulation = 1, box:get_stimulation_count(2) do + -- gets the received stimulation + local identifier, date, duration = box:get_stimulation(2, 1) + -- discards it + box:remove_stimulation(2, 1) + + if identifier == segment_start then + if do_debug then + box:log("Info", string.format("Trial start")) + box:log("Info", string.format("Clear votes")) + end + -- zero the votes + row_votes = {} + target_fifo = List.new() + -- fixme fixed 20 + for i = 0,20 do + row_votes[i] = 0 + end + segment_status = 1 + end + + -- Does the identifier code a flash? if so, put into fifo + if segment_status == 1 and identifier >= row_base and identifier <= OVTK_StimulationId_LabelEnd then + + local t = {"row", identifier - row_base} + List.pushright(target_fifo,t) + if do_debug then + box:log("Info", string.format("Push row target %d", identifier - row_base )) + end + + end + + if identifier == segment_stop then + if do_debug then + box:log("Info", string.format("Trial stop")) + end + segment_status = 2 + end + + end + + -- then parse the classifications + for stimulation = 1, box:get_stimulation_count(1) do + + -- gets the received stimulation + local identifier, date, duration = box:get_stimulation(1, 1) + -- discards it + box:remove_stimulation(1, 1) + + -- Is it an in-class prediction? + if identifier == OVTK_StimulationId_Target then + local t = List.popleft(target_fifo) + if do_debug then + box:log("Info", string.format("Pred fifo %s %d is target", t[1], t[2])) + end + if t[1]=="row" then + row_votes[t[2]] = row_votes[t[2]] + 1 + end + end + + if identifier == OVTK_StimulationId_NonTarget then + local t = List.popleft(target_fifo) + if do_debug then + box:log("Info", string.format("Pred fifo %s %d is nontarget", t[1], t[2])) + end + -- vote not added in this case + end + + end + + if segment_status == 2 and List.isempty(target_fifo) then + -- output the vote after the segment end when we've matched all predictions + + local maxRowIdx, maxRowValue = arrayMax(row_votes) + + if maxRowValue == 0 then + box:log("Warning", string.format("Classifier predicted 'no p300' for all flashes of the trial")); + end + + if do_debug then + local rowVotes = 0 + for ir, val in pairs(row_votes) do + rowVotes = rowVotes + val + end + + box:log("Info", string.format("Vote [%d] wt [%d]", maxRowIdx+row_base, maxRowValue)) + box:log("Info", string.format(" Total [%d]", rowVotes)) + end + + + + local now = box:get_current_time() + + box:send_stimulation(1, maxRowIdx + row_base, now, 0) + + segment_status = 0 + end + + box:sleep() + end +end + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-launch.lua b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-launch.lua new file mode 100644 index 0000000..8c65efb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-launch.lua @@ -0,0 +1,21 @@ + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + stim = _G[box:get_setting(2)] + launchTime = box:get_setting(3) + +end + +-- this function is called when the box is uninitialized +function uninitialize(box) +end + +-- this function is called once by the box +function process(box) + + box:send_stimulation(1, stim, launchTime, 0) + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-stimulations-targets.lua b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-stimulations-targets.lua new file mode 100644 index 0000000..cdeeb58 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-stimulations-targets.lua @@ -0,0 +1,57 @@ +-- This Lua script generates target stimulations for the magic card demo +-- +-- Author : Yann Renard, INRIA +-- Date : 2011-03-15 + +-- this function is called when the box is initialized +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + math.randomseed(os.time()) + card_count = box:get_setting(2) + card_base = _G[box:get_setting(3)] + delay = box:get_setting(4) +end + +-- this function is called when the box is uninitialized +function uninitialize(box) +end + +-- this function is called once by the box +function process(box) + + -- loop until box:keep_processing() returns zero + -- cpu will be released with a call to sleep + -- at the end of the loop + while box:keep_processing() do + + -- gets current simulated time + t = box:get_current_time() + + -- loops on every received stimulation for a given input + for stimulation = 1, box:get_stimulation_count(1) do + + -- gets stimulation + stimulation_id, stimulation_time, stimulation_duration = box:get_stimulation(1, 1) + + if stimulation_id == OVTK_StimulationId_RestStart then + + -- triggers the target + box:send_stimulation(1, card_base + math.random(card_count) - 1, box:get_current_time() + delay, 0) + + elseif stimulation_id == OVTK_StimulationId_ExperimentStop then + + -- triggers train stimulation + box:send_stimulation(1, OVTK_StimulationId_Train, t+delay+1, 0) + + end + + -- discards it + box:remove_stimulation(1, 1) + end + + -- releases cpu + box:sleep() + end +end + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/signals/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/signals/README.txt new file mode 100644 index 0000000..8eaa204 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-magic-card/signals/README.txt @@ -0,0 +1,3 @@ + +The scenario will record its signals here. + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-epoch-average.cfg b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-epoch-average.cfg new file mode 100644 index 0000000..f6b5fdd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-epoch-average.cfg @@ -0,0 +1,4 @@ + + Epoch block average + 1 + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-accumulator.lua b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-accumulator.lua new file mode 100644 index 0000000..37962cc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-accumulator.lua @@ -0,0 +1,200 @@ + +function arrayMax(a) + if #a == 0 then return nil, nil end + local maxIdx, maxValue = 0, a[0] + for i = 1, (#a -1 ) do + if maxValue < a[i] then + maxIdx, maxValue = i, a[i] + end + end + return maxIdx, maxValue +end + +-- For handling target fifo + +List = {} +function List.new () + return {first = 0, last = -1} +end + +function List.pushright (list, value) + local last = list.last + 1 + list.last = last + list[last] = value +end + +function List.popleft (list) + local first = list.first + if first > list.last then + error("list is empty") + end + local value = list[first] + list[first] = nil -- to allow garbage collection + list.first = first + 1 + return value +end + +function List.isempty (list) + if list.first > list.last then + return true + else + return false + end +end + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + row_base = _G[box:get_setting(2)] + col_base = _G[box:get_setting(3)] + segment_start = _G[box:get_setting(4)] + segment_stop = _G[box:get_setting(5)] + + -- 0 inactive, 1 segment started, 2 segment stopped (can vote) + segment_status = 0 + + -- the idea is to push the flash states to the fifo, and when predictions arrive (with some delay), they are matched in oldest-first fashion. + target_fifo = List.new() + + -- box:log("Info", string.format("pop %d %d", id[1], id[2])) + + row_votes = {} + col_votes = {} + + do_debug = false + +end + +-- this function is called when the box is uninitialized +function uninitialize(box) + +end + +function process(box) + -- loops until box is stopped + while box:keep_processing() do + + -- first, parse the timeline stream + for stimulation = 1, box:get_stimulation_count(2) do + -- gets the received stimulation + local identifier, date, duration = box:get_stimulation(2, 1) + -- discards it + box:remove_stimulation(2, 1) + + if identifier == segment_start then + if do_debug then + box:log("Info", string.format("Trial start")) + box:log("Info", string.format("Clear votes")) + end + -- zero the votes + col_votes = {} + row_votes = {} + target_fifo = List.new() + -- fixme fixed 20 + for i = 0,20 do + col_votes[i] = 0 + row_votes[i] = 0 + end + segment_status = 1 + end + + -- Does the identifier code a flash? if so, put into fifo + if segment_status == 1 and identifier >= row_base and identifier <= OVTK_StimulationId_LabelEnd then + + -- assume rows before cols + if identifier < col_base then + local t = {"row", identifier - row_base} + List.pushright(target_fifo,t) + if do_debug then + box:log("Info", string.format("Push row target %d", identifier - row_base )) + end + else + local t = {"col", identifier - col_base} + List.pushright(target_fifo,t) + if do_debug then + box:log("Info", string.format("Push col target %d", identifier - col_base )) + end + end + + + end + + if identifier == segment_stop then + if do_debug then + box:log("Info", string.format("Trial stop")) + end + segment_status = 2 + end + + end + + -- then parse the classifications + for stimulation = 1, box:get_stimulation_count(1) do + + -- gets the received stimulation + local identifier, date, duration = box:get_stimulation(1, 1) + -- discards it + box:remove_stimulation(1, 1) + + -- Is it an in-class prediction? + if identifier == OVTK_StimulationId_Target then + local t = List.popleft(target_fifo) + if do_debug then + box:log("Info", string.format("Pred fifo %s %d is target", t[1], t[2])) + end + if t[1]=="row" then + row_votes[t[2]] = row_votes[t[2]] + 1 + else + col_votes[t[2]] = col_votes[t[2]] + 1 + end + end + + if identifier == OVTK_StimulationId_NonTarget then + local t = List.popleft(target_fifo) + if do_debug then + box:log("Info", string.format("Pred fifo %s %d is nontarget", t[1], t[2])) + end + end + + end + + if segment_status == 2 and List.isempty(target_fifo) then + -- output the vote after the segment end when we've matched all predictions + + local maxRowIdx, maxRowValue = arrayMax(row_votes) + local maxColIdx, maxColValue = arrayMax(col_votes) + + if maxRowValue == 0 and maxColValue == 0 then + box:log("Warning", string.format("Classifier predicted 'no p300' for all flashes of the trial")); + end + + if do_debug then + local rowVotes = 0 + local colVotes = 0 + for ir, val in pairs(row_votes) do + rowVotes = rowVotes + val + end + for ir, val in pairs(col_votes) do + colVotes = colVotes + val + end + + box:log("Info", string.format("Vote [%d %d] wt [%d,%d]", maxRowIdx+row_base, maxColIdx+col_base, maxRowValue, maxColValue)) + box:log("Info", string.format(" Total [%d %d]", rowVotes, colVotes)) + end + + + + local now = box:get_current_time() + + box:send_stimulation(1, maxRowIdx + row_base, now, 0) + box:send_stimulation(2, maxColIdx + col_base, now, 0) + + segment_status = 0 + end + + box:sleep() + end +end + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-filter-flash.lua b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-filter-flash.lua new file mode 100644 index 0000000..846bd55 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-filter-flash.lua @@ -0,0 +1,61 @@ + +-- Picks out 'flashes' from a stimulation stream + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + box:set_filter_mode(1); + + state = 0 + + do_debug = false +end + +-- this function is called when the box is uninitialized +function uninitialize(box) +end + +-- this function is called once by the box +function process(box) + + -- loop until box:keep_processing() returns zero + -- cpu will be released with a call to sleep + -- at the end of the loop + while box:keep_processing() do + + -- gets current simulated time + t = box:get_current_time() + + -- loops on every received stimulation for a given input + for stimulation = 1, box:get_stimulation_count(1) do + + -- gets stimulation + stimulation_id, stimulation_time, stimulation_duration = box:get_stimulation(1, 1) + + if stimulation_id == OVTK_StimulationId_SegmentStart then + state = 1 + elseif stimulation_id == OVTK_StimulationId_SegmentStop then + state = 0 + end + + -- If we're between 'rest start' and 'rest_stop', this specifies a target + if state == 1 and stimulation_id >= OVTK_StimulationId_LabelStart and stimulation_id <= OVTK_StimulationId_LabelEnd then + + box:send_stimulation(1, stimulation_id, stimulation_time, 0) + + if do_debug then + box:log("Info", string.format("Push a target %d at %f (now %f)", stimulation_id, stimulation_time, t)) + end + end + + -- discards it + box:remove_stimulation(1, 1) + + end + + -- releases cpu + box:sleep() + end +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-filter-target.lua b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-filter-target.lua new file mode 100644 index 0000000..3a67c76 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-filter-target.lua @@ -0,0 +1,61 @@ + +-- Picks out 'targets' from a stimulation stream + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + state = 0 + + box:set_filter_mode(1); + + do_debug = false +end + +-- this function is called when the box is uninitialized +function uninitialize(box) +end + +-- this function is called once by the box +function process(box) + + -- loop until box:keep_processing() returns zero + -- cpu will be released with a call to sleep + -- at the end of the loop + while box:keep_processing() do + + -- gets current simulated time + t = box:get_current_time() + + -- loops on every received stimulation for a given input + for stimulation = 1, box:get_stimulation_count(1) do + + -- gets stimulation + stimulation_id, stimulation_time, stimulation_duration = box:get_stimulation(1, 1) + + if stimulation_id == OVTK_StimulationId_RestStart then + state = 1 + elseif stimulation_id == OVTK_StimulationId_RestStop then + state = 0 + end + + -- If we're between 'rest start' and 'rest_stop', this specifies a target + if state == 1 and stimulation_id >= OVTK_StimulationId_LabelStart and stimulation_id <= OVTK_StimulationId_LabelEnd then + + box:send_stimulation(1, stimulation_id, stimulation_time, 0) + + if do_debug then + box:log("Info", string.format("Push a target %d at %f (now = %f)", stimulation_id, stimulation_time, t)) + end + end + + -- discards it + box:remove_stimulation(1, 1) + + end + + -- releases cpu + box:sleep() + end +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-launch.lua b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-launch.lua new file mode 100644 index 0000000..8c65efb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-launch.lua @@ -0,0 +1,21 @@ + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + stim = _G[box:get_setting(2)] + launchTime = box:get_setting(3) + +end + +-- this function is called when the box is uninitialized +function uninitialize(box) +end + +-- this function is called once by the box +function process(box) + + box:send_stimulation(1, stim, launchTime, 0) + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-target.lua b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-target.lua new file mode 100644 index 0000000..fa29e00 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-target.lua @@ -0,0 +1,95 @@ +-- This Lua script generates target stimulations for the P300 visualization +-- box based on the matrix of letters / numbers a P300 speller has +-- +-- Author : Yann Renard, INRIA +-- Date : 2011-03-15 + +grid = +{ + { 'a', 'b', 'c', 'd', 'e', 'f' }, + { 'g', 'h', 'i', 'j', 'k', 'l' }, + { 'm', 'n', 'o', 'p', 'q', 'r' }, + { 's', 't', 'u', 'v', 'w', 'x' }, + { 'y', 'z', '1', '2', '3', '4' }, + { '5', '6', '7', '8', '9', '0' }, +} + +index = 0 + +function get_location(c) + for i = 1, 6 do + for j = 1, 6 do + if grid[i][j] == c then + return i, j + end + end + end + return 0, 0 +end + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + math.randomseed(os.time()) + target = box:get_setting(2) + row_base = _G[box:get_setting(3)] + col_base = _G[box:get_setting(4)] + delay = box:get_setting(5) + if target == "" then + for i = 1, 1000 do + a = math.random(1, #grid) + b = math.random(1, #grid[1]) + target = target .. grid[a][b] + end + end +end + +-- this function is called when the box is uninitialized +function uninitialize(box) +end + +-- this function is called once by the box +function process(box) + + -- loop until box:keep_processing() returns zero + -- cpu will be released with a call to sleep + -- at the end of the loop + while box:keep_processing() do + + -- gets current simulated time + t = box:get_current_time() + + -- loops on every received stimulation for a given input + for stimulation = 1, box:get_stimulation_count(1) do + + -- gets stimulation + stimulation_id, stimulation_time, stimulation_duration = box:get_stimulation(1, 1) + + if stimulation_id == OVTK_StimulationId_RestStart then + + -- finds a new target + index = index + 1 + r, c = get_location(string.sub(target, index, index)) + + -- triggers the target + box:send_stimulation(1, row_base+r-1, t+delay, 0) + box:send_stimulation(1, col_base+c-1, t+delay, 0) + + elseif stimulation_id == OVTK_StimulationId_ExperimentStop then + + -- triggers train stimulation + box:send_stimulation(1, OVTK_StimulationId_Train, t+delay+1, 0) + + end + + -- discards it + box:remove_stimulation(1, 1) + + end + + -- releases cpu + box:sleep() + end +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-visualization.cfg b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-visualization.cfg new file mode 100644 index 0000000..ae68c18 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-speller-visualization.cfg @@ -0,0 +1,17 @@ + + ${Path_Data}/plugins/simple-visualization/p300-speller.ui + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_07 + 5,5,5 + 100,100,100 + 60 + 0,0,0 + 25,25,25 + 40 + 20,20,70 + 10,10,30 + 40 + 10,40,10 + 60,100,60 + 40 + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-0-signal-monitoring.xml b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-0-signal-monitoring.xml new file mode 100644 index 0000000..82e9156 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-0-signal-monitoring.xml @@ -0,0 +1,924 @@ + + 1 + OpenVIBE + 0.0.2 + + + (0x000014bf, 0x000034db) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 384.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 928.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xac367a9c, 0x2da95abe) + 6 + + + (0xad100179, 0xa3c984ab) + 59 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003f1b, 0x00003c78) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0xad100179, 0xa3c984ab) + 126 + + + + + (0x0000556f, 0x000055f8) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 105 + + + + + (0x00005c5c, 0x00007610) + Raw + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 1024.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 77 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00006b6d, 0x00002690) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 928.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xad100179, 0xa3c984ab) + 121 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00007e4e, 0x00006b7b) + Filtered + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 832.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 77 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + + + (0x000003a7, 0x000034db) + + (0x000014bf, 0x000034db) + 2 + + + (0x00005c5c, 0x00007610) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 407 + + + (0x358ae8b5, 0x0f8bacd1) + 943 + + + (0x3f0a3b27, 0x570913d2) + 486 + + + (0x6267b5c5, 0x676e3e42) + 1024 + + + + + (0x00000554, 0x0000661a) + + (0x000014bf, 0x000034db) + 2 + + + (0x00007e4e, 0x00006b7b) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 407 + + + (0x358ae8b5, 0x0f8bacd1) + 943 + + + (0x3f0a3b27, 0x570913d2) + 486 + + + (0x6267b5c5, 0x676e3e42) + 832 + + + + + (0x00001d33, 0x00002bb0) + + (0x00006b6d, 0x00002690) + 2 + + + (0x000014bf, 0x000034db) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 146 + + + (0x358ae8b5, 0x0f8bacd1) + 928 + + + (0x3f0a3b27, 0x570913d2) + 363 + + + (0x6267b5c5, 0x676e3e42) + 943 + + + + + (0x00003f04, 0x000045c3) + + (0x000014bf, 0x000034db) + 1 + + + (0x00005c5c, 0x00007610) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 407 + + + (0x358ae8b5, 0x0f8bacd1) + 928 + + + (0x3f0a3b27, 0x570913d2) + 486 + + + (0x6267b5c5, 0x676e3e42) + 1009 + + + + + (0x00004b11, 0x00006a43) + + (0x00003f1b, 0x00003c78) + 0 + + + (0x000014bf, 0x000034db) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 338 + + + (0x358ae8b5, 0x0f8bacd1) + 704 + + + (0x3f0a3b27, 0x570913d2) + 363 + + + (0x6267b5c5, 0x676e3e42) + 913 + + + + + (0x000056fd, 0x00004795) + + (0x000014bf, 0x000034db) + 0 + + + (0x00007e4e, 0x00006b7b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 407 + + + (0x358ae8b5, 0x0f8bacd1) + 913 + + + (0x3f0a3b27, 0x570913d2) + 486 + + + (0x6267b5c5, 0x676e3e42) + 817 + + + + + (0x000057ad, 0x000024cb) + + (0x0000556f, 0x000055f8) + 0 + + + (0x00003f1b, 0x00003c78) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 274 + + + (0x358ae8b5, 0x0f8bacd1) + 704 + + + (0x3f0a3b27, 0x570913d2) + 304 + + + (0x6267b5c5, 0x676e3e42) + 704 + + + + + (0x00005e38, 0x00005c99) + + (0x00006b6d, 0x00002690) + 1 + + + (0x000014bf, 0x000034db) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 146 + + + (0x358ae8b5, 0x0f8bacd1) + 913 + + + (0x3f0a3b27, 0x570913d2) + 363 + + + (0x6267b5c5, 0x676e3e42) + 928 + + + + + (0x000073ac, 0x0000581b) + + (0x00006b6d, 0x00002690) + 1 + + + (0x0000556f, 0x000055f8) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 146 + + + (0x358ae8b5, 0x0f8bacd1) + 913 + + + (0x3f0a3b27, 0x570913d2) + 240 + + + (0x6267b5c5, 0x676e3e42) + 704 + + + + + + + (0x00001653, 0x00002964) + <u><b>Note:</b></u> be sure that the +<i>sampling rate</i> and <i>sample count +per buffer</i> you use in the <u>acquisition +server</u> are compatible with the actual +<i>signal decimation factor</i> + + + (0x473d9a43, 0x97fc0a97) + 512 + + + (0x7234b86b, 0x2b8651a5) + 416 + + + + + (0x000028e8, 0x00003dee) + <u><b><big>Overview</big></b></u> + +This scenario can be used in order +to check the quality of the signals +before starting an experiment. + +One should <u>definitely</u> +check the quality of the signals +and ensure that : + +- <b>eye blinks</b> are visible +- <b>jaw clenching</b> are visible +- <b>alpha waves</b> are visible when closing eyes + + + (0x473d9a43, 0x97fc0a97) + 1184 + + + (0x7234b86b, 0x2b8651a5) + 272 + + + + + (0x000049b3, 0x00001e28) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 944 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + (0x00004e8c, 0x000041b6) + The P300 XDawn scenarios are described in + +http://openvibe.inria.fr/p300-speller-xdawn/ + + + (0x473d9a43, 0x97fc0a97) + 576.000000 + + + (0x7234b86b, 0x2b8651a5) + 130.000000 + + + + + (0x000059b5, 0x00001524) + The <i>Temporal Filter</i> +and <i>Signal Decimation</i> +boxes transform the signal +so you can see what is actually +used online. + + + (0x473d9a43, 0x97fc0a97) + 512 + + + (0x7234b86b, 0x2b8651a5) + 288 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":635,"identifier":"(0x000077ee, 0x0000254d)","index":0,"name":"default","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":783},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004579, 0x00005fcb)","index":0,"name":"Default tab","parentIdentifier":"(0x000077ee, 0x0000254d)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":293,"identifier":"(0x00005446, 0x000043a1)","index":0,"maxDividerPosition":590,"name":"Vertical split","parentIdentifier":"(0x00004579, 0x00005fcb)","type":4},{"boxIdentifier":"(0x00005c5c, 0x00007610)","childCount":0,"identifier":"(0x00000e42, 0x000074b8)","index":0,"parentIdentifier":"(0x00005446, 0x000043a1)","type":3},{"boxIdentifier":"(0x00007e4e, 0x00006b7b)","childCount":0,"identifier":"(0x00005db7, 0x000032ad)","index":1,"parentIdentifier":"(0x00005446, 0x000043a1)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renard + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Signal Monitoring + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/p300-speller-xdawn/ + + + (0xf6b2e3fa, 0x7bd43926) + xDAWN P300 Speller + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-1-acquisition.xml b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-1-acquisition.xml new file mode 100644 index 0000000..97fd2d4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-1-acquisition.xml @@ -0,0 +1,1054 @@ + + 1 + OpenVIBE + 0.0.2 + + + (0x000000ea, 0x000057a1) + Launch + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-speller-launch.lua + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to send + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x512a166f, 0x5c3ef83f) + Time to send + 20 + 20 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 128.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 624.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 81 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00e49791) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001a71, 0x00003e16) + P300 Speller Stimulator + (0x88857f9a, 0xf560d3eb) + + + (0x6f752dd0, 0x082a321e) + Incoming stimulations + + + + + (0x6f752dd0, 0x082a321e) + Produced stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Start stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x007deef9, 0x2f3e95c6) + Number of rows + 6 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of columns + 6 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of repetitions + 5 + 12 + false + + + (0x007deef9, 0x2f3e95c6) + Number of trials + 5 + 10 + false + + + (0x512a166f, 0x5c3ef83f) + Flash duration (in sec) + 0.075 + 0.200000 + false + + + (0x512a166f, 0x5c3ef83f) + No flash duration (in sec) + 0.125 + 0.100000 + false + + + (0x512a166f, 0x5c3ef83f) + Inter-repetition delay (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Inter-trial delay (in sec) + 2 + 3.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Avoid neighbor flashing + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 624.000000 + + + (0x4e7b798a, 0x183beafb) + (0x8137c905, 0x9ae4ae4b) + + + (0xad100179, 0xa3c984ab) + 161 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01203bc6) + + + + + (0x00002c69, 0x00000b43) + P300 Speller Visualization + (0x195e41d6, 0x6e684d47) + + + (0x6f752dd0, 0x082a321e) + Sequence stimulations + + + (0x6f752dd0, 0x082a321e) + Target stimulations + + + (0x6f752dd0, 0x082a321e) + Row selection stimulations + + + (0x6f752dd0, 0x082a321e) + Column selection stimulations + + + + + (0x6f752dd0, 0x082a321e) + Target / Non target flagging + + + + + (0x330306dd, 0x74a95f98) + Interface filename + ${Path_Data}/plugins/simple-visualization/p300-speller.glade + ${Path_Data}/plugins/simple-visualization/p300-speller.ui + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x7f45a2a9, 0x7db12219) + Flash background color + 10,10,10 + 5,5,5 + false + + + (0x7f45a2a9, 0x7db12219) + Flash foreground color + 100,100,100 + 100,100,100 + false + + + (0x007deef9, 0x2f3e95c6) + Flash font size + 100 + 60 + false + + + (0x7f45a2a9, 0x7db12219) + No flash background color + 0,0,0 + 0,0,0 + false + + + (0x7f45a2a9, 0x7db12219) + No flash foreground color + 50,50,50 + 25,25,25 + false + + + (0x007deef9, 0x2f3e95c6) + No flash font size + 75 + 40 + false + + + (0x7f45a2a9, 0x7db12219) + Target background color + 10,40,10 + 20,20,70 + false + + + (0x7f45a2a9, 0x7db12219) + Target foreground color + 60,100,60 + 10,10,30 + false + + + (0x007deef9, 0x2f3e95c6) + Target font size + 100 + 40 + false + + + (0x7f45a2a9, 0x7db12219) + Selected background color + 70,20,20 + 10,40,10 + false + + + (0x7f45a2a9, 0x7db12219) + Selected foreground color + 30,10,10 + 60,100,60 + false + + + (0x007deef9, 0x2f3e95c6) + Selected font size + 100 + 40 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 640.000000 + + + (0x4e7b798a, 0x183beafb) + (0x8d89d30c, 0xa939693a) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-speller-visualization.cfg + + + (0xad100179, 0xa3c984ab) + 178 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x07e64d8b) + + + + + (0x0000356c, 0x00004381) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/p300-xdawn-train-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 544.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 623.000000 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0350a9f0) + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004eca, 0x00003f33) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 784.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01070ba6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000599b, 0x000026ba) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 688.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xad100179, 0xa3c984ab) + 121 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02909b75) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00006d0d, 0x000031d8) + Target Letter Generation + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-speller-target.lua + false + + + (0x79a9edeb, 0x245d83fc) + Word to Spell (leave this empty if random) + + + false + + + (0x2c132d6e, 0x44ab0d97) + Row Stimulation Base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column Stimulation Base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x512a166f, 0x5c3ef83f) + Delay Before Sending (in sec) + 2 + 2 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 256.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 736.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 169 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0334c6b7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00000ea4, 0x000068ff) + + (0x0000599b, 0x000026ba) + 2 + + + (0x00004eca, 0x00003f33) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 482 + + + (0x358ae8b5, 0x0f8bacd1) + 688 + + + (0x3f0a3b27, 0x570913d2) + 608 + + + (0x6267b5c5, 0x676e3e42) + 784 + + + + + (0x00001043, 0x00003d7c) + + (0x000000ea, 0x000057a1) + 0 + + + (0x00001a71, 0x00003e16) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 156 + + + (0x358ae8b5, 0x0f8bacd1) + 624 + + + (0x3f0a3b27, 0x570913d2) + 160 + + + (0x6267b5c5, 0x676e3e42) + 624 + + + + + (0x00001d3e, 0x00000740) + + (0x00001a71, 0x00003e16) + 0 + + + (0x00006d0d, 0x000031d8) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 194 + + + (0x358ae8b5, 0x0f8bacd1) + 624 + + + (0x3f0a3b27, 0x570913d2) + 230 + + + (0x6267b5c5, 0x676e3e42) + 736 + + + + + (0x000036a5, 0x00006190) + + (0x0000599b, 0x000026ba) + 0 + + + (0x0000356c, 0x00004381) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 482 + + + (0x358ae8b5, 0x0f8bacd1) + 658 + + + (0x3f0a3b27, 0x570913d2) + 523 + + + (0x6267b5c5, 0x676e3e42) + 608 + + + + + (0x00003aa4, 0x00002b37) + + (0x00006d0d, 0x000031d8) + 0 + + + (0x00002c69, 0x00000b43) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 284 + + + (0x358ae8b5, 0x0f8bacd1) + 736 + + + (0x3f0a3b27, 0x570913d2) + 320 + + + (0x6267b5c5, 0x676e3e42) + 632 + + + + + (0x00004fb0, 0x00001b24) + + (0x00001a71, 0x00003e16) + 0 + + + (0x00002c69, 0x00000b43) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 194 + + + (0x358ae8b5, 0x0f8bacd1) + 624 + + + (0x3f0a3b27, 0x570913d2) + 320 + + + (0x6267b5c5, 0x676e3e42) + 617 + + + + + (0x000068a0, 0x0000330f) + + (0x0000599b, 0x000026ba) + 2 + + + (0x0000356c, 0x00004381) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 482 + + + (0x358ae8b5, 0x0f8bacd1) + 688 + + + (0x3f0a3b27, 0x570913d2) + 523 + + + (0x6267b5c5, 0x676e3e42) + 638 + + + + + (0x00007bda, 0x00000772) + + (0x0000599b, 0x000026ba) + 1 + + + (0x0000356c, 0x00004381) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 482 + + + (0x358ae8b5, 0x0f8bacd1) + 673 + + + (0x3f0a3b27, 0x570913d2) + 523 + + + (0x6267b5c5, 0x676e3e42) + 623 + + + + + + + (0x0000363f, 0x00001c2b) + The P300 Speller Visualization +sends the markers (stimulations) directly to +Acquisition Server using TCP Tagging. + + + (0x473d9a43, 0x97fc0a97) + 960.000000 + + + (0x7234b86b, 0x2b8651a5) + 336.000000 + + + + + (0x00004e8c, 0x000041b6) + The P300 XDawn scenarios are described in + +http://openvibe.inria.fr/p300-speller-xdawn/ + + + (0x473d9a43, 0x97fc0a97) + 320.000000 + + + (0x7234b86b, 0x2b8651a5) + 176.000000 + + + + + (0x19b8795c, 0x039f26f7) + <u><b><big>Overview</big></b></u> + +This scenario can be used as a first +step to collect some training data. The +data will later be used to train a spatial +filter and a classifier for online use. + +The flast sequence will start after 20 sec. + +You will then be presented a blue letter that +you have to focus on, followed by a 12 times +flashing sequence of the whole grid. This will +be repeated 10 times. + +<small><i><b>note:</b> the recorded files go to the +folder where the scenario xml is located +(<span color="darkblue">${Player_ScenarioDirectory}/</span>).</i></small> + + + (0x473d9a43, 0x97fc0a97) + 320.000000 + + + (0x7234b86b, 0x2b8651a5) + 400.000000 + + + + + (0x24020235, 0x4f7e23eb) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 496.000000 + + + (0x7234b86b, 0x2b8651a5) + 48.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00002c69, 0x00000b43)","childCount":0,"identifier":"(0x0000742d, 0x000050d7)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renard, Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Data Acquisition + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/p300-speller-xdawn/ + + + (0xf6b2e3fa, 0x7bd43926) + xDAWN P300 Speller + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-2-train-xDAWN.xml b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-2-train-xDAWN.xml new file mode 100644 index 0000000..0b3c5e0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-2-train-xDAWN.xml @@ -0,0 +1,632 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00001c48, 0x00005598) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + + + (0x00001db8, 0x00001848) + xDAWN Trainer + (0x27542f6e, 0x14aa3548) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Session signal + + + (0x5ba36127, 0x195feae1) + Evoked potential epochs + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train stimulation + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Spatial filter configuration + + ${Player_ScenarioDirectory}/p300-spatial-filter.cfg + false + + + (0x007deef9, 0x2f3e95c6) + Filter dimension + 4 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Save as box config + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0x4b49a133, 0x42f38d94) + + + (0xc80ce8af, 0xf699f813) + + + + (0xce18836a, 0x9c0eb403) + + + + (0xcfad85b0, 0x7c6d841c) + + + + + + (0x00002514, 0x00001614) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/CHANGE_ME.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + + + (0x0000267a, 0x0000427f) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.250000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.250000 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + + + (0x00004aea, 0x00001465) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006be0, 0x000074b5) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + + + (0x00006fa4, 0x00003c76) + Target Selection + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.600000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 433 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + + + + + (0x000007d3, 0x000071cb) + + (0x0000267a, 0x0000427f) + 0 + + + (0x00006fa4, 0x00003c76) + 0 + + + + (0x00003582, 0x00002c04) + + (0x00006be0, 0x000074b5) + 0 + + + (0x0000267a, 0x0000427f) + 0 + + + + (0x00003920, 0x00007a30) + + (0x0000267a, 0x0000427f) + 0 + + + (0x00001db8, 0x00001848) + 1 + + + + (0x00004be2, 0x00004296) + + (0x00006fa4, 0x00003c76) + 0 + + + (0x00001db8, 0x00001848) + 2 + + + + (0x00004bf5, 0x00007908) + + (0x00001db8, 0x00001848) + 0 + + + (0x00004aea, 0x00001465) + 0 + + + + (0x000059e8, 0x00000032) + + (0x00002514, 0x00001614) + 2 + + + (0x00001db8, 0x00001848) + 0 + + + + (0x00006413, 0x00003ed2) + + (0x00001c48, 0x00005598) + 0 + + + (0x00006be0, 0x000074b5) + 0 + + + + (0x00006af9, 0x00002512) + + (0x00002514, 0x00001614) + 2 + + + (0x00006fa4, 0x00003c76) + 1 + + + + (0x000070d8, 0x00000f4e) + + (0x00002514, 0x00001614) + 1 + + + (0x00001c48, 0x00005598) + 0 + + + + + + (0x00000b43, 0x0000067f) + The preprocessing of the signal is +performed here... + +<u><b>Note:</b></u> be sure that the +<i>sampling rate</i> and <i>sample count +per buffer</i> you use in the <u>acquisition +server</u> are compatible with the actual +<i>signal decimation factor</i> + + + (0x473d9a43, 0x97fc0a97) + 48 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + (0x000010db, 0x00003fcd) + For prerecorded data to test this P300, see + +<b>http://openvibe.inria.fr/datasets/</b> + + + + (0x473d9a43, 0x97fc0a97) + 816.000000 + + + (0x7234b86b, 0x2b8651a5) + 112.000000 + + + + + (0x000049d6, 0x00006e67) + <u><b><big>Overview</big></b></u> + +This scenario should be used to train +the spatial filter using the xDAWN algorithm. + +Just configure the <i>Generic Stream Reader</i> +box to point to the last file you recorded with +scenario <i>1-acquisition</i> and fast forward +this scenario. + +At the end of the training, you will have line in +the console about eigen values. +Using a <i>Player Controller</i> the scenario will +automatically pause at the end of the training. + +If you want details on this values, you should read +<u>http://www.icp.inpg.fr/~rivetber/Publications/references/Rivet2009a.pdf</u> + + + (0x473d9a43, 0x97fc0a97) + 800.000000 + + + (0x7234b86b, 0x2b8651a5) + -80.000000 + + + + + (0x00007b93, 0x000041da) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 304.000000 + + + (0x7234b86b, 0x2b8651a5) + -192.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renard + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Spatial Filter Training + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/p300-speller-xdawn/ + + + (0xf6b2e3fa, 0x7bd43926) + xDAWN P300 Speller + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-3-train-classifier.xml b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-3-train-classifier.xml new file mode 100644 index 0000000..8db2c94 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-3-train-classifier.xml @@ -0,0 +1,1450 @@ + + 1 + OpenViBE + 1.2.0 + + + (0x00000b2d, 0x00006d61) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002bb807) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000d41, 0x000013b7) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002b7d6e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001f83, 0x00004e32) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/CHANGE_ME.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 400.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 153 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x008e34c7) + + + + + (0x00002c8b, 0x000001d5) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 432.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00301c7f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002f94, 0x00000341) + Non Target Selection + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.600000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_NonTarget + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 145 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002bbddf) + + + + + (0x00003e14, 0x00000027) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0xad100179, 0xa3c984ab) + 126 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002c5bfc) + + + + + (0x0000486f, 0x000075f4) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002b9aae) + + + + + (0x000063a5, 0x0000197c) + Target Selection + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.600000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 145 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002b4e91) + + + + + (0x000078d0, 0x000029bc) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Epoch block average + Epoch block average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-epoch-average.cfg + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002b5470) + + + + + (0x000078f9, 0x000063eb) + xDAWN Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 9.970221e-001 -3.729500e-002 -1.177390e-002 2.814447e-002 -3.772446e-003 3.371324e-002 -5.480030e-003 8.893039e-003 -1.565213e-002 -9.956694e-003 -2.347757e-002 -2.312669e-003 -1.847227e-002 -7.550644e-004 -8.423513e-003 3.243223e-002 2.079848e-002 5.079737e-001 -2.835127e-002 8.259231e-002 -3.621803e-001 -2.004259e-001 -2.432480e-001 -1.861558e-001 -3.798139e-001 9.614762e-002 3.407766e-001 -2.158597e-001 3.720552e-001 7.500469e-002 -8.628774e-002 -3.182367e-002 5.923482e-002 4.124707e-001 2.083913e-001 -2.629501e-001 2.023081e-001 -2.658446e-001 4.022738e-001 -1.785569e-001 4.450742e-001 3.549239e-001 1.550204e-002 3.750389e-002 3.114249e-002 9.273764e-002 -7.093797e-002 -2.610929e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 3 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-spatial-filter.cfg + + + (0xad100179, 0xa3c984ab) + 143 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002b601f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007b56, 0x000033f9) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Epoch block average + Epoch block average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-epoch-average.cfg + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002c2168) + + + + + (0x0a5a6a4a, 0x1d92a778) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/p300-classifier.cfg + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Target + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_NonTarget + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 432.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00000004, 0x00007d3a) + + (0x000078f9, 0x000063eb) + 0 + + + (0x000063a5, 0x0000197c) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 108 + + + (0x358ae8b5, 0x0f8bacd1) + 288 + + + (0x3f0a3b27, 0x570913d2) + 203 + + + (0x6267b5c5, 0x676e3e42) + 312 + + + + + (0x00000a32, 0x00005cae) + + (0x0000486f, 0x000075f4) + 0 + + + (0x00003e14, 0x00000027) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -14 + + + (0x358ae8b5, 0x0f8bacd1) + 288 + + + (0x3f0a3b27, 0x570913d2) + 0 + + + (0x6267b5c5, 0x676e3e42) + 288 + + + + + (0x00000aca, 0x000037d3) + + (0x00003e14, 0x00000027) + 0 + + + (0x000078f9, 0x000063eb) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 34 + + + (0x358ae8b5, 0x0f8bacd1) + 288 + + + (0x3f0a3b27, 0x570913d2) + 54 + + + (0x6267b5c5, 0x676e3e42) + 288 + + + + + (0x00001717, 0x00003cf9) + + (0x000078d0, 0x000029bc) + 0 + + + (0x00000b2d, 0x00006d61) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 311 + + + (0x358ae8b5, 0x0f8bacd1) + 320 + + + (0x3f0a3b27, 0x570913d2) + 331 + + + (0x6267b5c5, 0x676e3e42) + 320 + + + + + (0x00001770, 0x00000ded) + + (0x00001f83, 0x00004e32) + 2 + + + (0x000063a5, 0x0000197c) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -137 + + + (0x358ae8b5, 0x0f8bacd1) + 415 + + + (0x3f0a3b27, 0x570913d2) + 203 + + + (0x6267b5c5, 0x676e3e42) + 327 + + + + + (0x0000227f, 0x00003a6f) + + (0x000078f9, 0x000063eb) + 0 + + + (0x00002f94, 0x00000341) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 108 + + + (0x358ae8b5, 0x0f8bacd1) + 288 + + + (0x3f0a3b27, 0x570913d2) + 203 + + + (0x6267b5c5, 0x676e3e42) + 536 + + + + + (0x00002599, 0x0000329b) + + (0x000063a5, 0x0000197c) + 0 + + + (0x000078d0, 0x000029bc) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 247 + + + (0x358ae8b5, 0x0f8bacd1) + 312 + + + (0x3f0a3b27, 0x570913d2) + 267 + + + (0x6267b5c5, 0x676e3e42) + 320 + + + + + (0x00004098, 0x00007e81) + + (0x00002f94, 0x00000341) + 0 + + + (0x00007b56, 0x000033f9) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 247 + + + (0x358ae8b5, 0x0f8bacd1) + 536 + + + (0x3f0a3b27, 0x570913d2) + 267 + + + (0x6267b5c5, 0x676e3e42) + 544 + + + + + (0x00004674, 0x000061af) + + (0x00007b56, 0x000033f9) + 0 + + + (0x00000d41, 0x000013b7) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 311 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 331 + + + (0x6267b5c5, 0x676e3e42) + 544 + + + + + (0x00005d56, 0x000065e9) + + (0x00001f83, 0x00004e32) + 1 + + + (0x0000486f, 0x000075f4) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -137 + + + (0x358ae8b5, 0x0f8bacd1) + 400 + + + (0x3f0a3b27, 0x570913d2) + -48 + + + (0x6267b5c5, 0x676e3e42) + 288 + + + + + (0x00006821, 0x00000c75) + + (0x00001f83, 0x00004e32) + 2 + + + (0x00002f94, 0x00000341) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -137 + + + (0x358ae8b5, 0x0f8bacd1) + 415 + + + (0x3f0a3b27, 0x570913d2) + 203 + + + (0x6267b5c5, 0x676e3e42) + 551 + + + + + (0x175e412c, 0x0692f4ee) + + (0x00000d41, 0x000013b7) + 0 + + + (0x0a5a6a4a, 0x1d92a778) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 375 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 427 + + + (0x6267b5c5, 0x676e3e42) + 447 + + + + + (0x5a67b7d8, 0x1cf07f9a) + + (0x00001f83, 0x00004e32) + 2 + + + (0x0a5a6a4a, 0x1d92a778) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -137 + + + (0x358ae8b5, 0x0f8bacd1) + 415 + + + (0x3f0a3b27, 0x570913d2) + 427 + + + (0x6267b5c5, 0x676e3e42) + 417 + + + + + (0x616495af, 0x5c020b32) + + (0x0a5a6a4a, 0x1d92a778) + 0 + + + (0x00002c8b, 0x000001d5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 471 + + + (0x358ae8b5, 0x0f8bacd1) + 432 + + + (0x3f0a3b27, 0x570913d2) + 496 + + + (0x6267b5c5, 0x676e3e42) + 432 + + + + + (0x63fa63da, 0x0e447c5b) + + (0x00000b2d, 0x00006d61) + 0 + + + (0x0a5a6a4a, 0x1d92a778) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 375 + + + (0x358ae8b5, 0x0f8bacd1) + 320 + + + (0x3f0a3b27, 0x570913d2) + 427 + + + (0x6267b5c5, 0x676e3e42) + 432 + + + + + + + (0x00004785, 0x00007f9c) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + -240 + + + + + (0x000047f3, 0x00004eaf) + The preprocessing of the signal is +performed here... + +<u><b>Note:</b></u> be sure that the +<i>sampling rate</i> and <i>sample count +per buffer</i> you use in the <u>acquisition +server</u> are compatible with the actual +<i>signal decimation factor</i> + + + (0x473d9a43, 0x97fc0a97) + 48 + + + (0x7234b86b, 0x2b8651a5) + 0 + + + + + (0x00005277, 0x00007fbe) + <u><b><big>Overview</big></b></u> + +This scenario should be used to train +the LDA classifier. + +Just configure the <i>Generic Stream Reader</i> +box to point to the last file you recorded with +scenario <i>1-acquisition</i> and fast forward +this scenario. + +At the end of the training, you will have an estimation +of the classifier performance printed in the console. +If this performance is lower than 70%, just run a new +<i>4-online</i> session to have better results. + +<u><b>Note:</b></u> in order to run this scenario, +the spatial filter should have been trained using +<i>2-train-xDAWN</i> ! + + + (0x473d9a43, 0x97fc0a97) + 848 + + + (0x7234b86b, 0x2b8651a5) + 96 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renard + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + LDA Classifier Trainer + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/p300-speller-xdawn/ + + + (0xf6b2e3fa, 0x7bd43926) + xDAWN P300 Speller + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-4-online.xml b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-4-online.xml new file mode 100644 index 0000000..24b48de --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-4-online.xml @@ -0,0 +1,2353 @@ + + 1 + OpenViBE + 1.1.0+git + + + (0x000000ea, 0x000057a1) + Launch + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-speller-launch.lua + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to send + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x512a166f, 0x5c3ef83f) + Time to send + 20 + 20 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 448.000000 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 448.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 90 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x008e9275) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002bb3, 0x0000133c) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 640.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xad100179, 0xa3c984ab) + 125 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x007036bf) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00003d0e, 0x000025ef) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 720.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003dec, 0x00004c7b) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.6 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_VisualStimulationStart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 496.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 191 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005ced91) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000445b, 0x000068e3) + P300 accumulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-speller-accumulator.lua + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x2c132d6e, 0x44ab0d97) + Segment start + OVTK_StimulationId_SegmentStart + OVTK_StimulationId_TrialStart + false + + + (0x2c132d6e, 0x44ab0d97) + Segment stop + OVTK_StimulationId_SegmentStop + OVTK_StimulationId_TrialStop + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 448.000000 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 627.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 133 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0304fb88) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007786, 0x00001163) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 336.000000 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 720.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 69 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x001a8c16, 0x15ba27e3) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 480.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 110 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0040f8d4) + + + + + (0x008f57e1, 0x2790537b) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/p300-xdawn-online-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144.000000 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 816.000000 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 158 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x007b2629) + + + (0xfba64161, 0x65304e21) + + + + + + (0x09c41dd7, 0x09f2e37b) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Epoch block average + Epoch block average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240.000000 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 496.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-epoch-average.cfg + + + (0xad100179, 0xa3c984ab) + 106 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000eaa12) + + + + + (0x0e30a73f, 0x7ae6d95a) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 304.000000 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 496.000000 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000f9a38) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x12c0a51c, 0x5d112d9b) + Target Letter Generation + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-speller-target.lua + false + + + (0x79a9edeb, 0x245d83fc) + Word to Spell (leave this empty if random) + + + false + + + (0x2c132d6e, 0x44ab0d97) + Row Stimulation Base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column Stimulation Base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x512a166f, 0x5c3ef83f) + Delay Before Sending (in sec) + 2 + 2 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 576.000000 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 480.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 178 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x034a702f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x28b5e192, 0x37431137) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/p300-classifier.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 560.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xad100179, 0xa3c984ab) + 142 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2e63c8c5, 0x79a8ae7b) + P300 Speller Visualization + (0x195e41d6, 0x6e684d47) + + + (0x6f752dd0, 0x082a321e) + Sequence stimulations + + + (0x6f752dd0, 0x082a321e) + Target stimulations + + + (0x6f752dd0, 0x082a321e) + Row selection stimulations + + + (0x6f752dd0, 0x082a321e) + Column selection stimulations + + + + + (0x6f752dd0, 0x082a321e) + Target / Non target flagging + + + + + (0x330306dd, 0x74a95f98) + Interface filename + ${Path_Data}/plugins/simple-visualization/p300-speller.glade + ${Path_Data}/plugins/simple-visualization/p300-speller.ui + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x7f45a2a9, 0x7db12219) + Flash background color + 10,10,10 + 5,5,5 + false + + + (0x7f45a2a9, 0x7db12219) + Flash foreground color + 100,100,100 + 100,100,100 + false + + + (0x007deef9, 0x2f3e95c6) + Flash font size + 100 + 60 + false + + + (0x7f45a2a9, 0x7db12219) + No flash background color + 0,0,0 + 0,0,0 + false + + + (0x7f45a2a9, 0x7db12219) + No flash foreground color + 50,50,50 + 25,25,25 + false + + + (0x007deef9, 0x2f3e95c6) + No flash font size + 75 + 40 + false + + + (0x7f45a2a9, 0x7db12219) + Target background color + 10,40,10 + 20,20,70 + false + + + (0x7f45a2a9, 0x7db12219) + Target foreground color + 60,100,60 + 10,10,30 + false + + + (0x007deef9, 0x2f3e95c6) + Target font size + 100 + 40 + false + + + (0x7f45a2a9, 0x7db12219) + Selected background color + 70,20,20 + 10,40,10 + false + + + (0x7f45a2a9, 0x7db12219) + Selected foreground color + 30,10,10 + 60,100,60 + false + + + (0x007deef9, 0x2f3e95c6) + Selected font size + 100 + 40 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 656.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 480.000000 + + + (0x4e7b798a, 0x183beafb) + (0x8d89d30c, 0xa939693a) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-speller-visualization.cfg + + + (0xad100179, 0xa3c984ab) + 188 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017985f8) + + + + + (0x40e41bf9, 0x5c44b1b1) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 480.000000 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0xad100179, 0xa3c984ab) + 129 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002cae02) + + + + + (0x53567600, 0x4c3da6a5) + P300 Speller Stimulator + (0x88857f9a, 0xf560d3eb) + + + (0x6f752dd0, 0x082a321e) + Incoming stimulations + + + + + (0x6f752dd0, 0x082a321e) + Produced stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Start stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x007deef9, 0x2f3e95c6) + Number of rows + 6 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of columns + 6 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of repetitions + 5 + 12 + false + + + (0x007deef9, 0x2f3e95c6) + Number of trials + 5 + 10 + false + + + (0x512a166f, 0x5c3ef83f) + Flash duration (in sec) + 0.075 + 0.200000 + false + + + (0x512a166f, 0x5c3ef83f) + No flash duration (in sec) + 0.125 + 0.100000 + false + + + (0x512a166f, 0x5c3ef83f) + Inter-repetition delay (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Inter-trial delay (in sec) + 2 + 3.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Avoid neighbor flashing + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 448.000000 + + + (0x4e7b798a, 0x183beafb) + (0x8137c905, 0x9ae4ae4b) + + + (0xad100179, 0xa3c984ab) + 174 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x008ede97) + + + + + (0x6d03daab, 0x55fdea78) + xDAWN Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112.000000 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 480.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-spatial-filter.cfg + + + (0xad100179, 0xa3c984ab) + 154 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6f54afd0, 0x5f2e0f65) + Identity + (0x5dffe431, 0x35215c50) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -80.000000 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 624.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 69 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005f48d2) + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x0000062d, 0x00006549) + + (0x0000445b, 0x000068e3) + 1 + + + (0x2e63c8c5, 0x79a8ae7b) + 3 + + + + (0x1b32c44c, 0x1905e0e9) + 487 + + + (0x358ae8b5, 0x0f8bacd1) + 634 + + + (0x3f0a3b27, 0x570913d2) + 636 + + + (0x6267b5c5, 0x676e3e42) + 502 + + + + + (0x0000266b, 0x000033bb) + + (0x6f54afd0, 0x5f2e0f65) + 2 + + + (0x00003dec, 0x00004c7b) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -50 + + + (0x358ae8b5, 0x0f8bacd1) + 639 + + + (0x3f0a3b27, 0x570913d2) + 156 + + + (0x6267b5c5, 0x676e3e42) + 503 + + + + + (0x00002cf9, 0x0000757a) + + (0x12c0a51c, 0x5d112d9b) + 0 + + + (0x2e63c8c5, 0x79a8ae7b) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 615 + + + (0x358ae8b5, 0x0f8bacd1) + 480 + + + (0x3f0a3b27, 0x570913d2) + 636 + + + (0x6267b5c5, 0x676e3e42) + 472 + + + + + (0x00002e50, 0x00003fba) + + (0x00003dec, 0x00004c7b) + 0 + + + (0x09c41dd7, 0x09f2e37b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 198 + + + (0x358ae8b5, 0x0f8bacd1) + 488 + + + (0x3f0a3b27, 0x570913d2) + 211 + + + (0x6267b5c5, 0x676e3e42) + 496 + + + + + (0x0000416b, 0x00000842) + + (0x6f54afd0, 0x5f2e0f65) + 1 + + + (0x001a8c16, 0x15ba27e3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -50 + + + (0x358ae8b5, 0x0f8bacd1) + 624 + + + (0x3f0a3b27, 0x570913d2) + -20 + + + (0x6267b5c5, 0x676e3e42) + 480 + + + + + (0x00004406, 0x000017e6) + + (0x000000ea, 0x000057a1) + 0 + + + (0x53567600, 0x4c3da6a5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 487 + + + (0x358ae8b5, 0x0f8bacd1) + 448 + + + (0x3f0a3b27, 0x570913d2) + 492 + + + (0x6267b5c5, 0x676e3e42) + 448 + + + + + (0x000046b8, 0x00001136) + + (0x00002bb3, 0x0000133c) + 2 + + + (0x6f54afd0, 0x5f2e0f65) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -138 + + + (0x358ae8b5, 0x0f8bacd1) + 640 + + + (0x3f0a3b27, 0x570913d2) + -109 + + + (0x6267b5c5, 0x676e3e42) + 639 + + + + + (0x00004944, 0x00005bde) + + (0x00007786, 0x00001163) + 0 + + + (0x00003d0e, 0x000025ef) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 366 + + + (0x358ae8b5, 0x0f8bacd1) + 720 + + + (0x3f0a3b27, 0x570913d2) + 684 + + + (0x6267b5c5, 0x676e3e42) + 720 + + + + + (0x00004a23, 0x00007947) + + (0x53567600, 0x4c3da6a5) + 0 + + + (0x2e63c8c5, 0x79a8ae7b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 534 + + + (0x358ae8b5, 0x0f8bacd1) + 448 + + + (0x3f0a3b27, 0x570913d2) + 636 + + + (0x6267b5c5, 0x676e3e42) + 457 + + + + + (0x00005b72, 0x00000606) + + (0x0000445b, 0x000068e3) + 0 + + + (0x2e63c8c5, 0x79a8ae7b) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 487 + + + (0x358ae8b5, 0x0f8bacd1) + 619 + + + (0x3f0a3b27, 0x570913d2) + 636 + + + (0x6267b5c5, 0x676e3e42) + 487 + + + + + (0x00005fac, 0x00002630) + + (0x00002bb3, 0x0000133c) + 0 + + + (0x6f54afd0, 0x5f2e0f65) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -138 + + + (0x358ae8b5, 0x0f8bacd1) + 610 + + + (0x3f0a3b27, 0x570913d2) + -109 + + + (0x6267b5c5, 0x676e3e42) + 609 + + + + + (0x00006501, 0x000068bf) + + (0x6f54afd0, 0x5f2e0f65) + 2 + + + (0x00007786, 0x00001163) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -50 + + + (0x358ae8b5, 0x0f8bacd1) + 639 + + + (0x3f0a3b27, 0x570913d2) + 307 + + + (0x6267b5c5, 0x676e3e42) + 720 + + + + + (0x00006c4d, 0x0000126f) + + (0x40e41bf9, 0x5c44b1b1) + 0 + + + (0x6d03daab, 0x55fdea78) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 86 + + + (0x358ae8b5, 0x0f8bacd1) + 480 + + + (0x3f0a3b27, 0x570913d2) + 75 + + + (0x6267b5c5, 0x676e3e42) + 480 + + + + + (0x00007051, 0x00001557) + + (0x00002bb3, 0x0000133c) + 1 + + + (0x6f54afd0, 0x5f2e0f65) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -138 + + + (0x358ae8b5, 0x0f8bacd1) + 625 + + + (0x3f0a3b27, 0x570913d2) + -109 + + + (0x6267b5c5, 0x676e3e42) + 624 + + + + + (0x000074af, 0x000038c2) + + (0x6f54afd0, 0x5f2e0f65) + 2 + + + (0x008f57e1, 0x2790537b) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -50 + + + (0x358ae8b5, 0x0f8bacd1) + 639 + + + (0x3f0a3b27, 0x570913d2) + 115 + + + (0x6267b5c5, 0x676e3e42) + 831 + + + + + (0x0000756d, 0x000027c0) + + (0x6d03daab, 0x55fdea78) + 0 + + + (0x00003dec, 0x00004c7b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 151 + + + (0x358ae8b5, 0x0f8bacd1) + 480 + + + (0x3f0a3b27, 0x570913d2) + 156 + + + (0x6267b5c5, 0x676e3e42) + 488 + + + + + (0x00007b30, 0x00005e90) + + (0x00007786, 0x00001163) + 0 + + + (0x0000445b, 0x000068e3) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 366 + + + (0x358ae8b5, 0x0f8bacd1) + 720 + + + (0x3f0a3b27, 0x570913d2) + 411 + + + (0x6267b5c5, 0x676e3e42) + 634 + + + + + (0x00f1a11e, 0x4a813bb8) + + (0x09c41dd7, 0x09f2e37b) + 0 + + + (0x0e30a73f, 0x7ae6d95a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 270 + + + (0x358ae8b5, 0x0f8bacd1) + 496 + + + (0x3f0a3b27, 0x570913d2) + 275 + + + (0x6267b5c5, 0x676e3e42) + 496 + + + + + (0x0de02dd1, 0x545eff87) + + (0x6f54afd0, 0x5f2e0f65) + 1 + + + (0x008f57e1, 0x2790537b) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -50 + + + (0x358ae8b5, 0x0f8bacd1) + 624 + + + (0x3f0a3b27, 0x570913d2) + 115 + + + (0x6267b5c5, 0x676e3e42) + 816 + + + + + (0x136dcee0, 0x20dbb005) + + (0x28b5e192, 0x37431137) + 0 + + + (0x0000445b, 0x000068e3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 390 + + + (0x358ae8b5, 0x0f8bacd1) + 545 + + + (0x3f0a3b27, 0x570913d2) + 411 + + + (0x6267b5c5, 0x676e3e42) + 619 + + + + + (0x1a535826, 0x3804f216) + + (0x001a8c16, 0x15ba27e3) + 0 + + + (0x40e41bf9, 0x5c44b1b1) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 22 + + + (0x358ae8b5, 0x0f8bacd1) + 480 + + + (0x3f0a3b27, 0x570913d2) + 44 + + + (0x6267b5c5, 0x676e3e42) + 480 + + + + + (0x2893bc68, 0x5c0429ec) + + (0x6f54afd0, 0x5f2e0f65) + 0 + + + (0x008f57e1, 0x2790537b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -50 + + + (0x358ae8b5, 0x0f8bacd1) + 609 + + + (0x3f0a3b27, 0x570913d2) + 115 + + + (0x6267b5c5, 0x676e3e42) + 801 + + + + + (0x3ccbcbed, 0x529f3e1d) + + (0x0e30a73f, 0x7ae6d95a) + 0 + + + (0x28b5e192, 0x37431137) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 334 + + + (0x358ae8b5, 0x0f8bacd1) + 496 + + + (0x3f0a3b27, 0x570913d2) + 348 + + + (0x6267b5c5, 0x676e3e42) + 552 + + + + + (0x62a925f7, 0x4bf2755d) + + (0x53567600, 0x4c3da6a5) + 0 + + + (0x12c0a51c, 0x5d112d9b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 534 + + + (0x358ae8b5, 0x0f8bacd1) + 448 + + + (0x3f0a3b27, 0x570913d2) + 539 + + + (0x6267b5c5, 0x676e3e42) + 480 + + + + + + + (0x1012e1de, 0x78e57c3e) + The stimulation part of the scenario is +similar to scenario <i>1-acquisition</i>. + +If you keep the <i>Target Letter Generation</i> +box, you will be able to train the algorithms +again on the recorded data. + + + + (0x473d9a43, 0x97fc0a97) + 896.000000 + + + (0x7234b86b, 0x2b8651a5) + 608.000000 + + + + + (0x11fceaee, 0x1f87d83c) + Switch from file reader +to Acquisiton client to use it online + + + (0x473d9a43, 0x97fc0a97) + 176.000000 + + + (0x7234b86b, 0x2b8651a5) + -48.000000 + + + + + (0x27567f54, 0x6e00503a) + You can configure the Flashing Sequence +and the Target Letter Generation in order to +instruct the subject to <u>spell a specific word</u>. + +Set the target word in the Lua Stimulator (e.g. "openvibe") +and adapt the number of trials in the P300 Speller Stimulator +(e.g. 8 trials for the 8 letters in "openvibe") + +<b><u>Note:</u></b> If the number of letter in the chosen word does not match +the number of trial, you won't be able to train xDAWN and +the classifier on the recorded data. + + + (0x473d9a43, 0x97fc0a97) + 128.000000 + + + (0x7234b86b, 0x2b8651a5) + 576.000000 + + + + + (0x3726b6f5, 0x3dea5d78) + <u><b><big>Overview</big></b></u> + +This scenario can be used online once the +spatial filter and the classifiers are trained. +The <i>Target Letter Generation</i> +box still proposes some targets in order to +eventually train the spatial filter / classifier +again, but you may want to disconnect that box +in order to have a real <i>free time</i> use of +the speller. + +The flash sequence starts automatically after 20 sec. + +You will then be presented a blue letter that +you have to focus on, followed by a 12 times +flashing sequence of the whole grid. The detected +letter will be presented in green. This will be repeated +10 times. + +If the performance of the system does not fit your +requirements, just run <i>2-train-xDAWN</i> and <i>3-train-classifier</i> +scenarios again on the data you just recorded. + +<small><i><b>note:</b> the recorded files go to the +folder where the scenario xml is located +(<span color="darkblue">${Player_ScenarioDirectory}/</span>).</i></small> + + + (0x473d9a43, 0x97fc0a97) + 192 + + + (0x7234b86b, 0x2b8651a5) + -48 + + + + + (0x421933f6, 0x00705e90) + The preprocessing of the signal is +performed here... + +<u><b>Note:</b></u> be sure that the +<i>sampling rate</i> and <i>sample count +per buffer</i> you use in the <u>acquisition +server</u> are compatible with the actual +<i>signal decimation factor</i> + + + (0x473d9a43, 0x97fc0a97) + 192 + + + (0x7234b86b, 0x2b8651a5) + 240 + + + + + (0x5bbc727e, 0x1572a9cd) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 608.000000 + + + (0x7234b86b, 0x2b8651a5) + -288.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x2e63c8c5, 0x79a8ae7b)","childCount":0,"identifier":"(0x00001d62, 0x00007def)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Online Use + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/p300-speller-xdawn/ + + + (0xf6b2e3fa, 0x7bd43926) + xDAWN P300 Speller + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-5-replay.xml b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-5-replay.xml new file mode 100644 index 0000000..f68d4be --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-5-replay.xml @@ -0,0 +1,1814 @@ + + 1 + OpenViBE + 1.1.0+git + + + (0x00002db4, 0x00004e4d) + Pick target + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-speller-filter-target.lua + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 768.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 90 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00749b30) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002db4, 0x00004e4e) + Pick flash + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-speller-filter-flash.lua + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 688.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 90 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x007aab35) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003d0e, 0x000025ef) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 784.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004d93cc) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003dec, 0x00004c7b) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.6 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_VisualStimulationStart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 448.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 191 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b06288) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000445b, 0x000068e3) + P300 accumulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-speller-accumulator.lua + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x2c132d6e, 0x44ab0d97) + Segment start + OVTK_StimulationId_TrialStart + OVTK_StimulationId_TrialStart + false + + + (0x2c132d6e, 0x44ab0d97) + Segment stop + OVTK_StimulationId_SegmentStop + OVTK_StimulationId_TrialStop + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 608.000000 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 544.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 133 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0a2185a6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x09c41dd7, 0x09f2e37b) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Epoch block average + Epoch block average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416.000000 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 448.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-epoch-average.cfg + + + (0xad100179, 0xa3c984ab) + 106 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004afe07) + + + + + (0x0e30a73f, 0x7ae6d95a) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 480.000000 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 448.000000 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004313a5) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x28b5e192, 0x37431137) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/p300-classifier.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 544.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 464.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xad100179, 0xa3c984ab) + 142 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2978c82c, 0x4a22f240) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 432.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 110 + + + + + (0x2e63c8c5, 0x79a8ae7b) + P300 Speller Visualization + (0x195e41d6, 0x6e684d47) + + + (0x6f752dd0, 0x082a321e) + Sequence stimulations + + + (0x6f752dd0, 0x082a321e) + Target stimulations + + + (0x6f752dd0, 0x082a321e) + Row selection stimulations + + + (0x6f752dd0, 0x082a321e) + Column selection stimulations + + + + + (0x6f752dd0, 0x082a321e) + Target / Non target flagging + + + + + (0x330306dd, 0x74a95f98) + Interface filename + ${Path_Data}/plugins/simple-visualization/p300-speller.glade + ${Path_Data}/plugins/simple-visualization/p300-speller.ui + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x7f45a2a9, 0x7db12219) + Flash background color + 10,10,10 + 5,5,5 + false + + + (0x7f45a2a9, 0x7db12219) + Flash foreground color + 100,100,100 + 100,100,100 + false + + + (0x007deef9, 0x2f3e95c6) + Flash font size + 100 + 60 + false + + + (0x7f45a2a9, 0x7db12219) + No flash background color + 0,0,0 + 0,0,0 + false + + + (0x7f45a2a9, 0x7db12219) + No flash foreground color + 50,50,50 + 25,25,25 + false + + + (0x007deef9, 0x2f3e95c6) + No flash font size + 75 + 40 + false + + + (0x7f45a2a9, 0x7db12219) + Target background color + 10,40,10 + 20,20,70 + false + + + (0x7f45a2a9, 0x7db12219) + Target foreground color + 60,100,60 + 10,10,30 + false + + + (0x007deef9, 0x2f3e95c6) + Target font size + 100 + 40 + false + + + (0x7f45a2a9, 0x7db12219) + Selected background color + 70,20,20 + 10,40,10 + false + + + (0x7f45a2a9, 0x7db12219) + Selected foreground color + 30,10,10 + 60,100,60 + false + + + (0x007deef9, 0x2f3e95c6) + Selected font size + 100 + 40 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 672.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 624.000000 + + + (0x4e7b798a, 0x183beafb) + (0x8d89d30c, 0xa939693a) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-speller-visualization.cfg + + + (0xad100179, 0xa3c984ab) + 188 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05899984) + + + + + (0x3806695f, 0x750288cb) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 432.000000 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0xad100179, 0xa3c984ab) + 129 + + + + + (0x483b59a5, 0x4318abba) + Identity + (0x5dffe431, 0x35215c50) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 69 + + + (0xfba64161, 0x65304e21) + + + + + + (0x634a083c, 0x52143369) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/CHANGE_ME.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 159 + + + + + (0x666e568d, 0x579616d6) + xDAWN Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 432.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-spatial-filter.cfg + + + (0xad100179, 0xa3c984ab) + 154 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x0000062d, 0x00006549) + + (0x0000445b, 0x000068e3) + 1 + + + (0x2e63c8c5, 0x79a8ae7b) + 3 + + + + (0x1b32c44c, 0x1905e0e9) + 647 + + + (0x358ae8b5, 0x0f8bacd1) + 551 + + + (0x3f0a3b27, 0x570913d2) + 652 + + + (0x6267b5c5, 0x676e3e42) + 646 + + + + + (0x0000121f, 0x00004438) + + (0x00002db4, 0x00004e4d) + 0 + + + (0x2e63c8c5, 0x79a8ae7b) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 439 + + + (0x358ae8b5, 0x0f8bacd1) + 768 + + + (0x3f0a3b27, 0x570913d2) + 652 + + + (0x6267b5c5, 0x676e3e42) + 616 + + + + + (0x00001a5d, 0x000012a3) + + (0x00002db4, 0x00004e4e) + 0 + + + (0x2e63c8c5, 0x79a8ae7b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 439 + + + (0x358ae8b5, 0x0f8bacd1) + 688 + + + (0x3f0a3b27, 0x570913d2) + 652 + + + (0x6267b5c5, 0x676e3e42) + 601 + + + + + (0x000023ed, 0x00007962) + + (0x483b59a5, 0x4318abba) + 2 + + + (0x00002db4, 0x00004e4d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 94 + + + (0x358ae8b5, 0x0f8bacd1) + 639 + + + (0x3f0a3b27, 0x570913d2) + 363 + + + (0x6267b5c5, 0x676e3e42) + 768 + + + + + (0x00002e50, 0x00003fba) + + (0x00003dec, 0x00004c7b) + 0 + + + (0x09c41dd7, 0x09f2e37b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 374 + + + (0x358ae8b5, 0x0f8bacd1) + 440 + + + (0x3f0a3b27, 0x570913d2) + 387 + + + (0x6267b5c5, 0x676e3e42) + 448 + + + + + (0x00003a8e, 0x00004020) + + (0x483b59a5, 0x4318abba) + 2 + + + (0x0000445b, 0x000068e3) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 94 + + + (0x358ae8b5, 0x0f8bacd1) + 639 + + + (0x3f0a3b27, 0x570913d2) + 571 + + + (0x6267b5c5, 0x676e3e42) + 551 + + + + + (0x00004ead, 0x0000166d) + + (0x483b59a5, 0x4318abba) + 2 + + + (0x00002db4, 0x00004e4e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 94 + + + (0x358ae8b5, 0x0f8bacd1) + 639 + + + (0x3f0a3b27, 0x570913d2) + 363 + + + (0x6267b5c5, 0x676e3e42) + 688 + + + + + (0x00005b72, 0x00000606) + + (0x0000445b, 0x000068e3) + 0 + + + (0x2e63c8c5, 0x79a8ae7b) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 647 + + + (0x358ae8b5, 0x0f8bacd1) + 536 + + + (0x3f0a3b27, 0x570913d2) + 652 + + + (0x6267b5c5, 0x676e3e42) + 631 + + + + + (0x00005ee4, 0x00001e68) + + (0x483b59a5, 0x4318abba) + 2 + + + (0x00003d0e, 0x000025ef) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 94 + + + (0x358ae8b5, 0x0f8bacd1) + 639 + + + (0x3f0a3b27, 0x570913d2) + 684 + + + (0x6267b5c5, 0x676e3e42) + 784 + + + + + (0x00006b0f, 0x00003281) + + (0x666e568d, 0x579616d6) + 0 + + + (0x00003dec, 0x00004c7b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 311 + + + (0x358ae8b5, 0x0f8bacd1) + 432 + + + (0x3f0a3b27, 0x570913d2) + 332 + + + (0x6267b5c5, 0x676e3e42) + 440 + + + + + (0x00007e4c, 0x00005f90) + + (0x483b59a5, 0x4318abba) + 2 + + + (0x00003dec, 0x00004c7b) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 94 + + + (0x358ae8b5, 0x0f8bacd1) + 639 + + + (0x3f0a3b27, 0x570913d2) + 332 + + + (0x6267b5c5, 0x676e3e42) + 455 + + + + + (0x00f1a11e, 0x4a813bb8) + + (0x09c41dd7, 0x09f2e37b) + 0 + + + (0x0e30a73f, 0x7ae6d95a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 446 + + + (0x358ae8b5, 0x0f8bacd1) + 448 + + + (0x3f0a3b27, 0x570913d2) + 451 + + + (0x6267b5c5, 0x676e3e42) + 448 + + + + + (0x04e9bcb9, 0x608aa078) + + (0x634a083c, 0x52143369) + 0 + + + (0x483b59a5, 0x4318abba) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 14 + + + (0x358ae8b5, 0x0f8bacd1) + 609 + + + (0x3f0a3b27, 0x570913d2) + 35 + + + (0x6267b5c5, 0x676e3e42) + 609 + + + + + (0x087ce678, 0x55c0c4ef) + + (0x3806695f, 0x750288cb) + 0 + + + (0x666e568d, 0x579616d6) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 230 + + + (0x358ae8b5, 0x0f8bacd1) + 432 + + + (0x3f0a3b27, 0x570913d2) + 235 + + + (0x6267b5c5, 0x676e3e42) + 432 + + + + + (0x22e7d928, 0x245a74de) + + (0x0e30a73f, 0x7ae6d95a) + 0 + + + (0x28b5e192, 0x37431137) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 510 + + + (0x358ae8b5, 0x0f8bacd1) + 448 + + + (0x3f0a3b27, 0x570913d2) + 524 + + + (0x6267b5c5, 0x676e3e42) + 456 + + + + + (0x335d6001, 0x4c535469) + + (0x28b5e192, 0x37431137) + 0 + + + (0x0000445b, 0x000068e3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 566 + + + (0x358ae8b5, 0x0f8bacd1) + 449 + + + (0x3f0a3b27, 0x570913d2) + 571 + + + (0x6267b5c5, 0x676e3e42) + 536 + + + + + (0x596adb78, 0x549a0689) + + (0x2978c82c, 0x4a22f240) + 0 + + + (0x3806695f, 0x750288cb) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 182 + + + (0x358ae8b5, 0x0f8bacd1) + 432 + + + (0x3f0a3b27, 0x570913d2) + 188 + + + (0x6267b5c5, 0x676e3e42) + 432 + + + + + (0x666eada5, 0x09010e07) + + (0x634a083c, 0x52143369) + 1 + + + (0x483b59a5, 0x4318abba) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 14 + + + (0x358ae8b5, 0x0f8bacd1) + 624 + + + (0x3f0a3b27, 0x570913d2) + 35 + + + (0x6267b5c5, 0x676e3e42) + 624 + + + + + (0x6963bf7e, 0x02c7cc5d) + + (0x483b59a5, 0x4318abba) + 1 + + + (0x2978c82c, 0x4a22f240) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 94 + + + (0x358ae8b5, 0x0f8bacd1) + 624 + + + (0x3f0a3b27, 0x570913d2) + 140 + + + (0x6267b5c5, 0x676e3e42) + 432 + + + + + (0x7061b67e, 0x7c481576) + + (0x634a083c, 0x52143369) + 2 + + + (0x483b59a5, 0x4318abba) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 14 + + + (0x358ae8b5, 0x0f8bacd1) + 639 + + + (0x3f0a3b27, 0x570913d2) + 35 + + + (0x6267b5c5, 0x676e3e42) + 639 + + + + + + + (0x3030288d, 0x2dbf93f2) + <u><b><big>Overview</big></b></u> + +This scenario allows to quickly replay +an online session recorded file. The +main between this scenario and +scenario <i>4-online</i> is basically +all the acquisition / stimulation part +being replaced by a file reader. + +<u><b>Note:</b></u> refer to scenario <i>4-online</i> for +details about the processing. + + + (0x473d9a43, 0x97fc0a97) + 288 + + + (0x7234b86b, 0x2b8651a5) + 16 + + + + + (0x374ccccf, 0x48c4defa) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + -128 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x2e63c8c5, 0x79a8ae7b)","childCount":0,"identifier":"(0x000060a8, 0x0000168c)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Online File Replay + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/p300-speller-xdawn/ + + + (0xf6b2e3fa, 0x7bd43926) + xDAWN P300 Speller + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/signals/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/signals/README.txt new file mode 100644 index 0000000..8eaa204 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller-xDAWN/signals/README.txt @@ -0,0 +1,3 @@ + +The scenario will record its signals here. + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-epoch-average.cfg b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-epoch-average.cfg new file mode 100644 index 0000000..f6b5fdd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-epoch-average.cfg @@ -0,0 +1,4 @@ + + Epoch block average + 1 + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-0-signal-monitoring.xml b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-0-signal-monitoring.xml new file mode 100644 index 0000000..e8227f5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-0-signal-monitoring.xml @@ -0,0 +1,709 @@ + + 1 + OpenVIBE + 0.0.2 + + + (0x00000fa6, 0x00006e68) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 416.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00604a7e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + + + (0x000020f0, 0x000020aa) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 416.000000 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0xad100179, 0xa3c984ab) + 126 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003d1522) + + + (0xc73e83ec, 0xf855c5bc) + false + + + + + (0x0000599b, 0x000026ba) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 480.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xad100179, 0xa3c984ab) + 121 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0092d9ae) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x000069b9, 0x00005532) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 544.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 100 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00707726) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000785b, 0x00002bfd) + Cz;O1;O2 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + Cz;O1;O2 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -176.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 416.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 92 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004455b9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00004126, 0x00004b0d) + + (0x000020f0, 0x000020aa) + 0 + + + (0x000069b9, 0x00005532) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -30 + + + (0x358ae8b5, 0x0f8bacd1) + 416 + + + (0x3f0a3b27, 0x570913d2) + 11 + + + (0x6267b5c5, 0x676e3e42) + 529 + + + + + (0x000047bf, 0x000069e6) + + (0x0000785b, 0x00002bfd) + 0 + + + (0x00000fa6, 0x00006e68) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -148 + + + (0x358ae8b5, 0x0f8bacd1) + 416 + + + (0x3f0a3b27, 0x570913d2) + -128 + + + (0x6267b5c5, 0x676e3e42) + 416 + + + + + (0x000049ec, 0x00002dc5) + + (0x0000599b, 0x000026ba) + 2 + + + (0x000069b9, 0x00005532) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -286 + + + (0x358ae8b5, 0x0f8bacd1) + 480 + + + (0x3f0a3b27, 0x570913d2) + 11 + + + (0x6267b5c5, 0x676e3e42) + 544 + + + + + (0x00006ae5, 0x00003a78) + + (0x00000fa6, 0x00006e68) + 0 + + + (0x000020f0, 0x000020aa) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -94 + + + (0x358ae8b5, 0x0f8bacd1) + 416 + + + (0x3f0a3b27, 0x570913d2) + -64 + + + (0x6267b5c5, 0x676e3e42) + 416 + + + + + (0x000070e1, 0x0000292c) + + (0x0000599b, 0x000026ba) + 1 + + + (0x0000785b, 0x00002bfd) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -286 + + + (0x358ae8b5, 0x0f8bacd1) + 465 + + + (0x3f0a3b27, 0x570913d2) + -202 + + + (0x6267b5c5, 0x676e3e42) + 416 + + + + + + + (0x00001653, 0x00002964) + <u><b>Note:</b></u> be sure that the +<i>sampling rate</i> and <i>sample count +per buffer</i> you use in the <u>acquisition +server</u> are compatible with the actual +<i>signal decimation factor</i> + + + (0x473d9a43, 0x97fc0a97) + 208.000000 + + + (0x7234b86b, 0x2b8651a5) + 0.000000 + + + + + (0x000028e8, 0x00003dee) + <u><b><big>Overview</big></b></u> + +This scenario can be used in order +to check the quality of the signals +before starting an experiment. + +One should <u>definitely</u> +check the quality of the signals +and ensure that : + +- <b>eye blinks</b> are visible +- <b>jaw clenching</b> are visible +- <b>alpha waves</b> are visible when closing eyes + + + (0x473d9a43, 0x97fc0a97) + 816.000000 + + + (0x7234b86b, 0x2b8651a5) + -112.000000 + + + + + (0x00004785, 0x00007f9c) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 496.000000 + + + (0x7234b86b, 0x2b8651a5) + -368.000000 + + + + + (0x000059b5, 0x00001524) + The <i>Temporal Filter</i> +and <i>Signal Decimation</i> +boxes transform the signal +so you can see what is actually +used online. + + + (0x473d9a43, 0x97fc0a97) + 208.000000 + + + (0x7234b86b, 0x2b8651a5) + -128.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":513,"identifier":"(0x00002206, 0x0000360e)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":518},{"boxIdentifier":"(0x000069b9, 0x00005532)","childCount":0,"identifier":"(0x000023cd, 0x0000415f)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007f2f, 0x00001c2b)","index":0,"name":"Default tab","parentIdentifier":"(0x00002206, 0x0000360e)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000071f9, 0x000001f9)","index":0,"name":"Empty","parentIdentifier":"(0x00007f2f, 0x00001c2b)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Basic P300 0/4 + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/openvibe-p300-speller/ + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-1-acquisition.xml b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-1-acquisition.xml new file mode 100644 index 0000000..d31cff9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-1-acquisition.xml @@ -0,0 +1,1084 @@ + + 1 + OpenVIBE + 0.0.2 + + + (0x000000ea, 0x000057a1) + Launch + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-speller-launch.lua + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to send + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x512a166f, 0x5c3ef83f) + Time to send + 20 + 20 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -320.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 688.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 81 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00ac1587) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001a71, 0x00003e16) + P300 Speller Stimulator + (0x88857f9a, 0xf560d3eb) + + + (0x6f752dd0, 0x082a321e) + Incoming stimulations + + + + + (0x6f752dd0, 0x082a321e) + Produced stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Start stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x007deef9, 0x2f3e95c6) + Number of rows + 6 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of columns + 6 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of repetitions + 5 + 12 + false + + + (0x007deef9, 0x2f3e95c6) + Number of trials + 5 + 10 + false + + + (0x512a166f, 0x5c3ef83f) + Flash duration (in sec) + 0.075 + 0.200000 + false + + + (0x512a166f, 0x5c3ef83f) + No flash duration (in sec) + 0.125 + 0.100000 + false + + + (0x512a166f, 0x5c3ef83f) + Inter-repetition delay (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Inter-trial delay (in sec) + 2 + 3.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Avoid neighbor flashing + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -272 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x8137c905, 0x9ae4ae4b) + + + (0xad100179, 0xa3c984ab) + 161 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00843565) + + + + + (0x00002c69, 0x00000b43) + P300 Speller Visualization + (0x195e41d6, 0x6e684d47) + + + (0x6f752dd0, 0x082a321e) + Sequence stimulations + + + (0x6f752dd0, 0x082a321e) + Target stimulations + + + (0x6f752dd0, 0x082a321e) + Row selection stimulations + + + (0x6f752dd0, 0x082a321e) + Column selection stimulations + + + + + (0x6f752dd0, 0x082a321e) + Target / Non target flagging + + + + + (0x330306dd, 0x74a95f98) + Interface filename + ${Path_Data}/plugins/simple-visualization/p300-speller.glade + ${Path_Data}/plugins/simple-visualization/p300-speller.ui + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x7f45a2a9, 0x7db12219) + Flash background color + 10,10,10 + 5,5,5 + false + + + (0x7f45a2a9, 0x7db12219) + Flash foreground color + 100,100,100 + 100,100,100 + false + + + (0x007deef9, 0x2f3e95c6) + Flash font size + 100 + 60 + false + + + (0x7f45a2a9, 0x7db12219) + No flash background color + 0,0,0 + 0,0,0 + false + + + (0x7f45a2a9, 0x7db12219) + No flash foreground color + 50,50,50 + 25,25,25 + false + + + (0x007deef9, 0x2f3e95c6) + No flash font size + 75 + 40 + false + + + (0x7f45a2a9, 0x7db12219) + Target background color + 10,40,10 + 20,20,70 + false + + + (0x7f45a2a9, 0x7db12219) + Target foreground color + 60,100,60 + 10,10,30 + false + + + (0x007deef9, 0x2f3e95c6) + Target font size + 100 + 40 + false + + + (0x7f45a2a9, 0x7db12219) + Selected background color + 70,20,20 + 10,40,10 + false + + + (0x7f45a2a9, 0x7db12219) + Selected foreground color + 30,10,10 + 60,100,60 + false + + + (0x007deef9, 0x2f3e95c6) + Selected font size + 100 + 40 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 704.000000 + + + (0x4e7b798a, 0x183beafb) + (0x8d89d30c, 0xa939693a) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-speller-visualization.cfg + + + (0xad100179, 0xa3c984ab) + 178 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00f44ed7) + + + + + (0x0000356c, 0x00004381) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/p300-train-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 695.000000 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00848d41) + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004eca, 0x00003f33) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 848.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0027ce86) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000599b, 0x000026ba) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 752.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xad100179, 0xa3c984ab) + 121 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0068aa09) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00006d0d, 0x000031d8) + Target Letter Generation + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-speller-target.lua + false + + + (0x79a9edeb, 0x245d83fc) + Word to Spell (leave this empty if random) + + + false + + + (0x2c132d6e, 0x44ab0d97) + Row Stimulation Base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column Stimulation Base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x512a166f, 0x5c3ef83f) + Delay Before Sending (in sec) + 2 + 2 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 800.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 169 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x03412669) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00000ea4, 0x000068ff) + + (0x0000599b, 0x000026ba) + 2 + + + (0x00004eca, 0x00003f33) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 34 + + + (0x358ae8b5, 0x0f8bacd1) + 752 + + + (0x3f0a3b27, 0x570913d2) + 160 + + + (0x6267b5c5, 0x676e3e42) + 848 + + + + + (0x00001043, 0x00003d7c) + + (0x000000ea, 0x000057a1) + 0 + + + (0x00001a71, 0x00003e16) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -292 + + + (0x358ae8b5, 0x0f8bacd1) + 688 + + + (0x3f0a3b27, 0x570913d2) + -288 + + + (0x6267b5c5, 0x676e3e42) + 688 + + + + + (0x00001d3e, 0x00000740) + + (0x00001a71, 0x00003e16) + 0 + + + (0x00006d0d, 0x000031d8) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -254 + + + (0x358ae8b5, 0x0f8bacd1) + 688 + + + (0x3f0a3b27, 0x570913d2) + -218 + + + (0x6267b5c5, 0x676e3e42) + 800 + + + + + (0x000036a5, 0x00006190) + + (0x0000599b, 0x000026ba) + 0 + + + (0x0000356c, 0x00004381) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 34 + + + (0x358ae8b5, 0x0f8bacd1) + 722 + + + (0x3f0a3b27, 0x570913d2) + 75 + + + (0x6267b5c5, 0x676e3e42) + 680 + + + + + (0x00003aa4, 0x00002b37) + + (0x00006d0d, 0x000031d8) + 0 + + + (0x00002c69, 0x00000b43) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -164 + + + (0x358ae8b5, 0x0f8bacd1) + 800 + + + (0x3f0a3b27, 0x570913d2) + -128 + + + (0x6267b5c5, 0x676e3e42) + 696 + + + + + (0x00004fb0, 0x00001b24) + + (0x00001a71, 0x00003e16) + 0 + + + (0x00002c69, 0x00000b43) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -254 + + + (0x358ae8b5, 0x0f8bacd1) + 688 + + + (0x3f0a3b27, 0x570913d2) + -128 + + + (0x6267b5c5, 0x676e3e42) + 681 + + + + + (0x000068a0, 0x0000330f) + + (0x0000599b, 0x000026ba) + 2 + + + (0x0000356c, 0x00004381) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 34 + + + (0x358ae8b5, 0x0f8bacd1) + 752 + + + (0x3f0a3b27, 0x570913d2) + 75 + + + (0x6267b5c5, 0x676e3e42) + 710 + + + + + (0x00007bda, 0x00000772) + + (0x0000599b, 0x000026ba) + 1 + + + (0x0000356c, 0x00004381) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 34 + + + (0x358ae8b5, 0x0f8bacd1) + 737 + + + (0x3f0a3b27, 0x570913d2) + 75 + + + (0x6267b5c5, 0x676e3e42) + 695 + + + + + + + (0x000028d1, 0x000038f6) + Here the data is streamed from the server to a file. + + + (0x473d9a43, 0x97fc0a97) + 417.000000 + + + (0x7234b86b, 0x2b8651a5) + 96.000000 + + + + + (0x0000363f, 0x00001c2b) + The P300 Speller Visualization +sends the markers (stimulations) directly to +Acquisition Server using TCP Tagging. + + + (0x473d9a43, 0x97fc0a97) + 1056.000000 + + + (0x7234b86b, 0x2b8651a5) + -112.000000 + + + + + (0x00004785, 0x00007f9c) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 496.000000 + + + (0x7234b86b, 0x2b8651a5) + -384.000000 + + + + + (0x00005d42, 0x00005589) + The use of these P300 examples are described in + +http://openvibe.inria.fr/openvibe-p300-speller/ + + + (0x473d9a43, 0x97fc0a97) + 1072.000000 + + + (0x7234b86b, 0x2b8651a5) + -320.000000 + + + + + (0x0000739d, 0x00003448) + This box will write the recorded file under +the directory where the scenario was opened +from (token ${Player_ScenarioDirectory}) + + + (0x473d9a43, 0x97fc0a97) + 992.000000 + + + (0x7234b86b, 0x2b8651a5) + 96.000000 + + + + + (0x19b8795c, 0x039f26f7) + <u><b><big>Overview</big></b></u> + +This scenario can be used as a first +step to collect some training data. The +data will later be used to train a +classifier for online use. + +The flast sequence will start after 20 sec. + +You will then be presented a blue letter that +you have to focus on, followed by a 12 times +flashing sequence of the whole grid. This will +be repeated 10 times. + +<small><i><b>note:</b> the recorded files go to the +folder where the scenario xml is located +(<span color="darkblue">${Player_ScenarioDirectory}/</span>).</i></small> + + + (0x473d9a43, 0x97fc0a97) + 384.000000 + + + (0x7234b86b, 0x2b8651a5) + -176.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":513,"identifier":"(0x00002206, 0x0000360e)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":518},{"boxIdentifier":"(0x00002c69, 0x00000b43)","childCount":0,"identifier":"(0x00007158, 0x00006ece)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007f2f, 0x00001c2b)","index":0,"name":"Default tab","parentIdentifier":"(0x00002206, 0x0000360e)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000071f9, 0x000001f9)","index":0,"name":"Empty","parentIdentifier":"(0x00007f2f, 0x00001c2b)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Basic P300 1/4 + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/openvibe-p300-speller/ + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-2-train-classifier.xml b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-2-train-classifier.xml new file mode 100644 index 0000000..a894b5b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-2-train-classifier.xml @@ -0,0 +1,1535 @@ + + 1 + OpenViBE + 1.2.0 + + + (0x0000018f, 0x00000cf9) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 64.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 608.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 59 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003f9f4a) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006dc8, 0x00007bff) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 496.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0042757f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000785b, 0x00002bfd) + Cz;O1;O2 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + Cz;O1;O2 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 480.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 92 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004455b9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0a5a6a4a, 0x1d92a778) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/p300-classifier.cfg + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Target + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_NonTarget + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 496.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x14295e6a, 0x23ec1ce1) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 288.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 384.000000 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00306e79) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1b824c2d, 0x35b61935) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Epoch block average + Epoch block average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 688.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-epoch-average.cfg + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00399afa) + + + + + (0x1c541307, 0x0a82ac15) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.600000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_NonTarget + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 704.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 189 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00947976) + + + + + (0x3d7e61e0, 0x5462c727) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x008074eb) + + + + + (0x3db25003, 0x05792630) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 288.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 688.000000 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0037d22e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4fd27695, 0x43631853) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0xad100179, 0xa3c984ab) + 126 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005da328) + + + + + (0x55d9b276, 0x037c7824) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.600000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 400.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 189 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x008ba4ce) + + + + + (0x599f86f5, 0x4a64d1da) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Epoch block average + Epoch block average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 384.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-epoch-average.cfg + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0031cdde) + + + + + (0x7f752994, 0x60b5d8d8) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/CHANGE_ME.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -176.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 527.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 153 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00df7d54) + + + + + + + (0x00001e87, 0x00000b6b) + + (0x7f752994, 0x60b5d8d8) + 2 + + + (0x0000018f, 0x00000cf9) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -153 + + + (0x358ae8b5, 0x0f8bacd1) + 542 + + + (0x3f0a3b27, 0x570913d2) + 43 + + + (0x6267b5c5, 0x676e3e42) + 608 + + + + + (0x00002f36, 0x00001f4f) + + (0x0000785b, 0x00002bfd) + 0 + + + (0x3d7e61e0, 0x5462c727) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -20 + + + (0x358ae8b5, 0x0f8bacd1) + 480 + + + (0x3f0a3b27, 0x570913d2) + 0 + + + (0x6267b5c5, 0x676e3e42) + 480 + + + + + (0x00005c28, 0x00001a49) + + (0x0000018f, 0x00000cf9) + 0 + + + (0x1c541307, 0x0a82ac15) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 87 + + + (0x358ae8b5, 0x0f8bacd1) + 608 + + + (0x3f0a3b27, 0x570913d2) + 128 + + + (0x6267b5c5, 0x676e3e42) + 711 + + + + + (0x0000693f, 0x000006b5) + + (0x0000018f, 0x00000cf9) + 0 + + + (0x55d9b276, 0x037c7824) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 87 + + + (0x358ae8b5, 0x0f8bacd1) + 608 + + + (0x3f0a3b27, 0x570913d2) + 128 + + + (0x6267b5c5, 0x676e3e42) + 407 + + + + + (0x00006d76, 0x00003e53) + + (0x7f752994, 0x60b5d8d8) + 1 + + + (0x0000785b, 0x00002bfd) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -153 + + + (0x358ae8b5, 0x0f8bacd1) + 527 + + + (0x3f0a3b27, 0x570913d2) + -74 + + + (0x6267b5c5, 0x676e3e42) + 480 + + + + + (0x0289f0ac, 0x7ccf911f) + + (0x55d9b276, 0x037c7824) + 0 + + + (0x599f86f5, 0x4a64d1da) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 162 + + + (0x358ae8b5, 0x0f8bacd1) + 392 + + + (0x3f0a3b27, 0x570913d2) + 203 + + + (0x6267b5c5, 0x676e3e42) + 384 + + + + + (0x08651bdc, 0x51a071b6) + + (0x3db25003, 0x05792630) + 0 + + + (0x0a5a6a4a, 0x1d92a778) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 311 + + + (0x358ae8b5, 0x0f8bacd1) + 688 + + + (0x3f0a3b27, 0x570913d2) + 379 + + + (0x6267b5c5, 0x676e3e42) + 511 + + + + + (0x09194257, 0x1fd9f895) + + (0x1c541307, 0x0a82ac15) + 0 + + + (0x1b824c2d, 0x35b61935) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 162 + + + (0x358ae8b5, 0x0f8bacd1) + 696 + + + (0x3f0a3b27, 0x570913d2) + 203 + + + (0x6267b5c5, 0x676e3e42) + 688 + + + + + (0x2b6c192a, 0x27af69e6) + + (0x14295e6a, 0x23ec1ce1) + 0 + + + (0x0a5a6a4a, 0x1d92a778) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 311 + + + (0x358ae8b5, 0x0f8bacd1) + 384 + + + (0x3f0a3b27, 0x570913d2) + 379 + + + (0x6267b5c5, 0x676e3e42) + 496 + + + + + (0x356b2cb6, 0x68a27a94) + + (0x599f86f5, 0x4a64d1da) + 0 + + + (0x14295e6a, 0x23ec1ce1) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 247 + + + (0x358ae8b5, 0x0f8bacd1) + 384 + + + (0x3f0a3b27, 0x570913d2) + 267 + + + (0x6267b5c5, 0x676e3e42) + 384 + + + + + (0x43d99f84, 0x5d797f5b) + + (0x0000018f, 0x00000cf9) + 0 + + + (0x0a5a6a4a, 0x1d92a778) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 87 + + + (0x358ae8b5, 0x0f8bacd1) + 608 + + + (0x3f0a3b27, 0x570913d2) + 379 + + + (0x6267b5c5, 0x676e3e42) + 481 + + + + + (0x559011c8, 0x5a65b9d9) + + (0x1b824c2d, 0x35b61935) + 0 + + + (0x3db25003, 0x05792630) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 247 + + + (0x358ae8b5, 0x0f8bacd1) + 688 + + + (0x3f0a3b27, 0x570913d2) + 267 + + + (0x6267b5c5, 0x676e3e42) + 688 + + + + + (0x69eeb38f, 0x21d417d6) + + (0x4fd27695, 0x43631853) + 0 + + + (0x1c541307, 0x0a82ac15) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 82 + + + (0x358ae8b5, 0x0f8bacd1) + 480 + + + (0x3f0a3b27, 0x570913d2) + 128 + + + (0x6267b5c5, 0x676e3e42) + 696 + + + + + (0x6a6bf91c, 0x7e969644) + + (0x4fd27695, 0x43631853) + 0 + + + (0x55d9b276, 0x037c7824) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 82 + + + (0x358ae8b5, 0x0f8bacd1) + 480 + + + (0x3f0a3b27, 0x570913d2) + 128 + + + (0x6267b5c5, 0x676e3e42) + 392 + + + + + (0x771fba05, 0x1de25d1f) + + (0x0a5a6a4a, 0x1d92a778) + 0 + + + (0x00006dc8, 0x00007bff) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 423 + + + (0x358ae8b5, 0x0f8bacd1) + 496 + + + (0x3f0a3b27, 0x570913d2) + 448 + + + (0x6267b5c5, 0x676e3e42) + 496 + + + + + (0x7f27c7b4, 0x06c00c24) + + (0x3d7e61e0, 0x5462c727) + 0 + + + (0x4fd27695, 0x43631853) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 34 + + + (0x358ae8b5, 0x0f8bacd1) + 480 + + + (0x3f0a3b27, 0x570913d2) + 48 + + + (0x6267b5c5, 0x676e3e42) + 480 + + + + + + + (0x000010db, 0x00003fcd) + For prerecorded data to test this P300, see + +<b>http://openvibe.inria.fr/datasets/</b> + + + + (0x473d9a43, 0x97fc0a97) + 880.000000 + + + (0x7234b86b, 0x2b8651a5) + -145.000000 + + + + + (0x00004785, 0x00007f9c) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 544.000000 + + + (0x7234b86b, 0x2b8651a5) + -240.000000 + + + + + (0x00005277, 0x00007fbe) + <u><b><big>Overview</big></b></u> + +This scenario should be used to train +the LDA classifier. + +Just configure the <i>Generic Stream Reader</i> +box to point to the last file you recorded with +scenario <i>1-acquisition</i> and fast forward +this scenario. + +At the end of the training, you will have an estimation +of the classifier performance printed in the console. +If this performance is lower than 70%, just run a new +<i>4-online</i> session to have better results. + + + (0x473d9a43, 0x97fc0a97) + 208.000000 + + + (0x7234b86b, 0x2b8651a5) + -80.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":501,"identifier":"(0x4308346b, 0x22eb24f1)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":816},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x6ff5e783, 0x155f45c9)","index":0,"name":"Default tab","parentIdentifier":"(0x4308346b, 0x22eb24f1)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00000ca2, 0x000036d4)","index":0,"name":"Empty","parentIdentifier":"(0x6ff5e783, 0x155f45c9)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Basic P300 2/4 + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/openvibe-p300-speller/ + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-3-online.xml b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-3-online.xml new file mode 100644 index 0000000..7ff8d23 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-3-online.xml @@ -0,0 +1,2275 @@ + + 1 + OpenViBE + 1.1.0+git + + + (0x000000ea, 0x000057a1) + Launch + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-speller-launch.lua + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to send + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x512a166f, 0x5c3ef83f) + Time to send + 20 + 20 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 496.000000 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 416.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 90 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d5b88e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001700, 0x00003f4b) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 368.000000 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 752.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 69 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002bb3, 0x0000133c) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 672.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xad100179, 0xa3c984ab) + 125 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0042dee1) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00003d0e, 0x000025ef) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 752.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 752.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002a3b4f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003dec, 0x00004c7b) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.6 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_VisualStimulationStart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 528.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 191 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x008f8872) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000445b, 0x000068e3) + P300 accumulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-speller-accumulator.lua + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x2c132d6e, 0x44ab0d97) + Segment start + OVTK_StimulationId_SegmentStart + OVTK_StimulationId_TrialStart + false + + + (0x2c132d6e, 0x44ab0d97) + Segment stop + OVTK_StimulationId_SegmentStop + OVTK_StimulationId_TrialStop + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 503.000000 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 624.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 133 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0b971674) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000785b, 0x00002bfd) + Cz;O1;O2 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + Cz;O1;O2 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48.000000 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 544.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 102 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004455b9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x001a8c16, 0x15ba27e3) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 512.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 110 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0085ac42) + + + + + (0x008f57e1, 0x2790537b) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/p300-online-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80.000000 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 800.000000 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 158 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0093f8a3) + + + (0xfba64161, 0x65304e21) + + + + + + (0x09c41dd7, 0x09f2e37b) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Epoch block average + Epoch block average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288.000000 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 528.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-epoch-average.cfg + + + (0xad100179, 0xa3c984ab) + 106 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0029fadd) + + + + + (0x0e30a73f, 0x7ae6d95a) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 352.000000 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 528.000000 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002a9907) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x12c0a51c, 0x5d112d9b) + Target Letter Generation + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-speller-target.lua + false + + + (0x79a9edeb, 0x245d83fc) + Word to Spell (leave this empty if random) + + + false + + + (0x2c132d6e, 0x44ab0d97) + Row Stimulation Base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column Stimulation Base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x512a166f, 0x5c3ef83f) + Delay Before Sending (in sec) + 2 + 2 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 640.000000 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 448.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 178 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x03bb2da4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x28b5e192, 0x37431137) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/p300-classifier.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 538.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xad100179, 0xa3c984ab) + 142 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2e63c8c5, 0x79a8ae7b) + P300 Speller Visualization + (0x195e41d6, 0x6e684d47) + + + (0x6f752dd0, 0x082a321e) + Sequence stimulations + + + (0x6f752dd0, 0x082a321e) + Target stimulations + + + (0x6f752dd0, 0x082a321e) + Row selection stimulations + + + (0x6f752dd0, 0x082a321e) + Column selection stimulations + + + + + (0x6f752dd0, 0x082a321e) + Target / Non target flagging + + + + + (0x330306dd, 0x74a95f98) + Interface filename + ${Path_Data}/plugins/simple-visualization/p300-speller.glade + ${Path_Data}/plugins/simple-visualization/p300-speller.ui + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x7f45a2a9, 0x7db12219) + Flash background color + 10,10,10 + 5,5,5 + false + + + (0x7f45a2a9, 0x7db12219) + Flash foreground color + 100,100,100 + 100,100,100 + false + + + (0x007deef9, 0x2f3e95c6) + Flash font size + 100 + 60 + false + + + (0x7f45a2a9, 0x7db12219) + No flash background color + 0,0,0 + 0,0,0 + false + + + (0x7f45a2a9, 0x7db12219) + No flash foreground color + 50,50,50 + 25,25,25 + false + + + (0x007deef9, 0x2f3e95c6) + No flash font size + 75 + 40 + false + + + (0x7f45a2a9, 0x7db12219) + Target background color + 10,40,10 + 20,20,70 + false + + + (0x7f45a2a9, 0x7db12219) + Target foreground color + 60,100,60 + 10,10,30 + false + + + (0x007deef9, 0x2f3e95c6) + Target font size + 100 + 40 + false + + + (0x7f45a2a9, 0x7db12219) + Selected background color + 70,20,20 + 10,40,10 + false + + + (0x7f45a2a9, 0x7db12219) + Selected foreground color + 30,10,10 + 60,100,60 + false + + + (0x007deef9, 0x2f3e95c6) + Selected font size + 100 + 40 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 448.000000 + + + (0x4e7b798a, 0x183beafb) + (0x8d89d30c, 0xa939693a) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-speller-visualization.cfg + + + (0xad100179, 0xa3c984ab) + 188 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x052d329c) + + + + + (0x40e41bf9, 0x5c44b1b1) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 512.000000 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0xad100179, 0xa3c984ab) + 129 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0059bf7f) + + + + + (0x53567600, 0x4c3da6a5) + P300 Speller Stimulator + (0x88857f9a, 0xf560d3eb) + + + (0x6f752dd0, 0x082a321e) + Incoming stimulations + + + + + (0x6f752dd0, 0x082a321e) + Produced stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Start stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x007deef9, 0x2f3e95c6) + Number of rows + 6 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of columns + 6 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of repetitions + 5 + 12 + false + + + (0x007deef9, 0x2f3e95c6) + Number of trials + 5 + 10 + false + + + (0x512a166f, 0x5c3ef83f) + Flash duration (in sec) + 0.075 + 0.200000 + false + + + (0x512a166f, 0x5c3ef83f) + No flash duration (in sec) + 0.125 + 0.100000 + false + + + (0x512a166f, 0x5c3ef83f) + Inter-repetition delay (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Inter-trial delay (in sec) + 2 + 3.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Avoid neighbor flashing + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 416.000000 + + + (0x4e7b798a, 0x183beafb) + (0x8137c905, 0x9ae4ae4b) + + + (0xad100179, 0xa3c984ab) + 174 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0115983f) + + + + + (0x6f54afd0, 0x5f2e0f65) + Identity + (0x5dffe431, 0x35215c50) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -32.000000 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 656.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 69 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x008d61ea) + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x0000012a, 0x00004201) + + (0x6f54afd0, 0x5f2e0f65) + 2 + + + (0x00001700, 0x00003f4b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -2 + + + (0x358ae8b5, 0x0f8bacd1) + 671 + + + (0x3f0a3b27, 0x570913d2) + 339 + + + (0x6267b5c5, 0x676e3e42) + 752 + + + + + (0x0000062d, 0x00006549) + + (0x0000445b, 0x000068e3) + 1 + + + (0x2e63c8c5, 0x79a8ae7b) + 3 + + + + (0x1b32c44c, 0x1905e0e9) + 542 + + + (0x358ae8b5, 0x0f8bacd1) + 631 + + + (0x3f0a3b27, 0x570913d2) + 684 + + + (0x6267b5c5, 0x676e3e42) + 470 + + + + + (0x0000080d, 0x0000086e) + + (0x00001700, 0x00003f4b) + 0 + + + (0x0000445b, 0x000068e3) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 398 + + + (0x358ae8b5, 0x0f8bacd1) + 752 + + + (0x3f0a3b27, 0x570913d2) + 466 + + + (0x6267b5c5, 0x676e3e42) + 631 + + + + + (0x00000b25, 0x00004527) + + (0x00001700, 0x00003f4b) + 0 + + + (0x00003d0e, 0x000025ef) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 398 + + + (0x358ae8b5, 0x0f8bacd1) + 752 + + + (0x3f0a3b27, 0x570913d2) + 732 + + + (0x6267b5c5, 0x676e3e42) + 752 + + + + + (0x0000266b, 0x000033bb) + + (0x6f54afd0, 0x5f2e0f65) + 2 + + + (0x00003dec, 0x00004c7b) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -2 + + + (0x358ae8b5, 0x0f8bacd1) + 671 + + + (0x3f0a3b27, 0x570913d2) + 204 + + + (0x6267b5c5, 0x676e3e42) + 535 + + + + + (0x00002cf9, 0x0000757a) + + (0x12c0a51c, 0x5d112d9b) + 0 + + + (0x2e63c8c5, 0x79a8ae7b) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 679 + + + (0x358ae8b5, 0x0f8bacd1) + 448 + + + (0x3f0a3b27, 0x570913d2) + 684 + + + (0x6267b5c5, 0x676e3e42) + 440 + + + + + (0x00002e50, 0x00003fba) + + (0x00003dec, 0x00004c7b) + 0 + + + (0x09c41dd7, 0x09f2e37b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 246 + + + (0x358ae8b5, 0x0f8bacd1) + 520 + + + (0x3f0a3b27, 0x570913d2) + 259 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x0000350b, 0x00006820) + + (0x0000785b, 0x00002bfd) + 0 + + + (0x001a8c16, 0x15ba27e3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 87 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 92 + + + (0x6267b5c5, 0x676e3e42) + 512 + + + + + (0x00004243, 0x0000628e) + + (0x00002bb3, 0x0000133c) + 2 + + + (0x6f54afd0, 0x5f2e0f65) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -90 + + + (0x358ae8b5, 0x0f8bacd1) + 672 + + + (0x3f0a3b27, 0x570913d2) + -61 + + + (0x6267b5c5, 0x676e3e42) + 671 + + + + + (0x00004406, 0x000017e6) + + (0x000000ea, 0x000057a1) + 0 + + + (0x53567600, 0x4c3da6a5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 535 + + + (0x358ae8b5, 0x0f8bacd1) + 416 + + + (0x3f0a3b27, 0x570913d2) + 540 + + + (0x6267b5c5, 0x676e3e42) + 416 + + + + + (0x00004a23, 0x00007947) + + (0x53567600, 0x4c3da6a5) + 0 + + + (0x2e63c8c5, 0x79a8ae7b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 582 + + + (0x358ae8b5, 0x0f8bacd1) + 416 + + + (0x3f0a3b27, 0x570913d2) + 684 + + + (0x6267b5c5, 0x676e3e42) + 425 + + + + + (0x00005b72, 0x00000606) + + (0x0000445b, 0x000068e3) + 0 + + + (0x2e63c8c5, 0x79a8ae7b) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 542 + + + (0x358ae8b5, 0x0f8bacd1) + 616 + + + (0x3f0a3b27, 0x570913d2) + 684 + + + (0x6267b5c5, 0x676e3e42) + 455 + + + + + (0x00005fac, 0x00002630) + + (0x00002bb3, 0x0000133c) + 0 + + + (0x6f54afd0, 0x5f2e0f65) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -90 + + + (0x358ae8b5, 0x0f8bacd1) + 642 + + + (0x3f0a3b27, 0x570913d2) + -61 + + + (0x6267b5c5, 0x676e3e42) + 641 + + + + + (0x00006356, 0x00004d4a) + + (0x6f54afd0, 0x5f2e0f65) + 1 + + + (0x0000785b, 0x00002bfd) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -2 + + + (0x358ae8b5, 0x0f8bacd1) + 656 + + + (0x3f0a3b27, 0x570913d2) + 11 + + + (0x6267b5c5, 0x676e3e42) + 544 + + + + + (0x00006a33, 0x00004bb6) + + (0x00002bb3, 0x0000133c) + 1 + + + (0x6f54afd0, 0x5f2e0f65) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -90 + + + (0x358ae8b5, 0x0f8bacd1) + 657 + + + (0x3f0a3b27, 0x570913d2) + -61 + + + (0x6267b5c5, 0x676e3e42) + 656 + + + + + (0x000074af, 0x000038c2) + + (0x6f54afd0, 0x5f2e0f65) + 2 + + + (0x008f57e1, 0x2790537b) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -2 + + + (0x358ae8b5, 0x0f8bacd1) + 671 + + + (0x3f0a3b27, 0x570913d2) + 51 + + + (0x6267b5c5, 0x676e3e42) + 815 + + + + + (0x0000769a, 0x00007906) + + (0x40e41bf9, 0x5c44b1b1) + 0 + + + (0x00003dec, 0x00004c7b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 182 + + + (0x358ae8b5, 0x0f8bacd1) + 512 + + + (0x3f0a3b27, 0x570913d2) + 204 + + + (0x6267b5c5, 0x676e3e42) + 520 + + + + + (0x00f1a11e, 0x4a813bb8) + + (0x09c41dd7, 0x09f2e37b) + 0 + + + (0x0e30a73f, 0x7ae6d95a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 318 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 323 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x0de02dd1, 0x545eff87) + + (0x6f54afd0, 0x5f2e0f65) + 1 + + + (0x008f57e1, 0x2790537b) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -2 + + + (0x358ae8b5, 0x0f8bacd1) + 656 + + + (0x3f0a3b27, 0x570913d2) + 51 + + + (0x6267b5c5, 0x676e3e42) + 800 + + + + + (0x12d5fdfc, 0x6ecf55b2) + + (0x0e30a73f, 0x7ae6d95a) + 0 + + + (0x28b5e192, 0x37431137) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 382 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 396 + + + (0x6267b5c5, 0x676e3e42) + 530 + + + + + (0x1a535826, 0x3804f216) + + (0x001a8c16, 0x15ba27e3) + 0 + + + (0x40e41bf9, 0x5c44b1b1) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 134 + + + (0x358ae8b5, 0x0f8bacd1) + 512 + + + (0x3f0a3b27, 0x570913d2) + 140 + + + (0x6267b5c5, 0x676e3e42) + 512 + + + + + (0x2893bc68, 0x5c0429ec) + + (0x6f54afd0, 0x5f2e0f65) + 0 + + + (0x008f57e1, 0x2790537b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -2 + + + (0x358ae8b5, 0x0f8bacd1) + 641 + + + (0x3f0a3b27, 0x570913d2) + 51 + + + (0x6267b5c5, 0x676e3e42) + 785 + + + + + (0x448c2d7d, 0x69a12a35) + + (0x28b5e192, 0x37431137) + 0 + + + (0x0000445b, 0x000068e3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 438 + + + (0x358ae8b5, 0x0f8bacd1) + 523 + + + (0x3f0a3b27, 0x570913d2) + 466 + + + (0x6267b5c5, 0x676e3e42) + 616 + + + + + (0x62a925f7, 0x4bf2755d) + + (0x53567600, 0x4c3da6a5) + 0 + + + (0x12c0a51c, 0x5d112d9b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 582 + + + (0x358ae8b5, 0x0f8bacd1) + 416 + + + (0x3f0a3b27, 0x570913d2) + 603 + + + (0x6267b5c5, 0x676e3e42) + 448 + + + + + + + (0x00004785, 0x00007f9c) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 288.000000 + + + (0x7234b86b, 0x2b8651a5) + -64.000000 + + + + + (0x3726b6f5, 0x3dea5d78) + <u><b><big>Overview</big></b></u> + +This scenario can be used online once the +classifiers is trained. + +The <i>Target Letter Generation</i> +box still proposes some targets in order to +eventually train the classifier +again, but you may want to disconnect that box +in order to have a real <i>free time</i> use of +the speller. + +The flash sequence starts automatically after 20 sec. + +You will then be presented a blue letter that +you have to focus on, followed by a 12 times +flashing sequence of the whole grid. The detected +letter will be presented in green. This will be repeated +10 times. + +If the performance of the system does not fit your +requirements, just run <i>2-train-classifier</i> +scenario again on the data you just recorded. + +<small><i><b>note:</b> the recorded files go to the +folder where the scenario xml is located +(<span color="darkblue">${Player_ScenarioDirectory}/</span>).</i></small> + + + (0x473d9a43, 0x97fc0a97) + 208.000000 + + + (0x7234b86b, 0x2b8651a5) + 224.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x2e63c8c5, 0x79a8ae7b)","childCount":0,"identifier":"(0x15cc794b, 0x08631685)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":496,"identifier":"(0x5acf1658, 0x420dc7f5)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":741},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x4526250d, 0x3dea2a26)","index":0,"name":"Default tab","parentIdentifier":"(0x5acf1658, 0x420dc7f5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x36ee8865, 0x68264bc3)","index":0,"name":"Empty","parentIdentifier":"(0x4526250d, 0x3dea2a26)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Basic P300 3/4 + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/openvibe-p300-speller/ + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-4-replay.xml b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-4-replay.xml new file mode 100644 index 0000000..df11f89 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-4-replay.xml @@ -0,0 +1,1806 @@ + + 1 + OpenViBE + 1.1.0+git + + + (0x00001d80, 0x00003839) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/p300-classifier.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 537.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xad100179, 0xa3c984ab) + 138 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00002db4, 0x00004e4d) + Pick target + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-speller-filter-target.lua + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 816.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 81 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00749b30) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002db4, 0x00004e4e) + Pick flash + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-speller-filter-flash.lua + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 727.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 81 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x007aab35) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003d0e, 0x000025ef) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 640.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 896.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004d93cc) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003dec, 0x00004c7b) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.6 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_VisualStimulationStart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 528.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 189 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b06288) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000445b, 0x000068e3) + P300 accumulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/p300-speller-accumulator.lua + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x2c132d6e, 0x44ab0d97) + Segment start + OVTK_StimulationId_TrialStart + OVTK_StimulationId_TrialStart + false + + + (0x2c132d6e, 0x44ab0d97) + Segment stop + OVTK_StimulationId_SegmentStop + OVTK_StimulationId_TrialStop + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 480.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 624.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 125 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0a2185a6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000677e, 0x000032be) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/CHANGE_ME.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -112.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 864.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 153 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x010e2eba) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x0000785b, 0x00002bfd) + Cz;O1;O2 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + Cz;O1;O2 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 528.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 92 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004455b9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x001a8c16, 0x15ba27e3) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 512.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0079e418) + + + + + (0x09c41dd7, 0x09f2e37b) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Epoch block average + Epoch block average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 528.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-epoch-average.cfg + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004afe07) + + + + + (0x0e30a73f, 0x7ae6d95a) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 352.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 528.000000 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004313a5) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2e63c8c5, 0x79a8ae7b) + P300 Speller Visualization + (0x195e41d6, 0x6e684d47) + + + (0x6f752dd0, 0x082a321e) + Sequence stimulations + + + (0x6f752dd0, 0x082a321e) + Target stimulations + + + (0x6f752dd0, 0x082a321e) + Row selection stimulations + + + (0x6f752dd0, 0x082a321e) + Column selection stimulations + + + + + (0x6f752dd0, 0x082a321e) + Target / Non target flagging + + + + + (0x330306dd, 0x74a95f98) + Interface filename + ${Path_Data}/plugins/simple-visualization/p300-speller.glade + ${Path_Data}/plugins/simple-visualization/p300-speller.ui + false + + + (0x2c132d6e, 0x44ab0d97) + Row stimulation base + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Column stimulation base + OVTK_StimulationId_Label_07 + OVTK_StimulationId_Label_07 + false + + + (0x7f45a2a9, 0x7db12219) + Flash background color + 10,10,10 + 5,5,5 + false + + + (0x7f45a2a9, 0x7db12219) + Flash foreground color + 100,100,100 + 100,100,100 + false + + + (0x007deef9, 0x2f3e95c6) + Flash font size + 100 + 60 + false + + + (0x7f45a2a9, 0x7db12219) + No flash background color + 0,0,0 + 0,0,0 + false + + + (0x7f45a2a9, 0x7db12219) + No flash foreground color + 50,50,50 + 25,25,25 + false + + + (0x007deef9, 0x2f3e95c6) + No flash font size + 75 + 40 + false + + + (0x7f45a2a9, 0x7db12219) + Target background color + 10,40,10 + 20,20,70 + false + + + (0x7f45a2a9, 0x7db12219) + Target foreground color + 60,100,60 + 10,10,30 + false + + + (0x007deef9, 0x2f3e95c6) + Target font size + 100 + 40 + false + + + (0x7f45a2a9, 0x7db12219) + Selected background color + 70,20,20 + 10,40,10 + false + + + (0x7f45a2a9, 0x7db12219) + Selected foreground color + 30,10,10 + 60,100,60 + false + + + (0x007deef9, 0x2f3e95c6) + Selected font size + 100 + 40 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 592.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 688.000000 + + + (0x4e7b798a, 0x183beafb) + (0x8d89d30c, 0xa939693a) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/p300-speller-visualization.cfg + + + (0xad100179, 0xa3c984ab) + 178 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05899984) + + + + + (0x40e41bf9, 0x5c44b1b1) + Signal Decimation + (0x012f4bea, 0x3be37c66) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Decimation factor + 8 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 512.000000 + + + (0x4e7b798a, 0x183beafb) + (0x5082af41, 0xd0fbf4cb) + + + (0xad100179, 0xa3c984ab) + 126 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005b8857) + + + + + (0x6f54afd0, 0x5f2e0f65) + Identity + (0x5dffe431, 0x35215c50) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -32.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 656.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 59 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006b2e3e) + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x0000062d, 0x00006549) + + (0x0000445b, 0x000068e3) + 1 + + + (0x2e63c8c5, 0x79a8ae7b) + 3 + + + + (0x1b32c44c, 0x1905e0e9) + 508 + + + (0x358ae8b5, 0x0f8bacd1) + 631 + + + (0x3f0a3b27, 0x570913d2) + 576 + + + (0x6267b5c5, 0x676e3e42) + 710 + + + + + (0x00000ace, 0x000049a0) + + (0x0000677e, 0x000032be) + 1 + + + (0x00003d0e, 0x000025ef) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -89 + + + (0x358ae8b5, 0x0f8bacd1) + 871 + + + (0x3f0a3b27, 0x570913d2) + 624 + + + (0x6267b5c5, 0x676e3e42) + 896 + + + + + (0x0000121f, 0x00004438) + + (0x00002db4, 0x00004e4d) + 0 + + + (0x2e63c8c5, 0x79a8ae7b) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 300 + + + (0x358ae8b5, 0x0f8bacd1) + 816 + + + (0x3f0a3b27, 0x570913d2) + 576 + + + (0x6267b5c5, 0x676e3e42) + 680 + + + + + (0x00001824, 0x000046e3) + + (0x00001d80, 0x00003839) + 0 + + + (0x0000445b, 0x000068e3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 434 + + + (0x358ae8b5, 0x0f8bacd1) + 522 + + + (0x3f0a3b27, 0x570913d2) + 454 + + + (0x6267b5c5, 0x676e3e42) + 616 + + + + + (0x00001a5d, 0x000012a3) + + (0x00002db4, 0x00004e4e) + 0 + + + (0x2e63c8c5, 0x79a8ae7b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 300 + + + (0x358ae8b5, 0x0f8bacd1) + 727 + + + (0x3f0a3b27, 0x570913d2) + 576 + + + (0x6267b5c5, 0x676e3e42) + 665 + + + + + (0x0000266b, 0x000033bb) + + (0x6f54afd0, 0x5f2e0f65) + 2 + + + (0x00003dec, 0x00004c7b) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -9 + + + (0x358ae8b5, 0x0f8bacd1) + 671 + + + (0x3f0a3b27, 0x570913d2) + 208 + + + (0x6267b5c5, 0x676e3e42) + 535 + + + + + (0x00002e50, 0x00003fba) + + (0x00003dec, 0x00004c7b) + 0 + + + (0x09c41dd7, 0x09f2e37b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 242 + + + (0x358ae8b5, 0x0f8bacd1) + 520 + + + (0x3f0a3b27, 0x570913d2) + 267 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x00003307, 0x0000684b) + + (0x0000677e, 0x000032be) + 1 + + + (0x6f54afd0, 0x5f2e0f65) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -89 + + + (0x358ae8b5, 0x0f8bacd1) + 871 + + + (0x3f0a3b27, 0x570913d2) + -53 + + + (0x6267b5c5, 0x676e3e42) + 671 + + + + + (0x00004b6e, 0x000065db) + + (0x0000677e, 0x000032be) + 1 + + + (0x00002db4, 0x00004e4d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -89 + + + (0x358ae8b5, 0x0f8bacd1) + 871 + + + (0x3f0a3b27, 0x570913d2) + 246 + + + (0x6267b5c5, 0x676e3e42) + 816 + + + + + (0x00005a4a, 0x00006d99) + + (0x0000785b, 0x00002bfd) + 0 + + + (0x001a8c16, 0x15ba27e3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 76 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 96 + + + (0x6267b5c5, 0x676e3e42) + 512 + + + + + (0x00005b72, 0x00000606) + + (0x0000445b, 0x000068e3) + 0 + + + (0x2e63c8c5, 0x79a8ae7b) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 508 + + + (0x358ae8b5, 0x0f8bacd1) + 616 + + + (0x3f0a3b27, 0x570913d2) + 576 + + + (0x6267b5c5, 0x676e3e42) + 695 + + + + + (0x000064b5, 0x00002c57) + + (0x6f54afd0, 0x5f2e0f65) + 1 + + + (0x0000785b, 0x00002bfd) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -9 + + + (0x358ae8b5, 0x0f8bacd1) + 656 + + + (0x3f0a3b27, 0x570913d2) + 22 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x000065fe, 0x00005dce) + + (0x0000677e, 0x000032be) + 1 + + + (0x00002db4, 0x00004e4e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -89 + + + (0x358ae8b5, 0x0f8bacd1) + 871 + + + (0x3f0a3b27, 0x570913d2) + 246 + + + (0x6267b5c5, 0x676e3e42) + 727 + + + + + (0x00006736, 0x00007e42) + + (0x6f54afd0, 0x5f2e0f65) + 2 + + + (0x0000445b, 0x000068e3) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -9 + + + (0x358ae8b5, 0x0f8bacd1) + 671 + + + (0x3f0a3b27, 0x570913d2) + 454 + + + (0x6267b5c5, 0x676e3e42) + 631 + + + + + (0x00007246, 0x00001771) + + (0x0e30a73f, 0x7ae6d95a) + 0 + + + (0x00001d80, 0x00003839) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 375 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 400 + + + (0x6267b5c5, 0x676e3e42) + 529 + + + + + (0x0000769a, 0x00007906) + + (0x40e41bf9, 0x5c44b1b1) + 0 + + + (0x00003dec, 0x00004c7b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 178 + + + (0x358ae8b5, 0x0f8bacd1) + 512 + + + (0x3f0a3b27, 0x570913d2) + 208 + + + (0x6267b5c5, 0x676e3e42) + 520 + + + + + (0x00007bba, 0x00000887) + + (0x0000677e, 0x000032be) + 0 + + + (0x6f54afd0, 0x5f2e0f65) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -89 + + + (0x358ae8b5, 0x0f8bacd1) + 856 + + + (0x3f0a3b27, 0x570913d2) + -53 + + + (0x6267b5c5, 0x676e3e42) + 656 + + + + + (0x00f1a11e, 0x4a813bb8) + + (0x09c41dd7, 0x09f2e37b) + 0 + + + (0x0e30a73f, 0x7ae6d95a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 311 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 331 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x1a535826, 0x3804f216) + + (0x001a8c16, 0x15ba27e3) + 0 + + + (0x40e41bf9, 0x5c44b1b1) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 130 + + + (0x358ae8b5, 0x0f8bacd1) + 512 + + + (0x3f0a3b27, 0x570913d2) + 144 + + + (0x6267b5c5, 0x676e3e42) + 512 + + + + + + + (0x00004785, 0x00007f9c) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 288.000000 + + + (0x7234b86b, 0x2b8651a5) + -48.000000 + + + + + (0x3030288d, 0x2dbf93f2) + <u><b><big>Overview</big></b></u> + +This scenario allows to quickly replay +an online session recorded file. The +main between this scenario and +scenario <i>3-online</i> is basically +all the acquisition / stimulation part +being replaced by a file reader. + +<u><b>Note:</b></u> refer to scenario <i>3-online</i> for +details about the processing. + + + (0x473d9a43, 0x97fc0a97) + 256.000000 + + + (0x7234b86b, 0x2b8651a5) + 128.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x2e63c8c5, 0x79a8ae7b)","childCount":0,"identifier":"(0x15cc794b, 0x08631685)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":496,"identifier":"(0x5acf1658, 0x420dc7f5)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":741},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x4526250d, 0x3dea2a26)","index":0,"name":"Default tab","parentIdentifier":"(0x5acf1658, 0x420dc7f5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x36ee8865, 0x68264bc3)","index":0,"name":"Empty","parentIdentifier":"(0x4526250d, 0x3dea2a26)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Basic P300 4/4 + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/openvibe-p300-speller/ + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-accumulator.lua b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-accumulator.lua new file mode 100644 index 0000000..37962cc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-accumulator.lua @@ -0,0 +1,200 @@ + +function arrayMax(a) + if #a == 0 then return nil, nil end + local maxIdx, maxValue = 0, a[0] + for i = 1, (#a -1 ) do + if maxValue < a[i] then + maxIdx, maxValue = i, a[i] + end + end + return maxIdx, maxValue +end + +-- For handling target fifo + +List = {} +function List.new () + return {first = 0, last = -1} +end + +function List.pushright (list, value) + local last = list.last + 1 + list.last = last + list[last] = value +end + +function List.popleft (list) + local first = list.first + if first > list.last then + error("list is empty") + end + local value = list[first] + list[first] = nil -- to allow garbage collection + list.first = first + 1 + return value +end + +function List.isempty (list) + if list.first > list.last then + return true + else + return false + end +end + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + row_base = _G[box:get_setting(2)] + col_base = _G[box:get_setting(3)] + segment_start = _G[box:get_setting(4)] + segment_stop = _G[box:get_setting(5)] + + -- 0 inactive, 1 segment started, 2 segment stopped (can vote) + segment_status = 0 + + -- the idea is to push the flash states to the fifo, and when predictions arrive (with some delay), they are matched in oldest-first fashion. + target_fifo = List.new() + + -- box:log("Info", string.format("pop %d %d", id[1], id[2])) + + row_votes = {} + col_votes = {} + + do_debug = false + +end + +-- this function is called when the box is uninitialized +function uninitialize(box) + +end + +function process(box) + -- loops until box is stopped + while box:keep_processing() do + + -- first, parse the timeline stream + for stimulation = 1, box:get_stimulation_count(2) do + -- gets the received stimulation + local identifier, date, duration = box:get_stimulation(2, 1) + -- discards it + box:remove_stimulation(2, 1) + + if identifier == segment_start then + if do_debug then + box:log("Info", string.format("Trial start")) + box:log("Info", string.format("Clear votes")) + end + -- zero the votes + col_votes = {} + row_votes = {} + target_fifo = List.new() + -- fixme fixed 20 + for i = 0,20 do + col_votes[i] = 0 + row_votes[i] = 0 + end + segment_status = 1 + end + + -- Does the identifier code a flash? if so, put into fifo + if segment_status == 1 and identifier >= row_base and identifier <= OVTK_StimulationId_LabelEnd then + + -- assume rows before cols + if identifier < col_base then + local t = {"row", identifier - row_base} + List.pushright(target_fifo,t) + if do_debug then + box:log("Info", string.format("Push row target %d", identifier - row_base )) + end + else + local t = {"col", identifier - col_base} + List.pushright(target_fifo,t) + if do_debug then + box:log("Info", string.format("Push col target %d", identifier - col_base )) + end + end + + + end + + if identifier == segment_stop then + if do_debug then + box:log("Info", string.format("Trial stop")) + end + segment_status = 2 + end + + end + + -- then parse the classifications + for stimulation = 1, box:get_stimulation_count(1) do + + -- gets the received stimulation + local identifier, date, duration = box:get_stimulation(1, 1) + -- discards it + box:remove_stimulation(1, 1) + + -- Is it an in-class prediction? + if identifier == OVTK_StimulationId_Target then + local t = List.popleft(target_fifo) + if do_debug then + box:log("Info", string.format("Pred fifo %s %d is target", t[1], t[2])) + end + if t[1]=="row" then + row_votes[t[2]] = row_votes[t[2]] + 1 + else + col_votes[t[2]] = col_votes[t[2]] + 1 + end + end + + if identifier == OVTK_StimulationId_NonTarget then + local t = List.popleft(target_fifo) + if do_debug then + box:log("Info", string.format("Pred fifo %s %d is nontarget", t[1], t[2])) + end + end + + end + + if segment_status == 2 and List.isempty(target_fifo) then + -- output the vote after the segment end when we've matched all predictions + + local maxRowIdx, maxRowValue = arrayMax(row_votes) + local maxColIdx, maxColValue = arrayMax(col_votes) + + if maxRowValue == 0 and maxColValue == 0 then + box:log("Warning", string.format("Classifier predicted 'no p300' for all flashes of the trial")); + end + + if do_debug then + local rowVotes = 0 + local colVotes = 0 + for ir, val in pairs(row_votes) do + rowVotes = rowVotes + val + end + for ir, val in pairs(col_votes) do + colVotes = colVotes + val + end + + box:log("Info", string.format("Vote [%d %d] wt [%d,%d]", maxRowIdx+row_base, maxColIdx+col_base, maxRowValue, maxColValue)) + box:log("Info", string.format(" Total [%d %d]", rowVotes, colVotes)) + end + + + + local now = box:get_current_time() + + box:send_stimulation(1, maxRowIdx + row_base, now, 0) + box:send_stimulation(2, maxColIdx + col_base, now, 0) + + segment_status = 0 + end + + box:sleep() + end +end + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-filter-flash.lua b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-filter-flash.lua new file mode 100644 index 0000000..846bd55 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-filter-flash.lua @@ -0,0 +1,61 @@ + +-- Picks out 'flashes' from a stimulation stream + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + box:set_filter_mode(1); + + state = 0 + + do_debug = false +end + +-- this function is called when the box is uninitialized +function uninitialize(box) +end + +-- this function is called once by the box +function process(box) + + -- loop until box:keep_processing() returns zero + -- cpu will be released with a call to sleep + -- at the end of the loop + while box:keep_processing() do + + -- gets current simulated time + t = box:get_current_time() + + -- loops on every received stimulation for a given input + for stimulation = 1, box:get_stimulation_count(1) do + + -- gets stimulation + stimulation_id, stimulation_time, stimulation_duration = box:get_stimulation(1, 1) + + if stimulation_id == OVTK_StimulationId_SegmentStart then + state = 1 + elseif stimulation_id == OVTK_StimulationId_SegmentStop then + state = 0 + end + + -- If we're between 'rest start' and 'rest_stop', this specifies a target + if state == 1 and stimulation_id >= OVTK_StimulationId_LabelStart and stimulation_id <= OVTK_StimulationId_LabelEnd then + + box:send_stimulation(1, stimulation_id, stimulation_time, 0) + + if do_debug then + box:log("Info", string.format("Push a target %d at %f (now %f)", stimulation_id, stimulation_time, t)) + end + end + + -- discards it + box:remove_stimulation(1, 1) + + end + + -- releases cpu + box:sleep() + end +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-filter-target.lua b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-filter-target.lua new file mode 100644 index 0000000..3a67c76 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-filter-target.lua @@ -0,0 +1,61 @@ + +-- Picks out 'targets' from a stimulation stream + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + state = 0 + + box:set_filter_mode(1); + + do_debug = false +end + +-- this function is called when the box is uninitialized +function uninitialize(box) +end + +-- this function is called once by the box +function process(box) + + -- loop until box:keep_processing() returns zero + -- cpu will be released with a call to sleep + -- at the end of the loop + while box:keep_processing() do + + -- gets current simulated time + t = box:get_current_time() + + -- loops on every received stimulation for a given input + for stimulation = 1, box:get_stimulation_count(1) do + + -- gets stimulation + stimulation_id, stimulation_time, stimulation_duration = box:get_stimulation(1, 1) + + if stimulation_id == OVTK_StimulationId_RestStart then + state = 1 + elseif stimulation_id == OVTK_StimulationId_RestStop then + state = 0 + end + + -- If we're between 'rest start' and 'rest_stop', this specifies a target + if state == 1 and stimulation_id >= OVTK_StimulationId_LabelStart and stimulation_id <= OVTK_StimulationId_LabelEnd then + + box:send_stimulation(1, stimulation_id, stimulation_time, 0) + + if do_debug then + box:log("Info", string.format("Push a target %d at %f (now = %f)", stimulation_id, stimulation_time, t)) + end + end + + -- discards it + box:remove_stimulation(1, 1) + + end + + -- releases cpu + box:sleep() + end +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-launch.lua b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-launch.lua new file mode 100644 index 0000000..8c65efb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-launch.lua @@ -0,0 +1,21 @@ + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + stim = _G[box:get_setting(2)] + launchTime = box:get_setting(3) + +end + +-- this function is called when the box is uninitialized +function uninitialize(box) +end + +-- this function is called once by the box +function process(box) + + box:send_stimulation(1, stim, launchTime, 0) + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-target.lua b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-target.lua new file mode 100644 index 0000000..fa29e00 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-target.lua @@ -0,0 +1,95 @@ +-- This Lua script generates target stimulations for the P300 visualization +-- box based on the matrix of letters / numbers a P300 speller has +-- +-- Author : Yann Renard, INRIA +-- Date : 2011-03-15 + +grid = +{ + { 'a', 'b', 'c', 'd', 'e', 'f' }, + { 'g', 'h', 'i', 'j', 'k', 'l' }, + { 'm', 'n', 'o', 'p', 'q', 'r' }, + { 's', 't', 'u', 'v', 'w', 'x' }, + { 'y', 'z', '1', '2', '3', '4' }, + { '5', '6', '7', '8', '9', '0' }, +} + +index = 0 + +function get_location(c) + for i = 1, 6 do + for j = 1, 6 do + if grid[i][j] == c then + return i, j + end + end + end + return 0, 0 +end + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + math.randomseed(os.time()) + target = box:get_setting(2) + row_base = _G[box:get_setting(3)] + col_base = _G[box:get_setting(4)] + delay = box:get_setting(5) + if target == "" then + for i = 1, 1000 do + a = math.random(1, #grid) + b = math.random(1, #grid[1]) + target = target .. grid[a][b] + end + end +end + +-- this function is called when the box is uninitialized +function uninitialize(box) +end + +-- this function is called once by the box +function process(box) + + -- loop until box:keep_processing() returns zero + -- cpu will be released with a call to sleep + -- at the end of the loop + while box:keep_processing() do + + -- gets current simulated time + t = box:get_current_time() + + -- loops on every received stimulation for a given input + for stimulation = 1, box:get_stimulation_count(1) do + + -- gets stimulation + stimulation_id, stimulation_time, stimulation_duration = box:get_stimulation(1, 1) + + if stimulation_id == OVTK_StimulationId_RestStart then + + -- finds a new target + index = index + 1 + r, c = get_location(string.sub(target, index, index)) + + -- triggers the target + box:send_stimulation(1, row_base+r-1, t+delay, 0) + box:send_stimulation(1, col_base+c-1, t+delay, 0) + + elseif stimulation_id == OVTK_StimulationId_ExperimentStop then + + -- triggers train stimulation + box:send_stimulation(1, OVTK_StimulationId_Train, t+delay+1, 0) + + end + + -- discards it + box:remove_stimulation(1, 1) + + end + + -- releases cpu + box:sleep() + end +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-visualization.cfg b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-visualization.cfg new file mode 100644 index 0000000..ae68c18 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/p300-speller-visualization.cfg @@ -0,0 +1,17 @@ + + ${Path_Data}/plugins/simple-visualization/p300-speller.ui + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_07 + 5,5,5 + 100,100,100 + 60 + 0,0,0 + 25,25,25 + 40 + 20,20,70 + 10,10,30 + 40 + 10,40,10 + 60,100,60 + 40 + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/signals/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/signals/README.txt new file mode 100644 index 0000000..8eaa204 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/p300/bci-examples/p300-speller/signals/README.txt @@ -0,0 +1,3 @@ + +The scenario will record its signals here. + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/CMakeLists.txt new file mode 100644 index 0000000..ec4c49a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/CMakeLists.txt @@ -0,0 +1,75 @@ +PROJECT(openvibe-ssvep-demo) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +INCLUDE("FindThirdPartyVRPN_Check") +IF(NOT PATH_VRPN) + MESSAGE(STATUS " --> Not building ${PROJECT_NAME}") + RETURN() +ENDIF(NOT PATH_VRPN) + +INCLUDE("FindThirdPartyCEGUI_Check") +IF(NOT CEGUI_FOUND OR NOT OgreCEGUIRenderer_FOUND) + MESSAGE(STATUS " --> Not building ${PROJECT_NAME}") + RETURN() +ENDIF(NOT CEGUI_FOUND OR NOT OgreCEGUIRenderer_FOUND) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindThirdPartyCEGUI") # CEGUI + CEGUIOgreRender included +INCLUDE("FindThirdPartyVRPN") +INCLUDE("FindThirdPartyOgre3D") # OGRE + OIS included, pulls boost thread +INCLUDE("FindThirdPartyBoost") # Using Ogre headers on Win32 causes dependency to Boost thread library +INCLUDE("FindThirdPartyBoost_Thread") # Note that this is a potential issue on Windows, as the dependencies/ogre/boost and dependencies/boost are not the same at the time of writing this. +INCLUDE("FindThirdPartyBoost_System") # Note that this is a potential issue on Windows, as the dependencies/ogre/boost and dependencies/boost are not the same at the time of writing this. + + +# --------------------------------- +# Finds standard library pthread +# Adds library to target +# Adds include path +# --------------------------------- +IF(UNIX) + FIND_LIBRARY(LIB_STANDARD_MODULE_PTHREAD pthread) + IF(LIB_STANDARD_MODULE_PTHREAD) + MESSAGE(STATUS " Found pthread...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_PTHREAD}) + ELSE(LIB_STANDARD_MODULE_PTHREAD) + MESSAGE(STATUS " FAILED to find pthread...") + ENDIF(LIB_STANDARD_MODULE_PTHREAD) +ENDIF(UNIX) + +# --------------------------------- + + + + +# --------------------------------- + + +# ---------------------- +# Generate launch script +# ---------------------- +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "openvibe-ssvep-demo-trainer" EXECUTABLE_NAME ${PROJECT_NAME} PARAMETERS "trainer") +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "openvibe-ssvep-demo-shooter" EXECUTABLE_NAME ${PROJECT_NAME} PARAMETERS "shooter") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/applications/ssvep-demo) + +INSTALL(DIRECTORY signals DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) +INSTALL(DIRECTORY bci-examples DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/classifiers/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/classifiers/README.txt new file mode 100644 index 0000000..53d2f9b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/classifiers/README.txt @@ -0,0 +1,3 @@ + +The scenario will record its configuration here. + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/configuration/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/configuration/README.txt new file mode 100644 index 0000000..53d2f9b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/configuration/README.txt @@ -0,0 +1,3 @@ + +The scenario will record its configuration here. + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/example-experiment-configuration.cfg b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/example-experiment-configuration.cfg new file mode 100644 index 0000000..042fe5f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/example-experiment-configuration.cfg @@ -0,0 +1,9 @@ + + ${Player_ScenarioDirectory}/scripts/configuration-experiment-settings.lua + 100,0,0 + 10,10,10 + 20;15;12 + 0.5 + 0.1 + 0.250 + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/example-shooter-configuration.cfg b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/example-shooter-configuration.cfg new file mode 100644 index 0000000..c5d5fd3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/example-shooter-configuration.cfg @@ -0,0 +1,5 @@ + + ${Player_ScenarioDirectory}/scripts/shooter-controller.lua + 0 3 5 7 2 6 4 1 + 0.01 + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/example-training-configuration.cfg b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/example-training-configuration.cfg new file mode 100644 index 0000000..b740f58 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/example-training-configuration.cfg @@ -0,0 +1,9 @@ + + ${Player_ScenarioDirectory}/scripts/training-acquisition-controller.lua + 0 2 3 1 2 1 0 3 1 2 3 0 2 0 3 1 0 3 1 2 3 0 1 2 1 3 2 0 3 2 0 1 + 7.000000 + 4.000000 + 1.000000 + 0.3;0.3 + (0.0;0.0);(0.0;0.5);(-0.5;0.0);(0.5;0.0) + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/classifier-training-flipswitch.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/classifier-training-flipswitch.lua new file mode 100644 index 0000000..2014671 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/classifier-training-flipswitch.lua @@ -0,0 +1,43 @@ + +flip_count = 0 +switched_flip_count = 0 +flips = {} + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + flip_count = box:get_input_count() + + for i = 1, flip_count do + flips[i] = false + end +end + +function uninitialize(box) +end + +function process(box) + + while box:keep_processing() and switched_flip_count < flip_count do + + for i = 1, flip_count do + if box:get_stimulation_count(i) > 0 then + + box:remove_stimulation(i, 1) + + if not flips[i] then + switched_flip_count = switched_flip_count + 1 + flips[i] = true + + io.write("Flip ", i, " of ", flip_count, " switched\n") + + end + + end + end + + box:sleep() + end + + box:send_stimulation(1, OVTK_StimulationId_Label_00, box:get_current_time()) +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/classifier-training-target-separator.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/classifier-training-target-separator.lua new file mode 100644 index 0000000..8800995 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/classifier-training-target-separator.lua @@ -0,0 +1,62 @@ + +targets = {} +non_targets = {} +sent_stimulation = 0 + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + -- read the parameters of the box + + s_targets = box:get_setting(2) + + for t in s_targets:gmatch("%d+") do + targets[t + 0] = true + end + + s_non_targets = box:get_setting(3) + + for t in s_non_targets:gmatch("%d+") do + non_targets[t + 0] = true + end + + sent_stimulation = _G[box:get_setting(4)] + +end + +function uninitialize(box) +end + +function process(box) + + finished = false + + while box:keep_processing() and not finished do + + time = box:get_current_time() + + while box:get_stimulation_count(1) > 0 do + + s_code, s_date, s_duration = box:get_stimulation(1, 1) + box:remove_stimulation(1, 1) + + if s_code >= OVTK_StimulationId_Label_00 and s_code <= OVTK_StimulationId_Label_1F then + + received_stimulation = s_code - OVTK_StimulationId_Label_00 + + if targets[received_stimulation] ~= nil then + box:send_stimulation(1, sent_stimulation, time) + elseif non_targets[received_stimulation] ~= nil then + box:send_stimulation(2, sent_stimulation, time) + end + + elseif s_code == OVTK_StimulationId_ExperimentStop then + finished = true + end + end + + box:sleep() + + end + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/configuration-experiment-settings.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/configuration-experiment-settings.lua new file mode 100644 index 0000000..2005a9a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/configuration-experiment-settings.lua @@ -0,0 +1,132 @@ + +stimulation_frequencies = {} +frequency_count = 0 + +target_light_color = {} +target_dark_color = {} +training_target_size = {} +training_targets_positions = {} + +processing_epoch_duration = nil +processing_epoch_interval = nil +processing_frequency_tolerance = nil + +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + for value in box:get_setting(2):gmatch("%d+") do + table.insert(target_light_color, value) + end + + for value in box:get_setting(3):gmatch("%d+") do + table.insert(target_dark_color, value) + end + + for value in box:get_setting(4):gmatch("%d+[.]?%d*") do + table.insert(stimulation_frequencies, value) + frequency_count = frequency_count + 1 + end + + processing_epoch_duration = box:get_setting(5) + processing_epoch_interval = box:get_setting(6) + processing_frequency_tolerance = box:get_setting(7) + +end + +function uninitialize(box) +end + +function process(box) + + while box:keep_processing() and box:get_stimulation_count(1) == 0 do + box:sleep() + end + + box:log("Info", box:get_config("Writing additional configuration to '${CustomConfigurationPrefix${OperatingSystem}}-ssvep-demo${CustomConfigurationSuffix${OperatingSystem}}'")) + + cfg_file = assert(io.open(box:get_config("${CustomConfigurationPrefix${OperatingSystem}}-ssvep-demo${CustomConfigurationSuffix${OperatingSystem}}"), "a")) + + success = true + success = success and cfg_file:write("SSVEP_TargetLightColourRed = ", target_light_color[1] / 100, "\n") + success = success and cfg_file:write("SSVEP_TargetLightColourGreen = ", target_light_color[2] / 100, "\n") + success = success and cfg_file:write("SSVEP_TargetLightColourBlue = ", target_light_color[3] / 100, "\n") + success = success and cfg_file:write("SSVEP_TargetDarkColourRed = ", target_dark_color[1] / 100, "\n") + success = success and cfg_file:write("SSVEP_TargetDarkColourGreen = ", target_dark_color[2] / 100, "\n") + success = success and cfg_file:write("SSVEP_TargetDarkColourBlue = ", target_dark_color[3] / 100, "\n") + + for i=1,frequency_count do + success = success and cfg_file:write("SSVEP_Frequency_", i, " = ", string.format("%g", stimulation_frequencies[i]), "\n") + end + + cfg_file:close() + + if (success == false) then + box:log("Error", box:get_config("Write error")) + return false + end + + -- create configuration files for temporal filters + + scenario_path = box:get_config("${Player_ScenarioDirectory}") + + for i=1,frequency_count do + cfg_file_name = scenario_path .. string.format("/configuration/temporal-filter-freq-%d.cfg", i) + box:log("Info", "Writing file '" .. cfg_file_name .. "'") + + cfg_file = io.open(cfg_file_name, "w") + if cfg_file == nil then + box:log("Error", "Cannot write to [" .. cfg_file_name .. "]") + box:log("Error", "Please copy the scenario folder to a directory with write access and use from there.") + return false + end + + success = true + success = success and cfg_file:write("\n") + success = success and cfg_file:write("Butterworth\n") + success = success and cfg_file:write("Band pass\n") + success = success and cfg_file:write("4\n") + success = success and cfg_file:write(string.format("%g\n", stimulation_frequencies[i] - processing_frequency_tolerance)) + success = success and cfg_file:write(string.format("%g\n", stimulation_frequencies[i] + processing_frequency_tolerance)) + success = success and cfg_file:write("0.500000\n") + success = success and cfg_file:write("\n") + + cfg_file:close() + + if (success == false) then + box:log("Error", box:get_config("Write error")) + return false + end + + end + + -- create configuration file for time based epoching + cfg_file_name = scenario_path .. "/configuration/time-based-epoching.cfg"; + + box:log("Info", "Writing file '" .. cfg_file_name .. "'") + + cfg_file = io.open(cfg_file_name, "w") + if cfg_file == nil then + box:log("Error", "Cannot write to [" .. cfg_file_name .. "]") + box:log("Error", "Please copy the scenario folder to a directory with write access and use from there.") + return false + end + + success = true + success = success and cfg_file:write("\n") + success = success and cfg_file:write(string.format("%g\n", processing_epoch_duration)) + success = success and cfg_file:write(string.format("%g\n", processing_epoch_interval)) + success = success and cfg_file:write("\n") + + cfg_file:close() + + if (success == false) then + box:log("Error", box:get_config("Write error")) + return false + end + + -- notify the scenario that the configuration process is complete + + box:send_stimulation(1, OVTK_StimulationId_TrainCompleted, box:get_current_time() + 0.2, 0) + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/configuration-peripheral-settings.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/configuration-peripheral-settings.lua new file mode 100644 index 0000000..b555cb5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/configuration-peripheral-settings.lua @@ -0,0 +1,33 @@ + +vrpn_host = nil +vrpn_port = nil +screen_refresh_rate = nil + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + screen_refresh_rate = box:get_setting(2) +end + +function uninitialize(box) +end + +function process(box) + + box:log("Info", box:get_config("Generating '${CustomConfigurationPrefix${OperatingSystem}}-ssvep-demo${CustomConfigurationSuffix${OperatingSystem}}'")) + + cfg_file = assert(io.open(box:get_config("${CustomConfigurationPrefix${OperatingSystem}}-ssvep-demo${CustomConfigurationSuffix${OperatingSystem}}"), "w")) + + success = true + success = success and cfg_file:write("# This file was automatically generated!\n\n") + success = success and cfg_file:write("# If you want to change the SSVEP configuration\n") + success = success and cfg_file:write("# please use the provided ssvep-configuration scenario.\n") + success = success and cfg_file:write("SSVEP_ScreenRefreshRate = ", screen_refresh_rate, "\n") + + if (success == false) then + box:log("Error", box:get_config("Write error")) + end + + cfg_file:close() + + box:send_stimulation(1, OVTK_StimulationId_TrainCompleted, box:get_current_time() + 0.2, 0) +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/shooter-button-simplifier.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/shooter-button-simplifier.lua new file mode 100644 index 0000000..a4f6df4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/shooter-button-simplifier.lua @@ -0,0 +1,35 @@ +buffer = {} + +function initialize(box) +end + +function uninitialize(box) +end + +-- This script receives stimulations and lets pass only every other one +-- for each stimulation code +-- Useful to remove "key up" events of keyboard stimulator +function process(box) + + while box:keep_processing() do + + for index = 1, box:get_stimulation_count(1) do + + stimulation = box:get_stimulation(1, index) + + if buffer[stimulation] == nil then + box:send_stimulation(1, stimulation, box:get_current_time(), 0) + buffer[stimulation] = 1 + else + buffer[stimulation] = nil + end + + box:remove_stimulation(1, 1) + end + + box:sleep() + end + + + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/shooter-combination-classifier.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/shooter-combination-classifier.lua new file mode 100644 index 0000000..e668f2a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/shooter-combination-classifier.lua @@ -0,0 +1,46 @@ + +class_count = 0 + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + class_count = box:get_setting(2) +end + +function uninitialize(box) +end + +function process(box) + + while box:keep_processing() do + + time = box:get_current_time() + + while box:keep_processing() and box:get_stimulation_count(1) > 0 do + + local decision = 0 + local decided = false + + -- check each input + for i = 1, class_count do + -- if the frequency is considered as stimulated + if (box:get_stimulation(i, 1) - OVTK_StimulationId_Label_00 == 1) then + if not decided then + decision = i + decided = true + else + decision = 0 + end + + end + box:remove_stimulation(i, 1) + end + + if decision ~= 0 then + box:send_stimulation(1, OVTK_StimulationId_Label_00 + decision - 1, box:get_current_time() + 0.01, 0) + end + + end + box:sleep() + end +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/shooter-controller.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/shooter-controller.lua new file mode 100644 index 0000000..28c2b9c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/shooter-controller.lua @@ -0,0 +1,66 @@ + +sequence = {} +flickeringDelay = nil + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + s_sequence = box:get_setting(2) + angular_speed = box:get_setting(3) + + box:log("Info", string.format("Target Sequence : [%s]\n", s_sequence)) + + for target in s_sequence:gmatch("%d+") do + table.insert(sequence, target) + end + + box:log("Info", string.format("Angular Speed : %g\n", angular_speed)) + + -- create the configuration file for the shooter application + cfg_file = io.open(box:get_config("${CustomConfigurationPrefix${OperatingSystem}}-ssvep-demo-shooter${CustomConfigurationSuffix${OperatingSystem}}"), "w") + + cfg_file:write("# This file was automatically generated!\n\n") + cfg_file:write("# If you want to change the SSVEP online shooter configuration\n") + cfg_file:write("# please use the box settings in the shooter scenario.\n\n") + + cfg_file:write("SSVEP_ShipAngularSpeed = ", angular_speed, "\n") + cfg_file:close() + +end + +function uninitialize(box) +end + +function process(box) + + -- while targets are available, send a stimulation with new target + -- position for each request + + while box:keep_processing() do + if box:get_stimulation_count(1) > 0 then + + identifier, date, duration = box:get_stimulation(1, 1) + + if identifier == OVTK_StimulationId_Target then + current_time = box:get_current_time() + 1 + + -- if no targets are available, quit the game + if # sequence == 0 then + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, current_time, 0) + break + end + + next_target = sequence[1] + table.remove(sequence, 1) + + box:send_stimulation(1, OVTK_StimulationId_Label_00 + next_target , current_time, 0) + end + + box:remove_stimulation(1, 1) + end + + box:sleep() + end + +end + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/start-stimulator.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/start-stimulator.lua new file mode 100644 index 0000000..099017d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/start-stimulator.lua @@ -0,0 +1,21 @@ +delay = 1 + +function initialize(box) + s_delay = box:get_setting(2); + + io.write(string.format("Delay : [%s]\n", s_delay)) + + if (s_delay:find("^%d+$") ~= nil) then + delay = tonumber(s_delay) + else + io.write("[ERROR] The parameter should be a numeric value\n") + end + +end + +function uninitialize(box) +end + +function process(box) + box:send_stimulation(1, 0x00008001, delay, 0) +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/training-acquisition-controller.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/training-acquisition-controller.lua new file mode 100644 index 0000000..e41a1bb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/scripts/training-acquisition-controller.lua @@ -0,0 +1,176 @@ + +sequence = {} +number_of_cycles = 0 + +stimulation_duration = nil +break_duration = nil +flickering_delay = nil + +target_width = nil +target_height = nil + +target_positions = {} +number_of_targets = {} + +stimulationLabels = { + 0x00008100, + 0x00008101, + 0x00008102, + 0x00008103, + 0x00008104, + 0x00008105, + 0x00008106, + 0x00008107 +} + +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + -- load the goal sequence + s_sequence = box:get_setting(2) + + + for target in s_sequence:gmatch("%d+") do + table.insert(sequence, target) + number_of_cycles = number_of_cycles + 1 + end + + box:log("Info", string.format("Number of goals in sequence: [%d]", number_of_cycles)) + + -- get the duration of a stimulation sequence + s_stimulation_duration = box:get_setting(3) + + if (s_stimulation_duration:find("^%d+[.]?%d*$") ~= nil) then + stimulation_duration = tonumber(s_stimulation_duration) + box:log("Info", string.format("Stimulation Duration : [%g]", stimulation_duration)) + else + box:log("Error", "The parameter 'stimulation duration' must be a numeric value\n") + error() + end + + -- get the duration of a break between stimulations + s_break_duration = box:get_setting(4) + + if (s_break_duration:find("^%d+[.]?%d*$") ~= nil) then + break_duration = tonumber(s_break_duration) + box:log("Info", string.format("Break Duration : [%s]", s_break_duration)) + else + box:log("Error", "The parameter 'break duration' must be a numeric value\n") + error() + end + + -- get the delay between the appearance of the marker and the start of flickering + s_flickering_delay = box:get_setting(5) + + if (s_flickering_delay:find("^%d+[.]?%d*$") ~= nil) then + flickering_delay = tonumber(s_flickering_delay) + box:log("Info", string.format("Flickering Delay : [%s]", s_flickering_delay)) + else + box:log("Error", "The parameter 'flickering delay' must be a numeric value\n") + error() + end + + -- get the target size + + s_targetSize = box:get_setting(6) + + s_width, s_height = s_targetSize:match("^(%d+[.]?%d*);(%d+[.]?%d*)$") + target_width = tonumber(s_width) + target_height = tonumber(s_height) + + if s_width ~= nil and s_height ~= nil then + box:log("Info", string.format("Target dimensions : width = %g, height = %g", target_width, target_height)) + else + box:log("Error", "The parameter 'target size' must be in format float;float") + error() + end + + -- get the targets' positions + + s_targetPositions = box:get_setting(7) + number_of_targets = 0 + + for s_target_x, s_target_y in s_targetPositions:gmatch("(-?%d+[.]?%d*);(-?%d+[.]?%d*)") do + box:log("Info", string.format("Target %d : x = %g y = %g", number_of_targets, tonumber(s_target_x), tonumber(s_target_y))) + table.insert(target_positions, {tonumber(s_target_x), tonumber(s_target_y)}) + number_of_targets = number_of_targets + 1 + + end + + + -- create the configuration file for the stimulation-based-epoching + -- this file is used during classifier training only + cfg_file_name = box:get_config("${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg") + cfg_file = io.open(cfg_file_name, "w") + if cfg_file == nil then + box:log("Error", "Cannot write to [" .. cfg_file_name .. "]") + box:log("Error", "Please copy the scenario folder to a directory with write access and use from there.") + return false + end + + cfg_file:write("\n") + cfg_file:write(" ", stimulation_duration, "\n") + cfg_file:write(" ", flickering_delay, "\n") + cfg_file:write(" OVTK_StimulationId_Target\n") + cfg_file:write("\n") + + cfg_file:close() + + -- create the configuration file for the training program + cfg_file = io.open(box:get_config("${CustomConfigurationPrefix${OperatingSystem}}-ssvep-demo-training${CustomConfigurationSuffix${OperatingSystem}}"), "w") + + cfg_file:write("# This file was automatically generated!\n\n") + cfg_file:write("# If you want to change the SSVEP trainer configuration\n") + cfg_file:write("# please use the box settings in the training scenario.\n\n") + + cfg_file:write("SSVEP_TargetCount = ", number_of_targets, "\n") + cfg_file:write("SSVEP_TargetWidth = ", target_width, "\n") + cfg_file:write("SSVEP_TargetHeight = ", target_height, "\n") + + for target_index, position in ipairs(target_positions) do + + cfg_file:write("SSVEP_Target_X_", target_index - 1, " = ", position[1], "\n") + cfg_file:write("SSVEP_Target_Y_", target_index - 1, " = ", position[2], "\n") + end + + cfg_file:close() + +end + +function uninitialize(box) +end + +function process(box) + + while box:keep_processing() and box:get_stimulation_count(1) == 0 do + box:sleep() + end + + current_time = box:get_current_time() + 1 + + box:send_stimulation(1, OVTK_StimulationId_ExperimentStart, current_time, 0) + + current_time = current_time + 2 + + for i,target in ipairs(sequence) do + box:log("Info", string.format("Goal no %d is %d at %d", i, target, current_time)) + -- mark goal + box:send_stimulation(2, OVTK_StimulationId_LabelStart + target, current_time, 0) + -- wait for Flickering_delay seconds + current_time = current_time + flickering_delay + -- start flickering + box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStart, current_time, 0) + -- wait for Stimulation_duration seconds + current_time = current_time + stimulation_duration + -- unmark goal and stop flickering + box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStop, current_time, 0) + -- wait for Break_duration seconds + current_time = current_time + break_duration + end + + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, current_time, 0) + + box:sleep() +end + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/signals/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/signals/README.txt new file mode 100644 index 0000000..8eaa204 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/signals/README.txt @@ -0,0 +1,3 @@ + +The scenario will record its signals here. + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-0-acquisition-test.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-0-acquisition-test.xml new file mode 100644 index 0000000..47e036e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-0-acquisition-test.xml @@ -0,0 +1,852 @@ + + 1 + OpenVIBE + 0.1.99 + + + + + + (0x000003a4, 0x00000114) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 40.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02ad4f5c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000745, 0x000050af) + Spectral analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imag Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x018a760d) + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000018bc, 0x000002fa) + Raw + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352.000000 + + + (0x207c9054, 0x3c841b63) + 464.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0144bb15) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000291a, 0x00002562) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 2.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.500000 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x011e96bd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004602, 0x00007a29) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00ce91c6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007112, 0x00006485) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48.000000 + + + (0x207c9054, 0x3c841b63) + 528.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01e4a38d) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x000077dd, 0x000055e4) + Filtered + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464.000000 + + + (0x207c9054, 0x3c841b63) + 640.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01122317) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x338f2b3b, 0x49719bcc) + Instant Bars + (0xecb46081, 0x96da0d49) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 672 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0x6b60e2b2, 0xf4839b7d) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000032b9, 0x00004e09) + + (0x00007112, 0x00006485) + 1 + + + (0x00004602, 0x00007a29) + 0 + + + + (0x00004d15, 0x00007560) + + (0x0000291a, 0x00002562) + 0 + + + (0x00000745, 0x000050af) + 0 + + + + (0x00004fd5, 0x0000009d) + + (0x00004602, 0x00007a29) + 0 + + + (0x000003a4, 0x00000114) + 0 + + + + (0x00006003, 0x00006d3a) + + (0x000003a4, 0x00000114) + 0 + + + (0x0000291a, 0x00002562) + 0 + + + + (0x00007abb, 0x0000009e) + + (0x000003a4, 0x00000114) + 0 + + + (0x000077dd, 0x000055e4) + 0 + + + + (0x00007f52, 0x00002722) + + (0x00004602, 0x00007a29) + 0 + + + (0x000018bc, 0x000002fa) + 0 + + + + (0x1792528d, 0x6f582a19) + + (0x00000745, 0x000050af) + 0 + + + (0x338f2b3b, 0x49719bcc) + 0 + + + + + + (0x00002b05, 0x000047ad) + <b><big>Acquisition test</big></b> + +Scenario used for testing data acquisition. The signal quality should +always be checked before training. + + + + (0x473d9a43, 0x97fc0a97) + 880 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + (0x00007f52, 0x000053c0) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 528 + + + (0x7234b86b, 0x2b8651a5) + -112 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":776,"identifier":"(0x00006e4a, 0x000001fd)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":753},{"boxIdentifier":"(0x338f2b3b, 0x49719bcc)","childCount":0,"identifier":"(0x5392a425, 0x23169e14)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003980, 0x0000094e)","index":0,"name":"Default tab","parentIdentifier":"(0x00006e4a, 0x000001fd)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":171,"identifier":"(0x00006c8e, 0x0000570f)","index":0,"maxDividerPosition":731,"name":"Vertical split","parentIdentifier":"(0x00003980, 0x0000094e)","type":4},{"boxIdentifier":"(0x000018bc, 0x000002fa)","childCount":0,"identifier":"(0x00001f89, 0x00001e76)","index":0,"parentIdentifier":"(0x00006c8e, 0x0000570f)","type":3},{"boxIdentifier":"(0x000077dd, 0x000055e4)","childCount":0,"identifier":"(0x0000185e, 0x000017b8)","index":1,"parentIdentifier":"(0x00006c8e, 0x0000570f)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Jozef Legény + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + SSVEP Acquisition Test + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + SSVEP + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-1-ssvep-configuration.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-1-ssvep-configuration.xml new file mode 100644 index 0000000..158d475 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-1-ssvep-configuration.xml @@ -0,0 +1,453 @@ + + 1 + OpenVIBE + 0.0.2 + + + (0x0de6da7d, 0x3a63884e) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x1fa963f5, 0x1a638cd4) + 27 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x643a57e6, 0x5db6b5a5) + Experiment Settings + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/configuration-experiment-settings.lua + false + + + (0x7f45a2a9, 0x7db12219) + Target Light Color + 100,0,0 + 100,0,0 + false + + + (0x7f45a2a9, 0x7db12219) + Target Dark Color + 0,0,0 + 10,10,10 + false + + + (0x79a9edeb, 0x245d83fc) + Stimulation Frequencies + 20;15;12 + 20;15;12 + false + + + (0x512a166f, 0x5c3ef83f) + Processing Epoch Duration + 0.5 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Processing Epoch Interval + 0.1 + 0.1 + false + + + (0x512a166f, 0x5c3ef83f) + Processing Frequency Tolerance + 0.250 + 0.250 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x1fa963f5, 0x1a638cd4) + 57 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 158 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x7e8245e4, 0x41dbf359) + Peripheral Settings + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/configuration-peripheral-settings.lua + false + + + (0x007deef9, 0x2f3e95c6) + Screen Refresh Rate + 60 + 60 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x1fa963f5, 0x1a638cd4) + 57 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x0c266f90, 0x7fc31cc9) + + (0x643a57e6, 0x5db6b5a5) + 0 + + + (0x0de6da7d, 0x3a63884e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 307 + + + (0x358ae8b5, 0x0f8bacd1) + 352 + + + (0x3f0a3b27, 0x570913d2) + 510 + + + (0x6267b5c5, 0x676e3e42) + 352 + + + + + (0x1e9366aa, 0x1443b0fb) + + (0x7e8245e4, 0x41dbf359) + 0 + + + (0x643a57e6, 0x5db6b5a5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 35 + + + (0x358ae8b5, 0x0f8bacd1) + 352 + + + (0x3f0a3b27, 0x570913d2) + 239 + + + (0x6267b5c5, 0x676e3e42) + 352 + + + + + + + (0x05488892, 0x66346878) + <big><b>Peripheral Settings</b></big> + +Settings in this box must match your hardware configuration. +Currently, the only supported setting is the screen refresh rate. + +<b>Screen Refresh Rate : </b> The refresh rate of your screen, +refer to your screen's user manual to find this value. + +<span color="red">Important notice</span> + +Your screen will be able to reproduce only frequencies which +are result of division of your screen refresh rate by an +integer. + + + (0x473d9a43, 0x97fc0a97) + -32 + + + (0x7234b86b, 0x2b8651a5) + -48 + + + + + (0x3974ed1f, 0x29aa94c8) + <big><b>Scenario description</b></big> + +<b><span color="red">This scenario must be run at least once before +running any further SSVEP scenarios</span></b> + +This is a scenario where you can configure your SSVEP experiment. There +are two boxes containing configuration parameters: + +<b>Peripheral Settings</b> + +<b>Experiment Settings</b> + +For more detailed description please refer to the SSVEP +documentation page. + + + (0x473d9a43, 0x97fc0a97) + 352 + + + (0x7234b86b, 0x2b8651a5) + -336 + + + + + (0x5604a66d, 0x71c42d00) + <b><span color="#2060ff">Configurable box</span></b> + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 352 + + + (0x7234b86b, 0x2b8651a5) + 0 + + + + + (0x60f812bd, 0x313894cf) + <big><b>Experiment Settings</b></big> + +Settings concerning the SSVEP experiment in general. + +<b>Target Light Color</b> and <b>Target Dark Color</b> represent +the two colors which will be used to generate the flickering of +the targets. The notation Light and Dark is arbitrary, however on +frequencies using odd number of frames will use more frames to +represent the Light color. + +<b>Stimulation Frequencies</b> A comma separated list of +frequencies used for the stimulation. Refer to the documentation +for more details. + +<b>Processing Epoch Duration</b> The length of the slice of the signal +which will be used to find SSVEP response. With longer duration precision +will increase at the detriment of the lag. + +<b>Processing Epoch Interval</b> The speed interval between slices of the +signal. + +<b>Processing Frequency Tolerance</b> The width of the frequency band +around the stimulation frequency used for classification. + + + (0x473d9a43, 0x97fc0a97) + -32 + + + (0x7234b86b, 0x2b8651a5) + 304 + + + + + (0x6a410d4e, 0x61696337) + <b><span color="#2060ff">Configurable box</span></b> + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 352 + + + (0x7234b86b, 0x2b8651a5) + 272 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x48715606, 0x15ba4f24)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x3683b3e2, 0x7c4b4806)","index":0,"name":"Default tab","parentIdentifier":"(0x48715606, 0x15ba4f24)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x1fb42682, 0x45866d35)","index":0,"name":"Empty","parentIdentifier":"(0x3683b3e2, 0x7c4b4806)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-2-training-acquisition.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-2-training-acquisition.xml new file mode 100644 index 0000000..5f6f896 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-2-training-acquisition.xml @@ -0,0 +1,1836 @@ + + 1 + OpenVIBE + 0.0.2 + + + (0x00004162, 0x0000548c) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 880.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x08185827, 0x2b518b10) + SSVEP Training Controller + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/training-acquisition-controller.lua + false + + + (0x79a9edeb, 0x245d83fc) + Goal sequence + 0 2 3 1 2 1 0 3 1 2 3 0 2 0 3 1 0 3 1 2 3 0 1 2 1 3 2 0 3 2 0 1 + 0 2 3 1 2 1 0 3 1 2 3 0 2 0 3 1 0 3 1 2 3 0 1 2 1 3 2 0 3 2 0 1 + false + + + (0x512a166f, 0x5c3ef83f) + Stimulation duration + 7 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Break duration + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Flickering delay + 1 + 1.000000 + false + + + (0x79a9edeb, 0x245d83fc) + Training Target Size + 0.3;0.3 + 0.3;0.3 + false + + + (0x79a9edeb, 0x245d83fc) + Training Targets' Positions + (0.0;0.0);(0.0;0.5);(-0.5;0.0);(0.5;0.0) + (0.0;0.0);(0.0;0.5);(-0.5;0.0);(0.5;0.0) + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 198 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x15eff133, 0x1354c796) + Scenario Control + (0x40714327, 0x458877d2) + + + (0x6f752dd0, 0x082a321e) + Output 1 + + + (0x6f752dd0, 0x082a321e) + Output 2 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn@localhost + SSVEP_VRPN_StartStop@localhost:${VRPN_ExternalServerPort} + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStop + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -176 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0x09fd9ef3, 0xeb8c3069) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 131 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x240f1aee, 0x1385b3f7) + Target Select + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + (0x6f752dd0, 0x082a321e) + Input 3 + + + (0x6f752dd0, 0x082a321e) + Input 4 + + + (0x6f752dd0, 0x082a321e) + Input 5 + + + (0x6f752dd0, 0x082a321e) + Input 6 + + + (0x6f752dd0, 0x082a321e) + Input 7 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + SSVEP_VRPN_Target + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 5 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_04 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 5 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_04 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 6 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_05 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 6 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_05 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 7 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_06 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 7 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_06 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2d1eee72, 0x5d16ec35) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 133 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2d571917, 0x6888058a) + Stimulator Control + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + (0x6f752dd0, 0x082a321e) + Input 3 + + + (0x6f752dd0, 0x082a321e) + Input 4 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + SSVEP_VRPN_StimulatorControl + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_VisualStimulationStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_VisualStimulationStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_VisualStimulationStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_VisualStimulationStop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xad100179, 0xa3c984ab) + 144 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2d7d52e1, 0x67b6ce56) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + (0x013df452, 0xa3a8879a) + Input stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + ${Player_ScenarioDirectory}/signals/ssvep-record-[$core{date}-$core{time}].ov + ${Player_ScenarioDirectory}/signals/ssvep-record-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 992 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 171 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2eb18d3c, 0x7422b864) + Start Stimulation + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/start-stimulator.lua + false + + + (0x007deef9, 0x2f3e95c6) + Delay + 1 + 1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 1184 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x3bd028d3, 0x30f45685) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 67 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4ace51e8, 0x2aa6d781) + Stimulation multiplexer + (0x07db4efa, 0x472b0938) + + + (0x6f752dd0, 0x082a321e) + Input stimulations 1 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 2 + + + + + (0x6f752dd0, 0x082a321e) + Multiplexed stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 1072 + + + (0x4e7b798a, 0x183beafb) + (0xe7af82cd, 0x14edb4d4) + + + (0xad100179, 0xa3c984ab) + 158 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x56f2df46, 0x0823c1fe) + Run Command + (0x48843891, 0x7bfc57f4) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 1 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_ExperimentStart + false + + + (0x79a9edeb, 0x245d83fc) + Command 1 + + ${External_Application_Launcher} openvibe-ssvep-demo --run-bg trainer + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 1184 + + + (0x4e7b798a, 0x183beafb) + (0xe44a71e7, 0x7964dd76) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7bc257e7, 0x17e198e0) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 67 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000035f8, 0x000060ec) + + (0x00004162, 0x0000548c) + 0 + + + (0x2d7d52e1, 0x67b6ce56) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 291 + + + (0x358ae8b5, 0x0f8bacd1) + 850 + + + (0x3f0a3b27, 0x570913d2) + 392 + + + (0x6267b5c5, 0x676e3e42) + 969 + + + + + (0x000063aa, 0x000072aa) + + (0x00004162, 0x0000548c) + 1 + + + (0x2d7d52e1, 0x67b6ce56) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 291 + + + (0x358ae8b5, 0x0f8bacd1) + 865 + + + (0x3f0a3b27, 0x570913d2) + 392 + + + (0x6267b5c5, 0x676e3e42) + 984 + + + + + (0x0283b642, 0x75fdebdd) + + (0x08185827, 0x2b518b10) + 1 + + + (0x7bc257e7, 0x17e198e0) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 48 + + + (0x358ae8b5, 0x0f8bacd1) + 599 + + + (0x3f0a3b27, 0x570913d2) + 248 + + + (0x6267b5c5, 0x676e3e42) + 672 + + + + + (0x0639cd18, 0x25452566) + + (0x7bc257e7, 0x17e198e0) + 0 + + + (0x240f1aee, 0x1385b3f7) + 6 + + + + (0x1b32c44c, 0x1905e0e9) + 297 + + + (0x358ae8b5, 0x0f8bacd1) + 672 + + + (0x3f0a3b27, 0x570913d2) + 386 + + + (0x6267b5c5, 0x676e3e42) + 717 + + + + + (0x08f21b9a, 0x602f27fc) + + (0x7bc257e7, 0x17e198e0) + 0 + + + (0x240f1aee, 0x1385b3f7) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 297 + + + (0x358ae8b5, 0x0f8bacd1) + 672 + + + (0x3f0a3b27, 0x570913d2) + 386 + + + (0x6267b5c5, 0x676e3e42) + 627 + + + + + (0x12346df9, 0x1dd1539d) + + (0x3bd028d3, 0x30f45685) + 0 + + + (0x2d571917, 0x6888058a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 297 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 386 + + + (0x6267b5c5, 0x676e3e42) + 505 + + + + + (0x13c329b6, 0x3698e5b9) + + (0x4ace51e8, 0x2aa6d781) + 0 + + + (0x2d7d52e1, 0x67b6ce56) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 297 + + + (0x358ae8b5, 0x0f8bacd1) + 1072 + + + (0x3f0a3b27, 0x570913d2) + 392 + + + (0x6267b5c5, 0x676e3e42) + 999 + + + + + (0x246477be, 0x2e5221a0) + + (0x15eff133, 0x1354c796) + 1 + + + (0x2d1eee72, 0x5d16ec35) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -144 + + + (0x358ae8b5, 0x0f8bacd1) + 903 + + + (0x3f0a3b27, 0x570913d2) + -113 + + + (0x6267b5c5, 0x676e3e42) + 896 + + + + + (0x2639c977, 0x7c0a8087) + + (0x7bc257e7, 0x17e198e0) + 0 + + + (0x240f1aee, 0x1385b3f7) + 4 + + + + (0x1b32c44c, 0x1905e0e9) + 297 + + + (0x358ae8b5, 0x0f8bacd1) + 672 + + + (0x3f0a3b27, 0x570913d2) + 386 + + + (0x6267b5c5, 0x676e3e42) + 687 + + + + + (0x275c0b96, 0x3a5468f2) + + (0x3bd028d3, 0x30f45685) + 0 + + + (0x2d571917, 0x6888058a) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 297 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 386 + + + (0x6267b5c5, 0x676e3e42) + 535 + + + + + (0x326ce6f5, 0x6efe024d) + + (0x7bc257e7, 0x17e198e0) + 0 + + + (0x240f1aee, 0x1385b3f7) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 297 + + + (0x358ae8b5, 0x0f8bacd1) + 672 + + + (0x3f0a3b27, 0x570913d2) + 386 + + + (0x6267b5c5, 0x676e3e42) + 642 + + + + + (0x3d2ef813, 0x3b0586cf) + + (0x15eff133, 0x1354c796) + 0 + + + (0x08185827, 0x2b518b10) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -144 + + + (0x358ae8b5, 0x0f8bacd1) + 888 + + + (0x3f0a3b27, 0x570913d2) + -14 + + + (0x6267b5c5, 0x676e3e42) + 592 + + + + + (0x41a6e934, 0x015be6e1) + + (0x2eb18d3c, 0x7422b864) + 0 + + + (0x56f2df46, 0x0823c1fe) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -96 + + + (0x358ae8b5, 0x0f8bacd1) + 1184 + + + (0x3f0a3b27, 0x570913d2) + -72 + + + (0x6267b5c5, 0x676e3e42) + 1184 + + + + + (0x492b7b8a, 0x5586c491) + + (0x7bc257e7, 0x17e198e0) + 0 + + + (0x240f1aee, 0x1385b3f7) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 297 + + + (0x358ae8b5, 0x0f8bacd1) + 672 + + + (0x3f0a3b27, 0x570913d2) + 386 + + + (0x6267b5c5, 0x676e3e42) + 657 + + + + + (0x4e8d2da5, 0x3cada96a) + + (0x7bc257e7, 0x17e198e0) + 0 + + + (0x240f1aee, 0x1385b3f7) + 5 + + + + (0x1b32c44c, 0x1905e0e9) + 297 + + + (0x358ae8b5, 0x0f8bacd1) + 672 + + + (0x3f0a3b27, 0x570913d2) + 386 + + + (0x6267b5c5, 0x676e3e42) + 702 + + + + + (0x65baca23, 0x1e16077b) + + (0x08185827, 0x2b518b10) + 1 + + + (0x4ace51e8, 0x2aa6d781) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 48 + + + (0x358ae8b5, 0x0f8bacd1) + 599 + + + (0x3f0a3b27, 0x570913d2) + 248 + + + (0x6267b5c5, 0x676e3e42) + 1079 + + + + + (0x69e3ec6a, 0x567c01e4) + + (0x3bd028d3, 0x30f45685) + 0 + + + (0x2d571917, 0x6888058a) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 297 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 386 + + + (0x6267b5c5, 0x676e3e42) + 520 + + + + + (0x6fcbfa6d, 0x598182ab) + + (0x08185827, 0x2b518b10) + 0 + + + (0x4ace51e8, 0x2aa6d781) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 48 + + + (0x358ae8b5, 0x0f8bacd1) + 584 + + + (0x3f0a3b27, 0x570913d2) + 248 + + + (0x6267b5c5, 0x676e3e42) + 1064 + + + + + (0x70ed4ea9, 0x0dca5e71) + + (0x3bd028d3, 0x30f45685) + 0 + + + (0x2d571917, 0x6888058a) + 3 + + + + (0x1b32c44c, 0x1905e0e9) + 297 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 386 + + + (0x6267b5c5, 0x676e3e42) + 550 + + + + + (0x77978a25, 0x17b8a931) + + (0x7bc257e7, 0x17e198e0) + 0 + + + (0x240f1aee, 0x1385b3f7) + 3 + + + + (0x1b32c44c, 0x1905e0e9) + 297 + + + (0x358ae8b5, 0x0f8bacd1) + 672 + + + (0x3f0a3b27, 0x570913d2) + 386 + + + (0x6267b5c5, 0x676e3e42) + 672 + + + + + (0x7ef1afca, 0x43981554) + + (0x08185827, 0x2b518b10) + 0 + + + (0x3bd028d3, 0x30f45685) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 48 + + + (0x358ae8b5, 0x0f8bacd1) + 584 + + + (0x3f0a3b27, 0x570913d2) + 248 + + + (0x6267b5c5, 0x676e3e42) + 544 + + + + + + + (0x0716e820, 0x5cffd019) + <big><b>External Stimulator</b></big> + +This SSVEP scenario needs to run along with +an external application. The application is run +automatically after the start of the scenario. + +The stimulator accepts two keyboard commands: + +Pressing <b>&lt;Space&gt;</b> will send a start +stimulation to the scenario and the experiment will +begin. + +Pressing <b>&lt;Escape&gt;</b> will quit the +stimulator and stop the scenario. + + + (0x473d9a43, 0x97fc0a97) + 1168 + + + (0x7234b86b, 0x2b8651a5) + -304 + + + + + (0x07a7852d, 0x7630c95f) + <b>Connection to the external application</b> + +The external stimulator is controlled through VRPN +to display the configured sequence of targets at +desired moments. + + + (0x473d9a43, 0x97fc0a97) + 592 + + + (0x7234b86b, 0x2b8651a5) + 176 + + + + + (0x0c19ff72, 0x2875ade7) + <b>Connection to the external application</b> + +This box receives commands from the external +stimulator application through the VRPN +communication protocol. + + + + (0x473d9a43, 0x97fc0a97) + 640 + + + (0x7234b86b, 0x2b8651a5) + -144 + + + + + (0x41145f11, 0x12f42fbe) + <big><b>SSVEP Training Controller</b></big> + +You can configure the SSVEP training through this box. This box also +configures the next <i>Classifier Training</i> scenario, so it is +<u>imperative</u> to <span color="red">run this scenario every time you +change settings in the training protocol</span>. For more detail, +please read the SSVEP Scenario documentation. + +<b>Goal Sequence</b> A sequence of space-separated numbers. Each number +represents a flickering object to be marked as a target. The number 0 +represents the <i>No target</i> as in staring to a blank space. Other +numbers represent indexes of the previously defined frequencies. + +<b>Stimulation duration</b> The duration (in seconds) of the sequence +during which the targets are flickering. + +<b>Break duration</b> Duration (in seconds) of a break, i.e.: the length +of the period during which the objects on screen are not flickering. + +<b>Flickering delay</b> The delay (in seconds) between the moment when the +arrow marking the target to be looked at by the subject appears and the +beginning of the flickering sequence. + +<b>Training Target size</b> The size of a stimulating object on screen. +The size is given as a proportion of the size of the window. Thus an +object of size 0.5;0.5 would have dimensions of length equal to the half +of the size of the shortest dimension of the window. + +<small>Example of a value for this setting : <b>0.5;0.5</b></small> + +<b>Training Targets' positions</b> Positions of the targets on screen. +There are N+1 targets on screen, where N is the number of stimulated +frequencies. The first targets corresponds to the target number 0 which is +not flickering at all. The values are given as relative positions to the +screen. 0.0;0.0 represents the middle, 1.0;1.0 the top-right corner and +-1.0;-1.0 the bottom-left corner. + +<small>Example of a value for this setting : +<b>(0.0;0.0);(0.0;0.5);(-0.5;0.0);(0.5;0.0)</b></small> + + + + + (0x473d9a43, 0x97fc0a97) + 112 + + + (0x7234b86b, 0x2b8651a5) + 128 + + + + + (0x5347b592, 0x23e65626) + <big><b>Scenario description</b></big> + +This scenario is used for acquisition of the training data necessary to +train the SSVEP classifiers. In order to run correctly it has to be +configured by the <b>SSVEP Training Controller</b> box. + +For the detailed description and experimental protocol, please refer to +the SSVEP Scenario documentation on the OpenViBE website. + +<small><i><b>note:</b> the recorded files go to the +folder where the scenario xml is located +(<span color="darkblue">${Player_ScenarioDirectory}/</span>).</i></small> + + + (0x473d9a43, 0x97fc0a97) + 688 + + + (0x7234b86b, 0x2b8651a5) + -336 + + + + + (0x613d7831, 0x6fc5ec4e) + <b><span color="#2060ff">Configurable box</span></b> + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 592 + + + (0x7234b86b, 0x2b8651a5) + 16 + + + + + (0x68162d52, 0x34c673a0) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 688 + + + (0x7234b86b, 0x2b8651a5) + -480 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":400,"identifier":"(0x3c7b1c2d, 0x235a359e)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":376},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x7cc860bc, 0x265f0897)","index":0,"name":"Default tab","parentIdentifier":"(0x3c7b1c2d, 0x235a359e)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x79d63782, 0x7f4c16fe)","index":0,"name":"Empty","parentIdentifier":"(0x7cc860bc, 0x265f0897)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-3-CSP-training.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-3-CSP-training.xml new file mode 100644 index 0000000..5d2dd80 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-3-CSP-training.xml @@ -0,0 +1,3088 @@ + + 1 + OpenVIBE + 0.0.2 + + + (0x07586dc6, 0x2d35f843) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -592 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 1616 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 59 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0a583ddc, 0x6b5aaf66) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 0 1 2 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 2304 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x0f638f53, 0x6be6c99d) + FlipSwitch + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/classifier-training-flipswitch.lua + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 1600 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 81 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x1aa60f45, 0x30bb776e) + CSP Spatial Filter Trainer + (0x51db0d64, 0x2109714e) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Signal condition 1 + + + (0x5ba36127, 0x195feae1) + Signal condition 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_GDF_End_Of_Session + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Spatial filter configuration + + ${Player_ScenarioDirectory}/classifiers/csp-3.cfg + false + + + (0x007deef9, 0x2f3e95c6) + Filter dimension + 2 + 2 + false + + + (0x2cdb2f0b, 0x12f231ea) + Save as box config + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 2208 + + + (0x4e7b798a, 0x183beafb) + (0x4b49a133, 0x42f38d94) + + + (0xad100179, 0xa3c984ab) + 171 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x273dbd62, 0x40416d2e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 1008 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 59 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x28f1b804, 0x089569e0) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 2048 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 145 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2ece1fdd, 0x7ec303e8) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 2352 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 145 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x324bd8c9, 0x13b684d6) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 1504 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2.cfg + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x3efc0415, 0x46650f2d) + Frequency 3 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 2096 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3.cfg + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x45f96cf7, 0x16a31a72) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -672 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 1616 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 153 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x481f3a2a, 0x5d293adb) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 1760 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 145 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x49c551a9, 0x4e5f9369) + CSP Spatial Filter Trainer + (0x51db0d64, 0x2109714e) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Signal condition 1 + + + (0x5ba36127, 0x195feae1) + Signal condition 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_GDF_End_Of_Session + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Spatial filter configuration + + ${Player_ScenarioDirectory}/classifiers/csp-2.cfg + false + + + (0x007deef9, 0x2f3e95c6) + Filter dimension + 2 + 2 + false + + + (0x2cdb2f0b, 0x12f231ea) + Save as box config + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 1600 + + + (0x4e7b798a, 0x183beafb) + (0x4b49a133, 0x42f38d94) + + + (0xad100179, 0xa3c984ab) + 171 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x49f1332b, 0x606e8c76) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 0 2 3 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 1120 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x4c772b1e, 0x48bbc077) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 1456 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 145 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x4db285e7, 0x785a36d2) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 145 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x4fb1cb31, 0x21fe7d0c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1.cfg + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x505c430f, 0x7b8dc9fb) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 145 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x50c3b2f7, 0x77f1f351) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 1616 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 59 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x515fad9c, 0x7d6da808) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 1600 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5c72454b, 0x57bfd7e2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 2 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 0 1 3 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 1712 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x5df16faf, 0x5a0a090f) + CSP Spatial Filter Trainer + (0x51db0d64, 0x2109714e) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Signal condition 1 + + + (0x5ba36127, 0x195feae1) + Signal condition 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_GDF_End_Of_Session + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Spatial filter configuration + + ${Player_ScenarioDirectory}/classifiers/csp-1.cfg + false + + + (0x007deef9, 0x2f3e95c6) + Filter dimension + 2 + 2 + false + + + (0x2cdb2f0b, 0x12f231ea) + Save as box config + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 1008 + + + (0x4e7b798a, 0x183beafb) + (0x4b49a133, 0x42f38d94) + + + (0xad100179, 0xa3c984ab) + 171 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x78b0d965, 0x3bb286ae) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 2208 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 59 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x0574a2c4, 0x411da70d) + + (0x07586dc6, 0x2d35f843) + 1 + + + (0x50c3b2f7, 0x77f1f351) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -569 + + + (0x358ae8b5, 0x0f8bacd1) + 1623 + + + (0x3f0a3b27, 0x570913d2) + -357 + + + (0x6267b5c5, 0x676e3e42) + 1623 + + + + + (0x0908d4b2, 0x49fd4833) + + (0x273dbd62, 0x40416d2e) + 1 + + + (0x49f1332b, 0x606e8c76) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -313 + + + (0x358ae8b5, 0x0f8bacd1) + 1015 + + + (0x3f0a3b27, 0x570913d2) + -266 + + + (0x6267b5c5, 0x676e3e42) + 1120 + + + + + (0x0b1aef3f, 0x2451948e) + + (0x4c772b1e, 0x48bbc077) + 0 + + + (0x49c551a9, 0x4e5f9369) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -137 + + + (0x358ae8b5, 0x0f8bacd1) + 1448 + + + (0x3f0a3b27, 0x570913d2) + -64 + + + (0x6267b5c5, 0x676e3e42) + 1600 + + + + + (0x0c52ae12, 0x31692e59) + + (0x5df16faf, 0x5a0a090f) + 0 + + + (0x0f638f53, 0x6be6c99d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -14 + + + (0x358ae8b5, 0x0f8bacd1) + 1008 + + + (0x3f0a3b27, 0x570913d2) + 54 + + + (0x6267b5c5, 0x676e3e42) + 1585 + + + + + (0x0f1e9dd8, 0x32d8c357) + + (0x07586dc6, 0x2d35f843) + 0 + + + (0x78b0d965, 0x3bb286ae) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -569 + + + (0x358ae8b5, 0x0f8bacd1) + 1608 + + + (0x3f0a3b27, 0x570913d2) + -325 + + + (0x6267b5c5, 0x676e3e42) + 2200 + + + + + (0x1010eae1, 0x6f7ce4af) + + (0x50c3b2f7, 0x77f1f351) + 1 + + + (0x49c551a9, 0x4e5f9369) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -313 + + + (0x358ae8b5, 0x0f8bacd1) + 1623 + + + (0x3f0a3b27, 0x570913d2) + -64 + + + (0x6267b5c5, 0x676e3e42) + 1585 + + + + + (0x13167126, 0x5ed67e78) + + (0x0a583ddc, 0x6b5aaf66) + 0 + + + (0x28f1b804, 0x089569e0) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -212 + + + (0x358ae8b5, 0x0f8bacd1) + 2296 + + + (0x3f0a3b27, 0x570913d2) + -181 + + + (0x6267b5c5, 0x676e3e42) + 2055 + + + + + (0x16a2f072, 0x491b1ede) + + (0x481f3a2a, 0x5d293adb) + 0 + + + (0x49c551a9, 0x4e5f9369) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -137 + + + (0x358ae8b5, 0x0f8bacd1) + 1752 + + + (0x3f0a3b27, 0x570913d2) + -64 + + + (0x6267b5c5, 0x676e3e42) + 1615 + + + + + (0x172ea261, 0x203b2b62) + + (0x0a583ddc, 0x6b5aaf66) + 1 + + + (0x2ece1fdd, 0x7ec303e8) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -212 + + + (0x358ae8b5, 0x0f8bacd1) + 2311 + + + (0x3f0a3b27, 0x570913d2) + -181 + + + (0x6267b5c5, 0x676e3e42) + 2359 + + + + + (0x1a1aef70, 0x7e7a0bf2) + + (0x1aa60f45, 0x30bb776e) + 0 + + + (0x0f638f53, 0x6be6c99d) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -14 + + + (0x358ae8b5, 0x0f8bacd1) + 2208 + + + (0x3f0a3b27, 0x570913d2) + 54 + + + (0x6267b5c5, 0x676e3e42) + 1615 + + + + + (0x1e1d3712, 0x00d81753) + + (0x78b0d965, 0x3bb286ae) + 0 + + + (0x3efc0415, 0x46650f2d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -281 + + + (0x358ae8b5, 0x0f8bacd1) + 2200 + + + (0x3f0a3b27, 0x570913d2) + -261 + + + (0x6267b5c5, 0x676e3e42) + 2096 + + + + + (0x1f0b6da1, 0x7ac402a6) + + (0x324bd8c9, 0x13b684d6) + 0 + + + (0x4c772b1e, 0x48bbc077) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -217 + + + (0x358ae8b5, 0x0f8bacd1) + 1504 + + + (0x3f0a3b27, 0x570913d2) + -181 + + + (0x6267b5c5, 0x676e3e42) + 1448 + + + + + (0x241001e7, 0x2cec9f3b) + + (0x2ece1fdd, 0x7ec303e8) + 0 + + + (0x1aa60f45, 0x30bb776e) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -137 + + + (0x358ae8b5, 0x0f8bacd1) + 2344 + + + (0x3f0a3b27, 0x570913d2) + -48 + + + (0x6267b5c5, 0x676e3e42) + 2223 + + + + + (0x289d2ac8, 0x3e446981) + + (0x273dbd62, 0x40416d2e) + 1 + + + (0x5df16faf, 0x5a0a090f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -313 + + + (0x358ae8b5, 0x0f8bacd1) + 1015 + + + (0x3f0a3b27, 0x570913d2) + -48 + + + (0x6267b5c5, 0x676e3e42) + 993 + + + + + (0x2c4693c6, 0x27260bc5) + + (0x4fb1cb31, 0x21fe7d0c) + 0 + + + (0x505c430f, 0x7b8dc9fb) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -217 + + + (0x358ae8b5, 0x0f8bacd1) + 912 + + + (0x3f0a3b27, 0x570913d2) + -181 + + + (0x6267b5c5, 0x676e3e42) + 1160 + + + + + (0x3016791a, 0x32cd4f9e) + + (0x0f638f53, 0x6be6c99d) + 0 + + + (0x515fad9c, 0x7d6da808) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 108 + + + (0x358ae8b5, 0x0f8bacd1) + 1600 + + + (0x3f0a3b27, 0x570913d2) + 160 + + + (0x6267b5c5, 0x676e3e42) + 1600 + + + + + (0x31ff0934, 0x45323d72) + + (0x3efc0415, 0x46650f2d) + 0 + + + (0x28f1b804, 0x089569e0) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -217 + + + (0x358ae8b5, 0x0f8bacd1) + 2096 + + + (0x3f0a3b27, 0x570913d2) + -181 + + + (0x6267b5c5, 0x676e3e42) + 2040 + + + + + (0x321bcc4b, 0x269e244e) + + (0x45f96cf7, 0x16a31a72) + 1 + + + (0x07586dc6, 0x2d35f843) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -649 + + + (0x358ae8b5, 0x0f8bacd1) + 1608 + + + (0x3f0a3b27, 0x570913d2) + -613 + + + (0x6267b5c5, 0x676e3e42) + 1608 + + + + + (0x35a3833a, 0x55f04ec4) + + (0x50c3b2f7, 0x77f1f351) + 1 + + + (0x5c72454b, 0x57bfd7e2) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -313 + + + (0x358ae8b5, 0x0f8bacd1) + 1623 + + + (0x3f0a3b27, 0x570913d2) + -266 + + + (0x6267b5c5, 0x676e3e42) + 1712 + + + + + (0x3adeaa5a, 0x796dd071) + + (0x4fb1cb31, 0x21fe7d0c) + 0 + + + (0x4db285e7, 0x785a36d2) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -217 + + + (0x358ae8b5, 0x0f8bacd1) + 912 + + + (0x3f0a3b27, 0x570913d2) + -181 + + + (0x6267b5c5, 0x676e3e42) + 856 + + + + + (0x3da4518e, 0x5a74541b) + + (0x324bd8c9, 0x13b684d6) + 0 + + + (0x481f3a2a, 0x5d293adb) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -217 + + + (0x358ae8b5, 0x0f8bacd1) + 1504 + + + (0x3f0a3b27, 0x570913d2) + -181 + + + (0x6267b5c5, 0x676e3e42) + 1752 + + + + + (0x4552f1fe, 0x0ad701f2) + + (0x4db285e7, 0x785a36d2) + 0 + + + (0x5df16faf, 0x5a0a090f) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -137 + + + (0x358ae8b5, 0x0f8bacd1) + 856 + + + (0x3f0a3b27, 0x570913d2) + -48 + + + (0x6267b5c5, 0x676e3e42) + 1008 + + + + + (0x49aa3a65, 0x319c6d2a) + + (0x50c3b2f7, 0x77f1f351) + 0 + + + (0x324bd8c9, 0x13b684d6) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -313 + + + (0x358ae8b5, 0x0f8bacd1) + 1608 + + + (0x3f0a3b27, 0x570913d2) + -261 + + + (0x6267b5c5, 0x676e3e42) + 1504 + + + + + (0x4ac07f9d, 0x75cfdb2b) + + (0x07586dc6, 0x2d35f843) + 0 + + + (0x273dbd62, 0x40416d2e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -569 + + + (0x358ae8b5, 0x0f8bacd1) + 1608 + + + (0x3f0a3b27, 0x570913d2) + -357 + + + (0x6267b5c5, 0x676e3e42) + 1000 + + + + + (0x4ad55f84, 0x3c577ea8) + + (0x5c72454b, 0x57bfd7e2) + 0 + + + (0x4c772b1e, 0x48bbc077) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -212 + + + (0x358ae8b5, 0x0f8bacd1) + 1704 + + + (0x3f0a3b27, 0x570913d2) + -181 + + + (0x6267b5c5, 0x676e3e42) + 1463 + + + + + (0x4efb2f8b, 0x3248a505) + + (0x505c430f, 0x7b8dc9fb) + 0 + + + (0x5df16faf, 0x5a0a090f) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -137 + + + (0x358ae8b5, 0x0f8bacd1) + 1160 + + + (0x3f0a3b27, 0x570913d2) + -48 + + + (0x6267b5c5, 0x676e3e42) + 1023 + + + + + (0x5283d065, 0x0095dadd) + + (0x273dbd62, 0x40416d2e) + 0 + + + (0x4fb1cb31, 0x21fe7d0c) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -313 + + + (0x358ae8b5, 0x0f8bacd1) + 1000 + + + (0x3f0a3b27, 0x570913d2) + -261 + + + (0x6267b5c5, 0x676e3e42) + 912 + + + + + (0x56c46d89, 0x63c529d7) + + (0x07586dc6, 0x2d35f843) + 1 + + + (0x78b0d965, 0x3bb286ae) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -569 + + + (0x358ae8b5, 0x0f8bacd1) + 1623 + + + (0x3f0a3b27, 0x570913d2) + -325 + + + (0x6267b5c5, 0x676e3e42) + 2215 + + + + + (0x5c08e214, 0x7bf6132f) + + (0x78b0d965, 0x3bb286ae) + 1 + + + (0x1aa60f45, 0x30bb776e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -281 + + + (0x358ae8b5, 0x0f8bacd1) + 2215 + + + (0x3f0a3b27, 0x570913d2) + -48 + + + (0x6267b5c5, 0x676e3e42) + 2193 + + + + + (0x5c85d8f5, 0x6629d1ed) + + (0x49c551a9, 0x4e5f9369) + 0 + + + (0x0f638f53, 0x6be6c99d) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -30 + + + (0x358ae8b5, 0x0f8bacd1) + 1600 + + + (0x3f0a3b27, 0x570913d2) + 54 + + + (0x6267b5c5, 0x676e3e42) + 1600 + + + + + (0x5e892c7b, 0x7ad6f8b9) + + (0x5c72454b, 0x57bfd7e2) + 1 + + + (0x481f3a2a, 0x5d293adb) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -212 + + + (0x358ae8b5, 0x0f8bacd1) + 1719 + + + (0x3f0a3b27, 0x570913d2) + -181 + + + (0x6267b5c5, 0x676e3e42) + 1767 + + + + + (0x5fbb3d04, 0x75696b19) + + (0x07586dc6, 0x2d35f843) + 1 + + + (0x273dbd62, 0x40416d2e) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -569 + + + (0x358ae8b5, 0x0f8bacd1) + 1623 + + + (0x3f0a3b27, 0x570913d2) + -357 + + + (0x6267b5c5, 0x676e3e42) + 1015 + + + + + (0x60a91335, 0x4c4673ad) + + (0x49f1332b, 0x606e8c76) + 1 + + + (0x505c430f, 0x7b8dc9fb) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -212 + + + (0x358ae8b5, 0x0f8bacd1) + 1127 + + + (0x3f0a3b27, 0x570913d2) + -181 + + + (0x6267b5c5, 0x676e3e42) + 1175 + + + + + (0x6296d9d2, 0x021184dc) + + (0x45f96cf7, 0x16a31a72) + 2 + + + (0x07586dc6, 0x2d35f843) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -649 + + + (0x358ae8b5, 0x0f8bacd1) + 1623 + + + (0x3f0a3b27, 0x570913d2) + -613 + + + (0x6267b5c5, 0x676e3e42) + 1623 + + + + + (0x67d71b7f, 0x0da94ead) + + (0x28f1b804, 0x089569e0) + 0 + + + (0x1aa60f45, 0x30bb776e) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -137 + + + (0x358ae8b5, 0x0f8bacd1) + 2040 + + + (0x3f0a3b27, 0x570913d2) + -48 + + + (0x6267b5c5, 0x676e3e42) + 2208 + + + + + (0x704063d0, 0x66417c57) + + (0x3efc0415, 0x46650f2d) + 0 + + + (0x2ece1fdd, 0x7ec303e8) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -217 + + + (0x358ae8b5, 0x0f8bacd1) + 2096 + + + (0x3f0a3b27, 0x570913d2) + -181 + + + (0x6267b5c5, 0x676e3e42) + 2344 + + + + + (0x780b00c7, 0x0e7d7777) + + (0x78b0d965, 0x3bb286ae) + 1 + + + (0x0a583ddc, 0x6b5aaf66) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -281 + + + (0x358ae8b5, 0x0f8bacd1) + 2215 + + + (0x3f0a3b27, 0x570913d2) + -266 + + + (0x6267b5c5, 0x676e3e42) + 2304 + + + + + (0x7ab91715, 0x21c5374a) + + (0x07586dc6, 0x2d35f843) + 0 + + + (0x50c3b2f7, 0x77f1f351) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -569 + + + (0x358ae8b5, 0x0f8bacd1) + 1608 + + + (0x3f0a3b27, 0x570913d2) + -357 + + + (0x6267b5c5, 0x676e3e42) + 1608 + + + + + (0x7e45bf59, 0x5dc370ca) + + (0x49f1332b, 0x606e8c76) + 0 + + + (0x4db285e7, 0x785a36d2) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -212 + + + (0x358ae8b5, 0x0f8bacd1) + 1112 + + + (0x3f0a3b27, 0x570913d2) + -181 + + + (0x6267b5c5, 0x676e3e42) + 871 + + + + + + + (0x00bcf70b, 0x626ab066) + Signal processing for the <b>third</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 2192 + + + (0x7234b86b, 0x2b8651a5) + -416 + + + + + (0x0d592c71, 0x052f2d12) + Signal processing for the <b>first</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 1008 + + + (0x7234b86b, 0x2b8651a5) + -416 + + + + + (0x12a39e14, 0x18071dd7) + <b><span color="red">Important :</span></b> Do not forget to +change the settings in the <i>Generic stream reader</i> to load +the file you recorded in the previous step. By default the +scenario uses example data provided with OpenViBE. + + + (0x473d9a43, 0x97fc0a97) + 1328 + + + (0x7234b86b, 0x2b8651a5) + -656 + + + + + (0x1a4b763b, 0x5db56f81) + Signal processing for the <b>second</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 1584 + + + (0x7234b86b, 0x2b8651a5) + -416 + + + + + (0x4a57db8e, 0x7e6ed942) + <big><b>Scenario description</b></big> + +This scenario is used for training of the Common Spatial Pattern filters. +These enable you to use any set of electrodes and will automatically +select the best combination of them for you. + +By default the dimension of the CSP filters is 2. If you use many +electrodes you may want to raise this value to get even better precision. + +For the detailed description and experimental protocol, please refer to +the SSVEP Scenario documentation on the OpenViBE website. + +<small><i><b>note:</b> the classifiers go to the +folder where the scenario xml is located +(<span color="darkblue">${Player_ScenarioDirectory}/classifiers/</span>).</i></small> + + + (0x473d9a43, 0x97fc0a97) + 1632 + + + (0x7234b86b, 0x2b8651a5) + -848 + + + + + (0x64b1a55e, 0x024aa6e9) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 1632 + + + (0x7234b86b, 0x2b8651a5) + -1024 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":400,"identifier":"(0x18b8bd9a, 0x076f0632)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":400},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x067ca7b7, 0x753e968f)","index":0,"name":"Default tab","parentIdentifier":"(0x18b8bd9a, 0x076f0632)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x6d98d81e, 0x5900781c)","index":0,"name":"Empty","parentIdentifier":"(0x067ca7b7, 0x753e968f)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-4-classifier-training.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-4-classifier-training.xml new file mode 100644 index 0000000..8e0334c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-4-classifier-training.xml @@ -0,0 +1,6521 @@ + + 1 + OpenViBE + 1.1.0+git + + + (0x00c60f3a, 0x0b80f2a4) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 2 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 0 1 3 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1712 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 123 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x034a7fd6, 0x78939ea5) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1504 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2.cfg + + + (0xad100179, 0xa3c984ab) + 93 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x03918ae2, 0x29c7b0cc) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1760 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 161 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x083672cc, 0x0afdec3e) + FlipSwitch + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/classifier-training-flipswitch.lua + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1600 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 90 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x0c3befdb, 0x2dcc20da) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 161 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0c9ece4e, 0x364bb09f) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 2352 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0f2c356f, 0x2bacc44f) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 1600 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x14e5ab41, 0x22f131fe) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x169db01e, 0x5dcb3cc2) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -704 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1616 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 159 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x194a6212, 0x780aac12) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x198fb25c, 0x3954e099) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1b9f6423, 0x00cd22fa) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1456 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 161 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x1e2714d3, 0x56acad5c) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1456 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x24b2a9db, 0x10a441e4) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1456 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x25837bff, 0x10943562) + Frequency 3 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 2096 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3.cfg + + + (0xad100179, 0xa3c984ab) + 93 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x26262cb6, 0x59d0b5d9) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1616 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 69 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2901a190, 0x419a5f65) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2e2ef1c6, 0x3ff7caee) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x3229072d, 0x50802b45) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1456 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3358fc9e, 0x58e084d2) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -528 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-1.cfg + + + (0xad100179, 0xa3c984ab) + 95 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x34175fcc, 0x33bdd373) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1760 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x344b467d, 0x3b0bd7f8) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x345dd27d, 0x13121bfe) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 2048 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3963ec97, 0x690016c6) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 2352 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x3a97f4c0, 0x507b1727) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/classifiers/classifier-1.cfg + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320.000000 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1024.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xad100179, 0xa3c984ab) + 122 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a97f4c0, 0x507b1728) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/classifiers/classifier-2.cfg + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320.000000 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1600.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xad100179, 0xa3c984ab) + 122 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a97f4c0, 0x507b1729) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/classifiers/classifier-3.cfg + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320.000000 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 2192.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xad100179, 0xa3c984ab) + 122 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x410b4bc7, 0x628c8235) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1008 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 69 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x431c9ce6, 0x134fb45e) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 2352 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x43838fcb, 0x4a100634) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x45584a59, 0x3c212c1e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 2208 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 69 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x47e02329, 0x63b90226) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 2048 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4ca494f5, 0x0062d0ee) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1456 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4d1b5207, 0x778f8de5) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 0 2 3 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1120 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 123 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x4d566c0e, 0x24a524f0) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 2352 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f25eb7b, 0x483ea7e0) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1760 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4fcc2492, 0x182bb5e8) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1760 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x52b92a61, 0x141e747b) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 2048 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x564c9d08, 0x4ec31a8f) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 161 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x59d3e156, 0x496a0c80) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 2048 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x623bbc1a, 0x5cac4f44) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -512 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1568 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-2.cfg + + + (0xad100179, 0xa3c984ab) + 95 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6414561b, 0x0f5ec975) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -528 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1920 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-3.cfg + + + (0xad100179, 0xa3c984ab) + 95 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x69cd39be, 0x273fd7fc) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x6c875e73, 0x38395bff) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 2048 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 161 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6e5f7222, 0x3cb22a2b) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 0 1 2 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 2304 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 123 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x70475271, 0x65bdf5a4) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x73fe0302, 0x1e18725f) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 2048 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7516d0ce, 0x550350bb) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 2352 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x751cbf17, 0x42fce8ab) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1760 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7759dfd1, 0x783ca661) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1.cfg + + + (0xad100179, 0xa3c984ab) + 93 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x78d011a0, 0x40873027) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1760 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x7900cd7b, 0x6decd0b9) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 2352 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 161 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x7bd1b6ce, 0x7d54dd43) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -624 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1616 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 69 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x7cc1e7d6, 0x037131f9) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1456 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7d7dd288, 0x796c21ab) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x0037efb6, 0x100930b0) + + (0x6e5f7222, 0x3cb22a2b) + 0 + + + (0x6c875e73, 0x38395bff) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -201 + + + (0x358ae8b5, 0x0f8bacd1) + 2296 + + + (0x3f0a3b27, 0x570913d2) + -189 + + + (0x6267b5c5, 0x676e3e42) + 2055 + + + + + (0x00f7741b, 0x722e47f8) + + (0x751cbf17, 0x42fce8ab) + 0 + + + (0x4fcc2492, 0x182bb5e8) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -57 + + + (0x358ae8b5, 0x0f8bacd1) + 1760 + + + (0x3f0a3b27, 0x570913d2) + -53 + + + (0x6267b5c5, 0x676e3e42) + 1760 + + + + + (0x0275b3b1, 0x68214fe6) + + (0x7d7dd288, 0x796c21ab) + 0 + + + (0x3a97f4c0, 0x507b1727) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 286 + + + (0x358ae8b5, 0x0f8bacd1) + 1168 + + + (0x3f0a3b27, 0x570913d2) + 291 + + + (0x6267b5c5, 0x676e3e42) + 1039 + + + + + (0x02761aae, 0x40ed57b9) + + (0x43838fcb, 0x4a100634) + 0 + + + (0x194a6212, 0x780aac12) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -57 + + + (0x358ae8b5, 0x0f8bacd1) + 1168 + + + (0x3f0a3b27, 0x570913d2) + -53 + + + (0x6267b5c5, 0x676e3e42) + 1168 + + + + + (0x02939d42, 0x2904000f) + + (0x6e5f7222, 0x3cb22a2b) + 1 + + + (0x7900cd7b, 0x6decd0b9) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -201 + + + (0x358ae8b5, 0x0f8bacd1) + 2311 + + + (0x3f0a3b27, 0x570913d2) + -189 + + + (0x6267b5c5, 0x676e3e42) + 2359 + + + + + (0x02fd9c51, 0x0954cbef) + + (0x7759dfd1, 0x783ca661) + 0 + + + (0x0c3befdb, 0x2dcc20da) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -210 + + + (0x358ae8b5, 0x0f8bacd1) + 912 + + + (0x3f0a3b27, 0x570913d2) + -189 + + + (0x6267b5c5, 0x676e3e42) + 856 + + + + + (0x0552f757, 0x1e03b83b) + + (0x25837bff, 0x10943562) + 0 + + + (0x7900cd7b, 0x6decd0b9) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -210 + + + (0x358ae8b5, 0x0f8bacd1) + 2096 + + + (0x3f0a3b27, 0x570913d2) + -189 + + + (0x6267b5c5, 0x676e3e42) + 2344 + + + + + (0x064a0f54, 0x582606c9) + + (0x4d1b5207, 0x778f8de5) + 0 + + + (0x0c3befdb, 0x2dcc20da) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -201 + + + (0x358ae8b5, 0x0f8bacd1) + 1112 + + + (0x3f0a3b27, 0x570913d2) + -189 + + + (0x6267b5c5, 0x676e3e42) + 871 + + + + + (0x0a04f129, 0x2f626a90) + + (0x78d011a0, 0x40873027) + 0 + + + (0x34175fcc, 0x33bdd373) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 167 + + + (0x358ae8b5, 0x0f8bacd1) + 1760 + + + (0x3f0a3b27, 0x570913d2) + 227 + + + (0x6267b5c5, 0x676e3e42) + 1760 + + + + + (0x0a16b9dd, 0x1eed8344) + + (0x52b92a61, 0x141e747b) + 0 + + + (0x59d3e156, 0x496a0c80) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 23 + + + (0x358ae8b5, 0x0f8bacd1) + 2048 + + + (0x3f0a3b27, 0x570913d2) + 35 + + + (0x6267b5c5, 0x676e3e42) + 2048 + + + + + (0x0ad48a4f, 0x5121c89e) + + (0x3358fc9e, 0x58e084d2) + 0 + + + (0x410b4bc7, 0x628c8235) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -498 + + + (0x358ae8b5, 0x0f8bacd1) + 1264 + + + (0x3f0a3b27, 0x570913d2) + -365 + + + (0x6267b5c5, 0x676e3e42) + 1000 + + + + + (0x0d75936d, 0x2fe0f4ee) + + (0x0c3befdb, 0x2dcc20da) + 0 + + + (0x70475271, 0x65bdf5a4) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -130 + + + (0x358ae8b5, 0x0f8bacd1) + 856 + + + (0x3f0a3b27, 0x570913d2) + -133 + + + (0x6267b5c5, 0x676e3e42) + 864 + + + + + (0x0ec8e841, 0x7e3534b4) + + (0x169db01e, 0x5dcb3cc2) + 2 + + + (0x7bd1b6ce, 0x7d54dd43) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -674 + + + (0x358ae8b5, 0x0f8bacd1) + 1623 + + + (0x3f0a3b27, 0x570913d2) + -653 + + + (0x6267b5c5, 0x676e3e42) + 1623 + + + + + (0x132f2deb, 0x63cb18bc) + + (0x2e2ef1c6, 0x3ff7caee) + 0 + + + (0x14e5ab41, 0x22f131fe) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 94 + + + (0x358ae8b5, 0x0f8bacd1) + 864 + + + (0x3f0a3b27, 0x570913d2) + 91 + + + (0x6267b5c5, 0x676e3e42) + 864 + + + + + (0x14e8921a, 0x5b721fc1) + + (0x3229072d, 0x50802b45) + 0 + + + (0x1e2714d3, 0x56acad5c) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 167 + + + (0x358ae8b5, 0x0f8bacd1) + 1456 + + + (0x3f0a3b27, 0x570913d2) + 227 + + + (0x6267b5c5, 0x676e3e42) + 1456 + + + + + (0x15db98b4, 0x14ba56aa) + + (0x7759dfd1, 0x783ca661) + 0 + + + (0x564c9d08, 0x4ec31a8f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -210 + + + (0x358ae8b5, 0x0f8bacd1) + 912 + + + (0x3f0a3b27, 0x570913d2) + -189 + + + (0x6267b5c5, 0x676e3e42) + 1160 + + + + + (0x1ed5dc96, 0x73567f81) + + (0x34175fcc, 0x33bdd373) + 0 + + + (0x3a97f4c0, 0x507b1728) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 286 + + + (0x358ae8b5, 0x0f8bacd1) + 1760 + + + (0x3f0a3b27, 0x570913d2) + 291 + + + (0x6267b5c5, 0x676e3e42) + 1615 + + + + + (0x1f622be3, 0x32187c69) + + (0x45584a59, 0x3c212c1e) + 1 + + + (0x3a97f4c0, 0x507b1729) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -274 + + + (0x358ae8b5, 0x0f8bacd1) + 2215 + + + (0x3f0a3b27, 0x570913d2) + 291 + + + (0x6267b5c5, 0x676e3e42) + 2177 + + + + + (0x203fd2ff, 0x25054f1f) + + (0x26262cb6, 0x59d0b5d9) + 1 + + + (0x00c60f3a, 0x0b80f2a4) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -306 + + + (0x358ae8b5, 0x0f8bacd1) + 1623 + + + (0x3f0a3b27, 0x570913d2) + -277 + + + (0x6267b5c5, 0x676e3e42) + 1712 + + + + + (0x20827149, 0x0a01204e) + + (0x169db01e, 0x5dcb3cc2) + 1 + + + (0x7bd1b6ce, 0x7d54dd43) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -674 + + + (0x358ae8b5, 0x0f8bacd1) + 1608 + + + (0x3f0a3b27, 0x570913d2) + -653 + + + (0x6267b5c5, 0x676e3e42) + 1608 + + + + + (0x2309043e, 0x148e6d69) + + (0x1b9f6423, 0x00cd22fa) + 0 + + + (0x24b2a9db, 0x10a441e4) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -130 + + + (0x358ae8b5, 0x0f8bacd1) + 1448 + + + (0x3f0a3b27, 0x570913d2) + -133 + + + (0x6267b5c5, 0x676e3e42) + 1456 + + + + + (0x23b48c89, 0x28151e92) + + (0x4d1b5207, 0x778f8de5) + 1 + + + (0x564c9d08, 0x4ec31a8f) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -201 + + + (0x358ae8b5, 0x0f8bacd1) + 1127 + + + (0x3f0a3b27, 0x570913d2) + -189 + + + (0x6267b5c5, 0x676e3e42) + 1175 + + + + + (0x2593a1cb, 0x01907abf) + + (0x083672cc, 0x0afdec3e) + 0 + + + (0x0f2c356f, 0x2bacc44f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 567 + + + (0x358ae8b5, 0x0f8bacd1) + 1600 + + + (0x3f0a3b27, 0x570913d2) + 604 + + + (0x6267b5c5, 0x676e3e42) + 1600 + + + + + (0x2804d888, 0x66a2fb3e) + + (0x7cc1e7d6, 0x037131f9) + 0 + + + (0x3229072d, 0x50802b45) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 94 + + + (0x358ae8b5, 0x0f8bacd1) + 1456 + + + (0x3f0a3b27, 0x570913d2) + 91 + + + (0x6267b5c5, 0x676e3e42) + 1456 + + + + + (0x28e0be99, 0x05c66f63) + + (0x26262cb6, 0x59d0b5d9) + 1 + + + (0x3a97f4c0, 0x507b1728) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -306 + + + (0x358ae8b5, 0x0f8bacd1) + 1623 + + + (0x3f0a3b27, 0x570913d2) + 291 + + + (0x6267b5c5, 0x676e3e42) + 1585 + + + + + (0x2f38838f, 0x0d11ba21) + + (0x3a97f4c0, 0x507b1728) + 0 + + + (0x083672cc, 0x0afdec3e) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 350 + + + (0x358ae8b5, 0x0f8bacd1) + 1600 + + + (0x3f0a3b27, 0x570913d2) + 491 + + + (0x6267b5c5, 0x676e3e42) + 1600 + + + + + (0x2f87b9e8, 0x4c883bb6) + + (0x344b467d, 0x3b0bd7f8) + 0 + + + (0x198fb25c, 0x3954e099) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 94 + + + (0x358ae8b5, 0x0f8bacd1) + 1168 + + + (0x3f0a3b27, 0x570913d2) + 91 + + + (0x6267b5c5, 0x676e3e42) + 1168 + + + + + (0x2fa42528, 0x60e4f302) + + (0x24b2a9db, 0x10a441e4) + 0 + + + (0x4ca494f5, 0x0062d0ee) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -57 + + + (0x358ae8b5, 0x0f8bacd1) + 1456 + + + (0x3f0a3b27, 0x570913d2) + -53 + + + (0x6267b5c5, 0x676e3e42) + 1456 + + + + + (0x31432c2f, 0x54af437a) + + (0x25837bff, 0x10943562) + 0 + + + (0x6c875e73, 0x38395bff) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -210 + + + (0x358ae8b5, 0x0f8bacd1) + 2096 + + + (0x3f0a3b27, 0x570913d2) + -189 + + + (0x6267b5c5, 0x676e3e42) + 2040 + + + + + (0x31b619e5, 0x25d568a1) + + (0x410b4bc7, 0x628c8235) + 1 + + + (0x4d1b5207, 0x778f8de5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -306 + + + (0x358ae8b5, 0x0f8bacd1) + 1015 + + + (0x3f0a3b27, 0x570913d2) + -277 + + + (0x6267b5c5, 0x676e3e42) + 1120 + + + + + (0x34ece158, 0x58b7f4c9) + + (0x00c60f3a, 0x0b80f2a4) + 0 + + + (0x1b9f6423, 0x00cd22fa) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -201 + + + (0x358ae8b5, 0x0f8bacd1) + 1704 + + + (0x3f0a3b27, 0x570913d2) + -189 + + + (0x6267b5c5, 0x676e3e42) + 1463 + + + + + (0x3793d670, 0x73325aeb) + + (0x1e2714d3, 0x56acad5c) + 0 + + + (0x3a97f4c0, 0x507b1728) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 286 + + + (0x358ae8b5, 0x0f8bacd1) + 1456 + + + (0x3f0a3b27, 0x570913d2) + 291 + + + (0x6267b5c5, 0x676e3e42) + 1600 + + + + + (0x39b05795, 0x7aa2044c) + + (0x26262cb6, 0x59d0b5d9) + 0 + + + (0x034a7fd6, 0x78939ea5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -306 + + + (0x358ae8b5, 0x0f8bacd1) + 1608 + + + (0x3f0a3b27, 0x570913d2) + -269 + + + (0x6267b5c5, 0x676e3e42) + 1504 + + + + + (0x3b324cc1, 0x65116ac0) + + (0x0c9ece4e, 0x364bb09f) + 0 + + + (0x431c9ce6, 0x134fb45e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 167 + + + (0x358ae8b5, 0x0f8bacd1) + 2352 + + + (0x3f0a3b27, 0x570913d2) + 227 + + + (0x6267b5c5, 0x676e3e42) + 2352 + + + + + (0x3c8af19f, 0x7640f771) + + (0x410b4bc7, 0x628c8235) + 1 + + + (0x3a97f4c0, 0x507b1727) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -306 + + + (0x358ae8b5, 0x0f8bacd1) + 1015 + + + (0x3f0a3b27, 0x570913d2) + 291 + + + (0x6267b5c5, 0x676e3e42) + 1009 + + + + + (0x3d284e4e, 0x229aa781) + + (0x7bd1b6ce, 0x7d54dd43) + 0 + + + (0x6414561b, 0x0f5ec975) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -594 + + + (0x358ae8b5, 0x0f8bacd1) + 1608 + + + (0x3f0a3b27, 0x570913d2) + -557 + + + (0x6267b5c5, 0x676e3e42) + 1920 + + + + + (0x3defbb66, 0x3da6e844) + + (0x3963ec97, 0x690016c6) + 0 + + + (0x7516d0ce, 0x550350bb) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -57 + + + (0x358ae8b5, 0x0f8bacd1) + 2352 + + + (0x3f0a3b27, 0x570913d2) + -53 + + + (0x6267b5c5, 0x676e3e42) + 2352 + + + + + (0x3ea8a938, 0x58b37ff0) + + (0x7516d0ce, 0x550350bb) + 0 + + + (0x4d566c0e, 0x24a524f0) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 23 + + + (0x358ae8b5, 0x0f8bacd1) + 2352 + + + (0x3f0a3b27, 0x570913d2) + 35 + + + (0x6267b5c5, 0x676e3e42) + 2352 + + + + + (0x3ed284a0, 0x569bd930) + + (0x2901a190, 0x419a5f65) + 0 + + + (0x3a97f4c0, 0x507b1727) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 286 + + + (0x358ae8b5, 0x0f8bacd1) + 864 + + + (0x3f0a3b27, 0x570913d2) + 291 + + + (0x6267b5c5, 0x676e3e42) + 1024 + + + + + (0x3f4b1159, 0x7491c104) + + (0x69cd39be, 0x273fd7fc) + 0 + + + (0x2e2ef1c6, 0x3ff7caee) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 23 + + + (0x358ae8b5, 0x0f8bacd1) + 864 + + + (0x3f0a3b27, 0x570913d2) + 35 + + + (0x6267b5c5, 0x676e3e42) + 864 + + + + + (0x428a22ce, 0x7f93ae2d) + + (0x345dd27d, 0x13121bfe) + 0 + + + (0x47e02329, 0x63b90226) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 167 + + + (0x358ae8b5, 0x0f8bacd1) + 2048 + + + (0x3f0a3b27, 0x570913d2) + 227 + + + (0x6267b5c5, 0x676e3e42) + 2048 + + + + + (0x42c8f4b4, 0x6723acda) + + (0x034a7fd6, 0x78939ea5) + 0 + + + (0x1b9f6423, 0x00cd22fa) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -210 + + + (0x358ae8b5, 0x0f8bacd1) + 1504 + + + (0x3f0a3b27, 0x570913d2) + -189 + + + (0x6267b5c5, 0x676e3e42) + 1448 + + + + + (0x431b0496, 0x34e74ef0) + + (0x6414561b, 0x0f5ec975) + 0 + + + (0x45584a59, 0x3c212c1e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -498 + + + (0x358ae8b5, 0x0f8bacd1) + 1920 + + + (0x3f0a3b27, 0x570913d2) + -333 + + + (0x6267b5c5, 0x676e3e42) + 2200 + + + + + (0x45b389a0, 0x35e08b87) + + (0x59d3e156, 0x496a0c80) + 0 + + + (0x345dd27d, 0x13121bfe) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 94 + + + (0x358ae8b5, 0x0f8bacd1) + 2048 + + + (0x3f0a3b27, 0x570913d2) + 91 + + + (0x6267b5c5, 0x676e3e42) + 2048 + + + + + (0x46fbb431, 0x4e3a1b21) + + (0x4f25eb7b, 0x483ea7e0) + 0 + + + (0x78d011a0, 0x40873027) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 94 + + + (0x358ae8b5, 0x0f8bacd1) + 1760 + + + (0x3f0a3b27, 0x570913d2) + 91 + + + (0x6267b5c5, 0x676e3e42) + 1760 + + + + + (0x470b0ebf, 0x34777a2f) + + (0x4ca494f5, 0x0062d0ee) + 0 + + + (0x7cc1e7d6, 0x037131f9) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 23 + + + (0x358ae8b5, 0x0f8bacd1) + 1456 + + + (0x3f0a3b27, 0x570913d2) + 35 + + + (0x6267b5c5, 0x676e3e42) + 1456 + + + + + (0x479d28d0, 0x59fa20a4) + + (0x3a97f4c0, 0x507b1729) + 0 + + + (0x083672cc, 0x0afdec3e) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 350 + + + (0x358ae8b5, 0x0f8bacd1) + 2192 + + + (0x3f0a3b27, 0x570913d2) + 491 + + + (0x6267b5c5, 0x676e3e42) + 1615 + + + + + (0x4bc40072, 0x41a6458b) + + (0x198fb25c, 0x3954e099) + 0 + + + (0x7d7dd288, 0x796c21ab) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 167 + + + (0x358ae8b5, 0x0f8bacd1) + 1168 + + + (0x3f0a3b27, 0x570913d2) + 227 + + + (0x6267b5c5, 0x676e3e42) + 1168 + + + + + (0x517ce1fa, 0x37bd0e2b) + + (0x45584a59, 0x3c212c1e) + 1 + + + (0x6e5f7222, 0x3cb22a2b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -274 + + + (0x358ae8b5, 0x0f8bacd1) + 2215 + + + (0x3f0a3b27, 0x570913d2) + -277 + + + (0x6267b5c5, 0x676e3e42) + 2304 + + + + + (0x5364fd71, 0x4a1f9ba9) + + (0x7bd1b6ce, 0x7d54dd43) + 1 + + + (0x45584a59, 0x3c212c1e) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -594 + + + (0x358ae8b5, 0x0f8bacd1) + 1623 + + + (0x3f0a3b27, 0x570913d2) + -333 + + + (0x6267b5c5, 0x676e3e42) + 2215 + + + + + (0x542cba8e, 0x4300e46c) + + (0x194a6212, 0x780aac12) + 0 + + + (0x344b467d, 0x3b0bd7f8) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 23 + + + (0x358ae8b5, 0x0f8bacd1) + 1168 + + + (0x3f0a3b27, 0x570913d2) + 35 + + + (0x6267b5c5, 0x676e3e42) + 1168 + + + + + (0x571b4787, 0x51fccf88) + + (0x7bd1b6ce, 0x7d54dd43) + 0 + + + (0x623bbc1a, 0x5cac4f44) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -594 + + + (0x358ae8b5, 0x0f8bacd1) + 1608 + + + (0x3f0a3b27, 0x570913d2) + -541 + + + (0x6267b5c5, 0x676e3e42) + 1568 + + + + + (0x58e4f4fb, 0x6ca340be) + + (0x14e5ab41, 0x22f131fe) + 0 + + + (0x2901a190, 0x419a5f65) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 167 + + + (0x358ae8b5, 0x0f8bacd1) + 864 + + + (0x3f0a3b27, 0x570913d2) + 227 + + + (0x6267b5c5, 0x676e3e42) + 864 + + + + + (0x59ae196c, 0x244bc5a2) + + (0x03918ae2, 0x29c7b0cc) + 0 + + + (0x751cbf17, 0x42fce8ab) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -130 + + + (0x358ae8b5, 0x0f8bacd1) + 1752 + + + (0x3f0a3b27, 0x570913d2) + -133 + + + (0x6267b5c5, 0x676e3e42) + 1760 + + + + + (0x5e5b0670, 0x7aee6c72) + + (0x7900cd7b, 0x6decd0b9) + 0 + + + (0x3963ec97, 0x690016c6) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -130 + + + (0x358ae8b5, 0x0f8bacd1) + 2344 + + + (0x3f0a3b27, 0x570913d2) + -133 + + + (0x6267b5c5, 0x676e3e42) + 2352 + + + + + (0x5ec75b6b, 0x3cc28b52) + + (0x410b4bc7, 0x628c8235) + 0 + + + (0x7759dfd1, 0x783ca661) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -306 + + + (0x358ae8b5, 0x0f8bacd1) + 1000 + + + (0x3f0a3b27, 0x570913d2) + -269 + + + (0x6267b5c5, 0x676e3e42) + 912 + + + + + (0x6078a12d, 0x69978f56) + + (0x4d566c0e, 0x24a524f0) + 0 + + + (0x0c9ece4e, 0x364bb09f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 94 + + + (0x358ae8b5, 0x0f8bacd1) + 2352 + + + (0x3f0a3b27, 0x570913d2) + 91 + + + (0x6267b5c5, 0x676e3e42) + 2352 + + + + + (0x62084bdd, 0x1e3135e7) + + (0x70475271, 0x65bdf5a4) + 0 + + + (0x69cd39be, 0x273fd7fc) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -57 + + + (0x358ae8b5, 0x0f8bacd1) + 864 + + + (0x3f0a3b27, 0x570913d2) + -53 + + + (0x6267b5c5, 0x676e3e42) + 864 + + + + + (0x627b8e15, 0x78fb68ef) + + (0x034a7fd6, 0x78939ea5) + 0 + + + (0x03918ae2, 0x29c7b0cc) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -210 + + + (0x358ae8b5, 0x0f8bacd1) + 1504 + + + (0x3f0a3b27, 0x570913d2) + -189 + + + (0x6267b5c5, 0x676e3e42) + 1752 + + + + + (0x69b81578, 0x53e5c492) + + (0x7bd1b6ce, 0x7d54dd43) + 1 + + + (0x26262cb6, 0x59d0b5d9) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -594 + + + (0x358ae8b5, 0x0f8bacd1) + 1623 + + + (0x3f0a3b27, 0x570913d2) + -365 + + + (0x6267b5c5, 0x676e3e42) + 1623 + + + + + (0x6c6b5107, 0x59aee4ca) + + (0x623bbc1a, 0x5cac4f44) + 0 + + + (0x26262cb6, 0x59d0b5d9) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -482 + + + (0x358ae8b5, 0x0f8bacd1) + 1568 + + + (0x3f0a3b27, 0x570913d2) + -365 + + + (0x6267b5c5, 0x676e3e42) + 1608 + + + + + (0x6e924748, 0x50e8bc45) + + (0x47e02329, 0x63b90226) + 0 + + + (0x3a97f4c0, 0x507b1729) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 286 + + + (0x358ae8b5, 0x0f8bacd1) + 2048 + + + (0x3f0a3b27, 0x570913d2) + 291 + + + (0x6267b5c5, 0x676e3e42) + 2192 + + + + + (0x6f33c54e, 0x080f2fe1) + + (0x564c9d08, 0x4ec31a8f) + 0 + + + (0x43838fcb, 0x4a100634) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -130 + + + (0x358ae8b5, 0x0f8bacd1) + 1160 + + + (0x3f0a3b27, 0x570913d2) + -133 + + + (0x6267b5c5, 0x676e3e42) + 1168 + + + + + (0x6ff483aa, 0x4b4a5b24) + + (0x73fe0302, 0x1e18725f) + 0 + + + (0x52b92a61, 0x141e747b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -57 + + + (0x358ae8b5, 0x0f8bacd1) + 2048 + + + (0x3f0a3b27, 0x570913d2) + -53 + + + (0x6267b5c5, 0x676e3e42) + 2048 + + + + + (0x7436a24b, 0x3a1cfd35) + + (0x00c60f3a, 0x0b80f2a4) + 1 + + + (0x03918ae2, 0x29c7b0cc) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -201 + + + (0x358ae8b5, 0x0f8bacd1) + 1719 + + + (0x3f0a3b27, 0x570913d2) + -189 + + + (0x6267b5c5, 0x676e3e42) + 1767 + + + + + (0x76d1f262, 0x4deb012a) + + (0x45584a59, 0x3c212c1e) + 0 + + + (0x25837bff, 0x10943562) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -274 + + + (0x358ae8b5, 0x0f8bacd1) + 2200 + + + (0x3f0a3b27, 0x570913d2) + -269 + + + (0x6267b5c5, 0x676e3e42) + 2096 + + + + + (0x772cdd88, 0x2d11af8b) + + (0x6c875e73, 0x38395bff) + 0 + + + (0x73fe0302, 0x1e18725f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -130 + + + (0x358ae8b5, 0x0f8bacd1) + 2040 + + + (0x3f0a3b27, 0x570913d2) + -133 + + + (0x6267b5c5, 0x676e3e42) + 2048 + + + + + (0x7a15156a, 0x0b2f7636) + + (0x431c9ce6, 0x134fb45e) + 0 + + + (0x3a97f4c0, 0x507b1729) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 286 + + + (0x358ae8b5, 0x0f8bacd1) + 2352 + + + (0x3f0a3b27, 0x570913d2) + 291 + + + (0x6267b5c5, 0x676e3e42) + 2207 + + + + + (0x7a8be3ac, 0x4d8ecbc0) + + (0x4fcc2492, 0x182bb5e8) + 0 + + + (0x4f25eb7b, 0x483ea7e0) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 23 + + + (0x358ae8b5, 0x0f8bacd1) + 1760 + + + (0x3f0a3b27, 0x570913d2) + 35 + + + (0x6267b5c5, 0x676e3e42) + 1760 + + + + + (0x7b00cf95, 0x55e6e212) + + (0x7bd1b6ce, 0x7d54dd43) + 1 + + + (0x410b4bc7, 0x628c8235) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -594 + + + (0x358ae8b5, 0x0f8bacd1) + 1623 + + + (0x3f0a3b27, 0x570913d2) + -365 + + + (0x6267b5c5, 0x676e3e42) + 1015 + + + + + (0x7c8ac169, 0x74a2f420) + + (0x7bd1b6ce, 0x7d54dd43) + 0 + + + (0x3358fc9e, 0x58e084d2) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -594 + + + (0x358ae8b5, 0x0f8bacd1) + 1608 + + + (0x3f0a3b27, 0x570913d2) + -557 + + + (0x6267b5c5, 0x676e3e42) + 1264 + + + + + (0x7ecd13c4, 0x34fae786) + + (0x3a97f4c0, 0x507b1727) + 0 + + + (0x083672cc, 0x0afdec3e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 350 + + + (0x358ae8b5, 0x0f8bacd1) + 1024 + + + (0x3f0a3b27, 0x570913d2) + 491 + + + (0x6267b5c5, 0x676e3e42) + 1585 + + + + + + + (0x0f22978f, 0x2205bfa2) + Feature vector containing signal +during stimulated periods. + + + (0x473d9a43, 0x97fc0a97) + 1456 + + + (0x7234b86b, 0x2b8651a5) + 208 + + + + + (0x1ebb3fca, 0x31deea61) + Feature vector containing signal +during stimulated periods. + + + (0x473d9a43, 0x97fc0a97) + 2048 + + + (0x7234b86b, 0x2b8651a5) + 208 + + + + + (0x1fda2e43, 0x43ba3cc8) + Feature vector containing signal +during stimulated periods. + + + (0x473d9a43, 0x97fc0a97) + 864 + + + (0x7234b86b, 0x2b8651a5) + 208 + + + + + (0x2a728905, 0x0fe8a6cb) + <b>Signal processing</b> + +Each frequency is treated separately. There are two important +boxes in the processing chain : + +<b>Temporal filter</b> extracts a single frequency band. It +should be configured by a file generated by the configuration +scenario. + +<b>Target Separator</b> separates targets used to mark one +frequency from the others and sends stimulations to corresponding +outputs (Target/Non-Target). + + + (0x473d9a43, 0x97fc0a97) + 1056 + + + (0x7234b86b, 0x2b8651a5) + -752 + + + + + (0x2d86b244, 0x2e0413e8) + Signal processing for the <b>first</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 1008 + + + (0x7234b86b, 0x2b8651a5) + -416 + + + + + (0x351d028a, 0x0bb16598) + Feature vector containing signal +during non-stimulated periods. + + + (0x473d9a43, 0x97fc0a97) + 1168 + + + (0x7234b86b, 0x2b8651a5) + 208 + + + + + (0x3d893b1d, 0x5b4c4cb3) + <b>Feature extraction</b> + +Finally the classifier receives values of amplitude for +stimulated and non-stimulated periods and trains to distinguish +the two. + +One classifier is trained per each stimulation frequency. + + + (0x473d9a43, 0x97fc0a97) + 1248 + + + (0x7234b86b, 0x2b8651a5) + 512 + + + + + (0x49ea97ad, 0x543800c1) + Feature vector containing signal +during non-stimulated periods. + + + (0x473d9a43, 0x97fc0a97) + 1760 + + + (0x7234b86b, 0x2b8651a5) + 208 + + + + + (0x555acaa5, 0x0d386d84) + Signal processing for the <b>third</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 2192 + + + (0x7234b86b, 0x2b8651a5) + -416 + + + + + (0x56cc58c5, 0x174103bc) + Feature vector containing signal +during non-stimulated periods. + + + (0x473d9a43, 0x97fc0a97) + 2352 + + + (0x7234b86b, 0x2b8651a5) + 208 + + + + + (0x57661f1a, 0x63af67d4) + Signal processing for the <b>second</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 1584 + + + (0x7234b86b, 0x2b8651a5) + -416 + + + + + (0x57c833e1, 0x71ddf32c) + <big><b>Scenario description</b></big> + +This step will use the signal recorded during the previous step +<i>training acquisition</i> to generate classifiers which are in +turn usable in online BCI applications. + +<b><span color="red">Important :</span></b> Do not forget to +change the settings in the <i>Generic stream reader</i> to load +the file you recorded in the previous step. By default the +scenario uses example data provided with OpenViBE. + +<b>Notice :</b> this scenario will work for three stimulation +frequencies. If you wish to use more than three commands in your +applications, you will have to modify it. This modification is +pretty straightforward just duplicate a branch of the processing +chain and change the files used by boxes <i>Temporal filter</i>, +<i>Target Separator</i> and <i>Classifier trainer</i> + + + (0x473d9a43, 0x97fc0a97) + 1616 + + + (0x7234b86b, 0x2b8651a5) + -912 + + + + + (0x78dd25af, 0x4f9c6a66) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 1616 + + + (0x7234b86b, 0x2b8651a5) + -1120 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":400,"identifier":"(0x229a44a2, 0x4436fdd2)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":400},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x32163edf, 0x54505e87)","index":0,"name":"Default tab","parentIdentifier":"(0x229a44a2, 0x4436fdd2)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x6a0c6673, 0x5a1b1767)","index":0,"name":"Empty","parentIdentifier":"(0x32163edf, 0x54505e87)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-5-online-test-shooter.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-5-online-test-shooter.xml new file mode 100644 index 0000000..9a5955f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/bci-examples/ssvep/ssvep-bci-5-online-test-shooter.xml @@ -0,0 +1,4673 @@ + + 1 + OpenViBE + 1.1.0+git + + + (0x00e9ebae, 0x1852dd7a) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1680 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x01ec33f9, 0x105ac653) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1680 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x03788915, 0x6e15d707) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x06935963, 0x463f278e) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -400 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1680 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-3.cfg + + + (0xad100179, 0xa3c984ab) + 95 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x06c1ba47, 0x5ffb5fb4) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1680 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x084a5d0f, 0x019639a8) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1472 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x09011c75, 0x53518474) + Stimulator Control + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + (0x6f752dd0, 0x082a321e) + Input 3 + + + (0x6f752dd0, 0x082a321e) + Input 4 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + SSVEP_VRPN_StimulatorControl + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_VisualStimulationStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_VisualStimulationStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_VisualStimulationStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_VisualStimulationStop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -176 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x116a588d, 0x6abe2634) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/classifiers/classifier-1.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 1273.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xad100179, 0xa3c984ab) + 142 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x116a588d, 0x6abe2635) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/classifiers/classifier-2.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 1480.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xad100179, 0xa3c984ab) + 142 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x116a588d, 0x6abe2636) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/classifiers/classifier-3.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144.000000 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 1688.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xad100179, 0xa3c984ab) + 142 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x20f295c9, 0x184d6103) + Stimulation multiplexer + (0x07db4efa, 0x472b0938) + + + (0x6f752dd0, 0x082a321e) + Input stimulations 1 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 2 + + + + + (0x6f752dd0, 0x082a321e) + Multiplexed stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0xe7af82cd, 0x14edb4d4) + + + (0xad100179, 0xa3c984ab) + 162 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2208e0ec, 0x7fc706dd) + Button Simplifier + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/shooter-button-simplifier.lua + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -496 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 125 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x2249d2c1, 0x6b94a1b7) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1.cfg + + + (0xad100179, 0xa3c984ab) + 93 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x3290efe3, 0x7e015b2e) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x339b92db, 0x42e0c3be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1472 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a243aca, 0x1bdf11d0) + SSVEP Voter + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/shooter-combination-classifier.lua + false + + + (0x007deef9, 0x2f3e95c6) + Class count + 3 + 3 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1472 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 98 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a7a442b, 0x159ce9bd) + Run Command + (0x48843891, 0x7bfc57f4) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 1 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_ExperimentStart + false + + + (0x79a9edeb, 0x245d83fc) + Command 1 + + ${External_Application_Launcher} openvibe-ssvep-demo --run-bg shooter + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -992 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 560 + + + (0x4e7b798a, 0x183beafb) + (0xe44a71e7, 0x7964dd76) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 104 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x3f7d6d46, 0x7eeb823a) + SSVEP Shooter Controller + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/shooter-controller.lua + false + + + (0x79a9edeb, 0x245d83fc) + Target Sequence + 0 1 7 2 6 3 5 4 + 0 3 5 7 2 6 4 1 + false + + + (0x512a166f, 0x5c3ef83f) + Ship Angular Speed + 0.01 + 0.01 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -832 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 185 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x447c3e28, 0x604a0e68) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -496 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 992 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x48752a0e, 0x13c751c1) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x48983297, 0x0cf16837) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1472 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4d994d17, 0x4d7d5a9e) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -688 + + + (0x1fa963f5, 0x1a638cd4) + 31 + + + (0x207c9054, 0x3c841b63) + 1472 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xad100179, 0xa3c984ab) + 125 + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x5398df3a, 0x22f13a9d) + Scenario Control + (0x40714327, 0x458877d2) + + + (0x6f752dd0, 0x082a321e) + Output 1 + + + (0x6f752dd0, 0x082a321e) + Output 2 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn@localhost + SSVEP_VRPN_StartStop@localhost:${VRPN_ExternalServerPort} + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStop + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -656 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0x09fd9ef3, 0xeb8c3069) + + + (0xad100179, 0xa3c984ab) + 121 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x54c56c66, 0x77e047d5) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1472 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2.cfg + + + (0xad100179, 0xa3c984ab) + 93 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x587dad7a, 0x583df57c) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream + + + + + (0x5ba36127, 0x195feae1) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -608 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1472 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 69 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5912436c, 0x5de74be9) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5a6ec2d3, 0x27acf303) + VRPN Target Request + (0x40714327, 0x458877d2) + + + (0x6f752dd0, 0x082a321e) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn@localhost + SSVEP_VRPN_TargetRequest@localhost:${VRPN_ExternalServerPort} + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Target + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_NonTarget + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -992 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x4e7b798a, 0x183beafb) + (0x09fd9ef3, 0xeb8c3069) + + + (0xad100179, 0xa3c984ab) + 155 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x5ed47113, 0x3027c90c) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1680 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5ee6e1ec, 0x29c97478) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x65698624, 0x25c3a111) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1472 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x65f61eda, 0x3de7339f) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -416 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 69 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x694e21ec, 0x60d315e7) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -400 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1472 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-2.cfg + + + (0xad100179, 0xa3c984ab) + 95 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6e8b9d94, 0x04c8215d) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1472 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x71be70d3, 0x48d12bbc) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -400 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-1.cfg + + + (0xad100179, 0xa3c984ab) + 95 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x74116027, 0x16317faf) + VRPN Target Command + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + (0x6f752dd0, 0x082a321e) + Input 3 + + + (0x6f752dd0, 0x082a321e) + Input 4 + + + (0x6f752dd0, 0x082a321e) + Input 5 + + + (0x6f752dd0, 0x082a321e) + Input 6 + + + (0x6f752dd0, 0x082a321e) + Input 7 + + + (0x6f752dd0, 0x082a321e) + Input 8 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + SSVEP_VRPN_ShooterTarget + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 5 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_04 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 5 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_04 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 6 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_05 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 6 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_05 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 7 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_06 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 7 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_06 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 8 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_07 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 8 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_07 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -640 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xad100179, 0xa3c984ab) + 166 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x754776a6, 0x35fb2e79) + Start Stimulation + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/start-stimulator.lua + false + + + (0x007deef9, 0x2f3e95c6) + Delay + 1 + 1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -1088 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 560 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x76038e41, 0x0629cf1e) + Frequency 3 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1680 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3.cfg + + + (0xad100179, 0xa3c984ab) + 93 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7c152733, 0x65a8c7f0) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x1fa963f5, 0x1a638cd4) + 48 + + + (0x207c9054, 0x3c841b63) + 1680 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7e01968b, 0x6e407beb) + VRPN Ship Control + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + (0x6f752dd0, 0x082a321e) + Input 3 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + SSVEP_VRPN_ShipControl + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_02 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x1fa963f5, 0x1a638cd4) + 65 + + + (0x207c9054, 0x3c841b63) + 1472 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x024fd287, 0x38af0039) + + (0x5912436c, 0x5de74be9) + 0 + + + (0x116a588d, 0x6abe2634) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 94 + + + (0x358ae8b5, 0x0f8bacd1) + 1264 + + + (0x3f0a3b27, 0x570913d2) + 124 + + + (0x6267b5c5, 0x676e3e42) + 1265 + + + + + (0x0480606f, 0x1b9f63af) + + (0x587dad7a, 0x583df57c) + 0 + + + (0x06935963, 0x463f278e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -578 + + + (0x358ae8b5, 0x0f8bacd1) + 1472 + + + (0x3f0a3b27, 0x570913d2) + -429 + + + (0x6267b5c5, 0x676e3e42) + 1680 + + + + + (0x04a2367d, 0x1c69ce00) + + (0x3f7d6d46, 0x7eeb823a) + 0 + + + (0x74116027, 0x16317faf) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -793 + + + (0x358ae8b5, 0x0f8bacd1) + 1168 + + + (0x3f0a3b27, 0x570913d2) + -677 + + + (0x6267b5c5, 0x676e3e42) + 1145 + + + + + (0x06239c0f, 0x2b641f69) + + (0x3f7d6d46, 0x7eeb823a) + 0 + + + (0x20f295c9, 0x184d6103) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -793 + + + (0x358ae8b5, 0x0f8bacd1) + 1168 + + + (0x3f0a3b27, 0x570913d2) + -333 + + + (0x6267b5c5, 0x676e3e42) + 919 + + + + + (0x064c90a7, 0x1438906d) + + (0x3a243aca, 0x1bdf11d0) + 0 + + + (0x7e01968b, 0x6e407beb) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 279 + + + (0x358ae8b5, 0x0f8bacd1) + 1472 + + + (0x3f0a3b27, 0x570913d2) + 331 + + + (0x6267b5c5, 0x676e3e42) + 1472 + + + + + (0x06fbd448, 0x6422c910) + + (0x3f7d6d46, 0x7eeb823a) + 0 + + + (0x74116027, 0x16317faf) + 3 + + + + (0x1b32c44c, 0x1905e0e9) + -793 + + + (0x358ae8b5, 0x0f8bacd1) + 1168 + + + (0x3f0a3b27, 0x570913d2) + -677 + + + (0x6267b5c5, 0x676e3e42) + 1160 + + + + + (0x0a8d3918, 0x643af5aa) + + (0x116a588d, 0x6abe2635) + 0 + + + (0x3a243aca, 0x1bdf11d0) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 166 + + + (0x358ae8b5, 0x0f8bacd1) + 1465 + + + (0x3f0a3b27, 0x570913d2) + 203 + + + (0x6267b5c5, 0x676e3e42) + 1472 + + + + + (0x0c1c8eb1, 0x0aa3fc80) + + (0x587dad7a, 0x583df57c) + 0 + + + (0x71be70d3, 0x48d12bbc) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -578 + + + (0x358ae8b5, 0x0f8bacd1) + 1472 + + + (0x3f0a3b27, 0x570913d2) + -429 + + + (0x6267b5c5, 0x676e3e42) + 1264 + + + + + (0x0e470064, 0x2295ff4b) + + (0x5398df3a, 0x22f13a9d) + 1 + + + (0x447c3e28, 0x604a0e68) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -617 + + + (0x358ae8b5, 0x0f8bacd1) + 903 + + + (0x3f0a3b27, 0x570913d2) + -516 + + + (0x6267b5c5, 0x676e3e42) + 992 + + + + + (0x101f23cc, 0x5e89b571) + + (0x54c56c66, 0x77e047d5) + 0 + + + (0x084a5d0f, 0x019639a8) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -274 + + + (0x358ae8b5, 0x0f8bacd1) + 1472 + + + (0x3f0a3b27, 0x570913d2) + -261 + + + (0x6267b5c5, 0x676e3e42) + 1472 + + + + + (0x12034bbd, 0x5c007195) + + (0x65698624, 0x25c3a111) + 0 + + + (0x48983297, 0x0cf16837) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 23 + + + (0x358ae8b5, 0x0f8bacd1) + 1472 + + + (0x3f0a3b27, 0x570913d2) + 35 + + + (0x6267b5c5, 0x676e3e42) + 1472 + + + + + (0x125ed77c, 0x61b23cf3) + + (0x3a243aca, 0x1bdf11d0) + 0 + + + (0x7e01968b, 0x6e407beb) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 279 + + + (0x358ae8b5, 0x0f8bacd1) + 1472 + + + (0x3f0a3b27, 0x570913d2) + 331 + + + (0x6267b5c5, 0x676e3e42) + 1457 + + + + + (0x18335625, 0x21bcdeaa) + + (0x20f295c9, 0x184d6103) + 0 + + + (0x09011c75, 0x53518474) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -274 + + + (0x358ae8b5, 0x0f8bacd1) + 912 + + + (0x3f0a3b27, 0x570913d2) + -213 + + + (0x6267b5c5, 0x676e3e42) + 808 + + + + + (0x1c629008, 0x55872e1e) + + (0x06c1ba47, 0x5ffb5fb4) + 0 + + + (0x5ed47113, 0x3027c90c) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -185 + + + (0x358ae8b5, 0x0f8bacd1) + 1680 + + + (0x3f0a3b27, 0x570913d2) + -181 + + + (0x6267b5c5, 0x676e3e42) + 1680 + + + + + (0x29386c7a, 0x166bb474) + + (0x2208e0ec, 0x7fc706dd) + 0 + + + (0x65f61eda, 0x3de7339f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -457 + + + (0x358ae8b5, 0x0f8bacd1) + 848 + + + (0x3f0a3b27, 0x570913d2) + -445 + + + (0x6267b5c5, 0x676e3e42) + 848 + + + + + (0x2b009e45, 0x195aabc5) + + (0x3f7d6d46, 0x7eeb823a) + 0 + + + (0x74116027, 0x16317faf) + 4 + + + + (0x1b32c44c, 0x1905e0e9) + -793 + + + (0x358ae8b5, 0x0f8bacd1) + 1168 + + + (0x3f0a3b27, 0x570913d2) + -677 + + + (0x6267b5c5, 0x676e3e42) + 1175 + + + + + (0x2cf4fb6c, 0x3482d903) + + (0x3290efe3, 0x7e015b2e) + 0 + + + (0x48752a0e, 0x13c751c1) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -50 + + + (0x358ae8b5, 0x0f8bacd1) + 1264 + + + (0x3f0a3b27, 0x570913d2) + -53 + + + (0x6267b5c5, 0x676e3e42) + 1264 + + + + + (0x2d54734a, 0x308f3048) + + (0x48983297, 0x0cf16837) + 0 + + + (0x116a588d, 0x6abe2635) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 94 + + + (0x358ae8b5, 0x0f8bacd1) + 1472 + + + (0x3f0a3b27, 0x570913d2) + 124 + + + (0x6267b5c5, 0x676e3e42) + 1472 + + + + + (0x2e9baff1, 0x42049758) + + (0x00e9ebae, 0x1852dd7a) + 0 + + + (0x116a588d, 0x6abe2636) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 94 + + + (0x358ae8b5, 0x0f8bacd1) + 1680 + + + (0x3f0a3b27, 0x570913d2) + 124 + + + (0x6267b5c5, 0x676e3e42) + 1680 + + + + + (0x30317c2f, 0x34778b95) + + (0x2249d2c1, 0x6b94a1b7) + 0 + + + (0x5ee6e1ec, 0x29c97478) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -274 + + + (0x358ae8b5, 0x0f8bacd1) + 1264 + + + (0x3f0a3b27, 0x570913d2) + -261 + + + (0x6267b5c5, 0x676e3e42) + 1264 + + + + + (0x3259cbc9, 0x05f840a5) + + (0x6e8b9d94, 0x04c8215d) + 0 + + + (0x65698624, 0x25c3a111) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -50 + + + (0x358ae8b5, 0x0f8bacd1) + 1472 + + + (0x3f0a3b27, 0x570913d2) + -53 + + + (0x6267b5c5, 0x676e3e42) + 1472 + + + + + (0x37d1aac5, 0x4ffd876e) + + (0x3a243aca, 0x1bdf11d0) + 0 + + + (0x7e01968b, 0x6e407beb) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 279 + + + (0x358ae8b5, 0x0f8bacd1) + 1472 + + + (0x3f0a3b27, 0x570913d2) + 331 + + + (0x6267b5c5, 0x676e3e42) + 1487 + + + + + (0x37f148d2, 0x4e732029) + + (0x4d994d17, 0x4d7d5a9e) + 1 + + + (0x587dad7a, 0x583df57c) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -666 + + + (0x358ae8b5, 0x0f8bacd1) + 1457 + + + (0x3f0a3b27, 0x570913d2) + -637 + + + (0x6267b5c5, 0x676e3e42) + 1472 + + + + + (0x3ad3b081, 0x488418e0) + + (0x3f7d6d46, 0x7eeb823a) + 0 + + + (0x74116027, 0x16317faf) + 7 + + + + (0x1b32c44c, 0x1905e0e9) + -793 + + + (0x358ae8b5, 0x0f8bacd1) + 1168 + + + (0x3f0a3b27, 0x570913d2) + -677 + + + (0x6267b5c5, 0x676e3e42) + 1220 + + + + + (0x40233aa3, 0x207841e1) + + (0x48752a0e, 0x13c751c1) + 0 + + + (0x5912436c, 0x5de74be9) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 23 + + + (0x358ae8b5, 0x0f8bacd1) + 1264 + + + (0x3f0a3b27, 0x570913d2) + 35 + + + (0x6267b5c5, 0x676e3e42) + 1264 + + + + + (0x43bfb67f, 0x578b65fa) + + (0x694e21ec, 0x60d315e7) + 0 + + + (0x54c56c66, 0x77e047d5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -370 + + + (0x358ae8b5, 0x0f8bacd1) + 1472 + + + (0x3f0a3b27, 0x570913d2) + -333 + + + (0x6267b5c5, 0x676e3e42) + 1472 + + + + + (0x43cd1b6f, 0x53bac4f3) + + (0x65f61eda, 0x3de7339f) + 0 + + + (0x09011c75, 0x53518474) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -386 + + + (0x358ae8b5, 0x0f8bacd1) + 848 + + + (0x3f0a3b27, 0x570913d2) + -213 + + + (0x6267b5c5, 0x676e3e42) + 823 + + + + + (0x45d50601, 0x65d44ec7) + + (0x71be70d3, 0x48d12bbc) + 0 + + + (0x2249d2c1, 0x6b94a1b7) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -370 + + + (0x358ae8b5, 0x0f8bacd1) + 1264 + + + (0x3f0a3b27, 0x570913d2) + -333 + + + (0x6267b5c5, 0x676e3e42) + 1264 + + + + + (0x46f000ae, 0x287f1eba) + + (0x76038e41, 0x0629cf1e) + 0 + + + (0x06c1ba47, 0x5ffb5fb4) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -274 + + + (0x358ae8b5, 0x0f8bacd1) + 1680 + + + (0x3f0a3b27, 0x570913d2) + -261 + + + (0x6267b5c5, 0x676e3e42) + 1680 + + + + + (0x47038316, 0x4fdc4531) + + (0x3f7d6d46, 0x7eeb823a) + 0 + + + (0x74116027, 0x16317faf) + 6 + + + + (0x1b32c44c, 0x1905e0e9) + -793 + + + (0x358ae8b5, 0x0f8bacd1) + 1168 + + + (0x3f0a3b27, 0x570913d2) + -677 + + + (0x6267b5c5, 0x676e3e42) + 1205 + + + + + (0x4bef72e9, 0x0943bf9c) + + (0x06935963, 0x463f278e) + 0 + + + (0x76038e41, 0x0629cf1e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -370 + + + (0x358ae8b5, 0x0f8bacd1) + 1680 + + + (0x3f0a3b27, 0x570913d2) + -333 + + + (0x6267b5c5, 0x676e3e42) + 1680 + + + + + (0x4d7286ce, 0x3c287f5a) + + (0x65f61eda, 0x3de7339f) + 0 + + + (0x09011c75, 0x53518474) + 3 + + + + (0x1b32c44c, 0x1905e0e9) + -386 + + + (0x358ae8b5, 0x0f8bacd1) + 848 + + + (0x3f0a3b27, 0x570913d2) + -213 + + + (0x6267b5c5, 0x676e3e42) + 838 + + + + + (0x5106cdae, 0x2b509d01) + + (0x5ed47113, 0x3027c90c) + 0 + + + (0x7c152733, 0x65a8c7f0) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -105 + + + (0x358ae8b5, 0x0f8bacd1) + 1680 + + + (0x3f0a3b27, 0x570913d2) + -109 + + + (0x6267b5c5, 0x676e3e42) + 1680 + + + + + (0x593f66d0, 0x2fbd4af5) + + (0x5ee6e1ec, 0x29c97478) + 0 + + + (0x03788915, 0x6e15d707) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -185 + + + (0x358ae8b5, 0x0f8bacd1) + 1264 + + + (0x3f0a3b27, 0x570913d2) + -181 + + + (0x6267b5c5, 0x676e3e42) + 1264 + + + + + (0x5a08c8c1, 0x24427fe8) + + (0x65f61eda, 0x3de7339f) + 0 + + + (0x09011c75, 0x53518474) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -386 + + + (0x358ae8b5, 0x0f8bacd1) + 848 + + + (0x3f0a3b27, 0x570913d2) + -213 + + + (0x6267b5c5, 0x676e3e42) + 793 + + + + + (0x5d6b25d5, 0x2a4ad507) + + (0x3f7d6d46, 0x7eeb823a) + 0 + + + (0x74116027, 0x16317faf) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -793 + + + (0x358ae8b5, 0x0f8bacd1) + 1168 + + + (0x3f0a3b27, 0x570913d2) + -677 + + + (0x6267b5c5, 0x676e3e42) + 1130 + + + + + (0x602b2a9c, 0x0df383c6) + + (0x5398df3a, 0x22f13a9d) + 0 + + + (0x2208e0ec, 0x7fc706dd) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -617 + + + (0x358ae8b5, 0x0f8bacd1) + 888 + + + (0x3f0a3b27, 0x570913d2) + -533 + + + (0x6267b5c5, 0x676e3e42) + 848 + + + + + (0x61dec4a3, 0x23402bd7) + + (0x339b92db, 0x42e0c3be) + 0 + + + (0x6e8b9d94, 0x04c8215d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -105 + + + (0x358ae8b5, 0x0f8bacd1) + 1472 + + + (0x3f0a3b27, 0x570913d2) + -109 + + + (0x6267b5c5, 0x676e3e42) + 1472 + + + + + (0x622f6278, 0x3f7f030a) + + (0x65f61eda, 0x3de7339f) + 0 + + + (0x20f295c9, 0x184d6103) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -386 + + + (0x358ae8b5, 0x0f8bacd1) + 848 + + + (0x3f0a3b27, 0x570913d2) + -333 + + + (0x6267b5c5, 0x676e3e42) + 904 + + + + + (0x6aa4b678, 0x695e8a9e) + + (0x754776a6, 0x35fb2e79) + 0 + + + (0x3a7a442b, 0x159ce9bd) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -1049 + + + (0x358ae8b5, 0x0f8bacd1) + 560 + + + (0x3f0a3b27, 0x570913d2) + -1021 + + + (0x6267b5c5, 0x676e3e42) + 560 + + + + + (0x718b627a, 0x528448b5) + + (0x587dad7a, 0x583df57c) + 0 + + + (0x694e21ec, 0x60d315e7) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -578 + + + (0x358ae8b5, 0x0f8bacd1) + 1472 + + + (0x3f0a3b27, 0x570913d2) + -429 + + + (0x6267b5c5, 0x676e3e42) + 1472 + + + + + (0x72c245dc, 0x13dd22f3) + + (0x03788915, 0x6e15d707) + 0 + + + (0x3290efe3, 0x7e015b2e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -105 + + + (0x358ae8b5, 0x0f8bacd1) + 1264 + + + (0x3f0a3b27, 0x570913d2) + -109 + + + (0x6267b5c5, 0x676e3e42) + 1264 + + + + + (0x7366947d, 0x2617c6bd) + + (0x116a588d, 0x6abe2636) + 0 + + + (0x3a243aca, 0x1bdf11d0) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 166 + + + (0x358ae8b5, 0x0f8bacd1) + 1673 + + + (0x3f0a3b27, 0x570913d2) + 203 + + + (0x6267b5c5, 0x676e3e42) + 1487 + + + + + (0x74dd7ac3, 0x64c6a633) + + (0x3f7d6d46, 0x7eeb823a) + 0 + + + (0x74116027, 0x16317faf) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -793 + + + (0x358ae8b5, 0x0f8bacd1) + 1168 + + + (0x3f0a3b27, 0x570913d2) + -677 + + + (0x6267b5c5, 0x676e3e42) + 1115 + + + + + (0x7577a39b, 0x18ff2006) + + (0x3f7d6d46, 0x7eeb823a) + 0 + + + (0x74116027, 0x16317faf) + 5 + + + + (0x1b32c44c, 0x1905e0e9) + -793 + + + (0x358ae8b5, 0x0f8bacd1) + 1168 + + + (0x3f0a3b27, 0x570913d2) + -677 + + + (0x6267b5c5, 0x676e3e42) + 1190 + + + + + (0x787b7ff3, 0x73f0d63f) + + (0x5a6ec2d3, 0x27acf303) + 0 + + + (0x3f7d6d46, 0x7eeb823a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -953 + + + (0x358ae8b5, 0x0f8bacd1) + 1168 + + + (0x3f0a3b27, 0x570913d2) + -869 + + + (0x6267b5c5, 0x676e3e42) + 1168 + + + + + (0x7a60ed13, 0x51a0c30e) + + (0x7c152733, 0x65a8c7f0) + 0 + + + (0x01ec33f9, 0x105ac653) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -50 + + + (0x358ae8b5, 0x0f8bacd1) + 1680 + + + (0x3f0a3b27, 0x570913d2) + -53 + + + (0x6267b5c5, 0x676e3e42) + 1680 + + + + + (0x7caaf0cd, 0x47648aa3) + + (0x01ec33f9, 0x105ac653) + 0 + + + (0x00e9ebae, 0x1852dd7a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 23 + + + (0x358ae8b5, 0x0f8bacd1) + 1680 + + + (0x3f0a3b27, 0x570913d2) + 35 + + + (0x6267b5c5, 0x676e3e42) + 1680 + + + + + (0x7f383be4, 0x60daf267) + + (0x116a588d, 0x6abe2634) + 0 + + + (0x3a243aca, 0x1bdf11d0) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 166 + + + (0x358ae8b5, 0x0f8bacd1) + 1258 + + + (0x3f0a3b27, 0x570913d2) + 203 + + + (0x6267b5c5, 0x676e3e42) + 1457 + + + + + (0x7fca3f10, 0x01094642) + + (0x084a5d0f, 0x019639a8) + 0 + + + (0x339b92db, 0x42e0c3be) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -185 + + + (0x358ae8b5, 0x0f8bacd1) + 1472 + + + (0x3f0a3b27, 0x570913d2) + -181 + + + (0x6267b5c5, 0x676e3e42) + 1472 + + + + + + + (0x15c2ca08, 0x318ff0e7) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 1184 + + + (0x7234b86b, 0x2b8651a5) + -1472 + + + + + (0x1a5632a7, 0x5e81db45) + <b><big>Scenario description</big></b> + +This is the online testing scenario. You can use it to evaluate the +classifiers trained in the previous step. + +<b><span color="red">Important :</span></b>You will have to run the +<i>Classifier training</i> scenario at least one in order to use the +online testing application. + +<b>Game rules</b> + +The game is a simple shooter. You control a representation of a ship and +your goal is to shoot at the appearing targets. There are three possible +controls <i>Turn clockwise</i>, <i>Turn counter-clockwise</i> and +<i>Shoot</i> corresponding to left, right and front flickering form. + + + + (0x473d9a43, 0x97fc0a97) + 1184 + + + (0x7234b86b, 0x2b8651a5) + -1264 + + + + + (0x33125a27, 0x708cbe31) + <b><span color="#2060ff">Configurable box</span></b> + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 1168 + + + (0x7234b86b, 0x2b8651a5) + -832 + + + + + (0x36254163, 0x7bb8e8e4) + Signal processing for the <b>first</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 1264 + + + (0x7234b86b, 0x2b8651a5) + -464 + + + + + (0x69f964cd, 0x2ef491cb) + <b><big>Game Configuration</big></b> + +There are two settings that you can change in this scenario: + +<b>Target sequence :</b> a list of positions on which the targets will +appear. Each position is represented by a number from 0 to 7, representing +the angle of the target. + +<b>Ship angular speed :</b> the angle (in radians) by which the ship will +rotate every time it receives a command. + + + + (0x473d9a43, 0x97fc0a97) + 752 + + + (0x7234b86b, 0x2b8651a5) + -848 + + + + + (0x6f772484, 0x3426d7ef) + Signal processing for the <b>third</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 1696 + + + (0x7234b86b, 0x2b8651a5) + -464 + + + + + (0x72cc51fa, 0x547a6d72) + Signal processing for the <b>second</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 1456 + + + (0x7234b86b, 0x2b8651a5) + -528 + + + + + (0x7533b958, 0x11f93c15) + <big><b>External Stimulator</b></big> + +This SSVEP scenario needs to run along with +an external application. The application is run +automatically after the start of the scenario. + +The stimulator accepts two keyboard commands: + +Pressing <b>&lt;Space&gt;</b> will send a start +stimulation to the scenario and the experiment will +begin. + +Pressing <b>&lt;Escape&gt;</b> will quit the +stimulator and stop the scenario. + + + (0x473d9a43, 0x97fc0a97) + 560 + + + (0x7234b86b, 0x2b8651a5) + -1280 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":400,"identifier":"(0x16155206, 0x5f75d28c)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":394},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x1828f0ed, 0x0b8cf5a2)","index":0,"name":"Default tab","parentIdentifier":"(0x16155206, 0x5f75d28c)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x7874f291, 0x584c2b91)","index":0,"name":"Empty","parentIdentifier":"(0x1828f0ed, 0x0b8cf5a2)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/openvibe-ssvep-demo.conf b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/openvibe-ssvep-demo.conf new file mode 100644 index 0000000..0d63e3c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/openvibe-ssvep-demo.conf @@ -0,0 +1,43 @@ +Kernel_3DVisualizationEnabled = true +Kernel_3DVisualizationOgreStatisticsOverlayEnabled = false +Kernel_3DVisualizationOgreConfiguration = ${Path_Data}/kernel/ogre.cfg +Kernel_3DVisualizationOgreResources = ${Path_Data}/kernel/resources.cfg +Kernel_3DVisualizationOgrePluginsLinux = ${Path_Data}/openvibe-ogre-plugins.cfg +Kernel_3DVisualizationOgrePluginsWindowsSubDirectoryRelease = release +Kernel_3DVisualizationOgrePluginsWindowsSubDirectoryDebug = debug +Kernel_3DVisualizationOgrePluginsWindowsPostFixDebug = _d +Kernel_3DVisualizationOgrePluginsWindowsPostFixRelease = +Kernel_3DVisualizationOgrePluginsWindows = $Environment{OGRE_HOME}/bin/${Kernel_3DVisualizationOgrePluginsWindowsSubDirectory${BuildType}}/Plugins${Kernel_3DVisualizationOgrePluginsWindowsPostFix${BuildType}}.cfg +Kernel_3DVisualizationOgrePlugins = ${Kernel_3DVisualizationOgrePlugins${OperatingSystem}} +Kernel_3DVisualizationOgreLogLevel = Debug +Kernel_3DVisualizationOgreLogPath = ${Path_Log}/${ApplicationName}-ogre.log + +SSVEP_VRPNServerPort = 1337 +SSVEP_VRPNHost = localhost + +SSVEP_ScreenRefreshRate = 60 + +SSVEP_EpochDuration = 0.5 +SSVEP_EpochInterval = 0.1 + +SSVEP_Frequency_1 = 20 +SSVEP_Frequency_2 = 15 +SSVEP_Frequency_3 = 12 +SSVEP_Frequency_4 = 10 + +SSVEP_Ogre_LogToConsole = false + +SSVEP_TargetLightColourRed = 1.0 +SSVEP_TargetLightColourGreen = 0.0 +SSVEP_TargetLightColourBlue = 0.0 + +SSVEP_TargetDarkColourRed = 0.0 +SSVEP_TargetDarkColourGreen = 0.0 +SSVEP_TargetDarkColourBlue = 0.0 + +Include = ${Path_Data}/applications/ssvep-demo/${SSVEP_ApplicationDescriptor}.conf +Include = ${CustomConfigurationApplication} +Include = ${CustomConfigurationPrefix${OperatingSystem}}-ssvep-demo-${SSVEP_ApplicationDescriptor}${CustomConfigurationSuffix${OperatingSystem}} + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/SSVEP.material b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/SSVEP.material new file mode 100644 index 0000000..f9c8056 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/SSVEP.material @@ -0,0 +1,7 @@ +material BasicSurface/Diffuse +{ + technique + { + pass { lighting off } + } +} diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook-0.8.imageset b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook-0.8.imageset new file mode 100644 index 0000000..5c69e66 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook-0.8.imageset @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook-0.8.looknfeel b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook-0.8.looknfeel new file mode 100644 index 0000000..60f53ee --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook-0.8.looknfeel @@ -0,0 +1,4154 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+
+ +
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook-ov-0.8.scheme b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook-ov-0.8.scheme new file mode 100644 index 0000000..38d35c6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook-ov-0.8.scheme @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook-ov.scheme b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook-ov.scheme new file mode 100644 index 0000000..e23e731 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook-ov.scheme @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook.imageset b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook.imageset new file mode 100644 index 0000000..2e3ec16 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook.imageset @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook.looknfeel b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook.looknfeel new file mode 100644 index 0000000..2ad3e4e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook.looknfeel @@ -0,0 +1,4812 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+
+ +
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook.tga b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook.tga new file mode 100644 index 0000000..4094fec Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/TaharezLook.tga differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehigh.ttf b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehigh.ttf new file mode 100644 index 0000000..14d45c5 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehigh.ttf differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-10-0.8.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-10-0.8.font new file mode 100644 index 0000000..2575772 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-10-0.8.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-10.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-10.font new file mode 100644 index 0000000..23a7bc7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-10.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-12-0.8.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-12-0.8.font new file mode 100644 index 0000000..f7f59cf --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-12-0.8.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-12.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-12.font new file mode 100644 index 0000000..e6aac73 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-12.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-24-0.8.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-24-0.8.font new file mode 100644 index 0000000..4255b08 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-24-0.8.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-24.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-24.font new file mode 100644 index 0000000..c3e179b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-24.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-8-0.8.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-8-0.8.font new file mode 100644 index 0000000..f51f225 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-8-0.8.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-8.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-8.font new file mode 100644 index 0000000..ba3ac2e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/gui/bluehighway-8.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/trainer/InstructionText-Start.png b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/trainer/InstructionText-Start.png new file mode 100644 index 0000000..f735104 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/resources/trainer/InstructionText-Start.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/shooter.conf b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/shooter.conf new file mode 100644 index 0000000..fe78562 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/shooter.conf @@ -0,0 +1 @@ +SSVEP_ApplicationType = shooter diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/trainer.conf b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/trainer.conf new file mode 100644 index 0000000..d6a8c51 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/share/trainer.conf @@ -0,0 +1,17 @@ +SSVEP_ApplicationType = trainer + +SSVEP_TargetCount = 4 +SSVEP_TargetWidth = 0.3 +SSVEP_TargetHeight = 0.3 + +SSVEP_Target_X_0 = 0.0 +SSVEP_Target_Y_0 = 0.0 + +SSVEP_Target_X_1 = 0.0 +SSVEP_Target_Y_1 = 0.5 + +SSVEP_Target_X_2 = -0.4 +SSVEP_Target_Y_2 = 0.0 + +SSVEP_Target_X_3 = 0.4 +SSVEP_Target_Y_3 = 0.0 diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/signals/bci-ssvep-training.ov b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/signals/bci-ssvep-training.ov new file mode 100644 index 0000000..8c85425 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/signals/bci-ssvep-training.ov differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCCommandShipControl.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCCommandShipControl.cpp new file mode 100644 index 0000000..0592acf --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCCommandShipControl.cpp @@ -0,0 +1,32 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovassvepCCommandShipControl.h" +#include "ovassvepCShooterApplication.h" + +namespace OpenViBE { +namespace SSVEP { + +CCommandShipControl::CCommandShipControl(CShooterApplication* application) : ICommandVRPNButton(application, "SSVEP_VRPN_ShipControl") {} + +void CCommandShipControl::execute(const int button, const int /*state*/) +{ + CShooterApplication* shooterApplication = dynamic_cast(m_application); + + switch (button) + { + case 0: + shooterApplication->getShip()->shoot(); + break; + case 1: + shooterApplication->getShip()->rotate(-6); + break; + case 2: + shooterApplication->getShip()->rotate(6); + break; + default: break; + } +} + +} // namespace SSVEP +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCCommandShipControl.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCCommandShipControl.h new file mode 100644 index 0000000..1c7a67b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCCommandShipControl.h @@ -0,0 +1,18 @@ +#pragma once + +#include "../ovassvepICommandVRPNButton.h" + +namespace OpenViBE { +namespace SSVEP { +class CShooterApplication; + +class CCommandShipControl final : public ICommandVRPNButton +{ +public: + explicit CCommandShipControl(CShooterApplication* application); + ~CCommandShipControl() override {} + + void execute(const int button, const int state) override; +}; +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCCommandTargetControl.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCCommandTargetControl.cpp new file mode 100644 index 0000000..3555215 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCCommandTargetControl.cpp @@ -0,0 +1,44 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovassvepCCommandTargetControl.h" +#include "ovassvepCShooterApplication.h" + +namespace OpenViBE { +namespace SSVEP { + +CCommandTargetControl::CCommandTargetControl(CShooterApplication* application) + : ICommandVRPNButton(application, "SSVEP_VRPN_ShooterTarget") +{ + m_vrpnServer = CVRPNServer::getInstance(application); + m_vrpnServer->addButton("SSVEP_VRPN_TargetRequest", 1); +} + +void CCommandTargetControl::processFrame() +{ + CShooterApplication* application = dynamic_cast(m_application); + + ICommandVRPNButton::processFrame(); + + if (application->m_TargetRequest) + { + m_application->getLogManager() << Kernel::LogLevel_Info << "Requesting target\n"; + m_vrpnServer->changeButtonState("SSVEP_VRPN_TargetRequest", 0, 1); + application->m_TargetRequest = false; + } + else { m_vrpnServer->changeButtonState("SSVEP_VRPN_TargetRequest", 0, 0); } + + m_vrpnServer->processFrame(); +} + +void CCommandTargetControl::execute(const int button, const int state) +{ + if (state == 1) + { + m_application->getLogManager() << Kernel::LogLevel_Info << "Target created at position " << button << "\n"; + dynamic_cast(m_application)->addTarget(button); + } +} + +} // namespace SSVEP +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCCommandTargetControl.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCCommandTargetControl.h new file mode 100644 index 0000000..712e70c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCCommandTargetControl.h @@ -0,0 +1,23 @@ +#pragma once + +#include "../ovassvepICommandVRPNButton.h" +#include "../ovassvepCVRPNServer.h" + +namespace OpenViBE { +namespace SSVEP { +class CShooterApplication; + +class CCommandTargetControl final : public ICommandVRPNButton +{ +public: + explicit CCommandTargetControl(CShooterApplication* application); + ~CCommandTargetControl() override {} + + void execute(const int button, const int state) override; + void processFrame() override; + +private: + CVRPNServer* m_vrpnServer = nullptr; +}; +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCShooterApplication.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCShooterApplication.cpp new file mode 100644 index 0000000..b0657f2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCShooterApplication.cpp @@ -0,0 +1,114 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovassvepCShooterApplication.h" + +#include "../ovassvepCCommandStartStop.h" +#include "../ovassvepCCommandStimulatorControl.h" +#include "ovassvepCCommandTargetControl.h" +#include "ovassvepCCommandShipControl.h" + +namespace OpenViBE { +namespace SSVEP { + +#if !((CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8)) +namespace CEGUI +{ + typedef CEGUI::UVector2 USize; +}; +#endif + +CShooterApplication::~CShooterApplication() +{ + (*m_logManager) << Kernel::LogLevel_Debug << "- m_ship\n"; + delete m_ship; +} + +bool CShooterApplication::setup(Kernel::IKernelContext* kernelCtx) +{ + if (!CApplication::setup(kernelCtx)) + { + // If setup failed, logmanager may be in an unusable state, use cout + std::cout << "Error: Base application setup failed\n"; + return false; + } + + // Create the StarShip object + (*m_logManager) << Kernel::LogLevel_Debug << "+ m_ship = new CStarShip(...)\n"; + m_ship = new CStarShip(this, m_sceneNode, 0.3F, &m_oFrequencies); + + // Initialize the Target class + + CShooterTarget::initialize(m_painter, m_sceneNode); + + // draw the initial text + + m_instructionsReady = m_guiManager->createWindow("TaharezLook/StaticImage", "InstructionsReady"); + m_instructionsReady->setPosition(CEGUI::UVector2(cegui_reldim(0.0F), cegui_reldim(0.0F))); + m_instructionsReady->setSize(CEGUI::USize(CEGUI::UDim(0.0F, 640.F), CEGUI::UDim(0.0F, 32.F))); + +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) + m_sheet->addChild(m_instructionsReady); + CEGUI::ImageManager::getSingleton().addFromImageFile("InstructionsReady", "InstructionText-Start.png"); + m_instructionsReady->setProperty("Image", "InstructionsReady"); +#else + m_sheet->addChildWindow(m_instructionsReady); + CEGUI::ImagesetManager::getSingleton().createFromImageFile("InstructionsReady", "InstructionText-Start.png"); + m_instructionsReady->setProperty("Image", "set:InstructionsReady image:full_image"); +#endif + + m_instructionsReady->setProperty("FrameEnabled", "False"); + m_instructionsReady->setProperty("BackgroundEnabled", "False"); + m_instructionsReady->setVisible(true); + + // Create commands + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandStartStop(...)\n"; + this->addCommand(new CCommandStartStop(this)); + + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandStimulatorControl(...))\n"; + this->addCommand(new CCommandStimulatorControl(this)); + + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandTargetControl(...)\n"; + this->addCommand(new CCommandTargetControl(this)); + + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandShipControl(...))\n"; + this->addCommand(new CCommandShipControl(this)); + + return true; +} + +void CShooterApplication::processFrame(const size_t frame) +{ + CApplication::processFrame(frame); + m_ship->processFrame(frame); + + if (m_ship->isShooting()) + { + for (auto it = m_targets.begin(); it != m_targets.end(); ++it) + { + if ((*it)->collidesWith(m_ship->getShotCoordinates())) + { + delete *it; + m_targets.erase(it); + m_TargetRequest = true; + break; + } + } + } +} + +void CShooterApplication::addTarget(const size_t targetPosition) +{ + m_targets.push_back(CShooterTarget::createTarget(Ogre::Radian(Ogre::Math::PI * 2 / 360 * 45 * targetPosition))); +} + +void CShooterApplication::startExperiment() +{ + m_TargetRequest = true; + CApplication::startExperiment(); + + m_instructionsReady->setVisible(false); +} + +} // namespace SSVEP +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCShooterApplication.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCShooterApplication.h new file mode 100644 index 0000000..c710e7b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCShooterApplication.h @@ -0,0 +1,33 @@ +#pragma once + +#include +#include + +#include "../ovassvepCApplication.h" +#include "ovassvepCShooterTarget.h" +#include "ovassvepCStarShip.h" + +namespace OpenViBE { +namespace SSVEP { +class CShooterApplication final : public CApplication +{ +public: + CShooterApplication() : CApplication() {} + ~CShooterApplication() override; + + bool setup(Kernel::IKernelContext* kernelCtx) override; + CStarShip* getShip() const { return m_ship; } + void startExperiment() override; + void addTarget(size_t targetPosition); + + bool m_TargetRequest = false; + +private: + void processFrame(const size_t frame) override; + + CEGUI::Window* m_instructionsReady = nullptr; + CStarShip* m_ship = nullptr; + std::vector m_targets; +}; +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCShooterTarget.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCShooterTarget.cpp new file mode 100644 index 0000000..a6c5eea --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCShooterTarget.cpp @@ -0,0 +1,57 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovassvepCShooterTarget.h" + +namespace OpenViBE { +namespace SSVEP { + +Ogre::SceneNode* CShooterTarget::m_parentNode = nullptr; +CBasicPainter* CShooterTarget::m_painter = nullptr; + +void CShooterTarget::initialize(CBasicPainter* painter, Ogre::SceneNode* parentNode) +{ + m_painter = painter; + m_parentNode = parentNode; +} + +CShooterTarget* CShooterTarget::createTarget(const Ogre::Radian angle) +{ + if (m_painter == nullptr) + { + std::cerr << "The CShooterTarget was not initialized" << std::endl; + return nullptr; + } + + return new CShooterTarget(angle); +} + +CShooterTarget::CShooterTarget(const Ogre::Radian angle) +{ + m_targetNode = m_parentNode->createChildSceneNode(); + + + Ogre::MovableObject* targetObject = m_painter->paintCircle(0.0F, 1.0F - 1.0F * SSVEP_SHOOTER_TARGET_SIZE, SSVEP_SHOOTER_TARGET_SIZE, + Ogre::ColourValue(1.0F, 1.0F, 1.0F)); + targetObject->setVisible(true); + m_targetNode->attachObject(targetObject); + + m_targetNode->roll(angle); +} + +CShooterTarget::~CShooterTarget() +{ + m_targetNode->removeAndDestroyAllChildren(); + m_targetNode->getCreator()->destroySceneNode(m_targetNode); +} + +bool CShooterTarget::collidesWith(const std::pair point) const +{ + const Ogre::Radian theta = (m_targetNode->getOrientation()).getRoll(); + const Ogre::Real targetDist = 1.0F - 2 * SSVEP_SHOOTER_TARGET_SIZE; + const Ogre::Real dist = sqrt(pow(point.first + Ogre::Math::Sin(theta) * targetDist, 2) + pow(point.second - Ogre::Math::Cos(theta) * targetDist, 2)); + return dist <= SSVEP_SHOOTER_TARGET_SIZE; +} + +} // namespace SSVEP +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCShooterTarget.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCShooterTarget.h new file mode 100644 index 0000000..050db5c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCShooterTarget.h @@ -0,0 +1,29 @@ +#pragma once + +#include + +#include "../ovassvepCBasicPainter.h" + +#define SSVEP_SHOOTER_TARGET_SIZE 0.15f + +namespace OpenViBE { +namespace SSVEP { +class CShooterTarget +{ +public: + static CShooterTarget* createTarget(Ogre::Radian angle); + static void initialize(CBasicPainter* painter, Ogre::SceneNode* parentNode); + ~CShooterTarget(); + + bool collidesWith(std::pair point) const; + +private: + static Ogre::SceneNode* m_parentNode; + static CBasicPainter* m_painter; + + Ogre::SceneNode* m_targetNode = nullptr; + + explicit CShooterTarget(Ogre::Radian angle); +}; +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCStarShip.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCStarShip.cpp new file mode 100644 index 0000000..cbc43b4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCStarShip.cpp @@ -0,0 +1,152 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovassvepCStarShip.h" + +#include "../ovassvepCApplication.h" +#include "../ovassvepCSSVEPFlickeringObject.h" + +#define SSVEP_SHIP_HULL_COLOUR Ogre::ColourValue(0.0F, 0.5F, 0.5F) +#define SIGN(x) ( (x) < 0 ? -1 : 1 ) + +namespace OpenViBE { +namespace SSVEP { + +CStarShip::CStarShip(CApplication* application, Ogre::SceneNode* parentNode, const Ogre::Real radius, std::vector>* frequencies) +{ + // get configuration and controlling objects + Kernel::IConfigurationManager* configManager = application->getConfigurationManager(); + CBasicPainter* painter = application->getPainter(); + m_angularSpeed = Ogre::Real(configManager->expandAsFloat( + "${SSVEP_ShipAngularSpeed}", Ogre::Math::PI / 60.0F)); + application->getLogManager() << Kernel::LogLevel_Info << "Ship Angluar Speed : " << m_angularSpeed << "\n"; + + const Ogre::ColourValue lightColor = Ogre::ColourValue(float(configManager->expandAsFloat("${SSVEP_TargetLightColourRed}", 1.0F)), + float(configManager->expandAsFloat("${SSVEP_TargetLightColourGreen}", 1.0F)), + float(configManager->expandAsFloat("${SSVEP_TargetLightColourBlue}", 1.0F))); + + const Ogre::ColourValue darkColor = Ogre::ColourValue(float(configManager->expandAsFloat("${SSVEP_TargetDarkColourRed}", 0.0F)), + float(configManager->expandAsFloat("${SSVEP_TargetDarkColourGreen}", 0.0F)), + float(configManager->expandAsFloat("${SSVEP_TargetDarkColourBlue}", 0.0F))); + + + // draw the ship scene objects + m_shipNode = parentNode->createChildSceneNode(); + m_shotNode = m_shipNode->createChildSceneNode(); + + Ogre::MovableObject* shipHull = painter->paintCircle(0.0F, 0.0F, radius, SSVEP_SHIP_HULL_COLOUR, false, 2); + m_shipNode->attachObject(shipHull); + shipHull->setVisible(true); + + + // Ogre::RealRect wingRectangle = { - radius * 0.4f, radius * 0.4f, radius * 0.4f, -radius * 0.4f }; + const Ogre::RealRect wingRectangle(-radius * 0.4F, radius * 0.4F, radius * 0.4F, -radius * 0.4F); + + // paint the cannon + + Ogre::SceneNode* drawnObjectNode = m_shipNode->createChildSceneNode(); + + Ogre::MovableObject* drawnObject = painter->paintTriangle(Point(0.0F, radius * 0.4F), Point(- radius * 0.4F, -radius * 0.4F), + Point(radius * 0.4F, -radius * 0.4F), lightColor); + drawnObject->setVisible(true); + drawnObjectNode->attachObject(drawnObject); + + drawnObject = painter->paintTriangle(Point(0.0F, radius * 0.4F), Point(- radius * 0.4F, -radius * 0.4F), Point(radius * 0.4F, -radius * 0.4F), darkColor); + drawnObject->setVisible(false); + drawnObjectNode->attachObject(drawnObject); + + drawnObjectNode->setPosition(0.0, radius, 0.0); + + m_shipCannon = new CSSVEPFlickeringObject(drawnObjectNode, (*frequencies)[1].first, (*frequencies)[1].second); + + // paint the left wing + + drawnObjectNode = m_shipNode->createChildSceneNode(); + + drawnObject = painter->paintRectangle(wingRectangle, lightColor); + drawnObject->setVisible(true); + drawnObjectNode->attachObject(drawnObject); + + drawnObject = painter->paintRectangle(wingRectangle, darkColor); + drawnObject->setVisible(false); + drawnObjectNode->attachObject(drawnObject); + + drawnObjectNode->setPosition(-radius * 0.875F, -radius * 0.875F, 0.0); + + m_shipLeftWing = new CSSVEPFlickeringObject(drawnObjectNode, (*frequencies)[2].first, (*frequencies)[2].second); + + // paint the right wing + + drawnObjectNode = m_shipNode->createChildSceneNode(); + + drawnObject = painter->paintRectangle(wingRectangle, lightColor); + drawnObject->setVisible(true); + drawnObjectNode->attachObject(drawnObject); + + drawnObject = painter->paintRectangle(wingRectangle, darkColor); + drawnObject->setVisible(false); + drawnObjectNode->attachObject(drawnObject); + + drawnObjectNode->setPosition(radius * 0.875F, -radius * 0.875F, 0.0F); + + m_shipRightWing = new CSSVEPFlickeringObject(drawnObjectNode, (*frequencies)[3].first, (*frequencies)[3].second); + + // create the shot + + drawnObject = painter->paintTriangle(Point(0.0F, radius * 0.25F), Point(-radius * 0.125F, 0.0F), Point(radius * 0.125F, 0.0F), + Ogre::ColourValue(1.0F, 1.0F, 0.0F)); + drawnObject->setVisible(false); + + m_shotNode->attachObject(drawnObject); + + drawnObject = painter->paintTriangle(Point(-radius * 0.125F, 0.0F), Point(0.0F, -radius * 0.75F), Point(radius * 0.125F, 0.0F), + Ogre::ColourValue(1.0F, 1.0F, 0.0F)); + drawnObject->setVisible(false); + + m_shotNode->attachObject(drawnObject); +} + +void CStarShip::processFrame(const size_t /*currentFrame*/) +{ + m_shipCannon->processFrame(); + m_shipLeftWing->processFrame(); + m_shipRightWing->processFrame(); + + if (m_nCurrentRotation != 0) + { + m_shipNode->roll(Ogre::Radian(m_angularSpeed * SIGN(m_nCurrentRotation))); + m_currentAngle += Ogre::Radian(m_angularSpeed * SIGN(m_nCurrentRotation)); + m_nCurrentRotation -= SIGN(m_nCurrentRotation); + } + + if (m_isShooting) + { + m_shotDistance += 0.07F; + m_shotNode->setPosition(0.0, m_shotDistance, 0.0); + + if (m_shotDistance > 1.5F) + { + m_isShooting = false; + m_shotNode->setVisible(false); + } + } +} + +void CStarShip::shoot() +{ + if (m_isShooting) { return; } + + m_isShooting = true; + m_shotDistance = 0.0F; + + m_shotNode->setPosition(0.0F, 0.0F, 0.0F); + m_shotNode->setVisible(true); +} + +std::pair CStarShip::getShotCoordinates() const +{ + return std::make_pair(-Ogre::Math::Sin(m_currentAngle) * m_shotDistance, Ogre::Math::Cos(m_currentAngle) * m_shotDistance); +} + +} // namespace SSVEP +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCStarShip.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCStarShip.h new file mode 100644 index 0000000..da14802 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Shooter/ovassvepCStarShip.h @@ -0,0 +1,39 @@ +#pragma once + +#include + +#include +#include + +namespace OpenViBE { +namespace SSVEP { +class CApplication; +class CSSVEPFlickeringObject; + +class CStarShip +{ +public: + CStarShip(CApplication* application, Ogre::SceneNode* parentNode, Ogre::Real radius, std::vector>* frequencies); + void processFrame(const size_t currentFrame); + void rotate(const int nRotation) { m_nCurrentRotation += nRotation; } + bool isShooting() const { return m_isShooting; } + void shoot(); + std::pair getShotCoordinates() const; + +private: + Ogre::SceneNode* m_shipNode = nullptr; + + CSSVEPFlickeringObject* m_shipCannon = nullptr; + CSSVEPFlickeringObject* m_shipLeftWing = nullptr; + CSSVEPFlickeringObject* m_shipRightWing = nullptr; + + Ogre::Real m_angularSpeed; + Ogre::Radian m_currentAngle; + int m_nCurrentRotation = 0; + + Ogre::SceneNode* m_shotNode = nullptr; + bool m_isShooting = false; + Ogre::Real m_shotDistance = 0.0F; +}; +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Trainer/ovassvepCCommandReceiveTarget.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Trainer/ovassvepCCommandReceiveTarget.h new file mode 100644 index 0000000..3ecd2a6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Trainer/ovassvepCCommandReceiveTarget.h @@ -0,0 +1,19 @@ +#pragma once + +#include "../ovassvepICommandVRPNButton.h" +#include "ovassvepCTrainerApplication.h" + +namespace OpenViBE { +namespace SSVEP { +class CTrainerApplication; + +class CCommandReceiveTarget final : public ICommandVRPNButton +{ +public: + explicit CCommandReceiveTarget(CApplication* application) : ICommandVRPNButton(application, "SSVEP_VRPN_Target") {} + ~CCommandReceiveTarget() override { } + + void execute(const int button, const int state) override { dynamic_cast(m_application)->setTarget(button); } +}; +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Trainer/ovassvepCTrainerApplication.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Trainer/ovassvepCTrainerApplication.cpp new file mode 100644 index 0000000..38c7e36 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Trainer/ovassvepCTrainerApplication.cpp @@ -0,0 +1,125 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovassvepCTrainerApplication.h" + +#include "../ovassvepCCommandStartStop.h" +#include "../ovassvepCCommandStimulatorControl.h" +#include "ovassvepCCommandReceiveTarget.h" + +namespace OpenViBE { +namespace SSVEP { + +#if !((CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8)) +namespace CEGUI +{ + typedef CEGUI::UVector2 USize; +}; +#endif + +bool CTrainerApplication::setup(Kernel::IKernelContext* kernelCtx) +{ + if (!CApplication::setup(kernelCtx)) { return false; } + + (*m_logManager) << Kernel::LogLevel_Debug << " * CTrainerApplication::setup()\n"; + + Kernel::IConfigurationManager* configManager = &(m_kernelCtx->getConfigurationManager()); + + CTrainerFlickeringObject::initialize(this); + + // paint targets + + const size_t nTarget = size_t(configManager->expandAsUInteger("${SSVEP_TargetCount}")); + + for (size_t i = 0; i < nTarget; ++i) { this->addObject(CTrainerFlickeringObject::createTrainerFlickeringObject(i)); } + + // draw the initial text + m_instructionsReady = m_guiManager->createWindow("TaharezLook/StaticImage", "InstructionsReady"); + m_instructionsReady->setPosition(CEGUI::UVector2(cegui_reldim(0.0F), cegui_reldim(0.0F))); + m_instructionsReady->setSize(CEGUI::USize(CEGUI::UDim(0.0F, 640.F), CEGUI::UDim(0.0F, 32.F))); + +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) + m_sheet->addChild(m_instructionsReady); + CEGUI::ImageManager::getSingleton().addFromImageFile("InstructionsReady", "InstructionText-Start.png"); + m_instructionsReady->setProperty("Image", "InstructionsReady"); +#else + m_sheet->addChildWindow(m_instructionsReady); + CEGUI::ImagesetManager::getSingleton().createFromImageFile("InstructionsReady", "InstructionText-Start.png"); + m_instructionsReady->setProperty("Image", "set:InstructionsReady image:full_image"); +#endif + + + m_instructionsReady->setProperty("FrameEnabled", "False"); + m_instructionsReady->setProperty("BackgroundEnabled", "False"); + m_instructionsReady->setVisible(true); + + + // initialize commands + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandStartStop(...)\n"; + this->addCommand(new CCommandStartStop(this)); + + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandStimulatorControl(...))\n"; + this->addCommand(new CCommandStimulatorControl(this)); + + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CC(...))\n"; + this->addCommand(new CCommandReceiveTarget(this)); + + (*m_logManager) << Kernel::LogLevel_Debug << " * CTrainerApplication::setup() completed successfully\n"; + + return true; +} + + +void CTrainerApplication::processFrame(const size_t frame) +{ + CApplication::processFrame(frame); + + if (!m_active) { return; } + + for (size_t i = 0; i < m_oObjects.size(); ++i) { m_oObjects[i]->processFrame(); } +} + +void CTrainerApplication::addObject(CTrainerFlickeringObject* obj) +{ + m_oObjects.push_back(obj); + obj->setVisible(true); +} + +void CTrainerApplication::setTarget(const int target) +{ + const size_t currentTime = int(time(nullptr) - m_ttStartTime); + (*m_logManager) << Kernel::LogLevel_Info << currentTime << " > Target set to " << target << "\n"; + + for (int i = 0; i < int(m_oObjects.size()); ++i) { m_oObjects[i]->setTarget(target == i); } +} + +void CTrainerApplication::startExperiment() +{ + CApplication::startExperiment(); + + m_ttStartTime = time(nullptr); + + this->stopFlickering(); + m_instructionsReady->setVisible(false); +} + +void CTrainerApplication::startFlickering() +{ + const size_t currentTime = size_t(time(nullptr) - m_ttStartTime); + (*m_logManager) << Kernel::LogLevel_Info << currentTime << " > Starting Visual Stimulation\n"; + m_active = true; +} + +void CTrainerApplication::stopFlickering() +{ + const size_t currentTime = size_t(time(nullptr) - m_ttStartTime); + (*m_logManager) << Kernel::LogLevel_Info << currentTime << " > Stopping Visual Stimulation\n"; + m_active = false; + + for (size_t i = 0; i < m_oObjects.size(); ++i) { m_oObjects[i]->setVisible(true); } + + this->setTarget(-1); +} + +} // namespace SSVEP +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Trainer/ovassvepCTrainerApplication.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Trainer/ovassvepCTrainerApplication.h new file mode 100644 index 0000000..696b567 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Trainer/ovassvepCTrainerApplication.h @@ -0,0 +1,36 @@ +#pragma once + +#include + +#include "../ovassvepCApplication.h" +#include "ovassvepCTrainerFlickeringObject.h" + +namespace OpenViBE { +namespace SSVEP { +class CTrainerApplication final : public CApplication +{ +public: + CTrainerApplication() : CApplication() {} + ~CTrainerApplication() override {} + + bool setup(Kernel::IKernelContext* kernelCtx) override; + void setTarget(int target); + + void startExperiment() override; + void startFlickering() override; + void stopFlickering() override; + + +private: + bool m_active = false; + void processFrame(const size_t frame) override; + void addObject(CTrainerFlickeringObject* obj); + + std::vector m_oObjects; + + time_t m_ttStartTime = 0; + + CEGUI::Window* m_instructionsReady = nullptr; +}; +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Trainer/ovassvepCTrainerFlickeringObject.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Trainer/ovassvepCTrainerFlickeringObject.cpp new file mode 100644 index 0000000..e1d85cc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Trainer/ovassvepCTrainerFlickeringObject.cpp @@ -0,0 +1,91 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovassvepCTrainerFlickeringObject.h" +#include "ovassvepCTrainerApplication.h" + +namespace OpenViBE { +namespace SSVEP { + +Ogre::SceneNode* CTrainerFlickeringObject::m_parentNode = nullptr; +CBasicPainter* CTrainerFlickeringObject::m_painter = nullptr; +Ogre::ColourValue CTrainerFlickeringObject::m_lightColor = Ogre::ColourValue(1.0F, 1.0F, 1.0F); +Ogre::ColourValue CTrainerFlickeringObject::m_darkColor = Ogre::ColourValue(0.0F, 0.0F, 0.0F); +float CTrainerFlickeringObject::m_targetWidth = 0.2F; +float CTrainerFlickeringObject::m_targetHeight = 0.2F; +CTrainerApplication* CTrainerFlickeringObject::m_application = nullptr; + +void CTrainerFlickeringObject::initialize(CTrainerApplication* application) +{ + m_application = application; + Kernel::IConfigurationManager* configManager = application->getConfigurationManager(); + + m_painter = application->getPainter(); + m_parentNode = application->getSceneNode(); + + m_targetWidth = float(configManager->expandAsFloat("${SSVEP_TargetWidth}")); + m_targetHeight = float(configManager->expandAsFloat("${SSVEP_TargetHeight}")); + + m_lightColor = Ogre::ColourValue(float(configManager->expandAsFloat("${SSVEP_TargetLightColourRed}")), + float(configManager->expandAsFloat("${SSVEP_TargetLightColourGreen}")), + float(configManager->expandAsFloat("${SSVEP_TargetLightColourBlue}"))); + + m_darkColor = Ogre::ColourValue(float(configManager->expandAsFloat("${SSVEP_TargetDarkColourRed}")), + float(configManager->expandAsFloat("${SSVEP_TargetDarkColourGreen}")), + float(configManager->expandAsFloat("${SSVEP_TargetDarkColourBlue}"))); +} + +CTrainerFlickeringObject* CTrainerFlickeringObject::createTrainerFlickeringObject(const size_t targetId) +{ + Kernel::IConfigurationManager* configManager = m_application->getConfigurationManager(); + + if (m_painter != nullptr) + { + const Ogre::ColourValue currentTargetColour = (targetId == 0) ? m_darkColor : m_lightColor; + + const CIdentifier id = configManager->createConfigurationToken("SSVEPTarget_Id", std::to_string(targetId).c_str()); + + const float targetX = float(configManager->expandAsFloat("${SSVEP_Target_X_${SSVEPTarget_Id}}")); + const float targetY = float(configManager->expandAsFloat("${SSVEP_Target_Y_${SSVEPTarget_Id}}")); + const size_t framesL = (*(m_application->getFrequencies()))[targetId].first; + const size_t framesD = (*(m_application->getFrequencies()))[targetId].second; + + m_application->getLogManager() << Kernel::LogLevel_Info << "New trainer object : id=" << targetId << " litFrames=" << framesL << + " darkFrames=" << framesD << "\n"; + + configManager->releaseConfigurationToken(id); + + return new CTrainerFlickeringObject(targetX, targetY, currentTargetColour, uint8_t(framesL), uint8_t(framesD)); + } + m_application->getLogManager() << Kernel::LogLevel_Fatal << "TrainerTarget object was not properly initialized\n"; + return nullptr; +} + +CTrainerFlickeringObject::CTrainerFlickeringObject(const float posX, const float posY, const Ogre::ColourValue colour, const uint8_t litFrames, + const uint8_t darkFrames) + : CSSVEPFlickeringObject(nullptr, litFrames, darkFrames) +{ + m_elementNode = m_parentNode->createChildSceneNode(); + m_objectNode = m_elementNode->createChildSceneNode(); + Ogre::SceneNode* pointerNode = m_elementNode->createChildSceneNode(); + + const Ogre::RealRect rectangle(posX - m_targetWidth / 2, posY + m_targetHeight / 2, posX + m_targetWidth / 2, posY - m_targetHeight / 2); + + Ogre::MovableObject* litObject = m_painter->paintRectangle(rectangle, colour); + + m_objectNode->attachObject(litObject); + litObject->setVisible(true); + + Ogre::MovableObject* darkObject = m_painter->paintRectangle(rectangle, m_darkColor); + m_objectNode->attachObject(darkObject); + darkObject->setVisible(false); + + m_pointer = m_painter->paintTriangle(Point(posX - 0.05F, posY + m_targetHeight), Point(posX, posY + m_targetHeight - 0.05F), + Point(posX + 0.05F, posY + m_targetHeight), Ogre::ColourValue(1, 1, 0)); + + pointerNode->attachObject(m_pointer); + m_pointer->setVisible(false); +} + +} // namespace SSVEP +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Trainer/ovassvepCTrainerFlickeringObject.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Trainer/ovassvepCTrainerFlickeringObject.h new file mode 100644 index 0000000..959a8dc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/Trainer/ovassvepCTrainerFlickeringObject.h @@ -0,0 +1,40 @@ +#pragma once + +#include +#include +#include + +#include "../ovassvepCSSVEPFlickeringObject.h" +#include "../ovassvepCBasicPainter.h" + +namespace OpenViBE { +namespace SSVEP { +class CTrainerApplication; + +class CTrainerFlickeringObject final : public CSSVEPFlickeringObject +{ +public: + static CTrainerFlickeringObject* createTrainerFlickeringObject(size_t targetId); + static void initialize(CTrainerApplication* application); + + static void connectToNode(Ogre::SceneNode* /*sceneNode*/) { } + void setTarget(const bool isTarget) const { m_pointer->setVisible(isTarget); } + bool isTarget() const { return m_pointer->getVisible(); } + +private: + static CTrainerApplication* m_application; + static Ogre::SceneNode* m_parentNode; + static CBasicPainter* m_painter; + static float m_targetWidth; + static float m_targetHeight; + static Ogre::ColourValue m_lightColor; + static Ogre::ColourValue m_darkColor; + + CTrainerFlickeringObject(float posX, float posY, Ogre::ColourValue colour, uint8_t litFrames, uint8_t darkFrames); + + + Ogre::SceneNode* m_elementNode = nullptr; + Ogre::MovableObject* m_pointer = nullptr; +}; +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCApplication.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCApplication.cpp new file mode 100644 index 0000000..8687834 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCApplication.cpp @@ -0,0 +1,286 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovassvepCApplication.h" +#include + +#include "fs/Files.h" + +namespace OpenViBE { +namespace SSVEP { + +#define MIN(a,b) ( (a) < (b) ? (a) : (b) ) + +//--------------------------------------------------------------------------------------------------- +CApplication::~CApplication() +{ + if (m_painter != nullptr) + { + (*m_logManager) << Kernel::LogLevel_Debug << "- m_painter\n"; + delete m_painter; + m_painter = nullptr; + } + + for (auto it = m_oCommands.begin(); + it != m_oCommands.end(); ++it) + { + (*m_logManager) << Kernel::LogLevel_Debug << "- ICommand\n"; + if (*it != nullptr) + { + delete *it; + *it = nullptr; + } + } + + + (*m_logManager) << Kernel::LogLevel_Debug << "- m_root\n"; + if (m_root != nullptr) + { + delete m_root; + m_root = nullptr; + } +} + +//--------------------------------------------------------------------------------------------------- +bool CApplication::setup(Kernel::IKernelContext* poKernelContext) +{ + m_kernelCtx = poKernelContext; + m_logManager = &(m_kernelCtx->getLogManager()); + + Kernel::IConfigurationManager* configurationManager = &(m_kernelCtx->getConfigurationManager()); + + (*m_logManager) << Kernel::LogLevel_Debug << " * CApplication::setup()\n"; + + // Plugin config path setup + const CString pluginsPath = configurationManager->expand("${Kernel_3DVisualizationOgrePlugins}"); + + // Create LogManager to stop Ogre flooding the console and creating random files + (*m_logManager) << Kernel::LogLevel_Info << "Ogre plugins path is " << pluginsPath << "\n"; + + (*m_logManager) << Kernel::LogLevel_Debug << "+ Creating Ogre logmanager\n"; + Ogre::LogManager* logManager = new Ogre::LogManager(); + (*m_logManager) << Kernel::LogLevel_Info << "Ogre log to console : " << configurationManager->expandAsBoolean("${SSVEP_Ogre_LogToConsole}", false) + << "\n"; + const CString ogreLog = configurationManager->expand("${Path_Log}") + "/openvibe-ssvep-demo-ogre.log"; + (*m_logManager) << Kernel::LogLevel_Info << "Ogre log file : " << ogreLog << "\n"; + FS::Files::createParentPath(ogreLog); + logManager->createLog(ogreLog.toASCIIString(), true, configurationManager->expandAsBoolean("${SSVEP_Ogre_LogToConsole}", false), false); + + // Root creation + const CString ogreCfg = configurationManager->expand("${Path_UserData}") + "/openvibe-ssvep-demo-ogre.cfg"; + (*m_logManager) << Kernel::LogLevel_Debug << "+ m_root = new Ogre::Root(...)\n"; + (*m_logManager) << Kernel::LogLevel_Info << "Ogre cfg file : " << ogreCfg << "\n"; + m_root = new Ogre::Root(pluginsPath.toASCIIString(), ogreCfg.toASCIIString(), ogreLog.toASCIIString()); + + // Resource handling + setupResources(); + + // Configuration from file or dialog window if needed + if (!configure()) + { + (*m_logManager) << Kernel::LogLevel_Fatal << "The configuration process ended unexpectedly.\n"; + return false; + } + + // m_window = m_root->initialise(true); + + + Ogre::NameValuePairList optionList; + m_root->initialise(false); + + optionList["vsync"] = "1"; + + m_window = m_root->createRenderWindow("SSVEP Stimulator", 640, 480, configurationManager->expandAsBoolean("${SSVEP_Ogre_FullScreen}", false), &optionList); + m_windowWidth = m_window->getWidth(); + m_windowHeight = m_window->getHeight(); + + m_sceneManager = m_root->createSceneManager(Ogre::ST_GENERIC); + m_camera = m_sceneManager->createCamera("SSVEPApplicationCamera"); + + Ogre::SceneManager* fillSceneManager = m_root->createSceneManager(Ogre::ST_GENERIC); + Ogre::Camera* fillCamera = fillSceneManager->createCamera("SSVEPFillCamera"); + m_window->addViewport(fillCamera, 0); + + m_viewport = m_window->addViewport(m_camera, 1); + this->resizeViewport(); + // m_viewport->setBackgroundColour(Ogre::ColourValue(0.0, 0.5, 0.5)); + + m_camera->setAspectRatio(Ogre::Real(m_viewport->getActualWidth()) / Ogre::Real(m_viewport->getActualHeight())); + + m_sceneNode = m_sceneManager->getRootSceneNode()->createChildSceneNode("SSVEPApplicationNode"); + + // initialize the painter object + (*m_logManager) << Kernel::LogLevel_Debug << "+ m_painter = new CBasicPainter(...)\n"; + m_painter = new CBasicPainter(this); + + (*m_logManager) << Kernel::LogLevel_Debug << " * initializing CEGUI\n"; + this->initCEGUI(configurationManager->expand("${Path_Log}") + "/openvibe-ssvep-demo-cegui.log"); + (*m_logManager) << Kernel::LogLevel_Debug << " * CEGUI initialized\n"; + + // create the vector of stimulation frequencies + + m_ScreenRefreshRate = double(configurationManager->expandAsUInteger("${SSVEP_ScreenRefreshRate}")); + + (*m_logManager) << Kernel::LogLevel_Info << "Specified screen refresh rate :" << m_ScreenRefreshRate << "Hz\n"; + + size_t i = 1; + + CIdentifier frequencyId = configurationManager->createConfigurationToken("SSVEP_FrequencyId", "1"); + + m_oFrequencies.push_back(std::pair(30, 30)); + + while (configurationManager->lookUpConfigurationTokenIdentifier(configurationManager->expand("SSVEP_Frequency_${SSVEP_FrequencyId}")) + != CIdentifier::undefined()) + { + std::pair frequency; + + double currentFrequency; + + currentFrequency = double(configurationManager->expandAsFloat("${SSVEP_Frequency_${SSVEP_FrequencyId}}")); + + const double approximatedFrameCount = m_ScreenRefreshRate / currentFrequency; + + if (fabs(approximatedFrameCount - floor(approximatedFrameCount + 0.5)) < 0.003) + { + frequency.first = int(floor(approximatedFrameCount + 0.5)) / 2 + int(floor(approximatedFrameCount + 0.5)) % 2; + frequency.second = int(floor(approximatedFrameCount + 0.5)) / 2; + + (*m_logManager) << Kernel::LogLevel_Info << "Frequency number " << i << ": " << currentFrequency << "Hz / " << floor(approximatedFrameCount + 0.5) + << " ( " << frequency.first << ", " << frequency.second << ") frames @ " << m_ScreenRefreshRate << "fps\n"; + + m_oFrequencies.push_back(frequency); + } + else { (*m_logManager) << Kernel::LogLevel_Error << "The selected frequency (" << currentFrequency << "Hz) is not supported by your screen.\n"; } + + configurationManager->releaseConfigurationToken(frequencyId); + + frequencyId = configurationManager->createConfigurationToken("SSVEP_FrequencyId", std::to_string(++i).c_str()); + } + + + return true; +} + +//--------------------------------------------------------------------------------------------------- +bool CApplication::configure() const +{ + if (! m_root->restoreConfig()) + { + if (! m_root->showConfigDialog()) + { + (*m_logManager) << Kernel::LogLevel_Error << "No configuration created from the dialog window.\n"; + return false; + } + } + + // Set hard-coded parameters, VSync in particular + m_root->getRenderSystem()->setConfigOption("VSync", "True"); + // m_root->getRenderSystem()->setConfigOption("Full Screen", "Yes"); + m_root->getRenderSystem()->setConfigOption("Video Mode", "640 x 480 @ 16-bit colour"); + + + return true; +} + +//--------------------------------------------------------------------------------------------------- +void CApplication::initCEGUI(const char* logFilename) +{ + // Instantiate logger before bootstrapping the system, this way we will be able to get the log redirected + if (!CEGUI::Logger::getSingletonPtr()) { new CEGUI::DefaultLogger(); } // singleton; instantiate only, no delete + (*m_logManager) << Kernel::LogLevel_Info << "+ CEGUI log will be in '" << logFilename << "'\n"; + FS::Files::createParentPath(logFilename); + CEGUI::Logger::getSingleton().setLogFilename(logFilename, false); + + (*m_logManager) << Kernel::LogLevel_Debug << "+ Creating CEGUI Ogre bootstrap\n"; + m_roGUIRenderer = &(CEGUI::OgreRenderer::bootstrapSystem(*m_window)); + (*m_logManager) << Kernel::LogLevel_Debug << "+ Creating CEGUI Scheme Manager\n"; + +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) + CEGUI::SchemeManager::getSingleton().createFromFile(const_cast(reinterpret_cast("TaharezLook-ov-0.8.scheme"))); +#else + CEGUI::SchemeManager::getSingleton().create(reinterpret_cast("TaharezLook-ov.scheme")); +#endif + + (*m_logManager) << Kernel::LogLevel_Debug << "+ Creating CEGUI WindowManager\n"; + m_guiManager = CEGUI::WindowManager::getSingletonPtr(); + m_sheet = m_guiManager->createWindow("DefaultWindow", "Sheet"); + + (*m_logManager) << Kernel::LogLevel_Debug << "+ Setting CEGUI StyleSheet\n"; + +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) + CEGUI::System::getSingleton().getDefaultGUIContext().setRootWindow(m_sheet); +#else + CEGUI::System::getSingleton().setGUISheet(m_sheet); +#endif +} + +//--------------------------------------------------------------------------------------------------- +void CApplication::resizeViewport() +{ + (*m_logManager) << Kernel::LogLevel_Trace << "Creating a new viewport\n"; + + const Ogre::uint32 size = MIN(m_windowWidth, m_windowHeight); + (*m_logManager) << Kernel::LogLevel_Info << "New viewport size : " << size << "\n"; + + m_viewport->setDimensions(Ogre::Real(m_windowWidth - size) / Ogre::Real(m_windowWidth) / 2, + Ogre::Real(m_windowHeight - size) / Ogre::Real(m_windowHeight) / 2, + Ogre::Real(size) / Ogre::Real(m_windowWidth), Ogre::Real(size) / Ogre::Real(m_windowHeight)); +} + +//--------------------------------------------------------------------------------------------------- +void CApplication::processFrame(const size_t /*currentFrame*/) +{ + if (m_windowWidth != m_window->getWidth() || m_windowHeight != m_window->getHeight()) + { + m_windowWidth = m_window->getWidth(); + m_windowHeight = m_window->getHeight(); + this->resizeViewport(); + } +} + +//--------------------------------------------------------------------------------------------------- +void CApplication::setupResources() +{ + Ogre::ResourceGroupManager::getSingleton().createResourceGroup("SSVEP"); + Ogre::ResourceGroupManager::getSingleton().addResourceLocation((Directories::getDataDir() + "/applications/ssvep-demo/resources").toASCIIString(), + "FileSystem", "SSVEP"); + Ogre::ResourceGroupManager::getSingleton().addResourceLocation((Directories::getDataDir() + "/applications/ssvep-demo/resources/trainer").toASCIIString(), + "FileSystem", "SSVEPTrainer"); + Ogre::ResourceGroupManager::getSingleton().addResourceLocation((Directories::getDataDir() + "/applications/ssvep-demo/resources/gui").toASCIIString(), + "FileSystem", "CEGUI"); + Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("SSVEP"); + Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("SSVEPTrainer"); + Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("CEGUI"); +} + +//--------------------------------------------------------------------------------------------------- +bool CApplication::frameStarted(const Ogre::FrameEvent& /*evt*/) +{ + ++m_currFrame; + m_currFrame = m_currFrame % int(m_ScreenRefreshRate); + this->processFrame(m_currFrame); + for (size_t i = 0; i < m_oCommands.size(); ++i) { m_oCommands[i]->processFrame(); } + return true; +} + +//--------------------------------------------------------------------------------------------------- +void CApplication::go() +{ + (*m_logManager) << Kernel::LogLevel_Debug << "Associating application as Ogre frame listener\n"; + + m_root->addFrameListener(this); + + (*m_logManager) << Kernel::LogLevel_Debug << "Entering Ogre rendering loop\n"; + m_root->startRendering(); + (*m_logManager) << Kernel::LogLevel_Debug << "Ogre rendering loop finished ... exiting\n"; +} + +//--------------------------------------------------------------------------------------------------- +void CApplication::stopExperiment() +{ + (*m_logManager) << Kernel::LogLevel_Info << "[!] Experiment halting\n"; + this->exit(); +} + +} // namespace SSVEP +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyOgre3D diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCApplication.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCApplication.h new file mode 100644 index 0000000..3fbe027 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCApplication.h @@ -0,0 +1,87 @@ +#pragma once + +#include "ovassvep_defines.h" + +#include +#include + +#include +#include +#include +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) +#include +#else +#include +#endif + +#include "ovassvepICommand.h" +#include "ovassvepCBasicPainter.h" + +namespace OpenViBE { +namespace SSVEP { +class CApplication : public Ogre::FrameListener, public Ogre::WindowEventListener +{ +public: + CApplication() {} + ~CApplication() override; + + void addCommand(ICommand* command) { m_oCommands.push_back(command); } + virtual bool setup(Kernel::IKernelContext* poKernelContext); + void go(); + + virtual void startExperiment() { (*m_logManager) << Kernel::LogLevel_Info << "[!] Experiment starting\n"; } + virtual void stopExperiment(); + virtual void startFlickering() {} + virtual void stopFlickering() {} + + Ogre::RenderWindow* getWindow() const { return m_window; } + Ogre::SceneManager* getSceneManager() const { return m_sceneManager; } + Ogre::SceneNode* getSceneNode() const { return m_sceneNode; } + CBasicPainter* getPainter() const { return m_painter; } + void exit() { m_bContinueRendering = false; } + Kernel::ILogManager& getLogManager() const { return (*m_logManager); } + Kernel::IConfigurationManager* getConfigurationManager() const { return &(m_kernelCtx->getConfigurationManager()); } + std::vector>* getFrequencies() { return &m_oFrequencies; } + void resizeViewport(); + +protected: + Kernel::IKernelContext* m_kernelCtx = nullptr; + Kernel::ILogManager* m_logManager = nullptr; + + double m_ScreenRefreshRate = 0; + CBasicPainter* m_painter = nullptr; + + bool m_bContinueRendering = true; + size_t m_currFrame = 0; + + Ogre::Root* m_root = nullptr; + Ogre::SceneManager* m_sceneManager = nullptr; + Ogre::Camera* m_camera = nullptr; + Ogre::RenderWindow* m_window = nullptr; + Ogre::Viewport* m_viewport = nullptr; + Ogre::SceneNode* m_sceneNode = nullptr; + + CEGUI::OgreRenderer* m_roGUIRenderer = nullptr; + CEGUI::WindowManager* m_guiManager = nullptr; + CEGUI::Window* m_sheet = nullptr; + + std::vector> m_oFrequencies; + + std::vector m_oCommands; + + virtual void processFrame(const size_t currentFrame); + + bool frameRenderingQueued(const Ogre::FrameEvent& evt) override { return (m_bContinueRendering && !m_window->isClosed()); } + bool frameStarted(const Ogre::FrameEvent& evt) override; + + bool configure() const; + static void setupResources(); + + +private: + void initCEGUI(const char* logFilename); + Ogre::uint32 m_windowWidth = 0; + Ogre::uint32 m_windowHeight = 0; +}; +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCBasicPainter.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCBasicPainter.cpp new file mode 100644 index 0000000..2918cbc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCBasicPainter.cpp @@ -0,0 +1,162 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovassvepCBasicPainter.h" +#include "ovassvepCApplication.h" + +#if (OGRE_VERSION_MAJOR > 1) || ((OGRE_VERSION_MAJOR == 1) && (OGRE_VERSION_MINOR >= 9)) +#include "Overlay/OgreOverlayManager.h" +#include "Overlay/OgreOverlaySystem.h" +#endif + +namespace OpenViBE { +namespace SSVEP { + +//--------------------------------------------------------------------------------------------------- +CBasicPainter::CBasicPainter(CApplication* application) + : m_application(application), m_sceneManager(application->getSceneManager()) +{ + m_aabInf.setInfinite(); + +#if (OGRE_VERSION_MAJOR > 1) || ((OGRE_VERSION_MAJOR == 1) && (OGRE_VERSION_MINOR >= 9)) + // on Ogre 1.9, overlay system needs to be manually created + Ogre::OverlaySystem* pOverlaySystem = OGRE_NEW Ogre::OverlaySystem(); + m_sceneManager->addRenderQueueListener(pOverlaySystem); +#endif + + m_overlayManager = Ogre::OverlayManager::getSingletonPtr(); + + (m_application->getLogManager()) << Kernel::LogLevel_Debug << " + Creating OverlayManager\n"; + Ogre::Overlay* overlay = m_overlayManager->create("TextOverlay"); + + + m_overlayContainer = dynamic_cast(m_overlayManager->createOverlayElement("Panel", "TextContainer")); + m_overlayContainer->setDimensions(1, 1); + m_overlayContainer->setPosition(0, 0); + + overlay->add2D(m_overlayContainer); + overlay->show(); +} + + +//--------------------------------------------------------------------------------------------------- +Ogre::ManualObject* CBasicPainter::paintRectangle(const Ogre::RealRect& oRectangle, const Ogre::ColourValue color, const int plane) const +{ + Ogre::ManualObject* object = m_sceneManager->createManualObject(); + object->begin("BasicSurface/Diffuse", Ogre::RenderOperation::OT_TRIANGLE_FAN); + object->setUseIdentityProjection(true); + object->setUseIdentityView(true); + + object->position(oRectangle.right, oRectangle.top, 0.0); + object->colour(color); + object->index(0); + + object->position(oRectangle.left, oRectangle.top, 0.0); + object->colour(color); + object->index(1); + + object->position(oRectangle.left, oRectangle.bottom, 0.0); + object->colour(color); + object->index(2); + + object->position(oRectangle.right, oRectangle.bottom, 0.0); + object->colour(color); + object->index(3); + + object->index(0); + + object->end(); + + object->setBoundingBox(m_aabInf); + object->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY - plane); + + object->setVisible(true); + + return object; +} + + +//--------------------------------------------------------------------------------------------------- +Ogre::ManualObject* CBasicPainter::paintTriangle(const Point p1, const Point p2, const Point p3, const Ogre::ColourValue color, const int plane) const +{ + Ogre::ManualObject* object = m_sceneManager->createManualObject(); + object->begin("BasicSurface/Diffuse", Ogre::RenderOperation::OT_TRIANGLE_FAN); + object->setUseIdentityProjection(true); + object->setUseIdentityView(true); + + object->position(p1.m_X, p1.m_Y, 0.0); + object->colour(color); + object->index(0); + + object->position(p2.m_X, p2.m_Y, 0.0); + object->colour(color); + object->index(1); + + object->position(p3.m_X, p3.m_Y, 0.0); + object->colour(color); + object->index(2); + + object->index(0); + + object->end(); + + object->setBoundingBox(m_aabInf); + object->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY - plane); + + object->setVisible(true); + + return object; +} + +//--------------------------------------------------------------------------------------------------- +Ogre::ManualObject* CBasicPainter::paintCircle(const Ogre::Real rX, const Ogre::Real rY, const Ogre::Real rR, const Ogre::ColourValue color, + const bool bFilled, const int plane) const +{ + Ogre::ManualObject* object = m_sceneManager->createManualObject(); + + if (bFilled) { object->begin("BasicSurface/Diffuse", Ogre::RenderOperation::OT_TRIANGLE_FAN); } + else { object->begin("BasicSurface/Diffuse", Ogre::RenderOperation::OT_LINE_STRIP); } + + object->setUseIdentityProjection(true); + object->setUseIdentityView(true); + + float const fAccuracy = 16; + unsigned uiIndex = 0; + + for (float theta = 0; theta <= 2 * Ogre::Math::PI; theta += Ogre::Math::PI / fAccuracy) + { + object->position(rX + rR * cos(theta), rY + rR * sin(theta), 0); + object->colour(color); + object->index(uiIndex++); + } + + object->index(0); + + object->end(); + + object->setBoundingBox(m_aabInf); + object->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY - plane); + + object->setVisible(true); + + return object; +} + +//--------------------------------------------------------------------------------------------------- +void CBasicPainter::paintText(const std::string& sID, const std::string& sText, const Ogre::Real rX, const Ogre::Real rY, + const Ogre::Real rWidth, const Ogre::Real rHeight, const Ogre::ColourValue& color) const +{ + Ogre::OverlayElement* text = m_overlayManager->createOverlayElement("TextArea", sID); + text->setDimensions(rWidth, rHeight); + text->setMetricsMode(Ogre::GMM_PIXELS); + text->setPosition(rX, rY); + text->setParameter("font_name", "DejaVu"); + text->setColour(color); + text->setCaption(sText); + m_overlayContainer->addChild(text); +} + + +#endif + +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCBasicPainter.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCBasicPainter.h new file mode 100644 index 0000000..2d085a4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCBasicPainter.h @@ -0,0 +1,47 @@ +#pragma once + +#include + +#if (OGRE_VERSION_MAJOR > 1) || ((OGRE_VERSION_MAJOR == 1) && (OGRE_VERSION_MINOR >= 9)) +#include "Overlay/OgreOverlayContainer.h" +#endif + +#define SSVEP_DEFAULT_COLOUR Ogre::ColourValue(1.0f, 1.0f, 1.0f) + +namespace OpenViBE { +namespace SSVEP { +class CApplication; + +class Point +{ +public: + Point(const float x, const float y) : m_X(x), m_Y(y) {} + + float m_X = 0.0F, m_Y = 0.0F; +}; + +class CBasicPainter +{ +public: + explicit CBasicPainter(CApplication* application); + ~CBasicPainter() {} + + Ogre::ManualObject* paintRectangle(const Ogre::RealRect& oRectangle, const Ogre::ColourValue color = SSVEP_DEFAULT_COLOUR, const int plane = 1) const; + Ogre::ManualObject* paintTriangle(const Point p1, const Point p2, const Point p3, const Ogre::ColourValue color = SSVEP_DEFAULT_COLOUR, + const int plane = 1) const; + Ogre::ManualObject* paintCircle(const Ogre::Real rX, const Ogre::Real rY, const Ogre::Real rR, const Ogre::ColourValue color = SSVEP_DEFAULT_COLOUR, + const bool bFilled = true, + const int plane = 1) const; + + void paintText(const std::string& sID, const std::string& sText, const Ogre::Real rX, const Ogre::Real rY, + const Ogre::Real rWidth, const Ogre::Real rHeight, const Ogre::ColourValue& color) const; + +protected: + CApplication* m_application = nullptr; + Ogre::OverlayManager* m_overlayManager = nullptr; + Ogre::OverlayContainer* m_overlayContainer = nullptr; + Ogre::SceneManager* m_sceneManager = nullptr; + Ogre::AxisAlignedBox m_aabInf; +}; +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCCommandStartStop.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCCommandStartStop.cpp new file mode 100644 index 0000000..4fd11e5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCCommandStartStop.cpp @@ -0,0 +1,54 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovassvepCCommandStartStop.h" +#include "ovassvepCApplication.h" +#include "ovassvepCVRPNServer.h" + +namespace OpenViBE { +namespace SSVEP { +//--------------------------------------------------------------------------------------------------- +CCommandStartStop::CCommandStartStop(CApplication* application) + : ICommandOIS(application) +{ + m_vrpnServer = CVRPNServer::getInstance(application); + m_vrpnServer->addButton("SSVEP_VRPN_StartStop", 2); +} + +//--------------------------------------------------------------------------------------------------- +CCommandStartStop::~CCommandStartStop() +{ + m_application->getLogManager() << Kernel::LogLevel_Info << "End message sent\n"; + m_vrpnServer->changeButtonState("SSVEP_VRPN_StartStop", 1, 1); + m_vrpnServer->processFrame(); +} + +//--------------------------------------------------------------------------------------------------- +void CCommandStartStop::processFrame() +{ + ICommandOIS::processFrame(); + m_vrpnServer->processFrame(); +} + +//--------------------------------------------------------------------------------------------------- +void CCommandStartStop::receiveKeyPressedEvent(const OIS::KeyCode key) +{ + if (key == OIS::KC_SPACE) + { + m_application->getLogManager() << Kernel::LogLevel_Info << "Start message sent\n"; + + m_vrpnServer->changeButtonState("SSVEP_VRPN_StartStop", 0, 1); + } + + if (key == OIS::KC_ESCAPE) { m_application->exit(); } +} + +//--------------------------------------------------------------------------------------------------- +void CCommandStartStop::receiveKeyReleasedEvent(const OIS::KeyCode key) +{ + if (key == OIS::KC_SPACE) { m_vrpnServer->changeButtonState("SSVEP_VRPN_StartStop", 0, 0); } +} + +} // namespace SSVEP +} // namespace OpenViBE + +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCCommandStartStop.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCCommandStartStop.h new file mode 100644 index 0000000..c74cf89 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCCommandStartStop.h @@ -0,0 +1,24 @@ +#pragma once + +#include "ovassvepICommandOIS.h" + +namespace OpenViBE { +namespace SSVEP { +class CVRPNServer; + +class CCommandStartStop final : public ICommandOIS +{ +public: + explicit CCommandStartStop(CApplication* application); + ~CCommandStartStop() override; + + void processFrame() override; + + void receiveKeyPressedEvent(OIS::KeyCode key) override; + void receiveKeyReleasedEvent(OIS::KeyCode key) override; + +private: + CVRPNServer* m_vrpnServer = nullptr; +}; +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCCommandStimulatorControl.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCCommandStimulatorControl.cpp new file mode 100644 index 0000000..270396a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCCommandStimulatorControl.cpp @@ -0,0 +1,43 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovassvepCCommandStimulatorControl.h" +#include "ovassvepCApplication.h" + +namespace OpenViBE { +namespace SSVEP { +//--------------------------------------------------------------------------------------------------- +CCommandStimulatorControl::CCommandStimulatorControl(CApplication* application) + : ICommandVRPNButton(application, "SSVEP_VRPN_StimulatorControl") {} + +//--------------------------------------------------------------------------------------------------- +void CCommandStimulatorControl::execute(const int button, const int /*state*/) +{ + // only run the commands once, skip + + switch (button) + { + case 0: + m_application->startExperiment(); + break; + + case 1: + m_application->stopExperiment(); + break; + + case 2: + m_application->startFlickering(); + break; + + case 3: + m_application->stopFlickering(); + break; + + default: + m_application->getLogManager() << Kernel::LogLevel_Error << "[ERROR] Unknown command\n"; + break; + } +} + +} // namespace SSVEP +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCCommandStimulatorControl.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCCommandStimulatorControl.h new file mode 100644 index 0000000..e1d0269 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCCommandStimulatorControl.h @@ -0,0 +1,16 @@ +#pragma once + +#include "ovassvepICommandVRPNButton.h" + +namespace OpenViBE { +namespace SSVEP { +class CCommandStimulatorControl final : public ICommandVRPNButton +{ +public: + explicit CCommandStimulatorControl(CApplication* application); + ~CCommandStimulatorControl() override { } + + void execute(const int button, const int state) override; +}; +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCPainter.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCPainter.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCPainter.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCPainter.h new file mode 100644 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCSSVEPFlickeringObject.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCSSVEPFlickeringObject.cpp new file mode 100644 index 0000000..7f6c21c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCSSVEPFlickeringObject.cpp @@ -0,0 +1,26 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovassvepCSSVEPFlickeringObject.h" + +namespace OpenViBE { +namespace SSVEP { + +void CSSVEPFlickeringObject::setVisible(const bool visibility) +{ + if ((!m_visible && visibility) || (m_visible && !visibility)) { m_objectNode->flipVisibility(); } + m_visible = visibility; +} + +void CSSVEPFlickeringObject::processFrame() +{ + if (m_currentFrame < m_litFrames) { this->setVisible(true); } + else { this->setVisible(false); } + + m_currentFrame++; + + if (m_currentFrame == m_litFrames + m_darkFrames) { m_currentFrame = 0; } +} + +} // namespace SSVEP +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCSSVEPFlickeringObject.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCSSVEPFlickeringObject.h new file mode 100644 index 0000000..43b87fe --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCSSVEPFlickeringObject.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include +#include + +namespace OpenViBE { +namespace SSVEP { +class CSSVEPFlickeringObject +{ +public: + CSSVEPFlickeringObject(Ogre::SceneNode* objectNode, size_t litFrames, size_t darkFrames) + : m_objectNode(objectNode), m_litFrames(litFrames), m_darkFrames(darkFrames) {} + virtual ~CSSVEPFlickeringObject() {} + + virtual void setVisible(bool visibility); + virtual void processFrame(); + +protected: + Ogre::SceneNode* m_objectNode = nullptr; + size_t m_currentFrame = 0; + size_t m_litFrames = 0; + size_t m_darkFrames = 0; + +private: + + bool m_visible = true; +}; +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCStimulator.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCStimulator.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCStimulator.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCStimulator.h new file mode 100644 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCVRPNServer.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCVRPNServer.cpp new file mode 100644 index 0000000..41bffb7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCVRPNServer.cpp @@ -0,0 +1,53 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovassvepCVRPNServer.h" +#include "ovassvepCApplication.h" + +#include +#include + +namespace OpenViBE { +namespace SSVEP { + +CVRPNServer* CVRPNServer::m_vrpnServerInstance = nullptr; +CApplication* CVRPNServer::m_application = nullptr; + +CVRPNServer::CVRPNServer(CApplication* application) +{ + m_application = application; + + const int port = int(m_application->getConfigurationManager()->expandAsInteger("${VRPN_ExternalServerPort}")); + + m_application->getLogManager() << Kernel::LogLevel_Debug << "VRPN SERVER PORT :" << port << "\n"; + m_connection = vrpn_create_server_connection(port); +} + +CVRPNServer* CVRPNServer::getInstance(CApplication* application) +{ + if (m_vrpnServerInstance == nullptr) { m_vrpnServerInstance = new CVRPNServer(application); } + return m_vrpnServerInstance; +} + +void CVRPNServer::addButton(const CString& name, const int buttonCount) +{ + m_buttonServer.insert( + std::pair(name.toASCIIString(), new vrpn_Button_Server(name.toASCIIString(), m_connection, buttonCount))); + m_buttonCache[name.toASCIIString()].clear(); + m_buttonCache[name.toASCIIString()].resize(buttonCount); +} + +void CVRPNServer::processFrame() +{ + for (auto& it : m_buttonServer) { it.second->mainloop(); } + m_connection->mainloop(); +} + +void CVRPNServer::changeButtonState(const std::string& name, const int index, const int state) +{ + m_buttonServer[name]->set_button(index, state); + m_buttonCache[name][index] = state; +} + +} // namespace SSVEP +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCVRPNServer.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCVRPNServer.h new file mode 100644 index 0000000..b1a033e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepCVRPNServer.h @@ -0,0 +1,39 @@ +#pragma once + +#include +#include + +#include +#include +#include + +class vrpn_Connection; +class vrpn_Button_Server; + +namespace OpenViBE { +namespace SSVEP { +class CApplication; + +class CVRPNServer +{ +public: + static CVRPNServer* getInstance(CApplication* application); + ~CVRPNServer() = default; + void processFrame(); + + void addButton(const CString& name, int buttonCount); + void changeButtonState(const std::string& name, int index, int state); + int getButtonState(const std::string& name, const int index) { return m_buttonCache[name][index]; } + +private: + static CVRPNServer* m_vrpnServerInstance; + static CApplication* m_application; + + explicit CVRPNServer(CApplication* application); + + vrpn_Connection* m_connection = nullptr; + std::map m_buttonServer; + std::map> m_buttonCache; +}; +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepICommand.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepICommand.h new file mode 100644 index 0000000..0671ae7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepICommand.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +namespace OpenViBE { +namespace SSVEP { +class CApplication; + +class ICommand +{ +public: + explicit ICommand(CApplication* application) : m_application(application) {} + virtual ~ICommand() { } + virtual void processFrame() = 0; + +protected: + CApplication* m_application = nullptr; +}; +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepICommandOIS.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepICommandOIS.cpp new file mode 100644 index 0000000..45ec896 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepICommandOIS.cpp @@ -0,0 +1,77 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovassvepICommandOIS.h" +#include "ovassvepCApplication.h" + +namespace OpenViBE { +namespace SSVEP { + +OIS::InputManager* ICommandOIS::m_inputManager = nullptr; +OIS::Keyboard* ICommandOIS::m_keyboard = nullptr; + +int ICommandOIS::m_nInstance = 0; +std::vector ICommandOIS::m_instances; + + +ICommandOIS::ICommandOIS(CApplication* application) : ICommand(application) +{ + if (m_keyboard == nullptr) + { + OIS::ParamList paramList; + std::ostringstream windowHandleString; + size_t windowHandle; + + + m_application->getWindow()->getCustomAttribute("WINDOW", &windowHandle); + + windowHandleString << windowHandle; + + paramList.insert(std::make_pair(std::string("WINDOW"), windowHandleString.str())); + paramList.insert(std::make_pair(std::string("x11_keyboard_grab"), "false")); + + m_inputManager = OIS::InputManager::createInputSystem(paramList); + + m_keyboard = dynamic_cast(m_inputManager->createInputObject(OIS::OISKeyboard, true)); + + m_keyboard->setEventCallback(this); + } + + m_nInstance++; + m_instances.push_back(this); +} + +ICommandOIS::~ICommandOIS() +{ + --m_nInstance; + + if (m_nInstance == 0) + { + if (m_inputManager != nullptr) + { + if (m_keyboard != nullptr) + { + m_application->getLogManager() << Kernel::LogLevel_Debug << "- destroy m_keyboard\n"; + m_inputManager->destroyInputObject(m_keyboard); + m_keyboard = nullptr; + } + + m_inputManager->destroyInputSystem(m_inputManager); + } + } +} + +bool ICommandOIS::keyPressed(const OIS::KeyEvent& event) +{ + for (size_t i = 0; i < m_instances.size(); ++i) { m_instances[i]->receiveKeyPressedEvent(event.key); } + return true; +} + +bool ICommandOIS::keyReleased(const OIS::KeyEvent& event) +{ + for (size_t i = 0; i < m_instances.size(); ++i) { m_instances[i]->receiveKeyReleasedEvent(event.key); } + return true; +} + +} // namespace SSVEP +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepICommandOIS.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepICommandOIS.h new file mode 100644 index 0000000..ef3c2bd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepICommandOIS.h @@ -0,0 +1,35 @@ +#pragma once + +#include + +#include +#include +#include "ovassvepICommand.h" + +namespace OpenViBE { +namespace SSVEP { +class ICommandOIS : public ICommand, OIS::KeyListener +{ + static std::vector m_instances; + static int m_nInstance; + +protected: + static OIS::InputManager* m_inputManager; + static OIS::Keyboard* m_keyboard; + +public: + explicit ICommandOIS(CApplication* application); + ~ICommandOIS() override; + + void processFrame() override { m_keyboard->capture(); } + +protected: + virtual void receiveKeyPressedEvent(OIS::KeyCode key) = 0; + virtual void receiveKeyReleasedEvent(OIS::KeyCode key) = 0; + +private: + bool keyPressed(const OIS::KeyEvent& event) override; + bool keyReleased(const OIS::KeyEvent& event) override; +}; +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepICommandVRPNButton.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepICommandVRPNButton.cpp new file mode 100644 index 0000000..997662c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepICommandVRPNButton.cpp @@ -0,0 +1,39 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovassvepICommandVRPNButton.h" +#include "ovassvepCApplication.h" + +#include +#include + +namespace OpenViBE { +namespace SSVEP { + +static void VRPN_CALLBACK ssvep_vrpn_callback_button(void* command, const vrpn_BUTTONCB button) +{ + static_cast(command)->execute(button.button, button.state); +} + +ICommandVRPNButton::ICommandVRPNButton(CApplication* application, const CString& name) + : ICommand(application) +{ + Kernel::IConfigurationManager* configManager = application->getConfigurationManager(); + const std::string buttonName = std::string(name.toASCIIString()) + "@" + (configManager->expand("${SSVEP_VRPNHost}")).toASCIIString(); + m_application->getLogManager() << Kernel::LogLevel_Debug << "+ m_vrpnButton = new vrpn_Button_Remote(" << buttonName << ")\n"; + + m_vrpnButton = new vrpn_Button_Remote(buttonName.c_str()); + m_vrpnButton->register_change_handler(static_cast(this), ssvep_vrpn_callback_button); +} + +ICommandVRPNButton::~ICommandVRPNButton() +{ + m_application->getLogManager() << Kernel::LogLevel_Debug << "- delete m_vrpnButton\n"; + delete m_vrpnButton; +} + +void ICommandVRPNButton::processFrame() { m_vrpnButton->mainloop(); } + +} // namespace SSVEP +} // namespace OpenViBE + +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepICommandVRPNButton.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepICommandVRPNButton.h new file mode 100644 index 0000000..6252fd0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvepICommandVRPNButton.h @@ -0,0 +1,22 @@ +#pragma once + +#include "ovassvepICommand.h" + +class vrpn_Button_Remote; + +namespace OpenViBE { +namespace SSVEP { +class ICommandVRPNButton : public ICommand +{ +public: + ICommandVRPNButton(CApplication* application, const CString& name); + ~ICommandVRPNButton() override; + + void processFrame() override; + virtual void execute(const int button, const int state) = 0; + +protected: + vrpn_Button_Remote* m_vrpnButton = nullptr; +}; +} // namespace SSVEP +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvep_defines.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvep_defines.h new file mode 100644 index 0000000..6f70f09 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvep_defines.h @@ -0,0 +1 @@ +#pragma once diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvep_main.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvep_main.cpp new file mode 100644 index 0000000..ce279d9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-demo/src/ovassvep_main.cpp @@ -0,0 +1,126 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovassvep_defines.h" +#include +#include + +#include "ovassvepCApplication.h" +#include "Trainer/ovassvepCTrainerApplication.h" +#include "Shooter/ovassvepCShooterApplication.h" + +int main(const int argc, char** argv) +{ + if (argc != 2) + { + std::cout << "Usage: " << argv[0] << " [trainer|shooter]\n"; + exit(1); + } + + // initialize the OpenViBE kernel + + OpenViBE::CKernelLoader kernelLoader; + OpenViBE::Kernel::IKernelDesc* kernelDesc = nullptr; + + OpenViBE::CString error; +#if defined TARGET_OS_Windows + const OpenViBE::CString kernelFile = OpenViBE::Directories::getLibDir() + "/openvibe-kernel.dll"; +#else + const OpenViBE::CString kernelFile = OpenViBE::Directories::getLibDir() + "/libopenvibe-kernel.so"; +#endif + if (!kernelLoader.load(kernelFile, &error)) + { + std::cout << "[ FAILED ] Error loading kernel (" << error << ")" << " from [" << kernelFile << "]\n"; + return (1); + } + std::cout << "[ INF ] Kernel module loaded, trying to get kernel descriptor\n"; + + kernelLoader.initialize(); + kernelLoader.getKernelDesc(kernelDesc); + + if (!kernelDesc) + { + std::cout << "[ FAILED ] No kernel descriptor\n"; + return (1); + } + std::cout << "[ INF ] Got kernel descriptor, trying to create kernel\n"; + + OpenViBE::Kernel::IKernelContext* kernelContext = kernelDesc->createKernel("ssvep-demo", OpenViBE::Directories::getDataDir() + "/kernel/openvibe.conf"); + + if (!kernelContext) + { + std::cout << "[ FAILED ] No kernel created by kernel descriptor\n"; + return (1); + } + kernelContext->initialize(); + + OpenViBE::Toolkit::initialize(*kernelContext); + + OpenViBE::Kernel::IConfigurationManager* configManager = &(kernelContext->getConfigurationManager()); + configManager->createConfigurationToken("SSVEP_ApplicationDescriptor", OpenViBE::CString(argv[1])); + + const OpenViBE::CString configFile = configManager->expand("${Path_Data}/applications/ssvep-demo/openvibe-ssvep-demo.conf"); + configManager->addConfigurationFromFile(configFile); + + OpenViBE::Kernel::ILogManager* logManager = &(kernelContext->getLogManager()); + + if (configManager->expand("$Env{OGRE_HOME}").length() == 0) + { + std::cout << "Error: OGRE_HOME environment variable is not set, this likely will not work.\n"; + // Don't exit as we don't have any way to get the return value seen in designer + } + + // We need this to address BuildType no longer in SDK 2.0 +#if defined(DEBUG) + configManager->addOrReplaceConfigurationToken("BuildType", "Debug"); +#else + configManager->addOrReplaceConfigurationToken("BuildType", "Release"); +#endif + + OpenViBE::SSVEP::CApplication* app; + + const OpenViBE::CString applicationType = configManager->expand("${SSVEP_ApplicationType}"); + + (*logManager) << OpenViBE::Kernel::LogLevel_Info << "Selected Application : '" << applicationType.toASCIIString() << "'\n"; + + + if (applicationType == OpenViBE::CString("trainer")) + { + (*logManager) << OpenViBE::Kernel::LogLevel_Debug << "+ app = new SSVEP::CTrainerApplication(...)\n"; + app = new OpenViBE::SSVEP::CTrainerApplication(); + } + else if (applicationType == OpenViBE::CString("shooter")) + { + (*logManager) << OpenViBE::Kernel::LogLevel_Debug << "+ app = new SSVEP::CShooterApplication(...)\n"; + app = new OpenViBE::SSVEP::CShooterApplication(); + } + else + { + (*logManager) << OpenViBE::Kernel::LogLevel_Error << "Wrong application identifier specified: '" << applicationType << "'\n"; + return 1; + } + + if (!app->setup(kernelContext)) + { + std::cout << "Aborting\n"; + delete app; + return -1; + } + + app->go(); + + (*logManager) << OpenViBE::Kernel::LogLevel_Debug << "- app\n"; + delete app; + + return 0; +} + + +#else +#include + +int main(int argc, char** argv) +{ + std::cout << "SSVEP demo has not been compiled as it depends on Ogre (missing/disabled)\n"; + return -1; +} +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/CMakeLists.txt new file mode 100644 index 0000000..92aa161 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/CMakeLists.txt @@ -0,0 +1,77 @@ +PROJECT(openvibe-ssvep-mind-shooter) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +INCLUDE("FindThirdPartyVRPN_Check") +IF(NOT PATH_VRPN) + MESSAGE(STATUS " --> Not building ${PROJECT_NAME}") + RETURN() +ENDIF(NOT PATH_VRPN) + +INCLUDE("FindThirdPartyCEGUI_Check") +IF(NOT CEGUI_FOUND OR NOT OgreCEGUIRenderer_FOUND) + MESSAGE(STATUS " --> Not building ${PROJECT_NAME}") + RETURN() +ENDIF(NOT CEGUI_FOUND OR NOT OgreCEGUIRenderer_FOUND) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindOpenViBEModuleTCPTagging") +INCLUDE("FindThirdPartyCEGUI") # CEGUI + CEGUIOgreRender included +INCLUDE("FindThirdPartyVRPN") +INCLUDE("FindThirdPartyOgre3D") +INCLUDE("FindThirdPartyOgre3DTerrain") # OGRE + OIS included, pulls boost thread +INCLUDE("FindThirdPartyBoost") # Using Ogre headers on Win32 causes dependency to Boost thread library +INCLUDE("FindThirdPartyBoost_Thread") # Note that this is a potential issue on Windows, as the dependencies/ogre/boost and dependencies/boost are not the same at the time of writing this. + + + +# --------------------------------- +# Finds standard library pthread +# Adds library to target +# Adds include path +# --------------------------------- +IF(UNIX) + FIND_LIBRARY(LIB_STANDARD_MODULE_PTHREAD pthread) + IF(LIB_STANDARD_MODULE_PTHREAD) + MESSAGE(STATUS " Found pthread...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_PTHREAD}) + ELSE(LIB_STANDARD_MODULE_PTHREAD) + MESSAGE(STATUS " FAILED to find pthread...") + ENDIF(LIB_STANDARD_MODULE_PTHREAD) +ENDIF(UNIX) + +# --------------------------------- + + + + +# --------------------------------- + + +# ---------------------- +# Generate launch script +# ---------------------- +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "openvibe-ssvep-mind-shooter-trainer" EXECUTABLE_NAME ${PROJECT_NAME} PARAMETERS "impact-trainer") +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "openvibe-ssvep-mind-shooter-shooter" EXECUTABLE_NAME ${PROJECT_NAME} PARAMETERS "impact-shooter") +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "openvibe-ssvep-stimulator-generic" EXECUTABLE_NAME ${PROJECT_NAME} PARAMETERS "generic") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/applications/ssvep-mind-shooter) + +INSTALL(DIRECTORY bci-examples DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/appconf/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/appconf/README.txt new file mode 100644 index 0000000..eff11fe --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/appconf/README.txt @@ -0,0 +1 @@ +This folder contains configuration files created by the SSVEP scenarios. diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/appconf/materials/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/appconf/materials/README.txt new file mode 100644 index 0000000..670c2bf --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/appconf/materials/README.txt @@ -0,0 +1 @@ +This folder contains materials created by the SSVEP scenarios. diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/classifiers/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/classifiers/README.txt new file mode 100644 index 0000000..ddf7bed --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/classifiers/README.txt @@ -0,0 +1 @@ +This folder contains classifiers and CSP filters created by the SSVEP scenarios. diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/configuration/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/configuration/README.txt new file mode 100644 index 0000000..ef12863 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/configuration/README.txt @@ -0,0 +1 @@ +This folder contains configuration files generated by the scenarios. diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-0-acquisition-test.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-0-acquisition-test.xml new file mode 100644 index 0000000..bf7ad5d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-0-acquisition-test.xml @@ -0,0 +1,672 @@ + + 1 + OpenVIBE + 0.1.99 + + + + + + (0x00000efb, 0x00007452) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 2.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.250000 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 112.000000 + + + (0x207c9054, 0x3c841b63) + 560.000000 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002363af) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000026ba, 0x000014fc) + Spectral analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imag Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192.000000 + + + (0x207c9054, 0x3c841b63) + 560.000000 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004039af) + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000441d, 0x00001a28) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16.000000 + + + (0x207c9054, 0x3c841b63) + 560.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00596403) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00006e09, 0x00006c54) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 3.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 40.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48.000000 + + + (0x207c9054, 0x3c841b63) + 560.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005c78a8) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006ff2, 0x000035c1) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112.000000 + + + (0x207c9054, 0x3c841b63) + 752.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0020924b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x4f539eea, 0x4f1d2b36) + Instant Bars + (0xecb46081, 0x96da0d49) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 560 + + + (0x4e7b798a, 0x183beafb) + (0x6b60e2b2, 0xf4839b7d) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000c5d, 0x00003e97) + + (0x00000efb, 0x00007452) + 0 + + + (0x000026ba, 0x000014fc) + 0 + + + + (0x0000235d, 0x00005682) + + (0x0000441d, 0x00001a28) + 1 + + + (0x00006e09, 0x00006c54) + 0 + + + + (0x00003f9c, 0x000047e9) + + (0x00006e09, 0x00006c54) + 0 + + + (0x00006ff2, 0x000035c1) + 0 + + + + (0x00006d4e, 0x0000333e) + + (0x00006e09, 0x00006c54) + 0 + + + (0x00000efb, 0x00007452) + 0 + + + + (0x2146ff07, 0x607b577b) + + (0x000026ba, 0x000014fc) + 0 + + + (0x4f539eea, 0x4f1d2b36) + 0 + + + + + + (0x00002d94, 0x00007404) + Display the signal from all channels + + + (0x473d9a43, 0x97fc0a97) + 960.000000 + + + (0x7234b86b, 0x2b8651a5) + 112.000000 + + + + + (0x00004efd, 0x0000146d) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + This scenario set is documented in 'http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/' + + + (0x473d9a43, 0x97fc0a97) + 528 + + + (0x7234b86b, 0x2b8651a5) + -112 + + + + + (0x00007577, 0x000059a7) + <b><big>Acquisition test</big></b> + +Scenario used for testing data acquisition. The signal quality should +always be checked before training. + +You can monitor signals from all of the electrodes. Individual +signals are shown for each channel, as well as FFT power of all channels. + + + + (0x473d9a43, 0x97fc0a97) + 224.000000 + + + (0x7234b86b, 0x2b8651a5) + 16.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":776,"identifier":"(0x00002985, 0x00004ff2)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":753},{"boxIdentifier":"(0x4f539eea, 0x4f1d2b36)","childCount":0,"identifier":"(0x470943ea, 0x174708bb)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000024d0, 0x00004b7a)","index":0,"name":"Default tab","parentIdentifier":"(0x00002985, 0x00004ff2)","type":2},{"boxIdentifier":"(0x00006ff2, 0x000035c1)","childCount":0,"identifier":"(0x00003256, 0x00006784)","index":0,"parentIdentifier":"(0x000024d0, 0x00004b7a)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Jozef Legeny + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + SSVEP Acquisition Test + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/ + + + (0xf6b2e3fa, 0x7bd43926) + SSVEP + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-1-ssvep-configuration.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-1-ssvep-configuration.xml new file mode 100644 index 0000000..e48b751 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-1-ssvep-configuration.xml @@ -0,0 +1,583 @@ + + 1 + Designer + 2.0.0 + + + + + + (0x00000533, 0x00001c79) + Experiment Settings + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/configuration-experiment-settings.lua + false + + + (0x7f45a2a9, 0x7db12219) + Target Light Color + 100,0,0 + 100,0,0 + false + + + (0x7f45a2a9, 0x7db12219) + Target Dark Color + 0,0,0 + 10,0,0 + false + + + (0x79a9edeb, 0x245d83fc) + Stimulation Frequencies + 20;15;12 + 5.454545;6.6666;7.5 + false + + + (0x512a166f, 0x5c3ef83f) + Processing Epoch Duration + 0.5 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Processing Epoch Interval + 0.1 + 0.1 + false + + + (0x512a166f, 0x5c3ef83f) + Processing Frequency Tolerance + 0.250 + 0.25 + false + + + (0x007deef9, 0x2f3e95c6) + CSP Spatial Filter Order + 3 + 6 + false + + + (0x2cdb2f0b, 0x12f231ea) + Focus Point + false + false + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x000024b5, 0x00000bb5) + Peripheral Settings + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/configuration-peripheral-settings.lua + false + + + (0x007deef9, 0x2f3e95c6) + Screen Refresh Rate + 60 + 60 + false + + + (0x007deef9, 0x2f3e95c6) + Window Width + 800 + 800 + false + + + (0x007deef9, 0x2f3e95c6) + Window Height + 600 + 600 + false + + + (0x2cdb2f0b, 0x12f231ea) + Fullscreen + + true + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004bf3, 0x00007808) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005dd3, 0x00000cf3) + EEG Input Settings + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/configuration-eeg-input-settings.lua + false + + + (0x79a9edeb, 0x245d83fc) + Channels + + : + false + + + (0x3bcf9e67, 0x0c23994d) + Selection Method + Reject + Select + false + + + (0x666f25e9, 0x3e5738d6) + Match Method + Smart + Smart + false + + + (0x330306dd, 0x74a95f98) + Training Data File + ${Player_ScenarioDirectory}/signals/ssvep-record-current.ov + ${Player_ScenarioDirectory}/signals/ssvep-record-current.ov + false + + + (0x330306dd, 0x74a95f98) + Testing Data File + ${Player_ScenarioDirectory}/signals/ssvep-record-current.ov + ${Player_ScenarioDirectory}/signals/ssvep-record-current.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000011e3, 0x00005213) + + (0x000024b5, 0x00000bb5) + 0 + + + (0x00005dd3, 0x00000cf3) + 0 + + + + (0x00002afe, 0x00005880) + + (0x00005dd3, 0x00000cf3) + 0 + + + (0x00000533, 0x00001c79) + 0 + + + + (0x0000591f, 0x00006602) + + (0x00000533, 0x00001c79) + 0 + + + (0x00004bf3, 0x00007808) + 0 + + + + + + (0x00000df6, 0x00003d56) + <big><b>Experiment Settings</b></big> + +Settings concerning the SSVEP experiment in general. + +<b>Target Light Color</b> and <b>Target Dark Color</b> represent +the two colors which will be used to generate the flickering of +the targets. The notation Light and Dark is arbitrary, however on +frequencies using odd number of frames will use more frames to +represent the Light color. + +<b>Screen Refresh Rate : </b> The refresh rate of your screen, +refer to your screen's user manual to find this value. + +<span color="red">Important notice</span> + +Your screen will be able to reproduce only frequencies which +are result of division of your screen refresh rate by an +integer. + +<b>Stimulation Frequencies</b> A comma separated list of +frequencies used for the stimulation. Refer to the documentation +for more details. + +<b>Processing Epoch Duration</b> The length of the slice of the signal +which will be used to find SSVEP response. With longer duration precision +will increase at the detriment of the lag. + +<b>Processing Epoch Interval</b> The speed interval between slices of the +signal. + +<b>Processing Frequency Tolerance</b> The width of the frequency band +around the stimulation frequency used for classification. + + + (0x473d9a43, 0x97fc0a97) + -176 + + + (0x7234b86b, 0x2b8651a5) + 128 + + + + + (0x0000187e, 0x00005350) + <b><span color="#2060ff">Configurable box</span></b> + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 368 + + + (0x7234b86b, 0x2b8651a5) + 400 + + + + + (0x0000288f, 0x00005f55) + <b>Welcome to the 'classic' SSVEP Mind Shooter</b> + +Binary classifiers and CSP are used +by the signal processing pipelines. + + + (0x473d9a43, 0x97fc0a97) + -176.000000 + + + (0x7234b86b, 0x2b8651a5) + -192.000000 + + + + + (0x000031b0, 0x00003fa0) + <big><b>Scenario description</b></big> + +<b><span color="red">This scenario must be run at least once before +running any further SSVEP scenarios</span></b> + +This is a scenario where you can configure your SSVEP experiment. There +are two boxes containing configuration parameters: + +<b>Peripheral Settings</b> + +<b>Experiment Settings</b> + +For more detailed description please refer to the SSVEP +documentation page. + + + (0x473d9a43, 0x97fc0a97) + 336 + + + (0x7234b86b, 0x2b8651a5) + -160 + + + + + (0x00003244, 0x00004359) + <b><span color="#2060ff">Configurable box</span></b> + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 368 + + + (0x7234b86b, 0x2b8651a5) + 64 + + + + + (0x00005ca6, 0x00003399) + <b><span color="#2060ff">Configurable box</span></b> + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 368 + + + (0x7234b86b, 0x2b8651a5) + 224 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00005488, 0x0000451f)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00000bbf, 0x000047e2)","index":0,"name":"Default tab","parentIdentifier":"(0x00005488, 0x0000451f)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000017e4, 0x00003d53)","index":0,"name":"Empty","parentIdentifier":"(0x00000bbf, 0x000047e2)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jozef Legeny + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + SSVEP Configuration + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/ + + + (0xf6b2e3fa, 0x7bd43926) + SSVEP + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-2-training-acquisition.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-2-training-acquisition.xml new file mode 100644 index 0000000..24465b4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-2-training-acquisition.xml @@ -0,0 +1,1300 @@ + + 1 + Designer + 2.0.0 + + + + + + (0x00000f52, 0x00007365) + Start Stimulation + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/start-stimulator.lua + false + + + (0x007deef9, 0x2f3e95c6) + Delay + 1 + 1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001b97, 0x0000728f) + Scenario Control + (0x40714327, 0x458877d2) + + + (0x6f752dd0, 0x082a321e) + Output 1 + + + (0x6f752dd0, 0x082a321e) + Output 2 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn@localhost + SSVEP_VRPN_StartStop@localhost:${VRPN_ExternalServerPort} + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStop + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -176 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0x09fd9ef3, 0xeb8c3069) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x000024a5, 0x00002627) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x000030b0, 0x00005fc1) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + (0x013df452, 0xa3a8879a) + Input stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].ov + ${Player_ScenarioDirectory}/signals/ssvep-record-current.ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000033a4, 0x00004a99) + Run Command + (0x48843891, 0x7bfc57f4) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 1 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_ExperimentStart + false + + + (0x79a9edeb, 0x245d83fc) + Command 1 + + ${External_Application_Launcher} openvibe-ssvep-mind-shooter --run-bg impact-trainer ${Player_ScenarioDirectory} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -64 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0xe44a71e7, 0x7964dd76) + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003cf8, 0x00007fd0) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004345, 0x00005af1) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000047f9, 0x000022c3) + SSVEP Training Controller + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/training-acquisition-controller.lua + false + + + (0x79a9edeb, 0x245d83fc) + Goal sequence + 0 2 3 1 2 1 0 3 1 2 3 0 2 0 3 1 0 3 1 2 3 0 1 2 1 3 2 0 3 2 0 1 + 2 3 1 0 3 0 1 2 0 2 1 3 2 1 3 0 3 2 0 1 + false + + + (0x512a166f, 0x5c3ef83f) + Stimulation Duration + 7 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Break Duration + 2 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + Flickering Delay + 3.5 + 3.5 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004e99, 0x00007356) + Stimulation multiplexer + (0x07db4efa, 0x472b0938) + + + (0x6f752dd0, 0x082a321e) + Input stimulations 1 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 2 + + + + + (0x6f752dd0, 0x082a321e) + Multiplexed stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0xe7af82cd, 0x14edb4d4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004f05, 0x0000760e) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + (0x013df452, 0xa3a8879a) + Input stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].ov + ${Player_ScenarioDirectory}/signals/ssvep-record-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/file-writer.cfg + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005926, 0x00004613) + Target Select + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + (0x6f752dd0, 0x082a321e) + Input 3 + + + (0x6f752dd0, 0x082a321e) + Input 4 + + + (0x6f752dd0, 0x082a321e) + Input 5 + + + (0x6f752dd0, 0x082a321e) + Input 6 + + + (0x6f752dd0, 0x082a321e) + Input 7 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + SSVEP_VRPN_TargetControl + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 5 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_04 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 5 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_04 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 6 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_05 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 6 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_05 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 7 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_06 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 7 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_06 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006e4a, 0x00003cc3) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007f4c, 0x00002369) + Stimulator Control + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + (0x6f752dd0, 0x082a321e) + Input 3 + + + (0x6f752dd0, 0x082a321e) + Input 4 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + SSVEP_VRPN_StimulatorControl + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_VisualStimulationStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_VisualStimulationStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_VisualStimulationStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_VisualStimulationStop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000000c3, 0x00000240) + + (0x00001b97, 0x0000728f) + 1 + + + (0x00004345, 0x00005af1) + 0 + + + + (0x00001267, 0x00006200) + + (0x000047f9, 0x000022c3) + 0 + + + (0x00003cf8, 0x00007fd0) + 0 + + + + (0x00001487, 0x000061a3) + + (0x00004e99, 0x00007356) + 0 + + + (0x000030b0, 0x00005fc1) + 2 + + + + (0x0000173d, 0x0000791b) + + (0x00003cf8, 0x00007fd0) + 0 + + + (0x00007f4c, 0x00002369) + 3 + + + + (0x00001b66, 0x00003818) + + (0x00006e4a, 0x00003cc3) + 0 + + + (0x00005926, 0x00004613) + 5 + + + + (0x00001d81, 0x00002fac) + + (0x000024a5, 0x00002627) + 1 + + + (0x000030b0, 0x00005fc1) + 1 + + + + (0x00001da7, 0x00005f7c) + + (0x00006e4a, 0x00003cc3) + 0 + + + (0x00005926, 0x00004613) + 0 + + + + (0x00001de3, 0x00001e14) + + (0x000024a5, 0x00002627) + 1 + + + (0x00004f05, 0x0000760e) + 1 + + + + (0x0000244c, 0x000058d9) + + (0x00006e4a, 0x00003cc3) + 0 + + + (0x00005926, 0x00004613) + 2 + + + + (0x00002651, 0x0000126e) + + (0x000047f9, 0x000022c3) + 1 + + + (0x00006e4a, 0x00003cc3) + 0 + + + + (0x0000303d, 0x00003dd8) + + (0x00006e4a, 0x00003cc3) + 0 + + + (0x00005926, 0x00004613) + 4 + + + + (0x0000356f, 0x00007e89) + + (0x00004e99, 0x00007356) + 0 + + + (0x00004f05, 0x0000760e) + 2 + + + + (0x0000357d, 0x00001d2b) + + (0x00006e4a, 0x00003cc3) + 0 + + + (0x00005926, 0x00004613) + 6 + + + + (0x00003647, 0x00002f9c) + + (0x00003cf8, 0x00007fd0) + 0 + + + (0x00007f4c, 0x00002369) + 1 + + + + (0x000054f5, 0x00001419) + + (0x00000f52, 0x00007365) + 0 + + + (0x000033a4, 0x00004a99) + 0 + + + + (0x000055e8, 0x00002259) + + (0x00003cf8, 0x00007fd0) + 0 + + + (0x00007f4c, 0x00002369) + 2 + + + + (0x00005c6d, 0x000077ad) + + (0x000047f9, 0x000022c3) + 1 + + + (0x00004e99, 0x00007356) + 1 + + + + (0x00005cc8, 0x00007070) + + (0x00006e4a, 0x00003cc3) + 0 + + + (0x00005926, 0x00004613) + 3 + + + + (0x00006b15, 0x000062a5) + + (0x00003cf8, 0x00007fd0) + 0 + + + (0x00007f4c, 0x00002369) + 0 + + + + (0x00006b45, 0x000067b2) + + (0x000047f9, 0x000022c3) + 0 + + + (0x00004e99, 0x00007356) + 0 + + + + (0x00007124, 0x0000753b) + + (0x00006e4a, 0x00003cc3) + 0 + + + (0x00005926, 0x00004613) + 1 + + + + (0x000073b7, 0x0000226c) + + (0x00001b97, 0x0000728f) + 0 + + + (0x000047f9, 0x000022c3) + 0 + + + + + + (0x000036eb, 0x000003fe) + <b><span color="#2060ff">Configurable box</span></b> + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 592 + + + (0x7234b86b, 0x2b8651a5) + 16 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":400,"identifier":"(0x000038e4, 0x000033ab)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":376},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004344, 0x000015dd)","index":0,"name":"Default tab","parentIdentifier":"(0x000038e4, 0x000033ab)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00005654, 0x000076d8)","index":0,"name":"Empty","parentIdentifier":"(0x00004344, 0x000015dd)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jozef Legeny + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + SSVEP Training - Acquisition + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/ + + + (0xf6b2e3fa, 0x7bd43926) + SSVEP + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-3-CSP-training.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-3-CSP-training.xml new file mode 100644 index 0000000..af1f894 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-3-CSP-training.xml @@ -0,0 +1,3570 @@ + + 1 + Designer + 2.0.0 + + + + + + (0x000000e8, 0x0000472c) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 0 2 3 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -352 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000016f, 0x000011e2) + CSP Spatial Filter Trainer 3 + (0x51db0d64, 0x2109714e) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Signal condition 1 + + + (0x5ba36127, 0x195feae1) + Signal condition 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_GDF_End_Of_Session + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Spatial filter configuration + + ${Player_ScenarioDirectory}/classifiers/csp-1b + false + + + (0x007deef9, 0x2f3e95c6) + Filter dimension + 2 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Save as box config + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 2096 + + + (0x4e7b798a, 0x183beafb) + (0x4b49a133, 0x42f38d94) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/csp-spatial-filter-trainer-3b.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00000870, 0x000031c1) + Frequency 1 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -352 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1b.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000008f3, 0x00007596) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -464 + + + (0x207c9054, 0x3c841b63) + 1520 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000c7a, 0x00002d44) + CSP Spatial Filter Trainer 1h + (0x51db0d64, 0x2109714e) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Signal condition 1 + + + (0x5ba36127, 0x195feae1) + Signal condition 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_GDF_End_Of_Session + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Spatial filter configuration + + ${Player_ScenarioDirectory}/classifiers/csp-1h1 + false + + + (0x007deef9, 0x2f3e95c6) + Filter dimension + 2 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Save as box config + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 944 + + + (0x4e7b798a, 0x183beafb) + (0x4b49a133, 0x42f38d94) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/csp-spatial-filter-trainer-1h1.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000011a7, 0x000067a4) + Frequency 2 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -352 + + + (0x207c9054, 0x3c841b63) + 1344 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2b.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001b4b, 0x00002126) + CSP Spatial Filter Trainer 3h + (0x51db0d64, 0x2109714e) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Signal condition 1 + + + (0x5ba36127, 0x195feae1) + Signal condition 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_GDF_End_Of_Session + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Spatial filter configuration + + ${Player_ScenarioDirectory}/classifiers/csp-1h1 + false + + + (0x007deef9, 0x2f3e95c6) + Filter dimension + 2 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Save as box config + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 2448 + + + (0x4e7b798a, 0x183beafb) + (0x4b49a133, 0x42f38d94) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/csp-spatial-filter-trainer-3h1.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00001e37, 0x00005fb2) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 2544 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001f34, 0x00007fa8) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 2368 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000201a, 0x00002eea) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + : + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -816 + + + (0x207c9054, 0x3c841b63) + 1584 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/channel-selector.cfg + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002405, 0x00000710) + Frequency 1 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -352 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1h1.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000261b, 0x0000449c) + CSP Spatial Filter Trainer 1 + (0x51db0d64, 0x2109714e) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Signal condition 1 + + + (0x5ba36127, 0x195feae1) + Signal condition 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_GDF_End_Of_Session + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Spatial filter configuration + + ${Player_ScenarioDirectory}/classifiers/csp-1b + false + + + (0x007deef9, 0x2f3e95c6) + Filter dimension + 2 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Save as box config + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0x4b49a133, 0x42f38d94) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/csp-spatial-filter-trainer-1b.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000294d, 0x00005f52) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 1792 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00003201, 0x000076df) + FlipSwitch + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/classifier-training-flipswitch.lua + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 1600 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000346d, 0x00007c9e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 1440 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004018, 0x00001872) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -464 + + + (0x207c9054, 0x3c841b63) + 2272 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004332, 0x00002b87) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -736.000000 + + + (0x207c9054, 0x3c841b63) + 1584.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000043c3, 0x0000549b) + Frequency 3 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -352 + + + (0x207c9054, 0x3c841b63) + 2096 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3b.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000046fb, 0x00005e12) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 512 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000473c, 0x00004b33) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -896 + + + (0x207c9054, 0x3c841b63) + 1616 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/file-reader-training.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x000049d1, 0x00000cc1) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 0 1 2 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -352 + + + (0x207c9054, 0x3c841b63) + 2272 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005106, 0x00006115) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 2192 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00005e32, 0x00003083) + Frequency 3 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -352 + + + (0x207c9054, 0x3c841b63) + 2464 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3h1.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005f1a, 0x00000333) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 1616 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00006147, 0x000044a9) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00006920, 0x00005bd8) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -464 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006a05, 0x0000559e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 2016 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00006e5c, 0x000078fb) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00006e9b, 0x00003cc8) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000708d, 0x0000304b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 1600 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007097, 0x0000281e) + CSP Spatial Filter Trainer 2h + (0x51db0d64, 0x2109714e) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Signal condition 1 + + + (0x5ba36127, 0x195feae1) + Signal condition 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_GDF_End_Of_Session + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Spatial filter configuration + + ${Player_ScenarioDirectory}/classifiers/csp-1h1 + false + + + (0x007deef9, 0x2f3e95c6) + Filter dimension + 2 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Save as box config + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1696 + + + (0x4e7b798a, 0x183beafb) + (0x4b49a133, 0x42f38d94) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/csp-spatial-filter-trainer-2h1.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000725b, 0x000060f1) + CSP Spatial Filter Trainer 2 + (0x51db0d64, 0x2109714e) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Signal condition 1 + + + (0x5ba36127, 0x195feae1) + Signal condition 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_GDF_End_Of_Session + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Spatial filter configuration + + ${Player_ScenarioDirectory}/classifiers/csp-1b + false + + + (0x007deef9, 0x2f3e95c6) + Filter dimension + 2 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Save as box config + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1344 + + + (0x4e7b798a, 0x183beafb) + (0x4b49a133, 0x42f38d94) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/csp-spatial-filter-trainer-2b.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00007539, 0x00002442) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00007892, 0x000040f3) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 2 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 0 1 3 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -352 + + + (0x207c9054, 0x3c841b63) + 1520 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007cc2, 0x000011eb) + Frequency 2 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -352 + + + (0x207c9054, 0x3c841b63) + 1712 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2h1.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000000f9, 0x00007ad3) + + (0x000008f3, 0x00007596) + 1 + + + (0x00007097, 0x0000281e) + 0 + + + + (0x00000132, 0x000079bc) + + (0x000000e8, 0x0000472c) + 0 + + + (0x00007539, 0x00002442) + 1 + + + + (0x00000344, 0x00001b36) + + (0x00007892, 0x000040f3) + 1 + + + (0x0000294d, 0x00005f52) + 1 + + + + (0x00000452, 0x0000005d) + + (0x0000473c, 0x00004b33) + 2 + + + (0x00004332, 0x00002b87) + 1 + + + + (0x00000756, 0x00004b4e) + + (0x00003201, 0x000076df) + 0 + + + (0x0000708d, 0x0000304b) + 0 + + + + (0x00000b7a, 0x00004f19) + + (0x000000e8, 0x0000472c) + 0 + + + (0x000046fb, 0x00005e12) + 1 + + + + (0x00000bc7, 0x00003bfd) + + (0x0000725b, 0x000060f1) + 0 + + + (0x00003201, 0x000076df) + 2 + + + + (0x00000d71, 0x0000067e) + + (0x00002405, 0x00000710) + 0 + + + (0x00007539, 0x00002442) + 0 + + + + (0x00000e67, 0x00006dbc) + + (0x000011a7, 0x000067a4) + 0 + + + (0x0000346d, 0x00007c9e) + 0 + + + + (0x000010d8, 0x0000239b) + + (0x00001b4b, 0x00002126) + 0 + + + (0x00003201, 0x000076df) + 5 + + + + (0x000011ef, 0x000063c6) + + (0x000043c3, 0x0000549b) + 0 + + + (0x00005106, 0x00006115) + 0 + + + + (0x00001219, 0x00000c50) + + (0x000049d1, 0x00000cc1) + 0 + + + (0x00006a05, 0x0000559e) + 1 + + + + (0x00001937, 0x00002683) + + (0x00005106, 0x00006115) + 0 + + + (0x0000016f, 0x000011e2) + 2 + + + + (0x00001a9a, 0x00006879) + + (0x000011a7, 0x000067a4) + 0 + + + (0x00006e5c, 0x000078fb) + 0 + + + + (0x00001b8f, 0x000067e2) + + (0x00006147, 0x000044a9) + 0 + + + (0x00000c7a, 0x00002d44) + 2 + + + + (0x00001d54, 0x000008ac) + + (0x00006e9b, 0x00003cc8) + 0 + + + (0x0000261b, 0x0000449c) + 2 + + + + (0x00001e4b, 0x00004646) + + (0x0000261b, 0x0000449c) + 0 + + + (0x00003201, 0x000076df) + 0 + + + + (0x00002205, 0x00007d5d) + + (0x0000346d, 0x00007c9e) + 0 + + + (0x0000725b, 0x000060f1) + 2 + + + + (0x000023e4, 0x000042ea) + + (0x000049d1, 0x00000cc1) + 0 + + + (0x00001f34, 0x00007fa8) + 1 + + + + (0x0000240d, 0x000078f8) + + (0x00000870, 0x000031c1) + 0 + + + (0x00006e9b, 0x00003cc8) + 0 + + + + (0x00002460, 0x00000d5f) + + (0x00000870, 0x000031c1) + 0 + + + (0x000046fb, 0x00005e12) + 0 + + + + (0x00002765, 0x00004bf8) + + (0x00004018, 0x00001872) + 0 + + + (0x000043c3, 0x0000549b) + 0 + + + + (0x0000298a, 0x000003f5) + + (0x000049d1, 0x00000cc1) + 1 + + + (0x00005106, 0x00006115) + 1 + + + + (0x00002f1c, 0x00001d6b) + + (0x00000c7a, 0x00002d44) + 0 + + + (0x00003201, 0x000076df) + 1 + + + + (0x0000319c, 0x00001656) + + (0x00004332, 0x00002b87) + 0 + + + (0x00006920, 0x00005bd8) + 0 + + + + (0x000031b5, 0x00003eea) + + (0x00004018, 0x00001872) + 1 + + + (0x000049d1, 0x00000cc1) + 0 + + + + (0x000031d8, 0x00005976) + + (0x00006a05, 0x0000559e) + 0 + + + (0x0000016f, 0x000011e2) + 1 + + + + (0x00003385, 0x00003ea2) + + (0x00006920, 0x00005bd8) + 1 + + + (0x00000c7a, 0x00002d44) + 0 + + + + (0x000034de, 0x000066d1) + + (0x00007892, 0x000040f3) + 0 + + + (0x00005f1a, 0x00000333) + 1 + + + + (0x000035f2, 0x00005b94) + + (0x00005e32, 0x00003083) + 0 + + + (0x00001e37, 0x00005fb2) + 0 + + + + (0x000037ad, 0x00001e4f) + + (0x00001f34, 0x00007fa8) + 0 + + + (0x00001b4b, 0x00002126) + 1 + + + + (0x00003b5c, 0x000064bf) + + (0x00002405, 0x00000710) + 0 + + + (0x00006147, 0x000044a9) + 0 + + + + (0x00003df0, 0x00000e27) + + (0x00001e37, 0x00005fb2) + 0 + + + (0x00001b4b, 0x00002126) + 2 + + + + (0x00003ecc, 0x00002f2c) + + (0x00007892, 0x000040f3) + 0 + + + (0x00006e5c, 0x000078fb) + 1 + + + + (0x0000408d, 0x000013f0) + + (0x000008f3, 0x00007596) + 1 + + + (0x0000725b, 0x000060f1) + 0 + + + + (0x00004189, 0x00001520) + + (0x00005f1a, 0x00000333) + 0 + + + (0x00007097, 0x0000281e) + 1 + + + + (0x00004244, 0x00004ffb) + + (0x00007097, 0x0000281e) + 0 + + + (0x00003201, 0x000076df) + 3 + + + + (0x00004345, 0x00005215) + + (0x000000e8, 0x0000472c) + 1 + + + (0x00006147, 0x000044a9) + 1 + + + + (0x0000457c, 0x00007695) + + (0x000049d1, 0x00000cc1) + 1 + + + (0x00001e37, 0x00005fb2) + 1 + + + + (0x0000460f, 0x00003e34) + + (0x00004332, 0x00002b87) + 1 + + + (0x000008f3, 0x00007596) + 1 + + + + (0x000048f4, 0x00000687) + + (0x00006920, 0x00005bd8) + 0 + + + (0x00000870, 0x000031c1) + 0 + + + + (0x00004c74, 0x00004d18) + + (0x00007539, 0x00002442) + 0 + + + (0x00000c7a, 0x00002d44) + 1 + + + + (0x00004f6a, 0x000008f9) + + (0x00007cc2, 0x000011eb) + 0 + + + (0x0000294d, 0x00005f52) + 0 + + + + (0x000054b3, 0x00003ae7) + + (0x00004332, 0x00002b87) + 0 + + + (0x000008f3, 0x00007596) + 0 + + + + (0x00005632, 0x00005682) + + (0x000043c3, 0x0000549b) + 0 + + + (0x00006a05, 0x0000559e) + 0 + + + + (0x00005c5c, 0x000074ef) + + (0x00004018, 0x00001872) + 1 + + + (0x00001b4b, 0x00002126) + 0 + + + + (0x00005db6, 0x000010ed) + + (0x00005e32, 0x00003083) + 0 + + + (0x00001f34, 0x00007fa8) + 0 + + + + (0x00005dce, 0x0000651e) + + (0x00004332, 0x00002b87) + 1 + + + (0x00004018, 0x00001872) + 1 + + + + (0x000060bf, 0x0000657b) + + (0x000008f3, 0x00007596) + 1 + + + (0x00007892, 0x000040f3) + 0 + + + + (0x0000654b, 0x000025b5) + + (0x000008f3, 0x00007596) + 0 + + + (0x00007cc2, 0x000011eb) + 0 + + + + (0x0000673b, 0x00003670) + + (0x00006920, 0x00005bd8) + 1 + + + (0x0000261b, 0x0000449c) + 0 + + + + (0x000067f1, 0x00002cb7) + + (0x000046fb, 0x00005e12) + 0 + + + (0x0000261b, 0x0000449c) + 1 + + + + (0x000068f8, 0x00007d09) + + (0x00006e5c, 0x000078fb) + 0 + + + (0x0000725b, 0x000060f1) + 1 + + + + (0x00006e1a, 0x00004e64) + + (0x00006920, 0x00005bd8) + 1 + + + (0x000000e8, 0x0000472c) + 0 + + + + (0x00006f2a, 0x0000664c) + + (0x00006920, 0x00005bd8) + 0 + + + (0x00002405, 0x00000710) + 0 + + + + (0x00006fb3, 0x000062ac) + + (0x000000e8, 0x0000472c) + 1 + + + (0x00006e9b, 0x00003cc8) + 1 + + + + (0x00007190, 0x0000754a) + + (0x00004018, 0x00001872) + 0 + + + (0x00005e32, 0x00003083) + 0 + + + + (0x0000743b, 0x00003732) + + (0x000008f3, 0x00007596) + 0 + + + (0x000011a7, 0x000067a4) + 0 + + + + (0x0000766f, 0x0000290d) + + (0x0000473c, 0x00004b33) + 1 + + + (0x0000201a, 0x00002eea) + 0 + + + + (0x000079c8, 0x000009cb) + + (0x00004332, 0x00002b87) + 1 + + + (0x00006920, 0x00005bd8) + 1 + + + + (0x00007ad2, 0x00003d5c) + + (0x00004332, 0x00002b87) + 0 + + + (0x00004018, 0x00001872) + 0 + + + + (0x00007b5d, 0x00002332) + + (0x0000294d, 0x00005f52) + 0 + + + (0x00007097, 0x0000281e) + 2 + + + + (0x00007bbf, 0x0000228f) + + (0x00007cc2, 0x000011eb) + 0 + + + (0x00005f1a, 0x00000333) + 0 + + + + (0x00007d1d, 0x00002756) + + (0x00004018, 0x00001872) + 1 + + + (0x0000016f, 0x000011e2) + 0 + + + + (0x00007de0, 0x00002720) + + (0x0000016f, 0x000011e2) + 0 + + + (0x00003201, 0x000076df) + 4 + + + + (0x00007e12, 0x000016fe) + + (0x00007892, 0x000040f3) + 1 + + + (0x0000346d, 0x00007c9e) + 1 + + + + (0x00007ffc, 0x000017b6) + + (0x0000201a, 0x00002eea) + 0 + + + (0x00004332, 0x00002b87) + 0 + + + + + + (0x00002884, 0x000068e5) + Signal processing for the <b>second</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 1552 + + + (0x7234b86b, 0x2b8651a5) + -544 + + + + + (0x00003a98, 0x00004608) + Signal processing for the <b>third</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 2256 + + + (0x7234b86b, 0x2b8651a5) + -560 + + + + + (0x00004daa, 0x00005557) + Signal processing for the <b>first</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 784 + + + (0x7234b86b, 0x2b8651a5) + -544 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":400,"identifier":"(0x00002e27, 0x00000e58)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":400},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000375a, 0x000012ca)","index":0,"name":"Default tab","parentIdentifier":"(0x00002e27, 0x00000e58)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00002384, 0x000054e5)","index":0,"name":"Empty","parentIdentifier":"(0x0000375a, 0x000012ca)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jozef Legeny + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + SSVEP CSP Training + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/ + + + (0xf6b2e3fa, 0x7bd43926) + SSVEP + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-4-classifier-training-csp.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-4-classifier-training-csp.xml new file mode 100644 index 0000000..9f7f794 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-4-classifier-training-csp.xml @@ -0,0 +1,8110 @@ + + 1 + Designer + 2.0.0 + + + + + + (0x00000095, 0x00004ac9) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1616 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0006e19e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000000cc, 0x00007022) + Frequency 2 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 13.0832 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 13.5832 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x207c9054, 0x3c841b63) + 2080 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2h1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002a12f6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000246, 0x000064ad) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 2080 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-2h1 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0013a92d) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000404, 0x00006628) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 2176 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0007570b) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000541, 0x00000c83) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0006184a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000005c9, 0x0000028c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 2736 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0007aaee) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000005ff, 0x000043e2) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 1808 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00066c27) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000085c, 0x00007eec) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 1616 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0006d0d6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001029, 0x0000314c) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 2480 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00092ccf) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000122b, 0x00007d60) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0006d0d7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001255, 0x00001f96) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -720 + + + (0x207c9054, 0x3c841b63) + 1616 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017daea) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001492, 0x000002fa) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -448 + + + (0x207c9054, 0x3c841b63) + 2640 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00135547) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001548, 0x00000d50) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x207c9054, 0x3c841b63) + 1808 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00078962) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000176b, 0x00000dd0) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1232 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00090b3f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000184e, 0x00006c42) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1424 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0006c00f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000189f, 0x0000711e) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 2176 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00065b65) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000018da, 0x00007bae) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0006c00c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000192e, 0x00004005) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 3.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 1984 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00538ef6) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001931, 0x000040b6) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000a4a0a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001974, 0x00001281) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x207c9054, 0x3c841b63) + 2928 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0007789c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001b26, 0x000073a7) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x207c9054, 0x3c841b63) + 2736 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0008c828) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001ec8, 0x0000391a) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00074647) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001f4c, 0x00001efa) + FlipSwitch + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/classifier-training-flipswitch.lua + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x207c9054, 0x3c841b63) + 1840 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00cfe158) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001f89, 0x000005c1) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 3.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 1808 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0049fd82) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000201a, 0x00002eea) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + : + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -800 + + + (0x207c9054, 0x3c841b63) + 1552 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/channel-selector.cfg + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000021ac, 0x000054ca) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000852b5) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000022ef, 0x00000f72) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 2560 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00073582) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000233d, 0x00002e85) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1984 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0007789a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000235e, 0x00000c0f) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 2080 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00091c08) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002787, 0x000037e6) + Frequency 1 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 10.6591 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 11.1591 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x207c9054, 0x3c841b63) + 1328 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1h1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0027fa1c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000028fa, 0x00000754) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 3.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 2368 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0046b6a3) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00002c16, 0x000001b1) + Frequency 3 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 7.25 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 7.75 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x207c9054, 0x3c841b63) + 2464 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3b.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00268900) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002c77, 0x0000769c) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x207c9054, 0x3c841b63) + 1424 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000724b9) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002d10, 0x0000378f) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x207c9054, 0x3c841b63) + 2176 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0008205f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003054, 0x00004bcf) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 3.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 1232 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004e8316) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00003311, 0x00001f72) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00068dbb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003553, 0x000063a2) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 1328 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-1h1 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0014727b) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003581, 0x00000455) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0006af47) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000364f, 0x00000b22) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 736 + + + (0x207c9054, 0x3c841b63) + 1840 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0033e78a) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003964, 0x00003793) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x207c9054, 0x3c841b63) + 1232 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000841ec) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003b3a, 0x00002285) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 2 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 0 1 3 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x207c9054, 0x3c841b63) + 1904 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00e4b87a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003bf3, 0x000010f1) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 0 2 3 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x207c9054, 0x3c841b63) + 1152 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d3f18c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003d94, 0x00002c4a) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 2368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0009b306) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003f5b, 0x00004c46) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 3.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00497742) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004056, 0x0000145f) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 1984 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00090b40) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004488, 0x00004def) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 0 1 2 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x207c9054, 0x3c841b63) + 2656 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d91eeb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x000044fa, 0x000030b2) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 3.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 1424 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004a2fd6) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004751, 0x00005502) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 2832 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-3h1 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0012dfd9) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004839, 0x00003b7c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 3.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 2736 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004a4095) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004a77, 0x0000114e) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 2560 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0007aaf1) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004cae, 0x00006fc3) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/ssvep-record-current.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -880 + + + (0x207c9054, 0x3c841b63) + 1648 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/file-reader-training.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003c3a43) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00004ce8, 0x00004e35) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 3.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 1616 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0048cf78) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004f88, 0x00006c9e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -448 + + + (0x207c9054, 0x3c841b63) + 1136 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0013b9f3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004fb9, 0x000031fb) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 3.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 2560 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00470a81) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00005068, 0x0000760c) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 2176 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0007fed2) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000053f5, 0x000011d7) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 2736 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0006e198) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005433, 0x00007d99) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 2928 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00078960) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000054ed, 0x00006e46) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 2736 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00068db4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000556a, 0x000031e7) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x207c9054, 0x3c841b63) + 2560 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0006af48) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005b4d, 0x0000203c) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -448 + + + (0x207c9054, 0x3c841b63) + 1888 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00126a66) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005dfe, 0x00000adc) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1728 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0006e19d) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005e51, 0x00001c39) + Frequency 3 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x207c9054, 0x3c841b63) + 2832 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3h1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0025e13b) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005eb2, 0x0000731e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 3.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 2928 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0045cbbb) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00005fe3, 0x00000c3f) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1808 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0006290c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000062f6, 0x00003913) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 2560 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00077899) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000642a, 0x000005e7) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 2928 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00079a2a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006471, 0x0000655e) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 2464 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-3b + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00160525) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006648, 0x00001163) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 1232 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0006f265) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000067ff, 0x00006e46) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1328 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00068db8) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000684b, 0x000058b5) + Frequency 2 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 6.4166 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 6.9166 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x207c9054, 0x3c841b63) + 1712 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2b.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0024e593) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000698e, 0x00004800) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 2832 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00069e81) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006a0a, 0x0000506e) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 1424 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0008a699) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006c17, 0x00007476) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1984 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0006d0d6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006e72, 0x0000055e) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 2368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00095f24) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006e95, 0x00000e3b) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1616 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00092ccb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006ecb, 0x000073d4) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 3.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00471b3e) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00006f67, 0x00006a6a) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 3.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 2176 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0049235f) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000714c, 0x00006e05) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-1b + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00136610) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000077b2, 0x00000743) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x207c9054, 0x3c841b63) + 2368 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0007570c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007891, 0x0000763d) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1232 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0006af48) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078d2, 0x00003dcf) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 2368 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00065b66) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x00003bb0) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1808 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00083125) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000079b7, 0x000035e9) + Frequency 1 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 5.20455 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 5.70455 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1b.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0027c7c4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007a0e, 0x00005a30) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 2928 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00067cf1) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007b04, 0x00006d3f) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x207c9054, 0x3c841b63) + 1984 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0007032d) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007c3d, 0x00003437) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00070329) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007d5a, 0x000016fc) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 1712 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-2b + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0015097d) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007dee, 0x0000718a) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1424 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0006c00f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007fd9, 0x00002dd8) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96 + + + (0x207c9054, 0x3c841b63) + 1616 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00073581) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7df0500c, 0x5b8a0a38) + Trainer for frequency 1 + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/classifiers/classifier-1 + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_00 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416.000000 + + + (0x207c9054, 0x3c841b63) + 1168.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00110a14) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x7df0500c, 0x5b8a0a39) + Trainer for frequency 1 + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/classifiers/classifier-3 + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_00 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416.000000 + + + (0x207c9054, 0x3c841b63) + 2656.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00101f33) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x7df0500c, 0x5b8a0a3a) + Trainer for frequency 1 + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/classifiers/classifier-2 + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_00 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432.000000 + + + (0x207c9054, 0x3c841b63) + 1872.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000ee070) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x0000026b, 0x000060ed) + + (0x00003bf3, 0x000010f1) + 0 + + + (0x00003054, 0x00004bcf) + 1 + + + + (0x000002a4, 0x00005989) + + (0x00001ec8, 0x0000391a) + 0 + + + (0x00003581, 0x00000455) + 0 + + + + (0x00000517, 0x00004dc5) + + (0x000028fa, 0x00000754) + 0 + + + (0x000077b2, 0x00000743) + 0 + + + + (0x00000545, 0x00006090) + + (0x00003b3a, 0x00002285) + 0 + + + (0x00004ce8, 0x00004e35) + 1 + + + + (0x0000057a, 0x0000328b) + + (0x000079b7, 0x000035e9) + 0 + + + (0x00006ecb, 0x000073d4) + 0 + + + + (0x000006e3, 0x00007890) + + (0x00001492, 0x000002fa) + 0 + + + (0x00004751, 0x00005502) + 0 + + + + (0x00000746, 0x00006bae) + + (0x000000cc, 0x00007022) + 0 + + + (0x00006f67, 0x00006a6a) + 0 + + + + (0x0000094e, 0x0000779d) + + (0x0000192e, 0x00004005) + 0 + + + (0x00007b04, 0x00006d3f) + 0 + + + + (0x00000ad8, 0x00007b19) + + (0x00002c16, 0x000001b1) + 0 + + + (0x00004fb9, 0x000031fb) + 0 + + + + (0x00000c2c, 0x0000200b) + + (0x00003311, 0x00001f72) + 0 + + + (0x00007c3d, 0x00003437) + 0 + + + + (0x00000c90, 0x00004fcc) + + (0x00006f67, 0x00006a6a) + 0 + + + (0x00002d10, 0x0000378f) + 0 + + + + (0x00000f0a, 0x00007010) + + (0x00005fe3, 0x00000c3f) + 0 + + + (0x000005ff, 0x000043e2) + 0 + + + + (0x00000fc5, 0x00004908) + + (0x00005b4d, 0x0000203c) + 0 + + + (0x00007d5a, 0x000016fc) + 0 + + + + (0x00001068, 0x00005a8c) + + (0x00004751, 0x00005502) + 0 + + + (0x00005e51, 0x00001c39) + 0 + + + + (0x000010b3, 0x00004897) + + (0x000062f6, 0x00003913) + 0 + + + (0x00004a77, 0x0000114e) + 0 + + + + (0x000011d9, 0x00004915) + + (0x0000122b, 0x00007d60) + 0 + + + (0x000067ff, 0x00006e46) + 0 + + + + (0x000013a8, 0x00001d3f) + + (0x00003964, 0x00003793) + 0 + + + (0x0000176b, 0x00000dd0) + 0 + + + + (0x00001a89, 0x00004444) + + (0x000077b2, 0x00000743) + 0 + + + (0x00006e72, 0x0000055e) + 0 + + + + (0x00001b19, 0x00002ac0) + + (0x00003054, 0x00004bcf) + 0 + + + (0x00003964, 0x00003793) + 0 + + + + (0x00001cee, 0x00002535) + + (0x00006ecb, 0x000073d4) + 0 + + + (0x00003311, 0x00001f72) + 0 + + + + (0x00001dae, 0x00007da0) + + (0x00001255, 0x00001f96) + 0 + + + (0x00001492, 0x000002fa) + 0 + + + + (0x00001f59, 0x0000039c) + + (0x00004488, 0x00004def) + 0 + + + (0x00004839, 0x00003b7c) + 1 + + + + (0x00002041, 0x0000245f) + + (0x00001974, 0x00001281) + 0 + + + (0x0000642a, 0x000005e7) + 0 + + + + (0x00002132, 0x00002b9c) + + (0x0000085c, 0x00007eec) + 0 + + + (0x00005dfe, 0x00000adc) + 0 + + + + (0x000022e0, 0x0000527e) + + (0x0000714c, 0x00006e05) + 0 + + + (0x000079b7, 0x000035e9) + 0 + + + + (0x00002466, 0x00002be7) + + (0x00004f88, 0x00006c9e) + 0 + + + (0x00003553, 0x000063a2) + 0 + + + + (0x000024c7, 0x00002ef2) + + (0x00006c17, 0x00007476) + 0 + + + (0x00004056, 0x0000145f) + 0 + + + + (0x0000272c, 0x000047c4) + + (0x00007fd9, 0x00002dd8) + 0 + + + (0x00006e95, 0x00000e3b) + 0 + + + + (0x0000274c, 0x00004b91) + + (0x000054ed, 0x00006e46) + 0 + + + (0x000005c9, 0x0000028c) + 0 + + + + (0x00002852, 0x00007182) + + (0x00003bf3, 0x000010f1) + 0 + + + (0x00003f5b, 0x00004c46) + 1 + + + + (0x00002d00, 0x00005b0b) + + (0x00001255, 0x00001f96) + 1 + + + (0x00005b4d, 0x0000203c) + 1 + + + + (0x00002d64, 0x000068a6) + + (0x00001255, 0x00001f96) + 0 + + + (0x00005b4d, 0x0000203c) + 0 + + + + (0x000031f1, 0x0000424a) + + (0x00004fb9, 0x000031fb) + 0 + + + (0x0000556a, 0x000031e7) + 0 + + + + (0x0000355a, 0x000068ee) + + (0x00001f89, 0x000005c1) + 0 + + + (0x00001548, 0x00000d50) + 0 + + + + (0x00003635, 0x00001046) + + (0x00004839, 0x00003b7c) + 0 + + + (0x00001b26, 0x000073a7) + 0 + + + + (0x0000363c, 0x000040c6) + + (0x00001492, 0x000002fa) + 1 + + + (0x00004488, 0x00004def) + 0 + + + + (0x000037cc, 0x00001209) + + (0x00006471, 0x0000655e) + 0 + + + (0x00002c16, 0x000001b1) + 0 + + + + (0x00003921, 0x00002714) + + (0x0000189f, 0x0000711e) + 0 + + + (0x00005068, 0x0000760c) + 0 + + + + (0x00003b60, 0x0000398f) + + (0x000053f5, 0x000011d7) + 0 + + + (0x00001029, 0x0000314c) + 1 + + + + (0x00003b9a, 0x0000699a) + + (0x00003d94, 0x00002c4a) + 0 + + + (0x00001029, 0x0000314c) + 0 + + + + (0x00003d50, 0x000060c1) + + (0x00003bf3, 0x000010f1) + 1 + + + (0x00006ecb, 0x000073d4) + 1 + + + + (0x00003f5e, 0x00003093) + + (0x000022ef, 0x00000f72) + 0 + + + (0x0000698e, 0x00004800) + 0 + + + + (0x0000408c, 0x00006b62) + + (0x00005068, 0x0000760c) + 0 + + + (0x0000235e, 0x00000c0f) + 1 + + + + (0x000040f8, 0x00000445) + + (0x00003f5b, 0x00004c46) + 0 + + + (0x00001931, 0x000040b6) + 0 + + + + (0x000042a4, 0x00002626) + + (0x00001492, 0x000002fa) + 0 + + + (0x00006471, 0x0000655e) + 0 + + + + (0x0000436c, 0x00005cad) + + (0x00003b3a, 0x00002285) + 0 + + + (0x0000192e, 0x00004005) + 1 + + + + (0x00004491, 0x00001403) + + (0x000000cc, 0x00007022) + 0 + + + (0x0000192e, 0x00004005) + 0 + + + + (0x00004536, 0x00002a12) + + (0x00007c3d, 0x00003437) + 0 + + + (0x00000541, 0x00000c83) + 0 + + + + (0x000045f5, 0x000044f7) + + (0x00005b4d, 0x0000203c) + 0 + + + (0x00000246, 0x000064ad) + 0 + + + + (0x0000473b, 0x00002324) + + (0x00001f4c, 0x00001efa) + 0 + + + (0x0000364f, 0x00000b22) + 0 + + + + (0x0000478e, 0x00003d1f) + + (0x000018da, 0x00007bae) + 0 + + + (0x000021ac, 0x000054ca) + 0 + + + + (0x00004800, 0x00000b49) + + (0x00003bf3, 0x000010f1) + 1 + + + (0x000044fa, 0x000030b2) + 1 + + + + (0x00004813, 0x00001df9) + + (0x00005e51, 0x00001c39) + 0 + + + (0x00004839, 0x00003b7c) + 0 + + + + (0x00004add, 0x00002430) + + (0x00003b3a, 0x00002285) + 1 + + + (0x00001f89, 0x000005c1) + 1 + + + + (0x00004b6e, 0x0000666b) + + (0x000079b7, 0x000035e9) + 0 + + + (0x00003f5b, 0x00004c46) + 0 + + + + (0x00004c51, 0x00006937) + + (0x00001931, 0x000040b6) + 0 + + + (0x00001ec8, 0x0000391a) + 0 + + + + (0x00004cbc, 0x000052f2) + + (0x0000201a, 0x00002eea) + 0 + + + (0x00001255, 0x00001f96) + 0 + + + + (0x00004d53, 0x00005da3) + + (0x0000176b, 0x00000dd0) + 0 + + + (0x00007891, 0x0000763d) + 0 + + + + (0x00004f2d, 0x0000590d) + + (0x00001548, 0x00000d50) + 0 + + + (0x000078f6, 0x00003bb0) + 0 + + + + (0x00004f8c, 0x00005109) + + (0x000078f6, 0x00003bb0) + 0 + + + (0x00005fe3, 0x00000c3f) + 0 + + + + (0x00005232, 0x00006268) + + (0x000005ff, 0x000043e2) + 0 + + + (0x0000235e, 0x00000c0f) + 0 + + + + (0x00005392, 0x000033b2) + + (0x00000095, 0x00004ac9) + 0 + + + (0x0000085c, 0x00007eec) + 0 + + + + (0x0000568e, 0x00005375) + + (0x00006a0a, 0x0000506e) + 0 + + + (0x000067ff, 0x00006e46) + 1 + + + + (0x000056da, 0x00000398) + + (0x00002787, 0x000037e6) + 0 + + + (0x000044fa, 0x000030b2) + 0 + + + + (0x000057a9, 0x00003614) + + (0x00002787, 0x000037e6) + 0 + + + (0x00003054, 0x00004bcf) + 0 + + + + (0x000057c5, 0x00006fea) + + (0x00004f88, 0x00006c9e) + 1 + + + (0x00003bf3, 0x000010f1) + 0 + + + + (0x000058fa, 0x000063a1) + + (0x00006e72, 0x0000055e) + 0 + + + (0x000078d2, 0x00003dcf) + 0 + + + + (0x0000594e, 0x00003d14) + + (0x0000233d, 0x00002e85) + 0 + + + (0x00006c17, 0x00007476) + 0 + + + + (0x0000599c, 0x000024a5) + + (0x00005e51, 0x00001c39) + 0 + + + (0x00005eb2, 0x0000731e) + 0 + + + + (0x000059e3, 0x000070ce) + + (0x00002c77, 0x0000769c) + 0 + + + (0x0000184e, 0x00006c42) + 0 + + + + (0x00005adc, 0x0000144b) + + (0x00007891, 0x0000763d) + 0 + + + (0x00006648, 0x00001163) + 0 + + + + (0x00005b17, 0x0000108b) + + (0x00004056, 0x0000145f) + 0 + + + (0x00005dfe, 0x00000adc) + 1 + + + + (0x00005b98, 0x00002fde) + + (0x00003581, 0x00000455) + 0 + + + (0x000018da, 0x00007bae) + 0 + + + + (0x00005c02, 0x000052c0) + + (0x00001255, 0x00001f96) + 1 + + + (0x00004f88, 0x00006c9e) + 1 + + + + (0x00005c65, 0x0000717c) + + (0x00000246, 0x000064ad) + 0 + + + (0x000000cc, 0x00007022) + 0 + + + + (0x00005d55, 0x00006ceb) + + (0x00007b04, 0x00006d3f) + 0 + + + (0x0000233d, 0x00002e85) + 0 + + + + (0x00005e1d, 0x000060b7) + + (0x000044fa, 0x000030b2) + 0 + + + (0x00002c77, 0x0000769c) + 0 + + + + (0x00005f97, 0x00005168) + + (0x00004f88, 0x00006c9e) + 0 + + + (0x0000714c, 0x00006e05) + 0 + + + + (0x00006041, 0x000011e3) + + (0x0000684b, 0x000058b5) + 0 + + + (0x00004ce8, 0x00004e35) + 0 + + + + (0x00006165, 0x00004926) + + (0x00007d5a, 0x000016fc) + 0 + + + (0x0000684b, 0x000058b5) + 0 + + + + (0x00006222, 0x000071a9) + + (0x000078d2, 0x00003dcf) + 0 + + + (0x00003d94, 0x00002c4a) + 0 + + + + (0x000063a0, 0x00004cfa) + + (0x00001b26, 0x000073a7) + 0 + + + (0x000054ed, 0x00006e46) + 0 + + + + (0x00006492, 0x00001b07) + + (0x00000404, 0x00006628) + 0 + + + (0x0000189f, 0x0000711e) + 0 + + + + (0x0000653a, 0x0000561e) + + (0x00004488, 0x00004def) + 1 + + + (0x00004fb9, 0x000031fb) + 1 + + + + (0x000065f4, 0x0000131d) + + (0x00001255, 0x00001f96) + 0 + + + (0x00004f88, 0x00006c9e) + 0 + + + + (0x0000686f, 0x000052b9) + + (0x0000684b, 0x000058b5) + 0 + + + (0x00001f89, 0x000005c1) + 0 + + + + (0x00006898, 0x00007bf7) + + (0x00004488, 0x00004def) + 1 + + + (0x00005eb2, 0x0000731e) + 1 + + + + (0x00006921, 0x00007c36) + + (0x00001255, 0x00001f96) + 1 + + + (0x00001492, 0x000002fa) + 1 + + + + (0x00006932, 0x00005ef4) + + (0x00005b4d, 0x0000203c) + 1 + + + (0x00003b3a, 0x00002285) + 0 + + + + (0x00006a67, 0x000036d7) + + (0x00003b3a, 0x00002285) + 1 + + + (0x00006f67, 0x00006a6a) + 1 + + + + (0x00006bd7, 0x00005f32) + + (0x0000184e, 0x00006c42) + 0 + + + (0x00007dee, 0x0000718a) + 0 + + + + (0x00006d04, 0x0000778d) + + (0x00000541, 0x00000c83) + 0 + + + (0x0000122b, 0x00007d60) + 0 + + + + (0x00006d3d, 0x000020d1) + + (0x00003553, 0x000063a2) + 0 + + + (0x00002787, 0x000037e6) + 0 + + + + (0x00006e9c, 0x00005498) + + (0x00005eb2, 0x0000731e) + 0 + + + (0x00001974, 0x00001281) + 0 + + + + (0x00006f5d, 0x00001fdf) + + (0x00007dee, 0x0000718a) + 0 + + + (0x00006a0a, 0x0000506e) + 0 + + + + (0x00007157, 0x00001535) + + (0x000005c9, 0x0000028c) + 0 + + + (0x000053f5, 0x000011d7) + 0 + + + + (0x0000746e, 0x000054cf) + + (0x00002c16, 0x000001b1) + 0 + + + (0x000028fa, 0x00000754) + 0 + + + + (0x000076f8, 0x00007e4d) + + (0x00006e95, 0x00000e3b) + 0 + + + (0x00000095, 0x00004ac9) + 0 + + + + (0x000077ec, 0x000021e3) + + (0x00004488, 0x00004def) + 0 + + + (0x000028fa, 0x00000754) + 1 + + + + (0x00007bc4, 0x00003806) + + (0x00002d10, 0x0000378f) + 0 + + + (0x00000404, 0x00006628) + 0 + + + + (0x00007bca, 0x00007526) + + (0x00007a0e, 0x00005a30) + 0 + + + (0x0000698e, 0x00004800) + 1 + + + + (0x00007bea, 0x000038cf) + + (0x00004cae, 0x00006fc3) + 1 + + + (0x0000201a, 0x00002eea) + 0 + + + + (0x00007c24, 0x00004985) + + (0x00006648, 0x00001163) + 0 + + + (0x000021ac, 0x000054ca) + 1 + + + + (0x00007c63, 0x00005d2e) + + (0x0000642a, 0x000005e7) + 0 + + + (0x00005433, 0x00007d99) + 0 + + + + (0x00007d46, 0x00004edc) + + (0x00004a77, 0x0000114e) + 0 + + + (0x000022ef, 0x00000f72) + 0 + + + + (0x00007df2, 0x00003714) + + (0x00004ce8, 0x00004e35) + 0 + + + (0x00007fd9, 0x00002dd8) + 0 + + + + (0x00007e0f, 0x00000de4) + + (0x0000556a, 0x000031e7) + 0 + + + (0x000062f6, 0x00003913) + 0 + + + + (0x00007ecb, 0x000048ea) + + (0x00004cae, 0x00006fc3) + 2 + + + (0x00001255, 0x00001f96) + 1 + + + + (0x00007fc4, 0x00003216) + + (0x00005433, 0x00007d99) + 0 + + + (0x00007a0e, 0x00005a30) + 0 + + + + (0x001dc9df, 0x6dfda215) + + (0x00001492, 0x000002fa) + 1 + + + (0x7df0500c, 0x5b8a0a39) + 0 + + + + (0x0b17f5b4, 0x7a200137) + + (0x7df0500c, 0x5b8a0a39) + 0 + + + (0x00001f4c, 0x00001efa) + 2 + + + + (0x1a8df17f, 0x23591c7b) + + (0x7df0500c, 0x5b8a0a38) + 0 + + + (0x00001f4c, 0x00001efa) + 0 + + + + (0x2fca9941, 0x5ea18b3d) + + (0x00004f88, 0x00006c9e) + 1 + + + (0x7df0500c, 0x5b8a0a38) + 0 + + + + (0x3e8134a3, 0x61283b10) + + (0x00005b4d, 0x0000203c) + 1 + + + (0x7df0500c, 0x5b8a0a3a) + 0 + + + + (0x411aa3a8, 0x27e8f73e) + + (0x000067ff, 0x00006e46) + 0 + + + (0x7df0500c, 0x5b8a0a38) + 2 + + + + (0x4deb2045, 0x574feac7) + + (0x00001029, 0x0000314c) + 0 + + + (0x7df0500c, 0x5b8a0a39) + 1 + + + + (0x4f7d5966, 0x43fa8bf4) + + (0x00005dfe, 0x00000adc) + 0 + + + (0x7df0500c, 0x5b8a0a3a) + 1 + + + + (0x50b68be2, 0x67f71949) + + (0x000021ac, 0x000054ca) + 0 + + + (0x7df0500c, 0x5b8a0a38) + 1 + + + + (0x5b52e280, 0x759748f6) + + (0x7df0500c, 0x5b8a0a3a) + 0 + + + (0x00001f4c, 0x00001efa) + 1 + + + + (0x6867f395, 0x467f886f) + + (0x0000698e, 0x00004800) + 0 + + + (0x7df0500c, 0x5b8a0a39) + 2 + + + + (0x69e5e980, 0x2171ad4e) + + (0x0000235e, 0x00000c0f) + 0 + + + (0x7df0500c, 0x5b8a0a3a) + 2 + + + + + + (0x00001914, 0x00001df9) + Feature vector containing signal +during non-stimulated periods. + + + (0x473d9a43, 0x97fc0a97) + 2832 + + + (0x7234b86b, 0x2b8651a5) + 256 + + + + + (0x0000256a, 0x00005928) + Signal processing for the <b>third</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 2656 + + + (0x7234b86b, 0x2b8651a5) + -544 + + + + + (0x000034e5, 0x00002c5d) + Signal processing for the <b>second</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 1760 + + + (0x7234b86b, 0x2b8651a5) + -592 + + + + + (0x00003784, 0x000063ab) + Feature vector containing signal +during non-stimulated periods. + + + (0x473d9a43, 0x97fc0a97) + 2080 + + + (0x7234b86b, 0x2b8651a5) + 256 + + + + + (0x00003c49, 0x0000798c) + Feature vector containing signal +during stimulated periods. + + + (0x473d9a43, 0x97fc0a97) + 1728 + + + (0x7234b86b, 0x2b8651a5) + 256 + + + + + (0x00005b95, 0x000000bc) + Feature vector containing signal +during stimulated periods. + + + (0x473d9a43, 0x97fc0a97) + 976 + + + (0x7234b86b, 0x2b8651a5) + 256 + + + + + (0x00005e93, 0x0000058a) + Signal processing for the <b>first</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 1008 + + + (0x7234b86b, 0x2b8651a5) + -592 + + + + + (0x00007e01, 0x00001ef2) + Feature vector containing signal +during stimulated periods. + + + (0x473d9a43, 0x97fc0a97) + 2480 + + + (0x7234b86b, 0x2b8651a5) + 256 + + + + + (0x00007fef, 0x00002500) + Feature vector containing signal +during non-stimulated periods. + + + (0x473d9a43, 0x97fc0a97) + 1328 + + + (0x7234b86b, 0x2b8651a5) + 256 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":400,"identifier":"(0x0000668c, 0x00006a39)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":400},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000059c4, 0x0000399e)","index":0,"name":"Default tab","parentIdentifier":"(0x0000668c, 0x00006a39)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000740f, 0x0000466b)","index":0,"name":"Empty","parentIdentifier":"(0x000059c4, 0x0000399e)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jozef Legeny + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + SSVEP - Classifier Training CSP + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/ + + + (0xf6b2e3fa, 0x7bd43926) + SSVEP + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-5-online-test-shooter.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-5-online-test-shooter.xml new file mode 100644 index 0000000..99e9edc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-5-online-test-shooter.xml @@ -0,0 +1,5380 @@ + + 1 + Designer + 2.0.0 + + + + + + (0x00000313, 0x000072a3) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 1712 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000e92, 0x00000316) + SSVEP Shooter Controller + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/shooter-controller.lua + false + + + (0x79a9edeb, 0x245d83fc) + Target Types + 1 1 2 3 + 4 5 6 4 5 6 4 5 6 4 5 6 4 5 6 4 5 6 4 5 6 4 5 6 4 5 6 4 5 6 + false + + + (0x79a9edeb, 0x245d83fc) + Target Positions + 1 7 1 7 + 0 1 0 1 0 1 0 1 0 1 + false + + + (0x2cdb2f0b, 0x12f231ea) + Target Lockdown + true + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Pilot Assist + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Display Feedback + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + One By One + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Analog Control + true + true + false + + + (0xa88b3667, 0x0871638c) + Shooter log level + Information + Information + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -832.000000 + + + (0x207c9054, 0x3c841b63) + 1168.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0b887659) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000fce, 0x00002e9f) + Spatial Filter 2h1 + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1552 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-2h1 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001301, 0x00004261) + Spatial Filter 1h1 + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-1h1 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000156f, 0x00001170) + Frequency 1 b + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 1136 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1b.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000015a6, 0x00000547) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -496 + + + (0x207c9054, 0x3c841b63) + 992 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001850, 0x00000023) + Run Command + (0x48843891, 0x7bfc57f4) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 1 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_ExperimentStart + false + + + (0x79a9edeb, 0x245d83fc) + Command 1 + + ${External_Application_Launcher} openvibe-ssvep-mind-shooter --run-bg impact-shooter ${Player_ScenarioDirectory} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -928 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0xe44a71e7, 0x7964dd76) + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001ce4, 0x00006d04) + Spatial Filter 3h1 + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1840 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-3h1 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001cef, 0x00005c7f) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 1840 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001e95, 0x00002f18) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 1712 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001f6c, 0x00004dd8) + VRPN Target Request + (0x40714327, 0x458877d2) + + + (0x6f752dd0, 0x082a321e) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn@localhost + SSVEP_VRPN_TargetRequest@localhost:${VRPN_ExternalServerPort} + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Target + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_NonTarget + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -992 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x4e7b798a, 0x183beafb) + (0x09fd9ef3, 0xeb8c3069) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00001fa7, 0x00003a8b) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 1712 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000240c, 0x0000455f) + Spatial Filter 3b + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1712 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-3b + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002609, 0x000032dc) + SSVEP Voter + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/shooter-combination-classifier.lua + false + + + (0x007deef9, 0x2f3e95c6) + Class count + 3 + 3 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 1488 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x000026b4, 0x00000770) + Frequency 1 h1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1h1.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000029b4, 0x00002a52) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 1424 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002b56, 0x00001f3b) + Spatial Filter 2b + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1424 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-2b + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002f79, 0x000012ff) + Frequency 2 h1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 1552 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2h1.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003057, 0x00005d9f) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000358f, 0x00006ecd) + Start Stimulation + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/start-stimulator.lua + false + + + (0x007deef9, 0x2f3e95c6) + Delay + 1 + 3 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -992 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000365d, 0x00007ad2) + Analog Ship Control + (0x0ddc3a7e, 0x6f6e6401) + + + (0x544a003e, 0x6dcba5f6) + Input 1 + + + (0x544a003e, 0x6dcba5f6) + Input 2 + + + (0x544a003e, 0x6dcba5f6) + Input 3 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + SSVEP_VRPN_AnalogControl + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 480.000000 + + + (0x207c9054, 0x3c841b63) + 1680.000000 + + + (0x4e7b798a, 0x183beafb) + (0x2f4c9e00, 0x5dc619e4) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003ad4, 0x00004ed6) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 1136 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003c07, 0x000076a5) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -416 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003e7e, 0x000002b6) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 1136 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003ebb, 0x0000216c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 1840 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000040fc, 0x00000d6a) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream + + + + + (0x5ba36127, 0x195feae1) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -512 + + + (0x207c9054, 0x3c841b63) + 1488 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000041cc, 0x000012f4) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 1136 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004276, 0x00004530) + Button Simplifier + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/shooter-button-simplifier.lua + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -496 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004328, 0x00007081) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 1136 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004386, 0x000037a7) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 1840 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000044e7, 0x00002bc6) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + : + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -592.000000 + + + (0x207c9054, 0x3c841b63) + 1488.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/channel-selector.cfg + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004586, 0x000074da) + Spatial Filter 1b + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1136 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-1b + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000045db, 0x00007ed5) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 1424 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004852, 0x0000715d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 1840 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004d95, 0x00004e55) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 1200 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004da8, 0x0000601b) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 1712 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004e89, 0x00004d84) + Frequency 3 b + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 1712 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3b.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000050da, 0x0000143e) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005496, 0x00001add) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 1424 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005970, 0x000064e0) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 1552 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005b4c, 0x00006221) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream + + + + + (0x5ba36127, 0x195feae1) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -288 + + + (0x207c9054, 0x3c841b63) + 1776 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005c07, 0x00006963) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 1552 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005d6f, 0x00004689) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -672 + + + (0x207c9054, 0x3c841b63) + 1504 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00005d7c, 0x00002eed) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005eab, 0x00002231) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 1424 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005f9d, 0x000059f7) + Stimulator Control + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + (0x6f752dd0, 0x082a321e) + Input 3 + + + (0x6f752dd0, 0x082a321e) + Input 4 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + SSVEP_VRPN_StimulatorControl + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_VisualStimulationStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_VisualStimulationStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_VisualStimulationStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_VisualStimulationStop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -176 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000068e2, 0x00005ec9) + Discrete Ship Control + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + (0x6f752dd0, 0x082a321e) + Input 3 + + + (0x6f752dd0, 0x082a321e) + Input 4 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + SSVEP_VRPN_DiscreteControl + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_03 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528.000000 + + + (0x207c9054, 0x3c841b63) + 1489.000000 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006d56, 0x00004704) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream + + + + + (0x5ba36127, 0x195feae1) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -288 + + + (0x207c9054, 0x3c841b63) + 1200 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006df5, 0x00001725) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 1552 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000701d, 0x0000740d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000731f, 0x000047b3) + Frequency 3 h1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 1840 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3h1.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007540, 0x000008a6) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 1488 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000076d8, 0x000033ed) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -752 + + + (0x207c9054, 0x3c841b63) + 1408 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007706, 0x00002005) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 1776 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007883, 0x00001db3) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream + + + + + (0x5ba36127, 0x195feae1) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -288 + + + (0x207c9054, 0x3c841b63) + 1488 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000079c9, 0x00001b94) + VRPN Target Command + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + (0x6f752dd0, 0x082a321e) + Input 3 + + + (0x6f752dd0, 0x082a321e) + Input 4 + + + (0x6f752dd0, 0x082a321e) + Input 5 + + + (0x6f752dd0, 0x082a321e) + Input 6 + + + (0x6f752dd0, 0x082a321e) + Input 7 + + + (0x6f752dd0, 0x082a321e) + Input 8 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + SSVEP_VRPN_TargetControl + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 5 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_04 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 5 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_04 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 6 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_05 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 6 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_05 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 7 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_06 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 7 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_06 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 8 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_07 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 8 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_07 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -640 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007a53, 0x00000fc2) + Scenario Control + (0x40714327, 0x458877d2) + + + (0x6f752dd0, 0x082a321e) + Output 1 + + + (0x6f752dd0, 0x082a321e) + Output 2 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn@localhost + SSVEP_VRPN_StartStop@localhost:${VRPN_ExternalServerPort} + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStop + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -656 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0x09fd9ef3, 0xeb8c3069) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00007e2c, 0x00002faf) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 1552 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007f39, 0x00000ce5) + Frequency 2 b + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 1424 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2b.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007fc4, 0x00003460) + Stimulation multiplexer + (0x07db4efa, 0x472b0938) + + + (0x6f752dd0, 0x082a321e) + Input stimulations 1 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 2 + + + + + (0x6f752dd0, 0x082a321e) + Multiplexed stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0xe7af82cd, 0x14edb4d4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3967c531, 0x17aae480) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/classifiers/classifier-1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336.000000 + + + (0x207c9054, 0x3c841b63) + 1208.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x3967c531, 0x17aae481) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/classifiers/classifier-2 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336.000000 + + + (0x207c9054, 0x3c841b63) + 1496.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x3967c531, 0x17aae482) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/classifiers/classifier-3 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336.000000 + + + (0x207c9054, 0x3c841b63) + 1785.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + + + (0x00000073, 0x00007fda) + + (0x3967c531, 0x17aae480) + 2 + + + (0x0000365d, 0x00007ad2) + 0 + + + + (0x0000018c, 0x00004214) + + (0x000045db, 0x00007ed5) + 0 + + + (0x00005496, 0x00001add) + 0 + + + + (0x00000519, 0x00006f01) + + (0x00001e95, 0x00002f18) + 0 + + + (0x00007706, 0x00002005) + 0 + + + + (0x00000559, 0x00007827) + + (0x0000156f, 0x00001170) + 0 + + + (0x000041cc, 0x000012f4) + 0 + + + + (0x00000768, 0x00003b92) + + (0x00004586, 0x000074da) + 0 + + + (0x0000156f, 0x00001170) + 0 + + + + (0x000008dc, 0x000012b4) + + (0x00006d56, 0x00004704) + 0 + + + (0x00004586, 0x000074da) + 0 + + + + (0x00000a70, 0x000066e8) + + (0x00005c07, 0x00006963) + 0 + + + (0x00007e2c, 0x00002faf) + 0 + + + + (0x00000cc3, 0x00003717) + + (0x00007883, 0x00001db3) + 0 + + + (0x00002b56, 0x00001f3b) + 0 + + + + (0x00001024, 0x00004394) + + (0x00006d56, 0x00004704) + 0 + + + (0x00001301, 0x00004261) + 0 + + + + (0x000011dd, 0x00004eef) + + (0x00002f79, 0x000012ff) + 0 + + + (0x00006df5, 0x00001725) + 0 + + + + (0x000011f5, 0x00003f76) + + (0x0000358f, 0x00006ecd) + 0 + + + (0x00001850, 0x00000023) + 0 + + + + (0x00001668, 0x00001d6d) + + (0x3967c531, 0x17aae482) + 2 + + + (0x0000365d, 0x00007ad2) + 2 + + + + (0x0000167f, 0x00003246) + + (0x00005eab, 0x00002231) + 0 + + + (0x000029b4, 0x00002a52) + 0 + + + + (0x000017e3, 0x00007d42) + + (0x00001fa7, 0x00003a8b) + 0 + + + (0x00004da8, 0x0000601b) + 0 + + + + (0x00001a48, 0x00001db4) + + (0x00005d6f, 0x00004689) + 1 + + + (0x000044e7, 0x00002bc6) + 0 + + + + (0x00001c17, 0x0000526b) + + (0x000044e7, 0x00002bc6) + 0 + + + (0x000040fc, 0x00000d6a) + 0 + + + + (0x00001c76, 0x00007b9b) + + (0x00003c07, 0x000076a5) + 0 + + + (0x00005f9d, 0x000059f7) + 0 + + + + (0x00001d42, 0x0000694d) + + (0x00001f6c, 0x00004dd8) + 0 + + + (0x00000e92, 0x00000316) + 0 + + + + (0x00001f40, 0x00003272) + + (0x000050da, 0x0000143e) + 0 + + + (0x0000701d, 0x0000740d) + 0 + + + + (0x0000229d, 0x0000252c) + + (0x000040fc, 0x00000d6a) + 0 + + + (0x00005b4c, 0x00006221) + 0 + + + + (0x000022f3, 0x000040c1) + + (0x00003c07, 0x000076a5) + 0 + + + (0x00007fc4, 0x00003460) + 0 + + + + (0x00002345, 0x00000842) + + (0x000029b4, 0x00002a52) + 0 + + + (0x000045db, 0x00007ed5) + 0 + + + + (0x000023a4, 0x000066fb) + + (0x00000e92, 0x00000316) + 0 + + + (0x000079c9, 0x00001b94) + 0 + + + + (0x0000280a, 0x0000166b) + + (0x00003e7e, 0x000002b6) + 0 + + + (0x00004328, 0x00007081) + 0 + + + + (0x00002865, 0x0000626e) + + (0x00006df5, 0x00001725) + 0 + + + (0x00005c07, 0x00006963) + 0 + + + + (0x00002a55, 0x00005fcd) + + (0x00001ce4, 0x00006d04) + 0 + + + (0x0000731f, 0x000047b3) + 0 + + + + (0x00002fe3, 0x000016b0) + + (0x00007a53, 0x00000fc2) + 0 + + + (0x00004276, 0x00004530) + 0 + + + + (0x000030e4, 0x000010a7) + + (0x00002609, 0x000032dc) + 0 + + + (0x000068e2, 0x00005ec9) + 0 + + + + (0x0000316b, 0x000006b6) + + (0x00002609, 0x000032dc) + 0 + + + (0x000068e2, 0x00005ec9) + 2 + + + + (0x00003399, 0x00003ac2) + + (0x00004328, 0x00007081) + 0 + + + (0x00004d95, 0x00004e55) + 0 + + + + (0x00003403, 0x0000728a) + + (0x00000fce, 0x00002e9f) + 0 + + + (0x00002f79, 0x000012ff) + 0 + + + + (0x0000370c, 0x00004172) + + (0x00003ad4, 0x00004ed6) + 0 + + + (0x00003e7e, 0x000002b6) + 0 + + + + (0x000037f5, 0x00003980) + + (0x00002b56, 0x00001f3b) + 0 + + + (0x00007f39, 0x00000ce5) + 0 + + + + (0x00003a9e, 0x00006eb9) + + (0x00007883, 0x00001db3) + 0 + + + (0x00000fce, 0x00002e9f) + 0 + + + + (0x00003b1e, 0x00006147) + + (0x00000e92, 0x00000316) + 0 + + + (0x00007fc4, 0x00003460) + 1 + + + + (0x00003e10, 0x00003c45) + + (0x00000e92, 0x00000316) + 0 + + + (0x000079c9, 0x00001b94) + 4 + + + + (0x00003f2b, 0x0000797f) + + (0x00000e92, 0x00000316) + 0 + + + (0x000079c9, 0x00001b94) + 6 + + + + (0x00004078, 0x000011cb) + + (0x000041cc, 0x000012f4) + 0 + + + (0x00003ad4, 0x00004ed6) + 0 + + + + (0x000040ef, 0x00007133) + + (0x00007f39, 0x00000ce5) + 0 + + + (0x00005eab, 0x00002231) + 0 + + + + (0x0000425f, 0x000035f7) + + (0x00005b4c, 0x00006221) + 0 + + + (0x0000240c, 0x0000455f) + 0 + + + + (0x000042d9, 0x00002e08) + + (0x00000e92, 0x00000316) + 0 + + + (0x000076d8, 0x000033ed) + 1 + + + + (0x00004508, 0x00007fd8) + + (0x0000240c, 0x0000455f) + 0 + + + (0x00004e89, 0x00004d84) + 0 + + + + (0x00004567, 0x00003712) + + (0x00007fc4, 0x00003460) + 0 + + + (0x00005f9d, 0x000059f7) + 1 + + + + (0x00004698, 0x00005a3c) + + (0x00003c07, 0x000076a5) + 0 + + + (0x00005f9d, 0x000059f7) + 3 + + + + (0x00004889, 0x00004345) + + (0x00003ebb, 0x0000216c) + 0 + + + (0x00004386, 0x000037a7) + 0 + + + + (0x000048b9, 0x00000d03) + + (0x00001f6c, 0x00004dd8) + 0 + + + (0x000076d8, 0x000033ed) + 0 + + + + (0x00004ba3, 0x00004989) + + (0x00000e92, 0x00000316) + 0 + + + (0x000079c9, 0x00001b94) + 3 + + + + (0x00004cab, 0x0000128c) + + (0x00005496, 0x00001add) + 0 + + + (0x00007540, 0x000008a6) + 0 + + + + (0x00004f36, 0x00001a55) + + (0x000040fc, 0x00000d6a) + 0 + + + (0x00006d56, 0x00004704) + 0 + + + + (0x000051ca, 0x0000621c) + + (0x00005b4c, 0x00006221) + 0 + + + (0x00001ce4, 0x00006d04) + 0 + + + + (0x0000525f, 0x00000c19) + + (0x00001cef, 0x00005c7f) + 0 + + + (0x00004852, 0x0000715d) + 0 + + + + (0x0000565c, 0x00007c2a) + + (0x00000e92, 0x00000316) + 0 + + + (0x000079c9, 0x00001b94) + 2 + + + + (0x000058f3, 0x00002861) + + (0x00004852, 0x0000715d) + 0 + + + (0x00003ebb, 0x0000216c) + 0 + + + + (0x00005aac, 0x00003d7c) + + (0x00001301, 0x00004261) + 0 + + + (0x000026b4, 0x00000770) + 0 + + + + (0x00005ecb, 0x0000698a) + + (0x00000e92, 0x00000316) + 0 + + + (0x000079c9, 0x00001b94) + 1 + + + + (0x0000628b, 0x0000041c) + + (0x000040fc, 0x00000d6a) + 0 + + + (0x00007883, 0x00001db3) + 0 + + + + (0x0000639f, 0x000065d0) + + (0x00005970, 0x000064e0) + 0 + + + (0x00007540, 0x000008a6) + 1 + + + + (0x0000672b, 0x00007979) + + (0x00002609, 0x000032dc) + 0 + + + (0x000068e2, 0x00005ec9) + 3 + + + + (0x00006909, 0x00006422) + + (0x00004da8, 0x0000601b) + 0 + + + (0x00000313, 0x000072a3) + 0 + + + + (0x00006a8a, 0x00001cfa) + + (0x00004386, 0x000037a7) + 0 + + + (0x00007706, 0x00002005) + 1 + + + + (0x00006b5e, 0x00007867) + + (0x000026b4, 0x00000770) + 0 + + + (0x000050da, 0x0000143e) + 0 + + + + (0x00006bf1, 0x000047f1) + + (0x00007e2c, 0x00002faf) + 0 + + + (0x00005970, 0x000064e0) + 0 + + + + (0x00007089, 0x00006984) + + (0x3967c531, 0x17aae481) + 2 + + + (0x0000365d, 0x00007ad2) + 1 + + + + (0x0000711e, 0x00002da0) + + (0x00005d7c, 0x00002eed) + 0 + + + (0x00003057, 0x00005d9f) + 0 + + + + (0x00007160, 0x00005f38) + + (0x0000701d, 0x0000740d) + 0 + + + (0x00005d7c, 0x00002eed) + 0 + + + + (0x000073d0, 0x00005dc5) + + (0x00003057, 0x00005d9f) + 0 + + + (0x00004d95, 0x00004e55) + 1 + + + + (0x00007771, 0x00000507) + + (0x00007a53, 0x00000fc2) + 1 + + + (0x000015a6, 0x00000547) + 0 + + + + (0x00007777, 0x0000285b) + + (0x00004276, 0x00004530) + 0 + + + (0x00003c07, 0x000076a5) + 0 + + + + (0x000077d4, 0x00005b9a) + + (0x00002609, 0x000032dc) + 0 + + + (0x000068e2, 0x00005ec9) + 1 + + + + (0x0000792a, 0x00004e25) + + (0x00000313, 0x000072a3) + 0 + + + (0x00001e95, 0x00002f18) + 0 + + + + (0x000079e6, 0x0000138f) + + (0x0000731f, 0x000047b3) + 0 + + + (0x00001cef, 0x00005c7f) + 0 + + + + (0x00007ade, 0x00005aa6) + + (0x00000e92, 0x00000316) + 0 + + + (0x000079c9, 0x00001b94) + 7 + + + + (0x00007af5, 0x00006ce9) + + (0x00000e92, 0x00000316) + 0 + + + (0x000079c9, 0x00001b94) + 5 + + + + (0x00007e73, 0x000002e4) + + (0x00004e89, 0x00004d84) + 0 + + + (0x00001fa7, 0x00003a8b) + 0 + + + + (0x00007f30, 0x00003cb3) + + (0x00003c07, 0x000076a5) + 0 + + + (0x00005f9d, 0x000059f7) + 2 + + + + (0x309d5653, 0x7ff92298) + + (0x00004d95, 0x00004e55) + 0 + + + (0x3967c531, 0x17aae480) + 0 + + + + (0x33eee401, 0x3654e840) + + (0x3967c531, 0x17aae480) + 0 + + + (0x00002609, 0x000032dc) + 0 + + + + (0x4e771a83, 0x2c012336) + + (0x3967c531, 0x17aae482) + 0 + + + (0x00002609, 0x000032dc) + 2 + + + + (0x52e5c224, 0x18e7dd2b) + + (0x00007540, 0x000008a6) + 0 + + + (0x3967c531, 0x17aae481) + 0 + + + + (0x5e1602f0, 0x53af0126) + + (0x00007706, 0x00002005) + 0 + + + (0x3967c531, 0x17aae482) + 0 + + + + (0x62a23092, 0x1166f6c8) + + (0x3967c531, 0x17aae481) + 0 + + + (0x00002609, 0x000032dc) + 1 + + + + + + (0x00000570, 0x00002927) + Note: The label predictions of the classifier are only used if the + SSVEP_AdvancedControl is set to <b>false</b>. +Otherwise the class probabilities are used. + + + (0x473d9a43, 0x97fc0a97) + 1072.000000 + + + (0x7234b86b, 0x2b8651a5) + 448.000000 + + + + + (0x00003052, 0x00006044) + <b><span color="#2060ff">Configurable box</span></b> + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 1168 + + + (0x7234b86b, 0x2b8651a5) + -832 + + + + + (0x00003521, 0x000075da) + Signal processing for the <b>first</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 1216 + + + (0x7234b86b, 0x2b8651a5) + -352 + + + + + (0x000043a7, 0x00007d10) + Signal processing for the <b>second</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 1488 + + + (0x7234b86b, 0x2b8651a5) + -432 + + + + + (0x00007ab1, 0x0000565c) + Signal processing for the <b>third</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 1760 + + + (0x7234b86b, 0x2b8651a5) + -352 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":400,"identifier":"(0x00005679, 0x00004fee)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":394},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003c2d, 0x00003bc8)","index":0,"name":"Default tab","parentIdentifier":"(0x00005679, 0x00004fee)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00004563, 0x00004efd)","index":0,"name":"Empty","parentIdentifier":"(0x00003c2d, 0x00003bc8)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jozef Legeny + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + SSVEP Online Test - Shooter + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/ + + + (0xf6b2e3fa, 0x7bd43926) + SSVEP + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-6-performance-test.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-6-performance-test.xml new file mode 100644 index 0000000..15f9d85 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/ms-classic-6-performance-test.xml @@ -0,0 +1,4250 @@ + + 1 + Designer + 2.0.0 + + + + + + (0x0000201a, 0x00002eea) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + : + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -672 + + + (0x207c9054, 0x3c841b63) + 1440 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/channel-selector.cfg + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x01a33459, 0x3a410765) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 1424 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x03643791, 0x718a1e96) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 1840 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x03f450b7, 0x41dbe155) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x04d5b601, 0x0c7c5f41) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1424 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x06d6af9c, 0x230333f5) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 1200 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x09a37606, 0x0152b2d6) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 1136 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0a7c8712, 0x78a9580d) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 1840 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0b40e554, 0x36a2452d) + Spatial Filter 1h1 + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-1h1 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0f4595cb, 0x5aa7e7b1) + Classifier combination + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/shooter-combination-classifier.lua + false + + + (0x007deef9, 0x2f3e95c6) + Class count + 3 + 3 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 1488 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x1072b05c, 0x46a96358) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 1552 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x110b492c, 0x42b9cadb) + Spatial Filter 3h1 + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x207c9054, 0x3c841b63) + 1840 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-3h1 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x12873660, 0x570d1d8a) + Frequency 1 b + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 1136 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1b.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x14f79d26, 0x4a2bb667) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream + + + + + (0x5ba36127, 0x195feae1) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -320 + + + (0x207c9054, 0x3c841b63) + 1488 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1871d904, 0x29fec8b5) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1136 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x20d992f5, 0x699f0f58) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 1136 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x22715545, 0x2b561a08) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 1552 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2671f084, 0x2a82bf07) + Frequency 3 h1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 1840 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3h1.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x268e6e4f, 0x48a0a5be) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 1712 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x28a355ea, 0x4de9e404) + Spatial Filter 1b + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x207c9054, 0x3c841b63) + 1136 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-1b + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2a39b269, 0x19db7d79) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 1840 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x31b5053a, 0x02ae25fd) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1552 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x31b9dd62, 0x14bacfc2) + Frequency 2 h1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 1552 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2h1.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x336a57c8, 0x3978dc73) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1712 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x3967c531, 0x17aae481) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/classifiers/classifier-1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288.000000 + + + (0x207c9054, 0x3c841b63) + 1207.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x3967c531, 0x17aae482) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/classifiers/classifier-2 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288.000000 + + + (0x207c9054, 0x3c841b63) + 1488.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x3967c531, 0x17aae483) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/classifiers/classifier-3 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288.000000 + + + (0x207c9054, 0x3c841b63) + 1784.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x3ba849a3, 0x056b34cd) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 1008 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3da51894, 0x55b80e2b) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 1712 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3eb99875, 0x697f4335) + Frequency 2 b + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 1424 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2b.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x3ed0899e, 0x016b7ad0) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 1776 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4633437b, 0x385050ab) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream + + + + + (0x5ba36127, 0x195feae1) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -320 + + + (0x207c9054, 0x3c841b63) + 1776 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4693cd41, 0x52eb47c1) + Spatial Filter 2b + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x207c9054, 0x3c841b63) + 1424 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-2b + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4803c39c, 0x50ab550d) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -608 + + + (0x207c9054, 0x3c841b63) + 1456 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4859d77a, 0x31fedcf9) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 1712 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4c149824, 0x54c9fe9e) + Frequency 3 b + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 1712 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3b.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4cf807e4, 0x0c8ad9a7) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 1136 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4dd14131, 0x3d0f2b1c) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 1424 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4fb67595, 0x4eef46ed) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 1552 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x516027f0, 0x5838ed39) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5165c70b, 0x4c1afa00) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream + + + + + (0x5ba36127, 0x195feae1) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -544 + + + (0x207c9054, 0x3c841b63) + 1488 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x519d6ce8, 0x7a78d342) + Spatial Filter 3b + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x207c9054, 0x3c841b63) + 1712 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-3b + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x52376788, 0x4bf81454) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream + + + + + (0x5ba36127, 0x195feae1) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -320 + + + (0x207c9054, 0x3c841b63) + 1200 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x52e94796, 0x41152eef) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 1488 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x53b62f92, 0x4eb7a110) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x53e21741, 0x46473b66) + Confusion Matrix Calculator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/performance-test-confusion-matrix.lua + false + + + (0x007deef9, 0x2f3e95c6) + Class count + 3 + 4 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 1248 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x5487a60e, 0x02cc517f) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x561cb172, 0x4eb061c1) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + /opt/openvibe/trunk/dist/share/openvibe-scenarios/signals/ssvep-record-current.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -736 + + + (0x207c9054, 0x3c841b63) + 1456 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/file-reader-testing.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x62486763, 0x18ec289f) + Spatial Filter 2h1 + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x207c9054, 0x3c841b63) + 1552 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/classifiers/csp-2h1 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x767ad359, 0x1d03bd73) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77cd3291, 0x0438e5d6) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1840 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x77e8acb7, 0x67e0e4bd) + Frequency 1 h1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.625000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.375000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1h1.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7ba89dd9, 0x19e716de) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 1424 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000016f4, 0x000076af) + + (0x0000201a, 0x00002eea) + 0 + + + (0x4803c39c, 0x50ab550d) + 0 + + + + (0x0000319b, 0x000038b3) + + (0x561cb172, 0x4eb061c1) + 1 + + + (0x0000201a, 0x00002eea) + 0 + + + + (0x04d7d796, 0x61fd52c2) + + (0x3eb99875, 0x697f4335) + 0 + + + (0x01a33459, 0x3a410765) + 0 + + + + (0x057eeaf7, 0x0d1e5945) + + (0x09a37606, 0x0152b2d6) + 0 + + + (0x20d992f5, 0x699f0f58) + 0 + + + + (0x05a67855, 0x5445d92b) + + (0x4fb67595, 0x4eef46ed) + 0 + + + (0x1072b05c, 0x46a96358) + 0 + + + + (0x05c97f44, 0x1e3acaca) + + (0x4803c39c, 0x50ab550d) + 0 + + + (0x5165c70b, 0x4c1afa00) + 0 + + + + (0x073a13c2, 0x0225b951) + + (0x3da51894, 0x55b80e2b) + 0 + + + (0x3ed0899e, 0x016b7ad0) + 0 + + + + (0x093ab179, 0x500f2713) + + (0x519d6ce8, 0x7a78d342) + 0 + + + (0x4c149824, 0x54c9fe9e) + 0 + + + + (0x0b8a27f5, 0x15e21297) + + (0x767ad359, 0x1d03bd73) + 0 + + + (0x06d6af9c, 0x230333f5) + 1 + + + + (0x0be64fd4, 0x6ee82b00) + + (0x03643791, 0x718a1e96) + 0 + + + (0x77cd3291, 0x0438e5d6) + 0 + + + + (0x0cc4d2de, 0x682da4b2) + + (0x1871d904, 0x29fec8b5) + 0 + + + (0x4cf807e4, 0x0c8ad9a7) + 0 + + + + (0x111a4c14, 0x7c828177) + + (0x268e6e4f, 0x48a0a5be) + 0 + + + (0x4859d77a, 0x31fedcf9) + 0 + + + + (0x11d18b64, 0x73c1bf5f) + + (0x0f4595cb, 0x5aa7e7b1) + 0 + + + (0x53e21741, 0x46473b66) + 1 + + + + (0x1459171f, 0x32df8904) + + (0x14f79d26, 0x4a2bb667) + 0 + + + (0x4693cd41, 0x52eb47c1) + 0 + + + + (0x15485855, 0x096661d5) + + (0x12873660, 0x570d1d8a) + 0 + + + (0x09a37606, 0x0152b2d6) + 0 + + + + (0x156e38c6, 0x21317013) + + (0x01a33459, 0x3a410765) + 0 + + + (0x4dd14131, 0x3d0f2b1c) + 0 + + + + (0x173dd7ce, 0x4efb67fc) + + (0x3967c531, 0x17aae483) + 0 + + + (0x0f4595cb, 0x5aa7e7b1) + 2 + + + + (0x18bbdfd2, 0x628eafc4) + + (0x2a39b269, 0x19db7d79) + 0 + + + (0x3ed0899e, 0x016b7ad0) + 1 + + + + (0x1b8af7bd, 0x2d14f6f2) + + (0x53b62f92, 0x4eb7a110) + 0 + + + (0x767ad359, 0x1d03bd73) + 0 + + + + (0x268e5385, 0x5fd2ae6d) + + (0x5165c70b, 0x4c1afa00) + 0 + + + (0x14f79d26, 0x4a2bb667) + 0 + + + + (0x26e56944, 0x1ddf1ef3) + + (0x561cb172, 0x4eb061c1) + 2 + + + (0x4803c39c, 0x50ab550d) + 1 + + + + (0x2bb5d881, 0x395db2bf) + + (0x3ba849a3, 0x056b34cd) + 0 + + + (0x03f450b7, 0x41dbe155) + 0 + + + + (0x2cd159ae, 0x5f6d149b) + + (0x52e94796, 0x41152eef) + 0 + + + (0x3967c531, 0x17aae482) + 0 + + + + (0x2d3a9bd0, 0x77b5c071) + + (0x7ba89dd9, 0x19e716de) + 0 + + + (0x52e94796, 0x41152eef) + 0 + + + + (0x2f2c1150, 0x1f9b2b9f) + + (0x77e8acb7, 0x67e0e4bd) + 0 + + + (0x5487a60e, 0x02cc517f) + 0 + + + + (0x33629e73, 0x7befcc1f) + + (0x516027f0, 0x5838ed39) + 0 + + + (0x53b62f92, 0x4eb7a110) + 0 + + + + (0x33dea349, 0x1cecf1ec) + + (0x52376788, 0x4bf81454) + 0 + + + (0x28a355ea, 0x4de9e404) + 0 + + + + (0x383ccbc3, 0x1f55cdf5) + + (0x1072b05c, 0x46a96358) + 0 + + + (0x31b5053a, 0x02ae25fd) + 0 + + + + (0x3b5f5439, 0x7e28678a) + + (0x62486763, 0x18ec289f) + 0 + + + (0x31b9dd62, 0x14bacfc2) + 0 + + + + (0x3b836c0e, 0x6b0d02bc) + + (0x336a57c8, 0x3978dc73) + 0 + + + (0x3da51894, 0x55b80e2b) + 0 + + + + (0x3f484769, 0x76e2c048) + + (0x14f79d26, 0x4a2bb667) + 0 + + + (0x62486763, 0x18ec289f) + 0 + + + + (0x40c0fffa, 0x7f4e4fcd) + + (0x3967c531, 0x17aae482) + 0 + + + (0x0f4595cb, 0x5aa7e7b1) + 1 + + + + (0x4278dec2, 0x0033162a) + + (0x52376788, 0x4bf81454) + 0 + + + (0x0b40e554, 0x36a2452d) + 0 + + + + (0x4b4fc1bb, 0x051b41cf) + + (0x4859d77a, 0x31fedcf9) + 0 + + + (0x336a57c8, 0x3978dc73) + 0 + + + + (0x4e89f298, 0x231e01f8) + + (0x06d6af9c, 0x230333f5) + 0 + + + (0x3967c531, 0x17aae481) + 0 + + + + (0x4eb5304e, 0x1ca356b0) + + (0x0b40e554, 0x36a2452d) + 0 + + + (0x77e8acb7, 0x67e0e4bd) + 0 + + + + (0x4f0d211c, 0x37a89f9a) + + (0x5165c70b, 0x4c1afa00) + 0 + + + (0x4633437b, 0x385050ab) + 0 + + + + (0x5088d1f1, 0x7b38397e) + + (0x0a7c8712, 0x78a9580d) + 0 + + + (0x03643791, 0x718a1e96) + 0 + + + + (0x50be18df, 0x589a3bb3) + + (0x4cf807e4, 0x0c8ad9a7) + 0 + + + (0x06d6af9c, 0x230333f5) + 0 + + + + (0x50e5fb50, 0x7c188924) + + (0x4c149824, 0x54c9fe9e) + 0 + + + (0x268e6e4f, 0x48a0a5be) + 0 + + + + (0x5587be8b, 0x4105560a) + + (0x110b492c, 0x42b9cadb) + 0 + + + (0x2671f084, 0x2a82bf07) + 0 + + + + (0x56f89cf9, 0x68b15545) + + (0x4633437b, 0x385050ab) + 0 + + + (0x110b492c, 0x42b9cadb) + 0 + + + + (0x5a5ea688, 0x13eb37b3) + + (0x4dd14131, 0x3d0f2b1c) + 0 + + + (0x04d5b601, 0x0c7c5f41) + 0 + + + + (0x5c552fe2, 0x5af370f1) + + (0x3ba849a3, 0x056b34cd) + 0 + + + (0x53e21741, 0x46473b66) + 0 + + + + (0x5df247f4, 0x662e53a6) + + (0x31b9dd62, 0x14bacfc2) + 0 + + + (0x4fb67595, 0x4eef46ed) + 0 + + + + (0x5dffef2e, 0x0c5ca97c) + + (0x22715545, 0x2b561a08) + 0 + + + (0x52e94796, 0x41152eef) + 1 + + + + (0x60a282a5, 0x0201a17b) + + (0x20d992f5, 0x699f0f58) + 0 + + + (0x1871d904, 0x29fec8b5) + 0 + + + + (0x645fd3b5, 0x0278d69a) + + (0x3967c531, 0x17aae481) + 0 + + + (0x0f4595cb, 0x5aa7e7b1) + 0 + + + + (0x64b02627, 0x75f28a61) + + (0x2671f084, 0x2a82bf07) + 0 + + + (0x0a7c8712, 0x78a9580d) + 0 + + + + (0x66d9bccd, 0x2d9df552) + + (0x28a355ea, 0x4de9e404) + 0 + + + (0x12873660, 0x570d1d8a) + 0 + + + + (0x6c593769, 0x61df7c69) + + (0x3ed0899e, 0x016b7ad0) + 0 + + + (0x3967c531, 0x17aae483) + 0 + + + + (0x6e55ade8, 0x1257f133) + + (0x4803c39c, 0x50ab550d) + 1 + + + (0x3ba849a3, 0x056b34cd) + 0 + + + + (0x6fad0907, 0x21547702) + + (0x31b5053a, 0x02ae25fd) + 0 + + + (0x22715545, 0x2b561a08) + 0 + + + + (0x76128c17, 0x453be32d) + + (0x04d5b601, 0x0c7c5f41) + 0 + + + (0x7ba89dd9, 0x19e716de) + 0 + + + + (0x76e4d3fc, 0x1a1bd3b3) + + (0x4633437b, 0x385050ab) + 0 + + + (0x519d6ce8, 0x7a78d342) + 0 + + + + (0x787064b0, 0x15ff8458) + + (0x5487a60e, 0x02cc517f) + 0 + + + (0x516027f0, 0x5838ed39) + 0 + + + + (0x7d8a4709, 0x72fa2737) + + (0x4693cd41, 0x52eb47c1) + 0 + + + (0x3eb99875, 0x697f4335) + 0 + + + + (0x7ef83a6d, 0x5c12f9e7) + + (0x5165c70b, 0x4c1afa00) + 0 + + + (0x52376788, 0x4bf81454) + 0 + + + + (0x7f7cea90, 0x09b6ac38) + + (0x77cd3291, 0x0438e5d6) + 0 + + + (0x2a39b269, 0x19db7d79) + 0 + + + + + + (0x0d2c4f24, 0x544942f8) + Signal processing for the <b>second</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 1488 + + + (0x7234b86b, 0x2b8651a5) + -464 + + + + + (0x223326fb, 0x1f592f07) + Signal processing for the <b>first</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 1216 + + + (0x7234b86b, 0x2b8651a5) + -384 + + + + + (0x4c6fe770, 0x35cfa50f) + This scenario calculates the confusion matrix over +several classes for SSVEP performance testing. + +By default it loads the file specified for testing in the +configuration scenario. + + + (0x473d9a43, 0x97fc0a97) + 1136 + + + (0x7234b86b, 0x2b8651a5) + -656 + + + + + (0x5c7c1066, 0x4837019b) + Signal processing for the <b>third</b> stimulation frequency + + + (0x473d9a43, 0x97fc0a97) + 1760 + + + (0x7234b86b, 0x2b8651a5) + -384 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x4285e713, 0x4caa91d7)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x5a123d4c, 0x475dbeaa)","index":0,"name":"Default tab","parentIdentifier":"(0x4285e713, 0x4caa91d7)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x2ea7e498, 0x310ada45)","index":0,"name":"Empty","parentIdentifier":"(0x5a123d4c, 0x475dbeaa)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jozef Legeny + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + SSVEP Performance Test + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/ + + + (0xf6b2e3fa, 0x7bd43926) + SSVEP + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/classifier-training-flipswitch.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/classifier-training-flipswitch.lua new file mode 100644 index 0000000..69d173a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/classifier-training-flipswitch.lua @@ -0,0 +1,41 @@ +flip_count = 0 +switched_flip_count = 0 +flips = {} + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + flip_count = box:get_input_count() + + for i = 1, flip_count do + flips[i] = false + end +end + +function uninitialize(box) +end + +function process(box) + + while box:keep_processing() and switched_flip_count < flip_count do + + for i = 1, flip_count do + if box:get_stimulation_count(i) > 0 then + + box:remove_stimulation(i, 1) + + if not flips[i] then + switched_flip_count = switched_flip_count + 1 + flips[i] = true + + io.write("Flip ", i, " of ", flip_count, " switched\n") + + end + + end + end + + box:sleep() + end + + box:send_stimulation(1, OVTK_StimulationId_Label_00, box:get_current_time()) +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/classifier-training-target-separator.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/classifier-training-target-separator.lua new file mode 100644 index 0000000..e953b01 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/classifier-training-target-separator.lua @@ -0,0 +1,63 @@ +targets = {} +non_targets = {} +sent_stimulation = 0 + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + -- read the parameters of the box + + s_targets = box:get_setting(2) + + for t in s_targets:gmatch("%d+") do + targets[t + 0] = true + end + + s_non_targets = box:get_setting(3) + + for t in s_non_targets:gmatch("%d+") do + non_targets[t + 0] = true + end + + sent_stimulation = _G[box:get_setting(4)] + +end + +function uninitialize(box) +end + +function process(box) + + finished = false + + while box:keep_processing() and not finished do + + time = box:get_current_time() + + while box:get_stimulation_count(1) > 0 do + + s_code, s_date, s_duration = box:get_stimulation(1, 1) + box:remove_stimulation(1, 1) + + + + if s_code >= OVTK_StimulationId_Label_00 and s_code <= OVTK_StimulationId_Label_1F then + + received_stimulation = s_code - OVTK_StimulationId_Label_00 + + + if targets[received_stimulation] ~= nil then + box:send_stimulation(1, sent_stimulation, time) + elseif non_targets[received_stimulation] ~= nil then + box:send_stimulation(2, sent_stimulation, time) + end + + elseif s_code == OVTK_StimulationId_ExperimentStop then + finished = true + end + end + + box:sleep() + + end + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/configuration-eeg-input-settings.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/configuration-eeg-input-settings.lua new file mode 100644 index 0000000..c3cb0c7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/configuration-eeg-input-settings.lua @@ -0,0 +1,74 @@ +channels = nil +selection_method = nil +match_method = nil + +training_datafile = nil +testing_datafile = nil + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + channels = box:get_setting(2) + selection_method = box:get_setting(3) + match_method = box:get_setting(4) + training_datafile = box:get_setting(5) + testing_datafile = box:get_setting(6) + + +end + +function uninitialize(box) +end + +function process(box) + + while box:keep_processing() and box:get_stimulation_count(1) == 0 do + box:sleep() + end + + -- create material + + box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/channel-selector.cfg'")) + + cfg_file = io.open(box:get_config("${Player_ScenarioDirectory}/configuration/channel-selector.cfg"), "w") + + if cfg_file == nil then + box:log("Error", "Could not open config file for writing") + end + + cfg_file:write("\n") + cfg_file:write(string.format("%s\n", channels)) + cfg_file:write(string.format("%s\n", selection_method)) + cfg_file:write(string.format("%s\n", match_method)) + cfg_file:write("\n") + + cfg_file:close() + + box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/file-reader-training.cfg'")) + + cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/configuration/file-reader-training.cfg"), "w")) + + cfg_file:write("\n") + cfg_file:write(string.format("%s\n", training_datafile)) + -- cfg_file:write(string.format("32\n")) + cfg_file:write("\n") + + cfg_file:close() + + box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/file-reader-testing.cfg'")) + + cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/configuration/file-reader-testing.cfg"), "w")) + + cfg_file:write("\n") + cfg_file:write(string.format("%s\n", testing_datafile)) + -- cfg_file:write(string.format("32\n")) + cfg_file:write("\n") + + cfg_file:close() + + + + + -- notify the scenario that the configuration process is complete + box:send_stimulation(1, OVTK_StimulationId_TrainCompleted, box:get_current_time() + 0.2, 0) + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/configuration-experiment-settings.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/configuration-experiment-settings.lua new file mode 100644 index 0000000..405a968 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/configuration-experiment-settings.lua @@ -0,0 +1,190 @@ +stimulation_frequencies = {} +frequency_count = 0 + +target_light_color = {} +target_dark_color = {} +training_target_size = {} +training_targets_positions = {} + +processing_epoch_duration = nil +processing_epoch_interval = nil +processing_frequency_tolerance = nil +csp_filter_order = nil + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + for value in box:get_setting(2):gmatch("%d+") do + table.insert(target_light_color, value) + end + + for value in box:get_setting(3):gmatch("%d+") do + table.insert(target_dark_color, value) + end + + for value in box:get_setting(4):gmatch("%d+[.]?%d*") do + table.insert(stimulation_frequencies, value) + frequency_count = frequency_count + 1 + end + + processing_epoch_duration = box:get_setting(5) + processing_epoch_interval = box:get_setting(6) + processing_frequency_tolerance = box:get_setting(7) + csp_filter_order = box:get_setting(8) + s_focus_point = box:get_setting(9) + + +end + +function uninitialize(box) +end + +function process(box) + + while box:keep_processing() and box:get_stimulation_count(1) == 0 do + box:sleep() + end + + -- create material + + box:log("Info", box:get_config("Creating materials in '${Player_ScenarioDirectory}/appconf/materials/flickering.material'")) + + cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/appconf/materials/flickering.material"), "w")) + + cfg_file:write("material target_bright\n") + cfg_file:write("{\n") + cfg_file:write(" technique\n") + cfg_file:write(" {\n") + cfg_file:write(" pass\n") + cfg_file:write(" {\n") + cfg_file:write(" ambient 0 0 0 0\n") + cfg_file:write(" diffuse 0 0 0 0\n") + cfg_file:write(" specular 0 0 0 0\n") + cfg_file:write(" emissive ", target_light_color[1] / 100, " ", target_light_color[2] / 100, " ", target_light_color[3] / 100, "\n") + cfg_file:write(" }\n") + cfg_file:write(" }\n") + cfg_file:write("}\n") + cfg_file:write("material target_dark\n") + cfg_file:write("{\n") + cfg_file:write(" technique\n") + cfg_file:write(" {\n") + cfg_file:write(" pass\n") + cfg_file:write(" {\n") + cfg_file:write(" ambient 0 0 0 0\n") + cfg_file:write(" diffuse 0 0 0 0\n") + cfg_file:write(" specular 0 0 0 0\n") + cfg_file:write(" emissive ", target_dark_color[1] / 100, " ", target_dark_color[2] / 100, " ", target_dark_color[3] / 100, "\n") + cfg_file:write(" }\n") + cfg_file:write(" }\n") + cfg_file:write("}\n") + cfg_file:close() + + -- prepare the datafolder + + foldername = box:get_config("${Player_ScenarioDirectory}/signals/userdata-[$core{date}-$core{time}]") + os.execute(string.format("mkdir \"%s\"", foldername)) + + box:log("Info", box:get_config("Writing additional configuration to '${Player_ScenarioDirectory}/appconf/application-configuration.conf'")) + + -- this file was generated by configuration-peripheral-settings.lua, here we just add to it + cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/appconf/application-configuration.conf"), "a")) + + for i=1,frequency_count do + cfg_file:write("SSVEP_Frequency_", i, " = ", string.format("%g", stimulation_frequencies[i]), "\n") + end + + cfg_file:write(string.format("SSVEP_TargetLightColourRed = %f\n", target_light_color[1] / 100)) + cfg_file:write(string.format("SSVEP_TargetLightColourGreen = %f\n", target_light_color[2] / 100)) + cfg_file:write(string.format("SSVEP_TargetLightColourBlue = %f\n", target_light_color[3] / 100)) + cfg_file:write(string.format("SSVEP_TargetDarkColourRed = %f\n", target_dark_color[1] / 100)) + cfg_file:write(string.format("SSVEP_TargetDarkColourGreen = %f\n", target_dark_color[2] / 100)) + cfg_file:write(string.format("SSVEP_TargetDarkColourBlue = %f\n", target_dark_color[3] / 100)) + + cfg_file:write("SSVEP_UserDataFolder = ", foldername, "\n") + cfg_file:write("SSVEP_FocusPoint = ", s_focus_point, "\n") + + + cfg_file:close() + + -- create configuration files for temporal filters + + for i=1,frequency_count do + box:log("Info", string.format(box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/temporal-filter-freq-%db.cfg'"), i)) + + cfg_file = assert(io.open(string.format(box:get_config("${Player_ScenarioDirectory}/configuration/temporal-filter-freq-%db.cfg"), i), "w")) + + cfg_file:write("\n") + cfg_file:write("Butterworth\n") + cfg_file:write("Band pass\n") + cfg_file:write("4\n") + cfg_file:write(string.format("%g\n", stimulation_frequencies[i] - processing_frequency_tolerance)) + cfg_file:write(string.format("%g\n", stimulation_frequencies[i] + processing_frequency_tolerance)) + cfg_file:write("0.500000\n") + cfg_file:write("\n") + + cfg_file:close() + + box:log("Info", string.format(box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/temporal-filter-freq-%dh1.cfg'"), i)) + + cfg_file = assert(io.open(string.format(box:get_config("${Player_ScenarioDirectory}/configuration/temporal-filter-freq-%dh1.cfg"), i), "w")) + + cfg_file:write("\n") + cfg_file:write("Butterworth\n") + cfg_file:write("Band pass\n") + cfg_file:write("4\n") + cfg_file:write(string.format("%g\n", stimulation_frequencies[i] * 2 - processing_frequency_tolerance)) + cfg_file:write(string.format("%g\n", stimulation_frequencies[i] * 2 + processing_frequency_tolerance)) + cfg_file:write("0.500000\n") + cfg_file:write("\n") + + cfg_file:close() + + box:log("Info", string.format(box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/csp-spatial-filter-trainer-%db.cfg'"), i)) + + cfg_file = assert(io.open(string.format(box:get_config("${Player_ScenarioDirectory}/configuration/csp-spatial-filter-trainer-%db.cfg"), i), "w")) + cfg_file:write("\n") + cfg_file:write(" OVTK_StimulationId_ExperimentStop\n") + cfg_file:write(string.format(box:get_config(" ${Player_ScenarioDirectory}/classifiers/csp-%db\n"), i)) + cfg_file:write(string.format(" %d\n", csp_filter_order)) + cfg_file:write(" \n") + cfg_file:write("\n") + cfg_file:close() + + box:log("Info", string.format(box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/csp-spatial-filter-trainer-%dh1.cfg'"), i)) + + cfg_file = assert(io.open(string.format(box:get_config("${Player_ScenarioDirectory}/configuration/csp-spatial-filter-trainer-%dh1.cfg"), i), "w")) + cfg_file:write("\n") + cfg_file:write(" OVTK_StimulationId_ExperimentStop\n") + cfg_file:write(string.format(box:get_config(" ${Player_ScenarioDirectory}/classifiers/csp-%dh1\n"), i)) + cfg_file:write(string.format(" %d\n", csp_filter_order)) + cfg_file:write(" \n") + cfg_file:write("\n") + cfg_file:close() + + end + + -- create configuration file for time based epoching + box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg'")) + + cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg"), "w")) + cfg_file:write("\n") + cfg_file:write(string.format("%g\n", processing_epoch_duration)) + cfg_file:write(string.format("%g\n", processing_epoch_interval)) + cfg_file:write("\n") + cfg_file:close() + + -- create the file writer configuration + box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/file-writer.cfg'")) + + cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/configuration/file-writer.cfg"), "w")) + cfg_file:write("\n") + cfg_file:write(string.format("%s/eeg-data-[$core{date}-$core{time}].ov\n", foldername)) + cfg_file:write("false\n") + cfg_file:write("\n") + cfg_file:close() + + box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/csp-filter.cfg'")) + + -- notify the scenario that the configuration process is complete + box:send_stimulation(1, OVTK_StimulationId_TrainCompleted, box:get_current_time() + 0.2, 0) + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/configuration-peripheral-settings.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/configuration-peripheral-settings.lua new file mode 100644 index 0000000..48a4f8a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/configuration-peripheral-settings.lua @@ -0,0 +1,53 @@ +vrpn_host = nil +vrpn_port = nil +screen_refresh_rate = nil +window_width = nil +window_height = nil +fullscreen = nil + +function initialize(box) + screen_refresh_rate = box:get_setting(2) + window_width = box:get_setting(3) + window_height = box:get_setting(4) + fullscreen = box:get_setting(5) +end + +function uninitialize(box) +end + +function process(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + box:log("Info", box:get_config("Generating '${Player_ScenarioDirectory}/appconf/application-configuration.conf'")) + + cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/appconf/application-configuration.conf"), "w")) + + cfg_file:write("# This file was automatically generated!\n\n") + cfg_file:write("# If you want to change the SSVEP configuration\n") + cfg_file:write("# please use the provided ssvep-configuration scenario.\n") + + cfg_file:write("SSVEP_ScreenRefreshRate = ", screen_refresh_rate, "\n") + cfg_file:write("SSVEP_VRPNServerPort = 1337\n") + cfg_file:write("SSVEP_VRPNHost = localhost\n") + +-- cfg_file:close() + +-- box:log("Info", box:get_config("Generating '${Player_ScenarioDirectory}/appconf/ogre-configuration.conf'")) + +-- cfg_file = io.open(box:get_config("${Player_ScenarioDirectory}/appconf/ogre-configuration.conf"), "w") + +-- cfg_file:write("# This file was automatically generated!\n\n") +-- cfg_file:write("# If you want to change the SSVEP configuration\n") +-- cfg_file:write("# please use the provided ssvep-configuration scenario.\n") + + cfg_file:write("SSVEP_Ogre_LogToConsole = False\n") + + cfg_file:write("SSVEP_Ogre_ScreenWidth = ", window_width, "\n") + cfg_file:write("SSVEP_Ogre_ScreenHeight = ", window_height, "\n") + cfg_file:write("SSVEP_Ogre_FullScreen = ", fullscreen, "\n") + + cfg_file:close() + + + box:send_stimulation(1, OVTK_StimulationId_TrainCompleted, box:get_current_time() + 0.2, 0) +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/performance-test-confusion-matrix.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/performance-test-confusion-matrix.lua new file mode 100644 index 0000000..8c36206 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/performance-test-confusion-matrix.lua @@ -0,0 +1,119 @@ +classes = nil + +do_debug = false; + +score = {} + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + classes = box:get_setting(2) + + for j = 1, classes do + score[j] = {} + for i = 1, classes do + score[j][i] = 0 + end + end +end + +function uninitialize(box) + + correct = 0 + incorrect = 0 + + for j = 1, classes do + + output = string.format("Target %d : ", j - 1) + inClass = 0 + + for i = 1, classes do + inClass = inClass + score[j][i] + end + + for i = 1, classes do + output = output .. string.format("%d : %5.1f%%, ", i - 1, 100*score[j][i]/inClass) + + if i == j then + correct = correct + score[j][i] + else + incorrect = incorrect + score[j][i] + end + end + + box:log("Info", string.format("%s total %d", output, inClass)) + end + + box:log("Info", string.format("Correct %4d -> %5.1f%%", correct, 100*correct/(correct+incorrect))) + box:log("Info", string.format("Incorrect %4d -> %5.1f%%", incorrect, 100*incorrect/(correct+incorrect))) + +end + +function process(box) + + finished = false + trials = {} + trialNum = 0 + + while not finished and box:keep_processing() do + + -- time = box:get_current_time() + + while box:get_stimulation_count(1) > 0 do + + s_code, s_date, s_duration = box:get_stimulation(1, 1) + box:remove_stimulation(1, 1) + + if s_code >= OVTK_StimulationId_Label_00 and s_code <= OVTK_StimulationId_Label_1F then + if do_debug then box:log("Info", string.format("Received target %d at ", s_code) .. s_date) end + + trialNum = trialNum + 1 + trials[trialNum]={} + trials[trialNum].class = s_code - OVTK_StimulationId_Label_00 + 1 + trials[trialNum].start_time = 9999999999; + trials[trialNum].stop_time = 9999999999; + + elseif s_code == OVTK_StimulationId_VisualStimulationStart then + if do_debug then box:log("Info", "Trial started at " .. s_date) end + trials[trialNum].start_time = s_date; + + elseif s_code == OVTK_StimulationId_VisualStimulationStop then + if do_debug then box:log("Info", "Trial ended at " .. s_date) end + trials[trialNum].stop_time = s_date; + + elseif s_code == OVTK_StimulationId_ExperimentStop then + finished = true + end + end + + while box:get_stimulation_count(2) > 0 do + + s_code, s_date, s_duration = box:get_stimulation(2, 1) + box:remove_stimulation(2, 1) + + if do_debug then box:log("Info", string.format("Received prediction %d at ", s_code) .. s_date) end + + if (s_code >= OVTK_StimulationId_Label_00 and s_code <= OVTK_StimulationId_Label_1F) then + -- not the fastest but ok for small trial amounts + for i = trialNum,1,-1 do + if s_date >= trials[i].start_time and s_date <= trials[i].stop_time then + + if do_debug then box:log("Info", string.format("Accepted prediction %d at ", s_code) .. s_date) end + + real_target = trials[i].class + prediction = s_code - OVTK_StimulationId_Label_00 + 1 + + -- if do_debug then box:log("Info", string.format(" -> %d %d ", real_target, prediction)) end + + score[real_target][prediction] = score[real_target][prediction] + 1 + + break + end + end + end + end + + box:sleep() + + end + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/shooter-button-simplifier.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/shooter-button-simplifier.lua new file mode 100644 index 0000000..9c01420 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/shooter-button-simplifier.lua @@ -0,0 +1,35 @@ +buffer = {} + +function initialize(box) +end + +function uninitialize(box) +end + +-- This script receives stimulations and lets pass only every other one +-- for each stimulation code +-- Useful to remove "key up" events of keyboard stimulator +function process(box) + + while (box:keep_processing()) do + + for index = 1, box:get_stimulation_count(1) do + + stimulation = box:get_stimulation(1, index) + + if buffer[stimulation] == nil then + box:send_stimulation(1, stimulation, box:get_current_time(), 0) + buffer[stimulation] = 1 + else + buffer[stimulation] = nil + end + + box:remove_stimulation(1, 1) + end + + box:sleep() + end + + + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/shooter-combination-classifier.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/shooter-combination-classifier.lua new file mode 100644 index 0000000..fb00298 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/shooter-combination-classifier.lua @@ -0,0 +1,44 @@ +class_count = 0 + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + class_count = box:get_setting(2) +end + +function uninitialize(box) +end + +function process(box) + + while box:keep_processing() do + + if box:get_stimulation_count(1) > 0 then + + local decision = 0 + local conflict = false + + -- check each input + for i = 1, class_count do + -- if the frequency is considered as stimulated + stim_id = box:get_stimulation(i, 1) + -- box:log("Info", string.format("Received %d from %d", stim_id, i)) + if stim_id == OVTK_StimulationId_Label_01 then + if decision ~= 0 then + conflict = true + end + decision = i + end + box:remove_stimulation(i, 1) + end + + -- If several classifiers predict 'in class', predict no action class 0 instead. + if conflict then + decision = 0 + end + + box:send_stimulation(1, OVTK_StimulationId_Label_00 + decision, box:get_current_time() + 0.01, 0) + end + + box:sleep() + end +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/shooter-controller.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/shooter-controller.lua new file mode 100644 index 0000000..782a97e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/shooter-controller.lua @@ -0,0 +1,70 @@ +sequence = {} +flickeringDelay = nil + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + s_sequence_types = box:get_setting(2) + s_sequence_positions = box:get_setting(3) + s_target_lockdown = box:get_setting(4) + s_pilot_assist = box:get_setting(5) + s_feedback = box:get_setting(6) + s_onebyone = box:get_setting(7) + s_analog_control = box:get_setting(8) + s_log_level = box:get_setting(9) + + box:log("Info", string.format("Target Types Sequence : [%s]\n", s_sequence_types)) + + for target in s_sequence_positions:gmatch("%d+") do + table.insert(sequence, target) + end + + -- create the configuration file for the shooter application + cfg_file = io.open(box:get_config("${Player_ScenarioDirectory}/appconf/shooter-configuration.conf"), "w") + + cfg_file:write("SSVEP_EnemyOrder = ", s_sequence_types, "\n") + cfg_file:write("SSVEP_TargetLockdown = ", s_target_lockdown, "\n") + cfg_file:write("SSVEP_PilotAssist = ", s_pilot_assist, "\n") + cfg_file:write("SSVEP_Feedback = ", s_feedback, "\n") + cfg_file:write("SSVEP_OneByOne = ", s_onebyone, "\n") + cfg_file:write("SSVEP_AnalogControl = ", s_analog_control, "\n") + cfg_file:write("SSVEP_LogLevel = ", s_log_level, "\n") + + cfg_file:close() +end + +function uninitialize(box) +end + +function process(box) + + -- while targets are available, send a stimulation with new target + -- position for each request + + while box:keep_processing() do + if box:get_stimulation_count(1) > 0 then + + identifier, date, duration = box:get_stimulation(1, 1) + + if identifier == OVTK_StimulationId_Target then + current_time = box:get_current_time() + 1 + + -- if no targets are available, quit the game + if # sequence == 0 then + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, current_time, 0) + break + end + + next_target = sequence[1] + table.remove(sequence, 1) + + box:send_stimulation(1, OVTK_StimulationId_Label_00 + next_target , current_time, 0) + end + + box:remove_stimulation(1, 1) + end + + box:sleep() + end + +end + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/start-stimulator.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/start-stimulator.lua new file mode 100644 index 0000000..099017d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/start-stimulator.lua @@ -0,0 +1,21 @@ +delay = 1 + +function initialize(box) + s_delay = box:get_setting(2); + + io.write(string.format("Delay : [%s]\n", s_delay)) + + if (s_delay:find("^%d+$") ~= nil) then + delay = tonumber(s_delay) + else + io.write("[ERROR] The parameter should be a numeric value\n") + end + +end + +function uninitialize(box) +end + +function process(box) + box:send_stimulation(1, 0x00008001, delay, 0) +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/training-acquisition-controller.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/training-acquisition-controller.lua new file mode 100644 index 0000000..cd4bef8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/scripts/training-acquisition-controller.lua @@ -0,0 +1,79 @@ +sequence = {} +number_of_cycles = 0 + +stimulation_duration = 7 +break_duration = 2 +flickering_delay = 3.5 + +stimulationLabels = { + 0x00008100, + 0x00008101, + 0x00008102, + 0x00008103, +} + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + -- load the goal sequence + s_sequence = box:get_setting(2) + + for target in s_sequence:gmatch("%d+") do + table.insert(sequence, target) + number_of_cycles = number_of_cycles + 1 + end + + stimulation_duration = box:get_setting(3) + break_duration = box:get_setting(4) + flickering_delay = box:get_setting(5) + + box:log("Info", string.format("Number of goals in sequence: [%d]", number_of_cycles)) + + cfg_file = io.open(box:get_config("${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg"), "w") + + cfg_file:write("\n") + cfg_file:write(" ", stimulation_duration, "\n") + cfg_file:write(" ", flickering_delay, "\n") + cfg_file:write(" OVTK_StimulationId_Target\n") + cfg_file:write("\n") + + cfg_file:close() +end + +function uninitialize(box) +end + +function process(box) + + while box:keep_processing() and box:get_stimulation_count(1) == 0 do + box:sleep() + end + + current_time = box:get_current_time() + 1 + + box:send_stimulation(1, OVTK_StimulationId_ExperimentStart, current_time, 0) + + current_time = current_time + 2 + + for i,target in ipairs(sequence) do + box:log("Info", string.format("Goal no %d is %d at %d", i, target, current_time)) + -- mark goal + box:send_stimulation(2, OVTK_StimulationId_LabelStart + target, current_time, 0) + -- wait for Flickering_delay seconds + current_time = current_time + flickering_delay + -- start flickering + box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStart, current_time, 0) + -- wait for Stimulation_duration seconds + current_time = current_time + stimulation_duration + -- unmark goal and stop flickering + box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStop, current_time, 0) + -- wait for Break_duration seconds + current_time = current_time + break_duration + end + + current_time = current_time + 2 + + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, current_time, 0) + + box:sleep() +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/signals/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/signals/README.txt new file mode 100644 index 0000000..77cca96 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter-classic/signals/README.txt @@ -0,0 +1 @@ +This folder contains signals recorded by the SSVEP scenarios. diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/appconf/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/appconf/README.txt new file mode 100644 index 0000000..eff11fe --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/appconf/README.txt @@ -0,0 +1 @@ +This folder contains configuration files created by the SSVEP scenarios. diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/appconf/materials/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/appconf/materials/README.txt new file mode 100644 index 0000000..670c2bf --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/appconf/materials/README.txt @@ -0,0 +1 @@ +This folder contains materials created by the SSVEP scenarios. diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/classifiers/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/classifiers/README.txt new file mode 100644 index 0000000..ddf7bed --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/classifiers/README.txt @@ -0,0 +1 @@ +This folder contains classifiers and CSP filters created by the SSVEP scenarios. diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/configuration/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/configuration/README.txt new file mode 100644 index 0000000..ef12863 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/configuration/README.txt @@ -0,0 +1 @@ +This folder contains configuration files generated by the scenarios. diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-0-acquisition-test.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-0-acquisition-test.xml new file mode 100755 index 0000000..9d67553 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-0-acquisition-test.xml @@ -0,0 +1,672 @@ + + 1 + OpenVIBE + 0.1.99 + + + + + + (0x00000efb, 0x00007452) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 2.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.250000 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 112.000000 + + + (0x207c9054, 0x3c841b63) + 560.000000 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002363af) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000026ba, 0x000014fc) + Spectral analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imag Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192.000000 + + + (0x207c9054, 0x3c841b63) + 560.000000 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004039af) + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000441d, 0x00001a28) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16.000000 + + + (0x207c9054, 0x3c841b63) + 560.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00596403) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00006e09, 0x00006c54) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 3.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 40.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48.000000 + + + (0x207c9054, 0x3c841b63) + 560.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005c78a8) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006ff2, 0x000035c1) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112.000000 + + + (0x207c9054, 0x3c841b63) + 752.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0020924b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x28b20eb9, 0x6ca2286f) + Instant Bars + (0xecb46081, 0x96da0d49) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 560 + + + (0x4e7b798a, 0x183beafb) + (0x6b60e2b2, 0xf4839b7d) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000c5d, 0x00003e97) + + (0x00000efb, 0x00007452) + 0 + + + (0x000026ba, 0x000014fc) + 0 + + + + (0x0000235d, 0x00005682) + + (0x0000441d, 0x00001a28) + 1 + + + (0x00006e09, 0x00006c54) + 0 + + + + (0x00003f9c, 0x000047e9) + + (0x00006e09, 0x00006c54) + 0 + + + (0x00006ff2, 0x000035c1) + 0 + + + + (0x00006d4e, 0x0000333e) + + (0x00006e09, 0x00006c54) + 0 + + + (0x00000efb, 0x00007452) + 0 + + + + (0x5b7cfcf0, 0x1cbb9051) + + (0x000026ba, 0x000014fc) + 0 + + + (0x28b20eb9, 0x6ca2286f) + 0 + + + + + + (0x00002d94, 0x00007404) + Display the signal from all channels + + + (0x473d9a43, 0x97fc0a97) + 960.000000 + + + (0x7234b86b, 0x2b8651a5) + 112.000000 + + + + + (0x00004efd, 0x0000146d) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + This scenario set is documented in 'http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/' + + + (0x473d9a43, 0x97fc0a97) + 528 + + + (0x7234b86b, 0x2b8651a5) + -112 + + + + + (0x00007577, 0x000059a7) + <b><big>Acquisition test</big></b> + +Scenario used for testing data acquisition. The signal quality should +always be checked before training. + +You can monitor signals from all of the electrodes. Individual +signals are shown for each channel, as well as FFT power of all channels. + + + + (0x473d9a43, 0x97fc0a97) + 224.000000 + + + (0x7234b86b, 0x2b8651a5) + 16.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":776,"identifier":"(0x00002985, 0x00004ff2)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":753},{"boxIdentifier":"(0x28b20eb9, 0x6ca2286f)","childCount":0,"identifier":"(0x63bb111b, 0x0b13330c)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000024d0, 0x00004b7a)","index":0,"name":"Default tab","parentIdentifier":"(0x00002985, 0x00004ff2)","type":2},{"boxIdentifier":"(0x00006ff2, 0x000035c1)","childCount":0,"identifier":"(0x00003256, 0x00006784)","index":0,"parentIdentifier":"(0x000024d0, 0x00004b7a)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren, Jozef Legeny + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + SSVEP Acquisition Test + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/ + + + (0xf6b2e3fa, 0x7bd43926) + SSVEP + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-1-ssvep-configuration.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-1-ssvep-configuration.xml new file mode 100755 index 0000000..6663fdb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-1-ssvep-configuration.xml @@ -0,0 +1,599 @@ + + 1 + Designer + 2.0.0 + + + + + + (0x00000533, 0x00001c79) + Experiment Settings + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/configuration-experiment-settings.lua + false + + + (0x7f45a2a9, 0x7db12219) + Target Light Color + 100,0,0 + 100,0,0 + false + + + (0x7f45a2a9, 0x7db12219) + Target Dark Color + 0,0,0 + 10,0,0 + false + + + (0x79a9edeb, 0x245d83fc) + Stimulation Frequencies + 20;15;12 + 5.454545;6.6666;7.5 + false + + + (0x512a166f, 0x5c3ef83f) + Processing Epoch Duration + 0.5 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Processing Epoch Interval + 0.1 + 0.1 + false + + + (0x512a166f, 0x5c3ef83f) + Processing Frequency Tolerance + 0.250 + 0.25 + false + + + (0x007deef9, 0x2f3e95c6) + CSP Spatial Filter Order + 3 + 2 + false + + + (0x2cdb2f0b, 0x12f231ea) + Focus Point + false + false + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0004a72a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x000024b5, 0x00000bb5) + Display Settings + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/configuration-peripheral-settings.lua + false + + + (0x007deef9, 0x2f3e95c6) + Screen Refresh Rate + 60 + 60 + false + + + (0x007deef9, 0x2f3e95c6) + Window Width + 800 + 800 + false + + + (0x007deef9, 0x2f3e95c6) + Window Height + 600 + 600 + false + + + (0x2cdb2f0b, 0x12f231ea) + Fullscreen + + true + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 64.000000 + + + (0x207c9054, 0x3c841b63) + 369.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x007b56c4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004bf3, 0x00007808) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00208175) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005dd3, 0x00000cf3) + EEG Input Settings + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/configuration-eeg-input-settings.lua + false + + + (0x79a9edeb, 0x245d83fc) + Channels + + : + false + + + (0x3bcf9e67, 0x0c23994d) + Selection Method + Reject + Select + false + + + (0x666f25e9, 0x3e5738d6) + Match Method + Smart + Smart + false + + + (0x330306dd, 0x74a95f98) + Training Data File + ${Player_ScenarioDirectory}/signals/ssvep-record-current.ov + ${Player_ScenarioDirectory}/signals/ssvep-record-current.ov + false + + + (0x330306dd, 0x74a95f98) + Testing Data File + ${Player_ScenarioDirectory}/signals/ssvep-record-current.ov + ${Player_ScenarioDirectory}/signals/ssvep-record-current.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00dac25b) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000011e3, 0x00005213) + + (0x000024b5, 0x00000bb5) + 0 + + + (0x00005dd3, 0x00000cf3) + 0 + + + + (0x00002afe, 0x00005880) + + (0x00005dd3, 0x00000cf3) + 0 + + + (0x00000533, 0x00001c79) + 0 + + + + (0x0000591f, 0x00006602) + + (0x00000533, 0x00001c79) + 0 + + + (0x00004bf3, 0x00007808) + 0 + + + + + + (0x00000df6, 0x00003d56) + <big><b>Experiment Settings</b></big> + +Settings concerning the SSVEP experiment in general. + +<b>Target Light Color</b> and <b>Target Dark Color</b> represent +the two colors which will be used to generate the flickering of +the targets. The notation Light and Dark is arbitrary, however on +frequencies using odd number of frames will use more frames to +represent the Light color. + +<b>Screen Refresh Rate : </b> The refresh rate of your screen, +refer to your screen's user manual to find this value. + +<span color="red">Important notice</span> + +Your screen will be able to reproduce only frequencies which +are result of division of your screen refresh rate by an +integer. + +<b>Stimulation Frequencies</b> A comma separated list of +frequencies used for the stimulation. Refer to the documentation +for more details. + +<b>Processing Epoch Duration</b> The length of the slice of the signal +which will be used to find SSVEP response. With longer duration precision +will increase at the detriment of the lag. + +<b>Processing Epoch Interval</b> The speed interval between slices of the +signal. + +<b>Processing Frequency Tolerance</b> The width of the frequency band +around the stimulation frequency used for classification. + + + (0x473d9a43, 0x97fc0a97) + -176 + + + (0x7234b86b, 0x2b8651a5) + 128 + + + + + (0x0000187e, 0x00005350) + <b><span color="#2060ff">Configurable box</span></b> + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 368 + + + (0x7234b86b, 0x2b8651a5) + 400 + + + + + (0x0000288f, 0x00005f55) + <b>Welcome to the 'multiclass' SSVEP Mind Shooter</b> + +Multiclass classifiers and CSP are used +by the signal processing pipelines. + + + (0x473d9a43, 0x97fc0a97) + -160.000000 + + + (0x7234b86b, 0x2b8651a5) + -192.000000 + + + + + (0x000031b0, 0x00003fa0) + <big><b>Scenario description</b></big> + +<b><span color="red">This scenario must be run at least once before +running any further SSVEP scenarios</span></b> + +This is a scenario where you can configure your SSVEP experiment. There +are two boxes containing configuration parameters: + +<b>Peripheral Settings</b> + +<b>Experiment Settings</b> + +For more detailed description please refer to the SSVEP +documentation page. + + + (0x473d9a43, 0x97fc0a97) + 336 + + + (0x7234b86b, 0x2b8651a5) + -160 + + + + + (0x00003244, 0x00004359) + <b><span color="#2060ff">Configurable box</span></b> + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 368 + + + (0x7234b86b, 0x2b8651a5) + 64 + + + + + (0x00005ca6, 0x00003399) + <b><span color="#2060ff">Configurable box</span></b> + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 368 + + + (0x7234b86b, 0x2b8651a5) + 224 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00005488, 0x0000451f)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00000bbf, 0x000047e2)","index":0,"name":"Default tab","parentIdentifier":"(0x00005488, 0x0000451f)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000017e4, 0x00003d53)","index":0,"name":"Empty","parentIdentifier":"(0x00000bbf, 0x000047e2)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren, Jozef Legeny + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + SSVEP Configuration + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/ + + + (0xf6b2e3fa, 0x7bd43926) + SSVEP + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-2-training-acquisition.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-2-training-acquisition.xml new file mode 100644 index 0000000..65c060c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-2-training-acquisition.xml @@ -0,0 +1,1351 @@ + + 1 + Designer + 2.0.0 + + + + + + (0x00000f52, 0x00007365) + Start Stimulation + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/start-stimulator.lua + false + + + (0x007deef9, 0x2f3e95c6) + Delay + 1 + 1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -128.000000 + + + (0x207c9054, 0x3c841b63) + 288.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0027418f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001b97, 0x0000728f) + Scenario Control + (0x40714327, 0x458877d2) + + + (0x6f752dd0, 0x082a321e) + Output 1 + + + (0x6f752dd0, 0x082a321e) + Output 2 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn@localhost + SSVEP_VRPN_StartStop@localhost:${VRPN_ExternalServerPort} + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStop + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0x09fd9ef3, 0xeb8c3069) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00307f27) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x000024a5, 0x00002627) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x207c9054, 0x3c841b63) + 1040.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00154c95) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x000030b0, 0x00005fc1) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + (0x013df452, 0xa3a8879a) + Input stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].ov + ${Player_ScenarioDirectory}/signals/ssvep-record-current.ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x207c9054, 0x3c841b63) + 1168.000000 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0006f263) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000033a4, 0x00004a99) + Run Command + (0x48843891, 0x7bfc57f4) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 1 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_ExperimentStart + false + + + (0x79a9edeb, 0x245d83fc) + Command 1 + + ${External_Application_Launcher} openvibe-ssvep-mind-shooter --run-bg impact-trainer ${Player_ScenarioDirectory} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -64.000000 + + + (0x207c9054, 0x3c841b63) + 288.000000 + + + (0x4e7b798a, 0x183beafb) + (0xe44a71e7, 0x7964dd76) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002491aa) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003cf8, 0x00007fd0) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x207c9054, 0x3c841b63) + 544.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0028911b) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004345, 0x00005af1) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1088 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0018f821) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000047f9, 0x000022c3) + SSVEP Training Controller + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/training-acquisition-controller.lua + false + + + (0x79a9edeb, 0x245d83fc) + Focus sequence + 0 2 3 1 2 1 0 3 1 2 3 0 2 0 3 1 0 3 1 2 3 0 1 2 1 3 2 0 3 2 0 1 + 2 3 1 0 3 0 1 2 0 2 1 3 2 1 3 0 3 2 0 1 + false + + + (0x512a166f, 0x5c3ef83f) + Stimulation Duration + 7 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Break Duration + 2 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + Flickering Delay + 3.5 + 3.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoching Delay + 1.0 + 1.0 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 32.000000 + + + (0x207c9054, 0x3c841b63) + 592.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00ce4ea7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004f05, 0x0000760e) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + (0x013df452, 0xa3a8879a) + Input stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + Will-be-overridden + Will-be-overridden + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x207c9054, 0x3c841b63) + 960.000000 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/file-writer.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00095f27) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005926, 0x00004613) + Target Select + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + (0x6f752dd0, 0x082a321e) + Input 3 + + + (0x6f752dd0, 0x082a321e) + Input 4 + + + (0x6f752dd0, 0x082a321e) + Input 5 + + + (0x6f752dd0, 0x082a321e) + Input 6 + + + (0x6f752dd0, 0x082a321e) + Input 7 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + SSVEP_VRPN_TargetControl + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 5 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_04 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 5 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_04 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 6 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_05 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 6 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_05 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 7 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_06 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 7 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_06 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x207c9054, 0x3c841b63) + 656.000000 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00f3eccd) + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006e4a, 0x00003cc3) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x207c9054, 0x3c841b63) + 656.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002f1ed7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007f4c, 0x00002369) + Stimulator Control + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + (0x6f752dd0, 0x082a321e) + Input 3 + + + (0x6f752dd0, 0x082a321e) + Input 4 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + SSVEP_VRPN_StimulatorControl + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_VisualStimulationStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_VisualStimulationStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_VisualStimulationStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_VisualStimulationStop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x207c9054, 0x3c841b63) + 512.000000 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00969a07) + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000010c4, 0x000068b6) + + (0x000024a5, 0x00002627) + 2 + + + (0x00004345, 0x00005af1) + 0 + + + + (0x00001267, 0x00006200) + + (0x000047f9, 0x000022c3) + 0 + + + (0x00003cf8, 0x00007fd0) + 0 + + + + (0x0000173d, 0x0000791b) + + (0x00003cf8, 0x00007fd0) + 0 + + + (0x00007f4c, 0x00002369) + 3 + + + + (0x00001b66, 0x00003818) + + (0x00006e4a, 0x00003cc3) + 0 + + + (0x00005926, 0x00004613) + 5 + + + + (0x00001d81, 0x00002fac) + + (0x000024a5, 0x00002627) + 1 + + + (0x000030b0, 0x00005fc1) + 1 + + + + (0x00001da7, 0x00005f7c) + + (0x00006e4a, 0x00003cc3) + 0 + + + (0x00005926, 0x00004613) + 0 + + + + (0x00001de3, 0x00001e14) + + (0x000024a5, 0x00002627) + 1 + + + (0x00004f05, 0x0000760e) + 1 + + + + (0x000023b1, 0x00004e23) + + (0x000024a5, 0x00002627) + 2 + + + (0x000030b0, 0x00005fc1) + 2 + + + + (0x0000244c, 0x000058d9) + + (0x00006e4a, 0x00003cc3) + 0 + + + (0x00005926, 0x00004613) + 2 + + + + (0x00002651, 0x0000126e) + + (0x000047f9, 0x000022c3) + 1 + + + (0x00006e4a, 0x00003cc3) + 0 + + + + (0x0000303d, 0x00003dd8) + + (0x00006e4a, 0x00003cc3) + 0 + + + (0x00005926, 0x00004613) + 4 + + + + (0x0000357d, 0x00001d2b) + + (0x00006e4a, 0x00003cc3) + 0 + + + (0x00005926, 0x00004613) + 6 + + + + (0x00003647, 0x00002f9c) + + (0x00003cf8, 0x00007fd0) + 0 + + + (0x00007f4c, 0x00002369) + 1 + + + + (0x000042a2, 0x00007bda) + + (0x000024a5, 0x00002627) + 2 + + + (0x00004f05, 0x0000760e) + 2 + + + + (0x000054f5, 0x00001419) + + (0x00000f52, 0x00007365) + 0 + + + (0x000033a4, 0x00004a99) + 0 + + + + (0x000055e8, 0x00002259) + + (0x00003cf8, 0x00007fd0) + 0 + + + (0x00007f4c, 0x00002369) + 2 + + + + (0x00005cc8, 0x00007070) + + (0x00006e4a, 0x00003cc3) + 0 + + + (0x00005926, 0x00004613) + 3 + + + + (0x00006b15, 0x000062a5) + + (0x00003cf8, 0x00007fd0) + 0 + + + (0x00007f4c, 0x00002369) + 0 + + + + (0x00007124, 0x0000753b) + + (0x00006e4a, 0x00003cc3) + 0 + + + (0x00005926, 0x00004613) + 1 + + + + (0x000073b7, 0x0000226c) + + (0x00001b97, 0x0000728f) + 0 + + + (0x000047f9, 0x000022c3) + 0 + + + + + + (0x0000224f, 0x000030d7) + Classified focus conditions: + +0 = middle of ship (nothing) +1 = tip (fire gun) +2 = left (move) +3 = right (move) + + + (0x473d9a43, 0x97fc0a97) + 320.000000 + + + (0x7234b86b, 0x2b8651a5) + 32.000000 + + + + + (0x000036eb, 0x000003fe) + <b><span color="#2060ff">Configurable box</span></b> + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 592.000000 + + + (0x7234b86b, 0x2b8651a5) + 26.000000 + + + + + (0x00003ff7, 0x0000187b) + Launch the stimulator application + + + (0x473d9a43, 0x97fc0a97) + 288.000000 + + + (0x7234b86b, 0x2b8651a5) + -192.000000 + + + + + (0x0000538e, 0x000034ff) + The experiment timeline +(requested events, flicker on/off, etc) +will be forwarded to the application via VRPN + + + (0x473d9a43, 0x97fc0a97) + 304.000000 + + + (0x7234b86b, 0x2b8651a5) + 160.000000 + + + + + (0x0000538e, 0x00003500) + After rendering, the application will send the +events to the Acquisition Server by TCP Tagging. +The server aligns the stimulations to the signal. + + + (0x473d9a43, 0x97fc0a97) + 1040.000000 + + + (0x7234b86b, 0x2b8651a5) + 96.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":400,"identifier":"(0x000038e4, 0x000033ab)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":371},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004344, 0x000015dd)","index":0,"name":"Default tab","parentIdentifier":"(0x000038e4, 0x000033ab)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00005654, 0x000076d8)","index":0,"name":"Empty","parentIdentifier":"(0x00004344, 0x000015dd)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren, Jozef Legeny + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + SSVEP Training - Acquisition + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/ + + + (0xf6b2e3fa, 0x7bd43926) + SSVEP + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-3-CSP-training.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-3-CSP-training.xml new file mode 100644 index 0000000..7497bde --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-3-CSP-training.xml @@ -0,0 +1,1681 @@ + + 1 + Designer + 2.0.0 + + + + + + (0x00000870, 0x000031c2) + Frequency 1 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 9.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 10.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -672.000000 + + + (0x207c9054, 0x3c841b63) + 1104.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1b.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02049ec9) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000991, 0x00006d7c) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + : + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -848 + + + (0x207c9054, 0x3c841b63) + 1600 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/channel-selector.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000011a7, 0x000067a5) + Frequency 2 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -672.000000 + + + (0x207c9054, 0x3c841b63) + 1472.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2b.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x020bc37e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000228f, 0x00004370) + Regularized CSP Trainer + (0x2ec14cc0, 0x428c48bd) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Signal condition 1 + + + (0x5ba36127, 0x195feae1) + Signal condition 2 + + + (0x5ba36127, 0x195feae1) + Signal condition 3 + + + (0x5ba36127, 0x195feae1) + Signal condition 4 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_GDF_End_Of_Session + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Spatial filter configuration + + ${Player_ScenarioDirectory}/classifiers/csp-filters.cfg + false + + + (0x007deef9, 0x2f3e95c6) + Filter dimension + 2 + 2 + false + + + (0x2cdb2f0b, 0x12f231ea) + Save filters as box config + false + false + false + + + (0x59e83f33, 0x592f1dd0) + Covariance update + Chunk average + Chunk average + false + + + (0x2cdb2f0b, 0x12f231ea) + Trace normalization + false + true + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient + 0.0 + 0.0 + false + + + (0x512a166f, 0x5c3ef83f) + Tikhonov coefficient + 0.0 + 0.0 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -367.000000 + + + (0x207c9054, 0x3c841b63) + 1593.000000 + + + (0x4e7b798a, 0x183beafb) + (0x97c37a70, 0xbc9fecff) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/regularized-csp-trainer.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02e1261f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 8 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002405, 0x00000711) + Frequency 1 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -672.000000 + + + (0x207c9054, 0x3c841b63) + 1280.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1h1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01ff822c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002e6c, 0x00004c65) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x5ba36127, 0x195feae1) + Output + + + (0x5ba36127, 0x195feae1) + Output + + + (0x5ba36127, 0x195feae1) + New output + + + (0x5ba36127, 0x195feae1) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -432.000000 + + + (0x207c9054, 0x3c841b63) + 1600.000000 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x03005810) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004332, 0x00002b87) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -784.000000 + + + (0x207c9054, 0x3c841b63) + 1600.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x032b0207) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000043c3, 0x0000549c) + Frequency 3 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -672.000000 + + + (0x207c9054, 0x3c841b63) + 1920.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3b.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0200c0ef) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000045c2, 0x00005526) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + (0x5ba36127, 0x195feae1) + Input 3 + + + (0x5ba36127, 0x195feae1) + Input 4 + + + (0x5ba36127, 0x195feae1) + Input 5 + + + (0x5ba36127, 0x195feae1) + Input 6 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + -576.000000 + + + (0x207c9054, 0x3c841b63) + 1600.000000 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02279dd9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000046fb, 0x00005e12) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_VisualStimulationStart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -496.000000 + + + (0x207c9054, 0x3c841b63) + 1600.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x041e2584) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000473c, 0x00004b33) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/ssvep-record-current.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -912 + + + (0x207c9054, 0x3c841b63) + 1616 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x032a9d65) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005e32, 0x00003084) + Frequency 3 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -672.000000 + + + (0x207c9054, 0x3c841b63) + 2096.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3h1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02007dd8) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000708d, 0x0000304b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -288.000000 + + + (0x207c9054, 0x3c841b63) + 1576.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006fef7a) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007cc2, 0x000011ec) + Frequency 2 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 23.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -672.000000 + + + (0x207c9054, 0x3c841b63) + 1680.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2h1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x021a3f46) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007cc5, 0x00001129) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -576.000000 + + + (0x207c9054, 0x3c841b63) + 1504.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02e49f51) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00000452, 0x0000005d) + + (0x0000473c, 0x00004b33) + 2 + + + (0x00004332, 0x00002b87) + 1 + + + + (0x000007b1, 0x00002891) + + (0x00005e32, 0x00003084) + 0 + + + (0x000045c2, 0x00005526) + 5 + + + + (0x000008d1, 0x00005939) + + (0x00004332, 0x00002b87) + 0 + + + (0x00002405, 0x00000711) + 0 + + + + (0x00000b06, 0x00006597) + + (0x00000991, 0x00006d7c) + 0 + + + (0x00004332, 0x00002b87) + 0 + + + + (0x00000b8a, 0x00000eb7) + + (0x00002405, 0x00000711) + 0 + + + (0x000045c2, 0x00005526) + 1 + + + + (0x00000f10, 0x000047d0) + + (0x00004332, 0x00002b87) + 0 + + + (0x000011a7, 0x000067a5) + 0 + + + + (0x000010a8, 0x00005c81) + + (0x00007cc2, 0x000011ec) + 0 + + + (0x000045c2, 0x00005526) + 3 + + + + (0x000011bf, 0x00004334) + + (0x0000228f, 0x00004370) + 0 + + + (0x0000708d, 0x0000304b) + 0 + + + + (0x000012a9, 0x00002800) + + (0x00000870, 0x000031c2) + 0 + + + (0x000045c2, 0x00005526) + 0 + + + + (0x00001576, 0x00006d1d) + + (0x00004332, 0x00002b87) + 1 + + + (0x00007cc5, 0x00001129) + 0 + + + + (0x00001bca, 0x00002a7a) + + (0x00007cc5, 0x00001129) + 0 + + + (0x0000228f, 0x00004370) + 0 + + + + (0x00002cb9, 0x000049b7) + + (0x00004332, 0x00002b87) + 0 + + + (0x00000870, 0x000031c2) + 0 + + + + (0x00002e59, 0x000046e4) + + (0x00004332, 0x00002b87) + 0 + + + (0x00005e32, 0x00003084) + 0 + + + + (0x00003c70, 0x0000071d) + + (0x00007cc5, 0x00001129) + 0 + + + (0x000046fb, 0x00005e12) + 1 + + + + (0x000042f1, 0x000048a3) + + (0x000043c3, 0x0000549c) + 0 + + + (0x000045c2, 0x00005526) + 4 + + + + (0x0000466f, 0x000054bd) + + (0x00002e6c, 0x00004c65) + 1 + + + (0x0000228f, 0x00004370) + 2 + + + + (0x00004714, 0x000057ad) + + (0x00004332, 0x00002b87) + 0 + + + (0x000043c3, 0x0000549c) + 0 + + + + (0x00004e16, 0x00006f12) + + (0x000046fb, 0x00005e12) + 0 + + + (0x00002e6c, 0x00004c65) + 1 + + + + (0x0000580c, 0x00003069) + + (0x00002e6c, 0x00004c65) + 2 + + + (0x0000228f, 0x00004370) + 3 + + + + (0x00005bea, 0x000077ee) + + (0x00002e6c, 0x00004c65) + 0 + + + (0x0000228f, 0x00004370) + 1 + + + + (0x0000606a, 0x00001908) + + (0x00004332, 0x00002b87) + 0 + + + (0x00007cc2, 0x000011ec) + 0 + + + + (0x00007279, 0x00005b4e) + + (0x000011a7, 0x000067a5) + 0 + + + (0x000045c2, 0x00005526) + 2 + + + + (0x000072a5, 0x000060a5) + + (0x0000473c, 0x00004b33) + 1 + + + (0x00000991, 0x00006d7c) + 0 + + + + (0x0000772f, 0x00005de0) + + (0x000045c2, 0x00005526) + 0 + + + (0x000046fb, 0x00005e12) + 0 + + + + (0x0000799e, 0x00007b8d) + + (0x00002e6c, 0x00004c65) + 3 + + + (0x0000228f, 0x00004370) + 4 + + + + (0x00007e1f, 0x000006a7) + + (0x00007cc5, 0x00001129) + 0 + + + (0x00002e6c, 0x00004c65) + 0 + + + + + + (0x000012c1, 0x00001bac) + Estimate multiclass CSP filters + + + (0x473d9a43, 0x97fc0a97) + 1840.000000 + + + (0x7234b86b, 0x2b8651a5) + -368.000000 + + + + + (0x000035ad, 0x00005526) + This scenario trains a CSP filter bank +using the recorded signal + + + (0x473d9a43, 0x97fc0a97) + 1280.000000 + + + (0x7234b86b, 0x2b8651a5) + -816.000000 + + + + + (0x00006576, 0x000078b2) + Route signal depending on user focus condition + + + (0x473d9a43, 0x97fc0a97) + 1840.000000 + + + (0x7234b86b, 0x2b8651a5) + -480.000000 + + + + + (0x00007080, 0x0000367c) + Split the signal to bands of interest + + + (0x473d9a43, 0x97fc0a97) + 1600.000000 + + + (0x7234b86b, 0x2b8651a5) + -720.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":400,"identifier":"(0x00002e27, 0x00000e58)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":400},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000375a, 0x000012ca)","index":0,"name":"Default tab","parentIdentifier":"(0x00002e27, 0x00000e58)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00002384, 0x000054e5)","index":0,"name":"Empty","parentIdentifier":"(0x0000375a, 0x000012ca)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren, Jozef Legeny + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + SSVEP CSP Training + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/ + + + (0xf6b2e3fa, 0x7bd43926) + SSVEP + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-4-classifier-training.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-4-classifier-training.xml new file mode 100644 index 0000000..215ccc3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-4-classifier-training.xml @@ -0,0 +1,2199 @@ + + 1 + Designer + 2.0.0 + + + + + + (0x00000541, 0x00000c84) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + -304.000000 + + + (0x207c9054, 0x3c841b63) + 1616.000000 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x04955b49) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000870, 0x000031c2) + Frequency 1 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 9.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 10.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -732.000000 + + + (0x207c9054, 0x3c841b63) + 1104.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1b.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x022706d5) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000991, 0x00006d7c) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + : + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -896 + + + (0x207c9054, 0x3c841b63) + 1568 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/channel-selector.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000113e, 0x000001af) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + (0x17341935, 0x152ff448) + Features for class 4 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/classifiers/ssvep-classifier.cfg + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 4 label + OVTK_StimulationId_Label_04 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16.000000 + + + (0x207c9054, 0x3c841b63) + 1616.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0cf8d71f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000011a7, 0x000067a5) + Frequency 2 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -732.000000 + + + (0x207c9054, 0x3c841b63) + 1472.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2b.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02272861) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000122b, 0x00007d61) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240.000000 + + + (0x207c9054, 0x3c841b63) + 1616.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02db0dd6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002405, 0x00000711) + Frequency 1 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -732.000000 + + + (0x207c9054, 0x3c841b63) + 1280.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1h1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01f16b1e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002a61, 0x0000290e) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -96.000000 + + + (0x207c9054, 0x3c841b63) + 1616.000000 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x049eecbe) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00003311, 0x00001f73) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -448.000000 + + + (0x207c9054, 0x3c841b63) + 1616.000000 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006540cf) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004146, 0x00002633) + Multiclass CSP + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + ${Player_ScenarioDirectory}/classifiers/csp-filters.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -576.000000 + + + (0x207c9054, 0x3c841b63) + 1616.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0307e176) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004332, 0x00002b87) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -832.000000 + + + (0x207c9054, 0x3c841b63) + 1600.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x03765fdc) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000043c3, 0x0000549c) + Frequency 3 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -732.000000 + + + (0x207c9054, 0x3c841b63) + 1920.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3b.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x023a5c16) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000045c2, 0x00005526) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + (0x5ba36127, 0x195feae1) + Input 3 + + + (0x5ba36127, 0x195feae1) + Input 4 + + + (0x5ba36127, 0x195feae1) + Input 5 + + + (0x5ba36127, 0x195feae1) + Input 6 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + -640.000000 + + + (0x207c9054, 0x3c841b63) + 1616.000000 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02f7c23f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000046fb, 0x00005e12) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_VisualStimulationStart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -512.000000 + + + (0x207c9054, 0x3c841b63) + 1620.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0435bd4f) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000473c, 0x00004b33) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/ssvep-record-current.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -956.000000 + + + (0x207c9054, 0x3c841b63) + 1616.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x035ddd27) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005e32, 0x00003084) + Frequency 3 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -732.000000 + + + (0x207c9054, 0x3c841b63) + 2096.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3h1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01f6017b) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000067ff, 0x00006e47) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + -176.000000 + + + (0x207c9054, 0x3c841b63) + 1616.000000 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02df82b3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000708d, 0x0000304b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48.000000 + + + (0x207c9054, 0x3c841b63) + 1616.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02af89cb) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007c3d, 0x00003438) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -368.000000 + + + (0x207c9054, 0x3c841b63) + 1616.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0061c7a0) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007cc2, 0x000011ec) + Frequency 2 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 23.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -732.000000 + + + (0x207c9054, 0x3c841b63) + 1680.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2h1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x020114d4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007cc5, 0x00001129) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -608.000000 + + + (0x207c9054, 0x3c841b63) + 1456.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x032031cf) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007cc5, 0x0000112a) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -176.000000 + + + (0x207c9054, 0x3c841b63) + 1456.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x032031cf) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00000246, 0x0000737c) + + (0x0000122b, 0x00007d61) + 0 + + + (0x000067ff, 0x00006e47) + 0 + + + + (0x00000452, 0x0000005d) + + (0x0000473c, 0x00004b33) + 2 + + + (0x00004332, 0x00002b87) + 1 + + + + (0x00000469, 0x00000dd9) + + (0x00007cc5, 0x0000112a) + 0 + + + (0x00002a61, 0x0000290e) + 0 + + + + (0x0000064b, 0x000027b1) + + (0x00000541, 0x00000c84) + 0 + + + (0x0000122b, 0x00007d61) + 0 + + + + (0x000007b1, 0x00002891) + + (0x00005e32, 0x00003084) + 0 + + + (0x000045c2, 0x00005526) + 5 + + + + (0x000008d1, 0x00005939) + + (0x00004332, 0x00002b87) + 0 + + + (0x00002405, 0x00000711) + 0 + + + + (0x00000b8a, 0x00000eb7) + + (0x00002405, 0x00000711) + 0 + + + (0x000045c2, 0x00005526) + 1 + + + + (0x00000c19, 0x00001eb7) + + (0x00007cc5, 0x00001129) + 0 + + + (0x000046fb, 0x00005e12) + 1 + + + + (0x00000f10, 0x000047d0) + + (0x00004332, 0x00002b87) + 0 + + + (0x000011a7, 0x000067a5) + 0 + + + + (0x000010a8, 0x00005c81) + + (0x00007cc2, 0x000011ec) + 0 + + + (0x000045c2, 0x00005526) + 3 + + + + (0x000012a9, 0x00002800) + + (0x00000870, 0x000031c2) + 0 + + + (0x000045c2, 0x00005526) + 0 + + + + (0x000012f3, 0x00001213) + + (0x000045c2, 0x00005526) + 0 + + + (0x00004146, 0x00002633) + 0 + + + + (0x00001576, 0x00006d1d) + + (0x00004332, 0x00002b87) + 1 + + + (0x00007cc5, 0x00001129) + 0 + + + + (0x00002cb9, 0x000049b7) + + (0x00004332, 0x00002b87) + 0 + + + (0x00000870, 0x000031c2) + 0 + + + + (0x00002d26, 0x000027a0) + + (0x00007cc5, 0x00001129) + 0 + + + (0x00007cc5, 0x0000112a) + 0 + + + + (0x00002d8a, 0x00005512) + + (0x000067ff, 0x00006e47) + 0 + + + (0x00002a61, 0x0000290e) + 1 + + + + (0x00002e59, 0x000046e4) + + (0x00004332, 0x00002b87) + 0 + + + (0x00005e32, 0x00003084) + 0 + + + + (0x00003526, 0x00002c2e) + + (0x00002a61, 0x0000290e) + 3 + + + (0x0000113e, 0x000001af) + 4 + + + + (0x00003a5c, 0x00004b6a) + + (0x00002a61, 0x0000290e) + 2 + + + (0x0000113e, 0x000001af) + 3 + + + + (0x00003b44, 0x00002a03) + + (0x000046fb, 0x00005e12) + 0 + + + (0x00003311, 0x00001f73) + 0 + + + + (0x00003b5d, 0x00002c31) + + (0x0000473c, 0x00004b33) + 1 + + + (0x00000991, 0x00006d7c) + 0 + + + + (0x00003f61, 0x000002c6) + + (0x00003311, 0x00001f73) + 0 + + + (0x00007c3d, 0x00003438) + 0 + + + + (0x000042f1, 0x000048a3) + + (0x000043c3, 0x0000549c) + 0 + + + (0x000045c2, 0x00005526) + 4 + + + + (0x000044d3, 0x00004df8) + + (0x00007cc5, 0x0000112a) + 0 + + + (0x0000113e, 0x000001af) + 0 + + + + (0x0000463c, 0x000067e9) + + (0x00002a61, 0x0000290e) + 0 + + + (0x0000113e, 0x000001af) + 1 + + + + (0x00004714, 0x000057ad) + + (0x00004332, 0x00002b87) + 0 + + + (0x000043c3, 0x0000549c) + 0 + + + + (0x00004a51, 0x00001ba6) + + (0x0000113e, 0x000001af) + 0 + + + (0x0000708d, 0x0000304b) + 0 + + + + (0x00004b3a, 0x00002e5d) + + (0x00004146, 0x00002633) + 0 + + + (0x000046fb, 0x00005e12) + 0 + + + + (0x00005e08, 0x00007a2e) + + (0x00002a61, 0x0000290e) + 1 + + + (0x0000113e, 0x000001af) + 2 + + + + (0x00005eb4, 0x0000580b) + + (0x00007c3d, 0x00003438) + 0 + + + (0x00000541, 0x00000c84) + 0 + + + + (0x00005ee4, 0x00001937) + + (0x00000991, 0x00006d7c) + 0 + + + (0x00004332, 0x00002b87) + 0 + + + + (0x0000606a, 0x00001908) + + (0x00004332, 0x00002b87) + 0 + + + (0x00007cc2, 0x000011ec) + 0 + + + + (0x00007279, 0x00005b4e) + + (0x000011a7, 0x000067a5) + 0 + + + (0x000045c2, 0x00005526) + 2 + + + + + + (0x000035ad, 0x00005526) + This scenario trains a classifier using the +CSP filters learned in the previous scenario. Note +that if the same training data is used that +was used to learn the filters, the reported +cross-validation accuracies will be optimistic. + + + (0x473d9a43, 0x97fc0a97) + 1296.000000 + + + (0x7234b86b, 0x2b8651a5) + -880.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":400,"identifier":"(0x00002e27, 0x00000e58)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":400},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000375a, 0x000012ca)","index":0,"name":"Default tab","parentIdentifier":"(0x00002e27, 0x00000e58)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00002384, 0x000054e5)","index":0,"name":"Empty","parentIdentifier":"(0x0000375a, 0x000012ca)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren, Jozef Legeny + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + SSVEP CSP Training + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/ + + + (0xf6b2e3fa, 0x7bd43926) + SSVEP + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-5-online-test-shooter.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-5-online-test-shooter.xml new file mode 100644 index 0000000..da21572 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-5-online-test-shooter.xml @@ -0,0 +1,3334 @@ + + 1 + Designer + 2.0.0 + + + + + + (0x00000541, 0x00000c84) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + -128.000000 + + + (0x207c9054, 0x3c841b63) + 1664.000000 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01001d5e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000870, 0x000031c2) + Frequency 1 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 9.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 10.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -544.000000 + + + (0x207c9054, 0x3c841b63) + 1376.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1b.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x024aada5) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000991, 0x00006d7c) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + : + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -720 + + + (0x207c9054, 0x3c841b63) + 1648 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/channel-selector.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000e92, 0x00000315) + SSVEP Shooter Controller + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/shooter-controller.lua + false + + + (0x79a9edeb, 0x245d83fc) + Target Types + 1 1 2 3 + 4 5 6 4 5 6 4 5 6 4 5 6 4 5 6 4 5 6 4 5 6 4 5 6 4 5 6 4 5 6 + false + + + (0x79a9edeb, 0x245d83fc) + Target Positions + 1 7 1 7 + 0 1 0 1 0 1 0 1 0 1 + false + + + (0x2cdb2f0b, 0x12f231ea) + Target Lockdown + true + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Pilot Assist + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Display Feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + One By One + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Analog Control + true + true + false + + + (0xa88b3667, 0x0871638c) + Shooter log level + Information + Information + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -833.000000 + + + (0x207c9054, 0x3c841b63) + 1168.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0b887659) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x000011a7, 0x000067a5) + Frequency 2 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -560.000000 + + + (0x207c9054, 0x3c841b63) + 1648.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2b.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x023fee28) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000122b, 0x00007d61) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -64.000000 + + + (0x207c9054, 0x3c841b63) + 1664.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c97525) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000015a6, 0x00000547) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -496 + + + (0x207c9054, 0x3c841b63) + 992 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x028e0c94) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001850, 0x00000023) + Run Command + (0x48843891, 0x7bfc57f4) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 1 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_ExperimentStart + false + + + (0x79a9edeb, 0x245d83fc) + Command 1 + + ${External_Application_Launcher} openvibe-ssvep-mind-shooter --run-bg impact-shooter ${Player_ScenarioDirectory} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -928 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0xe44a71e7, 0x7964dd76) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0312b1b6) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001f6c, 0x00004dd8) + VRPN Target Request + (0x40714327, 0x458877d2) + + + (0x6f752dd0, 0x082a321e) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn@localhost + SSVEP_VRPN_TargetRequest@localhost:${VRPN_ExternalServerPort} + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Target + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_NonTarget + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -992 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x4e7b798a, 0x183beafb) + (0x09fd9ef3, 0xeb8c3069) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x03a4f86e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00002346, 0x00006c9f) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/classifiers/ssvep-classifier.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80.000000 + + + (0x207c9054, 0x3c841b63) + 1664.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x015885cf) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00002405, 0x00000711) + Frequency 1 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -512.000000 + + + (0x207c9054, 0x3c841b63) + 1472.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1h1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0261f183) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002a5f, 0x00004e7d) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/signals/ssvep-record-current.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -816.000000 + + + (0x207c9054, 0x3c841b63) + 1856.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x045af6be) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00003311, 0x00001f73) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -272.000000 + + + (0x207c9054, 0x3c841b63) + 1664.000000 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x015e8d54) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000358f, 0x00006ecd) + Start Stimulation + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/start-stimulator.lua + false + + + (0x007deef9, 0x2f3e95c6) + Delay + 1 + 3 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -992 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x039a49ca) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000365d, 0x00007ad2) + VRPN Analog Control + (0x0ddc3a7e, 0x6f6e6401) + + + (0x544a003e, 0x6dcba5f6) + Input 1 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + SSVEP_VRPN_AnalogControl + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240.000000 + + + (0x207c9054, 0x3c841b63) + 1952.000000 + + + (0x4e7b798a, 0x183beafb) + (0x2f4c9e00, 0x5dc619e4) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0110b1ff) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003c07, 0x000076a5) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -416 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0379fa9b) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003e8e, 0x00002a59) + FILE + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -720.000000 + + + (0x207c9054, 0x3c841b63) + 1856.000000 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0385b5b9) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000040fc, 0x00000d6a) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream + + + + + (0x5ba36127, 0x195feae1) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -656.000000 + + + (0x207c9054, 0x3c841b63) + 1648.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0127c392) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004146, 0x00002633) + Multiclass CSP + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + ${Player_ScenarioDirectory}/classifiers/csp-filters.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -336.000000 + + + (0x207c9054, 0x3c841b63) + 1664.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x032b12dd) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004276, 0x00004530) + Button Simplifier + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/shooter-button-simplifier.lua + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -496 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0792f2b7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x000043c3, 0x0000549c) + Frequency 3 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -560.000000 + + + (0x207c9054, 0x3c841b63) + 1888.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3b.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x026362a4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000045c2, 0x00005526) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + (0x5ba36127, 0x195feae1) + Input 3 + + + (0x5ba36127, 0x195feae1) + Input 4 + + + (0x5ba36127, 0x195feae1) + Input 5 + + + (0x5ba36127, 0x195feae1) + Input 6 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + -400.000000 + + + (0x207c9054, 0x3c841b63) + 1664.000000 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02d71f38) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000561d, 0x0000023f) + CLASSIFIER + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224.000000 + + + (0x207c9054, 0x3c841b63) + 1472.000000 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x4ccc143a) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005d6f, 0x00004689) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -784 + + + (0x207c9054, 0x3c841b63) + 1664 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x008e8a6d) + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00005e32, 0x00003084) + Frequency 3 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -512.000000 + + + (0x207c9054, 0x3c841b63) + 1984.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3h1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x023d70a0) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005f9d, 0x000059f7) + Stimulator Control + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + (0x6f752dd0, 0x082a321e) + Input 3 + + + (0x6f752dd0, 0x082a321e) + Input 4 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + SSVEP_VRPN_StimulatorControl + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_VisualStimulationStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_VisualStimulationStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_VisualStimulationStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_VisualStimulationStop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -176 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0c4cdfaf) + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000067ff, 0x00006e47) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 16.000000 + + + (0x207c9054, 0x3c841b63) + 1664.000000 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c41578) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000068e2, 0x00005ec9) + VRPN Discrete Control + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + (0x6f752dd0, 0x082a321e) + Input 3 + + + (0x6f752dd0, 0x082a321e) + Input 4 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + SSVEP_VRPN_DiscreteControl + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_03 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240.000000 + + + (0x207c9054, 0x3c841b63) + 1664.000000 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01ced0b0) + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000076d8, 0x000033ed) + TIMELINE + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -736.000000 + + + (0x207c9054, 0x3c841b63) + 1008.000000 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00330d6f) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000079c9, 0x00001b94) + VRPN Target Command + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + (0x6f752dd0, 0x082a321e) + Input 3 + + + (0x6f752dd0, 0x082a321e) + Input 4 + + + (0x6f752dd0, 0x082a321e) + Input 5 + + + (0x6f752dd0, 0x082a321e) + Input 6 + + + (0x6f752dd0, 0x082a321e) + Input 7 + + + (0x6f752dd0, 0x082a321e) + Input 8 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + SSVEP_VRPN_TargetControl + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 5 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_04 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 5 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_04 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 6 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_05 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 6 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_05 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 7 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_06 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 7 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_06 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 8 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_07 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 8 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_07 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -640 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x18398a64) + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007a53, 0x00000fc2) + Scenario Control + (0x40714327, 0x458877d2) + + + (0x6f752dd0, 0x082a321e) + Output 1 + + + (0x6f752dd0, 0x082a321e) + Output 2 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn@localhost + SSVEP_VRPN_StartStop@localhost:${VRPN_ExternalServerPort} + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStart + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_ExperimentStop + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -656 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0x09fd9ef3, 0xeb8c3069) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x033a2594) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00007c3d, 0x00003438) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -192.000000 + + + (0x207c9054, 0x3c841b63) + 1664.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01c7368b) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007cc2, 0x000011ec) + Frequency 2 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 23.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -512.000000 + + + (0x207c9054, 0x3c841b63) + 1712.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2h1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02411c25) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007fc4, 0x00003460) + Stimulation multiplexer + (0x07db4efa, 0x472b0938) + + + (0x6f752dd0, 0x082a321e) + Input stimulations 1 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 2 + + + + + (0x6f752dd0, 0x082a321e) + Multiplexed stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0xe7af82cd, 0x14edb4d4) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x083675e5) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000001a9, 0x00005637) + + (0x00002346, 0x00006c9f) + 0 + + + (0x000068e2, 0x00005ec9) + 2 + + + + (0x00000246, 0x0000737c) + + (0x0000122b, 0x00007d61) + 0 + + + (0x000067ff, 0x00006e47) + 0 + + + + (0x0000028d, 0x000052a5) + + (0x000040fc, 0x00000d6a) + 0 + + + (0x00005e32, 0x00003084) + 0 + + + + (0x00000570, 0x000076ad) + + (0x00001f6c, 0x00004dd8) + 0 + + + (0x00000e92, 0x00000315) + 0 + + + + (0x00000598, 0x00004a35) + + (0x00000e92, 0x00000315) + 0 + + + (0x000079c9, 0x00001b94) + 2 + + + + (0x0000064b, 0x000027b1) + + (0x00000541, 0x00000c84) + 0 + + + (0x0000122b, 0x00007d61) + 0 + + + + (0x000007b1, 0x00002891) + + (0x00005e32, 0x00003084) + 0 + + + (0x000045c2, 0x00005526) + 5 + + + + (0x00000b8a, 0x00000eb7) + + (0x00002405, 0x00000711) + 0 + + + (0x000045c2, 0x00005526) + 1 + + + + (0x00000dd2, 0x0000600b) + + (0x000067ff, 0x00006e47) + 0 + + + (0x00002346, 0x00006c9f) + 0 + + + + (0x000010a8, 0x00005c81) + + (0x00007cc2, 0x000011ec) + 0 + + + (0x000045c2, 0x00005526) + 3 + + + + (0x000011f5, 0x00003f76) + + (0x0000358f, 0x00006ecd) + 0 + + + (0x00001850, 0x00000023) + 0 + + + + (0x000012a9, 0x00002800) + + (0x00000870, 0x000031c2) + 0 + + + (0x000045c2, 0x00005526) + 0 + + + + (0x000012f3, 0x00001213) + + (0x000045c2, 0x00005526) + 0 + + + (0x00004146, 0x00002633) + 0 + + + + (0x00001328, 0x00000254) + + (0x000040fc, 0x00000d6a) + 0 + + + (0x00000870, 0x000031c2) + 0 + + + + (0x00001c76, 0x00007b9b) + + (0x00003c07, 0x000076a5) + 0 + + + (0x00005f9d, 0x000059f7) + 0 + + + + (0x000020a2, 0x00001696) + + (0x00000e92, 0x00000315) + 0 + + + (0x000079c9, 0x00001b94) + 4 + + + + (0x000022eb, 0x000007de) + + (0x00000e92, 0x00000315) + 0 + + + (0x000079c9, 0x00001b94) + 5 + + + + (0x000022f3, 0x000040c1) + + (0x00003c07, 0x000076a5) + 0 + + + (0x00007fc4, 0x00003460) + 0 + + + + (0x00002759, 0x00006463) + + (0x000040fc, 0x00000d6a) + 0 + + + (0x000043c3, 0x0000549c) + 0 + + + + (0x0000278f, 0x00000e27) + + (0x00000e92, 0x00000315) + 0 + + + (0x000076d8, 0x000033ed) + 1 + + + + (0x00002fe3, 0x000016b0) + + (0x00007a53, 0x00000fc2) + 0 + + + (0x00004276, 0x00004530) + 0 + + + + (0x0000320f, 0x00007bfd) + + (0x00000e92, 0x00000315) + 0 + + + (0x000079c9, 0x00001b94) + 7 + + + + (0x00003c1b, 0x0000391f) + + (0x00002a5f, 0x00004e7d) + 1 + + + (0x00003e8e, 0x00002a59) + 0 + + + + (0x00003e3d, 0x00000b6e) + + (0x00000991, 0x00006d7c) + 0 + + + (0x000040fc, 0x00000d6a) + 0 + + + + (0x00003f61, 0x000002c6) + + (0x00003311, 0x00001f73) + 0 + + + (0x00007c3d, 0x00003438) + 0 + + + + (0x00004142, 0x00003c6b) + + (0x00002346, 0x00006c9f) + 0 + + + (0x000068e2, 0x00005ec9) + 1 + + + + (0x000042f1, 0x000048a3) + + (0x000043c3, 0x0000549c) + 0 + + + (0x000045c2, 0x00005526) + 4 + + + + (0x0000455d, 0x000022e3) + + (0x000040fc, 0x00000d6a) + 0 + + + (0x000011a7, 0x000067a5) + 0 + + + + (0x00004567, 0x00003712) + + (0x00007fc4, 0x00003460) + 0 + + + (0x00005f9d, 0x000059f7) + 1 + + + + (0x00004698, 0x00005a3c) + + (0x00003c07, 0x000076a5) + 0 + + + (0x00005f9d, 0x000059f7) + 3 + + + + (0x000048b9, 0x00000d03) + + (0x00001f6c, 0x00004dd8) + 0 + + + (0x000076d8, 0x000033ed) + 0 + + + + (0x000049fb, 0x000028b4) + + (0x00000e92, 0x00000315) + 0 + + + (0x000079c9, 0x00001b94) + 6 + + + + (0x00004e85, 0x000068ce) + + (0x00000e92, 0x00000315) + 0 + + + (0x000079c9, 0x00001b94) + 1 + + + + (0x00005224, 0x0000445f) + + (0x000040fc, 0x00000d6a) + 0 + + + (0x00007cc2, 0x000011ec) + 0 + + + + (0x00005260, 0x00007c5d) + + (0x00002346, 0x00006c9f) + 0 + + + (0x000068e2, 0x00005ec9) + 3 + + + + (0x00005d65, 0x00001720) + + (0x00004146, 0x00002633) + 0 + + + (0x00003311, 0x00001f73) + 0 + + + + (0x00005e42, 0x00006891) + + (0x00002346, 0x00006c9f) + 2 + + + (0x0000365d, 0x00007ad2) + 0 + + + + (0x00005eb4, 0x0000580b) + + (0x00007c3d, 0x00003438) + 0 + + + (0x00000541, 0x00000c84) + 0 + + + + (0x0000624d, 0x000068cd) + + (0x00005d6f, 0x00004689) + 1 + + + (0x00000991, 0x00006d7c) + 0 + + + + (0x00006695, 0x00004561) + + (0x00000e92, 0x00000315) + 0 + + + (0x00007fc4, 0x00003460) + 1 + + + + (0x00007132, 0x00003e93) + + (0x00000e92, 0x00000315) + 0 + + + (0x000079c9, 0x00001b94) + 3 + + + + (0x00007224, 0x00005f2a) + + (0x000040fc, 0x00000d6a) + 0 + + + (0x00002405, 0x00000711) + 0 + + + + (0x00007279, 0x00005b4e) + + (0x000011a7, 0x000067a5) + 0 + + + (0x000045c2, 0x00005526) + 2 + + + + (0x000076f2, 0x00006642) + + (0x00002346, 0x00006c9f) + 0 + + + (0x0000561d, 0x0000023f) + 0 + + + + (0x00007771, 0x00000507) + + (0x00007a53, 0x00000fc2) + 1 + + + (0x000015a6, 0x00000547) + 0 + + + + (0x00007777, 0x0000285b) + + (0x00004276, 0x00004530) + 0 + + + (0x00003c07, 0x000076a5) + 0 + + + + (0x00007d78, 0x000037d1) + + (0x00002346, 0x00006c9f) + 0 + + + (0x000068e2, 0x00005ec9) + 0 + + + + (0x00007df2, 0x0000026a) + + (0x00000e92, 0x00000315) + 0 + + + (0x000079c9, 0x00001b94) + 0 + + + + (0x00007f30, 0x00003cb3) + + (0x00003c07, 0x000076a5) + 0 + + + (0x00005f9d, 0x000059f7) + 2 + + + + + + (0x00000570, 0x00002927) + Note: The label predictions of the classifier are only used if the + SSVEP_AnalogControl is set to <b>false</b>. +Otherwise the class probabilities are used. + + + (0x473d9a43, 0x97fc0a97) + 1152.000000 + + + (0x7234b86b, 0x2b8651a5) + 176.000000 + + + + + (0x00000b28, 0x0000205d) + This pipeline generates the enemy target ship +sequence for the game and sends them over +VRPN. It also stops the scenario eventually. + + + (0x473d9a43, 0x97fc0a97) + 1168.000000 + + + (0x7234b86b, 0x2b8651a5) + -1072.000000 + + + + + (0x00000b28, 0x0000205e) + This pipeline starts the game app + + + (0x473d9a43, 0x97fc0a97) + 816.000000 + + + (0x7234b86b, 0x2b8651a5) + -1072.000000 + + + + + (0x00000b28, 0x0000205f) + This pipeline sends classifier predictions +to the Mind Shooter game + + + (0x473d9a43, 0x97fc0a97) + 1664.000000 + + + (0x7234b86b, 0x2b8651a5) + -880.000000 + + + + + (0x00003052, 0x00006044) + <b><span color="#2060ff">Configurable box</span></b> + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 1168 + + + (0x7234b86b, 0x2b8651a5) + -832 + + + + + (0x00007434, 0x00006261) + This scenario uses the previously built CSP and +classifier for BCI control of the Mind Shooter! + + + (0x473d9a43, 0x97fc0a97) + 1632.000000 + + + (0x7234b86b, 0x2b8651a5) + -1072.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":400,"identifier":"(0x00005679, 0x00004fee)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":394},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003c2d, 0x00003bc8)","index":0,"name":"Default tab","parentIdentifier":"(0x00005679, 0x00004fee)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00004563, 0x00004efd)","index":0,"name":"Empty","parentIdentifier":"(0x00003c2d, 0x00003bc8)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren, Jozef Legeny + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + SSVEP Online Test - Shooter + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/ + + + (0xf6b2e3fa, 0x7bd43926) + SSVEP + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-6-performance-test.xml b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-6-performance-test.xml new file mode 100644 index 0000000..e96c099 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/ms-6-performance-test.xml @@ -0,0 +1,2102 @@ + + 1 + Designer + 2.0.0 + + + + + + (0x00000541, 0x00000c84) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 0.000000 + + + (0x207c9054, 0x3c841b63) + 1552.000000 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003e5323) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000870, 0x000031c2) + Frequency 1 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 9.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 10.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -416.000000 + + + (0x207c9054, 0x3c841b63) + 1264.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1b.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00504815) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000991, 0x00006d7c) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + : + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -624 + + + (0x207c9054, 0x3c841b63) + 1488 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/channel-selector.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000099d, 0x00007c08) + CLASSIFIER + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x207c9054, 0x3c841b63) + 1680.000000 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00025bfa) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000011a7, 0x000067a5) + Frequency 2 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -432.000000 + + + (0x207c9054, 0x3c841b63) + 1536.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2b.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004e93e5) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000122b, 0x00007d61) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64.000000 + + + (0x207c9054, 0x3c841b63) + 1552.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0020a30e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002346, 0x00006c9f) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/classifiers/ssvep-classifier.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208.000000 + + + (0x207c9054, 0x3c841b63) + 1568.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003504c2) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00002405, 0x00000711) + Frequency 1 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -384.000000 + + + (0x207c9054, 0x3c841b63) + 1360.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-1h1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004d65df) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003311, 0x00001f73) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.1 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -128.000000 + + + (0x207c9054, 0x3c841b63) + 1552.000000 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000639d7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003e8e, 0x00002a59) + FILE + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -592.000000 + + + (0x207c9054, 0x3c841b63) + 1744.000000 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00014f8b) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000040fc, 0x00000d6a) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream + + + + + (0x5ba36127, 0x195feae1) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -528.000000 + + + (0x207c9054, 0x3c841b63) + 1536.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000cf9df) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004146, 0x00002633) + Multiclass CSP + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + ${Player_ScenarioDirectory}/classifiers/csp-filters.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -256.000000 + + + (0x207c9054, 0x3c841b63) + 1552.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001e2582) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000043c3, 0x0000549c) + Frequency 3 (base) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -432.000000 + + + (0x207c9054, 0x3c841b63) + 1776.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3b.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004b6e95) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000045c2, 0x00005526) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + (0x5ba36127, 0x195feae1) + Input 3 + + + (0x5ba36127, 0x195feae1) + Input 4 + + + (0x5ba36127, 0x195feae1) + Input 5 + + + (0x5ba36127, 0x195feae1) + Input 6 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + -320.000000 + + + (0x207c9054, 0x3c841b63) + 1552.000000 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002afddc) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000046fb, 0x00005e12) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 7 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_StimulationId_VisualStimulationStart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -192.000000 + + + (0x207c9054, 0x3c841b63) + 1552.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003b81c2) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00005e32, 0x00003084) + Frequency 3 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -384.000000 + + + (0x207c9054, 0x3c841b63) + 1872.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-3h1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00540463) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000067ff, 0x00006e47) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 144.000000 + + + (0x207c9054, 0x3c841b63) + 1552.000000 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001e03f2) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007c3d, 0x00003438) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -64.000000 + + + (0x207c9054, 0x3c841b63) + 1552.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00060780) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007cc2, 0x000011ec) + Frequency 2 (1st harmonic) + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 23.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -384.000000 + + + (0x207c9054, 0x3c841b63) + 1600.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/temporal-filter-freq-2h1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004e3fff) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x03f450b7, 0x41dbe155) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -496.000000 + + + (0x207c9054, 0x3c841b63) + 1024.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002fe825) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x3ba849a3, 0x056b34cd) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -608.000000 + + + (0x207c9054, 0x3c841b63) + 1104.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0029cfd6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x53e21741, 0x46473b66) + Confusion Matrix Calculator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/performance-test-confusion-matrix.lua + false + + + (0x007deef9, 0x2f3e95c6) + Class count + 3 + 4 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x207c9054, 0x3c841b63) + 1488.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01172efa) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x561cb172, 0x4eb061c1) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + Will-be-overridden + Will-be-overriden + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -736 + + + (0x207c9054, 0x3c841b63) + 1456 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/configuration/file-reader-testing.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004d76b1) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + + + (0x00000246, 0x0000737c) + + (0x0000122b, 0x00007d61) + 0 + + + (0x000067ff, 0x00006e47) + 0 + + + + (0x0000028d, 0x000052a5) + + (0x000040fc, 0x00000d6a) + 0 + + + (0x00005e32, 0x00003084) + 0 + + + + (0x00000468, 0x0000665c) + + (0x00002346, 0x00006c9f) + 0 + + + (0x0000099d, 0x00007c08) + 0 + + + + (0x0000064b, 0x000027b1) + + (0x00000541, 0x00000c84) + 0 + + + (0x0000122b, 0x00007d61) + 0 + + + + (0x000007b1, 0x00002891) + + (0x00005e32, 0x00003084) + 0 + + + (0x000045c2, 0x00005526) + 5 + + + + (0x00000b8a, 0x00000eb7) + + (0x00002405, 0x00000711) + 0 + + + (0x000045c2, 0x00005526) + 1 + + + + (0x00000dd2, 0x0000600b) + + (0x000067ff, 0x00006e47) + 0 + + + (0x00002346, 0x00006c9f) + 0 + + + + (0x000010a8, 0x00005c81) + + (0x00007cc2, 0x000011ec) + 0 + + + (0x000045c2, 0x00005526) + 3 + + + + (0x000012a9, 0x00002800) + + (0x00000870, 0x000031c2) + 0 + + + (0x000045c2, 0x00005526) + 0 + + + + (0x000012f3, 0x00001213) + + (0x000045c2, 0x00005526) + 0 + + + (0x00004146, 0x00002633) + 0 + + + + (0x00001328, 0x00000254) + + (0x000040fc, 0x00000d6a) + 0 + + + (0x00000870, 0x000031c2) + 0 + + + + (0x0000252f, 0x00003977) + + (0x000046fb, 0x00005e12) + 0 + + + (0x00003311, 0x00001f73) + 0 + + + + (0x00002759, 0x00006463) + + (0x000040fc, 0x00000d6a) + 0 + + + (0x000043c3, 0x0000549c) + 0 + + + + (0x000032af, 0x000024e3) + + (0x561cb172, 0x4eb061c1) + 2 + + + (0x00003e8e, 0x00002a59) + 0 + + + + (0x00003559, 0x00006417) + + (0x00000991, 0x00006d7c) + 0 + + + (0x000040fc, 0x00000d6a) + 0 + + + + (0x00003bdd, 0x00004f24) + + (0x561cb172, 0x4eb061c1) + 2 + + + (0x3ba849a3, 0x056b34cd) + 0 + + + + (0x00003f61, 0x000002c6) + + (0x00003311, 0x00001f73) + 0 + + + (0x00007c3d, 0x00003438) + 0 + + + + (0x000042f1, 0x000048a3) + + (0x000043c3, 0x0000549c) + 0 + + + (0x000045c2, 0x00005526) + 4 + + + + (0x0000455d, 0x000022e3) + + (0x000040fc, 0x00000d6a) + 0 + + + (0x000011a7, 0x000067a5) + 0 + + + + (0x00005224, 0x0000445f) + + (0x000040fc, 0x00000d6a) + 0 + + + (0x00007cc2, 0x000011ec) + 0 + + + + (0x00005eb4, 0x0000580b) + + (0x00007c3d, 0x00003438) + 0 + + + (0x00000541, 0x00000c84) + 0 + + + + (0x000064a4, 0x000059f5) + + (0x561cb172, 0x4eb061c1) + 1 + + + (0x00000991, 0x00006d7c) + 0 + + + + (0x000065d3, 0x00000855) + + (0x00004146, 0x00002633) + 0 + + + (0x000046fb, 0x00005e12) + 0 + + + + (0x000069e1, 0x0000446a) + + (0x00002346, 0x00006c9f) + 0 + + + (0x53e21741, 0x46473b66) + 1 + + + + (0x00006c6c, 0x000061c4) + + (0x3ba849a3, 0x056b34cd) + 0 + + + (0x000046fb, 0x00005e12) + 1 + + + + (0x00007224, 0x00005f2a) + + (0x000040fc, 0x00000d6a) + 0 + + + (0x00002405, 0x00000711) + 0 + + + + (0x00007279, 0x00005b4e) + + (0x000011a7, 0x000067a5) + 0 + + + (0x000045c2, 0x00005526) + 2 + + + + (0x00007b3c, 0x00006f75) + + (0x3ba849a3, 0x056b34cd) + 0 + + + (0x53e21741, 0x46473b66) + 0 + + + + (0x2bb5d881, 0x395db2bf) + + (0x3ba849a3, 0x056b34cd) + 0 + + + (0x03f450b7, 0x41dbe155) + 0 + + + + + + (0x00004ca2, 0x00004b0d) + Targets 0-2 are the flickers, +target 3 should be 'middle of the ship' + + + (0x473d9a43, 0x97fc0a97) + 1200.000000 + + + (0x7234b86b, 0x2b8651a5) + 272.000000 + + + + + (0x4c6fe770, 0x35cfa50f) + This scenario calculates the confusion matrix over +several classes for SSVEP performance testing. + +By default it loads the file specified for testing in the +configuration scenario. + +Note that if you use the same file for training +and testing, the results are likely very optimistic. + +n.b. The scenario does not test the numeric +probability outputs that drive the Mind Shooter +in the analog control mode. Only discrete +control is tested. + + + (0x473d9a43, 0x97fc0a97) + 1104.000000 + + + (0x7234b86b, 0x2b8651a5) + -752.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x4285e713, 0x4caa91d7)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x5a123d4c, 0x475dbeaa)","index":0,"name":"Default tab","parentIdentifier":"(0x4285e713, 0x4caa91d7)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x2ea7e498, 0x310ada45)","index":0,"name":"Empty","parentIdentifier":"(0x5a123d4c, 0x475dbeaa)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren, Jozef Legeny + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + SSVEP Performance Test + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/using-the-ssvep-mind-shooter-scenarios/ + + + (0xf6b2e3fa, 0x7bd43926) + SSVEP + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/configuration-eeg-input-settings.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/configuration-eeg-input-settings.lua new file mode 100644 index 0000000..c3cb0c7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/configuration-eeg-input-settings.lua @@ -0,0 +1,74 @@ +channels = nil +selection_method = nil +match_method = nil + +training_datafile = nil +testing_datafile = nil + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + channels = box:get_setting(2) + selection_method = box:get_setting(3) + match_method = box:get_setting(4) + training_datafile = box:get_setting(5) + testing_datafile = box:get_setting(6) + + +end + +function uninitialize(box) +end + +function process(box) + + while box:keep_processing() and box:get_stimulation_count(1) == 0 do + box:sleep() + end + + -- create material + + box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/channel-selector.cfg'")) + + cfg_file = io.open(box:get_config("${Player_ScenarioDirectory}/configuration/channel-selector.cfg"), "w") + + if cfg_file == nil then + box:log("Error", "Could not open config file for writing") + end + + cfg_file:write("\n") + cfg_file:write(string.format("%s\n", channels)) + cfg_file:write(string.format("%s\n", selection_method)) + cfg_file:write(string.format("%s\n", match_method)) + cfg_file:write("\n") + + cfg_file:close() + + box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/file-reader-training.cfg'")) + + cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/configuration/file-reader-training.cfg"), "w")) + + cfg_file:write("\n") + cfg_file:write(string.format("%s\n", training_datafile)) + -- cfg_file:write(string.format("32\n")) + cfg_file:write("\n") + + cfg_file:close() + + box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/file-reader-testing.cfg'")) + + cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/configuration/file-reader-testing.cfg"), "w")) + + cfg_file:write("\n") + cfg_file:write(string.format("%s\n", testing_datafile)) + -- cfg_file:write(string.format("32\n")) + cfg_file:write("\n") + + cfg_file:close() + + + + + -- notify the scenario that the configuration process is complete + box:send_stimulation(1, OVTK_StimulationId_TrainCompleted, box:get_current_time() + 0.2, 0) + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/configuration-experiment-settings.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/configuration-experiment-settings.lua new file mode 100644 index 0000000..68ebf60 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/configuration-experiment-settings.lua @@ -0,0 +1,185 @@ +stimulation_frequencies = {} +frequency_count = 0 + +target_light_color = {} +target_dark_color = {} +training_target_size = {} +training_targets_positions = {} + +processing_epoch_duration = nil +processing_epoch_interval = nil +processing_frequency_tolerance = nil +csp_filter_order = nil + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + for value in box:get_setting(2):gmatch("%d+") do + table.insert(target_light_color, value) + end + + for value in box:get_setting(3):gmatch("%d+") do + table.insert(target_dark_color, value) + end + + for value in box:get_setting(4):gmatch("%d+[.]?%d*") do + table.insert(stimulation_frequencies, value) + frequency_count = frequency_count + 1 + end + + processing_epoch_duration = box:get_setting(5) + processing_epoch_interval = box:get_setting(6) + processing_frequency_tolerance = box:get_setting(7) + csp_filter_order = box:get_setting(8) + s_focus_point = box:get_setting(9) + + +end + +function uninitialize(box) +end + +function process(box) + + while box:keep_processing() and box:get_stimulation_count(1) == 0 do + box:sleep() + end + + -- create material + + box:log("Info", box:get_config("Creating materials in '${Player_ScenarioDirectory}/appconf/materials/flickering.material'")) + + cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/appconf/materials/flickering.material"), "w")) + + cfg_file:write("material target_bright\n") + cfg_file:write("{\n") + cfg_file:write(" technique\n") + cfg_file:write(" {\n") + cfg_file:write(" pass\n") + cfg_file:write(" {\n") + cfg_file:write(" ambient 0 0 0 0\n") + cfg_file:write(" diffuse 0 0 0 0\n") + cfg_file:write(" specular 0 0 0 0\n") + cfg_file:write(" emissive ", target_light_color[1] / 100, " ", target_light_color[2] / 100, " ", target_light_color[3] / 100, "\n") + cfg_file:write(" }\n") + cfg_file:write(" }\n") + cfg_file:write("}\n") + cfg_file:write("material target_dark\n") + cfg_file:write("{\n") + cfg_file:write(" technique\n") + cfg_file:write(" {\n") + cfg_file:write(" pass\n") + cfg_file:write(" {\n") + cfg_file:write(" ambient 0 0 0 0\n") + cfg_file:write(" diffuse 0 0 0 0\n") + cfg_file:write(" specular 0 0 0 0\n") + cfg_file:write(" emissive ", target_dark_color[1] / 100, " ", target_dark_color[2] / 100, " ", target_dark_color[3] / 100, "\n") + cfg_file:write(" }\n") + cfg_file:write(" }\n") + cfg_file:write("}\n") + cfg_file:close() + + -- prepare the datafolder + + foldername = box:get_config("${Player_ScenarioDirectory}/signals/userdata-[$core{date}-$core{time}]") + os.execute(string.format("mkdir \"%s\"", foldername)) + + box:log("Info", box:get_config("Writing additional configuration to '${Player_ScenarioDirectory}/appconf/application-configuration.conf'")) + + -- this file was generated by configuration-peripheral-settings.lua, here we just add to it + cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/appconf/application-configuration.conf"), "a")) + + for i=1,frequency_count do + cfg_file:write("SSVEP_Frequency_", i, " = ", string.format("%g", stimulation_frequencies[i]), "\n") + end + + cfg_file:write(string.format("SSVEP_TargetLightColourRed = %f\n", target_light_color[1] / 100)) + cfg_file:write(string.format("SSVEP_TargetLightColourGreen = %f\n", target_light_color[2] / 100)) + cfg_file:write(string.format("SSVEP_TargetLightColourBlue = %f\n", target_light_color[3] / 100)) + cfg_file:write(string.format("SSVEP_TargetDarkColourRed = %f\n", target_dark_color[1] / 100)) + cfg_file:write(string.format("SSVEP_TargetDarkColourGreen = %f\n", target_dark_color[2] / 100)) + cfg_file:write(string.format("SSVEP_TargetDarkColourBlue = %f\n", target_dark_color[3] / 100)) + + cfg_file:write("SSVEP_UserDataFolder = ", foldername, "\n") + cfg_file:write("SSVEP_FocusPoint = ", s_focus_point, "\n") + + + cfg_file:close() + + -- create configuration files for temporal filters + + for i=1,frequency_count do + box:log("Info", string.format(box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/temporal-filter-freq-%db.cfg'"), i)) + + cfg_file = assert(io.open(string.format(box:get_config("${Player_ScenarioDirectory}/configuration/temporal-filter-freq-%db.cfg"), i), "w")) + + cfg_file:write("\n") + cfg_file:write("Butterworth\n") + cfg_file:write("Band pass\n") + cfg_file:write("4\n") + cfg_file:write(string.format("%g\n", stimulation_frequencies[i] - processing_frequency_tolerance)) + cfg_file:write(string.format("%g\n", stimulation_frequencies[i] + processing_frequency_tolerance)) + cfg_file:write("0.500000\n") + cfg_file:write("\n") + + cfg_file:close() + + box:log("Info", string.format(box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/temporal-filter-freq-%dh1.cfg'"), i)) + + cfg_file = assert(io.open(string.format(box:get_config("${Player_ScenarioDirectory}/configuration/temporal-filter-freq-%dh1.cfg"), i), "w")) + + cfg_file:write("\n") + cfg_file:write("Butterworth\n") + cfg_file:write("Band pass\n") + cfg_file:write("4\n") + cfg_file:write(string.format("%g\n", stimulation_frequencies[i] * 2 - processing_frequency_tolerance)) + cfg_file:write(string.format("%g\n", stimulation_frequencies[i] * 2 + processing_frequency_tolerance)) + cfg_file:write("0.500000\n") + cfg_file:write("\n") + + cfg_file:close() + + + end + + -- create configuration file for CSP Trainer + cfg_filename = box:get_config("${Player_ScenarioDirectory}/configuration/regularized-csp-trainer.cfg") + + box:log("Info", "Writing file '" .. cfg_filename .. "'") + + cfg_file = assert(io.open(cfg_filename, "w")) + cfg_file:write("\n") + cfg_file:write(" OVTK_StimulationId_ExperimentStop\n") + cfg_file:write(" ${Player_ScenarioDirectory}/classifiers/csp-filters.cfg\n") + cfg_file:write(string.format(" %d\n", csp_filter_order)) + cfg_file:write(" false\n") + cfg_file:write(" Chunk average\n") + cfg_file:write(" true\n") + cfg_file:write(" 0.0\n") + cfg_file:write(" 0.0\n") + cfg_file:write("\n") + cfg_file:close() + + -- create configuration file for time based epoching + box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg'")) + + cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/configuration/time-based-epoching.cfg"), "w")) + cfg_file:write("\n") + cfg_file:write(string.format("%g\n", processing_epoch_duration)) + cfg_file:write(string.format("%g\n", processing_epoch_interval)) + cfg_file:write("\n") + cfg_file:close() + + -- create the file writer configuration + box:log("Info", box:get_config("Writing file '${Player_ScenarioDirectory}/configuration/file-writer.cfg'")) + + cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/configuration/file-writer.cfg"), "w")) + cfg_file:write("\n") + cfg_file:write(string.format("%s/eeg-data-[$core{date}-$core{time}].ov\n", foldername)) + cfg_file:write("false\n") + cfg_file:write("\n") + cfg_file:close() + + -- notify the scenario that the configuration process is complete + box:send_stimulation(1, OVTK_StimulationId_TrainCompleted, box:get_current_time() + 0.2, 0) + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/configuration-peripheral-settings.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/configuration-peripheral-settings.lua new file mode 100644 index 0000000..48a4f8a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/configuration-peripheral-settings.lua @@ -0,0 +1,53 @@ +vrpn_host = nil +vrpn_port = nil +screen_refresh_rate = nil +window_width = nil +window_height = nil +fullscreen = nil + +function initialize(box) + screen_refresh_rate = box:get_setting(2) + window_width = box:get_setting(3) + window_height = box:get_setting(4) + fullscreen = box:get_setting(5) +end + +function uninitialize(box) +end + +function process(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + box:log("Info", box:get_config("Generating '${Player_ScenarioDirectory}/appconf/application-configuration.conf'")) + + cfg_file = assert(io.open(box:get_config("${Player_ScenarioDirectory}/appconf/application-configuration.conf"), "w")) + + cfg_file:write("# This file was automatically generated!\n\n") + cfg_file:write("# If you want to change the SSVEP configuration\n") + cfg_file:write("# please use the provided ssvep-configuration scenario.\n") + + cfg_file:write("SSVEP_ScreenRefreshRate = ", screen_refresh_rate, "\n") + cfg_file:write("SSVEP_VRPNServerPort = 1337\n") + cfg_file:write("SSVEP_VRPNHost = localhost\n") + +-- cfg_file:close() + +-- box:log("Info", box:get_config("Generating '${Player_ScenarioDirectory}/appconf/ogre-configuration.conf'")) + +-- cfg_file = io.open(box:get_config("${Player_ScenarioDirectory}/appconf/ogre-configuration.conf"), "w") + +-- cfg_file:write("# This file was automatically generated!\n\n") +-- cfg_file:write("# If you want to change the SSVEP configuration\n") +-- cfg_file:write("# please use the provided ssvep-configuration scenario.\n") + + cfg_file:write("SSVEP_Ogre_LogToConsole = False\n") + + cfg_file:write("SSVEP_Ogre_ScreenWidth = ", window_width, "\n") + cfg_file:write("SSVEP_Ogre_ScreenHeight = ", window_height, "\n") + cfg_file:write("SSVEP_Ogre_FullScreen = ", fullscreen, "\n") + + cfg_file:close() + + + box:send_stimulation(1, OVTK_StimulationId_TrainCompleted, box:get_current_time() + 0.2, 0) +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/performance-test-confusion-matrix.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/performance-test-confusion-matrix.lua new file mode 100644 index 0000000..311b5a3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/performance-test-confusion-matrix.lua @@ -0,0 +1,109 @@ +classes = nil + +current_target = nil +start_time = 0; +stop_time = -1; + +do_debug = false; + +score = {} + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + classes = box:get_setting(2) + + for j = 1, classes do + score[j] = {} + for i = 1, classes do + score[j][i] = 0 + end + end +end + +function uninitialize(box) + + correct = 0 + incorrect = 0 + + for j = 1, classes do + + output = string.format("Target %d : ", j - 1) + inClass = 0 + + for i = 1, classes do + inClass = inClass + score[j][i] + end + + for i = 1, classes do + output = output .. string.format("%d : %5.1f%%, ", i - 1, 100*score[j][i]/inClass) + + if i == j then + correct = correct + score[j][i] + else + incorrect = incorrect + score[j][i] + end + end + + box:log("Info", string.format("%s total %d", output, inClass)) + end + + box:log("Info", string.format("Correct %4d -> %5.1f%%", correct, 100*correct/(correct+incorrect))) + box:log("Info", string.format("Incorrect %4d -> %5.1f%%", incorrect, 100*incorrect/(correct+incorrect))) + +end + +function process(box) + + finished = false + + while not finished do + + -- time = box:get_current_time() + + while box:get_stimulation_count(1) > 0 do + + s_code, s_date, s_duration = box:get_stimulation(1, 1) + box:remove_stimulation(1, 1) + + if s_code >= OVTK_StimulationId_Label_00 and s_code <= OVTK_StimulationId_Label_1F then + if do_debug then box:log("Info", string.format("Received target %d at ", s_code) .. s_date) end + current_target = s_code - OVTK_StimulationId_Label_00 + + elseif s_code == OVTK_StimulationId_VisualStimulationStart then + if do_debug then box:log("Info", "Trial started at " .. s_date) end + start_time = s_date + -- We don't know the stop time yet, so for now accept anything in range [start_time, infty] + stop_time = -1 + + elseif s_code == OVTK_StimulationId_VisualStimulationStop then + if do_debug then box:log("Info", "Trial ended at " .. s_date) end + stop_time = s_date + + elseif s_code == OVTK_StimulationId_ExperimentStop then + finished = true + end + end + + while box:get_stimulation_count(2) > 0 do + + s_code, s_date, s_duration = box:get_stimulation(2, 1) + box:remove_stimulation(2, 1) + + if do_debug then box:log("Info", string.format("Received prediction %d at ", s_code) .. s_date) end + + if s_date >= start_time and (stop_time < 0 or s_date < stop_time) and (s_code >= OVTK_StimulationId_Label_00 and s_code <= OVTK_StimulationId_Label_1F) then + + if do_debug then box:log("Info", string.format("Accepted prediction %d at ", s_code) .. s_date) end + + real_target = current_target + 1 + prediction = s_code - OVTK_StimulationId_Label_00 + 1 + score[real_target][prediction] = score[real_target][prediction] + 1 + + end + end + + box:sleep() + + end + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/shooter-button-simplifier.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/shooter-button-simplifier.lua new file mode 100644 index 0000000..9c01420 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/shooter-button-simplifier.lua @@ -0,0 +1,35 @@ +buffer = {} + +function initialize(box) +end + +function uninitialize(box) +end + +-- This script receives stimulations and lets pass only every other one +-- for each stimulation code +-- Useful to remove "key up" events of keyboard stimulator +function process(box) + + while (box:keep_processing()) do + + for index = 1, box:get_stimulation_count(1) do + + stimulation = box:get_stimulation(1, index) + + if buffer[stimulation] == nil then + box:send_stimulation(1, stimulation, box:get_current_time(), 0) + buffer[stimulation] = 1 + else + buffer[stimulation] = nil + end + + box:remove_stimulation(1, 1) + end + + box:sleep() + end + + + +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/shooter-controller.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/shooter-controller.lua new file mode 100644 index 0000000..782a97e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/shooter-controller.lua @@ -0,0 +1,70 @@ +sequence = {} +flickeringDelay = nil + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + s_sequence_types = box:get_setting(2) + s_sequence_positions = box:get_setting(3) + s_target_lockdown = box:get_setting(4) + s_pilot_assist = box:get_setting(5) + s_feedback = box:get_setting(6) + s_onebyone = box:get_setting(7) + s_analog_control = box:get_setting(8) + s_log_level = box:get_setting(9) + + box:log("Info", string.format("Target Types Sequence : [%s]\n", s_sequence_types)) + + for target in s_sequence_positions:gmatch("%d+") do + table.insert(sequence, target) + end + + -- create the configuration file for the shooter application + cfg_file = io.open(box:get_config("${Player_ScenarioDirectory}/appconf/shooter-configuration.conf"), "w") + + cfg_file:write("SSVEP_EnemyOrder = ", s_sequence_types, "\n") + cfg_file:write("SSVEP_TargetLockdown = ", s_target_lockdown, "\n") + cfg_file:write("SSVEP_PilotAssist = ", s_pilot_assist, "\n") + cfg_file:write("SSVEP_Feedback = ", s_feedback, "\n") + cfg_file:write("SSVEP_OneByOne = ", s_onebyone, "\n") + cfg_file:write("SSVEP_AnalogControl = ", s_analog_control, "\n") + cfg_file:write("SSVEP_LogLevel = ", s_log_level, "\n") + + cfg_file:close() +end + +function uninitialize(box) +end + +function process(box) + + -- while targets are available, send a stimulation with new target + -- position for each request + + while box:keep_processing() do + if box:get_stimulation_count(1) > 0 then + + identifier, date, duration = box:get_stimulation(1, 1) + + if identifier == OVTK_StimulationId_Target then + current_time = box:get_current_time() + 1 + + -- if no targets are available, quit the game + if # sequence == 0 then + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, current_time, 0) + break + end + + next_target = sequence[1] + table.remove(sequence, 1) + + box:send_stimulation(1, OVTK_StimulationId_Label_00 + next_target , current_time, 0) + end + + box:remove_stimulation(1, 1) + end + + box:sleep() + end + +end + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/start-stimulator.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/start-stimulator.lua new file mode 100644 index 0000000..099017d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/start-stimulator.lua @@ -0,0 +1,21 @@ +delay = 1 + +function initialize(box) + s_delay = box:get_setting(2); + + io.write(string.format("Delay : [%s]\n", s_delay)) + + if (s_delay:find("^%d+$") ~= nil) then + delay = tonumber(s_delay) + else + io.write("[ERROR] The parameter should be a numeric value\n") + end + +end + +function uninitialize(box) +end + +function process(box) + box:send_stimulation(1, 0x00008001, delay, 0) +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/training-acquisition-controller.lua b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/training-acquisition-controller.lua new file mode 100644 index 0000000..67ae984 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/scripts/training-acquisition-controller.lua @@ -0,0 +1,80 @@ +sequence = {} +number_of_cycles = 0 + +stimulation_duration = 7 +break_duration = 2 +flickering_delay = 3.5 +epoching_delay = 1 + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + -- load the goal sequence + s_sequence = box:get_setting(2) + + for target in s_sequence:gmatch("%d+") do + table.insert(sequence, target) + number_of_cycles = number_of_cycles + 1 + end + + stimulation_duration = box:get_setting(3) + break_duration = box:get_setting(4) + flickering_delay = box:get_setting(5) + epoching_delay = box:get_setting(6) + + box:log("Info", string.format("Number of goals in sequence: [%d]", number_of_cycles)) + + if stimulation_duration-epoching_delay <= 0 then + box:log("Error", "Stimulation duration - epoching delay is not greater than 0.") + end + + -- These specify how long and with what offset data will be collected after the flicker start + -- for csp/classifier training. A positive epoching delay is to avoid the ERP effect due to stimulus onset + cfg_file = io.open(box:get_config("${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg"), "w") + + cfg_file:write("\n") + cfg_file:write(" ", stimulation_duration-epoching_delay, "\n") + cfg_file:write(" ", epoching_delay, "\n") + cfg_file:write(" OVTK_StimulationId_VisualStimulationStart\n") + cfg_file:write("\n") + + cfg_file:close() +end + +function uninitialize(box) +end + +function process(box) + + while box:keep_processing() and box:get_stimulation_count(1) == 0 do + box:sleep() + end + + current_time = box:get_current_time() + 1 + + box:send_stimulation(1, OVTK_StimulationId_ExperimentStart, current_time, 0) + + current_time = current_time + 2 + + for i,target in ipairs(sequence) do + box:log("Info", string.format("Goal no %d is %d at %d", i, target, current_time)) + -- mark goal + box:send_stimulation(2, OVTK_StimulationId_LabelStart + target, current_time, 0) + -- wait for Flickering_delay seconds + current_time = current_time + flickering_delay + -- start flickering + box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStart, current_time, 0) + -- wait for Stimulation_duration seconds + current_time = current_time + stimulation_duration + -- unmark goal and stop flickering + box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStop, current_time, 0) + -- wait for Break_duration seconds + current_time = current_time + break_duration + end + + current_time = current_time + 2 + + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, current_time, 0) + + box:sleep() +end diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/signals/README.txt b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/signals/README.txt new file mode 100644 index 0000000..77cca96 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/bci-examples/ssvep-mind-shooter/signals/README.txt @@ -0,0 +1 @@ +This folder contains signals recorded by the SSVEP scenarios. diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/SSVEP.material b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/SSVEP.material new file mode 100755 index 0000000..26931bf --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/SSVEP.material @@ -0,0 +1,8 @@ +material BasicSurface/Diffuse +{ + technique + { + pass { lighting off } + } +} + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/generic/generic-materials.material b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/generic/generic-materials.material new file mode 100644 index 0000000..3b09c96 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/generic/generic-materials.material @@ -0,0 +1,1152 @@ + + + material GenericSurface/stripes-blue + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-blue.png + + } + } + } + } + + + + material GenericSurface/stripes-blue-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-blue-dark.png + + } + } + } + } + + + + material GenericSurface/stripes-blue-90 + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-blue.png + rotate 90 + } + } + } + } + + + + material GenericSurface/stripes-blue-90-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-blue-dark.png + rotate 90 + } + } + } + } + + + + material GenericSurface/stripes-blue-180 + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-blue.png + rotate 180 + } + } + } + } + + + + material GenericSurface/stripes-blue-180-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-blue-dark.png + rotate 180 + } + } + } + } + + + + material GenericSurface/filled-red + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-red.png + + } + } + } + } + + + + material GenericSurface/filled-red-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-red-dark.png + + } + } + } + } + + + + material GenericSurface/filled-red-90 + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-red.png + rotate 90 + } + } + } + } + + + + material GenericSurface/filled-red-90-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-red-dark.png + rotate 90 + } + } + } + } + + + + material GenericSurface/filled-red-180 + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-red.png + rotate 180 + } + } + } + } + + + + material GenericSurface/filled-red-180-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-red-dark.png + rotate 180 + } + } + } + } + + + + material GenericSurface/filled-blue + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-blue.png + + } + } + } + } + + + + material GenericSurface/filled-blue-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-blue-dark.png + + } + } + } + } + + + + material GenericSurface/filled-blue-90 + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-blue.png + rotate 90 + } + } + } + } + + + + material GenericSurface/filled-blue-90-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-blue-dark.png + rotate 90 + } + } + } + } + + + + material GenericSurface/filled-blue-180 + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-blue.png + rotate 180 + } + } + } + } + + + + material GenericSurface/filled-blue-180-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-blue-dark.png + rotate 180 + } + } + } + } + + + + material GenericSurface/filled-green + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-green.png + + } + } + } + } + + + + material GenericSurface/filled-green-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-green-dark.png + + } + } + } + } + + + + material GenericSurface/filled-green-90 + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-green.png + rotate 90 + } + } + } + } + + + + material GenericSurface/filled-green-90-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-green-dark.png + rotate 90 + } + } + } + } + + + + material GenericSurface/filled-green-180 + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-green.png + rotate 180 + } + } + } + } + + + + material GenericSurface/filled-green-180-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-green-dark.png + rotate 180 + } + } + } + } + + + + material GenericSurface/stripes-green + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-green.png + + } + } + } + } + + + + material GenericSurface/stripes-green-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-green-dark.png + + } + } + } + } + + + + material GenericSurface/stripes-green-90 + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-green.png + rotate 90 + } + } + } + } + + + + material GenericSurface/stripes-green-90-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-green-dark.png + rotate 90 + } + } + } + } + + + + material GenericSurface/stripes-green-180 + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-green.png + rotate 180 + } + } + } + } + + + + material GenericSurface/stripes-green-180-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-green-dark.png + rotate 180 + } + } + } + } + + + + material GenericSurface/stripes-red + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-red.png + + } + } + } + } + + + + material GenericSurface/stripes-red-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-red-dark.png + + } + } + } + } + + + + material GenericSurface/stripes-red-90 + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-red.png + rotate 90 + } + } + } + } + + + + material GenericSurface/stripes-red-90-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-red-dark.png + rotate 90 + } + } + } + } + + + + material GenericSurface/stripes-red-180 + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-red.png + rotate 180 + } + } + } + } + + + + material GenericSurface/stripes-red-180-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture stripes-red-dark.png + rotate 180 + } + } + } + } + + + + material GenericSurface/checkers-red + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture checkers-red.png + + } + } + } + } + + + + material GenericSurface/checkers-red-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture checkers-red-dark.png + + } + } + } + } + + + + material GenericSurface/checkers-red-90 + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture checkers-red.png + rotate 90 + } + } + } + } + + + + material GenericSurface/checkers-red-90-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture checkers-red-dark.png + rotate 90 + } + } + } + } + + + + material GenericSurface/checkers-red-180 + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture checkers-red.png + rotate 180 + } + } + } + } + + + + material GenericSurface/checkers-red-180-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture checkers-red-dark.png + rotate 180 + } + } + } + } + + + + material GenericSurface/filled-white + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-white.png + + } + } + } + } + + + + material GenericSurface/filled-white-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-white-dark.png + + } + } + } + } + + + + material GenericSurface/filled-white-90 + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-white.png + rotate 90 + } + } + } + } + + + + material GenericSurface/filled-white-90-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-white-dark.png + rotate 90 + } + } + } + } + + + + material GenericSurface/filled-white-180 + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-white.png + rotate 180 + } + } + } + } + + + + material GenericSurface/filled-white-180-dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture filled-white-dark.png + rotate 180 + } + } + } + } + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/generic/material-generator.pl b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/generic/material-generator.pl new file mode 100644 index 0000000..f79de7e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/generic/material-generator.pl @@ -0,0 +1,58 @@ +#!/usr/bin/perl + +$name = $ARGV[0]; + +sub writeMaterial($$$) +{ + my ($material, $dark, $angle) = @_; + + $dark = $dark ? "-dark" : ''; + my $suffix = $angle ? "-$angle" : ''; + + $effect = ""; + $effect = "rotate $angle" if $angle; + + return qq[ + + material GenericSurface/$material$suffix$dark + { + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture $material$dark.png + $effect + } + } + } + } + +]; +} + +opendir DIR, "textures"; +@files = readdir DIR; +closedir DIR; + +@files = grep (/(? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook-0.8.looknfeel b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook-0.8.looknfeel new file mode 100644 index 0000000..60f53ee --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook-0.8.looknfeel @@ -0,0 +1,4154 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+
+ +
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook-ov-0.8.scheme b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook-ov-0.8.scheme new file mode 100644 index 0000000..bcd1767 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook-ov-0.8.scheme @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook-ov.scheme b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook-ov.scheme new file mode 100755 index 0000000..eadc4c7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook-ov.scheme @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook.imageset b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook.imageset new file mode 100755 index 0000000..2e3ec16 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook.imageset @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook.looknfeel b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook.looknfeel new file mode 100755 index 0000000..2ad3e4e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook.looknfeel @@ -0,0 +1,4812 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+
+ +
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook.tga b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook.tga new file mode 100755 index 0000000..dbcd3b4 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook.tga differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook.xcf b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook.xcf new file mode 100755 index 0000000..684f1dd Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/TaharezLook.xcf differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehigh.ttf b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehigh.ttf new file mode 100755 index 0000000..14d45c5 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehigh.ttf differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-10-0.8.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-10-0.8.font new file mode 100644 index 0000000..2575772 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-10-0.8.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-10.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-10.font new file mode 100755 index 0000000..e7baa4e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-10.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-12-0.8.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-12-0.8.font new file mode 100644 index 0000000..f7f59cf --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-12-0.8.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-12.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-12.font new file mode 100755 index 0000000..e6aac73 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-12.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-24-0.8.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-24-0.8.font new file mode 100644 index 0000000..4255b08 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-24-0.8.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-24.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-24.font new file mode 100755 index 0000000..c3e179b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-24.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-8-0.8.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-8-0.8.font new file mode 100644 index 0000000..f51f225 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-8-0.8.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-8.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-8.font new file mode 100755 index 0000000..ba3ac2e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-8.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-impact-0.8.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-impact-0.8.font new file mode 100644 index 0000000..82b005b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-impact-0.8.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-impact.font b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-impact.font new file mode 100755 index 0000000..52ece26 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/gui/bluehighway-impact.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5.material b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5.material new file mode 100644 index 0000000..d251dec --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5.material @@ -0,0 +1,62 @@ + +material v5_texture_vaisseau +{ + technique + { + pass + { + ambient 0 0 0 1 + + texture_unit + { + texture v5_image_vaisseau05.png + } + } + + } + +} + +material v5_viseur1 +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 1 0 0 1 + } + + } + +} + + +material feedback_inactive +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 0.3 0 0 1 + } + + } + +} + +material feedback_active +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 1 0 0 1 + } + + } + +} + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5.scene b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5.scene new file mode 100644 index 0000000..141a646 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5.scene @@ -0,0 +1,279 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a1a.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a1a.mesh new file mode 100644 index 0000000..61812e0 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a1a.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a1b.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a1b.mesh new file mode 100644 index 0000000..61812e0 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a1b.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a2a.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a2a.mesh new file mode 100644 index 0000000..90ac1e3 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a2a.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a2b.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a2b.mesh new file mode 100644 index 0000000..90ac1e3 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a2b.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a3a.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a3a.mesh new file mode 100644 index 0000000..61de066 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a3a.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a3b.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a3b.mesh new file mode 100644 index 0000000..61de066 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_a3b.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_aile_droite1.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_aile_droite1.mesh new file mode 100644 index 0000000..f3b57a3 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_aile_droite1.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_aile_droite2.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_aile_droite2.mesh new file mode 100644 index 0000000..a32643a Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_aile_droite2.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_aile_gauche1.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_aile_gauche1.mesh new file mode 100644 index 0000000..cef0452 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_aile_gauche1.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_aile_gauche2.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_aile_gauche2.mesh new file mode 100644 index 0000000..fa9edfa Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_aile_gauche2.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d1a.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d1a.mesh new file mode 100644 index 0000000..45855c3 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d1a.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d1b.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d1b.mesh new file mode 100644 index 0000000..45855c3 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d1b.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d2a.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d2a.mesh new file mode 100644 index 0000000..164361a Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d2a.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d2b.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d2b.mesh new file mode 100644 index 0000000..164361a Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d2b.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d3a.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d3a.mesh new file mode 100644 index 0000000..a28d345 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d3a.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d3b.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d3b.mesh new file mode 100644 index 0000000..a28d345 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_d3b.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_ecran_avant1.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_ecran_avant1.mesh new file mode 100644 index 0000000..a6cfd61 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_ecran_avant1.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_ecran_avant2.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_ecran_avant2.mesh new file mode 100644 index 0000000..8008adb Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_ecran_avant2.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g1a.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g1a.mesh new file mode 100644 index 0000000..fea3aab Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g1a.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g1b.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g1b.mesh new file mode 100644 index 0000000..fea3aab Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g1b.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g2a.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g2a.mesh new file mode 100644 index 0000000..fd8064c Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g2a.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g2b.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g2b.mesh new file mode 100644 index 0000000..fd8064c Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g2b.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g3a.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g3a.mesh new file mode 100644 index 0000000..37a7ae5 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g3a.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g3b.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g3b.mesh new file mode 100644 index 0000000..37a7ae5 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_g3b.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_image_vaisseau05.png b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_image_vaisseau05.png new file mode 100644 index 0000000..0a3012d Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_image_vaisseau05.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_vaisseau.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_vaisseau.mesh new file mode 100644 index 0000000..972063c Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_vaisseau.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_viseur.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_viseur.mesh new file mode 100644 index 0000000..530e135 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship-destroyed/v5_viseur.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship.png b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship.png new file mode 100644 index 0000000..9690e02 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4.material b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4.material new file mode 100644 index 0000000..a2d0aba --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4.material @@ -0,0 +1,33 @@ + +material v4_texture_vaisseau +{ + technique + { + pass + { + ambient 0 0 0 1 + + texture_unit + { + texture v4_image_vaisseau.png + } + } + + } +} + +material v4_viseur1 +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 1 0 0 1 + } + + } + +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4.scene b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4.scene new file mode 100644 index 0000000..40ef2d6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4.scene @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_aile_droite1.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_aile_droite1.mesh new file mode 100644 index 0000000..3b22497 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_aile_droite1.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_aile_droite2.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_aile_droite2.mesh new file mode 100644 index 0000000..4deb0ac Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_aile_droite2.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_aile_gauche1.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_aile_gauche1.mesh new file mode 100644 index 0000000..50ae3ec Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_aile_gauche1.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_aile_gauche2.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_aile_gauche2.mesh new file mode 100644 index 0000000..dd9be67 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_aile_gauche2.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_ecran_avant1.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_ecran_avant1.mesh new file mode 100644 index 0000000..5d1b160 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_ecran_avant1.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_ecran_avant2.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_ecran_avant2.mesh new file mode 100644 index 0000000..f140606 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_ecran_avant2.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_image_vaisseau.png b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_image_vaisseau.png new file mode 100644 index 0000000..462675d Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_image_vaisseau.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_vaisseau.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_vaisseau.mesh new file mode 100644 index 0000000..f596c2f Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_vaisseau.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_viseur.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_viseur.mesh new file mode 100644 index 0000000..dc415cf Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/battleship/v4_viseur.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy1/v1.material b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy1/v1.material new file mode 100644 index 0000000..fda07f3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy1/v1.material @@ -0,0 +1,48 @@ + +material v1_noir +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 0.3 0.3 0.3 1 + } + + } + +} + + + +material v1_rouge +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 0.792 0.3 0.3 1 + } + + } + +} + + + +material v1_pare_brise +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 0.520884 0.641628 0.702 1 + } + + } + +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy1/v1.scene b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy1/v1.scene new file mode 100644 index 0000000..63044af --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy1/v1.scene @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy1/v1_vaisseau.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy1/v1_vaisseau.mesh new file mode 100644 index 0000000..df720d3 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy1/v1_vaisseau.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy2/v2.material b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy2/v2.material new file mode 100644 index 0000000..9ae5ce8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy2/v2.material @@ -0,0 +1,64 @@ + +material v2_gris_fonce +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 0.251804 0.251804 0.251804 1 + } + + } + +} + + + +material lambert1 +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 0.5 0.5 0.5 1 + } + + } + +} + + + +material v2_gris_clair +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 0.748196 0.748196 0.748196 1 + } + + } + +} + + + +material v2_pare_brise +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 0.602526 0.728651 0.733 1 + } + + } + +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy2/v2.scene b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy2/v2.scene new file mode 100644 index 0000000..67e4a0a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy2/v2.scene @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy2/v2_habitacle.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy2/v2_habitacle.mesh new file mode 100644 index 0000000..2175fc4 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy2/v2_habitacle.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy2/v2_soutes.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy2/v2_soutes.mesh new file mode 100644 index 0000000..6f3a76d Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy2/v2_soutes.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy3/v3.material b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy3/v3.material new file mode 100644 index 0000000..b28e0ce --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy3/v3.material @@ -0,0 +1,33 @@ + +material v3_jaune +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 0.955 0.851701 0.39155 1 + } + + } + +} + + + +material v3_pare_brise +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 0.677133 0.783711 0.837 1 + specular 0.5 0.5 0.5 1 25.6 + } + + } + +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy3/v3.scene b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy3/v3.scene new file mode 100644 index 0000000..27d3bf7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy3/v3.scene @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy3/v3_vaisseau.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy3/v3_vaisseau.mesh new file mode 100644 index 0000000..b95610e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemy3/v3_vaisseau.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemyship.png b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemyship.png new file mode 100644 index 0000000..48aed92 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/enemyship.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/flare.png b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/flare.png new file mode 100644 index 0000000..02a6ed3 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/flare.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/flare_alpha.dds b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/flare_alpha.dds new file mode 100644 index 0000000..ad6dac6 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/flare_alpha.dds differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/flickering.material b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/flickering.material new file mode 100644 index 0000000..757de80 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/flickering.material @@ -0,0 +1,26 @@ +material target_bright +{ + technique + { + pass + { + ambient 0 0 0 0 + diffuse 0 0 0 0 + specular 0 0 0 0 + emissive 1 0 0 + } + } +} +material target_dark +{ + technique + { + pass + { + ambient 0 0 0 0 + diffuse 0 0 0 0 + specular 0 0 0 0 + emissive 0.1 0 0 + } + } +} diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/impact.material b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/impact.material new file mode 100644 index 0000000..ad53527 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/impact.material @@ -0,0 +1,123 @@ +material Space/SpaceSkyPlane +{ + technique + { + pass + { + lighting off + depth_write off + + texture_unit + { + texture spacesky.jpg + } + } + } +} + +material Space/Flare +{ + technique + { + pass + { + lighting off + scene_blend add + depth_write off + diffuse vertexcolour + + texture_unit + { + texture flare.png + } + } + } +} + +material ImpactSurface/SpaceShip +{ + technique + { + pass + { + lighting off + scene_blend alpha_blend + depth_write off + + texture_unit + { + texture battleship.png + scale 1.0 1.0 + colour_op modulate + } + } + } +} + +material ImpactSurface/EnemyShip +{ + technique + { + pass + { + lighting off + + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + depth_write off + + texture_unit + { + texture enemyship.png + scale 1.0 1.0 + colour_op modulate + } + } + } +} + +material ImpactSurface/TargetsDark +{ + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture targets-light.png + } + } + } +} + +material ImpactSurface/TargetsLight +{ + technique + { + pass + { + ambient 1 1 1 1 + diffuse 1 1 1 1 + specular 0 0 0 0 + emissive 0 0 0 + + scene_blend alpha_blend + + texture_unit + { + texture targets-light.png + } + } + } +} diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/impact.particle b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/impact.particle new file mode 100644 index 0000000..d499bc9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/impact.particle @@ -0,0 +1,109 @@ +particle_system Particle/Sun +{ + material Space/Flare + particle_width 20 + particle_height 20 + cull_each false + quota 100 + billboard_type point + + // Area emitter + emitter Ellipsoid + { + angle 30 + emission_rate 30 + time_to_live_min 2 + time_to_live_max 5 + direction 0 1 0 + velocity 0.001 + colour 0.15 0.1 0.0 + width 5 + height 5 + depth 5 + } + + // Fader + affector ColourFader + { + red -0.010 + green -0.025 + blue -0.025 + } +} + +// A sparkly purple fountain +particle_system Particle/PurpleFountain +{ + material Space/Flare + particle_width 10 + particle_height 15 + cull_each false + quota 100 + billboard_type oriented_self + + // Area emitter + emitter Point + { + angle 25 + emission_rate 100 + time_to_live 0.08 + direction 0 1 0 + velocity_min 150 + velocity_max 200 + colour_range_start 1 0 0 + colour_range_end 0 0 1 + } + + // Gravity + affector LinearForce + { + force_vector 0 -80 0 + force_application add + } + + // Fader + affector ColourFader + { + red -0.25 + green -0.25 + blue -0.25 + } +} + +particle_system Particle/Explosion +{ + material Space/Flare + particle_width 10 + particle_height 10 + cull_each false + quota 50 + billboard_type oriented_self + + // Area emitter + emitter Point + { + angle 360 + emission_rate 200 + time_to_live 0.2 + direction 0 1 0 + velocity_min 100 + velocity_max 200 + colour_range_start 1 0 0 + colour_range_end 1 1 0 + } + + // Gravity + affector LinearForce + { + force_vector 0 -100 0 + force_application add + } + + // Fader + affector ColourFader + { + red -0.25 + green -0.25 + blue -0.25 + } +} diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/ships/ship-cheap.scene b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/ships/ship-cheap.scene new file mode 100644 index 0000000..602c753 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/ships/ship-cheap.scene @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/ships/ship-costly.scene b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/ships/ship-costly.scene new file mode 100644 index 0000000..17530ca --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/ships/ship-costly.scene @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/ships/ship-friend.scene b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/ships/ship-friend.scene new file mode 100644 index 0000000..991ade8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/ships/ship-friend.scene @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/ships/ship.material b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/ships/ship.material new file mode 100644 index 0000000..dcd3f21 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/ships/ship.material @@ -0,0 +1,89 @@ +material ship_noir +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 0.3 0.3 0.3 1 + } + + } + +} + +material ship_blanc +{ + technique + { + pass + { + ambient 1 1 1 1 + diffuse 0.9 0.9 0.9 1 + } + + } + +} + + + +material ship_rouge +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 1 0.3 0.3 1 + } + + } + +} + +material ship_bleue +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 0.3 0.4 1 1 + } + + } + +} + +material ship_jaune +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 1 0.5 0.0 1 + } + + } + +} + + + +material ship_pare_brise +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 0.520884 0.641628 0.702 1 + } + + } + +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/source-images/battleship.svg b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/source-images/battleship.svg new file mode 100644 index 0000000..3c1a3a0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/source-images/battleship.svg @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/source-images/enemyship.svg b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/source-images/enemyship.svg new file mode 100644 index 0000000..b3490ec --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/source-images/enemyship.svg @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/spacesky.jpg b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/spacesky.jpg new file mode 100644 index 0000000..ee62a18 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/spacesky.jpg differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/starsky/stars.png b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/starsky/stars.png new file mode 100644 index 0000000..40344c3 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/starsky/stars.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/starsky/v6.material b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/starsky/v6.material new file mode 100644 index 0000000..78a6f99 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/starsky/v6.material @@ -0,0 +1,24 @@ + +material lambert2 +{ + technique + { + pass + { + ambient 0 0 0 1 + diffuse 0 0 0 1 + specular 0 0 0 1 + emissive 1 1 1 + + + texture_unit + { + texture stars.png + } + } + + } + +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/starsky/v6.scene b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/starsky/v6.scene new file mode 100644 index 0000000..f61146a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/starsky/v6.scene @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/starsky/v6_sky.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/starsky/v6_sky.mesh new file mode 100644 index 0000000..e06c46e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/starsky/v6_sky.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/targets-light.png b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/targets-light.png new file mode 100644 index 0000000..2b3cd55 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/impact/targets-light.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/trainer/InstructionText-Start.png b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/trainer/InstructionText-Start.png new file mode 100755 index 0000000..f735104 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/share/resources/trainer/InstructionText-Start.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/GenericStimulator/ovamsCGenericStimulatorApplication.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/GenericStimulator/ovamsCGenericStimulatorApplication.cpp new file mode 100755 index 0000000..41cb431 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/GenericStimulator/ovamsCGenericStimulatorApplication.cpp @@ -0,0 +1,134 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsCGenericStimulatorApplication.h" + +#include "../log/ovkCLogListenerFileBuffered.h" + +#include "../ovamsCCommandStartStop.h" +#include "../ovamsCCommandStimulatorControl.h" +#include "../ovamsCCommandReceiveTarget.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { + +#if !((CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8)) +namespace CEGUI +{ + typedef CEGUI::UVector2 USize; +}; +#endif + +bool CGenericStimulatorApplication::setup(Kernel::IKernelContext* poKernelContext) +{ + CApplication::setup(poKernelContext); + + (*m_logManager) << Kernel::LogLevel_Debug << " * CGenericStimulatorApplication::setup()\n"; + Kernel::IConfigurationManager* configManager = &(m_kernelCtx->getConfigurationManager()); + configManager->addConfigurationFromFile(m_ScenarioDir + "/appconf/generic-configuration.conf"); + std::cout << m_ScenarioDir << "/appconf/generic-configuration.conf" << "\n"; + + + poKernelContext->getLogManager().activate(Kernel::LogLevel_First, Kernel::LogLevel_Last, true); + + Kernel::ILogListener* logListenerFileBuffered = new Kernel::CLogListenerFileBuffered(*poKernelContext, "ssvep-stimulator", + configManager->expand( + "${SSVEP_UserDataFolder}/log-[$core{date}-$core{time}].log")); + poKernelContext->getLogManager().addListener(logListenerFileBuffered); + + + CGenericStimulatorFlickeringObject::initialize(this); + + // paint targets + + const size_t nTarget = size_t(configManager->expandAsUInteger("${SSVEP_TargetCount}")); + + for (size_t i = 0; i < nTarget; ++i) { this->addObject(CGenericStimulatorFlickeringObject::createGenericFlickeringObject(i)); } + + // draw the initial text + m_instructionsReady = m_guiWindowManager->createWindow("TaharezLook/StaticImage", "InstructionsReady"); + m_instructionsReady->setPosition(CEGUI::UVector2(cegui_reldim(0.0F), cegui_reldim(0.0F))); + m_instructionsReady->setSize(CEGUI::USize(CEGUI::UDim(0.0F, 640.F), CEGUI::UDim(0.0F, 32.F))); + +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) + m_sheet->addChild(m_instructionsReady); + CEGUI::ImageManager::getSingleton().addFromImageFile("InstructionsReady", "InstructionText-Start.png"); + m_instructionsReady->setProperty("Image", "InstructionsReady"); +#else + m_sheet->addChildWindow(m_instructionsReady); + CEGUI::ImagesetManager::getSingleton().createFromImageFile("InstructionsReady", "InstructionText-Start.png"); + m_instructionsReady->setProperty("Image", "set:InstructionsReady image:full_image"); +#endif + + m_instructionsReady->setProperty("FrameEnabled", "False"); + m_instructionsReady->setProperty("BackgroundEnabled", "False"); + m_instructionsReady->setVisible(true); + + + // initialize commands + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandStartStop(...)\n"; + this->addCommand(new CCommandStartStop(this)); + + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandStimulatorControl(...))\n"; + this->addCommand(new CCommandStimulatorControl(this)); + + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CC(...))\n"; + this->addCommand(new CCommandReceiveTarget(this)); + + (*m_logManager) << Kernel::LogLevel_Debug << " * CTrainerApplication::setup() completed successfully\n"; + + return true; +} + + +void CGenericStimulatorApplication::processFrame(const size_t frame) +{ + CApplication::processFrame(frame); + if (!m_active) { return; } + for (size_t i = 0; i < m_oObjects.size(); ++i) { m_oObjects[i]->processFrame(); } +} + +void CGenericStimulatorApplication::addObject(CGenericStimulatorFlickeringObject* obj) +{ + m_oObjects.push_back(obj); + obj->setVisible(true); +} + +void CGenericStimulatorApplication::setTarget(const int target) +{ + const size_t currentTime = int(time(nullptr) - m_ttStartTime); + (*m_logManager) << Kernel::LogLevel_Info << currentTime << " > Target set to " << target << "\n"; + + for (int i = 0; i < int(m_oObjects.size()); ++i) { m_oObjects[i]->setTarget(target == i); } +} + +void CGenericStimulatorApplication::startExperiment() +{ + CApplication::startExperiment(); + + m_ttStartTime = time(nullptr); + + this->stopFlickering(); + m_instructionsReady->setVisible(false); +} + +void CGenericStimulatorApplication::startFlickering() +{ + const size_t currentTime = size_t(time(nullptr) - m_ttStartTime); + (*m_logManager) << Kernel::LogLevel_Info << currentTime << " > Starting Visual Stimulation\n"; + m_active = true; +} + +void CGenericStimulatorApplication::stopFlickering() +{ + const size_t currentTime = size_t(time(nullptr) - m_ttStartTime); + (*m_logManager) << Kernel::LogLevel_Info << currentTime << " > Stopping Visual Stimulation\n"; + m_active = false; + + for (size_t i = 0; i < m_oObjects.size(); ++i) { m_oObjects[i]->setVisible(true); } + + this->setTarget(-1); +} + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/GenericStimulator/ovamsCGenericStimulatorApplication.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/GenericStimulator/ovamsCGenericStimulatorApplication.h new file mode 100755 index 0000000..befa6ef --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/GenericStimulator/ovamsCGenericStimulatorApplication.h @@ -0,0 +1,36 @@ +#pragma once + +#include + +#include "../ovamsCApplication.h" +#include "ovamsCGenericStimulatorFlickeringObject.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CGenericStimulatorApplication final : public CApplication +{ +public: + explicit CGenericStimulatorApplication(const CString& sScenarioDir) : CApplication(sScenarioDir) {} + ~CGenericStimulatorApplication() override {} + + bool setup(Kernel::IKernelContext* poKernelContext) override; + void setTarget(int target) override; + + void startExperiment() override; + void startFlickering() override; + void stopFlickering() override; + + +private: + bool m_active = false; + void processFrame(const size_t frame) override; + void addObject(CGenericStimulatorFlickeringObject* obj); + + std::vector m_oObjects; + + time_t m_ttStartTime = 0; + + CEGUI::Window* m_instructionsReady = nullptr; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/GenericStimulator/ovamsCGenericStimulatorFlickeringObject.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/GenericStimulator/ovamsCGenericStimulatorFlickeringObject.cpp new file mode 100755 index 0000000..aa19c90 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/GenericStimulator/ovamsCGenericStimulatorFlickeringObject.cpp @@ -0,0 +1,105 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsCGenericStimulatorFlickeringObject.h" +#include "ovamsCGenericStimulatorApplication.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { + +Ogre::SceneNode* CGenericStimulatorFlickeringObject::m_parentNode = nullptr; +CBasicPainter* CGenericStimulatorFlickeringObject::m_painter = nullptr; +Ogre::ColourValue CGenericStimulatorFlickeringObject::m_lightColor = Ogre::ColourValue(1.0F, 1.0F, 1.0F); +Ogre::ColourValue CGenericStimulatorFlickeringObject::m_darkColor = Ogre::ColourValue(0.0F, 0.0F, 0.0F); +float CGenericStimulatorFlickeringObject::m_targetWidth = 0.2F; +float CGenericStimulatorFlickeringObject::m_targetHeight = 0.2F; +CGenericStimulatorApplication* CGenericStimulatorFlickeringObject::m_application = nullptr; + +void CGenericStimulatorFlickeringObject::initialize(CGenericStimulatorApplication* application) +{ + m_application = application; + Kernel::IConfigurationManager* configManager = application->getConfigurationManager(); + + m_painter = application->getPainter(); + m_parentNode = application->getSceneNode(); + + m_targetWidth = float(configManager->expandAsFloat("${SSVEP_TargetWidth}")); + m_targetHeight = float(configManager->expandAsFloat("${SSVEP_TargetHeight}")); + + m_lightColor = Ogre::ColourValue(float(configManager->expandAsFloat("${SSVEP_TargetLightColourRed}")), + float(configManager->expandAsFloat("${SSVEP_TargetLightColourGreen}")), + float(configManager->expandAsFloat("${SSVEP_TargetLightColourBlue}"))); + + m_darkColor = Ogre::ColourValue(float(configManager->expandAsFloat("${SSVEP_TargetDarkColourRed}")), + float(configManager->expandAsFloat("${SSVEP_TargetDarkColourGreen}")), + float(configManager->expandAsFloat("${SSVEP_TargetDarkColourBlue}"))); + + m_application->getLogManager() << Kernel::LogLevel_Info << "Target Size : (" << m_targetWidth << ", " << m_targetHeight << ")\n"; + //m_application->getLogManager() << Kernel::LogLevel_Info << "Target Default Colour : Light = " << Ogre::String(m_lightColor) << ", Dark = " << Ogre::String(m_darkColor) << "\n"; +} + +CGenericStimulatorFlickeringObject* CGenericStimulatorFlickeringObject::createGenericFlickeringObject(const size_t targetId) +{ + Kernel::IConfigurationManager* configManager = m_application->getConfigurationManager(); + + if (m_painter != nullptr) + { + const Ogre::ColourValue currentTargetColour = (targetId == 0) ? m_darkColor : m_lightColor; + + const CIdentifier id = configManager->createConfigurationToken("SSVEPTarget_Id", std::to_string(targetId).c_str()); + + const float targetX = float(configManager->expandAsFloat("${SSVEP_Target_X_${SSVEPTarget_Id}}")); + const float targetY = float(configManager->expandAsFloat("${SSVEP_Target_Y_${SSVEPTarget_Id}}")); + const CString material = CString(configManager->expand("${SSVEP_Target_Material_${SSVEPTarget_Id}}")); + const size_t stimulationPattern = size_t((*(m_application->getFrequencies()))[targetId]); + + m_application->getLogManager() << Kernel::LogLevel_Info << "Target (" << targetId << ") : Position = (" + << targetX << ", " << targetY << "), Texture = " << material << "\n"; + + configManager->releaseConfigurationToken(id); + + return new CGenericStimulatorFlickeringObject(targetX, targetY, currentTargetColour, material, stimulationPattern); + } + m_application->getLogManager() << Kernel::LogLevel_Fatal << "TrainerTarget object was not properly initialized\n"; + return nullptr; +} + +CGenericStimulatorFlickeringObject::CGenericStimulatorFlickeringObject(const float posX, const float posY, const Ogre::ColourValue color, + const CString& material, const size_t stimulationPattern) + : CSSVEPFlickeringObject(nullptr, stimulationPattern) +{ + Ogre::MovableObject* litObject; + Ogre::MovableObject* darkObject; + + m_elementNode = m_parentNode->createChildSceneNode(); + m_objectNode = m_elementNode->createChildSceneNode(); + Ogre::SceneNode* pointerNode = m_elementNode->createChildSceneNode(); + + const Ogre::RealRect rectangle(posX - m_targetWidth / 2, posY + m_targetHeight / 2, posX + m_targetWidth / 2, posY - m_targetHeight / 2); + + if (strcmp(material.toASCIIString(), "default") == 0) + { + litObject = m_painter->paintRectangle(rectangle, color); + darkObject = m_painter->paintRectangle(rectangle, m_darkColor); + } + else + { + litObject = m_painter->paintTexturedRectangle(rectangle, std::string("GenericSurface/").append(material)); + darkObject = m_painter->paintTexturedRectangle(rectangle, std::string("GenericSurface/").append(material).append("-dark")); + } + + m_objectNode->attachObject(litObject); + litObject->setVisible(true); + + m_objectNode->attachObject(darkObject); + darkObject->setVisible(false); + + m_pointer = m_painter->paintTriangle(Ogre::Vector2(posX - 0.05F, posY + m_targetHeight), Ogre::Vector2(posX, posY + m_targetHeight - 0.05F), + Ogre::Vector2(posX + 0.05F, posY + m_targetHeight), Ogre::ColourValue(1, 1, 0)); + + pointerNode->attachObject(m_pointer); + m_pointer->setVisible(false); +} + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/GenericStimulator/ovamsCGenericStimulatorFlickeringObject.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/GenericStimulator/ovamsCGenericStimulatorFlickeringObject.h new file mode 100755 index 0000000..d0fa1c7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/GenericStimulator/ovamsCGenericStimulatorFlickeringObject.h @@ -0,0 +1,40 @@ +#pragma once + +#include +#include +#include + +#include "../ovamsCSSVEPFlickeringObject.h" +#include "../ovamsCBasicPainter.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CGenericStimulatorApplication; + +class CGenericStimulatorFlickeringObject final : public CSSVEPFlickeringObject +{ +public: + static CGenericStimulatorFlickeringObject* createGenericFlickeringObject(size_t targetId); + static void initialize(CGenericStimulatorApplication* application); + + static void connectToNode(Ogre::SceneNode* /*sceneNode*/) { } + void setTarget(const bool isTarget) const { m_pointer->setVisible(isTarget); } + bool isTarget() const { return m_pointer->getVisible(); } + +private: + static CGenericStimulatorApplication* m_application; + static Ogre::SceneNode* m_parentNode; + static CBasicPainter* m_painter; + static float m_targetWidth; + static float m_targetHeight; + static Ogre::ColourValue m_lightColor; + static Ogre::ColourValue m_darkColor; + + CGenericStimulatorFlickeringObject(float posX, float posY, Ogre::ColourValue color, const CString& material, size_t stimulationPattern); + + + Ogre::SceneNode* m_elementNode = nullptr; + Ogre::MovableObject* m_pointer = nullptr; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/dotscene/DotSceneLoader.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/dotscene/DotSceneLoader.cpp new file mode 100755 index 0000000..0e1aa9c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/dotscene/DotSceneLoader.cpp @@ -0,0 +1,1285 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +/* + * @author Ogre + * @note This code likely originates from the Ogre project + * @note Due to the external origin, local variables do not follow OpenViBE coding standards + * + */ + +#include "DotSceneLoader.h" +#include + +/* +#include +#include +#include + +#include "PagedGeometry/PagedGeometry.h" +#include "PagedGeometry/GrassLoader.h" +#include "PagedGeometry/BatchPage.h" +#include "PagedGeometry/ImpostorPage.h" +#include "PagedGeometry/TreeLoader3D.h" + +#pragma warning(disable:4390) +#pragma warning(disable:4305) +*/ + +//using namespace Forests; + +Ogre::TerrainGroup* staticGroupPtr = nullptr; + +//Ogre::Real OgitorTerrainGroupHeightFunction(Ogre::Real x, Ogre::Real z, void *userData) { return staticGroupPtr->getHeightAtWorldPosition(x,0,z); } + +DotSceneLoader::DotSceneLoader() : m_resLocationsBaseDir("") +{ + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Initializing"); + // m_TerrainGlobalOptions = OGRE_NEW Ogre::TerrainGlobalOptions(); +} + + +DotSceneLoader::~DotSceneLoader() +{ + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Destroying everything"); + /* + if(mGrassLoaderHandle) delete mGrassLoaderHandle; + + auto it = mPGHandles.begin(); + while(it != mPGHandles.end()) + { + delete it[0]; + it++; + } + mPGHandles.clear(); + + if(mTerrainGroup) { OGRE_DELETE mTerrainGroup; } + + OGRE_DELETE m_TerrainGlobalOptions; + */ +} + +void ParseStringVector(Ogre::String& str, Ogre::StringVector& list) +{ + list.clear(); + Ogre::StringUtil::trim(str, true, true); + if (str.empty()) { return; } + + size_t pos = str.find(';'); + while (pos != size_t(-1)) + { + list.push_back(str.substr(0, pos)); + str.erase(0, pos + 1); + pos = str.find(';'); + } + + if (!str.empty()) { list.push_back(str); } +} + +void DotSceneLoader::parseDotScene(const Ogre::String& sceneName, const Ogre::String& groupName, Ogre::SceneManager* yourSceneMgr, + Ogre::SceneNode* pAttachNode, const Ogre::String& prependNode) +{ + // set up shared object values + m_groupName = groupName; + m_sceneMgr = yourSceneMgr; + m_prependNode = prependNode; + m_StaticObjects.clear(); + m_DynamicObjects.clear(); + + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Scene parsing started, ResGroup: " + m_groupName); + + rapidxml::xml_document<> xmlDoc; // character type defaults to char + + // if the resource group doesn't exists create it + if (!Ogre::ResourceGroupManager::getSingleton().resourceGroupExists(m_groupName)) + { + Ogre::ResourceGroupManager::getSingleton().createResourceGroup(m_groupName); + } + + Ogre::DataStreamPtr stream = Ogre::ResourceGroupManager::getSingleton().openResource(sceneName, groupName); + if (!stream->isReadable()) + { + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] stream is not readable"); + return; + } + + char* scene = const_cast(stream->getAsString().c_str()); + xmlDoc.parse<0>(scene); + + // Grab the scene node + rapidxml::xml_node<>* xmlRoot = xmlDoc.first_node("scene"); + + // Validate the File + if (getAttrib(xmlRoot, "formatVersion", "").empty()) + { + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Error: Invalid .scene File. Missing "); + free(scene); + return; + } + + // figure out where to attach any nodes we create + m_attachNode = pAttachNode; + if (!m_attachNode) { m_attachNode = m_sceneMgr->getRootSceneNode(); } + + // Process the scene + processScene(xmlRoot); + + free(scene); + + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Scene parsing finished"); +} + +void DotSceneLoader::processScene(rapidxml::xml_node<>* xmlRoot) +{ + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Process Scene"); + // Process the scene parameters + const Ogre::String version = getAttrib(xmlRoot, "formatVersion", "unknown"); + + Ogre::String message = "[DotSceneLoader] Parsing dotScene file with version " + version; + if (xmlRoot->first_attribute("ID")) { message += ", id " + Ogre::String(xmlRoot->first_attribute("ID")->value()); } + if (xmlRoot->first_attribute("sceneManager")) { message += ", scene manager " + Ogre::String(xmlRoot->first_attribute("sceneManager")->value()); } + if (xmlRoot->first_attribute("minOgreVersion")) { message += ", min. Ogre version " + Ogre::String(xmlRoot->first_attribute("minOgreVersion")->value()); } + if (xmlRoot->first_attribute("author")) { message += ", author " + Ogre::String(xmlRoot->first_attribute("author")->value()); } + + Ogre::LogManager::getSingleton().logMessage(message); + + // Process resources (?) + rapidxml::xml_node<>* pElement = xmlRoot->first_node("resourceLocations"); + if (pElement) { processResourceLocations(pElement); } + + // Process environment (?) + pElement = xmlRoot->first_node("environment"); + if (pElement) { processEnvironment(pElement); } + + // Process light (?) + pElement = xmlRoot->first_node("light"); + while (pElement) + { + processLight(pElement); + pElement = pElement->next_sibling("light"); + } + + // Process camera (?) + pElement = xmlRoot->first_node("camera"); + while (pElement) + { + processCamera(pElement); + pElement = pElement->next_sibling("camera"); + } + + // Process terrain (?) + /* + pElement = xmlRoot->first_node("terrain"); + if(pElement) + processTerrain(pElement); + */ + + // Process nodes (?) + pElement = xmlRoot->first_node("nodes"); + if (pElement) { processNodes(pElement); } + + // Process externals (?) + pElement = xmlRoot->first_node("externals"); + if (pElement) { processExternals(pElement); } + + // Process userDataReference (?) + pElement = xmlRoot->first_node("userDataReference"); + if (pElement) { processUserDataReference(pElement); } + + // Process octree (?) + pElement = xmlRoot->first_node("octree"); + if (pElement) { processOctree(pElement); } +} + +void DotSceneLoader::processResourceLocations(rapidxml::xml_node<>* xmlNode) const +{ + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Process Resource Locations"); + + // Process resources (?) + rapidxml::xml_node<>* pElement = xmlNode->first_node("resourceLocation"); + + if (pElement) + { + // remove the particle templates what are in this resource group + // (error happens if an already loaded particle is loaded again) + Ogre::ParticleSystemManager::getSingletonPtr()->removeTemplatesByResourceGroup(m_groupName); + // and empty the resource group. The previously declared resource locations are not deleted! + Ogre::ResourceGroupManager::getSingleton().clearResourceGroup(m_groupName); + + // add the resource locations what were in the .scene file + while (pElement) + { + Ogre::ResourceGroupManager::getSingleton().addResourceLocation(m_resLocationsBaseDir + getAttrib(pElement, "name"), getAttrib(pElement, "type"), + m_groupName); + pElement = pElement->next_sibling("resourceLocation"); + } + + + Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup(m_groupName); + } +} + +void DotSceneLoader::processNodes(rapidxml::xml_node<>* xmlNode) +{ + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Process Nodes"); + + // Process node (*) + rapidxml::xml_node<>* pElement = xmlNode->first_node("node"); + while (pElement) + { + processNode(pElement); + pElement = pElement->next_sibling("node"); + } + + // Process position (?) + pElement = xmlNode->first_node("position"); + if (pElement) + { + m_attachNode->setPosition(parseVector3(pElement)); + m_attachNode->setInitialState(); + } + + // Process rotation (?) + pElement = xmlNode->first_node("rotation"); + if (pElement) + { + m_attachNode->setOrientation(parseQuaternion(pElement)); + m_attachNode->setInitialState(); + } + + // Process scale (?) + pElement = xmlNode->first_node("scale"); + if (pElement) + { + m_attachNode->setScale(parseVector3(pElement)); + m_attachNode->setInitialState(); + } +} + +void DotSceneLoader::processEnvironment(rapidxml::xml_node<>* xmlNode) const +{ + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Process Environment"); + + // Process camera (?) + rapidxml::xml_node<>* node = xmlNode->first_node("camera"); + if (node) { processCamera(node); } + // Process fog (?) + node = xmlNode->first_node("fog"); + if (node) { processFog(node); } + // Process skyBox (?) + node = xmlNode->first_node("skyBox"); + if (node) { processSkyBox(node); } + // Process skyDome (?) + node = xmlNode->first_node("skyDome"); + if (node) { processSkyDome(node); } + // Process skyPlane (?) + node = xmlNode->first_node("skyPlane"); + if (node) { processSkyPlane(node); } + // Process clipping (?) + node = xmlNode->first_node("clipping"); + if (node) { processClipping(node); } + // Process colourAmbient (?) + node = xmlNode->first_node("colourAmbient"); + if (node) { m_sceneMgr->setAmbientLight(parseColour(node)); } + + // Process colourBackground (?) + //! @todo Set the background colour of all viewports (RenderWindow has to be provided then) + //node = xmlNode->first_node("colourBackground"); + //if (node) {m_sceneMgr->set(parseColour(node));} + + // Process userDataReference (?) + node = xmlNode->first_node("userDataReference"); + if (node) { processUserDataReference(node); } +} +/* +void DotSceneLoader::processTerrain(rapidxml::xml_node<>* xmlNode) +{ + Ogre::LogManager::getSingleton().logMessage( "[DotSceneLoader] Process Terrain" ); + + Ogre::Real worldSize = getAttribReal(xmlNode, "worldSize"); + int mapSize = Ogre::StringConverter::parseInt(xmlNode->first_attribute("mapSize")->value()); + bool colourmapEnabled = getAttribBool(xmlNode, "colourmapEnabled"); + int colourMapTextureSize = Ogre::StringConverter::parseInt(xmlNode->first_attribute("colourMapTextureSize")->value()); + int compositeMapDistance = Ogre::StringConverter::parseInt(xmlNode->first_attribute("tuningCompositeMapDistance")->value()); + int maxPixelError = Ogre::StringConverter::parseInt(xmlNode->first_attribute("tuningMaxPixelError")->value()); + + Ogre::Vector3 lightdir(0, -0.3, 0.75); + lightdir.normalise(); + Ogre::Light* l = m_sceneMgr->createLight("tstLight"); + l->setType(Ogre::Light::LT_DIRECTIONAL); + l->setDirection(lightdir); + l->setDiffuseColour(Ogre::ColourValue(1.0, 1.0, 1.0)); + l->setSpecularColour(Ogre::ColourValue(0.4, 0.4, 0.4)); +// m_sceneMgr->setAmbientLight(Ogre::ColourValue(0.6, 0.6, 0.6)); + + m_TerrainGlobalOptions->setMaxPixelError((Ogre::Real)maxPixelError); + m_TerrainGlobalOptions->setCompositeMapDistance((Ogre::Real)compositeMapDistance); + m_TerrainGlobalOptions->setLightMapDirection(lightdir); + m_TerrainGlobalOptions->setCompositeMapAmbient(m_sceneMgr->getAmbientLight()); + m_TerrainGlobalOptions->setCompositeMapDiffuse(l->getDiffuseColour()); + + m_sceneMgr->destroyLight("tstLight"); + + mTerrainGroup = OGRE_NEW Ogre::TerrainGroup(m_sceneMgr, Ogre::Terrain::ALIGN_X_Z, mapSize, worldSize); + mTerrainGroup->setOrigin(Ogre::Vector3::ZERO); + + mTerrainGroup->setResourceGroup(m_groupName); + + rapidxml::xml_node<>* pElement; + rapidxml::xml_node<>* pPageElement; + + // Process terrain pages (*) + pElement = xmlNode->first_node("terrainPages"); + if(pElement) + { + pPageElement = pElement->first_node("terrainPage"); + while(pPageElement) + { + processTerrainPage(pPageElement); + pPageElement = pPageElement->next_sibling("terrainPage"); + } + } + mTerrainGroup->loadAllTerrains(true); + + mTerrainGroup->freeTemporaryResources(); + //mTerrain->setPosition(mTerrainPosition); +} + +void DotSceneLoader::processTerrainPage(rapidxml::xml_node<>* xmlNode) +{ + Ogre::String name = getAttrib(xmlNode, "name"); + + Ogre::LogManager::getSingleton().logMessage( "[DotSceneLoader] Process Terrain Page: " + name ); + + int pageX = Ogre::StringConverter::parseInt(xmlNode->first_attribute("pageX")->value()); + int pageY = Ogre::StringConverter::parseInt(xmlNode->first_attribute("pageY")->value()); + mPGPageSize = Ogre::StringConverter::parseInt(xmlNode->first_attribute("pagedGeometryPageSize")->value()); + mPGDetailDistance = Ogre::StringConverter::parseInt(xmlNode->first_attribute("pagedGeometryDetailDistance")->value()); + // error checking + if(mPGPageSize < 10){ + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] pagedGeometryPageSize value error!", Ogre::LML_CRITICAL); + mPGPageSize = 10; + } + if(mPGDetailDistance < 100){ + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] pagedGeometryDetailDistance value error!", Ogre::LML_CRITICAL); + mPGDetailDistance = 100; + } + + if (Ogre::ResourceGroupManager::getSingleton().resourceExists(mTerrainGroup->getResourceGroup(), name)) + { + mTerrainGroup->defineTerrain(pageX, pageY, name); + } + // grass layers + rapidxml::xml_node<>* pElement = xmlNode->first_node("grassLayers"); + + if(pElement) { processGrassLayers(pElement); } +} + +void DotSceneLoader::processGrassLayers(rapidxml::xml_node<>* xmlNode) +{ + Ogre::LogManager::getSingleton().logMessage( "[DotSceneLoader] Process Grass Layers" ); + + Ogre::String dMapName = getAttrib(xmlNode, "densityMap"); + m_TerrainGlobalOptions->setVisibilityFlags(Ogre::StringConverter::parseUnsignedInt(xmlNode->first_attribute("visibilityFlags")->value())); + + // create a temporary camera + Ogre::Camera* tempCam = m_sceneMgr->createCamera("ThIsNamEShoUlDnOtExisT"); + + // create paged geometry what the grass will use + Forests::PagedGeometry * mPGHandle = new PagedGeometry(tempCam, mPGPageSize); + mPGHandle->addDetailLevel(mPGDetailDistance); + + //Create a GrassLoader object + mGrassLoaderHandle = new GrassLoader(mPGHandle); + mGrassLoaderHandle->setVisibilityFlags(m_TerrainGlobalOptions->getVisibilityFlags()); + + //Assign the "grassLoader" to be used to load geometry for the PagedGrass instance + mPGHandle->setPageLoader(mGrassLoaderHandle); + + // set the terrain group pointer + staticGroupPtr = mTerrainGroup; + + //Supply a height function to GrassLoader so it can calculate grass Y values + mGrassLoaderHandle->setHeightFunction(OgitorTerrainGroupHeightFunction); + + // push the page geometry handle into the PGHandles array + mPGHandles.push_back(mPGHandle); + + // create the layers and load the options for them + rapidxml::xml_node<>* pElement = xmlNode->first_node("grassLayer"); + rapidxml::xml_node<>* pSubElement; + Forests::GrassLayer* gLayer; + Ogre::String tempStr; + while(pElement) + { + // grassLayer + gLayer = mGrassLoaderHandle->addLayer(pElement->first_attribute("material")->value()); + gLayer->setId(Ogre::StringConverter::parseInt(pElement->first_attribute("id")->value())); + gLayer->setEnabled(Ogre::StringConverter::parseBool(pElement->first_attribute("enabled")->value())); + gLayer->setMaxSlope(Ogre::StringConverter::parseReal(pElement->first_attribute("maxSlope")->value())); + gLayer->setLightingEnabled(Ogre::StringConverter::parseBool(pElement->first_attribute("lighting")->value())); + + Ogre::LogManager::getSingleton().logMessage( "[DotSceneLoader] processing grassLayer "+Ogre::StringConverter::toString(gLayer->getId()) ); + + // densityMapProps + pSubElement = pElement->first_node("densityMapProps"); + tempStr = pSubElement->first_attribute("channel")->value(); + MapChannel mapCh; + if(!tempStr.compare("ALPHA")) mapCh = CHANNEL_ALPHA; else + if(!tempStr.compare("BLUE")) mapCh = CHANNEL_BLUE; else + if(!tempStr.compare("COLOR")) mapCh = CHANNEL_COLOR; else + if(!tempStr.compare("GREEN")) mapCh = CHANNEL_GREEN; else + if(!tempStr.compare("RED")) mapCh = CHANNEL_RED; + + gLayer->setDensityMap(dMapName, mapCh); + gLayer->setDensity(Ogre::StringConverter::parseReal(pSubElement->first_attribute("density")->value())); + + // mapBounds + pSubElement = pElement->first_node("mapBounds"); + gLayer->setMapBounds( TBounds(Ogre::StringConverter::parseReal(pSubElement->first_attribute("left")->value()), // left + Ogre::StringConverter::parseReal(pSubElement->first_attribute("top")->value()), // top + Ogre::StringConverter::parseReal(pSubElement->first_attribute("right")->value()), // right + Ogre::StringConverter::parseReal(pSubElement->first_attribute("bottom")->value()))); // bottom + + // grassSizes + pSubElement = pElement->first_node("grassSizes"); + gLayer->setMinimumSize( Ogre::StringConverter::parseReal(pSubElement->first_attribute("minWidth")->value()), // width + Ogre::StringConverter::parseReal(pSubElement->first_attribute("minHeight")->value()) );// height + gLayer->setMaximumSize( Ogre::StringConverter::parseReal(pSubElement->first_attribute("maxWidth")->value()), // width + Ogre::StringConverter::parseReal(pSubElement->first_attribute("maxHeight")->value()) );// height + + // techniques + pSubElement = pElement->first_node("techniques"); + tempStr = pSubElement->first_attribute("renderTechnique")->value(); + GrassTechnique rendTech; + + if(!tempStr.compare("QUAD")) rendTech = GRASSTECH_QUAD; else + if(!tempStr.compare("CROSSQUADS")) rendTech = GRASSTECH_CROSSQUADS; else + if(!tempStr.compare("SPRITE")) rendTech = GRASSTECH_SPRITE; + gLayer->setRenderTechnique( rendTech, + Ogre::StringConverter::parseBool(pSubElement->first_attribute("blend")->value()) ); + + tempStr = pSubElement->first_attribute("fadeTechnique")->value(); + FadeTechnique fadeTech; + if(!tempStr.compare("ALPHA")) fadeTech = FADETECH_ALPHA; else + if(!tempStr.compare("GROW")) fadeTech = FADETECH_GROW; else + if(!tempStr.compare("ALPHAGROW")) fadeTech = FADETECH_ALPHAGROW; + gLayer->setFadeTechnique(fadeTech); + + // animation + pSubElement = pElement->first_node("animation"); + gLayer->setAnimationEnabled(Ogre::StringConverter::parseBool(pSubElement->first_attribute("animate")->value())); + gLayer->setSwayLength(Ogre::StringConverter::parseReal(pSubElement->first_attribute("swayLength")->value())); + gLayer->setSwaySpeed(Ogre::StringConverter::parseReal(pSubElement->first_attribute("swaySpeed")->value())); + gLayer->setSwayDistribution(Ogre::StringConverter::parseReal(pSubElement->first_attribute("swayDistribution")->value())); + + // next layer + pElement = pElement->next_sibling("grassLayer"); + } + + m_sceneMgr->destroyCamera(tempCam); +} +*/ +void DotSceneLoader::processUserDataReference(rapidxml::xml_node<>* /*xmlNode*/, Ogre::SceneNode* /*parent*/) +{ + //! @todo Implement this +} + +void DotSceneLoader::processOctree(rapidxml::xml_node<>* /*xmlNode*/) +{ + //! @todo Implement this +} + +void DotSceneLoader::processLight(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* parent) +{ + // Process attributes + const Ogre::String name = getAttrib(xmlNode, "name"); + //Ogre::String id = getAttrib(xmlNode, "id"); + + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Process Light: " + name); + + // Create the light + Ogre::Light* pLight = m_sceneMgr->createLight(name); + if (parent) { parent->attachObject(pLight); } + + const Ogre::String value = getAttrib(xmlNode, "type"); + if (value == "point") { pLight->setType(Ogre::Light::LT_POINT); } + else if (value == "directional") { pLight->setType(Ogre::Light::LT_DIRECTIONAL); } + else if (value == "spot") { pLight->setType(Ogre::Light::LT_SPOTLIGHT); } + else if (value == "radPoint") { pLight->setType(Ogre::Light::LT_POINT); } + + pLight->setVisible(getAttribBool(xmlNode, "visible", true)); + pLight->setCastShadows(getAttribBool(xmlNode, "castShadows", true)); + + // Process position (?) + rapidxml::xml_node<>* pElement = xmlNode->first_node("position"); + if (pElement) { pLight->setPosition(parseVector3(pElement)); } + + // Process normal (?) + pElement = xmlNode->first_node("normal"); + if (pElement) { pLight->setDirection(parseVector3(pElement)); } + + pElement = xmlNode->first_node("directionVector"); + if (pElement) + { + pLight->setDirection(parseVector3(pElement)); + m_lightDirection = parseVector3(pElement); + } + + // Process colourDiffuse (?) + pElement = xmlNode->first_node("colourDiffuse"); + if (pElement) { pLight->setDiffuseColour(parseColour(pElement)); } + + // Process colourSpecular (?) + pElement = xmlNode->first_node("colourSpecular"); + if (pElement) { pLight->setSpecularColour(parseColour(pElement)); } + + if (value != "directional") + { + // Process lightRange (?) + pElement = xmlNode->first_node("lightRange"); + if (pElement) { processLightRange(pElement, pLight); } + + // Process lightAttenuation (?) + pElement = xmlNode->first_node("lightAttenuation"); + if (pElement) { processLightAttenuation(pElement, pLight); } + } + // Process userDataReference (?) + //pElement = xmlNode->first_node("userDataReference"); + //if (pElement) { processUserDataReference(pElement, pLight); } +} + +void DotSceneLoader::processCamera(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* pParent) const +{ + // Process attributes + const Ogre::String name = getAttrib(xmlNode, "name"); + //Ogre::String id = getAttrib(xmlNode, "id"); + //Ogre::Real fov = getAttribReal(xmlNode, "fov", 45); + //Ogre::Real aspectRatio = getAttribReal(xmlNode, "aspectRatio", 1.3333); + const Ogre::String projectionType = getAttrib(xmlNode, "projectionType", "perspective"); + + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Process Camera: " + name); + + // Create the camera + Ogre::Camera* pCamera = m_sceneMgr->createCamera(name); + + // set auto Aspest ratio true. If later aspect ratio comes this can be deleted + pCamera->setAutoAspectRatio(true); + + //TODO: make a flag or attribute indicating whether or not the camera should be attached to any parent node. + if (pParent) { pParent->attachObject(pCamera); } + + // Set the field-of-view + //! @todo Is this always in degrees? + //pCamera->setFOVy(Ogre::Degree(fov)); + + // Set the aspect ratio + //pCamera->setAutoAspectRatio(false); + //pCamera->setAspectRatio(aspectRatio); + + // Set the projection type + if (projectionType == "perspective") { pCamera->setProjectionType(Ogre::PT_PERSPECTIVE); } + else if (projectionType == "orthographic") { pCamera->setProjectionType(Ogre::PT_ORTHOGRAPHIC); } + + // Process clipping (?) + rapidxml::xml_node<>* element = xmlNode->first_node("clipping"); + if (element) + { + const Ogre::Real nearDist = getAttribReal(element, "near"); + pCamera->setNearClipDistance(nearDist); + + const Ogre::Real farDist = getAttribReal(element, "far"); + pCamera->setFarClipDistance(farDist); + } + + // Process position (?) + element = xmlNode->first_node("position"); + if (element) { pCamera->setPosition(parseVector3(element)); } + + // Process rotation (?) + element = xmlNode->first_node("rotation"); + if (element) { pCamera->setOrientation(parseQuaternion(element)); } + + // Process normal (?) + //element = xmlNode->first_node("normal"); + ///< @todo What to do with this element? + //if (pElement) { } + + // Process lookTarget (?) + //element = xmlNode->first_node("lookTarget"); + ///< @todo Implement the camera look target + //if (pElement) { } + + // Process trackTarget (?) + //element = xmlNode->first_node("trackTarget"); + ///< @todo Implement the camera track target + //if (pElement) {} + // Process userDataReference (?) + //element = xmlNode->first_node("userDataReference"); + ///< @todo Implement the camera user data reference + //if (pElement) { } + /* + // construct a scenenode is no parent + if(!pParent) + { + Ogre::SceneNode* node = m_attachNode->createChildSceneNode(name); + node->setPosition(pCamera->getPosition()); + node->setOrientation(pCamera->getOrientation()); + node->scale(1,1,1); + } + */ +} + +void DotSceneLoader::processNode(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* pParent) +{ + // Construct the node's name + const Ogre::String name = m_prependNode + getAttrib(xmlNode, "name"); + + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Process Node: " + name); + + // Create the scene node + Ogre::SceneNode* pNode; + + if (name.empty()) + { + // Let Ogre choose the name + if (pParent) { pNode = pParent->createChildSceneNode(); } + else { pNode = m_attachNode->createChildSceneNode(); } + } + else + { + // Provide the name + if (pParent) { pNode = pParent->createChildSceneNode(name); } + else { pNode = m_attachNode->createChildSceneNode(name); } + } + + // Process other attributes + // Ogre::String id = getAttrib(xmlNode, "id"); + // bool isTarget = getAttribBool(xmlNode, "isTarget"); + + // Process position (?) + rapidxml::xml_node<>* pElement = xmlNode->first_node("position"); + if (pElement) + { + pNode->setPosition(parseVector3(pElement)); + pNode->setInitialState(); + } + + // Process rotation (?) + pElement = xmlNode->first_node("rotation"); + if (pElement) + { + pNode->setOrientation(parseQuaternion(pElement)); + pNode->setInitialState(); + } + + // Process scale (?) + pElement = xmlNode->first_node("scale"); + if (pElement) + { + pNode->setScale(parseVector3(pElement)); + pNode->setInitialState(); + } + + // Process lookTarget (?) + pElement = xmlNode->first_node("lookTarget"); + if (pElement) { processLookTarget(pElement, pNode); } + + // Process trackTarget (?) + pElement = xmlNode->first_node("trackTarget"); + if (pElement) { processTrackTarget(pElement, pNode); } + + // Process node (*) + pElement = xmlNode->first_node("node"); + while (pElement) + { + processNode(pElement, pNode); + pElement = pElement->next_sibling("node"); + } + + // Process entity (*) + pElement = xmlNode->first_node("entity"); + while (pElement) + { + processEntity(pElement, pNode); + pElement = pElement->next_sibling("entity"); + } + + // Process light (*) + pElement = xmlNode->first_node("light"); + while (pElement) + { + processLight(pElement, pNode); + pElement = pElement->next_sibling("light"); + } + + // Process camera (*) + pElement = xmlNode->first_node("camera"); + while (pElement) + { + processCamera(pElement, pNode); + pElement = pElement->next_sibling("camera"); + } + + // Process particleSystem (*) + pElement = xmlNode->first_node("particleSystem"); + while (pElement) + { + processParticleSystem(pElement, pNode); + pElement = pElement->next_sibling("particleSystem"); + } + + // Process billboardSet (*) + pElement = xmlNode->first_node("billboardSet"); + while (pElement) + { + processBillboardSet(pElement, pNode); + pElement = pElement->next_sibling("billboardSet"); + } + + // Process plane (*) + pElement = xmlNode->first_node("plane"); + while (pElement) + { + processPlane(pElement, pNode); + pElement = pElement->next_sibling("plane"); + } + + // Process userDataReference (?) + pElement = xmlNode->first_node("userDataReference"); + if (pElement) { processUserDataReference(pElement, pNode); } + /* + // Process entity (*) + pElement = xmlNode->first_node("pagedgeometry"); + while(pElement) + { + processPagedGeometry(pElement, node); + pElement = pElement->next_sibling("pagedgeometry"); + } + */ +} + +void DotSceneLoader::processLookTarget(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* parent) const +{ + //! @todo Is this correct? Cause I don't have a clue actually + + // Process attributes + const Ogre::String nodeName = getAttrib(xmlNode, "nodeName"); + + Ogre::Node::TransformSpace relativeTo = Ogre::Node::TS_PARENT; + const Ogre::String value = getAttrib(xmlNode, "relativeTo"); + if (value == "local") { relativeTo = Ogre::Node::TS_LOCAL; } + else if (value == "parent") { relativeTo = Ogre::Node::TS_PARENT; } + else if (value == "world") { relativeTo = Ogre::Node::TS_WORLD; } + + // Process position (?) + Ogre::Vector3 position; + rapidxml::xml_node<>* element = xmlNode->first_node("position"); + if (element) { position = parseVector3(element); } + + // Process localDirection (?) + Ogre::Vector3 localDirection = Ogre::Vector3::NEGATIVE_UNIT_Z; + element = xmlNode->first_node("localDirection"); + if (element) { localDirection = parseVector3(element); } + + // Setup the look target + try + { + if (!nodeName.empty()) + { + Ogre::SceneNode* pLookNode = m_sceneMgr->getSceneNode(nodeName); + position = pLookNode->_getDerivedPosition(); + } + + parent->lookAt(position, relativeTo, localDirection); + } + catch (Ogre::Exception&/*e*/) { Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Error processing a look target!"); } +} + +void DotSceneLoader::processTrackTarget(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* pParent) const +{ + // Process attributes + const Ogre::String nodeName = getAttrib(xmlNode, "nodeName"); + + // Process localDirection (?) + Ogre::Vector3 localDirection = Ogre::Vector3::NEGATIVE_UNIT_Z; + rapidxml::xml_node<>* pElement = xmlNode->first_node("localDirection"); + if (pElement) { localDirection = parseVector3(pElement); } + + // Process offset (?) + Ogre::Vector3 offset = Ogre::Vector3::ZERO; + pElement = xmlNode->first_node("offset"); + if (pElement) { offset = parseVector3(pElement); } + + // Setup the track target + try + { + Ogre::SceneNode* pTrackNode = m_sceneMgr->getSceneNode(nodeName); + pParent->setAutoTracking(true, pTrackNode, localDirection, offset); + } + catch (Ogre::Exception&/*e*/) { Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Error processing a track target!"); } +} + +void DotSceneLoader::processEntity(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* pParent) +{ + // Process attributes + const Ogre::String name = getAttrib(xmlNode, "name"); + //const Ogre::String id = getAttrib(xmlNode, "id"); + const Ogre::String meshFile = getAttrib(xmlNode, "meshFile"); + const Ogre::String materialFile = getAttrib(xmlNode, "materialFile"); + const bool isStatic = getAttribBool(xmlNode, "static", false); + const bool castShadows = getAttribBool(xmlNode, "castShadows", true); + + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Process Entity: " + name); + + // TEMP: Maintain a list of static and dynamic objects + if (isStatic) { m_StaticObjects.push_back(name); } + else { m_DynamicObjects.push_back(name); } + + // Process vertexBuffer (?) + //rapidxml::xml_node<>* pElement = xmlNode->first_node("vertexBuffer"); + //if (pElement) { processVertexBuffer(pElement); + + // Process indexBuffer (?) + //pElement = xmlNode->first_node("indexBuffer"); + //if (pElement) { processIndexBuffer(pElement); } + + // Create the entity + Ogre::Entity* pEntity = nullptr; + try + { + Ogre::MeshManager::getSingleton().load(meshFile, m_groupName); + pEntity = m_sceneMgr->createEntity(name, meshFile); + pEntity->setCastShadows(castShadows); + pParent->attachObject(pEntity); + + if (!materialFile.empty()) { pEntity->setMaterialName(materialFile); } + + // Process subentity (*) + /* if materials defined within subentities, those + materials will be used instead of the materialFile */ + rapidxml::xml_node<>* pElement = xmlNode->first_node("subentities"); + + if (pElement) { processSubEntity(pElement, pEntity); } + else + { + // if the .scene file contains the subentites without + // the + processSubEntity(xmlNode, pEntity); + } + } + catch (Ogre::Exception&/*e*/) { Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Error loading an entity!"); } + + // Process userDataReference (?) + rapidxml::xml_node<>* pElement = xmlNode->first_node("userDataReference"); + if (pElement) { processUserDataReference(pElement, pEntity); } +} + +void DotSceneLoader::processSubEntity(rapidxml::xml_node<>* xmlNode, Ogre::Entity* pEntity) +{ + Ogre::String materialName; + Ogre::String sIndex; + + // Process subentity + rapidxml::xml_node<>* pElement = xmlNode->first_node("subentity"); + + while (pElement) + { + sIndex.clear(); + materialName.clear(); + + sIndex = getAttrib(pElement, "index"); // submesh index + materialName = getAttrib(pElement, "materialName"); // new material for submesh + + if (!sIndex.empty() && !materialName.empty()) + { + const int index = Ogre::StringConverter::parseInt(sIndex); + try { pEntity->getSubEntity(index)->setMaterialName(materialName); } + catch (...) { Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Subentity material index invalid!"); } + } + pElement = pElement->next_sibling("subentity"); + } +} + +void DotSceneLoader::processParticleSystem(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* pParent) +{ + // Process attributes + const Ogre::String name = getAttrib(xmlNode, "name"); + //Ogre::String id = getAttrib(xmlNode, "id"); + const Ogre::String scriptName = getAttrib(xmlNode, "script"); + + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Process ParticleSystem: " + name); + + + // Create the particle system + try + { + Ogre::ParticleSystem* pParticles = m_sceneMgr->createParticleSystem(name, scriptName); + pParent->attachObject(pParticles); + m_ParticleSystemList.push_back(pParticles); + // there is a bug with particles and paged geometry if particle's + // renderQueue is value is smaller than the grass's renderQueue + /* + if(mGrassLoaderHandle) + pParticles->setRenderQueueGroup(mGrassLoaderHandle->getRenderQueueGroup()); + */ + } + catch (Ogre::Exception&/*e*/) { Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Error creating a particle system!"); } +} + +void DotSceneLoader::processBillboardSet(rapidxml::xml_node<>* /*xmlNode*/, Ogre::SceneNode* /*parent*/) +{ + //! @todo Implement this +} + +void DotSceneLoader::processPlane(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* pParent) const +{ + const Ogre::String name = getAttrib(xmlNode, "name"); + const Ogre::Real distance = getAttribReal(xmlNode, "distance"); + const Ogre::Real width = getAttribReal(xmlNode, "width"); + const Ogre::Real height = getAttribReal(xmlNode, "height"); + const int xSegments = Ogre::StringConverter::parseInt(getAttrib(xmlNode, "xSegments")); + const int ySegments = Ogre::StringConverter::parseInt(getAttrib(xmlNode, "ySegments")); + const int numTexCoordSets = Ogre::StringConverter::parseInt(getAttrib(xmlNode, "numTexCoordSets")); + const Ogre::Real uTile = getAttribReal(xmlNode, "uTile"); + const Ogre::Real vTile = getAttribReal(xmlNode, "vTile"); + const Ogre::String material = getAttrib(xmlNode, "material"); + const bool hasNormals = getAttribBool(xmlNode, "hasNormals"); + const Ogre::Vector3 normal = parseVector3(xmlNode->first_node("normal")); + const Ogre::Vector3 up = parseVector3(xmlNode->first_node("upVector")); + + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Process Plane: " + name); + + const Ogre::Plane plane(normal, distance); + Ogre::MeshPtr res = Ogre::MeshManager::getSingletonPtr()->createPlane(name + "mesh", "General", plane, width, height, xSegments, ySegments, hasNormals, + numTexCoordSets, uTile, vTile, up); + Ogre::Entity* ent = m_sceneMgr->createEntity(name, name + "mesh"); + + ent->setMaterialName(material); + + pParent->attachObject(ent); +} +/* +struct PGInstanceInfo +{ + Ogre::Vector3 pos; + Ogre::Real scale; + Ogre::Real yaw; +}; + +typedef std::vector PGInstanceList; + +void DotSceneLoader::processPagedGeometry(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode *pParent) +{ + Ogre::LogManager::getSingleton().logMessage( "[DotSceneLoader] Process Paged Geometry" ); + + Ogre::String filename = "../Projects/SampleScene3/" + getAttrib(xmlNode, "fileName"); + Ogre::String model = getAttrib(xmlNode, "model"); + Ogre::Real pagesize = getAttribReal(xmlNode, "pageSize"); + Ogre::Real batchdistance = getAttribReal(xmlNode, "batchDistance"); + Ogre::Real impostordistance = getAttribReal(xmlNode, "impostorDistance"); + Ogre::Vector4 bounds = Ogre::StringConverter::parseVector4(getAttrib(xmlNode, "bounds")); + + PagedGeometry *mPGHandle = new PagedGeometry(); + mPGHandle->setCamera(m_sceneMgr->getCameraIterator().begin()->second); + mPGHandle->setPageSize(pagesize); + mPGHandle->setInfinite(); + + mPGHandle->addDetailLevel(batchdistance,0); + mPGHandle->addDetailLevel(impostordistance,0); + + TreeLoader3D *mHandle = new TreeLoader3D(mPGHandle, Forests::TBounds(bounds.x, bounds.y, bounds.z, bounds.w)); + mPGHandle->setPageLoader(mHandle); + + mPGHandles.push_back(mPGHandle); + mTreeHandles.push_back(mHandle); + + std::ifstream stream(filename.c_str()); + + if(!stream.is_open()) + return; + + Ogre::StringVector list; + + char res[128]; + + PGInstanceList mInstanceList; + + while(!stream.eof()) + { + stream.getline(res, 128); + Ogre::String resStr(res); + + ParseStringVector(resStr, list); + + if(list.size() == 3) + { + PGInstanceInfo info; + + info.pos = Ogre::StringConverter::parseVector3(list[0]); + info.scale = Ogre::StringConverter::parseReal(list[1]); + info.yaw = Ogre::StringConverter::parseReal(list[2]); + + mInstanceList.push_back(info); + } + else if(list.size() == 4) + { + PGInstanceInfo info; + + info.pos = Ogre::StringConverter::parseVector3(list[1]); + info.scale = Ogre::StringConverter::parseReal(list[2]); + info.yaw = Ogre::StringConverter::parseReal(list[3]); + + mInstanceList.push_back(info); + } + } + + stream.close(); + + if(model != "") + { + Ogre::Entity *mEntityHandle = m_sceneMgr->createEntity(model + ".mesh"); + + auto it = mInstanceList.begin(); + + while(it != mInstanceList.end()) + { + mHandle->addTree(mEntityHandle, it->pos, Ogre::Degree(it->yaw), it->scale); + + it++; + } + } +} +*/ +void DotSceneLoader::processFog(rapidxml::xml_node<>* xmlNode) const +{ + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Process Fog"); + + // Process attributes + const Ogre::Real expDensity = getAttribReal(xmlNode, "density", 0.001F); + const Ogre::Real linearStart = getAttribReal(xmlNode, "start", 0.0); + const Ogre::Real linearEnd = getAttribReal(xmlNode, "end", 1.0); + + Ogre::FogMode mode; + const Ogre::String sMode = getAttrib(xmlNode, "mode"); + if (sMode == "none") { mode = Ogre::FOG_NONE; } + else if (sMode == "exp") { mode = Ogre::FOG_EXP; } + else if (sMode == "exp2") { mode = Ogre::FOG_EXP2; } + else if (sMode == "linear") { mode = Ogre::FOG_LINEAR; } + else { mode = Ogre::FogMode(Ogre::StringConverter::parseInt(sMode)); } + + // Process colourDiffuse (?) + Ogre::ColourValue colourDiffuse = Ogre::ColourValue::White; + rapidxml::xml_node<>* pElement = xmlNode->first_node("colour"); + if (pElement) { colourDiffuse = parseColour(pElement); } + + // Setup the fog + m_sceneMgr->setFog(mode, colourDiffuse, expDensity, linearStart, linearEnd); +} + +void DotSceneLoader::processSkyBox(rapidxml::xml_node<>* xmlNode) const +{ + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Process SkyBox"); + + // Process attributes + const Ogre::String material = getAttrib(xmlNode, "material", "BaseWhite"); + const Ogre::Real distance = getAttribReal(xmlNode, "distance", 5000); + const bool drawFirst = getAttribBool(xmlNode, "drawFirst", true); + const bool active = getAttribBool(xmlNode, "active", false); + if (!active) { return; } + + // Process rotation (?) + Ogre::Quaternion rotation = Ogre::Quaternion::IDENTITY; + rapidxml::xml_node<>* pElement = xmlNode->first_node("rotation"); + if (pElement) { rotation = parseQuaternion(pElement); } + + // Setup the sky box + m_sceneMgr->setSkyBox(true, material, distance, drawFirst, rotation, m_groupName); +} + +void DotSceneLoader::processSkyDome(rapidxml::xml_node<>* xmlNode) const +{ + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Process SkyDome"); + + // Process attributes + const Ogre::String material = xmlNode->first_attribute("material")->value(); + const Ogre::Real curvature = getAttribReal(xmlNode, "curvature", 10); + const Ogre::Real tiling = getAttribReal(xmlNode, "tiling", 8); + const Ogre::Real distance = getAttribReal(xmlNode, "distance", 4000); + const bool drawFirst = getAttribBool(xmlNode, "drawFirst", true); + const bool active = getAttribBool(xmlNode, "active", false); + if (!active) { return; } + + // Process rotation (?) + Ogre::Quaternion rotation = Ogre::Quaternion::IDENTITY; + rapidxml::xml_node<>* pElement = xmlNode->first_node("rotation"); + if (pElement) { rotation = parseQuaternion(pElement); } + + // Setup the sky dome + m_sceneMgr->setSkyDome(true, material, curvature, tiling, distance, drawFirst, rotation, 16, 16, -1, m_groupName); +} + +void DotSceneLoader::processSkyPlane(rapidxml::xml_node<>* xmlNode) const +{ + Ogre::LogManager::getSingleton().logMessage("[DotSceneLoader] Process SkyPlane"); + + // Process attributes + const Ogre::String material = getAttrib(xmlNode, "material"); + const Ogre::Real planeX = getAttribReal(xmlNode, "planeX", 0); + const Ogre::Real planeY = getAttribReal(xmlNode, "planeY", -1); + const Ogre::Real planeZ = getAttribReal(xmlNode, "planeX", 0); + const Ogre::Real planeD = getAttribReal(xmlNode, "planeD", 5000); + const Ogre::Real scale = getAttribReal(xmlNode, "scale", 1000); + const Ogre::Real bow = getAttribReal(xmlNode, "bow", 0); + const Ogre::Real tiling = getAttribReal(xmlNode, "tiling", 10); + const bool drawFirst = getAttribBool(xmlNode, "drawFirst", true); + + // Setup the sky plane + Ogre::Plane plane; + plane.normal = Ogre::Vector3(planeX, planeY, planeZ); + plane.d = planeD; + m_sceneMgr->setSkyPlane(true, plane, material, scale, tiling, drawFirst, bow, 1, 1, m_groupName); +} + +void DotSceneLoader::processClipping(rapidxml::xml_node<>* /*xmlNode*/) +{ + //! @todo Implement this + + // Process attributes + // Ogre::Real fNear = getAttribReal(xmlNode, "near", 0); + // Ogre::Real fFar = getAttribReal(xmlNode, "far", 1); +} + +void DotSceneLoader::processLightRange(rapidxml::xml_node<>* xmlNode, Ogre::Light* pLight) +{ + // Process attributes + const Ogre::Real inner = getAttribReal(xmlNode, "inner"); + const Ogre::Real outer = getAttribReal(xmlNode, "outer"); + const Ogre::Real falloff = getAttribReal(xmlNode, "falloff", 1.0); + + // Setup the light range + pLight->setSpotlightRange(Ogre::Angle(inner), Ogre::Angle(outer), falloff); +} + +void DotSceneLoader::processLightAttenuation(rapidxml::xml_node<>* xmlNode, Ogre::Light* pLight) +{ + // Process attributes + const Ogre::Real range = getAttribReal(xmlNode, "range"); + const Ogre::Real constant = getAttribReal(xmlNode, "constant"); + const Ogre::Real linear = getAttribReal(xmlNode, "linear"); + const Ogre::Real quadratic = getAttribReal(xmlNode, "quadratic"); + + // Setup the light attenuation + pLight->setAttenuation(range, constant, linear, quadratic); +} + +Ogre::String DotSceneLoader::getAttrib(rapidxml::xml_node<>* xmlNode, const Ogre::String& attrib, const Ogre::String& defaultValue) +{ + if (xmlNode->first_attribute(attrib.c_str())) { return xmlNode->first_attribute(attrib.c_str())->value(); } + return defaultValue; +} + +Ogre::Real DotSceneLoader::getAttribReal(rapidxml::xml_node<>* xmlNode, const Ogre::String& attrib, const Ogre::Real defaultValue) +{ + if (xmlNode->first_attribute(attrib.c_str())) { return Ogre::StringConverter::parseReal(xmlNode->first_attribute(attrib.c_str())->value()); } + return defaultValue; +} + +bool DotSceneLoader::getAttribBool(rapidxml::xml_node<>* xmlNode, const Ogre::String& attrib, const bool defaultValue) +{ + if (!xmlNode->first_attribute(attrib.c_str())) { return defaultValue; } + + if (Ogre::String(xmlNode->first_attribute(attrib.c_str())->value()) == "true") { return true; } + + return false; +} + +Ogre::Vector3 DotSceneLoader::parseVector3(rapidxml::xml_node<>* xmlNode) +{ + return Ogre::Vector3(Ogre::StringConverter::parseReal(xmlNode->first_attribute("x")->value()), + Ogre::StringConverter::parseReal(xmlNode->first_attribute("y")->value()), + Ogre::StringConverter::parseReal(xmlNode->first_attribute("z")->value()) + ); +} + +Ogre::Quaternion DotSceneLoader::parseQuaternion(rapidxml::xml_node<>* xmlNode) +{ + //! @todo Fix this crap! + + Ogre::Quaternion orientation; + + if (xmlNode->first_attribute("qx")) + { + orientation.x = Ogre::StringConverter::parseReal(xmlNode->first_attribute("qx")->value()); + orientation.y = Ogre::StringConverter::parseReal(xmlNode->first_attribute("qy")->value()); + orientation.z = Ogre::StringConverter::parseReal(xmlNode->first_attribute("qz")->value()); + orientation.w = Ogre::StringConverter::parseReal(xmlNode->first_attribute("qw")->value()); + } + if (xmlNode->first_attribute("qw")) + { + orientation.w = Ogre::StringConverter::parseReal(xmlNode->first_attribute("qw")->value()); + orientation.x = Ogre::StringConverter::parseReal(xmlNode->first_attribute("qx")->value()); + orientation.y = Ogre::StringConverter::parseReal(xmlNode->first_attribute("qy")->value()); + orientation.z = Ogre::StringConverter::parseReal(xmlNode->first_attribute("qz")->value()); + } + else if (xmlNode->first_attribute("axisX")) + { + Ogre::Vector3 axis; + axis.x = Ogre::StringConverter::parseReal(xmlNode->first_attribute("axisX")->value()); + axis.y = Ogre::StringConverter::parseReal(xmlNode->first_attribute("axisY")->value()); + axis.z = Ogre::StringConverter::parseReal(xmlNode->first_attribute("axisZ")->value()); + const Ogre::Real angle = Ogre::StringConverter::parseReal(xmlNode->first_attribute("angle")->value()); + orientation.FromAngleAxis(Ogre::Angle(angle), axis); + } + else if (xmlNode->first_attribute("angleX")) + { + //Ogre::Vector3 axis; + //axis.x = Ogre::StringConverter::parseReal(xmlNode->first_attribute("angleX")->value()); + //axis.y = Ogre::StringConverter::parseReal(xmlNode->first_attribute("angleY")->value()); + //axis.z = Ogre::StringConverter::parseReal(xmlNode->first_attribute("angleZ")->value()); + //orientation.FromAxes(&axis); + //orientation.F + } + else if (xmlNode->first_attribute("x")) + { + orientation.x = Ogre::StringConverter::parseReal(xmlNode->first_attribute("x")->value()); + orientation.y = Ogre::StringConverter::parseReal(xmlNode->first_attribute("y")->value()); + orientation.z = Ogre::StringConverter::parseReal(xmlNode->first_attribute("z")->value()); + orientation.w = Ogre::StringConverter::parseReal(xmlNode->first_attribute("w")->value()); + } + else if (xmlNode->first_attribute("w")) + { + orientation.w = Ogre::StringConverter::parseReal(xmlNode->first_attribute("w")->value()); + orientation.x = Ogre::StringConverter::parseReal(xmlNode->first_attribute("x")->value()); + orientation.y = Ogre::StringConverter::parseReal(xmlNode->first_attribute("y")->value()); + orientation.z = Ogre::StringConverter::parseReal(xmlNode->first_attribute("z")->value()); + } + + return orientation; +} + +Ogre::ColourValue DotSceneLoader::parseColour(rapidxml::xml_node<>* xmlNode) +{ + return Ogre::ColourValue(Ogre::StringConverter::parseReal(xmlNode->first_attribute("r")->value()), + Ogre::StringConverter::parseReal(xmlNode->first_attribute("g")->value()), + Ogre::StringConverter::parseReal(xmlNode->first_attribute("b")->value()), + xmlNode->first_attribute("a") != nullptr ? Ogre::StringConverter::parseReal(xmlNode->first_attribute("a")->value()) : 1 + ); +} + +Ogre::String DotSceneLoader::getProperty(const Ogre::String& ndNm, const Ogre::String& prop) +{ + for (size_t i = 0; i < m_NodeProperties.size(); ++i) + { + if (m_NodeProperties[i].m_NodeName == ndNm && m_NodeProperties[i].m_PropertyName == prop) { return m_NodeProperties[i].m_ValueName; } + } + + return ""; +} + +void DotSceneLoader::processUserDataReference(rapidxml::xml_node<>* xmlNode, Ogre::Entity* pEntity) +{ + const Ogre::String str = xmlNode->first_attribute("id")->value(); + pEntity->getUserObjectBindings().setUserAny(Ogre::Any(str)); +} + +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/dotscene/DotSceneLoader.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/dotscene/DotSceneLoader.h new file mode 100755 index 0000000..0cd4037 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/dotscene/DotSceneLoader.h @@ -0,0 +1,130 @@ +/* + * @author Ogre + * @note This code likely originates from the Ogre project + * + */ +#pragma once + +// Includes +#include +#include +#include + +#include "rapidxml.hpp" + +// Forward declarations +namespace Ogre { +class SceneManager; +class SceneNode; +class TerrainGroup; +class TerrainGlobalOptions; +} + +/* +namespace Forests +{ + class PagedGeometry; + class TreeLoader3D; + class GrassLoader; + class GrassLayer; +} +*/ + +class nodeProperty +{ +public: + Ogre::String m_NodeName; + Ogre::String m_PropertyName; + Ogre::String m_ValueName; + Ogre::String m_TypeName; + + nodeProperty(const Ogre::String& node, const Ogre::String& propertyName, const Ogre::String& value, const Ogre::String& type) + : m_NodeName(node), m_PropertyName(propertyName), m_ValueName(value), m_TypeName(type) {} +}; + +class DotSceneLoader +{ +public: + Ogre::TerrainGlobalOptions* m_TerrainGlobalOptions = nullptr; + + DotSceneLoader(); + virtual ~DotSceneLoader(); + + void parseDotScene(const Ogre::String& sceneName, const Ogre::String& groupName, Ogre::SceneManager* yourSceneMgr, + Ogre::SceneNode* pAttachNode = nullptr, const Ogre::String& prependNode = ""); + Ogre::String getProperty(const Ogre::String& ndNm, const Ogre::String& prop); + + Ogre::String getResourceLocationBaseDir() const { return m_resLocationsBaseDir; } + void setResourceLocationBaseDir(const Ogre::String& newBaseDir) { m_resLocationsBaseDir = newBaseDir; } + + // Ogre::TerrainGroup* getTerrainGroup() { return mTerrainGroup; } + + + std::vector m_NodeProperties; + std::vector m_StaticObjects; + std::vector m_DynamicObjects; + // std::vector mPGHandles; + // std::vector mTreeHandles; + // Forests::GrassLoader* mGrassLoaderHandle; // Handle to Forests::GrassLoader object + std::vector m_ParticleSystemList; // contains all the Particle Systems created + +protected: + void processScene(rapidxml::xml_node<>* xmlRoot); + + void processNodes(rapidxml::xml_node<>* xmlNode); + //! @todo Implement this + static void processExternals(rapidxml::xml_node<>* /*xmlNode*/) { } + void processEnvironment(rapidxml::xml_node<>* xmlNode) const; + void processResourceLocations(rapidxml::xml_node<>* xmlNode) const; + // void processTerrain(rapidxml::xml_node<>* xmlNode); + // void processTerrainPage(rapidxml::xml_node<>* xmlNode); + // void processGrassLayers(rapidxml::xml_node<>* xmlNode); + // void processBlendmaps(rapidxml::xml_node<>* xmlNode); + static void processUserDataReference(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* pParent = nullptr); + static void processUserDataReference(rapidxml::xml_node<>* xmlNode, Ogre::Entity* pEntity); + static void processOctree(rapidxml::xml_node<>* xmlNode); + void processLight(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* parent = nullptr); + void processCamera(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* pParent = nullptr) const; + + void processNode(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* pParent = nullptr); + void processLookTarget(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* parent) const; + void processTrackTarget(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* pParent) const; + void processEntity(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* pParent); + static void processSubEntity(rapidxml::xml_node<>* xmlNode, Ogre::Entity* pEntity); + void processParticleSystem(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* pParent); + static void processBillboardSet(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* pParent); + void processPlane(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode* pParent) const; + // void processPagedGeometry(rapidxml::xml_node<>* xmlNode, Ogre::SceneNode *pParent); + + void processFog(rapidxml::xml_node<>* xmlNode) const; + void processSkyBox(rapidxml::xml_node<>* xmlNode) const; + void processSkyDome(rapidxml::xml_node<>* xmlNode) const; + void processSkyPlane(rapidxml::xml_node<>* xmlNode) const; + static void processClipping(rapidxml::xml_node<>* xmlNode); + + static void processLightRange(rapidxml::xml_node<>* xmlNode, Ogre::Light* pLight); + static void processLightAttenuation(rapidxml::xml_node<>* xmlNode, Ogre::Light* pLight); + + static Ogre::String getAttrib(rapidxml::xml_node<>* xmlNode, const Ogre::String& attrib, const Ogre::String& defaultValue = ""); + static Ogre::Real getAttribReal(rapidxml::xml_node<>* xmlNode, const Ogre::String& attrib, Ogre::Real defaultValue = 0); + static bool getAttribBool(rapidxml::xml_node<>* xmlNode, const Ogre::String& attrib, bool defaultValue = false); + + static Ogre::Vector3 parseVector3(rapidxml::xml_node<>* xmlNode); + static Ogre::Quaternion parseQuaternion(rapidxml::xml_node<>* xmlNode); + static Ogre::ColourValue parseColour(rapidxml::xml_node<>* xmlNode); + + + Ogre::SceneManager* m_sceneMgr = nullptr; + Ogre::SceneNode* m_attachNode = nullptr; + Ogre::String m_groupName; + Ogre::String m_prependNode; + // Ogre::TerrainGroup* mTerrainGroup = nullptr; + Ogre::Vector3 m_terrainPosition; + Ogre::Vector3 m_lightDirection; + + // paged geometry related values + // int mPGPageSize = 0; + // int mPGDetailDistance = 0; + // resource locations basedir + Ogre::String m_resLocationsBaseDir; +}; diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/dotscene/rapidxml.hpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/dotscene/rapidxml.hpp new file mode 100755 index 0000000..58bf79d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/dotscene/rapidxml.hpp @@ -0,0 +1,2587 @@ +#pragma once + +// Copyright (C) 2006, 2009 Marcin Kalicinski +// Version 1.13 +// Revision $DateTime: 2009/05/13 01:46:17 $ +//! \file rapidxml.hpp This file contains rapidxml parser and DOM implementation + +// If standard library is disabled, user must provide implementations of required functions and typedefs +#if !defined(RAPIDXML_NO_STDLIB) + #include // For std::size_t + #include // For assert + #include // For placement new +#endif + +// On MSVC, disable "conditional expression is constant" warning (level 4). +// This warning is almost impossible to avoid with certain types of templated code +#ifdef _MSC_VER + #pragma warning(push) + #pragma warning(disable:4127) // Conditional expression is constant +#endif + +/////////////////////////////////////////////////////////////////////////// +// RAPIDXML_PARSE_ERROR + +#if defined(RAPIDXML_NO_EXCEPTIONS) + +#define RAPIDXML_PARSE_ERROR(what, where) { parse_error_handler(what, where); assert(0); } + +namespace rapidxml +{ + //! When exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, + //! this function is called to notify user about the error. + //! It must be defined by the user. + //!

+ //! This function cannot return. If it does, the results are undefined. + //!

+ //! A very simple definition might look like that: + //!
+    //! void %rapidxml::%parse_error_handler(const char *what, void *where)
+    //! {
+    //!     std::cout << "Parse error: " << what << "\n";
+    //!     std::abort();
+    //! }
+    //! 
+ //! \param what Human readable description of the error. + //! \param where Pointer to character data where error was detected. + void parse_error_handler(const char *what, void *where); +} + +#else + +#include // For std::exception + +#define RAPIDXML_PARSE_ERROR(what, where) throw parse_error(what, where) + +namespace rapidxml +{ + + //! Parse error exception. + //! This exception is thrown by the parser when an error occurs. + //! Use what() function to get human-readable error message. + //! Use where() function to get a pointer to position within source text where error was detected. + //!

+ //! If throwing exceptions by the parser is undesirable, + //! it can be disabled by defining RAPIDXML_NO_EXCEPTIONS macro before rapidxml.hpp is included. + //! This will cause the parser to call rapidxml::parse_error_handler() function instead of throwing an exception. + //! This function must be defined by the user. + //!

+ //! This class derives from std::exception class. + class parse_error: public std::exception + { + + public: + + //! Constructs parse error + parse_error(const char *what, void *where) + : m_what(what), m_where(where) + { + } + + //! Gets human readable description of error. + //! \return Pointer to null terminated description of the error. + virtual const char *what() const throw() + { + return m_what; + } + + //! Gets pointer to character data where error happened. + //! Ch should be the same as char type of xml_document that produced the error. + //! \return Pointer to location within the parsed string where error occured. + template + Ch *where() const + { + return reinterpret_cast(m_where); + } + + private: + + const char *m_what; + void *m_where; + + }; +} + +#endif + +/////////////////////////////////////////////////////////////////////////// +// Pool sizes + +#ifndef RAPIDXML_STATIC_POOL_SIZE + // Size of static memory block of memory_pool. + // Define RAPIDXML_STATIC_POOL_SIZE before including rapidxml.hpp if you want to override the default value. + // No dynamic memory allocations are performed by memory_pool until static memory is exhausted. + #define RAPIDXML_STATIC_POOL_SIZE (64 * 1024) +#endif + +#ifndef RAPIDXML_DYNAMIC_POOL_SIZE + // Size of dynamic memory block of memory_pool. + // Define RAPIDXML_DYNAMIC_POOL_SIZE before including rapidxml.hpp if you want to override the default value. + // After the static block is exhausted, dynamic blocks with approximately this size are allocated by memory_pool. + #define RAPIDXML_DYNAMIC_POOL_SIZE (64 * 1024) +#endif + +#ifndef RAPIDXML_ALIGNMENT + // Memory allocation alignment. + // Define RAPIDXML_ALIGNMENT before including rapidxml.hpp if you want to override the default value, which is the size of pointer. + // All memory allocations for nodes, attributes and strings will be aligned to this value. + // This must be a power of 2 and at least 1, otherwise memory_pool will not work. + #define RAPIDXML_ALIGNMENT sizeof(void *) +#endif + +namespace rapidxml +{ + // Forward declarations + template class xml_node; + template class xml_attribute; + template class xml_document; + + //! Enumeration listing all node types produced by the parser. + //! Use xml_node::type() function to query node type. + enum node_type + { + node_document, ///< A document node. Name and value are empty. + node_element, ///< An element node. Name contains element name. Value contains text of first data node. + node_data, ///< A data node. Name is empty. Value contains data text. + node_cdata, ///< A CDATA node. Name is empty. Value contains data text. + node_comment, ///< A comment node. Name is empty. Value contains comment text. + node_declaration, ///< A declaration node. Name and value are empty. Declaration parameters (version, encoding and standalone) are in node attributes. + node_doctype, ///< A DOCTYPE node. Name is empty. Value contains DOCTYPE text. + node_pi ///< A PI node. Name contains target. Value contains instructions. + }; + + /////////////////////////////////////////////////////////////////////// + // Parsing flags + + //! Parse flag instructing the parser to not create data nodes. + //! Text of first data node will still be placed in value of parent element, unless rapidxml::parse_no_element_values flag is also specified. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_no_data_nodes = 0x1; + + //! Parse flag instructing the parser to not use text of first data node as a value of parent element. + //! Can be combined with other flags by use of | operator. + //! Note that child data nodes of element node take precendence over its value when printing. + //! That is, if element has one or more child data nodes and a value, the value will be ignored. + //! Use rapidxml::parse_no_data_nodes flag to prevent creation of data nodes if you want to manipulate data using values of elements. + //!

+ //! See xml_document::parse() function. + const int parse_no_element_values = 0x2; + + //! Parse flag instructing the parser to not place zero terminators after strings in the source text. + //! By default zero terminators are placed, modifying source text. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_no_string_terminators = 0x4; + + //! Parse flag instructing the parser to not translate entities in the source text. + //! By default entities are translated, modifying source text. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_no_entity_translation = 0x8; + + //! Parse flag instructing the parser to disable UTF-8 handling and assume plain 8 bit characters. + //! By default, UTF-8 handling is enabled. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_no_utf8 = 0x10; + + //! Parse flag instructing the parser to create XML declaration node. + //! By default, declaration node is not created. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_declaration_node = 0x20; + + //! Parse flag instructing the parser to create comments nodes. + //! By default, comment nodes are not created. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_comment_nodes = 0x40; + + //! Parse flag instructing the parser to create DOCTYPE node. + //! By default, doctype node is not created. + //! Although W3C specification allows at most one DOCTYPE node, RapidXml will silently accept documents with more than one. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_doctype_node = 0x80; + + //! Parse flag instructing the parser to create PI nodes. + //! By default, PI nodes are not created. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_pi_nodes = 0x100; + + //! Parse flag instructing the parser to validate closing tag names. + //! If not set, name inside closing tag is irrelevant to the parser. + //! By default, closing tags are not validated. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_validate_closing_tags = 0x200; + + //! Parse flag instructing the parser to trim all leading and trailing whitespace of data nodes. + //! By default, whitespace is not trimmed. + //! This flag does not cause the parser to modify source text. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_trim_whitespace = 0x400; + + //! Parse flag instructing the parser to condense all whitespace runs of data nodes to a single space character. + //! Trimming of leading and trailing whitespace of data is controlled by rapidxml::parse_trim_whitespace flag. + //! By default, whitespace is not normalized. + //! If this flag is specified, source text will be modified. + //! Can be combined with other flags by use of | operator. + //!

+ //! See xml_document::parse() function. + const int parse_normalize_whitespace = 0x800; + + // Compound flags + + //! Parse flags which represent default behaviour of the parser. + //! This is always equal to 0, so that all other flags can be simply ored together. + //! Normally there is no need to inconveniently disable flags by anding with their negated (~) values. + //! This also means that meaning of each flag is a negation of the default setting. + //! For example, if flag name is rapidxml::parse_no_utf8, it means that utf-8 is enabled by default, + //! and using the flag will disable it. + //!

+ //! See xml_document::parse() function. + const int parse_default = 0; + + //! A combination of parse flags that forbids any modifications of the source text. + //! This also results in faster parsing. However, note that the following will occur: + //!
    + //!
  • names and values of nodes will not be zero terminated, you have to use xml_base::name_size() and xml_base::value_size() functions to determine where name and value ends
  • + //!
  • entities will not be translated
  • + //!
  • whitespace will not be normalized
  • + //!
+ //! See xml_document::parse() function. + const int parse_non_destructive = parse_no_string_terminators | parse_no_entity_translation; + + //! A combination of parse flags resulting in fastest possible parsing, without sacrificing important data. + //!

+ //! See xml_document::parse() function. + const int parse_fastest = parse_non_destructive | parse_no_data_nodes; + + //! A combination of parse flags resulting in largest amount of data being extracted. + //! This usually results in slowest parsing. + //!

+ //! See xml_document::parse() function. + const int parse_full = parse_declaration_node | parse_comment_nodes | parse_doctype_node | parse_pi_nodes | parse_validate_closing_tags; + + /////////////////////////////////////////////////////////////////////// + // Internals + + //! \cond internal + namespace internal + { + + // Struct that contains lookup tables for the parser + // It must be a template to allow correct linking (because it has static data members, which are defined in a header file). + template + struct lookup_tables + { + static const unsigned char lookup_whitespace[256]; // Whitespace table + static const unsigned char lookup_node_name[256]; // Node name table + static const unsigned char lookup_text[256]; // Text table + static const unsigned char lookup_text_pure_no_ws[256]; // Text table + static const unsigned char lookup_text_pure_with_ws[256]; // Text table + static const unsigned char lookup_attribute_name[256]; // Attribute name table + static const unsigned char lookup_attribute_data_1[256]; // Attribute data table with single quote + static const unsigned char lookup_attribute_data_1_pure[256]; // Attribute data table with single quote + static const unsigned char lookup_attribute_data_2[256]; // Attribute data table with double quotes + static const unsigned char lookup_attribute_data_2_pure[256]; // Attribute data table with double quotes + static const unsigned char lookup_digits[256]; // Digits + static const unsigned char lookup_upcase[256]; // To uppercase conversion table for ASCII characters + }; + + // Find length of the string + template + inline std::size_t measure(const Ch *p) + { + const Ch *tmp = p; + while (*tmp) + ++tmp; + return tmp - p; + } + + // Compare strings for equality + template + inline bool compare(const Ch *p1, std::size_t size1, const Ch *p2, std::size_t size2, bool case_sensitive) + { + if (size1 != size2) + return false; + if (case_sensitive) + { + for (const Ch *end = p1 + size1; p1 < end; ++p1, ++p2) + if (*p1 != *p2) + return false; + } + else + { + for (const Ch *end = p1 + size1; p1 < end; ++p1, ++p2) + if (lookup_tables<0>::lookup_upcase[static_cast(*p1)] != lookup_tables<0>::lookup_upcase[static_cast(*p2)]) + return false; + } + return true; + } + } + //! \endcond + + /////////////////////////////////////////////////////////////////////// + // Memory pool + + //! This class is used by the parser to create new nodes and attributes, without overheads of dynamic memory allocation. + //! In most cases, you will not need to use this class directly. + //! However, if you need to create nodes manually or modify names/values of nodes, + //! you are encouraged to use memory_pool of relevant xml_document to allocate the memory. + //! Not only is this faster than allocating them by using new operator, + //! but also their lifetime will be tied to the lifetime of document, + //! possibly simplyfing memory management. + //!

+ //! Call allocate_node() or allocate_attribute() functions to obtain new nodes or attributes from the pool. + //! You can also call allocate_string() function to allocate strings. + //! Such strings can then be used as names or values of nodes without worrying about their lifetime. + //! Note that there is no free() function -- all allocations are freed at once when clear() function is called, + //! or when the pool is destroyed. + //!

+ //! It is also possible to create a standalone memory_pool, and use it + //! to allocate nodes, whose lifetime will not be tied to any document. + //!

+ //! Pool maintains RAPIDXML_STATIC_POOL_SIZE bytes of statically allocated memory. + //! Until static memory is exhausted, no dynamic memory allocations are done. + //! When static memory is exhausted, pool allocates additional blocks of memory of size RAPIDXML_DYNAMIC_POOL_SIZE each, + //! by using global new[] and delete[] operators. + //! This behaviour can be changed by setting custom allocation routines. + //! Use set_allocator() function to set them. + //!

+ //! Allocations for nodes, attributes and strings are aligned at RAPIDXML_ALIGNMENT bytes. + //! This value defaults to the size of pointer on target architecture. + //!

+ //! To obtain absolutely top performance from the parser, + //! it is important that all nodes are allocated from a single, contiguous block of memory. + //! Otherwise, cache misses when jumping between two (or more) disjoint blocks of memory can slow down parsing quite considerably. + //! If required, you can tweak RAPIDXML_STATIC_POOL_SIZE, RAPIDXML_DYNAMIC_POOL_SIZE and RAPIDXML_ALIGNMENT + //! to obtain best wasted memory to performance compromise. + //! To do it, define their values before rapidxml.hpp file is included. + //! \param Ch Character type of created nodes. + template + class memory_pool + { + + public: + + //! \cond internal + typedef void *(alloc_func)(std::size_t); // Type of user-defined function used to allocate memory + typedef void (free_func)(void *); // Type of user-defined function used to free memory + //! \endcond + + //! Constructs empty pool with default allocator functions. + memory_pool() + : m_alloc_func(0), m_free_func(0) + { + init(); + } + + //! Destroys pool and frees all the memory. + //! This causes memory occupied by nodes allocated by the pool to be freed. + //! Nodes allocated from the pool are no longer valid. + ~memory_pool() + { + clear(); + } + + //! Allocates a new node from the pool, and optionally assigns name and value to it. + //! If the allocation request cannot be accomodated, this function will throw std::bad_alloc. + //! If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function + //! will call rapidxml::parse_error_handler() function. + //! \param type Type of node to create. + //! \param name Name to assign to the node, or 0 to assign no name. + //! \param value Value to assign to the node, or 0 to assign no value. + //! \param name_size Size of name to assign, or 0 to automatically calculate size from name string. + //! \param value_size Size of value to assign, or 0 to automatically calculate size from value string. + //! \return Pointer to allocated node. This pointer will never be nullptr. + xml_node *allocate_node(node_type type, + const Ch *name = 0, const Ch *value = 0, + std::size_t name_size = 0, std::size_t value_size = 0) + { + void *memory = allocate_aligned(sizeof(xml_node)); + xml_node *node = new(memory) xml_node(type); + if (name) + { + if (name_size > 0) + node->name(name, name_size); + else + node->name(name); + } + if (value) + { + if (value_size > 0) + node->value(value, value_size); + else + node->value(value); + } + return node; + } + + //! Allocates a new attribute from the pool, and optionally assigns name and value to it. + //! If the allocation request cannot be accomodated, this function will throw std::bad_alloc. + //! If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function + //! will call rapidxml::parse_error_handler() function. + //! \param name Name to assign to the attribute, or 0 to assign no name. + //! \param value Value to assign to the attribute, or 0 to assign no value. + //! \param name_size Size of name to assign, or 0 to automatically calculate size from name string. + //! \param value_size Size of value to assign, or 0 to automatically calculate size from value string. + //! \return Pointer to allocated attribute. This pointer will never be nullptr. + xml_attribute *allocate_attribute(const Ch *name = 0, const Ch *value = 0, + std::size_t name_size = 0, std::size_t value_size = 0) + { + void *memory = allocate_aligned(sizeof(xml_attribute)); + xml_attribute *attribute = new(memory) xml_attribute; + if (name) + { + if (name_size > 0) + attribute->name(name, name_size); + else + attribute->name(name); + } + if (value) + { + if (value_size > 0) + attribute->value(value, value_size); + else + attribute->value(value); + } + return attribute; + } + + //! Allocates a char array of given size from the pool, and optionally copies a given string to it. + //! If the allocation request cannot be accomodated, this function will throw std::bad_alloc. + //! If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function + //! will call rapidxml::parse_error_handler() function. + //! \param source String to initialize the allocated memory with, or 0 to not initialize it. + //! \param size Number of characters to allocate, or zero to calculate it automatically from source string length; if size is 0, source string must be specified and null terminated. + //! \return Pointer to allocated char array. This pointer will never be nullptr. + Ch *allocate_string(const Ch *source = 0, std::size_t size = 0) + { + assert(source || size); // Either source or size (or both) must be specified + if (size == 0) + size = internal::measure(source) + 1; + Ch *result = static_cast(allocate_aligned(size * sizeof(Ch))); + if (source) + for (std::size_t i = 0; i < size; ++i) + result[i] = source[i]; + return result; + } + + //! Clones an xml_node and its hierarchy of child nodes and attributes. + //! Nodes and attributes are allocated from this memory pool. + //! Names and values are not cloned, they are shared between the clone and the source. + //! Result node can be optionally specified as a second parameter, + //! in which case its contents will be replaced with cloned source node. + //! This is useful when you want to clone entire document. + //! \param source Node to clone. + //! \param result Node to put results in, or 0 to automatically allocate result node + //! \return Pointer to cloned node. This pointer will never be nullptr. + xml_node *clone_node(const xml_node *source, xml_node *result = 0) + { + // Prepare result node + if (result) + { + result->remove_all_attributes(); + result->remove_all_nodes(); + result->type(source->type()); + } + else + result = allocate_node(source->type()); + + // Clone name and value + result->name(source->name(), source->name_size()); + result->value(source->value(), source->value_size()); + + // Clone child nodes and attributes + for (xml_node *child = source->first_node(); child; child = child->next_sibling()) + result->append_node(clone_node(child)); + for (xml_attribute *attr = source->first_attribute(); attr; attr = attr->next_attribute()) + result->append_attribute(allocate_attribute(attr->name(), attr->value(), attr->name_size(), attr->value_size())); + + return result; + } + + //! Clears the pool. + //! This causes memory occupied by nodes allocated by the pool to be freed. + //! Any nodes or strings allocated from the pool will no longer be valid. + void clear() + { + while (m_begin != m_static_memory) + { + char *previous_begin = reinterpret_cast
(align(m_begin))->previous_begin; + if (m_free_func) + m_free_func(m_begin); + else + delete[] m_begin; + m_begin = previous_begin; + } + init(); + } + + //! Sets or resets the user-defined memory allocation functions for the pool. + //! This can only be called when no memory is allocated from the pool yet, otherwise results are undefined. + //! Allocation function must not return invalid pointer on failure. It should either throw, + //! stop the program, or use longjmp() function to pass control to other place of program. + //! If it returns invalid pointer, results are undefined. + //!

+ //! User defined allocation functions must have the following forms: + //!
+ //!
void *allocate(std::size_t size); + //!
void free(void *pointer); + //!

+ //! \param af Allocation function, or 0 to restore default function + //! \param ff Free function, or 0 to restore default function + void set_allocator(alloc_func *af, free_func *ff) + { + assert(m_begin == m_static_memory && m_ptr == align(m_begin)); // Verify that no memory is allocated yet + m_alloc_func = af; + m_free_func = ff; + } + + private: + + struct header + { + char *previous_begin; + }; + + void init() + { + m_begin = m_static_memory; + m_ptr = align(m_begin); + m_end = m_static_memory + sizeof(m_static_memory); + } + + char *align(char *ptr) + { + std::size_t alignment = ((RAPIDXML_ALIGNMENT - (std::size_t(ptr) & (RAPIDXML_ALIGNMENT - 1))) & (RAPIDXML_ALIGNMENT - 1)); + return ptr + alignment; + } + + char *allocate_raw(std::size_t size) + { + // Allocate + void *memory; + if (m_alloc_func) // Allocate memory using either user-specified allocation function or global operator new[] + { + memory = m_alloc_func(size); + assert(memory); // Allocator is not allowed to return 0, on failure it must either throw, stop the program or use longjmp + } + else + { + memory = new char[size]; +#ifdef RAPIDXML_NO_EXCEPTIONS + if (!memory) // If exceptions are disabled, verify memory allocation, because new will not be able to throw bad_alloc + RAPIDXML_PARSE_ERROR("out of memory", 0); +#endif + } + return static_cast(memory); + } + + void *allocate_aligned(std::size_t size) + { + // Calculate aligned pointer + char *result = align(m_ptr); + + // If not enough memory left in current pool, allocate a new pool + if (result + size > m_end) + { + // Calculate required pool size (may be bigger than RAPIDXML_DYNAMIC_POOL_SIZE) + std::size_t pool_size = RAPIDXML_DYNAMIC_POOL_SIZE; + if (pool_size < size) + pool_size = size; + + // Allocate + std::size_t alloc_size = sizeof(header) + (2 * RAPIDXML_ALIGNMENT - 2) + pool_size; // 2 alignments required in worst case: one for header, one for actual allocation + char *raw_memory = allocate_raw(alloc_size); + + // Setup new pool in allocated memory + char *pool = align(raw_memory); + header *new_header = reinterpret_cast
(pool); + new_header->previous_begin = m_begin; + m_begin = raw_memory; + m_ptr = pool + sizeof(header); + m_end = raw_memory + alloc_size; + + // Calculate aligned pointer again using new pool + result = align(m_ptr); + } + + // Update pool and return aligned pointer + m_ptr = result + size; + return result; + } + + char *m_begin; // Start of raw memory making up current pool + char *m_ptr; // First free byte in current pool + char *m_end; // One past last available byte in current pool + char m_static_memory[RAPIDXML_STATIC_POOL_SIZE]; // Static raw memory + alloc_func *m_alloc_func; // Allocator function, or 0 if default is to be used + free_func *m_free_func; // Free function, or 0 if default is to be used + }; + + /////////////////////////////////////////////////////////////////////////// + // XML base + + //! Base class for xml_node and xml_attribute implementing common functions: + //! name(), name_size(), value(), value_size() and parent(). + //! \param Ch Character type to use + template + class xml_base + { + + public: + + /////////////////////////////////////////////////////////////////////////// + // Construction & destruction + + // Construct a base with empty name, value and parent + xml_base() + : m_name(0), m_value(0), m_parent(0) + { + } + + /////////////////////////////////////////////////////////////////////////// + // Node data access + + //! Gets name of the node. + //! Interpretation of name depends on type of node. + //! Note that name will not be zero-terminated if rapidxml::parse_no_string_terminators option was selected during parse. + //!

+ //! Use name_size() function to determine length of the name. + //! \return Name of node, or empty string if node has no name. + Ch *name() const + { + return m_name ? m_name : nullstr(); + } + + //! Gets size of node name, not including terminator character. + //! This function works correctly irrespective of whether name is or is not zero terminated. + //! \return Size of node name, in characters. + std::size_t name_size() const + { + return m_name ? m_name_size : 0; + } + + //! Gets value of node. + //! Interpretation of value depends on type of node. + //! Note that value will not be zero-terminated if rapidxml::parse_no_string_terminators option was selected during parse. + //!

+ //! Use value_size() function to determine length of the value. + //! \return Value of node, or empty string if node has no value. + Ch *value() const + { + return m_value ? m_value : nullstr(); + } + + //! Gets size of node value, not including terminator character. + //! This function works correctly irrespective of whether value is or is not zero terminated. + //! \return Size of node value, in characters. + std::size_t value_size() const + { + return m_value ? m_value_size : 0; + } + + /////////////////////////////////////////////////////////////////////////// + // Node modification + + //! Sets name of node to a non zero-terminated string. + //! See \ref ownership_of_strings. + //!

+ //! Note that node does not own its name or value, it only stores a pointer to it. + //! It will not delete or otherwise free the pointer on destruction. + //! It is reponsibility of the user to properly manage lifetime of the string. + //! The easiest way to achieve it is to use memory_pool of the document to allocate the string - + //! on destruction of the document the string will be automatically freed. + //!

+ //! Size of name must be specified separately, because name does not have to be zero terminated. + //! Use name(const Ch *) function to have the length automatically calculated (string must be zero terminated). + //! \param name Name of node to set. Does not have to be zero terminated. + //! \param size Size of name, in characters. This does not include zero terminator, if one is present. + void name(const Ch *name, std::size_t size) + { + m_name = const_cast(name); + m_name_size = size; + } + + //! Sets name of node to a zero-terminated string. + //! See also \ref ownership_of_strings and xml_node::name(const Ch *, std::size_t). + //! \param name Name of node to set. Must be zero terminated. + void name(const Ch *name) + { + this->name(name, internal::measure(name)); + } + + //! Sets value of node to a non zero-terminated string. + //! See \ref ownership_of_strings. + //!

+ //! Note that node does not own its name or value, it only stores a pointer to it. + //! It will not delete or otherwise free the pointer on destruction. + //! It is reponsibility of the user to properly manage lifetime of the string. + //! The easiest way to achieve it is to use memory_pool of the document to allocate the string - + //! on destruction of the document the string will be automatically freed. + //!

+ //! Size of value must be specified separately, because it does not have to be zero terminated. + //! Use value(const Ch *) function to have the length automatically calculated (string must be zero terminated). + //!

+ //! If an element has a child node of type node_data, it will take precedence over element value when printing. + //! If you want to manipulate data of elements using values, use parser flag rapidxml::parse_no_data_nodes to prevent creation of data nodes by the parser. + //! \param value value of node to set. Does not have to be zero terminated. + //! \param size Size of value, in characters. This does not include zero terminator, if one is present. + void value(const Ch *value, std::size_t size) + { + m_value = const_cast(value); + m_value_size = size; + } + + //! Sets value of node to a zero-terminated string. + //! See also \ref ownership_of_strings and xml_node::value(const Ch *, std::size_t). + //! \param value Vame of node to set. Must be zero terminated. + void value(const Ch *value) + { + this->value(value, internal::measure(value)); + } + + /////////////////////////////////////////////////////////////////////////// + // Related nodes access + + //! Gets node parent. + //! \return Pointer to parent node, or 0 if there is no parent. + xml_node *parent() const + { + return m_parent; + } + + protected: + + // Return empty string + static Ch *nullstr() + { + static Ch zero = Ch('\0'); + return &zero; + } + + Ch *m_name; // Name of node, or 0 if no name + Ch *m_value; // Value of node, or 0 if no value + std::size_t m_name_size; // Length of node name, or undefined of no name + std::size_t m_value_size; // Length of node value, or undefined if no value + xml_node *m_parent; // Pointer to parent node, or 0 if none + + }; + + //! Class representing attribute node of XML document. + //! Each attribute has name and value strings, which are available through name() and value() functions (inherited from xml_base). + //! Note that after parse, both name and value of attribute will point to interior of source text used for parsing. + //! Thus, this text must persist in memory for the lifetime of attribute. + //! \param Ch Character type to use. + template + class xml_attribute: public xml_base + { + + friend class xml_node; + + public: + + /////////////////////////////////////////////////////////////////////////// + // Construction & destruction + + //! Constructs an empty attribute with the specified type. + //! Consider using memory_pool of appropriate xml_document if allocating attributes manually. + xml_attribute() + { + } + + /////////////////////////////////////////////////////////////////////////// + // Related nodes access + + //! Gets document of which attribute is a child. + //! \return Pointer to document that contains this attribute, or 0 if there is no parent document. + xml_document *document() const + { + if (xml_node *node = this->parent()) + { + while (node->parent()) + node = node->parent(); + return node->type() == node_document ? static_cast *>(node) : 0; + } + else + return 0; + } + + //! Gets previous attribute, optionally matching attribute name. + //! \param name Name of attribute to find, or 0 to return previous attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found attribute, or 0 if not found. + xml_attribute *previous_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_attribute *attribute = m_prev_attribute; attribute; attribute = attribute->m_prev_attribute) + if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive)) + return attribute; + return 0; + } + else + return this->m_parent ? m_prev_attribute : 0; + } + + //! Gets next attribute, optionally matching attribute name. + //! \param name Name of attribute to find, or 0 to return next attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found attribute, or 0 if not found. + xml_attribute *next_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_attribute *attribute = m_next_attribute; attribute; attribute = attribute->m_next_attribute) + if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive)) + return attribute; + return 0; + } + else + return this->m_parent ? m_next_attribute : 0; + } + + private: + + xml_attribute *m_prev_attribute; // Pointer to previous sibling of attribute, or 0 if none; only valid if parent is non-zero + xml_attribute *m_next_attribute; // Pointer to next sibling of attribute, or 0 if none; only valid if parent is non-zero + + }; + + /////////////////////////////////////////////////////////////////////////// + // XML node + + //! Class representing a node of XML document. + //! Each node may have associated name and value strings, which are available through name() and value() functions. + //! Interpretation of name and value depends on type of the node. + //! Type of node can be determined by using type() function. + //!

+ //! Note that after parse, both name and value of node, if any, will point interior of source text used for parsing. + //! Thus, this text must persist in the memory for the lifetime of node. + //! \param Ch Character type to use. + template + class xml_node: public xml_base + { + + public: + + /////////////////////////////////////////////////////////////////////////// + // Construction & destruction + + //! Constructs an empty node with the specified type. + //! Consider using memory_pool of appropriate document to allocate nodes manually. + //! \param type Type of node to construct. + xml_node(node_type type) + : m_type(type), m_first_node(0), m_first_attribute(0) + { + } + + /////////////////////////////////////////////////////////////////////////// + // Node data access + + //! Gets type of node. + //! \return Type of node. + node_type type() const + { + return m_type; + } + + /////////////////////////////////////////////////////////////////////////// + // Related nodes access + + //! Gets document of which node is a child. + //! \return Pointer to document that contains this node, or 0 if there is no parent document. + xml_document *document() const + { + xml_node *node = const_cast *>(this); + while (node->parent()) + node = node->parent(); + return node->type() == node_document ? static_cast *>(node) : 0; + } + + //! Gets first child node, optionally matching node name. + //! \param name Name of child to find, or 0 to return first child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found child, or 0 if not found. + xml_node *first_node(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_node *child = m_first_node; child; child = child->next_sibling()) + if (internal::compare(child->name(), child->name_size(), name, name_size, case_sensitive)) + return child; + return 0; + } + else + return m_first_node; + } + + //! Gets last child node, optionally matching node name. + //! Behaviour is undefined if node has no children. + //! Use first_node() to test if node has children. + //! \param name Name of child to find, or 0 to return last child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found child, or 0 if not found. + xml_node *last_node(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + assert(m_first_node); // Cannot query for last child if node has no children + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_node *child = m_last_node; child; child = child->previous_sibling()) + if (internal::compare(child->name(), child->name_size(), name, name_size, case_sensitive)) + return child; + return 0; + } + else + return m_last_node; + } + + //! Gets previous sibling node, optionally matching node name. + //! Behaviour is undefined if node has no parent. + //! Use parent() to test if node has a parent. + //! \param name Name of sibling to find, or 0 to return previous sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found sibling, or 0 if not found. + xml_node *previous_sibling(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + assert(this->m_parent); // Cannot query for siblings if node has no parent + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_node *sibling = m_prev_sibling; sibling; sibling = sibling->m_prev_sibling) + if (internal::compare(sibling->name(), sibling->name_size(), name, name_size, case_sensitive)) + return sibling; + return 0; + } + else + return m_prev_sibling; + } + + //! Gets next sibling node, optionally matching node name. + //! Behaviour is undefined if node has no parent. + //! Use parent() to test if node has a parent. + //! \param name Name of sibling to find, or 0 to return next sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found sibling, or 0 if not found. + xml_node *next_sibling(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + assert(this->m_parent); // Cannot query for siblings if node has no parent + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_node *sibling = m_next_sibling; sibling; sibling = sibling->m_next_sibling) + if (internal::compare(sibling->name(), sibling->name_size(), name, name_size, case_sensitive)) + return sibling; + return 0; + } + else + return m_next_sibling; + } + + //! Gets first attribute of node, optionally matching attribute name. + //! \param name Name of attribute to find, or 0 to return first attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found attribute, or 0 if not found. + xml_attribute *first_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_attribute *attribute = m_first_attribute; attribute; attribute = attribute->m_next_attribute) + if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive)) + return attribute; + return 0; + } + else + return m_first_attribute; + } + + //! Gets last attribute of node, optionally matching attribute name. + //! \param name Name of attribute to find, or 0 to return last attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero + //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string + //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters + //! \return Pointer to found attribute, or 0 if not found. + xml_attribute *last_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const + { + if (name) + { + if (name_size == 0) + name_size = internal::measure(name); + for (xml_attribute *attribute = m_last_attribute; attribute; attribute = attribute->m_prev_attribute) + if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive)) + return attribute; + return 0; + } + else + return m_first_attribute ? m_last_attribute : 0; + } + + /////////////////////////////////////////////////////////////////////////// + // Node modification + + //! Sets type of node. + //! \param type Type of node to set. + void type(node_type type) + { + m_type = type; + } + + /////////////////////////////////////////////////////////////////////////// + // Node manipulation + + //! Prepends a new child node. + //! The prepended child becomes the first child, and all existing children are moved one position back. + //! \param child Node to prepend. + void prepend_node(xml_node *child) + { + assert(child && !child->parent() && child->type() != node_document); + if (first_node()) + { + child->m_next_sibling = m_first_node; + m_first_node->m_prev_sibling = child; + } + else + { + child->m_next_sibling = 0; + m_last_node = child; + } + m_first_node = child; + child->m_parent = this; + child->m_prev_sibling = 0; + } + + //! Appends a new child node. + //! The appended child becomes the last child. + //! \param child Node to append. + void append_node(xml_node *child) + { + assert(child && !child->parent() && child->type() != node_document); + if (first_node()) + { + child->m_prev_sibling = m_last_node; + m_last_node->m_next_sibling = child; + } + else + { + child->m_prev_sibling = 0; + m_first_node = child; + } + m_last_node = child; + child->m_parent = this; + child->m_next_sibling = 0; + } + + //! Inserts a new child node at specified place inside the node. + //! All children after and including the specified node are moved one position back. + //! \param where Place where to insert the child, or 0 to insert at the back. + //! \param child Node to insert. + void insert_node(xml_node *where, xml_node *child) + { + assert(!where || where->parent() == this); + assert(child && !child->parent() && child->type() != node_document); + if (where == m_first_node) + prepend_node(child); + else if (where == 0) + append_node(child); + else + { + child->m_prev_sibling = where->m_prev_sibling; + child->m_next_sibling = where; + where->m_prev_sibling->m_next_sibling = child; + where->m_prev_sibling = child; + child->m_parent = this; + } + } + + //! Removes first child node. + //! If node has no children, behaviour is undefined. + //! Use first_node() to test if node has children. + void remove_first_node() + { + assert(first_node()); + xml_node *child = m_first_node; + m_first_node = child->m_next_sibling; + if (child->m_next_sibling) + child->m_next_sibling->m_prev_sibling = 0; + else + m_last_node = 0; + child->m_parent = 0; + } + + //! Removes last child of the node. + //! If node has no children, behaviour is undefined. + //! Use first_node() to test if node has children. + void remove_last_node() + { + assert(first_node()); + xml_node *child = m_last_node; + if (child->m_prev_sibling) + { + m_last_node = child->m_prev_sibling; + child->m_prev_sibling->m_next_sibling = 0; + } + else + m_first_node = 0; + child->m_parent = 0; + } + + //! Removes specified child from the node + // \param where Pointer to child to be removed. + void remove_node(xml_node *where) + { + assert(where && where->parent() == this); + assert(first_node()); + if (where == m_first_node) + remove_first_node(); + else if (where == m_last_node) + remove_last_node(); + else + { + where->m_prev_sibling->m_next_sibling = where->m_next_sibling; + where->m_next_sibling->m_prev_sibling = where->m_prev_sibling; + where->m_parent = 0; + } + } + + //! Removes all child nodes (but not attributes). + void remove_all_nodes() + { + for (xml_node *node = first_node(); node; node = node->m_next_sibling) + node->m_parent = 0; + m_first_node = 0; + } + + //! Prepends a new attribute to the node. + //! \param attribute Attribute to prepend. + void prepend_attribute(xml_attribute *attribute) + { + assert(attribute && !attribute->parent()); + if (first_attribute()) + { + attribute->m_next_attribute = m_first_attribute; + m_first_attribute->m_prev_attribute = attribute; + } + else + { + attribute->m_next_attribute = 0; + m_last_attribute = attribute; + } + m_first_attribute = attribute; + attribute->m_parent = this; + attribute->m_prev_attribute = 0; + } + + //! Appends a new attribute to the node. + //! \param attribute Attribute to append. + void append_attribute(xml_attribute *attribute) + { + assert(attribute && !attribute->parent()); + if (first_attribute()) + { + attribute->m_prev_attribute = m_last_attribute; + m_last_attribute->m_next_attribute = attribute; + } + else + { + attribute->m_prev_attribute = 0; + m_first_attribute = attribute; + } + m_last_attribute = attribute; + attribute->m_parent = this; + attribute->m_next_attribute = 0; + } + + //! Inserts a new attribute at specified place inside the node. + //! All attributes after and including the specified attribute are moved one position back. + //! \param where Place where to insert the attribute, or 0 to insert at the back. + //! \param attribute Attribute to insert. + void insert_attribute(xml_attribute *where, xml_attribute *attribute) + { + assert(!where || where->parent() == this); + assert(attribute && !attribute->parent()); + if (where == m_first_attribute) + prepend_attribute(attribute); + else if (where == 0) + append_attribute(attribute); + else + { + attribute->m_prev_attribute = where->m_prev_attribute; + attribute->m_next_attribute = where; + where->m_prev_attribute->m_next_attribute = attribute; + where->m_prev_attribute = attribute; + attribute->m_parent = this; + } + } + + //! Removes first attribute of the node. + //! If node has no attributes, behaviour is undefined. + //! Use first_attribute() to test if node has attributes. + void remove_first_attribute() + { + assert(first_attribute()); + xml_attribute *attribute = m_first_attribute; + if (attribute->m_next_attribute) + { + attribute->m_next_attribute->m_prev_attribute = 0; + } + else + m_last_attribute = 0; + attribute->m_parent = 0; + m_first_attribute = attribute->m_next_attribute; + } + + //! Removes last attribute of the node. + //! If node has no attributes, behaviour is undefined. + //! Use first_attribute() to test if node has attributes. + void remove_last_attribute() + { + assert(first_attribute()); + xml_attribute *attribute = m_last_attribute; + if (attribute->m_prev_attribute) + { + attribute->m_prev_attribute->m_next_attribute = 0; + m_last_attribute = attribute->m_prev_attribute; + } + else + m_first_attribute = 0; + attribute->m_parent = 0; + } + + //! Removes specified attribute from node. + //! \param where Pointer to attribute to be removed. + void remove_attribute(xml_attribute *where) + { + assert(first_attribute() && where->parent() == this); + if (where == m_first_attribute) + remove_first_attribute(); + else if (where == m_last_attribute) + remove_last_attribute(); + else + { + where->m_prev_attribute->m_next_attribute = where->m_next_attribute; + where->m_next_attribute->m_prev_attribute = where->m_prev_attribute; + where->m_parent = 0; + } + } + + //! Removes all attributes of node. + void remove_all_attributes() + { + for (xml_attribute *attribute = first_attribute(); attribute; attribute = attribute->m_next_attribute) + attribute->m_parent = 0; + m_first_attribute = 0; + } + + private: + + /////////////////////////////////////////////////////////////////////////// + // Restrictions + + // No copying + xml_node(const xml_node &); + void operator =(const xml_node &); + + /////////////////////////////////////////////////////////////////////////// + // Data members + + // Note that some of the pointers below have UNDEFINED values if certain other pointers are 0. + // This is required for maximum performance, as it allows the parser to omit initialization of + // unneded/redundant values. + // + // The rules are as follows: + // 1. first_node and first_attribute contain valid pointers, or 0 if node has no children/attributes respectively + // 2. last_node and last_attribute are valid only if node has at least one child/attribute respectively, otherwise they contain garbage + // 3. prev_sibling and next_sibling are valid only if node has a parent, otherwise they contain garbage + + node_type m_type; // Type of node; always valid + xml_node *m_first_node; // Pointer to first child node, or 0 if none; always valid + xml_node *m_last_node; // Pointer to last child node, or 0 if none; this value is only valid if m_first_node is non-zero + xml_attribute *m_first_attribute; // Pointer to first attribute of node, or 0 if none; always valid + xml_attribute *m_last_attribute; // Pointer to last attribute of node, or 0 if none; this value is only valid if m_first_attribute is non-zero + xml_node *m_prev_sibling; // Pointer to previous sibling of node, or 0 if none; this value is only valid if m_parent is non-zero + xml_node *m_next_sibling; // Pointer to next sibling of node, or 0 if none; this value is only valid if m_parent is non-zero + + }; + + /////////////////////////////////////////////////////////////////////////// + // XML document + + //! This class represents root of the DOM hierarchy. + //! It is also an xml_node and a memory_pool through public inheritance. + //! Use parse() function to build a DOM tree from a zero-terminated XML text string. + //! parse() function allocates memory for nodes and attributes by using functions of xml_document, + //! which are inherited from memory_pool. + //! To access root node of the document, use the document itself, as if it was an xml_node. + //! \param Ch Character type to use. + template + class xml_document: public xml_node, public memory_pool + { + + public: + + //! Constructs empty XML document + xml_document() + : xml_node(node_document) + { + } + + //! Parses zero-terminated XML string according to given flags. + //! Passed string will be modified by the parser, unless rapidxml::parse_non_destructive flag is used. + //! The string must persist for the lifetime of the document. + //! In case of error, rapidxml::parse_error exception will be thrown. + //!

+ //! If you want to parse contents of a file, you must first load the file into the memory, and pass pointer to its beginning. + //! Make sure that data is zero-terminated. + //!

+ //! Document can be parsed into multiple times. + //! Each new call to parse removes previous nodes and attributes (if any), but does not clear memory pool. + //! \param text XML data to parse; pointer is non-const to denote fact that this data may be modified by the parser. + template + void parse(Ch *text) + { + assert(text); + + // Remove current contents + this->remove_all_nodes(); + this->remove_all_attributes(); + + // Parse BOM, if any + parse_bom(text); + + // Parse children + while (1) + { + // Skip whitespace before node + skip(text); + if (*text == 0) + break; + + // Parse and append new child + if (*text == Ch('<')) + { + ++text; // Skip '<' + if (xml_node *node = parse_node(text)) + this->append_node(node); + } + else + RAPIDXML_PARSE_ERROR("expected <", text); + } + + } + + //! Clears the document by deleting all nodes and clearing the memory pool. + //! All nodes owned by document pool are destroyed. + void clear() + { + this->remove_all_nodes(); + this->remove_all_attributes(); + memory_pool::clear(); + } + + private: + + /////////////////////////////////////////////////////////////////////// + // Internal character utility functions + + // Detect whitespace character + struct whitespace_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_whitespace[static_cast(ch)]; + } + }; + + // Detect node name character + struct node_name_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_node_name[static_cast(ch)]; + } + }; + + // Detect attribute name character + struct attribute_name_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_attribute_name[static_cast(ch)]; + } + }; + + // Detect text character (PCDATA) + struct text_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_text[static_cast(ch)]; + } + }; + + // Detect text character (PCDATA) that does not require processing + struct text_pure_no_ws_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_text_pure_no_ws[static_cast(ch)]; + } + }; + + // Detect text character (PCDATA) that does not require processing + struct text_pure_with_ws_pred + { + static unsigned char test(Ch ch) + { + return internal::lookup_tables<0>::lookup_text_pure_with_ws[static_cast(ch)]; + } + }; + + // Detect attribute value character + template + struct attribute_value_pred + { + static unsigned char test(Ch ch) + { + if (Quote == Ch('\'')) + return internal::lookup_tables<0>::lookup_attribute_data_1[static_cast(ch)]; + if (Quote == Ch('\"')) + return internal::lookup_tables<0>::lookup_attribute_data_2[static_cast(ch)]; + return 0; // Should never be executed, to avoid warnings on Comeau + } + }; + + // Detect attribute value character + template + struct attribute_value_pure_pred + { + static unsigned char test(Ch ch) + { + if (Quote == Ch('\'')) + return internal::lookup_tables<0>::lookup_attribute_data_1_pure[static_cast(ch)]; + if (Quote == Ch('\"')) + return internal::lookup_tables<0>::lookup_attribute_data_2_pure[static_cast(ch)]; + return 0; // Should never be executed, to avoid warnings on Comeau + } + }; + + // Insert coded character, using UTF8 or 8-bit ASCII + template + static void insert_coded_character(Ch *&text, unsigned long code) + { + if (Flags & parse_no_utf8) + { + // Insert 8-bit ASCII character + // Todo: possibly verify that code is less than 256 and use replacement char otherwise? + text[0] = static_cast(code); + text += 1; + } + else + { + // Insert UTF8 sequence + if (code < 0x80) // 1 byte sequence + { + text[0] = static_cast(code); + text += 1; + } + else if (code < 0x800) // 2 byte sequence + { + text[1] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[0] = static_cast(code | 0xC0); + text += 2; + } + else if (code < 0x10000) // 3 byte sequence + { + text[2] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[1] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[0] = static_cast(code | 0xE0); + text += 3; + } + else if (code < 0x110000) // 4 byte sequence + { + text[3] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[2] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[1] = static_cast((code | 0x80) & 0xBF); code >>= 6; + text[0] = static_cast(code | 0xF0); + text += 4; + } + else // Invalid, only codes up to 0x10FFFF are allowed in Unicode + { + RAPIDXML_PARSE_ERROR("invalid numeric character entity", text); + } + } + } + + // Skip characters until predicate evaluates to true + template + static void skip(Ch *&text) + { + Ch *tmp = text; + while (StopPred::test(*tmp)) + ++tmp; + text = tmp; + } + + // Skip characters until predicate evaluates to true while doing the following: + // - replacing XML character entity references with proper characters (' & " < > &#...;) + // - condensing whitespace sequences to single space character + template + static Ch *skip_and_expand_character_refs(Ch *&text) + { + // If entity translation, whitespace condense and whitespace trimming is disabled, use plain skip + if (Flags & parse_no_entity_translation && + !(Flags & parse_normalize_whitespace) && + !(Flags & parse_trim_whitespace)) + { + skip(text); + return text; + } + + // Use simple skip until first modification is detected + skip(text); + + // Use translation skip + Ch *src = text; + Ch *dest = src; + while (StopPred::test(*src)) + { + // If entity translation is enabled + if (!(Flags & parse_no_entity_translation)) + { + // Test if replacement is needed + if (src[0] == Ch('&')) + { + switch (src[1]) + { + + // & ' + case Ch('a'): + if (src[2] == Ch('m') && src[3] == Ch('p') && src[4] == Ch(';')) + { + *dest = Ch('&'); + ++dest; + src += 5; + continue; + } + if (src[2] == Ch('p') && src[3] == Ch('o') && src[4] == Ch('s') && src[5] == Ch(';')) + { + *dest = Ch('\''); + ++dest; + src += 6; + continue; + } + break; + + // " + case Ch('q'): + if (src[2] == Ch('u') && src[3] == Ch('o') && src[4] == Ch('t') && src[5] == Ch(';')) + { + *dest = Ch('"'); + ++dest; + src += 6; + continue; + } + break; + + // > + case Ch('g'): + if (src[2] == Ch('t') && src[3] == Ch(';')) + { + *dest = Ch('>'); + ++dest; + src += 4; + continue; + } + break; + + // < + case Ch('l'): + if (src[2] == Ch('t') && src[3] == Ch(';')) + { + *dest = Ch('<'); + ++dest; + src += 4; + continue; + } + break; + + // &#...; - assumes ASCII + case Ch('#'): + if (src[2] == Ch('x')) + { + unsigned long code = 0; + src += 3; // Skip &#x + while (1) + { + unsigned char digit = internal::lookup_tables<0>::lookup_digits[static_cast(*src)]; + if (digit == 0xFF) + break; + code = code * 16 + digit; + ++src; + } + insert_coded_character(dest, code); // Put character in output + } + else + { + unsigned long code = 0; + src += 2; // Skip &# + while (1) + { + unsigned char digit = internal::lookup_tables<0>::lookup_digits[static_cast(*src)]; + if (digit == 0xFF) + break; + code = code * 10 + digit; + ++src; + } + insert_coded_character(dest, code); // Put character in output + } + if (*src == Ch(';')) + ++src; + else + RAPIDXML_PARSE_ERROR("expected ;", src); + continue; + + // Something else + default: + // Ignore, just copy '&' verbatim + break; + + } + } + } + + // If whitespace condensing is enabled + if (Flags & parse_normalize_whitespace) + { + // Test if condensing is needed + if (whitespace_pred::test(*src)) + { + *dest = Ch(' '); ++dest; // Put single space in dest + ++src; // Skip first whitespace char + // Skip remaining whitespace chars + while (whitespace_pred::test(*src)) + ++src; + continue; + } + } + + // No replacement, only copy character + *dest++ = *src++; + + } + + // Return new end + text = src; + return dest; + + } + + /////////////////////////////////////////////////////////////////////// + // Internal parsing functions + + // Parse BOM, if any + template + void parse_bom(Ch *&text) + { + // UTF-8? + if (static_cast(text[0]) == 0xEF && + static_cast(text[1]) == 0xBB && + static_cast(text[2]) == 0xBF) + { + text += 3; // Skup utf-8 bom + } + } + + // Parse XML declaration ( + xml_node *parse_xml_declaration(Ch *&text) + { + // If parsing of declaration is disabled + if (!(Flags & parse_declaration_node)) + { + // Skip until end of declaration + while (text[0] != Ch('?') || text[1] != Ch('>')) + { + if (!text[0]) + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + text += 2; // Skip '?>' + return 0; + } + + // Create declaration + xml_node *declaration = this->allocate_node(node_declaration); + + // Skip whitespace before attributes or ?> + skip(text); + + // Parse declaration attributes + parse_node_attributes(text, declaration); + + // Skip ?> + if (text[0] != Ch('?') || text[1] != Ch('>')) + RAPIDXML_PARSE_ERROR("expected ?>", text); + text += 2; + + return declaration; + } + + // Parse XML comment (' + return 0; // Do not produce comment node + } + + // Remember value start + Ch *value = text; + + // Skip until end of comment + while (text[0] != Ch('-') || text[1] != Ch('-') || text[2] != Ch('>')) + { + if (!text[0]) + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + + // Create comment node + xml_node *comment = this->allocate_node(node_comment); + comment->value(value, text - value); + + // Place zero terminator after comment value + if (!(Flags & parse_no_string_terminators)) + *text = Ch('\0'); + + text += 3; // Skip '-->' + return comment; + } + + // Parse DOCTYPE + template + xml_node *parse_doctype(Ch *&text) + { + // Remember value start + Ch *value = text; + + // Skip to > + while (*text != Ch('>')) + { + // Determine character type + switch (*text) + { + + // If '[' encountered, scan for matching ending ']' using naive algorithm with depth + // This works for all W3C test files except for 2 most wicked + case Ch('['): + { + ++text; // Skip '[' + int depth = 1; + while (depth > 0) + { + switch (*text) + { + case Ch('['): ++depth; break; + case Ch(']'): --depth; break; + case 0: RAPIDXML_PARSE_ERROR("unexpected end of data", text); + } + ++text; + } + break; + } + + // Error on end of text + case Ch('\0'): + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + + // Other character, skip it + default: + ++text; + + } + } + + // If DOCTYPE nodes enabled + if (Flags & parse_doctype_node) + { + // Create a new doctype node + xml_node *doctype = this->allocate_node(node_doctype); + doctype->value(value, text - value); + + // Place zero terminator after value + if (!(Flags & parse_no_string_terminators)) + *text = Ch('\0'); + + text += 1; // skip '>' + return doctype; + } + else + { + text += 1; // skip '>' + return 0; + } + + } + + // Parse PI + template + xml_node *parse_pi(Ch *&text) + { + // If creation of PI nodes is enabled + if (Flags & parse_pi_nodes) + { + // Create pi node + xml_node *pi = this->allocate_node(node_pi); + + // Extract PI target name + Ch *name = text; + skip(text); + if (text == name) + RAPIDXML_PARSE_ERROR("expected PI target", text); + pi->name(name, text - name); + + // Skip whitespace between pi target and pi + skip(text); + + // Remember start of pi + Ch *value = text; + + // Skip to '?>' + while (text[0] != Ch('?') || text[1] != Ch('>')) + { + if (*text == Ch('\0')) + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + + // Set pi value (verbatim, no entity expansion or whitespace normalization) + pi->value(value, text - value); + + // Place zero terminator after name and value + if (!(Flags & parse_no_string_terminators)) + { + pi->name()[pi->name_size()] = Ch('\0'); + pi->value()[pi->value_size()] = Ch('\0'); + } + + text += 2; // Skip '?>' + return pi; + } + else + { + // Skip to '?>' + while (text[0] != Ch('?') || text[1] != Ch('>')) + { + if (*text == Ch('\0')) + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + text += 2; // Skip '?>' + return 0; + } + } + + // Parse and append data + // Return character that ends data. + // This is necessary because this character might have been overwritten by a terminating 0 + template + Ch parse_and_append_data(xml_node *node, Ch *&text, Ch *contents_start) + { + // Backup to contents start if whitespace trimming is disabled + if (!(Flags & parse_trim_whitespace)) + text = contents_start; + + // Skip until end of data + Ch *value = text, *end; + if (Flags & parse_normalize_whitespace) + end = skip_and_expand_character_refs(text); + else + end = skip_and_expand_character_refs(text); + + // Trim trailing whitespace if flag is set; leading was already trimmed by whitespace skip after > + if (Flags & parse_trim_whitespace) + { + if (Flags & parse_normalize_whitespace) + { + // Whitespace is already condensed to single space characters by skipping function, so just trim 1 char off the end + if (*(end - 1) == Ch(' ')) + --end; + } + else + { + // Backup until non-whitespace character is found + while (whitespace_pred::test(*(end - 1))) + --end; + } + } + + // If characters are still left between end and value (this test is only necessary if normalization is enabled) + // Create new data node + if (!(Flags & parse_no_data_nodes)) + { + xml_node *data = this->allocate_node(node_data); + data->value(value, end - value); + node->append_node(data); + } + + // Add data to parent node if no data exists yet + if (!(Flags & parse_no_element_values)) + if (*node->value() == Ch('\0')) + node->value(value, end - value); + + // Place zero terminator after value + if (!(Flags & parse_no_string_terminators)) + { + Ch ch = *text; + *end = Ch('\0'); + return ch; // Return character that ends data; this is required because zero terminator overwritten it + } + + // Return character that ends data + return *text; + } + + // Parse CDATA + template + xml_node *parse_cdata(Ch *&text) + { + // If CDATA is disabled + if (Flags & parse_no_data_nodes) + { + // Skip until end of cdata + while (text[0] != Ch(']') || text[1] != Ch(']') || text[2] != Ch('>')) + { + if (!text[0]) + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + text += 3; // Skip ]]> + return 0; // Do not produce CDATA node + } + + // Skip until end of cdata + Ch *value = text; + while (text[0] != Ch(']') || text[1] != Ch(']') || text[2] != Ch('>')) + { + if (!text[0]) + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + + // Create new cdata node + xml_node *cdata = this->allocate_node(node_cdata); + cdata->value(value, text - value); + + // Place zero terminator after value + if (!(Flags & parse_no_string_terminators)) + *text = Ch('\0'); + + text += 3; // Skip ]]> + return cdata; + } + + // Parse element node + template + xml_node *parse_element(Ch *&text) + { + // Create element node + xml_node *element = this->allocate_node(node_element); + + // Extract element name + Ch *name = text; + skip(text); + if (text == name) + RAPIDXML_PARSE_ERROR("expected element name", text); + element->name(name, text - name); + + // Skip whitespace between element name and attributes or > + skip(text); + + // Parse attributes, if any + parse_node_attributes(text, element); + + // Determine ending type + if (*text == Ch('>')) + { + ++text; + parse_node_contents(text, element); + } + else if (*text == Ch('/')) + { + ++text; + if (*text != Ch('>')) + RAPIDXML_PARSE_ERROR("expected >", text); + ++text; + } + else + RAPIDXML_PARSE_ERROR("expected >", text); + + // Place zero terminator after name + if (!(Flags & parse_no_string_terminators)) + element->name()[element->name_size()] = Ch('\0'); + + // Return parsed element + return element; + } + + // Determine node type, and parse it + template + xml_node *parse_node(Ch *&text) + { + // Parse proper node type + switch (text[0]) + { + + // <... + default: + // Parse and append element node + return parse_element(text); + + // (text); + } + else + { + // Parse PI + return parse_pi(text); + } + + // (text); + } + break; + + // (text); + } + break; + + // (text); + } + + } // switch + + // Attempt to skip other, unrecognized node types starting with ')) + { + if (*text == 0) + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + ++text; + } + ++text; // Skip '>' + return 0; // No node recognized + + } + } + + // Parse contents of the node - children, data etc. + template + void parse_node_contents(Ch *&text, xml_node *node) + { + // For all children and text + while (1) + { + // Skip whitespace between > and node contents + Ch *contents_start = text; // Store start of node contents before whitespace is skipped + skip(text); + Ch next_char = *text; + + // After data nodes, instead of continuing the loop, control jumps here. + // This is because zero termination inside parse_and_append_data() function + // would wreak havoc with the above code. + // Also, skipping whitespace after data nodes is unnecessary. + after_data_node: + + // Determine what comes next: node closing, child node, data node, or 0? + switch (next_char) + { + + // Node closing or child node + case Ch('<'): + if (text[1] == Ch('/')) + { + // Node closing + text += 2; // Skip '(text); + if (!internal::compare(node->name(), node->name_size(), closing_name, text - closing_name, true)) + RAPIDXML_PARSE_ERROR("invalid closing tag name", text); + } + else + { + // No validation, just skip name + skip(text); + } + // Skip remaining whitespace after node name + skip(text); + if (*text != Ch('>')) + RAPIDXML_PARSE_ERROR("expected >", text); + ++text; // Skip '>' + return; // Node closed, finished parsing contents + } + else + { + // Child node + ++text; // Skip '<' + if (xml_node *child = parse_node(text)) + node->append_node(child); + } + break; + + // End of data - error + case Ch('\0'): + RAPIDXML_PARSE_ERROR("unexpected end of data", text); + + // Data node + default: + next_char = parse_and_append_data(node, text, contents_start); + goto after_data_node; // Bypass regular processing after data nodes + + } + } + } + + // Parse XML attributes of the node + template + void parse_node_attributes(Ch *&text, xml_node *node) + { + // For all attributes + while (attribute_name_pred::test(*text)) + { + // Extract attribute name + Ch *name = text; + ++text; // Skip first character of attribute name + skip(text); + if (text == name) + RAPIDXML_PARSE_ERROR("expected attribute name", name); + + // Create new attribute + xml_attribute *attribute = this->allocate_attribute(); + attribute->name(name, text - name); + node->append_attribute(attribute); + + // Skip whitespace after attribute name + skip(text); + + // Skip = + if (*text != Ch('=')) + RAPIDXML_PARSE_ERROR("expected =", text); + ++text; + + // Add terminating zero after name + if (!(Flags & parse_no_string_terminators)) + attribute->name()[attribute->name_size()] = 0; + + // Skip whitespace after = + skip(text); + + // Skip quote and remember if it was ' or " + Ch quote = *text; + if (quote != Ch('\'') && quote != Ch('"')) + RAPIDXML_PARSE_ERROR("expected ' or \"", text); + ++text; + + // Extract attribute value and expand char refs in it + Ch *value = text, *end; + const int AttFlags = Flags & ~parse_normalize_whitespace; // No whitespace normalization in attributes + if (quote == Ch('\'')) + end = skip_and_expand_character_refs, attribute_value_pure_pred, AttFlags>(text); + else + end = skip_and_expand_character_refs, attribute_value_pure_pred, AttFlags>(text); + + // Set attribute value + attribute->value(value, end - value); + + // Make sure that end quote is present + if (*text != quote) + RAPIDXML_PARSE_ERROR("expected ' or \"", text); + ++text; // Skip quote + + // Add terminating zero after value + if (!(Flags & parse_no_string_terminators)) + attribute->value()[attribute->value_size()] = 0; + + // Skip whitespace after attribute value + skip(text); + } + } + + }; + + //! \cond internal + namespace internal + { + + // Whitespace (space \n \r \t) + template + const unsigned char lookup_tables::lookup_whitespace[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, // 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1 + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 5 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 7 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // A + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // B + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // C + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // D + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // E + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // F + }; + + // Node name (anything but space \n \r \t / > ? \0) + template + const unsigned char lookup_tables::lookup_node_name[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Text (i.e. PCDATA) (anything but < \0) + template + const unsigned char lookup_tables::lookup_text[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Text (i.e. PCDATA) that does not require processing when ws normalization is disabled + // (anything but < \0 &) + template + const unsigned char lookup_tables::lookup_text_pure_no_ws[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Text (i.e. PCDATA) that does not require processing when ws normalizationis is enabled + // (anything but < \0 & space \n \r \t) + template + const unsigned char lookup_tables::lookup_text_pure_with_ws[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Attribute name (anything but space \n \r \t / < > = ? ! \0) + template + const unsigned char lookup_tables::lookup_attribute_name[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Attribute data with single quote (anything but ' \0) + template + const unsigned char lookup_tables::lookup_attribute_data_1[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Attribute data with single quote that does not require processing (anything but ' \0 &) + template + const unsigned char lookup_tables::lookup_attribute_data_1_pure[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Attribute data with double quote (anything but " \0) + template + const unsigned char lookup_tables::lookup_attribute_data_2[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Attribute data with double quote that does not require processing (anything but " \0 &) + template + const unsigned char lookup_tables::lookup_attribute_data_2_pure[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 + 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F + }; + + // Digits (dec and hex, 255 denotes end of numeric character reference) + template + const unsigned char lookup_tables::lookup_digits[256] = + { + // 0 1 2 3 4 5 6 7 8 9 A B C D E F + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 0 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 1 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 2 + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,255,255,255,255,255,255, // 3 + 255, 10, 11, 12, 13, 14, 15,255,255,255,255,255,255,255,255,255, // 4 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 5 + 255, 10, 11, 12, 13, 14, 15,255,255,255,255,255,255,255,255,255, // 6 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 7 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 8 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 9 + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // A + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // B + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // C + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // D + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // E + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 // F + }; + + // Upper case conversion + template + const unsigned char lookup_tables::lookup_upcase[256] = + { + // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A B C D E F + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, // 0 + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, // 1 + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, // 2 + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, // 3 + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, // 4 + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, // 5 + 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, // 6 + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 123,124,125,126,127, // 7 + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, // 8 + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, // 9 + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, // A + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, // B + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, // C + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, // D + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, // E + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 // F + }; + } + //! \endcond + +} + +// Undefine internal macros +#undef RAPIDXML_PARSE_ERROR + +// On MSVC, restore warnings state +#ifdef _MSC_VER + #pragma warning(pop) +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlAnalog.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlAnalog.cpp new file mode 100755 index 0000000..9c1921f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlAnalog.cpp @@ -0,0 +1,202 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsCCommandControlAnalog.h" +#include "ovamsCImpactApplication.h" + +#include +#if !((CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8)) +namespace CEGUI +{ + typedef CEGUI::UVector2 USize; +}; +#endif + + +namespace OpenViBE { +namespace SSVEPMindShooter { + +CCommandControlAnalog::CCommandControlAnalog(CImpactApplication* application, const bool takeControl) + : ICommandVRPNAnalog(application, "SSVEP_VRPN_AnalogControl"), m_application(application), m_inControl(takeControl) +{ + m_cmdStates[0] = 0; + m_cmdStates[1] = 0; + m_cmdStates[2] = 0; + + m_maxFeedbackLevel[0] = 0; + m_maxFeedbackLevel[1] = 0; + m_maxFeedbackLevel[2] = 0; +} + +void CCommandControlAnalog::execute(const int channelCount, double* channel) +{ + CImpactApplication* application = dynamic_cast(m_application); + + if (m_inControl) + { + if (channelCount == 4) + { + // 'Modern' multiclass Mind Shooter assumed + // The input class coding is assumed to contain the following probabilities, + // 0 == 'focus on the middle of the ship') + // 1 == focus tip + // 2 == focus left + // 3 == focus right + const std::array probs = { channel[0], channel[1], channel[2], channel[3] }; + commandeerShip(probs); + } + else if (channelCount == 6) + { + // 'Classic' Mind Shooter. The input class probabilities are assumed as follows [class1in,class1Out,class2In,class2Out,class3In,class3Out] + // Note that with this control scheme, class 0 will never be selected. + std::array probs = { 0, channel[0], channel[2], channel[4] }; + const double sum = probs[1] + probs[2] + probs[3]; + + if (sum > 0) + { + probs[1] = probs[1] / sum; + probs[2] = probs[2] / sum; + probs[3] = probs[3] / sum; + } + commandeerShip(probs); + } + else + { + application->getLogManager() << Kernel::LogLevel_Error << "Incorrect analog VRPN input with " << channelCount + << " channels. Mind Shooter needs 4 or 6 channels.\n"; + return; + } + } + + const int nChannels = 3; + static std::array prevLevels = { 0, 0, 0 }; + + // Assume input is layered like [prob1,prob2,prob3,prob4]. First ignored for feedback (focus middle of ship). + std::array feedback = { channel[1], channel[2], channel[3] }; + + std::array level = { 0, 0, 0 }; + + //std::cout << "feedback: "; + for (int i = 0; i < nChannels; ++i) + { + if (feedback[i] < 0) + { + // Note: shouldn't happen, we're expecting positive numbers + feedback[i] = 0; + } + + if (feedback[i] > m_maxFeedbackLevel[i]) { m_maxFeedbackLevel[i] += 0.1; } + else + { + // Slowly decrease max over time in case it was due to artifact + m_maxFeedbackLevel[i] *= 0.995; + } + + const double cLevel = (m_maxFeedbackLevel[i] > 0 ? (feedback[i] / m_maxFeedbackLevel[i]) : 0); + + if (cLevel > 0.7) { level[i] = 3; } + else if (cLevel > 0.3) { level[i] = 2; } + else if (cLevel > 0.0) { level[i] = 1; } + } + + + if (level[0] != prevLevels[0] || level[1] != prevLevels[1] || level[2] != prevLevels[2]) + { + application->getLogManager() << Kernel::LogLevel_Trace << "Feedback levels : " << level[0] << " " << level[1] << " " << level[2] << "\n"; + + prevLevels[0] = level[0]; + prevLevels[1] = level[1]; + prevLevels[2] = level[2]; + + application->getShip()->setFeedbackLevels(level[0], level[1], level[2]); + } +} + +std::string stateToString(const CImpactShip::ETargetState ts) +{ + if (ts == CImpactShip::TS_NORMAL) { return "N"; } + if (ts == CImpactShip::TS_INHIBITED) { return "I"; } + if (ts == CImpactShip::TS_OFF) { return "X"; } + + return "-"; +} + +// Expects 4 non-negative inputs +void CCommandControlAnalog::commandeerShip(const std::array& probs) +{ + m_cmdStates[0] = 0; + m_cmdStates[1] = 0; + m_cmdStates[2] = 0; + + // If true, a NOP classification (class 0) will never be selected + // const bool ignoreIdle = false; + + // Find the strongest activation. + size_t maxIdx = 0; + double maxVal = -std::numeric_limits::max(); + //double sum = 0; + for (size_t i = 0; i < 4; ++i) + { + if (probs[i] >= maxVal) + // && !(i==0 && ignoreIdle)) + { + maxVal = probs[i]; + maxIdx = i; + } + //sum += probs[i]; + } + //if (sum <= 0) { sum = 1; } + + /* + const bool paralyzed = false; + if (l_bParalyzed) + { + // In this mode, the ship does not move but the prediction is displayed instead. May be useful for debugging. + char text[512]; + sprintf(text, "Button %d", maxIdx); + + double pos = (maxIdx / 3.0) * 0.85; + + m_application->getInstructionWindow()->setSize(CEGUI::USize(CEGUI::UDim(0.10f, 0), CEGUI::UDim(0.10f, 0))); + m_application->getInstructionWindow()->setPosition(CEGUI::UVector2(CEGUI::UDim(pos, 0), CEGUI::UDim(0.5f, 0))); + m_application->getInstructionWindow()->setText(text); + m_application->getInstructionWindow()->show(); + + return; + } + */ + + // In principle here we could do different things with the probabilities. If we predict just the + // maximum, this can be expected to be identical to the Classifier Processor box label output, + // hence no difference is expected between the two control schemes (discrete vs analog). + // To make the two controls a bit different, the probabilities can be used to + // modulate the strength of the ship movement. + + // Modulating with the probabilities makes the movements a bit jittery + // const double strength = maxVal / sum; + + // This choice is smoother, but will make the behavior identical to discrete control + const double strength = 1.0; + + CImpactShip* ship = m_application->getShip(); + + if (maxIdx == NOTHING) { } // NOP + else if (maxIdx == SHOOT && m_application->getShip()->getTargetState(0) != CImpactShip::TS_OFF) + { + m_cmdStates[0] = 1; + ship->shoot(); + } + else if (maxIdx == MOVE_LEFT && m_application->getShip()->getTargetState(1) != CImpactShip::TS_OFF) + { + m_cmdStates[1] = 1; + ship->move(int(-6 * strength)); + } + else if (maxIdx == MOVE_RIGHT && m_application->getShip()->getTargetState(2) != CImpactShip::TS_OFF) + { + m_cmdStates[2] = 1; + ship->move(int(6 * strength)); + } +} + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlAnalog.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlAnalog.h new file mode 100755 index 0000000..21a195a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlAnalog.h @@ -0,0 +1,33 @@ +/// Controls the ship movement by the continuous values from the classifier probabilities +// If bTakeControl is false, feedback levels will still be provided by the analog control. + +#pragma once + +#include "../ovamsICommandVRPNAnalog.h" +#include + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CImpactApplication; + +class CCommandControlAnalog final : public ICommandVRPNAnalog +{ + enum EShipCommand { NOTHING = 0, SHOOT, MOVE_LEFT, MOVE_RIGHT }; + +public: + CCommandControlAnalog(CImpactApplication* application, bool takeControl); + ~CCommandControlAnalog() override {} + + void execute(int channelCount, double* channel) override; + +private: + CImpactApplication* m_application = nullptr; + std::array m_cmdStates; + std::array m_maxFeedbackLevel; + + void commandeerShip(const std::array& probs); + + bool m_inControl = false; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlDiscrete.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlDiscrete.cpp new file mode 100755 index 0000000..070eb6f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlDiscrete.cpp @@ -0,0 +1,48 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsCCommandControlDiscrete.h" +#include "ovamsCImpactApplication.h" + +#include +#if !((CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8)) +namespace CEGUI +{ + typedef CEGUI::UVector2 USize; +}; +#endif + +namespace OpenViBE { +namespace SSVEPMindShooter { + +CCommandControlDiscrete::CCommandControlDiscrete(CImpactApplication* application, const bool takeControl) + : ICommandVRPNButton(application, "SSVEP_VRPN_DiscreteControl"), m_inControl(takeControl) {} + +void CCommandControlDiscrete::execute(const int button, const int /*state*/) +{ + if (!m_inControl) { return; } + + CImpactApplication* application = dynamic_cast(m_application); + + switch (button) + { + case 0: + // Nop + break; + case 1: + application->getShip()->shoot(); + break; + case 2: + application->getShip()->move(-6); + break; + case 3: + application->getShip()->move(6); + break; + default: + m_application->getLogManager() << Kernel::LogLevel_Warning << "Unhandled button " << button << " received\n"; + break; + } +} + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlDiscrete.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlDiscrete.h new file mode 100755 index 0000000..73e40f4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlDiscrete.h @@ -0,0 +1,23 @@ +/// Control ship movements with VRPN using label predictions from the classifier +// If bTakeControl is false, the class will do nothing. + +#pragma once + +#include "../ovamsICommandVRPNButton.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CImpactApplication; + +class CCommandControlDiscrete final : public ICommandVRPNButton +{ +public: + CCommandControlDiscrete(CImpactApplication* application, bool takeControl); + ~CCommandControlDiscrete() override {} + + void execute(const int button, const int state) override; +protected: + bool m_inControl = false; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlDiscreteOIS.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlDiscreteOIS.cpp new file mode 100755 index 0000000..a30e135 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlDiscreteOIS.cpp @@ -0,0 +1,41 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsCCommandControlDiscreteOIS.h" +#include "ovamsCImpactApplication.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { + +CCommandControlDiscreteOIS::CCommandControlDiscreteOIS(CImpactApplication* application) + : ICommandOIS(application) {} + +void CCommandControlDiscreteOIS::processFrame() +{ + ICommandOIS::processFrame(); + + CImpactApplication* application = dynamic_cast(m_application); + + if (m_keysPressed[OIS::KC_UP] || m_keysPressed[OIS::KC_DOWN]) { application->getShip()->shoot(); } + if (m_keysPressed[OIS::KC_LEFT]) { application->getShip()->move(-6); } + if (m_keysPressed[OIS::KC_RIGHT]) { application->getShip()->move(6); } +} + +void CCommandControlDiscreteOIS::receiveKeyPressedEvent(const OIS::KeyCode key) +{ + if (key == OIS::KC_UP) { m_keysPressed[OIS::KC_UP] = true; } + if (key == OIS::KC_DOWN) { m_keysPressed[OIS::KC_DOWN] = true; } + if (key == OIS::KC_LEFT) { m_keysPressed[OIS::KC_LEFT] = true; } + if (key == OIS::KC_RIGHT) { m_keysPressed[OIS::KC_RIGHT] = true; } +} + +void CCommandControlDiscreteOIS::receiveKeyReleasedEvent(const OIS::KeyCode key) +{ + if (key == OIS::KC_UP) { m_keysPressed[OIS::KC_UP] = false; } + if (key == OIS::KC_DOWN) { m_keysPressed[OIS::KC_DOWN] = false; } + if (key == OIS::KC_LEFT) { m_keysPressed[OIS::KC_LEFT] = false; } + if (key == OIS::KC_RIGHT) { m_keysPressed[OIS::KC_RIGHT] = false; } +} + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlDiscreteOIS.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlDiscreteOIS.h new file mode 100755 index 0000000..2509690 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandControlDiscreteOIS.h @@ -0,0 +1,27 @@ +/// Control ship movements with the keyboard + +#pragma once + +#include + +#include "../ovamsICommandOIS.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CImpactApplication; + +class CCommandControlDiscreteOIS final : public ICommandOIS +{ +public: + explicit CCommandControlDiscreteOIS(CImpactApplication* application); + ~CCommandControlDiscreteOIS() override {} + + void processFrame() override; + + void receiveKeyPressedEvent(OIS::KeyCode key) override; + void receiveKeyReleasedEvent(OIS::KeyCode key) override; +private: + std::map m_keysPressed; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandImpactCustomTargetControl.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandImpactCustomTargetControl.cpp new file mode 100755 index 0000000..266d36f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandImpactCustomTargetControl.cpp @@ -0,0 +1,59 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsCCommandImpactCustomTargetControl.h" +#include "ovamsCImpactApplication.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { + +CCommandImpactCustomTargetControl::CCommandImpactCustomTargetControl(CImpactApplication* application) + : ICommandVRPNButton(application, "SSVEP_VRPN_TargetControl") +{ + m_vrpnServer = CVRPNServer::getInstance(application); + m_vrpnServer->addButton("SSVEP_VRPN_TargetRequest", 1); +} + +void CCommandImpactCustomTargetControl::processFrame() +{ + CImpactApplication* application = dynamic_cast(m_application); + + ICommandVRPNButton::processFrame(); + + if (application->m_TargetRequest) + { + m_application->getLogManager() << Kernel::LogLevel_Info << "Requesting target\n"; + m_vrpnServer->changeButtonState("SSVEP_VRPN_TargetRequest", 0, 1); + application->m_TargetRequest = false; + } + else { m_vrpnServer->changeButtonState("SSVEP_VRPN_TargetRequest", 0, 0); } + + m_vrpnServer->processFrame(); +} + +/// Add enemies on specified positions depending on the vrpn button triggered +void CCommandImpactCustomTargetControl::execute(const int button, const int /*state*/) +{ + m_application->getLogManager() << Kernel::LogLevel_Info << "Adding target, position : " << button << "\n"; + + CImpactApplication* application = dynamic_cast(m_application); + + application->m_NextOrigin = 0.0; + if (button == 0) + { + application->m_NextOrigin = -0.21F; + application->addTarget(1); + application->addTarget(6); + application->addTarget(4); + } + else if (button == 1) + { + application->m_NextOrigin = 0.21F; + application->addTarget(6); + application->addTarget(1); + application->addTarget(3); + } +} + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandImpactCustomTargetControl.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandImpactCustomTargetControl.h new file mode 100755 index 0000000..c2d3a18 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandImpactCustomTargetControl.h @@ -0,0 +1,24 @@ +#pragma once + +/// Used to insert enemy ships into the scene upon receiving a trigger +#include "../ovamsICommandVRPNButton.h" +#include "../ovamsCVRPNServer.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CImpactApplication; + +class CCommandImpactCustomTargetControl final : public ICommandVRPNButton +{ +public: + explicit CCommandImpactCustomTargetControl(CImpactApplication* application); + ~CCommandImpactCustomTargetControl() override {} + + void execute(const int button, const int state) override; + void processFrame() override; + +private: + CVRPNServer* m_vrpnServer = nullptr; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandImpactTargetControl.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandImpactTargetControl.cpp new file mode 100755 index 0000000..5891b0e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandImpactTargetControl.cpp @@ -0,0 +1,41 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsCCommandImpactTargetControl.h" +#include "ovamsCImpactApplication.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { + +CCommandImpactTargetControl::CCommandImpactTargetControl(CImpactApplication* application) + : ICommandVRPNButton(application, "SSVEP_VRPN_TargetControl") +{ + m_vrpnServer = CVRPNServer::getInstance(application); + m_vrpnServer->addButton("SSVEP_VRPN_TargetRequest", 1); +} + +void CCommandImpactTargetControl::processFrame() +{ + CImpactApplication* application = dynamic_cast(m_application); + + ICommandVRPNButton::processFrame(); + + if (application->m_TargetRequest) + { + m_application->getLogManager() << Kernel::LogLevel_Info << "Requesting target\n"; + m_vrpnServer->changeButtonState("SSVEP_VRPN_TargetRequest", 0, 1); + application->m_TargetRequest = false; + } + else { m_vrpnServer->changeButtonState("SSVEP_VRPN_TargetRequest", 0, 0); } + + m_vrpnServer->processFrame(); +} + +void CCommandImpactTargetControl::execute(const int button, const int /*state*/) +{ + m_application->getLogManager() << Kernel::LogLevel_Info << "Adding target, position : " << button << "\n"; + dynamic_cast(m_application)->addTarget(button); +} + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandImpactTargetControl.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandImpactTargetControl.h new file mode 100755 index 0000000..0fbd780 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCCommandImpactTargetControl.h @@ -0,0 +1,23 @@ +#pragma once + +#include "../ovamsICommandVRPNButton.h" +#include "../ovamsCVRPNServer.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CImpactApplication; + +class CCommandImpactTargetControl final : public ICommandVRPNButton +{ +public: + explicit CCommandImpactTargetControl(CImpactApplication* application); + ~CCommandImpactTargetControl() override {} + + void execute(const int button, const int state) override; + void processFrame() override; + +private: + CVRPNServer* m_vrpnServer = nullptr; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactApplication.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactApplication.cpp new file mode 100755 index 0000000..c57c123 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactApplication.cpp @@ -0,0 +1,527 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsCImpactApplication.h" + +#include "openvibe/ov_all.h" + +#include "../ovamsCCommandStartStop.h" +#include "../ovamsCCommandStimulatorControl.h" +#include "../ovamsCCommandCamera.h" +#include "ovamsCCommandImpactTargetControl.h" +#include "ovamsCCommandImpactCustomTargetControl.h" + +#include "ovamsCCommandControlAnalog.h" +#include "ovamsCCommandControlDiscrete.h" +#include "ovamsCCommandControlDiscreteOIS.h" + +#include "../log/ovkCLogListenerFileBuffered.h" + +#include + +#define DIALOG_CYCLES_TO_REMOVE 180 +//#define NO_KEYBOARD +//#define NO_VRPN + +#if !((CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8)) +namespace CEGUI +{ + typedef CEGUI::UVector2 USize; +}; +#endif + +namespace OpenViBE { +namespace SSVEPMindShooter { + +CImpactApplication::CImpactApplication(const CString& scenarioDir, const CString& applicationSubtype) + : CApplication(scenarioDir), m_applicationSubtype(applicationSubtype) {} + +CImpactApplication::~CImpactApplication() +{ + (*m_logManager) << Kernel::LogLevel_Debug << "- m_ship\n"; + delete m_ship; +} + +bool CImpactApplication::setup(Kernel::IKernelContext* kernelCtx) +{ + if (!CApplication::setup(kernelCtx)) { return false; } + + Kernel::IConfigurationManager* configurationManager = &(m_kernelCtx->getConfigurationManager()); + + if (m_applicationSubtype == CString("shooter")) + { + // A config file appended for the online session + const CString configFile = m_ScenarioDir + "/appconf/shooter-configuration.conf"; + if (!configurationManager->addConfigurationFromFile(configFile)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Unable to open [" << configFile << "]. Has the shooter-controller.lua been run?\n"; + return false; + } + } + + const uint64_t logLevel = kernelCtx->getTypeManager().getEnumerationEntryValueFromName( + OV_TypeId_LogLevel, configurationManager->expand("${SSVEP_LogLevel}")); + this->getLogManager() << Kernel::LogLevel_Info << "Parsed loglevel is " << logLevel << "\n"; + if (logLevel != 0xffffffffffffffffULL) { kernelCtx->getLogManager().activate(Kernel::ELogLevel(logLevel), Kernel::LogLevel_Last, true); } + + Kernel::ILogListener* logListenerFileBuffered = new Kernel::CLogListenerFileBuffered(*kernelCtx, "ssvep-mind-shooter-stimulator", + configurationManager->expand( + "${SSVEP_UserDataFolder}/mind-shooter-[$core{date}-$core{time}]-app.log")); + kernelCtx->getLogManager().addListener(logListenerFileBuffered); + + + m_sceneLoader = new DotSceneLoader(); + + std::stringstream enemyOrder; + enemyOrder << configurationManager->expand("${SSVEP_EnemyOrder}"); + + (*m_logManager) << Kernel::LogLevel_Info << "Enemy order: " << configurationManager->expand("${SSVEP_EnemyOrder}") << "\n"; + + while (enemyOrder.peek() != EOF) + { + int nextType; + enemyOrder >> nextType; + m_enemyOrder.push(nextType); + } + + (*m_logManager) << Kernel::LogLevel_Debug << "Adding Impact game resources\n"; + + + Ogre::ResourceGroupManager::getSingleton().addResourceLocation( + CString(configurationManager->expand("${Path_Data}/applications/${SSVEP_MindShooterFolderName}/resources/impact")).toASCIIString(), "FileSystem", + "SSVEPImpact", true); + Ogre::ResourceGroupManager::getSingleton().addResourceLocation( + CString(configurationManager->expand("${Path_Data}/applications/${SSVEP_MindShooterFolderName}/resources/impact/battleship")).toASCIIString(), + "FileSystem", "SSVEPImpact"); + Ogre::ResourceGroupManager::getSingleton().addResourceLocation( + CString(configurationManager->expand("${Path_Data}/applications/${SSVEP_MindShooterFolderName}/resources/impact/battleship-destroyed")).toASCIIString(), + "FileSystem", "SSVEPImpact"); + Ogre::ResourceGroupManager::getSingleton().addResourceLocation( + CString(configurationManager->expand("${Path_Data}/applications/${SSVEP_MindShooterFolderName}/resources/impact/enemy1")).toASCIIString(), "FileSystem", + "SSVEPImpact"); + Ogre::ResourceGroupManager::getSingleton().addResourceLocation( + CString(configurationManager->expand("${Path_Data}/applications/${SSVEP_MindShooterFolderName}/resources/impact/enemy2")).toASCIIString(), "FileSystem", + "SSVEPImpact"); + Ogre::ResourceGroupManager::getSingleton().addResourceLocation( + CString(configurationManager->expand("${Path_Data}/applications/${SSVEP_MindShooterFolderName}/resources/impact/enemy3")).toASCIIString(), "FileSystem", + "SSVEPImpact"); + Ogre::ResourceGroupManager::getSingleton().addResourceLocation( + CString(configurationManager->expand("${Path_Data}/applications/${SSVEP_MindShooterFolderName}/resources/impact/ships")).toASCIIString(), "FileSystem", + "SSVEPImpact"); + Ogre::ResourceGroupManager::getSingleton().addResourceLocation( + CString(configurationManager->expand("${Path_Data}/applications/${SSVEP_MindShooterFolderName}/resources/impact/starsky")).toASCIIString(), + "FileSystem", "SSVEPImpact"); + Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("SSVEPImpact"); + + setupScene(); + + // Create the StarShip object + (*m_logManager) << Kernel::LogLevel_Debug << "+ m_ship = new CStarShip(...)\n"; + m_ship = new CImpactShip(this, m_sceneNode, &m_frequencies); + m_ship->activatePilotAssist(configurationManager->expandAsBoolean("${SSVEP_PilotAssist}")); + m_ship->activateTargetLockdown(configurationManager->expandAsBoolean("${SSVEP_TargetLockdown}") && (m_applicationSubtype == CString("shooter"))); + m_ship->setFeedbackLevels(0, 0, 0); + m_ship->activateFeedback(configurationManager->expandAsBoolean("${SSVEP_Feedback}") && (m_applicationSubtype == CString("shooter"))); + m_ship->activateFocusPoint(configurationManager->expandAsBoolean("${SSVEP_FocusPoint}")); + + // Initialize the Target class + + CImpactEnemyShip::initialize(this); + + // create CEGUI windows + m_instructionWindow = static_cast(m_guiWindowManager->createWindow("TaharezLook/StaticText", "InstructionsWindow")); + m_instructionWindow->setFont("BlueHighway-impact"); + m_statusWindow = static_cast(m_guiWindowManager->createWindow("TaharezLook/StaticText", "StatusWindow")); + m_statusWindow->setFont("BlueHighway-impact"); + m_statusWindow->hide(); + +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) + m_sheet->addChild(m_statusWindow); + m_sheet->addChild(m_instructionWindow); +#else + m_sheet->addChildWindow(m_statusWindow); + m_sheet->addChildWindow(m_instructionWindow); +#endif + + // Create commands + + +#ifndef NO_KEYBOARD + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandCamera(...)\n"; + this->addCommand(new CCommandCamera(this)); + + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandShipControlOIS(...))\n"; + this->addCommand(new CCommandControlDiscreteOIS(this)); +#endif + +#ifndef NO_VRPN + + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandStartStop(...)\n"; + this->addCommand(new CCommandStartStop(this)); + + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandStimulatorControl(...))\n"; + this->addCommand(new CCommandStimulatorControl(this)); + + if (m_applicationSubtype == CString("trainer")) + { + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandTargetControl(...)\n"; + this->addCommand(new CCommandImpactTargetControl(this)); + } + else + { + if (configurationManager->expandAsBoolean("${SSVEP_OneByOne}", false)) + { + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandTargetControl(...)\n"; + this->addCommand(new CCommandImpactTargetControl(this)); + } + else + { + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandImpactCustomTargetControl(...)\n"; + this->addCommand(new CCommandImpactCustomTargetControl(this)); + } + + const bool analogControls = configurationManager->expandAsBoolean("${SSVEP_AnalogControl}", false); + + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandControlAnalog(...))\n"; + this->addCommand(new CCommandControlAnalog(this, analogControls)); + + (*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandControlDiscrete(...))\n"; + this->addCommand(new CCommandControlDiscrete(this, !analogControls)); + + (*m_logManager) << Kernel::LogLevel_Info << "Analog control mode: " << (analogControls ? "true" : "false") << "\n"; + } +#endif + + if (m_applicationSubtype == CString("shooter")) + { + m_gameState = IDLE_STARTED; + m_ship->moveToPosition(); + + // draw the initial text + m_instructionWindow->show(); + m_instructionWindow->setSize(CEGUI::USize(CEGUI::UDim(0.50F, 0), CEGUI::UDim(0.10F, 0))); + m_instructionWindow->setPosition(CEGUI::UVector2(CEGUI::UDim(0.25F, 0), CEGUI::UDim(0.45F, 0))); + // m_instructionWindow->setText("Appuyez sur la touche ESPACE pour commencer le jeu ..."); + m_instructionWindow->setText("Press SPACE to start the game ..."); + } + else + { + m_gameState = IDLE_TRAINING; + + // draw the initial text + m_instructionWindow->show(); + m_instructionWindow->setSize(CEGUI::USize(CEGUI::UDim(0.50F, 0), CEGUI::UDim(0.15F, 0))); + m_instructionWindow->setPosition(CEGUI::UVector2(CEGUI::UDim(0.25F, 0), CEGUI::UDim(0.425F, 0))); + // m_instructionWindow->setText("Le systeme a besoin de faire quelques reglages.\nVeuillez vous concentrer sur les cibles indiques par les instructions.\n\nAppuyez sur la touche ESPACE pour commencer l'entrainement ..."); + m_instructionWindow->setText( + "The system needs to calibrate.\nPlease concentrate on the targets as instructed.\n\nPlease press SPACE to start the process ..."); + } + return true; +} + +void CImpactApplication::setupScene() const +{ + m_sceneManager->setAmbientLight(Ogre::ColourValue(1.0F, 1.0F, 1.0F)); + m_camera->setNearClipDistance(5); + + m_camera->setPosition(Ogre::Vector3(0, 100, 0)); + m_camera->lookAt(0, 0, 1); + m_camera->move(Ogre::Vector3(0, 0, 0)); + + Ogre::Light* pointLight = m_sceneManager->createLight(); + pointLight->setType(Ogre::Light::LT_POINT); + pointLight->setPosition(Ogre::Vector3(0, 50, 0)); + + pointLight->setDiffuseColour(1.0F, 1.0F, 0.8F); + pointLight->setSpecularColour(1.0F, 1.0F, 1.0F); + + pointLight = m_sceneManager->createLight(); + pointLight->setType(Ogre::Light::LT_POINT); + pointLight->setPosition(Ogre::Vector3(10, -10, 0)); + + pointLight->setDiffuseColour(0.5F, 0.0F, 0.0F); + + m_sceneLoader->parseDotScene("v6.scene", "SSVEPImpact", m_sceneManager); + m_sceneManager->getSceneNode("v6_sky")->showBoundingBox(true); + m_sceneManager->getSceneNode("v6_sky")->scale(200.0, 300.0, 300.0); + m_sceneManager->getSceneNode("v6_sky")->translate(0.0, 100.0, 0.0); +} + +bool CImpactApplication::enemyDestroyed(CImpactEnemyShip* es) { return es->isDestroyed(); } + + +void CImpactApplication::processFrame(const size_t frame) +{ + CApplication::processFrame(frame); + //std::cout << m_window->getAverageFPS() << "\n"; + + m_ship->processFrame(frame); + m_ship->setTargetLocked(false); + m_sceneManager->getSceneNode("v6_sky")->pitch(Ogre::Radian(0.0001F)); + + if (m_gameState == STARTED) + { + size_t nEnemy = 0; + bool targetWasDestroyed = false; + + int currentEnemyPointValue = 0; + + if (m_CurrEnemy != nullptr) { currentEnemyPointValue = m_CurrEnemy->getPointValue(); } + + m_CurrEnemy = nullptr; + for (auto it = m_targets.begin(); it != m_targets.end(); ++it) + { + (*it)->processFrame(); + + if ((*it)->isTouchable()) + { + m_ship->evaluateHit(*it); + + const Ogre::Vector2 enemyPosition = (*it)->getEnemyPosition(); + if (enemyPosition.x > m_ship->getNormalizedPosition().x - (*it)->getWidth() / 2.0 + && enemyPosition.x < m_ship->getNormalizedPosition().x + (*it)->getWidth() / 2.0) + { + m_CurrEnemy = (*it); + m_ship->setTargetLocked(true); + + if (currentEnemyPointValue != m_CurrEnemy->getPointValue()) + { + m_ship->activateCannonInhibitor(m_CurrEnemy->getPointValue() < 0); + + logPrefix() << "Targeting enemy : point value = " << m_CurrEnemy->getPointValue() << "\n"; + } + } + + if ((*it)->getPointValue() > 0) { nEnemy++; } + } + + + if ((*it)->isDestroyed()) + { + m_score += (*it)->getPointValue(); + delete *it; + m_statusWindow->setText(("Score: " + std::to_string(m_score)).c_str()); + targetWasDestroyed = true; + } + } + + if (currentEnemyPointValue != 0 && m_CurrEnemy == nullptr) { logPrefix() << "Focus on enemy lost\n"; } + + if (targetWasDestroyed) + { + const size_t targetCount = m_targets.size(); + + m_targets.erase(std::remove_if(m_targets.begin(), m_targets.end(), enemyDestroyed), m_targets.end()); + + if (m_targets.empty() && m_targets.size() < targetCount) { m_TargetRequest = true; } + + // if there are only friendly targets remaining make them leave + if (targetCount > 0 && nEnemy == 0) + { + for (auto it = m_targets.begin(); it != m_targets.end(); ++it) { if (!(*it)->m_EnemyLeaving) { (*it)->m_LeaveCountdown = 0; } } + } + } + } + + if (m_dialogHideDelay > 0) { if (--m_dialogHideDelay == 0) { m_instructionWindow->hide(); } } +} + +int CImpactApplication::getNextTargetType() +{ + if (!m_enemyOrder.empty()) + { + const int iNtt = m_enemyOrder.front(); + m_enemyOrder.pop(); + + return iNtt; + } + + return 0; +} + +void CImpactApplication::addTarget(const size_t targetPosition) +{ + float textSize = 0.25F; + + logPrefix() << "Add Target : position = " << targetPosition << "\n"; + + getLogManager() << Kernel::LogLevel_Info << "Adding target on position " << targetPosition << "\n"; + + if (m_gameState == TRAINING) + { + switch (targetPosition) + { + case 0: + textSize = 0.35F; + // m_instructionWindow->setText("Regardez au milieu (MIDDLE) du vaisseau!"); + m_instructionWindow->setText("Focus on the MIDDLE of the ship"); + this->m_StimulusSender->sendStimulation(OVTK_StimulationId_Label_00); + break; + + case 1: + textSize = 0.35F; + // m_instructionWindow->setText("Regardez le CANON (CANNON) du vaisseau pour tirer!"); + m_instructionWindow->setText("Focus on the CANNON to fire!"); + this->m_StimulusSender->sendStimulation(OVTK_StimulationId_Label_01); + break; + + case 2: + textSize = 0.50F; + // m_instructionWindow->setText("Regardez l'aile GAUCHE (LEFT WING) du vaisseau pour de`placer le vaisseau vers la gauche"); + m_instructionWindow->setText("Focus on the LEFT WING to turn the ship to the left"); + this->m_StimulusSender->sendStimulation(OVTK_StimulationId_Label_02); + break; + + case 3: + textSize = 0.50F; + // m_instructionWindow->setText("Regardez l'aile DROITE (RIGHT WING) du vaisseau pour de`placer le vaisseau vers la droite"); + m_instructionWindow->setText("Focus on the RIGHT WING to turn the ship to the right"); + this->m_StimulusSender->sendStimulation(OVTK_StimulationId_Label_03); + break; + default: break; + } + + m_instructionWindow->setSize(CEGUI::USize(CEGUI::UDim(textSize, 0), CEGUI::UDim(0.10F, 0))); + m_instructionWindow->setPosition(CEGUI::UVector2(CEGUI::UDim((1.0F - textSize) / 2.0F, 0), CEGUI::UDim(0.45F, 0))); + m_instructionWindow->show(); + m_dialogHideDelay = DIALOG_CYCLES_TO_REMOVE; + } + else if (m_gameState == STARTED) + { + // std::cout << (Ogre::Real( targetPosition ) - 3.5) / 7.0 * 100.0 << "\n"; + if (!m_enemyOrder.empty()) { m_ship->returnToMiddleAndWaitForFoe(targetPosition, m_NextOrigin); } + else { getLogManager() << Kernel::LogLevel_Error << "No more enemy types\n"; } + } +} + +void CImpactApplication::insertEnemy(const size_t targetPosition) +{ + logPrefix() << "Creating Enemy : position = " << targetPosition << "\n"; + m_targets.push_back(CImpactEnemyShip::createTarget((Ogre::Real(targetPosition) - 3.5F) / 7.0F * 100.0F)); +} + +void CImpactApplication::startFlickering() +{ + m_instructionWindow->hide(); + const size_t currentTime = size_t(time(nullptr) - m_startTime); + (*m_logManager) << Kernel::LogLevel_Info << currentTime << " > Starting Visual Stimulation\n"; + m_active = true; +} + +void CImpactApplication::stopFlickering() +{ + const size_t currentTime = size_t(time(nullptr) - m_startTime); + (*m_logManager) << Kernel::LogLevel_Info << currentTime << " > Stopping Visual Stimulation\n"; + m_active = false; + m_ship->setAllTargetsVisibility(true); +} + +void CImpactApplication::startExperiment() +{ + CApplication::startExperiment(); + + if (m_gameState == IDLE_TRAINING) + { + m_startTime = time(nullptr); + m_instructionWindow->hide(); + m_dialogHideDelay = 0; + m_gameState = TRAINING; + + m_ship->activatePilotAssist(false); + + logPrefix() << "Start Experiment : IDLE_TRAINING -> TRAINING\n"; + } + else if (m_gameState == IDLE_STARTED) + { + m_TargetRequest = true; + m_active = true; + m_instructionWindow->hide(); + m_dialogHideDelay = 0; + m_statusWindow->setPosition(CEGUI::UVector2(CEGUI::UDim(0.0F, 0), CEGUI::UDim(0.0F, 0))); + m_statusWindow->setSize(CEGUI::USize(CEGUI::UDim(0.15F, 0), CEGUI::UDim(0.05F, 0))); + m_statusWindow->setText("Score: 0"); + m_statusWindow->show(); + m_gameState = STARTED; + + logPrefix() << "Start Experiment : IDLE_STARTED -> STARTED\n"; + } +} + +void CImpactApplication::stopExperiment() +{ + if (m_gameState == TRAINING) + { + if (m_applicationSubtype == CString("trainer")) + { + logPrefix() << "Stop Experiment : exiting\n"; + this->exit(); + } + else + { + const float textSize = 0.35F; + // m_instructionWindow->setText("L'application va prendre quelque temps pour le calcul, veuillez patienter.\nLe jeu va commencer automatiquement une fois l'application est prete."); + m_instructionWindow->setText( + "The application needs some time to compute, please be patient.\nThe game starts automatically when the application is ready."); + m_instructionWindow->setSize(CEGUI::USize(CEGUI::UDim(textSize, 0), CEGUI::UDim(0.10F, 0))); + m_instructionWindow->setPosition(CEGUI::UVector2(CEGUI::UDim((1.0F - textSize) / 2.0F, 0), CEGUI::UDim(0.45F, 0))); + m_instructionWindow->show(); + + logPrefix() << "Stop Experiment : Training Finished\n"; + } + } + + if (m_gameState == STARTED) + { + const float textSize = 0.45F; + m_instructionWindow->setText(("Bravo!\nYou have obtained " + std::to_string(m_score) + " points!\nPress ESC to close the program").c_str()); + m_instructionWindow->setSize(CEGUI::USize(CEGUI::UDim(textSize, 0), CEGUI::UDim(0.10F, 0))); + m_instructionWindow->setPosition(CEGUI::UVector2(CEGUI::UDim((1.0F - textSize) / 2.0F, 0), CEGUI::UDim(0.45F, 0))); + m_instructionWindow->show(); + m_active = false; + m_ship->setAllTargetsVisibility(true); + + logPrefix() << "Stop Experiment : Game Ended\n"; + } +} + +void CImpactApplication::debugAction1() +{ + (*m_logManager) << Kernel::LogLevel_Debug << "Debug Action 1 triggered\n"; + this->startExperiment(); + m_ship->activatePilotAssist(true); +} + +void CImpactApplication::debugAction2() +{ + (*m_logManager) << Kernel::LogLevel_Info << "Debug Action 2 triggered\n"; + + //if (m_TargetRequest && m_enemyOrder.size() > 2) + { + this->addTarget(1); + this->addTarget(6); + this->addTarget(4); + m_TargetRequest = false; + } +} + +void CImpactApplication::debugAction3() +{ + (*m_logManager) << Kernel::LogLevel_Info << "Debug Action 3 triggered\n"; + + m_TargetRequest = true; +} + +void CImpactApplication::debugAction4() +{ + (*m_logManager) << Kernel::LogLevel_Info << "Debug Action 4 triggered\n"; + (*m_logManager) << Kernel::LogLevel_Info << "You (X: " << m_ship->getPosition().x << ", Y: " << m_ship->getPosition().y << ")\n"; + + if (!m_targets.empty()) + { + const Ogre::Vector2 enemyPosition = m_targets[0]->getEnemyPosition(); + (*m_logManager) << Kernel::LogLevel_Info << "Him (X: " << enemyPosition.x << ", Y: " << enemyPosition.y << ")\n"; + } +} + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactApplication.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactApplication.h new file mode 100755 index 0000000..2b03d8b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactApplication.h @@ -0,0 +1,92 @@ +#pragma once + +#include +#include + +#include "dotscene/DotSceneLoader.h" + +#include "../ovamsCApplication.h" +#include "ovamsCImpactEnemyShip.h" +#include "ovamsCImpactShip.h" +#include + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CImpactApplication final : public CApplication +{ +public: + enum EGameState { BOOTING, IDLE_TRAINING, TRAINING, IDLE_STARTED, STARTED }; + + struct SStimulatorState + { + float ship_position; + std::array feedback_level; + int ship_direction; + bool shooting; + }; + + struct SGameState + { + int movements_right; + int movements_left; + int shoots_fired; + }; + + CImpactApplication(const CString& scenarioDir, const CString& applicationSubtype); + ~CImpactApplication() override; + + bool setup(Kernel::IKernelContext* kernelCtx) override; + + CImpactShip* getShip() const { return m_ship; } + bool isActive() const { return m_active; } + + void startExperiment() override; + void stopExperiment() override; + void startFlickering() override; + void stopFlickering() override; + + void debugAction1() override; + void debugAction2() override; + void debugAction3() override; + void debugAction4() override; + + int getNextTargetType(); + void addTarget(size_t targetPosition); + + void insertEnemy(size_t targetPosition); + CImpactEnemyShip* getCurrentEnemy() const { return m_CurrEnemy; } + CString getSubtype() const { return m_applicationSubtype; } + EGameState getState() const { return m_gameState; } + DotSceneLoader* getSceneLoader() const { return m_sceneLoader; } + CEGUI::Window* getInstructionWindow() const { return m_instructionWindow; } + + CImpactEnemyShip* m_CurrEnemy = nullptr; + bool m_TargetRequest = false; + Ogre::Real m_NextOrigin = 0.0; + +private: + void setupScene() const; + void processFrame(const size_t frame) override; + static bool enemyDestroyed(CImpactEnemyShip* /*es*/); + + + CString m_applicationSubtype; + EGameState m_gameState = BOOTING; + + std::queue m_enemyOrder; + + bool m_active = false; + + time_t m_startTime; + + DotSceneLoader* m_sceneLoader = nullptr; + CEGUI::Window* m_statusWindow = nullptr; + CEGUI::Window* m_instructionWindow = nullptr; + size_t m_dialogHideDelay = 0; + + CImpactShip* m_ship = nullptr; + std::vector m_targets; + int m_score = 0; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactEnemyShip.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactEnemyShip.cpp new file mode 100755 index 0000000..a6c4589 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactEnemyShip.cpp @@ -0,0 +1,258 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsCImpactEnemyShip.h" +#include "ovamsCImpactApplication.h" + +#define IMPACTSHIP_SIZE 0.2f +#define SCREEN_RATIO ( 16.0f / 9.0f ) + +namespace OpenViBE { +namespace SSVEPMindShooter { + +CImpactApplication* CImpactEnemyShip::m_application = nullptr; +Ogre::SceneNode* CImpactEnemyShip::m_parentNode = nullptr; +CBasicPainter* CImpactEnemyShip::m_painter = nullptr; +int CImpactEnemyShip::m_nCurrentExplosion = 0; + +void CImpactEnemyShip::initialize(CImpactApplication* application) +{ + m_application = application; + m_painter = m_application->getPainter(); + m_parentNode = m_application->getSceneNode(); +} + +CImpactEnemyShip* CImpactEnemyShip::createTarget(const Ogre::Real position) +{ + if (m_application == nullptr) + { + std::cerr << "The CImpactEnemyShip was not initialized" << std::endl; + return nullptr; + } + + return new CImpactEnemyShip(position); +} + +CImpactEnemyShip::CImpactEnemyShip(const Ogre::Real position) +{ + m_EnemyLeaving = false; + const int type = m_application->getNextTargetType(); + m_application->logPrefix() << "Creating enemy " << type << "\n"; + + if (type > 0 && type <= 6) + { + switch (type) + { + case 1: + m_application->getSceneLoader()->parseDotScene("v2.scene", "SSVEPImpact", m_application->getSceneManager()); + + m_enemyNode = m_application->getSceneManager()->getSceneNode("v2_vaisseau"); + m_enemyNode->scale(1.0F, 1.0F, 1.0F); + m_shipWidth = 0.5F; + m_LeaveCountdown = int(2.0F * 3600); + m_pointValue = 100; + break; + case 2: + m_application->getSceneLoader()->parseDotScene("v1.scene", "SSVEPImpact", m_application->getSceneManager()); + + m_enemyNode = m_application->getSceneManager()->getSceneNode("v1_vaisseau"); + m_enemyNode->scale(1.9F, 1.9F, 1.9F); + m_shipWidth = 0.45F; + m_LeaveCountdown = int(1.5F * 3600); + m_pointValue = 200; + break; + case 3: + m_application->getSceneLoader()->parseDotScene("v3.scene", "SSVEPImpact", m_application->getSceneManager()); + + m_enemyNode = m_application->getSceneManager()->getSceneNode("v3_vaisseau"); + m_enemyNode->scale(2.2F, 2.0F, 2.0F); + m_shipWidth = 0.4F; + m_LeaveCountdown = int(1.0F * 3600); + m_pointValue = 400; + break; + case 4: + m_application->getSceneLoader()->parseDotScene("ship-cheap.scene", "SSVEPImpact", m_application->getSceneManager()); + m_enemyNode = m_application->getSceneManager()->getSceneNode("ship-cheap_node"); + m_pointValue = 500; + break; + case 5: + m_application->getSceneLoader()->parseDotScene("ship-costly.scene", "SSVEPImpact", m_application->getSceneManager()); + m_enemyNode = m_application->getSceneManager()->getSceneNode("ship-costly_node"); + m_pointValue = 1500; + break; + case 6: + m_application->getSceneLoader()->parseDotScene("ship-friend.scene", "SSVEPImpact", m_application->getSceneManager()); + m_enemyNode = m_application->getSceneManager()->getSceneNode("ship-friend_node"); + m_pointValue = -500; + break; + default: + break; + } + + if (type >= 4 && type <= 6) + { + m_enemyNode->scale(1.2F, 1.2F, 1.2F); + m_shipWidth = 0.3F; + m_LeaveCountdown = int(1.0F * 3600); + } + + + m_enemyNode->yaw(Ogre::Radian(Ogre::Math::PI)); + + m_hitBox = m_application->getSceneNode()->createChildSceneNode(); + + + //m_hitBox->attachObject(m_painter->paintTriangle(Vector2(+ m_shipWidth / 2, +0.9), Vector2(- m_shipWidth / 2, +0.9), Vector2( 0.0, +0.5))); + + + m_hitBox->translate(position / 70.0F, 1.2F, 0.0F, Ogre::Node::TS_LOCAL); + m_enemyNode->translate(position, 0.0F, -60.0F, Ogre::Node::TS_LOCAL); + m_incomingStatus = 30.0F; + } + else { m_application->getLogManager() << Kernel::LogLevel_Fatal << "Unknown enemy type " << type << " ! The application will now crash!\n"; } +} + +void CImpactEnemyShip::destroyAllAttachedMovableObjects(Ogre::SceneNode* sceneNode) +{ + if (!sceneNode) { return; } + + // Destroy all the attached objects + Ogre::SceneNode::ObjectIterator itObject = sceneNode->getAttachedObjectIterator(); + + while (itObject.hasMoreElements()) + { + Ogre::MovableObject* pObject = static_cast(itObject.getNext()); + sceneNode->getCreator()->destroyMovableObject(pObject); + } + + Ogre::SceneNode::ChildNodeIterator itChild = sceneNode->getChildIterator(); + + while (itChild.hasMoreElements()) + { + Ogre::SceneNode* pChildNode = dynamic_cast(itChild.getNext()); + destroyAllAttachedMovableObjects(pChildNode); + } +} + +CImpactEnemyShip::~CImpactEnemyShip() +{ + m_application->logPrefix() << "Enemy Destroyed\n"; + + destroyAllAttachedMovableObjects(m_enemyNode); + m_enemyNode->removeAndDestroyAllChildren(); + m_enemyNode->getCreator()->destroySceneNode(m_enemyNode); + + destroyAllAttachedMovableObjects(m_hitBox); + m_hitBox->removeAndDestroyAllChildren(); + m_hitBox->getCreator()->destroySceneNode(m_hitBox); +} + +void CImpactEnemyShip::processFrame() +{ + // oscillation animation + static int oscillator = 90; + + if (m_LeaveCountdown > 0 && !m_EnemyLeaving) { m_LeaveCountdown--; } + if (m_LeaveCountdown == 0 && !m_EnemyLeaving) + { + m_application->logPrefix() << "Enemy Leaving\n"; + + m_EnemyLeaving = true; + m_pointValue = 0; + } + + if (!m_EnemyLeaving) + { + oscillator++; + oscillator = oscillator % 360; + // m_enemyNode->roll(Radian(Math::Sin(Degree(sin_oscillator)) / 80)); + m_enemyNode->translate(Ogre::Math::Sin(Ogre::Degree(Ogre::Real(oscillator))) / 20.0F * 0, + Ogre::Math::Sin(Ogre::Degree(Ogre::Real(oscillator * 2 + 90))) / 20, 0.0F, Ogre::Node::TS_LOCAL); + m_hitBox->translate(Ogre::Math::Sin(Ogre::Degree(Ogre::Real(oscillator))) / 20.0F / 50.0F * 0, 0.0F, 0.0F, Ogre::Node::TS_LOCAL); + + + // incoming enemy animation + if (m_incomingStatus > 0) + { + m_hitBox->translate(0.0F, -0.04F, 0.0F, Ogre::Node::TS_LOCAL); + m_enemyNode->translate(0.0F, 0.0F, 1.0F, Ogre::Node::TS_LOCAL); + m_incomingStatus -= 1.0F; + } + + // exploding ship animation + if (m_destructionStatus > 3) + { + m_destructionStatus++; + + m_enemyNode->translate(0.1F, 2, 1, Ogre::Node::TS_PARENT); + m_enemyNode->rotate(Ogre::Vector3(0.3F, 0.25F, 1.0F), Ogre::Radian(3.14F / 20.0F), Ogre::Node::TS_LOCAL); + m_enemyNode->scale(0.95F, 0.95F, 0.95F); + } + } + else + { + m_enemyNode->translate(0.0F, -1.0F, float(m_LeaveCountdown) * 0.5F, Ogre::Node::TS_LOCAL); + m_LeaveCountdown++; + + if (m_enemyNode->getPosition().z < -100) + { + m_shipDestroyed = true; + m_application->logPrefix() << "Enemy Left : marked as destroyed\n"; + } + } + + if (m_destructionStatus > 50) + { + m_shipDestroyed = true; + if (this->getPointValue() > 0) { m_application->logPrefix() << "Enemy Shot Down : marked as destroyed\n"; } + else { m_application->logPrefix() << "Friendly Target Shot Down : marked as destroyed\n"; } + } + + + // handle the explosions + for (auto it = m_explosions.begin(); it != m_explosions.end(); ++it) + { + (*it)->ttl--; + + if ((*it)->ttl < 4 && (*it)->ttl >= 0) + { + Ogre::ParticleEmitter* emitter = (*it)->particleSystem->getEmitter(0); + emitter->setEmissionRate(emitter->getEmissionRate() - 50); + } + + if (explostionExhausted(*it)) + { + m_painter->getSceneManager()->destroyParticleSystem((*it)->particleSystem); + (*it)->node->getCreator()->destroySceneNode((*it)->node); + delete *it; + } + } + + m_explosions.erase(std::remove_if(m_explosions.begin(), m_explosions.end(), explostionExhausted), m_explosions.end()); +} + +void CImpactEnemyShip::processHit(const Ogre::Vector2 point) +{ + // set status of the ship as exploding + if (m_destructionStatus <= 3) + { + m_destructionStatus++; + m_application->logPrefix() << "Enemy Lost a Hitpoint : current hits = " << m_destructionStatus << "\n"; + } + + // create the explosion upon hit + struct SExplosionAnimation* explosion = new struct SExplosionAnimation; + const char* projectileName = ("Explosion " + std::to_string(++m_nCurrentExplosion)).c_str(); + explosion->particleSystem = m_painter->getSceneManager()->createParticleSystem(projectileName, "Particle/Explosion"); + + + explosion->ttl = 25; + explosion->node = m_parentNode->createChildSceneNode(); + explosion->node->attachObject(explosion->particleSystem); + explosion->node->translate(point.x * -65.0F, 0.0F, 30.0F, Ogre::Node::TS_WORLD); + + m_explosions.push_back(explosion); +} + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactEnemyShip.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactEnemyShip.h new file mode 100755 index 0000000..840f0bd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactEnemyShip.h @@ -0,0 +1,61 @@ +#pragma once + +#include + +#include "../ovamsCBasicPainter.h" + +#define SSVEP_SHOOTER_TARGET_SIZE 0.15f + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CImpactApplication; + +class CImpactEnemyShip +{ +public: + static CImpactEnemyShip* createTarget(Ogre::Real position); + static void initialize(CImpactApplication* application); + ~CImpactEnemyShip(); + + void processFrame(); + void processHit(Ogre::Vector2 point); + + Ogre::Vector2 getEnemyPosition() const { return Ogre::Vector2(m_hitBox->getPosition().x, m_hitBox->getPosition().y); } + bool isDestroyed() const { return m_shipDestroyed; } + bool isTouchable() const { return m_destructionStatus < 10 && !m_EnemyLeaving; } + int getPointValue() const { return m_pointValue; } + Ogre::Real getWidth() const { return m_shipWidth; } + int m_LeaveCountdown = 0; + bool m_EnemyLeaving = false; + +private: + + struct SExplosionAnimation + { + Ogre::ParticleSystem* particleSystem; + Ogre::SceneNode* node; + int ttl; + }; + + static bool explostionExhausted(struct SExplosionAnimation* ea) { return ea->ttl < -25; } + static void destroyAllAttachedMovableObjects(Ogre::SceneNode* sceneNode); + + static CImpactApplication* m_application; + static Ogre::SceneNode* m_parentNode; + static CBasicPainter* m_painter; + + Ogre::SceneNode* m_enemyNode = nullptr; + Ogre::SceneNode* m_hitBox = nullptr; + Ogre::Real m_incomingStatus = 0; + Ogre::Real m_shipWidth = 0.1F; + Ogre::uint32 m_destructionStatus = 0; + bool m_shipDestroyed = false; + int m_pointValue = 100; + + explicit CImpactEnemyShip(Ogre::Real position); + + static int m_nCurrentExplosion; + std::vector m_explosions; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactShip.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactShip.cpp new file mode 100755 index 0000000..4eec119 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactShip.cpp @@ -0,0 +1,403 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsCImpactShip.h" + +#include "ovamsCImpactEnemyShip.h" +#include "ovamsCImpactApplication.h" +#include "../ovamsCSSVEPFlickeringObject.h" + +#define SSVEP_SHIP_HULL_COLOUR Ogre::ColourValue(0.0f, 0.5f, 0.5f) +#define SIGN(x) ( (x) < 0 ? -1 : 1 ) + +#define SCREEN_RATIO ( 16.0f / 9.0f ) +#define IMPACTSHIP_SIZE 0.2f +#define IMPACTSHIP_SPEEDFACTOR 0.7f + +namespace OpenViBE { +namespace SSVEPMindShooter { + +//SP CImpactShip::CImpactShip(CImpactApplication* application, Ogre::SceneNode* parentNode, std::vector >* pFrequencies) : +CImpactShip::CImpactShip(CImpactApplication* application, Ogre::SceneNode* parentNode, std::vector* pFrequencies) + : m_application(application), m_currentAngle(0) +{ + m_application->getLogManager() << Kernel::LogLevel_Info << "Loading ship\n"; + + m_application->getSceneLoader()->parseDotScene("v5.scene", "SSVEPImpact", m_application->getSceneManager()); + + m_targetStates[0] = TS_NORMAL; + m_targetStates[1] = TS_NORMAL; + m_targetStates[2] = TS_NORMAL; + + Ogre::SceneManager* sceneManager = m_application->getSceneManager(); + m_projectilesNode = parentNode->createChildSceneNode(); + + m_shipNode = sceneManager->getSceneNode("battleship"); + m_shipNode->scale(0.6F, 0.6F, 0.6F); + m_shipNode->yaw(Ogre::Radian(-Ogre::Math::PI / 2.0F)); + m_shipNode->translate(-25.0F, 0.0F, 0.0F, Ogre::Node::TS_LOCAL); + + if (!pFrequencies || pFrequencies->size() < 4) + { + std::cout << "Error: Expected the frequencies vector to contain indexes 0...3 but its size is " << (pFrequencies ? pFrequencies->size() : -1) << + ". Crash is likely imminent.\n"; + } + + sceneManager->getSceneNode("v5_ecran_avant2")->setVisible(false); + m_shipCannon = new CSSVEPFlickeringObject(sceneManager->getSceneNode("shipCannon"), (*pFrequencies)[1]); + + sceneManager->getSceneNode("v5_aile_gauche2")->setVisible(false); + m_shipLeftWing = new CSSVEPFlickeringObject(sceneManager->getSceneNode("shipLeftWing"), (*pFrequencies)[2]); + + sceneManager->getSceneNode("v5_aile_droite2")->setVisible(false); + m_shipRightWing = new CSSVEPFlickeringObject(sceneManager->getSceneNode("shipRightWing"), (*pFrequencies)[3]); + + + sceneManager->getSceneNode("feedback")->setVisible(true); + + m_targetingNode = sceneManager->getSceneNode("v5_viseur"); +} + +void CImpactShip::activatePilotAssist(const bool activate) +{ + m_pilotAssistActive = activate; + m_application->logPrefix() << "Pilot Assist : " << (activate ? "ON" : "OFF") << "\n"; +} + +void CImpactShip::activateCannonInhibitor(const bool activate) +{ + m_cannonInhibited = activate; + + m_application->logPrefix() << "Cannon Inhibitor : " << (activate ? "ON" : "OFF") << "\n"; +} + +void CImpactShip::activateTargetLockdown(const bool activate) +{ + m_targetLockdownActive = activate; + m_application->logPrefix() << "Target Lockdown : " << (activate ? "ON" : "OFF") << "\n"; +} + +void CImpactShip::activateFeedback(const bool activate) +{ + m_feedbackActive = activate; + m_application->getSceneManager()->getSceneNode("feedback")->setVisible(activate); + m_application->logPrefix() << "Feedback : " << (activate ? "ON" : "OFF") << "\n"; +} + +void CImpactShip::activateFocusPoint(const bool activate) +{ + m_focusPointActive = activate; + m_application->getSceneManager()->getSceneNode("feedback")->setVisible(!m_focusPointActive && m_feedbackActive); + + if (activate) + { + m_application->getSceneManager()->getSceneNode("v5_a1a")->setVisible(false); + m_application->getSceneManager()->getSceneNode("v5_a2a")->setVisible(true); + m_application->getSceneManager()->getSceneNode("v5_a3a")->setVisible(false); + m_application->getSceneManager()->getSceneNode("v5_g1a")->setVisible(true); + m_application->getSceneManager()->getSceneNode("v5_g2a")->setVisible(false); + m_application->getSceneManager()->getSceneNode("v5_g3a")->setVisible(false); + m_application->getSceneManager()->getSceneNode("v5_d1a")->setVisible(true); + m_application->getSceneManager()->getSceneNode("v5_d2a")->setVisible(false); + m_application->getSceneManager()->getSceneNode("v5_d3a")->setVisible(false); + } + + m_application->logPrefix() << "FocusPoint : " << (activate ? "ON" : "OFF") << "\n"; +} + + +bool CImpactShip::projectileExhausted(struct SBlasterProjectile* bp) { return bp->iTTL <= 0; } + +void CImpactShip::setAllTargetsVisibility(const bool visible) const +{ + m_shipCannon->setVisible(visible); + m_shipLeftWing->setVisible(visible); + m_shipRightWing->setVisible(visible); +} + +void CImpactShip::processFrame(const size_t /*currentFrame*/) +{ + if (m_shootingCooldown > 0) { m_shootingCooldown--; } + if (m_application->isActive()) + { + // deactivate the wing targets when the ship is on the border + // std::cout << this->getNormalizedPosition() << "\n"; + + if (getNormalizedPosition().x >= -0.75 || !m_targetLockdownActive) + { + m_shipLeftWing->processFrame(); + m_targetStates[1] = TS_NORMAL; + } + else + { + m_shipLeftWing->setVisible(false); + m_targetStates[1] = TS_OFF; + } + + + if (getNormalizedPosition().x <= 0.75 || !m_targetLockdownActive) + { + m_shipRightWing->processFrame(); + m_targetStates[2] = TS_NORMAL; + } + else + { + m_shipRightWing->setVisible(false); + m_targetStates[2] = TS_OFF; + } + + // deactivate the cannon when there is no target locked + if (m_targetLocked || (!m_targetLockdownActive)) + { + m_shipCannon->processFrame(); + m_targetStates[0] = (m_cannonInhibited ? TS_INHIBITED : TS_NORMAL); + } + else + { + m_shipCannon->setVisible(false); + m_targetStates[0] = TS_OFF; + } + } + + m_targetingNode->pitch(Ogre::Degree(2), Ogre::Node::TS_PARENT); + + if (m_targetLocked) { m_targetingNode->setVisible(true); } + else { m_targetingNode->setVisible(false); } + + /* + if (m_prepareAnimationFrame > 0) + { + m_shipNode->translate(0.0f, -0.01f, 0.0f); + m_prepareAnimationFrame--; + } + */ + if (m_returning) + { + if (getNormalizedPosition().x < m_origin - 5e-2 || getNormalizedPosition().x > m_origin + 5e-2) + { + m_nCurrentDisplacement = (getNormalizedPosition().x < m_origin) ? 1 : -1; + } + else + { + m_application->logPrefix() << "Ship Returned to Initial Position\n"; + m_returning = false; + m_application->startFlickering(); + while (!m_nextEnemyPosition.empty()) + { + const size_t nextEnemyPosition = m_nextEnemyPosition.front(); + m_nextEnemyPosition.pop_front(); + m_application->insertEnemy(nextEnemyPosition); + } + } + } + + if (m_nCurrentDisplacement != 0) + { + // m_application->logPrefix() << "Displacement Vector : value = " << m_nCurrentDisplacement << "\n"; + + if (m_returning || !m_targetLocked || !m_pilotAssistActive) + { + m_application->logPrefix() << "Ship Moving : direction " << (m_nCurrentDisplacement > 0 ? "left" : "right") << ", full speed\n"; + m_shipNode->translate(0.5F * -float(SIGN(m_nCurrentDisplacement)) * IMPACTSHIP_SPEEDFACTOR, 0.0F, 0.0F); + } + else + { + Ogre::Real slowdown = 0.0; + + if (m_application->getCurrentEnemy() != nullptr && m_application->getCurrentEnemy()->getPointValue() > 0) + { + const Ogre::Real enemyPos = m_application->getCurrentEnemy()->getEnemyPosition().x; + const Ogre::Real shipPos = getNormalizedPosition().x; + + + if (fabs(enemyPos - shipPos) < m_application->getCurrentEnemy()->getWidth() / 2) + { + const Ogre::Real distance = fabs(shipPos - enemyPos) / (m_application->getCurrentEnemy()->getWidth() / 2); + + if (SIGN(m_nCurrentDisplacement) == SIGN(shipPos - enemyPos)) { slowdown = 1.0F - distance * distance * distance; } + + if (SIGN(m_nCurrentDisplacement) > 0) { m_targetStates[2] = TS_INHIBITED; } + else { m_targetStates[1] = TS_INHIBITED; } + } + } + m_application->logPrefix() << "Ship Moving : direction " << (m_nCurrentDisplacement > 0 ? "left" : "right") << ", slowdown = " << slowdown << "\n"; + m_shipNode->translate((0.5F - slowdown * 0.3F) * -float(SIGN(m_nCurrentDisplacement)) * IMPACTSHIP_SPEEDFACTOR, 0.0F, 0.0F); + } + + // m_targetingNode->translate( 0.007f * SIGN(m_nCurrentDisplacement), 0.0f, 0.0f ); + m_nCurrentDisplacement -= SIGN(m_nCurrentDisplacement); + } + + + for (auto it = m_projectiles.begin(); it != m_projectiles.end(); ++it) + { + (*it)->iTTL--; + + (*it)->pNode->translate(0.0, -2.0, 0.0, Ogre::Node::TS_LOCAL); + (*it)->rRelY -= 1.0F / 65.0F; + + + if (projectileExhausted(*it)) + { + m_application->getSceneManager()->destroyParticleSystem((*it)->pParticleSystem); + (*it)->pNode->getCreator()->destroySceneNode((*it)->pNode); + delete *it; + } + } + m_projectiles.erase(std::remove_if(m_projectiles.begin(), m_projectiles.end(), projectileExhausted), m_projectiles.end()); + + + if (m_oldPosition != m_shipNode->getPosition().x) + { + m_oldPosition = m_shipNode->getPosition().x; + m_application->logPrefix() << "New Ship Position : " << m_oldPosition << " / Normalized X : " << getNormalizedPosition().x << "\n"; + } +} + +void CImpactShip::move(const int displacement) +{ + if (displacement < 0 && getNormalizedPosition().x <= -0.75) { return; } + if (displacement > 0 && getNormalizedPosition().x >= 0.75) { return; } + + //m_application->logPrefix() << "Move : diff vector = " << displacement << ", current vector = " << m_nCurrentDisplacement; + + if (abs(m_nCurrentDisplacement) < 6) { m_nCurrentDisplacement += displacement; } + + //m_application->getLogManager() << ", resulting vector = " << m_nCurrentDisplacement << "\n"; +} + +void CImpactShip::shoot() +{ + m_application->logPrefix() << "Shoot : "; + + if (m_targetLockdownActive && !m_targetLocked) + { + m_application->logPrefix() << "CANCELED : pilot assist blocked the shot\n"; + return; + } + + + if (m_shootingCooldown > 0) + { + m_application->logPrefix() << "CANCELED : shooting cooldown blocked the shot\n"; + return; + } + + m_shootingCooldown = (m_targetStates[0] == TS_INHIBITED) ? 24 : 12; + + struct SBlasterProjectile* projectile = new struct SBlasterProjectile; + + const std::string projectileName = "Projectile_" + std::to_string(++m_nShot); + projectile->pParticleSystem = m_application->getSceneManager()->createParticleSystem(projectileName, "Particle/PurpleFountain"); + + + projectile->iTTL = 70; + projectile->pNode = m_projectilesNode->createChildSceneNode(); + projectile->pNode->pitch(Ogre::Radian(-Ogre::Math::PI / 2.0F)); + projectile->pNode->translate(this->getPosition().x, 20.0, 0.0, Ogre::Node::TS_LOCAL); + + projectile->pNode->attachObject(projectile->pParticleSystem); + + projectile->rRelX = -m_shipNode->getPosition().x / 70.0F; + projectile->rRelY = 0.6F; + + + m_application->getLogManager() << "OK : creating particle system\n"; + m_projectiles.push_back(projectile); +} + +void CImpactShip::setFeedbackLevels(const int f1, int f2, int f3) +{ + if (m_focusPointActive) { return; } + + Ogre::SceneManager* sceneManager = m_application->getSceneManager(); + + if (m_targetStates[1] == TS_OFF) { f2 = 0; } + if (m_targetStates[2] == TS_OFF) { f3 = 0; } + + sceneManager->getSceneNode("v5_a1b")->setVisible(false); + sceneManager->getSceneNode("v5_a2b")->setVisible(false); + sceneManager->getSceneNode("v5_a3b")->setVisible(false); + sceneManager->getSceneNode("v5_g1b")->setVisible(false); + sceneManager->getSceneNode("v5_g2b")->setVisible(false); + sceneManager->getSceneNode("v5_g3b")->setVisible(false); + sceneManager->getSceneNode("v5_d1b")->setVisible(false); + sceneManager->getSceneNode("v5_d2b")->setVisible(false); + sceneManager->getSceneNode("v5_d3b")->setVisible(false); + + if (m_feedbackActive) + { + int nActives = 0; + + if (f1 > 0) { sceneManager->getSceneNode("v5_a1b")->setVisible(true); } + if (f1 > 1) { sceneManager->getSceneNode("v5_a2b")->setVisible(true); } + if (f1 > 2) + { + sceneManager->getSceneNode("v5_a3b")->setVisible(true); + nActives++; + } + if (f2 > 0) { sceneManager->getSceneNode("v5_g1b")->setVisible(true); } + if (f2 > 1) { sceneManager->getSceneNode("v5_g2b")->setVisible(true); } + if (f2 > 2) + { + sceneManager->getSceneNode("v5_g3b")->setVisible(true); + nActives++; + } + if (f3 > 0) { sceneManager->getSceneNode("v5_d1b")->setVisible(true); } + if (f3 > 1) { sceneManager->getSceneNode("v5_d2b")->setVisible(true); } + if (f3 > 2) + { + sceneManager->getSceneNode("v5_d3b")->setVisible(true); + nActives++; + } + + if (nActives > 1) + { + sceneManager->getSceneNode("v5_a3b")->setVisible(false); + sceneManager->getSceneNode("v5_g3b")->setVisible(false); + sceneManager->getSceneNode("v5_d3b")->setVisible(false); + } + + if (m_targetLockdownActive && !m_targetLocked) + { + sceneManager->getSceneNode("v5_a1b")->setVisible(false); + sceneManager->getSceneNode("v5_a2b")->setVisible(false); + sceneManager->getSceneNode("v5_a3b")->setVisible(false); + } + } +} + +void CImpactShip::returnToMiddleAndWaitForFoe(const size_t targetPosition, const Ogre::Real position) +{ + m_application->logPrefix() << "Ship Returning to Middle Position\n"; + m_nextEnemyPosition.push_back(targetPosition); + m_application->stopFlickering(); + m_origin = position; + m_returning = true; +} + +bool CImpactShip::evaluateHit(CImpactEnemyShip* enemy) +{ + const Ogre::Vector2 point = enemy->getEnemyPosition(); + // std::cout << "enemy:" << enemy->getEnemyPosition() << "\n"; + for (auto it = m_projectiles.begin(); it != m_projectiles.end(); ++it) + { + // std::cout << "proj: " << (*it)->rRelX << " " << (*it)->rRelY << "\n"; + + if (Ogre::Math::pointInTri2D(Ogre::Vector2((*it)->rRelX, (*it)->rRelY), + Ogre::Vector2(point.x + enemy->getWidth() / 2.0F, point.y + enemy->getWidth() / 2.0F), + Ogre::Vector2(point.x - enemy->getWidth() / 2.0F, point.y + enemy->getWidth() / 2.0F), + Ogre::Vector2(point.x, point.y - 0.1F))) + { + m_application->logPrefix() << "Enemy Hit!\n"; + (*it)->iTTL = 1; + enemy->processHit(Ogre::Vector2((*it)->rRelX, (*it)->rRelY)); + return true; + } + } + + return false; +} + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactShip.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactShip.h new file mode 100755 index 0000000..a19debb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/Impact/ovamsCImpactShip.h @@ -0,0 +1,89 @@ +#pragma once + +#include + +#include + +#include +#include + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CImpactApplication; +class CImpactEnemyShip; +class CSSVEPFlickeringObject; + +class CImpactShip +{ +public: + enum ETargetState { TS_NORMAL, TS_INHIBITED, TS_OFF }; + + //SP CImpactShip( CImpactApplication* application, Ogre::SceneNode* parentNode, std::vector >* pFrequencies); + CImpactShip(CImpactApplication* application, Ogre::SceneNode* parentNode, std::vector* pFrequencies); + void processFrame(const size_t currentFrame); + + void moveToPosition() { m_prepareAnimationFrame = 70; } + void move(int displacement); + void shoot(); + bool evaluateHit(CImpactEnemyShip* enemy); + void setAllTargetsVisibility(bool visible) const; + Ogre::Vector2 getPosition() const { return Ogre::Vector2(m_shipNode->getPosition().x, m_shipNode->getPosition().y); } + Ogre::Vector2 getNormalizedPosition() const { return Ogre::Vector2(-m_shipNode->getPosition().x / 70.0F, m_shipNode->getPosition().y); } + void setTargetLocked(const bool targetLocked) { m_targetLocked = targetLocked; } + + void setFeedbackLevels(int f1, int f2, int f3); + void activatePilotAssist(const bool activate); + void activateCannonInhibitor(const bool activate); + void activateTargetLockdown(const bool activate); + void activateFeedback(const bool activate); + void activateFocusPoint(const bool activate); + void returnToMiddleAndWaitForFoe(size_t targetPosition, Ogre::Real position = 0.0); + + ETargetState getTargetState(const int target) { return m_targetStates[target]; } + +private: + + struct SBlasterProjectile + { + Ogre::ParticleSystem* pParticleSystem; + Ogre::SceneNode* pNode; + Ogre::SceneNode* pOutlineNode; + int iTTL; + Ogre::Real rRelX, rRelY; + }; + + static bool projectileExhausted(struct SBlasterProjectile* /*bp*/); + + CImpactApplication* m_application = nullptr; + + Ogre::SceneNode* m_shipNode = nullptr; + Ogre::SceneNode* m_targetingNode = nullptr; + Ogre::SceneNode* m_projectilesNode = nullptr; + + CSSVEPFlickeringObject* m_shipCannon = nullptr; + CSSVEPFlickeringObject* m_shipLeftWing = nullptr; + CSSVEPFlickeringObject* m_shipRightWing = nullptr; + + ETargetState m_targetStates[3]; + + int m_prepareAnimationFrame = 0; + bool m_targetLocked = true; + bool m_returning = false; + std::deque m_nextEnemyPosition; + bool m_pilotAssistActive = false; + bool m_targetLockdownActive = false; + bool m_feedbackActive = false; + bool m_focusPointActive = false; + bool m_cannonInhibited = false; + + Ogre::Radian m_currentAngle; + int m_nCurrentDisplacement = 0; + + int m_shootingCooldown = 0; + std::vector m_projectiles; + int m_nShot = 0; + Ogre::Real m_origin = 0.0; + Ogre::Real m_oldPosition = 0; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/log/ovkCLogListenerFileBuffered.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/log/ovkCLogListenerFileBuffered.cpp new file mode 100755 index 0000000..6187b78 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/log/ovkCLogListenerFileBuffered.cpp @@ -0,0 +1,103 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovkCLogListenerFileBuffered.h" + +#include +#include + +namespace OpenViBE { +namespace Kernel { + +CLogListenerFileBuffered::CLogListenerFileBuffered(const IKernelContext& /*context*/, const CString& applicationName, const CString& logFilename) + : m_applicationName(applicationName), m_logFilename(logFilename) +{ + m_f = fopen(m_logFilename.toASCIIString(), "wt"); + if (m_f == nullptr) + { + std::cout << "[ ERROR ] Unable to open [" << m_logFilename << "] for writing. This log listener can not be initialized, it will do nothing!" << std::endl; + } +} + +CLogListenerFileBuffered::~CLogListenerFileBuffered() { if (m_f != nullptr) { fclose(m_f); } } + +bool CLogListenerFileBuffered::isActive(const ELogLevel level) +{ + const auto it = m_activeLevels.find(level); + if (it == m_activeLevels.end()) { return true; } + return it->second; +} + +bool CLogListenerFileBuffered::activate(const ELogLevel level, const bool active) +{ + m_activeLevels[level] = active; + return true; +} + +bool CLogListenerFileBuffered::activate(const ELogLevel startLevel, const ELogLevel endLevel, const bool active) +{ + for (int i = startLevel; i <= endLevel; ++i) { m_activeLevels[ELogLevel(i)] = active; } + return true; +} + +bool CLogListenerFileBuffered::activate(const bool active) { return activate(LogLevel_First, LogLevel_Last, active); } + +void CLogListenerFileBuffered::log(const CTime value) { if (m_f != nullptr) { fprintf(m_f, "%llu", value.time()); } } +void CLogListenerFileBuffered::log(const uint64_t value) { if (m_f != nullptr) { fprintf(m_f, "%llu", value); } } +void CLogListenerFileBuffered::log(const uint32_t value) { if (m_f != nullptr) { fprintf(m_f, "%u", value); } } +void CLogListenerFileBuffered::log(const int64_t value) { if (m_f != nullptr) { fprintf(m_f, "%lli", value); } } +void CLogListenerFileBuffered::log(const int value) { if (m_f != nullptr) { fprintf(m_f, "%i", value); } } +void CLogListenerFileBuffered::log(const double value) { if (m_f != nullptr) { fprintf(m_f, "%lf", value); } } +void CLogListenerFileBuffered::log(const bool value) { if (m_f != nullptr) { fprintf(m_f, "%s", (value ? "true" : "false")); } } +void CLogListenerFileBuffered::log(const CIdentifier& value) { if (m_f != nullptr) { fprintf(m_f, "%s", value.str().c_str()); } } +void CLogListenerFileBuffered::log(const CString& value) { if (m_f != nullptr) { fprintf(m_f, "%s", value.toASCIIString()); } } +void CLogListenerFileBuffered::log(const std::string& value) { if (m_f != nullptr) { fprintf(m_f, "%s", value.c_str()); } } +void CLogListenerFileBuffered::log(const char* value) { if (m_f != nullptr) { fprintf(m_f, "%s", value); } } + +void CLogListenerFileBuffered::log(const ELogLevel level) +{ + if (m_f != nullptr) + { + switch (level) + { + case LogLevel_Debug: + fprintf(m_f, "[ DEBUG ] "); + break; + + case LogLevel_Benchmark: + fprintf(m_f, "[ BENCH ] "); + break; + + case LogLevel_Trace: + fprintf(m_f, "[ TRACE ] "); + break; + + case LogLevel_Info: + fprintf(m_f, "[ INF ] "); + break; + + case LogLevel_Warning: + fprintf(m_f, "[WARNING] "); + break; + + case LogLevel_ImportantWarning: + fprintf(m_f, "[WARNING] "); + break; + + case LogLevel_Error: + fprintf(m_f, "[ ERROR ] "); + break; + + case LogLevel_Fatal: + fprintf(m_f, "[ FATAL ] "); + break; + + default: + fprintf(m_f, "[UNKNOWN] "); + break; + } + } +} + +} // namespace Kernel +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/log/ovkCLogListenerFileBuffered.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/log/ovkCLogListenerFileBuffered.h new file mode 100755 index 0000000..769bc31 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/log/ovkCLogListenerFileBuffered.h @@ -0,0 +1,56 @@ +#pragma once + +#include +#include + +#include +#include + +#define OVK_ClassId_Kernel_Log_LogListenerFileBuffered OpenViBE::CIdentifier(0x0FD252FB, 0x315C1A97) + +namespace OpenViBE { +namespace Kernel { +class CLogListenerFileBuffered final : public ILogListener +{ +public: + + CLogListenerFileBuffered(const IKernelContext& context, const CString& applicationName, const CString& logFilename); + ~CLogListenerFileBuffered() override; + + bool isActive(const ELogLevel level) override; + bool activate(const ELogLevel level, const bool active) override; + bool activate(const ELogLevel startLevel, const ELogLevel endLevel, const bool active) override; + bool activate(const bool active) override; + + void log(const CTime value) override; + + void log(const uint64_t value) override; + void log(const uint32_t value) override; + + void log(const int64_t value) override; + void log(const int value) override; + + void log(const double value) override; + + void log(const bool value) override; + + void log(const CIdentifier& value) override; + void log(const CString& value) override; + void log(const std::string& value) override; + void log(const char* value) override; + + void log(const ELogLevel level) override; + void log(const ELogColor /*color*/) override {} + + _IsDerivedFromClass_Final_(ILogListener, OVK_ClassId_Kernel_Log_LogListenerFileBuffered) + +protected: + + std::map m_activeLevels; + CString m_applicationName; + CString m_logFilename; + + FILE* m_f = nullptr; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCApplication.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCApplication.cpp new file mode 100755 index 0000000..b75a66b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCApplication.cpp @@ -0,0 +1,378 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsCApplication.h" +#include +#include + +#include "fs/Files.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { + +CApplication::~CApplication() +{ + delete m_StimulusSender; + + if (m_painter != nullptr) + { + (*m_logManager) << Kernel::LogLevel_Debug << "- m_painter\n"; + delete m_painter; + m_painter = nullptr; + } + + for (auto it = m_commands.begin(); + it != m_commands.end(); ++it) + { + (*m_logManager) << Kernel::LogLevel_Debug << "- ICommand\n"; + if (*it != nullptr) + { + delete *it; + *it = nullptr; + } + } + + + (*m_logManager) << Kernel::LogLevel_Debug << "- m_root\n"; + if (m_root != nullptr) + { + delete m_root; + m_root = nullptr; + } +} + +bool CApplication::setup(Kernel::IKernelContext* poKernelContext) +{ + m_kernelCtx = poKernelContext; + m_logManager = &(m_kernelCtx->getLogManager()); + + Kernel::IConfigurationManager* configManager = &(m_kernelCtx->getConfigurationManager()); + + (*m_logManager) << Kernel::LogLevel_Debug << " * CApplication::setup()\n"; + + // Plugin config path setup + Ogre::String pluginsPath; + +#if defined TARGET_OS_Windows +#if defined TARGET_BUILDTYPE_Debug + pluginsPath = std::string(getenv("OGRE_HOME")) + std::string("/bin/debug/plugins_d.cfg"); +#else + pluginsPath = std::string(getenv("OGRE_HOME")) + std::string("/bin/release/plugins.cfg"); +#endif +#elif defined TARGET_OS_Linux + pluginsPath = std::string(configManager->expand("${Path_Data}/openvibe-ogre-plugins.cfg").toASCIIString()); +#else +#error "No OS defined." +#endif + + // Create LogManager to stop Ogre flooding the console and creating random files + + + (*m_logManager) << Kernel::LogLevel_Debug << "+ Creating Ogre logmanager\n"; + Ogre::LogManager* logManager = new Ogre::LogManager(); + (*m_logManager) << Kernel::LogLevel_Info << "Log level: " << configManager->expand("${Kernel_ConsoleLogLevel}") << "\n"; + (*m_logManager) << Kernel::LogLevel_Info << "Application will output Ogre console log : " << configManager->expandAsBoolean( + "${SSVEP_Ogre_LogToConsole}", false) << "\n"; + const CString ogreLog = configManager->expand("${SSVEP_UserDataFolder}/mind-shooter-[$core{date}-$core{time}]-ogre.log"); + (*m_logManager) << Kernel::LogLevel_Info << "Ogre log file : " << ogreLog << "\n"; + FS::Files::createParentPath(ogreLog); + logManager->createLog(ogreLog.toASCIIString(), true, configManager->expandAsBoolean("${SSVEP_Ogre_LogToConsole}", false), false); + + // Root creation + const CString ogreCfg = configManager->expand("${SSVEP_MindShooterScenarioPath}") + "/appconf/mind-shooter-ogre.conf"; + (*m_logManager) << Kernel::LogLevel_Debug << "+ m_root = new Ogre::Root(...)\n"; + (*m_logManager) << Kernel::LogLevel_Info << "Ogre cfg file : " << ogreCfg << "\n"; + m_root = new Ogre::Root(pluginsPath, ogreCfg.toASCIIString(), ogreLog.toASCIIString()); + + // Resource handling + this->setupResources(); + + // Configuration from file or dialog window if needed + if (!this->configure()) + { + (*m_logManager) << Kernel::LogLevel_Fatal << "The configuration process ended unexpectedly.\n"; + return false; + } + + // m_window = m_root->initialise(true); + + + Ogre::NameValuePairList optionList; + m_root->initialise(false); + + + optionList["vsync"] = "1"; + + const int width = int(configManager->expandAsInteger("${SSVEP_Ogre_ScreenWidth}", 800)); + const int height = int(configManager->expandAsInteger("${SSVEP_Ogre_ScreenHeight}", 600)); + const bool fullScreen = configManager->expandAsBoolean("${SSVEP_Ogre_FullScreen}", false); + + (*m_logManager) << Kernel::LogLevel_Info << "Width : " << width << " Height : " << height << " Fullscreen : " << fullScreen << "\n"; + + //m_window = m_root->createRenderWindow("SSVEP Stimulator", 960, 600, false, &l_oOptionList); + m_window = m_root->createRenderWindow("SSVEP Stimulator", width, height, fullScreen, &optionList); + + m_windowWidth = m_window->getWidth(); + m_windowHeight = m_window->getHeight(); + + m_sceneManager = m_root->createSceneManager(Ogre::ST_GENERIC); + m_camera = m_sceneManager->createCamera("SSVEPApplicationCamera"); + m_cameraNode = m_sceneManager->getRootSceneNode()->createChildSceneNode(); + m_cameraNode->attachObject(m_camera); + + Ogre::SceneManager* fillSceneManager = m_root->createSceneManager(Ogre::ST_GENERIC); + Ogre::Camera* fillCamera = fillSceneManager->createCamera("SSVEPFillCamera"); + m_window->addViewport(fillCamera, 0); + + m_viewport = m_window->addViewport(m_camera, 1); + //this->resizeViewport(); + // m_viewport->setBackgroundColour(Ogre::ColourValue(0.0, 0.5, 0.5)); + + m_camera->setAspectRatio(Ogre::Real(m_viewport->getActualWidth()) / Ogre::Real(m_viewport->getActualHeight())); + + m_sceneNode = m_sceneManager->getRootSceneNode()->createChildSceneNode("SSVEPApplicationNode"); + + // initialize the painter object + (*m_logManager) << Kernel::LogLevel_Debug << "+ m_painter = new CBasicPainter(...)\n"; + m_painter = new CBasicPainter(this); + + (*m_logManager) << Kernel::LogLevel_Debug << " * initializing CEGUI\n"; + this->initCEGUI(configManager->expand("${SSVEP_UserDataFolder}/mind-shooter-[$core{date}-$core{time}]-cegui.log")); + + (*m_logManager) << Kernel::LogLevel_Debug << " * CEGUI initialized\n"; + + // create the vector of stimulation frequencies + + m_screenRefreshRate = double(configManager->expandAsUInteger("${SSVEP_ScreenRefreshRate}", 60)); + (*m_logManager) << Kernel::LogLevel_Info << "Specified screen refresh rate :" << m_screenRefreshRate << "Hz\n"; + + if (m_screenRefreshRate > 64) + { + (*m_logManager) << Kernel::LogLevel_Error << "Screen refresh rate exceeds the max bit pattern length of 64\n"; + return false; + } + + size_t i = 1; + + CIdentifier frequencyId = configManager->createConfigurationToken("SSVEP_FrequencyId", "1"); + + m_frequencies.push_back(30); + + size_t patternsLoaded = 0; + + // TODO: Load patterns + + // Load pre-defined stimulation patterns (binary encoded dark/light frames inside a 64bit integer) + while (configManager->lookUpConfigurationTokenIdentifier(configManager->expand("SSVEP_Pattern_${SSVEP_FrequencyId}")) != + CIdentifier::undefined()) + { + size_t stimulationPattern = size_t(configManager->expandAsInteger("${SSVEP_Pattern_${SSVEP_FrequencyId}}")); + + (*m_logManager) << Kernel::LogLevel_Info << "Pattern number " << i << " pattern : " << stimulationPattern << "\n"; + m_frequencies[i] = stimulationPattern; + + configManager->releaseConfigurationToken(frequencyId); + + frequencyId = configManager->createConfigurationToken("SSVEP_FrequencyId", std::to_string(++i).c_str()); + patternsLoaded++; + } + + + // Generate patterns from frequencies + if (patternsLoaded == 0) + { + // Load frequencies + while (configManager->lookUpConfigurationTokenIdentifier(configManager->expand("SSVEP_Frequency_${SSVEP_FrequencyId}")) != CIdentifier::undefined()) + { + const double currentFrequency = double(configManager->expandAsFloat("${SSVEP_Frequency_${SSVEP_FrequencyId}}")); + const double approximatedFrameCount = m_screenRefreshRate / currentFrequency; + const size_t nRoundedFrame = size_t(floor(approximatedFrameCount + 0.5)); + + // test if the desired frequency can be reasonably created on the screen + if (fabs(approximatedFrameCount - nRoundedFrame) < 0.003) + { + const size_t framesL = nRoundedFrame / 2 + nRoundedFrame % 2; + const size_t framesD = nRoundedFrame / 2; + + // the pattern is procedurally generated and always starts by a 1, + // following by as many 0s as there are Dark frames and finally as many 1s as there are Light frames. + // The frame loop will consume one bit per frame from the right and then reset when the reset marker is hit. + + // Start with the reset marker + uint64_t stimulationPattern = 1; + + // The dark zeroes + stimulationPattern <<= framesD; + + // The light ones + for (size_t j = 0; j < framesL; ++j) + { + stimulationPattern <<= 1; + stimulationPattern += 1; + } + + (*m_logManager) << Kernel::LogLevel_Info << "Frequency number " << i << ": " << currentFrequency << "Hz / " << + floor(approximatedFrameCount + 0.5) << " ( " << framesL << " light, " << framesD << " dark) frames @ " << + m_screenRefreshRate << "fps\n"; + (*m_logManager) << Kernel::LogLevel_Info << "Frequency number " << i << " pattern : " << stimulationPattern << "\n"; + + std::stringstream binary; + binary << std::bitset<64>(stimulationPattern); + (*m_logManager) << Kernel::LogLevel_Info << "Frequency number " << i << " binary : " << binary.str() << "\n"; + + m_frequencies.push_back(stimulationPattern); + patternsLoaded++; + } + else { (*m_logManager) << Kernel::LogLevel_Error << "The selected frequency (" << currentFrequency << "Hz) is not supported by your screen.\n"; } + + configManager->releaseConfigurationToken(frequencyId); + + frequencyId = configManager->createConfigurationToken("SSVEP_FrequencyId", std::to_string(++i).c_str()); + } + } + + if (!patternsLoaded) + { + (*m_logManager) << Kernel::LogLevel_Error << "No flashing frequencies loaded. Have you run the SSVEP Impact Shooter configuring scenario?\n"; + (*m_logManager) << Kernel::LogLevel_Error << "Are you running this app from the correct scenario with the previous stages run properly?\n"; + return false; + } + + m_StimulusSender->connect("localhost", "15361"); + + return true; +} + +// Set hard-coded parameters, VSync in particular, for all known render systems +void CApplication::setOgreParameters() const +{ + const bool fullScreen = m_kernelCtx->getConfigurationManager().expandAsBoolean("${SSVEP_Ogre_FullScreen}", false); + const Ogre::RenderSystemList& list = m_root->getAvailableRenderers(); + for (size_t i = 0; i < list.size(); ++i) + { + list[i]->setConfigOption("VSync", "Yes"); + list[i]->setConfigOption("Full Screen", (fullScreen ? "Yes" : "No")); + } +} + +bool CApplication::configure() const +{ + if (! m_root->restoreConfig()) + { + setOgreParameters(); + + if (! m_root->showConfigDialog()) + { + (*m_logManager) << Kernel::LogLevel_Error << "No configuration created from the dialog window.\n"; + return false; + } + } + + // Override 'unsuitable' user choices + (*m_logManager) << Kernel::LogLevel_Info << "Forcing vsync and using fullscreen settings from configuration scenario.\n"; + setOgreParameters(); + + // Save the config again after we have forced the params, otherwise the conf file looks misleading + m_root->saveConfig(); + + return true; +} + +void CApplication::initCEGUI(const char* logFilename) +{ + // Instantiate logger before bootstrapping the system, this way we will be able to get the log redirected + if (!CEGUI::Logger::getSingletonPtr()) { new CEGUI::DefaultLogger(); } // singleton; instantiate only, no delete + (*m_logManager) << Kernel::LogLevel_Info << "+ CEGUI log will be in '" << logFilename << "'\n"; + FS::Files::createParentPath(logFilename); + CEGUI::Logger::getSingleton().setLogFilename(logFilename, false); + + (*m_logManager) << Kernel::LogLevel_Debug << "+ Creating CEGUI Ogre bootstrap\n"; + m_guiRenderer = &(CEGUI::OgreRenderer::bootstrapSystem(*m_window)); + (*m_logManager) << Kernel::LogLevel_Debug << "+ Creating CEGUI Scheme Manager\n"; + +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) + CEGUI::SchemeManager::getSingleton().createFromFile(const_cast(reinterpret_cast("TaharezLook-ov-0.8.scheme"))); +#else + CEGUI::SchemeManager::getSingleton().create((CEGUI::utf8*)"TaharezLook-ov.scheme"); +#endif + + (*m_logManager) << Kernel::LogLevel_Debug << "+ Creating CEGUI WindowManager\n"; + m_guiWindowManager = CEGUI::WindowManager::getSingletonPtr(); + m_sheet = m_guiWindowManager->createWindow("DefaultWindow", "RootSheet"); + + (*m_logManager) << Kernel::LogLevel_Debug << "+ Setting CEGUI StyleSheet\n"; +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) + CEGUI::System::getSingleton().getDefaultGUIContext().setRootWindow(m_sheet); +#else + CEGUI::System::getSingleton().setGUISheet(m_sheet); +#endif +} + +void CApplication::resizeViewport() const +{ + (*m_logManager) << Kernel::LogLevel_Trace << "Creating a new viewport\n"; + + const Ogre::uint32 viewportSize = std::min(m_windowWidth, m_windowHeight); + (*m_logManager) << Kernel::LogLevel_Info << "New viewport size : " << viewportSize << "\n"; + + m_viewport->setDimensions(Ogre::Real(m_windowWidth - viewportSize) / Ogre::Real(m_windowWidth) / 2, + Ogre::Real(m_windowHeight - viewportSize) / Ogre::Real(m_windowHeight) / 2, + Ogre::Real(viewportSize) / Ogre::Real(m_windowWidth), + Ogre::Real(viewportSize) / Ogre::Real(m_windowHeight)); +} + +void CApplication::setupResources() const +{ + Kernel::IConfigurationManager* configManager = &(m_kernelCtx->getConfigurationManager()); + + Ogre::ResourceGroupManager::getSingleton().addResourceLocation( + configManager->expand("${Path_Data}/applications/${SSVEP_MindShooterFolderName}/resources").toASCIIString(), "FileSystem", "SSVEP"); + Ogre::ResourceGroupManager::getSingleton().addResourceLocation( + configManager->expand("${Path_Data}/applications/${SSVEP_MindShooterFolderName}/resources/generic").toASCIIString(), "FileSystem", "SSVEPGeneric"); + Ogre::ResourceGroupManager::getSingleton().addResourceLocation( + configManager->expand("${Path_Data}/applications/${SSVEP_MindShooterFolderName}/resources/generic/textures").toASCIIString(), "FileSystem", + "SSVEPGeneric"); + Ogre::ResourceGroupManager::getSingleton().addResourceLocation( + configManager->expand("${Path_Data}/applications/${SSVEP_MindShooterFolderName}/resources/trainer").toASCIIString(), "FileSystem", "SSVEPTrainer"); + Ogre::ResourceGroupManager::getSingleton().addResourceLocation( + configManager->expand("${Path_Data}/applications/${SSVEP_MindShooterFolderName}/resources/gui").toASCIIString(), "FileSystem", "CEGUI"); + Ogre::ResourceGroupManager::getSingleton().addResourceLocation(CString(m_ScenarioDir + "/appconf/materials").toASCIIString(), "FileSystem", "CEGUI"); + + Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("SSVEP"); + Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("SSVEPTrainer"); + Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("SSVEPGeneric"); + Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("CEGUI"); +} + +bool CApplication::frameStarted(const Ogre::FrameEvent& /*evt*/) +{ + m_currentFrame++; + m_currentFrame %= int(m_screenRefreshRate); + + + for (size_t i = 0; i < m_commands.size(); ++i) { m_commands[i]->processFrame(); } + + this->processFrame(m_currentFrame); + + return true; +} + +void CApplication::go() +{ + (*m_logManager) << Kernel::LogLevel_Debug << "Associating application as Ogre frame listener\n"; + + m_root->addFrameListener(this); + + (*m_logManager) << Kernel::LogLevel_Debug << "Entering Ogre rendering loop\n"; + m_root->startRendering(); + (*m_logManager) << Kernel::LogLevel_Debug << "Ogre rendering loop finished ... exiting\n"; +} + +void CApplication::stopExperiment() +{ + (*m_logManager) << Kernel::LogLevel_Info << "[!] Experiment halting\n"; + this->exit(); +} + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCApplication.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCApplication.h new file mode 100755 index 0000000..973a648 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCApplication.h @@ -0,0 +1,114 @@ +#pragma once + +#include "ovams_defines.h" + +#include +#include + +#include +#include +#include +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) +#include +#else +#include +#endif + +#include "ovamsICommand.h" +#include "ovamsCBasicPainter.h" + +#include + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CApplication : public Ogre::FrameListener, public Ogre::WindowEventListener +{ +public: + explicit CApplication(const CString& scenarioDir) : m_ScenarioDir(scenarioDir) { m_StimulusSender = TCPTagging::CreateStimulusSender(); } + ~CApplication() override; + + void addCommand(ICommand* cmd) { m_commands.push_back(cmd); } + virtual bool setup(Kernel::IKernelContext* poKernelContext); + void go(); + + virtual void startExperiment() { (*m_logManager) << Kernel::LogLevel_Info << "[!] Experiment starting\n"; } + virtual void stopExperiment(); + virtual void startFlickering() { } + virtual void stopFlickering() { } + + virtual void debugAction1() { } + virtual void debugAction2() { } + virtual void debugAction3() { } + virtual void debugAction4() { } + + virtual void setTarget(int /*i*/) { } + + Ogre::RenderWindow* getWindow() const { return m_window; } + Ogre::SceneManager* getSceneManager() const { return m_sceneManager; } + Ogre::SceneNode* getSceneNode() const { return m_sceneNode; } + Ogre::Camera* getCamera() const { return m_camera; } + Ogre::SceneNode* getCameraNode() const { return m_cameraNode; } + CBasicPainter* getPainter() const { return m_painter; } + Kernel::ILogManager& getLogManager() const { return (*m_logManager); } + Kernel::IConfigurationManager* getConfigurationManager() const { return &(m_kernelCtx->getConfigurationManager()); } + std::vector* getFrequencies() { return &m_frequencies; } + + void exit() { m_continueRendering = false; } + + void resizeViewport() const; + + Kernel::ILogManager& logPrefix() const + { + (*m_logManager) << Kernel::LogLevel_Trace << "% [" << m_currentTime << "] "; + return (*m_logManager); + } + + CString m_ScenarioDir; + + TCPTagging::IStimulusSender* m_StimulusSender = nullptr; + +protected: + Kernel::IKernelContext* m_kernelCtx = nullptr; + Kernel::ILogManager* m_logManager = nullptr; + + double m_screenRefreshRate = 0; + CBasicPainter* m_painter = nullptr; + + bool m_continueRendering = true; + size_t m_currentFrame = 0; + uint64_t m_currentTime = 0; + + Ogre::Root* m_root = nullptr; + Ogre::SceneManager* m_sceneManager = nullptr; + Ogre::Camera* m_camera = nullptr; + Ogre::SceneNode* m_cameraNode = nullptr; + Ogre::RenderWindow* m_window = nullptr; + Ogre::Viewport* m_viewport = nullptr; + Ogre::SceneNode* m_sceneNode = nullptr; + + CEGUI::OgreRenderer* m_guiRenderer = nullptr; + CEGUI::WindowManager* m_guiWindowManager = nullptr; + CEGUI::Window* m_sheet = nullptr; + + std::vector m_frequencies; + + std::vector m_commands; + + virtual void processFrame(const size_t /*currentFrame*/) { m_currentTime++; } + + bool frameRenderingQueued(const Ogre::FrameEvent& evt) override { return (m_continueRendering && !m_window->isClosed()); } + bool frameStarted(const Ogre::FrameEvent& evt) override; + + bool configure() const; + void setupResources() const; + +private: + void setOgreParameters() const; // Set some render parameters + + void initCEGUI(const char* logFilename); + + Ogre::uint32 m_windowWidth = 0; + Ogre::uint32 m_windowHeight = 0; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCBasicPainter.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCBasicPainter.cpp new file mode 100755 index 0000000..7e7f7f3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCBasicPainter.cpp @@ -0,0 +1,248 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsCBasicPainter.h" +#include "ovamsCApplication.h" + +#if (OGRE_VERSION_MAJOR > 1) || ((OGRE_VERSION_MAJOR == 1) && (OGRE_VERSION_MINOR >= 9)) +#include "Overlay/OgreOverlaySystem.h" +#include "Overlay/OgreOverlayContainer.h" +#include "Overlay/OgreOverlayElement.h" +#endif + +namespace OpenViBE { +namespace SSVEPMindShooter { +CBasicPainter::CBasicPainter(CApplication* application) + : m_application(application), m_sceneManager(application->getSceneManager()) +{ + m_aabInf.setInfinite(); + +#if (OGRE_VERSION_MAJOR > 1) || ((OGRE_VERSION_MAJOR == 1) && (OGRE_VERSION_MINOR >= 9)) + // on Ogre 1.9, overlay system needs to be manually created + Ogre::OverlaySystem* pOverlaySystem = OGRE_NEW Ogre::OverlaySystem(); + m_sceneManager->addRenderQueueListener(pOverlaySystem); +#endif + + m_overlayManager = Ogre::OverlayManager::getSingletonPtr(); + + (m_application->getLogManager()) << Kernel::LogLevel_Debug << " + Creating OverlayManager\n"; + Ogre::Overlay* overlay = m_overlayManager->create("TextOverlay"); + + + m_overlayContainer = dynamic_cast(m_overlayManager->createOverlayElement("Panel", "TextContainer")); + m_overlayContainer->setDimensions(1, 1); + m_overlayContainer->setPosition(0, 0); + + overlay->add2D(m_overlayContainer); + overlay->show(); +} + + +Ogre::ManualObject* CBasicPainter::paintRectangle(const Ogre::RealRect& oRectangle, const Ogre::ColourValue color, const int plane) const +{ + Ogre::ManualObject* object = m_sceneManager->createManualObject(); + object->begin("BasicSurface/Diffuse", Ogre::RenderOperation::OT_TRIANGLE_FAN); + object->setUseIdentityProjection(true); + object->setUseIdentityView(true); + + object->position(oRectangle.right, oRectangle.top, 0.0); + object->colour(color); + object->index(0); + + object->position(oRectangle.left, oRectangle.top, 0.0); + object->colour(color); + object->index(1); + + object->position(oRectangle.left, oRectangle.bottom, 0.0); + object->colour(color); + object->index(2); + + object->position(oRectangle.right, oRectangle.bottom, 0.0); + object->colour(color); + object->index(3); + + object->index(0); + + object->end(); + + object->setBoundingBox(m_aabInf); + object->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY - plane); + + object->setVisible(true); + + return object; +} + +Ogre::ManualObject* CBasicPainter::paintTexturedRectangle(const Ogre::RealRect& oRectangle, const Ogre::String& sSurface, const int plane) const +{ + Ogre::ManualObject* object = m_sceneManager->createManualObject(); + object->begin(sSurface, Ogre::RenderOperation::OT_TRIANGLE_FAN); + object->setUseIdentityProjection(true); + object->setUseIdentityView(true); + + object->position(oRectangle.right, oRectangle.top, 0.0); + object->textureCoord(0, 0); + object->index(0); + + object->position(oRectangle.left, oRectangle.top, 0.0); + object->textureCoord(1, 0); + object->index(1); + + object->position(oRectangle.left, oRectangle.bottom, 0.0); + object->textureCoord(1, 1); + object->index(2); + + object->position(oRectangle.right, oRectangle.bottom, 0.0); + object->textureCoord(0, 1); + object->index(3); + + object->index(0); + + object->end(); + + object->setBoundingBox(m_aabInf); + object->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY - plane); + + object->setVisible(true); + + return object; +} + + +Ogre::ManualObject* CBasicPainter::paintTriangle(const Ogre::Vector2 p1, const Ogre::Vector2 p2, const Ogre::Vector2 p3, + const Ogre::ColourValue color, const int plane) const +{ + Ogre::ManualObject* object = m_sceneManager->createManualObject(); + object->begin("BasicSurface/Diffuse", Ogre::RenderOperation::OT_TRIANGLE_FAN); + object->setUseIdentityProjection(true); + object->setUseIdentityView(true); + + object->position(p1.x, p1.y, 0.0); + object->colour(color); + object->index(0); + + object->position(p2.x, p2.y, 0.0); + object->colour(color); + object->index(1); + + object->position(p3.x, p3.y, 0.0); + object->colour(color); + object->index(2); + + object->index(0); + + object->end(); + + object->setBoundingBox(m_aabInf); + object->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY - plane); + + object->setVisible(true); + + return object; +} + +Ogre::ManualObject* CBasicPainter::paintTriangle(const Ogre::Vector3 p1, const Ogre::Vector3 p2, const Ogre::Vector3 p3, + const Ogre::ColourValue color, const int plane) const +{ + Ogre::ManualObject* object = m_sceneManager->createManualObject(); + object->begin("BasicSurface/Diffuse", Ogre::RenderOperation::OT_TRIANGLE_FAN); + object->setUseIdentityProjection(true); + object->setUseIdentityView(true); + + object->position(p1.x, p1.y, p1.z); + object->colour(color); + object->index(0); + + object->position(p2.x, p2.y, p2.z); + object->colour(color); + object->index(1); + + object->position(p3.x, p3.y, p3.z); + object->colour(color); + object->index(2); + + object->index(0); + + object->end(); + + object->setBoundingBox(m_aabInf); + object->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY - plane); + + object->setVisible(true); + + return object; +} + +Ogre::ManualObject* CBasicPainter::paintCircle(const Ogre::Real rX, const Ogre::Real rY, const Ogre::Real rR, const Ogre::ColourValue color, + const bool bFilled, const int plane) const +{ + Ogre::ManualObject* object = m_sceneManager->createManualObject(); + + if (bFilled) { object->begin("BasicSurface/Diffuse", Ogre::RenderOperation::OT_TRIANGLE_FAN); } + else { object->begin("BasicSurface/Diffuse", Ogre::RenderOperation::OT_LINE_STRIP); } + + object->setUseIdentityProjection(true); + object->setUseIdentityView(true); + + float const fAccuracy = 16; + unsigned uiIndex = 0; + + for (float theta = 0; theta <= 2 * Ogre::Math::PI; theta += Ogre::Math::PI / fAccuracy) + { + object->position(rX + rR * cos(theta), rY + rR * sin(theta), 0); + object->colour(color); + object->index(uiIndex++); + } + + object->index(0); + object->end(); + object->setBoundingBox(m_aabInf); + object->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY - plane); + object->setVisible(true); + + return object; +} + +Ogre::ManualObject* CBasicPainter::beginPainingPolygon(bool /*filled*/, const Ogre::String& material) const +{ + Ogre::ManualObject* object = m_sceneManager->createManualObject(); + object->begin(material, Ogre::RenderOperation::OT_TRIANGLE_FAN); + object->setUseIdentityProjection(true); + object->setUseIdentityView(true); + + return object; +} + +void CBasicPainter::addPointToPolygon(Ogre::ManualObject* pPolygon, const Ogre::Real rX, const Ogre::Real rY, const Ogre::ColourValue color) +{ + pPolygon->position(rX, rY, 0.0); + pPolygon->colour(color); +} + +void CBasicPainter::finishPaintingPolygon(Ogre::ManualObject* pPolygon, const int plane) const +{ + pPolygon->end(); + pPolygon->setBoundingBox(m_aabInf); + pPolygon->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY - plane); + pPolygon->setVisible(true); +} + + +void CBasicPainter::paintText(const std::string& sID, const std::string& sText, const Ogre::Real rX, const Ogre::Real rY, + const Ogre::Real rWidth, const Ogre::Real rHeight, const Ogre::ColourValue& color) const +{ + Ogre::OverlayElement* text = m_overlayManager->createOverlayElement("TextArea", sID); + + text->setDimensions(rWidth, rHeight); + text->setMetricsMode(Ogre::GMM_PIXELS); + text->setPosition(rX, rY); + text->setParameter("font_name", "DejaVu"); + text->setColour(color); + text->setCaption(sText); + + m_overlayContainer->addChild(text); +} + +} // namespace SSVEPMindShooter +} // namespace OpenViBE + +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCBasicPainter.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCBasicPainter.h new file mode 100755 index 0000000..39877f6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCBasicPainter.h @@ -0,0 +1,50 @@ +#pragma once + +/// this class is a wrapper around some ogre methods to display basic shapes + +#include + +#if (OGRE_VERSION_MAJOR > 1) || ((OGRE_VERSION_MAJOR == 1) && (OGRE_VERSION_MINOR >= 9)) +#include "Overlay/OgreOverlayManager.h" +#endif + +#define SSVEP_DEFAULT_COLOUR Ogre::ColourValue(1.0f, 1.0f, 1.0f) + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CApplication; + +class CBasicPainter +{ +public: + explicit CBasicPainter(CApplication* application); + ~CBasicPainter() {} + + Ogre::SceneManager* getSceneManager() const { return m_sceneManager; } + + Ogre::ManualObject* paintRectangle(const Ogre::RealRect& oRectangle, const Ogre::ColourValue color = SSVEP_DEFAULT_COLOUR, const int plane = 1) const; + Ogre::ManualObject* paintTexturedRectangle(const Ogre::RealRect& oRectangle, const Ogre::String& sSurface, const int plane = 1) const; + Ogre::ManualObject* paintTriangle(Ogre::Vector2 p1, Ogre::Vector2 p2, Ogre::Vector2 p3, Ogre::ColourValue color = SSVEP_DEFAULT_COLOUR, + int plane = 1) const; + Ogre::ManualObject* paintTriangle(Ogre::Vector3 p1, Ogre::Vector3 p2, Ogre::Vector3 p3, Ogre::ColourValue color = SSVEP_DEFAULT_COLOUR, + int plane = 1) const; + //Ogre::ManualObject* paintTexturedTriangle(Ogre::Vector2 p1, Ogre::Vector2 p2, Ogre::Vector2 p3, Ogre::String sSurface, int plane = 1); + Ogre::ManualObject* paintCircle(Ogre::Real rX, Ogre::Real rY, Ogre::Real rR, Ogre::ColourValue color = SSVEP_DEFAULT_COLOUR, bool bFilled = true, + int plane = 1) const; + + Ogre::ManualObject* beginPainingPolygon(bool filled = true, const Ogre::String& material = "BasicSurface/Diffuse") const; + static void addPointToPolygon(Ogre::ManualObject* pPolygon, Ogre::Real rX, Ogre::Real rY, Ogre::ColourValue color = SSVEP_DEFAULT_COLOUR); + void finishPaintingPolygon(Ogre::ManualObject* pPolygon, int plane = 1) const; + + void paintText(const std::string& sID, const std::string& sText, Ogre::Real rX, Ogre::Real rY, Ogre::Real rWidth, Ogre::Real rHeight, + const Ogre::ColourValue& color) const; + +protected: + CApplication* m_application = nullptr; + Ogre::OverlayManager* m_overlayManager = nullptr; + Ogre::OverlayContainer* m_overlayContainer = nullptr; + Ogre::SceneManager* m_sceneManager = nullptr; + Ogre::AxisAlignedBox m_aabInf; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandCamera.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandCamera.cpp new file mode 100755 index 0000000..0322345 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandCamera.cpp @@ -0,0 +1,96 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsCCommandCamera.h" +#include "ovamsCApplication.h" +#include "ovamsCVRPNServer.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { + +void CCommandCamera::updateCamera() +{ + Ogre::Vector3 translation(0, 0, 0); + const Ogre::Real translationSpeed = 10.0; + + if (m_keysPressed[OIS::KC_W]) { translation.z -= translationSpeed; } + if (m_keysPressed[OIS::KC_D]) { translation.x += translationSpeed; } + if (m_keysPressed[OIS::KC_A]) { translation.x -= translationSpeed; } + if (m_keysPressed[OIS::KC_S]) { translation.z += translationSpeed; } + + + const Ogre::Vector3 translateVectorFinal = m_application->getCamera()->getDerivedOrientation() * translation; + m_application->getCameraNode()->translate(translateVectorFinal, Ogre::Node::TS_WORLD); +} + +void CCommandCamera::processFrame() +{ + ICommandOIS::processFrame(); + + this->updateCamera(); + + if (m_keysPressed[OIS::KC_NUMPAD1]) + { + m_application->debugAction1(); + m_keysPressed[OIS::KC_NUMPAD1] = false; + } + if (m_keysPressed[OIS::KC_NUMPAD2]) + { + m_application->debugAction2(); + m_keysPressed[OIS::KC_NUMPAD2] = false; + } + if (m_keysPressed[OIS::KC_NUMPAD3]) + { + m_application->debugAction3(); + m_keysPressed[OIS::KC_NUMPAD3] = false; + } + if (m_keysPressed[OIS::KC_NUMPAD4]) + { + m_application->debugAction4(); + m_keysPressed[OIS::KC_NUMPAD4] = false; + } +} + +void CCommandCamera::receiveKeyPressedEvent(const OIS::KeyCode key) +{ + if (key == OIS::KC_LCONTROL) { m_bCameraMode = true; } + + if (key == OIS::KC_W) { m_keysPressed[OIS::KC_W] = true; } + if (key == OIS::KC_A) { m_keysPressed[OIS::KC_A] = true; } + if (key == OIS::KC_S) { m_keysPressed[OIS::KC_S] = true; } + if (key == OIS::KC_D) { m_keysPressed[OIS::KC_D] = true; } + if (key == OIS::KC_NUMPAD1) { m_keysPressed[OIS::KC_NUMPAD1] = true; } + if (key == OIS::KC_NUMPAD2) { m_keysPressed[OIS::KC_NUMPAD2] = true; } + if (key == OIS::KC_NUMPAD3) { m_keysPressed[OIS::KC_NUMPAD3] = true; } + if (key == OIS::KC_NUMPAD4) { m_keysPressed[OIS::KC_NUMPAD4] = true; } + if (key == OIS::KC_ESCAPE) { m_application->exit(); } +} + +void CCommandCamera::receiveKeyReleasedEvent(const OIS::KeyCode key) +{ + if (key == OIS::KC_LCONTROL) { m_bCameraMode = false; } + + if (key == OIS::KC_W) { m_keysPressed[OIS::KC_W] = false; } + if (key == OIS::KC_A) { m_keysPressed[OIS::KC_A] = false; } + if (key == OIS::KC_S) { m_keysPressed[OIS::KC_S] = false; } + if (key == OIS::KC_D) { m_keysPressed[OIS::KC_D] = false; } + if (key == OIS::KC_NUMPAD1) { m_keysPressed[OIS::KC_NUMPAD1] = false; } + if (key == OIS::KC_NUMPAD2) { m_keysPressed[OIS::KC_NUMPAD2] = false; } + if (key == OIS::KC_NUMPAD3) { m_keysPressed[OIS::KC_NUMPAD3] = false; } + if (key == OIS::KC_NUMPAD4) { m_keysPressed[OIS::KC_NUMPAD4] = false; } +} + +void CCommandCamera::receiveMouseEvent(const OIS::MouseEvent& event) +{ + const Ogre::Real rotationSpeedMouse = 1.0F; + + std::cout << m_application->getCamera()->getOrientation() << "\n"; + if (m_bCameraMode) + { + m_application->getCamera()->yaw(Ogre::Degree(-float(event.state.X.rel) * rotationSpeedMouse)); + m_application->getCamera()->pitch(Ogre::Degree(-float(event.state.Y.rel) * rotationSpeedMouse)); + } +} + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandCamera.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandCamera.h new file mode 100755 index 0000000..c520c92 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandCamera.h @@ -0,0 +1,29 @@ +#pragma once + +#include + +#include "ovamsICommandOIS.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CVRPNServer; + +class CCommandCamera final : public ICommandOIS +{ +public: + explicit CCommandCamera(CApplication* application): ICommandOIS(application) { } + ~CCommandCamera() override { } + void processFrame() override; + + void receiveKeyPressedEvent(OIS::KeyCode key) override; + void receiveKeyReleasedEvent(OIS::KeyCode key) override; + void receiveMouseEvent(const OIS::MouseEvent& event) override; + +private: + void updateCamera(); + std::map m_keysPressed; + + bool m_bCameraMode = false; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandReceiveTarget.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandReceiveTarget.h new file mode 100755 index 0000000..82e130c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandReceiveTarget.h @@ -0,0 +1,19 @@ +#pragma once + +#include "ovamsICommandVRPNButton.h" +#include "ovamsCApplication.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CApplication; + +class CCommandReceiveTarget final : public ICommandVRPNButton +{ +public: + explicit CCommandReceiveTarget(CApplication* application) : ICommandVRPNButton(application, "SSVEP_VRPN_TargetControl") {} + ~CCommandReceiveTarget() override {} + + void execute(const int button, const int state) override { dynamic_cast(m_application)->setTarget(button); } +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandStartStop.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandStartStop.cpp new file mode 100755 index 0000000..6528a92 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandStartStop.cpp @@ -0,0 +1,49 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsCCommandStartStop.h" +#include "ovamsCApplication.h" +#include "ovamsCVRPNServer.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { + +CCommandStartStop::CCommandStartStop(CApplication* application) + : ICommandOIS(application) +{ + m_vrpnServer = CVRPNServer::getInstance(application); + m_vrpnServer->addButton("SSVEP_VRPN_StartStop", 2); +} + +CCommandStartStop::~CCommandStartStop() +{ + m_application->getLogManager() << Kernel::LogLevel_Info << "End message sent\n"; + m_vrpnServer->changeButtonState("SSVEP_VRPN_StartStop", 1, 1); + m_vrpnServer->processFrame(); +} + +void CCommandStartStop::processFrame() +{ + ICommandOIS::processFrame(); + m_vrpnServer->processFrame(); +} + +void CCommandStartStop::receiveKeyPressedEvent(const OIS::KeyCode key) +{ + if (key == OIS::KC_SPACE) + { + m_application->getLogManager() << Kernel::LogLevel_Info << "Start message sent\n"; + m_vrpnServer->changeButtonState("SSVEP_VRPN_StartStop", 0, 1); + } + + if (key == OIS::KC_ESCAPE) { m_application->exit(); } + if (key == OIS::KC_INSERT) { m_application->getWindow()->writeContentsToFile("screenshot.png"); } +} + +void CCommandStartStop::receiveKeyReleasedEvent(const OIS::KeyCode key) +{ + if (key == OIS::KC_SPACE) { m_vrpnServer->changeButtonState("SSVEP_VRPN_StartStop", 0, 0); } +} + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandStartStop.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandStartStop.h new file mode 100755 index 0000000..fcc83e0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandStartStop.h @@ -0,0 +1,24 @@ +#pragma once + +#include "ovamsICommandOIS.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CVRPNServer; + +class CCommandStartStop final : public ICommandOIS +{ +public: + explicit CCommandStartStop(CApplication* application); + ~CCommandStartStop() override; + + void processFrame() override; + + void receiveKeyPressedEvent(OIS::KeyCode key) override; + void receiveKeyReleasedEvent(OIS::KeyCode key) override; + +private: + CVRPNServer* m_vrpnServer = nullptr; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandStimulatorControl.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandStimulatorControl.cpp new file mode 100755 index 0000000..392294a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandStimulatorControl.cpp @@ -0,0 +1,45 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsCCommandStimulatorControl.h" +#include "ovamsCApplication.h" + +#include + +namespace OpenViBE { +namespace SSVEPMindShooter { + +void CCommandStimulatorControl::execute(const int button, const int /*state*/) +{ + // only run the commands once, skip + + switch (button) + { + case 0: + m_application->startExperiment(); + m_application->m_StimulusSender->sendStimulation(OVTK_StimulationId_ExperimentStart); + break; + + case 1: + m_application->stopExperiment(); + m_application->m_StimulusSender->sendStimulation(OVTK_StimulationId_ExperimentStop); + break; + + case 2: + m_application->startFlickering(); + m_application->m_StimulusSender->sendStimulation(OVTK_StimulationId_VisualStimulationStart); + break; + + case 3: + m_application->stopFlickering(); + m_application->m_StimulusSender->sendStimulation(OVTK_StimulationId_VisualStimulationStop); + break; + + default: + m_application->getLogManager() << Kernel::LogLevel_Error << "[ERROR] Unknown command\n"; + break; + } +} + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandStimulatorControl.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandStimulatorControl.h new file mode 100755 index 0000000..8b403b2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCCommandStimulatorControl.h @@ -0,0 +1,16 @@ +#pragma once + +#include "ovamsICommandVRPNButton.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CCommandStimulatorControl final : public ICommandVRPNButton +{ +public: + explicit CCommandStimulatorControl(CApplication* application) : ICommandVRPNButton(application, "SSVEP_VRPN_StimulatorControl") {} + ~CCommandStimulatorControl() override { } + + void execute(const int button, const int state) override; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCSSVEPFlickeringObject.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCSSVEPFlickeringObject.cpp new file mode 100755 index 0000000..4d6c9cf --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCSSVEPFlickeringObject.cpp @@ -0,0 +1,35 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsCSSVEPFlickeringObject.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { + +CSSVEPFlickeringObject::CSSVEPFlickeringObject(Ogre::SceneNode* objectNode, const uint64_t stimulationPattern) + : m_objectNode(objectNode), m_stimulationPattern(stimulationPattern) +{ + static int nextid = 0; + m_iId = ++nextid; +} + +void CSSVEPFlickeringObject::setVisible(const bool visibility) +{ + if ((!m_visible && visibility) || (m_visible && !visibility)) { m_objectNode->flipVisibility(); } + m_visible = visibility; +} + +void CSSVEPFlickeringObject::processFrame() +{ + // If the bit for the frame is '1', set to visible + if (((m_stimulationPattern >> m_currentFrame) % 2) == 1) { this->setVisible(true); } + else { this->setVisible(false); } + + m_currentFrame++; + + // Start over when only '1' is left + if (m_stimulationPattern >> m_currentFrame == 1) { m_currentFrame = 0; } +} + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCSSVEPFlickeringObject.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCSSVEPFlickeringObject.h new file mode 100755 index 0000000..a6bfc7e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCSSVEPFlickeringObject.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CSSVEPFlickeringObject +{ +public: + //SP CSSVEPFlickeringObject( Ogre::SceneNode* objectNode, size_t LitFrames, size_t DarkFrames ); + CSSVEPFlickeringObject(Ogre::SceneNode* objectNode, uint64_t stimulationPattern); + virtual ~CSSVEPFlickeringObject() { } + + virtual void setVisible(bool visibility); + virtual void processFrame(); + +protected: + Ogre::SceneNode* m_objectNode = nullptr; + size_t m_currentFrame = 0; + //SP size_t m_litFrames = 0; + //SP size_t m_darkFrames = 0; + uint64_t m_stimulationPattern = 0; + +private: + + bool m_visible = true; + int m_iId = 0; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCStimulator.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCStimulator.cpp new file mode 100755 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCStimulator.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCStimulator.h new file mode 100755 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCVRPNServer.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCVRPNServer.cpp new file mode 100755 index 0000000..4a7e16b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCVRPNServer.cpp @@ -0,0 +1,52 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsCVRPNServer.h" +#include "ovamsCApplication.h" + +#include +#include + +namespace OpenViBE { +namespace SSVEPMindShooter { + +CVRPNServer* CVRPNServer::m_vrpnServerInstance = nullptr; +CApplication* CVRPNServer::m_application = nullptr; + +CVRPNServer::CVRPNServer(CApplication* application) +{ + m_application = application; + + const int port = int(m_application->getConfigurationManager()->expandAsInteger("${VRPN_ExternalServerPort}")); + + m_application->getLogManager() << Kernel::LogLevel_Debug << "VRPN SERVER PORT :" << port << "\n"; + m_connection = vrpn_create_server_connection(port); +} + +CVRPNServer* CVRPNServer::getInstance(CApplication* application) +{ + if (m_vrpnServerInstance == nullptr) { m_vrpnServerInstance = new CVRPNServer(application); } + return m_vrpnServerInstance; +} + +void CVRPNServer::addButton(const std::string& name, const int buttonCount) +{ + m_oButtonServer.insert(std::pair(name, new vrpn_Button_Server(name.c_str(), m_connection, buttonCount))); + m_oButtonCache[name].clear(); + m_oButtonCache[name].resize(buttonCount); +} + +void CVRPNServer::processFrame() +{ + for (auto it = m_oButtonServer.begin(); it != m_oButtonServer.end(); ++it) { it->second->mainloop(); } + m_connection->mainloop(); +} + +void CVRPNServer::changeButtonState(const std::string& name, const int iIndex, const int state) +{ + m_oButtonServer[name]->set_button(iIndex, state); + m_oButtonCache[name][iIndex] = state; +} + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCVRPNServer.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCVRPNServer.h new file mode 100755 index 0000000..e009811 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsCVRPNServer.h @@ -0,0 +1,39 @@ +#pragma once + +#include +#include + +#include +#include +#include + +class vrpn_Connection; +class vrpn_Button_Server; + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CApplication; + +class CVRPNServer +{ +public: + static CVRPNServer* getInstance(CApplication* application); + ~CVRPNServer() = default; + void processFrame(); + + void addButton(const std::string& name, const int buttonCount); + void changeButtonState(const std::string& name, const int iIndex, const int state); + int getButtonState(const std::string& name, const int iIndex) { return m_oButtonCache[name][iIndex]; } + +private: + static CVRPNServer* m_vrpnServerInstance; + static CApplication* m_application; + + explicit CVRPNServer(CApplication* application); + + vrpn_Connection* m_connection = nullptr; + std::map m_oButtonServer; + std::map> m_oButtonCache; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommand.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommand.h new file mode 100755 index 0000000..ad01fa7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommand.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +namespace OpenViBE { +namespace SSVEPMindShooter { +class CApplication; + +class ICommand +{ +public: + explicit ICommand(CApplication* application) : m_application(application) {} + virtual ~ICommand() {} + virtual void processFrame() = 0; + +protected: + CApplication* m_application = nullptr; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandOIS.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandOIS.cpp new file mode 100755 index 0000000..13b90a1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandOIS.cpp @@ -0,0 +1,107 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsICommandOIS.h" +#include "ovamsCApplication.h" + +#define SSVEP_NO_MOUSE_CAPTURE + +namespace OpenViBE { +namespace SSVEPMindShooter { + +OIS::InputManager* ICommandOIS::m_inputManager = nullptr; +OIS::Keyboard* ICommandOIS::m_keyboard = nullptr; +OIS::Mouse* ICommandOIS::m_mouse = nullptr; + +int ICommandOIS::m_nInstance = 0; +std::vector ICommandOIS::m_instances; + + +ICommandOIS::ICommandOIS(CApplication* application) + : ICommand(application) +{ + if (m_keyboard == nullptr) + { + OIS::ParamList paramList; + std::ostringstream windowHandleString; + size_t windowHandle; + + + m_application->getWindow()->getCustomAttribute("WINDOW", &windowHandle); + + windowHandleString << windowHandle; + + paramList.insert(std::make_pair(std::string("WINDOW"), windowHandleString.str())); + paramList.insert(std::make_pair(std::string("x11_keyboard_grab"), "false")); + + m_inputManager = OIS::InputManager::createInputSystem(paramList); + + m_keyboard = dynamic_cast(m_inputManager->createInputObject(OIS::OISKeyboard, true)); + m_keyboard->setEventCallback(this); + +#ifndef SSVEP_NO_MOUSE_CAPTURE + m_mouse = static_cast(m_inputManager->createInputObject(OIS::OISMouse, true)); + m_mouse->setEventCallback( this ); +#endif + } + + m_nInstance++; + m_instances.push_back(this); +} + +ICommandOIS::~ICommandOIS() +{ + --m_nInstance; + + if (m_nInstance == 0) + { + if (m_inputManager != nullptr) + { + if (m_keyboard != nullptr) + { + m_application->getLogManager() << Kernel::LogLevel_Debug << "- destroy m_keyboard\n"; + m_inputManager->destroyInputObject(m_keyboard); + m_keyboard = nullptr; +#ifndef SSVEP_NO_MOUSE_CAPTURE + m_application->getLogManager() << Kernel::LogLevel_Debug << "- destroy m_mouse\n"; + m_inputManager->destroyInputObject( m_mouse ); + m_mouse = nullptr; +#endif + } + + OIS::InputManager::destroyInputSystem(m_inputManager); + } + } +} + +void ICommandOIS::processFrame() +{ + m_keyboard->capture(); +#ifndef SSVEP_NO_MOUSE_CAPTURE + m_mouse->capture(); +#endif +} + + +bool ICommandOIS::keyPressed(const OIS::KeyEvent& oEvent) +{ + for (size_t i = 0; i < m_instances.size(); ++i) { m_instances[i]->receiveKeyPressedEvent(oEvent.key); } + return true; +} + +bool ICommandOIS::keyReleased(const OIS::KeyEvent& oEvent) +{ + for (size_t i = 0; i < m_instances.size(); ++i) { m_instances[i]->receiveKeyReleasedEvent(oEvent.key); } + return true; +} + +#ifndef SSVEP_NO_MOUSE_CAPTURE +bool ICommandOIS::mouseMoved(const OIS::MouseEvent & event) +{ + for (size_t i = 0; i < m_instances.size(); ++i) { m_instances[i]->receiveMouseEvent(event); } + return true; +} +#endif + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandOIS.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandOIS.h new file mode 100755 index 0000000..1a56a70 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandOIS.h @@ -0,0 +1,41 @@ +#pragma once + +#include + +#include +#include +#include +#include "ovamsICommand.h" + +namespace OpenViBE { +namespace SSVEPMindShooter { +class ICommandOIS : public ICommand, OIS::KeyListener, OIS::MouseListener +{ + static std::vector m_instances; + static int m_nInstance; + +protected: + static OIS::InputManager* m_inputManager; + static OIS::Keyboard* m_keyboard; + static OIS::Mouse* m_mouse; + +public: + explicit ICommandOIS(CApplication* application); + ~ICommandOIS() override; + + void processFrame() override; + +protected: + virtual void receiveKeyPressedEvent(OIS::KeyCode key) = 0; + virtual void receiveKeyReleasedEvent(OIS::KeyCode key) = 0; + virtual void receiveMouseEvent(const OIS::MouseEvent& /*oEvent*/) {} + +private: + bool keyPressed(const OIS::KeyEvent& oEvent) override; + bool keyReleased(const OIS::KeyEvent& oEvent) override; + bool mouseMoved(const OIS::MouseEvent& event) override { return true; } + bool mousePressed(const OIS::MouseEvent& /*arg*/, OIS::MouseButtonID /*id*/) override { return true; } + bool mouseReleased(const OIS::MouseEvent& /*arg*/, OIS::MouseButtonID /*id*/) override { return true; } +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandVRPNAnalog.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandVRPNAnalog.cpp new file mode 100755 index 0000000..5a7ff23 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandVRPNAnalog.cpp @@ -0,0 +1,39 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsICommandVRPNAnalog.h" +#include "ovamsCApplication.h" + +#include +#include + +namespace OpenViBE { +namespace SSVEPMindShooter { + +static void VRPN_CALLBACK ssvep_vrpn_callback_analog(void* command, vrpn_ANALOGCB analog) +{ + static_cast(command)->execute(analog.num_channel, analog.channel); +} + +ICommandVRPNAnalog::ICommandVRPNAnalog(CApplication* application, const CString& name) : ICommand(application) +{ + Kernel::IConfigurationManager* configManager = application->getConfigurationManager(); + + const std::string analogName = std::string(name.toASCIIString()) + "@" + (configManager->expand("${SSVEP_VRPNHost}")).toASCIIString(); + m_application->getLogManager() << Kernel::LogLevel_Debug << "+ m_vrpnAnalog = new vrpn_Analog_Remote(" << analogName << ")\n"; + + + m_vrpnAnalog = new vrpn_Analog_Remote(analogName.c_str()); + m_vrpnAnalog->register_change_handler(static_cast(this), ssvep_vrpn_callback_analog); +} + +ICommandVRPNAnalog::~ICommandVRPNAnalog() +{ + m_application->getLogManager() << Kernel::LogLevel_Debug << "- delete m_vrpnAnalog\n"; + delete m_vrpnAnalog; +} + +void ICommandVRPNAnalog::processFrame() { m_vrpnAnalog->mainloop(); } + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandVRPNAnalog.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandVRPNAnalog.h new file mode 100755 index 0000000..7168352 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandVRPNAnalog.h @@ -0,0 +1,23 @@ +#pragma once + +#include "ovamsICommand.h" +#include + +class vrpn_Analog_Remote; + +namespace OpenViBE { +namespace SSVEPMindShooter { +class ICommandVRPNAnalog : public ICommand +{ +public: + ICommandVRPNAnalog(CApplication* application, const CString& name); + ~ICommandVRPNAnalog() override; + + void processFrame() override; + virtual void execute(int channelCount, double* channel) = 0; + +protected: + vrpn_Analog_Remote* m_vrpnAnalog = nullptr; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandVRPNButton.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandVRPNButton.cpp new file mode 100755 index 0000000..9c6b25a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandVRPNButton.cpp @@ -0,0 +1,41 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovamsICommandVRPNButton.h" +#include "ovamsCApplication.h" + +#include +#include + +namespace OpenViBE { +namespace SSVEPMindShooter { + +static void VRPN_CALLBACK ssvep_vrpn_callback_button(void* command, vrpn_BUTTONCB button) +{ + static_cast(command)->execute(button.button, button.state); +} + +ICommandVRPNButton::ICommandVRPNButton(CApplication* application, const CString& name) + : ICommand(application) +{ + Kernel::IConfigurationManager* configManager = application->getConfigurationManager(); + const std::string buttonName = std::string(name.toASCIIString()) + std::string("@") + std::string( + (configManager->expand("${SSVEP_VRPNHost}")).toASCIIString()); + + m_application->getLogManager() << Kernel::LogLevel_Debug << "+ m_vrpnButton = new vrpn_Button_Remote(" << buttonName << ")\n"; + + + m_vrpnButton = new vrpn_Button_Remote(buttonName.c_str()); + m_vrpnButton->register_change_handler(static_cast(this), ssvep_vrpn_callback_button); +} + +ICommandVRPNButton::~ICommandVRPNButton() +{ + m_application->getLogManager() << Kernel::LogLevel_Debug << "- delete m_vrpnButton\n"; + delete m_vrpnButton; +} + +void ICommandVRPNButton::processFrame() { m_vrpnButton->mainloop(); } + +} // namespace SSVEPMindShooter +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandVRPNButton.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandVRPNButton.h new file mode 100755 index 0000000..8220117 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovamsICommandVRPNButton.h @@ -0,0 +1,22 @@ +#pragma once + +#include "ovamsICommand.h" + +class vrpn_Button_Remote; + +namespace OpenViBE { +namespace SSVEPMindShooter { +class ICommandVRPNButton : public ICommand +{ +public: + ICommandVRPNButton(CApplication* application, const CString& name); + ~ICommandVRPNButton() override; + + void processFrame() override; + virtual void execute(const int button, const int state) = 0; + +protected: + vrpn_Button_Remote* m_vrpnButton = nullptr; +}; +} // namespace SSVEPMindShooter +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovams_defines.h b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovams_defines.h new file mode 100755 index 0000000..6f70f09 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovams_defines.h @@ -0,0 +1 @@ +#pragma once diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovams_main.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovams_main.cpp new file mode 100755 index 0000000..ec975a7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/ssvep-mind-shooter/src/ovams_main.cpp @@ -0,0 +1,153 @@ +/* + * Notes: + * + * - This demo used to be called 'Impact Shooter' before being renamed to 'Mind Shooter'. The various + * mentions of 'Impact' are propagating from that time and should be cleaned up one day. + * + * + */ +#if defined(TARGET_HAS_ThirdPartyOgre3DTerrain) + +#include "ovams_defines.h" +#include +#include +#include + +#include "ovamsCApplication.h" +#include "GenericStimulator/ovamsCGenericStimulatorApplication.h" +#include "Impact/ovamsCImpactApplication.h" + +int main(const int argc, char** argv) +{ + if (argc != 3) + { + std::cout << "Usage : " << argv[0] << " \n"; + exit(1); + } + + // initialize the OpenViBE kernel + + OpenViBE::CKernelLoader kernelLoader; + OpenViBE::CString error; + OpenViBE::Kernel::IKernelDesc* kernelDesc = nullptr; + OpenViBE::Kernel::IKernelContext* kernelContext = nullptr; + OpenViBE::Kernel::ILogManager* logManager = nullptr; + + const OpenViBE::CString applicationString = OpenViBE::CString(argv[1]); + const OpenViBE::CString scenarioFolder = OpenViBE::CString(argv[2]); + + OpenViBE::CString applicationType, applicationSubtype; + + if (applicationString == OpenViBE::CString("generic")) + { + applicationType = "generic"; + applicationSubtype = ""; + } + else if (applicationString == OpenViBE::CString("impact-trainer")) + { + applicationType = "impact"; + applicationSubtype = "trainer"; + } + else if (applicationString == OpenViBE::CString("impact-shooter")) + { + applicationType = "impact"; + applicationSubtype = "shooter"; + } + else + { + std::cout << "[ERROR] unknown command line parameter '" << applicationString << "'\n"; + exit(3); + } + +#ifdef TARGET_OS_Windows + std::cout << "[ INF ] Loading Windows kernel\n"; + if (!kernelLoader.load(OpenViBE::Directories::getBinDir() + "/openvibe-kernel.dll", &error)) +#else + std::cout << "[ INF ] Loading Linux kernel\n"; + if(!kernelLoader.load(OpenViBE::Directories::getLibDir() + "/libopenvibe-kernel.so", &error)) +#endif + { + std::cout << "[ FAILED ] Error loading kernel (" << error << ")" << "\n"; + exit(1); + } + std::cout << "[ INF ] Kernel module loaded, trying to get kernel descriptor\n"; + + kernelLoader.initialize(); + kernelLoader.getKernelDesc(kernelDesc); + + if (!kernelDesc) { std::cout << "[ FAILED ] No kernel descriptor\n"; } + else + { + std::cout << "[ INF ] Got kernel descriptor, trying to create kernel\n"; + + kernelContext = kernelDesc->createKernel("ssvep-stimulator", OpenViBE::Directories::getDataDir() + "/kernel/openvibe.conf"); + + if (!kernelContext) { std::cout << "[ FAILED ] No kernel created by kernel descriptor\n"; } + else + { + kernelContext->initialize(); + + OpenViBE::Toolkit::initialize(*kernelContext); + + OpenViBE::Kernel::IConfigurationManager* configManager = &(kernelContext->getConfigurationManager()); + configManager->addConfigurationFromFile(configManager->expand("${Path_Data}/kernel/openvibe.conf")); + logManager = &(kernelContext->getLogManager()); + + // (*l_poLogManager) << Kernel::LogLevel_Info << configManager->expand("${UserHome}") << "\n"; + const OpenViBE::CString configFile = scenarioFolder + "/appconf/application-configuration.conf"; + if (!configManager->addConfigurationFromFile(configFile)) + { + (*logManager) << OpenViBE::Kernel::LogLevel_Error << "Unable to read [" << configFile << "]\n"; + exit(3); + } + + // This folder contains resources such as textures etc + configManager->createConfigurationToken("SSVEP_MindShooterFolderName", "ssvep-mind-shooter"); + + // This folder is the runtime scenario path + configManager->createConfigurationToken("SSVEP_MindShooterScenarioPath", scenarioFolder); + } + } + + OpenViBE::SSVEPMindShooter::CApplication* app; + + if (applicationType == OpenViBE::CString("generic")) + { + (*logManager) << OpenViBE::Kernel::LogLevel_Debug << "+ app = new SSVEPMindShooter::CGenericStimulatorApplication(...)\n"; + app = new OpenViBE::SSVEPMindShooter::CGenericStimulatorApplication(scenarioFolder); + } + else if (applicationType == OpenViBE::CString("impact")) + { + (*logManager) << OpenViBE::Kernel::LogLevel_Debug << "+ app = new SSVEPMindShooter::CImpactApplication(...)\n"; + (*logManager) << OpenViBE::Kernel::LogLevel_Info << "application subtype " << applicationSubtype << "\n"; + app = new OpenViBE::SSVEPMindShooter::CImpactApplication(scenarioFolder, applicationSubtype); + } + else + { + (*logManager) << OpenViBE::Kernel::LogLevel_Error << "Wrong application identifier specified\n"; + exit(1); + } + + if (!app->setup(kernelContext)) + { + (*logManager) << OpenViBE::Kernel::LogLevel_Error << "Cannot proceed, exiting\n"; + exit(2); + } + + app->go(); + + (*logManager) << OpenViBE::Kernel::LogLevel_Debug << "- app\n"; + delete app; + + return 0; +} + +#else +#include + +int main(int argc, char** argv) +{ + std::cout << "SSVEP Mind Shooter has not been compiled as it depends on Ogre (missing/disabled)\n"; + return -1; +} +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/CMakeLists.txt new file mode 100644 index 0000000..cad707c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/CMakeLists.txt @@ -0,0 +1,79 @@ +PROJECT(openvibe-vr-demo) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +INCLUDE("FindThirdPartyVRPN_Check") +IF(NOT PATH_VRPN) + MESSAGE(STATUS " --> Not building ${PROJECT_NAME}") + RETURN() +ENDIF(NOT PATH_VRPN) + +INCLUDE("FindThirdPartyCEGUI_Check") +IF(NOT CEGUI_FOUND OR NOT OgreCEGUIRenderer_FOUND) + MESSAGE(STATUS " --> Not building ${PROJECT_NAME}") + RETURN() +ENDIF(NOT CEGUI_FOUND OR NOT OgreCEGUIRenderer_FOUND) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindThirdPartyCEGUI") # CEGUI + CEGUIOgreRender included +INCLUDE("FindThirdPartyVRPN") +INCLUDE("FindThirdPartyOgre3D") # OGRE + OIS included +INCLUDE("FindThirdPartyBoost") # Using Ogre headers on Win32 causes dependency to Boost thread library +INCLUDE("FindThirdPartyBoost_Thread") # Note that this is a potential issue on Windows, as the dependencies/ogre/boost and dependencies/boost are not the same at the time of writing this. +INCLUDE("FindThirdPartyBoost_System") # Note that this is a potential issue on Windows, as the dependencies/ogre/boost and dependencies/boost are not the same at the time of writing this. + +# --------------------------------- +# Finds standard library pthread +# Adds library to target +# Adds include path +# --------------------------------- +IF(UNIX) + FIND_LIBRARY(LIB_STANDARD_MODULE_PTHREAD pthread) + IF(LIB_STANDARD_MODULE_PTHREAD) + MESSAGE(STATUS " Found pthread...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_PTHREAD}) + ELSE(LIB_STANDARD_MODULE_PTHREAD) + MESSAGE(STATUS " FAILED to find pthread...") + ENDIF(LIB_STANDARD_MODULE_PTHREAD) +ENDIF(UNIX) + +# --------------------------------- + + + + +# --------------------------------- + + +# ---------------------- +# Generate launch script +# ---------------------- +IF(WIN32) + OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "openvibe-vr-demo-handball" EXECUTABLE_NAME ${PROJECT_NAME} PARAMETERS "handball") + OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "openvibe-vr-demo-spaceship" EXECUTABLE_NAME ${PROJECT_NAME} PARAMETERS "spaceship") +ENDIF(WIN32) +IF(UNIX) + OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "openvibe-vr-demo-handball" EXECUTABLE_NAME ${PROJECT_NAME} PARAMETERS "handball") + OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "openvibe-vr-demo-spaceship" EXECUTABLE_NAME ${PROJECT_NAME} PARAMETERS "spaceship") +ENDIF(UNIX) + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/applications/vr-demo) + +INSTALL(DIRECTORY signals DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) +INSTALL(DIRECTORY bci-examples DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/bci-examples/handball/handball-replay.xml b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/bci-examples/handball/handball-replay.xml new file mode 100644 index 0000000..7c27e54 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/bci-examples/handball/handball-replay.xml @@ -0,0 +1,1401 @@ + + 2 + OpenViBE Designer + 3.0.0 + + + + + + (0x00000950, 0x0000088b) + Button VRPN server + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + (0x6f752dd0, 0x082a321e) + Input 3 + + + (0x6f752dd0, 0x082a321e) + Input 4 + + + (0x6f752dd0, 0x082a321e) + Input 5 + + + (0x6f752dd0, 0x082a321e) + Input 6 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + openvibe-vrpn + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_GDF_Start_Of_Trial + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_GDF_Feedback_Continuous + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_GDF_Feedback_Continuous + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_GDF_End_Of_Trial + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 ON + OVTK_GDF_Feedback_Continuous + OVTK_GDF_End_Of_Trial + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 OFF + OVTK_GDF_End_Of_Trial + OVTK_GDF_Start_Of_Trial + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 ON + OVTK_GDF_Feedback_Continuous + OVTK_GDF_Left + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 OFF + OVTK_GDF_End_Of_Trial + OVTK_GDF_End_Of_Trial + false + + + (0x2c132d6e, 0x44ab0d97) + Button 5 ON + OVTK_GDF_Feedback_Continuous + OVTK_GDF_Right + false + + + (0x2c132d6e, 0x44ab0d97) + Button 5 OFF + OVTK_GDF_End_Of_Trial + OVTK_GDF_End_Of_Trial + false + + + (0x2c132d6e, 0x44ab0d97) + Button 6 ON + OVTK_GDF_Feedback_Continuous + OVTK_GDF_Cue_Unknown_Undefined + false + + + (0x2c132d6e, 0x44ab0d97) + Button 6 OFF + OVTK_GDF_End_Of_Trial + OVTK_GDF_End_Of_Trial + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000b95, 0x00002a04) + Analog VRPN server + (0x0ddc3a7e, 0x6f6e6401) + + + (0x544a003e, 0x6dcba5f6) + Input 1 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + openvibe-vrpn + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x2f4c9e00, 0x5dc619e4) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000cde, 0x00007ff2) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004da903) + + + + + (0x00000dc1, 0x00006619) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005b9e8d) + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000133d, 0x00001231) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002205, 0x000001a2) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x016b7673) + + + + + (0x00002218, 0x00001519) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006bdf4b) + + + + + (0x00002652, 0x00005597) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002826, 0x00005179) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000396e, 0x00001c12) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000041f8, 0x0000521f) + Surface Laplacian + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 4;0;-1;0;-1;-1;0;0;-1;0;0;4;0;-1;0;0;-1;-1;0;-1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 2 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 10 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006055, 0x00002986) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 480 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007cfd, 0x00001f75) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b124ce) + + + + + (0x3fa25161, 0x1ac039f6) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/motor-imagery-bci-config-classifier.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x5e04ee28, 0x7aa4e1bb) + Graz visualization + (0x00dd290d, 0x5f142820) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Show feedback + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive feedback only + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 688 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0x602ceb3f, 0xd3bc74aa) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + + + (0x00000295, 0x00002a76) + + (0x00000dc1, 0x00006619) + 1 + + + (0x00000950, 0x0000088b) + 3 + + + + (0x0000044c, 0x00004e17) + + (0x3fa25161, 0x1ac039f6) + 2 + + + (0x00000b95, 0x00002a04) + 0 + + + + (0x00000a6c, 0x00003766) + + (0x00000dc1, 0x00006619) + 1 + + + (0x00000950, 0x0000088b) + 2 + + + + (0x00000ebf, 0x00006cef) + + (0x00000dc1, 0x00006619) + 1 + + + (0x00000950, 0x0000088b) + 4 + + + + (0x00001eff, 0x00005e52) + + (0x00002205, 0x000001a2) + 0 + + + (0x00002218, 0x00001519) + 0 + + + + (0x000024fa, 0x0000070c) + + (0x00000dc1, 0x00006619) + 0 + + + (0x0000133d, 0x00001231) + 0 + + + + (0x00002c81, 0x00004a94) + + (0x00000dc1, 0x00006619) + 1 + + + (0x00000950, 0x0000088b) + 1 + + + + (0x0000311c, 0x00001a36) + + (0x3fa25161, 0x1ac039f6) + 2 + + + (0x5e04ee28, 0x7aa4e1bb) + 1 + + + + (0x000038e6, 0x00002eba) + + (0x00000dc1, 0x00006619) + 1 + + + (0x00000950, 0x0000088b) + 0 + + + + (0x00004120, 0x00002836) + + (0x00002652, 0x00005597) + 0 + + + (0x00006055, 0x00002986) + 0 + + + + (0x00004e5e, 0x00001e3a) + + (0x00000cde, 0x00007ff2) + 0 + + + (0x00002652, 0x00005597) + 0 + + + + (0x00005867, 0x00003b7f) + + (0x00002218, 0x00001519) + 0 + + + (0x0000396e, 0x00001c12) + 0 + + + + (0x00005b0f, 0x00006971) + + (0x00002826, 0x00005179) + 0 + + + (0x000041f8, 0x0000521f) + 0 + + + + (0x00005e6e, 0x00007b32) + + (0x00000dc1, 0x00006619) + 1 + + + (0x00000950, 0x0000088b) + 5 + + + + (0x00006509, 0x0000409a) + + (0x0000133d, 0x00001231) + 0 + + + (0x00002826, 0x00005179) + 0 + + + + (0x00006b38, 0x00001014) + + (0x00007cfd, 0x00001f75) + 1 + + + (0x00000dc1, 0x00006619) + 0 + + + + (0x000074f4, 0x000025c2) + + (0x000041f8, 0x0000521f) + 0 + + + (0x00002205, 0x000001a2) + 0 + + + + (0x00007622, 0x00003e46) + + (0x0000396e, 0x00001c12) + 0 + + + (0x00000cde, 0x00007ff2) + 0 + + + + (0x00007c59, 0x0000217a) + + (0x00007cfd, 0x00001f75) + 2 + + + (0x00000dc1, 0x00006619) + 1 + + + + (0x5f696acf, 0x60799220) + + (0x00006055, 0x00002986) + 0 + + + (0x3fa25161, 0x1ac039f6) + 0 + + + + (0x6fa85c67, 0x49dcd1cc) + + (0x00000dc1, 0x00006619) + 1 + + + (0x5e04ee28, 0x7aa4e1bb) + 0 + + + + + + (0x00000b1a, 0x00001e9c) + <b>VRPN</b> +The <b>button Server</b> tells the handball application +in which step the experiment is. It also triggers +the instructions given to the user. + +The <b>Analog Server</b> provides the feedback value +computed by the classifier (distance to LDA hyperplane). + + + (0x473d9a43, 0x97fc0a97) + 784 + + + (0x7234b86b, 0x2b8651a5) + 272 + + + + + (0x000035fc, 0x000020af) + Please note that the feedback is starting near <b>40s</b> + + + (0x473d9a43, 0x97fc0a97) + 672 + + + (0x7234b86b, 0x2b8651a5) + 64 + + + + + (0x00005a4d, 0x0000751a) + <u><b><big>Overview</big></b></u> + +This scenario allows to quickly replay +an online session recorded file, and watch the corresponding +feedback using the <b>openvibe-vr-demo-handball</b>. +Please launch it manually. + +This scenario is based on <i>motor-imagery-bci-4-replay</i>, +which can be found in <i>bci/motor-imagery</i>. +It uses <b>VRPN servers</b> to communicate with the handball application. + +<u><b>Note:</b></u> refer to scenario <i>motor-imagery-3-online</i> for +details about the processing. + + + (0x473d9a43, 0x97fc0a97) + 688 + + + (0x7234b86b, 0x2b8651a5) + -80 + + + + + (0x000062e5, 0x00007ae1) + The <b>Classifier Processor</b> is classifying +the mental activity in 2 classes : Left or Right hand movements. + +This LDA classifier is already trained. +Please refer to scenario <i>motor-imagery-bci-2-classifier-trainer</i> +for details about the training process. + + + (0x473d9a43, 0x97fc0a97) + 608 + + + (0x7234b86b, 0x2b8651a5) + 576 + + + + + (0x0000717d, 0x000002d5) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 304 + + + (0x7234b86b, 0x2b8651a5) + -208 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":505,"identifier":"(0x0000417c, 0x00003f13)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":608},{"boxIdentifier":"(0x5e04ee28, 0x7aa4e1bb)","childCount":0,"identifier":"(0x25bc365b, 0x63a124e9)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006478, 0x00004ef7)","index":0,"name":"Default tab","parentIdentifier":"(0x0000417c, 0x00003f13)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00001fe2, 0x00005a9b)","index":0,"name":"Empty","parentIdentifier":"(0x00006478, 0x00004ef7)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Yann Renad / Fabien Lotte + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + File Replay + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Motor Imagery + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/bci-examples/handball/motor-imagery-bci-config-classifier.cfg b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/bci-examples/handball/motor-imagery-bci-config-classifier.cfg new file mode 100644 index 0000000..a3e5271 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/bci-examples/handball/motor-imagery-bci-config-classifier.cfg @@ -0,0 +1,23 @@ + + Native + Linear Discrimimant Analysis (LDA) + + OVTK_GDF_Left + OVTK_GDF_Right + + + + 0 1 + + + 2.318337e+001 1.028989e+001 + -26.1985 + + + 2.036666e+001 1.336324e+001 + -27.024 + + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/bci-examples/spaceship/spaceship-freetime.xml b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/bci-examples/spaceship/spaceship-freetime.xml new file mode 100644 index 0000000..9352505 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/bci-examples/spaceship/spaceship-freetime.xml @@ -0,0 +1,1786 @@ + + 1 + OpenViBE + 1.2.1+git + + + (0x00000bd4, 0x000027c7) + Crop + (0x7f1a3002, 0x358117ba) + + + (0x5ba36127, 0x195feae1) + Input matrix + + + + + (0x5ba36127, 0x195feae1) + Output matrix + + + + + (0xd0643f9e, 0x8e35fe0a) + Crop method + Min + Min/Max + false + + + (0x512a166f, 0x5c3ef83f) + Min crop value + -1 + 4.246961 + false + + + (0x512a166f, 0x5c3ef83f) + Max crop value + 1 + 12.595946 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x1b151919, 0x63b9f9c9) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 59 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000f238b) + + + + + (0x00001087, 0x00006247) + Identity + (0x5dffe431, 0x35215c50) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + (0x013df452, 0xa3a8879a) + Input stream 4 + + + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 59 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00245f5e) + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001222, 0x0000295e) + Beta power + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + None + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 10 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 20 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 720.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 256.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 84 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000f238c) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00002355, 0x00002fda) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 82 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0016aced) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002efc, 0x0000462b) + Button VRPN server + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + (0x6f752dd0, 0x082a321e) + Input 3 + + + (0x6f752dd0, 0x082a321e) + Input 4 + + + (0x6f752dd0, 0x082a321e) + Input 5 + + + (0x6f752dd0, 0x082a321e) + Input 6 + + + (0x6f752dd0, 0x082a321e) + Input 7 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + openvibe-vrpn + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_04 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 3 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_05 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 ON + OVTK_GDF_Feedback_Continuous + OVTK_GDF_Stage_1 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 4 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_0C + false + + + (0x2c132d6e, 0x44ab0d97) + Button 5 ON + OVTK_GDF_Feedback_Continuous + OVTK_GDF_Stage_2 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 5 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_0D + false + + + (0x2c132d6e, 0x44ab0d97) + Button 6 ON + OVTK_GDF_Feedback_Continuous + OVTK_GDF_Stage_3 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 6 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_0E + false + + + (0x2c132d6e, 0x44ab0d97) + Button 7 ON + OVTK_GDF_Feedback_Continuous + OVTK_GDF_Stage_4 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 7 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_0F + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bbc2b1) + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003adc, 0x0000614f) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 95 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00122749) + + + + + (0x00004907, 0x000044f3) + Analog VRPN server + (0x0ddc3a7e, 0x6f6e6401) + + + (0x544a003e, 0x6dcba5f6) + Input 1 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + openvibe-vrpn + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0x2f4c9e00, 0x5dc619e4) + + + (0xad100179, 0xa3c984ab) + 135 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003b2dd6) + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004a9e, 0x00002b49) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.100000 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xad100179, 0xa3c984ab) + 147 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001919b1) + + + + + (0x00006306, 0x00004f80) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 16.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002c2bd7) + + + + + (0x00007134, 0x0000322d) + Beta signal + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 416.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 83 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003d2525) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000074ab, 0x00007137) + GDF file reader + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/spaceship-freetime.gdf + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004fe358) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x000076db, 0x000079cc) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x-8.421453 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 82 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00107316) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007a71, 0x0000526f) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Epoch block average + Moving epoch average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001acde1) + + + + + + + (0x00000046, 0x00005601) + + (0x00001087, 0x00006247) + 2 + + + (0x00002efc, 0x0000462b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 103 + + + (0x358ae8b5, 0x0f8bacd1) + 423 + + + (0x3f0a3b27, 0x570913d2) + 278 + + + (0x6267b5c5, 0x676e3e42) + 547 + + + + + (0x00000c66, 0x000053ca) + + (0x00001087, 0x00006247) + 2 + + + (0x00002efc, 0x0000462b) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 103 + + + (0x358ae8b5, 0x0f8bacd1) + 423 + + + (0x3f0a3b27, 0x570913d2) + 278 + + + (0x6267b5c5, 0x676e3e42) + 562 + + + + + (0x00001226, 0x000064e3) + + (0x00001087, 0x00006247) + 2 + + + (0x00002efc, 0x0000462b) + 5 + + + + (0x1b32c44c, 0x1905e0e9) + 103 + + + (0x358ae8b5, 0x0f8bacd1) + 423 + + + (0x3f0a3b27, 0x570913d2) + 278 + + + (0x6267b5c5, 0x676e3e42) + 622 + + + + + (0x0000189b, 0x000063e4) + + (0x00003adc, 0x0000614f) + 0 + + + (0x00007a71, 0x0000526f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 466 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 475 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x00001968, 0x00006a15) + + (0x000076db, 0x000079cc) + 0 + + + (0x00004907, 0x000044f3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 663 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 342 + + + (0x6267b5c5, 0x676e3e42) + 592 + + + + + (0x000021cd, 0x00007233) + + (0x00006306, 0x00004f80) + 0 + + + (0x00007134, 0x0000322d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 274 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 294 + + + (0x6267b5c5, 0x676e3e42) + 401 + + + + + (0x00002ddb, 0x00002409) + + (0x00000bd4, 0x000027c7) + 0 + + + (0x000076db, 0x000079cc) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 583 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 619 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x000034bf, 0x00006a46) + + (0x00001087, 0x00006247) + 2 + + + (0x00002efc, 0x0000462b) + 4 + + + + (0x1b32c44c, 0x1905e0e9) + 103 + + + (0x358ae8b5, 0x0f8bacd1) + 423 + + + (0x3f0a3b27, 0x570913d2) + 278 + + + (0x6267b5c5, 0x676e3e42) + 607 + + + + + (0x000047dc, 0x00007611) + + (0x000076db, 0x000079cc) + 0 + + + (0x00001222, 0x0000295e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 663 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 694 + + + (0x6267b5c5, 0x676e3e42) + 241 + + + + + (0x00004c8e, 0x00000423) + + (0x00001087, 0x00006247) + 1 + + + (0x00006306, 0x00004f80) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 103 + + + (0x358ae8b5, 0x0f8bacd1) + 408 + + + (0x3f0a3b27, 0x570913d2) + 240 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x00005083, 0x00000f38) + + (0x00001087, 0x00006247) + 2 + + + (0x00002efc, 0x0000462b) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 103 + + + (0x358ae8b5, 0x0f8bacd1) + 423 + + + (0x3f0a3b27, 0x570913d2) + 278 + + + (0x6267b5c5, 0x676e3e42) + 577 + + + + + (0x000050d7, 0x00004964) + + (0x00001087, 0x00006247) + 2 + + + (0x00002efc, 0x0000462b) + 3 + + + + (0x1b32c44c, 0x1905e0e9) + 103 + + + (0x358ae8b5, 0x0f8bacd1) + 423 + + + (0x3f0a3b27, 0x570913d2) + 278 + + + (0x6267b5c5, 0x676e3e42) + 592 + + + + + (0x00005151, 0x000072e1) + + (0x00007a71, 0x0000526f) + 0 + + + (0x00000bd4, 0x000027c7) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 519 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 539 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x000053f9, 0x000052d5) + + (0x00002355, 0x00002fda) + 0 + + + (0x00003adc, 0x0000614f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 423 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 432 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x000055e8, 0x00001d0d) + + (0x00004a9e, 0x00002b49) + 0 + + + (0x00002355, 0x00002fda) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 343 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 379 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x00005e14, 0x00000b18) + + (0x000074ab, 0x00007137) + 1 + + + (0x00001087, 0x00006247) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 18 + + + (0x358ae8b5, 0x0f8bacd1) + 416 + + + (0x3f0a3b27, 0x570913d2) + 59 + + + (0x6267b5c5, 0x676e3e42) + 408 + + + + + (0x0000666a, 0x000049ff) + + (0x00001087, 0x00006247) + 2 + + + (0x00007134, 0x0000322d) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 103 + + + (0x358ae8b5, 0x0f8bacd1) + 423 + + + (0x3f0a3b27, 0x570913d2) + 294 + + + (0x6267b5c5, 0x676e3e42) + 416 + + + + + (0x000069b1, 0x00002aae) + + (0x000074ab, 0x00007137) + 2 + + + (0x00001087, 0x00006247) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 18 + + + (0x358ae8b5, 0x0f8bacd1) + 431 + + + (0x3f0a3b27, 0x570913d2) + 59 + + + (0x6267b5c5, 0x676e3e42) + 423 + + + + + (0x00007104, 0x00003e8f) + + (0x00006306, 0x00004f80) + 0 + + + (0x00004a9e, 0x00002b49) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 274 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 299 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x00007513, 0x00002f49) + + (0x00001087, 0x00006247) + 2 + + + (0x00002efc, 0x0000462b) + 6 + + + + (0x1b32c44c, 0x1905e0e9) + 103 + + + (0x358ae8b5, 0x0f8bacd1) + 423 + + + (0x3f0a3b27, 0x570913d2) + 278 + + + (0x6267b5c5, 0x676e3e42) + 637 + + + + + + + (0x00000ae4, 0x00000978) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 496 + + + (0x7234b86b, 0x2b8651a5) + -64 + + + + + (0x00004bc3, 0x00005eb7) + <u><b><big>Overview</big></b></u> + +This scenario allows to quickly replay +an online session of <b>feet motor imagery</b>, and watch the corresponding feedback. + +The feedback is presented through signal displays : one for the brain +activity on the Cz electrode, and one for the band power in +the beta activity,related to (imagined) feet movement. + +An external feedback is possible through VRPN: +launch the <b>vr-demo-spaceship</b> to see a spaceship +lifted when a spike of Beta activity is detected. + +For more information on the processing pipeline, +please look at the scenario <i>neurofeedback/neurofeedback.xml</i>. + + + (0x473d9a43, 0x97fc0a97) + 896 + + + (0x7234b86b, 0x2b8651a5) + 80 + + + + + (0x0000644f, 0x00007dfb) + <b>VRPN</b> +The <b>button Server</b> tells the spaceship application +in which step the experiment is. It also triggers +the instructions given to the user. + +The <b>Analog Server</b> provides the feedback value. + + + (0x473d9a43, 0x97fc0a97) + 864 + + + (0x7234b86b, 0x2b8651a5) + 336 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":400,"identifier":"(0x000011cc, 0x00007087)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":383},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00005470, 0x00002f9b)","index":0,"name":"Default tab","parentIdentifier":"(0x000011cc, 0x00007087)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":175,"identifier":"(0x00002aab, 0x00000093)","index":0,"maxDividerPosition":355,"name":"Vertical split","parentIdentifier":"(0x00005470, 0x00002f9b)","type":4},{"boxIdentifier":"(0x00007134, 0x0000322d)","childCount":0,"identifier":"(0x00002e3f, 0x00004b05)","index":0,"parentIdentifier":"(0x00002aab, 0x00000093)","type":3},{"boxIdentifier":"(0x00001222, 0x0000295e)","childCount":0,"identifier":"(0x00007138, 0x000064f4)","index":1,"parentIdentifier":"(0x00002aab, 0x00000093)","type":3}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook-0.8.imageset b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook-0.8.imageset new file mode 100644 index 0000000..5c69e66 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook-0.8.imageset @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook-0.8.looknfeel b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook-0.8.looknfeel new file mode 100644 index 0000000..60f53ee --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook-0.8.looknfeel @@ -0,0 +1,4154 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+
+ +
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook-ov-0.8.scheme b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook-ov-0.8.scheme new file mode 100644 index 0000000..38d35c6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook-ov-0.8.scheme @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook-ov.scheme b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook-ov.scheme new file mode 100644 index 0000000..e23e731 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook-ov.scheme @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook.imageset b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook.imageset new file mode 100644 index 0000000..2e3ec16 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook.imageset @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook.looknfeel b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook.looknfeel new file mode 100644 index 0000000..2ad3e4e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook.looknfeel @@ -0,0 +1,4812 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+ +
+
+ +
+
+ +
+
+
+ + +
+ + + + +
+ + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+
+ +
+ + + + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+ + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+
+ +
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook.tga b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook.tga new file mode 100644 index 0000000..4094fec Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/TaharezLook.tga differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehigh.ttf b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehigh.ttf new file mode 100644 index 0000000..14d45c5 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehigh.ttf differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-10-0.8.font b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-10-0.8.font new file mode 100644 index 0000000..2575772 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-10-0.8.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-10.font b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-10.font new file mode 100644 index 0000000..23a7bc7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-10.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-12-0.8.font b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-12-0.8.font new file mode 100644 index 0000000..f7f59cf --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-12-0.8.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-12.font b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-12.font new file mode 100644 index 0000000..e6aac73 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-12.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-24-0.8.font b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-24-0.8.font new file mode 100644 index 0000000..4255b08 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-24-0.8.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-24.font b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-24.font new file mode 100644 index 0000000..c3e179b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-24.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-8-0.8.font b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-8-0.8.font new file mode 100644 index 0000000..f51f225 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-8-0.8.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-8.font b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-8.font new file mode 100644 index 0000000..ba3ac2e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/GUI/bluehighway-8.font @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/OgreCore.zip b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/OgreCore.zip new file mode 100644 index 0000000..caf99e0 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/OgreCore.zip differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-blue.material b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-blue.material new file mode 100644 index 0000000..3e29115 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-blue.material @@ -0,0 +1,15 @@ +material plane-blue-plane-material +{ + technique + { + pass + { + ambient 0.196078 0.247059 0.937255 + diffuse 0.196078 0.247059 0.937255 + specular 0 0 0 10 + emissive 0 0 0 + } + } +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-blue.scene b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-blue.scene new file mode 100644 index 0000000..7bf17f7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-blue.scene @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-blueNode.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-blueNode.mesh new file mode 100644 index 0000000..793ea7e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-blueNode.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-cyan.material b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-cyan.material new file mode 100644 index 0000000..2db8bd9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-cyan.material @@ -0,0 +1,15 @@ +material plane-cyan-plane-material +{ + technique + { + pass + { + ambient 0.196078 0.945098 0.917647 + diffuse 0.196078 0.945098 0.917647 + specular 0 0 0 10 + emissive 0 0 0 + } + } +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-cyan.scene b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-cyan.scene new file mode 100644 index 0000000..008d4a6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-cyan.scene @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-cyanNode.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-cyanNode.mesh new file mode 100644 index 0000000..d99129a Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-cyanNode.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-green.material b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-green.material new file mode 100644 index 0000000..5918517 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-green.material @@ -0,0 +1,15 @@ +material plane-green-plane-material +{ + technique + { + pass + { + ambient 0.196078 0.945098 0.286275 + diffuse 0.196078 0.945098 0.286275 + specular 0 0 0 10 + emissive 0 0 0 + } + } +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-green.scene b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-green.scene new file mode 100644 index 0000000..eed782e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-green.scene @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-greenNode.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-greenNode.mesh new file mode 100644 index 0000000..007d410 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-greenNode.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-pink.material b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-pink.material new file mode 100644 index 0000000..854e94d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-pink.material @@ -0,0 +1,15 @@ +material plane-pink-plane-material +{ + technique + { + pass + { + ambient 0.968628 0.196078 0.941177 + diffuse 0.968628 0.196078 0.941177 + specular 0 0 0 10 + emissive 0 0 0 + } + } +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-pink.scene b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-pink.scene new file mode 100644 index 0000000..c73fb65 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-pink.scene @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-pinkNode.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-pinkNode.mesh new file mode 100644 index 0000000..4b41410 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-pinkNode.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-red.material b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-red.material new file mode 100644 index 0000000..82fcf9c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-red.material @@ -0,0 +1,15 @@ +material plane-red-plane-material +{ + technique + { + pass + { + ambient 0.905882 0.196078 0.196078 + diffuse 0.905882 0.196078 0.196078 + specular 0 0 0 10 + emissive 0 0 0 + } + } +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-red.scene b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-red.scene new file mode 100644 index 0000000..d0af4a9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-red.scene @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-redNode.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-redNode.mesh new file mode 100644 index 0000000..575172f Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/common/scene-plane/plane-redNode.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/ogre.cfg b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/ogre.cfg new file mode 100644 index 0000000..1a2ca6d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/ogre.cfg @@ -0,0 +1,8 @@ +Render System=OpenGL Rendering Subsystem + +[OpenGL Rendering Subsystem] +FSAA=0 +Full Screen=No +RTT Preferred Mode=FBO +# Stereovision=Disabled +Video Mode=1024 x 768 diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/resources.cfg b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/resources.cfg new file mode 100644 index 0000000..5e16f4d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/resources.cfg @@ -0,0 +1,13 @@ +[General] +FileSystem=scene-arrow/ +FileSystem=scene-active-ball/ +FileSystem=scene-basic-arrow/ +FileSystem=scene-cross/ +FileSystem=scene-graz-cross/ +FileSystem=scene-get-ready-ball/ +FileSystem=scene-goal/ +FileSystem=scene-gymnasium/ +FileSystem=scene-passive-ball/ +FileSystem=scene-plane/ +FileSystem=../common/scene-plane +FileSystem=../common/GUI diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-active-ball/active-ball-texture.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-active-ball/active-ball-texture.png new file mode 100644 index 0000000..e8b6fd2 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-active-ball/active-ball-texture.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-active-ball/active-ball.material b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-active-ball/active-ball.material new file mode 100644 index 0000000..155900d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-active-ball/active-ball.material @@ -0,0 +1,20 @@ +material active-ball-active-ball-material +{ + technique + { + pass + { + ambient 1 1 1 + diffuse 1 1 1 + specular 0 0 0 90.1005 + emissive 0 0 0 + + texture_unit + { + texture active-ball-texture.png + } + } + } +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-active-ball/active-ball.scene b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-active-ball/active-ball.scene new file mode 100644 index 0000000..8a8f046 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-active-ball/active-ball.scene @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-active-ball/active-ballNode.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-active-ball/active-ballNode.mesh new file mode 100644 index 0000000..8517a30 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-active-ball/active-ballNode.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-arrow/arrow.material b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-arrow/arrow.material new file mode 100644 index 0000000..b0259de --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-arrow/arrow.material @@ -0,0 +1,15 @@ +material arrow-arrow +{ + technique + { + pass + { + ambient 0.988235 1 0.0666667 + diffuse 0.988235 1 0.0666667 + specular 0 0 0 10 + emissive 0 0 0 + } + } +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-arrow/arrow.scene b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-arrow/arrow.scene new file mode 100644 index 0000000..5919209 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-arrow/arrow.scene @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-arrow/arrowNode.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-arrow/arrowNode.mesh new file mode 100644 index 0000000..e1eaa57 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-arrow/arrowNode.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-basic-arrow/basic-arrow.material b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-basic-arrow/basic-arrow.material new file mode 100644 index 0000000..8126a37 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-basic-arrow/basic-arrow.material @@ -0,0 +1,15 @@ +material basic-arrow-basic-arrow-material +{ + technique + { + pass + { + ambient 1 0 0 + diffuse 1 0 0 + specular 0 0 0 10 + emissive 0 0 0 + } + } +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-basic-arrow/basic-arrow.scene b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-basic-arrow/basic-arrow.scene new file mode 100644 index 0000000..aa13f3d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-basic-arrow/basic-arrow.scene @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-basic-arrow/basic-arrowNode.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-basic-arrow/basic-arrowNode.mesh new file mode 100644 index 0000000..be93190 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-basic-arrow/basic-arrowNode.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-cross/cross.material b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-cross/cross.material new file mode 100644 index 0000000..7938563 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-cross/cross.material @@ -0,0 +1,15 @@ +material cross-cross-material +{ + technique + { + pass + { + ambient 0 0.75 0 + diffuse 0 0.75 0 + specular 0 0 0 10 + emissive 0 0 0 + } + } +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-cross/cross.scene b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-cross/cross.scene new file mode 100644 index 0000000..ebc8d21 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-cross/cross.scene @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-cross/crossNode.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-cross/crossNode.mesh new file mode 100644 index 0000000..a22c8e0 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-cross/crossNode.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-get-ready-ball/get-ready-ball-texture.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-get-ready-ball/get-ready-ball-texture.png new file mode 100644 index 0000000..5cca000 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-get-ready-ball/get-ready-ball-texture.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-get-ready-ball/get-ready-ball.material b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-get-ready-ball/get-ready-ball.material new file mode 100644 index 0000000..c68df95 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-get-ready-ball/get-ready-ball.material @@ -0,0 +1,20 @@ +material get-ready-ball-get-ready-ball-material +{ + technique + { + pass + { + ambient 1 1 1 + diffuse 1 1 1 + specular 0 0 0 90.1005 + emissive 0 0 0 + + texture_unit + { + texture get-ready-ball-texture.png + } + } + } +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-get-ready-ball/get-ready-ball.scene b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-get-ready-ball/get-ready-ball.scene new file mode 100644 index 0000000..b5d4e0f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-get-ready-ball/get-ready-ball.scene @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-get-ready-ball/get-ready-ballNode.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-get-ready-ball/get-ready-ballNode.mesh new file mode 100644 index 0000000..dbdb424 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-get-ready-ball/get-ready-ballNode.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-goal/goal-border.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-goal/goal-border.mesh new file mode 100644 index 0000000..b793eda Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-goal/goal-border.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-goal/goal-net.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-goal/goal-net.mesh new file mode 100644 index 0000000..c98ff83 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-goal/goal-net.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-goal/goal.material b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-goal/goal.material new file mode 100644 index 0000000..501b80a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-goal/goal.material @@ -0,0 +1,60 @@ +material goal-foregrou01 +{ + technique + { + pass + { + ambient 0 0 0 + diffuse 0 0 0 + specular 0 0 0 1 + emissive 0 0 0 + } + } +} + + +material goal-frontcol01 +{ + technique + { + pass + { + ambient 0.882353 0.882353 0.784314 + diffuse 0.882353 0.882353 0.784314 + specular 0 0 0 1 + emissive 0 0 0 + } + } +} + + +material goal-surface01 +{ + technique + { + pass + { + ambient 1 0 0 + diffuse 1 0 0 + specular 0 0 0 1 + emissive 0 0 0 + } + } +} + + +material goal-surface02 +{ + technique + { + pass + { + ambient 1 1 1 + diffuse 1 1 1 + specular 0 0 0 1 + emissive 0 0 0 + } + } +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-goal/goal.scene b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-goal/goal.scene new file mode 100644 index 0000000..2456b99 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-goal/goal.scene @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-goal/goalNode.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-goal/goalNode.mesh new file mode 100644 index 0000000..1e694e3 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-goal/goalNode.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/blue-bar.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/blue-bar.png new file mode 100644 index 0000000..9d6fe99 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/blue-bar.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/cross.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/cross.png new file mode 100644 index 0000000..224a193 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/cross.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/green-bar.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/green-bar.png new file mode 100644 index 0000000..2dcb17a Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/green-bar.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/left-arrow.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/left-arrow.png new file mode 100644 index 0000000..7c33033 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/left-arrow.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/red-bar.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/red-bar.png new file mode 100644 index 0000000..f266f32 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/red-bar.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/right-arrow.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/right-arrow.png new file mode 100644 index 0000000..170124a Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-graz-cross/right-arrow.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/door-01.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/door-01.mesh new file mode 100644 index 0000000..dee4ac7 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/door-01.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/door-02.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/door-02.mesh new file mode 100644 index 0000000..09990fd Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/door-02.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/door-03.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/door-03.mesh new file mode 100644 index 0000000..5c6726c Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/door-03.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/door-04.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/door-04.mesh new file mode 100644 index 0000000..a296886 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/door-04.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-bois2.jpg b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-bois2.jpg new file mode 100644 index 0000000..533916e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-bois2.jpg differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-briques6.jpg b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-briques6.jpg new file mode 100644 index 0000000..4018a0d Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-briques6.jpg differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-door2.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-door2.png new file mode 100644 index 0000000..b45cd25 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-door2.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-exitsignal.jpg b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-exitsignal.jpg new file mode 100644 index 0000000..da3a935 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-exitsignal.jpg differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-logo-irisa.jpg b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-logo-irisa.jpg new file mode 100644 index 0000000..cab0a25 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-logo-irisa.jpg differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-logo_bunraku-m2s.jpg b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-logo_bunraku-m2s.jpg new file mode 100644 index 0000000..c129b8a Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-logo_bunraku-m2s.jpg differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-metal.jpg b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-metal.jpg new file mode 100644 index 0000000..5541956 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-metal.jpg differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-olympic-blue.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-olympic-blue.png new file mode 100644 index 0000000..57b16cd Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-olympic-blue.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-olympic-gold.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-olympic-gold.png new file mode 100644 index 0000000..09d305a Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-olympic-gold.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-olympic-green.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-olympic-green.png new file mode 100644 index 0000000..3842a7e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-olympic-green.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-olympic-red.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-olympic-red.png new file mode 100644 index 0000000..7d4c99b Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-olympic-red.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-parquet.jpg b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-parquet.jpg new file mode 100644 index 0000000..ef1a89a Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-parquet.jpg differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-plafond.jpg b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-plafond.jpg new file mode 100644 index 0000000..ff162b9 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-plafond.jpg differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-publicity.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-publicity.mesh new file mode 100644 index 0000000..0b1b795 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-publicity.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-terrainf1.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-terrainf1.png new file mode 100644 index 0000000..5087f6e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-terrainf1.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-terrainf2.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-terrainf2.png new file mode 100644 index 0000000..45d7d97 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium-terrainf2.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium.material b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium.material new file mode 100644 index 0000000..3277ddc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium.material @@ -0,0 +1,395 @@ +material gymnasium-MaterialPoutre01 +{ + technique + { + pass + { + ambient 0.3 0.3 0.3 + diffuse 0.3 0.3 0.3 + specular 0 0 0 63.1129 + emissive 0.3 0.3 0.3 + + texture_unit + { + texture gymnasium-metal.jpg + } + } + } +} + + +material gymnasium-MaterialSponsor01 +{ + technique + { + pass + { + ambient 0.2 0.2 0.2 + diffuse 0.2 0.2 0.2 + specular 0 0 0 53.8082 + emissive 0.2 0.2 0.2 + } + } +} + + +material gymnasium-MaterialSponsorBunrakuM2S01 +{ + technique + { + pass + { + ambient 0.8 0.8 0.8 + diffuse 0.8 0.8 0.8 + specular 0 0 0 85.0548 + emissive 0.8 0.8 0.8 + + texture_unit + { + texture gymnasium-logo_bunraku-m2s.jpg + } + } + } +} + + +material gymnasium-MaterialSponsorIrisa01 +{ + technique + { + pass + { + ambient 0.8 0.8 0.8 + diffuse 0.8 0.8 0.8 + specular 0 0 0 85.0548 + emissive 0.8 0.8 0.8 + + texture_unit + { + texture gymnasium-logo-irisa.jpg + } + } + } +} + + +material gymnasium-surface02 +{ + technique + { + pass + { + ambient 0.8 0.8 0.8 + diffuse 0.8 0.8 0.8 + specular 0 0 0 90.1005 + emissive 0 0 0 + + texture_unit + { + texture gymnasium-olympic-blue.png + } + } + } +} + + +material gymnasium-surface03 +{ + technique + { + pass + { + ambient 0.8 0.8 0.8 + diffuse 0.8 0.8 0.8 + specular 0 0 0 90.1005 + emissive 0 0 0 + + texture_unit + { + texture gymnasium-olympic-gold.png + } + } + } +} + + +material gymnasium-surface04 +{ + technique + { + pass + { + ambient 0.8 0.8 0.8 + diffuse 0.8 0.8 0.8 + specular 0 0 0 90.1005 + emissive 0 0 0 + + texture_unit + { + texture gymnasium-olympic-red.png + } + } + } +} + + +material gymnasium-surface05 +{ + technique + { + pass + { + ambient 0.8 0.8 0.8 + diffuse 0.8 0.8 0.8 + specular 0 0 0 90.1005 + emissive 0 0 0 + + texture_unit + { + texture gymnasium-olympic-green.png + } + } + } +} + + +material gymnasium-surface06 +{ + technique + { + pass + { + ambient 0.8 0.8 0.8 + diffuse 0.8 0.8 0.8 + specular 0 0 0 74.6972 + emissive 0 0 0 + + texture_unit + { + texture gymnasium-briques6.jpg + } + } + } +} + + +material gymnasium-surface07 +{ + technique + { + pass + { + ambient 0.8 0.8 0.8 + diffuse 0.8 0.8 0.8 + specular 0 0 0 90.1005 + emissive 0 0 0 + + texture_unit + { + texture gymnasium-door2.png + } + } + } +} + + +material gymnasium-surface08 +{ + technique + { + pass + { + ambient 0.8 0.8 0.8 + diffuse 0.8 0.8 0.8 + specular 0 0 0 90.1005 + emissive 0 0 0 + + texture_unit + { + texture gymnasium-exitsignal.jpg + } + } + } +} + + +material gymnasium-surface09 +{ + technique + { + pass + { + ambient 1 1 1 + diffuse 1 1 1 + specular 0.135866 0.135866 0.135866 1 + emissive 0 0 0 + + texture_unit + { + texture gymnasium-plafond.jpg + } + } + } +} + + +material gymnasium-surface10 +{ + technique + { + pass + { + ambient 0.7529 0.7529 0.7529 + diffuse 0.7529 0.7529 0.7529 + specular 0.566858 0.566858 0.566858 53.8082 + emissive 0 0 0 + + texture_unit + { + texture gymnasium-parquet.jpg + } + } + } +} + + +material gymnasium-surface11 +{ + technique + { + pass + { + ambient 0.7529 0.7529 0.7529 + diffuse 0.7529 0.7529 0.7529 + specular 0.566858 0.566858 0.566858 53.8082 + emissive 0 0 0 + + texture_unit + { + texture gymnasium-terrainf1.png + } + } + } +} + + +material gymnasium-surface12 +{ + technique + { + pass + { + ambient 0.7529 0.7529 0.7529 + diffuse 0.7529 0.7529 0.7529 + specular 0.566858 0.566858 0.566858 53.8082 + emissive 0 0 0 + + texture_unit + { + texture gymnasium-terrainf2.png + } + } + } +} + + +material gymnasium-surface13 +{ + technique + { + pass + { + ambient 0.7 0.7 0.7 + diffuse 0.7 0.7 0.7 + specular 0.49 0.49 0.49 82.0251 + emissive 0 0 0 + + texture_unit + { + texture gymnasium-bois2.jpg + } + } + } +} + + +material gymnasium-surface14 +{ + technique + { + pass + { + ambient 0.8 0.8 0.8 + diffuse 0.8 0.8 0.8 + specular 0 0 0 90.1005 + emissive 0 0 0 + + texture_unit + { + texture gymnasium-olympic-red.png + } + } + } +} + + +material gymnasium-surface15 +{ + technique + { + pass + { + ambient 0.8 0.8 0.8 + diffuse 0.8 0.8 0.8 + specular 0 0 0 90.1005 + emissive 0 0 0 + + texture_unit + { + texture gymnasium-olympic-green.png + } + } + } +} + + +material gymnasium-surface16 +{ + technique + { + pass + { + ambient 0.8 0.8 0.8 + diffuse 0.8 0.8 0.8 + specular 0 0 0 90.1005 + emissive 0 0 0 + + texture_unit + { + texture gymnasium-olympic-blue.png + } + } + } +} + + +material gymnasium-surface17 +{ + technique + { + pass + { + ambient 0.8 0.8 0.8 + diffuse 0.8 0.8 0.8 + specular 0 0 0 90.1005 + emissive 0 0 0 + + texture_unit + { + texture gymnasium-olympic-gold.png + } + } + } +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium.max b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium.max new file mode 100644 index 0000000..cd41a5e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium.max differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium.scene b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium.scene new file mode 100644 index 0000000..f8378af --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasium.scene @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasiumNode.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasiumNode.mesh new file mode 100644 index 0000000..d0dd998 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/gymnasiumNode.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-01.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-01.mesh new file mode 100644 index 0000000..ad94c14 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-01.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-02.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-02.mesh new file mode 100644 index 0000000..19b1fe1 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-02.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-03.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-03.mesh new file mode 100644 index 0000000..31e68ad Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-03.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-04.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-04.mesh new file mode 100644 index 0000000..73f3b70 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-04.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-05.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-05.mesh new file mode 100644 index 0000000..5c71808 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-05.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-06.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-06.mesh new file mode 100644 index 0000000..78420a4 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-06.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-07.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-07.mesh new file mode 100644 index 0000000..3ec3399 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/publicity-07.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-01.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-01.mesh new file mode 100644 index 0000000..cd3d064 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-01.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-02.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-02.mesh new file mode 100644 index 0000000..e8068a4 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-02.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-03.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-03.mesh new file mode 100644 index 0000000..7abfbb3 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-03.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-04.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-04.mesh new file mode 100644 index 0000000..ce691cc Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-04.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-05.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-05.mesh new file mode 100644 index 0000000..acc499a Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-05.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-06.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-06.mesh new file mode 100644 index 0000000..39ed68b Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-06.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-07.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-07.mesh new file mode 100644 index 0000000..04db834 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/structure-07.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/table.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/table.mesh new file mode 100644 index 0000000..5736699 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/table.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-01.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-01.mesh new file mode 100644 index 0000000..c3ce977 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-01.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-02.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-02.mesh new file mode 100644 index 0000000..c73569d Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-02.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-03.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-03.mesh new file mode 100644 index 0000000..41c7afb Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-03.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-04.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-04.mesh new file mode 100644 index 0000000..1e3774b Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-04.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-06.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-06.mesh new file mode 100644 index 0000000..328f78d Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-06.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-07.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-07.mesh new file mode 100644 index 0000000..4a83f3f Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-07.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-08.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-08.mesh new file mode 100644 index 0000000..4cf83d7 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-08.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-09.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-09.mesh new file mode 100644 index 0000000..ca28c89 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-09.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-10.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-10.mesh new file mode 100644 index 0000000..7fc0eb6 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-10.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-11.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-11.mesh new file mode 100644 index 0000000..0a290d7 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-11.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-12.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-12.mesh new file mode 100644 index 0000000..a1f63b4 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-12.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-13.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-13.mesh new file mode 100644 index 0000000..09e2cfa Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-gymnasium/wall-publicity-13.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-passive-ball/passive-ball-texture.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-passive-ball/passive-ball-texture.png new file mode 100644 index 0000000..48a3959 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-passive-ball/passive-ball-texture.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-passive-ball/passive-ball.material b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-passive-ball/passive-ball.material new file mode 100644 index 0000000..e8263e6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-passive-ball/passive-ball.material @@ -0,0 +1,20 @@ +material passive-ball-surface01 +{ + technique + { + pass + { + ambient 1 1 1 + diffuse 1 1 1 + specular 0 0 0 90.1005 + emissive 0 0 0 + + texture_unit + { + texture passive-ball-texture.png + } + } + } +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-passive-ball/passive-ball.scene b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-passive-ball/passive-ball.scene new file mode 100644 index 0000000..06b15d3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-passive-ball/passive-ball.scene @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-passive-ball/passive-ballNode.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-passive-ball/passive-ballNode.mesh new file mode 100644 index 0000000..4186e82 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/handball/scene-passive-ball/passive-ballNode.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/bouge-les-pieds.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/bouge-les-pieds.png new file mode 100644 index 0000000..fb70a1e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/bouge-les-pieds.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/bouge.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/bouge.png new file mode 100644 index 0000000..22114b1 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/bouge.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/calibration.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/calibration.png new file mode 100644 index 0000000..c3b2ca7 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/calibration.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/fin-de-partie.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/fin-de-partie.png new file mode 100644 index 0000000..ae9025f Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/fin-de-partie.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/game-over.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/game-over.png new file mode 100644 index 0000000..3969030 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/game-over.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/move-your-feet.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/move-your-feet.png new file mode 100644 index 0000000..9242d52 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/move-your-feet.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/move.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/move.png new file mode 100644 index 0000000..4f760e5 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/move.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/ogre.cfg b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/ogre.cfg new file mode 100644 index 0000000..83d2353 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/ogre.cfg @@ -0,0 +1,8 @@ +Render System=OpenGL Rendering Subsystem + +[OpenGL Rendering Subsystem] +FSAA=0 +Full Screen=No +RTT Preferred Mode=FBO +# Stereovision=Disabled +Video Mode=800 x 600 diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/pret.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/pret.png new file mode 100644 index 0000000..2241482 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/pret.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/ready.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/ready.png new file mode 100644 index 0000000..ce57275 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/ready.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/resources.cfg b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/resources.cfg new file mode 100644 index 0000000..2913ca9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/resources.cfg @@ -0,0 +1,8 @@ +[General] +FileSystem=. +FileSystem=scene-hangar/ +FileSystem=scene-spaceship/ +FileSystem=scene-misc/ +FileSystem=../common/scene-plane/ +FileSystem=../common/GUI/ + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/croisertexturecomplete.jpg b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/croisertexturecomplete.jpg new file mode 100644 index 0000000..7a70e71 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/croisertexturecomplete.jpg differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/hangar.material b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/hangar.material new file mode 100644 index 0000000..d2ea962 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/hangar.material @@ -0,0 +1,72 @@ +material hangar-01_-_Default +{ + technique + { + pass + { + ambient 0.588235 0.588235 0.588235 + diffuse 0.588235 0.588235 0.588235 + specular 0 0 0 10 + emissive 0 0 0 + + texture_unit + { + texture stars.jpg + } + } + } +} + +material hangar-03_-_Default +{ + technique + { + pass + { + ambient 0.588235 0.588235 0.588235 + diffuse 0.588235 0.588235 0.588235 + specular 0 0 0 10 + emissive 0 0 0 + + texture_unit + { + texture steelplt.jpg + } + } + } +} + +material hangar-07_-_Default +{ + technique + { + pass + { + ambient 0.243137 0.243137 0.34902 + diffuse 0.243137 0.243137 0.34902 + specular 0.234 0.234 0.234 10 + emissive 0 0 0 + } + } +} + +material hangar-orig_08_-_Default +{ + technique + { + pass + { + ambient 0.588235 0.588235 0.588235 + diffuse 0.588235 0.588235 0.588235 + specular 0 0 0 10 + emissive 0 0 0 + + texture_unit + { + texture croisertexturecomplete.jpg + } + } + } +} + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/hangar.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/hangar.mesh new file mode 100644 index 0000000..78b2e01 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/hangar.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/hangar.scene b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/hangar.scene new file mode 100644 index 0000000..61933ee --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/hangar.scene @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/stars.jpg b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/stars.jpg new file mode 100644 index 0000000..3e540a1 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/stars.jpg differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/steelplt.jpg b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/steelplt.jpg new file mode 100644 index 0000000..44902d3 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-hangar/steelplt.jpg differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/barrel.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/barrel.mesh new file mode 100644 index 0000000..511dbbe Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/barrel.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/flare.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/flare.png new file mode 100644 index 0000000..9f8a2a8 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/flare.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/misc.material b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/misc.material new file mode 100644 index 0000000..5ca4382 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/misc.material @@ -0,0 +1,54 @@ +material RustyBarrel +{ + technique + { + pass + { + ambient 0.5 0.5 0.5 1.0 + diffuse 1.0 1.0 1.0 1.0 + specular 0.0 0.0 0.0 1.0 12.5 + emissive 0.0 0.0 0.0 1.0 + texture_unit + { + texture rusty-barrel.png + filtering trilinear + } + } + } +} + +material ringflare +{ + technique + { + pass + { + lighting off + depth_write off + scene_blend add + + texture_unit + { + texture ring_flare.png + } + } + } +} + +material lensflare +{ + technique + { + pass + { + lighting off + depth_write off + scene_blend add + + texture_unit + { + texture flare.png + } + } + } +} \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/ring_flare.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/ring_flare.png new file mode 100644 index 0000000..869a5b5 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/ring_flare.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/rusty-barrel.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/rusty-barrel.png new file mode 100644 index 0000000..8448a8e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/rusty-barrel.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/spark.particle b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/spark.particle new file mode 100644 index 0000000..b0d507b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-misc/spark.particle @@ -0,0 +1,49 @@ + +particle_system spaceship/spark +{ + quota 2000 + material ringflare + particle_width 0.05 + particle_height 2 + cull_each false + renderer billboard + billboard_type oriented_self + sorted true + + emitter Point + { + angle 30.0 + colour 1 1 1 1 + colour_range_start 1 0.8 0.8 1 + colour_range_end 1 1 1 1 + direction 0.52646 -0.848185 0.5 + emission_rate 433.2 + position 0 0 0 + velocity 7.317 + velocity_min 5.317 + velocity_max 11.84 + time_to_live 7.83 + time_to_live_min 5.83 + time_to_live_max 10.83 + duration 0.4545 + duration_min 0.4545 + duration_max 2.539 + repeat_delay 0.01 + repeat_delay_min 0.01 + repeat_delay_max 2 + } + + affector LinearForce + { + force_vector -2.94504 -10 2.90231 + force_application add + } + + affector ColourFader + { + red -0.2967 + green -0.2768 + blue -0.7465 + alpha 0 + } +} diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-spaceship/vaisseau.material b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-spaceship/vaisseau.material new file mode 100755 index 0000000..0df76fb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-spaceship/vaisseau.material @@ -0,0 +1,46 @@ +// Vaisseau genrated by blender2ogre 0.5.8 + +material phong_vaisseau +{ + receive_shadows on + + technique + { + pass + { + //ambient 0.800000011920929 0.800000011920929 0.800000011920929 1.0 + ambient 1.0 1.0 1.0 1.0 + // diffuse 0.6400000190734865 0.6400000190734865 0.6400000190734865 1.0 + diffuse 1.0 1.0 1.0 1.0 + //specular 0.5 0.5 0.5 1.0 12.5 + //emissive 0.0 0.0 0.0 1.0 + + //alpha_to_coverage off + //colour_write on + //cull_hardware clockwise + //depth_check on + //depth_func less_equal + //depth_write on + illumination_stage ambient + //light_clip_planes off + //light_scissor off + //lighting on + //normalise_normals off + //polygon_mode solid + //scene_blend one zero + //scene_blend add + //scene_blend_op add + //shading gouraud + //transparent_sorting on + + texture_unit + { + texture vaisseau_diffuse.jpg + //tex_address_mode wrap + //scale 1.0 1.0 + //tex_coord_set 0 + //colour_op modulate + } + } + } +} diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-spaceship/vaisseau.mesh b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-spaceship/vaisseau.mesh new file mode 100755 index 0000000..887aef6 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-spaceship/vaisseau.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-spaceship/vaisseau.mesh.xml b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-spaceship/vaisseau.mesh.xml new file mode 100755 index 0000000..7dbec24 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-spaceship/vaisseau.mesh.xml @@ -0,0 +1,4150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-spaceship/vaisseau.scene b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-spaceship/vaisseau.scene new file mode 100755 index 0000000..f0450fb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-spaceship/vaisseau.scene @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-spaceship/vaisseau_diffuse.jpg b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-spaceship/vaisseau_diffuse.jpg new file mode 100755 index 0000000..756dd3f Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/scene-spaceship/vaisseau_diffuse.jpg differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/score.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/score.png new file mode 100644 index 0000000..138e9ab Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/score.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/statistiques.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/statistiques.png new file mode 100644 index 0000000..bf85ba0 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/statistiques.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/stop-move.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/stop-move.png new file mode 100644 index 0000000..04df64d Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/stop-move.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/stop.png b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/stop.png new file mode 100644 index 0000000..c2ac85b Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/share/spaceship/stop.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/signals/spaceship-freetime.gdf b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/signals/spaceship-freetime.gdf new file mode 100644 index 0000000..ed1fc00 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/signals/spaceship-freetime.gdf differ diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/HandballBCI/ovavrdCHandballBCI.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/HandballBCI/ovavrdCHandballBCI.cpp new file mode 100644 index 0000000..143ccb5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/HandballBCI/ovavrdCHandballBCI.cpp @@ -0,0 +1,716 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include +#include "ovavrdCHandballBCI.h" +#include + +template +T Abs(const T& t) { return t < 0 ? -t : t; } + +template +T Min(const T& t1, const T& t2) { return t1 < t2 ? t1 : t2; } + +template +T Max(const T& t1, const T& t2) { return t1 < t2 ? t2 : t1; } + +template +T Crop(const T& t1, const T& t, const T& t2) { return Min(Max(t1, t), t2); } + +namespace VRDemos { + +//static const float g_fGrowScoreingSpeed = 0.1f; +static const float VISCOSITY = 0.003F; +static const double F_EPSILON = 1E-5; +static const size_t HISTORY_SIZE = 5; +static const float GOAL_DISTANCE = 6.0F; + +CHandballBCI::CHandballBCI() : COgreVRApplication(OpenViBE::Directories::getDataDir() + "/applications/vr-demo/handball") +{ + // scores + m_goalScore = 0; + m_leftScore = 0; + m_rightScore = 0; + m_nTrialRight = 0; + m_nTrialLeft = 0; + // the classification score + m_classificationScore = 0; + + // The current and previous phases + m_phase = Phase_Rest; + m_lastPhase = Phase_Rest; + + // Feedback from analog VRPN server + m_feedback = 0; + m_lastFeedback = 0; + m_maxFeedback = 0; + m_minFeedback = 0; + + m_mark = Mark_None; + m_lastMark = Mark_None; + m_goalMarkedAtThisPhase = false; + m_showCross = false; + m_showClue = false; + m_showFeedback = false; + + m_ballSpeed = 0; + m_ballPosition = 0; + m_lastBallPosition = 0; + m_ballOrientation = 0; +} + +bool CHandballBCI::initialise() +{ + // taken from gymnasium.scene + transformations from demo.omk + + //----------- LIGHTS -------------// + m_sceneManager->setAmbientLight(Ogre::ColourValue(0.4F, 0.4F, 0.4F)); + m_sceneManager->setShadowTechnique(Ogre::SHADOWTYPE_TEXTURE_MODULATIVE); + + Ogre::Light* light1 = m_sceneManager->createLight("Light1"); + //SceneNode *light1Node = m_sceneManager->getRootSceneNode()->createChildSceneNode( "Light1Node" ); + light1->setPosition(8, 6, -5); + light1->setSpecularColour(1, 1, 1); + light1->setDiffuseColour(1, 1, 1); + + //----------- CAMERA -------------// + m_camera->setNearClipDistance(0.01F); + m_camera->setFarClipDistance(2000.0F); + m_camera->setFOVy(Ogre::Radian(Ogre::Degree(100))); + m_camera->setProjectionType(Ogre::PT_PERSPECTIVE); + + m_cameraNode->setPosition(5.5F, 0.9F, 0.F); + m_cameraNode->yaw(Ogre::Radian(Ogre::Math::PI / 2.F)); + + this->initSceneGymnasium(); + this->initSceneAds(); + this->initSceneGoals(); + this->initSceneCrossArrowAndFeedback(); + this->initSceneBalls(); + + return true; +} + + +bool CHandballBCI::process(double /*timeSinceLastProcess*/) +{ + //------------ VRPN --------------// + // The button VRPN server must use 6 switches, inputs from the stim scenario (lua): + /* + + [ GET READY | | ACTIVE | REST |~| MARK LEFT | MARK RIGHT | NO INSTRUCTION ] + + */ + while (!m_vrpnPeripheral->m_Buttons.empty()) + { + std::pair& vrpnButtonState = m_vrpnPeripheral->m_Buttons.front(); + + if (vrpnButtonState.second) + { + switch (vrpnButtonState.first) + { + case 0: + m_phase = Phase_GetReady; + m_showCross = true; + m_showClue = false; + m_showFeedback = false; + break; + + case 1: + m_phase = Phase_Active; + m_showCross = true; + m_showClue = false; + m_showFeedback = true; + break; + + case 2: + m_phase = Phase_Rest; + m_showCross = false; + m_showClue = false; + m_showFeedback = false; + break; + //------------Instructions --------------- + case 3: + m_mark = Mark_Left; + m_showClue = true; + m_nTrialLeft++; + break; + + case 4: + m_mark = Mark_Right; + m_showClue = true; + m_nTrialRight++; + break; + + case 5: + m_mark = Mark_None; + break; + + default: + break; + } + } + + m_vrpnPeripheral->m_Buttons.pop_front(); + } + + if (!m_vrpnPeripheral->m_Analogs.empty()) + { + std::list& vrpnAnalogState = m_vrpnPeripheral->m_Analogs.front(); + + //we take the last value from the server. + // The input is a probability [0,1] for the left class, map it to [-1,1] to indicate [left,right] range + double analog = (*vrpnAnalogState.begin()); + analog = 2.0 * (-analog) + 1.0; + + // std::cout << "list size" << vrpnAnalogState.size() << " head " << analog << "\n"; + + //we updtae the max and min values + // A. VLG : we should compute the min/max only in the ACTIVE phase + // but if so, the first feedback value is infinite, resulting in a strange ball placement in the first active phase. + if (m_phase == Phase_Active || m_phase == Phase_GetReady) + { + if (analog > m_maxFeedback) { m_maxFeedback = analog; } + if (analog < m_minFeedback) { m_minFeedback = analog; } + } + + //maximum of the absolute values + + const double absoluteMinMax = Max(Abs(m_maxFeedback), Abs(m_minFeedback)); + + //we update the history, keeping only the last HISTORY_SIZE values + m_analogHistories.push_back(analog); + if (m_analogHistories.size() > HISTORY_SIZE) { m_analogHistories.pop_front(); } + + // we compute the mean value of the analog history + double analogMean = 0; + for (auto i = m_analogHistories.begin(); i != m_analogHistories.end(); ++i) { analogMean += *i; } + analogMean /= m_analogHistories.size(); + + // and we divide it by the absolute max value, to get a value between 0 and 1 + analogMean /= double(absoluteMinMax != 0.0 ? absoluteMinMax : F_EPSILON); + + // we update the feedback value that will be used to move the ball + m_lastFeedback = m_feedback; + m_feedback = analogMean; + + m_vrpnPeripheral->m_Analogs.pop_front(); + } + + + //--------------------------// + Ogre::SceneNode* crossNode = m_sceneManager->getSceneNode("CrossNode"); + Ogre::SceneNode* leftArrowNode = m_sceneManager->getSceneNode("LeftArrowNode"); + Ogre::SceneNode* rightArrowNode = m_sceneManager->getSceneNode("RightArrowNode"); + Ogre::SceneNode* feedbackNode = m_sceneManager->getSceneNode("FeedbackNode"); + Ogre::SceneNode* activeBallPivot = m_sceneManager->getSceneNode("ActiveBallPivot"); + Ogre::SceneNode* passiveBallPivot = m_sceneManager->getSceneNode("PassiveBallPivot"); + Ogre::SceneNode* getReadyBallPivot = m_sceneManager->getSceneNode("GetReadyBallPivot"); + Ogre::SceneNode* ballCommonPivot = m_sceneManager->getSceneNode("BallCommonNode"); + + // update for each phase change + if (m_phase != m_lastPhase) + { + switch (m_phase) + { + case Phase_Rest: + std::cout << "### PHASE REST ###" << std::endl; + if (m_lastMark == Mark_Left && m_ballPosition > 0) { m_leftScore++; } + if (m_lastMark == Mark_Right && m_ballPosition < 0) { m_rightScore++; } + + std::cout << "- Current Score: " << std::endl; + std::cout << "--- GOAL: " << m_goalScore << "/" << (m_nTrialRight + m_nTrialLeft) << std::endl; + std::cout << "--- LEFT: " << m_leftScore << "/" << m_nTrialLeft << std::endl; + std::cout << "--- RIGHT: " << m_rightScore << "/" << m_nTrialRight << std::endl; + std::cout << "--- CLASSIFICATION: " << m_classificationScore << std::endl; + //std::cout << "### ScOrE StAtUs = GoAl:" << m_goalScore << " SiDe:" << m_iSideScore << " ClAsSiFiCaTiOn:" << m_classificationScore << " LoOpCoUnT: " << << "\n"; + + crossNode->setVisible(false); + leftArrowNode->setVisible(false); + rightArrowNode->setVisible(false); + feedbackNode->setVisible(false); + + getReadyBallPivot->setVisible(false); + passiveBallPivot->setVisible(true); + activeBallPivot->setVisible(false); + + m_ballPosition = 0; + m_ballOrientation = 0; + m_ballSpeed = 0; + ballCommonPivot->setPosition(0, ballCommonPivot->getPosition().y, m_ballPosition); + + break; + case Phase_GetReady: + std::cout << "### PHASE GET READY ###" << std::endl; + crossNode->setVisible(true, false); + leftArrowNode->setVisible(false); + rightArrowNode->setVisible(false); + feedbackNode->setVisible(false); + + getReadyBallPivot->setVisible(true); + passiveBallPivot->setVisible(false); + activeBallPivot->setVisible(false); + + m_goalMarkedAtThisPhase = false; + + break; + + + case Phase_Active: + std::cout << "### PHASE ACTIVE ###" << std::endl; + crossNode->setVisible(true); + leftArrowNode->setVisible(false); + rightArrowNode->setVisible(false); + feedbackNode->setVisible(true); + + getReadyBallPivot->setVisible(false); + passiveBallPivot->setVisible(false); + activeBallPivot->setVisible(true); + + /*std::cout<<"Current analog history : "; + for (auto ii=m_analogHistories.begin(); ii!=m_analogHistories.end(); ++ii) + { + std::cout << (*ii) << " "; + } + std::cout << std::endl;*/ + + break; + default: break; + } + } + + + // update for each phase (loop) + switch (m_phase) + { + case Phase_Rest: break; + + case Phase_GetReady: + leftArrowNode->setVisible(m_showClue ? (m_mark == Mark_Left) : false); + rightArrowNode->setVisible(m_showClue ? (m_mark == Mark_Right) : false); + break; + + case Phase_Active: + m_ballSpeed = -float(m_feedback * 0.1); + if (m_mark == Mark_Left && m_ballPosition >= GOAL_DISTANCE && !m_goalMarkedAtThisPhase) + { + m_goalScore++; + m_goalMarkedAtThisPhase = true; + } + if (m_mark == Mark_Right && m_ballPosition <= -GOAL_DISTANCE && !m_goalMarkedAtThisPhase) + { + m_goalScore++; + m_goalMarkedAtThisPhase = true; + } + if (m_mark == Mark_Left && m_feedback < 0) { m_classificationScore++; } + if (m_mark == Mark_Right && m_feedback > 0) { m_classificationScore++; } + + break; + default: break; + } + + m_ballOrientation += m_ballSpeed; + m_ballPosition += m_ballSpeed; + m_ballPosition = Crop(-GOAL_DISTANCE, m_ballPosition, GOAL_DISTANCE); + m_ballSpeed *= (1.F - VISCOSITY); + + double feedbackScale = m_feedback; + if (feedbackScale <= 0 && feedbackScale > -F_EPSILON) { feedbackScale = -F_EPSILON; } + if (feedbackScale >= 0 && feedbackScale < F_EPSILON) { feedbackScale = F_EPSILON; } + + // ------------------------------------------------------------------------------- + // Object displacement stuffs + //BALL FEEDBACK + if (m_phase == Phase_Active) + { + ballCommonPivot->setPosition(0, ballCommonPivot->getPosition().y, m_ballPosition); + //ballCommonPivot->setOrientation(1,m_ballOrientation*100.f, 0,0 ); // *4 + //activeBallPivot->pitch(Radian(m_ballOrientation/20.),Node::TS_PARENT); + + Ogre::Entity* passiveBallEntity = m_sceneManager->getEntity("passive-ball"); + const float alpha = (m_ballPosition - m_lastBallPosition) / passiveBallEntity->getBoundingRadius(); + + /* + float div = Math::Floor((m_ballOrientation * 4) / (2 * Math::PI)); + printf("m_ballOrientation=%f\n",(m_ballOrientation*4)); + printf("div=%i\n",div); + float final = (m_ballOrientation*4)-(div*2*Math::PI); + printf("final=%f\n",final);*/ + + activeBallPivot->pitch(Ogre::Radian(alpha), Ogre::Node::TS_PARENT); + //activeBallPivot->setOrientation(1,(m_ballOrientation*4)/*-(div*2*Math::PI)*/,0,0 ); // *4 + //activeBallPivot->setOrientation(1,m_ballOrientation*4,0,0); + } + + // GRAZ FEEDBACK + if (m_phase == Phase_Active) + { + feedbackNode->setVisible(true); + feedbackNode->setScale(0.25F, 0.25F, Ogre::Real(Abs(feedbackScale))); + feedbackNode->setPosition(3.499F, 0.20F, -Ogre::Real(feedbackScale / 2.)); + } + else { feedbackNode->setVisible(false); } + + + // ------------------------------------------------------------------------------- + // End of computation + + m_lastFeedback = m_feedback; + m_lastBallPosition = m_ballPosition; + m_lastPhase = m_phase; + m_lastMark = m_mark; + + return m_bContinue; +} + + +void CHandballBCI::initSceneGymnasium() const +{ + //----------- GYMNASIUM -------------// + Ogre::SceneNode* gymnasiumPivot = m_sceneManager->getRootSceneNode()->createChildSceneNode("GymnasiumPivot"); + Ogre::SceneNode* gymnasium = gymnasiumPivot->createChildSceneNode("Gymnasium"); + Ogre::SceneNode* gymnasiumNode = gymnasium->createChildSceneNode("GymnasiumNode"); + + // GYMNASIUM + Ogre::Entity* gymnasiumNodeEntity = m_sceneManager->createEntity("GymnasiumNodeEntity", "gymnasiumNode.mesh"); + gymnasiumNodeEntity->setCastShadows(false); + gymnasiumNodeEntity->getSubEntity(0)->setMaterialName("gymnasium-surface06"); + gymnasiumNodeEntity->getSubEntity(1)->setMaterialName("gymnasium-surface10"); + gymnasiumNodeEntity->getSubEntity(2)->setMaterialName("gymnasium-surface09"); + gymnasiumNode->attachObject(gymnasiumNodeEntity); + + // GYM PUB + Ogre::Entity* gymnasiumPublicityEntity = m_sceneManager->createEntity("GymnasiumPublicity", "gymnasium-publicity.mesh"); + gymnasiumPublicityEntity->setCastShadows(false); + gymnasiumPublicityEntity->getSubEntity(0)->setMaterialName("gymnasium-surface11"); + gymnasiumPublicityEntity->getSubEntity(1)->setMaterialName("gymnasium-surface12"); + gymnasiumNode->attachObject(gymnasiumPublicityEntity); + + //DOORS + Ogre::SceneNode* door01Node = gymnasiumNode->createChildSceneNode("door-01-node"); + door01Node->setPosition(26, 1, -24); + door01Node->setOrientation(0.923879F, 0, -0.382684F, 0); + Ogre::Entity* door01Entity = m_sceneManager->createEntity("door-01-entity", "door-01.mesh"); + door01Entity->setCastShadows(false); + door01Entity->getSubEntity(0)->setMaterialName("gymnasium-surface07"); + door01Entity->getSubEntity(1)->setMaterialName("gymnasium-surface08"); + door01Node->attachObject(door01Entity); + + Ogre::SceneNode* door02Node = gymnasiumNode->createChildSceneNode("door-02-node"); + door02Node->setPosition(26, 1, 4); + door02Node->setOrientation(0.923879F, 0, 0.382684F, 0); + Ogre::Entity* door02Entity = m_sceneManager->createEntity("door-02-entity", "door-02.mesh"); + door02Entity->setCastShadows(false); + door02Entity->getSubEntity(0)->setMaterialName("gymnasium-surface07"); + door02Entity->getSubEntity(1)->setMaterialName("gymnasium-surface08"); + door02Node->attachObject(door02Entity); + + Ogre::SceneNode* door03Node = gymnasiumNode->createChildSceneNode("door-03-node"); + door03Node->setPosition(-26, 2.5, 4); + door03Node->setOrientation(0.923879F, 0, -0.382684F, 0); + Ogre::Entity* door03Entity = m_sceneManager->createEntity("door-03-entity", "door-03.mesh"); + door03Entity->setCastShadows(false); + door03Entity->getSubEntity(0)->setMaterialName("gymnasium-surface08"); + door03Entity->getSubEntity(1)->setMaterialName("gymnasium-surface07"); + door03Node->attachObject(door03Entity); + + Ogre::SceneNode* door04Node = gymnasiumNode->createChildSceneNode("door-04-node"); + door04Node->setPosition(-26, 1, -24); + door04Node->setOrientation(0.923879F, 0, 0.382684F, 0); + Ogre::Entity* door04Entity = m_sceneManager->createEntity("door-04-entity", "door-04.mesh"); + door04Entity->setCastShadows(false); + door04Entity->getSubEntity(0)->setMaterialName("gymnasium-surface07"); + door04Entity->getSubEntity(1)->setMaterialName("gymnasium-surface08"); + door04Node->attachObject(door04Entity); + + //TABLE + Ogre::SceneNode* tableNode = gymnasiumNode->createChildSceneNode("Table"); + tableNode->setPosition(-2.475F, 0.36F, -21.5F); + tableNode->setOrientation(0.707105F, 0.F, 0.707108F, 0.F); + Ogre::Entity* tableEntity = m_sceneManager->createEntity("Table", "table.mesh"); + tableEntity->setCastShadows(false); + tableEntity->getSubEntity(0)->setMaterialName("gymnasium-MaterialSponsor01"); + tableEntity->getSubEntity(1)->setMaterialName("gymnasium-MaterialSponsorBunrakuM2S01"); + tableEntity->getSubEntity(2)->setMaterialName("gymnasium-surface13"); + tableNode->attachObject(tableEntity); + + + //TRANSFORM FROM demo.omk + gymnasiumPivot->translate(-10, 0, 0); + gymnasiumPivot->rotate(Ogre::Vector3::UNIT_Y, Ogre::Radian(-1.570796327F)); +} + +void CHandballBCI::initSceneAds() const +{ + Ogre::SceneNode* gymnasiumNode = m_sceneManager->getSceneNode("GymnasiumNode"); + // WALL Ads + Ogre::Entity* wallPublicity01Entity = m_sceneManager->createEntity("WallPublicity01", "wall-publicity-01.mesh"); + wallPublicity01Entity->setCastShadows(false); + wallPublicity01Entity->getSubEntity(0)->setMaterialName("gymnasium-surface14"); + gymnasiumNode->attachObject(wallPublicity01Entity); + + Ogre::Entity* wallPublicity02Entity = m_sceneManager->createEntity("WallPublicity02", "wall-publicity-02.mesh"); + wallPublicity02Entity->setCastShadows(false); + wallPublicity02Entity->getSubEntity(0)->setMaterialName("gymnasium-surface15"); + gymnasiumNode->attachObject(wallPublicity02Entity); + + Ogre::Entity* wallPublicity03Entity = m_sceneManager->createEntity("WallPublicity03", "wall-publicity-03.mesh"); + wallPublicity03Entity->setCastShadows(false); + wallPublicity03Entity->getSubEntity(0)->setMaterialName("gymnasium-surface02"); + gymnasiumNode->attachObject(wallPublicity03Entity); + + Ogre::Entity* wallPublicity04Entity = m_sceneManager->createEntity("WallPublicity04", "wall-publicity-04.mesh"); + wallPublicity04Entity->setCastShadows(false); + wallPublicity04Entity->getSubEntity(0)->setMaterialName("gymnasium-surface03"); + gymnasiumNode->attachObject(wallPublicity04Entity); + + Ogre::Entity* wallPublicity06Entity = m_sceneManager->createEntity("WallPublicity06", "wall-publicity-06.mesh"); + wallPublicity06Entity->setCastShadows(false); + wallPublicity06Entity->getSubEntity(0)->setMaterialName("gymnasium-surface04"); + gymnasiumNode->attachObject(wallPublicity06Entity); + + Ogre::Entity* wallPublicity07Entity = m_sceneManager->createEntity("WallPublicity07", "wall-publicity-07.mesh"); + wallPublicity07Entity->setCastShadows(false); + wallPublicity07Entity->getSubEntity(0)->setMaterialName("gymnasium-surface05"); + gymnasiumNode->attachObject(wallPublicity07Entity); + + Ogre::Entity* wallPublicity08Entity = m_sceneManager->createEntity("WallPublicity08", "wall-publicity-08.mesh"); + wallPublicity08Entity->setCastShadows(false); + wallPublicity08Entity->getSubEntity(0)->setMaterialName("gymnasium-surface14"); + gymnasiumNode->attachObject(wallPublicity08Entity); + + Ogre::Entity* wallPublicity09Entity = m_sceneManager->createEntity("WallPublicity09", "wall-publicity-09.mesh"); + wallPublicity09Entity->setCastShadows(false); + wallPublicity09Entity->getSubEntity(0)->setMaterialName("gymnasium-surface14"); + gymnasiumNode->attachObject(wallPublicity09Entity); + + Ogre::Entity* wallPublicity10Entity = m_sceneManager->createEntity("WallPublicity10", "wall-publicity-10.mesh"); + wallPublicity10Entity->setCastShadows(false); + wallPublicity10Entity->getSubEntity(0)->setMaterialName("gymnasium-surface14"); + gymnasiumNode->attachObject(wallPublicity10Entity); + + Ogre::Entity* wallPublicity11Entity = m_sceneManager->createEntity("WallPublicity11", "wall-publicity-11.mesh"); + wallPublicity11Entity->setCastShadows(false); + wallPublicity11Entity->getSubEntity(0)->setMaterialName("gymnasium-surface14"); + gymnasiumNode->attachObject(wallPublicity11Entity); + + Ogre::Entity* wallPublicity12Entity = m_sceneManager->createEntity("WallPublicity12", "wall-publicity-12.mesh"); + wallPublicity12Entity->setCastShadows(false); + wallPublicity12Entity->getSubEntity(0)->setMaterialName("gymnasium-surface14"); + gymnasiumNode->attachObject(wallPublicity12Entity); + + Ogre::Entity* wallPublicity13Entity = m_sceneManager->createEntity("WallPublicity13", "wall-publicity-13.mesh"); + wallPublicity13Entity->setCastShadows(false); + wallPublicity13Entity->getSubEntity(0)->setMaterialName("gymnasium-surface14"); + gymnasiumNode->attachObject(wallPublicity13Entity); + + // more ads + Ogre::SceneNode* publicity01Node = gymnasiumNode->createChildSceneNode("publicity-01-node"); + publicity01Node->setPosition(-22.5F, 0.01F, -10.F); + publicity01Node->setOrientation(-3.65178e-006F, 0.F, 1.F, 0.F); + Ogre::Entity* publicity01Entity = m_sceneManager->createEntity("publicity-01-entity", "publicity-01.mesh"); + publicity01Entity->setCastShadows(false); + publicity01Entity->getSubEntity(0)->setMaterialName("gymnasium-MaterialSponsorBunrakuM2S01"); + publicity01Entity->getSubEntity(1)->setMaterialName("gymnasium-MaterialSponsor01"); + publicity01Node->attachObject(publicity01Entity); + + Ogre::SceneNode* publicity02Node = gymnasiumNode->createChildSceneNode("publicity-02-node"); + publicity02Node->setPosition(-22.5F, 0.01F, -10.F); + publicity02Node->setOrientation(0.707105F, 0.707108F, 0.F, 0.F); + Ogre::Entity* publicity02Entity = m_sceneManager->createEntity("publicity-02-entity", "publicity-02.mesh"); + publicity02Entity->setCastShadows(false); + publicity02Entity->getSubEntity(0)->setMaterialName("gymnasium-MaterialSponsor01"); + publicity02Entity->getSubEntity(1)->setMaterialName("gymnasium-MaterialSponsorBunrakuM2S01"); + publicity02Node->attachObject(publicity02Entity); + + Ogre::SceneNode* publicity03Node = gymnasiumNode->createChildSceneNode("publicity-03-node"); + publicity03Node->setPosition(13.75F, 0.36F, 1.5F); + publicity03Node->setOrientation(0.707105F, 0.F, -0.707108F, 0.F); + Ogre::Entity* publicity03Entity = m_sceneManager->createEntity("publicity-03-entity", "publicity-03.mesh"); + publicity03Entity->setCastShadows(false); + publicity03Entity->getSubEntity(0)->setMaterialName("gymnasium-MaterialSponsor01"); + publicity03Entity->getSubEntity(1)->setMaterialName("gymnasium-MaterialSponsorIrisa01"); + publicity03Node->attachObject(publicity03Entity); + + Ogre::SceneNode* publicity04Node = gymnasiumNode->createChildSceneNode("publicity-04-node"); + publicity04Node->setPosition(13.75F, 0.36F, 1.5F); + publicity04Node->setOrientation(0.707105F, 0.F, -0.707108F, 0.F); + Ogre::Entity* publicity04Entity = m_sceneManager->createEntity("publicity-04-entity", "publicity-04.mesh"); + publicity04Entity->setCastShadows(false); + publicity04Entity->getSubEntity(0)->setMaterialName("gymnasium-MaterialSponsor01"); + publicity04Entity->getSubEntity(1)->setMaterialName("gymnasium-MaterialSponsorIrisa01"); + publicity04Node->attachObject(publicity04Entity); + + Ogre::SceneNode* publicity05Node = gymnasiumNode->createChildSceneNode("publicity-05-node"); + publicity05Node->setPosition(13.75F, 0.36F, -21.5F); + publicity05Node->setOrientation(0.707105F, 0.F, 0.707108F, 0.F); + Ogre::Entity* publicity05Entity = m_sceneManager->createEntity("publicity-05-entity", "publicity-05.mesh"); + publicity05Entity->setCastShadows(false); + publicity05Entity->getSubEntity(0)->setMaterialName("gymnasium-MaterialSponsor01"); + publicity05Entity->getSubEntity(1)->setMaterialName("gymnasium-MaterialSponsorIrisa01"); + publicity05Node->attachObject(publicity05Entity); + + Ogre::SceneNode* publicity06Node = gymnasiumNode->createChildSceneNode("publicity-06-node"); + publicity06Node->setPosition(-13.75F, 0.01F, -21.F); + publicity06Node->setOrientation(0.707105F, 0.F, 0.707108F, 0.F); + Ogre::Entity* publicity06Entity = m_sceneManager->createEntity("publicity-06-entity", "publicity-06.mesh"); + publicity06Entity->setCastShadows(false); + publicity06Entity->getSubEntity(0)->setMaterialName("gymnasium-MaterialSponsor01"); + publicity06Entity->getSubEntity(1)->setMaterialName("gymnasium-MaterialSponsorIrisa01"); + publicity06Node->attachObject(publicity06Entity); + + Ogre::SceneNode* publicity07Node = gymnasiumNode->createChildSceneNode("publicity-07-node"); + publicity07Node->setPosition(-1.96695e-006F, 0.71F, 1.5F); + publicity07Node->setOrientation(0.5F, 0.5F, -0.5F, 0.5F); + Ogre::Entity* publicity07Entity = m_sceneManager->createEntity("publicity-07-entity", "publicity-07.mesh"); + publicity07Entity->setCastShadows(false); + publicity07Entity->getSubEntity(0)->setMaterialName("gymnasium-MaterialSponsorIrisa01"); + publicity07Entity->getSubEntity(1)->setMaterialName("gymnasium-MaterialSponsor01"); + publicity07Node->attachObject(publicity07Entity); +} + +void CHandballBCI::initSceneGoals() const +{ + //----------- LEFT GOAL -------------// + Ogre::SceneNode* leftGoalPivot = m_sceneManager->getRootSceneNode()->createChildSceneNode("LeftGoalPivot"); + Ogre::SceneNode* leftGoal = leftGoalPivot->createChildSceneNode("LeftGoal"); + Ogre::SceneNode* leftGoalNode = leftGoal->createChildSceneNode("LeftGoalNode"); + + Ogre::Entity* leftGoalEntity = m_sceneManager->createEntity("LgoalNode", "goalNode.mesh"); + leftGoalEntity->setCastShadows(true); + leftGoalEntity->getSubEntity(0)->setMaterialName("goal-surface02"); + leftGoalEntity->getSubEntity(1)->setMaterialName("goal-surface01"); + leftGoalNode->attachObject(leftGoalEntity); + + Ogre::Entity* leftGoalBorderEntity = m_sceneManager->createEntity("Lgoal-border", "goal-border.mesh"); + leftGoalBorderEntity->setCastShadows(true); + leftGoalBorderEntity->getSubEntity(0)->setMaterialName("goal-frontcol01"); + leftGoalNode->attachObject(leftGoalBorderEntity); + + Ogre::Entity* leftGoalNetEntity = m_sceneManager->createEntity("Lgoal-net", "goal-net.mesh"); + leftGoalNetEntity->setCastShadows(true); + leftGoalNetEntity->getSubEntity(0)->setMaterialName("goal-foregrou01"); + leftGoalNode->attachObject(leftGoalNetEntity); + + //TRANSFORM FROM demo.omk + leftGoalPivot->translate(0, 0, -5.92F); + leftGoalPivot->rotate(Ogre::Vector3::UNIT_Y, Ogre::Radian(-1.570796327F)); + + //----------- RIGHT GOAL -------------// + Ogre::SceneNode* rightGoalPivot = m_sceneManager->getRootSceneNode()->createChildSceneNode("RightGoalPivot"); + Ogre::SceneNode* rightGoal = rightGoalPivot->createChildSceneNode("RightGoal"); + Ogre::SceneNode* rightGoalNode = rightGoal->createChildSceneNode("RightGoalNode"); + + Ogre::Entity* rightGoalEntity = m_sceneManager->createEntity("RgoalNode", "goalNode.mesh"); + rightGoalEntity->setCastShadows(true); + rightGoalEntity->getSubEntity(0)->setMaterialName("goal-surface02"); + rightGoalEntity->getSubEntity(1)->setMaterialName("goal-surface01"); + rightGoalNode->attachObject(rightGoalEntity); + + Ogre::Entity* rightGoalBorderEntity = m_sceneManager->createEntity("Rgoal-border", "goal-border.mesh"); + rightGoalBorderEntity->setCastShadows(true); + rightGoalBorderEntity->getSubEntity(0)->setMaterialName("goal-frontcol01"); + rightGoalNode->attachObject(rightGoalBorderEntity); + + Ogre::Entity* rightGoalNetEntity = m_sceneManager->createEntity("Rgoal-net", "goal-net.mesh"); + rightGoalNetEntity->setCastShadows(true); + rightGoalNetEntity->getSubEntity(0)->setMaterialName("goal-foregrou01"); + rightGoalNode->attachObject(rightGoalNetEntity); + + //TRANSFORM FROM demo.omk + rightGoalPivot->translate(0, 0, 5.92F); + rightGoalPivot->rotate(Ogre::Vector3::UNIT_Y, Ogre::Radian(1.570796327F)); +} + +void CHandballBCI::initSceneBalls() const +{ + //----------- ACTIVE BALL -------------// + Ogre::SceneNode* ballCommonNode = m_sceneManager->getRootSceneNode()->createChildSceneNode("BallCommonNode"); + + Ogre::SceneNode* activeBallPivot = ballCommonNode->createChildSceneNode("ActiveBallPivot"); + Ogre::SceneNode* activeBall = activeBallPivot->createChildSceneNode("ActiveBall"); + Ogre::SceneNode* activeBallNode = activeBall->createChildSceneNode("ActiveBallNode"); + + Ogre::Entity* activeBallEntity = m_sceneManager->createEntity("active-ball", "active-ballNode.mesh"); + activeBallEntity->setCastShadows(true); + activeBallEntity->getSubEntity(0)->setMaterialName("active-ball-active-ball-material"); + activeBallNode->attachObject(activeBallEntity); + + //----------- GetReady BALL -------------// + Ogre::SceneNode* getReadyBallPivot = ballCommonNode->createChildSceneNode("GetReadyBallPivot"); + Ogre::SceneNode* getReadyBall = getReadyBallPivot->createChildSceneNode("GetReadyBall"); + Ogre::SceneNode* getReadyBallNode = getReadyBall->createChildSceneNode("GetReadyBallNode"); + + Ogre::Entity* getReadyBallEntity = m_sceneManager->createEntity("get-ready-ball", "get-ready-ballNode.mesh"); + getReadyBallEntity->setCastShadows(true); + getReadyBallEntity->getSubEntity(0)->setMaterialName("get-ready-ball-get-ready-ball-material"); + getReadyBallNode->attachObject(getReadyBallEntity); + + //----------- Passive BALL -------------// + Ogre::SceneNode* passiveBallPivot = ballCommonNode->createChildSceneNode("PassiveBallPivot"); + Ogre::SceneNode* passiveBall = passiveBallPivot->createChildSceneNode("PassiveBall"); + Ogre::SceneNode* passiveBallNode = passiveBall->createChildSceneNode("PassiveBallNode"); + + Ogre::Entity* passiveBallEntity = m_sceneManager->createEntity("passive-ball", "passive-ballNode.mesh"); + passiveBallEntity->setCastShadows(true); + passiveBallEntity->getSubEntity(0)->setMaterialName("passive-ball-surface01"); + passiveBallNode->attachObject(passiveBallEntity); + + ballCommonNode->translate(0, passiveBallEntity->getBoundingRadius(), 0); + + getReadyBallPivot->setVisible(false); + passiveBallPivot->setVisible(true); + activeBallPivot->setVisible(false); +} + +void CHandballBCI::initSceneCrossArrowAndFeedback() +{ + //----------- CROSS -------------// + Ogre::SceneNode* crossCommonNode = m_sceneManager->getRootSceneNode()->createChildSceneNode("CrossCommonNode"); + + Ogre::SceneNode* crossNode = crossCommonNode->createChildSceneNode("CrossNode"); + Ogre::Entity* crossEntity = m_sceneManager->createEntity("cross", "crossNode.mesh"); + crossEntity->setCastShadows(false); + crossEntity->getSubEntity(0)->setMaterialName("cross-cross-material"); + crossNode->attachObject(crossEntity); + m_crossSize = crossEntity->getBoundingRadius() * 2; + crossNode->setVisible(false); + + //----------- RIGHT ARROW -------------// + Ogre::SceneNode* rArrowNode = crossCommonNode->createChildSceneNode("RightArrowNode"); + Ogre::Entity* rArrowEntity = m_sceneManager->createEntity("rightArrow", "basic-arrowNode.mesh"); + rArrowEntity->setCastShadows(false); + rArrowEntity->getSubEntity(0)->setMaterialName("basic-arrow-basic-arrow-material"); + rArrowNode->attachObject(rArrowEntity); + rArrowNode->roll(Ogre::Radian(Ogre::Math::PI)); + rArrowNode->translate(0, 0, 0.001F); + rArrowNode->setVisible(false); + + //----------- LEFT ARROW -------------// + Ogre::SceneNode* lArrowNode = crossCommonNode->createChildSceneNode("LeftArrowNode"); + Ogre::Entity* lArrowEntity = m_sceneManager->createEntity("leftArrow", "basic-arrowNode.mesh"); + lArrowEntity->setCastShadows(false); + lArrowEntity->getSubEntity(0)->setMaterialName("basic-arrow-basic-arrow-material"); + lArrowNode->attachObject(lArrowEntity); + lArrowNode->translate(0, 0, 0.001F); + lArrowNode->setVisible(false); + + crossCommonNode->yaw(Ogre::Radian(Ogre::Math::PI / 2.F)); + crossCommonNode->roll(Ogre::Radian(Ogre::Math::PI / 2.F)); + crossCommonNode->translate(3.5F, 0.20F, 0.F); + crossCommonNode->setScale(0.35F, 0.35F, 0.35F); + + //----------- FEEDBACK -------------// + Ogre::SceneNode* feedbackNode = m_sceneManager->getRootSceneNode()->createChildSceneNode("FeedbackNode"); + Ogre::Entity* feedbackEntity = m_sceneManager->createEntity("feedback", "plane-cyanNode.mesh"); + feedbackEntity->setCastShadows(false); + feedbackEntity->getSubEntity(0)->setMaterialName("plane-cyan-plane-material"); + feedbackNode->attachObject(feedbackEntity); + feedbackNode->roll(Ogre::Radian(-Ogre::Math::PI / 2.F)); + feedbackNode->setScale(0.25F, 0.25F, 2.59F); + feedbackNode->setPosition(3.499F, 0.20F, -m_crossSize * feedbackNode->getScale().z / 2); + + feedbackNode->setVisible(false); +} + +} // namespace VRDemos +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/HandballBCI/ovavrdCHandballBCI.h b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/HandballBCI/ovavrdCHandballBCI.h new file mode 100644 index 0000000..5ef1b31 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/HandballBCI/ovavrdCHandballBCI.h @@ -0,0 +1,76 @@ +#pragma once + +#include "../ovavrdCOgreVRApplication.h" + +namespace VRDemos { + +/** + * \class CHandballBCI + * \author Laurent Bonnet (INRIA/IRISA) + * \date 2010-02-16 + * \brief Ogre application for the Handball application. + * + * \details The HandballBCI application is based on motor imagery of the hands. + * The 3d scene is a gymnasium, with 2 handball goals. + * The subject has to move his right/left hand to move a ball in the right/left goal. + * TODO: full documentation. + */ +class CHandballBCI final : public COgreVRApplication +{ +public: + + CHandballBCI(); + +private: + + enum EPhase { Phase_GetReady, Phase_Active, Phase_Rest, }; + + enum EMark { Mark_Right, Mark_Left, Mark_None, }; + + bool initialise() override; + void initSceneGymnasium() const; + void initSceneAds() const; + void initSceneGoals() const; + void initSceneBalls() const; + void initSceneCrossArrowAndFeedback(); + + //virtual bool initGUI(); + + bool process(double timeSinceLastProcess) override; + + int m_goalScore = 0; // goal ! + int m_leftScore = 0; // ball successfully sent on the left side (but maybe no goal) + int m_rightScore = 0; // ball successfully sent on the left side (but maybe no goal) + + //for stats + int m_nTrialRight = 0; + int m_nTrialLeft = 0; + + int m_classificationScore = 0; + + int m_phase = 0; + int m_lastPhase = 0; + + double m_feedback = 0; + double m_lastFeedback = 0; + + double m_maxFeedback = 0; + double m_minFeedback = 0; + std::list m_analogHistories; + + int m_mark = 0; + int m_lastMark = 0; + bool m_goalMarkedAtThisPhase = false; + + float m_ballSpeed = 0; + float m_ballPosition = 0; // n.b. The coordinate system of this seems to be inverted wrt the [-left,+right] convention + float m_lastBallPosition = 0; + float m_ballOrientation = 0; + + float m_crossSize = 0; + + bool m_showCross = false; + bool m_showClue = false; + bool m_showFeedback = false; +}; +} // namespace VRDemos diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/SpaceshipBCI/ovavrdCSpaceshipBCI.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/SpaceshipBCI/ovavrdCSpaceshipBCI.cpp new file mode 100644 index 0000000..e44f707 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/SpaceshipBCI/ovavrdCSpaceshipBCI.cpp @@ -0,0 +1,659 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovavrdCSpaceshipBCI.h" + +#include + +#include +#include +#include +#include + +#if defined TARGET_OS_Linux +#define _strcmpi strcasecmp +#endif + +#if !( (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) ) +namespace CEGUI +{ + typedef CEGUI::UVector2 USize; +}; +#endif + +namespace VRDemos { + +static const float SMALL_OBJECT_MIN_HEIGHT = -2.0F; +static const float SMALL_OBJECT_MAX_HEIGHT = 0.0F; +static const float SMALL_OBJECT_MOVE_SPEED = .02F; +static const float SMALL_OBJECT_ATTENUATION = .99F; +static const float SMALL_OBJECT_ROTATION_SPEED = 0.05F; + +static const float MIN_HEIGHT = -0.7F; +static const float MAX_HEIGHT = 6.0F; +static const float ATTENUATION = .99F; +static const float ROTATION_SPEED = 0.50F; +static const float MOVE_SPEED = 0.01F; // 0.004; + +static const float OFFSET = 2.0F; + +CSpaceshipBCI::CSpaceshipBCI(const std::string& localization) : COgreVRApplication(OpenViBE::Directories::getDataDir() + "/applications/vr-demo/spaceship") +{ + m_localization = localization; + if (_strcmpi(localization.c_str(), "fr") == 0) + { + m_localizedFilenames.insert(std::make_pair("phase-init", "pret.png")); + m_localizedFilenames.insert(std::make_pair("phase-move", "bouge-les-pieds.png")); + m_localizedFilenames.insert(std::make_pair("phase-stop", "stop.png")); + m_localizedFilenames.insert(std::make_pair("phase-end", "fin-de-partie.png")); + } + else + { + m_localizedFilenames.insert(std::make_pair("phase-init", "ready.png")); + m_localizedFilenames.insert(std::make_pair("phase-move", "move-your-feet.png")); + m_localizedFilenames.insert(std::make_pair("phase-stop", "stop.png")); + m_localizedFilenames.insert(std::make_pair("phase-end", "game-over.png")); + } +} + +bool CSpaceshipBCI::initialise() +{ + //----------- LIGHTS -------------// + m_sceneManager->setAmbientLight(Ogre::ColourValue(0.6F, 0.6F, 0.6F)); + m_sceneManager->setShadowTechnique(Ogre::SHADOWTYPE_TEXTURE_MODULATIVE); + + Ogre::Light* light1 = m_sceneManager->createLight("Light1"); + light1->setPosition(-2.F, 6.F, 2.F); + light1->setSpecularColour(1.F, 1.F, 1.F); + light1->setDiffuseColour(1.F, 1.F, 1.F); + + //----------- CAMERA -------------// + m_camera->setNearClipDistance(0.1F); + m_camera->setFarClipDistance(50000.0F); + m_camera->setFOVy(Ogre::Radian(Ogre::Degree(70.F))); + m_camera->setProjectionType(Ogre::PT_PERSPECTIVE); + + m_camera->setPosition(-10.F, 0.9F, 0.F); + m_camera->setOrientation(Ogre::Quaternion(0.707107F, 0.F, -0.707107F, 0.F)); + + //----------- HANGAR -------------// + loadHangar(); + + //----------- PARTICLES -------------// + /*ParticleSystem* particleSystem = m_sceneManager->createParticleSystem("spark-particles","spaceship/spark"); + SceneNode* particleNode = m_sceneManager->getRootSceneNode()->createChildSceneNode("ParticleNode"); + particleNode->attachObject(particleSystem); + particleNode->setPosition(9.f,5.f,-13.f);*/ + + // populate the hangar with barrels near the walls + loadHangarBarrels(); + + //----------- Ship -------------// + loadShip(); + + //----------- SMALL OBJECTS -------------// + loadBarrels(); + + //----------- GUI -------------// + loadGUI(); + + return true; +} + +void CSpaceshipBCI::loadGUI() +{ + const std::string moveImage = m_localizedFilenames["phase-move"]; + const std::string stopImage = m_localizedFilenames["phase-stop"]; + const std::string initImage = m_localizedFilenames["phase-init"]; + const std::string endImage = m_localizedFilenames["phase-end"]; + + //ENG + //const std::string moveImage = "move.png"; + //const std::string stopImage = "stop-move.png"; + //const std::string initImage = "calibration.png"; + + /*CEGUI::Window * widget = m_guiWindowManager->createWindow("TaharezLook/StaticText", "score"); + widget->setPosition(CEGUI::UVector2(cegui_reldim(0.01f), cegui_reldim(0.01f)) ); + widget->setSize(CEGUI::USize(CEGUI::UDim(0.2f, 0.f), CEGUI::UDim(0.08f, 0.f))); + m_sheet->addChildWindow(widget); + widget->setFont("BlueHighway-24"); + widget->setText("Score: 0\n"); + widget->setProperty("HorzFormatting","WordWrapCentred"); + widget->setProperty("VertFormatting","WordWrapCentred");*/ + + CEGUI::Window* move = m_guiManager->createWindow("TaharezLook/StaticImage", "Move"); + move->setPosition(CEGUI::UVector2(cegui_reldim(0.35F), cegui_reldim(0.8F))); + move->setSize(CEGUI::USize(CEGUI::UDim(0.3F, 0.F), CEGUI::UDim(0.2F, 0.F))); +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) + m_sheet->addChild(move); + CEGUI::ImageManager::getSingleton().addFromImageFile("ImageMove", moveImage); + move->setProperty("Image", "ImageMove"); +#else + m_sheet->addChildWindow(move); + CEGUI::ImagesetManager::getSingleton().createFromImageFile("ImageMove", moveImage); + move->setProperty("Image", "set:ImageMove image:full_image"); +#endif + move->setProperty("FrameEnabled", "False"); + move->setProperty("BackgroundEnabled", "False"); + + CEGUI::Window* noMove = m_guiManager->createWindow("TaharezLook/StaticImage", "NoMove"); + noMove->setPosition(CEGUI::UVector2(cegui_reldim(0.35F), cegui_reldim(0.8F))); + noMove->setSize(CEGUI::USize(CEGUI::UDim(0.3F, 0.F), CEGUI::UDim(0.2F, 0.F))); +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) + m_sheet->addChild(noMove); + CEGUI::ImageManager::getSingleton().addFromImageFile("ImageNoMove", stopImage); + noMove->setProperty("Image", "ImageNoMove"); +#else + m_sheet->addChildWindow(noMove); + CEGUI::ImagesetManager::getSingleton().createFromImageFile("ImageNoMove", stopImage); + noMove->setProperty("Image", "set:ImageNoMove image:full_image"); +#endif + + noMove->setProperty("FrameEnabled", "False"); + noMove->setProperty("BackgroundEnabled", "False"); + + CEGUI::Window* calibration = m_guiManager->createWindow("TaharezLook/StaticImage", "Calibration"); + calibration->setPosition(CEGUI::UVector2(cegui_reldim(0.35F), cegui_reldim(0.8F))); + calibration->setSize(CEGUI::USize(CEGUI::UDim(0.3F, 0.F), CEGUI::UDim(0.2F, 0.F))); +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) + m_sheet->addChild(calibration); + CEGUI::ImageManager::getSingleton().addFromImageFile("ImageCalibration", initImage); + calibration->setProperty("Image", "ImageCalibration"); +#else + m_sheet->addChildWindow(calibration); + CEGUI::ImagesetManager::getSingleton().createFromImageFile("ImageCalibration", initImage); + calibration->setProperty("Image", "set:ImageCalibration image:full_image"); +#endif + calibration->setProperty("FrameEnabled", "False"); + calibration->setProperty("BackgroundEnabled", "False"); + + CEGUI::Window* statsImage = m_guiManager->createWindow("TaharezLook/StaticImage", "StatsImage"); + statsImage->setPosition(CEGUI::UVector2(cegui_reldim(0.25F), cegui_reldim(0.2F))); + statsImage->setSize(CEGUI::USize(CEGUI::UDim(0.5F, 0.F), CEGUI::UDim(0.2F, 0.F))); +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) + m_sheet->addChild(statsImage); + CEGUI::ImageManager::getSingleton().addFromImageFile("ImageStatistics", endImage); + statsImage->setProperty("Image", "ImageStatistics"); +#else + m_sheet->addChildWindow(statsImage); + CEGUI::ImagesetManager::getSingleton().createFromImageFile("ImageStatistics", endImage); + statsImage->setProperty("Image", "set:ImageStatistics image:full_image"); +#endif + statsImage->setProperty("FrameEnabled", "False"); + statsImage->setProperty("BackgroundEnabled", "False"); + statsImage->setVisible(false); + + CEGUI::Window* statistics = m_guiManager->createWindow("TaharezLook/StaticText", "Statistics"); + statistics->setPosition(CEGUI::UVector2(cegui_reldim(0.25F), cegui_reldim(0.35F))); + statistics->setSize(CEGUI::USize(CEGUI::UDim(0.5F, 0.F), CEGUI::UDim(0.5F, 0.F))); +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) + m_sheet->addChild(statistics); + statistics->setFont("BlueHighway-24"); + statistics->setProperty("HorzFormatting", "WordWrapCentreAligned"); + statistics->setProperty("VertFormatting", "WordWrapCentreAligned"); + statistics->setVisible(false); +#else + m_sheet->addChildWindow(statistics); + statistics->setFont("BlueHighway-24"); + statistics->setProperty("HorzFormatting", "WordWrapCentred"); + statistics->setProperty("VertFormatting", "WordWrapCentred"); + statistics->setVisible(false); +#endif + + CEGUI::Window* threshold = m_guiManager->createWindow("TaharezLook/StaticText", "Threshold"); + threshold->setPosition(CEGUI::UVector2(cegui_reldim(0.01F), cegui_reldim(0.01F))); + threshold->setSize(CEGUI::USize(CEGUI::UDim(0.15F, 0.F), CEGUI::UDim(0.08F, 0.F))); +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) + m_sheet->addChild(threshold); +#else + m_sheet->addChildWindow(threshold); +#endif + threshold->setFont("BlueHighway-12"); + threshold->setProperty("HorzFormatting", "WordWrapCentred"); + threshold->setProperty("VertFormatting", "WordWrapCentred"); + threshold->setVisible(false); + std::stringstream ss; + ss << "Seuil : 0%"; + threshold->setText(ss.str()); +} + +void CSpaceshipBCI::loadHangar() const +{ + Ogre::Entity* hangarEntity = m_sceneManager->createEntity("Hangar", "hangar.mesh"); + hangarEntity->setCastShadows(false); + hangarEntity->getSubEntity(0)->setMaterialName("hangar-01_-_Default"); + hangarEntity->getSubEntity(1)->setMaterialName("hangar-03_-_Default"); + hangarEntity->getSubEntity(2)->setMaterialName("hangar-orig_08_-_Default"); + hangarEntity->getSubEntity(3)->setMaterialName("hangar-07_-_Default"); + + Ogre::SceneNode* hangarNode = m_sceneManager->getRootSceneNode()->createChildSceneNode("HangarNode"); + hangarNode->attachObject(hangarEntity); + + hangarNode->setScale(1.F, 1.F, 1.F); + hangarNode->setPosition(159.534F, 3.22895F, 0.0517212F); + hangarNode->setOrientation(Ogre::Quaternion(0.5F, 0.5F, -0.5F, 0.5F)); +} + +void CSpaceshipBCI::loadShip() +{ + Ogre::Entity* spaceshipEntity = m_sceneManager->createEntity("Ship", "vaisseau.mesh"); + spaceshipEntity->setCastShadows(true); + + Ogre::SceneNode* spaceshipNode = m_sceneManager->getRootSceneNode()->createChildSceneNode("ShipNode"); + spaceshipNode->attachObject(spaceshipEntity); + + spaceshipNode->setScale(0.008F, 0.008F, 0.008F); + const float offset = OFFSET; + spaceshipNode->setPosition(4.5F, MIN_HEIGHT, -2.F + offset); + spaceshipNode->rotate(Ogre::Vector3::UNIT_Y, -Ogre::Radian(Ogre::Math::PI / 2.F)); + + m_shipOrientations[0] = spaceshipNode->getOrientation().x; + m_shipOrientations[1] = spaceshipNode->getOrientation().y; + m_shipOrientations[2] = spaceshipNode->getOrientation().z; +} + +void CSpaceshipBCI::loadBarrels() +{ + for (size_t i = 0; i < 3; ++i) + { + m_smallObjHeight.push_back(SMALL_OBJECT_MIN_HEIGHT); + m_smallObjOrientation.push_back(Ogre::Vector3(0, 0, 0)); + } + + const float offset = OFFSET; + + //-- 1st + Ogre::Entity* barrel1Entity = m_sceneManager->createEntity("Mini1", "barrel.mesh"); + barrel1Entity->setCastShadows(true); + barrel1Entity->setMaterialName("RustyBarrel"); + + Ogre::SceneNode* barrel1Node = m_sceneManager->getRootSceneNode()->createChildSceneNode("Mini1Node"); + barrel1Node->attachObject(barrel1Entity); + + barrel1Node->setScale(0.15F, 0.15F, 0.15F); + barrel1Node->setPosition(4.F, SMALL_OBJECT_MIN_HEIGHT, -6 + offset); + barrel1Node->rotate(Ogre::Vector3::UNIT_X, Ogre::Radian(Ogre::Math::PI / 2.F)); + + //-- 2nd + Ogre::Entity* barrel2Entity = m_sceneManager->createEntity("Mini2", "barrel.mesh"); + barrel2Entity->setCastShadows(true); + barrel2Entity->setMaterialName("RustyBarrel"); + + Ogre::SceneNode* barrel2Node = m_sceneManager->getRootSceneNode()->createChildSceneNode("Mini2Node"); + barrel2Node->attachObject(barrel2Entity); + + barrel2Node->setScale(0.15F, 0.15F, 0.15F); + barrel2Node->setPosition(3.F, SMALL_OBJECT_MIN_HEIGHT, 1 + offset); + barrel2Node->rotate(Ogre::Vector3::UNIT_X, Ogre::Radian(Ogre::Math::PI / 2.F)); + + //-- 3rd + Ogre::Entity* barrel3Entity = m_sceneManager->createEntity("Mini3", "barrel.mesh"); + barrel3Entity->setCastShadows(true); + barrel3Entity->setMaterialName("RustyBarrel"); + + Ogre::SceneNode* barrel3Node = m_sceneManager->getRootSceneNode()->createChildSceneNode("Mini3Node"); + barrel3Node->attachObject(barrel3Entity); + + barrel3Node->setScale(0.15F, 0.15F, 0.15F); + barrel3Node->setPosition(2.5F, SMALL_OBJECT_MIN_HEIGHT, -2 + offset); + barrel3Node->rotate(Ogre::Vector3::UNIT_X, Ogre::Radian(Ogre::Math::PI / 2.F)); +} + +void CSpaceshipBCI::loadHangarBarrels() const +{ + //-- 1st + Ogre::Entity* barrel1Entity = m_sceneManager->createEntity("Barrel1", "barrel.mesh"); + barrel1Entity->setCastShadows(true); + barrel1Entity->setMaterialName("RustyBarrel"); + + Ogre::SceneNode* barrel1Node = m_sceneManager->getRootSceneNode()->createChildSceneNode("Barrel1Node"); + barrel1Node->attachObject(barrel1Entity); + + barrel1Node->setScale(0.15F, 0.15F, 0.15F); + barrel1Node->setPosition(7, -2, -10); + barrel1Node->rotate(Ogre::Vector3::UNIT_X, Ogre::Radian(Ogre::Math::PI / 2.F)); + + //-- 2nd + Ogre::Entity* barrel2Entity = m_sceneManager->createEntity("Barrel2", "barrel.mesh"); + barrel2Entity->setCastShadows(true); + barrel2Entity->setMaterialName("RustyBarrel"); + + Ogre::SceneNode* barrel2Node = m_sceneManager->getRootSceneNode()->createChildSceneNode("Barrel2Node"); + barrel2Node->attachObject(barrel2Entity); + + barrel2Node->setScale(0.15F, 0.25F, 0.15F); + barrel2Node->setPosition(7, -2, -12); + barrel2Node->rotate(Ogre::Vector3::UNIT_X, Ogre::Radian(Ogre::Math::PI)); + + //-- 3rd + Ogre::Entity* barrel3Entity = m_sceneManager->createEntity("Barrel3", "barrel.mesh"); + barrel3Entity->setCastShadows(true); + barrel3Entity->setMaterialName("RustyBarrel"); + + Ogre::SceneNode* barrel3Node = m_sceneManager->getRootSceneNode()->createChildSceneNode("Barrel3Node"); + barrel3Node->attachObject(barrel3Entity); + + barrel3Node->setScale(0.15F, 0.2F, 0.15F); + barrel3Node->setPosition(8, -2, -12); + barrel3Node->rotate(Ogre::Vector3::UNIT_X, Ogre::Radian(Ogre::Math::PI)); + + //-- 4th + Ogre::Entity* barrel4Entity = m_sceneManager->createEntity("Barrel4", "barrel.mesh"); + barrel4Entity->setCastShadows(true); + barrel4Entity->setMaterialName("RustyBarrel"); + + Ogre::SceneNode* barrel4Node = m_sceneManager->getRootSceneNode()->createChildSceneNode("Barrel4Node"); + barrel4Node->attachObject(barrel4Entity); + + barrel4Node->setScale(0.15F, 0.2F, 0.15F); + barrel4Node->setPosition(8, -1, -12); + barrel4Node->rotate(Ogre::Vector3::UNIT_X, Ogre::Radian(Ogre::Math::PI)); +} + +bool CSpaceshipBCI::process(double timeSinceLastProcess) +{ + while (!m_vrpnPeripheral->m_Buttons.empty()) + { + std::pair& vrpnButtonState = m_vrpnPeripheral->m_Buttons.front(); + + if (vrpnButtonState.second) // if the button is ON + { + // std::cout << "Received button " << vrpnButtonState.first << "\n"; + + switch (vrpnButtonState.first) + { + case 0: m_phase = Phase_Rest; + break; + case 1: m_phase = Phase_Move; + break; + case 2: m_phase = Phase_NoMove; + break; + case 3: m_stage = Stage_Baseline; + break; + case 4: m_stage = Stage_FreetimeReal; + break; + case 5: m_stage = Stage_FreetimeImaginary; + break; + case 6: m_stage = Stage_Statistics; + break; + default: std::cout << "Received unsupported button " << vrpnButtonState.first << "\n"; + } + } + + m_vrpnPeripheral->m_Buttons.pop_front(); + } + + if (!m_vrpnPeripheral->m_Analogs.empty()) + { + std::list& vrpnAnalogState = m_vrpnPeripheral->m_Analogs.front(); + + m_feedback = *(vrpnAnalogState.begin()); + m_minimumFeedback = (m_minimumFeedback > m_feedback ? m_feedback : m_minimumFeedback); + + // std::cout << "Received analog " << m_feedback << "\n"; + + m_vrpnPeripheral->m_Analogs.pop_front(); + } + + if (m_lastPhase != m_phase) + { + switch (m_phase) + { + case Phase_NoMove: + m_shouldScore = true; + m_nAttempt++; + break; + default: + m_shouldScore = false; + break; + } + } + + if (m_shouldScore) + { + const double threshold = 1E-3; + if (m_lastFeedback < threshold && m_feedback >= threshold) + { + m_score++; + m_shouldScore = false; + } + } + + // ------------------------------------------------------------------------------- + // GUI + + switch (m_phase) + { + case Phase_Rest: + m_sheet->getChild("Move")->setVisible(false); + m_sheet->getChild("NoMove")->setVisible(false); + break; + + case Phase_Move: + m_sheet->getChild("Move")->setVisible(true); + m_sheet->getChild("NoMove")->setVisible(false); + break; + + case Phase_NoMove: + m_sheet->getChild("Move")->setVisible(false); + m_sheet->getChild("NoMove")->setVisible(true); + break; + + default: + m_sheet->getChild("Move")->setVisible(false); + m_sheet->getChild("NoMove")->setVisible(false); + break; + } + std::stringstream ss; + int count; + std::string rang; + switch (m_stage) + { + case Stage_Baseline: + m_sheet->getChild("Move")->setVisible(false); + m_sheet->getChild("NoMove")->setVisible(false); + m_sheet->getChild("Calibration")->setVisible(true); + m_sheet->getChild("Statistics")->setVisible(false); + m_sheet->getChild("StatsImage")->setVisible(false); + break; + case Stage_FreetimeReal: + m_sheet->getChild("Calibration")->setVisible(false); + m_sheet->getChild("Statistics")->setVisible(false); + m_sheet->getChild("StatsImage")->setVisible(false); + processStageFreetime(timeSinceLastProcess); + break; + case Stage_FreetimeImaginary: + m_sheet->getChild("Calibration")->setVisible(false); + m_sheet->getChild("Statistics")->setVisible(false); + m_sheet->getChild("StatsImage")->setVisible(false); + processStageFreetime(timeSinceLastProcess); + break; + case Stage_Statistics: + count = 10; + m_sheet->getChild("Move")->setVisible(false); + m_sheet->getChild("NoMove")->setVisible(false); + m_sheet->getChild("Calibration")->setVisible(false); + m_sheet->getChild("Statistics")->setVisible(true); + m_sheet->getChild("StatsImage")->setVisible(true); + + if (_strcmpi(m_localization.c_str(), "fr") == 0) + { + ss << " Merci d'avoir participe !" << "\n------------\n"; + + ss << "Le vaisseau s'est souleve pendant :\n" << m_statSpaceshipLiftTime << " secondes.\n"; + ss << "Temps moyen par essai :\n" << m_statSpaceshipLiftTime / count << " secondes.\n"; + ss << "------------\n"; + ss << "Votre rang : \n"; + rang = "- Apprenti -"; + if (m_statSpaceshipLiftTime / count > 1.0) { rang = "{ Chevalier }"; } + if (m_statSpaceshipLiftTime / count > 2.0) { rang = "-oO Maitre Oo-"; } + ss << rang << "\n"; + } + else + { + ss << " Thanks for your participation" << "\n------------\n"; + + ss << "You lifted the spaceship during :\n" << m_statSpaceshipLiftTime << " seconds.\n"; + ss << "Mean time per attempt :\n" << m_statSpaceshipLiftTime / count << " seconds.\n"; + ss << "------------\n"; + ss << "Rank : \n"; + rang = "- Apprentice -"; + if (m_statSpaceshipLiftTime / count > 1.0) { rang = "{ Knight }"; } + if (m_statSpaceshipLiftTime / count > 2.0) { rang = "-oO Master Oo-"; } + ss << rang << "\n"; + } + + m_sheet->getChild("Statistics")->setText(ss.str()); + break; + + default: + break; + } + + // ------------------------------------------------------------------------------- + // End of computation + std::stringstream ss2; + ss2 << "Offset : " << m_betaOffsetPercentage << "%"; + m_sheet->getChild("Threshold")->setText(ss2.str()); + + m_lastFeedback = m_feedback; + m_lastPhase = m_phase; + + return m_bContinue; +} +// ------------------------------------------------------------------------------- +bool CSpaceshipBCI::keyPressed(const OIS::KeyEvent& evt) +{ + if (evt.key == OIS::KC_ESCAPE) + { + std::cout << "[ESC] pressed, user termination." << std::endl; + std::cout << " Saving statistics..." << std::endl; + std::stringstream path(OpenViBE::Directories::getLogDir().toASCIIString()); + path << "/openvibe-vr-demo-spaceship-stats.txt"; + remove(path.str().c_str()); + std::ofstream subjectConf(path.str().c_str()); + subjectConf << "Temps total = " << m_statSpaceshipLiftTime << "\n"; + m_bContinue = false; + } + if (evt.key == OIS::KC_END) + { + const bool visibility = m_sheet->getChild("Threshold")->isVisible(); + m_sheet->getChild("Threshold")->setVisible(!visibility); + } + if (evt.key == OIS::KC_UP) + { + m_betaOffset += (-m_minimumFeedback) / 100; + m_betaOffsetPercentage++; + } + if (evt.key == OIS::KC_DOWN) + { + m_betaOffset -= (-m_minimumFeedback) / 100; + m_betaOffsetPercentage--; + } + + return true; +} + +// ------------------------------------------------------------------------------- +void CSpaceshipBCI::processStageFreetime(const double timeSinceLastProcess) +{ + // ------------------------------------------------------------------------------- + // Ship + + if (m_feedback <= m_betaOffset) + { + m_shipOrientations[0] *= ATTENUATION; + m_shipOrientations[1] *= ATTENUATION; + m_shipOrientations[2] *= ATTENUATION; + m_shipHeight *= ATTENUATION; + m_shouldIncrementStat = false; + } + else + { + m_shipOrientations[0] += ROTATION_SPEED * ((rand() & 1) == 0 ? -1.0 : 1.0); + m_shipOrientations[1] += ROTATION_SPEED * ((rand() & 1) == 0 ? -1.0 : 1.0); + m_shipOrientations[2] += ROTATION_SPEED * ((rand() & 1) == 0 ? -1.0 : 1.0); + m_shipHeight += float((m_feedback - m_betaOffset) * MOVE_SPEED); + if (m_shouldIncrementStat) { m_statSpaceshipLiftTime += timeSinceLastProcess; } + + if (m_shipOrientations[0] > 5) { m_shipOrientations[0] = 5; } + if (m_shipOrientations[1] > 5) { m_shipOrientations[1] = 5; } + if (m_shipOrientations[2] > 5) { m_shipOrientations[2] = 5; } + if (m_shipOrientations[0] < -5) { m_shipOrientations[0] = -5; } + if (m_shipOrientations[1] < -5) { m_shipOrientations[1] = -5; } + if (m_shipOrientations[2] < -5) { m_shipOrientations[2] = -5; } + if (m_shipHeight > MAX_HEIGHT) { m_shipHeight = MAX_HEIGHT; } + m_shouldIncrementStat = true; + } + + // ------------------------------------------------------------------------------- + // Mini Objects + // For n mini-objects, each one has its own threshold, in a regular n+1 partition. + // First mini-object starts lifting on the second part (nothing happens in the first part). + // The threshold for Ship is 0+m_betaOffset. + // + // MIN=T0 T1 T2 Tn BetaOffset + // ---|--nothing--|--1st mini--|--/~~/---|-----|---- + + const size_t nSmallObjects = m_smallObjHeight.size(); + for (size_t i = 0; i < nSmallObjects; ++i) + { + if (m_feedback - m_betaOffset <= (m_minimumFeedback - ((i + 1) * m_minimumFeedback / (nSmallObjects + 1)))) + { + m_smallObjHeight[i] = ((m_smallObjHeight[i] - SMALL_OBJECT_MIN_HEIGHT) * SMALL_OBJECT_ATTENUATION) + SMALL_OBJECT_MIN_HEIGHT; + m_smallObjOrientation[i][0] *= ATTENUATION; + m_smallObjOrientation[i][1] *= ATTENUATION; + m_smallObjOrientation[i][2] *= ATTENUATION; + } + else + { + m_smallObjOrientation[i][0] += float((rand() & 1) == 0 ? -1 : 1) * SMALL_OBJECT_ROTATION_SPEED; + m_smallObjOrientation[i][1] += float((rand() & 1) == 0 ? -1 : 1) * SMALL_OBJECT_ROTATION_SPEED; + m_smallObjOrientation[i][2] += float((rand() & 1) == 0 ? -1 : 1) * SMALL_OBJECT_ROTATION_SPEED; + + m_smallObjHeight[i] += float(m_feedback < m_lastFeedback ? -1 : 1) * float(rand() % 100 + 50) / 100.0F * SMALL_OBJECT_MOVE_SPEED * float(i + 1); + } + + if (m_smallObjHeight[i] > SMALL_OBJECT_MAX_HEIGHT) + { + m_smallObjHeight[i] = SMALL_OBJECT_MAX_HEIGHT + float((rand() & 1) == 0 ? -1 : 1) * SMALL_OBJECT_MOVE_SPEED; + } + if (m_smallObjHeight[i] < SMALL_OBJECT_MIN_HEIGHT) { m_smallObjHeight[i] = SMALL_OBJECT_MIN_HEIGHT; } + } + + // ------------------------------------------------------------------------------- + // Object translations / rotations + + //height + const Ogre::Vector3 shipPosition = m_sceneManager->getSceneNode("ShipNode")->getPosition(); + m_sceneManager->getSceneNode("ShipNode")->setPosition(shipPosition.x, MIN_HEIGHT + m_shipHeight, shipPosition.z); + + //orientation + m_sceneManager->getSceneNode("ShipNode")->setOrientation(Ogre::Quaternion(1, m_shipOrientations[0] * Ogre::Math::PI / 180, + m_shipOrientations[1] * Ogre::Math::PI / 180, + m_shipOrientations[2] * Ogre::Math::PI / 180)); + m_sceneManager->getSceneNode("ShipNode")->rotate(Ogre::Vector3::UNIT_Y, Ogre::Radian(Ogre::Math::PI / 2.F)); + + //score + // CEGUI::Window * widget = m_sheet->getChild("score"); + // stringstream ss; + // ss << "Score: "<< m_score << " / "<setText(ss.str()); + + m_sceneManager->getSceneNode("Mini1Node")->setOrientation(Ogre::Quaternion(1, m_smallObjOrientation[0][0], m_smallObjOrientation[0][1], + m_smallObjOrientation[0][2])); + const Ogre::Vector3 miniShip1Position = m_sceneManager->getSceneNode("Mini1Node")->getPosition(); + m_sceneManager->getSceneNode("Mini1Node")->setPosition(miniShip1Position.x, m_smallObjHeight[0], miniShip1Position.z); + + m_sceneManager->getSceneNode("Mini2Node")->setOrientation(Ogre::Quaternion(1, m_smallObjOrientation[1][0], m_smallObjOrientation[1][1], + m_smallObjOrientation[1][2])); + const Ogre::Vector3 miniShip2Position = m_sceneManager->getSceneNode("Mini2Node")->getPosition(); + m_sceneManager->getSceneNode("Mini2Node")->setPosition(miniShip2Position.x, m_smallObjHeight[1], miniShip2Position.z); + + m_sceneManager->getSceneNode("Mini3Node")->setOrientation(Ogre::Quaternion(1, m_smallObjOrientation[2][0], m_smallObjOrientation[2][1], + m_smallObjOrientation[2][2])); + const Ogre::Vector3 miniShip3Position = m_sceneManager->getSceneNode("Mini3Node")->getPosition(); + m_sceneManager->getSceneNode("Mini3Node")->setPosition(miniShip3Position.x, m_smallObjHeight[2], miniShip3Position.z); +} + +} // namespace VRDemos +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/SpaceshipBCI/ovavrdCSpaceshipBCI.h b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/SpaceshipBCI/ovavrdCSpaceshipBCI.h new file mode 100644 index 0000000..0e2dd4a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/SpaceshipBCI/ovavrdCSpaceshipBCI.h @@ -0,0 +1,132 @@ +#pragma once + +#include "../ovavrdCOgreVRApplication.h" + +namespace VRDemos { + +/** + * \class CSpaceshipBCI + * \author Laurent Bonnet (INRIA/IRISA) + * \date 2010-02-16 + * \brief Ogre application for the application "Use-The-Force". + * + * \details The SpaceshipBCI application is based on motor imagery of the feet. + * The 3D scene is a hangar, with few barrels stored. + * A spaceship is parked on the center of the screen. + * The subject has to move his feet to lift the spaceship. + * The feedback is computed according to the bounce of beta detected in the EEG, after the movement. + * + * Each trial has 3 steps: + * - Rest: the subject has to stand still. + * - Move: the subject moves his feet. + * - NoMove: the subject stops. + * The subject scores if the spaceship is lifted in the NoMove phase. + */ +class CSpaceshipBCI final : public COgreVRApplication +{ +public: + + /** + * \brief constructor. + */ + explicit CSpaceshipBCI(const std::string& localization = "eng"); + +private: + + /** + * \brief Phases enumeration. + */ + enum + { + Phase_Rest, ///< The subject stands still. + Phase_Move, ///< The subject moves his feet. + Phase_NoMove, ///< The subject stops the movement. + }; + + /** + * \brief Stage enumeration. + */ + enum + { + Stage_Baseline, ///< The subject stands still. + Stage_FreetimeReal, ///< The subject iterates 10 times with real movements + Stage_FreetimeImaginary, ///< The subject iterates 10 times with imaginary movements + Stage_Statistics, ///< Experiment is over, uninitialize() is called. + }; + + /** + * \brief Initializes the scene, camera, lights and GUI. + * \return \em true if the scene is successfully set up. + */ + bool initialise() override; + + //----- SCENE COMPONENTS -----// + /** + * \brief Loads the GUI. + */ + void loadGUI(); + /** + * \brief Loads the hangar. + */ + void loadHangar() const; + /** + * \brief Populates the hangar with fixed barrels. + */ + void loadHangarBarrels() const; + + /** + * \brief Loads the movable spaceship. + */ + void loadShip(); + /** + * \brief Loads the movable barrels in front of the ship. + */ + void loadBarrels(); + + /** + * \brief Lifts the barrels and spaceship according to the feedback received from the analog server. + */ + bool process(double timeSinceLastProcess) override; + + void processStageFreetime(double timeSinceLastProcess); + + int m_score = 0; /// m_smallObjHeight; /// m_smallObjOrientation; /// m_localizedFilenames; + std::string m_localization; +}; +} // namespace VRDemos diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ovaCAbstractVrpnPeripheral.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ovaCAbstractVrpnPeripheral.cpp new file mode 100644 index 0000000..037f84a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ovaCAbstractVrpnPeripheral.cpp @@ -0,0 +1,69 @@ +#include "ovaCAbstractVrpnPeripheral.h" + +#include +#include +#include + +class CDeviceInfo +{ +public: + std::string m_Address; + vrpn_Button_Remote* m_Button = nullptr; + vrpn_Analog_Remote* m_Analog = nullptr; +}; + +namespace VRDemos { + +static void VRPN_CALLBACK handle_button(void* data, const vrpn_BUTTONCB b) +{ + CAbstractVrpnPeripheral* abstractVrpnPeripheral = static_cast(data); + + std::pair vrpnButtonState; + vrpnButtonState.first = b.button; + vrpnButtonState.second = b.state; + + abstractVrpnPeripheral->m_Buttons.push_back(vrpnButtonState); +} + +static void VRPN_CALLBACK handle_analog(void* data, const vrpn_ANALOGCB a) +{ + CAbstractVrpnPeripheral* abstractVrpnPeripheral = static_cast(data); + std::list vrpnAnalogState; + + for (int i = 0; i < a.num_channel; ++i) + { + vrpnAnalogState.push_back(a.channel[i] * abstractVrpnPeripheral->m_AnalogScale + abstractVrpnPeripheral->m_AnalogOffset); + } + + abstractVrpnPeripheral->m_Analogs.push_back(vrpnAnalogState); +} + +CAbstractVrpnPeripheral::~CAbstractVrpnPeripheral() +{ + if (m_Device) + { + delete m_Device->m_Analog; + delete m_Device->m_Button; + delete m_Device; + m_Device = nullptr; + } +} + +void CAbstractVrpnPeripheral::init() +{ + m_Device = new CDeviceInfo; + m_Device->m_Address = m_Address; + m_Device->m_Analog = new vrpn_Analog_Remote(m_Address.c_str()); + m_Device->m_Button = new vrpn_Button_Remote(m_Address.c_str()); + + m_Device->m_Button->register_change_handler(this, &handle_button); + m_Device->m_Analog->register_change_handler(this, &handle_analog); +} + +void CAbstractVrpnPeripheral::loop() const +{ + m_Device->m_Button->mainloop(); + m_Device->m_Analog->mainloop(); +} + +} // namespace VRDemos diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ovaCAbstractVrpnPeripheral.h b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ovaCAbstractVrpnPeripheral.h new file mode 100644 index 0000000..2e9206e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ovaCAbstractVrpnPeripheral.h @@ -0,0 +1,54 @@ +#pragma once + +class CDeviceInfo; + +#include +#include + +namespace VRDemos { +/** + * \class CAbstractVrpnPeripheral + * \author Laurent Bonnet (INRIA/IRISA) + * \date 2010-02-16 + * \brief A VRPN peripheral abstraction, client side. + * + * \details The CAbstractVrpnPeripheral handles the connection to at most one Analog Server and one Button Server. + * + */ +class CAbstractVrpnPeripheral final +{ +public: + + std::list> m_Buttons; ///< list (chronological) of pairs (button_id, button_state). + std::list> m_Analogs; ///< list (chronological) of list (channels) of values. + double m_AnalogScale = 1; ///< Scalar applied to any value read on the Analog server. + double m_AnalogOffset = 0; ///< Offset applied to any value read on the Analog server. + + std::string m_Address = "openvibe-vrpn@localhost"; ///< The device address ([peripheral-name]@[hostname]). + CDeviceInfo* m_Device = nullptr; ///< The VRPN Device + + /** + * \brief Default constructor. + */ + CAbstractVrpnPeripheral() {} + /** + * \brief Constructor. + * \param adress The device address. + */ + explicit CAbstractVrpnPeripheral(const std::string& adress) { m_Address = adress; } + /** + * \brief Destructor. + */ + ~CAbstractVrpnPeripheral(); + + /** + * \brief Initialize the VRPN Remote object and handlers. + */ + void init(); + + /** + * \brief Main loop. + */ + void loop() const; +}; +} // namespace VRDemos diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ova_defines.h b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ova_defines.h new file mode 100644 index 0000000..6f70f09 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ova_defines.h @@ -0,0 +1 @@ +#pragma once diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ovavrdCOgreVRApplication.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ovavrdCOgreVRApplication.cpp new file mode 100644 index 0000000..4d05fa0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ovavrdCOgreVRApplication.cpp @@ -0,0 +1,350 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovavrdCOgreVRApplication.h" + +#include +#include + +#include + +#include + +#include + +#if defined sleep +#undef sleep +#endif + +namespace VRDemos { + +static const float ROTATION_SPEED_MOUSE = 0.5F; +static const float TRANSLATION_SPEED = 0.2F; + +COgreVRApplication::~COgreVRApplication() +{ + if (m_sceneManager) { m_sceneManager->clearScene(); }// does not destroy cameras + delete m_vrpnPeripheral; + delete m_camera; + delete m_window; + + if (m_inputManager) + { + if (m_mouse) + { + m_inputManager->destroyInputObject(m_mouse); + m_mouse = nullptr; + } + + if (m_keyboard) + { + m_inputManager->destroyInputObject(m_keyboard); + m_keyboard = nullptr; + } + + m_inputManager->destroyInputSystem(m_inputManager); + } + + if (m_guiRenderer) { CEGUI::OgreRenderer::destroySystem(); } +} + +void COgreVRApplication::go() +{ + if (!this->setup()) + { + std::cerr << "[FAILED] Setup failed, end of program." << std::endl; + return; + } + + this->initialise(); + + std::cout << std::endl << "START RENDERING..." << std::endl; + + m_root->startRendering(); +} + +bool COgreVRApplication::setup() +{ + // Plugin config path setup + Ogre::String pluginsPath; +#if defined TARGET_OS_Windows +#if defined TARGET_BUILDTYPE_Debug + pluginsPath = std::string(getenv("OGRE_HOME")) + std::string("/bin/debug/plugins_d.cfg"); +#else + pluginsPath = std::string(getenv("OGRE_HOME")) + std::string("/bin/release/plugins.cfg"); +#endif +#elif defined TARGET_OS_Linux + pluginsPath = std::string(OpenViBE::Directories::getDataDir()) + std::string("/openvibe-ogre-plugins.cfg"); +#else + #error "failing text" +#endif + + // Create LogManager to stop Ogre flooding the console and creating random files + const OpenViBE::CString ogreLog = OpenViBE::Directories::getLogDir() + "/openvibe-vr-demo-ogre.log"; + std::cout << "+ Ogre log will be in " << ogreLog << "\n"; + Ogre::LogManager* logManagerSingleton = new Ogre::LogManager(); + FS::Files::createParentPath(ogreLog); + logManagerSingleton->createLog(ogreLog.toASCIIString(), true, false, false); + + // Root creation + const OpenViBE::CString ogreCfg = OpenViBE::Directories::getUserDataDir() + "/openvibe-vr-demo-ogre.cfg"; + std::cout << "+ Ogre cfg will be in " << ogreCfg << "\n"; + m_root = new Ogre::Root(pluginsPath, ogreCfg.toASCIIString(), ogreLog.toASCIIString()); + // Resource handling + this->setupResources(); + //Configuration from file or dialog window if needed + if (!this->configure()) + { + std::cerr << "[FAILED] The configuration process ended unexpectedly." << std::endl; + return false; + } + + // load ressources + Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); + + // Scene graph and rendering initialisation + // m_sceneManager = m_root->createSceneManager("TerrainSceneManager", "DefaultSceneManager"); + m_sceneManager = m_root->createSceneManager(Ogre::ST_GENERIC); + + //Camera + m_camera = m_sceneManager->createCamera("DefaultCamera"); + m_cameraNode = m_sceneManager->getRootSceneNode()->createChildSceneNode(); + m_cameraNode->attachObject(m_camera); + //m_cameraNodeYawAndPos = m_sceneManager->getRootSceneNode()->createChildSceneNode(); + //m_cameraNodeYawAndPos->setPosition(Ogre::Vector3::ZERO); + //m_cameraNodeYawAndPos->setOrientation(Ogre::Quaternion::IDENTITY); + + //m_cameraNodePitch = m_cameraNodeYawAndPos->createChildSceneNode(); + //m_cameraNodePitch->setPosition(Ogre::Vector3::ZERO); + //m_cameraNodePitch->setOrientation(Ogre::Quaternion::IDENTITY); + // + //m_cameraNodePitch->attachObject(m_camera); + + m_camera->setNearClipDistance(0.05F); + m_camera->setFarClipDistance(300.0F); + m_camera->setRenderingDistance(0.01F); + + // Create one viewport, entire window + Ogre::Viewport* viewPort = m_window->addViewport(m_camera); + viewPort->setBackgroundColour(Ogre::ColourValue(0, 0, 0)); + // Alter the camera aspect ratio to match the viewport + m_camera->setAspectRatio(Ogre::Real(viewPort->getActualWidth()) / Ogre::Real(viewPort->getActualHeight())); + + // Set default mipmap level (NB some APIs ignore this) + Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5); + + //Listening the frame rendering + m_root->addFrameListener(this); + + //Listening the window events + Ogre::WindowEventUtilities::addWindowEventListener(m_window, this); + + //OIS + this->initOIS(); + + //CEGUI + this->initCEGUI(OpenViBE::Directories::getLogDir() + "/openvibe-vr-demo-cegui.log"); + + //VRPN + const std::string vrpnAddress("openvibe-vrpn@localhost"); + m_vrpnPeripheral = new CAbstractVrpnPeripheral(vrpnAddress); + m_vrpnPeripheral->init(); + + std::cout << "Listening to VRPN address [" << vrpnAddress << "]\n"; + + return true; +} + +void COgreVRApplication::setupResources() +{ + // Load resource paths from config file + Ogre::ConfigFile configFile; + configFile.load(m_resourcePath + "/resources.cfg"); + // Go through all sections & settings in the file + Ogre::ConfigFile::SectionIterator it = configFile.getSectionIterator(); + + while (it.hasMoreElements()) + { + Ogre::String secName = it.peekNextKey(); + Ogre::ConfigFile::SettingsMultiMap* settings = it.getNext(); + for (auto i = settings->begin(); i != settings->end(); ++i) + { + Ogre::String typeName = i->first; + Ogre::String archName = i->second; + Ogre::ResourceGroupManager::getSingleton().addResourceLocation(m_resourcePath + "/" + archName, typeName, secName); + } + } +} + +bool COgreVRApplication::configure() +{ + if (! m_root->restoreConfig()) + { + if (! m_root->showConfigDialog()) + { + std::cerr << "[FAILED] No configuration created from the dialog window." << std::endl; + return false; + } + } + + m_window = m_root->initialise(true, "VR Application - powered by OpenViBE"); + + return true; +} + +bool COgreVRApplication::initOIS() +{ + OIS::ParamList paramList; + size_t windowHnd = 0; + std::ostringstream windowHndStr; + + // Retrieve the rendering window + Ogre::RenderWindow* window = Ogre::Root::getSingleton().getAutoCreatedWindow(); + window->getCustomAttribute("WINDOW", &windowHnd); + windowHndStr << windowHnd; + paramList.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str())); + paramList.insert(std::make_pair(std::string("x11_mouse_grab"), std::string("false"))); + paramList.insert(std::make_pair(std::string("x11_keyboard_grab"), std::string("false"))); + + // Create the input manager + m_inputManager = OIS::InputManager::createInputSystem(paramList); + + //Create all devices + m_keyboard = dynamic_cast(m_inputManager->createInputObject(OIS::OISKeyboard, true)); + m_mouse = dynamic_cast(m_inputManager->createInputObject(OIS::OISMouse, true)); + + m_keyboard->setEventCallback(this); + m_mouse->setEventCallback(this); + + std::cout << "OIS initialised" << std::endl; + + return true; +} + +bool COgreVRApplication::initCEGUI(const char* logFilename) +{ + // Instantiate logger before bootstrapping the system, this way we will be able to get the log redirected + if (!CEGUI::Logger::getSingletonPtr()) + { + new CEGUI::DefaultLogger(); // Singleton, instantiate only, no delete + } + std::cout << "+ CEGUI log will be in " << logFilename << "\n"; + FS::Files::createParentPath(logFilename); + try { CEGUI::Logger::getSingleton().setLogFilename(logFilename, false); } + catch (char* error) { std::cout << " CEGUI::getSingleton() exception: " << error << "\n"; } + //catch (const char* error) { std::cout << " CEGUI::getSingleTon() exception: " << error << "\n"; } + + m_guiRenderer = &(CEGUI::OgreRenderer::bootstrapSystem(*m_window)); + +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) + CEGUI::SchemeManager::getSingleton().createFromFile(const_cast(reinterpret_cast("TaharezLook-ov-0.8.scheme"))); + m_guiManager = CEGUI::WindowManager::getSingletonPtr(); + m_sheet = m_guiManager->createWindow("DefaultWindow", "root"); + CEGUI::System::getSingleton().getDefaultGUIContext().setRootWindow(m_sheet); +#else + CEGUI::SchemeManager::getSingleton().create((CEGUI::utf8*)"TaharezLook-ov.scheme"); + m_guiManager = CEGUI::WindowManager::getSingletonPtr(); + m_sheet = m_guiManager->createWindow("DefaultGUISheet", "Sheet"); + CEGUI::System::getSingleton().setGUISheet(m_sheet); +#endif + + return true; +} + + +//-------------------------------------------------------------- + +bool COgreVRApplication::keyPressed(const OIS::KeyEvent& evt) +{ + if (evt.key == OIS::KC_ESCAPE) + { + std::cout << "[ESC] pressed, user termination." << std::endl; + m_bContinue = false; + } + if (evt.key == OIS::KC_RCONTROL) + { + std::cout << "Camera mode ON" << std::endl; + m_bCameraMode = true; + } + + + if (evt.key == OIS::KC_UP) { m_keysPressed[OIS::KC_UP] = true; } + if (evt.key == OIS::KC_RIGHT) { m_keysPressed[OIS::KC_RIGHT] = true; } + if (evt.key == OIS::KC_LEFT) { m_keysPressed[OIS::KC_LEFT] = true; } + if (evt.key == OIS::KC_DOWN) { m_keysPressed[OIS::KC_DOWN] = true; } + + return true; +} + + +bool COgreVRApplication::keyReleased(const OIS::KeyEvent& evt) +{ + if (evt.key == OIS::KC_RCONTROL) + { + std::cout << "Camera mode OFF" << std::endl; + m_bCameraMode = false; + } + + if (evt.key == OIS::KC_UP) { m_keysPressed[OIS::KC_UP] = false; } + if (evt.key == OIS::KC_RIGHT) { m_keysPressed[OIS::KC_RIGHT] = false; } + if (evt.key == OIS::KC_LEFT) { m_keysPressed[OIS::KC_LEFT] = false; } + if (evt.key == OIS::KC_DOWN) { m_keysPressed[OIS::KC_DOWN] = false; } + + + return true; +} + +bool COgreVRApplication::mouseMoved(const OIS::MouseEvent& arg) +{ + if (m_bCameraMode) + { + m_camera->yaw(Ogre::Degree(-float(arg.state.X.rel) * ROTATION_SPEED_MOUSE)); + m_camera->pitch(Ogre::Degree(-float(arg.state.Y.rel) * ROTATION_SPEED_MOUSE)); + } + + return true; +} + +void COgreVRApplication::updateCamera() +{ + Ogre::Vector3 translation(0, 0, 0); + if (m_keysPressed[OIS::KC_UP]) { translation.z -= TRANSLATION_SPEED; } + if (m_keysPressed[OIS::KC_RIGHT]) { translation.x += TRANSLATION_SPEED; } + if (m_keysPressed[OIS::KC_LEFT]) { translation.x -= TRANSLATION_SPEED; } + if (m_keysPressed[OIS::KC_DOWN]) { translation.z += TRANSLATION_SPEED; } + const Ogre::Vector3 vectorFinal = m_camera->getDerivedOrientation() * translation; + m_cameraNode->translate(vectorFinal, Ogre::Node::TS_WORLD); +} + +bool COgreVRApplication::frameStarted(const Ogre::FrameEvent& evt) +{ + m_clock += evt.timeSinceLastFrame; + if (m_clock >= 1 / MAX_FREQUENCY) + { + m_keyboard->capture(); + m_mouse->capture(); + + m_vrpnPeripheral->loop(); + //the button states are added in the peripheric, but they have to be popped. + //the basic class does not pop the states. + + if (m_bCameraMode) { this->updateCamera(); } + + m_bContinue = this->process(m_clock); + m_clock -= 1 / MAX_FREQUENCY; + } + else { System::Time::sleep(1); } + + return m_bContinue; +} + +void COgreVRApplication::windowResized(Ogre::RenderWindow* rw) +{ +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) + CEGUI::System::getSingleton().notifyDisplaySizeChanged(CEGUI::Sizef(float(rw->getWidth()), float(rw->getHeight()))); +#else + CEGUI::System::getSingleton().notifyDisplaySizeChanged(CEGUI::Size(float(rw->getWidth()), float(rw->getHeight()))); +#endif +} + +} // namespace VRDemos +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ovavrdCOgreVRApplication.h b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ovavrdCOgreVRApplication.h new file mode 100644 index 0000000..9bbe53a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ovavrdCOgreVRApplication.h @@ -0,0 +1,173 @@ +#pragma once + +#include "ova_defines.h" +#include +#include +#include +#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8) +#include +#else +#include +#endif + +#include "ovaCAbstractVrpnPeripheral.h" + +#include + +#define MAX_FREQUENCY 60.f + +/** + * \namespace VRDemos + * \author Laurent Bonnet (INRIA/IRISA) + * \date 2010-02-16 + * \brief Contains all VR-demos related code (Ogre application and VRPN peripheral). + */ +namespace VRDemos { + +/** + * \class COgreVRApplication + * \author Laurent Bonnet (INRIA/IRISA) + * \date 2010-02-16 + * \brief Basic framework to design VR applications. + * + * \details This class is based on Ogre3D, and should be derived to design a specific VR application. + * It handles the rendering engine setup and configuration. Developer has to initialise the right 3D scene, + * and give the loop code that will be called each time a frame is rendered. + */ +class COgreVRApplication : public Ogre::FrameListener, OIS::KeyListener, OIS::MouseListener, Ogre::WindowEventListener +{ +public: + + /** + * \brief Default constructor. + */ + explicit COgreVRApplication(const char* root) : m_resourcePath(root) { } + + /** + * \brief Destructor. + */ + ~COgreVRApplication() override; + + /** + * \brief Launches the application (engine setup, initialization, rendering start). + */ + virtual void go(); + +protected: + /** + * \brief Main Ogre and custom setup steps + * \return \em true if the setup is a success. + */ + virtual bool setup(); + + /** + * \brief Configuration management + * \return \em true if the configuration step is a success. + */ + virtual bool configure(); + + /** + * \brief Parsing of the resource configuration file + */ + virtual void setupResources(); + + bool m_bContinue = true; ///< Tells if the rendering process should continue after the current frame. + + //----- Main Ogre objects ------// + Ogre::Root* m_root = nullptr; ///< Ogre root. + Ogre::SceneManager* m_sceneManager = nullptr; ///< The scene manager used. + Ogre::RenderWindow* m_window = nullptr; ///< The render window used. + Ogre::Camera* m_camera = nullptr; ///< The camera used. + Ogre::SceneNode* m_cameraNode = nullptr; ///< The camera node. + + Ogre::String m_resourcePath; ///< Path to the file resource.cfg for Ogre. + + bool m_bCameraMode = false; + std::map m_keysPressed; + virtual void updateCamera(); + + /** + * \brief Initialize the scene. This function has to be implemented + * with the specific Ogre code. + * \return \em true if the initialization process is a success. + */ + virtual bool initialise() = 0; + /** + * \brief Main loop. Developer has to implement this function + * with the specific behaviour of its a application. + * \return \em true if the configuration step is a success. + */ + virtual bool process(double timeSinceLastProcess) = 0; + + /** + * \brief Frame started callback. + */ + bool frameStarted(const Ogre::FrameEvent& evt) override; + + /** + * \brief Frame ended callback. + * \return \em true if the rendering engine should continue. + */ + bool frameEnded(const Ogre::FrameEvent& /*evt*/) override { return true; } + + //-------OIS-------// + OIS::InputManager* m_inputManager = nullptr; ///< The OIS input manager. + OIS::Mouse* m_mouse = nullptr; ///< The mouse. + OIS::Keyboard* m_keyboard = nullptr; ///< The keyboard. + + /** + * \brief Initialize the OIS plugin. + * \return \em true if the setup is a success. + */ + virtual bool initOIS(); + + /** + * \brief Mouse moved callback, launched when the mouse is moved. + * \return \em true if the rendering engine should continue. + */ + bool mouseMoved(const OIS::MouseEvent& arg) override; + + /** + * \brief Mouse pressed callback, launched when a mouse button is pressed. + * \return \em true if the rendering engine should continue. + */ + bool mousePressed(const OIS::MouseEvent& /*arg*/, OIS::MouseButtonID /*id*/) override { return true; } + + /** + * \brief Mouse released callback, launched when a mouse button is released. + * \return \em true if the rendering engine should continue. + */ + bool mouseReleased(const OIS::MouseEvent& /*arg*/, OIS::MouseButtonID /*id*/) override { return true; } + + /** + * \brief Key pressed callback, launched when a key is pressed. + * \return \em true if the rendering engine should continue. + */ + bool keyPressed(const OIS::KeyEvent& evt) override; + /** + * \brief Key released callback, launched when a key is released. + * \return \em true if the rendering engine should continue. + */ + bool keyReleased(const OIS::KeyEvent& evt) override; + + void windowResized(Ogre::RenderWindow* rw) override; + + //-------CEGUI-------// + CEGUI::OgreRenderer* m_guiRenderer = nullptr; ///< The CEGUI renderer. + //CEGUI::System& m_rGUISystem; ///< The CEGUI system. + CEGUI::WindowManager* m_guiManager = nullptr; ///< The CEGUI window manager. + CEGUI::Window* m_sheet = nullptr; ///< The default sheet. + + /** + * \brief Initialize the CEGUI plugin. + * \return \em true if the setup is a success. + */ + virtual bool initCEGUI(const char* logFilename); + + //-------VRPN-------// + CAbstractVrpnPeripheral* m_vrpnPeripheral = nullptr;///< A VRPN peripheric, handles at most one Analog + one Button server. + + //------CLOCK------// + double m_clock = 0; ///< Clock to impose a maximum frequency. +}; +} // namespace VRDemos diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ovavrd_main.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ovavrd_main.cpp new file mode 100644 index 0000000..6d5c705 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/src/ovavrd_main.cpp @@ -0,0 +1,72 @@ +#if defined(TARGET_HAS_ThirdPartyOgre3D) + +#include "ovavrdCOgreVRApplication.h" + +#include "HandballBCI/ovavrdCHandballBCI.h" +#include "SpaceshipBCI/ovavrdCSpaceshipBCI.h" + +int main(const int argc, char** argv) +{ + if (argc < 2) + { + std::cout << "Syntax: " << argv[0] << " demo-name\n\n"; + std::cout << "where demo-name could be one of the following :\n"; + std::cout << " - spaceship\n"; + std::cout << " - handball\n"; + return 1; + } + + VRDemos::COgreVRApplication* app; + if (strcmp(argv[1], "spaceship") == 0) + { + std::string localization = "eng"; + if (argc != 3) { std::cout << "No language selected. Default is: english (eng).\n\n"; } + else + { + localization = argv[2]; + std::cout << "User defined language: " << localization << "\n"; + std::cout << "WARNING: if the language keyword is not found, default language will be loaded (eng).\n\n"; + } + std::cout << std::endl; + + + std::cout << " ___ _.'\\ /'._ ___ \n"; + std::cout << "/ b__--- | .'\"'. | ---__d \\\n"; + std::cout << "\\ p\"\"---_| '._.' |_---\"\"q /\n"; + std::cout << " / / ./ \\. \\ \\ \n"; + std::cout << " / / '---' \\ \\ \n"; + std::cout << " /_/ \\_\\ \n"; + std::cout << " \n\n"; + std::cout << "Application started! Lift 'em!\n\n"; + + app = new VRDemos::CSpaceshipBCI(localization); + } + else if (strcmp(argv[1], "handball") == 0) + { + std::cout << "Handball application started !\n"; + app = new VRDemos::CHandballBCI(); + } + else + { + std::cout << "ERROR: the application specified does not exist (" << argv[1] << ").\n"; + std::cout << "Please use one of the following applications:\n"; + std::cout << " - spaceship\n"; + std::cout << " - handball\n"; + return 2; + } + + app->go(); + delete app; + + return 0; +} + +#else +#include + +int main(int argc, char** argv) +{ + std::cout << "VR demo has not been compiled as it depends on Ogre (missing/disabled)\n"; + return -1; +} +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaC3DEntityManipulator.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaC3DEntityManipulator.cpp new file mode 100644 index 0000000..d83e79d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaC3DEntityManipulator.cpp @@ -0,0 +1,126 @@ +#include "ovaC3DEntityManipulator.h" + +REGISTER_OBJECT_FACTORY(C3DEntityManipulator, "ovaC3DEntityManipulator"); + +C3DEntityManipulator::C3DEntityManipulator(OMK::Controller& controller, const OMK::ObjectDescriptor& objectDesc) : OMK::SimulatedObject(controller, objectDesc) { } + +C3DEntityManipulator::~C3DEntityManipulator() { } + +void C3DEntityManipulator::init() +{ + registerForSignal(g_sVrpnButtonStateUpdate); + registerForSignal(g_sVrpnAnalogStateUpdate); + + m_ballPosition[0] = 1000000; + m_ballPosition[1] = 1000000; + m_ballPosition[2] = 1000000; + + m_button[0] = false; + m_button[1] = false; + m_button[2] = false; +} + +void C3DEntityManipulator::compute() +{ + if (m_button[0] && m_Analogs.size()) + { + while (m_Analogs.size()) + { + double value = m_Analogs.front() * 0.002; + + m_ballSpeed[0] = 0; + m_ballSpeed[1] = 0; + m_ballSpeed[2] = value; + + m_ballPosition[0] += m_ballSpeed[0]; + m_ballPosition[1] += m_ballSpeed[1]; + m_ballPosition[2] += m_ballSpeed[2]; + + m_Analogs.pop_front(); + } + } + else + { + m_ballPosition[0] += m_ballSpeed[0]; + m_ballPosition[1] += m_ballSpeed[1]; + m_ballPosition[2] += m_ballSpeed[2]; + } + + const double viscosity = 0.010; + m_ballSpeed[0] *= (1 - viscosity); + m_ballSpeed[1] *= (1 - viscosity); + m_ballSpeed[2] *= (1 - viscosity); + + Position far; + far[0] = 1000000; + far[1] = 1000000; + far[2] = 1000000; + sendValuedEvent((m_button[1] || m_button[2]) ? "OpenViBE_ball" : "OpenViBE_passive_ball", g_sManipulate3DEntity_SetPosition, PositionType(m_ballPosition)); + sendValuedEvent((m_button[1] || m_button[2]) ? "OpenViBE_passive_ball" : "OpenViBE_ball", g_sManipulate3DEntity_SetPosition, PositionType(far)); + + Orientation orientation; + + orientation[0] = 0; + orientation[1] = (m_ballPosition[2] * 180.0 / M_PI) / 0.5; + orientation[2] = 0; + + sendValuedEvent("OpenViBE_passive_ball", g_sManipulate3DEntity_SetOrientation, OrientationType(orientation)); + sendValuedEvent("OpenViBE_ball", g_sManipulate3DEntity_SetOrientation, OrientationType(orientation)); + + if (m_ballPosition[2] < -7 || m_ballPosition[2]>7) + { + sendEvent(getName(), g_s3DEntityManipulator_Reset); + sendEvent("OpenViBE_goal_display", g_sManipulate3DEntity_Goal); + } +} + +bool C3DEntityManipulator::processEvent(OMK::Event* pEvent) +{ + if (pEvent->eventId == g_s3DEntityManipulator_Reset) + { + m_ballPosition[0] = 0; + m_ballPosition[1] = 0.5; + m_ballPosition[2] = 0; + + m_ballSpeed[0] = 0; + m_ballSpeed[1] = 0; + m_ballSpeed[2] = 0; + + return true; + } + + if (pEvent->eventId == g_sVrpnButtonStateUpdate) + { + VrpnButtonStateEvent* event = dynamic_cast (pEvent); + if (event) + { + const VrpnButtonState& vrpnButtonState = event->value; + if (vrpnButtonState.firsteventId == g_sVrpnAnalogStateUpdate) + { + VrpnAnalogStateEvent* event = dynamic_cast (pEvent); + if (event) + { + const VrpnAnalogState& vrpnAnalogState = event->value; + m_AnalogsCache.push_back(vrpnAnalogState.front()); + if (m_AnalogsCache.size() > 10) { m_AnalogsCache.pop_front(); } + + if (m_button[0]) + { + double analog = 0; + for (auto it = m_AnalogsCache.begin(); it != m_AnalogsCache.end(); ++it) { analog += *it; } + m_Analogs.push_back(analog / m_AnalogsCache.size()); + } + } + return true; + } + + return false; +} diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaC3DEntityManipulator.h b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaC3DEntityManipulator.h new file mode 100644 index 0000000..4b30f4b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaC3DEntityManipulator.h @@ -0,0 +1,22 @@ +#pragma once + +#include "ova_defines.h" + +class C3DEntityManipulator : public OMK::SimulatedObject +{ +public: + + DECLARE_OBJECT_FACTORY(C3DEntityManipulator); + + virtual void init(); + virtual void compute(); + virtual bool processEvent(OMK::Event* pEvent); + + bool m_button[3]; + std::list m_AnalogsCache; + std::list m_Analogs; + Wm4::Vector3f m_ballPosition; + Wm4::Vector3f m_ballSpeed; +}; + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCManipulable3DEntity.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCManipulable3DEntity.cpp new file mode 100644 index 0000000..12cefa2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCManipulable3DEntity.cpp @@ -0,0 +1,204 @@ +#include "ovaCManipulable3DEntity.h" + +REGISTER_OBJECT_FACTORY(CManipulable3DEntity, "ovaCManipulable3DEntity"); + +CManipulable3DEntity::CManipulable3DEntity(OMK::Controller& controller, const OMK::ObjectDescriptor& objectDesc) : OMK::SimulatedObject(controller, objectDesc) { } + +CManipulable3DEntity::~CManipulable3DEntity() { } + +/* + ,m_rPositionOutput(addOutput < OMK::Translation > ("position", new OMK::Polator < OMK::Translation > ())) + ,m_rOrientationOutput(addOutput < OMK::HPRRotation > ("orientation", new OMK::Polator < OMK::HPRRotation > ())) + ,m_rScaleOutput(addOutput < OMK::Scale > ("scale", new OMK::Polator < OMK::Scale > ())) + ,m_isGoal(false) +{ + visualiseOutput < OMK::vTranslationInputHandler >(m_rPositionOutput, "DCS_position") ; + visualiseOutput < OMK::vHPRRotationInputHandler >(m_rOrientationOutput, "DCS_orientation") ; + visualiseOutput < OMK::vScaleInputHandler >(m_rScaleOutput, "DCS_scale") ; +} +*/ + +void CManipulable3DEntity::init() { } +//void CManipulable3DEntity::init() { m_rTransformOutput.set(m_oTransform); } + +#define duration 1250 +#define fadein 500 +#define fadeout 500 + +void CManipulable3DEntity::compute() +{ + if (m_isGoal) + { + int delta = getSimulatedDate() - m_iGoalDate; + if (delta < duration) + { + if (delta < fadein) + { + double coef = (fadein - delta) / (double)fadein; // 1-0 + double rotation = 180 * pow(coef, 3); + m_orientation[0] = 0; + m_orientation[1] = 3 * rotation; + m_orientation[2] = rotation * sin(M_PI * pow(coef, 3) * 1); + + m_position[0] = 0; + m_position[1] = 5 + 7 * sin(coef * M_PI / 2); + m_position[2] = 0; + } + + if (delta > duration - fadeout) + { + double coef = (delta - duration + fadeout) / double(fadeout); // 0-1 + double rotation = 3 * 180 * pow(coef, 4); + m_orientation[0] = rotation; + m_orientation[1] = 3 * rotation * sin(M_PI * pow(coef, 3) * 2); + m_orientation[2] = 0; + + m_position[0] = 0; + m_position[1] = 5 + 7 * coef * sin(coef * M_PI / 2); + m_position[2] = 0; + } + if (delta >= fadein && delta <= duration - fadeout) + { + m_orientation[0] = 0; + m_orientation[1] = 0; + m_orientation[2] = 0; + + m_position[0] = 0; + m_position[1] = 5; + m_position[2] = 0; + } + } + } + /* + m_rTransformOutput.set(m_oTransform); + */ +} + +bool CManipulable3DEntity::processEvent(OMK::Event* pEvent) +{ + if (pEvent->eventId == g_sManipulate3DEntity_Goal) + { + m_isGoal = true; + m_iGoalDate = getSimulatedDate(); + } + + if (pEvent->eventId == g_sManipulate3DEntity_Reset) + { + m_position[0] = 0; + m_position[1] = 0.2; + m_position[2] = 0; + + m_orientation[0] = 0; + m_orientation[1] = 0; + m_orientation[2] = 0; + +#if defined _DEBUG_ + std::cout << "### reseted\n"; +#endif + return true; + } + + if (pEvent->eventId == g_sManipulate3DEntity_Translate) + { + PositionEvent* event = dynamic_cast (pEvent); + if (event) + { + const Position& value = event->value; + m_position[0] += value[0]; + m_position[1] += value[1]; + m_position[2] += value[2]; + +#if defined _DEBUG_ + std::cout << "### translated\n"; +#endif + return true; + } + } + + if (pEvent->eventId == g_sManipulate3DEntity_SetPosition) + { + PositionEvent* event = dynamic_cast (pEvent); + if (event) + { + const Position& value = event->value; + m_position[0] = value[0]; + m_position[1] = value[1]; + m_position[2] = value[2]; + +#if defined _DEBUG_ + std::cout << "### moved\n"; +#endif + return true; + } + } + + if (pEvent->eventId == g_sManipulate3DEntity_Scale) + { + ScaleEvent* event = dynamic_cast (pEvent); + if (event) + { + const Scale& value = event->value; + m_oScale[0] *= value[0]; + m_oScale[1] *= value[1]; + m_oScale[2] *= value[2]; + +#if defined _DEBUG_ + std::cout << "### scaled\n"; +#endif + return true; + } + } + + if (pEvent->eventId == g_sManipulate3DEntity_SetScale) + { + ScaleEvent* event = dynamic_cast (pEvent); + if (event) + { + const Scale& value = event->value; + m_oScale[0] = value[0]; + m_oScale[1] = value[1]; + m_oScale[2] = value[2]; + +#if defined _DEBUG_ + std::cout << "### scaled fixed\n"; +#endif + return true; + } + } + + if (pEvent->eventId == g_sManipulate3DEntity_Rotate) + { + OrientationEvent* event = dynamic_cast (pEvent); + if (event) + { + const Orientation& value = event->value; + m_orientation[0] += value[0]; + m_orientation[1] += value[1]; + m_orientation[2] += value[2]; + +#if defined _DEBUG_ + std::cout << "### rotated\n"; +#endif + return true; + } + } + + if (pEvent->eventId == g_sManipulate3DEntity_SetOrientation) + { + OrientationEvent* event = dynamic_cast (pEvent); + if (event) + { + const Orientation& value = event->value; + m_orientation[0] = value[0]; + m_orientation[1] = value[1]; + m_orientation[2] = value[2]; + +#if defined _DEBUG_ + std::cout << "### orirentation set\n"; +#endif + return true; + } + } + + return false; +} diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCManipulable3DEntity.h b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCManipulable3DEntity.h new file mode 100644 index 0000000..bd8685c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCManipulable3DEntity.h @@ -0,0 +1,27 @@ +#pragma once + +#include "ova_defines.h" + +class CManipulable3DEntity : public OMK::SimulatedObject +{ +public: + + DECLARE_OBJECT_FACTORY(CManipulable3DEntity); + + virtual void init(); + virtual void compute(); + virtual bool processEvent(OMK::Event* pEvent); + + Position m_position; + Orientation m_orientation; + Scale m_oScale; + + /* + OMK::Output < OMK::Type::Transform >& m_rTransformOutput; + */ + + bool m_isGoal = false; + int m_iGoalDat = 0; +}; + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCNeurofeedbackManipulator.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCNeurofeedbackManipulator.cpp new file mode 100644 index 0000000..5fa2b84 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCNeurofeedbackManipulator.cpp @@ -0,0 +1,152 @@ +#include "ovaCNeurofeedbackManipulator.h" + +#include +#include + +REGISTER_OBJECT_FACTORY(CNeurofeedbackManipulator, "ovaCNeurofeedbackManipulator"); + +CNeurofeedbackManipulator::CNeurofeedbackManipulator(OMK::Controller& controller, const OMK::ObjectDescriptor& objectDesc) :OMK::SimulatedObject(controller, objectDesc) { } + +CNeurofeedbackManipulator::~CNeurofeedbackManipulator() { } + +void CNeurofeedbackManipulator::init() +{ + static OMK::Name g_sVrpnAnalogStateUpdate("vrpn_analog state update"); + + _AnalogRotation_ = 0.25; + _AnalogScale_ = 0.004; + _AnalogSoften_ = 1; + _AnalogFall_ = .99; + + m_dLowestAnalogEver = 1E10; + m_dHighestAnalogEver = -1E10; + m_iLastPrint = -1; + + registerForSignal(g_sVrpnAnalogStateUpdate); + + OMK::ParametersAccessor::get < double >(getConfigurationParameters(), "_AnalogRotation_", _AnalogRotation_); + OMK::ParametersAccessor::get < double >(getConfigurationParameters(), "_AnalogScale_", _AnalogScale_); + OMK::ParametersAccessor::get < double >(getConfigurationParameters(), "_AnalogSoften_", _AnalogSoften_); + OMK::ParametersAccessor::get < double >(getConfigurationParameters(), "_AnalogFall_", _AnalogFall_); + + m_bFirstTime = true; + + m_position[0] = 4; + m_position[1] = 0; + m_position[2] = -3; + + m_orientation[0] = 0; + m_orientation[1] = 0; + m_orientation[2] = 0; + + m_dTotal = 0; + m_dCount = 0; +} + +void CNeurofeedbackManipulator::compute() +{ + auto itAnalog = m_Analogs.begin(); + auto itAnalogName = m_vAnalogName.begin(); + for (; itAnalog != m_Analogs.end(); ++itAnalog, ++itAnalogName) + { + double analog = (*itAnalog); + m_dTotal += analog; + m_dCount += 1.; + + if (analog > m_dHighestAnalogEver) m_dHighestAnalogEver = analog; + if (analog < m_dLowestAnalogEver) m_dLowestAnalogEver = analog; + if (m_iLastPrint != getSimulatedDate() / 1000) + { + m_iLastPrint = getSimulatedDate() / 1000; + +#if _DEBUG_ + std::cout << "Current session : mean/min/max = " + << (m_dTotal / m_dCount) << "/" + << m_dLowestAnalogEver << "/" + << m_dHighestAnalogEver << "/" + << "\n"; + + std::cout << "\n"; +#endif + + m_dTotal = 0; + m_dCount = 0; + m_dLowestAnalogEver = 1E10; + m_dHighestAnalogEver = -1E10; + } + + if (analog <= 0) + { + m_orientation[0] *= _AnalogFall_; + m_orientation[1] *= _AnalogFall_; + m_orientation[2] *= _AnalogFall_; + + m_position[1] *= _AnalogFall_; + } + else + { + m_orientation[0] += _AnalogRotation_ * ((rand() & 1) == 0 ? -1 : 1); + m_orientation[1] += _AnalogRotation_ * ((rand() & 1) == 0 ? -1 : 1); + m_orientation[2] += _AnalogRotation_ * ((rand() & 1) == 0 ? -1 : 1); + + m_position[1] += analog * _AnalogScale_; + + if (m_position[1] > 6) { m_position[1] = 6; } + } + + if (m_orientation[0] > 5) m_orientation[0] = 5; + if (m_orientation[1] > 5) m_orientation[1] = 5; + if (m_orientation[2] > 5) m_orientation[2] = 5; + + if (m_orientation[0] < -5) m_orientation[0] = -5; + if (m_orientation[1] < -5) m_orientation[1] = -5; + if (m_orientation[2] < -5) m_orientation[2] = -5; + + sendValuedEvent(*itAnalogName, g_sManipulate3DEntity_SetOrientation, OrientationType(m_orientation)); + sendValuedEvent(*itAnalogName, g_sManipulate3DEntity_SetPosition, PositionType(m_position)); + } +} + +bool CNeurofeedbackManipulator::processEvent(OMK::Event* pEvent) +{ + if (pEvent->eventId == g_sVrpnAnalogStateUpdate) + { + VrpnAnalogStateEvent* event = dynamic_cast (pEvent); + if (event) + { + VrpnAnalogState analogs = event->value; + + if (m_bFirstTime) + { + // create objects + size_t i = 0; + for (auto it1 = analogs.begin(); it1 != analogs.end(); ++it1) + { + const char* name = ("nf object " + std::to_string(i++)).c_str(); + m_vAnalogName.push_back(name); + + // OpenMASK won't let me delete those configuration parameters, + // However, way to go :o) + OMK::MultipleConfigurationParameter* userParams = new OMK::MultipleConfigurationParameter(); + userParams->appendSubDescriptorNamed("geometryFileName", new OMK::UniqueConfigurationParameter("./Data/neurofeedback.wrl")); + + getController().createObject(OMK::ObjectDescriptor(name, "ovManipulable3DEntity", getController().computeAdequateFrequency(75), userParams), getFathersDescriptor().getName()); + + m_Analogs.push_back(0); + } + m_bFirstTime = false; + } + + std::cout << "got data\n"; + + for (auto it1 = analogs.begin(), it2 = m_Analogs.begin(); it1 != analogs.end() && it2 != m_Analogs.end(); ++it1, ++it2) + { + *it2 = *it1 * _AnalogSoften_ + *it2 * (1 - _AnalogSoften_); + } + + return true; + } + } + + return false; +} diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCNeurofeedbackManipulator.h b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCNeurofeedbackManipulator.h new file mode 100644 index 0000000..0c89093 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCNeurofeedbackManipulator.h @@ -0,0 +1,32 @@ +#pragma once + +#include "ova_defines.h" + +class CNeurofeedbackManipulator : public OMK::SimulatedObject +{ +public: + + DECLARE_OBJECT_FACTORY(CNeurofeedbackManipulator); + + virtual void init(); + virtual void compute(); + virtual bool processEvent(OMK::Event* pEvent); + + Position m_position; + Orientation m_orientation; + VrpnAnalogState m_Analogs; + std::list < OMK::Name > m_vAnalogName; + bool m_bFirstTime = false; + double m_dLowestAnalogEver = 0; + double m_dHighestAnalogEver = 0; + double m_dTotal = 0; + double m_dCount = 0; + int m_iLastPrint = 0; + + double _AnalogRotation_ = 0; + double _AnalogScale_ = 0; + double _AnalogSoften_ = 0; + double _AnalogFall_ = 0; +}; + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCNeurofeedbackScoreCounter.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCNeurofeedbackScoreCounter.cpp new file mode 100644 index 0000000..dc57f5b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCNeurofeedbackScoreCounter.cpp @@ -0,0 +1,109 @@ +#include "ovaCNeurofeedbackScoreCounter.h" + +REGISTER_OBJECT_FACTORY(CNeurofeedbackScoreCounter, "ovaCNeurofeedbackScoreCounter"); + +CNeurofeedbackScoreCounter::CNeurofeedbackScoreCounter(OMK::Controller& controller, const OMK::ObjectDescriptor& objectDesc) + :OMK::SimulatedObject(controller, objectDesc) +{ +} + +CNeurofeedbackScoreCounter::~CNeurofeedbackScoreCounter() +{ +} + +void CNeurofeedbackScoreCounter::init() +{ + registerForSignal(g_sVrpnButtonStateUpdate); + registerForSignal(g_sVrpnAnalogStateUpdate); + + m_shouldCare = false; + m_wasZero = false; + m_score = 0; + + m_oScale[0] = 1; + m_oScale[1] = 1; + m_oScale[2] = 1; + + m_oScaleTarget[0] = 1; + m_oScaleTarget[1] = 1; + m_oScaleTarget[2] = 1; + + sendValuedEvent("OpenViBE_score_counter", g_sManipulate3DEntity_SetScale, ScaleType(m_oScale)); +} + +void CNeurofeedbackScoreCounter::compute() +{ + double speed = .01; + m_oScale = (float)speed * m_oScaleTarget + float(1 - speed) * m_oScale; + + sendValuedEvent("OpenViBE_score_counter", g_sManipulate3DEntity_SetScale, ScaleType(m_oScale)); +} + +bool CNeurofeedbackScoreCounter::processEvent(OMK::Event* pEvent) +{ + if (pEvent->eventId == g_sVrpnButtonStateUpdate) + { + VrpnButtonStateEvent* event = dynamic_cast (pEvent); + if (event) + { + const VrpnButtonState& vrpnButtonState = event->value; + if (vrpnButtonState.firsteventId == g_sVrpnAnalogStateUpdate) + { + VrpnAnalogStateEvent* event = dynamic_cast (pEvent); + if (event) + { + const VrpnAnalogState& vrpnAnalogState = event->value; + auto it = vrpnAnalogState.begin(); + if (m_wasZero) + { + if (*it >= 1E-3) + { + if (m_shouldCare) + { + m_oScaleTarget[1] += .2; + m_score += 1; + m_shouldCare = false; + std::cout << "NeW SCoRe : " << m_score << "\n"; + } + + m_wasZero = false; + + } + } + else + { + if (*it < 1E-3) + { + m_wasZero = true; + } + } + } + } + + return false; +} diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCNeurofeedbackScoreCounter.h b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCNeurofeedbackScoreCounter.h new file mode 100644 index 0000000..0ca5e9e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCNeurofeedbackScoreCounter.h @@ -0,0 +1,25 @@ +#pragma once + +#include "ova_defines.h" + +#include + +class CNeurofeedbackScoreCounter : public OMK::SimulatedObject +{ +public: + + DECLARE_OBJECT_FACTORY(CNeurofeedbackScoreCounter); + + virtual void init(); + virtual void compute(); + virtual bool processEvent(OMK::Event* pEvent); + + Scale m_oScale; + Scale m_oScaleTarget; + bool m_button[1024]; + bool m_shouldCare = false; + bool m_wasZero = false; + size_t m_score = 0; +}; + + diff --git a/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCNeurofeedbackSwitch.cpp b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCNeurofeedbackSwitch.cpp new file mode 100644 index 0000000..a59ee4b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/demos/vr-demo/test/ovaCNeurofeedbackSwitch.cpp @@ -0,0 +1,57 @@ +#include "ovaCNeurofeedbackSwitch.h" + +REGISTER_OBJECT_FACTORY(CNeurofeedbackSwitch, "ovaCNeurofeedbackSwitch"); + +CNeurofeedbackSwitch::CNeurofeedbackSwitch(OMK::Controller& controller, const OMK::ObjectDescriptor& objectDesc) + :OMK::SimulatedObject(controller, objectDesc) +{ +} + +CNeurofeedbackSwitch::~CNeurofeedbackSwitch() +{ +} + +void CNeurofeedbackSwitch::init() +{ + _FarAway_[0] = 1000; + _FarAway_[1] = 1000; + _FarAway_[2] = 1000; + + _Position_[0] = 0; + _Position_[1] = 0; + _Position_[2] = 0; + + sendValuedEvent("OpenViBE_ball", g_sManipulate3DEntity_SetPosition, PositionType(_FarAway_)); + sendValuedEvent("OpenViBE_passive_ball", g_sManipulate3DEntity_SetPosition, PositionType(_FarAway_)); + + registerForSignal(g_sVrpnButtonStateUpdate); +} + +void CNeurofeedbackSwitch::compute() +{ +} + +bool CNeurofeedbackSwitch::processEvent(OMK::Event* pEvent) +{ + if (pEvent->eventId == g_sVrpnButtonStateUpdate) + { + VrpnButtonStateEvent* event = dynamic_cast (pEvent); + if (event) + { + const VrpnButtonState& vrpnButtonState = event->value; + if (vrpnButtonState.first +#include + +class CNeurofeedbackSwitch : public OMK::SimulatedObject +{ +public: + + DECLARE_OBJECT_FACTORY(CNeurofeedbackSwitch); + + virtual void init(); + virtual void compute(); + virtual bool processEvent(OMK::Event* pEvent); + + bool m_button[1024]; + Position _Position_; + Position _FarAway_; +}; + + diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/developer-tools/CMakeLists.txt new file mode 100644 index 0000000..0d6c6ee --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/CMakeLists.txt @@ -0,0 +1,4 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("APPLICATIONS_DEVELOPER-TOOLS") + diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/CMakeLists.txt new file mode 100644 index 0000000..29ce2f8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/CMakeLists.txt @@ -0,0 +1,36 @@ + +IF(OV_DISABLE_GTK) + MESSAGE(STATUS "Skipping Plugin Inspector, no GTK") + RETURN() +ENDIF(OV_DISABLE_GTK) + +PROJECT(openvibe-plugin-inspector) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl) +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindThirdPartyGTK") + +# ---------------------- +# Generate launch script +# ---------------------- +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/applications/plugin-inspector) diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/share/plugin-inspector.conf b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/share/plugin-inspector.conf new file mode 100755 index 0000000..e86fb99 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/share/plugin-inspector.conf @@ -0,0 +1,15 @@ +##################################################################################### +# OpenViBE application plugin inspector configuration +##################################################################################### +# Note: The PluginInspector variables based on ${Path_Root} only make sense in dev environment and have been disabled for release +Path_Root = .. +PluginInspector_DumpGlobalDefinesDirectory = ${Path_Root} +PluginInspector_DumpAlgorithmSnapshotDirectory = ${Path_Root}/../documentation/src/algorithm-snapshots +PluginInspector_DumpAlgorithmDocTemplateDirectory = ${Path_Root}/../documentation/src/algorithm-doc +PluginInspector_DumpBoxAlgorithmSnapshotDirectory = ${Path_Root}/../documentation/src/box-algorithm-snapshots +PluginInspector_DumpBoxAlgorithmDocTemplateDirectory = ${Path_Root}/../documentation/src/box-algorithm-doc +#PluginInspector_DumpGlobalDefinesDirectory = +#PluginInspector_DumpAlgorithmSnapshotDirectory = +#PluginInspector_DumpAlgorithmDocTemplateDirectory = +#PluginInspector_DumpBoxAlgorithmSnapshotDirectory = +#PluginInspector_DumpBoxAlgorithmDocTemplateDirectory = diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CAlgorithmGlobalDefinesGen.cpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CAlgorithmGlobalDefinesGen.cpp new file mode 100644 index 0000000..350a15b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CAlgorithmGlobalDefinesGen.cpp @@ -0,0 +1,121 @@ +#include "CAlgorithmGlobalDefinesGen.hpp" + +#include +#include + +namespace OpenViBE { +namespace PluginInspector { + +CAlgorithmGlobalDefinesGen::CAlgorithmGlobalDefinesGen(const Kernel::IKernelContext& ctx, const std::string& filename) + : CPluginObjectDescEnum(ctx) +{ + m_usedIDs.clear(); + + const std::string fullFilename = filename + "/ovp_global_defines.h"; + + getLogManager() << Kernel::LogLevel_Info << "Writing global defines to '" << fullFilename << "\n"; + + m_file.open(fullFilename.c_str()); + + OV_ERROR_UNLESS_K(m_file.good(), "Error opening '" << fullFilename << "for writing.", Kernel::ErrorType::BadFileRead,) + ; // Please note the ",)" to simulate "return;" + + m_file << "#pragma once\n\n// This file was automatically generated by Plugin Inspector\n\n"; +} + +CAlgorithmGlobalDefinesGen::~CAlgorithmGlobalDefinesGen() +{ + if (!m_file.good()) { return; } + + m_file << "\n"; + m_file.close(); +} + +void CAlgorithmGlobalDefinesGen::addIdentifier(const std::string& objectName, const CIdentifier& candidate, const std::string& spaces) +{ + if (m_usedIDs.find(candidate) == m_usedIDs.end()) + { + m_usedIDs[candidate] = objectName; + m_file << "#define " << objectName << spaces << "CIdentifier" << candidate.str() << "\n"; + } + else + { + OV_WARNING_K(" Object '" << objectName << "' has duplicate id " << candidate.str() << " with " << m_usedIDs[candidate]) ; + m_file << "#define " << objectName << spaces << "CIdentifier" << candidate.str() << " // Duplicate of " << m_usedIDs[candidate] << "\n"; + } +} + +bool CAlgorithmGlobalDefinesGen::callback(const Plugins::IPluginObjectDesc& pluginObjectDesc) +{ + OV_ERROR_UNLESS_KRF(m_file.good(), "Cannot use file; Was it opened correctly ?", Kernel::ErrorType::BadProcessing); + + int width = 120; + + getLogManager() << Kernel::LogLevel_Info << " Dumping [" << pluginObjectDesc.getName() << "]\n"; + + Kernel::IAlgorithmManager& manager = m_kernelCtx.getAlgorithmManager(); + const CIdentifier algorithmId = manager.createAlgorithm(pluginObjectDesc.getCreatedClass()); + OV_ERROR_UNLESS_KRF(algorithmId != CIdentifier::undefined(), " Unable to create algorithm", Kernel::ErrorType::BadProcessing); + + Kernel::IAlgorithmProxy& proxy = manager.getAlgorithm(algorithmId); + + m_file << "// -----------------------------------------------------\n"; + m_file << "// " << pluginObjectDesc.getName().toASCIIString() << "\n"; + m_file << "// -----------------------------------------------------\n"; + m_file << "\n"; + + proxy.initialize(); + + const auto addIdentifierFromParameters = [&width, &pluginObjectDesc, this](const char* nameStart, const char* nameEnd, const CIdentifier& id, + const std::string& toAppend) + { + std::string defName; + defName += nameStart; + defName += transform(pluginObjectDesc.getName().toASCIIString(), true); + defName += nameEnd; + if (!toAppend.empty()) { defName += transform(toAppend, true); } + + std::string spaces; + spaces.resize(width - defName.length(), ' '); + + addIdentifier(defName.c_str(), id, spaces.c_str()); + }; + + addIdentifierFromParameters("OVP_GD_ClassId_Algorithm_", "", pluginObjectDesc.getCreatedClassIdentifier(), ""); + addIdentifierFromParameters("OVP_GD_ClassId_Algorithm_", "Desc", pluginObjectDesc.getCreatedClassIdentifier(), ""); + + CIdentifier id = CIdentifier::undefined(); + while ((id = proxy.getNextInputParameterIdentifier(id)) != CIdentifier::undefined()) + { + addIdentifierFromParameters("OVP_GD_Algorithm_", "_InputParameterId_", id, proxy.getInputParameterName(id).toASCIIString()); + } + + id = CIdentifier::undefined(); + while ((id = proxy.getNextOutputParameterIdentifier(id)) != CIdentifier::undefined()) + { + addIdentifierFromParameters("OVP_GD_Algorithm_", "_OutputParameterId_", id, proxy.getOutputParameterName(id).toASCIIString()); + } + + id = CIdentifier::undefined(); + while ((id = proxy.getNextInputTriggerIdentifier(id)) != CIdentifier::undefined()) + { + addIdentifierFromParameters("OVP_GD_Algorithm_", "_InputTriggerId_", id, proxy.getInputTriggerName(id).toASCIIString()); + } + + id = CIdentifier::undefined(); + while ((id = proxy.getNextOutputTriggerIdentifier(id)) != CIdentifier::undefined()) + { + addIdentifierFromParameters("OVP_GD_Algorithm_", "_OutputTriggerId_", id, proxy.getOutputTriggerName(id).toASCIIString()); + } + + proxy.uninitialize(); + + m_file << "\n"; + + manager.releaseAlgorithm(proxy); + + return true; +} + +} // namespace PluginInspector +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CAlgorithmGlobalDefinesGen.hpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CAlgorithmGlobalDefinesGen.hpp new file mode 100644 index 0000000..47e2dc9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CAlgorithmGlobalDefinesGen.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include "CPluginObjectDescEnum.hpp" + +#include +#include + +namespace OpenViBE { +namespace PluginInspector { +class CAlgorithmGlobalDefinesGen final : public CPluginObjectDescEnum +{ +public: + + CAlgorithmGlobalDefinesGen(const Kernel::IKernelContext& ctx, const std::string& filename); + ~CAlgorithmGlobalDefinesGen() override; + bool callback(const Plugins::IPluginObjectDesc& pluginObjectDesc) override; + +protected: + + std::ofstream m_file; + + std::map m_usedIDs; + // Adds the define to m_usedIdentifiers and m_File + void addIdentifier(const std::string& objectName, const CIdentifier& candidate, const std::string& spaces); +}; +} // namespace PluginInspector +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CAlgorithmSnapshotGen.cpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CAlgorithmSnapshotGen.cpp new file mode 100644 index 0000000..9f8ee67 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CAlgorithmSnapshotGen.cpp @@ -0,0 +1,296 @@ +#include "CAlgorithmSnapshotGen.hpp" + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace OpenViBE { +namespace PluginInspector { + +// ------------------------------------------------------------------------------------------------------------------------------------ +CAlgorithmSnapshotGen::CAlgorithmSnapshotGen(const Kernel::IKernelContext& ctx, const std::string& snapshotDir, const std::string& docTemplateDir) + : CPluginObjectDescEnum(ctx), m_snapshotDir(snapshotDir), m_docTemplateDir(docTemplateDir) +{ +#define GDK_COLOR_SET(c, r, g, b) { c.pixel=0; c.red=r; c.green=g; c.blue=b; } + GDK_COLOR_SET(m_colors[EColors::BackgroundPlayerStarted], 32767, 32767, 32767); + GDK_COLOR_SET(m_colors[EColors::BoxBackgroundSelected], 65535, 65535, 49151); + GDK_COLOR_SET(m_colors[EColors::BoxBackgroundMissing], 49151, 32767, 32767); + GDK_COLOR_SET(m_colors[EColors::BoxBackgroundObsolete], 32767, 49151, 49151); + GDK_COLOR_SET(m_colors[EColors::BoxBackground], 65535, 65535, 65535); + GDK_COLOR_SET(m_colors[EColors::BoxBorderSelected], 0, 0, 0); + GDK_COLOR_SET(m_colors[EColors::BoxBorder], 0, 0, 0); + GDK_COLOR_SET(m_colors[EColors::BoxInputBackground], 65535, 49151, 32767); + GDK_COLOR_SET(m_colors[EColors::BoxInputBorder], 16383, 16383, 16383); + GDK_COLOR_SET(m_colors[EColors::BoxOutputBackground], 32767, 65535, 49151); + GDK_COLOR_SET(m_colors[EColors::BoxOutputBorder], 16383, 16383, 16383); + GDK_COLOR_SET(m_colors[EColors::BoxSettingBackground], 49151, 32767, 65535); + GDK_COLOR_SET(m_colors[EColors::BoxSettingBorder], 16383, 16383, 16383); + GDK_COLOR_SET(m_colors[EColors::Link], 0, 0, 0); + GDK_COLOR_SET(m_colors[EColors::LinkSelected], 49151, 16383, 16383); + GDK_COLOR_SET(m_colors[EColors::SelectionArea], 0x3f00, 0x3f00, 0x3f00); + GDK_COLOR_SET(m_colors[EColors::SelectionAreaBorder], 0, 0, 0); +#undef GDK_COLOR_SET + + m_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + m_widget = gtk_drawing_area_new(); + gtk_container_add(GTK_CONTAINER(m_window), m_widget); + gtk_widget_set_size_request(m_widget, 512, 128); + gtk_widget_show_all(m_window); + gdk_flush(); + System::Time::sleep(1000); +} + +CAlgorithmSnapshotGen::~CAlgorithmSnapshotGen() +{ + std::ofstream file; + file.open((m_docTemplateDir + "/Doc_Algorithms.dox").c_str()); + file << "/**\n * \\page Doc_Algorithms Algorithms list\n\n * Available algorithms :\n"; + + size_t level = 0; + std::string lastCat; + std::vector lastSplittedCat; + std::sort(m_categories.begin(), m_categories.end()); + for (const auto& category : m_categories) + { + std::string cat = category.first; + std::string name = category.second; + + if (lastCat != cat) + { + std::vector splittedCat; + size_t i = size_t(-1); + bool finished = false; + while (!finished) + { + size_t j = cat.find('/', i + 1); + if (j == std::string::npos) + { + j = cat.length(); + finished = true; + } + if (j != i + 1) + { + splittedCat.push_back(cat.substr(i + 1, j - i - 1)); + i = j; + } + } + level = splittedCat.size(); + + auto it1 = lastSplittedCat.size() < splittedCat.size() + ? std::mismatch(lastSplittedCat.begin(), lastSplittedCat.end(), splittedCat.begin()).second + : std::mismatch(splittedCat.begin(), splittedCat.end(), lastSplittedCat.begin()).first; + + for (; it1 != splittedCat.end(); ++it1) { file << " * " << std::string((it1 - splittedCat.begin()) * 3, ' ') << " - " << *it1 << " : \n"; } + + lastCat = cat; + lastSplittedCat = splittedCat; + } + + file << " * " << std::string(3 * (level + 1), ' ') << " - \\subpage Doc_algorithm_" << transform(cat + "/" + name) << " \"" << name << "\"\n"; + } + + file << " */\n"; + file.close(); +} + +bool CAlgorithmSnapshotGen::callback(const Plugins::IPluginObjectDesc& pod) +{ + const std::string fullName = std::string(pod.getCategory().toASCIIString()) + "/" + pod.getName().toASCIIString(); + const std::string filename = m_snapshotDir + "/Algorithm_" + transform(fullName); + CIdentifier id; + if ((id = m_kernelCtx.getAlgorithmManager().createAlgorithm(pod.getCreatedClassIdentifier())) == CIdentifier::undefined()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Skipped [" << filename << "] (could not create corresponding algorithm)\n"; + return true; + } + Kernel::IAlgorithmProxy& algorithm = m_kernelCtx.getAlgorithmManager().getAlgorithm(id); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Working on [" << filename << "]\n"; + + PangoContext* ctx = gtk_widget_get_pango_context(m_widget); + PangoLayout* layout = pango_layout_new(ctx); + PangoRectangle rectangle; + + pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER); + pango_layout_set_text(layout, pod.getName(), -1); + pango_layout_get_pixel_extents(layout, nullptr, &rectangle); + + const int marginX = 5; + const int marginY = 5; + const int circleMargin = 5; + const int circleSize = 11; + const int circleSpace = 4; + + const int w = rectangle.width + marginX * 2; + const int h = rectangle.height + marginY * 2; + const int x = 16; + const int y = 16; + + gdk_window_invalidate_rect(m_widget->window, nullptr, true); + + while (gtk_events_pending()) { gtk_main_iteration(); } + + GdkGC* drawGC = gdk_gc_new(m_widget->window); + + gdk_gc_set_rgb_fg_color(drawGC, &m_colors[EColors::BoxBackground]); + gdk_draw_rectangle(m_widget->window, drawGC, TRUE, x, y, w, h); + gdk_gc_set_rgb_fg_color(drawGC, &m_colors[EColors::BoxBorder]); + gdk_draw_rectangle(m_widget->window, drawGC, FALSE, x, y, w, h); + + size_t i = 0; + while ((id = algorithm.getNextInputParameterIdentifier(id)) != CIdentifier::undefined()) + { + GdkColor color = m_colors[EColors(algorithm.getInputParameter(id)->getType())]; + + std::array points; + points[0].x = circleSize >> 1; + points[0].y = circleSize; + points[1].x = 0; + points[1].y = 0; + points[2].x = circleSize - 1; + points[2].y = 0; + for (int j = 0; j < 3; ++j) + { + points[j].x += gint(x + circleMargin + i * (circleSpace + circleSize)); + points[j].y += gint(y - (circleSize >> 1)); + } + + gdk_gc_set_rgb_fg_color(drawGC, &color); + gdk_draw_polygon(m_widget->window, drawGC, TRUE, points.data(), 3); + gdk_gc_set_rgb_fg_color(drawGC, &m_colors[EColors::BoxInputBorder]); + gdk_draw_polygon(m_widget->window, drawGC, FALSE, points.data(), 3); + + i++; + } + + i = 0; + while ((id = algorithm.getNextOutputParameterIdentifier(id)) != CIdentifier::undefined()) + { + GdkColor color = m_colors[EColors(algorithm.getOutputParameter(id)->getType())]; + + std::array points; + points[0].x = circleSize >> 1; + points[0].y = circleSize; + points[1].x = 0; + points[1].y = 0; + points[2].x = circleSize - 1; + points[2].y = 0; + for (int j = 0; j < 3; ++j) + { + points[j].x += gint(x + circleMargin + i * (circleSpace + circleSize)); + points[j].y += gint(y - (circleSize >> 1) + h); + } + + gdk_gc_set_rgb_fg_color(drawGC, &color); + gdk_draw_polygon(m_widget->window, drawGC, TRUE, points.data(), 3); + gdk_gc_set_rgb_fg_color(drawGC, &m_colors[EColors::BoxOutputBorder]); + gdk_draw_polygon(m_widget->window, drawGC, FALSE, points.data(), 3); + + i++; + } + + gdk_draw_layout(m_widget->window, m_widget->style->text_gc[GTK_WIDGET_STATE(m_widget)], x + marginX, y + marginY, layout); + g_object_unref(layout); + g_object_unref(drawGC); + + GdkPixbuf* buf = gdk_pixbuf_get_from_drawable(nullptr, m_widget->window, nullptr, 0, 0, 0, 0, w + 32, h + 32); + OV_WARNING_UNLESS_K(gdk_pixbuf_save(buf, (filename+".png").c_str(), "png", nullptr, nullptr), "Failed saving " << (filename+".png")); + + g_object_unref(buf); + + // -------------------------------------------------------------------------------------------------------------------- + +#if 0 + + m_categories.push_back(pair < string, string >(pod.getCategory().toASCIIString(), pod.getName().toASCIIString())); + + std::ofstream file; + file.open((filename+".dox").toASCIIString()); + + file << "/**\n" + << " * \\page Doc_" << filename << " " << fullName.toASCIIString() << "\n" + << " * \\section Doc_" << filename << "_summary Summary\n" + << " * \\image html " << filename << ".png\n *\n" + << " * - Plugin name : " << pod.getName() << "\n" + << " * - Version : " << pod.getVersion() << "\n" + << " * - Author : " << pod.getAuthorName() << "\n" + << " * - Company : " << pod.getAuthorCompanyName() << "\n" + << " * - Short description : " << pod.getShortDescription() << "\n" + << " * - Documentation template generation date : " << __DATE__ << "\n *\n" + << " * \\section Doc_" << filename << "_description Description\n" + << " * " << pod.getDetailedDescription() << " TODO\n *\n"; + + file << " * \\section Doc_" << filename << "_inputs Inputs\n" + << " * Number of inputs : " << box.getInputCount() << "\n *\n"; + + for (i = 0; i < box.getInputCount(); ++i) + { + CString name; + CIdentifier typeID; + box.getInputName(i, name); + box.getInputType(i, typeID); + file << " * - Input " << i+1 << "\n" + << " * - Name : " << name.toASCIIString() << "\n" + << " * - Type identifier : " << m_kernelCtx.getTypeManager().getTypeName(typeID).toASCIIString() << " " << typeID.str() << "\n" + << " * - Description : TODO\n *\n"; + } + + file << " * \\section Doc_" << filename << "_outputs Outputs\n" + << " * Number of outputs : " << box.getOutputCount() << "\n *\n"; + + for (i = 0; i < box.getOutputCount(); ++i) + { + CString name; + CIdentifier typeID; + box.getOutputName(i, name); + box.getOutputType(i, typeID); + file + << " * - Output " << i+1 << "\n" + << " * - Name : " << name.toASCIIString() << "\n" + << " * - Type identifier : " << m_kernelCtx.getTypeManager().getTypeName(typeID).toASCIIString() << " " << typeID.str() << "\n" + << " * - Description : TODO\n" + << " *\n"; + } + + file << " * \\section Doc_" << filename << "_settings Settings\n" + << " * Number of settings : " << box.getSettingCount() << "\n *\n"; + + for (i = 0; i < box.getSettingCount(); ++i) + { + CString name; + CIdentifier typeID; + CString defaultValue; + box.getSettingName(i, name); + box.getSettingType(i, typeID); + box.getSettingDefaultValue(i, defaultValue); + file + << " * - Setting " << i+1 << "\n" + << " * - Name : " << name.toASCIIString() << "\n" + << " * - Type identifier : " << m_kernelCtx.getTypeManager().getTypeName(typeID).toASCIIString() << " " << typeID.str() << "\n" + << " * - Default value : " << defaultValue.toASCIIString() << "\n" + << " * - Description : TODO\n *\n"; + } + + file << " * \\section Doc_" << filename << "_examples Examples\n * TODO\n *\n" + << " * \\section Doc_" << filename << "_misc Miscellaneous\n * TODO\n */"; + + file.close(); + +#endif + + m_kernelCtx.getAlgorithmManager().releaseAlgorithm(algorithm); + + return true; +} + +} // namespace PluginInspector +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CAlgorithmSnapshotGen.hpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CAlgorithmSnapshotGen.hpp new file mode 100644 index 0000000..4f31da4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CAlgorithmSnapshotGen.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include "CPluginObjectDescEnum.hpp" + +#include +#include +#include + +#include + +namespace OpenViBE { +namespace PluginInspector { +// ------------------------------------------------------------------------------------------------------------------------------------ +class CAlgorithmSnapshotGen final : public CPluginObjectDescEnum +{ +public: + + CAlgorithmSnapshotGen(const Kernel::IKernelContext& ctx, const std::string& snapshotDir, const std::string& docTemplateDir); + ~CAlgorithmSnapshotGen() override; + bool callback(const Plugins::IPluginObjectDesc& pod) override; + +protected: + + std::string m_snapshotDir; + std::string m_docTemplateDir; + std::vector> m_categories; + std::map m_colors; + GtkWidget* m_window = nullptr; + GtkWidget* m_widget = nullptr; +}; +} // namespace PluginInspector +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CBoxAlgorithmDumper.cpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CBoxAlgorithmDumper.cpp new file mode 100644 index 0000000..b2f21bb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CBoxAlgorithmDumper.cpp @@ -0,0 +1,26 @@ +#include "CBoxAlgorithmDumper.hpp" + +#include +#include + +namespace OpenViBE { +namespace PluginInspector { +// ------------------------------------------------------------------------------------------------------------------------------------ +CBoxAlgorithmDumper::CBoxAlgorithmDumper(const Kernel::IKernelContext& ctx, const std::string& outFile) + : CPluginObjectDescEnum(ctx) +{ + if (outFile.empty()) { m_writeToFile = false; } + if (m_writeToFile) { m_file.open(outFile.c_str()); } +} +// ------------------------------------------------------------------------------------------------------------------------------------ + +// ------------------------------------------------------------------------------------------------------------------------------------ +bool CBoxAlgorithmDumper::callback(const Plugins::IPluginObjectDesc& pluginObjectDesc) +{ + const CIdentifier boxID = pluginObjectDesc.getCreatedClassIdentifier(); + (m_writeToFile ? m_file : std::cout) << "BoxAlgorithm " << transform(pluginObjectDesc.getName().toASCIIString()) << " " << boxID.str() << "\n"; + return true; +} + +} // namespace PluginInspector +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CBoxAlgorithmDumper.hpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CBoxAlgorithmDumper.hpp new file mode 100644 index 0000000..09c3ec3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CBoxAlgorithmDumper.hpp @@ -0,0 +1,31 @@ +#pragma once + +// +// Dumps all registered box algorithms to a text file or cout. The intended use case +// is to check the current scenarios to see if all boxes have at least one +// scenario where it is used. n.b. The checking was done by a shell script in +// +// test/check-scenario-coverage.sh +// + +#include "CPluginObjectDescEnum.hpp" + +#include + +namespace OpenViBE { +namespace PluginInspector { +// ------------------------------------------------------------------------------------------------------------------------------------ +class CBoxAlgorithmDumper final : public CPluginObjectDescEnum +{ +public: + + CBoxAlgorithmDumper(const Kernel::IKernelContext& ctx, const std::string& outFile); + ~CBoxAlgorithmDumper() override { if (m_writeToFile) { m_file.close(); } } + bool callback(const Plugins::IPluginObjectDesc& pluginObjectDesc) override; + +protected: + std::ofstream m_file; + bool m_writeToFile = true; // if false, to console +}; +} // namespace PluginInspector +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CBoxAlgorithmSnapshotGen.cpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CBoxAlgorithmSnapshotGen.cpp new file mode 100644 index 0000000..879c0d9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CBoxAlgorithmSnapshotGen.cpp @@ -0,0 +1,426 @@ +#include "CBoxAlgorithmSnapshotGen.hpp" + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +// ------------------------------------------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------------------------------------------ + +namespace OpenViBE { +namespace PluginInspector { + +CBoxAlgorithmSnapshotGen::CBoxAlgorithmSnapshotGen(const Kernel::IKernelContext& ctx, const std::string& snapshotDir, const std::string& docTemplateDir) + : CPluginObjectDescEnum(ctx), m_snapshotDir(snapshotDir), m_docTemplateDir(docTemplateDir) +{ + m_kernelCtx.getScenarioManager().createScenario(m_scenarioID); + m_scenario = &m_kernelCtx.getScenarioManager().getScenario(m_scenarioID); + +#define GDK_COLOR_SET(c, r, g, b) { c.pixel=0; c.red=r; c.green=g; c.blue=b; } + GDK_COLOR_SET(m_colors[EColors::BackgroundPlayerStarted], 32767, 32767, 32767); + GDK_COLOR_SET(m_colors[EColors::BoxBackgroundSelected], 65535, 65535, 49151); + GDK_COLOR_SET(m_colors[EColors::BoxBackgroundMissing], 49151, 32767, 32767); + GDK_COLOR_SET(m_colors[EColors::BoxBackgroundDeprecated], 16383, 24575, 24575); + GDK_COLOR_SET(m_colors[EColors::BoxBackground], 65535, 65535, 65535); + GDK_COLOR_SET(m_colors[EColors::BoxBorderSelected], 0, 0, 0); + GDK_COLOR_SET(m_colors[EColors::BoxBorder], 0, 0, 0); + GDK_COLOR_SET(m_colors[EColors::BoxInputBackground], 65535, 49151, 32767); + GDK_COLOR_SET(m_colors[EColors::BoxInputBorder], 16383, 16383, 16383); + GDK_COLOR_SET(m_colors[EColors::BoxOutputBackground], 32767, 65535, 49151); + GDK_COLOR_SET(m_colors[EColors::BoxOutputBorder], 16383, 16383, 16383); + GDK_COLOR_SET(m_colors[EColors::BoxSettingBackground], 49151, 32767, 65535); + GDK_COLOR_SET(m_colors[EColors::BoxSettingBorder], 16383, 16383, 16383); + GDK_COLOR_SET(m_colors[EColors::Link], 0, 0, 0); + GDK_COLOR_SET(m_colors[EColors::LinkSelected], 49151, 16383, 16383); + GDK_COLOR_SET(m_colors[EColors::SelectionArea], 0x3f00, 0x3f00, 0x3f00); + GDK_COLOR_SET(m_colors[EColors::SelectionAreaBorder], 0, 0, 0); +#undef GDK_COLOR_SET + + m_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + m_widget = gtk_drawing_area_new(); + gtk_container_add(GTK_CONTAINER(m_window), m_widget); + gtk_widget_set_size_request(m_widget, 512, 128); + gtk_widget_show_all(m_window); + gdk_flush(); + System::Time::sleep(1000); +} + +CBoxAlgorithmSnapshotGen::~CBoxAlgorithmSnapshotGen() +{ + m_kernelCtx.getScenarioManager().releaseScenario(m_scenarioID); + + std::ofstream file; + file.open((m_docTemplateDir + "/Doc_BoxAlgorithms.dox").c_str()); + file << "/**\n * \\page Doc_BoxAlgorithms Box algorithms list\n *\n * Available box algorithms :\n"; + + size_t level = 0; + std::string lastCat; + std::vector lastSplittedCat; + std::sort(m_categories.begin(), m_categories.end()); + for (const auto& category : m_categories) + { + std::string cat = category.first; + std::string name = category.second; + + if (lastCat != cat) + { + std::vector splittedCat; + size_t i = size_t(-1); + bool finished = false; + while (!finished) + { + size_t j = cat.find('/', i + 1); + if (j == std::string::npos) + { + j = cat.length(); + finished = true; + } + if (j != i + 1) + { + splittedCat.push_back(cat.substr(i + 1, j - i - 1)); + i = j; + } + } + level = splittedCat.size(); + // @FIXME C++14 : auto it1 = std::mismatch(lastSplittedCat.begin(), lastSplittedCat.end(), splittedCat.begin(), splittedCat.end()).second; + auto it1 = lastSplittedCat.size() < splittedCat.size() + ? std::mismatch(lastSplittedCat.begin(), lastSplittedCat.end(), splittedCat.begin()).second + : std::mismatch(splittedCat.begin(), splittedCat.end(), lastSplittedCat.begin()).first; + + for (; it1 != splittedCat.end(); ++it1) { file << " * " << std::string((it1 - splittedCat.begin()) * 3, ' ') << " - " << *it1 << " : \n"; } + + lastCat = cat; + lastSplittedCat = splittedCat; + } + + file << " * " << std::string(3 * level, ' ') << " - \\subpage Doc_BoxAlgorithm_" << transform(name) << " \"" << name << "\"\n"; + } + + file << " */\n"; + file.close(); +} + +bool CBoxAlgorithmSnapshotGen::callback(const Plugins::IPluginObjectDesc& pod) +{ + //string fullName = string(rPluginObjectDesc.getCategory().toASCIIString()) + "/" + string(rPluginObjectDesc.getName().toASCIIString()); + std::string filename = "BoxAlgorithm_" + transform(pod.getName().toASCIIString()); + CIdentifier boxID; + if (!m_scenario->addBox(boxID, pod.getCreatedClassIdentifier(), CIdentifier::undefined())) + { + OV_WARNING_K("Skipped [" << filename << "] (could not create corresponding box)"); + return true; + } + Kernel::IBox& box = *m_scenario->getBoxDetails(boxID); + getLogManager() << Kernel::LogLevel_Trace << "Working on [" << filename << "]\n"; + + PangoContext* ctx = gtk_widget_get_pango_context(m_widget); + PangoLayout* layout = pango_layout_new(ctx); + PangoRectangle rectangle; + + pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER); + pango_layout_set_text(layout, pod.getName(), -1); + pango_layout_get_pixel_extents(layout, nullptr, &rectangle); + + const int marginX = 5; + const int marginY = 5; + const int circleSize = 11; + const int circleSpace = 4; + + int w = rectangle.width + marginX * 2; + int h = rectangle.height + marginY * 2; + int x = 16; + int y = 16; + + gdk_window_invalidate_rect(m_widget->window, nullptr, true); + + while (gtk_events_pending()) { gtk_main_iteration(); } + + GdkGC* drawGC = gdk_gc_new(m_widget->window); + + bool deprecated = m_kernelCtx.getPluginManager().isPluginObjectFlaggedAsDeprecated(box.getAlgorithmClassIdentifier()); + if (deprecated) { gdk_gc_set_rgb_fg_color(drawGC, &m_colors[EColors::BoxBackgroundDeprecated]); } + else { gdk_gc_set_rgb_fg_color(drawGC, &m_colors[EColors::BoxBackground]); } + + gdkDrawRoundedRectangle(m_widget->window, drawGC, TRUE, x, y, w, h); + gdk_gc_set_rgb_fg_color(drawGC, &m_colors[EColors::BoxBorder]); + gdkDrawRoundedRectangle(m_widget->window, drawGC, FALSE, x, y, w, h); + + int offset = int(w - box.getInputCount() * (circleSpace + circleSize) + circleSize / 2) / 2; + for (size_t i = 0; i < box.getInputCount(); ++i) + { + CIdentifier id; + box.getInputType(i, id); + GdkColor color = colorFromIdentifier(id); + + std::array points; + points[0].x = circleSize >> 1; + points[0].y = circleSize; + points[1].x = 0; + points[1].y = 0; + points[2].x = circleSize - 1; + points[2].y = 0; + for (size_t j = 0; j < 3; ++j) + { + points[j].x += gint(x + i * (circleSpace + circleSize) + offset); + points[j].y += gint(y - (circleSize >> 1)); + } + + gdk_gc_set_rgb_fg_color(drawGC, &color); + gdk_draw_polygon(m_widget->window, drawGC, TRUE, points.data(), 3); + gdk_gc_set_rgb_fg_color(drawGC, &m_colors[EColors::BoxInputBorder]); + gdk_draw_polygon(m_widget->window, drawGC, FALSE, points.data(), 3); + } + + offset = int(w - box.getOutputCount() * (circleSpace + circleSize) + circleSize / 2) / 2; + for (size_t i = 0; i < box.getOutputCount(); ++i) + { + CIdentifier id; + box.getOutputType(i, id); + GdkColor color = colorFromIdentifier(id); + + std::array points; + points[0].x = circleSize >> 1; + points[0].y = circleSize; + points[1].x = 0; + points[1].y = 0; + points[2].x = circleSize - 1; + points[2].y = 0; + for (int j = 0; j < 3; ++j) + { + points[j].x += gint(x + i * (circleSpace + circleSize) + offset); + points[j].y += gint(y - (circleSize >> 1) + h); + } + + gdk_gc_set_rgb_fg_color(drawGC, &color); + gdk_draw_polygon(m_widget->window, drawGC, TRUE, points.data(), 3); + gdk_gc_set_rgb_fg_color(drawGC, &m_colors[EColors::BoxOutputBorder]); + gdk_draw_polygon(m_widget->window, drawGC, FALSE, points.data(), 3); + } + + gdk_draw_layout(m_widget->window, m_widget->style->text_gc[GTK_WIDGET_STATE(m_widget)], x + marginX, y + marginY, layout); + g_object_unref(layout); + g_object_unref(drawGC); + + GdkPixbuf* buf = gdk_pixbuf_get_from_drawable(nullptr, m_widget->window, nullptr, 0, 0, 0, 0, w + 32, h + 32); + gdk_pixbuf_save(buf, (m_snapshotDir + "/Doc_" + filename + ".png").c_str(), "png", nullptr, nullptr); + + g_object_unref(buf); + + // -------------------------------------------------------------------------------------------------------------------- + + m_categories.push_back(std::pair(pod.getCategory().toASCIIString(), pod.getName().toASCIIString())); + + std::ofstream fileSkeleton; + std::ofstream filePart; + fileSkeleton.open((m_docTemplateDir + "/Doc_" + filename + ".dox-skeleton").c_str()); + filePart.open((m_docTemplateDir + "/Doc_" + filename + ".dox-part-skeleton").c_str()); + + fileSkeleton << "/**\n" + << " * \\page Doc_" << filename << " " << pod.getName() << "\n" + << " * \\section Doc_" << filename << "_Summary Summary\n" + << " * \\image html Doc_" << filename << ".png\n" + << " *\n" + << " * - Plugin name : " << pod.getName() << "\n" + << " * - Version : " << pod.getVersion() << "\n" + << " * - Author : " << pod.getAuthorName() << "\n" + << " * - Company : " << pod.getAuthorCompanyName() << "\n" + << " * - Short description : " << pod.getShortDescription() << "\n" + << " * - Documentation template generation date : " << __DATE__ << "\n"; + + bool deprectated = m_kernelCtx.getPluginManager().isPluginObjectFlaggedAsDeprecated(pod.getCreatedClassIdentifier()); + if (deprectated) + { + fileSkeleton << " * - WARNING : this box has been marked as DEPRECATED by the developer.\n" + << " * It will be removed soon or later, so you should consider not using this\n" + << " * box and turn to another \"equivalent\" one.\n"; + } + + // @FIXME CERT +#pragma message("WARNING: 'Unstable' block commented out due to Certivibe") + + /* + bool isUnstable=m_kernelCtx.getPluginManager().isPluginObjectFlaggedAsUnstable(rPluginObjectDesc.getCreatedClassIdentifier()); + if(isUnstable) + { + fileSkeleton + << " * - WARNING : this box has been marked as UNSTABLE by the developer.\n" + << " * It means that its implementation may be incomplete or that the box can only work\n" + << " * under well known conditions. It may possibly crash or cause data loss.\n" + << " * Use this box at your own risk, you've been warned.\n"; + } + */ + + fileSkeleton << " *\n" + << " * \\section Doc_" << filename << "_Description Description\n" + << " * " << pod.getDetailedDescription() << "\n *\n" + << " * @Doc_" << filename << "_Description_Content@\n *\n"; + + filePart << "/**\n" + << " * \\page " << filename << " " << pod.getName() << "\n" + << "__________________________________________________________________\n\n" + << "Detailed description\n" + << "__________________________________________________________________\n\n" + << " * |OVP_DocBegin_" << filename << "_Description|\n" + << " * |OVP_DocEnd_" << filename << "_Description|\n"; + + if (box.getInputCount()) + { + fileSkeleton << " * \\section Doc_" << filename << "_Inputs Inputs\n" + // << " * Number of inputs : " << box.getInputCount() << "\n" + << " *\n" + << " * @Doc_" << filename << "_Inputs_Content@\n"; + + filePart << "__________________________________________________________________\n\n" + << "Inputs description\n" + << "__________________________________________________________________\n\n" + << " * |OVP_DocBegin_" << filename << "_Inputs|\n" + << " * |OVP_DocEnd_" << filename << "_Inputs|\n"; + + for (size_t i = 0; i < box.getInputCount(); ++i) + { + CString name; + CIdentifier typeID; + CString typeName; + box.getInputName(i, name); + box.getInputType(i, typeID); + typeName = m_kernelCtx.getTypeManager().getTypeName(typeID); + + fileSkeleton << " * \\subsection Doc_" << filename << "_Input_" << i + 1 << " " << i + 1 << ". " << name + << "\n * @Doc_" << filename << "_Input" << i + 1 << "_Content@\n *\n * - Type identifier : \\ref Doc_Streams_" + << transform(typeName.toASCIIString()) << " \"" << typeName << "\" " << typeID.str() << "\n *\n"; + + filePart << "\n * |OVP_DocBegin_" << filename << "_Input" << i + 1 << "|\n * |OVP_DocEnd_" << filename << "_Input" << i + 1 << + "|\n"; + } + } + + if (box.getOutputCount()) + { + fileSkeleton << " * \\section Doc_" << filename << "_Outputs Outputs\n" + // << " * Number of outputs : " << box.getOutputCount() << "\n" + << " *\n * @Doc_" << filename << "_Outputs_Content@\n"; + + filePart << "__________________________________________________________________\n\n" + << "Outputs description\n" + << "__________________________________________________________________\n\n" + << " * |OVP_DocBegin_" << filename << "_Outputs|\n * |OVP_DocEnd_" << filename << "_Outputs|\n"; + + for (size_t i = 0; i < box.getOutputCount(); ++i) + { + CString name; + CIdentifier typeID; + CString typeName; + box.getOutputName(i, name); + box.getOutputType(i, typeID); + typeName = m_kernelCtx.getTypeManager().getTypeName(typeID); + + fileSkeleton + << " * \\subsection Doc_" << filename << "_Output_" << i + 1 << " " << i + 1 << ". " << name << "\n" + << " * @Doc_" << filename << "_Output" << i + 1 << "_Content@\n *\n * - Type identifier : \\ref Doc_Streams_" + << transform(typeName.toASCIIString()) << " \"" << typeName << "\" " << typeID.str() << "\n *\n"; + + filePart << "\n * |OVP_DocBegin_" << filename << "_Output" << i + 1 << "|\n * |OVP_DocEnd_" << filename << "_Output" << i + 1 << + "|\n"; + } + } + + if (box.getSettingCount()) + { + fileSkeleton + << " * \\section Doc_" << filename << "_Settings Settings\n" + // << " * Number of settings : " << box.getSettingCount() << "\n" + << " *\n * @Doc_" << filename << "_Settings_Content@\n"; + + filePart + << "__________________________________________________________________\n\n" + << "Settings description\n" + << "__________________________________________________________________\n\n" + << " * |OVP_DocBegin_" << filename << "_Settings|\n * |OVP_DocEnd_" << filename << "_Settings|\n"; + + for (size_t i = 0; i < box.getSettingCount(); ++i) + { + CString name; + CIdentifier typeID; + CString defaultValue; + CString typeName; + box.getSettingName(i, name); + box.getSettingType(i, typeID); + box.getSettingDefaultValue(i, defaultValue); + typeName = m_kernelCtx.getTypeManager().getTypeName(typeID); + + fileSkeleton + << " * \\subsection Doc_" << filename << "_Setting_" << i + 1 << " " << i + 1 << ". " << name << "\n" + << " * @Doc_" << filename << "_Setting" << i + 1 << "_Content@\n" + << " *\n" + // "\\ref Doc_Types_" << transform(typeName.toASCIIString()) + << " * - Type identifier : " << typeName << " " << typeID.str() << "\n" + << " *\n" + << " * - Default value : [ " << defaultValue << " ]\n" + << " *\n"; + + filePart << "\n * |OVP_DocBegin_" << filename << "_Setting" << i + 1 << "|\n * |OVP_DocEnd_" << filename << "_Setting" << i + 1 << "|\n"; + } + } + + // @FIXME CERT +#pragma message("WARNING: PluginFunctionality_Visualization block commented out due to Certivibe") + + /* + if(rPluginObjectDesc.hasFunctionality(PluginFunctionality_Visualization)) + { + fileSkeleton + << " * \\section Doc_" << filename << "_OnlineVisualizationSettings Online visualization settings\n" + << " *\n" + << " * @Doc_" << filename << "_OnlineVisualizationSettings_Content@\n"; + + filePart + << "__________________________________________________________________\n" + << "\n" + << "Online visualization settings\n" + << "__________________________________________________________________\n" + << "\n" + << " * |OVP_DocBegin_" << filename << "_OnlineVisualizationSettings|\n" + << " * |OVP_DocEnd_" << filename << "_OnlineVisualizationSettings|\n"; + } + */ + + fileSkeleton + << " *\n" + << " * \\section Doc_" << filename << "_Examples Examples\n" + << " * @Doc_" << filename << "_Examples_Content@\n" + << " *\n" + << " * \\section Doc_" << filename << "_Miscellaneous Miscellaneous\n" + << " * @Doc_" << filename << "_Miscellaneous_Content@\n" + << " */\n"; + + filePart + << "__________________________________________________________________\n\n" + << "Examples description\n" + << "__________________________________________________________________\n\n" + << " * |OVP_DocBegin_" << filename << "_Examples|\n" + << " * |OVP_DocEnd_" << filename << "_Examples|\n" + << "__________________________________________________________________\n\n" + << "Miscellaneous description\n" + << "__________________________________________________________________\n\n" + << " * |OVP_DocBegin_" << filename << "_Miscellaneous|\n" + << " * |OVP_DocEnd_" << filename << "_Miscellaneous|\n" + << " */\n"; + + fileSkeleton.close(); + filePart.close(); + + return true; +} + +} // namespace PluginInspector +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CBoxAlgorithmSnapshotGen.hpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CBoxAlgorithmSnapshotGen.hpp new file mode 100644 index 0000000..5bd526d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CBoxAlgorithmSnapshotGen.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include "CPluginObjectDescEnum.hpp" + +#include +#include +#include + +#include + +namespace OpenViBE { +namespace PluginInspector { +// ------------------------------------------------------------------------------------------------------------------------------------ +class CBoxAlgorithmSnapshotGen final : public CPluginObjectDescEnum +{ +public: + + CBoxAlgorithmSnapshotGen(const Kernel::IKernelContext& ctx, const std::string& snapshotDir, const std::string& docTemplateDir); + ~CBoxAlgorithmSnapshotGen() override; + bool callback(const Plugins::IPluginObjectDesc& pod) override; + +protected: + + std::string m_snapshotDir; + std::string m_docTemplateDir; + std::vector> m_categories; + std::map m_colors; + GtkWidget* m_window = nullptr; + GtkWidget* m_widget = nullptr; + CIdentifier m_scenarioID = CIdentifier::undefined(); + Kernel::IScenario* m_scenario = nullptr; +}; +} // namespace PluginInspector +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CPluginObjectDescEnum.cpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CPluginObjectDescEnum.cpp new file mode 100644 index 0000000..9a6f416 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CPluginObjectDescEnum.cpp @@ -0,0 +1,50 @@ +#include "CPluginObjectDescEnum.hpp" + +#include + +namespace OpenViBE { +namespace PluginInspector { + +bool CPluginObjectDescEnum::enumeratePluginObjectDesc() +{ + CIdentifier id; + while ((id = m_kernelCtx.getPluginManager().getNextPluginObjectDescIdentifier(id)) != CIdentifier::undefined()) + { + this->callback(*m_kernelCtx.getPluginManager().getPluginObjectDesc(id)); + } + return true; +} + +bool CPluginObjectDescEnum::enumeratePluginObjectDesc(const CIdentifier& parentClassID) +{ + CIdentifier id; + while ((id = m_kernelCtx.getPluginManager().getNextPluginObjectDescIdentifier(id, parentClassID)) != + CIdentifier::undefined()) { this->callback(*m_kernelCtx.getPluginManager().getPluginObjectDesc(id)); } + return true; +} + +std::string CPluginObjectDescEnum::transform(const std::string& in, const bool removeSlash) +{ + std::string tmp(in); + std::string out; + bool lastWasSeparator = true; + + for (std::string::size_type i = 0; i < tmp.length(); ++i) + { + if (std::isalpha(tmp[i]) || std::isdigit(tmp[i]) || (!removeSlash && tmp[i] == '/')) + { + if (tmp[i] == '/') { out += "_"; } + else { out += lastWasSeparator ? std::toupper(tmp[i]) : tmp[i]; } + lastWasSeparator = false; + } + else + { + //if(!lastWasSeparator) { dst+="_"; } + lastWasSeparator = true; + } + } + return out; +} + +} // namespace PluginInspector +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CPluginObjectDescEnum.hpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CPluginObjectDescEnum.hpp new file mode 100644 index 0000000..648ad73 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/CPluginObjectDescEnum.hpp @@ -0,0 +1,74 @@ +#pragma once + +#include "base.hpp" +#include + +namespace OpenViBE { +namespace PluginInspector { +class CPluginObjectDescEnum +{ +public: + + explicit CPluginObjectDescEnum(const Kernel::IKernelContext& ctx): m_kernelCtx(ctx) { } + virtual ~CPluginObjectDescEnum() { } + + virtual bool enumeratePluginObjectDesc(); + virtual bool enumeratePluginObjectDesc(const CIdentifier& parentClassID); + + virtual bool callback(const Plugins::IPluginObjectDesc& pod) = 0; + + static std::string transform(const std::string& in, const bool removeSlash = false); + +protected: + enum class EColors + { + BackgroundPlayerStarted, + BoxBackground, BoxBackgroundSelected, BoxBackgroundMissing, BoxBackgroundObsolete, BoxBackgroundDeprecated, + BoxBorder, BoxBorderSelected, + BoxInputBackground, BoxInputBorder, + BoxOutputBackground, BoxOutputBorder, + BoxSettingBackground, BoxSettingBorder, + Link, LinkSelected, + SelectionArea, SelectionAreaBorder + }; + + virtual Kernel::ILogManager& getLogManager() const { return m_kernelCtx.getLogManager(); } + virtual Kernel::IErrorManager& getErrorManager() const { return m_kernelCtx.getErrorManager(); } + const Kernel::IKernelContext& m_kernelCtx; + + static GdkColor colorFromIdentifier(const CIdentifier& identifier) + { + GdkColor color; + const uint64_t res = identifier.id(); + + color.pixel = guint16(0); + color.red = guint16(((res) & 0xffff) | 0x8000); + color.green = guint16(((res >> 16) & 0xffff) | 0x8000); + color.blue = guint16(((res >> 32) & 0xffff) | 0x8000); + + return color; + } + + static void gdkDrawRoundedRectangle(GdkDrawable* drawable, GdkGC* gc, const gboolean fill, const gint x, const gint y, const gint w, const gint h, + const gint r = 8) + { + if (fill) + { + gdk_draw_rectangle(drawable, gc, TRUE, x + r, y, w - 2 * r, h); + gdk_draw_rectangle(drawable, gc, TRUE, x, y + r, w, h - 2 * r); + } + else + { + gdk_draw_line(drawable, gc, x + r, y, x + w - r, y); + gdk_draw_line(drawable, gc, x + r, y + h, x + w - r, y + h); + gdk_draw_line(drawable, gc, x, y + r, x, y + h - r); + gdk_draw_line(drawable, gc, x + w, y + r, x + w, y + h - r); + } + gdk_draw_arc(drawable, gc, fill, x + w - r * 2, y, r * 2, r * 2, 0 * 64, 90 * 64); + gdk_draw_arc(drawable, gc, fill, x, y, r * 2, r * 2, 90 * 64, 90 * 64); + gdk_draw_arc(drawable, gc, fill, x, y + h - r * 2, r * 2, r * 2, 180 * 64, 90 * 64); + gdk_draw_arc(drawable, gc, fill, x + w - r * 2, y + h - r * 2, r * 2, r * 2, 270 * 64, 90 * 64); + } +}; +} // namespace PluginInspector +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/base.hpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/base.hpp new file mode 100644 index 0000000..a1e1098 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/base.hpp @@ -0,0 +1,7 @@ +#pragma once + +#include +#include + +#include +#include diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/main.cpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/main.cpp new file mode 100644 index 0000000..70edbf2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/main.cpp @@ -0,0 +1,263 @@ +#include "CAlgorithmGlobalDefinesGen.hpp" +#include "CBoxAlgorithmDumper.hpp" +#include "CBoxAlgorithmSnapshotGen.hpp" +#include "CAlgorithmSnapshotGen.hpp" + +#include +#include +#include +#include // std::setlocale + +typedef struct SConfiguration +{ + SConfiguration() { } + + bool kernelPathOverload = false; + bool loadPluginsFromPaths = false; + bool dumpPathOverload = false; + bool configPathOverload = false; + bool listBoxes = false; + std::string kernelPath; + std::string dumpPath; + std::string configPath; + std::string listBoxesFile; + std::vector pluginPaths; +} configuration_t; + + +bool parse_arguments(int argc, char** argv, configuration_t& config) +{ + std::vector argValues; + + for (int i = 1; i < argc; ++i) { argValues.push_back(argv[i]); } + + for (auto it = argValues.begin(); it != argValues.end(); ++it) + { + if (*it == "-h" || *it == "--help") + { + std::cout << "Usage: " << argv[0] << " [-p ] [-d ] [-l boxListFile]" << std::endl; + exit(0); + } + // get a list of folders to load plugins from + if (*it == "-p") + { + if (it + 1 != argValues.end()) + { + std::string pluginDirectories = *++it; + + // split the argument to separate paths, the delimiter is "#" + std::stringstream ss(pluginDirectories); + std::string item; + while (std::getline(ss, item, '#')) { config.pluginPaths.push_back(item); } + config.loadPluginsFromPaths = true; + } + else { return false; } + } + // Configuration path + else if (*it == "-c") + { + if (it + 1 != argValues.end()) + { + config.configPathOverload = true; + config.configPath = *++it; + } + else { return false; } + } + // List path + else if (*it == "-l") + { + config.listBoxes = true; + if (it + 1 != argValues.end()) { config.listBoxesFile = *++it; } + else { config.listBoxesFile = ""; } // to cout + } + // Kernel path + else if (*it == "-k") + { + if (it + 1 != argValues.end()) + { + config.kernelPathOverload = true; + config.kernelPath = *++it; + } + else { return false; } + } + // Dump path + else if (*it == "-d") + { + if (it + 1 != argValues.end()) + { + config.dumpPathOverload = true; + config.dumpPath = *++it; + } + else { return false; } + } + } + + return true; +} + + +int main(int argc, char** argv) +{ + //___________________________________________________________________// + // // + configuration_t config; + + if (!parse_arguments(argc, argv, config)) { std::cout << "Error parsing arguments" << std::endl; } + + OpenViBE::CKernelLoader loader; + + std::cout << "[ INF ] Created kernel loader, trying to load kernel module" << std::endl; +#if defined TARGET_OS_Windows + std::string kernelFile = "/openvibe-kernel.dll"; +#else + std::string kernelFile = "/libopenvibe-kernel.so"; +#endif + + if (config.kernelPathOverload) { kernelFile = config.kernelPath + kernelFile; } + else { kernelFile = std::string(OpenViBE::Directories::getLibDir().toASCIIString()) + kernelFile; } + + OpenViBE::CString error; + if (!loader.load(OpenViBE::CString(kernelFile.c_str()), &error)) + { + std::cout << "[ FAILED ] Error loading kernel (" << error << ")" << " from [" << kernelFile << "]\n"; + } + else + { + std::cout << "[ INF ] Kernel module loaded, trying to get kernel descriptor" << std::endl; + OpenViBE::Kernel::IKernelDesc* kernelDesc = nullptr; + OpenViBE::Kernel::IKernelContext* kernelCtx = nullptr; + loader.initialize(); + loader.getKernelDesc(kernelDesc); + if (!kernelDesc) { std::cout << "[ FAILED ] No kernel descriptor" << std::endl; } + else + { + std::cout << "[ INF ] Got kernel descriptor, trying to create kernel" << std::endl; + std::string configPath = std::string(OpenViBE::Directories::getDataDir().toASCIIString()) + "/kernel/openvibe.conf"; + if (config.configPathOverload) { configPath = config.configPath; } + kernelCtx = kernelDesc->createKernel("plugin-inspector", OpenViBE::CString(configPath.c_str())); + if (!kernelCtx || !kernelCtx->initialize()) { std::cout << "[ FAILED ] No kernel created by kernel descriptor" << std::endl; } + else + { + kernelCtx->getConfigurationManager().addConfigurationFromFile(OpenViBE::CString(configPath.c_str())); + kernelCtx->getConfigurationManager().addConfigurationFromFile( + OpenViBE::Directories::getDataDir() + "/applications/plugin-inspector/plugin-inspector.conf"); + OpenViBE::Toolkit::initialize(*kernelCtx); + + OpenViBE::Kernel::IConfigurationManager& configManager = kernelCtx->getConfigurationManager(); + + if (config.loadPluginsFromPaths) + { + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Info << "Loading plugins from specified folders\n"; + + std::string pluginPattern; + for (const auto& libpath : config.pluginPaths) + { + // Choose the right pattern for libraries to load depending on the OS +#if defined TARGET_OS_Windows + pluginPattern = libpath + "/openvibe-plugins-*.dll;"; +#elif defined TARGET_OS_Linux + pluginPattern = libpath + "/libopenvibe-plugins-*.so;"; // + *it + "/lib???.so" +#endif + kernelCtx->getPluginManager().addPluginsFromFiles(pluginPattern.c_str()); + } + } + else + { + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Info << "Loading plugins as specified by kernel\n"; + kernelCtx->getPluginManager().addPluginsFromFiles(configManager.expand("${Kernel_Plugins}")); + } + + //initialise Gtk before 3D context + gtk_init(&argc, &argv); + // gtk_rc_parse(Directories::getDataDir() + "/applications/designer/interface.gtkrc"); + + // We rely on this with 64bit/gtk 2.24, to roll back gtk_init() sometimes switching + // the locale to one where ',' is needed instead of '.' for separators of floats, + // causing issues, for example getConfigurationManager.expandAsFloat("0.05") -> 0; + // due to implementation by std::stod(). + std::setlocale(LC_ALL, "C"); + + if (configManager.expandAsBoolean("${Kernel_3DVisualizationEnabled}")) + { + // kernelCtx->getVisualizationManager().initialize3DContext(); + } + + std::string globalDefinesDir = ""; + + std::string algorithmSnapshotDir = ""; + std::string algorithmDocTemplateDir = ""; + std::string boxAlgorithmSnapshotDir = ""; + std::string boxAlgorithmDocTemplateDir = ""; + + if (config.dumpPathOverload) + { + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Info << "Dumping stuff to [" << config.dumpPath << "]\n"; + algorithmSnapshotDir = config.dumpPath + "/algorithm-snapshots"; + algorithmDocTemplateDir = config.dumpPath + "/algorithm-doc"; + boxAlgorithmSnapshotDir = config.dumpPath + "/box-algorithm-snapshots"; + boxAlgorithmDocTemplateDir = config.dumpPath + "/box-algorithm-doc"; + globalDefinesDir = config.dumpPath; + } + else + { + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Info << "Loading paths from Kernel configuration\n"; + algorithmSnapshotDir = configManager.expand("${PluginInspector_DumpAlgorithmSnapshotDirectory}"); + algorithmDocTemplateDir = configManager.expand("${PluginInspector_DumpAlgorithmDocTemplateDirectory}"); + boxAlgorithmSnapshotDir = configManager.expand("${PluginInspector_DumpBoxAlgorithmSnapshotDirectory}"); + boxAlgorithmDocTemplateDir = configManager.expand("${PluginInspector_DumpBoxAlgorithmDocTemplateDirectory}"); + globalDefinesDir = configManager.expand("${PluginInspector_DumpGlobalDefinesDirectory}"); + } + + if (config.listBoxes) + { + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Info << "Dumping box identifiers ...\n"; + OpenViBE::PluginInspector::CBoxAlgorithmDumper boxIDGenerator(*kernelCtx, config.listBoxesFile); + boxIDGenerator.enumeratePluginObjectDesc(OV_ClassId_Plugins_BoxAlgorithmDesc); + } + + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Info << "Dumping global defines...\n"; + if (!globalDefinesDir.empty()) + { + OpenViBE::PluginInspector::CAlgorithmGlobalDefinesGen globalDefinesGenerator(*kernelCtx, globalDefinesDir); + globalDefinesGenerator.enumeratePluginObjectDesc(OV_ClassId_Plugins_AlgorithmDesc); + } + else + { + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Info << "Skipped, related PluginInspector tokens are empty in openvibe.conf\n"; + } + + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Info << "Dumping algorithm snapshots... to [" << algorithmSnapshotDir << "]\n"; + if (!algorithmSnapshotDir.empty() && !algorithmDocTemplateDir.empty()) + { + OpenViBE::PluginInspector::CAlgorithmSnapshotGen algorithmSnapshotGenerator(*kernelCtx, algorithmSnapshotDir, algorithmDocTemplateDir); + algorithmSnapshotGenerator.enumeratePluginObjectDesc(OV_ClassId_Plugins_AlgorithmDesc); + } + else + { + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Info << "Skipped, related PluginInspector tokens are empty in openvibe.conf\n"; + } + + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Info << "Dumping box algorithm snapshots...\n"; + if (!boxAlgorithmSnapshotDir.empty() && !boxAlgorithmDocTemplateDir.empty()) + { + OpenViBE::PluginInspector::CBoxAlgorithmSnapshotGen generator(*kernelCtx, boxAlgorithmSnapshotDir, boxAlgorithmDocTemplateDir); + generator.enumeratePluginObjectDesc(OV_ClassId_Plugins_BoxAlgorithmDesc); + } + else + { + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Info << "Skipped, related PluginInspector tokens are empty in openvibe.conf\n"; + } + + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Info << "Application terminated, releasing allocated objects \n"; + + OpenViBE::Toolkit::uninitialize(*kernelCtx); + + kernelDesc->releaseKernel(kernelCtx); + } + } + loader.uninitialize(); + loader.unload(); + } + + return 0; +} diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/ovpi_defines.h b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/ovpi_defines.h new file mode 100644 index 0000000..6f70f09 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/plugin-inspector/src/ovpi_defines.h @@ -0,0 +1 @@ +#pragma once diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/CMakeLists.txt new file mode 100644 index 0000000..7773d03 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/CMakeLists.txt @@ -0,0 +1,40 @@ + +IF(OV_DISABLE_GTK) + MESSAGE(STATUS "Skipping Skeleton Generator, no GTK") + RETURN() +ENDIF(OV_DISABLE_GTK) + +PROJECT(openvibe-skeleton-generator) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindThirdPartyGTK") +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyBoost_Thread") +INCLUDE("FindThirdPartyBoost_Regex") + +# ---------------------- +# Generate launch script +# ---------------------- +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/applications/skeleton-generator) diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/box.cpp-codec-toolkit-skeleton b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/box.cpp-codec-toolkit-skeleton new file mode 100644 index 0000000..d1a9cf2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/box.cpp-codec-toolkit-skeleton @@ -0,0 +1,147 @@ +#include "ovpCBoxAlgorithm@@ClassName@@.h" + +using namespace OpenViBE; +using namespace /*OpenViBE::*/Kernel; +using namespace /*OpenViBE::*/Plugins; +using namespace /*OpenViBE::Plugins::*/@@Namespace@@; + +bool CBoxAlgorithm@@ClassName@@::initialize() +{ +@@AlgorithmInitialisation@@ + // If you need to retrieve setting values, use the FSettingValueAutoCast function. + // For example : + // - CString setting at index 0 in the setting list : + // CString sSettingValue = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + // - unsigned int64 setting at index 1 in the setting list : + // uint64_t uiSettingValue = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + // - double setting at index 2 in the setting list : + // double doubleSettingValue = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + // ... + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithm@@ClassName@@::uninitialize() +{ +@@AlgorithmUninitialisation@@ + return true; +} +/*******************************************************************************/ + +@@ProcessClockCommentIn@@ +bool CBoxAlgorithm@@ClassName@@::processClock(Kernel::CMessageClock& msg) +{ + // some pre-processing code if needed... + + // ready to process ! + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} +@@ProcessClockCommentOut@@ +/*******************************************************************************/ + +@@ProcessClockCommentIn@@ +uint64_t CBoxAlgorithm@@ClassName@@::getClockFrequency() +{ + // Note that the time is coded on a 64 bits unsigned integer, fixed decimal point (32:32) + return @@ClockFrequency@@; // the box clock frequency +} +@@ProcessClockCommentOut@@ +/*******************************************************************************/ + +@@ProcessInputCommentIn@@ +bool CBoxAlgorithm@@ClassName@@::processInput(const size_t index) +{ + // some pre-processing code if needed... + + // ready to process ! + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} +@@ProcessInputCommentOut@@ +/*******************************************************************************/ + + +bool CBoxAlgorithm@@ClassName@@::process() +{ + + // the static box context describes the box inputs, outputs, settings structures + const IBox& staticBoxContext=this->getStaticBoxContext(); + // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) + IBoxIO& boxContext = this->getDynamicBoxContext(); + + // here is some useful functions: + // - To get input/output/setting count: + // staticBoxContext.getInputCount(); + // staticBoxContext.getOutputCount(); + + // - To get the number of chunks currently available on a particular input : + // boxContext.getInputChunkCount(input_index) + + // - To send an output chunk : + // boxContext.markOutputAsReadyToSend(output_index, chunk_start_time, chunk_end_time); + + + // A typical process iteration may look like this. + // This example only iterate over the first input of type Signal, and output a modified Signal. + // thus, the box uses 1 decoder (m_signalDecoder) and 1 encoder (m_signalEncoder) + /* + IBoxIO& boxContext = this->getDynamicBoxContext(); + + //iterate over all chunk on input 0 + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + // decode the chunk i + m_signalDecoder.decode(i); + // the decoder may have decoded 3 different parts : the header, a buffer or the end of stream. + if(m_signalDecoder.isHeaderReceived()) + { + // Header received. This happens only once when pressing "play". For example with a StreamedMatrix input, you now know the dimension count, sizes, and labels of the matrix + // ... maybe do some process ... + + // Pass the header to the next boxes, by encoding a header on the output 0: + m_signalEncoder.encodeHeader(0); + // send the output chunk containing the header. The dates are the same as the input chunk: + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + if(m_signalDecoder.isBufferReceived()) + { + // Buffer received. For example the signal values + // Access to the buffer can be done thanks to : + CMatrix* matrix = m_signalDecoder.getOutputMatrix(); // the StreamedMatrix of samples. + uint64_t frequency = m_signalDecoder.getOutputSamplingRate(); // the sampling rate of the signal + + // ... do some process on the matrix ... + + // Encode the output buffer : + m_signalEncoder.encodeBuffer(0); + // and send it to the next boxes : + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + + } + if(m_signalDecoder.isEndReceived()) + { + // End of stream received. This happens only once when pressing "stop". Just pass it to the next boxes so they receive the message : + m_signalEncoder.encodeEnd(0); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + // The current input chunk has been processed, and automaticcaly discarded. + // you don't need to call "boxContext.markInputAsDeprecated(0, i);" + } + */ + + // check the official developer documentation webpage for more example and information : + + // Tutorials: + // http://openvibe.inria.fr/documentation/#Developer+Documentation + // Codec Toolkit page : + // http://openvibe.inria.fr/codec-toolkit-references/ + + // Feel free to ask experienced developers on the forum (http://openvibe.inria.fr/forum) and IRC (#openvibe on irc.freenode.net). + + return true; +} diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/box.cpp-skeleton b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/box.cpp-skeleton new file mode 100644 index 0000000..d446f11 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/box.cpp-skeleton @@ -0,0 +1,148 @@ +#include "ovpCBoxAlgorithm@@ClassName@@.h" + +using namespace OpenViBE; +using namespace /*OpenViBE::*/Kernel; +using namespace /*OpenViBE::*/Plugins; +using namespace /*OpenViBE::Plugins::*/@@Namespace@@; + +bool CBoxAlgorithm@@ClassName@@::initialize() +{ +@@AlgorithmInitialisation@@ + // If you need to retrieve setting values, use the FSettingValueAutoCast function. + // For example : + // - CString setting at index 0 in the setting list : + // CString sSettingValue = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + // - unsigned int64 setting at index 1 in the setting list : + // uint64_t uiSettingValue = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + // - double setting at index 2 in the setting list : + // double doubleSettingValue = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + // ... + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithm@@ClassName@@::uninitialize() +{ +@@AlgorithmUninitialisation@@ + return true; +} +/*******************************************************************************/ + +@@ProcessClockCommentIn@@ +bool CBoxAlgorithm@@ClassName@@::processClock(Kernel::CMessageClock& msg) +{ + // some pre-processing code if needed... + + // ready to process ! + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} +/*******************************************************************************/ + +@@ProcessClockCommentIn@@ +uint64_t CBoxAlgorithm@@ClassName@@::getClockFrequency() +{ + // Note that the time is coded on a 64 bits unsigned integer, fixed decimal point (32:32) + return @@ClockFrequency@@; // the box clock frequency +} +/*******************************************************************************/ + +@@ProcessInputCommentIn@@ +bool CBoxAlgorithm@@ClassName@@::processInput(const size_t /*index*/) +{ + // some pre-processing code if needed... + + // ready to process ! + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithm@@ClassName@@::process() +{ + + // the static box context describes the box inputs, outputs, settings structures + const IBox& staticBoxCtx = this->getStaticBoxContext(); + // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) + IBoxIO& boxCtx = this->getDynamicBoxContext(); + + // here is some useful functions: + // - To get input/output/setting count: + // staticBoxCtx.getInputCount(); + // staticBoxCtx.getOutputCount(); + // staticBoxCtx.getSettingCount(); + + // - To get the chunks currently available on a particular input : + // boxCtx.getInputChunkCount(input_index) + // boxCtx.getInputChunk(input_index, chunk_index) + + // - To get the chunk available on a particular output : + // boxCtx.getOutputChunk(output_index) + // - To send an output chunk : + // boxCtx.markOutputAsReadyToSend(output_index, chunk_start_time, chunk_end_time); + + + // A typical process iteration may look like this. + // This example only iterate over the first input. + /* + IBoxIO& boxCtx = this->getDynamicBoxContext(); + + //iterate over all chunk on input 0 + for (size_t i = 0; i < boxCtx.getInputChunkCount(0); ++i) + { + // fill the decoder input with input chunk + ip_bufferToDecode = boxCtx.getInputChunk(0, i); + // link the encoder output to box output chunk + op_buffer = boxCtx.getOutputChunk(0); + + // decode the input chunk + m_decoder->process(); + // the decoder may have decoded 3 different parts : the header, a buffer or the end of stream. + // 3 corresponding output triggers may rise. + // the decoded block is now in the decoded output (let's say op_pDecodedMatrix) + + if(m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedHeader)) + { + // Header received. This happens only once when pressing "play". For example with a StreamedMatrix input, you now know the dimension count size, and label of the matrix + // ... do some process ... + + // Pass the header to the next boxes, by encoding it : + m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeHeader); + // send the output chunk containing the header : + boxCtx.markOutputAsReadyToSend(0, boxCtx.getInputChunkStartTime(0, i), boxCtx.getInputChunkEndTime(0, i)); + } + if(m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedBuffer)) + { + // Buffer received. For example the matrix values + // Access to the matrix buffer can be done thanks to : + // op_pDecodedMatrix->getBuffer(), which is a one-dimension vector of value. + + // ... do some process ... + + // Encode the output buffer : + m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeBuffer); + // and send it to the next boxes : + boxCtx.markOutputAsReadyToSend(0, boxCtx.getInputChunkStartTime(0, i), boxCtx.getInputChunkEndTime(0, i)); + + } + if(m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedEnd)) + { + // End of stream received. This happens only once when pressing "stop". Just pass it to the next boxes so they receive the message : + m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeEnd); + boxCtx.markOutputAsReadyToSend(0, boxCtx.getInputChunkStartTime(0, i), boxCtx.getInputChunkEndTime(0, i)); + } + + // The current input chunk has been processed, let's discard it : + boxCtx.markInputAsDeprecated(0, i); + } + */ + + // check the official developer documentation webpage for more example and information : + // http://openvibe.inria.fr/documentation/#Developer+Documentation + // Feel free to ask experienced developers on the forum (http://openvibe.inria.fr/forum) and IRC (#openvibe on irc.freenode.net). + + return true; +} diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/box.h-skeleton b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/box.h-skeleton new file mode 100644 index 0000000..ba20bd7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/box.h-skeleton @@ -0,0 +1,149 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithm@@ClassName@@.h +/// \brief Classes of the Box @@BoxName@@. +/// \author @@Author@@ (@@Company@@). +/// \version @@Version@@. +/// \date @@Date@@. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- +#pragma once + +//You may have to change this path to match your folder organisation +#include "ovp_defines.h" + +#include +#include + +// The unique identifiers for the box and its descriptor. +// Identifier are randomly chosen by the skeleton-generator. +#define OVP_ClassId_BoxAlgorithm_@@ClassName@@ OpenViBE::CIdentifier@@RandomIdentifierClass@@ +#define OVP_ClassId_BoxAlgorithm_@@ClassName@@Desc OpenViBE::CIdentifier@@RandomIdentifierDescriptor@@ +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) + +namespace OpenViBE +{ + namespace Plugins + { + namespace @@Namespace@@ + { + /// The class CBoxAlgorithm@@ClassName@@ describes the box @@BoxName@@. + class CBoxAlgorithm@@ClassName@@ final : virtual public Toolkit::TBoxAlgorithm + { + public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + //Here is the different process callbacks possible + // - On clock ticks : + @@ProcessClockComment@@bool processClock(Kernel::CMessageClock& msg) override; + // - On new input received (the most common behaviour for signal processing) : + @@ProcessInputComment@@bool processInput(const size_t index) override; + + // If you want to use processClock, you must provide the clock frequency. + @@ProcessClockComment@@uint64_t getClockFrequency() override; + + bool process() override; + + // As we do with any class in openvibe, we use the macro below to associate this box to an unique identifier. + // The inheritance information is also made available, as we provide the superclass Toolkit::TBoxAlgorithm < IBoxAlgorithm > + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_@@ClassName@@) + + protected: + @@Algorithms@@ + }; + + + // If you need to implement a box Listener, here is a sekeleton for you. + // Use only the callbacks you need. + // For example, if your box has a variable number of input, but all of them must be stimulation inputs. + // The following listener callback will ensure that any newly added input is stimulations : + /* + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + box.setInputType(index, OV_TypeId_Stimulations); + }; + */ + + @@BoxListenerCommentIn@@ + // The box listener can be used to call specific callbacks whenever the box structure changes : input added, name changed, etc. + // Please uncomment below the callbacks you want to use. + /// Listener of the box @@BoxName@@. + class CBoxAlgorithm@@ClassName@@Listener final : public Toolkit::TBoxListener + { + public: + + //bool onInitialized(Kernel::IBox& box) override { return true; }; + //bool onNameChanged(Kernel::IBox& box) override { return true; }; + @@BoxListenerOnInputConnectedComment@@bool onInputConnected(Kernel::IBox& box, const size_t index) override { return true; }; + @@BoxListenerOnInputDisconnectedComment@@bool onInputDisconnected(Kernel::IBox& box, const size_t index) override { return true; }; + @@BoxListenerOnInputAddedComment@@bool onInputAdded(Kernel::IBox& box, const size_t index) override { return true; }; + @@BoxListenerOnInputRemovedComment@@bool onInputRemoved(Kernel::IBox& box, const size_t index) override { return true; }; + @@BoxListenerOnInputTypeChangedComment@@bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override { return true; }; + @@BoxListenerOnInputNameChangedComment@@bool onInputNameChanged(Kernel::IBox& box, const size_t index) override { return true; }; + @@BoxListenerOnOutputConnectedComment@@bool onOutputConnected(Kernel::IBox& box, const size_t index) override { return true; }; + @@BoxListenerOnOutputDisconnectedComment@@bool onOutputDisconnected(Kernel::IBox& box, const size_t index) { return true; }; + @@BoxListenerOnOutputAddedComment@@bool onOutputAdded(Kernel::IBox& box, const size_t index) override { return true; }; + @@BoxListenerOnOutputRemovedComment@@bool onOutputRemoved(Kernel::IBox& box, const size_t index) override { return true; }; + @@BoxListenerOnOutputTypeChangedComment@@bool onOutputTypeChanged(Kernel::IBox& box, const size_t index) override override { return true; }; + @@BoxListenerOnOutputNameChangedComment@@bool onOutputNameChanged(Kernel::IBox& box, const size_t index) override { return true; }; + @@BoxListenerOnSettingAddedComment@@bool onSettingAdded(Kernel::IBox& box, const size_t index) override { return true; }; + @@BoxListenerOnSettingRemovedComment@@bool onSettingRemoved(Kernel::IBox& box, const size_t index) override { return true; }; + @@BoxListenerOnSettingTypeChangedComment@@bool onSettingTypeChanged(Kernel::IBox& box, const size_t index) override { return true; }; + @@BoxListenerOnSettingNameChangedComment@@bool onSettingNameChanged(Kernel::IBox& box, const size_t index) override { return true; }; + @@BoxListenerOnSettingDefaultValueChangedComment@@bool onSettingDefaultValueChanged(Kernel::IBox& box, const size_t index) override { return true; }; + @@BoxListenerOnSettingValueChangedComment@@bool onSettingValueChanged(Kernel::IBox& box, const size_t index) override { return true; }; + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) + }; + @@BoxListenerCommentOut@@ + + /// Descriptor of the box @@BoxName@@. + class CBoxAlgorithm@@ClassName@@Desc final : virtual public IBoxAlgorithmDesc + { + public: + + void release() override { } + + CString getName() const override { return CString("@@BoxName@@"); } + CString getAuthorName() const override { return CString("@@Author@@"); } + CString getAuthorCompanyName() const override { return CString("@@Company@@"); } + CString getShortDescription() const override { return CString("@@ShortDescription@@"); } + CString getDetailedDescription() const override { return CString("@@DetailedDescription@@"); } + CString getCategory() const override { return CString("@@Category@@"); } + CString getVersion() const override { return CString("@@Version@@"); } + CString getStockItemName() const override { return CString("@@StockItemName@@"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_@@ClassName@@; } + IPluginObject* create() override { return new CBoxAlgorithm@@ClassName@@; } + + @@BoxListenerCommentIn@@ + IBoxListener* createBoxListener() const override { return new CBoxAlgorithm@@ClassName@@Listener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + @@BoxListenerCommentOut@@ + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + @@Inputs@@ + @@InputFlagCanModify@@ + @@InputFlagCanAdd@@ + + @@Outputs@@ + @@OutputFlagCanModify@@ + @@OutputFlagCanAdd@@ + + @@Settings@@ + @@SettingFlagCanModify@@ + @@SettingFlagCanAdd@@ + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_@@ClassName@@Desc) + }; + } // namespace @@Namespace@@ + } // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/configuration.cpp-skeleton b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/configuration.cpp-skeleton new file mode 100644 index 0000000..1904d5f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/configuration.cpp-skeleton @@ -0,0 +1,58 @@ +#include "ovasCConfiguration@@ClassName@@.h" + +using namespace OpenViBE; +using namespace /*OpenViBE::*/Kernel; +using namespace /*OpenViBE::*/AcquisitionServer; + +/*_________________________________________________ + +Insert callback to specific widget here +Example with a button that launch a calibration of the device: + +//Callback connected to a dedicated gtk button: +static void button_calibrate_pressed_cb(GtkButton* button, void* data) +{ + CConfiguration@@ClassName@@* config = static_cast(data); + config->buttonCalibratePressedCB(); +} + +//Callback actually called: +void CConfigurationGTecGUSBamp::buttonCalibratePressedCB() +{ + // Connect to the hardware, ask for calibration, verify the return code, etc. +} +_________________________________________________*/ + +// If you added more reference attribute, initialize them here +CConfiguration@@ClassName@@::CConfiguration@@ClassName@@(IDriverContext& ctx, const char* gtkBuilderFilename) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx) { } + +bool CConfiguration@@ClassName@@::preConfigure() +{ + if(! CConfigurationBuilder::preConfigure()) { return false; } + + // Connect here all callbacks + // Example: + // g_signal_connect(gtk_builder_get_object(m_builder, "button_calibrate"), "pressed", G_CALLBACK(button_calibrate_pressed_cb), this); + + // Insert here the pre-configure code. + // For example, you may want to check if a device is currently connected + // and if more than one are connected. Then you can list in a dedicated combo-box + // the device currently connected so the user can choose which one he wants to acquire from. + + return true; +} + +bool CConfiguration@@ClassName@@::postConfigure() +{ + if(m_applyConfig) + { + // If the user pressed the "apply" button, you need to save the changes made in the configuration. + // For example, you can save the connection ID of the selected device: + // m_connectionID = + } + + if(!CConfigurationBuilder::postConfigure()) { return false; } // normal header is filled (Subject ID, Age, Gender, channels, sampling frequency), ressources are realesed + + return true; +} diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/configuration.h-skeleton b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/configuration.h-skeleton new file mode 100644 index 0000000..778bf58 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/configuration.h-skeleton @@ -0,0 +1,50 @@ +#pragma once + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +#include + +namespace OpenViBE +{ + namespace AcquisitionServer + { + /** + * \class CConfiguration@@ClassName@@ + * \author @@AuthorName@@ (@@CompanyName@@) + * \date @@Date@@ + * \brief The CConfiguration@@ClassName@@ handles the configuration dialog specific to the @@DriverName@@ device. + * + * TODO: details + * + * \sa CDriver@@ClassName@@ + */ + class CConfiguration@@ClassName@@ : public CConfigurationBuilder + { + public: + + // you may have to add to your constructor some reference parameters + // for example, a connection ID: + //CConfiguration@@ClassName@@(IDriverContext& ctx, const char* gtkBuilderFilename, size_t& rConnectionId); + CConfiguration@@ClassName@@(IDriverContext& ctx, const char* gtkBuilderFilename); + + virtual bool preConfigure(); + virtual bool postConfigure(); + + protected: + + IDriverContext& m_driverCtx; + + private: + + /* + * Insert here all specific attributes, such as a connection ID. + * use references to directly modify the corresponding attribute of the driver + * Example: + */ + // size_t& m_connectionID; + }; + } //namespace AcquisitionServer +} //namespace OpenViBE + + diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/driver.cpp-skeleton b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/driver.cpp-skeleton new file mode 100644 index 0000000..cd1e84c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/driver.cpp-skeleton @@ -0,0 +1,149 @@ +#include "ovasCDriver@@ClassName@@.h" +#include "ovasCConfiguration@@ClassName@@.h" + +#include + +using namespace OpenViBE; +using namespace /*OpenViBE::*/AcquisitionServer; +using namespace /*OpenViBE::*/Kernel; + +//___________________________________________________________________// +// // + +CDriver@@ClassName@@::CDriver@@ClassName@@(IDriverContext& ctx) + :IDriver(ctx),m_settings("AcquisitionServer_Driver_@@ClassName@@", m_driverCtx.getConfigurationManager()) +{ + m_header.setSampling(@@Sampling@@); + m_header.setChannelCount(@@MaxChannel@@); + + // The following class allows saving and loading driver settings from the acquisition server .conf file + m_settings.add("Header", &m_header); + // To save your custom driver settings, register each variable to the SettingsHelper + //m_settings.add("SettingName", &variable); + m_settings.load(); +} + +CDriver@@ClassName@@::~CDriver@@ClassName@@() { } + +const char* CDriver@@ClassName@@::getName() { return "@@DriverName@@"; } + +//___________________________________________________________________// +// // + +bool CDriver@@ClassName@@::initialize(const size_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if(m_driverCtx.isConnected()) { return false; } + if(!m_header.isChannelCountSet()||!m_header.isSamplingSet()) { return false; } + + // Builds up a buffer to store + // acquired samples. This buffer + // will be sent to the acquisition + // server later... + m_sample=new float[m_header.getChannelCount()*nSamplePerSentBlock]; + if(!m_sample) + { + delete [] m_sample; + m_sample = nullptr; + return false; + } + + // ... + // initialize hardware and get + // available header information + // from it + // Using for example the connection ID provided by the configuration (m_connectionID) + // ... + + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + return true; +} + +bool CDriver@@ClassName@@::start() +{ + if(!m_driverCtx.isConnected()) { return false; } + if(m_driverCtx.isStarted()) { return false; } + + // ... + // request hardware to start + // sending data + // ... + + return true; +} + +bool CDriver@@ClassName@@::loop() +{ + if(!m_driverCtx.isConnected()) { return false; } + if(!m_driverCtx.isStarted()) { return true; } + + CStimulationSet stimSet; + + // ... + // receive samples from hardware + // put them the correct way in the sample array + // whether the buffer is full, send it to the acquisition server + //... + m_callback->setSamples(m_sample); + + // When your sample buffer is fully loaded, + // it is advised to ask the acquisition server + // to correct any drift in the acquisition automatically. + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + + // ... + // receive events from hardware + // and put them the correct way in a CStimulationSet object + //... + m_callback->setStimulationSet(stimSet); + + return true; +} + +bool CDriver@@ClassName@@::stop() +{ + if(!m_driverCtx.isConnected()) return false; + if(!m_driverCtx.isStarted()) return false; + + // ... + // request the hardware to stop + // sending data + // ... + + return true; +} + +bool CDriver@@ClassName@@::uninitialize() +{ + if(!m_driverCtx.isConnected()) return false; + if(m_driverCtx.isStarted()) return false; + + // ... + // uninitialize hardware here + // ... + + delete [] m_sample; + m_sample = nullptr; + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // +bool CDriver@@ClassName@@::isConfigurable() +{ + return true; // change to false if your device is not configurable +} + +bool CDriver@@ClassName@@::configure() +{ + // Change this line if you need to specify some references to your driver attribute that need configuration, e.g. the connection ID. + CConfiguration@@ClassName@@ config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-@@ClassName@@.ui"); + + if(!config.configure(m_header)) { return false; } + m_settings.save(); + + return true; +} diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/driver.h-skeleton b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/driver.h-skeleton new file mode 100644 index 0000000..02548f2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/driver.h-skeleton @@ -0,0 +1,68 @@ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +namespace OpenViBE +{ + namespace AcquisitionServer + { + /** + * \class CDriver@@ClassName@@ + * \author @@AuthorName@@ (@@CompanyName@@) + * \date @@Date@@ + * \brief The CDriver@@ClassName@@ allows the acquisition server to acquire data from a @@DriverName@@ device. + * + * TODO: details + * + * \sa CConfiguration@@ClassName@@ + */ + class CDriver@@ClassName@@ : public IDriver + { + public: + + CDriver@@ClassName@@(IDriverContext& ctx); + virtual ~CDriver@@ClassName@@(); + virtual const char* getName(); + + virtual bool initialize(const size_t nSamplePerSentBlock, IDriverCallback& callback); + virtual bool uninitialize(); + + virtual bool start(); + virtual bool stop(); + virtual bool loop(); + + virtual bool isConfigurable(); + virtual bool configure(); + virtual const IHeader* getHeader() { return &m_header; } + + virtual bool isFlagSet(const EDriverFlag flag) const { return flag==EDriverFlag::IsUnstable; } + + protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + + // Replace this generic Header with any specific header you might have written + CHeader m_header; + + size_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + + private: + + /* + * Insert here all specific attributes, such as USB port number or device ID. + * Example : + */ + // size_t m_connectionID = 0; + }; + } //namespace AcquisitionServer +} //namespace OpenViBE + + diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/generator-interface.ui b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/generator-interface.ui new file mode 100644 index 0000000..ede6ef5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/generator-interface.ui @@ -0,0 +1,3226 @@ + + + + + + 1 + 1024 + 1 + 1 + 10 + + + 1 + 1024 + 1 + 1 + 10 + + + 10 + 100 + 1 + 10 + 100 + + + + + + + + + + + False + 5 + center + normal + False + + + True + False + 2 + + + True + False + end + + + + + + + + + False + True + end + 0 + + + + + True + False + 3 + 2 + 3 + 3 + + + True + False + Name: + + + GTK_EXPAND + GTK_EXPAND + + + + + True + False + Type: + + + 1 + 2 + GTK_EXPAND + GTK_EXPAND + + + + + True + True + + False + False + True + True + + + 1 + 2 + GTK_EXPAND + + + + + True + False + sg-box-IO-add-type-liststore + 0 + + + + 0 + + + + + 1 + 2 + 1 + 2 + GTK_EXPAND + + + + + True + False + + + 2 + 2 + 3 + + + + + True + True + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + 5 + center + normal + + + True + False + + + True + False + end + + + + + + + + + False + True + end + 0 + + + + + True + False + 9 + 4 + + + True + False + Name: + + + + + True + False + + + 4 + 8 + 9 + + + + + True + False + Input(s): + + + 6 + 7 + + + + + True + False + Output(s): + + + 2 + 3 + 6 + 7 + + + + + False + Input Trigger(s): + + + 7 + 8 + + + + + True + False + sg-box-algorithms-add-liststore + + + + 0 + + + + + 1 + 3 + GTK_EXPAND + + + + + True + True + sg-box-algorithms-add-inputs-liststore + False + + + Name + + + + 0 + + + + + + + 1 + 2 + 6 + 7 + + + + + True + True + sg-box-algorithms-add-outputs-liststore + False + 0 + + + Name + + + + 0 + + + + + + + 3 + 4 + 6 + 7 + + + + + True + sg-box-algorithms-add-input-triggers-liststore + False + 0 + + + Name + + + + 0 + + + + + + + 1 + 2 + 7 + 8 + + + + + False + + + 4 + 1 + 2 + + + + + False + Short description: + + + 3 + 4 + + + + + True + False + + False + False + True + True + + + 1 + 4 + 3 + 4 + + + + + False + Detailed description: + + + 4 + 5 + + + + + True + False + + + 1 + 4 + 4 + 5 + + + + + False + Category: + + + 2 + 3 + + + + + False + False + + False + False + True + True + + + 1 + 4 + 2 + 3 + + + + + True + False + + + 4 + 5 + 6 + + + + + False + Output Trigger(s): + + + 2 + 3 + 7 + 8 + + + + + True + sg-box-algorithms-add-output-triggers-liststore + False + 0 + + + Name + + + + 0 + + + + + + + 3 + 4 + 7 + 8 + + + + + + + + True + True + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + 5 + center + normal + False + + + True + False + 2 + + + True + False + end + + + + + + + + + False + True + end + 0 + + + + + True + False + 2 + 3 + 1 + + + True + False + Name: + + + GTK_EXPAND + GTK_EXPAND + + + + + True + True + + False + False + True + True + + + 1 + 2 + GTK_EXPAND + + + + + True + False + + + 2 + 2 + 3 + + + + + + + + + + + True + True + 1 + + + + + + + + + + + + + + + + + + + + + + + + + False + 5 + center + normal + False + + + True + False + 2 + + + True + False + end + + + + + + + + + False + True + end + 0 + + + + + True + False + 4 + 2 + 3 + 3 + + + True + False + Name: + + + GTK_EXPAND + GTK_EXPAND + + + + + True + False + Type: + + + 1 + 2 + GTK_EXPAND + GTK_EXPAND + + + + + True + True + + False + False + True + True + + + 1 + 2 + GTK_EXPAND + + + + + True + False + sg-box-setting-add-type-liststore + 0 + + + + 0 + + + + + 1 + 2 + 1 + 2 + GTK_EXPAND + + + + + True + False + + + 2 + 3 + 4 + + + + + True + False + Default value: + + + 2 + 3 + + + + + True + True + + False + False + True + True + + + 1 + 2 + 2 + 3 + + + + + True + True + 1 + + + + + + + + + + + + + + + + + + + Press any "Help" button for more detail about a field. + + + False + center + + + True + False + 10 + 10 + + + True + False + <big><b><span fgcolor='#006400'>Welcome to the OpenViBE Skeleton-Generator !</span></b> +Fill the tabs below with what you need, +then run the checking routine and generate the files.</big> + +<i>Press any 'help' button to have more detail about a field in the Console below.</i> + True + center + + + True + True + 0 + + + + + True + True + + + True + False + 11 + 5 + 5 + 5 + + + + + + + + + + + + + + + + + + + + + True + False + Box name: + right + + + + + True + True + + False + False + True + True + + + + 1 + 2 + + + + + True + False + Version: + + + 2 + 3 + + + + + True + True + + False + False + True + True + + + + 3 + 4 + + + + + gtk-help + True + True + True + True + + + 4 + 5 + GTK_EXPAND + GTK_EXPAND + + + + + True + False + + + 5 + 2 + 3 + + + + + True + False + Short description: + + + 4 + 5 + + + + + True + True + + False + False + True + True + + + + 1 + 4 + 4 + 5 + + + + + True + False + Detailed description: + + + 5 + 7 + + + + + gtk-help + True + True + True + True + + + 4 + 5 + 4 + 7 + GTK_EXPAND + GTK_EXPAND + + + + + True + False + Box icon: + + + 8 + 9 + + + + + True + False + sg-box-icons-liststore + + + + + 1 + 0 + + + + + + 1 + + + + + 1 + 2 + 8 + 9 + GTK_EXPAND + + + + + True + False + + + 5 + 7 + 8 + + + + + gtk-help + True + True + True + True + + + 4 + 5 + 8 + 9 + GTK_EXPAND + GTK_EXPAND + + + + + True + False + + + 5 + 9 + 10 + + + + + True + False + <i>Your box will be automatically flagged as <span fgcolor='red'>UNSTABLE</span> +Don't forget to set the configuration variable <b>Designer_ShowUnstable</b> to TRUE +in your configuration file in order to see it in the Designer.</i> + True + center + + + 5 + 10 + 11 + + + + + True + True + automatic + automatic + in + + + 50 + True + True + word + 1 + 1 + sg-box-detailed-description-textbuffer + + + + + 1 + 4 + 5 + 7 + + + + + True + False + Class name: + + + 1 + 2 + + + + + True + True + + False + False + True + True + + + + 1 + 2 + 1 + 2 + + + + + gtk-help + True + True + True + True + + + 4 + 5 + 1 + 2 + GTK_EXPAND + GTK_EXPAND + + + + + True + False + Category: + + + 3 + 4 + + + + + True + True + + False + False + True + True + + + + 1 + 2 + 3 + 4 + + + + + gtk-help + True + True + True + True + + + 4 + 5 + 3 + 4 + GTK_EXPAND + GTK_EXPAND + + + + + + + True + False + General + + + False + + + + + True + False + 3 + 4 + 2 + 5 + 5 + + + True + False + <big>Please describe the box input(s), by providing +a name and a type for each input</big> + True + center + + + 2 + GTK_EXPAND + GTK_EXPAND + + + + + True + False + 3 + + + gtk-add + True + True + True + True + + + False + False + 0 + + + + + gtk-remove + True + True + True + True + + + False + False + 1 + + + + + True + False + + + False + True + 5 + 2 + + + + + gtk-help + True + True + True + True + + + False + False + 3 + + + + + 1 + 2 + 1 + 2 + GTK_EXPAND + GTK_EXPAND + + + + + The input(s) can be modified by the box user + True + True + False + True + + + 2 + 3 + + + + + Inputs can be added and removed by the box user + True + True + False + True + + + 3 + 4 + + + + + gtk-help + True + True + True + True + + + 1 + 2 + 2 + 3 + GTK_EXPAND + GTK_EXPAND + + + + + gtk-help + True + True + True + True + + + 1 + 2 + 3 + 4 + GTK_EXPAND + GTK_EXPAND + + + + + True + True + automatic + automatic + in + + + True + True + sg-box-inputs-liststore + False + 0 + + + autosize + Name + + + + 0 + + + + + + + Type + + + + 1 + + + + + + + + + 1 + 2 + + + + + 1 + + + + + True + False + Inputs + + + 1 + False + + + + + True + False + 3 + 4 + 2 + 5 + 5 + + + True + False + <big>Please describe the box output(s), by providing +a name and a type for each output</big> + True + center + + + 2 + GTK_EXPAND + GTK_EXPAND + + + + + True + False + 3 + + + gtk-add + True + True + True + True + + + False + False + 0 + + + + + gtk-remove + True + True + True + True + + + False + False + 1 + + + + + True + False + + + False + True + 5 + 2 + + + + + gtk-help + True + True + True + True + + + False + False + 3 + + + + + 1 + 2 + 1 + 2 + GTK_EXPAND + GTK_EXPAND + + + + + The output(s) can be modified by the box user + True + True + False + True + + + 2 + 3 + + + + + Outputs can be added and removed by the box user + True + True + False + True + + + 3 + 4 + + + + + gtk-help + True + True + True + True + + + 1 + 2 + 2 + 3 + GTK_EXPAND + GTK_EXPAND + + + + + gtk-help + True + True + True + True + + + 1 + 2 + 3 + 4 + GTK_EXPAND + GTK_EXPAND + + + + + True + True + automatic + automatic + in + + + True + True + sg-box-outputs-liststore + False + 0 + + + Name + + + + 0 + + + + + + + Type + + + + 1 + + + + + + + + + 1 + 2 + + + + + 2 + + + + + True + False + Outputs + + + 2 + False + + + + + True + False + 3 + 4 + 2 + 5 + 5 + + + True + False + <big>Please describe the box setting(s), by providing +a name, a type and a default value for each setting</big> + True + center + + + 2 + GTK_EXPAND + GTK_EXPAND + + + + + True + False + 3 + + + gtk-add + True + True + True + True + + + False + False + 0 + + + + + gtk-remove + True + True + True + True + + + False + False + 1 + + + + + True + False + + + False + True + 5 + 2 + + + + + gtk-help + True + True + True + True + + + False + False + 3 + + + + + 1 + 2 + 1 + 2 + GTK_EXPAND + GTK_EXPAND + + + + + The setting(s) can be modified by the box user + True + True + False + True + + + 2 + 3 + + + + + Settings can be added and removed by the box user + True + True + False + True + + + 3 + 4 + + + + + gtk-help + True + True + True + True + + + 1 + 2 + 2 + 3 + GTK_EXPAND + GTK_EXPAND + + + + + gtk-help + True + True + True + True + + + 1 + 2 + 3 + 4 + GTK_EXPAND + GTK_EXPAND + + + + + True + True + automatic + automatic + in + + + True + True + sg-box-settings-liststore + False + 0 + + + Name + + + + 0 + + + + + + + Type + + + + 1 + + + + + + + Default Value + + + + 2 + + + + + + + + + 1 + 2 + + + + + 3 + + + + + True + False + Settings + + + 3 + False + + + + + True + False + 3 + 2 + 2 + 5 + 5 + + + True + False + <big>Select the stream decoder(s) and encoder(s) you want to use in the box. +The skeleton generator will handle the initialisation and +destruction of these algorithms. +<span fgcolor='#BB0000'>The connection between algorithms (reference targets) +has to be done manually.</span> +</big> + True + center + + + 3 + GTK_EXPAND + GTK_EXPAND + + + + + True + False + 3 + + + gtk-add + True + True + True + True + + + False + False + 0 + + + + + gtk-remove + True + True + True + True + + + False + False + 1 + + + + + True + False + + + False + True + 5 + 2 + + + + + gtk-help + True + True + True + True + + + False + False + 3 + + + + + 2 + 3 + 1 + 2 + + GTK_EXPAND + + + + + True + True + automatic + automatic + in + + + True + True + sg-box-algorithms-liststore + False + 0 + + + Name + + + + 0 + + + + + + + + + 2 + 1 + 2 + + + + + 4 + + + + + True + False + Codec Algorithms + + + 4 + False + + + + + True + False + + + True + False + <big><b>Processing Methods</b></big> +Depending on your needs, OpenViBE can call the box 'process' method in 2 different ways : +whenever a new input chunk is received on any input, <u>and/or</u> on every tick of a defined clock. +In your box implementation, you choose to activate or not these 2 behaviours +by overwritting 2 callbacks: <b>'processInput'</b> and <b>'processClock'</b>. + + True + center + + + True + True + 0 + + + + + Call the 'process' callback whenever a new input chunk is available + True + True + False + True + True + + + True + True + 1 + + + + + Call the 'processClock' callback at a specific frequency + True + True + False + True + + + + True + True + 2 + + + + + True + False + + + + + + True + False + Clock Frequency (in Hertz): + + + True + True + 1 + + + + + True + False + True + + False + False + True + True + adjustment1 + True + + + True + False + 2 + + + + + True + False + + + True + True + 3 + + + + + True + False + + + True + True + 4 + + + + + True + False + + + True + True + 5 + + + + + True + False + + + True + True + 6 + + + + + True + False + 5 + 4 + + + + + + + + + + + + + + 5 + + + + + True + False + Processing Method + + + 6 + False + + + + + True + False + 5 + + + True + False + + + Implement a Box Listener + True + True + False + True + + + + True + True + 10 + 0 + + + + + gtk-help + True + True + True + True + + + False + True + 10 + 1 + + + + + False + False + 10 + 0 + + + + + True + False + + + False + True + 1 + + + + + True + False + 7 + 3 + + + True + False + <b>Input Callbacks</b> + True + + + + + True + False + <b>Output Callbacks</b> + True + + + 1 + 2 + + + + + True + False + <b>Settings Callbacks</b> + True + + + 2 + 3 + + + + + On input added + True + True + False + True + + + 1 + 2 + + + + + On input removed + True + True + False + True + + + 2 + 3 + + + + + On input type changed + True + True + False + True + + + 3 + 4 + + + + + On input name changed + True + True + False + True + + + 4 + 5 + + + + + On input connected + True + True + False + True + + + 5 + 6 + + + + + On input disconnected + True + True + False + True + + + 6 + 7 + + + + + On output added + True + True + False + True + + + 1 + 2 + 1 + 2 + + + + + On output removed + True + True + False + True + + + 1 + 2 + 2 + 3 + + + + + On output type changed + True + True + False + True + + + 1 + 2 + 3 + 4 + + + + + On output name changed + True + True + False + True + + + 1 + 2 + 4 + 5 + + + + + On output connected + True + True + False + True + + + 1 + 2 + 5 + 6 + + + + + On setting added + True + True + False + True + + + 2 + 3 + 1 + 2 + + + + + On setting removed + True + True + False + True + + + 2 + 3 + 2 + 3 + + + + + On setting type changed + True + True + False + True + + + 2 + 3 + 3 + 4 + + + + + On setting name changed + True + True + False + True + + + 2 + 3 + 4 + 5 + + + + + On setting default value changed + True + True + False + True + + + 2 + 3 + 5 + 6 + + + + + On setting value changed + True + True + False + True + + + 2 + 3 + 6 + 7 + + + + + On output disconnected + True + True + False + True + + + 1 + 2 + 6 + 7 + + + + + True + True + 2 + + + + + 6 + + + + + True + False + Box Listener + + + 6 + False + + + + + True + True + 1 + + + + + True + False + + + False + True + 16 + 2 + + + + + True + False + <b><span color="#006400"><big> | Help and Status Console | </big></span></b> + True + + + True + True + 3 + + + + + 175 + True + True + adjustment3 + automatic + automatic + out + + + True + True + 2 + 2 + False + 5 + 5 + False + sg-box-tooltips-textbuffer + + + + + True + True + 4 + + + + + True + False + 10 + 10 + + + Check... + True + True + True + + + True + True + 0 + + + + + Generate ! + True + False + True + True + + + True + True + 1 + + + + + Save & Exit + True + True + True + + + True + True + 2 + + + + + False + False + 5 + + + + + + + Press any "Help !" button for more detail about a field. + + + + + + + + + + 800 + 500 + False + False + center + + + True + False + 10 + 10 + + + True + False + 5 + 4 + 10 + 10 + + + True + False + Driver name: + right + + + + + True + True + + False + False + True + True + + + 1 + 3 + 3 + 4 + + + + + True + True + + False + False + True + True + + + 1 + 3 + + + + + True + True + + False + False + True + True + adjustment1 + + + 1 + 2 + 2 + 3 + + + + + True + True + + False + False + True + True + adjustment2 + + + 2 + 3 + 2 + 3 + + + + + True + False + Class name: + + + 1 + 2 + + + + + True + True + 20 + + False + False + True + True + + + 1 + 3 + 1 + 2 + + + + + True + False + Target directory: + + + 4 + 5 + + + + + gtk-help + True + True + True + True + + + 3 + 4 + GTK_EXPAND + GTK_EXPAND + + + + + gtk-help + True + True + True + True + + + 3 + 4 + 1 + 2 + GTK_EXPAND + GTK_EXPAND + + + + + gtk-help + True + True + True + True + + + 3 + 4 + 2 + 3 + GTK_EXPAND + GTK_EXPAND + + + + + gtk-help + True + True + True + True + + + 3 + 4 + 3 + 4 + GTK_EXPAND + GTK_EXPAND + + + + + gtk-help + True + True + True + True + + + 3 + 4 + 4 + 5 + GTK_EXPAND + GTK_EXPAND + + + + + True + False + select-folder + Select a folder + + + 1 + 3 + 4 + 5 + + + + + True + False + Sampling frequencies + + + 3 + 4 + + + + + True + False + Min & Max channel count: + + + 2 + 3 + + + + + True + True + 0 + + + + + True + True + automatic + automatic + in + + + True + True + 2 + 2 + False + 5 + 5 + False + sg-driver-tooltips-textbuffer + + + + + True + True + 1 + + + + + True + False + 10 + 10 + + + Check... + True + True + True + + + True + True + 0 + + + + + Generate ! + True + False + True + True + + + True + True + 1 + + + + + Save & Exit + True + True + True + + + True + True + 2 + + + + + False + False + 2 + + + + + + + 800 + 300 + False + 10 + OpenViBE Skeleton-Generator + False + center + normal + + + True + False + 2 + + + True + False + end + + + + + + + + + False + True + end + 0 + + + + + True + False + 5 + 3 + 10 + + + + + + + + + True + False + <span size="larger" foreground="#602020"> OpenViBE Skeleton-Generator</span> + +Please select the skeleton you want to generate : + + True + center + + + 3 + + + + + Driver skeleton + True + True + False + True + True + + + 2 + 3 + + + + + Algorithm skeleton + True + False + True + sg-driver-selection-radio-button + + + 3 + 4 + + + + + Box skeleton + True + True + False + True + sg-driver-selection-radio-button + + + 4 + 5 + + + + + True + False + + + 3 + 1 + 2 + + + + + True + False + Author: + + + 1 + 2 + 2 + 3 + + + + + True + False + Company: + + + 1 + 2 + 3 + 4 + + + + + True + True + + False + False + True + True + + + 2 + 3 + 2 + 3 + + + + + True + True + + False + False + True + True + + + 2 + 3 + 3 + 4 + + + + + True + True + 1 + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/interface.ui-skeleton b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/interface.ui-skeleton new file mode 100644 index 0000000..2e37bcc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/interface.ui-skeleton @@ -0,0 +1,323 @@ + + + + 100 + 0 + 10 + 1 + 0 + 18 + + + 100 + 0 + 10 + 1 + 0 + 0 + + + @@MaxChannel@@ + @@MinChannel@@ + 10 + 1 + 0 + @@MaxChannel@@ + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + @@SamplingFrequencyList@@ + + + + + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + @@DriverName@@ + center + + + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 5 + 2 + True + + + True + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + Sampling frequency : + right + True + + + 4 + 5 + + + + + True + Number of channels : + right + True + + + 3 + 4 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Identifier : + right + True + + + + + True + 0 + model2 + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + True + adjustment3 + True + True + + + 1 + 2 + 3 + 4 + + + + + 0 + + + + + 0 + + + + + Change channel names + True + False + False + + + False + 1 + + + + + 3 + + + + + True + + + False + 4 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/readme-box.txt-skeleton b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/readme-box.txt-skeleton new file mode 100644 index 0000000..b58575f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/readme-box.txt-skeleton @@ -0,0 +1,51 @@ +****************************************************** +* Thanks for using the OpenViBE Skeleton Generator ! * +****************************************************** + +File generation completed +[@@Date@@] +------------------------- + +The generator produced the following files: + +The Box class: +- ovpCBoxAlgorithm@@ClassName@@.h +- ovpCBoxAlgorithm@@ClassName@@.cpp +Please put these files in your local repository, in the project of your choice (e.g. Signal Processing or Classification) + [openvibe-repository]/contrib/plugins/[plugin-project]/src/[my-box-folder] + +You may have to change the file ovpCBoxAlgorithm@@ClassName@@.h to make it find the included file ovp_defines.h, whose path is related to the project used. + +Don't forget to declare your box in ovp_main.cpp, in order to make it available in the Designer. +Look in one of the ovp_main.cpp file, you will find examples of such declarations (#include the header, then OVP_Declare_New macro). +This look something like this: + +#include "[my-box-folder]/ovpCBoxAlgorithm@@ClassName@@.h" + +... + +OVP_Declare_Begin(); + +... + +OVP_Declare_New(OpenViBE::Plugins::@@Namespace@@::CBoxAlgorithm@@ClassName@@Desc); +... + +OVP_Declare_End() + + +If your box doesn't appear in the designer, maybe it's because you cannot see Unstable Boxes. +Try to set your configuration file (openvibe.conf on windows / .openviberc on Linux) with the following token : +>>>>> +Designer_ShowUnstable = true +>>>>> + +For more information about implementing algorithms and boxes to fill your skeleton, please read the official tutorial: +http://openvibe.inria.fr/tutorial-1-implementing-a-signal-processing-box/ + +Feel free to propose your contribution on the forum ! +http://openvibe.inria.fr/forum/ + +Enjoy OpenViBE ! + +- The development team - diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/readme-driver.txt-skeleton b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/readme-driver.txt-skeleton new file mode 100644 index 0000000..f56c6e5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/readme-driver.txt-skeleton @@ -0,0 +1,42 @@ +****************************************************** +* Thanks for using the OpenViBE Skeleton Generator ! * +****************************************************** + +File generation completed +[@@Date@@] +------------------------- + +WARNING: +Writing a new driver for an EEG device is often dependent on hardware specifications, such as OS compatibility +or communication protocol. The generator gives you only the basic skeletons for easy integration with OpenViBE, +please refer to your device specifications (API, protocol description, etc.) for the next steps... + +The generator produced the following files: + +The Configuration and Driver classes: +- ovasCConfiguration@@ClassName@@.h +- ovasCConfiguration@@ClassName@@.cpp +- ovasCDriver@@ClassName@@.h +- ovasCDriver@@ClassName@@.cpp +You can put these files here in your local repository: + [openvibe-repository]/contrib/plugins/server-drivers/[my-device]/src/ + +The glade interface: +- interface-@@ClassName@@.glade +You can put this file in here in your local repository: + [openvibe-repository]/contrib/plugins/server-drivers/[my-device]/share/ + +Don't forget to declare your driver to the Acquisition Server application. +This happens in "./contrib/common/contribAcquisitionServer.inl", there you +will find examples of such declarations. You also need to register the source +files to CMake, modifying the corresponding "contribAcquisitionServer.cmake". + +For more information about building a new driver and filling your skeleton, please read the official tutorial: +http://openvibe.inria.fr/tutorial-creating-a-new-driver-for-the-acquisition-server/ + +Feel free to propose your contribution on the forum ! +http://openvibe.inria.fr/forum/ + +Enjoy OpenViBE ! + +- The development team - diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/skeleton-generator.conf b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/skeleton-generator.conf new file mode 100755 index 0000000..687ef48 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/share/skeleton-generator.conf @@ -0,0 +1,14 @@ +###################################################################################### +## OpenViBE configuration file, application specific values +## +## - The file consists of a list of "token name = token value" +## - Whatever space / tabulation at the begining or end of a line is removed +## - Comments start with # +## - Lines ending with \ continue on the next line (all ending \ are removed) +## - On Windows, use / in paths as \ is reserved +## - You can use ${token name} in a token value +## - You can use $Environment{env name} in a token value to get an environment variable +###################################################################################### + +CustomConfiguration = ${CustomConfigurationPrefix${OperatingSystem}}${CustomConfigurationSuffix${OperatingSystem}} +CustomConfigurationApplication = ${CustomConfigurationPrefix${OperatingSystem}}-${ApplicationName}${CustomConfigurationSuffix${OperatingSystem}} \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCBoxAlgorithmSkeletonGenerator.cpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCBoxAlgorithmSkeletonGenerator.cpp new file mode 100755 index 0000000..2d5bb58 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCBoxAlgorithmSkeletonGenerator.cpp @@ -0,0 +1,1570 @@ +#include "ovsgCBoxAlgorithmSkeletonGenerator.h" + +#include +#include + +#include +#include + +#include + +#include +#include +#include + +#define TO_GTK_UTF8(s) g_locale_to_utf8((s), -1, nullptr, nullptr, nullptr) + +namespace OpenViBE { +namespace SkeletonGenerator { + +//Modified version of https://stackoverflow.com/questions/36435204/converting-a-cstring-to-camelcase +static std::string camelCase(const std::string& in) +{ + std::string out(in); + bool active = true; + + for (size_t i = 0; i < out.length();) + { + if (std::isalpha(out[i])) + { + if (active) + { + out[i] = std::toupper(out[i]); + active = false; + } + else { out[i] = std::tolower(out[i]); } + i++; + } + else if (out[i] == ' ') + { + active = true; + out.erase(i, 1); + } + } + return out; +} + +static std::vector ExtractKeys(const std::map& in) +{ + std::vector res; + for (const auto& element : in) { res.push_back(element.first); } + return res; +} + +bool CDummyAlgoProto::addInputParameter(const CIdentifier& /*id*/, const CString& name, const Kernel::EParameterType typeID, const CIdentifier& /*subTypeID*/) +{ + m_Inputs[std::string(name.toASCIIString())] = typeID; + return true; +} + +bool CDummyAlgoProto::addOutputParameter(const CIdentifier& /*id*/, const CString& name, const Kernel::EParameterType typeID, const CIdentifier& /*subTypeID*/) +{ + m_Outputs[std::string(name.toASCIIString())] = typeID; + return true; +} + +bool CDummyAlgoProto::addInputTrigger(const CIdentifier& /*id*/, const CString& name) +{ + m_InputTriggers.push_back(std::string(name.toASCIIString())); + return true; +} + +bool CDummyAlgoProto::addOutputTrigger(const CIdentifier& /*id*/, const CString& name) +{ + m_OutputTriggers.push_back(std::string(name.toASCIIString())); + return true; +} + +//----------------------------------------------------------------------- +static void CheckCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonCheckCB(); } +static void TooltipCB(GtkButton* button, void* data) { static_cast(data)->buttonTooltipCB(button); } +static void OkCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonOkCB(); } +static void AddInputCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonAddInputCB(); } +static void RemInputCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonRemoveGeneric("sg-box-inputs-treeview"); } +static void AddOutputCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonAddOutputCB(); } + +static void RemOutputCB(GtkButton* /*button*/, void* data) +{ + static_cast(data)->buttonRemoveGeneric("sg-box-outputs-treeview"); +} + +static void AddSettingCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonAddSettingCB(); } + +static void RemSettingCB(GtkButton* /*button*/, void* data) +{ + static_cast(data)->buttonRemoveGeneric("sg-box-settings-treeview"); +} + +static void AddAlgorithmCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonAddAlgorithmCB(); } + +static void RemAlgorithmCB(GtkButton* /*button*/, void* data) +{ + static_cast(data)->buttonRemoveGeneric("sg-box-algorithms-treeview"); +} + +static void AlgorithmSelectedCB(GtkComboBox* comboBox, void* data) +{ + static_cast(data)->algorithmSelectedCB(gtk_combo_box_get_active(comboBox)); +} + +static void ExitCB(GtkButton* /*button*/, void* data) +{ + static_cast(data)->buttonExitCB(); + gtk_exit(0); +} +//----------------------------------------------------------------------- + +extern "C" G_MODULE_EXPORT void entry_modified_cb(GtkWidget* /*widget*/, void* data) +{ + static_cast(data)->setSensitivity("sg-box-ok-button", false); +} + +extern "C" G_MODULE_EXPORT void listener_checkbutton_toggled_cb(GtkWidget* widget, void* data) +{ + static_cast(data)->toggleListenerCheckbuttonsStateCB((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) > 0)); +} + +extern "C" G_MODULE_EXPORT void processing_method_clock_toggled(GtkWidget* widget, void* data) +{ + // toggle clock frequency state + static_cast(data)->setSensitivity("sg-box-process-frequency-spinbutton", + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) > 0); +} +//----------------------------------------------------------------------- + +void CBoxAlgorithmSkeletonGenerator::buttonExitCB() +{ + getCommonParameters(); + getCurrentParameters(); + if (!cleanConfigurationFile(m_configFile)) { return; } + saveCommonParameters(m_configFile); + save(m_configFile); + + getLogManager() << Kernel::LogLevel_Info << "All entries saved in [" << m_configFile << "]. Exiting.\n"; +} + +void CBoxAlgorithmSkeletonGenerator::toggleListenerCheckbuttonsStateCB(const bool state) const +{ + setSensitivity("sg-box-listener-input-added-checkbutton", state); + setSensitivity("sg-box-listener-input-removed-checkbutton", state); + setSensitivity("sg-box-listener-input-type-checkbutton", state); + setSensitivity("sg-box-listener-input-name-checkbutton", state); + setSensitivity("sg-box-listener-input-connected-checkbutton", state); + setSensitivity("sg-box-listener-input-disconnected-checkbutton", state); + + setSensitivity("sg-box-listener-output-added-checkbutton", state); + setSensitivity("sg-box-listener-output-removed-checkbutton", state); + setSensitivity("sg-box-listener-output-type-checkbutton", state); + setSensitivity("sg-box-listener-output-name-checkbutton", state); + setSensitivity("sg-box-listener-output-connected-checkbutton", state); + setSensitivity("sg-box-listener-output-disconnected-checkbutton", state); + + setSensitivity("sg-box-listener-setting-added-checkbutton", state); + setSensitivity("sg-box-listener-setting-removed-checkbutton", state); + setSensitivity("sg-box-listener-setting-type-checkbutton", state); + setSensitivity("sg-box-listener-setting-name-checkbutton", state); + setSensitivity("sg-box-listener-setting-connected-checkbutton", state); + setSensitivity("sg-box-listener-setting-disconnected-checkbutton", state); +} + +void CBoxAlgorithmSkeletonGenerator::buttonCheckCB() +{ + getLogManager() << Kernel::LogLevel_Info << "Extracting values... \n"; + //Author and Company + getCommonParameters(); + //Box generator entries + getCurrentParameters(); + + getLogManager() << Kernel::LogLevel_Info << "Checking values... \n"; + + bool success = true; + + std::stringstream ss; + ss << "----- STATUS -----\n"; + + //-------------------------------------------------------------------------------------------------------------------------------------------// + // Box Description + //-------------------------------------------------------------------------------------------------------------------------------------------// + + if (!isStringValid(m_Name)) + { + OV_WARNING_K("-- box name: INVALID (" << m_Name << ")"); + ss << "[FAILED] No name found. Please provide a name for the box (all characters allowed).\n"; + success = false; + } + else + { + //m_Name = ensureSedCompliancy(m_Name); + getLogManager() << Kernel::LogLevel_Info << "-- box name: VALID (" << m_Name << ")\n"; + ss << "[ OK ] Valid box name.\n"; + } + + const auto checkRegex = [&success, &ss, this](std::string& str, const boost::regex& regex, const std::string& successText, const std::string& errorText) + { + if (regex_match(str, regex)) + { + getLogManager() << Kernel::LogLevel_Info << "-- " << successText; + ss << "[ OK ] " << successText; + } + else + { + OV_WARNING_K("-- " << errorText); + ss << "[FAILED] " << errorText; + success = false; + } + }; + + checkRegex(m_ClassName, boost::regex("([a-z]|[A-Z])+([a-z]|[A-Z]|[0-9]|[_])*", boost::regex::perl), "Valid class name (" + m_ClassName + ").\n", + "Invalid class name (" + m_ClassName + "). Please provide a class name using lower/upper case letters, numbers or underscores.\n"); + + checkRegex(m_Category, boost::regex("([a-z]|[A-Z])+([a-z]|[A-Z]|[ ]|[/])*", boost::regex::perl), "Valid category (" + m_Category + ").\n", + "Invalid category (" + m_Category + "). Please provide a category using only letters and spaces (for sub-category, use '/' separator).\n"); + + checkRegex(m_Version, boost::regex("([0-9])+([a-z]|[A-Z]|[0-9]|[\\.])*", boost::regex::perl), "Valid box version (" + m_Version + ").\n", + "Invalid box version (" + m_Version + "). Please use a number followed by either numbers, letters or '.'.\n"); + + //m_ShortDesc = ensureSedCompliancy(m_ShortDesc); + getLogManager() << Kernel::LogLevel_Info << "-- short description: VALID (" << m_ShortDesc << ")\n"; + ss << "[ OK ] Valid short description.\n"; + + if (m_DetailedDesc.length() < 500) + { + //m_DetailedDesc = ensureSedCompliancy(m_DetailedDesc); + getLogManager() << Kernel::LogLevel_Info << "-- detailed description: VALID (" << m_DetailedDesc << ")\n"; + ss << "[ OK ] Valid detailed description.\n"; + } + + //-------------------------------------------------------------------------------------------------------------------------------------------// + // Box INPUTS OUTPUTS and SETTINGS + //-------------------------------------------------------------------------------------------------------------------------------------------// + + auto setLogHeader = [&ss, this](const size_t collectionSize, const char* typeText) + { + if (collectionSize != 0) + { + ss << "Checking " << typeText << "... \n"; + getLogManager() << Kernel::LogLevel_Info << "-- checking " << typeText << "s...\n"; + } + else + { + ss << "[----//----] No " << typeText << " specified.\n"; + getLogManager() << Kernel::LogLevel_Info << "No " << typeText << " specified.\n"; + } + }; + + const auto checkCollection = [&success, &setLogHeader, &ss, this](std::vector& collection, const char* type, const char* solution) + { + std::string capitalized(type); + capitalized[0] = std::toupper(capitalized[0]); + setLogHeader(collection.size(), type); + for (size_t i = 0; i < collection.size(); ++i) + { + if (isStringValid(collection[i].name) && isStringValid(collection[i].type)) + { + collection[i].name = ensureSedCompliancy(collection[i].name); + getLogManager() << Kernel::LogLevel_Info << " -- " << capitalized << " " << i << ": [" << collection[i].name << "],[" + << collection[i].type << "] VALID.\n"; + ss << ">>[ OK ] Valid " << type << " " << i << " [" << collection[i].name << "]\n"; + } + else + { + OV_WARNING_K(" -- " << capitalized << " " << i << ": [" << collection[i].name<<"],["<< collection[i].type<< "] INVALID."); + ss << ">>[FAILED] Invalid " << type << " " << i << ". " << solution << "\n"; + success = false; + } + } + }; + + checkCollection(m_Inputs, "input", "Please provide a name and a type for each input."); + checkCollection(m_Outputs, "output", "Please provide a name and a type for each output."); + checkCollection(m_Settings, "setting", "Please provide a name, a type and a default value for each setting."); + + //checking the algorithms... + setLogHeader(m_Algorithms.size(), "algorithm"); + for (size_t i = 0; i < m_Algorithms.size(); ++i) + { + getLogManager() << Kernel::LogLevel_Info << " -- Algorithm " << i << ": [" << m_Algorithms[i] << "] VALID.\n"; + ss << ">>[ OK ] Valid algorithm " << i << " [" << m_Algorithms[i] << "]\n"; + } + + //-------------------------------------------------------------------------------------------------------------------------------------------// + GtkWidget* textview = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-tooltips-textview")); + GtkTextBuffer* buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); + if (success) + { + ss << "----- SUCCESS -----\nPress 'Generate!' to generate the files. If you want to modify your choice(s), please press the \"Check\" button again."; + setSensitivity("sg-box-ok-button", true); + } + else + { + ss << "----- PROCESS FAILED -----\nModify your choices and press the \"Check\" button again."; + setSensitivity("sg-box-ok-button", false); + } + + gtk_text_buffer_set_text(buffer, TO_GTK_UTF8(ss.str().c_str()), -1); +} + +void CBoxAlgorithmSkeletonGenerator::buttonOkCB() +{ + getLogManager() << Kernel::LogLevel_Info << "Generating files, please wait ... \n"; + std::string log = "Generating files...\n"; + GtkWidget* textview = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-tooltips-textview")); + GtkTextBuffer* buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); + + bool success = true; + + // we ask for a target directory + GtkWidget* dialog = gtk_file_chooser_dialog_new("Select the destination folder", nullptr, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, nullptr); + + std::string directory; + // if the user specified a target directory, it has full priority + directory = m_kernelCtx.getConfigurationManager().expand("${SkeletonGenerator_TargetDirectory}"); +#ifdef TARGET_OS_Linux + bool needFilePrefix = false; +#endif + if (!directory.empty()) + { + getLogManager() << Kernel::LogLevel_Debug << "Target dir user [" << directory << "]\n"; +#ifdef TARGET_OS_Linux + needFilePrefix = true; +#endif + } + else + { + //previous entry + directory = m_kernelCtx.getConfigurationManager().expand("${SkeletonGenerator_Box_TargetDirectory}"); + if (!directory.empty()) + { + getLogManager() << Kernel::LogLevel_Debug << "Target previous [" << directory << "]\n"; +#ifdef TARGET_OS_Linux + needFilePrefix = true; +#endif + } + else + { + //default path = dist + getLogManager() << Kernel::LogLevel_Debug << "Target default [dist]\n"; +#ifdef TARGET_OS_Linux + char* current_dir = gtk_file_chooser_get_current_folder_uri(GTK_FILE_CHOOSER(dialog)); + if (current_dir) { + directory = std::string(current_dir) + "/.."; + } +#elif defined TARGET_OS_Windows + directory = ".."; +#endif + } + } +#ifdef TARGET_OS_Linux + if(needFilePrefix) directory = "file://" + directory; + gtk_file_chooser_set_current_folder_uri(GTK_FILE_CHOOSER(dialog), directory.c_str()); +#elif defined TARGET_OS_Windows + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), directory.c_str()); +#endif + + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) + { + char* tmp = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + m_directory = tmp; + } + else + { + getLogManager() << Kernel::LogLevel_Info << "User cancel. Aborting generation.\n"; + log += "User cancel. Aborting generation.\n"; + gtk_text_buffer_set_text(buffer, TO_GTK_UTF8(log.c_str()), -1); + gtk_widget_destroy(dialog); + return; + } + gtk_widget_destroy(dialog); + + // replace tags in the algorithm description + if (USE_CODEC_TOOLKIT) + { + for (size_t i = 0; i < m_Algorithms.size(); ++i) + { + std::string algo = m_AlgoDeclaration[m_Algorithms[i]]; + size_t it = algo.find("@@ClassName@@"); + if (it != std::string::npos) + { + std::string className = "CBoxAlgorithm" + m_ClassName; + algo.replace(it, 13, className); + m_AlgoDeclaration[m_Algorithms[i]] = algo; + } + } + } + + std::string date = getDate(); + // we construct the map of substitutions + std::map substitutions; + substitutions["@@Author@@"] = m_author; + substitutions["@@Date@@"] = date; + substitutions["@@Company@@"] = m_company; + substitutions["@@Date@@"] = date; + substitutions["@@BoxName@@"] = m_Name; + substitutions["@@ClassName@@"] = m_ClassName; + substitutions["@@RandomIdentifierClass@@"] = getRandomIdentifierString(); + substitutions["@@RandomIdentifierDescriptor@@"] = getRandomIdentifierString(); + substitutions["@@ShortDescription@@"] = m_ShortDesc; + substitutions["@@DetailedDescription@@"] = m_DetailedDesc; + substitutions["@@Category@@"] = m_Category; + substitutions["@@Namespace@@"] = camelCase(m_Category); + substitutions["@@Version@@"] = m_Version; + substitutions["@@StockItemName@@"] = m_GtkStockItemName; + substitutions["@@InputFlagCanAdd@@"] = (m_CanAddInputs ? "prototype.addFlag(Kernel::BoxFlag_CanAddInput);" + : "//prototype.addFlag(Kernel::BoxFlag_CanAddInput);"); + substitutions["@@InputFlagCanModify@@"] = (m_CanModifyInputs ? "prototype.addFlag(Kernel::BoxFlag_CanModifyInput);" + : "//prototype.addFlag(Kernel::BoxFlag_CanModifyInput);"); + substitutions["@@OutputFlagCanAdd@@"] = (m_CanAddOutputs ? "prototype.addFlag(Kernel::BoxFlag_CanAddOutput);" + : "//prototype.addFlag(Kernel::BoxFlag_CanAddOutput);"); + substitutions["@@OutputFlagCanModify@@"] = (m_CanModifyOutputs ? "prototype.addFlag(Kernel::BoxFlag_CanModifyOutput);" + : "//prototype.addFlag(Kernel::BoxFlag_CanModifyOutput);"); + substitutions["@@SettingFlagCanAdd@@"] = (m_CanAddSettings ? "prototype.addFlag(Kernel::BoxFlag_CanAddSetting);" + : "//prototype.addFlag(Kernel::BoxFlag_CanAddSetting);"); + substitutions["@@SettingFlagCanModify@@"] = (m_CanModifySettings ? "prototype.addFlag(Kernel::BoxFlag_CanModifySetting);" + : "//prototype.addFlag(Kernel::BoxFlag_CanModifySetting);"); + substitutions["@@BoxListenerCommentIn@@"] = (m_UseBoxListener ? "" : "/*"); + substitutions["@@BoxListenerCommentOut@@"] = (m_UseBoxListener ? "" : "*/"); + substitutions["@@BoxListenerOnInputConnectedComment@@"] = (m_HasOnInputConnected ? "" : "//"); + substitutions["@@BoxListenerOnInputDisconnectedComment@@"] = (m_HasOnInputDisconnected ? "" : "//"); + substitutions["@@BoxListenerOnInputAddedComment@@"] = (m_HasOnInputAdded ? "" : "//"); + substitutions["@@BoxListenerOnInputRemovedComment@@"] = (m_HasOnInputRemoved ? "" : "//"); + substitutions["@@BoxListenerOnInputTypeChangedComment@@"] = (m_HasOnInputTypeChanged ? "" : "//"); + substitutions["@@BoxListenerOnInputNameChangedComment@@"] = (m_HasOnInputNameChanged ? "" : "//"); + substitutions["@@BoxListenerOnOutputConnectedComment@@"] = (m_HasOnOutputConnected ? "" : "//"); + substitutions["@@BoxListenerOnOutputDisconnectedComment@@"] = (m_HasOnOutputDisconnected ? "" : "//"); + substitutions["@@BoxListenerOnOutputAddedComment@@"] = (m_HasOnOutputAdded ? "" : "//"); + substitutions["@@BoxListenerOnOutputRemovedComment@@"] = (m_HasOnOutputRemoved ? "" : "//"); + substitutions["@@BoxListenerOnOutputTypeChangedComment@@"] = (m_HasOnOutputTypeChanged ? "" : "//"); + substitutions["@@BoxListenerOnOutputNameChangedComment@@"] = (m_HasOnOutputNameChanged ? "" : "//"); + substitutions["@@BoxListenerOnSettingAddedComment@@"] = (m_HasOnSettingAdded ? "" : "//"); + substitutions["@@BoxListenerOnSettingRemovedComment@@"] = (m_HasOnSettingRemoved ? "" : "//"); + substitutions["@@BoxListenerOnSettingTypeChangedComment@@"] = (m_HasOnSettingTypeChanged ? "" : "//"); + substitutions["@@BoxListenerOnSettingNameChangedComment@@"] = (m_HasOnSettingNameChanged ? "" : "//"); + substitutions["@@BoxListenerOnSettingDefaultValueChangedComment@@"] = (m_HasOnSettingDefaultValueChanged ? "" : "//"); + substitutions["@@BoxListenerOnSettingValueChangedComment@@"] = (m_HasOnSettingValueChanged ? "" : "//"); + substitutions["@@ProcessClockComment@@"] = (m_HasProcessClock ? "" : "//"); + substitutions["@@ProcessInputComment@@"] = (m_HasProcessInput ? "" : "//"); + substitutions["@@ProcessMessageComment@@"] = (m_HasProcessMessage ? "" : "//"); + substitutions["@@ProcessClockCommentIn@@"] = (m_HasProcessClock ? "" : "/*"); + substitutions["@@ProcessClockCommentOut@@"] = (m_HasProcessClock ? "" : "*/"); + substitutions["@@ProcessInputCommentIn@@"] = (m_HasProcessInput ? "" : "/*"); + substitutions["@@ProcessInputCommentOut@@"] = (m_HasProcessInput ? "" : "*/"); + substitutions["@@ProcessMessageCommentIn@@"] = (m_HasProcessMessage ? "" : "/*"); + substitutions["@@ProcessMessageCommentOut@@"] = (m_HasProcessMessage ? "" : "*/"); + substitutions["@@ClockFrequency@@"] = std::to_string(m_ClockFrequency) + "LL<<32"; + + //-------------------------------------------------------------------------------------------------------------------------------------------// + // box.h + std::string dst = m_directory + "/ovpCBoxAlgorithm" + m_ClassName + ".h"; + std::string tmplate = m_kernelCtx.getConfigurationManager().expand("${Path_Data}/applications/skeleton-generator/box.h-skeleton").toASCIIString(); + + if (!this->generate(tmplate, dst, substitutions, log)) + { + gtk_text_buffer_set_text(buffer, TO_GTK_UTF8(log.c_str()), -1); + success = false; + } + + + auto insertData = [this, &dst](const std::string& collectionType, const std::vector& collection, const bool hasValue) + { + const std::string pattern = "\\t\\t\\t\\t@@" + collectionType + "s@@"; + std::string collectionTypeLower(collectionType); + collectionTypeLower[0] = tolower(collectionTypeLower[0]); + + const std::string errorMsg = "\\/\\/No " + collectionTypeLower + " specified.To add " + collectionTypeLower + "s use :\\n\\/\\/prototype.add" + + collectionType + "(\\\"" + collectionType + "Name\\\",OV_TypeId_XXXX" + (hasValue ? ",\\\"default value\\\"" : "") + + ");\\n"; + std::string substitute = collection.empty() ? errorMsg : ""; + for (const auto& elem : collection) + { + substitute += std::string("\\t\\t\\t\\t\\tprototype.add") + collectionType + "(\\\"" + elem.name + "\\\",OV_TypeId_" + + camelCase(elem.type) + (hasValue ? std::string(",\\\"") + elem.defaultValue + "\\\"" : "") + ");\\n"; + } + return regexReplace(dst, pattern, substitute); + }; + + success &= insertData("Input", m_Inputs, false); + success &= insertData("Output", m_Outputs, false); + success &= insertData("Setting", m_Settings, true); + + //-------------------------------------------------------------------------------------- + //Codecs algorithms + //-------------------------------------------------------------------------------------- + std::string sPattern = "@@Algorithms@@"; + std::string sSubstitute = m_Inputs.empty() ? "\\/\\/ No Input decoder.\\n" : "\\/\\/ Input decoder:\\n"; + for (size_t i = 0; i < m_Inputs.size(); ++i) + { + std::string name(camelCase(m_Inputs[i].type)); + //The stream type is Stimulations but the decoder is tStimulationDecoder + if (name == "Stimulations") { name = "Stimulation"; } + sSubstitute += "\\t\\t\\t\\tToolkit::T" + name + "Decoder m_input" + std::to_string(i) + "Decoder;\\n"; + } + + sSubstitute += m_Outputs.empty() ? "\\t\\t\\t\\/\\/ No Output decoder.\\n" : "\\t\\t\\t\\/\\/ Output decoder:\\n"; + for (size_t i = 0; i < m_Outputs.size(); ++i) + { + std::string name(camelCase(m_Outputs[i].type)); + //The stream type is Stimulations but the encoder is tStimulationEncoder + if (name == "Stimulations") { name = "Stimulation"; } + sSubstitute += "\\t\\t\\t\\tToolkit::T" + name + "Encoder m_output" + std::to_string(i) + "Encoder;\\n"; + } + success &= regexReplace(dst, sPattern, sSubstitute); + + //-------------------------------------------------------------------------------------------------------------------------------------------// + // box.cpp + dst = m_directory + "/ovpCBoxAlgorithm" + m_ClassName + ".cpp"; + if (USE_CODEC_TOOLKIT) + { + tmplate = m_kernelCtx.getConfigurationManager().expand("${Path_Data}/applications/skeleton-generator/box.cpp-codec-toolkit-skeleton").toASCIIString(); + } + //else { tmplate = m_kernelCtx.getConfigurationManager().expand("${Path_Data}/applications/skeleton-generator/box.cpp-skeleton"); } + if (!this->generate(tmplate, dst, substitutions, log)) + { + gtk_text_buffer_set_text(buffer, TO_GTK_UTF8(log.c_str()), -1); + success = false; + } + + // Codec Algorithm stuff. too complicated for the simple SED primitives. + sPattern = "@@AlgorithmInitialisation@@"; + sSubstitute = ""; + //We initialize the codec algorithm by give them this, and the index of the input/output + for (size_t i = 0; i < m_Inputs.size(); ++i) + { + sSubstitute += "\\tm_input" + std::to_string(i) + "Decoder.initialize(*this, " + std::to_string(i) + ");\n"; + } + for (size_t i = 0; i < m_Outputs.size(); ++i) + { + sSubstitute += "\\tm_output" + std::to_string(i) + "Encoder.initialize(*this, " + std::to_string(i) + ");\n"; + } + + success &= regexReplace(dst, sPattern, sSubstitute); + + sPattern = "@@AlgorithmUninitialisation@@"; + sSubstitute = ""; + //We initialize the codec algorithm by give them this, and the index of the input/output + for (size_t i = 0; i < m_Inputs.size(); ++i) { sSubstitute += "\\tm_input" + std::to_string(i) + "Decoder.uninitialize();\n"; } + for (size_t i = 0; i < m_Outputs.size(); ++i) { sSubstitute += "\\tm_output" + std::to_string(i) + "Encoder.uninitialize();\n"; } + success &= regexReplace(dst, sPattern, sSubstitute); + + //-------------------------------------------------------------------------------------------------------------------------------------------// + // readme-box.cpp + dst = m_directory + "/README.txt"; + tmplate = m_kernelCtx.getConfigurationManager().expand("${Path_Data}/applications/skeleton-generator/readme-box.txt-skeleton"); + + if (!this->generate(tmplate, dst, substitutions, log)) + { + gtk_text_buffer_set_text(buffer, TO_GTK_UTF8(log.c_str()), -1); + success = false; + } + + //-------------------------------------------------------------------------------------------------------------------------------------------// + + if (success) + { + success &= cleanConfigurationFile(m_configFile); + //re-load all entries, the internal variables may have been modified to be sed compliant. + getCommonParameters(); + getCurrentParameters(); + //save the entries as the user typed them + success &= saveCommonParameters(m_configFile); + success &= save(m_configFile); + } + + if (!success) + { + log += "Generation process did not completly succeed. Some files may have not been produced.\n"; + OV_WARNING_K("Generation process did not completly succeed. Some files may have not been produced."); + } + else + { + log += "Generation process successful. All entries saved in [" + m_configFile + "]\n"; + log += "Please read file [README.txt] !\n"; + getLogManager() << Kernel::LogLevel_Info << "Generation process successful. All entries saved in [" << m_configFile << "]\n"; + + // opening browser to see the produced files + std::string browser = m_kernelCtx.getConfigurationManager().expand("${Designer_WebBrowserCommand_${OperatingSystem}}").toASCIIString(); +#ifdef TARGET_OS_Windows + std::string browserCmd = browser + " file:///" + m_directory; //otherwise the browser does not find the directory (problem with / and \ char) +#else + std::string browserCmd = browser + " \"" + m_directory + "\""; +#endif + std::cout << browser; + if (system(browserCmd.c_str())) { } + } + + gtk_text_buffer_set_text(buffer, TO_GTK_UTF8(log.c_str()), -1); +} + +void CBoxAlgorithmSkeletonGenerator::buttonTooltipCB(GtkButton* button) +{ + const std::string tooltip = m_tooltips[button]; + + GtkWidget* tooltipTextview = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-tooltips-textview")); + GtkTextBuffer* textBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tooltipTextview)); + gtk_text_buffer_set_text(textBuffer, TO_GTK_UTF8(tooltip.c_str()), -1); +} + +void CBoxAlgorithmSkeletonGenerator::buttonAddInputCB() const +{ + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-IO-add-dialog")); + GtkWidget* nameEntry = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-IO-add-name-entry")); + GtkWidget* typeComboBox = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-IO-add-type-combobox")); + + gtk_entry_set_text(GTK_ENTRY(nameEntry), ""); + + const gint resp = gtk_dialog_run(GTK_DIALOG(dialog)); + + if (resp == GTK_RESPONSE_APPLY) + { + const gchar* name = gtk_entry_get_text(GTK_ENTRY(nameEntry)); + //we get the two types (user/ov) + GtkTreeIter itType; + GtkTreeModel* treeModelType = gtk_combo_box_get_model(GTK_COMBO_BOX(typeComboBox)); + gtk_combo_box_get_active_iter(GTK_COMBO_BOX(typeComboBox), &itType); + gchar *dataTypeUser, *dataTypeOv; + gtk_tree_model_get(treeModelType, &itType, 0, &dataTypeUser, 1, &dataTypeOv, -1); + //const gchar * type = gtk_combo_box_get_active_text(GTK_COMBO_BOX(typeComboBox)); + + GtkWidget* treeView = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-inputs-treeview")); + GtkTreeModel* listStore = gtk_tree_view_get_model(GTK_TREE_VIEW(treeView)); + GtkTreeIter it; + gtk_list_store_append(GTK_LIST_STORE(listStore), &it); + gtk_list_store_set(GTK_LIST_STORE(listStore), &it, 0, name, 1, dataTypeUser, 2, dataTypeOv, -1); + gtk_widget_hide(dialog); + + g_free(dataTypeUser); + g_free(dataTypeOv); + + setSensitivity("sg-box-ok-button", false); + } + else { gtk_widget_hide(dialog); } +} + +void CBoxAlgorithmSkeletonGenerator::buttonAddOutputCB() const +{ + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-IO-add-dialog")); + GtkWidget* nameEntry = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-IO-add-name-entry")); + GtkWidget* typeComboBox = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-IO-add-type-combobox")); + + gtk_entry_set_text(GTK_ENTRY(nameEntry), ""); + + const gint resp = gtk_dialog_run(GTK_DIALOG(dialog)); + + if (resp == GTK_RESPONSE_APPLY) + { + const gchar* name = gtk_entry_get_text(GTK_ENTRY(nameEntry)); + //we get the two types (user/ov) + GtkTreeIter itType; + GtkTreeModel* treeModelType = gtk_combo_box_get_model(GTK_COMBO_BOX(typeComboBox)); + gtk_combo_box_get_active_iter(GTK_COMBO_BOX(typeComboBox), &itType); + gchar *dataTypeUser, *dataTypeOv; + gtk_tree_model_get(treeModelType, &itType, 0, &dataTypeUser, 1, &dataTypeOv, -1); + //const gchar * type = gtk_combo_box_get_active_text(GTK_COMBO_BOX(typeComboBox)); + + GtkWidget* treeView = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-outputs-treeview")); + GtkTreeModel* listStore = gtk_tree_view_get_model(GTK_TREE_VIEW(treeView)); + GtkTreeIter it; + + gtk_list_store_append(GTK_LIST_STORE(listStore), &it); + gtk_list_store_set(GTK_LIST_STORE(listStore), &it, 0, name, 1, dataTypeUser, 2, dataTypeOv, -1); + gtk_widget_hide(dialog); + + g_free(dataTypeUser); + g_free(dataTypeOv); + + setSensitivity("sg-box-ok-button", false); + } + else { gtk_widget_hide(dialog); } +} + +void CBoxAlgorithmSkeletonGenerator::buttonAddSettingCB() const +{ + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-settings-add-dialog")); + GtkWidget* nameEntry = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-settings-add-name-entry")); + GtkWidget* typeComboBox = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-settings-add-type-combobox")); + GtkWidget* valueEntry = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-settings-add-default-value-entry")); + + gtk_entry_set_text(GTK_ENTRY(nameEntry), ""); + gtk_entry_set_text(GTK_ENTRY(valueEntry), ""); + + const gint resp = gtk_dialog_run(GTK_DIALOG(dialog)); + + if (resp == GTK_RESPONSE_APPLY) + { + const gchar* name = gtk_entry_get_text(GTK_ENTRY(nameEntry)); + const gchar* value = gtk_entry_get_text(GTK_ENTRY(valueEntry)); + //we get the two types (user/ov) + GtkTreeIter itType; + GtkTreeModel* treeModelType = gtk_combo_box_get_model(GTK_COMBO_BOX(typeComboBox)); + gtk_combo_box_get_active_iter(GTK_COMBO_BOX(typeComboBox), &itType); + gchar *dataTypeUser, *dataTypeOv; + gtk_tree_model_get(treeModelType, &itType, 0, &dataTypeUser, 1, &dataTypeOv, -1); + //const gchar * type = gtk_combo_box_get_active_text(GTK_COMBO_BOX(typeComboBox)); + + GtkWidget* treeView = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-settings-treeview")); + GtkTreeModel* listStore = gtk_tree_view_get_model(GTK_TREE_VIEW(treeView)); + GtkTreeIter it; + + gtk_list_store_append(GTK_LIST_STORE(listStore), &it); + gtk_list_store_set(GTK_LIST_STORE(listStore), &it, 0, name, 1, dataTypeUser, 2, value, 3, dataTypeOv, -1); + gtk_widget_hide(dialog); + + g_free(dataTypeUser); + g_free(dataTypeOv); + + setSensitivity("sg-box-ok-button", false); + } + else { gtk_widget_hide(dialog); } +} + +void CBoxAlgorithmSkeletonGenerator::buttonAddAlgorithmCB() const +{ + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-dialog")); + GtkWidget* comboBox = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-combobox")); + + GtkWidget* inputsTreeView = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-inputs-treeview")); + GtkTreeModel* inputsListStore = gtk_tree_view_get_model(GTK_TREE_VIEW(inputsTreeView)); + GtkWidget* outputsTreeView = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-outputs-treeview")); + GtkTreeModel* outputsListStore = gtk_tree_view_get_model(GTK_TREE_VIEW(outputsTreeView)); + GtkWidget* inputTriggersTreeView = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-input-triggers-treeview")); + GtkTreeModel* inputTriggersListStore = gtk_tree_view_get_model(GTK_TREE_VIEW(inputTriggersTreeView)); + GtkWidget* outputTriggersTreeView = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-output-triggers-treeview")); + GtkTreeModel* outputTriggersListStore = gtk_tree_view_get_model(GTK_TREE_VIEW(outputTriggersTreeView)); + + GtkWidget* categoryEntry = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-category-entry")); + gtk_entry_set_text(GTK_ENTRY(categoryEntry), ""); + GtkWidget* shortEntry = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-short-description-entry")); + gtk_entry_set_text(GTK_ENTRY(shortEntry), ""); + GtkWidget* detailedTextview = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-detailed-description-textview")); + GtkTextBuffer* buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(detailedTextview)); + gtk_text_buffer_set_text(buffer, "", -1); + + + gtk_list_store_clear(GTK_LIST_STORE(inputsListStore)); + gtk_list_store_clear(GTK_LIST_STORE(outputsListStore)); + gtk_list_store_clear(GTK_LIST_STORE(inputTriggersListStore)); + gtk_list_store_clear(GTK_LIST_STORE(outputTriggersListStore)); + gtk_combo_box_set_active(GTK_COMBO_BOX(comboBox), -1); + + const gint resp = gtk_dialog_run(GTK_DIALOG(dialog)); + + if (resp == GTK_RESPONSE_APPLY) + { + const gchar* algo = gtk_combo_box_get_active_text(GTK_COMBO_BOX(comboBox)); + + if (algo) + { + GtkWidget* treeView = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-treeview")); + GtkTreeModel* listStore = gtk_tree_view_get_model(GTK_TREE_VIEW(treeView)); + GtkTreeIter it; + gtk_list_store_append(GTK_LIST_STORE(listStore), &it); + gtk_list_store_set(GTK_LIST_STORE(listStore), &it, 0, algo, -1); + setSensitivity("sg-box-ok-button", false); + } + else { getLogManager() << Kernel::LogLevel_Error << "Please select an algorithm.\n"; } + gtk_widget_hide(dialog); + } + else { gtk_widget_hide(dialog); } +} + +void CBoxAlgorithmSkeletonGenerator::buttonRemoveGeneric(const char* buttonName) const +{ + GtkWidget* treeView = GTK_WIDGET(gtk_builder_get_object(m_builder, buttonName)); + GtkTreeModel* listStore = gtk_tree_view_get_model(GTK_TREE_VIEW(treeView)); + GtkTreeIter it; + GtkTreeSelection* select = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView)); + if (gtk_tree_selection_get_selected(select, &listStore, &it)) + { + gtk_list_store_remove(GTK_LIST_STORE(listStore), &it); + setSensitivity("sg-box-ok-button", false); + } +} + +void CBoxAlgorithmSkeletonGenerator::algorithmSelectedCB(const int index) +{ + clearStore("sg-box-algorithms-add-inputs-treeview"); + clearStore("sg-box-algorithms-add-outputs-treeview"); + clearStore("sg-box-algorithms-add-input-triggers-treeview"); + clearStore("sg-box-algorithms-add-output-triggers-treeview"); + + GtkWidget* categoryEntry = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-category-entry")); + gtk_entry_set_text(GTK_ENTRY(categoryEntry), ""); + GtkWidget* shortEntry = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-short-description-entry")); + gtk_entry_set_text(GTK_ENTRY(shortEntry), ""); + GtkWidget* detailedTextview = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-detailed-description-textview")); + GtkTextBuffer* buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(detailedTextview)); + gtk_text_buffer_set_text(buffer, "", -1); + + if (index != -1) + { + GtkWidget* comboBox = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-combobox")); + GtkTreeModel* algoListStore = gtk_combo_box_get_model(GTK_COMBO_BOX(comboBox)); + GtkTreeIter iter; + gchar* sID; + gtk_tree_model_iter_nth_child(algoListStore, &iter, nullptr, index); + gtk_tree_model_get(algoListStore, &iter, 1, &sID, -1); + CIdentifier id; + id.fromString(CString(sID)); + + //we need to create a dummy instance of the algorithm proto to know its input/output/triggers + const Plugins::IPluginObjectDesc* desc = m_kernelCtx.getPluginManager().getPluginObjectDesc(id); + CDummyAlgoProto dummyProto; + ((Plugins::IAlgorithmDesc*)desc)->getAlgorithmPrototype(dummyProto); + + addCollectionToTree("sg-box-algorithms-add-inputs-treeview", ExtractKeys(dummyProto.m_Inputs)); + addCollectionToTree("sg-box-algorithms-add-outputs-treeview", ExtractKeys(dummyProto.m_Outputs)); + addCollectionToTree("sg-box-algorithms-add-input-triggers-treeview", dummyProto.m_InputTriggers); + addCollectionToTree("sg-box-algorithms-add-output-triggers-treeview", dummyProto.m_OutputTriggers); + + categoryEntry = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-category-entry")); + gtk_entry_set_text(GTK_ENTRY(categoryEntry), TO_GTK_UTF8(desc->getCategory().toASCIIString())); + shortEntry = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-short-description-entry")); + gtk_entry_set_text(GTK_ENTRY(shortEntry), TO_GTK_UTF8(desc->getShortDescription().toASCIIString())); + detailedTextview = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-detailed-description-textview")); + buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(detailedTextview)); + gtk_text_buffer_set_text(buffer, TO_GTK_UTF8(desc->getDetailedDescription().toASCIIString()), -1); + } +} + +//-------------------------------------------------------------------------- +bool CBoxAlgorithmSkeletonGenerator::initialize() +{ + //random seed + srand(uint32_t(time(nullptr))); + + GtkWidget* box = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-window")); + + // Main Buttons and signals + GtkWidget* buttonCheck = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-check-button")); + GtkWidget* buttonOk = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-ok-button")); + gtk_widget_set_sensitive(buttonOk, false); + + g_signal_connect(buttonCheck, "pressed", G_CALLBACK(CheckCB), this); + g_signal_connect(buttonOk, "pressed", G_CALLBACK(OkCB), this); + + //connect all the signals in the .ui file (entry_modified_cb) + gtk_builder_connect_signals(m_builder, this); + + // Tooltips buttons and signal + GtkButton* buttonNameVersion = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-name-version-tooltip-button")); + GtkButton* buttonCategory = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-category-tooltip-button")); + GtkButton* buttonDesc = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-description-tooltip-button")); + GtkButton* buttonIcon = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-icon-tooltip-button")); + GtkButton* buttonInputs = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-inputs-list-tooltip-button")); + GtkButton* buttonInputsModify = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-inputs-modify-tooltip-button")); + GtkButton* buttonInputsAddRemove = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-inputs-add-tooltip-button")); + GtkButton* buttonOutputs = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-outputs-list-tooltip-button")); + GtkButton* buttonOutputsModify = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-outputs-modify-tooltip-button")); + GtkButton* buttonOutputsAddRemove = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-outputs-add-tooltip-button")); + GtkButton* buttonSettings = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-settings-list-tooltip-button")); + GtkButton* buttonSettingsModify = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-settings-modify-tooltip-button")); + GtkButton* buttonSettingsAddRemove = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-settings-add-tooltip-button")); + GtkButton* buttonAlgorithms = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-algorithms-tooltip-button")); + GtkButton* buttonClassName = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-class-name-tooltip-button")); + GtkButton* buttonBoxListener = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-listener-tooltip-button")); + //::GtkButton* buttonUseCodecToolkit = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-algorithms-toolkit-tooltip-button")); + + m_tooltips[buttonNameVersion] = + "Box Name: \nThis name will be the one displayed in the Designer.\nUsually, the box name reflects its main purpose.\nPlease also enter a version number for your box.\nAuthorized characters: letters (lower and upper case), numbers, special characters '()[]._-'\n------\nExample: Clock Stimulator (tic tac), version 1.2"; + m_tooltips[buttonCategory] = + "Category: \nThe category decides where the box will be strored in designer's box panel.\nYou can refer to an existing category, already used in the designer, or choose a new one.\nIf you need to specifiy a subcategory, use the character '/'.\nAuthorized characters: letters (lower and upper case) and spaces.\n------\nExample: Samples/Skeleton Generator\n"; + m_tooltips[buttonDesc] = + "Description: \nThe short description will be displayed next to the box in the designer box panel.\nThe detailed description is showed on the 'About Box...' panel.\nAll characters are authorized.\n------\nExample:\nShort Description : Periodic stimulation generator\nDetailed description : This box triggers stimulation at fixed frequency."; + m_tooltips[buttonIcon] = + "Box Icon: \nThe icon used in the designer box panel for this box.\nThis is an optional field.\n------\nExample: 'gtk-help' will be the corresponding gtk stock item (depending on the gtk theme used)\n\n\n"; + m_tooltips[buttonInputs] = + "Inputs: \nUse the 'Add' and 'Remove' buttons to set all the inputs your box will have.\nWhen pressing 'Add' a dialog window will appear to know the name and type of the new input.\n------\nExample:\n'Incoming Signal' of type 'Signal'\n\n"; + m_tooltips[buttonInputsModify] = + "Modify: \nCheck this option if the input(s) of your box can be modified (type and name) in the Designer by right-clicking the box.\nIn the implementation, this option decides whether or not the box will have the flag 'BoxFlag_CanModifyInput'.\n\n\n\n\n"; + m_tooltips[buttonInputsAddRemove] = + "Add/Remove: \nCheck this option if the user must be able to add (or remove) inputs, by right-clicking the box.\nIn the implementation, this option decides whether or not the box will have the flag 'BoxFlag_CanAddInput'.\n\n\n\n"; + m_tooltips[buttonOutputs] = + "Outputs: \nUse the 'Add' and 'Remove' buttons to set all the outputs your box will have.\nWhen pressing 'Add' a dialog window will appear to know the name and type of the new output.\n------\nExample:\n'Filtered Signal' of type 'Signal'\n\n"; + m_tooltips[buttonOutputsModify] = + "Modify: \nCheck this option if the output(s) of your box can be modified (type and name) in the Designer by right-clicking the box.\nIn the implementation, this option decides whether or not the box will have the flag 'BoxFlag_CanModifyOutput'.\n\n\n\n\n"; + m_tooltips[buttonOutputsAddRemove] = + "Add/Remove: \nCheck this option if the user must be able to add (or remove) outputs, by right-clicking the box.\nIn the implementation, this option decides whether or not the box will have the flag 'BoxFlag_CanAddOutput'.\n\n\n\n"; + m_tooltips[buttonSettings] = + "Settings: \nUse the 'Add' and 'Remove' buttons to set all the settings your box will have.\nWhen pressing 'Add' a dialog window will appear to know the name,type and default value of the new output.\n------\nExample:\n'Filter order' of type 'int' with default value '4'\n\n"; + m_tooltips[buttonSettingsModify] = + "Modify: \nCheck this option if the setting(s) of your box can be modified (type and name) in the Designer by right-clicking the box.\nIn the implementation, this option decides whether or not the box will have the flag 'BoxFlag_CanModifySetting'.\n\n\n\n\n"; + m_tooltips[buttonSettingsAddRemove] = + "Add/Remove: \nCheck this option if the user must be able to add (or remove) settings, by right-clicking the box.\nIn the implementation, this option decides whether or not the box will have the flag 'BoxFlag_CanAddSetting'.\n\n\n\n"; + m_tooltips[buttonAlgorithms] = + "Codec Algorithms: \nChoose the decoder(s) and encoder(s) used by the box. \nYou can choose between all the different stream codecs currently in OpenViBE.\nWhen choosing a codec, the dialog window will display the algorithm inputs and outputs that can be retrieve through getter methods. \n------\nExample: Signal Decoder, that outputs a Streamed Matrix and a Sampling Frequency value from a Memory Buffer.\n\n"; + m_tooltips[buttonClassName] = + "Class Name: \nThis name will be used in the code to build the class name.\nUsually, the class name is close to the box name, just without any blank.\nAuthorized characters: letters (lower and upper case), numbers, NO special characters, NO blank.\n------\nExample: ClockStimulator\n"; + m_tooltips[buttonBoxListener] = + "Box Listener: \nImplement or not a box listener class in the header.\nA box listener has various callbacks that you can overwrite, related to any modification of the box structure.\n------\nExample:\nThe Identity box uses a box listener with 2 callbacks: 'onInputAdded' and 'onOutputAdded'.\nWhenever an input (output) is added, the listener automatically add an output (input) of the same type.\n"; + //m_tooltips[buttonUseCodecToolkit] = "Codec Toolkit: \nTells the generator to use or not the Codec Toolkit in the box implementation. \nThe Codec Toolkit makes the decoding and encoding process much more simpler.\nCurrently the Skeleton Generator only creates templates using the codec toolkit.\n\n\n\n\n"; + + g_signal_connect(buttonNameVersion, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonCategory, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonDesc, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonIcon, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonInputs, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonInputsModify, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonInputsAddRemove, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonOutputs, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonOutputsModify, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonOutputsAddRemove, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonSettings, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonSettingsModify, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonSettingsAddRemove, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonAlgorithms, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonClassName, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonBoxListener, "pressed", G_CALLBACK(TooltipCB), this); + //g_signal_connect(buttonUseCodecToolkit, "pressed",G_CALLBACK(TooltipCB), this); + + //'Inputs' buttons + GtkButton* inputsButtonAdd = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-inputs-add-button")); + GtkButton* inputsButtonRem = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-inputs-remove-button")); + GtkButton* outputsButtonAdd = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-outputs-add-button")); + GtkButton* outputsButtonRem = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-outputs-remove-button")); + GtkButton* settingsButtonAdd = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-settings-add-button")); + GtkButton* settingsButtonRem = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-settings-remove-button")); + GtkButton* algorithmsButtonAdd = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-button")); + GtkButton* algorithmsButtonRem = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-box-algorithms-remove-button")); + + g_signal_connect(inputsButtonAdd, "pressed", G_CALLBACK(AddInputCB), this); + g_signal_connect(inputsButtonRem, "pressed", G_CALLBACK(RemInputCB), this); + g_signal_connect(outputsButtonAdd, "pressed", G_CALLBACK(AddOutputCB), this); + g_signal_connect(outputsButtonRem, "pressed", G_CALLBACK(RemOutputCB), this); + g_signal_connect(settingsButtonAdd, "pressed", G_CALLBACK(AddSettingCB), this); + g_signal_connect(settingsButtonRem, "pressed", G_CALLBACK(RemSettingCB), this); + g_signal_connect(algorithmsButtonAdd, "pressed", G_CALLBACK(AddAlgorithmCB), this); + g_signal_connect(algorithmsButtonRem, "pressed", G_CALLBACK(RemAlgorithmCB), this); + + addDialogButttons("sg-box-IO-add-dialog"); + addDialogButttons("sg-box-settings-add-dialog"); + addDialogButttons("sg-box-algorithms-add-dialog"); + + //initialize the icon combo box with gtk stock items + GtkWidget* iconCombobox = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-icon-combobox")); + GtkTreeModel* iconListStore = gtk_combo_box_get_model(GTK_COMBO_BOX(iconCombobox)); + GSList* stockIdList = gtk_stock_list_ids(); + while (stockIdList->next != nullptr) + { + GtkTreeIter it; + gtk_list_store_append(GTK_LIST_STORE(iconListStore), &it); + gtk_list_store_set(GTK_LIST_STORE(iconListStore), &it, 0, static_cast(stockIdList->data), 1, static_cast(stockIdList->data), -1); + stockIdList = g_slist_next(stockIdList); + } + g_slist_free(stockIdList); + + //types when adding IOS + GtkWidget* typeCombobox = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-IO-add-type-combobox")); + GtkTreeModel* typeListStore = gtk_combo_box_get_model(GTK_COMBO_BOX(typeCombobox)); + GtkWidget* settingTypeCombobox = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-settings-add-type-combobox")); + GtkTreeModel* settingTypeListStore = gtk_combo_box_get_model(GTK_COMBO_BOX(settingTypeCombobox)); + //we iterate over all identifiers + CIdentifier id = m_kernelCtx.getTypeManager().getNextTypeIdentifier(CIdentifier::undefined()); + while (id != CIdentifier::undefined()) + { + const gchar* type = TO_GTK_UTF8(m_kernelCtx.getTypeManager().getTypeName(id).toASCIIString()); + const gchar* typeID = TO_GTK_UTF8(id.str().c_str()); + //Streams are possible inputs and outputs + if (m_kernelCtx.getTypeManager().isStream(id)) + { + GtkTreeIter it; + gtk_list_store_append(GTK_LIST_STORE(typeListStore), &it); + gtk_list_store_set(GTK_LIST_STORE(typeListStore), &it, 0, type, 1, typeID, -1); + } + else // other types are possible settings + { + GtkTreeIter it; + gtk_list_store_append(GTK_LIST_STORE(settingTypeListStore), &it); + gtk_list_store_set(GTK_LIST_STORE(settingTypeListStore), &it, 0, type, 1, typeID, -1); + } + id = m_kernelCtx.getTypeManager().getNextTypeIdentifier(id); + } + gtk_combo_box_set_active(GTK_COMBO_BOX(typeCombobox), 0); + gtk_combo_box_set_active(GTK_COMBO_BOX(settingTypeCombobox), 0); + //types when adding Algorithms + m_typeCorrespondances.resize(Kernel::ParameterType_Pointer + 1); + m_typeCorrespondances[Kernel::ParameterType_None] = "TYPE-NOT-AVAILABLE"; + m_typeCorrespondances[Kernel::ParameterType_Integer] = "int64_t"; + m_typeCorrespondances[Kernel::ParameterType_UInteger] = "uint64_t"; + m_typeCorrespondances[Kernel::ParameterType_Enumeration] = "ENUMERATION-NOT-AVAILABLE"; + m_typeCorrespondances[Kernel::ParameterType_Boolean] = "bool"; + m_typeCorrespondances[Kernel::ParameterType_Float] = "double"; + m_typeCorrespondances[Kernel::ParameterType_String] = "CString"; + m_typeCorrespondances[Kernel::ParameterType_Identifier] = "CIdentifier"; + m_typeCorrespondances[Kernel::ParameterType_Matrix] = "CMatrix *"; + m_typeCorrespondances[Kernel::ParameterType_StimulationSet] = "IStimulationSet *"; + m_typeCorrespondances[Kernel::ParameterType_MemoryBuffer] = "IMemoryBuffer *"; + m_typeCorrespondances[Kernel::ParameterType_Object] = "IObject *"; + m_typeCorrespondances[Kernel::ParameterType_Pointer] = "uint8_t*"; + + + GtkWidget* algoCombobox = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-add-combobox")); + GtkTreeModel* algoListStore = gtk_combo_box_get_model(GTK_COMBO_BOX(algoCombobox)); + //we iterate over all plugin descriptor identifiers + id = m_kernelCtx.getPluginManager().getNextPluginObjectDescIdentifier(CIdentifier::undefined()); + while (id != CIdentifier::undefined()) + { + const Plugins::IPluginObjectDesc* desc = m_kernelCtx.getPluginManager().getPluginObjectDesc(id); + if (desc != nullptr && desc->isDerivedFromClass(OV_ClassId_Plugins_AlgorithmDesc)) // we select only algorithm descriptors + { + std::string algo = desc->getName().toASCIIString(); + + // we only keep decoders and encoders + // and reject the master acquisition stream + // and reject acquisition stream encoder as toolkit doesn't support it + if ((algo.find("encoder") != std::string::npos || algo.find("decoder") != std::string::npos) + && algo.find("Master") == std::string::npos && algo.find("Acquisition stream encoder") == std::string::npos) + { + std::string algoID = id.str(); + GtkTreeIter it; + gtk_list_store_append(GTK_LIST_STORE(algoListStore), &it); + gtk_list_store_set(GTK_LIST_STORE(algoListStore), &it, 0, TO_GTK_UTF8(algo.c_str()), 1, TO_GTK_UTF8(algoID.c_str()), -1); + + // now we map every decoder/encoder to its string description that will be added in the skeleton (algorithmProxy + parameter handlers for I/O) + std::string headerDeclaration = "\\t\\t\\t\\/\\/ " + algo + "\\n"; + std::string initialisation = "\\t\\/\\/ " + algo + "\\n"; + std::string initialisationReferenceTargets; + std::string uninitialisation; + + + //we need to create a dummy instance of the algorithm proto to know its input/output/triggers + const Plugins::IPluginObjectDesc* dummyDesc = m_kernelCtx.getPluginManager().getPluginObjectDesc(id); + CDummyAlgoProto dummyProto; + ((Plugins::IAlgorithmDesc*)dummyDesc)->getAlgorithmPrototype(dummyProto); + //algorithm proxy + std::string algoNameStdSTr(camelCase(algo)); + std::string codecTypeStdStr = algoNameStdSTr; + std::string stream("Stream"); + codecTypeStdStr.erase(codecTypeStdStr.rfind(stream), 6); + + std::string codec = "m_o@" + codecTypeStdStr; + std::string codecType = codecTypeStdStr; + + // use the Codec Toolkit + headerDeclaration = headerDeclaration + "\\t\\t\\tToolkit::T" + codecType + " < @@ClassName@@ > " + codec + ";\\n"; + initialisation = initialisation + "\\t" + codec + ".initialize(*this);\\n"; + uninitialisation = "\\t" + codec + ".uninitialize();\\n" + uninitialisation; + initialisationReferenceTargets = ""; + + m_AlgoDeclaration[algo] = headerDeclaration; + m_AlgoInitialisations[algo] = initialisation; + m_AlgoUninitialisations[algo] = uninitialisation; + m_AlgoInitialisationReferenceTargets[algo] = initialisationReferenceTargets; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "The algorithm [" << algo << "] has description [" << headerDeclaration << "\n"; + } + } + id = m_kernelCtx.getPluginManager().getNextPluginObjectDescIdentifier(id); + } + + + gtk_combo_box_set_active(GTK_COMBO_BOX(algoCombobox), -1); + //callback to update algo description + g_signal_connect(G_OBJECT(algoCombobox), "changed", G_CALLBACK(AlgorithmSelectedCB), this); + + //Close with X and "cancel" button + g_signal_connect(G_OBJECT(box), "delete_event", G_CALLBACK(gtk_exit), nullptr); + GtkWidget* buttonCancel = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-exit-button")); + g_signal_connect(buttonCancel, "pressed", G_CALLBACK(ExitCB), this); + + //load everything from config file + load(m_configFile); + GtkWidget* listenerWidget = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-listener-checkbutton")); + toggleListenerCheckbuttonsStateCB((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(listenerWidget)) > 0)); + + gtk_widget_show_all(box); + + return true; +} + +bool CBoxAlgorithmSkeletonGenerator::save(const std::string& filename) +{ + std::ofstream file; + file.open(filename, std::ios::app | std::ios::binary); + if (!file.is_open()) + { + OV_WARNING_K("Saving the box entries in [" << filename << "] failed !"); + return false; + } + file << "# ----------------------BOX GENERATOR-------------------------" << std::endl; + std::string tmp(m_directory); + for (auto it = tmp.begin(); it < tmp.end(); ++it) { if ((*it) == '\\') { tmp.replace(it, it + 1, 1, '/'); } } + + file << "SkeletonGenerator_Box_TargetDirectory = " << tmp << std::endl; + file << "SkeletonGenerator_Box_Name = " << m_Name << std::endl; + file << "SkeletonGenerator_Box_Version = " << m_Version << std::endl; + file << "SkeletonGenerator_Box_Category = " << m_Category << std::endl; + file << "SkeletonGenerator_Box_ClassName = " << m_ClassName << std::endl; + + //we need to escape with '\' the special characters of the configuration manager files + tmp = m_ShortDesc; + tmp.reserve(1000); // if we need to insert characters + auto it = tmp.begin(); + while (it < tmp.end()) + { + //characters to escape + if ((*it) == '\\' || (*it) == '=' || (*it) == '$' || (*it) == '\t') + { + tmp.insert(it, '\\'); + ++it; + } + ++it; + } + file << "SkeletonGenerator_Box_ShortDescription = " << tmp << std::endl; + + //we need to escape with '\' the special characters of the configuration manager files + tmp = m_DetailedDesc; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "SAVE > DESCRIPTION FROM WIDGET: " << tmp << "\n"; + tmp.reserve(1000); // if we need to insert characters + it = tmp.begin(); + while (it < tmp.end()) + { + //characters to escape + if ((*it) == '\\' || (*it) == '=' || (*it) == '$' || (*it) == '\t') + { + tmp.insert(it, '\\'); + ++it; + } + //the special character we use for \n must also be escaped when used in the text + else if ((*it) == '@') + { + tmp.insert(it, '\\'); + tmp.insert(it, '\\'); + it += 2; + } + //we add a special character @ representing a \n for further loading. the \ ensure that the config manager will read the token past the \n + else if ((*it) == '\n') + { + tmp.insert(it, '\\'); + tmp.insert(it, '@'); + it += 2; + } + ++it; + } + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "SAVE > DESCR MODIFIED: " << tmp << "\n"; + + file << "SkeletonGenerator_Box_DetailedDescription = " << tmp << std::endl; + + file << "SkeletonGenerator_Box_IconIndex = " << m_GtkStockItemIdx << std::endl; + file << "SkeletonGenerator_Box_IconName = " << m_GtkStockItemName << std::endl; + + // ADD/MODIFY FLAGS + file << "SkeletonGenerator_Box_CanModifyInputs = " << (m_CanModifyInputs ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_CanAddInputs = " << (m_CanAddInputs ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_CanModifyOutputs = " << (m_CanModifyOutputs ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_CanAddOutputs = " << (m_CanAddOutputs ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_CanModifySettings = " << (m_CanModifySettings ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_CanAddSettings = " << (m_CanAddSettings ? "TRUE" : "FALSE") << std::endl; + + // Inputs + file << "SkeletonGenerator_Box_InputCount = " << m_Inputs.size() << std::endl; + for (size_t i = 0; i < m_Inputs.size(); ++i) + { + file << "SkeletonGenerator_Box_Input" << i << "_Name = " << m_Inputs[i].name << std::endl; + file << "SkeletonGenerator_Box_Input" << i << "_Type = " << m_Inputs[i].type << std::endl; + file << "SkeletonGenerator_Box_Input" << i << "_TypeId = " << m_Inputs[i].typeID << std::endl; + } + // Outputs + file << "SkeletonGenerator_Box_OutputCount = " << m_Outputs.size() << std::endl; + for (size_t i = 0; i < m_Outputs.size(); ++i) + { + file << "SkeletonGenerator_Box_Output" << i << "_Name = " << m_Outputs[i].name << std::endl; + file << "SkeletonGenerator_Box_Output" << i << "_Type = " << m_Outputs[i].type << std::endl; + file << "SkeletonGenerator_Box_Output" << i << "_TypeId = " << m_Outputs[i].typeID << std::endl; + } + // Settings + file << "SkeletonGenerator_Box_SettingCount = " << m_Settings.size() << std::endl; + for (size_t i = 0; i < m_Settings.size(); ++i) + { + file << "SkeletonGenerator_Box_Setting" << i << "_Name = " << m_Settings[i].name << std::endl; + file << "SkeletonGenerator_Box_Setting" << i << "_Type = " << m_Settings[i].type << std::endl; + file << "SkeletonGenerator_Box_Setting" << i << "_TypeId = " << m_Settings[i].typeID << std::endl; + file << "SkeletonGenerator_Box_Setting" << i << "_DefaultValue = " << m_Settings[i].defaultValue << std::endl; + } + // Algorithms + file << "SkeletonGenerator_Box_AlgorithmCount = " << m_Algorithms.size() << std::endl; + for (size_t i = 0; i < m_Algorithms.size(); ++i) { file << "SkeletonGenerator_Box_Algorithm" << i << "_Name = " << m_Algorithms[i] << std::endl; } + + // Listener + file << "SkeletonGenerator_Box_UseListener = " << (m_UseBoxListener ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnInputAdded = " << (m_HasOnInputAdded ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnInputRemoved = " << (m_HasOnInputRemoved ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnInputTypeChanged = " << (m_HasOnInputTypeChanged ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnInputNameChanged = " << (m_HasOnInputNameChanged ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnInputConnected = " << (m_HasOnInputConnected ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnInputDisconnected = " << (m_HasOnInputDisconnected ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnOutputAdded = " << (m_HasOnOutputAdded ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnOutputRemoved = " << (m_HasOnOutputRemoved ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnOutputTypeChanged = " << (m_HasOnOutputTypeChanged ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnOutputNameChanged = " << (m_HasOnOutputNameChanged ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnOutputConnected = " << (m_HasOnOutputConnected ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnOutputDisconnected = " << (m_HasOnOutputDisconnected ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnSettingAdded = " << (m_HasOnSettingAdded ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnSettingRemoved = " << (m_HasOnSettingRemoved ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnSettingTypeChanged = " << (m_HasOnSettingTypeChanged ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnSettingNameChanged = " << (m_HasOnSettingNameChanged ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnSettingDefaultValueChanged = " << (m_HasOnSettingDefaultValueChanged ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ListenerOnSettingValueChanged = " << (m_HasOnSettingValueChanged ? "TRUE" : "FALSE") << std::endl; + + file << "SkeletonGenerator_Box_ProcessInput = " << (m_HasProcessInput ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ProcessClock = " << (m_HasProcessClock ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ProcessMessage = " << (m_HasProcessMessage ? "TRUE" : "FALSE") << std::endl; + file << "SkeletonGenerator_Box_ClockFrequency = " << m_ClockFrequency << std::endl; + + + file << "# --------------------------------------------------" << std::endl; + file.close(); + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "box entries saved in [" << filename << "]\n"; + + m_configFileLoaded = false; + + return true; +} + +bool CBoxAlgorithmSkeletonGenerator::load(const std::string& filename) +{ + if (!m_configFileLoaded && !m_kernelCtx.getConfigurationManager().addConfigurationFromFile(filename.c_str())) + { + OV_WARNING_K("box: Configuration file [" << filename << "] could not be loaded."); + return false; + } + + + setEntryToConfigValue("sg-box-class-name-entry", "${SkeletonGenerator_Box_ClassName}"); + setEntryToConfigValue("sg-box-category-entry", "${SkeletonGenerator_Box_Category}"); + setEntryToConfigValue("sg-box-box-name-entry", "${SkeletonGenerator_Box_Name}"); + setEntryToConfigValue("sg-box-version-entry", "${SkeletonGenerator_Box_Version}"); + + + //we need to UNescape the special characters of the configuration manager files + std::string::iterator itShort; + std::string shortDescr = m_kernelCtx.getConfigurationManager().expand("${SkeletonGenerator_Box_ShortDescription}").toASCIIString(); + for (itShort = shortDescr.begin(); itShort < shortDescr.end(); ++itShort) + { + // juste erase the escape character + if ((*itShort) == '\\' && (itShort + 1) != shortDescr.end()) + { + if ((*(itShort + 1)) == '\\' || (*(itShort + 1)) == '=' || (*(itShort + 1)) == '$' || (*(itShort + 1)) == '\t' || (*(itShort + 1)) == '@') + { + shortDescr.erase(itShort); + } + } + // replace the special character @ by \n in the textview + else if ((*itShort) == '@') + { + shortDescr.erase(itShort); + shortDescr.insert(itShort, '\n'); + } + } + GtkWidget* sdEntry = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-short-description-entry")); + gtk_entry_set_text(GTK_ENTRY(sdEntry), TO_GTK_UTF8(shortDescr.c_str())); + + GtkWidget* detailedDescrTextView = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-detailed-description-textview")); + GtkTextBuffer* detailedDescrBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(detailedDescrTextView)); + std::string detailedDescr = m_kernelCtx.getConfigurationManager().expand("${SkeletonGenerator_Box_DetailedDescription}").toASCIIString(); + getLogManager() << Kernel::LogLevel_Debug << "LOAD > DESCR LOADED: " << detailedDescr << "\n"; + for (auto itDetail = detailedDescr.begin(); itDetail < detailedDescr.end(); ++itDetail) + { + // juste erase the escape character + if ((*itDetail) == '\\' && (itDetail + 1) != detailedDescr.end()) + { + if ((*(itShort + 1)) == '\\' || (*(itShort + 1)) == '=' || (*(itShort + 1)) == '$' || (*(itShort + 1)) == '\t' || (*(itShort + 1)) == '@') + { + detailedDescr.erase(itDetail); + } + } + // replace the special character @ by \n in the textview + else if ((*itDetail) == '@') + { + detailedDescr.erase(itDetail); + detailedDescr.insert(itDetail, '\n'); + } + } + getLogManager() << Kernel::LogLevel_Debug << "LOAD > DESCR MODIFIED: " << detailedDescr << "\n"; + gtk_text_buffer_set_text(detailedDescrBuffer, TO_GTK_UTF8(detailedDescr.c_str()), gint(detailedDescr.length())); + + GtkWidget* iconComboBox = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-icon-combobox")); + int64_t iconSelected = m_kernelCtx.getConfigurationManager().expandAsInteger("${SkeletonGenerator_Box_IconIndex}"); + gtk_combo_box_set_active(GTK_COMBO_BOX(iconComboBox), gint(iconSelected)); + + setActiveFromConf("sg-box-inputs-modify-checkbutton", "${SkeletonGenerator_Box_CanModifyInputs}"); + setActiveFromConf("sg-box-inputs-add-checkbutton", "${SkeletonGenerator_Box_CanAddInputs}"); + setActiveFromConf("sg-box-outputs-modify-checkbutton", "${SkeletonGenerator_Box_CanModifyOutputs}"); + setActiveFromConf("sg-box-outputs-add-checkbutton", "${SkeletonGenerator_Box_CanAddOutputs}"); + setActiveFromConf("sg-box-settings-modify-checkbutton", "${SkeletonGenerator_Box_CanModifySettings}"); + setActiveFromConf("sg-box-settings-add-checkbutton", "${SkeletonGenerator_Box_CanAddSettings}"); + + + GtkWidget* inputsTreeView = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-inputs-treeview")); + GtkTreeModel* inputsListStore = gtk_tree_view_get_model(GTK_TREE_VIEW(inputsTreeView)); + const size_t nInput = size_t(m_kernelCtx.getConfigurationManager().expandAsInteger("${SkeletonGenerator_Box_InputCount}", 0)); + for (size_t i = 0; i < nInput; ++i) + { + const std::string base = "${SkeletonGenerator_Box_Input" + std::to_string(i); + const gchar* name = TO_GTK_UTF8(m_kernelCtx.getConfigurationManager().expand(CString((base + "_Name}").c_str())).toASCIIString()); + const gchar* type = TO_GTK_UTF8(m_kernelCtx.getConfigurationManager().expand(CString((base + "_Type}").c_str())).toASCIIString()); + const gchar* typeID = TO_GTK_UTF8(m_kernelCtx.getConfigurationManager().expand(CString((base + "_TypeId}").c_str())).toASCIIString()); + GtkTreeIter it; + gtk_list_store_append(GTK_LIST_STORE(inputsListStore), &it); + gtk_list_store_set(GTK_LIST_STORE(inputsListStore), &it, 0, name, 1, type, 2, typeID, -1); + } + + GtkWidget* outputsTreeView = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-outputs-treeview")); + GtkTreeModel* outputsListStore = gtk_tree_view_get_model(GTK_TREE_VIEW(outputsTreeView)); + const size_t nOutput = size_t(m_kernelCtx.getConfigurationManager().expandAsInteger("${SkeletonGenerator_Box_OutputCount}", 0)); + for (size_t i = 0; i < nOutput; ++i) + { + const std::string base = "${SkeletonGenerator_Box_Output" + std::to_string(i); + const gchar* name = TO_GTK_UTF8(m_kernelCtx.getConfigurationManager().expand(CString((base + "_Name}").c_str())).toASCIIString()); + const gchar* type = TO_GTK_UTF8(m_kernelCtx.getConfigurationManager().expand(CString((base + "_Type}").c_str())).toASCIIString()); + const gchar* typeID = TO_GTK_UTF8(m_kernelCtx.getConfigurationManager().expand(CString((base + "_TypeId}").c_str())).toASCIIString()); + GtkTreeIter it; + gtk_list_store_append(GTK_LIST_STORE(outputsListStore), &it); + gtk_list_store_set(GTK_LIST_STORE(outputsListStore), &it, 0, name, 1, type, 2, typeID, -1); + } + + GtkWidget* settingsTreeView = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-settings-treeview")); + GtkTreeModel* settingsListStore = gtk_tree_view_get_model(GTK_TREE_VIEW(settingsTreeView)); + const size_t nSetting = size_t(m_kernelCtx.getConfigurationManager().expandAsInteger("${SkeletonGenerator_Box_SettingCount}", 0)); + for (size_t i = 0; i < nSetting; ++i) + { + const std::string base = "${SkeletonGenerator_Box_Setting" + std::to_string(i); + const gchar* name = TO_GTK_UTF8(m_kernelCtx.getConfigurationManager().expand(CString((base + "_Name}").c_str())).toASCIIString()); + const gchar* type = TO_GTK_UTF8(m_kernelCtx.getConfigurationManager().expand(CString((base + "_Type}").c_str())).toASCIIString()); + const gchar* typeID = TO_GTK_UTF8(m_kernelCtx.getConfigurationManager().expand(CString((base + "_TypeId}").c_str())).toASCIIString()); + const gchar* value = TO_GTK_UTF8(m_kernelCtx.getConfigurationManager().expand(CString((base + "_DefaultValue}").c_str())).toASCIIString()); + GtkTreeIter it; + gtk_list_store_append(GTK_LIST_STORE(settingsListStore), &it); + gtk_list_store_set(GTK_LIST_STORE(settingsListStore), &it, 0, name, 1, type, 2, value, 3, typeID, -1); + } + + GtkWidget* algoTreeView = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-treeview")); + GtkTreeModel* algoListStore = gtk_tree_view_get_model(GTK_TREE_VIEW(algoTreeView)); + const size_t nAlgo = size_t(m_kernelCtx.getConfigurationManager().expandAsInteger("${SkeletonGenerator_Box_AlgorithmCount}", 0)); + for (size_t i = 0; i < nAlgo; ++i) + { + const std::string base = "${SkeletonGenerator_Box_Algorithm" + std::to_string(i); + const gchar* name = TO_GTK_UTF8(m_kernelCtx.getConfigurationManager().expand(CString((base + "_Name}").c_str())).toASCIIString()); + GtkTreeIter it; + gtk_list_store_append(GTK_LIST_STORE(algoListStore), &it); + gtk_list_store_set(GTK_LIST_STORE(algoListStore), &it, 0, name, -1); + } + + GtkWidget* listenerWidget = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-listener-checkbutton")); + gtk_toggle_button_set_active( + GTK_TOGGLE_BUTTON(listenerWidget), m_kernelCtx.getConfigurationManager().expandAsBoolean("${SkeletonGenerator_Box_UseListener}", false)); + + setActiveFromConfTog("sg-box-listener-input-added-checkbutton", "${SkeletonGenerator_Box_ListenerOnInputAdded}"); + setActiveFromConfTog("sg-box-listener-input-removed-checkbutton", "${SkeletonGenerator_Box_ListenerOnInputRemoved}"); + setActiveFromConfTog("sg-box-listener-input-type-checkbutton", "${SkeletonGenerator_Box_ListenerOnInputTypeChanged}"); + setActiveFromConfTog("sg-box-listener-input-name-checkbutton", "${SkeletonGenerator_Box_ListenerOnInputNameChanged}"); + setActiveFromConfTog("sg-box-listener-input-connected-checkbutton", "${SkeletonGenerator_Box_ListenerOnInputConnected}"); + setActiveFromConfTog("sg-box-listener-input-disconnected-checkbutton", "${SkeletonGenerator_Box_ListenerOnInputDisconnected}"); + setActiveFromConfTog("sg-box-listener-output-added-checkbutton", "${SkeletonGenerator_Box_ListenerOnOutputAdded}"); + setActiveFromConfTog("sg-box-listener-output-removed-checkbutton", "${SkeletonGenerator_Box_ListenerOnOutputRemoved}"); + setActiveFromConfTog("sg-box-listener-output-type-checkbutton", "${SkeletonGenerator_Box_ListenerOnOutputTypeChanged}"); + setActiveFromConfTog("sg-box-listener-output-name-checkbutton", "${SkeletonGenerator_Box_ListenerOnOutputNameChanged}"); + setActiveFromConfTog("sg-box-listener-output-connected-checkbutton", "${SkeletonGenerator_Box_ListenerOnOutputConnected}"); + setActiveFromConfTog("sg-box-listener-output-disconnected-checkbutton", "${SkeletonGenerator_Box_ListenerOnOutputDisconnected}"); + + setActiveFromConfTog("sg-box-listener-setting-added-checkbutton", "${SkeletonGenerator_Box_ListenerOnSettingAdded}"); + setActiveFromConfTog("sg-box-listener-setting-removed-checkbutton", "${SkeletonGenerator_Box_ListenerOnSettingRemoved}"); + setActiveFromConfTog("sg-box-listener-setting-type-checkbutton", "${SkeletonGenerator_Box_ListenerOnSettingTypeChanged}"); + setActiveFromConfTog("sg-box-listener-setting-name-checkbutton", "${SkeletonGenerator_Box_ListenerOnSettingNameChanged}"); + setActiveFromConfTog("sg-box-listener-setting-default-checkbutton", "${SkeletonGenerator_Box_ListenerOnSettingDefaultValueChanged}"); + setActiveFromConfTog("sg-box-listener-setting-value-checkbutton", "${SkeletonGenerator_Box_ListenerOnSettingValueChanged}"); + + setActiveFromConfTog("sg-box-process-input-checkbutton", "${SkeletonGenerator_Box_ProcessInput}"); + setActiveFromConfTog("sg-box-process-clock-checkbutton", "${SkeletonGenerator_Box_ProcessClock}"); + GtkWidget* processingMethod = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-process-frequency-spinbutton")); + gtk_spin_button_set_value( + GTK_SPIN_BUTTON(processingMethod), double(m_kernelCtx.getConfigurationManager().expandAsUInteger("${SkeletonGenerator_Box_ProcessClock}", 1))); + setActiveFromConfTog("sg-box-process-message-checkbutton", "${SkeletonGenerator_Box_ProcessMessage}"); + + getLogManager() << Kernel::LogLevel_Info << "box entries from [" << m_configFile << "] loaded.\n"; + + return true; +} + +void CBoxAlgorithmSkeletonGenerator::getCurrentParameters() +{ + m_Name = getText("sg-box-box-name-entry"); + m_ClassName = getText("sg-box-class-name-entry"); + m_Category = getText("sg-box-category-entry"); + m_Version = getText("sg-box-version-entry"); + m_ShortDesc = getText("sg-box-short-description-entry"); + + GtkWidget* entryDetailedDescr = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-detailed-description-textview")); + GtkTextBuffer* bufferDetailedDescr = gtk_text_view_get_buffer(GTK_TEXT_VIEW(entryDetailedDescr)); + GtkTextIter itStart, itEnd; + gtk_text_buffer_get_start_iter(bufferDetailedDescr, &itStart); + gtk_text_buffer_get_end_iter(bufferDetailedDescr, &itEnd); + m_DetailedDesc = gtk_text_buffer_get_text(bufferDetailedDescr, &itStart, &itEnd, false); + + GtkWidget* iconCombobox = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-icon-combobox")); + GtkTreeModel* iconListStore = gtk_combo_box_get_model(GTK_COMBO_BOX(iconCombobox)); + GtkTreeIter itIcon; + m_GtkStockItemIdx = gtk_combo_box_get_active(GTK_COMBO_BOX(iconCombobox)); // can be -1 if nothing selected + if (m_GtkStockItemIdx != -1) + { + gtk_tree_model_iter_nth_child(iconListStore, &itIcon, nullptr, m_GtkStockItemIdx); + gchar* data; + gtk_tree_model_get(iconListStore, &itIcon, 0, &data, -1); + m_GtkStockItemName = data; + } + else { m_GtkStockItemName = ""; } + + m_CanModifyInputs = isActive("sg-box-inputs-modify-checkbutton"); + m_CanAddInputs = isActive("sg-box-inputs-add-checkbutton"); + m_CanModifyOutputs = isActive("sg-box-outputs-modify-checkbutton"); + m_CanAddOutputs = isActive("sg-box-outputs-add-checkbutton"); + m_CanModifySettings = isActive("sg-box-settings-modify-checkbutton"); + m_CanAddSettings = isActive("sg-box-settings-add-checkbutton"); + + m_UseBoxListener = isActive("sg-box-listener-checkbutton"); + m_HasOnInputAdded = isActive("sg-box-listener-input-added-checkbutton"); + m_HasOnInputRemoved = isActive("sg-box-listener-input-removed-checkbutton"); + m_HasOnInputTypeChanged = isActive("sg-box-listener-input-type-checkbutton"); + m_HasOnInputNameChanged = isActive("sg-box-listener-input-name-checkbutton"); + m_HasOnInputConnected = isActive("sg-box-listener-input-connected-checkbutton"); + m_HasOnInputDisconnected = isActive("sg-box-listener-input-disconnected-checkbutton"); + + m_HasOnOutputAdded = isActive("sg-box-listener-output-added-checkbutton"); + m_HasOnOutputRemoved = isActive("sg-box-listener-output-removed-checkbutton"); + m_HasOnOutputTypeChanged = isActive("sg-box-listener-output-type-checkbutton"); + m_HasOnOutputNameChanged = isActive("sg-box-listener-output-name-checkbutton"); + m_HasOnOutputConnected = isActive("sg-box-listener-output-connected-checkbutton"); + m_HasOnOutputDisconnected = isActive("sg-box-listener-output-disconnected-checkbutton"); + + m_HasOnSettingAdded = isActive("sg-box-listener-setting-added-checkbutton"); + m_HasOnSettingRemoved = isActive("sg-box-listener-setting-removed-checkbutton"); + m_HasOnSettingTypeChanged = isActive("sg-box-listener-setting-type-checkbutton"); + m_HasOnSettingNameChanged = isActive("sg-box-listener-setting-name-checkbutton"); + m_HasOnSettingDefaultValueChanged = isActive("sg-box-listener-setting-default-checkbutton"); + m_HasOnSettingValueChanged = isActive("sg-box-listener-setting-value-checkbutton"); + + m_HasProcessInput = isActive("sg-box-process-input-checkbutton"); + m_HasProcessClock = isActive("sg-box-process-clock-checkbutton"); + GtkWidget* processMethod = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-process-frequency-spinbutton")); + m_ClockFrequency = uint32_t(gtk_spin_button_get_value(GTK_SPIN_BUTTON(processMethod))); + m_HasProcessMessage = isActive("sg-box-process-message-checkbutton"); + + //USE_CODEC_TOOLKIT = isActive("sg-box-algorithms-toolkit-checkbutton"); + + fillCollection("sg-box-inputs-treeview", m_Inputs); + fillCollection("sg-box-outputs-treeview", m_Outputs); + fillCollection("sg-box-settings-treeview", m_Settings); + + GtkWidget* algosTreeview = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-algorithms-treeview")); + GtkTreeModel* algosListStore = gtk_tree_view_get_model(GTK_TREE_VIEW(algosTreeview)); + GtkTreeIter itAlgo; + bool valid = gtk_tree_model_get_iter_first(algosListStore, &itAlgo) ? true : false; + m_Algorithms.clear(); + while (valid) + { + /* Walk through the list, reading each row */ + gchar* name; + gtk_tree_model_get(algosListStore, &itAlgo, 0, &name, -1); + + m_Algorithms.push_back(name); + + g_free(name); + valid = (gtk_tree_model_iter_next(algosListStore, &itAlgo) ? true : false); + } +} + +void CBoxAlgorithmSkeletonGenerator::setSensitivity(const char* widgetName, const bool isActive) const +{ + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_builder, widgetName)); + if (widget != nullptr) { gtk_widget_set_sensitive(widget, isActive); } +} + +void CBoxAlgorithmSkeletonGenerator::clearStore(const char* name) const +{ + GtkWidget* view = GTK_WIDGET(gtk_builder_get_object(m_builder, name)); + GtkTreeModel* store = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); + gtk_list_store_clear(GTK_LIST_STORE(store)); +} + +void CBoxAlgorithmSkeletonGenerator::addDialogButttons(const char* name) const +{ + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(m_builder, name)); + gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_APPLY, GTK_RESPONSE_APPLY); + gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); +} + +void CBoxAlgorithmSkeletonGenerator::setEntryToConfigValue(const char* name, const char* token) const +{ + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_builder, name)); + const gchar* value = TO_GTK_UTF8(m_kernelCtx.getConfigurationManager().expand(token).toASCIIString()); + gtk_entry_set_text(GTK_ENTRY(widget), TO_GTK_UTF8(value)); +} + +void CBoxAlgorithmSkeletonGenerator::setActiveFromConf(const char* name, const char* token) const +{ + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_builder, name)); + const bool value = m_kernelCtx.getConfigurationManager().expandAsBoolean(token, false); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), value); +} + +void CBoxAlgorithmSkeletonGenerator::setActiveFromConfTog(const char* name, const char* token) const +{ + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_builder, name)); + const bool value = m_kernelCtx.getConfigurationManager().expandAsBoolean(token, false); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), value); +} + +const gchar* CBoxAlgorithmSkeletonGenerator::getText(const char* name) const +{ + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_builder, name)); + return gtk_entry_get_text(GTK_ENTRY(widget)); +} + +void CBoxAlgorithmSkeletonGenerator::addCollectionToTree(const char* treeName, const std::vector& collection) const +{ + GtkWidget* view = GTK_WIDGET(gtk_builder_get_object(m_builder, treeName)); + GtkTreeModel* store = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); + for (const auto& elem : collection) + { + GtkTreeIter it; + gtk_list_store_append(GTK_LIST_STORE(store), &it); + gtk_list_store_set(GTK_LIST_STORE(store), &it, 0, TO_GTK_UTF8(elem.c_str()), -1); + } +} + +void CBoxAlgorithmSkeletonGenerator::fillCollection(const char* treeName, std::vector& collection) const +{ + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_builder, treeName)); + GtkTreeModel* model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget)); + GtkTreeIter it; + bool valid = gtk_tree_model_get_iter_first(model, &it) ? true : false; + collection.clear(); + while (valid) + { + /* Walk through the list, reading each row */ + gchar *name, *type, *typeOv, *value = nullptr; + if (gtk_tree_model_get_n_columns(model) == 3) { gtk_tree_model_get(model, &it, 0, &name, 1, &type, 2, &typeOv, -1); } + else { gtk_tree_model_get(model, &it, 0, &name, 1, &type, 2, &value, 3, &typeOv, -1); } + + SIOS ios; + ios.name = name; + ios.type = type; + ios.typeID = typeOv; + ios.defaultValue = value ? value : ""; + collection.push_back(ios); + + g_free(name); + g_free(type); + g_free(typeOv); + g_free(value); + valid = gtk_tree_model_iter_next(model, &it) ? true : false; + } +} + +bool CBoxAlgorithmSkeletonGenerator::isActive(char* name) const +{ + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_builder, name)); + return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) ? true : false; +} + +} // namespace SkeletonGenerator +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCBoxAlgorithmSkeletonGenerator.h b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCBoxAlgorithmSkeletonGenerator.h new file mode 100644 index 0000000..a7bb95a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCBoxAlgorithmSkeletonGenerator.h @@ -0,0 +1,138 @@ +#pragma once + +#include "ovsgCSkeletonGenerator.h" +#include +#include + +namespace OpenViBE { +namespace SkeletonGenerator { +class CBoxAlgorithmSkeletonGenerator final : public CSkeletonGenerator +{ +public: + + CBoxAlgorithmSkeletonGenerator(Kernel::IKernelContext& ctx, GtkBuilder* builder) : CSkeletonGenerator(ctx, builder) { } + ~CBoxAlgorithmSkeletonGenerator() override { } + + bool initialize() override; + bool save(const std::string& filename) override; + bool load(const std::string& filename) override; + void getCurrentParameters() override; + + // Box Description + std::string m_Name, m_Version, m_ClassName, m_Category, m_ShortDesc, m_DetailedDesc; + std::string m_GtkStockItemName; + int m_GtkStockItemIdx = 0; + + struct SIOS + { + std::string name, type, typeID, defaultValue; + }; + + // Inputs + bool m_CanModifyInputs = false, m_CanAddInputs = false; + std::vector m_Inputs; + // Outputs + bool m_CanModifyOutputs = false, m_CanAddOutputs = false; + std::vector m_Outputs; + // Settings + bool m_CanModifySettings = false, m_CanAddSettings = false; + std::vector m_Settings; + + //Algorithms + std::vector m_Algorithms; // the algorithm selected by user + // Can be made non-const after '= false' produces working code + static const bool USE_CODEC_TOOLKIT = true; // use or not the codec toolkit for encoder and decoder algorithms + //the map between algorithm and corresponding header declaration (all variables algo/input/output). + std::map m_AlgoDeclaration; + //the map between algorithm and corresponding initialisation + std::map m_AlgoInitialisations; + //the map between algorithm and corresponding initialisation of ref targets + std::map m_AlgoInitialisationReferenceTargets; + //the map between algorithm and corresponding uninitialisation + std::map m_AlgoUninitialisations; + + // Box Listener + bool m_UseBoxListener = false; + // input + bool m_HasOnInputAdded = false; + bool m_HasOnInputRemoved = false; + bool m_HasOnInputTypeChanged = false; + bool m_HasOnInputNameChanged = false; + bool m_HasOnInputConnected = false; + bool m_HasOnInputDisconnected = false; + // output + bool m_HasOnOutputAdded = false; + bool m_HasOnOutputRemoved = false; + bool m_HasOnOutputTypeChanged = false; + bool m_HasOnOutputNameChanged = false; + bool m_HasOnOutputConnected = false; + bool m_HasOnOutputDisconnected = false; + // setting + bool m_HasOnSettingAdded = false; + bool m_HasOnSettingRemoved = false; + bool m_HasOnSettingTypeChanged = false; + bool m_HasOnSettingNameChanged = false; + bool m_HasOnSettingDefaultValueChanged = false; + bool m_HasOnSettingValueChanged = false; + + bool m_HasProcessInput = false; + bool m_HasProcessClock = false; + bool m_HasProcessMessage = false; + uint32_t m_ClockFrequency = 0; + + void buttonCheckCB(); + void buttonOkCB(); + void toggleListenerCheckbuttonsStateCB(bool state) const; + void buttonTooltipCB(GtkButton* button); + void buttonExitCB(); + + void buttonAddInputCB() const; + void buttonAddOutputCB() const; + void buttonAddSettingCB() const; + void buttonAddAlgorithmCB() const; + void buttonRemoveGeneric(const char* buttonName) const; + + void algorithmSelectedCB(int index); + void setSensitivity(const char* widgetName, bool isActive) const; + +private: + + Kernel::ILogManager& getLogManager() const override { return m_kernelCtx.getLogManager(); } + Kernel::IErrorManager& getErrorManager() const override { return m_kernelCtx.getErrorManager(); } + + static std::string getRandomIdentifierString() { return CIdentifier::random().str(); } + + // Sanity checks that a string is not empty or consist of spaces + static bool isStringValid(const std::string& str) { return !str.empty() && str.find_first_not_of(' ') != std::string::npos; } + + void clearStore(const char* name) const; + void addDialogButttons(const char* name) const; + void setEntryToConfigValue(const char* name, const char* token) const; + void setActiveFromConf(const char* name, const char* token) const; + void setActiveFromConfTog(const char* name, const char* token) const; + const gchar* getText(const char* name) const; + void addCollectionToTree(const char* treeName, const std::vector& collection) const; + void fillCollection(const char* treeName, std::vector& collection) const; + bool isActive(char* name) const; + + std::map m_tooltips; + std::vector m_typeCorrespondances; +}; + +class CDummyAlgoProto final : public Kernel::IAlgorithmProto +{ +public: + std::map m_Inputs, m_Outputs; + std::vector m_InputTriggers, m_OutputTriggers; + + bool addInputParameter(const CIdentifier& id, const CString& name, Kernel::EParameterType typeID, + const CIdentifier& subTypeID = CIdentifier::undefined()) override; + bool addOutputParameter(const CIdentifier& id, const CString& name, Kernel::EParameterType typeID, + const CIdentifier& subTypeID = CIdentifier::undefined()) override; + bool addInputTrigger(const CIdentifier& id, const CString& name) override; + bool addOutputTrigger(const CIdentifier& id, const CString& name) override; + + CIdentifier getClassIdentifier() const override { return CIdentifier::undefined(); } +}; +} // namespace SkeletonGenerator +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCDriverSkeletonGenerator.cpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCDriverSkeletonGenerator.cpp new file mode 100755 index 0000000..ee94b44 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCDriverSkeletonGenerator.cpp @@ -0,0 +1,504 @@ +#include "ovsgCDriverSkeletonGenerator.h" + +#include +#include +#include + +#include +#include + +#include + +namespace OpenViBE { +namespace SkeletonGenerator { +//----------------------------------------------------------------------- +static void CheckCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonCheckCB(); } +static void TooltipCB(GtkButton* button, void* data) { static_cast(data)->buttonTooltipCB(button); } +static void OkCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonOkCB(); } + +static void ExitCB(GtkButton* /*button*/, void* data) +{ + static_cast(data)->buttonExitCB(); + gtk_exit(0); +} + +//----------------------------------------------------------------------- +void CDriverSkeletonGenerator::buttonExitCB() +{ + getCommonParameters(); + getCurrentParameters(); + if (!cleanConfigurationFile(m_configFile)) { return; } + saveCommonParameters(m_configFile); + save(m_configFile); + + getLogManager() << Kernel::LogLevel_Info << "All entries saved in [" << m_configFile << "]. Exiting.\n"; +} + +void CDriverSkeletonGenerator::buttonCheckCB() +{ + //Author and Company + getCommonParameters(); + getCurrentParameters(); + + getLogManager() << Kernel::LogLevel_Info << "Checking values... \n"; + + bool success = true; + + std::stringstream ss; + ss << "----- STATUS -----\n"; + + //-------------------------------------------------------------------------------------------------------------------------------------------// + //::GtkWidget * driverName = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_driver_name")); + //m_DriverName = gtk_entry_get_text(GTK_ENTRY(driverName)); + const boost::regex regExpDriverName("([a-z]|[A-Z]|[0-9])+([a-z]|[A-Z]|[0-9]|[ \t\r\n]|[\\.-_\\(\\)])*", boost::regex::perl); + if (regex_match(std::string(m_DriverName), regExpDriverName) == false) + { + OV_WARNING_K("-- Driver Name: INVALID"); + success = false; + ss << "[FAILED] Invalid driver name. Please use only characters (lower or uppercase) and numbers (blanck allowed).\n"; + } + else + { + getLogManager() << Kernel::LogLevel_Info << "-- Driver Name: VALID (" << m_DriverName << ")\n"; + ss << "[ OK ] Valid driver name.\n"; + } + //-------------------------------------------------------------------------------------------------------------------------------------------// + //::GtkWidget * className = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_class_name")); + //m_ClassName = gtk_entry_get_text(GTK_ENTRY(className)); + const boost::regex regExpClassName("([a-z]|[A-Z]|[0-9])+", boost::regex::perl); + if (regex_match(std::string(m_ClassName), regExpClassName) == false) + { + OV_WARNING_K("-- Class Name: INVALID"); + success = false; + ss << "[FAILED] Invalid class name. Please use only characters (lower or uppercase) and numbers (no blanck allowed).\n"; + } + else + { + getLogManager() << Kernel::LogLevel_Info << "-- Class Name: VALID (" << m_ClassName << ")\n"; + ss << "[ OK ] Valid class name.\n"; + } + //-------------------------------------------------------------------------------------------------------------------------------------------// + GtkWidget* spinMinChannel = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_min_channel")); + //m_MinChannel = std::to_string(size_t(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinMinChannel)))).c_str(); + GtkWidget* spinMaxChannel = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_max_channel")); + //m_MaxChannel = std::to_string(size_t(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinMaxChannel)))).c_str(); + if (gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinMinChannel)) > gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinMaxChannel))) + { + OV_WARNING_K(Kernel::LogLevel_Warning << "-- Channels: INVALID"); + success = false; + ss << "[FAILED] Invalid channel count. Be sure that Min <= Max.\n"; + } + else + { + getLogManager() << Kernel::LogLevel_Info << "-- Channels: VALID (" << m_MinChannel << "/" << m_MaxChannel << ")\n"; + ss << "[ OK ] Valid channel count.\n"; + } + //-------------------------------------------------------------------------------------------------------------------------------------------// + /*::GtkWidget * sf = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_sampling_frequencies")); + CString samplings = gtk_entry_get_text(GTK_ENTRY(sf)); + */ + const boost::regex regExpSamplings("(([1-9][0-9]*);)*([1-9][0-9]*)", boost::regex::perl); + if (regex_match(m_Samplings, regExpSamplings) == false) + { + OV_WARNING_K("-- Sampling frequencies: INVALID"); + success = false; + ss << "[FAILED] Invalid sampling frequencies. Please use only whole numbers separated with ';' (no blanck allowed).\n"; + } + else + { + // Maximum 16 frequencies + size_t nSampling = 0; + size_t freq; + std::stringstream tmp(m_Samplings); + m_SamplingSeparate.clear(); + while (tmp >> freq && nSampling < 16) + { + m_SamplingSeparate.push_back(std::to_string(freq)); + if (tmp.peek() == ';') { tmp.ignore(); } + nSampling++; + } + + getLogManager() << Kernel::LogLevel_Info << "-- Sampling frequencies: VALID\n"; + for (const auto& s : m_SamplingSeparate) { std::cout << "- " << s << " Hz\n"; } + + ss << "[ OK ] " << nSampling << " valid sampling frequencie(s).\n"; + } + //-------------------------------------------------------------------------------------------------------------------------------------------// + /*::GtkWidget * fileChooser = GTK_WIDGET(gtk_builder_get_object(m_builder, "filechooserbutton_target_directory")); + char * directory = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fileChooser)); + m_directory = CString(directory); + g_free(directory);*/ + +#ifdef TARGET_OS_Windows + const std::string space("%20"); + if (m_directory.rfind(space) != std::string::npos) + { + ss << "[FAILED] Invalid destination folder :" << m_directory << ".\n"; + getLogManager() << Kernel::LogLevel_Error << "Invalid destination folder :" << m_directory << ".\n"; + success = false; + } + else +#endif + { + getLogManager() << Kernel::LogLevel_Info << "-- Target directory: " << m_directory << "\n"; + ss << "[ OK ] Valid target directory: " << m_directory << "\n"; + } + //-------------------------------------------------------------------------------------------------------------------------------------------// + GtkWidget* textview = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-driver-tooltips-textview")); + GtkTextBuffer* buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); + if (success) + { + ss << "----- SUCCESS -----\nPress OK to generate the files. If you want to modify your choice(s), please press the \"Check\" button again."; + GtkWidget* buttonOk = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-driver-ok-button")); + gtk_widget_set_sensitive(buttonOk, true); + } + else + { + ss << "----- PROCESS FAILED -----\nModify your choices and press the \"Check\" button again."; + GtkWidget* buttonOk = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-driver-ok-button")); + gtk_widget_set_sensitive(buttonOk, false); + } + + gtk_text_buffer_set_text(buffer, ss.str().c_str(), -1); +} + +void CDriverSkeletonGenerator::buttonOkCB() +{ + getLogManager() << Kernel::LogLevel_Info << "Generating files... \n"; + std::string log = "Generating files...\n"; + + bool success = true; + + const std::string date = getDate(); + + // we construct the map of substitutions + std::map substitutions; + substitutions["@@AuthorName@@"] = m_author; + substitutions["@@CompanyName@@"] = m_company; + substitutions["@@Date@@"] = date; + substitutions["@@ClassName@@"] = m_ClassName; + substitutions["@@DriverName@@"] = m_DriverName; + substitutions["@@MinChannel@@"] = m_MinChannel; + substitutions["@@MaxChannel@@"] = m_MaxChannel; + substitutions["@@SamplingFrequency@@"] = m_SamplingSeparate[0]; + + GtkWidget* textview = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-driver-tooltips-textview")); + GtkTextBuffer* buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); + + + //-------------------------------------------------------------------------------------------------------------------------------------------// + // driver.h + std::string dst = m_directory + "/ovasCDriver" + m_ClassName + ".h"; + std::string tmplate = m_kernelCtx.getConfigurationManager().expand("${Path_Data}/applications/skeleton-generator/driver.h-skeleton").toASCIIString(); + + if (!this->generate(tmplate, dst, substitutions, log)) + { + gtk_text_buffer_set_text(buffer, log.c_str(), -1); + success = false; + } + + //-------------------------------------------------------------------------------------------------------------------------------------------// + // driver.cpp + dst = m_directory + "/ovasCDriver" + m_ClassName + ".cpp"; + tmplate = m_kernelCtx.getConfigurationManager().expand("${Path_Data}/applications/skeleton-generator/driver.cpp-skeleton").toASCIIString(); + + if (!this->generate(tmplate, dst, substitutions, log)) + { + gtk_text_buffer_set_text(buffer, log.c_str(), -1); + success = false; + } + //-------------------------------------------------------------------------------------------------------------------------------------------// + // config.h + dst = m_directory + "/ovasCConfiguration" + m_ClassName + ".h"; + tmplate = m_kernelCtx.getConfigurationManager().expand("${Path_Data}/applications/skeleton-generator/configuration.h-skeleton").toASCIIString(); + + if (!this->generate(tmplate, dst, substitutions, log)) + { + gtk_text_buffer_set_text(buffer, log.c_str(), -1); + success = false; + } + //-------------------------------------------------------------------------------------------------------------------------------------------// + // config.cpp + dst = m_directory + "/ovasCConfiguration" + m_ClassName + ".cpp"; + tmplate = m_kernelCtx.getConfigurationManager().expand("${Path_Data}/applications/skeleton-generator/configuration.cpp-skeleton").toASCIIString(); + + if (!this->generate(tmplate, dst, substitutions, log)) + { + gtk_text_buffer_set_text(buffer, log.c_str(), -1); + success = false; + } + //-------------------------------------------------------------------------------------------------------------------------------------------// + // interface.ui + dst = m_directory + "/interface-" + m_ClassName + ".ui"; + tmplate = m_kernelCtx.getConfigurationManager().expand("${Path_Data}/applications/skeleton-generator/interface.ui-skeleton").toASCIIString(); + + if (!this->generate(tmplate, dst, substitutions, log)) + { + gtk_text_buffer_set_text(buffer, log.c_str(), -1); + success = false; + } + // the following substitution is done in a .ui file, and not in a cpp file. + // The SED primitive immplemented do not cover that case, and some typo problem happen with the character " + const std::string pattern("@@SamplingFrequencyList@@"); + std::string substitute; + for (auto it = m_SamplingSeparate.begin(); it != m_SamplingSeparate.end();) + { + substitute += (*it++); + if (it != m_SamplingSeparate.end()) { substitute += "<\\/col><\\/row>"; } + } + success &= regexReplace(dst, pattern, substitute, ""); + + //-------------------------------------------------------------------------------------------------------------------------------------------// + // readme-driver.txt + dst = m_directory + "/README.txt"; + tmplate = m_kernelCtx.getConfigurationManager().expand("${Path_Data}/applications/skeleton-generator/readme-driver.txt-skeleton"); + + if (!this->generate(tmplate, dst, substitutions, log)) + { + gtk_text_buffer_set_text(buffer, log.c_str(), -1); + success = false; + } + //-------------------------------------------------------------------------------------------------------------------------------------------// + + if (success) + { + success &= cleanConfigurationFile(m_configFile); + success &= saveCommonParameters(m_configFile); + success &= save(m_configFile); + } + + if (!success) + { + log += "Generation process did not completly succeed. Some files may have not been produced.\n"; + OV_WARNING_K("Generation process did not completly succeed. Some files may have not been produced."); + } + else + { + log += "Generation process successful. All information saved in [" + m_configFile + "]\nPlease read the file [README.txt] !\n"; + getLogManager() << Kernel::LogLevel_Info << "Generation process successful. All information saved in [" << m_configFile << "]\n"; + } + + // Launch the browser to display the produced files + const std::string browser = m_kernelCtx.getConfigurationManager().expand("${Designer_WebBrowserCommand_${OperatingSystem}}").toASCIIString(); + +#ifdef TARGET_OS_Windows + const std::string browserCmd = browser + " file:///" + m_directory; //otherwise the browser does not find the directory (problem with / and \ char) +#else + const std::string browserCmd = browser + " \"" + m_directory + "\""; +#endif + + if (system(browserCmd.c_str())) { } + + gtk_text_buffer_set_text(buffer, log.c_str(), -1); +} + +void CDriverSkeletonGenerator::buttonTooltipCB(GtkButton* button) +{ + const EWidgetName widgetName = m_widgetNames[button]; + + GtkWidget* textview = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-driver-tooltips-textview")); + GtkTextBuffer* buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); + + if (widgetName == EWidgetName::DriverName) + { + gtk_text_buffer_set_text(buffer, + "Driver Name: \nThis name will be the one displayed in the Acquisition Server selection combobox.\nUsually, the driver is named according to the EEG device (with precisions such as a version number).\n------\nExample: OpenEEG Modular EEG (P2)\n\n\n", + -1); + } + else if (widgetName == EWidgetName::ClassName) + { + gtk_text_buffer_set_text(buffer, + "Class Name: \nThis name will be used to generate all source and GUI files.\nYou should choose a class name close to the device name (no blank allowed !).\n------\nExample: OpenEEGModularEEG will generate\n - ovasCDriverOpenEEGModularEEG.h/.cpp, the driver skeleton \n - ovasCConfigurationOpenEEGModularEEG.h/.cpp, the configuration class skeleton\n - interface-OpenEEG-ModularEEG.ui, the GUI description file", + -1); + } + else if (widgetName == EWidgetName::ChannelCount) + { + gtk_text_buffer_set_text(buffer, + "Channel count: \nEnter in the two fields the minimum and maximum number of channels the device is capable of.\nOf course you can still change it later in the source code.\n------\nExample: Min(1) Max(16)\n\n\n", + -1); + } + else if (widgetName == EWidgetName::Sampling) + { + gtk_text_buffer_set_text(buffer, + "Sampling frequencies: \nEnter in the text field the sampling frequencies your device is capable of.\nYou can specify a list of defined frequencies (value separator ';').\n------\nExample:\n\"128;256;512\" for three defined frequencies.\n\n", + -1); + } + else if (widgetName == EWidgetName::Directory) + { + gtk_text_buffer_set_text(buffer, + "Target directory: \nEnter the destination directory in which all files will be generated. \nAny existing files will be overwritten.\n------\nExample: ~/skeleton-generator/foobar-driver/\n\n\n", + -1); + } + else { } +} + +bool CDriverSkeletonGenerator::initialize() +{ + GtkWidget* driver = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-driver-window")); + + // Buttons and signals + GtkWidget* buttonCheck = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-driver-check-button")); + GtkWidget* buttonOk = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-driver-ok-button")); + + g_signal_connect(buttonCheck, "pressed", G_CALLBACK(CheckCB), this); + g_signal_connect(buttonOk, "pressed", G_CALLBACK(OkCB), this); + + ////target directory + //::GtkWidget * fileChooser = GTK_WIDGET(gtk_builder_get_object(m_builder, "filechooserbutton_target_directory")); + //CString directory = m_kernelContext.getConfigurationManager().expand("${SkeletonGenerator_TargetDirectory}"); + //if(!gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(fileChooser), directory.c_str())) + //{ + // gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(fileChooser),".."); + //} + + + // Tooltips buttons and signal + GtkButton* buttonDriverName = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-driver-driver-name-tooltip-button")); + GtkButton* buttonClassName = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-driver-class-name-tooltip-button")); + GtkButton* buttonChannelCount = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-driver-channel-count-tooltip-button")); + GtkButton* buttonSampling = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-driver-sampling-frequencies-tooltip-button")); + GtkButton* buttonDirectory = GTK_BUTTON(gtk_builder_get_object(m_builder, "sg-driver-target-directory-tooltip-button")); + + m_widgetNames[buttonDriverName] = EWidgetName::DriverName; + m_widgetNames[buttonClassName] = EWidgetName::ClassName; + m_widgetNames[buttonChannelCount] = EWidgetName::ChannelCount; + m_widgetNames[buttonSampling] = EWidgetName::Sampling; + m_widgetNames[buttonDirectory] = EWidgetName::Directory; + + g_signal_connect(buttonDriverName, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonClassName, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonChannelCount, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonSampling, "pressed", G_CALLBACK(TooltipCB), this); + g_signal_connect(buttonDirectory, "pressed", G_CALLBACK(TooltipCB), this); + + //Close with X and "cancel" button + g_signal_connect(G_OBJECT(driver), "delete_event", G_CALLBACK(gtk_exit), nullptr); + GtkWidget* buttonCancel = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-driver-cancel-button")); + g_signal_connect(buttonCancel, "pressed", G_CALLBACK(ExitCB), this); + + //load everything from file + load(m_configFile); + + gtk_widget_show_all(driver); + + return true; +} + +bool CDriverSkeletonGenerator::save(const std::string& filename) +{ + std::ofstream file; + file.open(filename, std::ios::app | std::ios::binary); + OV_ERROR_UNLESS_KRF(file.is_open(), "Saving the driver entries in [" << m_configFile << "] failed !", Kernel::ErrorType::BadFileWrite); + + file << "# ----------------------DRIVER-------------------------\n"; + std::string directory(m_directory); + for (auto it = directory.begin(); it < directory.end(); ++it) { if ((*it) == '\\') { directory.replace(it, it + 1, 1, '/'); } } + + file << "SkeletonGenerator_Driver_DriverName = " << m_DriverName << std::endl; + file << "SkeletonGenerator_Driver_ClassName = " << m_ClassName << std::endl; + file << "SkeletonGenerator_Driver_MinChannel = " << m_MinChannel << std::endl; + file << "SkeletonGenerator_Driver_MaxChannel = " << m_MaxChannel << std::endl; + file << "SkeletonGenerator_Driver_SamplingFrequencies = " << m_Samplings << std::endl; + file << "SkeletonGenerator_Driver_TargetDirectory = " << directory << std::endl; + file << "# -----------------------------------------------------" << std::endl; + file.close(); + getLogManager() << Kernel::LogLevel_Info << "Driver entries saved in [" << m_configFile << "]\n"; + + m_configFileLoaded = false; + + return true; +} + +bool CDriverSkeletonGenerator::load(const std::string& filename) +{ + if (!m_configFileLoaded && !m_kernelCtx.getConfigurationManager().addConfigurationFromFile(filename.c_str())) + { + OV_WARNING_K("Driver: Configuration file [" << filename << "] could not be loaded. It will be automatically generated after first use."); + return false; + } + + GtkWidget* driverName = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_driver_name")); + gtk_entry_set_text(GTK_ENTRY(driverName), m_kernelCtx.getConfigurationManager().expand("${SkeletonGenerator_Driver_DriverName}")); + + GtkWidget* className = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_class_name")); + gtk_entry_set_text(GTK_ENTRY(className), m_kernelCtx.getConfigurationManager().expand("${SkeletonGenerator_Driver_ClassName}")); + + GtkWidget* minChannel = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_min_channel")); + gtk_spin_button_set_value( + GTK_SPIN_BUTTON(minChannel), double(m_kernelCtx.getConfigurationManager().expandAsInteger("${SkeletonGenerator_Driver_MinChannel}"))); + + GtkWidget* maxChannel = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_max_channel")); + gtk_spin_button_set_value( + GTK_SPIN_BUTTON(maxChannel), double(m_kernelCtx.getConfigurationManager().expandAsInteger("${SkeletonGenerator_Driver_MaxChannel}"))); + + GtkWidget* sf = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_sampling_frequencies")); + gtk_entry_set_text(GTK_ENTRY(sf), m_kernelCtx.getConfigurationManager().expand("${SkeletonGenerator_Driver_SamplingFrequencies}")); + + GtkWidget* fileChooser = GTK_WIDGET(gtk_builder_get_object(m_builder, "filechooserbutton_target_directory")); + + // if the user specified a target directory, it has full priority + std::string directory = m_kernelCtx.getConfigurationManager().expand("${SkeletonGenerator_TargetDirectory}").toASCIIString(); +#ifdef TARGET_OS_Linux + bool needFilePrefix = false; +#endif + if (!directory.empty()) + { + getLogManager() << Kernel::LogLevel_Debug << "Target dir user [" << directory << "]\n"; +#ifdef TARGET_OS_Linux + needFilePrefix = true; +#endif + } + else + { + //previous entry + directory = m_kernelCtx.getConfigurationManager().expand("${SkeletonGenerator_Driver_TargetDirectory}"); + if (!directory.empty()) + { + getLogManager() << Kernel::LogLevel_Debug << "Target previous [" << directory << "]\n"; +#ifdef TARGET_OS_Linux + needFilePrefix = true; +#endif + } + else + { + //default path = dist + getLogManager() << Kernel::LogLevel_Debug << "Target default [dist]\n"; +#ifdef TARGET_OS_Linux + directory = std::string(gtk_file_chooser_get_current_folder_uri(GTK_FILE_CHOOSER(fileChooser))); + directory = directory + "/.."; +#elif defined TARGET_OS_Windows + directory = ".."; +#endif + } + } +#ifdef TARGET_OS_Linux + if(needFilePrefix) directory = "file://" + directory; + gtk_file_chooser_set_current_folder_uri(GTK_FILE_CHOOSER(fileChooser), directory.c_str()); +#elif defined TARGET_OS_Windows + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(fileChooser), directory.c_str()); +#endif + + getLogManager() << Kernel::LogLevel_Info << "Driver entries from [" << filename << "] loaded.\n"; + return true; +} + +void CDriverSkeletonGenerator::getCurrentParameters() +{ + GtkWidget* driverName = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_driver_name")); + m_DriverName = gtk_entry_get_text(GTK_ENTRY(driverName)); + GtkWidget* className = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_class_name")); + m_ClassName = gtk_entry_get_text(GTK_ENTRY(className)); + GtkWidget* minChannel = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_min_channel")); + m_MinChannel = std::to_string(size_t(gtk_spin_button_get_value(GTK_SPIN_BUTTON(minChannel)))); + GtkWidget* maxChannel = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_max_channel")); + m_MaxChannel = std::to_string(size_t(gtk_spin_button_get_value(GTK_SPIN_BUTTON(maxChannel)))); + GtkWidget* sf = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_sampling_frequencies")); + m_Samplings = gtk_entry_get_text(GTK_ENTRY(sf)); + GtkWidget* fileChooser = GTK_WIDGET(gtk_builder_get_object(m_builder, "filechooserbutton_target_directory")); + char* directory = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fileChooser)); + m_directory = CString(directory); + g_free(directory); +} + +} // namespace SkeletonGenerator +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCDriverSkeletonGenerator.h b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCDriverSkeletonGenerator.h new file mode 100755 index 0000000..2f6dd10 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCDriverSkeletonGenerator.h @@ -0,0 +1,51 @@ +#pragma once + +#include "ovsgCSkeletonGenerator.h" + +#include +#include + +namespace OpenViBE { +namespace SkeletonGenerator { +class CDriverSkeletonGenerator final : public CSkeletonGenerator +{ +public: + + CDriverSkeletonGenerator(Kernel::IKernelContext& ctx, GtkBuilder* builder) : CSkeletonGenerator(ctx, builder) { } + ~CDriverSkeletonGenerator() override { } + + bool initialize() override; + bool save(const std::string& filename) override; + bool load(const std::string& filename) override; + void getCurrentParameters() override; + + std::string m_DriverName; + std::string m_ClassName; + std::string m_Samplings; + std::vector m_SamplingSeparate; + std::string m_MinChannel; + std::string m_MaxChannel; + + void buttonCheckCB(); + void buttonOkCB(); + void buttonTooltipCB(GtkButton* button); + void buttonExitCB(); + +private: + + Kernel::ILogManager& getLogManager() const override { return m_kernelCtx.getLogManager(); } + Kernel::IErrorManager& getErrorManager() const override { return m_kernelCtx.getErrorManager(); } + + enum class EWidgetName + { + DriverName, + ClassName, + ChannelCount, + Sampling, + Directory, + }; + + std::map m_widgetNames; +}; +} // namespace SkeletonGenerator +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCSkeletonGenerator.cpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCSkeletonGenerator.cpp new file mode 100755 index 0000000..3671431 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCSkeletonGenerator.cpp @@ -0,0 +1,249 @@ +#include "ovsgCSkeletonGenerator.h" + +#include +#include +#include +#include +#include +#include + +#include + +namespace OpenViBE { +namespace SkeletonGenerator { + +CSkeletonGenerator::CSkeletonGenerator(Kernel::IKernelContext& ctx, GtkBuilder* builder) + : m_kernelCtx(ctx), m_builder(builder) +{ + m_configFile = m_kernelCtx.getConfigurationManager().expand("${CustomConfigurationApplication}"); + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Configuration file [" << m_configFile << "]\n"; + loadCommonParameters(m_configFile); +} + +void CSkeletonGenerator::getCommonParameters() +{ + //Author and Company + GtkWidget* company = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_company_name")); + m_company = gtk_entry_get_text(GTK_ENTRY(company)); + + GtkWidget* author = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_author_name")); + m_author = gtk_entry_get_text(GTK_ENTRY(author)); +} + +bool CSkeletonGenerator::saveCommonParameters(const std::string& filename) +{ + // we get the latest values + getCommonParameters(); + + std::ofstream file; + file.open(filename, std::ios::app | std::ios::binary); + OV_ERROR_UNLESS_KRF(file.is_open(), "Saving the common entries in [" << filename << "] failed !", Kernel::ErrorType::BadFileRead); + + + // generator selected + std::string active; + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "sg-driver-selection-radio-button")))) { active = "0"; } + else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "sg-algo-selection-radio-button")))) { active = "1"; } + else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "sg-box-selection-radio-button")))) { active = "2"; } + + file << "SkeletonGenerator_GeneratorSelected = " << active << std::endl; + file << "SkeletonGenerator_Common_Author = " << m_author << std::endl; + file << "SkeletonGenerator_Common_Company = " << m_company << std::endl; + file.close(); + getLogManager() << Kernel::LogLevel_Info << "Common entries saved in [" << filename << "]\n"; + + //we can reload the file, it may have changed + m_configFileLoaded = false; + + return true; +} + +bool CSkeletonGenerator::cleanConfigurationFile(const std::string& filename) const +{ + std::ofstream file; + file.open(filename, std::ios::binary); + OV_ERROR_UNLESS_KRF(file.is_open(), "Failed to clean [" << filename << "]", Kernel::ErrorType::BadFileRead); + + getLogManager() << Kernel::LogLevel_Info << "Configuration file [" << filename << "] cleaned.\n"; + file.close(); + return true; +} + +bool CSkeletonGenerator::loadCommonParameters(const std::string& filename) +{ + OV_ERROR_UNLESS_KRF(m_configFileLoaded || m_kernelCtx.getConfigurationManager().addConfigurationFromFile(filename.c_str()), + "Common: Configuration file [" << filename << "] could not be loaded. \n", Kernel::ErrorType::BadFileRead); + + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-driver-selection-radio-button")); + gtk_toggle_button_set_active( + GTK_TOGGLE_BUTTON(widget), (m_kernelCtx.getConfigurationManager().expandAsUInteger("${SkeletonGenerator_GeneratorSelected}") == 0)); + widget = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-algo-selection-radio-button")); + gtk_toggle_button_set_active( + GTK_TOGGLE_BUTTON(widget), (m_kernelCtx.getConfigurationManager().expandAsUInteger("${SkeletonGenerator_GeneratorSelected}") == 1)); + widget = GTK_WIDGET(gtk_builder_get_object(m_builder, "sg-box-selection-radio-button")); + gtk_toggle_button_set_active( + GTK_TOGGLE_BUTTON(widget), (m_kernelCtx.getConfigurationManager().expandAsUInteger("${SkeletonGenerator_GeneratorSelected}") == 2)); + + GtkWidget* company = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_company_name")); + gtk_entry_set_text(GTK_ENTRY(company), m_kernelCtx.getConfigurationManager().expand("${SkeletonGenerator_Common_Company}")); + + GtkWidget* author = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_author_name")); + gtk_entry_set_text(GTK_ENTRY(author), m_kernelCtx.getConfigurationManager().expand("${SkeletonGenerator_Common_Author}")); + + getLogManager() << Kernel::LogLevel_Info << "Common entries from [" << filename << "] loaded.\n"; + + m_configFileLoaded = true; + + return true; +} + +std::string CSkeletonGenerator::ensureSedCompliancy(const std::string& expression) +{ + std::string res(expression); + auto it = res.begin(); + while (it < res.end()) + { + if ((*it) == '\\') + { + it = res.insert(it, '\\'); + ++it; + it = res.insert(it, '\\'); + ++it; + it = res.insert(it, '\\'); + ++it; +#ifdef TARGET_OS_Linux + it = res.insert(it,'\\'); + it = res.insert(it,'\\'); + it+=2; + it = res.insert(it,'\\'); + it = res.insert(it,'\\'); + it+=2; +#endif + } + else if ((*it) == '/') + { + it = res.insert(it, '\\'); + ++it; + } + else if ((*it) == '"') + { + it = res.insert(it, '\\'); + ++it; + it = res.insert(it, '\\'); + ++it; + it = res.insert(it, '\\'); + ++it; + it = res.insert(it, '\\'); + ++it; + it = res.insert(it, '\\'); + ++it; + } + else if ((*it) == '\n') + { + it = res.erase(it); +#ifdef TARGET_OS_Linux + it = res.insert(it,'\\'); + it = res.insert(it,'\\'); + it+=2; +#endif + it = res.insert(it, '\\'); + it = res.insert(it, '\\'); + it += 2; + it = res.insert(it, 'n'); + //++it; + } + ++it; + } + + return res; +} + +bool CSkeletonGenerator::regexReplace(const std::string& src, const std::string& regEx, const std::string& substitute, const std::string& dst) const +{ + try + { + // Read file to memory + std::ifstream in(src); + std::string buffer((std::istreambuf_iterator(in)), std::istreambuf_iterator()); + in.close(); + + // Open output stream and set an iterator to it + std::string realDst((dst.empty() ? src : dst)); + std::ofstream out(realDst); + const std::ostream_iterator it(out); + + // Do regex magic on the iterator + boost::regex exp; + exp.assign(regEx); + + regex_replace(it, buffer.begin(), buffer.end(), exp, substitute, boost::match_default | boost::format_sed); + + out.close(); + } + catch (...) + { + std::cout << "Error occurred processing " << src << " to " << dst << "\n"; + return false; + } + return true; +} + +std::string CSkeletonGenerator::getDate() +{ + time_t raw; + time(&raw); + struct tm* info = localtime(&raw); + std::string res(asctime(info)); + res = res.substr(0, res.size() - 1); // the ascitime ends with a "\n" + return res; +} + +bool CSkeletonGenerator::generate(const std::string& src, const std::string& dst, const std::map& substitutions, + std::string& log) const +{ + // we check if the template file is in place. + if (! g_file_test(src.c_str(), G_FILE_TEST_EXISTS)) + { + log += "[FAILED] the template file '" + src + "' is missing.\n"; + OV_ERROR_KRF("The template file '" << src << "' is missing.", Kernel::ErrorType::BadInput); + } + + // we check the map + if (substitutions.empty()) + { + log += "[WARNING] No substitution provided.\n"; + OV_WARNING_K("No substitution provided."); + return false; + } + + bool success = true; + + log += "[ OK ] -- template file '" + src + "' found.\n"; + getLogManager() << Kernel::LogLevel_Info << " -- template file '" << src << "' found.\n"; + + //we need to create the destination file by copying the template file, then do the first substitution + auto it = substitutions.cbegin(); + success &= regexReplace(src, it->first, ensureSedCompliancy(it->second), dst); + ++it; + + //next substitutions are done on the - incomplete - destination file itself + while (it != substitutions.cend() && success) + { + getLogManager() << Kernel::LogLevel_Trace << "Executing substitution [" << it->first << "] ->[" << it->second << "]\n"; + success &= regexReplace(dst, it->first, ensureSedCompliancy(it->second)); + ++it; + } + + if (!success) + { + log += "[FAILED] -- " + dst + " cannot be written.\n"; + OV_ERROR_KRF(" -- " << dst << " cannot be written.", Kernel::ErrorType::BadFileWrite); + } + + log += "[ OK ] -- " + dst + " written.\n"; + getLogManager() << Kernel::LogLevel_Info << " -- " << dst << " written.\n"; + return true; +} + +} // namespace SkeletonGenerator +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCSkeletonGenerator.h b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCSkeletonGenerator.h new file mode 100755 index 0000000..aa05718 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsgCSkeletonGenerator.h @@ -0,0 +1,62 @@ +#pragma once + +#include +#include +#include +//#include + +#include +#include + +#include + +namespace OpenViBE { +namespace SkeletonGenerator { +class CSkeletonGenerator +{ +public: + + CSkeletonGenerator(Kernel::IKernelContext& ctx, GtkBuilder* builder); + virtual ~CSkeletonGenerator() { } + +protected: + Kernel::IKernelContext& m_kernelCtx; + + GtkBuilder* m_builder = nullptr; + + std::string m_author; + std::string m_company; + std::string m_directory; + std::string m_configFile; // basic application config file + bool m_configFileLoaded = false; + + virtual bool initialize() = 0; + + void getCommonParameters(); + bool saveCommonParameters(const std::string& filename); + bool loadCommonParameters(const std::string& filename); + + bool cleanConfigurationFile(const std::string& filename) const; + + // returns a sed-compliant expression to be parsed in a substitution command + static std::string ensureSedCompliancy(const std::string& expression); + // executes a regex replace and builds a new file, by replacing the matching expressions by the substitute. If no destination file is provided, the template file is modified. + // Note that the input must be a valid sed format regex pattern, the function does not check. + bool regexReplace(const std::string& src, const std::string& regEx, const std::string& substitute, const std::string& dst = std::string("")) const; + + // get the formatted string date + static std::string getDate(); + + // generate a new file, giving a template file, a destination file, and a map ofsubstitutions (Tag,Substitute) + // return false if an error occurred. + bool generate(const std::string& src, const std::string& dst, const std::map& substitutions, std::string& log) const; + + virtual void getCurrentParameters() = 0; + virtual bool save(const std::string& filename) = 0; + virtual bool load(const std::string& filename) = 0; + + virtual Kernel::ILogManager& getLogManager() const { return m_kernelCtx.getLogManager(); } + virtual Kernel::IErrorManager& getErrorManager() const { return m_kernelCtx.getErrorManager(); } +}; +} // namespace SkeletonGenerator +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsg_main.cpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsg_main.cpp new file mode 100755 index 0000000..ce05285 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/skeleton-generator/src/ovsg_main.cpp @@ -0,0 +1,96 @@ +#include +#include + +#include +#include // std::setlocale + +#include "ovsgCDriverSkeletonGenerator.h" +#include "ovsgCBoxAlgorithmSkeletonGenerator.h" + +int main(int argc, char** argv) +{ + OpenViBE::CKernelLoader loader; + + std::cout << "[ INF ] Created kernel loader, trying to load kernel module" << std::endl; + OpenViBE::CString err; +#if defined TARGET_OS_Windows + const OpenViBE::CString file = OpenViBE::Directories::getLibDir() + "/openvibe-kernel.dll"; +#else + const OpenViBE::CString file = OpenViBE::Directories::getLibDir() + "/libopenvibe-kernel.so"; +#endif + if (!loader.load(file, &err)) { std::cout << "[ FAILED ] Error loading kernel (" << err << ")" << " from [" << file << "]\n"; } + else + { + std::cout << "[ INF ] Kernel module loaded, trying to get kernel descriptor" << std::endl; + OpenViBE::Kernel::IKernelDesc* desc = nullptr; + loader.initialize(); + loader.getKernelDesc(desc); + if (!desc) { std::cout << "[ FAILED ] No kernel descriptor" << std::endl; } + else + { + std::cout << "[ INF ] Got kernel descriptor, trying to create kernel" << std::endl; + OpenViBE::Kernel::IKernelContext* ctx = desc->createKernel("skeleton-generator", OpenViBE::Directories::getDataDir() + "/kernel/openvibe.conf"); + if (!ctx || !ctx->initialize()) { std::cout << "[ FAILED ] No kernel created by kernel descriptor" << std::endl; } + else + { + ctx->getConfigurationManager().addConfigurationFromFile(OpenViBE::Directories::getDataDir() + "/kernel/openvibe.conf"); + ctx->getConfigurationManager().addConfigurationFromFile( + OpenViBE::Directories::getDataDir() + "/applications/skeleton-generator/skeleton-generator.conf"); + OpenViBE::Toolkit::initialize(*ctx); + OpenViBE::Kernel::IConfigurationManager& configMgr = ctx->getConfigurationManager(); + ctx->getPluginManager().addPluginsFromFiles(configMgr.expand("${Kernel_Plugins}")); + gtk_init(&argc, &argv); + + // We rely on this with 64bit/gtk 2.24, to roll back gtk_init() sometimes switching + // the locale to one where ',' is needed instead of '.' for separators of floats, + // causing issues, for example getConfigurationManager.expandAsFloat("0.05") -> 0; + // due to implementation by std::stod(). + std::setlocale(LC_ALL, "C"); + + GtkBuilder* builder = gtk_builder_new(); + const OpenViBE::CString filename = OpenViBE::Directories::getDataDir() + "/applications/skeleton-generator/generator-interface.ui"; + + OV_ERROR_UNLESS(gtk_builder_add_from_file(builder, filename.toASCIIString(), nullptr), "Problem loading [" << filename << "]", + OpenViBE::Kernel::ErrorType::BadFileRead, -1, ctx->getErrorManager(), ctx->getLogManager()); + + //gtk_builder_connect_signals(builder, nullptr); + + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(builder, "sg-selection-dialog")); + + gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_OK, GTK_RESPONSE_OK); + gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + + GtkWidget* radioDriver = GTK_WIDGET(gtk_builder_get_object(builder, "sg-driver-selection-radio-button")); + GtkWidget* radioAlgo = GTK_WIDGET(gtk_builder_get_object(builder, "sg-algo-selection-radio-button")); + GtkWidget* radioBox = GTK_WIDGET(gtk_builder_get_object(builder, "sg-box-selection-radio-button")); + + + OpenViBE::SkeletonGenerator::CBoxAlgorithmSkeletonGenerator boxGenerator(*ctx, builder); + OpenViBE::SkeletonGenerator::CDriverSkeletonGenerator driverGenerator(*ctx, builder); + + const gint resp = gtk_dialog_run(GTK_DIALOG(dialog)); + + if (resp == GTK_RESPONSE_OK) + { + gtk_widget_hide(GTK_WIDGET(dialog)); + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioDriver))) { driverGenerator.initialize(); } + OV_ERROR_UNLESS(!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioAlgo)), "NOT YET AVAILABLE.", + OpenViBE::Kernel::ErrorType::Internal, 0, ctx->getErrorManager(), ctx->getLogManager()); + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioBox))) { boxGenerator.initialize(); } + gtk_main(); + } + else + { + std::cout << "User cancelled. Exit." << std::endl; + return 0; + } + } + } + } + + loader.uninitialize(); + loader.unload(); + return 0; +} diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/vrpn-simulator/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/developer-tools/vrpn-simulator/CMakeLists.txt new file mode 100644 index 0000000..be0a386 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/vrpn-simulator/CMakeLists.txt @@ -0,0 +1,62 @@ +IF(OV_DISABLE_GTK) + MESSAGE(STATUS "Skipping VRPN Simulator, no GTK") + RETURN() +ENDIF(OV_DISABLE_GTK) + +PROJECT(openvibe-vrpn-simulator) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +INCLUDE("FindThirdPartyVRPN_Check") +IF(NOT PATH_VRPN) + MESSAGE(STATUS " --> Not building ${PROJECT_NAME}") + RETURN() +ENDIF(NOT PATH_VRPN) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindThirdPartyGTK") +INCLUDE("FindThirdPartyVRPN") + +# --------------------------------- +# Finds standard library pthread +# Adds library to target +# Adds include path +# --------------------------------- +IF(UNIX) + FIND_LIBRARY(LIB_STANDARD_MODULE_PTHREAD pthread) + IF(LIB_STANDARD_MODULE_PTHREAD) + MESSAGE(STATUS " Found pthread...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_PTHREAD}) + ELSE(LIB_STANDARD_MODULE_PTHREAD) + MESSAGE(STATUS " FAILED to find pthread...") + ENDIF(LIB_STANDARD_MODULE_PTHREAD) +ENDIF(UNIX) + +# --------------------------------- + + + + +# --------------------------------- + + +# ---------------------- +# Generate launch script +# ---------------------- +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/applications/vrpn-simulator) diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/vrpn-simulator/share/interface.ui b/Masterarbeit/openvibe/extras-master/applications/developer-tools/vrpn-simulator/share/interface.ui new file mode 100644 index 0000000..ca17683 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/vrpn-simulator/share/interface.ui @@ -0,0 +1,293 @@ + + + + + + -100 + 100 + 0.01 + 1 + + + -100 + 100 + 0.01 + 1 + + + -100 + 100 + 0.01 + 1 + + + -100 + 100 + 0.01 + 1 + + + -100 + 100 + 0.01 + 1 + + + -100 + 100 + 0.01 + 1 + + + -100 + 100 + 0.01 + 1 + + + -100 + 100 + 0.01 + 1 + + + + + True + + + True + + + 256 + True + True + adjustment1 + True + + + 0 + + + + + True + True + adjustment2 + True + + + 1 + + + + + True + True + adjustment3 + True + + + 2 + + + + + True + True + adjustment4 + True + + + 3 + + + + + True + True + adjustment5 + True + + + 4 + + + + + True + True + adjustment6 + True + + + 5 + + + + + True + True + adjustment7 + True + + + 6 + + + + + True + True + adjustment8 + True + + + 7 + + + + + 0 + + + + + True + + + True + True + True + + + True + gtk-about + + + + + 0 + + + + + True + True + True + + + True + gtk-about + + + + + 1 + + + + + True + True + True + + + True + gtk-about + + + + + 2 + + + + + True + True + True + + + True + gtk-about + + + + + 3 + + + + + True + True + True + + + True + gtk-about + + + + + 4 + + + + + True + True + True + + + True + gtk-about + + + + + 5 + + + + + True + True + True + + + True + gtk-about + + + + + 6 + + + + + True + True + True + + + True + gtk-about + + + + + 7 + + + + + 1 + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/vrpn-simulator/src/ova_main.cpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/vrpn-simulator/src/ova_main.cpp new file mode 100644 index 0000000..8734190 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/vrpn-simulator/src/ova_main.cpp @@ -0,0 +1,136 @@ +#if defined TARGET_HAS_ThirdPartyVRPN + +#include // std::setlocale + +#include +#include + +#include +#include + +#include +#include +#include + +#include + +#define _vrpn_peripheral_name_ "openvibe-vrpn@localhost" + +// #define _DEBUG + +vrpn_Connection* connection = nullptr; +vrpn_Button_Server* buttonServer = nullptr; +vrpn_Analog_Server* analogServer = nullptr; +long nAnalog = 0; +long nButton = 0; + +typedef union +{ + gpointer data; + int idx; +} user_data_t; + +void fScrollCB(GtkRange* range, gpointer data) +{ + user_data_t userData; + userData.data = data; + const gdouble value = gtk_range_get_value(range); + analogServer->channels()[userData.idx] = value; + +#if defined _DEBUG + std::cout << "Channel " << int(data) << " value changed to " << value << "\n"; +#endif +} + +void fSwitchCB(GtkToggleButton* button, gpointer data) +{ + user_data_t userData; + userData.data = data; + const gboolean value = gtk_toggle_button_get_active(button); + buttonServer->set_button(userData.idx, value); + +#if defined _DEBUG + std::cout << "Channel " << userData.idx << " toggled to " << value << "\n"; +#endif +} + +void fConnectCB(GtkWidget* widget, gpointer /*data*/) +{ + if (GTK_IS_RANGE(widget)) + { + g_signal_connect(G_OBJECT(widget), "value-changed", G_CALLBACK(fScrollCB), gpointer(nAnalog)); + nAnalog++; + } + + if (GTK_IS_TOGGLE_BUTTON(widget)) + { + g_signal_connect(G_OBJECT(widget), "toggled", G_CALLBACK(fSwitchCB), reinterpret_cast(nButton)); + nButton++; + } +} + +gboolean fIdleApplicationLoop(gpointer /*data*/) +{ + buttonServer->mainloop(); + analogServer->report_changes(); + analogServer->mainloop(); + connection->mainloop(); + return TRUE; +} + +#endif // TARGET_HAS_ThirdPartyVRPN + +int main(int argc, char** argv) +{ +#if defined TARGET_HAS_ThirdPartyVRPN + const int nChannels = 8; + + gtk_init(&argc, &argv); + + // We rely on this with 64bit/gtk 2.24, to roll back gtk_init() sometimes switching + // the locale to one where ',' is needed instead of '.' for separators of floats, + // causing issues, for example getConfigurationManager.expandAsFloat("0.05") -> 0; + // due to implementation by std::stod(). + std::setlocale(LC_ALL, "C"); + + // g_pConnection=new ::vrpn_Connection; + connection = vrpn_create_server_connection(); + buttonServer = new vrpn_Button_Server(_vrpn_peripheral_name_, connection, nChannels); + analogServer = new vrpn_Analog_Server(_vrpn_peripheral_name_, connection, nChannels); + + GtkBuilder* builder = + gtk_builder_new(); // glade_xml_new(OpenViBE::Directories::getDataDir() + "/applications/vrpn-simulator/interface.ui", "window", nullptr); + const OpenViBE::CString filename = OpenViBE::Directories::getDataDir() + "/applications/vrpn-simulator/interface.ui"; + if (!gtk_builder_add_from_file(builder, filename, nullptr)) + { + std::cout << "Problem loading [" << filename << "]\n"; + return -1; + } + + GtkWidget* mainWindow = GTK_WIDGET(gtk_builder_get_object(builder, "window")); + GtkWidget* hBoxButton = GTK_WIDGET(gtk_builder_get_object(builder, "hbox_button")); + GtkWidget* hBoxAnalog = GTK_WIDGET(gtk_builder_get_object(builder, "hbox_analog")); + + g_signal_connect(G_OBJECT(mainWindow), "destroy", gtk_main_quit, nullptr); + gtk_container_foreach(GTK_CONTAINER(hBoxButton), fConnectCB, nullptr); + gtk_container_foreach(GTK_CONTAINER(hBoxAnalog), fConnectCB, nullptr); + gtk_builder_connect_signals(builder, nullptr); + + std::cout << "VRPN Stimulator\n"; + std::cout << "Got " << nAnalog << " analogs...\n"; + std::cout << "Got " << nButton << " buttons...\n"; + std::cout << "Using " << nChannels << " VRPN channels...\n"; + std::cout << "Signals will be sent to peripheral [" << _vrpn_peripheral_name_ << "]\n"; + + g_idle_add(fIdleApplicationLoop, nullptr); + + gtk_widget_show(mainWindow); + gtk_main(); + + delete analogServer; + delete buttonServer; + delete connection; + +#endif // TARGET_HAS_ThirdPartyVRPN + return 0; +} diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/xml-configuration-comparison/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/developer-tools/xml-configuration-comparison/CMakeLists.txt new file mode 100644 index 0000000..73cfd5a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/xml-configuration-comparison/CMakeLists.txt @@ -0,0 +1,21 @@ +PROJECT(xml-configuration-comparison) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES *.cpp *.hpp) +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +# ---------------------- +# Generate launch script +# ---------------------- +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/xml-configuration-comparison/main.cpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/xml-configuration-comparison/main.cpp new file mode 100644 index 0000000..1a15ad7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/xml-configuration-comparison/main.cpp @@ -0,0 +1,104 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \brief Classes of the Box Features Selection Trainer. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 14/02/2020. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#include +#include +#include +#include "tinyxml2.h" +#include + +// validation Test take in the algorithm output file, the expected output file (reference) and a tolerance threshold +bool comparison(const char* file1, const char* file2, bool removeSpace) +{ + // Load Files + tinyxml2::XMLDocument xmlDoc1, xmlDoc2; + if (xmlDoc1.LoadFile(file1) != 0) // Check File 1 Exist and Loading + { + std::cerr << "Error during loading File." << std::endl; + return false; + } + if (xmlDoc2.LoadFile(file2) != 0) // Check File 2 Exist and Loading + { + std::cerr << "Error during loading Reference." << std::endl; + return false; + } + + // Load Roots + tinyxml2::XMLNode *root1 = xmlDoc1.FirstChild(), *root2 = xmlDoc2.FirstChild(); // Get Root Node + if (root1 == nullptr) // Check Root Node Exist + { + std::cerr << "File format not compatible." << std::endl; + return false; + } + if (root2 == nullptr) // Check Root Node Exist + { + std::cerr << "Reference format not compatible." << std::endl; + return false; + } + + // Count Settings + size_t n1 = 0, n2 = 0; + for (tinyxml2::XMLElement* e = root1->FirstChildElement(); e != nullptr; e = e->NextSiblingElement()) { n1++; } + for (tinyxml2::XMLElement* e = root2->FirstChildElement(); e != nullptr; e = e->NextSiblingElement()) { n2++; } + if (n1 != n2) + { + std::cerr << "File and Reference are not same number of features." << std::endl; + return false; + } + + // Load settings + tinyxml2::XMLElement *e1 = root1->FirstChildElement(), *e2 = root2->FirstChildElement(); + for (size_t i = 0; i < n1; ++i, e1 = e1->NextSiblingElement(), e2 = e2->NextSiblingElement()) + { + std::string s1(e1->GetText()), s2(e2->GetText()); + std::cout << s1 << std::endl << s2 << std::endl; + if (removeSpace) + { + s1.erase(std::remove_if(s1.begin(), s1.end(), [](const unsigned char x) { return std::isspace(x); }), s1.end()); + s2.erase(std::remove_if(s2.begin(), s2.end(), [](const unsigned char x) { return std::isspace(x); }), s2.end()); + } + std::cout << s1 << std::endl << s2 << std::endl; + + if (s1 != s2) + { + std::cerr << "Setting number " << i << " is different, For File : \n" << s1 << "\nfor Reference : \n" << s2 << std::endl; + return false; + } + } + + return true; +} + +int main(const int argc, char* argv[]) +{ + if (argc != 4) + { + std::cout << "Usage: " << argv[0] << " \n"; + return -1; + } + + bool remove; + if (strcmp(argv[3], "true") == 0) { remove = true; } + else if (strcmp(argv[3], "false") == 0) { remove = false; } + else + { + std::cout << "Usage: must be true or false not " << argv[3] << std::endl; + return -1; + } + + if (!comparison(argv[1], argv[2], remove)) + { + std::cout << "Algorithm failed validation test \n" << std::endl; + return 1; + } + + std::cout << "Test passed\n" << std::endl; + return 0; +} diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/xml-configuration-comparison/tinyxml2.cpp b/Masterarbeit/openvibe/extras-master/applications/developer-tools/xml-configuration-comparison/tinyxml2.cpp new file mode 100644 index 0000000..c304fb5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/xml-configuration-comparison/tinyxml2.cpp @@ -0,0 +1,2557 @@ +/* +Original code by Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#include "tinyxml2.h" + +#include // yes, this one new style header, is in the Android SDK. +#if defined(ANDROID_NDK) || defined(__BORLANDC__) || defined(__QNXNTO__) +# include +# include +#else +# include +# include +#endif + +#if defined(_MSC_VER) && (_MSC_VER >= 1400 ) && (!defined WINCE) +// Microsoft Visual Studio, version 2005 and higher. Not WinCE. +/*int _snprintf_s(char *buffer, size_t sizeOfBuffer, size_t count, const char *format [, argument] ... );*/ +static int TIXML_SNPRINTF(char* buffer, const size_t size, const char* format, ...) +{ + va_list va; + va_start(va, format); + const int result = vsnprintf_s(buffer, size, _TRUNCATE, format, va); + va_end(va); + return result; +} + +static int TIXML_VSNPRINTF(char* buffer, const size_t size, const char* format, va_list va) +{ + const int result = vsnprintf_s(buffer, size, _TRUNCATE, format, va); + return result; +} + +#define TIXML_VSCPRINTF _vscprintf +#define TIXML_SSCANF sscanf_s +#elif defined _MSC_VER +// Microsoft Visual Studio 2003 and earlier or WinCE +#define TIXML_SNPRINTF _snprintf +#define TIXML_VSNPRINTF _vsnprintf +#define TIXML_SSCANF sscanf +#if (_MSC_VER < 1400 ) && (!defined WINCE) + // Microsoft Visual Studio 2003 and not WinCE. +#define TIXML_VSCPRINTF _vscprintf // VS2003's C runtime has this, but VC6 C runtime or WinCE SDK doesn't have. +#else + // Microsoft Visual Studio 2003 and earlier or WinCE. +static inline int TIXML_VSCPRINTF(const char* format, va_list va) +{ + int len = 512; + for (;;) { + len = len * 2; + char* str = new char[len](); + const int required = _vsnprintf(str, len, format, va); + delete[] str; + if (required != -1) { + TIXMLASSERT(required >= 0); + len = required; + break; + } + } + TIXMLASSERT(len >= 0); + return len; +} +#endif +#else +// GCC version 3 and higher +//#warning( "Using sn* functions." ) +#define TIXML_SNPRINTF snprintf +#define TIXML_VSNPRINTF vsnprintf +static inline int TIXML_VSCPRINTF(const char* format, va_list va) +{ + int len = vsnprintf(0, 0, format, va); + TIXMLASSERT(len >= 0); + return len; +} +#define TIXML_SSCANF sscanf +#endif + + +static const char LINE_FEED = char(0x0a); // all line endings are normalized to LF +static const char LF = LINE_FEED; +static const char CARRIAGE_RETURN = char(0x0d); // CR gets filtered out +static const char CR = CARRIAGE_RETURN; +static const char SINGLE_QUOTE = '\''; +static const char DOUBLE_QUOTE = '\"'; + +// Bunch of unicode info at: +// http://www.unicode.org/faq/utf_bom.html +// ef bb bf (Microsoft "lead bytes") - designates UTF-8 + +static const unsigned char TIXML_UTF_LEAD_0 = 0xefU; +static const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; +static const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; + +namespace tinyxml2 { +struct Entity +{ + const char* pattern; + int length; + char value; +}; + +static const int NUM_ENTITIES = 5; +static const Entity ENTITIES[NUM_ENTITIES] = { + { "quot", 4, DOUBLE_QUOTE }, + { "amp", 3, '&' }, + { "apos", 4, SINGLE_QUOTE }, + { "lt", 2, '<' }, + { "gt", 2, '>' } +}; + + +StrPair::~StrPair() { Reset(); } + + +void StrPair::TransferTo(StrPair* other) +{ + if (this == other) { return; } + // This in effect implements the assignment operator by "moving" + // ownership (as in auto_ptr). + + TIXMLASSERT(other != nullptr); + TIXMLASSERT(other->_flags == 0); + TIXMLASSERT(other->_start == nullptr); + TIXMLASSERT(other->_end == nullptr); + + other->Reset(); + + other->_flags = _flags; + other->_start = _start; + other->_end = _end; + + _flags = 0; + _start = nullptr; + _end = nullptr; +} + + +void StrPair::Reset() +{ + if (_flags & NEEDS_DELETE) { delete[] _start; } + _flags = 0; + _start = nullptr; + _end = nullptr; +} + + +void StrPair::SetStr(const char* str, const int flags) +{ + TIXMLASSERT(str); + Reset(); + const size_t len = strlen(str); + TIXMLASSERT(_start == nullptr); + _start = new char[len + 1]; + memcpy(_start, str, len + 1); + _end = _start + len; + _flags = flags | NEEDS_DELETE; +} + + +char* StrPair::ParseText(char* in, const char* endTag, const int strFlags, int* curLineNumPtr) +{ + TIXMLASSERT(in); + TIXMLASSERT(endTag && *endTag); + TIXMLASSERT(curLineNumPtr); + + char* start = in; + const char endChar = *endTag; + const size_t length = strlen(endTag); + + // Inner loop of text parsing. + while (*in) + { + if (*in == endChar && strncmp(in, endTag, length) == 0) + { + Set(start, in, strFlags); + return in + length; + } + if (*in == '\n') { ++(*curLineNumPtr); } + ++in; + TIXMLASSERT(in); + } + return nullptr; +} + + +char* StrPair::ParseName(char* in) +{ + if (!in || !(*in) || !XMLUtil::IsNameStartChar(*in)) { return nullptr; } + + char* const start = in; + ++in; + while (*in && XMLUtil::IsNameChar(*in)) { ++in; } + + Set(start, in, 0); + return in; +} + + +void StrPair::CollapseWhitespace() +{ + // Adjusting _start would cause undefined behavior on delete[] + TIXMLASSERT((_flags & NEEDS_DELETE) == 0); + // Trim leading space. + _start = XMLUtil::SkipWhiteSpace(_start, nullptr); + + if (*_start) + { + const char* p = _start; // the read pointer + char* q = _start; // the write pointer + + while (*p) + { + if (XMLUtil::IsWhiteSpace(*p)) + { + p = XMLUtil::SkipWhiteSpace(p, nullptr); + if (*p == 0) + { + break; // don't write to q; this trims the trailing space. + } + *q = ' '; + ++q; + } + *q = *p; + ++q; + ++p; + } + *q = 0; + } +} + + +const char* StrPair::GetStr() +{ + TIXMLASSERT(_start); + TIXMLASSERT(_end); + if (_flags & NEEDS_FLUSH) + { + *_end = 0; + _flags ^= NEEDS_FLUSH; + + if (_flags) + { + const char* p = _start; // the read pointer + char* q = _start; // the write pointer + + while (p < _end) + { + if ((_flags & NEEDS_NEWLINE_NORMALIZATION) && *p == CR) + { + // CR-LF pair becomes LF + // CR alone becomes LF + // LF-CR becomes LF + if (*(p + 1) == LF) { p += 2; } + else { ++p; } + *q = LF; + ++q; + } + else if ((_flags & NEEDS_NEWLINE_NORMALIZATION) && *p == LF) + { + if (*(p + 1) == CR) { p += 2; } + else { ++p; } + *q = LF; + ++q; + } + else if ((_flags & NEEDS_ENTITY_PROCESSING) && *p == '&') + { + // Entities handled by tinyXML2: + // - special entities in the entity table [in/out] + // - numeric character reference [in] + // 中 or 中 + + if (*(p + 1) == '#') + { + const int buflen = 10; + char buf[buflen] = { 0 }; + int len = 0; + char* adjusted = const_cast(XMLUtil::GetCharacterRef(p, buf, &len)); + if (adjusted == nullptr) + { + *q = *p; + ++p; + ++q; + } + else + { + TIXMLASSERT(0 <= len && len <= buflen); + TIXMLASSERT(q + len <= adjusted); + p = adjusted; + memcpy(q, buf, len); + q += len; + } + } + else + { + bool entityFound = false; + for (int i = 0; i < NUM_ENTITIES; ++i) + { + const Entity& entity = ENTITIES[i]; + if (strncmp(p + 1, entity.pattern, entity.length) == 0 + && *(p + entity.length + 1) == ';') + { + // Found an entity - convert. + *q = entity.value; + ++q; + p += entity.length + 2; + entityFound = true; + break; + } + } + if (!entityFound) + { + // fixme: treat as error? + ++p; + ++q; + } + } + } + else + { + *q = *p; + ++p; + ++q; + } + } + *q = 0; + } + // The loop below has plenty going on, and this + // is a less useful mode. Break it out. + if (_flags & NEEDS_WHITESPACE_COLLAPSING) { CollapseWhitespace(); } + _flags = (_flags & NEEDS_DELETE); + } + TIXMLASSERT(_start); + return _start; +} + + +// --------- XMLUtil ----------- // + +const char* XMLUtil::writeBoolTrue = "true"; +const char* XMLUtil::writeBoolFalse = "false"; + +void XMLUtil::SetBoolSerialization(const char* writeTrue, const char* writeFalse) +{ + static const char* defTrue = "true"; + static const char* defFalse = "false"; + + writeBoolTrue = (writeTrue) ? writeTrue : defTrue; + writeBoolFalse = (writeFalse) ? writeFalse : defFalse; +} + + +const char* XMLUtil::ReadBOM(const char* p, bool* bom) +{ + TIXMLASSERT(p); + TIXMLASSERT(bom); + *bom = false; + const unsigned char* pu = reinterpret_cast(p); + // Check for BOM: + if (*(pu + 0) == TIXML_UTF_LEAD_0 + && *(pu + 1) == TIXML_UTF_LEAD_1 + && *(pu + 2) == TIXML_UTF_LEAD_2) + { + *bom = true; + p += 3; + } + TIXMLASSERT(p); + return p; +} + + +void XMLUtil::ConvertUTF32ToUTF8(unsigned long input, char* output, int* length) +{ + const unsigned long BYTE_MASK = 0xBF; + const unsigned long BYTE_MARK = 0x80; + const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + + if (input < 0x80) { *length = 1; } + else if (input < 0x800) { *length = 2; } + else if (input < 0x10000) { *length = 3; } + else if (input < 0x200000) { *length = 4; } + else + { + *length = 0; // This code won't convert this correctly anyway. + return; + } + + output += *length; + + // Scary scary fall throughs are annotated with carefully designed comments + // to suppress compiler warnings such as -Wimplicit-fallthrough in gcc + switch (*length) + { + case 4: + --output; + *output = char((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + //fall through + case 3: + --output; + *output = char((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + //fall through + case 2: + --output; + *output = char((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + //fall through + case 1: + --output; + *output = char(input | FIRST_BYTE_MARK[*length]); + break; + default: + TIXMLASSERT(false); + } +} + + +const char* XMLUtil::GetCharacterRef(const char* p, char* value, int* length) +{ + // Presume an entity, and pull it out. + *length = 0; + + if (*(p + 1) == '#' && *(p + 2)) + { + unsigned long ucs = 0; + TIXMLASSERT(sizeof(ucs) >= 4); + ptrdiff_t delta; + unsigned mult = 1; + static const char SEMICOLON = ';'; + + if (*(p + 2) == 'x') + { + // Hexadecimal. + const char* q = p + 3; + if (!(*q)) { return nullptr; } + + q = strchr(q, SEMICOLON); + + if (!q) { return nullptr; } + TIXMLASSERT(*q == SEMICOLON); + + delta = q - p; + --q; + + while (*q != 'x') + { + unsigned int digit; + if (*q >= '0' && *q <= '9') { digit = *q - '0'; } + else if (*q >= 'a' && *q <= 'f') { digit = *q - 'a' + 10; } + else if (*q >= 'A' && *q <= 'F') { digit = *q - 'A' + 10; } + else { return nullptr; } + TIXMLASSERT(digit < 16); + TIXMLASSERT(digit == 0 || mult <= UINT_MAX / digit); + const unsigned int digitScaled = mult * digit; + TIXMLASSERT(ucs <= ULONG_MAX - digitScaled); + ucs += digitScaled; + TIXMLASSERT(mult <= UINT_MAX / 16); + mult *= 16; + --q; + } + } + else + { + // Decimal. + const char* q = p + 2; + if (!(*q)) { return nullptr; } + + q = strchr(q, SEMICOLON); + + if (!q) { return nullptr; } + TIXMLASSERT(*q == SEMICOLON); + + delta = q - p; + --q; + + while (*q != '#') + { + if (*q >= '0' && *q <= '9') + { + const unsigned int digit = *q - '0'; + TIXMLASSERT(digit < 10); + TIXMLASSERT(digit == 0 || mult <= UINT_MAX / digit); + const unsigned int digitScaled = mult * digit; + TIXMLASSERT(ucs <= ULONG_MAX - digitScaled); + ucs += digitScaled; + } + else { return nullptr; } + TIXMLASSERT(mult <= UINT_MAX / 10); + mult *= 10; + --q; + } + } + // convert the UCS to UTF-8 + ConvertUTF32ToUTF8(ucs, value, length); + return p + delta + 1; + } + return p + 1; +} + + +void XMLUtil::ToStr(const int value, char* buffer, const int size) { TIXML_SNPRINTF(buffer, size, "%d", value); } + +void XMLUtil::ToStr(const unsigned value, char* buffer, const int size) { TIXML_SNPRINTF(buffer, size, "%u", value); } + +void XMLUtil::ToStr(const bool value, char* buffer, const int size) { TIXML_SNPRINTF(buffer, size, "%s", value ? writeBoolTrue : writeBoolFalse); } + +/* + ToStr() of a number is a very tricky topic. + https://github.com/leethomason/tinyxml2/issues/106 +*/ +void XMLUtil::ToStr(const float value, char* buffer, const int size) { TIXML_SNPRINTF(buffer, size, "%.8g", value); } + + +void XMLUtil::ToStr(const double value, char* buffer, const int size) { TIXML_SNPRINTF(buffer, size, "%.17g", value); } + + +void XMLUtil::ToStr(const int64_t value, char* buffer, const int size) +{ + // horrible syntax trick to make the compiler happy about %lld + TIXML_SNPRINTF(buffer, size, "%lld", static_cast(value)); +} + + +bool XMLUtil::ToInt(const char* str, int* value) +{ + if (TIXML_SSCANF(str, "%d", value) == 1) { return true; } + return false; +} + +bool XMLUtil::ToUnsigned(const char* str, unsigned* value) +{ + if (TIXML_SSCANF(str, "%u", value) == 1) { return true; } + return false; +} + +bool XMLUtil::ToBool(const char* str, bool* value) +{ + int ival = 0; + if (ToInt(str, &ival)) + { + *value = ival != 0; + return true; + } + if (StringEqual(str, "true")) + { + *value = true; + return true; + } + if (StringEqual(str, "false")) + { + *value = false; + return true; + } + return false; +} + + +bool XMLUtil::ToFloat(const char* str, float* value) +{ + if (TIXML_SSCANF(str, "%f", value) == 1) { return true; } + return false; +} + + +bool XMLUtil::ToDouble(const char* str, double* value) +{ + if (TIXML_SSCANF(str, "%lf", value) == 1) { return true; } + return false; +} + + +bool XMLUtil::ToInt64(const char* str, int64_t* value) +{ + long long v = 0; // horrible syntax trick to make the compiler happy about %lld + if (TIXML_SSCANF(str, "%lld", &v) == 1) + { + *value = int64_t(v); + return true; + } + return false; +} + + +char* XMLDocument::Identify(char* p, XMLNode** node) +{ + TIXMLASSERT(node); + TIXMLASSERT(p); + char* const start = p; + int const startLine = _parseCurLineNum; + p = XMLUtil::SkipWhiteSpace(p, &_parseCurLineNum); + if (!*p) + { + *node = nullptr; + TIXMLASSERT(p); + return p; + } + + // These strings define the matching patterns: + static const char* xmlHeader = { "(_commentPool); + returnNode->_parseLineNum = _parseCurLineNum; + p += xmlHeaderLen; + } + else if (XMLUtil::StringEqual(p, commentHeader, commentHeaderLen)) + { + returnNode = CreateUnlinkedNode(_commentPool); + returnNode->_parseLineNum = _parseCurLineNum; + p += commentHeaderLen; + } + else if (XMLUtil::StringEqual(p, cdataHeader, cdataHeaderLen)) + { + XMLText* text = CreateUnlinkedNode(_textPool); + returnNode = text; + returnNode->_parseLineNum = _parseCurLineNum; + p += cdataHeaderLen; + text->SetCData(true); + } + else if (XMLUtil::StringEqual(p, dtdHeader, dtdHeaderLen)) + { + returnNode = CreateUnlinkedNode(_commentPool); + returnNode->_parseLineNum = _parseCurLineNum; + p += dtdHeaderLen; + } + else if (XMLUtil::StringEqual(p, elementHeader, elementHeaderLen)) + { + returnNode = CreateUnlinkedNode(_elementPool); + returnNode->_parseLineNum = _parseCurLineNum; + p += elementHeaderLen; + } + else + { + returnNode = CreateUnlinkedNode(_textPool); + returnNode->_parseLineNum = _parseCurLineNum; // Report line of first non-whitespace character + p = start; // Back it up, all the text counts. + _parseCurLineNum = startLine; + } + + TIXMLASSERT(returnNode); + TIXMLASSERT(p); + *node = returnNode; + return p; +} + + +bool XMLDocument::Accept(XMLVisitor* visitor) const +{ + TIXMLASSERT(visitor); + if (visitor->VisitEnter(*this)) { for (const XMLNode* node = FirstChild(); node; node = node->NextSibling()) { if (!node->Accept(visitor)) { break; } } } + return visitor->VisitExit(*this); +} + + +// --------- XMLNode ----------- // + +XMLNode::XMLNode(XMLDocument* doc) : _document(doc), + _memPool(nullptr) { } + + +XMLNode::~XMLNode() +{ + DeleteChildren(); + if (_parent) { _parent->Unlink(this); } +} + +const char* XMLNode::Value() const +{ + // Edge case: XMLDocuments don't have a Value. Return null. + if (this->ToDocument()) { return nullptr; } + return _value.GetStr(); +} + +void XMLNode::SetValue(const char* val, const bool staticMem) +{ + if (staticMem) { _value.SetInternedStr(val); } + else { _value.SetStr(val); } +} + +XMLNode* XMLNode::DeepClone(XMLDocument* target) const +{ + XMLNode* clone = this->ShallowClone(target); + if (!clone) { return nullptr; } + + for (const XMLNode* child = this->FirstChild(); child; child = child->NextSibling()) + { + XMLNode* childClone = child->DeepClone(target); + TIXMLASSERT(childClone); + clone->InsertEndChild(childClone); + } + return clone; +} + +void XMLNode::DeleteChildren() +{ + while (_firstChild) + { + TIXMLASSERT(_lastChild); + DeleteChild(_firstChild); + } + _firstChild = _lastChild = nullptr; +} + + +void XMLNode::Unlink(XMLNode* child) +{ + TIXMLASSERT(child); + TIXMLASSERT(child->_document == _document); + TIXMLASSERT(child->_parent == this); + if (child == _firstChild) { _firstChild = _firstChild->_next; } + if (child == _lastChild) { _lastChild = _lastChild->_prev; } + + if (child->_prev) { child->_prev->_next = child->_next; } + if (child->_next) { child->_next->_prev = child->_prev; } + child->_next = nullptr; + child->_prev = nullptr; + child->_parent = nullptr; +} + + +void XMLNode::DeleteChild(XMLNode* node) +{ + TIXMLASSERT(node); + TIXMLASSERT(node->_document == _document); + TIXMLASSERT(node->_parent == this); + Unlink(node); + TIXMLASSERT(node->_prev == nullptr); + TIXMLASSERT(node->_next == nullptr); + TIXMLASSERT(node->_parent == nullptr); + DeleteNode(node); +} + + +XMLNode* XMLNode::InsertEndChild(XMLNode* addThis) +{ + TIXMLASSERT(addThis); + if (addThis->_document != _document) + { + TIXMLASSERT(false); + return nullptr; + } + InsertChildPreamble(addThis); + + if (_lastChild) + { + TIXMLASSERT(_firstChild); + TIXMLASSERT(_lastChild->_next == nullptr); + _lastChild->_next = addThis; + addThis->_prev = _lastChild; + _lastChild = addThis; + + addThis->_next = nullptr; + } + else + { + TIXMLASSERT(_firstChild == nullptr); + _firstChild = _lastChild = addThis; + + addThis->_prev = nullptr; + addThis->_next = nullptr; + } + addThis->_parent = this; + return addThis; +} + + +XMLNode* XMLNode::InsertFirstChild(XMLNode* addThis) +{ + TIXMLASSERT(addThis); + if (addThis->_document != _document) + { + TIXMLASSERT(false); + return nullptr; + } + InsertChildPreamble(addThis); + + if (_firstChild) + { + TIXMLASSERT(_lastChild); + TIXMLASSERT(_firstChild->_prev == nullptr); + + _firstChild->_prev = addThis; + addThis->_next = _firstChild; + _firstChild = addThis; + + addThis->_prev = nullptr; + } + else + { + TIXMLASSERT(_lastChild == nullptr); + _firstChild = _lastChild = addThis; + + addThis->_prev = nullptr; + addThis->_next = nullptr; + } + addThis->_parent = this; + return addThis; +} + + +XMLNode* XMLNode::InsertAfterChild(XMLNode* afterThis, XMLNode* addThis) +{ + TIXMLASSERT(addThis); + if (addThis->_document != _document) + { + TIXMLASSERT(false); + return nullptr; + } + + TIXMLASSERT(afterThis); + + if (afterThis->_parent != this) + { + TIXMLASSERT(false); + return nullptr; + } + if (afterThis == addThis) + { + // Current state: BeforeThis -> AddThis -> OneAfterAddThis + // Now AddThis must disappear from it's location and then + // reappear between BeforeThis and OneAfterAddThis. + // So just leave it where it is. + return addThis; + } + + if (afterThis->_next == nullptr) + { + // The last node or the only node. + return InsertEndChild(addThis); + } + InsertChildPreamble(addThis); + addThis->_prev = afterThis; + addThis->_next = afterThis->_next; + afterThis->_next->_prev = addThis; + afterThis->_next = addThis; + addThis->_parent = this; + return addThis; +} + + +const XMLElement* XMLNode::FirstChildElement(const char* name) const +{ + for (const XMLNode* node = _firstChild; node; node = node->_next) + { + const XMLElement* element = node->ToElementWithName(name); + if (element) { return element; } + } + return nullptr; +} + + +const XMLElement* XMLNode::LastChildElement(const char* name) const +{ + for (const XMLNode* node = _lastChild; node; node = node->_prev) + { + const XMLElement* element = node->ToElementWithName(name); + if (element) { return element; } + } + return nullptr; +} + + +const XMLElement* XMLNode::NextSiblingElement(const char* name) const +{ + for (const XMLNode* node = _next; node; node = node->_next) + { + const XMLElement* element = node->ToElementWithName(name); + if (element) { return element; } + } + return nullptr; +} + + +const XMLElement* XMLNode::PreviousSiblingElement(const char* name) const +{ + for (const XMLNode* node = _prev; node; node = node->_prev) + { + const XMLElement* element = node->ToElementWithName(name); + if (element) { return element; } + } + return nullptr; +} + + +char* XMLNode::ParseDeep(char* p, StrPair* parentEndTag, int* curLineNumPtr) +{ + // This is a recursive method, but thinking about it "at the current level" + // it is a pretty simple flat list: + // + // + // + // With a special case: + // + // + // + // + // Where the closing element (/foo) *must* be the next thing after the opening + // element, and the names must match. BUT the tricky bit is that the closing + // element will be read by the child. + // + // 'endTag' is the end tag for this node, it is returned by a call to a child. + // 'parentEnd' is the end tag for the parent, which is filled in and returned. + + XMLDocument::DepthTracker tracker(_document); + if (_document->Error()) { return nullptr; } + + while (p && *p) + { + XMLNode* node = nullptr; + + p = _document->Identify(p, &node); + TIXMLASSERT(p); + if (node == nullptr) { break; } + + const int initialLineNum = node->_parseLineNum; + + StrPair endTag; + p = node->ParseDeep(p, &endTag, curLineNumPtr); + if (!p) + { + DeleteNode(node); + if (!_document->Error()) { _document->SetError(XML_ERROR_PARSING, initialLineNum, nullptr); } + break; + } + + XMLDeclaration* decl = node->ToDeclaration(); + if (decl) + { + // Declarations are only allowed at document level + // + // Multiple declarations are allowed but all declarations + // must occur before anything else. + // + // Optimized due to a security test case. If the first node is + // a declaration, and the last node is a declaration, then only + // declarations have so far been addded. + bool wellLocated = false; + + if (ToDocument()) + { + if (FirstChild()) { wellLocated = FirstChild() && FirstChild()->ToDeclaration() && LastChild() && LastChild()->ToDeclaration(); } + else { wellLocated = true; } + } + if (!wellLocated) + { + _document->SetError(XML_ERROR_PARSING_DECLARATION, initialLineNum, "XMLDeclaration value=%s", decl->Value()); + DeleteNode(node); + break; + } + } + + XMLElement* ele = node->ToElement(); + if (ele) + { + // We read the end tag. Return it to the parent. + if (ele->ClosingType() == XMLElement::CLOSING) + { + if (parentEndTag) { ele->_value.TransferTo(parentEndTag); } + node->_memPool->SetTracked(); // created and then immediately deleted. + DeleteNode(node); + return p; + } + + // Handle an end tag returned to this level. + // And handle a bunch of annoying errors. + bool mismatch = false; + if (endTag.Empty()) { if (ele->ClosingType() == XMLElement::OPEN) { mismatch = true; } } + else + { + if (ele->ClosingType() != XMLElement::OPEN) { mismatch = true; } + else if (!XMLUtil::StringEqual(endTag.GetStr(), ele->Name())) { mismatch = true; } + } + if (mismatch) + { + _document->SetError(XML_ERROR_MISMATCHED_ELEMENT, initialLineNum, "XMLElement name=%s", ele->Name()); + DeleteNode(node); + break; + } + } + InsertEndChild(node); + } + return nullptr; +} + +/*static*/ +void XMLNode::DeleteNode(XMLNode* node) +{ + if (node == nullptr) { return; } + TIXMLASSERT(node->_document); + if (!node->ToDocument()) { node->_document->MarkInUse(node); } + + MemPool* pool = node->_memPool; + node->~XMLNode(); + pool->Free(node); +} + +void XMLNode::InsertChildPreamble(XMLNode* insertThis) const +{ + TIXMLASSERT(insertThis); + TIXMLASSERT(insertThis->_document == _document); + + if (insertThis->_parent) { insertThis->_parent->Unlink(insertThis); } + else + { + insertThis->_document->MarkInUse(insertThis); + insertThis->_memPool->SetTracked(); + } +} + +const XMLElement* XMLNode::ToElementWithName(const char* name) const +{ + const XMLElement* element = this->ToElement(); + if (element == nullptr) { return nullptr; } + if (name == nullptr) { return element; } + if (XMLUtil::StringEqual(element->Name(), name)) { return element; } + return nullptr; +} + +// --------- XMLText ---------- // +char* XMLText::ParseDeep(char* p, StrPair* /*parentEndTag*/, int* curLineNumPtr) +{ + if (this->CData()) + { + p = _value.ParseText(p, "]]>", StrPair::NEEDS_NEWLINE_NORMALIZATION, curLineNumPtr); + if (!p) { _document->SetError(XML_ERROR_PARSING_CDATA, _parseLineNum, nullptr); } + return p; + } + int flags = _document->ProcessEntities() ? StrPair::TEXT_ELEMENT : StrPair::TEXT_ELEMENT_LEAVE_ENTITIES; + if (_document->WhitespaceMode() == COLLAPSE_WHITESPACE) { flags |= StrPair::NEEDS_WHITESPACE_COLLAPSING; } + + p = _value.ParseText(p, "<", flags, curLineNumPtr); + if (p && *p) { return p - 1; } + if (!p) { _document->SetError(XML_ERROR_PARSING_TEXT, _parseLineNum, nullptr); } + return nullptr; +} + + +XMLNode* XMLText::ShallowClone(XMLDocument* doc) const +{ + if (!doc) { doc = _document; } + XMLText* text = doc->NewText(Value()); // fixme: this will always allocate memory. Intern? + text->SetCData(this->CData()); + return text; +} + + +bool XMLText::ShallowEqual(const XMLNode* compare) const +{ + TIXMLASSERT(compare); + const XMLText* text = compare->ToText(); + return (text && XMLUtil::StringEqual(text->Value(), Value())); +} + + +bool XMLText::Accept(XMLVisitor* visitor) const +{ + TIXMLASSERT(visitor); + return visitor->Visit(*this); +} + + +// --------- XMLComment ---------- // + +char* XMLComment::ParseDeep(char* p, StrPair* /*parentEndTag*/, int* curLineNumPtr) +{ + // Comment parses as text. + p = _value.ParseText(p, "-->", StrPair::COMMENT, curLineNumPtr); + if (p == nullptr) { _document->SetError(XML_ERROR_PARSING_COMMENT, _parseLineNum, nullptr); } + return p; +} + + +XMLNode* XMLComment::ShallowClone(XMLDocument* doc) const +{ + if (!doc) { doc = _document; } + XMLComment* comment = doc->NewComment(Value()); // fixme: this will always allocate memory. Intern? + return comment; +} + + +bool XMLComment::ShallowEqual(const XMLNode* compare) const +{ + TIXMLASSERT(compare); + const XMLComment* comment = compare->ToComment(); + return (comment && XMLUtil::StringEqual(comment->Value(), Value())); +} + + +bool XMLComment::Accept(XMLVisitor* visitor) const +{ + TIXMLASSERT(visitor); + return visitor->Visit(*this); +} + + +// --------- XMLDeclaration ---------- // + +char* XMLDeclaration::ParseDeep(char* p, StrPair* /*parentEndTag*/, int* curLineNumPtr) +{ + // Declaration parses as text. + p = _value.ParseText(p, "?>", StrPair::NEEDS_NEWLINE_NORMALIZATION, curLineNumPtr); + if (p == nullptr) { _document->SetError(XML_ERROR_PARSING_DECLARATION, _parseLineNum, nullptr); } + return p; +} + + +XMLNode* XMLDeclaration::ShallowClone(XMLDocument* doc) const +{ + if (!doc) { doc = _document; } + XMLDeclaration* dec = doc->NewDeclaration(Value()); // fixme: this will always allocate memory. Intern? + return dec; +} + + +bool XMLDeclaration::ShallowEqual(const XMLNode* compare) const +{ + TIXMLASSERT(compare); + const XMLDeclaration* declaration = compare->ToDeclaration(); + return (declaration && XMLUtil::StringEqual(declaration->Value(), Value())); +} + + +bool XMLDeclaration::Accept(XMLVisitor* visitor) const +{ + TIXMLASSERT(visitor); + return visitor->Visit(*this); +} + +// --------- XMLUnknown ---------- // + +char* XMLUnknown::ParseDeep(char* p, StrPair* /*parentEndTag*/, int* curLineNumPtr) +{ + // Unknown parses as text. + p = _value.ParseText(p, ">", StrPair::NEEDS_NEWLINE_NORMALIZATION, curLineNumPtr); + if (!p) { _document->SetError(XML_ERROR_PARSING_UNKNOWN, _parseLineNum, nullptr); } + return p; +} + + +XMLNode* XMLUnknown::ShallowClone(XMLDocument* doc) const +{ + if (!doc) { doc = _document; } + XMLUnknown* text = doc->NewUnknown(Value()); // fixme: this will always allocate memory. Intern? + return text; +} + + +bool XMLUnknown::ShallowEqual(const XMLNode* compare) const +{ + TIXMLASSERT(compare); + const XMLUnknown* unknown = compare->ToUnknown(); + return (unknown && XMLUtil::StringEqual(unknown->Value(), Value())); +} + + +bool XMLUnknown::Accept(XMLVisitor* visitor) const +{ + TIXMLASSERT(visitor); + return visitor->Visit(*this); +} + +// --------- XMLAttribute ---------- // + +char* XMLAttribute::ParseDeep(char* p, const bool processEntities, int* curLineNumPtr) +{ + // Parse using the name rules: bug fix, was using ParseText before + p = _name.ParseName(p); + if (!p || !*p) { return nullptr; } + + // Skip white space before = + p = XMLUtil::SkipWhiteSpace(p, curLineNumPtr); + if (*p != '=') { return nullptr; } + + ++p; // move up to opening quote + p = XMLUtil::SkipWhiteSpace(p, curLineNumPtr); + if (*p != '\"' && *p != '\'') { return nullptr; } + + char endTag[2] = { *p, 0 }; + ++p; // move past opening quote + + p = _value.ParseText(p, endTag, processEntities ? StrPair::ATTRIBUTE_VALUE : StrPair::ATTRIBUTE_VALUE_LEAVE_ENTITIES, curLineNumPtr); + return p; +} + + +XMLError XMLAttribute::QueryIntValue(int* value) const +{ + if (XMLUtil::ToInt(Value(), value)) { return XML_SUCCESS; } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryUnsignedValue(unsigned int* value) const +{ + if (XMLUtil::ToUnsigned(Value(), value)) { return XML_SUCCESS; } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryInt64Value(int64_t* value) const +{ + if (XMLUtil::ToInt64(Value(), value)) { return XML_SUCCESS; } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryBoolValue(bool* value) const +{ + if (XMLUtil::ToBool(Value(), value)) { return XML_SUCCESS; } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryFloatValue(float* value) const +{ + if (XMLUtil::ToFloat(Value(), value)) { return XML_SUCCESS; } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryDoubleValue(double* value) const +{ + if (XMLUtil::ToDouble(Value(), value)) { return XML_SUCCESS; } + return XML_WRONG_ATTRIBUTE_TYPE; +} + +void XMLAttribute::SetAttribute(const int value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + _value.SetStr(buf); +} + + +void XMLAttribute::SetAttribute(const unsigned value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + _value.SetStr(buf); +} + + +void XMLAttribute::SetAttribute(const int64_t value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + _value.SetStr(buf); +} + + +void XMLAttribute::SetAttribute(const bool value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + _value.SetStr(buf); +} + +void XMLAttribute::SetAttribute(const double value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + _value.SetStr(buf); +} + +void XMLAttribute::SetAttribute(const float value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + _value.SetStr(buf); +} + + +// --------- XMLElement ---------- // + +XMLElement::~XMLElement() +{ + while (_rootAttribute) + { + XMLAttribute* next = _rootAttribute->_next; + DeleteAttribute(_rootAttribute); + _rootAttribute = next; + } +} + + +const XMLAttribute* XMLElement::FindAttribute(const char* name) const +{ + for (XMLAttribute* a = _rootAttribute; a; a = a->_next) { if (XMLUtil::StringEqual(a->Name(), name)) { return a; } } + return nullptr; +} + + +const char* XMLElement::Attribute(const char* name, const char* value) const +{ + const XMLAttribute* a = FindAttribute(name); + if (!a) { return nullptr; } + if (!value || XMLUtil::StringEqual(a->Value(), value)) { return a->Value(); } + return nullptr; +} + +int XMLElement::IntAttribute(const char* name, const int defaultValue) const +{ + int i = defaultValue; + QueryIntAttribute(name, &i); + return i; +} + +unsigned XMLElement::UnsignedAttribute(const char* name, const unsigned defaultValue) const +{ + unsigned i = defaultValue; + QueryUnsignedAttribute(name, &i); + return i; +} + +int64_t XMLElement::Int64Attribute(const char* name, const int64_t defaultValue) const +{ + int64_t i = defaultValue; + QueryInt64Attribute(name, &i); + return i; +} + +bool XMLElement::BoolAttribute(const char* name, const bool defaultValue) const +{ + bool b = defaultValue; + QueryBoolAttribute(name, &b); + return b; +} + +double XMLElement::DoubleAttribute(const char* name, const double defaultValue) const +{ + double d = defaultValue; + QueryDoubleAttribute(name, &d); + return d; +} + +float XMLElement::FloatAttribute(const char* name, const float defaultValue) const +{ + float f = defaultValue; + QueryFloatAttribute(name, &f); + return f; +} + +const char* XMLElement::GetText() const +{ + if (FirstChild() && FirstChild()->ToText()) { return FirstChild()->Value(); } + return nullptr; +} + + +void XMLElement::SetText(const char* inText) +{ + if (FirstChild() && FirstChild()->ToText()) { FirstChild()->SetValue(inText); } + else + { + XMLText* theText = GetDocument()->NewText(inText); + InsertFirstChild(theText); + } +} + + +void XMLElement::SetText(const int value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + SetText(buf); +} + + +void XMLElement::SetText(const unsigned value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + SetText(buf); +} + + +void XMLElement::SetText(const int64_t value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + SetText(buf); +} + + +void XMLElement::SetText(const bool value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + SetText(buf); +} + + +void XMLElement::SetText(const float value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + SetText(buf); +} + + +void XMLElement::SetText(const double value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + SetText(buf); +} + + +XMLError XMLElement::QueryIntText(int* val) const +{ + if (FirstChild() && FirstChild()->ToText()) + { + const char* t = FirstChild()->Value(); + if (XMLUtil::ToInt(t, val)) { return XML_SUCCESS; } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryUnsignedText(unsigned* val) const +{ + if (FirstChild() && FirstChild()->ToText()) + { + const char* t = FirstChild()->Value(); + if (XMLUtil::ToUnsigned(t, val)) { return XML_SUCCESS; } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryInt64Text(int64_t* val) const +{ + if (FirstChild() && FirstChild()->ToText()) + { + const char* t = FirstChild()->Value(); + if (XMLUtil::ToInt64(t, val)) { return XML_SUCCESS; } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryBoolText(bool* val) const +{ + if (FirstChild() && FirstChild()->ToText()) + { + const char* t = FirstChild()->Value(); + if (XMLUtil::ToBool(t, val)) { return XML_SUCCESS; } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryDoubleText(double* val) const +{ + if (FirstChild() && FirstChild()->ToText()) + { + const char* t = FirstChild()->Value(); + if (XMLUtil::ToDouble(t, val)) { return XML_SUCCESS; } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryFloatText(float* val) const +{ + if (FirstChild() && FirstChild()->ToText()) + { + const char* t = FirstChild()->Value(); + if (XMLUtil::ToFloat(t, val)) { return XML_SUCCESS; } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + +int XMLElement::IntText(const int defaultValue) const +{ + int i = defaultValue; + QueryIntText(&i); + return i; +} + +unsigned XMLElement::UnsignedText(const unsigned defaultValue) const +{ + unsigned i = defaultValue; + QueryUnsignedText(&i); + return i; +} + +int64_t XMLElement::Int64Text(const int64_t defaultValue) const +{ + int64_t i = defaultValue; + QueryInt64Text(&i); + return i; +} + +bool XMLElement::BoolText(const bool defaultValue) const +{ + bool b = defaultValue; + QueryBoolText(&b); + return b; +} + +double XMLElement::DoubleText(const double defaultValue) const +{ + double d = defaultValue; + QueryDoubleText(&d); + return d; +} + +float XMLElement::FloatText(const float defaultValue) const +{ + float f = defaultValue; + QueryFloatText(&f); + return f; +} + + +XMLAttribute* XMLElement::FindOrCreateAttribute(const char* name) +{ + XMLAttribute* last = nullptr; + XMLAttribute* attrib = _rootAttribute; + for (; attrib; last = attrib, attrib = attrib->_next) { if (XMLUtil::StringEqual(attrib->Name(), name)) { break; } } + if (!attrib) + { + attrib = CreateAttribute(); + TIXMLASSERT(attrib); + if (last) + { + TIXMLASSERT(last->_next == nullptr); + last->_next = attrib; + } + else + { + TIXMLASSERT(_rootAttribute == nullptr); + _rootAttribute = attrib; + } + attrib->SetName(name); + } + return attrib; +} + + +void XMLElement::DeleteAttribute(const char* name) +{ + XMLAttribute* prev = nullptr; + for (XMLAttribute* a = _rootAttribute; a; a = a->_next) + { + if (XMLUtil::StringEqual(name, a->Name())) + { + if (prev) { prev->_next = a->_next; } + else { _rootAttribute = a->_next; } + DeleteAttribute(a); + break; + } + prev = a; + } +} + + +char* XMLElement::ParseAttributes(char* p, int* curLineNumPtr) +{ + XMLAttribute* prevAttribute = nullptr; + + // Read the attributes. + while (p) + { + p = XMLUtil::SkipWhiteSpace(p, curLineNumPtr); + if (!(*p)) + { + _document->SetError(XML_ERROR_PARSING_ELEMENT, _parseLineNum, "XMLElement name=%s", Name()); + return nullptr; + } + + // attribute. + if (XMLUtil::IsNameStartChar(*p)) + { + XMLAttribute* attrib = CreateAttribute(); + TIXMLASSERT(attrib); + attrib->_parseLineNum = _document->_parseCurLineNum; + + const int attrLineNum = attrib->_parseLineNum; + + p = attrib->ParseDeep(p, _document->ProcessEntities(), curLineNumPtr); + if (!p || Attribute(attrib->Name())) + { + DeleteAttribute(attrib); + _document->SetError(XML_ERROR_PARSING_ATTRIBUTE, attrLineNum, "XMLElement name=%s", Name()); + return nullptr; + } + // There is a minor bug here: if the attribute in the source xml + // document is duplicated, it will not be detected and the + // attribute will be doubly added. However, tracking the 'prevAttribute' + // avoids re-scanning the attribute list. Preferring performance for + // now, may reconsider in the future. + if (prevAttribute) + { + TIXMLASSERT(prevAttribute->_next == nullptr); + prevAttribute->_next = attrib; + } + else + { + TIXMLASSERT(_rootAttribute == nullptr); + _rootAttribute = attrib; + } + prevAttribute = attrib; + } + // end of the tag + else if (*p == '>') + { + ++p; + break; + } + // end of the tag + else if (*p == '/' && *(p + 1) == '>') + { + _closingType = CLOSED; + return p + 2; // done; sealed element. + } + else + { + _document->SetError(XML_ERROR_PARSING_ELEMENT, _parseLineNum, nullptr); + return nullptr; + } + } + return p; +} + +void XMLElement::DeleteAttribute(XMLAttribute* attribute) +{ + if (attribute == nullptr) { return; } + MemPool* pool = attribute->_memPool; + attribute->~XMLAttribute(); + pool->Free(attribute); +} + +XMLAttribute* XMLElement::CreateAttribute() +{ + TIXMLASSERT(sizeof(XMLAttribute) == _document->_attributePool.ItemSize()); + XMLAttribute* attrib = new(_document->_attributePool.Alloc()) XMLAttribute(); + TIXMLASSERT(attrib); + attrib->_memPool = &_document->_attributePool; + attrib->_memPool->SetTracked(); + return attrib; +} + +// +// +// foobar +// +char* XMLElement::ParseDeep(char* p, StrPair* parentEndTag, int* curLineNumPtr) +{ + // Read the element name. + p = XMLUtil::SkipWhiteSpace(p, curLineNumPtr); + + // The closing element is the form. It is + // parsed just like a regular element then deleted from + // the DOM. + if (*p == '/') + { + _closingType = CLOSING; + ++p; + } + + p = _value.ParseName(p); + if (_value.Empty()) { return nullptr; } + + p = ParseAttributes(p, curLineNumPtr); + if (!p || !*p || _closingType != OPEN) { return p; } + + p = XMLNode::ParseDeep(p, parentEndTag, curLineNumPtr); + return p; +} + + +XMLNode* XMLElement::ShallowClone(XMLDocument* doc) const +{ + if (!doc) { doc = _document; } + XMLElement* element = doc->NewElement(Value()); // fixme: this will always allocate memory. Intern? + for (const XMLAttribute* a = FirstAttribute(); a; a = a->Next()) + { + element->SetAttribute(a->Name(), a->Value()); // fixme: this will always allocate memory. Intern? + } + return element; +} + + +bool XMLElement::ShallowEqual(const XMLNode* compare) const +{ + TIXMLASSERT(compare); + const XMLElement* other = compare->ToElement(); + if (other && XMLUtil::StringEqual(other->Name(), Name())) + { + const XMLAttribute* a = FirstAttribute(); + const XMLAttribute* b = other->FirstAttribute(); + + while (a && b) + { + if (!XMLUtil::StringEqual(a->Value(), b->Value())) { return false; } + a = a->Next(); + b = b->Next(); + } + return !(a || b); // different count + } + return false; +} + + +bool XMLElement::Accept(XMLVisitor* visitor) const +{ + TIXMLASSERT(visitor); + if (visitor->VisitEnter(*this, _rootAttribute)) + { + for (const XMLNode* node = FirstChild(); node; node = node->NextSibling()) { if (!node->Accept(visitor)) { break; } } + } + return visitor->VisitExit(*this); +} + + +// --------- XMLDocument ----------- // + +// Warning: List must match 'enum XMLError' +const char* XMLDocument::_errorNames[XML_ERROR_COUNT] = { + "XML_SUCCESS", + "XML_NO_ATTRIBUTE", + "XML_WRONG_ATTRIBUTE_TYPE", + "XML_ERROR_FILE_NOT_FOUND", + "XML_ERROR_FILE_COULD_NOT_BE_OPENED", + "XML_ERROR_FILE_READ_ERROR", + "XML_ERROR_PARSING_ELEMENT", + "XML_ERROR_PARSING_ATTRIBUTE", + "XML_ERROR_PARSING_TEXT", + "XML_ERROR_PARSING_CDATA", + "XML_ERROR_PARSING_COMMENT", + "XML_ERROR_PARSING_DECLARATION", + "XML_ERROR_PARSING_UNKNOWN", + "XML_ERROR_EMPTY_DOCUMENT", + "XML_ERROR_MISMATCHED_ELEMENT", + "XML_ERROR_PARSING", + "XML_CAN_NOT_CONVERT_TEXT", + "XML_NO_TEXT_NODE", + "XML_ELEMENT_DEPTH_EXCEEDED" +}; + + +XMLDocument::XMLDocument(bool processEntities, Whitespace whitespaceMode) : XMLNode(nullptr), _processEntities(processEntities), + _whitespaceMode(whitespaceMode) +{ + // avoid VC++ C4355 warning about 'this' in initializer list (C4355 is off by default in VS2012+) + _document = this; +} + + +XMLDocument::~XMLDocument() { Clear(); } + + +void XMLDocument::MarkInUse(XMLNode* node) +{ + TIXMLASSERT(node); + TIXMLASSERT(node->_parent == nullptr); + + for (int i = 0; i < _unlinked.Size(); ++i) + { + if (node == _unlinked[i]) + { + _unlinked.SwapRemove(i); + break; + } + } +} + +void XMLDocument::Clear() +{ + DeleteChildren(); + while (_unlinked.Size()) { DeleteNode(_unlinked[0]); } // Will remove from _unlinked as part of delete. + +#ifdef TINYXML2_DEBUG + const bool hadError = Error(); +#endif + ClearError(); + + delete[] _charBuffer; + _charBuffer = nullptr; + _parsingDepth = 0; + +#if 0 + _textPool.Trace("text"); + _elementPool.Trace("element"); + _commentPool.Trace("comment"); + _attributePool.Trace("attribute"); +#endif + +#ifdef TINYXML2_DEBUG + if (!hadError) + { + TIXMLASSERT(_elementPool.CurrentAllocs() == _elementPool.Untracked()); + TIXMLASSERT(_attributePool.CurrentAllocs() == _attributePool.Untracked()); + TIXMLASSERT(_textPool.CurrentAllocs() == _textPool.Untracked()); + TIXMLASSERT(_commentPool.CurrentAllocs() == _commentPool.Untracked()); + } +#endif +} + + +void XMLDocument::DeepCopy(XMLDocument* target) const +{ + TIXMLASSERT(target); + if (target == this) { return; } // technically success - a no-op. + + target->Clear(); + for (const XMLNode* node = this->FirstChild(); node; node = node->NextSibling()) { target->InsertEndChild(node->DeepClone(target)); } +} + +XMLElement* XMLDocument::NewElement(const char* name) +{ + XMLElement* ele = CreateUnlinkedNode(_elementPool); + ele->SetName(name); + return ele; +} + + +XMLComment* XMLDocument::NewComment(const char* str) +{ + XMLComment* comment = CreateUnlinkedNode(_commentPool); + comment->SetValue(str); + return comment; +} + + +XMLText* XMLDocument::NewText(const char* str) +{ + XMLText* text = CreateUnlinkedNode(_textPool); + text->SetValue(str); + return text; +} + + +XMLDeclaration* XMLDocument::NewDeclaration(const char* str) +{ + XMLDeclaration* dec = CreateUnlinkedNode(_commentPool); + dec->SetValue(str ? str : "xml version=\"1.0\" encoding=\"UTF-8\""); + return dec; +} + + +XMLUnknown* XMLDocument::NewUnknown(const char* str) +{ + XMLUnknown* unk = CreateUnlinkedNode(_commentPool); + unk->SetValue(str); + return unk; +} + +static FILE* callfopen(const char* filepath, const char* mode) +{ + TIXMLASSERT(filepath); + TIXMLASSERT(mode); +#if defined(_MSC_VER) && (_MSC_VER >= 1400 ) && (!defined WINCE) + FILE* fp = nullptr; + const errno_t err = fopen_s(&fp, filepath, mode); + if (err) { return nullptr; } +#else + FILE* fp = fopen(filepath, mode); +#endif + return fp; +} + +void XMLDocument::DeleteNode(XMLNode* node) +{ + TIXMLASSERT(node); + TIXMLASSERT(node->_document == this); + if (node->_parent) { node->_parent->DeleteChild(node); } + else + { + // Isn't in the tree. + // Use the parent delete. + // Also, we need to mark it tracked: we 'know' + // it was never used. + node->_memPool->SetTracked(); + // Call the static XMLNode version: + XMLNode::DeleteNode(node); + } +} + + +XMLError XMLDocument::LoadFile(const char* filename) +{ + if (!filename) + { + TIXMLASSERT(false); + SetError(XML_ERROR_FILE_COULD_NOT_BE_OPENED, 0, "filename="); + return _errorID; + } + + Clear(); + FILE* fp = callfopen(filename, "rb"); + if (!fp) + { + SetError(XML_ERROR_FILE_NOT_FOUND, 0, "filename=%s", filename); + return _errorID; + } + LoadFile(fp); + fclose(fp); + return _errorID; +} + +// This is likely overengineered template art to have a check that unsigned long value incremented +// by one still fits into size_t. If size_t type is larger than unsigned long type +// (x86_64-w64-mingw32 target) then the check is redundant and gcc and clang emit +// -Wtype-limits warning. This piece makes the compiler select code with a check when a check +// is useful and code with no check when a check is redundant depending on how size_t and unsigned long +// types sizes relate to each other. +template += sizeof(size_t))> +struct LongFitsIntoSizeTMinusOne +{ + static bool Fits(const unsigned long value) { return value < size_t(-1); } +}; + +template <> +struct LongFitsIntoSizeTMinusOne +{ + static bool Fits(unsigned long /*value*/) { return true; } +}; + +XMLError XMLDocument::LoadFile(FILE* fp) +{ + Clear(); + + fseek(fp, 0, SEEK_SET); + if (fgetc(fp) == EOF && ferror(fp) != 0) + { + SetError(XML_ERROR_FILE_READ_ERROR, 0, nullptr); + return _errorID; + } + + fseek(fp, 0, SEEK_END); + const long filelength = ftell(fp); + fseek(fp, 0, SEEK_SET); + if (filelength == -1L) + { + SetError(XML_ERROR_FILE_READ_ERROR, 0, nullptr); + return _errorID; + } + TIXMLASSERT(filelength >= 0); + + if (!LongFitsIntoSizeTMinusOne<>::Fits(filelength)) + { + // Cannot handle files which won't fit in buffer together with null terminator + SetError(XML_ERROR_FILE_READ_ERROR, 0, nullptr); + return _errorID; + } + + if (filelength == 0) + { + SetError(XML_ERROR_EMPTY_DOCUMENT, 0, nullptr); + return _errorID; + } + + const size_t size = filelength; + TIXMLASSERT(_charBuffer == nullptr); + _charBuffer = new char[size + 1]; + const size_t read = fread(_charBuffer, 1, size, fp); + if (read != size) + { + SetError(XML_ERROR_FILE_READ_ERROR, 0, nullptr); + return _errorID; + } + + _charBuffer[size] = 0; + + Parse(); + return _errorID; +} + + +XMLError XMLDocument::SaveFile(const char* filename, const bool compact) +{ + if (!filename) + { + TIXMLASSERT(false); + SetError(XML_ERROR_FILE_COULD_NOT_BE_OPENED, 0, "filename="); + return _errorID; + } + + FILE* fp = callfopen(filename, "w"); + if (!fp) + { + SetError(XML_ERROR_FILE_COULD_NOT_BE_OPENED, 0, "filename=%s", filename); + return _errorID; + } + SaveFile(fp, compact); + fclose(fp); + return _errorID; +} + + +XMLError XMLDocument::SaveFile(FILE* fp, const bool compact) +{ + // Clear any error from the last save, otherwise it will get reported + // for *this* call. + ClearError(); + XMLPrinter stream(fp, compact); + Print(&stream); + return _errorID; +} + + +XMLError XMLDocument::Parse(const char* xml, size_t len) +{ + Clear(); + + if (len == 0 || !xml || !*xml) + { + SetError(XML_ERROR_EMPTY_DOCUMENT, 0, nullptr); + return _errorID; + } + if (len == size_t(-1)) { len = strlen(xml); } + TIXMLASSERT(_charBuffer == nullptr); + _charBuffer = new char[len + 1]; + memcpy(_charBuffer, xml, len); + _charBuffer[len] = 0; + + Parse(); + if (Error()) + { + // clean up now essentially dangling memory. + // and the parse fail can put objects in the + // pools that are dead and inaccessible. + DeleteChildren(); + _elementPool.Clear(); + _attributePool.Clear(); + _textPool.Clear(); + _commentPool.Clear(); + } + return _errorID; +} + + +void XMLDocument::Print(XMLPrinter* streamer) const +{ + if (streamer) { Accept(streamer); } + else + { + XMLPrinter stdoutStreamer(stdout); + Accept(&stdoutStreamer); + } +} + + +void XMLDocument::SetError(XMLError error, const int lineNum, const char* format, ...) +{ + TIXMLASSERT(error >= 0 && error < XML_ERROR_COUNT); + _errorID = error; + _errorLineNum = lineNum; + _errorStr.Reset(); + + const size_t BUFFER_SIZE = 1000; + char* buffer = new char[BUFFER_SIZE]; + + TIXMLASSERT(sizeof(error) <= sizeof(int)); + TIXML_SNPRINTF(buffer, BUFFER_SIZE, "Error=%s ErrorID=%d (0x%x) Line number=%d", ErrorIDToName(error), int(error), int(error), lineNum); + + if (format) + { + size_t len = strlen(buffer); + TIXML_SNPRINTF(buffer + len, BUFFER_SIZE - len, ": "); + len = strlen(buffer); + + va_list va; + va_start(va, format); + TIXML_VSNPRINTF(buffer + len, BUFFER_SIZE - len, format, va); + va_end(va); + } + _errorStr.SetStr(buffer); + delete[] buffer; +} + + +/*static*/ +const char* XMLDocument::ErrorIDToName(const XMLError errorID) +{ + TIXMLASSERT(errorID >= 0 && errorID < XML_ERROR_COUNT); + const char* errorName = _errorNames[errorID]; + TIXMLASSERT(errorName && errorName[0]); + return errorName; +} + +void XMLDocument::Parse() +{ + TIXMLASSERT(NoChildren()); // Clear() must have been called previously + TIXMLASSERT(_charBuffer); + _parseCurLineNum = 1; + _parseLineNum = 1; + char* p = _charBuffer; + p = XMLUtil::SkipWhiteSpace(p, &_parseCurLineNum); + p = const_cast(XMLUtil::ReadBOM(p, &_writeBOM)); + if (!*p) + { + SetError(XML_ERROR_EMPTY_DOCUMENT, 0, nullptr); + return; + } + ParseDeep(p, nullptr, &_parseCurLineNum); +} + +void XMLDocument::PushDepth() +{ + _parsingDepth++; + if (_parsingDepth == TINYXML2_MAX_ELEMENT_DEPTH) { SetError(XML_ELEMENT_DEPTH_EXCEEDED, _parseCurLineNum, "Element nesting is too deep."); } +} + +void XMLDocument::PopDepth() +{ + TIXMLASSERT(_parsingDepth > 0); + --_parsingDepth; +} + +XMLPrinter::XMLPrinter(FILE* file, const bool compact, const int depth) : _fp(file), _depth(depth), _compactMode(compact) +{ + for (int i = 0; i < ENTITY_RANGE; ++i) + { + _entityFlag[i] = false; + _restrictedEntityFlag[i] = false; + } + for (int i = 0; i < NUM_ENTITIES; ++i) + { + const char entityValue = ENTITIES[i].value; + const unsigned char flagIndex = static_cast(entityValue); + TIXMLASSERT(flagIndex < ENTITY_RANGE); + _entityFlag[flagIndex] = true; + } + _restrictedEntityFlag[static_cast('&')] = true; + _restrictedEntityFlag[static_cast('<')] = true; + _restrictedEntityFlag[static_cast('>')] = true; // not required, but consistency is nice + _buffer.Push(0); +} + + +void XMLPrinter::Print(const char* format, ...) +{ + va_list va; + va_start(va, format); + + if (_fp) { vfprintf(_fp, format, va); } + else + { + const int len = TIXML_VSCPRINTF(format, va); + // Close out and re-start the va-args + va_end(va); + TIXMLASSERT(len >= 0); + va_start(va, format); + TIXMLASSERT(_buffer.Size() > 0 && _buffer[_buffer.Size() - 1] == 0); + char* p = _buffer.PushArr(len) - 1; // back up over the null terminator. + TIXML_VSNPRINTF(p, len + 1, format, va); + } + va_end(va); +} + + +void XMLPrinter::Write(const char* data, const size_t size) +{ + if (_fp) { fwrite(data, sizeof(char), size, _fp); } + else + { + char* p = _buffer.PushArr(int(size)) - 1; // back up over the null terminator. + memcpy(p, data, size); + p[size] = 0; + } +} + + +void XMLPrinter::Putc(const char ch) +{ + if (_fp) { fputc(ch, _fp); } + else + { + char* p = _buffer.PushArr(sizeof(char)) - 1; // back up over the null terminator. + p[0] = ch; + p[1] = 0; + } +} + + +void XMLPrinter::PrintString(const char* p, const bool restricted) +{ + // Look for runs of bytes between entities to print. + const char* q = p; + + if (_processEntities) + { + const bool* flag = restricted ? _restrictedEntityFlag : _entityFlag; + while (*q) + { + TIXMLASSERT(p <= q); + // Remember, char is sometimes signed. (How many times has that bitten me?) + if (*q > 0 && *q < ENTITY_RANGE) + { + // Check for entities. If one is found, flush + // the stream up until the entity, write the + // entity, and keep looking. + if (flag[static_cast(*q)]) + { + while (p < q) + { + const size_t delta = q - p; + const int toPrint = (INT_MAX < delta) ? INT_MAX : int(delta); + Write(p, toPrint); + p += toPrint; + } + bool entityPatternPrinted = false; + for (int i = 0; i < NUM_ENTITIES; ++i) + { + if (ENTITIES[i].value == *q) + { + Putc('&'); + Write(ENTITIES[i].pattern, ENTITIES[i].length); + Putc(';'); + entityPatternPrinted = true; + break; + } + } + if (!entityPatternPrinted) + { + // TIXMLASSERT( entityPatternPrinted ) causes gcc -Wunused-but-set-variable in release + TIXMLASSERT(false); + } + ++p; + } + } + ++q; + TIXMLASSERT(p <= q); + } + // Flush the remaining string. This will be the entire + // string if an entity wasn't found. + if (p < q) + { + const size_t delta = q - p; + const int toPrint = (INT_MAX < delta) ? INT_MAX : int(delta); + Write(p, toPrint); + } + } + else { Write(p); } +} + + +void XMLPrinter::PushHeader(const bool writeBOM, const bool writeDec) +{ + if (writeBOM) + { + static const unsigned char bom[] = { TIXML_UTF_LEAD_0, TIXML_UTF_LEAD_1, TIXML_UTF_LEAD_2, 0 }; + Write(reinterpret_cast(bom)); + } + if (writeDec) { PushDeclaration("xml version=\"1.0\""); } +} + + +void XMLPrinter::OpenElement(const char* name, const bool compactMode) +{ + SealElementIfJustOpened(); + _stack.Push(name); + + if (_textDepth < 0 && !_firstElement && !compactMode) { Putc('\n'); } + if (!compactMode) { PrintSpace(_depth); } + + Write("<"); + Write(name); + + _elementJustOpened = true; + _firstElement = false; + ++_depth; +} + + +void XMLPrinter::PushAttribute(const char* name, const char* value) +{ + TIXMLASSERT(_elementJustOpened); + Putc(' '); + Write(name); + Write("=\""); + PrintString(value, false); + Putc('\"'); +} + + +void XMLPrinter::PushAttribute(const char* name, const int value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushAttribute(name, buf); +} + + +void XMLPrinter::PushAttribute(const char* name, const unsigned value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushAttribute(name, buf); +} + + +void XMLPrinter::PushAttribute(const char* name, const int64_t value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushAttribute(name, buf); +} + + +void XMLPrinter::PushAttribute(const char* name, const bool value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushAttribute(name, buf); +} + + +void XMLPrinter::PushAttribute(const char* name, const double value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushAttribute(name, buf); +} + + +void XMLPrinter::CloseElement(const bool compactMode) +{ + --_depth; + const char* name = _stack.Pop(); + + if (_elementJustOpened) { Write("/>"); } + else + { + if (_textDepth < 0 && !compactMode) + { + Putc('\n'); + PrintSpace(_depth); + } + Write(""); + } + + if (_textDepth == _depth) { _textDepth = -1; } + if (_depth == 0 && !compactMode) { Putc('\n'); } + _elementJustOpened = false; +} + + +void XMLPrinter::SealElementIfJustOpened() +{ + if (!_elementJustOpened) { return; } + _elementJustOpened = false; + Putc('>'); +} + + +void XMLPrinter::PushText(const char* text, const bool cdata) +{ + _textDepth = _depth - 1; + + SealElementIfJustOpened(); + if (cdata) + { + Write(""); + } + else { PrintString(text, true); } +} + +void XMLPrinter::PushText(const int64_t value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushText(buf, false); +} + +void XMLPrinter::PushText(const int value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushText(buf, false); +} + + +void XMLPrinter::PushText(const unsigned value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushText(buf, false); +} + + +void XMLPrinter::PushText(const bool value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushText(buf, false); +} + + +void XMLPrinter::PushText(const float value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushText(buf, false); +} + + +void XMLPrinter::PushText(const double value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushText(buf, false); +} + + +void XMLPrinter::PushComment(const char* comment) +{ + SealElementIfJustOpened(); + if (_textDepth < 0 && !_firstElement && !_compactMode) + { + Putc('\n'); + PrintSpace(_depth); + } + _firstElement = false; + + Write(""); +} + + +void XMLPrinter::PushDeclaration(const char* value) +{ + SealElementIfJustOpened(); + if (_textDepth < 0 && !_firstElement && !_compactMode) + { + Putc('\n'); + PrintSpace(_depth); + } + _firstElement = false; + + Write(""); +} + + +void XMLPrinter::PushUnknown(const char* value) +{ + SealElementIfJustOpened(); + if (_textDepth < 0 && !_firstElement && !_compactMode) + { + Putc('\n'); + PrintSpace(_depth); + } + _firstElement = false; + + Write("'); +} + + +bool XMLPrinter::VisitEnter(const XMLDocument& doc) +{ + _processEntities = doc.ProcessEntities(); + if (doc.HasBOM()) { PushHeader(true, false); } + return true; +} + + +bool XMLPrinter::VisitEnter(const XMLElement& element, const XMLAttribute* attribute) +{ + const XMLElement* parentElem = nullptr; + if (element.Parent()) { parentElem = element.Parent()->ToElement(); } + const bool compactMode = parentElem ? CompactMode(*parentElem) : _compactMode; + OpenElement(element.Name(), compactMode); + while (attribute) + { + PushAttribute(attribute->Name(), attribute->Value()); + attribute = attribute->Next(); + } + return true; +} + + +bool XMLPrinter::VisitExit(const XMLElement& element) +{ + CloseElement(CompactMode(element)); + return true; +} + + +bool XMLPrinter::Visit(const XMLText& text) +{ + PushText(text.Value(), text.CData()); + return true; +} + + +bool XMLPrinter::Visit(const XMLComment& comment) +{ + PushComment(comment.Value()); + return true; +} + +bool XMLPrinter::Visit(const XMLDeclaration& declaration) +{ + PushDeclaration(declaration.Value()); + return true; +} + + +bool XMLPrinter::Visit(const XMLUnknown& unknown) +{ + PushUnknown(unknown.Value()); + return true; +} +} // namespace tinyxml2 diff --git a/Masterarbeit/openvibe/extras-master/applications/developer-tools/xml-configuration-comparison/tinyxml2.h b/Masterarbeit/openvibe/extras-master/applications/developer-tools/xml-configuration-comparison/tinyxml2.h new file mode 100644 index 0000000..dabbcd3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/developer-tools/xml-configuration-comparison/tinyxml2.h @@ -0,0 +1,2063 @@ +/* +Original code by Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#ifndef TINYXML2_INCLUDED +#define TINYXML2_INCLUDED + +#if defined(ANDROID_NDK) || defined(__BORLANDC__) || defined(__QNXNTO__) +# include +# include +# include +# include +# include +# if defined(__PS3__) +# include +# endif +#else +# include +# include +# include +# include +# include +#endif +#include + +/* + TODO: intern strings instead of allocation. +*/ +/* + gcc: + g++ -Wall -DTINYXML2_DEBUG tinyxml2.cpp xmltest.cpp -o gccxmltest.exe + + Formatting, Artistic Style: + AStyle.exe --style=1tbs --indent-switches --break-closing-brackets --indent-preprocessor tinyxml2.cpp tinyxml2.h +*/ + +#if defined( _DEBUG ) || defined (__DEBUG__) +# ifndef TINYXML2_DEBUG +# define TINYXML2_DEBUG +# endif +#endif + +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable: 4251) +#endif + +#ifdef _WIN32 +# ifdef TINYXML2_EXPORT +# define TINYXML2_LIB __declspec(dllexport) +# elif defined(TINYXML2_IMPORT) +# define TINYXML2_LIB __declspec(dllimport) +# else +# define TINYXML2_LIB +# endif +#elif __GNUC__ >= 4 +# define TINYXML2_LIB __attribute__((visibility("default"))) +#else +# define TINYXML2_LIB +#endif + + +#if defined(TINYXML2_DEBUG) +# if defined(_MSC_VER) +# // "(void)0," is for suppressing C4127 warning in "assert(false)", "assert(true)" and the like +# define TIXMLASSERT( x ) if ( !((void)0,(x))) { __debugbreak(); } +# elif defined (ANDROID_NDK) +# include +# define TIXMLASSERT( x ) if ( !(x)) { __android_log_assert( "assert", "grinliz", "ASSERT in '%s' at %d.", __FILE__, __LINE__ ); } +# else +# include +# define TIXMLASSERT assert +# endif +#else +# define TIXMLASSERT( x ) {} +#endif + + +/* Versioning, past 1.0.14: + http://semver.org/ +*/ +static const int TIXML2_MAJOR_VERSION = 7; +static const int TIXML2_MINOR_VERSION = 0; +static const int TIXML2_PATCH_VERSION = 1; + +#define TINYXML2_MAJOR_VERSION 7 +#define TINYXML2_MINOR_VERSION 0 +#define TINYXML2_PATCH_VERSION 1 + +// A fixed element depth limit is problematic. There needs to be a +// limit to avoid a stack overflow. However, that limit varies per +// system, and the capacity of the stack. On the other hand, it's a trivial +// attack that can result from ill, malicious, or even correctly formed XML, +// so there needs to be a limit in place. +static const int TINYXML2_MAX_ELEMENT_DEPTH = 100; + +namespace tinyxml2 +{ + class XMLDocument; + class XMLElement; + class XMLAttribute; + class XMLComment; + class XMLText; + class XMLDeclaration; + class XMLUnknown; + class XMLPrinter; + + /* + A class that wraps strings. Normally stores the start and end + pointers into the XML file itself, and will apply normalization + and entity translation if actually read. Can also store (and memory + manage) a traditional char[] + + Isn't clear why TINYXML2_LIB is needed; but seems to fix #719 + */ + class TINYXML2_LIB StrPair + { + public: + enum + { + NEEDS_ENTITY_PROCESSING = 0x01, + NEEDS_NEWLINE_NORMALIZATION = 0x02, + NEEDS_WHITESPACE_COLLAPSING = 0x04, + + TEXT_ELEMENT = NEEDS_ENTITY_PROCESSING | NEEDS_NEWLINE_NORMALIZATION, + TEXT_ELEMENT_LEAVE_ENTITIES = NEEDS_NEWLINE_NORMALIZATION, + ATTRIBUTE_NAME = 0, + ATTRIBUTE_VALUE = NEEDS_ENTITY_PROCESSING | NEEDS_NEWLINE_NORMALIZATION, + ATTRIBUTE_VALUE_LEAVE_ENTITIES = NEEDS_NEWLINE_NORMALIZATION, + COMMENT = NEEDS_NEWLINE_NORMALIZATION + }; + + StrPair() {} + ~StrPair(); + + void Set(char* start, char* end, const int flags) + { + TIXMLASSERT(start); + TIXMLASSERT(end); + Reset(); + _start = start; + _end = end; + _flags = flags | NEEDS_FLUSH; + } + + const char* GetStr(); + + bool Empty() const { return _start == _end; } + + void SetInternedStr(const char* str) + { + Reset(); + _start = const_cast(str); + } + + void SetStr(const char* str, int flags = 0); + + char* ParseText(char* in, const char* endTag, int strFlags, int* curLineNumPtr); + char* ParseName(char* in); + + void TransferTo(StrPair* other); + void Reset(); + + private: + void CollapseWhitespace(); + + enum + { + NEEDS_FLUSH = 0x100, + NEEDS_DELETE = 0x200 + }; + + int _flags = 0; + char* _start = nullptr; + char* _end = nullptr; + + StrPair(const StrPair& other) = delete; // not supported + void operator=(const StrPair& other) = delete; // not supported, use TransferTo() + }; + + + /* + A dynamic array of Plain Old Data. Doesn't support constructors, etc. + Has a small initial memory pool, so that low or no usage will not + cause a call to new/delete + */ + template + class DynArray + { + public: + DynArray() : _mem(_pool) { } + + ~DynArray() { if (_mem != _pool) { delete[] _mem; } } + + void Clear() { _size = 0; } + + void Push(T t) + { + TIXMLASSERT(_size < INT_MAX); + EnsureCapacity(_size + 1); + _mem[_size] = t; + ++_size; + } + + T* PushArr(const int count) + { + TIXMLASSERT(count >= 0); + TIXMLASSERT(_size <= INT_MAX - count); + EnsureCapacity(_size + count); + T* ret = &_mem[_size]; + _size += count; + return ret; + } + + T Pop() + { + TIXMLASSERT(_size > 0); + --_size; + return _mem[_size]; + } + + void PopArr(const int count) + { + TIXMLASSERT(_size >= count); + _size -= count; + } + + bool Empty() const { return _size == 0; } + + T& operator[](int i) + { + TIXMLASSERT(i >= 0 && i < _size); + return _mem[i]; + } + + const T& operator[](int i) const + { + TIXMLASSERT(i >= 0 && i < _size); + return _mem[i]; + } + + const T& PeekTop() const + { + TIXMLASSERT(_size > 0); + return _mem[_size - 1]; + } + + int Size() const + { + TIXMLASSERT(_size >= 0); + return _size; + } + + int Capacity() const + { + TIXMLASSERT(_allocated >= INITIAL_SIZE); + return _allocated; + } + + void SwapRemove(int i) + { + TIXMLASSERT(i >= 0 && i < _size); + TIXMLASSERT(_size > 0); + _mem[i] = _mem[_size - 1]; + --_size; + } + + const T* Mem() const + { + TIXMLASSERT(_mem); + return _mem; + } + + T* Mem() + { + TIXMLASSERT(_mem); + return _mem; + } + + private: + DynArray(const DynArray&) = delete; // not supported + void operator=(const DynArray&) = delete; // not supported + + void EnsureCapacity(const int cap) + { + TIXMLASSERT(cap > 0); + if (cap > _allocated) + { + TIXMLASSERT(cap <= INT_MAX / 2); + const int newAllocated = cap * 2; + T* newMem = new T[newAllocated]; + TIXMLASSERT(newAllocated >= _size); + memcpy(newMem, _mem, sizeof(T) * _size); // warning: not using constructors, only works for PODs + if (_mem != _pool) { delete[] _mem; } + _mem = newMem; + _allocated = newAllocated; + } + } + + T* _mem; + T _pool[INITIAL_SIZE]; + int _allocated = INITIAL_SIZE; // objects allocated + int _size = 0; // number objects in use + }; + + + /* + Parent virtual class of a pool for fast allocation + and deallocation of objects. + */ + class MemPool + { + public: + MemPool() {} + virtual ~MemPool() {} + + virtual int ItemSize() const = 0; + virtual void* Alloc() = 0; + virtual void Free(void*) = 0; + virtual void SetTracked() = 0; + }; + + + /* + Template child class to create pools of the correct type. + */ + template + class MemPoolT : public MemPool + { + public: + MemPoolT() : _blockPtrs(), _root(nullptr) {} + ~MemPoolT() override { Clear(); } + + void Clear() + { + // Delete the blocks. + while (!_blockPtrs.Empty()) + { + Block* lastBlock = _blockPtrs.Pop(); + delete lastBlock; + } + _root = 0; + _currentAllocs = 0; + _nAllocs = 0; + _maxAllocs = 0; + _nUntracked = 0; + } + + int ItemSize() const override { return ITEM_SIZE; } + int CurrentAllocs() const { return _currentAllocs; } + + void* Alloc() override + { + if (!_root) + { + // Need a new block. + Block* block = new Block(); + _blockPtrs.Push(block); + + Item* blockItems = block->items; + for (int i = 0; i < ITEMS_PER_BLOCK - 1; ++i) { blockItems[i].next = &(blockItems[i + 1]); } + blockItems[ITEMS_PER_BLOCK - 1].next = 0; + _root = blockItems; + } + Item* const result = _root; + TIXMLASSERT(result != nullptr); + _root = _root->next; + + ++_currentAllocs; + if (_currentAllocs > _maxAllocs) { _maxAllocs = _currentAllocs; } + ++_nAllocs; + ++_nUntracked; + return result; + } + + void Free(void* mem) override + { + if (!mem) { return; } + --_currentAllocs; + Item* item = static_cast(mem); +#ifdef TINYXML2_DEBUG + memset(item, 0xfe, sizeof(*item)); +#endif + item->next = _root; + _root = item; + } + + void Trace(const char* name) + { + printf("Mempool %s watermark=%d [%dk] current=%d size=%d nAlloc=%d blocks=%d\n", + name, _maxAllocs, _maxAllocs * ITEM_SIZE / 1024, _currentAllocs, + ITEM_SIZE, _nAllocs, _blockPtrs.Size()); + } + + void SetTracked() override { --_nUntracked; } + + int Untracked() const { return _nUntracked; } + + // This number is perf sensitive. 4k seems like a good tradeoff on my machine. + // The test file is large, 170k. + // Release: VS2010 gcc(no opt) + // 1k: 4000 + // 2k: 4000 + // 4k: 3900 21000 + // 16k: 5200 + // 32k: 4300 + // 64k: 4000 21000 + // Declared public because some compilers do not accept to use ITEMS_PER_BLOCK + // in private part if ITEMS_PER_BLOCK is private + enum { ITEMS_PER_BLOCK = (4 * 1024) / ITEM_SIZE }; + + private: + MemPoolT(const MemPoolT&) = delete; // not supported + void operator=(const MemPoolT&) = delete; // not supported + + union Item + { + Item* next; + char itemData[ITEM_SIZE]; + }; + + struct Block + { + Item items[ITEMS_PER_BLOCK]; + }; + + DynArray _blockPtrs; + Item* _root = nullptr; + + int _currentAllocs = 0; + int _nAllocs = 0; + int _maxAllocs = 0; + int _nUntracked = 0; + }; + + + + /** + Implements the interface to the "Visitor pattern" (see the Accept() method.) + If you call the Accept() method, it requires being passed a XMLVisitor + class to handle callbacks. For nodes that contain other nodes (Document, Element) + you will get called with a VisitEnter/VisitExit pair. Nodes that are always leafs + are simply called with Visit(). + + If you return 'true' from a Visit method, recursive parsing will continue. If you return + false, no children of this node or its siblings will be visited. + + All flavors of Visit methods have a default implementation that returns 'true' (continue + visiting). You need to only override methods that are interesting to you. + + Generally Accept() is called on the XMLDocument, although all nodes support visiting. + + You should never change the document from a callback. + + @sa XMLNode::Accept() + */ + class TINYXML2_LIB XMLVisitor + { + public: + virtual ~XMLVisitor() {} + + /// Visit a document. + virtual bool VisitEnter(const XMLDocument& /*doc*/) { return true; } + /// Visit a document. + virtual bool VisitExit(const XMLDocument& /*doc*/) { return true; } + + /// Visit an element. + virtual bool VisitEnter(const XMLElement& /*element*/, const XMLAttribute* /*firstAttribute*/) { return true; } + /// Visit an element. + virtual bool VisitExit(const XMLElement& /*element*/) { return true; } + + /// Visit a declaration. + virtual bool Visit(const XMLDeclaration& /*declaration*/) { return true; } + /// Visit a text node. + virtual bool Visit(const XMLText& /*text*/) { return true; } + /// Visit a comment node. + virtual bool Visit(const XMLComment& /*comment*/) { return true; } + /// Visit an unknown node. + virtual bool Visit(const XMLUnknown& /*unknown*/) { return true; } + }; + + // WARNING: must match XMLDocument::_errorNames[] + enum XMLError + { + XML_SUCCESS = 0, + XML_NO_ATTRIBUTE, + XML_WRONG_ATTRIBUTE_TYPE, + XML_ERROR_FILE_NOT_FOUND, + XML_ERROR_FILE_COULD_NOT_BE_OPENED, + XML_ERROR_FILE_READ_ERROR, + XML_ERROR_PARSING_ELEMENT, + XML_ERROR_PARSING_ATTRIBUTE, + XML_ERROR_PARSING_TEXT, + XML_ERROR_PARSING_CDATA, + XML_ERROR_PARSING_COMMENT, + XML_ERROR_PARSING_DECLARATION, + XML_ERROR_PARSING_UNKNOWN, + XML_ERROR_EMPTY_DOCUMENT, + XML_ERROR_MISMATCHED_ELEMENT, + XML_ERROR_PARSING, + XML_CAN_NOT_CONVERT_TEXT, + XML_NO_TEXT_NODE, + XML_ELEMENT_DEPTH_EXCEEDED, + + XML_ERROR_COUNT + }; + + + /* + Utility functionality. + */ + class TINYXML2_LIB XMLUtil + { + public: + static const char* SkipWhiteSpace(const char* p, int* curLineNumPtr) + { + TIXMLASSERT(p); + + while (IsWhiteSpace(*p)) + { + if (curLineNumPtr && *p == '\n') { ++(*curLineNumPtr); } + ++p; + } + TIXMLASSERT(p); + return p; + } + + static char* SkipWhiteSpace(char* p, int* curLineNumPtr) { return const_cast(SkipWhiteSpace(const_cast(p), curLineNumPtr)); } + + // Anything in the high order range of UTF-8 is assumed to not be whitespace. This isn't + // correct, but simple, and usually works. + static bool IsWhiteSpace(const char p) { return !IsUTF8Continuation(p) && isspace(static_cast(p)); } + + static bool IsNameStartChar(const unsigned char ch) + { + if (ch >= 128) { return true; } // This is a heuristic guess in attempt to not implement Unicode-aware isalpha() + if (isalpha(ch)) { return true; } + return ch == ':' || ch == '_'; + } + + static bool IsNameChar(const unsigned char ch) { return IsNameStartChar(ch) || isdigit(ch) || ch == '.' || ch == '-'; } + + static bool StringEqual(const char* p, const char* q, const int nChar = INT_MAX) + { + if (p == q) { return true; } + TIXMLASSERT(p); + TIXMLASSERT(q); + TIXMLASSERT(nChar >= 0); + return strncmp(p, q, nChar) == 0; + } + + static bool IsUTF8Continuation(const char p) { return (p & 0x80) != 0; } + + static const char* ReadBOM(const char* p, bool* bom); + // p is the starting location, + // the UTF-8 value of the entity will be placed in value, and length filled in. + static const char* GetCharacterRef(const char* p, char* value, int* length); + static void ConvertUTF32ToUTF8(unsigned long input, char* output, int* length); + + // converts primitive types to strings + static void ToStr(int value, char* buffer, int size); + static void ToStr(unsigned value, char* buffer, int size); + static void ToStr(bool value, char* buffer, int size); + static void ToStr(float value, char* buffer, int size); + static void ToStr(double value, char* buffer, int size); + static void ToStr(int64_t value, char* buffer, int size); + + // converts strings to primitive types + static bool ToInt(const char* str, int* value); + static bool ToUnsigned(const char* str, unsigned* value); + static bool ToBool(const char* str, bool* value); + static bool ToFloat(const char* str, float* value); + static bool ToDouble(const char* str, double* value); + static bool ToInt64(const char* str, int64_t* value); + + // Changes what is serialized for a boolean value. + // Default to "true" and "false". Shouldn't be changed + // unless you have a special testing or compatibility need. + // Be careful: static, global, & not thread safe. + // Be sure to set static const memory as parameters. + static void SetBoolSerialization(const char* writeTrue, const char* writeFalse); + + private: + static const char* writeBoolTrue; + static const char* writeBoolFalse; + }; + + + /** XMLNode is a base class for every object that is in the + XML Document Object Model (DOM), except XMLAttributes. + Nodes have siblings, a parent, and children which can + be navigated. A node is always in a XMLDocument. + The type of a XMLNode can be queried, and it can + be cast to its more defined type. + + A XMLDocument allocates memory for all its Nodes. + When the XMLDocument gets deleted, all its Nodes + will also be deleted. + + @verbatim + A Document can contain: Element (container or leaf) + Comment (leaf) + Unknown (leaf) + Declaration( leaf ) + + An Element can contain: Element (container or leaf) + Text (leaf) + Attributes (not on tree) + Comment (leaf) + Unknown (leaf) + + @endverbatim + */ + class TINYXML2_LIB XMLNode + { + friend class XMLDocument; + friend class XMLElement; + public: + + /// Get the XMLDocument that owns this XMLNode. + const XMLDocument* GetDocument() const + { + TIXMLASSERT(_document); + return _document; + } + /// Get the XMLDocument that owns this XMLNode. + XMLDocument* GetDocument() + { + TIXMLASSERT(_document); + return _document; + } + + /// Safely cast to an Element, or null. + virtual XMLElement* ToElement() { return nullptr; } + /// Safely cast to Text, or null. + virtual XMLText* ToText() { return nullptr; } + /// Safely cast to a Comment, or null. + virtual XMLComment* ToComment() { return nullptr; } + /// Safely cast to a Document, or null. + virtual XMLDocument* ToDocument() { return nullptr; } + /// Safely cast to a Declaration, or null. + virtual XMLDeclaration* ToDeclaration() { return nullptr; } + /// Safely cast to an Unknown, or null. + virtual XMLUnknown* ToUnknown() { return nullptr; } + + virtual const XMLElement* ToElement() const { return nullptr; } + virtual const XMLText* ToText() const { return nullptr; } + virtual const XMLComment* ToComment() const { return nullptr; } + virtual const XMLDocument* ToDocument() const { return nullptr; } + virtual const XMLDeclaration* ToDeclaration() const { return nullptr; } + virtual const XMLUnknown* ToUnknown() const { return nullptr; } + + /** The meaning of 'value' changes for the specific type. + @verbatim + Document: empty (NULL is returned, not an empty string) + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text string + @endverbatim + */ + const char* Value() const; + + /** Set the Value of an XML node. + @sa Value() + */ + void SetValue(const char* val, bool staticMem = false); + + /// Gets the line number the node is in, if the document was parsed from a file. + int GetLineNum() const { return _parseLineNum; } + + /// Get the parent of this node on the DOM. + const XMLNode* Parent() const { return _parent; } + + XMLNode* Parent() { return _parent; } + + /// Returns true if this node has no children. + bool NoChildren() const { return !_firstChild; } + + /// Get the first child node, or null if none exists. + const XMLNode* FirstChild() const { return _firstChild; } + + XMLNode* FirstChild() { return _firstChild; } + + /** Get the first child element, or optionally the first child + element with the specified name. + */ + const XMLElement* FirstChildElement(const char* name = nullptr) const; + + XMLElement* FirstChildElement(const char* name = nullptr) { return const_cast(const_cast(this)->FirstChildElement(name)); } + + /// Get the last child node, or null if none exists. + const XMLNode* LastChild() const { return _lastChild; } + + XMLNode* LastChild() { return _lastChild; } + + /** Get the last child element or optionally the last child + element with the specified name. + */ + const XMLElement* LastChildElement(const char* name = nullptr) const; + + XMLElement* LastChildElement(const char* name = nullptr) { return const_cast(const_cast(this)->LastChildElement(name)); } + + /// Get the previous (left) sibling node of this node. + const XMLNode* PreviousSibling() const { return _prev; } + + XMLNode* PreviousSibling() { return _prev; } + + /// Get the previous (left) sibling element of this node, with an optionally supplied name. + const XMLElement* PreviousSiblingElement(const char* name = nullptr) const; + + XMLElement* PreviousSiblingElement(const char* name = nullptr) + { + return const_cast(const_cast(this)->PreviousSiblingElement(name)); + } + + /// Get the next (right) sibling node of this node. + const XMLNode* NextSibling() const { return _next; } + + XMLNode* NextSibling() { return _next; } + + /// Get the next (right) sibling element of this node, with an optionally supplied name. + const XMLElement* NextSiblingElement(const char* name = nullptr) const; + + XMLElement* NextSiblingElement(const char* name = nullptr) + { + return const_cast(const_cast(this)->NextSiblingElement(name)); + } + + /** + Add a child node as the last (right) child. + If the child node is already part of the document, + it is moved from its old location to the new location. + Returns the addThis argument or 0 if the node does not + belong to the same document. + */ + XMLNode* InsertEndChild(XMLNode* addThis); + + XMLNode* LinkEndChild(XMLNode* addThis) { return InsertEndChild(addThis); } + /** + Add a child node as the first (left) child. + If the child node is already part of the document, + it is moved from its old location to the new location. + Returns the addThis argument or 0 if the node does not + belong to the same document. + */ + XMLNode* InsertFirstChild(XMLNode* addThis); + /** + Add a node after the specified child node. + If the child node is already part of the document, + it is moved from its old location to the new location. + Returns the addThis argument or 0 if the afterThis node + is not a child of this node, or if the node does not + belong to the same document. + */ + XMLNode* InsertAfterChild(XMLNode* afterThis, XMLNode* addThis); + + /** + Delete all the children of this node. + */ + void DeleteChildren(); + + /** + Delete a child of this node. + */ + void DeleteChild(XMLNode* node); + + /** + Make a copy of this node, but not its children. + You may pass in a Document pointer that will be + the owner of the new Node. If the 'document' is + null, then the node returned will be allocated + from the current Document. (this->GetDocument()) + + Note: if called on a XMLDocument, this will return null. + */ + virtual XMLNode* ShallowClone(XMLDocument* document) const = 0; + + /** + Make a copy of this node and all its children. + + If the 'target' is null, then the nodes will + be allocated in the current document. If 'target' + is specified, the memory will be allocated is the + specified XMLDocument. + + NOTE: This is probably not the correct tool to + copy a document, since XMLDocuments can have multiple + top level XMLNodes. You probably want to use + XMLDocument::DeepCopy() + */ + XMLNode* DeepClone(XMLDocument* target) const; + + /** + Test if 2 nodes are the same, but don't test children. + The 2 nodes do not need to be in the same Document. + + Note: if called on a XMLDocument, this will return false. + */ + virtual bool ShallowEqual(const XMLNode* compare) const = 0; + + /** Accept a hierarchical visit of the nodes in the TinyXML-2 DOM. Every node in the + XML tree will be conditionally visited and the host will be called back + via the XMLVisitor interface. + + This is essentially a SAX interface for TinyXML-2. (Note however it doesn't re-parse + the XML for the callbacks, so the performance of TinyXML-2 is unchanged by using this + interface versus any other.) + + The interface has been based on ideas from: + + - http://www.saxproject.org/ + - http://c2.com/cgi/wiki?HierarchicalVisitorPattern + + Which are both good references for "visiting". + + An example of using Accept(): + @verbatim + XMLPrinter printer; + tinyxmlDoc.Accept( &printer ); + const char* xmlcstr = printer.CStr(); + @endverbatim + */ + virtual bool Accept(XMLVisitor* visitor) const = 0; + + /** + Set user data into the XMLNode. TinyXML-2 in + no way processes or interprets user data. + It is initially 0. + */ + void SetUserData(void* userData) { _userData = userData; } + + /** + Get user data set into the XMLNode. TinyXML-2 in + no way processes or interprets user data. + It is initially 0. + */ + void* GetUserData() const { return _userData; } + + protected: + explicit XMLNode(XMLDocument* doc); + virtual ~XMLNode(); + + virtual char* ParseDeep(char* p, StrPair* parentEndTag, int* curLineNumPtr); + + XMLDocument* _document = nullptr; + XMLNode* _parent = nullptr; + mutable StrPair _value; + int _parseLineNum = 0; + + XMLNode* _firstChild = nullptr; + XMLNode* _lastChild = nullptr; + + XMLNode* _prev = nullptr; + XMLNode* _next = nullptr; + + void* _userData = nullptr; + + private: + MemPool* _memPool; + void Unlink(XMLNode* child); + static void DeleteNode(XMLNode* node); + void InsertChildPreamble(XMLNode* insertThis) const; + const XMLElement* ToElementWithName(const char* name) const; + + XMLNode(const XMLNode&) = delete; // not supported + XMLNode& operator=(const XMLNode&) = delete; // not supported + }; + + + /** XML text. + + Note that a text node can have child element nodes, for example: + @verbatim + This is bold + @endverbatim + + A text node can have 2 ways to output the next. "normal" output + and CDATA. It will default to the mode it was parsed from the XML file and + you generally want to leave it alone, but you can change the output mode with + SetCData() and query it with CData(). + */ + class TINYXML2_LIB XMLText : public XMLNode + { + friend class XMLDocument; + public: + bool Accept(XMLVisitor* visitor) const override; + XMLText* ToText() override { return this; } + const XMLText* ToText() const override { return this; } + + /// Declare whether this should be CDATA or standard text. + void SetCData(const bool isCData) { _isCData = isCData; } + /// Returns true if this is a CDATA text element. + bool CData() const { return _isCData; } + XMLNode* ShallowClone(XMLDocument* doc) const override; + bool ShallowEqual(const XMLNode* compare) const override; + + protected: + explicit XMLText(XMLDocument* doc) : XMLNode(doc), _isCData(false) {} + ~XMLText() override {} + + char* ParseDeep(char* p, StrPair* parentEndTag, int* curLineNumPtr) override; + + private: + bool _isCData; + + XMLText(const XMLText&) = delete; // not supported + XMLText& operator=(const XMLText&) = delete; // not supported + }; + + + /** An XML Comment. */ + class TINYXML2_LIB XMLComment : public XMLNode + { + friend class XMLDocument; + public: + XMLComment* ToComment() override { return this; } + const XMLComment* ToComment() const override { return this; } + bool Accept(XMLVisitor* visitor) const override; + XMLNode* ShallowClone(XMLDocument* doc) const override; + bool ShallowEqual(const XMLNode* compare) const override; + + protected: + explicit XMLComment(XMLDocument* doc) : XMLNode(doc) { } + ~XMLComment() override { } + + char* ParseDeep(char* p, StrPair* parentEndTag, int* curLineNumPtr) override; + + private: + XMLComment(const XMLComment&) = delete; // not supported + XMLComment& operator=(const XMLComment&) = delete; // not supported + }; + + + /** In correct XML the declaration is the first entry in the file. + @verbatim + + @endverbatim + + TinyXML-2 will happily read or write files without a declaration, + however. + + The text of the declaration isn't interpreted. It is parsed + and written as a string. + */ + class TINYXML2_LIB XMLDeclaration : public XMLNode + { + friend class XMLDocument; + public: + XMLDeclaration* ToDeclaration() override { return this; } + const XMLDeclaration* ToDeclaration() const override { return this; } + bool Accept(XMLVisitor* visitor) const override; + XMLNode* ShallowClone(XMLDocument* doc) const override; + bool ShallowEqual(const XMLNode* compare) const override; + + protected: + explicit XMLDeclaration(XMLDocument* doc) : XMLNode(doc) { } + ~XMLDeclaration() override { } + + char* ParseDeep(char* p, StrPair* parentEndTag, int* curLineNumPtr) override; + + private: + XMLDeclaration(const XMLDeclaration&) = delete; // not supported + XMLDeclaration& operator=(const XMLDeclaration&) = delete; // not supported + }; + + + /** Any tag that TinyXML-2 doesn't recognize is saved as an + unknown. It is a tag of text, but should not be modified. + It will be written back to the XML, unchanged, when the file + is saved. + + DTD tags get thrown into XMLUnknowns. + */ + class TINYXML2_LIB XMLUnknown : public XMLNode + { + friend class XMLDocument; + public: + XMLUnknown* ToUnknown() override { return this; } + const XMLUnknown* ToUnknown() const override { return this; } + bool Accept(XMLVisitor* visitor) const override; + XMLNode* ShallowClone(XMLDocument* doc) const override; + bool ShallowEqual(const XMLNode* compare) const override; + + protected: + explicit XMLUnknown(XMLDocument* doc) : XMLNode(doc) { } + ~XMLUnknown() override { } + + char* ParseDeep(char* p, StrPair* parentEndTag, int* curLineNumPtr) override; + + private: + XMLUnknown(const XMLUnknown&) = delete; // not supported + XMLUnknown& operator=(const XMLUnknown&) = delete; // not supported + }; + + + + /** An attribute is a name-value pair. Elements have an arbitrary + number of attributes, each with a unique name. + + @note The attributes are not XMLNodes. You may only query the + Next() attribute in a list. + */ + class TINYXML2_LIB XMLAttribute + { + friend class XMLElement; + public: + /// The name of the attribute. + const char* Name() const { return _name.GetStr(); } + + /// The value of the attribute. + const char* Value() const { return _value.GetStr(); } + + /// Gets the line number the attribute is in, if the document was parsed from a file. + int GetLineNum() const { return _parseLineNum; } + + /// The next attribute in the list. + const XMLAttribute* Next() const { return _next; } + + /** IntValue interprets the attribute as an integer, and returns the value. + If the value isn't an integer, 0 will be returned. There is no error checking; + use QueryIntValue() if you need error checking. + */ + int IntValue() const + { + int i = 0; + QueryIntValue(&i); + return i; + } + + int64_t Int64Value() const + { + int64_t i = 0; + QueryInt64Value(&i); + return i; + } + + /// Query as an unsigned integer. See IntValue() + unsigned UnsignedValue() const + { + unsigned i = 0; + QueryUnsignedValue(&i); + return i; + } + /// Query as a boolean. See IntValue() + bool BoolValue() const + { + bool b = false; + QueryBoolValue(&b); + return b; + } + /// Query as a double. See IntValue() + double DoubleValue() const + { + double d = 0; + QueryDoubleValue(&d); + return d; + } + /// Query as a float. See IntValue() + float FloatValue() const + { + float f = 0; + QueryFloatValue(&f); + return f; + } + + /** QueryIntValue interprets the attribute as an integer, and returns the value + in the provided parameter. The function will return XML_SUCCESS on success, + and XML_WRONG_ATTRIBUTE_TYPE if the conversion is not successful. + */ + XMLError QueryIntValue(int* value) const; + /// See QueryIntValue + XMLError QueryUnsignedValue(unsigned int* value) const; + /// See QueryIntValue + XMLError QueryInt64Value(int64_t* value) const; + /// See QueryIntValue + XMLError QueryBoolValue(bool* value) const; + /// See QueryIntValue + XMLError QueryDoubleValue(double* value) const; + /// See QueryIntValue + XMLError QueryFloatValue(float* value) const; + + /// Set the attribute to a string value. + void SetAttribute(const char* value) { _value.SetStr(value); } + /// Set the attribute to value. + void SetAttribute(int value); + /// Set the attribute to value. + void SetAttribute(unsigned value); + /// Set the attribute to value. + void SetAttribute(int64_t value); + /// Set the attribute to value. + void SetAttribute(bool value); + /// Set the attribute to value. + void SetAttribute(double value); + /// Set the attribute to value. + void SetAttribute(float value); + + private: + enum { BUF_SIZE = 200 }; + + XMLAttribute() {} + virtual ~XMLAttribute() {} + + XMLAttribute(const XMLAttribute&) = delete; // not supported + void operator=(const XMLAttribute&) = delete; // not supported + void SetName(const char* name) { _name.SetStr(name); } + + char* ParseDeep(char* p, bool processEntities, int* curLineNumPtr); + + mutable StrPair _name; + mutable StrPair _value; + int _parseLineNum = 0; + XMLAttribute* _next = nullptr; + MemPool* _memPool = nullptr; + }; + + + /** The element is a container class. It has a value, the element name, + and can contain other elements, text, comments, and unknowns. + Elements also contain an arbitrary number of attributes. + */ + class TINYXML2_LIB XMLElement : public XMLNode + { + friend class XMLDocument; + public: + /// Get the name of an element (which is the Value() of the node.) + const char* Name() const { return Value(); } + /// Set the name of the element. + void SetName(const char* str, const bool staticMem = false) { SetValue(str, staticMem); } + XMLElement* ToElement() override { return this; } + const XMLElement* ToElement() const override { return this; } + bool Accept(XMLVisitor* visitor) const override; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none + exists. For example: + + @verbatim + const char* value = ele->Attribute( "foo" ); + @endverbatim + + The 'value' parameter is normally null. However, if specified, + the attribute will only be returned if the 'name' and 'value' + match. This allow you to write code: + + @verbatim + if ( ele->Attribute( "foo", "bar" ) ) callFooIsBar(); + @endverbatim + + rather than: + @verbatim + if ( ele->Attribute( "foo" ) ) { if ( strcmp( ele->Attribute( "foo" ), "bar" ) == 0 ) callFooIsBar(); } + @endverbatim + */ + const char* Attribute(const char* name, const char* value = nullptr) const; + + /** Given an attribute name, IntAttribute() returns the value + of the attribute interpreted as an integer. The default + value will be returned if the attribute isn't present, + or if there is an error. (For a method with error + checking, see QueryIntAttribute()). + */ + int IntAttribute(const char* name, int defaultValue = 0) const; + /// See IntAttribute() + unsigned UnsignedAttribute(const char* name, unsigned defaultValue = 0) const; + /// See IntAttribute() + int64_t Int64Attribute(const char* name, int64_t defaultValue = 0) const; + /// See IntAttribute() + bool BoolAttribute(const char* name, bool defaultValue = false) const; + /// See IntAttribute() + double DoubleAttribute(const char* name, double defaultValue = 0) const; + /// See IntAttribute() + float FloatAttribute(const char* name, float defaultValue = 0) const; + + /** Given an attribute name, QueryIntAttribute() returns + XML_SUCCESS, XML_WRONG_ATTRIBUTE_TYPE if the conversion + can't be performed, or XML_NO_ATTRIBUTE if the attribute + doesn't exist. If successful, the result of the conversion + will be written to 'value'. If not successful, nothing will + be written to 'value'. This allows you to provide default + value: + + @verbatim + int value = 10; + QueryIntAttribute( "foo", &value ); // if "foo" isn't found, value will still be 10 + @endverbatim + */ + XMLError QueryIntAttribute(const char* name, int* value) const + { + const XMLAttribute* a = FindAttribute(name); + if (!a) { return XML_NO_ATTRIBUTE; } + return a->QueryIntValue(value); + } + + /// See QueryIntAttribute() + XMLError QueryUnsignedAttribute(const char* name, unsigned int* value) const + { + const XMLAttribute* a = FindAttribute(name); + if (!a) { return XML_NO_ATTRIBUTE; } + return a->QueryUnsignedValue(value); + } + + /// See QueryIntAttribute() + XMLError QueryInt64Attribute(const char* name, int64_t* value) const + { + const XMLAttribute* a = FindAttribute(name); + if (!a) { return XML_NO_ATTRIBUTE; } + return a->QueryInt64Value(value); + } + + /// See QueryIntAttribute() + XMLError QueryBoolAttribute(const char* name, bool* value) const + { + const XMLAttribute* a = FindAttribute(name); + if (!a) { return XML_NO_ATTRIBUTE; } + return a->QueryBoolValue(value); + } + /// See QueryIntAttribute() + XMLError QueryDoubleAttribute(const char* name, double* value) const + { + const XMLAttribute* a = FindAttribute(name); + if (!a) { return XML_NO_ATTRIBUTE; } + return a->QueryDoubleValue(value); + } + /// See QueryIntAttribute() + XMLError QueryFloatAttribute(const char* name, float* value) const + { + const XMLAttribute* a = FindAttribute(name); + if (!a) { return XML_NO_ATTRIBUTE; } + return a->QueryFloatValue(value); + } + + /// See QueryIntAttribute() + XMLError QueryStringAttribute(const char* name, const char** value) const + { + const XMLAttribute* a = FindAttribute(name); + if (!a) { return XML_NO_ATTRIBUTE; } + *value = a->Value(); + return XML_SUCCESS; + } + + + + /** Given an attribute name, QueryAttribute() returns + XML_SUCCESS, XML_WRONG_ATTRIBUTE_TYPE if the conversion + can't be performed, or XML_NO_ATTRIBUTE if the attribute + doesn't exist. It is overloaded for the primitive types, + and is a generally more convenient replacement of + QueryIntAttribute() and related functions. + + If successful, the result of the conversion + will be written to 'value'. If not successful, nothing will + be written to 'value'. This allows you to provide default + value: + + @verbatim + int value = 10; + QueryAttribute( "foo", &value ); // if "foo" isn't found, value will still be 10 + @endverbatim + */ + XMLError QueryAttribute(const char* name, int* value) const { return QueryIntAttribute(name, value); } + XMLError QueryAttribute(const char* name, unsigned int* value) const { return QueryUnsignedAttribute(name, value); } + XMLError QueryAttribute(const char* name, int64_t* value) const { return QueryInt64Attribute(name, value); } + XMLError QueryAttribute(const char* name, bool* value) const { return QueryBoolAttribute(name, value); } + XMLError QueryAttribute(const char* name, double* value) const { return QueryDoubleAttribute(name, value); } + XMLError QueryAttribute(const char* name, float* value) const { return QueryFloatAttribute(name, value); } + + /// Sets the named attribute to value. + void SetAttribute(const char* name, const char* value) + { + XMLAttribute* a = FindOrCreateAttribute(name); + a->SetAttribute(value); + } + /// Sets the named attribute to value. + void SetAttribute(const char* name, const int value) + { + XMLAttribute* a = FindOrCreateAttribute(name); + a->SetAttribute(value); + } + /// Sets the named attribute to value. + void SetAttribute(const char* name, const unsigned value) + { + XMLAttribute* a = FindOrCreateAttribute(name); + a->SetAttribute(value); + } + + /// Sets the named attribute to value. + void SetAttribute(const char* name, const int64_t value) + { + XMLAttribute* a = FindOrCreateAttribute(name); + a->SetAttribute(value); + } + + /// Sets the named attribute to value. + void SetAttribute(const char* name, const bool value) + { + XMLAttribute* a = FindOrCreateAttribute(name); + a->SetAttribute(value); + } + /// Sets the named attribute to value. + void SetAttribute(const char* name, const double value) + { + XMLAttribute* a = FindOrCreateAttribute(name); + a->SetAttribute(value); + } + /// Sets the named attribute to value. + void SetAttribute(const char* name, const float value) + { + XMLAttribute* a = FindOrCreateAttribute(name); + a->SetAttribute(value); + } + + /** + Delete an attribute. + */ + void DeleteAttribute(const char* name); + + /// Return the first attribute in the list. + const XMLAttribute* FirstAttribute() const { return _rootAttribute; } + /// Query a specific attribute in the list. + const XMLAttribute* FindAttribute(const char* name) const; + + /** Convenience function for easy access to the text inside an element. Although easy + and concise, GetText() is limited compared to getting the XMLText child + and accessing it directly. + + If the first child of 'this' is a XMLText, the GetText() + returns the character string of the Text node, else null is returned. + + This is a convenient method for getting the text of simple contained text: + @verbatim + This is text + const char* str = fooElement->GetText(); + @endverbatim + + 'str' will be a pointer to "This is text". + + Note that this function can be misleading. If the element foo was created from + this XML: + @verbatim + This is text + @endverbatim + + then the value of str would be null. The first child node isn't a text node, it is + another element. From this XML: + @verbatim + This is text + @endverbatim + GetText() will return "This is ". + */ + const char* GetText() const; + + /** Convenience function for easy access to the text inside an element. Although easy + and concise, SetText() is limited compared to creating an XMLText child + and mutating it directly. + + If the first child of 'this' is a XMLText, SetText() sets its value to + the given string, otherwise it will create a first child that is an XMLText. + + This is a convenient method for setting the text of simple contained text: + @verbatim + This is text + fooElement->SetText( "Hullaballoo!" ); + Hullaballoo! + @endverbatim + + Note that this function can be misleading. If the element foo was created from + this XML: + @verbatim + This is text + @endverbatim + + then it will not change "This is text", but rather prefix it with a text element: + @verbatim + Hullaballoo!This is text + @endverbatim + + For this XML: + @verbatim + + @endverbatim + SetText() will generate + @verbatim + Hullaballoo! + @endverbatim + */ + void SetText(const char* inText); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText(int value); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText(unsigned value); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText(int64_t value); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText(bool value); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText(double value); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText(float value); + + /** + Convenience method to query the value of a child text node. This is probably best + shown by example. Given you have a document is this form: + @verbatim + + 1 + 1.4 + + @endverbatim + + The QueryIntText() and similar functions provide a safe and easier way to get to the + "value" of x and y. + + @verbatim + int x = 0; + float y = 0; // types of x and y are contrived for example + const XMLElement* xElement = pointElement->FirstChildElement( "x" ); + const XMLElement* yElement = pointElement->FirstChildElement( "y" ); + xElement->QueryIntText( &x ); + yElement->QueryFloatText( &y ); + @endverbatim + + @returns XML_SUCCESS (0) on success, XML_CAN_NOT_CONVERT_TEXT if the text cannot be converted + to the requested type, and XML_NO_TEXT_NODE if there is no child text to query. + + */ + XMLError QueryIntText(int* val) const; + /// See QueryIntText() + XMLError QueryUnsignedText(unsigned* val) const; + /// See QueryIntText() + XMLError QueryInt64Text(int64_t* val) const; + /// See QueryIntText() + XMLError QueryBoolText(bool* val) const; + /// See QueryIntText() + XMLError QueryDoubleText(double* val) const; + /// See QueryIntText() + XMLError QueryFloatText(float* val) const; + + int IntText(int defaultValue = 0) const; + + /// See QueryIntText() + unsigned UnsignedText(unsigned defaultValue = 0) const; + /// See QueryIntText() + int64_t Int64Text(int64_t defaultValue = 0) const; + /// See QueryIntText() + bool BoolText(bool defaultValue = false) const; + /// See QueryIntText() + double DoubleText(double defaultValue = 0) const; + /// See QueryIntText() + float FloatText(float defaultValue = 0) const; + + // internal: + enum ElementClosingType + { + OPEN, // + CLOSED, // + CLOSING // + }; + + ElementClosingType ClosingType() const { return _closingType; } + XMLNode* ShallowClone(XMLDocument* doc) const override; + bool ShallowEqual(const XMLNode* compare) const override; + + protected: + char* ParseDeep(char* p, StrPair* parentEndTag, int* curLineNumPtr) override; + + private: + explicit XMLElement(XMLDocument* doc) : XMLNode(doc) { } + ~XMLElement() override; + XMLElement(const XMLElement&) = delete; // not supported + void operator=(const XMLElement&) = delete; // not supported + + XMLAttribute* FindOrCreateAttribute(const char* name); + char* ParseAttributes(char* p, int* curLineNumPtr); + static void DeleteAttribute(XMLAttribute* attribute); + XMLAttribute* CreateAttribute(); + + enum { BUF_SIZE = 200 }; + + ElementClosingType _closingType = OPEN; + // The attribute list is ordered; there is no 'lastAttribute' + // because the list needs to be scanned for dupes before adding + // a new attribute. + XMLAttribute* _rootAttribute = nullptr; + }; + + + enum Whitespace + { + PRESERVE_WHITESPACE, + COLLAPSE_WHITESPACE + }; + + + /** A Document binds together all the functionality. + It can be saved, loaded, and printed to the screen. + All Nodes are connected and allocated to a Document. + If the Document is deleted, all its Nodes are also deleted. + */ + class TINYXML2_LIB XMLDocument : public XMLNode + { + friend class XMLElement; + // Gives access to SetError and Push/PopDepth, but over-access for everything else. + // Wishing C++ had "internal" scope. + friend class XMLNode; + friend class XMLText; + friend class XMLComment; + friend class XMLDeclaration; + friend class XMLUnknown; + public: + /// constructor + explicit XMLDocument(bool processEntities = true, Whitespace whitespaceMode = PRESERVE_WHITESPACE); + ~XMLDocument() override; + + XMLDocument* ToDocument() override + { + TIXMLASSERT(this == _document); + return this; + } + + const XMLDocument* ToDocument() const override + { + TIXMLASSERT(this == _document); + return this; + } + + /** + Parse an XML file from a character string. + Returns XML_SUCCESS (0) on success, or an errorID. + + You may optionally pass in the 'nBytes', which is the number of bytes which will be parsed. + If not specified, TinyXML-2 will assume 'xml' points to a null terminated string. + */ + XMLError Parse(const char* xml, size_t len = size_t(-1)); + + /** + Load an XML file from disk. + Returns XML_SUCCESS (0) on success, or + an errorID. + */ + XMLError LoadFile(const char* filename); + + /** + Load an XML file from disk. You are responsible + for providing and closing the FILE*. + + NOTE: The file should be opened as binary ("rb") + not text in order for TinyXML-2 to correctly + do newline normalization. + + Returns XML_SUCCESS (0) on success, or + an errorID. + */ + XMLError LoadFile(FILE* fp); + + /** + Save the XML file to disk. + Returns XML_SUCCESS (0) on success, or + an errorID. + */ + XMLError SaveFile(const char* filename, bool compact = false); + + /** + Save the XML file to disk. You are responsible + for providing and closing the FILE*. + + Returns XML_SUCCESS (0) on success, or + an errorID. + */ + XMLError SaveFile(FILE* fp, bool compact = false); + + bool ProcessEntities() const { return _processEntities; } + Whitespace WhitespaceMode() const { return _whitespaceMode; } + + /// Returns true if this document has a leading Byte Order Mark of UTF8. + bool HasBOM() const { return _writeBOM; } + /// Sets whether to write the BOM when writing the file. + void SetBOM(const bool useBOM) { _writeBOM = useBOM; } + + /// Return the root element of DOM. Equivalent to FirstChildElement(). To get the first node, use FirstChild(). + XMLElement* RootElement() { return FirstChildElement(); } + const XMLElement* RootElement() const { return FirstChildElement(); } + + /** Print the Document. If the Printer is not provided, it will + print to stdout. If you provide Printer, this can print to a file: + @verbatim + XMLPrinter printer( fp ); + doc.Print( &printer ); + @endverbatim + + Or you can use a printer to print to memory: + @verbatim + XMLPrinter printer; + doc.Print( &printer ); + // printer.CStr() has a const char* to the XML + @endverbatim + */ + void Print(XMLPrinter* streamer = nullptr) const; + bool Accept(XMLVisitor* visitor) const override; + + /// Create a new Element associated with this Document. The memory for the Element is managed by the Document. + XMLElement* NewElement(const char* name); + /// Create a new Comment associated with this Document. The memory for the Comment is managed by the Document. + XMLComment* NewComment(const char* str); + /// Create a new Text associated with this Document. The memory for the Text is managed by the Document. */ + XMLText* NewText(const char* str); + /** + Create a new Declaration associated with this Document. The memory for the object is managed by the Document. + + If the 'text' param is null, the standard declaration is used.: + @verbatim + + @endverbatim + */ + XMLDeclaration* NewDeclaration(const char* str = nullptr); + /// Create a new Unknown associated with this Document. The memory for the object is managed by the Document. + XMLUnknown* NewUnknown(const char* str); + /// Delete a node associated with this document. It will be unlinked from the DOM. + void DeleteNode(XMLNode* node); + + void ClearError() { SetError(XML_SUCCESS, 0, nullptr); } + + /// Return true if there was an error parsing the document. + bool Error() const { return _errorID != XML_SUCCESS; } + /// Return the errorID. + XMLError ErrorID() const { return _errorID; } + const char* ErrorName() const { return ErrorIDToName(_errorID); } + static const char* ErrorIDToName(XMLError errorID); + + /** Returns a "long form" error description. A hopefully helpful + diagnostic with location, line number, and/or additional info. + */ + const char* ErrorStr() const { return _errorStr.Empty() ? "" : _errorStr.GetStr(); } + + /// A (trivial) utility function that prints the ErrorStr() to stdout. + void PrintError() const { printf("%s\n", ErrorStr()); } + + /// Return the line where the error occurred, or zero if unknown. + int ErrorLineNum() const { return _errorLineNum; } + + /// Clear the document, resetting it to the initial state. + void Clear(); + + /** + Copies this document to a target document. + The target will be completely cleared before the copy. + If you want to copy a sub-tree, see XMLNode::DeepClone(). + + NOTE: that the 'target' must be non-null. + */ + void DeepCopy(XMLDocument* target) const; + + // internal + char* Identify(char* p, XMLNode** node); + + // internal + void MarkInUse(XMLNode* node); + XMLNode* ShallowClone(XMLDocument* /*document*/) const override { return nullptr; } + bool ShallowEqual(const XMLNode* /*compare*/) const override { return false; } + + private: + XMLDocument(const XMLDocument&) = delete; // not supported + void operator=(const XMLDocument&) = delete; // not supported + + bool _writeBOM = false; + bool _processEntities = false; + XMLError _errorID = XML_SUCCESS; + Whitespace _whitespaceMode; + mutable StrPair _errorStr; + int _errorLineNum = 0; + char* _charBuffer = nullptr; + int _parseCurLineNum = 0; + int _parsingDepth = 0; + // Memory tracking does add some overhead. + // However, the code assumes that you don't + // have a bunch of unlinked nodes around. + // Therefore it takes less memory to track + // in the document vs. a linked list in the XMLNode, + // and the performance is the same. + DynArray _unlinked; + + MemPoolT _elementPool; + MemPoolT _attributePool; + MemPoolT _textPool; + MemPoolT _commentPool; + + static const char* _errorNames[XML_ERROR_COUNT]; + + void Parse(); + + void SetError(XMLError error, int lineNum, const char* format, ...); + + // Something of an obvious security hole, once it was discovered. + // Either an ill-formed XML or an excessively deep one can overflow + // the stack. Track stack depth, and error out if needed. + class DepthTracker + { + public: + explicit DepthTracker(XMLDocument* document) + { + this->_document = document; + document->PushDepth(); + } + + ~DepthTracker() { _document->PopDepth(); } + private: + XMLDocument* _document; + }; + + void PushDepth(); + void PopDepth(); + + template + NodeType* CreateUnlinkedNode(MemPoolT& pool); + }; + + template + NodeType* XMLDocument::CreateUnlinkedNode(MemPoolT& pool) + { + TIXMLASSERT(sizeof(NodeType) == PoolElementSize); + TIXMLASSERT(sizeof(NodeType) == pool.ItemSize()); + NodeType* returnNode = new(pool.Alloc()) NodeType(this); + TIXMLASSERT(returnNode); + returnNode->_memPool = &pool; + + _unlinked.Push(returnNode); + return returnNode; + } + + /** + A XMLHandle is a class that wraps a node pointer with null checks; this is + an incredibly useful thing. Note that XMLHandle is not part of the TinyXML-2 + DOM structure. It is a separate utility class. + + Take an example: + @verbatim + + + + + + + @endverbatim + + Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very + easy to write a *lot* of code that looks like: + + @verbatim + XMLElement* root = document.FirstChildElement( "Document" ); + if ( root ) + { + XMLElement* element = root->FirstChildElement( "Element" ); + if ( element ) + { + XMLElement* child = element->FirstChildElement( "Child" ); + if ( child ) + { + XMLElement* child2 = child->NextSiblingElement( "Child" ); + if ( child2 ) + { + // Finally do something useful. + @endverbatim + + And that doesn't even cover "else" cases. XMLHandle addresses the verbosity + of such code. A XMLHandle checks for null pointers so it is perfectly safe + and correct to use: + + @verbatim + XMLHandle docHandle( &document ); + XMLElement* child2 = docHandle.FirstChildElement( "Document" ).FirstChildElement( "Element" ).FirstChildElement().NextSiblingElement(); + if ( child2 ) + { + // do something useful + @endverbatim + + Which is MUCH more concise and useful. + + It is also safe to copy handles - internally they are nothing more than node pointers. + @verbatim + XMLHandle handleCopy = handle; + @endverbatim + + See also XMLConstHandle, which is the same as XMLHandle, but operates on const objects. + */ + class TINYXML2_LIB XMLHandle + { + public: + /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. + explicit XMLHandle(XMLNode* node) : _node(node) { } + /// Create a handle from a node. + explicit XMLHandle(XMLNode& node) : _node(&node) { } + /// Copy constructor + XMLHandle(const XMLHandle& ref) : _node(ref._node) { } + /// Assignment + XMLHandle& operator=(const XMLHandle& ref) + { + _node = ref._node; + return *this; + } + + /// Get the first child of this handle. + XMLHandle FirstChild() { return XMLHandle(_node ? _node->FirstChild() : nullptr); } + /// Get the first child element of this handle. + XMLHandle FirstChildElement(const char* name = nullptr) { return XMLHandle(_node ? _node->FirstChildElement(name) : nullptr); } + /// Get the last child of this handle. + XMLHandle LastChild() { return XMLHandle(_node ? _node->LastChild() : nullptr); } + /// Get the last child element of this handle. + XMLHandle LastChildElement(const char* name = nullptr) { return XMLHandle(_node ? _node->LastChildElement(name) : nullptr); } + /// Get the previous sibling of this handle. + XMLHandle PreviousSibling() { return XMLHandle(_node ? _node->PreviousSibling() : nullptr); } + /// Get the previous sibling element of this handle. + XMLHandle PreviousSiblingElement(const char* name = nullptr) { return XMLHandle(_node ? _node->PreviousSiblingElement(name) : nullptr); } + /// Get the next sibling of this handle. + XMLHandle NextSibling() { return XMLHandle(_node ? _node->NextSibling() : nullptr); } + /// Get the next sibling element of this handle. + XMLHandle NextSiblingElement(const char* name = nullptr) { return XMLHandle(_node ? _node->NextSiblingElement(name) : nullptr); } + + /// Safe cast to XMLNode. This can return null. + XMLNode* ToNode() { return _node; } + /// Safe cast to XMLElement. This can return null. + XMLElement* ToElement() { return (_node ? _node->ToElement() : nullptr); } + /// Safe cast to XMLText. This can return null. + XMLText* ToText() { return (_node ? _node->ToText() : nullptr); } + /// Safe cast to XMLUnknown. This can return null. + XMLUnknown* ToUnknown() { return (_node ? _node->ToUnknown() : nullptr); } + /// Safe cast to XMLDeclaration. This can return null. + XMLDeclaration* ToDeclaration() { return (_node ? _node->ToDeclaration() : nullptr); } + + private: + XMLNode* _node; + }; + + + /** + A variant of the XMLHandle class for working with const XMLNodes and Documents. It is the + same in all regards, except for the 'const' qualifiers. See XMLHandle for API. + */ + class TINYXML2_LIB XMLConstHandle + { + public: + explicit XMLConstHandle(const XMLNode* node) : _node(node) { } + explicit XMLConstHandle(const XMLNode& node) : _node(&node) { } + XMLConstHandle(const XMLConstHandle& ref) : _node(ref._node) { } + + XMLConstHandle& operator=(const XMLConstHandle& ref) + { + _node = ref._node; + return *this; + } + + XMLConstHandle FirstChild() const { return XMLConstHandle(_node ? _node->FirstChild() : nullptr); } + XMLConstHandle FirstChildElement(const char* name = nullptr) const { return XMLConstHandle(_node ? _node->FirstChildElement(name) : nullptr); } + XMLConstHandle LastChild() const { return XMLConstHandle(_node ? _node->LastChild() : nullptr); } + XMLConstHandle LastChildElement(const char* name = nullptr) const { return XMLConstHandle(_node ? _node->LastChildElement(name) : nullptr); } + XMLConstHandle PreviousSibling() const { return XMLConstHandle(_node ? _node->PreviousSibling() : nullptr); } + + XMLConstHandle PreviousSiblingElement(const char* name = nullptr) const + { + return XMLConstHandle(_node ? _node->PreviousSiblingElement(name) : nullptr); + } + + XMLConstHandle NextSibling() const { return XMLConstHandle(_node ? _node->NextSibling() : nullptr); } + XMLConstHandle NextSiblingElement(const char* name = nullptr) const { return XMLConstHandle(_node ? _node->NextSiblingElement(name) : nullptr); } + + const XMLNode* ToNode() const { return _node; } + const XMLElement* ToElement() const { return (_node ? _node->ToElement() : nullptr); } + const XMLText* ToText() const { return (_node ? _node->ToText() : nullptr); } + const XMLUnknown* ToUnknown() const { return (_node ? _node->ToUnknown() : nullptr); } + const XMLDeclaration* ToDeclaration() const { return (_node ? _node->ToDeclaration() : nullptr); } + + private: + const XMLNode* _node; + }; + + + /** + Printing functionality. The XMLPrinter gives you more + options than the XMLDocument::Print() method. + + It can: + -# Print to memory. + -# Print to a file you provide. + -# Print XML without a XMLDocument. + + Print to Memory + + @verbatim + XMLPrinter printer; + doc.Print( &printer ); + SomeFunction( printer.CStr() ); + @endverbatim + + Print to a File + + You provide the file pointer. + @verbatim + XMLPrinter printer( fp ); + doc.Print( &printer ); + @endverbatim + + Print without a XMLDocument + + When loading, an XML parser is very useful. However, sometimes + when saving, it just gets in the way. The code is often set up + for streaming, and constructing the DOM is just overhead. + + The Printer supports the streaming case. The following code + prints out a trivially simple XML file without ever creating + an XML document. + + @verbatim + XMLPrinter printer( fp ); + printer.OpenElement( "foo" ); + printer.PushAttribute( "foo", "bar" ); + printer.CloseElement(); + @endverbatim + */ + class TINYXML2_LIB XMLPrinter : public XMLVisitor + { + public: + /** Construct the printer. If the FILE* is specified, + this will print to the FILE. Else it will print + to memory, and the result is available in CStr(). + If 'compact' is set to true, then output is created + with only required whitespace and newlines. + */ + explicit XMLPrinter(FILE* file = nullptr, bool compact = false, int depth = 0); + ~XMLPrinter() override {} + + /** If streaming, write the BOM and declaration. */ + void PushHeader(bool writeBOM, bool writeDec); + /** If streaming, start writing an element. + The element must be closed with CloseElement() + */ + void OpenElement(const char* name, bool compactMode = false); + /// If streaming, add an attribute to an open element. + void PushAttribute(const char* name, const char* value); + void PushAttribute(const char* name, int value); + void PushAttribute(const char* name, unsigned value); + void PushAttribute(const char* name, int64_t value); + void PushAttribute(const char* name, bool value); + void PushAttribute(const char* name, double value); + /// If streaming, close the Element. + virtual void CloseElement(bool compactMode = false); + + /// Add a text node. + void PushText(const char* text, bool cdata = false); + /// Add a text node from an integer. + void PushText(int value); + /// Add a text node from an unsigned. + void PushText(unsigned value); + /// Add a text node from an unsigned. + void PushText(int64_t value); + /// Add a text node from a bool. + void PushText(bool value); + /// Add a text node from a float. + void PushText(float value); + /// Add a text node from a double. + void PushText(double value); + + /// Add a comment + void PushComment(const char* comment); + + void PushDeclaration(const char* value); + void PushUnknown(const char* value); + bool VisitEnter(const XMLDocument& /*doc*/) override; + bool VisitExit(const XMLDocument& /*doc*/) override { return true; } + bool VisitEnter(const XMLElement& element, const XMLAttribute* attribute) override; + bool VisitExit(const XMLElement& element) override; + bool Visit(const XMLText& text) override; + bool Visit(const XMLComment& comment) override; + bool Visit(const XMLDeclaration& declaration) override; + bool Visit(const XMLUnknown& unknown) override; + + /** + If in print to memory mode, return a pointer to + the XML file in memory. + */ + const char* CStr() const { return _buffer.Mem(); } + /** + If in print to memory mode, return the size + of the XML file in memory. (Note the size returned + includes the terminating null.) + */ + int CStrSize() const { return _buffer.Size(); } + /** + If in print to memory mode, reset the buffer to the + beginning. + */ + void ClearBuffer() + { + _buffer.Clear(); + _buffer.Push(0); + _firstElement = true; + } + + protected: + virtual bool CompactMode(const XMLElement& /*element*/) { return _compactMode; } + + /** Prints out the space before an element. You may override to change + the space and tabs used. A PrintSpace() override should call Print(). + */ + virtual void PrintSpace(const int depth) { for (int i = 0; i < depth; ++i) { Write(" "); } } + void Print(const char* format, ...); + void Write(const char* data, size_t size); + void Write(const char* data) { Write(data, strlen(data)); } + void Putc(char ch); + + void SealElementIfJustOpened(); + bool _elementJustOpened = false; + DynArray _stack; + + private: + void PrintString(const char* p, bool restricted); // prints out, after detecting entities. + + bool _firstElement = true; + FILE* _fp = nullptr; + int _depth = 0; + int _textDepth = -1; + bool _processEntities = true; + bool _compactMode = false; + + enum + { + ENTITY_RANGE = 64, + BUF_SIZE = 200 + }; + + bool _entityFlag[ENTITY_RANGE]; + bool _restrictedEntityFlag[ENTITY_RANGE]; + + DynArray _buffer; + + // Prohibit cloning, intentionally not implemented + XMLPrinter(const XMLPrinter&) = delete; + XMLPrinter& operator=(const XMLPrinter&) = delete; + }; +} // namespace tinyxml2 + +#if defined(_MSC_VER) +# pragma warning(pop) +#endif + +#endif // TINYXML2_INCLUDED diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/examples/CMakeLists.txt new file mode 100644 index 0000000..09418ed --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/CMakeLists.txt @@ -0,0 +1,4 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("APPLICATIONS_EXAMPLES") + diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/examples/convert/CMakeLists.txt new file mode 100644 index 0000000..f185b82 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/CMakeLists.txt @@ -0,0 +1,44 @@ + +IF(OV_DISABLE_GTK) + MESSAGE(STATUS "Skipping Convert, no GTK (no Designer)") + RETURN() +ENDIF() + +PROJECT(openvibe-convert) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +ADD_CUSTOM_TARGET(openvibe-convert SOURCES + CMakeLists.txt src/openvibe-convert-real.cmd-base src/openvibe-convert-real.sh-base) + +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +ADD_DEPENDENCIES(openvibe-convert openvibe-plugins-file-io) + +# ---------------------- +# Generate launch script +# ---------------------- +IF(WIN32) + SET(OV_EXTENSION "cmd") +ELSEIF(UNIX) + SET(OV_EXTENSION "sh") +ENDIF() + +# Create the actual script thats run +CONFIGURE_FILE(src/openvibe-convert-real.${OV_EXTENSION}-base ${CMAKE_CURRENT_BINARY_DIR}/openvibe-convert-real.${OV_EXTENSION} @ONLY) + +# Required for OV_INSTALL_LAUNCH_SCRIPT +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LOCATION openvibe-convert-real.${OV_EXTENSION}) + +# ----------------------------- +# Install files +# ----------------------------- + +# This will call the actual script +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") + +INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/openvibe-convert-real.${OV_EXTENSION} DESTINATION ${DIST_BINDIR}) + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/convert) + diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/0README.txt b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/0README.txt new file mode 100755 index 0000000..ad1abc3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/0README.txt @@ -0,0 +1,18 @@ + +These scenarios illustrate how to convert files from one file format to +another. They can be used from Designer or by 'openvibe-convert' script. +When used from Designer, the reader and writer boxes must be configured +with the input and output filenames required. + +*** WARNING *** + +These conversions may not work correctly for all possible input and +output combinations. For example, an .ov file may have several streams, +a situation which may not be supported by some other format. On the +other hand, .ov files can not contain multiple streams with different +sampling rates. Some other data, like experiment information, may not +translate between formats properly or at all. + +You may have to customize each scenario to your particular case and +study the results to discover the possible limitations that may exist. + diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/csv2edf.xml b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/csv2edf.xml new file mode 100644 index 0000000..a9ea96f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/csv2edf.xml @@ -0,0 +1,397 @@ + + 1 + openvibe + 2.0 + + + (0x00002ba5, 0x000028e3) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 192 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004365, 0x00004e39) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 192 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 62 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000065b1, 0x00001c78) + CSV File Reader + (0x641d0717, 0x02884107) + + + (0x5ba36127, 0x195feae1) + Output stream + + + + + (0x330306dd, 0x74a95f98) + Filename + + $ENV{OV_CONVERT_SRC} + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x2cdb2f0b, 0x12f231ea) + Don't use the file time + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -416.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 352.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x3bf57676, 0xad3aaefa) + + + (0xad100179, 0xa3c984ab) + 112 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x000066b4, 0x00006748) + EDF File Writer + (0x0d454dce, 0x470a4c02) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].edf + $ENV{OV_CONVERT_DEST} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0xd41e3037, 0xcc12644a) + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + + + (0x00001289, 0x000050aa) + + (0x00004365, 0x00004e39) + 0 + + + (0x00002ba5, 0x000028e3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -281 + + + (0x358ae8b5, 0x0f8bacd1) + 192 + + + (0x3f0a3b27, 0x570913d2) + -240 + + + (0x6267b5c5, 0x676e3e42) + 192 + + + + + (0x000058de, 0x00001e61) + + (0x000065b1, 0x00001c78) + 0 + + + (0x00004365, 0x00004e39) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -388 + + + (0x358ae8b5, 0x0f8bacd1) + 352 + + + (0x3f0a3b27, 0x570913d2) + -325 + + + (0x6267b5c5, 0x676e3e42) + 192 + + + + + (0x00005ab2, 0x00006da3) + + (0x000065b1, 0x00001c78) + 0 + + + (0x000066b4, 0x00006748) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -388 + + + (0x358ae8b5, 0x0f8bacd1) + 352 + + + (0x3f0a3b27, 0x570913d2) + -240 + + + (0x6267b5c5, 0x676e3e42) + 352 + + + + + + + (0x00005f34, 0x00004ec0) + This scenario is an example of +how to convert files between formats. + +Conversion may not work correctly for all +possible input and output combinations. + +You may have to customize the scenario +to your particular case. + +If you run this scenario manually from Designer, +please configure the input and output filenames +of the reader and writer boxes. + +Script 'openvibe-convert' relies on this scenario. + + + (0x473d9a43, 0x97fc0a97) + -48 + + + (0x7234b86b, 0x2b8651a5) + -384 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x0000117a, 0x00006d76)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00000878, 0x000036c2)","index":0,"name":"Default tab","parentIdentifier":"(0x0000117a, 0x00006d76)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00004963, 0x000026b1)","index":0,"name":"Empty","parentIdentifier":"(0x00000878, 0x000036c2)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/csv2gdf.xml b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/csv2gdf.xml new file mode 100644 index 0000000..f6043f4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/csv2gdf.xml @@ -0,0 +1,397 @@ + + 1 + openvibe + 2.0 + + + (0x000015fd, 0x00007cb9) + GDF file writer + (0x1e7b2155, 0x107289ce) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x6f752dd0, 0x082a321e) + Stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].gdf + $ENV{OV_CONVERT_DEST} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0xd41e3037, 0xcc12644a) + + + (0xad100179, 0xa3c984ab) + 103 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00001af6, 0x00003a73) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 62 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000634f, 0x00006f69) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000065b1, 0x00001c78) + CSV File Reader + (0x641d0717, 0x02884107) + + + (0x5ba36127, 0x195feae1) + Output stream + + + + + (0x330306dd, 0x74a95f98) + Filename + + $ENV{OV_CONVERT_SRC} + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x2cdb2f0b, 0x12f231ea) + Don't use the file time + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -448.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 384.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x3bf57676, 0xad3aaefa) + + + (0xad100179, 0xa3c984ab) + 112 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + + + (0x00001127, 0x00004996) + + (0x000065b1, 0x00001c78) + 0 + + + (0x00001af6, 0x00003a73) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -420 + + + (0x358ae8b5, 0x0f8bacd1) + 384 + + + (0x3f0a3b27, 0x570913d2) + -325 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x000027d3, 0x00007f0e) + + (0x00001af6, 0x00003a73) + 0 + + + (0x0000634f, 0x00006f69) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -281 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + -240 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x00007faf, 0x00000aff) + + (0x000065b1, 0x00001c78) + 0 + + + (0x000015fd, 0x00007cb9) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -420 + + + (0x358ae8b5, 0x0f8bacd1) + 384 + + + (0x3f0a3b27, 0x570913d2) + -240 + + + (0x6267b5c5, 0x676e3e42) + 400 + + + + + + + (0x00005718, 0x000074a0) + This scenario is an example of +how to convert files between formats. + +Conversion may not work correctly for all +possible input and output combinations. + +You may have to customize the scenario +to your particular case. + +If you run this scenario manually from Designer, +please configure the input and output filenames +of the reader and writer boxes. + +Script 'openvibe-convert' relies on this scenario. + + + (0x473d9a43, 0x97fc0a97) + -16 + + + (0x7234b86b, 0x2b8651a5) + -384 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x0000183a, 0x00001fb4)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000013a6, 0x00004f66)","index":0,"name":"Default tab","parentIdentifier":"(0x0000183a, 0x00001fb4)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00007153, 0x00007833)","index":0,"name":"Empty","parentIdentifier":"(0x000013a6, 0x00004f66)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/csv2ov.xml b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/csv2ov.xml new file mode 100644 index 0000000..e40fae0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/csv2ov.xml @@ -0,0 +1,416 @@ + + 1 + openvibe + 2.0 + + + (0x00001b32, 0x00002935) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000384d, 0x00004102) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + (0x6f752dd0, 0x082a321e) + Input stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].ov + $ENV{OV_CONVERT_DEST} + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004d8f, 0x00006118) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -320 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 62 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000065b1, 0x00001c78) + CSV File Reader + (0x641d0717, 0x02884107) + + + (0x5ba36127, 0x195feae1) + Output stream + + + + + (0x330306dd, 0x74a95f98) + Filename + + $ENV{OV_CONVERT_SRC} + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x2cdb2f0b, 0x12f231ea) + Don't use the file time + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -448.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 352.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x3bf57676, 0xad3aaefa) + + + (0xad100179, 0xa3c984ab) + 112 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + + + (0x000001ff, 0x00004d2a) + + (0x000065b1, 0x00001c78) + 0 + + + (0x00004d8f, 0x00006118) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -420 + + + (0x358ae8b5, 0x0f8bacd1) + 352 + + + (0x3f0a3b27, 0x570913d2) + -341 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + (0x00003356, 0x00002cc7) + + (0x00004d8f, 0x00006118) + 0 + + + (0x00001b32, 0x00002935) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -297 + + + (0x358ae8b5, 0x0f8bacd1) + 208 + + + (0x3f0a3b27, 0x570913d2) + -256 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + (0x000034e3, 0x00000c1c) + + (0x000065b1, 0x00001c78) + 0 + + + (0x0000384d, 0x00004102) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -420 + + + (0x358ae8b5, 0x0f8bacd1) + 352 + + + (0x3f0a3b27, 0x570913d2) + -261 + + + (0x6267b5c5, 0x676e3e42) + 360 + + + + + + + (0x000034c5, 0x0000765d) + This scenario is an example of +how to convert files between formats. + +Conversion may not work correctly for all +possible input and output combinations. + +You may have to customize the scenario +to your particular case. + +If you run this scenario manually from Designer, +please configure the input and output filenames +of the reader and writer boxes. + +Script 'openvibe-convert' relies on this scenario. + + + (0x473d9a43, 0x97fc0a97) + -32 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x000006d8, 0x0000480b)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006e88, 0x00003181)","index":0,"name":"Default tab","parentIdentifier":"(0x000006d8, 0x0000480b)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00002738, 0x00002461)","index":0,"name":"Empty","parentIdentifier":"(0x00006e88, 0x00003181)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/dat2csv.xml b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/dat2csv.xml new file mode 100644 index 0000000..655278f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/dat2csv.xml @@ -0,0 +1,389 @@ + + 1 + openvibe + 2.0 + + + (0x0000014f, 0x00002238) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 62 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000048db, 0x00006875) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004b99, 0x00004b73) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x5ba36127, 0x195feae1) + Streamed matrix + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + $ENV{OV_CONVERT_DEST} + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000561c, 0x00002bfb) + BCI2000 File Reader + (0xff78daf4, 0xc41544b8) + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x5ba36127, 0x195feae1) + State + + + + + (0x330306dd, 0x74a95f98) + File name + + $ENV{OV_CONVERT_SRC} + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 16 + 16 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -448 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0xbe81a967, 0x726cb086) + + + (0xad100179, 0xa3c984ab) + 141 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + + + (0x00002bb8, 0x00001db6) + + (0x0000561c, 0x00002bfb) + 0 + + + (0x00004b99, 0x00004b73) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -425 + + + (0x358ae8b5, 0x0f8bacd1) + 376 + + + (0x3f0a3b27, 0x570913d2) + -277 + + + (0x6267b5c5, 0x676e3e42) + 384 + + + + + (0x000062b0, 0x00002f96) + + (0x0000561c, 0x00002bfb) + 0 + + + (0x0000014f, 0x00002238) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -425 + + + (0x358ae8b5, 0x0f8bacd1) + 376 + + + (0x3f0a3b27, 0x570913d2) + -357 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + (0x00006f57, 0x00000ef6) + + (0x0000014f, 0x00002238) + 0 + + + (0x000048db, 0x00006875) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -313 + + + (0x358ae8b5, 0x0f8bacd1) + 208 + + + (0x3f0a3b27, 0x570913d2) + -272 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + + + (0x000079c4, 0x00004631) + This scenario is an example of +how to convert files between formats. + +Conversion may not work correctly for all +possible input and output combinations. + +You may have to customize the scenario +to your particular case. + +If you run this scenario manually from Designer, +please configure the input and output filenames +of the reader and writer boxes. + +Script 'openvibe-convert' relies on this scenario. + + + (0x473d9a43, 0x97fc0a97) + -32 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00005cdf, 0x00005080)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000726c, 0x0000176d)","index":0,"name":"Default tab","parentIdentifier":"(0x00005cdf, 0x00005080)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000448d, 0x00007374)","index":0,"name":"Empty","parentIdentifier":"(0x0000726c, 0x0000176d)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/dat2edf.xml b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/dat2edf.xml new file mode 100644 index 0000000..6dd0b94 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/dat2edf.xml @@ -0,0 +1,379 @@ + + 1 + openvibe + 2.0 + + + (0x00000a6e, 0x0000673d) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 62 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000275b, 0x00004963) + EDF File Writer + (0x0d454dce, 0x470a4c02) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].edf + $ENV{OV_CONVERT_DEST} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0xd41e3037, 0xcc12644a) + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00003c8a, 0x0000618b) + BCI2000 File Reader + (0xff78daf4, 0xc41544b8) + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x5ba36127, 0x195feae1) + State + + + + + (0x330306dd, 0x74a95f98) + File name + + $ENV{OV_CONVERT_SRC} + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 16 + 16 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -448 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0xbe81a967, 0x726cb086) + + + (0xad100179, 0xa3c984ab) + 141 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00006d7b, 0x00000ff5) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x0000188f, 0x00005d28) + + (0x00003c8a, 0x0000618b) + 0 + + + (0x00000a6e, 0x0000673d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -425 + + + (0x358ae8b5, 0x0f8bacd1) + 376 + + + (0x3f0a3b27, 0x570913d2) + -357 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + (0x000052e5, 0x00005888) + + (0x00000a6e, 0x0000673d) + 0 + + + (0x00006d7b, 0x00000ff5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -313 + + + (0x358ae8b5, 0x0f8bacd1) + 208 + + + (0x3f0a3b27, 0x570913d2) + -272 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + (0x00007f5c, 0x000001f8) + + (0x00003c8a, 0x0000618b) + 0 + + + (0x0000275b, 0x00004963) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -425 + + + (0x358ae8b5, 0x0f8bacd1) + 376 + + + (0x3f0a3b27, 0x570913d2) + -272 + + + (0x6267b5c5, 0x676e3e42) + 384 + + + + + + + (0x00006f5e, 0x000028b7) + This scenario is an example of +how to convert files between formats. + +Conversion may not work correctly for all +possible input and output combinations. + +You may have to customize the scenario +to your particular case. + +If you run this scenario manually from Designer, +please configure the input and output filenames +of the reader and writer boxes. + +Script 'openvibe-convert' relies on this scenario. + + + (0x473d9a43, 0x97fc0a97) + -32 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x0000164a, 0x0000093b)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00002332, 0x0000569b)","index":0,"name":"Default tab","parentIdentifier":"(0x0000164a, 0x0000093b)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00006b61, 0x00004740)","index":0,"name":"Empty","parentIdentifier":"(0x00002332, 0x0000569b)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/dat2gdf.xml b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/dat2gdf.xml new file mode 100644 index 0000000..3e606f2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/dat2gdf.xml @@ -0,0 +1,379 @@ + + 1 + openvibe + 2.0 + + + (0x00000b9b, 0x000045c9) + GDF file writer + (0x1e7b2155, 0x107289ce) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x6f752dd0, 0x082a321e) + Stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].gdf + $ENV{OV_CONVERT_DEST} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0xd41e3037, 0xcc12644a) + + + (0xad100179, 0xa3c984ab) + 103 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000448a, 0x000048f7) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005429, 0x00007029) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 62 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005981, 0x00002b44) + BCI2000 File Reader + (0xff78daf4, 0xc41544b8) + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x5ba36127, 0x195feae1) + State + + + + + (0x330306dd, 0x74a95f98) + File name + + $ENV{OV_CONVERT_SRC} + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 16 + 16 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -448 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0xbe81a967, 0x726cb086) + + + (0xad100179, 0xa3c984ab) + 141 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + + + (0x000006e9, 0x00003b9f) + + (0x00005429, 0x00007029) + 0 + + + (0x0000448a, 0x000048f7) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -313 + + + (0x358ae8b5, 0x0f8bacd1) + 208 + + + (0x3f0a3b27, 0x570913d2) + -272 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + (0x00002147, 0x000036a2) + + (0x00005981, 0x00002b44) + 0 + + + (0x00005429, 0x00007029) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -425 + + + (0x358ae8b5, 0x0f8bacd1) + 376 + + + (0x3f0a3b27, 0x570913d2) + -357 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + (0x00006e81, 0x00003e49) + + (0x00005981, 0x00002b44) + 0 + + + (0x00000b9b, 0x000045c9) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -425 + + + (0x358ae8b5, 0x0f8bacd1) + 376 + + + (0x3f0a3b27, 0x570913d2) + -272 + + + (0x6267b5c5, 0x676e3e42) + 384 + + + + + + + (0x00001056, 0x00006330) + This scenario is an example of +how to convert files between formats. + +Conversion may not work correctly for all +possible input and output combinations. + +You may have to customize the scenario +to your particular case. + +If you run this scenario manually from Designer, +please configure the input and output filenames +of the reader and writer boxes. + +Script 'openvibe-convert' relies on this scenario. + + + (0x473d9a43, 0x97fc0a97) + -32 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00000b31, 0x0000486c)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00005acd, 0x000063a4)","index":0,"name":"Default tab","parentIdentifier":"(0x00000b31, 0x0000486c)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00006e9e, 0x00006cde)","index":0,"name":"Empty","parentIdentifier":"(0x00005acd, 0x000063a4)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/dat2ov.xml b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/dat2ov.xml new file mode 100644 index 0000000..e38f934 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/dat2ov.xml @@ -0,0 +1,394 @@ + + 1 + openvibe + 2.0 + + + (0x00000b7f, 0x0000315e) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 144 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 62 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000013b9, 0x0000124a) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + (0x6f752dd0, 0x082a321e) + Input stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].ov + $ENV{OV_CONVERT_DEST} + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005789, 0x00006760) + BCI2000 File Reader + (0xff78daf4, 0xc41544b8) + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x5ba36127, 0x195feae1) + State + + + + + (0x330306dd, 0x74a95f98) + File name + + $ENV{OV_CONVERT_SRC} + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 16 + 16 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0xbe81a967, 0x726cb086) + + + (0xad100179, 0xa3c984ab) + 141 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00006303, 0x00000829) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 144 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000260, 0x00007d3d) + + (0x00005789, 0x00006760) + 0 + + + (0x00000b7f, 0x0000315e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -313 + + + (0x358ae8b5, 0x0f8bacd1) + 312 + + + (0x3f0a3b27, 0x570913d2) + -245 + + + (0x6267b5c5, 0x676e3e42) + 144 + + + + + (0x00000634, 0x00002c4f) + + (0x00000b7f, 0x0000315e) + 0 + + + (0x00006303, 0x00000829) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -201 + + + (0x358ae8b5, 0x0f8bacd1) + 144 + + + (0x3f0a3b27, 0x570913d2) + -160 + + + (0x6267b5c5, 0x676e3e42) + 144 + + + + + (0x000052e5, 0x000006df) + + (0x00005789, 0x00006760) + 0 + + + (0x000013b9, 0x0000124a) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -313 + + + (0x358ae8b5, 0x0f8bacd1) + 312 + + + (0x3f0a3b27, 0x570913d2) + -165 + + + (0x6267b5c5, 0x676e3e42) + 312 + + + + + + + (0x00003a36, 0x00006e60) + This scenario is an example of +how to convert files between formats. + +Conversion may not work correctly for all +possible input and output combinations. + +You may have to customize the scenario +to your particular case. + +If you run this scenario manually from Designer, +please configure the input and output filenames +of the reader and writer boxes. + +Script 'openvibe-convert' relies on this scenario. + + + (0x473d9a43, 0x97fc0a97) + -32 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00007502, 0x00005198)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003742, 0x000002b2)","index":0,"name":"Default tab","parentIdentifier":"(0x00007502, 0x00005198)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00001f0d, 0x0000322b)","index":0,"name":"Empty","parentIdentifier":"(0x00003742, 0x000002b2)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/gdf2csv.xml b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/gdf2csv.xml new file mode 100644 index 0000000..90b5d3f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/gdf2csv.xml @@ -0,0 +1,404 @@ + + 1 + openvibe + 2.0 + + + (0x0000168d, 0x000033c9) + GDF file reader + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + $ENV{OV_CONVERT_SRC} + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -432 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xad100179, 0xa3c984ab) + 123 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00001cb3, 0x00006b41) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 69 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005edb, 0x000070ac) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 133 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006f61, 0x00006be2) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x5ba36127, 0x195feae1) + Streamed matrix + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + $ENV{OV_CONVERT_DEST} + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00002252, 0x00001f3d) + + (0x0000168d, 0x000033c9) + 1 + + + (0x00001cb3, 0x00006b41) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -413 + + + (0x358ae8b5, 0x0f8bacd1) + 336 + + + (0x3f0a3b27, 0x570913d2) + -328 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + (0x000059cb, 0x00000146) + + (0x00001cb3, 0x00006b41) + 0 + + + (0x00005edb, 0x000070ac) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -279 + + + (0x358ae8b5, 0x0f8bacd1) + 208 + + + (0x3f0a3b27, 0x570913d2) + -241 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + (0x0000686a, 0x00001061) + + (0x0000168d, 0x000033c9) + 1 + + + (0x00006f61, 0x00006be2) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -413 + + + (0x358ae8b5, 0x0f8bacd1) + 336 + + + (0x3f0a3b27, 0x570913d2) + -248 + + + (0x6267b5c5, 0x676e3e42) + 336 + + + + + + + (0x00004e71, 0x00004130) + This scenario is an example of +how to convert files between formats. + +Conversion may not work correctly for all +possible input and output combinations. + +You may have to customize the scenario +to your particular case. + +If you run this scenario manually from Designer, +please configure the input and output filenames +of the reader and writer boxes. + +Script 'openvibe-convert' relies on this scenario. + + + (0x473d9a43, 0x97fc0a97) + -32 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x000028e5, 0x00005b8f)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007be7, 0x0000130b)","index":0,"name":"Default tab","parentIdentifier":"(0x000028e5, 0x00005b8f)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00004189, 0x000004fe)","index":0,"name":"Empty","parentIdentifier":"(0x00007be7, 0x0000130b)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/gdf2edf.xml b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/gdf2edf.xml new file mode 100644 index 0000000..4681516 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/gdf2edf.xml @@ -0,0 +1,419 @@ + + 1 + openvibe + 2.0 + + + (0x00000526, 0x00007353) + EDF File Writer + (0x0d454dce, 0x470a4c02) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].edf + $ENV{OV_CONVERT_DEST} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0xd41e3037, 0xcc12644a) + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00001818, 0x0000049e) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 69 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006113, 0x00000a51) + GDF file reader + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + $ENV{OV_CONVERT_SRC} + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -464 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xad100179, 0xa3c984ab) + 123 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00007990, 0x00003864) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 133 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00002c9b, 0x00002bc4) + + (0x00006113, 0x00000a51) + 2 + + + (0x00000526, 0x00007353) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -445 + + + (0x358ae8b5, 0x0f8bacd1) + 351 + + + (0x3f0a3b27, 0x570913d2) + -241 + + + (0x6267b5c5, 0x676e3e42) + 351 + + + + + (0x000059ec, 0x00001b74) + + (0x00001818, 0x0000049e) + 0 + + + (0x00007990, 0x00003864) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -279 + + + (0x358ae8b5, 0x0f8bacd1) + 208 + + + (0x3f0a3b27, 0x570913d2) + -241 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + (0x00005ddc, 0x00007598) + + (0x00006113, 0x00000a51) + 1 + + + (0x00000526, 0x00007353) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -445 + + + (0x358ae8b5, 0x0f8bacd1) + 336 + + + (0x3f0a3b27, 0x570913d2) + -241 + + + (0x6267b5c5, 0x676e3e42) + 336 + + + + + (0x00007ea6, 0x00001136) + + (0x00006113, 0x00000a51) + 1 + + + (0x00001818, 0x0000049e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -445 + + + (0x358ae8b5, 0x0f8bacd1) + 336 + + + (0x3f0a3b27, 0x570913d2) + -328 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + + + (0x00001adf, 0x00003fb9) + This scenario is an example of +how to convert files between formats. + +Conversion may not work correctly for all +possible input and output combinations. + +You may have to customize the scenario +to your particular case. + +If you run this scenario manually from Designer, +please configure the input and output filenames +of the reader and writer boxes. + +Script 'openvibe-convert' relies on this scenario. + + + (0x473d9a43, 0x97fc0a97) + -32 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00003f0d, 0x0000558e)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003b1f, 0x000025da)","index":0,"name":"Default tab","parentIdentifier":"(0x00003f0d, 0x0000558e)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00000f4f, 0x00002230)","index":0,"name":"Empty","parentIdentifier":"(0x00003b1f, 0x000025da)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/gdf2ov.xml b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/gdf2ov.xml new file mode 100644 index 0000000..4e404f8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/gdf2ov.xml @@ -0,0 +1,438 @@ + + 1 + openvibe + 2.0 + + + (0x00002996, 0x00000832) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 192 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002a1e, 0x0000388c) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -320 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 192 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 62 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000357c, 0x00007bce) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].ov + $ENV{OV_CONVERT_DEST} + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005519, 0x00002a93) + GDF file reader + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + $ENV{OV_CONVERT_SRC} + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -448 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + + + (0x00003128, 0x00005826) + + (0x00005519, 0x00002a93) + 1 + + + (0x00002a1e, 0x0000388c) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -430 + + + (0x358ae8b5, 0x0f8bacd1) + 336 + + + (0x3f0a3b27, 0x570913d2) + -341 + + + (0x6267b5c5, 0x676e3e42) + 192 + + + + + (0x00006143, 0x000006c2) + + (0x00005519, 0x00002a93) + 1 + + + (0x0000357c, 0x00007bce) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -430 + + + (0x358ae8b5, 0x0f8bacd1) + 336 + + + (0x3f0a3b27, 0x570913d2) + -245 + + + (0x6267b5c5, 0x676e3e42) + 336 + + + + + (0x0000623e, 0x00007989) + + (0x00002a1e, 0x0000388c) + 0 + + + (0x00002996, 0x00000832) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -297 + + + (0x358ae8b5, 0x0f8bacd1) + 192 + + + (0x3f0a3b27, 0x570913d2) + -256 + + + (0x6267b5c5, 0x676e3e42) + 192 + + + + + (0x00006650, 0x00002814) + + (0x00005519, 0x00002a93) + 2 + + + (0x0000357c, 0x00007bce) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -430 + + + (0x358ae8b5, 0x0f8bacd1) + 351 + + + (0x3f0a3b27, 0x570913d2) + -245 + + + (0x6267b5c5, 0x676e3e42) + 351 + + + + + + + (0x00001890, 0x00002047) + This scenario is an example of +how to convert files between formats. + +Conversion may not work correctly for all +possible input and output combinations. + +You may have to customize the scenario +to your particular case. + +If you run this scenario manually from Designer, +please configure the input and output filenames +of the reader and writer boxes. + +Script 'openvibe-convert' relies on this scenario. + + + (0x473d9a43, 0x97fc0a97) + -32 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00007de8, 0x00004b42)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006836, 0x00000506)","index":0,"name":"Default tab","parentIdentifier":"(0x00007de8, 0x00004b42)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00000b7d, 0x00007991)","index":0,"name":"Empty","parentIdentifier":"(0x00006836, 0x00000506)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/ov2csv.xml b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/ov2csv.xml new file mode 100644 index 0000000..732285c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/ov2csv.xml @@ -0,0 +1,491 @@ + + 1 + openvibe + 2.0 + + + (0x0000003a, 0x0000396d) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x5ba36127, 0x195feae1) + Streamed matrix + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + $ENV{OV_CONVERT_DEST} + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000005eb, 0x000062b6) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $ENV{OV_CONVERT_SRC} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -432 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xac637a9c, 0x2ad59abe) + false + + + (0xad100179, 0xa3c984ab) + 153 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006d82bf) + + + (0xc73e83ec, 0xf855c5bc) + false + + + + + (0x00000f77, 0x0000195e) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 62 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000059f9, 0x00004007) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + $ENV{OV_CONVERT_DEST}.stims.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 512.000000 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006169, 0x000070c6) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 240.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00003233, 0x0000249f) + + (0x000005eb, 0x000062b6) + 1 + + + (0x000059f9, 0x00004007) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -409 + + + (0x358ae8b5, 0x0f8bacd1) + 375 + + + (0x3f0a3b27, 0x570913d2) + -245 + + + (0x6267b5c5, 0x676e3e42) + 512 + + + + + (0x00003693, 0x00006699) + + (0x00000f77, 0x0000195e) + 0 + + + (0x00006169, 0x000070c6) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -281 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + -240 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x00007214, 0x0000354c) + + (0x000005eb, 0x000062b6) + 0 + + + (0x00000f77, 0x0000195e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -409 + + + (0x358ae8b5, 0x0f8bacd1) + 360 + + + (0x3f0a3b27, 0x570913d2) + -325 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x0000745e, 0x000067f4) + + (0x000005eb, 0x000062b6) + 0 + + + (0x0000003a, 0x0000396d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -409 + + + (0x358ae8b5, 0x0f8bacd1) + 360 + + + (0x3f0a3b27, 0x570913d2) + -245 + + + (0x6267b5c5, 0x676e3e42) + 368 + + + + + + + (0x0000674b, 0x00005342) + This scenario is an example of +how to convert files between formats. + +Conversion may not work correctly for all +possible input and output combinations. + +You may have to customize the scenario +to your particular case. + +If you run this scenario manually from Designer, +please configure the input and output filenames +of the reader and writer boxes. + +Script 'openvibe-convert' relies on this scenario. + + + (0x473d9a43, 0x97fc0a97) + -32 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000479a, 0x00000bdf)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007604, 0x00007268)","index":0,"name":"Default tab","parentIdentifier":"(0x0000479a, 0x00000bdf)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00006db2, 0x000007a2)","index":0,"name":"Empty","parentIdentifier":"(0x00007604, 0x00007268)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/ov2edf.xml b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/ov2edf.xml new file mode 100644 index 0000000..c27c20e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/ov2edf.xml @@ -0,0 +1,421 @@ + + 1 + openvibe + 2.0 + + + (0x0000001c, 0x00006261) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -320 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 62 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000006bb, 0x00005374) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000328d, 0x00003daf) + EDF File Writer + (0x0d454dce, 0x470a4c02) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].edf + $ENV{OV_CONVERT_DEST} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0xd41e3037, 0xcc12644a) + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00006601, 0x00002719) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x6f752dd0, 0x082a321e) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $ENV{OV_CONVERT_SRC} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -448 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xac637a9c, 0x2ad59abe) + false + + + (0xad100179, 0xa3c984ab) + 153 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006d82bf) + + + (0xc73e83ec, 0xf855c5bc) + false + + + + + + + (0x000013cf, 0x0000075e) + + (0x0000001c, 0x00006261) + 0 + + + (0x000006bb, 0x00005374) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -297 + + + (0x358ae8b5, 0x0f8bacd1) + 208 + + + (0x3f0a3b27, 0x570913d2) + -256 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + (0x00002c45, 0x00005954) + + (0x00006601, 0x00002719) + 1 + + + (0x0000328d, 0x00003daf) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -425 + + + (0x358ae8b5, 0x0f8bacd1) + 328 + + + (0x3f0a3b27, 0x570913d2) + -256 + + + (0x6267b5c5, 0x676e3e42) + 352 + + + + + (0x000055d6, 0x00000430) + + (0x00006601, 0x00002719) + 1 + + + (0x0000001c, 0x00006261) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -425 + + + (0x358ae8b5, 0x0f8bacd1) + 328 + + + (0x3f0a3b27, 0x570913d2) + -341 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + (0x000060ca, 0x00001c21) + + (0x00006601, 0x00002719) + 2 + + + (0x0000328d, 0x00003daf) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -425 + + + (0x358ae8b5, 0x0f8bacd1) + 343 + + + (0x3f0a3b27, 0x570913d2) + -256 + + + (0x6267b5c5, 0x676e3e42) + 367 + + + + + + + (0x00001439, 0x00003636) + This scenario is an example of +how to convert files between formats. + +Conversion may not work correctly for all +possible input and output combinations. + +You may have to customize the scenario +to your particular case. + +If you run this scenario manually from Designer, +please configure the input and output filenames +of the reader and writer boxes. + +Script 'openvibe-convert' relies on this scenario. + + + (0x473d9a43, 0x97fc0a97) + -32 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00006629, 0x000037d7)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007da8, 0x00005159)","index":0,"name":"Default tab","parentIdentifier":"(0x00006629, 0x000037d7)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000025cc, 0x00003d0d)","index":0,"name":"Empty","parentIdentifier":"(0x00007da8, 0x00005159)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/ov2gdf.xml b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/ov2gdf.xml new file mode 100644 index 0000000..583f612 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/ov2gdf.xml @@ -0,0 +1,413 @@ + + 1 + openvibe + 2.0 + + + (0x0000053c, 0x00001637) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $ENV{OV_CONVERT_SRC} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -432 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xac637a9c, 0x2ad59abe) + false + + + (0xad100179, 0xa3c984ab) + 153 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006d82bf) + + + (0xc73e83ec, 0xf855c5bc) + false + + + + + (0x00001785, 0x00002d8f) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 224 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006c21, 0x00004dfd) + GDF file writer + (0x1e7b2155, 0x107289ce) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x6f752dd0, 0x082a321e) + Stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].gdf + $ENV{OV_CONVERT_DEST} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0xd41e3037, 0xcc12644a) + + + (0xad100179, 0xa3c984ab) + 103 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00006ffa, 0x000071a0) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 224 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 62 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00003981, 0x000017b1) + + (0x0000053c, 0x00001637) + 1 + + + (0x00006ffa, 0x000071a0) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -409 + + + (0x358ae8b5, 0x0f8bacd1) + 352 + + + (0x3f0a3b27, 0x570913d2) + -325 + + + (0x6267b5c5, 0x676e3e42) + 224 + + + + + (0x000042e4, 0x00005d86) + + (0x0000053c, 0x00001637) + 2 + + + (0x00006c21, 0x00004dfd) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -409 + + + (0x358ae8b5, 0x0f8bacd1) + 367 + + + (0x3f0a3b27, 0x570913d2) + -240 + + + (0x6267b5c5, 0x676e3e42) + 367 + + + + + (0x000045ee, 0x000074b2) + + (0x00006ffa, 0x000071a0) + 0 + + + (0x00001785, 0x00002d8f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -281 + + + (0x358ae8b5, 0x0f8bacd1) + 224 + + + (0x3f0a3b27, 0x570913d2) + -240 + + + (0x6267b5c5, 0x676e3e42) + 224 + + + + + (0x0000727d, 0x00004fc0) + + (0x0000053c, 0x00001637) + 1 + + + (0x00006c21, 0x00004dfd) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -409 + + + (0x358ae8b5, 0x0f8bacd1) + 352 + + + (0x3f0a3b27, 0x570913d2) + -240 + + + (0x6267b5c5, 0x676e3e42) + 352 + + + + + + + (0x00001613, 0x000008d3) + This scenario is an example of +how to convert files between formats. + +Conversion may not work correctly for all +possible input and output combinations. + +You may have to customize the scenario +to your particular case. + +If you run this scenario manually from Designer, +please configure the input and output filenames +of the reader and writer boxes. + +Script 'openvibe-convert' relies on this scenario. + + + (0x473d9a43, 0x97fc0a97) + -32 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00007fe9, 0x00007c12)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006f07, 0x00006b8b)","index":0,"name":"Default tab","parentIdentifier":"(0x00007fe9, 0x00007c12)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000012c6, 0x00002fec)","index":0,"name":"Empty","parentIdentifier":"(0x00006f07, 0x00006b8b)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/vhdr2csv.xml b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/vhdr2csv.xml new file mode 100644 index 0000000..d724e1b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/vhdr2csv.xml @@ -0,0 +1,404 @@ + + 1 + openvibe + 2.0 + + + (0x0000140b, 0x000075a3) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 62 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001d43, 0x00003591) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000027aa, 0x00007b44) + Brainamp file reader + (0x61894b28, 0x185e57d2) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename (header) + + $ENV{OV_CONVERT_SRC} + false + + + (0x512a166f, 0x5c3ef83f) + Epoch size (in sec) + 0.0625 + 0.0625 + false + + + (0x2cdb2f0b, 0x12f231ea) + Convert stimuli to OpenViBE labels + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -416.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 352.000000 + + + (0x4e7b798a, 0x183beafb) + (0x15ef4ecc, 0xb1af1f0b) + + + (0xad100179, 0xa3c984ab) + 142 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00004037, 0x00001f17) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x5ba36127, 0x195feae1) + Streamed matrix + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + $ENV{OV_CONVERT_DEST} + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00001243, 0x00001091) + + (0x000027aa, 0x00007b44) + 1 + + + (0x00004037, 0x00001f17) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -398 + + + (0x358ae8b5, 0x0f8bacd1) + 352 + + + (0x3f0a3b27, 0x570913d2) + -245 + + + (0x6267b5c5, 0x676e3e42) + 352 + + + + + (0x0000473a, 0x000038a1) + + (0x000027aa, 0x00007b44) + 1 + + + (0x0000140b, 0x000075a3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -398 + + + (0x358ae8b5, 0x0f8bacd1) + 352 + + + (0x3f0a3b27, 0x570913d2) + -325 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + (0x00006092, 0x00007409) + + (0x0000140b, 0x000075a3) + 0 + + + (0x00001d43, 0x00003591) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -281 + + + (0x358ae8b5, 0x0f8bacd1) + 208 + + + (0x3f0a3b27, 0x570913d2) + -240 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + + + (0x000018dd, 0x00007d4c) + This scenario is an example of +how to convert files between formats. + +Conversion may not work correctly for all +possible input and output combinations. + +You may have to customize the scenario +to your particular case. + +If you run this scenario manually from Designer, +please configure the input and output filenames +of the reader and writer boxes. + +Script 'openvibe-convert' relies on this scenario. + + + (0x473d9a43, 0x97fc0a97) + -32 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x0000473e, 0x00006737)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006d0e, 0x00002a72)","index":0,"name":"Default tab","parentIdentifier":"(0x0000473e, 0x00006737)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000044fb, 0x00007ef2)","index":0,"name":"Empty","parentIdentifier":"(0x00006d0e, 0x00002a72)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/vhdr2edf.xml b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/vhdr2edf.xml new file mode 100644 index 0000000..02790af --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/vhdr2edf.xml @@ -0,0 +1,423 @@ + + 1 + openvibe + 2.0 + + + (0x00001c6e, 0x00005140) + EDF File Writer + (0x0d454dce, 0x470a4c02) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].edf + $ENV{OV_CONVERT_DEST} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xd41e3037, 0xcc12644a) + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000027aa, 0x00007b44) + Brainamp file reader + (0x61894b28, 0x185e57d2) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename (header) + + $ENV{OV_CONVERT_SRC} + false + + + (0x512a166f, 0x5c3ef83f) + Epoch size (in sec) + 0.0625 + 0.0625 + false + + + (0x2cdb2f0b, 0x12f231ea) + Convert stimuli to OpenViBE labels + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -416.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 368.000000 + + + (0x4e7b798a, 0x183beafb) + (0x15ef4ecc, 0xb1af1f0b) + + + (0xad100179, 0xa3c984ab) + 142 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x0000363a, 0x0000021d) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -320 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 224 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 62 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006e9b, 0x000011e0) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 224 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00001797, 0x00007e3e) + + (0x000027aa, 0x00007b44) + 1 + + + (0x00001c6e, 0x00005140) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -398 + + + (0x358ae8b5, 0x0f8bacd1) + 368 + + + (0x3f0a3b27, 0x570913d2) + -256 + + + (0x6267b5c5, 0x676e3e42) + 368 + + + + + (0x000064e4, 0x0000361c) + + (0x0000363a, 0x0000021d) + 0 + + + (0x00006e9b, 0x000011e0) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -297 + + + (0x358ae8b5, 0x0f8bacd1) + 224 + + + (0x3f0a3b27, 0x570913d2) + -256 + + + (0x6267b5c5, 0x676e3e42) + 224 + + + + + (0x000076eb, 0x00002391) + + (0x000027aa, 0x00007b44) + 2 + + + (0x00001c6e, 0x00005140) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -398 + + + (0x358ae8b5, 0x0f8bacd1) + 383 + + + (0x3f0a3b27, 0x570913d2) + -256 + + + (0x6267b5c5, 0x676e3e42) + 383 + + + + + (0x00007f79, 0x0000071c) + + (0x000027aa, 0x00007b44) + 1 + + + (0x0000363a, 0x0000021d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -398 + + + (0x358ae8b5, 0x0f8bacd1) + 368 + + + (0x3f0a3b27, 0x570913d2) + -341 + + + (0x6267b5c5, 0x676e3e42) + 224 + + + + + + + (0x00007a0c, 0x00005523) + This scenario is an example of +how to convert files between formats. + +Conversion may not work correctly for all +possible input and output combinations. + +You may have to customize the scenario +to your particular case. + +If you run this scenario manually from Designer, +please configure the input and output filenames +of the reader and writer boxes. + +Script 'openvibe-convert' relies on this scenario. + + + (0x473d9a43, 0x97fc0a97) + -32 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x000068c0, 0x00005ea6)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00001161, 0x0000421d)","index":0,"name":"Default tab","parentIdentifier":"(0x000068c0, 0x00005ea6)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00000292, 0x000000e5)","index":0,"name":"Empty","parentIdentifier":"(0x00001161, 0x0000421d)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/vhdr2gdf.xml b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/vhdr2gdf.xml new file mode 100644 index 0000000..16cc6f0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/vhdr2gdf.xml @@ -0,0 +1,423 @@ + + 1 + openvibe + 2.0 + + + (0x00002d01, 0x000001dc) + GDF file writer + (0x1e7b2155, 0x107289ce) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x6f752dd0, 0x082a321e) + Stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].gdf + $ENV{OV_CONVERT_DEST} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0xd41e3037, 0xcc12644a) + + + (0xad100179, 0xa3c984ab) + 103 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00003127, 0x0000618f) + Brainamp file reader + (0x61894b28, 0x185e57d2) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename (header) + + $ENV{OV_CONVERT_SRC} + false + + + (0x512a166f, 0x5c3ef83f) + Epoch size (in sec) + 0.0625 + 0.0625 + false + + + (0x2cdb2f0b, 0x12f231ea) + Convert stimuli to OpenViBE labels + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -432.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 352.000000 + + + (0x4e7b798a, 0x183beafb) + (0x15ef4ecc, 0xb1af1f0b) + + + (0xad100179, 0xa3c984ab) + 142 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x000033b2, 0x0000311b) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -320 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 62 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003cff, 0x00005031) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000389, 0x000024f9) + + (0x000033b2, 0x0000311b) + 0 + + + (0x00003cff, 0x00005031) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -297 + + + (0x358ae8b5, 0x0f8bacd1) + 208 + + + (0x3f0a3b27, 0x570913d2) + -256 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + (0x00003e1e, 0x00004245) + + (0x00003127, 0x0000618f) + 1 + + + (0x000033b2, 0x0000311b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -414 + + + (0x358ae8b5, 0x0f8bacd1) + 352 + + + (0x3f0a3b27, 0x570913d2) + -341 + + + (0x6267b5c5, 0x676e3e42) + 208 + + + + + (0x0000555b, 0x00004e94) + + (0x00003127, 0x0000618f) + 1 + + + (0x00002d01, 0x000001dc) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -414 + + + (0x358ae8b5, 0x0f8bacd1) + 352 + + + (0x3f0a3b27, 0x570913d2) + -256 + + + (0x6267b5c5, 0x676e3e42) + 352 + + + + + (0x000059db, 0x00001829) + + (0x00003127, 0x0000618f) + 2 + + + (0x00002d01, 0x000001dc) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -414 + + + (0x358ae8b5, 0x0f8bacd1) + 367 + + + (0x3f0a3b27, 0x570913d2) + -256 + + + (0x6267b5c5, 0x676e3e42) + 367 + + + + + + + (0x00002533, 0x00004d8c) + This scenario is an example of +how to convert files between formats. + +Conversion may not work correctly for all +possible input and output combinations. + +You may have to customize the scenario +to your particular case. + +If you run this scenario manually from Designer, +please configure the input and output filenames +of the reader and writer boxes. + +Script 'openvibe-convert' relies on this scenario. + + + (0x473d9a43, 0x97fc0a97) + -32 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000014a, 0x00007cb3)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006ebe, 0x000037fd)","index":0,"name":"Default tab","parentIdentifier":"(0x0000014a, 0x00007cb3)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000598d, 0x00002a9e)","index":0,"name":"Empty","parentIdentifier":"(0x00006ebe, 0x000037fd)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/vhdr2ov.xml b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/vhdr2ov.xml new file mode 100644 index 0000000..772f973 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/share/vhdr2ov.xml @@ -0,0 +1,438 @@ + + 1 + openvibe + 2.0 + + + (0x00003127, 0x0000618f) + Brainamp file reader + (0x61894b28, 0x185e57d2) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename (header) + + $ENV{OV_CONVERT_SRC} + false + + + (0x512a166f, 0x5c3ef83f) + Epoch size (in sec) + 0.0625 + 0.0625 + false + + + (0x2cdb2f0b, 0x12f231ea) + Convert stimuli to OpenViBE labels + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -464.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 352.000000 + + + (0x4e7b798a, 0x183beafb) + (0x15ef4ecc, 0xb1af1f0b) + + + (0xad100179, 0xa3c984ab) + 142 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00004b51, 0x00001bae) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + (0x6f752dd0, 0x082a321e) + Input stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].ov + $ENV{OV_CONVERT_DEST} + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006408, 0x00007769) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 224 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006fec, 0x00002003) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -320 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 224 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 62 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x0000004b, 0x0000625e) + + (0x00003127, 0x0000618f) + 1 + + + (0x00006fec, 0x00002003) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -446 + + + (0x358ae8b5, 0x0f8bacd1) + 352 + + + (0x3f0a3b27, 0x570913d2) + -341 + + + (0x6267b5c5, 0x676e3e42) + 224 + + + + + (0x00001869, 0x00003931) + + (0x00006fec, 0x00002003) + 0 + + + (0x00006408, 0x00007769) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -297 + + + (0x358ae8b5, 0x0f8bacd1) + 224 + + + (0x3f0a3b27, 0x570913d2) + -256 + + + (0x6267b5c5, 0x676e3e42) + 224 + + + + + (0x00001d9d, 0x00007706) + + (0x00003127, 0x0000618f) + 1 + + + (0x00004b51, 0x00001bae) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -446 + + + (0x358ae8b5, 0x0f8bacd1) + 352 + + + (0x3f0a3b27, 0x570913d2) + -261 + + + (0x6267b5c5, 0x676e3e42) + 376 + + + + + (0x00007829, 0x000076c6) + + (0x00003127, 0x0000618f) + 2 + + + (0x00004b51, 0x00001bae) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + -446 + + + (0x358ae8b5, 0x0f8bacd1) + 367 + + + (0x3f0a3b27, 0x570913d2) + -261 + + + (0x6267b5c5, 0x676e3e42) + 391 + + + + + + + (0x00006e5c, 0x000061b4) + This scenario is an example of +how to convert files between formats. + +Conversion may not work correctly for all +possible input and output combinations. + +You may have to customize the scenario +to your particular case. + +If you run this scenario manually from Designer, +please configure the input and output filenames +of the reader and writer boxes. + +Script 'openvibe-convert' relies on this scenario. + + + (0x473d9a43, 0x97fc0a97) + -32 + + + (0x7234b86b, 0x2b8651a5) + -400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x000003af, 0x00007f63)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00000795, 0x00004f41)","index":0,"name":"Default tab","parentIdentifier":"(0x000003af, 0x00007f63)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000020e3, 0x000015bd)","index":0,"name":"Empty","parentIdentifier":"(0x00000795, 0x00004f41)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/src/openvibe-convert-real.cmd-base b/Masterarbeit/openvibe/extras-master/applications/examples/convert/src/openvibe-convert-real.cmd-base new file mode 100644 index 0000000..c7e3e23 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/src/openvibe-convert-real.cmd-base @@ -0,0 +1,87 @@ +@ECHO OFF + +REM This script is intended to be called via the launch script setting the environment properly + +set Extension=%~x1 +REM remove the dot before the extension +set Extension=%Extension:~1% +set DestinationExtension=%~x2 +set DestinationExtension=%DestinationExtension:~1% + +setlocal EnableDelayedExpansion + +set FormatFrom=(dat vhdr csv gdf ov) +set FormatTo=(csv gdf edf ov) + +rem count arguments +set argC=0 +for %%x in (%*) do Set /A argC+=1 + +if not %argC% == 2 ( + echo Usage: openvibe-convert [sourceFile] [destinationFile] + echo. + echo WARNING: This script is provided as an example only. There is no guarantee that the files + echo will be correctly converted or that they retain all information across the different formats. + echo. + echo Converts stream files from source to dest. + echo File formats are discovered from the filename extensions. + echo. + echo Supported sources are "%FormatFrom%" + echo Supported destinations are "%FormatTo%" + echo. + pause + GOTO:EOF +) + +if %Extension%==~1 ( + echo File extension not found from source filename "%1". + pause + GOTO:EOF +) + +if %DestinationExtension%==~1 ( + echo File extension not found from destination filename "%2". + pause + GOTO:EOF +) + +set From=false +set /a i=0 + +set From=false +for %%x in %FormatFrom% do ( + if %%x==%Extension% ( + set From=true + ) +) + +set To=false +for %%x in %FormatTo% do ( + if %%x==%DestinationExtension% ( + set To=true + ) +) + +if %From%==false ( + echo 'There is no reader box for the .%Extension% format in openvibe' + goto:EOF +) + +if %To%==false ( + echo 'There is no writer box for the .%DestinationExtension% format in openvibe' + goto:EOF +) + +set "ScenarioFolder=%OV_PATH_ROOT%\share\openvibe\scenarios\convert\" + +set "ScenarioToOpen=%Extension%2%DestinationExtension%.xml" + +set OV_CONVERT_SRC=%1 +set OV_CONVERT_DEST=%2 + +REM launch designer +REM echo "%OV_PATH_ROOT%\bin\openvibe-designer" --no-gui --no-session-management --play-fast "!ScenarioFolder!!ScenarioToOpen!" +"%OV_PATH_ROOT%\bin\openvibe-designer" --no-gui --no-session-management --play-fast "!ScenarioFolder!!ScenarioToOpen!" + +endlocal + diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/convert/src/openvibe-convert-real.sh-base b/Masterarbeit/openvibe/extras-master/applications/examples/convert/src/openvibe-convert-real.sh-base new file mode 100644 index 0000000..6ff296c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/convert/src/openvibe-convert-real.sh-base @@ -0,0 +1,91 @@ +#!/bin/bash + +# This script is intended to be called via the launch script setting the environment properly + +LOCAL_BIN_PATH="@CMAKE_INSTALL_FULL_BINDIR@" +if [ "$OV_PATH_BIN" != "" ]; then + LOCAL_BIN_PATH="$OV_PATH_BIN" +fi +LOCAL_LIB_PATH="@CMAKE_INSTALL_FULL_LIBDIR@" +if [ "$OV_PATH_LIB" != "" ]; then + LOCAL_LIB_PATH="$OV_PATH_LIB" +fi +LOCAL_DATA_PATH="@CMAKE_INSTALL_FULL_DATADIR@/openvibe" +if [ "$OV_PATH_DATA" != "" ]; then + LOCAL_DATA_PATH="$OV_PATH_DATA" +fi + +FormatFrom=( "dat" "vhdr" "csv" "gdf" "ov" ) +FormatTo=( "csv" "edf" "gdf" "ov" ) + +if [ $[$BASH_ARGC] != 2 ]; then + echo Usage: openvibe-convert [sourceFile] [destinationFile] + echo + echo WARNING: This script is provided as an example only. There is no guarantee that the files + echo will be correctly converted or that they retain all information across the different formats. + echo + echo Converts stream files from source to dest. + echo File formats are discovered from the filename extensions. + echo + echo Supported sources: ${FormatFrom[@]} + echo Supported destinations: ${FormatTo[@]} + exit 1 +fi + + +#get the extension +Extension="${1##*.}"; +DestinationExtension="${2##*.}"; + +if [ $Extension == $1 ] ; then + echo No file extension found in filename "$1" + exit 1 +fi + +if [ $DestinationExtension == $2 ] ; then + echo No file extension found in filename "$2" + exit 1 +fi + + +#check if the source format is valid +From=false +for x in "${FormatFrom[@]}"; do + if [ "$Extension" == "$x" ]; then + From=true + fi +done + +if [ $From == false ]; then + echo "There is no reader box for the ."$Extension" format in openvibe" + exit 1 +fi + +#check if the destination format is valid +To=false +for x in "${FormatTo[@]}"; do + if [ "$DestinationExtension" == "$x" ]; then + To=true + fi +done + +if [ $To == false ]; then + echo "There is no writer box for the ."$DestinationExtension" format in openvibe" + exit 1 +fi + + +if [ $From ] && [ $To ]; then + + ScenarioFolder="$LOCAL_DATA_PATH/scenarios/convert/" + ScenarioToOpen=$Extension"2"$DestinationExtension".xml" + + #get the files path to the scenario + export OV_CONVERT_SRC=$1 + export OV_CONVERT_DEST=$2 + + #launch designer + "$LOCAL_BIN_PATH/openvibe-designer" --no-gui --no-session-management --play-fast "$ScenarioFolder$ScenarioToOpen" + +fi + diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/external-stimulation-connection/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/examples/external-stimulation-connection/CMakeLists.txt new file mode 100644 index 0000000..ff6965b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/external-stimulation-connection/CMakeLists.txt @@ -0,0 +1,34 @@ +PROJECT(openvibe-external-stimulation-connection-example) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl include/*.h) +INCLUDE_DIRECTORIES(include) + +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyBoost_Thread") + +# --------------------------------- + + + + +# --------------------------------- + + +# ---------------------- +# Generate launch script +# ---------------------- +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/external-stimulation-connection/include/openvibeStimulationConnection.h b/Masterarbeit/openvibe/extras-master/applications/examples/external-stimulation-connection/include/openvibeStimulationConnection.h new file mode 100755 index 0000000..faffa29 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/external-stimulation-connection/include/openvibeStimulationConnection.h @@ -0,0 +1,75 @@ +#pragma once + +#include +#include + +#include // log +#include + +namespace OpenViBE { +class CStimulationConnection +{ +public: + /** + * Create a new OpenvibeStimulationConnection object. + * + * Initiates the message queue. + * + * @param queueName The name of the queue. + * @throw boost::interprocess::interprocess_exception Throws an + * interprocess exception in the queue fails to be created. + */ + explicit CStimulationConnection(std::string queueName = "openvibeExternalStimulations") + : m_messageQueueName(std::move(queueName)) + { + boost::interprocess::message_queue::remove(m_messageQueueName.c_str()); + + try + { + m_messageQueue = new boost::interprocess::message_queue(boost::interprocess::create_only, m_messageQueueName.c_str(), m_maxMessages, + m_chunkLength * sizeof(uint64_t)); + } + catch (boost::interprocess::interprocess_exception& exception) + { + std::cout << exception.what() << std::endl; // log + throw; + } + } + + /** + * Send a stimulation to the OpenViBE Acquisition server on the initiated + * queue. + * + * @throw boost::interprocess::interprocess_exception Throws an exception + * if the message sending failed. + */ + void sendStimulation(const uint64_t stimulationID) const + { + struct timeb currentTime; + + ftime(¤tTime); + + const uint64_t stimulationTime = currentTime.time * 1000 + currentTime.millitm; + uint64_t message[3]; + + message[0] = 0; // unused at the moment + message[1] = stimulationID; + message[2] = stimulationTime; + + try { m_messageQueue->send(&message, sizeof(message), 0); } + catch (boost::interprocess::interprocess_exception& exception) + { + std::cout << exception.what() << std::endl; // log + throw; + } + } + +protected: + std::string m_messageQueueName; + int m_chunkLength = 3; + int m_maxMessages = 5000; + + // openvibe currently uses messages of length of 3 + boost::interprocess::message_queue* m_messageQueue = nullptr; +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/external-stimulation-connection/src/ovesce_main.cpp b/Masterarbeit/openvibe/extras-master/applications/examples/external-stimulation-connection/src/ovesce_main.cpp new file mode 100755 index 0000000..6ecf1b2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/external-stimulation-connection/src/ovesce_main.cpp @@ -0,0 +1,47 @@ +// WARNING: The External Stimulations are a deprecated technique. +// Please use the TCP Tagging approach instead. You can find examples of +// TCP Tagging usage e.g. in the Graz Visualization and the Display Cue Image boxes. +// It is described in the OV web documentation. A simple client can be found +// under modules/tcptagging/. + +#include "openvibeStimulationConnection.h" + +// for the purpose of this example we are using the Beep stimulation +#define OVTK_StimulationId_Beep 0x00008202 + +#include + +#if defined(TARGET_OS_Linux) +#include +#else +#include +#endif + + +/** @file ovesce_main.cpp + * This program is a very simple example of the usage of the Software Stimulation capabilities of OpenViBE Acquisition server. + * + * This program sends a Beep stimulation to the acquisition server, using the default message queue name. + */ + +int main() +{ + std::cout << "WARNING: External Stimulations approach is deprecated.\nFor new code please use the TCP Tagging approach.\n"; + + std::cout << "Creating a new OpenvibeStimulationConnection object" << std::endl; + OpenViBE::CStimulationConnection* osc = new OpenViBE::CStimulationConnection(); + + while (true) + { + std::cout << "Sending a Beep stimulation" << std::endl; + osc->sendStimulation(OVTK_StimulationId_Beep); +#if defined(TARGET_OS_Linux) + sleep(1); +#else + Sleep(1000); +#endif + } + + delete osc; + return 0; +} diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-tcpip/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-tcpip/CMakeLists.txt new file mode 100755 index 0000000..038c756 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-tcpip/CMakeLists.txt @@ -0,0 +1,34 @@ +PROJECT(openvibe-examples-openvibe-to-tcpip) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl include/*.h) +INCLUDE_DIRECTORIES(include) + +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyBoost_System") +INCLUDE("FindThirdPartyPThread") # for ubuntu + +# --------------------------------- +IF(WIN32) + ADD_DEFINITIONS(-D_WIN32_WINNT=0x0501) # for boost::asio +ENDIF(WIN32) + +# ---------------------- +# Generate launch script +# ---------------------- +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials) diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-tcpip/box-tutorials/tcp-writer.xml b/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-tcpip/box-tutorials/tcp-writer.xml new file mode 100755 index 0000000..713ca46 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-tcpip/box-tutorials/tcp-writer.xml @@ -0,0 +1,449 @@ + + 2 + OpenViBE Designer + 2.1.0 + + + + + + (0x00000d28, 0x00002d38) + Stimuli to TCP + (0x02f24947, 0x17fa0477) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + + + (0x007deef9, 0x2f3e95c6) + Port + 5678 + 5679 + false + + + (0x6d7e53dd, 0x6a0a4753) + Output format + Raw + String + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 512 + + + (0x4e7b798a, 0x183beafb) + (0x7a1f4e3a, 0x74c05f92) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000d28, 0x00002d39) + Signal to TCP + (0x02f24947, 0x17fa0477) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + + + (0x007deef9, 0x2f3e95c6) + Port + 5678 + 5678 + false + + + (0x77d3e238, 0xb954ec48) + Output format + Raw + Raw + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x7a1f4e3a, 0x74c05f92) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002055, 0x00006c8d) + Sinus oscillator + (0x7e33bdb8, 0x68194a4a) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 5 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 256 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 224 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x015d7484) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x0000360b, 0x0000614e) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01e683c6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000047dd, 0x00002575) + Keyboard stimulator + (0x00d317b9, 0x6324c3ff) + + + (0x6f752dd0, 0x082a321e) + Outgoing Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0x9b5dd008, 0x475a2ecd) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01b4ded6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + + + (0x000027e0, 0x00000a8f) + + (0x000047dd, 0x00002575) + 0 + + + (0x0000360b, 0x0000614e) + 1 + + + + (0x00002f08, 0x0000570a) + + (0x000047dd, 0x00002575) + 0 + + + (0x00000d28, 0x00002d38) + 0 + + + + (0x000051f8, 0x00001525) + + (0x00002055, 0x00006c8d) + 0 + + + (0x00000d28, 0x00002d39) + 0 + + + + (0x000065a0, 0x0000405a) + + (0x00002055, 0x00006c8d) + 0 + + + (0x0000360b, 0x0000614e) + 0 + + + + + + (0x000008fe, 0x00004de5) + This scenario shows how to send data out from Designer to a TCP/IP client + +Its used together with <b>openvibe-examples-openvibe-to-tcpip</b> application. + +First, start the scenario, and then the application. Then, press a key 'a' +in the Keyboard Stimulator window to see it printed on the side of +the client along with the number of signal bytes received so far. + + + (0x473d9a43, 0x97fc0a97) + 336.000000 + + + (0x7234b86b, 0x2b8651a5) + 65.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x0000360b, 0x0000614e)","childCount":0,"identifier":"(0x000064a1, 0x00002649)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0x000047dd, 0x00002575)","childCount":0,"identifier":"(0x000067f8, 0x000057b7)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000736a, 0x00003296)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":475},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000673a, 0x00000342)","index":0,"name":"Default tab","parentIdentifier":"(0x0000736a, 0x00003296)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00001000, 0x00005b38)","index":0,"name":"Empty","parentIdentifier":"(0x0000673a, 0x00000342)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + OpenViBE to TCP/IP tutorial + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-tcpip/src/tcpip-client.cpp b/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-tcpip/src/tcpip-client.cpp new file mode 100755 index 0000000..c6cb54c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-tcpip/src/tcpip-client.cpp @@ -0,0 +1,203 @@ +/* + * Receives data from one or two OpenViBE TCPWriter boxes, a signal writer and a stimulus writer. + * + * The code reads the two corresponding sockets asynchronously. With signal, the header contents + * are printed first. If a stimulus is received, the code will print out the stimulus + * and how many bytes of signal have been read the meanwhile. In order not to make this + * code more complicated by mutexes, the signal thread does not try to print anything to cout. + * Instead, it either discards the data or writes it to a file (if name has been given) + * + * This code is meant to be used with the corresponding scenario 'tcpwriter.xml' + * + * \author Jussi T. Lindgren (Inria) + * \date 20 May 11 12:55:22 2014 + * + */ + +#ifdef TARGET_HAS_Boost + +#include +#include +#include + +#include +#include +#include + +using boost::asio::ip::tcp; + +/* + * \class TCPWriterClient + * \brief Basic illustratation of how to read from TCPWriter using boost::asio + */ +class TCPWriterClient +{ +protected: + tcp::socket m_stimulusSocket; + tcp::socket m_signalSocket; + + static const int HEADER_SIZE = 32; // signal header size + int m_bufferSize = 0; // signal buffer size + + std::array m_signalHeaderBuffer; + std::vector m_signalBuffer; + + uint64_t m_signalBytesRead = 0; // how many bytes of signal read so far + + boost::asio::streambuf m_stimulusStream; + + std::ofstream m_dataFile; + +public: + ~TCPWriterClient() { if (m_dataFile.is_open()) { m_dataFile.close(); } } + + TCPWriterClient(boost::asio::io_service& ioService, const char* address, const char* signalPort, const char* stimulusPort, const char* dataFilename) + : m_stimulusSocket(ioService), m_signalSocket(ioService) + { + boost::system::error_code error; + tcp::resolver resolver(ioService); + + if (dataFilename != nullptr) { m_dataFile.open(dataFilename, std::ios::binary | std::ios::trunc | std::ios::out); } + + if ((stimulusPort != nullptr) && strcmp(stimulusPort, "0") != 0) + { + // Stimulus port + std::cout << "Connecting to stimulus port [" << address << " : " << stimulusPort << "]\n"; + const tcp::resolver::query query = tcp::resolver::query(tcp::v4(), address, stimulusPort); + m_stimulusSocket.connect(*resolver.resolve(query), error); + + // Tell ASIO to read a stimulus + async_read_until(m_stimulusSocket, m_stimulusStream, "\n", boost::bind(&TCPWriterClient::stimulusHandler, this, boost::asio::placeholders::error)); + } + + if ((signalPort != nullptr) && strcmp(signalPort, "0") != 0) + { + // Signal port + std::cout << "Connecting to signal port [" << address << " : " << signalPort << "]\n"; + const tcp::resolver::query query = tcp::resolver::query(tcp::v4(), address, signalPort); + m_signalSocket.connect(*resolver.resolve(query), error); + + const tcp::no_delay noDelay(true); + m_signalSocket.set_option(noDelay); + + // Tell ASIO to read the signal header + async_read(m_signalSocket, boost::asio::buffer(m_signalHeaderBuffer.data(), HEADER_SIZE), boost::asio::transfer_at_least(HEADER_SIZE), + boost::bind(&TCPWriterClient::signalHeaderHandler, this, boost::asio::placeholders::error)); + } + } + + + void stimulusHandler(const boost::system::error_code& error) + { + if (error == boost::asio::error::eof) { return; } // Connection closed cleanly by peer. + if (error.value() != 0) { throw boost::system::system_error(error); } // Some other error. + + // std::cout.write(stimulusBuffer.data(), strlen(stimulusBuffer.data())); + std::cout << "(" << m_signalBytesRead << " bytes of signal read), stimulus: " << &m_stimulusStream; + + // Tell ASIO to read again + async_read_until(m_stimulusSocket, m_stimulusStream, "\n", boost::bind(&TCPWriterClient::stimulusHandler, this, boost::asio::placeholders::error)); + } + + void signalHeaderHandler(const boost::system::error_code& error) + { + if (error == boost::asio::error::eof) { return; } // Connection closed cleanly by peer. + if (error.value() != 0) { throw boost::system::system_error(error); } // Some other error. + + std::cout << "Received signal header\n"; + + const char* buf = m_signalHeaderBuffer.data(); + + // the print assumes the stream is little endian + + std::cout << " Version: " << ntohl(*(uint32_t*)&buf[0]) << "\n"; + std::cout << " Endianness: " << ntohl(*(uint32_t*)&buf[4]) << "\n"; + std::cout << " Hz: " << *(uint32_t*)&buf[8] << "\n"; + std::cout << " Channels: " << *(uint32_t*)&buf[12] << "\n"; + std::cout << " nSamples: " << *(uint32_t*)&buf[16] << "\n"; + + if (m_dataFile.is_open()) + { + m_dataFile.write(buf, HEADER_SIZE); + m_dataFile.flush(); + } + + std::cout << "Will now read signal in background.\n"; + if (m_stimulusSocket.is_open()) { std::cout << "Stimulations will be printed when received...\n"; } + + const size_t nChannels = size_t(*(uint32_t*)&buf[12]); + const size_t nSamples = size_t(*(uint32_t*)&buf[16]); + + // Note that the buffer size should be the size of the chunk, or the read function may not launch the callback + // before the chunk has been filled. This can cause delays with sparse streams like classifier outputs. + m_bufferSize = int(nSamples * nChannels * sizeof(double)); + m_signalBuffer.resize(m_bufferSize); + + // Tell ASIO to read the actual signal + async_read(m_signalSocket, boost::asio::buffer(m_signalBuffer.data(), m_bufferSize), boost::asio::transfer_at_least(m_bufferSize), + boost::bind(&TCPWriterClient::signalHandler, this, boost::asio::placeholders::error)); + } + + void signalHandler(const boost::system::error_code& error) + { + if (error == boost::asio::error::eof) { return; } // Connection closed cleanly by peer. + if (error.value() != 0) { throw boost::system::system_error(error); } // Some other error. + + // signalBuffer will now contain bufferSize/sizeof(double) amount of samples in doubles. Here we just discard the data. + const char* buf = m_signalBuffer.data(); + //const double* signalData = reinterpret_cast(buf); Use this to fill your data matrix with the signal... + + if (m_dataFile.is_open()) + { + m_dataFile.write(buf, m_bufferSize); + m_dataFile.flush(); + } + + m_signalBytesRead += m_bufferSize; + + // Tell ASIO to read more + async_read(m_signalSocket, boost::asio::buffer(m_signalBuffer.data(), m_bufferSize), boost::asio::transfer_at_least(m_bufferSize), + boost::bind(&TCPWriterClient::signalHandler, this, boost::asio::placeholders::error)); + } +}; + +int main(int argc, char** argv) +{ + try + { + if (argc > 1 && ((strcmp(argv[1], "-h") == 0) || (strcmp(argv[1], "--help") == 0) || (argc != 4 && argc != 5))) + { + std::cout << "Usage: " << argv[0] << " ip_address signal_port stimulus_port [signal_file]" << std::endl; + std::cout << "If no argument is given, the program tries to communicate on localhost using default port value." << std::endl; + std::cout << "Ports that are 0 will be skipped. Optional filename can be specified to write the signal to." << std::endl; + return EXIT_SUCCESS; + } + + const char* hostname = "localhost"; + const char* signalPort = "5678"; + const char* stimulusPort = "5679"; + const char* filename = nullptr; + + if (argc >= 4) + { + hostname = argv[1]; + signalPort = argv[2]; + stimulusPort = argv[3]; + } + if (argc == 5) { filename = argv[4]; } + + std::cout << "This example is intended to be used together with the tcp-writer.xml tutorial.\n\n"; + boost::asio::io_service ioService; + TCPWriterClient client(ioService, hostname, signalPort, stimulusPort, filename); + ioService.run(); + } + catch (std::exception& e) + { + std::cerr << e.what() << std::endl; + return 1; + } + + return 0; +} + +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-vrpn/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-vrpn/CMakeLists.txt new file mode 100755 index 0000000..2a2309c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-vrpn/CMakeLists.txt @@ -0,0 +1,42 @@ +PROJECT(openvibe-examples-openvibe-to-vrpn) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +INCLUDE("FindThirdPartyVRPN_Check") +IF(NOT PATH_VRPN) + MESSAGE(STATUS " --> Not building ${PROJECT_NAME}") + RETURN() +ENDIF(NOT PATH_VRPN) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl include/*.h) +INCLUDE_DIRECTORIES(include) + +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +INCLUDE("FindThirdPartyVRPN") +INCLUDE("FindThirdPartyPThread") # needed on Linux for VRPN + +# --------------------------------- + + + + +# --------------------------------- + + +# ---------------------- +# Generate launch script +# ---------------------- +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials) diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-vrpn/box-tutorials/vrpn-example-openvibe-to-vrpn.xml b/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-vrpn/box-tutorials/vrpn-example-openvibe-to-vrpn.xml new file mode 100755 index 0000000..266cc61 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-vrpn/box-tutorials/vrpn-example-openvibe-to-vrpn.xml @@ -0,0 +1,456 @@ + + 2 + OpenViBE Designer + 2.1.0 + + + + + + (0x00002376, 0x00000c86) + Analog VRPN Server + (0x0ddc3a7e, 0x6f6e6401) + + + (0x544a003e, 0x6dcba5f6) + Input 1 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + openvibe_vrpn_analog + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 176 + + + (0x4e7b798a, 0x183beafb) + (0x2f4c9e00, 0x5dc619e4) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000027ff, 0x00005a50) + Sinus oscillator + (0x7e33bdb8, 0x68194a4a) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 1 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 1 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 224 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00002cc0, 0x00006f7a) + Keyboard stimulator + (0x00d317b9, 0x6324c3ff) + + + (0x6f752dd0, 0x082a321e) + Outgoing Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0x9b5dd008, 0x475a2ecd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00002d5e, 0x00007cd2) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00007850, 0x00005bfd) + Button VRPN Server + (0x0e382e6f, 0x5be1f00c) + + + (0x6f752dd0, 0x082a321e) + Input 1 + + + (0x6f752dd0, 0x082a321e) + Input 2 + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn + openvibe_vrpn_button + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 2 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0x1473765a, 0x12eb3520) + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000031fc, 0x000020b2) + + (0x000027ff, 0x00005a50) + 0 + + + (0x00002d5e, 0x00007cd2) + 0 + + + + (0x000057e0, 0x0000296b) + + (0x00002cc0, 0x00006f7a) + 0 + + + (0x00007850, 0x00005bfd) + 1 + + + + (0x0000597d, 0x00006474) + + (0x00002cc0, 0x00006f7a) + 0 + + + (0x00002d5e, 0x00007cd2) + 1 + + + + (0x00005e72, 0x000010d3) + + (0x000027ff, 0x00005a50) + 0 + + + (0x00002376, 0x00000c86) + 0 + + + + (0x0000778f, 0x00004d50) + + (0x00002cc0, 0x00006f7a) + 0 + + + (0x00007850, 0x00005bfd) + 0 + + + + + + (0x00005985, 0x000006ab) + This scenario is described in + +http://openvibe.inria.fr/vrpn-tutorial-sending-data-from-openvibe-to-an-external-application/ + +Its used together with <b>openvibe-examples-openvibe-to-vrpn</b> application. + + + (0x473d9a43, 0x97fc0a97) + 336 + + + (0x7234b86b, 0x2b8651a5) + 64 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00002d5e, 0x00007cd2)","childCount":0,"identifier":"(0x00001268, 0x00000dc0)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00003d74, 0x00007c81)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0x00002cc0, 0x00006f7a)","childCount":0,"identifier":"(0x000049f0, 0x00007d33)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000561d, 0x00000276)","index":0,"name":"Default tab","parentIdentifier":"(0x00003d74, 0x00007c81)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000198f, 0x000068c3)","index":0,"name":"Empty","parentIdentifier":"(0x0000561d, 0x00000276)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + OpenViBE to VRPN tutorial + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/vrpn-tutorial-sending-data-from-openvibe-to-an-external-application/ + + + (0xf6b2e3fa, 0x7bd43926) + Examples + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-vrpn/src/vrpn-receiver.cpp b/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-vrpn/src/vrpn-receiver.cpp new file mode 100755 index 0000000..ec2642e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/openvibe-to-vrpn/src/vrpn-receiver.cpp @@ -0,0 +1,69 @@ +/* + * Receives data from OpenViBE's VRPN boxes + * + * See here: http://openvibe.inria.fr/vrpn-tutorial-sending-data-from-openvibe-to-an-external-application/ + * + */ + +#include + +#include +#include + +void VRPN_CALLBACK VrpnButtonCallback(void* userData, vrpn_BUTTONCB button) +{ + std::cout << "Button ID : " << button.button << " / Button State : " << button.state << std::endl; + + if (button.button == 1) + { + std::cout << "Quit requested by button press" << std::endl; + *static_cast(userData) = false; + } +} + +void VRPN_CALLBACK VrpnAnalogCallback(void* /*user_data*/, vrpn_ANALOGCB analog) +{ + for (int i = 0; i < analog.num_channel; ++i) { std::cout << "Analog Channel : " << i << " / Analog Value : " << analog.channel[i] << std::endl; } +} + +int main(const int argc, char** argv) +{ + if (argc != 1 && argc != 3) + { + std::cout << "Usage:\n\n" << argv[0] << " [buttonDevice] [analogDevice]\n"; + return 1; + } + + const char* buttonDevice = "openvibe_vrpn_button@localhost"; + const char* analogDevice = "openvibe_vrpn_analog@localhost"; + + if (argc == 3) + { + buttonDevice = argv[1]; + analogDevice = argv[2]; + } + + std::cout << "Polling these VRPN devices\n Button: " << buttonDevice << "\n Analog: " << analogDevice << "\n"; + + /* flag used to stop the program execution */ + bool running = true; + + /* Binding of the VRPN Button to a callback */ + vrpn_Button_Remote* vrpnButton = new vrpn_Button_Remote(buttonDevice); + vrpnButton->register_change_handler(&running, VrpnButtonCallback); + + /* Binding of the VRPN Analog to a callback */ + vrpn_Analog_Remote* vrpnAnalog = new vrpn_Analog_Remote(analogDevice); + vrpnAnalog->register_change_handler(nullptr, VrpnAnalogCallback); + + /* The main loop of the program, each VRPN object must be called in order to process data */ + while (running) { vrpnButton->mainloop(); } + + vrpnAnalog->unregister_change_handler(nullptr, VrpnAnalogCallback); + vrpnButton->unregister_change_handler(&running, VrpnButtonCallback); + + delete vrpnButton; + delete vrpnAnalog; + + return 0; +} diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/CMakeLists.txt new file mode 100755 index 0000000..095285f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/CMakeLists.txt @@ -0,0 +1,42 @@ +PROJECT(openvibe-examples-vrpn-to-openvibe) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +INCLUDE("FindThirdPartyVRPN_Check") +IF(NOT PATH_VRPN) + MESSAGE(STATUS " --> Not building ${PROJECT_NAME}") + RETURN() +ENDIF(NOT PATH_VRPN) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl include/*.h) +INCLUDE_DIRECTORIES(include) + +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +INCLUDE("FindThirdPartyVRPN") +INCLUDE("FindThirdPartyPThread") # needed on Linux for VRPN + +# --------------------------------- + + + + +# --------------------------------- + + +# ---------------------- +# Generate launch script +# ---------------------- +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials) diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/box-tutorials/vrpn-example-vrpn-to-openvibe.xml b/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/box-tutorials/vrpn-example-vrpn-to-openvibe.xml new file mode 100755 index 0000000..034fb44 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/box-tutorials/vrpn-example-vrpn-to-openvibe.xml @@ -0,0 +1,385 @@ + + 1 + openvibe + 2.0 + + + (0x00000f15, 0x00007fd2) + Button VRPN Client + (0x40714327, 0x458877d2) + + + (0x6f752dd0, 0x082a321e) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn@localhost + button_test@localhost:50555 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 ON + OVTK_GDF_Feedback_Continuous + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Button 1 OFF + OVTK_GDF_End_Of_Trial + OVTK_StimulationId_Label_01 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0x09fd9ef3, 0xeb8c3069) + + + (0xad100179, 0xa3c984ab) + 152 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x0000142f, 0x00005e51) + Analog VRPN Client + (0x7cf4a95e, 0x7270d07b) + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Peripheral name + openvibe-vrpn@localhost + analog_test@localhost:50555 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling Rate + 512 + 100 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Channels + 16 + 2 + false + + + (0x007deef9, 0x2f3e95c6) + Sample Count per Sent Block + 32 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0x8888a3e2, 0xedc76707) + + + (0xad100179, 0xa3c984ab) + 154 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x0000322d, 0x00004eed) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352.000000 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 304.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 113 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + + + (0x00001f38, 0x00000a57) + + (0x00000f15, 0x00007fd2) + 0 + + + (0x0000322d, 0x00004eed) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 233 + + + (0x358ae8b5, 0x0f8bacd1) + 400 + + + (0x3f0a3b27, 0x570913d2) + 328 + + + (0x6267b5c5, 0x676e3e42) + 304 + + + + + (0x00003ce7, 0x00000907) + + (0x0000142f, 0x00005e51) + 0 + + + (0x0000322d, 0x00004eed) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 227 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 328 + + + (0x6267b5c5, 0x676e3e42) + 289 + + + + + + + (0x0000796e, 0x00004e00) + This scenario is described in + +http://openvibe.inria.fr/vrpn-tutorial-sending-data-from-an-external-application-to-openvibe/ + +Its used together with <b>openvibe-examples-vrpn-to-openvibe</b> application. + + + (0x473d9a43, 0x97fc0a97) + 336 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x0000322d, 0x00004eed)","childCount":0,"identifier":"(0x0000007b, 0x0000045c)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00007e32, 0x0000369d)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004cc4, 0x00004f75)","index":0,"name":"Default tab","parentIdentifier":"(0x00007e32, 0x0000369d)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00000f17, 0x00002485)","index":0,"name":"Empty","parentIdentifier":"(0x00004cc4, 0x00004f75)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + VRPN to OpenViBE tutorial + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/vrpn-tutorial-sending-data-from-an-external-application-to-openvibe/ + + + (0xf6b2e3fa, 0x7bd43926) + Examples + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/src/GenericVRPNServer.cpp b/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/src/GenericVRPNServer.cpp new file mode 100755 index 0000000..e6e7137 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/src/GenericVRPNServer.cpp @@ -0,0 +1,87 @@ +#include "GenericVRPNServer.h" + +#include +#include +#include + +#include + +CGenericVrpnServer* CGenericVrpnServer::m_serverInstance = nullptr; + +CGenericVrpnServer::CGenericVrpnServer(const int port) { m_connection = vrpn_create_server_connection(port); } + +CGenericVrpnServer::~CGenericVrpnServer() { deleteInstance(); } + +CGenericVrpnServer* CGenericVrpnServer::getInstance(const int port) +{ + if (m_serverInstance == nullptr) { m_serverInstance = new CGenericVrpnServer(port); } + return m_serverInstance; +} + +void CGenericVrpnServer::deleteInstance() +{ + for (auto it = m_serverInstance->m_buttonServer.begin(); it != m_serverInstance->m_buttonServer.end(); ++it) { delete it->second.server; } + m_serverInstance->m_buttonServer.clear(); + + for (auto it = m_serverInstance->m_analogServer.begin(); it != m_serverInstance->m_analogServer.end(); ++it) { delete it->second.server; } + m_serverInstance->m_analogServer.clear(); + + delete m_serverInstance; + m_serverInstance = nullptr; +} + +void CGenericVrpnServer::loop() +{ + for (auto it = m_buttonServer.begin(); it != m_buttonServer.end(); ++it) { it->second.server->mainloop(); } + for (auto it = m_analogServer.begin(); it != m_analogServer.end(); ++it) { it->second.server->mainloop(); } + m_connection->mainloop(); +} + + +void CGenericVrpnServer::addButton(const std::string& name, const int buttonCount) +{ + SButtonServer serverObject; + + serverObject.server = new vrpn_Button_Server(name.c_str(), m_connection, buttonCount); + serverObject.nButton = buttonCount; + + m_buttonServer.insert(std::pair(name, serverObject)); + m_buttonServer[name].cache.clear(); + m_buttonServer[name].cache.resize(buttonCount); +} + +void CGenericVrpnServer::changeButtonState(const std::string& name, const int index, const int state) +{ + m_buttonServer[name].server->set_button(index, state); + m_buttonServer[name].cache[index] = state; +} + +int CGenericVrpnServer::getButtonState(const std::string& name, const int index) { return m_buttonServer[name].cache[index]; } + +void CGenericVrpnServer::addAnalog(const std::string& name, const int nChannel) +{ + SAnalogServer serverObject; + + serverObject.server = new vrpn_Analog_Server(name.c_str(), m_connection, nChannel); + serverObject.nChannel = nChannel; + + m_analogServer.insert(std::pair(name, serverObject)); +} + +void CGenericVrpnServer::changeAnalogState(const std::string& name, ...) +{ + double* channels = m_analogServer[name].server->channels(); + + va_list list; + va_start(list, name); + + for (int i = 0; i < m_analogServer[name].nChannel; ++i) { channels[i] = va_arg(list, double); } + + va_end(list); + + m_analogServer[name].server->report(); +} + +double* CGenericVrpnServer::getAnalogChannels(const std::string& name) { return m_analogServer[name].server->channels(); } + +void CGenericVrpnServer::reportAnalogChanges(const std::string& name) { m_analogServer[name].server->report(); } diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/src/GenericVRPNServer.h b/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/src/GenericVRPNServer.h new file mode 100755 index 0000000..a431398 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/src/GenericVRPNServer.h @@ -0,0 +1,103 @@ +/** + * \file GenericVRPNServer.h + * \author Jozef Legény + * + * Copyright : Inria (2012) + * License : LGPLv2 -> AGPL3 + */ + +#pragma once + +#include +#include +#include + +class vrpn_Connection; +class vrpn_Button_Server; +class vrpn_Analog_Server; + +/** + * \class CGenericVrpnServer + * \brief A class providing a very simple generic VRPN server capable of creating Analog and Button controls. + */ +class CGenericVrpnServer +{ +public: + struct SButtonServer + { + vrpn_Button_Server* server; + int nButton; + std::vector cache; + }; + + struct SAnalogServer + { + vrpn_Analog_Server* server; + int nChannel; + }; + + /// Public singleton factory + static CGenericVrpnServer* getInstance(const int port); + + static void deleteInstance(); + + /// Public destructor + ~CGenericVrpnServer(); + + /// The loop() method has to be called periodically in order for vrpn to work + void loop(); + + /** Creates a new button object within the VRPN server + * \param name name of the vrpn peripheral + * \param buttonCount number of virtual buttons in the peripeheral + */ + void addButton(const std::string& name, const int buttonCount); + + /** Change the button state of a button inside a created VRPN peripheral + * \param name name of the vrpn peripheral containing the button + * \param index index of the button (beginning by 0) + * \param state new state of the button 0 = off, 1 = on + */ + void changeButtonState(const std::string& name, const int index, const int state); + + + /** Get the state of a button + * \param name name of the vrpn peripheral containing the button + * \param index index of the button (beginning by 0) + * \return the state of the button + */ + int getButtonState(const std::string& name, const int index); + + /** Creates a new analog object within the VRPN server + * \param name name of the vrpn peripheral + * \param nChannel number of channels in the peripeheral + */ + void addAnalog(const std::string& name, const int nChannel); + + /** Change the state of channels of an analog VRPN peripheral + * \param name name of the vrpn peripheral containing the analog control + * \param ... : list of the values (double) + */ + void changeAnalogState(const std::string& name, ...); + + + /** Gets a pointer to the channel array + * \param name name of the vrpn peripheral containing the analog control + * \return pointer to the array containing the channels + */ + double* getAnalogChannels(const std::string& name); + + /** Marks the selected analog server channels as modified so the values are sent in the next loop + * \param name name of the vrpn peripheral containing the analog control + */ + void reportAnalogChanges(const std::string& name); + +protected: + static CGenericVrpnServer* m_serverInstance; + + explicit CGenericVrpnServer(const int port); + + vrpn_Connection* m_connection = nullptr; + std::map m_buttonServer; + std::map m_analogServer; +}; diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/src/linux-vrpn_main.cpp b/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/src/linux-vrpn_main.cpp new file mode 100755 index 0000000..b0aa0b1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/src/linux-vrpn_main.cpp @@ -0,0 +1,50 @@ +#if !defined(WIN32) + +#include "GenericVRPNServer.h" +#include +#include +#include + +#define DEFAULT_PORT 50555 + +int main(int argc, char** argv) +{ + CGenericVrpnServer* vrpnServer = CGenericVrpnServer::getInstance(DEFAULT_PORT); + + const char* buttonDevice = "button_test"; + const char* analogDevice = "analog_test"; + + std::cout << "Creating devices [" << buttonDevice << "] and [" << analogDevice << "] using port [" << DEFAULT_PORT << "]\n"; + + vrpnServer->addButton(buttonDevice, 1); + vrpnServer->addAnalog(analogDevice, 2); + + double time = 0; + double period = 0; + + while (true) + { + if (period >= 2 * M_PI) + { + vrpnServer->changeButtonState(buttonDevice, 0, 1 - vrpnServer->getButtonState(buttonDevice, 0)); + period = 0; + } + + vrpnServer->changeAnalogState(analogDevice, sin(time), cos(time)); + + time = time + 0.01; + period = period + 0.01; + + vrpnServer->loop(); + + // sleep for 10 miliseconds (on Unix) + usleep(10000); + } + + CGenericVrpnServer::deleteInstance(); + vrpnServer = nullptr; + + return 0; +} + +#endif // !WIN32 diff --git a/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/src/win32-vrpn_main.cpp b/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/src/win32-vrpn_main.cpp new file mode 100755 index 0000000..e35ab38 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/examples/vrpn-to-openvibe/src/win32-vrpn_main.cpp @@ -0,0 +1,51 @@ +#if defined(WIN32) + +#include "GenericVRPNServer.h" +#include +#define _USE_MATH_DEFINES +#include +#include + +#define DEFAULT_PORT 50555 + +int main(int /*argc*/, char** /*argv*/) +{ + CGenericVrpnServer* vrpnServer = CGenericVrpnServer::getInstance(DEFAULT_PORT); + + const char* buttonDevice = "button_test"; + const char* analogDevice = "analog_test"; + + std::cout << "Creating devices [" << buttonDevice << "] and [" << analogDevice << "] using port [" << DEFAULT_PORT << "]\n"; + + vrpnServer->addButton(buttonDevice, 1); + vrpnServer->addAnalog(analogDevice, 2); + + double time = 0; + double period = 0; + + while (true) + { + if (period >= 2 * M_PI) + { + vrpnServer->changeButtonState(buttonDevice, 0, 1 - vrpnServer->getButtonState(buttonDevice, 0)); + period = 0; + } + + vrpnServer->changeAnalogState(analogDevice, sin(time), cos(time)); + + time = time + 0.01; + period = period + 0.01; + + vrpnServer->loop(); + + // sleep for 10 miliseconds + Sleep(10); + } + + CGenericVrpnServer::deleteInstance(); + vrpnServer = nullptr; + + return 0; +} + +#endif // WIN32 diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/platform/CMakeLists.txt new file mode 100644 index 0000000..cf14819 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/CMakeLists.txt @@ -0,0 +1,4 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("APPLICATIONS_PLATFORM") + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/CMakeLists.txt new file mode 100644 index 0000000..2c0027b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/CMakeLists.txt @@ -0,0 +1,120 @@ + +IF(OV_DISABLE_GTK) + MESSAGE(STATUS "Skipping Acquisition Server, no GTK") + RETURN() +ENDIF(OV_DISABLE_GTK) + +PROJECT(openvibe-acquisition-server) + +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +# We call this first as some dependency getters have been coded to not find the libs on x64 until supported +# --------------------------------- + + + + +# --------------------------------- +IF(WIN32) + ADD_DEFINITIONS(-DWIN32_LEAN_AND_MEAN) +ENDIF(WIN32) + + +INCLUDE("FindOpenViBEContributions") + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl include/*.h ${CMAKE_SOURCE_DIR}/contrib/common/contribAcquisitionServer.*) + +IF(PATH_OPENVIBE_CONTRIBUTIONS) + INCLUDE("${CMAKE_SOURCE_DIR}/contrib/common/contribAcquisitionServer.cmake") +ENDIF(PATH_OPENVIBE_CONTRIBUTIONS) + +SET(ADDITIONAL_PATH "${CMAKE_SOURCE_DIR}/plugins/server-extensions/") +FILE(GLOB_RECURSE ADDITIONAL_SRC_FILES ${ADDITIONAL_PATH}/*.cpp ${ADDITIONAL_PATH}/*.h) +SET(SRC_FILES "${SRC_FILES};${ADDITIONAL_SRC_FILES}") + +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} + openvibe-module-labstreamlayer) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) +INCLUDE_DIRECTORIES("src/drivers") +INCLUDE_DIRECTORIES("include") + +# add include paths for non-contrib server plugins +FILE(GLOB children ${ADDITIONAL_PATH}/*) +FOREACH(FILENAME ${children}) + # MESSAGE("Testing ${FILENAME}") + IF(IS_DIRECTORY ${FILENAME}) + # MESSAGE("Adding ${FILENAME}") + INCLUDE_DIRECTORIES(${FILENAME}) + ENDIF(IS_DIRECTORY ${FILENAME}) +ENDFOREACH(FILENAME) + + + + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleSocket") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindThirdPartyGTK") +INCLUDE("FindThirdPartyBoost_System") + +IF(WIN32) + # @FIXME CERT getting timeBeginPeriod() linker issues without this + TARGET_LINK_LIBRARIES(${PROJECT_NAME} winmm) +ENDIF(WIN32) + +# These scripts will also add directives to copy the necessary bin dlls if any +INCLUDE("FindThirdPartyActiCHampAPI") +INCLUDE("FindThirdPartyBioSemiLabViewAPI") +INCLUDE("FindThirdPartyEmotivAPI") +INCLUDE("FindThirdPartyNeXus") +INCLUDE("FindThirdPartyMCS") +INCLUDE("FindThirdPartyMensiaAcquisition") +INCLUDE("FindThirdPartyMicromed") +INCLUDE("FindThirdPartyNeuroelectricsEnobio3G") +INCLUDE("FindThirdPartyNeuroServoDeps") +INCLUDE("FindThirdPartyThinkGearAPI") +INCLUDE("FindThirdPartyTMSi") +INCLUDE("FindThirdPartyUSBFirstAmpAPI") +INCLUDE("FindThirdPartyLiveAmpAPI") + +INCLUDE("FindThirdPartyOpenAL") +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyPThread") # for Windows Fieldtrip +INCLUDE("FindThirdPartyRT") # external stims shared memory needs this + +INCLUDE("FindThirdPartyLSL") + +IF(PATH_OPENVIBE_CONTRIBUTIONS) + LIST(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/contrib/cmake-modules") + INCLUDE("${CMAKE_SOURCE_DIR}/contrib/common/contribAcquisitionServerLinkLibs.cmake") +ENDIF(PATH_OPENVIBE_CONTRIBUTIONS) + +IF(NOT(DISABLE_MENSIA_ACQUISITION_DRIVER)) + ADD_DEFINITIONS(-DTARGET_HasMensiaAcquisitionDriver) +ENDIF() + + + +# ---------------------- +# Generate launch script +# ---------------------- +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +CONFIGURE_FILE("share/interface.ui-base" "${CMAKE_CURRENT_BINARY_DIR}/interface.ui") + +INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/interface.ui" DESTINATION ${DIST_DATADIR}/openvibe/applications/acquisition-server) +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/applications/acquisition-server PATTERN "*-base" EXCLUDE) + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/include/ovasIAcquisitionServerPlugin.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/include/ovasIAcquisitionServerPlugin.h new file mode 100755 index 0000000..be4c297 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/include/ovasIAcquisitionServerPlugin.h @@ -0,0 +1,67 @@ +#pragma once + +#include "ovas_base.h" + +#include "../ovasCSettingsHelper.h" + +#include "boost/variant.hpp" +#include + +/** + * \brief Interface for acquisition server plugins + * + * Contains an interface to the acquisition server plugins. Any plugin must inherit from this class in order to be able to register with the acquisition server. + */ + +namespace OpenViBE { +namespace AcquisitionServer { +class CAcquisitionServer; + +class IAcquisitionServerPlugin +{ +public: + // Interface of the plugin. To develop a new plugin override any of the Hook functions in your implementation. + + /// Hook called at the end of the AcquisitionServer constructor + virtual void createHook() {} + + /// Hook called at the end of the start() function of AcquisitionServer. At this point the device has been connected to, + /// and signal properties should already be correct. + /// This function should return false if start failed. + virtual bool startHook(const std::vector& /*selectedChannelNames*/, const size_t /*sampling*/, const size_t /*nChannel*/, + const size_t /*nSamplePerSentBlock*/) { return true; } + + /// Hook called at the end of the stop() function of AcquisitionServer + virtual void stopHook() {} + + + /** \brief Hook called in the loop() function of AcquisitionServer + * + * This hook is called before sending the stimulations or signal to the connected clients. + * It gets a reference to the current signal buffer and the stimulation set with its start and end dates. + * + * Note that the given input buffer may have more samples than what should be processed + * per iteration. All operations on vPendingBuffer done in the hook should only consider + * the first sampleCountSentPerBlock samples. The later samples should be left as-is + * and will be provided on the next call. + */ + virtual void loopHook(std::deque>& /*pendingBuffer*/, CStimulationSet& /*stimulationSet*/, const uint64_t /*start*/, + const uint64_t /*end*/, const uint64_t /*sampleTime*/) {} + + /// Hook called at the end of the acceptNewConnection() function of AcquisitionServer + virtual void acceptNewConnectionHook() {} + + IAcquisitionServerPlugin(const Kernel::IKernelContext& ctx, const CString& name) + : m_kernelCtx(ctx), m_settings(name, ctx.getConfigurationManager()) {} + + virtual ~IAcquisitionServerPlugin() {} + + const SettingsHelper& getSettingsHelper() const { return m_settings; } + SettingsHelper& getSettingsHelper() { return m_settings; } + +protected: + const Kernel::IKernelContext& m_kernelCtx; + SettingsHelper m_settings; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/include/ovasIDriver.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/include/ovasIDriver.h new file mode 100644 index 0000000..74c562d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/include/ovasIDriver.h @@ -0,0 +1,510 @@ +#pragma once + +#include "ovas_base.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class IHeader; + +enum class EDriverFlag { IsUnstable, IsDeprecated }; + +/** + * \class IDriverContext + * \author Yann Renard (INRIA/IRISA) + * \date 2009-10-12 + * \brief Base class for kernel functioanlities access from the driver classes + * \sa IDriver + */ +class IDriverContext +{ +public: + + /** + * \brief Destructor + */ + virtual ~IDriverContext() { } + + /** + * \brief Gets the kernel Log Manager + * \return the kernel Log Manager + * \sa Kernel::ILogManager + */ + virtual Kernel::ILogManager& getLogManager() const = 0; + /** + * \brief Gets the kernel Configuration Manager + * \return the kernel Configuration Manager + * \sa Kernel::IConfigurationManager + */ + virtual Kernel::IConfigurationManager& getConfigurationManager() const = 0; + /** + * \brief Gets connection status + * \return \e true if the driver is connected + * \return \e false if the driver is not connected + * \sa isStarted + */ + virtual bool isConnected() const = 0; + /** + * \brief Gets acquisition status + * \return \e true if acquisition is started + * \return \e false if acquisition is stoped + * \sa isConnected + */ + virtual bool isStarted() const = 0; + /** + * \brief Checks if impedance check is required (when available) + * \return \e true if impedance check is required + * \return \e false if impedance check is not required + * + * It is up to the driver to check whether impedance check is required by + * the acquisition server or not. If this test is required, then the driver + * should perform impedance measures while initialized but not yet started. + */ + virtual bool isImpedanceCheckRequested() const = 0; + /** + * \brief Gets drift sample count + * \return \e the drift sample count + * \sa correctDriftSampleCount + * + * This function returns the difference between the theorical + * number of samples this driver should have sent so far and + * the number of samples it actually sent. This drift sample + * count is computed by the acquisition server and can be used + * to correct a drifting device behavior. + * + * \note If this number is less than 0 then samples are missing + * \note If this number if more than 0 then there are too much samples + * \note If this number is exactly 0 then the driver sent the exact + * number of samples it had to send + */ + virtual int64_t getDriftSampleCount() const = 0; + /** + * \brief Gets the drift sample count tolerance + * \return \e the drift sample count tolerance + * + * Gets the tolerance configured for the acquisition server. This + * tolerance is present to avoid numerous corrections on a drift + * value that would oscillate in a small range around 0. In such case, + * a correction in a way would probably turn in a correction in the + * opposite way a few seconds later, resulting in crap measurements + * because of irregular but valid source. + * + * If the actual drift is in the [-tolerance +tolerance] range, + * better don't correct it. + */ + virtual int64_t getDriftToleranceSampleCount() const = 0; + /** + * \brief Gets the suggested drift correction sample count + * \return \e the suggested drift correction sample count + * + * In case you don't want to manage how much samples should + * be used to correct the drift, you could simply use this function. The + * algorithm used to compute the returned value should be considered + * as undefined. This computation could change over time and versions + * of OpenViBE. That means the driver should not make any assumption + * on the way of computing the actual value returned by this function. + */ + virtual int64_t getSuggestedDriftCorrectionSampleCount() const = 0; + /** + * \brief Corrects a drifting device + * \return \e true in case of success + * \return \e false in case of error + * \sa getDriftSampleCount + * \sa setInnerLatencySampleCount + * + * Some devices don't sent the number of samples they promised to + * while requesting sampling rate. This can be for multiple reasons + * but the most probable one is that the device does not have its + * internal clock synchronized with the internal computer clock. + * OpenViBE data being dated with a start / end time, it is important + * for synchronisation purpose that all the theorical number of + * samples per second is preserved. + * + * In case the difference between the theorical number of samples + * this driver should have sent so far and the number of samples + * it actually sent becomes too big, this function helps to + * correct the drifting, removing or adding dummy samples. + * In a strict signal processing point of view those samples + * can't be considered as valid. However, this is the only way + * to guarantee that the timings are preserved. + * + * \note Passing a negative value removes samples + * \note Passing a positive value adds samples + * \note Passing 0 does nothing + * \note This function can be called several times if needed + * but does not change what \ref getDriftSampleCount + * returns until the next \ref IDriver::loop execution + * \warning Please be careful when calling this function. + * Consider the fact that there could be some drifting + * in the device and ths OS-level driver itself, or even + * in the communication pipeline to the prorprietary + * acquisition software. As an OpenViBE driver developer, + * you should allow an arbitrary small drifting (which + * range depends of the actual driver you are creating). + */ + virtual bool correctDriftSampleCount(const int64_t nSample) = 0; + /** + * \brief Sets a fixed latency due to the driver implementation and / or hardware + * \param nSample [in] : the number of samples for the inner latency + * \return \e true in case of success + * \return \e false in case of error + * + * Some drivers / hardware devices implement processes that delay the + * overall acquisition stream. Such processes include for instance + * sample buffering or temporal filtering. The delay induced by these + * processes can not be known by the acquisition server in a generic way + * and are usually not provided by the device manufacturer. An intelligent + * setup based on hardware tagging could however induce a fair estimate of this + * latency so that it can be injected in the drift correction process. + * Driver developers will generally not have to care about this feature. + * However, if it is important to have neurophysiologically relevant measures + * (more particularly on ERPs) and it is know that the driver and / or hardware + * has a latency, this latency compensation can be injected in the drift correction + * process using the aforementionned function. + * + * \note Passing a positive value supposes the driver / hardware induce a delay which shall be corrected + * \note Passing a negative value supposes the driver / hardware is able to predict and send future measures before they actually get measured (probably not recommended) + * \note Passing 0 supposes both the driver and hardware are ideals and send samples immediately to the acquisition server as they happen on the scalp + * \note Default configuration supposes both the driver and hardware are ideal, thus sets the inner latency to 0 + * + * \sa getInnerLatencySampleCount + */ + virtual void setInnerLatencySampleCount(const int64_t nSample) = 0; + /** + * \brief Gets the fixed latency due to the driver implementation and / or hardware + * \return \e The inner latency of the driver in sample count + * \sa setInnerLatencySampleCount + */ + virtual int64_t getInnerLatencySampleCount() const = 0; + + /** + * \brief Updates impedance for a specific channel + * \param index [in] : the index of the channel should be updated + * \param impedance [in] : the impedance of the specified channel (in ohm) + * \return \e true in case of success. + * \return \e false in case of error. + * + * This can be used during initialization phase to check + * if impedances are correct. This function should be connected + * while the driver is initialized and not started. + * + * If \c impedance is -1, then the impedance is considered as "unknown / measuring" + * If \c impedance is -2, then the impedance is considered as "unknown / not available" + * If \c impedance is any other negative value, then the impedance is considered as "unknown" + */ + virtual bool updateImpedance(const size_t index, const double impedance) = 0; +}; + +/** + * \class IDriverCallback + * \author Yann Renard (INRIA/IRISA) + * \date 2007-04-01 + * \brief Base class for all the OpenViBE acquisition server driver callbacks + * + * Objects derived from this class are called by any driver to provide + * built sample buffers. + * + * \sa IDriver + * \sa IDriver::loop + */ +class IDriverCallback +{ +public: + + /** + * \brief Gives new sample buffer + * \param samples [in] : a buffer containing all the samples + * + * This is used by the acquisition server to be notified when the + * driver has finished to build the whole buffer of data to send. + * This function is called by the driver during the \e IDriver::loop + * and should give an array of \c nSamplesPerChannel x \c nChannel + * organised by channel first. + * + * The caller retains the ownership of the samples pointer. + * + * \code + * samples[0] is channel 0 sample 0 + * samples[1] is channel 0 sample 1 + * ... + * samples[nSamplesPerChannel-1] is channel 0 sample nSamplesPerChannel-1 + * samples[nSamplesPerChannel ] is channel 1 sample 0 + * samples[nSamplesPerChannel+1] is channel 1 sample 1 + * ... + * samples[i*nSamplesPerChannel+j] is channel i sample j + * \endcode + * + * \sa IDriver::loop + */ + virtual void setSamples(const float* samples) = 0; + + /** + * \brief Gives new sample buffer + * \param samples [in] : a buffer containing all the samples + * \param size : size of buffer + * + * This is used by the acquisition server to be notified when the + * driver has finished to build the whole buffer of data to send. + * This function is called by the driver during the \e IDriver::loop + * and should give an array of \c nSamplesPerChannel x \c nChannel + * organised by channel first. + * + * The caller retains the ownership of the samples pointer. + * + * \code + * samples[0] is channel 0 sample 0 + * samples[1] is channel 0 sample 1 + * ... + * samples[nSamplesPerChannel-1] is channel 0 sample nSamplesPerChannel-1 + * samples[nSamplesPerChannel ] is channel 1 sample 0 + * samples[nSamplesPerChannel+1] is channel 1 sample 1 + * ... + * samples[i*nSamplesPerChannel+j] is channel i sample j + * \endcode + * + * \sa IDriver::loop + */ + virtual void setSamples(const float* samples, const size_t size) = 0; + + /** + * \brief Gives a new stimulation set corresponding to the last sample buffer + * \param stimSet [in] : the stimulation set associated with the last sample buffer + * + * This is used by the acquisition server to be notified when the + * driver has finished to build the whole buffer of data to send. + * This function is called by the driver during the \e IDriver::loop + * and immediatly after the IDriverCallback::setSamples function, even + * if the stimulation set is empty. + * + * \warning The stimulation dates are relative to the + * last buffer start time. + * + * \sa IDriver::loop + */ + virtual void setStimulationSet(const IStimulationSet& stimSet) = 0; + + /** + * \brief Destructor + */ + virtual ~IDriverCallback() { } +}; + +/** + * \class IDriver + * \author Yann Renard (INRIA/IRISA) + * \date 2007-04-01 + * \brief Base class for all the OpenViBE acquisition server drivers + * + * This class should be used by hardware driver developers in order + * to add new peripherals to the OpenViBE acquisition server. This driver + * is then used by the server to get cerebral activity measurments and to + * send this measured activity to the platform so it can be processed. + * + * The behavior of the driver is splitted into 3 phases : + * - configuration + * - initialization / uninitialization + * - acquisition start / stop + * + * The implemented driver could either have direct access to the hardware + * or read the measurements from a proprietarry server, depending on the + * hardware manufacturer choice. Thus, the configuration phase of this driver + * should be able to provide the information OpenViBE needs that are + * not present from the hardware manufacturer'. + * + * Important job for the driver is to give the acquisition server fixed + * size measured buffers... This implies that if the hardware sends random + * size buffers, sample per sample buffers, fixed length buffer but not the + * size the acquisition server requested, it would be the driver's job to + * rebuild correct buffers. + * + * \sa CAcquisitionServer + */ +class IDriver +{ +public: + + /** + * \brief Constructor + * \param ctx [in] : the driver context + */ + explicit IDriver(IDriverContext& ctx) : m_driverCtx(ctx) { } + + /** + * \brief Destructor + */ + virtual ~IDriver() { } + + /** \name General purpose functions */ + //@{ + + /** + * \brief Gets the driver name (usually the hardware name) + * \return the driver name. + */ + virtual const char* getName() = 0; + /** + * \brief Tests if a flag is set for this driver + * \param flag [in] : the flag to test + * \return \e true if the tested flag is set + * \return \e false if the tested flag is not set + * \note Default implementation always returns false, meaning that no flag is set + */ + virtual bool isFlagSet(const EDriverFlag flag) const { return false; } + + //@} + /** \name Driver configuration */ + //@{ + + /** + * \brief This function should tell whether the dirver is configurable or not + * \return \e true if this driver is configurable. + * \return \e false if this driver is not configurable. + * \sa configure + */ + virtual bool isConfigurable() = 0; + /** + * \brief Requests the driver to configure itself + * \return \e true if the configuration ended successfully + * \return \e false if the configuration ended with an error + * + * This function requests the driver to configure itself. The acquisition + * server never calls this function if \c isConfigurable returned \e false. + * However, calling this reflects a lack of information from the + * hardware itself or from the server that is provided by the hardware + * manufacturer. The configure function should then ask the user + * for missing information to be filled. + * + * Filling these information can be done any way you want... But + * if the driver developer wants to use a GUI for this, it is + * recommended to use Glade/GTK since the acquisition server + * already uses this API. If you use Glade/GTK, you won't have to + * perform API initialization ; this is done by the acquisition server + * already. It is the responsability of the driver developer to + * release any allocated GUI object after the configuration is done. + * + * \sa isConfigurable + */ + virtual bool configure() = 0; + + //@} + /** \name Initialization / uninitialization */ + //@{ + + /** + * \brief Initializes the driver + * \param nSamplePerSentBlock [in] : the number of samples to + * send per channel per driver send operation. + * \param callback [in] : the callback object to call when the buffer + * are filled correctly. + * \return \e true in case of success. + * \return \e false in case of error. + * + * When called, this function should prepare the driver to receive + * data from the hardware. This means doing everything from checking + * the hardware is present, checking its configuration, getting header + * information from it and so on. This function should return only when + * it has a valid header to return to the acquisition server... For + * some hardware, this could nead data sending request (so it gets basic + * information), and then request data sending to stop... + * + * \sa uninitialize + * \sa getHeader + * \sa IHeader + */ + virtual bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) = 0; + /** + * \brief Uninitializes the driver + * \return \e true in case of success. + * \return \e false in case of error. + * + * This function disconnects any link to the hardware and frees any + * allocated structures/objects related to the hardware. When this + * is called, the driver may be re-configured and re-initialized + * to start a new acquisition session. + */ + virtual bool uninitialize() = 0; + /** + * \brief Gets the header information for the session + * \return the header information for the session + * + * The returned header is used by the acquisition server to send + * encapsulated data to the platform at the beginning of the sending + * process. This header should be filled by the information collected + * from the hardware or the driver itself when configure is called. + * + * \sa IHeader + */ + virtual const IHeader* getHeader() = 0; + + //@} + /** \name Starting / Stopping acquisition */ + //@{ + + /** + * \brief Starts acquisition for this driver + * \return \e true in case of success. + * \return \e false in case of error. + * + * This function is called by the acquistion server to notify the driver + * that signal acquisiton should start... The driver should forward this + * instruction to the hardware... The loop function is then called + * repeatedly to receive data from the hardware and send it back to the + * server. + * + * \sa loop + * \sa stop + */ + virtual bool start() = 0; + /** + * \brief Stops acquisition for this driver + * \return \e true in case of success. + * \return \e false in case of error. + * + * This function is called by the acquistion server to notify the driver + * that signal acquisiton should stop... The driver should forward this + * instruction to the hardware... The loop function is then no more called + * and the driver may be uninitialized to be re-configured. + * + * \sa start + * \sa loop + */ + virtual bool stop() = 0; + /** + * \brief Requests data acquisition to be done + * \return \e true in case of success. + * \return \e false in case of error. + * + * This function is called repeatedly by the acquisition server when + * the driver is correctly initialized and started. The driver's job + * here is to receive measures from the hardware, build the buffers + * according to the requested sampling count per channel (see \c initialize) + * and send this built buffer to the provided callback object. The + * server will then send these informations to the platform. + * + * During this loop function, the object passed as IDriverCallback at + * the initialize phase should be ready to be notified of samples or + * stimulations. + * + * \warning When implementing the driver, one should take care + * of configuring stimulation dates so that they are relative + * to the last buffer start time. + * + * \sa IDriverCallback::setSamples + * \sa IDriverCallback::setStimulationSet + */ + virtual bool loop() = 0; + + //@} + +protected: + + IDriverContext& m_driverCtx; ///< The driver context + +private: + + /** + * \brief Default constructor can not be used because a context is needed + */ + IDriver(); +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/include/ovasIHeader.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/include/ovasIHeader.h new file mode 100644 index 0000000..2002033 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/include/ovasIHeader.h @@ -0,0 +1,325 @@ +#pragma once + +#include "ovas_base.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class IHeader + * \author Yann Renard (INRIA/IRISA) + * \date 2007-04-01 + * \brief Base class for an OpenViBE header container + * + * IHeader objects are used by IDriver objects to give all the header + * information to the acquisition server. The IDriver developer may + * implement his own IHeader derived class or use the one provided + * with the acquisition server. To get a standard header, refer to + * the \c CHeader class. + * + * The IHeader objects mainly consist in get/set/isSet functions + * that allow user code to modify, read back and check state of some + * single header information. + * + * \sa IDriver + * \sa IDriver::getHeader + * \sa CHeader + */ +class IHeader +{ +public: + + /** \name General purpose functions */ + //@{ + + /** + * \brief Resets this header + * + * When called, this function resets all the header content to its + * default values. Most of the is*Set will return \e false after + * this call. + */ + virtual void reset() = 0; + + //@} + /** \name Experiment information */ + //@{ + + /** + * \brief Sets the experiment identifier + * \param experimentID [in] : the experiment identifier to send to + * the OpenViBE platform. + * \return \e true in case of success. + * \return \e false in case of error. + * + * The experiment identifier may be used by the platform + * to get details from a database, for example a description + * of the experiment, what is done, where etc... + */ + virtual bool setExperimentID(const size_t experimentID) = 0; + /** + * \brief Sets the subject age + * \param subjectAge [in] : the subject age in years + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setSubjectAge(const size_t subjectAge) = 0; + /** + * \brief Sets the subject gender + * \param subjectGender [in] : the subject gender + * \return \e true in case of success. + * \return \e false in case of error. + * + * The subject gender is given as an integer and should + * be ISO 5218 conformant... Allowed values are : + * - 0 : unknown + * - 1 : male + * - 2 : female + * - 3 : not specified + * + * \note This values are defined in the OpenViBE toolkit. + */ + virtual bool setSubjectGender(const size_t subjectGender) = 0; + /** + * \brief Gets the experiment identifier + * \return the experiement identifier. + * \sa setExperimentID + */ + virtual size_t getExperimentID() const = 0; + /** + * \brief Gets the subject age + * \return the subject age. + * \sa setSubjectAge + */ + virtual size_t getSubjectAge() const = 0; + /** + * \brief Gets the subject gender + * \return the subject gender. + * \sa setSubjectGender + */ + virtual size_t getSubjectGender() const = 0; + /** + * \brief Tests if experiment identifier has been set + * \return \e true if experiment identifier has been set since last \c reset. + * \return \e false if experiment identifier has not been set. + * \sa setExperimentID + */ + virtual bool isExperimentIDSet() const = 0; + /** + * \brief Tests if subject age has been set + * \return \e true if the subject age has been set since last \c reset. + * \return \e false if the subject age has not been set. + * \sa setSubjectAge + */ + virtual bool isSubjectAgeSet() const = 0; + /** + * \brief Tests if subject gender has been set + * \return \e true if the subject gender has been set since last \c reset. + * \return \e false if the subject gender has not been set. + * \sa setSubjectGender + */ + virtual bool isSubjectGenderSet() const = 0; + + virtual void setImpedanceCheckRequested(const bool active) = 0; + + virtual bool isImpedanceCheckRequested() const = 0; + + /** + * \brief Get impedance limit + * \return \e the chosen impedance limit (ohms) + */ + virtual size_t getImpedanceLimit() const = 0; + /** + * \brief Set impedance limit + * \param limit [in] : the new value for impedance limit (ohms) + */ + virtual void setImpedanceLimit(const size_t limit) = 0; + + //@} + /** \name Chanel information */ + //@{ + + /** + * \brief Sets channel count for the recorded signal + * \param nChannel [in] : the number of the channel for the recorder signal + * \return \e true in case of success. + * \return \e false in case of error. + * + * The number of channels will be used by the IDriver and the acquisition server + * to calculate the sample buffer size (that is \c nSamplesPerChannel x \c nChannel). + */ + virtual bool setChannelCount(const size_t nChannel) = 0; + /** + * \brief Sets a channel' name + * \param index [in] : the index of the channel which name should be set + * \param name [in] : the new name for this channel + * \return \e true in case of success. + * \return \e false in case of error. + * \note As soon as a channel name is set, all the yet-unset channel names are + * considered to be set to empty string. + */ + virtual bool setChannelName(const size_t index, const char* name) = 0; + /** + * \brief Sets a channel' gain + * \param index [in] : the index of the channel which gain should be set + * \param gain [in] : the gain value for this channel + * \return \e true in case of success. + * \return \e false in case of error. + * \note As soon as a channel gain is set, all the yet-unset channel gains are + * considered to be set to 1. + * + * Gains are multiplicator coefficients that are used by the OpenViBE platform to + * to transform measured values into physical dimension. + */ + virtual bool setChannelGain(const size_t index, const float gain) = 0; + /** + * \brief Sets a channel' measurement unit and its scaling factor + * \param index [in] : the index of the channel which gain should be set + * \param unit [in] : the unit + * \param factor [in] : the scaling factor + * \return \e true in case of success. + * \return \e false in case of error. + * + * Measurement units (e.g. Volts, Litres, ...) are specified by size_t enums defined in the openvibe toolkit. + * Scaling factors (megas, millis, ...) are specified similarly. To specify that the channel is in millivolts, + * you set unit to volts and factor to millis. You get the list of supported enums from toolkit/ovtk_defines.h. + * + * Default unit is 'Unspecified' and default factor is code translating 1e00. + */ + virtual bool setChannelUnits(const size_t index, const size_t unit, const size_t factor) = 0; + + /// \todo setChannelLocation + // virtual bool setChannelLocation(const size_t index, const float channelLocationX, const float channelLocationY, const float channelLocationZ)=0; + + /** + * \brief Gets the number of channels for this header + * \return the number of channels. + * \sa setChannelCount + */ + virtual size_t getChannelCount() const = 0; + /** + * \brief Gets the name of a channel + * \param index [in] : the index of the channel which name is wanted + * \return the name of the \c index th channel if in the correct range + * and name has been specified. + * \return an empty string if in the correct range but name has not been specified. + * \return an empty string when \c index is out of range. + * \sa setChannelName + */ + virtual const char* getChannelName(const size_t index) const = 0; + /** + * \brief Gets the gain of a channel + * \param index [in] : the index of the channel which gain is wanted + * \return the gain of the \c index th channel if in the correct range + * and gain has been specified. + * \return 1 if in the correct range but gain has not been specified. + * \return 0 when \c index is out of range. + * \sa setChannelGain + */ + virtual float getChannelGain(const size_t index) const = 0; + /** + * \brief Gets a channel' measurement unit and its scaling factor + * \param index [in] : the index of the channel which gain should be set + * \param channelUnit [in] : the unit + * \param channelFactor [in] : the scaling factor + * \return \e true in case of success. + * \return \e false in case of error. On false, the outputs will be set to default values. + * + * See setChannelUnits(). + */ + virtual bool getChannelUnits(const size_t index, size_t& channelUnit, size_t& channelFactor) const = 0; + /// \todo getChannelLocation + // virtual getChannelLocation(const size_t index) const=0; + /** + * \brief Tests if channel count has been set + * \return \e true if channel count has been set since last \c reset. + * \return \e false if channel count has not been set. + * \sa setChannelCount + */ + virtual bool isChannelCountSet() const = 0; + /** + * \brief Tests if channel name has been set at least once + * \return \e true if channel name has been set at least once since last \c reset. + * \return \e false if channel name has not been set. + * \sa setChannelName + */ + virtual bool isChannelNameSet() const = 0; + /** + * \brief Tests if channel gain has been set at least once + * \return \e true if channel gain has been set at least once since last \c reset. + * \return \e false if channel gain has not been set. + * \sa setChannelGain + */ + virtual bool isChannelGainSet() const = 0; + /// \todo isChannelLocationSet + // virtual bool isChannelLocationSet() const=0; + /** + * \brief Tests if channel unit has been set at least once + * \return \e true if channel unit has been set at least once since last \c reset. + * \return \e false if channel unit has not been set. + * \sa setChannelGain + */ + virtual bool isChannelUnitSet() const = 0; + + //@} + /** \name Samples information */ + //@{ + + /** + * \brief Sets measured signal sampling rate + * \param sampling [in] : the sampling rate for the measured signal + * \return \e true in case of success. + * \return \e false in case of error. + * \note the sampling rate is a global value. It can not be specified per channel. + */ + virtual bool setSamplingFrequency(const size_t sampling) = 0; + /** + * \brief Gets the sampling rate of the measured signal + * \return the sampling rate of the measured signal + * \sa setSamplingFrequency + */ + virtual size_t getSamplingFrequency() const = 0; + /** + * \brief Tests if sampling frequency has been set + * \return \e true if sampling frequency has been set since last \c reset. + * \return \e false if sampling frequency has not been set. + * \sa setSamplingFrequency + */ + virtual bool isSamplingFrequencySet() const = 0; + + //@} + + /** + * \brief Destructor + */ + virtual ~IHeader() { } + + static void copy(IHeader& dst, const IHeader& src) + { + // Make sure that nothing lingers, this is mainly for channel units: we have no way to restore dst to an 'unset' state unless we reset + dst.reset(); + + const size_t nChannel = src.getChannelCount(); + dst.setExperimentID(src.getExperimentID()); + dst.setSubjectAge(src.getSubjectAge()); + dst.setSubjectGender(src.getSubjectGender()); + dst.setChannelCount(src.getChannelCount()); + dst.setSamplingFrequency(src.getSamplingFrequency()); + dst.setChannelCount(src.getChannelCount()); + for (size_t i = 0; i < nChannel; ++i) + { + dst.setChannelName(i, src.getChannelName(i)); + dst.setChannelGain(i, src.getChannelGain(i)); + } + if (src.isChannelUnitSet()) + { + for (size_t i = 0; i < nChannel; ++i) + { + size_t unit = 0, factor = 0; + src.getChannelUnits(i, unit, factor); // No need to test for error, will set defaults on fail + dst.setChannelUnits(i, unit, factor); + } + } + } +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/include/ovas_base.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/include/ovas_base.h new file mode 100644 index 0000000..8982162 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/include/ovas_base.h @@ -0,0 +1,6 @@ +#pragma once + +#include "ovas_defines.h" + +#include +#include diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/include/ovas_defines.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/include/ovas_defines.h new file mode 100644 index 0000000..29b98c9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/include/ovas_defines.h @@ -0,0 +1,16 @@ +#pragma once + + +#define OVAS_Impedance_NotAvailable -2 +#define OVAS_Impedance_Unknown -1 +#define OVAS_Impedance_Zero 0 + +//___________________________________________________________________// +// // +// Global defines // +//___________________________________________________________________// +// // + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/acquisition-server-defaults.conf b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/acquisition-server-defaults.conf new file mode 100644 index 0000000..bc476a8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/acquisition-server-defaults.conf @@ -0,0 +1,40 @@ + +##################################################################################### +# OpenViBE application acquisition server configuration +##################################################################################### +AcquisitionServer_PluginsPatternLinux = ${Path_Lib}/libopenvibe-plugins-*-stream-codecs*.so +AcquisitionServer_PluginsPatternWindows = ${Path_Bin}/openvibe-plugins-*-stream-codecs*.dll +AcquisitionServer_Plugins = ${AcquisitionServer_PluginsPattern${OperatingSystem}} + +AcquisitionServer_ShowUnstable = true +AcquisitionServer_HostName = localhost + +AcquisitionServer_DefaultDriver = ${AcquisitionServer_LastDriver} +AcquisitionServer_DefaultSampleCountPerBuffer = ${AcquisitionServer_LastSampleCountPerBuffer} +AcquisitionServer_DefaultConnectionPort = ${AcquisitionServer_LastConnectionPort} + +AcquisitionServer_LastDriver = Generic oscillator +AcquisitionServer_LastSampleCountPerBuffer = 32 +AcquisitionServer_LastConnectionPort = 1024 + +AcquisitionServer_DriftCorrectionPolicy = Disabled +AcquisitionServer_JitterEstimationCountForDrift = 16 +AcquisitionServer_DriftToleranceDuration = 2 +AcquisitionServer_DriftInitialSkipPeriodMs = 0 +AcquisitionServer_OverSamplingFactor = 1 +AcquisitionServer_StartedDriverSleepDuration = 0 +AcquisitionServer_StoppedDriverSleepDuration = 100 +AcquisitionServer_DriverTimeoutDuration = 5000 + +AcquisitionServer_NaNReplacementPolicy = LastCorrectValue + +AcquisitionServer_CheckImpedance = false +AcquisitionServer_CheckImpedance_ColumnCount = 8 +AcquisitionServer_DefaultImpedanceLimit = 5000 + +AcquisitionServer_Plugin_ExternalStimulations_EnableExternalStimulations = 0 +AcquisitionServer_Plugin_ExternalStimulations_ExternalStimulationQueueName = openvibeExternalStimulations + +AcquisitionServer_Plugin_LabStreamingLayerOutput_LSL_EnableLSLOutput = 0 +AcquisitionServer_Plugin_LabStreamingLayerOutput_LSL_MarkerStreamName = openvibeMarkers +AcquisitionServer_Plugin_LabStreamingLayerOutput_LSL_SignalStreamName = openvibeSignal diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/capset-brainproducts-acticap32.txt b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/capset-brainproducts-acticap32.txt new file mode 100644 index 0000000..387c297 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/capset-brainproducts-acticap32.txt @@ -0,0 +1,32 @@ +Fp1 +Fp2 +F7 +F3 +Fz +F4 +F8 +FC5 +FC1 +FC2 +FC6 +T7 +C3 +Cz +C4 +T8 +TP9 +CP5 +CP1 +CP2 +CP6 +TP10 +P7 +P3 +Pz +P4 +P8 +PO9 +O1 +Oz +O2 +PO10 diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/easycap-64ch-electrode-names-10-20.txt b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/easycap-64ch-electrode-names-10-20.txt new file mode 100644 index 0000000..ad98328 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/easycap-64ch-electrode-names-10-20.txt @@ -0,0 +1,64 @@ +Fp1 +Fz +F3 +F7 +FT9 +FC5 +FC1 +C3 +T7 +TP9 +CP5 +CP1 +Pz +P3 +P7 +O1 +Oz +O2 +P4 +P8 +TP10 +CP6 +CP2 +Cz +C4 +T8 +FT10 +FC6 +FC2 +F4 +F8 +Fp2 +AF7 +AF3 +AFz +F1 +F5 +FT7 +FC3 +FCz +C1 +C5 +TP7 +CP3 +P1 +P5 +PO7 +PO3 +POz +PO4 +PO8 +P6 +P2 +CPz +CP4 +TP8 +C6 +C2 +FC4 +FT8 +F6 +F2 +AF4 +AF8 diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/electrode-names.txt b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/electrode-names.txt new file mode 100644 index 0000000..ae03cc9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/electrode-names.txt @@ -0,0 +1,112 @@ +Nz + +FP1 +FPz +FP2 + +AF7 +AF3 +AFz +AF4 +AF8 + +F9 +F7 +F5 +F3 +F1 +Fz +F2 +F4 +F6 +F8 +F10 + +FT9 +FT7 +FC5 +FC3 +FC1 +FCz +FC2 +FC4 +FC6 +FT8 +FT10 + +A1 +T9 +T7 +C5 +C3 +C1 +Cz +C2 +C4 +C6 +T8 +T10 +A2 + +TP9 +TP7 +CP5 +CP3 +CP1 +CPz +CP2 +CP4 +CP6 +TP8 +TP10 + +P9 +P7 +P5 +P3 +P1 +Pz +P2 +P4 +P6 +P8 +P10 + +PO7 +PO3 +POz +PO4 +PO8 + +O1 +Oz +O2 + +Iz + +T3 +T5 +T4 +T6 + +EOG1 +EOG2 +EOG3 +EOG4 + +EMG1 +EMG2 +EMG3 +EMG4 + +ECG1 +ECG2 +ECG3 +ECG4 + +Aux1 +Aux2 +Aux3 +Aux4 + +Reference diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_1024.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_1024.bin new file mode 100644 index 0000000..ea8e325 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_1024.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_128.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_128.bin new file mode 100644 index 0000000..f743943 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_128.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_2048.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_2048.bin new file mode 100644 index 0000000..016dbfd Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_2048.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_256.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_256.bin new file mode 100644 index 0000000..08170f8 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_256.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_4096.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_4096.bin new file mode 100644 index 0000000..dc55f62 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_4096.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_512.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_512.bin new file mode 100644 index 0000000..993a2a9 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_100k_512.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_1024.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_1024.bin new file mode 100644 index 0000000..f9a33d2 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_1024.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_128.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_128.bin new file mode 100644 index 0000000..ed2c5bd Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_128.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_2048.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_2048.bin new file mode 100644 index 0000000..913aaf7 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_2048.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_256.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_256.bin new file mode 100644 index 0000000..64cf1c6 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_256.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_4096.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_4096.bin new file mode 100644 index 0000000..263fe8e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_4096.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_512.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_512.bin new file mode 100644 index 0000000..7a9276e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_10k_512.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_1024.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_1024.bin new file mode 100644 index 0000000..6a707ab Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_1024.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_128.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_128.bin new file mode 100644 index 0000000..af72a2e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_128.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_2048.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_2048.bin new file mode 100644 index 0000000..257665d Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_2048.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_256.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_256.bin new file mode 100644 index 0000000..ec4b81c Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_256.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_4096.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_4096.bin new file mode 100644 index 0000000..3dee775 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_4096.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_512.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_512.bin new file mode 100644 index 0000000..4762327 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_20k_512.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_1024.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_1024.bin new file mode 100644 index 0000000..f068dda Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_1024.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_128.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_128.bin new file mode 100644 index 0000000..8d9e396 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_128.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_2048.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_2048.bin new file mode 100644 index 0000000..e09ebf5 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_2048.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_256.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_256.bin new file mode 100644 index 0000000..95b35af Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_256.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_4096.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_4096.bin new file mode 100644 index 0000000..5d27ee9 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_4096.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_512.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_512.bin new file mode 100644 index 0000000..bb6d53c Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_25k_512.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_2k_128.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_2k_128.bin new file mode 100644 index 0000000..709cae1 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_2k_128.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_2k_256.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_2k_256.bin new file mode 100644 index 0000000..3d5410d Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_2k_256.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_2k_512.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_2k_512.bin new file mode 100644 index 0000000..87f5284 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_2k_512.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_1024.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_1024.bin new file mode 100644 index 0000000..baf1be9 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_1024.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_128.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_128.bin new file mode 100644 index 0000000..a8700db Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_128.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_2048.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_2048.bin new file mode 100644 index 0000000..552e326 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_2048.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_256.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_256.bin new file mode 100644 index 0000000..f5d0738 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_256.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_4096.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_4096.bin new file mode 100644 index 0000000..0bbc656 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_4096.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_512.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_512.bin new file mode 100644 index 0000000..86ab9db Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_50k_512.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_1024.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_1024.bin new file mode 100644 index 0000000..443b753 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_1024.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_128.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_128.bin new file mode 100644 index 0000000..1afe689 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_128.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_2048.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_2048.bin new file mode 100644 index 0000000..df8fca2 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_2048.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_256.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_256.bin new file mode 100644 index 0000000..e2cb574 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_256.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_4096.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_4096.bin new file mode 100644 index 0000000..53482ee Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_4096.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_512.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_512.bin new file mode 100644 index 0000000..9b6a08e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/filters/f64_5k_512.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-BioSemi-ActiveTwo.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-BioSemi-ActiveTwo.ui new file mode 100644 index 0000000..148e45e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-BioSemi-ActiveTwo.ui @@ -0,0 +1,736 @@ + + + + + + 18 + 100 + 1 + 10 + + + 8 + 1 + 271 + 1 + 10 + + + 100 + 1 + 10 + + + + + True + 2 + + + + + + + + + + + + + + + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 2048 + + + 4096 + + + 8192 + + + 16384 + + + + + + + + + + + 1 + + + 2 + + + 3 + + + 4 + + + 5 + + + 6 + + + 7 + + + 8 + + + 9 + + + + + 5 + Device configuration + center + dialog + center + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + BioSemi ActiveTwo Mk I and II + +Please refer to the device manual for correspondance +(Speed Mode ~ Sampling frequency / max available channels) +<span color="darkred"> +Device must be connected to get current setup +and apply configuration. + +Speed modes 0 to 3 are reserved for daisy chain modes, +you should not use these for acquisition. +</span> + True + center + + + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 13 + 2 + 5 + + + True + model_gender + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + True + True + adjustment_age + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + True + True + adjustment_identifier + True + True + + + 1 + 2 + + + + + True + + + 2 + 3 + 4 + 3 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Identifier : + right + True + + + + + True + Device connection status: + right + True + + + 4 + 5 + + + + + True + gtk-no + + + 1 + 2 + 4 + 5 + + + + + True + False + model_sampling_frequency + + + + 0 + + + + + 1 + 2 + 9 + 10 + + + + + True + Device type: + + + 5 + 6 + + + + + True + - <i>unknown</i> - + True + + + 1 + 2 + 5 + 6 + + + + + True + + + 2 + 7 + 8 + + + + + True + Battery level: + + + 6 + 7 + + + + + True + - <i>unknown</i> - + True + + + 1 + 2 + 6 + 7 + + + + + True + 0.51999998092651367 + 5 + Add 8 EX channels: + + + 12 + 13 + + + + + True + True + False + 0.52999997138977051 + 0.51999998092651367 + top + True + + + 1 + 2 + 12 + 13 + + + + + True + False + Sampling frequency: + + + 9 + 10 + + + + + True + Number of channels: + right + True + + + 11 + 12 + + + + + True + False + True + + True + True + adjustment_channel_count + True + True + + + 1 + 2 + 11 + 12 + + + + + True + False + Speed mode: + + + 8 + 9 + + + + + True + False + model_speed_mode + + + + 0 + + + + + 1 + 2 + 8 + 9 + + + + + True + + + 2 + 10 + 11 + + + + + 0 + + + + + 0 + + + + + Change channel names + True + True + True + + + 1 + + + + + 3 + + + + + True + + + False + 4 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + + BioSemi device information + center-on-parent + 300 + 200 + + + True + 7 + 2 + + + True + <b>BioSemi device information </b> +Please make sure CMS/DRL stays in range during acquisition. If CMS is not in range, for safety +purpose, any active electrode connected will be shut down and signals should not be +used. +The corresponding sample range will be tagged with OVTK_StimulationId_SegmentStart +and OVTK_StimulationId_SegmentStop. +Possible causes include broken wires, damaged cable isolation, bad connector contacts, +defect IC inside the electrode. + True + + + 2 + 2 + 2 + + + + + True + + + 2 + 5 + 6 + + + + + True + 1 + 1 + Battery level: + + + 4 + 5 + + + + + True + vertical + + + True + gtk-no + 4 + + + 0 + + + + + True + - <i>Device battery is low! </i> - + True + + + 1 + + + + + 1 + 2 + 4 + 5 + + + + + True + vertical + + + True + gtk-no + 4 + + + 0 + + + + + True + - <i>unknown</i> - + True + + + 1 + + + + + 1 + 2 + 3 + 4 + + + + + True + 1 + 1 + CMS/DRL status: + + + 3 + 4 + + + + + True + 1 + 1 + Device type: + + + 1 + 2 + + + + + True + 1 + 1 + - <i>unknown</i> - + True + + + 1 + 2 + 1 + 2 + + + + + True + + + 2 + 2 + 3 + + + + + True + + + 2 + 6 + 7 + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-BrainProducts-ActiCHamp.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-BrainProducts-ActiCHamp.ui new file mode 100644 index 0000000..b967eec --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-BrainProducts-ActiCHamp.ui @@ -0,0 +1,966 @@ + + + + + + 100 + 5 + 1 + 10 + + + 100 + 18 + 1 + 10 + + + 100000 + 10000 + 1 + 10 + + + 1 + 1024 + 4 + 1 + 10 + + + 100000 + 5000 + 1 + 10 + + + 100 + 1 + 10 + + + False + + + True + False + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + None + + + Factor 2 + + + + + + + + + + + Native + + + Averaging x2 + + + + + + + + + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + Normal + + + Active Shield + + + Impedance + + + Test + + + + + + + + + + + 10 kHz + + + 50 kHz + + + 100 kHz + + + + + + + + + + + 128 + + + 256 + + + 512 + + + 1024 + + + 2048 + + + 4096 + + + + + False + 5 + Device configuration + center + dialog + center + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + False + Brain Products actiCHamp + +<span color="darkred"> +This driver uses software decimation +to lower the sampling frequency to +the value selected below. +The signal is low-pass filtered with +a FIR filter prior to downsampling. +</span> + True + center + + + True + True + 0 + + + + + False + gtk-dialog-error + + + True + True + 1 + + + + + True + False + <span color="#d07005">The selected ActiCHamp device can not be accessed. +The device is probably used by another program +or has an older version of firmware. + +Try un-plugging and re-plugging the device and if the +problem persists please update the actiCHamp firmware. +All required files and instructions can be downloaded from here:</span> + True + + + True + True + 2 + + + + + Download ActiCHamp firmware from Brain Products + True + True + True + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + True + False + 8 + 8 + + + True + False + 8 + + + True + False + 18 + 2 + + + True + False + model_gender + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + False + False + True + True + adjustment_age + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + False + False + True + True + adjustment_identifier + True + True + + + 1 + 2 + + + + + True + True + + True + False + False + True + True + adjustment_active_shield_gain + True + True + + + 1 + 2 + 11 + 12 + + + + + True + False + model_adc_data_decimation + + + + 0 + + + + + 1 + 2 + 10 + 11 + + + + + True + False + model_adc_data_filter + + + + 0 + + + + + 1 + 2 + 9 + 10 + + + + + True + False + model_mode + 1 + + + + 0 + + + + + 1 + 2 + 8 + 9 + + + + + True + False + model_sampling_frequency + 0 + + + + 0 + + + + + 1 + 2 + 6 + 7 + + + + + True + False + model_device_id + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + False + True + + False + False + True + True + adjustment_channel_count + True + True + + + 1 + 2 + 5 + 6 + + + + + True + False + + + 2 + 3 + 4 + + + + + True + False + + + 2 + 15 + 16 + + + + + True + False + + + 1 (1-32) + True + True + True + + + True + True + 0 + + + + + 2 (33-64) + True + True + True + + + True + True + 1 + + + + + 3 (65-96) + True + True + True + + + True + True + 2 + + + + + 4 (97-128 + True + True + True + + + True + True + 3 + + + + + 5 (129-160) + True + True + True + + + True + True + 4 + + + + + 1 + 2 + 16 + 17 + + + + + Add the 8 auxilliary channels + True + True + False + True + + + 2 + 17 + 18 + + + + + True + False + Gender : + right + True + + + 2 + 3 + + + + + True + False + Age : + right + True + + + 1 + 2 + + + + + True + False + Identifier : + right + True + + + + + True + False + Active Shield Gain : + right + True + + + 11 + 12 + + + + + True + False + ADC Data Decimation : + right + True + + + 10 + 11 + + + + + True + False + ADC Data Filter : + right + True + + + 9 + 10 + + + + + True + False + Mode : + right + True + + + 8 + 9 + + + + + True + False + Sampling frequency : + right + True + + + 6 + 7 + + + + + True + False + Device : + right + True + + + 4 + 5 + + + + + True + False + Number of channels : + right + True + + + 5 + 6 + + + + + True + False + Modules : + right + True + + + 16 + 17 + + + + + True + False + False + model_physical_sampling_rate + + + + 0 + + + + + 1 + 2 + 7 + 8 + + + + + True + False + Physical Sampling Rate : + right + True + + + 7 + 8 + + + + + True + False + Good impedance limit (Ohm) : + + + 13 + 14 + + + + + True + False + Bad impedance limit (Ohm) : + + + 14 + 15 + + + + + True + True + + False + False + True + True + adjustment_good_imp + + + 1 + 2 + 13 + 14 + + + + + True + True + + False + False + True + True + adjustment_bad_imp + + + 1 + 2 + 14 + 15 + + + + + True + False + Enable impedance checking: + + + 12 + 13 + + + + + True + True + False + True + + + 1 + 2 + 12 + 13 + + + + + True + True + 0 + + + + + True + True + 0 + + + + + Change channel names + False + False + False + + + False + True + 1 + + + + + True + True + 5 + + + + + True + False + + + False + True + 6 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + True + end + 6 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-BrainProducts-BrainampSeries.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-BrainProducts-BrainampSeries.ui new file mode 100644 index 0000000..a412d35 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-BrainProducts-BrainampSeries.ui @@ -0,0 +1,1092 @@ + + + + + + 256 + 32 + 1 + 10 + + + 100 + 1 + 10 + + + 100 + 18 + 1 + 10 + + + 300 + False + 5 + Individual channel configuration + center + dialog + + + True + False + 2 + + + True + False + end + + + gtk-apply + True + True + True + True + + + False + False + 0 + + + + + gtk-cancel + True + True + True + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + True + never + automatic + + + True + False + queue + + + True + False + 5 + 2 + 2 + True + + + True + False + Acquire + + + 1 + 2 + + + + + True + False + Low pass filter + + + 2 + 3 + + + + + True + False + Resolution + + + 3 + 4 + + + + + True + False + DC coupling + + + 4 + 5 + + + + + + + + + + + + + + + + + + True + True + 1 + + + + + + button_apply1 + button_cancel1 + + + + + + + + + + 5000 + + + + + False + + + True + False + 3 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + False + Sampling frequency : + right + True + + + 1 + 2 + + + + + True + False + model1 + + + + 0 + + + + + 1 + 2 + 1 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + + + + + + + AC + + + DC + + + + + + + + + + + default + + + AC + + + DC + + + + + + + + + + + None + + + 2 + + + 4 + + + 5 + + + 8 + + + 10 + + + + + + + + + + + High (> 100 MOhm) + + + Low (10 MOhm) + + + + + + + + + + + 1000 Hz + + + 250 Hz + + + + + + + + + + + default + + + 1000 Hz + + + 250 Hz + + + + + + + + + + + 100 nV + + + 500 nV + + + 10 µV + + + 152.6 µV + + + + + False + 5 + Device configuration + center + dialog + center + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + BrainProducts Brainamp Series +<small> +<u>includes :</u> +Brainamp Standard, Brainamp DC, +Brainamp MR, Brainamp MR plus</small> + True + center + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + 8 + 8 + + + True + False + 8 + + + True + False + 15 + 3 + + + + + + + + + + + + + + + + + + + + + True + False + model2 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + False + False + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + True + False + False + True + True + adjustment3 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + False + Identifier : + True + + + + + True + False + Age : + True + + + 1 + 2 + + + + + True + False + Gender : + True + + + 2 + 3 + + + + + True + False + Device : + True + + + 4 + 5 + + + + + True + False + model3 + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + False + + + 3 + 3 + 4 + 8 + + + + + ... + True + True + True + + + 2 + 3 + 12 + 15 + + + + + True + False + Multiamp montage : + right + True + + + 5 + 6 + + + + + True + False + Number of channels : + right + True + + + 6 + 7 + + + + + True + False + False + + + True + False + -- Not found -- + + + True + True + 0 + + + + + True + False + -- Not found -- + + + True + True + 1 + + + + + True + False + -- Not found -- + + + True + True + 2 + + + + + True + False + -- Not found -- + + + True + True + 3 + + + + + 1 + 2 + 5 + 6 + + + + + True + False + True + + False + False + True + True + adjustment1 + True + True + + + 1 + 2 + 6 + 7 + + + + + True + False + DC coupling : + True + + + 14 + 15 + + + + + True + False + Resolution : + True + + + 13 + 14 + + + + + True + False + Low pass filter : + True + + + 12 + 13 + + + + + True + False + + + 3 + 11 + 12 + 8 + + + + + True + False + model_dc_coupling + + + + 0 + + + + + 1 + 2 + 14 + 15 + + + + + True + False + model_resolution + + + + 0 + + + + + 1 + 2 + 13 + 14 + + + + + True + False + model_lowpass_filter + + + + 0 + + + + + 1 + 2 + 12 + 13 + + + + + True + False + Decimation factor : + True + + + 10 + 11 + + + + + True + False + model_decimation_factor + + + + 0 + + + + + 1 + 2 + 10 + 11 + + + + + True + False + Impedance : + True + + + 9 + 10 + + + + + True + False + model_impedance + + + + 0 + + + + + 1 + 2 + 9 + 10 + + + + + True + False + + + 3 + 7 + 8 + 8 + + + + + True + False + the multi amplifier montage is not correct ; <i>slot 1 should not be empty</i> + gtk-no + + + 2 + 3 + 5 + 6 + + + + + True + False + Enable impedance checking: + + + 8 + 9 + + + + + (passive electrodes only) + True + True + False + True + + + 1 + 3 + 8 + 9 + + + + + + + + True + True + 0 + + + + + True + True + 0 + + + + + Change channel names... + False + True + True + + + False + True + 1 + + + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + + button_apply + button_cancel + + + + + + + + + + default + + + 100 nV + + + 500 nV + + + 10 µV + + + 152.6 µV + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-BrainProducts-VAmp.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-BrainProducts-VAmp.ui new file mode 100644 index 0000000..22a8acb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-BrainProducts-VAmp.ui @@ -0,0 +1,1068 @@ + + + + + + 100 + 1 + 10 + + + 100 + 18 + 1 + 10 + + + 1 + 19 + 16 + 1 + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + 5 + Fast Mode Configuration... + center + normal + + + True + False + 2 + + + True + False + end + + + gtk-apply + True + True + True + True + + + False + False + 0 + + + + + gtk-cancel + True + True + True + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + + + True + False + FirstAmp fast mode (20 kHz) +<span foreground="#602020" size="smaller"> +The device can support up to 4 monopolar or differential channel pairs +Please set channel numbers for differential pairs, +Use the pair (channel#, -1) for monopolar acquisition. +</span> +Channels: 7, 8,9 or 10 +<span foreground="#602020" size="smaller">(to minimize the noise due to the device itself)</span> + + True + center + + + True + True + 0 + + + + + True + False + + + False + True + 1 + + + + + True + False + 5 + 3 + + + True + False + Positive Inputs + + + 1 + 2 + + + + + True + False + Negative Inputs + + + 2 + 3 + + + + + True + False + Pair 1 : + + + 1 + 2 + + + + + True + False + Pair 2 : + + + 2 + 3 + + + + + True + False + Pair 3 : + + + 3 + 4 + + + + + True + False + Pair 4 : + + + 4 + 5 + + + + + True + False + + + + + True + False + combobox_pair1_positive_input_model + + + + 0 + + + + + 1 + 2 + 1 + 2 + + + + + True + False + combobox_pair1_negative_input_model + + + + 0 + + + + + 2 + 3 + 1 + 2 + + + + + True + False + combobox_pair2_positive_input_model + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + False + combobox_pair3_positive_input_model + + + + 0 + + + + + 1 + 2 + 3 + 4 + + + + + True + False + combobox_pair3_negative_input_model + + + + 0 + + + + + 2 + 3 + 3 + 4 + + + + + True + False + combobox_pair4_positive_input_model + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + False + combobox_pair4_negative_input_model + + + + 0 + + + + + 2 + 3 + 4 + 5 + + + + + True + False + combobox_pair2_negative_input_model + + + + 0 + + + + + 2 + 3 + 2 + 3 + + + + + True + True + 2 + + + + + True + True + 1 + + + + + + button_apply_settings + button_cancel_settings + + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + VAmp 16 + + + VAmp/FirstAmp 8 + + + VAmp/FirstAmp Fast 4 + + + + + + + + + + + 2000 + + + 20000 + + + + + False + + + True + False + + + True + False + dummy label sampling frequency + + + True + True + 0 + + + + + True + False + model3 + + + + 0 + + + + + True + True + 1 + + + + + True + True + + False + False + True + True + adjustment_number_of_channels + True + True + + + True + True + 2 + + + + + + + + + + + + + + + + + + + 512 + + + + + False + 5 + Device Configuration... + center + normal + + + True + False + 2 + + + True + False + end + + + gtk-apply + True + True + True + True + + + False + False + 0 + + + + + gtk-cancel + True + True + True + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + Brain Products V-Amp + center + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + <span size="smaller" foreground="#602020"> +The device supports 2 modes: +Normal mode: up to 16 channels, 2 kHz sampling frequency. +Fast mode: 4 channels only, 20 kHz sampling frequency. +This driver will decimate the signal to 512 Hz in both cases +(with a low-pass FIR filter before downsampling). +</span> + True + center + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + True + False + 8 + + + True + False + 7 + 3 + + + Fast mode settings + True + True + True + + + 2 + 3 + 6 + 7 + + + + + True + False + model2 + + + + 0 + + + + + 1 + 2 + 6 + 7 + + + + + True + False + Acquisition Mode : + right + True + + + 6 + 7 + + + + + True + False + Identifier : + right + True + + + + + True + True + + False + False + True + True + adjustment1 + True + True + + + 1 + 3 + + + + + True + True + + False + False + True + True + adjustment2 + True + True + + + 1 + 3 + 1 + 2 + + + + + True + False + model1 + + + + 0 + + + + + 1 + 3 + 2 + 3 + + + + + True + False + model4 + + + + 0 + + + + + 1 + 3 + 3 + 4 + + + + + True + False + + + 3 + 5 + 6 + + + + + True + False + Device + + + 3 + 4 + + + + + True + False + Gender : + right + True + + + 2 + 3 + + + + + True + False + Age : + right + True + + + 1 + 2 + + + + + True + False + Sampling Frequency : + + + 4 + 5 + + + + + True + False + False + model5 + 0 + + + + 0 + + + + + 1 + 3 + 4 + 5 + + + + + True + True + 0 + + + + + Enable 2 auxiliary channels + True + True + False + True + + + True + True + 1 + + + + + Enable 1 trigger channel + True + True + False + True + + + True + True + 2 + + + + + True + False + <span size="smaller" foreground="#602020"> +Note: Impedance checking only works with passive electrodes. +The measure will be incorrect if using active electrodes such +as actiCAP Xpress. +</span> + True + center + + + True + True + 3 + + + + + Enable impedance checking + True + True + False + True + + + True + True + 4 + + + + + Change channel names... + True + True + True + + + False + True + 5 + + + + + True + True + 5 + + + + + True + False + + + False + True + 6 + + + + + True + False + 5 + + + True + False + <span size="smaller" foreground="#602020"> +If BrainVision Recorder is installed, a service may be +currently running on your computer in background. +If enabled, this VAmp service may prevent the driver from connecting +to the device. If necessary please stop the service using the button Stop. +You can restart the service afterward by pressing Start. + +<big>You must be Administrator to use this functionnality.</big> +</span> + True + center + + + True + True + 0 + + + + + True + False + VampService is Enabled + + + + True + True + 1 + + + + + True + False + 4 + + + Start + True + True + True + + + True + True + 0 + + + + + True + False + gtk-dialog-warning + + + True + True + 1 + + + + + Stop + True + True + True + + + True + True + 2 + + + + + True + True + 2 + + + + + True + True + 7 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-BrainProductsLiveAmp.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-BrainProductsLiveAmp.ui new file mode 100644 index 0000000..f7a72d5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-BrainProductsLiveAmp.ui @@ -0,0 +1,739 @@ + + + + + + 50 + 100000 + 10000 + 10 + 100 + + + 50 + 10000 + 5000 + 10 + 100 + + + 100 + 18 + 1 + 10 + + + 100 + 1 + 10 + + + 1 + 64 + 64 + 1 + 10 + + + 16 + 1 + 10 + + + 8 + 1 + 2 + + + 1 + 64 + 32 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 250 + + + + + + + + + + + 250 + + + 500 + + + 1000 + + + + + False + 5 + Device configuration + center + dialog + center + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + Brain Products LiveAmp + +This version supports LiveAmp with 8, 16 and 32 channels. + + center + + + + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + 8 + 8 + True + + + True + False + 8 + + + True + False + 3 + 2 + True + + + True + False + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + False + False + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + False + False + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + False + Gender : + right + True + + + 2 + 3 + + + + + True + False + Age : + right + True + + + 1 + 2 + + + + + True + False + Identifier : + right + True + + + + + True + True + 0 + + + + + True + True + 0 + + + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + True + False + + + True + False + + + True + False + 7 + 2 + True + + + True + True + + 054203-0077 + False + False + True + True + + + 1 + 2 + + + + + True + False + Serial Nr. + + + + + True + False + Sampling frequency: + + + 1 + 2 + + + + + True + True + + False + False + True + True + adjustmentEEGch + True + + + 1 + 2 + 2 + 3 + + + + + True + True + + False + False + True + True + adjustmentAUX + True + + + 1 + 2 + 4 + 5 + + + + + True + False + Number of EEG channels: + + + 2 + 3 + + + + + True + False + Number of AUX channels: + + + 4 + 5 + + + + + True + False + model_physical_sampling_rate + 0 + + + + 0 + + + + + 1 + 2 + 1 + 2 + + + + + (include 3 accelerator channels) + True + True + False + True + + + 1 + 2 + 5 + 6 + + + + + True + False + Inlcude ACC channels + + + 5 + 6 + + + + + (always included) + True + False + True + False + True + True + + + 1 + 2 + 6 + 7 + + + + + True + False + Include Triggers + + + 6 + 7 + + + + + True + False + Number of Bipolar channels + + + 3 + 4 + + + + + True + True + + False + False + True + True + adjustmentBipolar + + + 1 + 2 + 3 + 4 + + + + + True + True + 0 + + + + + True + True + 0 + + + + + True + True + 5 + + + + + + + + True + False + + + False + True + 7 + + + + + True + False + + + True + False + + + True + False + True + + + True + False + <span size="larger" foreground="#602020"> +Note: 'Good' and 'Bad' impedance limit is used with active electrodes only. +Impedances above 'Bad impedance limit' will be shown in red. +Impedances below 'Good impedance limit' will be shown in green. +Impedance between 'Good' and 'Bad' limit will be shown in yellow. +</span> + True + center + + + + + True + True + 0 + + + + + True + True + 0 + + + + + True + False + 3 + 2 + True + + + True + False + Enable impedance checking + + + + + True + True + False + True + + + 1 + 2 + + + + + True + False + Good impedance limit (Ohm) + + + 1 + 2 + + + + + True + True + + True + False + False + True + True + adjGoodImpedanceLimit + True + + + 1 + 2 + 1 + 2 + + + + + True + False + Bad Impedance limit (Ohm) + + + 2 + 3 + + + + + True + True + + True + False + False + True + True + adjBadImpedanceLimit + True + + + 1 + 2 + 2 + 3 + + + + + True + True + 1 + + + + + True + True + 8 + + + + + True + False + + + False + True + 9 + + + + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Brainmaster-Discovery.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Brainmaster-Discovery.ui new file mode 100644 index 0000000..501baa7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Brainmaster-Discovery.ui @@ -0,0 +1,768 @@ + + + + + + 100 + 18 + 1 + 10 + + + 100 + 1 + 10 + + + 1 + 1024 + 4 + 1 + 10 + + + False + + + True + False + 8 + 2 + True + + + True + False + Sampling frequency : + right + True + + + 2 + 3 + + + + + True + False + model_sampling_frequency + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + Device type : + right + True + + + + + False + Number of channels : + right + True + + + 1 + 2 + + + + + False + model_type + + + + 0 + + + + + 1 + 2 + + + + + True + + True + False + False + True + True + adjustment3 + True + True + + + 1 + 2 + 1 + 2 + + + + + + + + + + + + + default + + + 9 600 + + + 115 200 + + + 460 800 + + + + + + + + + + + default + + + 8 bits + + + 16 bits + + + 24 bits + + + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + default + + + none + + + 50Hz + + + 60Hz + + + + + + + + + + + Custom + + + Discovery 24 + + + Atlantis 4x4 + + + Atlantis 2x2 + + + + + + + + + + + 256 + + + 512 + + + 1024 + + + 2048 + + + + + + + + + + + Discovery + + + Atlantis + + + + + False + 5 + Device configuration + center + dialog + center + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + Brainmaster Discovery / Atlantis + +<small><span color="darkred">Attention : You should obtain a device passkey from Brainmaster +in order to operate your device with OpenViBE</span></small> + True + center + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + 8 + 8 + + + True + False + 12 + 2 + True + + + True + False + Gender : + right + True + + + 4 + 5 + + + + + True + False + Age : + right + True + + + 3 + 4 + + + + + True + False + Identifier : + right + True + + + 2 + 3 + + + + + True + False + model_gender + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + True + + True + False + False + True + True + adjustment1 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + True + + True + False + False + True + True + adjustment2 + True + True + + + 1 + 2 + 2 + 3 + + + + + True + False + + + 2 + 1 + 2 + + + + + True + False + Configuration preset : + right + True + + + + + True + False + model_preset + + + + 0 + + + + + 1 + 2 + + + + + True + False + Device port : + right + True + + + 5 + 6 + + + + + True + False + + + + 0 + + + + + 1 + 2 + 5 + 6 + + + + + True + False + Baud rate : + right + True + + + 6 + 7 + + + + + True + False + Bit depth : + right + True + + + 7 + 8 + + + + + True + False + Notch filter : + right + True + + + 8 + 9 + + + + + True + False + model_baud_rate + + + + 0 + + + + + 1 + 2 + 6 + 7 + + + + + True + False + model_bit_depth + + + + 0 + + + + + 1 + 2 + 7 + 8 + + + + + True + False + model_notch_filters + + + + 0 + + + + + 1 + 2 + 8 + 9 + + + + + True + False + + + 2 + 9 + 10 + + + + + True + False + Device Serial Nr : + right + True + + + 10 + 11 + + + + + True + False + Device Passkey : + right + True + + + 11 + 12 + + + + + True + True + + True + False + False + True + True + + + 1 + 2 + 10 + 11 + + + + + True + True + + True + False + False + True + True + + + 1 + 2 + 11 + 12 + + + + + True + True + 0 + + + + + Change channel names + True + True + True + False + + + False + True + 1 + + + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Emotiv-EPOC.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Emotiv-EPOC.ui new file mode 100644 index 0000000..5830cf4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Emotiv-EPOC.ui @@ -0,0 +1,401 @@ + + + + + + 18 + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 14 + 14 + 14 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 128 + + + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + Emotiv EPOC + +<small><span color="darkred">14 EEG channels +128 Hz sampling rate + +User ID is used for acquisition from multiple EPOC +via different Acquisition Servers on the same computer. +ID starts at 0 for the first headset connected +Second headset has ID 1, etc.</span></small> + True + center + + + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 3 + 2 + True + + + True + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Identifier : + right + True + + + + + 0 + + + + + 0 + + + + + True + + + True + Headset User ID: + + + 0 + + + + + True + True + + adjustment4 + + + 1 + + + + + 1 + + + + + Add 2 more channels for gyroscope + True + True + False + True + + + 2 + + + + + Change channel names + True + False + False + + + False + 3 + + + + + 3 + + + + + True + + + False + 4 + + + + + True + Path to Emotiv Research SDK + + + 5 + + + + + True + select-folder + Path to Emotiv Research Edition SDK + + + 6 + + + + + True + + + False + 7 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + + + + True + 2 + 2 + + + Number of channels : + right + True + + + + + Sampling frequency : + right + True + + + 1 + 2 + + + + + True + False + + adjustment3 + True + True + + + 1 + 2 + + + + + model2 + + + + 0 + + + + + 1 + 2 + 1 + 2 + + + + + + + 32 + 1 + 10 + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Enobio3G.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Enobio3G.ui new file mode 100755 index 0000000..95a8f2c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Enobio3G.ui @@ -0,0 +1,406 @@ + + + + + + 100 + 18 + 1 + 10 + + + 100 + 1 + 10 + + + 1 + 1024 + 4 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 500 + + + + + + False + 5 + Device configuration + center + dialog + center + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + Enobio 3G + center + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + 8 + 8 + + + True + False + 8 + + + True + False + 6 + 2 + True + + + True + False + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + False + False + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + False + False + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + + True + False + Sampling frequency : + right + True + + + 4 + 5 + + + + + + True + False + Number of channels : + right + True + + + 3 + 4 + + + + + True + False + Gender : + right + True + + + 2 + 3 + + + + + True + False + Age : + right + True + + + 1 + 2 + + + + + True + False + Identifier : + right + True + + + + + + True + False + model2 + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + + True + True + False + False + True + True + adjustment3 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + False + Mac address : + + + 5 + 6 + + + + + True + True + + 00:00:00:00:00:00 + + + 1 + 2 + 5 + 6 + + + + + True + True + 0 + + + + + True + True + 0 + + + + + Change channel names + True + False + False + False + + + False + True + 1 + + + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Generic-Oscillator.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Generic-Oscillator.ui new file mode 100644 index 0000000..6d0669d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Generic-Oscillator.ui @@ -0,0 +1,478 @@ + + + + + + 100 + 18 + 1 + 10 + + + 100 + 1 + 10 + + + 1 + 1024 + 4 + 1 + 10 + + + 0 + 86400 + 1 + 0.0001 + 1 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 128 + + + 256 + + + 512 + + + 1000 + + + 1024 + + + 2048 + + + 4096 + + + 9600 + + + 19200 + + + 44100 + + + 48000 + + + + + False + 5 + Device configuration + center + dialog + center + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + Generic Oscillator + center + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + 8 + 8 + + + True + False + 8 + + + True + False + 8 + 2 + True + + + True + False + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + False + False + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + False + False + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + False + Sampling frequency : + right + True + + + 4 + 5 + + + + + True + False + Number of channels : + right + True + + + 3 + 4 + + + + + True + False + Gender : + right + True + + + 2 + 3 + + + + + True + False + Age : + right + True + + + 1 + 2 + + + + + True + False + Identifier : + right + True + + + + + True + False + model2 + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + True + False + False + True + True + adjustment3 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + False + Send periodical stimulations : + + + 5 + 6 + + + + + True + True + False + False + True + + + 1 + 2 + 5 + 6 + + + + + True + False + Stimulation interval (secs) : + + + 6 + 7 + + + + + True + True + False + False + True + True + adjustment4 + False + 4 + + + 1 + 2 + 6 + 7 + + + + + True + False + Check impedance : + + + 7 + 8 + + + + + True + True + False + True + + + 1 + 2 + 7 + 8 + + + + + True + True + 0 + + + + + True + True + 0 + + + + + Change channel names + True + False + False + False + + + False + True + 1 + + + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Generic-RawFileReader.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Generic-RawFileReader.ui new file mode 100644 index 0000000..5cbd512 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Generic-RawFileReader.ui @@ -0,0 +1,643 @@ + + + + + + 18 + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 4 + 1 + 1024 + 1 + 10 + + + 256 + 4 + 4096 + 1 + 10 + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + Generic Raw File Reader + center + + + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 12 + 2 + True + + + True + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + Sampling frequency : + right + True + + + 4 + 5 + + + + + True + Number of channels : + right + True + + + 3 + 4 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Identifier : + right + True + + + + + True + True + adjustment_sampling_frequency + True + True + + + 1 + 2 + 4 + 5 + + + + + True + True + adjustment3 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + + + 2 + 5 + 6 + GTK_FILL + + + + + + True + Skip at start (bytes) : + right + True + + + 10 + 11 + + + + + True + Skip header (bytes) : + right + True + + + 11 + 12 + + + + + True + Skip footer (bytes) : + right + True + + + 12 + 13 + + + + + True + Sample type : + right + True + + + 9 + 10 + + + + + True + Endianness : + right + True + + + 8 + 9 + + + + + True + True + + adjustment_start_size + True + True + + + 1 + 2 + 10 + 11 + + + + + True + True + + adjustment_header_size + True + True + + + 1 + 2 + 11 + 12 + + + + + True + True + + adjustment_footer_size + True + True + + + 1 + 2 + 12 + 13 + + + + + True + model_sample_type + + + + 0 + + + + + 1 + 2 + 9 + 10 + + + + + True + model_endianness + + + + 0 + + + + + 1 + 2 + 8 + 9 + + + + + True + Filename : + right + True + + + 6 + 7 + + + + + True + True + + + + 1 + 2 + 6 + 7 + + + + + True + Limit speed : + right + True + + + 7 + 8 + + + + + True + True + False + True + + + 1 + 2 + 7 + 8 + + + + + 0 + + + + + 0 + + + + + Change channel names + True + False + False + + + False + 1 + + + + + 3 + + + + + True + + + False + 4 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + Little endian + + + Big endian + + + + + + + + + + + 8 bits unsigned integer + + + 16 bits unsigned integer + + + 32 bits unsigned integer + + + 8 bits signed integer + + + 16 bits signed integer + + + 32 bits signed integer + + + 32 bits float + + + 64 bits float + + + + + 1024 + 1 + 10 + + + 1024 + 1 + 10 + + + 1024 + 1 + 10 + + + + + True + 3 + 2 + + + True + True + + localhost + + + 1 + 2 + + + + + True + True + + adjustment4 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + Connection host port + + + 1 + 2 + + + + + True + Connection host name + + + + + + + + + + + + + 1024 + 1 + 10 + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Generic-RawTelnetReader.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Generic-RawTelnetReader.ui new file mode 100644 index 0000000..774644b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Generic-RawTelnetReader.ui @@ -0,0 +1,655 @@ + + + + + + 18 + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 4 + 1 + 1024 + 1 + 10 + + + 256 + 4 + 4096 + 1 + 10 + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + Generic Raw File Reader + center + + + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 13 + 2 + True + + + True + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + Sampling frequency : + right + True + + + 4 + 5 + + + + + True + Number of channels : + right + True + + + 3 + 4 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Identifier : + right + True + + + + + True + True + adjustment_sampling_frequency + True + True + + + 1 + 2 + 4 + 5 + + + + + True + True + adjustment3 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + + + 2 + 5 + 6 + GTK_FILL + + + + + + True + Telnet host name + + + 6 + 7 + + + + + True + Telnet host port + + + 7 + 8 + + + + + True + True + + adjustment4 + True + True + + + 1 + 2 + 7 + 8 + + + + + True + True + + localhost + + + 1 + 2 + 6 + 7 + + + + + True + Endianness : + right + True + + + 9 + 10 + + + + + True + Sample type : + right + True + + + 10 + 11 + + + + + True + Skip at start (bytes) : + right + True + + + 11 + 12 + + + + + True + Skip header (bytes) : + right + True + + + 12 + 13 + + + + + True + Skip footer (bytes) : + right + True + + + 13 + 14 + + + + + True + model_sample_type + + + + 0 + + + + + 1 + 2 + 10 + 11 + + + + + True + True + + adjustment_start_size + True + True + + + 1 + 2 + 11 + 12 + + + + + True + True + + adjustment_header_size + True + True + + + 1 + 2 + 12 + 13 + + + + + True + True + + adjustment_footer_size + True + True + + + 1 + 2 + 13 + 14 + + + + + True + model_endianness + + + + 0 + + + + + 1 + 2 + 9 + 10 + + + + + True + Limit speed : + right + True + + + 8 + 9 + + + + + True + True + False + True + + + 1 + 2 + 8 + 9 + + + + + 0 + + + + + 0 + + + + + Change channel names + True + False + False + + + False + 1 + + + + + 3 + + + + + True + + + False + 4 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + Little endian + + + Big endian + + + + + + + + + + + 8 bits unsigned integer + + + 16 bits unsigned integer + + + 32 bits unsigned integer + + + 8 bits signed integer + + + 16 bits signed integer + + + 32 bits signed integer + + + 32 bits float + + + 64 bits float + + + + + 1024 + 1 + 10 + + + 1024 + 1 + 10 + + + 1024 + 1 + 10 + + + + + True + 3 + 2 + + + True + Filename : + right + True + + + 1 + 2 + 2 + 3 + + + + + True + True + + + + 2 + 3 + + + + + + + + + + + + + + + + + + + 32767 + 1 + 10 + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Generic-TimeSignal.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Generic-TimeSignal.ui new file mode 100755 index 0000000..46171e6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Generic-TimeSignal.ui @@ -0,0 +1,334 @@ + + + + + + 18 + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 1 + 1 + 1 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 128 + + + 256 + + + 512 + + + 1024 + + + 2048 + + + 4096 + + + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + Generic Time Signal + center + + + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 5 + 2 + True + + + True + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + Sampling frequency : + right + True + + + 4 + 5 + + + + + True + Number of channels : + right + True + + + 3 + 4 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Identifier : + right + True + + + + + True + model2 + 0 + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + True + adjustment3 + True + True + + + 1 + 2 + 3 + 4 + + + + + 0 + + + + + 0 + + + + + Change channel names + True + False + False + + + False + 1 + + + + + 3 + + + + + True + + + False + 4 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-LabStreamingLayer.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-LabStreamingLayer.ui new file mode 100755 index 0000000..ee7bb29 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-LabStreamingLayer.ui @@ -0,0 +1,509 @@ + + + + + + 18 + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 4 + 1 + 1024 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 128 + + + 256 + + + 512 + + + 1024 + + + 2048 + + + 4096 + + + + + + + + + + + + + + + + + 5 + Device configuration + center + dialog + center + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + LabStreamingLayer (LSL) + center + + + 1 + + + + + True + 0.47999998927116394 + This driver only supports +cf_float32 streams for signals and +cf_int32 streams for markers + +<small><span color='darkred'>LSL streams with nominal sampling rate of 0 +will automatically turn the fallback sampling rate +(autodetect if empty or force it if set to a numerical value)</span></small> + True + center + + + 2 + + + + + True + + + False + 3 + + + + + True + 8 + 8 + + + True + 8 + + + True + 7 + 2 + True + + + True + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Identifier : + right + True + + + + + True + 0.44999998807907104 + Fallback Sampling Frequency : + right + True + + + 3 + 4 + + + + + True + True + + + + 1 + 2 + 3 + 4 + + + + + True + Limit speed : + + + 4 + 5 + + + + + True + True + False + True + + + 1 + 2 + 4 + 5 + + + + + True + Signal stream + + + 5 + 6 + + + + + True + model3 + + + + 0 + + + + + 1 + 2 + 5 + 6 + + + + + True + model4 + + + + 0 + + + + + 1 + 2 + 6 + 7 + + + + + True + Marker stream + + + 6 + 7 + + + + + 0 + + + + + 0 + + + + + Change channel names + False + False + + + False + 1 + + + + + 4 + + + + + True + + + False + 5 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + + + + True + 8 + 2 + + + Number of channels : + right + True + + + + + True + + True + True + adjustment3 + True + True + + + 1 + 2 + + + + + Sampling frequency : + right + True + + + 1 + 2 + + + + + model2 + + + + 0 + + + + + 1 + 2 + 1 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-MCSNVXDriver.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-MCSNVXDriver.ui new file mode 100755 index 0000000..7bfe7c7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-MCSNVXDriver.ui @@ -0,0 +1,486 @@ + + + + + + 100 + 18 + 1 + 10 + + + 100 + 1 + 10 + + + 1 + 136 + 136 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 125 + + + 250 + + + 500 + + + 1000 + + + 2000 + + + 5000 + + + 10000 + + + 50000 + + + + + + + + + + + Normal + + + Test + + + + + False + 5 + Device configuration + center + dialog + center + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + MCS NVX amplifier + center + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + 8 + 8 + + + True + False + 8 + + + True + False + 8 + 2 + True + + + True + False + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + False + model_mode + 1 + + + + 0 + + + + + 1 + 2 + 8 + 6 + + + + + + + + + + + + + + + + + True + True + False + False + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + False + False + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + False + Sampling frequency : + right + True + + + 4 + 5 + + + + + True + False + Number of channels : + right + True + + + 3 + 4 + + + + + True + False + Gender : + right + True + + + 2 + 3 + + + + + True + False + Age : + right + True + + + 1 + 2 + + + + + True + False + Identifier : + right + True + + + + + True + False + model2 + 0 + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + True + False + False + True + True + adjustment3 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + False + Data mode: + + + 5 + 6 + + + + + True + True + False + True + + + 1 + 2 + 6 + 7 + + + + + True + False + Aux channels: + + + 6 + 7 + + + + + True + False + Check impedance : + + + 7 + 8 + + + + + True + True + False + True + + + 1 + 2 + 7 + 8 + + + + + True + True + 0 + + + + + True + True + 0 + + + + + Change channel names + True + False + False + + + False + True + 1 + + + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Micromed-SystemPlusEvolution.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Micromed-SystemPlusEvolution.ui new file mode 100644 index 0000000..c47ee87 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Micromed-SystemPlusEvolution.ui @@ -0,0 +1,353 @@ + + + + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 65535 + 1 + 10 + + + 1 + 1 + 1024 + 1 + 10 + + + + + + + + + 128 + + + 256 + + + 512 + + + 1024 + + + 2048 + + + 4096 + + + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + Micromed SD LTM (through SystemPlus Evolution) + center + + + False + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 3 + 2 + True + + + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Identifier : + right + True + + + + + True + Connection host port + + + 2 + 3 + + + + + True + True + adjustment3 + True + True + + + 1 + 2 + 2 + 3 + + + + + 0 + + + + + 0 + + + + + False + 3 + + + + + True + + + False + 4 + + + + + True + The optional function of System PLUS Evolution + "SW EEG BCI" is mandatory for the communication + between the device and an external software to + Micromed ( like OpenViBE) . + fill + end + + + 5 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + + + + True + 10 + 10 + + + Change channel names + True + False + False + + + + + True + model1 + + + + 0 + + + + + 1 + 2 + + + + + True + True + adjustment4 + True + True + + + 2 + 3 + + + + + True + model2 + + + + 0 + + + + + 3 + 4 + + + + + True + True + 15 + + + + 4 + 5 + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-MindMedia-NeXus32B.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-MindMedia-NeXus32B.ui new file mode 100644 index 0000000..4ee6323 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-MindMedia-NeXus32B.ui @@ -0,0 +1,333 @@ + + + + + + 32 + 1 + 1024 + 1 + 10 + + + 100 + 1 + 10 + + + 18 + 100 + 1 + 10 + + + + + + + + + 128 + + + 256 + + + 512 + + + 1024 + + + 2048 + + + 4096 + + + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + MindMedia NeXus32B + center + + + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 5 + 2 + True + + + True + True + adjustment1 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + model1 + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + Identifier : + right + True + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + Number of channels : + right + True + + + 3 + 4 + + + + + True + Sampling frequency : + right + True + + + 4 + 5 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + True + adjustment3 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + model2 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + 0 + + + + + 0 + + + + + Change channel names + True + False + False + + + False + 1 + + + + + 3 + + + + + True + + + False + 4 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-NeuroServoHid.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-NeuroServoHid.ui new file mode 100644 index 0000000..10660d6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-NeuroServoHid.ui @@ -0,0 +1,433 @@ + + + + + + 100 + 18 + 1 + 10 + + + 100 + 1 + 10 + + + 1 + 1 + 1 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 2048 + + + + + False + 5 + Device configuration + center + dialog + center + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + NeuroServo + center + + + + + + + True + True + 1 + + + + + True + False + Signal(FP1) | Ref(FPz) | DRL(FP2) + center + + + True + True + 2 + + + + + True + False + + + False + True + 3 + + + + + True + False + 8 + 8 + + + True + False + 8 + + + True + False + 5 + 2 + True + + + True + False + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + False + False + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + False + False + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + False + Sampling frequency : + right + True + + + 4 + 5 + + + + + True + False + Number of channels : + right + True + + + 3 + 4 + + + + + True + False + Gender : + right + True + + + 2 + 3 + + + + + True + False + Age : + right + True + + + 1 + 2 + + + + + True + False + Identifier : + right + True + + + + + True + False + model2 + 0 + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + True + False + False + True + True + adjustment3 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + True + 0 + + + + + True + True + 0 + + + + + True + True + 4 + + + + + True + False + + + False + True + 5 + + + + + Automatic Shutdown + True + True + False + Enable/Disable the device automatic shutdown feature on no head contact detection. + True + True + + + True + True + 6 + + + + + Shutdown on driver disconnect + True + True + False + Enable/Disable the device shutdown sent command on driver “Disconnect” button activation. + True + True + + + True + True + 7 + + + + + Device Light Enable + True + True + False + Enable/Disable the device brim light while the device is connected. + True + True + + + True + True + 8 + + + + + True + False + <span size="smaller" foreground="#602020"> This device is transferring RAW data at rate of 2048Hz. +(Same as sampling frequency) + +To minimize sporadic automatic drift correction on data +you should set the Drift Tolerance (ms) to 20 in +Acquisition Server Preferences. + +Be advised that the RAW data generated by this device +has not been passed through a Notch filter. +</span> + True + center + + + True + True + 9 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Neurosky-Mindset.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Neurosky-Mindset.ui new file mode 100644 index 0000000..f1a7ea7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Neurosky-Mindset.ui @@ -0,0 +1,418 @@ + + + + + + 18 + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 4 + 1 + 1024 + 1 + 10 + + + + + + + + + 512 + + + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + Neurosky Mindset + center + + + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 6 + 2 + True + + + True + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + Sampling frequency : + right + True + + + 4 + 5 + + + + + Number of channels : + right + True + + + 3 + 4 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Identifier : + right + True + + + + + True + model2 + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + adjustment3 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + COM Port + + + 5 + 6 + + + + + True + liststore1 + + + + 0 + + + + + 1 + 2 + 5 + 6 + + + + + 0 + + + + + 0 + + + + + Change channel names + True + False + False + False + + + False + 1 + + + + + Check Signal Quality + True + True + + + 2 + + + + + 3 + + + + + True + + + False + 4 + + + + + True + vertical + + + ESense (Meditation/Attention) + True + True + False + True + + + 0 + + + + + Power (8 channels) + True + True + False + True + + + 1 + + + + + Blinks (As OVTK_GDF_Eye_Blink stimulation) + True + True + False + True + + + 2 + + + + + Blink Strength (1 channel with spikes) + True + True + False + True + + + 3 + + + + + 5 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Simulated-Deviator.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Simulated-Deviator.ui new file mode 100755 index 0000000..c1bcb9e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-Simulated-Deviator.ui @@ -0,0 +1,744 @@ + + + + + + 100 + 18 + 1 + 10 + + + 100 + 1 + 10 + + + 3 + 3 + 3 + 1 + 10 + + + -500 + 500 + 0 + 0.01 + 1 + + + 0 + 100 + 0.1 + 0.01 + 1 + + + 0 + 1 + 0.99 + 0.001 + 0.01 + + + 0 + 100 + 0.1 + 0.01 + 1 + + + 0 + 10000 + 3 + 0.1 + 1 + + + 0 + 100 + 0 + 0.01 + 0.1 + + + 0 + 10 + 0.5 + 0.01 + 0.1 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 128 + + + 256 + + + 512 + + + 1000 + + + 1024 + + + 2048 + + + 4096 + + + 9600 + + + 19200 + + + 44100 + + + 48000 + + + + + + + + + + + Square + + + Sine + + + + + False + 5 + Device configuration + center + dialog + center + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + Simulated Deviator + center + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + 8 + 8 + + + True + False + 8 + + + True + False + 7 + 2 + True + + + True + False + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + False + False + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + False + False + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + False + Sampling frequency : + right + True + + + 4 + 5 + + + + + True + False + Number of channels : + right + True + + + 3 + 4 + + + + + True + False + Gender : + right + True + + + 2 + 3 + + + + + True + False + Age : + right + True + + + 1 + 2 + + + + + True + False + Identifier : + right + True + + + + + True + False + model2 + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + False + False + False + False + False + adjustment3 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + False + Send periodical stimulations : + + + 5 + 6 + + + + + True + True + False + False + True + + + 1 + 2 + 5 + 6 + + + + + True + False + Check impedance : + + + 6 + 7 + + + + + True + True + False + True + + + 1 + 2 + 6 + 7 + + + + + True + False + Offset (Hz) : + + + 7 + 8 + + + + + True + True + False + False + True + True + adjustment4 + False + True + + + 1 + 2 + 7 + 8 + + + + + True + False + Spread: + + + 8 + 9 + + + + + True + True + False + False + True + True + adjustment5 + False + True + + + 1 + 2 + 8 + 9 + + + + + True + False + Max dev (Hz): + + + 9 + 10 + + + + + True + True + False + False + True + True + adjustment8 + False + True + + + 1 + 2 + 9 + 10 + + + + + True + False + Pullback : + + + 10 + 11 + + + + + True + True + False + False + True + True + adjustment6 + False + True + + + 1 + 2 + 10 + 11 + + + + + True + False + Update (s) : + + + 11 + 12 + + + + + True + True + False + False + True + True + adjustment7 + False + True + + + 1 + 2 + 11 + 12 + + + + + True + False + Wave type : + + + 12 + 13 + + + + + True + False + model3 + + + + 0 + + + + + 1 + 2 + 12 + 13 + + + + + True + False + Freeze frequency (hz, avg) : + + + 13 + 14 + + + + + True + True + False + False + True + True + adjustment9 + False + True + + + 1 + 2 + 13 + 14 + + + + + True + False + Freeze duration (s) : + + + 14 + 15 + + + + + True + True + False + False + True + True + adjustment10 + False + True + + + 1 + 2 + 14 + 15 + + + + + True + True + 0 + + + + + True + True + 0 + + + + + Change channel names + True + False + False + False + + + False + True + 1 + + + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-TMSI-Refa32B.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-TMSI-Refa32B.ui new file mode 100644 index 0000000..710d79a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-TMSI-Refa32B.ui @@ -0,0 +1,448 @@ + + + + + + 32 + 1 + 1024 + 1 + 10 + + + 18 + 100 + 1 + 10 + + + 100 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 128 + + + 256 + + + 512 + + + 1024 + + + 2048 + + + 4096 + + + + + + + + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + TMSI Refa32B + center + + + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 6 + 2 + True + + + True + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + Number of channels : + right + True + + + 3 + 4 + + + + + True + True + adjustment1 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + adjustment3 + True + True + + + 1 + 2 + + + + + True + Sampling frequency : + right + True + + + 4 + 5 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Identifier : + right + True + + + + + True + model2 + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + model3 + + + + 0 + + + + + 1 + 2 + 5 + 6 + + + + + True + Device Master : + right + True + + + 5 + 6 + + + + + 0 + + + + + 0 + + + + + Change channel names + True + False + False + + + False + 1 + + + + + True + 3 + + + True + True + automatic + automatic + + + True + True + + + + + + + True + True + automatic + automatic + + + True + True + + + + + 2 + 3 + + + + + True + + + + + + > + True + True + True + 8 + + + 1 + + + + + < + True + True + True + 8 + + + 2 + + + + + + + + 1 + 2 + + + + + 2 + + + + + 3 + + + + + True + + + False + 4 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-TMSi.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-TMSi.ui new file mode 100644 index 0000000..0422317 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-TMSi.ui @@ -0,0 +1,738 @@ + + + + + + 1024 + 32 + 1 + 10 + + + 100 + 18 + 1 + 10 + + + 100 + 1 + 10 + + + 1024 + 1 + 10 + + + + + + + + + + + 2 kOhm + 0 + + + 5 kOhm + 1 + + + 10 kOhm + 2 + + + 20 kOhm + 3 + + + 50 kOhm + 4 + + + 100 kOhm + 5 + + + 200 kOhm + 6 + + + + + + + + + + + + + + + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + + + + + + + False + 5 + Device configuration + center + dialog + center + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + <b>TMSi Universal Driver</b> + True + center + + + True + True + 1 + + + + + True + False + To set up the acquisition please set the controls in sequence. + True + + + True + True + 2 + + + + + True + False + + + False + True + 3 + + + + + True + False + 8 + 8 + + + True + False + 8 + + + True + False + 14 + 2 + True + + + True + False + model1 + + + + 0 + + + + + 1 + 2 + 3 + 4 + + + + + True + True + False + False + True + True + adjustment2 + True + True + + + 1 + 2 + 2 + 3 + + + + + True + True + False + False + True + True + adjustment3 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + False + <span color="blue"><b>3</b></span> Sampling frequency : + True + right + True + + + 7 + 8 + + + + + True + False + Gender : + right + True + + + 3 + 4 + + + + + True + False + Age : + right + True + + + 2 + 3 + + + + + True + False + Identifier : + right + True + + + 1 + 2 + + + + + True + False + How many samples per second will be acquired. +Higher sampling frequency increases precision of EEG. + model2 + + + + 0 + + + + + 1 + 2 + 7 + 8 + + + + + True + False + <span color="blue"><b>1</b></span> Connection Protocol + True + + + 5 + 6 + + + + + True + False + <span color="blue"><b>2</b></span> Device : + True + + + 6 + 7 + + + + + True + False + liststore_tmsi_connection_protocol + + + + 0 + + + + + 1 + 2 + 5 + 6 + + + + + True + False + liststore_tmsi_devices + + + + 0 + + + + + 1 + 2 + 6 + 7 + + + + + True + False + <b>Subject Settings</b> + True + + + 2 + + + + + True + False + +<b>Driver Settings</b> + True + + + 2 + 4 + 5 + + + + + True + False + <span color="blue"><b>4</b></span> Number of EEG channels : + True + right + True + + + 13 + 14 + + + + + True + True + True + + False + False + True + True + adjustment_eeg_channels + True + True + + + 1 + 2 + 13 + 14 + + + + + True + False + <b>Channel Settings</b> + True + + + 2 + 12 + 13 + + + + + False + Use Common Average Reference + True + + + 8 + 9 + + + + + True + False + True + Whether to use common average reference (CAR) or not. Using CAR greatly improves the quality of signal in regards to ambient and environmental noise. + True + + + 1 + 2 + 8 + 9 + + + + + True + False + +<b>Additional Settings</b> + True + + + 2 + 9 + 10 + + + + + True + False + Impedance Limit : + right + True + + + 10 + 11 + + + + + True + False + True + Some TMSi amplifiers can measure impedance. When the electrodes are equipped with LEDs they will illuminate if their impedance is superior to the selected value. + liststore_impedance_limit + + + + 0 + + + + + 1 + 2 + 10 + 11 + + + + + True + False + Check impedance : + + + 11 + 12 + + + + + True + True + False + True + + + 1 + 2 + 11 + 12 + + + + + True + True + 0 + + + + + True + True + 0 + + + + + True + False + You can rename the EEG channels if you wish. Additional channels will +always have their names set to names reported by the device. + True + + + True + True + 1 + + + + + Change EEG channel names + True + False + False + + + False + True + 2 + + + + + True + False + Some TMSi amplifiers provide additional channels, +such as Time signal, Accelerometer readings and +others. You can activate each of these channels separately. + Additional channels + + + True + True + 3 + + + + + True + False + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + True + 4 + + + + + True + True + 4 + + + + + True + False + + + False + True + 5 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-channel-names.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-channel-names.ui new file mode 100644 index 0000000..91ae4aa --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-channel-names.ui @@ -0,0 +1,210 @@ + + + + 480 + 320 + 5 + Choose electrode names... + GTK_WIN_POS_CENTER + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_CENTER + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + 8 + 8 + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + + + True + + + + + + + True + GTK_BUTTONBOX_CENTER + + + True + + + True + gtk-go-forward + + + + + False + False + + + + + True + + + True + gtk-cancel + + + + + False + False + 1 + + + + + False + False + 1 + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + + + True + + + + + 2 + + + + + 1 + + + + + True + + + False + 2 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + GTK_BUTTONBOX_END + + + True + True + True + + + True + + + True + gtk-open + 3 + + + + + True + Load... + + + 1 + + + + + + + + + True + True + True + + + True + + + True + gtk-save-as + 3 + + + + + True + Save... + + + 1 + + + + + + + 1 + + + + + True + gtk-apply + True + + + 2 + + + + + True + gtk-cancel + True + + + 3 + + + + + False + GTK_PACK_END + + + + + + button_apply_channel_name + button_remove_channel_name + button_load + button_save + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-egi-ampserver.ui b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-egi-ampserver.ui new file mode 100755 index 0000000..cbe0701 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface-egi-ampserver.ui @@ -0,0 +1,438 @@ + + + + + + 32 + 1 + 280 + 1 + 10 + + + 100 + 1 + 10 + + + 18 + 100 + 1 + 10 + + + 9879 + 1 + 32767 + 1 + 10 + + + 9877 + 1 + 32767 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 1000 + + + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + EGI Net Amps 300 (through AmpServer) + center + + + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 7 + 2 + True + + + True + True + adjustment1 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + Identifier : + right + True + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + Number of channels : + right + True + + + 3 + 4 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + True + adjustment3 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + AmpServer stream port : + right + True + + + 6 + 7 + + + + + True + AmpServer command port : + right + True + + + 5 + 6 + + + + + True + True + + adjustment4 + True + True + + + 1 + 2 + 6 + 7 + + + + + True + True + + adjustment5 + True + True + + + 1 + 2 + 5 + 6 + + + + + True + AmpServer host name : + right + True + + + 4 + 5 + + + + + True + True + + localhost + + + 1 + 2 + 4 + 5 + + + + + 0 + + + + + 0 + + + + + Change channel names + True + False + False + + + False + 1 + + + + + 3 + + + + + True + + + False + 4 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + + + + True + 3 + 3 + + + True + Sampling frequency : + right + True + + + + + True + model2 + + + + 0 + + + + + 1 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface.ui-base b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface.ui-base new file mode 100644 index 0000000..026f531 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/interface.ui-base @@ -0,0 +1,827 @@ + + + + + + 1024 + 65535 + 9999 + 1 + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 1000 + 10 + 1 + 10 + + + 1 + 1000 + 10 + 1 + 10 + + + 1 + 16 + 1 + 1 + 10 + + + True + False + gtk-properties + + + + + + + + + 4 + + + 8 + + + 16 + + + 32 + + + 64 + + + 128 + + + 256 + + + 512 + + + + + + + + + + + Let the driver decide + + + Force + + + Disable + + + + + + + + + + + Replace with the last correct value + + + Replace with 0 + + + No replacement + + + + + False + OpenViBE Acquisition Server v${PROJECT_VERSION} + False + center + + + + True + False + 8 + 2 + + + True + False + 2 + + + True + False + 5 + 2 + 2 + + + True + False + Driver : + right + True + + + 1 + 2 + + + + + True + False + Connection port : + right + True + + + 2 + 3 + + + + + True + False + Sample count per sent block : + right + True + + + 3 + 4 + + + + + True + True + False + False + True + True + adjustment1 + True + True + + + 1 + 2 + 2 + 3 + + + + + True + False + model-sample_count_per_sent_block + 0 + + + False + False + False + True + True + + + + + 1 + 2 + 3 + 4 + + + + + True + False + + + True + False + + + True + True + 0 + + + + + Driver Properties + True + False + True + True + False + image_driver_properties + + + False + False + 1 + + + + + 1 + 2 + 1 + 2 + + + + + + + + + + + + + + + + + False + False + 0 + + + + + True + False + + + False + True + 8 + 1 + + + + + True + False + 2 + spread + + + gtk-preferences + True + True + True + False + True + + + False + False + 0 + + + + + gtk-connect + True + False + False + False + True + + + False + False + 1 + + + + + gtk-media-play + True + False + False + False + False + True + + + False + False + 2 + + + + + gtk-media-stop + True + False + False + False + False + True + + + False + False + 3 + + + + + False + True + 2 + + + + + True + True + 0 + + + + + True + False + + + False + True + 1 + + + + + True + False + 2 + 2 + + + True + False + center + + + 2 + + + + + True + False + right-to-left + adjustment_drift_1 + + + 1 + 2 + + + + + True + False + adjustment_drift_2 + + + 1 + 2 + 1 + 2 + + + + + True + True + 2 + + + + + True + False + + + False + True + 3 + + + + + True + False + 2 + 2 + + + True + False + center + + + 2 + + + + + True + False + center + + + 2 + 1 + 2 + + + + + True + True + 4 + + + + + + + False + 5 + Global Configuration + True + center + normal + + + True + False + 2 + + + True + False + Acquisition Server +Configuration + True + center + + + True + True + 0 + + + + + True + False + + + False + True + 1 + + + + + True + False + 10 + 2 + + + True + False + 0 + 2 + Oversampling Factor + + + 4 + 5 + + + + + True + False + 0 + 2 + Select only named channels + + + 6 + 7 + + + + + True + True + + False + False + True + True + adjustment_oversampling_factor + + + 1 + 2 + 4 + 5 + + + + + True + True + False + False + True + + + 1 + 2 + 6 + 7 + + + + + True + False + 0 + 2 + Jitter Estimation Count For Drift + + + 2 + 3 + + + + + True + False + 0 + 2 + Drift Tolerance (ms) + + + 1 + 2 + + + + + True + True + + False + False + True + True + adjustment_jitter_measure_count + + + 1 + 2 + 2 + 3 + + + + + True + True + + False + False + True + True + adjustment_drift_tolerance + + + 1 + 2 + 1 + 2 + + + + + True + False + + + 2 + 3 + 4 + + + + + True + False + + + 2 + 5 + 6 + + + + + True + False + 0 + 2 + Drift Correction + + + + + True + False + model_drift_correction + + + + 0 + + + + + 1 + 2 + + + + + True + False + + + 2 + 8 + 9 + + + + + True + False + 0 + 2 + NaN value replacement + + + 9 + 10 + + + + + True + False + model_nan_replacement + + + + 0 + + + + + 1 + 2 + 9 + 10 + + + + + True + True + 2 + + + + + True + False + + + False + True + 3 + + + + + True + False + Plugin Settings + + + True + True + 4 + + + + + True + False + end + + + gtk-apply + True + True + True + False + True + + + False + False + 0 + + + + + gtk-cancel + True + True + True + False + True + + + False + False + 1 + + + + + False + True + end + 5 + + + + + True + False + + + + + + True + True + 6 + + + + + + button_ok + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/ov-channel-rename-easycap-64ch.cfg b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/ov-channel-rename-easycap-64ch.cfg new file mode 100644 index 0000000..4140720 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/ov-channel-rename-easycap-64ch.cfg @@ -0,0 +1,3 @@ + + Fp1;Fz;F3;F7;FT9;FC5;FC1;C3;T7;TP9;CP5;CP1;Pz;P3;P7;O1;Oz;O2;P4;P8;TP10;CP6;CP2;Cz;C4;T8;FT10;FC6;FC2;F4;F8;Fp2;AF7;AF3;AFz;F1;F5;FT7;FC3;FCz;C1;C5;TP7;CP3;P1;P5;PO7;PO3;POz;PO4;PO8;P6;P2;CPz;CP4;TP8;C6;C2;FC4;FT8;F6;F2;AF4;AF8; + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/scripts/egi-default-initialize.script b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/scripts/egi-default-initialize.script new file mode 100644 index 0000000..4bb7a67 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/scripts/egi-default-initialize.script @@ -0,0 +1,5 @@ +(sendCommand cmd_NumberOfAmps -1 -1 -1) +(sendCommand cmd_SetPower 0 -1 0) +(sendCommand cmd_SetPower 0 -1 1) +(sendCommand cmd_GetAmpDetails 0 -1 -1) +(sendCommand cmd_SetDecimatedRate 0 0 1000) diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/scripts/egi-default-start.script b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/scripts/egi-default-start.script new file mode 100644 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/scripts/egi-default-stop.script b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/scripts/egi-default-stop.script new file mode 100644 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/scripts/egi-default-uninitialize.script b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/scripts/egi-default-uninitialize.script new file mode 100644 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/vamp-acquiring.bmp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/vamp-acquiring.bmp new file mode 100644 index 0000000..e2b92c4 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/vamp-acquiring.bmp differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/vamp-default.bmp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/vamp-default.bmp new file mode 100644 index 0000000..957d6fa Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/vamp-default.bmp differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/vamp-impedance-mask.bmp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/vamp-impedance-mask.bmp new file mode 100644 index 0000000..17feb89 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/vamp-impedance-mask.bmp differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/vamp-standby.bmp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/vamp-standby.bmp new file mode 100644 index 0000000..83a63e7 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/vamp-standby.bmp differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/vamp.bmp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/vamp.bmp new file mode 100644 index 0000000..d75a015 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/share/vamp.bmp differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/mCBridgeBioSemiActiveTwo.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/mCBridgeBioSemiActiveTwo.cpp new file mode 100644 index 0000000..39803d7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/mCBridgeBioSemiActiveTwo.cpp @@ -0,0 +1,709 @@ +/* + * mCBioSemiActiveTwoBridge.cpp + * + * Copyright (c) 2012, Mensia Technologies SA. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + + +/* +This code implements the procedure described her: +http://www.biosemi.com/faq/make_own_acquisition_software.htm +*/ + +#ifdef TARGET_HAS_ThirdPartyBioSemiAPI +#include "mCBridgeBioSemiActiveTwo.h" + +#include +//debug +#include + +#ifdef WIN32 +#ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN +#endif +#include +#else +// linux, mac +#include +#endif // WIN32 + +#include + +//___________________________________________________________________// +// // +#ifdef _DEBUG +#define __BioSemiBridgeLogConsole__(msg, ...) printf(msg, __VA_ARGS__) +#else +#define __BioSemiBridgeLogConsole__(msg, ...) +#endif + +//___________________________________________________________________// +// // +// Ring buffer must be large enough to hold at least a complete sample round +// otherwise we wont be able to detect the length between 2 sync bytes and deduce channel count. +// test gives 131072 bytes (32768 long) per read +// it needs to be a multiple of 512 +#define BIOSEMI_ACTIVETWO_RINGBUFFERLONGCOUNT (32768*512) +#define BIOSEMI_ACTIVETWO_RINGBUFFERBYTES (BIOSEMI_ACTIVETWO_RINGBUFFERLONGCOUNT*sizeof(int)) //67108864 bytes + +// The control buffer is sent through USB_WRITE. It is a 64 bytes buffer. +// First byte controls the start/stop filling of ring buffer; if Odd, it starts. +// 2nd and 3rd byte are used for outgoing triggers. +// byte 4-64 unused. +#define BIOSEMI_ACTIVETWO_CONTROLBUFFERBYTES 64 + +// SYNC bytes pads the stream that sends a fixed number of bytes per read() independently of the channel count. +#define BIOSEMI_ACTIVETWO_SYNCBYTES 0xffffff00 + +// the device can be configured by changing the speedmode "button" in front of the amplifier 0-9 +#define BIOSEMI_ACTIVETWO_SPEEDMODECOUNT 10 + +namespace BioSemi { +/* +AD-box model MK1 + +AD-box switch | Sample-rate | Pin channels + EX channels + Sensor channels +***************|*****************|********************************************* +0 | 2048 (2 kHz) | 256+0+0 +1 | 4096 (4 kHz) | 128+0+0 +2 | 8192 (8 kHz) | 64+0+0 +3 | 16384 (16 kHz) | 32+0+0 +4 | 2048 (2 kHz) | 232+8+7 +5 | 4096 (4 kHz) | 104+8+7 +6 | 8192 (8 kHz) | 40+8+7 +7 | 16384 (16 kHz) | 8+8+7 +8 (AIB-mode) | 2048 (2 kHz) | AIB-mode +9 | Reserved | Reserved +*/ +static uint32_t activeTwoMarkISpeedModeFrequency[BIOSEMI_ACTIVETWO_SPEEDMODECOUNT] = { 2048, 4096, 8192, 16384, 2048, 4096, 8192, 16384, 2048, 0 }; + +/* +AD-box model MK2 + +AD-box switch | Sample-rate | Pin channels + EX channels + Sensor channels +***************|*****************|********************************************* +0 | 2048 (2 kHz) | >> Daisy-chain mode: +1 | 4096 (4 kHz) | >> In speedmode 0 to 3, the AD-boxes work as up to 4 optical fiber 'daisy chained' boxes, +2 | 8192 (8 kHz) | >> each with a maximum of 128+8 channels+sensors @ 2 kHz, speedmode switch = box number. (0=Box1, 1=Box2, 2=Box3, 3=Box4). +3 | 16384 (16 kHz) | >> Daisy chain possibilities are not standard included in the base system price +4 | 2048 (2 kHz) | 256+8+7 +5 | 4096 (4 kHz) | 128+8+7 +6 | 8192 (8 kHz) | 64+8+7 +7 | 16384 (16 kHz) | 32+8+7 +8 (AIB-mode) | 2048 (2 kHz) | 256+8+7+32AIB +9 (ABR-mode) | 16384 (16 kHz) | 5 +*/ +static uint32_t activeTwoMarkIISpeedModeFrequency[BIOSEMI_ACTIVETWO_SPEEDMODECOUNT] = { 2048, 4096, 8192, 16384, 2048, 4096, 8192, 16384, 2048, 16384 }; + +static uint32_t* activeTwoSpeedModeFrequency[2] = { activeTwoMarkISpeedModeFrequency, activeTwoMarkIISpeedModeFrequency }; + +/* +The ActiveTwo sends the following number of 32-bit words per sample: + +Mk1: +Speedmode 0 and 4: 258 +Speedmode 1 and 5: 130 +Speedmode 2 and 6: 66 +Speedmode 3 and 7: 34 +Speedmode 8: 290 (2+256+32) +*/ +static uint32_t activeTwoMarkILongPerSample[BIOSEMI_ACTIVETWO_SPEEDMODECOUNT] = { 258, 130, 66, 34, 258, 130, 66, 34, 290, 0 }; + +/* +Mk2: +Speedmode 0, 1, 2 and 3: 610 (2+4*152) +Speedmode 4: 282 +Speedmode 5: 154 +Speedmode 6: 90 +Speedmode 7: 58 +Speedmode 8: 314 (2+280+32) +*/ +static uint32_t activeTwoMarkIILongPerSample[BIOSEMI_ACTIVETWO_SPEEDMODECOUNT] = { 610, 610, 610, 610, 282, 154, 90, 58, 314, 0 }; + +static uint32_t* activeTwoMarkLongPerSample[2] = { activeTwoMarkILongPerSample, activeTwoMarkIILongPerSample }; +/* +The ActiveTwo sends the following number of 32-bit words per sample: + +Mk1: +Speedmode 0 and 4: 258 +Speedmode 1 and 5: 130 +Speedmode 2 and 6: 66 +Speedmode 3 and 7: 34 +Speedmode 8: 290 (2+256+32) +*/ +static uint32_t activeTwoMarkIElectrodeChannelPerSample[BIOSEMI_ACTIVETWO_SPEEDMODECOUNT] = { 256, 128, 256, 34, 232, 104, 40, 8, 290, 0 }; + +/* +The ActiveTwo sends the following number of 32-bit words per sample: + +Mk2: +Speedmode 0 and 4: 258 +Speedmode 1 and 5: 130 +Speedmode 2 and 6: 66 +Speedmode 3 and 7: 34 +Speedmode 8: 290 (2+256+32) +*/ +static uint32_t activeTwoMarkIIElectrodeChannelPerSample[BIOSEMI_ACTIVETWO_SPEEDMODECOUNT] = { 256, 128, 256, 128, 256, 128, 64, 32, 314, 0 }; + +static uint32_t* activeTwoMarkElectrodeChannelPerSample[2] = { activeTwoMarkIElectrodeChannelPerSample, activeTwoMarkIIElectrodeChannelPerSample }; + +/* +Mk2: +Speedmode 0, 1, 2 and 3: 610 (2+4*152) +Speedmode 4: 282 +Speedmode 5: 154 +Speedmode 6: 90 +Speedmode 7: 58 +Speedmode 8: 314 (2+280+32) +*/ +static uint32_t activeTwoMarkIExChannelPerSample[BIOSEMI_ACTIVETWO_SPEEDMODECOUNT] = { 0, 0, 0, 0, 8, 8, 8, 8, 8, 8 }; + +/* +Mk2: +Speedmode 0, 1, 2 and 3: 610 (2+4*152) +Speedmode 4: 282 +Speedmode 5: 154 +Speedmode 6: 90 +Speedmode 7: 58 +Speedmode 8: 314 (2+280+32) +*/ +static uint32_t activeTwoMarkIIExChannelPerSample[BIOSEMI_ACTIVETWO_SPEEDMODECOUNT] = { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; + +static uint32_t* activeTwoMarkExChannelPerSample[2] = { activeTwoMarkIExChannelPerSample, activeTwoMarkIIExChannelPerSample }; +} // namespace BioSemi + +//___________________________________________________________________// +// // +namespace OpenViBE { + +CBridgeBioSemiActiveTwo::CBridgeBioSemiActiveTwo() +{ + m_buffers.resize(BIOSEMI_ACTIVETWO_RINGBUFFERBYTES, 0); + m_controlBuffers.resize(BIOSEMI_ACTIVETWO_CONTROLBUFFERBYTES); + m_lastError = BioSemiError_NoError; + m_useEXChannels = false; +} + +CBridgeBioSemiActiveTwo::~CBridgeBioSemiActiveTwo() {} + +//___________________________________________________________________// +// // +bool CBridgeBioSemiActiveTwo::isDeviceConnected() +{ + m_hDevice = OPEN_DRIVER(); + if (m_hDevice == INVALID_HANDLE_VALUE) + { + __BioSemiBridgeLogConsole__("Failed to open driver!\n"); + m_lastError = BioSemiError_OSOpenFailed; + return false; + } + + Sleep(100); + + if (!CLOSE_DRIVER(m_hDevice)) + { + __BioSemiBridgeLogConsole__("device driver cannot be closed!!\n"); + m_lastError = BioSemiError_OSCloseFailed; + return false; + } + + return true; +} + + +bool CBridgeBioSemiActiveTwo::open() +{ + m_lastRingBufferByteIdx = 0; + m_consumptionByteIdx = 0; + m_firstRead = true; + + m_nTotalByteRead = 0; + + m_nChannel = 0; + m_nInitialChannel = 0; + m_bridgeSyncedWithDevice = false; + + m_triggers.clear(); + m_triggers.resize(16, false); + m_epochStarted = false; + m_cmsInRange = false; + m_batteryLow = false; + m_activeTwoMarkII = false; + m_initialActiveTwoMarkII = false; + m_speedMode = -1; + m_initialSpeedmode = 0; + + m_hDevice = OPEN_DRIVER(); + if (m_hDevice == INVALID_HANDLE_VALUE) + { + __BioSemiBridgeLogConsole__("Failed to open driver!\n"); + m_lastError = BioSemiError_OSOpenFailed; + return false; + } + + __BioSemiBridgeLogConsole__("Handle created, configuring...\n"); + + // TEMP for debug: log file written along with the LabView_DLL + //BSIF_SET_LOG(true); + + // default config + //BSIF_SET_SYNC(true); + //BSIF_SET_DEBUG(false); + + // No stride + //BSIF_SET_STRIDE_KB(0); + //BSIF_SET_STRIDE_MS(0); + + char bufferInfo[256]; + GET_DRIVER_INFO(bufferInfo, 256); + __BioSemiBridgeLogConsole__("Driver Info: %s", bufferInfo); + + __BioSemiBridgeLogConsole__("connecting ring buffer ...\n"); + READ_MULTIPLE_SWEEPS(m_hDevice, &m_buffers[0], BIOSEMI_ACTIVETWO_RINGBUFFERBYTES); + + __BioSemiBridgeLogConsole__("device driver now opened.\n"); + return true; +} + +bool CBridgeBioSemiActiveTwo::start() +{ + m_controlBuffers.clear(); + m_controlBuffers.resize(BIOSEMI_ACTIVETWO_CONTROLBUFFERBYTES); + m_controlBuffers[0] = char(-1); // Odd number to start the filling of ring buffer + + BOOL status = false; + + status = USB_WRITE(m_hDevice, &m_controlBuffers[0]); + if (!status) + { + __BioSemiBridgeLogConsole__("usb_write for enable handshake failed with [%i]\n", GetLastError()); + m_lastError = BioSemiError_EnableUSBHandshakeFailed; + return false; + } + + // Past this point, the ring buffer is constantly filled. + return true; +} + +int CBridgeBioSemiActiveTwo::read() +{ + int bytesRead; +#if TARGET_ARCHITECTURE_x64 + long long currentRingBufferByteIdx; +#else + int currentRingBufferByteIdx; +#endif + const bool status = (READ_POINTER(m_hDevice, ¤tRingBufferByteIdx) != FALSE); + + if (!status) + { + __BioSemiBridgeLogConsole__("READ_POINTER failed !!\n"); + m_lastError = BioSemiError_ReadPointerFailed; + return -1; + } + + if (currentRingBufferByteIdx != m_lastRingBufferByteIdx) + { + bytesRead = currentRingBufferByteIdx - m_lastRingBufferByteIdx; + + // ring buffer: we can loop indices + if (bytesRead < 0) + { + bytesRead += BIOSEMI_ACTIVETWO_RINGBUFFERBYTES; + __BioSemiBridgeLogConsole__("RING BUFFER IS ROLLING\n"); + } + + //__BioSemiBridgeLogConsole__("READ_POINTER read %i bytes\n",l_iBytesRead); + + m_nTotalByteRead += uint32_t(bytesRead); + m_lastRingBufferByteIdx = currentRingBufferByteIdx; + + // determine number of channels according to sync bytes + // Two extra channels are leading the ADC data: before: channel 1 = sync (check for FFFFFF00) and channel 2 = Status + // (see http://www.biosemi.com/faq/trigger_signals.htm), channels 3-258 are ADCs 1-256. + + uint32_t firstSyncByte = -1; + uint32_t nextSyncByte = -1; + + // for loop over LONG values, not bytes + for (int i = 0; i < bytesRead && !m_bridgeSyncedWithDevice; ++i) + { + if (*(reinterpret_cast(&m_buffers[i])) == BIOSEMI_ACTIVETWO_SYNCBYTES) + { + __BioSemiBridgeLogConsole__("sync detected at byte %i\n", i); + if (firstSyncByte == -1) { firstSyncByte = i; } + else + { + //second sync found, we can deduce the channel count: it's the number of longs in between + nextSyncByte = i; + m_nChannel = nextSyncByte - firstSyncByte; + m_nChannel /= sizeof(int); + m_nChannel -= 2; + + + // we also initialize the status values for getSamplingFrequency + const int statusChannelValue = *(reinterpret_cast(&m_buffers[firstSyncByte + sizeof(int)])); // status integer just after sync integer + if (!this->updateStatusFromValue(statusChannelValue)) + { + __BioSemiBridgeLogConsole__("something bad in latest status value !\n"); + return -1; + } + + // Bridge is synced, user can call status getters + m_bridgeSyncedWithDevice = true; + + //consuming all sync samples + //this->consumeBytes(sizeof(int) * (getSampleCount() - m_nChannel - 1)); + + // The Handsake is complete; we can safely consume the corresponding data + // channel# + SYNC (Status is consumed in updateStatusFromValue function) + this->consumeBytes((m_nChannel + 1) * sizeof(int)); + + // fix number of channel + } + } + } + + if (!m_bridgeSyncedWithDevice) + { + __BioSemiBridgeLogConsole__("Cannot synchronize on current data, waiting for more.\n"); + return 0; + } + + //debug + /*fstream fs("C:/biosemi-buffer.data",fstream::app); + fs<< "START----------------------------------------------"; + for (int i=0; i(&m_buffers[i])) << std::endl; + fs.close(); + fs<< "END----------------------------------------------";*/ + + if (m_firstRead) + { + m_nInitialChannel = m_useEXChannels ? m_nChannel + getEXChannelCount() : m_nChannel; + m_initialSpeedmode = m_speedMode; + m_initialActiveTwoMarkII = m_activeTwoMarkII; + m_firstRead = false; + + // Consume what remains of data + // samples# - channel# - SYNC + this->consumeBytes(sizeof(int) * (getSampleCount() - m_nChannel - 1)); + + m_nChannel = m_nChannel < getElectrodeChannelCount() ? m_nChannel : getElectrodeChannelCount(); + __BioSemiBridgeLogConsole__( + "Bridge sync! Initial configuration is: %u channels | speedmode %u | Mark2 %u | Sample count %u | electrode channel count %u | EX channel count: %u \n", + m_nInitialChannel, m_initialSpeedmode, m_initialActiveTwoMarkII, getSampleCount(), getElectrodeChannelCount(), getEXChannelCount()); + } + return bytesRead; + } + + // nothing read + //__BioSemiBridgeLogConsole__("READ_POINTER has nothing for us.\n)"; + return 0; +} + +//___________________________________________________________________// +// // + +bool CBridgeBioSemiActiveTwo::updateStatusFromValue(int value) +{ + /* + Bit 00 (LSB) Trigger Input 1 (High = trigger on) + Bit 01 Trigger Input 2 (High = trigger on) + Bit 02 Trigger Input 3 (High = trigger on) + Bit 03 Trigger Input 4 (High = trigger on) + Bit 04 Trigger Input 5 (High = trigger on) + Bit 05 Trigger Input 6 (High = trigger on) + Bit 06 Trigger Input 7 (High = trigger on) + Bit 07 Trigger Input 8 (High = trigger on) + Bit 08 Trigger Input 9 (High = trigger on) + Bit 09 Trigger Input 10 (High = trigger on) + Bit 10 Trigger Input 11 (High = trigger on) + Bit 11 Trigger Input 12 (High = trigger on) + Bit 12 Trigger Input 13 (High = trigger on) + Bit 13 Trigger Input 14 (High = trigger on) + Bit 14 Trigger Input 15 (High = trigger on) + Bit 15 Trigger Input 16 (High = trigger on) + Bit 16 High when new Epoch is started + Bit 17 Speed bit 0 + Bit 18 Speed bit 1 + Bit 19 Speed bit 2 + Bit 20 High when CMS is within range ---> error in the documentation, it is the opposite + Bit 21 Speed bit 3 + Bit 22 High when battery is low + Bit 23 (MSB) High if ActiveTwo MK2 + */ + //__BioSemiBridgeLogConsole__("status line value is [%#x]\n",value); + // the status channel has 2 bytes padding (zeros), so we start at 0x100 + for (uint32_t t = 0; t < 16; ++t) { m_triggers[t] = (value & (0x100 << t)) != 0; } + + m_epochStarted = (value & (0x100 << 16)) != 0; + m_cmsInRange = !(value & (0x100 << 20)) != 0; // bit low = CM in range ! + m_batteryLow = (value & (0x100 << 22)) != 0; + m_activeTwoMarkII = (value & (0x100 << 23)) != 0; + m_speedMode = ((value & (0x100 << 17)) != 0) + (((value & (0x100 << 18)) != 0) << 1) + + (((value & (0x100 << 19)) != 0) << 2); + // + (((value & (0x100 << 21))!= 0) << 3); + + this->consumeBytes(sizeof(int)); + + // fail cases: + if (!m_firstRead && m_activeTwoMarkII != m_initialActiveTwoMarkII) + { + __BioSemiBridgeLogConsole__("Device type changed during acquisition! Stream may have lost synchronization.\n"); + m_lastError = BioSemiError_DeviceTypeChanged; + return false; + } + if (!m_firstRead && m_speedMode != m_initialSpeedmode) + { + __BioSemiBridgeLogConsole__("Speedmode changed during acquisition (%u > %u). Stream may have lost synchronization.\n", m_initialSpeedmode, m_speedMode); + m_lastError = BioSemiError_SpeedmodeChanged; + return false; + } + if (m_speedMode >= BIOSEMI_ACTIVETWO_SPEEDMODECOUNT) + { + __BioSemiBridgeLogConsole__("Invalid speedmode [%u].\n", m_speedMode); + m_lastError = BioSemiError_InvalidSpeedmode; + return false; + } + + return true; +} + +uint32_t CBridgeBioSemiActiveTwo::getSamplingFrequency() const { return BioSemi::activeTwoSpeedModeFrequency[(m_activeTwoMarkII ? 1 : 0)][m_speedMode]; } + +//___________________________________________________________________// +// // + +bool CBridgeBioSemiActiveTwo::discard() +{ + const uint32_t count = this->getAvailableSampleCount(); + for (uint32_t i = 0; i < count; ++i) + { + if (!this->consumeOneSamplePerChannel(nullptr, 0)) + { + __BioSemiBridgeLogConsole__("the sample %u/%u [%u] cannot be discarded ! stopping discard.\n", i, count, m_consumptionByteIdx); + return false; + } + } + return true; +} + +uint32_t CBridgeBioSemiActiveTwo::getAvailableByteCount() const +{ + if (m_lastRingBufferByteIdx > m_consumptionByteIdx) { return m_lastRingBufferByteIdx - m_consumptionByteIdx; } + return m_lastRingBufferByteIdx + (BIOSEMI_ACTIVETWO_RINGBUFFERBYTES - m_consumptionByteIdx); +} + +uint32_t CBridgeBioSemiActiveTwo::getAvailableSampleCount() +{ + if (!m_bridgeSyncedWithDevice) return 0; + // this will be rounded + return (this->getAvailableByteCount() / (sizeof(int) * getSampleCount())); +} + +void CBridgeBioSemiActiveTwo::consumeBytes(const uint32_t count) +{ + /*fstream fs("C:/biosemi-consume.txt",fstream::app); + fs <getAvailableByteCount() < uiBufferValueCount * sizeof(int)) + { + __BioSemiBridgeLogConsole__("Not enough data to complete user buffer. Waiting for next read & consume run.\n"); + m_lastError = BioSemiError_NotEnoughDataInBuffer; + return false; + } + + /* if(*(reinterpret_cast(&m_buffers[m_consumptionByteIdx])) != BIOSEMI_ACTIVETWO_SYNCBYTES) + { + __BioSemiBridgeLogConsole__("Lost sync at consume time ! byte index is [%i]\n",m_consumptionByteIdx); + m_lastError = BioSemiError_SyncLost; + return false; + } + */ + /* + the LongPerSample value gives the number of integers that the device sends per sample round. + For example with the Mark II and a speedmode = 4, we have 282 Integers per sample. + Say we have 8 channels connected, we end up with 282 integers with SYNC forward padding: + - 273 SYNC + - 1 Integer for the Status + - 8 Integers for the 8 channels + */ + //this->consumeBytes(sizeof(int) * (getSampleCount() - m_nChannel - 1)); + + // We consume the integer from STATUS channel. + const int value = *(reinterpret_cast(&m_buffers[m_consumptionByteIdx])); + if (!this->updateStatusFromValue(value)) + { + __BioSemiBridgeLogConsole__("something bad in latest status value !\n"); + return false; + } + + // EEG channels fill the user buffer. + if (pSampleBuffer != nullptr) + { + /* + The receiver converts every 24-bit word from the AD-box into a 32-bit Signed Integer, + by adding an extra zero Least Significant Byte to the ADC data. + The 24-bit ADC output has an LSB value of 1/32th uV. + The 32-bit Integer received for the USB interface has an LSB value of 1/32*1/256 = 1/8192th uV + */ + const float factor = 1.f / 8192; + + uint32_t sampleLongConsumed = 0; + uint32_t sampleInBuffer = 0; + const uint32_t maxEEGChannel = isUseEXChannels() ? uiBufferValueCount - getEXChannelCount() : uiBufferValueCount; + while (sampleInBuffer < maxEEGChannel) + { + const int iValue = *(reinterpret_cast(&m_buffers[m_consumptionByteIdx])); + + // We don't add more samples that the number that should be displayed, + // to avoid displaying an electrode channel instaed of an EX channel + if (sampleInBuffer < m_nChannel) { pSampleBuffer[sampleInBuffer] = iValue * factor; } + else + { + // If the number of requested channel is superior to the number of available channels, pad with 0 + pSampleBuffer[sampleInBuffer] = 0; + } + + sampleInBuffer++; + sampleLongConsumed++; + this->consumeBytes(sizeof(int)); + } + if (m_useEXChannels) + { + // Consuming all sync samples until EX channels + // ELECTRODE CHANNEL # - CHANNEL# + this->consumeBytes(sizeof(int) * (getElectrodeChannelCount() - maxEEGChannel)); + while (sampleLongConsumed < maxEEGChannel + getEXChannelCount()) + { + const int iValue = *(reinterpret_cast(&m_buffers[m_consumptionByteIdx])); + if (sampleInBuffer < uiBufferValueCount) + { + pSampleBuffer[sampleInBuffer] = iValue * factor; + sampleInBuffer++; + } + sampleLongConsumed++; + this->consumeBytes(sizeof(int)); + } + // Consuming all remaining samples (sensor channels) + // SAMPLE# - ELECTRODE CHANNEL# - EX CHANNEL# - SYNC + this->consumeBytes(sizeof(int) * (getSampleCount() - (getElectrodeChannelCount() + getEXChannelCount() + 1))); + } + else + { + // Consuming all sync samples plus EX and sensor channels + // SAMPLE# - CHANNEL# - SYNC + this->consumeBytes(sizeof(int) * (getSampleCount() - maxEEGChannel - 1)); + } + } + //if pSample == nullptr + else + { + // Consuming all sync samples plus EX and sensor channels + // SAMPLE# - CHANNEL# - SYNC + this->consumeBytes(sizeof(int) * (getSampleCount() - 1)); + } + /*if(*(reinterpret_cast(&m_buffers[m_consumptionByteIdx])) != BIOSEMI_ACTIVETWO_SYNCBYTES) + { + __BioSemiBridgeLogConsole__("Lost sync at consume time ! byte index is [%i]\n",m_consumptionByteIdx); + m_lastError = BioSemiError_SyncLost; + return false; + }*/ + //this->consumeBytes(sizeof(int) * m_nChannel); + + //__BioSemiBridgeLogConsole__("consumed "< +#include + +#define BIOSEMI_ACTIVETWO_MAXCHANNELCOUNT 256 +#define BIOSEMI_ACTIVETWO_EXCHANNELCOUNT 8 + +namespace OpenViBE { +enum EBioSemiError +{ + BioSemiError_NoError, + + BioSemiError_OSOpenFailed, + BioSemiError_OSCloseFailed, + + BioSemiError_EnableUSBHandshakeFailed, + BioSemiError_DisableUSBHandshakeFailed, + + BioSemiError_ReadPointerFailed, + + BioSemiError_DeviceTypeChanged, + BioSemiError_SpeedmodeChanged, + BioSemiError_InvalidSpeedmode, + + BioSemiError_NoData, + BioSemiError_NotEnoughDataInBuffer, + BioSemiError_NoSync, + BioSemiError_SyncLost, + BioSemiError_BufferOverflow +}; + + +class CBridgeBioSemiActiveTwo final +{ +public: + + CBridgeBioSemiActiveTwo(); + virtual ~CBridgeBioSemiActiveTwo(); + + bool isDeviceConnected(); + bool open(); + bool start(); + int read(); + bool discard(); + uint32_t getAvailableSampleCount(); + uint32_t getElectrodeChannelCount() const; + uint32_t getEXChannelCount() const; + uint32_t getSampleCount() const; + uint32_t getSpeedMode() const { return m_speedMode; } + size_t getChannelCount() const { return m_nChannel; } + bool consumeOneSamplePerChannel(float* pSampleBuffer, uint32_t uiBufferValueCount); + bool stop(); + bool close(); + + bool isSynced() const { return m_bridgeSyncedWithDevice; } + + bool getTrigger(const uint32_t index) const { return (index > m_triggers.size() ? false : m_triggers[index]); } + bool isCMSInRange() const { return m_cmsInRange; } + bool isBatteryLow() const { return m_batteryLow; } + bool isDeviceMarkII() const { return m_activeTwoMarkII; } + uint32_t getSamplingFrequency() const; + + uint32_t getLastError() const { return m_lastError; } + + bool isUseEXChannels() const { return m_useEXChannels; } + void setUseEXChannels(const bool useEXChannels) { m_useEXChannels = useEXChannels; } + +protected: + bool updateStatusFromValue(int value); + uint32_t getAvailableByteCount() const; + void consumeBytes(uint32_t count); + + // Handle to the device + void* m_hDevice = nullptr; + // Ring buffer + std::vector m_buffers; + // 64bits buffer for USB_WRITE operations + std::vector m_controlBuffers; + + /* deduced from the SYNC channel on first read */ + bool m_firstRead = false; + bool m_bridgeSyncedWithDevice = false; + uint32_t m_nChannel = 0; + uint32_t m_nInitialChannel = 0; + + /* From Status channel */ + std::vector m_triggers; + bool m_epochStarted = false; + bool m_cmsInRange = false; + bool m_batteryLow = false; + bool m_activeTwoMarkII = false; + bool m_initialActiveTwoMarkII = false; + uint32_t m_speedMode = 0; + uint32_t m_initialSpeedmode = 0; + + // ring buffer indices +#if TARGET_ARCHITECTURE_x64 + long long m_lastRingBufferByteIdx = 0; //Buffer filled up to this point in last read() +#else + uint32_t m_lastRingBufferByteIdx = 0; //Buffer filled up to this point in last read()] +#endif + uint32_t m_consumptionByteIdx = 0; //Next consume() should start here, it should ALWAYS be a SYNC byte. + + // just for stats + uint32_t m_nTotalByteRead = 0; + uint32_t m_lastError = 0; + bool m_useEXChannels = false; +}; +} // namespace OpenViBE + + +#endif // TARGET_HAS_ThirdPartyBioSemiAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.cpp new file mode 100644 index 0000000..51e1e79 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.cpp @@ -0,0 +1,147 @@ +/* + * ovasCConfigurationBioSemiActiveTwo.cpp + * + * Copyright (c) 2012, Mensia Technologies SA. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +#ifdef TARGET_HAS_ThirdPartyBioSemiAPI + +#include "ovasCConfigurationBioSemiActiveTwo.h" +#include "ovasIHeader.h" +#include "mCBridgeBioSemiActiveTwo.h" + +#include + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +static void gtk_combo_box_set_active_text(GtkComboBox* pComboBox, const gchar* sActiveText) +{ + GtkTreeModel* treeModel = gtk_combo_box_get_model(pComboBox); + GtkTreeIter it; + int index = 0; + gchar* entryName = nullptr; + if (gtk_tree_model_get_iter_first(treeModel, &it)) + { + do + { + gtk_tree_model_get(treeModel, &it, 0, &entryName, -1); + if (std::string(entryName) == std::string(sActiveText)) + { + gtk_combo_box_set_active(pComboBox, index); + return; + } + index++; + } while (gtk_tree_model_iter_next(treeModel, &it)); + } +} + +CConfigurationBioSemiActiveTwo::CConfigurationBioSemiActiveTwo(const char* gtkBuilderFilename, bool& useExChannels) + : CConfigurationBuilder(gtkBuilderFilename), m_useEXChannels(useExChannels) {} + +bool CConfigurationBioSemiActiveTwo::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + // deduced from connection to device, cannot be edited. + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_speed_mode")), false); + + CBridgeBioSemiActiveTwo bridge; + bool status = false; + if (bridge.open() && bridge.start()) + { + // to let the device send a first packet from which the bridge can deduce the SF and channel count + System::Time::sleep(500); + if (bridge.read() > 0) + { + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(m_builder, "image_status")),GTK_STOCK_YES, GTK_ICON_SIZE_BUTTON); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_number_of_channels")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_apply")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_change_channel_names")), true); + + // If this option is selected then 8 channels of the header are dedicated to the EX channels and they should be removed of the displayed channel count + if (m_useEXChannels) + { + gtk_adjustment_set_value( + GTK_ADJUSTMENT(gtk_builder_get_object(m_builder, "adjustment_channel_count")), + gtk_adjustment_get_value(GTK_ADJUSTMENT(gtk_builder_get_object(m_builder, "adjustment_channel_count"))) - 8); + } + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "checkbutton_ex_channel")), true); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_ex_channel")), m_useEXChannels); + + //Set maximum in function of the speedmode used + gtk_adjustment_set_upper(GTK_ADJUSTMENT(gtk_builder_get_object(m_builder, "adjustment_channel_count")), bridge.getElectrodeChannelCount()); + + std::stringstream ss; + ss << bridge.getSamplingFrequency(); + gtk_combo_box_set_active_text(GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")), ss.str().c_str()); + + ss.str(""); + ss << bridge.getSpeedMode(); + gtk_combo_box_set_active_text(GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_speed_mode")), ss.str().c_str()); + + gtk_label_set_markup( + GTK_LABEL(gtk_builder_get_object(m_builder, "label_device_mark")), + (bridge.isDeviceMarkII() ? "- ActiveTwo Mark II -" : "- ActiveTwo Mark I -")); + gtk_label_set_markup( + GTK_LABEL(gtk_builder_get_object(m_builder, "label_device_battery")), + (bridge.isBatteryLow() ? "LOW BATTERY -" : "BATTERY OK")); + + // discard any data. + bridge.discard(); + + status = true; + } + bridge.stop(); + bridge.close(); + } + + if (!status) + { + gtk_combo_box_set_active_text(GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")), ""); + gtk_combo_box_set_active_text(GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_speed_mode")), ""); + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(m_builder, "image_status")),GTK_STOCK_NO, GTK_ICON_SIZE_BUTTON); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_number_of_channels")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_apply")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_change_channel_names")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "checkbutton_ex_channel")), false); + } + + + return true; +} + +bool CConfigurationBioSemiActiveTwo::postConfigure() +{ + if (m_applyConfig) + { + m_useEXChannels = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_ex_channel"))) ? true : false; + } + + if (!CConfigurationBuilder::postConfigure()) { return false; } + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.h new file mode 100644 index 0000000..fb9cc80 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.h @@ -0,0 +1,47 @@ +/* + * ovasCConfigurationBioSemiActiveTwo.h + * + * Copyright (c) 2012, Mensia Technologies SA. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyBioSemiAPI + +#include "../ovasCConfigurationBuilder.h" +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +class CConfigurationBioSemiActiveTwo final : public CConfigurationBuilder +{ +public: + + CConfigurationBioSemiActiveTwo(const char* gtkBuilderFilename, bool& useExChannels); + + bool preConfigure() override; + bool postConfigure() override; + +protected: + bool& m_useEXChannels; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + + +#endif // TARGET_HAS_ThirdPartyBioSemiAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.cpp new file mode 100644 index 0000000..ff94949 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.cpp @@ -0,0 +1,550 @@ +/* + * ovasCDriverBioSemiActiveTwo.cpp + * + * Copyright (c) 2012, Mensia Technologies SA. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +#ifdef TARGET_HAS_ThirdPartyBioSemiAPI + +#include "ovasCDriverBioSemiActiveTwo.h" +#include "ovasCConfigurationBioSemiActiveTwo.h" + +#include +#include +#include +#include + +#ifdef WIN32 +#include +#else +// linux, mac +#include +#endif // WIN32 + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverBioSemiActiveTwo::CDriverBioSemiActiveTwo(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_BioSemiActiveTwo", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(2048); + + // The amplifier can send up to 256+8 channels + // as a request from BioSemi, we will make available the maximum channel count + // User is able to select from 1 to MAX channels. If no data is present on the + // corresponding channels, zeros will be sent. + // The number of channels present in the data flow will still be displayed in + // the driver configuration window. Previously selected value will be saved + // with other settings. + m_header.setChannelCount(BIOSEMI_ACTIVETWO_MAXCHANNELCOUNT + BIOSEMI_ACTIVETWO_EXCHANNELCOUNT); + m_useEXChannel = true; + + m_triggers.resize(16, false); + + m_lastWarningTime = 0; + m_startTime = 0; + m_bCMCurrentlyInRange = true; + m_bBatteryCurrentlyOk = true; + + m_settings.add("Header", &m_header); + m_settings.add("UseEXChannel", &m_useEXChannel); + m_settings.load(); + m_bridge.setUseEXChannels(m_useEXChannel); +} + +void CDriverBioSemiActiveTwo::setupInformationWindow() +{ + if (!m_infoWindow) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Information window not allocated\n"; + return; + } + + std::lock_guard lock(m_infoWindow->m_mutex); + + m_infoWindow->m_builder = gtk_builder_new(); + if (!gtk_builder_add_from_file(m_infoWindow->m_builder, Directories::getDataDir() + "/applications/acquisition-server/interface-BioSemi-ActiveTwo.ui", nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "File not found: " << Directories::getDataDir() << "/applications/acquisition-server/interface-BioSemi-ActiveTwo.ui\n"; + return; + } + + gtk_label_set_markup(GTK_LABEL(gtk_builder_get_object(m_infoWindow->m_builder, "label-device-type")), (m_bridge.isDeviceMarkII() ? "- ActiveTwo Mark II -" : "- ActiveTwo Mark I -")); + m_infoWindow->m_isCMSInRange = m_bridge.isCMSInRange(); + m_infoWindow->m_isBatteryLow = m_bridge.isBatteryLow(); + m_infoWindow->m_isChanged = true; + gtk_widget_show_all(GTK_WIDGET(gtk_builder_get_object(m_infoWindow->m_builder, "device-information"))); +} + +//___________________________________________________________________// +// // + +gint setup_information_window_callback(void* data) +{ + CDriverBioSemiActiveTwo* pTmp = static_cast(data); + + pTmp->setupInformationWindow(); + + return FALSE; // Don't run again +} + +gint information_window_callback(void* infoWindow) +{ + if (!infoWindow) + { + // Not initialized yet? + return TRUE; + } + SInformationWindow* window = reinterpret_cast(infoWindow); + std::lock_guard lock(reinterpret_cast(infoWindow)->m_mutex); + // If nothing changed, directly return from the callback + if (!window->m_isChanged) { return TRUE; } + if (window->m_isAcquisitionEnded) + { + // If the acquisition is ended, delete the window + gtk_widget_destroy(GTK_WIDGET(gtk_builder_get_object(window->m_builder, "device-information"))); + g_object_unref(window->m_builder); + + // If we get here, we know that the other thread has passed uninitialize() and will no longer access Information Window. + delete window; + // The loop should now be stopped + return FALSE; + } + if (window->m_isBatteryLow) + { + gtk_label_set_markup(GTK_LABEL(gtk_builder_get_object(window->m_builder, "label-battery-level")), "- Device battery is low ! -"); + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(window->m_builder, "image-battery-level")), GTK_STOCK_NO, GTK_ICON_SIZE_BUTTON); + } + else + { + gtk_label_set_markup(GTK_LABEL(gtk_builder_get_object(window->m_builder, "label-battery-level")), "- Device battery is ok -"); + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(window->m_builder, "image-battery-level")), GTK_STOCK_YES, GTK_ICON_SIZE_BUTTON); + } + + if (window->m_isCMSInRange) + { + gtk_label_set_markup(GTK_LABEL(gtk_builder_get_object(window->m_builder, "label-CMS-status")), "- CMS/DRL is in range -"); + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(window->m_builder, "image-CMS-status")), GTK_STOCK_YES, GTK_ICON_SIZE_BUTTON); + } + else + { + gtk_label_set_markup(GTK_LABEL(gtk_builder_get_object(window->m_builder, "label-CMS-status")), "- CMS/DRL is not in range -"); + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(window->m_builder, "image-CMS-status")), GTK_STOCK_NO, GTK_ICON_SIZE_BUTTON); + } + gtk_label_set_markup(GTK_LABEL(gtk_builder_get_object(window->m_builder, "label-error-message")), (window->m_sErrorMessage).c_str()); + + window->m_isChanged = false; + return TRUE; +} + +bool CDriverBioSemiActiveTwo::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_acquisitionStopped = false; + + if (m_driverCtx.isConnected()) { return false; } + + m_callback = &callback; + + if (!m_bridge.open()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Could not open the device.\n"; + return false; + } + + if (!m_bridge.start()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Could not start the device.\n"; + return false; + } + + // wait to be sure we get the first packet from which we deduce the actual channel count and other initial configuration. + System::Time::sleep(500); + + const int byteRead = m_bridge.read(); + if (byteRead < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "An error occured while reading first data packet from device !\n"; + m_bridge.close(); + return false; + } + + if (!m_bridge.discard()) // we discard the samples. + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "An error occured while dropping unused samples at initialization time.\n"; + m_bridge.close(); + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Bridge initialized with: [SF:" << m_bridge.getSamplingFrequency() + << "] [CH:" << m_bridge.getChannelCount() + << "] [MKII:" << m_bridge.isDeviceMarkII() + << "] [CMInRange:" << m_bridge.isCMSInRange() + << "] [LowBat:" << m_bridge.isBatteryLow() << "]\n"; + + if (m_bridge.isBatteryLow()) { m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Device battery is low !\n"; } + + // the sample buffer is resized to get samples from ALL channels even if the user selected + // less channels. We will adjust the content when calling setSamples(...) + // in case the user required more channels than the number available in the stream, we will + // add 0-padding. + const size_t nChannelInStream = m_bridge.getChannelCount(); + const size_t nChannelRequested = m_header.getChannelCount(); + m_samples.clear(); + m_samples.resize(nChannelRequested, 0); + if (nChannelRequested > nChannelInStream) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << + "The required channel count cannot be reached in current device configuration (data stream contains " << m_bridge.getChannelCount() << + " channels). Please check the device speed mode and setup capabilities. Channels with no data will be filled with zeros.\n"; + } + + m_nSample = 0; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Driver initialized...\n"; + + //Check speed mode: speed modes 1, 2 and 3 should not be used for acquisition + if (m_bridge.getSpeedMode() < 4) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Speed modes 1 to 3 are designed to realize daisy chained montages, they should not be used for acquisition."; + return false; + } + + // Rename EX channels after settings were saved + if (m_bridge.isUseEXChannels()) + { + int j = 1; + for (size_t i = m_header.getChannelCount() - BIOSEMI_ACTIVETWO_EXCHANNELCOUNT; i < m_header.getChannelCount(); ++i, ++j) + { + m_header.setChannelName(i, ("EX " + std::to_string(j)).c_str()); + m_header.setChannelUnits(i, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Channel name: " << m_header.getChannelName(i) << "\n"; + } + } + + m_infoWindow = new SInformationWindow(); + + // Initialize information window + // n.b. do all gtk stuff from callbacks to avoid threading issues. + gdk_threads_add_idle(setup_information_window_callback, this); + + //Launch idle loop: update the information window in a separate glib thread + gdk_threads_add_idle(information_window_callback, m_infoWindow); + + return true; +} + +bool CDriverBioSemiActiveTwo::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + m_startTime = System::Time::getTime(); + m_lastWarningTime = 0; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Acquisition started...\n"; + return true; +} + +bool CDriverBioSemiActiveTwo::loop() +{ + if (m_acquisitionStopped || !m_driverCtx.isConnected()) { return true; } + + if (m_driverCtx.isStarted()) + { + //size_t nChannelInStream = m_bridge.getChannelCount(); + const size_t nChannelRequested = m_header.getChannelCount(); + + //uint32_t max = (nChannelRequested > nChannelInStream) ? nChannelRequested : nChannelInStream; + const uint32_t max = nChannelRequested; + const int byteRead = m_bridge.read(); + if (byteRead > 0) + { + for (uint32_t i = 0; i < m_bridge.getAvailableSampleCount(); ++i) + { + // we consume one sample per channel, values are given in uV + if (!m_bridge.consumeOneSamplePerChannel(&m_samples[0], max)) + { + std::lock_guard lock(m_infoWindow->m_mutex); + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Something bad happened while consuming samples from device.\n"; + m_infoWindow->m_isChanged = true; + m_infoWindow->m_sErrorMessage = "Something bad happened while consuming samples from device.\n"; + if (m_bridge.getLastError() == BioSemiError_SyncLost) + { + m_infoWindow->m_sErrorMessage += "\t Synchronization lost during acquisition. Fiber optic may be loose or damaged."; + m_driverCtx.getLogManager() << "\t >Synchronization lost during acquisition. Fiber optic may be loose or damaged.\n"; + } + if (m_bridge.getLastError() == BioSemiError_BufferOverflow) + { + m_infoWindow->m_sErrorMessage += "\t Buffer overflow. Please check that you have enough CPU and memory available to run the acquisition server at full speed before retrying."; + m_driverCtx.getLogManager() << "\t > Buffer overflow. Please check that you have enough CPU and memory available to run the acquisition server at full speed before retrying.\n"; + } + m_acquisitionStopped = true; + return true; + } + + // this call uses the header's channel count, so it will naturally take the first samples (not necessarily all channels). + m_callback->setSamples(&m_samples[0], 1); + + // triggers: + // we simply send OVTK_StimulationId_Label_X where X is the trigger index between 1 and 16 + // We don't handle rising and falling edges. + for (uint32_t j = 0; j < m_triggers.size(); ++j) + { + if (m_bridge.getTrigger(j) != m_triggers[j]) + { + m_triggers[j] = m_bridge.getTrigger(j); + const uint64_t date = (1LL << 32) / m_bridge.getSamplingFrequency(); // date is relative to the buffer start. I only have one sample in the buffer so it's fairly simple + m_stimSet.appendStimulation(OVTK_StimulationId_Label(j+1), date, 0); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Trigger " << j + 1 << "/16 has switched to " << m_triggers[j] << "\n"; + } + } + + // "CMS/DRL in range" warning, once every 2 seconds max + /* + From: Coen (BioSemi): + + The current flow via the DRL is constantly monitored by the safety circuitry inside the AD-box. The current flow is limited to 50 uA (IEC 601 safety limit). + If the current runs into the limit, the CMS/DRL circuit cannot keep the Common Mode value within its normal working range, and the blue LED turns off. + + The safety circuitry reacts on this error situation by shutting the power supply to ALL active electrodes off. Consequently, no meaningful signals can be measured so long as the blue LED is off. + The circuit operation described above implies that any electrode can be the cause of a CM out of range error. + Examples of errors are broken wires, bad connector contacts (pollution of connector with gel), defect IC inside the electrode, + bare electrode wire contacting the subject (damaged cable isolation) etc.. For example, if one of the active electrode wires is broken, + the electrode input circuit is not anymore biased correctly, and the input resistance may fall below its specified value of 10^12 Ohm. + The resultant extra input current is detected by the CMS/DRL circuit, and the blue LED goes off. + Save operation of the system is ensured because the power supply to the active electrodes is only restored if ALL electrodes connected to the subject work correctly. + In other words, both cap en EX electrodes can in principle cause CM out of range errors. + */ + + bool warningDisplayed = false; + if (!m_bridge.isCMSInRange()) + { + // we print a warning message once every 2secs maximum + if (System::Time::getTime() > m_lastWarningTime + 2000) + { + warningDisplayed = true; + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(" << ((System::Time::getTime() - m_startTime) / 1000) << "') CMS/DRL is not in range. For safety purpose, any active electrode connected has been shut down and signals should not be used.\n"; + m_driverCtx.getLogManager() << "\t The corresponding sample range has been tagged with OVTK_StimulationId_SegmentStart and OVTK_StimulationId_SegmentStop.\n"; + m_driverCtx.getLogManager() << "\t Possible causes include broken wires, damaged cable isolation, bad connector contacts, defect IC inside the electrode.\n"; + { + std::lock_guard lock(m_infoWindow->m_mutex); + m_infoWindow->m_isCMSInRange = false; + m_infoWindow->m_isChanged = true; + } + } + + // the possibly incorrect sample range is tagged using OVTK_StimulationId_SegmentStart and OVTK_StimulationId_SegmentStop + // CM is now not in range + if (m_bCMCurrentlyInRange) + { + const uint64_t date = (1LL << 32) / m_bridge.getSamplingFrequency(); + m_stimSet.appendStimulation(OVTK_StimulationId_SegmentStart, date, 0); + } + m_bCMCurrentlyInRange = false; + m_bCMSBackInRange = false; + } + else + { + // CMS/DRL is now back in range + if (!m_bCMCurrentlyInRange) + { + m_lastCmsBackInRange = System::Time::getTime(); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "isCMSInRange \n"; + const uint64_t date = (1LL << 32) / m_bridge.getSamplingFrequency(); + m_stimSet.appendStimulation(OVTK_StimulationId_SegmentStop, date, 0); + m_bCMCurrentlyInRange = true; + } + // CMS is considered "back in range" if it stayed in range for more than 500ms + // -> avoids changing the gtk markup too often (which would not be readable for the user nor efficient) + else if (!m_bCMSBackInRange && (System::Time::getTime() > m_lastCmsBackInRange + 100)) + { + m_bCMSBackInRange = true; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Back in range \n"; + { + std::lock_guard lock(m_infoWindow->m_mutex); + m_infoWindow->m_isCMSInRange = true; + m_infoWindow->m_isChanged = true; + } + } + } + + if (m_bridge.isBatteryLow()) + { + // we print a warning message once every 2secs maximum + if (System::Time::getTime() > m_lastWarningTime + 2000) + { + warningDisplayed = true; + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(" << ((System::Time::getTime() - m_startTime) / 1000) << "') Device battery is low !\n"; + { + std::lock_guard lock(m_infoWindow->m_mutex); + m_infoWindow->m_isBatteryLow = true; + m_infoWindow->m_isChanged = true; + } + } + m_bBatteryCurrentlyOk = false; + m_bBatteryBackOk = false; + } + else + { + if (!m_bBatteryCurrentlyOk) + { + m_lastBatteryLow = System::Time::getTime(); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(" << ((System::Time::getTime() - m_startTime) / 1000) << "') Device battery seems ok.\n"; + m_bBatteryCurrentlyOk = true; + } + // CMS is considered "back in range" if it stayed in range for more than 500ms + // -> avoids changing the gtk markup too often (which would not be readable for the user nor efficient) + else if (!m_bBatteryBackOk && (System::Time::getTime() > m_lastBatteryLow + 100)) + { + m_bBatteryBackOk = true; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Back in range \n"; + { + std::lock_guard lock(m_infoWindow->m_mutex); + m_infoWindow->m_isBatteryLow = false; + m_infoWindow->m_isChanged = true; + } + } + } + + if (warningDisplayed) { m_lastWarningTime = System::Time::getTime(); } + + m_callback->setStimulationSet(m_stimSet); + m_stimSet.clear(); + } + } + if (byteRead < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "An error occured while reading data from device !\n"; + m_acquisitionStopped = true; + { + std::lock_guard lock(m_infoWindow->m_mutex); + m_infoWindow->m_sErrorMessage = "An error occured while reading data from device !"; + m_infoWindow->m_isChanged = true; + } + return true; + } + + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + else + { + // acquisition is not started, but device is. + int byteRead = m_bridge.read(); + while (byteRead > 0) + { + if (!m_bridge.discard()) // we discard the samples. + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "An error occured while dropping samples.\n"; + m_acquisitionStopped = true; + { + std::lock_guard lock(m_infoWindow->m_mutex); + m_infoWindow->m_sErrorMessage = "An error occured while dropping samples."; + m_infoWindow->m_isChanged = true; + } + return true; + } + byteRead = m_bridge.read(); + } + if (byteRead < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "An error occured while reading data from device (drop)!\n"; + m_acquisitionStopped = true; + { + std::lock_guard lock(m_infoWindow->m_mutex); + m_infoWindow->m_sErrorMessage = "An error occured while reading data from device (drop)!"; + m_infoWindow->m_isChanged = true; + } + return true; + } + } + + return true; +} + +bool CDriverBioSemiActiveTwo::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Acquisition stopped...\n"; + + return true; +} + +bool CDriverBioSemiActiveTwo::uninitialize() +{ + { + std::lock_guard lock(m_infoWindow->m_mutex); + + m_infoWindow->m_isChanged = true; + m_infoWindow->m_isAcquisitionEnded = true; + m_infoWindow = nullptr; // The callback will free the memory + } + + // Rename EX channels as "" so that the names are not saved as settings + if (m_bridge.isUseEXChannels()) + { + for (size_t i = m_header.getChannelCount() - m_bridge.getEXChannelCount(); i < m_header.getChannelCount(); ++i) + { + m_header.setChannelName(i, ""); + m_header.setChannelUnits(i, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); + } + } + + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + if (!m_bridge.close()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Could not close the device.\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Driver uninitialized...\n"; + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverBioSemiActiveTwo::configure() +{ + CConfigurationBioSemiActiveTwo config(Directories::getDataDir() + "/applications/acquisition-server/interface-BioSemi-ActiveTwo.ui", m_useEXChannel); + + if (config.configure(m_header)) + { + m_bridge.setUseEXChannels(m_useEXChannel); + if (m_bridge.isUseEXChannels()) { m_header.setChannelCount(m_header.getChannelCount() + BIOSEMI_ACTIVETWO_EXCHANNELCOUNT); } + + m_settings.save(); + + return true; + } + return false; +} +/* +size_t CDriverBioSemiActiveTwo::getChannelCount() +{ + if(m_useEXChannel) + { + return m_header.getChannelCount() + m_bridge.getEXChannelCount(); + } + else { return m_header.getChannelCount(); } +} +*/ + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.h new file mode 100644 index 0000000..300f62f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.h @@ -0,0 +1,129 @@ +/* + * ovasCDriverBioSemiActiveTwo.h + * + * Copyright (c) 2012, Mensia Technologies SA. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyBioSemiAPI + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include "mCBridgeBioSemiActiveTwo.h" + +#include "gtk/gtk.h" + +#include +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** +* SInformationWindow: encapsulate the GtkBuilder used to build the window +* and the information that we want to display in it. +* The use of a structure allows to use a GLib idle loop. +*/ +typedef struct SInformationWindow +{ + SInformationWindow() {} + // Builder of the window + GtkBuilder* m_builder = nullptr; + // When set to true, the idle loop is stopped and the window is destroyed + bool m_isAcquisitionEnded = false; + // Set to true when at least one of the acquisition window member changed + bool m_isChanged = false; + bool m_isCMSInRange = false; + bool m_isBatteryLow = false; + std::string m_sErrorMessage = ""; + + // The window is changed in a idle loop in function of m_isCMSInRange, + // m_isBatteryLow and m_sErrorMessage that change in the driver loop + // A mutex is necessary to secure the access to the data + std::mutex m_mutex; +} SInformationWindow; + +/** + * \class CDriverBioSemiActiveTwo + * \author Mensia Technologies + */ +class CDriverBioSemiActiveTwo final : public IDriver +{ +public: + + explicit CDriverBioSemiActiveTwo(IDriverContext& ctx); + void release() { delete this; } + const char* getName() override { return "BioSemi Active Two (MkI and MkII)"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + //size_t getChannelCount(); + + // Called from gtk callback + void setupInformationWindow(); + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + std::vector m_impedances; + std::vector m_samples; + + CStimulationSet m_stimSet; + + CBridgeBioSemiActiveTwo m_bridge; + + std::vector m_triggers; + uint64_t m_nSample = 0; + + bool m_bCMCurrentlyInRange = false; + bool m_bBatteryCurrentlyOk = false; + uint32_t m_lastWarningTime = 0; + // Used to determine for how long CMS was in range + uint32_t m_lastCmsBackInRange = 0; + uint32_t m_lastBatteryLow = 0; + // True if CMS is in range for more than 100ms + bool m_bCMSBackInRange = true; + bool m_bBatteryBackOk = true; + uint32_t m_startTime = 0; + bool m_useEXChannel = false; + // Set to true + bool m_acquisitionStopped = false; + + SInformationWindow* m_infoWindow = nullptr; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + + +#endif // TARGET_HAS_ThirdPartyBioSemiAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.cpp new file mode 100644 index 0000000..5bf6bd9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.cpp @@ -0,0 +1,258 @@ +/* + * ovasCConfigurationBrainProductsActiCHamp.cpp + * + * Copyright (c) 2012, Mensia Technologies SA. All rights reserved. + * -- Rights transferred to Inria, contract signed 21.11.2014 + * + */ + +#if defined TARGET_HAS_ThirdPartyActiCHampAPI + +#include "ovasCConfigurationBrainProductsActiCHamp.h" + +#include "ovasIHeader.h" + +#include +#include + +#include +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +static void DeviceChangedCB(GtkComboBox* /*comboBox*/, gpointer data) +{ + reinterpret_cast(data)->comboBoxDeviceChangedCB(); +} + +static void ModuleToggledCB(GtkToggleButton* button, gpointer data) +{ + reinterpret_cast(data)->buttonModuleToggledCB(gtk_toggle_button_get_active(button) != 0); +} + +static void AUXChannelsToggledCB(GtkToggleButton* button, gpointer data) +{ + reinterpret_cast(data)->buttonAuxChannelsToggledCB(gtk_toggle_button_get_active(button) != 0); +} + +CConfigurationBrainProductsActiCHamp::CConfigurationBrainProductsActiCHamp( + const char* gtkBuilderFilename, uint32_t& deviceID, uint32_t& mode, uint32_t& physicalSampling, uint32_t& adcDataFilter, + uint32_t& adcDataDecimation, uint32_t& activeShieldGain, uint32_t& moduleEnabled, bool& useAuxChannels, uint32_t& goodImpedanceLimit, + uint32_t& badImpedanceLimit) + : CConfigurationBuilder(gtkBuilderFilename), m_deviceID(deviceID), m_mode(mode), m_physicalSampling(physicalSampling), + m_adcDataFilter(adcDataFilter) + , m_adcDataDecimation(adcDataDecimation), m_activeShieldGain(activeShieldGain), m_moduleEnabled(moduleEnabled), m_useAuxChannels(useAuxChannels) + , m_goodImpedanceLimit(goodImpedanceLimit), m_badImpedanceLimit(badImpedanceLimit) {} + +namespace { +void open_url_brainproducts_download_actichamp_fw_cb(GtkWidget* /*widget*/, gpointer /*data*/) +{ + ShellExecute(nullptr, nullptr, "http://www.brainproducts.com/files/public/downloads/actiCHamp_rev03_FW-Update.zip", nullptr, nullptr, SW_SHOW); +} +} + +bool CConfigurationBrainProductsActiCHamp::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + m_imageErrorIcon = GTK_WIDGET(gtk_builder_get_object(m_builder, "image_error_icon")); + m_labelErrorMessage = GTK_LABEL(gtk_builder_get_object(m_builder, "label_error_message")); + m_buttonErrorDLLLink = GTK_BUTTON(gtk_builder_get_object(m_builder, "button_bp_actichamp_download_firmware")); + m_comboBoxDeviceId = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device_id")); + m_comboBoxMode = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_mode")); + m_comboBoxPhysicalSampleRate = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_physical_sample_rate")); + m_comboBoxADCDataFilter = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_adc_data_filter")); + m_comboBoxADCDataDecimation = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_adc_data_decimation")); + m_buttonActiveShieldGain = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_active_shield_gain")); + m_buttonUseAuxChannels = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_aux_channels")); + m_buttonGoodImpedanceLimit = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_good_imp")); + m_buttonBadImpedanceLimit = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_bad_imp")); + + m_module1 = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "togglebutton_module_1")); + m_module2 = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "togglebutton_module_2")); + m_module3 = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "togglebutton_module_3")); + m_module4 = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "togglebutton_module_4")); + m_module5 = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "togglebutton_module_5")); + + g_signal_connect(G_OBJECT(m_module1), "toggled", G_CALLBACK(ModuleToggledCB), this); + g_signal_connect(G_OBJECT(m_module2), "toggled", G_CALLBACK(ModuleToggledCB), this); + g_signal_connect(G_OBJECT(m_module3), "toggled", G_CALLBACK(ModuleToggledCB), this); + g_signal_connect(G_OBJECT(m_module4), "toggled", G_CALLBACK(ModuleToggledCB), this); + g_signal_connect(G_OBJECT(m_module5), "toggled", G_CALLBACK(ModuleToggledCB), this); + + g_signal_connect(G_OBJECT(m_buttonUseAuxChannels), "toggled", G_CALLBACK(AUXChannelsToggledCB), this); + g_signal_connect(G_OBJECT(m_buttonErrorDLLLink), "clicked", G_CALLBACK(open_url_brainproducts_download_actichamp_fw_cb), nullptr); + + g_signal_connect(G_OBJECT(m_comboBoxDeviceId), "changed", G_CALLBACK(DeviceChangedCB), this); + + const uint32_t nDevice = uint32_t(champGetCount()); + bool selected = false; + + // autodetection of the connected device(s) + for (uint32_t i = 0; i < nDevice; ++i) + { + gtk_combo_box_append_text(m_comboBoxDeviceId, ("Device " + std::to_string(i)).c_str()); + { + if (m_deviceID == i) + { + gtk_combo_box_set_active(m_comboBoxDeviceId, i); + selected = true; + } + } + } + + if (nDevice == 0) { gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_nChannels), 0); } + + if (!selected && nDevice != 0) { gtk_combo_box_set_active(m_comboBoxDeviceId, 0); } + + gtk_combo_box_set_active(m_comboBoxMode, m_mode); + gtk_combo_box_set_active(m_comboBoxPhysicalSampleRate, m_physicalSampling); + gtk_combo_box_set_active(m_comboBoxADCDataFilter, m_adcDataFilter); + gtk_combo_box_set_active(m_comboBoxADCDataDecimation, (m_adcDataDecimation == CHAMP_DECIMATION_2 ? 1 : 0)); + gtk_spin_button_set_value(m_buttonActiveShieldGain, m_activeShieldGain); + gtk_spin_button_set_value(m_buttonGoodImpedanceLimit, m_goodImpedanceLimit); + gtk_spin_button_set_value(m_buttonBadImpedanceLimit, m_badImpedanceLimit); + + return true; +} + +bool CConfigurationBrainProductsActiCHamp::postConfigure() +{ + GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + + if (m_applyConfig) + { + gtk_spin_button_update(GTK_SPIN_BUTTON(m_buttonActiveShieldGain)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_buttonGoodImpedanceLimit)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_buttonBadImpedanceLimit)); + + m_deviceID = gtk_combo_box_get_active(m_comboBoxDeviceId); + m_mode = gtk_combo_box_get_active(m_comboBoxMode); + m_physicalSampling = gtk_combo_box_get_active(m_comboBoxPhysicalSampleRate); + m_adcDataFilter = gtk_combo_box_get_active((m_comboBoxADCDataFilter)); + m_adcDataDecimation = ((gtk_combo_box_get_active(m_comboBoxADCDataDecimation) == 1) ? CHAMP_DECIMATION_2 : CHAMP_DECIMATION_0 + ); // The decimation enum gives FACTOR_2 = 2 and not 1. + m_activeShieldGain = uint32_t(gtk_spin_button_get_value(m_buttonActiveShieldGain)); + m_goodImpedanceLimit = uint32_t(gtk_spin_button_get_value(m_buttonGoodImpedanceLimit)); + m_badImpedanceLimit = uint32_t(gtk_spin_button_get_value(m_buttonBadImpedanceLimit)); + m_useAuxChannels = gtk_toggle_button_get_active(m_buttonUseAuxChannels) != 0; + m_moduleEnabled = 0x01 + | (gtk_toggle_button_get_active(m_module1) ? 0x02 : 0x00) + | (gtk_toggle_button_get_active(m_module2) ? 0x04 : 0x00) + | (gtk_toggle_button_get_active(m_module3) ? 0x08 : 0x00) + | (gtk_toggle_button_get_active(m_module4) ? 0x10 : 0x00) + | (gtk_toggle_button_get_active(m_module5) ? 0x20 : 0x00); + } + + if (!CConfigurationBuilder::postConfigure()) { return false; } + return true; +} + +void CConfigurationBrainProductsActiCHamp::comboBoxDeviceChangedCB() +{ + void* handle = nullptr; + const uint32_t deviceID = gtk_combo_box_get_active(m_comboBoxDeviceId); + + // retry opening the device several times, as sometimes the champOpen fails for no reason + + int retriesCount = 0; + while (retriesCount++ < 1) + { + handle = champOpen(deviceID); + if (handle == nullptr) { System::Time::sleep(500); } + else { break; } + } + // Opens device + if (handle != nullptr) + { + // Clear error messages + gtk_widget_hide(m_imageErrorIcon); + gtk_widget_hide(GTK_WIDGET(m_labelErrorMessage)); + gtk_widget_hide(GTK_WIDGET(m_buttonErrorDLLLink)); + + // Gets properties + t_champProperty properties; + champGetProperty(handle, &properties); + + // Sets channel count + //m_header->setSamplingFrequency(uint32_t(l_oProperties.Rate)); + //m_header->setChannelCount(l_oProperties.CountEeg + properties.CountAux); + //gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_nChannels), properties.CountEeg + properties.CountAux); + + // The channel count is updated with the toggled button callbacks. + m_header->setChannelCount(0); + + // Gets modules + t_champModules modules; + champGetModules(handle, &modules); + gtk_widget_set_sensitive(GTK_WIDGET(m_module1), (modules.Present & 0x02) ? TRUE : FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(m_module2), (modules.Present & 0x04) ? TRUE : FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(m_module3), (modules.Present & 0x08) ? TRUE : FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(m_module4), (modules.Present & 0x10) ? TRUE : FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(m_module5), (modules.Present & 0x20) ? TRUE : FALSE); + + + // Since the toggle_button method fires the event we have to clean up all boutons + // and the channel count before actually activating the modules + gtk_toggle_button_set_active(m_module1, FALSE); + gtk_toggle_button_set_active(m_module2, FALSE); + gtk_toggle_button_set_active(m_module3, FALSE); + gtk_toggle_button_set_active(m_module4, FALSE); + gtk_toggle_button_set_active(m_module5, FALSE); + + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_nChannels), 0); + + gtk_toggle_button_set_active(m_module1, (m_moduleEnabled & 0x02 && modules.Present & 0x02) ? TRUE : FALSE); // calls the moduleToggledCB. + gtk_toggle_button_set_active(m_module2, (m_moduleEnabled & 0x04 && modules.Present & 0x04) ? TRUE : FALSE); // calls the moduleToggledCB. + gtk_toggle_button_set_active(m_module3, (m_moduleEnabled & 0x08 && modules.Present & 0x08) ? TRUE : FALSE); // calls the moduleToggledCB. + gtk_toggle_button_set_active(m_module4, (m_moduleEnabled & 0x10 && modules.Present & 0x10) ? TRUE : FALSE); // calls the moduleToggledCB. + gtk_toggle_button_set_active(m_module5, (m_moduleEnabled & 0x20 && modules.Present & 0x20) ? TRUE : FALSE); // calls the moduleToggledCB. + + //Aux channels + gtk_toggle_button_set_active(m_buttonUseAuxChannels, m_useAuxChannels); + + // TODO: champClose function returns an error code which is never ever checked, + // closing a device can and does fail in some circumstances, but we can not really + // do much about it. + const int error = champClose(handle); + if (error) { std::cerr << "Closing ActiCHamp device failed" << std::endl; } + } + else + { + // The device failed to open, we disable all of the controls and display an error message + gtk_widget_show(m_imageErrorIcon); + gtk_widget_show(GTK_WIDGET(m_labelErrorMessage)); + gtk_widget_show(GTK_WIDGET(m_buttonErrorDLLLink)); + + m_header->setChannelCount(0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_nChannels), 0); + + gtk_widget_set_sensitive(GTK_WIDGET(m_module1), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(m_module2), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(m_module3), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(m_module4), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(m_module5), FALSE); + } +} + +void CConfigurationBrainProductsActiCHamp::buttonModuleToggledCB(const bool state) +{ + const uint32_t nChannel = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_nChannels)); + // there is minimum 1 channel. + if (state) { gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_nChannels), nChannel + (nChannel == 1 ? 31 : 32)); } + else { gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_nChannels), nChannel - (nChannel == 1 ? 31 : 32)); } +} + +void CConfigurationBrainProductsActiCHamp::buttonAuxChannelsToggledCB(const bool state) +{ + const uint32_t nChannel = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_nChannels)); + + if (state) { gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_nChannels), nChannel + (nChannel == 1 ? 7 : 8)); } + else { gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_nChannels), nChannel - (nChannel == 1 ? 7 : 8)); } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyActiCHampAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.h new file mode 100644 index 0000000..c3c31e5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.h @@ -0,0 +1,69 @@ +/* + * ovasCConfigurationBrainProductsActiCHamp.h + * + * Copyright (c) 2012, Mensia Technologies SA. All rights reserved. + * -- Rights transferred to Inria, contract signed 21.11.2014 + * + */ + +#pragma once + +#if defined TARGET_HAS_ThirdPartyActiCHampAPI + +#include "../ovasCConfigurationBuilder.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { +class CConfigurationBrainProductsActiCHamp final : public CConfigurationBuilder +{ +public: + + CConfigurationBrainProductsActiCHamp(const char* gtkBuilderFilename, uint32_t& deviceID, uint32_t& mode, uint32_t& physicalSampling, + uint32_t& adcDataFilter, uint32_t& adcDataDecimation, uint32_t& activeShieldGain, uint32_t& moduleEnabled, + bool& useAuxChannels, uint32_t& goodImpedanceLimit, uint32_t& badImpedanceLimit); + + bool preConfigure() override; + bool postConfigure() override; + + void comboBoxDeviceChangedCB(); + void buttonModuleToggledCB(bool state); + void buttonAuxChannelsToggledCB(bool state); + +protected: + + uint32_t& m_deviceID; + uint32_t& m_mode; + uint32_t& m_physicalSampling; + uint32_t& m_adcDataFilter; + uint32_t& m_adcDataDecimation; + uint32_t& m_activeShieldGain; + uint32_t& m_moduleEnabled; + bool& m_useAuxChannels; + uint32_t& m_goodImpedanceLimit; + uint32_t& m_badImpedanceLimit; + + GtkWidget* m_imageErrorIcon = nullptr; + GtkLabel* m_labelErrorMessage = nullptr; + GtkButton* m_buttonErrorDLLLink = nullptr; + GtkComboBox* m_comboBoxDeviceId = nullptr; + GtkComboBox* m_comboBoxMode = nullptr; + GtkComboBox* m_comboBoxPhysicalSampleRate = nullptr; + GtkComboBox* m_comboBoxADCDataFilter = nullptr; + GtkComboBox* m_comboBoxADCDataDecimation = nullptr; + GtkSpinButton* m_buttonActiveShieldGain = nullptr; + GtkToggleButton* m_buttonUseAuxChannels = nullptr; + GtkSpinButton* m_buttonGoodImpedanceLimit = nullptr; + GtkSpinButton* m_buttonBadImpedanceLimit = nullptr; + + GtkToggleButton* m_module1 = nullptr; + GtkToggleButton* m_module2 = nullptr; + GtkToggleButton* m_module3 = nullptr; + GtkToggleButton* m_module4 = nullptr; + GtkToggleButton* m_module5 = nullptr; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyActiCHampAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.cpp new file mode 100644 index 0000000..ae68b5b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.cpp @@ -0,0 +1,777 @@ +/* + * ovasCDriverBrainProductsActiCHamp.cpp + * + * Copyright (c) 2012, Mensia Technologies SA. All rights reserved. + * -- Rights transferred to Inria, contract signed 21.11.2014 + * + */ + +#if defined TARGET_HAS_ThirdPartyActiCHampAPI + +#include "ovasCDriverBrainProductsActiCHamp.h" +#include "ovasCConfigurationBrainProductsActiCHamp.h" + +#include +#include + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +namespace { +typedef union +{ + t_champDataModelAux ModelAux; + t_champDataModel32 Model32; + t_champDataModel64 Model64; + t_champDataModel96 Model96; + t_champDataModel128 Model128; + t_champDataModel160 Model160; +} UBuffer; + +const uint32_t NB_MAX_BUFFER_IN_CACHE = 1000; +UBuffer Buffer[NB_MAX_BUFFER_IN_CACHE]; + +// Low pass FIR filters before downsampling +// +// Computed with python and scipy +// References : +// http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.tofile.html +// http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.firwin.html +// +// The following filters have roughly 50ms delay as described in "2.1.4 What is the +// delay of a linear-phase FIR?" at http://www.dspguru.com/book/export/html/3 : +// n = 500, Fs = 5000, delay = (n-1)/(2*Fs) = 0.04990 +// n = 1000, Fs = 10000, delay = (n-1)/(2*Fs) = 0.04995 +// n = 2500, Fs = 25000, delay = (n-1)/(2*Fs) = 0.04998 +// n = 5000, Fs = 50000, delay = (n-1)/(2*Fs) = 0.04999 +// n = 10000, Fs = 100000, delay = (n-1)/(2*Fs) = 0.049995 +// +// In order to correct this delay, filtering should be done as a two steps process with a forward filter +// followed by a backward filter. However, this leads to an n square complexity where a linear complexity is +// sufficient in forward only filtering (using 100kHz input signal, n=10000 taps !) +// +// To avoid such complexity, it is chosen to antedate acquired samples by 50ms cheating the drift correction +// process. Indeed, the acquisition server application monitors the drifting of the acquisition process and +// corrects this drift upon demand. It is up to the driver to require this correction and it can be chosen not +// to fit the 0 drift, but to fit an arbitrary fixed drift instead. +// +// The offset for this correction is stored in the m_nDriftOffsetSample variable + +/* --------------------------------------------------------------------------------------------------------------- + from scipy import signal + N=500 + signal.firwin(N, cutoff=2048./(0.5*5000.), window='hamming').tofile("c:/openvibe/f64_5k_4096.bin") + signal.firwin(N, cutoff=1024./(0.5*5000.), window='hamming').tofile("c:/openvibe/f64_5k_2048.bin") + signal.firwin(N, cutoff= 512./(0.5*5000.), window='hamming').tofile("c:/openvibe/f64_5k_1024.bin") + signal.firwin(N, cutoff= 256./(0.5*5000.), window='hamming').tofile("c:/openvibe/f64_5k_512.bin") + signal.firwin(N, cutoff= 128./(0.5*5000.), window='hamming').tofile("c:/openvibe/f64_5k_256.bin") + signal.firwin(N, cutoff= 64./(0.5*5000.), window='hamming').tofile("c:/openvibe/f64_5k_128.bin") + + N=1000 + signal.firwin(N, cutoff=2048./(0.5*10000.), window='hamming').tofile("c:/openvibe/f64_10k_4096.bin") + signal.firwin(N, cutoff=1024./(0.5*10000.), window='hamming').tofile("c:/openvibe/f64_10k_2048.bin") + signal.firwin(N, cutoff= 512./(0.5*10000.), window='hamming').tofile("c:/openvibe/f64_10k_1024.bin") + signal.firwin(N, cutoff= 256./(0.5*10000.), window='hamming').tofile("c:/openvibe/f64_10k_512.bin") + signal.firwin(N, cutoff= 128./(0.5*10000.), window='hamming').tofile("c:/openvibe/f64_10k_256.bin") + signal.firwin(N, cutoff= 64./(0.5*10000.), window='hamming').tofile("c:/openvibe/f64_10k_128.bin") + + N=2500 + signal.firwin(N, cutoff=2048./(0.5*25000.), window='hamming').tofile("c:/openvibe/f64_25k_4096.bin") + signal.firwin(N, cutoff=1024./(0.5*25000.), window='hamming').tofile("c:/openvibe/f64_25k_2048.bin") + signal.firwin(N, cutoff= 512./(0.5*25000.), window='hamming').tofile("c:/openvibe/f64_25k_1024.bin") + signal.firwin(N, cutoff= 256./(0.5*25000.), window='hamming').tofile("c:/openvibe/f64_25k_512.bin") + signal.firwin(N, cutoff= 128./(0.5*25000.), window='hamming').tofile("c:/openvibe/f64_25k_256.bin") + signal.firwin(N, cutoff= 64./(0.5*25000.), window='hamming').tofile("c:/openvibe/f64_25k_128.bin") + + N=5000 + signal.firwin(N, cutoff=2048./(0.5*50000.), window='hamming').tofile("c:/openvibe/f64_50k_4096.bin") + signal.firwin(N, cutoff=1024./(0.5*50000.), window='hamming').tofile("c:/openvibe/f64_50k_2048.bin") + signal.firwin(N, cutoff= 512./(0.5*50000.), window='hamming').tofile("c:/openvibe/f64_50k_1024.bin") + signal.firwin(N, cutoff= 256./(0.5*50000.), window='hamming').tofile("c:/openvibe/f64_50k_512.bin") + signal.firwin(N, cutoff= 128./(0.5*50000.), window='hamming').tofile("c:/openvibe/f64_50k_256.bin") + signal.firwin(N, cutoff= 64./(0.5*50000.), window='hamming').tofile("c:/openvibe/f64_50k_128.bin") + + N=10000 + signal.firwin(N, cutoff=2048./(0.5*100000.), window='hamming').tofile("c:/openvibe/f64_100k_4096.bin") + signal.firwin(N, cutoff=1024./(0.5*100000.), window='hamming').tofile("c:/openvibe/f64_100k_2048.bin") + signal.firwin(N, cutoff= 512./(0.5*100000.), window='hamming').tofile("c:/openvibe/f64_100k_1024.bin") + signal.firwin(N, cutoff= 256./(0.5*100000.), window='hamming').tofile("c:/openvibe/f64_100k_512.bin") + signal.firwin(N, cutoff= 128./(0.5*100000.), window='hamming').tofile("c:/openvibe/f64_100k_256.bin") + signal.firwin(N, cutoff= 64./(0.5*100000.), window='hamming').tofile("c:/openvibe/f64_100k_128.bin") +--------------------------------------------------------------------------------------------------------------- */ + +bool loadFilter(const char* filename, std::vector& vFilter) +{ + FILE* file = fopen(filename, "rb"); + if (!file) + { + vFilter.clear(); + vFilter.push_back(1); + return false; + } + fseek(file, 0, SEEK_END); + const size_t len = ftell(file); + fseek(file, 0, SEEK_SET); + vFilter.resize(len / sizeof(double)); + fread(&vFilter[0], len, 1, file); + fclose(file); + return true; +} +} // namespace + +CDriverBrainProductsActiCHamp::CDriverBrainProductsActiCHamp(IDriverContext& ctx) + : IDriver(ctx), m_mode(CHAMP_MODE_ACTIVE_SHIELD), m_adcDataDecimation(CHAMP_DECIMATION_2) + , m_activeShieldGain(5) // default value from pyCorder = 5/100 + , m_moduleEnabled(0xffffffff) +{ + t_champVersion version; + champGetVersion(nullptr, &version); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Got actiCHamp version (Dll:" << size_t(version.Dll) << ")\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Number of attached devices : " << size_t(champGetCount()) << "\n"; + + m_header.setSamplingFrequency(512); + m_header.setChannelCount(32); +} + +//___________________________________________________________________// +// // + +bool CDriverBrainProductsActiCHamp::initialize(const uint32_t /*nSamplePerSentBlock*/, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) { return false; } + + // Opens device + // We change the working directory to be sure to have ActiChamp.bit in it + if (!SetCurrentDirectory(Directories::getBinDir())) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Can not change current working directory!" << m_deviceID << "\n"; + return false; + } + + int count = 0; + while (count++ < 5) + { + m_handle = champOpen(m_deviceID); + if (m_handle == nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Failed to open the device, retrying (" << count << ")" << "\n"; + System::Time::sleep(500); + } + else { break; } + } + + if (m_handle == nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Can not open actiCHamp device id " << m_deviceID << "\n"; + return false; + } + // set back to previous working directory + if (!SetCurrentDirectory(Directories::getDistRootDir())) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Can not change current working directory!" << m_deviceID << "\n"; + return false; + } + + // Gets versions + t_champVersion version; + champGetVersion(m_handle, &version); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Got actiCHamp version (Dll:" << size_t(version.Dll) << ", Driver:" << + size_t(version.Driver) << ", Cypress:" << size_t(version.Cypress) << ", Fpga:" << size_t(version.Fpga) << ", Msp430:" << + size_t(version.Msp430) << ")\n"; + + // Gets battery voltages + t_champVoltages voltage; + if (champGetVoltages(m_handle, &voltage)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not get voltages - Got error [" << getError() << "]\n"; + } + else + { + int state = 0; + if (voltage.VDC < 5.5) { state = 1; } + if (voltage.VDC < 5.2) { state = 2; } + switch (state) + { + case 0: m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Battery level is fine (" << float(voltage.VDC) << ")\n"; + break; + case 1: m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Battery level is critical (" << float(voltage.VDC) << ")\n"; + break; + case 2: m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "Battery level is bad (" << float(voltage.VDC) << ")\n"; + break; + default: break; + } + } + + // Gets and sets modules status + t_champModules modules; + champGetModules(m_handle, &modules); + modules.Enabled = m_moduleEnabled; + champSetModules(m_handle, &modules); + champGetModules(m_handle, &modules); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Got modules status : Present=" << modules.Present << " / Enabled=" << modules.Enabled << "\n"; + + // Active shield + if (champSetActiveShieldGain(m_handle, m_activeShieldGain)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not set active shield gain - Got error [" << getError() << "]\n"; + champClose(m_handle); + m_handle = nullptr; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Active Shield Gain set to [" << m_activeShieldGain << "]\n"; + + // Sets settings to acquisition state + t_champSettingsEx oSettings; + oSettings.Mode = t_champMode(m_mode); + oSettings.Rate = t_champRate(m_physicalSampling); + oSettings.AdcFilter = t_champAdcFilter(m_adcDataFilter); + oSettings.Decimation = t_champDecimation(m_adcDataDecimation); + if (champSetSettingsEx(m_handle, &oSettings)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not set settings - Got error [" << getError() << "]\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Acquisition Settings set to [Mode: " << m_mode << "] [PhysicalSamplingRate: " << + m_physicalSampling << "] [ADCDataFilter: " << m_adcDataFilter << "] [ADCDataDecimation: " << m_adcDataDecimation << "]\n"; + + // Gets properties + t_champProperty properties; + if (champGetProperty(m_handle, &properties)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not get properties - Got error [" << getError() << "]\n"; + champClose(m_handle); + m_handle = nullptr; + return false; + } + + // Sets channel count + // as the modules were set before according to the configuration, the property structure + // contains the right number of channels. + m_nEEG = properties.CountEeg; + m_nAux = (m_useAuxChannels ? properties.CountAux : 0); + m_nChannel = m_nEEG + m_nAux; + if (m_nChannel == 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "No channels were selected [EEG: " << m_nEEG << "] [AUX: " << m_nAux << + "]. Close device.\n"; + champClose(m_handle); + m_handle = nullptr; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Channel counts are [EEG: " << m_nEEG << "] [AUX: " << m_nAux << "]\n"; + + m_header.setChannelCount(m_nChannel); + + m_impedances.resize(m_nEEG + 1); + m_samples.resize(m_nChannel); + m_resolutions.resize(m_nChannel); + + m_physicalSamplingHz = uint32_t(properties.Rate); + m_counterStep = (uint64_t(m_header.getSamplingFrequency()) << 32) / uint64_t(m_physicalSamplingHz); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Sampling rate in Hz [Physical: " << m_physicalSamplingHz << "] [Driver: " << m_header. + getSamplingFrequency() << "]\n"; + + size_t j = 0; + for (size_t i = 0; i < m_nEEG; i++, j++) { m_resolutions[j] = properties.ResolutionEeg * 1E6f; } // converts to µV + for (size_t i = 0; i < m_nAux; i++, j++) { m_resolutions[j] = properties.ResolutionAux * 1E6f; } // converts to µV + + //@TODO ue of i & j are normals ? + j = 0; + for (size_t i = 0; i < m_nEEG; i++, j++) { m_header.setChannelUnits(i, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); } + for (size_t i = 0; i < m_nAux; i++, j++) { m_header.setChannelUnits(i, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); } // converts to µV + + // Sets data pointers + // the amplifier model is depending on the number of channels, always including AUX + switch ((m_useAuxChannels ? m_nChannel : m_nChannel + 8)) + { + case 8: m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Data Model is [AUX]\n"; + m_pAux = Buffer[0].ModelAux.Aux; + m_eeg = nullptr; // Buffer[0].ModelAux.Main; + m_triggers = &Buffer[0].ModelAux.Triggers; + m_size = sizeof(Buffer[0].ModelAux); + break; + + case 32 + 8: m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Data Model is [Model32]\n"; + m_pAux = Buffer[0].Model32.Aux; + m_eeg = Buffer[0].Model32.Main; + m_triggers = &Buffer[0].Model32.Triggers; + m_size = sizeof(Buffer[0].Model32); + break; + + case 64 + 8: m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Data Model is [Model64]\n"; + m_pAux = Buffer[0].Model64.Aux; + m_eeg = Buffer[0].Model64.Main; + m_triggers = &Buffer[0].Model64.Triggers; + m_size = sizeof(Buffer[0].Model64); + break; + + case 96 + 8: m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Data Model is [Model96]\n"; + m_pAux = Buffer[0].Model96.Aux; + m_eeg = Buffer[0].Model96.Main; + m_triggers = &Buffer[0].Model96.Triggers; + m_size = sizeof(Buffer[0].Model96); + break; + + case 128 + 8: m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Data Model is [Model128]\n"; + m_pAux = Buffer[0].Model128.Aux; + m_eeg = Buffer[0].Model128.Main; + m_triggers = &Buffer[0].Model128.Triggers; + m_size = sizeof(Buffer[0].Model128); + break; + + case 160 + 8: m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Data Model is [Model160]\n"; + m_pAux = Buffer[0].Model160.Aux; + m_eeg = Buffer[0].Model160.Main; + m_triggers = &Buffer[0].Model160.Triggers; + m_size = sizeof(Buffer[0].Model160); + break; + + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Data Model unknown.\n"; + m_pAux = nullptr; + m_eeg = nullptr; + m_triggers = nullptr; + m_size = 0; + break; + } + + if (m_size == 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unknown device model " << m_nEEG << " EEG channels / " << m_nAux << + " Auxiliary channels\n"; + champClose(m_handle); + m_handle = nullptr; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Device model " << m_nEEG << " EEG channels / " << m_nAux << " Auxiliary channels\n"; + + // Prepares low pass filter + +#define __set_filter__(f,f_decim) \ + if(m_adcDataDecimation == CHAMP_DECIMATION_0) \ + { \ + if(!loadFilter(Directories::getDataDir() + "/applications/acquisition-server/filters/" f ".bin", m_filters)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to load filter !\n"; } \ + } \ + else \ + { \ + if(!loadFilter(Directories::getDataDir() + "/applications/acquisition-server/filters/" f_decim ".bin", m_filters)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to load filter !\n"; } \ + }\ + valid = true; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Setting up the FIR filter for signal decimation (physical rate > driver rate).\n"; + + bool valid = false; + switch (m_header.getSamplingFrequency()) + { + case 128: switch (m_physicalSampling) + { + case CHAMP_RATE_10KHZ: __set_filter__("f64_10k_128", "f64_5k_128"); + break; + case CHAMP_RATE_50KHZ: __set_filter__("f64_50k_128", "f64_25k_128"); + break; + case CHAMP_RATE_100KHZ: __set_filter__("f64_100k_128", "f64_50k_128"); + break; + default: break; + } + break; + + case 256: switch (m_physicalSampling) + { + case CHAMP_RATE_10KHZ: __set_filter__("f64_10k_256", "f64_5k_256"); + break; + case CHAMP_RATE_50KHZ: __set_filter__("f64_50k_256", "f64_25k_256"); + break; + case CHAMP_RATE_100KHZ: __set_filter__("f64_100k_256", "f64_50k_256"); + break; + default: break; + } + break; + + case 512: switch (m_physicalSampling) + { + case CHAMP_RATE_10KHZ: __set_filter__("f64_10k_512", "f64_5k_512"); + break; + case CHAMP_RATE_50KHZ: __set_filter__("f64_50k_512", "f64_25k_512"); + break; + case CHAMP_RATE_100KHZ: __set_filter__("f64_100k_512", "f64_50k_512"); + break; + default: break; + } + break; + + case 1024: switch (m_physicalSampling) + { + case CHAMP_RATE_10KHZ: __set_filter__("f64_10k_1024", "f64_5k_1024"); + break; + case CHAMP_RATE_50KHZ: __set_filter__("f64_50k_1024", "f64_25k_1024"); + break; + case CHAMP_RATE_100KHZ: __set_filter__("f64_100k_1024", "f64_50k_1024"); + break; + default: break; + } + break; + + case 2048: switch (m_physicalSampling) + { + case CHAMP_RATE_10KHZ: __set_filter__("f64_10k_2048", "f64_5k_2048"); + break; + case CHAMP_RATE_50KHZ: __set_filter__("f64_50k_2048", "f64_25k_2048"); + break; + case CHAMP_RATE_100KHZ: __set_filter__("f64_100k_2048", "f64_50k_2048"); + break; + default: break; + } + break; + + case 4096: switch (m_physicalSampling) + { + case CHAMP_RATE_10KHZ: __set_filter__("f64_10k_4096", "f64_5k_4096"); + break; + case CHAMP_RATE_50KHZ: __set_filter__("f64_50k_4096", "f64_25k_4096"); + break; + case CHAMP_RATE_100KHZ: __set_filter__("f64_100k_4096", "f64_50k_4096"); + break; + default: break; + } + break; + + default: break; + } + +#if 0 + __set_filter__("f64_none"); + __set_filter__("f64_10k_12"); + __set_filter__("f64_10k_256"); +#endif + +#undef __set_filter__ + + if (!valid) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unhandled soft sampling frequency / physical sampling frequency configuration [" << m_header. + getSamplingFrequency() << ", " << m_physicalSampling << "]\n"; + champClose(m_handle); + m_handle = nullptr; + return false; + } + + // Prepares cache for filtering + m_sampleCaches.clear(); + for (size_t i = 0; i < m_filters.size(); ++i) { m_sampleCaches.push_back(m_samples); } + + m_callback = &callback; + m_counter = 0; + + // Setting the inner latency as described in the beginning of the file + m_nDriftOffsetSample = int64_t(m_header.getSamplingFrequency() * 50) / 1000; + m_driverCtx.setInnerLatencySampleCount(-m_nDriftOffsetSample); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Driver inner latency set to 50ms to compensate FIR filtering.\n"; + + if (m_driverCtx.isImpedanceCheckRequested()) + { + // Sets settings manually for impedance check + t_champSettingsEx settings; + settings.Mode = CHAMP_MODE_IMPEDANCE; + settings.Rate = CHAMP_RATE_10KHZ; + settings.AdcFilter = CHAMP_ADC_NATIVE; + settings.Decimation = CHAMP_DECIMATION_0; + if (champSetSettingsEx(m_handle, &settings)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not set settings - Got error [" << getError() << "]\n"; + champClose(m_handle); + m_handle = nullptr; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Impedance check is requested. Setting the acquisition to [CHAMP_MODE_IMPEDANCE].\n"; + + // Sets impedance setup manually + t_champImpedanceSetup setup; + setup.Good = m_goodImpedanceLimit;// 5000; // 5kOhm + setup.Bad = m_badImpedanceLimit; //10000; // 10kOhm + setup.LedsDisable = 0; + setup.TimeOut = 5; + if (champImpedanceSetSetup(m_handle, &setup)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not set impedance setup - Got error [" << getError() << "]\n"; + champClose(m_handle); + m_handle = nullptr; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Impedance limits are set to [GREEN < " << m_goodImpedanceLimit << "Ohm < YELLOW < " << + m_badImpedanceLimit << "Ohm < RED].\n"; + + // Gets/Sets impedance mode + t_champImpedanceMode mode; + if (champImpedanceGetMode(m_handle, &mode)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not get impedance mode - Got error [" << getError() << "]\n"; + champClose(m_handle); + m_handle = nullptr; + return false; + } + + mode.Splitter = mode.Splitters; + if (champImpedanceSetMode(m_handle, &mode)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not set impedance mode - Got error [" << getError() << "]\n"; + champClose(m_handle); + m_handle = nullptr; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Impedance splitters set to [" << size_t(mode.Splitters) << "]\n"; + + // Starts impedance check + if (champStart(m_handle)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Can not start device id " << m_deviceID << " - Got error [" << getError() << "]\n"; + champClose(m_handle); + m_handle = nullptr; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Impedance check started...\n"; + } + + return true; +} + +bool CDriverBrainProductsActiCHamp::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_driverCtx.isImpedanceCheckRequested()) { champStop(m_handle); } + + // Sets settings to acquisition state + t_champSettingsEx settings; + settings.Mode = t_champMode(m_mode); + settings.Rate = t_champRate(m_physicalSampling); + settings.AdcFilter = t_champAdcFilter(m_adcDataFilter); + settings.Decimation = t_champDecimation(m_adcDataDecimation); + if (champSetSettingsEx(m_handle, &settings)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not set settings - Got error [" << getError() << "]\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Acquisition Settings set to [Mode: " << m_mode << "] [PhysicalSamplingRate: " << + m_physicalSampling << "] [ADCDataFilter: " << m_adcDataFilter << "] [ADCDataDecimation: " << m_adcDataDecimation << "]\n"; + + // Starts acquisition + if (champStart(m_handle)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Can not start device id " << m_deviceID << " - Got error [" << getError() << "]\n"; + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Acquisition started...\n"; + + return true; +} + +bool CDriverBrainProductsActiCHamp::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + + if (m_driverCtx.isStarted()) + { + t_champDataStatus dataStatus; + champGetDataStatus(m_handle, &dataStatus); + //m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Status : Samples:" << size_t(l_oDataStatus.Samples) << " Errors:" << size_t(l_oDataStatus.Errors) << " Rate:" << float(l_oDataStatus.Rate) << " Speed:" << float(l_oDataStatus.Speed) << "\n"; + + // Reads all the data. + // Buffers are aligned : with one call to champGetData we get as much buffers as possible + int code; + while ((code = champGetData(m_handle, &Buffer[0], m_size * NB_MAX_BUFFER_IN_CACHE)) > 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Received " << float(code) / m_size << " new buffers with champGetData.\n"; + + for (int buf = 0; buf < int(code / m_size); ++buf) + { + uint32_t i, j = 0; + + // we find the good pointers (m_eeg and m_pAux being on the first buffer) + // Size of an union in memory is the size of the biggest possible type + signed int* aux = m_pAux + buf * (m_size / sizeof(signed int)); + signed int* eeg = m_eeg + buf * (m_size / sizeof(signed int)); + // m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "AUX ptr = " << (uint32_t)l_pAux << " EEG ptr = "<< (uint32_t)l_pEEG <<"\n"; + + // Scales data according to respective resolution + for (i = 0; i < m_nEEG; i++, j++) { m_samples[j] = m_resolutions[j] * float(eeg[i]); } + if (m_useAuxChannels) { for (i = 0; i < m_nAux; i++, j++) { m_samples[j] = m_resolutions[j] * float(aux[i]); } } + //m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Samples saved in cache.\n"; + + // Updates cache + //m_sampleCaches.erase(m_sampleCaches.begin()); + m_sampleCaches.pop_front(); + m_sampleCaches.push_back(m_samples); + m_nSample++; + + // Downsamples and sends samples only when relevant + m_counter += m_counterStep; + if (m_counter >= (1LL << 32)) + { + //m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Enough samples received to build a new buffer. Applying FIR filter.\n"; + m_counter -= (1LL << 32); + + // Filters last samples + for (i = 0; i < m_samples.size(); ++i) + { + m_samples[i] = 0; + auto it = m_sampleCaches.begin(); + for (j = 0; j < m_filters.size(); ++j) + { + //m_samples[i]+=m_filters[j]*m_sampleCaches[j][i]; + m_samples[i] += float(m_filters[j] * (*it)[i]); + ++it; + } + } + + //m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Samples ready for sending.\n"; + m_callback->setSamples(&m_samples[0], 1); + m_callback->setStimulationSet(m_stimSet); + m_stimSet.clear(); + + // Saves the date of this sample for further use with the triggers + m_lastSampleDate += uint64_t((1LL << 32) / m_header.getSamplingFrequency()); + m_nSample = 0; + //m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Sending one sample.\n"; + } + + //m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Getting trigger...\n"; + + // we save the MyButton state and detect if it switched + bool bSwitch = m_bMyButtonstate; + uint32_t* trigger = m_triggers + buf * (m_size / sizeof(uint32_t)); + m_bMyButtonstate = ((*trigger & 0x80000000) >> 31) == 1; + bSwitch = (bSwitch ? !m_bMyButtonstate : m_bMyButtonstate); + + // Decomposes the trigger bytes: + // Digital inputs (bits 0 - 7) + output (bits 8 - 15) state + 15 MSB reserved bits + MyButton bit (bit 31) + // apply a mask to silence any modification on the output and reserved parts + (*trigger) &= 0x800000ff; + + // Now we can test for modification on the interesting part (input triggers and MyButton) + if (*trigger != m_uiLastTriggers) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Current input triggers state ["; + m_driverCtx.getLogManager() << ((*trigger & 0x00000001)) << " "; + m_driverCtx.getLogManager() << ((*trigger & 0x00000002) >> 1) << " "; + m_driverCtx.getLogManager() << ((*trigger & 0x00000004) >> 2) << " "; + m_driverCtx.getLogManager() << ((*trigger & 0x00000008) >> 3) << " "; + m_driverCtx.getLogManager() << ((*trigger & 0x00000010) >> 4) << " "; + m_driverCtx.getLogManager() << ((*trigger & 0x00000020) >> 5) << " "; + m_driverCtx.getLogManager() << ((*trigger & 0x00000040) >> 6) << " "; + m_driverCtx.getLogManager() << ((*trigger & 0x00000080) >> 7) << "] MyButton ["; + m_driverCtx.getLogManager() << m_bMyButtonstate << "]\n"; + + // Every time that a trigger has changed, we send a stimulation. + // code of stimulation = OVTK_StimulationId_LabelStart + value of the trigger bytes. + // This supposes that the user knows the structure of the triggers bit by bit and can process it in a Lua box for example. + // The value received is in [0-255] + // The MyButton bit is set to 0 to ensure this range. + + // The date is relative to the last buffer start time (cf the setSamples before setStimulationSet) + const uint64_t date = m_nSample * (1LL << 32) / m_physicalSamplingHz; + m_stimSet.appendStimulation(OVTK_StimulationId_Label((*trigger)&0x000000ff), date, 0); + + // special case : MyButton + // The MyButton trigger bit is too far in the trigger bytes to have a valid value + // We use 2 dedicated stims OVTK_StimulationId_Button1_Pressed and OVTK_StimulationId_Button1_Released + if (bSwitch) + { + m_stimSet.appendStimulation((m_bMyButtonstate ? OVTK_StimulationId_Button1_Pressed : OVTK_StimulationId_Button1_Released), date, 0); + } + } + m_uiLastTriggers = *trigger; + } + } + if (code < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "An error occured with last sample request - Got error [" << code << "]\n"; + return false; + } + + // As described in at the beginning of this file, the drift + // correction process is altered to consider the ~ 50ms delay + // of the single way filtering process + // Inner latency was set accordingly. + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + else + { + if (m_driverCtx.isImpedanceCheckRequested()) + { + // Reads impedances + if (champImpedanceGetData(m_handle, &m_impedances[0], m_impedances.size() * sizeof(uint32_t))) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Can not read impedances on device id " << m_deviceID << " - Got error [" << + getError() << "]\n"; + } + else + { + // Updates impedances + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Impedances are [ "; + for (size_t j = 0; j < m_nEEG; ++j) + { + m_driverCtx.updateImpedance(j, m_impedances[j]); + m_driverCtx.getLogManager() << m_impedances[j] << " "; + } + m_driverCtx.getLogManager() << "\n"; + + // Drops data + while ((champGetData(m_handle, &Buffer, m_size * NB_MAX_BUFFER_IN_CACHE)) > 0) { } + } + } + } + + return true; +} + +bool CDriverBrainProductsActiCHamp::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + if (!m_driverCtx.isImpedanceCheckRequested()) { champStop(m_handle); } + return true; +} + +bool CDriverBrainProductsActiCHamp::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + if (m_driverCtx.isImpedanceCheckRequested()) { champStop(m_handle); } + + champClose(m_handle); + m_handle = nullptr; + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverBrainProductsActiCHamp::configure() +{ + CConfigurationBrainProductsActiCHamp config(Directories::getDataDir() + "/applications/acquisition-server/interface-BrainProducts-ActiCHamp.ui", m_deviceID, + m_mode, m_physicalSampling, m_adcDataFilter, m_adcDataDecimation, m_activeShieldGain, m_moduleEnabled, + m_useAuxChannels, m_goodImpedanceLimit, m_badImpedanceLimit); + return config.configure(m_header); +} + +//___________________________________________________________________// +// // + +CString CDriverBrainProductsActiCHamp::getError(int* code) const +{ + int iCode = 0; + int* pCode = (code ? code : &iCode); + if (!m_handle) { return ""; } + char buffer[1024]; + buffer[0] = '\0'; + champGetError(m_handle, pCode, buffer, sizeof(buffer)); + return buffer; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyActiCHampAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.h new file mode 100644 index 0000000..8bcff8a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.h @@ -0,0 +1,99 @@ +/* + * ovasCDriverBrainProductsActiCHamp.h + * + * Copyright (c) 2012, Mensia Technologies SA. All rights reserved. + * -- Rights transferred to Inria, contract signed 21.11.2014 + * + */ + +#pragma once + +#if defined TARGET_HAS_ThirdPartyActiCHampAPI + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverBrainProductsActiCHamp + * \author Mensia Technologies + */ +class CDriverBrainProductsActiCHamp final : public IDriver +{ +public: + + explicit CDriverBrainProductsActiCHamp(IDriverContext& ctx); + void release() { delete this; } + const char* getName() override { return "Brain Products actiCHamp"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + CString getError(int* code = nullptr) const; + +protected: + + void* m_handle = nullptr; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + std::vector m_impedances; + std::vector m_samples; + std::vector m_resolutions; + //std::vector < std::vector < float > > m_sampleCaches; + std::deque> m_sampleCaches; + uint32_t m_sampleCacheIdx = 0; + std::vector m_filters; + + CStimulationSet m_stimSet; + + uint32_t m_deviceID = 0; + uint32_t m_mode = 0; + uint32_t m_physicalSampling = 0; + uint32_t m_adcDataFilter = 0; + uint32_t m_adcDataDecimation = 0; + uint32_t m_activeShieldGain = 0; + uint32_t m_moduleEnabled = 0; + bool m_useAuxChannels = false; + + uint32_t m_physicalSamplingHz = 0; + + uint32_t m_nChannel = 0; + uint32_t m_nEEG = 0; + uint32_t m_nAux = 0; + uint32_t m_nTriggersIn = 0; + + uint64_t m_counter = 0; + uint64_t m_counterStep = 0; + uint64_t m_nSample = 0; + int64_t m_nDriftOffsetSample = 0; + + uint32_t m_goodImpedanceLimit = 5000; + uint32_t m_badImpedanceLimit = 10000; + + signed int* m_pAux = nullptr; + signed int* m_eeg = nullptr; + uint32_t* m_triggers = nullptr; + uint32_t m_size = 0; + + uint32_t m_uiLastTriggers = 0; + uint64_t m_lastSampleDate = 0; + + bool m_bMyButtonstate = false; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyActiCHampAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.cpp new file mode 100644 index 0000000..e0d6e1b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.cpp @@ -0,0 +1,299 @@ +/* + * Brain Products Brainamp Series driver for OpenViBE + * Copyright (C) 2010 INRIA - Author : Yann Renard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "ovasCConfigurationBrainProductsBrainampSeries.h" + +#include "ovasIHeader.h" + +#if defined TARGET_OS_Windows + +#include "ovasCDriverBrainProductsBrainampSeries.h" + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + + +static EParameter toIndex(const uint32_t value) +{ + switch (value) + { + case 1: return DecimationFactor_None; + case 2: return DecimationFactor_2; + case 4: return DecimationFactor_4; + case 5: return DecimationFactor_5; + case 8: return DecimationFactor_8; + case 10: return DecimationFactor_10; + default: return DecimationFactor_None; + } +} + +static uint32_t toValue(const EParameter parameter) +{ + switch (parameter) + { + case DecimationFactor_None: return 1; + case DecimationFactor_2: return 2; + case DecimationFactor_4: return 4; + case DecimationFactor_5: return 5; + case DecimationFactor_8: return 8; + case DecimationFactor_10: return 10; + default: return 1; + } +} + + +static void ChannelDetailsPressedCB(GtkButton* /*button*/, void* data) +{ + static_cast(data)->buttonChannelDetailsPressedCB(); +} + +static void ComboboxDeviceChangedCB(GtkComboBox* /*comboBox*/, void* data) +{ + static_cast(data)->comboBoxDeviceChangedCB(); +} + +CConfigurationBrainProductsBrainampSeries::CConfigurationBrainProductsBrainampSeries( + CDriverBrainProductsBrainampSeries& driver, const char* gtkBuilderFileName, uint32_t& usbIdx, uint32_t& decimationFactor, + EParameter* channelSelected, EParameter* lowPassFilterFull, EParameter* resolutionFull, EParameter* dcCouplingFull, + EParameter& lowPass, EParameter& resolution, EParameter& dcCoupling, EParameter& impedance) + : CConfigurationBuilder(gtkBuilderFileName), m_driver(driver), m_usbIdx(usbIdx), + m_decimationFactor(decimationFactor), m_channelSelected(channelSelected), + m_lowPassFilterFull(lowPassFilterFull), m_resolutionFull(resolutionFull), + m_dcCouplingFull(dcCouplingFull), m_lowPass(lowPass), m_resolution(resolution), + m_dcCoupling(dcCoupling), m_impedance(impedance) {} + +bool CConfigurationBrainProductsBrainampSeries::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + GtkComboBox* device = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + GtkComboBox* lowPass = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_lowpass_filter")); + GtkComboBox* decimation = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_decimation_factor")); + GtkComboBox* resolution = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_resolution")); + GtkComboBox* dcCoupling = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_dc_coupling")); + GtkComboBox* impedance = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_impedance")); + + g_signal_connect(gtk_builder_get_object(m_builder, "button_channel_details"), "pressed", G_CALLBACK(ChannelDetailsPressedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder, "combobox_device"), "changed", G_CALLBACK(ComboboxDeviceChangedCB), this); + + char buffer[1024]; + int count = 0; + bool selected = false; + + // autodetection of the connected device(s) + for (uint32_t i = 0; i < 16; ++i) + { + if (m_driver.getDeviceDetails(i, nullptr, nullptr)) + { + sprintf(buffer, "USB port %i", i); + gtk_combo_box_append_text(device, buffer); + { + if (m_usbIdx == i) + { + gtk_combo_box_set_active(device, count); + selected = true; + } + } + count++; + } + } + + if (!selected && count != 0) { gtk_combo_box_set_active(device, 0); } + + gtk_combo_box_set_active(lowPass, m_lowPass); + gtk_combo_box_set_active(decimation, toIndex(m_decimationFactor)); + gtk_combo_box_set_active(resolution, m_resolution); + gtk_combo_box_set_active(dcCoupling, m_dcCoupling); + gtk_combo_box_set_active(impedance, m_impedance); + + return true; +} + +bool CConfigurationBrainProductsBrainampSeries::postConfigure() +{ + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + + if (m_applyConfig) + { + GtkComboBox* device = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + GtkComboBox* lowPass = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_lowpass_filter")); + GtkComboBox* decimation = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_decimation_factor")); + GtkComboBox* resolution = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_resolution")); + GtkComboBox* dcCoupling = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_dc_coupling")); + GtkComboBox* impedance = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_impedance")); + + uint32_t usbIdx = 0; + const char* usbIndex = gtk_combo_box_get_active_text(device); + if (usbIndex) { if (sscanf(usbIndex, "USB port %i", &usbIdx) == 1) { m_usbIdx = usbIdx; } } + + m_lowPass = EParameter(gtk_combo_box_get_active(lowPass)); + m_decimationFactor = (toValue(EParameter(gtk_combo_box_get_active(decimation)))); + m_resolution = EParameter(gtk_combo_box_get_active(resolution)); + m_dcCoupling = EParameter(gtk_combo_box_get_active(dcCoupling)); + m_impedance = EParameter(gtk_combo_box_get_active(impedance)); + } + + if (!CConfigurationBuilder::postConfigure()) { return false; } + return true; +} + +void CConfigurationBrainProductsBrainampSeries::buttonChannelDetailsPressedCB() +{ + GtkBuilder* builder = gtk_builder_new(); + gtk_builder_add_from_file(builder, m_gtkBuilderFilename.c_str(), nullptr); + + GtkDialog* dialogChannelDetails = GTK_DIALOG(gtk_builder_get_object(builder, "dialog_channel_details")); + GtkTable* dialogChannelDetailsTable = GTK_TABLE(gtk_builder_get_object(builder, "table_content")); + + GtkTreeModel* treeModelLowPassFilterFull = GTK_TREE_MODEL(gtk_builder_get_object(builder, "model_lowpass_filter_full")); + GtkTreeModel* treeModelResolutionFull = GTK_TREE_MODEL(gtk_builder_get_object(builder, "model_resolution_full")); + GtkTreeModel* treeModelDcCouplingFull = GTK_TREE_MODEL(gtk_builder_get_object(builder, "model_dc_coupling_full")); + + gtk_table_resize(dialogChannelDetailsTable, 1, 5); + gtk_table_resize(dialogChannelDetailsTable, 1 + m_header->getChannelCount(), 5); + for (size_t i = 1; i < 1 + m_header->getChannelCount(); ++i) + { + GtkLabel* widgetIdx = GTK_LABEL(gtk_label_new((std::to_string(i) + ":").c_str())); + gtk_label_set_justify(widgetIdx, GTK_JUSTIFY_LEFT); + gtk_widget_show(GTK_WIDGET(widgetIdx)); + + GtkLabel* widgetChannelName = GTK_LABEL(gtk_label_new(m_header->getChannelName(i-1))); + gtk_label_set_justify(widgetChannelName, GTK_JUSTIFY_LEFT); + // We hide this label as the channel name is not accurate + // The update of the channel rename configuration (moved to the main application) + // has broken this feature in the driver: real channel names are not passed to the driver + // but are only kept at the server level. This problem should be adressed in future version. + gtk_widget_hide(GTK_WIDGET(widgetChannelName)); + //::gtk_widget_show(GTK_WIDGET(l_pWidgetChannelName)); + + GtkBox* widgetChannel = GTK_BOX(gtk_hbox_new(false, 2)); + gtk_box_pack_start(widgetChannel, GTK_WIDGET(widgetIdx), true, true, 0); + gtk_box_pack_start(widgetChannel, GTK_WIDGET(widgetChannelName), true, true, 0); + gtk_widget_show(GTK_WIDGET(widgetChannel)); + gtk_table_attach_defaults(dialogChannelDetailsTable, GTK_WIDGET(widgetChannel), 0, 1, i, i + 1); + + GtkToggleButton* widgetChannelSelected = GTK_TOGGLE_BUTTON(gtk_check_button_new()); + gtk_toggle_button_set_active(widgetChannelSelected, m_channelSelected[i - 1] == Channel_Selected); + gtk_widget_show(GTK_WIDGET(widgetChannelSelected)); + gtk_table_attach_defaults(dialogChannelDetailsTable, GTK_WIDGET(widgetChannelSelected), 1, 2, i, i + 1); + + GtkComboBox* widgetLowPassFilterFull = GTK_COMBO_BOX(gtk_combo_box_new_text()); + gtk_combo_box_set_model(widgetLowPassFilterFull, treeModelLowPassFilterFull); + gtk_combo_box_set_active(widgetLowPassFilterFull, gint(m_lowPassFilterFull[i - 1] + 1)); + gtk_widget_show(GTK_WIDGET(widgetLowPassFilterFull)); + gtk_table_attach_defaults(dialogChannelDetailsTable, GTK_WIDGET(widgetLowPassFilterFull), 2, 3, i, i + 1); + + GtkComboBox* widgetResolutionFull = GTK_COMBO_BOX(gtk_combo_box_new_text()); + gtk_combo_box_set_model(widgetResolutionFull, treeModelResolutionFull); + gtk_combo_box_set_active(widgetResolutionFull, gint(m_resolutionFull[i - 1] + 1)); + gtk_widget_show(GTK_WIDGET(widgetResolutionFull)); + gtk_table_attach_defaults(dialogChannelDetailsTable, GTK_WIDGET(widgetResolutionFull), 3, 4, i, i + 1); + + GtkComboBox* widgetDcCouplingFull = GTK_COMBO_BOX(gtk_combo_box_new_text()); + gtk_combo_box_set_model(widgetDcCouplingFull, treeModelDcCouplingFull); + gtk_combo_box_set_active(widgetDcCouplingFull, gint(m_dcCouplingFull[i - 1] + 1)); + gtk_widget_show(GTK_WIDGET(widgetDcCouplingFull)); + gtk_table_attach_defaults(dialogChannelDetailsTable, GTK_WIDGET(widgetDcCouplingFull), 4, 5, i, i + 1); + } + + if (gtk_dialog_run(dialogChannelDetails) == GTK_RESPONSE_APPLY) + { + for (GList* list = dialogChannelDetailsTable->children; list; list = list->next) + { + GtkTableChild* tableChild = (GtkTableChild*)list->data; + if (tableChild) + { + const gint i = tableChild->top_attach - 1; + if (i >= 0) + { + switch (tableChild->left_attach) + { + case 1: m_channelSelected[i] = EParameter(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tableChild->widget))); + break; + case 2: m_lowPassFilterFull[i] = EParameter(gtk_combo_box_get_active(GTK_COMBO_BOX(tableChild->widget)) - 1); + break; + case 3: m_resolutionFull[i] = EParameter(gtk_combo_box_get_active(GTK_COMBO_BOX(tableChild->widget)) - 1); + break; + case 4: m_dcCouplingFull[i] = EParameter(gtk_combo_box_get_active(GTK_COMBO_BOX(tableChild->widget)) - 1); + break; + default: break; + } + } + } + } + } + + gtk_widget_hide(GTK_WIDGET(dialogChannelDetails)); + + g_object_unref(builder); +} + +void CConfigurationBrainProductsBrainampSeries::comboBoxDeviceChangedCB() +{ + GtkComboBox* comboBoxDevice = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + const char* usbIndex = gtk_combo_box_get_active_text(comboBoxDevice); + if (usbIndex) + { + uint32_t usbIdx = -1; + if (sscanf(usbIndex, "USB port %i", &usbIdx) == 1) + { + uint32_t amplifierType[4]; + uint32_t nAmplifier = 0; + if (m_driver.getDeviceDetails(usbIdx, &nAmplifier, amplifierType)) + { + bool correctMontage = true; + m_header->setChannelCount(nAmplifier * 32); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_nChannels), nAmplifier * 32); + + for (uint32_t i = 0; i < BrainAmp_MaximumAmplifierCount; ++i) + { + const std::string name = "label_multiamp_montage_" + std::to_string(i + 1); + GtkLabel* multiampMontage = GTK_LABEL(gtk_builder_get_object(m_builder, name.c_str())); + gtk_label_set_label(multiampMontage, getDeviceType(amplifierType[i])); + if (i >= 1 && amplifierType[i - 1] == AmplifierType_None && amplifierType[i] != AmplifierType_None) { correctMontage = false; } + } + + GtkWidget* montageTable = GTK_WIDGET(gtk_builder_get_object(m_builder, "table_multiamp_montage")); + GtkWidget* montageIcon = GTK_WIDGET(gtk_builder_get_object(m_builder, "image_montage_status_icon")); + if (correctMontage) + { + const char* text = "The multi amplifier montage is correct"; + gtk_image_set_from_stock(GTK_IMAGE(montageIcon), GTK_STOCK_YES, GTK_ICON_SIZE_BUTTON); + gtk_widget_set_tooltip_markup(montageIcon, text); + gtk_widget_set_tooltip_markup(montageTable, text); + } + else + { + const char* text = "The multi amplifier montage is not correct - avoid empty slots before filled slots"; + gtk_image_set_from_stock(GTK_IMAGE(montageIcon), GTK_STOCK_NO, GTK_ICON_SIZE_BUTTON); + gtk_widget_set_tooltip_markup(montageIcon, text); + gtk_widget_set_tooltip_markup(montageTable, text); + } + } + } + } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.h new file mode 100644 index 0000000..95a53c7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.h @@ -0,0 +1,71 @@ +/* + * Brain Products Brainamp Series driver for OpenViBE + * Copyright (C) 2010 INRIA - Author : Yann Renard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "../ovasCConfigurationBuilder.h" + +#if defined TARGET_OS_Windows + +#include "ovas_defines_brainamp_series.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { +class CDriverBrainProductsBrainampSeries; + +class CConfigurationBrainProductsBrainampSeries final : public CConfigurationBuilder +{ +public: + + CConfigurationBrainProductsBrainampSeries( + CDriverBrainProductsBrainampSeries& driver, const char* gtkBuilderFileName, uint32_t& usbIdx, uint32_t& decimationFactor, + EParameter* channelSelected, EParameter* lowPassFilterFull, EParameter* resolutionFull, EParameter* dcCouplingFull, + EParameter& lowPass, EParameter& resolution, EParameter& dcCoupling, EParameter& impedance); + + bool preConfigure() override; + bool postConfigure() override; + + void buttonChannelDetailsPressedCB(); + void comboBoxDeviceChangedCB(); + +protected: + + CDriverBrainProductsBrainampSeries& m_driver; + uint32_t& m_usbIdx; + uint32_t& m_decimationFactor; + EParameter* m_channelSelected = nullptr; + EParameter* m_lowPassFilterFull = nullptr; + EParameter* m_resolutionFull = nullptr; + EParameter* m_dcCouplingFull = nullptr; + EParameter& m_lowPass; + EParameter& m_resolution; + EParameter& m_dcCoupling; + EParameter& m_impedance; + + // private: + // GtkWidget* m_calibrateDialog = nullptr; + // bool m_calibrationDone = false; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.cpp new file mode 100644 index 0000000..a206dec --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.cpp @@ -0,0 +1,621 @@ +/* + * Brain Products Brainamp Series driver for OpenViBE + * Copyright (C) 2010 INRIA - Author : Yann Renard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "ovasCDriverBrainProductsBrainampSeries.h" + +#if defined TARGET_OS_Windows + +#include + +#include + +#include + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +char* CDriverBrainProductsBrainampSeries::getErrorMessage(const uint32_t error) +{ + const uint32_t code = error & 0xffff; + switch (code) + { + case 0: break; + case 1: return + "Connection between Brainamp and USB 2 Adapter / PCI is broken.\n" + "Please check connectors, switch and battery power. After the\n" + "connection is established and if you wish to continue the\n" + "recording, please press the Start/Resume Recording button.\n" + "If problem still persists, contact us at techsup@brainproducts.com"; + case 2: return + "The voltage in the amplifier is too low!\n" + "Check the batteries!"; + case 3: return + "Could not establish communication with the amplifier.\n" + "Check the connectors and the battery power!"; + case 4: return + "Out of synch, Barker words missing!"; + case 5: return + "Connection between USB 2 Adapter and Computer is broken.\n" + "Monitoring or recording was interrupted. Please check\n" + "the USB connectors. If problem still persists, contact\n" + "us at techsup@brainproducts.com"; + default: return "Unknown Amplifier Error\n"; + } + return ""; +} + +const Kernel::ELogLevel LogLevel_TraceAPI = Kernel::LogLevel_None; + +//___________________________________________________________________// +// // + +CDriverBrainProductsBrainampSeries::CDriverBrainProductsBrainampSeries(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_BrainAmpSeries", m_driverCtx.getConfigurationManager()), m_headerAdapter(m_header, m_channelSelected) +{ + // char* channelName[]={"Fp1", "Fp2", "F3", "F4", "C3", "C4", "P3", "P4", "O1", "O2", "F7", "F8", "T7", "T8", "P7", "P8", "Fz", "Cz", "Pz", "FC1", "FC2", "CP1", "CP2", "FC5", "FC6", "CP5", "CP6", "TP9", "TP10", "Eog", "Ekg1", "Ekg2", }; + //char* channelNameActiCap32 [] = { "Fp1", "Fp2", "F7", "F3", "Fz", "F4", "F8", "FC5", "FC1", "FC2", "FC6", "T7", "C3", "Cz", "C4", "T8", "TP9", "CP5", "CP1", "CP2", "CP6", "TP10", "P7", "P3", "Pz", "P4", "P8", "PO9", "O1", "Oz", "O2", "PO10" }; + //char* channelNameActiCap64 [] = { + // "Fp1", "Fp2", "F7", "F3", "Fz", "F4", "F8", "FC5", "FC1", "FC2", "FC6", "T7", "C3", "Cz", "C4", "T8", "TP9", "CP5", "CP1", "CP2", "CP6", "TP10", "P7", "P3", "Pz", "P4", "P8", "PO9", "O1", "Oz", "O2", "PO10", + // "AF7", "AF3", "AF4", "AF8", "F5", "F1", "F2", "F6", "FT9", "FT7", "FC3", "FC4", "FT8", "FT10", "C5", "C1", "C2", "C6", "TP7", "CP3", "CPz", "CP4", "TP8", "P5", "P1", "P2", "P6", "PO7", "PO3", "POz", "PO4", "PO8", + //}; + char* channelNameActiCap128[] = { + "Fp1", "Fp2", "F7", "F3", "Fz", "F4", "F8", "FC5", "FC1", "FC2", "FC6", "T7", "C3", "Cz", "C4", "T8", "TP9", "CP5", "CP1", "CP2", "CP6", "TP10", "P7", + "P3", "Pz", "P4", "P8", "PO9", "O1", "Oz", "O2", "PO10", + "AF7", "AF3", "AF4", "AF8", "F5", "F1", "F2", "F6", "FT9", "FT7", "FC3", "FC4", "FT8", "FT10", "C5", "C1", "C2", "C6", "TP7", "CP3", "CPz", "CP4", + "TP8", "P5", "P1", "P2", "P6", "PO7", "PO3", "POz", "PO4", "PO8", + "FPz", "F9", "AFF5h", "AFF1h", "AFF2h", "AFF6h", "F10", "FTT9h", "FTT7h", "FCC5h", "FCC3h", "FCC1h", "FCC2h", "FCC4h", "FCC6h", "FTT8h", "FTT10h", + "TPP9h", "TPP7h", "CPP5h", "CPP3h", "CPP1h", "CPP2h", "CPP4h", "CPP6h", "TPP8h", "TPP10h", "POO9h", "POO1", "POO2", "POO10h", "Iz", + "AFp1", "AFp2", "FFT9h", "FFT7h", "FFC5h", "FFC3h", "FFC1h", "FFC2h", "FFC4h", "FFC6h", "FFT8h", "FFT10h", "TTP7h", "CCP5h", "CCP3h", "CCP1h", "CCP2h", + "CCP4h", "CCP6h", "TTP8h", "P9", "PPO9h", "PPO5h", "PPO1h", "PPO2h", "PPO6h", "PPO10h", "P10", "I1", "OI1h", "OI2h", "I2", + }; + char** channelName = channelNameActiCap128; + + uint32_t nAmplifier = 1; + this->getDeviceDetails(m_usbIdx, &nAmplifier, nullptr); + + m_header.setSamplingFrequency(500); + m_header.setChannelCount(nAmplifier * 32); + for (uint32_t i = 0; i < 256; ++i) + { + m_header.setChannelName(i, (i < sizeof(channelNameActiCap128) / sizeof(void*) ? channelName[i] : "")); + m_channelSelected[i] = Channel_Selected; + m_lowPassFilterFull[i] = Parameter_Default; + m_resolutionFull[i] = Parameter_Default; + m_dcCouplingFull[i] = Parameter_Default; + } + + for (uint32_t i = 0; i < 256; ++i) { m_header.setChannelUnits(i, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); } + + m_settings.add("Header", &m_header); + m_settings.add("USBIndex", &m_usbIdx); + m_settings.add("DecimationFactor", &m_decimationFactor); + m_settings.add("ChannelSelected", m_channelSelected); + m_settings.add("LowPassFilterFull", &m_lowPassFilterFull); + m_settings.add("ResolutionFull", &m_resolutionFull); + m_settings.add("DCCouplingFull", &m_dcCouplingFull); + m_settings.add("LowPass", &m_lowPass); + m_settings.add("Resolution", &m_resolution); + m_settings.add("DCCoupling", &m_dcCoupling); + m_settings.add("Impedance", &m_impedance); + m_settings.load(); +} + +//___________________________________________________________________// +// // + +bool CDriverBrainProductsBrainampSeries::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + // #define nSamplePerSentBlock 20*5 + + + if (m_driverCtx.isConnected()) { return false; } + + // -- + const std::string name = "\\\\.\\BrainAmpUSB" + std::to_string(m_usbIdx); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Preparing device [" << name << "]\n"; + + // -- Gets amplifiers type + + uint32_t nAmplifier = BrainAmp_MaximumAmplifierCount; + uint32_t types[BrainAmp_MaximumAmplifierCount]; + if (!this->getDeviceDetails(m_usbIdx, &nAmplifier, types)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not get amplifier(s) type - got error " << size_t(GetLastError()) << "\n"; + return false; + } + + for (size_t i = 0; i < BrainAmp_MaximumAmplifierCount; ++i) + { + CString type(getDeviceType(types[i])); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " - Amplifier " << i + 1 << " : " << type << "\n"; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Found " << nAmplifier << " amplifier(s)\n"; + + // -- Opens device + + m_Device = ::CreateFile(name.c_str(), GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, nullptr); + if (m_Device == INVALID_HANDLE_VALUE) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not open device [" << name << "]\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Opened device [" << name << "]\n"; + + // -- Gets driver version from device + + char driverVersion[1024]; + uint32_t version = 0; + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_DRIVERVERSION\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_DRIVERVERSION, nullptr, 0, &version, sizeof(version), &m_nBytesReturned, nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not get driver version from device - got error " << size_t(GetLastError()) << "\n"; + CloseHandle(m_Device); + return false; + } + const uint32_t versionPatch = version % 10000; + const uint32_t versionMinor = (version % 1000000) / 10000; + const uint32_t versionMajor = (version) / 1000000; + sprintf(driverVersion, "%i.%02i.%04i", versionMajor, versionMinor, versionPatch); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Found driver version [" << CString(driverVersion) << "]\n"; + + // -- Gets serial number from device + + char deviceSerialNumber[1024]; + uint32_t serialNumber = 0; + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_GET_SERIALNUMBER\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_GET_SERIALNUMBER, nullptr, 0, &serialNumber, sizeof(serialNumber), &m_nBytesReturned, + nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not get serial number from device - got error " << size_t(GetLastError()) << "\n"; + CloseHandle(m_Device); + return false; + } + if (m_nBytesReturned != 0) + { + sprintf(deviceSerialNumber, "0x%08x", serialNumber); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Found serial number [" << CString(deviceSerialNumber) << "]\n"; + } + + // -- Sets callibration settings + + m_deviceCalibrationSettings = new CBrainampCalibrationSettings; + // m_deviceCalibrationSettings->waveForm=WaveForm_Ramp; + // m_deviceCalibrationSettings->waveForm=WaveForm_Triangle; + // m_deviceCalibrationSettings->waveForm=WaveForm_Square; + m_deviceCalibrationSettings->waveForm = WaveForm_SineWave; + m_deviceCalibrationSettings->frequency = 5; + + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_CALIBRATION_SETTINGS\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_CALIBRATION_SETTINGS, m_deviceCalibrationSettings, sizeof(CBrainampCalibrationSettings), nullptr, 0, + &m_nBytesReturned, nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not set calibration settings - got error " << size_t(GetLastError()) << "\n"; + CloseHandle(m_Device); + return false; + } + + // -- Configures device according to what has been enterd in the configuration dialog + + bool lowPassWarning = false; + float resolution[] = { 0.1F, 0.5F, 10.0F, 152.6F }; + + m_deviceSetup = new CBrainampSetup; + memset(m_deviceSetup, 0, sizeof(CBrainampSetup)); + m_deviceSetup->nChannel = m_headerAdapter.getChannelCount(); + m_deviceSetup->holdValue = 0x0; // Value without trigger + m_deviceSetup->nSamplePerSentBlock = nSamplePerSentBlock * m_decimationFactor; + m_deviceSetup->lowImpedance = uint8_t(m_impedance); + for (size_t j = 0, i = 0; i < m_header.getChannelCount(); ++i) + { + if (m_channelSelected[i] == Channel_Selected) + { + // Should I care about j being greater than + m_deviceSetup->channelLookup[j] = i; + m_deviceSetup->lowPassFilter[j] = + uint8_t(m_lowPassFilterFull[i] == Parameter_Default ? m_lowPass : m_lowPassFilterFull[i]); // 0 - 1000Hz, 1 - 250Hz + m_deviceSetup->resolution[j] = + uint8_t(m_resolutionFull[i] == Parameter_Default ? m_resolution + : m_resolutionFull[i]); // 0 - 100 nV, 1 - 500 nV, 2 - 10 uV, 3 - 152.6 uV + m_deviceSetup->dcCoupling[j] = uint8_t(m_dcCouplingFull[i] == Parameter_Default ? m_dcCoupling : m_dcCouplingFull[i]); // 0 - AC, 1 - DC + + m_resolutionFactor[j] = resolution[m_deviceSetup->resolution[j]]; + + if (!lowPassWarning && m_decimationFactor != 1 && (m_lowPass == LowPass_1000 || m_lowPassFilterFull[i] == LowPass_1000)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Using 1000 Hz low pass filter...\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Using a decimation factor of " << m_decimationFactor << " (resulting in " << + 5000 / m_decimationFactor << " Hz sampling rate)\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "This is probably not safe. Signal quality will suffer.\n"; + lowPassWarning = true; + } + + j++; + } + } + + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_SETUP\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_SETUP, m_deviceSetup, sizeof(CBrainampSetup), nullptr, 0, &m_nBytesReturned, nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not send setup parameters to device - got error " << size_t(GetLastError()) << "\n"; + CloseHandle(m_Device); + return false; + } + + // -- Allocates sample array and intermediate buffer + + m_sample = new float[m_headerAdapter.getChannelCount() * nSamplePerSentBlock]; + m_buffer = new int16_t[(m_headerAdapter.getChannelCount() + 1) * nSamplePerSentBlock * m_decimationFactor]; + if (!m_sample || !m_buffer) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not allocate memory for sample array / intermediate buffer\n"; + delete [] m_sample; + delete [] m_buffer; + m_sample = nullptr; + m_buffer = nullptr; + CloseHandle(m_Device); + return false; + } + + // -- Everything is up and ready to work + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + m_marker = 0; + + // -- Optionally starts impedance check + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Impedance " << (m_driverCtx.isImpedanceCheckRequested() ? "will" : "won't") << " be checked\n"; + if (m_driverCtx.isImpedanceCheckRequested()) { if (!this->startImpedanceCheck()) { return false; } } + + return true; +} + +bool CDriverBrainProductsBrainampSeries::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // -- Optionally stops impedance check + if (m_driverCtx.isImpedanceCheckRequested()) { if (!this->stopImpedanceCheck()) { return false; } } + + // -- Configures pull up/down for triggers + + uint16_t pullUp = 0; + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_DIGITALINPUT_PULL_UP\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_DIGITALINPUT_PULL_UP, &pullUp, sizeof(pullUp), nullptr, 0, &m_nBytesReturned, nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not switch pull up\n"; + CloseHandle(m_Device); + return false; + } + + // -- Starts acquisition + + uint32_t type = uint32_t(AcquisitionType_EEG); + // uint32_t type=uint32_t(AcquisitionType_TestSignal); + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_START\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_START, &type, sizeof(uint32_t), nullptr, 0, &m_nBytesReturned, nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not start acquisition\n"; + return false; + } + + return true; +} + +bool CDriverBrainProductsBrainampSeries::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted() && !m_driverCtx.isImpedanceCheckRequested()) { return true; } + + + // -- Gets error code from device + + uint32_t error = 0; + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_ERROR_STATE\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_ERROR_STATE, nullptr, 0, &error, sizeof(error), &m_nBytesReturned, nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not retrieve error state\n"; + return false; + } + + // -- Checks error code + + if (error != 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Received error state " << error << " from device\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Full error text :\n" << this->getErrorMessage(error) << "\n"; + return false; + } + + // -- Loops until the buffer is read + + do + { + // -- Reads intermediate buffer from device + + if (!ReadFile(m_Device, m_buffer, (m_headerAdapter.getChannelCount() + 1) * m_nSamplePerSentBlock * m_decimationFactor * sizeof(int16_t), + &m_nBytesReturned, nullptr)) + { + const uint32_t lastError = GetLastError(); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Could not read from device - Got error " << lastError << " " + << (lastError == ERROR_MORE_DATA ? "(buffer overflow)" : "") << "\n"; + return true; + } + + if (m_nBytesReturned == 0) { System::Time::sleep(2); } + } while (m_nBytesReturned == 0); + +#if 0 + // -- Gets buffer filling state + + static uint32_t lastBufferFillingState=0; + static uint32_t bufferFillingState=0; + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_BUFFERFILLING_STATE\n"; + if (!::DeviceIoControl(m_Device, BRAINAMP_BUFFERFILLING_STATE, nullptr, 0, &bufferFillingState, sizeof(bufferFillingState), &m_nBytesReturned, nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not retrieve buffer filling state\n"; + return false; + } + if(bufferFillingState!=lastBufferFillingState) + { + lastBufferFillingState=bufferFillingState; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Buffer filling state : " << bufferFillingState << "\n"; + } +#endif + + if (!m_driverCtx.isStarted()) + { + // -- Converts the intermediate buffer in instant impedances + const double scale = 1000 * (m_impedance == Impedance_High ? 2.1e-3 : 2.13219e-4); + for (size_t i = 0; i < m_headerAdapter.getChannelCount(); ++i) + { + int16_t minValue = 32767; + int16_t maxValue = -32767; + int16_t* buffer = m_buffer + i; + for (size_t j = 0; j < m_nSamplePerSentBlock * m_decimationFactor; ++j) + { + if (*buffer > maxValue) { maxValue = *buffer; } + if (*buffer < minValue) { minValue = *buffer; } + buffer += m_headerAdapter.getChannelCount() + 1; + } + m_impedances[i] = (maxValue - minValue) * scale - 1. + .5; + } + + // -- Backups this impedance in the impedance buffer and limit this buffer size + + m_impedanceBuffers.push_back(m_impedances); + if (m_impedanceBuffers.size() > m_impedanceCheckSignalFrequency) { m_impedanceBuffers.pop_front(); } + + // -- Averages the impedances over last measures and send them to the acquisition server + + for (size_t i = 0; i < m_headerAdapter.getChannelCount(); ++i) + { + double average = 0; + for (auto it = m_impedanceBuffers.begin(); it != m_impedanceBuffers.end(); ++it) { average += (*it)[i]; } + average /= m_impedanceBuffers.size(); + + m_driverCtx.updateImpedance(i, average); + } + } + else + { + // -- Converts the intermediate buffer in acquisition server convenient format + + float* samples = m_sample; + int16_t* buffer; + for (size_t i = 0; i < m_headerAdapter.getChannelCount(); ++i) + { + buffer = m_buffer + i; + for (size_t j = 0; j < m_nSamplePerSentBlock; ++j) + { + *samples = float(*buffer) * m_resolutionFactor[i]; + + samples += 1; + buffer += m_decimationFactor * (m_headerAdapter.getChannelCount() + 1); + } + } + + CStimulationSet stimSet; + buffer = m_buffer + m_headerAdapter.getChannelCount(); + for (size_t j = 0; j < m_nSamplePerSentBlock * m_decimationFactor; ++j) + { + uint32_t marker = *buffer; + marker ^= m_deviceSetup->holdValue; + if (marker != m_marker) + { + m_marker = marker; + stimSet.appendStimulation(OVTK_StimulationId_Label(m_marker), CTime(m_header.getSamplingFrequency() * m_decimationFactor, uint64_t(j)).time(), + 0); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Got stim code " << m_marker << " at sample " << j << "\n"; + } + buffer += m_headerAdapter.getChannelCount() + 1; + } + + // -- Sends data to the acquisition server + + m_callback->setSamples(m_sample, m_nSamplePerSentBlock); + m_callback->setStimulationSet(stimSet); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + + return true; +} + +bool CDriverBrainProductsBrainampSeries::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + // -- Stops acquisition + + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_STOP\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_STOP, nullptr, 0, nullptr, 0, &m_nBytesReturned, nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not stop acquisition\n"; + } + + // -- Optionally starts impedance check + + if (m_driverCtx.isImpedanceCheckRequested()) { if (!this->startImpedanceCheck()) { return false; } } + + return true; +} + +bool CDriverBrainProductsBrainampSeries::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // -- Optionally stops impedance check + + if (m_driverCtx.isImpedanceCheckRequested()) { if (!this->stopImpedanceCheck()) { return false; } } + + // -- Deletes device setup object + + delete m_deviceSetup; + m_deviceSetup = nullptr; + + // -- Closes handle to device + + CloseHandle(m_Device); + m_Device = nullptr; + + // -- Deletes sample array and intermediate buffer + + delete [] m_sample; + delete [] m_buffer; + m_sample = nullptr; + m_buffer = nullptr; + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverBrainProductsBrainampSeries::startImpedanceCheck() +{ + if (!m_driverCtx.isImpedanceCheckRequested()) { return true; } + + // Configures impedance frequency + + m_impedanceCheckSignalFrequency = 5000 / (m_nSamplePerSentBlock * m_decimationFactor); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Imepdance check sampling frequency set to " << m_impedanceCheckSignalFrequency << " Hz\n"; + + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_IMPEDANCE_FREQUENCY\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_IMPEDANCE_FREQUENCY, &m_impedanceCheckSignalFrequency, sizeof(uint32_t), nullptr, 0, &m_nBytesReturned, nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not set impedance frequency - got error " << size_t(GetLastError()) << "\n"; + return false; + } + + // Starts acquiring impedance signal + uint32_t type = uint32_t(AcquisitionType_Impedance); + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_START\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_START, &type, sizeof(uint32_t), nullptr, 0, &m_nBytesReturned, nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not start acquisition\n"; + return false; + } + + // Configures impedance group range + uint32_t group = (m_impedance == Impedance_High ? 0 : 1); + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_IMPEDANCE_GROUPRANGE\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_IMPEDANCE_GROUPRANGE, &group, sizeof(uint32_t), nullptr, 0, &m_nBytesReturned, nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could set impedance group range\n"; + return false; + } + + // Prepares impedance buffers + + m_impedances.resize(m_headerAdapter.getChannelCount()); + m_impedanceBuffers.clear(); + + return true; +} + +bool CDriverBrainProductsBrainampSeries::stopImpedanceCheck() +{ + if (!m_driverCtx.isImpedanceCheckRequested()) { return true; } + + // Stops impedance acquisition + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_STOP\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_STOP, nullptr, 0, nullptr, 0, &m_nBytesReturned, nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not stop acquisition\n"; + } + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverBrainProductsBrainampSeries::configure() +{ + CConfigurationBrainProductsBrainampSeries config( + *this, Directories::getDataDir() + "/applications/acquisition-server/interface-BrainProducts-BrainampSeries.ui", m_usbIdx, m_decimationFactor, + m_channelSelected, m_lowPassFilterFull, m_resolutionFull, m_dcCouplingFull, m_lowPass, m_resolution, m_dcCoupling, m_impedance); + + config.configure(m_header); + + m_settings.save(); + + m_header.setSamplingFrequency(5000 / m_decimationFactor); + return true; +} + +bool CDriverBrainProductsBrainampSeries::getDeviceDetails(const uint32_t index, uint32_t* nAmplifier, uint32_t* amplifierType) +{ + const char* name = ("\\\\.\\BrainAmpUSB" + std::to_string(index)).c_str(); + // -- Opens device + void* device = ::CreateFile(name, GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, nullptr); + if (device == INVALID_HANDLE_VALUE) { return false; } + + // -- Gets amplifiers type + uint16_t type[BrainAmp_MaximumAmplifierCount]; + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_AMPLIFIER_TYPE\n"; + if (!DeviceIoControl(device, BRAINAMP_AMPLIFIER_TYPE, nullptr, 0, type, sizeof(type), &m_nBytesReturned, nullptr)) + { + CloseHandle(device); + return false; + } + + // -- Closes device + CloseHandle(device); + + // -- Formats result + size_t count = BrainAmp_MaximumAmplifierCount; + for (size_t i = 0; i < BrainAmp_MaximumAmplifierCount; ++i) + { + if (amplifierType) { amplifierType[i] = type[i]; } + if (count == BrainAmp_MaximumAmplifierCount && type[i] == AmplifierType_None) { count = i; } + } + if (nAmplifier) { *nAmplifier = count; } + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.h new file mode 100644 index 0000000..28301de --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.h @@ -0,0 +1,142 @@ +/* + * Brain Products Brainamp Series driver for OpenViBE + * Copyright (C) 2010 INRIA - Author : Yann Renard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#if defined TARGET_OS_Windows + +#include "ovas_defines_brainamp_series.h" + +#include "ovasCConfigurationBrainProductsBrainampSeries.h" +#include "ovasCHeaderAdapterBrainProductsBrainampSeries.h" + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverBrainProductsBrainampSeries + * \author Mensia Technologies + */ +class CDriverBrainProductsBrainampSeries final : public IDriver +{ +public: + + friend class CConfigurationBrainProductsBrainampSeries; + + static char* getErrorMessage(uint32_t error); + + explicit CDriverBrainProductsBrainampSeries(IDriverContext& ctx); + void release() { delete this; } + const char* getName() override { return "Brain Products BrainAmp Series"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool start() override; + bool loop() override; + bool stop() override; + bool uninitialize() override; + + bool startImpedanceCheck(); + bool stopImpedanceCheck(); + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_headerAdapter; } + +protected: + + bool getDeviceDetails(uint32_t index, uint32_t* nAmplifier, uint32_t* amplifierType); + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + CHeaderAdapterBrainProductsBrainampSeries m_headerAdapter; + + void* m_Device = nullptr; + CBrainampSetup* m_deviceSetup = nullptr; + CBrainampCalibrationSettings* m_deviceCalibrationSettings = nullptr; + + uint32_t m_impedanceCheckSignalFrequency = 0; + uint32_t m_decimationFactor = 10; + uint32_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + int16_t* m_buffer = nullptr; + uint16_t m_marker = 0; + + std::list> m_impedanceBuffers; + std::vector m_impedances; + + unsigned long m_nBytesReturned; + + uint32_t m_usbIdx = 1; + float m_resolutionFactor[256]; + EParameter m_channelSelected[256]; + EParameter m_lowPassFilterFull[256]; + EParameter m_resolutionFull[256]; + EParameter m_dcCouplingFull[256]; + EParameter m_lowPass = LowPass_250; + EParameter m_resolution = Resolution_100nV; + EParameter m_dcCoupling = DCCouping_AC; + EParameter m_impedance = Impedance_Low; +}; + +inline std::ostream& operator<<(std::ostream& out, const EParameter& var) +{ + out << int(var); + return out; +} + +inline std::istream& operator>>(std::istream& in, EParameter& var) +{ + int tmp; + in >> tmp; + var = EParameter(tmp); + return in; +} + +inline std::ostream& operator<<(std::ostream& out, const EParameter var[256]) +{ + for (int i = 0; i < 256; ++i) { out << int(var[i]) << " "; } + return out; +} + +inline std::istream& operator>>(std::istream& in, EParameter var[256]) +{ + int tmp; + for (int i = 0; i < 256; ++i) + { + in >> tmp; + var[i] = EParameter(tmp); + } + + return in; +} +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.cpp new file mode 100644 index 0000000..30bd496 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.cpp @@ -0,0 +1,51 @@ +/* + * Brain Products Brainamp Series driver for OpenViBE + * Copyright (C) 2010 INRIA - Author : Yann Renard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "ovasCHeaderAdapterBrainProductsBrainampSeries.h" + +#if defined TARGET_OS_Windows + +namespace OpenViBE { +namespace AcquisitionServer { + +size_t CHeaderAdapterBrainProductsBrainampSeries::getChannelCount() const +{ + size_t j = 0; + for (size_t i = 0; i < m_header.getChannelCount(); ++i) { if (m_ChannelSelected[i] == Channel_Selected) { j++; } } + return j; +} + +const char* CHeaderAdapterBrainProductsBrainampSeries::getChannelName(const size_t index) const +{ + size_t j = 0; + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + if (m_ChannelSelected[i] == Channel_Selected) + { + if (j == index) { return m_header.getChannelName(i); } + j++; + } + } + return ""; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.h new file mode 100644 index 0000000..3de6db5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.h @@ -0,0 +1,49 @@ +/* + * Brain Products Brainamp Series driver for OpenViBE + * Copyright (C) 2010 INRIA - Author : Yann Renard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#pragma once + +#include "../ovasCHeader.h" + +#if defined TARGET_OS_Windows + +#include "ovas_defines_brainamp_series.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class CHeaderAdapterBrainProductsBrainampSeries final : public CHeaderAdapter +{ +public: + + CHeaderAdapterBrainProductsBrainampSeries(IHeader& adaptedHeader, EParameter* channelSelected) + : CHeaderAdapter(adaptedHeader), m_ChannelSelected(channelSelected) {} + + bool setChannelCount(const size_t /*nChannel*/) override { return false; } + bool setChannelName(const size_t /*index*/, const char* /*name*/) override { return false; } + + size_t getChannelCount() const override; + const char* getChannelName(const size_t index) const override; + + EParameter* m_ChannelSelected = nullptr; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovas_defines_brainamp_series.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovas_defines_brainamp_series.h new file mode 100644 index 0000000..6e16bd2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovas_defines_brainamp_series.h @@ -0,0 +1,204 @@ +#pragma once + +// __________________________________________________________________// +// // +// File created from BrainAmpIoCtl.h in Brain Products low level SDK // +// More compliant with OpenViBE coding rules // +// __________________________________________________________________// +// // + +// Send setup, Parameter [IN]: BA_SETUP struct. +#define BRAINAMP_SETUP CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Start acquisition, Parameter [IN]: long nType, 0 = Impedance check, 1 = Data aquisition, 2 = test signal +#define BRAINAMP_START CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Stop acquisition +#define BRAINAMP_STOP CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Get buffer filling state, Parameter [OUT]: long nState, < 0 = Overflow, 0 - 100 = Filling state in percent. +#define BRAINAMP_BUFFERFILLING_STATE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED, FILE_READ_DATA) + +// Get battery voltage of one unit, Parameter [IN]: USHORT nUnit, Parameter [OUT]: long nVoltage in millivolts +#define BRAINAMP_BATTERY_VOLTAGE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED, FILE_WRITE_DATA | FILE_READ_DATA) + +// Set impedance check sine wave frequency, Parameter [IN]: LONG nFrequency in Hertz +#define BRAINAMP_IMPEDANCE_FREQUENCY CTL_CODE(FILE_DEVICE_UNKNOWN, 0x806, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Set impedance test mode, i.e. even in recording mode, the amplifier is still in impedance check mode +// Parameter [IN]: long bTestMode, != 0 testmode, 0 normal mode +#define BRAINAMP_IMPEDANCE_TESTMODE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x807, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Set impedance group and range +// Parameter [IN]: long nGroupRange, 0 = 100kOhm Data (IMP1 | CAL), 1 = 10kOhm Data (IMP1), +// 2 = 100 kOhm Reference (IMP2 | CAL), 3 = 10 kOhm Reference (IMP2) +// 4 = Ground (IMP2) +#define BRAINAMP_IMPEDANCE_GROUPRANGE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x808, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Get error state, Parameter [OUT]: long nState, +// Highword (amplifier): Bit 0 - 3: amplifier number(s) +// Loword: (error code): 0 = no error, 1 = loss lock, 2 = low power, +// 3 = can't establish communication at start. +// 4 = synchronisation error +#define BRAINAMP_ERROR_STATE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x809, METHOD_BUFFERED, FILE_READ_DATA) + +// Disable DC offset correction for testing purposes. +// Parameter [IN]: long bTestMode, != 0 DC offset correction off, 0 normal mode +#define BRAINAMP_DCOFFSET_TESTMODE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80A, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Send calibration settings, Parameter [IN]: BA_CALIBRATION_SETTINGS struct. +#define BRAINAMP_CALIBRATION_SETTINGS CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80B, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Set pullup/pulldown resistors for the digital input (default is pulldown). +// This can not be done for each bit, but for 2 groups. +// Parameter [IN]: USHORT bPullup, (low byte for bit 0 - 7, high byte for bit 8 - 15) +// != 0 pullup, 0 pulldown +#define BRAINAMP_DIGITALINPUT_PULL_UP CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80C, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Get digital input value, Parameter [OUT]: USHORT nValue +#define BRAINAMP_DIGITALINPUT_VALUE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80D, METHOD_BUFFERED, FILE_READ_DATA) + +// Get driver version, Parameter [OUT]: ULONG nValue +// The version is coded as Major.Minor.DLL. +// The "DLL" part is used for intermediate versions and contains 4 digits. +// The minor part contains 2 digits. +// The number 1010041 for example means version 1.01.0041. +// If the highest bit (bit 31) is set, it means "test version". +#define BRAINAMP_DRIVERVERSION CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80E, METHOD_BUFFERED, FILE_READ_DATA) + +// Send Commands during recording +// Parameter [IN]: USHORT nCommand (1 = DC Correction), USHORT nChannel (-1 = all channels) +#define BRAINAMP_COMMAND CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80F, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Set Control register directly (WRCON) +// Parameter [IN]: USHORT nAddress, ulong[4] channel mask +#define BRAINAMP_CONTROLREGISTER CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Set DC offset value for potentiometer A (coarse) +// Parameter [IN]: USHORT nChannel, UCHAR nValue +#define BRAINAMP_DCOFFSET_COARSE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Do DC Offset correction for potentiometer A (coarse) +#define BRAINAMP_DCOFFSET_CORRECTION_COARSE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x812, METHOD_NEITHER, FILE_WRITE_DATA) + +// Set DC offset value for potentiometer B (fine) +// Parameter [IN]: USHORT nChannel, UCHAR nValue +#define BRAINAMP_DCOFFSET_FINE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x813, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Do DC Offset correction for potentiometer B (fine) +#define BRAINAMP_DCOFFSET_CORRECTION_FINE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x814, METHOD_NEITHER, FILE_WRITE_DATA) + +// Set Cal, Imp1, and Imp2 lines (testing only!) +// Parameter [IN]: BYTE Cal, BYTE, Imp1, Byte Imp2 +#define BRAINAMP_SET_CAL_IMP_LINES CTL_CODE(FILE_DEVICE_UNKNOWN, 0x815, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Get amplifier type of all 4 units, +// Parameter [IN]: USHORT nUnit, Parameter [OUT]: USHORT Type[4]: 0 no Amp, 1 BrainAmp, 2 MR, 3 DC +#define BRAINAMP_AMPLIFIER_TYPE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x816, METHOD_BUFFERED, FILE_WRITE_DATA | FILE_READ_DATA) + +// Do DC Offset correction, no parameters +#define BRAINAMP_DCOFFSET_CORRECTION CTL_CODE(FILE_DEVICE_UNKNOWN, 0x817, METHOD_NEITHER, FILE_WRITE_DATA) + +// Retrieve serial number of device. Parameter [OUT]: ULONG +#define BRAINAMP_GET_SERIALNUMBER CTL_CODE(FILE_DEVICE_UNKNOWN, 0x818, METHOD_BUFFERED, FILE_READ_DATA) + +// Retrieve number of supported amplifiers for the device. Parameter [OUT]: USHORT +#define BRAINAMP_GET_SUPPORTED_AMPLIFIERS CTL_CODE(FILE_DEVICE_UNKNOWN, 0x819, METHOD_BUFFERED, FILE_READ_DATA) + +// Prestart, used only if more than one device is involved. +#define BRAINAMP_PRESTART CTL_CODE(FILE_DEVICE_UNKNOWN, 0x81a, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Poststart, used only if more than one device is involved. +#define BRAINAMP_POSTSTART CTL_CODE(FILE_DEVICE_UNKNOWN, 0x81b, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Disable busmastering +#define BRAINAMP_DISABLE_BUSMASTERING CTL_CODE(FILE_DEVICE_UNKNOWN, 0x81c, METHOD_BUFFERED, FILE_WRITE_DATA) + +namespace OpenViBE { +namespace AcquisitionServer { +#pragma pack(1) + +// Brainamp Setup +typedef struct +{ + uint32_t nChannel; // Number of channels - was /*long*/ + uint8_t channelLookup[256]; // Channel lookup table, -1 to -8 means PolyBox channels - was /*CHAR*/ + uint32_t nSamplePerSentBlock; // Number of points per block - was /*long*/ + uint16_t holdValue; // Hold value for digital input - was /*USHORT*/ + + // Version 1.01.0003 and higher + // The following tables are based on logical channel positions + uint8_t lowPassFilter[256]; // Low pass 250 Hz (0 = 1000Hz) - was /*UCHAR*/ + uint8_t resolution[256]; // 0 = 100 nV, 1 = 500 nV, 2 = 10 uV, 3 = 152.6 uV - was /*UCHAR*/ + uint8_t dcCoupling[256]; // DC coupling (0 = AC) - was /*UCHAR*/ + uint8_t lowImpedance; // Low impedance i.e. 10 MOhm, (0 = > 100MOhm) - was /*UCHAR*/ +} CBrainampSetup; + +// Brainamp Calibration Settings (default: square waves, 5 Hz) +typedef struct +{ + uint16_t waveForm; // 0 = ramp, 1 = triangle, 2 = square, 3 = sine wave - was /*USHORT*/ + uint32_t frequency; // Frequency in millihertz - was /*ULONG*/ +} CBrainampCalibrationSettings; + +#pragma pack() + +// Brainamp Parameter Types +typedef enum +{ + Parameter_Default=-1, + + Channel_Unselected=0, + Channel_Selected=1, + + DecimationFactor_None=0, + DecimationFactor_2=1, + DecimationFactor_4=2, + DecimationFactor_5=3, + DecimationFactor_8=4, + DecimationFactor_10=5, + + LowPass_1000=0, + LowPass_250=1, + + Resolution_100nV=0, + Resolution_500nV=1, + Resolution_10uV=2, + Resolution_152uV=3, + + DCCouping_AC=0, + DCCouping_DC=1, + + Impedance_High=0, + Impedance_Low=1, + + AcquisitionType_Impedance=0, + AcquisitionType_EEG=1, + AcquisitionType_TestSignal=2, + + WaveForm_Ramp=0, + WaveForm_Triangle=1, + WaveForm_Square=2, + WaveForm_SineWave=3, + + AmplifierType_None=0, + AmplifierType_BrainAmp=1, + AmplifierType_BrainAmpMR=2, + AmplifierType_BrainAmpDC=3, +} EParameter; + +inline const char* getDeviceType(const uint32_t type) +{ + switch (type) + { + case AmplifierType_None: return "-- Not found --"; + case AmplifierType_BrainAmp: return "BrainAmp Standard"; + case AmplifierType_BrainAmpMR: return "BrainAmp MR"; + case AmplifierType_BrainAmpDC: return "BrainAmp DC / MR Plus"; + default: return "-- Unknown --"; + } +} + +#define BrainAmp_MaximumAmplifierCount 4 +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.cpp new file mode 100644 index 0000000..8470864 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.cpp @@ -0,0 +1,142 @@ +/* + * Brain Products LiveAmp driver for OpenViBE + * Copyright (C) 2017 Brain Products - Author : Ratko Petrovic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +/********************************************************************* +* History +* [2017-03-29] ver 1.0 - RP +* [2017-05-02] ver 1.1 Due to support for LiveAmp 8 and 16 channels, +* a new variable "m_nBip" added - RP +* +*********************************************************************/ + +#if defined TARGET_HAS_ThirdPartyLiveAmpAPI + +#include "ovasCConfigurationBrainProductsLiveAmp.h" +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +/*_________________________________________________ + +Insert callback to specific widget here +Example with a button that launch a calibration of the device: + +//Callback connected to a dedicated gtk button: +static void button_calibrate_pressed_cb(GtkButton* button, void* data) +{ + CConfigurationBrainProductsLiveAmp* config=static_cast(data); + config->buttonCalibratePressedCB(); +} +_________________________________________________*/ + +// If you added more reference attribute, initialize them here +CConfigurationBrainProductsLiveAmp::CConfigurationBrainProductsLiveAmp( + CDriverBrainProductsLiveAmp& ctx, const char* gtkBuilderFilename, uint32_t& physicalSampling, + uint32_t& rCountEEG, uint32_t& rCountBip, uint32_t& rCountAUX, uint32_t& rCountACC, bool& rUseAccChannels, + uint32_t& goodImpedanceLimit, uint32_t& badImpedanceLimit, std::string& sSerialNumber, bool& rUseBipolarChannels) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx), m_physicalSampling(physicalSampling), m_nEEG(rCountEEG) + , m_nBip(rCountBip), m_nAUX(rCountAUX), m_nACC(rCountACC), m_useAccChannels(rUseAccChannels), m_useBipolarChannels(rUseBipolarChannels) + , m_goodImpedanceLimit(goodImpedanceLimit), m_badImpedanceLimit(badImpedanceLimit), m_nEEGChannels(rCountEEG), m_nAUXChannels(rCountAUX) + , m_triggers(badImpedanceLimit), m_sSerialNumber(sSerialNumber) {} + +bool CConfigurationBrainProductsLiveAmp::preConfigure() +{ + if (! CConfigurationBuilder::preConfigure()) { return false; } + + m_tSerialNumber = GTK_ENTRY(gtk_builder_get_object(m_builder, "entrySerialNr")); + m_comboBoxPhysicalSampleRate = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")); + + m_buttonNEEGChannels = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_number_of_channels")); + m_buttonNBipolar = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_number_of_bipolar")); + m_buttonNAUXChannels = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spbBtnAUXchn")); + + m_enableACCChannels = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_acc")); + m_enableBipolarChannels = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_use_bipolar_channels")); + + if (gtk_builder_get_object(m_builder, "checkbutton_impedance")) + { + m_impedanceCheck = GTK_WIDGET(gtk_builder_get_object(m_builder, "checkbutton_impedance")); + } + + m_buttonGoodImpedanceLimit = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_good_imp")); + m_buttonBadImpedanceLimit = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_bad_imp")); + + // Connect here all callbacks + // Example: + // g_signal_connect(gtk_builder_get_object(m_builder, "button_calibrate"), "pressed", G_CALLBACK(button_calibrate_pressed_cb), this); + + // Insert here the pre-configure code. + // For example, you may want to check if a device is currently connected + // and if more than one are connected. Then you can list in a dedicated combo-box + // the device currently connected so the user can choose which one he wants to acquire from. + gtk_entry_set_text(m_tSerialNumber, m_sSerialNumber.c_str()); + gtk_combo_box_set_active(m_comboBoxPhysicalSampleRate, m_physicalSampling); + gtk_spin_button_set_value(m_buttonNEEGChannels, m_nEEG); + gtk_spin_button_set_value(m_buttonNBipolar, m_nBip); + gtk_spin_button_set_value(m_buttonNAUXChannels, m_nAUX); + gtk_spin_button_set_value(m_buttonGoodImpedanceLimit, m_goodImpedanceLimit); + gtk_spin_button_set_value(m_buttonBadImpedanceLimit, m_badImpedanceLimit); + gtk_toggle_button_set_active(m_enableACCChannels, m_useAccChannels); + + return true; +} + +bool CConfigurationBrainProductsLiveAmp::postConfigure() +{ + if (m_applyConfig) + { + // If the user pressed the "apply" button, you need to save the changes made in the configuration. + // For example, you can save the connection ID of the selected device: + // m_connectionID = + gtk_spin_button_update(GTK_SPIN_BUTTON(m_buttonGoodImpedanceLimit)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_buttonGoodImpedanceLimit)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_buttonNEEGChannels)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_buttonNBipolar)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_buttonNAUXChannels)); + + const char* serialNumber = gtk_entry_get_text(m_tSerialNumber); + m_sSerialNumber.assign(serialNumber, strlen(serialNumber)); + + + m_physicalSampling = gtk_combo_box_get_active(m_comboBoxPhysicalSampleRate); + GtkTreeModel* widget = gtk_combo_box_get_model(m_comboBoxPhysicalSampleRate); + + m_nEEG = uint32_t(gtk_spin_button_get_value(m_buttonNEEGChannels)); + m_nBip = uint32_t(gtk_spin_button_get_value(m_buttonNBipolar)); + m_nAUX = uint32_t(gtk_spin_button_get_value(m_buttonNAUXChannels)); + + m_useAccChannels = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_enableACCChannels)) != 0; + + if (m_useAccChannels) { m_nACC = 3; } // can be 3 or 6 + else { m_nACC = 0; } + + m_goodImpedanceLimit = uint32_t(gtk_spin_button_get_value(m_buttonGoodImpedanceLimit)); + m_badImpedanceLimit = uint32_t(gtk_spin_button_get_value(m_buttonBadImpedanceLimit)); + } + + // normal header is filled (Subject ID, Age, Gender, channels, sampling frequency), ressources are realesed + if (! CConfigurationBuilder::postConfigure()) { return false; } + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyLiveAmpAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.h new file mode 100644 index 0000000..614e071 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.h @@ -0,0 +1,76 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyLiveAmpAPI + +#include "../ovasCConfigurationBuilder.h" +#include "ovasCDriverBrainProductsLiveAmp.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationBrainProductsLiveAmp + * \author Ratko Petrovic (Brain Products GmbH) + * \date Mon Nov 21 14:57:37 2016 + * \brief The CConfigurationBrainProductsLiveAmp handles the configuration dialog specific to the Brain Products LiveAmp device. + * + * TODO: details + * + * \sa CDriverBrainProductsLiveAmp + */ +class CConfigurationBrainProductsLiveAmp final : public CConfigurationBuilder +{ +public: + // you may have to add to your constructor some reference parameters + // for example, a connection ID: + CConfigurationBrainProductsLiveAmp( + CDriverBrainProductsLiveAmp& ctx, const char* gtkBuilderFilename, uint32_t& physicalSampling, + uint32_t& rCountEEG, uint32_t& rCountBip, uint32_t& rCountAUX, uint32_t& rCountACC, bool& rUseAccChannels, + uint32_t& goodImpedanceLimit, uint32_t& badImpedanceLimit, std::string& sSerialNumber, bool& rUseBipolarChannels); + + bool preConfigure() override; + bool postConfigure() override; + +protected: + CDriverBrainProductsLiveAmp& m_driverCtx; + + uint32_t& m_physicalSampling; + uint32_t& m_nEEG; + uint32_t& m_nBip; + uint32_t& m_nAUX; + uint32_t& m_nACC; + bool& m_useAccChannels; + bool& m_useBipolarChannels; + + uint32_t& m_goodImpedanceLimit; + uint32_t& m_badImpedanceLimit; + uint32_t& m_nEEGChannels; + uint32_t& m_nAUXChannels; + uint32_t& m_triggers; + std::string& m_sSerialNumber; + + GtkWidget* m_imageErrorIcon = nullptr; + GtkLabel* m_labelErrorMessage = nullptr; + GtkButton* m_buttonErrorDLLLink = nullptr; + GtkSpinButton* m_buttonDeviceId = nullptr; + GtkComboBox* m_comboBoxMode = nullptr; + GtkComboBox* m_comboBoxPhysicalSampleRate = nullptr; + GtkComboBox* m_comboBoxADCDataFilter = nullptr; + GtkComboBox* m_comboBoxADCDataDecimation = nullptr; + GtkSpinButton* m_buttonActiveShieldGain = nullptr; + GtkToggleButton* m_buttonUseAuxChannels = nullptr; + GtkSpinButton* m_buttonGoodImpedanceLimit = nullptr; + GtkSpinButton* m_buttonBadImpedanceLimit = nullptr; + + GtkSpinButton* m_buttonNEEGChannels = nullptr; + GtkSpinButton* m_buttonNBipolar = nullptr; + GtkSpinButton* m_buttonNAUXChannels = nullptr; + GtkToggleButton* m_enableACCChannels = nullptr; + GtkToggleButton* m_enableBipolarChannels = nullptr; + GtkEntry* m_tSerialNumber = nullptr; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyLiveAmpAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.cpp new file mode 100644 index 0000000..d19cbf8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.cpp @@ -0,0 +1,1055 @@ +/* + * Brain Products LiveAmp driver for OpenViBE + * Copyright (C) 2017 Brain Products - Author : Ratko Petrovic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +/********************************************************************* +* History +* [2017-03-29] ver 1.0 - RP +* [2017-04-04] ver 1.1 Cosmetic changes: int/uint32_t, static_cast<>... - RP +* Function loop: optimized buffer copying. +* [2017-04-28] ver 1.2 LiveAmp8 and LiveAmp16 channles support added. - RP +* Introduced checking of Bipolar channels. +* +*********************************************************************/ +#if defined TARGET_HAS_ThirdPartyLiveAmpAPI + +#include "ovasCDriverBrainProductsLiveAmp.h" +#include "ovasCConfigurationBrainProductsLiveAmp.h" + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverBrainProductsLiveAmp::CDriverBrainProductsLiveAmp(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_BrainProductsLiveAmp", m_driverCtx.getConfigurationManager()) +{ + // set default sampling rates: + m_samplings.push_back(250); + m_samplings.push_back(500); + m_samplings.push_back(1000); + + m_header.setSamplingFrequency(250); // init for the first time + + // The following class allows saving and loading driver settings from the acquisition server .conf file + m_settings.add("EEGchannels", &m_nEEG); + m_settings.add("AUXchannels", &m_nAux); + m_settings.add("ACCchannels", &m_nACC); + m_settings.add("BipolarChannels", &m_nBipolar); + m_settings.add("IncludeACC", &m_useAccChannels); + + m_settings.add("SerialNr", &m_sSerialNumber); + m_settings.add("GoodImpedanceLimit", &m_goodImpedanceLimit); + m_settings.add("BadImpedanceLimit", &m_badImpedanceLimit); + m_settings.add("Header", &m_header); + m_settings.add("UseBipolarChannels", &m_useBipolarChannels); //m_settings.add("SettingName", &variable); + + // To save your custom driver settings, register each variable to the SettingsHelper + m_settings.load(); + + m_physicalSampling = m_header.getSamplingFrequency(); + m_header.setChannelCount(m_nEEG + m_nBipolar + m_nAux + m_nACC); +} + +//___________________________________________________________________// +// // +bool CDriverBrainProductsLiveAmp::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_nSamplePerSentBlock = nSamplePerSentBlock; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "[INIT] LiveAmp initialization has been started. " << "\n"; + + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "[INIT] LiveAmp initialization process is running, please wait..." << "\n"; + + // Builds up a buffer to store + // acquired samples. This buffer + // will be sent to the acquisition + // server later... + if (m_sampleBuffer != nullptr) + { + delete [] m_sampleBuffer; + m_sampleBuffer = nullptr; + } + + // ... + // initialize hardware and get + if (!initializeLiveAmp()) { return false; } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "[INIT] LiveAmp successfully initialized! \n"; + + if (!configureLiveAmp() || !checkAvailableChannels() || !disableAllAvailableChannels() + ) { return false; } // must disable all channels, than enable only one that will be used. + if (!getChannelIndices() || !configureImpedanceMessure()) { return false; } + + // check if the impedance checking is possible: + if (m_driverCtx.isImpedanceCheckRequested()) + { + if (m_nEEG > 0) + { + int type = -1; + const int res = ampGetProperty(m_handle, PG_CHANNEL, 0, CPROP_I32_Electrode, &type, sizeof(type)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[configure] GetProperty type error: " << res << "\n"; + return false; + } + + /*if(type == EL_ACTIVE) + { + m_header.setImpedanceCheckRequested (false); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "[configure] Cannot provide impedance checking with attached electrodes! \n"; + }*/ + } + } + + if (!m_driverCtx.isImpedanceCheckRequested()) + { + // calculate what size has each "sample" + m_sampleSize = getLiveAmpSampleSize(); + if (m_nEnabledChannels != m_nUsedChannels) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "m_nUsedChannels: " << m_nUsedChannels << " != m_nEnabledChannels= " + << m_nEnabledChannels << "\n"; + } + + m_bufferSize = 1000 * m_sampleSize; + m_sampleBuffer = new uint8_t[m_bufferSize]; + } + else + { + m_sampleSize = m_impedanceChannels * sizeof(float); + + m_bufferSize = 1000 * m_sampleSize; + m_sampleBuffer = new uint8_t[m_bufferSize]; + + const int res = ampStartAcquisition(m_handle); + if (res != AMP_OK) { m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " [Impedance] Device Handle = NULL.\n"; } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Impedance Acquisition started...\n"; + } + + m_sendBuffers.clear(); + + m_samples.clear(); + m_samples.resize(m_header.getChannelCount());// allocate for all analog signals / channels + + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; +} + + +bool CDriverBrainProductsLiveAmp::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "START called.\n"; + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_handle == nullptr) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Device Handle = NULL.\n"; } + + int res = ampGetProperty(m_handle, PG_DEVICE, 0, DPROP_I32_RecordingMode, &m_iRecordingMode, sizeof(m_iRecordingMode)); + if (m_iRecordingMode != RM_NORMAL) + { + res = ampStopAcquisition(m_handle); + if (res != AMP_OK) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [start] ampStopAcquisition error code = " << res << "\n"; } + + m_iRecordingMode = RM_NORMAL; + res = ampSetProperty(m_handle, PG_DEVICE, 0, DPROP_I32_RecordingMode, &m_iRecordingMode, sizeof(m_iRecordingMode)); + if (res != AMP_OK) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [start] ampSetProperty mode error code = " << res << "\n"; } + + // calculate what size has each "sample" + m_sampleSize = getLiveAmpSampleSize(); + if (m_nEnabledChannels != m_nUsedChannels) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Used Channels: " << m_nUsedChannels << " != Enabled Channels= " << m_nEnabledChannels << "\n"; + } + delete [] m_sampleBuffer; + m_sampleBuffer = nullptr; + + m_bufferSize = 1000 * m_sampleSize; + m_sampleBuffer = new BYTE[m_bufferSize]; + m_sendBuffers.clear(); + m_samples.clear(); + m_samples.resize(m_header.getChannelCount());// allocate for all analog signals / channels + } + + res = ampStartAcquisition(m_handle); + if (res != AMP_OK) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [start] ampStartAcquisition error code = " << res << "\n"; } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Acquisition started...\n"; + + return true; +} + +bool CDriverBrainProductsLiveAmp::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + + if (m_driverCtx.isStarted()) + { + //CStimulationSet stimSet; + std::vector> buffers(1, std::vector(1)); + + while (true) + { + // receive samples from hardware + // put them the correct way in the sample array + // whether the buffer is full, send it to the acquisition server + const int samplesRead = ampGetData(m_handle, m_sampleBuffer, m_bufferSize, 0); + if (samplesRead < 1) { return true; } + + const size_t nLocChannel = m_header.getChannelCount(); + + liveAmpExtractData(samplesRead, buffers); + + const size_t nSample = size_t(samplesRead) / m_sampleSize; + for (size_t sample = 0; sample < nSample; ++sample) + { + std::vector buffer(m_nUsedChannels); + for (size_t ch = 0; ch < m_nUsedChannels; ++ch) { buffer[ch] = buffers[sample][ch]; } // access only with available indices + m_sendBuffers.push_back(buffer); + } + + const int readToSend = int(m_sendBuffers.size()) - int(m_nSamplePerSentBlock); // must check buffer size in that way !!! + if (readToSend > 0) + { + // for debug only: m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "[info] Buffer size = " << m_sendBuffers.size() << "\n"; + m_samples.clear(); + m_samples.resize(nLocChannel * m_nSamplePerSentBlock); + + for (size_t ch = 0, i = 0; ch < m_header.getChannelCount(); ++ch) + { + for (size_t sample = 0; sample < m_nSamplePerSentBlock; ++sample) { m_samples[i++] = m_sendBuffers[sample][ch]; } + } + + // receive events from hardware + // and put them the correct way in a CStimulationSet object + //m_callback->setStimulationSet(stimSet); + for (size_t sample = 0; sample < m_nSamplePerSentBlock; ++sample) + { // check triggers: + for (size_t t = 0; t < m_triggerIndices.size(); ++t) + { + const uint16_t trigg = uint16_t(m_sendBuffers[sample][m_triggerIndices[t]]); + if (trigg != m_lastTriggerStates[t]) + { + const uint64_t time = CTime(m_header.getSamplingFrequency(), sample).time(); + m_stimSet.appendStimulation(OVTK_StimulationId_Label(trigg), time, 0); // send the same time as the 'sample' + m_lastTriggerStates[t] = trigg; + } + } + } + + // send acquired data... + m_callback->setSamples(&m_samples[0], m_nSamplePerSentBlock); + m_callback->setStimulationSet(m_stimSet); + + m_samples.clear(); + m_stimSet.clear(); + // When your sample buffer is fully loaded, + // it is advised to ask the acquisition server + // to correct any drift in the acquisition automatically. + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + + // delete sent samples + m_sendBuffers.erase(m_sendBuffers.begin(), m_sendBuffers.begin() + m_nSamplePerSentBlock); + break; + } + if (m_bSimulationMode) { Sleep(100); } + } + } + else if (m_driverCtx.isImpedanceCheckRequested()) //impedance measurement + { + if (m_iRecordingMode != RM_IMPEDANCE) { return true; } // go out of the loop + + std::vector> buffers(1, std::vector(1)); + const uint32_t samplesRead = ampGetImpedanceData(m_handle, m_sampleBuffer, m_bufferSize); + if (samplesRead < 1) { return true; } + + liveAmpExtractImpedanceData(samplesRead, buffers); + + const size_t nMeasuredChannels = (m_impedanceChannels - 2) / + 2; // GND, REF and pairs of ch+ and ch-, countOfMeasuredChannles can be different than m_header.getChannelCount() + + const uint32_t nSample = samplesRead / m_sampleSize; + for (uint32_t sample = 0; sample < nSample; ++sample) + { + // must extract impedance values for each cEEG channel, and or Bipolar channel + for (uint32_t ch = 0; ch < nMeasuredChannels; ++ch) + { + int type; + int res = ampGetProperty(m_handle, PG_CHANNEL, ch, CPROP_I32_Type, &type, sizeof(type)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[ImpMeas] GetProperty type error: " << res << "\n"; + break; + } + + if (type == CT_EEG) { m_driverCtx.updateImpedance(ch, buffers[sample][2 * (ch + 1)]); } + else if (type == CT_BIP) { m_driverCtx.updateImpedance(ch, buffers[sample][2 * (ch + 1)] - buffers[sample][2 * (ch + 1) + 1]); } + } + } + } + + return true; +} + +bool CDriverBrainProductsLiveAmp::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + // ... + // request the hardware to stop + // sending data + // ... + if (m_handle != nullptr) + { + const int res = ampStopAcquisition(m_handle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "'stop' called. stopping the acquisition:" << res << "\n"; + } + + return true; +} + +bool CDriverBrainProductsLiveAmp::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // ... + // uninitialize hardware here + // ... + if (m_handle != nullptr) + { + int res = ampStopAcquisition(m_handle); + if (res != AMP_OK) { m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Uninitialized called. stopping acquisition:" << res << "\n"; } + + res = ampCloseDevice(m_handle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Uninitialized called. Closing the device:" << res << "\n"; + } + + + delete [] m_sampleBuffer; + m_sampleBuffer = nullptr; + m_callback = nullptr; + m_samples.clear(); + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverBrainProductsLiveAmp::isConfigurable() +{ + return true; // change to false if your device is not configurable +} + +bool CDriverBrainProductsLiveAmp::configure() +{ + // get sampling rate index: + uint32_t sampRateIndex = -1; + for (uint32_t i = 0; i < m_samplings.size(); ++i) { if (m_physicalSampling == m_samplings[i]) { sampRateIndex = i; } } + + + // Change this line if you need to specify some references to your driver attribute that need configuration, e.g. the connection ID. + CConfigurationBrainProductsLiveAmp config(*this, Directories::getDataDir() + "/applications/acquisition-server/interface-BrainProductsLiveAmp.ui", + sampRateIndex, m_nEEG, m_nBipolar, m_nAux, m_nACC, m_useAccChannels, + m_goodImpedanceLimit, m_badImpedanceLimit, m_sSerialNumber, m_useBipolarChannels); + + if (!config.configure(m_header)) { return false; } + + // update sampling rate + if (sampRateIndex >= 0 && sampRateIndex < m_samplings.size()) { m_physicalSampling = m_samplings[sampRateIndex]; } + + m_header.setSamplingFrequency(m_physicalSampling); + m_header.setChannelCount(m_nEEG + m_nBipolar + m_nAux + m_nACC); + + m_settings.save(); + + return true; +} + + +bool CDriverBrainProductsLiveAmp::initializeLiveAmp() +{ + HANDLE hlocDevice = nullptr; + char hwi[20]; + strcpy_s(hwi, "ANY"); // use word SIM to simulate the LiveAmp + std::string serialN(m_sSerialNumber); + + if (strcmp(hwi, "SIM") == 0) + { + m_bSimulationMode = true; + serialN = "054201-0001"; // 32 channels + //serialN = "054201-0010"; // 64 channels + } + + if (m_handle != nullptr) + { + ampCloseDevice(m_handle); + m_handle = nullptr; + } + + // dialog window doesn't show all meassage, due to threading problems. The information will be seen in Dialog title. + GtkWindow* window = GTK_WINDOW(gtk_window_new (GTK_WINDOW_TOPLEVEL)); + GtkWidget* dialog = gtk_message_dialog_new(window, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_NONE, + " Connecting to LiveAmp, wait some seconds please ... "); + gtk_window_set_title(GTK_WINDOW(dialog), " Connecting to LiveAmp, please wait..."); + + gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); + gtk_widget_show_all(dialog); + + + int res = ampEnumerateDevices(hwi, sizeof(hwi), "LiveAmp", 0); + if (res == 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[InitializeLiveAmp] No LiveAmp connected! \n"; + gtk_widget_destroy(dialog); + return false; + } + if (res < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[InitializeLiveAmp] Error by LiveAmp initialization; error code= " << res << "\n"; + gtk_widget_destroy(dialog); + return false; + } + const int numDevices = res; + for (int i = 0; i < numDevices; ++i) + { + hlocDevice = nullptr; + res = ampOpenDevice(i, &hlocDevice); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[InitializeLiveAmp] Cannot open device # " << i << "; error code = " << res << "\n"; + gtk_widget_destroy(dialog); + return false; + } + + char sVar[20]; + res = ampGetProperty(hlocDevice, PG_DEVICE, i, DPROP_CHR_SerialNumber, sVar, sizeof(sVar)); // get serial number + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[InitializeLiveAmp] Cannot read Serial number from device # " << i << "; error code = " + << res << "\n"; + gtk_widget_destroy(dialog); + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "[InitializeLiveAmp] Serial number = " << sVar << "\n"; + + const int check = strcmp(sVar, serialN.c_str()); + if (check == 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "[InitializeLiveAmp] Serial numbers match: " << serialN << "\n"; + m_handle = hlocDevice; // save device handler + gtk_widget_destroy(dialog); + return true; + } + res = ampCloseDevice(hlocDevice); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[InitializeLiveAmp] Cannot close the device # " << i << "; error code = " << res << "\n"; + gtk_widget_destroy(dialog); + return false; + } + } + + gtk_widget_destroy(dialog); + + if (m_handle == nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[InitializeLiveAmp] There is no LiveAmp with serial number: " << serialN << " detected!"; + return false; + } + + return false; +} + +bool CDriverBrainProductsLiveAmp::configureLiveAmp() +{ + // amplifier configuration + float var = float(m_header.getSamplingFrequency()); + int res = ampSetProperty(m_handle, PG_DEVICE, 0, DPROP_F32_BaseSampleRate, &var, sizeof(var)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Config] Error setting sampling rate, error code: " << res << "\n"; + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "[Config] Set sampling frequency = " << m_header.getSamplingFrequency() << "\n"; + + + m_iRecordingMode = RM_NORMAL; // initialize acquisition mode: standard/normal + res = ampSetProperty(m_handle, PG_DEVICE, 0, DPROP_I32_RecordingMode, &m_iRecordingMode, sizeof(m_iRecordingMode)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Config] Error setting acquisition mode, error code: " << res << "\n"; + return false; + } + + // set good and bad impedance level + res = ampSetProperty(m_handle, PG_DEVICE, 0, DPROP_I32_GoodImpedanceLevel, &m_goodImpedanceLimit, sizeof(m_goodImpedanceLimit)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Config] Error setting DPROP_I32_GoodImpedanceLevel, error code: " << res << "\n"; + return false; + } + + res = ampSetProperty(m_handle, PG_DEVICE, 0, DPROP_I32_BadImpedanceLevel, &m_badImpedanceLimit, sizeof(m_badImpedanceLimit)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Config] Error setting DPROP_I32_BadImpedanceLevel, error code: " << res << "\n"; + return false; + } + + return true; +} + +bool CDriverBrainProductsLiveAmp::checkAvailableChannels() +{ + // check the "LiveAmp_Channel" version: LiveAmp8, LiveAmp16, LiveAmp32 or LiveAmp64 + uint32_t moduleChannels; // check number of channels that are allowed! + int res = ampGetProperty(m_handle, PG_MODULE, 0, MPROP_I32_UseableChannels, &moduleChannels, sizeof(moduleChannels)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "#1 MPROP_I32_UseableChannels, error code= " << res << "\n"; + return false; + } + + // checks available channels, gets the count of each channel type + uint32_t availableEEG = 0; + uint32_t availableAUX = 0; + uint32_t availableACC = 0; + uint32_t availableTrig = 0; + + int avlbchannels; + res = ampGetProperty(m_handle, PG_DEVICE, 0, DPROP_I32_AvailableChannels, &avlbchannels, sizeof(avlbchannels)); + + for (int c = 0; c < avlbchannels; ++c) + { + int type; + res = ampGetProperty(m_handle, PG_CHANNEL, c, CPROP_I32_Type, &type, sizeof(type)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] GetProperty type error: " << res << "\n"; + return false; + } + + if (type == CT_AUX) + { + char value[20]; + res = ampGetProperty(m_handle, PG_CHANNEL, c, CPROP_CHR_Function, &value, sizeof(value)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] GetProperty CPROP_CHR_Function #1 error: " << res << "\n"; + return false; + } + + if (value[0] == 'X' || value[0] == 'Y' || value[0] == 'Z' || value[0] == 'x' || value[0] == 'y' || value[0] == 'z') { availableACC++; } + else { availableAUX++; } + } + else if (type == CT_EEG || type == CT_BIP) { availableEEG++; } + else if (type == CT_TRG || type == CT_DIG) + { + char cValue[20]; + res = ampGetProperty(m_handle, PG_CHANNEL, c, CPROP_CHR_Function, &cValue, sizeof(cValue)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] GetProperty CPROP_CHR_Function #2 error: " << res << "\n"; + return false; + } + if (strcmp("Trigger Input", cValue) == 0) { availableTrig += 1 + 8; } // One LiveAmp trigger input + 8 digital inputs from AUX box + } + } + + + //********************************************************************************* + // very important check !!! EEG + Bipolar must match configuration limitations + //********************************************************************************* + if (moduleChannels == 32) + { + // if there is any Bipolar channel, it means that last 8 physical channels must be Bipolar + if (m_nBipolar > 0 && m_nEEG > (32 - 8)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] Number of EEG channels:" << m_nEEG << " and Bipolar channels: " << + m_nBipolar << " don't match the LiveAmp configuration !!!\n"; + return false; + } + } + + + // Used EEG channels: + if (m_nEEG + m_nBipolar > moduleChannels) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] Number of used EEG and Bip. channels '" << (m_nEEG + m_nBipolar) << + "' don't match with number of channels from LiveAmp Channel configuration '" << moduleChannels << "\n"; + return false; + } + if (m_nEEG + m_nBipolar > availableEEG) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] Number of available EEG channels '" << availableEEG << + "' don't match with number of channels from Device configuration '" << m_nEEG << "\n"; + return false; + } + if (m_header.getSamplingFrequency() >= 1000 && moduleChannels >= 32 && (m_nEEG + m_nBipolar) > 24) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << + "If the sampling rate is 1000Hz, there should be 24 EEG (or 21 EEG and 3 AUX) channels used, to avoid sample loss due to Bluetooth connection.\n"; + return false; + } + + + if (m_nAux > availableAUX) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Number of input AUX channeles (" << m_nAux << + ") don't match available number of AUX channels (" << availableAUX << ") \n"; + return false; + } + + if (m_header.getSamplingFrequency() >= 1000 && moduleChannels >= 32 && (m_nEEG + m_nBipolar + m_nAux + m_nACC) > 24) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << + "If the sampling rate is 1000Hz, there should be 24 EEG (or 21 EEG and 3 AUX) channels used, to avoid sample loss due to Bluetooth connection. \n "; + return false; + } + + return true; +} + +bool CDriverBrainProductsLiveAmp::disableAllAvailableChannels() +{ + // disables all channle first. It is better to do so, than to enable only the channels that will be used, according to the driver settings. + int avlbchannels; + int res = ampGetProperty(m_handle, PG_DEVICE, 0, DPROP_I32_AvailableChannels, &avlbchannels, sizeof(avlbchannels)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " Get available channels, error code= " << res << "\n"; + return false; + } + + + // now disable all channel first, + for (int c = 0; c < avlbchannels; ++c) + { + BOOL disabled = false; + int type = 0; + + res = ampGetProperty(m_handle, PG_CHANNEL, c, CPROP_I32_Type, &type, sizeof(type)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " Error: ampGetProperty for channel type, channel= " << c << "; error code= " << res << + "\n"; + return false; + } + + // can not disable trigger and digital channels. + if (type == CT_DIG || type == CT_TRG) { continue; } + + res = ampSetProperty(m_handle, PG_CHANNEL, c, CPROP_B32_RecordingEnabled, &disabled, sizeof(disabled)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " Error: ampGetProperty for channel type, channel= " << c << "; error code= " << res << "\n"; + return false; + } + } + + return true; +} + + +bool CDriverBrainProductsLiveAmp::getChannelIndices() +{ + int enable = 1; + m_nEnabledChannels = 0; + m_triggerIndices.clear(); + + std::vector accessIndices; // indexes of physical channel + + int avlbchannels; + int res = ampGetProperty(m_handle, PG_DEVICE, 0, DPROP_I32_AvailableChannels, &avlbchannels, sizeof(avlbchannels)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "#3 Get available channels, error code= " << res << "\n"; + return false; + } + + + // check the "LiveAmp_Channel" version: LiveAmp8, LiveAmp16, LiveAmp32 or LiveAmp64 + uint32_t moduleChannels; + res = ampGetProperty(m_handle, PG_MODULE, 0, MPROP_I32_UseableChannels, &moduleChannels, sizeof(moduleChannels)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "#2 MPROP_I32_UseableChannels, error code= " << res << "\n"; + return false; + } + + // enable channels and get indexes of channels to be used! + // The order of physical channels by LiveAmp: EEGs, BIPs, AUXs, ACCs, TRIGs + uint32_t nEEG = 0; + uint32_t nBip = 0; + uint32_t nAux = 0; + uint32_t nAcc = 0; + + for (int c = 0; c < avlbchannels; ++c) + { + int type; + res = ampGetProperty(m_handle, PG_CHANNEL, c, CPROP_I32_Type, &type, sizeof(type)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] GetProperty type error: " << res << "\n"; + return false; + } + + // type of channel is first EEG. After one of the channle is re-typed as Bipolar, that the rest of 8 channels in the group of 32 will be Bipolar as well + if (type == CT_EEG || type == CT_BIP) + { + if (nEEG < m_nEEG) + { + res = ampSetProperty(m_handle, PG_CHANNEL, c, CPROP_B32_RecordingEnabled, &enable, sizeof(enable)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " Cannot enable channel: " << c << "; error code= " << res << "\n"; + return false; + } + + accessIndices.push_back(m_nEnabledChannels); + m_nEnabledChannels++; + nEEG++; + } + else if (nBip < m_nBipolar) + { + //********************************************************************************* + // If Bipolar channel will be used, set the type to Bipolar here!!! + // Still it works for LiveAmp8, LiveAmp16 and LiveAmp32. + // Bipolar channels can be only phisical channels from index 24 - 31 !!! + //********************************************************************************* + if ((c > 23 && c < 32) || (moduleChannels > 32 && c > 55 && c < 64)) // last 8 channels of 32ch module can be bipolar channels + { + res = ampSetProperty(m_handle, PG_CHANNEL, c, CPROP_B32_RecordingEnabled, &enable, sizeof(enable)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " Cannot enable channel: " << c << "; error code= " << res << "\n"; + return false; + } + + int tp = CT_BIP; + res = ampSetProperty(m_handle, PG_CHANNEL, c, CPROP_I32_Type, &tp, sizeof(tp)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] SetProperty type CT_BIP error: " << res << "\n"; + return false; + } + + accessIndices.push_back(m_nEnabledChannels); + m_nEnabledChannels++; + nBip++; + } + } + } + else if (type == CT_AUX) + { + char cValue[20]; + res = ampGetProperty(m_handle, PG_CHANNEL, c, CPROP_CHR_Function, &cValue, sizeof(cValue)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] GetProperty CPROP_CHR_Function #1 error: " << res << "\n"; + return false; + } + + // detect ACC channels + if (cValue[0] == 'X' || cValue[0] == 'Y' || cValue[0] == 'Z' || cValue[0] == 'x' || cValue[0] == 'y' || cValue[0] == 'z') + { + if (nAcc < m_nACC) + { + res = ampSetProperty(m_handle, PG_CHANNEL, c, CPROP_B32_RecordingEnabled, &enable, sizeof(enable)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " Cannot enable channel: " << c << "; error code= " << res << "\n"; + return false; + } + accessIndices.push_back(m_nEnabledChannels); + m_nEnabledChannels++; + nAcc++; + } + } + else + { + if (nAux < m_nAux) + { + res = ampSetProperty(m_handle, PG_CHANNEL, c, CPROP_B32_RecordingEnabled, &enable, sizeof(enable)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " Cannot enable channel: " << c << "; error code= " << res << "\n"; + return false; + } + accessIndices.push_back(m_nEnabledChannels); + m_nEnabledChannels++; + nAux++; + } + } + } + + else if (type == CT_TRG || type == CT_DIG) // those channels are always enabled! + { + char cValue[20]; + res = ampGetProperty(m_handle, PG_CHANNEL, c, CPROP_CHR_Function, &cValue, sizeof(cValue)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " GetProperty CPROP_CHR_Function error by Trigger, error code= " << res << "\n"; + return false; + } + + if (strcmp("Trigger Input", cValue) == 0) { m_triggerIndices.push_back(m_nEnabledChannels); } + + m_nEnabledChannels++; // Trigger and digital channels are always enabled! + } + } + + // initialize trigger states + for (uint32_t i = 0; i < m_triggerIndices.size(); ++i) { m_lastTriggerStates.push_back(0); } + + // double check + int avlbchannels2; + res = ampGetProperty(m_handle, PG_DEVICE, 0, DPROP_I32_AvailableChannels, &avlbchannels2, sizeof(avlbchannels2)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "#3 Get available channels, error code= " << res << "\n"; + return false; + } + + return true; +} + + +bool CDriverBrainProductsLiveAmp::configureImpedanceMessure() +{ + if (!m_driverCtx.isImpedanceCheckRequested()) { return true; } + + m_iRecordingMode = RM_IMPEDANCE; + int res = ampSetProperty(m_handle, PG_DEVICE, 0, DPROP_I32_RecordingMode, &m_iRecordingMode, sizeof(m_iRecordingMode)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[ImpedanceMessureInit] Error setting impedance mode, error code: " << res << "\n"; + return false; + } + + m_impedanceChannels = 2; // GND + REF + + // for impedance measurements use only EEG and Bip channels + + int avlbchannels; + res = ampGetProperty(m_handle, PG_DEVICE, 0, DPROP_I32_AvailableChannels, &avlbchannels, sizeof(avlbchannels)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[ImpedanceMessureInit] Get available channels, error code= " << res << "\n"; + return false; + } + + // enable channels and get indexes of channels to be used! + // The order of physical channels by LiveAmp: EEGs, AUXs, ACCs, TRIGs + int nEEG = 0; + for (int c = 0; c < avlbchannels; ++c) + { + int type; + res = ampGetProperty(m_handle, PG_CHANNEL, c, CPROP_I32_Type, &type, sizeof(type)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[ImpedanceMessureInit] GetProperty type error: " << res << "\n"; + return false; + } + + if (type == CT_EEG || type == CT_BIP) + { + BOOL enabled = false; + res = ampGetProperty(m_handle, PG_CHANNEL, c, CPROP_B32_RecordingEnabled, &enabled, sizeof(enabled)); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [ImpedanceMessureInit] Cannot read enable channel: " << c << "; error code= " << res << "\n"; + return false; + } + + if (enabled) { nEEG += 2; } // for each channel CH+ and CH- + } + } + + m_impedanceChannels += nEEG; + + return true; +} + + +uint32_t CDriverBrainProductsLiveAmp::getLiveAmpSampleSize() +{ + int channels, dataType; + float resolution; + int byteSize = 0; + + m_dataTypes.clear(); + m_nUsedChannels = 0; + + // iterate through all enabled channels + ampGetProperty(m_handle, PG_DEVICE, 0, DPROP_I32_AvailableChannels, &channels, sizeof(channels)); + for (int c = 0; c < channels; ++c) + { + int enabled; + ampGetProperty(m_handle, PG_CHANNEL, c, CPROP_B32_RecordingEnabled, &enabled, sizeof(enabled)); + if (enabled) + { + // get the type of channel + ampGetProperty(m_handle, PG_CHANNEL, c, CPROP_I32_DataType, &dataType, sizeof(dataType)); + m_dataTypes.push_back(dataType); + ampGetProperty(m_handle, PG_CHANNEL, c, CPROP_F32_Resolution, &resolution, sizeof(resolution)); + m_resolutions.push_back(resolution); + m_nUsedChannels++; + + switch (dataType) + { + case DT_INT16: + case DT_UINT16: { byteSize += 2; } + break; + case DT_INT32: + case DT_UINT32: + case DT_FLOAT32: { byteSize += 4; } + break; + case DT_INT64: + case DT_UINT64: + case DT_FLOAT64: { byteSize += 8; } + break; + default: + break; + } + } + } + + byteSize += 8; // add the sample counter size + + return byteSize; +} + +void CDriverBrainProductsLiveAmp::liveAmpExtractData(const int samplesRead, std::vector>& extractData) +{ + const int nSamples = samplesRead / m_sampleSize; + float sample = 0; + + extractData.clear(); + extractData.resize(nSamples); + + for (int s = 0; s < nSamples; ++s) + { + int offset = 0; + //uint64_t sampCnt = *(uint64_t*)&m_sampleBuffer[s * m_sampleSize + offset]; + offset += 8; // sample counter offset + + extractData[s].resize(m_nUsedChannels); + + for (uint32_t i = 0; i < m_nUsedChannels; ++i) + { + switch (m_dataTypes[i]) + { + case DT_INT16: + { + const int16_t tmp = reinterpret_cast(m_sampleBuffer[s * m_sampleSize + offset]); + sample = float(tmp) * m_resolutions[i]; + offset += 2; + break; + } + case DT_UINT16: + { + const uint16_t tmp = reinterpret_cast(m_sampleBuffer[s * m_sampleSize + offset]); + sample = float(tmp) * m_resolutions[i]; + offset += 2; + break; + } + case DT_INT32: + { + const int tmp = reinterpret_cast(m_sampleBuffer[s * m_sampleSize + offset]); + sample = float(tmp) * m_resolutions[i]; + offset += 4; + break; + } + case DT_UINT32: + { + const uint32_t tmp = reinterpret_cast(m_sampleBuffer[s * m_sampleSize + offset]); + sample = float(tmp) * m_resolutions[i]; + offset += 4; + break; + } + case DT_FLOAT32: + { + const float tmp = reinterpret_cast(m_sampleBuffer[s * m_sampleSize + offset]); + sample = tmp * m_resolutions[i]; + offset += 4; + break; + } + case DT_INT64: + { + const int64_t tmp = reinterpret_cast(m_sampleBuffer[s * m_sampleSize + offset]); + sample = float(tmp) * m_resolutions[i]; + offset += 8; + break; + } + case DT_UINT64: + { + const uint64_t tmp = reinterpret_cast(m_sampleBuffer[s * m_sampleSize + offset]); + sample = float(tmp) * m_resolutions[i]; + offset += 8; + break; + } + case DT_FLOAT64: + { + const double tmp = reinterpret_cast(m_sampleBuffer[s * m_sampleSize + offset]); + sample = float(tmp) * m_resolutions[i]; + offset += 8; + break; + } + default: + break; + } + + extractData[s][i] = sample; + } + } +} + +void CDriverBrainProductsLiveAmp::liveAmpExtractImpedanceData(const int samplesRead, std::vector>& extractData) +{ + // extracts samples of each channel. In this case, since it is a impedance measurements it extracts EEG-channel data. + const size_t nSamples = size_t(samplesRead) / m_sampleSize; + size_t offset = 0; + const size_t offsetStep = sizeof(float); + + extractData.clear(); + extractData.resize(nSamples); + + for (size_t s = 0; s < nSamples; ++s) + { + extractData[s].resize(m_impedanceChannels); + + for (size_t i = 0; i < m_impedanceChannels; ++i) + { + const float sample = *reinterpret_cast(&m_sampleBuffer[s * m_sampleSize + offset]); + extractData[s][i] = sample; + offset += offsetStep; // sample counter offset + } + } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyLiveAmpAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.h new file mode 100644 index 0000000..a467947 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.h @@ -0,0 +1,171 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyLiveAmpAPI + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include + +#ifndef BYTE +typedef unsigned char BYTE; +#endif + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverBrainProductsLiveAmp + * \author Ratko Petrovic (Brain Products GmbH) + * \date Mon Nov 21 14:57:37 2016 + * \brief The CDriverBrainProductsLiveAmp allows the acquisition server to acquire data from a Brain Products LiveAmp device. + * + * TODO: details + * + * \sa CConfigurationBrainProductsLiveAmp + */ +class CDriverBrainProductsLiveAmp final : public IDriver +{ +public: + + explicit CDriverBrainProductsLiveAmp(IDriverContext& ctx); + ~CDriverBrainProductsLiveAmp() override { uninitialize(); } + + const char* getName() override { return "Brain Products LiveAmp"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool isFlagSet(const EDriverFlag flag) const override + { + if (flag == EDriverFlag::IsUnstable) { return false; } // switch to "Stable" on 3.5.2017 - RP + return false; // No flags are set + } + +private: + + SettingsHelper m_settings; + IDriverCallback* m_callback = nullptr; + void* m_handle = nullptr; + + CHeader m_header; + CStimulationSet m_stimSet; + uint32_t m_nSamplePerSentBlock = 0; + uint8_t* m_sampleBuffer = nullptr; + + uint32_t m_bufferSize = 0; + uint32_t m_sampleSize = 0; + + uint32_t m_physicalSampling = 250; + bool m_useAccChannels = false; + bool m_useBipolarChannels = false; + uint32_t m_impedanceChannels = 0; + uint32_t m_nUsedChannels = 0; + uint32_t m_nEnabledChannels = 0; + + uint32_t m_nChannel = 0; + uint32_t m_nEEG = 32; + uint32_t m_nAux = 0; + uint32_t m_nACC = 0; + uint32_t m_nBipolar = 0; + uint32_t m_nTriggersIn = 0; + uint32_t m_goodImpedanceLimit = 5000; + uint32_t m_badImpedanceLimit = 10000; + + std::string m_sSerialNumber = "05203-0077"; + int m_iRecordingMode = -1; + + std::vector m_samples; + std::deque> m_sampleCaches; + std::vector> m_sendBuffers; + std::vector m_samplings; + std::vector m_triggerIndices; + std::vector m_lastTriggerStates; + std::vector m_dataTypes; + std::vector m_resolutions; + + bool m_bSimulationMode = false; + /** + * \function initializeLiveAmp + * \return True if LiveAmp is successful initialized. + * \brief Establish BT connection with the LiveAmp amplifier, identified with the serial number. + */ + bool initializeLiveAmp(); + + /** + * \function configureLiveAmp + * \return True if LiveAmp is successful configured. + * \brief Configure LiveAmp, sampling rate and mode. + */ + bool configureLiveAmp(); + + /** + * \function checkAvailableChannels + * \return True if checking is successful. + * \brief Check how many available channels has LiveAmp. Get count of EEG,AUX and ACC channels. + Compares the count with the amplifier/driver settings. + */ + bool checkAvailableChannels(); + + /** + * \function disableAllAvailableChannels + * \return True if function is successful. + * \brief + */ + bool disableAllAvailableChannels(); + + /** + * \function getChannelIndices + * \return True if function is successful. + * \brief Get indexes of the channel that will be used for acquisition. + */ + bool getChannelIndices(); + + /** + * \function impedanceMessureInit + * \return True if function is successful. + * \brief Configures impedance measurement. + */ + bool configureImpedanceMessure(); + + /** + * \function getLiveAmpSampleSize + * \return Size of 'one' acquired sample. + * \brief Calcualtes the size of 'one' sample that LiveAmp delivers. It is actually a sum of the one sample per each channel that will be acquired. + This information is needed to read data from buffer, in order to access to each sample of each channel. + */ + uint32_t getLiveAmpSampleSize(); + + /** + * \function liveAmpExtractData + * \param samplesRead[in] : count of samples read (obtained) from the amplifier + * \param extractData[out] : extract data from the buffer + * \return + * \brief Extracts acquired data from the buffer, and puts them into the double vector 'extractData' , in the appropriate format. + */ + void liveAmpExtractData(int samplesRead, std::vector>& extractData); + + /** + * \function liveAmpExtractImpedanceData + * \param samplesRead[in] : count of acquired samples from the amplifier + * \param extractData[out] : extract data from the buffer + * \return + * \brief Extracts acquired impedance measurements from the buffer, and puts them into the double vector 'extractData', in the appropriate format. + */ + void liveAmpExtractImpedanceData(int samplesRead, std::vector>& extractData); +}; +} //namespace AcquisitionServer +} //namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyLiveAmpAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.cpp new file mode 100644 index 0000000..5eaabd6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.cpp @@ -0,0 +1,519 @@ +#include "ovasCConfigurationBrainProductsVAmp.h" +#include "ovasCHeaderBrainProductsVAmp.h" + +#if defined TARGET_HAS_ThirdPartyUSBFirstAmpAPI + +namespace OpenViBE { +namespace AcquisitionServer { + +gboolean idle_check_service(gpointer data) +{ + GtkBuilder* builder = static_cast(data); + + SC_HANDLE scm = OpenSCManager(nullptr, nullptr, SC_MANAGER_ALL_ACCESS); + SC_HANDLE service = nullptr; + if (scm != nullptr && scm != INVALID_HANDLE_VALUE) + { + service = OpenService(scm, "VampService", SERVICE_ALL_ACCESS); + if (service != nullptr) + { + SERVICE_STATUS status; + QueryServiceStatus(service, &status); + + if (status.dwCurrentState == SERVICE_RUNNING) + { + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "button_start_service")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "button_stop_service")), true); + gtk_label_set(GTK_LABEL(gtk_builder_get_object(builder, "label_service")), "VampService is Enabled"); + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(builder, "image_service")),GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_BUTTON); + CloseServiceHandle(scm); + CloseServiceHandle(service); + return true; + } + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "button_start_service")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "button_stop_service")), false); + gtk_label_set(GTK_LABEL(gtk_builder_get_object(builder, "label_service")), "VampService is Disabled"); + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(builder, "image_service")),GTK_STOCK_APPLY, GTK_ICON_SIZE_BUTTON); + CloseServiceHandle(scm); + CloseServiceHandle(service); + return true; + } + } + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "button_start_service")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "button_stop_service")), false); + gtk_label_set(GTK_LABEL(gtk_builder_get_object(builder, "label_service")), (scm != nullptr && scm != INVALID_HANDLE_VALUE) + ? "VampService has not been Detected" + : "Service Manager not Available (you must be administrator)"); + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(builder, "image_service")),GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_BUTTON); + return false; +} +//____________________________________________________________________________________ +// +static void StartServiceCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonStartServiceCB(); } +static void StopServiceCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonStopServiceCB(); } +static void FastModeSettingsCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonFastModeSettingsCB(); } +static void ChannelCountChangedCB(GtkComboBox* /*box*/, void* data) { static_cast(data)->channelCountChangedCB(); } + +static void GTKComboBoxSetActiveText(GtkComboBox* box, const gchar* text) +{ + GtkTreeModel* treeModel = gtk_combo_box_get_model(box); + GtkTreeIter it; + int index = 0; + gchar* name = nullptr; + if (gtk_tree_model_get_iter_first(treeModel, &it)) + { + do + { + gtk_tree_model_get(treeModel, &it, 0, &name, -1); + if (std::string(name) == std::string(text)) + { + gtk_combo_box_set_active(box, index); + return; + } + index++; + } while (gtk_tree_model_iter_next(treeModel, &it)); + } +} + +//____________________________________________________________________________________ + +// Inits the combo box, and sets the active value +// Warning : active value must be 7 8 9 10 or -1. +void initFastModeSettingsComboBox(GtkWidget* comboBox, const uint32_t value, const bool initComboBox = true) +{ + if (initComboBox) + { + //-1 + gtk_combo_box_append_text(GTK_COMBO_BOX(comboBox), "-1"); + //7-10 + for (size_t i = 7; i < 11; ++i) + { + const std::string tmp = std::to_string(i); + gtk_combo_box_append_text(GTK_COMBO_BOX(comboBox), tmp.c_str()); + } + } + const std::string tmp = std::to_string(value); + GTKComboBoxSetActiveText(GTK_COMBO_BOX(comboBox), tmp.c_str()); +} + +//____________________________________________________________________________________ + +CConfigurationBrainProductsVAmp::CConfigurationBrainProductsVAmp(IDriverContext& ctx, const char* gtkBuilderFilename, + CHeaderBrainProductsVAmp* headerBrainProductsVAmp, bool& acquireAuxiliaryAsEEG, + bool& acquireTriggerAsEEG) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx), m_headerBrainProductsVAmp(headerBrainProductsVAmp), + m_rAcquireAuxiliaryAsEEG(acquireAuxiliaryAsEEG), m_rAcquireTriggerAsEEG(acquireTriggerAsEEG) { m_giIdleID = 0; } + +bool CConfigurationBrainProductsVAmp::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + // Finds all the widgets + m_dialogFastModeSettings = GTK_WIDGET(gtk_builder_get_object(m_builder, "dialog_fast_mode_settings")); + + // the acquisition mode combo box in the main interface + m_acquisitionMode = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_acquisition_mode")); + + // the device combo box autofilled with all connected device + m_Device = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_device")); + + // the toggle button for aux channels and triggers + m_auxiliaryChannels = GTK_WIDGET(gtk_builder_get_object(m_builder, "checkbutton_aux")); + m_triggerChannels = GTK_WIDGET(gtk_builder_get_object(m_builder, "checkbutton_trigger")); + + // the 8 spin buttons for the settings in the "fast mode settings" interface + m_pair1PositiveInputs = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_pair1_positive_input")); + m_pair1NegativeInputs = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_pair1_negative_input")); + + m_pair2PositiveInputs = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_pair2_positive_input")); + m_pair2NegativeInputs = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_pair2_negative_input")); + + m_pair3PositiveInputs = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_pair3_positive_input")); + m_pair3NegativeInputs = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_pair3_negative_input")); + + m_pair4PositiveInputs = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_pair4_positive_input")); + m_pair4NegativeInputs = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_pair4_negative_input")); + + // hide the Change Channel Names button (for compatibility with original contributor (Mensia Technologies) base code) +#if defined TARGET_Is_Mensia_Acquisition_Server + gtk_widget_set_visible(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_change_channel_names")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_change_channel_names")), false); +#endif + + // connects callbacks to buttons + g_signal_connect(gtk_builder_get_object(m_builder,"button_fast_mode_settings"), "pressed", G_CALLBACK(FastModeSettingsCB), this); + g_signal_connect(gtk_builder_get_object(m_builder,"combobox_acquisition_mode"), "changed", G_CALLBACK(ChannelCountChangedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder,"checkbutton_aux"), "toggled", G_CALLBACK(ChannelCountChangedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder,"checkbutton_trigger"), "toggled", G_CALLBACK(ChannelCountChangedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder,"button_start_service"), "pressed", G_CALLBACK(StartServiceCB), this); + g_signal_connect(gtk_builder_get_object(m_builder,"button_stop_service"), "pressed", G_CALLBACK(StopServiceCB), this); + + // start the idle function that checks the VampService + m_giIdleID = g_idle_add(idle_check_service, m_builder); + + // Configures interface with given values + //Data mode + gtk_combo_box_set_active(GTK_COMBO_BOX(m_acquisitionMode), m_headerBrainProductsVAmp->getAcquisitionMode()); + + //Device(s) + uint32_t nDevice = 0; + uint32_t nRetries = 0; + + // We try to get the last opened device, (max 5 tries, 500ms sleep between tries) + while (nRetries++ < 5) + { + nDevice = faGetCount(); // Get the last opened Device id. + if (nDevice < 1) { Sleep(500); } + else { break; } + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "VAmp Configuration: " << nDevice << " device(s) connected.\n"; + + if (nDevice != 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "VAmp Configuration: Device(s) information :\n"; + + t_faInformation info; + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + + for (uint32_t i = 0; i < nDevice; ++i) + { + int deviceId = faGetId(i); + faGetInformation(deviceId, &info); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " device#" << i << " > Model(" << (info.Model == 1 ? "VAmp 16" : "VAmp 8") << ") | SN(" << info + .SerialNumber << ")\n"; + const std::string buffer = "device#" + std::to_string(i); + gtk_combo_box_append_text(comboBox, buffer.c_str()); + } + // active = the last opened device + gtk_combo_box_set_active(comboBox, nDevice - 1); + } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] VAmp Driver: faGetCount() returned [" << faGetCount() << "]. No device detected.\n"; + gtk_widget_set_sensitive(m_dialogFastModeSettings, false); + gtk_widget_set_sensitive(m_acquisitionMode, false); + gtk_widget_set_sensitive(m_Device, false); + gtk_widget_set_sensitive(m_auxiliaryChannels, false); + gtk_widget_set_sensitive(m_triggerChannels, false); + gtk_widget_set_sensitive(m_pair1PositiveInputs, false); + gtk_widget_set_sensitive(m_pair1NegativeInputs, false); + gtk_widget_set_sensitive(m_pair2PositiveInputs, false); + gtk_widget_set_sensitive(m_pair2NegativeInputs, false); + gtk_widget_set_sensitive(m_pair3PositiveInputs, false); + gtk_widget_set_sensitive(m_pair3NegativeInputs, false); + gtk_widget_set_sensitive(m_pair4PositiveInputs, false); + gtk_widget_set_sensitive(m_pair4NegativeInputs, false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_change_channel_names")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "checkbutton_impedance")), false); + } + + m_iDeviceCount = nDevice; + + // acquisition mode + gtk_combo_box_set_active(GTK_COMBO_BOX(m_acquisitionMode), m_headerBrainProductsVAmp->getAcquisitionMode()); + + // aux channels and triggers + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_auxiliaryChannels), m_rAcquireAuxiliaryAsEEG); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_triggerChannels), m_rAcquireTriggerAsEEG); + + // channel count (widget is hidden but is read when clicnking on "channel names..." + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_nChannels), m_header->getChannelCount()); + + //SETTINGS: + //Adding all possible settings : 7/8/9/10 and -1 + // and setting active text + //_______________________________________________________ + + initFastModeSettingsComboBox(m_pair1PositiveInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[0]); + initFastModeSettingsComboBox(m_pair1NegativeInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[0]); + initFastModeSettingsComboBox(m_pair2PositiveInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[1]); + initFastModeSettingsComboBox(m_pair2NegativeInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[1]); + initFastModeSettingsComboBox(m_pair3PositiveInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[2]); + initFastModeSettingsComboBox(m_pair3NegativeInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[2]); + initFastModeSettingsComboBox(m_pair4PositiveInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[3]); + initFastModeSettingsComboBox(m_pair4NegativeInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[3]); + + return true; +} + +bool CConfigurationBrainProductsVAmp::postConfigure() +{ + if (m_applyConfig) + { + m_headerBrainProductsVAmp->setAcquisitionMode(static_cast(gtk_combo_box_get_active(GTK_COMBO_BOX(m_acquisitionMode)))); + int usbIdx = 0; + + // Device number + if (m_iDeviceCount != 0) + { + int number; + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + if (sscanf(gtk_combo_box_get_active_text(comboBox), "device#%i", &number) == 1) + { + m_headerBrainProductsVAmp->setDeviceId(faGetId(uint32_t(number))); + } + } + + // aux and triggers: update the references + m_rAcquireAuxiliaryAsEEG = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_auxiliaryChannels)) != 0; + m_rAcquireTriggerAsEEG = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_triggerChannels)) != 0; + } + +#if 0 + // Code from CConfigurationBuilder::postConfigure() in order to have the channel names before making the pairs ! + if(m_applyConfig) + { + m_header->setChannelCount(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_nChannels))); + + for (size_t i=0; i!=m_header->getChannelCount(); ++i) + { + if(m_channelNames[i]!="") + { + m_header->setChannelName(i, m_channelNames[i].c_str()); + } + } + } +#endif + + //releasing ressources as we dont need it anymore + gtk_widget_hide(m_dialogFastModeSettings); + + // making the pairs names + if (m_headerBrainProductsVAmp->getAcquisitionMode() == VAmp4Fast) + { + size_t nPair = 0; + std::vector pairIdx; // if the user has n<4 pairs but not in the n first settings, we need the indexes + for (size_t i = 0; i < 4; ++i) + { + if (m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[i] != -1 + || m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[i] != -1) + { + nPair++; + pairIdx.push_back(i); + } + } + + m_headerBrainProductsVAmp->setPairCount(nPair); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << nPair << " channel pairs used.\n"; + + // we need to rename the 4 first channels, in order to match the pairs + std::vector pairNames; + + for (size_t i = 0; i < nPair; ++i) + { + std::string positiveChannelName, negativeChannelName, pairName; + bool positiveChannelSet = false; + bool negativeChannelSet = false; + + if (m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[pairIdx[i]] != -1) + { + positiveChannelName = m_header->getChannelName(m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[pairIdx[i]]); + if (positiveChannelName == "") + { + int val = m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[pairIdx[i]]; + positiveChannelName = std::to_string(val); + } + positiveChannelSet = true; + } + + if (m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[pairIdx[i]] != -1) + { + negativeChannelName = m_header->getChannelName(m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[pairIdx[i]]); + if (negativeChannelName == "") + { + int val = m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[pairIdx[i]]; + negativeChannelName = std::to_string(val); + } + negativeChannelSet = true; + } + + if (negativeChannelSet && positiveChannelSet) { pairName = "Differential (" + positiveChannelName + " - " + negativeChannelName + ")"; } + + if (!negativeChannelSet && positiveChannelSet) { pairName = "Monopolar(+) " + positiveChannelName; } + if (negativeChannelSet && !positiveChannelSet) { pairName = "Monopolar(-) " + negativeChannelName; } + + pairNames.push_back(pairName); + } + + for (size_t i = 0; i < nPair; ++i) { m_headerBrainProductsVAmp->setPairName(i, pairNames[i].c_str()); } + } + + //remove the idle function for the service check + if (m_giIdleID != 0) g_source_remove(m_giIdleID); + + if (!CConfigurationBuilder::postConfigure()) { return false; } // normal header is filled, ressources are realesed + + // Force sampling frequency +#if 0 + m_headerBrainProductsVAmp->setSamplingFrequency(m_headerBrainProductsVAmp->getAcquisitionMode()==EAcquisitionModes::VAmp4Fast?20000:2000); +#else + // Signal is now decimated down to 512Hz whatever input sampling frequency was acquired + m_headerBrainProductsVAmp->setSamplingFrequency(512); +#endif + + return true; +} + +//____________________________________________________________________________________// + +void CConfigurationBrainProductsVAmp::buttonFastModeSettingsCB() +{ + GtkDialog* dialog = GTK_DIALOG(gtk_builder_get_object(m_builder, "dialog_fast_mode_settings")); + int response; + do + { + response = gtk_dialog_run(dialog); + switch (response) + { + case GTK_RESPONSE_APPLY: + { + t_faDataModeSettings settings; + settings.Mode20kHz4Channels.ChannelsPos[0] = atoi(gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_pair1PositiveInputs))); + settings.Mode20kHz4Channels.ChannelsNeg[0] = atoi(gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_pair1NegativeInputs))); + + settings.Mode20kHz4Channels.ChannelsPos[1] = atoi(gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_pair2PositiveInputs))); + settings.Mode20kHz4Channels.ChannelsNeg[1] = atoi(gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_pair2NegativeInputs))); + + settings.Mode20kHz4Channels.ChannelsPos[2] = atoi(gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_pair3PositiveInputs))); + settings.Mode20kHz4Channels.ChannelsNeg[2] = atoi(gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_pair3NegativeInputs))); + + settings.Mode20kHz4Channels.ChannelsPos[3] = atoi(gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_pair4PositiveInputs))); + settings.Mode20kHz4Channels.ChannelsNeg[3] = atoi(gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_pair4NegativeInputs))); + + m_headerBrainProductsVAmp->setFastModeSettings(settings); + GTKComboBoxSetActiveText(GTK_COMBO_BOX(m_acquisitionMode), "Fast"); + + break; + } + case GTK_RESPONSE_CANCEL: + { + //Data mode + gtk_combo_box_set_active(GTK_COMBO_BOX(m_acquisitionMode), m_headerBrainProductsVAmp->getAcquisitionMode()); + + //Settings + initFastModeSettingsComboBox(m_pair1PositiveInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[0], false); + initFastModeSettingsComboBox(m_pair1NegativeInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[0], false); + initFastModeSettingsComboBox(m_pair2PositiveInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[1], false); + initFastModeSettingsComboBox(m_pair2NegativeInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[1], false); + initFastModeSettingsComboBox(m_pair3PositiveInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[2], false); + initFastModeSettingsComboBox(m_pair3NegativeInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[2], false); + initFastModeSettingsComboBox(m_pair4PositiveInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[3], false); + initFastModeSettingsComboBox(m_pair4NegativeInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[3], false); + + break; + } + default: break; + } + } while (response != GTK_RESPONSE_APPLY && response != GTK_RESPONSE_CANCEL); + + gtk_widget_hide(GTK_WIDGET(dialog)); +} + +void CConfigurationBrainProductsVAmp::channelCountChangedCB() +{ + const bool acquireAuxiliaryAsEEG = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_auxiliaryChannels)) != 0; + const bool acquireTriggerAsEEG = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_triggerChannels)) != 0; + const gint acquisitionMode = gtk_combo_box_get_active(GTK_COMBO_BOX(m_acquisitionMode)); + + uint32_t nChannel = m_headerBrainProductsVAmp->getEEGChannelCount(acquisitionMode); + nChannel += (acquireTriggerAsEEG ? m_headerBrainProductsVAmp->getTriggerChannelCount(acquisitionMode) : 0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_nChannels), nChannel); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_change_channel_names")), acquisitionMode != VAmp4Fast); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_fast_mode_settings")), acquisitionMode == VAmp4Fast); +} + +bool CConfigurationBrainProductsVAmp::controlVampService(bool start) +{ + SC_HANDLE scm = OpenSCManager(nullptr, nullptr, SC_MANAGER_ALL_ACCESS); + SC_HANDLE service = nullptr; + //bool bReturn = false; + //DWORD dwReturn = NO_ERROR; + + if (scm == nullptr || scm == INVALID_HANDLE_VALUE) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [VampService] The driver was unable to create the handler to the SCManager (err code " + << uint32_t(GetLastError()) << ".\n"; + return false; + } + try + { + service = OpenService(scm, "VampService", SERVICE_ALL_ACCESS); + if (service != nullptr) + { + SERVICE_STATUS status; + QueryServiceStatus(service, &status); + if (start) + { + if (status.dwCurrentState != SERVICE_RUNNING) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " [VampService] Starting VampService...\n"; + if (!StartService(service, 0, nullptr)) // handle to service, number of arguments, no arguments + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [VampService] The driver was unable to restart the service (err code " << + size_t(GetLastError()) << ".\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " [VampService] VampService started successfully.\n"; + return true; + } + } + else // try to stop service + { + if (status.dwCurrentState != SERVICE_STOPPED) + { + ControlService(service, SERVICE_CONTROL_STOP, &status); + bool stopped = false; + for (int i = 0; i < 5 && !stopped; ++i) // about 5 seconds + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " [VampService] Checking the VampService...\n"; + Sleep(1000); + ControlService(service, SERVICE_CONTROL_INTERROGATE, &status); + if (status.dwCurrentState == SERVICE_STOPPED) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " [VampService] VampService stopped successfully.\n"; + stopped = true; + } + } + if (!stopped) m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << " [VampService] After 5 seconds check, VampService did not stop.\n"; + } + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " [VampService] Closing handlers.\n"; + CloseServiceHandle(service); + service = nullptr; + CloseServiceHandle(scm); + scm = nullptr; + } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [VampService] The driver was unable to create the handler to VampService (err code " + << uint32_t(GetLastError()) << ".\n"; + return false; + } + } + catch (...) + { + if (service != nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [VampService] An error occurred with the VampService handler (err code " + << uint32_t(GetLastError()) << ".\n"; + CloseServiceHandle(service); + service = nullptr; + } + if (scm != nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [VampService] An error occurred with the SCManager handler (err code " + << uint32_t(GetLastError()) << ".\n"; + CloseServiceHandle(scm); + scm = nullptr; + } + return false; + } + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyUSBFirstAmpAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.h new file mode 100644 index 0000000..8a63105 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.h @@ -0,0 +1,76 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyUSBFirstAmpAPI + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" +#include "ovasCHeaderBrainProductsVAmp.h" + +#include + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +/** + * \class CConfigurationBrainProductsVAmp + * \author Laurent Bonnet (INRIA) + * \date 16 nov 2009 + * \erief The CConfigurationBrainProductsVAmp handles the configuration dialog specific to the VAmp device. + * + * User can configure the acquisition mode (normal/fast) and the fast mode settings (monopolar or differential pair). + * + * \sa CDriverBrainProductsVAmp + */ +class CConfigurationBrainProductsVAmp final : public CConfigurationBuilder +{ +public: + + CConfigurationBrainProductsVAmp(IDriverContext& ctx, const char* gtkBuilderFilename, CHeaderBrainProductsVAmp* headerBrainProductsVAmp, + bool& acquireAuxiliaryAsEEG, bool& acquireTriggerAsEEG); + + bool preConfigure() override; + bool postConfigure() override; + + void buttonFastModeSettingsCB(); + void buttonStartServiceCB() { controlVampService(true); } + void buttonStopServiceCB() { controlVampService(false); } + void channelCountChangedCB(); + +protected: + + IDriverContext& m_driverCtx; + int m_iDeviceCount = 0; + + CHeaderBrainProductsVAmp* m_headerBrainProductsVAmp = nullptr; + + bool& m_rAcquireAuxiliaryAsEEG; + bool& m_rAcquireTriggerAsEEG; + + //widgets + GtkWidget* m_dialogFastModeSettings = nullptr; + GtkWidget* m_Device = nullptr; + GtkWidget* m_acquisitionMode = nullptr; + GtkWidget* m_auxiliaryChannels = nullptr; + GtkWidget* m_triggerChannels = nullptr; + GtkWidget* m_pair1PositiveInputs = nullptr; + GtkWidget* m_pair1NegativeInputs = nullptr; + GtkWidget* m_pair2PositiveInputs = nullptr; + GtkWidget* m_pair2NegativeInputs = nullptr; + GtkWidget* m_pair3PositiveInputs = nullptr; + GtkWidget* m_pair3NegativeInputs = nullptr; + GtkWidget* m_pair4PositiveInputs = nullptr; + GtkWidget* m_pair4NegativeInputs = nullptr; + +private: + bool controlVampService(bool state); + //DWORD startWindowsService(SC_HANDLE hService); + //gboolean idleCheckVampService(gpointer data); + gint m_giIdleID = 0; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyUSBFirstAmpAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.cpp new file mode 100644 index 0000000..016ad51 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.cpp @@ -0,0 +1,705 @@ +#if defined TARGET_HAS_ThirdPartyUSBFirstAmpAPI + +#include "ovasCDriverBrainProductsVAmp.h" +#include "ovasCConfigurationBrainProductsVAmp.h" +#include "ovasCHeaderBrainProductsVAmp.h" + +#include +#include +#include + +#include +#include + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +#define OVAS_Driver_VAmp_ImpedanceMask_BaseComponent 127 + +namespace { +// Low pass FIR filters before downsampling +// +// Computed with python and scipy +// References : +// http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.tofile.html +// http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.firwin.html +// +// The following filters have roughly 50ms delay as described in "2.1.4 What is the +// delay of a linear-phase FIR?" at http://www.dspguru.com/book/export/html/3 : +// n = 200, Fs = 2000, delay = (n-1)/(2*Fs) = 0.04975 +// n = 2000, Fs = 20000, delay = (n-1)/(2*Fs) = 0.049975 +// +// In order to correct this delay, filtering should be done as a two steps process with a forward filter +// followed by a backward filter. However, this leads to an n square complexity where a linear complexity is +// sufficient in forward only filtering (using 100kHz input signal, n=10000 taps !) +// +// To avoid such complexity, it is chosen to antedate acquired samples by 50ms cheating the drift correction +// process. Indeed, the acquisition server application monitors the drifting of the acquisition process and +// corrects this drift upon demand. It is up to the driver to require this correction and it can be chosen not +// to fit the 0 drift, but to fit an arbitrary fixed drift instead. +// +// The offset for this correction is stored in the m_nDriftOffsetSample variable + +/* --------------------------------------------------------------------------------------------------------------- +from scipy import signal + +N = 200 +signal.firwin(N, cutoff= 256./(0.5*2000.), window='hamming').tofile("f64_2k_512.bin") +signal.firwin(N, cutoff= 128./(0.5*2000.), window='hamming').tofile("f64_2k_256.bin") +signal.firwin(N, cutoff= 64./(0.5*2000.), window='hamming').tofile("f64_2k_128.bin") + +N = 2000 +signal.firwin(N, cutoff=2048./(0.5*20000.), window='hamming').tofile("f64_20k_4096.bin") +signal.firwin(N, cutoff=1024./(0.5*20000.), window='hamming').tofile("f64_20k_2048.bin") +signal.firwin(N, cutoff= 512./(0.5*20000.), window='hamming').tofile("f64_20k_1024.bin") +signal.firwin(N, cutoff= 256./(0.5*20000.), window='hamming').tofile("f64_20k_512.bin") +signal.firwin(N, cutoff= 128./(0.5*20000.), window='hamming').tofile("f64_20k_256.bin") +signal.firwin(N, cutoff= 64./(0.5*20000.), window='hamming').tofile("f64_20k_128.bin") + +--------------------------------------------------------------------------------------------------------------- */ + +bool loadFilter(const char* filename, std::vector& filters) +{ + FILE* file = fopen(filename, "rb"); + if (!file) + { + filters.clear(); + filters.push_back(1); + return false; + } + fseek(file, 0, SEEK_END); + const size_t len = ftell(file); + fseek(file, 0, SEEK_SET); + filters.resize(len / sizeof(double)); + fread(&filters[0], len, 1, file); + fclose(file); + return true; +} +} // namespace + + +//___________________________________________________________________// +// // + +CDriverBrainProductsVAmp::CDriverBrainProductsVAmp(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_BrainProducts-VAmp", m_driverCtx.getConfigurationManager()) +{ + // default mode is VAmp 16, aux and trigger depending on the config tokens + m_header.setAcquisitionMode(VAmp16); + + m_nEEGChannel = m_header.getEEGChannelCount(VAmp16); + m_nAuxiliaryChannel = (m_acquireAuxiliaryAsEEG ? m_header.getAuxiliaryChannelCount(VAmp16) : 0); + m_nTriggerChannel = (m_acquireTriggerAsEEG ? m_header.getTriggerChannelCount(VAmp16) : 0); + m_header.setChannelCount(m_nEEGChannel + m_nAuxiliaryChannel + m_nTriggerChannel); + + if (m_acquireAuxiliaryAsEEG) + { + m_header.setChannelName(m_nEEGChannel, "Aux 1"); + m_header.setChannelName(m_nEEGChannel + 1, "Aux 2"); + } + if (m_acquireTriggerAsEEG) { m_header.setChannelName(m_nEEGChannel + m_nAuxiliaryChannel, "Trigger line"); } + + m_header.setSamplingFrequency(512); + + t_faDataModeSettings settings; + settings.Mode20kHz4Channels.ChannelsPos[0] = 7; + settings.Mode20kHz4Channels.ChannelsNeg[0] = -1; + settings.Mode20kHz4Channels.ChannelsPos[1] = 8; + settings.Mode20kHz4Channels.ChannelsNeg[1] = -1; + settings.Mode20kHz4Channels.ChannelsPos[2] = 9; + settings.Mode20kHz4Channels.ChannelsNeg[2] = -1; + settings.Mode20kHz4Channels.ChannelsPos[3] = 10; + settings.Mode20kHz4Channels.ChannelsNeg[3] = -1; + + m_header.setFastModeSettings(settings); + m_header.setDeviceId(FA_ID_INVALID); + + // @note m_header is CHeaderBrainProductsVAmp, whereas the current interface supports only IHeader. Thus, some info may not be loaded/saved. + m_settings.add("Header", &m_header); + m_settings.add("AcquireAuxiliaryAsEEG", &m_acquireAuxiliaryAsEEG); + m_settings.add("AcquireTriggerAsEEG", &m_acquireTriggerAsEEG); + m_settings.load(); +} + +CDriverBrainProductsVAmp::~CDriverBrainProductsVAmp() {} + +const char* CDriverBrainProductsVAmp::getName() { return "Brain Products V-Amp / First-Amp"; } + +//___________________________________________________________________// +// // + +bool CDriverBrainProductsVAmp::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "INIT called.\n"; + if (m_driverCtx.isConnected()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] VAmp Driver: Driver already initialized.\n"; + return false; + } + + if (m_acquireAuxiliaryAsEEG) m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] VAmp Driver: will acquire aux as EEG\n"; + else m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] VAmp Driver: will NOT acquire aux as EEG\n"; + if (m_acquireTriggerAsEEG) m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] VAmp Driver: will acquire trigger as EEG\n"; + else m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] VAmp Driver: will NOT acquire trigger as EEG\n"; + + m_acquisitionMode = m_header.getAcquisitionMode(); + m_nEEGChannel = m_header.getEEGChannelCount(m_acquisitionMode); + m_nAuxiliaryChannel = (m_acquireAuxiliaryAsEEG ? m_header.getAuxiliaryChannelCount(m_acquisitionMode) : 0); + m_nTriggerChannel = (m_acquireTriggerAsEEG ? m_header.getTriggerChannelCount(m_acquisitionMode) : 0); + + m_header.setChannelCount(m_nEEGChannel + m_nAuxiliaryChannel + m_nTriggerChannel); + + if (m_acquireAuxiliaryAsEEG) + { + if (strlen(m_header.getChannelName(m_nEEGChannel)) == 0 || strcmp(m_header.getChannelName(m_nEEGChannel), "Trigger line") == 0) + { + m_header.setChannelName(m_nEEGChannel, "Aux 1"); + } + if (strlen(m_header.getChannelName(m_nEEGChannel + 1)) == 0) { m_header.setChannelName(m_nEEGChannel + 1, "Aux 2"); } + } + if (m_acquireTriggerAsEEG) { m_header.setChannelName(m_nEEGChannel + m_nAuxiliaryChannel, "Trigger line"); } + + if (!m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] VAmp Driver: Channel count or frequency not set.\n"; + return false; + } + + // Builds up physical sampling rate + switch (m_acquisitionMode) + { + case VAmp16: m_physicalSamplingHz = 2000; + break; + case VAmp8: m_physicalSamplingHz = 2000; + break; + case VAmp4Fast: m_physicalSamplingHz = 20000; + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Vamp Driver: Unsupported acquisition mode [" << m_acquisitionMode << "].\n"; + return false; + } + + // Loading low pass filter for decimation + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] Vamp Driver: Setting up the FIR filter for signal decimation (physical rate " << + m_physicalSamplingHz << " > driver rate " << m_header.getSamplingFrequency() << ").\n"; + switch (m_physicalSamplingHz) + { + case 2000: loadFilter(Directories::getDataDir() + "applications/acquisition-server/filters/f64_2k_512.bin", m_filters); + break; + case 20000: loadFilter(Directories::getDataDir() + "applications/acquisition-server/filters/f64_20k_512.bin", m_filters); + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Vamp Driver: Unsupported physical sampling rate [" << m_physicalSamplingHz << "].\n"; + return false; + } + + // Builds up a buffer to store acquired samples. This buffer will be sent to the acquisition server later. + m_samples.clear(); + m_samples.resize(m_header.getChannelCount()); + m_resolutions.clear(); + m_resolutions.resize(m_header.getChannelCount()); + + // Prepares cache for filtering + m_sampleCaches.clear(); + for (size_t i = 0; i < m_filters.size(); ++i) { m_sampleCaches.push_back(m_samples); } + + // Setting the inner latency as described in the beginning of the file + m_nDriftOffsetSample = int64_t(m_header.getSamplingFrequency() * 50) / 1000; + m_driverCtx.setInnerLatencySampleCount(-m_nDriftOffsetSample); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Driver inner latency set to 50ms to compensate FIR filtering.\n"; + + // Prepares downsampling + m_counter = 0; + m_counterStep = (uint64_t(m_header.getSamplingFrequency()) << 32) / m_physicalSamplingHz; + + // Gets device Id + int deviceId = m_header.getDeviceId(); + + //__________________________________ + // Hardware initialization + + // if no device selected with the properties dialog + // we take the last device connected + if (deviceId == FA_ID_INVALID) + { + // We try to get the last opened device, + uint32_t lastOpenedDeviceID = faGetCount(); // Get the last opened Device id. + + if (lastOpenedDeviceID == FA_ID_INVALID) // failed + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] VAmp Driver: faGetCount failed to get last opened device.\n"; + return false; + } + + deviceId = faGetId(lastOpenedDeviceID - 1); + m_header.setDeviceId(deviceId); + } + + if (deviceId != FA_ID_INVALID) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] VAmp Driver: Active device ID(" << m_header.getDeviceId() << ").\n"; + } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] VAmp Driver: No device connected !\n"; + return false; + } + + // Open the device. + int openReturn = faOpen(deviceId); + if (openReturn != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] VAmp Driver: faOpen(" << deviceId << ") FAILED(" << openReturn << ").\n"; + return false; + } + + if (m_acquisitionMode == VAmp4Fast) { faSetDataMode(deviceId, dm20kHz4Channels, &(m_header.getFastModeSettings())); } + else { faSetDataMode(deviceId, dmNormal, nullptr); } + + if (m_driverCtx.isImpedanceCheckRequested()) + { + faStart(deviceId); + faStartImpedance(deviceId); + } + + if (!m_driverCtx.isImpedanceCheckRequested()) + { + HBITMAP bitmap = HBITMAP(LoadImage(nullptr, Directories::getDataDir() + "/applications/acquisition-server/vamp-standby.bmp",IMAGE_BITMAP, 0, 0, + LR_LOADFROMFILE)); + if (bitmap == nullptr || faSetBitmap(m_header.getDeviceId(), bitmap) != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "[LOOP] VAmp Driver: BMP load failed.\n"; + } + } + + + // Gets properties + t_faProperty properties; + if (faGetProperty(m_header.getDeviceId(), &properties)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not get properties - Got error \n"; + return false; + } + + size_t j = 0; + for (size_t i = 0; i < m_nEEGChannel; i++, j++) m_resolutions[j] = m_header.getChannelGain(i) * properties.ResolutionEeg * 1E6f; // converts to �V + for (size_t i = 0; i < m_nAuxiliaryChannel; i++, j++) m_resolutions[j] = properties.ResolutionAux * 1E6f; // converts to �V + + for (size_t i = 0; i < m_nEEGChannel; i++, j++) { m_header.setChannelUnits(i, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); } + for (size_t i = 0; i < m_nAuxiliaryChannel; i++, j++) + { + m_header.setChannelUnits(i, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); // converts to �V + } + + //__________________________________ + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; +} + +bool CDriverBrainProductsVAmp::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "START called.\n"; + if (!m_driverCtx.isConnected()) { return false; } + + if (m_driverCtx.isStarted()) { return false; } + + m_firstStart = true; + uint32_t error = FA_ERR_OK; + int deviceId = m_header.getDeviceId(); + + if (m_driverCtx.isImpedanceCheckRequested()) + { + faStopImpedance(deviceId); + // stops the impedance mode, but not the acquisition + } + else + { + // we did not start the acquisition yet, let's do it now. + error = faStart(deviceId); + } + + if (error != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[START] VAmp Driver: faStart FAILED(" << error << "). Closing device.\n"; + faClose(deviceId); + return false; + } + + //The bonus... + HBITMAP bitmap = HBITMAP(LoadImage(nullptr, Directories::getDataDir() + "/applications/acquisition-server/vamp-acquiring.bmp",IMAGE_BITMAP, 0, 0, + LR_LOADFROMFILE)); + if (bitmap == nullptr || faSetBitmap(m_header.getDeviceId(), bitmap) != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "[START] VAmp Driver: BMP load failed.\n"; + } + + return true; +} + +bool CDriverBrainProductsVAmp::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + + t_faDataModel16 bufferVAmp16; // buffer for the next block in normal mode + uint32_t lengthVAmp16 = sizeof(t_faDataModel16); + + t_faDataModel8 bufferVAmp8; // buffer for the next block in normal mode + uint32_t lengthVAmp8 = sizeof(t_faDataModel8); + + t_faDataFormatMode20kHz bufferVamp4Fast; // buffer for fast mode acquisition + uint32_t lengthVAmp4Fast = sizeof(t_faDataFormatMode20kHz); + + uint32_t status = 0; + + int deviceId = m_header.getDeviceId(); + + if (m_driverCtx.isStarted()) + { + uint32_t nReceivedSamples = 0; +#if DEBUG + uint32_t nReadError = 0; + uint32_t nReadSuccess = 0; + uint32_t nReadZero = 0; +#endif + if (m_firstStart) + { + //empty buffer + switch (m_acquisitionMode) + { + case VAmp16: while (faGetData(deviceId, &bufferVAmp16, lengthVAmp16) > 0); + status = bufferVAmp16.Status; + break; + case VAmp8: while (faGetData(deviceId, &bufferVAmp8, lengthVAmp8) > 0); + status = bufferVAmp8.Status; + break; + case VAmp4Fast: while (faGetData(deviceId, &bufferVamp4Fast, lengthVAmp4Fast) > 0); + status = bufferVamp4Fast.Status; + break; + default: break; + } + // Trigger: Digital inputs (bits 0 - 8) + output (bit 9) state + 22 MSB reserved bits + // The trigger value received is in [0-255] + status &= 0x000000ff; + m_lastTrigger = status; + m_firstStart = false; + } + + bool finished = false; + while (!finished) + { + // we need to "getData" with the right output structure according to acquisition mode + + int returnLength; + signed int* eegArray; + signed int* auxiliaryArray = nullptr; + status = 0; + switch (m_acquisitionMode) + { + case VAmp16: returnLength = faGetData(deviceId, &bufferVAmp16, lengthVAmp16); + eegArray = bufferVAmp16.Main; + auxiliaryArray = bufferVAmp16.Aux; + status = bufferVAmp16.Status; + break; + + case VAmp8: returnLength = faGetData(deviceId, &bufferVAmp8, lengthVAmp8); + eegArray = bufferVAmp8.Main; + auxiliaryArray = bufferVAmp8.Aux; + status = bufferVAmp8.Status; + break; + + case VAmp4Fast: returnLength = faGetData(deviceId, &bufferVamp4Fast, lengthVAmp4Fast); + eegArray = bufferVamp4Fast.Main; + // auxiliaryArray = bufferVamp4Fast.Aux; + status = bufferVamp4Fast.Status; + break; + + default: m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "[LOOP] VAmp Driver: unsupported acquisition mode, this should never happen\n"; + return false; + } + // Trigger: Digital inputs (bits 0 - 8) + output (bit 9) state + 22 MSB reserved bits + // The trigger value received is in [0-255] + status &= 0x000000ff; + + if (returnLength > 0) + { +#if DEBUG + nReadSuccess++; +#endif + + // Stores acquired sample + for (size_t i = 0; i < m_nEEGChannel; ++i) { m_samples[i] = float((eegArray[i] - eegArray[m_nEEGChannel]) * m_resolutions[i]); } + for (size_t i = 0; i < m_nAuxiliaryChannel; ++i) { m_samples[m_nEEGChannel + i] = float(auxiliaryArray[i] * m_resolutions[i]); } + for (size_t i = 0; i < m_nTriggerChannel; ++i) { m_samples[m_nEEGChannel + m_nAuxiliaryChannel + i] = float(status); } + + // Updates cache + //m_sampleCaches.erase(m_sampleCaches.begin()); + m_sampleCaches.pop_front(); + m_sampleCaches.push_back(m_samples); + + // Every time that a trigger has changed, we send a stimulation. + if (status != m_lastTrigger) + { + // The date is relative to the last buffer start time (cf the setSamples before setStimulationSet) + const uint64_t date = CTime(m_physicalSamplingHz, m_nTotalSample).time(); + // Code of stimulation = OVTK_StimulationId_LabelStart + value of the trigger bytes. + m_stimSet.appendStimulation(OVTK_StimulationId_Label(status), 0, 0); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "[LOOP] VAmp Driver: Send stimulation: " << status << " at date: " << date << ".\n"; + m_lastTrigger = status; + } + + m_counter += m_counterStep; + if (m_counter >= (1LL << 32)) + { + m_counter -= (1LL << 32); + + // Filters last samples + for (size_t i = 0; i < m_samples.size(); ++i) + { + m_samples[i] = 0; + auto it = m_sampleCaches.begin(); + for (size_t j = 0; j < m_filters.size(); ++j) + { + //m_samples[i]+=m_filters[j]*m_sampleCaches[j][i]; + m_samples[i] += float(m_filters[j] * (*it)[i]); + ++it; + } + } + + m_callback->setSamples(&m_samples[0], 1); + m_callback->setStimulationSet(m_stimSet); + m_stimSet.clear(); + } + nReceivedSamples++; + } + else if (returnLength == 0) + { + finished = true; + System::Time::sleep(2); + } +#if DEBUG + if(returnLength < 0) + { + nReadError++; + finished = true; + } + if(returnLength == 0) + { + nReadZero++; + finished = true; + } +#endif + } +#if DEBUG + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "[LOOP] VAmp Driver: stats for the current block : Success="< 0); + break; + case VAmp8: while (faGetData(deviceId, &bufferVAmp8, lengthVAmp8) > 0); + break; + case VAmp4Fast: while (faGetData(deviceId, &bufferVamp4Fast, lengthVAmp4Fast) > 0); + break; + default: break; + } + + if (m_driverCtx.isImpedanceCheckRequested()) + { + // Reads impedances + std::vector buffer; + buffer.resize(20, 0); // all possible channels + ground electrode + uint32_t error = faGetImpedance(deviceId, &buffer[0], 20 * sizeof(uint32_t)); + if (error != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[LOOP] Can not read impedances on device id " << deviceId << " - faGetImpedance FAILED(" << + error << ")\n"; + } + else + { + // Updates impedances + + const uint64_t goodImpedanceLimit = m_driverCtx.getConfigurationManager().expandAsUInteger("${AcquisitionServer_DefaultImpedanceLimit}", 5000); + // as with the default acticap settings (values provided by Brain Products) : + const uint64_t badImpedanceLimit = 2 * goodImpedanceLimit; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Impedances are [ "; + for (uint32_t j = 0; j < m_nEEGChannel; ++j)//we do not update the last impedance (ground) + { + m_driverCtx.updateImpedance(j, buffer[j]); + m_driverCtx.getLogManager() << buffer[j] << " "; + } + m_driverCtx.getLogManager() << "]\n"; + + //print impedances on the LCD screen + HBITMAP bitmapHandler = HBITMAP(LoadImage(nullptr, Directories::getDataDir() + "/applications/acquisition-server/vamp-impedance-mask.bmp", + IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION)); + if (bitmapHandler) + { + BITMAP bitmap; + GetObject(bitmapHandler, sizeof(bitmap), &bitmap); + //uint32_t width = bitmap.bmWidth; + const uint32_t height = bitmap.bmHeight; + BYTE* bytePtr = static_cast(bitmap.bmBits); // 3 bytes per pixel for RGB values + + //printf("H x W : %u x %u with %u per scan\n", height, width, bitmap.bmWidthBytes); + + for (uint32_t y = 0; y < height; ++y) // scan lines + { + uint32_t x = 0; + for (uint32_t byteIdx = 0; byteIdx < uint32_t(bitmap.bmWidthBytes); byteIdx += 3) + { + x++; + unsigned char* b = (bytePtr + bitmap.bmWidthBytes * y + byteIdx); + unsigned char* g = (bytePtr + bitmap.bmWidthBytes * y + byteIdx + 1); + unsigned char* r = (bytePtr + bitmap.bmWidthBytes * y + byteIdx + 2); + // The impedance mask is a BLACK and WHITE bitmap with grey squares for the channels. + // For each channel, the grey RGB components are equal to OVAS_Driver_VAmp_ImpedanceMask_BaseComponent - channel index - 1 + // e.g. with 16 channels and base at 127, the 5th channel square as RGB components to 127 - 5 = 122 + // Every pixel in the grey range is a channel square and needs repaint according to impedance. + if (*r < OVAS_Driver_VAmp_ImpedanceMask_BaseComponent && *r >= OVAS_Driver_VAmp_ImpedanceMask_BaseComponent - m_nEEGChannel + && *g < OVAS_Driver_VAmp_ImpedanceMask_BaseComponent && *g >= OVAS_Driver_VAmp_ImpedanceMask_BaseComponent - m_nEEGChannel + && *b < OVAS_Driver_VAmp_ImpedanceMask_BaseComponent && *b >= OVAS_Driver_VAmp_ImpedanceMask_BaseComponent - m_nEEGChannel) + { + const uint32_t idx = OVAS_Driver_VAmp_ImpedanceMask_BaseComponent - *r - 1; //0-based + if (buffer[idx] <= goodImpedanceLimit) + { + // good impedance: green + *r = 0x00; + *g = 0xff; + *b = 0x00; + } + else if (buffer[idx] <= badImpedanceLimit) + { + // unsufficient impedance: yellow + *r = 0xff; + *g = 0xff; + *b = 0x00; + } + else + { + // bad impedance: red + *r = 0xff; + *g = 0x00; + *b = 0x00; + } + } + } + } + } + + if (bitmapHandler == nullptr || faSetBitmap(m_header.getDeviceId(), bitmapHandler) != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "[LOOP] VAmp Driver: BMP load failed.\n"; + } + } + } + } + + return true; +} + +bool CDriverBrainProductsVAmp::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "STOP called.\n"; + if (!m_driverCtx.isConnected()) { return false; } + + if (!m_driverCtx.isStarted()) { return false; } + + if (m_driverCtx.isImpedanceCheckRequested()) { faStartImpedance(m_header.getDeviceId()); } + + m_firstStart = false; + if (!m_driverCtx.isImpedanceCheckRequested()) + { + HBITMAP bitmap = (HBITMAP)LoadImage(nullptr, Directories::getDataDir() + "/applications/acquisition-server/vamp-standby.bmp",IMAGE_BITMAP, 0, 0, + LR_LOADFROMFILE); + if (bitmap == nullptr || faSetBitmap(m_header.getDeviceId(), bitmap) != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "[STOP] VAmp Driver: BMP load failed.\n"; + } + } + + return true; +} + +bool CDriverBrainProductsVAmp::uninitialize() +{ + if (!m_driverCtx.isConnected()) { return false; } + + if (m_driverCtx.isStarted()) { return false; } + + uint32_t error = faStop(m_header.getDeviceId()); + if (error != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[UINIT] VAmp Driver: faStop FAILED(" << error << ").\n"; + faClose(m_header.getDeviceId()); + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Uninitialize called. Closing the device.\n"; + + + // for a black bitmap use : + //HDC hDC = CreateCompatibleDC(NULL); + //HBITMAP bitmap = CreateCompatibleBitmap(l_hDC, 320, 240); + // Default bitmap : BP image (provided by N. Soldati) + HBITMAP bitmap = HBITMAP(LoadImage(nullptr, Directories::getDataDir() + "/applications/acquisition-server/vamp-default.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)); + if (faSetBitmap(m_header.getDeviceId(), bitmap) != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "[UINIT] VAmp Driver: BMP load failed.\n"; + } + + + error = faClose(m_header.getDeviceId()); + if (error != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[UINIT] VAmp Driver: faClose FAILED(" << error << ").\n"; + return false; + } + + m_callback = nullptr; + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverBrainProductsVAmp::configure() +{ + // the specific header is passed into the specific configuration + CConfigurationBrainProductsVAmp config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-BrainProducts-VAmp.ui", + &m_header, m_acquireAuxiliaryAsEEG, m_acquireTriggerAsEEG); + + if (!config.configure(*(m_header.getBasicHeader()))) { return false; } // the basic configure will use the basic header + + m_settings.save(); + + if (m_acquisitionMode == VAmp4Fast) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Pair names :\n"; + for (uint32_t i = 0; i < m_header.getPairCount(); ++i) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " Pair " << i << " > " << m_header.getPairName(i) << "\n"; + } + } + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyUSBFirstAmpAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.h new file mode 100644 index 0000000..fb941e5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.h @@ -0,0 +1,89 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyUSBFirstAmpAPI + +#include "ovasIDriver.h" +#include "ovasCHeaderBrainProductsVAmp.h" +#include + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverBrainProductsVAmp + * \author Laurent Bonnet (INRIA) + * \date 16 nov 2009 + * \erief The CDriverBrainProductsVAmp allows the acquisition server to acquire data from a USB-VAmp-16 amplifier (BrainProducts GmbH). + * + * The driver allows 2 different acquisition modes: normal (2kHz sampling frequency - max 16 electrodes) + * or fast (20kHz sampling frequency, 4 monopolar or differential channels). + * The driver uses a dedicated Header. + * + * \sa CHeaderBrainProductsVAmp + */ +class CDriverBrainProductsVAmp final : public IDriver +{ +public: + + explicit CDriverBrainProductsVAmp(IDriverContext& ctx); + ~CDriverBrainProductsVAmp() override; + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + + bool m_acquireAuxiliaryAsEEG = false; + bool m_acquireTriggerAsEEG = false; + + CHeaderBrainProductsVAmp m_header; + + EAcquisitionModes m_acquisitionMode = VAmp16; + uint32_t m_nSamplePerSentBlock = 0; + uint32_t m_nTotalSample = 0; + uint32_t m_nEEGChannel = 0; + uint32_t m_nAuxiliaryChannel = 0; + uint32_t m_nTriggerChannel = 0; + + std::vector m_stimulationIDs; + std::vector m_stimulationDates; + std::vector m_stimulationSamples; + CStimulationSet m_stimSet; + uint32_t m_lastTrigger = 0; + + std::deque> m_sampleCaches; + std::vector m_samples; + std::vector m_filters; + std::vector m_resolutions; + + int64_t m_nDriftOffsetSample = 0; + uint32_t m_physicalSamplingHz = 0; + uint64_t m_counterStep = 0; + uint64_t m_counter = 0; + +private: + + bool m_firstStart = false; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyUSBFirstAmpAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.cpp new file mode 100644 index 0000000..7f58eee --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.cpp @@ -0,0 +1,262 @@ +#include "ovasCHeaderBrainProductsVAmp.h" +#include "ovasCConfigurationBrainProductsVAmp.h" + +#if defined TARGET_HAS_ThirdPartyUSBFirstAmpAPI + +#include +#include + +#include +#include + +#define _NoValueI_ 0xffffffff + +namespace OpenViBE { +namespace AcquisitionServer { + +static size_t eegChannelCounts[] = { 16, 8, 4 }; +static size_t auxiliaryChannelCounts[] = { 2, 2, 0 }; +static size_t triggerChannelCounts[] = { 1, 1, 1 }; + +//___________________________________________________________________// +// // + +CHeaderBrainProductsVAmp::CHeaderBrainProductsVAmp() +{ + m_basicHeader = new CHeader(); + + // additional information + m_deviceID = -1; + m_acquisitionMode = VAmp16; + + // Pair information + m_nPair = 0; +} + +void CHeaderBrainProductsVAmp::reset() +{ + m_basicHeader->reset(); + m_deviceID = FA_ID_INVALID; + + // Pair information + m_nPair = 0; +} + +//___________________________________________________________________// +// // + +size_t CHeaderBrainProductsVAmp::getEEGChannelCount(const size_t acquisitionMode) { return eegChannelCounts[acquisitionMode]; } +size_t CHeaderBrainProductsVAmp::getAuxiliaryChannelCount(const size_t acquisitionMode) { return auxiliaryChannelCounts[acquisitionMode]; } +size_t CHeaderBrainProductsVAmp::getTriggerChannelCount(const size_t acquisitionMode) { return triggerChannelCounts[acquisitionMode]; } + +// Pair information + +bool CHeaderBrainProductsVAmp::setPairCount(const size_t count) +{ + m_nPair = count; + m_names.clear(); + m_gains.clear(); + return m_nPair != size_t(-1); +} + +bool CHeaderBrainProductsVAmp::setPairName(const size_t index, const char* name) +{ + m_names[index] = name; + return index < m_nPair; +} + +bool CHeaderBrainProductsVAmp::setPairGain(const size_t index, const float gain) +{ + m_gains[index] = gain; + return index < m_nPair; +} + +bool CHeaderBrainProductsVAmp::setPairUnits(const size_t index, const size_t unit, const size_t factor) +{ + m_units[index] = std::pair(unit, factor); + return index < m_nPair; +} + +bool CHeaderBrainProductsVAmp::setFastModeSettings(t_faDataModeSettings settings) +{ + m_tFastModeSettings = settings; + return isFastModeSettingsSet(); +} + +const char* CHeaderBrainProductsVAmp::getPairName(const size_t index) const +{ + const auto i = m_names.find(index); + if (i == m_names.end()) { return ""; } + return i->second.c_str(); +} + +float CHeaderBrainProductsVAmp::getPairGain(const size_t index) const +{ + const auto i = m_gains.find(index); + if (i == m_gains.end()) { return (index < m_nPair ? 1.0f : 0.0f); } + return i->second; +} + +bool CHeaderBrainProductsVAmp::getPairUnits(const size_t index, size_t& unit, size_t& factor) const +{ + const auto i = m_units.find(index); + if (i == m_units.end()) + { + unit = OVTK_UNIT_Unspecified; + factor = OVTK_FACTOR_Base; + + return false; + } + unit = (i->second).first; + factor = (i->second).second; + + return true; +} + +//___________________________________________________________________// +// // + +bool CHeaderBrainProductsVAmp::setDeviceId(const int id) +{ + m_deviceID = id; + return m_deviceID != _NoValueI_; +} + +bool CHeaderBrainProductsVAmp::isDeviceIdSet() const { return m_deviceID != _NoValueI_; } + +bool CHeaderBrainProductsVAmp::isFastModeSettingsSet() const +{ + return (m_tFastModeSettings.Mode20kHz4Channels.ChannelsPos[0] == _NoValueI_ + || m_tFastModeSettings.Mode20kHz4Channels.ChannelsNeg[0] == _NoValueI_ + || m_tFastModeSettings.Mode20kHz4Channels.ChannelsPos[1] == _NoValueI_ + || m_tFastModeSettings.Mode20kHz4Channels.ChannelsNeg[1] == _NoValueI_ + || m_tFastModeSettings.Mode20kHz4Channels.ChannelsPos[2] == _NoValueI_ + || m_tFastModeSettings.Mode20kHz4Channels.ChannelsNeg[2] == _NoValueI_ + || m_tFastModeSettings.Mode20kHz4Channels.ChannelsPos[3] == _NoValueI_ + || m_tFastModeSettings.Mode20kHz4Channels.ChannelsNeg[3] == _NoValueI_); +} + +//___________________________________________________________________// +// // + +// Channel information + +bool CHeaderBrainProductsVAmp::setChannelCount(const size_t nChannel) +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->setPairCount(nChannel); + } + return m_basicHeader->setChannelCount(nChannel); +} + +bool CHeaderBrainProductsVAmp::setChannelName(const size_t index, const char* name) +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->setPairName(index, name); + } + return m_basicHeader->setChannelName(index, name); +} + +bool CHeaderBrainProductsVAmp::setChannelGain(const size_t index, const float gain) +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->setPairGain(index, gain); + } + return m_basicHeader->setChannelGain(index, gain); +} + +bool CHeaderBrainProductsVAmp::setChannelUnits(const size_t index, const size_t unit, const size_t factor) +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->setPairUnits(index, unit, factor); + } + return m_basicHeader->setChannelUnits(index, unit, factor); +} + +size_t CHeaderBrainProductsVAmp::getChannelCount() const +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->getPairCount(); + } + return m_basicHeader->getChannelCount(); +} + +const char* CHeaderBrainProductsVAmp::getChannelName(const size_t index) const +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->getPairName(index); + } + return m_basicHeader->getChannelName(index); +} + +float CHeaderBrainProductsVAmp::getChannelGain(const size_t index) const +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->getPairGain(index); + } + return m_basicHeader->getChannelGain(index); +} + +bool CHeaderBrainProductsVAmp::getChannelUnits(const size_t index, size_t& unit, size_t& factor) const +{ + if (m_acquisitionMode == VAmp4Fast) { return this->getPairUnits(index, unit, factor); } + return m_basicHeader->getChannelUnits(index, unit, factor); +} + +bool CHeaderBrainProductsVAmp::isChannelCountSet() const +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->isPairCountSet(); + } + return m_basicHeader->isChannelCountSet(); +} + +bool CHeaderBrainProductsVAmp::isChannelNameSet() const +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->isPairNameSet(); + } + return m_basicHeader->isChannelNameSet(); +} + +bool CHeaderBrainProductsVAmp::isChannelGainSet() const +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->isPairGainSet(); + } + return m_basicHeader->isChannelGainSet(); +} + +bool CHeaderBrainProductsVAmp::isChannelUnitSet() const +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->isPairUnitSet(); + } + return m_basicHeader->isChannelUnitSet(); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyUSBFirstAmpAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.h new file mode 100644 index 0000000..308c4ae --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.h @@ -0,0 +1,128 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyUSBFirstAmpAPI + +#include "../ovasCHeader.h" + +#include +#include + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +enum EAcquisitionModes { VAmp16 = 0, VAmp8 = 1, VAmp4Fast = 2 }; + +/** + * \class CHeaderBrainProductsVAmp + * \author Laurent Bonnet (INRIA) + * \date 16 nov 2009 + * \erief The CHeaderBrainProductsVAmp is an Adaptator for the VAmp device. + * + * It contains basic functions using the basic header behaviour, and a set of specific functions to handle the Fast Mode data. + * + * \sa CDriverBrainProductsVAmp + */ +class CHeaderBrainProductsVAmp final : public IHeader +{ +public: + + CHeaderBrainProductsVAmp(); + ~CHeaderBrainProductsVAmp() override { delete m_basicHeader; } + void reset() override; + + // Experiment information + bool setExperimentID(const size_t experimentID) override { return m_basicHeader->setExperimentID(experimentID); } + bool setSubjectAge(const size_t subjectAge) override { return m_basicHeader->setSubjectAge(subjectAge); } + bool setSubjectGender(const size_t subjectGender) override { return m_basicHeader->setSubjectGender(subjectGender); } + + size_t getExperimentID() const override { return m_basicHeader->getExperimentID(); } + size_t getSubjectAge() const override { return m_basicHeader->getSubjectAge(); } + size_t getSubjectGender() const override { return m_basicHeader->getSubjectGender(); } + + bool isExperimentIDSet() const override { return m_basicHeader->isExperimentIDSet(); } + bool isSubjectAgeSet() const override { return m_basicHeader->isSubjectAgeSet(); } + bool isSubjectGenderSet() const override { return m_basicHeader->isSubjectGenderSet(); } + + void setImpedanceCheckRequested(const bool state) override { m_basicHeader->setImpedanceCheckRequested(state); } + bool isImpedanceCheckRequested() const override { return m_basicHeader->isImpedanceCheckRequested(); } + size_t getImpedanceLimit() const override { return m_impedanceLimit; } + + void setImpedanceLimit(const size_t limit) override { m_impedanceLimit = limit; } + + // Channel information + bool setChannelCount(const size_t nChannel) override; + bool setChannelName(const size_t index, const char* name) override; + bool setChannelGain(const size_t index, const float gain) override; + bool setChannelUnits(const size_t index, const size_t unit, const size_t factor) override; + + size_t getChannelCount() const override; + const char* getChannelName(const size_t index) const override; + float getChannelGain(const size_t index) const override; + bool getChannelUnits(const size_t index, size_t& unit, size_t& factor) const override; + + bool isChannelCountSet() const override; + bool isChannelNameSet() const override; + bool isChannelGainSet() const override; + bool isChannelUnitSet() const override; + + // Samples information + bool setSamplingFrequency(const size_t sampling) override { return m_basicHeader->setSamplingFrequency(sampling); } + size_t getSamplingFrequency() const override { return m_basicHeader->getSamplingFrequency(); } + bool isSamplingFrequencySet() const override { return m_basicHeader->isSamplingFrequencySet(); } + + //------------- SPECIFIC FUNCTIONS ------------- + + EAcquisitionModes getAcquisitionMode() const { return m_acquisitionMode; } + void setAcquisitionMode(const EAcquisitionModes mode) { m_acquisitionMode = mode; } + + static size_t getEEGChannelCount(size_t acquisitionMode); + static size_t getAuxiliaryChannelCount(size_t acquisitionMode); + static size_t getTriggerChannelCount(size_t acquisitionMode); + + // Pair information + bool setPairCount(const size_t count); + bool setPairName(const size_t index, const char* name); + bool setPairGain(const size_t index, const float gain); + bool setPairUnits(const size_t index, const size_t unit, const size_t factor); + bool setDeviceId(int id); + bool setFastModeSettings(t_faDataModeSettings settings); + + size_t getPairCount() const { return m_nPair; } + const char* getPairName(const size_t index) const; + float getPairGain(const size_t index) const; + bool getPairUnits(const size_t index, size_t& unit, size_t& factor) const; + int getDeviceId() const { return m_deviceID; } + t_faDataModeSettings getFastModeSettings() const { return m_tFastModeSettings; } + + bool isPairCountSet() const { return m_nPair != size_t(-1) && m_nPair != 0; } + bool isPairNameSet() const { return isPairCountSet(); } + bool isPairGainSet() const { return isPairCountSet(); } + bool isPairUnitSet() const { return isPairCountSet(); } + bool isDeviceIdSet() const; + bool isFastModeSettingsSet() const; + + CHeader* getBasicHeader() const { return m_basicHeader; } + +protected: + + CHeader* m_basicHeader = nullptr; // the basic header + + // additional information + int m_deviceID = 0; + EAcquisitionModes m_acquisitionMode = VAmp16; + t_faDataModeSettings m_tFastModeSettings; + + // Pair information + size_t m_nPair = 0; + std::map m_names; + std::map m_gains; + std::map> m_units; + + size_t m_impedanceLimit = 5000; // 5kOhm +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGUSBampCAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCConfigurationEGIAmpServer.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCConfigurationEGIAmpServer.cpp new file mode 100644 index 0000000..8b23ce8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCConfigurationEGIAmpServer.cpp @@ -0,0 +1,42 @@ +#include "ovasCConfigurationEGIAmpServer.h" + +#include + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +bool CConfigurationEGIAmpServer::preConfigure() +{ + const bool res = CConfigurationBuilder::preConfigure(); + + m_pHostName = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_host_name")); + m_pCommandPort = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_command_port")); + m_pStreamPort = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_stream_port")); + + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_pCommandPort), m_commandPort); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_pStreamPort), m_streamPort); + + gtk_entry_set_text(GTK_ENTRY(m_pHostName), m_hostName.toASCIIString()); + + return res; +} + +bool CConfigurationEGIAmpServer::postConfigure() +{ + if (m_applyConfig) + { + gtk_spin_button_update(GTK_SPIN_BUTTON(m_pStreamPort)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_pCommandPort)); + + m_streamPort = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_pStreamPort)); + m_commandPort = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_pCommandPort)); + m_hostName = gtk_entry_get_text(GTK_ENTRY(m_pHostName)); + } + + return CConfigurationBuilder::postConfigure(); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCConfigurationEGIAmpServer.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCConfigurationEGIAmpServer.h new file mode 100644 index 0000000..f3c00ee --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCConfigurationEGIAmpServer.h @@ -0,0 +1,42 @@ +#pragma once + +#include "../ovasCConfigurationBuilder.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class CConfigurationEGIAmpServer final : public CConfigurationBuilder +{ +public: + + explicit CConfigurationEGIAmpServer(const char* gtkBuilderFilename) : CConfigurationBuilder(gtkBuilderFilename) { } + ~CConfigurationEGIAmpServer() override { } + + void setHostName(const CString& hostName) { m_hostName = hostName; } + void setCommandPort(const uint32_t commandPort) { m_commandPort = commandPort; } + void setStreamPort(const uint32_t streamPort) { m_streamPort = streamPort; } + + CString getHostName() const { return m_hostName; } + uint32_t getCommandPort() const { return m_commandPort; } + uint32_t getStreamPort() const { return m_streamPort; } + + +protected: + + bool preConfigure() override; + bool postConfigure() override; + +private: + + CConfigurationEGIAmpServer() = delete; + +protected: + + GtkWidget* m_pHostName = nullptr; + GtkWidget* m_pCommandPort = nullptr; + GtkWidget* m_pStreamPort = nullptr; + CString m_hostName = "localhost"; + uint32_t m_commandPort = 9877; + uint32_t m_streamPort = 9879; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCDriverEGIAmpServer.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCDriverEGIAmpServer.cpp new file mode 100644 index 0000000..531d7c2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCDriverEGIAmpServer.cpp @@ -0,0 +1,311 @@ +#include "ovasCDriverEGIAmpServer.h" +#include "ovasCConfigurationEGIAmpServer.h" + +#include + +#include + +#include +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverEGIAmpServer::CDriverEGIAmpServer(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_EGIAmpServer", m_driverCtx.getConfigurationManager()) +{ + m_serverHostName = "localhost"; + m_commandPort = 9877; + m_streamPort = 9879; + + m_header.setSamplingFrequency(1000); + m_header.setChannelCount(280); + + m_settings.add("Header", &m_header); + m_settings.add("AmpServerHostName", &m_serverHostName); + m_settings.add("CommandPort", &m_commandPort); + m_settings.add("StreamPort", &m_streamPort); + m_settings.load(); +} + +//___________________________________________________________________// +// // + +#define COMMAND_SIZE 4096 + +class CCommandConnectionHandler +{ +public: + + explicit CCommandConnectionHandler(CDriverEGIAmpServer& driver, Socket::IConnection* connection = nullptr) + : m_Driver(driver), m_Connection(connection ? *connection : *driver.m_command), m_ListenToResponse(connection == nullptr) { } + + ~CCommandConnectionHandler() { } + + bool send(const char* cmd) const + { + m_Driver.m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Sending command >> [" << CString(cmd) << "]\n"; + m_Connection.sendBufferBlocking(cmd, strlen(cmd)); + m_Connection.sendBufferBlocking("\n", 1); + if (m_ListenToResponse) + { + size_t i, l = 0; + char buffer[COMMAND_SIZE]; + do + { + i = m_Connection.receiveBuffer(const_cast(buffer + l), 1); + if (i > 0) { l += i; } + } while (i == 0 || (i > 0 && buffer[l - 1] != '\0' && buffer[l - 1] != '\n')); + buffer[l > 1 ? l - 1 : l] = '\0'; + m_Driver.m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Received answer << [" << CString(buffer) << "]\n"; + } + return true; + } + + CDriverEGIAmpServer& m_Driver; + Socket::IConnection& m_Connection; + bool m_ListenToResponse; +}; + +#pragma pack(1) +typedef struct +{ + int64_t amplifierID; + uint64_t size; +} SAmpServerPacketHeader; +#pragma pack() + +// cmdHandler.send("(sendCommand cmd_NumberOfAmps -1 -1 -1)"); +// cmdHandler.send("(sendCommand cmd_SetPower 0 -1 1)"); +// cmdHandler.send("(sendCommand cmd_GetAmpDetails 0 -1 -1)"); +// cmdHandler.send("(sendCommand cmd_GetAmpStatus 0 -1 -1)"); +// cmdHandler.send("(sendCommand cmd_DefaultAcquisitionState 0 -1 -1)"); +// cmdHandler.send("(sendCommand cmd_DefaultSignalGeneration 0 -1 -1)"); +// cmdHandler.send("(sendCommand cmd_SetWaveShape 0 -1 1)"); +// cmdHandler.send("(sendCommand cmd_SetCalibrationSignalRange 0 -1 -1)"); +// cmdHandler.send("(sendCommand cmd_SetCalibrationSignalAmplitude 0 -1 -1)"); +// cmdHandler.send("(sendCommand cmd_SetCalibrationSignalFreq 0 -1 10)"); +// cmdHandler.send("(sendCommand cmd_TurnAllDriveSignals 0 -1 1)"); +// streamHandler.send("(sendCommand cmd_GetStatus -1 -1 -1)"); +// streamHandler.send("(sendCommand cmd_InstallEGINA300TestAmp -1 -1 -1)"); + +// cmdHandler.send("(sendCommand cmd_SetPower 0 -1 0)"); +// cmdHandler.send("(sendCommand cmd_Exit -1 -1 -1)"); + +bool CDriverEGIAmpServer::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) { return false; } + + m_command = Socket::createConnectionClient(); + if (!m_command->connect(m_serverHostName.toASCIIString(), m_commandPort)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not connect to AmpServer command port [" << m_serverHostName << ":" << m_commandPort << "]\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Please check the driver configuration and the firewall configuration\n"; + m_command->close(); + m_command->release(); + m_command = nullptr; + return false; + } + + m_stream = Socket::createConnectionClient(); + if (!m_stream->connect(m_serverHostName.toASCIIString(), m_streamPort)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not connect to AmpServer stream port [" << m_serverHostName << ":" << m_streamPort << "]\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Please check the driver configuration and the firewall configuration\n"; + m_stream->close(); + m_stream->release(); + m_stream = nullptr; + m_command->close(); + m_command->release(); + m_command = nullptr; + return false; + } + + m_buffer = new float[m_header.getChannelCount() * nSamplePerSentBlock]; + if (!m_buffer) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Memory allocation error.\n"; + m_stream->close(); + m_stream->release(); + m_stream = nullptr; + m_command->close(); + m_command->release(); + m_command = nullptr; + return false; + } + + this->execute(Directories::getDataDir() + "/applications/acquisition-server/scripts/egi-default-initialize.script"); + + const CCommandConnectionHandler cmdHandler(*this); + cmdHandler.send("(sendCommand cmd_Start 0 -1 -1)"); + + const CCommandConnectionHandler streamHandler(*this, m_stream); + streamHandler.send("(sendCommand cmd_ListenToAmp 0 -1 -1)"); + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + m_sampleIdx = 0; + m_nChannel = m_header.getChannelCount(); + + return true; +} + +bool CDriverEGIAmpServer::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + this->execute(Directories::getDataDir() + "/applications/acquisition-server/scripts/egi-default-start.script"); + + return true; +} + +bool CDriverEGIAmpServer::loop() +{ + bool completedBuffer = false; + + if (!m_driverCtx.isConnected()) { return false; } + // if(!m_driverCtx.isStarted()) { return true; } + + SAmpServerPacketHeader header; + SAmpServerPacketHeader headerSwap; + + while (m_stream->isReadyToReceive() && !completedBuffer) + { + m_stream->receiveBufferBlocking(reinterpret_cast(&headerSwap), sizeof(headerSwap)); + System::Memory::bigEndianToHost(reinterpret_cast(&headerSwap.amplifierID), &header.amplifierID); + System::Memory::bigEndianToHost(reinterpret_cast(&headerSwap.size), &header.size); + + if (header.size) + { + float* bufferSwap = new float[size_t(header.size / sizeof(float))]; + m_stream->receiveBufferBlocking(reinterpret_cast(bufferSwap), uint32_t(header.size)); + + if (m_driverCtx.isStarted()) + { + const uint32_t nSample = uint32_t(header.size / 1152); + for (uint32_t i = 0; i < nSample; ++i) + { + for (uint32_t j = 0; j < m_nChannel; ++j) + { + System::Memory::bigEndianToHost(reinterpret_cast(bufferSwap + 8 + i * 288 + j), + m_buffer + j * m_nSamplePerSentBlock + m_sampleIdx); + } + + m_sampleIdx++; + if (m_sampleIdx == m_nSamplePerSentBlock) + { + completedBuffer = true; + m_sampleIdx = 0; + m_callback->setSamples(m_buffer); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + } + } + + delete [] bufferSwap; + } + } + + return true; +} + +bool CDriverEGIAmpServer::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + this->execute(Directories::getDataDir() + "/applications/acquisition-server/scripts/egi-default-stop.script"); + + return true; +} + +bool CDriverEGIAmpServer::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_buffer) + { + delete [] m_buffer; + m_buffer = nullptr; + } + + if (m_stream) + { + const CCommandConnectionHandler handler(*this, m_stream); + handler.send("(sendCommand cmd_StopListeningToAmp 0 -1 -1)"); + + m_stream->close(); + m_stream->release(); + m_stream = nullptr; + } + + if (m_command) + { + const CCommandConnectionHandler handler(*this); + handler.send("(sendCommand cmd_Stop 0 -1 -1)"); + + this->execute(Directories::getDataDir() + "/applications/acquisition-server/scripts/egi-default-uninitialize.script"); + + m_command->close(); + m_command->release(); + m_command = nullptr; + } + + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverEGIAmpServer::configure() +{ + CConfigurationEGIAmpServer config(Directories::getDataDir() + "/applications/acquisition-server/interface-egi-ampserver.ui"); + + config.setHostName(m_serverHostName); + config.setCommandPort(m_commandPort); + config.setStreamPort(m_streamPort); + + if (config.configure(m_header)) + { + m_serverHostName = config.getHostName(); + m_commandPort = config.getCommandPort(); + m_streamPort = config.getStreamPort(); + m_settings.save(); + return true; + } + return false; +} + +//___________________________________________________________________// +// // + +bool CDriverEGIAmpServer::execute(const char* sScriptFilename) +{ + FILE* file = fopen(sScriptFilename, "rb"); + if (!file) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Could not find script [" << CString(sScriptFilename) << "]\n"; + return false; + } + + const CCommandConnectionHandler cmdHandler(*this); + while (!feof(file)) + { + char buffer[4096]; + char* line = fgets(buffer, sizeof(buffer), file); + if (line) + { + line[strlen(line) - 1] = '\0'; // replaces \n with \0 (\n is automatically added by the command handler) + cmdHandler.send(line); + } + } + + fclose(file); + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCDriverEGIAmpServer.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCDriverEGIAmpServer.h new file mode 100644 index 0000000..7aafb1f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCDriverEGIAmpServer.h @@ -0,0 +1,63 @@ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { +class CCommandConnectionHandler; + +/** + * \class CDriverEGIAmpServer + * \author Yann Renard (Inria) + */ +class CDriverEGIAmpServer final : public IDriver +{ +public: + + friend class CCommandConnectionHandler; + + explicit CDriverEGIAmpServer(IDriverContext& ctx); + void release() { delete this; } + const char* getName() override { return "EGI Net Amps 300 (through AmpServer)"; } + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + + bool execute(const char* sScriptFilename); + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + Socket::IConnectionClient* m_command = nullptr; + Socket::IConnectionClient* m_stream = nullptr; + uint32_t m_nSamplePerSentBlock = 0; + uint32_t m_sampleIdx = 0; + uint32_t m_nChannel = 0; + float* m_buffer = nullptr; + + CString m_serverHostName = "localhost"; + uint32_t m_commandPort = 9877; + uint32_t m_streamPort = 9879; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.cpp new file mode 100644 index 0000000..221cd3c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.cpp @@ -0,0 +1,54 @@ +#if defined TARGET_HAS_ThirdPartyEmotivAPI + +#include "ovasCConfigurationEmotivEPOC.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +CConfigurationEmotivEPOC::CConfigurationEmotivEPOC(IDriverContext& ctx, const char* gtkBuilderFilename, bool& rUseGyroscope, CString& rPathToEmotivResearchSDK, uint32_t& rUserID) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx), m_useGyroscope(rUseGyroscope), m_rPathToEmotivResearchSDK(rPathToEmotivResearchSDK), m_userID(rUserID) {} + +bool CConfigurationEmotivEPOC::preConfigure() +{ + if (! CConfigurationBuilder::preConfigure()) { return false; } + + GtkToggleButton* gyro = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_gyro")); + gtk_toggle_button_set_active(gyro, m_useGyroscope); + + GtkFileChooser* fileChooser = GTK_FILE_CHOOSER(gtk_builder_get_object(m_builder, "filechooserbutton")); + gtk_file_chooser_set_current_folder(fileChooser, m_rPathToEmotivResearchSDK.toASCIIString()); + + GtkSpinButton* userID = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_userid")); + gtk_spin_button_set_value(userID, m_userID); + return true; +} + +bool CConfigurationEmotivEPOC::postConfigure() +{ + if (m_applyConfig) + { + GtkToggleButton* gyro = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_gyro")); + m_useGyroscope = gtk_toggle_button_get_active(gyro) ? true : false; + + GtkSpinButton* userID = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_userid")); + gtk_spin_button_update(userID); + m_userID = uint32_t(gtk_spin_button_get_value(userID)); + + GtkFileChooser* fileChooser = GTK_FILE_CHOOSER(gtk_builder_get_object(m_builder, "filechooserbutton")); + gchar* dir = gtk_file_chooser_get_filename(fileChooser); + std::string tmpDstDir(dir); + for (auto it = tmpDstDir.begin(); it < tmpDstDir.end(); ++it) { if ((*it) == '\\') { tmpDstDir.replace(it, it + 1, 1, '/'); } } + tmpDstDir.push_back('/'); + m_rPathToEmotivResearchSDK = tmpDstDir.c_str(); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Path to Emotiv Research SDK is set to [" << m_rPathToEmotivResearchSDK.toASCIIString() << "]\n"; + } + + if (! CConfigurationBuilder::postConfigure()) { return false; } // normal header is filled, ressources are realesed + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyEmotivAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.h new file mode 100644 index 0000000..c1129e2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.h @@ -0,0 +1,44 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyEmotivAPI + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include + +#if defined TARGET_OS_Windows +#include +#endif + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationEmotivEPOC + * \author Laurent Bonnet (INRIA) + * \date 21 july 2010 + * \erief The CConfigurationEmotivEPOC handles the configuration dialog specific to the Emotiv EPOC headset. + * + * \sa CDriverEmotivEPOC + */ +class CConfigurationEmotivEPOC final : public CConfigurationBuilder +{ +public: + + CConfigurationEmotivEPOC(IDriverContext& ctx, const char* gtkBuilderFilename, bool& rUseGyroscope, CString& rPathToEmotivResearchSDK, uint32_t& rUserID); + + bool preConfigure() override; + bool postConfigure() override; + +protected: + + IDriverContext& m_driverCtx; + bool& m_useGyroscope; + CString& m_rPathToEmotivResearchSDK; + uint32_t& m_userID; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyEmotivAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCDriverEmotivEPOC.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCDriverEmotivEPOC.cpp new file mode 100644 index 0000000..8ee45ad --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCDriverEmotivEPOC.cpp @@ -0,0 +1,422 @@ +#if defined TARGET_HAS_ThirdPartyEmotivAPI + +#include "ovasCDriverEmotivEPOC.h" +#include "ovasCConfigurationEmotivEPOC.h" + +#include + +#include +#include + +#include +#include + +#if defined(TARGET_OS_Windows) +#include +#endif + +namespace OpenViBE { +namespace AcquisitionServer { + + +#if defined(TARGET_HAS_ThirdPartyEmotivResearchAPI3x) +static const IEE_DataChannel_t CHANNEL_LIST[] = +{ + IED_AF3, IED_F7, IED_F3, IED_FC5, IED_T7, IED_P7, IED_O1, IED_O2, IED_P8, IED_T8, IED_FC6, IED_F4, IED_F8, IED_AF4, + IED_GYROX, IED_GYROY, + IED_COUNTER, + IED_TIMESTAMP, + IED_FUNC_ID, IED_FUNC_VALUE, + IED_MARKER, + IED_SYNC_SIGNAL +}; +#else +// Old API +static const EE_DataChannel_t CHANNEL_LIST[] = +{ + ED_AF3, ED_F7, ED_F3, ED_FC5, ED_T7, ED_P7, ED_O1, ED_O2, ED_P8, ED_T8, ED_FC6, ED_F4, ED_F8, ED_AF4, + ED_GYROX, ED_GYROY, + ED_COUNTER, + ED_TIMESTAMP, + ED_FUNC_ID, ED_FUNC_VALUE, + ED_MARKER, + ED_SYNC_SIGNAL +}; +#endif + +CDriverEmotivEPOC::CDriverEmotivEPOC(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_EmotivEPOC", m_driverCtx.getConfigurationManager()) +{ + m_useGyroscope = false; + m_pathToEmotivSDK = ""; + m_cmdForPathModification = ""; + + m_userID = 0; + m_readyToCollect = false; + m_firstStart = true; + + m_settings.add("Header", &m_header); + m_settings.add("UseGyroscope", &m_useGyroscope); + m_settings.add("PathToEmotivSDK", &m_pathToEmotivSDK); + m_settings.add("UserID", &m_userID); + m_settings.load(); +} + +CDriverEmotivEPOC::~CDriverEmotivEPOC() {} + +const char* CDriverEmotivEPOC::getName() { return "Emotiv EPOC"; } + +bool CDriverEmotivEPOC::restoreState() +{ + // Restore the previous path + if (m_oldPath.length() > 0) { _putenv_s("PATH", m_oldPath); } + +#if defined TARGET_OS_Windows + __FUnloadDelayLoadedDLL2("edk.dll"); +#endif + + return true; +} + +bool CDriverEmotivEPOC::buildPath() +{ + char* path = getenv("PATH"); + if (path == nullptr) { return false; } + + m_oldPath = path; + + const std::string str = std::string(path); + const size_t found = str.find(m_pathToEmotivSDK.toASCIIString()); + + if (found == std::string::npos) + { + // If the emotiv component is not part of the path, we add it. + m_cmdForPathModification = path + CString(";") + m_pathToEmotivSDK; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] Emotiv Driver: Building new Windows PATH.\n"; + } + else + { + // If we found the emotiv component in path already, keep the path as-is. + m_cmdForPathModification = CString(path); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] Emotiv Driver: Using the existing PATH.\n"; + } + + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverEmotivEPOC::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_eventHandle = nullptr; + + //we need to add the path to Emotiv SDK to PATH: done in external function + //because SEH (__try/__except) does not allow the use of local variables with destructor. + if (!this->buildPath()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Emotiv Driver: Failed to get the ENV variable PATH.\n"; + return false; + } + +#if defined TARGET_OS_Windows + // m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "[INIT] Emotiv Driver: Setting PATH as " << m_cmdForPathModification << "\n"; + + if (_putenv_s("PATH", m_cmdForPathModification) != 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Emotiv Driver: Failed to modify the environment PATH with the Emotiv SDK path.\n"; + return false; + } +#endif + + m_header.setChannelCount(14); + if (m_useGyroscope) + { + m_header.setChannelCount(16); // 14 + 2 REF + 2 Gyro + } + + m_header.setChannelName(0, "AF3"); + m_header.setChannelName(1, "F7"); + m_header.setChannelName(2, "F3"); + m_header.setChannelName(3, "FC5"); + m_header.setChannelName(4, "T7"); + m_header.setChannelName(5, "P7"); + m_header.setChannelName(6, "O1"); + m_header.setChannelName(7, "O2"); + m_header.setChannelName(8, "P8"); + m_header.setChannelName(9, "T8"); + m_header.setChannelName(10, "FC6"); + m_header.setChannelName(11, "F4"); + m_header.setChannelName(12, "F8"); + m_header.setChannelName(13, "AF4"); + + if (m_useGyroscope) + { + m_header.setChannelName(14, "Gyro-X"); + m_header.setChannelName(15, "Gyro-Y"); + } + + m_header.setSamplingFrequency(128); // let's hope so... + + // Set channel units + // Various sources (e.g. http://emotiv.com/forum/forum15/topic879/messages/?PAGEN_1=3 + // and http://www.bci2000.org/wiki/index.php/Contributions:Emotiv ) suggested + // that the units from the device are in microvolts, but with a typical DC offset around 4000. + // Hard to find official source. + for (uint32_t c = 0; c < 14; ++c) { m_header.setChannelUnits(c, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); } + if (m_useGyroscope) + { + // Even less sure about the units of these, leaving as unspecified. + m_header.setChannelUnits(14, OVTK_UNIT_Unspecified, OVTK_FACTOR_Base); + m_header.setChannelUnits(15, OVTK_UNIT_Unspecified, OVTK_FACTOR_Base); + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "INIT called.\n"; + if (m_driverCtx.isConnected()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Emotiv Driver: Driver already initialized.\n"; + restoreState(); + return false; + } + + if (!m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Emotiv Driver: Channel count or frequency not set.\n"; + restoreState(); + return false; + } + + //--------------------------------------------------------- + // Builds up a buffer to store acquired samples. This buffer will be sent to the acquisition server later. + + m_sample = new float[m_header.getChannelCount()]; + //m_Buffer=new double[m_header.getChannelCount()*nSamplePerSentBlock]; + if (!m_sample /*|| !m_Buffer*/) + { + delete [] m_sample; + //delete [] m_Buffer; + m_sample = nullptr; + //m_Buffer= nullptr; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Emotiv Driver: Samples allocation failed.\n"; + restoreState(); + return false; + } + + //__________________________________ + // Hardware initialization + + m_readyToCollect = false; +#if defined TARGET_OS_Windows + // First call to a function from EDK.DLL: guard the call with __try/__except clauses. + __try +#elif defined TARGET_OS_Linux + try +#endif + { + m_eventHandle = IEE_EmoEngineEventCreate(); + m_lastErrorCode = IEE_EngineConnect(); + } +#if defined TARGET_OS_Windows + __except (EXCEPTION_EXECUTE_HANDLER) +#elif defined TARGET_OS_Linux + catch(...) +#endif + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Emotiv Driver: First call to 'edk.dll' failed.\n" + << "\tThis driver needs Emotiv SDK Research Edition (or better)\n" + << "\tinstalled on your computer.\n" + << "\tYou have configured the driver to use path [" << m_pathToEmotivSDK << "].\n" + << "\tIf there is an 'edk.dll' there, its version may be incompatible.\n" + << "\tThis driver was built against 32-bit (x86) Emotiv SDK v " +#if defined(TARGET_HAS_ThirdPartyEmotivResearchAPI3x) + << "3.x.x.\n"; +#else + << "1.x.x.\n"; +#endif + + restoreState(); + return false; + } + + if (m_lastErrorCode != EDK_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Emotiv Driver: Can't connect to EmoEngine. EDK Error Code [" << m_lastErrorCode << "]\n"; + restoreState(); + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] Emotiv Driver: Connection to EmoEngine successful.\n"; + +#if defined(TARGET_HAS_ThirdPartyEmotivResearchAPI) + unsigned long hwVersion = 0; + unsigned long buildNum = 0; + char version[16]; + + IEE_HardwareGetVersion(m_userID, &hwVersion); + IEE_SoftwareGetVersion(version, 16, &buildNum); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Emotiv Driver: " + << "headset version " << uint64_t(hwVersion && 0xFFFF) << " / " << uint64_t(hwVersion >> 16) + << ", software " << version << ", build " << uint64_t(buildNum) << "\n"; +#endif + + //__________________________________ + // Saves parameters + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; +} + +bool CDriverEmotivEPOC::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "START called.\n"; + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + m_dataHandle = IEE_DataCreate(); + //float sec = (float)m_nSamplePerSentBlock/(float)m_header.getSamplingFrequency(); + float sec = 1; + m_lastErrorCode = IEE_DataSetBufferSizeInSec(sec); + if (m_lastErrorCode != EDK_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[START] Emotiv Driver: Set buffer size to [" << sec << "] sec failed. EDK Error Code [" << m_lastErrorCode << "]\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[START] Emotiv Driver: Data Handle created. Buffer size set to [" << sec << "] sec.\n"; + + return true; +} + +bool CDriverEmotivEPOC::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + + if (m_driverCtx.isStarted()) + { + // we enable the acquisiton for every new headset (user) ever added + if (IEE_EngineGetNextEvent(m_eventHandle) == EDK_OK) + { + IEE_Event_t type = IEE_EmoEngineEventGetType(m_eventHandle); + + + if (type == IEE_UserAdded) + { + uint32_t id; + IEE_EmoEngineEventGetUserId(m_eventHandle, &id); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[LOOP] Emotiv Driver: User #" << id << " registered.\n"; + m_lastErrorCode = IEE_DataAcquisitionEnable(id, true); + if (m_lastErrorCode != EDK_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[LOOP] Emotiv Driver: Enabling acquisition failed. EDK Error Code [" << m_lastErrorCode << "]\n"; + return false; + } + // but we are ready to acquire the samples only if the requested headset is detected + m_readyToCollect = m_readyToCollect || (m_userID == id); + } + } + + if (m_readyToCollect) + { + uint32_t nSamplesTaken = 0; + m_lastErrorCode = IEE_DataUpdateHandle(m_userID, m_dataHandle); + if (m_lastErrorCode != EDK_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[LOOP] Emotiv Driver: An error occurred while updating the DataHandle. EDK Error Code [" << m_lastErrorCode << "]\n"; + return false; + } + m_lastErrorCode = IEE_DataGetNumberOfSample(m_dataHandle, &nSamplesTaken); + if (m_lastErrorCode != EDK_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[LOOP] Emotiv Driver: An error occurred while getting new samples from device. EDK Error Code [" << m_lastErrorCode << "]\n"; + return false; + } + // warning : if you connect/disconnect then reconnect, the internal buffer may be full of samples, thus maybe nSamplesTaken > m_nSamplePerSentBlock + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "EMOTIV EPOC >>> received [" << nSamplesTaken << "] samples per channel from device with user #" << m_userID << ".\n"; + + /* + for (size_t i=0; i>> adding sample with value ["<< buffer[s] <<"]\n"; + m_sample[i*m_nSamplePerSentBlock + s] = (float)buffer[s]; + delete [] buffer; + } + m_callback->setSamples(m_sample); + } + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + */ + + double* buffer = new double[nSamplesTaken]; + for (uint32_t s = 0; s < nSamplesTaken; ++s) + { + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + m_lastErrorCode = IEE_DataGet(m_dataHandle, CHANNEL_LIST[i], buffer, nSamplesTaken); + if (m_lastErrorCode != EDK_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[LOOP] Emotiv Driver: An error occurred while getting new samples from device. EDK Error Code [" << m_lastErrorCode << "]\n"; + return false; + } + m_sample[i] = float(buffer[s]); + if (s == 0) m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "EMOTIV EPOC >>> sample received has value [" << buffer[s] << "]\n"; + //m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "EMOTIV EPOC >>> sample stored has value ["<< m_sample[i] <<"]\n"; + } + m_callback->setSamples(m_sample, 1); + } + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + delete [] buffer; + } + } + + return true; +} + +bool CDriverEmotivEPOC::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "STOP called.\n"; + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + IEE_DataFree(m_dataHandle); + + return true; +} + +bool CDriverEmotivEPOC::uninitialize() +{ + IEE_EngineDisconnect(); + + if (m_eventHandle) + { + IEE_EmoEngineEventFree(m_eventHandle); + m_eventHandle = nullptr; + } + + restoreState(); + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverEmotivEPOC::configure() +{ + CConfigurationEmotivEPOC config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-Emotiv-EPOC.ui", m_useGyroscope, m_pathToEmotivSDK, m_userID); + + if (!config.configure(m_header)) { return false; } + m_settings.save(); + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyEmotivAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCDriverEmotivEPOC.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCDriverEmotivEPOC.h new file mode 100644 index 0000000..e52cea1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCDriverEmotivEPOC.h @@ -0,0 +1,110 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyEmotivAPI + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include + +#if defined(TARGET_HAS_ThirdPartyEmotivResearchAPI3x) +#include "IEmoStateDLL.h" +#include "Iedk.h" +#include "IedkErrorCode.h" +#include "IEegData.h" +#else +// Old API +#include "EmoStateDLL.h" +#include "edk.h" +#include "edkErrorCode.h" + +#define IEE_DataAcquisitionEnable EE_DataAcquisitionEnable +#define IEE_DataCreate EE_DataCreate +#define IEE_DataFree EE_DataFree +#define IEE_DataGet EE_DataGet +#define IEE_DataGetNumberOfSample EE_DataGetNumberOfSample +#define IEE_DataSetBufferSizeInSec EE_DataSetBufferSizeInSec +#define IEE_DataUpdateHandle EE_DataUpdateHandle +#define IEE_EmoEngineEventCreate EE_EmoEngineEventCreate +#define IEE_EmoEngineEventFree EE_EmoEngineEventFree +#define IEE_EmoEngineEventGetType EE_EmoEngineEventGetType +#define IEE_EmoEngineEventGetUserId EE_EmoEngineEventGetUserId +#define IEE_EngineConnect EE_EngineConnect +#define IEE_EngineDisconnect EE_EngineDisconnect +#define IEE_EngineGetNextEvent EE_EngineGetNextEvent +#define IEE_Event_t EE_Event_t +#define IEE_UserAdded EE_UserAdded +#endif + +#include + +#if defined TARGET_OS_Windows +#include +#endif + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverEmotivEPOC + * \author Laurent Bonnet (INRIA) + * \date 21 july 2010 + * \erief The CDriverEmotivEPOC allows the acquisition server to acquire data from a Emotiv EPOC amplifier, Research Edition or above. + * + */ +class CDriverEmotivEPOC final : public IDriver +{ +public: + + explicit CDriverEmotivEPOC(IDriverContext& ctx); + ~CDriverEmotivEPOC() override; + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + uint32_t m_nTotalSample = 0; + float* m_sample = nullptr; + //double* m_Buffer; + +private: + bool buildPath(); + bool restoreState(); + + uint32_t m_lastErrorCode = 0; + + EmoEngineEventHandle m_eventHandle; + uint32_t m_userID = 0; + bool m_readyToCollect = false; + + DataHandle m_dataHandle; + bool m_firstStart = false; + + bool m_useGyroscope = false; + CString m_pathToEmotivSDK; + CString m_cmdForPathModification; + CString m_oldPath; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyEmotivAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_1024.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_1024.bin new file mode 100644 index 0000000..ea8e325 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_1024.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_128.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_128.bin new file mode 100644 index 0000000..f743943 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_128.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_2048.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_2048.bin new file mode 100644 index 0000000..016dbfd Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_2048.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_256.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_256.bin new file mode 100644 index 0000000..08170f8 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_256.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_4096.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_4096.bin new file mode 100644 index 0000000..dc55f62 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_4096.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_512.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_512.bin new file mode 100644 index 0000000..993a2a9 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_100k_512.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_1024.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_1024.bin new file mode 100644 index 0000000..f9a33d2 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_1024.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_128.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_128.bin new file mode 100644 index 0000000..ed2c5bd Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_128.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_2048.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_2048.bin new file mode 100644 index 0000000..913aaf7 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_2048.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_256.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_256.bin new file mode 100644 index 0000000..64cf1c6 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_256.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_4096.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_4096.bin new file mode 100644 index 0000000..263fe8e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_4096.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_512.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_512.bin new file mode 100644 index 0000000..7a9276e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_10k_512.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_1024.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_1024.bin new file mode 100644 index 0000000..f068dda Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_1024.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_128.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_128.bin new file mode 100644 index 0000000..8d9e396 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_128.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_2048.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_2048.bin new file mode 100644 index 0000000..e09ebf5 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_2048.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_256.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_256.bin new file mode 100644 index 0000000..95b35af Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_256.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_4096.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_4096.bin new file mode 100644 index 0000000..5d27ee9 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_4096.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_512.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_512.bin new file mode 100644 index 0000000..bb6d53c Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_25k_512.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_1024.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_1024.bin new file mode 100644 index 0000000..baf1be9 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_1024.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_128.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_128.bin new file mode 100644 index 0000000..a8700db Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_128.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_2048.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_2048.bin new file mode 100644 index 0000000..552e326 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_2048.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_256.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_256.bin new file mode 100644 index 0000000..f5d0738 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_256.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_4096.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_4096.bin new file mode 100644 index 0000000..0bbc656 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_4096.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_512.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_512.bin new file mode 100644 index 0000000..86ab9db Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_50k_512.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_1024.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_1024.bin new file mode 100644 index 0000000..443b753 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_1024.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_128.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_128.bin new file mode 100644 index 0000000..1afe689 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_128.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_2048.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_2048.bin new file mode 100644 index 0000000..df8fca2 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_2048.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_256.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_256.bin new file mode 100644 index 0000000..e2cb574 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_256.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_4096.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_4096.bin new file mode 100644 index 0000000..53482ee Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_4096.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_512.bin b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_512.bin new file mode 100644 index 0000000..9b6a08e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/filters/f64_5k_512.bin differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCConfigurationDriverGenericOscillator.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCConfigurationDriverGenericOscillator.cpp new file mode 100644 index 0000000..844d375 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCConfigurationDriverGenericOscillator.cpp @@ -0,0 +1,43 @@ +#include "ovasCConfigurationDriverGenericOscillator.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +CConfigurationDriverGenericOscillator::CConfigurationDriverGenericOscillator(IDriverContext& ctx, const char* gtkBuilderFilename, + bool& sendPeriodicStimulations, double& stimulationInterval) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx), m_sendPeriodicStimulations(sendPeriodicStimulations), + m_stimulationInterval(stimulationInterval) {} + +bool CConfigurationDriverGenericOscillator::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + GtkToggleButton* sendPeriodicStims = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_send_periodic_stimulations")); + GtkSpinButton* stimulationInterval = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_stimulation_interval")); + + gtk_toggle_button_set_active(sendPeriodicStims, m_sendPeriodicStimulations); + gtk_spin_button_set_value(stimulationInterval, m_stimulationInterval); + + return true; +} + +bool CConfigurationDriverGenericOscillator::postConfigure() +{ + if (m_applyConfig) + { + GtkToggleButton* sendPeriodicStims = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_send_periodic_stimulations")); + GtkSpinButton* stimulationInterval = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_stimulation_interval")); + + m_sendPeriodicStimulations = (gtk_toggle_button_get_active(sendPeriodicStims) > 0); + + gtk_spin_button_update(stimulationInterval); + m_stimulationInterval = gtk_spin_button_get_value(stimulationInterval); + } + + if (!CConfigurationBuilder::postConfigure()) { return false; } + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCConfigurationDriverGenericOscillator.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCConfigurationDriverGenericOscillator.h new file mode 100644 index 0000000..a3d3aea --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCConfigurationDriverGenericOscillator.h @@ -0,0 +1,33 @@ +#pragma once + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationDriverGenericOscillator + * \author Jozef Legeny (Inria) + * \date 28 jan 2013 + * \brief The CConfigurationDriverGenericOscillator handles the configuration dialog specific to the Generic Oscillator driver + * + * \sa CDriverGenericOscillator + */ + +class CConfigurationDriverGenericOscillator final : public CConfigurationBuilder +{ +public: + CConfigurationDriverGenericOscillator(IDriverContext& ctx, const char* gtkBuilderFilename, bool& sendPeriodicStimulations, double& stimulationInterval); + + bool preConfigure() override; + bool postConfigure() override; + +protected: + + IDriverContext& m_driverCtx; + + bool& m_sendPeriodicStimulations; + double& m_stimulationInterval; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCDriverGenericOscillator.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCDriverGenericOscillator.cpp new file mode 100644 index 0000000..1ff460c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCDriverGenericOscillator.cpp @@ -0,0 +1,171 @@ +#include "ovasCDriverGenericOscillator.h" +#include "ovasCConfigurationDriverGenericOscillator.h" + +#include + +#include + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverGenericOscillator::CDriverGenericOscillator(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_GenericOscillator", m_driverCtx.getConfigurationManager()), m_stimulationInterval(1.0) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::CDriverGenericOscillator\n"; + + m_header.setSamplingFrequency(512); + m_header.setChannelCount(4); + + m_settings.add("Header", &m_header); + m_settings.add("SendPeriodicStimulations", &m_sendPeriodicStimulations); + m_settings.add("StimulationInterval", &m_stimulationInterval); + m_settings.load(); +} + +void CDriverGenericOscillator::release() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::release\n"; + delete this; +} + +const char* CDriverGenericOscillator::getName() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::getName\n"; + return "Generic Oscillator"; +} + +//___________________________________________________________________// +// // + +bool CDriverGenericOscillator::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::initialize\n"; + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + m_header.setChannelUnits(i, OVTK_UNIT_Volts, OVTK_FACTOR_Base); + if (CString(m_header.getChannelName(i)) == CString("")) + { + std::stringstream ss; + ss << "Oscillator " << (i + 1); + m_header.setChannelName(i, ss.str().c_str()); + } + } + + m_samples.resize(m_header.getChannelCount() * nSamplePerSentBlock); + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + m_stimSet.setStimulationCount(1); + m_stimSet.setStimulationIdentifier(0, OVTK_StimulationId_Label_00); + m_stimSet.setStimulationDate(0, 0); + m_stimSet.setStimulationDuration(0, 0); + + return true; +} + +bool CDriverGenericOscillator::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::start\n"; + + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + m_nTotalSample = 0; + m_startTime = System::Time::zgetTime(); + m_nTotalStim = 0; + + return true; +} + +bool CDriverGenericOscillator::loop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverGenericOscillator::loop\n"; + + if (!m_driverCtx.isConnected()) { return false; } + + if (m_driverCtx.isStarted()) + { + // Generate the contents we want to send next + const uint64_t elapsed = System::Time::zgetTime() - m_startTime; + const uint64_t samplesNeededSoFar = CTime(elapsed).toSampleCount(m_header.getSamplingFrequency()); + if (samplesNeededSoFar <= m_nTotalSample) + { + // Too early + return true; + } + const size_t remainingSamples = size_t(samplesNeededSoFar - m_nTotalSample); + if (remainingSamples * m_header.getChannelCount() > m_samples.size()) { m_samples.resize(remainingSamples * m_header.getChannelCount()); } + + // std::cout << "At " << CTime(elapsed).toSeconds() * 1000 << "ms, remaining " << remainingSamples << " samples\n"; + for (size_t i = 0; i < remainingSamples; ++i) + { + for (size_t j = 0; j < m_header.getChannelCount(); ++j) + { + const double value = sin((m_nTotalSample * (j + 1) * 12.3) / m_header.getSamplingFrequency()) + + sin((m_nTotalSample * (j + 1) * 4.5) / m_header.getSamplingFrequency()) + + sin((m_nTotalSample * (j + 1) * 67.8) / m_header.getSamplingFrequency()); + m_samples[j * remainingSamples + i] = float(value); + } + m_nTotalSample++; + } + + m_callback->setSamples(&m_samples[0], remainingSamples); + + if (m_sendPeriodicStimulations && elapsed >= m_nTotalStim * CTime(m_stimulationInterval).time()) + { + m_callback->setStimulationSet(m_stimSet); + m_nTotalStim++; + } + + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + else { if (m_driverCtx.isImpedanceCheckRequested()) { for (size_t j = 0; j < m_header.getChannelCount(); ++j) { m_driverCtx.updateImpedance(j, 1); } } } + + return true; +} + +bool CDriverGenericOscillator::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::stop\n"; + return (m_driverCtx.isConnected() && m_driverCtx.isStarted()); +} + +bool CDriverGenericOscillator::uninitialize() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::uninitialize\n"; + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + m_callback = nullptr; + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverGenericOscillator::isConfigurable() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::isConfigurable\n"; + return true; +} + +bool CDriverGenericOscillator::configure() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::configure\n"; + + CConfigurationDriverGenericOscillator config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-Generic-Oscillator.ui", + m_sendPeriodicStimulations, m_stimulationInterval); + + if (config.configure(m_header)) + { + m_settings.save(); + return true; + } + + return false; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCDriverGenericOscillator.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCDriverGenericOscillator.h new file mode 100644 index 0000000..34f010f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCDriverGenericOscillator.h @@ -0,0 +1,54 @@ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverGenericOscillator + * \author Yann Renard (INRIA) + */ +class CDriverGenericOscillator final : public IDriver +{ +public: + + explicit CDriverGenericOscillator(IDriverContext& ctx); + void release(); + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + std::vector m_samples; + + uint32_t m_nTotalSample = 0; + uint64_t m_nTotalStim = 0; + uint64_t m_startTime = 0; + + CStimulationSet m_stimSet; + +private: + bool m_sendPeriodicStimulations = false; + double m_stimulationInterval = 0; // Seconds +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCConfigurationGenericRawReader.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCConfigurationGenericRawReader.cpp new file mode 100644 index 0000000..1b9fc23 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCConfigurationGenericRawReader.cpp @@ -0,0 +1,64 @@ +#include "ovasCConfigurationGenericRawReader.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +CConfigurationGenericRawReader::CConfigurationGenericRawReader(const char* gtkBuilderFilename, bool& limitSpeed, uint32_t& sampleFormat, uint32_t& sampleEndian, + uint32_t& startSkip, uint32_t& headerSkip, uint32_t& footerSkip, CString& filename) + : CConfigurationNetworkBuilder(gtkBuilderFilename), m_limitSpeed(limitSpeed), m_sampleFormat(sampleFormat), m_sampleEndian(sampleEndian), + m_startSkip(startSkip), m_headerSkip(headerSkip), m_footerSkip(footerSkip), m_filename(filename) {} + +bool CConfigurationGenericRawReader::preConfigure() +{ + if (!CConfigurationNetworkBuilder::preConfigure()) { return false; } + + GtkToggleButton* speedLimit = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_limit_speed")); + GtkEntry* filename = GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_filename")); + GtkComboBox* endianness = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_endianness")); + GtkComboBox* sampleType = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sample_type")); + GtkSpinButton* startSize = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_start_size")); + GtkSpinButton* headerSize = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_header_size")); + GtkSpinButton* footerSize = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_footer_size")); + + gtk_toggle_button_set_active(speedLimit, m_limitSpeed ? TRUE : FALSE); + gtk_entry_set_text(filename, m_filename.toASCIIString()); + gtk_combo_box_set_active(endianness, m_sampleEndian); + gtk_combo_box_set_active(sampleType, m_sampleFormat); + gtk_spin_button_set_value(startSize, m_startSkip); + gtk_spin_button_set_value(headerSize, m_headerSkip); + gtk_spin_button_set_value(footerSize, m_footerSkip); + + return true; +} + +bool CConfigurationGenericRawReader::postConfigure() +{ + if (m_applyConfig) + { + GtkToggleButton* speedLimit = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_limit_speed")); + GtkEntry* filename = GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_filename")); + GtkComboBox* endianness = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_endianness")); + GtkComboBox* sampleType = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sample_type")); + GtkSpinButton* startSize = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_start_size")); + GtkSpinButton* headerSize = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_header_size")); + GtkSpinButton* footerSize = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_footer_size")); + + gtk_spin_button_update(startSize); + gtk_spin_button_update(headerSize); + gtk_spin_button_update(footerSize); + + m_limitSpeed = gtk_toggle_button_get_active(speedLimit) ? true : false; + m_filename = gtk_entry_get_text(filename); + m_sampleEndian = uint32_t(gtk_combo_box_get_active(endianness)); + m_sampleFormat = uint32_t(gtk_combo_box_get_active(sampleType)); + m_startSkip = uint32_t(gtk_spin_button_get_value(startSize)); + m_headerSkip = uint32_t(gtk_spin_button_get_value(headerSize)); + m_footerSkip = uint32_t(gtk_spin_button_get_value(footerSize)); + } + + if (!CConfigurationNetworkBuilder::postConfigure()) { return false; } + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCConfigurationGenericRawReader.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCConfigurationGenericRawReader.h new file mode 100644 index 0000000..225fdcd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCConfigurationGenericRawReader.h @@ -0,0 +1,28 @@ +#pragma once + +#include "../ovasCConfigurationNetworkBuilder.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class CConfigurationGenericRawReader final : public CConfigurationNetworkBuilder +{ +public: + + CConfigurationGenericRawReader(const char* gtkBuilderFilename, bool& limitSpeed, uint32_t& sampleFormat, uint32_t& sampleEndian, + uint32_t& startSkip, uint32_t& headerSkip, uint32_t& footerSkip, CString& filename); + +protected: + + bool preConfigure() override; + bool postConfigure() override; + + bool& m_limitSpeed; + uint32_t& m_sampleFormat; + uint32_t& m_sampleEndian; + uint32_t& m_startSkip; + uint32_t& m_headerSkip; + uint32_t& m_footerSkip; + CString& m_filename; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawFileReader.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawFileReader.cpp new file mode 100644 index 0000000..60bcd83 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawFileReader.cpp @@ -0,0 +1,71 @@ +#include "ovasCDriverGenericRawFileReader.h" +#include "ovasCConfigurationGenericRawReader.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverGenericRawFileReader::CDriverGenericRawFileReader(IDriverContext& ctx) + : CDriverGenericRawReader(ctx), m_settings("AcquisitionServer_Driver_GenericRawFileReader", m_driverCtx.getConfigurationManager()) +{ + m_filename = "/tmp/some_raw_file"; + + // Relay configuration properties to the configuration manager + + m_settings.add("Header", &m_header); + m_settings.add("LimitSpeed", &m_limitSpeed); + m_settings.add("SampleFormat", &m_sampleFormat); + m_settings.add("SampleEndian", &m_sampleEndian); + m_settings.add("StartSkip", &m_startSkip); + m_settings.add("HeaderSkip", &m_headerSkip); + m_settings.add("FooterSkip", &m_footerSkip); + m_settings.add("FileName", &m_filename); + m_settings.load(); +} + +bool CDriverGenericRawFileReader::configure() +{ + CConfigurationGenericRawReader config(Directories::getDataDir() + "/applications/acquisition-server/interface-Generic-RawFileReader.ui", m_limitSpeed, + m_sampleFormat, m_sampleEndian, m_startSkip, m_headerSkip, m_footerSkip, m_filename); + + if (!config.configure(m_header)) { return false; } + m_settings.save(); + return true; +} + +bool CDriverGenericRawFileReader::open() +{ + m_file = fopen(m_filename.toASCIIString(), "rb"); + if (!m_file) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not open file [" << m_filename << "]\n"; + return false; + } + if (fseek(m_file, m_startSkip, SEEK_SET) != 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not seek to " << m_startSkip << " bytes from the file beginning\n"; + fclose(m_file); + return false; + } + return true; +} + +bool CDriverGenericRawFileReader::close() +{ + if (m_file) + { + fclose(m_file); + m_file = nullptr; + } + return true; +} + +bool CDriverGenericRawFileReader::read() +{ + if (!m_file) { return false; } + const bool res = (fread(m_dataFrame, 1, m_dataFrameSize, m_file) == m_dataFrameSize); + if (!res && feof(m_file)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "End of file reached.\n"; } + return res; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawFileReader.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawFileReader.h new file mode 100644 index 0000000..a831a3d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawFileReader.h @@ -0,0 +1,36 @@ +#pragma once + +#include "ovasCDriverGenericRawReader.h" + +#include "../ovasCSettingsHelper.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverGenericRawFileReader + * \author Yann Renard (INRIA) + */ +class CDriverGenericRawFileReader final : public CDriverGenericRawReader +{ +public: + + explicit CDriverGenericRawFileReader(IDriverContext& ctx); + + const char* getName() override { return "Generic Raw File Reader"; } + bool isConfigurable() override { return true; } + bool configure() override; + +protected: + + bool open() override; + bool close() override; + bool read() override; + + SettingsHelper m_settings; + FILE* m_file = nullptr; + CString m_filename; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawReader.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawReader.cpp new file mode 100644 index 0000000..4702e37 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawReader.cpp @@ -0,0 +1,208 @@ +/* + * The raw reader expects the data to be formatted as follows + * + * [START][BLOCK0][BLOCK1][BLOCK2]... + * skip parse parse parse ... + * + * where each block is [===========BLOCKX=================] + * is read as [===========dataFrameSize==========] + * breaks to [header====][sample====][footer====] + * equals [headerSize][sampleSize][footerSize] + * means skip keep skip + * + * For correct parsing, user must provide the exact sizes of the skipped parts "start", "header" and "footer" in bytes. + * + */ + +#include "ovasCDriverGenericRawReader.h" +#include "../ovasCConfigurationBuilder.h" + +#include + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +// #define OPENVIBE_DEBUG_RAW_READER + +template +static float decode_little_endian(const uint8_t* buffer) +{ + T t; + System::Memory::littleEndianToHost(buffer, &t); + return float(t); +} + +template +static float decode_big_endian(const uint8_t* buffer) +{ + T t; + System::Memory::bigEndianToHost(buffer, &t); + return float(t); +} + +CDriverGenericRawReader::CDriverGenericRawReader(IDriverContext& ctx) + : IDriver(ctx) +{ + m_header.setSamplingFrequency(512); + m_header.setChannelCount(16); +} + +//___________________________________________________________________// +// // + +bool CDriverGenericRawReader::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) { return false; } + + switch (m_sampleFormat) + { + case Format_UnsignedInteger8: + case Format_SignedInteger8: m_sampleSize = 1; + break; + case Format_UnsignedInteger16: + case Format_SignedInteger16: m_sampleSize = 2; + break; + case Format_UnsignedInteger32: + case Format_SignedInteger32: + case Format_Float32: m_sampleSize = 4; + break; + case Format_Float64: m_sampleSize = 8; + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unsupported data format " << m_sampleFormat << "\n"; + return false; + } + + m_dataFrameSize = m_sampleSize * m_header.getChannelCount(); + m_dataFrameSize += m_headerSkip; + m_dataFrameSize += m_footerSkip; + + m_sample = new float[m_header.getChannelCount()]; + m_dataFrame = new uint8_t[m_dataFrameSize]; + if (!m_sample || !m_dataFrame) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not allocate memory !\n"; + return false; + } + + // open() should skip m_startSkip worth of bytes already + if (!this->open()) { return false; } + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; +} + +bool CDriverGenericRawReader::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + m_nTotalSample = 0; + m_startTime = System::Time::zgetTime(); + return true; +} + +bool CDriverGenericRawReader::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + // if(!m_driverCtx.isStarted()) { return true; } + + const uint64_t time = CTime(m_header.getSamplingFrequency(), m_nTotalSample).time(); + if (m_limitSpeed && (time > System::Time::zgetTime() - m_startTime)) { return true; } + +#ifdef OPENVIBE_DEBUG_RAW_READER + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Decoded : "; +#endif + + for (uint32_t j = 0; j < m_nSamplePerSentBlock; ++j) + { + if (!this->read()) { return false; } + + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + uint8_t* dataFrame = m_dataFrame + m_headerSkip + i * m_sampleSize; + switch (m_sampleEndian) + { + case Endian_Little: switch (m_sampleFormat) + { + case Format_UnsignedInteger8: m_sample[i] = *dataFrame; + break; + case Format_UnsignedInteger16: m_sample[i] = decode_little_endian(dataFrame); + break; + case Format_UnsignedInteger32: m_sample[i] = decode_little_endian(dataFrame); + break; + case Format_SignedInteger8: m_sample[i] = *dataFrame; + break; + case Format_SignedInteger16: m_sample[i] = decode_little_endian(dataFrame); + break; + case Format_SignedInteger32: m_sample[i] = decode_little_endian(dataFrame); + break; + case Format_Float32: m_sample[i] = decode_little_endian(dataFrame); + break; + case Format_Float64: m_sample[i] = decode_little_endian(dataFrame); + break; + default: break; + } + break; + + case Endian_Big: switch (m_sampleFormat) + { + case Format_UnsignedInteger8: m_sample[i] = *dataFrame; + break; + case Format_UnsignedInteger16: m_sample[i] = decode_big_endian(dataFrame); + break; + case Format_UnsignedInteger32: m_sample[i] = decode_big_endian(dataFrame); + break; + case Format_SignedInteger8: m_sample[i] = *dataFrame; + break; + case Format_SignedInteger16: m_sample[i] = decode_big_endian(dataFrame); + break; + case Format_SignedInteger32: m_sample[i] = decode_big_endian(dataFrame); + break; + case Format_Float32: m_sample[i] = decode_big_endian(dataFrame); + break; + case Format_Float64: m_sample[i] = decode_big_endian(dataFrame); + break; + default: break; + } + break; + default: break; + } +#ifdef OPENVIBE_DEBUG_RAW_READER + m_driverCtx.getLogManager() << m_sample[i] << " "; +#endif + } + if (m_driverCtx.isStarted()) { m_callback->setSamples(m_sample, 1); } + } +#ifdef OPENVIBE_DEBUG_RAW_READER + m_driverCtx.getLogManager() << "\n"; +#endif + + if (m_driverCtx.isStarted()) { m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); } + m_nTotalSample += m_nSamplePerSentBlock; + return true; +} + +bool CDriverGenericRawReader::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + return true; +} + +bool CDriverGenericRawReader::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted() || !this->close()) { return false; } + + delete [] m_sample; + delete [] m_dataFrame; + m_sample = nullptr; + m_dataFrame = nullptr; + m_callback = nullptr; + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawReader.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawReader.h new file mode 100644 index 0000000..d8aa8b6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawReader.h @@ -0,0 +1,66 @@ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverGenericRawReader + * \author Yann Renard (INRIA) + */ +class CDriverGenericRawReader : public IDriver +{ +public: + + enum EParameter + { + Endian_Little = 0, + Endian_Big = 1, + + Format_UnsignedInteger8 = 0, + Format_UnsignedInteger16 = 1, + Format_UnsignedInteger32 = 2, + Format_SignedInteger8 = 3, + Format_SignedInteger16 = 4, + Format_SignedInteger32 = 5, + Format_Float32 = 6, + Format_Float64 = 7, + }; + + explicit CDriverGenericRawReader(IDriverContext& ctx); + virtual void release() { delete this; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + const IHeader* getHeader() override { return &m_header; } + +protected: + + virtual bool open() = 0; + virtual bool close() = 0; + virtual bool read() = 0; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + uint32_t m_nSamplePerSentBlock = 0; + uint32_t m_sampleSize = 0; + uint32_t m_sampleFormat = Format_SignedInteger32; + uint32_t m_sampleEndian = 0; + uint32_t m_startSkip = 0; + uint32_t m_headerSkip = 0; + uint32_t m_footerSkip = 20; + uint32_t m_dataFrameSize = 0; + bool m_limitSpeed = false; + uint8_t* m_dataFrame = nullptr; + float* m_sample = nullptr; + uint64_t m_startTime = 0; + uint64_t m_nTotalSample = 0; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.cpp new file mode 100644 index 0000000..26fb74f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.cpp @@ -0,0 +1,88 @@ +#include "ovasCDriverGenericRawTelnetReader.h" +#include "ovasCConfigurationGenericRawReader.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverGenericRawTelnetReader::CDriverGenericRawTelnetReader(IDriverContext& ctx) + : CDriverGenericRawReader(ctx), m_settings("AcquisitionServer_Driver_GenericRawTelnetReader", m_driverCtx.getConfigurationManager()) +{ + m_hostName = "localhost"; + m_hostPort = 1337; + + // Relay configuration properties to the configuration manager + m_settings.add("Header", &m_header); + m_settings.add("LimitSpeed", &m_limitSpeed); + m_settings.add("SampleFormat", &m_sampleFormat); + m_settings.add("SampleEndian", &m_sampleEndian); + m_settings.add("StartSkip", &m_startSkip); + m_settings.add("HeaderSkip", &m_headerSkip); + m_settings.add("FooterSkip", &m_footerSkip); + m_settings.add("HostName", &m_hostName); + m_settings.add("HostPort", &m_hostPort); + m_settings.load(); +} + +bool CDriverGenericRawTelnetReader::configure() +{ + CString filename; + CConfigurationGenericRawReader config(Directories::getDataDir() + "/applications/acquisition-server/interface-Generic-RawTelnetReader.ui", + m_limitSpeed, m_sampleFormat, m_sampleEndian, m_startSkip, m_headerSkip, m_footerSkip, filename); + + config.setHostName(m_hostName); + config.setHostPort(m_hostPort); + + if (!config.configure(m_header)) { return false; } + + m_hostName = config.getHostName(); + m_hostPort = config.getHostPort(); + + m_settings.save(); + + return true; +} + +bool CDriverGenericRawTelnetReader::open() +{ + m_connection = Socket::createConnectionClient(); + if (!m_connection) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not create client connection\n"; + return false; + } + if (!m_connection->connect(m_hostName.toASCIIString(), m_hostPort)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not connect to server [" << m_hostName << ":" << m_hostPort << "]\n"; + return false; + } + char* buffer = new char[m_startSkip]; + if (m_startSkip > 0 && !m_connection->receiveBufferBlocking(buffer, m_startSkip)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unable to skip " << m_startSkip << " bytes at the beginning\n"; + delete[] buffer; + return false; + } + delete[] buffer; + + return true; +} + +bool CDriverGenericRawTelnetReader::close() +{ + if (m_connection) + { + m_connection->close(); + m_connection->release(); + m_connection = nullptr; + } + return true; +} + +bool CDriverGenericRawTelnetReader::read() +{ + if (!m_connection) { return false; } + return m_connection->receiveBufferBlocking(m_dataFrame, m_dataFrameSize); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.h new file mode 100644 index 0000000..5a3906e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.h @@ -0,0 +1,37 @@ +#pragma once + +#include "ovasCDriverGenericRawReader.h" + +#include "../ovasCSettingsHelper.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverGenericRawTelnetReader + * \author Yann Renard (INRIA) + */ +class CDriverGenericRawTelnetReader final : public CDriverGenericRawReader +{ +public: + + explicit CDriverGenericRawTelnetReader(IDriverContext& ctx); + + const char* getName() override { return "Generic Raw Telnet Reader"; } + bool isConfigurable() override { return true; } + bool configure() override; + +protected: + + bool open() override; + bool close() override; + bool read() override; + + SettingsHelper m_settings; + Socket::IConnectionClient* m_connection = nullptr; + CString m_hostName = "localhost"; + uint32_t m_hostPort = 1337; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-sawtooth/ovasCDriverGenericSawTooth.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-sawtooth/ovasCDriverGenericSawTooth.cpp new file mode 100644 index 0000000..5d7f518 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-sawtooth/ovasCDriverGenericSawTooth.cpp @@ -0,0 +1,124 @@ +#include "ovasCDriverGenericSawTooth.h" + +#include + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverGenericSawTooth::CDriverGenericSawTooth(IDriverContext& ctx) + : IDriver(ctx) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::CDriverGenericSawTooth\n"; + + m_header.setSamplingFrequency(512); + m_header.setChannelCount(1); + m_header.setChannelName(0, "Sawtooth"); + m_header.setChannelUnits(0, OVTK_UNIT_Volts, OVTK_FACTOR_Base); +} + +void CDriverGenericSawTooth::release() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::release\n"; + delete this; +} + +const char* CDriverGenericSawTooth::getName() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::getName\n"; + return "Generic Saw Tooth"; +} + +//___________________________________________________________________// +// // + +bool CDriverGenericSawTooth::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::initialize\n"; + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + m_samples.resize(m_header.getChannelCount() * nSamplePerSentBlock); + m_callback = &callback; + m_externalBlockSize = nSamplePerSentBlock; + + return true; +} + +bool CDriverGenericSawTooth::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::start\n"; + + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + m_nTotalSample = 0; + m_startTime = System::Time::zgetTime(); + + return true; +} + +bool CDriverGenericSawTooth::loop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverGenericSawTooth::loop\n"; + + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return true; } + + // Find out how many samples to send + const uint64_t elapsed = System::Time::zgetTime() - m_startTime; + const uint64_t samplesNeededSoFar = CTime(elapsed).toSampleCount(m_header.getSamplingFrequency()); + if (samplesNeededSoFar <= m_nTotalSample) + { + // Too early + return true; + } + const size_t remainingSamples = size_t(samplesNeededSoFar - m_nTotalSample); + if (remainingSamples * m_header.getChannelCount() > m_samples.size()) { m_samples.resize(remainingSamples * m_header.getChannelCount()); } + + // Generate the data + // The result should be a linear ramp between [0,1] for each block sent *out* by the acquisition server + for (size_t i = 0; i < remainingSamples; ++i) + { + for (size_t j = 0; j < m_header.getChannelCount(); ++j) + { + m_samples[j * remainingSamples + i] = float(m_nTotalSample % m_externalBlockSize) / float(m_externalBlockSize - 1); + } + m_nTotalSample++; + } + + m_callback->setSamples(&m_samples[0], remainingSamples); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + return true; +} + +bool CDriverGenericSawTooth::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::stop\n"; + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + return true; +} + +bool CDriverGenericSawTooth::uninitialize() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::uninitialize\n"; + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + m_callback = nullptr; + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverGenericSawTooth::isConfigurable() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::isConfigurable\n"; + return false; +} + +bool CDriverGenericSawTooth::configure() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::configure\n"; + return false; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-sawtooth/ovasCDriverGenericSawTooth.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-sawtooth/ovasCDriverGenericSawTooth.h new file mode 100644 index 0000000..0608ced --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-sawtooth/ovasCDriverGenericSawTooth.h @@ -0,0 +1,43 @@ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverGenericSawTooth + * \author Yann Renard (INRIA) + */ +class CDriverGenericSawTooth final : public IDriver +{ +public: + + explicit CDriverGenericSawTooth(IDriverContext& ctx); + void release(); + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_externalBlockSize = 0; + std::vector m_samples; + + uint64_t m_nTotalSample = 0; + uint64_t m_startTime = 0; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.cpp new file mode 100755 index 0000000..234f8c4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.cpp @@ -0,0 +1,15 @@ +#include "ovasCConfigurationGenericTimeSignal.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +CConfigurationGenericTimeSignal::CConfigurationGenericTimeSignal(IDriverContext& ctx, const char* gtkBuilderFilename) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx) {} + +bool CConfigurationGenericTimeSignal::preConfigure() { return CConfigurationBuilder::preConfigure(); } + +// normal header is filled (Subject ID, Age, Gender, channels, sampling frequency) +bool CConfigurationGenericTimeSignal::postConfigure() { return CConfigurationBuilder::postConfigure(); } + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.h new file mode 100755 index 0000000..6956cb2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.h @@ -0,0 +1,24 @@ +#pragma once + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationGenericTimeSignal + * \sa CDriverGenericTimeSignal + */ +class CConfigurationGenericTimeSignal final : public CConfigurationBuilder +{ +public: + CConfigurationGenericTimeSignal(IDriverContext& ctx, const char* gtkBuilderFilename); + + bool preConfigure() override; + bool postConfigure() override; + +protected: + IDriverContext& m_driverCtx; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCDriverGenericTimeSignal.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCDriverGenericTimeSignal.cpp new file mode 100755 index 0000000..1328786 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCDriverGenericTimeSignal.cpp @@ -0,0 +1,113 @@ +#include "ovasCDriverGenericTimeSignal.h" +#include "../ovasCConfigurationBuilder.h" + +#include "ovasCConfigurationGenericTimeSignal.h" + +#include + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverGenericTimeSignal::CDriverGenericTimeSignal(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_GenericTimeSignal", m_driverCtx.getConfigurationManager()) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::CDriverGenericTimeSignal\n"; + + m_header.setSamplingFrequency(512); + m_header.setChannelCount(1); + m_header.setChannelName(0, "Time(s)"); + m_header.setChannelUnits(0, OVTK_UNIT_Second, OVTK_FACTOR_Base); + + m_settings.add("Header", &m_header); + m_settings.load(); +} + +void CDriverGenericTimeSignal::release() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::release\n"; + delete this; +} + +const char* CDriverGenericTimeSignal::getName() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::getName\n"; + return "Generic Time Signal"; +} + +//___________________________________________________________________// +// // + +bool CDriverGenericTimeSignal::initialize(const uint32_t /*nSamplePerSentBlock*/, IDriverCallback& callback) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::initialize\n"; + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + m_callback = &callback; + return true; +} + +bool CDriverGenericTimeSignal::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::start\n"; + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + m_nTotalSample = 0; + m_startTime = System::Time::zgetTime(); + return true; +} + +bool CDriverGenericTimeSignal::loop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverGenericTimeSignal::loop\n"; + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return true; } + + // Find out how many samples to send; note that we always just send 1 at a time with this driver + const uint64_t now = System::Time::zgetTime(); + const uint64_t elapsed = now - m_startTime; + const uint64_t neededSoFar = (m_header.getSamplingFrequency() * elapsed) >> 32; + if (neededSoFar <= m_nTotalSample) { return true; } // Too early + + const float timeNow = float(CTime(now).toSeconds()); + m_callback->setSamples(&timeNow, 1); + m_nTotalSample++; + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + return true; +} + +bool CDriverGenericTimeSignal::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::stop\n"; + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + return true; +} + +bool CDriverGenericTimeSignal::uninitialize() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::uninitialize\n"; + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + m_callback = nullptr; + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverGenericTimeSignal::isConfigurable() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::isConfigurable\n"; + return true; +} + +bool CDriverGenericTimeSignal::configure() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::configure\n"; + CConfigurationGenericTimeSignal config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-Generic-TimeSignal.ui"); + if (!config.configure(m_header)) { return false; } + m_settings.save(); + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCDriverGenericTimeSignal.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCDriverGenericTimeSignal.h new file mode 100755 index 0000000..b49e381 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCDriverGenericTimeSignal.h @@ -0,0 +1,48 @@ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverGenericTimeSignal + * \author Jussi Lindgren (Inria) + * + * This driver may have some utility in debugging. For each sample, it returns the + * current time as obtained from openvibe's System::Time:zgettime() converted to float seconds. + * + */ +class CDriverGenericTimeSignal final : public IDriver +{ +public: + + explicit CDriverGenericTimeSignal(IDriverContext& ctx); + void release(); + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + SettingsHelper m_settings; + + uint64_t m_nTotalSample = 0; + uint64_t m_startTime = 0; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/labstreaminglayer/examples/SendToLSL.m b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/labstreaminglayer/examples/SendToLSL.m new file mode 100755 index 0000000..bd30d14 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/labstreaminglayer/examples/SendToLSL.m @@ -0,0 +1,54 @@ +% +% A matlab example of sending data to OpenViBE via LabStreamingLayer. You need to have the LSL matlab stuff recursively on Matlab's Path. +% +% At the time of writing this, OpenViBE only supports numeric markers. +% +nChannels = 8; +samplingFreq = 100; + +disp('Loading LSL library...'); +lib = lsl_loadlib(); + +% make a new stream outlet +disp('Creating a new signal stream ...'); +info = lsl_streaminfo(lib,'ACMEAmp','EEG',nChannels,samplingFreq,'cf_float32','abcdefgh'); + +disp('Opening a signal outlet...'); +outlet = lsl_outlet(info); + +disp('Creating a new marker stream ...'); +markerInfo = lsl_streaminfo(lib,'ACMEMarkers','Markers',1,0,'cf_int32','myuniquesourceid23443'); + +disp('Opening a marker outlet...'); +markerOutlet = lsl_outlet(markerInfo); + +disp('Sending data...'); +t=0; +value = -1; +while true + + % If current time is even, sample is positive. When sample value changes to positive, send a marker. + sendMarker = 0; + if(mod(floor(t),2)==0) + if(value~=1) + sendMarker=1; + end + value = 1; + else + value = -1; + end + + % Push a sample + outlet.push_sample(value*(1:nChannels),t); + + % Push a marker? + if(sendMarker>0) + disp('push marker') + markerOutlet.push_sample(777,t); + end + + % step time, wait + t=t+(1/samplingFreq); + pause(1/samplingFreq); +end + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.cpp new file mode 100755 index 0000000..89f70a0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.cpp @@ -0,0 +1,178 @@ +#if defined(TARGET_HAS_ThirdPartyLSL) + +#include "ovasCConfigurationLabStreamingLayer.h" + +#include +#include "ovasIHeader.h" + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +CConfigurationLabStreamingLayer::CConfigurationLabStreamingLayer(IDriverContext& ctx, const char* gtkBuilderFilename, IHeader& header, bool& limitSpeed, + CString& signalStream, CString& signalStreamID, CString& markerStream, CString& markerStreamID, + uint32_t& fallbackSampling) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx), m_header(header), m_limitSpeed(limitSpeed), m_signalStream(signalStream), + m_signalStreamID(signalStreamID), m_markerStream(markerStream), m_markerStreamID(markerStreamID), m_fallbackSampling(fallbackSampling) {} + +bool CConfigurationLabStreamingLayer::preConfigure() +{ + if (! CConfigurationBuilder::preConfigure()) { return false; } + + GtkToggleButton* buttonSpeedLimit = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_limit_speed")); + gtk_toggle_button_set_active(buttonSpeedLimit, m_limitSpeed ? TRUE : FALSE); + + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_signal_stream")); + if (!comboBox) { return false; } + + GtkComboBox* markerComboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_marker_stream")); + if (!markerComboBox) { return false; } + + GtkEntry* fallbackSamplingEntry = GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_fallback_sampling_frequency")); + if (!fallbackSamplingEntry) { return false; } + + m_signalIdxs.clear(); + m_markerIdxs.clear(); + + // Allow operation without a marker stream + gtk_combo_box_append_text(markerComboBox, "None"); + gtk_combo_box_set_active(markerComboBox, 0); + m_markerIdxs.push_back(-1); + + m_streams = lsl::resolve_streams(1.0); + + // See if any of the streams can be interpreted as signal or marker + uint32_t nStreams = 0; + uint32_t nMarkerStreams = 0; + bool exactSignalMatch = false; // If we can match both name and ID, stop at that. Otherwise we auto-accept the 'name only' match. + bool exactMarkerMatch = false; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Discovered " << m_streams.size() << " streams in total\n"; + + for (size_t i = 0; i < m_streams.size(); ++i) + { + if (m_streams[i].channel_format() == lsl::cf_float32) + { + std::stringstream ss; + ss << m_streams[i].name() << " / " << m_streams[i].source_id(); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << i << ". Discovered signal stream " << m_streams[i].name() << ", id " << ss.str() << "\n"; + + gtk_combo_box_append_text(comboBox, ss.str().c_str()); + m_signalIdxs.push_back(static_cast(i)); + if ((m_signalStream == CString(m_streams[i].name().c_str()) && !exactSignalMatch) || !nStreams) + { + if (m_signalStreamID == CString(m_streams[i].source_id().c_str())) { exactSignalMatch = true; } + gtk_combo_box_set_active(comboBox, nStreams); + } + nStreams++; + } + else if (m_streams[i].channel_format() == lsl::cf_int32) + { + std::stringstream ss; + ss << m_streams[i].name().c_str() << " / " << m_streams[i].source_id().c_str(); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << i << ". Discovered marker stream " << m_streams[i].name() << ", id " << ss.str() << "\n"; + + gtk_combo_box_append_text(markerComboBox, ss.str().c_str()); + m_markerIdxs.push_back(i); + if ((m_markerStream == CString(m_streams[i].name().c_str()) && !exactMarkerMatch) || !nMarkerStreams) + { + if (m_markerStreamID == CString(m_streams[i].source_id().c_str())) + { + // If we can match both name and ID, stop at that. Otherwise we accept the 'name only' match. + exactMarkerMatch = true; + } + gtk_combo_box_set_active(markerComboBox, nMarkerStreams + 1); + } + nMarkerStreams++; + } + else + { + // Only float and int are currently supported for signals and markers respectively + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << i << ". Discovered stream with channel format " << m_streams[i].channel_format() + << " of stream [" << m_streams[i].name() << "] which is not supported, skipped.\n"; + } + } + + if (m_fallbackSampling == 0) { gtk_entry_set_text(fallbackSamplingEntry, ""); } + else + { + const std::string buffer = std::to_string(m_fallbackSampling); + gtk_entry_set_text(fallbackSamplingEntry, buffer.c_str()); + } + + return true; +} + +bool CConfigurationLabStreamingLayer::postConfigure() +{ + if (m_applyConfig) + { + GtkToggleButton* buttonSpeedLimit = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_limit_speed")); + m_limitSpeed = gtk_toggle_button_get_active(buttonSpeedLimit) ? true : false; + + // Retrieve signal stream info + GtkComboBox* comboBoxSignal = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_signal_stream")); + if (!comboBoxSignal) + { + m_applyConfig = false; + CConfigurationBuilder::postConfigure(); // close window etc + return false; + } + + if (m_signalIdxs.empty()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "LSL: Cannot proceed without a signal stream.\n"; + m_applyConfig = false; + CConfigurationBuilder::postConfigure(); // close window etc + return false; + } + + const int signalIdx = m_signalIdxs[gtk_combo_box_get_active(comboBoxSignal)]; + + m_signalStream = m_streams[signalIdx].name().c_str(); + m_signalStreamID = m_streams[signalIdx].source_id().c_str(); + + GtkComboBox* comboBoxMarker = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_marker_stream")); + if (!comboBoxMarker) + { + m_applyConfig = false; + CConfigurationBuilder::postConfigure(); // close window etc + return false; + } + + // Retrieve marker stream info + const int markerIdx = m_markerIdxs[gtk_combo_box_get_active(comboBoxMarker)]; + if (markerIdx >= 0) + { + m_markerStream = m_streams[markerIdx].name().c_str(); + m_markerStreamID = m_streams[markerIdx].source_id().c_str(); + } + else + { + m_markerStream = "None"; + m_markerStreamID = ""; + } + + // Retrieve fallback sampling rate + GtkEntry* entry = GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_fallback_sampling_frequency")); + uint32_t sampling = 0; + if (sscanf(gtk_entry_get_text(entry), "%u", &sampling) == 1) { m_fallbackSampling = uint32_t(sampling); } + else { m_fallbackSampling = 0; } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Binding to [" << m_signalStream << ", id " << m_signalStreamID << "] and [" << m_markerStream + << ", id " << m_markerStreamID << "]\n"; + } + + if (! CConfigurationBuilder::postConfigure() + ) { return false; } // normal header is filled (Subject ID, Age, Gender, channels, sampling frequency), ressources are realesed + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyLSL diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.h new file mode 100755 index 0000000..9e2a580 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.h @@ -0,0 +1,52 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyLSL) + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" +#include "ovasIHeader.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationLabStreamingLayer + * \author Jussi T. Lindgren / Inria + * \date Wed Oct 15 09:41:18 2014 + * \brief The CConfigurationLabStreamingLayer handles the configuration dialog specific to the LabStreamingLayer (LSL) device. + * + * \sa CDriverLabStreamingLayer + */ +class CConfigurationLabStreamingLayer final : public CConfigurationBuilder +{ +public: + + CConfigurationLabStreamingLayer(IDriverContext& ctx, const char* gtkBuilderFilename, IHeader& header, bool& limitSpeed, + CString& signalStream, CString& signalStreamID, CString& markerStream, + CString& markerStreamID, uint32_t& fallbackSampling); + + bool preConfigure() override; + bool postConfigure() override; + +protected: + IDriverContext& m_driverCtx; + +private: + IHeader& m_header; + + bool& m_limitSpeed; + CString& m_signalStream; + CString& m_signalStreamID; + CString& m_markerStream; + CString& m_markerStreamID; + uint32_t& m_fallbackSampling; + + std::vector m_streams; + std::vector m_signalIdxs; + std::vector m_markerIdxs; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyLSL diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCDriverLabStreamingLayer.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCDriverLabStreamingLayer.cpp new file mode 100755 index 0000000..53e7707 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCDriverLabStreamingLayer.cpp @@ -0,0 +1,552 @@ +#if defined(TARGET_HAS_ThirdPartyLSL) + +/* + * + * Notes: This code should be kept compatible with changes to LSL Output plugin in OpenViBE Acquisition Server, + * and LSL Export box in Designer. + * + * This driver makes a few assumptions: + * + * Signal streams + * - are float + * - dense, i.e. there are no dropped or extra samples in them + * - the driver fills a sample block consequently until either the block has been filled or + * time runs out. In case of the latter, the chunk is padded with NaNs. + * Markers + * - are int + * - not dense + * - markers are retimed wrt the current signal chunk + * + * Other notes: Due to network delays, it may be better to disable drift correction or + * set the drift tolerance to high. This is because + * 1) Signals are assumed dense, i.e. LSL pull results in samples stamped t,t+1,t+2,... + * 2) However, Acquisition Server works in real time, so if there is a network delay between + * the samples stamped t and t+1, this delay does not indicate a delay in the original signal + * and it might not be correct to pad the corresponding signal block during the delay. + * + * Todo. It might make sense to improve this driver in the future to take into account the LSL + * stamps when constructing each signal block. This is currently not done. + * + + * + * + * + */ + +#include // for NaN + +#include "ovasCDriverLabStreamingLayer.h" +#include "ovasCConfigurationLabStreamingLayer.h" + +#include + +#include + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +// In seconds +static const double LSL_SAMPLING_ESTIMATATION_DURATION = 2.0; +static const double LSL_RESOLVE_TIME_OUT = 2.0; +static const double LSL_OPEN_TIME_OUT = 2.0; +static const double LSL_READ_TIME_OUT = 2.0; + +static uint32_t getClosestMultipleOf25(const uint32_t value) { return uint32_t(((value + 12) / 25) * 25); } + +static uint32_t getClosestPowerOf2(const uint32_t value) +{ + uint32_t bitShiftCount = 0; + while ((1LL << bitShiftCount) < value) { bitShiftCount++; } + + if (bitShiftCount > 0) + { + const uint32_t greater = uint32_t(1LL << bitShiftCount); + const uint32_t lesser = greater >> 1; + if (greater - value < value - lesser) { return greater; } + return lesser; + } + + return uint32_t(1LL << bitShiftCount); +} + +static uint32_t getSmartFallbackSamplingRateEstimate(const uint32_t lslSampling, const bool roundToPowerOfTwoAndMultiple25 = true) +{ + if (roundToPowerOfTwoAndMultiple25) + { + const uint32_t closestMultipleOf25 = getClosestMultipleOf25(lslSampling); + const uint32_t closestPowerOfTwo = getClosestPowerOf2(lslSampling); + const uint32_t closestMultipleOf25Diff = uint32_t(std::abs(int(closestMultipleOf25) - int(lslSampling))); + const uint32_t closestPowerOfTwoDiff = uint32_t(std::abs(int(closestPowerOfTwo) - int(lslSampling))); + if (closestMultipleOf25Diff < closestPowerOfTwoDiff) { return closestMultipleOf25; } + return closestPowerOfTwo; + } + return lslSampling; +} + +//___________________________________________________________________// +// // + +CDriverLabStreamingLayer::CDriverLabStreamingLayer(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_LabStreamingLayer", m_driverCtx.getConfigurationManager()) +{ + // The following class allows saving and loading driver settings from the acquisition server .conf file + m_settings.add("Header", &m_header); + // To save your custom driver settings, register each variable to the SettingsHelper + m_settings.add("LimitSpeed", &m_limitSpeed); + m_settings.add("SignalStreamName", &m_sSignalStream); + m_settings.add("SignalStreamID", &m_sSignalStreamID); + m_settings.add("MarkerStreamName", &m_sMarkerStream); + m_settings.add("MarkerStreamID", &m_sMarkerStreamID); + m_settings.add("FallbackSamplingRate", &m_fallbackSampling); + m_settings.load(); + + /* + for (uint32_t i = 1; i < 260; ++i) + { + ctx.getLogManager() << Kernel::LogLevel_Error << i << " --> " << getSmartFallbackSamplingRateEstimate(i) << "\n"; + } + */ +} + +CDriverLabStreamingLayer::~CDriverLabStreamingLayer() {} + +const char* CDriverLabStreamingLayer::getName() { return "LabStreamingLayer (LSL)"; } + +//___________________________________________________________________// +// // + +bool CDriverLabStreamingLayer::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) { return false; } + + // Find the signal stream + const std::vector streams = lsl::resolve_stream("name", m_sSignalStream.toASCIIString(), 1, LSL_RESOLVE_TIME_OUT); + if (streams.empty()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error resolving signal stream with name [" << m_sSignalStream.toASCIIString() << "]\n"; + return false; + } + for (uint32_t i = 0; i < streams.size(); ++i) + { + m_oSignalStream = streams[i]; + if (streams[i].source_id() == std::string(m_sSignalStreamID.toASCIIString())) + { + // This is the best one + break; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Finally resolved signal stream to " << m_oSignalStream.name() << ", id " << + m_oSignalStream.source_id().c_str() << "\n"; + } + + // Find the marker stream + if (m_sMarkerStream != CString("None")) + { + const std::vector markerStreams = lsl::resolve_stream("name", m_sMarkerStream.toASCIIString(), 1, LSL_RESOLVE_TIME_OUT); + if (markerStreams.empty()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error resolving marker stream with name [" << m_sMarkerStream.toASCIIString() << "]\n"; + return false; + } + for (uint32_t i = 0; i < markerStreams.size(); ++i) + { + m_oMarkerStream = markerStreams[i]; + if (markerStreams[i].source_id() == std::string(m_sMarkerStreamID.toASCIIString())) + { + // This is the best one + break; + } + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Finally resolved marker stream to " << m_oMarkerStream.name() << ", id " << + m_oMarkerStream.source_id().c_str() << "\n"; + } + else + { + // We do not have a marker stream. This is ok. + } + + // Get the channel names. We open a temporary inlet for this, it will be closed after going out of scope. The actual inlet will be opened in start(). + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Polling channel names\n"; + lsl::stream_inlet tmpInlet(m_oSignalStream, 360, 0, false); + try { tmpInlet.open_stream(LSL_OPEN_TIME_OUT); } + catch (...) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to open signal stream with name [" << m_oSignalStream.name() << + "] for polling channel names\n"; + return false; + } + + lsl::stream_info fullInfo; + try { fullInfo = tmpInlet.info(LSL_READ_TIME_OUT); } + catch (...) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Timeout reading full stream info for [" << m_oSignalStream.name() << + "] for polling channel names\n"; + return false; + } + + // Now sets channel count and names + m_header.setChannelCount(m_oSignalStream.channel_count()); + + const lsl::xml_element channels = fullInfo.desc().child("channels"); + lsl::xml_element channel = channels.child("channel"); + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + const char* label = channel.child_value("label"); + + if (label) { m_header.setChannelName(i, label); } + + channel = channel.next_sibling("channel"); + } + + // Buffer to store a single sample + m_buffer = new float[m_header.getChannelCount()]; + if (!m_buffer) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Memory allocation problem\n"; + return false; + } + + // Buffer to store the signal chunk + m_sample = new float[m_header.getChannelCount() * nSamplePerSentBlock]; + if (!m_sample) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Memory allocation problem\n"; + return false; + } + + // Now sets sampling rate + + uint32_t sampling = uint32_t(m_oSignalStream.nominal_srate()); + if (sampling == 0) + { + // Check GUI fallback + if (m_fallbackSampling != 0) + { + sampling = m_fallbackSampling; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "LSL sampling rate is not defined, falls back to [" << sampling << + "] - You can change this in the driver settings\n"; + } + else + { + // Autodetection was requested, let`s go for a round + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "LSL sampling rate is not defined, falls back to [" << CString("Autodetection") << + "] - You can change this in the driver settings\n"; + + try + { + tmpInlet.open_stream(LSL_OPEN_TIME_OUT); + + // First drop all available samples + while (tmpInlet.samples_available() != 0) { tmpInlet.pull_sample(m_buffer, m_header.getChannelCount(), LSL_READ_TIME_OUT); } + + // Now capture incoming samples over a period of 2 secs + uint32_t nSample = 0; + const double startCaptureTime = tmpInlet.pull_sample(m_buffer, m_header.getChannelCount(), LSL_READ_TIME_OUT); + double currentCaptureTime = startCaptureTime; + while (currentCaptureTime != 0.0 && currentCaptureTime - startCaptureTime < LSL_SAMPLING_ESTIMATATION_DURATION) + { + const double pulledSampleTime = tmpInlet.pull_sample(m_buffer, m_header.getChannelCount(), LSL_READ_TIME_OUT); + if (pulledSampleTime != 0) + { + nSample++; + currentCaptureTime = pulledSampleTime; + } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << + "Timed out while receiving samples from LSL stream, avoiding auto detection.\n"; + delete[] m_buffer; + delete[] m_sample; + return false; + } + } + + // Finally set estimated sampling rate + const double duration = currentCaptureTime - startCaptureTime; + const uint32_t lslSampling = uint32_t(nSample / duration); + const uint32_t smartLSLSampling = getSmartFallbackSamplingRateEstimate(lslSampling); + + if (smartLSLSampling != lslSampling) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Acquired " << nSample << " on a duration of " << duration << + " seconds, sampling rate might be approx " << lslSampling << " hz (adjusted to " << smartLSLSampling << + " hz to conform with typical EEG sampling rates).\n"; + } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Acquired " << nSample << " on a duration of " << duration << + " seconds, sampling rate might be approx " << smartLSLSampling << " hz.\n"; + } + + sampling = smartLSLSampling; + } + catch (...) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to detected actual LSL sampling rate\n"; + delete [] m_buffer; + delete [] m_sample; + return false; + } + } + } + + m_header.setSamplingFrequency(sampling); + + if (sampling != m_oSignalStream.nominal_srate()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info + << "Opened an LSL stream with " << m_oSignalStream.channel_count() + << " channels and a nominal rate of " << m_oSignalStream.nominal_srate() << " hz.\n"; + } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info + << "Opened an LSL stream with " << m_oSignalStream.channel_count() + << " channels and a nominal rate of " << m_oSignalStream.nominal_srate() << " hz" + << " adjusted to " << sampling << " hz.\n"; + } + + // Stores parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + return true; +} + +bool CDriverLabStreamingLayer::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + m_pSignalInlet = new lsl::stream_inlet(m_oSignalStream, 360, 0, false); + if (!m_pSignalInlet) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error getting signal inlet for [" << m_oSignalStream.name() << "]\n"; + return false; + } + + try { m_pSignalInlet->open_stream(LSL_OPEN_TIME_OUT); } + catch (...) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to open signal stream with name [" << m_oSignalStream.name() << "]\n"; + return false; + } + + if (m_sMarkerStream != CString("None")) + { + m_pMarkerInlet = new lsl::stream_inlet(m_oMarkerStream, 360, 0, false); + if (!m_pMarkerInlet) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error getting marker inlet for [" << m_oMarkerStream.name() << "]\n"; + return false; + } + + try { m_pMarkerInlet->open_stream(LSL_OPEN_TIME_OUT); } + catch (...) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to open marker stream with name [" << m_oSignalStream.name() << "]\n"; + return false; + } + } + + m_startTime = System::Time::zgetTime(); + m_nSample = 0; + + return true; +} + +bool CDriverLabStreamingLayer::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted()) { return true; } + + const size_t nChannels = m_header.getChannelCount(); + + bool timeOut = false; + uint32_t timeOutAt = 0; + bool blockStartTimeSet = false; + double blockStartTime = 0; + + // receive signal from the stream + for (uint32_t i = 0; i < m_nSamplePerSentBlock; ++i) + { + double captureTime; + try { captureTime = m_pSignalInlet->pull_sample(m_buffer, nChannels, LSL_READ_TIME_OUT); } + catch (...) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to get signal sample from [" << m_oSignalStream.name() << "]\n"; + return false; + } + if (captureTime != 0) + { + if (!blockStartTimeSet) + { + blockStartTimeSet = true; + blockStartTime = captureTime; + //m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "First cap time is " << captureTime << "\n"; + } + + // Sample ok, fill + for (uint32_t j = 0; j < nChannels; ++j) { m_sample[j * m_nSamplePerSentBlock + i] = m_buffer[j]; } + } + else + { + // Timeout + timeOutAt = i; + timeOut = true; + break; + } + } + + if (timeOut) + { + // We fill the rest of the buffer with NaNs + for (uint32_t i = timeOutAt; i < m_nSamplePerSentBlock; ++i) + { + for (uint32_t j = 0; j < nChannels; ++j) { m_sample[j * m_nSamplePerSentBlock + i] = std::numeric_limits::quiet_NaN(); } + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Timeout reading sample from " << timeOutAt << ", filled rest of block with NaN\n"; + } + + if (m_limitSpeed) + { + // If we were faster than what the AS expects, sleep. + // n.b. This sleep may not be accurate on Windows (it may oversleep) + const uint64_t timeNow = System::Time::zgetTime() - m_startTime; + const uint64_t timeLimitForBuffer = CTime(m_header.getSamplingFrequency(), m_nSample + m_nSamplePerSentBlock).time(); + + if (timeNow < timeLimitForBuffer) + { + const uint64_t timeToSleep = timeLimitForBuffer - timeNow; + + // std::cout << "PostNap " << CTime(timeToSleep).toSeconds()*1000 << "ms at " << m_nSample+m_nSamplePerSentBlock << "\n"; + + System::Time::zsleep(timeToSleep); + } + } + + m_nSample += m_nSamplePerSentBlock; + + m_callback->setSamples(m_sample); + + // receive and pass markers. Markers are timed wrt the beginning of the signal block. + CStimulationSet stimulationSet; + if (m_pMarkerInlet) + { + while (true) + { + int marker; + double captureTime; + try + { + captureTime = m_pMarkerInlet->pull_sample(&marker, 1, 0); // timeout is 0 here on purpose, either we have markers or not + } + catch (...) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to get marker from [" << m_oMarkerStream.name() << "]\n"; + return false; + } + if (captureTime == 0) + { + // no more markers available at the moment + break; + } + // double correction = m_pMarkerInlet->time_correction(); + // double stimTime = captureTime + correction - firstCaptureTime; + + // For openvibe, we need to set the stimulus time relative to the start of the chunk + static bool warningPrinted = false; + if (captureTime < blockStartTime && !warningPrinted) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Received marker from LSL date from before the start of the current chunk." + " Adjusting stamp to start of current chunk. Will not warn again.\n"; + warningPrinted = true; + } + const double stimTime = (captureTime > blockStartTime ? captureTime - blockStartTime : 0); + + // m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Got a marker " << marker << " at " << captureTime << " -> " + // << stimTime << "s." + // << "\n"; + + stimulationSet.appendStimulation(uint64_t(marker), CTime(stimTime).time(), 0); + // std::cout << "date " << stimTime << "\n"; + } + } + + m_callback->setStimulationSet(stimulationSet); + + // LSL is not forcing the sample stream to confirm to the nominal sample rate. Hence, data may be incoming + // with slower or faster speed than implied by the rate (a little like reading from a file). In some + // cases it may be meaningful to disable the following drift correction from the AS settings. + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + + return true; +} + +bool CDriverLabStreamingLayer::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + if (m_pSignalInlet) + { + m_pSignalInlet->close_stream(); + + delete m_pSignalInlet; + m_pSignalInlet = nullptr; + } + + if (m_pMarkerInlet) + { + m_pMarkerInlet->close_stream(); + + delete m_pMarkerInlet; + m_pMarkerInlet = nullptr; + } + + return true; +} + +bool CDriverLabStreamingLayer::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_buffer) + { + delete[] m_buffer; + m_buffer = nullptr; + } + + if (m_sample) + { + delete[] m_sample; + m_sample = nullptr; + } + + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverLabStreamingLayer::isConfigurable() +{ + return true; // change to false if your device is not configurable +} + +bool CDriverLabStreamingLayer::configure() +{ + // Change this line if you need to specify some references to your driver attribute that need configuration, e.g. the connection ID. + CConfigurationLabStreamingLayer config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-LabStreamingLayer.ui", + m_header, m_limitSpeed, m_sSignalStream, m_sSignalStreamID, m_sMarkerStream, m_sMarkerStreamID, m_fallbackSampling); + + if (!config.configure(m_header)) { return false; } + m_settings.save(); + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyLSL diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCDriverLabStreamingLayer.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCDriverLabStreamingLayer.h new file mode 100755 index 0000000..0c169d3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCDriverLabStreamingLayer.h @@ -0,0 +1,78 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyLSL) + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include + +#include + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverLabStreamingLayer + * \author Jussi T. Lindgren / Inria + * \date Wed Oct 15 09:41:18 2014 + * \brief The CDriverLabStreamingLayer allows the acquisition server to acquire data from a LabStreamingLayer (LSL) device. + * + * \sa CConfigurationLabStreamingLayer + */ +class CDriverLabStreamingLayer final : public IDriver +{ +public: + + explicit CDriverLabStreamingLayer(IDriverContext& ctx); + ~CDriverLabStreamingLayer() override; + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + + CHeader m_header; + +private: + + uint32_t m_nSamplePerSentBlock = 0; + uint32_t m_fallbackSampling = 0; + float* m_sample = nullptr; + float* m_buffer = nullptr; + + uint64_t m_startTime = 0; + uint64_t m_nSample = 0; + + lsl::stream_info m_oSignalStream; + lsl::stream_inlet* m_pSignalInlet = nullptr; + + lsl::stream_info m_oMarkerStream; + lsl::stream_inlet* m_pMarkerInlet = nullptr; + + bool m_limitSpeed = false; + CString m_sSignalStream; + CString m_sSignalStreamID; + CString m_sMarkerStream; + CString m_sMarkerStreamID; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyLSL diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.cpp new file mode 100755 index 0000000..aa8694d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.cpp @@ -0,0 +1,70 @@ +#if defined(TARGET_HAS_ThirdPartyMCS) + +#include "ovasCConfigurationMCSNVXDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +/*_________________________________________________ + +Insert callback to specific widget here +Example with a button that launch a calibration of the device: + +//Callback connected to a dedicated gtk button: +static void button_calibrate_pressed_cb(GtkButton* button, void* data) +{ + CConfigurationMKSNVXDriver* config=static_cast(data); + config->buttonCalibratePressedCB(); +} + +//Callback actually called: +void CConfigurationGTecGUSBamp::buttonCalibratePressedCB() +{ + // Connect to the hardware, ask for calibration, verify the return code, etc. +} +_________________________________________________*/ + +// If you added more reference attribute, initialize them here +CConfigurationMKSNVXDriver::CConfigurationMKSNVXDriver(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& dataMode, bool& auxChannels) + : CConfigurationBuilder(gtkBuilderFilename), dataMode_(dataMode), showAuxChannels_(auxChannels), m_driverCtx(ctx) {} + +bool CConfigurationMKSNVXDriver::preConfigure() +{ + if (! CConfigurationBuilder::preConfigure()) { return false; } + + // Connect here all callbacks + // Example: + // g_signal_connect(gtk_builder_get_object(m_builder, "button_calibrate"), "pressed", G_CALLBACK(button_calibrate_pressed_cb), this); + + // Insert here the pre-configure code. + // For example, you may want to check if a device is currently connected + // and if more than one are connected. Then you can list in a dedicated combo-box + // the device currently connected so the user can choose which one he wants to acquire from. + GtkComboBox* comboDataMode = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_mode")); + gtk_combo_box_set_active(comboDataMode, dataMode_); + GtkToggleButton* toggleShowAuxChannels = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_show_aux_channels")); + gtk_toggle_button_set_active(toggleShowAuxChannels, showAuxChannels_); + return true; +} + +bool CConfigurationMKSNVXDriver::postConfigure() +{ + if (m_applyConfig) + { + // If the user pressed the "apply" button, you need to save the changes made in the configuration. + // For example, you can save the connection ID of the selected device: + // m_connectionID = + GtkComboBox* comboDataMode = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_mode")); + dataMode_ = uint32_t(gtk_combo_box_get_active(comboDataMode)); + GtkToggleButton* toggleShowAuxChannels = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_show_aux_channels")); + showAuxChannels_ = (gtk_toggle_button_get_active(toggleShowAuxChannels) > 0); + } + + // normal header is filled (Subject ID, Age, Gender, channels, sampling frequency), ressources are realesed + if (! CConfigurationBuilder::postConfigure()) { return false; } + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.h new file mode 100755 index 0000000..a161838 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.h @@ -0,0 +1,34 @@ +#pragma once + +#include "../../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationMKSNVXDriver + * \author mkochetkov (MKS) + * \date Tue Jan 21 23:21:03 2014 + * \brief The CConfigurationMKSNVXDriver handles the configuration dialog specific to the MKSNVXDriver device. + * + * TODO: details + * + * \sa CDriverMKSNVXDriver + */ +class CConfigurationMKSNVXDriver final : public CConfigurationBuilder +{ + uint32_t& dataMode_; + bool& showAuxChannels_; +protected: + IDriverContext& m_driverCtx; +public: + // you may have to add to your constructor some reference parameters + // for example, a connection ID: + //CConfigurationMKSNVXDriver(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& rConnectionId); + CConfigurationMKSNVXDriver(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& dataMode, bool& auxChannels); + + bool preConfigure() override; + bool postConfigure() override; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCDriverMCSNVXDriver.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCDriverMCSNVXDriver.cpp new file mode 100755 index 0000000..ad77e4f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCDriverMCSNVXDriver.cpp @@ -0,0 +1,482 @@ +#if defined(TARGET_HAS_ThirdPartyMCS) + +#include "ovasCDriverMCSNVXDriver.h" +#include "ovasCConfigurationMCSNVXDriver.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +void setNVXDataSettinsDefaults(t_NVXDataSettins& ds) +{ + ds.DataRate = 2; + for (size_t i = 0; i < NVX_SELECT_CHANNELS_COUNT; ++i) + { + ds.NVXChannelsSelect.MainChannels[i] = short(i); + ds.NVXChannelsSelect.DiffChannels[i] = 255; + } +} + +CDriverMKSNVXDriver::CDriverMKSNVXDriver(IDriverContext& ctx) + : IDriver(ctx), nvxDataModel_(NVX_DM_NORMAL) + , m_settings("AcquisitionServer_Driver_MKSNVXDriver", m_driverCtx.getConfigurationManager()) +{ + setNVXDataSettinsDefaults(nvxDataSettings_); + m_header.setSamplingFrequency(10000); + m_header.setChannelCount(maxNumberOfChannels); + + // The following class allows saving and loading driver settings from the acquisition server .conf file + m_settings.add("Header", &m_header); + // To save your custom driver settings, register each variable to the SettingsHelper + m_settings.add("dataMode", &dataMode_); + m_settings.add("showAuxChannels", &showAuxChannels_); + + m_settings.load(); +} + +CDriverMKSNVXDriver::~CDriverMKSNVXDriver() {} + +const char* CDriverMKSNVXDriver::getName() { return "MCS NVX amplifier"; } + +//___________________________________________________________________// +// // + +bool CDriverMKSNVXDriver::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) return false; + if (!m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) return false; + + static const char* configuration = ""; + if (NVXAPIInit(configuration) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Cannot load NVX library.\n"; + return false; + } + // ... + // initialize hardware and get + // available header information + // from it + // Using for example the connection ID provided by the configuration (m_connectionID) + // ... + const size_t deviceCount = NVXGetCount(); + if (deviceCount != 1) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << (deviceCount == 0 ? "No MKS device found.\n" : "Only one MKS device is supported.\n"); + return false; + } + nvxDeviceId_ = NVXGetId(0); + if (NVXGetInformation(nvxDeviceId_, &nvxInfo_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXGetInformation error.\n"; + return false; + } + uint32_t realChannelsCount = 0; + switch (nvxInfo_.Model) + { + case NVX_MODEL_16: realChannelsCount = showAuxChannels_ ? 16 : 10; + break; + case NVX_MODEL_24: realChannelsCount = 24; + break; + case NVX_MODEL_36: realChannelsCount = showAuxChannels_ ? 36 : 32; + break; + case NVX_MODEL_52: realChannelsCount = showAuxChannels_ ? 52 : 48; + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unsupported device model: ." << nvxInfo_.Model << "\n"; + return false; + } + nvxDataModel_ = NVX_DM_NORMAL; + switch (m_header.getSamplingFrequency()) + { + case 50000: nvxDataSettings_.DataRate = 0; // it is not used + realChannelsCount = 4; + nvxDataModel_ = NVX_DM_50_KHZ; + break; + case 10000: nvxDataSettings_.DataRate = 0; + realChannelsCount = 16; + break; + case 5000: nvxDataSettings_.DataRate = 1; + realChannelsCount = 24; + break; + case 2000: nvxDataSettings_.DataRate = 2; + break; + case 1000: nvxDataSettings_.DataRate = 3; + break; + case 500: nvxDataSettings_.DataRate = 4; + break; + case 250: nvxDataSettings_.DataRate = 5; + break; + case 125: nvxDataSettings_.DataRate = 6; + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unsupported sampling frequency.\n"; + return false; + } + m_header.setChannelCount(realChannelsCount); + samplesCounter_ = 0; + triggerStates_ = 0; + // Builds up a buffer to store + // acquired samples. This buffer + // will be sent to the acquisition + // server later... + sampleData_.resize(getDeviceBufferSamplesCapacity()); + + if (NVXSetDataMode(nvxDeviceId_, nvxDataModel_, &nvxDataSettings_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXSetDataMode error.\n"; + return false; + } + + if (NVXGetProperty(nvxDeviceId_, &nvxProperty_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXGetProperty error.\n"; + return false; + } + + if (NVXOpen(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXSetDataMode error.\n"; + return false; + } + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + if (m_driverCtx.isImpedanceCheckRequested()) + { + if (NVXStartImpedance(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStartImpedance error.\n"; + return false; + } + if (NVXStart(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStart error.\n"; + return false; + } + } + return true; +} + +bool CDriverMKSNVXDriver::start() +{ + if (!m_driverCtx.isConnected()) return false; + if (m_driverCtx.isStarted()) return false; + + // ... + // request hardware to start + // sending data + // ... + samplesCounter_ = 0; + if (m_driverCtx.isImpedanceCheckRequested()) + { + if (NVXStop(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStop error.\n"; + return false; + } + if (NVXStopImpedance(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStopImpedance error.\n"; + return false; + } + } + switch (dataMode_) + { + case 1: // test + if (NVXStartTest(nvxDeviceId_, 0) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStartTest error.\n"; + return false; + } + // break; no break on purpose + case 0: // normal + if (NVXStart(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStart error.\n"; + return false; + } + break; + default: return false; + } + return true; +} + +const float floatNaN = std::numeric_limits::quiet_NaN(); +#define NVXValueToFloat(v, resolution) ((v) == INT_MAX ? floatNaN : ((v)*(resolution))) +// #define NVXValueToFloat(v, resolution) ((v) == INT_MAX ? 0.f : ((v)*(resolution))) + +bool CDriverMKSNVXDriver::loop() +{ + if (!m_driverCtx.isConnected()) return false; + if (m_driverCtx.isStarted()) + { + const size_t bufferSize = sizeof(deviceBuffer_); + int res = NVXGetData(nvxDeviceId_, deviceBuffer_, bufferSize); + size_t sizeOfNVXDataModelStructure = nvxDataModel_ == NVX_DM_NORMAL ? (nvxInfo_.Model == NVX_MODEL_16 ? sizeof(t_NVXDataModel16) + : (nvxInfo_.Model == NVX_MODEL_24 ? sizeof(t_NVXDataModel24) + : (nvxInfo_.Model == NVX_MODEL_36 ? sizeof(t_NVXDataModel36) + : sizeof(t_NVXDataModel52)))) + : sizeof(t_NVXDataMode50kHz); + if (res < 0 || res > bufferSize || res % sizeOfNVXDataModelStructure) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXGetData returned " << res << " This is unexpected.\n"; + return false; + } + if (res) + { + CStimulationSet stimSet; + + // ... + // receive samples from hardware + // put them the correct way in the sample array + // whether the buffer is full, send it to the acquisition server + //... + const size_t channelsAmount = m_header.getChannelCount(); + const size_t sampblesPerChannel = res / sizeOfNVXDataModelStructure; + if (sampblesPerChannel * channelsAmount > getDeviceBufferSamplesCapacity()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << + "Internal error: the amount of data exceeds the size of sampleData storage. This is internal error due to sampleData storage miscalculation.\n"; + return false; + } + float* sampleDataPtr = &sampleData_.at(0); + const float eegResolution = nvxProperty_.ResolutionEeg * 1000000.f, auxResolution = nvxProperty_.ResolutionAux * 1000000.f; + for (size_t j = 0; j < sampblesPerChannel; ++j) + { + for (size_t i = 0; i < channelsAmount; ++i) + { + if (nvxDataModel_ == NVX_DM_NORMAL) + { + switch (nvxInfo_.Model) + { + case NVX_MODEL_16: if (i < NVX_MODEL_16_CHANNELS_MAIN) + { + sampleDataPtr[i * sampblesPerChannel + j] = NVXValueToFloat(reinterpret_cast(deviceBuffer_)[j].Main[i], eegResolution); + } + else + { + const size_t auxChannelNumber = i - NVX_MODEL_16_CHANNELS_MAIN; + sampleDataPtr[i * sampblesPerChannel + j] = NVXValueToFloat( + reinterpret_cast(deviceBuffer_)[j].Aux[auxChannelNumber], auxResolution); + } + break; + case NVX_MODEL_24: sampleDataPtr[i * sampblesPerChannel + j] = NVXValueToFloat(reinterpret_cast(deviceBuffer_)[j].Main[i], eegResolution); + break; + case NVX_MODEL_36: if (i < NVX_MODEL_36_CHANNELS_MAIN) + { + sampleDataPtr[i * sampblesPerChannel + j] = NVXValueToFloat(reinterpret_cast(deviceBuffer_)[j].Main[i], eegResolution); + } + else + { + const size_t auxChannelNumber = i - NVX_MODEL_36_CHANNELS_MAIN; + sampleDataPtr[i * sampblesPerChannel + j] = NVXValueToFloat(reinterpret_cast(deviceBuffer_)[j].Aux[auxChannelNumber], auxResolution); + } + break; + case NVX_MODEL_52: if (i < NVX_MODEL_52_CHANNELS_MAIN) + { + sampleDataPtr[i * sampblesPerChannel + j] = NVXValueToFloat(reinterpret_cast(deviceBuffer_)[j].Main[i], eegResolution); + } + else + { + const size_t auxChannelNumber = i - NVX_MODEL_52_CHANNELS_MAIN; + sampleDataPtr[i * sampblesPerChannel + j] = NVXValueToFloat(reinterpret_cast(deviceBuffer_)[j].Aux[auxChannelNumber], auxResolution); + } + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unsupported device model: ." << nvxInfo_.Model << "\n"; + return false; + } + } + else + { + sampleDataPtr[i * sampblesPerChannel + j] = NVXValueToFloat(reinterpret_cast(deviceBuffer_)[j].Main[i], eegResolution); + } + } + // check data integrity + uint32_t correctSamplesCounter = 0; + if (nvxDataModel_ == NVX_DM_NORMAL) + { + switch (nvxInfo_.Model) + { + case NVX_MODEL_16: correctSamplesCounter = reinterpret_cast(deviceBuffer_)[j].Counter; + break; + case NVX_MODEL_24: correctSamplesCounter = reinterpret_cast(deviceBuffer_)[j].Counter; + break; + case NVX_MODEL_36: correctSamplesCounter = reinterpret_cast(deviceBuffer_)[j].Counter; + break; + case NVX_MODEL_52: correctSamplesCounter = reinterpret_cast(deviceBuffer_)[j].Counter; + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unsupported device model: ." << nvxInfo_.Model << "\n"; + return false; + } + } + else { correctSamplesCounter = reinterpret_cast(deviceBuffer_)[j].Counter; } + if (samplesCounter_ != correctSamplesCounter) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Data loss: expected sample number is " << samplesCounter_ + << " and the hardware reports " << correctSamplesCounter << "\n"; + samplesCounter_ = correctSamplesCounter; + stimSet.appendStimulation(OVTK_StimulationId_Label_00, CTime(m_header.getSamplingFrequency(), j).time(), 0); + } + ++samplesCounter_; + // set triggers + uint32_t currentTriggersState = 0; + if (nvxDataModel_ == NVX_DM_NORMAL) + { + switch (nvxInfo_.Model) + { + case NVX_MODEL_16: currentTriggersState = ~reinterpret_cast(deviceBuffer_)[j].Status & 0x1ff; + break; + case NVX_MODEL_24: currentTriggersState = ~reinterpret_cast(deviceBuffer_)[j].Status & 0x1ff; + break; + case NVX_MODEL_36: currentTriggersState = ~reinterpret_cast(deviceBuffer_)[j].Status & 0x1ff; + break; + case NVX_MODEL_52: currentTriggersState = ~reinterpret_cast(deviceBuffer_)[j].Status & 0x1ff; + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unsupported device model: ." << nvxInfo_.Model << "\n"; + return false; + } + } + else { currentTriggersState = ~reinterpret_cast(deviceBuffer_)[j].Status & 0x1ff; } + for (uint32_t triggerBit = 1, ovtkLabel = OVTK_StimulationId_Label_01; triggerBit <= 256; triggerBit <<= 1, ++ovtkLabel) + { + if (currentTriggersState & triggerBit) + { + if (!(triggerStates_ & triggerBit)) + { + triggerStates_ |= triggerBit; + stimSet.appendStimulation(ovtkLabel, CTime(m_header.getSamplingFrequency(), j).time(), 0); + } + } + else { triggerStates_ &= ~triggerBit; } + } + } + m_callback->setSamples(sampleDataPtr, sampblesPerChannel); + + // When your sample buffer is fully loaded, + // it is advised to ask the acquisition server + // to correct any drift in the acquisition automatically. + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + + // ... + // receive events from hardware + // and put them the correct way in a CStimulationSet object + //... + if (stimSet.getStimulationCount() != 0) { m_callback->setStimulationSet(stimSet); } + } + } + else if (m_driverCtx.isImpedanceCheckRequested()) + { // impedance + const size_t impedanceBubberCapacityAmount = 48; + uint32_t impedanceBuffer[impedanceBubberCapacityAmount]; + size_t impedanceChannelsAmount = m_header.getChannelCount(); + if (impedanceChannelsAmount == 36 || impedanceChannelsAmount == 52) { impedanceChannelsAmount -= 4; } + if (impedanceBubberCapacityAmount < impedanceChannelsAmount) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Incorrect channels amount in impedance mode. This is internal error which shall never happen.\n"; + return false; + } + if (NVXGetImpedance(nvxDeviceId_, impedanceBuffer, impedanceChannelsAmount * sizeof(impedanceBuffer[0])) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXGetImpedance error.\n"; + return false; + } + for (size_t i = 0; i < impedanceChannelsAmount; ++i) { m_driverCtx.updateImpedance(i, impedanceBuffer[i]); } + } + return true; +} + +bool CDriverMKSNVXDriver::stop() +{ + if (!m_driverCtx.isConnected()) return false; + if (!m_driverCtx.isStarted()) return false; + + // ... + // request the hardware to stop + // sending data + // ... + switch (dataMode_) + { + case 0: // normal + if (NVXStop(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStop error.\n"; + return false; + } + break; + case 1: // test + if (NVXStop(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStop error.\n"; + return false; + } + if (NVXStopTest(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStopTest error.\n"; + return false; + } + break; + default: return false; + } + + return true; +} + +bool CDriverMKSNVXDriver::uninitialize() +{ + if (!m_driverCtx.isConnected()) return false; + if (!m_driverCtx.isStarted()) + { + if (m_driverCtx.isImpedanceCheckRequested()) + { + if (NVXStop(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStop error.\n"; + return false; + } + if (NVXStopImpedance(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStopImpedance error.\n"; + return false; + } + if (NVXClose(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXClose error.\n"; + return false; + } + return true; + } + return false; + } + + // ... + // uninitialize hardware here + // ... + if (NVXClose(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXClose error.\n"; + return false; + } + + m_callback = nullptr; + NVXAPIStop(); + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverMKSNVXDriver::isConfigurable() { return true; } // change to false if your device is not configurable + +bool CDriverMKSNVXDriver::configure() +{ + // Change this line if you need to specify some references to your driver attribute that need configuration, e.g. the connection ID. + CConfigurationMKSNVXDriver config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-MCSNVXDriver.ui", dataMode_, showAuxChannels_); + + if (!config.configure(m_header)) { return false; } + m_settings.save(); + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCDriverMCSNVXDriver.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCDriverMCSNVXDriver.h new file mode 100755 index 0000000..21ae943 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCDriverMCSNVXDriver.h @@ -0,0 +1,79 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyMCS) + +#include +#include "ovasIDriver.h" +#include "../../ovasCHeader.h" +#include + +#include "../../ovasCSettingsHelper.h" +#include "../../ovasCSettingsHelperOperators.h" +#include "NVX.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverMKSNVXDriver + * \author mkochetkov (MKS) + * \date Tue Jan 21 23:21:03 2014 + * \brief The CDriverMKSNVXDriver allows the acquisition server to acquire data from a MKSNVXDriver device. + * + * TODO: details + * + * \sa CConfigurationMKSNVXDriver + */ +const size_t maxNumberOfChannels = 36; + +class CDriverMKSNVXDriver : public IDriver +{ + uint8_t deviceBuffer_[1024 * maxNumberOfChannels]; + int nvxDeviceId_ = -1; + t_NVXDataSettins nvxDataSettings_; + int nvxDataModel_ = 0; + uint32_t dataMode_ = 0; // normal, test, impedance + t_NVXProperty nvxProperty_; + uint32_t samplesCounter_ = 0; // previous t_NVXDataModelXX.Counter + uint32_t triggerStates_ = 0; + bool showAuxChannels_ = false; + t_NVXInformation nvxInfo_; +public: + + CDriverMKSNVXDriver(IDriverContext& ctx); + size_t getDeviceBufferSamplesCapacity() const + { + return sizeof(deviceBuffer_) / sizeof(t_NVXDataModel36) * maxNumberOfChannels; + } // I really do not know if it is accurate for all modes. + ~CDriverMKSNVXDriver() override; + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + + // Replace this generic Header with any specific header you might have written + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + std::vector sampleData_; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + + +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.cpp new file mode 100644 index 0000000..83b6476 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.cpp @@ -0,0 +1,27 @@ +#ifdef TARGET_OS_Windows + +#include "ovasCConfigurationDriverMensiaAcquisition.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +//TODO_JL Add the URL as parameter for configuration so it can be saved and loaded + +CConfigurationDriverMensiaAcquisition::CConfigurationDriverMensiaAcquisition(IDriverContext& ctx, const char* gtkBuilderFilename) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx) {} + +bool CConfigurationDriverMensiaAcquisition::preConfigure() +{ + //TODO_JL call preConfigure from DLL + return CConfigurationBuilder::preConfigure(); +} + +bool CConfigurationDriverMensiaAcquisition::postConfigure() +{ + //if (m_applyConfig) { } //TODO_JL call postConfigure from DLL + return CConfigurationBuilder::postConfigure(); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.h new file mode 100644 index 0000000..4f397b1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.h @@ -0,0 +1,34 @@ +#pragma once + +#ifdef TARGET_OS_Windows + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationDriverMensiaAcquisition + * \author Jozef Legeny (Mensia) + * \date 28 jan 2013 + * \brief The CConfigurationDriverMensiaAcquisition loads the configuration using the mensia-acquisition dynamic library + * + * \sa CDriverGenericOscillator + */ + +class CConfigurationDriverMensiaAcquisition final : public CConfigurationBuilder +{ +public: + CConfigurationDriverMensiaAcquisition(IDriverContext& ctx, const char* gtkBuilderFilename); + + bool preConfigure() override; + bool postConfigure() override; + +protected: + + IDriverContext& m_driverCtx; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCDriverMensiaAcquisition.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCDriverMensiaAcquisition.cpp new file mode 100644 index 0000000..9150979 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCDriverMensiaAcquisition.cpp @@ -0,0 +1,372 @@ +#ifdef TARGET_OS_Windows + +#include "ovasCDriverMensiaAcquisition.h" +#include "ovasCConfigurationDriverMensiaAcquisition.h" + +#include + +//#include +#include + +#include + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +namespace { +enum class EAcquisitionModes { Undefined = 0, Data = 1, Impedance = 2 }; + +CString mensiaDll = "openvibe-driver-mensia-acquisition.dll"; +HINSTANCE libMensiaAcquisition; // Library Handle + +typedef int (* initialize_acquisition_driver_t)(const char* sDeviceIdentifier, IDriverContext& ctx); + +typedef const char* (* get_name_t)(size_t); + +typedef const char* (* get_device_url_t)(size_t); + +typedef bool (*preconfigure_t)(size_t, const char*); +typedef bool (*configure_t)(size_t, const char*); +typedef uint32_t (*get_sampling_t)(size_t); +typedef uint32_t (*get_channel_count_t)(size_t); +typedef const char* (*get_channel_name_t)(size_t, size_t); +typedef bool (*is_impedance_check_requested_t)(size_t); +typedef void (*set_impedance_check_requested_t)(size_t, bool); +typedef float (*get_channel_impedance_t)(size_t, size_t); +typedef uint32_t (*get_impedance_limit_t)(size_t); +typedef void (*set_impedance_limit_t)(size_t, uint32_t); +typedef uint32_t (*get_experiment_id_t)(size_t); +typedef uint32_t (*set_experiment_id_t)(size_t, uint32_t); +typedef uint32_t (*get_subject_age_t)(size_t); +typedef uint32_t (*set_subject_age_t)(size_t, uint32_t); +typedef uint32_t (*get_subject_gender_t)(size_t); +typedef uint32_t (*set_subject_gender_t)(size_t, uint32_t); +typedef uint32_t (*set_sample_count_per_buffer_t)(size_t, uint32_t); +typedef bool (*initialize_t)(size_t, IDriverCallback*, uint32_t, const char*, EAcquisitionModes); +typedef bool (*start_t)(size_t); +typedef bool (*stop_t)(size_t); +typedef bool (*uninitialize_t)(size_t); +typedef bool (*loop_t)(size_t); + +initialize_acquisition_driver_t fpInitializeAcquisitionDriver; +get_name_t fpGetName; +get_device_url_t fpGetDeviceURL; + +preconfigure_t fpPreconfigure; +configure_t fpConfigure; +get_sampling_t fpGetSampling; +get_channel_count_t fpGetChannelCount; +get_channel_name_t fpGetChannelName; +is_impedance_check_requested_t fpIsImpedanceCheckRequested; +set_impedance_check_requested_t fpSetImpedanceCheckRequested; +get_channel_impedance_t fpGetChannelImpedance; +get_impedance_limit_t fpGetImpedanceLimit; +set_impedance_limit_t fpSetImpedanceLimit; +get_experiment_id_t fpGetExperimentID; +set_experiment_id_t fpSetExperimentID; +get_subject_age_t fpGetSubjectAge; +set_subject_age_t fpSetSubjectAge; +get_subject_gender_t fpGetSubjectGender; +set_subject_gender_t fpSetSubjectGender; +set_sample_count_per_buffer_t fpSetSampleCountPerBuffer; +initialize_t fpInitialize; +start_t fpStart; +stop_t fpStop; +uninitialize_t fpUninitialize; +loop_t fpLoop; +} // namespace + +template +void CDriverMensiaAcquisition::loadDLLfunct(T* pointer, const char* name) +{ + *pointer = T(GetProcAddress(libMensiaAcquisition, name)); + if (!*pointer) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Load method " << name << "\n"; + m_valid = false; + } +} + + +CDriverMensiaAcquisition::CDriverMensiaAcquisition(IDriverContext& ctx, const char* driverID) + : IDriver(ctx) + // This hax only works because m_settings does creates a copy of the string + , m_settings(std::string(std::string("AcquisitionServer_Driver_MensiaAcquisition_") + driverID).c_str(), m_driverCtx.getConfigurationManager()) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::CDriverMensiaAcquisition\n"; + m_valid = true; + + // Load the Mensia Acquisition Library + const CString path = m_driverCtx.getConfigurationManager().expand("${Path_Bin}") + "/" + mensiaDll; + if (!std::ifstream(path.toASCIIString()).is_open()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::CDriverMensiaAcquisition: " << + " dll file [" << path << "] not openable, perhaps it was not installed.\n"; + m_valid = false; + return; + } + + libMensiaAcquisition = HINSTANCE(System::WindowsUtilities::utf16CompliantLoadLibrary(path.toASCIIString())); + if (!libMensiaAcquisition) + { + m_driverCtx.getLogManager() << "CDriverMensiaAcquisition::CDriverMensiaAcquisition: utf16CompliantLoadLibrary failed to load: " << + path << " with error " << size_t(GetLastError()) << "\n"; + } + + loadDLLfunct(&fpInitializeAcquisitionDriver, "initializeAcquisitionDriver"); + loadDLLfunct(&fpGetName, "getName"); + loadDLLfunct(&fpGetDeviceURL, "getDeviceURL"); + loadDLLfunct(&fpPreconfigure, "preconfigure"); + loadDLLfunct(&fpConfigure, "configure"); + loadDLLfunct(&fpGetSampling, "getSamplingRate"); + loadDLLfunct(&fpGetChannelCount, "getChannelCount"); + loadDLLfunct(&fpGetChannelName, "getChannelName"); + loadDLLfunct(&fpIsImpedanceCheckRequested, "isImpedanceCheckRequested"); + loadDLLfunct(&fpSetImpedanceCheckRequested, "setImpedanceCheckRequested"); + loadDLLfunct(&fpGetChannelImpedance, "getChannelImpedance"); + loadDLLfunct(&fpGetImpedanceLimit, "getImpedanceLimit"); + loadDLLfunct(&fpSetImpedanceLimit, "setImpedanceLimit"); + loadDLLfunct(&fpGetExperimentID, "getExperimentID"); + loadDLLfunct(&fpSetExperimentID, "setExperimentID"); + loadDLLfunct(&fpGetSubjectAge, "getSubjectAge"); + loadDLLfunct(&fpSetSubjectAge, "setSubjectAge"); + loadDLLfunct(&fpGetSubjectGender, "getSubjectGender"); + loadDLLfunct(&fpSetSubjectGender, "setSubjectGender"); + loadDLLfunct(&fpSetSampleCountPerBuffer, "setSampleCountPerBuffer"); + loadDLLfunct(&fpInitialize, "initialize"); + loadDLLfunct(&fpStart, "start"); + loadDLLfunct(&fpStop, "stop"); + loadDLLfunct(&fpUninitialize, "uninitialize"); + loadDLLfunct(&fpLoop, "loop"); + + if (!m_valid) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Could not initialize Mensia Acquisition Driver driver\n"; + return; + } + + // prepare the device library + + const int id = fpInitializeAcquisitionDriver(driverID, ctx); + + // Negative value is considered an error + if (id < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Could not initialize Mensia Acquisition Driver driver\n"; + return; + } + m_driverID = uint32_t(id); + + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Initialized Mensia Acquisition Driver on id [" << m_driverID << "]" << "\n"; + + //TODO_JL Set sampling frenquency and channel count in header? + m_header.setSamplingFrequency(128); + m_header.setChannelCount(0); + m_header.setExperimentID(0); + m_header.setSubjectAge(0); + m_header.setSubjectGender(0); + + m_settings.add("Header", &m_header); + m_settings.add("DeviceURL", &m_deviceURL); + //TODO_JL Add the URL to settings so it can be saved (we should be able to expose it) + m_settings.load(); + fpSetExperimentID(m_driverID, m_header.getExperimentID()); + fpSetSubjectAge(m_driverID, m_header.getSubjectAge()); + fpSetSubjectGender(m_driverID, m_header.getSubjectGender()); + + fpSetImpedanceCheckRequested(m_driverID, m_header.isImpedanceCheckRequested()); + fpSetImpedanceLimit(m_driverID, m_header.getImpedanceLimit()); + + fpPreconfigure(m_driverID, m_deviceURL.toASCIIString()); + + m_header.setChannelCount(fpGetChannelCount(m_driverID)); + m_header.setSamplingFrequency(fpGetSampling(m_driverID)); + + for (size_t index = 0; index < m_header.getChannelCount(); ++index) { m_header.setChannelName(index, fpGetChannelName(m_driverID, index)); } +} + +void CDriverMensiaAcquisition::release() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::release\n"; + delete this; +} + +const char* CDriverMensiaAcquisition::getName() { return fpGetName(m_driverID); } + +//___________________________________________________________________// +// // + +bool CDriverMensiaAcquisition::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::initialize\n"; + + if (m_driverCtx.isConnected()) { return false; } + + m_nSamplePerSentBlock = nSamplePerSentBlock; + fpSetSampleCountPerBuffer(m_driverID, m_nSamplePerSentBlock); + m_deviceURL = CString(fpGetDeviceURL(m_driverID)); + + m_callback = &callback; + + m_header.setImpedanceCheckRequested(fpIsImpedanceCheckRequested(m_driverID)); + const EAcquisitionModes mode = m_header.isImpedanceCheckRequested() ? EAcquisitionModes::Impedance : EAcquisitionModes::Data; + if (!fpInitialize(m_driverID, m_callback, m_nSamplePerSentBlock, m_deviceURL.toASCIIString(), mode)) { return false; } + + fpSetExperimentID(m_driverID, m_header.getExperimentID()); + fpSetSubjectAge(m_driverID, m_header.getSubjectAge()); + fpSetSubjectGender(m_driverID, m_header.getSubjectGender()); + + m_header.setSamplingFrequency(fpGetSampling(m_driverID)); + m_header.setChannelCount(fpGetChannelCount(m_driverID)); + m_header.setExperimentID(fpGetExperimentID(m_driverID)); + m_header.setSubjectAge(fpGetSubjectAge(m_driverID)); + m_header.setSubjectGender(fpGetSubjectGender(m_driverID)); + m_header.setImpedanceLimit(fpGetImpedanceLimit(m_driverID)); + m_header.setImpedanceCheckRequested(fpIsImpedanceCheckRequested(m_driverID)); + + + for (size_t uiChannelIndex = 0; uiChannelIndex < m_header.getChannelCount(); ++uiChannelIndex) + { + m_header.setChannelName(uiChannelIndex, fpGetChannelName(m_driverID, uiChannelIndex)); + m_header.setChannelUnits(uiChannelIndex, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); + } + + return true; +} + +bool CDriverMensiaAcquisition::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::start\n"; + + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (!fpStart(m_driverID)) { return false; } + + return true; +} + +bool CDriverMensiaAcquisition::loop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverMensiaAcquisition::loop\n"; + + if (!m_driverCtx.isConnected()) { return false; } + + if (m_driverCtx.isStarted()) { if (!fpLoop(m_driverID)) { return false; } } + else + { + if (!fpLoop(m_driverID)) { return false; } + // impedance check here + if (m_driverCtx.isImpedanceCheckRequested()) + { + for (size_t j = 0; j < m_header.getChannelCount(); ++j) { m_driverCtx.updateImpedance(j, fpGetChannelImpedance(m_driverID, j)); } + } + } + + return true; +} + +bool CDriverMensiaAcquisition::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::stop\n"; + + + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + return fpStop(m_driverID); +} + +bool CDriverMensiaAcquisition::uninitialize() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::uninitialize\n"; + + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + fpUninitialize(m_driverID); + + delete [] m_sample; + m_sample = nullptr; + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverMensiaAcquisition::isConfigurable() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::isConfigurable\n"; + return true; +} + +bool CDriverMensiaAcquisition::configure() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::configure\n"; + fpSetExperimentID(m_driverID, m_header.getExperimentID()); + fpSetSubjectAge(m_driverID, m_header.getSubjectAge()); + fpSetSubjectGender(m_driverID, m_header.getSubjectGender()); + + /*CConfigurationDriverMensiaAcquisition config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-Generic-Oscillator.ui" ); +*/ + if (fpConfigure(m_driverID, m_deviceURL.toASCIIString())) + { + m_deviceURL = CString(fpGetDeviceURL(m_driverID)); + + // We need to escape the URL before we save the setting to the file because + // of the way OpenViBE handles strings + const CString tempURL = m_deviceURL; + std::string escapedURL = m_deviceURL.toASCIIString(); + size_t pos = 0; + while ((pos = escapedURL.find('{', pos)) != std::string::npos) + { + escapedURL.replace(pos, 1, "\\{"); + pos += 2; + } + + pos = 0; + while ((pos = escapedURL.find('}', pos)) != std::string::npos) + { + escapedURL.replace(pos, 1, "\\}"); + pos += 2; + } + + pos = 0; + while ((pos = escapedURL.find('$', pos)) != std::string::npos) + { + escapedURL.replace(pos, 1, "\\$"); + pos += 2; + } + + m_deviceURL = escapedURL.c_str(); + m_header.setSamplingFrequency(fpGetSampling(m_driverID)); + m_header.setChannelCount(fpGetChannelCount(m_driverID)); + m_header.setExperimentID(fpGetExperimentID(m_driverID)); + m_header.setSubjectAge(fpGetSubjectAge(m_driverID)); + m_header.setSubjectGender(fpGetSubjectGender(m_driverID)); + m_header.setImpedanceLimit(fpGetImpedanceLimit(m_driverID)); + m_header.setImpedanceCheckRequested(fpIsImpedanceCheckRequested(m_driverID)); + /* + fpSetExperimentID(m_driverID, m_header.getExperimentID()); + fpSetSubjectAge(m_driverID, m_header.getSubjectAge()); + fpSetSubjectGender(m_driverID, m_header.getSubjectGender()); + */ + + /* + for (size_t index = 0; index < m_header.getChannelCount(); ++index) { m_header.setChannelName(index, ""); } + */ + + m_settings.save(); + m_deviceURL = tempURL; + return true; + } + + + return false; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCDriverMensiaAcquisition.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCDriverMensiaAcquisition.h new file mode 100644 index 0000000..a1625ec --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCDriverMensiaAcquisition.h @@ -0,0 +1,59 @@ +#pragma once + +#ifdef TARGET_OS_Windows + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class CDriverMensiaAcquisition final : public IDriver +{ +public: + + CDriverMensiaAcquisition(IDriverContext& ctx, const char* driverID); + void release(); + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + + SettingsHelper m_settings; + bool m_valid = false; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + + uint32_t m_nTotalSample = 0; + uint64_t m_startTime = 0; + + uint32_t* m_sampleCountPerBuffer = nullptr; + +private: + // Settings + CString m_deviceURL; + + template + void loadDLLfunct(T* pointer, const char* name); + uint32_t m_driverID = 0; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.cpp new file mode 100644 index 0000000..3caee8a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.cpp @@ -0,0 +1,814 @@ +#if defined(TARGET_HAS_ThirdPartyMicromed) + +#include "ovasCDriverMicromedSystemPlusEvolution.h" +#include "../ovasCConfigurationNetworkBuilder.h" + +#if defined TARGET_OS_Windows + +#define MicromedDLL "dllMicromed.dll" + +#include + +#include +#include +#include +#include +#include +#include + +#include // std::min, etc on VS2013 + +namespace OpenViBE { +namespace AcquisitionServer { + +typedef char* ( __stdcall * STRUCTHEADER)(); +typedef int ( __stdcall * STRUCTHEADERSIZE)(); +typedef char* ( __stdcall * STRUCTHEADERINFO)(); +typedef int ( __stdcall * STRUCTHEADERINFOSIZE)(); +typedef unsigned short int* ( __stdcall * STRUCTBUFFDATA)(); +typedef int ( __stdcall * STRUCTBUFFDATASIZE)(); +typedef unsigned char* ( __stdcall * STRUCTBUFFNOTE)(); +typedef int ( __stdcall * STRUCTBUFFNOTESIZE)(); +typedef unsigned char* ( __stdcall * STRUCTBUFFTRIGGER)(); +typedef int ( __stdcall * STRUCTBUFFTRIGGERSIZE)(); +typedef bool ( __stdcall * HEADERVALID)(); +typedef bool ( __stdcall * DATAHEADER)(); +typedef bool ( __stdcall * NOTEHEADER)(); +typedef bool ( __stdcall * TRIGGERHEADER)(); +typedef bool ( __stdcall * INITHEADER)(); +typedef uint32_t ( __stdcall * DATALENGTH)(); +//typedef uint32_t ( __stdcall * ADDRESSOFDATA) (); +typedef uint32_t ( __stdcall * NBOFCHANNELS)(); +typedef uint32_t ( __stdcall * MINSAMPLINGRATE)(); +typedef uint32_t ( __stdcall * SIZEOFEACHDATAINBYTE)(); +typedef float ( __stdcall * DATAVALUE)(int numChannel, int numSample); +typedef int ( __stdcall * TRIGGERCOUNT)(); +typedef unsigned long int ( __stdcall * TRIGGERSAMPLE)(int indexTrigger); +typedef unsigned short int ( __stdcall * TRIGGERVALUE)(int indexTrigger); +typedef int ( __stdcall * NOTECOUNT)(); +typedef unsigned long int ( __stdcall * NOTESAMPLE)(int indexNote); +typedef char* ( __stdcall * NOTECOMMENT)(int indexNote); +typedef void ( __stdcall * SHOWELECTRODE)(std::stringstream* info); +typedef void ( __stdcall * SHOWNOTE)(std::stringstream* info); +typedef void ( __stdcall * SHOWTRIGGER)(std::stringstream* trigger); +typedef void ( __stdcall * SHOWSIGNAL)(std::stringstream* signal); + +// Header Structure +//--------------------------- +//pointer on the header structure. the header structure is send before any HeaderInfo or BuffData structure. +STRUCTHEADER fGetStructHeader; + +//give the size of the structHeader +STRUCTHEADERSIZE fGetStructHeaderSize; + +//say if the last structHeader is valid. +//must be call just after structHeader. +HEADERVALID fIsHeaderValid; + +//say if the Header structure is following by a Buffer Data structure +//must be call after structHeader. +DATAHEADER fIsDataHeader; + +//say if the Header structure is following by a Buffer Note structure +//must be call after structHeader. +NOTEHEADER fIsNoteHeader; + +//say if the Header structure is following by a Buffer Trigger structure +//must be call after structHeader. +TRIGGERHEADER fIsTriggerHeader; + +//say if the Header structure is following by a Header Info Structure +//must be call after structHeader. +INITHEADER fIsInitHeader; + +//give the size of the following data receive +//must be call after structHeader. +DATALENGTH fGetDataLength; + +// Header Info Structure +//--------------------------- + +//give many information of the device configuration. +STRUCTHEADERINFO fGetStructHeaderInfo; + +//give the size of the structHeaderInfo +STRUCTHEADERINFOSIZE fGetStructHeaderInfoSize; + +//give address of the first data. the address count start to the beginning of this structure. +//it necessary to receive information between this structure and the first address data before beginning. +//must be call after structHeaderInfo. +//ADDRESSOFDATA fGetAddressOfData; + +//give the number of channels connected to this device. +//must be call after structHeaderInfo. +NBOFCHANNELS fGetNbOfChannels; + +//give the sampling rate of the device +//must be call after structHeaderInfo. +MINSAMPLINGRATE fGetMinimumSamplingRate; + +//give the size in byte for one sample of one channels +//must be call after structHeaderInfo. +SIZEOFEACHDATAINBYTE fGetSizeOfEachDataInByte; + +//Give the value of the samples and channel specify +DATAVALUE fGetDataValue; + +SHOWELECTRODE fShowElectrode; +SHOWNOTE fShowNote; +SHOWTRIGGER fShowTrigger; +SHOWSIGNAL fShowSignal; + +// Buffer Data Structure +//--------------------------- + +//give sample of channels +STRUCTBUFFDATA fGetStructBuffData; +//give the size of the Data buffer +STRUCTBUFFDATASIZE fGetStructBuffDataSize; +// Buffer Note Structure +//--------------------------- + +//give sample of channels +STRUCTBUFFNOTE fGetStructBuffNote; +//give the size of the Data buffer +STRUCTBUFFNOTESIZE fGetStructBuffNoteSize; + +//give the number of Note received in the last data block +NOTECOUNT fGetNoteCount; + +//give the number of the sample whose the time corresponding to the reception of the note specified by the parameter +NOTESAMPLE fGetNoteSample; + +//give the comment corresponding to the note specified by the parameter +NOTECOMMENT fGetNoteComment; + +// Buffer Trigger Structure +//--------------------------- + +//give sample of channels +STRUCTBUFFTRIGGER fGetStructBuffTrigger; +//give the size of the Data buffer +STRUCTBUFFTRIGGERSIZE fGetStructBuffTriggerSize; + +//give the number of Trigger received in the last data block +TRIGGERCOUNT fGetTriggerCount; + +//give the number of the sample whose the time corresponding to the reception of the trigger specified by the parameter +TRIGGERSAMPLE fGetTriggerSample; + +//give the value corresponding to the trigger specified by the parameter +TRIGGERVALUE fGetTriggerValue; + +//lib +HINSTANCE libMicromed; //Library Handle + +//reg key +static char tcpPortNumber[1024]; +static char tcpSendAcq[1024]; +static char tcpServerName[1024]; +static HKEY registryKey = nullptr; +// bool g_bInitializedFromRegistry=false; +static const char* registeryKeyName = "Software\\VB and VBA Program Settings\\Brain Quick - System 98\\EEG_Settings"; + +#define LOAD_DLL_FUNC(var, type, name) \ + var = (type)::GetProcAddress(libMicromed, name); \ + if(!var) \ + { \ + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Load method " << name << "\n"; \ + m_valid=false; \ + return false; \ + } + +CDriverMicromedSystemPlusEvolution::CDriverMicromedSystemPlusEvolution(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_SystemPlusEvolution", m_driverCtx.getConfigurationManager()) +{ + libMicromed = nullptr; + + m_settings.add("Header", &m_header); + m_settings.add("ServerHostPort", &m_ServerHostPort); + m_settings.add("TimeOutMs", &m_timeOutMilliseconds); + m_settings.load(); +} + +CDriverMicromedSystemPlusEvolution::~CDriverMicromedSystemPlusEvolution() +{ + if (m_ConnectionServer) + { + m_ConnectionServer->release(); + m_ConnectionServer = nullptr; + } + + /** + * Is it necessary to restore the + * registry keys here ? + */ + +#if 0 + if(ERROR_SUCCESS!=::RegOpenKeyEx(HKEY_CURRENT_USER, registeryKeyName, 0, KEY_WRITE, ®istryKey)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key " << registeryKeyName << " not restored\n"; + } + + if(tcpPortNumber!=std::string("")) + { + if(ERROR_SUCCESS!=::RegSetValueEx(registryKey, "tcpPortNumber", 0, REG_SZ, (LPBYTE)tcpPortNumber, ::strlen(tcpPortNumber))) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpPortNumber not restored\n"; + } + } + else + { + if(ERROR_SUCCESS!=::RegDeleteValue(registryKey, "tcpPortNumber")) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpPortNumber not deleted\n"; + } + } + + if(tcpSendAcq!=std::string("")) + { + if(ERROR_SUCCESS!=::RegSetValueEx(registryKey, "tcpSendAcq", 0, REG_SZ, (LPBYTE)tcpSendAcq, ::strlen(tcpSendAcq))) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpSendAcq not restored\n"; + } + } + else + { + if(ERROR_SUCCESS!=::RegDeleteValue(registryKey, "tcpSendAcq")) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpSendAcq not deleted\n"; + } + } + + if(tcpServerName!=std::string("")) + { + if(ERROR_SUCCESS!=::RegSetValueEx(registryKey, "tcpServerName", 0, REG_SZ, (LPBYTE)tcpServerName, ::strlen(tcpServerName))) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpServerName not restored\n"; + } + } + else + { + if(ERROR_SUCCESS!=::RegDeleteValue(registryKey, "tcpServerName")) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpServerName not deleted\n"; + } + } + + ::RegCloseKey(registryKey); + registryKey= nullptr; +#endif +} + +// Load the ddl of the driver +bool CDriverMicromedSystemPlusEvolution::loadDLL() +{ + if (libMicromed) { return true; } // already loaded + + //Open library + const CString path = m_driverCtx.getConfigurationManager().expand("${Path_Bin}") + "/" + MicromedDLL; + libMicromed = ::LoadLibrary(path.toASCIIString()); + + //if it can't be open return FALSE; + if (libMicromed == nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Couldn't load DLL: " << path << "\n"; + return false; + } + + //load the method for initialized the driver + LOAD_DLL_FUNC(fGetStructHeader, STRUCTHEADER, "getStructHeader"); + LOAD_DLL_FUNC(fGetStructHeaderSize, STRUCTHEADERSIZE, "getStructHeaderSize"); + LOAD_DLL_FUNC(fGetStructHeaderInfo, STRUCTHEADERINFO, "getStructHeaderInfo"); + LOAD_DLL_FUNC(fGetStructHeaderInfoSize, STRUCTHEADERINFOSIZE, "getStructHeaderInfoSize"); + LOAD_DLL_FUNC(fGetStructBuffData, STRUCTBUFFDATA, "getStructBuffData"); + LOAD_DLL_FUNC(fGetStructBuffDataSize, STRUCTBUFFDATASIZE, "getStructBuffDataSize"); + LOAD_DLL_FUNC(fGetStructBuffNote, STRUCTBUFFNOTE, "getStructBuffNote"); + LOAD_DLL_FUNC(fGetStructBuffNoteSize, STRUCTBUFFNOTESIZE, "getStructBuffNoteSize"); + LOAD_DLL_FUNC(fGetStructBuffTrigger, STRUCTBUFFTRIGGER, "getStructBuffTrigger"); + LOAD_DLL_FUNC(fGetStructBuffTriggerSize, STRUCTBUFFTRIGGERSIZE, "getStructBuffTriggerSize"); + LOAD_DLL_FUNC(fIsHeaderValid, HEADERVALID, "isHeaderValid"); + LOAD_DLL_FUNC(fIsDataHeader, DATAHEADER, "isDataHeader"); + LOAD_DLL_FUNC(fIsNoteHeader, NOTEHEADER, "isNoteHeader"); + LOAD_DLL_FUNC(fIsTriggerHeader, TRIGGERHEADER, "isTriggerHeader"); + LOAD_DLL_FUNC(fIsInitHeader, INITHEADER, "isInitHeader"); + LOAD_DLL_FUNC(fGetDataLength, DATALENGTH, "getDataLength"); + //LOAD_DLL_FUNC(fGetAddressOfData, ADDRESSOFDATA, "getAddressOfData"); + + LOAD_DLL_FUNC(fGetNbOfChannels, NBOFCHANNELS, "getNbOfChannels"); + LOAD_DLL_FUNC(fGetMinimumSamplingRate, MINSAMPLINGRATE, "getMinimumSamplingRate"); + LOAD_DLL_FUNC(fGetSizeOfEachDataInByte, SIZEOFEACHDATAINBYTE, "getSizeOfEachDataInByte"); + LOAD_DLL_FUNC(fGetDataValue, DATAVALUE, "getDataValue"); + LOAD_DLL_FUNC(fGetTriggerCount, TRIGGERCOUNT, "getTriggerCount"); + LOAD_DLL_FUNC(fGetTriggerSample, TRIGGERSAMPLE, "getTriggerSample"); + LOAD_DLL_FUNC(fGetTriggerValue, TRIGGERVALUE, "getTriggerValue"); + LOAD_DLL_FUNC(fGetNoteCount, NOTECOUNT, "getNoteCount"); + LOAD_DLL_FUNC(fGetNoteSample, NOTESAMPLE, "getNoteSample"); + LOAD_DLL_FUNC(fGetNoteComment, NOTECOMMENT, "getNoteComment"); + LOAD_DLL_FUNC(fShowElectrode, SHOWELECTRODE, "show_Electrode"); + LOAD_DLL_FUNC(fShowNote, SHOWNOTE, "show_Note"); + LOAD_DLL_FUNC(fShowTrigger, SHOWTRIGGER, "show_Trigger"); + LOAD_DLL_FUNC(fShowSignal, SHOWSIGNAL, "showSignal"); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Succeeded in loading DLL: " << path << "\n"; + m_structHeader = fGetStructHeader(); + m_structHeaderInfo = fGetStructHeaderInfo(); + m_structBuffData = fGetStructBuffData(); + m_structBuffNote = fGetStructBuffNote(); + m_structBuffTrigger = fGetStructBuffTrigger(); + +#if 1 + if (ERROR_SUCCESS != ::RegOpenKeyEx(HKEY_CURRENT_USER, registeryKeyName, 0, KEY_QUERY_VALUE, ®istryKey)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key " << registeryKeyName << " is not initialized\n"; + strcpy(tcpPortNumber, ""); + strcpy(tcpSendAcq, ""); + strcpy(tcpServerName, ""); + return false; + } + + DWORD taille = sizeof(tcpPortNumber); + + if (ERROR_SUCCESS != ::RegQueryValueEx(registryKey, "tcpPortNumber", nullptr, nullptr, reinterpret_cast(tcpPortNumber), &taille)) + { + strcpy(tcpPortNumber, ""); + } + else { m_ServerHostPort = atoi(tcpPortNumber); } + + if (ERROR_SUCCESS != ::RegQueryValueEx(registryKey, "tcpSendAcq", nullptr, nullptr, reinterpret_cast(tcpSendAcq), &taille)) + { + strcpy(tcpSendAcq, ""); + } + + if (ERROR_SUCCESS != ::RegQueryValueEx(registryKey, "tcpServerName", nullptr, nullptr, reinterpret_cast(tcpServerName), &taille)) + { + strcpy(tcpServerName, ""); + } + + RegCloseKey(registryKey); + registryKey = nullptr; + // g_bInitializedFromRegistry=true; +#endif + + return true; +} + +short CDriverMicromedSystemPlusEvolution::myReceive(char* buf, const long dataLen) +{ + long nDati = 0; + //get data contains in the temp buffer + while (!m_tempBuffs.empty() && nDati < dataLen) + { + buf[nDati] = m_tempBuffs.front(); + m_tempBuffs.pop_front(); + nDati++; + } + + while (nDati < dataLen) + { + const long recByte = m_Connection->receiveBuffer((&buf[nDati]), dataLen - nDati); + if (recByte == 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "No data was received, check if the device is still connected\n"; + return -1; + } + + nDati += recByte; + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Received Data: = " << nDati << " /" << dataLen << "\n"; + } + return 0; +} + +bool CDriverMicromedSystemPlusEvolution::receiveAllHeader() +{ + do + { + // Receive Header + if (this->myReceive(m_structHeader, fGetStructHeaderSize()) == -1) { return false; } + if (fIsHeaderValid()) + { + char* header = new char[fGetStructHeaderSize()]; + memcpy(header, m_structHeader, fGetStructHeaderSize()); + m_headers.push_back(header); + } + else + { + //if no header was found, its impossible to find the next data block + if (m_headers.empty()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Header received not in correct form\n"; + return false; + } + + //save data in the temp buffer + for (int i = fGetStructHeaderSize(); i > 0; i--) { m_tempBuffs.push_front(m_structHeader[i - 1]); } + } + } while (fIsHeaderValid()); + + return true; +} + +bool CDriverMicromedSystemPlusEvolution::loadNextHeader() +{ + //get the next header + memcpy(m_structHeader, m_headers.back(), fGetStructHeaderSize()); + + //load next data + char* temp = new char[fGetStructHeaderSize()]; + if (this->myReceive(temp, fGetStructHeaderSize()) == -1) { return false; } + //check if the next data correspond to the current header + while (m_headers.size() > 1 && ((fIsNoteHeader() && strncmp(&(temp[4]), "Note", 4) != 0) || (!fIsNoteHeader() && strncmp(&(temp[4]), "Note", 4) == 0))) + { + m_headers.push_front(m_headers.back()); + m_headers.pop_back(); + //load the last + memcpy(m_structHeader, m_headers.back(), fGetStructHeaderSize()); + } + + //save data in the temp buffer + for (int i = fGetStructHeaderSize(); i > 0; i--) { m_tempBuffs.push_front(temp[i - 1]); } + delete[] temp; + delete[] m_headers.back(); + m_headers.pop_back(); + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverMicromedSystemPlusEvolution::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (!m_valid || m_driverCtx.isConnected()) { return false; } + if (!libMicromed && !loadDLL()) { return false; } + + //update register key + if (ERROR_SUCCESS != ::RegOpenKeyEx(HKEY_CURRENT_USER, registeryKeyName, 0, KEY_WRITE, ®istryKey)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key not initialized\n"; + } + else + { + char hostPort[1024]; + sprintf(hostPort, "%i", m_ServerHostPort); + //const std::string port = std::to_string(m_ServerHostPort); + //if (ERROR_SUCCESS != ::RegSetValueEx(registryKey, "tcpPortNumber", 0, REG_SZ, reinterpret_cast(const_cast(port.c_str())), port.size())) + + if (ERROR_SUCCESS != ::RegSetValueEx(registryKey, "tcpPortNumber", 0, REG_SZ, reinterpret_cast(hostPort), strlen(hostPort))) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpPortNumber not initialized to '" << m_ServerHostPort << "'\n"; + } + + if (tcpSendAcq == std::string()) + { + char* acq = "1"; + if (ERROR_SUCCESS != ::RegSetValueEx(registryKey, "tcpSendAcq", 0, REG_SZ, reinterpret_cast(acq), 1)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpSendAcq not initialized to '1'\n"; + } + } + + if (tcpServerName == std::string()) + { + strcpy(tcpServerName, "localhost"); + if (ERROR_SUCCESS != ::RegSetValueEx(registryKey, "tcpServerName", 0, REG_SZ, reinterpret_cast(tcpServerName), strlen(tcpServerName))) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpServerName not initialized to '" << tcpServerName << "'\n"; + } + } + + RegCloseKey(registryKey); + registryKey = nullptr; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Configure Register key\n"; + + // Builds up server connection + m_ConnectionServer = Socket::createConnectionServer(); + + if (!m_ConnectionServer) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "> Could not create server socket\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Server is on \n"; + + // Server start listening on defined port + if (!m_ConnectionServer->listen(m_ServerHostPort)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "> Could not listen TCP port " << m_ServerHostPort << "\n"; + + // Cleans up server connection + m_ConnectionServer->close(); + m_ConnectionServer->release(); + m_ConnectionServer = nullptr; + + return false; + } + + m_nSamplePerSentBlock = nSamplePerSentBlock; + m_callback = &callback; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Server is listening on port : " << m_ServerHostPort << "\n"; + + if (m_ConnectionServer->isReadyToReceive(m_timeOutMilliseconds)) + { + // Accept new client + m_Connection = m_ConnectionServer->accept(); + } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "> Time out after " << m_timeOutMilliseconds << " milliseconds\n"; + + // Cleans up server connection + m_ConnectionServer->close(); + m_ConnectionServer->release(); + m_ConnectionServer = nullptr; + + return false; + } + + // Receive Header + if (this->myReceive(m_structHeader, fGetStructHeaderSize()) == -1) { return false; } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Receiving Header....\n"; + + // Verify header validity + if (!fIsHeaderValid()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Header received not in correct form : pb with fixCode\n"; + return false; + } + + if (!fIsInitHeader()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Header received not in correct form : pb not receive Init information\n"; + return false; + } + + if (fGetStructHeaderInfoSize() != fGetDataLength()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << + "Header received not in correct form : pb the data header Info hasn't the good size\n the structure size:" << fGetStructHeaderInfoSize() << + "the size of data received:" << fGetDataLength() << "\n"; + return false; + } + + // Receive Header + if (this->myReceive(m_structHeaderInfo, fGetStructHeaderInfoSize()) == -1) { return false; } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Header received\n"; + + m_header.setChannelCount(fGetNbOfChannels()); + + m_header.setSamplingFrequency(uint32_t(fGetMinimumSamplingRate())); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "size for 1 channel, 1 block: " << m_nSamplePerSentBlock << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "number of channels: " << m_header.getChannelCount() << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Maximum sample rate =" << m_header.getSamplingFrequency() << " Hz" << "\n"; + m_sample = new float[m_header.getChannelCount() * m_nSamplePerSentBlock]; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "size of m_sample=" << (m_header.getChannelCount() * m_nSamplePerSentBlock * sizeof(float)) << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Maximum Buffer size =" << ( + m_header.getChannelCount() * m_nSamplePerSentBlock * sizeof(signed short int)) << " Samples" << "\n"; + + if (!m_sample) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "Could not allocate sample buffer\n"; + uninitialize(); + return false; + } + m_buffDataIdx = 0; + m_posFirstSampleOfCurrentBlock = 0; + if (m_driverCtx.getLogManager().isActive(Kernel::LogLevel_Debug)) + { + std::stringstream info; + fShowElectrode(&info); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << info.str(); + fShowNote(&info); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << info.str(); + fShowTrigger(&info); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << info.str(); + } + return true; +} + +bool CDriverMicromedSystemPlusEvolution::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "start device\n"; + if (!m_valid || !m_driverCtx.isConnected() || m_driverCtx.isStarted() || !m_Connection) { return false; } + m_nSamplesBlock = m_header.getChannelCount() * m_nSamplePerSentBlock; + m_sizeInByte = fGetSizeOfEachDataInByte(); + //calculate the number max of complete samples can be contains in the buffer. + m_buffSize = fGetStructBuffDataSize() / (m_sizeInByte * m_header.getChannelCount()); + m_buffSize = m_buffSize * (m_sizeInByte * m_header.getChannelCount()); + return true; +} + +bool CDriverMicromedSystemPlusEvolution::dropData() +{ + //drop data + uint32_t totalReceived = 0; + + do + { + const uint32_t maxByteRecv = std::min(uint32_t(fGetStructBuffDataSize()), uint32_t(fGetDataLength() - totalReceived)); + if (this->myReceive((char*)m_structBuffData, maxByteRecv) == -1) { return false; } + totalReceived += maxByteRecv; + } while (totalReceived < fGetDataLength()); + return true; +} + +bool CDriverMicromedSystemPlusEvolution::loop() +{ + if (!m_valid || !m_driverCtx.isConnected()) { return false; } + + if (m_Connection) + { + // Receive All consecutive Header + //this->myReceive(m_structHeader, fGetStructHeaderSize()); + if (!this->receiveAllHeader()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "No Header received, an error was occurred during the data acquisition!\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Number header received: " << m_headers.size() << "\n"; + + while (!m_headers.empty()) + { + if (!loadNextHeader()) { return false; } + // Verify header validity + if (!fIsHeaderValid()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Header received not in correct form\n"; + return false; + } + if (!fIsDataHeader() && !fIsNoteHeader() && !fIsTriggerHeader()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Header received not in correct form : problem with infoType\n"; + return false; + } + + //if(m_driverCtx.isStarted()) + //{ + if (fIsDataHeader()) + { + //if the device is not start or the first block after start haven't been received, data will be dropped + if (!m_driverCtx.isStarted()) + { + dropData(); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Device not started, dropped data: data.len = " << fGetDataLength() << "\n"; + return true; + } + // Receive Data + uint32_t maxByteRecv = 0; + uint32_t totalReceived = 0; + uint32_t receivedSampleCount = 0; + do + { + maxByteRecv = std::min(m_buffSize, std::min(fGetDataLength() - totalReceived, + uint32_t(m_nSamplesBlock - m_buffDataIdx * m_header.getChannelCount()) * m_sizeInByte)); + if (this->myReceive((char*)m_structBuffData, maxByteRecv) == -1) { return false; } + receivedSampleCount = maxByteRecv / (m_sizeInByte * m_header.getChannelCount()); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Number of Samples Received:" << receivedSampleCount << "\n"; + + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + for (uint32_t j = 0; j < receivedSampleCount; ++j) + { + m_sample[m_buffDataIdx + j + i * m_nSamplePerSentBlock] = float(fGetDataValue(i, j)); + } + } + + totalReceived += maxByteRecv; + m_buffDataIdx += receivedSampleCount; + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Convert Data: dataConvert = " << totalReceived << "/" << fGetDataLength() << "\n"; + + if (m_nSamplesBlock < m_buffDataIdx) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Data not received in correct form : problem with lenData\n"; + return false; + } + + if (m_nSamplesBlock == m_buffDataIdx * m_header.getChannelCount()) + { + m_callback->setSamples(m_sample); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Send samples back to CAcquisitionServer: samples.len = " << m_buffDataIdx << "\n"; + if (m_stimSet.getStimulationCount() > 0) + { + m_callback->setStimulationSet(m_stimSet); + m_stimSet.clear(); + } + m_posFirstSampleOfCurrentBlock += m_nSamplesBlock; + m_buffDataIdx = 0; + } + } while (totalReceived < fGetDataLength()); + if (m_driverCtx.getLogManager().isActive(Kernel::LogLevel_Debug)) + { + std::stringstream signal; + fShowSignal(&signal); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << signal.str(); + } + } + else if (fIsNoteHeader()) + { + if (this->myReceive((char*)m_structBuffNote, long(fGetDataLength())) == -1) { return false; } + std::stringstream note; + fShowNote(¬e); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << note.str(); + } + else if (fIsTriggerHeader()) + { + if (this->myReceive((char*)m_structBuffTrigger, long(fGetDataLength())) == -1) { return false; } + + for (int i = 0; i < fGetTriggerCount(); ++i) + { + uint32_t sample = fGetTriggerSample(i); + if (sample < m_posFirstSampleOfCurrentBlock) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << + " A trigger was received too late! this trigger will not be send to the acquisition server."; + } + else + { + uint32_t pos = uint32_t(sample - m_posFirstSampleOfCurrentBlock); + uint64_t time = CTime(m_header.getSamplingFrequency(), uint64_t(pos)).time(); + m_stimSet.appendStimulation(fGetTriggerValue(i), time, 0); + } + } + + if (m_driverCtx.getLogManager().isActive(Kernel::LogLevel_Trace)) + { + std::stringstream trigger; + fShowTrigger(&trigger); + //m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "A Trigger was received but this function is not implemented. Please submit a bug report (including the acquisition server log file in debug mode)"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << trigger.str(); + } + } + } + } + return true; +} + +bool CDriverMicromedSystemPlusEvolution::stop() +{ + if (!m_valid) { return false; } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Server stopped\n"; + + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + return true; +} + +bool CDriverMicromedSystemPlusEvolution::uninitialize() +{ + if (!m_valid || !m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_sample) + { + delete [] m_sample; + m_sample = nullptr; + m_callback = nullptr; + } + + // Cleans up client connection + if (m_Connection) + { + m_Connection->close(); + m_Connection->release(); + m_Connection = nullptr; + } + + // Cleans up server connection + if (m_ConnectionServer) + { + m_ConnectionServer->close(); + m_ConnectionServer->release(); + m_ConnectionServer = nullptr; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Server disconnected\n"; + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverMicromedSystemPlusEvolution::configure() +{ + if (!libMicromed) { loadDLL(); } + + CConfigurationNetworkBuilder config(Directories::getDataDir() + "/applications/acquisition-server/interface-Micromed-SystemPlusEvolution.ui"); + config.setHostPort(m_ServerHostPort); + + if (config.configure(m_header)) + { + m_ServerHostPort = config.getHostPort(); + m_settings.save(); + return true; + } + + return false; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // #if defined TARGET_OS_Windows +#endif // #if defined(TARGET_HAS_ThirdPartyMicromed) diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.h new file mode 100644 index 0000000..e3d0061 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.h @@ -0,0 +1,92 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyMicromed) + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#if defined TARGET_OS_Windows +#include +#include +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverMicromedSystemPlusEvolution + * \author Yann Renard (INRIA) + */ +class CDriverMicromedSystemPlusEvolution final : public IDriver +{ +public: + + explicit CDriverMicromedSystemPlusEvolution(IDriverContext& ctx); + ~CDriverMicromedSystemPlusEvolution() override; + const char* getName() override { return "Micromed SD LTM (through SystemPlus Evolution)"; } + + //virtual bool isFlagSet(const EDriverFlag flag) const { return flag==EDriverFlag::IsUnstable; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool loadDLL(); + + Socket::IConnectionServer* m_ConnectionServer = nullptr; + uint32_t m_ServerHostPort = 3000; + Socket::IConnection* m_Connection = nullptr; + short myReceive(char* buf, long dataLen); + bool receiveAllHeader(); + bool loadNextHeader(); + +protected: + + bool dropData(); + + SettingsHelper m_settings; + + bool m_valid = true; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + + uint32_t m_indexIn = 0; + uint32_t m_indexOut = 0; + uint32_t m_buffDataIdx = 0; + + uint32_t m_timeOutMilliseconds = 5000; + + char* m_structHeader = nullptr; + char* m_structHeaderInfo = nullptr; + unsigned short int* m_structBuffData = nullptr; + unsigned char* m_structBuffNote = nullptr; + unsigned char* m_structBuffTrigger = nullptr; + uint64_t m_posFirstSampleOfCurrentBlock = 0; + CStimulationSet m_stimSet; + + uint32_t m_nSamplesBlock = 0; + uint32_t m_sizeInByte = 0; + uint32_t m_buffSize = 0; + + std::list m_headers; + std::list m_tempBuffs; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.cpp new file mode 100644 index 0000000..cbc7f15 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.cpp @@ -0,0 +1,236 @@ +#if defined(TARGET_HAS_ThirdPartyNeXus) + +#include "ovasCDriverMindMediaNeXus32B.h" +#include "../ovasCConfigurationBuilder.h" + +#include + +#include +#include + +#if defined TARGET_OS_Windows + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +static const uint32_t INTERNALE_BUFFER_COUNT = 32; + +//___________________________________________________________________// +// // + +CDriverMindMediaNeXus32B::CDriverMindMediaNeXus32B(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_MindMediaNexus32B", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(512); + m_header.setChannelCount(4); + + m_settings.add("Header", &m_header); + m_settings.load(); +} + +void CDriverMindMediaNeXus32B::release() { delete this; } + +const char* CDriverMindMediaNeXus32B::getName() { return "MindMedia NeXus32B"; } + +//___________________________________________________________________// +// // + +#define _MindMedia_NeXus32B_DLLFileName_ "NeXusDLL.dll" + +typedef void (*NeXusDLL_ProcessData)(int sampleCount, int channel, float* sample); +typedef DWORD (*NeXusDLL_Init)(NeXusDLL_ProcessData fpProcessData); +typedef DWORD (*NeXusDLL_Start)(DWORD* sampling); +typedef DWORD (*NeXusDLL_Stop)(); + +static HANDLE mutex = nullptr; +static HINSTANCE neXusDLLInstance = nullptr; +static NeXusDLL_Init fpNeXusDLLInit = nullptr; +static NeXusDLL_Start fpNeXusDLLStart = nullptr; +static NeXusDLL_Stop fpNeXusDLLStop = nullptr; + +static CDriverMindMediaNeXus32B* driver = nullptr; + +//___________________________________________________________________// +// // + +static void processData(const int sampleCount, const int channel, float* sample) +{ + if (driver) { driver->processData(uint32_t(sampleCount), uint32_t(channel), sample); } +} + +//___________________________________________________________________// +// // + +bool CDriverMindMediaNeXus32B::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) { return false; } + + const CString binPath = m_driverCtx.getConfigurationManager().expand("${Path_Bin}"); + neXusDLLInstance = ::LoadLibrary((binPath + "/" + _MindMedia_NeXus32B_DLLFileName_).toASCIIString()); + if (!neXusDLLInstance) { return false; } + + fpNeXusDLLInit = NeXusDLL_Init(GetProcAddress(neXusDLLInstance, "InitNeXusDevice")); + fpNeXusDLLStart = NeXusDLL_Start(GetProcAddress(neXusDLLInstance, "StartNeXusDevice")); + fpNeXusDLLStop = NeXusDLL_Stop(GetProcAddress(neXusDLLInstance, "StopNeXusDevice")); + m_sample = new float[m_header.getChannelCount() * nSamplePerSentBlock * INTERNALE_BUFFER_COUNT]; + + if (!fpNeXusDLLInit || !fpNeXusDLLStart || !fpNeXusDLLStop || !m_sample) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error finding NeXus API functions / allocating sample buffer\n"; + + FreeLibrary(neXusDLLInstance); + delete [] m_sample; + neXusDLLInstance = nullptr; + fpNeXusDLLInit = nullptr; + fpNeXusDLLStart = nullptr; + fpNeXusDLLStop = nullptr; + m_sample = nullptr; + mutex = nullptr; + return false; + } + + mutex = CreateMutex(nullptr, FALSE, nullptr); // default security attributes, not initially owned, no name + + if (!mutex) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not create synchronisation mutex\n"; + FreeLibrary(neXusDLLInstance); + delete [] m_sample; + neXusDLLInstance = nullptr; + fpNeXusDLLInit = nullptr; + fpNeXusDLLStart = nullptr; + fpNeXusDLLStop = nullptr; + m_sample = nullptr; + mutex = nullptr; + return false; + } + + DWORD error = fpNeXusDLLInit(OpenViBE::AcquisitionServer::processData); + if (error) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not initialize device with NeXus API\n"; + FreeLibrary(neXusDLLInstance); + delete [] m_sample; + CloseHandle(mutex); + neXusDLLInstance = nullptr; + fpNeXusDLLInit = nullptr; + fpNeXusDLLStart = nullptr; + fpNeXusDLLStop = nullptr; + m_sample = nullptr; + mutex = nullptr; + return false; + } + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + m_sampleIdx = 0; + driver = this; + + return true; +} + +bool CDriverMindMediaNeXus32B::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + DWORD sampling = DWORD(m_header.getSamplingFrequency()); + const DWORD error = fpNeXusDLLStart(&sampling); + if (error) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not start acquisition with NeXus API\n"; + return false; + } + + return true; +} + +bool CDriverMindMediaNeXus32B::loop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return true; } + + WaitForSingleObject(mutex, INFINITE); + if (m_sampleIdx < m_nSamplePerSentBlock) + { + ReleaseMutex(mutex); + return true; + } + + m_callback->setSamples(m_sample); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + memcpy(m_sample, m_sample + m_header.getChannelCount() * m_nSamplePerSentBlock, m_header.getChannelCount() * m_nSamplePerSentBlock * sizeof(float)); + m_sampleIdx -= m_nSamplePerSentBlock; + ReleaseMutex(mutex); + + return true; +} + +bool CDriverMindMediaNeXus32B::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + const DWORD error = fpNeXusDLLStop(); + if (error) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not stop acquisition with NeXus API\n"; + return false; + } + return true; +} + +bool CDriverMindMediaNeXus32B::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + FreeLibrary(neXusDLLInstance); + delete [] m_sample; + CloseHandle(mutex); + m_sample = nullptr; + m_callback = nullptr; + neXusDLLInstance = nullptr; + fpNeXusDLLInit = nullptr; + fpNeXusDLLStart = nullptr; + fpNeXusDLLStop = nullptr; + driver = nullptr; + mutex = nullptr; + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverMindMediaNeXus32B::configure() +{ + CConfigurationBuilder config(Directories::getDataDir() + "/applications/acquisition-server/interface-MindMedia-NeXus32B.ui"); + if (!config.configure(m_header)) { return false; } + m_settings.save(); + return true; +} + +void CDriverMindMediaNeXus32B::processData(uint32_t sampleCount, uint32_t channel, float* sample) +{ + WaitForSingleObject(mutex, INFINITE); + + if (m_sampleIdx < m_nSamplePerSentBlock * INTERNALE_BUFFER_COUNT) + { + const uint32_t bufferIdx = m_sampleIdx / m_nSamplePerSentBlock; + const uint32_t sampleIdx = m_sampleIdx % m_nSamplePerSentBlock; + + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + m_sample[bufferIdx * m_nSamplePerSentBlock * m_header.getChannelCount() + i * m_nSamplePerSentBlock + sampleIdx] = sample[i]; + } + + m_sampleIdx++; // Please don't overflow :o) + } + + ReleaseMutex(mutex); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // defined TARGET_OS_Windows +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.h new file mode 100644 index 0000000..e68c181 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.h @@ -0,0 +1,55 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyNeXus) + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#if defined TARGET_OS_Windows + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverMindMediaNeXus32B + * \author Yann Renard (INRIA) + */ +class CDriverMindMediaNeXus32B : public IDriver +{ +public: + + CDriverMindMediaNeXus32B(IDriverContext& ctx); + virtual void release(); + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + virtual void processData(uint32_t sampleCount, uint32_t channel, float* sample); + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + uint32_t m_sampleIdx = 0; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // defined TARGET_OS_Windows +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.cpp new file mode 100755 index 0000000..10b24bd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.cpp @@ -0,0 +1,108 @@ +#if defined(TARGET_HAS_ThirdPartyEnobioAPI) + +#include "ovasCConfigurationEnobio3G.h" +#include +#include +#include +#include +#include +#include +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +/*_________________________________________________ + +Insert callback to specific widget here +Example with a button that launch a calibration of the device: + +//Callback connected to a dedicated gtk button: +static void button_calibrate_pressed_cb(GtkButton* button, void* data) +{ + CConfigurationEnobio3G* config=static_cast(data); + config->buttonCalibratePressedCB(); +} + +//Callback actually called: +void CConfigurationGTecGUSBamp::buttonCalibratePressedCB() +{ + // Connect to the hardware, ask for calibration, verify the return code, etc. +} +_________________________________________________*/ + +// If you added more reference attribute, initialize them here +CConfigurationEnobio3G::CConfigurationEnobio3G(IDriverContext& ctx, const char* gtkBuilderFilename) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx) { for (int i = 0; i < 6; ++i) { m_macAddress[i] = 0x00; } } + +bool CConfigurationEnobio3G::preConfigure() +{ + if (! CConfigurationBuilder::preConfigure()) { return false; } + + // Connect here all callbacks + // Example: + // g_signal_connect(gtk_builder_get_object(m_builder, "button_calibrate"), "pressed", G_CALLBACK(button_calibrate_pressed_cb), this); + + // Insert here the pre-configure code. + // For example, you may want to check if a device is currently connected + // and if more than one are connected. Then you can list in a dedicated combo-box + // the device currently connected so the user can choose which one he wants to acquire from. + + return true; +} + +// function to parse from string to HEX, decimal, etc... +template +bool from_string(T& t, const std::string& s, std::ios_base& (*f)(std::ios_base&)) +{ + std::istringstream iss(s); + return !(iss >> f >> t).fail(); +} + +bool CConfigurationEnobio3G::postConfigure() +{ + if (m_applyConfig) + { + // If the user pressed the "apply" button, you need to save the changes made in the configuration. + // For example, you can save the connection ID of the selected device: + // m_connectionID = + } + + GtkEntry* field = GTK_ENTRY(gtk_builder_get_object(m_builder,"entry_address")); + + std::string str((char*)gtk_entry_get_text(field)); + + if (! CConfigurationBuilder::postConfigure()) { return false; } // normal header is filled (Subject ID, Age, Gender, channels, sampling frequency), ressources are realesed + + // from the string typped in the address text field, parse + // the 6 hex values for the mac address + // first, tokenize the string using ':' as delimeter + std::vector v; + std::istringstream buf(str); + for (std::string token; getline(buf, token, ':');) { v.push_back(token); } + + // each token from the string, parse it as HEX values + int a; + from_string(a, v[5], std::hex); + m_macAddress[0] = (unsigned char)a; + from_string(a, v[4], std::hex); + m_macAddress[1] = (unsigned char)a; + from_string(a, v[3], std::hex); + m_macAddress[2] = (unsigned char)a; + from_string(a, v[2], std::hex); + m_macAddress[3] = (unsigned char)a; + from_string(a, v[1], std::hex); + m_macAddress[4] = (unsigned char)a; + from_string(a, v[0], std::hex); + m_macAddress[5] = (unsigned char)a; + + + return true; +} + +unsigned char* CConfigurationEnobio3G::getMacAddress() { return m_macAddress; } + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.h new file mode 100755 index 0000000..d86063c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.h @@ -0,0 +1,46 @@ +#pragma once + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationEnobio3G + * \author Anton Albajes-Eizagirre (NeuroElectrics anton.albajes-eizagirre@neuroelectrics.com) + * \date Tue Apr 15 09:25:20 2014 + * \brief The CConfigurationEnobio3G handles the configuration dialog specific to the Enobio3G device. + * + * TODO: details + * + * \sa CDriverEnobio3G + */ +class CConfigurationEnobio3G final : public CConfigurationBuilder +{ +public: + + // you may have to add to your constructor some reference parameters + // for example, a connection ID: + //CConfigurationEnobio3G(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& rConnectionId); + CConfigurationEnobio3G(IDriverContext& ctx, const char* gtkBuilderFilename); + + bool preConfigure() override; + bool postConfigure() override; + unsigned char* getMacAddress(); + +protected: + + IDriverContext& m_driverCtx; + +private: + + /* + * Insert here all specific attributes, such as a connection ID. + * use references to directly modify the corresponding attribute of the driver + * Example: + */ + // uint32_t& m_connectionID; + unsigned char m_macAddress[6]; // mac address of the device +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.cpp new file mode 100755 index 0000000..0b8dc15 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.cpp @@ -0,0 +1,231 @@ +#if defined(TARGET_HAS_ThirdPartyEnobioAPI) + +#include "ovasCDriverEnobio3G.h" +#include "ovasCConfigurationEnobio3G.h" +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverEnobio3G::CDriverEnobio3G(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_Enobio3G", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(_ENOBIO_SAMPLE_RATE_); + m_header.setChannelCount(32); + + // The following class allows saving and loading driver settings from the acquisition server .conf file + m_settings.add("Header", &m_header); + // To save your custom driver settings, register each variable to the SettingsHelper + //m_settings.add("SettingName", &variable); + m_settings.load(); + + // register consumers for enobio data and enobio status + // we register for data and status + m_enobioDevice.registerConsumer(Enobio3G::ENOBIO_DATA, *this); + // m_enobioDevice.registerConsumer(Enobio3G::STATUS, this); + // DONT Get the data from the accelerometer HACK: should ask through config dialog + m_enobioDevice.activateAccelerometer(false); + // set sampling rate of enobio device + m_sampleRate = _ENOBIO_SAMPLE_RATE_; + // allocate space for m_macAddres + m_macAddress = new unsigned char[6]; +} + +CDriverEnobio3G::~CDriverEnobio3G() +{ + // Note: Device itself is closed in uninitialize() + + delete m_sample; + delete m_macAddress; +} + +//___________________________________________________________________// +// // + +bool CDriverEnobio3G::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) return false; + + // open the BT connection to the device + if (m_enobioDevice.openDevice(m_macAddress)) { m_nChannels = m_enobioDevice.numOfChannels(); } + else { return false; } + + m_header.setChannelCount(m_nChannels); + if (!m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) return false; + + for (size_t c = 0; c < m_nChannels; ++c) { m_header.setChannelUnits(c, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); } + + // Builds up a buffer to store + // acquired samples. This buffer + // will be sent to the acquisition + // server later... + // number of cycling buffers we will use + m_nBuffers = 32; + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Need " << m_nBuffers << " buffers of " << m_header.getChannelCount() * nSamplePerSentBlock << " size for " + << m_nChannels << " channels\n"; + m_sample = new float*[m_nBuffers]; + for (uint32_t i = 0; i < m_nBuffers; ++i) + { + // each buffer will be of length samplecountpersentblock, defined by the configuration interface + m_sample[i] = new float[m_header.getChannelCount() * nSamplePerSentBlock]; + } + m_newData = false; + + if (!m_sample) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Memory allocation error\n"; + delete [] m_sample; + m_sample = nullptr; + return false; + } + m_currentBuffer = 0; + m_lastBufferFilled = 0; + m_bufHead = 0; + + // ... + // initialize hardware and get + // available header information + // from it + // Using for example the connection ID provided by the configuration (m_connectionID) + // ... + + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; +} + +bool CDriverEnobio3G::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + m_enobioDevice.startStreaming(); + return true; +} + +/** + Running loop used by OV engine to query for new data from device +*/ +bool CDriverEnobio3G::loop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return true; } + + // query new data flag state + bool newData; + { + std::lock_guard lock(m_mutex); + newData = m_newData; + } + + // if new data flag is raised it means there's a buffer with new data ready to be submitted + if (newData) + { + // submit new data on the buffer pointed by the lastbufferfilled variable + m_callback->setSamples(m_sample[m_lastBufferFilled]); + // lower new data flag + { + std::lock_guard lock(m_mutex); + m_newData = false; + } + // When your sample buffer is fully loaded, + // it is advised to ask the acquisition server + // to correct any drift in the acquisition automatically. + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + return true; +} + +bool CDriverEnobio3G::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + // ... + // request the hardware to stop + // sending data + // Tell Enobio device to stop streaming EEG. + m_enobioDevice.stopStreaming(); + + return true; +} + +bool CDriverEnobio3G::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_sample) + { + for (uint32_t i = 0; i < m_nBuffers; ++i) { delete m_sample[i]; } + delete [] m_sample; + m_sample = nullptr; + } + + m_callback = nullptr; + // close BT connection with the Enobio device + m_enobioDevice.closeDevice(); + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverEnobio3G::configure() +{ + // Change this line if you need to specify some references to your driver attribute that need configuration, e.g. the connection ID. + CConfigurationEnobio3G config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-Enobio3G.ui"); + + if (!config.configure(m_header)) { return false; } + m_settings.save(); + unsigned char* macAddress = config.getMacAddress(); + for (int i = 0; i < 6; ++i) { m_macAddress[i] = (unsigned char)*(macAddress + i); } + + return true; +} +/** + Callback function that will be called by the Enobio API for each sample received from the device. +*/ +void CDriverEnobio3G::receiveData(const PData& data) +{ + ChannelData* receivedData = (ChannelData*)data.getData(); + // We'll need to iterate through channels instead of memcpy because we need + // to cast from int to float. will also convert to microvolts + + int* samples = receivedData->data(); + for (uint32_t i = 0; i < m_nChannels; ++i) + { + double sample = samples[i] / 1000.0; + m_sample[m_currentBuffer][i * m_nSamplePerSentBlock + m_bufHead] = float(sample); + } + + // mutex for writing header and new data flag + { + std::lock_guard lock(m_mutex); + + m_bufHead++; + // if we already filled the current buffer we need to raise the new data flag + // and cycle to the next buffer + if (m_bufHead >= m_nSamplePerSentBlock) + { + // update the pointer to the last buffer filled + m_lastBufferFilled = m_currentBuffer; + // reset the buffer writing head to the beginning. + m_bufHead = 0; + // we update pointer to the current buffer + m_currentBuffer++; + // if we are at the end of the buffers set, cycle to the first one + if (m_currentBuffer >= m_nBuffers) { m_currentBuffer = 0; } + // raise the flag to mark existence of new data to be submittted + m_newData = true; + } + } +} + +/** + Callback from EnobioAPI to receive status data. + CURRENTLY NOT USED +*/ +void CDriverEnobio3G::newStatusFromDevice(const PData& data) { } + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.h new file mode 100755 index 0000000..01da833 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.h @@ -0,0 +1,96 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyEnobioAPI) + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +// Including Enobio headers gave 4275 on 11.07.2014 w/ VS2010 +#pragma warning(disable:4275) + +#include "enobio3g.h" +#include "StatusData.h" +#include + +#ifndef _ENOBIO_SAMPLE_RATE_ +#ifdef FREQ_SAMP + #define _ENOBIO_SAMPLE_RATE_ FREQSAMP +#else +#define _ENOBIO_SAMPLE_RATE_ 500 +#endif +#endif + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverEnobio3G + * \author Anton Albajes-Eizagirre (NeuroElectrics) anton.albajes-eizagirre@neuroelectrics.com + * \date Tue Apr 15 09:25:20 2014 + * \brief The CDriverEnobio3G allows the acquisition server to acquire data from a Enobio3G device. + * + * TODO: details + * + * \sa CConfigurationEnobio3G + */ +class CDriverEnobio3G final : public IDriver, public IDataConsumer +{ +public: + + CDriverEnobio3G(IDriverContext& ctx); + ~CDriverEnobio3G() override; + const char* getName() override { return "Enobio3G"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + + // enobio registered consumers callbacks + void receiveData(const PData& data); + void newStatusFromDevice(const PData& data); + +protected: + SettingsHelper m_settings; + IDriverCallback* m_callback = nullptr; + + // Replace this generic Header with any specific header you might have written + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + // sample buffers. We will have a set of buffers that will be cycled. + float** m_sample = nullptr; + +private: + + /* + * Insert here all specific attributes, such as USB port number or device ID. + * Example : + */ + uint32_t m_nChannels = 0; // Number of channels on the device reported by the device + unsigned char* m_macAddress = nullptr; // mac address of the device + Enobio3G m_enobioDevice; // Enobio device class instantiation + uint32_t m_sampleRate = 0; // sampling rate of the device + uint32_t m_bufHead = 0; // writing header for the current buffer + uint32_t m_nBuffers = 0; // number of buffers + uint32_t m_currentBuffer = 0; // current buffer in use + uint32_t m_lastBufferFilled = 0; // last buffer filled with data ready to be submitted + bool m_newData = false; // if there is a new buffer with data ready to be submitted + + std::mutex m_mutex; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDevice.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDevice.cpp new file mode 100644 index 0000000..e003777 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDevice.cpp @@ -0,0 +1,348 @@ +/* +* HID driver for OpenViBE +* +* \authors (NeuroServo, NeuroTechX) +* \developer (Innocent Agui�) +* \date Wed Nov 23 00:24:00 2016 +* +*/ + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include + +#include "HidDevice.h" +#include "SetupApi.h" + +#define READTHREADWAITTIMEOUT 100 + +HidDevice::HidDevice(const unsigned short vendorID, const unsigned short productID, const unsigned short receivdedDataSize) +{ + setHidDeviceInfos(vendorID, productID, receivdedDataSize); +} + +HidDevice::HidDevice() +{ + _hEventObject = CreateEvent(nullptr, TRUE, FALSE, "HIDUSBRcv"); + _hidOverlapped.hEvent = _hEventObject; + _hidOverlapped.Offset = 0; + _hidOverlapped.OffsetHigh = 0; +} + +HidDevice::~HidDevice() +{ + free(_deviceNotifier); + _deviceNotifier = nullptr; +} + +void HidDevice::setHidDeviceInfos(const unsigned short vendorID, const unsigned short productID, const unsigned short receivdedDataSize) +{ + _vendorID = vendorID; + _productID = productID; + _readDataSize = receivdedDataSize; + + // Init the connexion state + _isDeviceAttached = false; + _isDeviceConnected = false; +} + +bool HidDevice::connect() +{ + // Get the HID class identifier + HidD_GetHidGuid(&_hidGui); + + // Get HID information set in the PC + HDEVINFO deviceInfoSet = SetupDiGetClassDevs(&_hidGui, nullptr, nullptr, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); + + // Ensure that HID information set has been returned + if (!deviceInfoSet) + { + std::cout << "HidDevice::connect() -> Error: Problem to load HID information set" << std::endl; + return false; + } + + // Browse through device interfaces + SP_DEVICE_INTERFACE_DATA deviceInterfaceData; + deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + + BOOL isDeviceFound = 1; + uint32_t memberIndex = 0; + ULONG requiredSize; // Size of device detail data + HIDD_ATTRIBUTES hidAttributes; + while (isDeviceFound) + { + // Get the device interface at the index "memberIndex" + isDeviceFound = SetupDiEnumDeviceInterfaces(deviceInfoSet, nullptr, &_hidGui, memberIndex, &deviceInterfaceData); + + // Ensure that a device has been found at the specified index + if (!isDeviceFound) { isDeviceFound = 0; } + else + { + // Get the details with null values to get the required size of the buffer + SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, + nullptr, //interfaceDetail, + 0, //interfaceDetailSize, + &requiredSize, + nullptr); //infoData)) + + // Allocate the buffer + PSP_INTERFACE_DEVICE_DETAIL_DATA deviceInterfaceDetailData = PSP_INTERFACE_DEVICE_DETAIL_DATA(malloc(requiredSize)); + deviceInterfaceDetailData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); + + // Fill the buffer with the device details + if (!SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, + deviceInterfaceDetailData, requiredSize, &requiredSize, nullptr)) + { + // Ensure to free the dynamic allocated memory + SetupDiDestroyDeviceInfoList(deviceInfoSet); + free(deviceInterfaceDetailData); + std::cout << "HidDevice::connect() -> Error: failed to get device info" << std::endl; + return false; + } + + // Details about the device is available + HANDLE hidDeviceObject = CreateFile(deviceInterfaceDetailData->DevicePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, + nullptr); + + // Ensure that the handle is valid + if (!hidDeviceObject) + { + std::cout << "HidDevice::connect() -> Error: failed to get handle of the HID" << std::endl; + return false; + } + + // Get the attribute of the HID + if (!HidD_GetAttributes(hidDeviceObject, &hidAttributes)) + { + std::cout << "HidDevice::connect() -> Error: failed to get HID attributes" << std::endl; + return false; + } + + + if (hidAttributes.VendorID == _vendorID && hidAttributes.ProductID == _productID) + { + // We found the targeted device ... Save the following: + // - HID device handle + _deviceHandle = hidDeviceObject; + + // - Version number + _versionNumber = hidAttributes.VersionNumber; + + // `- Device Path Name + _devicePathName = deviceInterfaceDetailData->DevicePath; + + // - Configure the device for read and write + if (!configure()) { return false; } + + // At this step it's guaranteed that the device has been detected and connected + deviceIsConnected(); + + // Ensure to free the dynamic memory allocated + free(deviceInterfaceDetailData); + + // The device has been found and is connected + return true; + } + + // Next device + memberIndex++; + } + } + + // No device corresponding to the PID and VID + return false; +} + +bool HidDevice::configure() +{ + // Get the read and write handles + if (!getReadWriteHandle()) { return false; } + + // Get the capabilities of the device + if (!getCapabilities()) { return false; } + + // The device has been correctly configured + return true; +} + +bool HidDevice::getReadWriteHandle() +{ + // Open the readHandle to the device + _readDeviceHandle = CreateFile(_devicePathName, GENERIC_WRITE | GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, LPSECURITY_ATTRIBUTES(nullptr), OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nullptr); + + // Did we open the readHandle successfully? + if (!_readDeviceHandle) + { + std::cout << "HidDevice::configure() -> Error: Fail to get the read handle of the device" << std::endl; + return false; + } + + // Open the readHandle to the device + _writeDeviceHandle = CreateFile(_devicePathName, GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, LPSECURITY_ATTRIBUTES(nullptr), OPEN_EXISTING, 0, nullptr); + + // Did we open the readHandle successfully? + if (!_writeDeviceHandle) + { + std::cout << "HidDevice::configure() -> Error: Fail to get the write handle of the device" << std::endl; + return false; + } + + return true; +} + +bool HidDevice::getCapabilities() +{ + // Get the preparsed data in order to request the device capabilities + PHIDP_PREPARSED_DATA preparsedData; + const BOOLEAN result = HidD_GetPreparsedData(_deviceHandle, &preparsedData); + if (result != TRUE) + { + std::cout << "HidDevice::configure() -> Error: Fail to get the preparsed data" << std::endl; + return false; + } + + // Get the capabilities + const NTSTATUS status = HidP_GetCaps(preparsedData, &_deviceCaps); + if (status != HIDP_STATUS_SUCCESS) + { + std::cout << "HidDevice::configure() -> Error: Fail to get the collection capability information" << std::endl; + return false; + } + + if (preparsedData) + { + const BOOLEAN isFreeCompleted = HidD_FreePreparsedData(preparsedData); + + // Ensure memory has been freed correcly + if (!isFreeCompleted) + { + std::cout << "HidDevice::configure() -> Error: Fail to free the preparsed data in memory" << std::endl; + return false; + } + } + + + return true; +} + +bool HidDevice::writeToDevice(BYTE data[], const int nbOfBytes) +{ + // Make sure that the device is connected + if (_isDeviceConnected) + { + const DWORD dwBytesToWrite = DWORD(nbOfBytes); + DWORD dwBytesWritten = 0; + + const BOOL writeResult = WriteFile(_writeDeviceHandle, data, dwBytesToWrite, &dwBytesWritten, nullptr); + + if (!writeResult) + { + std::cout << "HidDevice::writeToDevice() -> Error: Problem sending message to the device" << std::endl; + return false; + } + + //std::cout << "HidDevice::writeToDevice() -> Data sent to the device" << std::endl; + return true; + } + std::cout << "HidDevice::writeToDevice() -> Error: The device is not connected." << std::endl; + return false; +} + +void HidDevice::readThread() +{ + _readData = new BYTE[_readDataSize]; + + DWORD nbByteRead; + DWORD waitReturn; + + while (_isDeviceConnected) + { + const BOOL result = ReadFile(_readDeviceHandle, _readData, _readDataSize, nullptr, LPOVERLAPPED(&_hidOverlapped)); + if (result == 1 || (result == 0 && GetLastError() == ERROR_IO_PENDING)) + { + do { waitReturn = WaitForSingleObject(_hEventObject, READTHREADWAITTIMEOUT); } while ((waitReturn == WAIT_TIMEOUT) && (_isDeviceConnected == true)); + switch (waitReturn) + { + case WAIT_OBJECT_0: // Data returned + { + nbByteRead = 0; + if (GetOverlappedResult(_readDeviceHandle, &_hidOverlapped, &nbByteRead, FALSE) && nbByteRead == _readDataSize) + { + // Pass the data read to the client method + if (dataReceived) { dataReceived(_readData); } + } + else + { + if (_isDeviceConnected) { std::cout << "HidDevice::readThread():incomplete -> Error: Reading data from device failed." << std::endl; } + } + break; + } + default: + { + if (_isDeviceConnected) { std::cout << "HidDevice::readThread():waitReturn -> Error: Reading data from device failed." << std::endl; } + break; + } + } + } + else { if (_isDeviceConnected) { std::cout << "HidDevice::readThread() -> Error: Reading data from device failed." << std::endl; } } + ResetEvent(_hEventObject); + } + // Free the memory allocated for reading data + delete[] _readData; + _readData = nullptr; +} + +void HidDevice::deviceIsConnected() +{ + // Device is attached + _isDeviceAttached = true; + + // flag the device connexion state + _isDeviceConnected = true; + + // Start a separate thread for reading data from the device + _readTask = std::thread(&HidDevice::readThread, this); + _readTask.detach(); + + // Attach the client callback method + if (deviceConnected) { deviceConnected(); } + + // Start the Register Device Notification just once + if (_deviceNotifier == nullptr) + { + _deviceNotifier = new HidDeviceNotifier(_hidGui, _devicePathName); + + // Bind the callback methods + _deviceNotifier->deviceAttached = std::bind(&HidDevice::deviceOnAttached, this); + _deviceNotifier->deviceDetached = std::bind(&HidDevice::deviceOnDetached, this); + + // Register the device for notification + _deviceNotifier->startRegistration(); + } +} + +void HidDevice::deviceOnAttached() +{ + std::cout << "Callback - Device attached" << std::endl; + _isDeviceAttached = true; + + // Execute the callback if defined + if (deviceAttached) { deviceAttached(); } +} + +void HidDevice::deviceOnDetached() +{ + std::cout << "Callback - Device detached" << std::endl; + _isDeviceAttached = false; + _isDeviceConnected = false; + + // Execute the callback if defined + if (deviceDetached) { deviceDetached(); } +} + + +#endif +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDevice.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDevice.h new file mode 100644 index 0000000..e7f4bbe --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDevice.h @@ -0,0 +1,90 @@ +/* +* HID driver for OpenViBE +* +* \authors (NeuroServo, NeuroTechX) +* \developer (Innocent Agui�) +* \date Wed Nov 23 00:24:00 2016 +* +*/ + +#pragma once + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include +#include "Hidsdi.h" +#include + +#include "HidDeviceNotifier.h" + +class HidDevice +{ +public: + HidDevice(unsigned short vendorID, unsigned short productID, unsigned short receivdedDataSize); + HidDevice(); + ~HidDevice(); + + /* Client available methods */ + bool connect(); + bool writeToDevice(BYTE data[], int nbOfBytes); + bool isDeviceConnected() { return _isDeviceConnected; } + void setHidDeviceInfos(unsigned short vendorID, unsigned short productID, unsigned short receivdedDataSize); + + /* Callbacks methods */ + std::function dataReceived; + std::function deviceConnected; + std::function deviceDetached; + std::function deviceAttached; + + +private: + + /* Methods to perform specific actions */ + bool configure(); + bool getReadWriteHandle(); + bool getCapabilities(); + void deviceIsConnected(); + void readThread(); + + /* Callbacks from Register Device Notification */ + void deviceOnAttached(); + void deviceOnDetached(); + + /* Instances */ + + // Device identification + unsigned short _vendorID = 0; + unsigned short _productID = 0; + unsigned short _versionNumber = 0; + GUID _hidGui; + + // Device connexion state + bool _isDeviceAttached = false; + bool _isDeviceConnected = false; + + // Device communication handle + HANDLE _deviceHandle; + HANDLE _readDeviceHandle; + HANDLE _writeDeviceHandle; + CHAR* _devicePathName = nullptr; + + // Device capabilities + HIDP_CAPS _deviceCaps; + + // Background worker + std::thread _readTask; + + // To be able to read the data + BYTE* _readData = nullptr; + unsigned short _readDataSize; + + // Device notifier + HidDeviceNotifier* _deviceNotifier = nullptr; + + HANDLE _hEventObject; + OVERLAPPED _hidOverlapped; +}; + +#endif +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifier.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifier.cpp new file mode 100644 index 0000000..b935b81 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifier.cpp @@ -0,0 +1,41 @@ +/* +* HID driver for OpenViBE +* +* \authors (NeuroServo, NeuroTechX) +* \developer (Innocent Agui) +* \date Wed Nov 23 00:24:00 2016 +* +*/ + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include + +#include "HidDeviceNotifier.h" +#include "HidDeviceNotifierRef.h" +#include + +#define WND_CLASS_NAME TEXT("SampleAppWindowClass") + + +HidDeviceNotifier::HidDeviceNotifier(const GUID interfaceGuid, CHAR* devicePathName) +{ + _deviceGuid = interfaceGuid; + _devicePathName = devicePathName; + _appName = "Window Notifier"; + _isDeviceRegistered = false; +} + +void HidDeviceNotifier::startRegistration() +{ + _isDeviceRegistered = true; + + // Start a separate thread for reading data from the device + std::thread notifierThread(registerNotification, this); + notifierThread.detach(); +} + +#endif + +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifier.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifier.h new file mode 100644 index 0000000..8a99c02 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifier.h @@ -0,0 +1,50 @@ +/* +* HID driver for OpenViBE +* +* \authors (NeuroServo, NeuroTechX) +* \developer (Innocent Agui�) +* \date Wed Nov 23 00:24:00 2016 +* +*/ +#pragma once + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include +#include + +class HidDeviceNotifier +{ +public: + HidDeviceNotifier(GUID interfaceGuid, CHAR* devicePathName); + HidDeviceNotifier() { } + ~HidDeviceNotifier() { } + + void startRegistration(); + + /* Callbacks methods */ + std::function deviceDetached; + std::function deviceAttached; + + /* Member functions */ + GUID getDeviceGuid() const { return _deviceGuid; } + CHAR* getDevicePathName() const { return _devicePathName; } + LPCSTR getAppName() const { return _appName; } + bool isDeviceRegistrationStarted() const { return _isDeviceRegistered; } + + +private: + /* Members */ + // Device related information + GUID _deviceGuid; + CHAR* _devicePathName = nullptr; + + // For informational messages and window titles + LPCSTR _appName; + + bool _isDeviceRegistered = false; +}; + +#endif +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.cpp new file mode 100644 index 0000000..009987d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.cpp @@ -0,0 +1,438 @@ +/* +* HID driver for OpenViBE +* +* \authors (NeuroServo, NeuroTechX) +* \developer (Innocent Agui�) +* \date Wed Nov 23 00:24:00 2016 +* +*/ + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include +#include +#include +#include +#include + +#include "HidDeviceNotifier.h" + +#define WND_CLASS_NAME TEXT("SampleAppWindowClass") + +// Hid notifier object to provide target specific infos +HidDeviceNotifier hidDeviceNotifier; + +/** +The following methods have been copied from Microsoft Dev Center +Date: 2016-11-29 +Address: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363432(v=vs.85).aspx + +*/ + +// Forward declarations +void OutputMessage(HWND hOutWnd, WPARAM wParam, LPARAM lParam); +void ErrorHandler(LPTSTR lpszFunction); + +// +// DoRegisterDeviceInterfaceToHwnd +// +BOOL DoRegisterDeviceInterfaceToHwnd(IN GUID InterfaceClassGuid, IN HWND hWnd, OUT HDEVNOTIFY* hDeviceNotify) +// Routine Description: +// Registers an HWND for notification of changes in the device interfaces +// for the specified interface class GUID. + +// Parameters: +// InterfaceClassGuid - The interface class GUID for the device +// interfaces. + +// hWnd - Window handle to receive notifications. + +// hDeviceNotify - Receives the device notification handle. On failure, +// this value is NULL. + +// Return Value: +// If the function succeeds, the return value is TRUE. +// If the function fails, the return value is FALSE. + +// Note: +// RegisterDeviceNotification also allows a service handle be used, +// so a similar wrapper function to this one supporting that scenario +// could be made from this template. +{ + DEV_BROADCAST_DEVICEINTERFACE NotificationFilter; + + ZeroMemory(&NotificationFilter, sizeof(NotificationFilter)); + NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); + NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; + NotificationFilter.dbcc_classguid = InterfaceClassGuid; + + *hDeviceNotify = RegisterDeviceNotification(hWnd, // events recipient + &NotificationFilter, // type of device + DEVICE_NOTIFY_WINDOW_HANDLE); // type of recipient handle + + if (nullptr == *hDeviceNotify) + { + ErrorHandler(TEXT("RegisterDeviceNotification")); + return FALSE; + } + + return TRUE; +} + +// +// MessagePump +// +void MessagePump(HWND hWnd) +// Routine Description: +// Simple main thread message pump. +// + +// Parameters: +// hWnd - handle to the window whose messages are being dispatched + +// Return Value: +// None. +{ + MSG msg; + int retVal; + + // Get all messages for any window that belongs to this thread, + // without any filtering. Potential optimization could be + // obtained via use of filter values if desired. + + //while ((retVal = GetMessage(&msg, nullptr, 0, 0)) != 0) + while ((retVal = GetMessage(&msg, hWnd, 0, 0)) != 0) + { + if (retVal == -1) + { + ErrorHandler(TEXT("GetMessage")); + break; + } + TranslateMessage(&msg); + DispatchMessage(&msg); + } +} + +// +// WinProcCallback +// +INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +// Routine Description: +// Simple Windows callback for handling messages. +// This is where all the work is done because the example +// is using a window to process messages. This logic would be handled +// differently if registering a service instead of a window. + +// Parameters: +// hWnd - the window handle being registered for events. + +// message - the message being interpreted. + +// wParam and lParam - extended information provided to this +// callback by the message sender. + +// For more information regarding these parameters and return value, +// see the documentation for WNDCLASSEX and CreateWindowEx. +{ + LRESULT lRet = 1; + static HDEVNOTIFY hDeviceNotify; + static HWND hEditWnd; + + switch (message) + { + case WM_CREATE: + // + // This is the actual registration., In this example, registration + // should happen only once, at application startup when the window + // is created. + // + // If you were using a service, you would put this in your main code + // path as part of your service initialization. + // + if (!DoRegisterDeviceInterfaceToHwnd(/*WceusbshGUID*/hidDeviceNotifier.getDeviceGuid(), hWnd, &hDeviceNotify)) + { + // Terminate on failure. + ErrorHandler(TEXT("DoRegisterDeviceInterfaceToHwnd")); + ExitProcess(1); + } + + + // + // Make the child window for output. + // + { +#if defined(TARGET_ARCHITECTURE_x64) + HINSTANCE winPtr = HINSTANCE(GetWindowLongPtr(hWnd, GWLP_HINSTANCE)); +#else + HINSTANCE winPtr = HINSTANCE(GetWindowLong(hWnd, GWL_HINSTANCE)); +#endif + + hEditWnd = CreateWindow(TEXT("EDIT"),// predefined class + NULL, // no window title + WS_CHILD | WS_VISIBLE | WS_VSCROLL | + ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL, + 0, 0, 0, 0, // set size in WM_SIZE message + hWnd, // parent window + HMENU(1), // edit control ID + winPtr, + NULL); // pointer not needed + } + + if (hEditWnd == nullptr) + { + // Terminate on failure. + ErrorHandler(TEXT("CreateWindow: Edit Control")); + ExitProcess(1); + } + // Add text to the window. + SendMessage(hEditWnd, WM_SETTEXT, 0, LPARAM("Registered for USB device notification...\n")); + + break; + + case WM_SETFOCUS: SetFocus(hEditWnd); + + break; + + case WM_SIZE: + // Make the edit control the size of the window's client area. + MoveWindow(hEditWnd, + 0, 0, // starting x- and y-coordinates + LOWORD(lParam), // width of client area + HIWORD(lParam), // height of client area + TRUE); // repaint window + + break; + + case WM_DEVICECHANGE: + { + // + // This is the actual message from the interface via Windows messaging. + // This code includes some additional decoding for this particular device type + // and some common validation checks. + // + // Note that not all devices utilize these optional parameters in the same + // way. Refer to the extended information for your particular device type + // specified by your GUID. + // + PDEV_BROADCAST_DEVICEINTERFACE b = PDEV_BROADCAST_DEVICEINTERFACE(lParam); + TCHAR strBuff[256]; + + // Output some messages to the window. + switch (wParam) + { + case DBT_DEVICEARRIVAL: if (hidDeviceNotifier.deviceAttached) { hidDeviceNotifier.deviceAttached(); } + break; + + case DBT_DEVICEREMOVECOMPLETE: if (hidDeviceNotifier.deviceDetached) { hidDeviceNotifier.deviceDetached(); } + break; + + case DBT_DEVNODES_CHANGED: + // Do nothing + break; + + default: + // Do nothing + break; + } + OutputMessage(hEditWnd, wParam, LPARAM(strBuff)); + } + break; + case WM_CLOSE: if (!UnregisterDeviceNotification(hDeviceNotify)) { ErrorHandler(TEXT("UnregisterDeviceNotification")); } + DestroyWindow(hWnd); + break; + + case WM_DESTROY: PostQuitMessage(0); + break; + + default: + // Send all other messages on to the default windows handler. + lRet = DefWindowProc(hWnd, message, wParam, lParam); + break; + } + + return lRet; +} + +// +// InitWindowClass +// +BOOL InitWindowClass() +// Routine Description: +// Simple wrapper to initialize and register a window class. + +// Parameters: +// None + +// Return Value: +// TRUE on success, FALSE on failure. + +// Note: +// wndClass.lpfnWndProc and wndClass.lpszClassName are the +// important unique values used with CreateWindowEx and the +// Windows message pump. +{ + WNDCLASSEX wndClass; + + wndClass.cbSize = sizeof(WNDCLASSEX); + wndClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; + wndClass.hInstance = reinterpret_cast(GetModuleHandle(nullptr)); + wndClass.lpfnWndProc = reinterpret_cast(WinProcCallback); + wndClass.cbClsExtra = 0; + wndClass.cbWndExtra = 0; + wndClass.hIcon = LoadIcon(nullptr, IDI_APPLICATION); + wndClass.hbrBackground = CreateSolidBrush(RGB(192, 192, 192)); + wndClass.hCursor = LoadCursor(nullptr, IDC_ARROW); + wndClass.lpszClassName = WND_CLASS_NAME; + wndClass.lpszMenuName = nullptr; + wndClass.hIconSm = wndClass.hIcon; + + + if (!RegisterClassEx(&wndClass)) + { + ErrorHandler(TEXT("RegisterClassEx")); + return FALSE; + } + return TRUE; +} + +// +// main +// +int registerNotification(HidDeviceNotifier* notifier) +{ + hidDeviceNotifier = *notifier; + + if (!InitWindowClass()) + { + // InitWindowClass displays any errors + return -1; + } + + /*HidD_GetHidGuid(&WceusbshGUID);*/ + + // Main app window + + HWND hWnd = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_APPWINDOW, WND_CLASS_NAME, /*g_pszAppName*/hidDeviceNotifier.getAppName(), + WS_OVERLAPPEDWINDOW, // style + CW_USEDEFAULT, 0, 640, 480, nullptr, nullptr, nullptr, nullptr); + + if (hWnd == nullptr) + { + ErrorHandler(TEXT("CreateWindowEx: main appwindow hWnd")); + return -1; + } + + // Actually draw the window. + + /*ShowWindow(hWnd, SW_SHOWNORMAL); + UpdateWindow(hWnd);*/ + + // The message pump loops until the window is destroyed. + + MessagePump(hWnd); + + return 1; +} + +// +// OutputMessage +// +void OutputMessage(const HWND hOutWnd, WPARAM /*wParam*/, const LPARAM lParam) +// Routine Description: +// Support routine. +// Send text to the output window, scrolling if necessary. + +// Parameters: +// hOutWnd - Handle to the output window. +// wParam - Standard windows message code, not used. +// lParam - String message to send to the window. + +// Return Value: +// None + +// Note: +// This routine assumes the output window is an edit control +// with vertical scrolling enabled. + +// This routine has no error checking. +{ + // Make writable and turn off redraw. + SendMessage(hOutWnd, EM_SETREADONLY, FALSE, 0L); + SendMessage(hOutWnd, WM_SETREDRAW, FALSE, 0L); + + // Obtain current text length in the window. + const LONG bufferLen = SendMessage(hOutWnd, WM_GETTEXTLENGTH, 0, 0L); + LONG numLines = SendMessage(hOutWnd, EM_GETLINECOUNT, 0, 0L); + const LONG firstVis = SendMessage(hOutWnd, EM_GETFIRSTVISIBLELINE, 0, 0L); + SendMessage(hOutWnd, EM_SETSEL, bufferLen, bufferLen); + + // Write the new text. + SendMessage(hOutWnd, EM_REPLACESEL, 0, lParam); + + // See whether scrolling is necessary. + if (numLines > (firstVis + 1)) + { + int lineLen = 0; + + // Find the last nonblank line. + numLines--; + while (!lineLen) + { + const int charPos = SendMessage(hOutWnd, EM_LINEINDEX, WPARAM(numLines), 0L); + lineLen = SendMessage(hOutWnd, EM_LINELENGTH, charPos, 0L); + if (!lineLen) { numLines--; } + } + // Prevent negative value finding min. + int lineCount = numLines - firstVis; + lineCount = (lineCount >= 0) ? lineCount : 0; + + // Scroll the window. + SendMessage(hOutWnd, EM_LINESCROLL, 0, LPARAM(lineCount)); + } + + // Done, make read-only and allow redraw. + SendMessage(hOutWnd, WM_SETREDRAW, TRUE, 0L); + SendMessage(hOutWnd, EM_SETREADONLY, TRUE, 0L); +} + +// +// ErrorHandler +// +void ErrorHandler(LPTSTR lpszFunction) +// Routine Description: +// Support routine. +// Retrieve the system error message for the last-error code +// and pop a modal alert box with usable info. + +// Parameters: +// lpszFunction - String containing the function name where +// the error occurred plus any other relevant data you'd +// like to appear in the output. + +// Return Value: +// None + +// Note: +// This routine is independent of the other windowing routines +// in this application and can be used in a regular console +// application without modification. +{ + LPVOID lpMsgBuf; + const DWORD dw = GetLastError(); + + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + nullptr, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), LPTSTR(&lpMsgBuf), 0, nullptr); + + // Display the error message and exit the process. + + LPVOID lpDisplayBuf = LPVOID(LocalAlloc(LMEM_ZEROINIT, (lstrlen(LPCTSTR(lpMsgBuf)) + lstrlen(LPCTSTR(lpszFunction)) + 40) * sizeof(TCHAR))); + StringCchPrintf(LPTSTR(lpDisplayBuf), LocalSize(lpDisplayBuf) / sizeof(TCHAR), TEXT("%s failed with error %d: %s"), lpszFunction, dw, lpMsgBuf); + MessageBox(nullptr, LPCTSTR(lpDisplayBuf), hidDeviceNotifier.getAppName(), MB_OK); + + LocalFree(lpMsgBuf); + LocalFree(lpDisplayBuf); +} + +#endif +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.h new file mode 100644 index 0000000..a13c07e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.h @@ -0,0 +1,21 @@ +/* +* HID driver for OpenViBE +* +* \authors (NeuroServo, NeuroTechX) +* \developer (Innocent Agui) +* \date Wed Nov 23 00:24:00 2016 +* +*/ + +#pragma once + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include "HidDeviceNotifier.h" + +// Register Device Notification method +int registerNotification(HidDeviceNotifier* notifier); + +#endif +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/doc/NeuroServoDriverClass.png b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/doc/NeuroServoDriverClass.png new file mode 100644 index 0000000..c2ca93d Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/doc/NeuroServoDriverClass.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/doc/readme.txt b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/doc/readme.txt new file mode 100644 index 0000000..23e670f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/doc/readme.txt @@ -0,0 +1,24 @@ +HidDevice class description +*************************** + +The class "HidDevice" is an interface developped in C++ for the interaction with HID devices. + +There is a constructor without argument that allow to create an object and instantiate it later, and also a constructor with instantiation values. + +A function setHidDeviceInfos() is used to update the device information: the vendor ID, the product ID, and the number of bytes that the device should expect to receive. When the object is created and its information is defined, the user can then call the connect() function. This function returns "true" when the connection is successful. Communication with the equipment can then begin. + +The function writeToDevice() allow to send data to the connected device. This function takes two arguments, a byte array which contains the data and a number that correspond to the number of byte within the data array. + +Four "callback" methods are available: + +- dataReceived + +- dataConnected + +- deviceAttached + +- deviceDetached + +Users can assign these function pointers to their own functions to execute the code they want. + +The "HidDeviceNotifier" is another class inside "HidDevice" that lets you know the status of the device at any time. It is this class that gives information about whether the device was plugged-in or unplugged after the first connection. diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/ovasCConfigurationNeuroServoHid.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/ovasCConfigurationNeuroServoHid.cpp new file mode 100644 index 0000000..6bc77b9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/ovasCConfigurationNeuroServoHid.cpp @@ -0,0 +1,95 @@ +/* +* NeuroServo driver for OpenViBE +* +* \author (NeuroServo) +* \date Wed Nov 23 00:24:00 2016 +* +*/ + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include "ovasCConfigurationNeuroServoHid.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +// Automatic Shutdown callback +static void AutomaticShutdownCB(GtkToggleButton* button, CConfigurationNeuroServoHid* data) +{ + data->checkRadioAutomaticShutdown(gtk_toggle_button_get_active(button) == 1); +} + +// Shutdown on driver disconnect callback +static void ShutdownOnDriverDisconnectCB(GtkToggleButton* button, CConfigurationNeuroServoHid* data) +{ + data->checkRadioShutdownOnDriverDisconnect(gtk_toggle_button_get_active(button) == 1); +} + +// Device Light Enable callback +static void DeviceLightEnableCB(GtkToggleButton* button, CConfigurationNeuroServoHid* data) +{ + data->checkRadioDeviceLightEnable(gtk_toggle_button_get_active(button) == 1); +} + +// If you added more reference attribute, initialize them here +CConfigurationNeuroServoHid::CConfigurationNeuroServoHid(IDriverContext& ctx, const char* gtkBuilderFilename) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx) {} + +bool CConfigurationNeuroServoHid::preConfigure() +{ + if (! CConfigurationBuilder::preConfigure()) { return false; } + + // callbacks connection + + // Connection of "Automatic Shutdown" toggle button + GtkToggleButton* buttonAutomaticShutdown = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_automatic_shutdown")); + gtk_toggle_button_set_active(buttonAutomaticShutdown, m_automaticShutdown ? true : false); + + g_signal_connect(gtk_builder_get_object(m_builder, "checkbutton_automatic_shutdown"), "toggled", G_CALLBACK(AutomaticShutdownCB), this); + this->checkRadioAutomaticShutdown(m_automaticShutdown); + + // Connection of "Shutdown on driver disconnect" toggle button + GtkToggleButton* buttonShutdownOnDriverDisconnect = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_shutdown_on_driver_disconnect")); + gtk_toggle_button_set_active(buttonShutdownOnDriverDisconnect, m_shutdownOnDriverDisconnect ? true : false); + + g_signal_connect(gtk_builder_get_object(m_builder, "checkbutton_shutdown_on_driver_disconnect"), "toggled", G_CALLBACK(ShutdownOnDriverDisconnectCB), + this); + this->checkRadioShutdownOnDriverDisconnect(m_shutdownOnDriverDisconnect); + + // Connection of "Device Light Enable" toggle button + GtkToggleButton* buttonDeviceLightEnable = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_device_light_enable")); + gtk_toggle_button_set_active(buttonDeviceLightEnable, m_deviceLightEnable ? true : false); + + g_signal_connect(gtk_builder_get_object(m_builder, "checkbutton_device_light_enable"), "toggled", G_CALLBACK(DeviceLightEnableCB), this); + this->checkRadioDeviceLightEnable(m_deviceLightEnable); + + return true; +} + +bool CConfigurationNeuroServoHid::postConfigure() +{ + if (m_applyConfig) + { + // Automatic Shutdown + GtkToggleButton* buttonAutomaticShutdown = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_automatic_shutdown")); + m_automaticShutdown = gtk_toggle_button_get_active(buttonAutomaticShutdown) ? true : false; + + // Shutdown on driver disconnect + GtkToggleButton* buttonShutdownOnDriverDisconnect = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_shutdown_on_driver_disconnect")); + m_shutdownOnDriverDisconnect = gtk_toggle_button_get_active(buttonShutdownOnDriverDisconnect) ? true : false; + + // Device Light Enable + GtkToggleButton* buttonDeviceLightEnable = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_device_light_enable")); + m_deviceLightEnable = gtk_toggle_button_get_active(buttonDeviceLightEnable) ? true : false; + } + + if (! CConfigurationBuilder::postConfigure()) { return false; } + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/ovasCConfigurationNeuroServoHid.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/ovasCConfigurationNeuroServoHid.h new file mode 100644 index 0000000..e29e2a7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/ovasCConfigurationNeuroServoHid.h @@ -0,0 +1,67 @@ +/* +* NeuroServo driver for OpenViBE +* +* \author (NeuroServo) +* \date Wed Nov 23 00:24:00 2016 +* +*/ + +#pragma once + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationNeuroServoHid + * \author (NeuroServo) + * \date Wed Nov 23 00:24:00 2016 + * \brief The CConfigurationNeuroServoHid handles the configuration dialog specific to the NeuroServo device. + * + * TODO: details + * + * \sa CDriverNeuroServoHid + */ +class CConfigurationNeuroServoHid final : public CConfigurationBuilder +{ +public: + + CConfigurationNeuroServoHid(IDriverContext& ctx, const char* gtkBuilderFilename); + + bool preConfigure() override; + bool postConfigure() override; + + // Automatic Shutdown + void checkRadioAutomaticShutdown(const bool state) { m_automaticShutdown = state; } + bool getAutomaticShutdownStatus() { return m_automaticShutdown; } + void setRadioAutomaticShutdown(const bool state) { m_automaticShutdown = state; } + + // Shutdown on driver disconnect + void checkRadioShutdownOnDriverDisconnect(const bool state) { m_shutdownOnDriverDisconnect = state; } + bool getShutdownOnDriverDisconnectStatus() { return m_shutdownOnDriverDisconnect; } + void setRadioShutdownOnDriverDisconnect(const bool state) { m_shutdownOnDriverDisconnect = state; } + + // Device Light Enable + void checkRadioDeviceLightEnable(const bool state) { m_deviceLightEnable = state; } + bool getDeviceLightEnableStatus() { return m_deviceLightEnable; } + void setRadioDeviceLightEnable(const bool state) { m_deviceLightEnable = state; } + +protected: + + IDriverContext& m_driverCtx; + +private: + + bool m_automaticShutdown = false; + bool m_shutdownOnDriverDisconnect = false; + bool m_deviceLightEnable = false; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/ovasCDriverNeuroServoHid.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/ovasCDriverNeuroServoHid.cpp new file mode 100644 index 0000000..399dee7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/ovasCDriverNeuroServoHid.cpp @@ -0,0 +1,452 @@ +/* +* NeuroServo driver for OpenViBE +* +* \author (NeuroServo) +* \date Wed Nov 23 00:24:00 2016 +* +* \note This driver will not compile with VS2010 due to missing HID library. Use VS2013. +* +*/ + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include "ovasCDriverNeuroServoHid.h" +#include "ovasCConfigurationNeuroServoHid.h" + +#include +#include +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +/* + NeuroServo general infos +*/ +#define NEUROSERVO_VID uint16_t(0xC1C4) +#define NEUROSERVO_PID uint16_t(0x8B25) +#define NEUROSERVO_DATA_SIZE uint16_t(65) +#define NEUROSERVO_DRIVER_NAME "NeuroServo" +#define NEUROSERVO_SENDDATA_BLOCK uint32_t(1024) +#define ADC_TO_uVOLTS 0.0118 + +/* +General define +*/ +#define DRIFTSTABILISATION_MAXNBSWITCH 10 +#define DRIFTSTABILISATION_MINNBSWITCH 2 +#define DRIFTSTABILISATION_MULTFACTOR 1.2 + +//___________________________________________________________________// +// // + +CDriverNeuroServoHid::CDriverNeuroServoHid(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_NeuroServoHid", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(2048); + m_header.setChannelCount(1); + m_header.setChannelUnits(0, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); + m_header.setChannelName(0, "FP1-FPz"); + + // Set the Device basic infos + m_vendorId = NEUROSERVO_VID; + m_productId = NEUROSERVO_PID; + m_dataSize = NEUROSERVO_DATA_SIZE; + m_driverName = NEUROSERVO_DRIVER_NAME; + m_isDeviceConnected = false; + + m_settings.add("Header", &m_header); + m_settings.add("Vid", &m_vendorId); + m_settings.add("Pid", &m_productId); + m_settings.add("DataSize", &m_dataSize); + m_settings.add("AutomaticShutdown", &m_automaticShutdown); + m_settings.add("ShutdownOnDrvDisconnect", &m_bShutdownOnDriverDisconnect); + m_settings.add("DeviceLightEnable", &m_bDeviceLightEnable); + + m_settings.load(); +} + +CDriverNeuroServoHid::~CDriverNeuroServoHid() {} + +const char* CDriverNeuroServoHid::getName() { return m_driverName; } + +//___________________________________________________________________// +// // + +bool CDriverNeuroServoHid::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + m_nSamplePerSentBlock = nSamplePerSentBlock; + + // Set the specific infos of the device + m_oHidDevice.setHidDeviceInfos(m_vendorId, m_productId, m_dataSize); + + // Connect to the device + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << m_driverName << ": Connecting to the device.\n"; + if (!m_oHidDevice.connect()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_driverName << ": Connection failed.\n"; + return false; + } + + // Device connection state + m_isDeviceConnected = true; + + // Take into account the configuration of "Automatic Shutdown" and "Device Light Enable" + deviceShutdownAndLightConfiguration(); + + // Bind the callback methods + m_oHidDevice.dataReceived = std::bind(&CDriverNeuroServoHid::processDataReceived, this, std::placeholders::_1); + m_oHidDevice.deviceDetached = std::bind(&CDriverNeuroServoHid::deviceDetached, this); + m_oHidDevice.deviceAttached = std::bind(&CDriverNeuroServoHid::deviceAttached, this); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << m_driverName << ": Connection succeded.\n"; + + m_sendBlockRequiredTime = CTime(m_header.getSamplingFrequency(), (nSamplePerSentBlock)).time(); + m_sendSampleRequiredTime = CTime(m_header.getSamplingFrequency(), 1).time(); + + m_sample = new float[nSamplePerSentBlock]; + if (!m_sample) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not allocate memory for sample array\n"; + delete[] m_sample; + m_sample = nullptr; + return false; + } + m_bDeviceEpochDetected = false; + m_isDeviceInitialized = true; + + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; +} + +bool CDriverNeuroServoHid::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // Ensure that the device is connected + if (!m_isDeviceConnected) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_driverName << ": Device is not connected.\n"; + return false; + } + + m_bQueueOverflow = false; + m_bQueueUnderflow = false; + + // Build the data to be sent to the device + BYTE data[65]; + data[0] = 0x00; // HID Report ID + data[1] = 0x09; // Cmd + data[2] = 0x01; // 0x01 (Reserved) + data[3] = 0x01; // Start acquisition + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << m_driverName << ": Request acquisition to be started.\n"; + + if (!m_oHidDevice.writeToDevice(data, m_dataSize)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_driverName << ": Failed to start acquisittion.\n"; + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << m_driverName << ": Acquisiton started.\n"; + m_sampleIdxForSentBlock = 0; + m_timeStampLastSentBlock = 0; + m_nDriftSample = 0; + m_bDeviceEpochDetected = false; + m_driftAutoCorrectionDelay = 0; + m_nSwitchDrift = 0; + m_fDriftAutoCorrFactor = 1.0; + m_isDriftWasInEarlyDirection = false; + m_sampleValue = 0; + + // Set approximate lattency in regard to hardware implementation. Queue lattency + // should be adjusted but write_available() member is not accessible in current + // boost version. + m_driverCtx.setInnerLatencySampleCount(-1024); + + return true; +} + +bool CDriverNeuroServoHid::loop() +{ + if (!m_isDeviceInitialized || !m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted()) { return true; } + + for (uint32_t i = 0; i < m_nSamplePerSentBlock; ++i) + { + if (!m_pBufferQueue.pop(m_sampleValue) && m_bQueueUnderflow == false && m_nSwitchDrift == DRIFTSTABILISATION_MAXNBSWITCH) + { + // We wait for stabilisation before warn + m_bQueueUnderflow = true; + } + m_sample[i] = (m_sampleValue * float(ADC_TO_uVOLTS)); // N.B. Last sample value is sent if queue was empty + } + + const int64_t currentDriftSampleCount = m_driverCtx.getDriftSampleCount(); + if (currentDriftSampleCount != 0) + { + // Drift in early direction + if (currentDriftSampleCount > m_nDriftSample) + { + if (m_isDriftWasInEarlyDirection == false && m_nSwitchDrift < DRIFTSTABILISATION_MAXNBSWITCH) + { + m_nSwitchDrift++; + m_isDriftWasInEarlyDirection = true; + if (m_nSwitchDrift > DRIFTSTABILISATION_MINNBSWITCH) { m_fDriftAutoCorrFactor = m_fDriftAutoCorrFactor / float(DRIFTSTABILISATION_MULTFACTOR); } + } + m_driftAutoCorrectionDelay = m_driftAutoCorrectionDelay + int64_t(m_fDriftAutoCorrFactor * m_sendSampleRequiredTime); + } + // Drift in late direction + if (currentDriftSampleCount < m_nDriftSample) + { + if (m_isDriftWasInEarlyDirection == true && m_nSwitchDrift < DRIFTSTABILISATION_MAXNBSWITCH) + { + m_nSwitchDrift++; + m_isDriftWasInEarlyDirection = false; + if (m_nSwitchDrift > DRIFTSTABILISATION_MINNBSWITCH) { m_fDriftAutoCorrFactor = m_fDriftAutoCorrFactor / float(DRIFTSTABILISATION_MULTFACTOR); } + } + m_driftAutoCorrectionDelay = m_driftAutoCorrectionDelay - int64_t(m_fDriftAutoCorrFactor * m_sendSampleRequiredTime); + } + } + + const uint64_t elapsedTime = System::Time::zgetTime() - m_timeStampLastSentBlock; + if (m_sendBlockRequiredTime > elapsedTime) + { + // If we're early, sleep before sending. This code regulate the data drift + // @fixme the code should not rely on zsleep() as its time precision can not be guaranteed; it can oversleep esp. on Windows + boost 1.58 + const uint64_t sleepTime = m_sendBlockRequiredTime - elapsedTime; + System::Time::zsleep(uint64_t(sleepTime + m_driftAutoCorrectionDelay)); + } + + m_timeStampLastSentBlock = System::Time::zgetTime(); + m_callback->setSamples(m_sample); + const int64_t autoCorrection = m_driverCtx.getSuggestedDriftCorrectionSampleCount(); + m_driverCtx.correctDriftSampleCount(autoCorrection); + m_callback->setStimulationSet(m_stimSet); + m_stimSet.clear(); + + // We will apply driver time auto correction on next loop + m_nDriftSample = currentDriftSampleCount; + + if (m_bQueueUnderflow) + { + m_bQueueUnderflow = false; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << m_driverName << ": Sample block has been skipped by driver!! Driver queue was empty\n"; + } + return true; +} + +bool CDriverNeuroServoHid::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + // Ensure that the device is connected + if (!m_isDeviceConnected) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_driverName << ": Device is not connected.\n"; + return false; + } + + // Build the data to be sent to the device + BYTE data[65]; + data[0] = 0x00; // HID Report ID + data[1] = 0x09; // Cmd + data[2] = 0x01; // 0x01 (Reserved) + data[3] = 0x00; // Stop acquisition + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << m_driverName << ": Request acquisition to be stopped.\n"; + + if (!m_oHidDevice.writeToDevice(data, m_dataSize)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_driverName << ": Failed to stop acquisittion.\n"; + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << m_driverName << ": Acquisiton stopped.\n"; + + return true; +} + +bool CDriverNeuroServoHid::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_isDeviceInitialized && m_isDeviceConnected) + { + if (m_bShutdownOnDriverDisconnect) + { + BYTE data[65]; + data[0] = 0x00; // HID Report ID + data[1] = 0x16; // Cmd + data[2] = 0x01; // 0x01 (Reserved) + data[3] = 0x01; // Shutdown the device + m_oHidDevice.writeToDevice(data, m_dataSize); + } + else + { + // Set device to normal user mode + + BYTE data[65]; + data[0] = 0x00; // HID Report ID + data[1] = 0x17; // Cmd + data[2] = 0x01; // 0x01 (Reserved) + data[3] = 0x01; // ask the device to switch off automatically + m_oHidDevice.writeToDevice(data, m_dataSize); + + data[0] = 0x00; // HID Report ID + data[1] = 0x18; // Cmd + data[2] = 0x01; // 0x01 (Reserved) + data[3] = 0x01; // Enable the device light + m_oHidDevice.writeToDevice(data, m_dataSize); + } + } + m_isDeviceConnected = false; + m_isDeviceInitialized = false; + delete[] m_sample; + m_sample = nullptr; + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverNeuroServoHid::configure() +{ + CConfigurationNeuroServoHid config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-NeuroServoHid.ui"); + + // Set the current state of the "Automatic Shutdown" "Shutdown on driver disconnect" and "Device Light Enable" + config.setRadioAutomaticShutdown(m_automaticShutdown); + config.setRadioShutdownOnDriverDisconnect(m_bShutdownOnDriverDisconnect); + config.setRadioDeviceLightEnable(m_bDeviceLightEnable); + + if (!config.configure(m_header)) { return false; } + + // Get the configuration from the ui + m_automaticShutdown = config.getAutomaticShutdownStatus(); + m_bShutdownOnDriverDisconnect = config.getShutdownOnDriverDisconnectStatus(); + m_bDeviceLightEnable = config.getDeviceLightEnableStatus(); + + // Save the settings + m_settings.save(); + + return true; +} + +//___________________________________________________________________// +// // +// NEUROSERVO SPECIFIC METHODS IMPLEMENTATION + +void CDriverNeuroServoHid::processDataReceived(const BYTE data[]) +{ + // Ensure the acquisition has started + if (m_driverCtx.isStarted() && m_isDeviceInitialized) + { + if (data[1] == 0x03) + { + const uint32_t nElement = (data[3] + (data[4] << 8)); + const uint32_t index = (data[5] + (data[6] << 8)); + + if (index == 0) + { + // Queue lattency should be considered but write_available() member + // is not accessible in current boost version. + /* + size_t NbItemInQueue = 1024 - m_pBufferQueue.write_available(); + if (uint32_t(NbItemInQueue) != m_nBufferQueue) + { + m_driverCtx.setInnerLatencySampleCount(int64_t(m_nBufferQueue - uint32_t(NbItemInQueue))); + m_nBufferQueue = uint32_t(NbItemInQueue); + } + */ + m_nSamplesReceived = 0; + m_bDeviceEpochDetected = true; + } + if (m_bDeviceEpochDetected == true) + { + // Loop and process the data + for (int i = (7); i < m_dataSize - 1; i = i + 2) + { + if (m_nSamplesReceived < nElement) + { + float pValue = float(float(data[i]) + float((data[i + 1]) << 8)); + // Remove comp2 + if (pValue > 32767) { pValue = pValue - 65536; } + if (!m_pBufferQueue.push(pValue)) { m_bQueueOverflow = true; } + m_sampleIdxForSentBlock++; + + // If full epoch is received + if (m_sampleIdxForSentBlock == 1024) + { + m_bDeviceEpochDetected = false; + m_sampleIdxForSentBlock = 0; + if (m_bQueueOverflow && m_nSwitchDrift == DRIFTSTABILISATION_MAXNBSWITCH) // We wait for stabilisation before warn + { + m_bQueueOverflow = false; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << m_driverName << + ": Sample block has been skipped by driver!! Driver queue was full\n"; + } + } + m_nSamplesReceived++; + } + } + } + } + } +} + +void CDriverNeuroServoHid::deviceDetached() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << m_driverName << ": Device detached.\n"; + m_isDeviceConnected = false; + m_isDeviceInitialized = false; +} + +void CDriverNeuroServoHid::deviceAttached() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << m_driverName << ": Device attached.\n"; + m_isDeviceConnected = true; +} + +void CDriverNeuroServoHid::deviceShutdownAndLightConfiguration() +{ + BYTE data[65]; + data[0] = 0x00; // HID Report ID + data[2] = 0x01; // 0x01 (Reserved) + + data[1] = 0x17; // Cmd + if (m_automaticShutdown) + { + data[3] = 0x01; // ask the device to switch off automatically + m_oHidDevice.writeToDevice(data, m_dataSize); + } + else + { + data[3] = 0x00; // ask the device not to switch off automatically + m_oHidDevice.writeToDevice(data, m_dataSize); + } + + data[1] = 0x18; // Cmd + if (m_bDeviceLightEnable) + { + data[3] = 0x01; // Enable the device light + m_oHidDevice.writeToDevice(data, m_dataSize); + } + else + { + data[3] = 0x00; // Disable the device light + m_oHidDevice.writeToDevice(data, m_dataSize); + } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/ovasCDriverNeuroServoHid.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/ovasCDriverNeuroServoHid.h new file mode 100644 index 0000000..2d6829e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neuroservo/ovasCDriverNeuroServoHid.h @@ -0,0 +1,122 @@ +/* +* NeuroServo driver for OpenViBE +* +* \author (NeuroServo) +* \date Wed Nov 23 00:24:00 2016 +* +*/ + +#pragma once + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +// Provicde necessary methods to allow connection with HID device +#include "HidDeviceApi/HidDevice.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverNeuroServoHid + * \author (NeuroServo) + * \date Wed Nov 23 00:24:00 2016 + * \brief The CDriverNeuroServoHid allows the acquisition server to acquire data from a NeuroServo device. + * + * \sa CConfigurationNeuroServoHid + */ +class CDriverNeuroServoHid final : public IDriver +{ +public: + + explicit CDriverNeuroServoHid(IDriverContext& ctx); + ~CDriverNeuroServoHid() override; + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + + /* Methods implemented for the specific needs of NeuroServo. + Execute the callback from the HID device services + */ + void processDataReceived(const BYTE data[]); + void deviceDetached(); + void deviceAttached(); + +private: + // Control "Automatic Shutdown" and "Device Light Enable" based on user configuration + void deviceShutdownAndLightConfiguration(); + + +protected: + + SettingsHelper m_settings; + IDriverCallback* m_callback = nullptr; + CHeader m_header; + float* m_sample = nullptr; + CStimulationSet m_stimSet; + +private: + // Create a buffer queue for 1 sec data + boost::lockfree::spsc_queue> m_pBufferQueue; + + // Device related infos + HidDevice m_oHidDevice; + uint16_t m_productId = 0; + uint16_t m_vendorId = 0; + uint16_t m_dataSize = 0; + CString m_driverName; + + // Data processing related infos + uint32_t m_nSamplePerSentBlock = 0; + uint32_t m_sampleIdxForSentBlock = 0; + uint32_t m_nSamplesReceived = 0; + + uint64_t m_timeStampLastSentBlock = 0; + uint64_t m_sendBlockRequiredTime = 0; + uint64_t m_sendSampleRequiredTime = 0; + uint64_t m_nSwitchDrift = 0; + + int64_t m_nDriftSample = 0; + int64_t m_driftAutoCorrectionDelay = 0; + + float m_sampleValue = 0; + float m_fDriftAutoCorrFactor = 0; + + bool m_isDriftWasInEarlyDirection = false; + bool m_bQueueOverflow = false; + bool m_bQueueUnderflow = false; + bool m_bDeviceEpochDetected = false; + + // Configuration + bool m_automaticShutdown = false; + bool m_bShutdownOnDriverDisconnect = true; + bool m_bDeviceLightEnable = false; + bool m_isDeviceInitialized = false; + + // Device connection state + bool m_isDeviceConnected = false; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.cpp new file mode 100644 index 0000000..a1b33ff --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.cpp @@ -0,0 +1,152 @@ +#if defined TARGET_HAS_ThirdPartyThinkGearAPI + +#include "ovasCConfigurationNeuroskyMindset.h" +#include +#include + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +//------------------------------------------------------------------------------------------ +// NOTE : The signal checker is implemented but the device does not seem to handle +// a lot of connection/reconnection and this functionnality may cause +// the bluetooth connection to crash when configuring, checking, +// then reconnecting, and reading data. The signal check button in the +// configuration window is not visible, but the checking is always performed online. +//------------------------------------------------------------------------------------------ +//_________________________________________________ + +CConfigurationNeuroskyMindset::CConfigurationNeuroskyMindset(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& comPort, bool& eSenseChannels, + bool& bandPowerChannels, bool& blinkStimulations, bool& blinkStrengthChannel) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx), m_rComPort(comPort), m_eSenseChannels(eSenseChannels), + m_bandPowerChannels(bandPowerChannels), m_blinkStimulations(blinkStimulations), m_blinkStrengthChannel(blinkStrengthChannel) { } + +bool CConfigurationNeuroskyMindset::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + //::GtkWidget * windowCheckSignalQuality=GTK_WIDGET(gtk_builder_get_object(m_builder, "dialog_check_signal_quality")); + + /* + g_signal_connect(gtk_builder_get_object(m_builder, "button_check_signal_quality"),"pressed",G_CALLBACK(button_check_signal_quality_cb), this); + g_signal_connect(gtk_builder_get_object(m_builder, "button_refresh"),"pressed",G_CALLBACK(button_refresh_cb), this); + //hide on close + g_signal_connect (G_OBJECT(windowCheckSignalQuality), "delete_event", G_CALLBACK(gtk_widget_hide), nullptr); + */ + + char buffer[1024]; + int count = 0; + bool selected = false; + + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_com_port")); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "ThinkGear DLL version: " << int(TG_GetVersion()) << "\n"; + + // try the com ports. @NOTE almost duplicate code in CDriverNeuroskyMindset + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Scanning COM ports 1 to 16...\n"; + for (uint32_t i = 1; i < 16; ++i) + { + /* Get a new connection ID handle to ThinkGear API */ + const int connectionId = TG_GetNewConnectionId(); + if (connectionId < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "The driver was unable to connect to the ThinkGear Communication Driver.\n"; + return false; + } + // m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "ThinkGear Connection ID is: "<< connectionId <<".\n"; + + /* Attempt to connect the connection ID handle to serial port */ + std::stringstream comPortName; + comPortName << "\\\\.\\COM" << i; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Trying port [" << comPortName.str() << "]\n"; + int code = TG_Connect(connectionId, comPortName.str().c_str(), TG_BAUD_9600, TG_STREAM_PACKETS); + if (code >= 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Connection available on port [" << comPortName.str() << "]"; + + const uint32_t startTime = System::Time::getTime(); + const uint32_t timeToTry = 3000; // ms + + // With e.g. MindWave Mobile, errors do not mean that the operation couldn't succeed in the future, so we ask for a packet optimistically for a while. + bool comPortFound = false; + while (!comPortFound && (System::Time::getTime() - startTime) < timeToTry) + { + //we try to read one packet to check the connection. + code = TG_ReadPackets(connectionId, 1); + if (code >= 0) + { + m_driverCtx.getLogManager() << " - Status: OK\n"; + sprintf(buffer, "COM%i", i); + gtk_combo_box_append_text(comboBox, buffer); + if (m_rComPort == i) + { + gtk_combo_box_set_active(comboBox, count); + selected = true; + } + count++; + comPortFound = true; + } + else { System::Time::sleep(1); } + } + if (!comPortFound) + { + m_driverCtx.getLogManager() << " - Tried for " << timeToTry / 1000 << " seconds, gave up.\n"; + if (code == -1) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Last TG_ReadPackets error: -1, Invalid connection ID\n"; } + else if (code == -2) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Last TG_ReadPackets error: -2, 0 bytes on the stream\n"; } + else if (code == -3) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Last TG_ReadPackets error: -3, I/O error occurred\n"; } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Last TG_ReadPackets error: " << code << ", Unknown\n"; } + } + } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "TG_Connect() returned error " << code << "\n"; } + // free the connection to ThinkGear API + // We use FreeConnection() only as doing a TG_Disconnect()+TG_FreeConnection() pair can cause first-chance exceptions on visual studio & MindWave Mobile for some reason. + TG_FreeConnection(connectionId); + } + + if (count == 0) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "The driver was unable to find any valid device on serial port COM1 to COM16.\n"; } + + if (!selected) { gtk_combo_box_set_active(comboBox, 0); } + + GtkToggleButton* toggleESense = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "check_esense")); + GtkToggleButton* togglePower = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "check_power")); + GtkToggleButton* toggleBlink = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "check_blink")); + GtkToggleButton* toggleBlinkStrength = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "check_blink_strenght")); + + gtk_toggle_button_set_active(toggleESense, m_eSenseChannels); + gtk_toggle_button_set_active(togglePower, m_bandPowerChannels); + gtk_toggle_button_set_active(toggleBlink, m_blinkStimulations); + gtk_toggle_button_set_active(toggleBlinkStrength, m_blinkStrengthChannel); + + return (count > 0); +} + +bool CConfigurationNeuroskyMindset::postConfigure() +{ + if (m_applyConfig) + { + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_com_port")); + + int comPort = 0; + const char* usbIdx = gtk_combo_box_get_active_text(comboBox); + if (usbIdx) { if (sscanf(usbIdx, "COM%i", &comPort) == 1) { m_rComPort = uint32_t(comPort); } } + + GtkToggleButton* toggleESense = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "check_esense")); + GtkToggleButton* togglePower = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "check_power")); + GtkToggleButton* toggleBlink = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "check_blink")); + GtkToggleButton* toggleBlinkStrength = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "check_blink_strenght")); + + m_eSenseChannels = (gtk_toggle_button_get_active(toggleESense) != 0); // assign to bool while avoiding C4800 warning on MSVC + m_bandPowerChannels = (gtk_toggle_button_get_active(togglePower) != 0); + m_blinkStimulations = (gtk_toggle_button_get_active(toggleBlink) != 0); + m_blinkStrengthChannel = (gtk_toggle_button_get_active(toggleBlinkStrength) != 0); + } + + if (! CConfigurationBuilder::postConfigure()) { return false; } // normal header is filled, ressources are realesed + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyThinkGearAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.h new file mode 100644 index 0000000..2741429 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.h @@ -0,0 +1,61 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyThinkGearAPI + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +#include + +#define OVAS_MINDSET_INVALID_COM_PORT 0xffff + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationNeuroskyMindset + * \author Laurent Bonnet (INRIA) + * \date 05 may 2010 + * \erief The CConfigurationNeuroskyMindset handles the configuration dialog specific to the MindSet device. + * + * User can configure ... (TODO). + * + * \sa CDriverNeuroskyMindset + */ +class CConfigurationNeuroskyMindset final : public CConfigurationBuilder +{ +public: + + CConfigurationNeuroskyMindset(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& comPort, bool& eSenseChannels, bool& bandPowerChannels, + bool& blinkStimulations, bool& blinkStrengthChannel); + + bool preConfigure() override; + bool postConfigure() override; + + //virtual void buttonCheckSignalQualityCB(); + //virtual void buttonRefreshCB(); + +protected: + + IDriverContext& m_driverCtx; + int m_nDevice = 0; + + // the parameters passed to the driver : + uint32_t& m_rComPort; + bool& m_eSenseChannels; + bool& m_bandPowerChannels; + bool& m_blinkStimulations; + bool& m_blinkStrengthChannel; + + //widgets + GtkWidget* m_comPortSpinButton = nullptr; + + bool m_checkSignalQuality = false; + +private: + + uint32_t m_currentConnectionId = uint32_t(-1); +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyThinkGearAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCDriverNeuroskyMindset.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCDriverNeuroskyMindset.cpp new file mode 100644 index 0000000..4157f61 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCDriverNeuroskyMindset.cpp @@ -0,0 +1,445 @@ +#if defined TARGET_HAS_ThirdPartyThinkGearAPI + +#include "ovasCDriverNeuroskyMindset.h" +#include "ovasCConfigurationNeuroskyMindset.h" + +#include +#include + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverNeuroskyMindset::CDriverNeuroskyMindset(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_NeuroSkyMindSet", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(512); // raw signal sampling frequency, from the official documentation. + // CHANNEL COUNT + m_header.setChannelCount(1); // one channel on the forhead + m_header.setChannelName(0, "Electrode"); + + m_connectionID = -1; + + m_comPort = OVAS_MINDSET_INVALID_COM_PORT; + + m_eSenseChannels = false; + m_bandPowerChannels = false; + m_blinkStimulations = false; + m_blinkStrengthChannel = false; + + m_settings.add("Header", &m_header); + m_settings.add("ComPort", &m_comPort); + m_settings.add("ESenseChannels", &m_eSenseChannels); + m_settings.add("BandPowerChannels", &m_bandPowerChannels); + m_settings.add("Stimulations", &m_blinkStimulations); + m_settings.add("StrengthChannel", &m_blinkStrengthChannel); + m_settings.load(); + +#if !defined(TG_DATA_BLINK_STRENGTH) + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Mindset Driver: This version does not have eyeblink detection support\n"; + m_blinkStimulations = false; + m_blinkStrengthChannel = false; +#endif +} + +//___________________________________________________________________// +// // + +bool CDriverNeuroskyMindset::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Mindset Driver: INIT called.\n"; + if (m_driverCtx.isConnected()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Mindset Driver: Driver already initialized.\n"; + return false; + } + + /* + 11 channels + ----- + eSense values: + TG_DATA_ATTENTION + TG_DATA_MEDITATION + + Raw EEG data: + TG_DATA_RAW (512 Hz sampling frequency) + + Power in defined frequency bands: + TG_DATA_DELTA (0.5 - 2.75 Hz) + TG_DATA_THETA (3.5 - 6.75 Hz) + TG_DATA_ALPHA1 (7.5 - 9.25 Hz) + TG_DATA_ALPHA2 (10 - 11.75 Hz) + TG_DATA_BETA1 (13 - 16.75 Hz) + TG_DATA_BETA2 (18 - 29.75 Hz) + TG_DATA_GAMMA1 (31 - 39.75 Hz) + TG_DATA_GAMMA2 (41 - 49.75 Hz) + + Since MindSet Development Kit 2.1: + TG_DATA_BLINK_STRENGTH (1-255) + */ + + // the tokens allow user to use all data coming from headset. + // Raw EEG is sampled at 512Hz, other data are sampled around 1Hz + // so the driver sends these data at 512 Hz, changing value every seconds (we obtain a square signal) + // The Blink Strength can be viewed as spike signal, sampled at 512 Hz. + // The Blinks can be viewed as an OpenViBE stimulation OVTK_GDF_Eye_Blink + + m_header.setChannelCount(1); // one channel on the forhead + m_header.setChannelName(0, "Electrode"); + + if (m_eSenseChannels) { m_header.setChannelCount(m_header.getChannelCount() + 2); } + if (m_bandPowerChannels) { m_header.setChannelCount(m_header.getChannelCount() + 8); } + if (m_blinkStrengthChannel) { m_header.setChannelCount(m_header.getChannelCount() + 1); } + + // NAMES + uint32_t idx = 1; + + if (m_eSenseChannels) + { + m_header.setChannelName(idx++, "Attention"); + m_header.setChannelName(idx++, "Meditation"); + } + if (m_bandPowerChannels) + { + m_header.setChannelName(idx++, "Delta"); + m_header.setChannelName(idx++, "Theta"); + m_header.setChannelName(idx++, "Low Alpha"); + m_header.setChannelName(idx++, "High Alpha"); + m_header.setChannelName(idx++, "Low Beta"); + m_header.setChannelName(idx++, "High Beta"); + m_header.setChannelName(idx++, "Low Gamma"); + m_header.setChannelName(idx++, "Mid Gamma"); + } + // spikes for blink strength + if (m_blinkStrengthChannel) { m_header.setChannelName(idx++, "Blink Strength"); } + + if (!m_header.isChannelCountSet() + || !m_header.isSamplingFrequencySet()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Mindset Driver: Channel count or frequency not set.\n"; + return false; + } + + // Builds up a buffer to store acquired samples. This buffer will be sent to the acquisition server later. + m_sample = new float[m_header.getChannelCount() * nSamplePerSentBlock]; + if (!m_sample) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Mindset Driver: Samples allocation failed.\n"; + return false; + } + + + /* Print driver version number */ + const int dllVersion = TG_GetVersion(); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "ThinkGear DLL version: " << dllVersion << "\n"; + if (dllVersion > 7) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Eye blink detection is possible. \n"; } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Eye blink detection NOT possible. Please use MindSet Dev. Tools v2.1 or sup. \n"; } + + // if no com port was selected with the property dialog window + if (m_comPort == OVAS_MINDSET_INVALID_COM_PORT) + { + // try the com ports. @NOTE almost duplicate code in CConfigurationMindSet + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Scanning COM ports 1 to 16...\n"; + for (uint32_t i = 1; i < 16 && m_comPort == OVAS_MINDSET_INVALID_COM_PORT; ++i) + { + /* Get a new connection ID handle to ThinkGear API */ + int connectionId = TG_GetNewConnectionId(); + if (connectionId < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "The driver was unable to connect to the ThinkGear Communication Driver.\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "ThinkGear Connection ID is: " << connectionId << ".\n"; + + /* Attempt to connect the connection ID handle to serial port */ + std::stringstream ss; + ss << "\\\\.\\COM" << i; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Trying port [" << ss.str() << "]\n"; + int errCode = TG_Connect(connectionId, ss.str().c_str(), TG_BAUD_9600, TG_STREAM_PACKETS); + if (errCode >= 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Connection available on port " << ss.str(); + + const uint32_t startTime = System::Time::getTime(); + const uint32_t timeToTry = 3000; // ms + + // With e.g. MindWave Mobile, errors do not mean that the operation couldn't succeed in the future, so we ask for a packet optimistically for a while. + bool comPortFound = false; + while (!comPortFound && (System::Time::getTime() - startTime) < timeToTry) + { + //we try to read one packet to check the connection. + errCode = TG_ReadPackets(connectionId, 1); + if (errCode >= 0) + { + m_driverCtx.getLogManager() << " - Status: OK\n"; + m_comPort = i; + comPortFound = true; + } + else { System::Time::sleep(1); } + } + if (!comPortFound) + { + m_driverCtx.getLogManager() << " - Tried for " << timeToTry / 1000 << " seconds, gave up.\n"; + if (errCode == -1) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Last TG_ReadPackets error: -1, Invalid connection ID\n"; } + else if (errCode == -2) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Last TG_ReadPackets error: -2, 0 bytes on the stream\n"; } + else if (errCode == -3) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Last TG_ReadPackets error: -3, I/O error occurred\n"; } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Last TG_ReadPackets error: " << errCode << ", Unknown\n"; } + } + } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "TG_Connect() returned error " << errCode << "\n"; } + // free the connection to ThinkGear API + // We use FreeConnection() only as doing a TG_Disconnect()+TG_FreeConnection() pair can cause first-chance exceptions on visual studio & MindWave Mobile for some reason. + TG_FreeConnection(connectionId); + } + } + + if (m_comPort == OVAS_MINDSET_INVALID_COM_PORT) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "The driver was unable to find any valid device on serial port COM1 to COM16.\n"; + return false; + } + + //__________________________________ + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; +} + +bool CDriverNeuroskyMindset::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Mindset Driver: START called.\n"; + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_comPort == OVAS_MINDSET_INVALID_COM_PORT) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "No valid Serial COM port detected.\n"; + return false; + } + + /* Get a connection ID handle to ThinkGear */ + m_connectionID = TG_GetNewConnectionId(); + if (m_connectionID < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Can't connect to ThinkGear Communication Driver (error code " << m_connectionID << ").\n"; + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "ThinkGear Communication ID is: " << m_connectionID << ".\n"; + + /* Attempt to connect the connection ID handle to serial port */ + const std::string tmp = "\\\\.\\COM" + std::to_string(m_comPort); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Trying to connect ThinkGear driver to Serial Port [" << tmp << "]\n"; + const int errCode = TG_Connect(m_connectionID, tmp.c_str(), TG_BAUD_9600, TG_STREAM_PACKETS); + if (errCode < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "The ThinkGear driver was unable to connect to serial port [" << tmp << "] (error code " + << errCode << ").\n"; + return false; + } + +#if defined(TG_DATA_BLINK_STRENGTH) + if(m_blinkStimulations || m_blinkStrengthChannel) { TG_EnableBlinkDetection(m_connectionID, 1); } +#endif + + return true; +} + +bool CDriverNeuroskyMindset::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + + if (m_driverCtx.isStarted()) + { + uint32_t receivedSamples = 0; + uint32_t errorCount = 0; + + CStimulationSet stimSet; + + while (receivedSamples < m_nSamplePerSentBlock) + { + /* Attempt to read 1 Packet of data from the connection (numPackets = -1 means all packets) */ + const int errorCode = TG_ReadPackets(m_connectionID, 1); + + if (errorCode == 1)// we asked for 1 packet and received 1 + { + // Got a packet, reset the error count + errorCount = 0; + + /* If raw value has been updated by TG_ReadPackets()... */ + if (TG_GetValueStatus(m_connectionID, TG_DATA_RAW) != 0) + { + float value = float(TG_GetValue(m_connectionID, TG_DATA_RAW)); + m_sample[receivedSamples] = value; + receivedSamples++; + } + + //checking the signal quality + //if it has been updated... + if (TG_GetValueStatus(m_connectionID, TG_DATA_POOR_SIGNAL) != 0) + { + const float quality = float(TG_GetValue(m_connectionID, TG_DATA_POOR_SIGNAL)); + + // Special warning for value 200 (no contact with electrode) + // Noise warning after 25% contamination. + if (quality == 200) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(" << ++m_nWarning + << ") Poor Signal detected (electrode not in contact with the forehead)\n"; + } + else if (quality > 25) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(" << ++m_nWarning << ") Poor Signal detected (noise at " + << (1 - (quality / 200.0F)) * 100 << "%)\n"; + } + else + { + if (m_nWarning != 0) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Signal Quality acceptable - noise < 12.5%\n"; } + m_nWarning = 0; + } + } + + float value; + uint32_t idx = m_nSamplePerSentBlock + receivedSamples - 1; + if (m_eSenseChannels) + { + // we don't check if the value has changed, we construct a square signal (1Hz --> 512Hz) + + value = float(TG_GetValue(m_connectionID, TG_DATA_ATTENTION)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + + value = float(TG_GetValue(m_connectionID, TG_DATA_MEDITATION)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + } + if (m_bandPowerChannels) + { + value = float(TG_GetValue(m_connectionID, TG_DATA_DELTA)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + + value = float(TG_GetValue(m_connectionID, TG_DATA_THETA)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + + value = float(TG_GetValue(m_connectionID, TG_DATA_ALPHA1)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + + value = float(TG_GetValue(m_connectionID, TG_DATA_ALPHA2)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + + value = float(TG_GetValue(m_connectionID, TG_DATA_BETA1)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + + value = float(TG_GetValue(m_connectionID, TG_DATA_BETA2)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + + value = float(TG_GetValue(m_connectionID, TG_DATA_GAMMA1)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + + value = float(TG_GetValue(m_connectionID, TG_DATA_GAMMA2)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; // keep this line for the if def next + } + +#if defined(TG_DATA_BLINK_STRENGTH) + bool blinkDetected = false; + // We construct a "blink" spike signal if requested. + if(m_blinkStrengthChannel) + { + if(TG_GetValueStatus(m_connectionID,TG_DATA_BLINK_STRENGTH) != 0) + { + value = float(TG_GetValue(m_connectionID, TG_DATA_BLINK_STRENGTH)); + blinkDetected = true; + } + else { value = 0; } + m_sample[idx] = value; + } + // We send a "blink" stimulation if requested. + if(m_blinkStimulations) + { + if(TG_GetValueStatus(m_connectionID,TG_DATA_BLINK_STRENGTH) != 0 || blinkDetected) + { + uint64_t time = CTime(m_header.getSamplingFrequency(),receivedSamples); + stimSet.appendStimulation(OVTK_GDF_Eye_Blink, time,0); + } + } +#endif + } + else + { + // Received something else than 1 packet. This is not necessarily an unrecoverable error. Try for a while. + // @note this is using counting to avoid polling the clock constantly + errorCount++; + + const uint32_t errorSleep = 2; // In ms + const uint32_t errorTolerance = 1000; // As each error sleeps 2 ms, 1000*2 = 2000ms + if (errorCount > errorTolerance) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "No valid packet from ThinkGear for a while, returning prematurely.\n"; + return true; // Let the acquisition server decide what to do, don't return a failure. It'll timeout after a bit. + } + + System::Time::sleep(errorSleep); + } + } + + m_callback->setSamples(m_sample); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + m_callback->setStimulationSet(stimSet); + } + + return true; +} + +bool CDriverNeuroskyMindset::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Mindset Driver: STOP called.\n"; + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + if (m_connectionID >= 0) + { + // We use FreeConnection() only as doing a TG_Disconnect()+TG_FreeConnection() pair can cause first-chance exceptions on visual studio & MindWave Mobile for some reason. + TG_FreeConnection(m_connectionID); + m_connectionID = -1; + } + + return true; +} + +bool CDriverNeuroskyMindset::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + if (m_sample) + { + delete [] m_sample; + m_sample = nullptr; + } + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverNeuroskyMindset::configure() +{ + CConfigurationNeuroskyMindset config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-Neurosky-Mindset.ui" + , m_comPort, m_eSenseChannels, m_bandPowerChannels, m_blinkStimulations, m_blinkStrengthChannel); + + if (!config.configure(m_header)) { return false; } // the basic configure will use the basic header + m_settings.save(); + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyThinkGearAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCDriverNeuroskyMindset.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCDriverNeuroskyMindset.h new file mode 100644 index 0000000..432b189 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCDriverNeuroskyMindset.h @@ -0,0 +1,66 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyThinkGearAPI + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverNeuroskyMindset + * \author Laurent Bonnet (INRIA) + * \date 03 may 2010 + * \erief The CDriverNeuroskyMindset allows the acquisition server to acquire data from a MindSet device (Neurosky)). + * + * The driver opens a connection to the device through a dedicated API called ThinkGear, part of the MindSet Development Tools (MDT). + * The MDT are available for free on the official Neurosky website (http://store.neurosky.com/products/mindset-development-tools). + * + */ +class CDriverNeuroskyMindset final : public IDriver +{ +public: + + explicit CDriverNeuroskyMindset(IDriverContext& ctx); + ~CDriverNeuroskyMindset() override { } + const char* getName() override { return "NeuroSky MindSet (MindSet Dev. Tools 3.2)"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + SettingsHelper m_settings; + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + uint32_t m_nTotalSample = 0; + float* m_sample = nullptr; + +private: + + int m_connectionID = 0; + uint32_t m_comPort = 0; + bool m_eSenseChannels = false; + bool m_bandPowerChannels = false; + bool m_blinkStimulations = false; + bool m_blinkStrengthChannel = false; + + uint32_t m_nWarning = -1; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyThinkGearAPI diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.cpp new file mode 100644 index 0000000..f91277e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.cpp @@ -0,0 +1,98 @@ +#include "ovasCConfigurationDriverSimulatedDeviator.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +CConfigurationDriverSimulatedDeviator::CConfigurationDriverSimulatedDeviator(IDriverContext& ctx, const char* gtkBuilderFilename, bool& sendPeriodicStims, + double& offset, double& spread, double& maxDev, double& pullback, double& update, + uint64_t& wavetype, double& freezeFrequency, double& freezeDuration) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx), m_sendPeriodicStimulations(sendPeriodicStims), m_Offset(offset), m_Spread(spread), + m_MaxDev(maxDev), m_Pullback(pullback), m_Update(update), m_Wavetype(wavetype), m_FreezeFrequency(freezeFrequency), m_FreezeDuration(freezeDuration) {} + +bool CConfigurationDriverSimulatedDeviator::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + GtkToggleButton* sendPeriodicStims = GTK_TOGGLE_BUTTON( + gtk_builder_get_object(m_builder, "checkbutton_send_periodic_stimulations")); + + gtk_toggle_button_set_active(sendPeriodicStims, m_sendPeriodicStimulations); + + GtkSpinButton* tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_offset")); + gtk_spin_button_set_digits(tmp, 2); + gtk_spin_button_set_value(tmp, m_Offset); + + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_spread")); + gtk_spin_button_set_digits(tmp, 3); + gtk_spin_button_set_value(tmp, m_Spread); + + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_maxdev")); + gtk_spin_button_set_digits(tmp, 3); + gtk_spin_button_set_value(tmp, m_MaxDev); + + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_pullback")); + gtk_spin_button_set_digits(tmp, 3); + gtk_spin_button_set_value(tmp, m_Pullback); + + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_update")); + gtk_spin_button_set_digits(tmp, 3); + gtk_spin_button_set_value(tmp, m_Update); + + GtkComboBox* wavetype = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_wavetype")); + gtk_combo_box_set_active(wavetype, gint(m_Wavetype)); + + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_freeze_frequency")); + gtk_spin_button_set_digits(tmp, 3); + gtk_spin_button_set_value(tmp, m_FreezeFrequency); + + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_freeze_duration")); + gtk_spin_button_set_digits(tmp, 3); + gtk_spin_button_set_value(tmp, m_FreezeDuration); + + return true; +} + +bool CConfigurationDriverSimulatedDeviator::postConfigure() +{ + if (m_applyConfig) + { + GtkToggleButton* sendPeriodicStims = GTK_TOGGLE_BUTTON( + gtk_builder_get_object(m_builder, "checkbutton_send_periodic_stimulations")); + + m_sendPeriodicStimulations = (gtk_toggle_button_get_active(sendPeriodicStims) > 0); + + GtkSpinButton* tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_offset")); + gtk_spin_button_update(tmp); + m_Offset = gtk_spin_button_get_value(tmp); + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_spread")); + gtk_spin_button_update(tmp); + m_Spread = gtk_spin_button_get_value(tmp); + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_maxdev")); + gtk_spin_button_update(tmp); + m_MaxDev = gtk_spin_button_get_value(tmp); + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_pullback")); + gtk_spin_button_update(tmp); + m_Pullback = gtk_spin_button_get_value(tmp); + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_update")); + gtk_spin_button_update(tmp); + m_Update = gtk_spin_button_get_value(tmp); + + GtkComboBox* wavetype = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_wavetype")); + m_Wavetype = uint64_t(gtk_combo_box_get_active(wavetype)); + + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_freeze_frequency")); + gtk_spin_button_update(tmp); + m_FreezeFrequency = gtk_spin_button_get_value(tmp); + + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_freeze_duration")); + gtk_spin_button_update(tmp); + m_FreezeDuration = gtk_spin_button_get_value(tmp); + } + + if (!CConfigurationBuilder::postConfigure()) { return false; } + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.h new file mode 100644 index 0000000..9f9fc66 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.h @@ -0,0 +1,41 @@ +#pragma once + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationDriverSimulatedDeviator + * \author Jussi T. Lindgren (Inria) + * \brief The CConfigurationDriverSimulatedDeviator handles the configuration dialog specific to the Simulated Deviator driver + * + * \sa CDriverSimulatedDeviator + */ + +class CConfigurationDriverSimulatedDeviator final : public CConfigurationBuilder +{ +public: + CConfigurationDriverSimulatedDeviator(IDriverContext& ctx, const char* gtkBuilderFilename, bool& sendPeriodicStims, double& offset, + double& spread, double& maxDev, double& pullback, double& update, uint64_t& wavetype, + double& freezeFrequency, double& freezeDuration); + + bool preConfigure() override; + bool postConfigure() override; + +protected: + + IDriverContext& m_driverCtx; + + bool& m_sendPeriodicStimulations; + double& m_Offset; + double& m_Spread; + double& m_MaxDev; + double& m_Pullback; + double& m_Update; + uint64_t& m_Wavetype; + double& m_FreezeFrequency; + double& m_FreezeDuration; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCDriverSimulatedDeviator.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCDriverSimulatedDeviator.cpp new file mode 100644 index 0000000..8eafb09 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCDriverSimulatedDeviator.cpp @@ -0,0 +1,254 @@ +#include "ovasCDriverSimulatedDeviator.h" +#include "ovasCConfigurationDriverSimulatedDeviator.h" + +#include + +#include +#include + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverSimulatedDeviator::CDriverSimulatedDeviator(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_SimulatedDeviator", m_driverCtx.getConfigurationManager()), m_gen{ m_rd() } +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::CDriverSimulatedDeviator\n"; + + m_header.setSamplingFrequency(512); + m_header.setChannelCount(3); + + m_settings.add("Header", &m_header); + m_settings.add("SendPeriodicStimulations", &m_sendPeriodicStimulations); + m_settings.add("Offset", &m_Offset); + m_settings.add("Spread", &m_Spread); + m_settings.add("MaxDev", &m_MaxDev); + m_settings.add("Pullback", &m_Pullback); + m_settings.add("Update", &m_Update); + m_settings.add("Wavetype", &m_Wavetype); + m_settings.add("FreezeFrequency", &m_FreezeFrequency); + m_settings.add("FreezeDuration", &m_FreezeDuration); + m_settings.load(); +} + +void CDriverSimulatedDeviator::release() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::release\n"; + delete this; +} + +const char* CDriverSimulatedDeviator::getName() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::getName\n"; + return "Simulated Deviator"; +} + +//___________________________________________________________________// +// // + +bool CDriverSimulatedDeviator::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::initialize\n"; + + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + m_header.setChannelCount(3); + + m_header.setChannelName(0, (m_Wavetype == 0 ? "SquareWave" : "SineWave")); + m_header.setChannelName(1, "SamplingRate"); + m_header.setChannelName(2, "DriftMs"); + + m_header.setChannelUnits(0, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); + m_header.setChannelUnits(1, OVTK_UNIT_Hertz, OVTK_FACTOR_Base); + m_header.setChannelUnits(2, OVTK_UNIT_Second, OVTK_FACTOR_Milli); + + m_samples.resize(m_header.getChannelCount() * nSamplePerSentBlock); + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; +} + +bool CDriverSimulatedDeviator::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::start\n"; + + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + m_nTotalSample = 0; + m_totalSampleCountReal = 0; + m_startTime = System::Time::zgetTime(); + m_lastAdjustment = m_startTime; + + m_usedSamplingFrequency = m_header.getSamplingFrequency() + m_Offset; + m_header.setChannelCount(3); + + return true; +} + +bool CDriverSimulatedDeviator::loop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverSimulatedDeviator::loop\n"; + + if (!m_driverCtx.isConnected()) { return false; } + + if (m_driverCtx.isStarted()) + { + // Generate the contents we want to send next + CStimulationSet stimSet; + if (m_sendPeriodicStimulations) + { + stimSet.setStimulationCount(1); + stimSet.setStimulationIdentifier(0, 0); + stimSet.setStimulationDate(0, 0); + stimSet.setStimulationDuration(0, 0); + } + + const uint64_t now = System::Time::zgetTime(); + + // Is it time to freeze? + if (m_FreezeDuration > 0 && m_FreezeFrequency > 0) + { + if (m_NextFreezeTime > 0 && now >= m_NextFreezeTime) + { + // Simulate a freeze by setting all samples as sent up to the de-freeze point + const uint64_t freezeDurationFixedPoint = CTime(m_FreezeDuration).time(); + const uint64_t samplesToSkip = CTime(freezeDurationFixedPoint).toSampleCount(m_header.getSamplingFrequency()); + m_nTotalSample += samplesToSkip; + m_totalSampleCountReal += samplesToSkip; + } + if (now >= m_NextFreezeTime) + { + // Compute the next time to freeze; simulate a Poisson process + const double secondsUntilNext = -std::log(1.0 - System::Math::random0To1()) / m_FreezeFrequency; + const uint64_t secondsUntilNextFixedPoint = CTime(secondsUntilNext).time(); + + m_NextFreezeTime = now + secondsUntilNextFixedPoint; + } + } + + // Drift the sampling frequency? + if (now - m_lastAdjustment > CTime(m_Update).time()) + { + // Make the sampling frequency random walk up or down + if (m_Spread > 0) + { + std::normal_distribution<> distro{ 0, m_Spread }; + const double jitter = distro(m_gen); + m_usedSamplingFrequency += jitter; + } + + // Use linear interpolation to pull the drifting sample frequency towards the center frequency + m_usedSamplingFrequency = m_Pullback * (m_header.getSamplingFrequency() + m_Offset) + (1 - m_Pullback) * m_usedSamplingFrequency; + + // Make sure the result stays bounded + m_usedSamplingFrequency = std::min(m_usedSamplingFrequency, m_header.getSamplingFrequency() + m_Offset + m_MaxDev); + m_usedSamplingFrequency = std::max(m_usedSamplingFrequency, m_header.getSamplingFrequency() + m_Offset - m_MaxDev); + m_usedSamplingFrequency = std::max(m_usedSamplingFrequency, 0.0); + + m_lastAdjustment = now; + // std::cout << "freq " << m_usedSamplingFrequency << "\n"; + } + + const uint64_t elapsed = now - m_startTime; + const uint64_t samplesNeededSoFar = uint64_t(m_usedSamplingFrequency * CTime(elapsed).toSeconds()); + const uint64_t samplesNeededSoFarReal = uint64_t(m_header.getSamplingFrequency() * CTime(elapsed).toSeconds()); + if (samplesNeededSoFar <= m_nTotalSample) + { + if (samplesNeededSoFarReal > m_totalSampleCountReal) { m_totalSampleCountReal = samplesNeededSoFarReal; } + // Too early + return true; + } + const uint32_t remainingSamples = uint32_t(samplesNeededSoFar - m_nTotalSample); + if (remainingSamples * m_header.getChannelCount() > m_samples.size()) { m_samples.resize(remainingSamples * m_header.getChannelCount()); } + + const double driftMeasure = samplesNeededSoFarReal > samplesNeededSoFar + ? - CTime(m_header.getSamplingFrequency(), samplesNeededSoFarReal - samplesNeededSoFar).toSeconds() + : CTime(m_header.getSamplingFrequency(), samplesNeededSoFar - samplesNeededSoFarReal).toSeconds(); + + for (uint32_t i = 0; i < remainingSamples; ++i) + { + double value; + if (m_Wavetype == 0) + { + const uint64_t sampleTimeInSeconds = ((CTime(m_header.getSamplingFrequency(), m_totalSampleCountReal)).time() >> 32 + ); + value = (sampleTimeInSeconds % 2 == 0 ? -1 : 1); + } + else + { + const double pi = 3.14159265358979323846; + value = std::sin(2 * pi * m_totalSampleCountReal / double(m_header.getSamplingFrequency())); + } + + m_samples[0 * remainingSamples + i] = float(value); + m_samples[1 * remainingSamples + i] = float(m_usedSamplingFrequency); + m_samples[2 * remainingSamples + i] = float(driftMeasure * 1000.0); + + if (samplesNeededSoFarReal >= samplesNeededSoFar) { m_totalSampleCountReal++; } + else + { + // nop: we don't move the 'real' process forward if the sampler is in advance, it gets a duplicate sample on purpose, + // we assume that the hardware sampling process has not had time to change state. + // @todo this implementation is not quite correct... if we take twice the amount of samples (512hz->1024hz), + // we'd expect each sample to be replicated twice but we observe that only approximately. The sinusoid 1hz stays correct nevertheless. + } + + m_nTotalSample++; + } + + m_callback->setSamples(&m_samples[0], remainingSamples); + m_callback->setStimulationSet(stimSet); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + else { if (m_driverCtx.isImpedanceCheckRequested()) { for (size_t j = 0; j < m_header.getChannelCount(); ++j) { m_driverCtx.updateImpedance(j, 1); } } } + + return true; +} + +bool CDriverSimulatedDeviator::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::stop\n"; + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + return true; +} + +bool CDriverSimulatedDeviator::uninitialize() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::uninitialize\n"; + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + m_callback = nullptr; + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverSimulatedDeviator::isConfigurable() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::isConfigurable\n"; + return true; +} + +bool CDriverSimulatedDeviator::configure() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::configure\n"; + + CConfigurationDriverSimulatedDeviator config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-Simulated-Deviator.ui", + m_sendPeriodicStimulations, m_Offset, m_Spread, m_MaxDev, m_Pullback, m_Update, m_Wavetype, m_FreezeFrequency, + m_FreezeDuration); + + if (config.configure(m_header)) + { + m_settings.save(); + return true; + } + + return false; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCDriverSimulatedDeviator.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCDriverSimulatedDeviator.h new file mode 100644 index 0000000..a81900d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCDriverSimulatedDeviator.h @@ -0,0 +1,83 @@ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverSimulatedDeviator + * \brief Simulates a drifting acquisition device by changing the sample rate by a random process. + * \author Jussi T. Lindgren (Inria) + * + * The driver simulates a square wave attempting to model a steady, analog process. The square wave changes + * sign every 1 sec. This process is then sampled using a sampling rate that is changing during the + * recording according to the parameters given to the driver. These parameters are + * + * Offset - The center sampling frequency deviation from the declared driver sampling rate. Can be negative. + * Spread - How big jumps the random walk takes; related to the sigma of the normal distribution + * MaxDev - The maximum allowed deviation in Hz from the true sampling rate + Offset + * Pullback - How strongly the random walk is pulled towards the true sampling rate + Offset + * Update - How often the sampling rate is changed (in seconds) + * + * The MaxDev and Pullback are used to keep the stochastic process from diverging. + * + */ +class CDriverSimulatedDeviator final : public IDriver +{ +public: + + explicit CDriverSimulatedDeviator(IDriverContext& ctx); + void release(); + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + std::vector m_samples; + + uint64_t m_nTotalSample = 0; // Number of samples sent by the drifting sampling process + uint64_t m_totalSampleCountReal = 0; // Number of samples of some imaginary, steady 'real' process, here a square wave + + uint64_t m_startTime = 0; + uint64_t m_lastAdjustment = 0; + double m_usedSamplingFrequency = 0; + +private: + bool m_sendPeriodicStimulations = false; + double m_Offset = 0; + double m_Spread = 0.1; + double m_MaxDev = 3; + double m_Pullback = 0.001; + double m_Update = 0.1; + uint64_t m_Wavetype = 0; + + double m_FreezeFrequency = 0; + double m_FreezeDuration = 0; + uint64_t m_NextFreezeTime = 0; + + std::random_device m_rd; + std::mt19937 m_gen; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.cpp new file mode 100644 index 0000000..6b40a00 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.cpp @@ -0,0 +1,203 @@ +#include "ovasCConfigurationTMSIRefa32B.h" + +#if defined TARGET_HAS_ThirdPartyNeXus + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +GtkListStore* m_listStoreSlaves; +GtkTreeView* m_pViewSlaves; +GtkListStore* m_listStoreList; +GtkTreeView* m_pViewList; + +static void button_remove_slave_device(GtkButton* button, void* data) +{ +#if defined _DEBUG_Callbacks_ + std::cout << "button_remove_slave_device" << std::endl; +#endif + static_cast(data)->buttonRemoveSlaveDevice(); +} + +static void button_add_slave_device(GtkButton* button, void* data) +{ +#if defined _DEBUG_Callbacks_ + std::cout << "button_add_slave_device" << std::endl; +#endif + static_cast(data)->buttonAddSlaveDevice(); +} + +CConfigurationTMSIRefa32B::CConfigurationTMSIRefa32B(const char* gtkBuilderFilename) + : CConfigurationBuilder(gtkBuilderFilename) {} + +bool CConfigurationTMSIRefa32B::setDeviceList(const std::vector deviceList, std::string* deviceMaster, std::vector* deviceSlaves) +{ + m_devices = deviceList; + m_deviceMaster = deviceMaster; + m_deviceSlaves = deviceSlaves; + m_deviceSlavesTemp.clear(); + for (uint32_t i = 0; i < (*m_deviceSlaves).size(); ++i) { m_deviceSlavesTemp.push_back((*m_deviceSlaves)[i]); } + + return true; +} + +bool CConfigurationTMSIRefa32B::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + + int count = -1; + bool selected = false; + + // autodetection of the connected device + GtkListStore* listStore = GTK_LIST_STORE(gtk_combo_box_get_model(comboBox)); + + for (uint32_t i = 0; i < m_devices.size(); ++i) + { + GtkTreeIter iter; + gtk_list_store_append(listStore, &iter); + gtk_list_store_set(listStore, &iter, 0, m_devices[i].c_str(), -1); + //::gtk_combo_box_append_text(comboBox,m_devices[i].c_str()); + + if (m_deviceMaster != nullptr && m_devices[i].compare(*m_deviceMaster) == 0) + { + count = i; + selected = true; + } + } + gtk_combo_box_set_model(comboBox,GTK_TREE_MODEL(listStore)); + if (selected) { gtk_combo_box_set_active(comboBox, count); } + else if (!selected && m_devices.size() > 0) { gtk_combo_box_set_active(comboBox, 0); } + + m_pViewSlaves = GTK_TREE_VIEW(gtk_builder_get_object(m_builder, "Devices SlavesTree")); + + GtkCellRenderer* rendererSlaves = gtk_cell_renderer_text_new(); + + GtkTreeViewColumn* colSlaves = gtk_tree_view_column_new_with_attributes("Devices Slaves", + rendererSlaves, "text", 0, nullptr); + gtk_tree_view_append_column(m_pViewSlaves, colSlaves); + + m_listStoreSlaves = gtk_list_store_new(1, G_TYPE_STRING); + + gtk_tree_view_set_model(m_pViewSlaves, GTK_TREE_MODEL(m_listStoreSlaves)); + + g_object_unref(m_listStoreSlaves); /* destroy model with view */ + + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(m_pViewSlaves), GTK_SELECTION_SINGLE); + + m_pViewList = GTK_TREE_VIEW(gtk_builder_get_object(m_builder, "Device ListTree")); + + GtkCellRenderer* rendererList = gtk_cell_renderer_text_new(); + + GtkTreeViewColumn* colList = gtk_tree_view_column_new_with_attributes("Devices List", rendererList, "text", 0, nullptr); + gtk_tree_view_append_column(m_pViewList, colList); + + m_listStoreList = gtk_list_store_new(1, G_TYPE_STRING); + + gtk_tree_view_set_model(m_pViewList, GTK_TREE_MODEL(m_listStoreList)); + + g_object_unref(m_listStoreList); /* destroy model with view */ + + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(m_pViewList), GTK_SELECTION_SINGLE); + + //init list + + for (uint32_t i = 0; i < m_devices.size(); ++i) + { + bool find = false; + uint32_t j = 0; + while (!find && j < (*m_deviceSlaves).size()) + { + find = (*m_deviceSlaves)[j].compare(m_devices[i]) == 0; + j++; + } + if (find) + { + GtkTreeIter iter; + gtk_list_store_append(m_listStoreSlaves, &iter); + gtk_list_store_set(m_listStoreSlaves, &iter, 0, m_devices[i].c_str(), -1); + } + else + { + GtkTreeIter iter; + gtk_list_store_append(m_listStoreList, &iter); + gtk_list_store_set(m_listStoreList, &iter, 0, m_devices[i].c_str(), -1); + } + } + + // Connects custom GTK signals + g_signal_connect(gtk_builder_get_object(m_builder, "button_add_slave_device"), "pressed", G_CALLBACK(button_add_slave_device), this); + g_signal_connect(gtk_builder_get_object(m_builder, "button_remove_slave_device"), "pressed", G_CALLBACK(button_remove_slave_device), this); + gtk_builder_connect_signals(m_builder, nullptr); + return true; +} + +bool CConfigurationTMSIRefa32B::postConfigure() +{ + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + + if (m_applyConfig) + { + int usbIdx = 0; + char* master = gtk_combo_box_get_active_text(comboBox); + *m_deviceMaster = (master != nullptr) ? master : ""; + (*m_deviceSlaves).clear(); + *m_deviceSlaves = m_deviceSlavesTemp; + } + + if (!CConfigurationBuilder::postConfigure()) { return false; } + return true; +} + +void CConfigurationTMSIRefa32B::buttonAddSlaveDevice() +{ + GtkTreeIter itList; + GtkTreeIter iter; + + GtkTreeSelection* selection = gtk_tree_view_get_selection(m_pViewList); + + if (gtk_tree_selection_get_selected(selection, nullptr, &itList)) + { + char* tmp = nullptr; + gtk_tree_model_get(GTK_TREE_MODEL(m_listStoreList), &itList, 0, &tmp, -1); + + bool find = false; + for (uint32_t i = 0; !find && i < m_devices.size(); ++i) + { + if (m_devices[i].compare(tmp) == 0) + { + m_deviceSlavesTemp.push_back(m_devices[i]); + gtk_list_store_remove(m_listStoreList, &itList); + gtk_list_store_append(m_listStoreSlaves, &iter); + gtk_list_store_set(m_listStoreSlaves, &iter, 0, m_devices[i].c_str(), -1); + find = true; + } + } + } +} + +void CConfigurationTMSIRefa32B::buttonRemoveSlaveDevice() +{ + GtkTreeIter itSlave; + GtkTreeIter iter; + + GtkTreeSelection* selection = gtk_tree_view_get_selection(m_pViewSlaves); + + if (gtk_tree_selection_get_selected(selection, nullptr, &itSlave)) + { + gchar* tmp = nullptr; + gtk_tree_model_get(GTK_TREE_MODEL(m_listStoreSlaves), &itSlave, 0, &tmp, -1); + gtk_list_store_append(m_listStoreList, &iter); + gtk_list_store_set(m_listStoreList, &iter, 0, tmp, -1); + gtk_list_store_remove(m_listStoreSlaves, &itSlave); + int pos = -1; + for (uint32_t i = 0; i < m_deviceSlavesTemp.size() && pos == -1; ++i) { pos = (m_deviceSlavesTemp[i].compare(tmp) == 0) ? i : -1; } + m_deviceSlavesTemp.erase(m_deviceSlavesTemp.begin() + pos); + } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyNeXus diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.h new file mode 100644 index 0000000..39a3e21 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.h @@ -0,0 +1,41 @@ +#pragma once + +#include "../ovasCConfigurationBuilder.h" +#include + +namespace OpenViBE { +namespace AcquisitionServer { +class CConfigurationTMSIRefa32B final : public CConfigurationBuilder +{ +public: + explicit CConfigurationTMSIRefa32B(const char* gtkBuilderFilename); + + bool preConfigure() override; + bool postConfigure() override; + bool setDeviceList(std::vector deviceList, std::string* deviceMaster, std::vector* deviceSlaves); + void buttonRemoveSlaveDevice(); + void buttonAddSlaveDevice(); + +protected: + std::string* m_deviceMaster = nullptr; + std::vector m_devices; + std::vector* m_deviceSlaves = nullptr; + std::vector m_deviceSlavesTemp; +}; + +// Translates a vector of strings to a stream for storing configuration. Used strings cannot contain ';'. +inline std::ostream& operator<<(std::ostream& out, const std::vector& var) +{ + for (auto it = var.begin(); it != var.end(); ++it) { out << (*it) << ";"; } + return out; +} + +inline std::istream& operator>>(std::istream& in, std::vector& var) +{ + var.clear(); + std::string token; + while (std::getline(in, token, ';')) { var.push_back(token); } + return in; +} +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.cpp new file mode 100644 index 0000000..8ea6551 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.cpp @@ -0,0 +1,638 @@ +#if defined TARGET_HAS_ThirdPartyNeXus + +#include "ovasCDriverTMSiRefa32B.h" +#include "ovasCConfigurationTMSIRefa32B.h" + +#include + +#include +#include +#include +#include +#include "ovasCConfigurationTMSIRefa32B.h" +#include + +namespace OpenViBE { +namespace AcquisitionServer { +//structure define in the DLL + +typedef struct SSpDevicePath +{ + DWORD dwCbSize; + TCHAR devicePath[1]; +} SP_DEVICE_PATH, *PSP_DEVICE_PATH; + +typedef struct SFeatureData +{ + ULONG FeatureId; + ULONG Info; +} FEATURE_DATA, *PFEATURE_DATA; + +typedef struct _SYSTEM_TIME +{ + WORD wYear; + WORD wMonth; + WORD wDayOfWeek; + WORD wDay; + WORD wHour; + WORD wMinute; + WORD wSecond; + WORD wMilliseconds; +} SYSTEM_TIME; + +typedef struct SSignalFormat +{ + ULONG Size; // Size of this structure + ULONG Elements; // Number of elements in list + + ULONG Type; // One of the signal types above + ULONG SubType; // One of the signal sub-types above + ULONG Format; // Float / Integer / Asci / Ect.. + ULONG Bytes; // Number of bytes per sample including subsignals + + FLOAT UnitGain; + FLOAT UnitOffSet; + ULONG UnitId; + LONG UnitExponent; + + WCHAR Name[SIGNAL_NAME]; + + ULONG Port; + WCHAR PortName[SIGNAL_NAME]; + ULONG SerialNumber; +} signal_format_t, *psignal_format_t; + +typedef struct _FeatureMemory +{ + FEATURE_DATA Feature; + ULONG Data[1]; +} FEATURE_MEMORY, *PFEATURE_MEMORY; + +typedef struct _FeatureMode +{ + FEATURE_DATA Feature; + ULONG Mode; +} FEATURE_MODE, *PFEATURE_MODE; + +//___________________________________________________________// +// // + +//methods define in the DLL + +typedef HANDLE ( __stdcall * POPEN)(PSP_DEVICE_PATH devicePath); +typedef BOOL ( __stdcall * PCLOSE)(HANDLE handle); +typedef ULONG ( __stdcall * PGETDEVICESTATE)(IN HANDLE handle); +typedef BOOLEAN ( __stdcall * PSTART)(IN HANDLE handle); +typedef BOOLEAN ( __stdcall * PRESETDEVICE)(IN HANDLE handle); +typedef BOOLEAN ( __stdcall * PSTOP)(IN HANDLE handle); +typedef HANDLE ( __stdcall * PGETSLAVEHANDLE)(IN HANDLE handle); +typedef BOOLEAN ( __stdcall * PADDSLAVE)(IN HANDLE handle, IN HANDLE slavehandle); +typedef psignal_format_t ( __stdcall * PGETSIGNALFORMAT)(IN HANDLE handle, IN OUT psignal_format_t format); +typedef BOOLEAN ( __stdcall * PSETSIGNALBUFFER)(IN HANDLE handle, IN OUT PULONG sampling, IN OUT PULONG size); +typedef ULONG ( __stdcall * PGETSAMPLES)(IN HANDLE handle, OUT PULONG sampleBuffer, IN ULONG size); +typedef BOOLEAN ( __stdcall * PGETBUFFERINFO)(IN HANDLE handle, OUT PULONG overflow, OUT PULONG percentFull); +typedef BOOLEAN ( __stdcall * PDEVICEFEATURE)(IN HANDLE handle, IN LPVOID dataIn, IN DWORD inSize, OUT LPVOID dataOut, IN DWORD outSize); +typedef PSP_DEVICE_PATH ( __stdcall * PGETINSTANCEID)(IN LONG deviceIndex, IN BOOLEAN present, OUT ULONG* maxDevices); +typedef HKEY ( __stdcall * POPENREGKEY)(IN PSP_DEVICE_PATH path); +typedef BOOL ( __stdcall * PFREE)(IN VOID* memory); + +//___________________________________________________________// +// // + +//vars used for load the DLL's methods +POPEN fpOpen; +PCLOSE fpClose; +PGETDEVICESTATE fpGetDeviceState; +PSTART fpStart; +PRESETDEVICE fpReset; +PSTOP fpStop; +PGETSLAVEHANDLE fpGetSlaveHandle; +PADDSLAVE fpAddSlave; +PGETSIGNALFORMAT fpGetSignalFormat; +PSETSIGNALBUFFER fpSetSignalBuffer; +PGETSAMPLES fpGetSamples; +PGETBUFFERINFO fpGetBufferInfo; +PDEVICEFEATURE fpDeviceFeature; +PGETINSTANCEID fpGetInstanceId; +POPENREGKEY fpOpenRegKey; +PFREE fpFree; + +//___________________________________________________________// +// // + +HANDLE handleMaster; //Device Handle Master +std::vector handleSlaves; //Device Handle Slave +HINSTANCE libHandle; //Library Handle + +// Buffer for storing the samples +//---------------------------------- +ULONG* bufferUnsigned; +LONG* buffer; +bool islBufferUnsigned; +ULONG sampling; +ULONG bufferSize; + +// device +//---------- +std::map devicePaths; // devicePaths contains all connected devicePath and their name +CString devicePathMaster; // the name of the Master devicePath chosen +std::vector devicePathSlaves; // a list with the name of the Slave devicePath chosen +ULONG nDevicesConnected; // Number of devices on this PC +ULONG nDevicesOpen; // total of Master/slaves device open + +// store value for calculate the data +//-------------------------------------- +std::vector exponentChannels; +std::vector unitGains; +std::vector unitOffSets; + +//number of channels +ULONG nTotalChannels; +uint32_t m_bufferSize; + +#define LOAD_DLL_FUNC(var, type, name) \ + var = (type)::GetProcAddress(libHandle, name); \ + if(!var) \ + { \ + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Load method " << name << "\n"; \ + m_valid=false; \ + return; \ + } + +CDriverTMSiRefa32B::CDriverTMSiRefa32B(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_TMSIRefa32B", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(512); + m_header.setChannelCount(32); + + //load the DLL of the driver + libHandle = nullptr; + handleMaster = nullptr; + + //Open library + const CString path = m_driverCtx.getConfigurationManager().expand("${Path_Bin}") + "/" + RTLOADER; + libHandle = ::LoadLibrary(path.toASCIIString()); + + //if it can't be open return FALSE; + if (libHandle == nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Couldn't load DLL: " << path << "\n"; + return; + } + + //load DLL methods for initialized the driver + LOAD_DLL_FUNC(fpOpen, POPEN, "Open"); + LOAD_DLL_FUNC(fpClose, PCLOSE, "Close"); + LOAD_DLL_FUNC(fpGetDeviceState, PGETDEVICESTATE, "GetDeviceState"); + LOAD_DLL_FUNC(fpStart, PSTART, "Start"); + LOAD_DLL_FUNC(fpReset, PRESETDEVICE, "ResetDevice"); + LOAD_DLL_FUNC(fpStop, PSTOP, "Stop"); + LOAD_DLL_FUNC(fpGetSlaveHandle, PGETSLAVEHANDLE, "GetSlaveHandle"); + LOAD_DLL_FUNC(fpAddSlave, PADDSLAVE, "AddSlave"); + LOAD_DLL_FUNC(fpGetSignalFormat, PGETSIGNALFORMAT, "GetSignalFormat"); + LOAD_DLL_FUNC(fpSetSignalBuffer, PSETSIGNALBUFFER, "SetSignalBuffer"); + LOAD_DLL_FUNC(fpGetSamples, PGETSAMPLES, "GetSamples"); + LOAD_DLL_FUNC(fpGetBufferInfo, PGETBUFFERINFO, "GetBufferInfo"); + LOAD_DLL_FUNC(fpDeviceFeature, PDEVICEFEATURE, "DeviceFeature"); + + LOAD_DLL_FUNC(fpGetInstanceId, PGETINSTANCEID, "GetInstanceId"); + LOAD_DLL_FUNC(fpOpenRegKey, POPENREGKEY, "OpenRegKey"); + LOAD_DLL_FUNC(fpFree, PFREE, "Free"); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Succeeded in loading DLL: " << CString(path) << "\n"; + devicePathMaster = ""; + nDevicesOpen = 0; + m_checkImpedance = m_driverCtx.getConfigurationManager().expandAsBoolean("${AcquisitionServer_CheckImpedance}", false);//m_checkImpedance=false; + + m_settings.add("Header", &m_header); + m_settings.add("DevicePathMaster", &devicePathMaster); + m_settings.add("DevicePathSlave", &devicePathSlaves); + m_settings.load(); +} + +bool CDriverTMSiRefa32B::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (!m_valid || m_driverCtx.isConnected()) { return false; } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Initialized TMSI\n"; + + if (handleMaster != nullptr) + { + fpClose(handleMaster); + handleMaster = nullptr; + } + + //Refresh information about connected device + if (!refreshDevicePath()) { return false; } + + if (nDevicesConnected == 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "There is no device connected to the PC\n"; + return false; + } + + //open master + auto iter = devicePaths.begin(); + bool masterFind = false; + while (devicePathMaster != CString("") && !masterFind && iter != devicePaths.end()) + { + if ((*iter).second == devicePathMaster) + { + masterFind = true; + handleMaster = fpOpen((*iter).first); + if (!handleMaster) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Open Driver\n"; + return false; + } + nDevicesOpen++; + } + ++iter; + } + if (handleMaster == nullptr && nDevicesConnected > 0) + { + handleMaster = fpOpen((*devicePaths.begin()).first); + if (!handleMaster) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Open Driver\n"; + return false; + } + nDevicesOpen++; + } + + //open slave + for (uint32_t i = 0; i < devicePathSlaves.size(); ++i) + { + auto j = devicePaths.begin(); + bool find = false; + while (!find && j != devicePaths.end()) + { + if ((*j).second == devicePathMaster && + (*j).second == CString(devicePathSlaves[i].c_str())) + { + find = true; + + //open slave driver + handleSlaves.push_back(fpOpen((*j).first)); + fpAddSlave(handleMaster, handleSlaves[handleSlaves.size() - 1]); + nDevicesOpen++; + } + ++j; + } + } + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">size for 1 channel, 1 block: " << m_nSamplePerSentBlock << "\n"; + + + //initialized the buffer + sampling = m_header.getSamplingFrequency() * 1000; + bufferSize = MAX_BUFFER_SIZE; + if (!fpSetSignalBuffer(handleMaster, &sampling, &bufferSize)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "For allocate the buffer\n"; + return false; + } + m_header.setSamplingFrequency(sampling / 1000); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Maximum sample rate =" << uint32_t(sampling / 1000) << "Hz\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Maximum Buffer size =" << uint32_t(bufferSize) << "\n"; + + const BOOLEAN start = fpStart(handleMaster); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Start handle state: " << uint32_t(fpGetDeviceState(handleMaster)) << "\n"; + if (!start) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Start handle failed\n"; + this->uninitialize(); + return false; + } + + //get informations of the format signal for all channels of the Master Handle + psignal_format_t format = fpGetSignalFormat(handleMaster, nullptr); + + if (format != nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Master device name: " << (char*)format[0].PortName << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Nb channels: " << uint32_t(format[0].Elements) << "\n\n"; + nTotalChannels = format[0].Elements; + islBufferUnsigned = format[0].Format == 0; + for (uint32_t i = 0; i < format[0].Elements; ++i) + { + exponentChannels.push_back(format[i].UnitExponent + 6/*changed measure unit in V*/); + unitGains.push_back(format[i].UnitGain); + unitOffSets.push_back(format[i].UnitOffSet); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "channel[" << i << "]: Exponent=" << exponentChannels[i] << + " unitGain=" << unitGains[i] << + " offSet=" << unitOffSets[i] << + " format data signed=" << uint32_t(format[i].Format) << + " type=" << uint32_t(format[i].Type) << + " sub type=" << uint32_t(format[i].SubType) << + " unit id=" << uint32_t(format[i].UnitId) << "\n"; + //if no trigger channel was found and this channel is a digital input, this channel contains information about Trigger + if (m_nTriggerChannel == -1 && format[i].Type == 4) { m_nTriggerChannel = i; } + } + + for (uint32_t j = 0; j < handleSlaves.size(); ++j) + { + format = fpGetSignalFormat(handleSlaves[j], nullptr); + + if (format != nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Slave device n" << j << " name: " << (char*)format[0].PortName << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Nb channels: " << uint32_t(format[0].Elements) << "\n\n"; + nTotalChannels += format[0].Elements; + for (uint32_t i = 0; i < format[0].Elements; ++i) + { + exponentChannels.push_back(format[i].UnitExponent); + unitGains.push_back(format[i].UnitGain); + unitOffSets.push_back(format[i].UnitOffSet); + } + } + } + } + //m_header.setChannelCount(nTotalChannels); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Number of Channels: " << size_t(m_header.getChannelCount()) << "\n"; + m_sample = new float[m_header.getChannelCount() * m_nSamplePerSentBlock * 2]; + + m_sampleIdx = 0; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Sample driver size " << uint32_t(nTotalChannels * 4) << "\n"; + m_bufferSize = (bufferSize < (m_nSamplePerSentBlock * nTotalChannels * 4)) ? bufferSize + : (m_nSamplePerSentBlock * nTotalChannels * 32); + bufferUnsigned = new ULONG[m_bufferSize]; + if (!islBufferUnsigned) { buffer = new LONG[m_bufferSize]; } + + //activate the mode Impedance of the device + if (m_checkImpedance) + { + if (!measureMode(MEASURE_MODE_IMPEDANCE, IC_OHM_005)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error impedance measure mode ic_ohm_005\n"; + return false; + } + } + return true; +} + +bool CDriverTMSiRefa32B::start() +{ + if (!m_valid || !m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">start TMSI\n"; + if (m_checkImpedance) { measureMode(MEASURE_MODE_NORMAL, 0); } + m_sampleIdx = 0; + m_totalSampleReceived = 0; + return true; +} + +bool CDriverTMSiRefa32B::loop() +{ + if (!m_valid || !m_driverCtx.isConnected()) { return false; } + if (m_driverCtx.isStarted()) + { + //get data receive by the driver + if (fpGetSamples == nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "fpGetSample not load\n"; + return false; + } + //uint32_t nextSampleIdx = 0; + + //uint64_t elapsed = System::Time::zgetTime()-m_startTime; + const ULONG size = fpGetSamples(handleMaster, (islBufferUnsigned) ? PULONG(bufferUnsigned) : PULONG(buffer), m_bufferSize); + + if (size < 1) { return true; } + + //number of samples contains in the data receive + const uint32_t nSample = size / (nTotalChannels * 4); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "size=" << uint32_t(size) << " ;;number of sample received=" << uint32_t(nSample) << + " ;; Samp[" << 0 + << "]=" << uint32_t((islBufferUnsigned) ? bufferUnsigned[0] : buffer[0]) << ";; " + << uint32_t((islBufferUnsigned) ? bufferUnsigned[1] : buffer[1]) << "\n"; + + //index of the data buffer + uint32_t indexBuffer = 0; + + while (indexBuffer < nSample)//-m_autoRemovedSampleCount) + { + //take the minimum value between the size for complete the current block and the size of data received + ULONG min; + if (m_nSamplePerSentBlock - m_sampleIdx < (nSample - indexBuffer)) { min = m_nSamplePerSentBlock - m_sampleIdx; } + else { min = nSample - indexBuffer; } + + //loop on the channel + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + //loop on the samples by channel + for (uint32_t j = 0; j < min; ++j) + { + // save the data of one sample for one channel on the table + if (nTotalChannels <= i) { m_sample[m_sampleIdx + j + i * m_nSamplePerSentBlock] = 0; } + else if (islBufferUnsigned) + { + m_sample[m_sampleIdx + j + i * m_nSamplePerSentBlock] = float( + (float(bufferUnsigned[(indexBuffer + j) * nTotalChannels + i]) * unitGains[i] + unitOffSets[i]) * pow( + 10., double(exponentChannels[i]))); + } + else + { + m_sample[m_sampleIdx + j + i * m_nSamplePerSentBlock] = float( + (float(buffer[(indexBuffer + j) * nTotalChannels + i]) * unitGains[i] + unitOffSets[i]) * pow( + 10., double(exponentChannels[i]))); + } + } + } + + for (uint32_t j = 0; j < min; ++j) + { + uint32_t trigger; + if (islBufferUnsigned) { trigger = bufferUnsigned[(indexBuffer + j) * nTotalChannels + m_nTriggerChannel]; } + else { trigger = buffer[(indexBuffer + j) * nTotalChannels + m_nTriggerChannel]; } + //std::cout<= m_nSamplePerSentBlock) + { + //sent the data block + m_callback->setSamples(m_sample); + m_callback->setStimulationSet(m_stimSet); + m_stimSet.clear(); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + + //calculate the index of the new block + m_sampleIdx -= m_nSamplePerSentBlock; + } + } + } + else if (m_checkImpedance) + { + //get Impedance value + //get size of data receive + const ULONG size = fpGetSamples(handleMaster, PULONG(bufferUnsigned), m_bufferSize); + for (uint32_t i = 0; i < size / sizeof(ULONG) && i < nTotalChannels; ++i) { m_driverCtx.updateImpedance(i, bufferUnsigned[i] * 1000); } + } + else { fpGetSamples(handleMaster, PULONG(bufferUnsigned), m_bufferSize); } + return true; +} + +bool CDriverTMSiRefa32B::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Stop TMSI\n"; + + if (m_checkImpedance) { measureMode(MEASURE_MODE_IMPEDANCE, IC_OHM_005); } + m_sampleIdx = 0; + m_totalSampleReceived = 0; + return true; +} + +bool CDriverTMSiRefa32B::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Uninit TMSI\n"; + + //stop the driver + BOOLEAN stop = TRUE; + + for (uint32_t i = 0; i < handleSlaves.size(); ++i) { stop = stop && fpStop(handleSlaves[i]); } + stop = stop && fpStop(handleMaster); + if (!stop) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Stop handler\n"; + this->uninitialize(); + return false; + } + for (uint32_t i = 0; i < handleSlaves.size(); ++i) { fpClose(handleSlaves[i]); } + handleSlaves.clear(); + fpClose(handleMaster); + handleMaster = nullptr; + for (uint32_t i = 0; i < handleSlaves.size(); ++i) { fpClose(handleSlaves[i]); } + devicePathSlaves.clear(); + devicePathMaster = ""; + devicePaths.clear(); + delete[] m_sample; + m_sample = nullptr; + m_callback = nullptr; + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverTMSiRefa32B::configure() +{ + //refresh the information of the device connected + refreshDevicePath(); + + CConfigurationTMSIRefa32B config(Directories::getDataDir() + "/applications/acquisition-server/interface-TMSI-Refa32B.ui"); + //create a vector with all name of device connected + std::vector paths; + for (auto i = devicePaths.begin(); i != devicePaths.end(); ++i) { paths.push_back(std::string((*i).second.toASCIIString())); } + + //call configuration frame + config.setDeviceList(paths, &std::string(devicePathMaster.toASCIIString()), &devicePathSlaves); + + if (!config.configure(m_header)) { return false; } + + m_settings.save(); + return true; +} + +bool CDriverTMSiRefa32B::refreshDevicePath() const +{ + devicePaths.clear(); + + //get the number of devices connected + ULONG maxDevices = 0; + if (fpGetInstanceId == nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Initialized the device, fpGetNrDevice not load\n"; + return false; + } + fpGetInstanceId(0, TRUE, &maxDevices); + + for (uint32_t i = 0; i < maxDevices; ++i) + { + TCHAR deviceName[40] = "Unknown Device"; + ULONG serialNumber = 0; + + // get the device path connected + PSP_DEVICE_PATH device = fpGetInstanceId(i, TRUE, &maxDevices); + + // get the name corresponding to this device + const HKEY hKey = fpOpenRegKey(device); + if (hKey != INVALID_HANDLE_VALUE) + { + //get the serial number of the device + ULONG sizeSerial = sizeof(serialNumber); + ::RegQueryValueEx(hKey, "DeviceSerialNumber", nullptr, nullptr, PBYTE(&serialNumber), &sizeSerial); + + //get the name of the device + ULONG sizeDesc = sizeof(deviceName); + ::RegQueryValueEx(hKey, "DeviceDescription", nullptr, nullptr, PBYTE(&deviceName[0]), &sizeDesc); + //put the device path and it name in the map devicePaths + devicePaths[device] = (deviceName + std::to_string(serialNumber)).c_str(); + RegCloseKey(hKey); + } + } + + //verify if the device Master is connected + const std::string pathMaster = devicePathMaster.toASCIIString(); + devicePathMaster = CString(""); + if (!pathMaster.empty()) + { + auto index = devicePaths.begin(); + while (devicePathMaster == CString("") && index != devicePaths.end()) + { + std::string deviceName = (*index).second.toASCIIString(); + devicePathMaster = (pathMaster == deviceName) ? pathMaster.c_str() : nullptr; + ++index; + } + } + + //verify if all device slaves are connected + std::vector pathSlaves; + for (uint32_t i = 0; i < devicePathSlaves.size(); ++i) + { + for (auto j = devicePaths.begin(); j != devicePaths.end(); ++j) + { + if ((*j).second == CString(devicePathSlaves[i].c_str())) + { + pathSlaves.push_back(devicePathSlaves[i]); + break; + } + } + } + devicePathSlaves.clear(); + devicePathSlaves = pathSlaves; + nDevicesConnected = maxDevices; + return true; +} + +bool CDriverTMSiRefa32B::measureMode(const uint32_t mode, const uint32_t info) +{ + FEATURE_MODE fMode; + fMode.Feature.FeatureId = DEVICE_FEATURE_MODE; + fMode.Feature.Info = info; + fMode.Mode = mode; + if (!fpDeviceFeature(handleMaster, &fMode, sizeof(FEATURE_MODE), nullptr, 0)) { return false; } + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyNeXus diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.h new file mode 100644 index 0000000..4d192ed --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.h @@ -0,0 +1,108 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyNeXus + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include "ovas_base.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include "ovasCConfigurationTMSIRefa32B.h" + +// This dll comes from the sdk-nexus.zip dependency archive +#define RTLOADER "RTINST.Dll" +#include +// Get Signal info + +#define SIGNAL_NAME 40 +#define MAX_BUFFER_SIZE 0xFFFFFFFF + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverTMSiRefa32B + * \author Baptiste Payan (INRIA) + */ +class CDriverTMSiRefa32B final : virtual public IDriver +{ +public: + + explicit CDriverTMSiRefa32B(IDriverContext& ctx); + ~CDriverTMSiRefa32B() override { this->uninitialize(); } + virtual void release() { delete this; } + const char* getName() override { return "TMSi Refa32B Legacy"; } + + bool isFlagSet(const EDriverFlag flag) const override { return (flag == EDriverFlag::IsUnstable) || (flag == EDriverFlag::IsDeprecated); } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + static bool measureMode(uint32_t mode, uint32_t info); + +protected: + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + bool m_valid = true; + + uint32_t m_sampleIdx = 0; + uint32_t m_totalSampleReceived = 0; + CStimulationSet m_stimSet; + + bool m_checkImpedance = false; + int m_nTriggerChannel = -1; + uint32_t m_lastTriggerValue = 255; + + bool refreshDevicePath() const; + + +#define EXG (ULONG) 0x0001 +#define AUX (ULONG) 0x0002 +#define DEVICE_FEATURE_TYPE 0x0303 +#define DEVICE_FEATURE_MODE 0x0302 +#define DEVICE_FEATURE_RTC 0x0301 +#define DEVICE_FEATURE_HIGHPASS 0x0401 +#define DEVICE_FEATURE_LOWPASS 0x0402 +#define DEVICE_FEATURE_GAIN 0x0403 +#define DEVICE_FEATURE_OFFSET 0x0404 +#define DEVICE_FEATURE_IO 0x0500 +#define DEVICE_FEATURE_MEMORY 0x0501 +#define DEVICE_FEATURE_STORAGE 0x0502 +#define DEVICE_FEATURE_CORRECTION 0x0503 +#define DEVICE_FEATURE_ID 0x0504 + +#define MEASURE_MODE_NORMAL ((ULONG)0x0) +#define MEASURE_MODE_IMPEDANCE ((ULONG)0x1) +#define MEASURE_MODE_CALIBRATION ((ULONG)0x2) +#define MEASURE_MODE_IMPEDANCE_EX ((ULONG)0x3) +#define MEASURE_MODE_CALIBRATION_EX ((ULONG)0x4) + //for MEASURE_MODE_IMPEDANCE +#define IC_OHM_002 0 // 2K Impedance limit +#define IC_OHM_005 1 // 5K Impedance limit +#define IC_OHM_010 2 // 10K Impedance limit +#define IC_OHM_020 3 // 20K Impedance limit +#define IC_OHM_050 4 // 50K Impedance limit +#define IC_OHM_100 5 // 100K Impedance limit + //for MEASURE_MODE_CALIBRATION +#define IC_VOLT_050 0 //50 uV t-t Calibration voltage +#define IC_VOLT_100 1 //100 uV t-t +#define IC_VOLT_200 2 //200 uV t-t +#define IC_VOLT_500 3 //500 uV t-t +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCConfigurationTMSi.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCConfigurationTMSi.cpp new file mode 100644 index 0000000..a08ee2d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCConfigurationTMSi.cpp @@ -0,0 +1,340 @@ +/* + * ovasCConfigurationTMSi.cpp + * + * Copyright (c) 2014, Mensia Technologies SA. All rights reserved. + * -- Rights transferred to Inria, contract signed 21.11.2014 + * + */ + +#include "ovasCConfigurationTMSi.h" +#include "ovasCDriverTMSi.h" +#include "ovasCTMSiAccess.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +#if defined TARGET_HAS_ThirdPartyTMSi + +namespace { +void ComboBoxCommunicationProtocolChangedCB(GtkComboBox* comboBox, CConfigurationTMSi* configuration) +{ + configuration->showWaitWindow(); + configuration->m_Driver->m_pTMSiAccess->initializeTMSiLibrary(gtk_combo_box_get_active_text(comboBox)); + configuration->hideWaitWindow(); + configuration->fillDeviceCombobox(); +} + +void ComboBoxDeviceChangedCB(GtkComboBox* comboBox, CConfigurationTMSi* configuration) +{ + CTMSiAccess* tmsiAccess = configuration->m_Driver->m_pTMSiAccess; + + const CString currentDevice = CString(gtk_combo_box_get_active_text(comboBox)); + + // If the currently chosen device has no name it means the combo box is empty + if (currentDevice == CString("")) + { + configuration->clearAdditionalChannelsTable(); + + // clear the list of sampling frequencies + gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(configuration->m_comboBoxSamplingFrequency))); + return; + } + + configuration->showWaitWindow(); + tmsiAccess->openFrontEnd(currentDevice); + + bool deviceHasImpedanceTestingAbility = false; + if (!tmsiAccess->getImpedanceTestingCapability(&deviceHasImpedanceTestingAbility)) + { + tmsiAccess->closeFrontEnd(); + configuration->hideWaitWindow(); + return; + } + + + if (!tmsiAccess->calculateSignalFormat(currentDevice)) + { + tmsiAccess->closeFrontEnd(); + configuration->hideWaitWindow(); + return; + } + + if (!configuration->fillSamplingFrequencyCombobox()) + { + tmsiAccess->freeSignalFormat(); + tmsiAccess->closeFrontEnd(); + configuration->hideWaitWindow(); + return; + } + + configuration->fillAdditionalChannelsTable(); + + tmsiAccess->freeSignalFormat(); + tmsiAccess->closeFrontEnd(); + configuration->hideWaitWindow(); + + // activate/deactivate the impedance checking dropbown box + gtk_widget_set_sensitive(GTK_WIDGET(configuration->m_comboBoxImpedanceLimit), deviceHasImpedanceTestingAbility); + + // modify the EEG channel count spinbox to reflect the detected maximum number of channels + GtkAdjustment* eegChannelCountAdjustment = gtk_spin_button_get_adjustment(configuration->m_buttonChannelCount); + gtk_adjustment_set_upper(eegChannelCountAdjustment, tmsiAccess->getMaximumEEGChannelCount()); + gtk_adjustment_set_value(eegChannelCountAdjustment, tmsiAccess->getMaximumEEGChannelCount()); +} + +void ChannelCountChangedCB(GtkSpinButton* spinButton, CConfigurationTMSi* /*configuration*/) { gtk_spin_button_update(spinButton); } + +void RemoveWidgets(GtkWidget* widget, gpointer /*data*/) { gtk_widget_destroy(widget); } +} // namespace + +/* Fills the combobox containing list of devices with TMSi devices connected via the + * currently selected protocol + */ +void CConfigurationTMSi::fillDeviceCombobox() const +{ + int idx = -1; + GtkListStore* deviceListStore = GTK_LIST_STORE(gtk_combo_box_get_model(m_comboBoxDeviceID)); + gtk_list_store_clear(deviceListStore); + + for (size_t i = 0; i < m_Driver->m_pTMSiAccess->getDeviceList().size(); i++) + { + gtk_combo_box_append_text(m_comboBoxDeviceID, m_Driver->m_pTMSiAccess->getDeviceList()[i].toASCIIString()); + if (m_Driver->m_deviceID == m_Driver->m_pTMSiAccess->getDeviceList()[i]) { idx = int(i); } + } + + // set the active combobox field to the currently set device (if it is present) + if (idx != -1) { gtk_combo_box_set_active(m_comboBoxDeviceID, idx); } +} + +// fills the sampling freuqency combobox, as a side-effect, will also correctly set the maximum number of EEG channels inside the TMSiAccess object +bool CConfigurationTMSi::fillSamplingFrequencyCombobox() +{ + CTMSiAccess* tmsiAccess = m_Driver->m_pTMSiAccess; + + // clear the list of sampling frequencies + GtkListStore* frequencyListStore = GTK_LIST_STORE(gtk_combo_box_get_model(m_comboBoxSamplingFrequency)); + gtk_list_store_clear(frequencyListStore); + + showWaitWindow(); + std::vector samplingFrequencies = tmsiAccess->discoverDeviceSamplingFrequencies(); + // Emtpy the list of acquisition frequencies and fill it with the frequencies supported by the device + hideWaitWindow(); + + if (samplingFrequencies.empty()) { return false; } + + int idx = -1; + for (size_t samplingFrequencyIdx = 0; samplingFrequencyIdx < samplingFrequencies.size(); samplingFrequencyIdx++) + { + std::stringstream ss; + + // TMSi uses sampling frequencies in mHz but we want to display them in Hz + ss << samplingFrequencies[samplingFrequencyIdx] / 1000; + gtk_combo_box_append_text(m_comboBoxSamplingFrequency, ss.str().c_str()); + + if (m_Driver->m_header.getSamplingFrequency() == samplingFrequencies[samplingFrequencyIdx] / 1000) { idx = int(samplingFrequencyIdx); } + } + + // set the active combobox field to the currently set sampling frequency (if it is present) + if (idx != -1) { gtk_combo_box_set_active(m_comboBoxSamplingFrequency, idx); } + else + { + // set the sampling frequency to the biggest one + gtk_combo_box_set_active(m_comboBoxSamplingFrequency, gint(samplingFrequencies.size() - 1)); + } + + return true; +} + +// clears the table with additional channels +void CConfigurationTMSi::clearAdditionalChannelsTable() +{ + gtk_container_foreach(GTK_CONTAINER(m_TableAdditionalChannels), RemoveWidgets, m_TableAdditionalChannels); + gtk_table_resize(m_TableAdditionalChannels, 1, 2); + m_AdditionalChannelCheckButtons.erase(m_AdditionalChannelCheckButtons.begin(), m_AdditionalChannelCheckButtons.end()); + m_additionalChannelNames.erase(m_additionalChannelNames.begin(), m_additionalChannelNames.end()); + gtk_widget_hide(GTK_WIDGET(m_TableAdditionalChannels)); + gtk_widget_hide(GTK_WIDGET(m_LabelAdditionalChannels)); +} + +// fills the table with additional channels +void CConfigurationTMSi::fillAdditionalChannelsTable() +{ + CTMSiAccess* tmsiAccess = m_Driver->m_pTMSiAccess; + + const uint32_t nAdditionalChannels = tmsiAccess->getActualChannelCount() - tmsiAccess->getMaximumEEGChannelCount(); + const uint32_t firstAdditionalChannelIdx = tmsiAccess->getMaximumEEGChannelCount(); + + clearAdditionalChannelsTable(); + gtk_table_resize(m_TableAdditionalChannels, nAdditionalChannels, 2); + + for (size_t c = 0; c < nAdditionalChannels; ++c) + { + const size_t actualIdx = c + firstAdditionalChannelIdx; + + CString label = "Channel " + tmsiAccess->getChannelName(actualIdx) + " of type " + tmsiAccess->getChannelType(actualIdx).toASCIIString(); + + GtkWidget* labelChannelName = gtk_label_new(label.toASCIIString()); + gtk_label_set_use_markup(GTK_LABEL(labelChannelName), TRUE); + + GtkWidget* buttonChannelActive = gtk_check_button_new(); + gtk_table_set_row_spacings(m_TableAdditionalChannels, 5); + m_AdditionalChannelCheckButtons.push_back(GTK_CHECK_BUTTON(buttonChannelActive)); + m_additionalChannelNames.push_back(tmsiAccess->getChannelName(actualIdx)); + + // if the channel was previously selected, check it in the list + // the list of selected channels is in form ;CH1;CH2;CH3, thus we seek for substring of type ;CHX; + if (std::string(m_Driver->m_sActiveAdditionalChannels).find(";" + std::string(tmsiAccess->getChannelName(actualIdx).toASCIIString()) + ";") + != std::string::npos) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttonChannelActive), TRUE); } + else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttonChannelActive), FALSE); } + + gtk_table_attach_defaults(m_TableAdditionalChannels, labelChannelName, 0, 1, guint(c), guint(c + 1)); + gtk_table_attach_defaults(m_TableAdditionalChannels, buttonChannelActive, 1, 2, guint(c), guint(c + 1)); + } + + gtk_widget_show(GTK_WIDGET(m_LabelAdditionalChannels)); + gtk_widget_show_all(GTK_WIDGET(m_TableAdditionalChannels)); +} + + +CString CConfigurationTMSi::getActiveAdditionalChannels() +{ + CString additionalChannelsString = ";"; + + CTMSiAccess* tmsiAccess = m_Driver->m_pTMSiAccess; + + const uint32_t nAdditionalChannels = tmsiAccess->getActualChannelCount() - tmsiAccess->getMaximumEEGChannelCount(); + + for (size_t i = 0; i < nAdditionalChannels; i++) + { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_AdditionalChannelCheckButtons[i]))) + { + additionalChannelsString = additionalChannelsString + m_additionalChannelNames[i] + ";"; + } + } + + return additionalChannelsString; +} + +CConfigurationTMSi::CConfigurationTMSi(const char* gtkBuilderFilename, CDriverTMSi* driver) + : CConfigurationBuilder(gtkBuilderFilename), m_Driver(driver) { m_waitWindow = nullptr; } + +CConfigurationTMSi::~CConfigurationTMSi() +{ + // Hide the wait window when the object dies + hideWaitWindow(); +} + +bool CConfigurationTMSi::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + m_buttonChannelCount = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_number_of_channels")); + m_comboBoxSamplingFrequency = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")); + m_comboBoxConnectionProtocol = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_tmsi_connection_protocol")); + m_comboBoxDeviceID = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_tmsi_device")); + m_comboBoxImpedanceLimit = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_tmsi_impedance_limit")); + // m_pToggleButtonCommonAverageReference = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_tmsi_average_reference")); + m_LabelAdditionalChannels = GTK_LABEL(gtk_builder_get_object(m_builder, "label_tmsi_additional_channels")); + m_TableAdditionalChannels = GTK_TABLE(gtk_builder_get_object(m_builder, "table_tmsi_additional_channels")); + + g_signal_connect(G_OBJECT(m_comboBoxConnectionProtocol), "changed", G_CALLBACK(ComboBoxCommunicationProtocolChangedCB), this); + g_signal_connect(G_OBJECT(m_comboBoxDeviceID), "changed", G_CALLBACK(ComboBoxDeviceChangedCB), this); + g_signal_connect(G_OBJECT(m_buttonChannelCount), "changed", G_CALLBACK(ChannelCountChangedCB), this); + + // The order of the drivers corresponds to indexes in the ConnectionProtocols map inside the driver + gtk_combo_box_append_text(m_comboBoxConnectionProtocol, "USB"); + gtk_combo_box_append_text(m_comboBoxConnectionProtocol, "WiFi"); + gtk_combo_box_append_text(m_comboBoxConnectionProtocol, "Network"); + gtk_combo_box_append_text(m_comboBoxConnectionProtocol, "Bluetooth"); + + // Get the index of the currently set connection protocol from the map + gtk_combo_box_set_active(m_comboBoxConnectionProtocol, m_Driver->m_pTMSiAccess->getConnectionProtocols()[m_Driver->m_sConnectionProtocol].second); + + gtk_combo_box_set_active(m_comboBoxImpedanceLimit, gint(m_Driver->m_impedanceLimit)); + + // gtk_toggle_button_set_active(m_pToggleButtonCommonAverageReference, m_Driver->m_bCommonAverageReference); + gtk_spin_button_set_value(m_buttonChannelCount, double(m_Driver->m_activeEEGChannels)); + + return true; +} + +bool CConfigurationTMSi::postConfigure() +{ + if (m_applyConfig) + { + // set the channel count to the number of EEG channels + number of active additional channels + CTMSiAccess* tmsiAccess = m_Driver->m_pTMSiAccess; + + m_Driver->m_sConnectionProtocol = gtk_combo_box_get_active_text(m_comboBoxConnectionProtocol); + m_Driver->m_deviceID = gtk_combo_box_get_active_text(m_comboBoxDeviceID); + + // If the device was set to an actual existing device + if (m_Driver->m_deviceID != CString("")) + { + // m_Driver->m_bCommonAverageReference = gtk_toggle_button_get_active(m_pToggleButtonCommonAverageReference) != 0; + m_Driver->m_sActiveAdditionalChannels = getActiveAdditionalChannels(); + m_Driver->m_activeEEGChannels = gtk_spin_button_get_value_as_int(m_buttonChannelCount); + m_Driver->m_impedanceLimit = gtk_combo_box_get_active(m_comboBoxImpedanceLimit); + } + // If the device is unset then set all driver settings to neutral values + else + { + // m_Driver->m_bCommonAverageReference = 0; + m_Driver->m_sActiveAdditionalChannels = CString(";"); + m_Driver->m_activeEEGChannels = 0; + m_Driver->m_impedanceLimit = 1; + } + + // Increase the Channel Count spin button to the value of all active channels (EEG+additional) + uint32_t activeChannels = gtk_spin_button_get_value_as_int(m_buttonChannelCount); + + for (size_t idx = 0; idx < m_AdditionalChannelCheckButtons.size(); idx++) + { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_AdditionalChannelCheckButtons[idx]))) { activeChannels++; } + } + + GtkAdjustment* adjustment = gtk_spin_button_get_adjustment(m_buttonChannelCount); + gtk_adjustment_set_upper(adjustment, tmsiAccess->getActualChannelCount()); + gtk_adjustment_set_value(adjustment, activeChannels); + } + if (!CConfigurationBuilder::postConfigure()) { return false; } + + return true; +} + +void CConfigurationTMSi::showWaitWindow() +{ + if (m_waitWindow != nullptr) { return; } + + m_waitWindow = gtk_window_new(GTK_WINDOW_POPUP); + gtk_window_set_position(GTK_WINDOW(m_waitWindow), GTK_WIN_POS_CENTER); + gtk_window_set_decorated(GTK_WINDOW(m_waitWindow), FALSE); + gtk_window_set_modal(GTK_WINDOW(m_waitWindow), TRUE); + GdkColor bgColor; + bgColor.blue = 0; + bgColor.green = 0xffff; + bgColor.red = 0xffff; + gtk_widget_modify_bg(m_waitWindow, GTK_STATE_NORMAL, &bgColor); + GtkWidget* box = gtk_vbox_new(FALSE, 0); + GtkWidget* label = gtk_label_new(" COMMUNICATING WITH DEVICE... "); + gtk_box_pack_end(GTK_BOX(box), label, TRUE, TRUE, 10); + + gtk_container_add(GTK_CONTAINER(m_waitWindow), box); + + gtk_widget_show_all(m_waitWindow); + while (gtk_events_pending()) { gtk_main_iteration(); } +} + +void CConfigurationTMSi::hideWaitWindow() +{ + if (m_waitWindow != nullptr) + { + gtk_widget_destroy(GTK_WIDGET(m_waitWindow)); + m_waitWindow = nullptr; + } +} + +#endif // TARGET_HAS_ThirdPartyTMSi + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCConfigurationTMSi.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCConfigurationTMSi.h new file mode 100644 index 0000000..f83e97a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCConfigurationTMSi.h @@ -0,0 +1,53 @@ +/* + * ovasCConfigurationTMSi.h + * + * Copyright (c) 2014, Mensia Technologies SA. All rights reserved. + * -- Rights transferred to Inria, contract signed 21.11.2014 + * + */ + +#pragma once + +#include "../ovasCConfigurationBuilder.h" +#include + +namespace OpenViBE { +namespace AcquisitionServer { +class CDriverTMSi; + +class CConfigurationTMSi final : public CConfigurationBuilder +{ +public: + CConfigurationTMSi(const char* gtkBuilderFilename, CDriverTMSi* driver); + ~CConfigurationTMSi() override; + + bool preConfigure() override; + bool postConfigure() override; + + void fillDeviceCombobox() const; + bool fillSamplingFrequencyCombobox(); + void fillAdditionalChannelsTable(); + void clearAdditionalChannelsTable(); + CString getActiveAdditionalChannels(); + + void showWaitWindow(); + void hideWaitWindow(); + + CDriverTMSi* m_Driver = nullptr; + + GtkSpinButton* m_buttonChannelCount = nullptr; + GtkComboBox* m_comboBoxConnectionProtocol = nullptr; + GtkComboBox* m_comboBoxDeviceID = nullptr; + GtkComboBox* m_comboBoxSamplingFrequency = nullptr; + GtkComboBox* m_comboBoxImpedanceLimit = nullptr; + //GtkToggleButton* m_ButtonCommonAverageReference = nullptr; + GtkLabel* m_LabelAdditionalChannels = nullptr; + GtkTable* m_TableAdditionalChannels = nullptr; + std::vector m_AdditionalChannelCheckButtons; +private: + std::vector m_additionalChannelNames; + + GtkWidget* m_waitWindow = nullptr; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCDriverTMSi.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCDriverTMSi.cpp new file mode 100644 index 0000000..5dd6d1e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCDriverTMSi.cpp @@ -0,0 +1,256 @@ +/* + * ovasCDriverTMSi.cpp + * + * Copyright (c) 2014, Mensia Technologies SA. All rights reserved. + * -- Rights transferred to Inria, contract signed 21.11.2014 + * + */ + +#include "ovasCDriverTMSi.h" +#include "ovasCConfigurationTMSi.h" +#include "ovasCTMSiAccess.h" + +#if defined TARGET_HAS_ThirdPartyTMSi + +#include + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +// Public driver functions + +CDriverTMSi::CDriverTMSi(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_TMSi", m_driverCtx.getConfigurationManager()) +{ + // default parameters, will be overriden by saved settings + m_header.setSamplingFrequency(512); + m_header.setChannelCount(32); + m_sConnectionProtocol = "USB"; + m_deviceID = ""; + m_bCommonAverageReference = true; + m_activeEEGChannels = 0; + m_sActiveAdditionalChannels = ";"; + m_impedanceLimit = 1; + + m_settings.add("Header", &m_header); + m_settings.add("ConnectionProtocol", &m_sConnectionProtocol); + m_settings.add("DeviceIdentifier", &m_deviceID); + // m_settings.add("CommonAverageReference", &m_bCommonAverageReference); + m_settings.add("ActiveEEGChannels", &m_activeEEGChannels); + m_settings.add("ActiveAdditionalChannels", &m_sActiveAdditionalChannels); + m_settings.add("ImpedanceLimit", &m_impedanceLimit); + m_settings.load(); + + m_valid = true; + + if (!m_valid) { return; } + + m_pTMSiAccess = new CTMSiAccess(m_driverCtx); +} + + +bool CDriverTMSi::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (!m_valid || m_driverCtx.isConnected()) { return false; } + + // Show a window prompting the user to wait, this window is automatically closed when the Configuration object is destroyed + CConfigurationTMSi config(Directories::getDataDir() + "/applications/acquisition-server/interface-TMSi.ui", this); + config.showWaitWindow(); + + + if (m_deviceID == CString("")) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "No TMSi device selected" << "\n"; + return false; + } + if (m_header.getSamplingFrequency() == 0) { m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "No Sampling Frequency selected" << "\n"; } + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + m_pTMSiAccess->initializeTMSiLibrary(m_sConnectionProtocol.toASCIIString()); + m_pTMSiAccess->openFrontEnd(m_deviceID.toASCIIString()); + + + // by default CAR (called Common Mode Rejection in TMSi documents) is enabled, one can disable it by token + m_bCommonAverageReference = !(m_driverCtx.getConfigurationManager().expandAsBoolean("${AcquisitionServer_TMSI_DisableCommonModeRejection}", false)); + + if (!m_pTMSiAccess->setCommonModeRejection(m_bCommonAverageReference)) + { + m_pTMSiAccess->closeFrontEnd(); + return false; + } + + if (!m_pTMSiAccess->runDiagnostics()) + { + m_pTMSiAccess->closeFrontEnd(); + return false; + } + /* + // Get Time + SYSTEMTIME time; + if(m_fpGetRtcTime( m_libraryHandle, &time )) + { + char str[255]; + sprintf(str, "Current Device Time Weekday %d on %d-%d-%d Time %d:%d:%d", time.wDayOfWeek, time.wDay, time.wMonth, time.wYear, time.wHour, time.wMinute, time.wSecond ); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) " << str << "\n"; + } + else + { + int code = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) " << "Error getting time from device, errorcode = " << code << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, code) << "\"" << "\n"; + return false; + } + + // Set Time + GetLocalTime(&time); + if(m_fpSetRtcTime(m_libraryHandle, &time )) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) " << "Time set" << "\n"; + } + else + { + int code = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) " << "Error setting time on device, errorcode = " << code << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, code) << "\"" << "\n"; + return false; + } + */ + + // Get Signal Format + if (m_pTMSiAccess->calculateSignalFormat(m_deviceID)) { m_pTMSiAccess->printSignalFormat(); } + else + { + m_pTMSiAccess->closeFrontEnd(); + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) " << "Number of Channels on [" << m_deviceID << "]" << " = " << uint64_t( + m_pTMSiAccess->getActualChannelCount()) << "\n"; + + if (!m_pTMSiAccess->setSignalBuffer(m_header.getSamplingFrequency() * 1000, m_header.getSamplingFrequency() * 10)) + { + m_pTMSiAccess->closeFrontEnd(); + return false; + } + + m_pTMSiAccess->setActiveChannels(&m_header, m_sActiveAdditionalChannels); + + m_sample = new float[m_header.getChannelCount() * nSamplePerSentBlock]; + if (!m_sample) + { + delete [] m_sample; + m_sample = nullptr; + return false; + } + + if (!m_pTMSiAccess->getConnectionProperties()) + { + m_pTMSiAccess->closeFrontEnd(); + return false; + } + + if (m_driverCtx.isImpedanceCheckRequested()) + { + // Acquisition on the device must be started in order to set the acquiring mode to impedance + if (!m_pTMSiAccess->startAcquisition()) { return false; } + if (!m_pTMSiAccess->setSignalMeasuringModeToImpedanceCheck(int(m_impedanceLimit))) + { + m_pTMSiAccess->stopAcquisition(); + m_bIgnoreImpedanceCheck = true; + } + else + { + m_impedances.resize(m_header.getChannelCount()); + m_bIgnoreImpedanceCheck = false; + } + } + + // @todo modify the API to provide this info (depends on the device) + for (size_t i = 0; i < m_header.getChannelCount(); ++i) { m_header.setChannelUnits(i, OVTK_UNIT_Unspecified, OVTK_FACTOR_Base); } + + return true; +} + +bool CDriverTMSi::start() +{ + if (!m_valid || !m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_driverCtx.isImpedanceCheckRequested()) + { + m_pTMSiAccess->setSignalMeasuringModeToNormal(); + m_pTMSiAccess->stopAcquisition(); + } + // sometimes the driver might refuse to start, some sampling frequencies can be set but not used for example + if (!m_pTMSiAccess->startAcquisition()) { return false; } + + // TODO_JL Do impedance check when applicable + + m_totalSampleReceived = 0; + return true; +} + +bool CDriverTMSi::loop() +{ + if (!m_valid || !m_driverCtx.isConnected()) { return false; } + if (m_driverCtx.isStarted()) + { + const int bytesReceived = m_pTMSiAccess->getSamples(m_sample, m_callback, m_nSamplePerSentBlock, m_header.getSamplingFrequency()); + + if (bytesReceived >= 0) { m_totalSampleReceived += bytesReceived; } + else { return false; } + } + else + { + if (m_driverCtx.isImpedanceCheckRequested() && !m_bIgnoreImpedanceCheck) + { + if (!m_pTMSiAccess->getImpedanceValues(&m_impedances)) { return false; } + + for (size_t i = 0; i < m_header.getChannelCount(); ++i) { m_driverCtx.updateImpedance(i, m_impedances[i]); } + } + } + + return true; +} + +bool CDriverTMSi::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) " << ">Stop TMSI\n"; + + m_pTMSiAccess->stopAcquisition(); + + m_totalSampleReceived = 0; + return true; +} + +bool CDriverTMSi::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) " << ">Uninit TMSI\n"; + + m_pTMSiAccess->stopAcquisition(); + m_pTMSiAccess->freeSignalFormat(); + + if (!m_pTMSiAccess->closeFrontEnd()) { return false; } + + return true; +} + +bool CDriverTMSi::configure() +{ + CConfigurationTMSi config(Directories::getDataDir() + "/applications/acquisition-server/interface-TMSi.ui", this); + + const bool result = config.configure(m_header); + if (!result) { return false; } + + m_settings.save(); + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCDriverTMSi.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCDriverTMSi.h new file mode 100644 index 0000000..420787f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCDriverTMSi.h @@ -0,0 +1,82 @@ +/* + * ovasCDriverTMSi.h + * + * Copyright (c) 2014, Mensia Technologies SA. All rights reserved. + * -- Rights transferred to Inria, contract signed 21.11.2014 + * + */ + +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include "ovas_base.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#if defined TARGET_OS_Windows + +// Get Signal info + + +namespace OpenViBE { +namespace AcquisitionServer { +class CTMSiAccess; + +/** + * \class CDriverTMSi + * \author Mensia Technologies + */ +class CDriverTMSi final : public IDriver +{ +public: + + explicit CDriverTMSi(IDriverContext& ctx); + ~CDriverTMSi() override { this->uninitialize(); } + void release() { delete this; } + const char* getName() override { return "TMSi amplifiers"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + // saved parameters + CString m_sConnectionProtocol; + CString m_deviceID; + bool m_bCommonAverageReference = false; + uint64_t m_activeEEGChannels = 0; + CString m_sActiveAdditionalChannels; + uint64_t m_impedanceLimit = 0; + + CTMSiAccess* m_pTMSiAccess = nullptr; + CHeader m_header; + +protected: + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + + uint32_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + std::vector m_impedances; + + bool m_valid = false; + + uint32_t m_totalSampleReceived = 0; + CStimulationSet m_stimSet; + +private: + bool m_bIgnoreImpedanceCheck = false; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCTMSiAccess.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCTMSiAccess.cpp new file mode 100644 index 0000000..587a813 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCTMSiAccess.cpp @@ -0,0 +1,930 @@ +/* + * ovasCTMSiAccess.cpp + * + * Copyright (c) 2014, Mensia Technologies SA. All rights reserved. + * -- Rights transferred to Inria, contract signed 21.11.2014 + * + */ + +#if defined TARGET_HAS_ThirdPartyTMSi + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include "ovasCTMSiAccess.h" + +#include +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +static const std::string TMSI_DLL = "TMSiSDK.dll"; +//static const unsigned long s_ulLengthOfBufferInSeconds = 10; +static const int CALIBRATION_VOLTAGE = IC_VOLT_050; +//static const int s_iImpedanceLimit = IC_OHM_005; + +HINSTANCE libTMSi; // Library Handle + +template +void CTMSiAccess::loadDLLFunct(T* functionPointer, const char* functionName) +{ + *functionPointer = T(GetProcAddress(libTMSi, functionName)); + if (!*functionPointer) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "(TMSi) Load method " << functionName << "\n"; + m_valid = false; + } +} + +CTMSiAccess::CTMSiAccess(IDriverContext& ctx) + : m_driverCtx(ctx) +{ + // Create a map of available protocols, each protocol has an Enum value coming from TMSi and an index (used for the dropbown box) + m_connectionProtocols["USB"] = std::make_pair(TMSiConnectionUSB, 0); + m_connectionProtocols["WiFi"] = std::make_pair(TMSiConnectionWifi, 1); + m_connectionProtocols["Network"] = std::make_pair(TMSiConnectionNetwork, 2); + m_connectionProtocols["Bluetooth"] = std::make_pair(TMSiConnectionBluetooth, 3); + + m_libraryHandle = nullptr; + m_sampleBuffer = nullptr; + m_signalFormat = nullptr; + + // Load the Mensia Acquisition Library + const std::string path = std::string(m_driverCtx.getConfigurationManager().expand("${Path_Bin}").toASCIIString()) + "/" + TMSI_DLL; + libTMSi = ::LoadLibrary(path.c_str()); + + if (libTMSi == nullptr) + { + const DWORD windowsError = GetLastError(); + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "(TMSi) Can not load library, windows error = " << uint64_t(windowsError) << "\n"; + } + + m_valid = true; + + loadDLLFunct(&m_fpOpen, "Open"); + loadDLLFunct(&m_fpClose, "Close"); + loadDLLFunct(&m_fpStart, "Start"); + loadDLLFunct(&m_fpStop, "Stop"); + loadDLLFunct(&m_fpSetSignalBuffer, "SetSignalBuffer"); + loadDLLFunct(&m_fpGetBufferInfo, "GetBufferInfo"); + loadDLLFunct(&m_fpGetSamples, "GetSamples"); + loadDLLFunct(&m_fpGetSignalFormat, "GetSignalFormat"); + loadDLLFunct(&m_fpFree, "Free"); + loadDLLFunct(&m_fpLibraryInit, "LibraryInit"); + loadDLLFunct(&m_fpLibraryExit, "LibraryExit"); + loadDLLFunct(&m_fpGetFrontEndInfo, "GetFrontEndInfo"); + + loadDLLFunct(&m_fpSetRtcTime, "SetRtcTime"); + loadDLLFunct(&m_fpGetRtcTime, "GetRtcTime"); + loadDLLFunct(&m_fpGetErrorCode, "GetErrorCode"); + loadDLLFunct(&m_fpGetErrorCodeMessage, "GetErrorCodeMessage"); + + loadDLLFunct(&m_fpGetDeviceList, "GetDeviceList"); + loadDLLFunct(&m_fpFreeDeviceList, "FreeDeviceList"); + + loadDLLFunct(&m_fpSetRefCalculation, "SetRefCalculation"); + loadDLLFunct(&m_fpGetConnectionProperties, "GetConnectionProperties"); + loadDLLFunct(&m_fpSetMeasuringMode, "SetMeasuringMode"); + loadDLLFunct(&m_fpGetExtFrontEndInfo, "GetExtFrontEndInfo"); + + /* + // NeXus10MkII functionality + loadDLLFunct(&m_fpGetRandomKey, "GetRandomKey"); + loadDLLFunct(&m_fpUnlockFrontEnd, "UnlockFrontEnd"); + loadDLLFunct(&m_fpGetOEMSize, "GetOEMSize"); + loadDLLFunct(&m_fpSetOEMData, "SetOEMData"); + loadDLLFunct(&m_fpGetOEMData, "GetOEMData"); + loadDLLFunct(&m_oFopenFirstDevice, "OpenFirstDevice"); + loadDLLFunct(&m_fpSetStorageMode, "SetStorageMode"); + loadDLLFunct(&m_fpGetFlashStatus, "GetFlashStatus"); + loadDLLFunct(&m_fpStartFlashData, "StartFlashData"); + loadDLLFunct(&m_fpGetFlashSamples, "GetFlashSamples"); + loadDLLFunct(&m_fpStopFlashData, "StopFlashData"); + loadDLLFunct(&m_fpFlashEraseMemory, "FlashEraseMemory"); + loadDLLFunct(&m_fpSetFlashData, "SetFlashData"); +*/ +} + +CTMSiAccess::~CTMSiAccess() +{ + // Close the intefrace if it is still open, should prevent device locking in some cases + if (m_opened) { closeFrontEnd(); } + if (m_libraryHandle != nullptr) { m_fpLibraryExit(m_libraryHandle); } + FreeLibrary(libTMSi); +} + +bool CTMSiAccess::initializeTMSiLibrary(const char* connectionProtocol) +{ + if (!m_valid) { return false; } + + // TODO_JL block this function if the driver is in use + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "(TMSi) Initializing TMSi library on [" << connectionProtocol << "] protocol \n"; + const ETmSiConnection connection = m_connectionProtocols[connectionProtocol].first; + + int error; + + if (m_libraryHandle != nullptr) + { + // if the library is already in use then exit it first + m_fpLibraryExit(m_libraryHandle); + m_libraryHandle = nullptr; + } + + m_libraryHandle = m_fpLibraryInit(connection, &error); + + if (error != 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "(TMSi) Can not initialize TMSi library, errorcode = " << error << "\n"; + m_libraryHandle = nullptr; + return false; + } + + if (m_libraryHandle == INVALID_HANDLE_VALUE) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "(TMSi) Can not initialize TMSi library, INVALID_ERROR_HANDLE\n"; + m_libraryHandle = nullptr; + return false; + } + + int nDevices; + // Once the library is initialized, get the list of devices on the frontend + char** deviceList = m_fpGetDeviceList(m_libraryHandle, &nDevices); + m_devices.clear(); + + if (nDevices == 0) + { + error = m_fpGetErrorCode(m_libraryHandle); + if (error == 0) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "(TMSi) No TMSi devices connected\n"; } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Could not list TMSi devices, errorcode = " << error + << " message : \"" << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + } + + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "(TMSi) Found [" << nDevices << "] TMSi devices\n"; + + for (int i = 0; i < nDevices; ++i) { m_devices.push_back(CString(deviceList[i])); } + + // the device list allocated in the library has to be freed + m_fpFreeDeviceList(m_libraryHandle, nDevices, deviceList); + + m_isInitialized = true; + return true; +} + +bool CTMSiAccess::openFrontEnd(const char* deviceID) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Opening FrontEnd [" << deviceID << "]\n"; + if (m_libraryHandle == nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) TMSi library not accessible\n"; + return false; + } + + if (m_fpOpen(m_libraryHandle, deviceID)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend opened\n"; } + else + { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Frontend NOT available, errorcode = " << error << ", message=\"" << + m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + + // If we receive "Access Refused (10061)" error we show a dialog prompting the user to restart his device + GtkWidget* gtkMessageDialog = error == 10061 + ? gtk_message_dialog_new_with_markup(nullptr, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, + "The device %s is present but refuses access. It might be connected to another instance of OpenViBE. Restarting the device might help", + deviceID) + : gtk_message_dialog_new_with_markup(nullptr, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, + "The device %s is present but can not be opened. Restarting the device might help. Error reported by driver : %s", + deviceID, m_fpGetErrorCodeMessage(m_libraryHandle, error)); + + gtk_dialog_run(GTK_DIALOG(gtkMessageDialog)); + gtk_widget_destroy(gtkMessageDialog); + + // if we fail to open the frontend we close the library immediately + //m_fpLibraryExit(m_libraryHandle); + //m_libraryHandle = nullptr; + return false; + } + + m_opened = true; + return true; +} + +bool CTMSiAccess::closeFrontEnd() +{ + if (m_libraryHandle == nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) TMSi library not accessible\n"; + return false; + } + + if (!m_opened) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not close unopened FrontEnd\n"; + return false; + } + + if (m_fpClose(m_libraryHandle)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend closed\n"; } + else + { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not close frontend, errorcode = " << error << ", message=\"" << + m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + return false; + } + + m_opened = false; + m_hasChannelStructure = false; + m_hasBufferSet = false; + return true; +} + +std::vector CTMSiAccess::discoverDeviceSamplingFrequencies() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Checking for sampling frequencies\n"; + + std::vector samplings; + + m_maxBufferSize = MAX_BUFFER_SIZE; + samplings.push_back(128 * 1000); + samplings.push_back(256 * 1000); + samplings.push_back(512 * 1000); + samplings.push_back(1024 * 1000); + samplings.push_back(2048 * 1000); + + if (!m_opened) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) No FrontEnd opened\n"; + samplings.clear(); + return samplings; + } + + for (size_t i = 0; i < samplings.size(); ++i) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Trying frequency [" << uint64_t(samplings[i]) << "]\n"; + + unsigned long sampling = samplings[i]; + + // Max bufer size will be set to the right value in this step + if (m_fpSetSignalBuffer(m_libraryHandle, &sampling, &m_maxBufferSize)) + { + samplings[i] = sampling; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Sample rate: " << uint64_t(sampling) << ", Buffer Size: " << + uint64_t(m_maxBufferSize) << "\n"; + } + else + { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "(TMSi) Failed to set sampling frequency, errorcode = " << error + << ", message = \"" << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + samplings.clear(); + return samplings; + } + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Sampling frequencies OK\n"; + return samplings; +} + +bool CTMSiAccess::runDiagnostics() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Running diagnostics\n"; + + if (!m_opened) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) No FrontEnd opened\n"; + return false; + } + + front_end_info_t frontEndInfo; + + if (m_fpGetFrontEndInfo(m_libraryHandle, &frontEndInfo)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend has Serial " << size_t(frontEndInfo.Serial) << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend has HwVersion " << frontEndInfo.HwVersion << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend has SwVersion " << frontEndInfo.SwVersion << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend has BaseSf " << frontEndInfo.BaseSf << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend has maxRS232 " << frontEndInfo.maxRS232 << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend has " << frontEndInfo.NrOfChannels << " channels\n"; + } + else + { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) FrontendInfo NOT available, errorcode = " << error << ", message=\"" << + m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + // return false; + } + + tmsi_bat_report_type_t TMSiBatReport; + tmsi_storage_report_type_t TMSiStorageReport; + tmsi_device_report_type_t TMSiDeviceReport; + tmsi_ext_frontend_info_type_t TMSiExtFrontEndInfo; + + if (m_fpGetExtFrontEndInfo(m_libraryHandle, &TMSiExtFrontEndInfo, &TMSiBatReport, &TMSiStorageReport, &TMSiDeviceReport)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) CurrentSamplerate " << TMSiExtFrontEndInfo.CurrentSamplerate << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) CurrentBlockType " << TMSiExtFrontEndInfo.CurrentBlockType << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) CurrentInterface " << TMSiExtFrontEndInfo.CurrentInterface << "\n"; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) MemoryStatus.TotalSize " << TMSiStorageReport.TotalSize << " MByte\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) MemoryStatus.UsedSpace " << TMSiStorageReport.UsedSpace << " MByte\n"; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) BatteryStatus.AccumCurrent " << TMSiBatReport.AccumCurrent << " mA\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) BatteryStatus.Current " << TMSiBatReport.Current << " mA\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) BatteryStatus.Temp " << TMSiBatReport.Temp << " C\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) BatteryStatus.Voltage " << TMSiBatReport.Voltage << " mV\n"; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) STmSiDeviceReport.AdapterSerial " << TMSiDeviceReport.AdapterSN << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) STmSiDeviceReport.AdapterCycles " << TMSiDeviceReport.AdapterCycles << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) STmSiDeviceReport.AdapterStatus " << TMSiDeviceReport.AdapterStatus << "\n"; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) STmSiDeviceReport.MobitaCycles " << TMSiDeviceReport.MobitaCycles << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) STmSiDeviceReport.MobitaStatus " << TMSiDeviceReport.MobitaStatus << "\n"; + } + else + { + const int error = m_fpGetErrorCode(m_libraryHandle); + // Most of the devices do not have the extended frontend info so this message will popup quite often + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "(TMSi) Extended FrontendInfo NOT available, errorcode = " << error << ", message=\"" + << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + // return false; + } + + // only fails if the device is not opened, as not all devices support the getFrontEndInfo and getExtFrontEndInfo functions + //m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Diagnostics OK\n"; + return true; +} + +bool CTMSiAccess::getImpedanceTestingCapability(bool* hasImpedanceTestingAbility) const +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Getting impedance capability\n"; + + if (!m_opened) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) No FrontEnd opened\n"; + return false; + } + + front_end_info_t frontEndInfo; + + if (m_fpGetFrontEndInfo(m_libraryHandle, &frontEndInfo)) + { + // get the first three numbers from the serial number + // TMSi devices that can measure impedance have their serial numbers starting by a number between 107 and 128 + char serialNumber[1024]; + sprintf(serialNumber, "%lu", frontEndInfo.Serial); + + char deviceIdentifier[4]; + strncpy(deviceIdentifier, serialNumber, 3); + deviceIdentifier[3] = 0; + + const int deviceID = atoi(deviceIdentifier); + + *hasImpedanceTestingAbility = (deviceID >= 107 && deviceID <= 128); + } + else + { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) FrontendInfo NOT available, errorcode = " << error << ", message=\"" + << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + // return false; + } + return true; +} + +bool CTMSiAccess::calculateSignalFormat(const char* deviceID) +{ + if (!m_opened) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) No FrontEnd opened\n"; + return false; + } + + m_hasChannelStructure = false; + m_nActualChannel = 0; + m_nMaxEEGChannel = 0; + + char deviceIdentifier[1024]; + strcpy(deviceIdentifier, deviceID); + m_signalFormat = m_fpGetSignalFormat(m_libraryHandle, deviceIdentifier); + + if (m_signalFormat == nullptr) + { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi)Error getting channel format, errorcode = " << error << ", message=\"" << + m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + return false; + } + + // Count the EEG channels + m_nMaxEEGChannel = 0; + + m_nActualChannel = m_signalFormat->Elements; + // go through the channels and find the number of EEG channels and additional channels + // NOTE that this ONLY work if all EEG channels are listed first + for (size_t i = 0; i < size_t(m_signalFormat->Elements); ++i) + { + if (m_signalFormat[i].Type == CHANNELTYPE_EXG) { m_nMaxEEGChannel++; } + else if (m_signalFormat[i].Type == CHANNELTYPE_BIP) { m_nMaxEEGChannel++; } + else if (m_signalFormat[i].Type == CHANNELTYPE_AUX) { m_nMaxEEGChannel++; } + } + + m_hasChannelStructure = true; + + // the pointer is initialized and held by the library so we can store it + return true; +} + +bool CTMSiAccess::printSignalFormat() +{ + if (m_signalFormat != nullptr) + { + for (int i = 0; i < int(m_signalFormat->Elements); ++i) + { + char channelInfo[1024]; + CString channelName = getChannelName(i); + + sprintf(channelInfo, "%3d: %s Format %d Type %d Bytes %d Subtype %d UnitId %d UnitExponent %d", i, channelName.toASCIIString(), + int(m_signalFormat[i].Format), int(m_signalFormat[i].Type), int(m_signalFormat[i].Bytes), int(m_signalFormat[i].SubType), + int(m_signalFormat[i].UnitId), int(m_signalFormat[i].UnitExponent)); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) " << channelInfo << "\n"; + } + } + else { return false; } + + return true; +} + +CString CTMSiAccess::getChannelName(const size_t index) const +{ + if (m_signalFormat == nullptr || index >= m_signalFormat->Elements) { return ""; } + + char channelName[SIGNAL_NAME + 1]; + for (int i = 0; i < SIGNAL_NAME; ++i) { channelName[i] = char(m_signalFormat[index].Name[i]); } + channelName[SIGNAL_NAME] = '\0'; + + return CString(channelName); +} + +CString CTMSiAccess::getChannelType(const size_t index) const +{ + if (m_signalFormat == nullptr || index >= m_signalFormat->Elements) { return ""; } + + switch (m_signalFormat[index].Type) + { + case CHANNELTYPE_UNKNOWN: return CString("Unknown"); + case CHANNELTYPE_EXG: return CString("EXG"); + case CHANNELTYPE_BIP: return CString("BIP"); + case CHANNELTYPE_AUX: return CString("AUX"); + case CHANNELTYPE_DIG: return CString("DIG"); + case CHANNELTYPE_TIME: return CString("TIME"); + case CHANNELTYPE_LEAK: return CString("LEAK"); + case CHANNELTYPE_PRESSURE: return CString("PRESSURE"); + case CHANNELTYPE_ENVELOPE: return CString("ENVELOPE"); + case CHANNELTYPE_MARKER: return CString("MARKER"); + case CHANNELTYPE_SAW: return CString("RAMP"); + case CHANNELTYPE_SAO2: return CString("SAO2"); + default: return CString("Unknown"); + } +} + +void CTMSiAccess::freeSignalFormat() +{ + if (m_signalFormat != nullptr) + { + m_fpFree(m_signalFormat); + m_signalFormat = nullptr; + } +} + +bool CTMSiAccess::setCommonModeRejection(const bool isCommonModeRejectionEnabled) +{ + const int statusCAR = isCommonModeRejectionEnabled ? 1 : 0; + + if (m_fpSetRefCalculation(m_libraryHandle, statusCAR)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Common mode rejection set to " << statusCAR << "\n"; + } + else + { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not set common mode rejection, errorcode = " << error << ", message=\"" + << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + return false; + } + + return true; +} + +bool CTMSiAccess::setActiveChannels(CHeader* header, const CString& additionalChannels) +{ + const size_t activeChannels = header->getChannelCount(); + bool hasRenamedAChannel = false; + + m_isChannelsActivated.clear(); + m_isChannelsActivated.resize(m_nActualChannel, false); + + size_t nActiveAdditionalChannel = 0; + + for (size_t i = m_nMaxEEGChannel; i < m_nActualChannel; ++i) + { + if (std::string(additionalChannels.toASCIIString()).find( + std::string(";") + std::string(getChannelName(i).toASCIIString()) + std::string(";")) != std::string::npos) + { + m_isChannelsActivated[i] = true; + nActiveAdditionalChannel++; + } + else { m_isChannelsActivated[i] = false; } + } + + const size_t activeEEGChannelIdx = activeChannels - nActiveAdditionalChannel; + + for (size_t i = 0; i < activeEEGChannelIdx; ++i) + { + m_isChannelsActivated[i] = true; + if (strcmp(header->getChannelName(i), "") != 0) { hasRenamedAChannel = true; } + } + for (size_t i = activeEEGChannelIdx; i < m_nMaxEEGChannel; ++i) { m_isChannelsActivated[i] = false; } + + m_nActiveChannel = activeChannels; + + // set names of EEG channels if none were renamed + if (!hasRenamedAChannel) { for (size_t i = 0; i < activeEEGChannelIdx; i++) { header->setChannelName(i, getChannelName(i)); } } + + // set names of additional channels + size_t currentChannel = activeEEGChannelIdx; + for (size_t i = m_nMaxEEGChannel; i < m_nActualChannel; i++) + { + if (m_isChannelsActivated[i]) + { + header->setChannelName(currentChannel, getChannelName(i)); + currentChannel++; + } + } + + return true; +} + +bool CTMSiAccess::setSignalBuffer(const unsigned long sampling, unsigned long bufferSizeInSamples) +{ + if (!m_opened) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) No FrontEnd opened\n"; + return false; + } + + if (!m_hasChannelStructure) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) The SignalFormat structure was not initialized\n"; + return false; + } + + // if the buffer size in samples is too big, change it automatically to the MAX for the current device + if (bufferSizeInSamples > m_maxBufferSize) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) The desired buffer size is too large, setting to maximum for the device instead" + << "\n"; + bufferSizeInSamples = m_maxBufferSize; + } + + ULONG samplingFrequency = sampling; + ULONG size = bufferSizeInSamples; + + if (m_fpSetSignalBuffer(m_libraryHandle, &samplingFrequency, &size)) + { + if (samplingFrequency == sampling && size == bufferSizeInSamples) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) SignalBuffer set to " << uint64_t(samplingFrequency) << " " << + uint64_t(size) << "\n"; + } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend does not support this Sampling Rate/Buffer Size combination\n"; + return false; + } + } + else + { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not setSignalBuffer, errorcode = " << error << ", message=\"" + << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + return false; + } + + if (m_sampleBuffer != nullptr) + { + delete[] m_sampleBuffer; + m_sampleBuffer = nullptr; + } + + + m_signalBufferSizeInBytes = size * m_nActualChannel * sizeof(m_sampleBuffer[0]); + m_sampleBuffer = new unsigned long[m_signalBufferSizeInBytes]; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Allocating sample buffer with " << uint32_t(m_signalBufferSizeInBytes) << "\n"; + + m_hasBufferSet = true; + + return true; +} + +bool CTMSiAccess::setSignalMeasuringModeToCalibration() { return setSignalMeasuringMode(MEASURE_MODE_CALIBRATION_EX); } + +bool CTMSiAccess::setSignalMeasuringModeToImpedanceCheck(const int limit) { return setSignalMeasuringMode(MEASURE_MODE_IMPEDANCE_EX, limit); } + +bool CTMSiAccess::setSignalMeasuringModeToNormal() { return setSignalMeasuringMode(MEASURE_MODE_NORMAL); } + +bool CTMSiAccess::startAcquisition() +{ + if (m_isStarted) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Acquisition has already been started\n"; + return true; + } + + if (m_libraryHandle == nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) TMSi library not accessible\n"; + return false; + } + + if (!m_hasBufferSet) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not start acquisition without setting buffer first\n"; + return false; + } + + if (m_fpStart(m_libraryHandle)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Starting Acquisition\n"; } + else + { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not start acqusition, errorcode = " << error << ", message=\"" << + m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + return false; + } + + m_lastSampleIndexInBuffer = 0; + m_isStarted = true; + + return true; +} + +bool CTMSiAccess::stopAcquisition() +{ + if (m_libraryHandle == nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) TMSi library not accessible\n"; + return false; + } + + if (!m_isStarted) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Acquisition has not been started yet\n"; + return true; + } + + if (m_fpStop(m_libraryHandle)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Stopping Acquisition\n"; } + else + { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not stop acqusition, errorcode = " << error << ", message=\"" << + m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + return false; + } + + getConnectionProperties(); + m_lastSampleIndexInBuffer = 0; + m_isStarted = false; + return true; +} + +int CTMSiAccess::getSamples(float* samples, IDriverCallback* driverCB, const uint64_t nSamplePerSentBlock, const uint32_t sampling) +{ + // since this function is called all the time, we do not do safety checks + const long nBytesReceived = m_fpGetSamples(m_libraryHandle, m_sampleBuffer, m_signalBufferSizeInBytes); + + if (nBytesReceived > 0) + { + const uint32_t samplesReceived = nBytesReceived / m_nActualChannel / sizeof(m_sampleBuffer[0]); + + for (uint32_t i = 0; i < samplesReceived; ++i) + { + uint32_t virtualChannel = 0; + for (uint32_t c = 0; c < m_nActualChannel; ++c) + { + if (m_isChannelsActivated[c]) + { + // pointer to the current sample inside the signal sample buffer + float* sampleValueInFloat = &samples[virtualChannel * nSamplePerSentBlock + m_lastSampleIndexInBuffer]; + // std::cout << virtualChannel * m_nActiveChannel + m_sampleIdx << std::endl; + + const psignal_format_t currentSampleSignalFormat = &m_signalFormat[c]; + + // Calculate the floating value from the received integer value + // For overflow of a analog channel, set the value to zero + if (m_sampleBuffer[c + i * m_nActualChannel] == OVERFLOW_32BITS && + (currentSampleSignalFormat->Type == CHANNELTYPE_EXG || + currentSampleSignalFormat->Type == CHANNELTYPE_BIP || + currentSampleSignalFormat->Type == CHANNELTYPE_AUX)) + { + *sampleValueInFloat = 0; // Set it to a value you find a good sign of a overflow + } + + else + { + switch (currentSampleSignalFormat->Format) + { + case SF_UNSIGNED: // unsigned integer + *sampleValueInFloat = float(m_sampleBuffer[c + i * m_nActualChannel] * currentSampleSignalFormat->UnitGain + + currentSampleSignalFormat->UnitOffSet); + break ; + case SF_INTEGER: // signed integer + *sampleValueInFloat = float(int(m_sampleBuffer[c + i * m_nActualChannel]) * currentSampleSignalFormat->UnitGain + + currentSampleSignalFormat->UnitOffSet); + break ; + default: + *sampleValueInFloat = 0; // For unknown types, set the value to zero + break ; + } + } + + virtualChannel++; + } + + // process DIGI channel, to receive hardware stimulations + if (m_signalFormat[c].Type == CHANNELTYPE_DIG) + { + uint32_t trigger = m_sampleBuffer[i * m_nActualChannel + c]; + + // invert bits + trigger = ~trigger; + + // mask for bits 0-7 (see Refa manual) + trigger &= 255; + + // add 0x8100 to match OVTK_StimulationId_Label_00 stimulation code + trigger += 0x8100U; + + // add stimulation to SimulationSet + if (m_lastTriggerValue != trigger) + { + const uint64_t time = CTime(sampling, uint64_t(m_lastSampleIndexInBuffer)).time(); + m_stimSet.appendStimulation(trigger, time, 0); + m_lastTriggerValue = trigger; + } + } + } + m_lastSampleIndexInBuffer++; + + if (m_lastSampleIndexInBuffer == nSamplePerSentBlock) + { + driverCB->setSamples(samples); + driverCB->setStimulationSet(m_stimSet); + m_stimSet.clear(); + m_lastSampleIndexInBuffer = 0; + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + } + } + else if (nBytesReceived == 0) + { + ULONG overflow, percentFull; + const int status = m_fpGetBufferInfo(m_libraryHandle, &overflow, &percentFull); + + if (status != 0 && overflow > 0 && percentFull > 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Overflow " << int(overflow) << " PercentFull " << int(percentFull) << "\n"; + } + } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not read data, errorcode = " << nBytesReceived << ", message=\"" << + m_fpGetErrorCodeMessage(m_libraryHandle, nBytesReceived) << "\"\n"; + + const int code = m_fpGetErrorCode(m_libraryHandle); + if (code != 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Additional error, errorcode = " << code << ", message=\"" << + m_fpGetErrorCodeMessage(m_libraryHandle, code) << "\"\n"; + } + return -1; + } + + return nBytesReceived; +} + +bool CTMSiAccess::getImpedanceValues(std::vector* impedanceValues) +{ + impedanceValues->resize(m_nActualChannel); + + // since this function is called all the time, we do not do safety checks + const long nBytesReceived = m_fpGetSamples(m_libraryHandle, m_sampleBuffer, m_signalBufferSizeInBytes); + + if (nBytesReceived > 0) + { + // We only look at the first sample in the whole buffer, no need to look at all values + for (uint32_t i = 0; i < 1; ++i) + { + uint32_t virtualChannel = 0; + for (uint32_t c = 0; c < m_nActualChannel; ++c) + { + if (m_isChannelsActivated[c]) + { + // Impedance values are returned in MOhm it seems + (*impedanceValues)[virtualChannel] = m_sampleBuffer[c + i * m_nActualChannel] * 1000.0; + virtualChannel++; + } + } + } + } + else if (nBytesReceived == 0) { } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not read impedance data, errorcode = " << nBytesReceived << ", message=\"" << + m_fpGetErrorCodeMessage(m_libraryHandle, nBytesReceived) << "\"\n"; + + const int error = m_fpGetErrorCode(m_libraryHandle); + if (error != 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Additional error, errorcode = " << error << ", message=\"" << + m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + } + return false; + } + + return true; +} + +bool CTMSiAccess::getConnectionProperties() const +{ + uint32_t signalStrength; + uint32_t nCrcErrors; + uint32_t nSampleBlocks; + + if (m_fpGetConnectionProperties(m_libraryHandle, &signalStrength, &nCrcErrors, &nSampleBlocks)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) fpGetConnectionProperties SignalStrength " << signalStrength + << " NrOfCRCErrors " << nCrcErrors << " NrOfSampleBlocks " << nSampleBlocks << "\n"; + } + else + { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Error getting channel format, errorcode = " << error + << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + return false; + } + + return true; +} + +// PRIVATE METHODS + +bool CTMSiAccess::setSignalMeasuringMode(const ULONG measuringMode, const int value) +{ + if (!m_opened) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) No FrontEnd opened\n"; + return false; + } + + if (!m_isStarted) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) This method must be called after the frontend is started\n"; + return false; + } + + int modeValue = 0; + CString modeName("Normal"); + + if (measuringMode == MEASURE_MODE_CALIBRATION_EX) + { + modeValue = CALIBRATION_VOLTAGE; + modeName = "Calibration"; + } + else if (measuringMode == MEASURE_MODE_IMPEDANCE_EX) + { + modeValue = value; + modeName = "Impedance"; + } + + if (m_fpSetMeasuringMode(m_libraryHandle, measuringMode, modeValue)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Device set to " << modeName << " mode [" << modeValue << "]\n"; + } + else + { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Failed setting the device to " << modeName << " mode, errorcode = " << + error << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + return false; + } + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCTMSiAccess.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCTMSiAccess.h new file mode 100644 index 0000000..83b3fed --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/drivers/tmsi/ovasCTMSiAccess.h @@ -0,0 +1,387 @@ +/* + * ovasCTMSiAccess.h + * + * Copyright (c) 2014, Mensia Technologies SA. All rights reserved. + * -- Rights transferred to Inria, contract signed 21.11.2014 + * + */ + +#pragma once + +#if defined TARGET_OS_Windows + +#include "ovas_base.h" +#include "Windows.h" +//#include "TMSiSDK.h" + +#include +#include + +// TMSi Declared Defines, Enums and Types + +// Measurement modes: +#define MEASURE_MODE_NORMAL ((ULONG)0x0) +#define MEASURE_MODE_IMPEDANCE ((ULONG)0x1) +#define MEASURE_MODE_CALIBRATION ((ULONG)0x2) + +#define MEASURE_MODE_IMPEDANCE_EX ((ULONG)0x3) +#define MEASURE_MODE_CALIBRATION_EX ((ULONG)0x4) + +// for MEASURE_MODE_IMPEDANCE: +#define IC_OHM_002 0 ///< 2K Impedance limit */ +#define IC_OHM_005 1 ///< 5K Impedance limit */ +#define IC_OHM_010 2 ///< 10K Impedance limit */ +#define IC_OHM_020 3 ///< 20K Impedance limit */ +#define IC_OHM_050 4 ///< 50K Impedance limit */ +#define IC_OHM_100 5 ///< 100K Impedance limit */ +#define IC_OHM_200 6 ///< 200K Impedance limit */ + +// for MEASURE_MODE_CALIBRATION: +#define IC_VOLT_050 0 ///< 50 uV t-t Calibration voltage */ +#define IC_VOLT_100 1 ///< 100 uV t-t Calibration voltage */ +#define IC_VOLT_200 2 ///< 200 uV t-t Calibration voltage */ +#define IC_VOLT_500 3 ///< 500 uV t-t Calibration voltage */ + +// for Signat Format +#define SF_UNSIGNED 0x0 ///< Unsigned integer +#define SF_INTEGER 0x1 ///< signed integer + +// integer overflow value for analog channels +#define OVERFLOW_32BITS ((long) 0x80000000) + +// Get Signal info +#define SIGNAL_NAME 40 + +typedef struct SSignalFormat +{ + ULONG Size; // Size of this structure + ULONG Elements; // Number of elements in list + + ULONG Type; // One of the signal types above + ULONG SubType; // One of the signal sub-types above + ULONG Format; // Float / Integer / Asci / Ect.. + ULONG Bytes; // Number of bytes per sample including subsignals + + FLOAT UnitGain; + FLOAT UnitOffSet; + ULONG UnitId; + LONG UnitExponent; + + WCHAR Name[SIGNAL_NAME]; + + ULONG Port; + WCHAR PortName[SIGNAL_NAME]; + ULONG SerialNumber; +} signal_format_t, *psignal_format_t; + +// This structure contains information about the possible configuration of the frontend +typedef struct SFrontEndInfo +{ + unsigned short NrOfChannels; ///< Current number of channels used */ + unsigned short SampleRateSetting; ///< Current sample rate setting (a.k.a. base sample rate divider ) */ + unsigned short Mode; ///< operating mode */ + unsigned short maxRS232; + unsigned long Serial; ///< Serial number */ + unsigned short NrExg; ///< Number of Exg channels in this device */ + unsigned short NrAux; ///< Number of Aux channels in this device */ + unsigned short HwVersion; ///< Version number for the hardware */ + unsigned short SwVersion; ///< Version number of the embedded software */ + unsigned short RecBufSize; ///< Used for debugging only */ + unsigned short SendBufSize; ///< Used for debugging only */ + unsigned short NrOfSwChannels; ///< Max. number of channels supported by this device */ + unsigned short BaseSf; ///< Max. sample frequency */ + unsigned short Power; + unsigned short Check; +} front_end_info_t, *pfront_end_info_t; + +// Enum defined based on the communication methods from tmsi_ext_frontend_info_type_t +typedef enum ETmSiConnection +{ + TMSiConnectionUndefined = 0, ///< Undefined connection, indicates programming error */ + TMSiConnectionFiber, ///< Obsolete, do not use */ + TMSiConnectionBluetooth, ///< Bluetooth connection with Microsoft driver */ + TMSiConnectionUSB, ///< USB 2.0 connection direct */ + TMSiConnectionWifi, ///< Network connection, Ip-adress and port needed, wireless */ + TMSiConnectionNetwork ///< Network connection, Ip-adress and port needed, wired */ +} tmsi_connection_type_t; + + +// Mobita specific: This structure contains information about the current battery state +typedef struct STmSiBatReport +{ + short Temp; ///< Battery temperatur in degree Celsius (�C) */ + short Voltage; ///< Battery Voltage in milliVolt (mV) */ + short Current; ///< Battery Current in milliAmpere (mA) */ + short AccumCurrent; ///< Battery Accumulated Current in milliAmpere (mA) */ + short AvailableCapacityInPercent; ///< Available battery Capacity In Percent, range 0-100 */ + unsigned short DoNotUse1; ///< Do not use, reserved for future use */ + unsigned short DoNotUse2; ///< Do not use, reserved for future use */ + unsigned short DoNotUse3; ///< Do not use, reserved for future use */ + unsigned short DoNotUse4; ///< Do not use, reserved for future use */ +} tmsi_bat_report_type_t; + +// Mobita specific: This structure contains information about the current state of the internal storage +typedef struct STmSiStorageReport +{ + uint32_t StructSize; ///< Size of struct in words */ + uint32_t TotalSize; ///< Total size of the internal storage in MByte (=1024x1024 bytes) */ + uint32_t UsedSpace; ///< Used space on the internal storage in MByte (=1024x1024 bytes)*/ + uint32_t SDCardCID[4]; ///< The CID register of the current SD-Card. */ + unsigned short DoNotUse1; ///< Do not use, reserved for future use */ + unsigned short DoNotUse2; ///< Do not use, reserved for future use */ + unsigned short DoNotUse3; ///< Do not use, reserved for future use */ + unsigned short DoNotUse4; ///< Do not use, reserved for future use */ +} tmsi_storage_report_type_t; + +// Mobita specific: This structure contains information about the current and past use of the Mobita +typedef struct STmSiDeviceReport +{ + uint32_t AdapterSN; ///< Serial number of the current connected Adapter */ + uint32_t AdapterStatus; ///< 0=Unknown; 1=Ok;2=MemError */ + uint32_t AdapterCycles; ///< Number of connections made by the Adapter. */ + uint32_t MobitaSN; ///< Serial number of the Mobita */ + uint32_t MobitaStatus; ///< Statis of the Mobita : 0=Unknown; 1=Ok;2=MemError;3=BatError; */ + uint32_t MobitaCycles; ///< Number of adapter connections made by the Mobita */ + unsigned short DoNotUse1; ///< Do not use, reserved for future use */ + unsigned short DoNotUse2; ///< Do not use, reserved for future use */ + unsigned short DoNotUse3; ///< Do not use, reserved for future use */ + unsigned short DoNotUse4; ///< Do not use, reserved for future use */ +} tmsi_device_report_type_t; + +// Mobita specific: This structure contains information about the current sampling configuration +typedef struct STmSiExtFrontendInfo +{ + unsigned short CurrentSamplerate; ///< in Hz */ + unsigned short CurrentInterface; ///< 0 = Unknown; 1 = Fiber; 2 = Bluetooth; 3 = USB; 4 = WiFi; 5 = Network*/ + unsigned short CurrentBlockType; ///< The blocktype used to send sample data for the selected CurrentFs and selected CurrentInterface */ + unsigned short DoNotUse1; ///< Do not use, reserved for future use */ + unsigned short DoNotUse2; ///< Do not use, reserved for future use */ + unsigned short DoNotUse3; ///< Do not use, reserved for future use */ + unsigned short DoNotUse4; ///< Do not use, reserved for future use */ +} tmsi_ext_frontend_info_type_t; + +//----------- TYPE --------------------- + +#define CHANNELTYPE_UNKNOWN 0 +#define CHANNELTYPE_EXG 1 +#define CHANNELTYPE_BIP 2 +#define CHANNELTYPE_AUX 3 +#define CHANNELTYPE_DIG 4 +#define CHANNELTYPE_TIME 5 +#define CHANNELTYPE_LEAK 6 +#define CHANNELTYPE_PRESSURE 7 +#define CHANNELTYPE_ENVELOPE 8 +#define CHANNELTYPE_MARKER 9 +#define CHANNELTYPE_SAW 10 +#define CHANNELTYPE_SAO2 11 + +#define MAX_BUFFER_SIZE 0xFFFFFFFF + +typedef BOOLEAN ( __stdcall * POPEN )(void* handle, const char* deviceLocator); +typedef BOOLEAN ( __stdcall * PCLOSE )(HANDLE handle); +typedef BOOLEAN ( __stdcall * PSTART)(IN HANDLE handle); +typedef BOOLEAN ( __stdcall * PSTOP)(IN HANDLE handle); +typedef BOOLEAN ( __stdcall * PSETSIGNALBUFFER)(IN HANDLE handle,IN OUT PULONG sampling,IN OUT PULONG size); +typedef BOOLEAN ( __stdcall * PGETBUFFERINFO)(IN HANDLE handle,OUT PULONG overflow,OUT PULONG percentFull); +typedef LONG ( __stdcall * PGETSAMPLES)(IN HANDLE handle,OUT PULONG sampleBuffer,IN ULONG size); +typedef psignal_format_t ( __stdcall * PGETSIGNALFORMAT)(IN HANDLE handle, IN OUT char* frontEndName); +typedef BOOLEAN ( __stdcall * PFREE)(IN VOID* memory); +typedef HANDLE ( __stdcall * PLIBRARYINIT)(IN tmsi_connection_type_t givenConnectionType, IN OUT int* errorCode); +typedef int ( __stdcall * PLIBRARYEXIT)(IN HANDLE handle); +typedef BOOLEAN ( __stdcall * PGETFRONTENDINFO)(IN HANDLE handle, IN OUT front_end_info_t* frontEndInfo); +typedef BOOLEAN ( __stdcall * PSETRTCTIME)(IN HANDLE handle,IN SYSTEMTIME* inTime); +typedef BOOLEAN ( __stdcall * PGETRTCTIME)(IN HANDLE handle,IN SYSTEMTIME* inTime); +typedef int ( __stdcall * PGETERRORCODE)(IN HANDLE handle); +typedef const char* ( __stdcall * PGETERRORCODEMESSAGE)(IN HANDLE handle, IN int errorCode); +typedef char** ( __stdcall * PGETDEVICELIST)(IN HANDLE handle, IN OUT int* nFrontEnds); +typedef void ( __stdcall * PFREEDEVICELIST)(HANDLE handle, int nFrontEnds, char** deviceList); +typedef BOOLEAN ( __stdcall * PSETREFCALCULATION)(IN HANDLE handle, int onOrOff); +typedef BOOLEAN ( __stdcall * PSETMEASURINGMODE)(IN HANDLE handle,IN ULONG mode, IN int value); +typedef BOOLEAN ( __stdcall * PGETCONNECTIONPROPERTIES)(IN HANDLE handle, IN OUT uint32_t* signalStrength, IN OUT uint32_t* nCrcErrors, + IN OUT uint32_t* nSampleBlocks); +typedef BOOLEAN ( __stdcall * PGETEXTFRONTENDINFO)(IN HANDLE handle, IN OUT tmsi_ext_frontend_info_type_t* extFrontEndInfo, + tmsi_bat_report_type_t* batteryReport, tmsi_storage_report_type_t* storageReport, + tmsi_device_report_type_t* deviceReport); + + +// END TMSi + +namespace OpenViBE { +namespace AcquisitionServer { +class IDriverContext; +class IDriverCallback; +class CHeader; + +class CTMSiAccess +{ +public: + explicit CTMSiAccess(IDriverContext& ctx); + ~CTMSiAccess(); + + std::map> getConnectionProtocols() const { return m_connectionProtocols; } + + // Initialize the TMSi library with the currently chosen protocol + bool initializeTMSiLibrary(const char* connectionProtocol); + + // Open a frontend (identified by a string) on the currently set protocol + bool openFrontEnd(const char* deviceID); + + // Close the currently opened frontend + bool closeFrontEnd(); + + // Returns a vector of available sampling frequencies of the device, in case of error returns an empty vector + std::vector discoverDeviceSamplingFrequencies(); + + // Run diagnostics on the device, ask for FrontEndInfo and extFrontEndInfo + bool runDiagnostics(); + + bool getImpedanceTestingCapability(bool* hasImpedanceTestingAbility) const; + + // Initializes the SignalFormat structure inside the driver + // Calculates number of EEG and additional Channels + bool calculateSignalFormat(const char* deviceID); + + // Print the signal format into Trace Log + bool printSignalFormat(); + + // Return the number of EEG channels on the device (must call calculateSignalFormat first) + uint32_t getMaximumEEGChannelCount() const { return m_nMaxEEGChannel; } + + // Return the number of all channels on the device (must call calculateSignalFormat first) + uint32_t getActualChannelCount() const { return m_nActualChannel; } + + // Return the name of the channel at desired index + CString getChannelName(size_t index) const; + + // Return the type of the channel at desired index + CString getChannelType(size_t index) const; + + // Frees the SignalFormat structure in this object and in the library + void freeSignalFormat(); + + // Returns the list of devices found on the current protocol + std::vector getDeviceList() const { return m_devices; } + + // ACQUISITION SETTINGS + + // Enable or disable the common average reference calculation + bool setCommonModeRejection(bool isCommonModeRejectionEnabled); + + bool setActiveChannels(CHeader* header, const CString& additionalChannels); + + // sets the signal buffer to values known to be functional, returns false if they are inconsistent + bool setSignalBuffer(unsigned long sampling, unsigned long bufferSizeInSamples); + + bool setSignalMeasuringModeToNormal(); + bool setSignalMeasuringModeToImpedanceCheck(int limit); + bool setSignalMeasuringModeToCalibration(); + + // ACQUISITION HANDLING + + bool startAcquisition(); + int getSamples(float* samples, IDriverCallback* driverCB, uint64_t nSamplePerSentBlock, uint32_t sampling); + bool getImpedanceValues(std::vector* impedanceValues); + bool stopAcquisition(); + + + // Gets connection properties, such as signal strength or errors since last call and prints them to Trace Log + bool getConnectionProperties() const; + +private: // private variables + + // status holders + bool m_isInitialized = false; + bool m_opened = false; + bool m_hasChannelStructure = false; + bool m_hasBufferSet = false; + bool m_isStarted = false; + + // informations about the last scanned protocol + std::vector m_devices; + + // informations about the last scanned device + psignal_format_t m_signalFormat; + unsigned long m_maxBufferSize; + + unsigned long m_nMaxEEGChannel; + unsigned long m_nActualChannel; + std::vector m_isChannelsActivated; + uint32_t m_nActiveChannel = 0; + + unsigned long m_signalBufferSizeInBytes; + + // buffer for stored signal + unsigned long* m_sampleBuffer; + // index of the current (last) sample in the buffer + uint32_t m_lastSampleIndexInBuffer = 0; + + // device connection protocols + std::map> m_connectionProtocols; + + IDriverContext& m_driverCtx; + bool m_valid = false; + + CStimulationSet m_stimSet; + uint32_t m_lastTriggerValue = 0; + + // private methods + bool setSignalMeasuringMode(ULONG measuringMode, int value = 0); + + // DLL library handling members + // The HANDLE type returned by the library is basically a void* (avoids including windows headers to the .h) + HANDLE m_libraryHandle; + + template + void loadDLLFunct(T* functionPointer, const char* functionName); + + // TMSi Library functions + POPEN m_fpOpen; + PCLOSE m_fpClose; + PSTART m_fpStart; + PSTOP m_fpStop; + PSETSIGNALBUFFER m_fpSetSignalBuffer; + PGETBUFFERINFO m_fpGetBufferInfo; + PGETSAMPLES m_fpGetSamples; + PGETSIGNALFORMAT m_fpGetSignalFormat; + PFREE m_fpFree; + PLIBRARYINIT m_fpLibraryInit; + PLIBRARYEXIT m_fpLibraryExit; + PGETFRONTENDINFO m_fpGetFrontEndInfo; + PSETRTCTIME m_fpSetRtcTime; + PGETRTCTIME m_fpGetRtcTime; + + PGETERRORCODE m_fpGetErrorCode; + PGETERRORCODEMESSAGE m_fpGetErrorCodeMessage; + + PGETDEVICELIST m_fpGetDeviceList; + PFREEDEVICELIST m_fpFreeDeviceList; + + PGETCONNECTIONPROPERTIES m_fpGetConnectionProperties; + PSETREFCALCULATION m_fpSetRefCalculation; + PSETMEASURINGMODE m_fpSetMeasuringMode; + PGETEXTFRONTENDINFO m_fpGetExtFrontEndInfo; + + /* + // NeXus10MkII functionality + PGETRANDOMKEY m_fpGetRandomKey; + PUNLOCKFRONTEND m_fpUnlockFrontEnd; + PGETOEMSIZE m_fpGetOEMSize; + PSETOEMDATA m_fpSetOEMData; + PGETOEMDATA m_fpGetOEMData; + POPENFIRSTDEVICE m_oFopenFirstDevice; + PSETSTORAGEMODE m_fpSetStorageMode; + PGETDIGSENSORID m_fpGetDigSensorId; + PGETDIGSENSORCONFIG m_fpGetDigSensorConfig; + PGETDIGSENSORDATA m_fpGetDigSensorData; + PGETFLASHSTATUS m_fpGetFlashStatus; + PSTARTFLASHDATA m_fpStartFlashData; + PGETFLASHSAMPLES m_fpGetFlashSamples; + PSTOPFLASHDATA m_fpStopFlashData; + PFLASHERASEMEMORY m_fpFlashEraseMemory; + PSETFLASHDATA m_fpSetFlashData; + */ +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCAcquisitionServer.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCAcquisitionServer.cpp new file mode 100755 index 0000000..e4237f7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCAcquisitionServer.cpp @@ -0,0 +1,1018 @@ +#include "ovasCAcquisitionServer.h" +#include "ovasIAcquisitionServerPlugin.h" + +#include + +#include + +#include + +#include +#include + +#include +#include +#include +#include // std::isnan, std::isfinite +#include + +#include + +#include + +// #include + +namespace OpenViBE { +namespace AcquisitionServer { + +// because std::tolower has multiple signatures, +// it can not be easily used in std::transform +// this workaround is taken from http://www.gcek.net/ref/books/sw/cpp/ticppv2/ +template +static T to_lower(T c) { return std::tolower(c); } + +class CDriverContext final : public IDriverContext +{ +public: + + CDriverContext(const Kernel::IKernelContext& ctx, CAcquisitionServer& acquisitionServer) + : m_kernelCtx(ctx), m_acquisitionServer(acquisitionServer) { } + + Kernel::ILogManager& getLogManager() const override { return m_kernelCtx.getLogManager(); } + Kernel::IConfigurationManager& getConfigurationManager() const override { return m_kernelCtx.getConfigurationManager(); } + + bool isConnected() const override { return m_acquisitionServer.isConnected(); } + bool isStarted() const override { return m_acquisitionServer.isStarted(); } + bool isImpedanceCheckRequested() const override { return m_acquisitionServer.isImpedanceCheckRequested(); } + bool isChannelSelectionRequested() const { return m_acquisitionServer.isChannelSelectionRequested(); } + int64_t getDriftSampleCount() const override { return m_acquisitionServer.m_DriftCorrection.getDriftSampleCount(); } + + bool correctDriftSampleCount(const int64_t count) override + { + return m_acquisitionServer.m_DriftCorrection.correctDrift(count, m_acquisitionServer.m_nSample, m_acquisitionServer.m_PendingBuffers, + m_acquisitionServer.m_PendingStimSet, m_acquisitionServer.m_SwapBuffers); + } + + int64_t getDriftToleranceSampleCount() const override { return m_acquisitionServer.m_DriftCorrection.getDriftToleranceSampleCount(); } + + int64_t getSuggestedDriftCorrectionSampleCount() const override { return m_acquisitionServer.m_DriftCorrection.getSuggestedDriftCorrectionSampleCount(); } + + void setInnerLatencySampleCount(const int64_t count) override { m_acquisitionServer.m_DriftCorrection.setInnerLatencySampleCount(count); } + int64_t getInnerLatencySampleCount() const override { return m_acquisitionServer.m_DriftCorrection.getInnerLatencySampleCount(); } + + bool updateImpedance(const size_t index, const double impedance) override { return m_acquisitionServer.updateImpedance(index, impedance); } + + uint64_t getStartTime() const { return m_acquisitionServer.m_startTime; } + +protected: + + const Kernel::IKernelContext& m_kernelCtx; + CAcquisitionServer& m_acquisitionServer; +}; + +class CConnectionServerHandlerThread +{ +public: + CConnectionServerHandlerThread(CAcquisitionServer& acquisitionServer, Socket::IConnectionServer& connectionServer) + : m_AcquisitionServer(acquisitionServer), m_ConnectionServer(connectionServer) { } + + void operator()() + { + Socket::IConnection* connection; + do + { + connection = m_ConnectionServer.accept(); + m_AcquisitionServer.acceptNewConnection(connection); + } while (connection && m_AcquisitionServer.isConnected()); + } + + CAcquisitionServer& m_AcquisitionServer; + Socket::IConnectionServer& m_ConnectionServer; +}; + +class CConnectionClientHandlerThread +{ +public: + CConnectionClientHandlerThread(CAcquisitionServer& acquisitionServer, Socket::IConnection& connection) + : m_AcquisitionServer(acquisitionServer), m_Connection(connection) { } + + void operator()() + { + std::unique_lock oLock(m_ClientThreadMutex, std::defer_lock); + + while (true) + { + oLock.lock(); + + // Wait until something interesting happens... + m_PendingBufferCondition.wait(oLock, [this]() { return (m_PleaseQuit || !m_Connection.isConnected() || !m_ClientPendingBuffer.empty()); }); + + // Exit the loop if we're told to quit or if we've lost the connection + if (m_PleaseQuit || !m_Connection.isConnected()) + { + oLock.unlock(); + break; + } + + // At this point, we should have a buffer + if (m_ClientPendingBuffer.empty()) + { + // n.b. Shouldn't happen, but we don't have an error reporting mechanism in the thread... + oLock.unlock(); + continue; + } + + CMemoryBuffer* buffer = m_ClientPendingBuffer.front(); + m_ClientPendingBuffer.pop_front(); + + // Don't go into blocking send while holding the lock; ok to unlock as buffer ptr+mem is now owned by this thread + oLock.unlock(); + + const uint64_t size = buffer->getSize(); + m_Connection.sendBufferBlocking(&size, sizeof(size)); + m_Connection.sendBufferBlocking(buffer->getDirectPointer(), buffer->getSize()); + delete buffer; + } + + oLock.lock(); + + // We're done, clean any possible pending buffers + for (auto it = m_ClientPendingBuffer.begin(); it != m_ClientPendingBuffer.end(); ++it) { delete *it; } + m_ClientPendingBuffer.clear(); + + oLock.unlock(); + + // The thread will exit here and can be joined + } + + void scheduleBuffer(const IMemoryBuffer& buffer) + { + { + std::lock_guard oLock(m_ClientThreadMutex); + if (!m_PleaseQuit) + { + CMemoryBuffer* tmp = new CMemoryBuffer(buffer); + m_ClientPendingBuffer.push_back(tmp); + } + } + + // No big harm notifying in any case, though if in 'quit' state, the quit request has already notified + m_PendingBufferCondition.notify_one(); + } + + CAcquisitionServer& m_AcquisitionServer; + Socket::IConnection& m_Connection; + + std::deque m_ClientPendingBuffer; + + // Here we use a condition variable to avoid sleeping + std::mutex m_ClientThreadMutex; + std::condition_variable m_PendingBufferCondition; + + // Should this thread quit? + bool m_PleaseQuit = false; +}; + +static void start_connection_client_handler_thread(CConnectionClientHandlerThread* thread) { (*thread)(); } + + +//___________________________________________________________________// +// // + +std::string toString(const ENaNReplacementPolicy policy) +{ + switch (policy) + { + case ENaNReplacementPolicy::Disabled: return "Disabled"; + case ENaNReplacementPolicy::LastCorrectValue: return "LastCorrectValue"; + case ENaNReplacementPolicy::Zero: return "Zero"; + default: return "N/A"; + } +} + +CAcquisitionServer::CAcquisitionServer(const Kernel::IKernelContext& ctx) + : m_DriftCorrection(ctx), m_kernelCtx(ctx) +{ + m_driverCtx = new CDriverContext(ctx, *this); + + m_encoder = &m_kernelCtx.getAlgorithmManager().getAlgorithm( + m_kernelCtx.getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_MasterAcquisitionEncoder)); + m_encoder->initialize(); + + ip_subjectID.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectID)); + ip_subjectAge.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectAge)); + ip_subjectGender.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectGender)); + ip_matrix.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_SignalMatrix)); + ip_sampling.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_SignalSampling)); + ip_stimSet.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_StimulationSet)); + ip_bufferDuration.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_BufferDuration)); + ip_channelUnits.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_ChannelUnits)); + op_buffer.initialize(m_encoder->getOutputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_OutputParameterId_EncodedMemoryBuffer)); + + ip_encodeChannelLocalisationData.initialize( + m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_EncodeChannelLocalisationData)); + ip_encodeChannelUnitData.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_EncodeChannelUnitData)); + + const std::string policy = m_kernelCtx.getConfigurationManager().expand("${AcquisitionServer_NaNReplacementPolicy}").toASCIIString(); + if (policy == "Disabled") { this->setNaNReplacementPolicy(ENaNReplacementPolicy::Disabled); } + else if (policy == "Zero") { this->setNaNReplacementPolicy(ENaNReplacementPolicy::Zero); } + else { this->setNaNReplacementPolicy(ENaNReplacementPolicy::LastCorrectValue); } + + this->setOversamplingFactor(m_kernelCtx.getConfigurationManager().expandAsUInteger("${AcquisitionServer_OverSamplingFactor}", 1)); + this->setImpedanceCheckRequest(m_kernelCtx.getConfigurationManager().expandAsBoolean("${AcquisitionServer_CheckImpedance}", false)); + this->setChannelSelectionRequest(m_kernelCtx.getConfigurationManager().expandAsBoolean("${AcquisitionServer_ChannelSelection}", false)); + + m_startedDriverSleepDuration = m_kernelCtx.getConfigurationManager().expandAsInteger("${AcquisitionServer_StartedDriverSleepDuration}", 0); + m_stoppedDriverSleepDuration = m_kernelCtx.getConfigurationManager().expandAsUInteger("${AcquisitionServer_StoppedDriverSleepDuration}", 100); + m_driverTimeoutDuration = m_kernelCtx.getConfigurationManager().expandAsUInteger("${AcquisitionServer_DriverTimeoutDuration}", 5000); + + for (auto itp = m_Plugins.begin(); itp != m_Plugins.end(); ++itp) { (*itp)->createHook(); } +} + +CAcquisitionServer::~CAcquisitionServer() +{ + if (m_isStarted) + { + m_Driver->stop(); + m_isStarted = false; + } + + if (m_isInitialized) + { + m_Driver->uninitialize(); + m_isInitialized = false; + } + + if (m_connectionServer) + { + m_connectionServer->release(); + m_connectionServer = nullptr; + } + + // n.b. We don't clear the connection list as the teardown order (even on window close) + // will lead to AcquisitionServerGUI terminating the AcquisitionThread which will + // in turn call the server's ::stop() that clears the list. + + ip_subjectID.uninitialize(); + ip_subjectAge.uninitialize(); + ip_subjectGender.uninitialize(); + ip_matrix.uninitialize(); + ip_sampling.uninitialize(); + ip_stimSet.uninitialize(); + ip_bufferDuration.uninitialize(); + op_buffer.uninitialize(); + ip_channelUnits.uninitialize(); + + ip_encodeChannelLocalisationData.uninitialize(); + ip_encodeChannelUnitData.uninitialize(); + + m_encoder->uninitialize(); + m_kernelCtx.getAlgorithmManager().releaseAlgorithm(*m_encoder); + m_encoder = nullptr; + + delete m_driverCtx; + m_driverCtx = nullptr; +} + +IDriverContext& CAcquisitionServer::getDriverContext() const { return *m_driverCtx; } + +//___________________________________________________________________// +// // + +bool CAcquisitionServer::loop() +{ + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "loop()\n"; + + // Searches for new connection(s) + if (m_connectionServer) + { + DoubleLock lock(&m_oPendingConnectionProtectionMutex, &m_oPendingConnectionExecutionMutex); + + for (auto it = m_pendingConnections.begin(); it != m_pendingConnections.end(); ++it) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Received new connection...\n"; + + Socket::IConnection* connection = it->first; + if (this->isStarted()) + { + // When a new connection is found and the + // acq server is started, send the header + + // Computes inner data to skip + const int64_t toSkip = m_DriftCorrection.isActive() + ? ((int64_t(it->second.connectionTime - m_startTime) * int64_t(m_sampling)) >> 32) - m_nSample + m_PendingBuffers. + size() + : ((int64_t(it->second.connectionTime - m_lastDeliveryTime) * int64_t(m_sampling)) >> 32) + m_PendingBuffers.size(); + + const uint64_t theoreticalSampleCountToSkip = (toSkip < 0 ? 0 : uint64_t(toSkip)); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Sample count offset at connection : " << theoreticalSampleCountToSkip << "\n"; + + if ((m_nSample - m_PendingBuffers.size()) % m_nSamplePerSentBlock != 0) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Buffer start sample " << m_nSample - m_PendingBuffers.size() << + " doesn't seem to be divisible by " << m_nSamplePerSentBlock << " (case B)\n"; + } + + const uint64_t bufferDuration = ip_bufferDuration; + const uint64_t pastBufferCount = (m_nSample - m_PendingBuffers.size()) / m_nSamplePerSentBlock; + const uint64_t connBufferTimeOffset = CTime(m_sampling, theoreticalSampleCountToSkip).time(); + + connection_info_t info; + info.connectionTime = it->second.connectionTime; + info.stimulationTimeOffset = pastBufferCount * bufferDuration + connBufferTimeOffset; + info.nSampleToSkip = theoreticalSampleCountToSkip; + info.connectionClientHandlerThread = new CConnectionClientHandlerThread(*this, *connection); + info.connectionClientHandlerStdThread = new std::thread( + std::bind(&start_connection_client_handler_thread, info.connectionClientHandlerThread)); + info.isChannelLocalisationSent = false; + info.isChannelUnitsSent = false; + + m_connections.push_back(std::pair(connection, info)); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "Creating header\n"; + + op_buffer->setSize(0, true); + m_encoder->process(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputTriggerId_EncodeHeader); + + info.connectionClientHandlerThread->scheduleBuffer(*op_buffer); + } + else + { + // When a new connection is found and the + // acq server is _not_ started, drop the + // connection + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Dropping connection - acquisition is not started\n"; + connection->release(); + } + } + m_pendingConnections.clear(); + } + + // Cleans disconnected client(s) + for (auto it = m_connections.begin(); it != m_connections.end();) + { + Socket::IConnection* connection = it->first; + if (!connection->isConnected()) + { + if (it->second.connectionClientHandlerStdThread) + { + requestClientThreadQuit(it->second.connectionClientHandlerThread); + + it->second.connectionClientHandlerStdThread->join(); + delete it->second.connectionClientHandlerStdThread; + delete it->second.connectionClientHandlerThread; + } + connection->release(); + it = m_connections.erase(it); + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Closed connection...\n"; + } + else { ++it; } + } + + // Handles driver's main loop + if (m_Driver) + { + bool res; + if (this->isStarted()) + { + res = true; + bool timeout = false; + m_gotData = false; + const uint32_t timeBeforeCall = System::Time::getTime(); + while (res && !m_gotData && !timeout) + { + // Calls driver's loop + res = m_Driver->loop(); + // @fixme behavior seems to be bad if the loop() returns false; should fix this! + if (!m_gotData) + { + timeout = (System::Time::getTime() > timeBeforeCall + m_driverTimeoutDuration); + + if (m_startedDriverSleepDuration > 0) + { + // This may cause jitter due to inaccuracies in sleep duration, but has the + // benefit that it frees the CPU core for other tasks + System::Time::sleep(size_t(m_startedDriverSleepDuration)); + } + else if (m_startedDriverSleepDuration == 0) + { + // Generally spins, but gives other threads a chance. Note that there is no guarantee when + // the scheduler reschedules this thread. + std::this_thread::yield(); + } + else + { + // < 0 -> NOP, spins, doesn't offer to yield + // n.b. Unless the driver waits for samples (preferably with a hardware event), + // this choice will spin one core fully. + } + } + } + if (timeout) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "After " << m_driverTimeoutDuration << + " milliseconds, did not receive anything from the driver - Timed out\n"; + return false; + } + if (m_gotData && m_DriftCorrection.getDriftCorrectionPolicy() == EDriftCorrectionPolicies::Forced) + { + m_DriftCorrection.correctDrift(m_DriftCorrection.getSuggestedDriftCorrectionSampleCount(), m_nSample, m_PendingBuffers, m_PendingStimSet, + m_SwapBuffers); + } + } + else + { + // Calls driver's loop + res = m_Driver->loop(); + System::Time::sleep(m_stoppedDriverSleepDuration); + } + + // Calls driver's loop + if (!res) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "Something bad happened in the loop callback, stopping the acquisition\n"; + return false; + } + } + + // Eventually builds up buffer and + // sends data to connected client(s) + while (m_PendingBuffers.size() >= m_nSamplePerSentBlock * 2) + { + const int64_t p = m_nSample - m_PendingBuffers.size(); + if (p < 0) { m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Signed number used for bit operations:" << p << " (case A)\n"; } + if (p % m_nSamplePerSentBlock != 0) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Buffer start sample " << p << " doesn't seem to be divisible by " + << m_nSamplePerSentBlock << " (case A)\n"; + } + + // n.b. here we use arithmetic based on buffer duration so that we are in perfect agreement with + // Acquisition Client box that sets the chunk starts and ends by steps of buffer duration. + const uint64_t duration = ip_bufferDuration; + const uint64_t startSamples = m_nSample - m_PendingBuffers.size(); + const uint64_t nBuffer = startSamples / m_nSamplePerSentBlock; + const uint64_t startTime = nBuffer * duration; + const uint64_t endTime = startTime + duration; + const uint64_t lastTime = CTime(m_sampling, m_nSample).time(); + + // Pass the stimuli and buffer to all plugins; note that they may modify them + for (auto itp = m_Plugins.begin(); itp != m_Plugins.end(); ++itp) + { + (*itp)->loopHook(m_PendingBuffers, m_PendingStimSet, startTime, endTime, lastTime); + } + + // Handle connections + for (auto it = m_connections.begin(); it != m_connections.end(); ++it) + { + // Socket::IConnection* connection=it->first; + connection_info_t& info = it->second; + + if (info.nSampleToSkip < m_nSamplePerSentBlock) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "Creating buffer for connection " << uint64_t(it->first) << "\n"; + + // Signal buffer + for (size_t j = 0; j < m_nChannel; ++j) + { + for (size_t i = 0; i < m_nSamplePerSentBlock; ++i) + { + ip_matrix->getBuffer()[j * m_nSamplePerSentBlock + i] = m_PendingBuffers[int(i + info.nSampleToSkip)][j]; + } + } + + // Boundaries of the part of the buffer to be sent to this connection + const uint64_t connBufferTimeOffset = CTime(m_sampling, info.nSampleToSkip).time(); + const uint64_t connBlockStartTime = startTime + connBufferTimeOffset; + const uint64_t connBlockEndTime = endTime + connBufferTimeOffset; + + //m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "start: " << (start) << "end: " << (end) << "\n"; + + // Stimulation buffer + IStimulationSet& stimSet = *ip_stimSet; + stimSet.clear(); + + // Take the stimuli range valid for the buffer and adjust wrt connection time (stamp at connection = stamp at time 0 for the client) + for (size_t k = 0; k < m_PendingStimSet.getStimulationCount(); ++k) + { + const uint64_t date = m_PendingStimSet.getStimulationDate(k); // this date is wrt the whole acquisition time in the server + if (date >= connBlockStartTime && date <= connBlockEndTime) + { + // The new date is wrt the specific connection time of the client (i.e. the chunk times on Designer side) + const uint64_t newDate = ((date > info.stimulationTimeOffset) ? (date - info.stimulationTimeOffset) : 0); + + /* + std::cout << std::setprecision(10) << CTime(date).toSeconds() << " to " << CTime(newDate).toSeconds() + << " for [" << CTime(startTime).toSeconds() << "," << CTime(endTime).toSeconds() << "]\n"; + */ + + stimSet.appendStimulation(m_PendingStimSet.getStimulationIdentifier(k), newDate, m_PendingStimSet.getStimulationDuration(k)); + } + } + + // Send a chunk of channel units? Note that we'll always send the units header. + if (!info.isChannelUnitsSent) + { + // If default values in channel units, don't bother sending unit data chunk + ip_encodeChannelUnitData = m_headerCopy->isChannelUnitSet(); + // std::cout << "Set " << ip_channelUnits->getBufferElementCount() << "\n"; + } + + op_buffer->setSize(0, true); + m_encoder->process(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputTriggerId_EncodeBuffer); + + if (!info.isChannelUnitsSent) + { + // Do not send again + info.isChannelUnitsSent = true; + ip_encodeChannelUnitData = false; + } + + info.connectionClientHandlerThread->scheduleBuffer(*op_buffer); + } + else + { + // Here sample count to skip >= block size, so we effective drop this chunk from the viewpoint of this connection. + // n.b. This is the reason why the pending buffer size needs to be 2x, as the skip can be up to 1x bufferSize and + // after that we need a full buffer to send. Note that by construction + // the count to skip can never underflow but remains >= 0 (the other if branch doesnt decrement). + info.nSampleToSkip -= m_nSamplePerSentBlock; + } + } + + // Clears pending stimulations; Can start from zero as we know we'll never send anything in the future thats + // before current BufferEndTime. + Toolkit::StimulationSet::removeRange(m_PendingStimSet, 0, endTime); + + // Clears pending signal + m_PendingBuffers.erase(m_PendingBuffers.begin(), m_PendingBuffers.begin() + m_nSamplePerSentBlock); + } + + return true; +} + +//___________________________________________________________________// +// // + +bool CAcquisitionServer::connect(IDriver& driver, IHeader& headerCopy, const uint32_t nSamplingPerSentBlock, const uint32_t port) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "connect\n"; + + + m_Driver = &driver; + m_headerCopy = &headerCopy; + m_nSamplePerSentBlock = nSamplingPerSentBlock; + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Connecting to device [" << CString(m_Driver->getName()) << "]...\n"; + + // Initializes driver + if (!m_Driver->initialize(m_nSamplePerSentBlock, *this)) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Connection failed...\n"; + return false; + } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Connection succeeded !\n"; + + const IHeader& header = *driver.getHeader(); + IHeader::copy(headerCopy, header); + + m_nChannel = headerCopy.getChannelCount(); + m_sampling = headerCopy.getSamplingFrequency() * m_overSamplingFactor; + + m_selectedChannels.clear(); + if (m_isChannelSelectionRequested) + { + for (size_t i = 0, l = 0; i < m_nChannel; ++i) + { + const std::string name = headerCopy.getChannelName(i); + if (!name.empty()) + { + m_selectedChannels.push_back(i); + headerCopy.setChannelName(l, name.c_str()); + + size_t unit = 0, factor = 0; + if (headerCopy.isChannelUnitSet()) + { + headerCopy.getChannelUnits(i, unit, factor); // no need to check, will be defaults on failure + headerCopy.setChannelUnits(l, unit, factor); + } + l++; + } + } + headerCopy.setChannelCount(m_selectedChannels.size()); + m_nChannel = headerCopy.getChannelCount(); + } + else { for (size_t i = 0; i < m_nChannel; ++i) { m_selectedChannels.push_back(i); } } + + // These are passed to plugins + m_selectedChannelNames.clear(); + for (size_t i = 0; i < headerCopy.getChannelCount(); ++i) { m_selectedChannelNames.push_back(CString(headerCopy.getChannelName(i))); } + + if (m_nChannel == 0) + { + std::stringstream ss; + ss << "Driver claimed to have 0 channel"; + if (isChannelSelectionRequested()) { ss << "(check whether the property `Select only named channel' is set).\n"; } + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << ss.str(); + return false; + } + + if (m_sampling == 0) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Driver claimed to have a sample frequency of 0.\n"; + return false; + } + + m_impedances.resize(m_nChannel, OVAS_Impedance_NotAvailable); + m_SwapBuffers.resize(m_nChannel); + + // A hack to check that the port is not already open; this doesn't guarantee it as another process + // might grab the port after this test. But it will cover the normal use cases where multiple acquisition servers + // are started by the user manually at different times. A proper way to solve this would be to + // change ConnectionServer::listen() in the SDK to disallow multiple listens. + Socket::IConnectionClient* testClient = Socket::createConnectionClient(); + if (testClient->connect("localhost", port, 100)) // 100ms + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Server Connection Port " << port << + " already in use. Please change the port or close the other application.\n"; + testClient->close(); + delete testClient; + return false; + } + delete testClient; + testClient = nullptr; + + m_connectionServer = Socket::createConnectionServer(); + if (m_connectionServer->listen(port)) + { + m_isInitialized = true; + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "NaN value correction is set to "; + switch (m_eNaNReplacementPolicy) + { + default: + case ENaNReplacementPolicy::LastCorrectValue: m_kernelCtx.getLogManager() << CString("LastCorrectValue") << "\n"; + break; + case ENaNReplacementPolicy::Zero: m_kernelCtx.getLogManager() << CString("Zero") << "\n"; + break; + case ENaNReplacementPolicy::Disabled: m_kernelCtx.getLogManager() << CString("Disabled") << "\n"; + break; + } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Oversampling factor set to " << m_overSamplingFactor << "\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Sampling frequency set to " << m_sampling << "Hz\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Started driver sleeping duration is " << m_startedDriverSleepDuration << " milliseconds\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Stopped driver sleeping duration is " << m_stoppedDriverSleepDuration << " milliseconds\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Driver timeout duration set to " << m_driverTimeoutDuration << " milliseconds\n"; + + ip_bufferDuration = CTime(m_sampling, m_nSamplePerSentBlock).time(); + + ip_subjectID = headerCopy.getExperimentID(); + ip_subjectAge = headerCopy.getSubjectAge(); + ip_subjectGender = headerCopy.getSubjectGender(); + + ip_sampling = m_sampling; + ip_matrix->resize(m_nChannel, m_nSamplePerSentBlock); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Sampling rate : " << m_sampling << "\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Samples per block : " << m_nSamplePerSentBlock << "\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Channel count : " << m_nChannel << "\n"; + + for (size_t i = 0; i < m_nChannel; ++i) + { + const std::string name = headerCopy.getChannelName(i); + if (!name.empty()) { ip_matrix->setDimensionLabel(0, i, name.c_str()); } + else { ip_matrix->setDimensionLabel(0, i, ("Channel " + std::to_string(i + 1)).c_str()); } + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Channel name : " << CString(ip_matrix->getDimensionLabel(0, i)) << "\n"; + } + + // Construct channel units stream header & matrix + // Note: Channel units, although part of IHeader, will be sent as a matrix chunk during loop() once - if at all - to each client + if (m_headerCopy->isChannelUnitSet()) + { + ip_channelUnits->resize(m_nChannel, 2); // Units, Factor + for (size_t c = 0; c < m_nChannel; ++c) + { + ip_channelUnits->setDimensionLabel(0, c, m_headerCopy->getChannelName(c)); + if (m_headerCopy->isChannelUnitSet()) + { + size_t unit = 0, factor = 0; + m_headerCopy->getChannelUnits(c, unit, factor); // no need to check, will be defaults on failure + + ip_channelUnits->getBuffer()[c * 2 + 0] = double(unit); + ip_channelUnits->getBuffer()[c * 2 + 1] = double(factor); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Channel Unit : " << unit << ", factor=" << OVTK_DECODE_FACTOR(factor) << "\n"; + } + } + ip_channelUnits->setDimensionLabel(1, 0, "Unit"); + ip_channelUnits->setDimensionLabel(1, 1, "Factor"); + } + else + { + // Driver did not set units. Convention: send empty header matrix in this case. + ip_channelUnits->clean(); + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Driver did not set units, sending empty channel units matrix\n"; + } + + // @TODO Channel localisation + ip_encodeChannelLocalisationData = false; // never at the moment + + // @TODO Gain is ignored + } + else + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Could not listen on TCP port (firewall problem ?)\n"; + return false; + } + + m_connectionServerHandlerStdThread = new std::thread(CConnectionServerHandlerThread(*this, *m_connectionServer)); + + return true; +} + +bool CAcquisitionServer::start() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "buttonStartPressedCB\n"; + + if (isImpedanceCheckRequested()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Please disable impedance check before pressing Play\n"; + return false; + } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Starting the acquisition...\n"; + + m_PendingBuffers.clear(); + m_PendingStimSet.clear(); + + m_nSample = 0; + m_nLastSample = 0; + + // Starts driver + if (!m_Driver->start()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Starting failed !\n"; + return false; + } + + m_startTime = System::Time::zgetTime(); + m_lastDeliveryTime = m_startTime; + + m_DriftCorrection.start(m_sampling, m_startTime); + + for (auto itp = m_Plugins.begin(); itp != m_Plugins.end(); ++itp) + { + const bool ok = (*itp)->startHook(m_selectedChannelNames, m_sampling, m_nChannel, m_nSamplePerSentBlock); + if (!ok) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Problem starting a plugin, bailing out for safety.\n"; + return false; + } + } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Now acquiring...\n"; + m_isStarted = true; + return true; +} + +bool CAcquisitionServer::requestClientThreadQuit(CConnectionClientHandlerThread* th) +{ + // Use a scoped lock before toggling a variable owned by the thread + { + std::lock_guard oLock(th->m_ClientThreadMutex); + + // Tell the thread to quit + th->m_PleaseQuit = true; + } + + // Wake up the thread in case it happens to be waiting on the cond var + th->m_PendingBufferCondition.notify_one(); + + return true; +} + +bool CAcquisitionServer::stop() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "buttonStopPressedCB\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Stopping the acquisition.\n"; + + m_DriftCorrection.printStats(); + m_DriftCorrection.stop(); + + // Stops driver + m_Driver->stop(); + + for (auto it = m_connections.begin(); it != m_connections.end(); ++it) + { + if (it->first->isConnected()) { it->first->close(); } + if (it->second.connectionClientHandlerStdThread) + { + requestClientThreadQuit(it->second.connectionClientHandlerThread); + + it->second.connectionClientHandlerStdThread->join(); + delete it->second.connectionClientHandlerStdThread; + delete it->second.connectionClientHandlerThread; + } + it->first->release(); + } + m_connections.clear(); + + for (auto itp = m_Plugins.begin(); itp != m_Plugins.end(); ++itp) { (*itp)->stopHook(); } + + + m_isStarted = false; + + m_PendingBuffers.clear(); + + return true; +} + +bool CAcquisitionServer::disconnect() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Disconnecting.\n"; + + if (m_isInitialized) { m_Driver->uninitialize(); } + + m_impedances.clear(); + + if (m_connectionServer) + { + m_connectionServer->close(); + m_connectionServer->release(); + m_connectionServer = nullptr; + } + + m_isInitialized = false; + + // Thread joining must be done after + // switching m_isInitialized to false + if (m_connectionServerHandlerStdThread) + { + m_connectionServerHandlerStdThread->join(); + delete m_connectionServerHandlerStdThread; + m_connectionServerHandlerStdThread = nullptr; + } + + return true; +} + +//___________________________________________________________________// +// // + +void CAcquisitionServer::setSamples(const float* samples) +{ + if (samples == nullptr) { m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Null data detected\n"; } + this->setSamples(samples, m_nSamplePerSentBlock); +} + +void CAcquisitionServer::setSamples(const float* samples, const size_t count) +{ + if (m_isStarted) + { + for (size_t i = 0; i < count; ++i) + { + if (!m_replacementInProgress) + { + // otherwise NaN are propagating + m_overSamplingSwapBuffers = m_SwapBuffers; + } + for (size_t k = 0; k < m_overSamplingFactor; ++k) + { + const float alpha = float(k + 1) / m_overSamplingFactor; + + bool hadNaN = false; + + for (size_t j = 0; j < m_nChannel; ++j) + { + const size_t channel = m_selectedChannels[j]; + + if (std::isnan(samples[channel * count + i]) || !std::isfinite(samples[channel * count + i]) + ) // NaN or infinite values + { + hadNaN = true; + + switch (m_eNaNReplacementPolicy) + { + case ENaNReplacementPolicy::Disabled: m_SwapBuffers[j] = std::numeric_limits::quiet_NaN(); + break; + case ENaNReplacementPolicy::Zero: m_SwapBuffers[j] = 0; + break; + case ENaNReplacementPolicy::LastCorrectValue: + // we simply don't update the value + break; + default: break; + } + } + else { m_SwapBuffers[j] = alpha * samples[channel * count + i] + (1 - alpha) * m_overSamplingSwapBuffers[j]; } + } + + const uint64_t currentIdx = m_nSample + i * m_overSamplingFactor + k; // j is not included here as all channels have the equal sample time + + if (hadNaN) + { + // When a NaN is encountered at time t1 on any channel, OVTK_StimulationId_Artifact stimulus is sent. When a first good sample is encountered + // after the last bad sample t2, OVTK_StimulationId_NoArtifact stimulus is sent, i.e. specifying a range of bad data : [t1,t2]. The stimuli are global + // and not specific to channels. + + if (!m_replacementInProgress) + { + const uint64_t incorrectBlockStarts = CTime(m_sampling, currentIdx).time(); + m_PendingStimSet.appendStimulation(OVTK_StimulationId_Artifact, incorrectBlockStarts, 0); + m_replacementInProgress = true; + } + } + else + { + if (m_replacementInProgress) + { + // @note -1 is used here because the incorrect-correct range is inclusive, [a,b]. So when sample is good at b+1, we set the end point at b. + const uint64_t incorrectBlockStops = CTime(m_sampling, currentIdx - 1).time(); + + m_PendingStimSet.appendStimulation(OVTK_StimulationId_NoArtifact, incorrectBlockStops, 0); + m_replacementInProgress = false; + } + } + + m_PendingBuffers.push_back(m_SwapBuffers); + } + } + + m_nLastSample = m_nSample; + m_nSample += count * m_overSamplingFactor; + + m_DriftCorrection.estimateDrift(count * m_overSamplingFactor); + + m_lastDeliveryTime = System::Time::zgetTime(); + m_gotData = true; + } + else { m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "The acquisition is not started\n"; } +} + +void CAcquisitionServer::setStimulationSet(const IStimulationSet& stimSet) +{ + if (m_isStarted) + { + const uint64_t time = CTime(m_sampling, m_nLastSample).time(); + Toolkit::StimulationSet::append(m_PendingStimSet, stimSet, time); + } + else { m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "The acquisition is not started\n"; } +} + + +bool CAcquisitionServer::updateImpedance(const size_t index, const double impedance) +{ + for (size_t i = 0; i < m_selectedChannels.size(); ++i) + { + if (index == m_selectedChannels[i]) + { + m_impedances[i] = impedance; + return true; + } + } + return false; +} + +// ____________________________________________________________________________ +// + +bool CAcquisitionServer::setOversamplingFactor(const uint64_t oversamplingFactor) +{ + m_overSamplingFactor = oversamplingFactor; + if (m_overSamplingFactor < 1) { m_overSamplingFactor = 1; } + if (m_overSamplingFactor > 16) { m_overSamplingFactor = 16; } + return true; +} + +// ____________________________________________________________________________ +// + +bool CAcquisitionServer::acceptNewConnection(Socket::IConnection* connection) +{ + if (!connection) { return false; } + + const uint64_t time = System::Time::zgetTime(); + + DoubleLock lock(&m_oPendingConnectionProtectionMutex, &m_oPendingConnectionExecutionMutex); + + connection_info_t info; + info.connectionTime = time; + info.stimulationTimeOffset = 0; // not used + info.nSampleToSkip = 0; // not used + info.connectionClientHandlerThread = nullptr; // not used + info.connectionClientHandlerStdThread = nullptr; // not used + info.isChannelLocalisationSent = false; + info.isChannelUnitsSent = false; + + m_pendingConnections.push_back(std::pair(connection, info)); + + for (auto itp = m_Plugins.begin(); itp != m_Plugins.end(); ++itp) { (*itp)->acceptNewConnectionHook(); } + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCAcquisitionServer.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCAcquisitionServer.h new file mode 100644 index 0000000..3c2b134 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCAcquisitionServer.h @@ -0,0 +1,184 @@ +#pragma once + +#include "ovas_base.h" +#include "ovasIDriver.h" +#include "ovasIHeader.h" +#include "ovasCDriftCorrection.h" + +#include + +#include +#include + +#include +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +class CConnectionServerHandlerThread; +class CConnectionClientHandlerThread; +class IAcquisitionServerPlugin; + +typedef struct +{ + uint64_t connectionTime; // Time the client connected + uint64_t stimulationTimeOffset; // Time offset wrt acquisition start + uint64_t nSampleToSkip; // How many samples to skip wrt current buffer start. n.b. not a constant. + CConnectionClientHandlerThread* connectionClientHandlerThread; // Ptr to the class object that is executed by the client connection handler thread + std::thread* connectionClientHandlerStdThread; // The actual thread handle + bool isChannelUnitsSent; + bool isChannelLocalisationSent; +} connection_info_t; + +enum class ENaNReplacementPolicy { LastCorrectValue=0, Zero, Disabled }; + +std::string toString(const ENaNReplacementPolicy policy); + +// Concurrency handling +class DoubleLock +{ + // Implements + // lock(mutex1); + // lock(mutex2); + // unlock(mutex1); + // mutex2 lock is released when the object goes out of scope + // + // @details The two mutex 'pattern' is used to avoid thread starving which can happen e.g. + // on Linux if just a single mutex is used; apparently the main loop just takes the + // mutex repeatedly without the gui thread sitting on the mutex being unlocked. + // n.b. potentially calls for redesign +public: + DoubleLock(std::mutex* m1, std::mutex* m2) : lock2(*m2, std::defer_lock) + { + std::lock_guard lock1(*m1); + lock2.lock(); + } + +private: + std::unique_lock lock2; +}; + +class CDriverContext; + +class CAcquisitionServer final : public IDriverCallback +{ +public: + + explicit CAcquisitionServer(const Kernel::IKernelContext& ctx); + ~CAcquisitionServer() override; + + IDriverContext& getDriverContext() const; + size_t getClientCount() const { return m_connections.size(); } + double getImpedance(const size_t index) { return (index < m_impedances.size()) ? m_impedances[index] : OVAS_Impedance_Unknown; } + + bool loop(); + + bool connect(IDriver& driver, IHeader& headerCopy, const uint32_t nSamplingPerSentBlock, const uint32_t port); + bool start(); + bool stop(); + bool disconnect(); + + // Driver samples information callback + void setSamples(const float* samples) override; + void setSamples(const float* samples, const size_t count) override; + void setStimulationSet(const IStimulationSet& stimSet) override; + + // Driver context callback + bool isConnected() const { return m_isInitialized; } + bool isStarted() const { return m_isStarted; } + bool updateImpedance(const size_t index, const double impedance); + + // General parameters configurable from the GUI + ENaNReplacementPolicy getNaNReplacementPolicy() const { return m_eNaNReplacementPolicy; } + uint64_t getOversamplingFactor() const { return m_overSamplingFactor; } + bool isImpedanceCheckRequested() const { return m_Driver ? m_Driver->getHeader()->isImpedanceCheckRequested() : false; } + bool isChannelSelectionRequested() const { return m_isChannelSelectionRequested; } + void setNaNReplacementPolicy(const ENaNReplacementPolicy policy) { m_eNaNReplacementPolicy = policy; } + bool setOversamplingFactor(const uint64_t oversamplingFactor); + void setImpedanceCheckRequest(const bool active) { m_isImpedanceCheckRequested = active; } + void setChannelSelectionRequest(const bool active) { m_isChannelSelectionRequested = active; } + + std::vector getPlugins() const { return m_Plugins; } + + bool acceptNewConnection(Socket::IConnection* connection); + + //---------- Variables ---------- + // See class DoubleLock + std::mutex m_ProtectionMutex; + std::mutex m_ExecutionMutex; + + std::deque> m_PendingBuffers; + std::vector m_SwapBuffers; + + size_t m_nSample = 0; + size_t m_startTime = 0; + + CDriftCorrection m_DriftCorrection; + CStimulationSet m_PendingStimSet; + + std::vector m_Plugins; + +protected: + static bool requestClientThreadQuit(CConnectionClientHandlerThread* th); + + //---------- Variables ---------- + std::mutex m_oPendingConnectionProtectionMutex; + std::mutex m_oPendingConnectionExecutionMutex; + + std::thread* m_connectionServerHandlerStdThread = nullptr; + + const Kernel::IKernelContext& m_kernelCtx; + CDriverContext* m_driverCtx = nullptr; + IDriver* m_Driver = nullptr; + const IHeader* m_headerCopy = nullptr; + + Kernel::IAlgorithmProxy* m_encoder = nullptr; + Kernel::TParameterHandler ip_subjectID; + Kernel::TParameterHandler ip_subjectAge; + Kernel::TParameterHandler ip_subjectGender; + Kernel::TParameterHandler ip_matrix; + Kernel::TParameterHandler ip_channelUnits; + Kernel::TParameterHandler ip_sampling; + Kernel::TParameterHandler ip_stimSet; + Kernel::TParameterHandler ip_bufferDuration; + Kernel::TParameterHandler op_buffer; + + Kernel::TParameterHandler ip_encodeChannelLocalisationData; + Kernel::TParameterHandler ip_encodeChannelUnitData; + + std::list> m_connections; + std::list> m_pendingConnections; + std::vector m_overSamplingSwapBuffers; + std::vector m_impedances; + std::vector m_selectedChannels; + std::vector m_selectedChannelNames; + Socket::IConnectionServer* m_connectionServer = nullptr; + + ENaNReplacementPolicy m_eNaNReplacementPolicy = ENaNReplacementPolicy::LastCorrectValue; + bool m_replacementInProgress = false; + + bool m_isInitialized = false; + bool m_isStarted = false; + bool m_isImpedanceCheckRequested = false; + bool m_isChannelSelectionRequested = false; + bool m_gotData = false; + size_t m_overSamplingFactor = 0; + size_t m_nChannel = 0; + size_t m_sampling = 0; + size_t m_nSamplePerSentBlock = 0; + size_t m_nLastSample = 0; + size_t m_lastDeliveryTime = 0; + + //CDriftCorrection m_DriftCorrection; + + size_t m_nJitterEstimationForDrift = 0; + size_t m_driverTimeoutDuration = 0; // ms after which the driver is considered having time-outed + int64_t m_startedDriverSleepDuration = 0; // ms, <0 == spin, 0 == yield thread, >0 sleep. Used when driver does not return samples. + size_t m_stoppedDriverSleepDuration = 0; // ms to sleep when driver is not running + + uint8_t* m_sampleBuffer = nullptr; + //CStimulationSet m_PendingStimSet; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCAcquisitionServerGUI.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCAcquisitionServerGUI.cpp new file mode 100755 index 0000000..c503b53 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCAcquisitionServerGUI.cpp @@ -0,0 +1,924 @@ +#include "ovasCAcquisitionServerGUI.h" +#include "ovasCAcquisitionServerThread.h" +#include "ovasCAcquisitionServer.h" +#include "ovasIAcquisitionServerPlugin.h" +// Drivers + +#ifdef TARGET_HAS_OpenViBEContributions +#include "contribAcquisitionServer.inl" +#endif + +#include "ovasCPluginLSLOutput.h" +#include "ovasCPluginFiddler.h" + +#include "generic-raw-reader/ovasCDriverGenericRawFileReader.h" +#include "generic-raw-reader/ovasCDriverGenericRawTelnetReader.h" + +// Simulation drivers +#include "generic-oscillator/ovasCDriverGenericOscillator.h" +#include "generic-sawtooth/ovasCDriverGenericSawTooth.h" +#include "generic-time-signal/ovasCDriverGenericTimeSignal.h" +#include "simulated-deviator/ovasCDriverSimulatedDeviator.h" + +#include "biosemi-activetwo/ovasCDriverBioSemiActiveTwo.h" +#include "brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.h" +#include "brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.h" +#include "brainproducts-vamp/ovasCDriverBrainProductsVAmp.h" +#include "brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.h" +#include "egi-ampserver/ovasCDriverEGIAmpServer.h" +#include "emotiv-epoc/ovasCDriverEmotivEPOC.h" +#include "labstreaminglayer/ovasCDriverLabStreamingLayer.h" +#include "micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.h" +#include "mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.h" +#include "mcs-nvx/ovasCDriverMCSNVXDriver.h" +#include "neuroelectrics-enobio3g/ovasCDriverEnobio3G.h" +#include "neuroservo/ovasCDriverNeuroServoHid.h" +#include "neurosky-mindset/ovasCDriverNeuroskyMindset.h" +#include "tmsi/ovasCDriverTMSi.h" +#include "tmsi-refa32b/ovasCDriverTMSiRefa32B.h" + +#include "mensia-acquisition/ovasCDriverMensiaAcquisition.h" + +#include + +// Plugins + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +// + +namespace OpenViBE { +namespace AcquisitionServer { + +#define OVAS_GUI_File OpenViBE::Directories::getDataDir() + "/applications/acquisition-server/interface.ui" + +// because std::tolower has multiple signatures, +// it can not be easily used in std::transform +// this workaround is taken from http://www.gcek.net/ref/books/sw/cpp/ticppv2/ +template +static T to_lower(T c) { return std::tolower(c); } + +static void PreferencePressedCB(GtkButton* button, void* data) { static_cast(data)->buttonPreferencePressedCB(button); } +static void ConfigurePressedCB(GtkButton* button, void* data) { static_cast(data)->buttonConfigurePressedCB(button); } +static void ConnectToggledCB(GtkToggleButton* button, void* data) { static_cast(data)->buttonConnectToggledCB(button); } +static void StartPressedCB(GtkButton* button, void* data) { static_cast(data)->buttonStartPressedCB(button); } +static void StopPressedCB(GtkButton* button, void* data) { static_cast(data)->buttonStopPressedCB(button); } +static void DriverChangedCB(GtkComboBox* box, void* data) { static_cast(data)->comboBoxDriverChanged(box); } + +static void SampleCountPerSentBlockChangedCB(GtkComboBox* box, void* data) +{ + static_cast(data)->comboBoxSampleCountPerSentBlockChanged(box); +} + +static bool compare_driver_names(IDriver* a, IDriver* b) +{ + std::string sA = a->getName(); + std::string sB = b->getName(); + + std::transform(sA.begin(), sA.end(), sA.begin(), tolower); + std::transform(sB.begin(), sB.end(), sB.begin(), tolower); + + return sA < sB; +} + +//___________________________________________________________________// +// // + +CAcquisitionServerGUI::CAcquisitionServerGUI(const Kernel::IKernelContext& ctx) + : m_kernelCtx(ctx) +{ + // bool showUnstable = m_kernelCtx.getConfigurationManager().expandAsBoolean("${AcquisitionServer_ShowUnstable}", false); + + m_acquisitionServer = new CAcquisitionServer(ctx); + + m_drivers.push_back(new CDriverGenericOscillator(m_acquisitionServer->getDriverContext())); + m_drivers.push_back(new CDriverGenericSawTooth(m_acquisitionServer->getDriverContext())); + m_drivers.push_back(new CDriverGenericTimeSignal(m_acquisitionServer->getDriverContext())); + m_drivers.push_back(new CDriverSimulatedDeviator(m_acquisitionServer->getDriverContext())); + + m_drivers.push_back(new CDriverGenericRawFileReader(m_acquisitionServer->getDriverContext())); + m_drivers.push_back(new CDriverGenericRawTelnetReader(m_acquisitionServer->getDriverContext())); + +#if defined TARGET_OS_Windows + m_drivers.push_back(new CDriverBrainProductsBrainampSeries(m_acquisitionServer->getDriverContext())); +#endif + +#if defined TARGET_HAS_ThirdPartyActiCHampAPI + m_drivers.push_back(new CDriverBrainProductsActiCHamp(m_acquisitionServer->getDriverContext())); +#endif + +#if defined TARGET_HAS_ThirdPartyLiveAmpAPI + m_drivers.push_back(new CDriverBrainProductsLiveAmp(m_acquisitionServer->getDriverContext())); +#endif + +#if defined TARGET_HAS_ThirdPartyBioSemiAPI + m_drivers.push_back(new CDriverBioSemiActiveTwo(m_acquisitionServer->getDriverContext())); +#endif + + m_drivers.push_back(new CDriverEGIAmpServer(m_acquisitionServer->getDriverContext())); + +#if defined TARGET_HAS_ThirdPartyEmotivAPI + m_drivers.push_back(new CDriverEmotivEPOC(m_acquisitionServer->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyEnobioAPI + m_drivers.push_back(new CDriverEnobio3G(m_acquisitionServer->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyMCS + m_drivers.push_back(new CDriverMKSNVXDriver(m_acquisitionServer->getDriverContext())); +#endif +#if defined(TARGET_HAS_ThirdPartyMicromed) + m_drivers.push_back(new CDriverMicromedSystemPlusEvolution(m_acquisitionServer->getDriverContext())); +#endif +#if defined(TARGET_HAS_ThirdPartyNeuroServo) + m_drivers.push_back(new CDriverNeuroServoHid(m_acquisitionServer->getDriverContext())); +#endif + //#if defined TARGET_HAS_ThirdPartyEEGOAPI + // m_drivers.push_back(new CDriverEEGO(m_acquisitionServer->getDriverContext())); + //#endif + + +#if defined(TARGET_HAS_ThirdPartyNeXus) + m_drivers.push_back(new CDriverMindMediaNeXus32B(m_acquisitionServer->getDriverContext())); + m_drivers.push_back(new CDriverTMSiRefa32B(m_acquisitionServer->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyThinkGearAPI + m_drivers.push_back(new CDriverNeuroskyMindset(m_acquisitionServer->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyTMSi + m_drivers.push_back(new CDriverTMSi(m_acquisitionServer->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyUSBFirstAmpAPI + m_drivers.push_back(new CDriverBrainProductsVAmp(m_acquisitionServer->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyLSL + m_drivers.push_back(new CDriverLabStreamingLayer(m_acquisitionServer->getDriverContext())); +#endif + + // BEGIN MENSIA ACQUISITION DRIVERS +#if defined TARGET_OS_Windows && defined TARGET_HasMensiaAcquisitionDriver + + m_acquisitionServer->getDriverContext().getLogManager() << Kernel::LogLevel_Trace << "Loading Mensia Driver Collection\n"; + m_libMensia = nullptr; + const std::string path = m_acquisitionServer->getDriverContext().getConfigurationManager().expand("${Path_Bin}/openvibe-driver-mensia-acquisition.dll"). + toASCIIString(); + if (!std::ifstream(path).is_open()) + { + m_acquisitionServer->getDriverContext().getLogManager() << Kernel::LogLevel_Trace << "Couldn't open" << + " dll file [" << path << "], perhaps it was not installed.\n"; + } + else + { + m_libMensia = System::WindowsUtilities::utf16CompliantLoadLibrary(path.c_str()); + HINSTANCE libModule = HINSTANCE(m_libMensia); + + //if it can't be open return FALSE; + if (libModule == nullptr) + { + m_acquisitionServer->getDriverContext().getLogManager() << Kernel::LogLevel_Warning << "Couldn't load DLL: [" << path << "]. Got error: [" + << size_t(GetLastError()) << "]\n"; + } + else + { + typedef int (*initialize_mensia_library_t)(); + const initialize_mensia_library_t initLibrary = initialize_mensia_library_t(GetProcAddress(libModule, "initializeAcquisitionLibrary")); + typedef const char* (*get_driver_id_t)(size_t driverId); + const get_driver_id_t getDriverID = get_driver_id_t(GetProcAddress(libModule, "getDriverId")); + + const int nDevice = initLibrary(); + if (nDevice >= 0) + { + for (size_t i = 0; i < size_t(nDevice); i++) + { + char id[1024]; + + strcpy(id, getDriverID(i)); + if (strcmp(id, "") != 0) + { + m_acquisitionServer->getDriverContext().getLogManager() << Kernel::LogLevel_Info << "Found driver [" << id << + "] in Mensia Driver Collection\n"; + m_drivers.push_back(new CDriverMensiaAcquisition(m_acquisitionServer->getDriverContext(), id)); + } + } + } + else + { + m_acquisitionServer->getDriverContext().getLogManager() << Kernel::LogLevel_Error << + "Error occurred while initializing Mensia Acquisition Library\n"; + } + + FreeLibrary(libModule); + } + } +#endif + // END MENSIA ACQUISITION DRIVERS + +#if defined TARGET_HAS_OpenViBEContributions + Contributions::InitiateContributions(this, m_acquisitionServer, ctx, &m_drivers); +#endif + + // Plugins that just send out data must be the last in list (since other plugins may modify the data) + +#if defined TARGET_HAS_ThirdPartyLSL + registerPlugin(new Plugins::CPluginLSLOutput(ctx)); +#endif + + registerPlugin(new Plugins::CPluginFiddler(ctx)); + + std::sort(m_drivers.begin(), m_drivers.end(), compare_driver_names); + + scanPluginSettings(); + + m_acquisitionServerThread = new CAcquisitionServerThread(m_kernelCtx, *this, *m_acquisitionServer); + + // Initialize GTK objects as the thread started below may refer to them quickly + this->initialize(); + + m_thread = new std::thread(CAcquisitionServerThreadHandle(*m_acquisitionServerThread)); +} + +CAcquisitionServerGUI::~CAcquisitionServerGUI() +{ + m_acquisitionServerThread->terminate(); + m_thread->join(); + + savePluginSettings(); + + // Saves current configuration + FILE* file = fopen(m_kernelCtx.getConfigurationManager().expand("${Path_UserData}/openvibe-acquisition-server.conf").toASCIIString(), "wt"); + if (file) + { + fprintf(file, "# This file is generated\n"); + fprintf(file, "# Do not modify\n"); + fprintf(file, "\n"); + fprintf(file, "# Last settings set in the acquisition server\n"); + fprintf(file, "AcquisitionServer_LastDriver = %s\n", m_Driver->getName()); + fprintf(file, "AcquisitionServer_LastSampleCountPerBuffer = %i\n", this->getSampleCountPerBuffer()); + fprintf(file, "AcquisitionServer_LastConnectionPort = %i\n", this->getTCPPort()); + fprintf(file, "# Last Preferences set in the acquisition server\n"); + fprintf(file, "AcquisitionServer_DriftCorrectionPolicy = %s\n", m_acquisitionServer->m_DriftCorrection.getDriftCorrectionPolicyStr().toASCIIString()); + fprintf(file, "AcquisitionServer_JitterEstimationCountForDrift = %u\n", + uint32_t(m_acquisitionServer->m_DriftCorrection.getJitterEstimationCountForDrift())); + fprintf(file, "AcquisitionServer_DriftToleranceDuration = %u\n", uint32_t(m_acquisitionServer->m_DriftCorrection.getDriftToleranceDurationMs())); + fprintf(file, "AcquisitionServer_OverSamplingFactor = %u\n", uint32_t(m_acquisitionServer->getOversamplingFactor())); + fprintf(file, "AcquisitionServer_ChannelSelection = %s\n", (m_acquisitionServer->isChannelSelectionRequested() ? "True" : "False")); + fprintf(file, "AcquisitionServer_NaNReplacementPolicy = %s\n", toString(m_acquisitionServer->getNaNReplacementPolicy()).c_str()); + + fprintf(file, "# Settings for various device drivers\n"); + std::vector tokens; + Kernel::IConfigurationManager* configMgr = &m_kernelCtx.getConfigurationManager(); + CIdentifier tokenID; // defaults to CIdentifier::undefined() + // Collect token names + while ((tokenID = configMgr->getNextConfigurationTokenIdentifier(tokenID)) != CIdentifier::undefined()) + { + const std::string prefix("AcquisitionServer_Driver_"); + const std::string prefix2("AcquisitionServer_Plugin_"); + CString tokenName = configMgr->getConfigurationTokenName(tokenID); + if (std::string(tokenName.toASCIIString()).compare(0, prefix.length(), prefix) == 0 || + std::string(tokenName.toASCIIString()).compare(0, prefix.length(), prefix2) == 0) + { + std::string token = std::string(tokenName.toASCIIString()); + tokens.push_back(token); + } + } + std::sort(tokens.begin(), tokens.end()); + // Write out as sorted + for (size_t i = 0; i < tokens.size(); ++i) + { + CString tokenValue = configMgr->lookUpConfigurationTokenValue(tokens[i].c_str()); + fprintf(file, "%s = %s\n", tokens[i].c_str(), tokenValue.toASCIIString()); + } + + fclose(file); + } + + for (auto it = m_drivers.begin(); it != m_drivers.end(); ++it) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "Deleting " << (*it)->getName() << "\n"; + delete (*it); + } + + m_drivers.clear(); + m_Driver = nullptr; + + // BEGIN MENSIA ACQUISITION DRIVERS + // For future implementation +#if defined TARGET_OS_Windows && defined TARGET_HasMensiaAcquisitionDriver + typedef int (*release_mensia_library_t)(); + release_mensia_library_t fpReleaseMensiaLibrary = release_mensia_library_t(GetProcAddress(HINSTANCE(m_libMensia), "releaseAcquisitionLibrary")); + // fpReleaseMensiaLibrary(); +#endif + // END MENSIA ACQUISITION DRIVERS + + delete m_thread; + m_thread = nullptr; + + delete m_acquisitionServerThread; + m_acquisitionServerThread = nullptr; + + delete m_acquisitionServer; + m_acquisitionServer = nullptr; +} + +//___________________________________________________________________// +// // + +bool CAcquisitionServerGUI::initialize() +{ + m_builder = gtk_builder_new(); // glade_xml_new(OVAS_GUI_File, nullptr, nullptr); + gtk_builder_add_from_file(m_builder, OVAS_GUI_File, nullptr); + + // Connects custom GTK signals + + // Note: Seems the signals below have to be "clicked", not "pressed", or the underlined keyboard shortcuts + // of gtk stock items that can be activated with alt key ("mnemonics") do not work. + g_signal_connect(gtk_builder_get_object(m_builder, "button_preference"), "clicked", G_CALLBACK(PreferencePressedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder, "button_configure"), "clicked", G_CALLBACK(ConfigurePressedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder, "togglebutton_connect"), "toggled", G_CALLBACK(ConnectToggledCB), this); + g_signal_connect(gtk_builder_get_object(m_builder, "button_play"), "clicked", G_CALLBACK(StartPressedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder, "button_stop"), "clicked", G_CALLBACK(StopPressedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder, "combobox_driver"), "changed", G_CALLBACK(DriverChangedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder, "combobox_sample_count_per_sent_block"), "changed", + G_CALLBACK(SampleCountPerSentBlockChangedCB), this); + gtk_builder_connect_signals(m_builder, nullptr); + + GtkComboBox* comboBoxDriver = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_driver")); + + enum { Resource_StringMarkup }; + + // Prepares drivers combo box + + gtk_combo_box_set_model(comboBoxDriver, nullptr); + + GtkCellRenderer* cellRendererName = gtk_cell_renderer_text_new(); + + gtk_cell_layout_clear(GTK_CELL_LAYOUT(comboBoxDriver)); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(comboBoxDriver), cellRendererName, TRUE); + gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(comboBoxDriver), cellRendererName, "markup", Resource_StringMarkup); + + GtkTreeStore* driverTreeStore = gtk_tree_store_new(1, G_TYPE_STRING); + gtk_combo_box_set_model(comboBoxDriver, GTK_TREE_MODEL(driverTreeStore)); + + std::string defaultDriverName = m_kernelCtx.getConfigurationManager().expand("${AcquisitionServer_DefaultDriver}").toASCIIString(); + transform(defaultDriverName.begin(), defaultDriverName.end(), defaultDriverName.begin(), to_lower); + for (size_t i = 0; i < m_drivers.size(); ++i) // n.b. dont use iterator here as we need a numeric index for gtk later anyway + { + IDriver* driver = m_drivers[i]; + + GtkTreeIter it; + gtk_tree_store_append(driverTreeStore, &it, nullptr); + + std::string name = driver->getName(); + + const bool unstable = driver->isFlagSet(EDriverFlag::IsUnstable); + const bool deprecated = driver->isFlagSet(EDriverFlag::IsDeprecated); + + const std::string toDisplay = std::string((unstable || deprecated) ? "" : "") + name + + ((unstable || deprecated) ? "" : "") + + (unstable ? " (unstable)" : "") + + (deprecated ? " (deprecated)" : ""); + + gtk_tree_store_set(driverTreeStore, &it, Resource_StringMarkup, toDisplay.c_str(), -1); + + transform(name.begin(), name.end(), name.begin(), to_lower); + if (defaultDriverName == name) { gtk_combo_box_set_active(comboBoxDriver, gint(i)); } + } + if (gtk_combo_box_get_active(comboBoxDriver) == -1) { gtk_combo_box_set_active(comboBoxDriver, 0); } + + // Prepares sample count per buffer combo box + + bool found = false; + const std::string nSamplePerBuffer = m_kernelCtx.getConfigurationManager().expand("${AcquisitionServer_DefaultSampleCountPerBuffer}").toASCIIString(); + GtkComboBox* boxNSamplePerBuffer = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sample_count_per_sent_block")); + for (int i = 0; ; ++i) + { + gtk_combo_box_set_active(boxNSamplePerBuffer, i); + if (gtk_combo_box_get_active(boxNSamplePerBuffer) == -1) { break; } + if (nSamplePerBuffer == gtk_combo_box_get_active_text(boxNSamplePerBuffer)) + { + found = true; + break; + } + } + if (!found) + { + if (nSamplePerBuffer != "-1") { gtk_combo_box_prepend_text(boxNSamplePerBuffer, nSamplePerBuffer.c_str()); } + gtk_combo_box_set_active(boxNSamplePerBuffer, 0); + } + + // Prepares default connection port + + GtkSpinButton* buttonConnectionPort = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_connection_port")); + gtk_spin_button_update(buttonConnectionPort); + const uint64_t connectionPort = m_kernelCtx.getConfigurationManager().expandAsUInteger("${AcquisitionServer_DefaultConnectionPort}", 1024); + gtk_spin_button_set_value(buttonConnectionPort, gdouble(connectionPort)); + + // Optionnally autostarts + + if (m_kernelCtx.getConfigurationManager().expandAsBoolean("${AcquisitionServer_AutoStart}", false)) + { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "togglebutton_connect")), TRUE); + gtk_button_pressed(GTK_BUTTON(gtk_builder_get_object(m_builder, "button_play"))); + } + + + // Shows main window + if (!m_kernelCtx.getConfigurationManager().expandAsBoolean("${AcquisitionServer_NoGUI}", false)) + { + GtkWidget* mainWindow = GTK_WIDGET(gtk_builder_get_object(m_builder, "openvibe-acquisition-server")); + + std::string title(gtk_window_get_title(GTK_WINDOW(mainWindow))); +#if defined(TARGET_ARCHITECTURE_x64) + title += " (64bit)"; +#else + title += " (32bit)"; +#endif + gtk_window_set_title(GTK_WINDOW(mainWindow), title.c_str()); + + gtk_widget_show(mainWindow); + } + + return true; +} + +//___________________________________________________________________// +// // + +uint32_t CAcquisitionServerGUI::getTCPPort() const +{ + GtkSpinButton* button = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_connection_port")); + gtk_spin_button_update(button); + return gtk_spin_button_get_value_as_int(button); +} + +void CAcquisitionServerGUI::setClientText(const char* sClientText) const +{ + gtk_label_set_label(GTK_LABEL(gtk_builder_get_object(m_builder, "label_connected_host_count")), sClientText); +} + +void CAcquisitionServerGUI::setStateText(const char* sStateText) const +{ + gtk_label_set_label(GTK_LABEL(gtk_builder_get_object(m_builder, "label_status")), sStateText); +} + +void CAcquisitionServerGUI::setDriftMs(const double ms) const +{ + const uint64_t driftTolerance = m_acquisitionServer->m_DriftCorrection.getDriftToleranceDurationMs(); + double driftRatio = ms / double(driftTolerance); + bool driftWarning = false; + char label[1024]; + +#ifdef TIMINGDEBUG + std::cout << "GUI drift " << ms << " rat " << driftRatio << "\n"; +#endif + + if (driftRatio < -1) + { + driftRatio = -1; + driftWarning = true; + } + + if (driftRatio > 1) + { + driftRatio = 1; + driftWarning = true; + } + + if (driftRatio < 0) + { + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(gtk_builder_get_object(m_builder, "progressbar_drift_1")), -driftRatio); + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(gtk_builder_get_object(m_builder, "progressbar_drift_2")), 0); + } + else + { + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(gtk_builder_get_object(m_builder, "progressbar_drift_1")), 0); + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(gtk_builder_get_object(m_builder, "progressbar_drift_2")), driftRatio); + } + + if (driftWarning) + { + sprintf(label, "Device drift is too high : %3.2lf ms\nlate <-- (tolerance is set to %u ms) --> early", ms, + uint32_t(driftTolerance)); + } + else { sprintf(label, "Device drift : %3.2lf ms\nlate <-- (tolerance is set to %u ms) --> early", ms, uint32_t(driftTolerance)); } + gtk_label_set_markup(GTK_LABEL(gtk_builder_get_object(m_builder, "label_drift")), label); +} + +void CAcquisitionServerGUI::setImpedance(const uint32_t index, const double impedance) +{ + if (m_impedanceWindow) + { + if (impedance >= 0) + { + //double fraction = (impedance*.001/20); With fixed impedance limit, 20kOhm max / 25%=5kOhm to be good + double fraction = (impedance / (m_kernelCtx.getConfigurationManager().expandAsFloat("${AcquisitionServer_DefaultImpedanceLimit}", 5000) * 4)); + if (fraction > 1) { fraction = 1; } + + char msg[1024]; + char label[1024]; + char sImpedance[1024]; + char status[1024]; + + if (strcmp(m_headerCopy.getChannelName(index), "")) { strcpy(label, m_headerCopy.getChannelName(index)); } + else { sprintf(label, "Channel %i", index + 1); } + + if (fraction == 1) { sprintf(sImpedance, "Too high !"); } + else { sprintf(sImpedance, "%.2f kOhm", impedance * .001); } + + sprintf(status, "%s", fraction < .25 ? "Good !" : "Bad..."); + sprintf(msg, "%s\n%s\n\n%s", label, sImpedance, status); + + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(m_levelMesures[index]), fraction); + gtk_progress_bar_set_text(GTK_PROGRESS_BAR(m_levelMesures[index]), msg); + } + else + { + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(m_levelMesures[index]), 0); + if (impedance == OVAS_Impedance_Unknown) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(m_levelMesures[index]), "Measuring..."); } + else if (impedance == OVAS_Impedance_NotAvailable) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(m_levelMesures[index]), "n/a"); } + else { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(m_levelMesures[index]), "Unknown"); } + } + } +} + +void CAcquisitionServerGUI::disconnect() const +{ + GtkToggleButton* button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "togglebutton_connect")); + if (gtk_toggle_button_get_active(button)) { gtk_toggle_button_set_active(button, false); } +} + +//___________________________________________________________________// +// // + +void CAcquisitionServerGUI::buttonConnectToggledCB(GtkToggleButton* button) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "buttonConnectToggledCB\n"; + + if (gtk_toggle_button_get_active(button)) + { + if (m_nSamplePerBuffer != uint32_t(-1) && m_acquisitionServerThread->connect()) + { + // Impedance window creation + { + const uint64_t nCol = m_kernelCtx.getConfigurationManager().expandAsInteger( + "${AcquisitionServer_CheckImpedance_ColumnCount}", 8); + const size_t nRow = size_t(m_headerCopy.getChannelCount() / nCol); + const size_t lastCount = size_t(m_headerCopy.getChannelCount() % nCol); + + GtkWidget* table = gtk_table_new(gint(nRow + (lastCount ? 1 : 0)), gint((nRow ? nCol : lastCount)), true); + + for (size_t i = 0; i < m_headerCopy.getChannelCount(); ++i) + { + const uint32_t j = uint32_t(i / nCol); + const uint32_t k = uint32_t(i % nCol); + GtkWidget* progressBar = gtk_progress_bar_new(); + gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(progressBar), GTK_PROGRESS_BOTTOM_TO_TOP); + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progressBar), 0); + gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progressBar), "n/a"); + gtk_table_attach_defaults(GTK_TABLE(table), progressBar, k, k + 1, j, j + 1); + m_levelMesures.push_back(progressBar); + } + + m_impedanceWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(m_impedanceWindow), "Impedance check"); + gtk_container_add(GTK_CONTAINER(m_impedanceWindow), table); + if (m_acquisitionServer->isImpedanceCheckRequested()) { gtk_widget_show_all(m_impedanceWindow); } + } + + gtk_button_set_label(GTK_BUTTON(button), "gtk-disconnect"); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_configure")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_preference")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_play")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_stop")), false); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_connection_port")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_sample_count_per_sent_block")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_driver")), false); + } + else + { + if (m_nSamplePerBuffer == uint32_t(-1)) { m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Sample count per sent block is invalid.\n"; } + + gtk_toggle_button_set_active(button, false); + } + } + else + { + m_acquisitionServerThread->disconnect(); + + if (m_impedanceWindow) + { + gtk_widget_destroy(m_impedanceWindow); + m_levelMesures.clear(); + m_impedanceWindow = nullptr; + } + + gtk_button_set_label(GTK_BUTTON(button), "gtk-connect"); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_configure")), m_Driver->isConfigurable()); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_preference")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_play")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_stop")), false); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_connection_port")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_sample_count_per_sent_block")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_driver")), true); + + setClientText(""); + } +} + +void CAcquisitionServerGUI::buttonStartPressedCB(GtkButton* /*button*/) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "buttonStartPressedCB\n"; + + if (m_acquisitionServerThread->start()) + { + if (m_impedanceWindow) { gtk_widget_hide(m_impedanceWindow); } + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_play")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_stop")), true); + + setStateText("Starting..."); + } + else + { + setStateText("Start failed !"); + setClientText(""); + } +} + +void CAcquisitionServerGUI::buttonStopPressedCB(GtkButton* /*button*/) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "buttonStopPressedCB\n"; + + if (m_acquisitionServerThread->stop()) + { + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_play")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_stop")), false); + } + else + { + setStateText("Stop failed !"); + setClientText(""); + } +} + +void CAcquisitionServerGUI::buttonPreferencePressedCB(GtkButton* /*button*/) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "buttonPreferencePressedCB\n"; + + GtkBuilder* builder = gtk_builder_new(); + gtk_builder_add_from_file(builder, OVAS_GUI_File, nullptr); + GtkDialog* dialog = GTK_DIALOG(gtk_builder_get_object(builder, "openvibe-acquisition-server-configuration")); + GtkComboBox* driftCorrectionPolicy = GTK_COMBO_BOX(gtk_builder_get_object(builder, "combobox_drift_correction")); + GtkComboBox* naNReplacementPolicy = GTK_COMBO_BOX(gtk_builder_get_object(builder, "combobox_nan_replacement")); + GtkSpinButton* driftTolerance = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "spinbutton_drift_tolerance")); + GtkSpinButton* jitterMeasureCount = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "spinbutton_jitter_measure_count")); + GtkSpinButton* overSamplingFactor = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "spinbutton_oversampling_factor")); + GtkToggleButton* channelSelection = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "checkbutton_channel_selection")); + + gtk_combo_box_set_active(driftCorrectionPolicy, int(m_acquisitionServer->m_DriftCorrection.getDriftCorrectionPolicy())); + gtk_spin_button_set_value(driftTolerance, gdouble(m_acquisitionServer->m_DriftCorrection.getDriftToleranceDurationMs())); + gtk_spin_button_set_value(jitterMeasureCount, gdouble(m_acquisitionServer->m_DriftCorrection.getJitterEstimationCountForDrift())); + gtk_spin_button_set_value(overSamplingFactor, gdouble(m_acquisitionServer->getOversamplingFactor())); + gtk_toggle_button_set_active(channelSelection, m_acquisitionServer->isChannelSelectionRequested() ? TRUE : FALSE); + gtk_combo_box_set_active(naNReplacementPolicy, int(m_acquisitionServer->getNaNReplacementPolicy())); + + // Load the settings for the plugins + + GtkTable* settingsTable = GTK_TABLE(gtk_builder_get_object(builder, "table-pluginsettings")); + + gtk_table_resize(settingsTable, guint(m_PluginsProperties.size()), 2); + + for (size_t i = 0; i < m_PluginsProperties.size(); ++i) + { + Property* property = m_PluginsProperties[i].m_Property; + + // Create the setting controller widget + GtkWidget* settingControl; + + if (const TypedProperty* rb = dynamic_cast*>(property)) + { + // std::cout << "bool\n"; + settingControl = gtk_check_button_new(); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(settingControl), *(rb->getData())); + } + else if (const TypedProperty* rcs = dynamic_cast*>(property)) + { + // std::cout << "string\n"; + settingControl = gtk_entry_new(); + gtk_entry_append_text(GTK_ENTRY(settingControl), rcs->getData()->toASCIIString()); + } + else if (const TypedProperty* rs = dynamic_cast*>(property)) + { + // std::cout << "string\n"; + settingControl = gtk_entry_new(); + gtk_entry_append_text(GTK_ENTRY(settingControl), rs->getData()->c_str()); + } + else if (const TypedProperty* ru32 = dynamic_cast*>(property)) + { + // std::cout << "uinteger\n"; + settingControl = gtk_spin_button_new_with_range(gdouble(std::numeric_limits::min()), gdouble(std::numeric_limits::max()), 1.0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(settingControl), gdouble(*(ru32->getData()))); + } + else if (const TypedProperty* ru64 = dynamic_cast*>(property)) + { + // std::cout << "uinteger\n"; + settingControl = gtk_spin_button_new_with_range(gdouble(std::numeric_limits::min()), gdouble(std::numeric_limits::max()), 1.0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(settingControl), gdouble(*(ru64->getData()))); + } + else if (const TypedProperty* ri = dynamic_cast*>(property)) + { + // std::cout << "integer\n"; + settingControl = gtk_spin_button_new_with_range(gdouble(std::numeric_limits::min()), gdouble(std::numeric_limits::max()), 1.0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(settingControl), gdouble(*(ri->getData()))); + } + else if (const TypedProperty* rf = dynamic_cast*>(property)) + { + // std::cout << "float\n"; + settingControl = gtk_spin_button_new_with_range(gdouble(std::numeric_limits::min()), gdouble(std::numeric_limits::max()), 1.0); + gtk_spin_button_set_digits(GTK_SPIN_BUTTON(settingControl), 5); + gtk_spin_button_set_increments(GTK_SPIN_BUTTON(settingControl), 0.1F, 1.0F); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(settingControl), gdouble(*(rf->getData()))); + } + else + { + // std::cout << "unknown\n"; + settingControl = gtk_label_new("Undefined Type"); + } + + if (settingControl) + { + // Create label + GtkWidget* settingLabel = gtk_label_new(property->getName().toASCIIString()); + + // align to left + gtk_misc_set_alignment(GTK_MISC(settingLabel), 0.0, 0.0); + + // insert the settings into the table + gtk_table_attach(settingsTable, settingLabel, 0, 1, guint(i), guint(i + 1), GTK_FILL, GTK_SHRINK, 2, 0); + gtk_table_attach_defaults(settingsTable, settingControl, 1, 2, guint(i), guint(i + 1)); + + m_PluginsProperties[i].m_Widget = settingControl; + gtk_widget_show(settingLabel); + gtk_widget_show(settingControl); + } + } + + const gint responseId = gtk_dialog_run(dialog); + switch (responseId) + { + case GTK_RESPONSE_APPLY: + case GTK_RESPONSE_OK: + case GTK_RESPONSE_YES: m_acquisitionServer->setNaNReplacementPolicy(ENaNReplacementPolicy(gtk_combo_box_get_active(naNReplacementPolicy))); + m_acquisitionServer->m_DriftCorrection.setDriftCorrectionPolicy(EDriftCorrectionPolicies(gtk_combo_box_get_active(driftCorrectionPolicy))); + m_acquisitionServer->m_DriftCorrection.setDriftToleranceDurationMs(gtk_spin_button_get_value_as_int(driftTolerance)); + m_acquisitionServer->m_DriftCorrection.setJitterEstimationCountForDrift(gtk_spin_button_get_value_as_int(jitterMeasureCount)); + m_acquisitionServer->setOversamplingFactor(gtk_spin_button_get_value_as_int(overSamplingFactor)); + m_acquisitionServer->setChannelSelectionRequest(gtk_toggle_button_get_active(channelSelection) ? true : false); + + // Side-effect: Update the tolerance ms + setDriftMs(0); + + for (size_t index = 0; index < m_PluginsProperties.size(); ++index) + { + Property* property = m_PluginsProperties[index].m_Property; + + if (TypedProperty* rb = dynamic_cast*>(property)) + { + // std::cout << "bool\n"; + bool tmp = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_PluginsProperties[index].m_Widget)) ? true : false; + rb->replaceData(tmp); + } + else if (TypedProperty* rcs = dynamic_cast*>(property)) + { + CString tmp = CString(gtk_entry_get_text(GTK_ENTRY(m_PluginsProperties[index].m_Widget))); + // std::cout << "string: " << tmp.toASCIIString() << "\n"; + rcs->replaceData(tmp); + } + else if (TypedProperty* rs = dynamic_cast*>(property)) + { + std::string tmp = std::string(gtk_entry_get_text(GTK_ENTRY(m_PluginsProperties[index].m_Widget))); + // std::cout << "string: " << tmp.toASCIIString() << "\n"; + rs->replaceData(tmp); + } + else if (TypedProperty* ri = dynamic_cast*>(property)) + { + // std::cout << "integer\n"; + GtkSpinButton* spinButton = GTK_SPIN_BUTTON(m_PluginsProperties[index].m_Widget); + gtk_spin_button_update(spinButton); + int64_t tmp = int64_t(gtk_spin_button_get_value(spinButton)); + ri->replaceData(tmp); + } + else if (TypedProperty* ru32 = dynamic_cast*>(property)) + { + // std::cout << "uinteger\n"; + GtkSpinButton* spinButton = GTK_SPIN_BUTTON(m_PluginsProperties[index].m_Widget); + gtk_spin_button_update(spinButton); + uint32_t tmp = uint32_t(gtk_spin_button_get_value(spinButton)); + ru32->replaceData(tmp); + } + else if (TypedProperty* ru64 = dynamic_cast*>(property)) + { + // std::cout << "uinteger\n"; + GtkSpinButton* spinButton = GTK_SPIN_BUTTON(m_PluginsProperties[index].m_Widget); + gtk_spin_button_update(spinButton); + uint64_t tmp = uint64_t(gtk_spin_button_get_value(spinButton)); + ru64->replaceData(tmp); + } + else if (TypedProperty* rf = dynamic_cast*>(property)) + { + // std::cout << "float\n"; + GtkSpinButton* spinButton = GTK_SPIN_BUTTON(m_PluginsProperties[index].m_Widget); + gtk_spin_button_update(spinButton); + float tmp = float(gtk_spin_button_get_value(spinButton)); + rf->replaceData(tmp); + } + else { } // std::cout << "unknown\n"; + } + + + break; + case GTK_RESPONSE_CANCEL: + case GTK_RESPONSE_NO: break; + default: break; + } + + gtk_widget_destroy(GTK_WIDGET(dialog)); + g_object_unref(builder); +} + +void CAcquisitionServerGUI::buttonConfigurePressedCB(GtkButton* /*button*/) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "buttonConfigurePressedCB\n"; + if (m_Driver->isConfigurable()) { m_Driver->configure(); } +} + +void CAcquisitionServerGUI::comboBoxDriverChanged(GtkComboBox* box) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "comboBoxDriverChanged\n"; + m_Driver = m_drivers[gtk_combo_box_get_active(box)]; + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_configure")), m_Driver->isConfigurable()); +} + +void CAcquisitionServerGUI::comboBoxSampleCountPerSentBlockChanged(GtkComboBox* /*box*/) +{ + int nSamplePerSentBlock = 0; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "comboBoxSampleCountPerSentBlockChanged\n"; + if (sscanf(gtk_combo_box_get_active_text(GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sample_count_per_sent_block"))), "%i", + &nSamplePerSentBlock) == 1 && nSamplePerSentBlock > 0) { m_nSamplePerBuffer = uint32_t(nSamplePerSentBlock); } + else { m_nSamplePerBuffer = uint32_t(-1); } +} + +void CAcquisitionServerGUI::registerPlugin(IAcquisitionServerPlugin* plugin) const +{ + if (m_acquisitionServer != nullptr) { m_acquisitionServer->m_Plugins.push_back(plugin); } +} + +/** + * \brief This function scans all registered plugins for settings. + * + * All of the plugins are inserted into a vector containing the pointer to the actual settings structure + * along with a unique name for settings. + */ +void CAcquisitionServerGUI::scanPluginSettings() +{ + std::vector plugins = m_acquisitionServer->getPlugins(); + + m_PluginsProperties.clear(); + + for (auto itp = plugins.begin(); itp != plugins.end(); ++itp) + { + IAcquisitionServerPlugin* plugin = dynamic_cast(*itp); + + SettingsHelper& tmp = plugin->getSettingsHelper(); + const std::map& props = tmp.getAllProperties(); + + for (auto it = props.begin(); it != props.end(); ++it) { m_PluginsProperties.push_back(PropertyAndWidget(it->second, nullptr)); } + } +} + +void CAcquisitionServerGUI::savePluginSettings() const +{ + std::vector plugins = m_acquisitionServer->getPlugins(); + + for (auto itp = plugins.begin(); itp != plugins.end(); ++itp) + { + IAcquisitionServerPlugin* plugin = dynamic_cast(*itp); + SettingsHelper& tmp = plugin->getSettingsHelper(); + tmp.save(); + } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCAcquisitionServerGUI.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCAcquisitionServerGUI.h new file mode 100644 index 0000000..4c1ef10 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCAcquisitionServerGUI.h @@ -0,0 +1,93 @@ +#pragma once + +#include "ovas_base.h" +#include "ovasIDriver.h" +#include "ovasIHeader.h" +#include "ovasCHeader.h" + +#include + +#include + +namespace OpenViBE { +namespace AcquisitionServer { +class CAcquisitionServer; +class CAcquisitionServerThread; +class IAcquisitionServerPlugin; +struct PluginSetting; +class Property; + +class CAcquisitionServerGUI final +{ +public: + + explicit CAcquisitionServerGUI(const Kernel::IKernelContext& ctx); + ~CAcquisitionServerGUI(); + + bool initialize(); + + IDriver& getDriver() const { return *m_Driver; } + uint32_t getSampleCountPerBuffer() { return m_nSamplePerBuffer; } + uint32_t getTCPPort() const; + IHeader& getHeaderCopy() { return m_headerCopy; } + + void setStateText(const char* sStateText) const; + void setClientText(const char* sClientText) const; + void setDriftMs(double ms) const; + void setImpedance(uint32_t index, double impedance); + void disconnect() const; + + // GTK button callbacks + void buttonPreferencePressedCB(GtkButton* button); + void buttonConfigurePressedCB(GtkButton* button); + void buttonConnectToggledCB(GtkToggleButton* button); + void buttonStartPressedCB(GtkButton* button); + void buttonStopPressedCB(GtkButton* button); + void comboBoxDriverChanged(GtkComboBox* box); + void comboBoxSampleCountPerSentBlockChanged(GtkComboBox* box); + + /// registers a new acquisition server plugin, the plugin is activated immediately + void registerPlugin(IAcquisitionServerPlugin* plugin) const; + + /// scans all plugins for settings and puts them into a flat structure easier to handle + void scanPluginSettings(); + + void savePluginSettings() const; + + class PropertyAndWidget + { + public: + PropertyAndWidget(Property* prop, GtkWidget* widget) : m_Property(prop), m_Widget(widget) { } + + Property* m_Property = nullptr; + GtkWidget* m_Widget = nullptr; + }; + + /// holds references to the plugins' settings for faster access + std::vector m_PluginsProperties; + +protected : + + const Kernel::IKernelContext& m_kernelCtx; + IDriver* m_Driver = nullptr; + IDriverContext* m_driverCtx = nullptr; + CAcquisitionServer* m_acquisitionServer = nullptr; + CAcquisitionServerThread* m_acquisitionServerThread = nullptr; + CHeader m_headerCopy; + + uint32_t m_nSamplePerBuffer = 0; + + std::vector m_drivers; + + GtkBuilder* m_builder = nullptr; + + GtkWidget* m_impedanceWindow = nullptr; + std::vector m_levelMesures; + + std::thread* m_thread = nullptr; +#if defined TARGET_OS_Windows && defined TARGET_HasMensiaAcquisitionDriver + void* m_libMensia = nullptr; +#endif +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCAcquisitionServerThread.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCAcquisitionServerThread.h new file mode 100644 index 0000000..38fd2d9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCAcquisitionServerThread.h @@ -0,0 +1,294 @@ +#pragma once + +#include "ovasCAcquisitionServerGUI.h" +#include "ovasCAcquisitionServer.h" + +#include +#include // std::abs() for Fedora + +// fwd declare of gtk idle callbacks +static gboolean idle_updateimpedance_cb(void* data); +static gboolean idle_updatedrift_cb(void* data); +static gboolean idle_updatedisconnect_cb(void* data); +static gboolean idle_updatestatus_cb(void* data); + +namespace OpenViBE { +namespace AcquisitionServer { +class CAcquisitionServerThread +{ +public: + + enum class EStatus { Idle, Connected, Started, Finished }; + + CAcquisitionServerThread(const Kernel::IKernelContext& ctx, CAcquisitionServerGUI& gui, CAcquisitionServer& acquisitionServer) + : m_kernelCtx(ctx), m_gui(gui), m_acquisitionServer(acquisitionServer) { } // Always call update on start + + void main() + { + bool finished = false; + uint64_t lastGUIUpdate = 0; + + while (!finished) + { + bool shouldSleep = false; + bool shouldDisconnect = false; + size_t clientCount; + double driftMs; + + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + + clientCount = m_acquisitionServer.getClientCount(); + driftMs = (m_status == EStatus::Started ? m_acquisitionServer.m_DriftCorrection.getDriftMs() : 0); + + + switch (m_status) + { + case EStatus::Idle: shouldSleep = true; + break; + + case EStatus::Connected: + case EStatus::Started: + { + if (!m_acquisitionServer.loop()) { shouldDisconnect = true; } + else { for (size_t i = 0; i < m_impedances.size(); ++i) { m_impedances[i] = m_acquisitionServer.getImpedance(i); } } + } + break; + + case EStatus::Finished: finished = true; + break; + + default: break; + } + } + + if (!finished) + { + if (m_acquisitionServer.isImpedanceCheckRequested()) + { + // In the impedance check mode, we need to yield the thread to get reliable redraw + shouldSleep = true; + } + + // Update the GUI if the variables have changed. In order to avoid + // gdk_threads_enter()/gdk_threads_exit() calls that may not work on all + // backends (esp. Windows), delegate the work to g_idle_add() functions. + // As a result, we need to protect access to the variables that the callbacks use; + // this protection is done inside the callbacks. + if (!std::equal(m_impedances.begin(), m_impedances.end(), m_impedancesLast.begin(), + [](const double a, const double b) { return (std::abs(a - b) < 0.01); })) + { + m_impedancesLast = m_impedances; + + gdk_threads_add_idle(idle_updateimpedance_cb, static_cast(this)); + } + + if (m_lastStatus != m_status || clientCount != m_nClient) + { + m_lastStatus = m_status; + m_nClient = clientCount; + gdk_threads_add_idle(idle_updatestatus_cb, static_cast(this)); + } + + if (shouldDisconnect) { gdk_threads_add_idle(idle_updatedisconnect_cb, static_cast(this)); } + + // update fast changing variables at most every 0.25 sec to avoid hammering the gui + const uint64_t now = System::Time::zgetTime(); + if (now - lastGUIUpdate > (1LL << 32) / 4LL) + { + if (std::abs(driftMs - m_lastDriftMs) > 0) + { + m_lastDriftMs = driftMs; + + gdk_threads_add_idle(idle_updatedrift_cb, static_cast(this)); + } + + lastGUIUpdate = now; + } + + if (shouldSleep) { System::Time::sleep(100); } + } + } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CAcquisitionServerThread:: thread finished\n"; + } + + bool connect() + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CAcquisitionServerThread::connect()\n"; + + if (!m_acquisitionServer.connect(m_gui.getDriver(), m_gui.getHeaderCopy(), m_gui.getSampleCountPerBuffer(), m_gui.getTCPPort())) { return false; } + m_status = EStatus::Connected; + + { + m_impedances.resize(m_gui.getHeaderCopy().getChannelCount(), OVAS_Impedance_NotAvailable); + m_impedancesLast.resize(m_gui.getHeaderCopy().getChannelCount(), OVAS_Impedance_NotAvailable); + } + return true; + } + + bool start() + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CAcquisitionServerThread::start()\n"; + if (!m_acquisitionServer.start()) + { + m_acquisitionServer.stop(); + return false; + } + m_status = EStatus::Started; + return true; + } + + bool stop() + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CAcquisitionServerThread::stop()\n"; + m_acquisitionServer.stop(); + m_status = EStatus::Connected; + return true; + } + + bool disconnect() + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CAcquisitionServerThread::disconnect()\n"; + + if (m_status == EStatus::Started) { m_acquisitionServer.stop(); } + + m_acquisitionServer.disconnect(); + + m_impedances.clear(); + m_impedancesLast.clear(); + + m_status = EStatus::Idle; + return true; + } + + bool terminate() + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CAcquisitionServerThread::terminate()\n"; + + switch (m_status) + { + case EStatus::Started: m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CAcquisitionServerThread::stop()\n"; + m_acquisitionServer.stop(); + case EStatus::Connected: m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CAcquisitionServerThread::disconnect()\n"; + m_acquisitionServer.disconnect(); + default: break; + } + + m_status = EStatus::Finished; + return true; + } + + // GTK C callbacks call these from the main thread to update the GUI + void updateGUIImpedance() + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + for (size_t i = 0; i < m_impedancesLast.size(); ++i) { m_gui.setImpedance(i, m_impedancesLast[i]); } + } + + void updateGUIDrift() const + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + m_gui.setDriftMs(m_lastDriftMs); + } + + void updateGUIStatus() const + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + + std::string state; + std::string text; + + switch (m_status) + { + case EStatus::Started: + state = (m_nClient == 0) ? "Receiving..." : "Receiving and sending..."; + text = std::to_string(m_nClient) + " client" + (m_nClient != 1 ? "s" : "") + " connected"; + break; + case EStatus::Idle: + state = "Disconnected"; + break; + case EStatus::Connected: + state = "Connected to device!"; + text = "Press play to start..."; + break; + default: + state = "Unknown"; + break; + } + m_gui.setStateText(state.c_str()); + m_gui.setClientText(text.c_str()); + } + + void updateGUIDisconnect() const + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + m_gui.disconnect(); + } + + /* + uint32_t getStatus() + { + DoubleLock lock(&m_AcquisitionServer.m_ProtectionMutex, &m_AcquisitionServer.m_ExecutionMutex); + return m_status; + } + */ +protected: + + const Kernel::IKernelContext& m_kernelCtx; + CAcquisitionServerGUI& m_gui; + CAcquisitionServer& m_acquisitionServer; + EStatus m_status = EStatus::Idle; + EStatus m_lastStatus = EStatus::Idle; + + size_t m_nClient = 0; + double m_lastDriftMs = -1.0; + std::vector m_impedancesLast; + std::vector m_impedances; +}; + +class CAcquisitionServerThreadHandle +{ +public: + explicit CAcquisitionServerThreadHandle(CAcquisitionServerThread& thread) : m_thread(thread) { } + void operator()() const { m_thread.main(); } + +protected: + CAcquisitionServerThread& m_thread; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +static gboolean idle_updateimpedance_cb(void* data) +{ + static_cast(data)->updateGUIImpedance(); + return FALSE; // don't call again +} + +static gboolean idle_updatedrift_cb(void* data) +{ + static_cast(data)->updateGUIDrift(); + return FALSE; // don't call again +} + +static gboolean idle_updatestatus_cb(void* data) +{ + static_cast(data)->updateGUIStatus(); + return FALSE; // don't call again +} + +static gboolean idle_updatedisconnect_cb(void* data) +{ + static_cast(data)->updateGUIDisconnect(); + return FALSE; // don't call again +} diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCConfigurationBuilder.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCConfigurationBuilder.cpp new file mode 100644 index 0000000..14d51c0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCConfigurationBuilder.cpp @@ -0,0 +1,536 @@ +#include "ovasCConfigurationBuilder.h" +#include "ovasIHeader.h" + +#include + +#include +#include +#include +#include +#include + +#define OVAS_ElectrodeNames_File OpenViBE::Directories::getDataDir() + "/applications/acquisition-server/electrode-names.txt" +#define OVAS_ConfigureGUIElectrodes_File OpenViBE::Directories::getDataDir() + "/applications/acquisition-server/interface-channel-names.ui" + +namespace OpenViBE { +namespace AcquisitionServer { + +static void GTKComboBoxSetActiveText(GtkComboBox* box, const gchar* sActiveText) +{ + GtkTreeModel* treeModel = gtk_combo_box_get_model(box); + GtkTreeIter it; + int index = 0; + gchar* name = nullptr; + if (gtk_tree_model_get_iter_first(treeModel, &it)) + { + do + { + gtk_tree_model_get(treeModel, &it, 0, &name, -1); + if (std::string(name) == std::string(sActiveText)) + { + gtk_combo_box_set_active(box, index); + return; + } + index++; + } while (gtk_tree_model_iter_next(treeModel, &it)); + } +} + +static void button_change_channel_names_cb(GtkButton* /*button*/, void* data) +{ +#if defined _DEBUG_Callbacks_ + std::cout << "button_change_channel_names_cb" << std::endl; +#endif + static_cast(data)->buttonChangeChannelNamesCB(); +} + +static void button_apply_channel_name_cb(GtkButton* /*button*/, void* data) +{ +#if defined _DEBUG_Callbacks_ + std::cout << "button_apply_channel_name_cb" << std::endl; +#endif + static_cast(data)->buttonApplyChannelNameCB(); +} + +static void button_remove_channel_name_cb(GtkButton* /*button*/, void* data) +{ +#if defined _DEBUG_Callbacks_ + std::cout << "button_remove_channel_name_cb" << std::endl; +#endif + static_cast(data)->buttonRemoveChannelNameCB(); +} + +static void treeview_apply_channel_name_cb(GtkTreeView* /*treeview*/, GtkTreePath* /*path*/, GtkTreeViewColumn* /*column*/, void* data) +{ +#if defined _DEBUG_Callbacks_ + std::cout << "treeview_apply_channel_name_cb" << std::endl; +#endif + static_cast(data)->treeviewApplyChannelNameCB(); +} + +//___________________________________________________________________// +// // + +CConfigurationBuilder::CConfigurationBuilder(const char* gtkBuilderFilename) + : m_gtkBuilderFilename(gtkBuilderFilename ? gtkBuilderFilename : ""), + m_electrodeFilename(OVAS_ElectrodeNames_File), + m_gtkBuilderChannelsFilename(OVAS_ConfigureGUIElectrodes_File) {} + +CConfigurationBuilder::~CConfigurationBuilder() {} + +//___________________________________________________________________// +// // + +bool CConfigurationBuilder::configure(IHeader& header) +{ + m_applyConfig = true; + + m_header = &header; + if (!this->preConfigure()) + { + std::cout << "Error: Driver preconfigure failed\n"; + m_applyConfig = false; + } + + // Only run if preConfig succeeded + EError code; + if (m_applyConfig && !this->doConfigure(code)) + { + if (code != EError::UserCancelled) { std::cout << "Note: Driver doConfigure failed with code " << toString(code) << "\n"; } + m_applyConfig = false; + } + + // Run the postconfigure in any case to close a possible dialog + if (!this->postConfigure()) + { + std::cout << "Error: Driver postconfigure failed\n"; + m_applyConfig = false; + } + m_header = nullptr; + + return m_applyConfig; +} + +bool CConfigurationBuilder::preConfigure() +{ + // Prepares interface + + m_builder = gtk_builder_new(); // glade_xml_new(m_gtkBuilderFilename.c_str(), nullptr, nullptr); + GError* error = nullptr; + if (!gtk_builder_add_from_file(m_builder, m_gtkBuilderFilename.c_str(), &error)) + { + std::cout << "Error: Unable to load interface from " << m_gtkBuilderFilename << ", code " << error->code << " (" << error->message << + ")\n"; + return false; + } + + m_builderChannel = gtk_builder_new(); // glade_xml_new(m_gtkBuilderChannelsFilename.c_str(), nullptr, nullptr); + if (!gtk_builder_add_from_file(m_builderChannel, m_gtkBuilderChannelsFilename.c_str(), &error)) + { + std::cout << "Error: Unable to load channels from " << m_gtkBuilderChannelsFilename << ", code " << error->code << " (" << error->message + << ")\n"; + return false; + } + + // Finds all the widgets + + m_dialog = GTK_WIDGET(gtk_builder_get_object(m_builder, "openvibe-acquisition-server-settings")); + if (!m_dialog) + { + std::cout << "Error: Unable to find even the basic settings dialog from " << m_gtkBuilderFilename << "\n"; + return false; + } + + m_ID = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_identifier")); + m_age = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_age")); + m_nChannels = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_number_of_channels")); + // NB: sampling_frequency is not really a "combobox" everywhere (eg telnet reader), should update in every UI the ID name + m_sampling = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")); + m_gender = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_gender")); + + if (gtk_builder_get_object(m_builder, "checkbutton_impedance")) + { + m_impedanceCheck = GTK_WIDGET(gtk_builder_get_object(m_builder, "checkbutton_impedance")); + } + + m_electrodeNameTreeView = GTK_WIDGET(gtk_builder_get_object(m_builderChannel, "treeview_electrode_names")); + m_channelNameTreeView = GTK_WIDGET(gtk_builder_get_object(m_builderChannel, "treeview_channel_names")); + + // Prepares electrode name tree view + + GtkTreeView* electrodeTreeView = GTK_TREE_VIEW(m_electrodeNameTreeView); + GtkCellRenderer* electrodeIdxCellRenderer = gtk_cell_renderer_text_new(); + GtkTreeViewColumn* electrodeIdxTreeViewCol = gtk_tree_view_column_new_with_attributes("Name", electrodeIdxCellRenderer, "text", 0, nullptr); + + gtk_tree_view_append_column(electrodeTreeView, electrodeIdxTreeViewCol); + + // Prepares channel name tree view + + GtkTreeView* channelTreeView = GTK_TREE_VIEW(m_channelNameTreeView); + GtkCellRenderer* channelIdxCellRenderer = gtk_cell_renderer_text_new(); + GtkCellRenderer* channelValueCellRenderer = gtk_cell_renderer_text_new(); + GtkTreeViewColumn* channelIdxTreeViewCol = gtk_tree_view_column_new_with_attributes("Index", channelIdxCellRenderer, "text", 0, nullptr); + GtkTreeViewColumn* channelNameValueTreeViewColumn = gtk_tree_view_column_new_with_attributes("Name", channelValueCellRenderer, "text", 1, nullptr); + + gtk_tree_view_append_column(channelTreeView, channelIdxTreeViewCol); + gtk_tree_view_append_column(channelTreeView, channelNameValueTreeViewColumn); + + // Connects custom GTK signals + GObject* tmp[4]; + tmp[0] = gtk_builder_get_object(m_builder, "button_change_channel_names"); + tmp[1] = gtk_builder_get_object(m_builderChannel, "button_apply_channel_name"); + tmp[2] = gtk_builder_get_object(m_builderChannel, "button_remove_channel_name"); + tmp[3] = gtk_builder_get_object(m_builderChannel, "treeview_electrode_names"); + if (tmp[0]) { g_signal_connect(tmp[0], "pressed", G_CALLBACK(button_change_channel_names_cb), this); } + if (tmp[1]) { g_signal_connect(tmp[1], "pressed", G_CALLBACK(button_apply_channel_name_cb), this); } + if (tmp[2]) { g_signal_connect(tmp[2], "pressed", G_CALLBACK(button_remove_channel_name_cb), this); } + if (tmp[3]) { g_signal_connect(tmp[3], "row-activated", G_CALLBACK(treeview_apply_channel_name_cb), this); } + if (!tmp[0] || !tmp[1] || !tmp[2] || !tmp[3]) + { + // @fixme should make a log entry if any NULL but no manager here +#if defined _DEBUG_Callbacks_ + std::cout << "Note: The driver UI file lacks some of the expected buttons or elements. This may be intentional." << std::endl; +#endif + } + + gtk_builder_connect_signals(m_builder, nullptr); + gtk_builder_connect_signals(m_builderChannel, nullptr); + + // Configures interface with preconfigured values + + if (m_header->isExperimentIDSet()) { gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_ID), m_header->getExperimentID()); } + if (m_header->isSubjectAgeSet()) { gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_age), m_header->getSubjectAge()); } + if (m_header->isChannelCountSet()) { gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_nChannels), m_header->getChannelCount()); } + if (m_header->isSamplingFrequencySet()) + { + const std::string sampling = std::to_string(m_header->getSamplingFrequency()); + // sampling frequency could be set to an Int through a spin button instead of regular combo box (eg: telnet reader) + if (std::strcmp(G_OBJECT_TYPE_NAME(m_sampling), "GtkSpinButton") == 0) + { + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_sampling), m_header->getSamplingFrequency()); + } + // would be a "GtkComboBox" + else { GTKComboBoxSetActiveText(GTK_COMBO_BOX(m_sampling), sampling.c_str()); } + } + else + { + // sampling frequency could be set to an Int through a spin button instead of regular combo box (eg: telnet reader) + if (std::strcmp(G_OBJECT_TYPE_NAME(m_sampling), "GtkSpinButton") == 0) { gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_sampling), 0); } + // would be a "GtkComboBox" + else { gtk_combo_box_set_active(GTK_COMBO_BOX(m_sampling), 0); } + } + if (m_header->isSubjectGenderSet()) + { + GTKComboBoxSetActiveText(GTK_COMBO_BOX(m_gender), + m_header->getSubjectGender() == OVTK_Value_Gender_Male ? "male" + : m_header->getSubjectGender() == OVTK_Value_Gender_Female ? "female" + : m_header->getSubjectGender() == OVTK_Value_Gender_Unknown ? "unknown" : "unspecified"); + } + else { gtk_combo_box_set_active(GTK_COMBO_BOX(m_gender), 0); } + + if (m_impedanceCheck) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_impedanceCheck), m_header->isImpedanceCheckRequested()); } + + // Prepares channel name cache + if (m_header->isChannelCountSet()) { for (size_t i = 0; i < m_header->getChannelCount(); ++i) { m_channelNames[i] = m_header->getChannelName(i); } } + + return true; +} + +bool CConfigurationBuilder::doConfigure(EError& errorCode) +{ + if (!m_dialog) + { + errorCode = EError::Unknown; + return false; + } + + const gint response = gtk_dialog_run(GTK_DIALOG(m_dialog)); + + switch (response) + { + case GTK_RESPONSE_APPLY: errorCode = EError::NoError; + return true; + case GTK_RESPONSE_CANCEL: errorCode = EError::UserCancelled; + return false; + default: errorCode = EError::Unknown; + return false; + } +} + +bool CConfigurationBuilder::postConfigure() +{ + if (m_applyConfig) + { + gtk_spin_button_update(GTK_SPIN_BUTTON(m_ID)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_age)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_nChannels)); + + const std::string gender = gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_gender)); + m_header->setExperimentID(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_ID))); + m_header->setSubjectAge(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_age))); + m_header->setChannelCount(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_nChannels))); + // sampling frequency could be set to an Int through a spin button instead of regular combo box (eg: telnet reader) + if (std::strcmp(G_OBJECT_TYPE_NAME(m_sampling), "GtkSpinButton") == 0) + { + gtk_spin_button_update(GTK_SPIN_BUTTON(m_sampling)); + m_header->setSamplingFrequency(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_sampling))); + } + // would be a "GtkComboBox" + else + { + gchar* sampling = gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_sampling)); + m_header->setSamplingFrequency(sampling ? atoi(sampling) : 0); + } + m_header->setSubjectGender(gender == "male" ? OVTK_Value_Gender_Male + : gender == "female" ? OVTK_Value_Gender_Female + : gender == "unknown" ? OVTK_Value_Gender_Unknown : OVTK_Value_Gender_NotSpecified); + for (size_t i = 0; i != m_header->getChannelCount(); ++i) { m_header->setChannelName(i, m_channelNames[i].c_str()); } + + if (m_impedanceCheck) { m_header->setImpedanceCheckRequested(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_impedanceCheck)) != FALSE); } + else { m_header->setImpedanceCheckRequested(false); } + } + + if (m_dialog) { gtk_widget_hide(m_dialog); } + + if (m_builder) + { + g_object_unref(m_builder); + m_builder = nullptr; + } + + if (m_builderChannel) + { + g_object_unref(m_builderChannel); + m_builderChannel = nullptr; + } + + m_channelNames.clear(); + + return true; +} + +void CConfigurationBuilder::buttonChangeChannelNamesCB() +{ + GtkTreeIter itElectrodeName, itChannelName; + GtkDialog* dialog = GTK_DIALOG(gtk_builder_get_object(m_builderChannel, "channel-names")); + GtkTreeView* electrodeNameTreeView = GTK_TREE_VIEW(m_electrodeNameTreeView); + GtkTreeView* channelNameTreeView = GTK_TREE_VIEW(m_channelNameTreeView); + + // Creates electrode name and channel name models + + m_electrodeNameListStore = gtk_list_store_new(1, G_TYPE_STRING); + m_channelNameListStore = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); + + // Fills in electrode name model + { + std::ifstream file(m_electrodeFilename.c_str()); + if (file.is_open()) + { + std::list electrodNames; + while (!file.eof()) + { + std::string name; + file >> name; + electrodNames.push_back(name); + } + file.close(); + + for (auto it = electrodNames.begin(); it != electrodNames.end(); ++it) + { + gtk_list_store_append(m_electrodeNameListStore, &itElectrodeName); + gtk_list_store_set(m_electrodeNameListStore, &itElectrodeName, 0, it->c_str(), -1); + } + } + } + // Fills in channel name model + + const uint32_t nChannel = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_nChannels)); + for (size_t i = 0; i < nChannel; ++i) + { + std::string name = std::to_string(i + 1); + gtk_list_store_append(m_channelNameListStore, &itChannelName); + gtk_list_store_set(m_channelNameListStore, &itChannelName, 0, name.c_str(), -1); + gtk_list_store_set(m_channelNameListStore, &itChannelName, 1, m_channelNames[i].c_str(), -1); + } + + // Attachs model to views + + gtk_tree_view_set_model(electrodeNameTreeView, GTK_TREE_MODEL(m_electrodeNameListStore)); + gtk_tree_view_set_model(channelNameTreeView, GTK_TREE_MODEL(m_channelNameListStore)); + + // Selects first line of each + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_electrodeNameListStore), &itElectrodeName)) + { + gtk_tree_selection_select_iter(gtk_tree_view_get_selection(electrodeNameTreeView), &itElectrodeName); + } + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)) + { + gtk_tree_selection_select_iter(gtk_tree_view_get_selection(channelNameTreeView), &itChannelName); + } + + // Runs dialog ! + + gint dialogResponse; + do + { + dialogResponse = gtk_dialog_run(dialog); + switch (dialogResponse) + { + case GTK_RESPONSE_APPLY: + { + size_t i = 0; + gchar* channelName = nullptr; + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)) + { + do + { + gtk_tree_model_get(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName, 1, &channelName, -1); + m_channelNames[i++] = channelName; + } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)); + } + } + break; + + case 1: // Load + { + GtkWidget* widgetDialogOpen = gtk_file_chooser_dialog_new("Select file to open...", nullptr, GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + nullptr); + //gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(widgetDialogOpen), this->getWorkingDirectory().toASCIIString()); + if (gtk_dialog_run(GTK_DIALOG(widgetDialogOpen)) == GTK_RESPONSE_ACCEPT) + { + char* fileName = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widgetDialogOpen)); + std::ifstream file(fileName); + if (file.is_open()) + { + std::list electrodNames; + // Reads channel names from file + std::string name; + while (getline(file, name)) + { + //if line is empty, skip the channel by setting empty string as name + //if we do not, loading will squeeze the channels together. + if (name.empty()) { name = ""; } + electrodNames.push_back(name); + } + file.close(); + + // Clears list store + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)) + { + do { gtk_list_store_set(m_channelNameListStore, &itChannelName, 1, "", -1); } while (gtk_tree_model_iter_next( + GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)); + } + + // Fills list store with channel names + auto it = electrodNames.begin(); + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName) && it != electrodNames.end()) + { + do + { + gtk_list_store_set(m_channelNameListStore, &itChannelName, 1, it->c_str(), -1); + ++it; + } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName) && it != electrodNames.end()); + } + } + g_free(fileName); + } + gtk_widget_destroy(widgetDialogOpen); + } + break; + + case 2: // Save + { + GtkWidget* widgetDialogOpen = gtk_file_chooser_dialog_new("Select file to save to...", nullptr, GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + nullptr); + //gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(widgetDialogOpen), this->getWorkingDirectory().toASCIIString()); + if (gtk_dialog_run(GTK_DIALOG(widgetDialogOpen)) == GTK_RESPONSE_ACCEPT) + { + char* fileName = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widgetDialogOpen)); + std::ofstream file(fileName); + if (file.is_open()) + { + gchar* channelName = nullptr; + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)) + { + do + { + gtk_tree_model_get(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName, 1, &channelName, -1); + file << channelName << "\n"; + } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)); + } + } + g_free(fileName); + } + gtk_widget_destroy(widgetDialogOpen); + } + break; + default: break; + } + } while (dialogResponse != GTK_RESPONSE_APPLY && dialogResponse != GTK_RESPONSE_CANCEL); + + gtk_widget_hide(GTK_WIDGET(dialog)); + g_object_unref(m_channelNameListStore); + g_object_unref(m_electrodeNameListStore); + m_channelNameListStore = nullptr; + m_electrodeNameListStore = nullptr; +} + +void CConfigurationBuilder::buttonApplyChannelNameCB() +{ + GtkTreeIter itElectrodeName, itChannelName; + GtkTreeView* electrodeNameTreeView = GTK_TREE_VIEW(m_electrodeNameTreeView); + GtkTreeView* channelNameTreeView = GTK_TREE_VIEW(m_channelNameTreeView); + + GtkTreeSelection* channelNameTreeViewSelection = gtk_tree_view_get_selection(channelNameTreeView); + GtkTreeSelection* electrodeNameTreeViewSelection = gtk_tree_view_get_selection(electrodeNameTreeView); + + if (!gtk_tree_selection_get_selected(channelNameTreeViewSelection, nullptr, &itChannelName)) + { + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)) + { + gtk_tree_selection_select_iter(channelNameTreeViewSelection, &itChannelName); + } + } + + if (gtk_tree_selection_get_selected(channelNameTreeViewSelection, nullptr, &itChannelName)) + { + if (gtk_tree_selection_get_selected(electrodeNameTreeViewSelection, nullptr, &itElectrodeName)) + { + gchar* name = nullptr; + gtk_tree_model_get(GTK_TREE_MODEL(m_electrodeNameListStore), &itElectrodeName, 0, &name, -1); + gtk_list_store_set(m_channelNameListStore, &itChannelName, 1, name, -1); + if (gtk_tree_model_iter_next(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)) + { + gtk_tree_selection_select_iter(channelNameTreeViewSelection, &itChannelName); + } + else + { + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)) + { + gtk_tree_selection_select_iter(channelNameTreeViewSelection, &itChannelName); + } + } + } + } +} + +void CConfigurationBuilder::buttonRemoveChannelNameCB() +{ + GtkTreeIter it; + GtkTreeView* treeView = GTK_TREE_VIEW(m_channelNameTreeView); + + GtkTreeSelection* selection = gtk_tree_view_get_selection(treeView); + if (gtk_tree_selection_get_selected(selection, nullptr, &it)) + { + gtk_list_store_set(m_channelNameListStore, &it, 1, "", -1); + if (gtk_tree_model_iter_next(GTK_TREE_MODEL(m_channelNameListStore), &it)) { gtk_tree_selection_select_iter(selection, &it); } + else { if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_channelNameListStore), &it)) { gtk_tree_selection_select_iter(selection, &it); } } + } +} + +void CConfigurationBuilder::treeviewApplyChannelNameCB() { this->buttonApplyChannelNameCB(); } + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCConfigurationBuilder.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCConfigurationBuilder.h new file mode 100644 index 0000000..5b34cdd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCConfigurationBuilder.h @@ -0,0 +1,75 @@ +#pragma once + +#include "ovas_base.h" + +#include + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +class IHeader; + +class CConfigurationBuilder +{ +public: + + explicit CConfigurationBuilder(const char* gtkBuilderFilename); + virtual ~CConfigurationBuilder(); + + virtual bool configure(IHeader& header); + + virtual void buttonChangeChannelNamesCB(); + virtual void buttonApplyChannelNameCB(); + virtual void buttonRemoveChannelNameCB(); + virtual void treeviewApplyChannelNameCB(); + +protected: + enum class EError { NoError = 0, UserCancelled = 1, Unknown = 2 }; + + static std::string toString(const EError& e) + { + switch (e) + { + case EError::NoError: return "No Error"; + case EError::UserCancelled: return "User Cancelled"; + case EError::Unknown: return "Unknown"; + default: return "Invalid Error Code"; + } + } + + CConfigurationBuilder() = delete; + + virtual bool preConfigure(); + virtual bool doConfigure(EError& errorCode); + virtual bool postConfigure(); + + bool m_applyConfig = false; + + GtkBuilder* m_builder = nullptr; + GtkBuilder* m_builderChannel = nullptr; + + GtkWidget* m_dialog = nullptr; + + GtkWidget* m_ID = nullptr; + GtkWidget* m_age = nullptr; + GtkWidget* m_nChannels = nullptr; + GtkWidget* m_sampling = nullptr; + GtkWidget* m_gender = nullptr; + GtkWidget* m_impedanceCheck = nullptr; + + GtkListStore* m_electrodeNameListStore = nullptr; + GtkListStore* m_channelNameListStore = nullptr; + + GtkWidget* m_electrodeNameTreeView = nullptr; + GtkWidget* m_channelNameTreeView = nullptr; + + std::map m_channelNames; + std::string m_gtkBuilderFilename; + std::string m_electrodeFilename; + std::string m_gtkBuilderChannelsFilename; + IHeader* m_header = nullptr; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCConfigurationNetworkBuilder.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCConfigurationNetworkBuilder.cpp new file mode 100644 index 0000000..6109383 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCConfigurationNetworkBuilder.cpp @@ -0,0 +1,52 @@ +#include "ovasCConfigurationNetworkBuilder.h" + +#include + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +bool CConfigurationNetworkBuilder::setHostName(const CString& hostName) +{ + m_hostName = hostName; + return true; +} + +bool CConfigurationNetworkBuilder::setHostPort(const uint32_t hostPort) +{ + m_hostPort = hostPort; + return true; +} + +//___________________________________________________________________// +// // + +bool CConfigurationNetworkBuilder::preConfigure() +{ + const bool res = CConfigurationBuilder::preConfigure(); + + m_pHostName = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_host_name")); + m_pHostPort = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_host_port")); + + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_pHostPort), m_hostPort); + gtk_entry_set_text(GTK_ENTRY(m_pHostName), m_hostName.toASCIIString()); + + return res; +} + +bool CConfigurationNetworkBuilder::postConfigure() +{ + if (m_applyConfig) + { + gtk_spin_button_update(GTK_SPIN_BUTTON(m_pHostPort)); + + m_hostPort = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_pHostPort)); + m_hostName = gtk_entry_get_text(GTK_ENTRY(m_pHostName)); + } + + return CConfigurationBuilder::postConfigure(); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCConfigurationNetworkBuilder.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCConfigurationNetworkBuilder.h new file mode 100644 index 0000000..27d2153 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCConfigurationNetworkBuilder.h @@ -0,0 +1,33 @@ +#pragma once + +#include "ovasCConfigurationBuilder.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class CConfigurationNetworkBuilder : public CConfigurationBuilder +{ +public: + + explicit CConfigurationNetworkBuilder(const char* gtkBuilderFileName) : CConfigurationBuilder(gtkBuilderFileName) {} + ~CConfigurationNetworkBuilder() override {} + + + virtual bool setHostName(const CString& hostName); + virtual bool setHostPort(uint32_t hostPort); + + virtual CString getHostName() const { return m_hostName; } + virtual uint32_t getHostPort() const { return m_hostPort; } + +protected: + + bool preConfigure() override; + bool postConfigure() override; + + GtkWidget* m_pHostName = nullptr; + GtkWidget* m_pHostPort = nullptr; + + CString m_hostName = "localhost"; + uint32_t m_hostPort = 4000; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCDriftCorrection.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCDriftCorrection.cpp new file mode 100644 index 0000000..0349045 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCDriftCorrection.cpp @@ -0,0 +1,396 @@ +// @note in this code, conversion in time or in second are sometimes used simply to convert between floating and fixed point even if the units are not seconds. +#include "ovasCDriftCorrection.h" + +#include + +#include + +#include +#include // std::abs +#include // std::min, std::max +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriftCorrection::CDriftCorrection(const Kernel::IKernelContext& ctx) + : m_kernelCtx(ctx), m_driftCorrectionPolicy(EDriftCorrectionPolicies::DriverChoice) +{ + const std::string policy = m_kernelCtx.getConfigurationManager().expand("${AcquisitionServer_DriftCorrectionPolicy}").toASCIIString(); + if (policy == "Forced") { this->setDriftCorrectionPolicy(EDriftCorrectionPolicies::Forced); } + else if (policy == "Disabled") { this->setDriftCorrectionPolicy(EDriftCorrectionPolicies::Disabled); } + else { this->setDriftCorrectionPolicy(EDriftCorrectionPolicies::DriverChoice); } + + this->setDriftToleranceDurationMs(m_kernelCtx.getConfigurationManager().expandAsUInteger("${AcquisitionServer_DriftToleranceDuration}", 5)); + this->setJitterEstimationCountForDrift( + m_kernelCtx.getConfigurationManager().expandAsUInteger("${AcquisitionServer_JitterEstimationCountForDrift}", 128)); + + m_initialSkipPeriod = m_kernelCtx.getConfigurationManager().expandAsUInteger("${AcquisitionServer_DriftInitialSkipPeriodMs}", 0); + m_initialSkipPeriod = (m_initialSkipPeriod << 32) / 1000; // ms to fixed point sec + + reset(); +} + +bool CDriftCorrection::start(const uint32_t sampling, const uint64_t startTime) +{ + if (sampling == 0) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Drift correction doesn't support sampling rate of 0.\n"; + return false; + } + + reset(); + + m_sampling = sampling; + m_nDriftToleranceSample = (m_driftToleranceDurationMs * m_sampling) / 1000; + + m_startTime = startTime + m_initialSkipPeriod; + + m_lastEstimationTime = startTime; + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Drift correction is set to "; + switch (m_driftCorrectionPolicy) + { + default: + case EDriftCorrectionPolicies::DriverChoice: m_kernelCtx.getLogManager() << "DriverChoice\n"; + break; + case EDriftCorrectionPolicies::Forced: m_kernelCtx.getLogManager() << "Forced\n"; + break; + case EDriftCorrectionPolicies::Disabled: m_kernelCtx.getLogManager() << "Disabled\n"; + break; + } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Driver monitoring drift estimation on " << m_nJitterEstimationForDrift << " jitter measures\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Driver monitoring drift tolerance set to " << m_driftToleranceDurationMs << " milliseconds - eq " + << m_nDriftToleranceSample << " samples\n"; + + m_isStarted = true; + + return true; +} + +void CDriftCorrection::stop() +{ + m_isStarted = false; + m_isActive = false; +} + +void CDriftCorrection::reset() +{ + m_jittersEstimate.clear(); + + m_receivedSampleCount = 0; + m_correctedSampleCount = 0; + m_nInnerLatencySample = 0; + + m_driftEstimate = 0; + m_driftEstimateTooSlowMax = 0; + m_driftEstimateTooFastMax = 0; + m_nDriftCorrectionSampleAdded = 0; + m_nDriftCorrectionSampleRemoved = 0; + + m_nDriftCorrection = 0; + + // Don't know the sampling rate yet, so cannot put a good value. Put something. + m_nDriftToleranceSample = 1; + + m_isActive = false; + m_initialSkipPeriodPassed = (m_initialSkipPeriod <= 0 ? true : false); +} + + +//___________________________________________________________________// +// // + +void CDriftCorrection::printStats() const +{ + if (!m_isStarted) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Drift correction is stopped, no statistics were collected.\n"; + return; + } + + const uint64_t elapsedTime = m_lastEstimationTime - m_startTime; + const double elapsedTimeSec = CTime(elapsedTime).toSeconds(); + + const uint64_t theoreticalSampleCountFixedPoint = m_sampling * elapsedTime; + const double theoreticalSampleCount = CTime(theoreticalSampleCountFixedPoint).toSeconds(); + + const double addedRatio = (theoreticalSampleCount != 0 ? (m_nDriftCorrectionSampleAdded / theoreticalSampleCount) : 0); + const double removedRatio = (theoreticalSampleCount != 0 ? (m_nDriftCorrectionSampleRemoved / theoreticalSampleCount) : 0); + + const uint64_t driftToleranceDurationMs = getDriftToleranceDurationMs(); + const double driftRatio = getDriftMs() / double(driftToleranceDurationMs); + const double driftRatioTooFastMax = getDriftTooFastMax() / double(driftToleranceDurationMs); + const double driftRatioTooSlowMax = getDriftTooSlowMax() / double(driftToleranceDurationMs); + + const double estimatedSamplingRate = m_receivedSampleCount / elapsedTimeSec; + const double deviationPercent = 100.0 * (estimatedSamplingRate / double(m_sampling)); + + + if (driftRatioTooFastMax > 1.0 || driftRatioTooSlowMax > 1.0 || std::abs(driftRatio) > 1.0) + { + // Drift tolerance was exceeded, print some stats + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Stats after " << elapsedTimeSec << " second session of " << m_sampling << + "hz sampling (declared rate),\n"; + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << " Estimate : Driver samples at " << std::round(estimatedSamplingRate * 10.0) / 10.0 + << "hz (" << std::round(deviationPercent * 10.0) / 10.0 << "% of declared)\n"; + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << " Received : " << m_receivedSampleCount << " samples\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << " Expected : " << theoreticalSampleCount << " samples\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << " Returned : " << m_correctedSampleCount << " samples " + << (m_driftCorrectionPolicy == EDriftCorrectionPolicies::Disabled ? "(drift correction disabled)" : "(after drift correction)") << "\n"; + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << " Added : " << m_nDriftCorrectionSampleAdded << " samples (" << addedRatio << "%)\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << " Removed : " << m_nDriftCorrectionSampleRemoved << " samples (" << removedRatio << "%)\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << " Operated : " << m_nDriftCorrection << " times (interventions)\n"; + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Estimated drift (tolerance = " << driftToleranceDurationMs << "ms),\n"; + + m_kernelCtx.getLogManager() << (driftRatioTooSlowMax > 1.0 ? Kernel::LogLevel_Warning : Kernel::LogLevel_Info) + << " Slow peak : " << -m_driftEstimateTooSlowMax << " samples (" << getDriftTooSlowMax() << "ms late, " << 100 * driftRatioTooSlowMax << + "% of tol.)\n"; + + m_kernelCtx.getLogManager() << (driftRatioTooFastMax > 1.0 ? Kernel::LogLevel_Warning : Kernel::LogLevel_Info) + << " Fast peak : " << m_driftEstimateTooFastMax << " samples (" << getDriftTooFastMax() << "ms early, " << 100 * driftRatioTooFastMax << + "% of tol.)\n"; + + m_kernelCtx.getLogManager() << (std::abs(driftRatio) > 1.0 ? Kernel::LogLevel_Warning : Kernel::LogLevel_Info) + << " Last estim : " << m_driftEstimate << " samples (" << getDriftMs() << "ms, " << 100 * driftRatio << "% of tol., " + << std::round(100.0 * (getDriftMs() / 1000.0) / elapsedTimeSec * 10.0) / 10.0 << "% of session length)" + << (m_driftCorrectionPolicy == EDriftCorrectionPolicies::Disabled ? "" : ", after corr.") + << "\n"; + + const double remainingDriftCount = m_correctedSampleCount - theoreticalSampleCount; + const double remainingDriftMs = 1000.0 * remainingDriftCount / double(m_sampling); + m_kernelCtx.getLogManager() << (std::abs(remainingDriftMs) > driftToleranceDurationMs ? Kernel::LogLevel_Warning : Kernel::LogLevel_Info) + << " Remaining : " << remainingDriftCount << " samples (" << remainingDriftMs << "ms, " << 100 * remainingDriftMs / driftToleranceDurationMs + << "% of tol., " + << std::round(100.0 * (remainingDriftMs / 1000.0) / elapsedTimeSec * 10.0) / 10.0 << "% of session length)" + << (m_driftCorrectionPolicy == EDriftCorrectionPolicies::Disabled ? "" : ", after corr.") + << "\n"; + + if (m_driftCorrectionPolicy == EDriftCorrectionPolicies::DriverChoice && m_nDriftCorrectionSampleAdded == 0 && + m_nDriftCorrectionSampleRemoved == 0) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << + " The driver did not try to correct the drift. This may be a feature of the driver.\n"; + } + } +} + + +//___________________________________________________________________// +// // + +double CDriftCorrection::computeJitter(const uint64_t currentTime) const +{ + // Compute the jitter. To get a bit cleaner code, instead of basing jitter estimate + // on difference of estimated sample counts, we compute the diffs in the elapsed + // and the expected time based on the amount of samples received. + const uint64_t expectedTime = m_startTime + CTime(m_correctedSampleCount).time() / uint64_t(m_sampling); + + double timeDiff; // time in seconds that our expectation differs from the measured clock + if (expectedTime >= currentTime) + { + // The driver is early + timeDiff = CTime(expectedTime - currentTime).toSeconds(); + } + else + { + // The driver is late + timeDiff = -CTime(currentTime - expectedTime).toSeconds(); + } + + // Jitter in fractional samples + return timeDiff * m_sampling + double(m_nInnerLatencySample); +} + + +bool CDriftCorrection::estimateDrift(const uint64_t newSamples) +{ + if (!m_isStarted) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Drift correction: estimateDrift() called before start()\n"; + return false; + } + + const uint64_t currentTime = System::Time::zgetTime(); + if (currentTime < m_startTime) + { + // We can ignore some sets of samples for the driver to stabilize. For example, + // a delay in delivering the first set would cause a permanent drift (offset) unless corrected. + // Yet this offset would be totally harmless to any client connecting to AS after first + // set of samples have been received, and if drift correction is disabled, it would + // stay there in the measure. + // + // With conf token AcquisitionServer_DriftInitialSkipPeriodMs set to 0 no sets will be skipped. + + return true; + } + if (!m_initialSkipPeriodPassed) + { + // The next call will be the first estimation + m_initialSkipPeriodPassed = true; + m_startTime = currentTime; + m_lastEstimationTime = currentTime; + return true; + } + + m_receivedSampleCount += newSamples; // How many samples have arrived from the driver + m_correctedSampleCount += newSamples; // The "corrected" amount of samples + + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Drift measured at " << CTime(currentTime - m_startTime).toSeconds() * 1000 << "ms.\n"; + + const double jitter = computeJitter(currentTime); + + m_jittersEstimate.push_back(jitter); + if (m_jittersEstimate.size() > m_nJitterEstimationForDrift) { m_jittersEstimate.pop_front(); } + + // Estimate the drift after we have a full buffer of jitter estimates + if (m_jittersEstimate.size() == m_nJitterEstimationForDrift) + { + double newDriftEstimate = 0; + + for (auto j = m_jittersEstimate.begin(); j != m_jittersEstimate.end(); ++j) { newDriftEstimate += *j; } + + m_driftEstimate = newDriftEstimate / m_nJitterEstimationForDrift; + + if (m_driftEstimate > 0) { m_driftEstimateTooFastMax = std::max(m_driftEstimateTooFastMax, m_driftEstimate); } + else { m_driftEstimateTooSlowMax = std::max(m_driftEstimateTooSlowMax, -m_driftEstimate); } + + if (std::abs(m_driftEstimate) > this->getDriftToleranceSampleCount()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << + "At " << CTime(currentTime).toSeconds() * 1000 << "ms," + << " Acq mon [drift:" << getDriftMs() << "][jitter:" << jitter << "] samples," + << " dsc " << getDriftSampleCount() + << " (inner lat. samples " << m_nInnerLatencySample << ")\n"; + } + } + + m_lastEstimationTime = currentTime; + + return true; +} + + +bool CDriftCorrection::correctDrift(const int64_t correction, size_t& totalSamples, std::deque>& pendingBuffers, + CStimulationSet& pendingStimSet, const std::vector& paddingBuffer) +{ + if (!m_isStarted) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Drift correction: correctDrift() called before start()\n"; + return false; + } + + if (m_driftCorrectionPolicy == EDriftCorrectionPolicies::Disabled) + { + // Not an error, we just don't correct + return false; + } + + m_isActive = true; + + if (correction == 0) { return true; } + + if (totalSamples != uint64_t(m_correctedSampleCount)) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Server and drift correction class disagree on the number of samples\n"; + } + + const uint64_t elapsedTime = System::Time::zgetTime() - m_startTime; + const double elapsedTimeSec = CTime(elapsedTime).toSeconds(); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "At time " << elapsedTimeSec << "s : Correcting drift by " << correction << " samples\n"; + + if (correction > 0) + { + for (int64_t i = 0; i < correction; ++i) { pendingBuffers.push_back(paddingBuffer); } + + const uint64_t timeOfIncorrect = CTime(m_correctedSampleCount - 1).time() / uint64_t(m_sampling); + const uint64_t durationOfIncorrect = CTime(m_sampling, correction).time(); + const uint64_t timeOfCorrect = CTime(m_correctedSampleCount - 1 + correction).time() / uint64_t(m_sampling); + pendingStimSet.appendStimulation(OVTK_StimulationId_AddedSamplesBegin, timeOfIncorrect, durationOfIncorrect); + pendingStimSet.appendStimulation(OVTK_StimulationId_AddedSamplesEnd, timeOfCorrect, 0); + + m_driftEstimate += correction; + + m_correctedSampleCount += correction; + m_nDriftCorrectionSampleAdded += correction; + m_nDriftCorrection++; + } + else if (correction < 0) + { + const size_t samplesToRemove = std::min(size_t(-correction), pendingBuffers.size()); + + pendingBuffers.erase(pendingBuffers.begin() + pendingBuffers.size() - int(samplesToRemove), pendingBuffers.begin() + pendingBuffers.size()); + + const size_t lastSampleDate = CTime(m_correctedSampleCount - samplesToRemove).time() / size_t(m_sampling); + for (size_t i = 0; i < pendingStimSet.getStimulationCount(); ++i) + { + if (pendingStimSet.getStimulationDate(i) > lastSampleDate) { pendingStimSet.setStimulationDate(i, lastSampleDate); } + } + + pendingStimSet.appendStimulation(OVTK_StimulationId_RemovedSamples, lastSampleDate, 0); + + m_driftEstimate -= samplesToRemove; + + m_correctedSampleCount -= samplesToRemove; + m_nDriftCorrectionSampleRemoved += samplesToRemove; + m_nDriftCorrection++; + } + + // correct the jitter estimate to match the correction we made. For example, if we had + // a jitter estimate of [-1,-1,-1,...] and correct the drift by adding 1 sample, the new + // estimate should become [0,0,0,0,...] with relation to the adjustment. This changes jitter estimates + // in the past. The other alternative would be to reset the estimate. Adjusting + // might keep some detail the reset would lose. + for (auto j = m_jittersEstimate.begin(); j != m_jittersEstimate.end(); ++j) { (*j) += correction; } + + totalSamples = uint64_t(m_correctedSampleCount); + + return true; +} + +// Note that we cannot do actual correction with subsample accuracy, so here we truncate the drift estimate to integer in getDriftSampleCount(). +int64_t CDriftCorrection::getSuggestedDriftCorrectionSampleCount() const +{ + const double toleranceMs = double(this->getDriftToleranceDurationMs()); + const double currentDriftMs = this->getDriftMs(); + + if (std::abs(currentDriftMs) > toleranceMs) + { + // The correction is always to the opposite direction of the drift + return -this->getDriftSampleCount(); + } + + return 0; +} + +// ____________________________________________________________________________ +// + +bool CDriftCorrection::setDriftToleranceDurationMs(const uint64_t ms) +{ + if (ms == 0) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Minimum accepted drift tolerance limit is 1ms\n"; + m_driftToleranceDurationMs = 1; + return true; + } + + m_driftToleranceDurationMs = ms; + return true; +} + +bool CDriftCorrection::setJitterEstimationCountForDrift(const uint64_t count) +{ + m_nJitterEstimationForDrift = count; + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCDriftCorrection.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCDriftCorrection.h new file mode 100644 index 0000000..3995b84 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCDriftCorrection.h @@ -0,0 +1,136 @@ +#pragma once + +#include "ovas_base.h" + +#include +#include +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +enum class EDriftCorrectionPolicies { DriverChoice = 0, Forced, Disabled }; + +inline std::string toString(const EDriftCorrectionPolicies& policy) +{ + switch (policy) + { + case EDriftCorrectionPolicies::Disabled: return "Disabled"; + case EDriftCorrectionPolicies::DriverChoice: return "Driver Choice"; + case EDriftCorrectionPolicies::Forced: return "Forced"; + } +} + +/* + * \class CDriftCorrection + * \author Jussi T. Lindgren / Inria + * + * \brief A refactoring of the old drift correction code that was originally mixed into the acquisition server main code. + * + */ +class CDriftCorrection final +{ +public: + + explicit CDriftCorrection(const Kernel::IKernelContext& ctx); + ~CDriftCorrection() { } + + // To start a new drift estimation and stop it. + bool start(uint32_t sampling, uint64_t startTime); + void stop(); + + // Estimate the drift + // + // \param newSamples [in] : How many samples the driver returned + bool estimateDrift(uint64_t newSamples); + + // Request a drift correction + // + // \param i64correction [in] : the number of samples to correct + // \param totalSamples [out] : Number of total samples after correction for drift + // \param pendingBuffers [in/out] : The sample buffer to be corrected + // \param pendingStimSet [in/out] : The stimulation set to be realigned + // \param paddingBuffer[in] : The sample to repeatedly add if correction > 0 + bool correctDrift(int64_t correction, size_t& totalSamples, std::deque>& pendingBuffers, + CStimulationSet& pendingStimSet, const std::vector& paddingBuffer); + + // Status functions + bool isActive() const { return m_isActive; } + + // Prints various statistics but only if drift tolerance was exceeded + void printStats() const; + + // Result getters + // current drift, in ms. + double getDriftMs() const { return (m_sampling == 0) ? 0 : m_driftEstimate * 1000.0 / m_sampling; } + // maximum positive drift observed, in ms. (driver gave too many samples) + double getDriftTooFastMax() const { return (m_sampling == 0) ? 0 : m_driftEstimateTooFastMax * 1000.0 / m_sampling; } + // maximum negative drift observed, in ms. (driver gave too few samples) + double getDriftTooSlowMax() const { return (m_sampling == 0) ? 0 : m_driftEstimateTooSlowMax * 1000. / m_sampling; } + // current drift, in samples + int64_t getDriftSampleCount() const { return int64_t(m_driftEstimate); } + int64_t getDriftToleranceSampleCount() const { return m_nDriftToleranceSample; } + // number of samples to correct drift with + int64_t getSuggestedDriftCorrectionSampleCount() const; + + // Parameter getters and setters + int64_t getInnerLatencySampleCount() const { return m_nInnerLatencySample; } + void setInnerLatencySampleCount(const int64_t count) { m_nInnerLatencySample = count; } + + EDriftCorrectionPolicies getDriftCorrectionPolicy() const { return m_driftCorrectionPolicy; } + CString getDriftCorrectionPolicyStr() const { return CString(toString(m_driftCorrectionPolicy).c_str()); } + void setDriftCorrectionPolicy(const EDriftCorrectionPolicies policy) { m_driftCorrectionPolicy = policy; } + + uint64_t getDriftToleranceDurationMs() const { return m_driftToleranceDurationMs; } + bool setDriftToleranceDurationMs(uint64_t ms); + + uint64_t getJitterEstimationCountForDrift() const { return m_nJitterEstimationForDrift; } + bool setJitterEstimationCountForDrift(uint64_t count); + +protected: + + void reset(); + + // Computes jitter in fractional samples + double computeJitter(uint64_t currentTime) const; + + const Kernel::IKernelContext& m_kernelCtx; + + // State of the drift correction + bool m_isInitialized = false; + bool m_isStarted = false; + bool m_isActive = false; + bool m_initialSkipPeriodPassed = false; + + // Parameters + EDriftCorrectionPolicies m_driftCorrectionPolicy; + uint64_t m_driftToleranceDurationMs = 0; + int64_t m_nDriftToleranceSample = 0; + int64_t m_nInnerLatencySample = 0; + uint64_t m_nJitterEstimationForDrift = 0; + uint32_t m_sampling = 0; + uint64_t m_initialSkipPeriod = 0; + + // Results + double m_receivedSampleCount = 0; + double m_correctedSampleCount = 0; + double m_driftEstimate = 0; // In subsample accuracy, e.g. 1.2 samples. + double m_driftEstimateTooFastMax = 0; // maximum over time + double m_driftEstimateTooSlowMax = 0; // minimum over time + + // Stats + int64_t m_nDriftCorrectionSampleAdded = 0; + int64_t m_nDriftCorrectionSampleRemoved = 0; + uint64_t m_nDriftCorrection = 0; + + // Timekeeping + uint64_t m_startTime = 0; + uint64_t m_lastEstimationTime = 0; + + // Jitter estimation buffer. Each entry is the difference between the expected number of + // samples and the received number of samples per each call to estimateDrift(). The buffer has subsample accuracy to avoid rounding errors. + // -> The average of the buffer items is the current aggregated drift estimate (in samples), convertable to ms by getDrift(). + std::list m_jittersEstimate; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCHeader.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCHeader.cpp new file mode 100644 index 0000000..c6c35e0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCHeader.cpp @@ -0,0 +1,240 @@ +#include "ovasCHeader.h" + +#include +#include + +#define NO_VALUE_I 0xffffffff + +namespace OpenViBE { +namespace AcquisitionServer { +namespace { +class CHeaderImpl final : public IHeader +{ +public: + + CHeaderImpl() {} + ~CHeaderImpl() override {} + void reset() override; + + // Experiment information + bool setExperimentID(const size_t experimentID) override; + bool setSubjectAge(const size_t subjectAge) override; + bool setSubjectGender(const size_t subjectGender) override; + + size_t getExperimentID() const override { return m_experimentID; } + size_t getSubjectAge() const override { return m_subjectAge; } + size_t getSubjectGender() const override { return m_subjectGender; } + + bool isExperimentIDSet() const override { return m_experimentID != NO_VALUE_I; } + bool isSubjectAgeSet() const override { return m_subjectAge != NO_VALUE_I; } + bool isSubjectGenderSet() const override { return m_subjectGender != NO_VALUE_I; } + + void setImpedanceCheckRequested(const bool active) override { m_isImpedanceCheckRequested = active; } + bool isImpedanceCheckRequested() const override { return m_isImpedanceCheckRequested; } + size_t getImpedanceLimit() const override { return m_impedanceLimit; } + void setImpedanceLimit(const size_t limit) override { m_impedanceLimit = limit; } + + // Chanel information + bool setChannelCount(const size_t nChannel) override; + bool setChannelName(const size_t index, const char* name) override; + bool setChannelGain(const size_t index, const float gain) override; + bool setChannelUnits(const size_t index, const size_t unit, const size_t factor) override; + // virtual bool setChannelLocation(const size_t index, const float channelLocationX, const float channelLocationY, const float channelLocationZ); + + size_t getChannelCount() const override { return m_nChannel; } + const char* getChannelName(const size_t index) const override; + float getChannelGain(const size_t index) const override; + bool getChannelUnits(const size_t index, size_t& unit, size_t& factor) const override; + // virtual getChannelLocation(const size_t index) const; + + bool isChannelCountSet() const override { return m_nChannel != NO_VALUE_I && m_nChannel != 0; } + bool isChannelNameSet() const override { return isChannelCountSet(); } + bool isChannelGainSet() const override { return isChannelCountSet(); } + // virtual bool isChannelLocationSet() const; + bool isChannelUnitSet() const override { return !m_channelUnits.empty(); } + + // Samples information + bool setSamplingFrequency(const size_t sampling) override; + + size_t getSamplingFrequency() const override { return m_sampling; } + + bool isSamplingFrequencySet() const override { return m_sampling != NO_VALUE_I; } + +protected: + + // Experiment information + size_t m_experimentID = NO_VALUE_I; + size_t m_subjectAge = 18; + size_t m_subjectGender = OVTK_Value_Gender_NotSpecified; + + // Chanel information + size_t m_nChannel = NO_VALUE_I; + std::map m_channelNames; + std::map m_channelsGain; + std::map> m_channelUnits; + + // Samples information + size_t m_sampling = NO_VALUE_I; + + // Impedance check + bool m_isImpedanceCheckRequested = false; + size_t m_impedanceLimit = NO_VALUE_I; +}; +} // namespace +//___________________________________________________________________// +// // + +void CHeaderImpl::reset() +{ + m_experimentID = NO_VALUE_I; + m_subjectAge = NO_VALUE_I; + m_subjectGender = NO_VALUE_I; + m_nChannel = NO_VALUE_I; + m_channelNames.clear(); + m_channelsGain.clear(); + m_channelUnits.clear(); + m_sampling = NO_VALUE_I; + m_isImpedanceCheckRequested = false; + m_nChannel = NO_VALUE_I; +} + +//___________________________________________________________________// +// // + +// Experiment information +bool CHeaderImpl::setExperimentID(const size_t experimentID) +{ + m_experimentID = experimentID; + return m_experimentID != NO_VALUE_I; +} + +bool CHeaderImpl::setSubjectAge(const size_t subjectAge) +{ + m_subjectAge = subjectAge; + return m_subjectAge != NO_VALUE_I; +} + +bool CHeaderImpl::setSubjectGender(const size_t subjectGender) +{ + m_subjectGender = subjectGender; + return m_subjectGender != NO_VALUE_I; +} + +//___________________________________________________________________// +// // + +// Chanel information + +bool CHeaderImpl::setChannelCount(const size_t nChannel) +{ + m_nChannel = nChannel; + // m_channelNames.clear(); + // m_channelsGain.clear(); + return m_nChannel != NO_VALUE_I; +} + +bool CHeaderImpl::setChannelName(const size_t index, const char* name) +{ + m_channelNames[index] = name; + return index < m_nChannel; +} + +bool CHeaderImpl::setChannelGain(const size_t index, const float gain) +{ + m_channelsGain[index] = gain; + return index < m_nChannel; +} + +bool CHeaderImpl::setChannelUnits(const size_t index, const size_t unit, const size_t factor) +{ + m_channelUnits[index] = std::pair(unit, factor); + return index < m_nChannel; +} + +// bool CHeaderImpl::setChannelLocation(const size_t index, const float channelLocationX, const float channelLocationY, const float channelLocationZ); + +const char* CHeaderImpl::getChannelName(const size_t index) const +{ + const auto i = m_channelNames.find(index); + if (i == m_channelNames.end()) { return ""; } + return i->second.c_str(); +} + +float CHeaderImpl::getChannelGain(const size_t index) const +{ + const auto i = m_channelsGain.find(index); + if (i == m_channelsGain.end()) { return (index < m_nChannel ? 1.0F : 0.0F); } + return i->second; +} + +bool CHeaderImpl::getChannelUnits(const size_t index, size_t& unit, size_t& factor) const +{ + const auto i = m_channelUnits.find(index); + if (i == m_channelUnits.end()) + { + unit = OVTK_UNIT_Unspecified; + factor = OVTK_FACTOR_Base; + + return false; + } + + unit = (i->second).first; + factor = (i->second).second; + + return true; +} + +//___________________________________________________________________// +// // + +// Samples information +bool CHeaderImpl::setSamplingFrequency(const size_t sampling) +{ + m_sampling = sampling; + return m_sampling != NO_VALUE_I; +} + +//___________________________________________________________________// +// // + +CHeader::CHeader() { m_impl = new CHeaderImpl(); } +CHeader::~CHeader() { delete m_impl; } +void CHeader::reset() { m_impl->reset(); } + +// Experiment information +bool CHeader::setExperimentID(const size_t id) { return m_impl->setExperimentID(id); } +bool CHeader::setSubjectAge(const size_t age) { return m_impl->setSubjectAge(age); } +bool CHeader::setSubjectGender(const size_t gender) { return m_impl->setSubjectGender(gender); } +size_t CHeader::getExperimentID() const { return m_impl->getExperimentID(); } +size_t CHeader::getSubjectAge() const { return m_impl->getSubjectAge(); } +size_t CHeader::getSubjectGender() const { return m_impl->getSubjectGender(); } +bool CHeader::isExperimentIDSet() const { return m_impl->isExperimentIDSet(); } +bool CHeader::isSubjectAgeSet() const { return m_impl->isSubjectAgeSet(); } +bool CHeader::isSubjectGenderSet() const { return m_impl->isSubjectGenderSet(); } + +void CHeader::setImpedanceCheckRequested(const bool state) { m_impl->setImpedanceCheckRequested(state); } +bool CHeader::isImpedanceCheckRequested() const { return m_impl->isImpedanceCheckRequested(); } +size_t CHeader::getImpedanceLimit() const { return m_impl->getImpedanceLimit(); } +void CHeader::setImpedanceLimit(const size_t limit) { m_impl->setImpedanceLimit(limit); } + +// Chanel information +bool CHeader::setChannelCount(const size_t nChannel) { return m_impl->setChannelCount(nChannel); } +bool CHeader::setChannelName(const size_t index, const char* name) { return m_impl->setChannelName(index, name); } +bool CHeader::setChannelGain(const size_t index, const float gain) { return m_impl->setChannelGain(index, gain); } +bool CHeader::setChannelUnits(const size_t index, const size_t unit, const size_t factor) { return m_impl->setChannelUnits(index, unit, factor); } +size_t CHeader::getChannelCount() const { return m_impl->getChannelCount(); } +const char* CHeader::getChannelName(const size_t index) const { return m_impl->getChannelName(index); } +float CHeader::getChannelGain(const size_t index) const { return m_impl->getChannelGain(index); } +bool CHeader::getChannelUnits(const size_t index, size_t& unit, size_t& factor) const { return m_impl->getChannelUnits(index, unit, factor); } +bool CHeader::isChannelCountSet() const { return m_impl->isChannelCountSet(); } +bool CHeader::isChannelNameSet() const { return m_impl->isChannelNameSet(); } +bool CHeader::isChannelGainSet() const { return m_impl->isChannelGainSet(); } +bool CHeader::isChannelUnitSet() const { return m_impl->isChannelUnitSet(); } + +// Samples information +bool CHeader::setSamplingFrequency(const size_t sampling) { return m_impl->setSamplingFrequency(sampling); } +size_t CHeader::getSamplingFrequency() const { return m_impl->getSamplingFrequency(); } +bool CHeader::isSamplingFrequencySet() const { return m_impl->isSamplingFrequencySet(); } + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCHeader.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCHeader.h new file mode 100644 index 0000000..6e29aba --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCHeader.h @@ -0,0 +1,118 @@ +#pragma once + +#include "ovasIHeader.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class CHeader : public IHeader +{ +public: + + CHeader(); + ~CHeader() override; + void reset() override; + + // Experiment information + bool setExperimentID(const size_t id) override; + bool setSubjectAge(const size_t age) override; + bool setSubjectGender(const size_t gender) override; + + size_t getExperimentID() const override; + size_t getSubjectAge() const override; + size_t getSubjectGender() const override; + + bool isExperimentIDSet() const override; + bool isSubjectAgeSet() const override; + bool isSubjectGenderSet() const override; + + void setImpedanceCheckRequested(const bool state) override; + bool isImpedanceCheckRequested() const override; + size_t getImpedanceLimit() const override; + void setImpedanceLimit(const size_t limit) override; + + // Chanel information + bool setChannelCount(const size_t nChannel) override; + bool setChannelName(const size_t index, const char* name) override; + bool setChannelGain(const size_t index, const float gain) override; + bool setChannelUnits(const size_t index, const size_t unit, const size_t factor) override; + // virtual bool setChannelLocation(const size_t index, const float channelLocationX, const float channelLocationY, const float channelLocationZ); + + size_t getChannelCount() const override; + const char* getChannelName(const size_t index) const override; + float getChannelGain(const size_t index) const override; + bool getChannelUnits(const size_t index, size_t& unit, size_t& factor) const override; + // virtual getChannelLocation(const size_t index) const; + + bool isChannelCountSet() const override; + bool isChannelNameSet() const override; + bool isChannelGainSet() const override; + // virtual bool isChannelLocationSet() const; + bool isChannelUnitSet() const override; + + // Samples information + bool setSamplingFrequency(const size_t sampling) override; + + size_t getSamplingFrequency() const override; + + bool isSamplingFrequencySet() const override; + +protected: + + IHeader* m_impl = nullptr; +}; + +class CHeaderAdapter : public IHeader +{ +public: + + explicit CHeaderAdapter(IHeader& header) : m_header(header) { } + + void reset() override { return m_header.reset(); } + + // Experiment information + bool setExperimentID(const size_t id) override { return m_header.setExperimentID(id); } + + bool setSubjectAge(const size_t age) override { return m_header.setSubjectAge(age); } + bool setSubjectGender(const size_t gender) override { return m_header.setSubjectGender(gender); } + + size_t getExperimentID() const override { return m_header.getExperimentID(); } + size_t getSubjectAge() const override { return m_header.getSubjectAge(); } + size_t getSubjectGender() const override { return m_header.getSubjectGender(); } + + bool isExperimentIDSet() const override { return m_header.isExperimentIDSet(); } + bool isSubjectAgeSet() const override { return m_header.isSubjectAgeSet(); } + bool isSubjectGenderSet() const override { return m_header.isSubjectGenderSet(); } + void setImpedanceCheckRequested(const bool active) override { m_header.setImpedanceCheckRequested(active); } + bool isImpedanceCheckRequested() const override { return m_header.isImpedanceCheckRequested(); } + size_t getImpedanceLimit() const override { return m_header.getImpedanceLimit(); } + void setImpedanceLimit(const size_t impedanceLimit) override { m_header.setImpedanceLimit(impedanceLimit); } + + // Channel information + bool setChannelCount(const size_t nChannel) override { return m_header.setChannelCount(nChannel); } + bool setChannelName(const size_t index, const char* name) override { return m_header.setChannelName(index, name); } + bool setChannelGain(const size_t index, const float gain) override { return m_header.setChannelGain(index, gain); } + + bool setChannelUnits(const size_t index, const size_t unit, const size_t factor) override { return m_header.setChannelUnits(index, unit, factor); } + + size_t getChannelCount() const override { return m_header.getChannelCount(); } + const char* getChannelName(const size_t index) const override { return m_header.getChannelName(index); } + float getChannelGain(const size_t index) const override { return m_header.getChannelGain(index); } + + bool getChannelUnits(const size_t index, size_t& unit, size_t& factor) const override { return m_header.getChannelUnits(index, unit, factor); } + + bool isChannelCountSet() const override { return m_header.isChannelCountSet(); } + bool isChannelNameSet() const override { return m_header.isChannelNameSet(); } + bool isChannelGainSet() const override { return m_header.isChannelGainSet(); } + bool isChannelUnitSet() const override { return m_header.isChannelUnitSet(); } + + // Samples information + bool setSamplingFrequency(const size_t sampling) override { return m_header.setSamplingFrequency(sampling); } + size_t getSamplingFrequency() const override { return m_header.getSamplingFrequency(); } + bool isSamplingFrequencySet() const override { return m_header.isSamplingFrequencySet(); } + +protected: + + IHeader& m_header; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCSettingsHelper.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCSettingsHelper.cpp new file mode 100644 index 0000000..ad64b7d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCSettingsHelper.cpp @@ -0,0 +1,51 @@ +#include "ovasCSettingsHelper.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +// Save all registered variables to the configuration manager +void SettingsHelper::save() +{ + for (auto it = m_properties.begin(); it != m_properties.end(); ++it) + { + std::stringstream ss; + + ss << *(it->second); + + // m_rContext.getLogManager() << Kernel::LogLevel_Info << "Token " << it->first << " wrote [" << ss.str() << "]\n"; + const CString name = m_prefix + CString("_") + it->first; + CIdentifier id = m_configManager.lookUpConfigurationTokenIdentifier(name); + if (id == CIdentifier::undefined()) { m_configManager.createConfigurationToken(m_prefix + CString("_") + it->first, CString(ss.str().c_str())); } + else + { + // replacing token value + m_configManager.setConfigurationTokenValue(id, CString(ss.str().c_str())); + } + } +} + +// Load all registered variables from the configuration manager +void SettingsHelper::load() +{ + for (auto it = m_properties.begin(); it != m_properties.end(); ++it) + { + const CString name = m_prefix + CString("_") + it->first; + if (m_configManager.lookUpConfigurationTokenIdentifier(name) != CIdentifier::undefined()) + { + const CString value = m_configManager.expand(CString("${") + name + CString("}")); + + // m_rContext.getLogManager() << Kernel::LogLevel_Info << "Token " << it->first << " found, mgr setting = [" << value << "]\n"; + + // Note that we have to accept empty strings as the user may have intended to keep the token empty. So we do not check here. + std::stringstream ss; + ss << value.toASCIIString(); + ss >> *(it->second); + + // m_rContext.getLogManager() << Kernel::LogLevel_Info << "Token " << it->first << " inserted as [" << *(it->second) << "]\n"; + } + // else { } // token not found + } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCSettingsHelper.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCSettingsHelper.h new file mode 100644 index 0000000..de9abd3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCSettingsHelper.h @@ -0,0 +1,189 @@ +#pragma once + +#include + +#include +#include + +#include "ovasCSettingsHelperOperators.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class Property + * \author Jussi T. Lindgren (Inria) + * \date 2013-11 + * \brief Base class for properties. A property is essentially a pair. + * + * \note This class is intended for typed inheritance. It carries no data. + */ +class Property +{ +public: + explicit Property(const CString& name) : m_name(name) { } + + virtual ~Property() {} + + CString getName() const { return m_name; } + + virtual std::ostream& toStream(std::ostream& out) const = 0; + virtual std::istream& fromStream(std::istream& in) = 0; + +private: + CString m_name; +}; + +// Helper operators to map base class << and >> to those of the derived classes. These can not be members. +inline std::ostream& operator<<(std::ostream& out, const Property& obj) { return obj.toStream(out); } +inline std::istream& operator>>(std::istream& in, Property& obj) { return obj.fromStream(in); } + +/* + * \class TypedProperty + * \author Jussi T. Lindgren (Inria) + * \date 2013-11 + * \brief A property with a typed data pointer. + * + * \note The class does NOT own the data pointer, but may allow modification of its contents via replaceData(). + */ +template +class TypedProperty final : public Property +{ +public: + TypedProperty(const CString& name, T* data) : Property(name), m_data(data) { } + + // Access data + const T* getData() const { return m_data; } + + // Overwrites existing data with new contents. + void replaceData(T& data) { *m_data = data; } + + std::ostream& toStream(std::ostream& out) const override + { + out << *m_data; + return out; + } + + std::istream& fromStream(std::istream& in) override + { + in >> *m_data; + return in; + } + +private: + T* m_data = nullptr; +}; + +#ifdef OV_SH_SUPPORT_GETTERS + /* + * \class GetterSetterProperty + * \author Jussi T. Lindgren (Inria) + * \date 2013-11 + * \brief A property for situations where the data can only be accessed by getters and setters + * + * \note Type T is the type of the object that has the getters and setters as a member. The + * types V and W indicate the actual data type that the getters and setters deal with. We + * use two types V and W as in the case of the setter, the type is usually const, but for getter, + * its not. This avoids the compiler getting confused. + */ + template + class GetterSetterProperty : public Property + { + public: + GetterSetterProperty(const CString& name, T& obj, V ( T::*getter)() const, bool ( T::*setter)(W)) + : Property(name), m_obj(obj), m_getterFunction(getter), m_setterFunction(setter) { }; + + virtual std::ostream& toStream(std::ostream& out) const + { + // std::cout << "Writing " << (m_obj.*m_getter)() << "\n"; + out << (m_obj.*m_getterFunction)(); + return out; + } + + virtual std::istream& fromStream(std::istream& in) + { + W tmp; + in >> tmp; + // std::cout << "Reading " << tmp << "\n"; + (m_obj.*m_setterFunction)(tmp); + return in; + } + + private: + + T& m_obj; + V ( T::*m_getterFunction )() const; + bool ( T::*m_setterFunction )(W); + }; +#endif + +/* + * \class SettingsHelper + * \author Jussi T. Lindgren (Inria) + * \date 2013-11 + * \brief Convenience helper class that eases the saving and loading of variables (properties) to/from the configuration manager + * + * \note For registering exotic types, the user must provide the << and >> overloads to/from streams + */ +class SettingsHelper +{ +public: + SettingsHelper(const char* prefix, Kernel::IConfigurationManager& rMgr) : m_prefix(prefix), m_configManager(rMgr) { } + + ~SettingsHelper() + { + for (auto it = m_properties.begin(); it != m_properties.end(); ++it) { delete(it->second); } + m_properties.clear(); + } + + // Register or replace a variable. The variable must remain valid for the lifetime of the SettingsHelper object. + template + bool add(const CString& name, T* var) + { + if (!var) { return false; } // std::cout << "Tried to add a NULL pointer\n"; + + // If key is in map, replace + auto it = m_properties.find(name); + if (it != m_properties.end()) { delete it->second; } // m_rContext.getLogManager() << Kernel::LogLevel_Trace << "Replacing key [" << name << "]\n"; + + TypedProperty* myProperty = new TypedProperty(name, var); + m_properties[myProperty->getName()] = myProperty; + + return true; + } + +#ifdef OV_SH_SUPPORT_GETTERS + // Register or replace a property used via setters and getters. The actual object must be provided as well and + // must remain valid for the lifetime of the SettingsHelper object. + template + bool add(const CString& name, T& obj, V ( T::*getter)() const, bool ( T::*setter)(W)) + { + if (getter == nullptr || setter == nullptr) { return false; } // std::cout << "Tried to add a NULL pointer\n"; + + // If key is in map, replace + auto it = m_properties.find(name); + if (it != m_properties.end()) { delete it->second; } // m_rContext.getLogManager() << Kernel::LogLevel_Trace << "Replacing key [" << name << "]\n"; + + GetterSetterProperty* myProperty = new GetterSetterProperty(name, obj, getter, setter); + m_properties[myProperty->getName()] = myProperty; + + return true; + } +#endif + + // Save all registered variables to the configuration manager + void save(); + + // Load all registered variables from the configuration manager + void load(); + + // Get access to the registered variables + const std::map& getAllProperties() const { return m_properties; } + +private: + CString m_prefix; + Kernel::IConfigurationManager& m_configManager; + + std::map m_properties; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCSettingsHelperOperators.h b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCSettingsHelperOperators.h new file mode 100644 index 0000000..896bf37 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovasCSettingsHelperOperators.h @@ -0,0 +1,164 @@ +#pragma once + +#include +#include "ovasIHeader.h" + +#include + +/* + * \brief Operators used to convert between typical variables (as used in properties & settings) and streams + * + * + */ + +namespace OpenViBE { +namespace AcquisitionServer { +inline std::ostream& operator<<(std::ostream& out, const CString& var) +{ + out << std::string(var.toASCIIString()); + return out; +} + +inline std::istream& operator>>(std::istream& in, CString& var) +{ + std::string tmp; + std::getline(in, tmp); + var.set(tmp.c_str()); + // std::cout << "Parsed [" << var.toASCIIString() << "]\n"; + return in; +} + +// Writes fields of IHeader to a stream +inline std::ostream& operator<<(std::ostream& out, const IHeader& var) +{ + if (var.isExperimentIDSet()) { out << "ExperimentID " << var.getExperimentID() << " "; } + if (var.isSubjectAgeSet()) { out << "SubjectAge " << var.getSubjectAge() << " "; } + if (var.isSubjectGenderSet()) { out << "SubjectGender " << var.getSubjectGender() << " "; } + out << "ImpedanceCheck " << var.isImpedanceCheckRequested() << " "; + if (var.isSamplingFrequencySet()) { out << "SamplingFrequency " << var.getSamplingFrequency() << " "; } + if (var.isChannelCountSet()) { out << "Channels " << var.getChannelCount() << " "; } + + if (var.isChannelCountSet() && var.isChannelNameSet()) + { + out << "Names "; + for (size_t i = 0; i < var.getChannelCount(); ++i) { out << var.getChannelName(i) << ";"; } + out << " "; + } + + if (var.isChannelCountSet() && var.isChannelGainSet()) + { + out << "Gains "; + for (size_t i = 0; i < var.getChannelCount(); ++i) { out << var.getChannelGain(i) << " "; } + } + + return out; +} + +// Reads fields of IHeader from a stream +inline std::istream& operator>>(std::istream& in, IHeader& var) +{ + std::string token; + + while (std::getline(in, token, ' ')) + { + if (token.empty()) { continue; } + + // std::cout << "Got token [" << token << "]\n"; + + if (token == "ExperimentID") + { + // std::cout << "Parsing experiment id\n"; + uint32_t tmp; + in >> tmp; + var.setExperimentID(tmp); + } + else if (token == "SubjectAge") + { + // std::cout << "Parsing age\n"; + uint32_t tmp; + in >> tmp; + var.setSubjectAge(tmp); + } + else if (token == "SubjectGender") + { + // std::cout << "Parsing gender\n"; + uint32_t tmp; + in >> tmp; + var.setSubjectGender(tmp); + } + else if (token == "ImpedanceCheck") + { + // std::cout << "Parsing impedance check\n"; + bool tmp; + in >> tmp; + var.setImpedanceCheckRequested(tmp); + } + else if (token == "SamplingFrequency") + { + // std::cout << "Parsing freq\n"; + + uint32_t tmp; + in >> tmp; + var.setSamplingFrequency(tmp); + + // std::cout << " Got " << sampling << "\n"; + } + else if (token == "Channels") + { + // std::cout << "Parsing chn count\n"; + uint32_t tmp; + in >> tmp; + var.setChannelCount(tmp); + + // std::cout << " Got " << nChannels << "\n"; + } + else if (token == "Names" && var.isChannelCountSet()) + { + // std::cout << "Parsing names\n"; + + std::string tmp; + for (size_t i = 0; i < var.getChannelCount(); ++i) + { + std::getline(in, tmp, ';'); + // std::cout << " Parsed " << value << "\n"; + var.setChannelName(i, tmp.c_str()); + } + } + else if (token == "Gains" && var.isChannelCountSet()) + { + // std::cout << "Parsing gains\n"; + float tmp; + for (size_t i = 0; i < var.getChannelCount(); ++i) + { + in >> tmp; + var.setChannelGain(i, tmp); + // std::cout << " Parsed " << tmpGain << "\n"; + } + } + else { }// std::cout << "Unexpected token [" << token << "]\n"; + } + + return in; +} + +inline std::ostream& operator<<(std::ostream& out, const std::map& var) +{ + for (auto it = var.begin(); it != var.end(); ++it) { out << it->first << " " << it->second << " "; } + return out; +} + +inline std::istream& operator>>(std::istream& in, std::map& var) +{ + var.clear(); + uint32_t key; + uint32_t value; + while (in >> key) + { + in >> value; + var[key] = value; + } + + return in; +} +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovas_main.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovas_main.cpp new file mode 100755 index 0000000..a85026c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/acquisition-server/src/ovas_main.cpp @@ -0,0 +1,274 @@ +#include "ovasCAcquisitionServerGUI.h" + +#include +#include + +#include + +#include +#include // std::setlocale + +#include + +#if defined(TARGET_OS_Windows) +#include +#include +#endif + +typedef struct SConfiguration +{ + SConfiguration() { } + + // + std::map flag; + std::map tokens; +} configuration_t; + +bool parse_arguments(int argc, char** argv, configuration_t& config) +{ + configuration_t configuration; + + std::vector argValue; + for (int i = 1; i < argc; ++i) { argValue.push_back(argv[i]); } + argValue.push_back(""); + + for (auto it = argValue.begin(); it != argValue.end(); ++it) + { + if (*it == "") {} + else if (*it == "-c" || *it == "--config") + { + if (*++it == "") + { + std::cout << "Error: Switch --config needs an argument\n"; + return false; + } + configuration.flag["config"] = *it; + } + else if (*it == "-d" || *it == "--define") + { + if (*++it == "") + { + std::cout << "Error: Need two arguments after -d / --define.\n"; + return false; + } + + // Were not using = as a separator for token/value, as on Windows its a problem passing = to the cmd interpreter + // which is used to launch the actual designer exe. + const std::string& token = *it; + if (*++it == "") + { + std::cout << "Error: Need two arguments after -d / --define.\n"; + return false; + } + + const std::string& value = *it; // iterator will increment later + + configuration.tokens[token] = value; + } + else if (*it == "-k" || *it == "--kernel") + { + if (*++it == "") + { + std::cout << "Error: Switch --kernel needs an argument\n"; + return false; + } + configuration.flag["kernel"] = *it; + } + else if (*it == "-h" || *it == "--help") { return false; } + else if (*it == "-v" || *it == "--version") + { +#if defined(TARGET_OS_Windows) + const std::string platform("Windows"); +#elif defined(TARGET_OS_Linux) + const std::string platform("Linux"); +#else + const std::string platform("Other"); +#endif +#if defined(TARGET_ARCHITECTURE_x64) + const std::string arch("64bit"); +#else + const std::string arch("32bit"); +#endif +#if defined(TARGET_BUILDTYPE_Debug) + const std::string buildType("Debug"); +#elif defined(TARGET_BUILDTYPE_Release) + const std::string buildType("Release"); +#else + const std::string buildType("Unknown"); +#endif + std::cout << OV_PROJECT_NAME << " Acquisition Server - Version " << OV_VERSION_MAJOR << "." << OV_VERSION_MINOR << "." << OV_VERSION_PATCH + << " (" << platform << " " << arch << " " << buildType << " build)" << std::endl; + exit(0); + } + else + { + // The argument may be relevant to GTK, do not stop here + std::cout << "Note: Unknown argument [" << *it << "], passing it on to gtk...\n"; + } + } + + config = configuration; + + return true; +} + + +int main(int argc, char** argv) +{ + //___________________________________________________________________// + // // + + configuration_t config; + if (!parse_arguments(argc, argv, config)) + { + std::cout << "Syntax : " << argv[0] << " [ switches ]\n"; + std::cout << "Possible switches :\n"; + std::cout << " --config filename : path to config file\n"; + std::cout << " --define token value : specify configuration token with a given value\n"; + std::cout << " --help : displays this help message and exits\n"; + std::cout << " --kernel filename : path to openvibe kernel library\n"; + std::cout << " --version : prints version information and exits\n"; + return -1; + } + +#if defined(TARGET_OS_Windows) + HANDLE process = GetCurrentProcess(); + + // Some sources claim this is needed for accurate timing. Microsoft disagrees, so we do not use it. You can try, or try google. + //SetThreadAffinityMask(hProcess, threadMask); + + // Set the clock interval to 1ms (default on Win7: 15ms). This is needed to get under 15ms accurate sleeps, + // and improves the precision of non-QPC clocks. Note that since boost 1.58, the sleeps no longer seem + // to be 1ms accurate on Windows (as they seemed to be on 1.55), and sleep can oversleep even 10ms even with + // timeBeginPeriod(1) called. @todo in the future, make sure nothing relies on sleep accuracy in openvibe + timeBeginPeriod(1); + + // Since AS is just sleeping when its not acquiring, a high priority should not be a problem. + // As a result of these calls, the server should have a 'normal' priority INSIDE the 'realtime' priority class. + // However, unless you run AS with admin priviledges, Windows probably will truncate these priorities lower. + // n.b. For correct timing, it may be preferable to set the priority here globally and not mess with it in the drivers; + // any child threads should inherit this automagically. + SetPriorityClass(process, REALTIME_PRIORITY_CLASS); // The highest priority class + SetThreadPriority(process, THREAD_PRIORITY_NORMAL); // Even higher options: THREAD_PRIORITY_HIGHEST, THREAD_PRIORITY_TIME_CRITICAL +#endif + + OpenViBE::CKernelLoader kernelLoader; + + std::cout << "[ INF ] Created kernel loader, trying to load kernel module" << std::endl; + OpenViBE::CString error; +#if defined TARGET_OS_Windows + OpenViBE::CString kernelFile = OpenViBE::Directories::getLibDir() + "/openvibe-kernel.dll"; +#else + OpenViBE::CString kernelFile = OpenViBE::Directories::getLibDir() + "/libopenvibe-kernel.so"; +#endif + if (config.flag.count("kernel")) { kernelFile = OpenViBE::CString(config.flag["kernel"].c_str()); } + if (!kernelLoader.load(kernelFile, &error)) { std::cout << "[ FAILED ] Error loading kernel from [" << kernelFile << "]: " << error << "\n"; } + else + { + std::cout << "[ INF ] Kernel module loaded, trying to get kernel descriptor" << std::endl; + OpenViBE::Kernel::IKernelDesc* kernelDesc = nullptr; + kernelLoader.initialize(); + kernelLoader.getKernelDesc(kernelDesc); + if (!kernelDesc) { std::cout << "[ FAILED ] No kernel descriptor" << std::endl; } + else + { + std::cout << "[ INF ] Got kernel descriptor, trying to create kernel" << std::endl; + + + OpenViBE::CString configFile = OpenViBE::CString(OpenViBE::Directories::getDataDir() + "/kernel/openvibe.conf"); + if (config.flag.count("config")) { configFile = OpenViBE::CString(config.flag["config"].c_str()); } + + OpenViBE::Kernel::IKernelContext* kernelCtx = kernelDesc->createKernel("acquisition-server", configFile); + if (!kernelCtx) { std::cout << "[ FAILED ] No kernel created by kernel descriptor" << std::endl; } + else + { + kernelCtx->initialize(); + + OpenViBE::Kernel::IConfigurationManager& configManager = kernelCtx->getConfigurationManager(); + + // @FIXME CERT silent fail if missing file is provided + configManager.addConfigurationFromFile( + configManager.expand("${Path_Data}/applications/acquisition-server/acquisition-server-defaults.conf")); + + // User configuration mods + configManager.addConfigurationFromFile(configManager.expand("${Path_UserData}/openvibe-acquisition-server.conf")); + + kernelCtx->getPluginManager().addPluginsFromFiles(configManager.expand("${AcquisitionServer_Plugins}")); + + for (auto itr = config.tokens.begin(); + itr != config.tokens.end(); + ++itr) + { + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Trace << "Adding command line configuration token [" << (*itr).first.c_str() << + " = " + << (*itr).second.c_str() << "]\n"; + configManager.addOrReplaceConfigurationToken((*itr).first.c_str(), (*itr).second.c_str()); + } + + // Check the clock + if (!System::Time::isClockSteady()) + { + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Warning << + "The system does not seem to have a steady clock. This may affect the acquisition time precision.\n"; + } + + if (!gtk_init_check(&argc, &argv)) + { + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Error << + "Unable to initialize GTK. Possibly the display could not be opened. Exiting.\n"; + + OpenViBE::Toolkit::uninitialize(*kernelCtx); + kernelDesc->releaseKernel(kernelCtx); + + kernelLoader.uninitialize(); + kernelLoader.unload(); + +#if defined(TARGET_OS_Windows) + timeEndPeriod(1); +#endif + + return -2; + } + + // We rely on this with 64bit/gtk 2.24, to roll back gtk_init() sometimes switching + // the locale to one where ',' is needed instead of '.' for separators of floats, + // causing issues, for example getConfigurationManager.expandAsFloat("0.05") -> 0; + // due to implementation by std::stod(). + std::setlocale(LC_ALL, "C"); + + // gtk_rc_parse(Directories::getDataDir() + "/applications/designer/interface.gtkrc"); + +#ifdef TARGET_OS_Linux + // Replace the gtk signal handlers with the default ones. As a result, + // the following exits on terminating signals won't be graceful, + // but its better than not exiting at all (gtk default on Linux apparently) + signal(SIGHUP, SIG_DFL); + signal(SIGINT, SIG_DFL); + signal(SIGQUIT, SIG_DFL); +#endif + + { + // If this is encapsulated by gdk_threads_enter() and gdk_threads_exit(), m_thread->join() can hang when gtk_main() returns before destructor of app has been called. + OpenViBE::AcquisitionServer::CAcquisitionServerGUI app(*kernelCtx); + + try { gtk_main(); } + catch (...) { kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Fatal << "Catched top level exception\n"; } + } + + std::cout << "[ INF ] Application terminated, releasing allocated objects" << std::endl; + + OpenViBE::Toolkit::uninitialize(*kernelCtx); + + kernelDesc->releaseKernel(kernelCtx); + } + } + kernelLoader.uninitialize(); + kernelLoader.unload(); + } + +#if defined(TARGET_OS_Windows) + timeEndPeriod(1); +#endif + + return 0; +} diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/py2-check/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/platform/py2-check/CMakeLists.txt new file mode 100755 index 0000000..4724e7f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/py2-check/CMakeLists.txt @@ -0,0 +1,38 @@ + +# +# Disabled until it behaves gracefully on a system without Python dll +# +RETURN() + +PROJECT(openvibe-py2-check) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) +INCLUDE("FindThirdPartyPython2") + +# --------------------------------- + + + + +# --------------------------------- + +if(WIN32) + add_definitions("-DWIN32") +endif() +# ---------------------- +# Generate launch script +# ---------------------- +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "openvibe-py2-check" EXECUTABLE_NAME "${PROJECT_NAME}" PAUSE) + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/py2-check/src/ovpc_main.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/py2-check/src/ovpc_main.cpp new file mode 100755 index 0000000..f7dbf4b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/py2-check/src/ovpc_main.cpp @@ -0,0 +1,27 @@ +#if defined(WIN32) && !defined(TARGET_BUILDTYPE_Debug) && defined TARGET_HAS_ThirdPartyPython2 +//&& defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 2) + +#include +#define PYCHECK + +#else +#pragma message ("WARNING: Python 2.x headers are required to build the Python plugin, different includes found, skipped") +#endif + +#include +#include + +int main(int argc, char** argv) +{ + // std::cout << "hello" << std::endl; +#ifdef PYCHECK + // std::cout << "hello1" << std::endl; + Py_Initialize(); + // std::cout << "hello2" << std::endl; + Py_Finalize(); + // std::cout << "hello3" << std::endl; + return 0; +#else + return 1; +#endif +} diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/py3-check/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/platform/py3-check/CMakeLists.txt new file mode 100644 index 0000000..708c275 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/py3-check/CMakeLists.txt @@ -0,0 +1,38 @@ + +# +# Disabled until it behaves gracefully on a system without Python dll +# +RETURN() + +PROJECT(openvibe-py3-check) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) +INCLUDE("FindThirdPartyPython3") + +# --------------------------------- + + + + +# --------------------------------- + +if(WIN32) + add_definitions("-DWIN32") +endif() +# ---------------------- +# Generate launch script +# ---------------------- +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "openvibe-py3-check" EXECUTABLE_NAME "${PROJECT_NAME}" PAUSE) + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/py3-check/src/ovpc_main.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/py3-check/src/ovpc_main.cpp new file mode 100644 index 0000000..ad6dc1b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/py3-check/src/ovpc_main.cpp @@ -0,0 +1,25 @@ +#if defined(WIN32) && !defined(TARGET_BUILDTYPE_Debug) && defined TARGET_HAS_ThirdPartyPython3 +//&& defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) +#include +#define PYCHECK +#else +#pragma message ("WARNING: Python 3.x headers are required to build the Python plugin, different includes found, skipped") +#endif + +#include +#include + +int main(int argc, char** argv) +{ + // std::cout << "hello" << std::endl; +#ifdef PYCHECK + // std::cout << "hello1" << std::endl; + Py_Initialize(); + // std::cout << "hello2" << std::endl; + Py_Finalize(); + // std::cout << "hello3" << std::endl; + return 0; +#else + return 1; +#endif +} diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/CMakeLists.txt new file mode 100755 index 0000000..7f5f2a6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/CMakeLists.txt @@ -0,0 +1,118 @@ + +IF(OV_DISABLE_GTK) + MESSAGE(STATUS "Skipping Tracker, no GTK") + RETURN() +ENDIF(OV_DISABLE_GTK) + +PROJECT(openvibe-tracker) + +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl include/*.h) + +# @FIXME bad hack, we are cannibalizing a lot of non-exported code from Designer and Kernel +# Its better than copy-paste but it'd be preferable to either export the necessary materials +# or make another solution. +SET(OV_AVP_PATH "${CMAKE_SOURCE_DIR}/../designer/plugins/visualization/ovp-advanced-visualization/src/") +LIST(APPEND SRC_FILES ${OV_AVP_PATH}/m_defines.hpp + ${OV_AVP_PATH}/m_GtkGL.cpp + ${OV_AVP_PATH}/m_GtkGL.hpp + ${OV_AVP_PATH}/m_VisualizationTools.cpp + ${OV_AVP_PATH}/m_VisualizationTools.hpp + ${OV_AVP_PATH}/mTGtkGLWidget.hpp + ${OV_AVP_PATH}/mIRuler.hpp +) + +FILE(GLOB RULER_FILES RELATIVE ${OV_AVP_PATH}/ruler/ *.hpp) +# MESSAGE(STATUS "FOUND ${RULER_FILES} in ${OV_AVP_PATH}") +# AUX_SOURCE_DIRECTORY(${OV_AVP_PATH}/ruler RULER_FILES) +LIST(APPEND SRC_FILES ${RULER_FILES}) + +# from wip-jlindgre-feature-renderer-offset +ADD_DEFINITIONS("-DRENDERER_SUPPORTS_OFFSET") + +SET(OV_DESIGNER_PATH "${CMAKE_SOURCE_DIR}/../designer/applications/platform/designer/src/") +FILE(GLOB designer_files + ${OV_DESIGNER_PATH}/dynamic_settings/*.h ${OV_DESIGNER_PATH}/dynamic_settings/*.cpp + ${OV_DESIGNER_PATH}/ovd_base.h + ${OV_DESIGNER_PATH}/ovdCBoxConfigurationDialog.* + ${OV_DESIGNER_PATH}/ovdCLogListenerDesigner.* + ${OV_DESIGNER_PATH}/ovdCCommentEditorDialog.* + ${OV_DESIGNER_PATH}/ovdCSettingCollectionHelper.* +) +LIST(APPEND SRC_FILES ${designer_files}) + +configure_file(${OV_DESIGNER_PATH}/../share/interface.ui-base "${CMAKE_CURRENT_BINARY_DIR}/designer-interface.ui") +configure_file(${OV_DESIGNER_PATH}/../share/interface-settings.ui-base "${CMAKE_CURRENT_BINARY_DIR}/designer-interface-settings.ui") +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/designer-interface.ui" DESTINATION ${DIST_DATADIR}/openvibe/applications/tracker) +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/designer-interface-settings.ui" DESTINATION ${DIST_DATADIR}/openvibe/applications/tracker) + +SET(OV_KERNEL_PATH "${CMAKE_SOURCE_DIR}/../sdk/kernel/src/kernel/") +FILE(GLOB kernel_files + ${OV_KERNEL_PATH}/scenario/ovkCBoxProto.* + ${OV_KERNEL_PATH}/scenario/ovkTAttributable.h + ${OV_KERNEL_PATH}/ovkTKernelObject.h +) +LIST(APPEND SRC_FILES ${kernel_files}) + +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +INCLUDE_DIRECTORIES("include") +INCLUDE_DIRECTORIES(${OV_AVP_PATH}) +INCLUDE_DIRECTORIES(${OV_DESIGNER_PATH}) +INCLUDE_DIRECTORIES(${OV_KERNEL_PATH}) +INCLUDE_DIRECTORIES(${OV_KERNEL_PATH}/scenario) + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleSocket") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindOpenViBEModuleMessaging") +INCLUDE("FindOpenViBEModuleXML") +INCLUDE("FindThirdPartyGTK") +INCLUDE("FindThirdPartyBoost_System") +INCLUDE("FindThirdPartyOpenGL") +INCLUDE("FindOpenViBEVisualizationToolkit") +INCLUDE("FindLibMensiaAdvancedVisualisation") + +IF(WIN32) + # @FIXME CERT getting timeBeginPeriod() linker issues without this + TARGET_LINK_LIBRARIES(${PROJECT_NAME} winmm) +ENDIF(WIN32) + +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyRT") # external stims shared memory needs this + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +IF(WIN32) + ADD_DEFINITIONS(-DWIN32_LEAN_AND_MEAN) +ENDIF(WIN32) + +# ---------------------- +# Generate launch script +# ---------------------- +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +configure_file(share/tracker.ui-base "${CMAKE_CURRENT_BINARY_DIR}/tracker.ui" @ONLY) + +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/tracker.ui" DESTINATION ${DIST_DATADIR}/openvibe/applications/tracker) + +INSTALL(DIRECTORY signals DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/applications/tracker PATTERN "*-base" EXCLUDE) +INSTALL(DIRECTORY workspaces DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/doc/refactor_ideas.txt b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/doc/refactor_ideas.txt new file mode 100644 index 0000000..baa124e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/doc/refactor_ideas.txt @@ -0,0 +1,4 @@ + +Nothing for now. See git history for previous ideas. + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/BoxAdapter.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/BoxAdapter.h new file mode 100755 index 0000000..fed4466 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/BoxAdapter.h @@ -0,0 +1,101 @@ +#pragma once + +#include + +#include "Contexted.h" + +#include "StreamBundle.h" + +#include "BoxAdapterHelper.h" + +#include "Encoder.h" +#include "Decoder.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class BoxAdapter + * \brief A partially abstract class allowing processing data with OpenViBE boxes using a simple interface. + * + * The class implements a few of its members, but derived classes should implement the method spool() that feeds the data to the box, + * as well as members allowing setting the sources and destinations of the data. + * + * \author J. T. Lindgren + * + */ +class BoxAdapter : protected Contexted +{ +public: + + BoxAdapter(const Kernel::IKernelContext& ctx, const CIdentifier& algorithmId) + : Contexted(ctx), m_boxAlgorithmCtx(ctx), m_algorithmID(algorithmId) { } + + ~BoxAdapter() override { } + + virtual bool initialize(); + virtual bool spool(const bool verbose) = 0; + virtual bool uninitialize(); + + virtual TrackerBox& getBox() { return m_boxAlgorithmCtx.m_StaticBoxCtx; } + virtual CIdentifier getAlgorithmId() { return m_algorithmID; } + +protected: + TrackerBoxAlgorithmContext m_boxAlgorithmCtx; + Plugins::IBoxAlgorithm* m_boxAlgorithm = nullptr; + CIdentifier m_algorithmID = CIdentifier::undefined(); +}; + +/** + * \class BoxAdapterStream + * \brief A box adapter that reads from a Stream and writes to another Stream, having effect equivalent to outStream = process(inStream); + * \author J. T. Lindgren + * + */ +class BoxAdapterStream final : public BoxAdapter +{ +public: + + BoxAdapterStream(const Kernel::IKernelContext& ctx, const CIdentifier& algorithmId) : BoxAdapter(ctx, algorithmId) { } + + void setSource(const StreamPtr& source) { m_src = source; } + void setTarget(const StreamPtr& target) { m_dst = target; } + + bool initialize() override; + + // Process the whole stream from source to target + bool spool(const bool verbose) override; + +protected: + StreamPtr m_src = nullptr, m_dst = nullptr; +}; + +/** + * \class BoxAdapterBundle + * \brief A box adapter that reads from a StreamBundle and writes to another StreamBundle + * \author J. T. Lindgren + * + */ +class BoxAdapterBundle : public BoxAdapter +{ +public: + + BoxAdapterBundle(const Kernel::IKernelContext& ctx, const CIdentifier& algorithmId) : BoxAdapter(ctx, algorithmId) { } + + ~BoxAdapterBundle() override; + + virtual void setSource(StreamBundle* source) { m_src = source; } + virtual void setTarget(StreamBundle* target) { m_dst = target; } + + bool initialize() override; + + // Process the whole bundle from source to target + bool spool(const bool verbose) override; + +protected: + StreamBundle *m_src = nullptr, *m_dst = nullptr; + std::vector m_encoders; + std::vector m_decoders; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/BoxAdapterGenericStreamWriter.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/BoxAdapterGenericStreamWriter.h new file mode 100755 index 0000000..f2a6f99 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/BoxAdapterGenericStreamWriter.h @@ -0,0 +1,44 @@ +#pragma once + +#include "BoxAdapter.h" + +static const OpenViBE::CIdentifier STREAM_WRITER_ID = OpenViBE::CIdentifier(0x09C92218, 0x7C1216F8); + +namespace OpenViBE { +namespace Tracker { + +/** + * \class BoxAdapterGenericStreamWriter + * \brief A specific wrapper for Generic Stream Writer allowing to write tracks as .ov files from the Tracker + * \details + * This class can be considered as the counterpart of the Demuxer class, except here we simply wrap the Generic Stream Writer + * code instead of developing a new class. + * \author J. T. Lindgren + * + */ +class BoxAdapterGenericStreamWriter final : public BoxAdapterBundle +{ +public: + + BoxAdapterGenericStreamWriter(const Kernel::IKernelContext& ctx, StreamBundle& source, const std::string& filename) + : BoxAdapterBundle(ctx, STREAM_WRITER_ID), m_filename(filename) { BoxAdapterBundle::setSource(&source); } + + bool initialize() override + { + // @fixme these should actually come from the box description + Kernel::IBox* boxCtx = const_cast(m_boxAlgorithmCtx.getStaticBoxContext()); + boxCtx->addSetting("Filename", 0, CString(m_filename.c_str())); + boxCtx->addSetting("Compress", 0, "false"); + + BoxAdapterBundle::initialize(); + + return true; + } + +protected: + + + std::string m_filename; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/BoxAdapterHelper.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/BoxAdapterHelper.h new file mode 100644 index 0000000..c47aaf6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/BoxAdapterHelper.h @@ -0,0 +1,761 @@ +/* + * This file implements various contexts we need in order to run a box. + * + * @fixme most of the implementation is very primitive and may be even missing altogether + * + */ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include + +#include // std::find on Ubuntu + +#include "Contexted.h" +#include "EncodedChunk.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class TrackerPlayerContext + * \brief Implements Kernel::IPlayerContext + * \author J. T. Lindgren + * + */ +class TrackerPlayerContext final : protected Contexted, public Kernel::IPlayerContext +{ +public: + explicit TrackerPlayerContext(const Kernel::IKernelContext& ctx) : Contexted(ctx) { } + + uint64_t getCurrentTime() const override { return 0; } + uint64_t getCurrentLateness() const override { return 0; } + double getCurrentCPUUsage() const override { return 0; } + double getCurrentFastForwardMaximumFactor() const override { return 0; } + + bool stop() override { return true; } + bool pause() override { return true; } + bool play() override { return true; } + bool forward() override { return true; } + + Kernel::EPlayerStatus getStatus() const override { return Kernel::EPlayerStatus::Stop; } + Kernel::IConfigurationManager& getConfigurationManager() const override { return m_kernelCtx.getConfigurationManager(); } + Kernel::IAlgorithmManager& getAlgorithmManager() const override { return m_kernelCtx.getAlgorithmManager(); } + Kernel::ILogManager& getLogManager() const override { return m_kernelCtx.getLogManager(); } + Kernel::IErrorManager& getErrorManager() const override { return m_kernelCtx.getErrorManager(); } + Kernel::IScenarioManager& getScenarioManager() const override { return m_kernelCtx.getScenarioManager(); } + Kernel::ITypeManager& getTypeManager() const override { return m_kernelCtx.getTypeManager(); } + + bool canCreatePluginObject(const CIdentifier& /*pluginID*/) const override { return false; } + Plugins::IPluginObject* createPluginObject(const CIdentifier& /*pluginID*/) const override { return nullptr; } + bool releasePluginObject(Plugins::IPluginObject* /*pluginObject*/) const override { return true; } + + CIdentifier getClassIdentifier() const override { return CIdentifier(); } +}; + +/** + * \class TrackerBox + * \brief Implements Kernel::IBox + * \author J. T. Lindgren + * + */ +class TrackerBox : protected Contexted, public Kernel::IBox +{ +public: + + explicit TrackerBox(const Kernel::IKernelContext& ctx) : Contexted(ctx) { } + CIdentifier getIdentifier() const override { return m_ID; } + CString getName() const override { return m_Name; } + + /* + CIdentifier getAlgorithmClassIdentifier() override { return m_AlgorithmClassID; }; + */ + + // @f + CIdentifier getUnusedSettingIdentifier(const CIdentifier& id = CIdentifier::undefined()) const override { return id; } + CIdentifier getUnusedInputIdentifier(const CIdentifier& id = CIdentifier::undefined()) const override { return id; } + CIdentifier getUnusedOutputIdentifier(const CIdentifier& id = CIdentifier::undefined()) const override { return id; } + + bool addInterfacor(const Kernel::EBoxInterfacorType /*type*/, const CString& /*name*/, const CIdentifier& /*id1*/, + const CIdentifier& /*id2*/, const bool /*notify*/ = true) override { return false; } + + bool removeInterfacor(const Kernel::EBoxInterfacorType /*type*/, const size_t /*idx*/, const bool /*notify*/ = true) override { return false; } + + size_t getInterfacorCount(const Kernel::EBoxInterfacorType interfacor) const override + { + if (interfacor == Kernel::Setting) { return getSettingCount(); } + if (interfacor == Kernel::Input) { return getInputCount(); } + if (interfacor == Kernel::Output) { return getOutputCount(); } + + return 0; + } + + size_t getInterfacorCountIncludingDeprecated(const Kernel::EBoxInterfacorType type) const override { return getInterfacorCount(type); } + + bool getInterfacorIdentifier(const Kernel::EBoxInterfacorType /*type*/, const size_t /*idx*/, CIdentifier& /*id*/) const override { return false; } + + bool getInterfacorIndex(const Kernel::EBoxInterfacorType /*type*/, const CIdentifier& /*id*/, size_t& /*idx*/) const override { return false; } + + bool getInterfacorIndex(const Kernel::EBoxInterfacorType /*type*/, const CString& /*name*/, size_t& /*idx*/) const override { return false; } + + bool getInterfacorType(const Kernel::EBoxInterfacorType /*type*/, const size_t /*idx*/, CIdentifier& /*id*/) const override { return false; } + + bool getInterfacorType(const Kernel::EBoxInterfacorType /*type*/, const CIdentifier& /*id1*/, + CIdentifier& /*id2*/) const override { return false; } + + bool getInterfacorType(const Kernel::EBoxInterfacorType /*type*/, const CString& /*name*/, CIdentifier& /*id*/) const + override { return false; } + + bool getInterfacorName(const Kernel::EBoxInterfacorType /*type*/, const size_t /*idx*/, CString& /*name*/) const override { return false; } + + bool getInterfacorName(const Kernel::EBoxInterfacorType /*type*/, const CIdentifier& /*id*/, CString& /*name*/) const + override { return false; } + + bool getInterfacorDeprecatedStatus(const Kernel::EBoxInterfacorType /*type*/, const size_t /*idx*/, bool& /*value*/) const override { return false; } + + bool getInterfacorDeprecatedStatus(const Kernel::EBoxInterfacorType /*type*/, const CIdentifier& /*id*/, bool& /*value*/) const + override { return false; } + + bool hasInterfacorWithIdentifier(const Kernel::EBoxInterfacorType /*type*/, const CIdentifier& /*id*/) const override { return false; } + + bool hasInterfacorWithType(const Kernel::EBoxInterfacorType /*type*/, const size_t /*idx*/, const CIdentifier& /*id*/) const + override { return false; } + + bool hasInterfacorWithNameAndType(const Kernel::EBoxInterfacorType /*type*/, const CString& /*name*/, + const CIdentifier& /*id*/) const override { return false; } + + bool setInterfacorType(const Kernel::EBoxInterfacorType /*type*/, const size_t /*idx*/, const CIdentifier& /*id*/) override { return false; } + + bool setInterfacorType(const Kernel::EBoxInterfacorType /*type*/, const CIdentifier& /*id1*/, + const CIdentifier& /*id2*/) override { return false; } + + bool setInterfacorType(const Kernel::EBoxInterfacorType /*type*/, const CString& /*name*/, const CIdentifier& /*id*/) + override { return false; } + + bool setInterfacorName(const Kernel::EBoxInterfacorType /*type*/, const size_t /*idx*/, const CString& /*name*/) override { return false; } + + bool setInterfacorName(const Kernel::EBoxInterfacorType /*type*/, const CIdentifier& /*id*/, const CString& /*name*/) + override { return false; } + + bool setInterfacorDeprecatedStatus(const Kernel::EBoxInterfacorType /*type*/, const size_t /*idx*/, const bool /*value*/) override { return false; } + + bool setInterfacorDeprecatedStatus(const Kernel::EBoxInterfacorType /*type*/, const CIdentifier& /*id*/, const bool /*value*/) + override { return false; } + + bool updateInterfacorIdentifier(const Kernel::EBoxInterfacorType /*type*/, const size_t /*idx*/, const CIdentifier& /*newID*/) + override { return false; } + + bool addInterfacorTypeSupport(const Kernel::EBoxInterfacorType /*type*/, const CIdentifier& /*id*/) override { return false; } + bool hasInterfacorTypeSupport(const Kernel::EBoxInterfacorType /*type*/, const CIdentifier& /*id*/) const override { return false; } + + bool setIdentifier(const CIdentifier& id) override + { + m_ID = id; + return true; + } + + bool setName(const CString& name) override + { + m_Name = name; + return true; + } + + bool setAlgorithmClassIdentifier(const CIdentifier& algorithmClassID) override + { + m_AlgorithmClassID = algorithmClassID; + return true; + } + + bool initializeFromAlgorithmClassIdentifier(const CIdentifier& /*algorithmClassID*/) override { return false; } + + bool initializeFromExistingBox(const IBox& existingBox) override + { + // this->clearBox(); + this->setName(existingBox.getName()); + this->setAlgorithmClassIdentifier(existingBox.getAlgorithmClassIdentifier()); + + for (size_t i = 0; i < existingBox.getInputCount(); ++i) + { + CIdentifier typeID = CIdentifier::undefined(); + CString name; + existingBox.getInputType(i, typeID); + existingBox.getInputName(i, name); + addInput(name, typeID); + } + + for (size_t i = 0; i < existingBox.getOutputCount(); ++i) + { + CIdentifier typeID = CIdentifier::undefined(); + CString name; + existingBox.getOutputType(i, typeID); + existingBox.getOutputName(i, name); + addOutput(name, typeID); + } + + for (size_t i = 0; i < existingBox.getSettingCount(); ++i) + { + CIdentifier typeID = CIdentifier::undefined(); + CString name; + CString value; + CString defaultValue; + bool modifiability = false; + const bool notify = false; + existingBox.getSettingType(i, typeID); + existingBox.getSettingName(i, name); + existingBox.getSettingValue(i, value); + existingBox.getSettingDefaultValue(i, defaultValue); + existingBox.getSettingMod(i, modifiability); + addSetting(name, typeID, defaultValue, -1, modifiability); + setSettingValue(i, value, notify); + } + + CIdentifier id = existingBox.getNextAttributeIdentifier(CIdentifier::undefined()); + while (id != CIdentifier::undefined()) + { + this->addAttribute(id, existingBox.getAttributeValue(id)); + id = existingBox.getNextAttributeIdentifier(id); + } + + CIdentifier streamTypeID = CIdentifier::undefined(); + while ((streamTypeID = this->getKernelContext().getTypeManager().getNextTypeIdentifier(streamTypeID)) != CIdentifier::undefined()) + { + if (this->getKernelContext().getTypeManager().isStream(streamTypeID)) + { + //First check if it is a stream + if (existingBox.hasInputSupport(streamTypeID)) { this->addInputSupport(streamTypeID); } + if (existingBox.hasOutputSupport(streamTypeID)) { this->addOutputSupport(streamTypeID); } + } + } + // this->enableNotification(); + // this->notify(EBoxModification::Initialized); + return true; + } + + bool addInput(const CString& name, const CIdentifier& typeID, const CIdentifier& /*id*/ = CIdentifier::undefined(), const bool /*notify*/ = true) override + { + IOEntry tmp; + tmp.name = name; + tmp.id = typeID; + m_Inputs.push_back(tmp); + + return true; + } + + bool removeInput(const size_t /*idx*/, const bool /*notify*/ = true) override { return false; } + + size_t getInputCount() const override { return m_Inputs.size(); } + + bool getInputType(const size_t index, CIdentifier& typeID) const override + { + typeID = m_Inputs[index].id; + return true; + } + + bool getInputName(const size_t index, CString& name) const override + { + name = m_Inputs[index].name; + return true; + } + + bool setInputType(const size_t index, const CIdentifier& typeID) override + { + if (m_Inputs.size() <= index) { m_Inputs.resize(index + 1); } + m_Inputs[index].id = typeID; + return true; + } + + bool setInputName(const size_t index, const CString& name) override + { + if (m_Inputs.size() <= index) { m_Inputs.resize(index + 1); } + m_Inputs[index].name = name; + return true; + } + + + bool addOutput(const CString& name, const CIdentifier& typeID, const CIdentifier& /*id*/ = CIdentifier::undefined(), const bool /*notify*/ = true) override + { + IOEntry tmp; + tmp.name = name; + tmp.id = typeID; + m_Outputs.push_back(tmp); + return true; + } + + bool removeOutput(const size_t /*index*/, const bool /*notify*/ = true) override { return false; } + + size_t getOutputCount() const override { return m_Outputs.size(); } + + bool getOutputType(const size_t index, CIdentifier& typeID) const override + { + typeID = m_Outputs[index].id; + return true; + } + + bool getOutputName(const size_t index, CString& name) const override + { + name = m_Outputs[index].name; + return true; + } + + bool setOutputType(const size_t index, const CIdentifier& typeID) override + { + if (m_Outputs.size() <= index) { m_Outputs.resize(index + 1); } + m_Outputs[index].id = typeID; + return true; + } + + bool setOutputName(const size_t index, const CString& name) override + { + if (m_Outputs.size() <= index) { m_Outputs.resize(index + 1); } + m_Outputs[index].name = name; + return true; + } + + bool addSetting(const CString& name, const CIdentifier& typeID, const CString& defaultValue, + const size_t index = size_t(-1), const bool /*modiafiability*/ = false, + const CIdentifier& /*identifier*/ = CIdentifier::undefined(), const bool /*notify*/ = true) override + { + Kernel::ITypeManager& typeManager = m_kernelCtx.getTypeManager(); + + CString value(defaultValue); + if (typeManager.isEnumeration(typeID)) + { + if (typeManager.getEnumerationEntryValueFromName(typeID, defaultValue) == CIdentifier::undefined().id()) + { + if (typeManager.getEnumerationEntryCount(typeID) != 0) + { + // get value to the first enum entry + // and eventually correct this after + uint64_t tmp = 0; + typeManager.getEnumerationEntry(typeID, 0, value, tmp); + + // Find if the default value string actually is an identifier, otherwise just keep the zero index name as default. + CIdentifier id = CIdentifier::undefined(); + id.fromString(defaultValue); + + // Finally, if it is an identifier, then a name should be found + // from the type manager ! Otherwise value is left to the default. + const CString candidateValue = typeManager.getEnumerationEntryNameFromValue(typeID, id.id()); + if (candidateValue != CString("")) { value = candidateValue; } + } + } + } + + Setting tmp; + tmp.name = name; + tmp.id = typeID; + tmp.value = value; + tmp.defaultValue = value; + + const size_t idx = index; + + if (index == size_t(-1) || index == m_Settings.size()) { m_Settings.push_back(tmp); } + else + { + auto it = m_Settings.begin(); + it += idx; + m_Settings.insert(it, tmp); + } + + return true; + } + + bool removeSetting(const size_t index, const bool /*notify*/ = true) override + { + auto it = m_Settings.begin() + index; + if (it == m_Settings.end()) + { + getLogManager() << Kernel::LogLevel_Error << "Error: No setting found\n"; + return false; + } + it = m_Settings.erase(it); + return true; + } + + size_t getSettingCount() const override { return m_Settings.size(); } + + bool hasSettingWithName(const CString& /*name*/) const override { return false; } + + //virtual int getSettingIndex(const CString& name) const override { return -1; } + + bool getSettingType(const size_t index, CIdentifier& typeID) const override + { + typeID = m_Settings[index].id; + return true; + } + + bool getSettingName(const size_t index, CString& name) const override + { + name = m_Settings[index].name; + return true; + } + + bool getSettingDefaultValue(const CIdentifier& /*identifier*/, CString& /*rDefaultValue*/) const override { return false; } + + bool getSettingDefaultValue(const size_t index, CString& rDefaultValue) const override + { + rDefaultValue = m_Settings[index].defaultValue; + return true; + } + + bool getSettingDefaultValue(const CString& /*name*/, CString& /*rDefaultValue*/) const override { return false; } + + bool getSettingValue(const size_t index, CString& value) const override + { + if (m_Settings.size() < index) { return false; } + + value = m_Settings[index].value; + return true; + } + + bool setSettingType(const size_t index, const CIdentifier& typeID) override + { + if (m_Settings.size() <= index) { m_Settings.resize(index + 1); } + m_Settings[index].id = typeID; + return true; + } + + bool setSettingName(const size_t index, const CString& name) override + { + if (m_Settings.size() <= index) { m_Settings.resize(index + 1); } + m_Settings[index].name = name; + return true; + } + + bool setSettingDefaultValue(const size_t index, const CString& rDefaultValue) override + { + if (m_Settings.size() <= index) { m_Settings.resize(index + 1); } + m_Settings[index].defaultValue = rDefaultValue; + return true; + } + + bool setSettingValue(const size_t index, const CString& rValue, const bool /*notify*/ = true) override + { + if (m_Settings.size() <= index) { m_Settings.resize(index + 1); } + m_Settings[index].value = rValue; + return true; + } + + bool getSettingMod(const size_t /*index*/, bool& /*value*/) const override { return false; } + bool setSettingMod(const size_t /*index*/, const bool /*value*/) override { return false; } + bool getSettingValue(const CIdentifier& /*identifier*/, CString& /*value*/) const override { return false; } + bool getSettingValue(const CString& /*name*/, CString& /*value*/) const override { return false; } + bool setSettingDefaultValue(const CIdentifier& /*identifier*/, const CString& /*rDefaultValue*/) override { return false; } + bool setSettingDefaultValue(const CString& /*name*/, const CString& /*rDefaultValue*/) override { return false; } + bool setSettingValue(const CIdentifier& /*identifier*/, const CString& /*value*/) override { return false; } + bool setSettingValue(const CString& /*name*/, const CString& /*value*/) override { return false; } + bool getSettingMod(const CIdentifier& /*identifier*/, bool& /*value*/) const override { return false; } + bool getSettingMod(const CString& /*name*/, bool& /*value*/) const override { return false; } + bool setSettingMod(const CIdentifier& /*identifier*/, const bool /*value*/) override { return false; } + bool setSettingMod(const CString& /*name*/, const bool /*value*/) override { return false; } + bool swapSettings(const size_t /*indexA*/, const size_t /*indexB*/) override { return false; } + bool swapInputs(const size_t /*indexA*/, const size_t /*indexB*/) override { return false; } + bool swapOutputs(const size_t /*indexA*/, const size_t /*indexB*/) override { return false; } + bool hasModifiableSettings() const override { return false; } + + std::vector getInputSupportTypes() const override + { + std::vector tmp; + return tmp; + } + + std::vector getOutputSupportTypes() const override + { + std::vector tmp; + return tmp; + } + + size_t* getModifiableSettings(size_t& rCount) const override + { + rCount = 0; + return nullptr; + } + + bool addInputSupport(const CIdentifier& typeID) override + { + m_InputSupports.push_back(typeID); + return true; + } + + bool hasInputSupport(const CIdentifier& typeID) const override + { + return (m_InputSupports.empty() || std::find(m_InputSupports.begin(), m_InputSupports.end(), typeID) != m_InputSupports.end()); + } + + bool addOutputSupport(const CIdentifier& typeID) override + { + m_OutputSupports.push_back(typeID); + return true; + } + + bool hasOutputSupport(const CIdentifier& typeID) const override + { + return (m_OutputSupports.empty() || std::find(m_OutputSupports.begin(), m_OutputSupports.end(), typeID) != m_OutputSupports.end()); + } + + bool setSupportTypeFromAlgorithmIdentifier(const CIdentifier& /*typeID*/) override { return true; } + + CIdentifier getClassIdentifier() const override { return CIdentifier(); } + + _IsDerivedFromClass_(Kernel::IAttributable, OV_ClassId_Kernel_Scenario_Box) + + struct Setting + { + CIdentifier id = CIdentifier::undefined(); + CString name; + CString value; + CString defaultValue; + }; + + struct IOEntry + { + CIdentifier id = CIdentifier::undefined(); + CString name; + }; + + std::vector m_Settings; + std::vector m_Inputs; + std::vector m_Outputs; + std::vector m_InputSupports; + std::vector m_OutputSupports; + + // This box + CString m_Name; + CIdentifier m_ID = CIdentifier::undefined(); + CIdentifier m_AlgorithmClassID = CIdentifier::undefined(); + + // Attributable + bool addAttribute(const CIdentifier& /*attributeID*/, const CString& /*sAttributeValue*/) override { return true; } + bool removeAttribute(const CIdentifier& /*attributeID*/) override { return true; } + bool removeAllAttributes() override { return true; } + CString getAttributeValue(const CIdentifier& /*attributeID*/) const override { return CString(""); } + bool setAttributeValue(const CIdentifier& /*attributeID*/, const CString& /*sAttributeValue*/) override { return true; } + bool hasAttribute(const CIdentifier& /*attributeID*/) const override { return false; } + bool hasAttributes() const override { return false; } + + CIdentifier getNextAttributeIdentifier(const CIdentifier& /*previousID*/) const override { return CIdentifier(); } + + // @f + void clearOutputSupportTypes() override { } + void clearInputSupportTypes() override { } + + CIdentifier getAlgorithmClassIdentifier() const override { return CIdentifier(); } +}; + +/** + * \class TrackerBoxProto + * \brief Implements Kernel::IBoxProto + * \author J. T. Lindgren + * + */ +class TrackerBoxProto : public TrackerBox, public Kernel::IBoxProto +{ +public: + explicit TrackerBoxProto(const Kernel::IKernelContext& ctx) : TrackerBox(ctx) {} + + virtual bool addSetting(const CString& name, const CIdentifier& typeID, const CString& defaultValue, + const bool modifiable = false) { return TrackerBox::addSetting(name, typeID, defaultValue, -1, modifiable); } +}; + + +/** + * \class TrackerBoxIO + * \brief Implements Kernel::IBoxIO + * \author J. T. Lindgren + * + */ +class TrackerBoxIO final : public Kernel::IBoxIO +{ +public: + + struct SBufferWithStamps + { + CMemoryBuffer* buffer; + CTime startTime; + CTime endTime; + }; + + std::vector> m_InputChunks; // Queue per input. See code for comments. + std::vector m_OutputChunks; // Just one buffer per output + std::vector m_Ready; + std::vector m_StartTime; + std::vector m_EndTime; + + ~TrackerBoxIO() override { for (size_t i = 0; i < m_OutputChunks.size(); ++i) { delete m_OutputChunks[i]; } } + + bool initialize(const Kernel::IBox* boxCtx) + { + for (size_t i = 0; i < m_OutputChunks.size(); ++i) { delete m_OutputChunks[i]; } + + m_InputChunks.resize(boxCtx->getInputCount()); + m_OutputChunks.resize(boxCtx->getOutputCount()); + m_Ready.resize(boxCtx->getOutputCount(), 0); + m_StartTime.resize(boxCtx->getOutputCount()); + m_EndTime.resize(boxCtx->getOutputCount()); + + for (size_t i = 0; i < m_OutputChunks.size(); ++i) { m_OutputChunks[i] = new CMemoryBuffer(); } + + return true; + } + + size_t getInputChunkCount(const size_t index) const override + { + if (index >= m_InputChunks.size()) { return 0; } + return m_InputChunks[index].size(); + } + + bool getInputChunk(const size_t index, const size_t chunkIdx, uint64_t& startTime, uint64_t& endTime, size_t& size, + const uint8_t*& buffer) const override + { + const std::vector& chunks = m_InputChunks[index]; + const SBufferWithStamps& chk = chunks[chunkIdx]; + + startTime = chk.startTime.time(); + endTime = chk.endTime.time(); + size = chk.buffer->getSize(); + buffer = chk.buffer->getDirectPointer(); + + return true; + } + + // Essentially this function being const and requiring its output as IMemoryBuffer prevents us from simply carrying our data as std::vector. + const IMemoryBuffer* getInputChunk(const size_t index, const size_t chunkIdx) const override + { + const std::vector& chunks = m_InputChunks[index]; + const SBufferWithStamps& chk = chunks[chunkIdx]; + + return chk.buffer; + } + + uint64_t getInputChunkStartTime(const size_t index, const size_t chunkIdx) const override + { + const std::vector& chunks = m_InputChunks[index]; + const SBufferWithStamps& chk = chunks[chunkIdx]; + + return chk.startTime.time(); + } + + uint64_t getInputChunkEndTime(const size_t index, const size_t chunkIdx) const override + { + const std::vector& chunks = m_InputChunks[index]; + const SBufferWithStamps& chk = chunks[chunkIdx]; + + return chk.endTime.time(); + } + + bool markInputAsDeprecated(const size_t /*index*/, const size_t /*chunkIdx*/) override { return true; } + + size_t getOutputChunkSize(const size_t index) const override + { + if (index >= m_OutputChunks.size()) { return false; } + return m_OutputChunks[index]->getSize(); + } + + bool setOutputChunkSize(const size_t index, const size_t size, const bool discard = true) override + { + if (m_OutputChunks.size() <= index) { m_OutputChunks.resize(index + 1); } + m_OutputChunks[index]->setSize(size, discard); + return true; + } + + uint8_t* getOutputChunkBuffer(const size_t index) override + { + if (m_OutputChunks.size() >= index) { return nullptr; } + return m_OutputChunks[index]->getDirectPointer(); + } + + bool appendOutputChunkData(const size_t index, const uint8_t* buffer, const size_t size) override { return m_OutputChunks[index]->append(buffer, size); } + + IMemoryBuffer* getOutputChunk(const size_t index) override { return m_OutputChunks[index]; } + + bool getOutputChunk(const size_t index, EncodedChunk& chk) + { + chk.m_Buffer.assign(m_OutputChunks[index]->getDirectPointer(), + m_OutputChunks[index]->getDirectPointer() + m_OutputChunks[index]->getSize()); + chk.m_StartTime = m_StartTime[index]; + chk.m_EndTime = m_EndTime[index]; + + return true; + } + + + bool markOutputAsReadyToSend(const size_t index, const uint64_t startTime, const uint64_t endTime) override + { + m_StartTime[index] = startTime; + m_EndTime[index] = endTime; + m_Ready[index] = true; + return true; + } + + + CIdentifier getClassIdentifier() const override { return CIdentifier(); } + + bool addInputChunk(const size_t index, const EncodedChunk& chk) + { + if (m_InputChunks.size() <= index) { m_InputChunks.resize(index + 1); } + SBufferWithStamps buf; + buf.startTime = chk.m_StartTime; + buf.endTime = chk.m_EndTime; + // We cannot copy CMemoryBuffer, so have to use new() @fixme SDK should implement working copy or prevent + buf.buffer = new CMemoryBuffer(&chk.m_Buffer[0], chk.m_Buffer.size()); + m_InputChunks[index].push_back(buf); + return true; + } + + bool clearInputChunks() + { + for (size_t i = 0; i < m_InputChunks.size(); ++i) + { + for (auto& chk : m_InputChunks[i]) { delete chk.buffer; } + m_InputChunks[i].clear(); + } + + return true; + } + + bool isReadyToSend(const size_t outputIdx) { return (m_Ready[outputIdx] != 0); } + + bool deprecateOutput(const size_t outputIdx) + { + m_OutputChunks[outputIdx]->setSize(0, true); + m_Ready[outputIdx] = false; + return true; + } +}; + +/** + * \class TrackerBoxAlgorithmContext + * \brief Implements Kernel::IBoxAlgorithmContext + * \author J. T. Lindgren + * + */ +class TrackerBoxAlgorithmContext final : protected Contexted, public Kernel::IBoxAlgorithmContext +{ +public: + + explicit TrackerBoxAlgorithmContext(const Kernel::IKernelContext& ctx) : Contexted(ctx), m_StaticBoxCtx(ctx), m_PlayerCtx(ctx) { } + const Kernel::IBox* getStaticBoxContext() override { return &m_StaticBoxCtx; } + Kernel::IBoxIO* getDynamicBoxContext() override { return &m_DynamicBoxCtx; } + Kernel::IPlayerContext* getPlayerContext() override { return &m_PlayerCtx; } + bool markAlgorithmAsReadyToProcess() override { return true; } + CIdentifier getClassIdentifier() const override { return CIdentifier(); } + TrackerBoxIO* getTrackerBoxIO() { return &m_DynamicBoxCtx; } + + TrackerBox m_StaticBoxCtx; + TrackerBoxIO m_DynamicBoxCtx; + TrackerPlayerContext m_PlayerCtx; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/BoxAlgorithmProxy.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/BoxAlgorithmProxy.h new file mode 100644 index 0000000..c2886b2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/BoxAlgorithmProxy.h @@ -0,0 +1,74 @@ +// +// + +#pragma once + +#include +#include + +#include +#include +#include + +#include "Contexted.h" + +namespace OpenViBE { +namespace Kernel { + +/** + * \class IBoxIOProxy + * \brief This proxy is intended for reusing codecs from the toolkit. + * @fixme it'd be more elegant not to duplicate this interface as a very similar one is already implemented in BoxAdapterHelper. + * however unifying the two would need some work. + * \author J. T. Lindgren + * + */ +class OV_API_Export IBoxIOProxy final : public IBoxIO +{ +public: + size_t getInputChunkCount(const size_t /*index*/) const override { return 0; } + + bool getInputChunk(const size_t /*inputIdx*/, const size_t /*chunkIdx*/, uint64_t& /*startTime*/, uint64_t& /*endTime*/, size_t& /*chunkSize*/, + const uint8_t*& /*chunkBuffer*/) const override { return true; } + + const IMemoryBuffer* getInputChunk(const size_t /*inputIdx*/, const size_t /*chunkIdx*/) const override { return &m_InBuffer; } + uint64_t getInputChunkStartTime(const size_t /*inputIdx*/, const size_t /*chunkIdx*/) const override { return 0; } + uint64_t getInputChunkEndTime(const size_t /*inputIdx*/, const size_t /*chunkIdx*/) const override { return 0; } + bool markInputAsDeprecated(const size_t /*inputIdx*/, const size_t /*chunkIdx*/) override { return true; } + size_t getOutputChunkSize(const size_t /*index*/) const override { return m_OutBuffer.getSize(); } + + bool setOutputChunkSize(const size_t /*index*/, const size_t size, const bool /*discard*/ = true) override { return m_OutBuffer.setSize(size, true); } + + uint8_t* getOutputChunkBuffer(const size_t /*index*/) override { return m_OutBuffer.getDirectPointer(); } + bool appendOutputChunkData(const size_t /*index*/, const uint8_t* /*buffer*/, const size_t /*size*/) override { return false; } // not implemented + + IMemoryBuffer* getOutputChunk(const size_t /*outputIdx*/) override { return &m_OutBuffer; } + + bool markOutputAsReadyToSend(const size_t /*outputIdx*/, const uint64_t /*startTime*/, const uint64_t /*endTime*/) override { return true; } + + CIdentifier getClassIdentifier() const override { return 0; } + + CMemoryBuffer m_InBuffer; + CMemoryBuffer m_OutBuffer; +}; +} // namespace Kernel +} // namespace OpenViBE + +/** + * \class BoxAlgorithmProxy + * \brief This proxy is needed in order to use the stream codecs from the toolkit + * \author J. T. Lindgren + * + */ +class BoxAlgorithmProxy final : protected OpenViBE::Tracker::Contexted +{ +public: + explicit BoxAlgorithmProxy(const OpenViBE::Kernel::IKernelContext& ctx) : Contexted(ctx) { } + + OpenViBE::Kernel::IBoxIO& getDynamicBoxContext() { return dummy; } + static bool markAlgorithmAsReadyToProcess() { return true; } + + OpenViBE::Kernel::IAlgorithmManager& getAlgorithmManager() const override { return Contexted::getAlgorithmManager(); } + + OpenViBE::Kernel::IBoxIOProxy dummy; +}; diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/BoxPlugins.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/BoxPlugins.h new file mode 100755 index 0000000..b7c0e05 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/BoxPlugins.h @@ -0,0 +1,34 @@ +#pragma once + +#include + +#include "BoxAdapter.h" +#include "Contexted.h" + +namespace OpenViBE { +namespace Tracker { +/** + * \class BoxPlugins + * \brief Box Plugins is a factory-like class that keeps a list of box plugins that can be 'applied' to streams in Tracker + * \details Boxes can be registered in the constructor + * \author J. T. Lindgren + * + */ +class BoxPlugins final : protected Contexted +{ +public: + + explicit BoxPlugins(const Kernel::IKernelContext& ctx); + ~BoxPlugins() override { for (auto ptr : m_boxPlugins) { delete ptr; } } + + // Get a list of available box plugins + const std::vector& getBoxPlugins() const { return m_boxPlugins; } + +protected: + + bool create(const CIdentifier& streamType, const CIdentifier& alg, const CIdentifier& desc); + + std::vector m_boxPlugins; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/CLogListenerTracker.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/CLogListenerTracker.h new file mode 100755 index 0000000..f102fe7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/CLogListenerTracker.h @@ -0,0 +1,153 @@ +#pragma once + +#include "ovd_base.h" +#include "ovdCLogListenerDesigner.h" + +#include +#include + +namespace OpenViBE { +namespace Tracker { + +/** + * \class CLogListenerTracker + * \brief Log listener wrapper for CLogListenerDesigner that can be called from multiple threads + * \author J. T. Lindgren + * + */ +class CLogListenerTracker final : public Kernel::ILogListener +{ +public: + + CLogListenerTracker(const Kernel::IKernelContext& ctx, GtkBuilder* builder) : m_impl(ctx, builder) { } + + // @note Only call from gtk thread + void clearMessages() + { + std::unique_lock lock(m_mutex); + // std::cout << "Intercepted\n"; + m_impl.clearMessages(); + } + + bool isActive(const Kernel::ELogLevel level) override + { + std::unique_lock lock(m_mutex); + return m_impl.isActive(level); + } + + bool activate(const Kernel::ELogLevel logLevel, const bool active) override + { + std::unique_lock lock(m_mutex); + return m_impl.activate(logLevel, active); + } + + bool activate(const Kernel::ELogLevel startLogLevel, const Kernel::ELogLevel endLogLevel, const bool active) override + { + std::unique_lock lock(m_mutex); + return m_impl.activate(startLogLevel, endLogLevel, active); + } + + bool activate(const bool active) override + { + std::unique_lock lock(m_mutex); + return m_impl.activate(active); + } + + // This function encapsulates CLogListenerDesigner so that its gtk calls will be run from g_idle_add(). + template + void logWrapper(T param) + { + auto ptr = new std::pair(this, param); + + auto fun = [](gpointer data) + { + auto ptr = static_cast*>(data); + + // LogListenerDesigner may not be thread safe, so we lock here for safety as activate() and isActive() do not go through the g_idle_add(). + std::unique_lock lock(ptr->first->getMutex()); + + ptr->first->getImpl().log(ptr->second); + delete ptr; + + return gboolean(FALSE); + }; + + g_idle_add(fun, ptr); + } + + // Specialization for const char*. It frees memory. We don't call it + // template<> logWrapper() to avoid gcc complaining. + void logWrapperCharPtr(const char* param) + { + const auto ptr = new std::pair(this, param); + + const auto fun = [](gpointer data) + { + auto ptr = static_cast*>(data); + + // LogListenerDesigner may not be thread safe, so we lock here for safety as activate() and isActive() do not go through the g_idle_add(). + std::unique_lock lock(ptr->first->getMutex()); + + ptr->first->getImpl().log(ptr->second); + delete[] ptr->second; + delete ptr; + + return gboolean(FALSE); + }; + + g_idle_add(fun, ptr); + } + + void log(const CTime value) override { logWrapper(value); } + void log(const uint64_t value) override { logWrapper(value); } + void log(const uint32_t value) override { logWrapper(value); } + void log(const int64_t value) override { logWrapper(value); } + void log(const int value) override { logWrapper(value); } + void log(const double value) override { logWrapper(value); } + void log(const bool value) override { logWrapper(value); } + void log(const Kernel::ELogLevel eLogLevel) override { logWrapper(eLogLevel); } + void log(const Kernel::ELogColor eLogColor) override { logWrapper(eLogColor); } + + // With these calls we need to make copies, as by the time the actual calls are run in gtk_idle, the originals may be gone + void log(const CIdentifier& value) override + { + const CIdentifier nonRef = value; + logWrapper(nonRef); + } + + void log(const CString& value) override + { + const CString nonRef = value; + logWrapper(nonRef); + } + + void log(const std::string& value) override + { + const std::string nonRef = value; + logWrapper(nonRef); + } + + void log(const char* value) override + { + // This one is tricksy, we cannot simply use CString as we'd lose color, but with char* we need to free the memory. Use a specialization. +#if defined(TARGET_OS_Windows) + const char* valueCopy = _strdup(value); +#else + const char* valueCopy = strdup(value); +#endif + logWrapperCharPtr(valueCopy); + } + + // Callbacks need access to these + Designer::CLogListenerDesigner& getImpl() { return m_impl; } + std::mutex& getMutex() { return m_mutex; } + + // getClassIdentifier() + _IsDerivedFromClass_Final_(Kernel::ILogListener, CIdentifier::undefined()) + +protected: + Designer::CLogListenerDesigner m_impl; + std::mutex m_mutex; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/CTracker.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/CTracker.h new file mode 100644 index 0000000..e43a669 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/CTracker.h @@ -0,0 +1,93 @@ +// +// OpenViBE Tracker +// + +#pragma once + +#include +#include +#include + +#include "Workspace.h" +#include "BoxPlugins.h" +#include "TrackerPlugins.h" +#include "Contexted.h" + +#include "ParallelExecutor.h" + +/** + * \namespace OpenViBE::Tracker + * \author J.T. Lindgren (Inria) + * \date 2018-09 + * \brief Main OpenViBE Tracker namespace + * + * All the classes defined in the OpenViBE Tracker are currently included in + * this namespace. + */ +namespace OpenViBE { +namespace Tracker { + +/** + * \class CTracker + * \author J. T. Lindgren + * \brief Tracker is the main class of OpenViBE Tracker that encapsulates the Workspace + * \details + * The tracker is in one of the states Stopped, Playing, Paused. + * + * - play() will start sending data to a specified processor from the tracks in the workspace. + * - step() will send out the chunk that is next in time order. Usually called by the GUI idle loop. + * - stop() will stop sending. Tracker can also stop if the processor quits or if all the data has been sent. + * + * In the stopped state, the Tracker also allows plugins to be applied to the Workspace content. + * + * In the future we can extend this class to host more than one workspace at the same time. + * + */ +class CTracker final : protected Contexted +{ +public: + explicit CTracker(const Kernel::IKernelContext& ctx); + ~CTracker() override; + + enum class EStates + { + Stopped = 0, + Playing, + Paused, + Stopping + }; + + bool initialize(); + + bool play(const bool playFast); + bool stop(); + + EStates step(); + + // Useful getters + EStates getCurrentState() const { return m_state; } + Workspace& getWorkspace() { return m_workspace; } + const Kernel::IKernelContext& getKernelContext() const override { return m_kernelCtx; } + + // Plugin handling + const BoxPlugins& getBoxPlugins() const { return m_boxPlugins; } + const TrackerPlugins& getTrackerPlugins() const { return m_trackerPlugins; } + bool applyBoxPlugin(size_t index); + bool applyTrackerPlugin(size_t index); + + uint32_t getNumThreads() const { return m_executor.getNumThreads(); } + bool setNumThreads(uint32_t numThreads); + + // Configuration handling + bool saveConfig(const CString& filename) const; + bool loadConfig(const CString& filename); + +protected: + Workspace m_workspace; + EStates m_state = EStates::Stopped; + BoxPlugins m_boxPlugins; + TrackerPlugins m_trackerPlugins; + ParallelExecutor m_executor; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Chunk.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Chunk.h new file mode 100755 index 0000000..7effad9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Chunk.h @@ -0,0 +1,32 @@ +#pragma once + +#include + +namespace OpenViBE { +namespace Tracker { + +/** + * \class Chunk + * \brief Base class for all OpenViBE stream content (chunk) types + * \details + * + * Regardless of the type, all chunks in OpenViBE have start and end timestamps. Hence + * they should derive from this class. In particular, Header, Buffer and End chunks + * for some particular type should ultimately derive from this class. However, + * this class defines no content. + * + * @todo In the future if these types turn out to be more generally useful, we could consider + * moving them to the Kernel. + * + * \author J. T. Lindgren + * + */ + +class Chunk +{ +public: + CTime m_StartTime = CTime::min(); + CTime m_EndTime = CTime::min(); +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/CodecFactory.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/CodecFactory.h new file mode 100755 index 0000000..894d3f4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/CodecFactory.h @@ -0,0 +1,105 @@ +// +// OpenViBE Tracker +// + +#pragma once + +#include + +#include "EncodedChunk.h" +#include "Encoder.h" +#include "Decoder.h" + +#include "StreamBase.h" +#include "Stream.h" + +#include "CodecsAll.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class CodecFactory + * \brief A factory class for obtaining encoders and decoders for streams. + * \details In OpenViBE, every stream is passed around as EBML encoded due to an old design choice. + * The encoders and decoders are used to pass between the plain and encoded formats of the data. + * \author J. T. Lindgren + * + */ +class CodecFactory +{ +public: + + // Factory for encodes + static EncoderBase* getEncoder(const Kernel::IKernelContext& ctx, StreamBase& stream) + { + EncoderBase* encoder; + const CIdentifier typeID = stream.getTypeIdentifier(); + + if (typeID == OVTK_TypeId_StreamedMatrix) { encoder = new Encoder(ctx, reinterpret_cast&>(stream)); } + else if (typeID == OVTK_TypeId_Signal) { encoder = new Encoder(ctx, reinterpret_cast&>(stream)); } + else if (typeID == OVTK_TypeId_Stimulations) { encoder = new Encoder(ctx, reinterpret_cast&>(stream)); } + else if (typeID == OVTK_TypeId_ExperimentInfo) + { + encoder = new Encoder(ctx, reinterpret_cast&>(stream)); + } + else if (typeID == OV_TypeId_ChannelLocalisation) // bug in toolkit atm with OVTK_ define + { + encoder = new Encoder(ctx, reinterpret_cast&>(stream)); + } + else if (typeID == OV_TypeId_ChannelUnits) // bug in toolkit atm with OVTK_ define + { + encoder = new Encoder(ctx, reinterpret_cast&>(stream)); + } + else if (typeID == OVTK_TypeId_Spectrum) { encoder = new Encoder(ctx, reinterpret_cast&>(stream)); } + else if (typeID == OVTK_TypeId_FeatureVector) { encoder = new Encoder(ctx, reinterpret_cast&>(stream)); } + else + { + ctx.getLogManager() << Kernel::LogLevel_Info << "Warning: Unknown Decoder type " << ctx.getTypeManager().getTypeName(typeID) << " " << + typeID.str() << "\n"; + encoder = new Encoder(ctx, reinterpret_cast&>(stream)); + } + + return encoder; + } + + // Factory for decoders + static DecoderBase* getDecoder(const Kernel::IKernelContext& ctx, StreamBase& stream) + { + DecoderBase* decoder; + const CIdentifier typeID = stream.getTypeIdentifier(); + + if (typeID == OVTK_TypeId_StreamedMatrix) { decoder = new Decoder(ctx, reinterpret_cast&>(stream)); } + else if (typeID == OVTK_TypeId_Signal) { decoder = new Decoder(ctx, reinterpret_cast&>(stream)); } + else if (typeID == OVTK_TypeId_Stimulations) { decoder = new Decoder(ctx, reinterpret_cast&>(stream)); } + else if (typeID == OVTK_TypeId_ExperimentInfo) + { + decoder = new Decoder(ctx, reinterpret_cast&>(stream)); + } + else if (typeID == OV_TypeId_ChannelLocalisation) // bug in toolkit atm with OVTK_ define + { + decoder = new Decoder(ctx, reinterpret_cast&>(stream)); + } + else if (typeID == OV_TypeId_ChannelUnits) // bug in toolkit atm with OVTK_ define + { + decoder = new Decoder(ctx, reinterpret_cast&>(stream)); + } + else if (typeID == OVTK_TypeId_Spectrum) { decoder = new Decoder(ctx, reinterpret_cast&>(stream)); } + else if (typeID == OVTK_TypeId_FeatureVector) { decoder = new Decoder(ctx, reinterpret_cast&>(stream)); } + else + { + ctx.getLogManager() << Kernel::LogLevel_Info << "Warning: Unknown Decoder type " << ctx.getTypeManager().getTypeName(typeID) << " " << + typeID.str() << "\n"; + decoder = new Decoder(ctx, reinterpret_cast&>(stream)); + } + + return decoder; + } + + // Prevent constructing + CodecFactory() = delete; + CodecFactory(const CodecFactory&) = delete; + CodecFactory(CodecFactory&&) = delete; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/CodecImpl.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/CodecImpl.h new file mode 100755 index 0000000..2ae8c1f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/CodecImpl.h @@ -0,0 +1,70 @@ +#pragma once + +#include + +#include +#include + +#include "Encoder.h" +#include "Decoder.h" + +#include "TypeError.h" + +// This macro makes specializations by instantiating an adapter that handles a type with +// the actual encoder and decoder from the toolkit +#define CODEC_IMPL_VIA_TOOLKIT(TYPENAME, TOOLKITENCODER, TOOLKITDECODER) \ + template<> class DecoderImpl : public DecoderAdapter< TYPENAME, OpenViBE::Toolkit::TOOLKITDECODER > \ + { \ + public: \ + DecoderImpl(const OpenViBE::Kernel::IKernelContext& ctx) : DecoderAdapter(ctx) { } \ + };\ + template<> class EncoderImpl : public EncoderAdapter< TYPENAME, OpenViBE::Toolkit::TOOLKITENCODER > \ + { \ + public: \ + EncoderImpl(const OpenViBE::Kernel::IKernelContext& ctx) : EncoderAdapter(ctx) { } \ + }; + +namespace OpenViBE { +namespace Tracker { +/** + * \class DecoderImpl + * \brief Fallback class for invalid situations + * \author J. T. Lindgren + * + */ +template <> +class DecoderImpl +{ +public: + explicit DecoderImpl(const Kernel::IKernelContext& /*ctx*/) { } + virtual ~DecoderImpl() = default; + + virtual bool decode(const EncodedChunk& /*source*/) { return false; } + virtual bool getHeader(TypeError::Header& /*h*/) { return false; } + virtual bool getBuffer(TypeError::Buffer& /*b*/) { return false; } + virtual bool getEnd(TypeError::End& /*e*/) { return false; } + virtual bool isHeaderReceived() { return false; } + virtual bool isBufferReceived() { return false; } + virtual bool isEndReceived() { return false; } +}; + +/** + * \class EncoderImpl + * \brief Fallback class for invalid situations + * \author J. T. Lindgren + * + */ +template <> +class EncoderImpl +{ +public: + explicit EncoderImpl(const Kernel::IKernelContext& /*ctx*/) { } + virtual ~EncoderImpl() = default; + + bool encodeHeader(EncodedChunk& /*chk*/, const TypeError::Header& /*hdr*/) { return false; } + bool encodeBuffer(EncodedChunk& /*chk*/, const TypeError::Buffer& /*buf*/) { return false; } + bool encodeEnd(EncodedChunk& /*chk*/, const TypeError::End& /*end*/) { return false; } + bool setEncodeOffset(CTime /*newOffset*/) { return false; } +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/CodecsAll.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/CodecsAll.h new file mode 100755 index 0000000..468a1fa --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/CodecsAll.h @@ -0,0 +1,32 @@ +#pragma once + +#include "CodecImpl.h" + +#include "TypeChannelLocalization.h" +#include "TypeChannelUnits.h" +#include "TypeExperimentInfo.h" +#include "TypeFeatureVector.h" +#include "TypeMatrix.h" +#include "TypeSignal.h" +#include "TypeSpectrum.h" +#include "TypeStimulation.h" + +namespace OpenViBE { +namespace Tracker { +CODEC_IMPL_VIA_TOOLKIT(TypeChannelLocalization, TChannelLocalisationEncoder, TChannelLocalisationDecoder) + +CODEC_IMPL_VIA_TOOLKIT(TypeChannelUnits, TChannelUnitsEncoder, TChannelUnitsDecoder) + +CODEC_IMPL_VIA_TOOLKIT(TypeExperimentInfo, TExperimentInfoEncoder, TExperimentInfoDecoder) + +CODEC_IMPL_VIA_TOOLKIT(TypeFeatureVector, TFeatureVectorEncoder, TFeatureVectorDecoder) + +CODEC_IMPL_VIA_TOOLKIT(TypeMatrix, TStreamedMatrixEncoder, TStreamedMatrixDecoder) + +CODEC_IMPL_VIA_TOOLKIT(TypeSignal, TSignalEncoder, TSignalDecoder) + +CODEC_IMPL_VIA_TOOLKIT(TypeSpectrum, TSpectrumEncoder, TSpectrumDecoder) + +CODEC_IMPL_VIA_TOOLKIT(TypeStimulation, TStimulationEncoder, TStimulationDecoder) +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Contexted.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Contexted.h new file mode 100755 index 0000000..5893ff7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Contexted.h @@ -0,0 +1,41 @@ +#pragma once + +#include + +namespace OpenViBE { +namespace Tracker { + +/** + * \class Contexted + * \brief This class can be used to provide KernelContext and related getters for derived classes without overly complicating the derived class interface in their headers. + * \author J. T. Lindgren + * @fixme actually this class does pretty much the same thing as Kernel::TKernelObject + * + */ +class Contexted +{ +public: + explicit Contexted(const Kernel::IKernelContext& ctx) : m_kernelCtx(ctx) { } + virtual ~Contexted() { } + + virtual const Kernel::IKernelContext& getKernelContext() const { return m_kernelCtx; } + + virtual Kernel::IAlgorithmManager& getAlgorithmManager() const { return m_kernelCtx.getAlgorithmManager(); } + virtual Kernel::IErrorManager& getErrorManager() const { return m_kernelCtx.getErrorManager(); } + virtual Kernel::ILogManager& getLogManager() const { return m_kernelCtx.getLogManager(); } + virtual Kernel::ITypeManager& getTypeManager() const { return m_kernelCtx.getTypeManager(); } + + // Convenience handle to getLogManager() + virtual Kernel::ILogManager& log() const { return getLogManager(); } + + Contexted() = delete; + + // Needed if Contexted is used as a base class for TAttributable + // virtual bool isDerivedFromClass(const CIdentifier& classID) const { return false; } + +protected: + + const Kernel::IKernelContext& m_kernelCtx; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Decoder.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Decoder.h new file mode 100755 index 0000000..d74b73e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Decoder.h @@ -0,0 +1,145 @@ +#pragma once + +#include +#include + +#include "BoxAlgorithmProxy.h" +#include "Chunk.h" +#include "EncodedChunk.h" +#include "Stream.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class DecoderBase + * \brief Base, non-typed abstract class for decoders + * \details Derived classes can be type-specific + * \author J. T. Lindgren + * + */ +class DecoderBase +{ +public: + virtual bool decode(const EncodedChunk& chk) = 0; + virtual ~DecoderBase() { } +}; + +// Fwd declare, realized by Codecs* +template +class DecoderImpl; + +/** + * \class Decoder + * \brief Decoder for a specific type T. + * \details The constructor is passed a stream to decode to. The decode() call pushes chunks to that stream. + * \author J. T. Lindgren + * + */ +template +class Decoder final : public DecoderBase +{ +public: + Decoder(const Kernel::IKernelContext& ctx, Stream& stream) : m_stream(stream), m_decoder(ctx) { } + + bool decode(const EncodedChunk& chk) override + { + m_decoder.decode(chk); + if (m_decoder.isHeaderReceived()) { return m_decoder.getHeader(m_stream.getHeader()); } + if (m_decoder.isBufferReceived()) + { + typename T::Buffer* chunk = new typename T::Buffer(); + if (m_decoder.getBuffer(*chunk)) + { + m_stream.push(chunk); + return true; + } + return false; + } + if (m_decoder.isEndReceived()) { return m_decoder.getEnd(m_stream.getEnd()); } + return false; + } + +protected: + Stream& m_stream; + DecoderImpl m_decoder; +}; + +/** + * \class DecoderAdapter + * \brief This decoder is a wrapper over the decoders in OpenViBEToolkit. + * + * The toolkit decoders require a box context to run, and do not return class objects. + * This decoder wrapper addresses those limitations. + * The usage is to create e.g. Decoder dec; and use the member functions to + * obtain the chunks with the signal type. + * + * \author J. T. Lindgren + * + */ +template +class DecoderAdapter : protected Contexted +{ +public: + explicit DecoderAdapter(const Kernel::IKernelContext& ctx) : Contexted(ctx), m_box(ctx), m_impl(m_box, 0) {} + ~DecoderAdapter() override { } + + virtual bool decode(const EncodedChunk& source) + { + if (source.m_Buffer.size() == 0) + { + // std::cout << "Empty chunk received\n"; + return false; + } + m_box.dummy.m_InBuffer.setSize(0, true); + m_box.dummy.m_InBuffer.append(&source.m_Buffer[0], source.m_Buffer.size()); + m_lastStart = source.m_StartTime; + m_lastEnd = source.m_EndTime; + return m_impl.decode(0); + } + + virtual bool getHeader(typename T::Header& h) + { + setTimeStamps(h); + return getHeaderImpl(h); + } + + virtual bool getBuffer(typename T::Buffer& b) + { + setTimeStamps(b); + return getBufferImpl(b); + } + + virtual bool getEnd(typename T::End& e) + { + setTimeStamps(e); + return getEndImpl(e); + } + + virtual bool isHeaderReceived() { return m_impl.isHeaderReceived(); } + virtual bool isBufferReceived() { return m_impl.isBufferReceived(); } + virtual bool isEndReceived() { return m_impl.isEndReceived(); } + +protected: + // These two must be written as specilizations (Codec*cpp) + bool getHeaderImpl(typename T::Header& h); + bool getBufferImpl(typename T::Buffer& b); + + static bool getEndImpl(typename T::End& /*e*/) { return true; } // NOP regardless of type + + bool setTimeStamps(Chunk& chunk) const + { + chunk.m_StartTime = m_lastStart; + chunk.m_EndTime = m_lastEnd; + return true; + } + + BoxAlgorithmProxy m_box; + + CTime m_lastStart = CTime::min(); + CTime m_lastEnd = CTime::min(); + + TToolkitDecoder m_impl; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Demuxer.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Demuxer.h new file mode 100644 index 0000000..57c3aa0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Demuxer.h @@ -0,0 +1,93 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include + +#include +#include + +#include "StreamBundle.h" + +#include "EBMLSourceFile.h" +#include "Contexted.h" + +#include "EncodedChunk.h" +#include "Decoder.h" + +class CClientHandler; +class OutputEncoder; + +class EBMLSource; + +namespace OpenViBE { +namespace Tracker { + +/** + * \class Demuxer + * \brief Demuxes (and decodes) EBML streams + * \details EBML containers such as .ov multiplex one or more streams. Demuxer takes an EBML source and splits and decodes it to a Stream Bundle. + * + * It has similar purpose as the Generic Stream Reader box. + * + * \author J. T. Lindgren + * + */ +class Demuxer final : public EBML::IReaderCallback, protected Contexted +{ +public: + + Demuxer(const Kernel::IKernelContext& ctx, EBMLSourceFile& origin, StreamBundle& target) + : Contexted(ctx), m_origin(origin), m_target(target), m_reader(*this) { initialize(); } + + bool initialize(); + bool uninitialize() const; + + // Reads some data from the origin and decodes it to target. Returns false on EOF. + bool step(); + static bool stop() { return true; } + +protected: + + EBMLSourceFile& m_origin; + StreamBundle& m_target; + + bool m_playingStarted = false; + + EBML::CReader m_reader; + EBML::CReaderHelper m_readerHelper; + + EncodedChunk m_pendingChunk; + + uint32_t m_chunksSent = 0; + + bool m_pending = false; + bool m_hasEBMLHeader = false; + + std::stack m_nodes; + std::map m_streamIdxToOutputIdxs; + std::map m_streamIdxToTypeIDs; + + std::vector m_chunkStreamType; + + std::vector m_decoders; + +private: + + bool isMasterChild(const EBML::CIdentifier& identifier) override; + void openChild(const EBML::CIdentifier& identifier) override; + void processChildData(const void* buffer, const size_t size) override; + void closeChild() override; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/EBMLSourceFile.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/EBMLSourceFile.h new file mode 100755 index 0000000..1e7a6d7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/EBMLSourceFile.h @@ -0,0 +1,95 @@ +#pragma once + +#include +#include +#include +#include + +#include "../../../../plugins/processing/file-io/src/ovp_defines.h" + +#include +#include + +#include +#include + +#include "Contexted.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class EBMLSourceFile + * \brief Reads bytes from an .ov file + * \author J. T. Lindgren + * + * @note some ov files which have lots of stimulation chunks take a long time to import + * when launching the Tracker from visual studio. this is probably due to memory allocation, similar to slow simple dsp grammar parsing. + * + * + */ +class EBMLSourceFile final : protected Contexted +{ +public: + explicit EBMLSourceFile(const Kernel::IKernelContext& ctx) : Contexted(ctx) { } + + bool initialize(const char* signalFile) + { + log() << Kernel::LogLevel_Trace << "EBMLSource: Initializing with " << signalFile << "\n"; + + m_file = FS::Files::open(signalFile, "rb"); + if (!m_file) { return false; } + + m_src = std::string(signalFile); + + return true; + } + + bool uninitialize() + { + log() << Kernel::LogLevel_Trace << "EBMLSource: Uninitializing\n"; + + if (m_file) + { + fclose(m_file); + m_file = nullptr; + } + + return true; + } + + bool isEOF() const + { + if (!m_file) { return true; } + return (feof(m_file) != 0 ? true : false); + } + + bool read(std::vector& bytes, const size_t numBytes) const + { + if (!m_file) + { + log() << Kernel::LogLevel_Error << "Error: No EBML source file set\n"; + return false; + } + + if (isEOF()) + { + log() << Kernel::LogLevel_Trace << "EBML Source file EOF reached\n"; + return false; + } + + bytes.resize(numBytes); + const size_t s = fread(&bytes[0], sizeof(uint8_t), numBytes, m_file); + bytes.resize(s); // array size tells how much was read + + return true; + } + + const std::string& getSource() const { return m_src; } + +protected: + std::string m_src; + FILE* m_file = nullptr; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/EncodedChunk.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/EncodedChunk.h new file mode 100755 index 0000000..98b7acc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/EncodedChunk.h @@ -0,0 +1,41 @@ +#pragma once + +#include + +#include "Chunk.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class EncodedChunk + * \brief Data class for encoded chunks + * \details + * Stream content in OpenViBE is carried as encoded chunks. Although this inherits from Chunk, + * this type is a bit special since its not explicitly have (header, buffer, end) subclasses. This is + * because in its encoded form, the three are not differentiated but coded into bufferData. + * + * \note Here we use uint32_t for m_streamIdx as we assume it has fixed bitcount (unlike size_t which may change). + */ +class EncodedChunk : public Chunk +{ +public: + + // These are actually passed around in OpenViBE + std::vector m_Buffer; + + // These are convenience information for Tracker + uint64_t m_StreamType = 0; + size_t m_StreamIndex = 0; +}; + +// Note that we do not store this chunk type in EncodedChunk because when we receive EncodedChunks, +// the type is not available until 'bufferData' has been decoded -- especially the case for the End type? +enum class EChunkType +{ + Header = 0, + Buffer = 1, + End = 2, +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Encoder.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Encoder.h new file mode 100755 index 0000000..3db5acc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Encoder.h @@ -0,0 +1,192 @@ +#pragma once + +#include // memcpy() on Ubuntu + +#include +#include + +#include "EncodedChunk.h" + +#include "BoxAlgorithmProxy.h" +#include "Chunk.h" + +#include "Stream.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class EncoderBase + * \brief Base, non-typed abstract class for encoders + * \author J. T. Lindgren + * + */ +class EncoderBase +{ +public: + + virtual ~EncoderBase() { } + + // Encodes the current chunk of the attached stream (in the derived class) + // chkType will contain details about the specific chunk type (since EncodedChunk doesn't show it explicitly) + virtual bool encode(EncodedChunk& chk, EChunkType& chkType) = 0; + + // Advance all timestamps of the encoded chunks by this amount + // Used for catenating multiple tracks + virtual bool setEncodeOffset(CTime newOffset) = 0; +}; + +// Fwd declare, realized by Codecs* +template +class EncoderImpl; + +/** + * \class Encoder + * \brief Encoder class taking in typed Stream and it into EBML-containing encoded chunks. + * \details The constructor is passed a Stream to encode from. The encode() call pulls the next chunk from the Stream and returns an EncodedChunk. + * \author J. T. Lindgren + * + */ +template +class Encoder final : public EncoderBase +{ +public: + Encoder(const Kernel::IKernelContext& ctx, Stream& stream) : m_stream(stream), m_encoder(ctx) { } + + // Encode the current chunk. The caller must step the stream. + bool encode(EncodedChunk& chk, EChunkType& chkType) override + { + const size_t position = m_stream.getPosition(); + + if (position == size_t(-1)) + { + // std::cout << "Encode header\n"; + chkType = EChunkType::Header; + return m_encoder.encodeHeader(chk, m_stream.getHeader()); + } + if (position < m_stream.getChunkCount()) + { + chkType = EChunkType::Buffer; + + const bool retVal = m_encoder.encodeBuffer(chk, *m_stream.getChunk(position)); + // std::cout << "Encoder gave " << chk.bufferData.size() << "\n"; + + return retVal; + } + if (position == m_stream.getChunkCount()) + { + chkType = EChunkType::End; + + auto end = m_stream.getEnd(); + + // Some streams might not have an end in the file. Here we force one to be present. + // @fixme move to load + if (end.m_StartTime == CTime::max() || end.m_EndTime == CTime::max()) + { + // @note modifies the stream + end.m_StartTime = m_stream.getDuration(); + end.m_EndTime = end.m_StartTime; + } + + return m_encoder.encodeEnd(chk, end); + } + return false; + } + + bool setEncodeOffset(CTime newOffset) override { return m_encoder.setEncodeOffset(newOffset); } + +protected: + + Stream& m_stream; + EncoderImpl m_encoder; +}; + +/** + * \class EncoderAdapter + * \brief Adapter to use implementations from Toolkit + * + * Note that this class does not set the encoded chunk times or index, these are currently + * handled outside the encoder. + * + * \author J. T. Lindgren + * + */ +template +class EncoderAdapter : protected Contexted +{ +public: + explicit EncoderAdapter(const Kernel::IKernelContext& ctx) : Contexted(ctx), m_box(ctx), m_impl(m_box, 0) {} + ~EncoderAdapter() override { } + + // If chunk timestamps are adjusted, this function should be used to adjust any possible + // timestamps inside the chunks accordingly + bool setEncodeOffset(const CTime newOffset) + { + m_offset = newOffset; + return true; + } + + bool encodeHeader(EncodedChunk& chk, const typename T::Header& inputHdr) + { + m_box.dummy.setOutputChunkSize(0, 0, true); + chk.m_StartTime = inputHdr.m_StartTime + m_offset; + chk.m_EndTime = inputHdr.m_EndTime + m_offset; + + encodeHeaderImpl(inputHdr); + + fillChunk(chk); + + return true; + } + + bool encodeBuffer(EncodedChunk& chk, const typename T::Buffer& inputBuf) + { + m_box.dummy.setOutputChunkSize(0, 0, true); + chk.m_StartTime = inputBuf.m_StartTime + m_offset; + chk.m_EndTime = inputBuf.m_EndTime + m_offset; + + encodeBufferImpl(inputBuf); + + fillChunk(chk); + + return true; + } + + bool encodeEnd(EncodedChunk& chk, const typename T::End& inputEnd) + { + m_box.dummy.setOutputChunkSize(0, 0, true); + + chk.m_StartTime = inputEnd.m_StartTime + m_offset; + chk.m_EndTime = inputEnd.m_EndTime + m_offset; + + encodeEndImpl(inputEnd); + + fillChunk(chk); + + return true; + } + +protected: + + // These two must be written as specializations (Codec*cpp) + bool encodeHeaderImpl(const typename T::Header& hdr); + bool encodeBufferImpl(const typename T::Buffer& buf); + + bool encodeEndImpl(const typename T::End& /*end*/) { return m_impl.encodeEnd(); } + + bool fillChunk(EncodedChunk& chk) + { + const size_t chunkSize = size_t(m_box.dummy.getOutputChunkSize(0)); + chk.m_Buffer.resize(chunkSize); + if (chunkSize > 0) { memcpy(&chk.m_Buffer[0], m_box.dummy.getOutputChunkBuffer(0), chunkSize); } + return true; + } + + BoxAlgorithmProxy m_box; + + TToolkitEncoder m_impl; + + CTime m_offset = CTime::min(); +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/GUI.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/GUI.h new file mode 100755 index 0000000..bf2cca1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/GUI.h @@ -0,0 +1,219 @@ +#pragma once + +#include "CTracker.h" +#include "Workspace.h" + +#include "Stream.h" +#include "TypeSignal.h" +#include "TypeSpectrum.h" +#include "TypeStimulation.h" + +#include "Contexted.h" + +#include "CLogListenerTracker.h" + +// Forward declare +struct _GtkBuilder; +typedef struct _GtkWidget GtkWidget; +// typedef struct _GtkTable GtkTable; + +namespace OpenViBE { +namespace Tracker { +class StreamRendererBase; + +/** + * \class GUI + * \brief The main GUI code for the OpenViBE Tracker. + * \author J. T. Lindgren + * + * \details + * This file handles most of the GTK related GUI of the Tracker, with the actual functions modifying the data trying to be as much as possible + * implemented in the non-GUI classes. Although the GUI is currently quite monolithic, the rendering of the different Stream types has been + * delegated to StreamRenderer* classes, which in turn use the Mensia Advanced Visualizations toolkit. Code from Designer is also used by + * making CMake include it. + * + */ +class GUI final : protected Contexted +{ +public: + + GUI(int argc, char* argv[], CTracker& app); + ~GUI() override; + + bool run(); + + /** + * \class GUITrack + * \brief Holds the renderers for each stream of a Track, and the correspondig GTK table for the widgets. + * \author J. T. Lindgren + */ + class GUITrack + { + public: + GUITrack() { } + ~GUITrack(); + + GtkWidget* m_Frame = nullptr; + + // Renderer per stream + std::vector m_Renderers; + }; + +protected: + + // The main loop to do work, e.g. feed the tracks to processor + bool step(); + + CString getWorkspaceInfo() const; + + bool addTracksToMenu(); + + // Enable/disable certain widgets during play (processing) + bool setPlaytimeWidgetState(bool enabled); + // Enable/disable certain widgets depending on the current state (streams, processors, etc) + bool updateIdleWidgetState(); + + bool storeRendererSettings(); + + // Callbacks + bool addTrackCB(); + bool openWorkspaceCB(); + bool openProcessorCB() const; + bool openProcessorCBFinal(); + bool saveAsCB(); + bool saveCB(); + bool incrementRevSaveCB(); + bool clearCB(); + bool quitCB(); + bool stopCB() const; + bool playCB(); + bool playFastCB(); + bool workspaceInfoCB() const; + bool aboutCB() const; + + bool selectWorkspacePathCB() const; + bool selectWorkspacePathCBFinal() const; + + bool editSelectionCB(); + bool editSelectionCB2() { return editSelectionCB(); } + bool selectAllCB(); + bool selectNoneCB(); + + bool processorPreferencesCB() const; + bool processorPreferencesButtonOkCB(); + bool processorPreferencesButtonCancelCB() const; + bool processorEditCB() const; + bool processorEditCB2() const; + + bool editNotesCB() const; + bool editNotesCB2() const { return editNotesCB(); } + + bool hScrollCB(GtkWidget* widget); + bool hScaleCB(GtkWidget* widget); + + bool deleteAllTracksCB(); + bool deleteTrackCB(GtkWidget* widget); + bool moveTrackCB(GtkWidget* widget); + bool toggleRulerCB(GtkWidget* widget); + bool toggleShowSelectedOnlyCB(GtkWidget* widget); + + static bool showChunksCB(GtkWidget* widget); + bool moveStreamCB(GtkWidget* widget); + bool deleteStreamCB(GtkWidget* widget); + + bool applyBoxPluginCB(GtkWidget* widget); + bool trackerPluginCB(GtkWidget* widget); + bool setSelectionCB(GtkWidget* widget); + + bool clearMessagesCB() const; + + // Render a stream by pushing the chunks in view to the renderer + template + bool draw(const Stream* stream, TRenderer& renderer, CTime startTime, CTime endTime) + { + renderer.reset(); + + typename T::Buffer* buf; + + // Push the visible chunks to renderer + uint64_t chunksSent = 0; + for (size_t i = 0; i < stream->getChunkCount(); ++i) + { + if (stream->getChunk(i, &buf) && buf->m_StartTime >= startTime && buf->m_EndTime <= endTime) + { + renderer.push(*buf); + chunksSent++; + } + } + + /* + CTime viewDuration = (endTime - startTime).ceil(); + uint64_t chunkCount = viewDuration /renderer.getChunkDuration(); + + std::cout << "View duration " << viewDuration.toSeconds() << ", chks " << chunkCount << "\n"; + + std::cout << "Pushed " << chunksSent << " chks, padding " << chunkCount-chunksSent << " -> " << chunkCount << "\n"; + if (buf && chunksSent < chunkCount) + { + while (chunksSent < chunkCount) + { + // @fixme push empty + renderer.push(*buf, true); + chunksSent++; + } + } + */ + renderer.finalize(); + + return true; + } + + bool redrawTrack(size_t index); + bool redrawAllTracks(); + bool redrawStream(size_t trackIndex, size_t streamIndex); + bool resetWidgetProperties(); + + bool initializeRenderers(); + bool clearRenderers(); + bool updateRulerState(); + + CTracker& m_tracker; + + std::vector m_tracks; // One per each track in workspace + + struct _GtkBuilder* m_interface = nullptr; + + GtkWidget* m_mainWindow = nullptr; + GtkWidget* m_scrollbar = nullptr; + GtkWidget* m_scale = nullptr; + GtkWidget* m_workspaceLabel = nullptr; + GtkWidget* m_timeDisplay = nullptr; + GtkWidget* m_trackCounter = nullptr; + GtkWidget* m_selectionWindow = nullptr; + + uint64_t m_numChannels = 0; + uint64_t m_chunkSize = 0; + uint64_t m_totalChunks = 0; + + CTime m_previousTime = CTime::min(); + CTime m_lastRedraw = CTime::min(); + +#if defined(TARGET_OS_Windows) + int m_requestResetInNFrames = -1; + bool m_expanderOpen = false; + double m_hScrollBarValue = 0; +#endif + + bool m_requestRedraw = false; + bool m_waitingForStop = false; + + CLogListenerTracker* m_logListener = nullptr; + + // This hack is needed since on Ubuntu 16.04, for some reason + // gtk_widget_set_sensitive doesn't work on main level menu items, + // and descending the menu as a container doesn't seem to allow + // graying out the menu items either + std::vector m_trackMenuWidgets; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/ITrackerPlugin.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/ITrackerPlugin.h new file mode 100755 index 0000000..d1b0d4c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/ITrackerPlugin.h @@ -0,0 +1,79 @@ +#pragma once + +#include + +#include "Contexted.h" +#include "StreamBundle.h" +#include "Workspace.h" +#include "Selection.h" +#include "ParallelExecutor.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class ITrackerPlugin + * \brief Brief + * \author J. T. Lindgren + * \details + * + * Tracker Plugins are processing plugins specific to the OpenViBE Tracker. + * The idea is to allow plugins to access the whole track content (StreamBundle) + * with a simple interface and minimal overhead. + * + * In detail, the difference between Tracker Plugins and Box Plugins is as follows. + * A box plugin wraps openvibe box code, and subsequently the code will have + * to deal with the classical openvibe objects such as encoders, decoders, and so on. + * The Tracker Plugin, on the other hand, gives the programmer access + * to the StreamBundle structure. This allows the plugin code to request and manipulate + * the streams and their chunks freely. A tracker plugin can also add or remove streams + * to the bundle. + * + * Tracker plugins do not currently have explicit parameters, but you + * can pass parameters in using configuration tokens, and then request/set them + * via m_kernelCtx.getConfigurationManager() interface. + * + * Note that the StreamBundle given as input to a Tracker Plugin is in not + * safeguarded against "bad" modifications by the plugin. + * + * @todo tracker and box plugins might be refactorable to be under same interface. + * @todo allow non-inplace mode operation + * @todo derive different subclasses for the 'capabilities' instead of one monolithic interface? + * + */ +class ITrackerPlugin : protected Contexted +{ +public: + + // For the moment these are mutually exclusive capabilities; Tracker will prefer 'workspace' if the plugin supports it. + enum class ECapabilities + { + Tracks = 1LL, + Workspace = 2LL + }; + + // Constructor + explicit ITrackerPlugin(const Kernel::IKernelContext& ctx) : Contexted(ctx) { } + + // @param track The input track. It can be modified by the process() call. + // @return True on success, False otherwise + // @note If the plugin changes the track, it must set the tracks 'dirty bit' as true. + virtual bool process(StreamBundle& /*track*/) { return false; } + + // @param wp The input workspace. It can be modified by the process() call. + // @param exec A reference to a parallel executor that the plugin can use (if it prefers) + // @return True on success, False otherwise + // @note If the plugin changes any track in the workspace, it must set the tracks 'dirty bit' as true. + // @note Passing the parallel executor as a parameter is not too neat, ideally it'd be part of IKernelContext but that'd require importing the exec to SDK. + virtual bool process(Workspace& /*wp*/, ParallelExecutor& /*exec*/) { return false; } + + // @param Capability to ask for + // @return True if the plugin supports this + // @note By default, the plugins are expected to have the track processing capability. If not, override this default. + virtual bool hasCapability(const ECapabilities capability) { return (capability == ECapabilities::Tracks); } + + // @return the name of the plugin + virtual std::string getName() { return std::string("Unnamed"); } +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/ParallelExecutor.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/ParallelExecutor.h new file mode 100755 index 0000000..75bbf59 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/ParallelExecutor.h @@ -0,0 +1,102 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include +#include +#include + +/* + * Class allowing creating a set of worker threads that then pull jobs from a job list. + * + * Before this class can be used safely, various components in the OV SDK should be made + * thread safe. These are at least + * - LogManager + * - CKernelObjectFactory + * - AlgorithmManager? + * - ConfigurationManager? (if any plugin adds tokens) + * + */ +namespace OpenViBE { +namespace Tracker { +typedef std::function jobCall; + +// Fwd declare +class CWorkerThread; + +class ParallelExecutor +{ +public: + ParallelExecutor() { } + bool initialize(const uint32_t nThreads); + bool uninitialize(); + uint32_t getNumThreads() const { return m_threads.size(); } + + // Clients call these + bool pushJob(const jobCall& someJob); // add job, pass to threads + bool pushJobList(const std::deque& vJobList); // add jobs + bool clearPendingJobs(); // Delete all jobs thath haven't been launched yet + bool waitForAll(); // wait until all pushed jobs are done + size_t getJobCount() const; // Number of remaining jobs + bool isIdle() const; // Nothing running & no tasks in list? + + // Worker threads call these + bool getJob(jobCall& job); // The call will hang until there is a job available or the executor is told to quit + bool declareDone(); // Declare the previously obtained job as done + + bool launchTest(); + +private: + + mutable std::mutex m_jobMutex; + + std::deque m_jobList; + uint32_t m_nJobsRunning = 0; + + std::condition_variable m_haveWork; + std::condition_variable m_jobDone; + + bool m_quit = false; + + std::vector m_workerThreads; + std::vector m_threads; +}; + +// Provides the worker threads a limited access to the parallel executor +class ExecutorView +{ +public: + explicit ExecutorView(ParallelExecutor& exec) : m_exec(exec) { } + bool getJob(jobCall& job) const { return m_exec.getJob(job); } + bool declareDone() const { return m_exec.declareDone(); } + +private: + ParallelExecutor& m_exec; +}; + +class CWorkerThread +{ +public: + CWorkerThread() { } + + static void run(const ExecutorView ctx, const uint32_t threadNumber) + { + while (true) + { + jobCall job; + if (!ctx.getJob(job)) { return; } + + // @todo pass job failed to caller + job(threadNumber); + ctx.declareDone(); + } + } + + static void startWorkerThread(CWorkerThread* /*thread*/, const ExecutorView ctx, const uint32_t threadNumber) { run(ctx, threadNumber); } +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/ProcExternalProcessing.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/ProcExternalProcessing.h new file mode 100755 index 0000000..41b8031 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/ProcExternalProcessing.h @@ -0,0 +1,141 @@ +#pragma once + +#include "StreamBundle.h" + +#include +#include + +#include "Processor.h" +#include "ProcExternalProcessingHelper.h" // Push and Pull clients + +#include "Encoder.h" +#include "Decoder.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class ProcExternalProcessing + * \brief A processor implemented by passing data to/from External Processing Boxes inserted into Designer scenarios + * \author J. T. Lindgren + * + */ +class ProcExternalProcessing final : public Processor +{ +public: + + explicit ProcExternalProcessing(const Kernel::IKernelContext& ctx) : Processor(ctx) {} + ProcExternalProcessing(const Kernel::IKernelContext& ctx, const ProcExternalProcessing& other); + + bool initialize(const std::string& xmlFile) override; + bool uninitialize() override; + + // Set targets for push and pull + bool setNewSource(StreamBundle* source, bool sendHeader, bool sendEnd) override; + bool setNewTarget(StreamBundle* target) override; + + bool play(const bool playFast, const std::function& quitCB) override { return play(playFast, quitCB, nullptr); } + // @param nextTrackFun Callback to request more data (used for catenate mode) + bool play(const bool playFast, const std::function& quitCB, const std::function& nextTrackFun); + + // bool play(const bool playFast) override; + bool stop() override; + + bool setProcessorPorts(const uint32_t sendPort, const uint32_t recvPort) override + { + m_sendPort = sendPort; + m_recvPort = recvPort; + return true; + } + + bool getProcessorPorts(uint32_t& sendPort, uint32_t& recvPort) const override + { + sendPort = m_sendPort; + recvPort = m_recvPort; + return true; + } + + bool setProcessorFlags(const bool noGUI, const bool doSend, const bool doReceive) + { + m_noGUI = noGUI; + m_doSend = doSend; + m_doReceive = doReceive; + return true; + } + + bool getProcessorFlags(bool& noGUI, bool& doSend, bool& doReceive) const + { + noGUI = m_noGUI; + doSend = m_doSend; + doReceive = m_doReceive; + return true; + } + + bool canPull() const { return m_doReceive; } + bool canPush() const { return m_doSend; } + + CTime getCurrentTime() const override; + + bool isSynced() const + { + return (m_doSend ? (m_pushStartTime != BufferedClient::CLIENT_NOT_STARTED) : true) && + (m_doReceive ? (m_pullStartTime != BufferedClient::CLIENT_NOT_STARTED) : true); + } + + bool isRunning() const override { return m_isRunning; } + + // Serialize state to configuration manager + bool save() override; + bool load() override; + +protected: + //bool connectClient(Communication::MessagingClient& client, uint32_t port); + + // Send data to External Processing box + bool push(); + // Receive data from External Processing box + bool pop(); + + // n.b. for each external processing box, we need to have a separate thread since we don't know for + // sure in which order OpenViBE will schedule their execution. + PushClient* m_pushClient = nullptr; + std::thread* m_pushClientThread = nullptr; + CTime m_pushStartTime = BufferedClient::CLIENT_NOT_STARTED; + + PullClient* m_pullClient = nullptr; + std::thread* m_pullClientThread = nullptr; + CTime m_pullStartTime = BufferedClient::CLIENT_NOT_STARTED; + + std::thread* m_playerThread = nullptr; + + bool m_sentSomething = false; + bool m_isRunning = false; + + uint64_t m_chunksSent = 0; + CTime m_pushLastTime = CTime::min(); + CTime m_pullLastTime = CTime::min(); + + // if either port is zero, then the communication from the scenario is expected to flow to one direction only + uint32_t m_sendPort = 50011; + uint32_t m_recvPort = 50012; + + bool m_doSend = true; + bool m_doReceive = true; + + // Used in continuous playing mode to get the start offset for the next stream + CTime m_previousEnd = CTime::min(); + bool m_requestNewOffset = false; + + bool m_sendHeader = true; + bool m_sendEnd = true; + + bool m_noGUI = true; + + StreamBundle* m_src = nullptr; + StreamBundle* m_dst = nullptr; + + std::vector m_encoders; + std::vector m_decoders; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/ProcExternalProcessingHelper.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/ProcExternalProcessingHelper.h new file mode 100755 index 0000000..d8dce7d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/ProcExternalProcessingHelper.h @@ -0,0 +1,122 @@ +#pragma once + +#include + +#include + +#include + +#include +#include + +#include "EncodedChunk.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class BufferedClient + * \brief A messaging client base class thats associated with a buffer of chunks. + * \author J. T. Lindgren + * \details + * + * The class is threaded. The thread connects to a single instance of OpenViBE's + * External Processing Box that is assumed to be monitoring a specific port. + * + * The derived clients are one-directional: they only send or receive data. + * + */ +class BufferedClient : protected Communication::MessagingClient +{ +public: + + explicit BufferedClient(const uint32_t port) : m_port(port) { } + void requestQuit(); + bool hasQuit(); + void start(); + + CTime getStartTime() + { + // @todo might be a bit inefficient to have mutex here + std::lock_guard oLock(m_threadMutex); + return m_startTime; + } + + uint64_t getTime() override { return MessagingClient::getTime(); } + + static const CTime CLIENT_NOT_STARTED; + +protected: + + bool connectClient(); + + // Derived classes implement this to do either push or pull + virtual bool step() = 0; + + uint32_t m_port = 0; + + // The mutex is used with the variables declared after it + std::mutex m_threadMutex; + std::condition_variable m_bufferCondition; + + std::deque m_buffer; + bool m_pleaseQuit = false; + bool m_hasQuit = false; + + // Time when the client has connected and synced, CTime(-1) if not yet + CTime m_startTime = CLIENT_NOT_STARTED; +}; + +/** + * \class PushClient + * \brief A client dedicated to pushing data towards an External Processing Box + * \author J. T. Lindgren + * + */ +class PushClient final : public BufferedClient +{ +public: + explicit PushClient(const uint32_t port) : BufferedClient(port) { } + + // Append a chunk to be sent out + bool pushBuffer(const EncodedChunk& encodedChunk); + + // Force all pushed chunks to be sent + void requestFlush(); + +protected: + + // implements push + bool step() override; + + // Under the base class' mutex + bool m_pleaseFlush = false; +}; + + +/** + * \class PullClient + * \brief A class dedicated to pulling data from an External Processing Box + * \author J. T. Lindgren + * + */ +class PullClient final : public BufferedClient +{ +public: + explicit PullClient(const uint32_t port) : BufferedClient(port) { } + + // Get the oldest chunk received. Returns false if none. + bool pullBuffer(EncodedChunk& chunk); + + bool isEndReceived() override { return BufferedClient::isEndReceived(); } + +protected: + + // implements pull + bool step() override; + + // Keep polling the sender for chunks as long as there is one available + bool popMessagesToBuffer(); +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Processor.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Processor.h new file mode 100755 index 0000000..daf05b1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Processor.h @@ -0,0 +1,76 @@ +#pragma once + +#include +#include + +#include "StreamBundle.h" +#include "Contexted.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class Processor + * \author J. T. Lindgren + * \brief A signal processing component that can receive/return data + * \details + * + * Processor in OpenViBE tracker is a kind of bridge to Designer that is + * used to send data in, do some processing with a scenario, and get the processed + * data back. A processor can also be one-directional. + * + * + */ +class Processor : protected Contexted +{ +public: + + explicit Processor(const Kernel::IKernelContext& ctx) : Contexted(ctx) {} + + // Set the processor XML file + virtual bool initialize(const std::string& xmlFile) = 0; + virtual bool uninitialize() = 0; + + // Get the processor XML filename + virtual const std::string& getFilename() const { return m_xmlFilename; } + + // Connect the processor to a specific StreamBundle to read from + virtual bool setNewSource(StreamBundle* source, bool sendHeader, bool sendEnd) = 0; + // Connect the processor to a specific StreamBundle to write to + virtual bool setNewTarget(StreamBundle* target) = 0; + + // Launch Designer to configure the processor + virtual bool configure(const char* filename); // If filename is NULL, use internal + + // Launch the Player + virtual bool play(const bool playFast, const std::function& quitCallback) = 0; + // Stop the Player + virtual bool stop() = 0; + virtual bool isRunning() const = 0; + + virtual CTime getCurrentTime() const = 0; + + // Communication port tcp/ip port IDs + virtual bool setProcessorPorts(const uint32_t sendPort, const uint32_t recvPort) = 0; + virtual bool getProcessorPorts(uint32_t& sendPort, uint32_t& recvPort) const = 0; + + // Command line arguments passed to the processor (Designer) launch call + bool setArguments(const char* args) + { + m_arguments = std::string(args); + return true; + } + + const char* getArguments() const { return m_arguments.c_str(); } + + // Serialize state to configuration manager + virtual bool save() = 0; + virtual bool load() = 0; + +protected: + std::string m_xmlFilename; + std::string m_arguments; + bool m_playFast = false; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Selection.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Selection.h new file mode 100755 index 0000000..b9843b6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Selection.h @@ -0,0 +1,51 @@ +// +// OpenViBE Tracker +// +#pragma once + +#include +#include + +#include "StreamBundle.h" +#include "Contexted.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class Selection + * \brief Some convenience functions for Track/Stream selections + * \author J. T. Lindgren + * + */ +class Selection final : protected Contexted +{ +public: + Selection(const Kernel::IKernelContext& ctx, const std::vector& tracks) : Contexted(ctx), m_tracks(tracks) { } + + // Set the selection status of all streams on all tracks to the given state + bool reset(bool state) const; + + // Is any stream selected on the track? + bool isTrackSelected(size_t track) const; + // Nothing selectable? + bool isEmpty() const; + // Is something currently selected? + bool isSomethingSelected() const; + // Are selections of different tracks compatible? + bool isSelectionConsistent() const; + // How many tracks have at least one stream selected? + size_t countSelectedTracks() const; + // How many streams does a current track have selected? + size_t countSelectedStreams(size_t trackIndex) const; + + // Serialize state to ConfigurationManager + bool save(const char* prefix) const; + bool load(const char* prefix) const; + +protected: + + const std::vector& m_tracks; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StimulationStreamFilter.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StimulationStreamFilter.h new file mode 100755 index 0000000..2991fef --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StimulationStreamFilter.h @@ -0,0 +1,20 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// +#pragma once + +#include +#include "StreamBase.h" + +namespace OpenViBE { +namespace Tracker { +// Returns a copy of a stream with stimulations suggesting end of stream dropped +std::shared_ptr filterStimulationStreamEndPoints(const std::shared_ptr& src, const Kernel::IKernelContext& ctx); + +// Returns a copy of a stream with given stimulations dropped +std::shared_ptr filterStimulationStream(const std::shared_ptr& src, const Kernel::IKernelContext& ctx, + const std::vector& stimsToFilter); +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Stream.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Stream.h new file mode 100755 index 0000000..1a46016 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Stream.h @@ -0,0 +1,215 @@ +#pragma once + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include "StreamBase.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class Stream + * \brief A container class representing a stream of OpenViBE + * \author J. T. Lindgren + * \details + * + * Stream is basically a specific kind of time-ordered container of timestamped, typed elements. + * + * Unlike OpenViBE streams in general, the Stream content in Tracker is stored in memory unencoded, + * and hence if its content is written to an .ov file, passed to a box, or Designer, it must be encoded first. + * + * Stream must have a 'header' representing the stream parameters, a sequence of 'buffers' + * containing the data, and an 'end' indicating the end of the stream. + * + * Time -----------------------> + * 0 + * "front" [header][chk1][chk2]....[end] "tail" + * + * The stream additionally has a 'position' that always points to one of the above elements + * and starts from front. Stepping the stream moves the stream position +1 chunk forward towards the tail. + * + * The stream API can be used in a way that chunks can be pushed + * to the tail while the position counter is advancing from the head towards + * the tail. Although this would allow interleaving pushes + * and reads, currently the Tracker works in a way that when a track is loaded + * or recorded, only push() operations are done until the finish. On the + * other hand, when the track is sent out, only peek() and step() are used to + * retrieve the chunks. + * + * Currently Tracker Plugins are allowed to access the tracks in a random access fashion, + * as well as the GUI. + * + * + */ +template +class Stream final : public StreamBase +{ +public: + explicit Stream(const Kernel::IKernelContext& ctx) : StreamBase(ctx) { m_end.m_StartTime = m_end.m_EndTime = CTime::max(); } + + ~Stream() override + { + /* if(m_Header) { delete m_Header; } */ + clear(); + } + + CIdentifier getTypeIdentifier() const override { return T::getTypeIdentifier(); } + + // Note: There is no corresponding setters, use the non-const versions to modify the header + const typename T::Header& getHeader() const { return m_header; } + const typename T::End& getEnd() const { return m_end; } + typename T::Header& getHeader() { return m_header; } + typename T::End& getEnd() { return m_end; } + + bool push(typename T::Buffer* chunk) + { + m_chunks.push_back(chunk); + return true; + } + + // Return the timestamps of the current chunk + bool peek(CTime& startTime, CTime& endTime) const override { return peek(m_position, startTime, endTime); } + + // Return timestamps of a specific chunk + bool peek(size_t index, CTime& startTime, CTime& endTime) const override + { + if (index == size_t(-1)) { startTime = endTime = 0; } + else if (index < m_chunks.size()) + { + startTime = m_chunks[index]->m_StartTime; + endTime = m_chunks[index]->m_EndTime; + } + else if (index == m_chunks.size() && m_chunks.size() > 0) + { + startTime = m_chunks[index - 1]->m_EndTime; + endTime = m_chunks[index - 1]->m_EndTime; + } + else { return false; } + return true; + } + + size_t getChunkCount() const override { return m_chunks.size(); } + + bool getChunk(size_t idx, typename T::Buffer** ptr) const + { + if (idx < m_chunks.size()) + { + *ptr = m_chunks[idx]; + return true; + } + *ptr = nullptr; + return false; + } + + const typename T::Buffer* getChunk(size_t idx) const + { + if (idx < m_chunks.size()) { return m_chunks[idx]; } + return nullptr; + } + + bool clear() override + { + std::for_each(m_chunks.begin(), m_chunks.end(), [](typename T::Buffer* ptr) { delete ptr; }); + m_chunks.clear(); + m_position = size_t(-1); + return true; + } + + CTime getDuration() const override + { + const size_t chunkCount = getChunkCount(); + if (chunkCount == 0) { return CTime::min(); } + return m_chunks[chunkCount - 1]->m_EndTime; + } + + CTime getStartTime() const override + { + const size_t chunkCount = getChunkCount(); + if (chunkCount == 0) { return CTime::min(); } + return m_chunks[0]->m_StartTime; + } + + // @fixme efficiency + bool getOverlapping() const override + { + for (size_t i = 1; i < m_chunks.size(); ++i) { if (m_chunks[i]->m_StartTime < m_chunks[i - 1]->m_EndTime) { return true; } } + return false; + } + + // @fixme efficiency + bool getNoncontinuous() const override + { + for (size_t i = 1; i < m_chunks.size(); ++i) { if (m_chunks[i]->m_StartTime > m_chunks[i - 1]->m_EndTime) { return true; } } + return false; + } + + // @fixme efficiency + uint64_t countChunks(CTime startTime, CTime endTime) const + { + // Count the chunks @fixme not very efficient + uint64_t chunkCount = 0; + for (size_t i = 0; i < m_chunks.size(); ++i) + { + if (m_chunks[i]->m_StartTime >= startTime) + { + if (m_chunks[i]->m_EndTime <= endTime) { chunkCount++; } + else { break; } + } + } + return chunkCount; + } + + // Iterators and operators + typename std::vector::iterator begin() { return m_chunks.begin(); } + typename std::vector::iterator end() { return m_chunks.end(); } + + typename T::Buffer& operator[](int idx) { return m_chunks[idx]; } + + // @fixme + // bool setHeader(TypeError::Header *) { return true; }; + // bool setBuffer(TypeError::Buffer *) { return true; }; + + // @fixme doesn't work yet + bool copy(const StreamBase& other) override + { + if (T::getTypeIdentifier() != other.getTypeIdentifier()) { return false; } + + const Stream& otherStream = reinterpret_cast&>(other); + + m_chunks.resize(otherStream.getChunkCount(), nullptr); + + // @fixme this can be implemented when CMatrix has a working copy/assignment operators + /* + m_Header = otherStream.getHeader(); + + for (size_t c = 0; c < otherStream.getChunkCount(); ++c) + { + m_Chunks[c] = new T::Buffer(otherStream.getChunk(c)); + } + + m_End = otherStream.getEnd(); + */ + + log() << Kernel::LogLevel_Error << "Unimplemented method\n"; + + return false; + } + +protected: + + typename T::Header m_header; // Header of a stream + std::vector m_chunks; // Buffers + typename T::End m_end; // End of a stream +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamBase.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamBase.h new file mode 100755 index 0000000..e2f3c83 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamBase.h @@ -0,0 +1,95 @@ +#pragma once + +#include +#include +#include // std::shared_ptr + +#include +#include + +#include "Contexted.h" + +// #include "ovkTAttributable.h" +// class StreamBase : public OpenViBE::Kernel::TAttributable { + +namespace OpenViBE { +namespace Tracker { + + +/** + * \class StreamBase + * \brief Abstract, non-typed base class for Streams. + * \details For details, please see the type-specific derived class Stream. + * \author J. T. Lindgren + * + */ +class StreamBase : protected Contexted +{ +public: + explicit StreamBase(const Kernel::IKernelContext& ctx) : Contexted(ctx) { } + ~StreamBase() override { } + + virtual CIdentifier getTypeIdentifier() const = 0; + + virtual bool peek(CTime& startTime, CTime& endTime) const = 0; + virtual bool peek(size_t index, CTime& startTime, CTime& endTime) const = 0; + + virtual bool step() + { + if (m_position <= getChunkCount() || m_position == size_t(-1)) + { + m_position++; + return true; + } + return false; + } + + virtual bool reset() + { + m_position = size_t(-1); + return true; + } + + virtual bool clear() = 0; + + virtual size_t getChunkCount() const = 0; + + virtual CTime getDuration() const = 0; + virtual CTime getStartTime() const = 0; + + // Current play position + size_t getPosition() const { return m_position; } + + bool setPosition(const size_t position) + { + m_position = position; + return true; + } + + // Is the stream currently selected? (nb. this is not in the .ov file) + bool getSelected() const { return m_selected; } + + bool setSelected(const bool newState) + { + m_selected = newState; + return true; + } + + // Stream characteristics + virtual bool getOverlapping() const = 0; + virtual bool getNoncontinuous() const = 0; + + virtual bool copy(const StreamBase& /*other*/) { return false; } + +protected: + + size_t m_position = size_t(-1); // -1 == beginning of the stream, header + + // Is the stream currently selected? + bool m_selected = true; +}; + +typedef std::shared_ptr StreamPtr; +typedef std::shared_ptr StreamPtrConst; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamBundle.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamBundle.h new file mode 100755 index 0000000..90bbb78 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamBundle.h @@ -0,0 +1,96 @@ +// +// OpenViBE Tracker +// + +#pragma once + +#include +#include + +#include // shared_ptr + +#include + +#include "StreamBase.h" + +#include "Contexted.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class StreamBundle + * \brief StreamBundle is a container of one or more typed streams. It corresponds to a 'track' in Tracker and can represent an .ov file. + * \details + * + * StreamBundle can be queried for streams in time order: getNextStream() call can be used to find out + * the stream which has the earliest chunk position pointer (in time). Stepping the stream may make some + * other stream to be returned on the next get call. + * + * \author J. T. Lindgren + * + */ +class StreamBundle final : protected Contexted +{ +public: + + explicit StreamBundle(const Kernel::IKernelContext& ctx) : Contexted(ctx) {} + + // Copy everything, allocate new memory for content + bool deepCopy(const StreamBundle& other); + // Copy selected subset of streams from "other". + // Other will retain ownership of any internal pointers. + // Since the copy gets write access to content of other, "other" is not const. + bool copyFrom(StreamBundle& other); + + bool initialize(); + bool uninitialize(); + + // Rewind all streams + bool rewind(); + + // Returns the stream which has a position with the earliest beginning timestamp + StreamPtr getNextStream(size_t& index); + bool getNextStreamIndex(size_t& index) const; + + size_t getNumStreams() const { return m_streams.size(); } + StreamPtrConst getStream(const size_t idx) const { return (idx < m_streams.size()) ? m_streams[idx] : nullptr; } + StreamPtr getStream(const size_t idx) { return (idx < m_streams.size()) ? m_streams[idx] : nullptr; } + std::vector& getAllStreams() { return m_streams; } + + // A factory method that creates a stream of a specific type into the slot index + bool createStream(size_t index, const CIdentifier& typeID); + bool deleteStream(size_t index); + bool setStream(size_t index, const std::shared_ptr& ptr); + bool swapStreams(size_t idx1, size_t idx2); + bool moveStream(size_t srcIdx, size_t dstIdx); + + // Returns the duration of the longest stream in the bundle + CTime getMaxDuration() const; + + // Have all streams ended in the bundle? + bool isFinished() const + { + size_t dummy; + return !getNextStreamIndex(dummy); + } + + // The name of the .ov file this bundle corresponds to + const std::string& getSource() const { return m_source; } + void setSource(const std::string& src) { m_source = src; } + bool getDirtyBit() const { return m_dirty; } + void setDirtyBit(const bool newState) { m_dirty = newState; } + +protected: + + // As StreamBundles can consist of streams from diverse origins where some of them would + // like to pass the ownership and some to keep it, instead of writing messy ownership tracking code, + // we use shared pointers for streams. + std::vector m_streams; + + std::string m_source; // Identifies the .ov file of the bundle on disk + + bool m_dirty = true; // True if the stream has not been saved to disk after last modification +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamBundleImportExport.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamBundleImportExport.h new file mode 100755 index 0000000..45e0462 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamBundleImportExport.h @@ -0,0 +1,20 @@ +// +// OpenViBE Tracker +// +// +// n.b. having this as a separate file so EBML/Demuxer dependencies do not get pulled into StreamBundle +// + +#pragma once + +#include + +#include "StreamBundle.h" + +namespace OpenViBE { +namespace Tracker { +// These functions import/export stream bundles from .ov files +StreamBundle* readStreamBundleFromFile(const Kernel::IKernelContext& ctx, const char* filename, bool memorySaveMode); +bool saveStreamBundleToFile(const Kernel::IKernelContext& ctx, StreamBundle* track, const char* filename); +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamFactory.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamFactory.h new file mode 100755 index 0000000..cb78396 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamFactory.h @@ -0,0 +1,54 @@ +// +// OpenViBE Tracker +// + + +#pragma once + +#include "CodecsAll.h" + +#include "Stream.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class StreamFactory + * \brief A factory method returning an empty Stream object of the requested type + * \author J. T. Lindgren + * + */ +class StreamFactory +{ +public: + // Factory + static StreamPtr getStream(const Kernel::IKernelContext& ctx, const CIdentifier& typeID) + { + std::shared_ptr stream; + // @todo others + if (typeID == OVTK_TypeId_StreamedMatrix) { stream = std::make_shared>(ctx); } + else if (typeID == OVTK_TypeId_Signal) { stream = std::make_shared>(ctx); } + else if (typeID == OVTK_TypeId_Stimulations) { stream = std::make_shared>(ctx); } + else if (typeID == OVTK_TypeId_ExperimentInfo) { stream = std::make_shared>(ctx); } + else if (typeID == OV_TypeId_ChannelLocalisation + ) { stream = std::make_shared>(ctx); } // bug in toolkit atm with OVTK_ define + else if (typeID == OV_TypeId_ChannelUnits) { stream = std::make_shared>(ctx); } // bug in toolkit atm with OVTK_ define + else if (typeID == OVTK_TypeId_Spectrum) { stream = std::make_shared>(ctx); } + else if (typeID == OVTK_TypeId_FeatureVector) { stream = std::make_shared>(ctx); } + else + { + ctx.getLogManager() << Kernel::LogLevel_Info << "Warning: Unknown stream type " + << ctx.getTypeManager().getTypeName(typeID) << " " << typeID.str() << "\n"; + stream = std::make_shared>(ctx); + } + + return stream; + } + + // Prevent constructing + StreamFactory() = delete; + StreamFactory(const StreamFactory&) = delete; + StreamFactory(StreamFactory&&) = delete; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererBase.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererBase.h new file mode 100755 index 0000000..461eec9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererBase.h @@ -0,0 +1,248 @@ +// +// OpenViBE Tracker +// + + +#pragma once + +#include +#include +#include +#include // shared_ptr + +#include +#include +#include + +#include + +#include "Stream.h" +#include "Contexted.h" + +typedef struct _GtkWidget GtkWidget; + +namespace OpenViBE { +namespace Tracker { + +/** + * \class StreamRendererBase + * \brief Abstract, non-typed class for visually rendering the Streams in the Tracker GUI + * \details See the derived, typed versions of the class + * + * \author J. T. Lindgren + * + */ +class StreamRendererBase : protected Contexted +{ +public: + explicit StreamRendererBase(const Kernel::IKernelContext& ctx) : Contexted(ctx) { } + ~StreamRendererBase() override { } + + // Calls for API users + + // Initialize the renderer + virtual bool initialize(); + virtual bool uninitialize(); + + // Show the windows + virtual bool realize(); + + virtual bool setTitle(const char* title); + + // Draw chunks in range [startTime,endTime] + virtual bool spool(const CTime startTime, const CTime endTime) = 0; + + virtual CString renderAsText(const size_t indent = 0) const; + + virtual bool showChunkList() + { + log() << Kernel::LogLevel_Warning << "Chunk listing not implemented for stream type (or unavailable in current Tracker mode)\n"; + return true; + } + + virtual CTime getChunkDuration() const { return m_chunkDuration; } + + virtual bool setRulerVisibility(bool isVisible); + + // Save/load settings as configuration manager tokens + // The tokens loaded/saved will have the given prefix + virtual bool restoreSettings(const std::string& prefix); + virtual bool storeSettings(const std::string& prefix); + + GtkWidget* getWidget() const { return m_main; } + + // GtkGlWidget calls the following + + virtual bool redraw(bool bImmediate = false); + virtual bool reshape(uint32_t width, uint32_t height); + virtual bool draw(); + virtual bool preDraw(); + virtual bool postDraw(); + virtual void drawLeft(); + virtual void drawRight(); + virtual void drawBottom(); + virtual bool mouseButton(int x, int y, int button, int status); + virtual bool mouseMotion(int x, int y); + + virtual bool keyboard(uint32_t /*width*/, uint32_t /*height*/, uint32_t /*value*/, bool /*unused*/) + { + std::cout << "keyb requested\n"; + return true; + } + + +protected: + + // Resets the renderer aperture (number of samples/chunks) + virtual bool reset(CTime startTime, CTime endTime) = 0; + virtual bool updateRulerVisibility(); + // After pushing samples, request rebuild & redraw + virtual bool finalize(); + + CTime m_startTime = CTime::min(); + CTime m_endTime = CTime::min(); + CTime m_chunkDuration = CTime::min(); + + uint32_t m_width = 640; + uint32_t m_height = 480; + uint32_t m_textureID = 0; + + bool m_rotate = false; + bool m_isScaleVisible = true; + + typedef struct + { + float r = 0, g = 0, b = 0; + } color_t; + + color_t m_color; + + GtkWidget* m_viewport = nullptr; + GtkWidget* m_main = nullptr; + GtkWidget* m_top = nullptr; + GtkWidget* m_left = nullptr; + GtkWidget* m_right = nullptr; + GtkWidget* m_bottom = nullptr; + GtkWidget* m_cornerLeft = nullptr; + GtkWidget* m_cornerRight = nullptr; + + std::string m_title; + + std::vector m_renderers; + + AdvancedVisualization::CRendererContext* m_rendererCtx = nullptr; + AdvancedVisualization::CRendererContext* m_subRendererCtx = nullptr; + + AdvancedVisualization::TGtkGLWidget m_gtkGLWidget; + + AdvancedVisualization::IRuler* m_ruler = nullptr; + + // mouse related + std::map m_buttons; + int m_mouseX = 0; + int m_mouseY = 0; + bool m_mouseInitialized = false; +}; + +/** + * \class spoolImpl + * \brief Push chunks in a specified interval to a renderer + * \details + * + * A generic template that is used internally by the classes derived from StreamRendererBase + * to implement spool(t1,t2) : pushing a [t1,t2] interval of chunks to the renderer. + * + * \author J. T. Lindgren + * + */ +template +bool spoolImpl(std::shared_ptr> stream, TRenderer& renderer, CTime startTime, CTime endTime) +{ + renderer.reset(startTime, endTime); + + typename T::Buffer* buf; + + // Push the visible chunks to renderer + uint64_t chunksSent = 0; + for (size_t i = 0; i < stream->getChunkCount(); ++i) + { + if (stream->getChunk(i, &buf) && buf->m_StartTime >= startTime && buf->m_EndTime <= endTime) + { + renderer.push(*buf); + chunksSent++; + } + } + + renderer.finalize(); + + return true; +} + +// Helper function for showMatrixList(), adds a column to a tree view, @fixme move somewhere else +void add_column(GtkTreeView* treeView, const char* name, uint32_t id, uint32_t minWidth); + +/** + * \class showMatrixList + * \brief Generic template that can be used to draw lists of any stream that derives from the matrix type. + * @fixme might refactor somewhere else + * \author J. T. Lindgren + * + */ +template +bool showMatrixList(std::shared_ptr> stream, GtkWidget** listWindow, const char* title) +{ + if (*listWindow) + { + gtk_window_present(GTK_WINDOW(*listWindow)); + return true; + } + + GtkBuilder* builder = gtk_builder_new(); + const CString filename = Directories::getDataDir() + "/applications/tracker/tracker.ui"; + if (!gtk_builder_add_from_file(builder, filename, nullptr)) + { + std::cout << "Problem loading [" << filename << "]\n"; + return false; + } + + *listWindow = GTK_WIDGET(gtk_builder_get_object(builder, "tracker-stimulation_list")); + GtkTreeView* treeView = GTK_TREE_VIEW(gtk_builder_get_object(builder, "tracker-stimulation_list-treeview")); + // GtkListStore* listStore = GTK_LIST_STORE(gtk_builder_get_object(pBuilder, "liststore_select")); + GtkTreeStore* treeStore = gtk_tree_store_new(4, G_TYPE_UINT, G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_STRING); + + gtk_window_set_title(GTK_WINDOW(*listWindow), title); + + add_column(treeView, "Chunk#", 0, 10); + add_column(treeView, "ChunkStart (s)", 1, 5); + add_column(treeView, "ChunkEnd (s)", 2, 5); + add_column(treeView, "Chunk dims", 3, 10); + + gtk_tree_view_set_model(treeView, GTK_TREE_MODEL(treeStore)); + + GtkTreeIter it; + gtk_tree_store_clear(treeStore); + + // ::gtk_tree_view_set_model(m_pChannelTreeView, nullptr); + for (size_t i = 0; i < stream->getChunkCount(); ++i) + { + const typename T::Buffer* ptr = stream->getChunk(i); + if (!ptr) { break; } + + std::stringstream ss; + ss << ptr->m_buffer.getDimensionCount() << " : "; + for (uint32_t j = 0; j < ptr->m_buffer.getDimensionCount(); ++j) { ss << (j > 0 ? " x " : "") << ptr->m_buffer.getDimensionSize(j); } + + gtk_tree_store_append(treeStore, &it, nullptr); + ::gtk_tree_store_set(treeStore, &it, 0, i, 1, ptr->m_StartTime.toSeconds(), 2, ptr->m_EndTime.toSeconds(), 3, ss.str().c_str(), -1); + } + + // Hide instead of destroy on closing the window + g_signal_connect(*listWindow, "delete_event", G_CALLBACK(gtk_widget_hide_on_delete), nullptr); + gtk_widget_show_all(GTK_WIDGET(*listWindow)); + g_object_unref(builder); + + return true; +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererChannelLocalization.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererChannelLocalization.h new file mode 100755 index 0000000..677f0d0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererChannelLocalization.h @@ -0,0 +1,39 @@ +// +// OpenViBE Tracker +// + + +#pragma once + +#include "StreamRendererLabel.h" +#include "TypeChannelLocalization.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class StreamRendererChannelLocalization + * \brief Renderer for Channel Localization streams + * \author J. T. Lindgren + * + * @ fixme this class inherits a lot of junk from the root class which is not initialized properly and + * hence cannot be used. but if just the interface below is used, its alright. Can't make base class + * private as we store the renderer as a pointer to the base. + * + */ +class StreamRendererChannelLocalization final : public StreamRendererLabel +{ +public: + StreamRendererChannelLocalization(const Kernel::IKernelContext& ctx, const std::shared_ptr>& stream) + : StreamRendererLabel(ctx), m_Stream(stream) { } + + CString renderAsText(const size_t indent) const override; + + bool showChunkList() override; + +protected: + + std::shared_ptr> m_Stream; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererChannelUnits.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererChannelUnits.h new file mode 100755 index 0000000..7dfd42a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererChannelUnits.h @@ -0,0 +1,37 @@ +// +// OpenViBE Tracker +// + +#pragma once + +#include "StreamRendererLabel.h" +#include "TypeChannelUnits.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class StreamRendererChannelUnits + * \brief Renderer for Channel Units streams + * \author J. T. Lindgren + * + * @ fixme this class inherits a lot of junk from the root class which is not initialized properly and + * hence cannot be used. but if just the interface below is used, its alright. Can't make base class + * private as we store the renderer as a pointer to the base. + * + */ +class StreamRendererChannelUnits final : public StreamRendererLabel +{ +public: + StreamRendererChannelUnits(const Kernel::IKernelContext& ctx, const std::shared_ptr>& stream) + : StreamRendererLabel(ctx), m_stream(stream) { } + + CString renderAsText(const size_t indent) const override; + bool showChunkList() override; + +protected: + + std::shared_ptr> m_stream; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererExperimentInfo.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererExperimentInfo.h new file mode 100644 index 0000000..44233d3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererExperimentInfo.h @@ -0,0 +1,38 @@ +// +// OpenViBE Tracker +// + +#pragma once + +#include "StreamRendererLabel.h" +#include "TypeExperimentInfo.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class StreamRendererExperimentInfo + * \brief Renderer for Experiment Information streams + * \author J. T. Lindgren + * + * @ fixme this class inherits a lot of junk from the root class which is not initialized properly and + * hence cannot be used. but if just the interface below is used, its alright. Can't make base class + * private as we store the renderer as a pointer to the base. + * + */ +class StreamRendererExperimentInfo final : public StreamRendererLabel +{ +public: + StreamRendererExperimentInfo(const Kernel::IKernelContext& ctx, const std::shared_ptr>& stream) + : StreamRendererLabel(ctx), m_stream(stream) { } + + CString renderAsText(const size_t indent) const override; + + bool showChunkList() override; + +protected: + + std::shared_ptr> m_stream; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererFactory.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererFactory.h new file mode 100644 index 0000000..f07198d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererFactory.h @@ -0,0 +1,88 @@ +// +// OpenViBE Tracker +// + +#pragma once + +#include +#include + +#include "StreamRendererMatrix.h" +#include "StreamRendererSignal.h" +#include "StreamRendererStimulation.h" +#include "StreamRendererSpectrum.h" +#include "StreamRendererExperimentInfo.h" +#include "StreamRendererLabel.h" +#include "StreamRendererChannelUnits.h" +#include "StreamRendererChannelLocalization.h" +#include "StreamRendererNothing.h" + +#include "Stream.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class StreamRendererFactory + * \brief Factory method for getting Stream Renderers of different types + * \author J. T. Lindgren + * + */ +class StreamRendererFactory +{ +public: + + // Factory special case + static StreamRendererBase* getDummyRenderer(const Kernel::IKernelContext& ctx) { return new StreamRendererNothing(ctx); } + + // Generic factory + static StreamRendererBase* getRenderer(const Kernel::IKernelContext& ctx, const StreamPtrConst& stream) + { + if (!stream) { ctx.getLogManager() << Kernel::LogLevel_Warning << "Nullptr stream, using label renderer\n"; } + + const CIdentifier typeID = (stream ? stream->getTypeIdentifier() : CIdentifier::undefined()); + + StreamRendererBase* renderer; + + if (typeID == OV_TypeId_Signal) { renderer = new StreamRendererSignal(ctx, std::static_pointer_cast>(stream)); } + else if (typeID == OV_TypeId_Spectrum) { renderer = new StreamRendererSpectrum(ctx, std::static_pointer_cast>(stream)); } + else if (typeID == OV_TypeId_Stimulations) + { + // @todo should be pushed to all other renderers + renderer = new StreamRendererStimulation(ctx, std::static_pointer_cast>(stream)); + } + else if (typeID == OV_TypeId_StreamedMatrix) { renderer = new StreamRendererMatrix(ctx, std::static_pointer_cast>(stream)); } + else if (typeID == OV_TypeId_FeatureVector) + { + // Since featurevector is just a constrained matrix, we use the matrix renderer + renderer = new StreamRendererMatrix(ctx, std::static_pointer_cast>(stream)); + } + else if (typeID == OV_TypeId_ExperimentInfo) + { + // Since featurevector is just a constrained matrix, we use the matrix renderer + renderer = new StreamRendererExperimentInfo(ctx, std::static_pointer_cast>(stream)); + } + else if (typeID == OV_TypeId_ChannelUnits) + { + renderer = new StreamRendererChannelUnits(ctx, std::static_pointer_cast>(stream)); + } + else if (typeID == OV_TypeId_ChannelLocalisation) + { + renderer = new StreamRendererChannelLocalization(ctx, std::static_pointer_cast>(stream)); + } + else + { + ctx.getLogManager() << Kernel::LogLevel_Trace << "Using label renderer for stream of type " << ctx.getTypeManager().getTypeName(typeID) << "\n"; + renderer = new StreamRendererLabel(ctx); + } + + return renderer; + } + + // Prevent constructing + StreamRendererFactory() = delete; + StreamRendererFactory(const StreamRendererFactory&) = delete; + StreamRendererFactory(StreamRendererFactory&&) = delete; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererLabel.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererLabel.h new file mode 100755 index 0000000..c50fea6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererLabel.h @@ -0,0 +1,45 @@ +// +// OpenViBE Tracker +// + +#pragma once + +#include "StreamRendererBase.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class StreamRendererLabel + * \brief Renderer for any stream that is simply visualized as a labeled widget + * \author J. T. Lindgren + * + * @ fixme this class inherits a lot of junk from the base class which is not initialized properly and + * hence cannot be used. but if just the interface below is used, its alright. Can't make base class + * private as we store the renderer as a pointer to the base. + * + */ +class StreamRendererLabel : public StreamRendererBase +{ +public: + explicit StreamRendererLabel(const Kernel::IKernelContext& ctx) : StreamRendererBase(ctx) { } + + bool initialize() override; + bool uninitialize() override { return true; } + bool setTitle(const char* title) override; + + bool spool(const CTime /*startTime*/, const CTime /*endTime*/) override { return true; } + + bool setRulerVisibility(bool /*isVisible*/) override { return true; } + + virtual bool showChunkList(const char* title); + +protected: + + bool reset(CTime /*startTime*/, CTime /*endTime*/) override { return true; } + bool realize() override { return true; } + + GtkWidget* m_label = nullptr; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererMatrix.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererMatrix.h new file mode 100755 index 0000000..b23cf4f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererMatrix.h @@ -0,0 +1,56 @@ +// +// OpenViBE Tracker +// + +#pragma once + +#include "StreamRendererBase.h" +#include "TypeMatrix.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class StreamRendererMatrix + * \brief Renderer for Matrix streams + * \author J. T. Lindgren + * + */ +class StreamRendererMatrix final : public StreamRendererBase +{ +public: + StreamRendererMatrix(const Kernel::IKernelContext& ctx, std::shared_ptr> stream) + : StreamRendererBase(ctx), m_stream(stream) { } + + bool initialize() override; + + bool spool(const CTime startTime, const CTime endTime) override { return spoolImpl(m_stream, *this, startTime, endTime); } + + CString renderAsText(const size_t indent) const override; + bool showChunkList() override; + +protected: + + friend bool spoolImpl(std::shared_ptr> stream, StreamRendererMatrix& renderer, CTime startTime, + CTime endTime); + + bool finalize() override; + bool reset(CTime startTime, CTime endTime) override; + bool push(const TypeMatrix::Buffer& chunk, bool zeroInput = false); + bool mouseButton(int x, int y, int button, int status) override; + + bool preDraw() override; + bool draw() override; + + size_t m_nRows = 0; + size_t m_nCols = 0; + + std::shared_ptr> m_stream; + GtkWidget* m_streamListWindow = nullptr; + + std::vector m_swap; + + StreamRendererMatrix() = delete; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererNothing.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererNothing.h new file mode 100755 index 0000000..fa6d810 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererNothing.h @@ -0,0 +1,48 @@ +// +// OpenViBE Tracker +// + +#pragma once + +#include "StreamRendererBase.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class StreamRendererNothing + * \brief Renders nothing, to avoid null ptrs when we don't want even a label rendered + * \author J. T. Lindgren + * + * @ fixme this class inherits a lot of junk from the base class which is not initialized properly and + * hence cannot be used. but if just the interface below is used, its alright. Can't make base class + * private as we store the renderer as a pointer to the base. + * + */ +class StreamRendererNothing final : public StreamRendererBase +{ +public: + explicit StreamRendererNothing(const Kernel::IKernelContext& ctx) : StreamRendererBase(ctx) { } + + bool initialize() override { return true; } + bool uninitialize() override { return true; } + bool setTitle(const char* /*title*/) override { return true; } + + bool spool(const CTime /*startTime*/, const CTime /*endTime*/) override { return true; } + + bool setRulerVisibility(bool /*isVisible*/) override { return true; } + + bool showChunkList() override { return true; } + + CString renderAsText(const size_t indent) const override + { + return (std::string(indent, ' ') + "Stream not selected and hence has no renderer in current mode\n").c_str(); + } + +protected: + + bool reset(CTime /*startTime*/, CTime /*endTime*/) override { return true; } + bool realize() override { return true; } +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererSignal.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererSignal.h new file mode 100755 index 0000000..d8f7e56 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererSignal.h @@ -0,0 +1,50 @@ +// +// OpenViBE Tracker +// + +#pragma once + +#include "StreamRendererBase.h" +#include "TypeSignal.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class StreamRendererSignal + * \brief Renderer for Signal streams + * \author J. T. Lindgren + * + */ +class StreamRendererSignal final : public StreamRendererBase +{ +public: + StreamRendererSignal(const Kernel::IKernelContext& ctx, std::shared_ptr> stream) + : StreamRendererBase(ctx), m_stream(stream) { } + + bool initialize() override; + + bool spool(const CTime startTime, const CTime endTime) override { return spoolImpl(m_stream, *this, startTime, endTime); } + + CString renderAsText(const size_t indent) const override; + bool showChunkList() override; + +protected: + + friend bool spoolImpl(std::shared_ptr> stream, StreamRendererSignal& renderer, + CTime startTime, CTime endTime); + + bool push(const TypeSignal::Buffer& chunk, bool zeroInput = false); + bool reset(CTime startTime, CTime endTime) override; + bool mouseButton(int x, int y, int button, int status) override; + + size_t m_nChannel = 0; + size_t m_samplesPerChunk = 0; + + std::shared_ptr> m_stream; + GtkWidget* m_streamListWindow = nullptr; + + StreamRendererSignal() = delete; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererSpectrum.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererSpectrum.h new file mode 100755 index 0000000..430cf87 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererSpectrum.h @@ -0,0 +1,59 @@ +// +// OpenViBE Tracker +// + +#pragma once + +#include "StreamRendererBase.h" +#include "TypeSpectrum.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class StreamRendererSpectrum + * \brief Renderer for Spectrum streams + * \author J. T. Lindgren + * + */ +class StreamRendererSpectrum final : public StreamRendererBase +{ +public: + StreamRendererSpectrum(const Kernel::IKernelContext& ctx, std::shared_ptr> stream) + : StreamRendererBase(ctx), m_stream(stream) { } + + bool initialize() override; + + bool spool(const CTime startTime, const CTime endTime) override + { + return spoolImpl(m_stream, *this, startTime, endTime); + } + + CString renderAsText(const size_t indent) const override; + bool showChunkList() override; + +protected: + + friend bool spoolImpl(std::shared_ptr> stream, StreamRendererSpectrum& renderer, + CTime startTime, CTime endTime); + + bool finalize() override; + bool reset(CTime startTime, CTime endTime) override; + bool push(const TypeSpectrum::Buffer& chunk, bool zeroInput = false); + bool mouseButton(int x, int y, int button, int status) override; + + bool preDraw() override; + bool draw() override; + + size_t m_nChannel = 0; + size_t m_spectrumElements = 0; + + std::vector m_swaps; + + std::shared_ptr> m_stream; + GtkWidget* m_streamListWindow = nullptr; + + StreamRendererSpectrum() = delete; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererStimulation.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererStimulation.h new file mode 100755 index 0000000..5a6bde6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/StreamRendererStimulation.h @@ -0,0 +1,57 @@ +// +// OpenViBE Tracker +// + +#pragma once + +#include "StreamRendererBase.h" +#include "TypeStimulation.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class StreamRendererStimulation + * \brief Renderer for Stimulation streams + * \author J. T. Lindgren + * + */ +class StreamRendererStimulation final : public StreamRendererBase +{ +public: + StreamRendererStimulation(const Kernel::IKernelContext& ctx, std::shared_ptr> stream) + : StreamRendererBase(ctx), m_stream(stream) { } + + bool initialize() override; + + bool spool(const CTime startTime, const CTime endTime) override + { + return spoolImpl(m_stream, *this, startTime, endTime); + } + + CString renderAsText(const size_t indent) const override; + bool showChunkList() override; + +protected: + + friend bool spoolImpl(std::shared_ptr> stream, + StreamRendererStimulation& renderer, CTime startTime, CTime endTime); + + bool push(const TypeStimulation::Buffer& chunk, bool zeroInput = false); + + bool reset(CTime startTime, CTime endTime) override; + + bool mouseButton(int x, int y, int button, int status) override; + + size_t m_nChannel = 0; + size_t m_samplesPerChunk = 0; + uint32_t m_sampling = 0; + + GtkWidget* m_stimulationListWindow = nullptr; + + std::shared_ptr> m_stream; + + StreamRendererStimulation() = delete; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Testclass.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Testclass.h new file mode 100755 index 0000000..5f18efc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Testclass.h @@ -0,0 +1,23 @@ +#pragma once + +#include + +namespace OpenViBE { +namespace Tracker { + +/** + * \class TestClass + * \brief Class to try out stuff in the Tracker + * \author J. T. Lindgren + * + */ +class TestClass +{ +public: + + explicit TestClass(Kernel::IKernelContext& ctx); + + Kernel::IKernelContext& m_Ctx; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TrackerPluginChannelCheck.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TrackerPluginChannelCheck.h new file mode 100755 index 0000000..af51fa6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TrackerPluginChannelCheck.h @@ -0,0 +1,23 @@ +#pragma once + +#include "ITrackerPlugin.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class TrackerPluginChannelCheck + * \brief Example of a Tracker plugin processing given Workspaces. It checks if all selected signal streams in all tracks have the same number of channels. + * \author J. T. Lindgren + * + */ +class TrackerPluginChannelCheck final : public ITrackerPlugin +{ +public: + explicit TrackerPluginChannelCheck(const Kernel::IKernelContext& ctx) : ITrackerPlugin(ctx) { } + bool process(Workspace& wp, ParallelExecutor& exec) override; + bool hasCapability(const ECapabilities capability) override { return (capability == ECapabilities::Workspace); } + std::string getName() override { return std::string("Example: Channel check"); } +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TrackerPluginCountStimulations.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TrackerPluginCountStimulations.h new file mode 100755 index 0000000..829e884 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TrackerPluginCountStimulations.h @@ -0,0 +1,22 @@ +#pragma once + +#include "ITrackerPlugin.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class TrackerPluginCountStimulations + * \brief Example of a Tracker plugin that processes given tracks. It counts the occurrences of different stimulations in each stimulation stream. + * \author J. T. Lindgren + * + */ +class TrackerPluginCountStimulations final : public ITrackerPlugin +{ +public: + explicit TrackerPluginCountStimulations(const Kernel::IKernelContext& ctx) : ITrackerPlugin(ctx) { } + bool process(StreamBundle& track) override; + std::string getName() override { return std::string("Example: Count stimulations"); } +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TrackerPlugins.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TrackerPlugins.h new file mode 100755 index 0000000..9b0f6b0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TrackerPlugins.h @@ -0,0 +1,42 @@ +#pragma once + +#include + +#include "ITrackerPlugin.h" +#include "Contexted.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class TrackerPlugins + * \author J. T. Lindgren + * \brief Container class for currently registered Tracker plugins. These plugins get direct access to StreamBundles (i.e. full track content). + * \details See ITrackerPlugin.h + * + New Tracker Plugins can be added to the Tracker by registering them in the constructor of this class + * + */ +class TrackerPlugins final : protected Contexted +{ +public: + + explicit TrackerPlugins(const Kernel::IKernelContext& ctx); + ~TrackerPlugins() override; + + // Get a list of all registered plugins + const std::vector& getTrackerPlugins() const { return m_trackerPlugins; } + + // Get a fresh plugin. The indexing is the same as in getTrackerPlugins() output + ITrackerPlugin* getPluginCopy(size_t index) const; + +protected: + + // List of currently registered plugins + std::vector m_trackerPlugins; + + // List of calls to create new copies of the plugins + std::vector> m_pluginCreateCalls; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeChannelLocalization.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeChannelLocalization.h new file mode 100755 index 0000000..8469eac --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeChannelLocalization.h @@ -0,0 +1,37 @@ +#pragma once + +#include + +#include "TypeMatrix.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class TypeChannelLocalization + * \brief Abstact class defining chunk types for Channel Localization streams + * \author J. T. Lindgren + * + */ +class TypeChannelLocalization +{ +public: + static CIdentifier getTypeIdentifier() { return OV_TypeId_ChannelLocalisation; } + + class Header : public TypeMatrix::Header + { + public: + bool m_Dynamic = false; + }; + + class Buffer : public TypeMatrix::Buffer { }; // Payload + + class End : public TypeMatrix::End { }; + + // Prevent constructing + TypeChannelLocalization() = delete; + TypeChannelLocalization(const TypeChannelLocalization&) = delete; + TypeChannelLocalization(TypeChannelLocalization&&) = delete; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeChannelUnits.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeChannelUnits.h new file mode 100755 index 0000000..0b5a706 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeChannelUnits.h @@ -0,0 +1,37 @@ +#pragma once + +#include + +#include "TypeMatrix.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class TypeChannelUnits + * \brief Abstact class defining chunk types for Channel Units streams + * \author J. T. Lindgren + * + */ +class TypeChannelUnits +{ +public: + static CIdentifier getTypeIdentifier() { return OV_TypeId_ChannelUnits; } + + class Header : public TypeMatrix::Header + { + public: + bool m_Dynamic = false; + }; + + class Buffer : public TypeMatrix::Buffer { }; // Payload + + class End : public TypeMatrix::End { }; + + // Prevent constructing + TypeChannelUnits() = delete; + TypeChannelUnits(const TypeChannelUnits&) = delete; + TypeChannelUnits(TypeChannelUnits&&) = delete; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeError.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeError.h new file mode 100755 index 0000000..54a8c1d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeError.h @@ -0,0 +1,36 @@ +#pragma once + +#include + +#include "Chunk.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class TypeError + * \brief Abstract class for error situations + * \details + * + * \author J. T. Lindgren + * + */ + +class TypeError +{ +public: + static CIdentifier getTypeIdentifier() { return CIdentifier::undefined(); } + + class Header : public Chunk { }; + + class Buffer : public Chunk { }; + + class End : public Chunk { }; + + // Prevent constructing + TypeError() = delete; + TypeError(const TypeError&) = delete; + TypeError(TypeError&&) = delete; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeExperimentInfo.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeExperimentInfo.h new file mode 100644 index 0000000..1b6b7db --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeExperimentInfo.h @@ -0,0 +1,51 @@ +#pragma once + +#include + +#include "Chunk.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class TypeExperimentInfo + * \brief Abstact class defining chunk types for Experiment Information streams + * \author J. T. Lindgren + * + */ +class TypeExperimentInfo +{ +public: + static CIdentifier getTypeIdentifier() { return OV_TypeId_ExperimentInfo; } + + class Header : public Chunk + { + public: + // Experiment + uint64_t m_ExperimentID = 0; + std::string m_ExperimentDate; + + // Subject + uint64_t m_SubjectID = 0; + std::string m_SubjectName; + uint64_t m_SubjectAge = 0; + uint64_t m_SubjectGender = 0; + + // Context + uint64_t m_LaboratoryID = 0; + std::string m_LaboratoryName; + uint64_t m_TechnicianID = 0; + std::string m_TechnicianName; + }; + + class Buffer : public Chunk { }; // Payload + + class End : public Chunk { }; + + // Prevent constructing + TypeExperimentInfo() = delete; + TypeExperimentInfo(const TypeExperimentInfo&) = delete; + TypeExperimentInfo(TypeExperimentInfo&&) = delete; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeFeatureVector.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeFeatureVector.h new file mode 100755 index 0000000..5e88f91 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeFeatureVector.h @@ -0,0 +1,33 @@ +#pragma once + +#include + +#include "TypeMatrix.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class TypeFeatureVector + * \brief Abstact class defining chunk types for Feature Vector streams + * \author J. T. Lindgren + * + */ +class TypeFeatureVector +{ +public: + static CIdentifier getTypeIdentifier() { return OV_TypeId_FeatureVector; } + + class Header : public TypeMatrix::Header { }; + + class Buffer : public TypeMatrix::Buffer { }; + + class End : public TypeMatrix::End { }; + + // Prevent constructing + TypeFeatureVector() = delete; + TypeFeatureVector(const TypeFeatureVector&) = delete; + TypeFeatureVector(TypeFeatureVector&&) = delete; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeMatrix.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeMatrix.h new file mode 100755 index 0000000..a816f55 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeMatrix.h @@ -0,0 +1,53 @@ +#pragma once + +#include + +#include "Chunk.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class TypeMatrix + * \brief Abstact class defining chunk types for Matrix streams + * \author J. T. Lindgren + * + */ +class TypeMatrix +{ +public: + static CIdentifier getTypeIdentifier() { return OV_TypeId_StreamedMatrix; } + + class Header : public Chunk + { + public: + // Header + CMatrix m_Header; + + // Make sure not copied until we have proper implementations + Header() { } + Header& operator=(const Header& in) = delete; + Header(const Header& in) = delete; + }; + + class Buffer : public Chunk + { + public: + // Payload + CMatrix m_buffer; + + // Make sure not copied until we have proper implementations + Buffer() { } + Buffer& operator=(const Buffer& in) = delete; + Buffer(const Buffer& in) = delete; + }; + + class End : public Chunk { }; + + // Prevent constructing + TypeMatrix() = delete; + TypeMatrix(const TypeMatrix&) = delete; + TypeMatrix(TypeMatrix&&) = delete; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeSignal.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeSignal.h new file mode 100755 index 0000000..6e9e78f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeSignal.h @@ -0,0 +1,40 @@ +#pragma once + +#include + +#include "TypeMatrix.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class TypeSignal + * \brief Abstact class defining chunk types for Signal streams + * \author J. T. Lindgren + * + */ +class TypeSignal +{ +public: + static CIdentifier getTypeIdentifier() { return OV_TypeId_Signal; } + + class Header : public TypeMatrix::Header + { + public: + // Header + uint64_t m_Sampling = 0; + }; + + class Buffer : public TypeMatrix::Buffer { }; + + class End : public TypeMatrix::End { }; + + // Prevent constructing + TypeSignal() = delete; + TypeSignal(const TypeSignal&) = delete; + TypeSignal(TypeSignal&&) = delete; + + // class Decoder : public Toolkit::TSignalDecoder { }; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeSpectrum.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeSpectrum.h new file mode 100755 index 0000000..4df8063 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeSpectrum.h @@ -0,0 +1,43 @@ +#pragma once + +#include + +#include "TypeMatrix.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class TypeSpectrum + * \brief Abstact class defining chunk types for Spectrum streams + * \author J. T. Lindgren + * + */ +class TypeSpectrum +{ +public: + static CIdentifier getTypeIdentifier() { return OV_TypeId_Spectrum; } + + class Header : public TypeMatrix::Header + { + public: + uint64_t m_Sampling = 0; + CMatrix m_Abscissas; + + // Make sure not copied until we have proper implementations + Header() { } + Header& operator=(const Header& in) = delete; + Header(const Header& in) = delete; + }; + + class Buffer : public TypeMatrix::Buffer { }; + + class End : public TypeMatrix::End { }; + + // Prevent constructing + TypeSpectrum() = delete; + TypeSpectrum(const TypeSpectrum&) = delete; + TypeSpectrum(TypeSpectrum&&) = delete; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeStimulation.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeStimulation.h new file mode 100755 index 0000000..5503357 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/TypeStimulation.h @@ -0,0 +1,43 @@ +#pragma once + +#include + +#include "Chunk.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class TypeStimulation + * \brief Abstact class defining chunk types for Stimulation streams + * \author J. T. Lindgren + * + */ +class TypeStimulation +{ +public: + static CIdentifier getTypeIdentifier() { return OV_TypeId_Stimulations; } + + class Header : public Chunk { }; + + class Buffer : public Chunk + { + public: + // Payload + CStimulationSet m_buffer; + + // Make sure not copied until we have proper implementations + Buffer() { } + Buffer& operator=(const Buffer& in) = delete; + Buffer(const Buffer& in) = delete; + }; + + class End : public Chunk { }; + + // Prevent constructing + TypeStimulation() = delete; + TypeStimulation(const TypeStimulation&) = delete; + TypeStimulation(TypeStimulation&&) = delete; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Workspace.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Workspace.h new file mode 100755 index 0000000..106299f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/Workspace.h @@ -0,0 +1,247 @@ +#pragma once + +#include "StreamBundle.h" + +#include "ProcExternalProcessing.h" + +#include + +#include "WorkspaceNotes.h" +#include "Selection.h" +#include "ParallelExecutor.h" + +namespace OpenViBE { +namespace Tracker { + +/** + * \class Workspace + * \brief Workspace is a set of Tracks (StreamBundles) that contain the .ov file content that the user wants to work with + * \author J. T. Lindgren + * + */ +class Workspace final : protected Contexted +{ +public: + + explicit Workspace(const Kernel::IKernelContext& ctx) + : Contexted(ctx), m_workspaceFile(""), m_workspacePath(""), m_processor(ctx), m_selection(ctx, m_tracks) { setUniqueWorkingPath(); } + + ~Workspace() override; + + // Reset workspace to the state like it was after construction + bool clear(); + + // Manipulating tracks and streams currently in the workspace + bool addTrack(const char* filename); // Add an .ov file as a track + + bool moveTrack(size_t sourceIdx, size_t targetIdx); + bool moveStream(size_t sourceTrack, size_t sourceStream, size_t targetTrack, size_t targetStream); + + bool clearTracks(); + bool removeTrack(size_t idx); + bool removeStream(size_t track, size_t stream); + + size_t getNumTracks() const { return m_tracks.size(); } + + size_t getNumTracksOnPlaylist() const { return m_playlist.size(); } + size_t getNumTracksDone() const { return m_tracksDone; } + + bool reloadTrack(size_t index); + + // Does not transfer pointer ownership + StreamBundle* getTrack(const size_t index) + { + std::unique_lock (m_om_Mutex); + + if (index >= m_tracks.size()) { return nullptr; } + return m_tracks[index]; + } + + // Transfers ownership of the pointer. Returns the index inserted to. + bool setTrack(const size_t index, StreamBundle* track) + { + std::unique_lock (m_om_Mutex); + if (index >= m_tracks.size()) { m_tracks.resize(index + 1, nullptr); } + delete m_tracks[index]; + m_tracks[index] = track; + + return true; + } + + bool play(const bool playFast); + bool stop(bool stopProcessor = true); + + // Push the selected part of the tracks to processor + bool step(); + + // get selection. Since it returns a reference, to set notes, simply modify the ref'd obj content. + Selection& getSelection() { return m_selection; } + + // Max duration of all tracks in the workspace, in fixed point seconds + CTime getMaxDuration() const; + + CTime getProcessedTime() const; + CTime getPlaylistDuration() const { return m_playlistDuration; } + + // Set output for chunks + // @todo refactor these to a getter/setter of a processor object? + bool setProcessor(const char* scenarioXml); + bool setProcessorFlags(bool noGUI, bool doSend, bool doReceive); + bool getProcessorFlags(bool& noGUI, bool& doSend, bool& doReceive) const; + const char* getProcessorFile() const { return m_processor.getFilename().c_str(); } + bool configureProcessor(const char* filename) { return m_processor.configure(filename); } + bool setProcessorPorts(uint32_t sendPort, uint32_t recvPort); + bool getProcessorPorts(uint32_t& sendPort, uint32_t& recvPort) const { return m_processor.getProcessorPorts(sendPort, recvPort); } + + bool hasProcessor() const + { + const char* fn = getProcessorFile(); + return (fn && fn[0] != 0); + } + + CString getProcessorArguments() const { return m_processorArguments; } + + bool setProcessorArguments(const CString& args) + { + m_processorArguments = args; + return true; + } + + CString getWorkingPath() const { return m_workspacePath; } + + bool setWorkingPath(const CString& path) + { + if (path.length() == 0) + { + log() << Kernel::LogLevel_Error << "Empty workspace path not allowed\n"; + return false; + } + m_workspacePath = path; + return true; + } + + // Creates a 'unique' working path and assigns it, but does not create the folder + bool setUniqueWorkingPath(); + + CString getFilename() const { return m_workspaceFile; } + + bool setFilename(const CString& filename) + { + if (filename.length() == 0) + { + // unset + m_workspaceFile = CString(""); + return true; + } + return this->save(filename); + } + + // get workspace notes. Since it returns a reference, to set notes, simply modify the ref'd obj content. + Kernel::IComment& getNotes() { return m_notes; } + + // @todo make generic property getter/setter? + bool getCatenateMode() const { return m_catenateMode; } + + bool setCatenateMode(const bool newState) + { + m_catenateMode = newState; + return true; + } + + // @fixme rework the setter to spool files to/from disk when mode changes + bool getMemorySaveMode() const { return m_memorySaveMode; } + bool setMemorySaveMode(bool active); + + // Modify tracks in place? + bool getInplaceMode() const { return m_inplaceMode; } + + bool setInplaceMode(const bool newState) + { + m_inplaceMode = newState; + return true; + } + + uint64_t getRevision() const { return m_revision; } + //uint64_t getNumRevisions() const { return m_NumRevisions; } + + // The processors can poll this now and then to find out if they should quit ahead of the file end + bool isQuitRequested() const + { + std::unique_lock m_Mutex; + return m_pleaseQuit; + } + + std::mutex& getMutex() const { return m_Mutex; } + + // Clear configuration tokens with a given prefix + bool wipeConfigurationTokens(const std::string& prefix) const; + + bool setParallelExecutor(ParallelExecutor* ptr) + { + m_executor = ptr; + return true; + } + + // Save and load workspace + bool save(const CString& filename); + bool load(const CString& filename); + + bool incrementRevisionAndSave(const CString& filename); + + // get sorted workspace specific tokens + std::vector> getConfigurationTokens() const; + +protected: + + bool saveAll(); + + bool getNextTrack(size_t& nextTrack) const; + bool assemblePlaylist(); + + bool spoolRecordingToDisk(size_t trackIndex); + + bool playReceiveOnly(); + bool playCatenate(); + bool playNormal(); + + // Assemble user-specified and generated arguments to the processor + std::string getProcessorArguments(size_t index); + + // Generic mutex to protect access to certain variables from multiple threads + mutable std::mutex m_Mutex; + + std::vector m_tracks; + + bool m_playFast = false; + bool m_catenateMode = false; + bool m_inplaceMode = false; + bool m_memorySaveMode = false; + bool m_pleaseQuit = false; + + uint32_t m_tracksDone = 0; + + CString m_workspaceFile; + CString m_workspacePath; + + // Component to send and receive data to/from, actually just a store for settings + ProcExternalProcessing m_processor; + std::string m_processorFilename; + CString m_processorArguments; + + typedef std::pair SourceTimePair; + std::vector m_playlist; + CTime m_playlistDuration = CTime::min(); + + // Text notes about the current workspace; defined as a class to be able to reuse Designer's CCommentEditorDialog + WorkspaceNotes m_notes; + + // Which tracks/streams are currently selected to be processed? + Selection m_selection; + + ParallelExecutor* m_executor = nullptr; + + // uint64_t m_NumRevisions = 1; + uint64_t m_revision = 1; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/WorkspaceNotes.h b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/WorkspaceNotes.h new file mode 100755 index 0000000..7f6472a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/include/WorkspaceNotes.h @@ -0,0 +1,89 @@ +#pragma once + +#include + +#include + +namespace OpenViBE { +namespace Tracker { + +/** + * \class WorkspaceNotes + * \brief An overly complicated wrapper for a text string. + * \author J. T. Lindgren + * + * This class is needed in order to use CCommentEditorDialog from Designer. The + * implementation is a quick hack. IDs and Attributable features are not supported at all. + * + */ +class WorkspaceNotes final : public Kernel::IComment +{ +public: + CIdentifier getIdentifier() const override { return 0; } + CString getText() const override { return m_notes; } + + bool setIdentifier(const CIdentifier& /*identifier*/) override { return true; } + + bool setText(const CString& sText) override + { + m_notes = sText; + return true; + } + + bool initializeFromExistingComment(const IComment& exisitingComment) override + { + m_notes = exisitingComment.getText(); + return true; + } + + // Attributable + bool addAttribute(const CIdentifier& /*attributeID*/, const CString& /*sAttributeValue*/) override { return true; } + bool removeAttribute(const CIdentifier& /*attributeID*/) override { return true; } + bool removeAllAttributes() override { return true; } + CString getAttributeValue(const CIdentifier& /*attributeID*/) const override { return CString(""); } + bool setAttributeValue(const CIdentifier& /*attributeID*/, const CString& /*sAttributeValue*/) override { return true; } + bool hasAttribute(const CIdentifier& /*attributeID*/) const override { return false; } + bool hasAttributes() const override { return false; } + CIdentifier getNextAttributeIdentifier(const CIdentifier& /*previousID*/) const override { return CIdentifier(); } + CIdentifier getClassIdentifier() const override { return CIdentifier(); } + + // Methods specific to this derived class + + // Save the notes + bool save(const CString& notesFile) const + { + std::ofstream output; + FS::Files::openOFStream(output, notesFile.toASCIIString()); + if (!output.is_open() || output.bad()) { return false; } + output << m_notes.toASCIIString(); + + output.close(); + + return true; + } + + // Load the notes + bool load(const CString& notesFile) + { + if (FS::Files::fileExists(notesFile.toASCIIString())) + { + std::ifstream input; + FS::Files::openIFStream(input, notesFile.toASCIIString()); + if (input.is_open() && !input.bad()) + { + const std::string str((std::istreambuf_iterator(input)), std::istreambuf_iterator()); + m_notes = str.c_str(); + input.close(); + return true; + } + } + + return false; + } + +protected: + + CString m_notes; +}; +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/advanced-visualization.ui b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/advanced-visualization.ui new file mode 100755 index 0000000..065c25c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/advanced-visualization.ui @@ -0,0 +1,933 @@ + + + + + + 100000 + 1 + 1 + 10 + + + 2 + 1024 + 1 + 25 + + + 1 + + + 8192 + 1 + 10 + + + 8192 + 1 + 10 + + + 10000000 + 10 + 0.10000000000000001 + 1 + + + True + False + gtk-spell-check + + + True + False + gtk-spell-check + + + True + False + gtk-close + + + True + False + gtk-close + + + True + False + gtk-go-down + + + True + False + gtk-go-down + + + True + False + gtk-go-forward + + + True + False + gtk-go-forward + + + True + False + gtk-undo + + + True + False + gtk-undo + + + + + + + + + + + 1 + dummy + + + + + + + + + + + dummy + + + + + + + + + + + dummy + + + + + + + + + + + dummy + + + + + + + + + + + + + Sort Channels... + + + + Default + gtk-close + + + Alphabetically + gtk-spell-check + + + Reversed + gtk-undo + + + Left to Right + gtk-go-back + + + Front to Bottom + gtk-go-down + + + + + False + Configure Settings... + mouse + dialog + + + True + False + 4 + 4 + + + True + True + + + True + False + 5 + True + + + Default + True + True + True + False + expander_sort_image_default + + + + + Alphabetically + True + True + True + False + expander_sort_image_alpha + + + 1 + 2 + + + + + Reversed + True + True + True + False + expander_sort_image_reversed + + + 2 + 3 + + + + + Left to Right + True + True + True + False + expander_sort_image_left_right + + + 3 + 4 + + + + + Front to Back + True + True + True + False + expander_sort_image_front_back + + + 4 + 5 + + + + + + + True + False + Sort Channels... + + + + + False + True + 0 + + + + + True + True + + + True + True + automatic + automatic + + + 240 + True + True + liststore_select + True + 1 + True + True + + + fixed + Channel + True + + + 32 + + + 0 + + + + + + 1 + + + + + + + + + + + True + False + Select Channels... + + + + + False + True + 1 + + + + + True + + + True + False + 4 + + + True + True + automatic + automatic + + + 240 + True + True + liststore_select_broadmann + True + 1 + True + True + + + fixed + Broadmann Area + True + + + + 0 + + + + + + + + + True + True + 0 + + + + + True + True + automatic + automatic + + + 240 + True + True + liststore_select_neuro_1 + True + 1 + True + True + + + fixed + Neuro Anatomical Region 1 + True + + + + 0 + + + + + + + + + True + True + 1 + + + + + True + True + automatic + automatic + + + 240 + True + True + liststore_select_neuro_2 + True + 1 + True + True + + + fixed + Neuro Anatomical Region 2 + True + + + + 0 + + + + + + + + + True + True + 2 + + + + + + + True + False + Select Regions... + + + + + False + True + 2 + + + + + True + + + True + False + 2 + 2 + True + + + True + False + Lower Boundary : + + + + + True + False + Higher Boundary : + + + 1 + 2 + + + + + True + True + + True + False + False + True + True + adjustment_freq_band_min + 3 + + + 1 + 2 + + + + + True + True + + True + False + False + True + True + adjustment_freq_band_max + 3 + + + 1 + 2 + 1 + 2 + + + + + + + True + False + Select Spectrum Boundaries... + + + + + True + True + 3 + + + + + True + False + 2 + 3 + + + True + False + + + True + False + Time Scale : + + + True + True + 0 + + + + + True + True + + True + False + False + True + True + adjustment_time_scale + 3 + + + True + True + 1 + + + + + 2 + GTK_FILL + GTK_FILL + + + + + Show Scales + True + True + False + False + True + + + 2 + 3 + GTK_FILL + GTK_FILL + + + + + Positive Data + True + True + False + False + True + + + 2 + 3 + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + False + + + True + False + Element Count : + + + True + True + 0 + + + + + True + True + + True + False + False + True + True + adjustment_element_count + + + True + True + 1 + + + + + 1 + 2 + 2 + GTK_FILL + GTK_FILL + + + + + True + True + 4 + + + + + True + False + + + False + True + 5 + + + + + True + False + 4 + 4 + + + gtk-media-play + True + True + True + False + True + + + 3 + 4 + + + + + + + True + False + 0% + + + 2 + 3 + GTK_FILL + GTK_FILL + + + + + 250 + True + True + adjustment_erp + 3 + False + right + + + 1 + 2 + + + + + + True + False + ERP player : + + + GTK_FILL + GTK_FILL + + + + + True + True + 6 + + + + + False + 4 + + + True + False + Video will save to : + + + False + False + 0 + + + + + True + False + + + True + True + 1 + + + + + gtk-media-record + True + True + True + False + True + + + False + False + 2 + + + + + True + True + 7 + + + + + + + + + + + + + + + + + + + 640 + 480 + False + Test window + + + True + False + 3 + 3 + + + 32 + True + False + + + 1 + 2 + 2 + 3 + GTK_FILL + GTK_FILL + + + + + True + False + + + 2 + 3 + + + + + + + True + False + + + 2 + 3 + 2 + 3 + + + + + + + 64 + True + False + + + 2 + 3 + 1 + 2 + GTK_FILL + GTK_FILL + + + + + 64 + True + False + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + False + + + 3 + + + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_SUBSTRUCTURE_MASK + False + + + 1 + 2 + 1 + 2 + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/header_logo.png b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/header_logo.png new file mode 100644 index 0000000..a2a3b92 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/header_logo.png differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/processor-example-bidir.xml b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/processor-example-bidir.xml new file mode 100755 index 0000000..954a53c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/processor-example-bidir.xml @@ -0,0 +1,858 @@ + + 2 + OpenViBE Designer + 2.1.0 + + + + + + (0x000013ae, 0x000053d6) + Temporal Filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter Method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter Type + Band Pass + Band Pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter Order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low Cut-off Frequency (Hz) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + High Cut-off Frequency (Hz) + 40 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + Band Pass Ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000020f0, 0x00006a2e) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000039e9, 0x000043de) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 5 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000043a8, 0x000051c6) + Debug: Stims + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005438, 0x0000400f) + To Tracker + (0x15422959, 0x16304449) + + + (0x5ba36127, 0x195feae1) + New input + + + (0x6f752dd0, 0x082a321e) + New input(1) + + + + + (0x2cdb2f0b, 0x12f231ea) + Launch third party program + true + false + false + + + (0x330306dd, 0x74a95f98) + Executable path + + + false + + + (0x79a9edeb, 0x245d83fc) + Arguments + + + false + + + (0x007deef9, 0x2f3e95c6) + Port + 0 + ${Tracker_Port_Receive} + false + + + (0x2cdb2f0b, 0x12f231ea) + Automatic connection identifier + true + true + false + + + (0x79a9edeb, 0x245d83fc) + Custom connection identifier + + + false + + + (0x007deef9, 0x2f3e95c6) + Incoming connection timeout + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Generator + false + false + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x6410533a, 0x11ff9fa8) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 8 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005438, 0x00004010) + From Tracker + (0x15422959, 0x16304449) + + + (0x5ba36127, 0x195feae1) + New output + + + (0x6f752dd0, 0x082a321e) + New output(1) + + + + + (0x2cdb2f0b, 0x12f231ea) + Launch third party program + true + false + false + + + (0x330306dd, 0x74a95f98) + Executable path + + + false + + + (0x79a9edeb, 0x245d83fc) + Arguments + + + false + + + (0x007deef9, 0x2f3e95c6) + Port + 0 + ${Tracker_Port_Send} + false + + + (0x2cdb2f0b, 0x12f231ea) + Automatic connection identifier + true + true + false + + + (0x79a9edeb, 0x245d83fc) + Custom connection identifier + + + false + + + (0x007deef9, 0x2f3e95c6) + Incoming connection timeout + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Generator + false + true + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x6410533a, 0x11ff9fa8) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 8 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005c5f, 0x0000103e) + Filtered signal + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Global + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 192 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00005dd2, 0x00007417) + Debug: Signals + (0x0ed76695, 0x01a69cc3) + + + (0x434f6587, 0x2efd2b7e) + Spied EBML stream 1 + + + + + (0x330306dd, 0x74a95f98) + EBML nodes description + ${Path_Data}/plugins/tools/config-ebml-stream-spy.txt + ${Path_Data}/plugins/tools/config-ebml-stream-spy.txt + false + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + (0x2cdb2f0b, 0x12f231ea) + Expand binary blocks + false + true + false + + + (0x007deef9, 0x2f3e95c6) + Number of values in expanded blocks + 4 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0x23ce0a10, 0xc2eabb47) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000013b9, 0x0000017a) + + (0x000039e9, 0x000043de) + 0 + + + (0x000020f0, 0x00006a2e) + 0 + + + + (0x00002203, 0x000031ea) + + (0x00005438, 0x00004010) + 1 + + + (0x000043a8, 0x000051c6) + 0 + + + + (0x00003091, 0x000011d5) + + (0x00005438, 0x00004010) + 1 + + + (0x00005c5f, 0x0000103e) + 1 + + + + (0x000042ec, 0x0000374f) + + (0x000013ae, 0x000053d6) + 0 + + + (0x00005438, 0x0000400f) + 0 + + + + (0x000054e6, 0x00000d08) + + (0x00005438, 0x00004010) + 1 + + + (0x00005438, 0x0000400f) + 1 + + + + (0x000057ce, 0x00000c0b) + + (0x00005438, 0x00004010) + 0 + + + (0x000039e9, 0x000043de) + 0 + + + + (0x00005a57, 0x00005592) + + (0x00005438, 0x00004010) + 0 + + + (0x000013ae, 0x000053d6) + 0 + + + + (0x00005bab, 0x000064b9) + + (0x00005438, 0x00004010) + 0 + + + (0x00005dd2, 0x00007417) + 0 + + + + (0x00007a40, 0x00004a8b) + + (0x000013ae, 0x000053d6) + 0 + + + (0x00005c5f, 0x0000103e) + 0 + + + + + + (0x000021fb, 0x00001fe1) + This scenario illustrates receiving a signal +from the Tracker, filtering and displaying it, +and sending the filtered signal back +to the Tracker. + +The filtered result should appear as a +new track in the Tracker workspace. + + + (0x473d9a43, 0x97fc0a97) + -16 + + + (0x7234b86b, 0x2b8651a5) + 64 + + + + + (0x000021fb, 0x00001fe2) + It is important that the Tracker workspace +is configured to both send and receive when +this scenario is used as its processor. + +Note that the number of output streams and their +order in the 'From Tracker' box must exactly +match the selected streams in the Tracker. + + + (0x473d9a43, 0x97fc0a97) + -16 + + + (0x7234b86b, 0x2b8651a5) + 256 + + + + + + + (0x000000c2, 0x000011b4) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00005c5f, 0x0000103e)","childCount":0,"identifier":"(0x00001f6f, 0x000016eb)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00003cf2, 0x00002d05)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007351, 0x00002b8e)","index":0,"name":"Default tab","parentIdentifier":"(0x00003cf2, 0x00002d05)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000355e, 0x00004491)","index":0,"name":"Empty","parentIdentifier":"(0x00007351, 0x00002b8e)","type":0}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Tracker bidir example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/processor-example-erp.xml b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/processor-example-erp.xml new file mode 100755 index 0000000..ee7b998 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/processor-example-erp.xml @@ -0,0 +1,1207 @@ + + 2 + OpenViBE Designer + 2.1.0 + + + + + + (0x0000024e, 0x00001f5f) + Debugger + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000004e1, 0x00004551) + ERP plot + (0x10dc6917, 0x2b29b2a0) + + + (0x6f752dd0, 0x082a321e) + Trigger + + + (0x544a003e, 0x6dcba5f6) + ERP1 + + + (0x544a003e, 0x6dcba5f6) + Variance1 + + + (0x544a003e, 0x6dcba5f6) + ERP2 + + + (0x544a003e, 0x6dcba5f6) + Variance2 + + + + + (0x330306dd, 0x74a95f98) + Filename final figure + + ${Path_UserData}/tracker-erp-example-plot.png + false + + + (0x2c132d6e, 0x44ab0d97) + Trigger to save figure + OVTK_StimulationId_ExperimentStop + OVTK_StimulationId_ExperimentStop + false + + + (0x2cdb2f0b, 0x12f231ea) + X starts at 0 + true + true + false + + + (0x7f45a2a9, 0x7db12219) + Line color 1 + 0,0,0 + 8,20,89 + false + + + (0x79a9edeb, 0x245d83fc) + Line label 1 + curve 1 + Target + false + + + (0x7f45a2a9, 0x7db12219) + Line color 2 + 0,0,0 + 100,0,0 + false + + + (0x79a9edeb, 0x245d83fc) + Line label 2 + curve + NonTarget + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 672 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x55fd2635, 0x995c1f10) + + + (0x666fffff, 0x666fffff) + + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000dd6, 0x000015a7) + Raw signal + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00001868, 0x0000536c) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001868, 0x0000536d) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_NonTarget + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00002fd6, 0x00002334) + Signal Resampling + (0x0e923a5e, 0xda474058) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x158a8efd, 0xaa894f86) + (0x007deef9, 0x2f3e95c6) + New Sampling Frequency + 128 + 128 + false + + + (0x588783f3, 0x8e8dcf86) + (0x007deef9, 0x2f3e95c6) + Sample Count Per Buffer + 8 + 8 + false + + + (0xafdd8efd, 0x23ef94f6) + (0x2cdb2f0b, 0x12f231ea) + Low Pass Filter Signal Before Downsampling + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0xf4246eab, 0x3b371eef) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003201, 0x0000635c) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 752 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005170, 0x00001fa3) + External Processing + (0x15422959, 0x16304449) + + + (0x5ba36127, 0x195feae1) + New output + + + (0x6f752dd0, 0x082a321e) + New output(1) + + + + + (0x2cdb2f0b, 0x12f231ea) + Launch third party program + true + false + false + + + (0x330306dd, 0x74a95f98) + Executable path + + + false + + + (0x79a9edeb, 0x245d83fc) + Arguments + + + false + + + (0x007deef9, 0x2f3e95c6) + Port + 0 + ${Tracker_Port_Send} + false + + + (0x2cdb2f0b, 0x12f231ea) + Automatic connection identifier + true + true + false + + + (0x79a9edeb, 0x245d83fc) + Custom connection identifier + + + false + + + (0x007deef9, 0x2f3e95c6) + Incoming connection timeout + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Generator + false + true + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x6410533a, 0x11ff9fa8) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 8 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006e2d, 0x00007e55) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 5 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007d40, 0x0000458c) + Epoch variance + (0x335384ea, 0x88c917d9) + + + (0x544a003e, 0x6dcba5f6) + Input epochs + + + + + (0x544a003e, 0x6dcba5f6) + Averaged epochs + + + (0x544a003e, 0x6dcba5f6) + Variance of epochs + + + (0x544a003e, 0x6dcba5f6) + Confidence bounds + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Cumulative average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Significance level + 0.01 + 0.01 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x4e7b798a, 0x183beafb) + (0xe7fb819b, 0x3ff4203d) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007d40, 0x0000458d) + Epoch variance + (0x335384ea, 0x88c917d9) + + + (0x544a003e, 0x6dcba5f6) + Input epochs + + + + + (0x544a003e, 0x6dcba5f6) + Averaged epochs + + + (0x544a003e, 0x6dcba5f6) + Variance of epochs + + + (0x544a003e, 0x6dcba5f6) + Confidence bounds + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Cumulative average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Significance level + 0.01 + 0.01 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0xe7fb819b, 0x3ff4203d) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000008a7, 0x00005ef9) + + (0x00006e2d, 0x00007e55) + 0 + + + (0x00003201, 0x0000635c) + 0 + + + + (0x00000a86, 0x000048c2) + + (0x00005170, 0x00001fa3) + 1 + + + (0x0000024e, 0x00001f5f) + 0 + + + + (0x00001d6e, 0x00001662) + + (0x00007d40, 0x0000458c) + 1 + + + (0x000004e1, 0x00004551) + 2 + + + + (0x00001f89, 0x00005c21) + + (0x00005170, 0x00001fa3) + 0 + + + (0x00002fd6, 0x00002334) + 0 + + + + (0x000021cf, 0x00003c13) + + (0x00002fd6, 0x00002334) + 0 + + + (0x00001868, 0x0000536d) + 0 + + + + (0x0000261e, 0x00000833) + + (0x00002fd6, 0x00002334) + 0 + + + (0x00001868, 0x0000536c) + 0 + + + + (0x00002856, 0x00000923) + + (0x00001868, 0x0000536d) + 0 + + + (0x00007d40, 0x0000458d) + 0 + + + + (0x00002ebe, 0x00000b0c) + + (0x00005170, 0x00001fa3) + 1 + + + (0x000004e1, 0x00004551) + 0 + + + + (0x0000316b, 0x00007005) + + (0x00007d40, 0x0000458d) + 1 + + + (0x000004e1, 0x00004551) + 4 + + + + (0x00003cf8, 0x00004fc7) + + (0x00007d40, 0x0000458c) + 0 + + + (0x000004e1, 0x00004551) + 1 + + + + (0x00003d41, 0x00001192) + + (0x00007d40, 0x0000458d) + 0 + + + (0x000004e1, 0x00004551) + 3 + + + + (0x00003f0a, 0x00005809) + + (0x00001868, 0x0000536c) + 0 + + + (0x00007d40, 0x0000458c) + 0 + + + + (0x00005880, 0x000025be) + + (0x00005170, 0x00001fa3) + 0 + + + (0x00006e2d, 0x00007e55) + 0 + + + + (0x00005ae9, 0x00007626) + + (0x00005170, 0x00001fa3) + 1 + + + (0x00001868, 0x0000536d) + 1 + + + + (0x00006445, 0x00006d02) + + (0x00005170, 0x00001fa3) + 1 + + + (0x00001868, 0x0000536c) + 1 + + + + (0x000070ec, 0x00007658) + + (0x00005170, 0x00001fa3) + 1 + + + (0x00000dd6, 0x000015a7) + 1 + + + + (0x000072dd, 0x00000f8d) + + (0x00005170, 0x00001fa3) + 0 + + + (0x00000dd6, 0x000015a7) + 0 + + + + + + (0x000000b3, 0x00004297) + Smooth the signal by downsampling + + + (0x473d9a43, 0x97fc0a97) + 448 + + + (0x7234b86b, 0x2b8651a5) + 320 + + + + + (0x000000b3, 0x00004298) + Redirect chunks based on trial type + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + 448 + + + + + (0x000000b3, 0x00004299) + Compute cumulative means + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + 560 + + + + + (0x000000b3, 0x0000429a) + On the average the signal that looked like noise +should reveal the following characteristics: + +For 1s period following <b>target</b>, +there is higher signal power at 8hz + +For 1s period following <b>nontarget</b>, +a square wave is hidden. + +Normally the ERP plots are used to show for +example the classic P300 shape for P300 data. + + + (0x473d9a43, 0x97fc0a97) + 464 + + + (0x7234b86b, 0x2b8651a5) + 720 + + + + + (0x0000644a, 0x00005133) + After receiving end of file stimulation, +the ERP Plot box will render its plot to a file. + +The file will be under a folder: +Windows: AppData/Roaming/openvibe-x.y.z/ +Linux: ~/.config/openvibe-x.y.z/ + + + (0x473d9a43, 0x97fc0a97) + 768 + + + (0x7234b86b, 0x2b8651a5) + 768 + + + + + (0x00006a13, 0x00005afd) + Data is read from the Tracker. Here we assume +that a specific file called '<b>simulated-2classes.ov</b>' +will be sent by the Tracker. + + + (0x473d9a43, 0x97fc0a97) + 480 + + + (0x7234b86b, 0x2b8651a5) + 192 + + + + + + + (0x0000280d, 0x00003c45) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00005e52, 0x00007e42)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":475},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000003d4, 0x0000406b)","index":0,"name":"Default tab","parentIdentifier":"(0x00005e52, 0x00007e42)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":135,"identifier":"(0x000035c0, 0x0000086d)","index":0,"maxDividerPosition":275,"name":"Vertical split","parentIdentifier":"(0x000003d4, 0x0000406b)","type":4},{"boxIdentifier":"(0x00000dd6, 0x000015a7)","childCount":0,"identifier":"(0x00007f08, 0x000070e0)","index":0,"parentIdentifier":"(0x000035c0, 0x0000086d)","type":3},{"boxIdentifier":"(0x000004e1, 0x00004551)","childCount":0,"identifier":"(0x0000726f, 0x000055bf)","index":1,"parentIdentifier":"(0x000035c0, 0x0000086d)","type":3}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Tracker ERP example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/processor-example-sink.xml b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/processor-example-sink.xml new file mode 100755 index 0000000..c451f41 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/processor-example-sink.xml @@ -0,0 +1,701 @@ + + 2 + OpenViBE Designer + 2.1.0 + + + + + + (0x000013ae, 0x000053d6) + Temporal Filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter Method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter Type + Band Pass + Band Pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter Order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low Cut-off Frequency (Hz) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + High Cut-off Frequency (Hz) + 40 + 40 + false + + + (0x512a166f, 0x5c3ef83f) + Band Pass Ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 144 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000020f0, 0x00006a2e) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000043a8, 0x000051c6) + Stims + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005438, 0x0000400f) + External Processing + (0x15422959, 0x16304449) + + + (0x5ba36127, 0x195feae1) + New output + + + (0x6f752dd0, 0x082a321e) + New output(1) + + + + + (0x2cdb2f0b, 0x12f231ea) + Launch third party program + true + false + false + + + (0x330306dd, 0x74a95f98) + Executable path + + + false + + + (0x79a9edeb, 0x245d83fc) + Arguments + + + false + + + (0x007deef9, 0x2f3e95c6) + Port + 0 + ${Tracker_Port_Send} + false + + + (0x2cdb2f0b, 0x12f231ea) + Automatic connection identifier + true + true + false + + + (0x79a9edeb, 0x245d83fc) + Custom connection identifier + + + false + + + (0x007deef9, 0x2f3e95c6) + Incoming connection timeout + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Generator + false + true + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x6410533a, 0x11ff9fa8) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 8 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005ae7, 0x00003098) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 3 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 512 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005c5f, 0x0000103e) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Global + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00005dd2, 0x00007417) + Signals + (0x0ed76695, 0x01a69cc3) + + + (0x434f6587, 0x2efd2b7e) + Spied EBML stream 1 + + + + + (0x330306dd, 0x74a95f98) + EBML nodes description + ${Path_Data}/plugins/tools/config-ebml-stream-spy.txt + ${Path_Data}/plugins/tools/config-ebml-stream-spy.txt + false + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + (0x2cdb2f0b, 0x12f231ea) + Expand binary blocks + false + true + false + + + (0x007deef9, 0x2f3e95c6) + Number of values in expanded blocks + 4 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 224 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0x23ce0a10, 0xc2eabb47) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00002634, 0x000066c2) + + (0x00005438, 0x0000400f) + 1 + + + (0x00005dd2, 0x00007417) + 0 + + + + (0x00002895, 0x00007435) + + (0x00005438, 0x0000400f) + 0 + + + (0x000013ae, 0x000053d6) + 0 + + + + (0x00003d33, 0x00004bba) + + (0x00005438, 0x0000400f) + 1 + + + (0x00005c5f, 0x0000103e) + 1 + + + + (0x000046c0, 0x00004d90) + + (0x00005438, 0x0000400f) + 1 + + + (0x000043a8, 0x000051c6) + 0 + + + + (0x000050d8, 0x000049e5) + + (0x00005438, 0x0000400f) + 0 + + + (0x00005ae7, 0x00003098) + 0 + + + + (0x00007a40, 0x00004a8b) + + (0x000013ae, 0x000053d6) + 0 + + + (0x00005c5f, 0x0000103e) + 0 + + + + (0x00007aee, 0x00005c93) + + (0x00005ae7, 0x00003098) + 0 + + + (0x000020f0, 0x00006a2e) + 0 + + + + + + (0x00001912, 0x0000689c) + Example of a processor that receives data from the Tracker, +but does not send anything to it: +the processor works as a <b>Data Sink</b>. + +In this case, the tracker Workspace must be +configured to Send but not to Receive. + + + + (0x473d9a43, 0x97fc0a97) + -144 + + + (0x7234b86b, 0x2b8651a5) + 160 + + + + + + + (0x000000c2, 0x000011b4) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00005c5f, 0x0000103e)","childCount":0,"identifier":"(0x00001f6f, 0x000016eb)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00003cf2, 0x00002d05)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007351, 0x00002b8e)","index":0,"name":"Default tab","parentIdentifier":"(0x00003cf2, 0x00002d05)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000355e, 0x00004491)","index":0,"name":"Empty","parentIdentifier":"(0x00007351, 0x00002b8e)","type":0}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Tracker Sink example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/processor-example-source.xml b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/processor-example-source.xml new file mode 100755 index 0000000..6cba1e0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/processor-example-source.xml @@ -0,0 +1,729 @@ + + 2 + OpenViBE Designer + 2.1.0 + + + + + + (0x000020f0, 0x00006a2e) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000039e9, 0x000043de) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 5 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000043a8, 0x000051c6) + Stims + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005438, 0x0000400f) + External Processing + (0x15422959, 0x16304449) + + + (0x5ba36127, 0x195feae1) + New input + + + (0x6f752dd0, 0x082a321e) + New input(1) + + + + + (0x2cdb2f0b, 0x12f231ea) + Launch third party program + true + false + false + + + (0x330306dd, 0x74a95f98) + Executable path + + + false + + + (0x79a9edeb, 0x245d83fc) + Arguments + + + false + + + (0x007deef9, 0x2f3e95c6) + Port + 0 + ${Tracker_Port_Receive} + false + + + (0x2cdb2f0b, 0x12f231ea) + Automatic connection identifier + true + true + false + + + (0x79a9edeb, 0x245d83fc) + Custom connection identifier + + + false + + + (0x007deef9, 0x2f3e95c6) + Incoming connection timeout + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Generator + false + false + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x6410533a, 0x11ff9fa8) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 8 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005c5f, 0x0000103e) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Global + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 464 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00005dd2, 0x00007417) + Signals + (0x0ed76695, 0x01a69cc3) + + + (0x434f6587, 0x2efd2b7e) + Spied EBML stream 1 + + + + + (0x330306dd, 0x74a95f98) + EBML nodes description + ${Path_Data}/plugins/tools/config-ebml-stream-spy.txt + ${Path_Data}/plugins/tools/config-ebml-stream-spy.txt + false + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + (0x2cdb2f0b, 0x12f231ea) + Expand binary blocks + false + true + false + + + (0x007deef9, 0x2f3e95c6) + Number of values in expanded blocks + 4 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0x23ce0a10, 0xc2eabb47) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005f1a, 0x000008fb) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 5 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 256 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Gaussian + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x00006300, 0x00004eef) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 0.5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + + + (0x00000ffc, 0x0000151f) + + (0x00006300, 0x00004eef) + 0 + + + (0x00005c5f, 0x0000103e) + 1 + + + + (0x000013b9, 0x0000017a) + + (0x000039e9, 0x000043de) + 0 + + + (0x000020f0, 0x00006a2e) + 0 + + + + (0x00001de3, 0x00006da2) + + (0x00005f1a, 0x000008fb) + 0 + + + (0x00005dd2, 0x00007417) + 0 + + + + (0x00001eb4, 0x000017bd) + + (0x00006300, 0x00004eef) + 0 + + + (0x00005438, 0x0000400f) + 1 + + + + (0x0000438a, 0x000026c2) + + (0x00005f1a, 0x000008fb) + 0 + + + (0x00005438, 0x0000400f) + 0 + + + + (0x00005738, 0x00003141) + + (0x00005f1a, 0x000008fb) + 0 + + + (0x00005c5f, 0x0000103e) + 0 + + + + (0x0000742a, 0x0000602a) + + (0x00006300, 0x00004eef) + 0 + + + (0x000043a8, 0x000051c6) + 0 + + + + + + (0x00001912, 0x0000689c) + Example of a processor that sends data to the Tracker, +but does not receive anything from it: the processor +works as a <b>Data Source</b>. + +The generated data should appear in the Tracker +as a new track. + +In this case, the tracker Workspace must be +configured to Receive but not to Send. + + + + (0x473d9a43, 0x97fc0a97) + 32 + + + (0x7234b86b, 0x2b8651a5) + 144 + + + + + + + (0x000000c2, 0x000011b4) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00005c5f, 0x0000103e)","childCount":0,"identifier":"(0x00001f6f, 0x000016eb)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00003cf2, 0x00002d05)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007351, 0x00002b8e)","index":0,"name":"Default tab","parentIdentifier":"(0x00003cf2, 0x00002d05)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000355e, 0x00004491)","index":0,"name":"Empty","parentIdentifier":"(0x00007351, 0x00002b8e)","type":0}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Tracker Source example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/tracker.ui-base b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/tracker.ui-base new file mode 100755 index 0000000..ba86449 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/share/tracker.ui-base @@ -0,0 +1,3058 @@ + + + + + + 0 + 0 + 0 + 1 + 10 + + + 0 + 0 + 0 + 1 + 10 + + + 65535 + 49152 + 50011 + 1 + 10 + + + 128 + 1 + 1 + 1 + 10 + + + False + 5 + center + 500 + 900 + normal + OpenViBE Tracker + @OV_GLOBAL_VERSION_STRING@ (@PLATFORM_TARGET@) + header_logo.png + Tool for offline exploration and processing +of EEG signals and related data + +Author: Jussi T. Lindgren / Inria + +Based on the OpenViBE SDK +and the OV Advanced Visualization plugin + + + + True + False + 2 + + + True + False + end + + + + + + False + True + end + 0 + + + + + + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 1000 + 10 + 0.10000000000000001 + 1 + + + False + 5 + + center-on-parent + dialog + + + True + False + 2 + + + True + False + end + + + True + True + True + + + True + False + + + True + False + gtk-jump-to + + + True + True + 0 + + + + + True + False + View Messages + + + True + True + 1 + + + + + + + False + False + 0 + + + + + OK + True + True + True + + + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + 4 + 2 + 8 + 8 + + + True + False + <b>One or more errors have occured during the execution of the scenario</b> + True + center + True + + + 1 + 2 + + + + + True + False + gtk-dialog-warning + 6 + + + 3 + + + + + + + True + False + + + 2 + 3 + 4 + GTK_FILL + GTK_FILL + + + + + True + False + <b>0</b> Warnings + True + + + 1 + 2 + 1 + 2 + + + + + True + False + <b>0</b> Errors + True + + + 1 + 2 + 2 + 3 + + + + + True + True + 1 + + + + + + dialog_error_popup-button_view + dialog_error_popup-button_ok + + + + False + 5 + + center-on-parent + dialog + + + True + False + 2 + + + True + False + end + + + gtk-cancel + True + True + True + True + + + False + False + 0 + + + + + Save Scenario + True + True + True + True + + + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + 4 + 2 + 8 + 8 + + + True + False + <b>An error occured while saving your scenario</b> + True + center + True + + + 1 + 2 + + + + + True + False + gtk-dialog-warning + 6 + + + 3 + + + + + + + True + False + + + 2 + 3 + 4 + GTK_FILL + GTK_FILL + + + + + True + False + label + + + 1 + 2 + 1 + 2 + + + + + True + False + label + + + 1 + 2 + 2 + 3 + + + + + True + True + 1 + + + + + + dialog_error_popup_saving-button_cancel + dialog_error_popup_saving-button_ok + + + + False + 5 + Oops... + False + True + center + 400 + 125 + dialog + True + True + warning + close + <big><b>Box documentation not found!</b></big> + True + The documentation Help file (CHM) is not available. + + + + + + False + + + False + end + + + False + True + end + 0 + + + + + True + False + True + True + + + True + True + 2 + + + + + + + + + + True + False + gtk-missing-image + + + False + 5 + center-on-parent + dialog + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 2 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + + + True + False + Label + + + True + True + 0 + + + + + True + True + True + False + False + True + True + + + True + True + 1 + + + + + True + True + 1 + + + + + + input-button_ok + input-button_cancel + + + + Preferences + False + 5 + center-on-parent + dialog + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 2 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + 6 + 4 + 9 + 2 + 2 + + + True + False + Processor (scenario .xml) + left + + + 0 + 1 + 0 + 1 + + + + + True + True + True + False + False + True + True + + + 0 + 1 + 1 + 2 + + + + + True + False + Open an existing scenario... + open + gtk-open + + + 0 + 1 + 2 + 3 + + + + + True + False + Edit the scenario + Edit + gtk-preferences + + + 0 + 1 + 3 + 4 + + + + + True + False + Processor arguments + left + + + 1 + 2 + 0 + 1 + + + + + True + True + True + False + False + True + True + + + 1 + 2 + 1 + 2 + + + + + True + False + First port + + + 2 + 3 + 0 + 1 + + + + + True + True + + True + False + False + True + True + adjustment_port + 0 + + + 2 + 3 + 1 + 2 + + + + + True + False + Do send? + + + 2 + 3 + 2 + 3 + + + + + True + True + False + Send data to processor? + True + + + 2 + 3 + 3 + 4 + + + + + True + False + Number of threads + + + 3 + 4 + 0 + 1 + + + + + True + True + + True + False + False + True + True + adjustment_numthreads + 0 + + + 3 + 4 + 1 + 2 + + + --> + + + True + False + Do receive? + + + 3 + 4 + 2 + 3 + + + + + True + True + False + Receive data from processor? + True + + + 3 + 4 + 3 + 4 + + + + + True + False + Catenate tracks + + + 4 + 5 + 0 + 1 + + + + + True + True + False + Catenate all tracks and process as one long track? + True + + + 4 + 5 + 1 + 2 + + + + + True + False + No GUI + + + 5 + 6 + 0 + 1 + + + + + True + True + False + Do not open GUI for when processing? + True + + + 5 + 6 + 1 + 2 + + + + + True + False + Workspace path + left + + + 6 + 7 + 0 + 1 + + + + + True + True + True + False + False + True + True + + + 6 + 7 + 1 + 2 + + + + + True + False + Open an existing folder... + open + gtk-open + + + 6 + 7 + 2 + 3 + + + + + True + False + Memory save mode (experimental) + + + 7 + 8 + 0 + 1 + + + + + True + True + False + Only read a track to memory when processing it + True + + + 7 + 8 + 1 + 2 + + + + + True + False + Modify tracks in place (risky) + + + 8 + 9 + 0 + 1 + + + + + True + True + False + When processing/applying, replace the previous content + True + + + 8 + 9 + 1 + 2 + + + + + True + True + 1 + + + + + + processorpreferences-button_ok + processorpreferences-button_cancel + + + + True + False + <small><tt>Mono</tt></small> + True + + + True + False + <small>x<sub>sub</sub></small> + True + + + True + False + <small>x<sup>sup</sup></small> + True + + + True + False + <span color="red">R</span> + True + + + True + False + green + <span color="green">G</span> + True + + + True + False + blue + <span color="blue">B</span> + True + + + 500 + 300 + False + 5 + Modify Comment + True + center + dialog + + + True + False + 2 + + + True + False + icons + + + True + False + bold (ctrl+b) + bold + True + gtk-bold + + + + False + True + + + + + True + False + italic (ctrl+i) + italic + True + gtk-italic + + + + False + True + + + + + True + False + underline (ctrl+u) + underline + True + gtk-underline + + + + False + True + + + + + True + False + strikethrough (ctrl+t) + strikethrough + True + gtk-strikethrough + + + + False + True + + + + + True + False + + + False + True + + + + + True + False + Monospace + True + label4 + + + False + True + + + + + True + False + Subscript + True + label5 + + + False + True + + + + + True + False + superscript + True + label6 + + + False + True + + + + + True + False + big + big + True + gtk-go-up + + + False + True + + + + + True + False + small + small + True + gtk-go-down + + + False + True + + + + + True + False + + + False + True + + + + + True + False + red + True + label7 + + + False + True + + + + + True + False + True + label8 + + + False + True + + + + + True + False + True + label9 + + + False + True + + + + + True + False + + + False + True + + + + + True + False + Help + howto + True + gtk-info + + + False + True + + + + + False + True + 0 + + + + + + + + 480 + 240 + True + True + automatic + + + True + True + word + + + + + True + True + 2 + + + + + True + False + end + + + gtk-apply + True + True + True + True + + + + False + False + 0 + + + + + gtk-cancel + True + True + True + True + + + False + False + 1 + + + + + False + True + end + 3 + + + + + + + + + comment-button_apply + comment-button_cancel + + + + + + + + + + dummy + + + + + + + + + + + dummy + + + + + + + + + + + dummy + + + + + False + 5 + Rename Object... + center-on-parent + dialog + + + True + False + 2 + + + True + False + end + + + True + False + False + + + True + False + + + True + False + gtk-revert-to-saved + + + True + True + 0 + + + + + True + False + Default + + + True + True + 1 + + + + + + + False + False + 0 + + + + + gtk-revert-to-saved + True + False + False + True + + + False + False + 1 + + + + + gtk-apply + True + False + False + True + + + + + False + False + 2 + + + + + gtk-cancel + True + False + False + True + + + + False + False + 3 + + + + + False + True + end + 0 + + + + + True + False + + + True + False + Enter new name : + + + True + True + 0 + + + + + True + True + False + False + True + True + + + True + True + 1 + + + + + True + True + 1 + + + + + + rename-button_default + rename-button_revert + rename-button_apply + rename-button_cancel + + + + True + False + gtk-refresh + + + You can format text using the Pango markup language. +This language uses xml-like tags, with keyword 'span' and 'name=value' definitions. +For example, using the name 'color' with value 'red' like this: <span color='red'>text</span> +will print 'text' in red. + +<span name=value> attributes +------------------------------------------------ +font, font_desc + A font description string, such as "Sans Italic 12". +font_family, face + A font family name +font_size, size + Font size in 1024ths of a point, or one of the absolute sizes 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', + or one of the relative sizes 'smaller' or 'larger'. + If you want to specify a absolute size, it's usually easier to take advantage of the ability + to specify a partial font description using 'font'; you can use font='12.5' rather than size='12800'. +font_style, style + One of 'normal', 'oblique', 'italic' +font_weight, weight + One of 'ultralight', 'light', 'normal', 'bold', 'ultrabold', 'heavy', or a numeric weight +font_variant, variant + One of 'normal' or 'smallcaps' +font_stretch, stretch + One of 'ultracondensed', 'extracondensed', 'condensed', 'semicondensed', 'normal', + 'semiexpanded', 'expanded', 'extraexpanded', 'ultraexpanded' +foreground, fgcolor, color + An RGB color specification such as '#00FF00' or a color name such as 'red' +background, bgcolor + An RGB color specification such as '#00FF00' or a color name such as 'red' +underline + One of 'none', 'single', 'double', 'low', 'error' +underline_color + The color of underlines; an RGB color specification such as '#00FF00' or a color name such as 'red' +rise + Vertical displacement, in Pango units. Can be negative for subscript, positive for superscript. +strikethrough + 'true' or 'false' whether to strike through the text +strikethrough_color + The color of strikethrough lines; an RGB color specification such as '#00FF00' or a color name such as 'red' +letter_spacing + Inter-letter spacing in 1024ths of a point. + +The following convenience tags are provided: +------------------------------------------------ +b + Bold +big + Makes font relatively larger, equivalent to <span size="larger"> +i + Italic +s + Strikethrough +sub + Subscript +sup + Superscript +small + Makes font relatively smaller, equivalent to <span size="smaller"> +tt + Monospace font +u + Underline + + + False + popup + False + tooltip + True + False + False + + + True + False + 6 + 2 + 2 + 2 + + + True + False + center + + + 1 + 2 + + + + + True + False + center + + + + + + + + 320 + 240 + False + OpenViBE Tracker (prototype) + center + 1024 + 768 + True + + + True + False + + + True + False + + + True + False + _File + True + + + True + False + + + + _Add track(s) + True + False + True + + + + + + + _Open workspace + True + False + True + + + + + + Set _processor + True + False + True + + + + + + True + False + + + + + Clear workspace + True + False + True + + + + + + True + False + + + + + + Save workspace as + True + False + True + + + + + + _Save workspace + True + False + True + + + + + + + Increment revision and save + True + False + True + + + + + + + gtk-quit + True + False + True + True + + + + + + + + + True + False + _Edit + True + + + True + False + + + Select tracks/streams + True + False + True + + + + + + + Select all + True + False + True + + + + + + + Select none + True + False + True + + + + + + + True + False + + + + + Delete all tracks + True + False + + + + + + + True + False + + + + + Workspace _notes + True + False + True + + + + + + + _Preferences + True + False + True + + + + + + + + + + + + + True + False + _Tracks + True + + + + + True + False + _Help + True + + + True + False + + + About this _Workspace + True + False + True + False + + + + + True + False + + + + + About _Tracker + True + False + True + False + + + + + + + + + + False + True + 0 + + + + + True + False + 4 + + + + + + + + + True + False + both-horiz + False + 1 + True + + + + True + False + Workspace notes + add notes + gtk-index + + + False + True + + + + + True + False + + + False + + + + + GTK_FILL + + + + + True + False + both-horiz + False + 1 + True + + + True + False + Stops feeding data to the processor + stop + gtk-media-stop + + + False + True + + + + + True + False + Feed data in simulated real time to the processor scenario + play + gtk-media-play + + + False + True + + + + + True + False + Feed data as fast as possible to the processor + start + gtk-media-forward + + + False + True + + + + + True + False + + + False + + + + + True + False + + + False + + + + + True + False + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Track currently processed + Stopped + + + + + False + + + + + True + False + + + False + + + + + True + False + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Current play time + Time : - + + + + + False + + + + + True + False + + + True + True + + + + + 1 + 4 + GTK_FILL + + + + + False + True + 1 + + + + + True + True + True + + + True + False + + + True + False + 10 + + + Select tracks/streams + True + False + False + True + right + + + 0 + 1 + GTK_FILL + + + + + True + False + Processor: + + + 1 + 2 + + + + + True + False + + + 2 + 3 + + + + + gtk-edit + True + True + True + True + right + + + 3 + 4 + GTK_FILL + + + + + False + True + 0 + + + + + True + False + 2 + 2 + + + + + + + True + True + automatic + automatic + + + + True + False + + + True + False + 1 + 1 + + + + + + + 0 + 1 + 0 + 2 + GTK_EXPAND | GTK_FILL + GTK_EXPAND | GTK_FILL + + + + + True + False + adj-h-pos + + + 1 + 2 + 0 + 1 + GTK_SHRINK | GTK_FILL + + + + + True + False + adj-h-scale + + + 1 + 2 + 1 + 2 + GTK_SHRINK | GTK_FILL + + + + + + + + + + + + + + + + + True + True + 1 + + + + + + + + True + False + + + True + False + gtk-jump-to + + + True + True + 0 + + + + + True + False + Workspace + + + True + True + 1 + + + + + + False + + + + + True + True + 2 + + + + + + True + True + Display the Tracker console + + + True + False + + + True + False + both-horiz + 1 + + + True + False + Clear the console + True + Clear + True + gtk-clear + + + False + True + + + + + True + False + Display the debug messages. +These messages can be activated only in log files. + True + DEBUG + gtk-info + + + False + True + + + + + True + False + Display the bench messages. +These messages can be activated only in log files. + True + BENCH + True + gtk-info + + + False + True + + + + + True + False + Display the trace messages. +In most cases trace messages ae not useful and should remain disabled. + True + TRACE + True + gtk-info + + + False + True + + + + + True + False + Display information messages in console. + True + INF + True + gtk-info + + + False + True + + + + + True + False + Display warning messages in console. + True + WARNING + True + gtk-dialog-warning + + + False + True + + + + + True + False + Display important warning messages in console. + True + IMPORTANT WARNING + True + gtk-dialog-warning + + + False + True + + + + + True + False + Display error messages in console. + True + ERROR + True + gtk-dialog-error + + + False + True + + + + + True + False + Display fatal error messages in console. + True + FATAL + True + gtk-dialog-error + + + False + True + + + + + True + False + + + Show pop-up +on Warnings and Errors + True + True + False + Display a pop-up each time a warning or an error is thrown by a box. + True + + + + + False + True + + + + + False + True + 0 + + + + + True + False + + + True + False + Search for : + + + False + True + 0 + + + + + True + True + + True + False + False + True + True + + + True + True + 1 + + + + + True + True + 1 + + + + + True + True + automatic + automatic + + + 250 + True + True + False + tracker-textbuffer_messages + + + + + True + True + 2 + + + + + + + True + False + + + True + False + gtk-info + + + True + True + 0 + + + + + True + False + <b>0</b> Messages + True + + + True + True + 10 + 1 + + + + + False + gtk-dialog-warning + + + True + True + 2 + + + + + False + <b>0</b> Warnings + True + + + True + True + 10 + 3 + + + + + False + gtk-dialog-error + + + True + True + 4 + + + + + False + <b>0</b> Errors + True + + + True + True + 10 + 5 + + + + + + + False + True + 3 + + + + + + + + 10 + 300 + 100 + 5 + 25 + + + + 640 + 480 + False + Workspace information + center + 1024 + 512 + False + + + 480 + 240 + True + True + automatic + + + True + True + word + tracker-textbuffer-workspace_information + + + + + + + + 1024 + 240 + False + Stimulation list + center + 1024 + 256 + False + + + 1024 + 240 + True + True + automatic + automatic + + + 240 + True + True + True + True + True + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/signals/simulated-2classes.ov b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/signals/simulated-2classes.ov new file mode 100755 index 0000000..9fa7968 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/signals/simulated-2classes.ov differ diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/BoxAdapter.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/BoxAdapter.cpp new file mode 100755 index 0000000..f2d8a62 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/BoxAdapter.cpp @@ -0,0 +1,213 @@ +#include + +#include + +#include "BoxAdapter.h" +#include "CodecFactory.h" + +namespace OpenViBE { +namespace Tracker { + + +bool BoxAdapter::initialize() +{ + m_boxAlgorithm = m_kernelCtx.getPluginManager().createBoxAlgorithm(m_algorithmID, nullptr); + if (!m_boxAlgorithm) + { + log() << Kernel::LogLevel_Error << "Error: failed to create algorithm for id " << m_algorithmID.str() << "\n"; + return false; + } + m_boxAlgorithmCtx.getTrackerBoxIO()->initialize(m_boxAlgorithmCtx.getStaticBoxContext()); + + return true; +} + +bool BoxAdapter::uninitialize() +{ + if (m_boxAlgorithm) + { + m_boxAlgorithm->uninitialize(m_boxAlgorithmCtx); + m_kernelCtx.getPluginManager().releasePluginObject(m_boxAlgorithm); + m_boxAlgorithm = nullptr; + } + + return true; +} + +BoxAdapterBundle::~BoxAdapterBundle() +{ + for (auto decoder : m_decoders) { delete decoder; } + m_decoders.clear(); + for (auto encoder : m_encoders) { delete encoder; } + m_encoders.clear(); +} + +bool BoxAdapterBundle::initialize() +{ + if (!BoxAdapter::initialize()) { return false; } + + Kernel::IBox* staticBoxContext = const_cast(m_boxAlgorithmCtx.getStaticBoxContext()); + + if (m_src) + { + for (size_t i = 0; i < m_src->getNumStreams(); ++i) + { + // @fixme test boxes input support here + std::stringstream ss; + ss << "Stream" << i; // not really used since there's no GUI for the box + staticBoxContext->addInput(ss.str().c_str(), m_src->getStream(i)->getTypeIdentifier()); + m_encoders.push_back(CodecFactory::getEncoder(m_kernelCtx, *m_src->getStream(i))); + if (m_dst) + { + m_dst->createStream(i, m_src->getStream(i)->getTypeIdentifier()); + m_decoders.push_back(CodecFactory::getDecoder(m_kernelCtx, *m_dst->getStream(i))); + staticBoxContext->addOutput(ss.str().c_str(), m_dst->getStream(i)->getTypeIdentifier()); + } + } + } + + m_boxAlgorithm->initialize(m_boxAlgorithmCtx); + + return true; +} + +bool BoxAdapterBundle::spool(const bool /* verbose */) +{ + Kernel::IBoxIO* boxCtx = const_cast(m_boxAlgorithmCtx.getDynamicBoxContext()); + TrackerBoxIO* ioCtx = static_cast(boxCtx); + + if (!m_src) + { + log() << Kernel::LogLevel_Error << "Error: box wrapper doesn't yet support processing without source\n"; + return false; + } + + m_src->rewind(); + + const uint32_t nOutput = m_boxAlgorithmCtx.getStaticBoxContext()->getOutputCount(); + + while (true) + { + size_t index; + StreamPtr stream = m_src->getNextStream(index); + if (!stream) { break; } + EncodedChunk chk; + EChunkType outputType; + m_encoders[index]->encode(chk, outputType); + + ioCtx->addInputChunk(index, chk); + + m_boxAlgorithm->process(m_boxAlgorithmCtx); + + ioCtx->clearInputChunks(); + + if (m_dst) + { + for (size_t j = 0; j < nOutput; ++j) + { + if (ioCtx->isReadyToSend(j)) + { + ioCtx->getOutputChunk(j, chk); + m_decoders[j]->decode(chk); + ioCtx->deprecateOutput(j); + } + } + } + stream->step(); + } + + m_src->rewind(); + + return true; +} + +bool BoxAdapterStream::initialize() +{ + if (!BoxAdapter::initialize()) { return false; } + + Kernel::IBox* boxCtx = const_cast(m_boxAlgorithmCtx.getStaticBoxContext()); + + CIdentifier typeID; + boxCtx->getInputType(0, typeID); + if (typeID != m_src->getTypeIdentifier()) + { + log() << Kernel::LogLevel_Error << "Error: Box alg first input stream is wrong type\n"; + return false; + } + boxCtx->getOutputType(0, typeID); + if (typeID != m_dst->getTypeIdentifier()) + { + log() << Kernel::LogLevel_Error << "Error: Box alg first output stream is wrong type\n"; + return false; + } + + m_boxAlgorithm->initialize(m_boxAlgorithmCtx); + + return true; +} + +bool BoxAdapterStream::spool(const bool verbose) +{ + Kernel::IBoxIO* boxCtx = const_cast(m_boxAlgorithmCtx.getDynamicBoxContext()); + TrackerBoxIO* ioCtx = static_cast(boxCtx); + + if (!m_src) + { + log() << Kernel::LogLevel_Error << "Error: box wrapper doesn't yet support processing without source\n"; + return false; + } + + m_src->reset(); + + EncoderBase* encoder = CodecFactory::getEncoder(m_kernelCtx, *m_src); + DecoderBase* decoder = CodecFactory::getDecoder(m_kernelCtx, *m_dst); + + if (verbose) { log() << Kernel::LogLevel_Info; } + + bool finished = false; + uint64_t cnt = 0; + while (!finished) + { + if (m_src) + { + EncodedChunk chk; + EChunkType outputType; + if (encoder->encode(chk, outputType)) + { + // @fixme here we assume the box takes data in at the first slot + ioCtx->clearInputChunks(); + ioCtx->addInputChunk(0, chk); + + m_src->step(); + } + else { finished = true; } + } + + m_boxAlgorithm->process(m_boxAlgorithmCtx); + + if (m_dst) + { + if (ioCtx->isReadyToSend(0)) + { + EncodedChunk chk; + ioCtx->getOutputChunk(0, chk); + decoder->decode(chk); + ioCtx->deprecateOutput(0); + } + } + if (verbose && cnt++ % 100 == 0) { log() << "."; } + } + if (verbose) { log() << "\n"; } + + m_src->reset(); + + ioCtx->clearInputChunks(); + + delete encoder; + delete decoder; + + return true; +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/BoxPlugins.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/BoxPlugins.cpp new file mode 100755 index 0000000..165521d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/BoxPlugins.cpp @@ -0,0 +1,97 @@ +#include "BoxPlugins.h" +#include "ovkCBoxProto.h" + +namespace OpenViBE { +namespace Tracker { + +#define OVP_ClassId_BoxAlgorithm_TemporalFilter CIdentifier(0xB4F9D042, 0x9D79F2E5) +#define OVP_ClassId_BoxAlgorithm_TemporalFilterDesc CIdentifier(0x7BF6BA62, 0xAF829A37) +#define OVP_ClassId_BoxAlgorithm_SignalResampling CIdentifier(0x0E923A5E, 0xDA474058) +#define OVP_ClassId_BoxAlgorithm_SignalResamplingDesc CIdentifier(0xA675A433, 0xC6690920) +#define OVP_ClassId_BoxAlgorithm_SimpleDSP CIdentifier(0x00E26FA1, 0x1DBAB1B2) +#define OVP_ClassId_BoxAlgorithm_SimpleDSPDesc CIdentifier(0x00C44BFE, 0x76C9269E) +#define OVP_ClassId_BoxAlgorithm_Crop CIdentifier(0x7F1A3002, 0x358117BA) +#define OVP_ClassId_BoxAlgorithm_CropDesc CIdentifier(0x64D619D7, 0x26CC42C9) +#define OVP_ClassId_BoxAlgorithm_SpatialFilter CIdentifier(0xDD332C6C, 0x195B4FD4) +#define OVP_ClassId_BoxAlgorithm_SpatialFilterDesc CIdentifier(0x72A01C92, 0xF8C1FA24) +#define OVP_ClassId_BoxAlgorithm_TimeBasedEpoching CIdentifier(0x00777FA0, 0x5DC3F560) +#define OVP_ClassId_BoxAlgorithm_TimeBasedEpochingDesc CIdentifier(0x00ABDABE, 0x41381683) +#define OVP_ClassId_BoxAlgorithm_StimulationFilter CIdentifier(0x02F96101, 0x5E647CB8) +#define OVP_ClassId_BoxAlgorithm_StimulationFilterDesc CIdentifier(0x4D2A23FC, 0x28191E18) +#define OVP_ClassId_FastICA CIdentifier(0x00649B6E, 0x6C88CD17) +#define OVP_ClassId_FastICADesc CIdentifier(0x00E9436C, 0x41C904CA) +#define OVP_ClassId_BoxAlgorithm_CommonAverageReference CIdentifier(0x009C0CE3, 0x6BDF71C3) +#define OVP_ClassId_BoxAlgorithm_CommonAverageReferenceDesc CIdentifier(0x0033EAF8, 0x09C65E4E) +#define OVP_ClassId_BoxAlgorithm_ChannelSelector CIdentifier(0x361722E8, 0x311574E8) +#define OVP_ClassId_BoxAlgorithm_ChannelSelectorDesc CIdentifier(0x67633C1C, 0x0D610CD8) +#define OVP_ClassId_BoxAlgorithm_ChannelRename CIdentifier(0x1FE50479, 0x39040F40) +#define OVP_ClassId_BoxAlgorithm_ChannelRenameDesc CIdentifier(0x20EA1F00, 0x7AED5645) +#define OVP_ClassId_BoxAlgorithm_ReferenceChannel CIdentifier(0x444721AD, 0x78342CF5) +#define OVP_ClassId_BoxAlgorithm_ReferenceChannelDesc CIdentifier(0x42856103, 0x45B125AD) +#define OVP_ClassId_BoxAlgorithm_FrequencyBandSelector CIdentifier(0x140C19C6, 0x4E6E187B) +#define OVP_ClassId_BoxAlgorithm_FrequencyBandSelectorDesc CIdentifier(0x13462C56, 0x794E3C07) + +#include + +BoxPlugins::BoxPlugins(const Kernel::IKernelContext& ctx) : Contexted(ctx) +{ + // Register some boxes that can be used as filters + create(OV_TypeId_Signal, OVP_ClassId_BoxAlgorithm_TemporalFilter, OVP_ClassId_BoxAlgorithm_TemporalFilterDesc); + create(OV_TypeId_Signal, OVP_ClassId_BoxAlgorithm_SimpleDSP, OVP_ClassId_BoxAlgorithm_SimpleDSPDesc); + create(OV_TypeId_Signal, OVP_ClassId_BoxAlgorithm_TimeBasedEpoching, OVP_ClassId_BoxAlgorithm_TimeBasedEpochingDesc); + create(OV_TypeId_Signal, OVP_ClassId_BoxAlgorithm_Crop, OVP_ClassId_BoxAlgorithm_CropDesc); + create(OV_TypeId_Signal, OVP_ClassId_BoxAlgorithm_SpatialFilter, OVP_ClassId_BoxAlgorithm_SpatialFilterDesc); + create(OV_TypeId_Signal, OVP_ClassId_BoxAlgorithm_SignalResampling, OVP_ClassId_BoxAlgorithm_SignalResamplingDesc); + create(OV_TypeId_Signal, OVP_ClassId_FastICA, OVP_ClassId_FastICADesc); + create(OV_TypeId_Signal, OVP_ClassId_BoxAlgorithm_CommonAverageReference, OVP_ClassId_BoxAlgorithm_CommonAverageReferenceDesc); + + create(OV_TypeId_Signal, OVP_ClassId_BoxAlgorithm_ChannelSelector, OVP_ClassId_BoxAlgorithm_ChannelSelectorDesc); + create(OV_TypeId_Signal, OVP_ClassId_BoxAlgorithm_ChannelRename, OVP_ClassId_BoxAlgorithm_ChannelRenameDesc); + create(OV_TypeId_Signal, OVP_ClassId_BoxAlgorithm_ReferenceChannel, OVP_ClassId_BoxAlgorithm_ReferenceChannelDesc); + + create(OV_TypeId_Spectrum, OVP_ClassId_BoxAlgorithm_FrequencyBandSelector, OVP_ClassId_BoxAlgorithm_FrequencyBandSelectorDesc); + + create(OV_TypeId_Stimulations, OVP_ClassId_BoxAlgorithm_StimulationFilter, OVP_ClassId_BoxAlgorithm_StimulationFilterDesc); + + std::sort(m_boxPlugins.begin(), m_boxPlugins.end(), [](BoxAdapterStream* a, BoxAdapterStream* b) + { + return (a->getBox().getName()) < (b->getBox().getName()); + }); +} + +bool BoxPlugins::create(const CIdentifier& streamType, const CIdentifier& alg, const CIdentifier& desc) +{ + BoxAdapterStream* ptr = new BoxAdapterStream(m_kernelCtx, alg); + + // Initialize the context by polling the descriptor + const Plugins::IPluginObjectDesc* pod = getKernelContext().getPluginManager().getPluginObjectDesc(desc); + if (!pod) + { + log() << Kernel::LogLevel_Error << "Unable to load box algorithm " << alg.str() << "\n"; + return false; + } + + const Plugins::IBoxAlgorithmDesc* pBoxAlgorithmDescriptor = dynamic_cast(pod); + Kernel::CBoxProto boxProto(m_kernelCtx, ptr->getBox()); + pBoxAlgorithmDescriptor->getBoxPrototype(boxProto); + + // We need to force this so we don't launch the plugin on streams of other types, and not all boxes declare + // their capabilities. Here we assume that if the box is created for this stream type, it can support it. + boxProto.addInputSupport(streamType); + + CIdentifier typeID; + ptr->getBox().getInputType(0, typeID); + if (typeID != streamType) { ptr->getBox().setInputType(0, streamType); } + ptr->getBox().getOutputType(0, typeID); + if (typeID != streamType) { ptr->getBox().setOutputType(0, streamType); } + + const CString boxName = m_kernelCtx.getTypeManager().getTypeName(streamType) + CString(" : ") + pBoxAlgorithmDescriptor->getName(); + ptr->getBox().setName(boxName); + + m_boxPlugins.push_back(ptr); + + return true; +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CTracker.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CTracker.cpp new file mode 100644 index 0000000..3fac9e1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CTracker.cpp @@ -0,0 +1,454 @@ +// +// OpenViBE Tracker +// +// @todo catch way more errors, currently most return values are ignored by callers +// @todo Change error handling to use the macros introduced in certivibe +// @todo clean the code to be more conforming to coding rules +// @todo Implement vertical slider / scale +// @todo Fix time units +// @todo Add track renderer only when the track appears +// +// @todo add dataset manager (workspace == datasets) +// @todo enable a view where only 'current track' is shown and the rest are minimized (unloaded?) +// @todo add option to collapse tracks to take less visual space +// @todo add record button +// @todo implement undo +// @todo fix issues with empty tracks/streams and if the processing fails (e.g. incompatible processor) +// @todo fix creation of noncontinuous streams in the catenate mode e.g. by padding all source streams to equal length? +// @todo write some tutorial processors, e.g. erp analysis, file export ... ? +// @todo allow running several scenarios sequentially +// @todo selection could be saved in the .ovw file simply as track/stream tokens (small perf hit)? + +#include +#include +#include + +#include + +#include "CTracker.h" +#include "StreamBundleImportExport.h" + +#include "Workspace.h" + +namespace OpenViBE { +namespace Tracker { + +CTracker::CTracker(const Kernel::IKernelContext& ctx) + : Contexted(ctx), m_workspace(ctx), m_boxPlugins(ctx), m_trackerPlugins(ctx) +{ + // Default config load deferred until initialize() which can be called after booting the GUI + // --> so we can get the possible log messages to the GUI +} + +CTracker::~CTracker() +{ + const CString configFile = m_kernelCtx.getConfigurationManager().expand("${Path_UserData}/openvibe-tracker.conf"); + saveConfig(configFile); + m_executor.uninitialize(); +} + +bool CTracker::initialize() +{ + const CString configFile = m_kernelCtx.getConfigurationManager().expand("${Path_UserData}/openvibe-tracker.conf"); + // n.b. Initing the executor is in loadConfig so its not done twice + m_workspace.setParallelExecutor(&m_executor); + return loadConfig(configFile); +} + +bool CTracker::play(const bool playFast) +{ + switch (m_state) + { + case EStates::Stopped: + if (!m_workspace.play(playFast)) + { + log() << Kernel::LogLevel_Error << "Error: play failed\n"; + return false; + } + m_state = EStates::Playing; + break; + case EStates::Playing: + m_state = EStates::Paused; + break; + case EStates::Paused: + m_state = EStates::Playing; + break; + default: + break; + } + + return true; +} + +bool CTracker::stop() +{ + // Request workspace to stop, do not change state until it has stopped + return m_workspace.stop(); +} + +CTracker::EStates CTracker::step() +{ + if (m_state == EStates::Playing) { if (!m_workspace.step()) { m_state = EStates::Stopping; } } + else if (m_state == EStates::Stopping) { if (m_executor.isIdle()) { m_state = EStates::Stopped; } } + else { System::Time::sleep(1); } + + return m_state; +} + +struct Workpackage +{ + StreamBundle* source = nullptr; + std::mutex oMutex; + size_t trackIndex; + std::deque streamsToProcess; +}; + + +bool CTracker::applyBoxPlugin(const size_t index) +{ + auto& plugins = getBoxPlugins().getBoxPlugins(); + if (index >= plugins.size()) + { + log() << Kernel::LogLevel_Error << "Plugin index exceeds plugin array size\n"; + return false; + } + + if (getWorkspace().getMemorySaveMode() && getWorkspace().getWorkingPath().length() == 0) + { + log() << Kernel::LogLevel_Error << "Memory save mode requires a workspace path\n"; + return false; + } + + const CTime startTime = CTime(System::Time::zgetTime()); + + BoxAdapterStream* box = plugins[index]; + + const CString name = box->getBox().getName(); + log() << Kernel::LogLevel_Info << "Applying method " << name << " (" << (m_workspace.getInplaceMode() ? "Inplace" : "Normal") << " mode)\n"; + + for (size_t trackIndex = 0; trackIndex < getWorkspace().getNumTracks(); ++trackIndex) + { + Workpackage* wptr = new Workpackage; + Workspace& ws = getWorkspace(); + + StreamBundle* sourceTrack = ws.getTrack(trackIndex); + + // Count + const size_t numStreams = ws.getTrack(trackIndex)->getNumStreams(); + for (size_t j = 0; j < numStreams; ++j) + { + if (sourceTrack->getStream(j)->getSelected() && box->getBox().hasInputSupport(sourceTrack->getStream(j)->getTypeIdentifier())) + { + wptr->streamsToProcess.push_back(j); + } + } + const size_t nToProcess = wptr->streamsToProcess.size(); + if (nToProcess == 0) { continue; } + + wptr->trackIndex = trackIndex; + wptr->source = (m_workspace.getMemorySaveMode() ? nullptr : sourceTrack); + + for (size_t j = 0; j < nToProcess; ++j) + { + const bool inplaceMode = m_workspace.getInplaceMode(); + const bool multithread = (m_executor.getNumThreads() > 1); + const bool memorySave = m_workspace.getMemorySaveMode(); + + const Kernel::IKernelContext& ctx = getKernelContext(); + + auto job = [&ws, wptr, &ctx, box, multithread, inplaceMode, memorySave](uint32_t /*threadNumber*/) + { + size_t sourceStreamIndex; + { + std::unique_lock(wptr->oMutex); + if (memorySave && !wptr->source) + { + wptr->source = readStreamBundleFromFile(ctx, + ws.getTrack(wptr->trackIndex)->getSource().c_str(), false); + } + sourceStreamIndex = wptr->streamsToProcess.front(); + wptr->streamsToProcess.pop_front(); + } + + StreamBundle* sourceTrack = wptr->source; + const StreamPtr sourceStream = sourceTrack->getStream(sourceStreamIndex); + + // process + + if (!multithread) + { + ctx.getLogManager() << Kernel::LogLevel_Info << "Processing track " << (wptr->trackIndex + 1) << " stream " << (sourceStreamIndex + 1) << "\n"; + } + + std::unique_lock(wptr->oMutex); + + const size_t targetStreamIndex = sourceTrack->getNumStreams(); + sourceTrack->createStream(targetStreamIndex, sourceStream->getTypeIdentifier()); + StreamPtr targetStream = sourceTrack->getStream(targetStreamIndex); + + // We need a copy of the box since otherwise different threads init the same box differently + BoxAdapterStream* boxCopy = new BoxAdapterStream(ctx, box->getAlgorithmId()); + + boxCopy->getBox().initializeFromExistingBox(box->getBox()); + + boxCopy->setSource(sourceStream); + boxCopy->setTarget(targetStream); + + if (!boxCopy->initialize()) + { + std::unique_lock(wptr->oMutex); + + sourceTrack->deleteStream(targetStreamIndex); + delete boxCopy; + + return; + } + + boxCopy->spool(!multithread); + boxCopy->uninitialize(); + delete boxCopy; + + if (inplaceMode) + { + std::unique_lock(wptr->oMutex); + + sourceTrack->swapStreams(sourceStreamIndex, targetStreamIndex); + sourceTrack->deleteStream(targetStreamIndex); + } + else { targetStream->setSelected(false); } + + // Spool resources to disk and free memory + { + std::unique_lock(wptr->oMutex); + + if (memorySave) + { + // Free resources if this thread is the last + if (wptr->streamsToProcess.empty()) + { + if (wptr->source->getDirtyBit()) + { + // @fixme not a good solution with the filenaming; rethink the whole thing + + std::stringstream ss; + ss << ws.getWorkingPath() << "/workspace-track-" << (wptr->trackIndex + 1) << ".ov"; + + // In this mode, sourceTrack is not from the track array. We spool it to disk, then + // set the filename of the track in the array, and reload it back. + saveStreamBundleToFile(ctx, wptr->source, ss.str().c_str()); + ws.getTrack(wptr->trackIndex)->setSource(ss.str()); + ws.reloadTrack(wptr->trackIndex); + } + delete wptr->source; + } + } + if (wptr->streamsToProcess.empty()) { delete wptr; } + } + }; + + m_executor.pushJob(job); + + if (!multithread) { m_executor.waitForAll(); } + } + } + + m_executor.waitForAll(); + + // pBoxAlgorithmDescriptor->release(); + + const CTime elapsed = CTime(System::Time::zgetTime()) - startTime; + log() << Kernel::LogLevel_Info << "Applying plugin took " << elapsed.toSeconds() << " sec.\n"; + + return true; +} + +bool CTracker::applyTrackerPlugin(const size_t index) +{ + auto& plugins = getTrackerPlugins().getTrackerPlugins(); + if (index >= plugins.size()) + { + log() << Kernel::LogLevel_Error << "Plugin index exceeds plugin array size\n"; + return false; + } + + if (getWorkspace().getMemorySaveMode() && getWorkspace().getWorkingPath().length() == 0) + { + log() << Kernel::LogLevel_Error << "Memory save mode requires a workspace path\n"; + return false; + } + + ITrackerPlugin* plugin = plugins[index]; + + const CString name(plugin->getName().c_str()); + log() << Kernel::LogLevel_Info << "Applying method " << name << " (" << (m_workspace.getInplaceMode() ? "Inplace" : "Normal") << " mode)\n"; + + bool retVal = true; + + if (plugin->hasCapability(ITrackerPlugin::ECapabilities::Workspace)) + { + retVal = plugin->process(getWorkspace(), m_executor); + if (!retVal) { log() << Kernel::LogLevel_Error << "Error processing workspace with the plugin\n"; } + } + else if (plugin->hasCapability(ITrackerPlugin::ECapabilities::Tracks)) + { + // @note since the different jobs handle different tracks, we don't do locking here. + for (size_t trackIndex = 0; trackIndex < getWorkspace().getNumTracks(); ++trackIndex) + { + ITrackerPlugin* pluginCopy = getTrackerPlugins().getPluginCopy(index); + + Workspace& ws = getWorkspace(); + const Kernel::IKernelContext& ctx = getKernelContext(); + + auto job = [pluginCopy,&ws,&ctx,trackIndex](uint32_t /*threadNumber*/) + { + StreamBundle* sourceTrack; + if (ws.getMemorySaveMode()) + { + ctx.getLogManager() << Kernel::LogLevel_Info << "Loading " << ws.getTrack(trackIndex)->getSource().c_str() + << " from file\n"; + + sourceTrack = readStreamBundleFromFile(ctx, + ws.getTrack(trackIndex)->getSource().c_str(), false); + } + else { sourceTrack = ws.getTrack(trackIndex); } + + + if (!pluginCopy->process(*sourceTrack)) + { + // log() << Kernel::LogLevel_Error << "Error processing track << " << (i + 1) << " with the plugin\n"; + // retVal = false; + } + delete pluginCopy; + + if (ws.getMemorySaveMode()) + { + if (sourceTrack->getDirtyBit()) + { + // @fixme not a good solution with the filenaming; rethink the whole thing + + std::stringstream ss; + ss << ws.getWorkingPath() << "/workspace-track-" << (trackIndex + 1) << ".ov"; + + // In this mode, sourceTrack is not from the track array. We spool it to disk, then + // set the filename of the track in the array, and reload it back. + saveStreamBundleToFile(ctx, sourceTrack, ss.str().c_str()); + ws.getTrack(trackIndex)->setSource(ss.str()); + ws.reloadTrack(trackIndex); + } + + delete sourceTrack; + } + }; + + m_executor.pushJob(job); + + // @todo copy sourcetrack, process the copy, if the processing is + // successful then replace the original (or not) depending on inplacemode setting + + if (m_executor.getNumThreads() == 1) { m_executor.waitForAll(); } + } + // @todo in principle there's no need to freeze the GUI meanwhile, but allowing it to run in the bg would require locking + m_executor.waitForAll(); + } + else { log() << Kernel::LogLevel_Error << "Plugin does not have any known capabilities and cannot be run.\n"; } + + // pBoxAlgorithmDescriptor->release(); + + return retVal; +} + +bool CTracker::setNumThreads(uint32_t numThreads) +{ + if (numThreads != m_executor.getNumThreads()) + { + if (numThreads < 1) + { + log() << Kernel::LogLevel_Warning << "Minimum number of threads is 1, setting that.\n"; + numThreads = 1; + } + else if (numThreads > 1) + { + log() << Kernel::LogLevel_Info << "Using " << numThreads << + " threads. Concurrency control has not been carefully tested. If you notice issues, switch to 1 thread.\n"; + } + m_executor.uninitialize(); + return m_executor.initialize(numThreads); + } + + return true; +} + +bool CTracker::loadConfig(const CString& filename) +{ + if (!m_kernelCtx.getConfigurationManager().addConfigurationFromFile(filename)) + { + m_executor.initialize(1); + + return false; + } + + const uint32_t numThreads = uint32_t(m_kernelCtx.getConfigurationManager().expandAsUInteger("${Tracker_NumThreads}", 1)); + m_executor.initialize(numThreads); + // m_Executor.launchTest(); + + const CString workspaceFile = m_kernelCtx.getConfigurationManager().expand("${Tracker_Last_Workspace}"); + + //if (m_kernelCtx.getConfigurationManager().lookUpConfigurationTokenIdentifier("Tracker_Last_Workspace")) + // != CIdentifier::undefined()) + //{ + // m_Workspace.load(m_kernelCtx.getConfigurationManager().expand("${Tracker_Last_Workspace}"); + // Tracker_Last_Workspace + // ) + if (workspaceFile.length() != 0) { return m_workspace.load(workspaceFile.toASCIIString()); } + + return false; +} + +// @note : does not save the workspace itself +bool CTracker::saveConfig(const CString& filename) const +{ + FILE* file = fopen(filename, "wt"); + if (file) + { + fprintf(file, "# Configuration file for OpenViBE Tracker, autosaved on Tracker exit\n"); + fprintf(file, "#\n"); + fprintf(file, "\n"); + fprintf(file, "# Last settings used in the Tracker\n"); + fprintf(file, "Tracker_Last_Workspace = %s\n", m_workspace.getFilename().toASCIIString()); + fprintf(file, "Tracker_NumThreads = %d\n", m_executor.getNumThreads()); + + fclose(file); + } + else { return false; } + + return true; +} + +#if 0 +void testCode() +{ + Workspace wp(*kernelWrapper.m_kernelCtx); + +// TestClass tmp(*kernelWrapper.m_kernelCtx); + +/* + + const CString eegFile = Directories::getDataDir() + CString("/scenarios/signals/bci-motor-imagery.ov"); +// const CString eegFile = CString("E:/jl/noise-test.ov"); + const CString scenarioFile = Directories::getDataDir() + CString("/applications/tracker/tracker-debug-display.xml"); + + if(!wp.setTrack(eegFile.toASCIIString())) { return 2; } + if(!wp.setprocessor(scenarioFile.toASCIIString())) { return 3; } + + // Push some chunks to selection + Selection& selection = wp.m_track.m_Selection; + selection.addRange(Range(3,5)); + selection.addRange(Range(9,11)); + + if(!wp.play()) { return 4; } +*/ +} +#endif + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecChannelLocalization.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecChannelLocalization.cpp new file mode 100755 index 0000000..ac7b3c6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecChannelLocalization.cpp @@ -0,0 +1,55 @@ +#include +#include + +#include "TypeChannelLocalization.h" + +#include "Decoder.h" +#include "Encoder.h" + +namespace OpenViBE { +namespace Tracker { +template <> +bool DecoderAdapter>::getHeaderImpl( + TypeChannelLocalization::Header& h) +{ + h.m_Dynamic = m_impl.getOutputDynamic(); + + CMatrix* decoded = m_impl.getOutputMatrix(); + h.m_Header.copy(*decoded); + + return true; +} + +template <> +bool DecoderAdapter>::getBufferImpl( + TypeChannelLocalization::Buffer& b) +{ + CMatrix* decoded = m_impl.getOutputMatrix(); + b.m_buffer.copy(*decoded); + + return true; +} + +template <> +bool EncoderAdapter>::encodeHeaderImpl( + const TypeChannelLocalization::Header& hdr) +{ + m_impl.getInputDynamic() = hdr.m_Dynamic; + + CMatrix* header = m_impl.getInputMatrix(); + header->copy(hdr.m_Header); + + return m_impl.encodeHeader(); +} + +template <> +bool EncoderAdapter>::encodeBufferImpl( + const TypeChannelLocalization::Buffer& buf) +{ + CMatrix* buffer = m_impl.getInputMatrix(); + buffer->copy(buf.m_buffer); + + return m_impl.encodeBuffer(); +} +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecChannelUnits.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecChannelUnits.cpp new file mode 100755 index 0000000..6f567e1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecChannelUnits.cpp @@ -0,0 +1,51 @@ +#include +#include + +#include "TypeChannelUnits.h" + +#include "Decoder.h" +#include "Encoder.h" + +namespace OpenViBE { +namespace Tracker { +template <> +bool DecoderAdapter>::getHeaderImpl(TypeChannelUnits::Header& h) +{ + h.m_Dynamic = m_impl.getOutputDynamic(); + + CMatrix* decoded = m_impl.getOutputMatrix(); + h.m_Header.copy(*decoded); + + return true; +} + +template <> +bool DecoderAdapter>::getBufferImpl(TypeChannelUnits::Buffer& b) +{ + CMatrix* decoded = m_impl.getOutputMatrix(); + b.m_buffer.copy(*decoded); + + return true; +} + +template <> +bool EncoderAdapter>::encodeHeaderImpl(const TypeChannelUnits::Header& hdr) +{ + m_impl.getInputDynamic() = hdr.m_Dynamic; + + CMatrix* header = m_impl.getInputMatrix(); + header->copy(hdr.m_Header); + + return m_impl.encodeHeader(); +} + +template <> +bool EncoderAdapter>::encodeBufferImpl(const TypeChannelUnits::Buffer& buf) +{ + CMatrix* buffer = m_impl.getInputMatrix(); + buffer->copy(buf.m_buffer); + + return m_impl.encodeBuffer(); +} +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecExperimentInfo.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecExperimentInfo.cpp new file mode 100644 index 0000000..4174984 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecExperimentInfo.cpp @@ -0,0 +1,68 @@ +#include +#include + +#include "TypeExperimentInfo.h" + +#include "Decoder.h" +#include "Encoder.h" + +namespace OpenViBE { +namespace Tracker { +template <> +bool DecoderAdapter>::getHeaderImpl( + TypeExperimentInfo::Header& h) +{ + h.m_ExperimentID = m_impl.getOutputExperimentID(); + h.m_ExperimentDate = (*m_impl.getOutputExperimentDate()).toASCIIString(); + + h.m_SubjectID = m_impl.getOutputSubjectID(); + h.m_SubjectName = (*m_impl.getOutputSubjectName()).toASCIIString(); + h.m_SubjectAge = m_impl.getOutputSubjectAge(); + h.m_SubjectGender = m_impl.getOutputSubjectGender(); + + h.m_LaboratoryID = m_impl.getOutputLaboratoryID(); + h.m_LaboratoryName = (*m_impl.getOutputLaboratoryName()).toASCIIString(); + h.m_TechnicianID = m_impl.getOutputTechnicianID(); + h.m_TechnicianName = (*m_impl.getOutputTechnicianName()).toASCIIString(); + + return true; +} + +template <> +bool DecoderAdapter>::getBufferImpl(TypeExperimentInfo::Buffer& /*b*/) +{ + // Should be no buffer in the experiment stream + return true; +} + +template <> +bool EncoderAdapter>::encodeHeaderImpl( + const TypeExperimentInfo::Header& hdr) +{ + // @fixme the new() calls may imply memory leaks, a bit odd the codec takes pointers + m_impl.getInputExperimentID() = hdr.m_ExperimentID; + m_impl.getInputExperimentDate() = new CString(hdr.m_ExperimentDate.c_str()); + + m_impl.getInputSubjectID() = hdr.m_SubjectID; + m_impl.getInputSubjectName() = new CString(hdr.m_SubjectName.c_str()); + m_impl.getInputSubjectAge() = hdr.m_SubjectAge; + m_impl.getInputSubjectGender() = hdr.m_SubjectGender; + + m_impl.getInputLaboratoryID() = hdr.m_LaboratoryID; + m_impl.getInputLaboratoryName() = new CString(hdr.m_LaboratoryName.c_str()); + m_impl.getInputTechnicianID() = hdr.m_TechnicianID; + m_impl.getInputTechnicianName() = new CString(hdr.m_TechnicianName.c_str()); + + return m_impl.encodeHeader(); +} + + +template <> +bool EncoderAdapter>::encodeBufferImpl( + const TypeExperimentInfo::Buffer& /*buf*/) +{ + // Should be no buffer in the experiment stream + return m_impl.encodeBuffer(); +} +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecFeatureVector.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecFeatureVector.cpp new file mode 100755 index 0000000..a6b6bf2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecFeatureVector.cpp @@ -0,0 +1,52 @@ +// @todo this is identical to CodecFeatureMatrix. Refactor? + +#include +#include + +#include "TypeFeatureVector.h" + +#include "Decoder.h" +#include "Encoder.h" + +namespace OpenViBE { +namespace Tracker { +template <> +bool DecoderAdapter>::getHeaderImpl(TypeFeatureVector::Header& h) +{ + CMatrix* decoded = m_impl.getOutputMatrix(); + h.m_Header.copy(*decoded); + + return true; +} + +template <> +bool DecoderAdapter>::getBufferImpl(TypeFeatureVector::Buffer& b) +{ + const CMatrix* decoded = m_impl.getOutputMatrix(); + b.m_buffer.copy(*decoded); + + return true; +} + +template <> +bool EncoderAdapter>::encodeHeaderImpl( + const TypeFeatureVector::Header& hdr) +{ + CMatrix* buffer = m_impl.getInputMatrix(); + buffer->copy(hdr.m_Header); + + return m_impl.encodeHeader(); +} + +template <> +bool EncoderAdapter>::encodeBufferImpl( + const TypeFeatureVector::Buffer& buf) +{ + CMatrix* buffer = m_impl.getInputMatrix(); + + buffer->copy(buf.m_buffer); + + return m_impl.encodeBuffer(); +} +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecMatrix.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecMatrix.cpp new file mode 100755 index 0000000..86129cc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecMatrix.cpp @@ -0,0 +1,48 @@ +#include +#include + +#include "TypeMatrix.h" + +#include "Decoder.h" +#include "Encoder.h" + +namespace OpenViBE { +namespace Tracker { +template <> +bool DecoderAdapter>::getHeaderImpl(TypeMatrix::Header& h) +{ + CMatrix* decoded = m_impl.getOutputMatrix(); + h.m_Header.copy(*decoded); + + return true; +} + + +template <> +bool DecoderAdapter>::getBufferImpl(TypeMatrix::Buffer& b) +{ + const CMatrix* decoded = m_impl.getOutputMatrix(); + b.m_buffer.copy(*decoded); + + return true; +} + +template <> +bool EncoderAdapter>::encodeHeaderImpl(const TypeMatrix::Header& hdr) +{ + CMatrix* header = m_impl.getInputMatrix(); + header->copy(hdr.m_Header); + + return m_impl.encodeHeader(); +} + +template <> +bool EncoderAdapter>::encodeBufferImpl(const TypeMatrix::Buffer& buf) +{ + CMatrix* buffer = m_impl.getInputMatrix(); + buffer->copy(buf.m_buffer); + + return m_impl.encodeBuffer(); +} +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecSignal.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecSignal.cpp new file mode 100755 index 0000000..de23eaf --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecSignal.cpp @@ -0,0 +1,51 @@ +#include +#include + +#include "TypeSignal.h" + +#include "Decoder.h" +#include "Encoder.h" + +namespace OpenViBE { +namespace Tracker { +template <> +bool DecoderAdapter>::getHeaderImpl(TypeSignal::Header& h) +{ + h.m_Sampling = m_impl.getOutputSamplingRate(); + + CMatrix* decoded = m_impl.getOutputMatrix(); + h.m_Header.copy(*decoded); + + return true; +} + +template <> +bool DecoderAdapter>::getBufferImpl(TypeSignal::Buffer& b) +{ + const CMatrix* decoded = m_impl.getOutputMatrix(); + b.m_buffer.copy(*decoded); + + return true; +} + +template <> +bool EncoderAdapter>::encodeHeaderImpl(const TypeSignal::Header& hdr) +{ + m_impl.getInputSamplingRate() = hdr.m_Sampling; + + CMatrix* header = m_impl.getInputMatrix(); + header->copy(hdr.m_Header); + + return m_impl.encodeHeader(); +} + +template <> +bool EncoderAdapter>::encodeBufferImpl(const TypeSignal::Buffer& buf) +{ + CMatrix* buffer = m_impl.getInputMatrix(); + buffer->copy(buf.m_buffer); + + return m_impl.encodeBuffer(); +} +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecSpectrum.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecSpectrum.cpp new file mode 100755 index 0000000..37b0715 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecSpectrum.cpp @@ -0,0 +1,58 @@ +#include +#include + +#include "TypeSpectrum.h" + +#include "Decoder.h" +#include "Encoder.h" + +namespace OpenViBE { +namespace Tracker { +template <> +bool DecoderAdapter>::getHeaderImpl(TypeSpectrum::Header& h) +{ + CMatrix* decoded = m_impl.getOutputMatrix(); + h.m_Header.copy(*decoded); + + h.m_Sampling = m_impl.getOutputSamplingRate(); + + CMatrix* abscissas = m_impl.getOutputFrequencyAbscissa(); + h.m_Abscissas.copy(*abscissas); + + return true; +} + +template <> +bool DecoderAdapter>::getBufferImpl(TypeSpectrum::Buffer& b) +{ + const CMatrix* decoded = m_impl.getOutputMatrix(); + + b.m_buffer.copy(*decoded); + + return true; +} + +template <> +bool EncoderAdapter>::encodeHeaderImpl(const TypeSpectrum::Header& hdr) +{ + m_impl.getInputSamplingRate() = hdr.m_Sampling; + + CMatrix* header = m_impl.getInputMatrix(); + header->copy(hdr.m_Header); + + CMatrix* abscissas = m_impl.getInputFrequencyAbscissa(); + abscissas->copy(hdr.m_Abscissas); + + return m_impl.encodeHeader(); +} + +template <> +bool EncoderAdapter>::encodeBufferImpl(const TypeSpectrum::Buffer& buf) +{ + CMatrix* buffer = m_impl.getInputMatrix(); + buffer->copy(buf.m_buffer); + + return m_impl.encodeBuffer(); +} +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecStimulation.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecStimulation.cpp new file mode 100755 index 0000000..bba5570 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/CodecStimulation.cpp @@ -0,0 +1,50 @@ +#include +#include + +#include "TypeStimulation.h" + +#include "Decoder.h" +#include "Encoder.h" + +namespace OpenViBE { +namespace Tracker { + +template <> +bool DecoderAdapter>::getHeaderImpl(TypeStimulation::Header& /*target*/) { return true; } + +template <> +bool DecoderAdapter>::getBufferImpl(TypeStimulation::Buffer& b) +{ + IStimulationSet* decoded = m_impl.getOutputStimulationSet(); + + b.m_buffer.clear(); + for (size_t i = 0; i < decoded->getStimulationCount(); ++i) + { + b.m_buffer.appendStimulation(decoded->getStimulationIdentifier(i), decoded->getStimulationDate(i), decoded->getStimulationDuration(i)); + } + return true; +} + +template <> +bool EncoderAdapter>::encodeHeaderImpl(const TypeStimulation::Header& /*hdr*/) +{ + return m_impl.encodeHeader(); +} + +template <> +bool EncoderAdapter>::encodeBufferImpl(const TypeStimulation::Buffer& buf) +{ + IStimulationSet* inputSet = m_impl.getInputStimulationSet(); + + inputSet->clear(); + for (size_t i = 0; i < buf.m_buffer.getStimulationCount(); ++i) + { + inputSet->appendStimulation(buf.m_buffer.getStimulationIdentifier(i), buf.m_buffer.getStimulationDate(i) + m_offset.time(), + buf.m_buffer.getStimulationDuration(i)); + } + + return m_impl.encodeBuffer(); +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/Demuxer.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/Demuxer.cpp new file mode 100755 index 0000000..9c25c9a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/Demuxer.cpp @@ -0,0 +1,184 @@ +// +// @note some ov files which have lots of stimulation chunks take long time to import +// when launching tracker from visual studio. this is probably due to memory allocation, similar to slow simple dsp grammar parsing. +// +#include "Demuxer.h" + +#include +#include +#include +#include + +#include "../../../../plugins/processing/file-io/src/ovp_defines.h" + +#include +#include + +#include + +#include "Stream.h" + +#include "CodecFactory.h" + +namespace OpenViBE { +namespace Tracker { + +bool Demuxer::initialize() +{ + // log() << Kernel::LogLevel_Info << "Source: Initializing with " << signalFile << "\n"; + + m_chunksSent = 0; + m_pending = false; + m_target.setSource(m_origin.getSource()); + return true; +} + +bool Demuxer::uninitialize() const +{ + log() << Kernel::LogLevel_Info << "Source: Uninitializing\n"; + m_origin.uninitialize(); + return true; +} + +// bool Demuxer::pullChunk(MemoryBufferWithType& output) +bool Demuxer::step() +{ + // log() << Kernel::LogLevel_Info << "Source: Trying to pull a chunk\n"; + + while (!m_origin.isEOF()) + { + while (!m_origin.isEOF() && m_reader.getCurrentNodeID() == EBML::CIdentifier()) + { + std::vector bytes; + m_origin.read(bytes, 1); + + //OV_ERROR_UNLESS_KRF(s == 1 || justStarted, "Unexpected EOF in " << m_filename, Kernel::ErrorType::BadParsing); + if (!bytes.empty()) { m_reader.processData(&bytes[0], bytes.size()); } + } + if (!m_origin.isEOF() && m_reader.getCurrentNodeSize() != 0) + { + std::vector bytes; + m_origin.read(bytes, size_t(m_reader.getCurrentNodeSize())); + + //OV_ERROR_UNLESS_KRF(s == m_swap.getSize(), "Unexpected EOF in " << m_filename, Kernel::ErrorType::BadParsing); + + m_pendingChunk.m_Buffer.resize(0); + m_pendingChunk.m_StartTime = CTime::max(); + m_pendingChunk.m_EndTime = CTime::max(); + m_pendingChunk.m_StreamIndex = std::numeric_limits::max(); + + m_reader.processData(&bytes[0], bytes.size()); + } + + if (m_pending) + { + // We have dada + // log() << Kernel::LogLevel_Info << "Source: Found a chunk, queueing\n"; + const size_t streamIndex = m_pendingChunk.m_StreamIndex; + + m_pending = false; + + const StreamPtr stream = m_target.getStream(streamIndex); + if (!stream) + { + log() << Kernel::LogLevel_Error << "Error: Trying to decode stream without creating it first (buffer before header in EBML?)\n"; + return false; + } + m_decoders[streamIndex]->decode(m_pendingChunk); + + return true; + } + } + + if (m_origin.isEOF()) { log() << Kernel::LogLevel_Trace << "Source file EOF reached\n"; } + else { log() << Kernel::LogLevel_Warning << "Issue with source file\n"; } + + return false; +} + +bool Demuxer::isMasterChild(const EBML::CIdentifier& identifier) +{ + if (identifier == EBML_Identifier_Header) { return true; } + if (identifier == OVP_NodeId_OpenViBEStream_Header) { return true; } + if (identifier == OVP_NodeId_OpenViBEStream_Header_Compression) { return false; } + if (identifier == OVP_NodeId_OpenViBEStream_Header_StreamType) { return false; } + if (identifier == OVP_NodeId_OpenViBEStream_Buffer) { return true; } + if (identifier == OVP_NodeId_OpenViBEStream_Buffer_StreamIndex) { return false; } + if (identifier == OVP_NodeId_OpenViBEStream_Buffer_StartTime) { return false; } + if (identifier == OVP_NodeId_OpenViBEStream_Buffer_EndTime) { return false; } + if (identifier == OVP_NodeId_OpenViBEStream_Buffer_Content) { return false; } + return false; +} + +void Demuxer::openChild(const EBML::CIdentifier& identifier) +{ + m_nodes.push(identifier); + + EBML::CIdentifier& top = m_nodes.top(); + + if (top == EBML_Identifier_Header) { m_hasEBMLHeader = true; } + if (top == OVP_NodeId_OpenViBEStream_Header) + { + if (!m_hasEBMLHeader) + { + //this->getLogManager() << Kernel::LogLevel_Info << "The file " << m_filename << " uses an outdated (but still compatible) version of the .ov file format\n"; + } + } + if (top == OVP_NodeId_OpenViBEStream_Header) + { + m_streamIdxToOutputIdxs.clear(); + m_streamIdxToTypeIDs.clear(); + } +} + +void Demuxer::processChildData(const void* buffer, const size_t size) +{ + EBML::CIdentifier& top = m_nodes.top(); + + // Uncomment this when ebml version will be used + //if(top == EBML_Identifier_EBMLVersion) { const uint64_t versionNumber=(uint64_t)m_readerHelper.getUInt(buffer, size); } + + if (top == OVP_NodeId_OpenViBEStream_Header_Compression) + { + //if (m_readerHelper.getUInt(buffer, size) != 0) { OV_WARNING_K("Impossible to use compression as it is not yet implemented"); } + } + else if (top == OVP_NodeId_OpenViBEStream_Header_StreamType) + { + const uint64_t typeID = m_readerHelper.getUInt(buffer, size); + const size_t index = m_target.getNumStreams(); + m_target.createStream(index, typeID); + DecoderBase* decoder = CodecFactory::getDecoder(m_kernelCtx, *m_target.getStream(index)); + m_decoders.push_back(decoder); + } + else if (top == OVP_NodeId_OpenViBEStream_Buffer_StreamIndex) + { + // @note if trying to do -1 to map to [0,...] convention, something breaks + m_pendingChunk.m_StreamIndex = size_t(m_readerHelper.getUInt(buffer, size)); + //log() << Kernel::LogLevel_Info << "Run into index " << m_pendingChunk.streamIndex << "\n"; + } + else if (top == OVP_NodeId_OpenViBEStream_Buffer_StartTime) { m_pendingChunk.m_StartTime = m_readerHelper.getUInt(buffer, size); } + else if (top == OVP_NodeId_OpenViBEStream_Buffer_EndTime) { m_pendingChunk.m_EndTime = m_readerHelper.getUInt(buffer, size); } + else if (top == OVP_NodeId_OpenViBEStream_Buffer_Content) + { + m_pendingChunk.m_Buffer.resize(size_t(size)); + memcpy(&m_pendingChunk.m_Buffer[0], reinterpret_cast(buffer), size_t(size)); + } +} + +void Demuxer::closeChild() +{ + EBML::CIdentifier& top = m_nodes.top(); + + if (top == OVP_NodeId_OpenViBEStream_Header) { } // Assign file streams to outputs here + + if (top == OVP_NodeId_OpenViBEStream_Buffer) + { + m_pending = ((m_pendingChunk.m_StreamIndex != std::numeric_limits::max()) && + (m_pendingChunk.m_StartTime != CTime::max()) && (m_pendingChunk.m_EndTime != CTime::max())); + } + + m_nodes.pop(); +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/GUI.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/GUI.cpp new file mode 100644 index 0000000..3f7dac7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/GUI.cpp @@ -0,0 +1,1869 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// +// @todo connect all the vertical and horizontal sliders and scales +// @todo make horizontal scale related to seconds rather than chunks +// @todo add rulers +// @todo need a much more clear design to handle multiple tracks with multiple streams of different sizes + +#include +#include +#include +#include +#include // std::setlocale +#include // strchr on Ubuntu +#include + +#include +#include + +#include +#include +#include + +#include "GUI.h" + +#include "ovdCBoxConfigurationDialog.h" +#include "ovdCCommentEditorDialog.h" +#include "Stream.h" +#include "StreamBundle.h" +#include "StreamRendererFactory.h" + +#include "TypeError.h" + +namespace OpenViBE { +namespace Tracker { + +// These take in a string identidifer as MENUCHOICE to be given to builder. Return FALSE from callbacks so they don't block further signal handlers. +#define GTK_CALLBACK_MAPPER(MENUCHOICE, ACTION, MEMBERFUN) \ + auto MEMBERFUN = [](GtkWidget* pMenuItem, gpointer data) -> gboolean { static_cast(data)->MEMBERFUN(); return FALSE; }; \ + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_interface, MENUCHOICE)), \ + ACTION, G_CALLBACK((gboolean(*)(GtkWidget* pMenuItem, gpointer data)) ( MEMBERFUN ) ), this); +#define GTK_CALLBACK_MAPPER_PARAM(MENUCHOICE, ACTION, MEMBERFUN) \ + auto MEMBERFUN = [](GtkWidget* pMenuItem, gpointer data) -> gboolean { static_cast(data)->MEMBERFUN(pMenuItem); return FALSE; }; \ + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_interface, MENUCHOICE)), \ + ACTION, G_CALLBACK((gboolean(*)(GtkWidget* pMenuItem, gpointer data)) ( MEMBERFUN ) ), this); +// These work on gtk objects directly, used when menus are constructed in code, not in .ui file +#define GTK_CALLBACK_MAPPER_OBJECT(MENUOBJECT, ACTION, MEMBERFUN) \ + auto MEMBERFUN = [](GtkWidget* pMenuItem, gpointer data) -> gboolean { static_cast(data)->MEMBERFUN(); return FALSE; }; \ + g_signal_connect(GTK_OBJECT(MENUOBJECT), ACTION, G_CALLBACK((gboolean(*)(GtkWidget* pMenuItem, gpointer data)) MEMBERFUN), this); +#define GTK_CALLBACK_MAPPER_OBJECT_PARAM(MENUOBJECT, ACTION, MEMBERFUN) \ + auto MEMBERFUN = [](GtkWidget* pMenuItem, gpointer data) -> gboolean { static_cast(data)->MEMBERFUN(pMenuItem); return FALSE; }; \ + g_signal_connect(GTK_OBJECT(MENUOBJECT), ACTION, G_CALLBACK((gboolean(*)(GtkWidget* pMenuItem, gpointer data)) MEMBERFUN), this); + +GUI::~GUI() +{ + clearRenderers(); + + if (m_logListener) + { + Contexted::getLogManager().removeListener(m_logListener); + delete m_logListener; + } +} + +GUI::GUI(int argc, char* argv[], CTracker& app) : Contexted(app.getKernelContext()), m_tracker(app) +{ + gtk_init(&argc, &argv); + + // We rely on this with 64bit/gtk 2.24, to roll back gtk_init() sometimes switching + // the locale to one where ',' is needed instead of '.' for separators of floats, + // causing issues, for example getConfigurationManager.expandAsFloat("0.05") -> 0; + // due to implementation by std::stod(). + std::setlocale(LC_ALL, "C"); + + m_interface = gtk_builder_new(); + const CString filename = Directories::getDataDir() + "/applications/tracker/tracker.ui"; + if (!gtk_builder_add_from_file(m_interface, filename, nullptr)) + { + std::cout << "Problem loading [" << filename << "]\n"; + return; + } + + m_mainWindow = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker")); + + // Tricky getting the quit handler properly in this case, note the different CB params. + auto quitFun = [](GtkWidget* /*menuItem*/, GdkEventKey* /*e*/, gpointer data) { return gboolean(static_cast(data)->quitCB()); }; + typedef gboolean quit_handler_t(GtkWidget* pMenuItem, GdkEventKey* e, gpointer data); + g_signal_connect(G_OBJECT(m_mainWindow), "delete_event", G_CALLBACK( static_cast(quitFun)), this); + + m_scrollbar = GTK_WIDGET(gtk_builder_get_object(m_interface, "hscrollbar1")); + m_scale = GTK_WIDGET(gtk_builder_get_object(m_interface, "hscale1")); + m_timeDisplay = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-label_current_time")); + m_trackCounter = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-label_trackno")); + m_workspaceLabel = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-workspace_label")); + + gtk_range_set_range(GTK_RANGE(m_scale), 1, 60 * 60); // from 1 sec to 1 hour + + gtk_builder_connect_signals(m_interface, nullptr); + + auto idleFun = [](gpointer data) -> gboolean + { + static_cast(data)->step(); + return TRUE; + }; + g_idle_add(idleFun, this); + + // Register callbacks only after we've done all the initializations + + // Menu callbacks + GTK_CALLBACK_MAPPER("tracker-menu_open_file", "activate", addTrackCB); + GTK_CALLBACK_MAPPER("tracker-menu_open_workspace", "activate", openWorkspaceCB); + GTK_CALLBACK_MAPPER("tracker-menu_open_processor", "activate", openProcessorCBFinal); + GTK_CALLBACK_MAPPER("tracker-menu_clear", "activate", clearCB); + GTK_CALLBACK_MAPPER("tracker-menu_save", "activate", saveCB); + GTK_CALLBACK_MAPPER("tracker-menu_saveas", "activate", saveAsCB); + GTK_CALLBACK_MAPPER("tracker-menu_incrementrevsave", "activate", incrementRevSaveCB); + GTK_CALLBACK_MAPPER("tracker-menu_quit", "activate", quitCB); + + GTK_CALLBACK_MAPPER("tracker-menu_select", "activate", editSelectionCB); + GTK_CALLBACK_MAPPER("tracker-menu_select_all", "activate", selectAllCB); + GTK_CALLBACK_MAPPER("tracker-menu_select_none", "activate", selectNoneCB); + + GTK_CALLBACK_MAPPER("tracker-menu_processor_preferences", "activate", processorPreferencesCB); + GTK_CALLBACK_MAPPER("tracker-menu_workspace_notes", "activate", editNotesCB); + GTK_CALLBACK_MAPPER("tracker-menu_delete_all", "activate", deleteAllTracksCB); + + GTK_CALLBACK_MAPPER("tracker-menu_workspace_about", "activate", workspaceInfoCB); + GTK_CALLBACK_MAPPER("tracker-menu_about", "activate", aboutCB); + + GTK_CALLBACK_MAPPER_PARAM("hscrollbar1", "value-changed", hScrollCB); + GTK_CALLBACK_MAPPER_PARAM("hscale1", "value-changed", hScaleCB); + + // Buttons + GTK_CALLBACK_MAPPER("tracker-button_notes", "clicked", editNotesCB2); + GTK_CALLBACK_MAPPER("tracker-button_play_pause", "clicked", playCB); + GTK_CALLBACK_MAPPER("tracker-button_forward", "clicked", playFastCB); + GTK_CALLBACK_MAPPER("tracker-button_stop", "clicked", stopCB); + + GTK_CALLBACK_MAPPER("tracker-select_tracks", "clicked", editSelectionCB2); + GTK_CALLBACK_MAPPER("tracker-processor_properties", "clicked", processorEditCB); + + GTK_CALLBACK_MAPPER("tracker-processor_choose", "clicked", openProcessorCB); + GTK_CALLBACK_MAPPER("tracker-processor_edit2", "clicked", processorEditCB2); + GTK_CALLBACK_MAPPER("processorpreferences-button_ok", "clicked", processorPreferencesButtonOkCB); + GTK_CALLBACK_MAPPER("processorpreferences-button_cancel", "clicked", processorPreferencesButtonCancelCB); + GTK_CALLBACK_MAPPER("trackerpreferences-workspace_path-choose", "clicked", selectWorkspacePathCB); + + + // Attach a log listener + m_logListener = new CLogListenerTracker(Contexted::getKernelContext(), m_interface); + // m_pLogListener->m_CenterOnBoxFun = [this](CIdentifier& id) { this->getCurrentInterfacedScenario()->centerOnBox(id); }; + Contexted::getLogManager().addListener(m_logListener); + GTK_CALLBACK_MAPPER("openvibe-messages_tb_clear", "clicked", clearMessagesCB); + // Enable the default buttons + GtkWidget* buttonActiveInfo = GTK_WIDGET(gtk_builder_get_object(m_interface, "openvibe-messages_tb_info")); + GtkWidget* buttonActiveWarning = GTK_WIDGET(gtk_builder_get_object(m_interface, "openvibe-messages_tb_warning")); + GtkWidget* buttonActiveImportantWarning = GTK_WIDGET(gtk_builder_get_object(m_interface, "openvibe-messages_tb_impwarning")); + GtkWidget* buttonActiveError = GTK_WIDGET(gtk_builder_get_object(m_interface, "openvibe-messages_tb_error")); + GtkWidget* buttonActiveFatal = GTK_WIDGET(gtk_builder_get_object(m_interface, "openvibe-messages_tb_fatal")); + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(buttonActiveInfo), true); + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(buttonActiveWarning), true); + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(buttonActiveImportantWarning), true); + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(buttonActiveError), true); + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(buttonActiveFatal), true); + + std::string title(gtk_window_get_title(GTK_WINDOW(m_mainWindow))); + title += " v" + std::string(OV_VERSION_MAJOR) + "." + std::string(OV_VERSION_MINOR) + "." + std::string(OV_VERSION_PATCH); +#if defined(TARGET_ARCHITECTURE_x64) + title += " (64bit)"; +#else + title += " (32bit)"; +#endif + gtk_window_set_title(GTK_WINDOW(m_mainWindow), title.c_str()); + gtk_widget_show(m_mainWindow); +} + +bool GUI::clearRenderers() +{ + GtkWidget* trackTable = GTK_WIDGET(gtk_builder_get_object(m_interface, "table_tracks")); + + for (auto trk : m_tracks) + { + // To avoid issues, we delete everything first before detaching the widget + GtkWidget* frame = trk->m_Frame; + + delete trk; + + if (frame) { gtk_container_remove(GTK_CONTAINER(trackTable), frame); } + } + + m_tracks.clear(); + + return true; +} + + +bool GUI::initializeRenderers() +{ + clearRenderers(); + + const size_t numTracks = m_tracker.getWorkspace().getNumTracks(); + + if (numTracks == 0) + { + addTracksToMenu(); + resetWidgetProperties(); + m_requestRedraw = true; + return true; + } + + const bool showSelectedOnly = m_kernelCtx.getConfigurationManager().expandAsBoolean("${Tracker_Workspace_GUI_ShowSelectedOnly}", false); + const uint32_t maxRendererCount = uint32_t(m_kernelCtx.getConfigurationManager().expandAsUInteger("${Tracker_Workspace_GUI_MaxRendererCount}", 32)); + std::stringstream ss; + ss << maxRendererCount; + m_kernelCtx.getConfigurationManager().addOrReplaceConfigurationToken("Tracker_Workspace_GUI_MaxRendererCount", ss.str().c_str()); // If it didn't exist + + + GtkWidget* trackTable = GTK_WIDGET(gtk_builder_get_object(m_interface, "table_tracks")); + + gtk_table_resize(GTK_TABLE(trackTable), guint(numTracks), 1); + + uint32_t renderersAllocated = 0; + + for (size_t i = 0; i < numTracks; ++i) + { + const StreamBundle* bundle = m_tracker.getWorkspace().getTrack(i); + const size_t numStreams = (bundle ? bundle->getNumStreams() : 1); + GUITrack* track = new GUITrack(); + GtkWidget* streamTable = gtk_table_new(1, 2, false); + + m_tracks.push_back(track); + + if (numStreams == 0) + { + std::cout << "Track " << i + 1 << " has no streams\n"; + continue; + } + + std::stringstream title; + title << "Track " << (i + 1) << " : " << (bundle ? bundle->getSource() : "Unknown") << (bundle->getDirtyBit() ? " (unsaved)" : " (on disk)"); + + if (!showSelectedOnly || m_tracker.getWorkspace().getSelection().countSelectedStreams(i) > 0) + { + track->m_Frame = gtk_frame_new(title.str().c_str()); + gtk_container_add(GTK_CONTAINER(track->m_Frame), streamTable); + gtk_table_attach_defaults(GTK_TABLE(trackTable), track->m_Frame, 0, 1, guint(i), guint(i + 1)); + gtk_table_set_row_spacing(GTK_TABLE(trackTable), guint(i), 0); + gtk_table_resize(GTK_TABLE(streamTable), guint(numStreams), 1); + } + + for (size_t j = 0; j < numStreams; ++j) + { + StreamPtrConst stream = (bundle ? bundle->getStream(j) : nullptr); + CIdentifier typeID = CIdentifier::undefined(); + + if (stream) { typeID = stream->getTypeIdentifier(); } + else { std::cout << "Stream " << j << " is null, using label...\n"; } + + log() << Kernel::LogLevel_Debug << "Building renderer for track " << i + 1 << " stream " << j + 1 << "\n"; + + StreamRendererBase* renderer; + if (showSelectedOnly && !stream->getSelected()) { renderer = StreamRendererFactory::getDummyRenderer(getKernelContext()); } + else if (m_tracker.getWorkspace().getMemorySaveMode() || renderersAllocated >= maxRendererCount) + { + StreamPtr empty = std::make_shared>(m_kernelCtx); + renderer = StreamRendererFactory::getRenderer(getKernelContext(), empty); + } + else + { + renderer = StreamRendererFactory::getRenderer(getKernelContext(), stream); + renderersAllocated++; + if (renderersAllocated == maxRendererCount) + { + log() << Kernel::LogLevel_Info << "Reached maximum " << maxRendererCount << " renderers, later streams will be shown as placeholders.\n"; + log() << Kernel::LogLevel_Info << + "This is a limitation in the current code and the fact that there is limited number of OpenGL contexts.\n"; + } + } + + if (renderer && renderer->initialize()) + { + if (stream) + { + std::stringstream ssTitle; + ssTitle << "Stream " << j + 1 << " : " + << getTypeManager().getTypeName(typeID).toASCIIString() + << ((stream->getOverlapping() || stream->getNoncontinuous()) ? " -- Warning: " : "") + << (stream->getOverlapping() ? "Overlapping " : "") + << (stream->getNoncontinuous() ? "Noncontinuous " : "") + << (renderersAllocated >= maxRendererCount ? " - all renderers in use" : ""); + + renderer->setTitle(ssTitle.str().c_str()); + } + else { renderer->setTitle("Unknown"); } + + std::stringstream prefix; + prefix << "Tracker_Workspace_GUI_Renderer" << "_Track_" << std::setw(3) << std::setfill('0') << (i + 1) + << "_Stream_" << std::setw(2) << std::setfill('0') << (j + 1); + renderer->restoreSettings(prefix.str()); + + if (renderer->getWidget()) // n.b. 'nothing' renderer does not have a widget + { + gtk_table_attach_defaults(GTK_TABLE(streamTable), renderer->getWidget(), 0, 1, guint(j), guint(j + 1)); + gtk_widget_unref(renderer->getWidget()); // we kept +1 ref so far to make sure gtk doesnt garbage collect it + } + renderer->realize(); + } + else + { + log() << Kernel::LogLevel_Error << "Error: Failed to initialize renderer for stream of type " << typeID << "\n"; + delete renderer; + renderer = nullptr; + } + + track->m_Renderers.push_back(renderer); + } + + gtk_widget_show(streamTable); + if (track->m_Frame) { gtk_widget_show(track->m_Frame); } + } + + if (m_tracker.getWorkspace().getMaxDuration() > CTime::min()) + { + gtk_range_set_range(GTK_RANGE(m_scrollbar), 0, m_tracker.getWorkspace().getMaxDuration().toSeconds()); + } + + + updateRulerState(); + + addTracksToMenu(); + + resetWidgetProperties(); + +#if defined(TARGET_OS_Windows) + // @note this block is a way avoid black rectangles appearing on Windows as a side effect of drawing. they do not appear on Linux, + // so it may be a gtk or at least a platform specific issue. + // Basically what this block does is to move the scrollbar to the top, close the expander, and then request them to be + // reseted to their original positions in a few frames after the content has been drawn. For some reason these actions 'repair' + // the drawing on Win (whereas just gtk_widget_queue_draw, gdk_window_invalidate_rect, etc do not seem to cut it). + // to reproduce the glitch on Windows: Disable this code. Have enough tracks so that some tracks are outside + // the view on the upper end of the viewport. Delete a visible track. A black rectangle will be drawn across the buttons. + + GtkWidget* scrollWin = GTK_WIDGET(gtk_builder_get_object(m_interface, "scrolledwindow-tracks")); + GtkAdjustment* adjust = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrollWin)); + m_hScrollBarValue = gtk_adjustment_get_value(adjust); + gtk_adjustment_set_value(adjust, 0); + + GtkWidget* expander = GTK_WIDGET(gtk_builder_get_object(m_interface, "openvibe-expander_messages")); + m_expanderOpen = (gtk_expander_get_expanded(GTK_EXPANDER(expander)) == TRUE ? true : false); + gtk_expander_set_expanded(GTK_EXPANDER(expander), false); + + m_requestResetInNFrames = 2; + + auto resetFun = [](gpointer data) -> gboolean + { + GUI* ptr = static_cast(data); + if (ptr->m_requestResetInNFrames > 0) { ptr->m_requestResetInNFrames--; } + if (ptr->m_requestResetInNFrames == 0) + { + GtkWidget* expander = GTK_WIDGET(gtk_builder_get_object(ptr->m_interface, "openvibe-expander_messages")); + gtk_expander_set_expanded(GTK_EXPANDER(expander), ptr->m_expanderOpen); + + GtkWidget* scrollWin = GTK_WIDGET(gtk_builder_get_object(ptr->m_interface, "scrolledwindow-tracks")); + GtkAdjustment* adjust = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrollWin)); + gtk_adjustment_set_value(adjust, ptr->m_hScrollBarValue); + + ptr->m_requestResetInNFrames = -1; + return FALSE; // Don't call again until re-added + } + + return TRUE; + }; + g_idle_add(resetFun, this); + +#endif + + m_requestRedraw = true; + + return true; +} + +bool GUI::redrawAllTracks() +{ + for (size_t i = 0; i < m_tracks.size(); ++i) { redrawTrack(i); } + m_lastRedraw = System::Time::zgetTime(); + + return true; +} + +bool GUI::step() +{ + const CTracker::EStates state = m_tracker.step(); + + if (state == CTracker::EStates::Playing) + { + const CTime currentTime = CTime(System::Time::zgetTime()); + if (currentTime - m_previousTime > CTime(1.0)) + { + const CTime processedTime = m_tracker.getWorkspace().getProcessedTime(); + const CTime totalTime = m_tracker.getWorkspace().getPlaylistDuration(); + + const double processedTimeSecs = processedTime.toSeconds(); + const double totalTimeSecs = totalTime.toSeconds(); + + char tmp[128]; + sprintf(tmp, "Processed : %.1fm / %.1fm (%.0f%%)", processedTimeSecs / 60.0, totalTimeSecs / 60.0, + (totalTime > CTime::min() ? 100.0 * processedTimeSecs / totalTimeSecs : 0)); + gtk_label_set(GTK_LABEL(m_timeDisplay), tmp); + + m_previousTime = currentTime; + + const size_t tracksOnPlaylist = m_tracker.getWorkspace().getNumTracksOnPlaylist(); + const size_t tracksDone = m_tracker.getWorkspace().getNumTracksDone(); + + sprintf(tmp, "Playing tracks (%z until finish)", tracksOnPlaylist - tracksDone); + gtk_label_set(GTK_LABEL(m_trackCounter), tmp); + } + } + else if (state == CTracker::EStates::Stopped && m_waitingForStop) + { + setPlaytimeWidgetState(true); + + gtk_label_set(GTK_LABEL(m_timeDisplay), "Processed : -"); + gtk_label_set(GTK_LABEL(m_trackCounter), "Stopped"); + + initializeRenderers(); + + m_waitingForStop = false; + } + //else { } // nop + + if (m_requestRedraw) + { + redrawAllTracks(); + m_requestRedraw = false; + } + + return true; +} + +bool GUI::run() +{ + initializeRenderers(); + gtk_main(); + return true; +} + +bool GUI::addTrackCB() +{ + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "openScenarioCB\n"; + + GtkFileFilter* fileFilterSpecific = gtk_file_filter_new(); + + gtk_file_filter_add_pattern(fileFilterSpecific, "*.ov"); + gtk_file_filter_set_name(fileFilterSpecific, "OV files"); + + GtkWidget* widgetDialogOpen = gtk_file_chooser_dialog_new("Select file to open...", nullptr, GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nullptr); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(widgetDialogOpen), fileFilterSpecific); + gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(widgetDialogOpen), fileFilterSpecific); + + // GTK 2 known bug: this won't work if setCurrentFolder is also used on the dialog. + gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(widgetDialogOpen), true); + + const CString defaultPath = Directories::getDataDir() + CString("/scenarios/signals/"); + + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(widgetDialogOpen), defaultPath.toASCIIString()); + + gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(widgetDialogOpen), true); + + if (gtk_dialog_run(GTK_DIALOG(widgetDialogOpen)) == GTK_RESPONSE_ACCEPT) + { + GSList* list; + GSList* file = list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(widgetDialogOpen)); + while (file) + { + char* filename = static_cast(file->data); + char* backslash; + while ((backslash = strchr(filename, '\\')) != nullptr) { *backslash = '/'; } + + m_tracker.getWorkspace().addTrack(filename); + + g_free(file->data); + file = file->next; + } + g_slist_free(list); + + initializeRenderers(); + } + + gtk_widget_destroy(widgetDialogOpen); + + return true; +} + +bool GUI::resetWidgetProperties() +{ + static const double DEFAULT_SCALE_SECS = 30.0; // how many seconds of data to view at once per default + + gtk_range_set_value(GTK_RANGE(m_scrollbar), 0); + + if (!m_tracks.empty() && !m_tracker.getWorkspace().getMemorySaveMode()) + { + const CTime maxDuration = m_tracker.getWorkspace().getMaxDuration(); + const double maxSecs = maxDuration.toSeconds(); + + if (maxSecs > 0) + { + gtk_range_set_range(GTK_RANGE(m_scale), 1, maxSecs); + gtk_range_set_value(GTK_RANGE(m_scale), (maxSecs < DEFAULT_SCALE_SECS ? maxSecs : DEFAULT_SCALE_SECS)); + } + gtk_widget_set_sensitive(m_scrollbar, true); + gtk_widget_set_sensitive(m_scale, true); + } + else + { + gtk_widget_set_sensitive(m_scrollbar, false); + gtk_widget_set_sensitive(m_scale, false); + } + + const CString workspaceFile = m_tracker.getWorkspace().getFilename(); + const uint64_t revision = m_tracker.getWorkspace().getRevision(); + + GtkWidget* saveAsH = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-menu_save")); + if (workspaceFile.length() > 0) + { + gtk_widget_set_sensitive(saveAsH, true); + char basename[512]; + FS::Files::getFilename(workspaceFile, basename, 512); + std::stringstream ss; + ss << "Workspace: " << basename << " (rev " << revision << ")"; + gtk_label_set_text(GTK_LABEL(m_workspaceLabel), ss.str().c_str()); + } + else + { + gtk_widget_set_sensitive(saveAsH, false); + gtk_label_set_text(GTK_LABEL(m_workspaceLabel), "Workspace: Unnamed"); + } + + const CString processorFile = m_tracker.getWorkspace().getProcessorFile(); + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-processor_file")); + char basename[512]; + FS::Files::getFilename(processorFile.toASCIIString(), basename, 512); + gtk_label_set_text(GTK_LABEL(widget), basename); + gtk_widget_show(widget); + + updateIdleWidgetState(); + +#if 0 + + m_totalChunks = 0; + m_numChannels = 0; + m_chunkSize = 0; + + const StreamBundle* tr = m_rTracker.getWorkspace().getTrack(0); + if (!tr) { + return false; + } + const Stream* ptr = nullptr; + + for (size_t i=0;igetNumStreams();i++) + { + if(tr->getStream(i) && tr->getStream(i)->getTypeIdentifier()==OV_TypeId_Signal) + { + ptr = reinterpret_cast< const Stream* >(tr->getStream(i)); + break; + } + } + if(ptr) + { + // Count samples first + TypeSignal::Buffer* buf; + ptr->getChunk(0, &buf); + if(buf && buf->m_buffer.getDimensionCount()==2) + { + m_totalChunks = ptr->getChunkCount(); + m_numChannels = buf->m_buffer.getDimensionSize(0); + m_chunkSize = buf->m_buffer.getDimensionSize(1); + } + } + + if(m_totalChunks<2) { std::cout << "Warning: File has less than 2 chunks, ranges may behave oddly\n"; } + + const uint32_t chunksPerView = std::min(20,m_totalChunks-1); + + // @todo change the scrollbars to seconds + gtk_range_set_range(GTK_RANGE(m_hScale), 1, m_totalChunks-1); + gtk_range_set_value(GTK_RANGE(m_hScale), chunksPerView); + + gtk_range_set_range(GTK_RANGE(m_hScrollbar), 0, m_rTracker.getWorkspace().getMaxDuration() ); + gtk_range_set_value(GTK_RANGE(m_hScrollbar), 0); + + // gtk_range_set_value(GTK_RANGE(m_hScrollbar), 0); + // gtk_range_set_round_digits(GTK_RANGE(m_hScrollbar), 0); //not in gtk ver we use on Windows + gtk_range_set_increments(GTK_RANGE(m_hScrollbar), 10, 100); + +#endif + + if (m_selectionWindow && gtk_widget_get_visible(m_selectionWindow)) + { + // Will redraw the window + editSelectionCB(); + } + + return true; +} + +bool GUI::redrawStream(const size_t trackIndex, const size_t streamIndex) +{ + const StreamBundle* tr = m_tracker.getWorkspace().getTrack(trackIndex); + if (!tr) + { + std::cout << "No track for index " << trackIndex << "\n"; + + return false; + } + + StreamRendererBase* renderer = m_tracks[trackIndex]->m_Renderers[streamIndex]; + if (!renderer) + { + std::cout << "No renderer for stream " << streamIndex << " in track " << trackIndex << "\n"; + return false; + } + + const StreamPtrConst stream = tr->getStream(streamIndex); + if (!stream) + { + std::cout << "No stream " << streamIndex << " in track " << trackIndex << "\n"; + return false; + } + + const double hValue = double(std::floor(gtk_range_get_value(GTK_RANGE(m_scrollbar)))); + const double hScale = double(std::floor(gtk_range_get_value(GTK_RANGE(m_scale)))); + + // std::cout << "HSlider is at " << hValue << " and " << hScale << "\n"; + + const CTime startTime = CTime(hValue); + const CTime endTime = startTime + CTime(hScale); + + // std::cout << "Spooling " << trackIndex << " : " << streamIndex << " for " << CTime(startTime).toSeconds() << " to " + // << CTime(endTime).toSeconds() << "\n"; + + renderer->spool(startTime, endTime); + + return true; +} + +bool GUI::redrawTrack(const size_t index) +{ + // CTime time = System::Time::zgetTime(); + + for (size_t streamIndex = 0; streamIndex < m_tracks[index]->m_Renderers.size(); ++streamIndex) { redrawStream(index, streamIndex); } + + return true; +} + +bool GUI::openWorkspaceCB() +{ + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "openScenarioCB\n"; + + GtkFileFilter* fileFilterSpecific = gtk_file_filter_new(); + + gtk_file_filter_add_pattern(fileFilterSpecific, "*.ovw"); + gtk_file_filter_set_name(fileFilterSpecific, "Workspace files"); + + GtkWidget* widgetDialogOpen = gtk_file_chooser_dialog_new("Select file to open...", nullptr, GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nullptr); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(widgetDialogOpen), fileFilterSpecific); + gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(widgetDialogOpen), fileFilterSpecific); + + // GTK 2 known bug: this won't work if setCurrentFolder is also used on the dialog. + gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(widgetDialogOpen), true); + + const CString defaultPath = Directories::getUserDataDir() + "/scenarios/workspaces/"; + + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(widgetDialogOpen), defaultPath.toASCIIString()); + + gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(widgetDialogOpen), false); + + bool fileSelected = false; + if (gtk_dialog_run(GTK_DIALOG(widgetDialogOpen)) == GTK_RESPONSE_ACCEPT) + { + GSList* list; + GSList* file = list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(widgetDialogOpen)); + while (file) + { + char* filename = static_cast(file->data); + char* backslash; + while ((backslash = strchr(filename, '\\')) != nullptr) { *backslash = '/'; } + + m_tracker.getWorkspace().load(CString(filename)); + + initializeRenderers(); + + fileSelected = true; + + g_free(file->data); + file = file->next; + } + g_slist_free(list); + } + else + { + // GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "processorpreferences-filename")); + // gtk_entry_set_text(GTK_ENTRY(widget), ""); + } + + + gtk_widget_destroy(widgetDialogOpen); + + return fileSelected; +} + + +bool GUI::openProcessorCB() const +{ + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "openScenarioCB\n"; + + GtkFileFilter* fileFilterSpecific = gtk_file_filter_new(); + + gtk_file_filter_add_pattern(fileFilterSpecific, "*.xml"); + gtk_file_filter_set_name(fileFilterSpecific, "Scenario files"); + + GtkWidget* widgetDialogOpen = gtk_file_chooser_dialog_new("Select file to open...", nullptr, GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nullptr); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(widgetDialogOpen), fileFilterSpecific); + gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(widgetDialogOpen), fileFilterSpecific); + + // GTK 2 known bug: this won't work if setCurrentFolder is also used on the dialog. + gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(widgetDialogOpen), true); + + const CString defaultPath = Directories::getDataDir() + CString("/applications/tracker/"); + + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(widgetDialogOpen), defaultPath.toASCIIString()); + gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(widgetDialogOpen), false); + + bool fileSelected = false; + if (gtk_dialog_run(GTK_DIALOG(widgetDialogOpen)) == GTK_RESPONSE_ACCEPT) + { + GSList* list; + GSList* file = list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(widgetDialogOpen)); + while (file) + { + char* filename = static_cast(file->data); + char* backslash; + while ((backslash = strchr(filename, '\\')) != nullptr) { *backslash = '/'; } + + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "processorpreferences-filename")); + gtk_entry_set_text(GTK_ENTRY(widget), filename); + + fileSelected = true; + + g_free(file->data); + file = file->next; + } + g_slist_free(list); + } + else + { + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "processorpreferences-filename")); + gtk_entry_set_text(GTK_ENTRY(widget), ""); + } + + gtk_widget_destroy(widgetDialogOpen); + + return fileSelected; +} + +bool GUI::openProcessorCBFinal() +{ + if (openProcessorCB()) + { + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "processorpreferences-filename")); + const char* filename = gtk_entry_get_text(GTK_ENTRY(widget)); + + m_tracker.getWorkspace().setProcessor(filename); + + resetWidgetProperties(); + } + return true; +} + +bool GUI::selectWorkspacePathCBFinal() const +{ + if (selectWorkspacePathCB()) + { + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "trackerpreferences-workspace_path")); + const char* filename = gtk_entry_get_text(GTK_ENTRY(widget)); + + return m_tracker.getWorkspace().setWorkingPath(CString(filename)); + } + return false; +} +// Note: this doesn't set the path to the workspace as it may be called from Preferences place with "Cancel" +bool GUI::selectWorkspacePathCB() const +{ + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "openScenarioCB\n"; + + GtkFileFilter* fileFilterSpecific = gtk_file_filter_new(); + + //gtk_file_filter_add_pattern(fileFilterSpecific, "*.xml"); + gtk_file_filter_set_name(fileFilterSpecific, "Folders"); + + GtkWidget* widgetDialogOpen = gtk_file_chooser_dialog_new("Please select work path folder ...", nullptr, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nullptr); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(widgetDialogOpen), fileFilterSpecific); + gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(widgetDialogOpen), fileFilterSpecific); + + // GTK 2 known bug: this won't work if setCurrentFolder is also used on the dialog. + gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(widgetDialogOpen), true); + + const CString defaultPath = Directories::getUserDataDir(); + + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(widgetDialogOpen), defaultPath.toASCIIString()); + gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(widgetDialogOpen), false); + + bool fileSelected = false; + if (gtk_dialog_run(GTK_DIALOG(widgetDialogOpen)) == GTK_RESPONSE_ACCEPT) + { + //char* filename=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widgetDialogOpen)); + GSList* list; + GSList* file = list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(widgetDialogOpen)); + while (file) + { + char* filename = static_cast(file->data); + char* backslash; + while ((backslash = strchr(filename, '\\')) != nullptr) { *backslash = '/'; } + + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "trackerpreferences-workspace_path")); + gtk_entry_set_text(GTK_ENTRY(widget), filename); + + fileSelected = true; + + g_free(file->data); + file = file->next; + } + g_slist_free(list); + } + else + { + // GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "trackerpreferences-workspace_path")); + // gtk_entry_set_text(GTK_ENTRY(widget), defaultPath); + } + + gtk_widget_destroy(widgetDialogOpen); + + return fileSelected; +} + +bool GUI::saveAsCB() +{ + if (m_tracker.getWorkspace().getWorkingPath().length() == 0 && !selectWorkspacePathCBFinal()) { return false; } + + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "openScenarioCB\n"; + + GtkFileFilter* fileFilterSpecific = gtk_file_filter_new(); + + gtk_file_filter_add_pattern(fileFilterSpecific, "*.ovw"); + gtk_file_filter_set_name(fileFilterSpecific, "Workspace files"); + + GtkWidget* widgetDialogOpen = gtk_file_chooser_dialog_new("Select file to save as...", nullptr, GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nullptr); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(widgetDialogOpen), fileFilterSpecific); + gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(widgetDialogOpen), fileFilterSpecific); + + // GTK 2 known bug: this won't work if setCurrentFolder is also used on the dialog. + gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(widgetDialogOpen), true); + + const CString defaultPath = Directories::getUserDataDir(); + + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(widgetDialogOpen), defaultPath.toASCIIString()); + + gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(widgetDialogOpen), false); + + bool fileSelected = false; + if (gtk_dialog_run(GTK_DIALOG(widgetDialogOpen)) == GTK_RESPONSE_ACCEPT) + { + //char* filename=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widgetDialogOpen)); + GSList* list; + GSList* file = list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(widgetDialogOpen)); + while (file) + { + char* filename = static_cast(file->data); + char* backslash; + while ((backslash = strchr(filename, '\\')) != nullptr) { *backslash = '/'; } + + std::string fn = std::string(filename); + if (fn.substr(fn.length() - 4, 4) != std::string(".ovw")) { fn += std::string(".ovw"); } + + storeRendererSettings(); + + if (m_tracker.getWorkspace().save(fn.c_str())) + { + resetWidgetProperties(); // Filenames may have changed + initializeRenderers(); + m_requestRedraw = true; + + fileSelected = true; + } + + g_free(file->data); + file = file->next; + } + g_slist_free(list); + } + else { } + + gtk_widget_destroy(widgetDialogOpen); + + return fileSelected; +} + +bool GUI::saveCB() +{ + if (m_tracker.getWorkspace().getWorkingPath().length() == 0 && !selectWorkspacePathCBFinal()) { return false; } + + storeRendererSettings(); + + m_tracker.getWorkspace().save(m_tracker.getWorkspace().getFilename()); + + // filenames may have changed, reset + resetWidgetProperties(); + initializeRenderers(); + + m_requestRedraw = true; + return true; +} + +bool GUI::incrementRevSaveCB() +{ + if (m_tracker.getWorkspace().getWorkingPath().length() == 0 && !selectWorkspacePathCBFinal()) { return false; } + + storeRendererSettings(); + + m_tracker.getWorkspace().incrementRevisionAndSave(m_tracker.getWorkspace().getFilename()); + + // filenames may have changed, reset + resetWidgetProperties(); + initializeRenderers(); + + m_requestRedraw = true; + return true; +} + +#include + +bool GUI::quitCB() +{ + this->clearRenderers(); + gtk_main_quit(); + return false; +} + +bool GUI::clearCB() +{ + if (m_selectionWindow) + { + gtk_widget_destroy(m_selectionWindow); + m_selectionWindow = nullptr; + } + + m_tracker.getWorkspace().clear(); + + initializeRenderers(); + + return true; +} + +bool GUI::deleteAllTracksCB() +{ + m_tracker.getWorkspace().clearTracks(); + + initializeRenderers(); + + return true; +} + +bool GUI::playCB() +{ + m_waitingForStop = true; + + setPlaytimeWidgetState(false); + + if (!m_tracker.play(false)) + { + setPlaytimeWidgetState(true); + return false; + } + + return true; +} + +bool GUI::playFastCB() +{ + m_waitingForStop = true; + + setPlaytimeWidgetState(false); + + if (!m_tracker.play(true)) + { + setPlaytimeWidgetState(true); + return false; + } + + return true; +} + + +bool GUI::stopCB() const +{ + // Send stop request. The threads may stop later. + const bool retVal = m_tracker.stop(); + return retVal; +} + +bool GUI::editSelectionCB() +{ + if (m_selectionWindow) { gtk_widget_destroy(m_selectionWindow); } + + Workspace& wp = m_tracker.getWorkspace(); + Selection& selection = m_tracker.getWorkspace().getSelection(); + + const size_t nRows = wp.getNumTracks(); + size_t nCols = 0; + for (size_t i = 0; i < nRows; ++i) { nCols = std::max(nCols, wp.getTrack(i)->getNumStreams()); } + + m_selectionWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(m_selectionWindow), "Select tracks/streams"); + + if (!selection.isEmpty()) + { + GtkWidget* table = gtk_table_new(guint(nRows + 1), guint(nCols + 1), true); + gtk_table_set_col_spacings(GTK_TABLE(table), 5); + + gtk_container_add(GTK_CONTAINER(m_selectionWindow), table); + + for (size_t i = 0; i < nRows; ++i) + { + for (size_t j = 0; j < wp.getTrack(i)->getNumStreams(); ++j) + { + GtkWidget* button = gtk_check_button_new(); + gtk_table_attach_defaults(GTK_TABLE(table), button, guint(j + 1), guint(j + 2), guint(i + 1), guint(i + 2)); + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), wp.getTrack(i)->getStream(j)->getSelected()); + + g_object_set_data(G_OBJECT(button), "setSelection-track", reinterpret_cast(i)); + g_object_set_data(G_OBJECT(button), "setSelection-stream", reinterpret_cast(j)); + GTK_CALLBACK_MAPPER_OBJECT_PARAM(GTK_OBJECT(button), "clicked", setSelectionCB); + + gtk_widget_show(button); + } + + std::stringstream ss; + ss << "Track" << i + 1; + GtkWidget* label = gtk_label_new(ss.str().c_str()); + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, guint(i + 1), guint(i + 2)); + gtk_widget_show(label); + } + for (size_t i = 0; i < nCols; ++i) + { + std::stringstream ss; + ss << "Stream" << i + 1; + GtkWidget* label = gtk_label_new(ss.str().c_str()); + gtk_table_attach_defaults(GTK_TABLE(table), label, guint(i + 1), guint(i + 2), 0, 1); + gtk_widget_show(label); + } + + gtk_widget_show(table); + } + else + { + GtkWidget* label = GTK_WIDGET(gtk_label_new("No tracks with streams")); + gtk_container_add(GTK_CONTAINER(m_selectionWindow), label); + gtk_widget_show(label); + } + + // Hide instead of destroy on closing the window + g_signal_connect(m_selectionWindow, "delete_event", G_CALLBACK(gtk_widget_hide_on_delete), nullptr); + + gtk_widget_show(m_selectionWindow); + + return true; +} + +bool GUI::selectAllCB() +{ + m_tracker.getWorkspace().getSelection().reset(true); + if (m_selectionWindow && gtk_widget_get_visible(m_selectionWindow)) { editSelectionCB(); } + updateIdleWidgetState(); + + const bool selectedOnlyState = m_kernelCtx.getConfigurationManager().expandAsBoolean("${Tracker_Workspace_GUI_ShowSelectedOnly}", false); + if (selectedOnlyState) { initializeRenderers(); } + + return true; +} + +bool GUI::selectNoneCB() +{ + m_tracker.getWorkspace().getSelection().reset(false); + if (m_selectionWindow && gtk_widget_get_visible(m_selectionWindow)) { editSelectionCB(); } + updateIdleWidgetState(); + + const bool selectedOnlyState = m_kernelCtx.getConfigurationManager().expandAsBoolean("${Tracker_Workspace_GUI_ShowSelectedOnly}", false); + if (selectedOnlyState) { initializeRenderers(); } + + return true; +} + + +bool GUI::processorPreferencesCB() const +{ + uint32_t sendPort, receivePort; + m_tracker.getWorkspace().getProcessorPorts(sendPort, receivePort); + + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "processorpreferences-filename")); + gtk_entry_set_text(GTK_ENTRY(widget), m_tracker.getWorkspace().getProcessorFile()); + + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-processor_port")); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), sendPort); + + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-numthreads")); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), m_tracker.getNumThreads()); + + bool noGUI, doSend, doReceive; + m_tracker.getWorkspace().getProcessorFlags(noGUI, doSend, doReceive); + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-processor_dosend")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), doSend); + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-processor_doreceive")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), doReceive); + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-processor_nogui")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), noGUI); + + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-processor_catenate")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), m_tracker.getWorkspace().getCatenateMode()); + + + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "trackerpreferences-workspace_path")); + const CString workspacePath = m_tracker.getWorkspace().getWorkingPath(); + gtk_entry_set_text(GTK_ENTRY(widget), workspacePath.toASCIIString()); + + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-memorysave")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), m_tracker.getWorkspace().getMemorySaveMode()); + + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-inplacemode")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), m_tracker.getWorkspace().getInplaceMode()); + + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "trackerpreferences-processor_arguments")); + const CString args = m_tracker.getWorkspace().getProcessorArguments(); + gtk_entry_set_text(GTK_ENTRY(widget), args.toASCIIString()); + + GtkDialog* dialog = GTK_DIALOG(gtk_builder_get_object(m_interface, "dialog-processor-preferences")); + gtk_dialog_run(GTK_DIALOG(dialog)); + + return true; +} + + +bool GUI::processorPreferencesButtonOkCB() +{ + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "processorpreferences-filename")); + const char* filename = gtk_entry_get_text(GTK_ENTRY(widget)); + m_tracker.getWorkspace().setProcessor(filename); + + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-processor_port")); + gtk_spin_button_update(GTK_SPIN_BUTTON(widget)); + const uint32_t firstPort = uint32_t(gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget))); + m_tracker.getWorkspace().setProcessorPorts(firstPort, firstPort + 1); + + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-numthreads")); + gtk_spin_button_update(GTK_SPIN_BUTTON(widget)); + const uint32_t numThreads = uint32_t(gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget))); + m_tracker.setNumThreads(numThreads); + + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-processor_catenate")); + m_tracker.getWorkspace().setCatenateMode((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) != 0)); + + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-processor_nogui")); + const bool noGui = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) != 0); + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-processor_dosend")); + const bool doSend = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) != 0); + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-processor_doreceive")); + const bool doReceive = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) != 0); + + m_tracker.getWorkspace().setProcessorFlags(noGui, doSend, doReceive); + + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "trackerpreferences-workspace_path")); + const char* path = gtk_entry_get_text(GTK_ENTRY(widget)); + m_tracker.getWorkspace().setWorkingPath(CString(path)); + + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-memorysave")); + const bool oldMemorySaveMode = m_tracker.getWorkspace().getMemorySaveMode(); + const bool newMemorySaveMode = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) != 0); + if (newMemorySaveMode != oldMemorySaveMode) + { + m_tracker.getWorkspace().setMemorySaveMode(newMemorySaveMode); + initializeRenderers(); + } + + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-inplacemode")); + m_tracker.getWorkspace().setInplaceMode((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)) != 0)); + + widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "trackerpreferences-processor_arguments")); + const char* args = gtk_entry_get_text(GTK_ENTRY(widget)); + m_tracker.getWorkspace().setProcessorArguments(CString(args)); + + GtkDialog* dialog = GTK_DIALOG(gtk_builder_get_object(m_interface, "dialog-processor-preferences")); + gtk_widget_hide(GTK_WIDGET(dialog)); + + resetWidgetProperties(); + + return true; +} + + +bool GUI::processorPreferencesButtonCancelCB() const +{ + GtkDialog* dialog = GTK_DIALOG(gtk_builder_get_object(m_interface, "dialog-processor-preferences")); + gtk_widget_hide(GTK_WIDGET(dialog)); + + return true; +} + + +bool GUI::processorEditCB() const +{ + // Here we configure the processor which already has an .xml set + return m_tracker.getWorkspace().configureProcessor(nullptr); +} + +bool GUI::processorEditCB2() const +{ + // This tries to configure whatever the user has entered into the box, even if + // Ok button hasn't been pressed yet to register that choice. + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_interface, "processorpreferences-filename")); + const char* filename = gtk_entry_get_text(GTK_ENTRY(widget)); + return m_tracker.getWorkspace().configureProcessor(filename); +} + +#include "ovdCCommentEditorDialog.h" + +bool GUI::editNotesCB() const +{ + const CString guiFile = Directories::getDataDir() + "/applications/tracker/designer-interface.ui"; + Designer::CCommentEditorDialog dialog(getKernelContext(), m_tracker.getWorkspace().getNotes(), guiFile.toASCIIString()); + return dialog.run(); +} + + +bool GUI::hScrollCB(GtkWidget* /*widget*/) +{ + // std::cout << "Hscroll" << gtk_range_get_value(GTK_RANGE(widget)) << "\n"; + m_requestRedraw = true; + return true; +} + +bool GUI::hScaleCB(GtkWidget* /*widget*/) +{ + // @since we store the pointers in the class, no need to pass in widget... + //std::cout << "Hscale " << gtk_range_get_value(GTK_RANGE(widget)) << "\n"; + // double stepSizeSecs = gtk_range_get_value(GTK_RANGE(widget)); + // CTime maxDuration = m_rTracker.getWorkspace().getMaxDuration(); + // uint64_t verticalStepsAvailable = CTime(stepSizeSecs).time(); + // const uint32_t chunksPerView = uint32_t( gtk_range_get_value(GTK_RANGE(widget))); + + m_requestRedraw = true; + return true; +} + +bool GUI::workspaceInfoCB() const +{ + GtkWidget* window = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-workspace_information")); + GtkTextBuffer* buffer = GTK_TEXT_BUFFER(gtk_builder_get_object(m_interface, "tracker-textbuffer-workspace_information")); + + // Hide instead of destroy on closing the window + g_signal_connect(window, "delete_event", G_CALLBACK(gtk_widget_hide_on_delete), nullptr); + + const CString workspaceInfo = getWorkspaceInfo(); + + gtk_text_buffer_set_text(buffer, workspaceInfo.toASCIIString(), -1); + gtk_widget_show_all(window); + gtk_window_present(GTK_WINDOW(window)); + + return true; +} + +bool GUI::aboutCB() const +{ + GtkWidget* window = GTK_WIDGET(gtk_builder_get_object(m_interface, "aboutdialog-newversion")); + gtk_dialog_set_response_sensitive(GTK_DIALOG(window), GTK_RESPONSE_CLOSE, true); + g_signal_connect(G_OBJECT(window), "response", G_CALLBACK(gtk_widget_hide), nullptr); + gtk_dialog_run(GTK_DIALOG(window)); + return true; +} + +bool GUI::deleteTrackCB(GtkWidget* widget) +{ + const size_t index = reinterpret_cast(g_object_get_data(G_OBJECT(widget), "delete-track-cb")); + if (index >= m_tracks.size()) { return false; } + + + GtkWidget* trackTable = GTK_WIDGET(gtk_builder_get_object(m_interface, "table_tracks")); + + // To avoid issues, we delete everything first before detaching the widget + GtkWidget* frame = m_tracks[index]->m_Frame; + + delete m_tracks[index]; + m_tracks.erase(m_tracks.begin() + index); + + if (frame) { gtk_container_remove(GTK_CONTAINER(trackTable), frame); } + + m_tracker.getWorkspace().removeTrack(index); + + + // This will store the current renderer configurations but with the new indexing + storeRendererSettings(); + initializeRenderers(); + return true; +} + +bool GUI::moveTrackCB(GtkWidget* widget) +{ + const size_t track = reinterpret_cast(g_object_get_data(G_OBJECT(widget), "move-track-cb")); + if (track >= m_tracks.size()) { return false; } + GtkWidget* dialog = gtk_dialog_new_with_buttons("Choose target slot", GTK_WINDOW(m_mainWindow), + GtkDialogFlags(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT), + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, nullptr); + + GtkAdjustment* adjustment = GTK_ADJUSTMENT(gtk_adjustment_new(gdouble(track+1), 1, gdouble(m_tracker.getWorkspace().getNumTracks()), 1, 1, 0)); + GtkWidget* button = gtk_spin_button_new(adjustment, 1, 0); + // gtk_spin_button_set_range(GTK_SPIN_BUTTON(button), 1, m_rTracker.getWorkspace().getNumTracks()); + + gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), button); + gtk_widget_show(button); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) + { + gtk_spin_button_update(GTK_SPIN_BUTTON(button)); + const size_t newTrack = size_t(gtk_spin_button_get_value(GTK_SPIN_BUTTON(button))) - 1; + + // @fixme scalings will be lost + m_tracker.getWorkspace().moveTrack(track, newTrack); + + // This will store the current renderer configurations but with the new indexing + // storeRendererSettings(); + + initializeRenderers(); + } + + gtk_widget_destroy(dialog); + + return true; +} + +bool GUI::moveStreamCB(GtkWidget* widget) +{ + const size_t track = reinterpret_cast(g_object_get_data(G_OBJECT(widget), "move-stream-cb-track")); + const size_t stream = reinterpret_cast(g_object_get_data(G_OBJECT(widget), "move-stream-cb-stream")); + + GtkWidget* dialog = gtk_dialog_new_with_buttons("Choose track & stream", GTK_WINDOW(m_mainWindow), + GtkDialogFlags(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT), + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, nullptr); + + // Target track + GtkAdjustment* adjustment = GTK_ADJUSTMENT(gtk_adjustment_new(gdouble(track+1), 1, gdouble(m_tracker.getWorkspace().getNumTracks()), 1, 1, 0)); + GtkWidget* buttonTrack = gtk_spin_button_new(adjustment, 1, 0); + gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), buttonTrack); + gtk_widget_show(buttonTrack); + + // Target stream + // @fixme the limits would depend on the target track + size_t maxNumStreams = 0; + for (size_t i = 0; i < m_tracker.getWorkspace().getNumTracks(); ++i) + { + maxNumStreams = std::max(maxNumStreams, m_tracker.getWorkspace().getTrack(i)->getNumStreams()); + } + adjustment = GTK_ADJUSTMENT(gtk_adjustment_new(gdouble(stream+1), 1, gdouble(maxNumStreams), 1, 1, 0)); + GtkWidget* buttonStream = gtk_spin_button_new(adjustment, 1, 0); + gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), buttonStream); + gtk_widget_show(buttonStream); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) + { + gtk_spin_button_update(GTK_SPIN_BUTTON(buttonTrack)); + const size_t newTrack = size_t(gtk_spin_button_get_value(GTK_SPIN_BUTTON(buttonTrack))) - 1; + + gtk_spin_button_update(GTK_SPIN_BUTTON(buttonStream)); + size_t newStream = size_t(gtk_spin_button_get_value(GTK_SPIN_BUTTON(buttonStream))) - 1; + + newStream = std::min(newStream, m_tracker.getWorkspace().getTrack(newTrack)->getNumStreams()); + + // @fixme scalings will be lost + m_tracker.getWorkspace().moveStream(track, stream, newTrack, newStream); + + // This will store the current renderer configurations but with the new indexing + // storeRendererSettings(); + + initializeRenderers(); + } + + gtk_widget_destroy(dialog); + + return true; +} + + +bool GUI::showChunksCB(GtkWidget* widget) +{ + void* ptr = g_object_get_data(G_OBJECT(widget), "show-chunks-cb"); + StreamRendererBase* renderer = reinterpret_cast(ptr); + if (!renderer) + { + std::cout << "Error: No renderer for stream\n"; + return false; + } + return renderer->showChunkList(); +} + +bool GUI::deleteStreamCB(GtkWidget* widget) +{ + const size_t track = reinterpret_cast(g_object_get_data(G_OBJECT(widget), "delete-stream-cb-track")); + const size_t stream = reinterpret_cast(g_object_get_data(G_OBJECT(widget), "delete-stream-cb-stream")); + + // We must make sure the renderer is not holding refs anymore to the track + // @todo it'd be more efficient just to delete the right renderer and not all of them + m_tracker.getWorkspace().removeStream(track, stream); + + initializeRenderers(); + + return true; +} + +bool GUI::toggleRulerCB(GtkWidget* widget) +{ + const bool newState = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)) != 0 ? true : false); + m_kernelCtx.getConfigurationManager().addOrReplaceConfigurationToken("Tracker_Workspace_GUI_ShowRulers", (newState ? "true" : "false")); + updateRulerState(); + return true; +} + +bool GUI::toggleShowSelectedOnlyCB(GtkWidget* widget) +{ + const bool newState = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)) != 0 ? true : false); + m_kernelCtx.getConfigurationManager().addOrReplaceConfigurationToken("Tracker_Workspace_GUI_ShowSelectedOnly", (newState ? "true" : "false")); + initializeRenderers(); + + return true; +} + +#include "ovdCBoxConfigurationDialog.h" + +bool GUI::applyBoxPluginCB(GtkWidget* widget) +{ + // Which filter to apply? + const size_t index = reinterpret_cast(g_object_get_data(G_OBJECT(widget), "applyBoxPlugin-cb")); + // Get the box so we can present the configuration GUI + auto& plugins = m_tracker.getBoxPlugins().getBoxPlugins(); + BoxAdapterStream* box = plugins[index]; + + // The .ui files used are taken by CMake from Designer, like the dialog code + const CString defaultPath = Directories::getDataDir() + CString("/applications/tracker/"); + const CString guiFilename = defaultPath + "designer-interface.ui"; + const CString settingsFilename = defaultPath + "designer-interface-settings.ui"; + + bool applyClicked; + if (box->getBox().getSettingCount() > 0) + { + Designer::CBoxConfigurationDialog dialog(getKernelContext(), box->getBox(), guiFilename, settingsFilename, false); + applyClicked = dialog.run(); + } + else + { + // if theres no settings, just consider this as auto-applying + applyClicked = true; + } + + if (applyClicked) + { + m_tracker.applyBoxPlugin(index); + initializeRenderers(); + m_requestRedraw = true; + } + + return true; +} + +bool GUI::trackerPluginCB(GtkWidget* widget) +{ + // Which filter to apply? + const size_t index = reinterpret_cast(g_object_get_data(G_OBJECT(widget), "trackerPlugin-cb")); + const bool success = m_tracker.applyTrackerPlugin(index); + + initializeRenderers(); + m_requestRedraw = true; + + return success; +} + + +bool GUI::setSelectionCB(GtkWidget* widget) +{ + const size_t track = reinterpret_cast(g_object_get_data(G_OBJECT(widget), "setSelection-track")); + const size_t stream = reinterpret_cast(g_object_get_data(G_OBJECT(widget), "setSelection-stream")); + + const gboolean active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); + + m_tracker.getWorkspace().getTrack(track)->getStream(stream)->setSelected(active != 0); + + updateIdleWidgetState(); + + const bool selectedOnlyState = m_kernelCtx.getConfigurationManager().expandAsBoolean("${Tracker_Workspace_GUI_ShowSelectedOnly}", false); + if (selectedOnlyState) { initializeRenderers(); } + + return true; +} + +bool GUI::clearMessagesCB() const +{ + m_logListener->clearMessages(); + return true; +} + +GUI::GUITrack::~GUITrack() +{ + for (auto renderer : m_Renderers) + { + if (renderer) + { + renderer->uninitialize(); + delete renderer; + } + } + m_Renderers.clear(); +} + +// @todo refactor to Workspace. but can't do that neatly while renderers are responsible for the text. +CString GUI::getWorkspaceInfo() const +{ + std::stringstream ss; + Workspace& wp = m_tracker.getWorkspace(); + + ss << "Current workspace" << std::endl; + ss << "-----------------" << std::endl; + ss << "Number of tracks: " << wp.getNumTracks() << std::endl; + ss << "Maximum track duration: " << wp.getMaxDuration().toSeconds() << "s" << std::endl; + ss << "Working path: " << wp.getWorkingPath() << std::endl; + ss << "Workspace file: " << wp.getFilename() << std::endl; + ss << "Workspace revision: " << wp.getRevision() << std::endl; + + if (wp.getMemorySaveMode()) { ss << std::endl << "Note: Memory save mode enabled, track details unknown." << std::endl; } + + for (size_t i = 0; i < wp.getNumTracks(); ++i) + { + const StreamBundle* bundle = wp.getTrack(i); + if (!bundle) + { + ss << std::endl; + ss << "Track " << i + 1 << " is empty\n"; + continue; + } + + ss << std::endl; + ss << "Track " << i + 1 << "/" << wp.getNumTracks() << " : " << bundle->getNumStreams() << " streams" << std::endl; + ss << " Source: " << bundle->getSource() << std::endl; + for (size_t j = 0; j < m_tracks[i]->m_Renderers.size(); ++j) + { + const StreamPtrConst stream = bundle->getStream(j); + const CIdentifier typeID = stream->getTypeIdentifier(); + + ss << " Stream " << j + 1 << "/" << bundle->getNumStreams() << " : " << getTypeManager().getTypeName(typeID).toASCIIString() << " " + << typeID.str() << std::endl; + ss << " Time range: [" << stream->getStartTime().toSeconds() << ", " << stream->getDuration().toSeconds() << "]s" << std::endl; + ss << " Total chunks: " << stream->getChunkCount() << " ( " << (stream->getOverlapping() ? "Overlapping " : "") + << (stream->getNoncontinuous() ? "Noncontinuous" : "") << (!(stream->getOverlapping() || stream->getNoncontinuous()) ? "Continuous" : "") + << " )" << std::endl; + ss << " Selected: " << (stream->getSelected() ? "Yes" : "No") << std::endl; + + // @fixme not too happy that the renderer is responsible for this, but since Stream is a template + // class, it'd need a override for each type + if (m_tracks[i]->m_Renderers[j]) { ss << m_tracks[i]->m_Renderers[j]->renderAsText(4); } + else { ss << " Empty stream" << std::endl; } + } + } + + ss << "\nConfiguration tokens (refreshed on save): \n\n"; + + const auto tokens = m_tracker.getWorkspace().getConfigurationTokens(); + for (const auto& token : tokens) { ss << token.first << " = " << token.second << "\n"; } + + return ss.str().c_str(); +} + +bool GUI::addTracksToMenu() +{ + GtkWidget* menuRoot = GTK_WIDGET(gtk_builder_get_object(m_interface, "tracker-menu_tracks")); + + // Instead of carefully making sure that the menu is consistent, just rebuild the whole thing + GtkWidget* menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuRoot)); + if (menu) { gtk_widget_destroy(menu); } + + const bool memorySaveMode = m_tracker.getWorkspace().getMemorySaveMode(); + + m_trackMenuWidgets.clear(); + + menu = gtk_menu_new(); + + bool rulerState = m_kernelCtx.getConfigurationManager().expandAsBoolean("${Tracker_Workspace_GUI_ShowRulers}", true); + GtkWidget* menuItem = gtk_check_menu_item_new_with_label("Show rulers"); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuItem), rulerState); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuItem); + GTK_CALLBACK_MAPPER_OBJECT_PARAM(GTK_OBJECT(menuItem), "activate", toggleRulerCB); + gtk_widget_set_sensitive(menuItem, !memorySaveMode); + // m_TrackMenuWidgets.push_back(menuItem); + + bool selectedOnlyState = m_kernelCtx.getConfigurationManager().expandAsBoolean("${Tracker_Workspace_GUI_ShowSelectedOnly}", false); + menuItem = gtk_check_menu_item_new_with_label("Show selected only"); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuItem), selectedOnlyState); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuItem); + GTK_CALLBACK_MAPPER_OBJECT_PARAM(GTK_OBJECT(menuItem), "activate", toggleShowSelectedOnlyCB); + + GtkWidget* separator = gtk_separator_menu_item_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), separator); + + /// Box plugins menu + menuItem = gtk_menu_item_new_with_label("Apply box plugin"); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuItem); + m_trackMenuWidgets.push_back(menuItem); + + GtkWidget* subMenu = gtk_menu_new(); + m_trackMenuWidgets.push_back(subMenu); + + auto& plugins = m_tracker.getBoxPlugins().getBoxPlugins(); + for (size_t i = 0; i < plugins.size(); ++i) + { + const CString name = plugins[i]->getBox().getName(); + + GtkWidget* subMenuItem = gtk_menu_item_new_with_label(name.toASCIIString()); + gtk_menu_shell_append(GTK_MENU_SHELL(subMenu), subMenuItem); + g_object_set_data(G_OBJECT(subMenuItem), "applyBoxPlugin-cb", reinterpret_cast(i)); + GTK_CALLBACK_MAPPER_OBJECT_PARAM(GTK_OBJECT(subMenuItem), "activate", applyBoxPluginCB); + m_trackMenuWidgets.push_back(subMenuItem); + } + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuItem), subMenu); + + gtk_widget_show(menuItem); + gtk_widget_show(subMenu); + + //// Tracker plugins menu + menuItem = gtk_menu_item_new_with_label("Apply Tracker plugin"); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuItem); + m_trackMenuWidgets.push_back(menuItem); + + subMenu = gtk_menu_new(); + m_trackMenuWidgets.push_back(subMenu); + + auto& trackerPlugins = m_tracker.getTrackerPlugins().getTrackerPlugins(); + for (size_t i = 0; i < trackerPlugins.size(); ++i) + { + const std::string name = trackerPlugins[i]->getName(); + + GtkWidget* subMenuItem = gtk_menu_item_new_with_label(name.c_str()); + gtk_menu_shell_append(GTK_MENU_SHELL(subMenu), subMenuItem); + g_object_set_data(G_OBJECT(subMenuItem), "trackerPlugin-cb", reinterpret_cast(i)); + GTK_CALLBACK_MAPPER_OBJECT_PARAM(GTK_OBJECT(subMenuItem), "activate", trackerPluginCB); + m_trackMenuWidgets.push_back(subMenuItem); + } + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuItem), subMenu); + + gtk_widget_show(menuItem); + gtk_widget_show(subMenu); + + //// Per track + + separator = gtk_separator_menu_item_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), separator); + + { + std::unique_lock(m_tracker.getWorkspace().getMutex()); + const size_t numTracks = m_tracker.getWorkspace().getNumTracks(); + + for (size_t i = 0; i < numTracks; ++i) + { + std::stringstream ss; + ss << "Track " << i + 1; + menuItem = gtk_menu_item_new_with_label(ss.str().c_str()); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuItem); + + subMenu = gtk_menu_new(); + + GtkWidget* subMenuItem = gtk_menu_item_new_with_label("Delete Track"); + gtk_menu_shell_append(GTK_MENU_SHELL(subMenu), subMenuItem); + g_object_set_data(G_OBJECT(subMenuItem), "delete-track-cb", reinterpret_cast(i)); + GTK_CALLBACK_MAPPER_OBJECT_PARAM(GTK_OBJECT(subMenuItem), "activate", deleteTrackCB); + + subMenuItem = gtk_menu_item_new_with_label("Move Track"); + gtk_menu_shell_append(GTK_MENU_SHELL(subMenu), subMenuItem); + g_object_set_data(G_OBJECT(subMenuItem), "move-track-cb", reinterpret_cast(i)); + GTK_CALLBACK_MAPPER_OBJECT_PARAM(GTK_OBJECT(subMenuItem), "activate", moveTrackCB); + + separator = gtk_separator_menu_item_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(subMenu), separator); + + const StreamBundle* tr = m_tracker.getWorkspace().getTrack(i); + for (size_t j = 0; tr && j < tr->getNumStreams(); ++j) + { + std::stringstream ss2; + ss2 << "Stream " << j + 1; + subMenuItem = gtk_menu_item_new_with_label(ss2.str().c_str()); + gtk_menu_shell_append(GTK_MENU_SHELL(subMenu), subMenuItem); + + GtkWidget* streamMenuItems = gtk_menu_new(); + + + GtkWidget* tmp = gtk_menu_item_new_with_label("Show structure"); + gtk_menu_shell_append(GTK_MENU_SHELL(streamMenuItems), tmp); + g_object_set_data(G_OBJECT(tmp), "show-chunks-cb", reinterpret_cast(m_tracks[i]->m_Renderers[j])); + GTK_CALLBACK_MAPPER_OBJECT_PARAM(GTK_OBJECT(tmp), "activate", showChunksCB); + gtk_widget_set_sensitive(tmp, !memorySaveMode); + + tmp = gtk_menu_item_new_with_label("Move stream"); + gtk_menu_shell_append(GTK_MENU_SHELL(streamMenuItems), tmp); + g_object_set_data(G_OBJECT(tmp), "move-stream-cb-track", reinterpret_cast(i)); + g_object_set_data(G_OBJECT(tmp), "move-stream-cb-stream", reinterpret_cast(j)); + GTK_CALLBACK_MAPPER_OBJECT_PARAM(GTK_OBJECT(tmp), "activate", moveStreamCB); + gtk_widget_set_sensitive(tmp, !memorySaveMode); + + tmp = gtk_menu_item_new_with_label("Delete stream"); + gtk_menu_shell_append(GTK_MENU_SHELL(streamMenuItems), tmp); + g_object_set_data(G_OBJECT(tmp), "delete-stream-cb-track", reinterpret_cast(i)); + g_object_set_data(G_OBJECT(tmp), "delete-stream-cb-stream", reinterpret_cast(j)); + GTK_CALLBACK_MAPPER_OBJECT_PARAM(GTK_OBJECT(tmp), "activate", deleteStreamCB); + gtk_widget_set_sensitive(tmp, !memorySaveMode); + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(subMenuItem), streamMenuItems); + + gtk_widget_show(subMenuItem); + } + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuItem), subMenu); + + gtk_widget_show(menuItem); + gtk_widget_show(subMenu); + } + } + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuRoot), menu); + + gtk_widget_show_all(menu); + + return true; +} + +bool GUI::setPlaytimeWidgetState(const bool enabled) +{ + // Before enabling any of these during play, test thoroughly that it works during it + const std::vector widgets{ + "tracker-button_play_pause", "tracker-button_forward", "tracker-menu_open_file", "tracker-menu_open_workspace", "tracker-menu_open_processor", + "tracker-menu_clear", "tracker-menu_save", "tracker-menu_saveas", "tracker-menu_incrementrevsave", "tracker-menu_select", "tracker-menu_select_all", + "tracker-menu_select_none", "tracker-menu_processor_preferences", "tracker-menu_delete_all", "tracker-select_tracks", "tracker-processor_properties", + "tracker-menu_tracks", "tracker-menu_workspace_about" + }; + + for (const auto& name : widgets) + { + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_interface, name.c_str())); + gtk_widget_set_sensitive(widget, enabled); + } + + for (auto widget : m_trackMenuWidgets) { gtk_widget_set_sensitive(widget, enabled); } + + return true; +} + +bool GUI::updateIdleWidgetState() +{ + const std::vector widgetsNeedingStreams{ + "tracker-menu_select", "tracker-select_tracks", "tracker-menu_select_all", "tracker-menu_select_none", "tracker-menu_delete_all", "tracker-menu_tracks" + }; + // n.b. actually the 'apply' widgets might be the only ones needing + // selection, we must allow 'play' on empty for situations where the user only wants to record + const std::vector widgetsNeedingSelection; + /* + const std::vector widgetsNeedingSelection{ + "tracker-button_play_pause" + , "tracker-button_forward" + , "tracker-button_stop" + }; + */ + + const bool haveStreams = !m_tracker.getWorkspace().getSelection().isEmpty(); + + for (const auto& name : widgetsNeedingStreams) + { + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_interface, name.c_str())); + if (!widget) + { + log() << Kernel::LogLevel_Error << "Error getting widget " << name << "\n"; + continue; + } + + gtk_widget_set_sensitive(widget, haveStreams); + } + + const bool haveSelection = m_tracker.getWorkspace().getSelection().isSomethingSelected(); + + for (const auto& name : widgetsNeedingSelection) + { + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_interface, name.c_str())); + if (!widget) + { + log() << Kernel::LogLevel_Error << "Error getting widget " << name << "\n"; + continue; + } + + gtk_widget_set_sensitive(widget, haveSelection); + } + + for (auto widget : m_trackMenuWidgets) { gtk_widget_set_sensitive(widget, haveSelection); } + + // some widgets need a processor + const bool hasProcessor = m_tracker.getWorkspace().hasProcessor(); + const std::vector widgetsNeedingProcessor{ + "tracker-button_play_pause", "tracker-button_stop", "tracker-button_forward", "tracker-processor_properties" + }; + for (const auto& name : widgetsNeedingProcessor) + { + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_interface, name.c_str())); + + gtk_widget_set_sensitive(widget, hasProcessor); + } + + return true; +} + +bool GUI::storeRendererSettings() +{ + bool retVal = true; + + // get rid of possibly dangling tokens from deleted streams/tracks + m_tracker.getWorkspace().wipeConfigurationTokens("Tracker_Workspace_GUI_Renderer_"); + + // Store current ones + for (size_t i = 0; i < m_tracks.size(); ++i) + { + if (!m_tracks[i]) { continue; } + + for (size_t j = 0; j < m_tracks[i]->m_Renderers.size(); ++j) + { + std::stringstream ss; + ss << "Tracker_Workspace_GUI_Renderer" << "_Track_" << std::setw(3) << std::setfill('0') << (i + 1) + << "_Stream_" << std::setw(2) << std::setfill('0') << (j + 1); + retVal &= m_tracks[i]->m_Renderers[j]->storeSettings(ss.str()); + } + } + + return retVal; +} + +bool GUI::updateRulerState() +{ + const bool rulerState = m_kernelCtx.getConfigurationManager().expandAsBoolean("${Tracker_Workspace_GUI_ShowRulers}", true); + for (auto* trk : m_tracks) { for (auto* renderer : trk->m_Renderers) { if (renderer) { renderer->setRulerVisibility(rulerState); } } } + return true; +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/ParallelExecutor.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/ParallelExecutor.cpp new file mode 100755 index 0000000..343e21a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/ParallelExecutor.cpp @@ -0,0 +1,186 @@ +#include + +#include + +#include "ParallelExecutor.h" +#include + +namespace OpenViBE { +namespace Tracker { + +bool ParallelExecutor::initialize(const uint32_t nThreads) +{ + m_quit = false; + m_nJobsRunning = 0; + m_jobList.clear(); + + // ExecutorView passes the working threads a few function handles to the executor that holds the state + ExecutorView ctx(*this); + + for (uint32_t i = 0; i < nThreads; ++i) + { + m_workerThreads.push_back(new CWorkerThread()); + m_threads.push_back(new std::thread(std::bind(&CWorkerThread::startWorkerThread, m_workerThreads[i], ctx, i))); + } + + return true; +} + +bool ParallelExecutor::uninitialize() +{ + // Tell the threads waiting in the cond its time to quit, don't care of pending jobs + { // scope for lock + std::unique_lock lock(m_jobMutex); + m_jobList.clear(); + m_quit = true; + } + + m_haveWork.notify_all(); + + for (uint32_t i = 0; i < m_threads.size(); ++i) + { + m_threads[i]->join(); + + delete m_threads[i]; + delete m_workerThreads[i]; + } + + m_threads.clear(); + m_workerThreads.clear(); + + return true; +} + +bool ParallelExecutor::pushJob(const jobCall& someJob) +{ + // @fixme to add better concurrency, push a list instead; lock();add list;unlock();notify_all(); + { // lock scope + std::lock_guard lock(m_jobMutex); + m_jobList.push_back(someJob); + } + + m_haveWork.notify_one(); + + return true; +} + + +bool ParallelExecutor::pushJobList(const std::deque& vJobList) +{ + { // lock scope + std::lock_guard lock(m_jobMutex); + + if (!m_jobList.empty()) + { + std::cout << "Error, trying to push list with old jobs pending\n"; + return false; + } + m_jobList = vJobList; + } + + m_haveWork.notify_all(); + + + return true; +} + +bool ParallelExecutor::waitForAll() +{ + std::unique_lock lock(m_jobMutex); + while (!m_jobList.empty()) { m_jobDone.wait(lock); } + + return true; +} + +bool ParallelExecutor::getJob(jobCall& job) +{ + // Wait until we get a job or are told to quit + std::unique_lock lock(m_jobMutex); + + m_haveWork.wait(lock, [this]() { return (this->m_quit || !this->m_jobList.empty()); }); + + if (m_quit) { return false; } + + // Ok, we have a job + job = m_jobList.front(); + m_jobList.pop_front(); + + m_nJobsRunning++; + + return true; +} + +bool ParallelExecutor::declareDone() +{ + std::unique_lock lock(m_jobMutex); + + m_nJobsRunning--; + m_jobDone.notify_one(); + + return true; +} + +bool ParallelExecutor::clearPendingJobs() +{ + std::unique_lock lock(m_jobMutex); + m_jobList.clear(); + return true; +} + +size_t ParallelExecutor::getJobCount() const +{ + std::unique_lock lock(m_jobMutex); + return m_jobList.size(); +} + +bool ParallelExecutor::isIdle() const +{ + std::unique_lock lock(m_jobMutex); + return (m_jobList.empty() && m_nJobsRunning == 0); +} + + +//___________________________________________________________________// +// // + +void testFunction(void* data) +{ + for (uint32_t i = 0; i < 10; ++i) + { + std::cout << "Fun: " << *static_cast(data) << "\n"; + System::Time::sleep(*static_cast(data)); + } + // return true; +} + +bool ParallelExecutor::launchTest() +{ + std::array stuff = { 500, 666, 50, 1000, 300, 100 }; + + std::cout << "Push test\n"; + + this->pushJob(std::bind(testFunction, &stuff[0])); + this->waitForAll(); + this->pushJob(std::bind(testFunction, &stuff[1])); + this->pushJob(std::bind(testFunction, &stuff[2])); + this->pushJob(std::bind(testFunction, &stuff[3])); + this->pushJob(std::bind(testFunction, &stuff[4])); + this->pushJob(std::bind(testFunction, &stuff[2])); + this->waitForAll(); + this->waitForAll(); + + std::cout << "Pushlist test\n"; + + std::deque jobList; + jobList.push_back(std::bind(testFunction, &stuff[0])); + jobList.push_back(std::bind(testFunction, &stuff[1])); + this->pushJobList(jobList); + this->waitForAll(); + + std::cout << "Done\n"; + + return true; +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/ProcExternalProcessing.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/ProcExternalProcessing.cpp new file mode 100755 index 0000000..1b9f491 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/ProcExternalProcessing.cpp @@ -0,0 +1,512 @@ +#include "ProcExternalProcessing.h" + +#include +#include +#include + +#include +#include + +#include + +#include // std::max + +#include "CodecFactory.h" + +// thread:: +// wait for connection; +// while(connected ||!quit) +// { +// waitForChunk(); +// pushChunk(); +// } +// if(quit) { +// pushEndStim(); // XML have player controller that will quit +// } +// exit; + +// #include "StreamChunk.h" +// #include "StreamSignalChunk.h" +// #include "StreamStimulationChunk.h" + +#include "Stream.h" +#include "TypeSignal.h" +#include "TypeStimulation.h" + +namespace OpenViBE { +namespace Tracker { + +void playerLaunch(const char* xmlFile, const char* args, bool playFast, bool noGUI, uint32_t identifier); // In processor.cpp + + +ProcExternalProcessing::ProcExternalProcessing(const Kernel::IKernelContext& ctx, const ProcExternalProcessing& other) : Processor(ctx) +{ + uint32_t sendPort, recvPort; + other.getProcessorPorts(sendPort, recvPort); + setProcessorPorts(sendPort, recvPort); + + bool noGui, doSend, doReceive; + other.getProcessorFlags(noGui, doSend, doReceive); + setProcessorFlags(noGui, doSend, doReceive); + + setArguments(other.getArguments()); + + initialize(other.getFilename()); +} + +bool ProcExternalProcessing::initialize(const std::string& xmlFile) +{ + m_pushStartTime = BufferedClient::CLIENT_NOT_STARTED; + m_pullStartTime = BufferedClient::CLIENT_NOT_STARTED; + + if (xmlFile.length() == 0) + { + // log() << Kernel::LogLevel_Trace << "No processor configured\n"; + m_xmlFilename.clear(); + return true; + } + + // log() << Kernel::LogLevel_Trace << "Processor: Initializing with " << xmlFile << "\n"; + + m_xmlFilename = xmlFile; + + return true; +} + +bool ProcExternalProcessing::uninitialize() +{ + // log() << Kernel::LogLevel_Trace << "Processor: Uninitializing\n"; + stop(); + + for (auto decoder : m_decoders) { delete decoder; } + m_decoders.clear(); + for (auto encoder : m_encoders) { delete encoder; } + m_encoders.clear(); + + return true; +} + +CTime ProcExternalProcessing::getCurrentTime() const +{ + const CTime startTime = (m_doSend ? m_pushStartTime : m_pullStartTime); + + if (startTime == BufferedClient::CLIENT_NOT_STARTED) { return CTime::min(); } + + const CTime refTime = CTime(m_pushClient ? m_pushClient->getTime() : m_pullClient->getTime()); + const CTime currentTime = refTime - startTime; + // log() << Kernel::LogLevel_Info << "Its " << CTime(currentTime).toSeconds() << "\n"; + + return currentTime; +} + +// If source track changes, we need a new codec since they are bound to the streams +// @todo make streamless? +bool ProcExternalProcessing::setNewSource(StreamBundle* source, const bool sendHeader, const bool sendEnd) +{ + m_sendHeader = sendHeader; + m_sendEnd = sendEnd; + m_src = source; + + for (auto encoder : m_encoders) { delete encoder; } + m_encoders.clear(); + return true; +} + +bool ProcExternalProcessing::setNewTarget(StreamBundle* target) +{ + m_dst = target; + + for (auto decoder : m_decoders) { delete decoder; } + m_decoders.clear(); + + return true; +} + + +// Sends all chunks up to the current time point t +bool ProcExternalProcessing::push() +{ + if (m_xmlFilename.length() == 0) { return false; } + + if (!m_doSend) + { + // This processor is configured to receive, so we do nothing on send + return true; + } + + if (!m_pushClient || m_pushClient->hasQuit()) + { + this->stop(); + return false; + } + + if (!m_src) { return false; } + + if (m_pushStartTime == BufferedClient::CLIENT_NOT_STARTED) + { + m_pushStartTime = m_pushClient->getStartTime(); + if (m_pushStartTime == BufferedClient::CLIENT_NOT_STARTED) + { + // Not yet synced + return true; + } + } + + bool foundSomething = false; + m_sentSomething = false; + + uint64_t chunksSent = 0; + + while (true) + { + size_t streamIndex; + StreamPtr stream = m_src->getNextStream(streamIndex); + + if (!stream) { break; } + + if (m_encoders.size() <= streamIndex) + { + m_encoders.resize(streamIndex + 1, nullptr); + m_encoders[streamIndex] = CodecFactory::getEncoder(m_kernelCtx, *stream); + } + + CTime chunkStartTime = CTime::min(), chunkEndTime = CTime::min(); + if (!stream->peek(chunkStartTime, chunkEndTime)) + { + // if peek fails maybe the stream has ended? + break; + } + + // There is something to send, now or later + foundSomething = true; + + const CTime elapsedTime = getCurrentTime(); + + // Send if its time + if (elapsedTime >= chunkStartTime + m_previousEnd) + { + EncodedChunk chunk; + EChunkType outputType; + m_encoders[streamIndex]->setEncodeOffset(m_previousEnd); + if (m_encoders[streamIndex]->encode(chunk, outputType)) + { + const bool dontPush = (!m_sendHeader && outputType == EChunkType::Header) || (!m_sendEnd && outputType == EChunkType::End); + + if (!dontPush) + { + chunk.m_StreamIndex = streamIndex; + m_pushClient->pushBuffer(chunk); + m_pushLastTime = chunk.m_EndTime; + + /* + log() << Kernel::LogLevel_Info << "Enc str " << streamIndex << " at " << CTime(elapsedTime).toSeconds() + << " chk [" << CTime(chunk.m_startTime).toSeconds() + << "," << CTime(chunk.m_endTime).toSeconds() + << "]\n"; + */ + m_sentSomething = true; + chunksSent++; + } + + stream->step(); + } + else + { + // log() << Kernel::LogLevel_Error << "Error: Failed to encode chunk\n"; + return false; + } + } + else + { + // We are early + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + break; + } + + // } while (sentSomething || m_PlayFast); // we loop until we have sent everything up to this moment. + } + + if (m_sentSomething) + { + //log() << Kernel::LogLevel_Info << "flush\n"; + m_pushClient->requestFlush(); + } + + + // @fixme note that the while loop above may take long to return the control flow for some + // bad streams + + + if (!foundSomething) + { + // Maybe all streams ended? + // log() << Kernel::LogLevel_Info << "Nothing to send - all streams ended?\n"; + + // Update time offset for 'continuous sending' mode + // n.b. we can always do this, since for noncontinuous mode, new play() will be called, resetting these + if (m_src->isFinished() && !m_requestNewOffset) + { + const CTime maxEndTime = m_src->getMaxDuration(); + m_previousEnd += maxEndTime; // Incremental for more than 2 tracks + m_requestNewOffset = true; + + // log() << Kernel::LogLevel_Info << "New offset at " << CTime(m_PreviousEnd).toSeconds() << "\n"; + } + + // We do this to keep the External Processing box running on the designer side + m_pushClient->requestFlush(); + + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + + return false; + } + + if (!m_playFast) + { + // std::this_thread::sleep_for(std::chrono::milliseconds(1)); + // std::this_thread::yield(); + } + + return true; +} + +// Sends all chunks up to the current time point t +bool ProcExternalProcessing::pop() +{ + if (m_xmlFilename.length() == 0) { return false; } + + if (!m_doReceive) + { + // This processor is configured to send, so we do nothing on receive + return true; + } + + if (!m_pullClient || !m_dst) { return false; } + + if (m_pullClient->hasQuit()) + { + this->stop(); + return false; + } + + if (m_pullStartTime == BufferedClient::CLIENT_NOT_STARTED) + { + m_pullStartTime = m_pullClient->getStartTime(); + if (m_pullStartTime == BufferedClient::CLIENT_NOT_STARTED) + { + // Not yet synced + return true; + } + } + + EncodedChunk chunk; + bool gotSomething = false; + while (m_pullClient->pullBuffer(chunk)) + { + // log() << Kernel::LogLevel_Info << "Got chunk " << chunk.m_startTime << "," << chunk.m_endTime << "\n"; + StreamPtr targetStream = m_dst->getStream(chunk.m_StreamIndex); + if (!targetStream) + { + if (!m_dst->createStream(chunk.m_StreamIndex, chunk.m_StreamType)) { continue; } + targetStream = m_dst->getStream(chunk.m_StreamIndex); + if (m_decoders.size() <= chunk.m_StreamIndex) { m_decoders.resize(chunk.m_StreamIndex + 1, nullptr); } + m_decoders[chunk.m_StreamIndex] = CodecFactory::getDecoder(m_kernelCtx, *targetStream); + } + + // @note Decoder doesn't need to add offsets as these times are coming from the + // external processor, so they are already offset by the past length. + if (!chunk.m_Buffer.empty()) + { + m_decoders[chunk.m_StreamIndex]->decode(chunk); + + /* + log() << Kernel::LogLevel_Info << "Dec str " << chunk.streamIndex << " chk [" << CTime(chunk.m_startTime).toSeconds() + << "," << CTime(chunk.m_endTime).toSeconds() << "]\n"; + */ + } + + m_pullLastTime = chunk.m_EndTime; + + gotSomething = true; + } + + if (!gotSomething) { std::this_thread::sleep_for(std::chrono::milliseconds(1)); } + + if (m_pullClient->hasQuit()) { return false; } + + return true; +} + +bool ProcExternalProcessing::play(const bool playFast, const std::function& quitCB, const std::function& nextTrackFun) +{ + m_pushLastTime = CTime::min(); + m_pullLastTime = CTime::min(); + m_isRunning = false; + + if (m_xmlFilename.length() == 0) + { + log() << Kernel::LogLevel_Error << "Error: No processor initialized\n"; + return false; + } + + m_chunksSent = 0; + // m_PreviousChunkEnd = 0; + m_playFast = playFast; // @todo To work neatly it'd be better to be able to pass in the chunk times to the designer side + m_previousEnd = 0; + m_requestNewOffset = false; + + for (auto decoder : m_decoders) { delete decoder; } + m_decoders.clear(); + for (auto encoder : m_encoders) { delete encoder; } + m_encoders.clear(); + + // log() << Kernel::LogLevel_Info << "Reset offset to " << CTime(m_PreviousEnd).toSeconds() << "\n"; + + const CString expandedName = m_kernelCtx.getConfigurationManager().expand(m_xmlFilename.c_str()); + + std::stringstream ss; + ss << "--define Tracker_Port_Send " << m_sendPort << " "; + ss << "--define Tracker_Port_Receive " << m_recvPort << " "; + + const std::string allArgs = m_arguments + " " + ss.str(); + + m_playerThread = new std::thread(std::bind(&playerLaunch, expandedName, allArgs.c_str(), m_playFast, m_noGUI, m_sendPort)); + + // @fixme this ad-hoc sleep is pretty terrible, but it seems that if player launch is slow enough and + // we launch the client threads immediately below, in Windows it results in deadlocks and errors, suggesting that + // the concurrency control logic is not really correct in the communication with the external processing box. + std::this_thread::sleep_for(std::chrono::milliseconds(2000)); + + if (m_doSend) + { + m_pushClient = new PushClient(m_sendPort); + m_pushClientThread = new std::thread(&PushClient::start, m_pushClient); + } + if (m_doReceive) + { + m_pullClient = new PullClient(m_recvPort); + m_pullClientThread = new std::thread(&PullClient::start, m_pullClient); + } + + // log() << Kernel::LogLevel_Debug << "External processing thread(s) launched, waiting sync\n"; + + for (size_t retries = 0; retries < 20; ++retries) + { + if (m_doSend) { m_pushStartTime = m_pushClient->getStartTime(); } + if (m_doReceive) { m_pullStartTime = m_pullClient->getStartTime(); } + if (isSynced()) + { + // log() << Kernel::LogLevel_Debug << "Clients synced after " << retries << " retries\n"; + break; + } + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + } + if (!isSynced()) + { + // log() << Kernel::LogLevel_Error << "Error syncing client(s) after 10 secs of retries\n"; + if (m_pushClient) { m_pushClient->requestQuit(); } + if (m_pullClient) { m_pullClient->requestQuit(); } + return false; + } + + m_isRunning = true; + while (m_isRunning) + { + m_isRunning &= push(); + m_isRunning &= pop(); + + if (!m_isRunning && nextTrackFun) { m_isRunning = nextTrackFun(); } + // @fixme the quit callback might be a bit expensive, shouldn't hammer it + if (quitCB && quitCB((m_doSend ? m_pushLastTime : m_pullLastTime))) { m_isRunning = false; } + } + + stop(); + + return true; +} + +bool ProcExternalProcessing::stop() +{ + m_isRunning = false; + + if (m_pushClient) + { + // log() << Kernel::LogLevel_Info << "Stopping external processing push client\n"; + + m_pushClient->requestQuit(); + if (m_pushClientThread) { m_pushClientThread->join(); } + delete m_pushClientThread; + m_pushClientThread = nullptr; + delete m_pushClient; + m_pushClient = nullptr; + } + + if (m_pullClient) + { + // log() << Kernel::LogLevel_Info << "Stopping external processing pull client\n"; + + m_pullClient->requestQuit(); + if (m_pullClientThread) { m_pullClientThread->join(); } + delete m_pullClientThread; + m_pullClientThread = nullptr; + delete m_pullClient; + m_pullClient = nullptr; + } + + // tear down the player object + if (m_playerThread) + { + // log() << Kernel::LogLevel_Trace << "Joining player thread\n"; + m_playerThread->join(); + delete m_playerThread; + m_playerThread = nullptr; + } + + m_pushStartTime = BufferedClient::CLIENT_NOT_STARTED; + m_pullStartTime = BufferedClient::CLIENT_NOT_STARTED; + + return true; +} + +bool ProcExternalProcessing::save() +{ + auto& mgr = m_kernelCtx.getConfigurationManager(); + + std::stringstream sPort; + sPort << m_sendPort; + // std::stringstream rPort; rPort << m_RecvPort; + + mgr.addOrReplaceConfigurationToken("Tracker_Workspace_Processor", m_xmlFilename.c_str()); + mgr.addOrReplaceConfigurationToken("Tracker_Workspace_Processor_FirstPort", sPort.str().c_str()); + // mgr.addOrReplaceConfigurationToken("Tracker_Workspace_Processor_RecvPort", rPort.str().c_str()); + mgr.addOrReplaceConfigurationToken("Tracker_Workspace_Processor_NoGUI", (m_noGUI ? "true" : "false")); + mgr.addOrReplaceConfigurationToken("Tracker_Workspace_Processor_DoSend", (m_doSend ? "true" : "false")); + mgr.addOrReplaceConfigurationToken("Tracker_Workspace_Processor_DoReceive", (m_doReceive ? "true" : "false")); + + return true; +} + +bool ProcExternalProcessing::load() +{ + auto& mgr = m_kernelCtx.getConfigurationManager(); + + if (mgr.lookUpConfigurationTokenIdentifier("Tracker_Workspace_Processor") != CIdentifier::undefined()) + { + initialize(mgr.lookUpConfigurationTokenValue("Tracker_Workspace_Processor").toASCIIString()); + } + + if (mgr.lookUpConfigurationTokenIdentifier("Tracker_Workspace_Processor_FirstPort") != CIdentifier::undefined()) + { + const uint32_t port = uint32_t(mgr.expandAsUInteger("${Tracker_Workspace_Processor_FirstPort}")); + setProcessorPorts(port, port + 1); + } + + m_noGUI = mgr.expandAsBoolean("${Tracker_Workspace_Processor_NoGUI}", m_noGUI); + m_doSend = mgr.expandAsBoolean("${Tracker_Workspace_Processor_DoSend}", m_doSend); + m_doReceive = mgr.expandAsBoolean("${Tracker_Workspace_Processor_DoReceive}", m_doReceive); + + return true; +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/ProcExternalProcessingHelper.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/ProcExternalProcessingHelper.cpp new file mode 100755 index 0000000..b380bcc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/ProcExternalProcessingHelper.cpp @@ -0,0 +1,262 @@ +#include +#include +#include + +#include + +#include "ProcExternalProcessingHelper.h" + +namespace OpenViBE { +namespace Tracker { + +const CTime BufferedClient::CLIENT_NOT_STARTED = CTime::max(); + +void BufferedClient::requestQuit() +{ + std::lock_guard oLock(m_threadMutex); + m_pleaseQuit = true; + m_bufferCondition.notify_one(); +} + +bool BufferedClient::hasQuit() +{ + std::lock_guard oLock(m_threadMutex); + return m_hasQuit; +} + +void BufferedClient::start() +{ + if (!connectClient()) + { + std::lock_guard oLock(m_threadMutex); + m_hasQuit = true; + return; + } + + while (true) + { + // Push or pull, uses lock internally + if (!step()) { break; } + + { + std::lock_guard oLock(m_threadMutex); + + // Exit the loop if we're told to quit or if we've lost the connection + if (m_pleaseQuit || !isConnected() || isEndReceived()) { break; } + } + } + + // Shut the connection + this->close(); + + { + std::lock_guard oLock(m_threadMutex); + m_hasQuit = true; + } + + // The thread will exit here and can be joined +} + +bool BufferedClient::connectClient() +{ + static int connectId = 0; + + std::stringstream cId; + cId << std::string("tracker"); + cId << connectId++; + + const std::string connectionID = cId.str(); + this->setConnectionID(connectionID); + int errorCount = 0; + while (!this->connect("127.0.0.1", m_port)) + { + const ELibraryError error = this->getLastError(); + + if (error == Socket_FailedToConnect) + { + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + if (errorCount++ > 20) + { + std::cout << "Designer not responding on port " << m_port << " retried 5 secs" << std::endl; + return false; + } + } + else + { + std::cout << "Error " << error << std::endl; + return false; + } + + //if (s_DidRequestForcedQuit) { exit(EXIT_SUCCESS); } + } + + // Announce to server that the box has finished initializing and wait for acknowledgement + errorCount = 0; + while (!this->waitForSyncMessage()) + { + if (errorCount++ > 10) + { + std::cout << "Server not syncing in port " << m_port << std::endl; + this->close(); + return false; + } + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + } + this->pushLog(Communication::ELogLevel::LogLevel_Info, "Received Ping"); + + this->pushSync(); + this->pushLog(Communication::ELogLevel::LogLevel_Info, "Sent Pong"); + + { + std::lock_guard oLock(m_threadMutex); + m_startTime = this->getTime(); + } + + return true; +} + +bool PushClient::pushBuffer(const EncodedChunk& encodedChunk) +{ + { + std::lock_guard oLock(m_threadMutex); + if (!m_pleaseQuit) + { + EncodedChunk* buffer = new EncodedChunk(encodedChunk); + m_buffer.push_back(buffer); + } + } + + // No big harm notifying in any case, though if in 'quit' state, the quit request has already notified + m_bufferCondition.notify_one(); + + return true; +} + +bool PushClient::step() +{ + std::unique_lock oLock(m_threadMutex, std::defer_lock); + + oLock.lock(); + + // Normal condition for the wait to exit is the flush request or having more data + m_bufferCondition.wait(oLock, [this]() { return (m_pleaseFlush || !m_buffer.empty() || m_pleaseQuit || !isConnected() || isEndReceived()); }); + + while (!m_buffer.empty()) + { + EncodedChunk* chunk = m_buffer[0]; + m_buffer.pop_front(); + + if (!this->pushEBML(chunk->m_StreamIndex, chunk->m_StartTime.time(), chunk->m_EndTime.time(), + std::make_shared>(chunk->m_Buffer))) + { + std::cerr << "Failed to push EBML.\n"; + std::cerr << "Error " << this->getLastError() << "\n"; + oLock.unlock(); + return false; + } + + delete chunk; + } + + if (m_pleaseFlush) + { + this->pushSync(); + m_pleaseFlush = false; + + // We don't use condition variable here as users of the client should never + // be able to interrupt this wait unless error state is reached + while (!m_pleaseQuit && isConnected() && !isEndReceived() && !this->waitForSyncMessage()) + { + oLock.unlock(); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + oLock.lock(); + } + } + + oLock.unlock(); + + return true; +} + +void PushClient::requestFlush() +{ + std::lock_guard oLock(m_threadMutex); + m_pleaseFlush = true; + m_bufferCondition.notify_one(); +} + +bool PullClient::pullBuffer(EncodedChunk& chunk) +{ + std::lock_guard oLock(m_threadMutex); + + if (m_buffer.empty()) { return false; } + + EncodedChunk* ptr = m_buffer[0]; + m_buffer.pop_front(); + chunk = *ptr; + delete ptr; + + return true; +} + +bool PullClient::popMessagesToBuffer() +{ + uint64_t packetId, startTime, endTime; + size_t streamIndex; + std::shared_ptr> ebml; + bool gotSomething = false; + + while (this->popEBML(packetId, streamIndex, startTime, endTime, ebml)) + { + // @todo optimize by passing in the buffer to popEBML already + EncodedChunk* chunk = new EncodedChunk(); + + chunk->m_StartTime = startTime; + chunk->m_EndTime = endTime; + chunk->m_StreamIndex = streamIndex; + + // @fixme inefficient to query for each chunk since its stream specific + uint64_t id; + std::string streamName; + this->getInput(chunk->m_StreamIndex, id, chunk->m_StreamType, streamName); + + chunk->m_Buffer.resize(ebml->size()); + for (size_t i = 0; i < ebml->size(); ++i) { chunk->m_Buffer[i] = (*ebml)[i]; } + + { + std::lock_guard oLock(m_threadMutex); + m_buffer.push_back(chunk); + } + + gotSomething = true; + + //std::cout << "Got pkg " << packetId << " idx " << streamIndex << " siz " << chunk.bufferData.size() << "\n"; + } + + return gotSomething; +} + +// pull +bool PullClient::step() +{ + // Pull items until we get the sync message (no more to send) + while (!this->waitForSyncMessage() && this->isConnected() && !this->isEndReceived()) + { + popMessagesToBuffer(); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + // std::this_thread::yield(); + } + + // Got sync, pull whatever remaining buffered on the sender + popMessagesToBuffer(); + + if (!this->isConnected() || this->isEndReceived()) { return false; } + + // Notify we've processed everything + this->pushSync(); + + return true; +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/Processor.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/Processor.cpp new file mode 100755 index 0000000..3f9a353 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/Processor.cpp @@ -0,0 +1,118 @@ +#include "Processor.h" + +#include +#include + +#include +#include + +#include +#include +#include + +namespace OpenViBE { +namespace Tracker { + +void playerLaunch(const char* xmlFile, const char* args, bool playFast, bool noGUI, uint32_t identifier) +{ + std::string designer = std::string(Directories::getBinDir().toASCIIString()) + "/openvibe-designer.exe"; + std::string argsAll = std::string(" --no-session-management ") + (args ? args : "") + (noGUI ? "--no-gui " : "") + (playFast ? "--play-fast " : " --play ") + + " " + "\"" + xmlFile + "\""; + if (!FS::Files::directoryExists(Directories::getUserDataDir().toASCIIString())) { FS::Files::createPath(Directories::getUserDataDir().toASCIIString()); } + + std::stringstream ss; + ss << std::string(Directories::getLogDir().toASCIIString()) << "/tracker-processor-dump-" << identifier << ".txt"; + std::string outputDump = ss.str(); + + std::time_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); + std::ofstream outStream(outputDump.c_str(), std::ios::app); + outStream << std::endl << "Date of launch: " << std::ctime(&now) << std::endl; + outStream << "Trying to launch: " << designer << std::endl; + outStream << "Args: " << argsAll << std::endl; + outStream << "Logging to: " << outputDump << std::endl; + outStream << std::endl; + outStream.close(); + +#if TARGET_OS_Windows + + STARTUPINFO si; + PROCESS_INFORMATION pi; + + // set the size of the structures + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + + SECURITY_ATTRIBUTES sa; + sa.nLength = sizeof(sa); + sa.lpSecurityDescriptor = nullptr; + sa.bInheritHandle = TRUE; + + HANDLE h = CreateFile(outputDump.c_str(), FILE_APPEND_DATA, FILE_SHARE_WRITE | FILE_SHARE_READ, &sa, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); + + si.dwFlags |= STARTF_USESTDHANDLES; + si.hStdInput = nullptr; + si.hStdError = h; + si.hStdOutput = h; + + argsAll = std::string("\"") + designer + std::string("\"") + std::string(" ") + argsAll; + + LPSTR argsLp = const_cast(argsAll.c_str()); + + BOOL retVal = CreateProcess(designer.c_str(), // the path + argsLp, // Command line + nullptr, // Process handle not inheritable + nullptr, // Thread handle not inheritable + TRUE, // Set handle inheritance to FALSE + 0, // No creation flags + nullptr, // Use parent's environment block + nullptr, // Use parent's starting directory + &si, // Pointer to STARTUPINFO structure + &pi // Pointer to PROCESS_INFORMATION structure (removed extra parentheses) + ); + // Close process and thread handles. + if (!retVal) { std::cout << "err: " << GetLastError() << "\n"; } + else { WaitForSingleObject(pi.hProcess, INFINITE); } + + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + CloseHandle(h); +#else + + auto cmd = designer + argsAll + " >" + outputDump; + +// std::cout << "Call is: " << cmd << "\n"; + + if (system(cmd.c_str()) != 0) + { + std::cout << "Launch of [" << cmd << "] failed\n"; + } +#endif +} + +bool Processor::configure(const char* filename) +{ + const std::string usedFilename = (filename ? filename : m_xmlFilename.c_str()); + + if (usedFilename.length() == 0) + { + log() << Kernel::LogLevel_Error << "Error: Please set processor filename first\n"; + return false; + } + + const CString expandedName = m_kernelCtx.getConfigurationManager().expand(usedFilename.c_str()); + + const std::string designer = std::string(Directories::getBinDir().toASCIIString()) + "/openvibe-designer --no-session-management --open "; + const std::string outputDump = std::string(Directories::getDistRootDir().toASCIIString()) + "/tracker-processor-configure-dump.txt"; + const std::string cmd = designer + expandedName.toASCIIString() + " >" + outputDump; + + if (system(cmd.c_str()) != 0) + { + log() << Kernel::LogLevel_Error << "Launch of [" << cmd << "] failed\n"; + return false; + } + return true; +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/Selection.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/Selection.cpp new file mode 100755 index 0000000..94227eb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/Selection.cpp @@ -0,0 +1,135 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// + +#include "Selection.h" + +#include +#include + +namespace OpenViBE { +namespace Tracker { + +bool Selection::reset(const bool state) const +{ + for (auto& t : m_tracks) { for (auto& s : t->getAllStreams()) { s->setSelected(state); } } + return true; +} + +bool Selection::isEmpty() const +{ + for (const auto& t : m_tracks) { if (t->getNumStreams() > 0) { return false; } } + return true; +} + +bool Selection::isSomethingSelected() const +{ + for (const auto& t : m_tracks) { for (const auto& str : t->getAllStreams()) { if (str->getSelected()) { return true; } } } + return false; +} + + +bool Selection::isTrackSelected(const size_t track) const +{ + if (track >= m_tracks.size()) { return false; } + for (const auto& s : m_tracks[track]->getAllStreams()) { if (s->getSelected()) { return true; } } + return false; +} + +bool Selection::isSelectionConsistent() const +{ + if (isEmpty() || !isSomethingSelected()) { return true; } + + std::vector selectedTypesPrevious; + + // Check that selection for each track is identical to selection of previous track + // (empty selections per track are ignored) + for (auto& t : m_tracks) + { + std::vector selectedTypes; + for (const auto& s : t->getAllStreams()) { if (s->getSelected()) { selectedTypes.push_back(s->getTypeIdentifier()); } } + if (!selectedTypesPrevious.empty() && !selectedTypes.empty() && selectedTypesPrevious != selectedTypes) { return false; } + if (!selectedTypes.empty()) { selectedTypesPrevious = selectedTypes; } + } + + return true; +} + +size_t Selection::countSelectedTracks() const +{ + size_t selectedTracks = 0; + + for (const auto& t : m_tracks) + { + for (const auto& s : t->getAllStreams()) + { + if (s->getSelected()) + { + selectedTracks++; + break; + } + } + } + + return selectedTracks; +} + +size_t Selection::countSelectedStreams(const size_t trackIndex) const +{ + if (trackIndex >= m_tracks.size()) { return 0; } + + size_t numSelected = 0; + for (const auto& str : m_tracks[trackIndex]->getAllStreams()) { if (str && str->getSelected()) { numSelected++; } } + return numSelected; +} + +bool Selection::save(const char* prefix) const +{ + auto& mgr = this->getKernelContext().getConfigurationManager(); + + // @note with really huge datasets the .ovw file handling can get slow. should be profiled. + for (size_t t = 0; t < m_tracks.size(); ++t) + { + std::stringstream token; + token << prefix << "Track_" << std::setw(3) << std::setfill('0') << (t + 1) << "_Selected"; + std::stringstream value; + + for (size_t s = 0; s < m_tracks[t]->getNumStreams(); ++s) { if (m_tracks[t]->getStream(s)->getSelected()) { value << (s + 1) << " "; } } + + mgr.addOrReplaceConfigurationToken(token.str().c_str(), value.str().c_str()); + } + + return true; +} + +// Relies on the current track/stream set being compatible with the tokens. no error checking +bool Selection::load(const char* prefix) const +{ + auto& mgr = this->getKernelContext().getConfigurationManager(); + + for (size_t t = 0; t < m_tracks.size(); ++t) + { + std::stringstream token; + token << prefix << "Track_" << std::setw(3) << std::setfill('0') << (t + 1) << "_Selected"; + + std::stringstream value(mgr.lookUpConfigurationTokenValue(token.str().c_str()).toASCIIString()); + + // Mark everything as unselected by default + for (size_t s = 0; s < m_tracks[t]->getNumStreams(); ++s) { m_tracks[t]->getStream(s)->setSelected(false); } + + // Load sparse selection from file + std::string selected; + while (std::getline(value, selected, ' ')) + { + const uint32_t selectedIdx = atoi(selected.c_str()) - 1; + if (selectedIdx < m_tracks[t]->getNumStreams()) { m_tracks[t]->getStream(selectedIdx)->setSelected(true); } + } + } + + return true; +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StimulationStreamFilter.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StimulationStreamFilter.cpp new file mode 100755 index 0000000..abd1cdc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StimulationStreamFilter.cpp @@ -0,0 +1,70 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// + +#include "Stream.h" +#include "StimulationStreamFilter.h" + +#include "TypeStimulation.h" + +namespace OpenViBE { +namespace Tracker { + +// @note At some point I thought to make a derived class of stimulation stream that simply wouldn't pass through +// the filtered stimulations on calling the getChunk(), but this resulted in some issues. Since modifying +// the original stream would not have been appropriate, I'd have had to choose one of the following, +// 1) make getChunk() in general copy all data instead of returning pointers 2) drop const qualifier +// from the getChunk() to keep track of allocated memory internally in the derived class or 3) make getChunk() +// return a smart pointer. I wasn't very happy about these options, so instead we just make a modded copy of the stream. +std::shared_ptr filterStimulationStreamEndPoints(const std::shared_ptr& src, const Kernel::IKernelContext& ctx) +{ + const std::vector stims = { OVTK_StimulationId_ExperimentStop, OVTK_StimulationId_EndOfFile, OVTK_GDF_End_Of_Session }; + + auto result = filterStimulationStream(src, ctx, stims); + return result; +} + +std::shared_ptr filterStimulationStream(const std::shared_ptr& src, const Kernel::IKernelContext& ctx, + const std::vector& stimsToFilter) +{ + if (src->getTypeIdentifier() != OV_TypeId_Stimulations) { return nullptr; } + + const auto typedSrc = std::static_pointer_cast>(src); + auto target = std::make_shared>(ctx); + + target->clear(); + + target->getHeader().m_StartTime = typedSrc->getHeader().m_StartTime; + target->getHeader().m_EndTime = typedSrc->getHeader().m_EndTime; + + for (size_t chk = 0; chk < typedSrc->getChunkCount(); ++chk) + { + const auto chunk = typedSrc->getChunk(chk); + auto newChunk = new TypeStimulation::Buffer; + + for (size_t i = 0; i < chunk->m_buffer.getStimulationCount(); ++i) + { + const uint64_t id = chunk->m_buffer.getStimulationIdentifier(i); + if (std::none_of(stimsToFilter.begin(), stimsToFilter.end(), [id](const uint64_t val) { return val == id; })) + { + const uint64_t timestamp = chunk->m_buffer.getStimulationDate(i); + const uint64_t duration = chunk->m_buffer.getStimulationDuration(i); + newChunk->m_buffer.appendStimulation(id, timestamp, duration); + } + } + + newChunk->m_StartTime = chunk->m_StartTime; + newChunk->m_EndTime = chunk->m_EndTime; + + target->push(newChunk); + } + + target->getEnd().m_StartTime = typedSrc->getEnd().m_StartTime; + target->getEnd().m_EndTime = typedSrc->getEnd().m_EndTime; + + return target; +} +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamBundle.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamBundle.cpp new file mode 100755 index 0000000..c779083 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamBundle.cpp @@ -0,0 +1,197 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// + +#include +#include + +#include "StreamBundle.h" + +#include "Stream.h" + +#include "StreamFactory.h" + +namespace OpenViBE { +namespace Tracker { + +bool StreamBundle::deepCopy(const StreamBundle& other) +{ + bool retVal = true; + + // Clear streams + initialize(); + + // Copy each stream + for (size_t i = 0; i < other.getNumStreams(); ++i) + { + retVal &= createStream(i, other.getStream(i)->getTypeIdentifier()); + retVal &= getStream(i)->copy(*other.getStream(i)); + } + + m_source = other.getSource(); + setDirtyBit(other.getDirtyBit()); + + return retVal; +} + +bool StreamBundle::copyFrom(StreamBundle& other) +{ + initialize(); + + for (const auto& str : other.getAllStreams()) { if (str->getSelected()) { this->setStream(m_streams.size(), str); } } + + setSource(other.getSource()); + setDirtyBit(other.getDirtyBit()); + + // n.b. this will affect the streams we copied + rewind(); + + return true; +} + +bool StreamBundle::initialize() +{ + //reset first + uninitialize(); + m_dirty = true; + // log() << Kernel::LogLevel_Debug << "Streams initialized ok\n"; + return true; +} + +bool StreamBundle::uninitialize() +{ + // Since m_Streams are shared pointers, no need to delete them + m_streams.clear(); + return true; +} + +bool StreamBundle::rewind() +{ + bool returnValue = true; + std::for_each(m_streams.begin(), m_streams.end(), [&returnValue](const StreamPtr& entry) { if (entry) { returnValue &= entry->reset(); } }); + return returnValue; +} + +bool StreamBundle::createStream(const size_t index, const CIdentifier& typeID) +{ + if (index >= m_streams.size()) { m_streams.resize(index + 1, nullptr); } + + if (m_streams[index] == nullptr) + { + const StreamPtr stream = StreamFactory::getStream(m_kernelCtx, typeID); + if (!stream) { return false; } + m_streams[index] = stream; + setDirtyBit(true); + return true; + } + + log() << Kernel::LogLevel_Error << "Error: Slot " << index << " is already used\n"; + + return false; +} + +bool StreamBundle::deleteStream(const size_t index) +{ + if (index > m_streams.size()) + { + log() << Kernel::LogLevel_Error << "Error: Stream index exceeds array size\n"; + return false; + } + + // m_Streams is shared ptrs, no need to delete + m_streams.erase(m_streams.begin() + index); + setDirtyBit(true); + return true; +} + +bool StreamBundle::getNextStreamIndex(size_t& index) const +{ + if (m_streams.empty()) { return false; } + + // Find the stream with the earliest chunk, return the stream + CTime earliestTime = CTime::max(); + bool foundSomething = false; + + for (size_t i = 0; i < m_streams.size(); ++i) + { + const StreamPtr ptr = m_streams[i]; + + CTime startTime = CTime::min(), endTime = CTime::min(); + if (ptr && ptr->peek(startTime, endTime) && startTime < earliestTime) + { + earliestTime = startTime; + index = int(i); + foundSomething = true; + } + } + + if (!foundSomething) + { + //log() << Kernel::LogLevel_Info << "All streams exhausted\n"; + return false; + } + return true; +} + +StreamPtr StreamBundle::getNextStream(size_t& index) +{ + index = -1; + if (getNextStreamIndex(index)) { return m_streams[index]; } + return nullptr; +} + +CTime StreamBundle::getMaxDuration() const +{ + CTime maxDuration = CTime::min(); + for (size_t i = 0; i < m_streams.size(); ++i) + { + if (m_streams[i]) + { + CTime streamDuration = m_streams[i]->getDuration(); + maxDuration = std::max(maxDuration, streamDuration); + } + } + return maxDuration; +} + + +bool StreamBundle::setStream(const size_t index, const std::shared_ptr& ptr) +{ + if (index >= m_streams.size()) { m_streams.resize(index + 1, nullptr); } + m_streams[index] = ptr; + setDirtyBit(true); + return true; +} + +bool StreamBundle::swapStreams(const size_t idx1, const size_t idx2) +{ + if (idx1 >= m_streams.size() || idx2 >= m_streams.size()) { return false; } + + const auto it1 = m_streams.begin() + idx1; + const auto it2 = m_streams.begin() + idx2; + + std::iter_swap(it1, it2); + + setDirtyBit(true); + + return true; +} + +bool StreamBundle::moveStream(const size_t srcIdx, const size_t dstIdx) +{ + if (srcIdx >= getNumStreams() || dstIdx >= getNumStreams()) { return false; } + if (srcIdx == dstIdx) { return true; } + + const auto oldPtr = m_streams[srcIdx]; + m_streams.erase(m_streams.begin() + srcIdx); + m_streams.insert(m_streams.begin() + dstIdx, oldPtr); + + setDirtyBit(true); + + return true; +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamBundleImportExport.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamBundleImportExport.cpp new file mode 100755 index 0000000..d4d9514 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamBundleImportExport.cpp @@ -0,0 +1,106 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// + +// n.b. having this as a separate file so EBML/Demuxer dependencies do not get pulled into StreamBundle + +#include +#include + +#include "StreamBundleImportExport.h" + +#include "EBMLSourceFile.h" +#include "Demuxer.h" +#include "BoxAdapterGenericStreamWriter.h" + +namespace OpenViBE { +namespace Tracker { + +StreamBundle* readStreamBundleFromFile(const Kernel::IKernelContext& ctx, const char* filename, const bool memorySaveMode) +{ + StreamBundle* newTrack = new StreamBundle(ctx); + + EBMLSourceFile origin(ctx); + if (!origin.initialize(filename)) + { + ctx.getLogManager() << Kernel::LogLevel_Error << "Unable to read from file " << filename << "\n"; + delete newTrack; + return nullptr; + } + + // Construct a track from the origin stream + Demuxer demux(ctx, origin, *newTrack); + + if (memorySaveMode) + { + // Try to get the stream types but don't pull the buffers + bool go = true; + while (go) + { + if (!demux.step()) + { + ctx.getLogManager() << Kernel::LogLevel_Trace << "Demuxer EOF\n"; + go = false; + } + + // n.b. here we use a heuristic that if at least a single chunk has been loaded, + // then all the headers should have been demuxed before that. There is no guarantee + // that this would always be the case, but it is very likely if the stream originates from + // an .ov file created by OpenViBE + for (size_t j = 0; j < newTrack->getNumStreams(); ++j) + { + if (newTrack->getStream(j)->getDuration().time() > 0) + { + go = false; + break; + } + } + } + + origin.uninitialize(); + + // Release memory + for (size_t i = 0; i < newTrack->getNumStreams(); ++i) { newTrack->getStream(i)->clear(); } + } + else + { + // Just read the whole file to memory + while (true) + { + if (!demux.step()) + { + ctx.getLogManager() << Kernel::LogLevel_Trace << "Demuxer EOF\n"; + break; + } + } + } + + origin.uninitialize(); + newTrack->setDirtyBit(false); + return newTrack; +} + +bool saveStreamBundleToFile(const Kernel::IKernelContext& ctx, StreamBundle* track, const char* filename) +{ + BoxAdapterGenericStreamWriter writer(ctx, *track, filename); + + bool retval = true; + + retval &= writer.initialize(); + retval &= writer.spool(false); + retval &= writer.uninitialize(); + + if (retval) + { + track->setSource(filename); + retval &= true; + track->setDirtyBit(false); + } + + return retval; +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererBase.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererBase.cpp new file mode 100755 index 0000000..e5e8c0c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererBase.cpp @@ -0,0 +1,322 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// +// @todo add horizontal scaling support +// @todo add event handlers +// @todo add ruler, stimulations, channel names, a million of other things + +#include +#include +#include + +#include + +#include +#include + +#include "StreamRendererBase.h" + +namespace OpenViBE { +namespace Tracker { + +bool StreamRendererBase::initialize() +{ + GtkBuilder* builder = gtk_builder_new(); + const CString filename = Directories::getDataDir() + "/applications/tracker/advanced-visualization.ui"; + GError* errorCode = nullptr; + if (!gtk_builder_add_from_file(builder, filename, &errorCode)) + { + log() << Kernel::LogLevel_Error << "Problem loading [" << filename << "] : " + << (errorCode ? errorCode->code : 0) << " " << (errorCode ? errorCode->message : "") << "\n"; + g_object_unref(builder); + return false; + } + + GtkWidget* window = GTK_WIDGET(gtk_builder_get_object(builder, "window")); + m_main = GTK_WIDGET(gtk_builder_get_object(builder, "table")); + // ::GtkWidget* toolbar = GTK_WIDGET(gtk_builder_get_object(pBuilder, "toolbar-window")); + + gtk_widget_ref(m_main); + gtk_container_remove(GTK_CONTAINER(window), m_main); + // We keep one ref, the caller can unref after having assigned the widget + + m_viewport = GTK_WIDGET(gtk_builder_get_object(builder, "viewport")); + m_top = GTK_WIDGET(gtk_builder_get_object(builder, "label_top")); // caption + m_left = GTK_WIDGET(gtk_builder_get_object(builder, "drawingarea_left")); + m_right = GTK_WIDGET(gtk_builder_get_object(builder, "drawingarea_right")); + m_bottom = GTK_WIDGET(gtk_builder_get_object(builder, "drawingarea_bottom")); + m_cornerLeft = GTK_WIDGET(gtk_builder_get_object(builder, "label_corner_left")); + m_cornerRight = GTK_WIDGET(gtk_builder_get_object(builder, "label_corner_right")); + + // @note this or something similar is needed or otherwise the widgets will all be crammed to the + // same fixed size aperture with no scrolling + // @todo give users some scaling options + // @fixme for some reason this causes a mess on the 'message' bar below in the UI, as if it didn't redraw properly + gtk_widget_set_size_request(m_main, 640, 200); + + m_color.r = 1; + m_color.g = 1; + m_color.b = 1; + + g_object_unref(builder); + builder = nullptr; + + return true; +} + +bool StreamRendererBase::uninitialize() +{ + for (size_t i = 0; i < m_renderers.size(); ++i) { AdvancedVisualization::IRenderer::release(m_renderers[i]); } + m_renderers.clear(); + + if (m_rendererCtx) + { + delete m_rendererCtx; + m_rendererCtx = nullptr; + } + + if (m_subRendererCtx) + { + delete m_subRendererCtx; + m_subRendererCtx = nullptr; + } + + if (m_ruler) + { + delete m_ruler; + m_ruler = nullptr; + } + + return true; +} + +bool StreamRendererBase::setTitle(const char* title) +{ + if (title) { gtk_label_set_text(GTK_LABEL(m_top), title); } + else { gtk_label_set_text(GTK_LABEL(m_top), ""); } + return true; +} + +bool StreamRendererBase::setRulerVisibility(const bool isVisible) +{ + m_isScaleVisible = isVisible; + return updateRulerVisibility(); +} + +bool StreamRendererBase::updateRulerVisibility() +{ + /* + if ((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_pScaleVisible)) ? true : false) != m_isScaleVisible) + { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_pScaleVisible), m_isScaleVisible); + } + */ + + void (*action)(GtkWidget*) = m_isScaleVisible ? gtk_widget_show : gtk_widget_hide; + (*action)(this->m_top); + (*action)(this->m_left); + (*action)(this->m_right); + (*action)(this->m_bottom); + (*action)(this->m_cornerLeft); + (*action)(this->m_cornerRight); + + return true; +} + +bool StreamRendererBase::realize() +{ + gtk_widget_realize(m_top); + gtk_widget_realize(m_left); + gtk_widget_realize(m_right); + gtk_widget_realize(m_bottom); + gtk_widget_realize(m_viewport); + gtk_widget_realize(m_main); + + return true; +} + + +bool StreamRendererBase::redraw(const bool bImmediate /* = false */) +{ + m_gtkGLWidget.redraw(bImmediate); + m_gtkGLWidget.redrawLeft(bImmediate); + m_gtkGLWidget.redrawRight(bImmediate); + m_gtkGLWidget.redrawBottom(bImmediate); + + return true; +} + +bool StreamRendererBase::reshape(const uint32_t width, const uint32_t height) +{ + m_width = uint32_t(width); + m_height = uint32_t(height); + m_rendererCtx->setAspect(width * 1.0F / height); + + return true; +} + +bool StreamRendererBase::draw() +{ + StreamRendererBase::preDraw(); + + glPushAttrib(GL_ALL_ATTRIB_BITS); + //::glClearColor(1.0,1.0,1.0,1.0); + glColor4f(m_color.r, m_color.g, m_color.b, m_rendererCtx->getTranslucency()); + + if (m_rotate) + { + glScalef(1, -1, 1); + glRotatef(-90, 0, 0, 1); + } + + m_renderers[0]->render(*m_rendererCtx); + glPopAttrib(); + + StreamRendererBase::postDraw(); + + return true; +} + +void StreamRendererBase::drawLeft() { if (m_ruler) { m_ruler->doRenderLeft(m_left); } } +void StreamRendererBase::drawRight() { if (m_ruler) { m_ruler->doRenderRight(m_right); } } +void StreamRendererBase::drawBottom() { if (m_ruler) { m_ruler->doRenderBottom(m_bottom); } } + +bool StreamRendererBase::preDraw() +{ + this->updateRulerVisibility(); + + // auto m_sColorGradient=CString("0:0,0,0; 100:100,100,100"); + + const char* gradient = + "0:100, 100, 100; 12:50, 100, 100; 25:0, 50, 100; 38:0, 0, 50; 50:0, 0, 0; 62:50, 0, 0; 75:100, 50, 0; 88:100, 100, 50; 100:100, 100, 100"; + + if (!m_textureID) { m_textureID = m_gtkGLWidget.createTexture(gradient); } + glBindTexture(GL_TEXTURE_1D, m_textureID); + + m_rendererCtx->setAspect(m_viewport->allocation.width * 1.0F / m_viewport->allocation.height); + + return true; +} + + +bool StreamRendererBase::postDraw() +{ + glPushAttrib(GL_ALL_ATTRIB_BITS); + if (m_ruler) { m_ruler->doRender(); } + glPopAttrib(); + + return true; +} + +bool StreamRendererBase::mouseButton(int /*x*/, int /*y*/, const int button, const int status) +{ + m_buttons[button] = status; + + /* + if (button == 1 && status == 1) + { + m_isScaleVisible = !m_isScaleVisible; + m_pRendererContext->setScaleVisibility(m_isScaleVisible); + } + */ + + return true; +} + +bool StreamRendererBase::mouseMotion(const int x, const int y) +{ + if (!m_mouseInitialized) + { + m_mouseX = x; + m_mouseY = y; + m_mouseInitialized = true; + } + + if (m_buttons[3]) + { + const float value = powf(0.99F, float(y - m_mouseY)); + // std::cout << "scale " << value << "\n"; + m_rendererCtx->scaleBy(value); + redraw(); + } + if (m_buttons[2]) + { + const float value = powf(0.99F, float(y - m_mouseY)); + // std::cout << "zoom " << value << "\n"; + m_rendererCtx->zoomBy(value); + } + if (m_buttons[1]) + { + // std::cout << "Rotate\n"; + m_rendererCtx->rotateByY(float(x - m_mouseX) * 0.1F); + m_rendererCtx->rotateByX(float(y - m_mouseY) * 0.1F); + } + + m_mouseX = x; + m_mouseY = y; + + return true; +} + +bool StreamRendererBase::finalize() +{ + for (size_t i = 0; i < m_renderers.size(); ++i) + { + m_renderers[i]->rebuild(*m_rendererCtx); + m_renderers[i]->refresh(*m_rendererCtx); + } + redraw(true); + + return true; +} + +bool StreamRendererBase::restoreSettings(const std::string& prefix) +{ + if (!m_rendererCtx) { return false; } + + // Lets see if we have a scale token + const std::string token = std::string("${") + prefix + "_Scale}"; + const float newScale = float(m_kernelCtx.getConfigurationManager().expandAsFloat(token.c_str(), m_rendererCtx->getScale())); + m_rendererCtx->setScale(newScale); + + return true; +} + +bool StreamRendererBase::storeSettings(const std::string& prefix) +{ + if (!m_rendererCtx) { return false; } + + const std::string token = prefix + "_Scale"; + std::stringstream value; + value << m_rendererCtx->getScale(); + m_kernelCtx.getConfigurationManager().addOrReplaceConfigurationToken(token.c_str(), value.str().c_str()); + + return true; +} + + +CString StreamRendererBase::renderAsText(const size_t indent) const +{ + return (std::string(indent, ' ') + "Detail printing unimplemented for stream type or placeholder renderer in use\n").c_str(); +} + +void add_column(GtkTreeView* treeView, const char* name, const uint32_t id, const uint32_t minWidth) +{ + GtkTreeViewColumn* column = gtk_tree_view_column_new(); + GtkCellRenderer* cell = gtk_cell_renderer_text_new(); + gtk_tree_view_column_set_title(column, name); + gtk_tree_view_column_pack_start(column, cell, TRUE); + gtk_tree_view_column_set_attributes(column, cell, "text", id, nullptr); + gtk_tree_view_column_set_sort_column_id(column, id); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_expand(column, TRUE); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_min_width(column, minWidth); + gtk_tree_view_append_column(treeView, column); + gtk_tree_view_column_set_sort_indicator(column, TRUE); +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererChannelLocalization.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererChannelLocalization.cpp new file mode 100755 index 0000000..159bc53 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererChannelLocalization.cpp @@ -0,0 +1,47 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// + +#include +#include +#include + +#include + +#include "StreamRendererChannelLocalization.h" + +namespace OpenViBE { +namespace Tracker { + +CString StreamRendererChannelLocalization::renderAsText(const size_t indent) const +{ + const TypeChannelLocalization::Header& hdr = m_Stream->getHeader(); + + std::stringstream ss; + + ss << std::string(indent, ' ') << "Dynamic: " << (hdr.m_Dynamic ? "True" : "False") << std::endl; + + for (size_t i = 0; i < m_Stream->getChunkCount(); ++i) + { + const TypeChannelLocalization::Buffer* buf = m_Stream->getChunk(i); + + ss << std::string(indent, ' ') << "Configuration at time " << buf->m_StartTime.toSeconds() << "s:" << std::endl; + + const double* ptr = buf->m_buffer.getBuffer(); + + for (uint32_t chn = 0; chn < buf->m_buffer.getDimensionSize(0); ++chn) + { + ss << std::string(indent, ' ') << " Channel " << chn << " (" << hdr.m_Header.getDimensionLabel(0, chn) << ") " << "x=" << ptr[chn * 3 + 0] << " " + << "y=" << ptr[chn * 3 + 1] << " " << "z=" << ptr[chn * 3 + 2] << std::endl; + } + } + + return ss.str().c_str(); +} + +bool StreamRendererChannelLocalization::showChunkList() { return StreamRendererLabel::showChunkList("Channel localization stream details"); } + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererChannelUnits.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererChannelUnits.cpp new file mode 100755 index 0000000..6eb0612 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererChannelUnits.cpp @@ -0,0 +1,49 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// + +#include +#include +#include +#include "StreamRendererChannelUnits.h" +#include + +namespace OpenViBE { +namespace Tracker { + +CString StreamRendererChannelUnits::renderAsText(const size_t indent) const +{ + const TypeChannelUnits::Header& hdr = m_stream->getHeader(); + + std::stringstream ss; + + ss << std::string(indent, ' ') << "Dynamic: " + << (hdr.m_Dynamic ? "True" : "False") << std::endl; + + for (size_t i = 0; i < m_stream->getChunkCount(); ++i) + { + const TypeChannelUnits::Buffer* buf = m_stream->getChunk(i); + + ss << std::string(indent, ' ') << "Configuration at time " << buf->m_StartTime.toSeconds() << "s:" << std::endl; + + const double* ptr = buf->m_buffer.getBuffer(); + + for (uint32_t chn = 0; chn < buf->m_buffer.getDimensionSize(0); ++chn) + { + const CString unit = m_kernelCtx.getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_MeasurementUnit, uint64_t(ptr[chn * 2 + 0])); + const CString factor = m_kernelCtx.getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Factor, uint64_t(ptr[chn * 2 + 1])); + + ss << std::string(indent, ' ') << " Channel " << chn << " (" << hdr.m_Header.getDimensionLabel(0, chn) << ") " << "Unit: " << unit << ", Factor: " + << factor << std::endl; + } + } + + return ss.str().c_str(); +} + +bool StreamRendererChannelUnits::showChunkList() { return StreamRendererLabel::showChunkList("Channel units stream details"); } + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererExperimentInfo.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererExperimentInfo.cpp new file mode 100644 index 0000000..b7f7a2c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererExperimentInfo.cpp @@ -0,0 +1,45 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// + +#include +#include +#include + +#include + +#include "StreamRendererExperimentInfo.h" + +namespace OpenViBE { +namespace Tracker { + +CString StreamRendererExperimentInfo::renderAsText(const size_t indent) const +{ + const TypeExperimentInfo::Header& hdr = m_stream->getHeader(); + + std::stringstream ss; + + ss << std::string(indent, ' ') << "Experiment id: " << hdr.m_ExperimentID << std::endl; + ss << std::string(indent, ' ') << "Experiment date: " << hdr.m_ExperimentDate << std::endl; + + ss << std::string(indent, ' ') << "Subject id: " << hdr.m_SubjectID << std::endl; + ss << std::string(indent, ' ') << "Subject name: " << hdr.m_SubjectName << std::endl; + ss << std::string(indent, ' ') << "Subject age: " << hdr.m_SubjectAge << std::endl; + ss << std::string(indent, ' ') << "Subject gender: " << hdr.m_SubjectGender << std::endl; + + ss << std::string(indent, ' ') << "Laboratory id: " << hdr.m_LaboratoryID << std::endl; + ss << std::string(indent, ' ') << "Laboratory name: " << hdr.m_LaboratoryName << std::endl; + ss << std::string(indent, ' ') << "Technician id: " << hdr.m_TechnicianID << std::endl; + ss << std::string(indent, ' ') << "Technician name: " << hdr.m_TechnicianName << std::endl; + + // ss << string(indent, ' ') << "Channels: " << m_Header.m_header.getDimensionSize(0) << std::endl; + // ss << string(indent, ' ') << "Samples per chunk: " << m_Header.m_header.getDimensionSize(1) << std::endl; + return ss.str().c_str(); +} + +bool StreamRendererExperimentInfo::showChunkList() { return StreamRendererLabel::showChunkList("Experiment information stream details"); } + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererLabel.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererLabel.cpp new file mode 100755 index 0000000..5f01c8b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererLabel.cpp @@ -0,0 +1,82 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// + +#include +#include +#include + +#include + +#include "StreamRendererLabel.h" + +namespace OpenViBE { +namespace Tracker { + +bool StreamRendererLabel::initialize() +{ + m_main = gtk_frame_new(""); + + m_label = gtk_label_new(""); + gtk_label_set_justify(GTK_LABEL(m_label), GTK_JUSTIFY_LEFT); + + gtk_container_add(GTK_CONTAINER(m_main), m_label); + + gtk_widget_ref(m_main); + + // @fixme hardcoded numbers likely not such a great idea as different font sizes etc + gtk_widget_set_size_request(m_main, 640, 40); + + gtk_widget_show(m_main); + gtk_widget_show(m_label); + + return true; +} + +bool StreamRendererLabel::setTitle(const char* title) +{ + gtk_label_set(GTK_LABEL(m_label), title); + + return true; +} + +// Instead of showing chunk list, this prints the stream structure information +// in a window. How it works is that a derived class can implement a text render +// routine which this function then calls. This way each derived class +// doesn't need to copy-paste the identical window code. +bool StreamRendererLabel::showChunkList(const char* title) +{ + // @fixme Not very pretty but better than nothing; here we have the benefit + // that since we make a new builder here, reusing the workspace information + // window does not mess up the real one + + GtkBuilder* builder = gtk_builder_new(); + const CString filename = Directories::getDataDir() + "/applications/tracker/tracker.ui"; + if (!gtk_builder_add_from_file(builder, filename, nullptr)) + { + std::cout << "Problem loading [" << filename << "]\n"; + return false; + } + + GtkWidget* window = GTK_WIDGET(gtk_builder_get_object(builder, "tracker-workspace_information")); + GtkTextBuffer* buffer = GTK_TEXT_BUFFER(gtk_builder_get_object(builder, "tracker-textbuffer-workspace_information")); + + gtk_window_set_title(GTK_WINDOW(window), title); + + // Hide instead of destroy on closing the window + g_signal_connect(window, "delete_event", G_CALLBACK(gtk_widget_hide_on_delete), nullptr); + + const CString details = renderAsText(0); + + gtk_text_buffer_set_text(buffer, details.toASCIIString(), -1); + gtk_widget_show_all(window); + gtk_window_present(GTK_WINDOW(window)); + g_object_unref(builder); + + return true; +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererMatrix.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererMatrix.cpp new file mode 100755 index 0000000..9f0c5e8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererMatrix.cpp @@ -0,0 +1,235 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// +// @todo add horizontal scaling support +// @todo add event handlers +// @todo add ruler, stimulations, channel names, a million of other things + +#include +#include +#include + +#include +#include + +#include + +#include "StreamRendererMatrix.h" + +#include "ruler/mTRulerAutoType.hpp" +#include "ruler/mTRulerPair.hpp" +#include "ruler/mTRulerConditionalPair.hpp" +#include "ruler/mCRulerConditionIsTimeLocked.hpp" + +#include "ruler/mCRulerProgressV.hpp" + +#include "ruler/mCRulerBottomCount.hpp" +#include "ruler/mCRulerBottomTime.hpp" + +#include "ruler/mCRulerLeftChannelNames.hpp" + +#include "ruler/mCRulerRightCount.hpp" +#include "ruler/mCRulerRightScale.hpp" +#include "ruler/mCRulerRightLabels.hpp" +#include "ruler/mCRulerRightFrequency.hpp" + +#include "ruler/mCRulerRightTexture.hpp" + +namespace OpenViBE { +namespace Tracker { + +bool StreamRendererMatrix::initialize() +{ + const TypeMatrix::Buffer* firstChunk = m_stream->getChunk(0); + if (firstChunk) + { + m_chunkDuration = firstChunk->m_EndTime - firstChunk->m_StartTime; + + if (firstChunk->m_buffer.getDimensionCount() == 1) + { + // Degenerate case like a feature vector + m_nRows = firstChunk->m_buffer.getDimensionSize(0); + m_nCols = 0; + } + else if (firstChunk->m_buffer.getDimensionCount() == 2) + { + m_nRows = firstChunk->m_buffer.getDimensionSize(0); + m_nCols = firstChunk->m_buffer.getDimensionSize(1); + } + else if (firstChunk->m_buffer.getDimensionCount() > 2) + { + std::cout << "Warning: The matrix renderer does not work correctly if dims>2 (for tensors)\n"; + m_nRows = firstChunk->m_buffer.getDimensionSize(0); + m_nCols = firstChunk->m_buffer.getDimensionSize(1); + } + else { log() << Kernel::LogLevel_Error << "Error: Dimension count " << firstChunk->m_buffer.getDimensionCount() << " not supported\n"; } + } + else + { + std::cout << "Stream is empty\n"; + return false; + } + + + m_rendererCtx = new AdvancedVisualization::CRendererContext(); + m_rendererCtx->clear(); + m_rendererCtx->setTimeScale(1); + m_rendererCtx->setScaleVisibility(m_isScaleVisible); + m_rendererCtx->setCheckBoardVisibility(true); + m_rendererCtx->setTimeLocked(true); + m_rendererCtx->setPositiveOnly(false); + m_rendererCtx->setDataType(AdvancedVisualization::CRendererContext::EDataType::Matrix); + m_rendererCtx->setSampleDuration(m_chunkDuration.time()); + m_rendererCtx->setParentRendererContext(&AdvancedVisualization::getContext()); + + m_rendererCtx->setAxisDisplay(true); + + auto& hdr = m_stream->getHeader(); + + for (uint32_t j = 0; j < m_nRows; ++j) { m_rendererCtx->addChannel(std::string(hdr.m_Header.getDimensionLabel(0, j))); } + + m_swap.resize(m_nRows); + + m_renderers.push_back(AdvancedVisualization::IRenderer::create(AdvancedVisualization::ERendererType::Bitmap, false)); + + m_ruler = new AdvancedVisualization::TRulerPair, AdvancedVisualization::IRuler>, + AdvancedVisualization::TRulerPair< + AdvancedVisualization::CRulerLeftChannelNames, AdvancedVisualization::CRulerRightTexture>>>; + + // m_pRuler = new TRulerPair < TRulerConditionalPair < CRulerBottomTime, CRulerBottomCount, CRulerConditionIsTimeLocked >, TRulerPair < TRulerAutoType < IRuler, IRuler, CRulerRightFrequency >, TRulerPair < CRulerLeftChannelNames, CRulerProgressV > > >; + m_ruler->setRendererContext(m_rendererCtx); + m_ruler->setRenderer(m_renderers[0]); + + if (!StreamRendererBase::initialize()) { return false; } + + m_gtkGLWidget.initialize(*this, m_viewport, m_left, m_right, m_bottom); + m_gtkGLWidget.setPointSmoothingActive(false); + + return true; +} + + +bool StreamRendererMatrix::reset(const CTime startTime, const CTime endTime) +{ + m_startTime = startTime; + m_endTime = endTime; + + const uint32_t numBuffers = ((m_endTime - m_startTime).ceil().time() / m_chunkDuration.time()); + + m_rendererCtx->setElementCount(numBuffers); + + m_renderers[0]->clear(0); + m_renderers[0]->setSampleCount(numBuffers); // $$$ + m_renderers[0]->setChannelCount(m_nRows); + + // @FIXME The offset is needed to have correct numbers on the ruler; remove ifdef once the feature is in +#ifdef RENDERER_SUPPORTS_OFFSET + m_renderers[0]->setTimeOffset(m_startTime.time()); +#endif + + return true; +} + + +bool StreamRendererMatrix::push(const TypeMatrix::Buffer& chunk, bool /*zeroInput*/) +{ +#if 0 + static uint32_t pushed = 0; + std::cout << "Push spec chk " << pushed << " " << chunk.m_buffer.getDimensionSize(0) + << " " << chunk.m_buffer.getDimensionSize(1) << " " + << CTime(chunk.m_startTime).toSeconds() << "," + << CTime(chunk.m_endTime).toSeconds() + << "\n"; + std::cout << pushed << " first bytes " + << chunk.m_buffer.getBuffer()[0] + << chunk.m_buffer.getBuffer()[1] + << chunk.m_buffer.getBuffer()[2] + << chunk.m_buffer.getBuffer()[3] + << "\n"; + pushed++; +#endif + + + m_rendererCtx->setSpectrumFrequencyRange(uint32_t((uint64_t(m_nRows) << 32) / m_chunkDuration.time())); + + // Handle the degenerate case NumCols=0 + const size_t actualCols = std::max(m_nCols, 1); + + // Feed renderer with actual samples + for (uint32_t j = 0; j < actualCols; ++j) + { + for (uint32_t k = 0; k < m_nRows; ++k) { m_swap[k] = float(chunk.m_buffer.getBuffer()[k * actualCols + j]); } + m_renderers[0]->feed(&m_swap[0]); + } + + return true; +} + + +bool StreamRendererMatrix::draw() +{ + StreamRendererMatrix::preDraw(); + + glPushAttrib(GL_ALL_ATTRIB_BITS); + glColor4f(m_color.r, m_color.g, m_color.b, m_rendererCtx->getTranslucency()); + m_renderers[0]->render(*m_rendererCtx); + glPopAttrib(); + + StreamRendererMatrix::postDraw(); + + return true; +} + +bool StreamRendererMatrix::preDraw() +{ + this->updateRulerVisibility(); + + // auto m_sColorGradient=CString("0:0,0,0; 100:100,100,100"); + const std::string gradient = "0:0, 0, 50; 25:0, 100, 100; 50:0, 50, 0; 75:100, 100, 0; 100:75, 0, 0"; + // auto m_sColorGradient = CString("0:100, 100, 100; 12:50, 100, 100; 25:0, 50, 100; 38:0, 0, 50; 50:0, 0, 0; 62:50, 0, 0; 75:100, 50, 0; 88:100, 100, 50; 100:100, 100, 100"); + + if (!m_textureID) { m_textureID = m_gtkGLWidget.createTexture(gradient); } + glBindTexture(GL_TEXTURE_1D, m_textureID); + + m_rendererCtx->setAspect(m_viewport->allocation.width * 1.0F / m_viewport->allocation.height); + + return true; +} + +bool StreamRendererMatrix::finalize() +{ + m_renderers[0]->rebuild(*m_rendererCtx); + m_renderers[0]->refresh(*m_rendererCtx); + + redraw(true); + + return true; +} + +CString StreamRendererMatrix::renderAsText(const size_t indent) const +{ + std::stringstream ss; + ss << std::string(indent, ' ') << "Rows: " << m_nRows << std::endl; + ss << std::string(indent, ' ') << "Cols: " << m_nCols << std::endl; + + // ss << std::string(indent, ' ') << "Channels: " << m_Header.m_header.getDimensionSize(0) << std::endl; + // ss << std::string(indent, ' ') << "Samples per chunk: " << m_Header.m_header.getDimensionSize(1) << std::endl; + return ss.str().c_str(); +} + +bool StreamRendererMatrix::mouseButton(const int x, const int y, const int button, const int status) +{ + //if (button == 3 && status == 1) { showChunkList(); } + return StreamRendererBase::mouseButton(x, y, button, status); +} + +bool StreamRendererMatrix::showChunkList() { return showMatrixList(m_stream, &m_streamListWindow, "List of chunks for Matrix stream"); } + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererSignal.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererSignal.cpp new file mode 100755 index 0000000..c84a275 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererSignal.cpp @@ -0,0 +1,153 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// + +#include +#include +#include + +#include +#include +#include + +#include "StreamRendererSignal.h" + +#include "ruler/mTRulerAutoType.hpp" +#include "ruler/mTRulerPair.hpp" +#include "ruler/mTRulerConditionalPair.hpp" +#include "ruler/mCRulerConditionIsTimeLocked.hpp" + +#include "ruler/mCRulerProgressV.hpp" + +#include "ruler/mCRulerBottomCount.hpp" +#include "ruler/mCRulerBottomTime.hpp" + +#include "ruler/mCRulerLeftChannelNames.hpp" + +#include "ruler/mCRulerRightCount.hpp" +#include "ruler/mCRulerRightScale.hpp" +#include "ruler/mCRulerRightLabels.hpp" + +namespace OpenViBE { +namespace Tracker { + +bool StreamRendererSignal::initialize() +{ + // TRendererStimulation < false, CRendererLine >:new CRendererLine + AdvancedVisualization::IRenderer* pRenderer = AdvancedVisualization::IRenderer::create(AdvancedVisualization::ERendererType::Line, true); + if (pRenderer == nullptr) { return false; } + + const TypeSignal::Buffer* firstChunk = m_stream->getChunk(0); + if (!firstChunk) { return false; } + + m_nChannel = firstChunk->m_buffer.getDimensionSize(0); + m_samplesPerChunk = firstChunk->m_buffer.getDimensionSize(1); + m_chunkDuration = firstChunk->m_EndTime - firstChunk->m_StartTime; + + // Creates renderer context + m_rendererCtx = new AdvancedVisualization::CRendererContext(); + m_rendererCtx->clear(); + m_rendererCtx->setScale(1.0); + m_rendererCtx->setTimeScale(1); + m_rendererCtx->setCheckBoardVisibility(true); + m_rendererCtx->setScaleVisibility(m_isScaleVisible); + m_rendererCtx->setDataType(AdvancedVisualization::CRendererContext::EDataType::Signal); + const CTime sampleDuration = CTime(m_chunkDuration.time() / m_samplesPerChunk); + m_rendererCtx->setSampleDuration(sampleDuration.time()); + + const TypeSignal::Header& hdr = m_stream->getHeader(); + for (uint32_t i = 0; i < m_nChannel; ++i) + { + const char* label = hdr.m_Header.getDimensionLabel(0, i); + m_rendererCtx->addChannel(std::string(label)); + } + + m_ruler = new AdvancedVisualization::TRulerPair, AdvancedVisualization::IRuler>, + AdvancedVisualization::TRulerPair< + AdvancedVisualization::CRulerLeftChannelNames, AdvancedVisualization::CRulerRightScale>>>; + + m_ruler->setRendererContext(m_rendererCtx); + m_ruler->setRenderer(pRenderer); + + if (!StreamRendererBase::initialize()) { return false; } + + m_gtkGLWidget.initialize(*this, m_viewport, m_left, m_right, m_bottom); + m_gtkGLWidget.setPointSmoothingActive(false); + + m_renderers.push_back(pRenderer); + + return true; +} + +bool StreamRendererSignal::reset(const CTime startTime, const CTime endTime) +{ + m_startTime = startTime; + m_endTime = endTime; + + // std::cout << "Overridden signal renderer reset\n"; + + m_renderers[0]->clear(0); + + // std::cout << "Start time is " << CTime(m_StartTime).toSeconds() + // << " end is " << CTime(m_EndTime).toSeconds() << "\n"; + + const uint64_t chunkCount = (m_endTime - m_startTime).ceil().time() / m_chunkDuration.time(); + const uint32_t numSamples = uint32_t(m_samplesPerChunk * chunkCount); + + m_renderers[0]->setSampleCount(numSamples); + m_renderers[0]->setChannelCount(m_nChannel); + + // @FIXME The offset is needed to have correct numbers on the ruler; remove ifdef once the feature is in +#ifdef RENDERER_SUPPORTS_OFFSET + m_renderers[0]->setTimeOffset(m_startTime.time()); +#endif + + // m_renderers[0]->setHistoryDrawIndex(samplesBeforeStart); + m_renderers[0]->rebuild(*m_rendererCtx); + + return true; +} + +bool StreamRendererSignal::push(const TypeSignal::Buffer& chunk, const bool zeroInput /* = false */) +{ + std::vector tmp; + if (!zeroInput) + { + tmp.resize(chunk.m_buffer.getBufferElementCount()); + for (size_t i = 0; i < chunk.m_buffer.getBufferElementCount(); ++i) { tmp[i] = float(chunk.m_buffer.getBuffer()[i]); } + } + else { tmp.resize(chunk.m_buffer.getBufferElementCount(), 0); } + + m_renderers[0]->feed(&tmp[0], chunk.m_buffer.getDimensionSize(1)); + + return true; +} + +CString StreamRendererSignal::renderAsText(const size_t indent) const +{ + auto& hdr = m_stream->getHeader(); + + std::stringstream ss; + ss << std::string(indent, ' ') << "Sampling rate: " << hdr.m_Sampling << "hz" << std::endl; + ss << std::string(indent, ' ') << "Channels: " << hdr.m_Header.getDimensionSize(0) << std::endl; + ss << std::string(indent, ' ') << "Samples per chunk: " << hdr.m_Header.getDimensionSize(1) << std::endl; + + return ss.str().c_str(); +} + +bool StreamRendererSignal::mouseButton(const int x, const int y, const int button, const int status) +{ + //if (button == 3 && status == 1) { showChunkList(); } + return StreamRendererBase::mouseButton(x, y, button, status); +} + +bool StreamRendererSignal::showChunkList() { return showMatrixList(m_stream, &m_streamListWindow, "List of chunks for Signal stream"); } + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererSpectrum.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererSpectrum.cpp new file mode 100755 index 0000000..eae39cf --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererSpectrum.cpp @@ -0,0 +1,270 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// +// @todo add horizontal scaling support +// @todo add event handlers +// @todo add ruler, stimulations, channel names, a million of other things + +#include +#include +#include + +#include +#include + +#include + +#include "StreamRendererSpectrum.h" + +#include "ruler/mTRulerAutoType.hpp" +#include "ruler/mTRulerPair.hpp" +#include "ruler/mTRulerConditionalPair.hpp" +#include "ruler/mCRulerConditionIsTimeLocked.hpp" + +#include "ruler/mCRulerProgressV.hpp" + +#include "ruler/mCRulerBottomCount.hpp" +#include "ruler/mCRulerBottomTime.hpp" + +#include "ruler/mCRulerLeftChannelNames.hpp" + +#include "ruler/mCRulerRightCount.hpp" +#include "ruler/mCRulerRightScale.hpp" +#include "ruler/mCRulerRightLabels.hpp" +#include "ruler/mCRulerRightFrequency.hpp" + +namespace OpenViBE { +namespace Tracker { + +bool StreamRendererSpectrum::initialize() +{ + const TypeSpectrum::Buffer* firstChunk = m_stream->getChunk(0); + if (!firstChunk) { return false; } + + m_nChannel = firstChunk->m_buffer.getDimensionSize(0); + m_spectrumElements = firstChunk->m_buffer.getDimensionSize(1); + m_chunkDuration = firstChunk->m_EndTime - firstChunk->m_StartTime; + + m_rendererCtx = new AdvancedVisualization::CRendererContext(); + m_rendererCtx->clear(); + m_rendererCtx->setTimeScale(1); + m_rendererCtx->setScaleVisibility(m_isScaleVisible); + m_rendererCtx->setCheckBoardVisibility(true); + m_rendererCtx->setTimeLocked(true); + m_rendererCtx->setDataType(AdvancedVisualization::CRendererContext::EDataType::Spectrum); + m_rendererCtx->setSampleDuration(m_chunkDuration.time()); + + const TypeSpectrum::Header& hdr = m_stream->getHeader(); + for (uint32_t j = 0; j < m_nChannel; ++j) + { + const char* name = hdr.m_Header.getDimensionLabel(0, j); + m_rendererCtx->addChannel(std::string(name)); + } + + m_subRendererCtx = new AdvancedVisualization::CRendererContext(); + m_subRendererCtx->clear(); + m_subRendererCtx->setParentRendererContext(m_rendererCtx); + m_subRendererCtx->setTimeLocked(true); + m_subRendererCtx->setStackCount(m_nChannel); + m_subRendererCtx->setDataType(AdvancedVisualization::CRendererContext::EDataType::Spectrum); + m_subRendererCtx->setSampleDuration(m_chunkDuration.time()); + + for (uint32_t j = 0; j < m_spectrumElements; ++j) + { + std::stringstream ss; + ss << j; + m_subRendererCtx->addChannel(ss.str()); + } + + m_swaps.resize(m_spectrumElements); + + for (size_t i = 0; i < m_renderers.size(); ++i) { AdvancedVisualization::IRenderer::release(m_renderers[i]); } + m_renderers.clear(); + m_renderers.resize(m_nChannel); + + for (uint32_t j = 0; j < m_nChannel; ++j) + { + m_renderers[j] = AdvancedVisualization::IRenderer::create(AdvancedVisualization::ERendererType::Bitmap, false); + m_renderers[j]->setChannelCount(m_spectrumElements); + } + + m_ruler = new AdvancedVisualization::TRulerPair, AdvancedVisualization::TRulerPair< + AdvancedVisualization::TRulerAutoType< + AdvancedVisualization::IRuler, AdvancedVisualization::IRuler, + AdvancedVisualization::CRulerRightFrequency>, AdvancedVisualization::TRulerPair< + AdvancedVisualization::CRulerLeftChannelNames, AdvancedVisualization::CRulerProgressV>>>; + m_ruler->setRendererContext(m_rendererCtx); + m_ruler->setRenderer(m_renderers[0]); + + if (!StreamRendererBase::initialize()) { return false; } + + m_gtkGLWidget.initialize(*this, m_viewport, m_left, m_right, m_bottom); + m_gtkGLWidget.setPointSmoothingActive(false); + + m_rotate = true; + + return true; +} + + +bool StreamRendererSpectrum::reset(const CTime startTime, const CTime endTime) +{ + m_startTime = startTime; + m_endTime = endTime; + + // Each spectrum buffer has one spectrum per channel, so numBuffers is just: + // ( @todo: is this really needed in addition to setSampleCount? ) + const size_t numBuffers = (m_endTime - m_startTime).ceil().time() / m_chunkDuration.time(); + m_rendererCtx->setElementCount(numBuffers); + + for (size_t j = 0; j < m_nChannel; ++j) + { + m_renderers[j]->clear(0); + m_renderers[j]->setSampleCount(numBuffers); // $$$ + } + + // @FIXME The offset is needed to have correct numbers on the ruler; remove ifdef once the feature is in +#ifdef RENDERER_SUPPORTS_OFFSET + m_renderers[0]->setTimeOffset(m_startTime.time()); +#endif + + return true; +} + + +// Spectrum chunks are organized as [channel x freqs], so to push +// with freqs on the y axis for each subrenderer, we transpose +bool StreamRendererSpectrum::push(const TypeSpectrum::Buffer& chunk, const bool zeroInput /* = false */) +{ +#if 0 + std::cout << "Push spec chk " << m_Pushed << " " << chunk.m_buffer.getDimensionSize(0) << " " << chunk.m_buffer.getDimensionSize(1) << " " + << CTime(chunk.m_startTime).toSeconds() << "," << CTime(chunk.m_endTime).toSeconds() << "\n"; + std::cout << m_Pushed << " first bytes " << chunk.m_buffer.getBuffer()[0] << chunk.m_buffer.getBuffer()[1] + << chunk.m_buffer.getBuffer()[2] << chunk.m_buffer.getBuffer()[3] << "\n"; + m_Pushed++; +#endif + + const size_t numFreq = chunk.m_buffer.getDimensionSize(1); + + m_rendererCtx->setSpectrumFrequencyRange(uint32_t((uint64_t(numFreq) << 32) / m_chunkDuration.time())); + + for (uint32_t j = 0; j < m_renderers.size(); ++j) + { + if (!zeroInput) + { + // Feed renderer with actual samples + for (uint32_t k = 0; k < numFreq; ++k) { m_swaps[numFreq - k - 1] = float(chunk.m_buffer.getBuffer()[j * numFreq + k]); } + } + else { std::fill(m_swaps.begin(), m_swaps.end(), 0.0F); } + m_renderers[j]->feed(&m_swaps[0]); + } + + return true; +} + + +bool StreamRendererSpectrum::draw() +{ + StreamRendererSpectrum::preDraw(); + + if (m_rendererCtx->getSelectedCount() != 0) + { + glPushMatrix(); + glScalef(1, 1.0F / m_rendererCtx->getSelectedCount(), 1); + for (size_t i = 0; i < m_rendererCtx->getSelectedCount(); ++i) + { + glPushAttrib(GL_ALL_ATTRIB_BITS); + glPushMatrix(); + glColor4f(m_color.r, m_color.g, m_color.b, m_rendererCtx->getTranslucency()); + glTranslatef(0, float(m_rendererCtx->getSelectedCount() - i) - 1.0F, 0); + if (!m_rotate) + { + glScalef(1, -1, 1); + glRotatef(-90, 0, 0, 1); + } + m_subRendererCtx->setAspect(m_rendererCtx->getAspect()); + m_subRendererCtx->setStackCount(m_rendererCtx->getSelectedCount()); + m_subRendererCtx->setStackIndex(i); + m_renderers[m_rendererCtx->getSelected(i)]->render(*m_subRendererCtx); + + /* + if (0) //if (bDrawBorders) + { + glDisable(GL_TEXTURE_1D); + glDisable(GL_BLEND); + glColor3f(0, 0, 0); + glBegin(GL_LINE_LOOP); + glVertex2f(0, 0); + glVertex2f(1, 0); + glVertex2f(1, 1); + glVertex2f(0, 1); + glEnd(); + } + */ + glPopMatrix(); + glPopAttrib(); + } + glPopMatrix(); + } + + StreamRendererSpectrum::postDraw(); + + return true; +} + +bool StreamRendererSpectrum::preDraw() +{ + this->updateRulerVisibility(); + + // auto m_sColorGradient=CString("0:0,0,0; 100:100,100,100"); + const std::string gradient = + "0:100, 100, 100; 12:50, 100, 100; 25:0, 50, 100; 38:0, 0, 50; 50:0, 0, 0; 62:50, 0, 0; 75:100, 50, 0; 88:100, 100, 50; 100:100, 100, 100"; + + if (!m_textureID) { m_textureID = m_gtkGLWidget.createTexture(gradient); } + glBindTexture(GL_TEXTURE_1D, m_textureID); + + m_rendererCtx->setAspect(m_viewport->allocation.width * 1.0F / m_viewport->allocation.height); + + return true; +} + +bool StreamRendererSpectrum::finalize() +{ + for (size_t i = 0; i < m_renderers.size(); ++i) + { + m_renderers[i]->rebuild(*m_subRendererCtx); + m_renderers[i]->refresh(*m_subRendererCtx); + } + redraw(true); + + return true; +} + +CString StreamRendererSpectrum::renderAsText(const size_t indent) const +{ + auto& hdr = m_stream->getHeader(); + + std::stringstream ss; + ss << std::string(indent, ' ') << "Sampling rate: " << hdr.m_Sampling << "hz" << std::endl; + ss << std::string(indent, ' ') << "Channels: " << hdr.m_Header.getDimensionSize(0) << std::endl; + ss << std::string(indent, ' ') << "Abscissas per spectrum: " << hdr.m_Abscissas.getBufferElementCount() << std::endl; + + // ss << std::string(indent, ' ') << "Channels: " << m_Header.m_header.getDimensionSize(0) << std::endl; + // ss << std::string(indent, ' ') << "Samples per chunk: " << m_Header.m_header.getDimensionSize(1) << std::endl; + return ss.str().c_str(); +} + +bool StreamRendererSpectrum::mouseButton(const int x, const int y, const int button, const int status) +{ + //if (button == 3 && status == 1) { showChunkList(); } + return StreamRendererBase::mouseButton(x, y, button, status); +} + +bool StreamRendererSpectrum::showChunkList() { return showMatrixList(m_stream, &m_streamListWindow, "List of chunks for Spectrum stream"); } + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererStimulation.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererStimulation.cpp new file mode 100755 index 0000000..35c6e0c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/StreamRendererStimulation.cpp @@ -0,0 +1,207 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// +// @note This renderer is intended to be used when there is only +// a stimulation track. More often, the Tracker users might want to +// see the stimulations overlayed on the signal track. +// +#include +#include +#include + +#include +#include +#include + +#include "StreamRendererStimulation.h" +#include "TypeStimulation.h" + +#include "ruler/mTRulerAutoType.hpp" +#include "ruler/mTRulerPair.hpp" +#include "ruler/mTRulerConditionalPair.hpp" +#include "ruler/mCRulerConditionIsTimeLocked.hpp" + +#include "ruler/mCRulerProgressV.hpp" + +#include "ruler/mCRulerBottomCount.hpp" +#include "ruler/mCRulerBottomTime.hpp" + +#include "ruler/mCRulerLeftChannelNames.hpp" + +#include "ruler/mCRulerRightCount.hpp" +#include "ruler/mCRulerRightScale.hpp" +#include "ruler/mCRulerRightLabels.hpp" + +namespace OpenViBE { +namespace Tracker { + +bool StreamRendererStimulation::initialize() +{ + m_nChannel = 1; + m_sampling = 512; + m_samplesPerChunk = 32; + m_chunkDuration = CTime(m_sampling, m_samplesPerChunk); + + // TRendererStimulation < false, CRendererLine >:new CRendererLine + AdvancedVisualization::IRenderer* renderer = AdvancedVisualization::IRenderer::create(AdvancedVisualization::ERendererType::Line, true); + if (renderer == nullptr) { return false; } + + // Creates renderer context + m_rendererCtx = new AdvancedVisualization::CRendererContext(); + m_rendererCtx->clear(); + m_rendererCtx->setTimeScale(1); + m_rendererCtx->setCheckBoardVisibility(true); + m_rendererCtx->setScaleVisibility(m_isScaleVisible); + m_rendererCtx->setDataType(AdvancedVisualization::CRendererContext::EDataType::Signal); + m_rendererCtx->addChannel("Stims"); + m_rendererCtx->setSampleDuration(CTime(m_sampling, 1).time()); + + m_ruler = new AdvancedVisualization::TRulerPair, AdvancedVisualization::IRuler>, + AdvancedVisualization::TRulerPair< + AdvancedVisualization::CRulerLeftChannelNames, AdvancedVisualization::CRulerRightScale>>>; + + m_ruler->setRendererContext(m_rendererCtx); + m_ruler->setRenderer(renderer); + + if (!StreamRendererBase::initialize()) { return false; } + + m_gtkGLWidget.initialize(*this, m_viewport, m_left, m_right, m_bottom); + m_gtkGLWidget.setPointSmoothingActive(false); + + m_renderers.push_back(renderer); + + gtk_widget_set_size_request(m_main, 640, 100); + + return true; +} + +bool StreamRendererStimulation::reset(const CTime startTime, const CTime endTime) +{ + m_startTime = startTime; + m_endTime = endTime; + + // std::cout << "Overridden stimulation renderer reset\n"; + + m_renderers[0]->clear(0); + + const uint64_t chunkCount = (m_endTime - m_startTime).time() / m_chunkDuration.time(); + const uint32_t numSamples = uint32_t(m_samplesPerChunk * chunkCount); + + m_renderers[0]->setChannelCount(m_nChannel); + m_renderers[0]->setSampleCount(numSamples); + + // @FIXME The offset is needed to have correct numbers on the ruler; remove ifdef once the feature is in +#ifdef RENDERER_SUPPORTS_OFFSET + m_renderers[0]->setTimeOffset(m_startTime.time()); +#endif + + // Stick in empty chunks to get a background + std::vector empty; + empty.resize(m_samplesPerChunk * 1, 0); // 1 channel + for (uint64_t i = 0; i < chunkCount; ++i) { m_renderers[0]->feed(&empty[0], m_samplesPerChunk); } + + m_renderers[0]->rebuild(*m_rendererCtx); + + return true; +} + +bool StreamRendererStimulation::push(const TypeStimulation::Buffer& chunk, bool /*zeroInput*/) +{ + for (size_t i = 0; i < chunk.m_buffer.getStimulationCount(); ++i) + { + m_renderers[0]->feed(chunk.m_buffer.getStimulationDate(i) - m_startTime.time(), chunk.m_buffer.getStimulationIdentifier(i)); + } + + return true; +} + +CString StreamRendererStimulation::renderAsText(const size_t /*indent*/) const +{ + // No specific details for stimulation streams + return ""; +} + +bool StreamRendererStimulation::showChunkList() +{ + if (m_stimulationListWindow) + { + gtk_window_present(GTK_WINDOW(m_stimulationListWindow)); + return true; + } + + GtkBuilder* pBuilder = gtk_builder_new(); + const CString filename = Directories::getDataDir() + "/applications/tracker/tracker.ui"; + if (!gtk_builder_add_from_file(pBuilder, filename, nullptr)) + { + std::cout << "Problem loading [" << filename << "]\n"; + return false; + } + + m_stimulationListWindow = GTK_WIDGET(gtk_builder_get_object(pBuilder, "tracker-stimulation_list")); + GtkTreeView* channelTreeView = GTK_TREE_VIEW(gtk_builder_get_object(pBuilder, "tracker-stimulation_list-treeview")); + // GtkListStore* channelListStore = GTK_LIST_STORE(gtk_builder_get_object(pBuilder, "liststore_select")); + GtkTreeStore* channelListStore = gtk_tree_store_new(7, G_TYPE_UINT, G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_UINT64, G_TYPE_STRING, + G_TYPE_DOUBLE); + + gtk_window_set_title(GTK_WINDOW(m_stimulationListWindow), "List of Stimulations in the stream"); + + add_column(channelTreeView, "Chunk#", 0, 20); + add_column(channelTreeView, "ChunkStart (s)", 1, 10); + add_column(channelTreeView, "ChunkEnd (s)", 2, 10); + add_column(channelTreeView, "Stim Time (s)", 3, 20); + add_column(channelTreeView, "Stim Id", 4, 5); + add_column(channelTreeView, "Stim Name", 5, 40); + add_column(channelTreeView, "Stim Duration", 6, 10); + + gtk_tree_view_set_model(channelTreeView, GTK_TREE_MODEL(channelListStore)); + + GtkTreeIter it; + gtk_tree_store_clear(channelListStore); + + // ::gtk_tree_view_set_model(m_pChannelTreeView, nullptr); + for (size_t i = 0; i < m_stream->getChunkCount(); ++i) + { + const TypeStimulation::Buffer* ptr = m_stream->getChunk(i); + if (!ptr) { break; } + + for (uint32_t s = 0; s < ptr->m_buffer.getStimulationCount(); ++s) + { + const CString stimName = m_kernelCtx.getTypeManager().getEnumerationEntryNameFromValue( + OV_TypeId_Stimulation, ptr->m_buffer.getStimulationIdentifier(s)); + + gtk_tree_store_append(channelListStore, &it, nullptr); + gtk_tree_store_set(channelListStore, &it, + 0, i, + 1, ptr->m_StartTime.toSeconds(), + 2, ptr->m_EndTime.toSeconds(), + 3, CTime(ptr->m_buffer.getStimulationDate(s)).toSeconds(), + 4, ptr->m_buffer.getStimulationIdentifier(s), + 5, stimName.toASCIIString(), + 6, CTime(ptr->m_buffer.getStimulationDuration(s)).toSeconds(), -1); + } + } + + // GList* cols = gtk_tree_view_get_columns(m_pChannelTreeView); + + // Hide instead of destroy on closing the window + g_signal_connect(m_stimulationListWindow, "delete_event", G_CALLBACK(gtk_widget_hide_on_delete), nullptr); + gtk_widget_show_all(GTK_WIDGET(m_stimulationListWindow)); + g_object_unref(pBuilder); + + return true; +} + +bool StreamRendererStimulation::mouseButton(const int x, const int y, const int button, const int status) +{ + // if (button == 3 && status == 1) { showStimulationList(); } + return StreamRendererBase::mouseButton(x, y, button, status); +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/Testclass.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/Testclass.cpp new file mode 100755 index 0000000..5d68f4a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/Testclass.cpp @@ -0,0 +1,87 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// + +#include +#include +#include + +#include "Testclass.h" +// #include "Source.h" +#include "Stream.h" +#include "Encoder.h" + +namespace OpenViBE { +namespace Tracker { + +TestClass::TestClass(Kernel::IKernelContext& ctx) : m_Ctx(ctx) +{ + std::cout << "Testing\n"; + + // Encoder2 testCoder(ctx); + // Encoder testCoder(ctx); + +#if 0 + StreamSignal testStream(ctx); + StreamMatrix testStream2(ctx); + + std::vector list; + + list.push_back(&testStream); + list.push_back(&testStream2); + + Stream* tmp = list[0]; + + std::cout << "First is " << ctx.getTypeManager().getTypeName(tmp->getTypeIdentifier()) << "\n"; +#endif + + //const CString eegFile = Directories::getDataDir() + CString("/scenarios/signals/bci-motor-imagery.ov"); + //Source src; + //src.initialize(eegFile.toASCIIString()); + +#if 0 + // Test code illustrating how to alter stimulation stream + for (auto it = m_Streams.begin();it != m_Streams.end(); ++it) + { + if(it->second->getTypeIdentifier() == OV_TypeId_Stimulations) + { + TypeError::Buffer *ptr = nullptr; + it->second->peek(CTime(5.0).time(), &ptr); + TypeStimulation::Buffer *ptr2 = reinterpret_cast(ptr); + // std::cout << "cnt: " << ptr2->m_buffer.getStimulationCount() << "\n"; + + // Request early stop + ptr2->m_buffer.clear(); + ptr2->m_buffer.appendStimulation(OVTK_StimulationId_ExperimentStop, CTime(5.0).time(),0); + } + } +#endif + +#if 0 + StreamHeaderSignal signalHeader; + signalHeader.m_samplingRate = 512; + + Stream testStream(m_ctx); + testStream.initialize(signalHeader); + + StreamDataSignal* data = new(StreamDataSignal); + data->data.setDimensionSize(10,2); + testStream.push(data); + + // Encode a stream + Encoder encoder(ctx); + + std::vector encoded; + + encoded.push_back( encoder.encodeHeader(testStream.getHeader()) ); + + for (size_t i=0;igetNumStreams(); ++s) + { + const auto stream = track->getStream(s); + + // This plugin only handles signal streams + if (stream->getSelected() && stream->getTypeIdentifier() == OV_TypeId_Signal) + { + nTested++; + + auto typedStream = std::static_pointer_cast>(stream); + + const auto& hdr = typedStream->getHeader(); + const uint32_t thisChannels = hdr.m_Header.getDimensionSize(0); + if (nTested == 1) { nChannels = thisChannels; } + else if (nChannels != thisChannels) + { + log() << Kernel::LogLevel_Error << "Stream " << (s + 1) << " of Track " << t + 1 << " has different number of signal channels (" + << thisChannels << ") than previous signal streams (" << nChannels << ")\n"; + return true; + } + } + } + + // This plugin does not modify the track. If it did, we would need to call the following: + // track.setDirtyBit(true); + } + + log() << Kernel::LogLevel_Info << "All signal streams have the same amount of channels (" << nTested << " tested)\n"; + + return true; +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/TrackerPluginCountStimulations.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/TrackerPluginCountStimulations.cpp new file mode 100755 index 0000000..8c7e2b8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/TrackerPluginCountStimulations.cpp @@ -0,0 +1,67 @@ +#include // shared_ptr + +#include "TrackerPluginCountStimulations.h" + +#include "Stream.h" +#include "TypeStimulation.h" + +namespace OpenViBE { +namespace Tracker { + +bool TrackerPluginCountStimulations::process(StreamBundle& track) +{ + log() << Kernel::LogLevel_Info << "TrackerPluginCountStimulation: Counting stimulations in the selected streams\n"; + + bool processedSomething = false; + + for (size_t s = 0; s < track.getNumStreams(); ++s) + { + const auto stream = track.getStream(s); + + // This plugin only handles stimulation streams + if (stream->getSelected() && stream->getTypeIdentifier() == OV_TypeId_Stimulations) + { + processedSomething = true; + + std::map histogram; + double numStims = 0; + + const auto typedStream = std::static_pointer_cast>(stream); + + // Count occurrences + for (size_t i = 0; i < typedStream->getChunkCount(); ++i) + { + const auto chunk = typedStream->getChunk(i); + for (size_t stimIdx = 0; stimIdx < chunk->m_buffer.getStimulationCount(); ++stimIdx) + { + auto id = chunk->m_buffer.getStimulationIdentifier(stimIdx); + + auto it = histogram.find(id); + if (it != histogram.end()) { it->second++; } + else { histogram[id] = 1; } + numStims++; + } + } + + // Print + log() << Kernel::LogLevel_Info << "Stimulation counts for stream " << (s + 1) << " ...\n"; + for (auto& it : histogram) + { + const CString name = m_kernelCtx.getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, it.first); + + log() << Kernel::LogLevel_Info << (name.length() > 0 ? name : "Unregistered") << " (" << it.first << ") " << " : " << it.second + << " (" << (it.second / numStims) * 100 << "%)" << "\n"; + } + } + } + + // This plugin does not modify the track. If it did, we would need to call the following: + // track.setDirtyBit(true); + + if (!processedSomething) { log() << Kernel::LogLevel_Info << "No selected streams compatible with stimulation counting plugin\n"; } + + return true; +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/TrackerPlugins.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/TrackerPlugins.cpp new file mode 100755 index 0000000..4f87a7f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/TrackerPlugins.cpp @@ -0,0 +1,59 @@ +#include // std::sort + +#include "TrackerPlugins.h" +#include "TrackerPluginCountStimulations.h" +#include "TrackerPluginChannelCheck.h" + +namespace OpenViBE { +namespace Tracker { + +TrackerPlugins::TrackerPlugins(const Kernel::IKernelContext& ctx) : Contexted(ctx) +{ + // Declare all plugins here + m_pluginCreateCalls.push_back([&ctx]() { return new TrackerPluginCountStimulations(ctx); }); + m_pluginCreateCalls.push_back([&ctx]() { return new TrackerPluginChannelCheck(ctx); }); + + // Create example instances of the plugins so the GUI can display a list + for (auto& fun : m_pluginCreateCalls) + { + auto ptr = fun(); + m_trackerPlugins.push_back(ptr); + } + + if (m_trackerPlugins.empty()) { return; } + + // get both arrays sorted. No code beauty contest winners here... + std::vector indexes; + for (size_t i = 0; i < m_trackerPlugins.size(); ++i) { indexes.push_back(i); } + + auto& pluginRef = m_trackerPlugins; + auto& callRef = m_pluginCreateCalls; + + std::sort(indexes.begin(), indexes.end(), + [&pluginRef](const size_t a, const size_t b) { return (pluginRef[a]->getName()) < (pluginRef[b]->getName()); }); + + std::vector sortedPlugins; + std::transform(indexes.begin(), indexes.end(), std::back_inserter(sortedPlugins), [pluginRef](const size_t i) { return pluginRef[i]; }); + m_trackerPlugins = sortedPlugins; + + std::vector> sortedCalls; + std::transform(indexes.begin(), indexes.end(), std::back_inserter(sortedCalls), [callRef](const size_t i) { return callRef[i]; }); + m_pluginCreateCalls = sortedCalls; +} + +TrackerPlugins::~TrackerPlugins() +{ + for (auto f : m_trackerPlugins) { delete f; } + m_trackerPlugins.clear(); + m_pluginCreateCalls.clear(); +} + +ITrackerPlugin* TrackerPlugins::getPluginCopy(const size_t index) const +{ + if (index >= m_pluginCreateCalls.size()) { return nullptr; } + const auto fun = m_pluginCreateCalls[index]; + return fun(); +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/Workspace.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/Workspace.cpp new file mode 100755 index 0000000..2fef82b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/Workspace.cpp @@ -0,0 +1,889 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// + +#include +#include // std::ctime +#include // std::replace, std::max +#include //std::setw, setfill +#include + +#include "Workspace.h" +#include "StreamBundleImportExport.h" + +#include "StimulationStreamFilter.h" + +namespace OpenViBE { +namespace Tracker { + +Workspace::~Workspace() +{ + for (size_t i = 0; i < m_tracks.size(); ++i) + { + if (m_tracks[i]) + { + m_tracks[i]->uninitialize(); + delete m_tracks[i]; + } + } + m_tracks.clear(); +} + +bool Workspace::setUniqueWorkingPath() +{ + const CString workspacePrefix = m_kernelCtx.getConfigurationManager().expand("${Path_UserData}/tracker-workspace-"); + + const auto currentTime = std::chrono::system_clock::now(); + std::time_t t = std::chrono::system_clock::to_time_t(currentTime); + std::string stringTime = std::ctime(&t); + std::replace(stringTime.begin(), stringTime.end(), ' ', '-'); + std::replace(stringTime.begin(), stringTime.end(), ':', '-'); + std::replace(stringTime.begin(), stringTime.end(), '/', '-'); + std::replace(stringTime.begin(), stringTime.end(), '\\', '-'); + std::replace(stringTime.begin(), stringTime.end(), '\n', '-'); + + // This is not a super safe way to create a directory name but it is unlikely the user + // would run many trackers at the same time + const std::string workspacePath = std::string(workspacePrefix.toASCIIString()) + stringTime; + uint32_t counter = 0; + while (FS::Files::directoryExists((workspacePath + std::to_string(counter)).c_str())) { counter++; } + + setWorkingPath(CString((workspacePath + std::to_string(counter)).c_str())); + + return true; +} + +bool Workspace::step() +{ + if (m_executor->isIdle()) + { + log() << Kernel::LogLevel_Info << "All jobs finished\n"; + stop(); + return false; + } + System::Time::sleep(1); + return true; +} + +bool Workspace::spoolRecordingToDisk(const size_t trackIndex) +{ + if (trackIndex >= m_tracks.size()) + { + log() << Kernel::LogLevel_Error << "Index " << trackIndex << " is outside array.\n"; + return false; + } + + // Spool the new track to disk + std::stringstream filename; + filename << m_workspacePath << "/workspace" + << "-track" << std::setw(3) << std::setfill('0') << trackIndex + 1 + << "-rev" << std::setw(3) << std::setfill('0') << m_revision << ".ov"; + + saveStreamBundleToFile(m_kernelCtx, m_tracks[trackIndex], filename.str().c_str()); + m_tracks[trackIndex]->setSource(filename.str()); + + if (m_memorySaveMode) + { + // Load back in memory save mode + delete m_tracks[trackIndex]; + m_tracks[trackIndex] = readStreamBundleFromFile(m_kernelCtx, filename.str().c_str(), true); + } + + return true; +} + +std::string Workspace::getProcessorArguments(const size_t index) +{ + std::string trackSource("None"); + if (index >= 0 && m_tracks[index]->getSource().length() > 0) { trackSource = m_tracks[index]->getSource(); } + + // Append generic configuration tokens. n.b. make sure no define argument is an empty string. + std::stringstream ss; + ss << " "; + ss << "--define Tracker_Workspace_File " << "\"" << (m_workspaceFile.length() > 0 ? m_workspaceFile : "None") << "\" "; + ss << "--define Tracker_Workspace_Path " << "\"" << (m_workspacePath.length() > 0 ? m_workspacePath : "None") << "\" "; + ss << "--define Tracker_CurrentTrack_Number " << index + 1 << " "; + ss << "--define Tracker_CurrentTrack_Source " << "\"" + trackSource << "\" "; + ss << "--define Tracker_CatenatePlayback " << (m_catenateMode ? "True" : "False") << " "; + + // Include those potentially set by the user in the GUI + std::string args = std::string(m_processorArguments.toASCIIString()) + ss.str(); + + return args; +} + + +bool Workspace::getNextTrack(size_t& nextTrack) const +{ + nextTrack = nextTrack + 1; + while (nextTrack < getNumTracks() && !m_selection.isTrackSelected(nextTrack)) { nextTrack++; } + + if (nextTrack >= getNumTracks()) + { + nextTrack = size_t(-1); + return false; + } + + return true; +} + +bool Workspace::assemblePlaylist() +{ + m_playlist.clear(); + + m_playlistDuration = 0; + + size_t nextTrack = size_t(-1); + while (getNextTrack(nextTrack)) + { + StreamBundle* source = m_tracks[nextTrack]; + m_playlistDuration += source->getMaxDuration(); + + SourceTimePair tmp(source, CTime::min()); + + m_playlist.push_back(tmp); + } + + return true; +} + + +// Construct list of streamsubsets to process +// make processing each streamsubset a job +// connect input and output to the job +// monitor until jobs are complete +// +bool Workspace::play(const bool playFast) +{ + m_playFast = playFast; + m_pleaseQuit = false; + m_tracksDone = 0; + m_playlistDuration = 0; + + if (!m_executor) + { + log() << Kernel::LogLevel_Error << "Need a parallel executor set\n"; + return false; + } + + if (!m_selection.isSelectionConsistent()) + { + log() << Kernel::LogLevel_Error << + "For processing, the selected streams for each track must have equal types, in equal amounts, and in the same stream type order.\n"; + return false; + } + + if (!m_processor.canPush() && !m_processor.canPull()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Please configure the processor to send, receive, or both.\n"; + return false; + } + + if (!m_processor.canPush()) { return playReceiveOnly(); } + + // Generate streamsubsets to process + assemblePlaylist(); + + if (m_catenateMode) { return playCatenate(); } + return playNormal(); +} + +bool Workspace::playCatenate() +{ + uint32_t portToUse, dummy; + m_processor.getProcessorPorts(portToUse, dummy); + + const std::string filename = m_processorFilename; + + bool playFast = m_playFast; + auto& refProc = m_processor; + + std::string args = getProcessorArguments(0); + + auto job = [playFast/*, portToUse*/, args, filename, &refProc, this](uint32_t /*threadNumber*/) + { + uint32_t playlistIndex = 0; + + StreamBundle* target = new StreamBundle(this->getKernelContext()); + + ProcExternalProcessing proc(getKernelContext(), refProc); + proc.setArguments(args.c_str()); + proc.setNewTarget(target); + + StreamBundle* loaded = nullptr; + StreamBundle* subset = nullptr; + + auto quitCallback = [this,playlistIndex](const CTime spent) + { + { + std::unique_lock (m_Mutex); + this->m_playlist[playlistIndex].second = spent; + } + return isQuitRequested(); + }; + + auto nextTrackFun = [this,&playlistIndex,&proc,&subset, &loaded]() + { + delete subset; + + if (playlistIndex >= m_playlist.size()) { return false; } + + this->log() << Kernel::LogLevel_Info << "Switching to process track " << playlistIndex + 1 << " out of " << m_playlist.size() << "\n"; + + subset = new StreamBundle(this->m_kernelCtx); + + const auto& ptr = m_playlist[playlistIndex]; + + StreamBundle* source = ptr.first; + + if (this->m_memorySaveMode) + { + this->log() << Kernel::LogLevel_Info << "Memory save mode: Loading " << source->getSource().c_str() << " from disk\n"; + + loaded = readStreamBundleFromFile(this->m_kernelCtx, source->getSource().c_str(), false); + + // copy selection from the one in memory + for (size_t i = 0; i < source->getNumStreams(); ++i) { loaded->getStream(i)->setSelected(source->getStream(i)->getSelected()); } + subset->copyFrom(*loaded); + + delete loaded; + } + else + { + // Select subset of streams to play + subset->copyFrom(*source); + } + + const bool isFirst = (playlistIndex == 0); + const bool isLast = (playlistIndex >= m_playlist.size() - 1); + + proc.setNewSource(subset, isFirst, isLast); + + { + std::unique_lock(this->getMutex()); + this->m_tracksDone++; + } + + playlistIndex++; + + return true; + }; + + proc.play(playFast, quitCallback, nextTrackFun); + + this->log() << Kernel::LogLevel_Info << "Track complete.\n"; + + + if (target->getNumStreams() > 0) + { + // Single threaded here, so can get m_Tracks.size() outside mutex + const size_t newIndex = m_tracks.size(); + this->setTrack(newIndex, target); + // Spool result to disk, note that it might be incomplete as the user requested stop + if (m_memorySaveMode) + { + log() << Kernel::LogLevel_Info << "Writing new track to disk.\n"; + spoolRecordingToDisk(newIndex); + } + } + else { delete target; } + }; + + m_executor->pushJob(job); + + return true; +} + +bool Workspace::playNormal() +{ + uint32_t firstPort, dummy; + m_processor.getProcessorPorts(firstPort, dummy); + + const size_t lastFreeIndex = m_tracks.size(); + bool playFast = m_playFast; + const size_t totalTracks = m_playlist.size(); + + for (size_t playlistIndex = 0; playlistIndex < totalTracks; ++playlistIndex) + { + auto& ptr = m_playlist[playlistIndex]; + + std::string args = getProcessorArguments(playlistIndex); + const std::string filename = m_processorFilename; + + auto& refProc = m_processor; + + auto job = [&ptr,&refProc,args, playFast,filename, lastFreeIndex, playlistIndex, firstPort, totalTracks, this](const uint32_t threadNumber) + { + StreamBundle* original = ptr.first; + StreamBundle* target = new StreamBundle(this->m_kernelCtx); + StreamBundle* subset = new StreamBundle(this->m_kernelCtx); + + this->log() << Kernel::LogLevel_Trace << "Switching to process track " << playlistIndex + 1 << " out of " << totalTracks << "\n"; + + if (this->m_memorySaveMode) + { + this->log() << Kernel::LogLevel_Info << "Memory save mode: Loading " << original->getSource().c_str() << " from disk\n"; + + StreamBundle* loaded = readStreamBundleFromFile(this->m_kernelCtx, original->getSource().c_str(), false); + + // copy selection from the one in memory + for (size_t i = 0; i < original->getNumStreams(); ++i) { loaded->getStream(i)->setSelected(original->getStream(i)->getSelected()); } + subset->copyFrom(*loaded); + + delete loaded; + } + else + { + // Select subset of streams to play + subset->copyFrom(*original); + } + + auto quitCallback = [this,playlistIndex](const CTime spent) + { + { + std::unique_lock (m_Mutex); + this->m_playlist[playlistIndex].second = spent; + } + this->m_playlist[playlistIndex].second = spent; + return isQuitRequested(); + }; + + // Process + ProcExternalProcessing proc(this->getKernelContext(), refProc); + proc.setNewSource(subset, true, true); + proc.setNewTarget(target); + proc.setArguments(args.c_str()); + proc.setProcessorPorts(firstPort + 2 * threadNumber, firstPort + 2 * threadNumber + 1); + proc.play(playFast, quitCallback); + + this->log() << Kernel::LogLevel_Trace << "Track " << playlistIndex + 1 << " complete.\n"; + { + std::unique_lock(this->getMutex()); + this->m_tracksDone++; + } + + // Clean-up + delete subset; + + if (target->getNumStreams() > 0) + { + // if not inplacemode, attempt to insert in the same order as the sources were in the list + const size_t newIndex = (this->getInplaceMode() ? playlistIndex : lastFreeIndex + playlistIndex); + + this->setTrack(newIndex, target); + + // Spool result to disk, note that it might be incomplete as the user requested stop + if (m_memorySaveMode) + { + log() << Kernel::LogLevel_Info << "Writing new track to disk.\n"; + spoolRecordingToDisk(newIndex); + } + } + else + { + // this->log() << Kernel::LogLevel_Warnin + delete target; + } + }; + + m_executor->pushJob(job); + } + + return true; +} + +bool Workspace::playReceiveOnly() +{ + const size_t lastFreeIndex = m_tracks.size(); + bool playFast = m_playFast; + + std::string args = getProcessorArguments(-1); + const std::string filename = m_processorFilename; + + auto& refProc = m_processor; + + m_playlist.clear(); + m_playlist.push_back(SourceTimePair(nullptr, CTime())); + + auto job = [&refProc,args, playFast,filename, lastFreeIndex, this](uint32_t /*threadNumber*/) + { + StreamBundle* target = new StreamBundle(this->m_kernelCtx); + + this->log() << Kernel::LogLevel_Info << "Recording a track (noSend configured)\n"; + + auto quitCallback = [this](const CTime spent) + { + // single thread, no cc + this->m_playlistDuration = spent; + this->m_playlist[0].second = spent; + return isQuitRequested(); + }; + + // Process + ProcExternalProcessing proc(this->getKernelContext(), refProc); + proc.setNewSource(nullptr, true, true); + proc.setNewTarget(target); + proc.setArguments(args.c_str()); + proc.play(playFast, quitCallback); + + this->log() << Kernel::LogLevel_Info << "Recording complete.\n"; + + if (target->getNumStreams() > 0) + { + // if not inplacemode, attempt to insert in the same order as the sources were in the list + const size_t newIndex = lastFreeIndex; + + this->setTrack(newIndex, target); + + // Spool result to disk, note that it might be incomplete as the user requested stop + if (m_memorySaveMode) + { + log() << Kernel::LogLevel_Info << "Writing new track to disk.\n"; + spoolRecordingToDisk(newIndex); + } + } + else { delete target; } + }; + + m_executor->pushJob(job); + + return true; +} + +bool Workspace::stop(const bool stopProcessor) +{ + if (stopProcessor) + { + std::unique_lock m_Mutex; + m_executor->clearPendingJobs(); + m_pleaseQuit = true; + } + return true; +} + +bool Workspace::clearTracks() +{ + for (size_t i = 0; i < m_tracks.size(); ++i) { delete m_tracks[i]; } + m_tracks.clear(); + + return true; +} + +bool Workspace::removeTrack(const size_t idx) +{ + if (idx >= m_tracks.size()) { return false; } + delete m_tracks[idx]; + m_tracks.erase(m_tracks.begin() + idx); + + return true; +} + +bool Workspace::removeStream(const size_t track, const size_t stream) +{ + if (track >= getNumTracks() || stream >= getTrack(track)->getNumStreams()) { return false; } + if (getTrack(track)->deleteStream(stream)) { return true; } + return false; +} + +bool Workspace::addTrack(const char* filename) +{ + if (!filename || !filename[0]) { return false; } + + StreamBundle* newTrack = readStreamBundleFromFile(m_kernelCtx, filename, m_memorySaveMode); + if (!newTrack) { return false; } + + log() << Kernel::LogLevel_Debug << "The loaded track has " << newTrack->getNumStreams() << " streams\n"; + for (size_t i = 0; i < newTrack->getNumStreams(); ++i) + { + if (newTrack->getStream(i)) + { + log() << Kernel::LogLevel_Debug << " Stream " << i << " has type " + << newTrack->getStream(i)->getTypeIdentifier().str() << " == " + << m_kernelCtx.getTypeManager().getTypeName(newTrack->getStream(i)->getTypeIdentifier()) + << "\n"; + } + else + { + // @fixme this has the issue that even though the stream may have a definition, its lost currently if there's not even a header chunk in the stream + log() << Kernel::LogLevel_Info << " Stream " << i << " has a type the Tracker couldn't decode (or the stream was empty)\n"; + } + } + + m_tracks.push_back(newTrack); + + for (auto& str : newTrack->getAllStreams()) { str->setSelected(true); } + + return true; +} + +bool Workspace::moveStream(const size_t sourceTrack, const size_t sourceStream, const size_t targetTrack, const size_t targetStream) +{ + if (sourceTrack >= getNumTracks() || targetTrack >= getNumTracks()) { return false; } + if (sourceTrack == targetTrack && sourceStream == targetStream) { return true; } + if (sourceStream >= m_tracks[sourceTrack]->getNumStreams() || + targetStream >= m_tracks[targetTrack]->getNumStreams()) { return false; } + + if (sourceTrack != targetTrack) + { + const auto oldPtr = m_tracks[sourceTrack]->getStream(sourceStream); + + // Move pointer, do not free memory + auto& allStreams = m_tracks[sourceTrack]->getAllStreams(); + allStreams.erase(allStreams.begin() + sourceStream); + m_tracks[sourceTrack]->setDirtyBit(true); + + m_tracks[targetTrack]->setStream(m_tracks[targetTrack]->getNumStreams(), oldPtr); // append to the end + return m_tracks[targetTrack]->moveStream(m_tracks[targetTrack]->getNumStreams() - 1, targetStream); + } + return m_tracks[sourceTrack]->moveStream(sourceStream, targetStream); +} + +bool Workspace::moveTrack(const size_t sourceIdx, const size_t targetIdx) +{ + if (sourceIdx >= getNumTracks() || targetIdx >= getNumTracks()) { return false; } + if (sourceIdx == targetIdx) { return true; } + + const auto oldPtr = m_tracks[sourceIdx]; + m_tracks.erase(m_tracks.begin() + sourceIdx); + m_tracks.insert(m_tracks.begin() + targetIdx, oldPtr); + + return true; +} + + +bool Workspace::reloadTrack(const size_t index) +{ + if (index >= m_tracks.size()) { return false; } + StreamBundle* newTrack = readStreamBundleFromFile(m_kernelCtx, m_tracks[index]->getSource().c_str(), m_memorySaveMode); + + delete m_tracks[index]; + + m_tracks[index] = newTrack; + + return true; +} + +CTime Workspace::getMaxDuration() const +{ + CTime maxDuration = CTime::min(); + for (size_t i = 0; i < m_tracks.size(); ++i) { if (m_tracks[i]) { maxDuration = std::max(maxDuration, m_tracks[i]->getMaxDuration()); } } + return maxDuration; +} + + +bool Workspace::setProcessor(const char* scenarioXml) +{ + m_kernelCtx.getConfigurationManager().addOrReplaceConfigurationToken("Tracker_Workspace_Processor", scenarioXml); + m_processorFilename = scenarioXml; + return m_processor.initialize(scenarioXml); +} + +bool Workspace::setProcessorFlags(const bool noGUI, const bool doSend, const bool doReceive) { return m_processor.setProcessorFlags(noGUI, doSend, doReceive); } +bool Workspace::getProcessorFlags(bool& noGUI, bool& doSend, bool& doReceive) const { return m_processor.getProcessorFlags(noGUI, doSend, doReceive); } +bool Workspace::setProcessorPorts(const uint32_t sendPort, const uint32_t recvPort) { return m_processor.setProcessorPorts(sendPort, recvPort); } + +bool Workspace::saveAll() +{ + if (m_workspacePath.length() == 0) + { + log() << Kernel::LogLevel_Error << "Error: Workspace path not set...\n"; + return false; + } + if (!FS::Files::directoryExists(m_workspacePath.toASCIIString())) + { + if (!FS::Files::createPath(m_workspacePath.toASCIIString())) + { + log() << Kernel::LogLevel_Error << "Error: Unable to create directory " << m_workspacePath << "\n"; + return false; + } + } + + bool retVal = true; + + if (getNumTracks() > 0) { log() << Kernel::LogLevel_Info << "Saving modified tracks to " << m_workspacePath << " ...\n"; } + + uint32_t tracksSaved = 0; + for (size_t i = 0; i < getNumTracks(); ++i) + { + if (!getTrack(i)->getDirtyBit()) + { + log() << Kernel::LogLevel_Trace << "Skipping track " << i + 1 << " / " << getNumTracks() << ", no modifications ...\n"; + continue; + } + log() << Kernel::LogLevel_Trace << "Saving track " << i + 1 << " / " << getNumTracks() << " ...\n"; + + std::stringstream filename; + filename << m_workspacePath << "/workspace" + << "-track" << std::setw(3) << std::setfill('0') << i + 1 + << "-rev" << std::setw(3) << std::setfill('0') << m_revision << ".ov"; + + // If we're in the memory save mode, we need to copy contents of the track to the new location + StreamBundle* track = (m_memorySaveMode ? readStreamBundleFromFile(m_kernelCtx, getTrack(i)->getSource().c_str(), false) : getTrack(i)); + + retVal &= saveStreamBundleToFile(m_kernelCtx, track, filename.str().c_str()); + + tracksSaved++; + + if (m_memorySaveMode) + { + getTrack(i)->setSource(track->getSource()); + getTrack(i)->setDirtyBit(false); + delete track; + } + } + + log() << Kernel::LogLevel_Info << "Done, " << tracksSaved << " had changed and needed to be saved.\n"; + + return retVal; +} + +bool Workspace::setMemorySaveMode(const bool active) +{ + if (active != m_memorySaveMode) + { + m_memorySaveMode = active; + if (active == false) + { + // Going from memory save mode to the normal mode + log() << Kernel::LogLevel_Info << "Switching to full mode. Loading tracks from disk.\n"; + } + else + { + // Going from normal mode to memory save mode + + // We need to spool all the modifications to the disk so the other mode can get them + log() << Kernel::LogLevel_Info << "Switching to memory save mode. Saving all modified tracks to disk.\n"; + + saveAll(); + } + + // Read tracks back in the new mode + for (size_t i = 0; i < m_tracks.size(); ++i) + { + const std::string filename = m_tracks[i]->getSource(); + delete m_tracks[i]; + m_tracks[i] = readStreamBundleFromFile(m_kernelCtx, filename.c_str(), m_memorySaveMode); + } + } + + return true; +} + +bool Workspace::clear() +{ + clearTracks(); + setFilename(""); + setUniqueWorkingPath(); + + return true; +} + +std::vector> Workspace::getConfigurationTokens() const +{ + std::vector> tokens; // For sorting + + CIdentifier iter = CIdentifier::undefined(); + while ((iter = m_kernelCtx.getConfigurationManager().getNextConfigurationTokenIdentifier(iter)) != CIdentifier::undefined()) + { + std::string prefix("Tracker_Workspace_"); + std::string token(m_kernelCtx.getConfigurationManager().getConfigurationTokenName(iter).toASCIIString()); + + // See if token has the prefix? + auto res = std::mismatch(prefix.begin(), prefix.end(), token.begin()); + if (res.first == prefix.end()) + { + std::string value(m_kernelCtx.getConfigurationManager().getConfigurationTokenValue(iter)); + tokens.push_back(std::pair(token, value)); + + // ::fprintf(file, "%s = %s\n", token.c_str(), value.toASCIIString()); + } + } + + std::sort(tokens.begin(), tokens.end()); + + return tokens; +} + +// @fixme for multiple workspaces this solution needs to be reworked +bool Workspace::save(const CString& filename) +{ + if (!m_tracks.empty() && !saveAll()) { return false; } + + // Save selection to configuration manager + m_selection.save("Tracker_Workspace_"); + + // Save processor configuration to manager + m_processor.save(); + + // Set workspaces own configuration tokens to manager + // @todo Why not already do this in the setters? + std::stringstream trackCount; + trackCount << m_tracks.size(); + std::stringstream revision; + revision << m_revision; + + auto& mgr = m_kernelCtx.getConfigurationManager(); + mgr.addOrReplaceConfigurationToken("Tracker_Workspace_Path", m_workspacePath.toASCIIString()); + mgr.addOrReplaceConfigurationToken("Tracker_Workspace_CatenatePlayback", (m_catenateMode ? "true" : "false")); + mgr.addOrReplaceConfigurationToken("Tracker_Workspace_MemorySaveMode", (m_memorySaveMode ? "true" : "false")); + mgr.addOrReplaceConfigurationToken("Tracker_Workspace_InplaceMode", (m_inplaceMode ? "true" : "false")); + mgr.addOrReplaceConfigurationToken("Tracker_Workspace_Track_Count", trackCount.str().c_str()); + mgr.addOrReplaceConfigurationToken("Tracker_Workspace_Processor_Arguments", m_processorArguments.toASCIIString()); + mgr.addOrReplaceConfigurationToken("Tracker_Workspace_Revision", revision.str().c_str()); + + FILE* file = fopen(filename.toASCIIString(), "wt"); + if (file) + { + fprintf(file, "# Workspace configuration file generated by OpenViBE Tracker\n"); + fprintf(file, "#\n"); + fprintf(file, "\n"); + + for (size_t i = 0; i < m_tracks.size(); ++i) + { + std::stringstream token; + token << "Tracker_Workspace_Track_" << std::setw(3) << std::setfill('0') << (i + 1); + mgr.addOrReplaceConfigurationToken(token.str().c_str(), m_tracks[i]->getSource().c_str()); + } + + // Spool all generic Tracker tokens from the manager to the file + auto tokens = getConfigurationTokens(); + for (auto& token : tokens) { fprintf(file, "%s = %s\n", token.first.c_str(), token.second.c_str()); } + + fprintf(file, "\n"); + + fclose(file); + } + else + { + log() << Kernel::LogLevel_Error << "Error: Couldn't open " << filename.toASCIIString() << " for writing\n"; + return false; + } + + m_workspaceFile = filename; + + // Save workspace notes + if (m_notes.getText().length() > 0 && m_workspacePath.length() > 0) + { + CString notesFile = m_workspacePath + CString("/workspace-notes.txt"); + m_notes.save(notesFile); + } + + return true; +} + +bool Workspace::load(const CString& filename) +{ + // @todo might wipe only specific tokens in the future, esp. if multiple workspaces become supported + wipeConfigurationTokens("Tracker_Workspace_"); + + auto& mgr = m_kernelCtx.getConfigurationManager(); + + if (!mgr.addConfigurationFromFile(filename)) { return false; } + + clearTracks(); + + m_workspaceFile = filename; + + const CString savedWorkspacePath = mgr.expand("${Tracker_Workspace_Path}"); + if (savedWorkspacePath.length() > 0) { m_workspacePath = savedWorkspacePath; } + + setCatenateMode(mgr.expandAsBoolean("${Tracker_Workspace_CatenatePlayback}", m_catenateMode)); + + // Here we don't use the setter as we're loading from scratch + m_memorySaveMode = mgr.expandAsBoolean("${Tracker_Workspace_MemorySaveMode}", m_memorySaveMode); + m_inplaceMode = mgr.expandAsBoolean("${Tracker_Workspace_InplaceMode}", m_inplaceMode); + + m_revision = mgr.expandAsUInteger("${Tracker_Workspace_Revision}", m_revision); + // m_NumRevisions = mgr.expandAsUInteger("${Tracker_Workspace_NumRevisions}", m_NumRevisions); + + m_processorArguments = mgr.expand("${Tracker_Workspace_Processor_Arguments}"); + + const uint32_t trackCount = uint32_t(mgr.expandAsUInteger("${Tracker_Workspace_Track_Count}", 0)); + for (uint32_t i = 0; i < trackCount; ++i) + { + std::stringstream token; + token << "Tracker_Workspace_Track_" << std::setw(3) << std::setfill('0') << (i + 1); + if (mgr.lookUpConfigurationTokenIdentifier(token.str().c_str()) != CIdentifier::undefined()) + { + CString tokenValue = mgr.lookUpConfigurationTokenValue(token.str().c_str()); + CString trackFile = mgr.expand(tokenValue); + log() << Kernel::LogLevel_Debug << "Loading track " << i + 1 << " : " << trackFile << "\n"; + addTrack(trackFile.toASCIIString()); + } + } + log() << Kernel::LogLevel_Info << "Loaded " << m_tracks.size() << " tracks of the workspace\n"; + + // Load processor config + m_processor.load(); + + // Load workspace notes + const CString notesFile = m_workspacePath + CString("/workspace-notes.txt"); + m_notes.load(notesFile); + + // Load selection + m_selection.load("Tracker_Workspace_"); + + return true; +} + +bool Workspace::incrementRevisionAndSave(const CString& /*filename*/) +{ + if (m_workspacePath.length() == 0) + { + log() << Kernel::LogLevel_Error << "Please set workspace path before saving revision\n"; + return false; + } + + for (auto& ptr : m_tracks) { ptr->setDirtyBit(true); } + + m_revision++; + // m_NumRevisions++; + + log() << Kernel::LogLevel_Info << "Revision updated to " << m_revision << "\n"; + + const bool retVal = save(m_workspaceFile); + + std::stringstream ss; + ss << m_workspacePath + "/revision-" << std::setw(3) << std::setfill('0') << m_revision << "-backup.ovw"; + const std::string fn = ss.str(); + FS::Files::remove(fn.c_str()); + if (FS::Files::copyFile(m_workspaceFile.toASCIIString(), fn.c_str())) { log() << Kernel::LogLevel_Info << "Revision backup saved to " << ss.str() << "\n"; } + else { log() << Kernel::LogLevel_Info << "Error saving backup to " << ss.str() << "\n"; } + + return retVal; +} + + +bool Workspace::wipeConfigurationTokens(const std::string& prefix) const +{ + CIdentifier it = CIdentifier::undefined(), prev = CIdentifier::undefined(); + while ((it = m_kernelCtx.getConfigurationManager().getNextConfigurationTokenIdentifier(it)) != CIdentifier::undefined()) + { + std::string token(m_kernelCtx.getConfigurationManager().getConfigurationTokenName(it).toASCIIString()); + + // See if token has the prefix? + auto res = std::mismatch(prefix.begin(), prefix.end(), token.begin()); + if (res.first == prefix.end()) + { + m_kernelCtx.getConfigurationManager().releaseConfigurationToken(it); + it = prev; + } + else { prev = it; } + } + return true; +} + + +CTime Workspace::getProcessedTime() const +{ + std::unique_lock m_Mutex; + + CTime processed = CTime::min(); + for (auto& ptr : m_playlist) { processed += ptr.second; } + return processed; +} + +} // namespace Tracker +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/main.cpp b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/main.cpp new file mode 100755 index 0000000..1702456 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/src/main.cpp @@ -0,0 +1,278 @@ +// +// OpenViBE Tracker +// +// @author J.T. Lindgren +// + +#include +#include +#include + +#include "CTracker.h" + +#include "GUI.h" + +#include "Testclass.h" + +#if defined TARGET_OS_Windows +#include "Windows.h" +#include "shellapi.h" +#endif + + +typedef enum +{ + CommandLineFlag_None = 0x00000000, // 0 + CommandLineFlag_Define = 0x00000040, // 64 + CommandLineFlag_Config = 0x00000080, // 128 +} ECommandLineFlag; + +typedef struct SConfiguration +{ + SConfiguration() { } + + OpenViBE::Designer::ECommandLineFlag getFlags() const { return OpenViBE::Designer::ECommandLineFlag(define | config); } + + std::vector> flags; + + ECommandLineFlag define = CommandLineFlag_None; + ECommandLineFlag config = CommandLineFlag_None; + bool help = false; + // to resolve warning: padding struct '_SConfiguration' with 4 bytes to align 'm_oTokenMap + int structPadding = 0; + std::map tokens; +} configuration_t; + + +bool parse_arguments(int argc, char** argv, configuration_t& rConfiguration) +{ + configuration_t config; + + std::vector argValue; +#if defined TARGET_OS_Windows + int nArg; + LPWSTR* argListUtf16 = CommandLineToArgvW(GetCommandLineW(), &nArg); + for (int i = 1; i < nArg; ++i) + { + GError* error = nullptr; + glong itemsRead, itemsWritten; + char* argUtf8 = g_utf16_to_utf8(reinterpret_cast(argListUtf16[i]), size_t(wcslen(argListUtf16[i])), &itemsRead, &itemsWritten, &error); + argValue.push_back(argUtf8); + if (error) + { + g_error_free(error); + return false; + } + } +#else + argValue = std::vector(argv + 1, argv + argc); +#endif + argValue.push_back(""); + + for (auto it = argValue.cbegin(); it != argValue.cend(); ++it) + { + if (*it == "") { } + else if (*it == "-h" || *it == "--help") + { + config.help = true; + rConfiguration = config; + return false; + } + else if (*it == "-c" || *it == "--config") + { + if (*++it == "") + { + std::cout << "Error: Switch --config needs an argument\n"; + return false; + } + config.flags.push_back(std::make_pair(CommandLineFlag_Config, *it)); + } + else if (*it == "-d" || *it == "--define") + { + if (*++it == "") + { + std::cout << "Error: Need two arguments after -d / --define.\n"; + return false; + } + + // Were not using = as a separator for token/value, as on Windows its a problem passing = to the cmd interpreter + // which is used to launch the actual designer exe. + const std::string& token = *it; + if (*++it == "") + { + std::cout << "Error: Need two arguments after -d / --define.\n"; + return false; + } + + const std::string& value = *it; // iterator will increment later + + config.tokens[token] = value; + } + else if (*it == "--g-fatal-warnings") + { + // Do nothing here but accept this gtk flag + } + else if (*it == "-v" || *it == "--version") + { +#if defined(TARGET_OS_Windows) + const std::string platform("Windows"); +#elif defined(TARGET_OS_Linux) + const std::string platform("Linux"); +#else + const std::string platform("Other"); +#endif +#if defined(TARGET_ARCHITECTURE_x64) + const std::string arch("64bit"); +#else + const std::string arch("32bit"); +#endif +#if defined(TARGET_BUILDTYPE_Debug) + const std::string buildType("Debug"); +#elif defined(TARGET_BUILDTYPE_Release) + const std::string buildType("Release"); +#else + const std::string buildType("Unknown"); +#endif + std::cout << OV_PROJECT_NAME << " Tracker - Version " << OV_VERSION_MAJOR << "." << OV_VERSION_MINOR << "." << OV_VERSION_PATCH + << " (" << platform << " " << arch << " " << buildType << " build)" << std::endl; + exit(0); + } + else { return false; } + } + + rConfiguration = config; + + return true; +} + +void user_info(char** argv, OpenViBE::Kernel::ILogManager* logMgr) +{ + const std::vector messages = + { + "Syntax : " + std::string(argv[0]) + " [ switches ]\n", "Possible switches :\n", + " --help : displays this help message and exits\n", + " --config filename : path to config file\n", + " --define token value : specify configuration token with a given value\n", + " --version : shows version information and exits" + }; + + if (logMgr) { for (const auto& m : messages) { (*logMgr) << OpenViBE::Kernel::LogLevel_Info << m; } } + else { for (const auto& m : messages) { std::cout << m; } } +} + + +class KernelWrapper +{ +public: + KernelWrapper() : m_KernelCtx(nullptr), m_KernelDesc(nullptr) { } + + ~KernelWrapper() + { + if (m_KernelCtx) + { + std::cout << "Unloading kernel" << std::endl; + OpenViBE::Toolkit::uninitialize(*m_KernelCtx); + m_KernelDesc->releaseKernel(m_KernelCtx); + m_KernelCtx = nullptr; + } + + std::cout << "Unloading loader" << std::endl; + m_KernelLoader.uninitialize(); + m_KernelLoader.unload(); + } + + bool initialize(const configuration_t& config) + { + std::cout << "[ INF ] Created kernel loader, trying to load kernel module" << std::endl; +#if defined TARGET_OS_Windows + const OpenViBE::CString kernelFile = OpenViBE::Directories::getLibDir() + "/openvibe-kernel.dll"; +#else + const OpenViBE::CString kernelFile = OpenViBE::Directories::getLibDir() + "/libopenvibe-kernel.so"; +#endif + OpenViBE::CString error; + if (!m_KernelLoader.load(kernelFile, &error)) + { + std::cout << "[ FAILED ] Error loading kernel from [" << kernelFile << "]: " << error << "\n"; + return false; + } + + std::cout << "[ INF ] Kernel module loaded, trying to get kernel descriptor" << std::endl; + m_KernelLoader.initialize(); + m_KernelLoader.getKernelDesc(m_KernelDesc); + if (!m_KernelDesc) + { + std::cout << "[ FAILED ] No kernel descriptor" << std::endl; + return false; + } + + std::cout << "[ INF ] Got kernel descriptor, trying to create kernel" << std::endl; + + const OpenViBE::CString configFile = OpenViBE::CString(OpenViBE::Directories::getDataDir() + "/kernel/openvibe.conf"); + + m_KernelCtx = m_KernelDesc->createKernel("tracker", configFile); + if (!m_KernelCtx) + { + std::cout << "[ FAILED ] No kernel created by kernel descriptor" << std::endl; + return false; + } + + m_KernelCtx->initialize(); + + // Gets the 'stimulation id,name' mappings loaded to TypeManager etc + OpenViBE::Toolkit::initialize(*m_KernelCtx); + + OpenViBE::Kernel::IConfigurationManager& configManager = m_KernelCtx->getConfigurationManager(); + + // configManager.addConfigurationFromFile(configManager.expand("${Path_Data}/applications/acquisition-server/acquisition-server-defaults.conf")); + + // User configuration mods + configManager.addConfigurationFromFile(configManager.expand("${Path_UserData}/openvibe-tracker.conf")); + + // File pointed to by --config flag overrides earlier + for (const auto& it : config.flags) + { + if (it.first == CommandLineFlag_Config) { configManager.addConfigurationFromFile(configManager.expand(it.second.c_str())); } + } + // Explicit --define tokens override all earlier + for (const auto& it : config.tokens) { configManager.addOrReplaceConfigurationToken(it.first.c_str(), it.second.c_str()); } + + // Load all the plugins. Note that most are not needed by tracker, but will avoid some confusion + // when somebody adds a plugin + m_KernelCtx->getPluginManager().addPluginsFromFiles(configManager.expand("${Kernel_Plugins}")); + + return true; + } + + OpenViBE::Kernel::IKernelContext* m_KernelCtx; + OpenViBE::Kernel::IKernelDesc* m_KernelDesc; + OpenViBE::CKernelLoader m_KernelLoader; +}; + +int main(const int argc, char* argv[]) +{ + configuration_t config; + const bool argParseResult = parse_arguments(argc, argv, config); + if (!argParseResult) + { + if (config.help) + { + user_info(argv, nullptr); + return 0; + } + } + + KernelWrapper kernelWrapper; + + if (!kernelWrapper.initialize(config)) { return 1; } + + OpenViBE::Tracker::CTracker app(*kernelWrapper.m_KernelCtx); + + OpenViBE::Tracker::GUI gui(argc, argv, app); + + // We initialize the app after launching the GUI so we get the log into the GUI as early as possible + app.initialize(); + + const bool retVal = gui.run(); + + return (retVal == true ? 0 : 1); +} diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/workspaces/workspace-example-erp.ovw b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/workspaces/workspace-example-erp.ovw new file mode 100755 index 0000000..b6faafa --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/workspaces/workspace-example-erp.ovw @@ -0,0 +1,20 @@ +# Workspace configuration file generated by OpenViBE Tracker +# + +Tracker_Workspace_CatenatePlayback = false +Tracker_Workspace_GUI_MaxRendererCount = 32 +Tracker_Workspace_GUI_Renderer_Track_001_Stream_01_Scale = 0.0381452 +Tracker_Workspace_InplaceMode = false +Tracker_Workspace_MemorySaveMode = false +Tracker_Workspace_Path = ${Path_UserData}/workspace-cache-example-erp +Tracker_Workspace_Processor = ${Path_Data}/applications/tracker/processor-example-erp.xml +Tracker_Workspace_ProcessorArguments = +Tracker_Workspace_Processor_Arguments = +Tracker_Workspace_Processor_DoReceive = false +Tracker_Workspace_Processor_DoSend = true +Tracker_Workspace_Processor_FirstPort = 50011 +Tracker_Workspace_Processor_NoGUI = false +Tracker_Workspace_Revision = 1 +Tracker_Workspace_Track_001 = ${Path_Data}/scenarios/signals/simulated-2classes.ov +Tracker_Workspace_Track_001_Selected = 1 2 +Tracker_Workspace_Track_Count = 1 diff --git a/Masterarbeit/openvibe/extras-master/applications/platform/tracker/workspaces/workspace-example-motor-imagery.ovw b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/workspaces/workspace-example-motor-imagery.ovw new file mode 100755 index 0000000..6febb1b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/applications/platform/tracker/workspaces/workspace-example-motor-imagery.ovw @@ -0,0 +1,21 @@ +# Workspace configuration file generated by OpenViBE Tracker +# + +Tracker_Workspace_CatenatePlayback = false +Tracker_Workspace_MemorySaveMode = false +Tracker_Workspace_InplaceMode = false + +Tracker_Workspace_Path = ${Path_UserData}/workspace-cache-example-motor-imagery +Tracker_Workspace_Track_Count = 1 +Tracker_Workspace_Track_001 = ${Path_Data}/scenarios/signals/bci-motor-imagery.ov +Tracker_Workspace_Track_001_Selected = 2 3 + +Tracker_Workspace_GUI_Renderer_Track_001_Stream_03_Scale = 1 +Tracker_Workspace_GUI_Renderer_Track_001_Stream_02_Scale = 0.0221687 + +Tracker_Workspace_Processor = ${Path_Data}/applications/tracker/processor-example-bidir.xml +Tracker_Workspace_Processor_Arguments = +Tracker_Workspace_Processor_DoReceive = true +Tracker_Workspace_Processor_DoSend = true +Tracker_Workspace_Processor_FirstPort = 50011 +Tracker_Workspace_Processor_NoGUI = true diff --git a/Masterarbeit/openvibe/extras-master/build-tool/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/build-tool/CMakeLists.txt new file mode 100644 index 0000000..f4f62fd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/build-tool/CMakeLists.txt @@ -0,0 +1,3 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("BUILD_TOOL") diff --git a/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/CMakeLists.txt new file mode 100644 index 0000000..beecb43 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/CMakeLists.txt @@ -0,0 +1,23 @@ +PROJECT(openvibe-stimulation-generator) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_EXECUTABLE(openvibe-stimulation-generator ${SRC_FILES}) + +# --------------------------------- +IF(WIN32) + ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE) + ADD_DEFINITIONS(-DTARGET_OS_Windows) + ADD_DEFINITIONS(-DTARGET_ARCHITECTURE_i386) + ADD_DEFINITIONS(-DTARGET_COMPILER_VisualStudio) +ENDIF(WIN32) +IF(UNIX) + # ADD_DEFINITIONS(-fvisibility=hidden) # This flag should be present... man gcc + ADD_DEFINITIONS(-g) + ADD_DEFINITIONS(-fnon-call-exceptions) + ADD_DEFINITIONS(-DTARGET_OS_Linux) + ADD_DEFINITIONS(-DTARGET_ARCHITECTURE_i386) + ADD_DEFINITIONS(-DTARGET_COMPILER_GCC) +ENDIF(UNIX) diff --git a/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/src/ovbt_sg_cpp_code_generator.cpp b/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/src/ovbt_sg_cpp_code_generator.cpp new file mode 100644 index 0000000..b151fb3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/src/ovbt_sg_cpp_code_generator.cpp @@ -0,0 +1,34 @@ +#include "ovbt_sg_defines.h" + +#include + +bool CCppCodeGenerator::openFile(const char* filename) +{ + m_file.open(filename, std::ios::out | std::ios::trunc); + if (!m_file.is_open()) { return false; } + m_file << "#include \"toolkit/ovtk_all.h\"" << std::endl << std::endl; + + m_file << "using namespace OpenViBE;" << std::endl; + m_file << "using namespace /*OpenViBE::*/Kernel;" << std::endl; + m_file << "using namespace /*OpenViBE::*/Toolkit;" << std::endl << std::endl << std::endl; + + m_file << "bool Toolkit::InitializeStimulationList(const Kernel::IKernelContext& ctx)" << std::endl; + m_file << "{" << std::endl; + m_file << "\tITypeManager& typeManager=ctx.getTypeManager();" << std::endl << std::endl; + return true; +} + + +bool CCppCodeGenerator::appendStimulation(SStimulation& stim) +{ + m_file << "\ttypeManager.registerEnumerationEntry(OV_TypeId_Stimulation, \"" << stim.name << "\", " << stim.id << ");" << std::endl; + return true; +} + + +bool CCppCodeGenerator::closeFile() +{ + m_file << std::endl << "\treturn true;" << std::endl << "}" << std::endl; + m_file.close(); + return true; +} diff --git a/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/src/ovbt_sg_cpp_define_generator.cpp b/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/src/ovbt_sg_cpp_define_generator.cpp new file mode 100644 index 0000000..addd92f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/src/ovbt_sg_cpp_define_generator.cpp @@ -0,0 +1,26 @@ +#include "ovbt_sg_defines.h" + +#include + +bool CCppDefineGenerator::openFile(const char* filename) +{ + m_file.open(filename, std::ios::out | std::ios::trunc); + if (!m_file.is_open()) { return false; } + m_file << "#pragma once" << std::endl << std::endl; + return true; +} + + +bool CCppDefineGenerator::appendStimulation(SStimulation& stim) +{ + m_file << "#define " << stim.id << " " << stim.hexa << std::endl; + return true; +} + + +bool CCppDefineGenerator::closeFile() +{ + m_file << std::endl; + m_file.close(); + return true; +} diff --git a/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/src/ovbt_sg_defines.h b/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/src/ovbt_sg_defines.h new file mode 100644 index 0000000..911fa80 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/src/ovbt_sg_defines.h @@ -0,0 +1,47 @@ +#pragma once + +#include +#include + +struct SStimulation +{ + std::string name; + std::string id; + std::string hexa; +}; + +class CFileGeneratorBase +{ +public: + virtual ~CFileGeneratorBase() = default; + virtual bool openFile(const char* filename) = 0; + virtual bool appendStimulation(SStimulation& stim) = 0; + virtual bool closeFile() = 0; +protected: + std::ofstream m_file; +}; + + +class CCppDefineGenerator final : public CFileGeneratorBase +{ +public: + bool openFile(const char* filename) override; + bool appendStimulation(SStimulation& stim) override; + bool closeFile() override; +}; + +class CCppCodeGenerator final : public CFileGeneratorBase +{ +public: + bool openFile(const char* filename) override; + bool appendStimulation(SStimulation& stim) override; + bool closeFile() override; +}; + +class CMatlabGenerator final : public CFileGeneratorBase +{ +public: + bool openFile(const char* filename) override; + bool appendStimulation(SStimulation& stim) override; + bool closeFile() override; +}; diff --git a/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/src/ovbt_sg_main.cpp b/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/src/ovbt_sg_main.cpp new file mode 100644 index 0000000..3b89ef0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/src/ovbt_sg_main.cpp @@ -0,0 +1,89 @@ +#include +#include +#include +#include + +#include "ovbt_sg_defines.h" + +enum class EGenerationTypes { CPP, MATLAB, PYTHON, LUA, UNKNOWN }; + +EGenerationTypes parse_argument(std::string option) +{ + if (option == "--cpp") { return EGenerationTypes::CPP; } + if (option == "--matlab") { return EGenerationTypes::MATLAB; } + if (option == "--python") { return EGenerationTypes::PYTHON; } + if (option == "--lua") { return EGenerationTypes::LUA; } + return EGenerationTypes::UNKNOWN; +} + +int generate_generator_list(std::vector& list, EGenerationTypes type, int argc, char** argv) +{ + switch (type) + { + case EGenerationTypes::CPP: + { + if (argc < 4) { return -1; } + CFileGeneratorBase* gen = new CCppDefineGenerator(); + if (!gen->openFile(argv[3])) + { + std::cerr << "Unable to open " << argv[3] << std::endl; + return -1; + } + list.push_back(gen); + + gen = new CCppCodeGenerator(); + if (!gen->openFile(argv[4])) + { + std::cerr << "Unable to open " << argv[4] << std::endl; + return -1; + } + list.push_back(gen); + return 0; + } + + case EGenerationTypes::MATLAB: + { + CFileGeneratorBase* gen = new CMatlabGenerator(); + if (!gen->openFile(argv[3])) + { + std::cerr << "Unable to open " << argv[3] << std::endl; + return -1; + } + list.push_back(gen); + return 0; + } + case EGenerationTypes::PYTHON: + case EGenerationTypes::LUA: + case EGenerationTypes::UNKNOWN: + default: + { + std::cerr << "Unhandle type. Fatal error" << std::endl; + return -1; + } + } +} + +int main(int argc, char** argv) +{ + if (argc < 3) { return -1; } + EGenerationTypes type = parse_argument(argv[1]); + + std::vector stimulations; + std::vector generators; + + std::ifstream file(argv[2]); + std::string name, id, hexa; + while (file >> name >> id >> hexa) + { + SStimulation tmp = { name, id, hexa }; + stimulations.push_back(tmp); + } + + if (generate_generator_list(generators, type, argc, argv)) { return -1; } + + //Now we generate all files that needs to be done + for (auto& s : stimulations) { for (auto g : generators) { g->appendStimulation(s); } } + for (auto g : generators) { g->closeFile(); } + + return 0; +} diff --git a/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/src/ovbt_sg_matlab_generator.cpp b/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/src/ovbt_sg_matlab_generator.cpp new file mode 100644 index 0000000..e63a9ff --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/build-tool/stimulation-generator/src/ovbt_sg_matlab_generator.cpp @@ -0,0 +1,39 @@ +#include "ovbt_sg_defines.h" + +#include + +std::string getBrutHexaCode(const std::string formatedHexaCode) +{ + std::string res = formatedHexaCode; + res.erase(res.begin(), res.begin() + 2); + return res; +} + +bool CMatlabGenerator::openFile(const char* filename) +{ + m_file.open(filename, std::ios::out | std::ios::trunc); + if (!m_file.is_open()) { return false; } + m_file << "function OV_stimulations()" << std::endl << std::endl; + + m_file << "global OVTK_StimulationId_LabelStart;" << std::endl; + m_file << "OVTK_StimulationId_LabelStart = uint64(hex2dec('00008100'));" << std::endl << std::endl; + m_file << "global OVTK_StimulationId_LabelEnd;" << std::endl; + m_file << "OVTK_StimulationId_LabelEnd = uint64(hex2dec('000081ff'));" << std::endl << std::endl; + + return true; +} + +bool CMatlabGenerator::appendStimulation(SStimulation& stim) +{ + m_file << "\tglobal " << stim.id << ";" << std::endl; + m_file << "\t" << stim.id << " = uint64(hex2dec('" << getBrutHexaCode(stim.hexa) << "'));" << std::endl << std::endl; + return true; +} + + +bool CMatlabGenerator::closeFile() +{ + m_file << "end" << std::endl; + m_file.close(); + return true; +} diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindLibMensiaAdvancedVisualisation.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindLibMensiaAdvancedVisualisation.cmake new file mode 100644 index 0000000..61a0e0d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindLibMensiaAdvancedVisualisation.cmake @@ -0,0 +1,65 @@ +# --------------------------------- +# Finds mensia's advanced visualization toolkit +# Adds library to target +# Adds include path +# --------------------------------- +option(LINK_LIBADVVIZ "By default, link libadvviz, otherwise only use the includes" ON) +option(DYNAMIC_LINK_LIBADVVIZ "Dynamically link libadvviz" OFF) + +if(NOT CMAKE_BUILD_TYPE AND CMAKE_GENERATOR MATCHES "Visual Studio*") + set(MULTI_BUILD TRUE) +elseif(CMAKE_BUILD_TYPE AND OV_PACKAGE) + set(SOLO_PACKAGE TRUE) +elseif(CMAKE_BUILD_TYPE) + set(SOLO_BUILD TRUE) +else() + message(FATAL_ERROR "Build should specify a type or use a multi-type generator (like Visual Studio)") +endif() + +if(DYNAMIC_LINK_LIBADVVIZ) + message(STATUS "Dynamic linking libadvviz") + set(LIBADVVIZ_LINKING "") + add_definitions(-DADVVIZ_Shared) + if(WIN32) + set(LIB_EXT lib) + elseif(APPLE) + set(LIB_PREFIX "lib") + set(LIB_EXT "dylib") + elseif(UNIX) + set(LIB_PREFIX "lib") + set(LIB_EXT "so") + endif() +else() + message(STATUS "Static linking libadvviz") + set(LIBADVVIZ_LINKING "-static") + add_definitions(-DADVVIZ_Static) + if(WIN32) + set(LIB_EXT lib) + elseif(UNIX) + set(LIB_PREFIX "lib") + set(LIB_EXT "a") + endif() +endif() + +# set(PATH_LIBADVVIZ "PATH_LIBADVVIZ-NOTFOUND") +if(MULTI_BUILD) + # set(DESIGNER_SDK_PATH ${DESIGNER_SDK_PATH}/$>) + set(PATH_LIBADVVIZ ${DESIGNER_SDK_PATH}/include) +else() + find_path(PATH_LIBADVVIZ mensia/ PATHS ${DESIGNER_SDK_PATH}/include/ NO_DEFAULT_PATH) +endif() + +if(PATH_LIBADVVIZ) + message(STATUS " Found libadvviz... ${PATH_LIBADVVIZ}") + include_directories(${PATH_LIBADVVIZ}/) + + if(LINK_LIBADVVIZ) + # find_library(PATH libadvviz${LIBADVVIZ_LINKING} PATHS ${DESIGNER_SDK_PATH}/lib NO_DEFAULT_PATH) +# set(VISUALIZATION_TOOLKIT_LIBRARY ${DESIGNER_SDK_PATH}/lib/${LIB_PREFIX}libadvviz${LIBADVVIZ_LINKING}.${LIB_EXT}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PATH_LIBADVVIZ}/../lib/${LIB_PREFIX}mensia-advanced-visualization${LIBADVVIZ_LINKING}.${LIB_EXT}) + endif() + + add_definitions(-DTARGET_HAS_LibAdvancedVisualization) +else() + message(WARNING " FAILED to find libadvviz... [${PATH_LIBADVVIZ}]") +endif() diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindModuleGeometry.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindModuleGeometry.cmake new file mode 100644 index 0000000..c4b454d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindModuleGeometry.cmake @@ -0,0 +1,22 @@ +# --------------------------------- +# Finds module Geometry +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_OpenViBEModuleGeometry) + +set(SRC_DIR ${OV_BASE_DIR}/modules/geometry/include) + +FIND_PATH(PATH_OPENVIBE_MODULES_GEOMETRY geometry PATHS ${SRC_DIR} NO_DEFAULT_PATH) +IF(PATH_OPENVIBE_MODULES_GEOMETRY) + OV_PRINT(OV_PRINTED " Found OpenViBE module Geometry... ${PATH_OPENVIBE_MODULES_GEOMETRY}") + INCLUDE_DIRECTORIES(${PATH_OPENVIBE_MODULES_GEOMETRY}/) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} openvibe-module-geometry) + ADD_DEFINITIONS(-DTARGET_HAS_Geometry) +ELSE(PATH_OPENVIBE_MODULES_GEOMETRY) + OV_PRINT(OV_PRINTED " FAILED to find OpenViBE module Geometry...") +ENDIF(PATH_OPENVIBE_MODULES_GEOMETRY) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_OpenViBEModuleGeometry "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindOVDesigner.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOVDesigner.cmake new file mode 100755 index 0000000..8c6c70e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOVDesigner.cmake @@ -0,0 +1,125 @@ +# --------------------------------- +# Finds OpenViBE Designer binary distribution +# --------------------------------- + + +if(NOT CMAKE_BUILD_TYPE AND CMAKE_GENERATOR MATCHES "Visual Studio*") + set(MULTI_BUILD TRUE) +elseif(CMAKE_BUILD_TYPE AND OV_PACKAGE) + set(SOLO_PACKAGE TRUE) +elseif(CMAKE_BUILD_TYPE) + set(SOLO_BUILD TRUE) +else() + message(FATAL_ERROR "Build should specify a type or use a multi-type generator (like Visual Studio)") +endif() + +if(NOT DEFINED TRIED_FIND_OVDESIGNER) + if(MULTI_BUILD) + set(SEEK_PATHS ${DESIGNER_SDK_PATH};${LIST_DEPENDENCIES_PATH}) + unset(DESIGNER_SDK_PATH CACHE) + foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} ) + # set(OPENVIBE_SDK_PATH ${OPENVIBE_SDK_PATH}/$>) + string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU ) + unset(DESIGNER_SDK_PATH_TMP CACHE) + find_path(DESIGNER_SDK_PATH_TMP include/visualization-toolkit/ovviz_all.h PATHS ${SEEK_PATHS} PATH_SUFFIXES openvibe-designer-${OUTPUTCONFIG} ${OUTPUTCONFIG} NO_DEFAULT_PATH) + set(DESIGNER_SDK_PATH_${OUTPUTCONFIGU} ${DESIGNER_SDK_PATH_TMP}) + if(DESIGNER_SDK_PATH_TMP) + message(STATUS "Found ${OUTPUTCONFIG} of designer at ${DESIGNER_SDK_PATH_TMP}") + string(CONCAT DESIGNER_SDK_PATH ${DESIGNER_SDK_PATH} $<$:${DESIGNER_SDK_PATH_TMP}>) + set(AT_LEAST_ONE_DESIGNER_BUILD TRUE) + endif() + endforeach() + if(NOT DEFINED AT_LEAST_ONE_DESIGNER_BUILD) + message(FATAL_ERROR "Did not find any valid build of OpenViBE Designer") + endif() + else() # Regular build + # find_path(DESIGNER_SDK_PATH bin PATHS ${DESIGNER_SDK_PATH} PATH_SUFFIXES designer NO_DEFAULT_PATH) + find_path(DESIGNER_SDK_PATH include/visualization-toolkit/ovviz_all.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES openvibe-designer-${CMAKE_BUILD_TYPE_LOWER} NO_DEFAULT_PATH) + if(NOT DESIGNER_SDK_PATH) + MESSAGE(ERROR "Could not find DESIGNER_SDK_PATH (value : ${OPENVIBE_SDK_PATH}). Please either specify it or put OpenViBE designer binaries into dependencies/openvibe-designer-{debug/release} folder") + endif() + string(REGEX REPLACE "\\\\+" "/" DESIGNER_SDK_PATH ${DESIGNER_SDK_PATH}) + message(" Found Designer... [${DESIGNER_SDK_PATH}]") + endif() + set(TRIED_FIND_OVDESIGNER TRUE) +endif() + +if(INSTALL_DESIGNER) + if(MULTI_BUILD) # Replace with generator expression in CMake 3.5+ + foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU) + file(GLOB EXE_SCRIPT_LIST "${DESIGNER_SDK_PATH_${OUTPUTCONFIGU}}/*.cmd" "${DESIGNER_SDK_PATH_${OUTPUTCONFIGU}}/*.sh") + if(EXE_SCRIPT_LIST) + foreach(SCRIPT IN LISTS EXE_SCRIPT_LIST) + get_filename_component(base_name ${SCRIPT} NAME_WE) + if(WIN32) + set(exe_name "${base_name}.exe") + else() + set(exe_name ${base_name}) + endif() + if(WIN32) + SET(SCRIPT_POSTFIX ".cmd") + elseif(APPLE) + set(SCRIPT_POSTFIX "-macos.sh") + elseif(UNIX) + # Debian recommends that extensions such as .sh are not used; On Linux, scripts with such extensions shouldn't be packaged + set(SCRIPT_POSTFIX ".sh") + endif() + set(OV_CMD_EXECUTABLE ${exe_name}) + # IF(WIN32) + # SET(OV_CMD_EXECUTABLE "%OV_PATH_ROOT%/bin/${exe_name}") + # ENDIF() + set(SCRIPT_NAME ${base_name}${SCRIPT_POSTFIX}) + set(OV_CMD_ARGS "") + set(OV_PAUSE "") + + configure_file(${OV_LAUNCHER_SOURCE_PATH}/openvibe-launcher${SCRIPT_POSTFIX}-base ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} @ONLY) + install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} DESTINATION ${DIST_ROOT}) + endforeach() + endif() + install(DIRECTORY ${DESIGNER_SDK_PATH_${OUTPUTCONFIGU}}/include/ DESTINATION ${DIST_INCLUDEDIR} CONFIGURATIONS ${OUTPUTCONFIG}) + install(DIRECTORY ${DESIGNER_SDK_PATH_${OUTPUTCONFIGU}}/bin/ DESTINATION ${DIST_BINDIR} CONFIGURATIONS ${OUTPUTCONFIG} USE_SOURCE_PERMISSIONS) # FILES_MATCHING PATTERN "openvibe-plugins*dll") or *so* + install(DIRECTORY ${DESIGNER_SDK_PATH_${OUTPUTCONFIGU}}/lib/ DESTINATION ${DIST_LIBDIR} CONFIGURATIONS ${OUTPUTCONFIG}) # FILES_MATCHING PATTERN "openvibe-plugins*dll") + install(DIRECTORY ${DESIGNER_SDK_PATH_${OUTPUTCONFIGU}}/etc/ DESTINATION ${DIST_SYSCONFDIR} CONFIGURATIONS ${OUTPUTCONFIG} OPTIONAL) + install(DIRECTORY ${DESIGNER_SDK_PATH_${OUTPUTCONFIGU}}/share/ DESTINATION ${DIST_DATADIR} CONFIGURATIONS ${OUTPUTCONFIG}) + if(DESIGNER_SDK_PATH_${OUTPUTCONFIGU}) + file(COPY "${DESIGNER_SDK_PATH_${OUTPUTCONFIGU}}/share/openvibe/applications/designer/designer.conf" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") + file(RENAME ${CMAKE_CURRENT_BINARY_DIR}/designer.conf ${CMAKE_CURRENT_BINARY_DIR}/designer.conf_${OUTPUTCONFIG}) + file(READ ${CMAKE_CURRENT_BINARY_DIR}/designer.conf_${OUTPUTCONFIG} FILE_CONTENT) + set(MATCH_EXPR "(ProjectVersion_Components *= *.\{[^\}]+)(.\}\n)") + string(REGEX REPLACE ${MATCH_EXPR} "\\1, \"openvibe-extras\":\"${OV_GLOBAL_VERSION_STRING}\"\\2" FILE_CONTENT ${FILE_CONTENT}) + set(MATCH_EXPR "(Designer_WebBrowserHelpURLBase *= *\\$\{[^\}]+\}/documentation)/[\\.0-9a-zA-Z]+\n") + string(REGEX REPLACE ${MATCH_EXPR} "\\1/${OV_GLOBAL_VERSION_STRING}\n" FILE_CONTENT ${FILE_CONTENT}) + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/designer.conf_${OUTPUTCONFIG} ${FILE_CONTENT}) + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/designer.conf_${OUTPUTCONFIG} "Application_Name = OpenViBE Designer\nApplication_Version = ${OV_GLOBAL_VERSION_STRING}\nAcquisitionServer_HostName = localhost\n") + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/designer.conf_${OUTPUTCONFIG}" DESTINATION "${DIST_DATADIR}/openvibe/applications/designer" RENAME designer.conf CONFIGURATIONS ${OUTPUTCONFIG}) + endif() + endforeach() + else() + file(GLOB EXE_SCRIPT_LIST "${DESIGNER_SDK_PATH}/*.cmd" "${DESIGNER_SDK_PATH}/*.sh") + foreach(SCRIPT IN LISTS EXE_SCRIPT_LIST) + get_filename_component(base_name ${SCRIPT} NAME_WE) + if(WIN32) + set(exe_name "${base_name}.exe") + else() + set(exe_name ${base_name}) + endif() + OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX ${base_name} EXECUTABLE_NAME ${exe_name} NOPROJECT) + endforeach() + install(DIRECTORY ${DESIGNER_SDK_PATH}/include/ DESTINATION ${DIST_INCLUDEDIR}) + install(DIRECTORY ${DESIGNER_SDK_PATH}/bin/ DESTINATION ${DIST_BINDIR} USE_SOURCE_PERMISSIONS) # FILES_MATCHING PATTERN "openvibe-plugins*dll") or *so* + install(DIRECTORY ${DESIGNER_SDK_PATH}/lib/ DESTINATION ${DIST_LIBDIR}) # FILES_MATCHING PATTERN "openvibe-plugins*dll") + install(DIRECTORY ${DESIGNER_SDK_PATH}/etc/ DESTINATION ${DIST_SYSCONFDIR} OPTIONAL) + install(DIRECTORY ${DESIGNER_SDK_PATH}/share/ DESTINATION ${DIST_DATADIR}) + file(COPY "${DESIGNER_SDK_PATH}/share/openvibe/applications/designer/designer.conf" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") + file(READ ${CMAKE_CURRENT_BINARY_DIR}/designer.conf FILE_CONTENT) + set(MATCH_EXPR "(ProjectVersion_Components *= *.\{[^\}]+)(.\}\n)") + string(REGEX REPLACE ${MATCH_EXPR} "\\1, \"openvibe-extras\":\"${OV_GLOBAL_VERSION_STRING}\"\\2" FILE_CONTENT ${FILE_CONTENT}) + set(MATCH_EXPR "(Designer_WebBrowserHelpURLBase *= *\\$\{[^\}]+\}/documentation)/[\\.0-9a-zA-Z]+\n") + string(REGEX REPLACE ${MATCH_EXPR} "\\1/${OV_GLOBAL_VERSION_STRING}\n" FILE_CONTENT ${FILE_CONTENT}) + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/designer.conf ${FILE_CONTENT}) + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/designer.conf "Application_Name = OpenViBE Designer\nApplication_Version = ${OV_GLOBAL_VERSION_STRING}\nAcquisitionServer_HostName = localhost\n") + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/designer.conf DESTINATION "${DIST_DATADIR}/openvibe/applications/designer") + endif() +endif() + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindOVSDK.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOVSDK.cmake new file mode 100755 index 0000000..3c3009f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOVSDK.cmake @@ -0,0 +1,112 @@ +# --------------------------------- +# Finds OpenViBE SDK binary distribution +# --------------------------------- + + +if(NOT CMAKE_BUILD_TYPE AND CMAKE_GENERATOR MATCHES "Visual Studio*") + set(MULTI_BUILD TRUE) +elseif(CMAKE_BUILD_TYPE AND OV_PACKAGE) + set(SOLO_PACKAGE TRUE) +elseif(CMAKE_BUILD_TYPE) + set(SOLO_BUILD TRUE) +else() + message(FATAL_ERROR "Build should specify a type or use a multi-type generator (like Visual Studio)") +endif() + +if(NOT DEFINED TRIED_FIND_OVSDK) + if(MULTI_BUILD) + set(SEEK_PATHS ${OPENVIBE_SDK_PATH};${LIST_DEPENDENCIES_PATH}) + unset(OPENVIBE_SDK_PATH CACHE) + foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} ) + # set(OPENVIBE_SDK_PATH ${OPENVIBE_SDK_PATH}/$>) + string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU ) + unset(OPENVIBE_SDK_PATH_TMP CACHE) + find_path(OPENVIBE_SDK_PATH_TMP include/openvibe/ov_all.h PATHS ${SEEK_PATHS} PATH_SUFFIXES openvibe-sdk-${OUTPUTCONFIG} ${OUTPUTCONFIG} NO_DEFAULT_PATH) + set(OPENVIBE_SDK_PATH_${OUTPUTCONFIGU} ${OPENVIBE_SDK_PATH_TMP}) + if(OPENVIBE_SDK_PATH_TMP) + message(STATUS "Found ${OUTPUTCONFIG} of sdk at ${OPENVIBE_SDK_PATH_TMP}") + string(CONCAT OPENVIBE_SDK_PATH ${OPENVIBE_SDK_PATH} $<$:${OPENVIBE_SDK_PATH_TMP}>) + set(AT_LEAST_ONE_OV_BUILD TRUE) + endif() + endforeach() + if(NOT DEFINED AT_LEAST_ONE_OV_BUILD) + message(FATAL_ERROR "Did not find any valid build of OpenViBE SDK") + endif() + else() # Regular build + string(TOLOWER CMAKE_BUILD_TYPE OV_SDK_BUILD_TYPE) + find_path(${OPENVIBE_SDK_PATH} include/openvibe/ov_all.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES openvibe-sdk-${OV_SDK_BUILD_TYPE} NO_DEFAULT_PATH) + if(${OPENVIBE_SDK_PATH} STREQUAL "OPENVIBE_SDK_PATH-NOTFOUND") + message(FATAL_ERROR " FAILED to find OpenViBE SDK [${OPENVIBE_SDK_PATH}]") + endif() + string(REGEX REPLACE "\\\\+" "/" OPENVIBE_SDK_PATH ${OPENVIBE_SDK_PATH}) + message(STATUS " Found OpenViBE SDK... [${OPENVIBE_SDK_PATH}]") + endif() + set(TRIED_FIND_OVSDK TRUE) +endif() + +if(INSTALL_SDK) + if(MULTI_BUILD) # Replace with generator expression in CMake 3.5+ + foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU) + file(GLOB EXE_SCRIPT_LIST "${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/*.cmd" "${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/*.sh") + if(EXE_SCRIPT_LIST) + foreach(SCRIPT IN LISTS EXE_SCRIPT_LIST) + get_filename_component(base_name ${SCRIPT} NAME_WE) + if(WIN32) + set(exe_name "${base_name}.exe") + else() + set(exe_name ${base_name}) + endif() + IF(WIN32) + SET(SCRIPT_POSTFIX ".cmd") + ELSEIF(APPLE) + SET(SCRIPT_POSTFIX "-macos.sh") + ELSEIF(UNIX) + # Debian recommends that extensions such as .sh are not used; On Linux, scripts with such extensions shouldn't be packaged + SET(SCRIPT_POSTFIX ".sh") + ENDIF() + SET(OV_CMD_EXECUTABLE ${exe_name}) + # IF(WIN32) + # SET(OV_CMD_EXECUTABLE "%OV_PATH_ROOT%/bin/${exe_name}") + # ENDIF() + SET(SCRIPT_NAME ${base_name}${SCRIPT_POSTFIX}) + SET(OV_CMD_ARGS "") + SET(OV_PAUSE "") + + CONFIGURE_FILE(${OV_LAUNCHER_SOURCE_PATH}/openvibe-launcher${SCRIPT_POSTFIX}-base ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} @ONLY) + INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} DESTINATION ${DIST_ROOT}) + endforeach() + endif() + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/include/ DESTINATION ${DIST_INCLUDEDIR} CONFIGURATIONS ${OUTPUTCONFIG}) + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/bin/ DESTINATION ${DIST_BINDIR} CONFIGURATIONS ${OUTPUTCONFIG} USE_SOURCE_PERMISSIONS) # FILES_MATCHING PATTERN "openvibe-plugins*dll") or *so* + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/lib/ DESTINATION ${DIST_LIBDIR} CONFIGURATIONS ${OUTPUTCONFIG}) # FILES_MATCHING PATTERN "openvibe-plugins*dll") + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/etc/ DESTINATION ${DIST_SYSCONFDIR} CONFIGURATIONS ${OUTPUTCONFIG} OPTIONAL) + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/share/ DESTINATION ${DIST_DATADIR} CONFIGURATIONS ${OUTPUTCONFIG}) + if(OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}) + file(COPY "${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/share/openvibe/kernel/openvibe.conf" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") + file(RENAME ${CMAKE_CURRENT_BINARY_DIR}/openvibe.conf ${CMAKE_CURRENT_BINARY_DIR}/openvibe.conf_${OUTPUTCONFIG}) + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/openvibe.conf_${OUTPUTCONFIG} "Application_Name = Player\nApplication_Version = ${OV_GLOBAL_VERSION_STRING}\nAcquisitionServer_HostName = localhost\n") + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/openvibe.conf_${OUTPUTCONFIG} DESTINATION "${DIST_DATADIR}/openvibe/kernel" RENAME openvibe.conf CONFIGURATIONS ${OUTPUTCONFIG}) + endif() + endforeach() + else() + file(GLOB EXE_SCRIPT_LIST "${OPENVIBE_SDK_PATH}/*.cmd" "${OPENVIBE_SDK_PATH}/*.sh") + foreach(SCRIPT IN LISTS EXE_SCRIPT_LIST) + get_filename_component(base_name ${SCRIPT} NAME_WE) + if(WIN32) + set(exe_name "${base_name}.exe") + else() + set(exe_name ${base_name}) + endif() + OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX ${base_name} EXECUTABLE_NAME ${exe_name} NOPROJECT) + endforeach() + install(DIRECTORY ${OPENVIBE_SDK_PATH}/include/ DESTINATION ${DIST_INCLUDEDIR}) + install(DIRECTORY ${OPENVIBE_SDK_PATH}/bin/ DESTINATION ${DIST_BINDIR} USE_SOURCE_PERMISSIONS) # FILES_MATCHING PATTERN "openvibe-plugins*dll") or *so* + install(DIRECTORY ${OPENVIBE_SDK_PATH}/lib/ DESTINATION ${DIST_LIBDIR}) # FILES_MATCHING PATTERN "openvibe-plugins*dll") + install(DIRECTORY ${OPENVIBE_SDK_PATH}/etc/ DESTINATION ${DIST_SYSCONFDIR} OPTIONAL) + install(DIRECTORY ${OPENVIBE_SDK_PATH}/share/ DESTINATION ${DIST_DATADIR}) + file(COPY "${OPENVIBE_SDK_PATH}/share/openvibe/kernel/openvibe.conf" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/openvibe.conf "Application_Name = Player\nApplication_Version = ${OV_GLOBAL_VERSION_STRING}\nAcquisitionServer_HostName = localhost\n") + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/openvibe.conf DESTINATION "${DIST_DATADIR}/openvibe/kernel") + endif() +endif() diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBE.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBE.cmake new file mode 100644 index 0000000..c0a23d5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBE.cmake @@ -0,0 +1,12 @@ +# --------------------------------- +# Finds OpenViBE +# Adds library to target +# Adds include path +# --------------------------------- +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_OpenViBE) + +SET(INCLUDED_OV_SDK_COMPONENTS MAIN) +INCLUDE(AddOpenViBESDKComponents) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_OpenViBE "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBECommon.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBECommon.cmake new file mode 100644 index 0000000..fe16ea7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBECommon.cmake @@ -0,0 +1,13 @@ +# --------------------------------- +# Finds OpenViBE common include files +# Adds dependency to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_OpenViBECommon) + +SET(INCLUDED_OV_SDK_COMPONENTS COMMON) +INCLUDE(AddOpenViBESDKComponents) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_OpenViBECommon "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEContributions.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEContributions.cmake new file mode 100644 index 0000000..bc89d66 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEContributions.cmake @@ -0,0 +1,19 @@ +# --------------------------------- +# Finds OpenViBE contributions +# Only serves to set up a define for the preprocessor +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_OpenViBEContributions) + +FIND_PATH(PATH_OPENVIBE_CONTRIBUTIONS common/contribAcquisitionServer.cmake PATHS ${OV_BASE_DIR}/contrib NO_DEFAULT_PATH) +IF(PATH_OPENVIBE_CONTRIBUTIONS) + OV_PRINT(OV_PRINTED " Found openvibe-contributions...") + + ADD_DEFINITIONS(-DTARGET_HAS_OpenViBEContributions) +ELSE(PATH_OPENVIBE_CONTRIBUTIONS) + OV_PRINT(OV_PRINTED " FAILED to find openvibe-contributions...") +ENDIF(PATH_OPENVIBE_CONTRIBUTIONS) + + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_OpenViBEContributions "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleEBML.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleEBML.cmake new file mode 100644 index 0000000..d943e27 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleEBML.cmake @@ -0,0 +1,13 @@ +# --------------------------------- +# Finds module EBML +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_OpenViBEModuleEBML) + +SET(INCLUDED_OV_SDK_COMPONENTS EBML) +INCLUDE(AddOpenViBESDKComponents) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_OpenViBEModuleEBML "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleFS.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleFS.cmake new file mode 100644 index 0000000..bdcbcf8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleFS.cmake @@ -0,0 +1,13 @@ +# --------------------------------- +# Finds module FS +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_OpenViBEModuleFS) + +SET(INCLUDED_OV_SDK_COMPONENTS FS) +INCLUDE(AddOpenViBESDKComponents) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_OpenViBEModuleFS "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleMessaging.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleMessaging.cmake new file mode 100644 index 0000000..d863e69 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleMessaging.cmake @@ -0,0 +1,13 @@ +# --------------------------------- +# Finds module Messaging +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_OpenViBEModuleMessaging) + +SET(INCLUDED_OV_SDK_COMPONENTS COMMUNICATION) +INCLUDE(AddOpenViBESDKComponents) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_OpenViBEModuleMessaging "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleSocket.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleSocket.cmake new file mode 100644 index 0000000..0c0b6ec --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleSocket.cmake @@ -0,0 +1,13 @@ +# --------------------------------- +# Finds module Socket +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_OpenViBEModuleSocket) + +SET(INCLUDED_OV_SDK_COMPONENTS SOCKET) +INCLUDE(AddOpenViBESDKComponents) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_OpenViBEModuleSocket "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleSystem.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleSystem.cmake new file mode 100644 index 0000000..03f3fd9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleSystem.cmake @@ -0,0 +1,13 @@ +# --------------------------------- +# Finds module System +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_OpenViBEModuleSystem) + +SET(INCLUDED_OV_SDK_COMPONENTS SYSTEM) +INCLUDE(AddOpenViBESDKComponents) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_OpenViBEModuleSystem "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleTCPTagging.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleTCPTagging.cmake new file mode 100644 index 0000000..423ae58 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleTCPTagging.cmake @@ -0,0 +1,32 @@ +# --------------------------------- +# Finds module TCPTagging +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_OpenViBEModuleTCPTagging) + +OPTION(DYNAMIC_LINK_OPENVIBE_MODULE_TCPTAGGING "Dynamically link OpenViBE module TCPTagging" ON) + +IF(DYNAMIC_LINK_OPENVIBE_MODULE_TCPTAGGING) + SET(OPENVIBE_MODULE_TCPTAGGING_LINKING "") +ELSE(DYNAMIC_LINK_OPENVIBE_MODULE_TCPTAGGING) + SET(OPENVIBE_MODULE_TCPTAGGING_LINKING "-static") +ENDIF(DYNAMIC_LINK_OPENVIBE_MODULE_TCPTAGGING) + +set(SRC_DIR ${OV_BASE_DIR}/modules/tcptagging/include) + +FIND_PATH(PATH_OPENVIBE_MODULES_TCPTAGGING tcptagging/defines.h PATHS ${SRC_DIR} NO_DEFAULT_PATH) +IF(PATH_OPENVIBE_MODULES_TCPTAGGING) + OV_PRINT(OV_PRINTED " Found OpenViBE module TCPTagging... ${PATH_OPENVIBE_MODULES_TCPTAGGING}") + INCLUDE_DIRECTORIES(${PATH_OPENVIBE_MODULES_TCPTAGGING}/) + + TARGET_LINK_LIBRARIES(${PROJECT_NAME} openvibe-module-tcptagging${OPENVIBE_MODULE_TCPTAGGING_LINKING}) + + ADD_DEFINITIONS(-DTARGET_HAS_TCPTagging) +ELSE(PATH_OPENVIBE_MODULES_TCPTAGGING) + OV_PRINT(OV_PRINTED " FAILED to find OpenViBE module TCPTagging...") +ENDIF(PATH_OPENVIBE_MODULES_TCPTAGGING) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_OpenViBEModuleTCPTagging "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleXML.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleXML.cmake new file mode 100644 index 0000000..29d1580 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEModuleXML.cmake @@ -0,0 +1,13 @@ +# --------------------------------- +# Finds module XML +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_OpenViBEModuleXML) + +SET(INCLUDED_OV_SDK_COMPONENTS XML) +INCLUDE(AddOpenViBESDKComponents) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_OpenViBEModuleXML "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEToolkit.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEToolkit.cmake new file mode 100644 index 0000000..05b5294 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEToolkit.cmake @@ -0,0 +1,13 @@ +# --------------------------------- +# Finds openvibe-toolkit +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_OpenViBEToolkit) + +SET(INCLUDED_OV_SDK_COMPONENTS TOOLKIT) +INCLUDE(AddOpenViBESDKComponents) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_OpenViBEToolkit "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEVisualizationToolkit.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEVisualizationToolkit.cmake new file mode 100644 index 0000000..13cf662 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindOpenViBEVisualizationToolkit.cmake @@ -0,0 +1,63 @@ +# --------------------------------- +# Finds openvibe-toolkit +# Adds library to target +# Adds include path +# --------------------------------- +option(LINK_OPENVIBE_VISUALIZATION_TOOLKIT "By default, link openvibe-visualization-toolkit, otherwise only use the includes" ON) +option(DYNAMIC_LINK_OPENVIBE_VISUALIZATION_TOOLKIT "Dynamically link openvibe-visualization-toolkit" ON) + +if(NOT CMAKE_BUILD_TYPE AND CMAKE_GENERATOR MATCHES "Visual Studio*") + set(MULTI_BUILD TRUE) +elseif(CMAKE_BUILD_TYPE AND OV_PACKAGE) + set(SOLO_PACKAGE TRUE) +elseif(CMAKE_BUILD_TYPE) + set(SOLO_BUILD TRUE) +else() + message(FATAL_ERROR "Build should specify a type or use a multi-type generator (like Visual Studio)") +endif() + +if(DYNAMIC_LINK_OPENVIBE_VISUALIZATION_TOOLKIT) + set(OPENVIBE_VISUALIZATION_TOOLKIT_LINKING "") + add_definitions(-DOVVIZ_Shared) + if(WIN32) + set(LIB_EXT lib) + elseif(APPLE) + set(LIB_PREFIX "lib") + set(LIB_EXT "dylib") + elseif(UNIX) + set(LIB_PREFIX "lib") + set(LIB_EXT "so") + endif() +else() + set(OPENVIBE_VISUALIZATION_TOOLKIT_LINKING "-static") + add_definitions(-DOVVIZ_Static) + if(WIN32) + set(LIB_EXT lib) + elseif(UNIX) + set(LIB_PREFIX "lib") + set(LIB_EXT "a") + endif() +endif() + +# set(PATH_OPENVIBE_VISUALIZATION_TOOLKIT "PATH_OPENVIBE_VISUALIZATION_TOOLKIT-NOTFOUND") +if(MULTI_BUILD) + # set(DESIGNER_SDK_PATH ${DESIGNER_SDK_PATH}/$>) + set(PATH_OPENVIBE_VISUALIZATION_TOOLKIT ${DESIGNER_SDK_PATH}/include) +else() + find_path(PATH_OPENVIBE_VISUALIZATION_TOOLKIT visualization-toolkit/ovviz_all.h PATHS ${DESIGNER_SDK_PATH}/include/ NO_DEFAULT_PATH) +endif() + +if(PATH_OPENVIBE_VISUALIZATION_TOOLKIT) + message(STATUS " Found openvibe-visualization-toolkit... ${PATH_OPENVIBE_VISUALIZATION_TOOLKIT}") + include_directories(${PATH_OPENVIBE_VISUALIZATION_TOOLKIT}/) + + if(LINK_OPENVIBE_VISUALIZATION_TOOLKIT) + # find_library(VISUALIZATION_TOOLKIT_LIBRARY openvibe-visualization-toolkit${OPENVIBE_VISUALIZATION_TOOLKIT_LINKING} PATHS ${DESIGNER_SDK_PATH}/lib NO_DEFAULT_PATH) + set(VISUALIZATION_TOOLKIT_LIBRARY ${DESIGNER_SDK_PATH}/lib/${LIB_PREFIX}openvibe-visualization-toolkit${OPENVIBE_VISUALIZATION_TOOLKIT_LINKING}.${LIB_EXT}) + target_link_libraries(${PROJECT_NAME} ${VISUALIZATION_TOOLKIT_LIBRARY}) + endif() + + add_definitions(-DTARGET_HAS_OpenViBEVisualizationToolkit) +else() + message(WARNING " FAILED to find openvibe-visualization-toolkit... [${PATH_OPENVIBE_VISUALIZATION_TOOLKIT}]") +endif() diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyActiCHampAPI.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyActiCHampAPI.cmake new file mode 100644 index 0000000..4f8008f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyActiCHampAPI.cmake @@ -0,0 +1,57 @@ +# /* + # * FindThirdPartyActiCHampAPI.cmake + # * + # * Copyright (c) 2012, Mensia Technologies SA. All rights reserved. + # * -- Rights transferred to Inria, contract signed 21.11.2014 + # * + # */ + +# --------------------------------- +# Finds ActiCHamp library +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyActiCHampAPI) + +IF(WIN32) + FIND_PATH(PATH_ActiCHampAPI ActiChamp.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_brainproducts_actichamp) + IF(PATH_ActiCHampAPI) + OV_PRINT(OV_PRINTED " Found Brain Products actiCHamp API...") + INCLUDE_DIRECTORIES(${PATH_ActiCHampAPI}) + + IF("${PLATFORM_TARGET}" STREQUAL "x64") + SET(ACTICHAMP_LIBPREFIX "ActiChamp_x64") + ELSE() + SET(ACTICHAMP_LIBPREFIX "ActiChamp_x86") + ENDIF() + + FIND_LIBRARY(LIB_ActiCHampAPI ${ACTICHAMP_LIBPREFIX}.lib PATHS ${PATH_ActiCHampAPI} ) + IF(LIB_ActiCHampAPI) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_ActiCHampAPI}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_ActiCHampAPI} ) + ELSE() + OV_PRINT(OV_PRINTED " [FAILED] lib actiCHamp") + ENDIF() + + FIND_FILE(FIRMWARE_ActiCHampAPI ActiChamp.bit PATHS ${PATH_ActiCHampAPI} ) + IF(FIRMWARE_ActiCHampAPI) + OV_PRINT(OV_PRINTED " [ OK ] firmware ${FIRMWARE_ActiCHampAPI}") + ELSE() + OV_PRINT(OV_PRINTED " [FAILED] firmware actiCHamp") + ENDIF() + + # Copy the DLL file at install + INSTALL(PROGRAMS "${PATH_ActiCHampAPI}/${ACTICHAMP_LIBPREFIX}.dll" DESTINATION ${DIST_BINDIR}) + + # Copy the firmware file at install + INSTALL(PROGRAMS "${FIRMWARE_ActiCHampAPI}" DESTINATION ${DIST_BINDIR}) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyActiCHampAPI) + ELSE() + OV_PRINT(OV_PRINTED " FAILED to find Brain Products actiCHamp API (optional driver)") + ENDIF() +ENDIF() + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyActiCHampAPI "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBioSemiLabViewAPI.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBioSemiLabViewAPI.cmake new file mode 100644 index 0000000..058fa82 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBioSemiLabViewAPI.cmake @@ -0,0 +1,43 @@ +# --------------------------------- +# Finds BioSemi LabView API +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyBioSemiLabViewAPI) + +IF(WIN32) + # note: care must be taken here that lib of wrong bitness is not picked + IF("${PLATFORM_TARGET}" STREQUAL "x64") + SET(PATH_BioSemiAPI "C:/Program Files/BioSemi/Developers_kit/C-code") + ELSE() + SET(PATH_BioSemiAPI "C:/Program Files (x86)/BioSemi/Developers_kit/C-code") + ENDIF() + + FIND_FILE(LABVIEW_HEADER labview_dll.h + PATHS ${PATH_BioSemiAPI} + NO_SYSTEM_ENVIRONMENT_PATH + NO_DEFAULT_PATH) + + IF(LABVIEW_HEADER) + OV_PRINT(OV_PRINTED " Found BioSemi LabView API...") + INCLUDE_DIRECTORIES(${PATH_BioSemiAPI}) + FIND_LIBRARY(LIB_BioSemiAPI Labview_DLL PATHS ${PATH_BioSemiAPI} NO_SYSTEM_ENVIRONMENT_PATH NO_DEFAULT_PATH) + IF(LIB_BioSemiAPI) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_BioSemiAPI}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_BioSemiAPI} ) + ELSE(LIB_BioSemiAPI) + OV_PRINT(OV_PRINTED " [FAILED] lib Labview_DLL") + ENDIF(LIB_BioSemiAPI) + + # Copy the DLL file at install + INSTALL(PROGRAMS "${PATH_BioSemiAPI}/Labview_DLL.dll" DESTINATION ${DIST_BINDIR}) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyBioSemiAPI) + ELSE() + OV_PRINT(OV_PRINTED " FAILED to find BioSemi LabView API (optional driver)") + ENDIF() +ENDIF(WIN32) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyBioSemiLabViewAPI "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost.cmake new file mode 100644 index 0000000..5d0e938 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost.cmake @@ -0,0 +1,22 @@ +# --------------------------------- +# Finds third party boost +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyBoost) + +FIND_PATH(PATH_BOOST "include/boost/config/auto_link.hpp" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES boost NO_DEFAULT_PATH) +FIND_PATH(PATH_BOOST "include/boost/config/auto_link.hpp" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES boost) + +IF(PATH_BOOST) + OV_PRINT(OV_PRINTED " Found boost includes...") + INCLUDE_DIRECTORIES(${PATH_BOOST}/include) + + ADD_DEFINITIONS(-DTARGET_HAS_Boost) +ELSE(PATH_BOOST) + OV_PRINT(OV_PRINTED " FAILED to find boost includes...") +ENDIF(PATH_BOOST) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyBoost "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_Chrono.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_Chrono.cmake new file mode 100644 index 0000000..ec7683c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_Chrono.cmake @@ -0,0 +1,54 @@ +# --------------------------------- +# Finds third party boost chrono +# Adds a def that its present +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyBoost_Chrono) + +IF(WIN32) + FIND_PATH(PATH_BOOST_CHRONO "include/boost/chrono.hpp" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES boost NO_DEFAULT_PATH) + IF(PATH_BOOST_CHRONO) + OV_PRINT(OV_PRINTED " Found boost chrono includes...") + OV_LINK_BOOST_LIB("chrono" ${OV_WIN32_BOOST_VERSION} ) + IF(LIB_BOOST_PATH AND LIB_BOOST_DEBUG_PATH) + ADD_DEFINITIONS(-DTARGET_HAS_Boost_Chrono) + ENDIF(LIB_BOOST_PATH AND LIB_BOOST_DEBUG_PATH) + ENDIF(PATH_BOOST_CHRONO) +ENDIF(WIN32) + +IF(UNIX) + + FIND_PATH(PATH_BOOST_CHRONO "include/boost/chrono.hpp" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES boost NO_DEFAULT_PATH) + FIND_PATH(PATH_BOOST_CHRONO "include/boost/chrono.hpp" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES boost) + + IF(PATH_BOOST_CHRONO) + OV_PRINT(OV_PRINTED " Found boost chrono includes...") + + FIND_LIBRARY(LIB_Boost_Chrono NAMES "boost_chrono" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_Chrono NAMES "boost_chrono" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib) + IF(LIB_Boost_Chrono) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_Boost_Chrono}") + ADD_DEFINITIONS(-DTARGET_HAS_Boost_Chrono) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_Boost_Chrono}) + ELSE(LIB_Boost_Chrono) + OV_PRINT(OV_PRINTED " [FAILED] lib boost_chrono") + ENDIF(LIB_Boost_Chrono) + + # Fedora / Ubuntu + FIND_LIBRARY(LIB_STANDARD_MODULE_RT rt) + IF(LIB_STANDARD_MODULE_RT) + OV_PRINT(OV_PRINTED " Found rt...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_RT}) + ELSE(LIB_STANDARD_MODULE_RT) + OV_PRINT(OV_PRINTED " FAILED to find rt...") + ENDIF(LIB_STANDARD_MODULE_RT) + + ELSE(PATH_BOOST_CHRONO) + OV_PRINT(OV_PRINTED " FAILED to find boost chrono includes...") + ENDIF(PATH_BOOST_CHRONO) + +ENDIF(UNIX) + + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyBoost_Chrono "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_FileSystem.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_FileSystem.cmake new file mode 100644 index 0000000..5f44b1b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_FileSystem.cmake @@ -0,0 +1,43 @@ +# --------------------------------- +# Finds third party boost +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyBoost_FileSystem) + +IF(UNIX) + FIND_LIBRARY(LIB_Boost_Filesystem NAMES "boost_filesystem-mt" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_Filesystem NAMES "boost_filesystem-mt" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib) + + IF(LIB_Boost_Filesystem) + OV_PRINT(OV_PRINTED " Found boost FileSystem...") + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_Boost_Filesystem}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_Boost_Filesystem} ) + ELSE(LIB_Boost_Filesystem) + # Fedora 20 and Ubuntu 13.10,14.04 have no more multi-thread boost libs ( *-mt ) so try if there are non -mt libs to link + FIND_LIBRARY(LIB_Boost_Filesystem NAMES "boost_filesystem" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_Filesystem NAMES "boost_filesystem" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib) + IF(LIB_Boost_Filesystem) + OV_PRINT(OV_PRINTED " Found boost FileSystem...") + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_Boost_Filesystem}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_Boost_Filesystem}) + ELSE(LIB_Boost_Filesystem) + OV_PRINT(OV_PRINTED " FAILED to find boost FileSystem...") + OV_PRINT(OV_PRINTED " [FAILED] lib boost_filesystem-mt") + OV_PRINT(OV_PRINTED " [FAILED] lib boost_filesystem") + ENDIF(LIB_Boost_Filesystem) + ENDIF(LIB_Boost_Filesystem) + + # For Fedora + INCLUDE("FindThirdPartyPThread") + +ENDIF(UNIX) + +IF(WIN32) + OV_LINK_BOOST_LIB("filesystem" ${OV_WIN32_BOOST_VERSION} ) + OV_LINK_BOOST_LIB("system" ${OV_WIN32_BOOST_VERSION} ) # filesystem depends on system +ENDIF(WIN32) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyBoost_FileSystem "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_Math.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_Math.cmake new file mode 100644 index 0000000..c7225d3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_Math.cmake @@ -0,0 +1,31 @@ +# --------------------------------- +# Finds third party boost +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyBoost_Math) + +INCLUDE("FindThirdPartyBoost") + +IF(UNIX) + FIND_LIBRARY(LIB_Boost_Math NAMES "boost_math_c99" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH) + # OV_PRINT(OV_PRINTED " looking in ${LIST_DEPENDENCIES_PATH}") + IF(LIB_Boost_Math) + OV_PRINT(OV_PRINTED " Found boost math...") + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_Boost_Math}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_Boost_Math} ) + ELSE(LIB_Boost_Math) + OV_PRINT(OV_PRINTED " FAILED to find boost math...") + OV_PRINT(OV_PRINTED " [FAILED] lib libboost_math_c99") + ENDIF(LIB_Boost_Math) +ENDIF(UNIX) + +IF(WIN32) + IF(PATH_BOOST) + OV_LINK_BOOST_LIB("math_c99" ${OV_WIN32_BOOST_VERSION} ) + ENDIF(PATH_BOOST) +ENDIF(WIN32) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyBoost_Math "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_Regex.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_Regex.cmake new file mode 100644 index 0000000..727e672 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_Regex.cmake @@ -0,0 +1,37 @@ +# --------------------------------- +# Finds third party boost +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyBoost_Regex) + +IF(UNIX) + FIND_LIBRARY(LIB_Boost_Regex NAMES "boost_regex-mt" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_Regex NAMES "boost_regex-mt" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib) + + IF(LIB_Boost_Regex) + OV_PRINT(OV_PRINTED " Found Boost regex...") + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_Boost_Regex}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_Boost_Regex} ) + ELSE(LIB_Boost_Regex) + # Fedora 20 and Ubuntu 13.10,14.04 have no more multi-thread boost libs ( *-mt ) so try if there are non -mt libs to link + FIND_LIBRARY(LIB_Boost_Regex NAMES "boost_regex" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_Regex NAMES "boost_regex" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib) + IF(LIB_Boost_Regex) + OV_PRINT(OV_PRINTED " Found Boost regex...") + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_Boost_Regex}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_Boost_Regex}) + ELSE(LIB_Boost_Regex) + OV_PRINT(OV_PRINTED " [FAILED] lib boost_regex-mt") + OV_PRINT(OV_PRINTED " [FAILED] lib boost_regex") + ENDIF(LIB_Boost_Regex) + ENDIF(LIB_Boost_Regex) +ENDIF(UNIX) + +IF(WIN32) + OV_LINK_BOOST_LIB("regex" ${OV_WIN32_BOOST_VERSION}) +ENDIF(WIN32) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyBoost_Regex "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_System.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_System.cmake new file mode 100644 index 0000000..89d4c07 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_System.cmake @@ -0,0 +1,35 @@ +# --------------------------------- +# Finds third party boost +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyBoost_System) + +IF(UNIX) + FIND_LIBRARY(LIB_Boost_System NAMES "boost_system-mt" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_System NAMES "boost_system-mt" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib) + + IF(LIB_Boost_System) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_Boost_System}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_Boost_System} ) + ELSE(LIB_Boost_System) + # Fedora 20 and Ubuntu 13.10,14.04 have no more multi-thread boost libs ( *-mt ) so try if there are non -mt libs to link + FIND_LIBRARY(LIB_Boost_System NAMES "boost_system" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_System NAMES "boost_system" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib) + IF(LIB_Boost_System) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_Boost_System}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_Boost_System}) + ELSE(LIB_Boost_System) + OV_PRINT(OV_PRINTED " [FAILED] lib boost_system-mt") + OV_PRINT(OV_PRINTED " [FAILED] lib boost_system") + ENDIF(LIB_Boost_System) + ENDIF(LIB_Boost_System) +ENDIF(UNIX) + +IF(WIN32) + OV_LINK_BOOST_LIB("system" ${OV_WIN32_BOOST_VERSION}) +ENDIF(WIN32) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyBoost_System "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_Thread.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_Thread.cmake new file mode 100644 index 0000000..f98ea0b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBoost_Thread.cmake @@ -0,0 +1,52 @@ +# --------------------------------- +# Finds third party boost +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyBoost_Thread) + +IF(UNIX) + FIND_LIBRARY(LIB_Boost_Thread NAMES "boost_thread-mt" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_Thread NAMES "boost_thread-mt" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib) + + IF(LIB_Boost_Thread) + OV_PRINT(OV_PRINTED " Found boost thread...") + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_Boost_Thread}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_Boost_Thread} ) + ELSE(LIB_Boost_Thread) + # Fedora 20 and Ubuntu 13.10,14.04 have no more multi-thread boost libs ( *-mt ) so try if there are non -mt libs to link + FIND_LIBRARY(LIB_Boost_Thread NAMES "boost_thread" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_Thread NAMES "boost_thread" PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib) + IF(LIB_Boost_Thread) + OV_PRINT(OV_PRINTED " Found boost thread...") + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_Boost_Thread}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_Boost_Thread}) + ELSE(LIB_Boost_Thread) + OV_PRINT(OV_PRINTED " FAILED to find boost thread...") + OV_PRINT(OV_PRINTED " [FAILED] lib boost_thread-mt") + OV_PRINT(OV_PRINTED " [FAILED] lib boost_thread") + ENDIF(LIB_Boost_Thread) + ENDIF(LIB_Boost_Thread) + + # For Fedora + INCLUDE("FindThirdPartyPThread") + + # For Ubuntu 13.04 (interprocess/ipc/message_queue.hpp in ovasCPluginExternalStimulations.cpp caused dep) + FIND_LIBRARY(LIB_STANDARD_MODULE_RT rt) + IF(LIB_STANDARD_MODULE_RT) + OV_PRINT(OV_PRINTED " Found rt...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_RT}) + ELSE(LIB_STANDARD_MODULE_RT) + OV_PRINT(OV_PRINTED " FAILED to find rt...") + ENDIF(LIB_STANDARD_MODULE_RT) + +ENDIF(UNIX) + +IF(WIN32) + OV_LINK_BOOST_LIB("thread" ${OV_WIN32_BOOST_VERSION}) +ENDIF(WIN32) + + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyBoost_Thread "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBrainmasterCodeMakerAPI.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBrainmasterCodeMakerAPI.cmake new file mode 100644 index 0000000..af92e33 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyBrainmasterCodeMakerAPI.cmake @@ -0,0 +1,49 @@ +# --------------------------------- +# Finds BrainmasterCodeMakerAPI +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyBrainmasterCodeMakerAPI) + +IF(WIN32) + IF("${PLATFORM_TARGET}" STREQUAL "x64") + OV_PRINT(OV_PRINTED " SKIPPED BrainMaster Discovery & Atlantis not yet supported on 64bit build...") + SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyBrainmasterCodeMakerAPI "Yes") + RETURN() + ENDIF() + + # note that ampersands in paths below passed through cmake mess up Visual Studio IDE. If you get this problem, rename the dll folder under Program Files/ + FIND_PATH(PATH_BrainmasterCodeMakerAPI CMKRDLLU.H PATHS + "C:/Program Files/Atlantis and Discovery SW DLL 1-11-12" + "C:/Program Files (x86)/Atlantis and Discovery SW DLL 1-11-12" + "C:/Program Files/Atlantis & Discovery SW DLL 1-11-12" + "C:/Program Files (x86)/Atlantis & Discovery SW DLL 1-11-12" + ${LIST_DEPENDENCIES_PATH}) + IF(PATH_BrainmasterCodeMakerAPI) + OV_PRINT(OV_PRINTED " Found Brainmaster Code Maker API...") + INCLUDE_DIRECTORIES(${PATH_BrainmasterCodeMakerAPI}) + + FOREACH(LIB_BrainmasterCodeMakerAPI bmrcm.lib ovbmrcm.lib) + SET(LIB_BrainmasterCodeMakerAPI1 "LIB_BrainmasterCodeMakerAPI1-NOTFOUND") + FIND_LIBRARY(LIB_BrainmasterCodeMakerAPI1 NAMES ${LIB_BrainmasterCodeMakerAPI} PATHS ${PATH_BrainmasterCodeMakerAPI} NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_BrainmasterCodeMakerAPI1 NAMES ${LIB_BrainmasterCodeMakerAPI}) + IF(LIB_BrainmasterCodeMakerAPI1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${LIB_BrainmasterCodeMakerAPI1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_BrainmasterCodeMakerAPI1}) + ELSE(LIB_BrainmasterCodeMakerAPI1) + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${LIB_BrainmasterCodeMakerAPI}") + ENDIF(LIB_BrainmasterCodeMakerAPI1) + ENDFOREACH(LIB_BrainmasterCodeMakerAPI) + + # Copy the DLL file at install + INSTALL(PROGRAMS "${PATH_BrainmasterCodeMakerAPI}/bmrcm.dll" DESTINATION ${DIST_BINDIR}) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyBrainmasterCodeMakerAPI) + ELSE(PATH_BrainmasterCodeMakerAPI) + OV_PRINT(OV_PRINTED " FAILED to find Brainmaster Code Maker API (optional driver)") + ENDIF(PATH_BrainmasterCodeMakerAPI) +ENDIF(WIN32) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyBrainmasterCodeMakerAPI "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyCEGUI.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyCEGUI.cmake new file mode 100644 index 0000000..6071f8b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyCEGUI.cmake @@ -0,0 +1,94 @@ +# --------------------------------- +# Finds CEGUI toolkit +# +# Sets CEGUI_FOUND +# Sets CEGUI_LIBRARIES +# Sets CEGUI_LIBRARY_DIRS +# Sets CEGUI_LDFLAGS +# Sets CEGUI_LDFLAGS_OTHERS +# Sets CEGUI_INCLUDE_DIRS +# Sets CEGUI_CFLAGS +# Sets CEGUI_CFLAGS_OTHERS +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyCEGUI) + +IF(OV_DISABLE_OGRE) + OV_PRINT(OV_PRINTED " SKIPPED Ogre3D/OIS (CEGUI), disabled, no 3D ...") + RETURN() +ENDIF(OV_DISABLE_OGRE) + +IF(WIN32) + FIND_PATH(PATH_CEGUI cegui/include/CEGUI.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES cegui) + IF(PATH_CEGUI) + SET(CEGUI_FOUND TRUE) + SET(OgreCEGUIRenderer_FOUND TRUE) + SET(CEGUI_INCLUDE_DIRS ${PATH_CEGUI}/cegui/include) + STRING(REGEX MATCH "vc120.*" MSVC_VER120 ${MSVC_SERVICE_PACK}) + IF(MSVC_VER120) + SET(CEGUI_LIBRARIES_DEBUG CEGUIBase-0_d CEGUIOgreRenderer-0_d) + SET(CEGUI_LIBRARIES_RELEASE CEGUIBase-0 CEGUIOgreRenderer-0) + ELSE(MSVC_VER120) + SET(CEGUI_LIBRARIES_DEBUG CEGUIBase_d CEGUIOgreRenderer_d) + SET(CEGUI_LIBRARIES_RELEASE CEGUIBase CEGUIOgreRenderer) + ENDIF(MSVC_VER120) + SET(CEGUI_LIBRARY_DIRS ${PATH_CEGUI}/lib) + ENDIF(PATH_CEGUI) +ENDIF(WIN32) + +IF(UNIX) + # Assumes FindThirdPartyCEGUI_Check.cmake has been run +ENDIF(UNIX) + +IF(CEGUI_FOUND AND OgreCEGUIRenderer_FOUND) + OV_PRINT(OV_PRINTED " Found CEGUI/OgreCEGUIRenderer...") + + INCLUDE_DIRECTORIES(${CEGUI_INCLUDE_DIRS} ${OgreCEGUIRenderer_INCLUDE_DIRS}) + ADD_DEFINITIONS(${CEGUI_CFLAGS} ${OgreCEGUIRenderer_CFLAGS}) + ADD_DEFINITIONS(${CEGUI_CFLAGS_OTHERS} ${OgreCEGUIRenderer_CFLAGS_OTHERS}) + # LINK_DIRECTORIES(${CEGUI_LIBRARY_DIRS} ${OgreCEGUIRenderer_LIBRARY_DIRS}) +IF(UNIX) + + FOREACH(CEGUI_LIB ${CEGUI_LIBRARIES} ${OgreCEGUIRenderer_LIBRARIES}) + SET(CEGUI_LIB1 "CEGUI_LIB1-NOTFOUND") + FIND_LIBRARY(CEGUI_LIB1 NAMES ${CEGUI_LIB} PATHS ${CEGUI_LIBRARY_DIRS} ${CEGUI_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(CEGUI_LIB1 NAMES ${CEGUI_LIB}) + IF(CEGUI_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${CEGUI_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${CEGUI_LIB1}) + ELSE(CEGUI_LIB1) + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${CEGUI_LIB}") + ENDIF(CEGUI_LIB1) + ENDFOREACH(CEGUI_LIB) +ENDIF(UNIX) +IF(WIN32) + FOREACH(CEGUI_LIB ${CEGUI_LIBRARIES_DEBUG}) + SET(CEGUI_LIB1 "CEGUI_LIB1-NOTFOUND") + FIND_LIBRARY(CEGUI_LIB1 NAMES ${CEGUI_LIB} PATHS ${CEGUI_LIBRARY_DIRS} ${CEGUI_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(CEGUI_LIB1 NAMES ${CEGUI_LIB}) + IF(CEGUI_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${CEGUI_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${CEGUI_LIB1}) + ELSE(CEGUI_LIB1) + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${CEGUI_LIB}") + ENDIF(CEGUI_LIB1) + ENDFOREACH(CEGUI_LIB) + FOREACH(CEGUI_LIB ${CEGUI_LIBRARIES_RELEASE}) + SET(CEGUI_LIB1 "CEGUI_LIB1-NOTFOUND") + FIND_LIBRARY(CEGUI_LIB1 NAMES ${CEGUI_LIB} PATHS ${CEGUI_LIBRARY_DIRS} ${CEGUI_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(CEGUI_LIB1 NAMES ${CEGUI_LIB}) + IF(CEGUI_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${CEGUI_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} optimized ${CEGUI_LIB1}) + ELSE(CEGUI_LIB1) + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${CEGUI_LIB}") + ENDIF(CEGUI_LIB1) + ENDFOREACH(CEGUI_LIB) +ENDIF(WIN32) + +ELSE(CEGUI_FOUND AND OgreCEGUIRenderer_FOUND) + OV_PRINT(OV_PRINTED " FAILED to find CEGUI/OgreCEGUIRenderer...") +ENDIF(CEGUI_FOUND AND OgreCEGUIRenderer_FOUND) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyCEGUI "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyCEGUI_Check.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyCEGUI_Check.cmake new file mode 100644 index 0000000..363c38e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyCEGUI_Check.cmake @@ -0,0 +1,57 @@ +# --------------------------------- +# Finds CEGUI & Ogre toolkit +# +# Should only be used to check the presence, include later +# +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyCEGUI_Check) + +IF(OV_DISABLE_OGRE) + OV_PRINT(OV_PRINTED " SKIPPED Ogre3D/OIS (CEGUI), disabled, no 3D ...") + RETURN() +ENDIF(OV_DISABLE_OGRE) + +OV_PRINT(OV_PRINTED " Checking for CEGUI ...") + +IF(WIN32) + FIND_PATH(PATH_CEGUI cegui/include/CEGUI.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES cegui) + IF(PATH_CEGUI) + SET(CEGUI_FOUND TRUE) + ELSE() + OV_PRINT(OV_PRINTED " CEGUI headers not found ...") + ENDIF() + FIND_PATH(PATH_Ogre3D include/OGRE/Ogre.h PATHS ${LIST_DEPENDENCIES_PATH} $ENV{OGRE_HOME} PATH_SUFFIXES . ogre) + IF(PATH_Ogre3D) + SET(OgreCEGUIRenderer_FOUND TRUE) + ELSE() + OV_PRINT(OV_PRINTED " Ogre materials not found ...") + ENDIF() +ENDIF(WIN32) + +IF(UNIX) + INCLUDE("FindPkgConfig") + SET(CEGUI_FOUND "-NOTFOUND") + pkg_check_modules(CEGUI QUIET CEGUI) + IF(NOT CEGUI_FOUND) + # we have this mess as the cegui filenames & paths are different on Fedora 21 at least, + # and the include_dirs doesn't contain the CEGUI/ part ... I'd put that to the .h/.cpp IF the same path + # convention was the case on all platforms... but it is not + pkg_check_modules(CEGUI QUIET CEGUI-0) + SET(CEGUI_INCLUDE_DIRS "${CEGUI_INCLUDE_DIRS}/CEGUI") + ENDIF(NOT CEGUI_FOUND) + SET(OgreCEGUIRenderer_FOUND "-NOTFOUND") + pkg_check_modules(OgreCEGUIRenderer QUIET CEGUI-OGRE) + IF(NOT OgreCEGUIRenderer_FOUND) + pkg_check_modules(OgreCEGUIRenderer QUIET CEGUI-0-OGRE) + ENDIF(NOT OgreCEGUIRenderer_FOUND) +ENDIF(UNIX) + +# IF(CEGUI_FOUND AND OgreCEGUIRenderer_FOUND) +# OV_PRINT(OV_PRINTED " Found CEGUI/OgreCEGUIRenderer...") +# ELSE(CEGUI_FOUND AND OgreCEGUIRenderer_FOUND) +# OV_PRINT(OV_PRINTED " FAILED to find CEGUI/OgreCEGUIRenderer...") +# ENDIF(CEGUI_FOUND AND OgreCEGUIRenderer_FOUND) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyCEGUI_Check "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyEemagineEEGO.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyEemagineEEGO.cmake new file mode 100644 index 0000000..70eaeae --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyEemagineEEGO.cmake @@ -0,0 +1,43 @@ +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyEemagineEEGO) + +# --------------------------------- +# Finds the Eemagine EEGO API & library +# Adds library to target +# Adds include path +# --------------------------------- + +if (WIN32) + FIND_PATH(PATH_EEGOAPI amplifier.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_eemagine_eego/eemagine/sdk/) +else() + FIND_PATH(PATH_EEGOAPI amplifier.h PATHS /usr/include PATH_SUFFIXES eemagine/sdk/) +endif(WIN32) + +IF(NOT PATH_EEGOAPI) + OV_PRINT(OV_PRINTED " FAILED to find EEGO API (optional driver) - cmake looked in '${LIST_DEPENDENCIES_PATH}', skipping EEGO.") + RETURN() +ENDIF(NOT PATH_EEGOAPI) + +OV_PRINT(OV_PRINTED " Found EEGO API in ${PATH_EEGOAPI}...") + +if (WIN32) + FIND_FILE(LIB_EEGOAPI NAMES eego-SDK.dll PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_eemagine_eego/eemagine/bin/) +else() + find_library(LIB_EEGOAPI NAMES eego-SDK) + target_link_libraries(${PROJECT_NAME} -ldl) + OV_PRINT(OV_PRINTED " LIB_EEGOAPI : ${LIB_EEGOAPI}") +endif(WIN32) + +IF(NOT LIB_EEGOAPI) + OV_PRINT(OV_PRINTED " [FAILED] EEGO lib not found under '${LIST_DEPENDENCIES_PATH}', skipping EEGO.") + RETURN() +ENDIF(NOT LIB_EEGOAPI) + +INCLUDE_DIRECTORIES("${PATH_EEGOAPI}/../../") + +INSTALL(PROGRAMS "${LIB_EEGOAPI}" DESTINATION ${DIST_BINDIR}) +ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyEEGOAPI) +ADD_DEFINITIONS(-DEEGO_SDK_BIND_DYNAMIC) + +OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_EEGOAPI}") + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyEemagineEEGO "Yes") diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyEigen.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyEigen.cmake new file mode 100644 index 0000000..1e4b5db --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyEigen.cmake @@ -0,0 +1,56 @@ +# --------------------------------- +# Finds Eigen headers +# +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyEigen) + +IF(WIN32) + FIND_PATH(PATH_EIGEN Eigen/Eigen PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES eigen) + IF(PATH_EIGEN) + SET(EIGEN_FOUND TRUE) + SET(EIGEN_INCLUDE_DIRS ${PATH_EIGEN}) + SET(EIGEN_CFLAGS "") + #SET(EIGEN_LIBRARIES_RELEASE EIGEN) + #SET(EIGEN_LIBRARIES_DEBUG EIGENd) + #SET(EIGEN_LIBRARY_DIRS ${PATH_EIGEN}/lib ) + ENDIF(PATH_EIGEN) +ENDIF(WIN32) + +IF(UNIX) + + # @FIXME remove that when an Ubuntu package will be available + # Find in priority local library for eigen even if linux package has been installed + # reason: package on distri Ubuntu 16.04 is still bugged (eigen 3.2.92) + INCLUDE("FindPkgConfig") + UNSET(PATH_EIGEN_LOCAL CACHE) + FIND_PATH(PATH_EIGEN_LOCAL eigen3 PATHS "/usr/local/include" NO_DEFAULT_PATH) + SET(EIGEN_FOUND FALSE) + IF (PATH_EIGEN_LOCAL) + SET(EIGEN_INCLUDE_DIRS "${PATH_EIGEN_LOCAL}/eigen3") + SET(EIGEN_CFLAGS "-I${EIGEN_INCLUDE_DIRS}") + SET(EIGEN_FOUND TRUE) + ELSE() + pkg_check_modules(EIGEN eigen3) + ENDIF() + + # @FIXME uncomment that when an Ubuntu package will be available + #SET(EIGEN_FOUND FALSE) + #INCLUDE("FindPkgConfig") + #pkg_check_modules(EIGEN eigen3) + +ENDIF(UNIX) + +IF(EIGEN_FOUND) + OV_PRINT(OV_PRINTED " Found eigen3...") + INCLUDE_DIRECTORIES(${EIGEN_INCLUDE_DIRS}) + ADD_DEFINITIONS(${EIGEN_CFLAGS}) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyEIGEN) +ELSE(EIGEN_FOUND) + OV_PRINT(OV_PRINTED " FAILED to find eigen3...") +ENDIF(EIGEN_FOUND) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyEigen "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyEmotivAPI.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyEmotivAPI.cmake new file mode 100644 index 0000000..fddb2e4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyEmotivAPI.cmake @@ -0,0 +1,94 @@ +# --------------------------------- +# Finds Emotiv SDK +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyEmotivAPI) + +IF(WIN32) + IF("${PLATFORM_TARGET}" STREQUAL "x64") + OV_PRINT(OV_PRINTED " SKIPPED Emotiv EPOC not yet supported on 64bit builds...") + SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyEmotivAPI "Yes") + RETURN() + ENDIF() +ENDIF() + +# Put the path to the Emotiv SDK followed by * +FILE(GLOB PATH_Candidates + "C:/Program Files/Emotiv Development Kit*" + "C:/Program Files/Emotiv Research Edition*" + "C:/Program Files/Emotiv SDK Premium Edition*" + "C:/Program Files (x86)/Emotiv Development Kit*" + "C:/Program Files (x86)/Emotiv Research Edition*" + "C:/Program Files (x86)/Emotiv SDK Premium Edition*" + "/home/{username}/EmotivResearch_2.0.0.20*" + #Put here the path to the directory where you installed the emotiv sdk +) +FOREACH(Candidate_folder ${PATH_Candidates}) + # OV_PRINT(OV_PRINTED "Found path ${PATH_Candidate}") + #Version 1 of sdk + LIST(APPEND PATH_Candidates ${Candidate_folder}/doc/examples/include) + #Version 2 of sdk + LIST(APPEND PATH_Candidates ${Candidate_folder}/doc/examples_Qt/example5) + #Version 3 of sdk + LIST(APPEND PATH_Candidates ${Candidate_folder}/EDK/Header\ files/) +ENDFOREACH(Candidate_folder ${PATH_Candidates}) + +SET(PATH_EmotivAPI "-NOTFOUND") +FIND_PATH(PATH_EmotivAPI1 edk.h PATHS ${PATH_Candidates} ${LIST_DEPENDENCIES_PATH}) +IF(PATH_EmotivAPI1) + OV_PRINT(OV_PRINTED " Found Emotiv Research API 1.x ...") + SET(OV_EMOTIV_VERSION "research-1") + SET(PATH_EmotivAPI ${PATH_EmotivAPI1}) + SET(OV_EMOTIV_PATHS "${PATH_EmotivAPI}/../lib" "${PATH_EmotivAPI}/../../lib" "${PATH_EmotivAPI}/../../../lib") +ENDIF(PATH_EmotivAPI1) + +FIND_PATH(PATH_EmotivAPI2 IEdk.h PATHS ${PATH_Candidates} ${LIST_DEPENDENCIES_PATH}) +IF(PATH_EmotivAPI2) + OV_PRINT(OV_PRINTED " Found Emotiv API 3.x ...") + SET(OV_EMOTIV_VERSION "community") + SET(PATH_EmotivAPI ${PATH_EmotivAPI2}) + SET(OV_EMOTIV_PATHS "${PATH_EmotivAPI}/../x86" "${PATH_EmotivAPI}/../../x86" "${PATH_EmotivAPI}/../../../x86") +ENDIF(PATH_EmotivAPI2) + +FIND_PATH(PATH_EmotivAPI3 IEegData.h PATHS ${PATH_Candidates} ${LIST_DEPENDENCIES_PATH}) +IF(PATH_EmotivAPI3) + OV_PRINT(OV_PRINTED " Found Emotiv Research API 3.x ...") + SET(OV_EMOTIV_VERSION "research-3") + SET(PATH_EmotivAPI ${PATH_EmotivAPI3}) + SET(OV_EMOTIV_PATHS "${PATH_EmotivAPI}/../x86" "${PATH_EmotivAPI}/../../x86" "${PATH_EmotivAPI}/../../../x86") +ENDIF(PATH_EmotivAPI3) + +IF(PATH_EmotivAPI) + FIND_LIBRARY(LIB_EmotivAPI edk PATHS ${OV_EMOTIV_PATHS}) + IF(LIB_EmotivAPI) + OV_PRINT(OV_PRINTED " [ OK ] api ${PATH_EmotivAPI}") + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_EmotivAPI}") + INCLUDE_DIRECTORIES(${PATH_EmotivAPI}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_EmotivAPI} ) +IF(WIN32) + # To delay load EDK.dll and redistribute binary + TARGET_LINK_LIBRARIES(${PROJECT_NAME} Delayimp.lib ) + SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/DELAYLOAD:edk.dll /DELAY:UNLOAD") +ENDIF(WIN32) + IF(${OV_EMOTIV_VERSION} STREQUAL "community") + # This doesn't work by itself yet... + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyEmotivCommunityAPI) + ELSEIF(${OV_EMOTIV_VERSION} STREQUAL "research-1") + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyEmotivAPI) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyEmotivResearchAPI1x) + ELSEIF(${OV_EMOTIV_VERSION} STREQUAL "research-3") + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyEmotivAPI) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyEmotivResearchAPI3x) + ENDIF(${OV_EMOTIV_VERSION} STREQUAL "community") +ELSE(LIB_EmotivAPI) + OV_PRINT(OV_PRINTED " [FAILED] lib Emotiv edk.lib") +ENDIF(LIB_EmotivAPI) + +ELSE(PATH_EmotivAPI) + OV_PRINT(OV_PRINTED " FAILED to find Emotiv API (optional driver)") +ENDIF(PATH_EmotivAPI) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyEmotivAPI "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyFFTW3.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyFFTW3.cmake new file mode 100644 index 0000000..793864a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyFFTW3.cmake @@ -0,0 +1,78 @@ +# --------------------------------- +# Finds FFTW3 +# +# Sets define if the lib is found, adds include paths, libs +# +# --------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyFFTW3) + +# On windows, we take the itpp one. + +IF(WIN32) + FIND_PATH(PATH_FFTW3 include/fftw3.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES itpp) + IF(PATH_FFTW3) + SET(FFTW3_FOUND TRUE) + # Of course the name of the library is this or that, depending on the circumstances ... + IF("${PLATFORM_TARGET}" STREQUAL "x64") + FIND_LIBRARY(FFTW3_TMP NAMES libfftw3-3_win64 PATHS ${PATH_FFTW3}/lib NO_DEFAULT_PATH) + IF(FFTW3_TMP) + SET(FFTW3_LIBRARIES libfftw3-3_win64) + ELSE(FFTW3_TMP) + SET(FFTW3_LIBRARIES libfftw3-3) + ENDIF(FFTW3_TMP) + ELSE() + FIND_LIBRARY(FFTW3_TMP NAMES libfftw3-3_win32 PATHS ${PATH_FFTW3}/lib NO_DEFAULT_PATH) + IF(FFTW3_TMP) + SET(FFTW3_LIBRARIES libfftw3-3_win32) + ELSE(FFTW3_TMP) + SET(FFTW3_LIBRARIES libfftw3-3) + ENDIF(FFTW3_TMP) + ENDIF() + + SET(FFTW3_INCLUDE_DIRS ${PATH_FFTW3}/include ) + SET(FFTW3_LIBRARY_DIRS ${PATH_FFTW3}/lib ) + ENDIF(PATH_FFTW3) +ENDIF(WIN32) + +IF(UNIX) + INCLUDE("FindThirdPartyPkgConfig") + pkg_check_modules(FFTW3 fftw3) +ENDIF(UNIX) + +IF(FFTW3_FOUND) + SET(FFTW3_LOCATED_LIBS "") + OV_PRINT(OV_PRINTED " Found fftw3 includes...") + FOREACH(FFTW3_LIB ${FFTW3_LIBRARIES}) + SET(FFTW3_LIB1 "FFTW3_LIB1-NOTFOUND") + # The list is 'fftw3 m' on Fedora 19. CMake gets confused unless the two following lines are used ... + # 1) catch fftw3 if its under dependencies/lib/ (fedora19) + FIND_LIBRARY(FFTW3_LIB1 NAMES ${FFTW3_LIB} PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) + # 2) catch fftw3 from found paths, and libm from usual system paths, i.e. default path is allowed. (covers other systems + libm on fedora). + FIND_LIBRARY(FFTW3_LIB1 NAMES ${FFTW3_LIB} PATHS ${FFTW3_LIBRARY_DIRS}) + IF(FFTW3_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${FFTW3_LIB1}") + LIST(APPEND FFTW3_LOCATED_LIBS ${FFTW3_LIB1}) + ELSE(FFTW3_LIB1) + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${FFTW3_LIB}") + SET(FFTW3_FOUND "-NOTFOUND") + BREAK() + ENDIF(FFTW3_LIB1) + ENDFOREACH(FFTW3_LIB) +ENDIF(FFTW3_FOUND) + +IF(FFTW3_FOUND) + INCLUDE_DIRECTORIES(${FFTW3_INCLUDE_DIRS}) + ADD_DEFINITIONS(${FFTW3_CFLAGS}) + + FOREACH(FFTW3_LIB ${FFTW3_LOCATED_LIBS}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${FFTW3_LIB}) + ENDFOREACH(FFTW3_LIB) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyFFTW3) +ELSE(FFTW3_FOUND) + OV_PRINT(OV_PRINTED " FAILED to find fftw3...") +ENDIF(FFTW3_FOUND) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyFFTW3 "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyGMobiLabPlusAPI.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyGMobiLabPlusAPI.cmake new file mode 100644 index 0000000..e33e272 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyGMobiLabPlusAPI.cmake @@ -0,0 +1,72 @@ +# +# The gMobilab driver (Linux) was contributed by Lucie Daubigney from Supelec Metz +# +# Windows-compatibility added by Jussi T. Lindgren / Inria +# + +# --------------------------------- +# Finds GTecMobiLabPlus+ +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyGMobiLabPlusAPI) + +IF(WIN32) + # note that the API bitness must match the OV build bitness + FIND_PATH(PATH_GMobiLabCAPI GMobiLabPlus.h PATHS + "C:/Program Files/gtec/GMobiLabCAPI/Lib" + "C:/Program Files (x86)/gtec/GMobiLabCAPI/Lib" + ${LIST_DEPENDENCIES_PATH}) + IF("${PLATFORM_TARGET}" STREQUAL "x64") + # We need to copy the DLL on install; note that System32 *is* the 64bit folder on 64bit arch + FIND_PATH(PATH_GMobiLabDLL gMOBIlabplus.dll PATHS + "C:/Windows/System32" + ${LIST_DEPENDENCIES_PATH}) + FIND_LIBRARY(LIB_GMobiLabCAPI GMobiLabplus PATHS ${PATH_GMobiLabCAPI}/x64) + ELSE() + # We need to copy the DLL on install + FIND_PATH(PATH_GMobiLabDLL gMOBIlabplus.dll PATHS + "C:/Windows/System32" + "C:/Windows/SysWOW64" + ${LIST_DEPENDENCIES_PATH}) + FIND_LIBRARY(LIB_GMobiLabCAPI GMobiLabplus PATHS ${PATH_GMobiLabCAPI}/x86) + ENDIF() + + IF(PATH_GMobiLabCAPI AND PATH_GMobiLabDLL AND LIB_GMobiLabCAPI) + OV_PRINT(OV_PRINTED " Found gtec gMobiLabCAPI ...") + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_GMobiLabCAPI}") + + INCLUDE_DIRECTORIES(${PATH_GMobiLabCAPI}) + + # Do not link to the dll! Its opened runtime with dlopen() + # TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_GMobiLabCAPI} ) + + INSTALL(PROGRAMS ${PATH_GMobiLabDLL}/gMOBIlabplus.dll DESTINATION ${DIST_BINDIR}) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyGMobiLabPlusAPI) + SET(OV_ThirdPartyGMobilab "YES") + + ELSE() + OV_PRINT(OV_PRINTED " FAILED to find gtec gMobiLabPlusAPI + lib + dll (optional driver)") + #OV_PRINT(OV_PRINTED " Results were ${PATH_GMobiLabCAPI} AND ${PATH_GMobiLabDLL} AND ${LIB_GMobiLabCAPI}") + ENDIF() +ENDIF() + +IF(UNIX) + FIND_LIBRARY(gMOBIlabplus_LIBRARY NAMES "gMOBIlabplus" "gmobilabplusapi" PATHS "/usr/lib" "/usr/local/lib") + IF(gMOBIlabplus_LIBRARY) + OV_PRINT(OV_PRINTED " Found gtec gMobiLabPlusAPI...") + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${gMOBIlabplus_LIBRARY}") + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyGMobiLabPlusAPI) + # Do not link to the dll! Its opened runtime with dlopen() + # TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${gMOBIlabplus_LIBRARY} ) + ELSE() + OV_PRINT(OV_PRINTED " FAILED to find gtec gMobiLabPlusAPI... (optional driver)") + OV_PRINT(OV_PRINTED " : If it should be found, see that 'gmobilabapi.so' link exists on the fs, with no numeric suffixes in the filename.") + OV_PRINT(OV_PRINTED " : e.g. do 'cd /usr/lib/ ; ln -s libgmobilabplusapi.so.1.12 libgmobilabplusapi.so' ") + ENDIF() +ENDIF() + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyGMobiLabPlusAPI "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyGTK.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyGTK.cmake new file mode 100644 index 0000000..41bbf9c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyGTK.cmake @@ -0,0 +1,84 @@ +# --------------------------------- +# Finds GTK toolkit +# +# Sets GTK_FOUND +# Sets GTK_LIBRARIES +# Sets GTK_LIBRARY_DIRS +# Sets GTK_LDFLAGS +# Sets GTK_LDFLAGS_OTHERS +# Sets GTK_INCLUDE_DIRS +# Sets GTK_CFLAGS +# Sets GTK_CFLAGS_OTHERS +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyGTK) + +IF(OV_DISABLE_GTK) + OV_PRINT(OV_PRINTED " GTK disabled") + RETURN() +ENDIF(OV_DISABLE_GTK) + +INCLUDE("FindThirdPartyPkgConfig") +IF(WIN32) + pkg_check_modules(GTK gtk+-win32-2.0 gthread-2.0) +ELSE(WIN32) + pkg_check_modules(GTK "gtk+-2.0" "gthread-2.0") +ENDIF(WIN32) + +IF(${OV_DEPENDENCIES_PLATFORM_FOLDER_NAME} STREQUAL "dependencies") + SET(GTK_LIB_SUBFOLDER "2.10.0") + SET(LIB_Z_NAME "zdll") +ELSE() + SET(GTK_LIB_SUBFOLDER "i686-pc-vs10") + SET(LIB_Z_NAME "zlib1") +ENDIF() +IF(GTK_FOUND) + OV_PRINT(OV_PRINTED " Found GTK+...") + + # optimistic... + SET(GTK_FOUND_EVERYTHING "True") + + #shouldn't add GTK_CFLAGS, this results in AdditionalIncludeDirectories becoming broken in visual studio + #ADD_DEFINITIONS(${GTK_CFLAGS} ${GTK_CFLAGS_OTHERS} ${GTHREAD_CFLAGS}${GTHREAD_CFLAGS_OTHERS}) + #LINK_DIRECTORIES(${GTK_LIBRARY_DIRS} ${GTHREAD_LIBRARY_DIRS}) + IF(WIN32) + SET( GTK_LIB_LIST ${GTK_LIBRARIES} ${GTHREAD_LIBRARIES} ${LIB_Z_NAME}) + ELSE(WIN32) + SET( GTK_LIB_LIST ${GTK_LIBRARIES} ${GTHREAD_LIBRARIES} z) + ENDIF(WIN32) + + IF(WIN32) + # gdi32.lib could be under the MS Windows SDK + INCLUDE("OvSetWindowsSDKPath") + ENDIF(WIN32) + + FOREACH(GTK_LIB ${GTK_LIB_LIST}) + SET(GTK_LIB1 "GTK_LIB1-NOTFOUND") + FIND_LIBRARY(GTK_LIB1 NAMES ${GTK_LIB} PATHS ${GTK_LIBRARY_DIRS} ${GTK_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(GTK_LIB1 NAMES ${GTK_LIB} PATHS ${GTK_LIBRARY_DIRS} ${GTK_LIBDIR}) + IF(WIN32) + FIND_LIBRARY(GTK_LIB1 NAMES ${GTK_LIB} PATHS ${OV_MS_SDK_PATH}/lib) + ENDIF(WIN32) + IF(GTK_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${GTK_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${GTK_LIB1}) + ELSE(GTK_LIB1) + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${GTK_LIB}") + SET(GTK_FOUND_EVERYTHING "-NOTFOUND") + ENDIF(GTK_LIB1) + ENDFOREACH(GTK_LIB) +ENDIF(GTK_FOUND) + +IF(GTK_FOUND_EVERYTHING) + INCLUDE_DIRECTORIES(${GTK_INCLUDE_DIRS} ${GTHREAD_INCLUDE_DIRS}) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyGTK) +ELSE(GTK_FOUND_EVERYTHING) + OV_PRINT(OV_PRINTED " FAILED to find GTK+ or its components...") + SET(OV_DISABLE_GTK TRUE) + IF(NOT PKG_CONFIG_FOUND) + OV_PRINT(OV_PRINTED " Did not even find pkg-config exe") + ENDIF(NOT PKG_CONFIG_FOUND) +ENDIF(GTK_FOUND_EVERYTHING) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyGTK "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyGUSBampCAPI.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyGUSBampCAPI.cmake new file mode 100644 index 0000000..c599e22 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyGUSBampCAPI.cmake @@ -0,0 +1,63 @@ +# --------------------------------- +# Finds GUSBampCAPI +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyGUSBampCAPI) + +IF(WIN32) + IF("${PLATFORM_TARGET}" STREQUAL "x64") + SET(GUSBAMP_ARCH "x64") + ELSE() + SET(GUSBAMP_ARCH "Win32") + ENDIF() + + FIND_PATH(PATH_GUSBampCAPI gUSBamp.h PATHS + "C:/Program Files/gtec/gUSBampCAPI/API" + "C:/Program Files (x86)/gtec/gUSBampCAPI/API" + "C:/Program Files/gtec/gUSBampCAPI/API/${GUSBAMP_ARCH}" + "C:/Program Files (x86)/gtec/gUSBampCAPI/API/${GUSBAMP_ARCH}" + ${LIST_DEPENDENCIES_PATH}) + IF(PATH_GUSBampCAPI) + OV_PRINT(OV_PRINTED " Found gtec gUSBampCAPI...") + INCLUDE_DIRECTORIES(${PATH_GUSBampCAPI}) + FIND_LIBRARY(LIB_GUSBampCAPI gUSBamp PATHS ${PATH_GUSBampCAPI}) + IF(LIB_GUSBampCAPI) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_GUSBampCAPI}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_GUSBampCAPI} ) + ELSE(LIB_GUSBampCAPI) + OV_PRINT(OV_PRINTED " [FAILED] lib gUSBamp") + ENDIF(LIB_GUSBampCAPI) + + # Copy the DLL file at install + INSTALL(PROGRAMS "${PATH_GUSBampCAPI}/gUSBamp.dll" DESTINATION ${DIST_BINDIR}) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyGUSBampCAPI) + SET(OV_ThirdPartyGUSBAmp "YES") + + ELSE() + OV_PRINT(OV_PRINTED " FAILED to find gtec gUSBampCAPI (optional driver)") + ENDIF() +ENDIF(WIN32) + + +IF(UNIX) + # To try other versions of the gtec's library, change the number below + SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so.1.14") + FIND_LIBRARY(gUSBAmpLinux_LIBRARY NAMES "gusbampapi" PATHS "/usr/lib" "/usr/local/lib") + IF(gUSBAmpLinux_LIBRARY) + OV_PRINT(OV_PRINTED " Found gtec gUSBAmpAPILinux...") + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${gUSBAmpLinux_LIBRARY}") + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyGUSBampCAPI_Linux) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${gUSBAmpLinux_LIBRARY} ) + SET(OV_ThirdPartyGUSBAmp "YES") + ELSE() + OV_PRINT(OV_PRINTED " FAILED to find gtec gUSBAmpAPI Linux... (optional)") + OV_PRINT(OV_PRINTED " : If it should be found, see that 'libgusbampapi.so.1.14' link exists on the fs, with no further nemeric suffixes in the filename.") + OV_PRINT(OV_PRINTED " : e.g. do 'cd /usr/lib/ ; ln -s libgusbampapi.so.1.14'. See gtec-bcilab/README for details.") + ENDIF() +ENDIF(UNIX) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyGUSBampCAPI "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyITPP.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyITPP.cmake new file mode 100644 index 0000000..98e9a5b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyITPP.cmake @@ -0,0 +1,126 @@ +# --------------------------------- +# Finds ITPP toolkit +# +# Sets ITPP_FOUND +# Sets ITPP_LIBRARIES +# Sets ITPP_LIBRARY_DIRS +# Sets ITPP_LDFLAGS +# Sets ITPP_LDFLAGS_OTHERS +# Sets ITPP_INCLUDE_DIRS +# Sets ITPP_CFLAGS +# Sets ITPP_CFLAGS_OTHERS +# +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyITPP) + +IF(WIN32) + FIND_PATH(PATH_ITPP include/itpp/itbase.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES itpp) + IF(PATH_ITPP) + SET(ITPP_FOUND TRUE) + SET(ITPP_INCLUDE_DIRS ${PATH_ITPP}/include) + + # Currently the different versions we package for different VS have a bit different lib names... + STRING(REGEX MATCH "vc100.*" MSVC_VER100 ${MSVC_SERVICE_PACK}) + STRING(REGEX MATCH "vc120.*" MSVC_VER120 ${MSVC_SERVICE_PACK}) + + IF(MSVC_VER100) + SET(ITPP_LIBRARIES libblas.a libfftw3-3 liblapack.a libgcc.a libg2c.a) + SET(ITPP_LIBRARIES_RELEASE itpp) + SET(ITPP_LIBRARIES_DEBUG itppd) + ENDIF(MSVC_VER100) + IF(MSVC_VER120) + IF("${PLATFORM_TARGET}" STREQUAL "x64") + SET(ITPP_LIBRARIES libfftw3-3_win64) + SET(ITPP_LIBRARIES_RELEASE blas_win64_MT lapack_win64_MT itpp) + SET(ITPP_LIBRARIES_DEBUG blas_win64_MT lapack_win64_MT itpp) # we dont have a good 64bit debug build, just use release + ELSE() + SET(ITPP_LIBRARIES libfftw3-3_win32) + SET(ITPP_LIBRARIES_RELEASE blas_win32_MT lapack_win32_MT itpp) + SET(ITPP_LIBRARIES_DEBUG blas_win32_MTd lapack_win32_MTd itppd) + ENDIF() + ENDIF(MSVC_VER120) + + SET(ITPP_LIBRARY_DIRS ${PATH_ITPP}/lib ) + ENDIF(PATH_ITPP) + +ENDIF(WIN32) + +IF(UNIX) + INCLUDE("FindThirdPartyPkgConfig") + FIND_PATH(PATH_ITPP include/itpp PATHS ${LIST_DEPENDENCIES_PATH}) + + IF(PATH_ITPP) + FIND_LIBRARY(ITPP_LIBRARY itpp PATHS ${PATH_ITPP}/lib) + SET(ITPP_FOUND TRUE) + SET(ITPP_INCLUDE_DIRS ${PATH_ITPP}/include/) + GET_FILENAME_COMPONENT(ITPP_LIBRARY_DIRS ${ITPP_LIBRARY} DIRECTORY) + SET(ITPP_LIBRARIES_RELEASE libitpp.so) + ELSE() + pkg_check_modules(ITPP itpp) + ENDIF() +ENDIF(UNIX) + +IF(ITPP_FOUND) + OV_PRINT(OV_PRINTED " Found it++...") + SET(ITPP_LOADING_FAILURE FALSE) + INCLUDE_DIRECTORIES(${ITPP_INCLUDE_DIRS}) + ADD_DEFINITIONS(${ITPP_CFLAGS}) + ADD_DEFINITIONS(${ITPP_CFLAGS_OTHERS}) + # LINK_DIRECTORIES(${ITPP_LIBRARY_DIRS}) + FOREACH(ITPP_LIB ${ITPP_LIBRARIES}) + SET(ITPP_LIB1 "ITPP_LIB1-NOTFOUND") + FIND_LIBRARY(ITPP_LIB1 NAMES ${ITPP_LIB} PATHS ${ITPP_LIBRARY_DIRS} ${ITPP_LIBDIR} NO_DEFAULT_PATH) + IF(ITPP_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${ITPP_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${ITPP_LIB1}) + IF(WIN32) + INSTALL(FILES "${ITPP_LIBRARY_DIRS}/../bin/${ITPP_LIB}.dll" DESTINATION "${DIST_BINDIR}") + ENDIF() + ELSE() + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${ITPP_LIB}") + SET(ITPP_LOADING_FAILURE TRUE) + ENDIF() + ENDFOREACH() + FOREACH(ITPP_LIB ${ITPP_LIBRARIES_RELEASE}) + SET(ITPP_LIB1 "ITPP_LIB1-RELEASE-NOTFOUND") + FIND_LIBRARY(ITPP_LIB1 NAMES ${ITPP_LIB} PATHS ${ITPP_LIBRARY_DIRS} ${ITPP_LIBDIR} NO_DEFAULT_PATH) + IF(ITPP_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${ITPP_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} optimized ${ITPP_LIB1}) + IF(WIN32) + INSTALL(FILES "${ITPP_LIBRARY_DIRS}/../bin/${ITPP_LIB}.dll" DESTINATION "${DIST_BINDIR}" CONFIGURATIONS Release) + ENDIF() + ELSE() + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${ITPP_LIB}") + SET(ITPP_LOADING_FAILURE TRUE) + ENDIF() + ENDFOREACH() + FOREACH(ITPP_LIB ${ITPP_LIBRARIES_DEBUG}) + SET(ITPP_LIB1 "ITPP_LIB1-DEBUG-NOTFOUND") + FIND_LIBRARY(ITPP_LIB1 NAMES ${ITPP_LIB} PATHS ${ITPP_LIBRARY_DIRS} ${ITPP_LIBDIR} NO_DEFAULT_PATH) + IF(ITPP_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${ITPP_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${ITPP_LIB1}) + IF(WIN32) + INSTALL(FILES "${ITPP_LIBRARY_DIRS}/../bin/${ITPP_LIB}.dll" DESTINATION "${DIST_BINDIR}" CONFIGURATIONS Debug) + ENDIF() + ELSE() + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${ITPP_LIB}") + SET(ITPP_LOADING_FAILURE TRUE) + ENDIF() + ENDFOREACH() + + # We only add ITPP if everything was found + IF(NOT ITPP_LOADING_FAILURE) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyITPP) + ENDIF() + +ELSE(ITPP_FOUND) + OV_PRINT(OV_PRINTED " FAILED to find it++...") +ENDIF() + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyITPP "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyLSL.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyLSL.cmake new file mode 100644 index 0000000..c229f97 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyLSL.cmake @@ -0,0 +1,72 @@ +# --------------------------------- +# Finds LabStreamingLayer (LSL) library +# +# Sets LSL_FOUND +# Sets LSL_INCLUDE_DIRS +# Sets LSL_LIBRARY_DIRS +# Sets LSL_LIBRARIES_RELEASE +# +# Adds library to target +# Adds include path +# +# Script @author Jussi T. Lindgren / Inria +# +# @note On Windows, trying to use the debug library of LSL 1.12 in the same way we did with LSL 1.04 +# caused an obscure Windows error code when launching the linking app. To sidestep, we use only the +# LSL release build library for now. To enable the debug lib, the following might be needed on Win +# in addition to linking the debug lib (but did not seem to be sufficient to make it work): +# SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DLSL_DEBUG_BINDINGS") +# +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyLSL) + +# The first ${..}/liblsl path is for Windows, the second ${..}/ for Linux +FIND_PATH(PATH_LSL include/lsl_cpp.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES . liblsl NO_DEFAULT_PATH) +FIND_PATH(PATH_LSL include/lsl_cpp.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES . liblsl) + +IF(PATH_LSL) + SET(LSL_FOUND TRUE) + SET(LSL_INCLUDE_DIRS ${PATH_LSL}/include/) + SET(LSL_LIBRARY_DIRS ${PATH_LSL}/lib/) + IF(WIN32) + IF("${PLATFORM_TARGET}" STREQUAL "x64") + SET(LSL_LIBRARIES_RELEASE liblsl64.lib) + SET(LSL_LIBRARIES_RELEASE_DLL liblsl64.dll) + ELSE() + SET(LSL_LIBRARIES_RELEASE liblsl32.lib) + SET(LSL_LIBRARIES_RELEASE_DLL liblsl32.dll) + ENDIF() + ELSEIF(UNIX) + SET(LSL_LIBRARIES_RELEASE liblsl.so) + ENDIF() +ENDIF() + +IF(LSL_FOUND) + OV_PRINT(OV_PRINTED " Found liblsl...") + INCLUDE_DIRECTORIES(${LSL_INCLUDE_DIRS}) + + SET(LSL_LIB_REL "LSL_LIB_REL-NOTFOUND") + # OV_PRINT(OV_PRINTED "LSL: ${LSL_LIBRARIES_RELEASE} - ${LSL_LIBRARY_DIRS_RELEASE}") + FIND_LIBRARY(LSL_LIB_REL NAMES ${LSL_LIBRARIES_RELEASE} PATHS ${LSL_LIBRARY_DIRS} NO_DEFAULT_PATH) + IF(LSL_LIB_REL) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${LSL_LIB_REL}") + + TARGET_LINK_LIBRARIES(${PROJECT_NAME} optimized ${LSL_LIB_REL}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${LSL_LIB_REL}) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyLSL) + + IF(WIN32) + INSTALL(FILES "${LSL_LIBRARY_DIRS}/${LSL_LIBRARIES_RELEASE_DLL}" DESTINATION "${DIST_BINDIR}" CONFIGURATIONS Release Debug) + ENDIF() + ELSE() + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${LSL_LIB_REL}") + ENDIF() + +ELSE() + OV_PRINT(OV_PRINTED " FAILED to find liblsl (optional) ...") +ENDIF() + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyLSL "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyLiveAmpAPI.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyLiveAmpAPI.cmake new file mode 100644 index 0000000..3d146d0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyLiveAmpAPI.cmake @@ -0,0 +1,40 @@ +# /* + # * FindThirdPartyLiveAmpAPI.cmake + # * + # * Copyright (c) 2016, Brain Products GmbH. All rights reserved. + # * -- Rights transferred to Inria, contract signed ... + # * + # */ + +# --------------------------------- +# Finds LiveAmp library +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_FindThirdPartyLiveAmpAPI) + +IF(WIN32) + FIND_PATH(PATH_LiveAmpAPI Amplifier_LIB.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_brainproducts_liveamp) + IF(PATH_LiveAmpAPI) + OV_PRINT(OV_PRINTED " Found Brain Products LiveAmp API...") + INCLUDE_DIRECTORIES(${PATH_LiveAmpAPI}) + + FIND_LIBRARY(LIB_LiveAmpAPI LiveAmpLib2 PATHS ${PATH_LiveAmpAPI} ) + IF(LIB_LiveAmpAPI) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_LiveAmpAPI}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_LiveAmpAPI} ) + ELSE(LIB_LiveAmpAPI) + OV_PRINT(OV_PRINTED " [FAILED] lib LiveAmp") + ENDIF(LIB_LiveAmpAPI) + + # Copy the DLL file at install + INSTALL(PROGRAMS "${PATH_LiveAmpAPI}/LiveAmpLib2.dll" DESTINATION ${DIST_BINDIR}) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyLiveAmpAPI) + ELSE(PATH_LiveAmpAPI) + OV_PRINT(OV_PRINTED " FAILED to find Brain Products LiveAmp API (optional)") + ENDIF(PATH_LiveAmpAPI) +ENDIF(WIN32) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_FindThirdPartyLiveAmpAPI "Yes") diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyLua.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyLua.cmake new file mode 100644 index 0000000..82eca54 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyLua.cmake @@ -0,0 +1,46 @@ +# --------------------------------- +# Finds LUA +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyLua) + +IF(WIN32) + FIND_PATH(LUA_INCLUDE_DIR lua.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lua/include NO_DEFAULT_PATH) +ELSEIF(UNIX) + if(${CMAKE_SYSTEM} MATCHES fc21) + FIND_PACKAGE(Lua REQUIRED) + else () + FIND_PACKAGE(Lua51 REQUIRED) + endif() +ENDIF() + +IF(LUA_INCLUDE_DIR) + OV_PRINT(OV_PRINTED " Found Lua... in '${LUA_INCLUDE_DIR}'") + + IF(WIN32) + FIND_LIBRARY(LUA_LIBRARIES lua5.1 PATHS ${LUA_INCLUDE_DIR}/../lib NO_DEFAULT_PATH) + FIND_LIBRARY(LUA_LIBRARIES lua5.1 PATHS ${LUA_INCLUDE_DIR}/../lib) + ENDIF() + + IF(LUA_LIBRARIES) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LUA_LIBRARIES}") + + INCLUDE_DIRECTORIES(${LUA_INCLUDE_DIR}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LUA_LIBRARIES}) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyLua) + IF(WIN32) + INSTALL(FILES "${LUA_INCLUDE_DIR}/../bin/lua5.1.dll" DESTINATION "${DIST_BINDIR}") + ENDIF() + ELSE() + OV_PRINT(OV_PRINTED " [FAILED] lib lua5.1") + ENDIF() + +ELSE() + OV_PRINT(OV_PRINTED " FAILED to find Lua") +ENDIF() + + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyLua "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyMCS.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyMCS.cmake new file mode 100644 index 0000000..6542e89 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyMCS.cmake @@ -0,0 +1,21 @@ + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyMCS) + + +IF(WIN32) + FIND_PATH(PATH_MCS nvxmcs.dll PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_mcs/lib NO_DEFAULT_PATH) +ENDIF(WIN32) + +IF(PATH_MCS) + OV_PRINT(OV_PRINTED " Found MCS device SDK...") + INCLUDE_DIRECTORIES(${PATH_MCS}/../include/) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PATH_MCS}/nvxmcs.lib) + + INSTALL(PROGRAMS "${PATH_MCS}/nvxmcs.dll" DESTINATION ${DIST_BINDIR}) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyMCS) +ELSE(PATH_MCS) + OV_PRINT(OV_PRINTED " FAILED to find MCS device SDK (optional driver)") +ENDIF(PATH_MCS) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyMCS "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyMatlab.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyMatlab.cmake new file mode 100644 index 0000000..ecc0310 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyMatlab.cmake @@ -0,0 +1,116 @@ +# --------------------------------- +# Finds Matlab toolkit +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyMatlab) + +# Clear cached variables, otherwise repeated builds lead to trouble +SET(Matlab_EXECUTABLE "Matlab_EXECUTABLE-NOTFOUND") +SET(Matlab_INCLUDE "Matlab_INCLUDE-NOTFOUND") +SET(Matlab_ROOT "Matlab_ROOT-NOTFOUND") + +# See if we can locate the matlab executable +IF (WIN32) + # Unfortunately there doesn't seem to be a neat way to discover both 32 and 64bit matlabs + IF("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + SET(MATLAB_PATHS "C:/Program Files/MATLAB/r2015b/bin") + ELSEIF("${CMAKE_SIZEOF_VOID_P}" EQUAL "4") + SET(MATLAB_PATHS "C:/Program Files (x86)/MATLAB/r2013b/bin") + ELSE() + SET(MATLAB_PATHS "") + ENDIF() + + # Ignore path on the first call, if that fails, try defaults + FIND_PROGRAM(Matlab_EXECUTABLE MATLAB PATHS ${MATLAB_PATHS} NO_DEFAULT_PATH) + FIND_PROGRAM(Matlab_EXECUTABLE MATLAB) +ENDIF(WIN32) +IF (UNIX) + FIND_PROGRAM(Matlab_EXECUTABLE matlab) + + IF(NOT Matlab_EXECUTABLE) + # Alternative way to try to find matlab + FILE(GLOB_RECURSE Executable_Candidates1 "/usr/local/matlab*/matlab") + FILE(GLOB_RECURSE Executable_Candidates2 "/usr/local/MATLAB*/matlab") + SET(Executable_Candidates ${Executable_Candidates1} ${Executable_Candidates2}) + + IF(Executable_Candidates) + LIST(GET Executable_Candidates 0 Matlab_EXECUTABLE) + ENDIF() + ENDIF() +ENDIF(UNIX) + +# Figure out the paths to libs and includes +IF(Matlab_EXECUTABLE) + # OV_PRINT(OV_PRINTED "Have Matlab_EXECUTABLE ${Matlab_EXECUTABLE}") + # Try relative to the executable path + GET_FILENAME_COMPONENT(Matlab_ROOT ${Matlab_EXECUTABLE} PATH) + IF(Matlab_ROOT) + # OV_PRINT(OV_PRINTED "Have Matlab_ROOT ${Matlab_ROOT}") + SET(Matlab_ROOT ${Matlab_ROOT}/../) + # OV_PRINT(OV_PRINTED " -> ${Matlab_ROOT}") + FIND_PATH(Matlab_INCLUDE "mex.h" PATHS ${Matlab_ROOT}/extern/include ${Matlab_ROOT}/extern/include/extern) + ENDIF() + + # matlab executable path might have been pointing to a symbolic link elsewhere, try something else + IF((NOT Matlab_INCLUDE) AND UNIX) + EXECUTE_PROCESS(COMMAND matlab -e COMMAND grep "^MATLAB=" COMMAND sed "s/^MATLAB=//g" COMMAND tr "\n" "/" + OUTPUT_VARIABLE Matlab_ROOT) + FIND_PATH(Matlab_INCLUDE "mex.h" PATHS ${Matlab_ROOT}/extern/include ${Matlab_ROOT}/extern/include/extern) + ENDIF() + + IF(Matlab_INCLUDE) + # OV_PRINT(OV_PRINTED "Have Matlab_INCLUDE ${Matlab_INCLUDE}") + IF(UNIX) + SET(Matlab_LIBRARIES mex mx eng) + IF(CMAKE_SIZEOF_VOID_P EQUAL 4) + SET(Matlab_LIB_DIRECTORIES ${Matlab_ROOT}/bin/glnx86) + ELSE() + SET(Matlab_LIB_DIRECTORIES ${Matlab_ROOT}/bin/glnxa64) + ENDIF() + ENDIF(UNIX) + IF(WIN32) + SET(Matlab_LIBRARIES libmex libmx libeng) #mclmcrrt + IF(CMAKE_SIZEOF_VOID_P EQUAL 4) + SET(Matlab_LIB_DIRECTORIES ${Matlab_ROOT}/extern/lib/win32/microsoft) + ELSE() + SET(Matlab_LIB_DIRECTORIES ${Matlab_ROOT}/extern/lib/win64/microsoft) + ENDIF() + # for delayed importation on windows + TARGET_LINK_LIBRARIES(${PROJECT_NAME} Delayimp ) + SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/DELAYLOAD:libeng.dll /DELAYLOAD:libmx.dll") + # /DELAYLOAD:libmex.dll /DELAYLOAD:mclmcrrt.dll --> useless, no import + ENDIF(WIN32) + SET(Matlab_FOUND TRUE) + ENDIF() + +ENDIF(Matlab_EXECUTABLE) + +IF(Matlab_FOUND) + OV_PRINT(OV_PRINTED " Found Matlab in [${Matlab_ROOT}]") + SET(Matlab_LIB_FOUND TRUE) + INCLUDE_DIRECTORIES(${Matlab_INCLUDE}) + + FOREACH(Matlab_LIB ${Matlab_LIBRARIES}) + SET(Matlab_LIB1 "Matlab_LIB1-NOTFOUND") + FIND_LIBRARY(Matlab_LIB1 NAMES ${Matlab_LIB} PATHS ${Matlab_LIB_DIRECTORIES} NO_DEFAULT_PATH) + FIND_LIBRARY(Matlab_LIB1 NAMES ${Matlab_LIB}) + IF(Matlab_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${Matlab_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Matlab_LIB1}) + ELSE(Matlab_LIB1) + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${Matlab_LIB}") + SET(Matlab_LIB_FOUND FALSE) + ENDIF(Matlab_LIB1) + ENDFOREACH(Matlab_LIB) + IF(Matlab_LIB_FOUND) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyMatlab) + ELSE(Matlab_LIB_FOUND) + OV_PRINT(OV_PRINTED " FAILED to find Matlab Libs, the plugins won't be built. You need a valid MATLAB installation, bitness matching platform target ${PLATFORM_TARGET}.") + ENDIF(Matlab_LIB_FOUND) +ELSE() + OV_PRINT(OV_PRINTED " FAILED to find Matlab (optional) ...") +ENDIF() + + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyMatlab "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyMensiaAcquisition.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyMensiaAcquisition.cmake new file mode 100644 index 0000000..9250499 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyMensiaAcquisition.cmake @@ -0,0 +1,20 @@ + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyMensiaAcquisition) + + +IF(WIN32) + FIND_PATH(PATH_MENSIA openvibe-driver-mensia-acquisition.dll PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_mensia_acquisition_driver NO_DEFAULT_PATH) +ENDIF(WIN32) + +IF(PATH_MENSIA) + OV_PRINT(OV_PRINTED " Found Mensia Acquisition driver...") + + INSTALL(DIRECTORY "${PATH_MENSIA}/" DESTINATION "${DIST_BINDIR}/" FILES_MATCHING PATTERN "*.dll") + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyMensiaAcquisition) +ELSE(PATH_MENSIA) + OV_PRINT(OV_PRINTED " FAILED to find Mensia Acquisition driver (optional driver)") +ENDIF(PATH_MENSIA) + + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyMensiaAcquisition "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyMicromed.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyMicromed.cmake new file mode 100644 index 0000000..f29b6b8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyMicromed.cmake @@ -0,0 +1,26 @@ + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyMicromed) + + +IF(WIN32) + FIND_PATH(PATH_MICROMED_RELEASE dllMicromed.dll PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_micromed/Release NO_DEFAULT_PATH) + FIND_PATH(PATH_MICROMED_DEBUG dllMicromed.dll PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_micromed/Debug NO_DEFAULT_PATH) +ENDIF(WIN32) + +IF(PATH_MICROMED_RELEASE AND PATH_MICROMED_DEBUG) + OV_PRINT(OV_PRINTED " Found Micromed dll...") + + OV_PRINT(OV_PRINTED " [ OK ] dll ${PATH_MICROMED_RELEASE}/dllMicromed.dll") + OV_PRINT(OV_PRINTED " [ OK ] dll ${PATH_MICROMED_DEBUG}/dllMicromed.dll") + + INSTALL(PROGRAMS "${PATH_MICROMED_RELEASE}/dllMicromed.dll" DESTINATION ${DIST_BINDIR} CONFIGURATIONS Release Optimized) + INSTALL(PROGRAMS "${PATH_MICROMED_DEBUG}/dllMicromed.dll" DESTINATION ${DIST_BINDIR} CONFIGURATIONS Debug) + INSTALL(PROGRAMS "${PATH_MICROMED_DEBUG}/dllMicromed.pdb" DESTINATION ${DIST_BINDIR} CONFIGURATIONS Debug) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyMicromed) +ELSE(PATH_MICROMED_RELEASE AND PATH_MICROMED_DEBUG) + OV_PRINT(OV_PRINTED " FAILED to find Micromed device dlls (optional driver)") +ENDIF(PATH_MICROMED_RELEASE AND PATH_MICROMED_DEBUG) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyMicromed "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyMitsar.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyMitsar.cmake new file mode 100644 index 0000000..c6debb4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyMitsar.cmake @@ -0,0 +1,19 @@ + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyMitsar) + + +IF(WIN32) + FIND_PATH(PATH_MITSAR MitsarDll.dll PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_mitsar NO_DEFAULT_PATH) +ENDIF(WIN32) + +IF(PATH_MITSAR) + OV_PRINT(OV_PRINTED " Found Mitsar dll...") + + INSTALL(PROGRAMS "${PATH_MITSAR}/MitsarDll.dll" DESTINATION ${DIST_BINDIR}) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyMitsar) +ELSE(PATH_MITSAR) + OV_PRINT(OV_PRINTED " FAILED to find Mitsar device dll (optional driver)") +ENDIF(PATH_MITSAR) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyMitsar "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyNeXus.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyNeXus.cmake new file mode 100644 index 0000000..46d66f5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyNeXus.cmake @@ -0,0 +1,19 @@ + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyNeXus) + + +IF(WIN32) + FIND_PATH(PATH_NEXUS NeXusDll.dll PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_nexus NO_DEFAULT_PATH) +ENDIF(WIN32) + +IF(PATH_NEXUS) + OV_PRINT(OV_PRINTED " Found MindMedia NeXus dll...") + + INSTALL(PROGRAMS "${PATH_NEXUS}/NeXusDll.dll" "${PATH_NEXUS}/RTInst.dll" DESTINATION ${DIST_BINDIR}) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyNeXus) +ELSE(PATH_NEXUS) + OV_PRINT(OV_PRINTED " FAILED to find MindMedia NeXus device dll (optional driver)") +ENDIF(PATH_NEXUS) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyNeXus "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyNeuroServoDeps.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyNeuroServoDeps.cmake new file mode 100644 index 0000000..ce9cffc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyNeuroServoDeps.cmake @@ -0,0 +1,40 @@ +# --------------------------------- +# Finds third party libs for NeuroServo driver +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyNeuroServoDeps) + +IF(WIN32) + + FIND_LIBRARY(LIB_STANDARD_MODULE_HID hid) + FIND_LIBRARY(LIB_STANDARD_MODULE_SETUPAPI SetupApi) + + IF(LIB_STANDARD_MODULE_HID AND LIB_STANDARD_MODULE_SETUPAPI) + OV_PRINT(OV_PRINTED " Found NeuroServo driver dependencies ...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_HID}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_SETUPAPI}) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyNeuroServo) + ELSE(LIB_STANDARD_MODULE_HID AND LIB_STANDARD_MODULE_SETUPAPI) + OV_PRINT(OV_PRINTED " FAILED to find NeuroServo HID driver dependencies (optional driver) ...") + ENDIF(LIB_STANDARD_MODULE_HID AND LIB_STANDARD_MODULE_SETUPAPI) + + IF(LIB_STANDARD_MODULE_HID) + OV_PRINT(OV_PRINTED " [ OK ] HID library ${LIB_STANDARD_MODULE_HID}...") + ELSE(LIB_STANDARD_MODULE_HID) + OV_PRINT(OV_PRINTED " [FAILED] to find HID library...") + ENDIF(LIB_STANDARD_MODULE_HID) + + IF(LIB_STANDARD_MODULE_SETUPAPI) + OV_PRINT(OV_PRINTED " [ OK ] SetupApi library ${LIB_STANDARD_MODULE_SETUPAPI}...") + ELSE(LIB_STANDARD_MODULE_SETUPAPI) + OV_PRINT(OV_PRINTED " [FAILED] to find SetupApi library...") + ENDIF(LIB_STANDARD_MODULE_SETUPAPI) + + +ENDIF(WIN32) + + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyNeuroServoDeps "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyNeuroelectricsEnobio3G.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyNeuroelectricsEnobio3G.cmake new file mode 100644 index 0000000..e16dc18 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyNeuroelectricsEnobio3G.cmake @@ -0,0 +1,85 @@ +# --------------------------------- +# Finds the ENOBIO API & library +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyNeuroelectricsEnobio3G) + +IF(WIN32) + FIND_PATH(PATH_ENOBIOAPI enobio3g.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_enobio3g/enobio3g) + IF(NOT PATH_ENOBIOAPI) + OV_PRINT(OV_PRINTED " FAILED to find ENOBIO API (optional driver) - cmake looked in '${LIST_DEPENDENCIES_PATH}', skipping Enobio.") + RETURN() + ENDIF(NOT PATH_ENOBIOAPI) + + OV_PRINT(OV_PRINTED " Found ENOBIO API...") + + FIND_LIBRARY(LIB_ENOBIOAPI Enobio3GAPI PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_enobio3g/MSVC) + IF(NOT LIB_ENOBIOAPI) + OV_PRINT(OV_PRINTED " [FAILED] Enobio libs not found, skipping Enobio.") + RETURN() + ENDIF(NOT LIB_ENOBIOAPI) + + INCLUDE_DIRECTORIES("${PATH_ENOBIOAPI}") + INSTALL(DIRECTORY "${PATH_ENOBIOAPI}/../MSVC/" DESTINATION "${DIST_BINDIR}/" FILES_MATCHING PATTERN "*.dll") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_ENOBIOAPI} ) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyEnobioAPI) + + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_ENOBIOAPI}") + +ENDIF(WIN32) + +# For now, the Linux building of Enobio3G is disabled as it has not been tested with a recent Neuroelectrics lib. +IF(UNIX) + OV_PRINT(OV_PRINTED " Skipped Enobio3G, its work in progress.") + RETURN() +ENDIF(UNIX) + +IF(UNIX) + SET(QTCORE_INCLUDE_PREFIX /usr/share/qt4/include/) + SET(QTCORE_LIB_PREFIX /usr/lib/x86_64-linux-gnu/) + + FIND_PATH(PATH_ENOBIOAPI enobio3g.h PATHS $ENV{OpenViBE_dependencies} ${OV_BASE_DIR}/contrib/plugins/server-drivers/enobio3G/Enobio3GAPI.linux/) + IF(PATH_ENOBIOAPI) + OV_PRINT(OV_PRINTED " Found ENOBIO API...") + INCLUDE_DIRECTORIES(${PATH_ENOBIOAPI}) + FIND_PATH(PATH_QTCORE_INCLUDE QtCore/QtCore ${QTCORE_INCLUDE_PREFIX}) + IF(PATH_QTCORE_INCLUDE) + OV_PRINT(OV_PRINTED " [ OK ] QtCore include ${PATH_QTCORE_INCLUDE}/") + INCLUDE_DIRECTORIES(${PATH_QTCORE_INCLUDE}/) + ELSE(PATH_QTCORE_INCLUDE) + OV_PRINT(OV_PRINTED " FAILED TO FIND QtCore include PATH") + ENDIF(PATH_QTCORE_INCLUDE) + FIND_LIBRARY(LIB_ENOBIOAPI Enobio3GAPI PATHS ${PATH_ENOBIOAPI}/libs/ ) + IF(LIB_ENOBIOAPI) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_ENOBIOAPI}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_ENOBIOAPI} ) + ELSE(LIB_ENOBIOAPI) + OV_PRINT(OV_PRINTED " [FAILED] lib ENOBIO") + ENDIF(LIB_ENOBIOAPI) + + FIND_LIBRARY(LIB_QT QtCore ${QTCORE_LIB_PREFIX}) + IF(LIB_QT) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_QT}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} -L${LIB_QT} -lQtCore) + ELSE(LIB_QT) + OV_PRINT(OV_PRINTED " [ FAILED ] lib QT ${QTCORE_LIB_PREFIX}") + ENDIF(LIB_QT) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyEnobioAPI) + + # Copying the DLL file at postbuild + ADD_CUSTOM_COMMAND( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS -E copy "${LIB_ENOBIOAPI}" "${PROJECT_SOURCE_DIR}/bin" + COMMENT " ---> Copying lib file ${LIB_ENOBIOAPI} for the Neuroelectrics Enobio driver." + VERBATIM) + ELSE(PATH_ENOBIOAPI) + OV_PRINT(OV_PRINTED " FAILED to find ENOBIO API - cmake looked in $ENV{OpenViBE_dependencies} and in ${OV_BASE_DIR}/contrib/plugins/server-drivers/enobio3G/Enobio3GAPI/") + ENDIF(PATH_ENOBIOAPI) +ENDIF(UNIX) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyNeuroelectricsEnobio3G "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyOgre3D.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyOgre3D.cmake new file mode 100644 index 0000000..5db7e7b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyOgre3D.cmake @@ -0,0 +1,113 @@ +# --------------------------------- +# Finds Ogre3D toolkit +# +# Sets Ogre3D_FOUND +# Sets Ogre3D_LIBRARIES +# Sets Ogre3D_LIBRARY_DIRS +# Sets Ogre3D_LDFLAGS +# Sets Ogre3D_LDFLAGS_OTHERS +# Sets Ogre3D_INCLUDE_DIRS +# Sets Ogre3D_CFLAGS +# Sets Ogre3D_CFLAGS_OTHERS +# +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyOgre3D) + +IF(OV_DISABLE_OGRE) + OV_PRINT(OV_PRINTED " SKIPPED Ogre3D/OIS, disabled, no 3D ...") + RETURN() +ENDIF(OV_DISABLE_OGRE) + +IF(WIN32) + FIND_PATH(PATH_Ogre3D include/OGRE/Ogre.h PATHS ${LIST_DEPENDENCIES_PATH} $ENV{OGRE_HOME} PATH_SUFFIXES ogre .) + IF(PATH_Ogre3D) + SET(Ogre3D_FOUND TRUE) + SET(OIS_FOUND TRUE) + SET(Ogre3D_INCLUDE_DIRS ${PATH_Ogre3D}/include/OGRE ${PATH_Ogre3D}/include/OIS) + + # Currently the different versions we package for different VS have a bit different libs... + STRING(REGEX MATCH "vc100.*" MSVC_VER100 ${MSVC_SERVICE_PACK}) + STRING(REGEX MATCH "vc120.*" MSVC_VER120 ${MSVC_SERVICE_PACK}) + IF(MSVC_VER100) + SET(Ogre3D_LIBRARIES_RELEASE OgreMain OIS) + SET(Ogre3D_LIBRARIES_DEBUG OgreMain_d OIS_d) + SET(Ogre3D_LIBRARY_DIRS_DEBUG ${PATH_Ogre3D}/lib/Debug) + ENDIF(MSVC_VER100) + IF(MSVC_VER120) + SET(Ogre3D_LIBRARIES_RELEASE OgreMain OgreOverlay OIS) + SET(Ogre3D_LIBRARIES_DEBUG OgreMain_d OgreOverlay_d OIS_d) + ENDIF(MSVC_VER120) + + SET(Ogre3D_LIBRARY_DIRS_DEBUG ${PATH_Ogre3D}/lib/Debug) + SET(Ogre3D_LIBRARY_DIRS_RELEASE ${PATH_Ogre3D}/lib/Release) + ENDIF(PATH_Ogre3D) +ENDIF(WIN32) + +IF(UNIX) + INCLUDE("FindThirdPartyPkgConfig") + pkg_check_modules(Ogre3D OGRE) + pkg_check_modules(OIS OIS) +ENDIF(UNIX) + +IF(Ogre3D_FOUND AND OIS_FOUND) + OV_PRINT(OV_PRINTED " Found Ogre3D/OIS...") + INCLUDE_DIRECTORIES(${OIS_INCLUDE_DIRS} ${Ogre3D_INCLUDE_DIRS}) + ADD_DEFINITIONS(${OIS_CFLAGS} ${Ogre3D_CFLAGS}) + ADD_DEFINITIONS(${OIS_CFLAGS_OTHERS} ${Ogre3D_CFLAGS_OTHERS}) + # OV_PRINT(OV_PRINTED "A ${OIS_CFLAGS} ${Ogre3D_CFLAGS} B ${OIS_CFLAGS_OTHERS} ${Ogre3D_CFLAGS_OTHERS} C ${Ogre3D_LIBRARIES_RELEASE} D ${Ogre3D_LIBRARIES_DEBUG}") + + IF(UNIX) + IF(Ogre3D_VERSION VERSION_EQUAL "1.9.0" OR Ogre3D_VERSION VERSION_GREATER "1.9.0") + SET(Ogre3D_LIBRARIES "${Ogre3_LIBRARIES};OgreOverlay") + ENDIF(Ogre3D_VERSION VERSION_EQUAL "1.9.0" OR Ogre3D_VERSION VERSION_GREATER "1.9.0") + + FOREACH(Ogre3D_LIB ${Ogre3D_LIBRARIES} ${OIS_LIBRARIES}) + SET(Ogre3D_LIB1 "Ogre3D_LIB1-NOTFOUND") + FIND_LIBRARY(Ogre3D_LIB1 NAMES ${Ogre3D_LIB} PATHS ${Ogre3D_LIBRARY_DIRS} ${Ogre3D_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(Ogre3D_LIB1 NAMES ${Ogre3D_LIB}) + IF(Ogre3D_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${Ogre3D_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Ogre3D_LIB1}) + ELSE(Ogre3D_LIB1) + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${Ogre3D_LIB}") + ENDIF(Ogre3D_LIB1) + ENDFOREACH(Ogre3D_LIB) + ENDIF(UNIX) + IF(WIN32) + FOREACH(Ogre3D_LIB ${Ogre3D_LIBRARIES_RELEASE}) + SET(Ogre3D_LIB1 "Ogre3D_LIB1-NOTFOUND") + FIND_LIBRARY(Ogre3D_LIB1 NAMES ${Ogre3D_LIB} PATHS ${Ogre3D_LIBRARY_DIRS_RELEASE} ${Ogre3D_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(Ogre3D_LIB1 NAMES ${Ogre3D_LIB}) + IF(Ogre3D_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${Ogre3D_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} optimized ${Ogre3D_LIB1}) + ELSE(Ogre3D_LIB1) + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${Ogre3D_LIB}") + ENDIF(Ogre3D_LIB1) + ENDFOREACH(Ogre3D_LIB) + + FOREACH(Ogre3D_LIB ${Ogre3D_LIBRARIES_DEBUG}) + SET(Ogre3D_LIB1 "Ogre3D_LIB1-NOTFOUND") + FIND_LIBRARY(Ogre3D_LIB1 NAMES ${Ogre3D_LIB} PATHS ${Ogre3D_LIBRARY_DIRS_DEBUG} ${Ogre3D_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(Ogre3D_LIB1 NAMES ${Ogre3D_LIB}) + IF(Ogre3D_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${Ogre3D_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${Ogre3D_LIB1}) + ELSE(Ogre3D_LIB1) + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${Ogre3D_LIB}") + ENDIF(Ogre3D_LIB1) + ENDFOREACH(Ogre3D_LIB) + ENDIF(WIN32) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyOgre3D) +ELSE(Ogre3D_FOUND AND OIS_FOUND) + OV_PRINT(OV_PRINTED " FAILED to find Ogre3D/OIS...") +ENDIF(Ogre3D_FOUND AND OIS_FOUND) + + + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyOgre3D "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyOgre3DTerrain.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyOgre3DTerrain.cmake new file mode 100644 index 0000000..faabdfc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyOgre3DTerrain.cmake @@ -0,0 +1,99 @@ +# --------------------------------- +# Finds Ogre3DTerrain toolkit +# +# Sets Ogre3DTerrain_FOUND +# Sets Ogre3DTerrain_LIBRARIES +# Sets Ogre3DTerrain_LIBRARY_DIRS +# Sets Ogre3DTerrain_LDFLAGS +# Sets Ogre3DTerrain_LDFLAGS_OTHERS +# Sets Ogre3DTerrain_INCLUDE_DIRS +# Sets Ogre3DTerrain_CFLAGS +# Sets Ogre3DTerrain_CFLAGS_OTHERS +# +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyOgre3DTerrain) + +IF(OV_DISABLE_OGRE) + OV_PRINT(OV_PRINTED " SKIPPED Ogre3D (Terrain), disabled, no 3D ...") + RETURN() +ENDIF(OV_DISABLE_OGRE) + +IF(WIN32) + FIND_PATH(PATH_Ogre3DTerrain include/OGRE/Ogre.h PATHS ${LIST_DEPENDENCIES_PATH} $ENV{OGRE_HOME} PATH_SUFFIXES ogre .) + IF(PATH_Ogre3DTerrain) + SET(Ogre3DTerrain_FOUND TRUE) + SET(OIS_FOUND TRUE) + SET(Ogre3DTerrain_INCLUDE_DIRS ${PATH_Ogre3DTerrain}/include/OGRE ${PATH_Ogre3DTerrain}/include/OIS) + + SET(Ogre3DTerrain_LIBRARIES_RELEASE OgreMain OIS) + SET(Ogre3DTerrain_LIBRARY_DIRS_RELEASE ${PATH_Ogre3DTerrain}/lib/Release) + + SET(Ogre3DTerrain_LIBRARIES_DEBUG OgreMain_d OIS_d) + SET(Ogre3DTerrain_LIBRARY_DIRS_DEBUG ${PATH_Ogre3DTerrain}/lib/Debug) + ENDIF(PATH_Ogre3DTerrain) +ENDIF(WIN32) + +IF(UNIX) + INCLUDE("FindThirdPartyPkgConfig") + pkg_check_modules(Ogre3DTerrain OGRE-Terrain) + pkg_check_modules(OIS OIS) +ENDIF(UNIX) + +IF(Ogre3DTerrain_FOUND AND OIS_FOUND) + OV_PRINT(OV_PRINTED " Found Ogre3DTerrain/OIS...") + INCLUDE_DIRECTORIES(${OIS_INCLUDE_DIRS} ${Ogre3DTerrain_INCLUDE_DIRS}) + ADD_DEFINITIONS(${OIS_CFLAGS} ${Ogre3DTerrain_CFLAGS}) + ADD_DEFINITIONS(${OIS_CFLAGS_OTHERS} ${Ogre3DTerrain_CFLAGS_OTHERS}) + # OV_PRINT(OV_PRINTED "A ${OIS_CFLAGS} ${Ogre3DTerrain_CFLAGS} B ${OIS_CFLAGS_OTHERS} ${Ogre3DTerrain_CFLAGS_OTHERS} C ${Ogre3DTerrain_LIBRARIES_RELEASE} D ${Ogre3DTerrain_LIBRARIES_DEBUG}") + + IF(UNIX) + FOREACH(Ogre3DTerrain_LIB ${Ogre3DTerrain_LIBRARIES} ${OIS_LIBRARIES}) + SET(Ogre3DTerrain_LIB1 "Ogre3DTerrain_LIB1-NOTFOUND") + FIND_LIBRARY(Ogre3DTerrain_LIB1 NAMES ${Ogre3DTerrain_LIB} PATHS ${Ogre3DTerrain_LIBRARY_DIRS} ${Ogre3DTerrain_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(Ogre3DTerrain_LIB1 NAMES ${Ogre3DTerrain_LIB}) + IF(Ogre3DTerrain_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${Ogre3DTerrain_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Ogre3DTerrain_LIB1}) + ELSE(Ogre3DTerrain_LIB1) + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${Ogre3DTerrain_LIB}") + ENDIF(Ogre3DTerrain_LIB1) + ENDFOREACH(Ogre3DTerrain_LIB) + ENDIF(UNIX) + IF(WIN32) + FOREACH(Ogre3DTerrain_LIB ${Ogre3DTerrain_LIBRARIES_RELEASE}) + SET(Ogre3DTerrain_LIB1 "Ogre3DTerrain_LIB1-NOTFOUND") + FIND_LIBRARY(Ogre3DTerrain_LIB1 NAMES ${Ogre3DTerrain_LIB} PATHS ${Ogre3DTerrain_LIBRARY_DIRS_RELEASE} ${Ogre3DTerrain_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(Ogre3DTerrain_LIB1 NAMES ${Ogre3DTerrain_LIB}) + IF(Ogre3DTerrain_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${Ogre3DTerrain_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} optimized ${Ogre3DTerrain_LIB1}) + ELSE(Ogre3DTerrain_LIB1) + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${Ogre3DTerrain_LIB}") + ENDIF(Ogre3DTerrain_LIB1) + ENDFOREACH(Ogre3DTerrain_LIB) + + FOREACH(Ogre3DTerrain_LIB ${Ogre3DTerrain_LIBRARIES_DEBUG}) + SET(Ogre3DTerrain_LIB1 "Ogre3DTerrain_LIB1-NOTFOUND") + FIND_LIBRARY(Ogre3DTerrain_LIB1 NAMES ${Ogre3DTerrain_LIB} PATHS ${Ogre3DTerrain_LIBRARY_DIRS_DEBUG} ${Ogre3DTerrain_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(Ogre3DTerrain_LIB1 NAMES ${Ogre3DTerrain_LIB}) + IF(Ogre3DTerrain_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${Ogre3DTerrain_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${Ogre3DTerrain_LIB1}) + ELSE(Ogre3DTerrain_LIB1) + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${Ogre3DTerrain_LIB}") + ENDIF(Ogre3DTerrain_LIB1) + ENDFOREACH(Ogre3DTerrain_LIB) + ENDIF(WIN32) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyOgre3DTerrain) +ELSE(Ogre3DTerrain_FOUND AND OIS_FOUND) + OV_PRINT(OV_PRINTED " FAILED to find Ogre3DTerrain/OIS...") +ENDIF(Ogre3DTerrain_FOUND AND OIS_FOUND) + + + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyOgre3DTerrain "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyOpenAL.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyOpenAL.cmake new file mode 100644 index 0000000..1d90f07 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyOpenAL.cmake @@ -0,0 +1,188 @@ +# --------------------------------- +# Finds OpenAL, ALUT, OGGVORBIS +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyOpenAL) + +IF(WIN32) + FIND_PATH(PATH_OPENAL include/al.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES openal . NO_DEFAULT_PATH) + FIND_PATH(PATH_ALUT include/AL/alut.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES freealut .) + FIND_PATH(PATH_OGG include/ogg/ogg.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES libogg .) + FIND_PATH(PATH_VORBIS include/vorbis/vorbisfile.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES libvorbis .) + + SET(BUILDTYPE_PATH_DEBUG "debug") + SET(BUILDTYPE_PATH_RELEASE "release") + + IF(PATH_OPENAL) + OV_PRINT(OV_PRINTED " Found OpenAL...") + IF("${PLATFORM_TARGET}" STREQUAL "x64") + SET(OPENAL_SUBDIR "Win64") + ELSE() + SET(OPENAL_SUBDIR "Win32") + ENDIF() + FIND_LIBRARY(LIB_OPENAL OpenAL32 PATHS ${PATH_OPENAL}/libs/${OPENAL_SUBDIR}/ NO_DEFAULT_PATH) + IF(LIB_OPENAL) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_OPENAL}") + INSTALL(DIRECTORY "${PATH_OPENAL}/libs/${OPENAL_SUBDIR}/" DESTINATION "${DIST_BINDIR}/" FILES_MATCHING PATTERN "*.dll" PATTERN "EFX*" EXCLUDE) + ELSE(LIB_OPENAL) + OV_PRINT(OV_PRINTED " [FAILED] lib OpenAL32") + SET(OPENAL_MISSED_SOMETHING YES) + ENDIF(LIB_OPENAL) + ELSE(PATH_OPENAL) + OV_PRINT(OV_PRINTED " FAILED to find OpenAL32") + SET(OPENAL_MISSED_SOMETHING YES) + ENDIF(PATH_OPENAL) + + IF(PATH_ALUT) + FIND_LIBRARY(LIB_ALUT alut PATHS ${PATH_ALUT}/lib NO_DEFAULT_PATH) + IF(LIB_ALUT) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_ALUT}") + INSTALL(DIRECTORY "${PATH_ALUT}/lib/" DESTINATION "${DIST_BINDIR}/" FILES_MATCHING PATTERN "*.dll") + ELSE(LIB_ALUT) + OV_PRINT(OV_PRINTED " [FAILED] lib alut") + SET(OPENAL_MISSED_SOMETHING YES) + ENDIF(LIB_ALUT) + ELSE(PATH_ALUT) + OV_PRINT(OV_PRINTED " -- FAILED to find ALUT") + SET(OPENAL_MISSED_SOMETHING YES) + ENDIF(PATH_ALUT) + + IF(PATH_OGG) + FIND_LIBRARY(LIB_OGG_RELEASE libogg PATHS ${PATH_OGG}/win32/lib/${BUILDTYPE_PATH_RELEASE} NO_DEFAULT_PATH) + IF(LIB_OGG_RELEASE) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_OGG_RELEASE} (release)") + # We only have release OpenAL, so we have to include release version for libogg, and libvorbis + INSTALL(DIRECTORY "${PATH_OGG}/win32/bin/${BUILDTYPE_PATH_RELEASE}/" DESTINATION "${DIST_BINDIR}/") # CONFIGURATIONS Release) + ELSE(LIB_OGG_RELEASE) + OV_PRINT(OV_PRINTED " [FAILED] lib ogg (release)") + SET(OPENAL_MISSED_SOMETHING YES) + ENDIF(LIB_OGG_RELEASE) + + FIND_LIBRARY(LIB_OGG_DEBUG libogg PATHS ${PATH_OGG}/win32/lib/${BUILDTYPE_PATH_DEBUG} NO_DEFAULT_PATH) + IF(LIB_OGG_DEBUG) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_OGG_DEBUG} (debug)") + # INSTALL(DIRECTORY "${PATH_OGG}/win32/bin/${BUILDTYPE_PATH_DEBUG}/" DESTINATION "${DIST_BINDIR}/" CONFIGURATIONS Debug) + ELSE(LIB_OGG_DEBUG) + OV_PRINT(OV_PRINTED " [FAILED] lib ogg (debug)") + SET(OPENAL_MISSED_SOMETHING YES) + ENDIF(LIB_OGG_DEBUG) + ELSE(PATH_OGG) + OV_PRINT(OV_PRINTED " -- FAILED to find OGG") + SET(OPENAL_MISSED_SOMETHING YES) + ENDIF(PATH_OGG) + + IF(PATH_VORBIS) + FIND_LIBRARY(LIB_VORBIS_RELEASE libvorbis PATHS ${PATH_VORBIS}/win32/lib/${BUILDTYPE_PATH_RELEASE} NO_DEFAULT_PATH) + IF(LIB_VORBIS_RELEASE) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_VORBIS_RELEASE} (release)") + INSTALL(FILES "${PATH_VORBIS}/win32/bin/${BUILDTYPE_PATH_RELEASE}/libvorbis.dll" DESTINATION "${DIST_BINDIR}") # CONFIGURATIONS Release) + ELSE(LIB_VORBIS_RELEASE) + OV_PRINT(OV_PRINTED " [FAILED] lib vorbis (release)") + SET(OPENAL_MISSED_SOMETHING YES) + ENDIF(LIB_VORBIS_RELEASE) + + FIND_LIBRARY(LIB_VORBIS_DEBUG libvorbis PATHS ${PATH_VORBIS}/win32/lib/${BUILDTYPE_PATH_DEBUG} NO_DEFAULT_PATH) + IF(LIB_VORBIS_DEBUG) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_VORBIS_DEBUG} (debug)") + # INSTALL(FILES "${PATH_VORBIS}/win32/bin/${BUILDTYPE_PATH_DEBUG}/libvorbis.dll" DESTINATION "${DIST_BINDIR}" CONFIGURATIONS Debug) + ELSE(LIB_VORBIS_DEBUG) + OV_PRINT(OV_PRINTED " [FAILED] lib vorbis (debug)") + SET(OPENAL_MISSED_SOMETHING YES) + ENDIF(LIB_VORBIS_DEBUG) + + FIND_LIBRARY(LIB_VORBISFILE_RELEASE libvorbisfile PATHS ${PATH_VORBIS}/win32/lib/${BUILDTYPE_PATH_RELEASE} NO_DEFAULT_PATH) + IF(LIB_VORBISFILE_RELEASE) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_VORBISFILE_RELEASE} (release)") + INSTALL(FILES "${PATH_VORBIS}/win32/bin/${BUILDTYPE_PATH_RELEASE}/libvorbisfile.dll" DESTINATION "${DIST_BINDIR}")# CONFIGURATIONS Release) + ELSE(LIB_VORBISFILE_RELEASE) + OV_PRINT(OV_PRINTED " [FAILED] lib vorbisfile (release)") + SET(OPENAL_MISSED_SOMETHING YES) + ENDIF(LIB_VORBISFILE_RELEASE) + + FIND_LIBRARY(LIB_VORBISFILE_DEBUG libvorbisfile PATHS ${PATH_VORBIS}/win32/lib/${BUILDTYPE_PATH_DEBUG} NO_DEFAULT_PATH) + IF(LIB_VORBISFILE_DEBUG) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_VORBISFILE_DEBUG} (debug)") + # INSTALL(FILES "${PATH_VORBIS}/win32/bin/${BUILDTYPE_PATH_DEBUG}/libvorbisfile.dll" DESTINATION "${DIST_BINDIR}" CONFIGURATIONS Debug) + ELSE(LIB_VORBISFILE_DEBUG) + OV_PRINT(OV_PRINTED " [FAILED] lib vorbisfile (debug)") + SET(OPENAL_MISSED_SOMETHING YES) + ENDIF(LIB_VORBISFILE_DEBUG) + ELSE(PATH_VORBIS) + OV_PRINT(OV_PRINTED " -- FAILED to find VORBIS") + SET(OPENAL_MISSED_SOMETHING YES) + ENDIF(PATH_VORBIS) + + IF(OPENAL_MISSED_SOMETHING) + OV_PRINT(OV_PRINTED " FAILED to find everything required by OpenAL") + ELSE(OPENAL_MISSED_SOMETHING) + OV_PRINT(OV_PRINTED " Found OpenAL and all its library dependencies...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_OPENAL}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_ALUT}) + + TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${LIB_OGG_DEBUG} optimized ${LIB_OGG_RELEASE} ) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${LIB_VORBIS_DEBUG} optimized ${LIB_VORBIS_RELEASE} ) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${LIB_VORBISFILE_DEBUG} optimized ${LIB_VORBISFILE_RELEASE}) + + INCLUDE_DIRECTORIES(${PATH_OPENAL}/include ${PATH_ALUT}/include ${PATH_OGG}/include ${PATH_VORBIS}/include) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyOpenAL) + ENDIF(OPENAL_MISSED_SOMETHING) + +ENDIF(WIN32) + +IF(UNIX) + INCLUDE("FindThirdPartyPkgConfig") + pkg_check_modules(ALUT freealut) + + IF(ALUT_FOUND) + OV_PRINT(OV_PRINTED " Found ALUT...") + INCLUDE_DIRECTORIES(${ALUT_INCLUDE_DIRS}) + ADD_DEFINITIONS(${ALUT_CFLAGS}) + ADD_DEFINITIONS(${ALUT_CFLAGS_OTHERS}) + # LINK_DIRECTORIES(${ALUT_LIBRARY_DIRS}) + FOREACH(ALUT_LIB ${ALUT_LIBRARIES}) + SET(ALUT_LIB1 "ALUT_LIB1-NOTFOUND") + FIND_LIBRARY(ALUT_LIB1 NAMES ${ALUT_LIB} PATHS ${ALUT_LIBRARY_DIRS} ${ALUT_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(ALUT_LIB1 NAMES ${ALUT_LIB}) + IF(ALUT_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${ALUT_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${ALUT_LIB1}) + ELSE(ALUT_LIB1) + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${ALUT_LIB}") + ENDIF(ALUT_LIB1) + ENDFOREACH(ALUT_LIB) + ELSE(ALUT_FOUND) + OV_PRINT(OV_PRINTED " FAILED to find ALUT...") + ENDIF(ALUT_FOUND) + + pkg_check_modules(VORBIS vorbisfile) + + IF(VORBIS_FOUND) + OV_PRINT(OV_PRINTED " Found VORBIS...") + INCLUDE_DIRECTORIES(${VORBIS_INCLUDE_DIRS}) + ADD_DEFINITIONS(${VORBIS_CFLAGS}) + ADD_DEFINITIONS(${VORBIS_CFLAGS_OTHERS}) + # LINK_DIRECTORIES(${VORBIS_LIBRARY_DIRS}) + FOREACH(VORBIS_LIB ${VORBIS_LIBRARIES}) + SET(VORBIS_LIB1 "VORBIS_LIB1-NOTFOUND") + FIND_LIBRARY(VORBIS_LIB1 NAMES ${VORBIS_LIB} PATHS ${VORBIS_LIBRARY_DIRS} ${VORBIS_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(VORBIS_LIB1 NAMES ${VORBIS_LIB}) + IF(VORBIS_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${VORBIS_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${VORBIS_LIB1}) + ELSE(VORBIS_LIB1) + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${VORBIS_LIB}") + ENDIF(VORBIS_LIB1) + ENDFOREACH(VORBIS_LIB) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyOpenAL) + ELSE(VORBIS_FOUND) + OV_PRINT(OV_PRINTED " FAILED to find VORBIS...") + ENDIF(VORBIS_FOUND) + +ENDIF(UNIX) + + + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyOpenAL "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyOpenGL.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyOpenGL.cmake new file mode 100644 index 0000000..f23cb43 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyOpenGL.cmake @@ -0,0 +1,56 @@ +# --------------------------------- +# Finds OpenGL toolkit +# +# Sets OpenGL_FOUND +# Sets OpenGL_LIBRARIES +# Sets OpenGL_LIBRARY_DIRS +# Sets OpenGL_LDFLAGS +# Sets OpenGL_LDFLAGS_OTHERS +# Sets OpenGL_INCLUDE_DIRS +# Sets OpenGL_CFLAGS +# Sets OpenGL_CFLAGS_OTHERS +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyOpenGL) + +IF(WIN32) + FIND_LIBRARY(LIB_STANDARD_MODULE_GL opengl32) + FIND_LIBRARY(LIB_STANDARD_MODULE_GLU glu32) + IF(LIB_STANDARD_MODULE_GL AND LIB_STANDARD_MODULE_GLU) + OV_PRINT(OV_PRINTED " Found gl...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_GL}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_GLU}) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyOpenGL) + ELSE(LIB_STANDARD_MODULE_GL AND LIB_STANDARD_MODULE_GLU) + MESSAGE(WARNING " FAILED to find gl...") + ENDIF(LIB_STANDARD_MODULE_GL AND LIB_STANDARD_MODULE_GLU) +ELSE(WIN32) + INCLUDE("FindPkgConfig") + pkg_check_modules(OpenGL glu) + + IF(OpenGL_FOUND) + OV_PRINT(OV_PRINTED " Found OpenGL...") + INCLUDE_DIRECTORIES(${OpenGL_INCLUDE_DIRS}) + ADD_DEFINITIONS(${OpenGL_CFLAGS}) + ADD_DEFINITIONS(${OpenGL_CFLAGS_OTHERS}) + LINK_DIRECTORIES(${OpenGL_LIBRARY_DIRS}) + IF(NOT(APPLE)) + LINK_DIRECTORIES(${OpenGL_LIBRARY_DIRS}/mesa) + ENDIF() + FOREACH(OpenGL_LIB ${OpenGL_LIBRARIES} z) + SET(OpenGL_LIB1 "OpenGL_LIB1-NOTFOUND") + FIND_LIBRARY(OpenGL_LIB1 NAMES ${OpenGL_LIB} PATHS ${OpenGL_LIBRARY_DIRS} ${OpenGL_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(OpenGL_LIB1 NAMES ${OpenGL_LIB} PATHS ${OpenGL_LIBRARY_DIRS}/mesa ${OpenGL_LIBDIR}/mesa NO_DEFAULT_PATH) + FIND_LIBRARY(OpenGL_LIB1 NAMES ${OpenGL_LIB}) + IF(OpenGL_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${OpenGL_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OpenGL_LIB1}) + ELSE(OpenGL_LIB1) + MESSAGE(WARNING " [FAILED] Third party lib ${OpenGL_LIB}") + ENDIF(OpenGL_LIB1) + ENDFOREACH(OpenGL_LIB) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyOpenGL) + ELSE(OpenGL_FOUND) + MESSAGE(WARNING " FAILED to find OpenGL...") + ENDIF(OpenGL_FOUND) +ENDIF(WIN32) diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyPThread.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyPThread.cmake new file mode 100644 index 0000000..b6b9a34 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyPThread.cmake @@ -0,0 +1,59 @@ +# --------------------------------- +# Finds third party pthread lib +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyPThread) + +IF(WIN32) + FIND_PATH(PTHREAD_DIR lib PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES pthread NO_DEFAULT_PATH) + FIND_PATH(PTHREAD_DIR lib PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES pthreads NO_DEFAULT_PATH) + FIND_LIBRARY(PTHREAD_LIB pthreadVC2 PATHS ${PTHREAD_DIR} PATH_SUFFIXES lib NO_DEFAULT_PATH) + FIND_PROGRAM(PTHREAD_DLL pthread.dll PATHS ${PTHREAD_DIR} PATH_SUFFIXES bin NO_DEFAULT_PATH) + + INCLUDE("OvSetWindowsSDKPath") + SET(WS232_LIB "WS232_LIB-NOTFOUND") + FIND_LIBRARY(WS232_LIB ws2_32 ${OV_MS_SDK_PATH}/lib NO_DEFAULT_PATH) + FIND_LIBRARY(WS232_LIB ws2_32 ${OV_MS_SDK_PATH}/lib) + + IF(PTHREAD_LIB AND WS232_LIB AND PTHREAD_DLL) + OV_PRINT(OV_PRINTED " Found PThreads") + INCLUDE_DIRECTORIES(${PTHREAD_DIR}/include) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${WS232_LIB}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PTHREAD_LIB}) + INSTALL(PROGRAMS "${PTHREAD_DLL}" DESTINATION ${DIST_BINDIR}) + ADD_DEFINITIONS(-DTARGET_HAS_PThread) + ELSE() + OV_PRINT(OV_PRINTED " FAILED to find PThreads") + ENDIF() + + IF(PTHREAD_LIB) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${PTHREAD_LIB}") + ELSE() + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${PTHREAD_LIB}") + ENDIF() + + IF(WS232_LIB) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${WS232_LIB}") + ELSE() + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${WS232_LIB}") + ENDIF() + +ENDIF(WIN32) + +IF(UNIX) + + FIND_LIBRARY(LIB_STANDARD_MODULE_PTHREAD pthread) + IF(LIB_STANDARD_MODULE_PTHREAD) + OV_PRINT(OV_PRINTED " Found pthread...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_PTHREAD}) + ADD_DEFINITIONS(-DTARGET_HAS_PThread) + ELSE(LIB_STANDARD_MODULE_PTHREAD) + OV_PRINT(OV_PRINTED " FAILED to find pthread...") + ENDIF(LIB_STANDARD_MODULE_PTHREAD) + +ENDIF(UNIX) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyPThread "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyPThreadsVCE2.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyPThreadsVCE2.cmake new file mode 100644 index 0000000..490ff73 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyPThreadsVCE2.cmake @@ -0,0 +1,44 @@ +# --------------------------------- +# Finds third party pthreads VCE2 (largely for Fieldtrip) +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyPThreadsVCE2) + +IF(WIN32) + FIND_PATH(PTHREAD_DIR lib PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES pthread NO_DEFAULT_PATH) + FIND_PATH(PTHREAD_DIR lib PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES pthreads NO_DEFAULT_PATH) + FIND_LIBRARY(PTHREAD_LIB pthreadVCE2 PATHS ${PTHREAD_DIR} PATH_SUFFIXES lib NO_DEFAULT_PATH) + + INCLUDE("OvSetWindowsSDKPath") + SET(WS232_LIB "WS232_LIB-NOTFOUND") + FIND_LIBRARY(WS232_LIB ws2_32 ${OV_MS_SDK_PATH}/lib NO_DEFAULT_PATH) + FIND_LIBRARY(WS232_LIB ws2_32 ${OV_MS_SDK_PATH}/lib) + + IF(PTHREAD_LIB AND WS232_LIB) + OV_PRINT(OV_PRINTED " Found PThreads VCE2") + INCLUDE_DIRECTORIES(${PTHREAD_DIR}/include) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${WS232_LIB}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PTHREAD_LIB}) + ADD_DEFINITIONS(-DTARGET_HAS_PThreadsVCE2) + ELSE() + OV_PRINT(OV_PRINTED " FAILED to find PThreads VCE2") + ENDIF() + + IF(PTHREAD_LIB) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${PTHREAD_LIB}") + ELSE() + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${PTHREAD_LIB}") + ENDIF() + + IF(WS232_LIB) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${WS232_LIB}") + ELSE() + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${WS232_LIB}") + ENDIF() + +ENDIF(WIN32) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyPThreadsVCE2 "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyPkgConfig.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyPkgConfig.cmake new file mode 100644 index 0000000..161f58a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyPkgConfig.cmake @@ -0,0 +1,379 @@ +# - a pkg-config module for CMake +# +# Usage: +# pkg_check_modules( [REQUIRED] []*) +# checks for all the given modules +# +# pkg_search_module( [REQUIRED] []*) +# checks for given modules and uses the first working one +# +# When the 'REQUIRED' argument was set, macros will fail with an error +# when module(s) could not be found +# +# It sets the following variables: +# PKG_CONFIG_FOUND ... true iff pkg-config works on the system +# PKG_CONFIG_EXECUTABLE ... pathname of the pkg-config program +# _FOUND ... set to 1 iff module(s) exist +# +# For the following variables two sets of values exist; first one is the +# common one and has the given PREFIX. The second set contains flags +# which are given out when pkgconfig was called with the '--static' +# option. +# _LIBRARIES ... only the libraries (w/o the '-l') +# _LIBRARY_DIRS ... the paths of the libraries (w/o the '-L') +# _LDFLAGS ... all required linker flags +# _LDFLAGS_OTHERS ... all other linker flags +# _INCLUDE_DIRS ... the '-I' preprocessor flags (w/o the '-I') +# _CFLAGS ... all required cflags +# _CFLAGS_OTHERS ... the other compiler flags +# +# = for common case +# = _STATIC for static linking +# +# There are some special variables whose prefix depends on the count +# of given modules. When there is only one module, stays +# unchanged. When there are multiple modules, the prefix will be +# changed to _: +# _VERSION ... version of the module +# _PREFIX ... prefix-directory of the module +# _INCLUDEDIR ... include-dir of the module +# _LIBDIR ... lib-dir of the module +# +# = when |MODULES| == 1, else +# = _ +# +# A parameter can have the following formats: +# {MODNAME} ... matches any version +# {MODNAME}>={VERSION} ... at least version is required +# {MODNAME}={VERSION} ... exactly version is required +# {MODNAME}<={VERSION} ... modules must not be newer than +# +# Examples +# pkg_check_modules (GLIB2 glib-2.0) +# +# pkg_check_modules (GLIB2 glib-2.0>=2.10) +# requires at least version 2.10 of glib2 and defines e.g. +# GLIB2_VERSION=2.10.3 +# +# pkg_check_modules (FOO glib-2.0>=2.10 gtk+-2.0) +# requires both glib2 and gtk2, and defines e.g. +# FOO_glib-2.0_VERSION=2.10.3 +# FOO_gtk+-2.0_VERSION=2.8.20 +# +# pkg_check_modules (XRENDER REQUIRED xrender) +# defines e.g.: +# XRENDER_LIBRARIES=Xrender;X11 +# XRENDER_STATIC_LIBRARIES=Xrender;X11;pthread;Xau;Xdmcp +# +# pkg_search_module (BAR libxml-2.0 libxml2 libxml>=2) + + +# Copyright (C) 2006 Enrico Scholz +# +# Redistribution and use, with or without modification, are permitted +# provided that the following conditions are met: +# +# 1. Redistributions must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# 2. The name of the author may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +### Common stuff #### +set(PKG_CONFIG_VERSION 1) +set(PKG_CONFIG_FOUND 0) + +find_program(PKG_CONFIG_EXECUTABLE NAMES pkg-config DOC "pkg-config executable") +mark_as_advanced(PKG_CONFIG_EXECUTABLE) + +if(PKG_CONFIG_EXECUTABLE) + set(PKG_CONFIG_FOUND 1) +endif(PKG_CONFIG_EXECUTABLE) + +# Unsets the given variables +macro(_pkgconfig_unset var) + set(${var} "" CACHE INTERNAL "") +endmacro(_pkgconfig_unset) + +macro(_pkgconfig_set var value) + set(${var} ${value} CACHE INTERNAL "") +endmacro(_pkgconfig_set) + +# Invokes pkgconfig, cleans up the result and sets variables +macro(_pkgconfig_invoke _pkglist _prefix _varname _regexp) + set(_pkgconfig_invoke_result) + + execute_process( + COMMAND ${PKG_CONFIG_EXECUTABLE} ${ARGN} ${_pkglist} + OUTPUT_VARIABLE _pkgconfig_invoke_result + RESULT_VARIABLE _pkgconfig_failed) + + if (_pkgconfig_failed) + set(_pkgconfig_${_varname} "") + _pkgconfig_unset(${_prefix}_${_varname}) + else(_pkgconfig_failed) + string(REGEX REPLACE "[\r\n]" " " _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") + string(REGEX REPLACE " +$" "" _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") + + if (NOT ${_regexp} STREQUAL "") + string(REGEX REPLACE "${_regexp}" " " _pkgconfig_invoke_result "${_pkgconfig_invoke_result}") + endif(NOT ${_regexp} STREQUAL "") + + separate_arguments(_pkgconfig_invoke_result) + + #message(STATUS " ${_varname} ... ${_pkgconfig_invoke_result}") + set(_pkgconfig_${_varname} ${_pkgconfig_invoke_result}) + _pkgconfig_set(${_prefix}_${_varname} "${_pkgconfig_invoke_result}") + endif(_pkgconfig_failed) +endmacro(_pkgconfig_invoke) + +# Invokes pkgconfig two times; once without '--static' and once with +# '--static' +macro(_pkgconfig_invoke_dyn _pkglist _prefix _varname cleanup_regexp) + _pkgconfig_invoke("${_pkglist}" ${_prefix} ${_varname} "${cleanup_regexp}" ${ARGN}) + _pkgconfig_invoke("${_pkglist}" ${_prefix} STATIC_${_varname} "${cleanup_regexp}" --static ${ARGN}) +endmacro(_pkgconfig_invoke_dyn) + +# Splits given arguments into options and a package list +macro(_pkgconfig_parse_options _result _is_req) + set(${_is_req} 0) + + foreach(_pkg ${ARGN}) + if (_pkg STREQUAL "REQUIRED") + set(${_is_req} 1) + endif (_pkg STREQUAL "REQUIRED") + endforeach(_pkg ${ARGN}) + + set(${_result} ${ARGN}) + list(REMOVE_ITEM ${_result} "REQUIRED") +endmacro(_pkgconfig_parse_options) + +### +macro(_pkg_check_modules_internal _is_required _is_silent _prefix) + _pkgconfig_unset(${_prefix}_FOUND) + _pkgconfig_unset(${_prefix}_VERSION) + _pkgconfig_unset(${_prefix}_PREFIX) + _pkgconfig_unset(${_prefix}_INCLUDEDIR) + _pkgconfig_unset(${_prefix}_LIBDIR) + _pkgconfig_unset(${_prefix}_LIBS) + _pkgconfig_unset(${_prefix}_LIBS_L) + _pkgconfig_unset(${_prefix}_LIBS_PATHS) + _pkgconfig_unset(${_prefix}_LIBS_OTHER) + _pkgconfig_unset(${_prefix}_CFLAGS) + _pkgconfig_unset(${_prefix}_CFLAGS_I) + _pkgconfig_unset(${_prefix}_CFLAGS_OTHER) + _pkgconfig_unset(${_prefix}_STATIC_LIBDIR) + _pkgconfig_unset(${_prefix}_STATIC_LIBS) + _pkgconfig_unset(${_prefix}_STATIC_LIBS_L) + _pkgconfig_unset(${_prefix}_STATIC_LIBS_PATHS) + _pkgconfig_unset(${_prefix}_STATIC_LIBS_OTHER) + _pkgconfig_unset(${_prefix}_STATIC_CFLAGS) + _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_I) + _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_OTHER) + + # create a better addressable variable of the modules and calculate its size + set(_pkg_check_modules_list ${ARGN}) + list(LENGTH _pkg_check_modules_list _pkg_check_modules_cnt) + + if(PKG_CONFIG_EXECUTABLE) + # give out status message telling checked module + if (NOT ${_is_silent}) + if (_pkg_check_modules_cnt EQUAL 1) + # message(STATUS "checking for module '${_pkg_check_modules_list}'") + else(_pkg_check_modules_cnt EQUAL 1) + # message(STATUS "checking for modules '${_pkg_check_modules_list}'") + endif(_pkg_check_modules_cnt EQUAL 1) + endif(NOT ${_is_silent}) + + set(_pkg_check_modules_packages) + set(_pkg_check_modules_failed) + + # iterate through module list and check whether they exist and match the required version + foreach (_pkg_check_modules_pkg ${_pkg_check_modules_list}) + set(_pkg_check_modules_exist_query) + + # check whether version is given + if (_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") + string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\1" _pkg_check_modules_pkg_name "${_pkg_check_modules_pkg}") + string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\2" _pkg_check_modules_pkg_op "${_pkg_check_modules_pkg}") + string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\3" _pkg_check_modules_pkg_ver "${_pkg_check_modules_pkg}") + else(_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") + set(_pkg_check_modules_pkg_name "${_pkg_check_modules_pkg}") + set(_pkg_check_modules_pkg_op) + set(_pkg_check_modules_pkg_ver) + endif(_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*") + + # handle the operands + if (_pkg_check_modules_pkg_op STREQUAL ">=") + list(APPEND _pkg_check_modules_exist_query --atleast-version) + endif(_pkg_check_modules_pkg_op STREQUAL ">=") + + if (_pkg_check_modules_pkg_op STREQUAL "=") + list(APPEND _pkg_check_modules_exist_query --exact-version) + endif(_pkg_check_modules_pkg_op STREQUAL "=") + + if (_pkg_check_modules_pkg_op STREQUAL "<=") + list(APPEND _pkg_check_modules_exist_query --max-version) + endif(_pkg_check_modules_pkg_op STREQUAL "<=") + + # create the final query which is of the format: + # * --atleast-version + # * --exact-version + # * --max-version + # * --exists + if (_pkg_check_modules_pkg_op) + list(APPEND _pkg_check_modules_exist_query "${_pkg_check_modules_pkg_ver}") + else(_pkg_check_modules_pkg_op) + list(APPEND _pkg_check_modules_exist_query --exists) + endif(_pkg_check_modules_pkg_op) + + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_VERSION) + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_PREFIX) + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_INCLUDEDIR) + _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_LIBDIR) + + list(APPEND _pkg_check_modules_exist_query "${_pkg_check_modules_pkg_name}") + list(APPEND _pkg_check_modules_packages "${_pkg_check_modules_pkg_name}") + + # execute the query + execute_process( + COMMAND ${PKG_CONFIG_EXECUTABLE} ${_pkg_check_modules_exist_query} + RESULT_VARIABLE _pkgconfig_retval) + + # evaluate result and tell failures + if (_pkgconfig_retval) + if(NOT ${_is_silent}) + message(STATUS " package '${_pkg_check_modules_pkg}' not found") + endif(NOT ${_is_silent}) + + set(_pkg_check_modules_failed 1) + endif(_pkgconfig_retval) + endforeach(_pkg_check_modules_pkg) + + if(_pkg_check_modules_failed) + # fail when requested + if (${_is_required}) + message(SEND_ERROR "A required package was not found") + endif (${_is_required}) + else(_pkg_check_modules_failed) + # when we are here, we checked whether requested modules + # exist. Now, go through them and set variables + + _pkgconfig_set(${_prefix}_FOUND 1) + list(LENGTH _pkg_check_modules_packages pkg_count) + + # iterate through all modules again and set individual variables + foreach (_pkg_check_modules_pkg ${_pkg_check_modules_packages}) + # handle case when there is only one package required + if (pkg_count EQUAL 1) + set(_pkg_check_prefix "${_prefix}") + else(pkg_count EQUAL 1) + set(_pkg_check_prefix "${_prefix}_${_pkg_check_modules_pkg}") + endif(pkg_count EQUAL 1) + + _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" VERSION "" --modversion ) + _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" PREFIX "" --variable=prefix ) + _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" INCLUDEDIR "" --variable=includedir ) + _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" LIBDIR "" --variable=libdir ) + + # message(STATUS " found ${_pkg_check_modules_pkg}, version ${_pkgconfig_VERSION}") + endforeach(_pkg_check_modules_pkg) + + # set variables which are combined for multiple modules + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LIBRARIES "(^| )-l" --libs-only-l ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LIBRARY_DIRS "(^| )-L" --libs-only-L ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS "" --libs ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS_OTHER "" --libs-only-other ) + + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" INCLUDE_DIRS "(^| )-I" --cflags-only-I ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS "" --cflags ) + _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS_OTHER "" --cflags-only-other ) + endif(_pkg_check_modules_failed) + else(PKG_CONFIG_EXECUTABLE) + if (${_is_required}) + message(SEND_ERROR "pkg-config tool not found") + endif (${_is_required}) + endif(PKG_CONFIG_EXECUTABLE) +endmacro(_pkg_check_modules_internal) + +### +### User visible macros start here +### + +### +macro(pkg_check_modules _prefix _module0) + # check cached value + if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) + _pkgconfig_parse_options (_pkg_modules _pkg_is_required "${_module0}" ${ARGN}) + _pkg_check_modules_internal("${_pkg_is_required}" 0 "${_prefix}" ${_pkg_modules}) + + _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION}) + endif(NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) +endmacro(pkg_check_modules) + +### +macro(pkg_search_module _prefix _module0) + # check cached value + if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) + set(_pkg_modules_found 0) + _pkgconfig_parse_options(_pkg_modules_alt _pkg_is_required "${_module0}" ${ARGN}) + + # message(STATUS "checking for one of the modules '${_pkg_modules_alt}'") + + # iterate through all modules and stop at the first working one. + foreach(_pkg_alt ${_pkg_modules_alt}) + if(NOT _pkg_modules_found) + _pkg_check_modules_internal(0 1 "${_prefix}" "${_pkg_alt}") + endif(NOT _pkg_modules_found) + + if (${_prefix}_FOUND) + set(_pkg_modules_found 1) + endif(${_prefix}_FOUND) + endforeach(_pkg_alt) + + if (NOT ${_prefix}_FOUND) + if(${_pkg_is_required}) + message(SEND_ERROR "None of the required '${_pkg_modules_alt}' found") + endif(${_pkg_is_required}) + endif(NOT ${_prefix}_FOUND) + + _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION}) + endif(NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION}) +endmacro(pkg_search_module) + +### +macro(PKGCONFIG _package _include_DIR _link_DIR _link_FLAGS _cflags) + message(STATUS "WARNING: you are using the obsolete 'PKGCONFIG' macro") + _pkg_check_modules_internal(0 0 _PKGCONFIG_TMP "${_package}") + if (_PKGCONFIG_TMP_FOUND) + set(${_include_DIR} ${_PKGCONFIG_TMP_INCLUDEDIR}) + set(${_link_DIR} ${_PKGCONFIG_TMP_LIBDIR}) + set(${_link_FLAGS} ${_PKGCONFIG_TMP_LDFLAGS}) + set(${_cflags} ${_PKGCONFIG_TMP_CFLAGS}) + set(_return_VALUE 0) + else(_PKGCONFIG_TMP_FOUND) + set(${_include_DIR}) + set(${_link_DIR}) + set(${_link_FLAGS}) + set(${_cflags}) + set(_return_VALUE 1) + endif(_PKGCONFIG_TMP_FOUND) +endmacro(PKGCONFIG) + + +### Local Variables: +### mode: cmake +### End: diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyPython2.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyPython2.cmake new file mode 100644 index 0000000..939fd3a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyPython2.cmake @@ -0,0 +1,37 @@ +# --------------------------------- +# Finds Python +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyPython2) + +SET(Python_ADDITIONAL_VERSIONS 2.7) + +# Stops lookup as soon as a version satisfying the version constraints is found. +# Important when building both 32bits andd 64bits versions on the same machine. +# CMake might go for the 64bits version of Python when building 32bits, making the compilation fail. +# To work, you need to ensure that 32bits versions of Python appearing first in the Path. +# This is only needed for windows. +SET(Python2_FIND_STRATEGY LOCATION) + +FIND_PACKAGE(Python2 COMPONENTS Development) + +IF(Python2_FOUND) + OV_PRINT(OV_PRINTED " Found Python 2 at ${Python2_LIBRARIES}") + INCLUDE_DIRECTORIES(${Python2_INCLUDE_DIRS}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Python2_LIBRARIES}) + + IF(WIN32) + # These are needed not to cause a popup on machines missing the dll + TARGET_LINK_LIBRARIES(${PROJECT_NAME} optimized Delayimp ) + SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/DELAYLOAD:python27.dll") + ENDIF() + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyPython2) +ELSE() + OV_PRINT(OV_PRINTED " FAILED to find Python 2 (needs v2.7 with bitness matching build target ${PLATFORM_TARGET})") +ENDIF() + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyPython2 "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyPython3.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyPython3.cmake new file mode 100644 index 0000000..1ccbf48 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyPython3.cmake @@ -0,0 +1,37 @@ +# --------------------------------- +# Finds Python +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyPython3) + +SET(Python_ADDITIONAL_VERSIONS 3.7) + +# Stops lookup as soon as a version satisfying the version constraints is found. +# Important when building both 32bits andd 64bits versions on the same machine. +# CMake might go for the 64bits version of Python when building 32bits, making the compilation fail. +# To work, you need to ensure that 32bits versions of Python appearing first in the Path. +# This is only needed for windows. +SET(Python3_FIND_STRATEGY LOCATION) + +FIND_PACKAGE(Python3 COMPONENTS Development) + +IF(Python3_FOUND) + OV_PRINT(OV_PRINTED " Found Python 3 at ${Python3_LIBRARIES}") + INCLUDE_DIRECTORIES(${Python3_INCLUDE_DIRS}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Python3_LIBRARIES}) + + IF(WIN32) + # These are needed not to cause a popup on machines missing the dll + TARGET_LINK_LIBRARIES(${PROJECT_NAME} optimized Delayimp ) + SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/DELAYLOAD:python37.dll") + ENDIF() + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyPython3) +ELSE() + OV_PRINT(OV_PRINTED " FAILED to find Python 3 (needs v3.7 with bitness matching build target ${PLATFORM_TARGET})") +ENDIF() + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyPython3 "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyRT.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyRT.cmake new file mode 100644 index 0000000..a3458d7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyRT.cmake @@ -0,0 +1,22 @@ +# --------------------------------- +# Finds third party rt +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyRT) + +IF(UNIX) + # For Ubuntu 13.04 (interprocess/ipc/message_queue.hpp in ovasCPluginExternalStimulations.cpp caused dep) + FIND_LIBRARY(LIB_STANDARD_MODULE_RT rt) + IF(LIB_STANDARD_MODULE_RT) + OV_PRINT(OV_PRINTED " Found rt...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_RT}) + ELSE(LIB_STANDARD_MODULE_RT) + OV_PRINT(OV_PRINTED " FAILED to find rt...") + ENDIF(LIB_STANDARD_MODULE_RT) + +ENDIF(UNIX) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyBoost_RT "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyTMSi.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyTMSi.cmake new file mode 100644 index 0000000..12d56fa --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyTMSi.cmake @@ -0,0 +1,19 @@ + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyTMSi) + +IF(WIN32) + FIND_PATH(PATH_TMSi TMSiSDK.dll PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_tmsi NO_DEFAULT_PATH) +ENDIF(WIN32) + +IF(PATH_TMSi) + OV_PRINT(OV_PRINTED " Found TMSi dll...") + OV_PRINT(OV_PRINTED " [ OK ] dll ${PATH_TMSi}/TMSiSDK.dll") + + INSTALL(PROGRAMS "${PATH_TMSi}/TMSiSDK.dll" DESTINATION ${DIST_BINDIR}) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyTMSi) +ELSE(PATH_TMSi) + OV_PRINT(OV_PRINTED " FAILED to find TMSi device dll (optional driver)") +ENDIF(PATH_TMSi) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyTMSi "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyThinkGearAPI.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyThinkGearAPI.cmake new file mode 100644 index 0000000..2a6c1c7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyThinkGearAPI.cmake @@ -0,0 +1,50 @@ +# --------------------------------- +# Finds Neurosky ThinkGear library +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyThinkGearAPI) + +IF(WIN32) + + IF("${PLATFORM_TARGET}" STREQUAL "x64") + SET(THINKGEAR_LIBDIR "x64") + SET(THINKGEAR_LIB "thinkgear64") + ELSE() + SET(THINKGEAR_LIBDIR "win32") + SET(THINKGEAR_LIB "thinkgear") + ENDIF() + + FIND_PATH(PATH_ThinkGearAPI thinkgear.h PATHS + "C:/Program Files/MindSet Windows Developer Tools 3.2/Stream SDK for PC/libs/${THINKGEAR_LIBDIR}/" + "C:/Program Files (x86)/MindSet Windows Developer Tools 3.2/Stream SDK for PC/libs/${THINKGEAR_LIBDIR}/" + ${LIST_DEPENDENCIES_PATH} + NO_DEFAULT_PATH) + + IF(PATH_ThinkGearAPI) + OV_PRINT(OV_PRINTED " Found ThinkGear API...") + INCLUDE_DIRECTORIES(${PATH_ThinkGearAPI}) + FIND_LIBRARY(LIB_ThinkGearAPI ${THINKGEAR_LIB} PATHS ${PATH_ThinkGearAPI} ) + IF(LIB_ThinkGearAPI) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_ThinkGearAPI}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_ThinkGearAPI} ) + ELSE(LIB_ThinkGearAPI) + OV_PRINT(OV_PRINTED " [FAILED] lib thinkgear") + ENDIF(LIB_ThinkGearAPI) + + # Copy the DLL file at install + INSTALL(PROGRAMS "${PATH_ThinkGearAPI}/${THINKGEAR_LIB}.dll" DESTINATION ${DIST_BINDIR}) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyThinkGearAPI) + ELSE(PATH_ThinkGearAPI) + OV_PRINT(OV_PRINTED " FAILED to find a valid ThinkGear API for NeuroSky Mindsets (optional driver)") + ENDIF(PATH_ThinkGearAPI) +ENDIF(WIN32) + +IF(UNIX) + OV_PRINT(OV_PRINTED " Skipped ThinkGear API for Neurosky MindSet, only available on windows.") +ENDIF(UNIX) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyThinkGearAPI "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyUSBFirstAmpAPI.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyUSBFirstAmpAPI.cmake new file mode 100644 index 0000000..ec7df96 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyUSBFirstAmpAPI.cmake @@ -0,0 +1,37 @@ +# --------------------------------- +# Finds VAmp FirstAmp library +# Adds library to target +# Adds include path +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyUSBFirstAmpAPI) + +IF(WIN32) + IF("${PLATFORM_TARGET}" STREQUAL "x64") + FIND_PATH(PATH_USBFirstAmpAPI FirstAmp.h PATHS "C:/Program Files/FaSDK-x64" ${LIST_DEPENDENCIES_PATH}) + ELSE() + FIND_PATH(PATH_USBFirstAmpAPI FirstAmp.h PATHS "C:/Program Files/FaSDK" "C:/Program Files (x86)/FaSDK" ${LIST_DEPENDENCIES_PATH}) + ENDIF() + + IF(PATH_USBFirstAmpAPI) + OV_PRINT(OV_PRINTED " Found Brain Products FirstAmp (VAmp) API...") + INCLUDE_DIRECTORIES(${PATH_USBFirstAmpAPI}) + FIND_LIBRARY(LIB_USBFirstAmpAPI FirstAmp PATHS ${PATH_USBFirstAmpAPI} ) + IF(LIB_USBFirstAmpAPI) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_USBFirstAmpAPI}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_USBFirstAmpAPI} ) + ELSE() + OV_PRINT(OV_PRINTED " [FAILED] lib FirstAmp") + ENDIF() + + # Copy the DLL file at install + INSTALL(PROGRAMS "${PATH_USBFirstAmpAPI}/FirstAmp.dll" DESTINATION ${DIST_BINDIR}) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyUSBFirstAmpAPI) + ELSE() + OV_PRINT(OV_PRINTED " FAILED to find Brain Products FirstAmp (VAmp) API (optional driver)") + ENDIF() +ENDIF() + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyUSBFirstAmpAPI "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyVRPN.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyVRPN.cmake new file mode 100644 index 0000000..3aa8d9b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyVRPN.cmake @@ -0,0 +1,91 @@ +# --------------------------------- +# Adds VRPN library to the target project +# Adds include path +# Requires FindThirdPartyVRPN_Check.cmake to have been run successfully before +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyVRPN) + +IF(PATH_VRPN) + # Find all library paths + + IF(WIN32) + FIND_LIBRARY(LIB_VRPN vrpn PATHS ${PATH_VRPN}/lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_VRPN vrpn PATHS ${PATH_VRPN}/lib) + IF(LIB_VRPN) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_VRPN}") + ELSE(LIB_VRPN) + OV_PRINT(OV_PRINTED " [FAILED] lib vrpn") + RETURN() + ENDIF(LIB_VRPN) + + FIND_LIBRARY(LIB_VRPN_DEBUG vrpnd PATHS ${PATH_VRPN}/lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_VRPN_DEBUG vrpnd PATHS ${PATH_VRPN}/lib) + IF(LIB_VRPN_DEBUG) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_VRPN_DEBUG}") + ELSE(LIB_VRPN_DEBUG) + OV_PRINT(OV_PRINTED " [FAILED] lib vrpnd") + RETURN() + ENDIF(LIB_VRPN_DEBUG) + + FIND_LIBRARY(LIB_QUAT quat PATHS ${PATH_VRPN}/lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_QUAT quat PATHS ${PATH_VRPN}/lib) + IF(LIB_QUAT) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_QUAT}") + ELSE(LIB_QUAT) + OV_PRINT(OV_PRINTED " [FAILED] lib quat") + RETURN() + ENDIF(LIB_QUAT) + + FIND_LIBRARY(LIB_QUAT_DEBUG quatd PATHS ${PATH_VRPN}/lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_QUAT_DEBUG quatd PATHS ${PATH_VRPN}/lib) + IF(LIB_QUAT_DEBUG) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_QUAT_DEBUG}") + ELSE(LIB_QUAT_DEBUG) + OV_PRINT(OV_PRINTED " [FAILED] lib quatd") + RETURN() + ENDIF(LIB_QUAT_DEBUG) + + ENDIF(WIN32) + + IF(UNIX) + FIND_LIBRARY(LIB_VRPNSERVER vrpnserver PATHS ${PATH_VRPN}/lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_VRPNSERVER vrpnserver PATHS ${PATH_VRPN}/lib) + IF(LIB_VRPNSERVER) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_VRPNSERVER}") + ELSE(LIB_VRPNSERVER) + OV_PRINT(OV_PRINTED " [FAILED] lib vrpnserver") + RETURN() + ENDIF(LIB_VRPNSERVER) + + FIND_LIBRARY(LIB_QUAT quat PATHS ${PATH_VRPN}/lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_QUAT quat PATHS ${PATH_VRPN}/lib) + IF(LIB_QUAT) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_QUAT}") + ELSE(LIB_QUAT) + OV_PRINT(OV_PRINTED " [FAILED] lib quat") + RETURN() + ENDIF(LIB_QUAT) + ENDIF(UNIX) + + # If we reach here, everything has been found, add + INCLUDE_DIRECTORIES(${PATH_VRPN}/include) + + IF(WIN32) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} optimized ${LIB_VRPN}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${LIB_VRPN_DEBUG}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} optimized ${LIB_QUAT}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${LIB_QUAT_DEBUG}) + ENDIF(WIN32) + IF(UNIX) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_VRPNSERVER}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_QUAT}) + ENDIF(UNIX) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyVRPN) +ELSE(PATH_VRPN) + MESSAGE(AUTHOR_WARNING "Should not run FindThirdPartyVRPN without FindThirdPartyVRPN_Check passing successfully first") +ENDIF(PATH_VRPN) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyVRPN "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyVRPN_Check.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyVRPN_Check.cmake new file mode 100644 index 0000000..8011258 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyVRPN_Check.cmake @@ -0,0 +1,20 @@ +# --------------------------------- +# Finds VRPN +# Sets PATH_VRPN if found +# --------------------------------- +# The first ${..}/vrpn path is for Windows, the second ${..}/ for Linux + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyVRPN_Check) + +OV_PRINT(OV_PRINTED " Checking for VRPN...") + +FIND_PATH(PATH_VRPN include/vrpn_BaseClass.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES vrpn . NO_DEFAULT_PATH) +FIND_PATH(PATH_VRPN include/vrpn_BaseClass.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES vrpn .) +IF(PATH_VRPN) + OV_PRINT(OV_PRINTED " Found VRPN...") +ELSE(PATH_VRPN) + OV_PRINT(OV_PRINTED " FAILED to find VRPN") +ENDIF(PATH_VRPN) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyVRPN_Check "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyX11.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyX11.cmake new file mode 100644 index 0000000..1054723 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/FindThirdPartyX11.cmake @@ -0,0 +1,43 @@ +# --------------------------------- +# Finds X11 toolkit +# +# Sets X11_FOUND +# Sets X11_LIBRARIES +# Sets X11_LIBRARY_DIRS +# Sets X11_LDFLAGS +# Sets X11_LDFLAGS_OTHERS +# Sets X11_INCLUDE_DIRS +# Sets X11_CFLAGS +# Sets X11_CFLAGS_OTHERS +# --------------------------------- + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyX11) + +IF(UNIX) + INCLUDE("FindThirdPartyPkgConfig") + pkg_check_modules(X11 x11) + + IF(X11_FOUND) + OV_PRINT(OV_PRINTED " Found X11...") + INCLUDE_DIRECTORIES(${X11_INCLUDE_DIRS}) + ADD_DEFINITIONS(${X11_CFLAGS}) + ADD_DEFINITIONS(${X11_CFLAGS_OTHERS}) + # LINK_DIRECTORIES(${X11_LIBRARY_DIRS}) + FOREACH(X11_LIB ${X11_LIBRARIES}) + SET(X11_LIB1 "X11_LIB1-NOTFOUND") + FIND_LIBRARY(X11_LIB1 NAMES ${X11_LIB} PATHS ${X11_LIBRARY_DIRS} ${X11_LIBDIR} NO_DEFAULT_PATH) + FIND_LIBRARY(X11_LIB1 NAMES ${X11_LIB}) + IF(X11_LIB1) + OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${X11_LIB1}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${X11_LIB1}) + ELSE(X11_LIB1) + OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${X11_LIB}") + ENDIF(X11_LIB1) + ENDFOREACH(X11_LIB) + ELSE(X11_FOUND) + OV_PRINT(OV_PRINTED " FAILED to find X11...") + ENDIF(X11_FOUND) +ENDIF(UNIX) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyX11 "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/OvAddProjects.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/OvAddProjects.cmake new file mode 100644 index 0000000..e3d8708 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/OvAddProjects.cmake @@ -0,0 +1,82 @@ +# Adds the current project to the global properties +FUNCTION(OV_ADD_THIS_TO_PROJECT_LIST) + #MESSAGE(STATUS "ADDING: ${CMAKE_CURRENT_SOURCE_DIR}") + + # Add the dir to be parsed for documentation later. We need to do this before adding subdir, in case the subdir is the actual docs dir + GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS) + SET(OV_TMP "${OV_TMP};${CMAKE_CURRENT_SOURCE_DIR}") + SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS ${OV_TMP}) + +ENDFUNCTION(OV_ADD_THIS_TO_PROJECT_LIST) + +FUNCTION(SOURCE_DIRECTORIES CURRENT_DIR RETURN_LIST) + FILE(GLOB_RECURSE NEW_LIST ${CURRENT_DIR}/*.cpp ${CURRENT_DIR}/*.h ${CURRENT_DIR}/*.hpp ${CURRENT_DIR}/*.inl) + SET(DIR_LIST "") + FOREACH(FILE_PATH ${NEW_LIST}) + GET_FILENAME_COMPONENT(DIR_PATH ${FILE_PATH} PATH) + SET(DIR_LIST ${DIR_LIST} "${DIR_PATH}/..") + ENDFOREACH() + LIST(REMOVE_DUPLICATES DIR_LIST) + SET(${RETURN_LIST} ${DIR_LIST} PARENT_SCOPE) +ENDFUNCTION(SOURCE_DIRECTORIES) + +# Adds the given directory to the CMake build +FUNCTION(OV_ADD_SOURCE_DIR CURRENT_SOURCE_DIR) + # Add the given current directory + GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS) + SET(OV_TMP "${OV_TMP};${CURRENT_SOURCE_DIR}") + SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS ${OV_TMP}) + # Add source code directories + SOURCE_DIRECTORIES(${CURRENT_SOURCE_DIR} LIST_DIR) + FOREACH(SUBDIR ${LIST_DIR}) + GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS) + SET(OV_TMP "${OV_TMP};${SUBDIR}") + SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS ${OV_TMP}) + ENDFOREACH() +ENDFUNCTION(OV_ADD_SOURCE_DIR) + +# +# Adds all directories as subdirectories to the CMake build, using the branch specified (if any) in the root CMakeList.txt or +# trunk otherwise. +# +# The branch variable name that is checked is made up from ${CURRENT_BRANCH_PREFIX}_${DIRNAMEUPPER}. +# +# The script also adds the directory to the global list of projects. +# + +FUNCTION(OV_ADD_PROJECTS CURRENT_FOLDER_PREFIX) + + FILE(GLOB FILENAMES "*") + + FOREACH(FULLPATH ${FILENAMES}) + IF(IS_DIRECTORY ${FULLPATH} AND EXISTS "${FULLPATH}/CMakeLists.txt" AND NOT ${FULLPATH} MATCHES ".*\\.svn") + GET_FILENAME_COMPONENT(DIRNAME ${FULLPATH} NAME) + + STRING(TOUPPER ${DIRNAME} DIRNAMEUPPER) + SET(SKIP_THIS_FOLDER "SKIP_${CURRENT_FOLDER_PREFIX}_${DIRNAMEUPPER}") + + #MESSAGE(STATUS "Checking SKIP_${CURRENT_FOLDER_PREFIX}_${DIRNAMEUPPER} as branch var ${SKIP_THIS_FOLDER}") + + IF(${SKIP_THIS_FOLDER}) + MESSAGE(STATUS "Note: ${FULLPATH} has been skipped by setting SKIP_${CURRENT_FOLDER_PREFIX}_${DIRNAMEUPPER}") + ELSE(${SKIP_THIS_FOLDER}) + # MESSAGE(STATUS "Inserting folder ${FULLPATH}") + + # Add the dir to be parsed for documentation later. We need to do this before adding subdir, in case the subdir is the actual docs dir + GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS) + SET(OV_TMP "${OV_TMP};${FULLPATH}") + SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS ${OV_TMP}) + + SET(OV_CURRENT_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/${DIRNAME}") + GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS_BUILD_DIR) + SET(OV_TMP "${OV_TMP};${OV_CURRENT_BINARY_DIR}") + SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS_BUILD_DIR ${OV_TMP}) + + add_subdirectory(${FULLPATH}) + + ENDIF(${SKIP_THIS_FOLDER}) + ENDIF(IS_DIRECTORY ${FULLPATH} AND EXISTS "${FULLPATH}/CMakeLists.txt" AND NOT ${FULLPATH} MATCHES ".*\\.svn") + ENDFOREACH(FULLPATH ${FILENAMES}) + +ENDFUNCTION(OV_ADD_PROJECTS) + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/OvAddSingleProject.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/OvAddSingleProject.cmake new file mode 100644 index 0000000..d0027df --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/OvAddSingleProject.cmake @@ -0,0 +1,52 @@ +# +# This function is used to add a project to the build in the case where the current directory only contains +# 'branches', 'tags' and 'trunk' directories of a single project. The project will be added using the +# branch specified (if any) in the root CMakeList.txt or trunk otherwise. +# +# The branch variable name that is checked is made up from ${CURRENT_BRANCH_PREFIX}_${DIRNAMEUPPER}. +# +# The script also adds the directory to the global list of projects. +# + +FUNCTION(OV_ADD_SINGLE_PROJECT CURRENT_BRANCH_PREFIX) + + SET(BRANCH_VARIABLE_NAME "${CURRENT_BRANCH_PREFIX}") + + # MESSAGE(STATUS "Parts ${CURRENT_BRANCH_PREFIX} Now ${BRANCH_VARIABLE_NAME}") + # MESSAGE(STATUS "Value ${${BRANCH_VARIABLE_NAME}}") + + SET(SUBDIR "SUBDIR-NOTFOUND") + + # MESSAGE(STATUS "Checking branch for ${BRANCH_VARIABLE_NAME}") + + IF(${BRANCH_VARIABLE_NAME}) + SET(BRANCH ${${BRANCH_VARIABLE_NAME}}) + IF("${BRANCH}" STREQUAL "__SKIPME") + MESSAGE(STATUS "Note: ${BRANCH_VARIABLE_NAME} has been disabled by setting it to __SKIPME") + ELSE("${BRANCH}" STREQUAL "__SKIPME") + SET(SUBDIR "${BRANCH}") + ENDIF("${BRANCH}" STREQUAL "__SKIPME") + ELSE(${BRANCH_VARIABLE_NAME}) + # MESSAGE(STATUS "Going for trunk...") + SET(SUBDIR "${OV_TRUNK}") + ENDIF(${BRANCH_VARIABLE_NAME}) + + IF(SUBDIR) + # MESSAGE(STATUS "Inserting folder ${SUBDIR}") + + # Add the dir to be parsed for documentation later. We need to do this before adding subdir, in case the subdir is the actual docs dir. + GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS) + SET(OV_TMP "${OV_TMP};${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIR}") + SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS ${OV_TMP}) + +# MESSAGE(STATUS "BDIR ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIR}") + GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS_BUILD_DIR) + SET(OV_TMP "${OV_TMP};${CMAKE_CURRENT_BINARY_DIR}/${SUBDIR}") + SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS_BUILD_DIR ${OV_TMP}) + + + ADD_SUBDIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIR}) + + ENDIF(SUBDIR) + +ENDFUNCTION(OV_ADD_SINGLE_PROJECT) diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/OvInstallLaunchScript.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/OvInstallLaunchScript.cmake new file mode 100755 index 0000000..ca992b4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/OvInstallLaunchScript.cmake @@ -0,0 +1,79 @@ +INCLUDE(CMakeParseArguments) +# +# Creates launch script from a common OpenViBE template (in "cmake-modules/launchers/"), but dedicated to scenarios to be executed with the Designer +# +# The mandatory 1st argument SCRIPT_PREFIX specifies what the resulting script is called. A platform specific postfix will be added. +# The mandatory 2nd argument EXECUTABLE_NAME specifies what the resulting script will called eventually. +# The optional 3nd argument ARGV1 specifies some extra argument or switch that is given to the launched executable by the script +# +FUNCTION(OV_INSTALL_LAUNCH_SCRIPT) + SET(options PAUSE NOPROJECT) + SET(oneValueArgs SCRIPT_PREFIX EXECUTABLE_NAME ICON_PATH) + SET(multiValueArgs PARAMETERS) + + CMAKE_PARSE_ARGUMENTS(OV_INSTALL_LAUNCH_SCRIPT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + #OV_CONFIGURE_RC(NAME ${OV_INSTALL_LAUNCH_SCRIPT_SCRIPT_PREFIX} ICON_PATH ${OV_INSTALL_LAUNCH_SCRIPT_ICON_PATH}) + + # Install executable launcher if install_exe option is set to on, the os is WIN32, and no argument has been specified + IF(WIN32 AND INSTALL_EXE AND NOT(OV_INSTALL_LAUNCH_SCRIPT_PAUSE) AND NOT(OV_INSTALL_LAUNCH_SCRIPT_PARAMETERS)) + # Add the dir to be parsed for documentation later. We need to do this before adding subdir, in case the subdir is the actual docs dir + GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_EXE_PROJECTS_TO_INSTALL) + SET(OV_TMP "${OV_TMP};${OV_INSTALL_LAUNCH_SCRIPT_SCRIPT_PREFIX}") + SET_PROPERTY(GLOBAL PROPERTY OV_EXE_PROJECTS_TO_INSTALL ${OV_TMP}) + ELSE() + IF(WIN32) + SET(SCRIPT_POSTFIX ".cmd") + ELSEIF(APPLE) + SET(SCRIPT_POSTFIX "-macos.sh") + ELSEIF(UNIX) + # Debian recommends that extensions such as .sh are not used; On Linux, scripts with such extensions shouldn't be packaged + SET(SCRIPT_POSTFIX ".sh") + ENDIF() + # Extract the filename of the project executable, the variable in the script base will be replaced with it by CONFIGURE_FILE() + SET(OV_CMD_EXECUTABLE "TMP_PROJECT_TARGET_PATH-NOTFOUND") + IF(NOT OV_INSTALL_LAUNCH_SCRIPT_NOPROJECT) + GET_TARGET_PROPERTY(TMP_PROJECT_TARGET_PATH ${OV_INSTALL_LAUNCH_SCRIPT_EXECUTABLE_NAME} LOCATION) + GET_FILENAME_COMPONENT(OV_CMD_EXECUTABLE ${TMP_PROJECT_TARGET_PATH} NAME) + ENDIF() + + IF(${OV_CMD_EXECUTABLE} STREQUAL "TMP_PROJECT_TARGET_PATH-NOTFOUND") + SET(OV_CMD_EXECUTABLE ${OV_INSTALL_LAUNCH_SCRIPT_EXECUTABLE_NAME}) + # ELSE() + # IF(WIN32) + # SET(OV_CMD_EXECUTABLE "%OV_PATH_ROOT%\\bin\\${OV_CMD_EXECUTABLE}") + # ENDIF() + ENDIF() + + SET(SCRIPT_NAME ${OV_INSTALL_LAUNCH_SCRIPT_SCRIPT_PREFIX}${SCRIPT_POSTFIX}) + SET(OV_CMD_ARGS ${OV_INSTALL_LAUNCH_SCRIPT_PARAMETERS}) + + IF(OV_INSTALL_LAUNCH_SCRIPT_PAUSE) + SET(OV_PAUSE "PAUSE") + ELSE() + SET(OV_PAUSE "") + ENDIF() + + CONFIGURE_FILE(${OV_LAUNCHER_SOURCE_PATH}/openvibe-launcher${SCRIPT_POSTFIX}-base ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} @ONLY) + INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} DESTINATION ${DIST_ROOT}) + ENDIF() +ENDFUNCTION() + +#FUNCTION(OV_CONFIGURE_RC) +# SET(options ) +# SET(oneValueArgs NAME ICON_PATH) +# SET(multiValueArgs ) +# CMAKE_PARSE_ARGUMENTS(OV_CONFIGURE_RC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) +# SET(GENERATED_RC_FILE "${DIST_DATADIR}/resource-files/${OV_CONFIGURE_RC_NAME}.rc") +# IF(OV_CONFIGURE_RC_ICON_PATH) +# SET(CONFIGURE_ICON "ID_Icon ICON DISCARDABLE \"${OV_CONFIGURE_RC_ICON_PATH}\"") +# ENDIF() +# IF(NOT(PROJECT_PRODUCT_NAME)) +# SET(PROJECT_PRODUCT_NAME "${OV_CONFIGURE_RC_NAME}") +# ENDIF() +# SET(FILE_DESCRIPTION "${PROJECT_PRODUCT_NAME} for Win32") + +# CONFIGURE_FILE( +# ${OV_LAUNCHER_SOURCE_PATH}/resource-file.rc-base +# ${GENERATED_RC_FILE} +# @ONLY) +#ENDFUNCTION() diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/OvLinkBoostLib.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/OvLinkBoostLib.cmake new file mode 100644 index 0000000..643468a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/OvLinkBoostLib.cmake @@ -0,0 +1,63 @@ +# +# Win32 only +# +# This concoction mainly exists to locate the boost libraries on WIN32 in the case where our dependency/ folder has only a +# truncated version of boost and we cannot use find_package(). The background story is that we wish to link explicitly +# instead of using automatic linking and specifying a generic boost path to linker before each project definition. +# +# The downside of this is that it assumes the boost library names to have a particular format and only works for VC90/VC100 +# +# Function: Links specified boost library defined by COMPONENT and BOOST_VERSION to PROJECT_NAME. +# + + +FUNCTION(OV_LINK_BOOST_LIB BOOST_COMPONENT BOOST_VERSION) + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_BOOST_${BOOST_COMPONENT}) + +IF(WIN32) + + SET(LIB_BOOST "unknown-platform-NOTFOUND") + SET(LIB_BOOST_DEBUG "unknown-platform-NOTFOUND") + + STRING(REGEX MATCH "vc100.*" MSVC_VER100 ${MSVC_SERVICE_PACK}) + IF(MSVC_VER100) + SET(LIB_BOOST "libboost_${BOOST_COMPONENT}-vc100-mt-${BOOST_VERSION}.lib") + SET(LIB_BOOST_DEBUG "libboost_${BOOST_COMPONENT}-vc100-mt-gd-${BOOST_VERSION}.lib") + ENDIF(MSVC_VER100) + + STRING(REGEX MATCH "vc120.*" MSVC_VER120 ${MSVC_SERVICE_PACK}) + IF(MSVC_VER120) + SET(LIB_BOOST "libboost_${BOOST_COMPONENT}-vc120-mt-${BOOST_VERSION}.lib") + SET(LIB_BOOST_DEBUG "libboost_${BOOST_COMPONENT}-vc120-mt-gd-${BOOST_VERSION}.lib") + ENDIF(MSVC_VER120) + + SET(LIB_BOOST_PATH "-NOTFOUND") + FIND_LIBRARY(LIB_BOOST_PATH NAMES ${LIB_BOOST} PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES boost/lib NO_DEFAULT_PATH) + SET(LIB_BOOST_DEBUG_PATH "-NOTFOUND") + FIND_LIBRARY(LIB_BOOST_DEBUG_PATH NAMES ${LIB_BOOST_DEBUG} PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES boost/lib NO_DEFAULT_PATH) + + IF(LIB_BOOST_PATH AND LIB_BOOST_DEBUG_PATH) + OV_PRINT(OV_PRINTED " Found Boost ${BOOST_COMPONENT} libraries ...") + ELSE(LIB_BOOST_PATH AND LIB_BOOST_DEBUG_PATH) + OV_PRINT(OV_PRINTED " FAILED to find all Boost ${BOOST_COMPONENT} libraries ...") + ENDIF(LIB_BOOST_PATH AND LIB_BOOST_DEBUG_PATH) + + IF(LIB_BOOST_PATH) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_BOOST_PATH}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} optimized ${LIB_BOOST_PATH}) + ELSE(LIB_BOOST_PATH) + MESSAGE(STATUS " FAILED to find boost lib ${LIB_BOOST}") + ENDIF(LIB_BOOST_PATH) + + IF(LIB_BOOST_DEBUG_PATH) + OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_BOOST_DEBUG_PATH}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${LIB_BOOST_DEBUG_PATH}) + ELSE(LIB_BOOST_DEBUG_PATH) + MESSAGE(STATUS " FAILED to find boost debug lib ${LIB_BOOST_DEBUG}") + ENDIF(LIB_BOOST_DEBUG_PATH) +ENDIF(WIN32) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_BOOST_${BOOST_COMPONENT} "Yes") + +ENDFUNCTION(OV_LINK_BOOST_LIB) diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/OvMessages.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/OvMessages.cmake new file mode 100644 index 0000000..4ee71bd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/OvMessages.cmake @@ -0,0 +1,5 @@ +function(debug_message) + if(${Flag_VerboseOutput}) + message(STATUS "${ARGV}") + endif() +endfunction() diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/OvPrint.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/OvPrint.cmake new file mode 100755 index 0000000..b451a3f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/OvPrint.cmake @@ -0,0 +1,9 @@ + +FUNCTION(OV_PRINT ALREADY_PRINTED TEXT) + +IF("${${ALREADY_PRINTED}}" STREQUAL "") + MESSAGE(STATUS ${TEXT}) +ENDIF("${${ALREADY_PRINTED}}" STREQUAL "") + +ENDFUNCTION(OV_PRINT) + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/OvSetWindowsSDKPath.cmake b/Masterarbeit/openvibe/extras-master/cmake-modules/OvSetWindowsSDKPath.cmake new file mode 100644 index 0000000..7643be3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/OvSetWindowsSDKPath.cmake @@ -0,0 +1,17 @@ + +IF(NOT OV_MS_SDK_PATH) + GET_FILENAME_COMPONENT(OV_MS_SDK_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Win32SDK\\Directories;Install Dir]" ABSOLUTE CACHE) +ENDIF(NOT OV_MS_SDK_PATH) + +IF(NOT OV_MS_SDK_PATH) + GET_FILENAME_COMPONENT(OV_MS_SDK_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MicrosoftSDK\\Directories;Install Dir]" ABSOLUTE CACHE) +ENDIF(NOT OV_MS_SDK_PATH) + +IF(NOT OV_MS_SDK_PATH) + GET_FILENAME_COMPONENT(OV_MS_SDK_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]" ABSOLUTE CACHE) +ENDIF(NOT OV_MS_SDK_PATH) + +IF(NOT OV_MS_SDK_PATH) + MESSAGE(STATUS "Could not find Microsoft Windows SDK") +ENDIF(NOT OV_MS_SDK_PATH) + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/launchers/openvibe-external-application-launcher-base b/Masterarbeit/openvibe/extras-master/cmake-modules/launchers/openvibe-external-application-launcher-base new file mode 100644 index 0000000..5d95c88 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/launchers/openvibe-external-application-launcher-base @@ -0,0 +1,30 @@ +#!/bin/bash +# +# This script is meant to be launched from inside an OpenViBE application (such as a scenario in Designer) +# + +CALLCMD=$1 +shift + +ov_run_bg=0 +if [ "$1" == "--run-bg" ]; then + ov_run_bg=1 + shift +fi + +# OV_PATH_BIN overrides the CMake specified folder, if given +LOCAL_BIN_PATH="@CMAKE_INSTALL_FULL_BINDIR@" +if [ "$OV_PATH_BIN" != "" ]; then + LOCAL_BIN_PATH="$OV_PATH_BIN" +fi + +ret_code=0 + +if [ $ov_run_bg == 0 ]; then + eval "$LOCAL_BIN_PATH/$CALLCMD" @OV_CMD_ARGS@ $* + ret_code=$? +else + "$LOCAL_BIN_PATH/$CALLCMD" @OV_CMD_ARGS@ $* & +fi + +exit $ret_code diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/launchers/openvibe-external-application-launcher.cmd-base b/Masterarbeit/openvibe/extras-master/cmake-modules/launchers/openvibe-external-application-launcher.cmd-base new file mode 100644 index 0000000..4227c89 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/launchers/openvibe-external-application-launcher.cmd-base @@ -0,0 +1,18 @@ +@echo off + +REM +REM This script is meant to be launched from an environment with the OV_PATH_BIN env variable set externally +REM + +SET "OV_RUN_APP=%1" +SHIFT + +SET OV_RUN_IN_BG= +IF /i "%1"=="--run-bg" ( + REM Run in background. The first arg to START is the app title. + SET OV_RUN_IN_BG=START "%OV_RUN_APP%" + SHIFT +) + +%OV_RUN_IN_BG% "%OV_PATH_ROOT%\bin\%OV_RUN_APP%" %1 %2 %3 %4 %5 + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/launchers/openvibe-launcher.cmd-base b/Masterarbeit/openvibe/extras-master/cmake-modules/launchers/openvibe-launcher.cmd-base new file mode 100644 index 0000000..3f3e01d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/launchers/openvibe-launcher.cmd-base @@ -0,0 +1,55 @@ +@ECHO OFF +SETLOCAL EnableExtensions +SETLOCAL EnableDelayedExpansion + +REM If not set to PASSIVE, OpenMP (Eigen) boxes may load the cores fully even if there's little to do. +SET "OMP_WAIT_POLICY=@OV_OMP_WAIT_POLICY@" + +REM Get the directory location of this script, assume it contains the OpenViBE dist tree. These variables will be used by OpenViBE executables. +SET "OV_PATH_ROOT=%~dp0" + +REM Default behavior +SET OV_PAUSE=PAUSE +SET OV_RUN_IN_BG= + +REM Parse out Windows specific args ... +SET "ARGS=" +SET EMPTY= +:loop +SET "STRIPPEDARG=%~1" +if NOT !STRIPPEDARG! == !EMPTY! ( + IF /i "!STRIPPEDARG!" == "--no-pause" ( + SET OV_PAUSE= + goto found: + ) + IF /i "!STRIPPEDARG!" == "--run-bg" ( + REM Run in background, disable pause. The second parameter below is because CMD requires a 'title' + SET OV_RUN_IN_BG=START "@OV_CMD_EXECUTABLE@" + SET OV_PAUSE= + goto found: + ) + + REM Pass the non-stripped arg to the launched application... + SET ARGS=%ARGS% %1 + +:found + SHIFT + goto loop: +) + +REM Set dependency paths etc... +SET "OV_ENVIRONMENT_FILE=%OV_PATH_ROOT%\bin\OpenViBE-set-env.cmd" +IF NOT EXIST "%OV_ENVIRONMENT_FILE%" ( + ECHO Error: "%OV_ENVIRONMENT_FILE%" was not found + GOTO EndOfScript +) +CALL "%OV_ENVIRONMENT_FILE%" + +REM cmake variable OV_CMD_ARGS below may specify additional arguments outside this script + +%OV_RUN_IN_BG% "%OV_PATH_ROOT%\bin\@OV_CMD_EXECUTABLE@" @OV_CMD_ARGS@ %ARGS% + +:EndOfScript + +%OV_PAUSE% + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/launchers/openvibe-launcher.sh-base b/Masterarbeit/openvibe/extras-master/cmake-modules/launchers/openvibe-launcher.sh-base new file mode 100644 index 0000000..114ddb4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/launchers/openvibe-launcher.sh-base @@ -0,0 +1,65 @@ +#!/bin/bash + +## By default, paths specified by CMake install will be used to locate OpenViBE components. If defined, these ENV variables can override the CMake defines. +export OV_PATH_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +export OV_PATH_BIN="$OV_PATH_ROOT/bin" +export OV_PATH_LIB="$OV_PATH_ROOT/lib" +export OV_PATH_DATA="$OV_PATH_ROOT/share/openvibe" + +# Dump core... +# ulimit -c unlimited + +# Tries to locate matlab executable from $PATH, and set the library path to the corresponding matlab libs. +if [ "`which matlab`" != "" ] ; then + MATLAB_ROOT=`matlab -e | grep "^MATLAB=" | sed -e "s/^MATLAB=//"` + MATLAB_ARCH=`matlab -e | grep "^ARCH=" | sed -e "s/^ARCH=//"` + MATLAB_LIBPATH="$MATLAB_ROOT/bin/$MATLAB_ARCH" + # echo Matlab libs expected at $MATLAB_LIBPATH + export LD_LIBRARY_PATH="$MATLAB_LIBPATH:$LD_LIBRARY_PATH" +fi + +LOCAL_BIN_PATH="@CMAKE_INSTALL_FULL_BINDIR@" +if [ "$OV_PATH_BIN" != "" ]; then + LOCAL_BIN_PATH="$OV_PATH_BIN" +fi +LOCAL_LIB_PATH="@CMAKE_INSTALL_FULL_LIBDIR@" +if [ "$OV_PATH_LIB" != "" ]; then + LOCAL_LIB_PATH="$OV_PATH_LIB" +fi + +export LD_LIBRARY_PATH="$LOCAL_LIB_PATH:@OV_PATH_DEPENDENCY_LIBS@:$LD_LIBRARY_PATH" +export LC_ALL=C + + +# The following line is there to help in cases where OpenViBE can consume excessive +# amounts of CPU or grind the swap. You can remove it if you know what you're doing. +renice 19 $$ + +ov_debugger= +if [ "$1" == "--debug" ]; then + ov_debugger="gdb --args" + shift +fi + +if [ "$1" == "--memcheck" ]; then + ov_debugger="valkyrie " + #ov_debugger="valgrind --tool=memcheck --log-file='valgrind_@OV_CMD_EXECUTABLE@_%p.log'" + shift +fi +ov_run_bg=0 +if [ "$1" == "--run-bg" ]; then + ov_run_bg=1 + shift +fi + +ret_code=0 + +if [ $ov_run_bg == 0 ]; then + eval $ov_debugger "$LOCAL_BIN_PATH/@OV_CMD_EXECUTABLE@" @OV_CMD_ARGS@ "$@" + ret_code=$? +else + $ov_debugger "$LOCAL_BIN_PATH/@OV_CMD_EXECUTABLE@" @OV_CMD_ARGS@ "$@" & +fi + +exit $ret_code + diff --git a/Masterarbeit/openvibe/extras-master/cmake-modules/launchers/openvibe-ogre-plugins.cfg-base b/Masterarbeit/openvibe/extras-master/cmake-modules/launchers/openvibe-ogre-plugins.cfg-base new file mode 100644 index 0000000..faf35cb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/cmake-modules/launchers/openvibe-ogre-plugins.cfg-base @@ -0,0 +1,5 @@ +PluginFolder=@OGRE3D_PLUGIN_PATH@ +Plugin=RenderSystem_GL +Plugin=Plugin_ParticleFX +Plugin=Plugin_BSPSceneManager +Plugin=Plugin_OctreeSceneManager diff --git a/Masterarbeit/openvibe/extras-master/contrib/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/CMakeLists.txt new file mode 100644 index 0000000..b3de26a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/CMakeLists.txt @@ -0,0 +1,5 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("CONTRIB") + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/applications/CMakeLists.txt new file mode 100644 index 0000000..fae2879 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/CMakeLists.txt @@ -0,0 +1,3 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("CONTRIB_APPLICATIONS") diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/CMakeLists.txt new file mode 100644 index 0000000..7239f64 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/CMakeLists.txt @@ -0,0 +1,3 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("CONTRIB_APPLICATIONS_DEVELOPER-TOOLS") diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/.gitignore b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/.gitignore new file mode 100644 index 0000000..8f0c7ef --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/.gitignore @@ -0,0 +1,113 @@ + +compilation.log + + +# Created by https://www.gitignore.io/api/python +# Edit at https://www.gitignore.io/?templates=python + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# End of https://www.gitignore.io/api/python diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/BoxManager/NewBoxPattern-skeletton.h b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/BoxManager/NewBoxPattern-skeletton.h new file mode 100644 index 0000000..5f5f4c1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/BoxManager/NewBoxPattern-skeletton.h @@ -0,0 +1,98 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file NewBoxPattern.h +/// \brief Class NewBoxPattern +/// \author Thibaut Monseigne (Inria) & Jimmy Leblanc (Polymont) & Yannis Bendi-Ouis (Polymont) +/// \version 1.0. +/// \date 12/03/2020. +/// \copyright , OVP_ClassId_BoxAlgorithm_NewBoxPattern) + }; + + class CBoxAlgorithmNewBoxPatternListener final : public Toolkit::TBoxListener + { + public: + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + box.setInputType(index, OV_TypeId_StreamedMatrix); + return true; + } + + bool onOutputAdded(Kernel::IBox& box, const size_t index) override + { + box.setOutputType(index, OV_TypeId_StreamedMatrix); + return true; + } + _IsDerivedFromClass_Final_(Toolkit::TBoxListener < IBoxListener >, CIdentifier::undefined()) + }; + + class CBoxAlgorithmNewBoxPatternDesc final : virtual public IBoxAlgorithmDesc + { + public: + + void release() override { } + + CString getName() const override { return CString("NewBoxPattern"); } + CString getAuthorName() const override { return CString("NewAuthor"); } + CString getAuthorCompanyName() const override { return CString("NewCompany"); } + CString getShortDescription() const override { return CString("Default Python Description"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Scripting/Pybox/"); } + CString getVersion() const override { return CString("0.1"); } + CString getStockItemName() const override { return CString("gtk-convert"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_NewBoxPattern; } + IPluginObject* create() override { return new CBoxAlgorithmNewBoxPattern; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmNewBoxPatternListener; } + void releaseBoxListener(IBoxListener* pBoxListener) const override{ delete pBoxListener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("Clock frequency (Hz)", OV_TypeId_Integer, "64"); + // settings + + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + prototype.addFlag(Kernel::BoxFlag_CanAddOutput); + prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + prototype.addFlag(Kernel::BoxFlag_CanAddSetting); + prototype.addFlag(Kernel::BoxFlag_CanModifySetting); + + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_Stimulations); + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + + prototype.addOutputSupport(OV_TypeId_Signal); + prototype.addOutputSupport(OV_TypeId_Stimulations); + prototype.addOutputSupport(OV_TypeId_StreamedMatrix); + + // input & output + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_NewBoxPatternDesc) + }; + } +} +} +#endif // #if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) + +#endif // TARGET_HAS_ThirdPartyPython3 diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/BoxManager/infobulle.png b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/BoxManager/infobulle.png new file mode 100644 index 0000000..3dbd99c Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/BoxManager/infobulle.png differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/add_label.jpeg b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/add_label.jpeg new file mode 100644 index 0000000..286dc42 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/add_label.jpeg differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/box_manager.png b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/box_manager.png new file mode 100644 index 0000000..f5b873b Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/box_manager.png differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/classifiers.png b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/classifiers.png new file mode 100644 index 0000000..79fec49 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/classifiers.png differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/manage_custom_settings.png b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/manage_custom_settings.png new file mode 100644 index 0000000..a2cfa98 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/manage_custom_settings.png differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/ov-mode.jpeg b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/ov-mode.jpeg new file mode 100644 index 0000000..7feac3f Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/ov-mode.jpeg differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/poly-mode.jpeg b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/poly-mode.jpeg new file mode 100644 index 0000000..5590044 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/poly-mode.jpeg differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/random-forest.PNG b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/random-forest.PNG new file mode 100644 index 0000000..ebf5908 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Doc/random-forest.PNG differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/down.mp3 b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/down.mp3 new file mode 100644 index 0000000..7d29a4a Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/down.mp3 differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/left.mp3 b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/left.mp3 new file mode 100644 index 0000000..7d6e8ce Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/left.mp3 differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/left_wink.mp3 b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/left_wink.mp3 new file mode 100644 index 0000000..0408e6f Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/left_wink.mp3 differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/neutral.mp3 b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/neutral.mp3 new file mode 100644 index 0000000..b7f3ec1 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/neutral.mp3 differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/pull.mp3 b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/pull.mp3 new file mode 100644 index 0000000..096904c Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/pull.mp3 differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/push.mp3 b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/push.mp3 new file mode 100644 index 0000000..8329fc0 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/push.mp3 differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/right.mp3 b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/right.mp3 new file mode 100644 index 0000000..0e99fce Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/right.mp3 differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/right_wink.mp3 b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/right_wink.mp3 new file mode 100644 index 0000000..81f3782 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/right_wink.mp3 differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/stop.mp3 b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/stop.mp3 new file mode 100644 index 0000000..24100eb Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/stop.mp3 differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/up.mp3 b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/up.mp3 new file mode 100644 index 0000000..7266ab0 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/Assets/Sounds/up.mp3 differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/CMakeLists.txt new file mode 100644 index 0000000..cd2da3e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/CMakeLists.txt @@ -0,0 +1,57 @@ +PROJECT(openvibe-plugins-contrib-pybox) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE source_files src/*.cpp src/*.hpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${source_files}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +INCLUDE_DIRECTORIES("src") + +# --------------------------------- +# OpenVibe Modules (uncomment usefull package) +# --------------------------------- +# OpenViBE Base +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") + +# OpenViBE Module +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleSystem") + +# OpenViBE Third Party +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyPython3") + +# --------------------------------- +# Target macros +# Defines target operating system +# Defines target architecture +# Defines target compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/plugins/python3) + +# --------------------------------- +# Test applications (uncomment to enable your test directory) +# --------------------------------- +#IF(OV_COMPILE_TESTS) +# ADD_SUBDIRECTORY(test) +#ENDIF(OV_COMPILE_TESTS) + diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/README.md b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/README.md new file mode 100644 index 0000000..89c734d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/README.md @@ -0,0 +1,287 @@ +# OpenViBE Python + +This Project aims to bring modifications to OpenVibe and to widen its data-oriented functionnalities. OpenVibe is a signal processing software allowing the use of machine learning algorithms, however their number is reduced. Thus, we woud like to benefit from the Openvibe Python scripting box (which allows the use of python scripts in OV) in order to allow users to use Scikit-learn Machine Learning algorithms. + +## Dependancies + +`pip install pyqt5 pandas numpy natsort pygame sklearn matplotlib pyriemann` + +## What OpenViBE Python allows + +- The use of components already implemented in OpenVibe that will allow you to : + - The use of ML algorithms from Scikit-learn and Pyriemann (Library centered on the use of Riemannian geometry) that will allow you to train and store models. + - Visualization of your data in 2D/3D via a PCA or LDA. + - Easily create datasets compatible with OpenVibe's operation +- The use of a manager that allows you to simply : + - Create new boxes in OpenVibe + - Create new types of openvibe settings that can be used in your new boxes. +- The reuse of our scripts in order to simply implement your own python data management + + 1. The new boxes + TrainerML / ML Class Boxes + Box ProcessML + Box DataViz + DatasetCreator Box + 2. The Pybox Manager + Box Manager + Stimulations / Labels Manager + Custom Settings Manager + 3. Internal functioning and details + Our box model: PolyBox + Input management with PolyBox, two modes possible + Duplicating the Python Scripting Box + PolyBox: Automatic data storage + Managing Custom Settings + +Translated with www.DeepL.com/Translator (free version) + +## Table des matières + +- [OpenViBE Python](#openvibe-python) + - [Dependancies](#dependancies) + - [What OpenViBE Python allows](#what-openvibe-python-allows) + - [Table des matières](#table-des-mati%c3%a8res) + - [1. The new boxes](#1-the-new-boxes) + - [TrainerML Class / ML Boxes](#trainerml-class--ml-boxes) + - [Scikit-learn](#scikit-learn) + - [Pyriemann](#pyriemann) + - [Box ProcessML](#box-processml) + - [Box DataViz](#box-dataviz) + - [Box DatasetCreator](#box-datasetcreator) + - [2. The Pybox Manager](#2-the-pybox-manager) + - [Box Manager](#box-manager) + - [Stimulations / Labels Manager](#stimulations--labels-manager) + - [Custom Settings Manager](#custom-settings-manager) + - [3. Internal Functioning and Details](#3-internal-functioning-and-details) + - [Our Box model : PolyBox](#our-box-model--polybox) + - [Input management with PolyBox, two possible modes](#input-management-with-polybox-two-possible-modes) + - [Duplicating the Python Scripting Box](#duplicating-the-python-scripting-box) + - [Automatic data storage](#automatic-data-storage) + - [Managing Custom Settings](#managing-custom-settings) + +## 1. The new boxes + +### TrainerML Class / ML Boxes + +The TrainerML class defined in TrainerML.py is a class that inherits from [PolyBox](#our-box-model-polybox), its purpose is to be used in boxes that will be configured to allow the use of certain learning machine algorithms. The following parameters can be passed to it: + +- **Filename to save model to** : Path to the file in which to save the model. If no file is indicated, then the model will not be saved. +- **Filename to load model from** : Path to the file in which the model to be loaded is saved. If a file is specified and exists, no model will be created and the model contained in the file will be loaded and used for the current session. +- **classifier** : Algorithm you wish to use. The various Algorithms are from Scikit-learn or Pyriemann. +- **discriminator** : In case the chosen classifier is `TangentSpace`, it is necessary to provide a second algorithm which will be used to classify after the projection on the tangent space. All the previous algorithms can be used except `TangentSpace` and `MDM`. If no algorithm is specified, `LinearDiscriminantAnalysis` will be used by default. +Similarly for `MDM`, a second algorithm may be used, but is not mandatory. +- **labels**: If the read mode is Poly-Mode, you must specify the list of labels as `my label1, my label2, my label3`, otherwise, the labels will be as follows `1, 2, 3, 4, ...`. If the read mode is ov-mode, you can leave the field blank, the labels will be extracted from the stimuli. +- **Test set share**: float between 0 and 1 (1 not included) which represents the proportion of the input dataset transformed into a test set, allowing us to evaluate our model once the training on the set train is done. If 0 is filled in, then all the data will constitute the train set and no metrics will be displayed. + +Here are the new algorithms / boxes implemented in OV : + +#### Scikit-learn + + + +> | Box Name | Algorithm | +> | :-: | :-: | +> | Nearest Centroid | NearestCentroid | +> | Nearest Neighbors Classifier | KNeighborsClassifier | +> | Gaussian Naive Bayes | GaussianNB | +> | Stochastic Gradient Descent | SGDClassifier | +> | Logistic Regression | LogisticRegression | +> | Decision Tree Classifier | DecisionTreeClassifier | +> | Extra Trees | ExtraTreesClassifier | +> | Bagging | BaggingClassifier | +> | Random Forest | RandomForestClassifier | +> | Support Vector Machine | LinearSVC | +> | Linear Discriminant Analysis | LinearDiscriminantAnalysis | +> | AdaBoost | AdaBoostClassifier | +> | Multi Layer Perceptron | MLPClassifier | +> | Linear SVC | LinearSVC | + +#### Pyriemann + + + +> | String | Algorithm | +> | :-: | :-: | +> | Riemann Minimum Distance to Mean | MDM | +> | Riemann Tangent Space | TangentSpace | + +You can easily find information on each of these methods in the docs of their library. + +For each of these classifiers, an Openvibe box using TrainerML with the appropriate parameters has been created. So, if you want to train with the Random Forest algorithm of Scikit-learn for example, you just have to look for the associated box in Openvibe and you will be able to use it directly, and modify the parameters related to the algorithm. You will find the information concerning all these parameters on the respective pages of the algorithms, ex: + +> ![random-forest.PNG](Assets/Doc/random-forest.PNG) +> +> Example of parameterization of a box implementing Random Forest + +### Box ProcessML + +This box allows you to make classification predictions on new data using a previously trained model (via TrainerML or the boxes that inherit it, e.g. SVM, LDA, RandomForest ...). + +- **Model Filename**: Path where the model you want to use is stored. +- **Filename to save predictions** : Path to the file where to save the predictions. If no file is specified, then the predictions will not be saved. The predictions are saved as a string where each prediction is separated from the others by a comma: `pred1,pred2,pred3 ...`. + +Once the model is loaded, the predictions will be made on each chunk of data received, they can be used in real time, and if a path is given, they can be saved for later use. + +### Box DataViz + +The DataViz Box allows the visualization of our data. To do this, it applies a dimension reduction via an LDA or PCA and then displays our data using the matplotlib library. It inherits from PolyBox. It requires the following parameters: + +- **Path to save the model**: Path to the file in which to save the model. If no file is specified, then the model will not be saved. +- **Path to load the model** : Path to the file in which is saved the model you want to load. If a file is specified and exists, then no model will be created and the model contained in the file will be loaded and used for the current session. +- **Algorithm (PCA or LDA)** : Name of the algorithm to be used to reduce dimensions. Accepted values are `PCA` or `LDA`. The default algorithm used is LDA. +- **Dimension reduction**: Number of dimensions to display. The different possible values are 2 and 3. By default, if no number is given or if the field is filled incorrectly, the number of dimension is 2. +- **labels** : List of labels to indicate as `my label1, my label2, my label3` if the read mode is poly-mode. Otherwise, the labels will be in the form `1, 2, 3, 4, ...`. + +### Box DatasetCreator + +To facilitate data acquisition during our experiments, we created the python box `DatasetCreator`. This box takes a signal as an input and outputs a `OVTK_StimulationId_ExperimentStop' stimulation when it has finished creating the dataset. + +It works in the following way: the user first chooses some labels, then the box will randomly determine an order between them. It will then record the user's brain activity while verbally indicating the current action. In this way, we will be able to create a labeled dataset that can be used for learning. + +The recording of an action takes place in the following way: + +1. Audible warning of the beginning of the action. +2. 2 second wait. +3. Recording for 10 seconds. +4. Audible warning of the end of the action. +5. Wait for 3 seconds. + +It can be configured by indicating : + +- The path to the directory that will contain the data. +- The number of folds you wish to obtain. +- The number of actions you wish to record. That is to say 30 if you wish to obtain 30 recordings of 10 seconds distributed among the different labels. +- The names of the labels you want to record (/!\ Attention, these names must have a corresponding mp3 file in `pybox-manager/Assets/Sounds/`, you can create new labels with the manager). +- A boolean indicating whether you want several CSVs or only one CSV. If you enter "true", then the data will be split into as many CSVs as there are actions, one CSV per action. If you enter "false", then the data will all be recorded in a single CSV, in which the start of a new recording for a label will be indicated in the stimuli. + +## 2. The Pybox Manager + +The Pybox Manager allows you to simply create and incorporate new boxes running a Python script of your choice, new labels/stimulations and new Custom Settings for your python boxes into OpenVibe. + +To run it: `python pybox_manager.py`. + +(Python 2.7 and python 3.X compatible.) + +An option is available to enable the so-called "developer settings" i.e. the ones you created. +To do this, run the manager with the `-mode=developer` option. + +### Box Manager + +The Box Manager looks like this: + +> ![box_manager.png](Assets/Doc/box_manager.png) +> +> PyBox Manager. + +- New: Create a new box +- Duplicate: duplicates the currently selected box. +- Reset Box: resets the selected box, cancels all changes made since the last compilation. +- Category : category in which the box will be stored in OV. +- Author : add the author's name in the box's references. +- Settings: Allows you to manage all the settings necessary to use the box. These can be types from Openvibe (String, Float etc.) or types created by yourself with the [Custom settings Manager](#custom-settings-manager) +- Inputs: Used to fill in the different inputs that your box will receive. +- Outputs : Used to fill in the different outputs that your box will send. +- Enable settings / inputs / outputs modifications : Allows you to prevent the users of your box from modifying these elements later on. +- Mode : allows you to quickly configure the inputs of your box according to the mode you want to use. [Inputs Polybox](#input-management-with-polybox-two-possible-modes) + +Once your modifications are finished you can press Build to have the modifications taken into account, and the compilation is done (mandatory to have your modifications and new boxes). The compilation.log file contains information from the last compilation. + +Delete Box deletes the currently selected box (a compilation is necessary to take the deletion into account). + +### Stimulations / Labels Manager + +When reading and processing our signals, OpenViBE can handle stimulations. These can be used to label our data during a classification/training procedure. +All these stimulations are indicated in the file `pybox-manager/share/PolyStimulations.py`. + +The DatasetCreator box we have created allows you to monitor the creation of a labeled dataset for the user. To do this, the box plays a sound during each action, indicating the action the user should think about. Basically, the user will have at his disposal about ten different labels. + +We allow the user to add labels (stimulations) via the `Stimulations/Labels Manager` interface present in the manager. +To do this, the manager must provide the name of the label, and a corresponding `.mp3` file, which will be played by the DatasetCreator. + +> ![add_label.jpeg](Assets/Doc/add_label.jpeg) +> +> Add a label/stimulation to OpenViBE. + +### Custom Settings Manager + +The `Custom Settings Manager` allows you to create or delete special types of settings, as well as possible values for these settings, according to your needs. + +This is especially useful to allow easy use on OpenVibe using a drop-down list. For example, if you want to be able to choose one algorithm among several, directly in your OpenVibe box configuration, you just have to create this new type as well as the associated values via the manager as shown in the following illustration. + +To be able to use them with the manager when defining the parameters of a box, you have to launch the manager with the option `mode=developer`. + +> ![manage_custom_settings.png](Assets/Doc/manage_custom_settings.png) +> +> Add/Remove/Manage Custom Settings. + +Result in OpenVibe : + +> ![classifiers.png](Assets/Doc/classifiers.png) +> +> Example with a new type 'classifier'. + +## 3. Internal Functioning and Details + +### Our Box model : PolyBox + +To facilitate our development phases, we have added in `pybox-manager/share/PolyBox.py` a class called `PolyBox`. This class inherits from the OVBox class. It automates the reception and storage of an input signal and allows the development of simple methods called at key moments: + +- **on_initialize(self) :** called at initialization, this method aims at allowing the user to define a particular behavior during initialization. +- **on_header_received(self, header) :** called at each reception of a header, this method aims to allow the user to define a particular behavior when receiving a header. +- **on_chunk_received(self, chunk, label, shape) :** called at each reception of a chunk, this method aims to allow the user to define a particular behavior when receiving a chunk. +- **on_end_box(self) :** called just before the box finishes its work, this method aims to allow the user to define a particular behavior when the box finishes. + +We have created this box in order to be able to attribute behaviors adapted to our use cases, in particular to easily create boxes proposing Machine Learning algorithms based on its architecture. + +#### Input management with PolyBox, two possible modes + +Any box inheriting the PolyBox automatically has two possible read modes to retrieve input data. + +The first mode (`ov-mode`) corresponds to the classic OpenViBE reading mode: the different classes are all included in the same .csv file, and we use input stimuli to separate our data into different classes. To use this mode, you just have to give the box only two inputs: 1 StreamedMatrix and 1 Stimulation. + +For example: + +> ![ov-mode.jpeg](Assets/Doc/ov-mode.jpeg) +> +> **Figure 1** - ov-mode + +The second mode (`poly-mode`) consists in considering as many files as there are classes, i.e. one .csv file per class. To read all these files, the box then needs to have at least as many StreamedMatrix inputs as there are different classes. To use this mode, you just have to create only StreamedMatrix inputs. +(Often, this mode requires a `label` parameter in which to fill in the labels of our different classes in the form: `my label1, my label2, my label3`). + +For example: + +> ![poly-mode.jpeg](Assets/Doc/poly-mode.jpeg) +> **Figure 2** - poly-mode + +Thus, these two reading modes are transparent for the user and allow him to operate the `PolyBoxes` either with a single file containing all the actions, or with several files: one per action. +The user doesn't need to indicate anything for the box to choose the right behavior to adopt, the box chooses its behavior according to its inputs. + +### Duplicating the Python Scripting Box + +Toutes les modifications ont été faite, on peut maintenant compiler. Toutes ces étapes sont implémentées dans `pybox-manager/ov-manager.py`. + +All the modifications we have made to the software are based on the duplication of the Python Scripting box. Since the latter allows the use of a python script, we decided to create a manager that allows us to automatically make changes in the OV code to duplicate the C++ files needed to duplicate the Python Scripting Box. This way, we can definitively associate a script to a box, and let the user configure it and integrate it into OpenViBE. + + Each time a python box is created, the manager performs the following tasks: + + 1. Go to the root directory of the python boxes: `pybox-manager/src/`. + 2. We duplicate `pybox-manager/Assets/BoxManager/NewBoxPattern-skeletton.h` into `ovpBoxName.h` + 3. Insert the CIdentifier declaration into `src/defines.hpp`. + 4. Add to `src/main.cpp` the imports of the newly created files for the box creation as well as the declarations. + 5. In `src/box-algorithms/ovpBoxName.h`, replace the box name and includes/declarations. + 6. Change the box name and description in `src/box-algorithms/ovpBoxName.h`. + 7. Set the path of the script to be executed in `src/box-algorithms/ovpBoxName.h`. + 8. Remove the possibility to change the path. + 9. Add the parameters of our box to `src/box-algorithms/ovpBoxName.h`. + 10. Add the box's inputs and outputs to `src/box-algorithms/ovpBoxName.h`. + +All changes have been made, we can now compile. All these steps are implemented in `pybox-manager/ov-manager.py`. + +### Automatic data storage + +Automatically, the box stores all received chunk in `self.data`. This can be handy if the user wants to use all the data at the end of the box (to train a learning machine model for example). +However, it is possible to prevent this behavior voluntarily. To do this, simply give as a parameter when creating the PolyBox `record=False`. By default, record is set to True. + +### Managing Custom Settings + +We add to `meta/sdk/toolkit/include/toolkit/ovtk_defines.hpp` the declaration of our new Custom Settings and to `meta/sdk/toolkit/src/ovtk_main.cpp` the creation of the custom setting and the declaration of its different values. diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/README_FR.md b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/README_FR.md new file mode 100644 index 0000000..0b41189 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/README_FR.md @@ -0,0 +1,266 @@ +# OpenViBE Python + +Ce projet a pour but d'apporter des modifications à OpenViBE et d'ouvrir ses possibilités d'un point de vue Data Science. OpenViBE est un logiciel de traitement du signal permettant l'utilisation d'algorithmes de machine learning, cependant ces algorithmes sont limités en choix. Ainsi, nous souhaitons utiliser l'ouverture laissée par la Python scripting box d'OpenViBE (qui permet d'utiliser des scripts python dans OV) pour permettre aux utilisateurs d'utiliser les algorithmes implémentés par des librairies tierces. + +## Dépendances + +`pip install pyqt5 pandas numpy natsort pygame sklearn matplotlib pyriemann` + +## Ce que permet OpenViBE Python + +- L'utilisation de composants déjà implémentés dans OpenVibe qui vous permettront : + - l'utilisation d'algorithmes de ML issus de Scikit-learn ainsi que Pyriemann (Librarie centrée sur l'utilisation de la géométrie Riemannienne) qui vous permettront d'entrainer et de stocker des modèles. + - La visualisation de vos données en 2D/3D via une PCA ou une LDA. + - Créer facilement des datasets compatibles avec le fonctionnement d'OpenVibe +- L'utilisation d'un manager qui permet de simplement : + - Créer des nouvelles boites dans OpenVibe + - Créer des nouveaux types de "settings" openvibe qui pourront être utilisés dans vos nouvelles boites +- La réutilisation de nos scripts afin d'implenter simplement votre propre gestion de la donnée en python + +## Table des matières + +- [OpenViBE Python](#openvibe-python) + - [Dépendances](#d%c3%a9pendances) + - [Ce que permet OpenViBE Python](#ce-que-permet-openvibe-python) + - [Table des matières](#table-des-mati%c3%a8res) + - [1. Les nouvelles boites](#1-les-nouvelles-boites) + - [Classe TrainerML / ML Boxes](#classe-trainerml--ml-boxes) + - [Scikit-learn](#scikit-learn) + - [Pyriemann](#pyriemann) + - [Box ProcessML](#box-processml) + - [Box DataViz](#box-dataviz) + - [Box DatasetCreator](#box-datasetcreator) + - [2. Le Pybox Manager](#2-le-pybox-manager) + - [Box Manager](#box-manager) + - [Stimulations / Labels Manager](#stimulations--labels-manager) + - [Custom Settings Manager](#custom-settings-manager) + - [3. Fonctionnement interne et détails](#3-fonctionnement-interne-et-d%c3%a9tails) + - [Notre modèle de boite : PolyBox](#notre-mod%c3%a8le-de-boite--polybox) + - [Gestion des inputs avec PolyBox, deux modes possibles](#gestion-des-inputs-avec-polybox-deux-modes-possibles) + - [Duplication de la Python Scripting Box](#duplication-de-la-python-scripting-box) + - [PolyBox : Stockage automatique des données](#polybox--stockage-automatique-des-donn%c3%a9es) + - [Gestion des Custom Settings](#gestion-des-custom-settings) + +## 1. Les nouvelles boites + +### Classe TrainerML / ML Boxes + +La classe TrainerML définie dans TrainerML.py est une classe qui hérite de [PolyBox](#notre-modèle-de-boite-polybox), son but est d'être utilisée dans des boîtes qui vont être paramétrées afin de permettre l'utilisation de certains algorithmes de machine learning. On peut lui passer les paramètres suivants : + +- **Filename to save model to** : Chemin vers le fichier dans lequel sauvegarder le modèle. Si aucun fichier n'est indiqué, alors le modèle ne sera pas enregistré. +- **Filename to load model from** : Chemin vers le fichier dans lequel est sauvegardé le modèle que l'on souhaite charger. Si un fichier est renseigné et qu'il existe, aucun modèle ne sera créé et le modèle contenu dans le fichier sera chargé et utilisé pour la session en cours. +- **classifier** : Algorithme que l'on souhaite utiliser. Les différents Algorithmes sont issus de Scikit-learn ou bien de Pyriemann. +- **discriminator** : Dans le cas où le classifier choisi est `TangentSpace`, il est nécessaire de fournir un second algorithme qui servira de classifier après la projection sur l'espace tangent. Tous les algorithmes précédents peuvent être utilisés sauf `TangentSpace` et `MDM`. Si aucun algorithme n'est indiqué, `LinearDiscriminantAnalysis` sera utilisé par défault. +De même pour `MDM`, un second algorithme peut être utilisé, mais n'est pas obligatoire. +- **labels** : Si le mode de lecture est Poly-Mode, vous devez indiquer la liste de labels sous la forme `mon label1, mon label2, mon label3`, sinon, les labels seront de la forme `1, 2, 3, 4, ...`. Si le mode de lecture est ov-mode, vous pouvez laissez le champs vide, les labels seront extraits des stimulations. +- **Test set share** : float compris entre 0 et 1 (1 non inclus) qui représente la proportion du dataset d'entrée transformée en test set, nous permettant d'évaluer notre modèle une fois l'entrainement sur le train set effectué. Si 0 est renseigné, alors toutes les données constitueront le train set et aucune métrique ne sera affichée. + +Voici les nouveaux algorithmes / boites implémentés dans OV : + +#### Scikit-learn + + + +| Nom de la Box | Algorithme | +| :-: | :-: | +| Nearest Centroid | NearestCentroid | +| Nearest Neighbors Classifier | KNeighborsClassifier | +| Gaussian Naive Bayes | GaussianNB | +| Stochastic Gradient Descent | SGDClassifier | +| Logistic Regression | LogisticRegression | +| Decision Tree Classifier | DecisionTreeClassifier | +| Extra Trees | ExtraTreesClassifier | +| Bagging | BaggingClassifier | +| Random Forest | RandomForestClassifier | +| Support Vector Machine | LinearSVC | +| Linear Discriminant Analysis | LinearDiscriminantAnalysis | +| AdaBoost | AdaBoostClassifier | +| Multi Layer Perceptron | MLPClassifier | +| Linear SVC | LinearSVC | + +#### Pyriemann + + + +| String | Algorithme | +| :-: | :-: | +| Riemann Minimum Distance to Mean | MDM | +| Riemann Tangent Space | TangentSpace | + +Vous trouverez facilement des informations sur chacune de ces méthodes dans la doc de leur librairies. + +Pour chacun de ces classifiers, une boite Openvibe utilisant TrainerML avec les paramètres adéquats a été créé. Ainsi, si vous souhaitez réaliser un entrainement avec l'algorithme Random Forest de Scikit-learn par exemple, il vous suffit de chercher la boite associée dans Openvibe et vous pourrez directement l'utiliser, et modifier les paramètres relatifs à l'algorithme. Vous trouverez les informations concernant tous ces paramètres sur les pages respectives des algorithmes, ex : + +> ![random-forest.PNG](Assets/Doc/random-forest.PNG) +> +> Exemple de paramétrisation d'une boite implémentant Random Forest + +### Box ProcessML + +Cette box permet de réaliser des prédictions de classification sur des nouvelles données en utilisant un modèle préalablement entraîné (via TrainerML ou les boites qui en héritent, e.g. SVM, LDA, RandomForest ... ) + +- **Model Filename** : Chemin où le modèle que l'on souhaite utiliser est stocké. +- **Filename to save predictions** : Chemin vers le fichier dans lequel sauvegarder les prédictions. Si aucun fichier n'est indiqué, alors les prédictions ne seront pas sauvegardées. Les prédictions sont enregistrées sous la forme d'une chaîne de caractère où chaque prédiction est séparée des autres par une virgule : `pred1,pred2,pred3 ...` + +Une fois le modèle chargé, les prédictions seront réalisées sur chaque chunk de donnée reçu, elles pourront être utilisées en temps réel, et si un chemin est indiqué, elles pourront être sauvegardées pour un usage ultérieur. + +### Box DataViz + +La Box DataViz permet la visualisation de nos données. Pour ce faire, elle applique une réduction de dimension via une LDA ou une PCA, puis affiche nos données en utilisant la bibliothèque matplotlib. Elle hérite de PolyBox. +Elle nécessite les paramètres suivants : + +- **Path to save the model** : Chemin vers le fichier dans lequel sauvegarder le modèle. Si aucun fichier n'est indiqué, alors le modèle ne sera pas enregistré. +- **Path to load the model** : Chemin vers le fichier dans lequel est sauvegardé le modèle que l'on souhaite charger. Si un fichier est renseigné et qu'il existe, aucun modèle ne sera créé et le modèle contenu dans le fichier sera chargé et utilisé pour la session en cours. +- **Algorithm (PCA or LDA)** : Nom de l'algorithme à utiliser pour réduire les dimensions. Les valeurs acceptées sont `PCA` ou `LDA`. L'algorithme utilisé par défaut est LDA. +- **Dimension reduction** : Nombre de dimension à afficher. Les différentes valeurs possibles sont 2 et 3. Par défaut, si aucun nombre n'est indiqué ou si le champs est mal rempli, le nombre de dimension est 2. +- **labels** : Si le mode de lecture est Poly-Mode, vous devez indiquer la liste de labels sous la forme `mon label1, mon label2, mon label3`, sinon, les labels seront de la forme `1, 2, 3, 4, ...`. Si le mode de lecture est ov-mode, vous pouvez laissez le champs vide, les labels seront extraits des stimulations. + +### Box DatasetCreator + +Pour faciliter l'acquisition de données lors de nos expériences, nous avons créé la box python `DatasetCreator`. Cette dernière prend en entrée un signal et émet en sortie une stimulation de type `OVTK_StimulationId_ExperimentStop` lorsqu'elle a fini de créer le dataset. + +Elle fonctionne de la manière suivante : l'utilisateur choisit au préalable certains labels, puis la box va aléatoirement déterminer un ordre entre ceux-ci. Elle va ensuite monitorer l'utilisateur sur les actions à penser en indiquant oralement l'action courante. De cette manière, nous allons pouvoir créer un jeu de données labelisées qui pourra être utilisé pour de l'apprentissage. + +L'enregistrement d'une action se déroule de la manière suivante : + +1. Avertissement sonore du début de l'action. +2. Attente de 2 secondes. +3. Enregistrement pendant 10 secondes. +4. Avertissement sonore de la fin de l'action. +5. Attente de 3 secondes. + +On peut la configurer en indiquant : + +- Le path jusqu'au répertoire devant contenir les données. +- Le nombre de folds que l'on souhaite obtenir. +- Le nombre d'action que l'on souhaite enregistrer. C'est à dire 30 si vous souhaitez obtenir 30 enregistrement de 10 secondes répartis parmi les différents labels. +- Le nom des labels que vous souhaitez enregistrer. (/!\ Attention, ces noms doivent avoir un fichier mp3 correspondant dans `pybox-manager/Assets/Sounds/`, vous pouvez créer de nouveaux labels avec le manager.) +- Un boolean indiquant si vous souhaitez plusieurs CSV ou un seul CSV. Si vous renseignez "true", alors les données seront réparties en autant de CSV qu'il y a d'action, un CSV par action. Si vous renseignez "false", alors les données seront toutes enregistrées en un seul CSV, dans lequel le début d'un nouvel enregistrement pour un label sera indiqué dans les stimulations. + +## 2. Le Pybox Manager + +Le Pybox Manager permet de simplement créer et incorporer à OpenVibe de nouvelles boites éxécutant un script Python de votre choix, de nouveaux labels/stimulations et de nouveau Custom Settings pour vos box python. + +Pour l'éxécuter : `python pybox_manager.py` + +(Compatible python 2.7 et python 3.X.) + +Une option est disponible pour activer les settings dit "développeurs" c-à-d ceux que vous avez créés. +Pour ceci lancer le manager avec l'option `mode=developer` + +### Box Manager + +Le Box Manager se présente comme ceci : + +> ![box_manager.png](Assets/Doc/box_manager.png) +> +> Visualisation du PyBox Manager. + +- New : Créer une nouvelle boite +- Duplicate : duplique la boite actuellement séléctionnée. +- Reset Box : réinitialise la box séléctionnée, annule toutes les modifications effectuées depuis la dernière compilation. +- Category : catégorie dans laquelle la boîte sera rangée dans OV. +- Author : ajoute le nom des auteurs dans les références de la boite. +- Settings : Permet d'administrer tous les settings nécessaires afin d'utiliser la box. Ceux-ci peuvent être des types issus d'Openvibe (String, Float etc.) ou bien des types créés par vous même grâce au [Custom settings Manager](#custom-settings-manager) +- Inputs : Sert à renseigner les différents inputs que va recevoir votre boite +- Outputs : : Sert à renseigner les différents outputs que va envoyer votre boite. +- Enable settings / inputs / outputs modifications : permet d'empêcher les utilisateurs de votre boite de modifier ultérieurement ces éléments. +- Mode : permet de configurer rapidement les inputs de votre box selon le mode que vous souhaitez utiliser. [Inputs Polybox](#gestion-des-inputs-avec-polybox-deux-modes-possibles) + +Une fois que vos modifications sont terminées vous pouvez appuyer sur Build pour que les modifications soient prises en compte, et que la compilation s'effectue (obligatoire pour avoir vos modifications et nouvelles boites). Le fichier compilation.log contient les informations issus de la dernière compilation. + +Delete Box supprime la boite actuellement séléctionnée (une compilation est nécéssaire pour prendre la suppression en compte) + +### Stimulations / Labels Manager + +Lors de la lecture et du traitement de nos signaux, OpenViBE peut gérer des stimulations. Ces dernières peuvent servir à indiquer le label de nos données lors d'une procédure de classification/entraînement. +L'ensemble de ces stimulations sont indiquées dans le fichier `pybox-manager/share/PolyStimulations.py`. + +La box DatasetCreator que nous avons créée permet de monitorer la création d'un dataset labelisé pour l'utilisateur. Pour ce faire, la box joue un son lors de chaque action, indiquant l'action auquel l'utilisateur doit penser. De base, l'utilisateur aura a disposition une dizaine de labels différents. + +Nous permettons à l'utilisateur d'ajouter des labels (stimulations) via l'interface `Stimulations/Labels Manager` présent dans le manager. +Pour ce faire, ce dernier doit fournir le nom du label, et un fichier `.mp3` correspondant, qui sera joué par le DatasetCreator. + +> ![add_label.jpeg](Assets/Doc/add_label.jpeg) +> +> Add a label/stimulation to OpenViBE. + +### Custom Settings Manager + +Le `Custom Settings Manager` permet de créer ou de supprimer des types de paramètres spéciaux, ainsi que des valeurs possibles pour ces paramètres, selon vos besoins. +C'est notamment utile pour permettre une utilisation facile sur OpenVibe à l'aide d'une liste déroulante. Par exemple, vous voulez pouvoir choisir un algorithme parmis plusieurs, directement dans la configuration de votre boite sur openvibe, il vous suffit de créer ce nouveau type ainsi que les valeurs associées via le manager comme dans l'illustration suivante. + +Pour pouvoir les utiliser avec le manager lors de la définition des paramètres d'une box, il faut lancer le manager avec l'option `mode=developer`. + +> ![manage_custom_settings.png](Assets/Doc/manage_custom_settings.png) +> +> Add/Remove/Manage Custom Settings. + +Résultat dans OpenVibe : + +> ![classifiers.png](Assets/Doc/classifiers.png) +> +> Exemple avec un nouveau type 'classifier'. + +## 3. Fonctionnement interne et détails + +### Notre modèle de boite : PolyBox + +Pour faciliter nos phases de développement, nous avons ajouté dans `pybox-manager/share/PolyBox.py` une classe appelée `PolyBox`. Cette dernière hérite de la classe OVBox. Elle automatise la réception et le stockage d'un signal en entrée et permet le développement de méthodes simples appelées à des moments clés : + +- **on_initialize(self) :** appelée à l'initialisation, cette méthode a pour but de permettre à l'utilisateur de définir un comportement particulier lors de l'initialisation. +- **on_header_received(self, header) :** appelée à chaque réception d'un header, cette méthode a pour but de permettre à l'utilisateur de définir un comportement particulier lors de la réception d'un header. +- **on_chunk_received(self, chunk, label, shape) :** appelée à chaque réception d'un chunk, cette méthode a pour but de permettre à l'utilisateur de définir un comportement particulier lors de la réception d'un chunk. +- **on_end_box(self) :** appelée juste avant que la box finisse son travail, cette méthode a pour but de permettre à l'utilisateur de définir un comportement particulier lors de la fin de la box. + +Nous avons créée cette box afin de pouvoir lui attribuer des comportements adaptés à nos cas d'utilisations, en particulier pour facilement créer des boites proposant des algorithmes de Machine Learning en se basant sur son architecture. + +### Gestion des inputs avec PolyBox, deux modes possibles + +Toute box héritant de la PolyBox possède automatiquement deux modes de lectures possibles pour récupérer des données en entrée. + +Le premier mode (`ov-mode`) correspond au mode de lecture classique de OpenViBE : les différentes classes sont toutes comprises dans un même fichier .csv, et on utilise des stimulations reçues en entré pour séparer nos données en différentes classes. Pour utiliser ce mode, il suffit de n'accorder à la box que deux inputs : 1 StreamedMatrix et 1 Stimulation. + +Exemple : + +> ![ov-mode.jpeg](Assets/Doc/ov-mode.jpeg) +> +> ov-mode + +Le second mode (`poly-mode`) consiste à considérer autant de fichiers qu'il y a de classes, soit un fichier .csv par classe. Pour lire tous ces fichiers, la box a alors besoin d'avoir au moins autant d'input StreamedMatrix qu'il existe de classes différentes. Pour utiliser ce mode, il suffit donc de ne créer que des entrées StreamedMatrix. +(Souvent, ce mode nécessite un paramètre `label` dans lequel renseigner les labels de nos différentes classes sous la forme : `mon label1, mon label2, mon label3`.) + +Exemple : + +> ![poly-mode.jpeg](Assets/Doc/poly-mode.jpeg) +> +> poly-mode + +Ainsi, ces deux modes de lectures sont transparents pour l'utilisateur et lui permettent d'exploiter les box `PolyBox` soit avec un seul fichier contenant l'ensemble des actions, soit avec plusieurs fichiers : un par action. +L'utilisateur n'a donc rien besoin d'indiquer pour que la box choisisse le bon comportement à adopter, celle-ci choisit son comportement en fonction de ses inputs. + +### Duplication de la Python Scripting Box + +L'ensemble des modifications que nous avons apportées au logiciel repose sur la duplication de la box Python Scripting. Cette dernière permettant l'utilisation d'un script python, nous avons décidé de créer un manager permettant d'effectuer automatiquement des modifications dans le code d'OV pour dupliquer les fichiers C++ nécessaires à la duplication de la Python Scripting Box. De cette manière, nous pouvons associer définitivement un script à une box, et laisser l'utilisateur la configurer et l'intégrer à OpenViBE. + +Lors de chaque création de box python, le manager effectue les tâches suivantes : + + 1. On se place à dans le dossier racine des box python : `pybox-manager/src/`. + 2. On duplique `pybox-manager/Assets/BoxManager/NewBoxPattern-skeletton.h` en `box-algorithms/ovpBoxName.h` + 3. On insère dans `src/defines.hpp` la déclaration des CIdentifier. + 4. On ajoute dans `src/main.cpp` les imports des fichiers récemment créés pour la création de la box ainsi que les déclarations. + 5. On remplace dans `src/box-algorithms/ovpBoxName.h` le nom de la boite et celui des includes/déclarations. + 6. On change le nom, la description, les auteurs et la catégorie de la boite dans `src/box-algorithms/ovpBoxName.h`. + 7. On définit le path du script à éxécuter dans `src/box-algorithms/ovpBoxName.h`. + 8. On efface la possibilité de modifier le path. + 9. On ajoute les paramètres de notre boite dans `src/box-algorithms/ovpBoxName.h` + 10. On ajoute dans `src/box-algorithms/ovpBoxName.h` les inputs et outputs de la boite. + +### PolyBox : Stockage automatique des données + +Automatiquement, les box héritant de PolyBox stockent tous les chunk reçus dans `self.data`. Cela peut s'avérer pratique si l'utilisateur souhaite utiliser l'ensemble des données à la fin de la boite (pour entraîner un modèle de machine learning par exemple). +Il est cependant possible d'empêcher ce comportement. Pour ce faire, il suffit de donner comme paramètre lors de la création de la PolyBox `record=False`. Par défaut, record est à True. + +### Gestion des Custom Settings + +On ajoute à `meta/sdk/toolkit/include/toolkit/ovtk_defines.hpp` la déclaration de nos nouveaux Custom Settings et à `meta/sdk/toolkit/src/ovtk_main.cpp` la création du custom setting ainsi que la déclaration de ses différentes valeurs. diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/box-tutorials/pybox/data-viz.xml b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/box-tutorials/pybox/data-viz.xml new file mode 100644 index 0000000..fc2ec7d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/box-tutorials/pybox/data-viz.xml @@ -0,0 +1,263 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00001a44, 0x00001322) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/datas/data-tutorial.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00001ddb, 0x0000547b) + DataViz + (0x057b49ad, 0x040868cf) + + + (0x544a003e, 0x6dcba5f6) + input_StreamMatrix + + + (0x6f752dd0, 0x082a321e) + input_Stimulations + + + + + (0x6f752dd0, 0x082a321e) + stim_out + + + + + (0x007deef9, 0x2f3e95c6) + Clock frequency (Hz) + 64 + 64 + false + + + (0x330306dd, 0x74a95f98) + Path to save the model + + + false + + + (0x330306dd, 0x74a95f98) + Path to load the model + + + false + + + (0x79a9edeb, 0x245d83fc) + Algorithm (PCA or LDA) + PCA + PCA + false + + + (0x007deef9, 0x2f3e95c6) + Dimension reduction + 2 + 2 + false + + + (0x79a9edeb, 0x245d83fc) + Labels + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x434a6f9c, 0xa4ed45b3) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002a38, 0x00000aed) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00006692, 0x000071be) + + (0x00001ddb, 0x0000547b) + 0 + + + (0x00002a38, 0x00000aed) + 0 + + + + (0x00007e63, 0x00007a47) + + (0x00001a44, 0x00001322) + 0 + + + (0x00001ddb, 0x0000547b) + 0 + + + + + + (0x00007426, 0x0000717e) + You must wait the end of reading file to have display + + + (0x473d9a43, 0x97fc0a97) + 720 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + + + (0x000070c2, 0x000055b1) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00005a2c, 0x00002f6b)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000042d2, 0x00004a25)","index":0,"name":"Default tab","parentIdentifier":"(0x00005a2c, 0x00002f6b)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00003ebf, 0x000013aa)","index":0,"name":"Empty","parentIdentifier":"(0x000042d2, 0x00004a25)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/box-tutorials/pybox/datas/data-tutorial.csv b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/box-tutorials/pybox/datas/data-tutorial.csv new file mode 100644 index 0000000..46517fb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/box-tutorials/pybox/datas/data-tutorial.csv @@ -0,0 +1,5121 @@ +Time:128Hz,Epoch,AF3,F7,F3,FC5,T7,P7,O1,O2,P8,T8,FC6,F4,F8,AF4,Event Id,Event Date,Event Duration +0.0,0,-1.2117474109340247,-1.098914512749843,-0.9236899070466116,-0.6962678418921369,-0.4305206916103103,-0.14303830864113198,0.1480222479022163,0.4241964107651613,-0.8262613605991114,-1.0008544139361204,-1.0279113696704016,-0.9058020907966222,-0.6567656758097671,-0.3234275199018161,65539.0,0.0,0.0 +0.0078125,0,0.03786257878765811,0.3658335226453271,0.6038659590384571,0.7088440565400012,0.6579071277599661,0.4520493071993341,0.11600640920135685,-0.3055526319713446,-0.7549367702603829,-1.170370123754584,-1.4955637468482748,-1.6884313102187307,-1.7275914490476003,-1.6156442845255603,,, +0.015625,0,-1.3787120682606375,-1.062315785342864,-0.7242302476486435,-0.4254308256052061,-0.22054220305395,-0.14927709991569704,-0.2301987106999017,-0.4577786704686516,-0.8032090572074773,-1.2188422202924056,-1.6455671620294263,-2.021973804620475,-1.0909272039588418,-1.54262352318618,,, +0.0234375,0,-1.7987640784607986,-1.7834398004717231,-1.4927627538864456,-0.9959308151074628,-0.4162841914805438,0.10245448497172582,0.43550422579085546,0.5111368873050408,0.3302273658611855,-0.03411442409129037,-0.4567278299142708,-0.7948688231789841,-0.927512541609958,-0.7887177799537943,,, +0.03125,0,-0.3859075051249981,0.201946583850768,0.8457398354002947,1.4013833691665265,1.7490546273900875,1.825794496799712,1.642519276866646,1.2807872008204966,0.8702078729682445,0.5526881493322399,0.4433156726513847,0.5986027199368104,1.0007956906829507,1.5625523469608724,,, +0.0390625,0,0.29934892788285794,0.15366122848968222,0.016446166389965874,-0.11032483928637804,-0.22486116585907634,-0.32558411754814875,-0.4111543470620076,-0.4804950882981344,-0.5328107934777205,-0.5676008485021993,-0.5846681264983826,-0.5841222299003974,-0.566377364418591,-0.5321448822391994,,, +0.046875,0,-0.4824206251384278,-0.4184672892461884,-0.34179212036318896,-0.25412033049550464,-0.15736470118948048,-0.05359190601709785,0.05501385799254605,0.1661892930624855,0.27763180463811177,0.3870399895559494,0.4921540993699864,0.5907957702319105,0.6809063235671501,0.7605829668154885,,, +0.0546875,0,0.8281122602781291,0.8820002639853839,0.9209988366345144,0.944127626027254,0.6679934029280548,0.8641098019899762,1.0004907596252777,1.069164888237471,1.0667946093687373,0.9949035996763852,0.8597654867655601,0.6719615687275158,0.4456384106683102,0.1975170994244104,,, +0.0625,0,-0.05427674531943255,-0.29148060673952353,-0.4969719481057872,-0.6559652825070191,-0.7570459519999222,-0.7929685206332869,-0.761164100786609,-0.6639212300456011,-0.5082276809874574,-0.30528423127572724,-0.06972429752583903,0.18140615172706945,0.4298372713027165,0.6573497132188906,,, +0.0703125,0,0.8470458325681215,0.984529078978422,1.058909328896488,1.0635640508103614,0.996602221261426,0.8609986368216662,0.664389250754411,0.4185418001195488,-2.293877990063048,-2.4227238609607413,-2.3915551094545213,-2.207625227422308,-1.9012403677184968,-1.5210151993794752,,, +0.078125,0,-1.126280816484972,-0.7778273239846053,-0.5284230869991446,-0.4145873958086017,-0.4508980520998144,-0.6277205338717808,-0.9127124464741692,-1.2558689254546302,-1.5973231139288693,-1.8766866988999296,-2.042475597994311,-2.060152605154073,-1.9175341999177056,-1.6267192510618176,,, +0.0859375,0,-1.2222390600556892,-0.7557167181769636,-0.2878674269465731,0.12091442552303501,0.4199155344674186,0.5759536118980175,0.5784945563156888,0.4412400853401179,0.1999388120645736,-0.0932380266893844,-0.3778799010526837,-0.5948044956651377,2.8650857800488048,2.8253363219741567,,, +0.09375,0,2.525308442341188,2.055606071997765,1.5506036697727532,1.1515868744443116,0.9680219018398424,1.0475686383947342,1.363055789250772,1.819987441892964,2.2825231578632,2.6108104670351224,2.699437094682166,2.506463183778912,2.0650753433801348,1.4746670297023587,,, +0.1015625,0,0.8737882446764589,0.4023764809799243,0.16361841562692225,0.19589295655402472,0.4624831700654728,0.8618746385901603,1.2558156334228587,1.5074464843798938,1.5190458612293192,1.2590466922928083,0.7709153533587141,0.16145855009990462,-0.4282393553216197,-0.8612852548950279,,, +0.109375,0,0.9506913658802928,0.9402921760703844,0.9128366508677414,0.8685376109763671,0.8079104886392642,0.7317644090440429,0.6411881241348558,0.5375310450736003,0.4223797054187568,0.2975300671010899,0.1649561540707541,0.026775562795916613,-0.1147875465179008,-0.2574413300031362,,, +0.1171875,0,-0.398866330745522,-0.5367560383363819,-0.6688572271933771,-0.7930093673523392,-0.9071824176705674,-1.0095123397021402,-1.0983337104143431,-1.172208862709335,-1.2299530435103718,-1.2706551489007956,-1.293693673246086,-1.298747593029307,-1.2858019948195132,-1.2551483488196182,,, +0.125,0,-1.2073794231924593,-1.1433789282003977,-1.0643060714709782,-0.9715752948041032,0.1385386313447632,-0.15827129915387278,-0.4534781772966308,-0.7288907647068473,-0.9678003038993772,-1.1561407695712873,-1.2834645690408646,-1.34366566482045,-1.3353997059622578,-1.2621718839249298,,, +0.1328125,0,-1.1320863998715969,-0.957275027727375,-0.7530446354720807,-0.5368031255210578,-0.3268387069972834,-0.14103764070300784,0.004370111567488566,0.09594984729053048,0.1240062532444266,0.08326685140766976,-0.026742915032078263,-0.201659128548878,-0.43257622208830415,-0.706660500509952,,, +0.140625,0,-1.0080375931229877,-1.3188919696815278,-1.6207018642963174,-1.895523509206272,-2.1272351416910373,-2.302654052382528,-2.412448796254398,-2.45178297127745,-0.6953344902232309,-0.6489384128595126,-0.4480451689666369,-0.1092820630406629,0.3290568075389378,0.8129177653932566,,, +0.1484375,0,1.280850578226663,1.6735249899384974,1.9429187795003475,2.0597465217623894,2.017972234088424,1.8357032813557057,1.5523265371796031,1.2223330736854536,0.9067934162417656,0.6638113203931977,0.5394431117731273,0.5604970980272921,0.7303347120291643,1.0283274909104647,,, +0.15625,0,1.4130545598784223,1.8287426661395905,2.2139457433038205,2.5111121470402,2.6755494222096936,2.682390278242809,2.5304747508525502,2.242543827559597,1.8617143029083416,1.4447838271765048,1.0534088068059089,0.7445291102982259,-0.6117828212297958,-0.15637479928428533,,, +0.1640625,0,0.28180629899123744,0.568581725751961,0.6134184566711893,0.3942940714648549,-0.03623712778476579,-0.5654395088903816,-1.0513076673543051,-1.3615220119639897,-1.409771408446071,-1.1794873202698808,-0.7284838207247557,-0.1732307897907634,0.3429306367975997,0.6889205200895572,,, +0.171875,0,0.7816769419384283,0.6087389702589113,0.23146822070162665,-0.2319720407582313,-0.6392133670782028,-0.8629184132745602,-0.8259014467334524,-0.5225054722809658,-0.02037499324922576,0.5578635982429854,1.0679952686634098,1.3835332194656638,1.4301858318257403,1.2060292578693868,,, +0.1796875,0,-0.8668315473037904,-0.7519215277729792,-0.628861399885152,-0.4998015454040318,-0.3669889725839268,-0.2327280379373625,-0.09934016908635862,0.03087670609777582,0.15568831372247693,0.272963068423285,0.3807093047971299,0.4771100538575035,0.5605547556384306,0.6296673527257479,,, +0.1875,0,0.6833302728659167,0.7207038807879455,0.7412410587104548,0.7446966603049114,0.731131672654555,0.7009120134135041,0.6547019843106959,0.5934524957127989,0.5183842685213624,0.4309663076282137,0.3328900239504916,0.22603945826204824,0.1124581282974293,-0.005686920266402079,,, +0.1953125,0,-0.1261432293840738,-0.2466125432659321,-0.3647912282967552,-0.4784107903909029,-2.4206456880857194,-2.323845701707457,-2.170669629970585,-1.9742281071021088,-1.7505354818836714,-1.5173872500486474,-1.293113514745819,-1.0952954133271795,-0.9395340306361962,-0.8383576583398844,,, +0.203125,0,-0.8003436119261681,-0.8295158545628153,-0.9250604434630504,-1.0813786509439631,-1.2884740645276411,-1.5326466802876682,-1.7974455952839468,-2.0648138712291604,-2.3163457400439893,-2.534568487208768,-2.7041596271569786,-2.8130144964355064,-2.8530898203807267,-2.8209644303139108,,, +0.2109375,0,-2.718078031421777,-2.5506313712062925,-2.329154769170178,-2.0677750938008668,-1.7832323003171322,-1.4937141057480885,-1.2175900589636357,-0.9721332779830428,0.5615308290077363,0.5275233687906249,0.6417778136582725,0.8798811021446243,1.197581785082222,1.5377281367513125,,, +0.21875,0,1.8392177287665168,2.0465642691434693,2.1185913570067556,2.0348987825888822,1.7990939330917486,1.4382847113597452,0.9989126594401352,0.5395750090300604,0.12195337037490404,-0.19873832719786166,-0.3822991487413456,-0.4097490291772431,-0.2862325820382514,-0.04016683196013676,,, +0.2265625,0,0.2812341178755136,0.6193601700199949,0.9133790648611446,1.109753853797381,1.1706213959944245,1.0797266771342056,0.8449884575647731,0.49729646184092796,0.08572729622449009,-0.33007589918706204,-0.6891732749247111,-0.9388038503001834,-0.15168576849913407,-0.3953626983409645,,, +0.234375,0,-0.3807168144497145,-0.11199381306329126,0.33471966676311304,0.8323011664884166,1.2374068208039777,1.429753800092839,1.3451047635663147,0.9929141860659354,0.4537999345049028,-0.14246744099445174,-0.6524259264966917,-0.9581158117626174,-0.9992652494577028,-0.7896477647415217,,, +0.2421875,0,-0.4131300313032119,-0.0004946693389771828,0.30660805292669624,0.3946980303635799,0.2097916209904616,-0.2275711814949793,-0.8277192854504378,-1.4561869510831336,-1.9703264255129949,-2.2581645116056297,-2.2688558133912773,-2.0263884689189124,-1.622788121607727,-1.1926847291598697,,, +0.25,0,-0.5852777802172789,-0.6833123874448157,-0.7705850481117642,-0.8453504240109236,-0.90607815899706,-0.9514798735568568,-0.9805319248485088,-0.9924935335625302,-0.9869199600809592,-0.9636704990972116,-0.9229111525861872,-0.8651119341947191,-0.7910388521250162,-0.7017407107619862,,, +0.2578125,0,-0.5985309620177299,-0.4829649240453053,-0.3568127660894005,-0.22202873237630408,-0.08071714379871034,0.06490422742910723,0.2125427689708866,0.3598709494771987,0.5045668507207193,0.6443546011770378,0.7770440031959372,0.9005686600277041,1.0130219352376155,1.1126901149953166,,, +0.265625,0,1.19808219270383,1.2679557545752744,1.3213385130318596,1.357545111017414,-0.7723189860990024,-0.6297836221501489,-0.552017102169661,-0.5418445505051853,-0.597233632153471,-0.7114409121396486,-0.8734870256537962,-1.06892751297764,-1.2808655549526742,-1.4911359756380234,,, +0.2734375,0,-1.6815779352176763,-1.8353075510120083,-1.9379016889370448,-1.97841036163086,-1.950127120808412,-1.8510637068116127,-1.6840958410159428,-1.4567699786523658,-1.1807844815918636,-0.8711813740878018,-0.5453050261984159,-0.2216003622774888,0.08166561781648474,0.34766986962286023,,, +0.28125,0,0.5621986200415876,0.7146307245238299,0.7986705102308609,0.8127790190066494,0.7602735954776674,0.6490888928289285,0.4912159790754601,0.301858673532735,-1.0425910551410196,-0.9862002394696904,-0.7795670041966264,-0.4553492976775102,-0.06384437033804156,0.33483772444682003,,, +0.2890625,0,0.6801251085332245,0.9204031365637702,1.0210345498032245,0.9697316496517238,0.7784438704433242,0.4814668947333434,0.1300679868752121,-0.2155351448639612,-0.4955924293586698,-0.6601693321502089,-0.6769683658206387,-0.5364057338492817,-0.2531521463414689,0.13610244049591202,,, +0.296875,0,0.5783122745145783,1.0122856098435082,1.3781624220457784,1.6266841177171134,1.7268117212455394,1.670506256587351,1.473927045227981,1.1748615686446304,0.8267874944803688,0.4904920196012004,0.2245541382105426,0.0761725414037071,-0.9497739372253164,-1.3537734520335132,,, +0.3046875,0,-1.8952276160655983,-2.436745396014249,-2.8383016215003503,-2.995539378112533,-2.8683189380142657,-2.4916893039806247,-1.9662756714479848,-1.4307173842986982,-1.023710172486237,-0.8460554066800825,-0.933116977914396,-1.2452337936255735,-1.6787145938907837,-2.094400612104925,,, +0.3125,0,-2.35596661245318,-2.36746167868597,-2.0997993424249777,-1.5989351607438251,-0.973488656455744,-0.36520011801997343,0.08968287596656244,0.2975085154334133,0.2326467119352741,-0.05572837451039631,-0.4573559480596126,-0.8313445855081124,-1.0450174409422854,-1.0104982754504,,, +0.3203125,0,1.3761889031095784,1.3771885072786896,1.3607690127042786,1.3274578226315472,1.278075205189626,1.2137197177557963,1.1357487602129384,1.0457545977391651,0.9455362730960784,0.8370679003550733,0.7224638953612375,0.6039417518703929,0.4837830152685395,0.3642931373422229,,, +0.328125,0,0.2477609151587921,0.13641822439695714,0.03240075231018058,-0.06228958199976009,-0.14581986186778595,-0.21655844484892628,-0.2731037068143649,-0.3143087549463353,-0.339301676804345,-0.3475009708003303,-0.3386258877959559,-0.31270150264319685,-0.27005842677013797,-0.21132716675109675,,, +0.3359375,0,-0.13742722755130665,-0.04955115115887165,0.05085622999937334,0.1621229616702733,0.09836596139786227,-0.1009850511287954,-0.2782707567731981,-0.41717785507617466,-0.504147691749066,-0.5293283162023124,-0.4872678528216565,-0.37730082105858975,-0.20360045156663964,0.025106662687523932,,, +0.34375,0,0.2961436943837416,0.5937624425816002,0.9002366515826931,1.1970935577783677,1.4663977945899158,1.6919981338124008,1.8606501324917508,1.962936407228293,1.9939203691266385,1.9534878384779448,1.8463527226124719,1.6817263655065855,1.4726736301578056,1.2352006190462832,,, +0.3515625,0,0.9871376509067806,0.7468953886382559,0.5321808579228963,0.35876289224529123,0.23937309251553066,0.18281893880970826,0.19337089688230125,0.2704662547652684,0.07376801201294891,0.22251278162456328,0.5034834155819636,0.8765693956703933,1.2866845867493537,1.6723143171771584,,, +0.359375,0,1.9750670028371644,2.148742764777618,2.166506703563244,2.025049684657887,1.7450886810256967,1.3681288326441423,0.949991619687944,0.5521172203793829,0.23199578610056104,0.03421802106296579,-0.016461027196683187,0.0810353505627186,0.30395483448524185,0.6092807709740389,,, +0.3671875,0,0.9404569383795574,1.2362248498872366,1.4401970025576003,1.5096748355606875,1.4223377835325632,1.1797613823762043,0.8072162608255379,0.34977910798289563,-0.13463887740915073,-0.5842604441702853,-0.9430110230362118,-1.1691976223707303,0.4128262271212696,0.9750594652255756,,, +0.375,0,1.3584478566615628,1.4780398641420087,1.3191288553067588,0.9411847817694264,0.4614773629850442,0.022879802100583047,-0.2453224994337331,-0.2628768474569535,-0.02054737770856685,0.41738660347636575,0.9308023855662888,1.3767318295109492,1.6286410045176805,1.6112251339944692,,, +0.3828125,0,1.3211814380730638,0.8282653288313169,0.2563389989979549,-0.25039521338448045,-0.5667240211903751,-0.6205378624289266,-0.412383207367132,-0.015095836830347237,0.4463823054212647,0.8294689585430176,1.0132418846448374,0.9318005117337964,0.5925433293289559,0.07434966810864588,,, +0.390625,0,0.28237911779531194,0.4095894216029731,0.5415887666553689,0.6761200159503473,0.8108734172894373,0.9435269448185232,1.0717868604274423,1.1934277848432149,1.3063315768328452,1.4085243397993052,1.4982109078404773,1.5738062074718708,1.6339629459186602,1.677595141200259,,, +0.3984375,0,1.7038970820380608,1.7123573856372656,1.7027679072264186,1.6752273453808235,1.6301394800290745,1.5682060740203758,1.4904145625677143,1.3980207461429957,1.292526789885904,1.175654914768081,1.0493172411878928,0.9155823130384396,0.7766388884134435,0.6347576309725445,,, +0.40625,0,0.4922513727444878,0.3514346441569888,0.21458317990960352,0.08389410972625533,0.4087503373702103,0.5984522197764182,0.8260687334513654,1.0753090606376468,1.3282340397492114,1.5665107260697884,1.7726947142133191,1.9314507921993609,2.0306267966568465,2.0621057747761693,,, +0.4140625,0,2.022377017383364,1.9127861309264689,1.7394466972354912,1.5128196679415409,1.2469898098545171,0.9586896427252508,0.6661389185390278,0.3877805539560791,0.14100114779897588,-0.059074709913309875,-0.2006322768993387,-0.2759835928124794,-0.2820965579389708,-0.2207992788919257,,, +0.421875,0,-0.09864544860335267,0.07354983482657973,0.281471424454967,0.5083095470368404,0.7359391633248978,0.9461910084961292,1.122125662022497,1.2492217851842091,-1.2419463749910065,-1.1643963348425568,-0.9631523590706343,-0.6840825823522577,-0.3851153420246646,-0.12715776503969325,,, +0.4296875,0,0.035449211537362024,0.06345241374178677,-0.061142970780862727,-0.33221515579402816,-0.7204253437228456,-1.177735291126929,-1.6448394780258138,-2.0603545312744083,-2.370334838793132,-2.5366324724677356,-2.5427995283458062,-2.396613758920965,-2.1288342960483257,-1.7883814290609947,,, +0.4375,0,-1.4346913568477533,-1.1284368265451885,-0.9220590738276536,-0.8515858505649468,-0.9310099903091388,-1.150104124056891,-1.4760119392378157,-1.8583681372731569,-2.2371496105449102,-2.5520349367968618,-2.751814339805261,-2.802384384296554,-1.2291006397678164,-1.2140586996174674,,, +0.4453125,0,-0.9343767041218968,-0.4720907789566297,0.042663617183217206,0.4674111589509081,0.6864576391354178,0.6426498386647692,0.3530693071004358,-0.09564148518469913,-0.5710398000966727,-0.9312179390651468,-1.0637545109849524,-0.9166058064844635,-0.5124701988533067,0.0573121547280976,,, +0.453125,0,0.6576534640900369,1.1465848070591496,1.4139923816010986,1.4116086195695694,1.1660401902143782,0.7712641231616173,0.3626505582614149,0.07963371461817093,0.027263922852535986,0.24718028183383545,0.7059616213237587,1.3040505906574278,1.902807207983146,2.362279434431236,,, +0.4609375,0,-0.03855246897236432,-0.15082986363586648,-0.2511984675325899,-0.3381361593544832,-0.4103648892124958,-0.4668729855364711,-0.5069327923226927,-0.5301133279411576,-0.5362877438898199,-0.5256354529387367,-0.4986388894488892,-0.4560749586436749,-0.39900132461030624,-0.3287377771847376,,, +0.46875,0,-0.2468430040454493,-0.15508717479835987,-0.055420817170280745,0.05005946964412666,0.15914786405295325,0.269568088255249,0.37901341267638944,0.4851871980950279,0.5858432654889612,0.6788253866412898,0.7621052039407329,0.8338179153130028,0.8922950993493515,0.9360941057715008,,, +0.4765625,0,0.9640234965105048,0.9751640918282108,0.9688852528635856,0.9448561153936046,1.3163956499623792,1.3167808478469043,1.2482137907631667,1.1133911326589012,0.91968811863262,0.678650513445074,0.4051955239988672,0.11657742357708133,-0.16881000581029926,-0.4327107169333306,,, +0.484375,0,-0.6582742733898668,-0.8312259575436224,-0.9408575267970088,-0.9807695407895888,-0.9493135052204024,-0.8497030100684847,-0.689786121368937,-0.4814949068587866,-0.2400104895581372,0.017298140253174124,0.27208754842210625,0.5063208943513887,0.7035272469991455,0.8499513594824356,,, +0.4921875,0,0.9355137217964248,0.9545139418886732,0.9060284046775692,0.7939744784001067,0.6268367912141876,0.4170746667218983,0.18025204170426248,-0.06604945762482288,-2.6920820881371377,-2.43352751507906,-2.061687715005781,-1.6284634054966882,-1.194641372549523,-0.8204658549909803,,, +0.5,1,-0.5562972622387896,-0.4348129580892879,-0.4659646450877979,-0.6354775169815561,-0.9071246870048696,-1.2284223712684366,-1.5388584979055848,-1.7793728116533414,-1.9016116114386088,-1.8755153570209544,-1.694057043063578,-1.3743930213974362,-0.9552467332657341,-0.4909325598957376,,, +0.5078125,1,-0.04295032295767043,0.3295406440300427,0.578884412692979,0.6763014572189957,0.6163236039825862,0.41760041060301,0.11995160840919915,-0.2218750757534746,-0.5467682624828171,-0.7968052978851835,-0.9263046620132844,-0.9089682933370792,2.208415570350787,1.7591306200940169,,, +0.515625,1,1.3064728615415755,0.9876892639429228,0.9009436147836652,1.0782984701904923,1.4768339620222095,1.990338417038476,2.478367433270725,2.8047076854468442,2.8747039723295624,2.661219362360048,2.2121134120625765,1.6371885658128271,1.0781817964791454,0.6700251376356642,,, +0.5234375,1,0.5039915001890245,0.6028252823162018,0.914672435656798,1.3274721220164498,1.699864038372913,1.9001389050484776,1.8425551042720587,1.5110662144617382,0.9639543981104872,0.31809766921430765,-0.2828192365476624,-0.7074401144613827,-0.8724950454578733,-0.765382688245521,,, +0.53125,1,0.9030515780004896,0.8437529396849698,0.7675431756513837,0.675296933873564,0.568165427487717,0.4475564874303839,0.3151101244815808,0.17267002850216712,0.02225150379156482,-0.13399359810535896,-0.2938143342408481,-0.4548998590311621,-0.6149196598799228,-0.7715641352619799,,, +0.5390625,1,-0.9225848048753804,-1.0658334479132368,-1.1992994842768137,-1.3211449443174708,-1.4297364149216971,-1.5236734026972618,-1.6018126177561631,-1.6632877530206969,-1.7075244128523304,-1.7342499297391385,-1.7434978972872086,-1.7356073402792795,-1.7112165364686232,-1.6712515984241971,,, +0.546875,1,-1.6169100154942917,-1.5496394442039736,-1.4711121186012273,-1.383195328760817,-0.3034584826795553,-0.5140973385086463,-0.6818312697393809,-0.7933965338777347,-0.8393285911534419,-0.81462567785311,-0.7191014818958328,-0.5574023185748586,-0.3386875991588846,-0.07599586402835506,,, +0.5546875,1,0.2146594220471476,0.5154012709683291,0.8077302793213783,1.0738089096650336,1.297699401337585,1.466469001106821,1.5710854566754269,1.6070403421388468,1.5746567640502058,1.479060006267248,1.3298131764496062,1.1402432778796656,0.92650471817575,0.706445576056111,,, +0.5625,1,0.4983557018138549,0.3196839674272373,0.18581413363861327,0.1089847138641542,0.09742817347471766,0.15478950803365665,0.27986476205094235,0.4666777392618671,-0.7420012388380448,-0.4465668557655582,-0.06450656782321043,0.3481649860265797,0.7299763018733703,1.023569278604593,,, +0.5703125,1,1.184632798308629,1.1888081609404528,1.035490788250107,0.7479360135490238,0.36965241140666977,-0.042355663637186035,-0.42644392772047457,-0.7259031900323458,-0.8977623330119602,-0.9194483038647204,-0.792265969563703,-0.5411560264759039,-0.21076888327892607,0.14153374377748218,,, +0.578125,1,0.4546592465839944,0.6733475551298373,0.7568277673512909,0.6852193946779523,0.4626809197446652,0.11681498011748155,-0.3055774623135178,-0.7457329448257266,-1.1420245930610042,-1.4395075351979671,-1.5984241812888702,-1.6003449113090318,0.3243588721954497,0.5082468603193044,,, +0.5859375,1,0.437636946946394,0.10664092742499044,-0.4173871714734659,-1.0121694579047125,-1.533894786510661,-1.8565312847921325,-1.9062872568667093,-1.6817764156898791,-1.2543612077906532,-0.7485803789186658,-0.3080250331277209,-0.056015361121733435,-0.06185498801479794,-0.3219110300200213,,, +0.59375,1,-0.7607044706706411,-1.251711049408558,-1.652170614800709,-1.8423634249162693,-1.7585874635014065,-1.4107970590723564,-0.8800668415686412,-0.2965742279321354,0.1958671809531921,0.4790049952511499,0.4923354866600258,0.2494616122931679,-0.1658594802645377,-0.6228940561353324,,, +0.6015625,1,-1.2879184845013818,-1.1874373411630426,-1.083996013985158,-0.9798874463445756,-0.8774130241869141,-0.7788420439333632,-0.6863717437096051,-0.6020885978797379,-0.5279315527463743,-0.4656578472874852,-0.41681201753601294,-0.3826986274612043,-0.3643592039592141,-0.3625537799452392,,, +0.609375,1,-0.3777473688506571,-0.4101016074786277,-0.459471713672486,-0.5254088121877022,-0.6071675881596278,-0.7037191342718259,-0.8137687667862878,-0.9357784985911586,-1.0679937758750482,-1.2084740103795544,-1.355126372719388,-1.5057422551557136,-1.6580357654652966,-1.8096835779804763,,, +0.6171875,1,-1.958365444109385,-2.1018046530960985,-2.237807734648757,-2.3643027083372323,0.7048895721459628,0.9805126069087986,1.2768788390636936,1.5757953838897203,1.858806423229439,2.108473644840493,2.3095859006218697,2.4502137454390307,2.522535334820292,2.5233761032127777,,, +0.625,1,2.4544246029881656,2.3221094662082096,2.137146081594941,1.9137846103788327,1.6688117906785855,1.4203761485407005,1.1867185475208155,0.9848966090519596,0.8295919625491593,0.7320835074948037,0.6994582924639132,0.7341150455035765,0.8335949819984398,0.9907516932664604,,, +0.6328125,1,1.194248273153426,1.4293470197392415,1.6789366462609436,1.9247253722605768,2.148516697784116,2.333478896876024,2.4653197037562853,2.5332842754551588,-1.4509880084084592,-1.1792798928327637,-0.8328022974475869,-0.4703357697706318,-0.1526611376006568,0.06694810488146685,,, +0.640625,1,0.1510614056979004,0.08395623347822978,-0.12590108601952288,-0.4471453573775721,-0.8303725663479977,-1.215813159358419,-1.54262352318618,-1.7583485738010425,-1.827081692371204,-1.7350511211686568,-1.4927627538864456,-1.13336559370024,-0.7074944707777672,-0.27539327528786706,,, +0.6484375,1,0.10245448497172582,0.37472852193209183,0.5072435382349656,0.4882483866790645,0.3302273658611855,0.0679232294105721,-0.2471100075321893,-0.5545758611450571,-0.7948688231789841,-0.9184029415512104,-0.8933823407770214,-0.7108031484733428,-0.9995277473727446,-0.6282105035100499,,, +0.65625,1,-0.09901922975321947,0.4539096736139477,0.8883208287750719,1.0926928355263072,1.0166861892845542,0.6848424371066464,0.1897809985306499,-0.3332410374175059,-0.7434331761404945,-0.9330703129672862,-0.8570071306257651,-0.5450191374180196,-0.09358829424777884,0.3606149953436994,,, +0.6640625,1,0.6782850798940055,0.7557763798218358,0.5536441917962168,0.10760757999747196,-0.4810716308494432,-1.073158470177756,-1.5294087177599365,-1.7485241179645827,-1.6946984349578709,-1.4072067990029389,-0.9894122597465341,-0.5802046398668477,-0.3157015937866517,-0.2917106257572669,,, +0.671875,1,-2.4793752101043904,-2.58130186340476,-2.6685803107282395,-2.739955379739926,-2.794440925947929,-2.8313369695113444,-2.850241826197633,-2.8510590201479347,-2.8339988574762023,-2.7995746332138736,-2.7485935380785227,-2.682142424347982,-2.601568680135048,-2.5084565470068765,,, +0.6796875,1,-2.4045992956764213,-2.291967747015612,-2.1726756896299046,-2.0489427995716385,-1.9230557115044613,-1.7973279229950436,-1.6740592340378813,-1.5554954320533818,-1.4437889282979652,-1.3409610349630583,-1.2488665435073787,-1.1691612244700809,-1.1032728178536215,-1.0523760220423481,,, +0.6875,1,-1.0173719192056838,-0.9988721974484428,-0.9971884459772704,-1.012326710720418,2.530906837347917,2.4564635936868533,2.3130953161554935,2.1085910570677937,1.854848063897284,1.567045550552019,1.2625899337245838,0.9599050783642048,0.6771519035959294,0.4309666256203323,,, +0.6953125,1,0.2353056138254721,0.10047740119872306,0.032429338622456894,0.03233862489718286,0.0965362186622578,0.21676892491570326,0.3807813663177839,0.5731772423855486,0.7764998035895119,0.9724561803836604,1.143200175341827,1.2725840493960596,1.3472919949885145,1.357776239008368,,, +0.703125,1,1.2989304813891116,1.170453691448248,0.9768788762180752,0.7272647974498548,0.4345721175406265,0.11476746035030914,-0.2142821537769683,-0.5340474215755042,-0.3859075051249981,0.04413706983276639,0.5259717714538761,0.9983012219322208,1.4013833691665265,1.6862767565100023,,, +0.7109375,1,1.822405143492685,1.802261541053491,1.642519276866646,1.3813773296057394,1.0725537011936896,0.7768626780760375,0.5526881493322399,0.4468370877029815,0.4871980791127472,0.6783486309477137,1.0007956906829507,1.4139679026840966,1.8624937646921649,2.2847880348402922,,, +0.71875,1,2.6226092023283174,2.8300995700729525,2.8809000661304704,2.772231753586293,2.525308442341188,2.182016236855804,1.798377278209917,1.435815797000367,1.1515868744443116,0.989858700640111,0.974837312195996,1.1070046434135907,-1.5904395906979143,-2.147956201226485,,, +0.7265625,1,-2.5428545639009257,-2.6817709421014726,-2.5394306555106545,-2.165425324892171,-1.6704895402516065,-1.1960393636205198,-0.8753223314326115,-0.7968274725828085,-0.9799842624014568,-1.3698112043323931,-1.851981002244752,-2.2841735041022107,-2.5351234000248173,-2.5206605491094485,,, +0.734375,1,-2.2268648350281994,-1.7139887715779918,-1.1000718687197129,-0.5287364638324558,-0.12998993390525893,0.015225217415634653,-0.10298076633571196,-0.4209435480714167,-0.8191135750895709,-1.1550507228347977,-1.3026998291919758,-1.1871807747247671,-0.8055560461318536,-0.2278818443858837,,, +0.7421875,1,-1.04398740572468,-1.0915705818706265,-1.1541864606377863,-1.2306710484573742,-1.3196065582261465,-1.4193462803787549,-1.528043468000839,-1.6436837301769531,-1.7641203663345897,-1.8871120228460985,-2.0103620124846127,-2.1315586082099642,-2.2484156056979434,-2.3587124443166205,,, +0.75,1,-2.460333183982442,-2.551303655359328,-2.629826132845211,-2.6943109231641555,-2.74340431638608,-2.776012409887384,-2.791320388027394,-2.788806919882838,-2.7682534228625064,-2.7297480299195267,-2.673684190815824,-2.600753931848041,-2.511935891971955,-2.4084783447244007,,, +0.7578125,1,-2.2918775031381187,-2.163851487436772,-2.026310411239409,-1.88132310996658,-0.8266210986933709,-1.0759590257379434,-1.2689913148738234,-1.3965262272458576,-1.4538837276055652,-1.4412145527248366,-1.363482560004381,-1.2301116028905494,-1.054321572953271,-0.8521999234672765,,, +0.765625,1,-0.641573434612168,-0.4407589097199801,-0.26727993401347794,-0.1366391933131048,-0.061231975249555926,-0.04947662981935541,-0.1052226362347457,-0.2274775640020895,-0.41047197798435375,-0.6440577706008679,-0.9144121526692728,-1.2049982191107351,-1.4977151132084852,-1.7741575910303156,,, +0.7734375,1,-2.016897158022987,-2.210695444695282,-2.343565212683429,-2.4076050068972465,-2.3995492530001563,-2.320995441551821,-2.1782925570851184,-1.9820985320261808,1.363055789250772,1.6995451858242516,2.0596737103694096,2.38215946787425,2.6108104670351224,2.703308046480988,,, +0.78125,1,2.6378328240315647,2.4165009630145144,2.0650753433801348,1.6289964133611723,1.1663507124709571,0.7388720175224054,0.4023764809799243,0.1981212792252064,0.14643243772239833,0.2435940561449115,0.4624831700654728,0.7568510784164348,1.0685840063965002,1.3368119245430825,,, +0.7890625,1,1.5074464843798938,1.5416621951566836,1.4219995647496864,1.1551393236863194,0.7709153533587141,0.31771978833344394,-0.1449842908321317,-0.5558766398682241,-0.8612852548950279,-1.0235031109148074,-1.0266210744762156,-0.8789686844276114,1.3784805496635275,1.4881552931615725,,, +0.796875,1,1.3285906621221957,0.9727384008939028,0.5457175483934349,0.1903451195819528,0.02783298269282497,0.1244241317476008,0.4731135772758469,0.9954646592206594,1.5630238465494086,2.032465535891236,2.2848351796295487,2.258135639337105,1.9643258748483632,1.4860729821102805,,, +0.8046875,1,0.9541473858153038,0.5116559200200453,0.27491467205388986,0.3016842144571993,0.5754718584370799,1.0102019028938325,1.4739724379057453,1.825386064567979,1.9524956296813785,1.8036892625383047,1.402048099453418,0.8392396430653856,0.2506183116950397,-0.22164476144064085,,, +0.8125,1,-1.73108109393195,-1.5778603571976426,-1.4239817108142614,-1.2717703349024212,-1.1235152577092655,-0.981429471049032,-0.8476113803929375,-0.7240082645014618,-0.6123823843035555,-0.5142803343377771,-0.4310061732908913,-0.3635988039969953,-0.3128139988502938,-0.2791113852426017,,, +0.8203125,1,-0.2626466187855109,-0.26326888123787584,-0.28052374682309944,-0.3136613666190292,-0.3616498275833999,-0.4231934521687809,-0.4967557179710973,-0.5805863959580999,-0.6727524319563549,-0.7711720305306773,-0.873651344314962,-0.9779231262324336,-1.081686667672024,-1.1826483231705125,,, +0.828125,1,-1.2785619118802791,-1.367268288259116,-1.4467333889662384,-1.515084089629259,-1.7466375844851048,-1.4887092261700277,-1.226518042686249,-0.978405845777492,-0.7615746041756469,-0.590889201964035,-0.4778435059513732,-0.4297618347264204,-0.4492915060029069,-0.5342218403141086,,, +0.8359375,1,-0.6776422335607221,-0.8684282658716531,-1.0920219385487733,-1.3314516197318655,-1.5685205631436399,-1.7850811085424592,-1.9643056970816328,-2.0918660563415217,-2.156938312912005,-2.1529639285495388,-2.078113382687638,-1.9354202521093733,-1.732576322468637,-1.4814020033334034,,, +0.84375,1,-1.1970289602391608,-0.8968519449964354,-0.5993228998097739,-0.3226714093244655,-0.08364071056135414,0.10367261430975427,0.22879436761300964,0.2855958646899862,-0.6117828212297958,-0.2743117947133308,0.0738824351618948,0.3722248028984087,0.568581725751961,0.6273970406717485,,, +0.8515625,1,0.5352420019358942,0.3029148457723698,-0.03623712778476579,-0.43151162171460217,-0.8227525436905341,-1.1497276573109494,-1.3615220119639897,-1.4244840022745866,-1.327486323513877,-1.0836822887990138,-0.7284838207247557,-0.3140759058164808,0.0986782532159865,0.4496807565816583,,, +0.859375,1,0.6889205200895572,0.7842211214611702,0.7262084407253122,0.5297245992379812,0.23146822070162665,-0.11577118241137906,-0.4513864022765789,-0.7164444384324434,-0.8629184132745602,-0.86122129410046,-0.7048677154517115,-0.4115375079272655,-0.16037635214752344,0.2715645758116729,,, +0.8671875,1,0.722323486457892,1.0522872035121291,1.1561678807214275,0.9920306864259866,0.592943069968803,0.05805141505975395,-0.474470621548394,-0.8651891910264243,-1.0115429026994929,-0.8758908121467556,-0.4957892222611578,0.026318880834150616,0.5511757619914976,0.9408485953100836,,, +0.875,1,1.0964841465885211,0.9853314953883012,0.6496273212976582,0.19490940076585486,-0.23903774179983586,-0.5166409019084306,-0.5438584111903592,-0.2941326281640646,0.18413975792048554,0.780668783647153,1.3532858804335497,1.7666880223457633,1.9292948032811053,1.8181191367610825,,, +0.8828125,1,-1.5706412434963304,-1.611949323332888,-1.6378021473991395,-1.6472642389128354,-1.639687444859103,-1.6147225230182862,-1.5723254941894904,-1.5127586482491202,-1.4365861862953926,-1.3446645750524366,-1.2381277822962842,-1.118367651698969,-0.9870097605966792,-0.8458851832820429,,, +0.890625,1,-0.6969986541164763,-0.5424936877981219,-0.38461526740228014,-0.2256707534011487,-0.06798969802066279,0.08611673153777832,0.234396010633356,0.3746934906904542,0.5049899218113324,0.6234366075931375,0.7283875767027137,0.8184282079978763,0.8923998080799022,0.949419711032592,,, +0.8984375,1,0.9888965485077704,1.0105404228816464,1.0143678054514345,1.000701074003541,0.27271405243809543,0.19363933879661832,0.056465025595441976,-0.1266841654751974,-0.3405046063274295,-0.567587850358416,-0.7896413788978816,-0.9887708636788721,-1.1487345134037752,-1.2560820194962028,,, +0.90625,1,-1.301098663786475,-1.2784887379812178,-1.1877506038434806,-1.0332172263745565,-0.8237593404412814,-0.5721719374872721,-0.2942868426447478,-0.00787325376046863,0.2685970994273026,0.5172340765946403,0.7219729920871444,0.8696914940675182,0.951121581917056,0.9614931711702878,,, +0.9140625,1,0.9008643345432394,0.7741151959126774,0.5906059078628291,0.3635225671371823,0.10895668260415232,-0.15521761024016156,-0.4105902912547068,-0.6394992140901876,-0.02037499324922576,0.4140555934510614,0.8302173639056789,1.1691352939150694,1.3835332194656638,1.4451504419249623,,, +0.921875,1,1.3490985987434956,1.1145804397914174,0.7818587899895701,0.4059480190860738,0.04801081199682655,-0.2341995706303037,-0.3953626983409645,-0.4096744424709355,-0.2748870856317154,-0.01267667976390574,0.33471966676311304,0.7110728943731202,1.0549143783155401,1.3091084057997144,,, +0.9296875,1,1.429753800092839,1.3930282153009768,1.1989090444071582,0.871191346156763,0.4537999345049028,0.003969957665801882,-0.4166419768958855,-0.7515317662364001,-0.9581158117626174,-1.0143275535936829,-0.9220152723377758,-0.7066121269232309,0.6291119608921009,0.3797069254465296,,, +0.9375,1,0.3790078013506159,0.6432127477339737,1.114260847971115,1.675565480567844,2.183802672044403,2.5080437772751227,2.5655088240303368,2.3441428706994314,1.9058289687042689,1.3693580623457369,0.8778239819789362,0.5593801014422439,0.4921133949788015,0.6826629660211317,,, +0.9453125,1,1.0644429646931772,1.5159566288893715,1.89418160514328,2.0738759200059054,1.9820311064829448,1.6180288239196998,1.0539753777406151,0.41512102442074506,-0.15427104093073676,-0.5302534478387462,-0.6429441709068429,-0.4954490202553558,-0.16277304434147555,0.2289787068957022,,, +0.953125,1,0.9701626979468452,0.923664172922802,0.8623898987383699,0.7877762830073196,0.7014864364804467,0.6053809032324742,0.5014849382994121,0.3919529058123181,0.279030421090195,0.16501489965513533,0.05221520402540825,-0.057088905063872826,-0.1606868029401305,-0.2564758197127608,,, +0.9609375,1,-0.3424981636598989,-0.4169753026993731,-0.4783392018734252,-0.5252598698298542,-0.5566687319151145,-0.5717774205736202,-0.5700916539931171,-0.551419959944017,-0.5158770920236796,-0.4638820784557318,-0.3961509375811967,-0.3136841875675027,-0.2177493690173241,-0.10985888648651744,,, +0.96875,1,0.008256443110843836,0.13467767205704995,0.2673313031255654,0.4040255826159853,-0.8262613605991114,-0.958265732839502,-1.0268516735652105,-1.0279113696704016,-0.9621745274683904,-0.8351553726593125,-0.6567656758097671,-0.440620794055022,-0.20308712746040347,0.03786257878765811,,, +0.9765625,1,0.26390625492812303,0.4576541851355955,0.6038659590384571,0.6905178242289658,0.7096459991064675,0.6579071277599661,0.5368167825759641,0.3526493704331938,0.11600640920135685,-0.15891673366570894,-0.4553145219419947,-0.7549367702603829,-1.0393547421972562,-1.2912395531757797,,, +0.984375,1,-1.4955637468482748,-1.640642271287655,-1.7189402807559502,-1.7275914490476003,-1.6685906675525182,-1.5486477075314768,-1.3787120682606375,-1.1732021620361386,-0.4131300313032119,-0.09910156853828422,0.17443048691148538,0.3524723607079542,0.3946980303635799,0.2817848528153192,,, +0.9921875,1,0.01847898426810035,-0.3670871455767125,-0.8277192854504378,-1.3044544754022729,-1.7356871727960808,-2.0667072425468,-2.2581645116056297,-2.292141778374612,-2.1748906593690247,-1.935804430548168,-1.622788121607727,-1.2947472599174503,-1.0123654364657453,-0.8286073800296576,,, +1.0,2,-0.7804269669226975,-0.8829719050135362,-1.1271879458067344,-1.4811959681903784,-1.8952276160655983,-2.3093508909258422,-2.6627825318476024,-2.903336845735892,-2.995539378112533,-2.92614175264408,-2.7061787686766428,-2.3692473866966317,0.482588933436481,0.06600482215521475,,, +1.0078125,2,-0.5254753270438265,-1.1616432838467143,-1.698727569208394,-2.018589612077628,-2.0609081291463047,-1.8395326520511983,-1.438525749245629,-0.9889800559060912,-0.6329651074627736,-0.4844861296896955,-0.5981556844470776,-0.9541650130969404,-1.463674460708568,-1.9931459016737616,,, +1.015625,2,-2.4009484455545755,-2.576204755983333,-2.4692310237839554,-2.1052273589896044,-1.5774657255062734,-1.0218414589988545,-0.5797619084696924,-0.35954201422226306,-0.4068856787595716,-0.69254149748861,-1.120514307891758,-1.55458016737263,-1.8558358511091544,-1.9209896501106398,,, +1.0234375,2,0.5424888696425813,0.6804094098320009,0.8154758169913476,0.9454175539075216,1.0680447034516791,1.1812863335851358,1.2832267844811072,1.3721392423570349,1.4465160121181668,1.5050949587142581,1.5468816541929198,1.5711668426234628,1.5775389170456413,1.5658911899336343,,, +1.03125,2,1.5364238298280064,1.4896404301801431,1.4263392704404558,1.3475994223569967,1.254761944708456,1.1494064956934211,1.0333237724317874,0.9084842600981792,0.7770038378224209,0.6411068435275807,0.5030872443664244,0.36526859258601707,0.2299634679141684,0.09943311654974783,,, +1.0390625,2,-0.02415200660577055,-0.13875010165722668,-0.24248363046043364,-0.33367204302009634,-0.9489926046026642,-0.7242302476486435,-0.5170615323326153,-0.3443599265957629,-0.22054220305395,-0.1565561189734923,-0.1591101072271498,-0.2301987106999017,-0.3669568692133688,-0.5618532357983308,,, +1.046875,2,-0.8032090572074773,-1.0760064505508982,-1.3629297270109362,-1.6455671620294263,-1.9056894224370984,-2.1265155149468438,-2.293877990063048,-2.3972061601240955,-2.43025878004432,-2.3915551094545213,-2.2844743071074407,-2.117016235981041,-1.9012403677184968,-1.6524219214790663,,, +1.0546875,2,-1.387984089674816,-1.126280816484972,-0.8853150156955718,-0.6814816156466545,-0.5284230869991446,-0.4360772644395197,-0.4099838633591783,-0.4508980520998144,-1.9662756714479848,-1.5575964489019931,-1.2035602172214193,-0.955149349816788,-0.8460554066800825,-0.8874534630572624,,, +1.0625,2,-1.0662872700320072,-1.3473322117737805,-1.6787145938907837,-2.000027437743305,-2.2517785191464257,-2.3846988698248266,-2.36746167868597,-2.1916091047482475,-1.872919383372439,-1.4490010391163677,-0.973488656455744,-0.5077439761481221,-0.1113546363563852,0.16708985507563467,,, +1.0703125,2,0.2975085154334133,0.2729561575457441,0.11064710754541096,-0.15078378607205406,-0.4573559480596126,-0.7482072066448109,-0.9651286414911138,-1.0616847686758617,-1.0104982754504,-0.8075644075174764,-0.4729227691181594,-0.04758165994838559,-0.6742923707272139,-0.08856470193421306,,, +1.078125,2,0.35637951771777543,0.5592698808876002,0.4843950700170098,0.17118908247263748,-0.27676592800107,-0.7203044355897817,-1.0229795630769885,-1.0886034078549385,-0.8877356563286873,-0.4658595810047769,0.0689963670721908,0.5757996237202181,0.9191215224852934,1.0062313592089889,,, +1.0859375,2,0.8125103402665278,0.3882202064106673,-0.15522875931663516,-0.6757472328896216,-1.039423705548335,-1.1571200140542297,-1.0087768135982944,-0.6487687765323775,-0.19084316917948616,0.22322880254760447,0.4626945055226365,0.44385409503474016,0.15320865319332444,-0.3486239355115479,,, +1.09375,2,-0.4108610505955287,-0.4728479330377782,-0.5187024373248686,-0.5477829014615293,-0.559747321515834,-0.5545591681125328,-0.5324878506417807,-0.4941038211619544,-0.44026840383602495,-0.3721185280983509,-0.2910466329858179,-0.1986760946221226,-0.09683260723418896,0.012487981064462859,,, +1.1015625,2,0.12715481441064605,0.2449395417213485,0.3635555386516004,0.4806981520833566,0.5940852623414825,0.7014974527690425,0.8008170831680862,0.8900655828036947,0.9674383098445816,1.0313363667230593,1.0803948141987272,1.1135067899679008,1.1298431093709222,1.1288670048578435,,, +1.109375,2,1.1103437459917955,1.0743449714108724,1.0212476567621696,0.951727736545162,-0.5547380275702415,-0.7128702500948432,-0.9127124464741692,-1.1386123304229558,-1.372940762077666,-1.5973231139288693,-1.7939229721468055,-1.9466886519535167,-2.042475597994311,-2.071966394815178,,, +1.1171875,2,-2.0303242250763454,-1.9175341999177056,-1.7384087508265629,-1.5022566977031715,-1.2222390600556892,-0.9144565219837522,-0.5968321736003726,-0.2878674269465731,-0.005357847809282834,0.2348415605182937,0.4199155344674186,0.5409755534149318,0.5936728299306598,0.5784945563156888,,, +1.125,2,0.500722764641784,0.3700586848986357,0.1999388120645736,0.006590391322454314,-0.19210779790164548,-0.3778799010526837,-0.5333351962414516,-0.6431886211043071,0.4128262271212696,0.8466688017852271,1.1958770746547351,1.414955930298942,1.4780398641420087,1.382894861675775,,, +1.1328125,2,1.1512432342396122,0.825360925211951,0.4614773629850442,0.1210059369727916,-0.13902895585263875,-0.27487722892545896,-0.2628768474569535,-0.10313473213899003,0.18049845895441569,0.5441556856346962,0.9308023855662888,1.2791399956042273,1.533177247294035,1.6509783210608204,,, +1.140625,2,1.6112251339944692,1.4165714789512132,1.0932664022467051,0.6871052774479731,0.2563389989979549,-0.13735450503959362,-0.4384304499293133,-0.6060802670813212,-0.6205378624289266,-0.4861070991419339,-0.2304392367453065,0.09982684698052936,-1.849433491392657,-1.9496750574167168,,, +1.1484375,2,-1.7777698771292083,-1.3974234005106934,-0.9282926690639586,-0.5129899620482264,-0.2778061624295368,-0.29792022619552005,-0.5766315153404579,-1.0443083757565428,-1.5773425625503739,-2.031915951844642,-2.283326201943401,-2.2600943022163644,-1.963506884050272,-1.467237863950248,,, +1.15625,2,-0.897153442199384,-0.3968354209831701,-0.08827177769238381,-0.038487731952171145,-0.2412622290464561,-0.6189401022102381,-1.0438423598559288,-1.373405600129989,-1.4894186374643237,-1.33060133842281,-0.9095952131999928,-0.309707441877268,0.3377011311185609,0.8889886982734341,,, +1.1640625,2,0.8667484914112168,0.7675439041224066,0.6555972754713126,0.5326154744612375,0.4004992734905188,0.2613102878356991,0.11723509818759224,-0.029452815681038424,-0.17643266371014088,-0.3213767637441562,-0.4619910815331703,-0.5960551828214039,-0.7214608980950232,-0.8362490231016659,,, +1.171875,2,-0.938643412646395,-1.0270818708119975,-1.1002432968443427,-1.1570706115058569,-1.1967890625826405,-1.2189195891402405,-1.223287010642864,-1.2100228976656855,-1.1795630740535097,-1.1326397943804465,-1.070268733799173,-0.9937310182008966,-0.9045506094498,-0.8044674417860578,,, +1.1796875,2,-0.6954067798863245,-0.5794453352278336,-0.4587747341611508,-0.33566297746701057,-0.6953344902232309,-0.6816985120284926,-0.5988086739693494,-0.4480451689666369,-0.2355519176919261,0.02818416068420848,0.3290568075389378,0.6503165674676604,0.9737313617052376,1.280850578226663,,, +1.1875,2,1.5542845456174148,1.7789101847130064,1.9429187795003475,2.0386328178967736,2.063034956077031,2.017972234088424,1.9100213157508423,1.7500241631586562,1.5523265371796031,1.3337724376421831,1.1125246153827126,0.9067934162417656,0.7335626087337834,0.6074010567597432,,, +1.1953125,2,0.5394431117731273,0.536608832731706,0.6011184174657638,0.7303347120291643,0.9169447858994936,1.1494679159608914,1.4130545598784223,1.690520607044453,0.4463823054212647,0.7483837916567114,0.9519835582213336,1.0187695350821822,0.9318005117337964,0.6982961282848004,,, +1.203125,2,0.3485624167958438,-0.06868002627883185,-0.4938378384016245,-0.8656822392986492,-1.1308434069412725,-1.2520833132477311,-1.2140586996174674,-1.0256767819042505,-0.7186769592678678,-0.3426596046281809,0.042663617183217206,0.3767907139817997,0.6078697072534416,0.7007878694166749,,, +1.2109375,2,0.6426498386647692,0.4447913092560971,0.14101461825149192,-0.21767896981977908,-0.5710398000966727,-0.8589648214171128,-1.0308736696879843,-1.0536053978485376,-0.9166058064844635,-0.6335973125549073,-0.2404711376478829,0.21027002778654447,1.1069949952218805,0.7501809837572736,,, +1.21875,2,0.35588703021947377,0.06534954924850189,-0.009580363684424387,0.182679817511327,0.6190882571589118,1.2080868478764633,1.8145009664665968,2.296408325384052,2.543873841999355,2.508935876344122,2.21862676030554,1.7674601562473324,1.2914451224883914,0.9307495438373774,,, +1.2265625,2,0.7912462530150538,0.9154811845037544,1.2710203983217072,1.7593695761823391,2.243021088143746,2.583215300888636,2.678066147785533,2.4906009555910886,2.059028538759002,1.4864200976627155,0.91262962839822,0.4761480208798126,0.27634376286244444,0.34643709346324114,,, +1.234375,2,-0.2124145663389809,-0.09132999308230312,0.02533469405852956,0.13540754383232873,0.23683887826093114,0.32773732371229497,0.40640306577800817,0.4713577455792952,0.5213704739374225,0.5554795078220893,0.5730092094478307,0.5735819909915822,0.5571250357086368,0.5238716776922561,,, +1.2421875,2,0.4743574160515459,0.40941063323629984,0.3301381799703314,0.2379060791433843,0.13431568648104095,0.021175725366962328,-0.09952931456202167,-0.2256738617543729,-0.35502842273670265,-0.4852985671310446,-0.6141650551065375,-0.7393244046688798,-0.8585291884862409,-0.96962735468242,,, +1.25,2,-1.0705998831160366,-1.1595961178059682,-1.2349661568511086,-1.2952897327123325,1.9635447878050192,2.2139457433038205,2.4249497024634827,2.5823603667895174,2.6755494222096936,2.6981986045818096,2.648741569631146,2.5304747508525502,2.351329470624152,2.1233211908701617,,, +1.2578125,2,1.8617143029083416,1.5839606917003686,1.308486084396152,1.0534088068059089,0.8352802841239878,0.6679351052311739,0.5615308290077363,0.5218444791222846,0.5498747734289228,0.6417778136582725,0.7891407072676923,0.9795740276889584,1.197581785082222,1.4256482275354552,,, +1.265625,2,1.6454656719217788,1.8392177287665168,1.9908284222950319,2.0870900847236333,2.1185913570067556,2.0803805671919537,1.972318210262365,1.7990939330917486,0.6576534640900369,1.0416940750064492,1.3126953712902076,1.4389453204235572,1.4116086195695694,1.2460536335248906,,, +1.2734375,2,0.9794075706938256,0.6647209521557439,0.3626505582614149,0.1319565548953152,0.020294205363218243,0.056734695199496366,0.24718028183383545,0.5733881763039497,0.9957554852390144,1.4594317349405117,1.902807207983146,2.26705527299244,2.505242717339044,2.589589370947918,,, +1.28125,2,2.515746558315437,2.303428238914061,1.993296772735952,1.6405885969157414,1.3064728615415755,1.0484891613390657,0.9115539195840644,0.9209363930579746,1.0782984701904923,1.3614152140116005,1.7276197868759235,2.1204362820006,1.4702474315153802,1.7229351268316653,,, +1.2890625,2,1.7299345217014217,1.4648359569331082,0.9761195490210436,0.3740911863375618,-0.19913372871731366,-0.6083742191147057,-0.7622386937521861,-0.6379918713877715,-0.28762004498862404,0.17656610736545944,0.6128439699679149,0.8890333315865793,0.918815395311534,0.6854616828934671,,, +1.296875,2,0.24646882603681475,-0.2821714381727625,-0.7577561659100758,-1.049997999710457,-1.0767711820684784,-0.8266794802350752,-0.3622602297330119,0.19705443340274714,0.7075503234103276,1.0404809286334928,1.117198272052497,0.9305380853058244,0.5465998955917194,0.08643591811297399,,, +1.3046875,2,-1.3394010771745577,-1.366409335612162,-1.3757141731086149,-1.3670162991686614,-1.3403227267331743,-1.2959466734056255,-1.2345021066104676,-1.156893028184884,-1.064297686014425,-0.958147989146836,-0.8401044868023686,-0.7120273493710068,-0.5759438594893906,-0.4340129823950586,,, +1.3125,2,-0.2884876358940897,-0.14167532055525414,0.0041022005478801036,0.14654946658527934,0.2834374179701618,0.4126423275293054,0.5321828822143245,0.6402547661120026,0.7352621392660131,0.8158454611799194,0.8809051718785416,0.9296208159413664,0.961465274718111,0.9762138575944171,,, +1.3203125,2,0.9739480931963316,0.9550541542285343,0.9202159436088916,0.8704029630445488,1.5699068231055913,1.2978312780271846,0.9989126594401352,0.6910557758944368,0.3927836879394981,0.12195337037490404,-0.10548222442623068,-0.27657939383718944,-0.3822991487413456,-0.4181304868186237,,, +1.328125,2,-0.3843980289017199,-0.2862325820382514,-0.13320669777265126,0.06133934524099016,0.2812341178755136,0.508608851325814,0.7251494036635973,0.9133790648611446,1.057882733048598,1.146387083687875,1.1706213959944245,1.1268989970117886,1.0163787665923858,0.8449884575647731,,, +1.3359375,2,0.6230151687482111,0.3643915196669148,0.08572729622449009,-0.1948459135411376,-0.4589365329492434,-0.6891732749247111,-0.8704146121206096,-0.9908031029118904,2.478367433270725,2.744468520449553,2.8752163119246834,2.847291667665457,2.661219362360048,2.341298172172667,,, +1.34375,2,1.9318320586759667,1.490249386537046,1.0781817964791454,0.7518921297917031,0.5535421702098576,0.5046601446079699,0.6028252823162018,0.8220856423143535,1.1170439256616815,1.429974667795429,1.699864038372913,1.8719640077049,1.90637251241952,1.7843029489579465,,, +1.3515625,2,1.5110662144617382,1.1153005456767946,0.6445688261866345,0.1580088141673311,-0.2828192365476624,-0.6234623248701702,-0.8249978053516882,-0.8700381944808677,-0.765382688245521,-0.5409026862325821,-0.2448351844275578,0.06378261561479442,-0.4482837743750699,-0.12237444926248142,,, +1.359375,2,0.3956425109816272,0.9804153528085944,1.4876514352103738,1.7934468947377458,1.8280351946753053,1.5947071165438382,1.1687187342124896,0.6764885057098107,0.26078666342339163,0.041459042270752144,0.08245121543236222,0.3741719220325063,0.8360305596228292,1.3384542262377188,,, +1.3671875,2,1.7383508457411967,1.9182995441618715,1.8187277137605136,1.4542561333525776,0.9097323660107378,0.31703928135036635,-0.18096569405562468,-0.4694981140573645,-0.4931799595565763,-0.2710725029853471,0.10871022376442624,0.5133296633155346,0.8018234696190845,0.8639458856982862,,, +1.375,2,0.8068531765568224,0.7310511691024306,0.6447019828241964,0.5497010891503747,0.448101022625952,0.34207526081398343,0.2338799828283269,0.1258143762070114,0.020180187254881576,-0.08075877676582678,-0.17481648437387692,-0.259923157886676,-0.33416171885610463,-0.3958015626511832,,, +1.3828125,2,-0.4433290706798733,-0.4754743258650793,-0.4912335634690252,-0.4898869640321297,-0.4710114767510182,-0.4344884486349959,-0.3805059257299396,-0.3095555859889825,-0.22242435736779687,-0.1201808677826154,-0.004156964061882706,0.12407537663682087,0.2627313387962575,0.4098442861464919,,, +1.390625,2,0.5632999619259423,0.7208732730851681,0.8802670144781797,1.0391518551175196,-1.0425910551410196,-1.0226799540271796,-0.9328360399632016,-0.7795670041966264,-0.5736684008901444,-0.3294714049556501,-0.06384437033804156,0.20498218911912675,0.4586852616075968,0.6801251085332245,,, +1.3984375,2,0.8545381861679415,0.9705640371514548,1.0210345498032245,1.003470554813467,0.9202511379182456,0.7784438704433242,0.5893078055798846,0.3675039080244927,0.1300679868752121,-0.10478223628480854,-0.31892272529597376,-0.4955924293586698,-0.6205677596561403,-0.6831603291323165,,, +1.40625,2,-0.6769683658206387,-0.6003293867875625,-0.4564425513743754,-0.2531521463414689,-0.0024072855123025705,0.280564515213913,0.5783122745145783,0.8723714463955563,0.3243588721954497,0.4842325490115764,0.5069210956140426,0.3778455191262132,0.10664092742499044,-0.2743075298615396,,, +1.4140625,2,-0.7148754656685349,-1.1549765067209568,-1.533894786510661,-1.7997192189497422,-1.9174102193025169,-1.8742425225640649,-1.6817764156898791,-1.3740503971873357,-1.0022767892281566,-0.6268664899603584,-0.3080250331277209,-0.09638462758250277,-0.025131224490415386,-0.10485278119439134,,, +1.421875,2,-0.3219110300200213,-0.6405902364193937,-1.0086881260693557,-1.3656780065372471,-1.652170614800709,-1.8192017664528641,-1.8358989994334656,-1.6943328710487404,-1.4107970590723564,-1.0233176384626628,-0.5857792204516288,-0.15958257305958967,-0.4315280454299959,-1.07024917279397,,, +1.4296875,2,-1.5868813885690147,-1.8728305748318983,-1.8821837736426257,-1.6440526296006417,-1.2543603241928971,-0.849325048386138,-0.567909421733366,-0.5135292828843873,-0.7255181564042527,-1.1681698418539068,-1.7403637987647866,-2.3031367234908617,-2.717645037216712,-2.883114991801107,,, +1.4375,2,-2.7643803080303755,-2.4014608117661664,-1.8985573565301703,-1.3954794941456106,-1.0293368038226185,-0.8969930205407877,-1.0285728357870871,-1.3792818335767705,-1.8417807444978327,-2.275721686148642,-2.5463502887639,-2.5615927437910373,-2.2974618881254827,-1.804817689532176,,, +1.4453125,2,1.1952068864706666,1.3461600229350754,1.4898275472170073,1.6241521083125985,1.7472385068845069,1.8573866415697644,1.9531210394668799,2.0332164538603736,2.0967190811034766,2.1429630252876124,2.1715817225379084,2.182514125030192,2.17600553658136,2.1526030853150795,,, +1.453125,2,2.113145912808468,2.0587502516391334,1.9907896527543296,1.9108707090099883,1.8208047000879173,1.722575655414709,1.6183053944259942,1.5102161564438985,1.4005914746410857,1.291735979308761,1.1859348343923837,1.085413517679484,0.9922986490039089,0.9085805524796562,,, +1.4609375,2,0.8360782084123324,0.7764072086914179,0.7309512768744405,0.7008378517537914,1.1445444315433453,1.3781624220457784,1.5592406040595268,1.6774461795811728,1.7268117212455394,1.7061441328207834,1.6191007144205418,1.473927045227981,1.2828749789555969,1.0613413538695182,,, +1.46875,2,0.8267874944803688,0.5975148678670124,0.3913822881309871,0.2245541382105426,0.11036691500537896,0.0583931523292166,0.07376801201294891,0.1568255163548301,0.3030698023615158,0.5034834155819636,0.745151157954751,1.0121559989371474,1.2866845867493537,1.5502652798612804,,, +1.4765625,2,1.7850523771419688,1.9750670028371644,2.107308124442085,2.1726562368629403,2.166506703563244,2.089088596513405,1.9454468071596835,1.7450886810256967,0.1958671809531921,0.4323605553602965,0.5203392187316096,0.4534460917602438,0.2494616122931679,-0.052519369444836594,,, +1.484375,2,-0.3982300623764772,-0.7267365635268956,-0.9799800895666542,-1.1118700807604425,-1.0955116081444063,-0.9274411152964352,-0.6282105035100499,-0.23922834505746896,0.18365000637987366,0.578785249068871,0.8883208287750719,1.0671636178746085,1.0899799578476823,0.9551175450120664,,, +1.4921875,2,0.6848424371066464,0.32185437863086785,-0.077376705332696,-0.4514150974548301,-0.7434331761404945,-0.9100635878033748,-0.9281509200777788,-0.7983512774295494,-0.5450191374180196,-0.2123991622806476,0.14228381625426592,0.4577602749803407,-0.18977433186147274,-0.017018865263844773,,, +1.5,3,-0.1146269054343505,-0.4285093795782684,-0.8451463680332618,-1.222935345217393,-1.4312326791499972,-1.3863861664085668,-1.0748810998385614,-0.5572542328256587,0.04829896279345619,0.5981327809198843,0.9623497980297048,1.060247814723848,0.882301653841016,0.4926564716213366,,, +1.5078125,3,0.01145026962974277,-0.4181886817448976,-0.6694238458820821,-0.6665053851987185,-0.40554159309884463,0.04444606651667293,0.5604732923922542,0.9993545539018304,1.2370223479505182,1.2026270973323916,0.8980709631069363,0.3976207900543429,-0.17229505379401705,-0.6675703401963018,,, +1.515625,3,0.6869181620445374,0.6897521411897232,0.7095984465275519,0.7464097576857214,0.7998334366267499,0.8692175378839685,0.9536220638437976,1.051835268087256,1.1623947214097476,1.2836127717418484,1.4136059522539834,1.5503278227930144,1.6916046696787916,1.8351734388358685,,, +1.5234375,3,1.978721238128083,2.1199257172835395,2.256495618428582,2.386210787259217,2.506960944319276,2.6167825375629934,2.7138930309725398,2.7967220288930315,2.8639386911509317,2.914474958966589,2.94754418502186,2.962654841513152,2.959619066201632,2.9385558968554135,,, +1.53125,3,2.8998891374814963,2.844339893738907,2.7729139082638343,2.6868839176874686,1.501319821596434,1.230315383541526,0.949991619687944,0.6787563742727389,0.4342256556390873,0.23199578610056104,0.08455675029574382,0.00042251630834932996,-0.016461027196683187,0.03301076556202144,,, +1.5390625,3,0.14316607811941895,0.30395483448524185,0.5016525505569982,0.7198207461957087,0.9404569383795574,1.1452540150065793,1.3168811607242306,1.4401970025576003,1.5033103689417495,1.4984146814954868,1.4223377835325632,1.2767688521858591,1.0681465584102852,0.8072162608255379,,, +1.546875,3,0.5082870981446164,0.1882407714536752,-0.13463887740915073,-0.4419338891112137,-0.7163694037868586,-0.9430110230362118,-1.1102988371671618,-1.2108460280358089,0.6782850798940055,0.7623496033115138,0.6891797693449229,0.4620077553176018,0.10760757999747196,-0.3278332870004603,,, +1.5546875,3,-0.7858634910787914,-1.2048251799485121,-1.5294087177599365,-1.7192167814660393,-1.75500419868313,-1.6416219104029368,-1.4072067990029389,-1.0987438539916448,-0.7746921796909381,-0.4958236739052973,-0.3157015937866517,-0.2722823142936249,-0.3819486396949662,-0.6369042980650313,,, +1.5625,3,-1.0063357219727715,-1.4411604376324718,-1.8816227439327675,-2.2665538732731463,-2.5428545639009257,-2.6737233199541883,-2.644348988213384,-2.46418121248142,-2.165425324892171,-1.797996281067452,-1.4217177514676351,-1.0969815447280291,-0.7741952884926684,-0.3676474077111154,,, +1.5703125,3,0.09291285016237402,0.465147010988419,0.6310105967019681,0.5293283952340829,0.1727812351378767,-0.3553534278064613,-0.9238158916207933,-1.3891376606818686,-1.6347714882955175,-1.6028554902653855,-1.3099074763341632,-0.8421497610308953,-0.3317472444260178,0.07952750570914857,,, +1.578125,3,0.2792427282766825,0.21519394182628715,-0.09023739879340208,-0.5461889011235314,-1.0182130515974754,-1.365140806911452,-1.4778097016538727,-1.30904199824646,-0.8866563009414687,-0.3059458729864616,0.2963157383977546,0.7792185410754601,1.0361758028780386,1.0239603649235172,,, +1.5859375,3,2.5877673402938486,2.4772996850224067,2.3574041474349725,2.230157925030499,2.0977558417311384,1.9624719184762576,1.8266195628218105,1.6925110746193852,1.562417176822367,1.438527280022869,1.32291117647226,1.2174828343051969,1.123966925908518,1.0438686764992848,,, +1.59375,3,0.9784475608358444,0.9286953086021268,0.8953186035577466,0.8787267793554009,0.8790247274329206,0.8960111411208309,0.9291821266665166,0.9777401178983738,1.0406079383841988,1.1164477648023925,1.203684659421774,1.3005342595781368,1.405034139243467,1.5150782934835842,,, +1.6015625,3,1.6284541419146952,1.7428814031594566,1.8560521595393784,1.9656714103960224,-1.2419463749910065,-1.2057552907612463,-1.1091317800985276,-0.9631523590706343,-0.7823308482232767,-0.5835984632467965,-0.3851153420246646,-0.20499640140010367,-0.060040391005554576,0.035449211537362024,,, +1.609375,3,0.0706692242638407,0.03907760297809471,-0.061142970780862727,-0.226951099808562,-0.4506516390218113,-0.7204253437228456,-1.021146279738486,-1.3354300098868244,-1.6448394780258138,-1.931164514720596,-2.1776857541999632,-2.370334838793132,-2.4986700186838817,-2.556599127300637,,, +1.6171875,3,-2.5427995283458062,-2.460805760955726,-2.318758781281612,-2.1288342960483257,-1.9063900608733075,-1.6688916128769966,-1.4346913568477533,-1.2217461495828248,-0.8753223314326115,-0.7913758097924405,-0.8574729563802483,-1.0617124005485268,-1.3698112043323931,-1.73044580211135,,, +1.625,3,-2.0832512224376982,-2.3682326518825016,-2.5351234000248173,-2.5512316522063063,-2.406553755447892,-2.1153575147056336,-1.7139887715779918,-1.2552427622976108,-0.8001767873560358,-0.4086392369007047,-0.12998993390525893,0.004543057148183149,-0.013320089106319544,-0.16767114579059195,,, +1.6328125,3,-0.4209435480714167,-0.719817360229284,-1.0035794980013688,-1.2136367816630915,-1.3026998291919758,-1.2422070620546433,-1.0268322041726683,-0.6753729137257735,-0.2278818443858837,0.2605133051765541,0.7281384848090136,1.1163226277582061,-0.006378244041551295,-0.26233023513776266,,, +1.640625,3,-0.28116758656830754,-0.026324680411207942,0.4636456384154472,1.0853962965465516,1.6988694728064229,2.165444653132662,2.38569816276634,2.326427514088596,2.029536034028268,1.6003447029614464,1.1785364180873152,0.8996977057413033,0.8579997286309795,1.0802480373662249,,, +1.6484375,3,1.5184145208183024,2.0626994189411474,2.571544402758488,2.9103717541025294,2.9884329156766967,2.783667642122547,2.3487607095711507,1.7967361174606993,1.2700366679968582,0.901562766215884,0.7783478199468318,0.9178248127207824,1.2631875751306625,1.6991168215441923,,, +1.65625,3,2.069497403876071,2.16538104089064,2.2513036612034694,2.325412549928884,2.3860535426328657,2.4318001580324364,2.4614787480867246,2.474189225006607,2.4693210021553096,2.4465638696144403,2.4059136138818937,2.347672283195509,2.2724430937293683,2.181120065745537,,, +1.6640625,3,2.0748725710604696,1.9551250622858267,1.8235323386687263,1.6819507815085273,1.5324060626979987,1.3770578916909015,1.2181624180528596,1.0580329478021793,0.8989996612709947,0.7433690376991178,0.5933836969072555,0.451183361091325,0.3187676201660081,0.1979611525041839,,, +1.671875,3,0.09038200992417998,-0.002586477878652293,-0.07981968763702307,-0.14047115572266974,-1.0463628149627728,-0.9220590738276536,-0.8586193236779305,-0.8614111149137635,-0.9310099903091388,-1.0631588504437892,-1.249064679430263,-1.4760119392378157,-1.7282498577782164,-1.9880917356075989,,, +1.6796875,3,-2.2371496105449102,-2.4576181797503787,-2.633518443119139,-2.751814339805261,-2.8033245054940097,-2.7833655641470565,-2.6920820881371377,-2.5344402095545,-2.3198853194140643,-2.061687715005781,-1.7760218153143332,-1.4808431429207265,-1.194641372549523,-0.9351563880843594,,, +1.6875,3,-0.7181468688328232,-0.5562972622387896,-0.4583393495958032,-0.4284496465748561,-0.4659646450877979,-0.5654337385003728,-0.7170061240908038,-0.9071246870048696,1.3784805496635275,1.4873149774697434,1.4390162212903792,1.2538056256041932,0.9727384008939028,0.6512640458640588,,, +1.6953125,3,0.35054757934146674,0.12790355212954874,0.02783298269282497,0.07505943541948358,0.270649065747248,0.5918190940804479,0.9954646592206594,1.4248548252391635,1.8184548832638203,2.1195008875104056,2.2848351796295487,2.291626739405757,2.140929628207127,1.8575252542434573,,, +1.703125,3,1.4860729821102805,1.0841685832527157,0.7133916237356159,0.4297360994505196,0.27491467205388986,0.2698907723655967,0.4116458179786364,0.6736848887068293,1.0102019028938325,1.3632553359861397,1.6718366009790857,1.8814184054799872,2.2274498842200714,1.8945085240910613,,, +1.7109375,3,1.3510601710451655,0.7169787420476611,0.13636002041648487,-0.2617313589867526,-0.3983942268134281,-0.26627595760167605,0.06864853864877107,0.4853893524545964,0.841324646602257,1.0115029615848752,0.9230912579680516,0.5755257139495521,0.04084086585813024,-0.5559146601456152,,, +1.71875,3,-1.0708097558244811,-1.3803565534501263,-1.4152533102311176,-1.1792974030039505,-0.7482856144605503,-0.2492035740417713,0.17459183732650962,0.40265460862258495,0.3704303513128448,0.0868970104281217,-0.36796869089992135,-0.865203940133319,-1.2623176879204412,-1.4424745980052656,,, +1.7265625,3,-0.183987159772548,-0.21011617354117773,-0.2189130295601948,-0.21073771685239207,-0.18624883488788926,-0.14639181853915462,-0.09238214035114987,-0.02568378439034802,0.052016631270005435,0.13883963017819326,0.232746029740508,0.3315728894366367,0.4330716254268444,0.5349476240320282,,, +1.734375,3,0.6349006603218093,0.7306654139496416,0.8200513726717469,0.9009814247083172,0.9715284640656754,1.029949367730683,1.0747157496686577,1.104540952994962,1.118402807560426,1.1155617543400531,1.0955740191418912,1.0582996048408304,1.0039049620706626,0.9328602914889734,,, +1.7421875,3,0.8459315247319688,0.7441671243535508,0.6288799337640282,0.5016243948596204,-1.1194784628498966,-1.3361472442840123,-1.5388584979055848,-1.7102689257956616,-1.8351812873521325,-1.9016116114386088,-1.9016323615461683,-1.8319327401299024,-1.694057043063578,-1.4943044257781113,,, +1.75,3,-1.2432970535649646,-0.9552467332657341,-0.6469711495751467,-0.3367282902428033,-0.04295032295767043,0.21703480147756715,0.42820488888291497,0.578884412692979,0.6615522253227353,0.6733597603599035,0.6163236039825862,0.4971790207865232,0.3269046614191585,0.11995160840919915,,, +1.7578125,3,-0.1067694665555884,-0.3350723935947804,-0.5467682624828171,-0.7249380836433011,-0.8551165959886863,-0.9263046620132844,-0.9317396444233592,-0.8693700360417679,1.9524956296813785,1.8667881794533745,1.6301394195429189,1.2716584651683334,0.8392396430653856,0.3921567033836333,,, +1.765625,3,-0.008115016319480306,-0.3074192695450778,-0.4672998169165834,-0.4709364975505619,-0.3257121679587577,-0.06201097641527376,0.2715645758116729,0.615812549483701,0.9101995122817772,1.1023337321713529,1.1561678807214275,1.0576534060105949,0.8169656644659512,0.466953038268442,,, +1.7734375,3,0.05805141505975395,-0.34954403797225136,-0.6952306649395888,-0.92741721456032,-1.0115429026994929,-0.9354477221821992,-0.7112576148897333,-0.3734909291297172,0.026318880834150616,0.4276467635481657,0.7703960980152812,1.004248056581707,-0.4579413454612339,0.11730256714318445,,, +1.78125,3,0.5924396323453655,0.8523468708964874,0.8413660575463395,0.5783376397340091,0.1512145488164637,-0.3072657551307887,-0.6561812935163289,-0.7852645402726754,-0.6453336665660784,-0.261973735805029,0.27128371131710605,0.8184152706827503,1.2380198891717653,1.4219224058499187,,, +1.7890625,3,1.3246878224206975,0.9759586440717576,0.4722351427695442,-0.04964770761466325,-0.4500766717117074,-0.6249563957850195,-0.5342490527994426,-0.21293545784253232,0.2386064227377941,0.6821683631626598,0.9796684647302872,1.0310940260991164,0.8020308504138712,0.33323299991273864,,, +1.796875,3,0.3641695321474583,0.2184681763005693,0.0666229659270508,-0.08915027724735268,-0.2465611585907291,-0.4032846302113071,-0.5570015211498883,-0.70543896853608,-0.8464100418583194,-0.9778518666238808,-1.0978615799578897,-1.2047294886512785,-1.2969688491493991,-1.37334174812053,,, +1.8046875,3,-1.4328806305194828,-1.4749050982708731,-1.4990336855054087,-1.5051904042398323,-1.4936059459578273,-1.4648135181211357,-1.4196393885796201,-1.3591883035101435,-1.2848240342758248,-1.1981453938864222,-1.1009581430645603,-0.9952432778927858,-0.8831222543708634,-0.7668197588450381,,, +1.8125,3,-0.6486246762390877,-0.5308499395702094,-0.4157919638189093,-0.3056903744958013,-0.7420012388380448,-0.5571023205215023,-0.3262872190297329,-0.06450656782321043,0.2109935049678467,0.4818730000298957,0.7299763018733703,0.9385979296629696,1.0936475193032087,1.184632798308629,,, +1.8203125,3,1.205392006102656,1.1545246835335992,1.035490788250107,0.8563712204600801,0.6293064537245521,0.36965241140666977,0.09491244597557263,-0.17648010933800584,-0.42644392772047457,-0.6385068262054071,-0.7989503983318468,-0.8977623330119602,-0.9293300219036148,-0.8928270989987313,,, +1.828125,3,-0.792265969563703,-0.6362126777788512,-0.4371840091760071,-0.21076888327892607,0.02546468153241603,0.2532007957185043,0.4546592465839944,0.6138418454788837,1.0964841465885211,1.0370636052444695,0.8401649133240138,0.5419514449977543,0.19490940076585486,-0.14035992629342053,,, +1.8359375,3,-0.4046149822783491,-0.5492399397621132,-0.5438584111903592,-0.381108794748654,-0.0778372363449209,0.32747784569938115,0.780668783647153,1.220263837763802,1.5870087647330031,1.8330420216019567,1.9292948032811053,1.869963607062778,1.6733589893856151,1.3789986081276742,,, +1.84375,3,1.0413976154180449,0.7215238688866228,0.4772491424736793,0.35428389116306946,0.3790078013506159,0.5543130719586719,0.8591081133290059,1.2515592108502356,1.675565480567844,2.0694588285465945,2.3755740553241265,2.5491987016758197,-1.3229268867381898,-1.5366462195845454,,, +1.8515625,3,-1.4788538348969995,-1.193857764962003,-0.7885642689928296,-0.40294379970708427,-0.17143172116215044,-0.1858448388421172,-0.4699793784253336,-0.97285450929222,-1.5824552988251752,-2.156210659323168,-2.5598552253537337,-2.704026232160303,-2.568567132529315,-2.2078787850950565,,, +1.859375,3,-1.735853204535301,-1.2945205220631872,-1.0150033625304706,-0.9814809765678968,-1.2080403983691754,-1.6347597599913868,-2.1440977366639813,-2.5930975921477533,-2.8525797785490954,-2.842581483437588,-2.5543299084930595,-2.052726558911848,-1.4586609694220063,-0.9160002448551864,,, +1.8671875,3,-0.2026887360859687,-0.10879696803995907,-0.02585610642847891,0.04449397169734126,0.10084329607908726,0.14203651977173415,0.16719317161672698,0.17572309004067022,0.1673367679306974,0.1420504274478377,0.10018573592117687,0.04236416780341457,-0.03050388858132225,-0.1172350887446494,,, +1.875,3,-0.21639387476218386,-0.3263176397999219,-0.4451458737873214,-0.5708527798729431,-0.701282790521552,-0.8341883613367932,-0.9672693808066372,-1.0982135058714602,-1.2247367170004515,-1.3446233826147655,-1.4557651312851534,-1.5561978510035233,-1.6441361676203106,-1.7180047986761988,,, +1.8828125,3,-1.7764662335650014,-1.8184442552881592,-1.8431428918711203,-1.8500604655359043,0.7176546468537259,0.7568277673512909,0.7265686468204796,0.6269031808281852,0.4626809197446652,0.2432439550075468,-0.01821743480365573,-0.3055774623135178,-0.6008922072893537,-0.8856437891488929,,, +1.890625,3,-1.1420245930610042,-1.3541720135364326,-1.5092676298748708,-1.5984241812888702,-1.6172985067467591,-1.5663877237059634,-1.4509880084084592,-1.280818867978205,-1.0693391205475615,-0.8328022974475869,-0.589117352021583,-0.35659413576968746,-0.1526611376006568,0.007355084353715235,,, +1.8984375,3,0.11130365146120368,0.1510614056979004,0.12310381596235245,0.028754927455726945,-0.12590108601952288,-0.3304406088170753,-0.5708241824581806,-0.8303725663479977,2.5655088240303368,2.423410572602599,2.145689364678846,1.7754435381108422,1.3693580623457369,0.9888660419651508,,, +1.90625,3,0.6905747146901978,0.5174471838854645,0.4921133949788015,0.6133522031579365,0.856292444451141,1.1763016469592809,1.5159566288893715,1.81401018952742,2.014957177340849,2.0777098438380928,1.9820311064829448,1.7317235434175922,1.3540772374242862,0.8956622742387178,,, +1.9140625,3,0.41512102442074506,-0.025917376654358004,-0.3723854715890647,-0.5843018765518898,-0.6429441709068429,-0.5537090907084877,-0.34521481351435124,-0.06478544235578748,0.2289787068957022,0.4753875057003949,0.6211729763020292,0.6288449856739826,-0.5956776917486173,-0.9389269117796328,,, +1.921875,3,-1.3513703712861196,-1.6903839326886918,-1.8324179939061669,-1.7070919193933205,-1.3167219668508932,-0.7359285521603185,-0.09142832185679743,0.472452756841385,0.8330956267224279,0.9229604273147226,0.7478705789250167,0.3851995589018297,-0.037540754427036416,-0.3778400586173917,,, +1.9296875,3,-0.5174254152347022,-0.39483793899030095,-0.022420689283798482,0.5169393475720595,1.0924233244130597,1.5610502364140522,1.8068015424533592,1.7723783027409177,1.474887432040096,1.0011580074901996,0.4839711527673197,0.06571782965128248,-0.1405557019251984,-0.08203923066623853,,, +1.9375,3,-1.8389984935592227,-1.8100652848894097,-1.7636741694698714,-1.7005363911948759,-1.6216487888605666,-1.5282764807332592,-1.4219308558412198,-1.3043432572722582,-1.1774348181901564,-1.0432829786460918,-0.904085269377888,-0.7621209966430341,-0.6197114988812161,-0.4791796710079287,,, +1.9453125,3,-0.3428094649619429,-0.2128060755432073,-0.09125750857680903,0.01990179576844675,0.11892464766501495,0.20428151061222688,0.2746870904835995,0.32912264518020884,0.3668536243683166,0.3874423305505679,0.3907553798978773,0.3769658323262315,0.3465499536453466,0.3002786665991266,,, +1.953125,3,0.2392038406165078,0.16463966046608236,0.07813940017686427,-0.018531990957448785,-1.0909272039588418,-1.3341141783118382,-1.54262352318618,-1.7014146848988767,-1.7987640784607986,-1.827081692371204,-1.7834398004717231,-1.6697769141508672,-1.4927627538864456,-1.2633336564842377,,, +1.9609375,3,-0.9959308151074628,-0.7074944707777672,-0.4162841914805438,-0.1406075016518648,0.10245448497172582,0.2982355679999742,0.43550422579085546,0.5072435382349656,0.5111368873050408,0.44972557355875203,0.3302273658611855,0.16402864651478227,-0.03411442409129037,-0.2471100075321893,,, +1.96875,3,-0.4567278299142708,-0.6448760677028516,-0.7948688231789841,-0.8925957915408543,-0.927512541609958,-0.8933823407770214,-0.7887177799537943,-0.6168913877509636,0.482588933436481,0.19078654731048306,-0.2152331273235374,-0.6860182843843595,-1.1616432838467143,-1.5809908525623206,,, +1.9765625,3,-1.8912220624607536,-2.05595933091376,-2.0609081291463047,-1.916042005629488,-1.6540107984005894,-1.3250201526489276,-0.9889800559060912,-0.7061454504069468,-0.5277068306589361,-0.4877965051754379,-0.5981556844470776,-0.8462930992916223,-1.1974220088697822,-1.5998739326733988,,, +1.984375,3,-1.9931459016737616,-2.317327818226506,-2.5224415340754964,-2.576236985279352,-2.4692310237839554,-2.2162040296530785,-1.8539210875376968,-1.4354325358061577,-1.0218414589988545,-0.6728202134864644,-0.4373529040365888,-0.3461455200704413,1.1467688435186134,1.4980099614268738,,, +1.9921875,3,1.6187711498683792,1.462334419565897,1.0569324971904903,0.498220328146331,-0.07672506600168387,-0.5267526005842951,-0.7450991679464635,-0.6884265622454528,-0.3884772902444846,0.05684310639569262,0.5105110534025132,0.8341430079590303,0.9261162687017892,0.7496028918707267,,, +2.0,4,0.3428316998734035,-0.19123575750806507,-0.7129872686866511,-1.0843049334120924,-1.2063198144830585,-1.0464298347250756,-0.6471769192915173,-0.11455102344252938,0.411073042714051,0.7934004575541473,0.9375408567709732,0.8159631349046477,0.4759675766427308,0.026628061558278158,,, +2.0078125,4,-0.12342901014325958,-0.23445988554895425,-0.34942342301310136,-0.4660477696828594,-0.5820304156998989,-0.6950787333737771,-0.8029503438697233,-0.9034926044584128,-0.9946805247739644,-1.0746524480336042,-1.1417428723088832,-1.1945118370147516,-1.2317703599264012,-1.2526014791888611,,, +2.015625,4,-1.2563765317405933,-1.242766382983388,-1.2117474109340247,-1.163602139942752,-1.098914512749843,-1.0185598835345533,-0.9236899070466116,-0.8157125882804835,-0.6962678418921369,-0.5671989891830251,-0.4305206916103103,-0.2883838821791048,-0.14303830864113198,0.003206655757734739,,, +2.0234375,4,0.1480222479022163,0.289100892402077,0.4241964107651613,0.551163158206648,-0.3859075051249981,-0.10785131274392468,0.201946583850768,0.5259717714538761,0.8457398354002947,1.1430777289920209,1.4013833691665265,1.6067756399283124,1.7490546273900875,1.822405143492685,,, +2.03125,4,1.825794496799712,1.7630367898754966,1.642519276866646,1.4766098804333487,1.2807872008204966,1.0725537011936896,0.8702078729682445,0.6915610183866129,0.5526881493322399,0.46680012201606497,0.4433156726513847,0.4871980791127472,0.5986027199368104,0.7728601217047651,,, +2.0390625,4,1.0007956906829507,1.2693638460118644,1.5625523469608724,1.8624937646921649,2.1507066035221767,2.4093795351589327,2.6226092023283174,2.777505285268737,-0.4068856787595716,-0.6030900671091435,-0.896718859611238,-1.2341496504759275,-1.55458016737263,-1.799550729491992,,, +2.046875,4,-1.92210299945564,-1.8941482219957133,-1.7108970199195548,-1.3916604930237952,-0.976897553040448,-0.5219680964580852,-0.08856470193421306,0.2648428756936255,0.492062375898404,0.5663228301082165,0.4843950700170098,0.2670474142773377,-0.04423419382057015,-0.3937505053118819,,, +2.0546875,4,-0.7203044355897817,-0.9667699955731356,-1.0890240781658016,-1.0628497489851112,-0.8877356563286873,-0.5869796390727342,-0.2040802705171976,0.20402173094139192,0.5757996237202181,0.8547149748836379,0.9980189936148416,0.983410035725944,-0.6407408096965312,-0.3609564530859463,,, +2.0625,4,0.1423536538751039,0.7555884121110636,1.3357789662049178,1.7495550344959367,1.9094729012817016,1.7977507184629131,1.470908097423906,1.044040568277912,0.6590409708169729,0.4454795013373354,0.4848661572865165,0.7880922639417178,1.2922357131814213,1.8776074500573623,,, +2.0703125,4,2.4003691243390697,2.7317841181305345,2.7933460182675685,2.57815832297406,2.1527071349952527,1.63854211412411,1.1788873215563904,0.8993336606652719,0.8733864765386294,1.1023110192658687,1.5147996534437351,1.9865519422153173,2.3744010051427096,2.5556326469554413,,, +2.078125,4,0.6679934029280548,0.7728522934720765,0.8641098019899762,0.9403690842086286,1.0004907596252777,1.0436126868930922,1.069164888237471,1.0768793616812045,1.0667946093687373,1.0392548027983493,0.9949035996763852,0.9346727207550302,0.8597654867655601,0.7716356038044949,,, +2.0859375,4,0.6719615687275158,0.5626171427966566,0.4456384106683102,0.32318800159809524,0.1975170994244104,0.07092590660920375,-0.05427674531943255,-0.1758139316345515,-0.29148060673952353,-0.399182312982546,-0.4969719481057872,-0.5830839474752081,-0.6559652825070191,-0.7143027324575079,,, +2.09375,4,-0.7570459519999222,-0.7834259306299012,-0.7929685206332869,-0.7855027967022923,2.8650857800488048,2.8809000661304704,2.8253363219741567,2.7035918581332674,2.525308442341188,2.3038980514754366,2.055606071997765,1.798377278209917,1.5506036697727532,1.3298414874419353,,, +2.1015625,4,1.1515868744443116,1.0281955605417568,0.9680219018398424,0.974837312195996,1.0475686383947342,1.1803747197425838,1.363055789250772,1.5817671626698853,1.819987441892964,2.0596737103694096,2.2825231578632,2.471253149486786,2.6108104670351224,2.68942538897906,,, +2.109375,4,2.699437094682166,2.6378328240315647,2.506463183778912,2.3119185745942183,2.0650753433801348,1.7803432959454124,1.4746670297023587,1.1663507124709571,0.8125103402665278,0.510620459641805,0.12278959258876675,-0.2931861738047025,-0.6757472328896216,-0.9691363315511194,,, +2.1171875,4,-1.1320571324417057,-1.1440769874507433,-1.0087768135982944,-0.7531576357580012,-0.4233964208576687,-0.0776124606729896,0.22322880254760447,0.4248574971406205,0.4882001710895144,0.39551546104627866,0.15320865319332444,-0.20911352002959216,-0.6432009067548851,-1.089621134256952,,, +2.125,4,-1.4869621467296623,-1.7813430290644954,-1.9347520468147728,-1.9309134988431889,-1.7777698771292083,-1.5061930079978365,-1.1651251996003478,-0.8139074589255041,-0.5129899620482264,-0.31447192422575754,-0.2539445773179371,-0.3449079839001914,1.5387091827839483,0.9138720673531758,,, +2.1328125,4,0.3667707820059671,0.018509409691161882,-0.06574131066289801,0.1056123582588071,0.453118434368923,0.8482896698740181,1.1490586829478089,1.2389584413958439,1.0592877350111805,0.6254438671186694,0.02294409555879437,-0.6157759128393172,-1.1474298573268171,-1.4569317350661972,,, +2.140625,4,-1.4887291761984036,-1.2618334854907922,-0.8644288157631795,-0.4295395081545591,-0.09842587065968156,0.0182582314441262,-0.1291006445125804,-0.5153919021247109,-1.0475986207860142,-1.5902485699321156,-2.0025234578063653,-2.1768559703403394,-2.0684361890461864,-1.7075402363215448,,, +2.1484375,4,-0.761164100786609,-0.7203917188305384,-0.6639212300456011,-0.5927716626549642,-0.5082276809874574,-0.4118171158032524,-0.30528423127572724,-0.19055919670867405,-0.06972429752583903,0.05502252283191365,0.18140615172706945,0.3071141529287601,0.4298372713027165,0.5473098873484153,,, +2.15625,4,0.6573497132188906,0.7578960351364922,0.8470458325681215,0.9230871416971039,0.984529078978422,1.0301279990424894,1.058909328896488,1.0701846960774763,1.0635640508103614,1.0389625698757536,0.996602221261426,0.9370079621574292,0.8609986368216662,0.7696727336446634,,, +2.1640625,4,0.664389250754411,0.5467440051482232,0.4185418001195488,0.2817649382651933,0.8737882446764589,0.614187339715401,0.4023764809799243,0.24977793442043075,0.16361841562692225,0.14643243772239833,0.19589295655402472,0.3049811059815941,0.4624831700654728,0.6537801195600327,,, +2.171875,4,0.8618746385901603,1.0685840063965002,1.2558156334228587,1.4068362873007991,1.5074464843798938,1.546978135668173,1.5190458612293192,1.4219995647496864,1.2590466922928083,1.0380356334934,0.7709153533587141,0.4729089206510494,0.16145855009990462,-0.1449842908321317,,, +2.1796875,4,-0.4282393553216197,-0.6716593931316558,-0.8612852548950279,-0.9868137885064612,-1.0423110454297595,-1.0266210744762156,-0.9434418076388368,-0.8010627566450811,-0.5766315153404579,-0.9157914376916292,-1.3116307291450875,-1.7038376300230802,-2.031915951844642,-2.2445878043329257,,, +2.1875,4,-2.307764330943068,-2.2098430640719577,-1.963506884050272,-1.6037444391290103,-1.182400390210262,-0.7601043211441201,-0.3968354209831701,-0.14259250924503053,-0.029622546596747783,-0.06741801041017059,-0.2412622290464561,-0.5145491356351974,-0.8345159971247429,-1.1404960669093456,,, +2.1953125,4,-1.373405600129989,-1.4849873952904895,-1.445370932110397,-1.2477713595478799,-0.9095952131999928,-0.4697803994078772,0.017215495267322814,0.4898424797117321,0.8889886982734341,1.1671300825015924,1.295674293303487,1.2693553854922903,-0.2453985203232557,-0.060639380290519074,,, +2.203125,4,-0.14350282673478476,-0.4595409251919406,-0.9088762212905138,-1.3537651566323101,-1.6565504415186187,-1.7175988417305936,-1.502824752287817,-1.0532540911804535,-0.4740052114742447,0.09429531647380844,0.5138301302670809,0.6871421899802674,0.5836300509189356,0.2477277829408703,,, +2.2109375,4,-0.21347036073728687,-0.6597469374416554,-0.9563629969505693,-1.0111432439668877,-0.7998792475733083,-0.3730870921273843,0.15773378014817552,0.6505754977406221,0.9717790099433632,1.0326246704408495,0.8136281902078141,0.3698833795032394,-0.1840126023083153,-0.7053201559539015,,, +2.21875,4,0.1385386313447632,-0.008906087403063423,-0.15827129915387278,-0.3072323019071236,-0.4534781772966308,-0.5947521115567385,-0.7288907647068473,-0.8538619986851601,-0.9678003038993772,-1.0690393039658623,-1.1561407695712873,-1.2279196335186544,-1.2834645690408646,-1.3221537711541285,,, +2.2265625,4,-1.34366566482045,-1.3479843525216408,-1.3353997059622578,-1.306502100401628,-1.2621718839249298,-1.2035637661552288,-1.1320863998715969,-1.0493775131715988,-0.957275027727375,-0.8577846689712778,-0.7530446354720807,-0.6452879462604454,-0.5368031255210578,-0.4298939131826768,,, +2.234375,4,-0.3268387069972834,-0.2298504463990766,-0.14103764070300784,-0.06236722416418972,-0.6117828212297958,-0.3910488162596164,-0.15637479928428533,0.0738824351618948,0.28180629899123744,0.4511723219272772,0.568581725751961,0.6243976092019627,0.6134184566711893,0.5352420019358942,,, +2.2421875,4,0.3942940714648549,0.19952039473942465,-0.03623712778476579,-0.29713620384343603,-0.5654395088903816,-0.8227525436905341,-1.0513076673543051,-1.2352047624195135,-1.3615220119639897,-1.4212193254458922,-1.409771408446071,-1.327486323513877,-1.1794873202698808,-0.9753591934917724,,, +2.25,4,-0.7284838207247557,-0.4551112047663907,-0.1732307897907634,0.0986782532159865,0.3429306367975997,0.5438629651733916,0.6889205200895572,0.7695270526947121,1.1069949952218805,0.8485117855020952,0.54864523852638,0.2683716397961662,0.06534954924850189,-0.015116787445145663,,, +2.2578125,4,0.05281168782009072,0.27143151511881697,0.6190882571589118,1.0535007831227243,1.5183007617920965,1.951769031502176,2.296408325384052,2.5078615485579667,2.5617867215996566,2.457617947574986,2.21862676030554,1.888274428009085,1.5234234704055996,1.1854658215633775,,, +2.265625,4,0.9307495438373774,0.8017952319300118,0.8206702267673641,0.9855526475611006,1.2710203983217072,1.6320200996595788,2.010897708106156,2.3463956906754317,2.583215300888636,2.6806544653154663,2.618975749176476,2.4025124033693563,-1.0133258959658362,-0.652030836213922,,, +2.2734375,4,-0.20280927098799634,0.1920065112834072,0.40383058286704,0.353256297383334,0.032022315053677815,-0.4945103766225138,-1.105051298363284,-1.6553961455986168,-2.0177187891964774,-2.11537299583507,-1.9436679217112072,-1.570925598246434,-1.1195327199039151,-0.7321819631053437,,, +2.28125,4,-0.5325571084347556,-0.591238944481824,-0.9061779735179668,-1.4030875002717034,-1.9556509741442785,-2.4200068163652184,-2.6740607733032555,-2.6508525848750506,-2.356833108079668,-1.870043435551868,-1.3186956104879657,-0.8460256698329308,-0.5710518834680967,-0.555993111660472,,, +2.2890625,4,0.004370111567488566,0.057591500439606265,0.09594984729053048,0.11835764599050658,0.1240062532444266,0.11238028044012592,0.08326685140766976,0.036759563853196335,-0.026742915032078263,-0.10654359433150083,-0.201659128548878,-0.3108368006964833,-0.43257622208830415,-0.5651553690113454,,, +2.296875,4,-0.706660500509952,-0.8550194335603453,-1.0080375931229877,-1.163436205974625,-1.3188919696815278,-1.472077502247008,-1.6207018642963174,-1.7625504443894695,-1.895523509206272,-2.0176727437223363,-2.1272351416910373,-2.222663653141186,-2.302654052382528,-2.3661675561906863,,, +2.3046875,4,-2.412448796254398,-2.4410388313145504,-2.45178297127745,-2.444833276425483,0.7816769419384283,0.7262084407253122,0.6087389702589113,0.4392669898648579,0.23146822070162665,0.0017353157707933194,-0.2319720407582313,-0.4513864022765789,-0.6392133670782028,-0.7803445927443373,,, +2.3125,4,-0.8629184132745602,-0.8791540817079943,-0.8259014467334524,-0.7048677154517115,-0.5225054722809658,-0.2895697457355648,-0.02037499324922576,0.2681961999856481,0.5578635982429854,0.8302173639056789,1.0679952686634098,1.2562800191762518,1.3835332194656638,1.4423938837667682,,, +2.3203125,4,1.4301858318257403,1.3490985987434956,1.2060292578693868,1.0120962003594804,0.7818587899895701,0.5322973215056049,0.2816244250001924,0.04801081199682655,2.059028538759002,1.6354328963492322,1.190513612949488,0.7858253629971848,0.4761480208798126,0.3010027137737875,,, +2.328125,4,0.27854642987950395,0.4027958647194565,0.6446126334995734,0.9562961180650862,1.2790683034601351,1.5522845125275966,1.7229351268316653,1.7539580585960948,1.6300669707344966,1.3601871794782705,0.9761195490210436,0.5276402028111419,0.0747990230085161,-0.321383778898758,,, +2.3359375,4,-0.6083742191147057,-0.7502615638608829,-0.7333086671971987,-0.5680513510871903,-0.28762004498862404,0.057454710165052415,0.4071436484640801,0.7012962157191757,0.8890333315865793,0.9366923841724056,0.8330868810513489,0.591261457028816,-1.6244991150252566,-1.9541909430675828,,, +2.34375,4,-2.062612934687612,-1.8932115382888608,-1.463812200489349,-0.8619273273344513,-0.22097862320275166,0.3160512696704073,0.6355777631886529,0.684308472102351,0.4836074464016968,0.1233948194562804,-0.2627440361731292,-0.5344158316983887,-0.5831395059643809,-0.36231501728383375,,, +2.3515625,4,0.0997748588489219,0.7074951572982758,1.3238598000031292,1.807878846515446,2.0530178769248923,2.0162305274752645,1.7296086644532949,1.2914585018090103,0.8392495239425529,0.5118510098074269,0.4114067078786956,0.575297183476349,0.965874427064908,1.4807822614280823,,, +2.359375,4,-2.4206456880857194,-2.3799718411184854,-2.323845701707457,-2.253565264539335,-2.170669629970585,-2.076911862671249,-1.9742281071021088,-1.8647035007210413,-1.7505354818836714,-1.6339951350222477,-1.5173872500486474,-1.4030097954422782,-1.293113514745819,-1.1898623540286324,,, +2.3671875,4,-1.0952954133271795,-1.0112910883815898,-0.9395340306361962,-0.8814855041197736,-0.8383576583398844,-0.8110921677551345,-0.8003436119261681,-0.8064678874363045,-0.8295158545628153,-0.8692323300175249,-0.9250604434630504,-0.9961512815889412,-1.0813786509439631,-1.1793587010888662,,, +2.375,4,-1.2884740645276411,-1.4069020907823813,-1.5326466802876682,-1.6635731607426472,-0.15168576849913407,-0.3030997202241452,-0.3953626983409645,-0.4218645194344664,-0.3807168144497145,-0.2748870856317154,-0.11199381306329126,0.09622310673487212,0.33471966676311304,0.5861958105348022,,, +2.3828125,4,0.8323011664884166,1.0549143783155401,1.2374068208039777,1.3658025788161672,1.429753800092839,1.4232634063184966,1.3451047635663147,1.1989090444071582,0.9929141860659354,0.7393929461858566,0.4537999345049028,0.1536970946685996,-0.14246744099445174,-0.4166419768958855,,, +2.390625,4,-0.6524259264966917,-0.8362090481742023,-0.9581158117626174,-1.0126890524210737,-0.9992652494577028,-0.9220152723377758,-0.7896477647415217,-0.6147958634315072,0.24646882603681475,-0.1493162626228722,-0.5354916027292995,-0.8522698692907672,-1.049997999710457,-1.0969020316110796,,, +2.3984375,4,-0.9840510337279964,-0.7267668868793726,-0.3622602297330119,0.056139340511121134,0.4672602783337367,0.8115842834333763,1.0404809286334928,1.1237435738405352,1.0542530165310269,0.8490427134814745,0.5465998955917194,0.20082318880948707,-0.12742186867048538,-0.379833873408393,,, +2.40625,4,-0.5098083826653504,-0.4897497528523999,-0.31542284769900103,-0.006666525995553729,0.3956425109816272,0.8359029062461338,1.2523958453320716,1.5868459360639329,1.7934468947377458,1.845946517039165,1.7416876814493478,1.5019762382528483,2.426912489650401,2.24236136510956,,, +2.4140625,4,1.8186760280906629,1.2624641197398212,0.7146918688482058,0.31221283396018296,0.1504385921531648,0.2573805057669243,0.5861751088947245,1.0281397487243709,1.4427783067573223,1.6965112520392407,1.6995131555120693,1.4305594568973985,0.9430705736125128,0.3506946994962432,,, +2.421875,4,-0.20362149398171026,-0.5865995175942158,-0.7109554769861992,-0.5591321514337111,-0.18793427268157992,0.2872017273598339,0.7239907906419409,0.9924229769429708,1.0105040355338248,0.7668163662381241,0.3237162546250885,-0.19970952278448634,-0.6602570772950875,-0.9298506544911264,,, +2.4296875,4,-1.7974455952839468,-1.931965869258764,-2.0648138712291604,-2.1936880646785437,-2.3163457400439893,-2.430642242294331,-2.534568487208768,-2.626286109470607,-2.7041596271569786,-2.7667850594422614,-2.8130144964355064,-2.841976190946349,-2.8530898203807267,-2.8460766515364067,,, +2.4375,4,-2.8209644303139108,-2.778086910722385,-2.718078031421777,-2.641860841761312,-2.5506313712062925,-2.445837724583852,-2.329154769170178,-2.202454856824657,-2.0677750938008668,-1.9272817313087616,-1.7832323003171322,-1.6379361535789194,-1.4937141057480885,-1.3528578782479659,,, +2.4453125,4,-1.2175900589636357,-1.0900252778163737,-0.9721332779830428,-0.8657045293279334,-0.4131300313032119,-0.2022588834321604,-0.0004946693389771828,0.17443048691148538,0.30660805292669624,0.3830695340989127,0.3946980303635799,0.33687132162857336,0.2097916209904616,0.01847898426810035,,, +2.453125,4,-0.2275711814949793,-0.5150426446200214,-0.8277192854504378,-1.1476082405133847,-1.4561869510831336,-1.7356871727960808,-1.9703264255129949,-2.147401027696518,-2.2581645116056297,-2.2984301815198505,-2.2688558133912773,-2.1748906593690247,-2.0263884689189124,-1.83691352766844,,, +2.4609375,4,-1.622788121607727,-1.4019478651202393,-1.1926847291598697,-1.0123654364657453,-0.8762146079465327,-0.7962475285481665,-0.7804269669226975,-0.8321028586552026,1.1687187342124896,0.797853904438184,0.4506012380993085,0.1838899131530528,0.041459042270752144,0.04701559600918959,,, +2.46875,4,0.2005158583636114,0.4781497455118916,0.8360305596228292,1.217015589406136,1.5595953034591694,1.8074666680207945,1.9182995441618715,1.8703307807162104,1.665758946067632,1.3304109381997518,0.9097323660107378,0.4617261660544418,0.047939226717563344,-0.2760991952069476,,, +2.4765625,4,-0.4694981140573645,-0.5123419355303016,-0.4087571707485538,-0.18623125794048567,0.10871022376442624,0.4177944485161063,0.6801245328037775,0.8417138030964972,0.8639458856982862,0.7296426601369096,0.4457946954235931,0.04252861592553442,-0.17451016692505572,0.3930427993832389,,, +2.484375,4,0.9022731020243124,1.2269400513029711,1.292914748891635,1.098338586311209,0.7139594023073261,0.26355479596143844,-0.11019026609881732,-0.2849977562623677,-0.19272597134367367,0.1617322557460933,0.7015640491223148,1.2988603758146904,1.809444278250539,2.1121602349902258,,, +2.4921875,4,2.1418587489569463,1.907038170483616,1.4873106937230518,1.011388974432048,0.6216284330087847,0.4348448754466507,0.5101477579281908,0.8326064979583253,1.3172277130317558,1.8321544809800665,2.2347303551443227,2.4105448336332937,2.30475965700252,1.9371306987393888,,, +2.5,5,-0.7723189860990024,-0.6933185358793177,-0.6297836221501489,-0.5825144497380195,-0.552017102169661,-0.5384948139490796,-0.5418445505051853,-0.5616589556191723,-0.597233632153471,-0.647579628516243,-0.7114409121396486,-0.7873165239266772,-0.8734870256537962,-0.9680447771457324,,, +2.5078125,5,-1.06892751297764,-1.1739546306810904,-1.2808655549526742,-1.3873595060081183,-1.4911359756380234,-1.5899352021274953,-1.6815779352176763,-1.7640037947197609,-1.8353075510120083,-1.8937726920381872,-1.9379016889370448,-1.9664424302359629,-1.97841036163086,-1.9731059435655,,, +2.515625,5,-1.950127120808412,-1.9093765855632256,-1.8510637068116127,-1.7757010919810725,-0.9497739372253164,-1.1271879458067344,-1.3537734520335132,-1.615373163450838,-1.8952276160655983,-2.17514064837243,-2.436745396014249,-2.6627825318476024,-2.8383016215003503,-2.95170182512057,,, +2.5234375,5,-2.995539378112533,-2.9670455460908647,-2.8683189380142657,-2.7061787686766428,-2.4916893039806247,-2.2393886510590257,-1.9662756714479848,-1.6906256615375646,-1.4307173842986982,-1.2035602172214193,-1.023710172486237,-0.9022573472381784,-0.8460554066800825,-0.857246824200909,,, +2.53125,5,-0.933116977914396,-1.0662872700320072,-1.2452337936255735,-1.4550953691695798,-1.6787145938907837,-1.897839297565148,-2.094400612104925,-2.2517785191464257,-0.4315280454299959,-0.916762844185672,-1.3518049057154489,-1.6830251107086005,-1.8728305748318983,-1.9054618072688376,,, +2.5390625,5,-1.789389901849963,-1.5559406739109651,-1.2543603241928971,-0.9440914556419584,-0.6854627634012921,-0.5302427878467947,-0.5135292828843873,-0.6482377107763581,-0.9230475340603504,-1.3041263907868346,-1.7403637987647866,-2.171299390556232,-2.536510976366354,-2.785000338019656,,, +2.546875,5,-2.883114991801107,-2.8197721690585267,-2.6081714372685374,-2.283729276592936,-1.8985573565301703,-1.5133445732066784,-1.187907264707742,-0.9718794390323904,-0.8969930205407877,-0.9721504462128516,-1.182056999360726,-1.489625800521571,0.34034435061326873,0.07808887989124225,,, +2.5546875,5,0.08062575247513204,0.32361614555953955,0.7148014862314279,1.1194499834139888,1.397460526670428,1.4419533387457175,1.208769154436893,0.7287902741679175,0.09970474152574886,-0.5405311733435166,-1.0512611291760767,-1.3274333380971952,-1.3281456783289278,-1.0876101165772782,,, +2.5625,5,-0.7055335942061761,-0.3195538339223989,-0.06728668482939004,-0.048388723433654864,-0.2970345625482943,-0.7723538588675793,-1.3694506763896843,-1.947986721806214,-2.370496088171872,-2.539931865932619,-2.426155327892552,-2.0741087185735507,-1.5914324595871099,-1.1189210514935417,,, +2.5703125,5,-1.6840958410159428,-1.5773356458648218,-1.4567699786523658,-1.3239866978003516,-1.1807844815918636,-1.0291415717344266,-0.8711813740878018,-0.7091355187519675,-0.5453050261984159,-0.3820202592877039,-0.2216003622774888,-0.06631289690583925,0.08166561781648474,0.2202875712935154,,, +2.578125,5,0.34766986962286023,0.4621266631019141,0.5621986200415876,0.6466782344411703,0.7146307245238299,0.76541015633721,0.7986705102308609,0.8143714965727558,0.8127790190066494,0.7944602772732142,0.7602735954776674,0.7113531540437407,0.6490888928289285,0.5751019374272828,,, +2.5859375,5,0.4912159790754601,0.3994251094265559,0.301858673532735,0.2007437565860148,-2.35596661245318,-2.3965548394651144,-2.36746167868597,-2.2673646817361446,-2.0997993424249777,-1.872919383372439,-1.5989351607438251,-1.293269333143051,-0.973488656455744,-0.658086377588773,,, +2.59375,5,-0.36520011801997343,-0.1113546363563852,0.08968287596656244,0.22785515913750176,0.2975085154334133,0.29777935395013244,0.2326467119352741,0.11064710754541096,-0.05572837451039631,-0.25091270417553513,-0.4573559480596126,-0.6567564941619342,-0.8313445855081124,-0.9651286414911138,,, +2.6015625,5,-1.0450174409422854,-1.0617398978406438,-1.0104982754504,-0.8913092732641685,-0.7090091871882036,-0.4729227691181594,-0.19621886386722914,0.10500225604624493,-1.8417807444978327,-2.177753405605265,-2.438581466333911,-2.576329063682559,-2.5615927437910373,-2.3881237255997254,,, +2.609375,5,-2.073846309981952,-1.6581135769218651,-1.195627563545471,-0.7479706297922086,-0.3740667792664858,-0.12105835994491387,-0.017018865263844773,-0.06663656870776669,-0.25054099844037137,-0.5283768648850933,-0.8451463680332618,-1.1398317448243145,-1.3549547599797191,-1.4455839137440578,,, +2.6171875,5,-1.3863861664085668,-1.175624563193013,-0.8354788434635092,-0.4086388424990641,0.04829896279345619,0.4736034733855603,0.8099834831138789,1.01347361192121,1.060247814723848,0.9502993976847708,0.7074145141566616,0.3754434043396785,-0.8776538361614891,-1.2653744640402418,,, +2.625,5,-1.7555281269477019,-2.20676363062993,-2.4860747345547107,-2.5053835058448044,-2.2458281604424752,-1.7630974028166695,-1.1723477113362275,-0.6168355827066747,-0.22885987009723896,-0.09371681928650266,-0.2265446320993197,-0.5684016875265566,-1.0026511355463583,-1.3871591839666837,,, +2.6328125,5,-1.5934803324760085,-1.542287908026866,-1.225337338186636,-0.7079406232653719,-0.11127183442119276,0.4206487352914915,0.7602449116736271,0.8311828432576627,0.6291414605387718,0.2228640133928163,-0.26479629177872616,-0.6906406939733368,-0.9304446568744926,-0.9130559961527368,,, +2.640625,5,0.09836596139786227,-0.0029708364717864755,-0.1009850511287954,-0.19345755593304104,-0.2782707567731981,-0.3534458847385323,-0.41717785507617466,-0.4678670819411275,-0.504147691749066,-0.524911641005956,-0.5293283162023124,-0.5168592724698513,-0.4872678528216565,-0.4406235194384816,,, +2.6484375,5,-0.37730082105858975,-0.2979730144516481,-0.20360045156663964,-0.09541393559815237,0.025106662687523932,0.1562581540305119,0.2961436943837416,0.4427058439226717,0.5937624425816002,0.7470446740175911,0.9002366515826931,1.0510158332323218,1.1970935577783677,1.3362549927710234,,, +2.65625,5,1.4663977945899158,1.5855688038733369,1.6919981338124008,1.7841300544833525,0.4128262271212696,0.7087686994847484,0.9750594652255756,1.1958770746547351,1.3584478566615628,1.453932714175428,1.4780398641420087,1.431320801452054,1.3191288553067588,1.1512432342396122,,, +2.6640625,5,0.9411847817694264,0.7052711618656133,0.4614773629850442,0.2281809843860957,0.022879802100583047,-0.13902895585263875,-0.2453224994337331,-0.28780464624060464,-0.2628768474569535,-0.17178825255824126,-0.02054737770856685,0.18049845895441569,0.41738660347636575,0.6735149789382981,,, +2.671875,5,0.9308023855662888,1.1709522699848909,1.3767318295109492,1.533177247294035,1.6286410045176805,1.6556082276522242,1.6112251339944692,1.4975027143797848,0.01145026962974277,-0.32319117786495233,-0.5723694983439228,-0.6939837275017565,-0.6665053851987185,-0.4923322072032008,,, +2.6796875,5,-0.1974112446681856,0.17280993736837605,0.5604732923922542,0.9043371773334296,1.1493340163829933,1.2551699787172028,1.2026270973323916,0.9965860945711548,0.6652989293815532,0.25602419005277977,-0.17229505379401705,-0.5581706885501319,-0.8471029933095984,-1.0000234310820821,,, +2.6875,5,-0.9993320348734188,-0.8515892935936891,-0.5864435307644357,-0.25196111816222344,0.09291285016237402,0.3875888477122679,0.5793235909615002,0.6314885872878834,0.5293283952340829,0.2823114290649328,-0.07729312811154304,-0.4993909302967815,0.3268928832922636,0.7517019097283134,,, +2.6953125,5,0.9682800409253296,0.9103325543624944,0.5849676511370141,0.07086671066880909,-0.5031433360902917,-0.9932441549388861,-1.2798734491167572,-1.3003107595954295,-1.065672577750886,-0.6576607764807008,-0.2059574700932216,0.1475362752653141,0.2878146935603429,0.1585123595020761,,, +2.703125,5,-0.22242249671233685,-0.7674241380108427,-1.3430899919823545,-1.806530370835555,-2.044326907799197,-2.0034243296479803,-1.705490919876189,-1.2408136498382842,-0.7434027592767319,-0.35413034937219434,-0.1820069115408537,-0.2742098809169532,-0.6030794552968926,-1.07364651219103,,, +2.7109375,5,1.8606501324917508,1.920508150766349,1.962936407228293,1.9874630719733528,1.9939203691266385,1.982447440146469,1.9534878384779448,1.9077816994588093,1.8463527226124719,1.7704901942956448,1.6817263655065855,1.5818095809890889,1.4726736301578056,1.3564038565225427,,, +2.71875,5,1.2352006190462832,1.1113407452331467,0.9871376509067806,0.8649008249807646,0.7468953886382559,0.6353024370339081,0.5321808579228963,0.43943129576073936,0.35876289224529123,0.2916633856540397,0.23937309251553066,0.20286322716911154,0.18281893880970826,0.17962736300696125,,, +2.7265625,5,0.19337089688230125,0.22382581565842008,0.2704662547652684,0.33247348773300034,1.3211814380730638,1.0932664022467051,0.8282653288313169,0.5431825323799289,0.2563389989979549,-0.013899158262646594,-0.25039521338448045,-0.4384304499293133,-0.5667240211903751,-0.6282129456698223,,, +2.734375,5,-0.6205378624289266,-0.5462006894178504,-0.412383207367132,-0.2304392367453065,-0.015095836830347237,0.21658075314039246,0.4463823054212647,0.6562354267087841,0.8294689585430176,0.9519835582213336,1.0132418846448374,1.0070103234284524,0.9318005117337964,0.7909798574072127,,, +2.7421875,5,0.5925433293289559,0.3485624167958438,0.07434966810864588,-0.21260294754374773,-0.4938378384016245,-0.7512131211072988,-0.9681621470668912,-1.1308434069412725,-0.9238158916207933,-1.2896540572546642,-1.544685938598336,-1.653476867423715,-1.6028554902653855,-1.4039273224734914,,, +2.75,5,-1.0903099500905944,-0.7128649509089205,-0.3317472444260178,-0.0070103879807092975,0.2107687625331014,0.2883856437328283,0.21519394182628715,0.004774089547227578,-0.3071756399537822,-0.6683970140880844,-1.0182130515974754,-1.2969845297831912,-1.4554088694586875,-1.4622130084246123,,, +2.7578125,5,-1.30904199824646,-1.0117818195150254,-0.6081102799725038,-0.1516573363052871,0.2963157383977546,0.6764224848880085,0.9403622301166352,1.0584014350466555,1.0239603649235172,0.8545909047657109,0.5891934543171501,0.28190663202190963,-1.9913265079896048,-1.8090116299612948,,, +2.765625,5,-1.3767233768878029,-0.7935665020758244,-0.19780226076290144,0.2709223608503021,0.5097058867528672,0.4804346479615098,0.22005196477925376,-0.16975872375192758,-0.5506475615210726,-0.7857328466444506,-0.7773430196563561,-0.4940201197787412,0.020618203231182075,0.6595890626740546,,, +2.7734375,5,1.2816197959762343,1.7496219805241973,1.9680216043234984,1.9087164597428719,1.6185487202732656,1.2062467293039991,0.8124168195330781,0.5708113583861458,0.5714900213372035,0.835972284049083,1.3111925423875486,1.883915871381988,2.411664613341323,2.7616806785344146,,, +2.78125,5,0.4087503373702103,0.49794046783982,0.5984522197764182,0.7084865710393593,0.8260687334513654,0.9490828322047652,1.0753090606376468,1.2024626597337242,1.3282340397492114,1.450329341365514,1.5665107260697884,1.67463569020391,1.7726947142133191,1.858846587778236,,, +2.7890625,5,1.9314507921993609,1.9890963729369875,2.0306267966568465,2.055160357443598,2.0621057747761693,2.0511727100471413,2.022377017383364,1.9760406367242955,1.9127861309264689,1.833525962443048,1.7394466972354912,1.6319884123962294,1.5128196679415409,1.3838084809046118,,, +2.796875,5,1.2469898098545171,1.1045301190695131,0.9586896427252508,0.8117830097293228,-1.2291006397678164,-1.2571662076931722,-1.2140586996174674,-1.1036470488306298,-0.9343767041218968,-0.7186769592678678,-0.4720907789566297,-0.21218780970790285,0.042663617183217206,0.27457985145614383,,, +2.8046875,5,0.4674111589509081,0.6078697072534416,0.6864576391354178,0.6981305123211262,0.6426498386647692,0.5246001367264153,0.3530693071004358,0.14101461825149192,-0.09564148518469913,-0.3391226985108081,-0.5710398000966727,-0.773674684012623,-0.9312179390651468,-1.0308736696879843,,, +2.8125,5,-1.0637545109849524,-1.0255044198665118,-0.9166058064844635,-0.742349581364398,-0.5124701988533067,-0.2404711376478829,0.0573121547280976,0.3628465198388645,-0.006378244041551295,-0.21755596729865712,-0.30541355098429923,-0.2428850277364969,-0.026324680411207942,0.32386716468023113,,, +2.8203125,5,0.7663635455735665,1.2452899029238185,1.6988694728064229,2.0689887591761247,2.3101935000910543,2.3967142401490107,2.326427514088596,2.121135933082205,1.823123806037351,1.4885250224236497,1.1785364180873152,0.9498454095601656,0.8457630497093586,0.8894437689420363,,, +2.828125,5,1.0802480373662249,1.393814639374834,1.7858314421826502,2.1989174609578366,2.571544402758488,2.8476081918117915,2.98515972013156,2.962935001727612,2.783667642122547,2.473667685118736,2.0787324090794783,1.6570259422087883,2.231600986968433,1.7039198586744784,,, +2.8359375,5,1.2113165730579012,0.8844763005665583,0.8060700935037624,0.9881894630715068,1.3691451581286702,1.8305064323358893,2.229709600203474,2.439297443514424,2.3820335613350263,2.0522661742217188,1.5176843840701248,0.9009836262219528,0.34646325138122835,-0.01929124201869969,,, +2.84375,5,-0.12186763326590212,0.04081407430116269,0.3981659817992046,0.8265097400817805,1.1831993968618468,1.3459355230149506,1.2464937910435618,0.8896220976404219,0.35192528477322954,-0.23895856542458385,-0.7391846607735424,-1.0279873468328646,-1.040659434905797,-0.7861874242645537,,, +2.8515625,5,0.6661389185390278,0.5240595679297355,0.3877805539560791,0.25943193518208285,0.14100114779897588,0.03429841985849846,-0.059074709913309875,-0.13775321761644566,-0.2006322768993387,-0.2468863843513879,-0.2759835928124794,-0.2876946035079575,-0.2820965579389708,-0.2595714632661894,,, +2.859375,5,-0.2207992788919257,-0.1667457854289276,-0.09864544860335267,-0.017979578279249453,0.07354983482657973,0.17405014648753253,0.281471424454967,0.3936425677299339,0.5083095470368404,0.6231750967769587,0.7359391633248978,0.8443394012859302,0.9461910084961292,1.039425202123141,,, +2.8671875,5,1.122125662022497,1.1925623030981654,1.2492217851842091,1.2908342260937729,0.6576534640900369,0.9240923316719656,1.1465848070591496,1.3126953712902076,1.4139923816010986,1.4466297423312668,1.4116086195695694,1.314700964024839,1.1660401902143782,0.9794075706938256,,, +2.875,5,0.7712641231616173,0.5595955161698938,0.3626505582614149,0.19766125635265408,0.07963371461817093,0.020294205363218243,0.027263922852535986,0.10351998436235488,0.24718028183383545,0.4516272043805397,0.7059616213237587,0.9957554852390144,1.3040505906574278,1.6125338586958875,,, +2.8828125,5,1.902807207983146,2.157663476209269,2.362279434431236,2.505242717339044,2.5793410739130707,2.582058916674808,2.515746558315437,2.3874503485859218,1.2700366679968582,0.9730207659151576,0.8064202496526302,0.7895920626645692,0.9178248127207824,1.1631076420541329,,, +2.890625,5,1.4785312976806153,1.8056357159338523,2.0835594849532235,2.2585658827786737,2.2924615221408065,2.1685961036873853,1.8945085240910613,1.5008069243377222,1.0364568395000089,0.5612110622065112,0.13636002041648487,-0.18475694439865087,-0.3650017732994568,-0.38916464192708,,, +2.8984375,5,-0.26627595760167605,-0.0281435849476937,0.27565658021917594,0.5855561650806038,0.841324646602257,0.9915009400324186,1.0014569761655892,0.8588370806659782,0.5755257139495521,0.18583686998202906,-0.25879305627215715,-0.6977825039579757,0.5685098797173026,0.7798971961183458,,, +2.90625,5,0.7289380155945785,0.4299364698356606,-0.0327469940741931,-0.5278904450324793,-0.9134690405576168,-1.0756938289986542,-0.9603302961267798,-0.5877118896591627,-0.047332312835187226,0.5265029214666268,0.991294227650288,1.2352009977254796,1.2074834531554732,0.9321921234296996,,, +2.9140625,5,0.5013551605278543,0.04953276818477748,-0.28328523835679353,-0.3902679260918496,-0.22723971048958924,0.1750013974684239,0.7189218639543558,1.2667911790941817,1.678249327604575,1.8486088245487275,1.7373955074982912,1.3793073973576009,0.8745894630296784,0.3614634388895783,,, +2.921875,5,1.3163956499623792,1.3251857776900438,1.3167808478469043,1.2910612434241044,1.2482137907631667,1.1887286902875522,1.1133911326589012,1.023267747039271,0.91968811863262,0.8042216990159019,0.678650513445074,0.5449381429170528,0.4051955239988672,0.26164416515961475,,, +2.9296875,5,0.11657742357708133,-0.027679479643490795,-0.16881000581029926,-0.30454669668241235,-0.4327107169333306,-0.5512498487519258,-0.6582742733898668,-0.7520895132145994,-0.8312259575436224,-0.8944644553499707,-0.9408575267970088,-0.9697458222703752,-0.9807695407895888,-0.9738746079395922,,, +2.9375,5,-0.9493135052204024,-0.9076407363636424,-0.8497030100684847,-0.7766243111219198,2.208415570350787,1.993296772735952,1.7591306200940169,1.5241428954657843,1.3064728615415755,1.1229039444261757,0.9876892639429228,0.9115539195840644,0.9009436147836652,0.9575720235104496,,, +2.9453125,5,1.0782984701904923,1.2553444594119898,1.4768339620222095,1.7276197868759235,1.990338417038476,2.24661975688204,2.478367433270725,2.6690203732466853,2.8047076854468442,2.8752163119246834,2.8747039723295624,2.8021076831428844,2.661219362360048,2.460423244375633,,, +2.953125,5,2.2121134120625765,1.9318320586759667,1.6371885658128271,1.3466347672682804,1.0781817964791454,0.8481479880508029,0.6700251376356642,0.5535421702098576,-1.0708097558244811,-1.3271809928571432,-1.4337024022375555,-1.379830329247475,-1.1792974030039505,-0.867961431350613,,, +2.9609375,5,-0.4982121632606485,-0.13080712653762722,0.17459183732650962,0.3687073670628603,0.4203139571760509,0.32108973327532675,0.0868970104281217,-0.24470772620865805,-0.6203464722215422,-0.9791601582369616,-1.2623176879204412,-1.4222123092614811,-1.4299127515114038,-1.2797083738523416,,, +2.96875,5,-0.9900401801668336,-0.6006724611138601,-0.16654535444923269,0.25073443210950275,0.5924396323453655,0.8118185957951881,0.8813251247976629,0.7968561717637791,0.5783376397340091,0.26656733404040656,-0.08319291757872796,-0.4098776253526082,-0.06309988798915978,0.2736439729291854,,, +2.9765625,5,0.7311094684497802,1.169726794824873,1.4528133730029074,1.4841131496611988,1.2342773345878,0.7490281673918932,0.13676724993026598,-0.4609765707646607,-0.9081617883365276,-1.1113297160331583,-1.0450157663610609,-0.7585138539139569,-0.3621419031272264,0.003225332821539806,,, +2.984375,5,0.20500393366388905,0.1554798524580172,-0.1639080418369072,-0.6972383482532718,-1.3291938034766335,-1.9164315814652173,-2.326641669293948,-2.47459063149964,-2.3452742079373525,-1.9978351721457608,-1.549174425091853,-1.1417486409216506,-0.9043816251071096,-0.916831115977745,,, +2.9921875,5,-0.689786121368937,-0.590803136922482,-0.4814949068587866,-0.3638538900572811,-0.2400104895581372,-0.1121956767306406,0.017298140253174124,0.1461573184092048,0.27208754842210625,0.3928540792299861,0.5063208943513887,0.6104881539492122,0.7035272469991455,0.7838128397774652,,, +3.0,6,0.8499513594824356,0.9008054142269741,0.9355137217964248,0.9535061982113656,0.9545139418886732,0.9385739385761416,0.9060284046775692,0.8575187804702975,0.7939744784001067,0.7165965834804282,0.6268367912141876,0.5263719518499838,0.4170746667218983,0.3009804515509777,,, +3.0078125,6,0.18025204170426248,0.05714146445310842,-0.06604945762482288,-0.18700948047973925,0.5039915001890245,0.5218650478191792,0.6028252823162018,0.7380132991300671,0.914672435656798,1.1170439256616815,1.3274721220164498,1.527642202991959,1.699864038372913,1.828312672357137,,, +3.015625,6,1.9001389050484776,1.90637251241952,1.8425551042720587,1.709058472625558,1.5110662144617382,1.258219893481231,0.9639543981104872,0.6445688261866345,0.31809766921430765,0.0030609947702271434,-0.2828192365476624,-0.5238472216618063,-0.7074401144613827,-0.8249978053516882,,, +3.0234375,6,-0.8724950454578733,-0.8507546416448881,-0.765382688245521,-0.6263703683879472,-0.4473901086847518,-0.2448351844275578,-0.03666976207635103,0.1588304157531955,-0.6561812935163289,-0.7775354975775665,-0.749100876048973,-0.5696847238058803,-0.261973735805029,0.130954606144949,,, +3.03125,6,0.5522988793635415,0.9403406365022962,1.2380198891717653,1.4017879335581274,1.408358835094639,1.2583081678875006,0.9759586440717576,0.6055705866965864,0.20443072106013707,-0.166084156745389,-0.4500766717117074,-0.6058409621538319,-0.6123603774545062,-0.4725787109911394,,, +3.0390625,6,-0.21293545784253232,0.12076249426990962,0.4704896916087996,0.7750579271861991,0.9796684647302872,1.0444727603101185,0.950808180384574,0.7041373278328502,0.33323299991273864,-0.11426445250157635,-0.5792255937262045,-1.000197174040634,-2.190491395782689,-2.6581651958163923,,, +3.046875,6,-2.928674019886325,-2.9263649878225215,-2.6476181048668264,-2.1618889150760072,-1.5927454711607911,-1.0840961371760451,-0.7608632941226645,-0.6948800433318193,-0.8853553588956778,-1.259260200544694,-1.6915272087386826,-2.0395261576074173,-2.182364662309761,-2.0542410743918498,,, +3.0546875,6,-1.6627065275952375,-1.0868289761345515,-0.4557602778919174,0.0864217184079511,0.4199625242064049,0.4820168927433146,0.2836425514972416,-0.09345360313897938,-0.5195230631595763,-0.8525390364885252,-0.9773120655631886,-0.8372358164839749,-0.4499609040078744,0.09730038824366363,,, +3.0625,6,-0.3034584826795553,-0.4131874697874672,-0.5140973385086463,-0.6042357218006236,-0.6818312697393809,-0.7453247658326909,-0.7933965338777347,-0.8249896554112568,-0.8393285911534419,-0.8359328803189376,-0.81462567785311,-0.7755369800353691,-0.7191014818958328,-0.6460511038849692,,, +3.0703125,6,-0.5574023185748586,-0.4544384992184998,-0.3386875991588846,-0.21189555283309205,-0.07599586402835506,0.06692408619274925,0.2146594220471476,0.3649262091050465,0.5154012709683291,0.6637626894673021,0.8077302793213783,0.9451053286613844,1.0738089096650336,1.191918088598201,,, +3.078125,6,1.297699401337585,1.3896390083320695,1.466469001106821,1.5271893998000827,0.3243588721954497,0.4447914336471047,0.5082468603193044,0.5069210956140426,0.437636946946394,0.3020708550956693,0.10664092742499044,-0.13793596790039764,-0.4173871714734659,-0.7148754656685349,,, +3.0859375,6,-1.0121694579047125,-1.290911507476584,-1.533894786510661,-1.7262604278895142,-1.8565312847921325,-1.9174102193025169,-1.9062872568667093,-1.8254202442786776,-1.6817764156898791,-1.4865459162749557,-1.2543612077906532,-1.0022767892281566,-0.7485803789186658,-0.5115184563530059,,, +3.09375,6,-0.3080250331277209,-0.15254229643165984,-0.056015361121733435,-0.025131224490415386,-0.06185498801479794,-0.1632956802350659,-0.3219110300200213,-0.5260369026516201,-1.3229268867381898,-1.5087643169303182,-1.540629838470561,-1.4256220308004457,-1.193857764962003,-0.8937258974641226,,, +3.1015625,6,-0.5842941165564413,-0.32605190189894473,-0.17143172116215044,-0.1565851297902876,-0.29569498278994394,-0.5787099534951737,-0.97285450929222,-1.427679442856497,-1.8828665916772267,-2.2775723922637354,-2.5598552253537337,-2.6947184477296258,-2.669516609203658,-2.495883038731341,,, +3.109375,6,-2.2078787850950565,-1.8566514268070555,-1.5024358563566054,-1.2051431286791183,-1.0150033625304706,-0.9647202459965898,-1.0643592379447004,-1.299765749953385,-1.6347597599913868,-2.0167650893671887,-2.3849965866893204,-2.6799300340202707,1.3608217321303706,1.3104101833392412,,, +3.1171875,6,1.001371892678586,0.5245898457020237,0.014685079856409322,-0.3868518048265992,-0.5703900319925812,-0.4881349017776668,-0.16713604927803832,0.29823654274622435,0.7722855731586896,1.1153233072756223,1.222117959753261,1.0509109905917422,0.6350508264046266,0.07405271853115603,,, +3.125,6,-0.493466971670899,-0.9275661761842202,-1.1251111868983108,-1.047820104742236,-0.7325319500485328,-0.2808891295757123,0.1687368792962597,0.4793802012470567,0.553221979996046,0.3585927808097005,-0.06116644621420009,-0.5994151329238531,-1.1152876607037359,-1.472164761396228,,, +3.1328125,6,1.5710854566754269,1.5977399627453759,1.6070403421388468,1.5991804101129692,1.5746567640502058,1.5342598707593829,1.479060006267248,1.4103882944220552,1.3298131764496062,1.2391127236086716,1.1402432778796656,1.0353049699168135,0.92650471817575,0.8161173572306045,,, +3.140625,6,0.706445576056111,0.5997793678862826,0.4983557018138549,0.4043191224145061,0.3196839674272373,0.24629886519367195,0.18581413363861327,0.1396526517687494,0.1089847138641542,0.09470730679820027,0.09742817347471766,0.1174549415649092,0.15478950803365665,0.2091277779159728,,, +3.1484375,6,0.27986476205094235,0.3661049446450895,0.4666777392618671,0.5801577627357578,-0.7607044706706411,-1.0086881260693557,-1.251711049408558,-1.4717243568703935,-1.652170614800709,-1.77914360080141,-1.8423634249162693,-1.8358989994334656,-1.7585874635014065,-1.6141213005718735,,, +3.15625,6,-1.4107970590723564,-1.1609431837733146,-0.8800668415686412,-0.5857792204516288,-0.2965742279321354,-0.03054573779004888,0.1958671809531921,0.3690195704428091,0.4790049952511499,0.5203392187316096,0.4923354866600258,0.3991452655952121,0.2494616122931679,0.05590587627281324,,, +3.1640625,6,-0.1658594802645377,-0.3982300623764772,-0.6228940561353324,-0.8221159730912541,-0.9799800895666542,-1.0835068557832643,-1.1235644083579288,-1.0955116081444063,-2.8525797785490954,-2.872139019790022,-2.7307926864213865,-2.4449532002807124,-2.052726558911848,-1.608003295991352,,, +3.171875,6,-1.1720945527732032,-0.8042158370208876,-0.5523005068434944,-0.4455736435353771,-0.4900427716725858,-0.6676075554488006,-0.9389269117796328,-1.2495967305990778,-1.5386757368542203,-1.7482312831774809,-1.8324179939061669,-1.764674934661631,-1.5419200253837304,-1.1850881054627702,,, +3.1796875,6,-0.7359285521603185,-0.2505609463974369,0.20920776867955432,0.5854525300129021,0.8330956267224279,0.9268722666217016,0.8652115915312463,0.6704289233186442,0.3851995589018297,0.06586359050394403,-0.226395199631078,-0.4351222095734847,-0.9834341810656628,-0.4458882827633591,,, +3.1875,6,0.07507381266229707,0.4449856221178049,0.5730546523318223,0.4370142636602148,0.08917254280955134,-0.3579992139940119,-0.7627880251920223,-0.9931952793543564,-0.9632496329782688,-0.6567232920450549,-0.13175040417711065,0.4949197101056738,1.0797204219592371,1.4914036935648909,,, +3.1953125,6,1.6467899273939088,1.533335789116714,1.2123369013187208,0.801889762568555,0.4442846724452826,0.2667684545284924,0.3464329061993129,0.6888541437091321,1.226339261073336,1.8362628835160584,2.3744700786798045,2.7145927538708614,2.782505842942096,2.5764814924376567,,, +3.203125,6,0.7048895721459628,0.8390164318374759,0.9805126069087986,1.1272186178373722,1.2768788390636936,1.4271807833094892,1.5757953838897203,1.7204175697993107,1.858806423229439,1.9888242164783951,2.108473644840493,2.215932603645914,2.3095859006218697,2.3880533484078783,,, +3.2109375,6,2.4502137454390307,2.495224325402916,2.522535334820292,2.5318994836026816,2.5233761032127777,2.4973299397204527,2.4544246029881656,2.395610786787556,2.3221094662082096,2.2353903666641717,2.137146081594941,2.0292622921479606,1.9137846103788327,1.7928826266274216,,, +3.21875,6,1.6688117906785855,1.5438737942437504,1.4203761485407005,1.300591664836852,-0.9995277473727446,-0.8406059200049776,-0.6282105035100499,-0.37562262332620827,-0.09901922975321947,0.18365000637987366,0.4539096736139477,0.6940425308211758,0.8883208287750719,1.0240991884436448,,, +3.2265625,6,1.0926928355263072,1.0899799578476823,1.0166861892845542,0.8783313894901952,0.6848424371066464,0.4498590433250423,0.1897809985306499,-0.077376705332696,-0.3332410374175059,-0.5603627072103942,-0.7434331761404945,-0.8703520346293605,-0.9330703129672862,-0.9281509200777788,,, +3.234375,6,-0.8570071306257651,-0.7258024924583636,-0.5450191374180196,-0.32872460266287684,-0.09358829424777884,0.14228381625426592,0.3606149953436994,0.5442357756994882,-0.5174254152347022,-0.4506932491144368,-0.2361504336038007,0.1013022355242128,0.5169393475720595,0.9531538204198826,,, +3.2421875,6,1.3484100377804382,1.64681277077732,1.8068015424533592,1.8076162900215729,1.6525272908909692,1.3683262804335,1.0011580074901996,0.6093414487511954,0.25429875886505793,-0.008995257203506246,-0.1405557019251984,-0.1215917415871376,0.04259383290688257,0.3234611086396239,,, +3.25,6,0.673712040431825,1.0346941135205017,1.345575316194664,1.5528611541073627,1.6187711498683792,1.5271699005930637,1.286128645735099,0.9267181038005828,0.498220328146331,0.06050508200300131,-0.3252421313152032,-0.6059965124370568,1.2563684948307938,1.020194795781773,,, +3.2578125,6,1.0400606751726782,1.3118500697469884,1.7596228261817712,2.2564344451888605,2.659157488299856,2.8477608820041382,2.7582813724607407,2.4004499749099684,1.8551416721485272,1.252346271079648,0.7356967147628292,0.4232751791649322,0.3754372779549643,0.5784711068268718,,, +3.265625,6,0.9485678810339668,1.3550140148781948,1.6562463823413351,1.7388870154110774,1.5490568705442214,1.1073843373328809,0.5035929330092497,-0.12785063352561488,-0.6443560324988855,-0.93406228534558,-0.9462777296683128,-0.7051662361850856,-0.30293053321803953,0.12563739819219,,, +3.2734375,6,1.1867185475208155,1.0808417985368135,0.9848966090519596,0.9006343794288927,0.8295919625491593,0.7730646690917495,0.7320835074948037,0.7073970571769109,0.6994582924639132,0.7084165879763565,0.7341150455035765,0.776093189207611,0.8335949819984398,0.905582022744806,,, +3.28125,6,0.9907516932664604,1.0875599373790692,1.194248273153426,1.3088745654245106,1.4293470197392415,1.553460802523842,1.6789366462609436,1.8034607637075408,1.9247253722605768,2.0404691188880086,2.148516697784116,2.2468169670368554,2.333478896876024,2.4068047200364187,,, +3.2890625,6,2.4653197037562853,2.507798022085417,2.5332842754551588,2.5411102806770782,0.6782850798940055,0.7512506728802018,0.7557763798218358,0.6891797693449229,0.5536441917962168,0.3560717697152937,0.10760757999747196,-0.17713180451233718,-0.4810716308494432,-0.7858634910787914,,, +3.296875,6,-1.073158470177756,-1.3258801505838766,-1.5294087177599365,-1.6725936107250845,-1.7485241179645827,-1.75500419868313,-1.6946984349578709,-1.5749389536759455,-1.4072067990029389,-1.2063239378913695,-0.9894122597465341,-0.7746921796909381,-0.5802046398668477,-0.4225456449281263,,, +3.3046875,6,-0.3157015937866517,-0.27006664077169906,-0.2917106257572669,-0.3819486396949662,-0.537242257807719,-0.7494393442323584,-1.0063357219727715,-1.292519557032104,-0.7450991679464635,-0.7279133575338728,-0.56405108582929,-0.2858235230785112,0.05684310639569262,0.4042340122383707,,, +3.3125,6,0.6961954140257312,0.8815506957147721,0.9261162687017892,0.8180683872111961,0.5698247749686387,0.21614777193570744,-0.19123575750806507,-0.5916599652738359,-0.9249411604030512,-1.140727311805842,-1.2063198144830585,-1.1117493549144464,-0.8713153802974508,-0.5213494686189355,,, +3.3203125,6,-0.11455102344252938,0.28822242496582656,0.6274315930138655,0.8541225022954507,0.9375408567709732,0.8699078068353565,0.6676133180718764,0.3686413597090377,0.026628061558278158,-0.29752155963110866,-0.5451524191770072,-0.6690309585919195,0.36162072355931296,-0.04584017857000034,,, +3.328125,6,-0.5915485543799114,-1.1382914503078134,-1.5462629043579603,-1.7113596560221105,-1.5937142245729117,-1.2286451917955574,-0.7170232349369199,-0.1976927768524387,0.19049306190876056,0.34662003443465395,0.2352436611605581,-0.1040406827666513,-0.5676099354016834,-1.0163880931262188,,, +3.3359375,6,-1.3141503456797483,-1.3650567619489409,-1.14012674323375,-0.6853963811617839,-0.1095209588768705,0.44578174192295816,0.8443488711021201,0.9926689500037824,0.8652924373636859,0.5115942506747644,0.04203688818917185,-0.4022990057707577,-0.688563988881405,-0.7287198646690807,,, +3.34375,6,2.530906837347917,2.5026102645977657,2.4564635936868533,2.3930123955285407,2.3130953161554935,2.2178294858059813,2.1085910570677937,1.9869912128027645,1.854848063897284,1.7141549288491962,1.567045550552019,1.415756859265808,1.2625899337245838,1.1098698438806702,,, +3.3515625,6,0.9599050783642048,0.8149472670049209,0.6771519035959294,0.5485407565595442,0.4309666256203323,0.3260810615076768,0.2353056138254721,0.15980711044720486,0.10047740119872306,0.057917920420881626,0.032429338622456894,0.02400648432237129,0.03233862489718286,0.05681510141194501,,, +3.359375,6,0.0965362186622578,0.1503291996349415,0.21676892491570326,0.29420309378471576,-1.5904395906979143,-1.8816227439327675,-2.147956201226485,-2.372944584458913,-2.5428545639009257,-2.6476671023367606,-2.6817709421014726,-2.644348988213384,-2.5394306555106545,-2.375606540468443,,, +3.3671875,6,-2.165425324892171,-1.9245149769908003,-1.6704895402516065,-1.4217177514676351,-1.1960393636205198,-1.0095186952725868,-0.8753223314326115,-0.8027992425929955,-0.7968274725828085,-0.8574729563802483,-0.9799842624014568,-1.1551236278789545,-1.3698112043323931,-1.6080375881686435,,, +3.375,6,-1.851981002244752,-2.0832512224376982,-2.2841735041022107,-2.439022973162976,-2.5351234000248173,-2.5637337306989667,-2.5206605491094485,-2.406553755447892,-0.6407408096965312,-0.4551504179806312,-0.1312565572091528,0.2907278726378254,0.7555884121110636,1.2016582725772151,,, +3.3828125,6,1.5703709029816966,1.8153282999733085,1.9094729012817016,1.8492462851957845,1.6550872243992747,1.3681918103626955,1.044040568277912,0.7437010408512579,0.5242608002609057,0.4298812850211125,0.4848661572865165,0.6898240980220169,1.0215239750914744,1.4364652039997488,,, +3.390625,6,1.8776074500573623,2.283211725219033,2.5964160593174537,2.7740544977081703,2.7933460182675685,2.6554117159586887,2.385072600264383,2.0269596471119464,1.63854211412411,1.281160105494028,1.0104582015890011,0.86771023540934,0.4598607025020286,0.9410331791042,,, +3.3984375,6,1.2424500435148966,1.2795196457370148,1.037915324489146,0.5774850672733711,0.015854338333932627,-0.5037839363146239,-0.8518646195191039,-0.9478890044338084,-0.7823947780225171,-0.4194367950258453,0.021100257779871123,0.3965085731756973,0.5805358261718254,0.4981690883510053,,, +3.40625,6,0.1463891898139953,-0.40479438488543934,-1.03131357919921,-1.5888196689189624,-1.9520135294125032,-2.048751128936332,-1.8795791036619407,-1.5173484662874226,-1.0870144847295202,-0.7311611224784992,-0.5707008606327345,-0.6715229445438949,-1.026232734377032,-1.5559887231389415,,, +3.4140625,6,0.3807813663177839,0.4744879760996662,0.5731772423855486,0.6746113597761958,0.7764998035895119,0.8765396608222162,0.9724561803836604,1.0620428324451063,1.143200175341827,1.2139728493419109,1.2725840493960596,1.3174668731214845,1.3472919949885145,1.360991182005186,,, +3.421875,6,1.357776239008368,1.3371530516982666,1.2989304813891116,1.2432239555954807,1.170453691448248,1.0813375829127998,0.9768788762180752,0.8583488491631927,0.7272647974498548,0.5853637133617957,0.4345721175406265,0.2769725719645199,0.11476746035030914,-0.0497593299543093,,, +3.4296875,6,-0.2142821537769683,-0.3764740858125743,-0.5340474215755042,-0.6847934925759322,-2.2268648350281994,-1.9914706199732632,-1.7139887715779918,-1.4108327077702345,-1.1000718687197129,-0.8001767873560358,-0.5287364638324558,-0.3012374736788379,-0.12998993390525893,-0.023275209881119863,,, +3.4375,6,0.015225217415634653,-0.013320089106319544,-0.10298076633571196,-0.2434851293778129,-0.4209435480714167,-0.6188242625515816,-0.8191135750895709,-1.0035794980013688,-1.1550507228347977,-1.2586217074158284,-1.3026998291919758,-1.2798215663771608,-1.1871807747247671,-1.0268322041726683,,, +3.4453125,6,-0.8055560461318536,-0.5343929396125089,-0.2278818443858837,0.09694609050265936,0.4217475192050865,0.7281384848090136,0.9989689433317674,1.2195113658116914,0.8733864765386294,1.023965195516463,1.292485231138286,1.632753481154898,1.9865519422153173,2.2927217084323788,,, +3.453125,6,2.4967089711675468,2.5590860833252482,2.4617203708565496,2.2106297308518137,1.8350800876597309,1.3830651112892565,0.9138720673531758,0.4888915024402455,0.1621019860045989,-0.0282882720386366,-0.06574131066289801,0.042087868978720855,0.2645984265882144,0.5530661220741835,,, +3.4609375,6,0.8482896698740181,1.0898697617242925,1.22567521059596,1.220021520847104,1.0592877350111805,0.7540964100361641,0.3377168884846786,-0.1390597245756407,-0.6157759128393172,-1.0316701925796268,-1.3350886679201197,-1.4914800578234275,-2.8719383531202722,-2.8543149328973727,,, +3.46875,6,-2.5690913742568253,-2.098564733150977,-1.5731129702630249,-1.1354251124038142,-0.901380079640044,-0.9282962830736292,-1.1992537827683285,-1.6277855809278683,-2.0816518510302133,-2.419180642003144,-2.528214307274955,-2.3569865697486376,-1.928466525973485,-1.334236941448528,,, +3.4765625,6,-0.7095830711687127,-0.1966177303989209,0.09445287937518654,0.11530862932572115,-0.10747425776076892,-0.4799457581569234,-0.8667735918094692,-1.128578094803537,-1.160375874236086,-0.920593822441092,-0.4426994752535621,0.17374191668907055,0.7901346489301735,1.2666277824000276,,, +3.484375,6,-0.8266210986933709,-0.95759288493251,-1.0759590257379434,-1.1801876271904228,-1.2689913148738234,-1.3413495419913035,-1.3965262272458576,-1.4340824137744417,-1.4538837276055652,-1.4561025051683396,-1.4412145527248366,-1.4099905945903242,-1.363482560004381,-1.3030049488880753,,, +3.4921875,6,-1.2301116028905494,-1.1465682885790358,-1.054321572953271,-0.9554645363865222,-0.8521999234672765,-0.7468013770787725,-0.641573434612168,-0.5388109868819142,-0.4407589097199801,-0.34957257519652896,-0.26727993401347794,-0.1957458331018057,-0.1366391933131048,-0.0914036220149198,,, +3.5,7,-0.061231975249555926,-0.047045314959283324,-0.04947662981935541,-0.06885960480770059,1.3784805496635275,1.4688135404547813,1.4881552931615725,1.4390162212903792,1.3285906621221957,1.1682489312696704,0.9727384008939028,0.7591493261086226,0.5457175483934349,0.35054757934146674,,, +3.5078125,7,0.1903451195819528,0.07924740913425665,0.02783298269282497,0.0423798921748858,0.1244241317476008,0.270649065747248,0.4731135772758469,0.7198030344272544,0.9954646592206594,1.2826690512220498,1.5630238465494086,1.8184548832638203,2.032465535891236,2.1912864033372217,,, +3.515625,7,2.2848351796295487,2.3074197726523016,2.258135639337105,2.140929628207127,1.9643258748483632,1.7408328611879271,1.4860729821102805,1.2176953125853631,-1.4887291761984036,-1.3389983845812146,-1.0767904254057878,-0.7535345694906966,-0.4295395081545591,-0.16456654741708088,,, +3.5234375,7,-0.008491539700662187,0.006489850978009693,-0.1291006445125804,-0.4005288980849216,-0.7711285251051931,-1.1880010880991907,-1.5902485699321156,-1.9184558876340865,-2.1239464965548023,-2.1763694558510664,-2.0684361890461864,-1.8170691026856485,-1.4607830777213513,-1.0537075782143237,,, +3.53125,7,-0.6571803440706081,-0.3302218543192522,-0.12037405527359267,-0.056330094514164826,-0.14350282673478476,-0.3632221129841864,-0.6756857169253933,-1.0262039461538208,-1.3537651566323101,-1.6005877410826357,-1.7211705628936609,-1.6894319090321623,1.1618134294565283,0.7288628288531791,,, +3.5390625,7,0.2928403286480298,-0.008858770176557007,-0.07794658663374998,0.11775166189876418,0.535433678373485,1.069027481682918,1.5782616550580322,1.9271310782985696,2.0212155476603098,1.8336228720017305,1.4124455238342142,0.8676863106284873,0.34123527234564344,-0.031875013321664425,,, +3.546875,7,-0.16031837285792427,-0.02133059965206164,0.33323882820142275,0.7913356517323691,1.2116193883260802,1.4624156888311055,1.4580247513641549,1.1824326271272043,0.6939247153697911,0.10933487390220907,-0.4277551494051839,-0.7861524910600824,-0.8828019935095726,-0.7053513802309047,,, +3.5546875,7,-0.1052226362347457,-0.15828819710578335,-0.2274775640020895,-0.311920822783912,-0.41047197798435375,-0.5217289013940289,-0.6440577706008679,-0.7756215696262219,-0.9144121526692728,-1.0582853095793396,-1.2049982191107351,-1.3522486342045892,-1.4977151132084852,-1.6390975926291766,,, +3.5625,7,-1.7741575910303156,-1.9007573401407243,-2.016897158022987,-2.1207504099274983,-2.210695444695282,-2.2853439475273825,-2.343565212683429,-2.384505911112419,-2.4076050068972465,-2.4126035613364656,-2.3995492530001563,-2.3687955346165768,-2.320995441551821,-2.257090160291853,,, +3.5703125,7,-2.1782925570851184,-2.0860659551474163,-1.9820985320261808,-1.86827378540698,0.9541473858153038,0.7133916237356159,0.5116559200200453,0.3623054934292023,0.27491467205388986,0.2546033264862708,0.3016842144571993,0.4116458179786364,0.5754718584370799,0.7802751968568633,,, +3.578125,7,1.0102019028938325,1.2475424358511251,1.4739724379057453,1.6718366009790857,1.825386064567979,1.921883041861504,1.9524956296813785,1.9129203885758543,1.8036892625383047,1.6301394195429189,1.402048099453418,1.1329579157585759,0.8392396430653856,0.5389578281088356,,, +3.5859375,7,0.2506183116950397,-0.008115016319480306,-0.22164476144064085,-0.37752049410821975,-0.4672998169165834,-0.4871300014811551,-0.4380096523577285,-0.3257121679587577,-1.502824752287817,-1.1827870640078155,-0.7714567502284614,-0.3251625867624264,0.09429531647380844,0.4292176980448617,,, +3.59375,7,0.6349403437968553,0.6867390364084542,0.5836300509189356,0.3484745195066514,0.02437067220220124,-0.33210386669837844,-0.6597469374416554,-0.9023044391686088,-1.0172694626012595,-0.9825372492743352,-0.7998792475733083,-0.4946949949696466,-0.11208032160626387,0.2901758588934492,,, +3.6015625,7,0.6505754977406221,0.9134768945733396,1.037751915159852,1.003186588734767,0.8136281902078141,0.4963886436519566,0.0979971601430848,-0.3230363719587672,-0.7053201559539015,-0.9941243060733198,-1.1498833094153156,-1.1543329394789712,0.604417573044106,0.8638596286695489,,, +3.609375,7,0.8695573748316593,0.6154181276632871,0.1685728161479373,-0.3489578081521276,-0.7936620489777781,-1.0398480493530355,-1.0140928193371996,-0.7153880995684622,-0.2154615131166973,0.36081538937194096,0.8695632039377611,1.187219970323914,1.2442787749959534,1.0441923438342844,,, +3.6171875,7,0.6622647617440088,0.2248355427581712,-0.1255373056810708,-0.2693511951761096,-0.14312417911854358,0.24298525481039346,0.8077349195852714,1.4208335675123238,1.9384165404239169,2.2422417818642213,2.2718659227561964,2.040984083785024,1.6334572484727,1.1801180294848377,,, +3.625,7,-1.7466375844851048,-1.6193623838072888,-1.4887092261700277,-1.356988199873266,-1.226518042686249,-1.099585599823169,-0.978405845777492,-0.8650831699876069,-0.7615746041756469,-0.6696556351967953,-0.590889201964035,-0.5265984192554891,-0.4778435059513732,-0.4454033216263321,,, +3.6328125,7,-0.4297618347264204,-0.4310997592067888,-0.4492915060029069,-0.4839075026434524,-0.5342218403141086,-0.5992251143958623,-0.6776422335607221,-0.7679548855063714,-0.8684282658716531,-0.9771416022228314,-1.0920219385487733,-1.2108805886071998,-1.3314516197318655,-1.4514316931551123,,, +3.640625,7,-1.5685205631436399,-1.6804615257102922,-1.7850811085424592,-1.8803273070739217,-0.16037635214752344,0.04420725943809517,0.2715645758116729,0.5036931003483732,0.722323486457892,0.9101995122817772,1.0522872035121291,1.1368287746356205,1.1561678807214275,1.1072886196608716,,, +3.6484375,7,0.9920306864259866,0.8169656644659512,0.592943069968803,0.3343377945527398,0.05805141505975395,-0.21766299654478166,-0.474470621548394,-0.6952306649395888,-0.8651891910264243,-0.9730058498688364,-1.0115429026994929,-0.9783615293625808,-0.8758908121467556,-0.7112576148897333,,, +3.65625,7,-0.4957892222611578,-0.2442234227790866,0.026318880834150616,0.29752689145687555,0.5511757619914976,0.7703960980152812,0.9408485953100836,1.0517219049827091,-1.0133258959658362,-0.7558877698434191,-0.4296605394721885,-0.09344348146359527,0.1920065112834072,0.37348209061375415,,, +3.6640625,7,0.4136590743033127,0.2969582810054968,0.032022315053677815,-0.3495787333177893,-0.7982113490462133,-1.2538550893493234,-1.6553961455986168,-1.9500907365711555,-2.1017246503133604,-2.0961983348094604,-1.9436679217112072,-1.6769089971619702,-1.3461582574937068,-1.0112367707693786,,, +3.671875,7,-0.7321819631053437,-0.5598477149841876,-0.527936910725188,-0.6477076617173539,-0.9061779735179668,-1.2681087128950683,-1.6814562266447055,-2.085445532251845,-2.4200068163652184,-2.6351056175198755,-2.698513610792822,-2.600809777793036,0.7907778808458397,1.150183251313913,,, +3.6796875,7,1.66379969641534,2.197658180180451,2.609723390045924,2.7887416437696406,2.684674180885056,2.3223755746729915,1.7947688072365977,1.2373876929211205,0.7912637775879041,0.5643290624860843,0.6019124634251767,0.8744153941075175,1.2855433841016617,1.6988366614466213,,, +3.6875,7,1.9752272539453888,2.0113279574978105,1.7679577817413523,1.2810842305522745,0.6521816668638387,0.020646335336500177,-0.4741737439548548,-0.7309296190129118,-0.7138039286365514,-0.4620814303622624,-0.07913671835421587,0.2961405585100515,0.5276493389085092,0.5196096682262255,,, +3.6953125,7,-1.9643056970816328,-2.035312791367484,-2.0918660563415217,-2.1327300628038013,-2.156938312912005,-2.163810361029383,-2.1529639285495388,-2.124321800448958,-2.078113382687638,-2.0148708930656616,-1.9354202521093733,-1.8408668333627551,-1.732576322468637,-1.6121510200693798,,, +3.703125,7,-1.4814020033334034,-1.3423176334276148,-1.1970289602391608,-1.0477726299752643,-0.8968519449964354,-0.7465967575902615,-0.5993228998097739,-0.4572918596256053,-0.3226714093244655,-0.1974978754155322,-0.08364071056135414,0.01723001225854537,0.10367261430975427,0.17449882648369275,,, +3.7109375,7,0.22879436761300964,0.26593472553181263,0.2855958646899862,0.2877596729658469,1.0964841465885211,1.0733356693661191,0.9853314953883012,0.8401649133240138,0.6496273212976582,0.42878199423690216,0.19490940076585486,-0.0337023740410855,-0.23903774179983586,-0.4046149822783491,,, +3.71875,7,-0.5166409019084306,-0.5649782489198386,-0.5438584111903592,-0.4522896846182698,-0.2941326281640646,-0.0778372363449209,0.18413975792048554,0.4761968320924424,0.780668783647153,1.0790516273459252,1.3532858804335497,1.5870087647330031,1.7666880223457633,1.882558297293728,,, +3.7265625,7,1.9292948032811053,1.9063773177212544,1.8181191367610825,1.6733589893856151,1.4848374115944751,1.2683010851792802,1.0413976154180449,0.8224378352229961,-2.356833108079668,-2.0033606508376463,-1.5933726368447054,-1.1877979518192467,-0.8460256698329308,-0.6166605270330445,,, +3.734375,7,-0.5299621998321681,-0.5931459693016528,-0.7892766567209804,-1.0799280238321929,-1.4111933203031966,-1.7221106825188457,-1.9541909430675828,-2.060563685817443,-2.0133168243392308,-1.8078863332127184,-1.463812200489349,-1.0217426353698709,-0.5371529058969903,-0.07175688309445216,,, +3.7421875,7,0.3160512696704073,0.5802367727809215,0.6942375707276053,0.655043679123525,0.4836074464016968,0.22152112129298346,-0.07552049383266564,-0.34645378318052256,-0.5344158316983887,-0.5956589197500075,-0.506421231450387,-0.26668334565406193,-0.8693103694899761,-1.4550573074153828,,, +3.75,7,-1.8774607059094968,-2.043343741094588,-1.927647311883098,-1.5801859265097649,-1.1119038575411688,-0.6643990883221643,-0.3710681709678595,-0.32052136870183057,-0.5322950315304539,-0.9515176435199888,-1.4639911400428212,-1.927553675895715,-2.211127568030744,-2.230749667193357,,, +3.7578125,7,-1.9727082528565127,-1.4974440851542523,-0.9231450505808574,-0.3935290635800448,-0.03864327394483347,0.06057847005968042,-0.1057119177845508,-0.4737943680912054,-0.924066609650964,-1.3140491636021363,-1.5176615528071506,-1.460003140236482,-1.1381040672159026,-0.6219569675935879,,, +3.765625,7,0.27271405243809543,0.2410476526610756,0.19363933879661832,0.13164257914709332,0.056465025595441976,-0.030256355372102032,-0.1266841654751974,-0.2308129654149765,-0.3405046063274295,-0.4535258831342738,-0.567587850358416,-0.6803861118598782,-0.7896413788978816,-0.8931395862276397,,, +3.7734375,7,-0.9887708636788721,-1.0745666807077452,-1.1487345134037752,-1.2096894268184646,-1.2560820194962028,-1.2868222407863779,-1.301098663786475,-1.298392876337796,-1.2784887379812178,-1.241476340678462,-1.1877506038434806,-1.1180045281833642,-1.0332172263745565,-0.9346369400596992,,, +3.78125,7,-0.8237593404412814,-0.702301492336088,-0.5721719374872721,-0.4354374208870251,0.6291119608921009,0.4772491424736793,0.3797069254465296,0.34546808099427584,0.3790078013506159,0.4799754029053088,0.6432127477339737,0.8591081133290059,1.114260847971115,1.3924104766036554,,, +3.7890625,7,1.675565480567844,1.945253050094696,2.183802672044403,2.3755740553241265,2.5080437772751227,2.5726748854901365,2.5655088240303368,2.487438415501348,2.3441428706994314,2.145689364678846,1.9058289687042689,1.6410360403066109,1.3693580623457369,1.1091561391698097,,, +3.796875,7,0.8778239819789362,0.6905747146901978,0.5593801014422439,0.4921361671996343,0.4921133949788015,0.5577298379574642,0.6826629660211317,0.856292444451141,0.0997748588489219,0.5490260141738612,1.0237872587995391,1.462294774998581,1.807878846515446,2.017748291640742,,, +3.8046875,7,2.069616256247475,1.9651355553059524,1.7296086644532949,1.4080176885974711,1.0579927992256748,0.7408144627214162,0.5118510098074269,0.41192102471059344,0.4609259665819928,0.6547448142518347,0.965874427064908,1.3477158784371317,1.7418391182456618,2.0870944088317622,,, +3.8125,7,2.3291513139899265,2.42897940636702,2.3689496717540877,2.155606158448228,1.8186760280906629,1.4064720352954825,0.9784033445683092,0.5957609686260629,0.31221283396018296,0.1654886925976128,0.1715497613999457,0.32215094926504706,0.7904161035358132,0.8330311856053432,,, +3.8203125,7,0.6056784261179362,0.18161183984181464,-0.3137608160001856,-0.7373587767787444,-0.9677328371401852,-0.9384206846494008,-0.6562106358593283,-0.19930776432450986,0.3040952343023228,0.7109694145934975,0.9026891047005065,0.8176048487406248,0.4680219431161896,-0.06306949738071876,,, +3.828125,7,-0.6446177006092262,-1.1332864254839818,-1.412582025417488,-1.4246082937823283,-1.1857476480810911,-0.7819726487944689,-0.3450746778773572,-0.016326733635591006,0.09245868977132303,-0.07019832034866746,-0.481106304878508,-1.0485289177345123,-1.6370997586278386,-2.1046992864592045,,, +3.8359375,7,-0.2942868426447478,-0.15099306651831493,-0.00787325376046863,0.13275158324649344,0.2685970994273026,0.3974554981184285,0.5172340765946403,0.625991761152305,0.7219729920871444,0.8036383653016467,0.8696914940675182,0.9191016206500348,0.951121581917056,0.965300814405194,,, +3.84375,7,0.9614931711702878,0.9398594135924128,0.9008643345432394,0.8452685633255469,0.7741151959126774,0.6887114846221262,0.5906059078628291,0.4815610214866904,0.3635225671371823,0.23858537852199715,0.10895668260415232,-0.023082561684022496,-0.15521761024016156,-0.2851404666324932,,, +3.8515625,7,-0.4105902912547068,-0.5293929792338223,-0.6394992140901876,-0.7390203308412729,1.0644429646931772,1.2903753227554593,1.5159566288893715,1.7229280400322415,1.89418160514328,2.014957177340849,2.0738759200059054,2.063738328116377,1.9820311064829448,1.831107548209736,,, +3.859375,7,1.6180288239196998,1.3540772374242862,1.0539753777406151,0.7348656055661532,0.41512102442074506,0.11307083726156165,-0.15427104093073676,-0.3723854715890647,-0.5302534478387462,-0.6211172256679853,-0.6429441709068429,-0.5985609928048461,-0.4954490202553558,-0.34521481351435124,,, +3.8671875,7,-0.16277304434147555,0.03470135792220618,0.2289787068957022,0.4020536255975829,0.5374084680531248,0.6211729763020292,0.6430992889266145,0.5972842934304241,0.5861751088947245,0.9145312281732788,1.247853366316562,1.5258009031148334,1.6965112520392407,1.7247324378109314,,, +3.875,7,1.597368555495733,1.3255740854311973,0.9430705736125128,0.5009475765833498,0.059757368640009474,-0.31986557416325745,-0.5865995175942158,-0.7063817888765711,-0.6676690415710137,-0.4831923906714831,-0.18793427268157992,0.1663576421432864,0.5192648007516065,0.8111394620358119,,, +3.8828125,7,0.9924229769429708,1.0313891357814182,0.9191063871527221,0.6708459275283339,0.3237162546250885,-0.06910745389485627,-0.44666038038914097,-0.7496823611042904,-0.9298506544911264,-0.9573131174817522,-0.8253484227082089,-0.5514274073993463,-2.003086893692656,-1.5495073697639734,,, +3.890625,7,-1.0733211703642396,-0.7143045847195049,-0.5778936301700872,-0.7061680200785988,-1.0662189760810177,-1.5590899046912714,-2.0468403642359427,-2.3903165013290804,-2.487276611670416,-2.3004229447839566,-1.8676570597694733,-1.2917478221926386,-0.7122433032861435,-0.2673240538491216,,, +3.8984375,7,-0.05605179603767518,-0.1113590151414512,-0.3911809954978224,-0.7901593766136679,-1.1687081131322967,-1.3914740662742189,-1.364649540858781,-1.0619086187008204,-0.5318569219788148,0.11504902069192098,0.7365299229293989,1.1972317526761092,1.405576120065299,1.3386156317647169,,, +3.90625,7,-0.8262613605991114,-0.8997506780688243,-0.958265732839502,-1.0008544139361204,-1.0268516735652105,-1.035891119001021,-1.0279113696704016,-1.003157068158232,-0.9621745274683904,-0.9058020907966222,-0.8351553726593125,-0.7516076398510617,-0.6567656758097671,-0.5524415510553292,,, +3.9140625,7,-0.440620794055022,-0.3234275199018161,-0.20308712746040347,-0.0818872182175735,0.03786257878765811,0.1538711724216354,0.26390625492812303,0.3658335226453271,0.4576541851355955,0.53754010586498,0.6038659590384571,0.6552378394392898,0.6905178242289658,0.7088440565400012,,, +3.921875,7,0.7096459991064675,0.6926545907466228,0.6579071277599661,0.6057467846662744,0.482588933436481,0.3027252141460616,0.06600482215521475,-0.2152331273235374,-0.5254753270438265,-0.8471090151087691,-1.1616432838467143,-1.4509918095821102,-1.698727569208394,-1.8912220624607536,,, +3.9296875,7,-2.018589612077628,-2.075370906058513,-2.0609081291463047,-1.9793855365455333,-1.8395326520511983,-1.6540107984005894,-1.438525749245629,-1.2107283898720198,-0.9889800559060912,-0.7910686549568475,-0.6329651074627736,-0.5277068306589361,-0.4844861296896955,-0.5080070702723657,,, +3.9375,7,-0.5981556844470776,-0.7500065104266533,-0.9541650130969404,-1.1974220088697822,-1.463674460708568,-1.735048433480461,-1.9931459016737616,-2.220328464078039,-0.17451016692505572,0.2510002115047761,0.6637056531421621,1.004747151772002,1.2269400513029711,1.3020878553241442,,, +3.9453125,7,1.2253355875190055,1.0158848469931956,0.7139594023073261,0.37449417978312816,0.058530862474272076,-0.1763394653765683,-0.2849977562623677,-0.2418771113155556,-0.04499852270843109,0.28366662573228896,0.7015640491223148,1.1521298293822386,1.573545930611922,1.9083145350566681,,, +3.953125,7,2.1121602349902258,2.160873802181769,2.05403186163756,1.8150133840927591,1.4873106937230518,1.1277098269361832,0.7974026824517647,0.552415525275707,0.4348448754466507,0.4662660436285254,0.6443411589885617,0.9431551805801932,0.2736776302883965,0.06290926239765038,,, +3.9609375,7,0.09952145142185433,0.3997308890038589,0.905517383778287,1.5003738807855602,2.041104817197791,2.396958976048795,2.485372650836898,2.294527754155593,1.8865429329128216,1.3804234605179972,0.9194429811192276,0.6318967347520251,0.5959823627058364,0.8184329414210725,,, +3.96875,7,1.2327576194253285,1.7175711818879802,2.1299879088756484,2.3449262460223044,2.289550664824775,1.963409687853443,1.43874916805188,0.8409131567462577,0.3142019835890405,-0.017457174581791083,-0.08425028736301554,0.11061797435660492,0.4920324184173072,0.93378336756242,,, +3.9765625,7,0.5368167825759641,0.4520493071993341,0.3526493704331938,0.24007389799974946,0.11600640920135685,-0.017672267964287114,-0.15891673366570894,-0.3055526319713446,-0.4553145219419947,-0.6058853410812645,-0.7549367702603829,-0.9001697934519269,-1.0393547421972562,-1.170370123754584,,, +3.984375,7,-1.2912395531757797,-1.4001661427590306,-1.4955637468482748,-1.5760845150136666,-1.640642271287655,-1.6884313102187307,-1.7189402807559502,-1.7319609149905908,-1.7275914490476003,-1.7062346763608582,-1.6685906675525182,-1.6156442845255603,-1.5486477075314768,-1.4690982812972269,,, +3.9921875,7,-1.3787120682606375,-1.2793935721290304,-1.1732021620361386,-1.062315785342864,-2.4009484455545755,-2.5224415340754964,-2.576204755983333,-2.558198560666287,-2.4692310237839554,-2.314904344280632,-2.1052273589896044,-1.8539210875376968,-1.5774657255062734,-1.293955532728013,,, +4.0,8,-1.0218414589988545,-0.7786491772458175,-0.5797619084696924,-0.4373529040365888,-0.35954201422226306,-0.34983514511597824,-0.4068856787595716,-0.5245944793877284,-0.69254149748861,-0.896718859611238,-1.120514307891758,-1.3458763952353725,-1.55458016737263,-1.729505055451502,,, +4.0078125,8,-1.8558358511091544,-1.92210299945564,-1.9209896501106398,-1.8498491710051743,-1.7108970199195548,-1.5110635767504763,-1.261518181772515,-0.976897553040448,1.3172277130317558,1.7085759032875358,2.0557284543083982,2.3032868753782254,2.4105448336332937,2.3578231566755763,,, +4.015625,8,2.149533814728005,1.8134956684833183,1.396608554956546,0.9575594706283732,0.5576968566935201,0.25149429825974456,0.07808887989124225,0.055212036554602384,0.1764580758578087,0.4123156688212827,0.7148014862314279,1.0249740872916098,1.28215753656353,1.4334379107565234,,, +4.0234375,8,1.4419533387457175,1.292686118762116,0.9948545095869852,0.580531400805436,0.09970474152574886,-0.3874511858938847,-0.8198901412723075,-1.1451434769688509,-1.3274333380971952,-1.3531861329097268,-1.2330878156128413,-1.0003611535994028,1.3441203397801735,0.9817676686808668,,, +4.03125,8,0.4453445825060017,-0.13510260664648244,-0.6160181956818231,-0.8795300444003642,-0.8656208371354585,-0.5884617176021743,-0.13243280520424067,0.3710778680670189,0.7797375963702331,0.979310074031813,0.9149740334172198,0.6063358699973017,0.1420218741581772,-0.3446674875244192,,, +4.0390625,8,-0.7123682718250796,-0.8504941082205032,-0.7096615037568328,-0.3153596293679193,0.2388831741620752,0.8169647592143505,1.277328703095959,1.5115663829034445,1.4739237637799023,1.1936279153613172,0.7666569495400041,0.3292110766473704,0.02015769484101504,-0.057254662206920874,,, +4.046875,8,-0.9489926046026642,-0.8355312305623919,-0.7242302476486435,-0.6173477407816566,-0.5170615323326153,-0.4254308256052061,-0.3443599265957629,-0.27556467939156715,-0.22054220305395,-0.1805444600208732,-0.1565561189734923,-0.14927709991569704,-0.1591101072271498,-0.18615336911209326,,, +4.0546875,8,-0.2301987106999017,-0.2907349946607336,-0.3669568692133688,-0.4577786704686516,-0.5618532357983308,-0.6775952989256775,-0.8032090572074773,-0.9367194285192696,-1.0760064505508982,-1.2188422202924056,-1.3629297270109362,-1.505942898862667,-1.6455671620294263,-1.7795398022957936,,, +4.0625,8,-1.9056894224370984,-2.021973804620475,-2.1265155149468438,-2.217634626793097,-0.6742923707272139,-0.3720626800915744,-0.08856470193421306,0.15912218257060706,0.35637951771777543,0.492062375898404,0.5592698808876002,0.5558199362949252,0.4843950700170098,0.35234923925019224,,, +4.0703125,8,0.17118908247263748,-0.04423419382057015,-0.27676592800107,-0.5081495029116418,-0.7203044355897817,-0.8965919202335518,-1.0229795630769885,-1.0890240781658016,-1.0886034078549385,-1.0203472059588212,-0.8877356563286873,-0.6988597283905212,-0.4658595810047769,-0.2040802705171976,,, +4.078125,8,0.0689963670721908,0.3349691810131969,0.5757996237202181,0.7750687323153517,0.9191215224852934,0.9980189936148416,1.0062313592089889,0.9430241609695554,-0.7055335942061761,-0.4085109495011387,-0.16919174495405132,-0.03808436998528342,-0.048388723433654864,-0.21077593425980634,,, +4.0859375,8,-0.5116794871332454,-0.9153641502432476,-1.3694506763896843,-1.8130359787042245,-2.1861442076544453,-2.4390368442859645,-2.539931865932619,-2.479929817510315,-2.2743796415216284,-1.9604716265015365,-1.5914324595871099,-1.228226588476899,-0.9300564826086308,-0.7451414401169465,,, +4.09375,8,-0.703211181049969,-0.8108833592753178,-1.050644919082028,-1.3835958840606626,-1.7555281269477019,-2.105392208498207,-2.3748333999401887,-2.5173114540904606,-2.5053835058448044,-2.3350155681870333,-2.026250885889475,-1.6201308328459323,1.1256778735093105,1.6812754209704663,,, +4.1015625,8,2.09185379302277,2.2563497592578208,2.1392993518291132,1.7804034346066009,1.283509917555461,0.7880336068615192,0.4306478299101408,0.30774800944023983,0.44897560447882456,0.8090593249098186,1.280210109648126,1.7216729828302515,1.9983365092413483,2.0178179461303682,,, +4.109375,8,1.7558597482630272,1.2630763878748403,0.6512015732483135,0.06260408564565179,-0.3685741564451044,-0.5530082702150185,-0.4704820621543866,-0.17522520419022553,0.2191650443952347,0.571083171017641,0.7499591583977365,0.6722838627805208,0.3247404243226873,-0.23190007595995304,,, +4.1171875,8,-2.293877990063048,-2.354044533932264,-2.3972061601240955,-2.4227238609607413,-2.43025878004432,-2.4197780219750324,-2.3915551094545213,-2.3461650798441536,-2.2844743071074407,-2.207625227422308,-2.117016235981041,-2.0142771070467087,-1.9012403677184968,-1.7799091267053715,,, +4.125,8,-1.6524219214790663,-1.5210151993794752,-1.387984089674816,-1.2556421534992803,-1.126280816484972,-1.0021291944599973,-0.8853150156955718,-0.7778273239846053,-0.6814816156466545,-0.597888020933322,-0.5284230869991446,-0.4742056565342849,-0.4360772644395197,-0.4145873958086017,,, +4.1328125,8,-0.4099838633591783,-0.4222084728091179,-0.4508980520998144,-0.4953908264444074,0.8125103402665278,0.6233646337712699,0.3882202064106673,0.12278959258876675,-0.15522875931663516,-0.42738209440686586,-0.6757472328896216,-0.8841772036297687,-1.039423705548335,-1.1320571324417057,,, +4.140625,8,-1.1571200140542297,-1.1144683166562528,-1.0087768135982944,-0.8492081624211061,-0.6487687765323775,-0.4233964208576687,-0.19084316917948616,0.03056836851201988,0.22322880254760447,0.3714761691999037,0.4626945055226365,0.4882001710895144,0.44385409503474016,0.3303572385630419,,, +4.1484375,8,0.15320865319332444,-0.07767095698439719,-0.3486239355115479,-0.6432009067548851,-0.9433006449735828,-1.2304251096623575,-1.4869621467296623,-1.6974064258613404,-1.1723477113362275,-0.7446178224764275,-0.3951182456107344,-0.16947658669542576,-0.09371681928650266,-0.17025966281771954,,, +4.15625,8,-0.377600176820784,-0.6737124997076971,-1.0026511355463583,-1.3033203118004528,-1.5190452427728238,-1.6064542342245829,-1.542287908026866,-1.3270746924462182,-0.9850998255299559,-0.5606724315860525,-0.11127183442119276,0.3013596432799842,0.6207902877633844,0.8046480931848249,,, +4.1640625,8,0.8311828432576627,0.7026192913803099,0.4447793421941524,0.10303224311308228,-0.26479629177872616,-0.5974514594328829,-0.8398070801244817,-0.9514648947606392,-0.9130559961527368,-0.7292628685903906,-0.42809131347607854,-0.05650565978841043,-1.88382687071062,-2.0300383424096013,,, +4.171875,8,-1.902033417021321,-1.5636286597277025,-1.1345869608258372,-0.7576092269042195,-0.5590555061294958,-0.6141621883963952,-0.9262895220739285,-1.4258882284853376,-1.9894693999932802,-2.4733793766573315,-2.7531234978464627,-2.757461641550668,-2.4879311532711226,-2.018446473114024,,, +4.1796875,8,-1.4750849408191866,-1.0015984268410605,-0.7201023589768281,-0.6977152500450989,-0.9282907911744676,-1.3342479784848196,-1.7879963069589049,-2.1470824920833738,-2.2934243816882685,-2.16587742054664,-1.7772062703681215,-1.2108081772055117,-0.5980840455659928,-0.08265700935605902,,, +4.1875,8,-0.5547380275702415,-0.6277205338717808,-0.7128702500948432,-0.8084958521824871,-0.9127124464741692,-1.0234746239075172,-1.1386123304229558,-1.2558689254546302,-1.372940762077666,-1.4875175957314162,-1.5973231139288693,-1.7001548772408248,-1.7939229721468055,-1.8766866988999296,,, +4.1953125,8,-1.9466886519535167,-2.0023855961523704,-2.042475597994311,-2.0659209368367466,-2.071966394815178,-2.060152605154073,-2.0303242250763454,-1.9826327901352607,-1.9175341999177056,-1.8357808790696488,-1.7384087508265629,-1.6267192510618176,-1.5022566977031715,-1.3667814116931998,,, +4.203125,8,-1.2222390600556892,-1.070726757779858,-0.9144565219837522,-0.7557167181769636,-1.849433491392657,-1.9347520468147728,-1.9496750574167168,-1.8953698631331293,-1.7777698771292083,-1.6071540441421197,-1.3974234005106934,-1.1651251996003478,-0.9282926690639586,-0.7051813225997763,,, +4.2109375,8,-0.5129899620482264,-0.3666555728276405,-0.2778061624295368,-0.2539445773179371,-0.29792022619552005,-0.4077255604099337,-0.5766315153404579,-0.7936524791625825,-1.0443083757565428,-1.3116307291450875,-1.5773425625503739,-1.8231298624102803,-2.031915951844642,-2.1890499144334425,,, +4.21875,8,-2.283326201943401,-2.307764330943068,-2.2600943022163644,-2.1429138969647754,-1.963506884050272,-1.7333348174613266,-1.467237863950248,-1.182400390210262,0.3268928832922636,0.6610043071572623,0.8917609537228278,0.9805671273512492,0.9103325543624944,0.6881598272224893,,, +4.2265625,8,0.3442671111959137,-0.0726862491391717,-0.5031433360902917,-0.8858877117175192,-1.1675372476966417,-1.3108152382011156,-1.3003107595954295,-1.1448313157125634,-0.8759815876323092,-0.5431899203143031,-0.2059574700932216,0.07546247122913298,0.24950294662397754,0.2813692186747002,,, +4.234375,8,0.1585123595020761,-0.10736228559795058,-0.4820648795467238,-0.9141937546043918,-1.3430899919823545,-1.708235230319847,-1.9586292160035916,-2.060686755312211,-2.0034243296479803,-1.8001287733740432,-1.486248338785406,-1.1138348423833446,0.02167644701309246,-0.3745854095369722,,, +4.2421875,8,-0.8088578310713159,-1.139776548810724,-1.255378648162063,-1.1039747184359645,-0.7084875368243473,-0.16032591051756406,0.4055287504529115,0.847396367537406,1.0556276825119013,0.9825756118913264,0.6555949269368221,0.16950794654230686,-0.3393985241244372,-0.7307182518728695,,, +4.25,8,-0.8983775799473533,-0.7996561537908178,-0.4668231771855237,0.0017992321317485407,0.4688954117221225,0.7959209944254141,0.8812217433195301,0.6880577248846911,0.25485065901099585,-0.3151557556020759,-0.8819905744780061,-1.3071074049807847,-1.4911390181817197,-1.400909445708566,,, +4.2578125,8,-0.5968321736003726,-0.4401236559552784,-0.2878674269465731,-0.1422555787508364,-0.005357847809282834,0.12091442552303501,0.2348415605182937,0.3349254404753623,0.4199155344674186,0.4888305809138278,0.5409755534149318,0.5759536118980175,0.5936728299306598,0.59434758052861,,, +4.265625,8,0.5784945563156888,0.5469234938476607,0.500722764641784,0.4412400853401179,0.3700586848986357,0.2889693462419696,0.1999388120645736,0.1050751081204772,0.006590391322454314,-0.0932380266893844,-0.19210779790164548,-0.28773209559828805,-0.3778799010526837,-0.4604153136864341,,, +4.2734375,8,-0.5333351962414516,-0.5948044956651377,-0.6431886211043071,-0.6770823119364928,-0.897153442199384,-0.6296976224121739,-0.3968354209831701,-0.2128013964337604,-0.08827177769238381,-0.029622546596747783,-0.038487731952171145,-0.11164871073133376,-0.2412622290464561,-0.4154112347643792,,, +4.28125,8,-0.6189401022102381,-0.8345159971247429,-1.0438423598559288,-1.2289398764026718,-1.373405600129989,-1.4635624099642186,-1.4894186374643237,-1.445370932110397,-1.33060133842281,-1.149140881587544,-0.9095952131999928,-0.6245514339095464,-0.309707441877268,0.017215495267322814,,, +4.2890625,8,0.3377011311185609,0.633721950517762,0.8889886982734341,1.090078609745745,1.2273636851660643,1.295674293303487,1.2946518465330579,1.2287659714774968,-0.7434027592767319,-0.4344734408180848,-0.2362774129245541,-0.18006307311678116,-0.2742098809169532,-0.502907302605374,,, +4.296875,8,-0.8286053666727455,-1.197855217936607,-1.5496300276042192,-1.8248302672369208,-1.975492862651092,-1.9722698449721547,-1.8090116299612948,-1.5037410052370601,-1.0958660506408715,-0.6400660026928013,-0.19780226076290144,0.17222338997973208,0.4231773058153608,0.5273507276535336,,, +4.3046875,8,0.4804346479615098,0.3021471682091061,0.03311584740557408,-0.27149913894876543,-0.5506475615210726,-0.7469510439074909,-0.8156947331489496,-0.7318479621662618,-0.4940201197787412,-0.12473529559485365,0.3330173672037639,0.8224206030190511,-0.19120677034783887,0.09839074524103664,,, +4.3125,8,0.14635432598191,-0.07378084518167438,-0.5136162839327674,-1.0629718624865097,-1.579913635485278,-1.9294997606092323,-2.0206269320016568,-1.8308801824257632,-1.4125766593729845,-0.878347969277654,-0.3702133605307981,-0.02062048603346389,0.08386827004631893,-0.07370880813108928,,, +4.3203125,8,-0.4360953352509687,-0.8875626645585973,-1.2857031378638664,-1.5005565674536885,-1.4503457555653287,-1.124026028179423,-0.5844674618672686,0.048603690262768263,0.6312306294435535,1.0344786360780769,1.1795584947065478,1.0591963279747318,0.7393949906015143,0.3411063366670484,,, +4.328125,8,-0.6953344902232309,-0.6970686622845943,-0.6816985120284926,-0.6489384128595126,-0.5988086739693494,-0.5316354290103394,-0.4480451689666369,-0.3489540148172414,-0.2355519176919261,-0.1092820630406629,0.02818416068420848,0.17497619066817705,0.3290568075389378,0.488257573079449,,, +4.3359375,8,0.6503165674676604,0.8129177653932566,0.9737313617052376,1.1304543406168266,1.280850578226663,1.42278977628785,1.5542845456174148,1.6735249899384974,1.7789101847130064,1.8690759998884587,1.9429187795003475,1.9996144636144209,2.0386328178967736,2.0597465217623894,,, +4.34375,8,2.063034956077031,2.0488826241956097,2.017972234088424,1.9712725627883805,1.1069949952218805,0.9421920451738356,0.7501809837572736,0.54864523852638,0.35588703021947377,0.1895435386825992,0.06534954924850189,-0.003967119309896128,-0.009580363684424387,0.05281168782009072,,, +4.3515625,8,0.182679817511327,0.3746939322765318,0.6190882571589118,0.9023360567643588,1.2080868478764633,1.5183007617920965,1.8145009664665968,2.079056825295112,2.296408325384052,2.454146403003892,2.543873841999355,2.5617867215996566,2.508935876344122,2.391150143886787,,, +4.359375,8,2.21862676030554,2.005217472644603,1.7674601562473324,1.5234234704055996,1.2914451224883914,1.088851728915013,0.9307495438373774,0.8289703837374209,1.2816197959762343,1.653298677950935,1.893548779482369,1.9786514592036768,1.9087164597428719,1.7076105445770215,,, +4.3671875,8,1.4191876022772556,1.100407661646356,0.8124168195330781,0.6109776701672387,0.5377409748814038,0.6137182695100112,0.835972284049083,1.1780408418578086,1.5940283795372534,2.025727959493945,2.411664613341323,2.696651577580946,2.840371077455329,2.8236432262873454,,, +4.375,8,2.6514066751293104,2.351946788814689,1.9724915709638133,1.571861281619627,1.2113165730579012,0.9450305387478009,0.8116686274019492,0.8283877980733808,0.9881894630715068,1.2610383763050326,1.5985730404837268,1.9416737910932849,-0.02275209568604386,0.35477022611444153,,, +4.3828125,8,0.921565068881138,1.5522464700440162,2.1025468705359365,2.448645804305514,2.5209072806034047,2.3227812198794147,1.9296902614603937,1.4682085247554102,1.08124013079256,0.888742165213225,0.9547577169312536,1.2697950335929449,1.7533827270328473,2.276101108895912,,, +4.390625,8,2.6950517070771416,2.8930438032062504,2.8107578993984763,2.4630706295319467,1.935066301233652,1.3588273438371288,0.8773636745680441,0.6055656532795557,0.5988808738257977,0.8382980138156787,1.235751548798329,1.658464265910062,1.965554121133352,2.0468706049665464,,, +4.3984375,8,1.9100213157508423,1.8357032813557057,1.7500241631586562,1.654880548180776,1.5523265371796031,1.4445376212904253,1.3337724376421831,1.2223330736854536,1.1125246153827126,1.0066146476461535,0.9067934162417656,0.8151353487955479,0.7335626087337834,0.6638113203931977,,, +4.40625,8,0.6074010567597432,0.5656081241637605,0.5394431117731273,0.5296330990445713,0.536608832731706,0.5604970980272921,0.6011184174657638,0.6579901179201304,0.7303347120291643,0.8170934473322118,0.9169447858994936,1.0283274909104647,1.1494679159608914,1.278411019288464,,, +4.4140625,8,1.4130545598784223,1.5511858766941593,1.690520607044453,1.8287426661395905,0.7912462530150538,0.8206702267673641,0.9154811845037544,1.0691874045609115,1.2710203983217072,1.5066873338542293,1.7593695761823391,2.010897708106156,2.243021088143746,2.4386834090152583,,, +4.421875,8,2.583215300888636,2.6653608075853747,2.678066147785533,2.618975749176476,2.4906009555910886,2.3001496320641195,2.059028538759002,1.7820531629659941,1.4864200976627155,1.190513612949488,0.91262962839822,0.6697060537549528,0.4761480208798126,0.3428299123128257,,, +4.4296875,8,0.27634376286244444,0.27854642987950395,0.34643709346324114,0.4723736126021847,0.6446126334995734,0.8481357698521172,1.065704225972449,1.2790683034601351,2.229709600203474,2.4100231580519065,2.44617666272432,2.3236737610382265,2.0522661742217188,1.6644854843324743,,, +4.4375,8,1.2106284987997609,0.7509769760819911,0.34646325138122835,0.04923535519914457,-0.10540913190518064,-0.10446443530827144,0.04081407430116269,0.2967190012362669,0.612396434995348,0.9278212029566448,1.1831993968618468,1.3283334055040723,1.3304905338783422,1.1795493727024131,,, +4.4453125,8,0.8896220976404219,0.4968997820517563,0.054056105826717236,-0.3779190948548463,-0.7391846607735424,-0.980337303469748,-1.070078476598029,-1.0000649089892213,-0.7861874242645537,-0.4660789655660105,-0.09324004515520858,0.2713033278758492,0.8134288363963119,0.19699360730517784,,, +4.453125,8,-0.2966160287055836,-0.5589301987561182,-0.5442013947104957,-0.2817283362793295,0.13237743414828626,0.5617238545515435,0.8671961134463576,0.9452448409694374,0.756409636982415,0.33625921532082304,-0.21425130521275987,-0.7563641063875766,-1.1514842349688643,-1.299122333556654,,, +4.4609375,8,-1.164415899631814,-0.7876864405704213,-0.27341310642893024,0.2383554988361789,0.610316662842752,0.7454556796426598,0.6135264586903354,0.25921416378823303,-0.21025600197106645,-0.6546663920564526,-0.9394112212959262,-0.9725756006190028,-0.7303252341586502,-0.26364630528857913,,, +4.46875,8,1.9635447878050192,2.092668916489072,2.2139457433038205,2.325332693822748,2.4249497024634827,2.5111121470402,2.5823603667895174,2.6374852469955465,2.6755494222096936,2.695903726774922,2.6981986045818096,2.682390278242809,2.648741569631146,2.5978173573814005,,, +4.4765625,8,2.5304747508525502,2.447848152565128,2.351329470624152,2.242543827559597,2.1233211908701617,1.9956644219652009,1.8617143029083416,1.7237121532839714,1.5839606917003686,1.4447838271765048,1.308486084396152,1.1773123732184263,1.0534088068059089,0.9387852543657814,,, +4.484375,8,0.8352802841239878,0.7445291102982259,0.6679351052311739,0.6066453754189866,1.4702474315153802,1.622791443088223,1.7229351268316653,1.7605655270665699,1.7299345217014217,1.6300669707344966,1.4648359569331082,1.2426998551883368,0.9761195490210436,0.6806964173292779,,, +4.4921875,8,0.3740911863375618,0.0747990230085161,-0.19913372871731366,-0.4313616976539341,-0.6083742191147057,-0.7204316077657322,-0.7622386937521861,-0.7333086671971987,-0.6379918713877715,-0.4851675485636192,-0.28762004498862404,-0.06114298499848611,0.17656610736545944,0.4071436484640801,,, +4.5,9,0.6128439699679149,0.7777798852348942,0.8890333315865793,0.9375586337016372,0.918815395311534,0.8330868810513489,0.6854616828934671,0.4854799466368961,0.5685098797173026,0.7505201755969488,0.7881080994035298,0.6752261245722722,0.4299364698356606,0.09158317157510326,,, +4.5078125,9,-0.2853543781296042,-0.6397689795789285,-0.9134690405576168,-1.0602712789396973,-1.053226316185214,-0.8888515601165142,-0.5877118896591627,-0.19125748817451446,0.2445888732225437,0.6580965235651135,0.991294227650288,1.198950264094044,1.2555668180444512,1.1592995493650684,,, +4.515625,9,0.9321921234296996,0.6166894604048357,0.2689730713520992,-0.04984317204478195,-0.28328523835679353,-0.3883678979324401,-0.342341886250621,-0.14628808071376853,0.1750013974684239,0.5768369064652868,1.0015460851480884,1.3874129663862929,1.248491334081992,1.3787410829423918,,, +4.5234375,9,1.2347191292646975,0.8706727076359441,0.4002814507468091,-0.034703460420802856,-0.3035039826553886,-0.3223408629936617,-0.07756492143350023,0.3704472888136479,0.9037026502470408,1.3788095882807725,1.666176304210044,1.6854471010961631,1.4274656085867887,0.9567460904886752,,, +4.53125,9,0.3937759675006227,-0.11799985900352328,-0.4514642450929442,-0.5306158762948296,-0.35132619002522997,0.017623115256179208,0.4535055510097817,0.8134194496688154,0.9736053237527302,0.8635339388183217,0.4854210975531939,-0.08618091184964828,-0.7246049918683708,-1.2855637565895708,,, +4.5390625,9,0.5615308290077363,0.5331710836832212,0.5218444791222846,0.5275233687906249,0.5498747734289228,0.5882663846838503,0.6417778136582725,0.7092168873133831,0.7891407072676923,0.8798811021446243,0.9795740276889584,1.0861923997457583,1.197581785082222,1.3114983249938614,,, +4.546875,9,1.4256482275354552,1.5377281367513125,1.6454656719217788,1.7466594268620883,1.8392177287665168,1.9211954778060656,1.9908284222950319,2.0465642691434693,2.0870900847236333,2.111355506235004,2.1185913570067556,2.1083233396543246,2.0803805671919537,2.0348987825888822,,, +4.5546875,9,1.972318210262365,1.893376076993696,1.7990939330917486,1.6907599956749797,0.24646882603681475,-0.015386495876738904,-0.2821714381727625,-0.5354916027292995,-0.7577561659100758,-0.9334055842723156,-1.049997999710457,-1.0990785819619011,-1.0767711820684784,-0.9840510337279964,,, +4.5625,9,-0.8266794802350752,-0.6148052719693068,-0.3622602297330119,-0.08559838134360215,0.19705443340274714,0.4672602783337367,0.7075503234103276,0.9026382027781638,1.0404809286334928,1.1131133921846996,1.117198272052497,1.0542530165310269,0.9305380853058244,0.7566142581521377,,, +4.5703125,9,0.5465998955917194,0.3171799601959536,0.08643591811297399,-0.12742186867048538,-0.30733084889785656,-0.4385730422465841,-0.5098083826653504,-0.5138725697323008,1.678249327604575,1.832107717070488,1.8277792691875312,1.668064438015191,1.3793073973576009,1.007266792549201,,, +4.578125,9,0.6099661438993004,0.2486376184504775,-0.021830164512554817,-0.16145239915335596,-0.15138305326808255,0.0031466545631611,0.2736439729291854,0.6127974860300903,0.961855119134202,1.2597880835130386,1.4528133730029074,1.5027915574827118,1.3931917768181203,1.1316947404936568,,, +4.5859375,9,0.7490281673918932,0.2942158990849627,-0.17301950836169985,-0.591517565079926,-0.9081617883365276,-1.0861061593108643,-1.110465013183103,-0.9905803760359296,-0.7585138539139569,-0.4639982351116919,-0.1666353935435983,0.07344400878156833,-1.5712865798822615,-1.2182922660852495,,, +4.59375,9,-0.8081564098506419,-0.4831707237785259,-0.36132139565649546,-0.5037245751970179,-0.8976569231400888,-1.4598340187627818,-2.0590399960854944,-2.551908075281422,-2.8220472610310523,-2.811793251424308,-2.5378829255221964,-2.0867576719364185,-1.5907837629547683,-1.1919078536306773,,, +4.6015625,9,-1.002709142876963,-1.0755230274144194,-1.3880987188408356,-1.8497216226741544,-2.3261222929881784,-2.6763447336442043,-2.7914689170256626,-2.624574009534855,-2.2037292638249717,-1.6244509656238353,-1.0236913929013505,-0.5424871106226559,-0.28750191845414685,-0.3020025849782948,,, +4.609375,9,1.5699068231055913,1.4382847113597452,1.2978312780271846,1.150637766387366,0.9989126594401352,0.8449432408730385,0.6910557758944368,0.5395750090300604,0.3927836879394981,0.25288282185390154,0.12195337037490404,0.0019200333275877226,-0.10548222442623068,-0.19873832719786166,,, +4.6171875,9,-0.27657939383718944,-0.3380047337777302,-0.3822991487413456,-0.4090452372783776,-0.4181304868186237,-0.4097490291772431,-0.3843980289017199,-0.3428687678224368,-0.2862325820382514,-0.21582189770000948,-0.13320669777265126,-0.04016683196013676,0.06133934524099016,0.16920945909821844,,, +4.625,9,0.2812341178755136,0.3951357867074806,0.508608851325814,0.6193601700199949,-0.4482837743750699,-0.31542284769900103,-0.12237444926248142,0.11955984372443144,0.3956425109816272,0.688720704775603,0.9804153528085944,1.2523958453320716,1.4876514352103738,1.6716707086691078,,, +4.6328125,9,1.7934468947377458,1.8462389259365308,1.8280351946753053,1.7416876814493478,1.5947071165438382,1.3987334737438324,1.1687187342124896,0.9218789225257836,0.6764885057098107,0.4506012380993085,0.26078666342339163,0.12097039307799196,0.041459042270752144,0.028217828277232963,,, +4.640625,9,0.08245121543236222,0.2005158583636114,0.3741719220325063,0.5911552603173894,0.8360305596228292,1.0912659606429742,1.3384542262377188,1.5595953034591694,0.20500393366388905,0.19374145684546493,0.02768800647016245,-0.28086821530482986,-0.6972383482532718,-1.1696787192300215,,, +4.6484375,9,-1.6373940610265902,-2.039951844560288,-2.326641669293948,-2.464322206441148,-2.44253375192671,-2.2750803312103645,-1.9978351721457608,-1.6631115793074789,-1.3314761858147328,-1.062279906548317,-0.9043816251071096,-0.8885096103063138,-1.0224505549452072,-1.2898156936846252,,, +4.65625,9,-1.6525762884995805,-2.056973651308548,-2.4418832510037745,-2.7483301947582106,-2.928674019886325,-2.9540322180541585,-2.8187862192390587,-2.5414679641035063,-2.1618889150760072,-1.7349585959317944,-1.3221553529954408,-0.9819776904279612,-1.341282223602028,-1.6010176635620752,,, +4.6640625,9,-1.6241294495508516,-1.3741101489309815,-0.8895497013544116,-0.2737923313367804,0.3331603200715237,0.7928013720280853,1.0058717762347609,0.9393691545242762,0.6354118265177898,0.19953026692478365,-0.2284035916428663,-0.5126405101491535,-0.5588685577919442,-0.34015043547311496,,, +4.671875,9,0.09562588047352856,0.6388257202447343,1.1480914260528494,1.4890827226088432,1.5713161100380384,1.3730064305274845,0.9471017996788608,0.4068572279679164,-0.10510010484164978,-0.4557367023090728,-0.5579315954477831,-0.39419567229917546,-0.021292286482668173,0.4455055391447604,,, +4.6796875,9,0.7251494036635973,0.8238284175281074,0.9133790648611446,0.9919486905412862,1.057882733048598,1.109753853797381,1.146387083687875,1.1668805464738832,1.1706213959944245,1.1572966881267552,1.1268989970117886,1.0797266771342056,1.0163787665923858,0.9377446207287686,,, +4.6875,9,0.8449884575647731,0.7395290855816629,0.6230151687482111,0.49729646184092796,0.3643915196669148,0.2264524455420059,0.08572729622449009,-0.055479198458343364,-0.1948459135411376,-0.33007589918706204,-0.4589365329492434,-0.5792985509994882,-0.6891732749247111,-0.7867473822836734,,, +4.6953125,9,-0.8704146121206096,-0.9388038503001834,-0.9908031029118904,-1.025578937990006,1.7383508457411967,1.8611832157578088,1.9182995441618715,1.9043350126589096,1.8187277137605136,1.665758946067632,1.4542561333525776,1.196979081197509,0.9097323660107378,0.610265748088457,,, +4.703125,9,0.31703928135036635,0.047939226717563344,-0.18096569405562468,-0.35654098110856625,-0.4694981140573645,-0.5150378135322327,-0.4931799595565763,-0.4087571707485538,-0.2710725029853471,-0.09324514881827516,0.10871022376442624,0.31700627987830776,0.5133296633155346,0.6801245328037775,,, +4.7109375,9,0.8018234696190845,0.8659399067201389,0.8639458856982862,0.7918739172220468,0.6506009594407249,0.4457946954235931,0.18752583939116307,-0.1104265098704288,-0.7608632941226645,-0.6859899956179037,-0.7610797880185329,-0.9658592483210412,-1.259260200544694,-1.5858618775092317,,, +4.71875,9,-1.8845709454063384,-2.0981871844134923,-2.182364662309761,-2.112572383844972,-1.8879699828406016,-1.5315945158038131,-1.0868289761345515,-0.6107022860182739,-0.1650640350589887,0.1929917464819713,0.4199625242064049,0.4926569518780263,0.4117519777488293,0.201633607155579,,, +4.7265625,9,-0.09345360313897938,-0.4163483172088025,-0.7059239857911341,-0.9066557076980544,-0.9773120655631886,-0.8974179180008495,-0.670481330127098,-0.3234818425458059,0.09730038824366363,0.5334650989904596,0.923563812287765,1.2126502345708907,1.0870783277020812,0.7990133045628061,,, +4.734375,9,0.30409219926021,-0.2778227073438376,-0.8027079091552234,-1.1416327307294096,-1.2158822949662986,-1.018325310405713,-0.6151723984712263,-0.12764495743432272,0.30141962688147705,0.5468722407535875,0.5356921191056226,0.2671223642303981,-0.18701885303030408,-0.7019377425785661,,, +4.7421875,9,-1.1340042299691926,-1.3600752717453597,-1.3112252722518023,-0.9916393639278,-0.4774915197191942,0.10388518467516672,0.6088277171397295,0.9166265878211596,0.9624980375406306,0.7552091849531184,0.3745267470201358,-0.050810127934858895,-0.3785544594009864,-0.492132067812355,,, +4.75,9,-1.0425910551410196,-1.0416017279769412,-1.0226799540271796,-0.9862002394696904,-0.9328360399632016,-0.8635479724300286,-0.7795670041966264,-0.68237291384171,-0.5736684008901444,-0.4553492976775102,-0.3294714049556501,-0.19821453192660474,-0.06384437033804156,0.0713271298046534,,, +4.7578125,9,0.20498218911912675,0.33483772444682003,0.4586852616075968,0.5744295364780029,0.6801251085332245,0.7740103457960376,0.8545381861679415,0.9204031365637702,0.9705640371514548,1.0042621921538393,1.0210345498032245,1.0207217007319478,1.003470554813467,0.9697316496517238,,, +4.765625,9,0.9202511379182456,0.8560575939132418,0.7784438704433242,0.6889443237813099,-0.4315280454299959,-0.7576345075393232,-1.07024917279397,-1.3518049057154489,-1.5868813885690147,-1.7632726654674515,-1.8728305748318983,-1.912025272225124,-1.8821837736426257,-1.789389901849963,,, +4.7734375,9,-1.6440526296006417,-1.4601729370778491,-1.2543603241928971,-1.0446675754263186,-0.849325048386138,-0.6854627634012921,-0.567909421733366,-0.5081521150592746,-0.5135292828843873,-0.5867132089155472,-0.7255181564042527,-0.9230475340603504,-1.1681698418539068,-1.4462902185308368,,, +4.78125,9,-1.7403637987647866,-2.0320802250397625,-2.3031367234908617,-2.536510976366354,-2.717645037216712,-2.8354577374291914,-2.883114991801107,-2.8585042925231923,1.3608217321303706,1.3494215825636808,1.1839360251419264,0.8931349152694794,0.5245898457020237,0.1372678047939871,,, +4.7890625,9,-0.20764607843785887,-0.4562673444355654,-0.5703900319925812,-0.5334187235699746,-0.35293096814099817,-0.05947109831928527,0.29823654274622435,0.6609092356733579,0.96797508983641,1.167045894765551,1.222117959753261,1.1192233921873729,0.8686513601003888,0.5033931160625676,,, +4.796875,9,0.07405271853115603,-0.3589841357202179,-0.7349036981436544,-1.0018835851035053,-1.1251111868983108,-1.0921524485666931,-0.9148350968977332,-0.6273532813387996,-0.2808891295757123,0.06441077566802161,0.3488540117203458,0.5225487492141629,0.6728419693240355,1.3011038682802865,,, +4.8046875,9,1.8254789092325467,2.130804597847502,2.1614313450300005,1.93623814389782,1.54322660488756,1.1151770759787747,0.7930408321354471,0.6871034175157823,0.8465649899718418,1.2458765581431526,1.7915785862977476,2.3477692153583534,2.7732233729347526,2.95999071680008,,, +4.8125,9,2.8628948720885488,2.5118499152849507,2.003619138004036,1.475275174994486,1.066635481198452,0.8819684603042464,0.9614652314642532,1.270295346201999,1.7082453320650135,2.1372976077734736,2.4195902079924263,2.455352507514217,2.2104185433916155,1.7257758445190947,,, +4.8203125,9,0.5893078055798846,0.4814668947333434,0.3675039080244927,0.2496142847964389,0.1300679868752121,0.011169589722351186,-0.10478223628480854,-0.2155351448639612,-0.31892272529597376,-0.4129026126508056,-0.4955924293586698,-0.5653029286847043,-0.6205677596561403,-0.6601693321502089,,, +4.828125,9,-0.6831603291323165,-0.6888804892523603,-0.6769683658206387,-0.6473678561457887,-0.6003293867875625,-0.5364057338492817,-0.4564425513743754,-0.3615637735703052,-0.2531521463414689,-0.13282522889630954,-0.0024072855123025705,0.13610244049591202,0.280564515213913,0.4287365559560046,,, +4.8359375,9,0.5783122745145783,0.7269616383159159,0.8723714463955563,1.0122856098435082,-2.7643803080303755,-2.6081714372685374,-2.4014608117661664,-2.1591779388625536,-1.8985573565301703,-1.6379369164181952,-1.3954794941456106,-1.187907264707742,-1.0293368038226185,-0.9302962443149004,,, +4.84375,9,-0.8969930205407877,-0.9308832587537962,-1.0285728357870871,-1.182056999360726,-1.3792818335767705,-1.6049884091262956,-1.8417807444978327,-2.0713430967057542,-2.275721686148642,-2.438581466333911,-2.5463502887639,-2.589170664950352,-2.5615927437910373,-2.4629601678566075,,, +4.8515625,9,-2.2974618881254827,-2.073846309981952,-1.804817689532176,-1.5061568565509942,-1.195627563545471,-0.8917447090271632,-0.612490314700777,-0.3740667792664858,0.553221979996046,0.4312915511343328,0.1714017609002486,-0.18981689698230025,-0.5994151329238531,-0.9963368873141604,,, +4.859375,9,-1.3208971110390673,-1.524049265031462,-1.5749992385706333,-1.4659799221685468,-1.2134428952687797,-0.8554817229528263,-0.4458882827633591,-0.04576794576431481,0.2859803633703225,0.5018364222543499,0.5730546523318223,0.4941318070784201,0.2836505797266867,-0.01863220622751649,,, +4.8671875,9,-0.3579992139940119,-0.6733201142277004,-0.9066015684776474,-1.0120520765119183,-0.9632496329782688,-0.7572956188973949,-0.4153077467859144,0.02082492563165525,0.4949197101056738,0.9452020267625936,1.3138760716619626,1.556073988077729,0.023960904955070417,-0.20403948418818152,,, +4.875,9,-0.16002050240770482,0.11169472312904033,0.5041847821840872,0.8774769138755327,1.0971500790997275,1.0714120801567335,0.7764868953085607,0.26335227719972026,-0.35602092225177034,-0.9391581775845604,-1.351944978897664,-1.5052150309108432,-1.3790367053181571,-1.0280428690893928,,, +4.8828125,9,-0.5663444808281253,-0.13616364108286638,0.13121639979753918,0.15148127957910973,-0.0895795066827283,-0.5321734628436245,-1.0589103595954863,-1.527015463337226,-1.8075215827787856,-1.8206979051890824,-1.558004783039066,-1.0845562782353573,-0.5214143333587139,-0.012565820019411532,,, +4.890625,9,1.1445444315433453,1.26712219755419,1.3781624220457784,1.4760101287846907,1.5592406040595268,1.6266841177171134,1.6774461795811728,1.7109229766989684,1.7268117212455394,1.7251157280284668,1.7061441328207834,1.670506256587351,1.6191007144205418,1.5530994600199413,,, +4.8984375,9,1.473927045227981,1.3832354579186164,1.2828749789555969,1.1748615686446304,1.0613413538695182,0.944552837867938,0.8267874944803688,0.7103494369886416,0.5975148678670124,0.4904920196012004,0.3913822881309871,0.3021432395900717,0.2245541382105426,0.1601845991158185,,, +4.90625,9,0.11036691500537896,0.0761725414037071,0.0583931523292166,0.0575265982071973,-0.18977433186147274,-0.06909094710756525,-0.017018865263844773,-0.03374326961799179,-0.1146269054343505,-0.25054099844037137,-0.4285093795782684,-0.6326208818948696,-0.8451463680332618,-1.0477824773458508,,, +4.9140625,9,-1.222935345217393,-1.3549547599797191,-1.4312326791499972,-1.443089485636353,-1.3863861664085668,-1.2618197087528111,-1.0748810998385614,-0.8354788434635092,-0.5572542328256587,-0.2566361134663431,0.04829896279345619,0.3390817208719339,0.5981327809198843,0.8099834831138789,,, +4.921875,9,0.9623497980297048,1.0469844460421591,1.060247814723848,1.003357871632664,0.882301653841016,0.7074145141566616,0.4926564716213366,0.254636134986532,1.6467899273939088,1.5847192577043676,1.3924052244701317,1.1126705066460645,0.801889762568555,0.5211512946593522,,, +4.9296875,9,0.3266847436241596,0.26104604183484026,0.3464329061993129,0.5811723042849645,0.93992727064991,1.3775911352157872,1.8362628835160584,2.2542174565963458,2.575474065131695,2.758472436319863,2.782505842942096,2.650909142492618,2.3905054630052405,2.0473978911558683,,, +4.9375,9,1.679761785930766,1.3487604912692257,1.1089994926135165,1.0000059325046915,1.0400606751726782,1.2233436676505869,1.520837260716339,1.884846809893308,2.2564344451888605,2.57460813577518,2.7858347584044343,2.852395392332644,0.18856278147182606,-0.20030806488313246,,, +4.9453125,9,-0.6612787897276877,-1.0517148177165667,-1.248068937674049,-1.1799656180239326,-0.8497116999550275,-0.3318840299223561,0.2468950648523015,0.7424535879253121,1.0323847029462787,1.049407476930592,0.7996321657922908,0.3607257614062659,-0.13951788208459026,-0.5583286592749045,,, +4.953125,9,-0.7771966000584771,-0.7344394569526562,-0.4421748213821933,0.016955458958002212,0.5124113032295621,0.9015300234279272,1.0686465972108037,0.9568367566654504,0.5835827204283754,0.036067514186657074,-0.5526131812132163,-1.0398029733488126,-1.3122386374460364,-1.3169311352854636,,, +4.9609375,9,0.07376801201294891,0.10700621948273104,0.1568255163548301,0.22251278162456328,0.3030698023615158,0.397230594380959,0.5034834155819636,0.620097086594655,0.745151157954751,0.8765693956703933,1.0121559989371474,1.1496339159159297,1.2866845867493537,1.4209884179967849,,, +4.96875,9,1.5502652798612804,1.6723143171771584,1.7850523771419688,1.8865503809944444,1.9750670028371644,2.0490790659537814,2.107308124442085,2.148742764777618,2.1726562368629403,2.178619105894656,2.166506703563244,2.13650124816043,2.089088596513405,2.025049684657887,,, +4.9765625,9,1.9454468071596835,1.8516049753650183,1.7450886810256967,1.6276744721928669,0.01145026962974277,-0.2185800666506052,-0.4181886817448976,-0.5723694983439228,-0.6694238458820821,-0.7017767628139102,-0.6665053851987185,-0.5655425755295114,-0.40554159309884463,-0.1974112446681856,,, +4.984375,9,0.04444606651667293,0.30314025666640704,0.5604732923922542,0.7982104652279294,0.9993545539018304,1.1493340163829933,1.2370223479505182,1.2555175141264447,1.2026270973323916,1.081025316951473,0.8980709631069363,0.6652989293815532,0.3976207900543429,0.1122901560826351,,, +4.9921875,9,-0.17229505379401705,-0.4378699185648671,-0.6675703401963018,-0.8471029933095984,-0.9657358296003532,-1.017040081017104,-0.9993320348734188,-0.9157837902700472,2.7582813724607407,2.511712652331433,2.1438861022779245,1.7041485567572634,1.252346271079648,0.8495422197253004,,, +5.0,10,0.5485468695190839,0.38573709801450295,0.3754372779549643,0.5077374648866055,0.7500882663867998,1.052423722917998,1.3550140148781948,1.5978246179581956,1.7299238854473724,1.7174734886374623,1.5490568705442214,1.237515484884108,0.8180065228682794,0.3425843548596838,,, +5.0078125,10,-0.12785063352561488,-0.5329820847918766,-0.822418092815381,-0.9634874579506788,-0.9462777296683128,-0.7851305885332356,-0.5163618960986305,-0.19256175660337416,0.12563739819219,0.3790423358101359,0.5191531785679635,0.5157486359863066,-0.25846162798167793,0.04298178348100312,,, +5.015625,10,0.11774459232845648,-0.08070257881085374,-0.5239603728046041,-1.116249185888684,-1.7204244968558606,-2.1953311821760324,-2.434261269872412,-2.3939771296288206,-2.106347771926425,-1.6694110795424657,-1.2203134364086006,-0.8975449700692152,-0.8028222483366123,-0.9730667510375072,,, +5.0234375,10,-1.3701603328884802,-1.8912865853884369,-2.397024849115857,-2.749497970388516,-2.850119270257223,-2.666593835470402,-2.2417741027112505,-1.6819426927954129,-1.1277336165044578,-0.7156610684531758,-0.5407990007863878,-0.6308390770557637,-0.938635944294833,-1.3552817615728632,,, +5.03125,10,1.501319821596434,1.3681288326441423,1.230315383541526,1.0901643548918032,0.949991619687944,0.8121034962762324,0.6787563742727389,0.5521172203793829,0.4342256556390873,0.3269582681484394,0.23199578610056104,0.15079368594480302,0.08455675029574382,0.03421802106296579,,, +5.0390625,10,0.00042251630834932996,-0.016484004077626846,-0.016461027196683187,0.0002260743712916291,0.03301076556202144,0.0810353505627186,0.14316607811941895,0.21801308587758228,0.30395483448524185,0.3991666035676069,0.5016525505569982,0.6092807709740389,0.7198207461957087,0.8309825229413802,,, +5.046875,10,0.9404569383795574,1.0459561864485047,1.1452540150065793,1.2362248498872366,-0.7741952884926684,-0.5864435307644357,-0.3676474077111154,-0.13510639639245184,0.09291285016237402,0.2984573889245879,0.465147010988419,0.5793235909615002,0.6310105967019681,0.6146158326517928,,, +5.0546875,10,0.5293283952340829,0.3791821424675476,0.1727812351378767,-0.07729312811154304,-0.3553534278064613,-0.6436932909307586,-0.9238158916207933,-1.1777176403280532,-1.3891376606818686,-1.544685938598336,-1.6347714882955175,-1.654265824842084,-1.6028554902653855,-1.4850590629762457,,, +5.0625,10,-1.3099074763341632,-1.0903099500905944,-0.8421497610308953,-0.5831729176431644,-0.3317472444260178,-0.10557841748799146,0.07952750570914857,0.2107687625331014,0.36162072355931296,0.0737213783535462,-0.30945773295652523,-0.7338641981431173,-1.1382914503078134,-1.4639036471941815,,, +5.0703125,10,-1.6633953203579177,-1.7083591411385992,-1.5937142245729117,-1.338505208104528,-0.9829475920775028,-0.5821794729689129,-0.1976927768524387,0.1122214890105676,0.3015258957456833,0.3435773142631292,0.2352436611605581,-0.002644351356121621,-0.3285766238451245,-0.6868706133223451,,, +5.078125,10,-1.0163880931262188,-1.2601038069120745,-1.3740353966209768,-1.3341434594130253,-1.14012674323375,-0.8155210821830403,-0.4040863792853904,0.03695590365625065,0.44578174192295816,0.7655404846418585,0.953156519887445,0.9859860504998392,-1.9235907056320096,-1.6112002322852446,,, +5.0859375,10,-1.0758446828914012,-0.4312863997956302,0.179399517424513,0.6227948845454189,0.8114592607308422,0.7276496603981073,0.4279404635156181,0.027479499796154744,-0.331802645480717,-0.5203151765909939,-0.4565371951919368,-0.1295609453768337,0.3977319914920213,1.00573368160548,,, +5.09375,10,1.5507370351641727,1.9041864038446272,1.98779532175892,1.794907642327193,1.392248404916019,0.9015851536468872,0.4663261696696118,0.21221021154335307,0.2128614906116707,0.4696499857873294,0.9113763327732928,1.4138670009457541,1.8341084640042864,2.049564181715065,,, +5.1015625,10,1.3168811607242306,1.3854084141929441,1.4401970025576003,1.4798705883734318,1.5033103689417495,1.5096748355606875,1.4984146814954868,1.4692825975370416,1.4223377835325632,1.357945096792711,1.2767688521858591,1.1797613823762043,1.0681465584102852,0.9433985590978772,,, +5.109375,10,0.8072162608255379,0.6614936961238234,0.5082870981446164,0.34977910798289563,0.1882407714536752,0.02599199064125382,-0.13463887740915073,-0.29135556755299674,-0.4419338891112137,-0.5842604441702853,-0.7163694037868586,-0.8364766982754537,-0.9430110230362118,-1.0346411171418242,,, +5.1171875,10,-1.1102988371671618,-1.1691976223707303,-1.2108460280358089,-1.235056090135584,0.2792427282766825,0.2805685202490241,0.21519394182628715,0.08836535819913237,-0.09023739879340208,-0.3071756399537822,-0.5461889011235314,-0.7893291537642859,-1.0182130515974754,-1.2153048893160951,,, +5.125,10,-1.365140806911452,-1.4554088694586875,-1.4778097016538727,-1.4286376581982705,-1.30904199824646,-1.1249498456803424,-0.8866563009414687,-0.6081102799725038,-0.3059458729864616,0.0016732392306623713,0.2963157383977546,0.5605630013167613,0.7792185410754601,0.9403622301166352,,, +5.1328125,10,1.0361758028780386,1.0634820856958576,1.0239603649235172,0.9240228886547804,0.7743611281606406,0.5891934543171501,0.3852667060043893,0.180681289748436,0.8652924373636859,0.6159990868372336,0.28275864474204904,-0.07704899383606345,-0.4022990057707577,-0.6376850025354308,,, +5.140625,10,-0.7423736562223751,-0.6964023644731677,-0.5038232776488938,-0.19210379808107947,0.1921232482612364,0.5902979923908862,0.9410331791042,1.1896579015275548,1.2967190281115335,1.2441162617362391,1.037915324489146,0.7074011404155283,0.3005185077587686,-0.12358960126340054,,, +5.1484375,10,-0.5037839363146239,-0.7864378598672118,-0.9337722372279208,-0.9297182068888038,-0.7823947780225171,-0.5228154798550019,-0.20002565144867893,0.12657207497472778,0.3965085731756973,0.5577080197090022,0.5746430660586835,0.4339149517181694,1.1481466178992938,0.5665872478611649,,, +5.15625,10,0.06528298734313531,-0.2346677640588335,-0.2681471069079282,-0.043644242481159716,0.3592951375528292,0.8120954846362353,1.172615056495974,1.3243249374783752,1.2084635030916375,0.8403516827561455,0.305395490839656,-0.2641305090192605,-0.7251576693032693,-0.962870424615118,,, +5.1640625,10,-0.922026065893254,-0.6219647268520518,-0.15119704706882192,0.3569460524752636,0.760926923509987,0.9498426985230178,0.8738489609738329,0.5578270665056961,0.09454922299215096,-0.3807853062682559,-0.7276636893980419,-0.8388504821135117,-0.6698787038282326,-0.2513574962759908,,, +5.171875,10,-1.2419463749910065,-1.231939660655618,-1.2057552907612463,-1.1643963348425568,-1.1091317800985276,-1.0414740665476947,-0.9631523590706343,-0.8760820244822649,-0.7823308482232767,-0.6840825823522577,-0.5835984632467965,-0.4831773729717744,-0.3851153420246646,-0.291665102695964,,, +5.1796875,10,-0.20499640140010367,-0.12715776503969325,-0.060040391005554576,-0.005344793231775835,0.035449211537362024,0.06110865159614344,0.0706692242638407,0.06345241374178677,0.03907760297809471,-0.0025310326655682003,-0.061142970780862727,-0.13622515366053412,-0.226951099808562,-0.33221515579402816,,, +5.1875,10,-0.4506516390218113,-0.580658536351614,-0.7204253437228456,-0.8679645594329509,-0.006378244041551295,-0.15891861115207606,-0.26233023513776266,-0.30541355098429923,-0.28116758656830754,-0.18728581458099905,-0.026324680411207942,0.1944669632621457,0.4636456384154472,0.7663635455735665,,, +5.1953125,10,1.0853962965465516,1.4023364261707123,1.6988694728064229,1.9580436594194808,2.165444653132662,2.3101935000910543,2.38569816276634,2.3901062686073864,2.326427514088596,2.2023172038106686,2.029536034028268,1.823123806037351,1.6003447029614464,1.3794776925707062,,, +5.203125,10,1.1785364180873152,1.0140078553836114,0.8996977057413033,0.8457630497093586,0.8579997286309795,0.937434156771569,1.0802480373662249,1.2780412407422743,0.1463891898139953,-0.2544460672188226,-0.717643547448006,-1.1826782872482084,-1.5888196689189624,-1.8845346059739567,,, +5.2109375,10,-2.0354575674681445,-2.029686358518065,-1.8795791036619407,-1.6197728362026569,-1.3017326003437388,-0.9856803612136068,-0.7311611224784992,-0.5877159077377709,-0.5871146102438056,-0.7383587493111489,-1.026232734377032,-1.4136295277573137,-1.8472887022373683,-2.266053377550003,,, +5.21875,10,-2.6103601763884896,-2.8314842755332883,-2.8990997561329843,-2.8059778405824822,-2.5690913742568253,-2.2269536375405297,-1.8336060767735287,-1.4501914710636656,-1.1354251124038142,-0.9364481958846764,-0.8814880645063766,-0.9754685048415419,1.363330447588921,1.591498729581998,,, +5.2265625,10,1.5481143163816444,1.2675434022615035,0.8495865202423593,0.43190192540724137,0.15204878009392409,0.10955509519680716,0.3384086223034881,0.7975122789182438,1.381722135219381,1.950444894147397,2.3659592126801448,2.5309601262492407,2.4150386710818346,2.0628412205913813,,, +5.234375,10,1.5816739670908022,1.1119513081025012,0.7885887125374463,0.7039223208303244,0.8823189225776478,1.2734357855924132,1.7659782499975694,2.2181849770959805,2.496685988846913,2.5130836951929787,2.2482309589040868,1.7575519137330025,1.1559466609387832,0.586416217752037,,, +5.2421875,10,-1.021146279738486,-1.177735291126929,-1.3354300098868244,-1.4919025872571556,-1.6448394780258138,-1.7919817623284182,-1.931164514720596,-2.0603545312744083,-2.1776857541999632,-2.2814917738069544,-2.370334838793132,-2.443030866984996,-2.4986700186838817,-2.5366324724677356,,, +5.25,10,-2.556599127300637,-2.5585570436396403,-2.5427995283458062,-2.5099208619903712,-2.460805760955726,-2.396613758920965,-2.318758781281612,-2.228884270219816,-2.1288342960483257,-2.020621160727522,-1.9063900608733075,-1.7883814290609947,-1.6688916128769966,-1.5502325802762853,,, +5.2578125,10,-1.4346913568477533,-1.3244899052808463,-1.2217461495828248,-1.1284368265451885,1.5184145208183024,1.7858314421826502,2.0626994189411474,2.33059448638128,2.571544402758488,2.769280610154424,2.9103717541025294,2.98515972013156,2.9884329156766967,2.9197898476909487,,, +5.265625,10,2.783667642122547,2.5890335152619413,2.3487607095711507,2.0787324090794783,1.7967361174606993,1.521225592805976,1.2700366679968582,1.0591465005071083,0.901562766215884,0.8064202496526302,0.7783478199468318,0.8171499261818962,0.9178248127207824,1.0709181738422755,,, +5.2734375,10,1.2631875751306625,1.4785312976806153,1.6991168215441923,1.906630242793688,2.0835594849532235,2.214421808454943,2.2868500055703245,2.2924615221408065,-1.1992537827683285,-1.512644113402808,-1.860655933059444,-2.182108695549947,-2.419180642003144,-2.5264450514134627,,, +5.28125,10,-2.4779793784339663,-2.271439825108622,-1.928466525973485,-1.4913560362914884,-1.0165191854603983,-0.5657430401283154,-0.1966177303989209,0.04638104189668113,0.13876512990649748,0.07979244981924705,-0.10747425776076892,-0.37981728026210815,-0.680653626014684,-0.948906734553988,,, +5.2890625,10,-1.128578094803537,-1.1775276473764429,-1.0740950849339879,-0.8205304592081206,-0.4426994752535621,0.013890903286172512,0.4911277756013324,0.9272930251113614,1.2666277824000276,1.4679711539445448,1.5111279160223354,1.3999735848136032,0.13262874025441562,0.4454753718022773,,, +5.296875,10,0.8465671703288609,1.193740447329258,1.3585966430396763,1.261925557709739,0.8956540314631085,0.32530248014136465,-0.32772613355653984,-0.919173010091979,-1.3212164521356518,-1.4572641751870858,-1.322711579622767,-0.9859788235133208,-0.5695444461762307,-0.2161755411779049,,, +5.3046875,10,-0.049611545389768086,-0.14047867829110527,-0.4867783566555718,-1.0142984620511544,-1.5968359118852835,-2.090689119688875,-2.373967791643175,-2.379947021506561,-2.1153247221617457,-1.6583787677943247,-1.1375288985786702,-0.6961786983454024,-0.4534729702549416,-0.4717251007725916,,, +5.3125,10,-1.0463628149627728,-0.9771175497184408,-0.9220590738276536,-0.8822862178347601,-0.8586193236779305,-0.8515858505649468,-0.8614111149137635,-0.8880143265119347,-0.9310099903091388,-0.9897146493018776,-1.0631588504437892,-1.150104124056891,-1.249064679430263,-1.3583334367078708,,, +5.3203125,10,-1.4760119392378157,-1.6000436226032806,-1.7282498577782164,-1.8583681372731569,-1.9880917356075989,-2.1151101496299924,-2.2371496105449102,-2.35201295825029,-2.4576181797503787,-2.5520349367968618,-2.633518443119139,-2.700540098007158,-2.751814339805261,-2.7863212490612383,,, +5.328125,10,-2.8033245054940097,-2.802384384296554,-2.7833655641470565,-2.746439610146234,2.2274498842200714,2.092857171931039,1.8945085240910613,1.6426132245256944,1.3510601710451655,1.0364568395000089,0.7169787420476611,0.4111095934530144,0.13636002041648487,-0.0919458548873957,,, +5.3359375,10,-0.2617313589867526,-0.3650017732994568,-0.3983942268134281,-0.3634046466565818,-0.26627595760167605,-0.11755534357045773,0.06864853864877107,0.27565658021917594,0.4853893524545964,0.6796347375677797,0.841324646602257,0.9557317799016884,1.0115029615848752,1.0014569761655892,,, +5.34375,10,0.9230912579680516,0.7787620871279272,0.5755257139495521,0.3246514785139383,0.04084086585813024,-0.25879305627215715,-0.5559146601456152,-0.8322403363258891,1.1618134294565283,0.8430954468120284,0.5021451893070346,0.20005418139634767,-0.008858770176557007,-0.08552756241556891,,, +5.3515625,10,-0.012239187051928946,0.20459571008523814,0.535433678373485,0.9321964173046694,1.335759687177467,1.6851667230895813,1.9271310782985696,2.0243487220834395,1.961324661654173,1.7468064635665823,1.4124455238342142,1.0078944650124195,0.5931041123169183,0.2290196637516867,,, +5.359375,10,-0.031875013321664425,-0.15369238715414135,-0.12268871631190716,0.05063985979610508,0.33323882820142275,0.6746922495073518,1.0151254291138259,1.2945821578718522,1.4624156888311055,1.4852304720246292,1.3521373925349365,1.076503690837708,-1.6472272530332317,-2.015265672749889,,, +5.3671875,10,-2.163587743624434,-2.0357832997052543,-1.6498075393719145,-1.093268211756614,-0.4996312669698671,-0.011864231337021192,0.2565205421252108,0.2523480155840887,-0.002873710077956005,-0.4190734980944325,-0.8625237426664054,-1.1927051770065011,-1.3010243694593822,-1.1407706717089652,,, +5.375,10,-0.7401004875360438,-0.19448855073085136,0.3592864887487068,0.7804938308300862,0.9629039142666403,0.8638056038217521,0.5156353470377145,0.0170318170523244,-0.4942317841114317,-0.8790190016095855,-1.0349528997020392,-0.9244421191081316,-0.5849294224002568,-0.11855441630349248,,, +5.3828125,10,-2.6920820881371377,-2.621064360865247,-2.5344402095545,-2.43352751507906,-2.3198853194140643,-2.1952866689365242,-2.061687715005781,-1.92119361278339,-1.7760218153143332,-1.6284634054966882,-1.4808431429207265,-1.3354789250603385,-1.194641372549523,-1.0605142461042836,,, +5.390625,10,-0.9351563880843594,-0.8204658549909803,-0.7181468688328232,-0.6296801659302363,-0.5562972622387896,-0.4989590856920314,-0.4583393495958032,-0.4348129580892879,-0.4284496465748561,-0.4390129683533264,-0.4659646450877979,-0.5084742047980293,-0.5654337385003728,-0.6354775169815561,,, +5.3984375,10,-0.7170061240908038,-0.8082146838508044,-0.9071246870048696,-1.011618859588444,-1.0708097558244811,-1.2571651749547494,-1.3803565534501263,-1.4337024022375555,-1.4152533102311176,-1.327925831855688,-1.1792974030039505,-0.9810765898831086,-0.7482856144605503,-0.4982121632606485,,, +5.40625,10,-0.2492035740417713,-0.01938748554972658,0.17459183732650962,0.3187333845861893,0.40265460862258495,0.4203139571760509,0.3704303513128448,0.2565703617937267,0.0868970104281217,-0.1264022802517376,-0.36796869089992135,-0.6203464722215422,-0.865203940133319,-1.0846158459683857,,, +5.4140625,10,-1.2623176879204412,-1.3848444858915097,-1.4424745980052656,-1.4299127515114038,-1.3466646456317628,-1.1970769910217114,-0.9900401801668336,-0.738374308365457,0.6939247153697911,0.2567331275696045,-0.17409950806369956,-0.5384076627984022,-0.7861524910600824,-0.8851667184027678,,, +5.421875,10,-0.8261177267759315,-0.6239160647321869,-0.31535024318179056,0.04668355888853768,0.4014579069132827,0.6899073429707695,0.8638596286695489,0.8935670123524749,0.7723643318340968,0.5177282925946541,0.1685728161479373,-0.220798375269042,-0.5891400984460354,-0.8777991570699303,,, +5.4296875,10,-1.0398480493530355,-1.0473963277616307,-0.8959408224598513,-0.6050771316665121,-0.2154615131166973,0.21750369001448355,0.6322776488609725,0.9707411034046992,1.187219970323914,1.2555671756611808,1.1731998433845106,0.9614632072637446,0.6996840817963241,0.4793326970709003,,, +5.4375,10,0.023717674803006072,-0.5603276496820501,-1.1316661719390853,-1.5533337066385948,-1.7298631745595725,-1.6332288599098037,-1.3103022725933111,-0.8697783108905182,-0.4521570215008487,-0.19101021321541334,-0.17615072766825335,-0.4288006767329736,-0.8955663472558941,-1.4628730594532229,,, +5.4453125,10,-1.9879057163401048,-2.337576959709104,-2.4248445981874407,-2.2324263184226565,-1.817413563229682,-1.2955212591503975,-0.8092911006691391,-0.4889637595691475,-0.4167444203575663,-0.6042558326572786,-0.9893585634587896,-1.4532099561876801,-1.8528862732932367,-2.0606268909168786,,, +5.453125,10,-1.1194784628498966,-1.2284223712684366,-1.3361472442840123,-1.4403680882026484,-1.5388584979055848,-1.6294898736004908,-1.7102689257956616,-1.7793728116533414,-1.8351812873521325,-1.8763053133358296,-1.9016116114386088,-1.910242743755897,-1.9016323615461683,-1.8755153570209544,,, +5.4609375,10,-1.8319327401299024,-1.7712311548142123,-1.694057043063578,-1.6013455588295873,-1.4943044257781113,-1.3743930213974362,-1.2432970535649646,-1.1028992728526703,-0.9552467332657341,-0.8025151745459543,-0.6469711495751467,-0.4909325598957376,-0.3367282902428033,-0.1866576487577689,,, +5.46875,10,-0.04295032295767043,0.09227244749420982,0.21703480147756715,0.3295406440300427,-0.4579413454612339,-0.16654535444923269,0.11730256714318445,0.3756685142396625,0.5924396323453655,0.7544408849366067,0.8523468708964874,0.8813251247976629,0.8413660575463395,0.7372765465871772,,, +5.4765625,10,0.5783376397340091,0.37765025915924455,0.1512145488164637,-0.08319291757872796,-0.3072657551307887,-0.5034512653343479,-0.6561812935163289,-0.7529645979965743,-0.7852645402726754,-0.749100876048973,-0.6453336665660784,-0.4796094967883728,-0.261973735805029,-0.006175863149629811,,, +5.484375,10,0.27128371131710605,0.5522988793635415,0.8184152706827503,1.0521122211212728,1.2380198891717653,1.3639866587732747,1.4219224058499187,1.408358835094639,0.6622647617440088,0.3315031124603232,0.030315243398469364,-0.1844942764311468,-0.2693511951761096,-0.20075043366714995,,, +5.4921875,10,0.021029562739359745,0.3719157825910607,0.8077349195852714,1.2710378417510244,1.6999916019468302,2.0379543041738253,2.2422417818642213,2.290720922396915,2.1852029804159976,1.951108636675248,1.6334572484727,1.2898052568941851,0.9812338922024764,0.7627901406667635,,, +5.5,11,0.6748700820917399,0.7368869154124816,0.9442101236440444,1.2688527173005202,1.66379969641534,2.0703037153482606,2.427011759275148,2.679501432945376,2.7887416437696406,2.7371599727115994,2.531371777146787,2.2011460020212783,-1.117229122550224,-0.4872274815380819,,, +5.5078125,11,0.08389210032702654,0.4696989806427641,0.5959176921005069,0.4605708914600618,0.13429699348214774,-0.25924258926074795,-0.5774947590323699,-0.6983281150162195,-0.5537516310307375,-0.14879517427364894,0.43962489684643397,1.0835463100385658,1.6387979762878515,1.9842878676370777,,, +5.515625,11,2.054976034169212,1.859497737529336,1.4776085082540646,1.038153010517889,0.683597293883156,0.5308464263505642,0.6390873985266643,0.9934715920373738,1.5091097663300024,2.054285269180801,2.4865238351808943,2.691634525163204,2.615021850767888,2.2766871564408984,,, +5.5234375,11,0.42820488888291497,0.5116810089807605,0.578884412692979,0.6290112365164506,0.6615522253227353,0.6763014572189957,0.6733597603599035,0.6531327619899974,0.6163236039825862,0.5639204525293737,0.4971790207865232,0.41760041060301,0.3269046614191585,0.2270004695856439,,, +5.53125,11,0.11995160840919915,0.007940636997310957,-0.1067694665555884,-0.2218750757534746,-0.3350723935947804,-0.4440979289324081,-0.5467682624828171,-0.6410184061100949,-0.7249380836433011,-0.7968052978851835,-0.8551165959886863,-0.8986135031940183,-0.9263046620132844,-0.9374832891489596,,, +5.5390625,11,-0.9317396444233592,-0.9089682933370792,-0.8693700360417679,-0.8134484689058282,1.3246878224206975,1.1770611514895035,0.9759586440717576,0.7354548072088527,0.4722351427695442,0.20443072106013707,-0.04964770761466325,-0.272787784797344,-0.4500766717117074,-0.5699414720259549,,, +5.546875,11,-0.6249563957850195,-0.6123603774545062,-0.5342490527994426,-0.3974277081422528,-0.21293545784253232,0.004726167035224549,0.2386064227377941,0.4704896916087996,0.6821683631626598,0.8567154898342393,0.9796684647302872,1.0400411726630812,1.0310940260991164,0.950808180384574,,, +5.5546875,11,0.8020308504138712,0.5922815853630363,0.33323299991273864,0.0399021609295088,-0.2703909951302484,-0.5792255937262045,-0.8683583012050939,-1.1209892124234446,1.7947688072365977,1.3715271572171028,0.9924830785762094,0.7109755082066987,0.5643290624860843,0.5680610533927397,,, +5.5625,11,0.7134889420226124,0.9691107642760458,1.2855433841016617,1.603249260915871,1.8618480744475727,2.0095626836690763,2.0113279574978105,1.8542992650509824,1.5499024164184323,1.1321055198835532,0.6521816668638387,0.1707779181622065,-0.2514743855008706,-0.5633457762435701,,, +5.5703125,11,-0.7309296190129118,-0.742864438292803,-0.612044499897181,-0.37355251001958795,-0.07913671835421587,0.21090706262976144,0.4371838157217904,0.5505061394993624,0.5196096682262255,0.3360751049259028,0.01568997544035966,-0.4039622458721517,0.7705846867154348,0.5399704005003498,,, +5.578125,11,0.574992618210952,0.8513594689121168,1.2768598731516434,1.7168237382745417,2.0312311273407664,2.113298004136011,1.9189613791630291,1.4791808084186282,0.8916826636006271,0.29440767610818114,-0.17206317508552094,-0.4028086522805141,-0.35709838004377825,-0.06933766340820935,,, +5.5859375,11,0.3605716170640953,0.7948103000280495,1.095600926835265,1.1631412683415656,0.9631143593126767,0.5362339185695679,-0.012792244607537771,-0.5438571524240706,-0.9197718297433352,-1.0438038771565867,-0.8861497906802297,-0.4920860974237734,0.03043454315785728,0.5403428123844121,,, +5.59375,11,-0.7420012388380448,-0.6561061434663691,-0.5571023205215023,-0.4465668557655582,-0.3262872190297329,-0.1982300109791783,-0.06450656782321043,0.07266397378831356,0.2109935049678467,0.3481649860265797,0.4818730000298957,0.6098641083899345,0.7299763018733703,0.8401768562404748,,, +5.6015625,11,0.9385979296629696,1.023569278604593,1.0936475193032087,1.1476414224738507,1.184632798308629,1.2039926060594128,1.205392006102656,1.1888081609404528,1.1545246835335992,1.1031267250848928,1.035490788250107,0.9527694441090556,0.8563712204600801,0.7479360135490238,,, +5.609375,11,0.6293064537245521,0.5024957263547489,0.36965241140666977,0.23302295728827666,-1.3229268867381898,-1.4635713052554615,-1.5366462195845454,-1.540629838470561,-1.4788538348969995,-1.3592637856436585,-1.193857764962003,-0.9978422576193792,-0.7885642689928296,-0.5842941165564413,,, +5.6171875,11,-0.40294379970708427,-0.2608103372887169,-0.17143172116215044,-0.14463528110383828,-0.1858448388421172,-0.29569498278994394,-0.4699793784253336,-0.6999367357650625,-0.97285450929222,-1.2729482489873492,-1.5824552988251752,-1.8828665916772267,-2.156210659323168,-2.386300334782109,,, +5.625,11,-2.5598552253537337,-2.6674216972211378,-2.704026232160303,-2.669516609203658,-2.568567132529315,-2.410347553403598,-2.2078787850950565,-1.9771203499739631,-0.8693103694899761,-1.3190966441153928,-1.6938780913639713,-1.94524833309312,-2.043343741094588,-1.981464947421561,,, +5.6328125,11,-1.7770940333046457,-1.4691490878256201,-1.1119038575411688,-0.7665196179007598,-0.4915082859161731,-0.3336122375926172,-0.32052136870183057,-0.4565617560740205,-0.7220274130719652,-1.0762591808405368,-1.4639911400428212,-1.8239759738553607,-2.0985457343500302,-2.24261875095728,,, +5.640625,11,-2.230749667193357,-2.061124366865335,-1.755877383302195,-1.3576821615023913,-0.9231450505808574,-0.5140317255311265,-0.1876923348098395,0.011823538910482044,0.06057847005968042,-0.0415753415442498,-0.2710252365519711,-0.5841290729937989,0.8769844889840596,0.5148789160899068,,, +5.6484375,11,0.04698056062248025,-0.385542994996344,-0.6498888246809221,-0.6581931025161049,-0.3918018682842291,0.09341558505872832,0.682168857153713,1.2311270756011634,1.6079795993437895,1.727473540695519,1.57455344860131,1.2082634150088314,0.7453442974753635,0.3280236793011513,,, +5.65625,11,0.08482843404432694,0.09516198626223094,0.3673564818622729,0.8362169072958191,1.3807319161274088,1.8570988941888449,2.13801346895696,2.147456607348638,1.8814462453222964,1.4090669068189936,0.8534957863155876,0.3582259375333795,0.04774403471879052,-0.0065601993750701295,,, +5.6640625,11,0.09491244597557263,-0.042355663637186035,-0.17648010933800584,-0.30522200577350417,-0.42644392772047457,-0.5381472121788973,-0.6385068262054071,-0.7259031900323458,-0.7989503983318468,-0.8565203455569423,-0.8977623330119602,-0.9221178144227358,-0.9293300219036148,-0.9194483038647204,,, +5.671875,11,-0.8928270989987313,-0.8501195644108888,-0.792265969563703,-0.7204770593596519,-0.6362126777788512,-0.5411560264759039,-0.4371840091760071,-0.32633418124828617,-0.21076888327892607,-0.09273718677876734,0.02546468153241603,0.14153374377748218,0.2532007957185043,0.35827034259183244,,, +5.6796875,11,0.4546592465839944,0.5404334091122165,0.6138418454788837,0.6733475551298373,-1.735853204535301,-1.5024358563566054,-1.2945205220631872,-1.127818861130316,-1.0150033625304706,-0.9648210009843352,-0.9814809765678968,-1.0643592379447004,-1.2080403983691754,-1.4026941253315852,,, +5.6875,11,-1.6347597599913868,-1.887891427882276,-2.1440977366639813,-2.3849965866893204,-2.5930975921477533,-2.753022684337236,-2.8525797785490954,-2.8836146315673363,-2.842581483437588,-2.7307926864213865,-2.5543299084930595,-2.3236230974338805,-2.052726558911848,-1.7583426223845895,,, +5.6953125,11,-1.4586609694220063,-1.1720945527732032,-0.9160002448551864,-0.7054734185288579,-0.5523005068434944,-0.4641425714232026,-0.4440067996046149,-0.4900427716725858,-0.924066609650964,-1.2297438680946928,-1.4453632814239885,-1.5291687375171197,-1.460003140236482,-1.24065682648799,,, +5.703125,11,-0.8974850222510172,-0.4763536431149772,-0.0355446315773289,0.3632744000350153,0.6646099477566589,0.8277430707736078,0.8330311856053432,0.6849298773995246,0.4112642659944943,0.05886360027373001,-0.3137608160001856,-0.6455537645642823,-0.8824468734122738,-0.9857974184568772,,, +5.7109375,11,-0.9384206846494008,-0.7472762410337151,-0.44238967526562906,-0.07217770094377464,0.3040952343023228,0.6255539071304818,0.8392041075067072,0.9082008106962012,0.8176048487406248,0.5767313572113092,0.21772410229532013,-0.2094223868098697,1.0145521851671453,1.3660308752793946,,, +5.71875,11,1.5095883221823354,1.3792594093940664,0.982476970794141,0.3982204155235507,-0.2444301996293393,-0.8014587179821048,-1.1531603722576649,-1.2367176237927338,-1.0631783396876446,-0.7141852087951407,-0.3193549176005751,-0.020508949816771867,0.0674385484194997,-0.11178578492699998,,, +5.7265625,11,-0.5401590781878538,-1.1300775290616245,-1.7481521287254218,-2.2515650108718623,-2.5270240280716774,-2.5216409341549344,-2.2572719056713333,-1.8243914552606249,-1.3571799035631402,-0.9966531959608328,-0.8519408954925146,-0.9703255158001332,-1.324254935135799,-1.8188876140607844,,, +5.734375,11,0.7176546468537259,0.7457312438327546,0.7568277673512909,0.7504902788848751,0.7265686468204796,0.6852193946779523,0.6269031808281852,0.5523769537057733,0.4626809197446652,0.3591205520941845,0.2432439550075468,0.11681498011748155,-0.01821743480365573,-0.15975316785664412,,, +5.7421875,11,-0.3055774623135178,-0.4533994833599985,-0.6008922072893537,-0.7457329448257266,-0.8856437891488929,-1.0184312805120284,-1.1420245930610042,-1.2545115753381113,-1.3541720135364326,-1.4395075351979671,-1.5092676298748708,-1.5624713312637188,-1.5984241812888702,-1.6167301792234587,,, +5.75,11,-1.6172985067467591,-1.6003449113090318,-1.5663877237059634,-1.5162385797192188,-0.5956776917486173,-0.7500811383592231,-0.9389269117796328,-1.145398837294694,-1.3513703712861196,-1.5386757368542203,-1.6903839326886918,-1.7919867582429685,-1.8324179939061669,-1.804832648738623,,, +5.7578125,11,-1.7070919193933205,-1.5419200253837304,-1.3167219668508932,-1.043074895856487,-0.7359285521603185,-0.4125705023007588,-0.09142832185679743,0.20920776867955432,0.472452756841385,0.6839967854416756,0.8330956267224279,0.9133126309633974,0.9229604273147226,0.8652115915312463,,, +5.765625,11,0.7478705789250167,0.5828228415145691,0.3851995589018297,0.17231624310419313,-0.037540754427036416,-0.226395199631078,-0.3778400586173917,-0.478186894435133,-0.6446177006092262,-1.0269997504581316,-1.30437617864429,-1.4413126278207595,-1.4246082937823283,-1.2653061436438808,,, +5.7734375,11,-0.9969249380867656,-0.6701886815062856,-0.3450746778773572,-0.08141902001456336,0.07045696559681525,0.07763905444290352,-0.07019832034866746,-0.359128637233864,-0.7530873600356243,-1.1994345294244435,-1.6370997586278386,-2.0060412935274545,-2.256546120051349,-2.3569228532249364,,, +5.78125,11,-2.2983894672805487,-2.096394835416888,-1.7881684903097554,-1.4268804792382035,-1.0733211703642396,-0.7863971332510771,-0.6139236041730501,-0.5851478358964722,-0.7061680200785988,-0.9589614517439418,-1.304173428082789,-1.6872326002393778,-2.8045776938876594,-2.644278730092486,,, +5.7890625,11,-2.234073793678387,-1.673275788321294,-1.1003103316509593,-0.6549376990047027,-0.44012481325748,-0.4940153785051051,-0.7796785295810544,-1.1954437005250642,-1.6029872565273493,-1.8654711326957167,-1.885278712988509,-1.6310035298447525,-1.1462918269604947,-0.5381133417181384,,, +5.796875,11,0.0523272061348089,0.4880677292992355,0.6737119678849395,0.581371052615244,0.2581154895965776,-0.187103057064588,-0.6134742278879529,-0.8870659563175814,-0.9176580330561942,-0.6835761400117439,-0.23771914077515946,0.3068730306029076,0.8079560349608025,1.1330438940124472,,, +5.8046875,11,-1.4509880084084592,-1.3719861395249175,-1.280818867978205,-1.1792798928327637,-1.0693391205475615,-0.9531079858298525,-0.8328022974475869,-0.7107032596791554,-0.589117352021583,-0.4703357697706318,-0.35659413576968746,-0.2500331888778282,-0.1526611376006568,-0.06631833816861554,,, +5.8125,11,0.007355084353715235,0.06694810488146685,0.11130365146120368,0.1395390074936398,0.1510614056979004,0.14557854068191978,0.12310381596235245,0.08395623347822978,0.028754927455726945,-0.04159156173942336,-0.12590108601952288,-0.2227384837029817,-0.3304406088170753,-0.4471453573775721,,, +5.8203125,11,-0.5708241824581806,-0.6993175287697341,-0.8303725663479977,-0.9616825626863248,-0.5174254152347022,-0.489926250597725,-0.39483793899030095,-0.2361504336038007,-0.022420689283798482,0.23382054186965645,0.5169393475720595,0.8092860194162385,1.0924233244130597,1.3484100377804382,,, +5.828125,11,1.5610502364140522,1.7170212392750617,1.8068015424533592,1.8253340428475813,1.7723783027409177,1.6525272908909692,1.474887432040096,1.2524442745001136,1.0011580074901996,0.7388518975274899,0.4839711527673197,0.25429875886505793,0.06571782965128248,-0.06889322848933678,,, +5.8359375,11,-0.1405557019251984,-0.14481330243781246,-0.08203923066623853,0.04259383290688257,0.2194787068552544,0.4352481958440896,0.673712040431825,0.91699098129255,-2.0468403642359427,-2.3245120876911063,-2.4736841192964256,-2.466968138690948,-2.3004229447839566,-1.9941783091675265,,, +5.84375,11,-1.5893136853466423,-1.1414778696674803,-0.7122433032861435,-0.359541526058036,-0.12866938911597692,-0.04526671531595694,-0.1113590151414512,-0.3050814497375022,-0.584126842636669,-0.8923804860485459,-1.1687081131322967,-1.356528027456238,-1.4126762321980866,-1.3141835098785526,,, +5.8515625,11,-1.0619086187008204,-0.6804614399212826,-0.21442776372982705,0.2785165647591761,0.7365299229293989,1.1031779020108698,1.3361642629144257,1.4138602577198052,1.3386156317647169,1.1363358876068346,0.852391936161771,0.5444995035264455,0.5416474657668559,-0.0010010672487649477,,, +5.859375,11,-0.5054272888036621,-0.8407714911090628,-0.924231223104668,-0.7436123619073101,-0.36051233339310496,0.10673540336169512,0.5156795254250937,0.7389902085267266,0.6995634465781536,0.3918672956005709,-0.1163223840554109,-0.7022745133907242,-1.2217159571936869,-1.5481498705686492,,, +5.8671875,11,-1.6073053937287065,-1.3972791812115144,-0.9888506414567024,-0.5058864854892671,-0.09120701956384693,0.13272898812499226,0.09754408438674167,-0.19217657461744475,-0.6600186039780538,-1.1785770520843255,-1.6042901487375456,-1.8167221253791896,-1.7515295426574276,-1.418076521533919,,, +5.875,11,-1.0909272039588418,-1.215813159358419,-1.3341141783118382,-1.4437100185135994,-1.54262352318618,-1.6290551983802222,-1.7014146848988767,-1.7583485738010425,-1.7987640784607986,-1.821848148706645,-1.827081692371204,-1.8142486552472683,-1.7834398004717231,-1.7350511211686568,,, +5.8828125,11,-1.6697769141508672,-1.5885976359604643,-1.4927627538864456,-1.383768892232606,-1.2633336564842377,-1.13336559370024,-0.9959308151074628,-0.8532168653151839,-0.7074944707777672,-0.5610778372618085,-0.4162841914805438,-0.27539327528786706,-0.1406075016518648,-0.014013470038654718,,, +5.890625,11,0.10245448497172582,0.20704807361782696,0.2982355679999742,0.37472852193209183,1.1467688435186134,1.345575316194664,1.4980099614268738,1.5918220847823417,1.6187711498683792,1.5752077227139016,1.462334419565897,1.286128645735099,1.0569324971904903,0.7887384061170459,,, +5.8984375,11,0.498220328146331,0.2035780129482584,-0.07672506600168387,-0.3252421313152032,-0.5267526005842951,-0.6693163392143416,-0.7450991679464635,-0.7509120769245211,-0.6884265622454528,-0.56405108582929,-0.3884772902444846,-0.17592762897009367,0.05684310639569262,0.2917227191937626,,, +5.90625,11,0.5105110534025132,0.6961954140257312,0.8341430079590303,0.9131272379542796,0.9261162687017892,0.8707688620403436,0.7496028918707267,0.5698247749686387,0.2736776302883965,0.09469478196852156,0.047490885580946614,0.15091158944371974,0.3997308890038589,0.7654260665512636,,, +5.9140625,11,1.2005844344187446,1.6462556821388508,2.041104817197791,2.3309402187921817,2.4771328791599183,2.462615590826557,2.294527754155593,2.003093921381616,1.6369107878667533,1.2553767235806237,0.9194429811192276,0.682127103239381,0.5802660706299053,0.6287936138827764,,, +5.921875,11,0.8184329414210725,1.1171641462343225,1.4752376088476309,1.832952387701924,2.1299879088756484,2.3148353154770467,2.352859298427874,2.2317345250153786,1.963409687853443,1.5822930255102898,1.1399416802011104,0.6970817934808502,0.17671383530633344,0.4681679128122336,,, +5.9296875,11,0.4968732676439727,0.2769113154957906,-0.10758408304041807,-0.5256353875212523,-0.8354858883724176,-0.9236343027816748,-0.7361396364077235,-0.2936148467351277,0.3142018631655008,0.9528122331153202,1.4795838897303062,1.782601077111064,1.8110945022999247,1.5891125595663411,,, +5.9375,11,1.2086892368631392,0.8043833360566304,0.5161691666758821,0.4508513292893954,0.6525806332011889,1.0905537529393508,1.6672695710166017,2.2450810573071216,2.6837671361890214,2.8788285889662126,2.790013434415193,2.4522548577267216,1.9660247619828024,1.4697473799657983,,, +5.9453125,11,0.43550422579085546,0.47982350323527095,0.5072435382349656,0.5176255078683833,0.5111368873050408,0.4882483866790645,0.44972557355875203,0.3966153277752843,0.3302273658611855,0.25211115868210715,0.16402864651478227,0.0679232294105721,-0.03411442409129037,-0.13988315112525762,,, +5.953125,11,-0.2471100075321893,-0.3534902418053202,-0.4567278299142708,-0.5545758611450571,-0.6448760677028516,-0.7255968058146655,-0.7948688231789841,-0.8510181863716341,-0.8925957915408543,-0.9184029415512104,-0.927512541609958,-0.9192855421265655,-0.8933823407770214,-0.8497689440050205,,, +5.9609375,11,-0.7887177799537943,-0.7108031484733428,-0.6168913877509636,-0.5081259296232004,0.3428316998734035,0.0834213534536431,-0.19123575750806507,-0.4627897367183426,-0.7129872686866511,-0.9249411604030512,-1.0843049334120924,-1.1802705657119137,-1.2063198144830585,-1.1606767334729329,,, +5.96875,11,-1.0464298347250756,-0.8713153802974508,-0.6471769192915173,-0.3891387611436943,-0.11455102344252938,0.15822017945135186,0.411073042714051,0.6274315930138655,0.7934004575541473,0.8987323566861859,0.9375408567709732,0.9087086845950021,0.8159631349046477,0.6676133180718764,,, +5.9765625,11,0.4759675766427308,0.2564717031282353,0.026628061558278158,-0.1952290056679321,-0.391216081709427,-0.5451524191770072,-0.6436932253956492,-0.6772654502969686,0.3142019835890405,0.04218504391324529,-0.0855632571749424,-0.05826258088762426,0.11061797435660492,0.3855129186072304,,, +5.984375,11,0.7143548296638446,1.0367385694052085,1.293383350337788,1.4354186029692044,1.4320470444573776,1.275391115789269,0.9817676686808668,0.5891921124201978,0.15150052376210532,-0.26999499429153423,-0.6160181956818231,-0.8385264882909356,-0.9081622212041012,-0.8187970498875482,,, +5.9921875,11,-0.5884617176021743,-0.2565165633205351,0.12249642612320925,0.4873623547036289,0.7797375963702331,0.95324280964989,0.9806884747269504,0.8583075304890615,0.6063358699973017,0.26585031407939697,-0.10764337899046003,-0.4528736902851889,1.0874708312625536,1.4359919917575128,,, +6.0,12,1.9043020984448609,2.353002737581236,2.6456137264716757,2.686104498949989,2.4453582681848847,1.9693145968697343,1.366557245646818,0.7787474588546776,0.3420042685032592,0.1498144353265899,0.22763532286939925,0.5261492414959312,0.9350159329727892,1.3133519024782347,,, +6.0078125,12,1.5285809591679362,1.493006030475331,1.1880768668299375,0.6697004813838641,0.053136846833503136,-0.5183824813078854,-0.9127139912467176,-1.0448367754372416,-0.8999876586732751,-0.5375577292355644,-0.0746836716469493,0.3459678260212188,0.5953922950897592,0.5936741497262072,,, +6.015625,12,-0.3859075051249981,-0.2518698467496678,-0.10785131274392468,0.04413706983276639,0.201946583850768,0.3633282103086592,0.5259717714538761,0.6875461435644653,0.8457398354002947,0.9983012219322208,1.1430777289920209,1.2780532828572784,1.4013833691665265,1.511427087419733,,, +6.0234375,12,1.6067756399283124,1.6862767565100023,1.7490546273900875,1.7945249954210354,1.822405143492685,1.8327186023899693,1.825794496799712,1.802261541053491,1.7630367898754966,1.7093093412447256,1.642519276866646,1.564332209140104,1.4766098804333487,1.3813773296057394,,, +6.03125,12,1.2807872008204966,1.177081819727848,1.0725537011936896,0.9695051802091424,-0.6407408096965312,-0.5337990995343305,-0.3609564530859463,-0.1312565572091528,0.1423536538751039,0.4439203068549522,0.7555884121110636,1.0588401037613395,1.3357789662049178,1.5703709029816966,,, +6.0390625,12,1.7495550344959367,1.8641471747128828,1.9094729012817016,1.885686090027248,1.7977507184629131,1.6550872243992747,1.470908097423906,1.2612890518267141,1.044040568277912,0.8374585124226491,0.6590409708169729,0.5242608002609057,0.4454795013373354,0.4310781717694693,,, +6.046875,12,0.4848661572865165,0.6058086526735692,0.7880922639417178,1.0215239750914744,1.2922357131814213,1.5836453946424438,1.8776074500573623,2.155672611193093,-0.7123682718250796,-0.8414307286797951,-0.8151309356926264,-0.632219957126044,-0.3153596293679193,0.09236913909371228,,, +6.0546875,12,0.5341357024240697,0.9481680801169567,1.277328703095959,1.4779662731788692,1.5266652659486697,1.4238420698183458,1.1936279153613172,0.8800571077994872,0.5401545494321891,0.2349994946258465,0.02015769484101504,-0.06302753136101691,0.006071448905823672,0.2241006539868865,,, +6.0625,12,0.5641948530813745,0.9801112436005602,1.4133828714695669,1.8023778764679927,2.09185379302277,2.241519018648039,2.2322681890936065,2.069120487336296,1.7804034346066009,1.413309482163871,1.0265176614947902,0.6810296658903292,-0.6573031664624296,-1.1212049651555207,,, +6.0703125,12,-1.39022278381548,-1.3889719938300278,-1.1141021845190109,-0.6353179110774021,-0.07639630208400483,0.4185971767947313,0.7246369309770921,0.7698322618439217,0.5549464504553462,0.15299209359295185,-0.3109845064120589,-0.6943874217083927,-0.8763705424150856,-0.7911794789166613,,, +6.078125,12,-0.4463957694413109,0.07891894789211656,0.6556723152212705,1.1399076717836192,1.4120515166658942,1.4094874680326326,1.1435310913722372,0.6961551200461087,0.197364281398106,-0.2105778314547564,-0.41226409234397465,-0.3508797946057407,-0.04386028007630627,0.4218219282923546,,, +6.0859375,12,0.8702078729682445,0.7768626780760375,0.6915610183866129,0.6162480022497575,0.5526881493322399,0.5024342812730492,0.46680012201606497,0.4468370877029815,0.4433156726513847,0.4567117574621377,0.4871980791127472,0.5346410125059786,0.5986027199368104,0.6783486309477137,,, +6.09375,12,0.7728601217047651,0.8808521719822695,1.0007956906829507,1.1309441190738283,1.2693638460118644,1.4139679026840966,1.5625523469608724,1.712834700361715,1.8624937646921649,2.0092101212469573,2.1507066035221767,2.2847880348402922,2.4093795351589327,2.5225627263876143,,, +6.1015625,12,2.6226092023283174,2.7080106772509933,2.777505285268737,2.8300995700729525,2.4003691243390697,2.5964160593174537,2.7317841181305345,2.798529980924015,2.7933460182675685,2.717787046495518,2.57815832297406,2.385072600264383,2.1527071349952527,1.8978124696191896,,, +6.109375,12,1.63854211412411,1.3931847432111881,1.1788873215563904,1.0104582015890011,0.8993336606652719,0.8527799465482299,0.8733864765386294,0.9588855317016656,1.1023110192658687,1.292485231138286,1.5147996534437351,1.7522353760569431,1.9865519422153173,2.1995617316235205,,, +6.1171875,12,2.3744010051427096,2.4967089711675468,2.5556326469554413,2.544587435289752,2.4617203708565496,2.3100437237797204,2.097229634095903,1.8350800876597309,0.4306478299101408,0.3135782306587892,0.3464668716317788,0.5217979244243679,0.8090593249098186,1.1594942144121874,,, +6.125,12,1.5136981811659276,1.810878987886724,1.9983365092413483,2.039686283202921,1.9205457483270776,1.6507974186365042,1.2630763878748403,0.8077176160942278,0.3449498403569893,-0.06444821387090449,-0.3685741564451044,-0.5324427881582348,-0.5433892942014729,-0.4129934253463097,,, +6.1328125,12,-0.17522520419022553,0.11889877706394053,0.4093158966155578,0.636328484590964,0.7499591583977365,0.7177930851342309,0.5300854085407283,0.20133803969511946,-0.23190007595995304,-0.7166668895047471,-1.1917781559502016,-1.5972998314667848,1.4356543255678869,1.3015465783435007,,, +6.140625,12,0.9092166203987944,0.3499146217709628,-0.2414078823694237,-0.7229756310636499,-0.9849177590901482,-0.9792332951992042,-0.7327826772737539,-0.3397461458295156,0.06438246174812262,0.3401372673632768,0.3825212124482361,0.1500087885132123,-0.3238401709765996,-0.939340724843334,,, +6.1484375,12,-1.5577634943187837,-2.0391159368751937,-2.2802716830105405,-2.2429999873612125,-1.9642153868939107,-1.5456405128273596,-1.1257171668367667,-0.8414658989094588,-0.7907490295300739,-1.0052813616522407,-1.4417870680964808,-1.993727763229404,-2.5203886561764315,-2.8853521750888995,,, +6.15625,12,2.8650857800488048,2.8820541659895533,2.8809000661304704,2.8618256544932392,2.8253363219741567,2.772231753586293,2.7035918581332674,2.620757796722498,2.525308442341188,2.419032682718454,2.3038980514754366,2.182016236855804,2.055606071997765,1.926954654803324,,, +6.1640625,12,1.798377278209917,1.67217687249306,1.5506036697727532,1.435815797000367,1.3298414874419353,1.234543572332473,1.1515868744443116,1.0824090744994697,1.0281955605417568,0.989858700640111,0.9680219018398424,0.963008734467144,0.974837312195996,1.0032200262545414,,, +6.171875,12,1.0475686383947342,1.1070046434135907,1.1803747197425838,1.2662709975257695,1.5387091827839483,1.225494699168935,0.9138720673531758,0.6220548262494944,0.3667707820059671,0.1621019860045989,0.018509409691161882,-0.05788968602351007,-0.06574131066289801,-0.00854199172422121,,, +6.1796875,12,0.1056123582588071,0.2645984265882144,0.453118434368923,0.6537745250233731,0.8482896698740181,1.0187899360614294,1.1490586829478089,1.22567521059596,1.2389584413958439,1.1836498115643337,1.0592877350111805,0.8702475097765441,0.6254438671186694,0.3377168884846786,,, +6.1875,12,0.02294409555879437,-0.30105938636451657,-0.6157759128393172,-0.9032695421467841,-1.1474298573268171,-1.3350886679201197,-1.4569317350661972,-1.5081419568197791,-1.88382687071062,-2.0201234830177532,-1.997935110494634,-1.8332229016855839,-1.5636286597277025,-1.2425653561197785,,, +6.1953125,12,-0.9308538746622452,-0.6872088240159668,-0.5590555061294958,-0.5751085326615091,-0.7408681787392428,-1.0377360927344146,-1.4258882284853376,-1.8504576400351391,-2.2500642306731016,-2.566362977328522,-2.7531234978464627,-2.7834268035964382,-2.653858317121084,-2.385044060963108,,, +6.203125,12,-2.018446473114024,-1.609918866494655,-1.2210223875304775,-0.9094578111892132,-0.7201023589768281,-0.6780474716924461,-0.7847217910031096,-1.0177030486537155,-1.3342479784848196,-1.6779902489041445,-1.9877629627383064,-2.207171345107055,-2.4072188694135934,-1.8695436982463047,,, +6.2109375,12,-1.3470208266354853,-0.9743043433717584,-0.8423415294100612,-0.9735341961011822,-1.3157072957947022,-1.7565368517246154,-2.154481787070863,-2.377740838631161,-2.3405561469033564,-2.026912165578214,-1.495132967947444,-0.8621160898859721,-0.2715219665417743,0.14536476844016388,,, +6.21875,12,0.3053774894217235,0.1960195766059074,-0.1213524484964142,-0.5285848794021203,-0.8833451941807153,-1.0583610085186177,-0.9765233381919476,-0.6322314430938276,-0.09312739027418764,0.5182568240796235,1.0579112598480274,1.3996633979070694,1.469623060119279,1.2663177322484789,,, +6.2265625,12,1.363055789250772,1.468890349855149,1.5817671626698853,1.6995451858242516,1.819987441892964,1.9408002925353527,2.0596737103694096,2.174321842856893,2.2825231578632,2.38215946787425,2.471253149486786,2.5480019063862347,2.6108104670351224,2.658318661968349,,, +6.234375,12,2.68942538897906,2.703308046480988,2.699437094682166,2.6775854895133997,2.6378328240315647,2.5805641046861143,2.506463183778912,2.4165009630145144,2.3119185745942183,2.194205834247353,2.0650753433801348,1.926432693703628,1.7803432959454124,1.6289964133611723,,, +6.2421875,12,1.4746670297023587,1.3196762192149871,1.1663507124709571,1.0169823659125128,-1.4887291761984036,-1.403523626747797,-1.2618334854907922,-1.0767904254057878,-0.8644288157631795,-0.6425627915964337,-0.4295395081545591,-0.2429555295225437,-0.09842587065968156,-0.008491539700662187,,, +6.25,12,0.0182582314441262,-0.022212148194492687,-0.1291006445125804,-0.29682130307737203,-0.5153919021247109,-0.7711285251051931,-1.0475986207860142,-1.3267660929315477,-1.5902485699321156,-1.8205991812523044,-2.0025234578063653,-2.1239464965548023,-2.1768559703403394,-2.157862194190117,,, +6.2578125,12,-2.0684361890461864,-1.9148091373484453,-1.7075402363215448,-1.4607830777213513,-1.1913017047367638,-0.9173049518043379,-0.6571803440706081,-0.42821583655075424,-2.2934243816882685,-2.2240495808557483,-2.000444737811003,-1.6477132238434495,-1.2108081772055117,-0.7475858743708829,,, +6.265625,12,-0.3198499676132974,0.016218794767881014,0.2187570361960864,0.2666834902419206,0.16292738274481666,-0.06608209307695223,-0.3745854095369722,-0.7046717272971044,-0.9953488693059994,-1.1920912905258565,-1.255378648162063,-1.1668948080842472,-0.9324215354468742,-0.5809759519527932,,, +6.2734375,12,-0.16032591051756406,0.27041838727570583,0.6499827978382792,0.9244482247345558,1.0556276825119013,1.0269967689276074,0.8462539289593614,0.5441118013502823,0.16950794654230686,-0.21801906581858205,-0.5576007424379483,-0.7965129227610507,-0.039178051959536934,-0.2676580726940929,,, +6.28125,12,-0.2384311289586825,0.04451543614961606,0.5053765146189425,1.0173636207386314,1.4375333758745616,1.6460638214960683,1.5792130874269483,1.2469262410563993,0.7302634491542043,0.1593528022235049,-0.3220913833951723,-0.5959620959440726,-0.6019251078404512,-0.35374278961642425,,, +6.2890625,12,0.06471555918638322,0.5226813102230445,0.8785493938132001,1.0189105674543129,0.8898533469355439,0.511954560947061,-0.02515200565502107,-0.5871423170314655,-1.0316278829847256,-1.2470044396939481,-1.1828779631564386,-0.8637307301230991,-0.3820833925392162,0.12697160317024592,,, +6.296875,12,0.8737882446764589,0.7388720175224054,0.614187339715401,0.5015038649014478,0.4023764809799243,0.318118308524599,0.24977793442043075,0.1981212792252064,0.16361841562692225,0.14643556867409355,0.14643243772239833,0.16316488685789254,0.19589295655402472,0.2435940561449115,,, +6.3046875,12,0.3049811059815941,0.3785253114672473,0.4624831700654728,0.5549272382538681,0.6537801195600327,0.7568510784164348,0.8618746385901603,0.9665504901975036,1.0685840063965002,1.1657266601776808,1.2558156334228587,1.3368119245430825,1.4068362873007991,1.4642023713939745,,, +6.3125,12,1.5074464843798938,1.5353534536768,1.546978135668173,1.5416621951566836,-0.2453985203232557,-0.12037405527359267,-0.060639380290519074,-0.06902498402203028,-0.14350282673478476,-0.27733329457458045,-0.4595409251919406,-0.6756857169253933,-0.9088762212905138,-1.1409537577746076,,, +6.3203125,12,-1.3537651566323101,-1.5304352616836818,-1.6565504415186187,-1.7211705628936609,-1.7175988417305936,-1.6438558708739586,-1.502824752287817,-1.3020571961647782,-1.0532540911804535,-0.7714567502284614,-0.4740052114742447,-0.1793362185581155,0.09429531647380844,0.3300822280398039,,, +6.328125,12,0.5138301302670809,0.6349403437968553,0.6871421899802674,0.6689236034426349,0.5836300509189356,0.4392248739863012,0.2477277829408703,0.02437067220220124,-0.8983775799473533,-0.8488147525356495,-0.6576643688785901,-0.35743200367747385,0.0017992321317485407,0.3601980297135395,,, +6.3359375,12,0.6575358316231562,0.8426027585837043,0.8812217433195301,0.7616124222835468,0.4962691109776925,0.12006012526435722,-0.3151557556020759,-0.7485574256220917,-1.1197840287712593,-1.3782846327394225,-1.4911390181817197,-1.4481317388519113,-1.263289429102502,-0.9726422051709722,,, +6.34375,12,-0.6285581245239773,-0.29153343084241873,-0.02071758455423156,0.13535086132181373,0.14635432598191,0.004966627601162954,-0.2719595097285825,-0.6459730823459735,-1.0629718624865097,-1.4615898273592929,-1.7827187918002445,-1.9786814016820984,0.6082346142101955,0.2830005372707609,,, +6.3515625,12,-0.18066730692383254,-0.6458488350611267,-0.9730670491307228,-1.0585768951298742,-0.8628823821315994,-0.4216655598185733,0.16386885847462124,0.7545880708918127,1.2114033826819741,1.4332144131520383,1.3844275252761578,1.104508217070779,0.6969512850253808,0.3006936432705896,,, +6.359375,12,0.051806707888992665,0.045969401264045806,0.3120089336507561,0.8037632007786415,1.4124972385118468,1.9964729127403,2.419569803137705,2.5883745266663456,2.4775754301134345,2.1367046385401602,1.6763814690524144,1.2378291558102377,0.9540209760427404,0.913105843075904,,, +6.3671875,12,1.5190458612293192,1.4790744535604867,1.4219995647496864,1.3483748778637803,1.2590466922928083,1.1551393236863194,1.0380356334934,0.9093530289107714,0.7709153533587141,0.6247211595613158,0.4729089206510494,0.31771978833344394,0.16145855009990462,0.0064534690147288465,,, +6.375,12,-0.1449842908321317,-0.29060094285565524,-0.4282393553216197,-0.5558766398682241,-0.6716593931316558,-0.7739359744977737,-0.8612852548950279,-0.9325413333347196,-0.9868137885064612,-1.0235031109148074,-1.0423110454297595,-1.043245663239087,-1.0266210744762156,-0.9930517866357488,,, +6.3828125,12,-0.9434418076388368,-0.8789686844276114,-0.8010627566450811,-0.7113819887369074,-0.21347036073728687,-0.4474923052362086,-0.6597469374416554,-0.8338975403945225,-0.9563629969505693,-1.0172694626012595,-1.0111432439668877,-0.9372965559275273,-0.7998792475733083,-0.6075928809031079,,, +6.390625,12,-0.3730870921273843,-0.11208032160626387,0.15773378014817552,0.4179180167186843,0.6505754977406221,0.8395961560205295,0.9717790099433632,1.037751915159852,1.0326246704408495,0.9563299358263142,0.8136281902078141,0.6137763822555278,0.3698833795032394,0.0979971601430848,,, +6.3984375,12,-0.1840126023083153,-0.457698644214159,-0.7053201559539015,-0.9110772297788542,-1.0622096354584911,-1.1498833094153156,-1.1698027472062529,-1.1225066035763738,-2.0206269320016568,-1.9029981244671192,-1.6443734829219918,-1.2845539681631537,-0.878347969277654,-0.4870226698282456,,, +6.40625,12,-0.16875337839741178,0.03044155519873548,0.08386827004631893,-0.011689022380994007,-0.2354753352487909,-0.5460097952967604,-0.8875626645585973,-1.198855593394887,-1.4226299031034897,-1.5145924763860783,-1.4503457555653287,-1.2292223157268798,-0.874426590918465,-0.4294614949699783,,, +6.4140625,12,0.048603690262768263,0.4979758121493046,0.8617136931560232,1.096546078229205,1.1795584947065478,1.1117077740109422,0.9176171015541396,0.6416837959823578,0.3411063366670484,0.07691700612562025,-0.09558284699381248,-0.13549487227368118,2.0813350281040166,2.5502577789858907,,, +6.421875,12,2.8370780188639815,2.8574927219351607,2.597480183078708,2.117187691766869,1.5345140988611212,0.9928862262961828,0.6220598645669767,0.5026876627882739,0.6443636415084375,0.9831603487734101,1.3993321717283975,1.7503312318957525,1.9100854414278519,1.8037719121170148,,, +6.4296875,12,1.4285533996062418,0.8545924961121801,0.2060635011087903,-0.3726361061267093,-0.7562163451835233,-0.8725903820934104,-0.7223927103211707,-0.3785726378371915,0.033823443850426516,0.3721379488741151,0.5154027051693095,0.3976813842945853,0.02631394159951161,-0.5199386954572609,,, +6.4375,12,-0.6117828212297958,-0.5042875516442454,-0.3910488162596164,-0.2743117947133308,-0.15637479928428533,-0.039548938991496085,0.0738824351618948,0.18170379364339395,0.28180629899123744,0.3722248028984087,0.4511723219272772,0.5170713881520668,0.568581725751961,0.6046237689107072,,, +6.4453125,12,0.6243976092019627,0.6273970406717485,0.6134184566711893,0.5825644426423282,0.5352420019358942,0.4721554457190005,0.3942940714648549,0.3029148457723698,0.19952039473942465,0.0858326872826447,-0.03623712778476579,-0.1646222027553339,-0.29713620384343603,-0.43151162171460217,,, +6.453125,12,-0.5654395088903816,-0.6966099482057819,-0.8227525436905341,-0.9416762248521688,-1.0133258959658362,-0.8520077357800394,-0.652030836213922,-0.4296605394721885,-0.20280927098799634,0.010218102969501376,0.1920065112834072,0.3272510798376903,0.40383058286704,0.4136590743033127,,, +6.4609375,12,0.353256297383334,0.22399708085772385,0.032022315053677815,-0.2121823001835328,-0.4945103766225138,-0.7982113490462133,-1.105051298363284,-1.3965771554221778,-1.6553961455986168,-1.866381271550588,-2.0177187891964774,-2.1017246503133604,-2.11537299583507,-2.060499863495801,,, +6.46875,12,-1.9436679217112072,-1.7757016791735367,-1.570925598246434,-1.3461582574937068,-1.1195327199039151,-0.909225382312919,-0.7321819631053437,-0.6029294844713528,-0.02275209568604386,0.2386979344769233,0.6214513148092298,1.0788606142227235,1.5522464700440162,1.97998497970267,,, +6.4765625,12,2.307055740987796,2.4935636351591097,2.5209072806034047,2.394633615396492,2.143534206047296,1.8151242355783752,1.4682085247554102,1.163692633173553,0.9550704070803708,0.8800697172782361,0.9547577169312536,1.171023846028293,1.4978326870719914,1.8860515816677603,,, +6.484375,12,2.276101108895912,2.607236829661564,2.8270166018294454,2.8994788462852514,2.8107578993984763,2.5712617541111498,2.2140728978065924,1.7898212080507008,1.3588273438371288,0.9817401863518792,0.7101264254628632,0.578477825068241,-1.8858631540974784,-1.885760292394996,,, +6.4921875,12,-1.6189044137552409,-1.1678397322799865,-0.6631627125200263,-0.24774180258566114,-0.03759608255477609,-0.09015440248164774,-0.3885936119003842,-0.8465474903975126,-1.3318948027592754,-1.7031057078060834,-1.8481837142255104,-1.7155288597129261,-1.3282617984576,-0.7780812243995945,,, +6.5,13,-0.20033624627941327,0.2628563439290835,0.5013435057183959,0.4669030653753112,0.1862355618284831,-0.2465776995379363,-0.6960812158481723,-1.0227867345069803,-1.1216133296258315,-0.9508888189718956,-0.543962168427013,-0.00024243714903004327,0.5418814988685859,0.9428201395822838,,, +6.5078125,13,-1.0513076673543051,-1.1497276573109494,-1.2352047624195135,-1.3062257203095826,-1.3615220119639897,-1.4000921548625918,-1.4212193254458922,-1.4244840022745866,-1.409771408446071,-1.3772736228904945,-1.327486323513877,-1.2612002191489071,-1.1794873202698808,-1.0836822887990138,,, +6.515625,13,-0.9753591934917724,-0.8563040778369774,-0.7284838207247557,-0.5940118350477448,-0.4551112047663907,-0.3140759058164808,-0.1732307897907634,-0.03489103098357105,0.0986782532159865,0.22530150163429075,0.3429306367975997,0.4496807565816583,0.5438629651733916,0.6240137685814868,,, +6.5234375,13,0.6889205200895572,0.7376424702142497,0.7695270526947121,0.7842211214611702,-0.5325571084347556,-0.527936910725188,-0.591238944481824,-0.719774423515995,-0.9061779735179668,-1.1389162547508027,-1.4030875002717034,-1.6814562266447055,-1.9556509741442785,-2.2074415642274205,,, +6.53125,13,-2.4200068163652184,-2.5791043309246118,-2.6740607733032555,-2.698513610792822,-2.6508525848750506,-2.534330139275636,-2.356833108079668,-2.1303315888192973,-1.870043435551868,-1.5933726368447054,-1.3186956104879657,-1.0640800511717472,-0.8460256698329308,-0.6783146359714811,,, +6.5390625,13,-0.5710518834680967,-0.5299621998321681,-0.555993111660472,-0.6452512541396278,-0.7892766567209804,-0.975635812341482,-1.1887921669956434,-1.4111933203031966,0.5988808738257977,0.7591788326402155,1.024912217624908,1.3447352337686551,1.658464265910062,1.9065045671690184,,, +6.546875,13,2.039186615184921,2.0245576693561107,1.8534146674555472,1.5407942719881191,1.1236876918286438,0.6553359149059756,0.19699360730517784,-0.19155579518187624,-0.4612567650428215,-0.5813686355459565,-0.5442013947104957,-0.3662629626774764,-0.08563951541092296,0.2439828701608772,,, +6.5546875,13,0.5617238545515435,0.8090323136534867,0.9388441171299295,0.9229476432418204,0.756409636982415,0.458371902731591,0.06909460241599191,-0.35629344001357305,-0.7563641063875766,-1.0729443818236977,-1.2601676953720171,-1.291612450268505,0.6068632495695971,0.09652731864104937,,, +6.5625,13,-0.4165024163315035,-0.7945470873768998,-0.9390651674749986,-0.8176460611867569,-0.4728571037611005,-0.010519564007958462,0.4293726569563566,0.7111206232672763,0.7406305549856929,0.4913399341069525,0.011652708817048996,-0.5881555836307607,-1.1659754266532314,-1.5866129597165302,,, +6.5703125,13,-1.7586333482701684,-1.6592021510982442,-1.3401184226853036,-0.913388136605924,-0.5202939481952873,-0.29244050150901035,-0.3154537568493545,-0.6052854165884791,-1.1036188168692456,-1.6936374636454228,-2.231836532107283,-2.5871606655194777,-2.6767433847533715,-2.488454693621469,,, +6.578125,13,0.7816769419384283,0.7621528318936186,0.7262084407253122,0.6746947499730142,0.6087389702589113,0.5297245992379812,0.4392669898648579,0.3391848568999353,0.23146822070162665,0.11824334973367492,0.0017353157707933194,-0.11577118241137906,-0.2319720407582313,-0.3445843126571976,,, +6.5859375,13,-0.4513864022765789,-0.550257184606365,-0.6392133670782028,-0.7164444384324434,-0.7803445927443373,-0.8295410694885778,-0.8629184132745602,-0.8796382283313287,-0.8791540817079943,-0.86122129410046,-0.8259014467334524,-0.773561525248083,-0.7048677154517115,-0.6207739594314841,,, +6.59375,13,-0.5225054722809658,-0.4115375079272655,-0.2895697457355648,-0.15849674624898835,-1.6244991150252566,-1.8108649681211064,-1.9541909430675828,-2.041249451442665,-2.062612934687612,-2.0133168243392308,-1.8932115382888608,-1.7069789545469316,-1.463812200489349,-1.176781073119228,,, +6.6015625,13,-0.8619273273344513,-0.5371529058969903,-0.22097862320275166,0.06874015176191217,0.3160512696704073,0.5080107345950077,0.6355777631886529,0.6942375707276053,0.684308472102351,0.6109118997356484,0.4836074464016968,0.31571839988604844,0.1233948194562804,-0.07552049383266564,,, +6.609375,13,-0.2627440361731292,-0.4208343234588801,-0.5344158316983887,-0.5912587891398629,-0.5831395059643809,-0.506421231450387,-0.36231501728383375,-0.15680238018270176,-1.164415899631814,-0.8997226083014404,-0.5393976280234201,-0.13951628288294535,0.2383554988361789,0.5367322564620703,,, +6.6171875,13,0.7111408317844706,0.7370219101561977,0.6135264586903354,0.3636159064658402,0.03045064040963416,-0.32937047892424753,-0.6546663920564526,-0.8892462716718579,-0.9907069179751516,-0.9370846304195908,-0.7303252341586502,-0.3960315197022304,0.020472840863467817,0.4611501157551925,,, +6.625,13,0.8642350092302651,1.1738014255633258,1.3484197175470591,1.3675562978635167,1.2347191292646975,0.976859453230524,0.6401232230639182,0.2826142543899777,-0.034703460420802856,-0.2575470009755421,-0.34681298047100995,-0.28470930081780865,-1.1258411620259583,-0.8426955894322298,,, +6.6328125,13,-0.8105445002332445,-1.035646647918426,-1.4510530143435576,-1.9349559050838725,-2.344096025079241,-2.5530715054145974,-2.488775097328893,-2.1505207688560044,-1.6103428459727398,-0.9933847587856948,-0.44375111186053096,-0.08518069168032671,0.012682710787286002,-0.14682087526724774,,, +6.640625,13,-0.4884942386763649,-0.8861144434105348,-1.1972578620877052,-1.3025722428845836,-1.138730406068513,-0.7160317989877804,-0.1158256762450135,0.5315400446847162,1.0822028576541252,1.4179796777735918,1.4785309549750776,1.2776816677522262,0.8994280039747041,0.47472596844659204,,, +6.6484375,13,-0.02037499324922576,0.12261290089859278,0.2681961999856481,0.4140555934510614,0.5578635982429854,0.6973251057434886,0.8302173639056789,0.9544286946443974,1.0679952686634098,1.1691352939150694,1.2562800191762518,1.328101009986303,1.3835332194656638,1.4217934501612988,,, +6.65625,13,1.4423938837667682,1.4451504419249623,1.4301858318257403,1.3979272233792446,1.3490985987434956,1.2847079082702246,1.2060292578693868,1.1145804397914174,1.0120962003594804,0.9004977128279532,0.7818587899895701,0.658369428236276,0.5322973215056049,0.4059480190860738,,, +6.6640625,13,0.2816244250001924,0.1615863482101551,0.04801081199682655,-0.05704618242967064,0.0997748588489219,0.393428972110064,0.7074951572982758,1.0237872587995391,1.3238598000031292,1.5902883345602268,1.807878846515446,1.9647218763248016,2.0530178769248923,2.069616256247475,,, +6.671875,13,2.0162305274752645,1.8993145736920576,1.7296086644532949,1.5213868903291834,1.2914585018090103,1.0579927992256748,0.8392495239425529,0.6523032899501015,0.5118510098074269,0.4291854805971576,0.4114067078786956,0.4609259665819928,0.575297183476349,0.747387399850035,,, +6.6796875,13,0.965874427064908,1.2160369906266526,1.4807822614280823,1.7418391182456618,1.981033927786932,2.1815598735704578,2.3291513139899265,2.413081271742244,-0.07756492143350023,0.2451202075354401,0.6352372677673811,1.0335323587019367,1.3788095882807725,1.6174401863256145,,, +6.6875,13,1.7116966752796534,1.6456141173942802,1.4274656085867887,1.0884665179100286,0.677909343735806,0.2554869871641335,-0.11799985900352328,-0.3901038459218681,-0.5248870415860052,-0.5085016447574189,-0.35132619002522997,-0.08632461466021768,0.2361161132273092,0.5560656040082814,,, +6.6953125,13,0.8134194496688154,0.9572989162571895,0.9540166867018138,0.7923677445095584,0.4854210975531939,0.06853304016028082,-0.406108845351194,-0.8775614020676623,-1.2855637565895708,-1.5798675988770436,-1.7280069237651716,-1.720297341742662,0.16841457285688355,0.5547931815042674,,, +6.703125,13,1.095186718579317,1.6557679673721653,2.0946867176113244,2.3009124582780704,2.2246529401214667,1.8910118083081482,1.393141965470449,0.8667707242160033,0.4530780392539908,0.2601009839773805,0.3332413593257916,0.6429582474871693,1.093017276338342,1.54703422647443,,, +6.7109375,13,1.8660365396869183,1.9467464840748683,1.7500918353075958,1.312128184205796,0.734377350504134,0.1562277534681098,-0.2830411679569599,-0.4822046735959316,-0.4056109487772401,-0.09273204904028463,0.3528679770022166,0.7921222543339516,1.0887701596585324,1.1468850952308138,,, +6.71875,13,-0.15168576849913407,-0.2341995706303037,-0.3030997202241452,-0.3571450056592056,-0.3953626983409645,-0.4170656725742765,-0.4218645194344664,-0.4096744424709355,-0.3807168144497145,-0.3355153678295017,-0.2748870856317154,-0.19992795216391868,-0.11199381306329126,-0.01267667976390574,,, +6.7265625,13,0.09622310673487212,0.2127283654174352,0.33471966676311304,0.4599724205454512,0.5861958105348022,0.7110728943731202,0.8323011664884166,0.9476328738030672,1.0549143783155401,1.1521238773231293,1.2374068208039777,1.3091084057997144,1.3658025788161672,1.4063170384011598,,, +6.734375,13,1.429753800092839,1.4355049636294654,1.4232634063184966,1.3930282153009768,2.426912489650401,2.3689496717540877,2.24236136510956,2.054962974026569,1.8186760280906629,1.5487014004982766,1.2624641197398212,0.9784033445683092,0.7146918688482058,0.4879744364288301,,, +6.7421875,13,0.31221283396018296,0.19771828310582096,0.1504385921531648,0.1715497613999457,0.2573805057669243,0.3996749423392108,0.5861751088947245,0.8014826763504923,1.0281397487243709,1.247853366316562,1.4427783067573223,1.5967687131270094,1.6965112520392407,1.7324607658086886,,, +6.75,13,1.6995131555120693,1.597368555495733,1.4305594568973985,1.2081418020165673,0.9430705736125128,0.651303404558933,0.3506946994962432,0.059757368640009474,-1.5712865798822615,-1.3174305422601802,-1.0113571892954345,-0.7136119602070565,-0.4831707237785259,-0.3681982031339658,,, +6.7578125,13,-0.3984915814301069,-0.5807865131541923,-0.8976569231400888,-1.3101802148150918,-1.7639530163004895,-2.1975207172079574,-2.551908075281422,-2.779766660361679,-2.8527145674384338,-2.7657253778410325,-2.5378829255221964,-2.2093844523145445,-1.8352590504066093,-1.4767798821488594,,, +6.765625,13,-1.1919078536306773,-1.02625525421427,-1.0059768659967143,-1.1336958125880543,-1.3880987188408356,-1.7272632175404958,-2.09519948534682,-2.4305868674950584,-2.6763447336442043,-2.7885467513186635,-2.743290010042873,-2.5404489531639016,-0.03905718132411981,-0.5563206045863206,,, +6.7734375,13,-0.9102814155870056,-1.0080985018718558,-0.8250709912620077,-0.41137236963073626,0.12171422616196452,0.6322869043163618,0.9866855284077656,1.0960716141018232,0.9407026365776722,0.5752485656686546,0.11369439590545324,-0.3020325095115014,-0.5411107257358001,-0.5198453590147782,,, +6.78125,13,-0.22478721370002064,0.2833874218239988,0.8863015106633242,1.4401069100544026,1.8146877436535949,1.9290951050521503,1.7735036229859125,1.4116744021772614,0.9632514815082354,0.5707459692808011,0.36025863398599,0.4067077813454806,0.7130944164067917,1.209489404187334,,, +6.7890625,13,1.3451047635663147,1.2800994283564178,1.1989090444071582,1.1027052766640602,0.9929141860659354,0.871191346156763,0.7393929461858566,0.5995433866327908,0.4537999345049028,0.3044150572371048,0.1536970946685996,0.003969957665801882,-0.14246744099445174,-0.2833813131863848,,, +6.796875,13,-0.4166419768958855,-0.5402610100882055,-0.6524259264966917,-0.7515317662364001,-0.8362090481742023,-0.905347594692726,-0.9581158117626174,-0.9939750868184384,-1.0126890524210737,-1.0143275535936829,-0.9992652494577028,-0.9681748737513785,-0.9220152723377758,-0.8620144272666832,,, +6.8046875,13,-0.7896477647415217,-0.7066121269232309,-0.6147958634315072,-0.5162455663480647,-0.20362149398171026,-0.4234214436677088,-0.5865995175942158,-0.6839936197768878,-0.7109554769861992,-0.6676690415710137,-0.5591321514337111,-0.3948027390187536,-0.18793427268157992,0.04535321597088214,,, +6.8125,13,0.2872017273598339,0.5192648007516065,0.7239907906419409,0.8858504165728469,0.9924229769429708,1.0352654739104192,1.0105040355338248,0.9191063871527221,0.7668163662381241,0.563755042513849,0.3237162546250885,0.0632056847410085,-0.19970952278448634,-0.44666038038914097,,, +6.8203125,13,-0.6602570772950875,-0.8253020707093689,-0.9298506544911264,-0.9660450465945916,-0.9306638290386348,-0.8253484227082089,-0.6564907998764622,-0.4347902595078087,-2.2037292638249717,-1.7770131358565897,-1.3175649802796954,-0.8871556063917813,-0.5424871106226559,-0.3264096116018325,,, +6.828125,13,-0.26129762369793263,-0.34561747552895883,-0.5542201485277117,-0.8423136488767959,-1.1524959128871388,-1.4237525466046947,-1.6010176635620752,-1.6438083770090373,-1.532587785584694,-1.2718650914729677,-0.8895497013544116,-0.4326596263615933,0.03994766016629886,0.4666899735409141,,, +6.8359375,13,0.7928013720280853,0.9788135163044448,1.0066566622495108,0.8824302576316674,0.6354118265177898,0.3134587171397151,-0.02448089618071664,-0.31758113416448264,-0.5126405101491535,-0.5723928661913721,-0.4813325584816743,-0.2481464912296705,2.538574498972733,2.54615657252622,,, +6.84375,13,2.280603720349197,1.8154691477110936,1.2764444419457766,0.8068671709178505,0.5284146730753166,0.5077569684392519,0.7383082961068143,1.1420784952009335,1.5911164752747626,1.9426682144879384,2.0784127843726647,1.9370220430742728,1.5311192373428515,0.9439873709919132,,, +6.8515625,13,0.306928017192824,-0.2365257636269784,-0.5697359768976373,-0.6347041633677175,-0.44773553826064616,-0.09473177184836944,0.2925953751335758,0.573068282328688,0.6349825290193822,0.4269665746039055,-0.027697816466269898,-0.6372213334538411,-1.2662367687011722,-1.772682090239036,,, +6.859375,13,-0.4131300313032119,-0.3077020757973874,-0.2022588834321604,-0.09910156853828422,-0.0004946693389771828,0.09137372095721102,0.17443048691148538,0.24675401262804025,0.30660805292669624,0.3524723607079542,0.3830695340989127,0.3973876131610757,0.3946980303635799,0.3745686003802018,,, +6.8671875,13,0.33687132162857336,0.2817848528153192,0.2097916209904616,0.12166961161561385,0.01847898426810035,-0.0984562517962284,-0.2275711814949793,-0.3670871455767125,-0.5150426446200214,-0.6693274443819024,-0.8277192854504378,-0.9879225545512892,-1.1476082405133847,-1.3044544754022729,,, +6.875,13,-1.4561869510831336,-1.6006185036591036,-1.7356871727960808,-1.85949206965406,-0.17451016692505572,0.1075135189118698,0.3930427993832389,0.6637056531421621,0.9022731020243124,1.0938562816320396,1.2269400513029711,1.2941810774479652,1.292914748891635,1.2253355875190055,,, +6.8828125,13,1.098338586311209,0.9230325520083852,0.7139594023073261,0.4880738727077923,0.26355479596143844,0.058530862474272076,-0.11019026609881732,-0.22830085131126376,-0.2849977562623677,-0.27374283201922045,-0.19272597134367367,-0.04499852270843109,0.1617322557460933,0.41563338601373984,,, +6.890625,13,0.7015640491223148,1.0021241370244232,1.2988603758146904,1.573545930611922,1.809444278250539,1.9924692308628003,2.1121602349902258,2.162404952093712,0.09562588047352856,0.5004959240957281,0.9067288892510112,1.2536468764390882,1.4890827226088432,1.5775122841243046,,, +6.8984375,13,1.5055984234203867,1.2842831258218743,0.9471017996788608,0.5449822080544556,0.13833799816299247,-0.21231184311723905,-0.4557367023090728,-0.5579382814653578,-0.5074076552596312,-0.3168768403696355,-0.021292286482668173,0.32767383348937834,0.6697193889930668,0.9453538954489596,,, +6.90625,13,1.1052151080397228,1.1178092214204325,0.9744688168927306,0.6907560446653835,0.30409219926021,-0.13201739613665242,-0.5562639819075667,-0.909031973549458,-1.1416327307294096,-1.2238375565295314,-1.1485368973442855,-0.932800315767612,-1.7793085720838204,-1.3595928112001114,,, +6.9140625,13,-0.9164291325630782,-0.5897213295280186,-0.485009788919092,-0.6444668770979329,-1.035281647771594,-1.5586177184063563,-2.0766894682075643,-2.4505358145300944,-2.5781387312448265,-2.4224389827522357,-2.021570214496664,-1.4785057583326815,-0.9329546780708152,-0.5232083501518043,,, +6.921875,13,-0.3483929609491517,-0.4414718948305039,-0.7603956206593736,-1.199822870839303,-1.6201988204816842,-1.8862188461492533,-1.9041340607950348,-1.6476721976161115,-1.1654675678421709,-0.5679616062446132,0.0026379852369047274,0.4111083347522635,0.56605432149917,0.4447478170863813,,, +6.9296875,13,-1.9703264255129949,-2.0667072425468,-2.147401027696518,-2.211445159174409,-2.2581645116056297,-2.2871830488322384,-2.2984301815198505,-2.292141778374612,-2.2688558133912773,-2.2294027254756856,-2.1748906593690247,-2.106685846428688,-2.0263884689189124,-1.935804430548168,,, +6.9375,13,-1.83691352766844,-1.7318345785750413,-1.622788121607727,-1.5120573353204798,-1.4019478651202393,-1.2947472599174503,-1.1926847291598697,-1.0978919250091408,-1.0123654364657453,-0.9379316522727744,-0.8762146079465327,-0.8286073800296576,-0.7962475285481665,-0.779997017766971,,, +6.9453125,13,-0.7804269669226975,-0.7978074980360976,-0.8321028586552026,-0.8829719050135362,2.1418587489569463,2.05403186163756,1.907038170483616,1.7130231203168231,1.4873106937230518,1.24732893628729,1.011388974432048,0.7974026824517647,0.6216284330087847,0.4975324064503298,,, +6.953125,13,0.4348448754466507,0.4388772845936664,0.5101477579281908,0.6443411589885617,0.8326064979583253,1.0621709554444347,1.3172277130317558,1.5800356866013492,1.8321544809800665,2.0557284543083982,2.2347303551443227,2.3560778136428286,2.4105448336332937,2.3934047268320318,,, +6.9609375,13,2.30475965700252,2.149533814728005,1.9371306987393888,1.6807784018250227,1.396608554956546,1.1025331552946804,0.8169975971209159,0.5576968566935201,-0.6151723984712263,-0.24962602376954984,0.10288496414527988,0.3839577350507709,0.5468722407535875,0.5639002556451898,,, +6.96875,13,0.4306530895408532,0.16679063199714886,-0.18701885303030408,-0.5754147793186906,-0.936952484747948,-1.2136629781978685,-1.3600752717453597,-1.3502960674728148,-1.182044124574876,-0.8770109360308685,-0.4774915197191942,-0.03981005723050829,0.3744356877569732,0.70794752355349,,, +6.9765625,13,0.9166265878211596,0.9764136436848656,0.8870046409032941,0.6718629805537492,0.3745267470201358,0.05178626594260188,-0.23520517448225145,-0.4305026663063651,-0.492132067812355,-0.3986783989325843,-0.15267381202176664,0.21974282259093825,-0.7866010290600702,-1.0532584477220333,,, +6.984375,13,-1.0724385687225078,-0.8277514566677402,-0.3770281691438892,0.16344539828674912,0.6507364054226775,0.9543976824142956,0.9922003607950379,0.7526734425409245,0.2982728439714921,-0.2516888761886077,-0.7536741109910025,-1.079170437195334,-1.149803024909405,-0.9586870042849626,,, +6.9921875,13,-0.5721689602798727,-0.11148164352319397,0.28065867723473376,0.4793558869247209,0.4119649692021754,0.07821183526487774,-0.4495141946225757,-1.04577747776987,-1.5662483611968767,-1.887032739504633,-1.938401963146965,-1.7236808897714748,-1.3181195510093426,-0.8480597498837843,,, +7.0,14,-0.9497739372253164,-1.031579784422009,-1.1271879458067344,-1.2351455050709788,-1.3537734520335132,-1.4811959681903784,-1.615373163450838,-1.7541366909044616,-1.8952276160655983,-2.036335877562589,-2.17514064837243,-2.3093508909258422,-2.436745396014249,-2.555211604463206,,, +7.0078125,14,-2.6627825318476024,-2.7576711497384454,-2.8383016215003503,-2.903336845735892,-2.95170182512057,-2.9826024514665592,-2.995539378112533,-2.9903167367528014,-2.9670455460908647,-2.92614175264408,-2.8683189380142657,-2.7945758203247983,-2.7061787686766428,-2.60463963679304,,, +7.015625,14,-2.4916893039806247,-2.3692473866966317,-2.2393886510590257,-2.104306714402832,0.34034435061326873,0.17757931341018152,0.07808887989124225,0.04600608498598635,0.08062575247513204,0.1764580758578087,0.32361614555953955,0.5085103888566576,0.7148014862314279,0.9245453028490016,,, +7.0234375,14,1.1194499834139888,1.28215753656353,1.397460526670428,1.4533690155658692,1.4419533387457175,1.359903931935727,1.208769154436893,0.9948545095869852,0.7287902741679175,0.42479767116534495,0.09970474152574886,-0.2282194754001616,-0.5405311733435166,-0.8198901412723075,,, +7.03125,14,-1.0512611291760767,-1.2229544597387658,-1.3274333380971952,-1.3618315807862618,-1.3281456783289278,-1.2330878156128413,-1.0876101165772782,-0.9061333061620512,0.6728419693240355,1.1483698780612432,1.5845650822655322,1.9257208674995048,2.130804597847502,2.1797916878340917,,, +7.0390625,14,2.0767279626642594,1.8490437180822896,1.54322660488756,1.217527590118436,0.9328363541249952,0.7431475946014531,0.6871034175157823,0.7819293777951146,1.0207088969308824,1.3734208015132032,1.7915785862977476,2.2157490022674486,2.5847790835670765,2.84529461137688,,, +7.046875,14,2.95999071680008,2.913423436575149,2.71440025559538,2.3945973758352537,2.003619138004036,1.6012691548803677,1.248236984851142,0.9966509410285359,0.8819684603042464,0.9174671037319696,1.0921941768618555,1.372694239987064,-0.3289650553556649,-0.6474834185115633,,, +7.0546875,14,-1.1365057279214144,-1.6661806334287197,-2.09320047804635,-2.2999906453679886,-2.2268673439857887,-1.8883510409827624,-1.3691650177659964,-0.8010160152320334,-0.32652078043978183,-0.06016504138051273,-0.056994551659938164,-0.2976185144278364,-0.6936347619747412,-1.1119888844420294,,, +7.0625,14,-1.4115900896669125,-1.4821471999486198,-1.2745795562490856,-0.8146665162076528,-0.1961928961798869,0.4445328648124584,0.9658059651938136,1.2591244935659054,1.278683878728243,1.0536851406395331,0.6800857934191534,0.2940564097391912,0.034419771257933274,0.004369038554040028,,, +7.0703125,14,-1.9662756714479848,-1.827610316982617,-1.6906256615375646,-1.5575964489019931,-1.4307173842986982,-1.3120647695867502,-1.2035602172214193,-1.1069370782990555,-1.023710172486237,-0.955149349816788,-0.9022573472381784,-0.8657523275869276,-0.8460554066800825,-0.8432833868647448,,, +7.078125,14,-0.857246824200909,-0.8874534630572624,-0.933116977914396,-0.9931708692375908,-1.0662872700320072,-1.1509003337031238,-1.2452337936255735,-1.3473322117737805,-1.4550953691695798,-1.5663151958881931,-1.6787145938907837,-1.7899874728091318,-1.897839297565148,-2.000027437743305,,, +7.0859375,14,-2.094400612104925,-2.178936737471709,-2.2517785191464257,-2.3112661595801653,-0.7055335942061761,-0.5039584457114814,-0.3195538339223989,-0.16919174495405132,-0.06728668482939004,-0.02478373298655445,-0.048388723433654864,-0.14009424995505335,-0.2970345625482943,-0.5116794871332454,,, +7.09375,14,-0.7723538588675793,-1.064046259737631,-1.3694506763896843,-1.6701684512804906,-1.947986721806214,-2.1861442076544453,-2.370496088171872,-2.4904967475978337,-2.539931865932619,-2.5173488113754776,-2.426155327892552,-2.2743796415216284,-2.0741087185735507,-1.8406438515706536,,, +7.1015625,14,-1.5914324595871099,-1.3448505941099334,-1.1189210514935417,-0.9300564826086308,-0.7919151463179497,-0.7144490975774459,-0.703211181049969,-0.7589691529711204,1.7082453320650135,2.0387882120592242,2.3043134510656933,2.4542441226776086,2.455352507514217,2.29697754666391,,, +7.109375,14,1.992730186203328,1.5784207703426063,1.1065310636764651,0.638091663570065,0.23322967749429924,-0.05814135566694245,-0.20403948418818152,-0.19533846375517872,-0.04713131031271711,0.20367880320535744,0.5041847821840872,0.7937743321655255,1.0136283051102477,1.1159389629735113,,, +7.1171875,14,1.0714120801567335,0.8738841133355313,0.5413350178544197,0.11313869556902673,-0.35602092225177034,-0.8046207971219779,-1.1738375496081097,-1.4166685725497885,-1.5052150309108432,-1.4349925678820659,-1.2255984704176113,-0.9176315303095596,1.3166479230170942,1.911150466404718,,, +7.125,14,2.3586740535713453,2.5583196303978504,2.474820946303499,2.1480891457486573,1.6821740867655597,1.2166686123596435,0.8883936646226576,0.7938656590748563,0.9628329369221784,1.3501342028951968,1.8481101416822905,2.3161661898849646,2.619383620228791,2.665596026090875,,, +7.1328125,14,2.4307686914222253,1.9657239774288693,1.3823681831536736,0.8231932089214147,0.4224100808619855,0.2693647201653143,0.384260731862209,0.7128409064297131,1.1414830346794065,1.5285706259951548,1.7435386170241371,1.7028906527242968,1.3933145220696588,0.8755583585044242,,, +7.140625,14,-2.35596661245318,-2.3846988698248266,-2.3965548394651144,-2.3909154466959666,-2.36746167868597,-2.3261803776984604,-2.2673646817361446,-2.1916091047482475,-2.0997993424249777,-1.9930969819575528,-1.872919383372439,-1.7409150845906094,-1.5989351607438251,-1.4490010391163677,,, +7.1484375,14,-1.293269333143051,-1.133994311089776,-0.973488656455744,-0.8140832070519857,-0.658086377588773,-0.5077439761481221,-0.36520011801997343,-0.2324599211627082,-0.1113546363563852,-0.003509822480883717,0.08968287596656244,0.16708985507563467,0.22785515913750176,0.2714152264759183,,, +7.15625,14,0.2975085154334133,0.30617984209758564,0.29777935395013244,0.2729561575457441,-0.8776538361614891,-1.050644919082028,-1.2653744640402418,-1.5062060340038828,-1.7555281269477019,-1.9949856615583128,-2.20676363062993,-2.3748333999401887,-2.4860747345547107,-2.5311952997514657,,, +7.1640625,14,-2.5053835058448044,-2.4086491603407523,-2.2458281604424752,-2.026250885889475,-1.7630974028166695,-1.472484428474536,-1.1723477113362275,-0.8811977470166372,-0.6168355827066747,-0.3951182456107344,-0.22885987009723896,-0.12694513526440646,-0.09371681928650266,-0.12868016163908844,,, +7.171875,14,-0.2265446320993197,-0.377600176820784,-0.5684016875265566,-0.7827139464149343,-1.0026511355463583,-1.2099314318897234,-1.3871591839666837,-1.5190452427728238,-0.5663444808281253,-0.2330177883571344,0.02460153033027912,0.16130678754872418,0.15148127957910973,-0.00690733550513889,,, +7.1796875,14,-0.2919900929967121,-0.6614065650058877,-1.0589103595954863,-1.42314138195771,-1.6971984588347857,-1.8375212464380384,-1.8206979051890824,-1.6471380782814822,-1.3410389381354455,-0.9466494214341166,-0.5214143333587139,-0.12706596270847126,0.17994947910423598,0.3572196910833346,,, +7.1875,14,0.3829261074555631,0.25919423893769344,0.0117129589192555,-0.3143176970582019,-0.6612787897276877,-0.9681598530152066,-1.1801150410402919,-1.2570593354646558,-1.1799656180239326,-0.9538815158780574,-0.6071958420226491,-0.18726860179030166,-0.6551736974309907,-0.7600645478777571,,, +7.1953125,14,-0.5906776799947386,-0.21109368492469271,0.2586720433911183,0.6756901506007819,0.9133989691078644,0.8963800708124452,0.6210960010523112,0.15690601097510376,-0.3729189834979453,-0.8249791704925182,-1.0750674726599834,-1.0522529302785937,-0.7583841693032591,-0.267667002859739,,, +7.203125,14,0.2935688983805357,0.7813699371680056,1.0734709227956387,1.102646838874629,0.8749648443509457,0.4679358391470244,0.009073976410727769,-0.35925779481133063,-0.5190793946952792,-0.4093482113259157,-0.04291228907559018,0.4967863925280162,1.0783571700322203,1.5582502404427332,,, +7.2109375,14,0.2326467119352741,0.1780581911989616,0.11064710754541096,0.0320935694192897,-0.05572837451039631,-0.15078378607205406,-0.25091270417553513,-0.3538681991048108,-0.4573559480596126,-0.5590746388521597,-0.6567564941619342,-0.7482072066448109,-0.8313445855081124,-0.904235237726682,,, +7.21875,14,-0.9651286414911138,-1.0124880151399018,-1.0450174409422854,-1.0616847686758617,-1.0617398978406438,-1.044728118272904,-1.0104982754504,-0.9592056174024056,-0.8913092732641685,-0.8075644075174764,-0.7090091871882036,-0.5969467901004741,-0.4729227691181594,-0.3386981686239817,,, +7.2265625,14,-0.19621886386722914,-0.04758165994838559,0.10500225604624493,0.2592458699020895,-1.5934803324760085,-1.6023865945691318,-1.542287908026866,-1.4145591989049071,-1.225337338186636,-0.9850998255299559,-0.7079406232653719,-0.41059362406321503,-0.11127183442119276,0.17159679270133166,,, +7.234375,14,0.4206487352914915,0.6207902877633844,0.7602449116736271,0.8313695285190523,0.8311828432576627,0.7615688675654657,0.6291414605387718,0.4447793421941524,0.2228640133928163,-0.01972626763477672,-0.26479629177872616,-0.4941052104930925,-0.6906406939733368,-0.8398070801244817,,, +7.2421875,14,-0.9304446568744926,-0.9556089967981132,-0.9130559961527368,-0.8053987934113854,-0.6399256240895482,-0.42809131347607854,-0.18471786797347567,0.07304008794778874,0.2468950648523015,0.6337862065283734,0.9189251055246808,1.0633014790855742,1.049407476930592,0.8839240378382666,,, +7.25,14,0.5966424120474226,0.2357890347796024,-0.13951788208459026,-0.4685049394204797,-0.6982345159403462,-0.7918717011928355,-0.7344394569526562,-0.5351655085296523,-0.2260553434915369,0.14308648068556284,0.5124113032295621,0.8213497438912695,1.018051336646453,1.067470118414778,,, +7.2578125,14,0.9568367566654504,0.6976648394335672,0.32397875338255394,-0.1129609368080586,-0.5526131812132163,-0.9345542107132904,-1.2078537849497235,-1.338969699563458,-1.3169311352854636,-1.1550037238916429,-0.8885772113584685,-0.5696049619840207,1.531262281883949,1.0836730332388629,,, +7.265625,14,0.5946550774013702,0.20576850247609213,0.029156229169947312,0.11668245624194352,0.4456106099026565,0.9247471280120704,1.419368154788322,1.7880981972095158,1.921633921106624,1.7727003635148666,1.36902956239965,0.8058044426688264,0.2196385471330464,-0.24877753256498256,,, +7.2734375,14,-0.4931262523426138,-0.4704726345955191,-0.21288366861671165,0.1815256641665325,0.5756642889885433,0.8312336801877138,0.846840274986596,0.5860043491130653,0.08738701841140656,-0.5455695765432921,-1.1727516836493221,-1.6555311463486233,-1.8945148294555456,-1.8565424568788318,,, +7.28125,14,0.4128262271212696,0.5634249534245694,0.7087686994847484,0.8466688017852271,0.9750594652255756,1.0920337989740818,1.1958770746547351,1.2850966245918136,1.3584478566615628,1.414955930298942,1.453932714175428,1.474988728679158,1.4780398641420087,1.4633087572306778,,, +7.2890625,14,1.431320801452054,1.382894861675775,1.3191288553067588,1.2413804526209904,1.1512432342396122,1.0505187232568334,0.9411847817694264,0.825360925211951,0.7052711618656133,0.5832050082430665,0.4614773629850442,0.3423879418908506,0.2281809843860957,0.1210059369727916,,, +7.296875,14,0.022879802100583047,-0.06434818827062938,-0.13902895585263875,-0.19974244893119752,0.3268928832922636,0.5586928667754519,0.7517019097283134,0.8917609537228278,0.9682800409253296,0.9749797827167968,0.9103325543624944,0.777672641828264,0.5849676511370141,0.3442671111959137,,, +7.3046875,14,0.07086671066880909,-0.2177535614451894,-0.5031433360902917,-0.7671632067632091,-0.9932441549388861,-1.1675372476966417,-1.2798734491167572,-1.3244666288762916,-1.3003107595954295,-1.2112436201003471,-1.065672577750886,-0.8759815876323092,-0.6576607764807008,-0.42821932453841305,,, +7.3125,14,-0.2059574700932216,-0.008683285478602532,0.1475362752653141,0.24950294662397754,0.2878146935603429,0.25752852758354405,0.1585123595020761,-0.004538664071872756,-0.25846162798167793,-0.014487453916034454,0.11330774192516713,0.09393272985844556,-0.08070257881085374,-0.39447095935427795,,, +7.3203125,14,-0.8094833720951957,-1.2719339670388958,-1.7204244968558606,-2.095471858372353,-2.348718201592653,-2.450409367810652,-2.3939771296288206,-2.1970117967534293,-1.8984739625152085,-1.552579929867777,-1.2203134364086006,-0.959886001979938,-0.8176319663627709,-0.8207565645651869,,, +7.328125,14,-0.9730667510375072,-1.2543498885309408,-1.6234972255305344,-2.024885797212733,-2.397024849115857,-2.6821201516548454,-2.8350665870591456,-2.830468419301221,-2.666593835470402,-2.3656478293729526,-1.9703209146229053,-1.537151192599491,-0.7878224919271797,-0.5400517779399503,,, +7.3359375,14,-0.5313477377866956,-0.7881829463226664,-1.2621884360836182,-1.8432526201568,-2.3895603304212614,-2.7663404035006756,-2.8827033176266377,-2.716473656098666,-2.320212235530553,-1.8067778840508053,-1.3183862168465752,-0.9876455261545172,-0.9012485264519674,-1.0762705983991976,,, +7.34375,14,-1.4555699084951992,-1.9235493321900807,-2.3379593576451647,-2.569024613447831,-2.535169306011748,-2.225548829178148,-1.7032106942824858,-1.0880167192643702,-0.5240051313999685,-0.1401356926175028,-0.0151743910751726,-0.15633965043578313,-0.4975603473301637,-0.917820897264004,,, +7.3515625,14,-0.2453224994337331,-0.27487722892545896,-0.28780464624060464,-0.2838031636513546,-0.2628768474569535,-0.22533531107859794,-0.17178825255824126,-0.10313473213899003,-0.02054737770856685,0.07454820529618544,0.18049845895441569,0.29545089466525376,0.41738660347636575,0.5441556856346962,,, +7.359375,14,0.6735149789382981,0.8031674252153277,0.9308023855662888,1.0541361983933988,1.1709522699848909,1.2791399956042273,1.3767318295109492,1.4619378547460258,1.533177247294035,1.5891060836092126,1.6286410045176805,1.6509783210608204,1.6556082276522242,1.64232387359021,,, +7.3671875,14,1.6112251339944692,1.5627170140463704,1.4975027143797848,1.4165714789512132,-0.22242249671233685,-0.4820648795467238,-0.7674241380108427,-1.0606030102205848,-1.3430899919823545,-1.5970436515921596,-1.806530370835555,-1.9586292160035916,-2.044326907799197,-2.059140495664688,,, +7.375,14,-2.0034243296479803,-1.8823399373743084,-1.705490919876189,-1.486248338785406,-1.2408136498382842,-0.987084538767988,-0.7434027592767319,-0.5272713004899495,-0.35413034937219434,-0.2362774129245541,-0.1820069115408537,-0.19502924974397784,-0.2742098809169532,-0.4136465676770097,,, +7.3828125,14,-0.6030794552968926,-0.8286053666727455,-1.07364651219103,-1.3201060658770594,-1.5496300276042192,-1.7448873786516097,-1.8907792614201056,-1.975492862651092,-1.1277336165044578,-0.7991455826509394,-0.5950800210007574,-0.539066940417821,-0.6308390770557637,-0.8464075651111791,,, +7.390625,14,-1.1418356758655397,-1.4601226603994373,-1.7401253003759798,-1.9261273725921608,-1.9765663032092688,-1.870557547098904,-1.6112002322852446,-1.2251489343284416,-0.7585180067258758,-0.26975610984272685,0.179399517424513,0.5334804132319775,0.7518675598452613,0.8150591721407472,,, +7.3984375,14,0.7276496603981073,0.5175560704935445,0.2316127765974085,-0.07177913938700997,-0.331802645480717,-0.4947501049599206,-0.5224393249078207,-0.39820921267386267,-0.1295609453768337,0.2529669505412345,0.7005146103171784,1.1534735866337409,-1.3504930046681451,-0.9967706792751236,,, +7.40625,14,-0.4541198806873479,0.15218288972223198,0.6780329470055504,0.9998244868242638,1.0481761890718424,0.8268135316104269,0.4114339159569586,-0.07113336268112208,-0.4777598659224629,-0.6882962598543795,-0.6385306610277686,-0.3377939830507555,0.13361281016857687,0.6464642213706032,,, +7.4140625,14,1.058086076734227,1.2515382377041746,1.1677645497032685,0.8218976908140444,0.29924907112077304,-0.2679185164685604,-0.7364710772942022,-0.9914495770767074,-0.9773824738549984,-0.7132846739209392,-0.2872341195441617,0.16798555177981425,0.5114985605376305,0.6331699395610929,,, +7.421875,14,1.3211814380730638,1.2128377469267668,1.0932664022467051,0.9643841955366812,0.8282653288313169,0.6871052774479731,0.5431825323799289,0.3988188921073819,0.2563389989979549,0.11802982869856064,-0.013899158262646594,-0.13735450503959362,-0.25039521338448045,-0.3512665267171691,,, +7.4296875,14,-0.4384304499293133,-0.5105924716496596,-0.5667240211903751,-0.6060802670813212,-0.6282129456698223,-0.6329779952857508,-0.6205378624289266,-0.5913584397278968,-0.5462006894178504,-0.4861070991419339,-0.412383207367132,-0.3265745220366284,-0.2304392367453065,-0.12591722231098454,,, +7.4375,14,-0.015095836830347237,0.09982684698052936,0.21658075314039246,0.3328637744832619,-1.9913265079896048,-1.9352284290639763,-1.8090116299612948,-1.619229865782255,-1.3767233768878029,-1.0958660506408715,-0.7935665020758244,-0.4880927241792662,-0.19780226076290144,0.06013355760364214,,, +7.4453125,14,0.2709223608503021,0.4231773058153608,0.5097058867528672,0.5280059950047108,0.4804346479615098,0.3740376338400044,0.22005196477925376,0.03311584740557408,-0.16975872375192758,-0.3703790910787006,-0.5506475615210726,-0.6938305680714556,-0.7857328466444506,-0.8156947331489496,,, +7.453125,14,-0.7773430196563561,-0.6690429934234369,-0.4940201197787412,-0.2601428664898546,0.020618203231182075,0.3330173672037639,0.6595890626740546,0.9818580132870472,1.5507370351641727,1.8391867293112405,1.9819393982355085,1.96406810553434,1.794907642327193,1.5065849463781145,,, +7.4609375,14,1.1490035106365637,0.7820630337317607,0.4663261696696118,0.25358608541160177,0.1788039636414479,0.2546721908530083,0.4696499857873294,0.78977735187777,1.163984723420029,1.532071182905421,1.8341084640042864,2.0198058628281896,2.0563772514325587,1.9336846764772408,,, +7.46875,14,1.6658571966477052,1.289132598118916,0.8562579206707372,0.42832069833187697,0.06528298734313531,-0.18330770756158168,-0.2859840585371205,-0.2342074089878089,-0.043644242481159716,0.2483279026572882,0.5884963159623562,0.9161553040704364,-0.4556236982412561,-1.016165540908809,,, +7.4765625,14,-1.4502725652164268,-1.649699305011009,-1.5689649871476168,-1.2376571999973176,-0.7521775637886717,-0.24919310153146665,0.1319292334299138,0.28740820400278344,0.17756024593739714,-0.16227726287027233,-0.6314056878023319,-1.0913606714555812,-1.4038805254679776,-1.4688413927603692,,, +7.484375,14,-1.2517619928168142,-0.7933392223634219,-0.19840048703472468,0.39270029772890747,0.8424046204194633,1.0534875725181292,0.995525660261068,0.7130417684054379,0.31309669456638145,-0.06427012826963874,-0.2846474765742504,-0.2563237509346571,0.04433928947782007,0.5661867882638147,,, +7.4921875,14,0.4463823054212647,0.5548916255303883,0.6562354267087841,0.7483837916567114,0.8294689585430176,0.8978182454874735,0.9519835582213336,0.9907669641153352,1.0132418846448374,1.0187695350821822,1.0070103234284524,0.9779300088608708,0.9318005117337964,0.8691953608232066,,, +7.5,15,0.7909798574072127,0.6982961282848004,0.5925433293289559,0.4753533460882103,0.3485624167958438,0.21417917454732746,0.07434966810864588,-0.06868002627883185,-0.21260294754374773,-0.3550914616094704,-0.4938378384016245,-0.6265944836457069,-0.7512131211072988,-0.8656822392986492,,, +7.5078125,15,-0.9681621470668912,-1.0570170243427408,-1.1308434069412725,-1.1884946067452855,1.2816197959762343,1.5422025670565402,1.7496219805241973,1.893548779482369,1.9680216043234984,1.9718553279270072,1.9087164597428719,1.7868603766791864,1.6185487202732656,1.4191876022772556,,, +7.515625,15,1.2062467293039991,0.9980348339474056,0.8124168195330781,0.6655620896394546,0.5708113583861458,0.5377409748814038,0.5714900213372035,0.6723971197013837,0.835972284049083,1.0532057915033175,1.3111925423875486,1.5940283795372534,1.883915871381988,2.1624024560902466,,, +7.5234375,15,2.411664613341323,2.615748519853643,2.7616806785344146,2.840371077455329,2.847245901606143,2.7825656786958017,2.6514066751293104,2.4633068400918026,1.172615056495974,1.3103958441165349,1.3006752214051418,1.1378280125764362,0.8403516827561455,0.4480326987391139,,, +7.53125,15,0.01579497909289118,-0.3948116737354849,-0.7251576693032693,-0.9286276165477868,-0.9778459699811868,-0.8689090905058423,-0.6219647268520518,-0.27804881473599685,0.10732758487820007,0.4728422229743596,0.760926923509987,0.9267442507416206,0.9451773623273856,0.814744305216398,,, +7.5390625,15,0.5578270665056961,0.21717970880119,-0.1507405071949565,-0.4845802528041265,-0.7276636893980419,-0.8368412340754692,-0.789235183156002,-0.5858313998853689,-0.2513574962759908,0.16953368071942504,0.6191809971700615,1.0358552598259525,2.2234405927522345,2.3952542985331937,,, +7.546875,15,2.289510428201151,1.9605660379012355,1.5222094719420958,1.1162864731331044,0.8736519074555029,0.8781506218230501,1.1435006067413958,1.6094153357666412,2.158029095942352,2.6461244963664785,2.944330244630831,2.972546738729557,2.721890659208788,2.2571442758262754,,, +7.5546875,15,1.6990380470558644,1.1912219726767994,0.8609773088717194,0.7844356350795805,0.9658367400053446,1.3365089919030924,1.7738503443259193,2.135106393679725,2.29668632960891,2.188239716292024,1.8121528250013417,1.2431192020184636,0.6079001284088085,0.0508199213447893,,, +7.5625,15,-1.2291006397678164,-1.2520833132477311,-1.2571662076931722,-1.244379379174918,-1.2140586996174674,-1.1668398467210943,-1.1036470488306298,-1.0256767819042505,-0.9343767041218968,-0.8314201970575612,-0.7186769592678678,-0.5981801672664339,-0.4720907789566297,-0.3426596046281809,,, +7.5703125,15,-0.21218780970790285,-0.08298654091535257,0.042663617183217206,0.16255264526051444,0.27457985145614383,0.3767907139817997,0.4674111589509081,0.5448786731955012,0.6078697072534416,0.6553228886715605,0.6864576391354178,0.7007878694166749,0.6981305123211262,0.6786087442088817,,, +7.578125,15,0.6426498386647692,0.5909776898904185,0.5246001367264153,0.4447913092560971,2.231600986968433,1.9724915709638133,1.7039198586744784,1.4443162038489916,1.2113165730579012,1.0205348176963531,0.8844763005665583,0.8116686274019492,0.8060700935037624,0.8667970889457947,,, +7.5859375,15,0.9881894630715068,1.160209281309352,1.3691451581286702,1.5985730404837268,1.8305064323358893,2.0466558398806978,2.229709600203474,2.364546764375056,2.439297443514424,2.44617666272432,2.3820335613350263,2.2485776272519,2.0522661742217188,1.8038608930617333,,, +7.59375,15,1.5176843840701248,1.2106284987997609,0.9009836262219528,0.6071705441939321,0.34646325138122835,0.1337918235874731,-0.01929124201869969,-0.10540913190518064,1.363330447588921,1.559595402667186,1.6033493279816753,1.4972696327605224,1.2675434022615035,0.9597357366607098,,, +7.6015625,15,0.6316387635539444,0.3442154105408579,0.15204878009392409,0.0947849770348972,0.19090250503033024,0.4347789731850776,0.7975122789182438,1.2313686508680262,1.6771650285356925,2.073436211028312,2.3659592126801448,2.516151617698439,2.50703609641506,2.3458423174358445,,, +7.609375,15,2.0628412205913813,1.7065934313814348,1.3363520989758668,1.0128036373529472,0.7885887125374463,0.7000800289081425,0.7616976958810363,0.9636476954943644,1.2734357855924132,1.640921109012392,2.006122430655992,2.308561167105311,-0.2196445824734674,0.13934223618768565,,, +7.6171875,15,0.5557570193948955,0.8872273992798531,1.0157033041478485,0.8800113726704795,0.4928077159891765,-0.06271887580612362,-0.6554912491177987,-1.142330959707217,-1.407081134903006,-1.3923437381696135,-1.115133831224919,-0.6621611011505696,-0.16603227339446675,0.2311031614844413,,, +7.625,15,0.4165002762103458,0.33768498819824644,0.016780169985458282,-0.4556341689589729,-0.9454430936436828,-1.311869933705821,-1.446193453607718,-1.3016964557975654,-0.9066363143965828,-0.3566809736807458,0.2111182819828825,0.6556858743374694,0.8703757641323607,0.8119830685155461,,, +7.6328125,15,0.3530693071004358,0.25116960025900703,0.14101461825149192,0.024680060062988896,-0.09564148518469913,-0.21767896981977908,-0.3391226985108081,-0.4576648213537617,-0.5710398000966727,-0.6770641389136757,-0.773674684012623,-0.8589648214171128,-0.9312179390651468,-0.9889375672621628,,, +7.640625,15,-1.0308736696879843,-1.0560446245559283,-1.0637545109849524,-1.0536053978485376,-1.0255044198665118,-0.9796655169790884,-0.9166058064844635,-0.8371366513990709,-0.742349581364398,-0.6335973125549073,-0.5124701988533067,-0.3807685265558733,-0.2404711376478829,-0.09370093097077464,,, +7.6484375,15,0.0573121547280976,0.21027002778654447,0.3628465198388645,0.512727949605925,-0.12186763326590212,-0.07083553151396615,0.04081407430116269,0.2019904554455421,0.3981659817992046,0.612396434995348,0.8265097400817805,1.0223802052705846,1.1831993968618468,1.2946550113876178,,, +7.65625,15,1.3459355230149506,1.3304905338783422,1.2464937910435618,1.0969765682578307,0.8896220976404219,0.636235373049145,0.35192528477322954,0.054056105826717236,-0.23895856542458385,-0.508935314924286,-0.7391846607735424,-0.9156709236055308,-1.0279873468328646,-1.070078476598029,,, +7.6640625,15,-1.040659434905797,-0.943302855254918,-0.7861874242645537,-0.5815255692906368,-0.3447102054015856,-0.09324004515520858,0.15450158467619196,0.3805292606798749,2.496685988846913,2.5359110486918173,2.41401580397542,2.1430653249377647,1.7575519137330025,1.3090473891264185,,, +7.671875,15,0.8581988544728967,0.4653145139777972,0.1810056912797104,0.03834243301450624,0.04774431448951022,0.19540202674419904,0.4454753718022773,0.7457250839164143,1.035701045778504,1.2562112856246779,1.3585966430396763,1.3123662510238736,1.1100042864358852,0.7681990252773294,,, +7.6796875,15,0.32530248014136465,-0.1645839986852676,-0.6399772540396783,-1.0415299914573923,-1.3212164521356518,-1.4497556606076996,-1.4211163204462245,-1.2534019735297235,-0.9859788235133208,-0.6732938396986432,-0.3763462531193493,-0.15314104126991512,-0.3796577642176423,-0.6967917934485233,,, +7.6875,15,-0.7804918324585377,-0.5941808879036945,-0.17635626444173785,0.3697716873278932,0.9043891484223838,1.2892344690093918,1.4253441452575757,1.2800455441248664,0.8957997684225986,0.3784722143856401,-0.1317535563224751,-0.4988462526968664,-0.6282374619045059,-0.4927463688505313,,, +7.6953125,15,-0.1400132649156096,0.3205953834551476,0.7480210992252638,1.008254845239538,1.0111672076381153,0.7353323860671058,0.2340414157313512,-0.3791446629768491,-0.9613436501641416,-1.3793224552310923,-1.54580990294335,-1.4432016438332729,-1.1281622871564585,-0.7158654602896996,,, +7.703125,15,0.6576534640900369,0.7954544508961209,0.9240923316719656,1.0416940750064492,1.1465848070591496,1.2373169490173632,1.3126953712902076,1.3717981241016508,1.4139923816010986,1.4389453204235572,1.4466297423312668,1.437324342600095,1.4116086195695694,1.3703525146090638,,, +7.7109375,15,1.314700964024839,1.2460536335248906,1.1660401902143782,1.076491545232063,0.9794075706938256,0.8769218563455581,0.7712641231616173,0.6647209521557439,0.5595955161698938,0.4581670198666982,0.3626505582614149,0.27515809679965586,0.19766125635265408,0.1319565548953152,,, +7.71875,15,0.07963371461817093,0.04204758954883382,0.020294205363218243,0.015191331064366096,0.5685098797173026,0.7049015005883754,0.7798971961183458,0.7881080994035298,0.7289380155945785,0.6066234795264402,0.4299364698356606,0.2115705150399409,-0.0327469940741931,-0.2853543781296042,,, +7.7265625,15,-0.5278904450324793,-0.7425783553428539,-0.9134690405576168,-1.027557457516382,-1.0756938289986542,-1.053226316185214,-0.9603302961267798,-0.8020012707842602,-0.5877118896591627,-0.33075698990758856,-0.047332312835187226,0.2445888732225437,0.5265029214666268,0.7806597739252552,,, +7.734375,15,0.991294227650288,1.145718655375728,1.2352009977254796,1.2555668180444512,1.2074834531554732,1.0964064620128795,0.9321921234296996,0.7284030216428246,-0.049611545389768086,-0.09242528004892824,-0.28479366228085023,-0.6059384948274015,-1.0142984620511544,-1.4539763522689724,,, +7.7421875,15,-1.8634229411988448,-2.1850050799727168,-2.373967791643175,-2.405394546035587,-2.278081656311969,-2.0147233614400917,-1.6583787677943247,-1.2657709220684021,-0.8984616789609966,-0.6132768625101318,-0.4534729702549416,-0.44202115022614497,-0.5780543849241965,-0.8370311114939057,,, +7.75,15,-1.1745896347186418,-1.5334928117999125,-1.852581145458246,-2.0763395864160867,-2.163587743624434,-2.0939397214009468,-1.871027183170583,-1.521983375462991,-1.093268211756614,-0.643484407148457,-0.2343033081293933,0.07908651823592837,-0.21645307291062246,-0.5443808128978318,,, +7.7578125,15,-1.0752398272341908,-1.6891338031828431,-2.2420654034102383,-2.605190876255865,-2.69993320225528,-2.5193321412586918,-2.1297814756366242,-1.6526788889591806,-1.231019111798768,-0.9900874004034952,-1.0030271596605775,-1.2707194792139536,-1.7214896916642206,-2.2307218696187032,,, +7.765625,15,-2.6550058047597487,-2.871457887209325,-2.811439084151457,-2.4794285962155485,-1.9518799489746472,-1.35637229124643,-0.8367699716645259,-0.5139379919110777,-0.4527787620281208,-0.6446229421120677,-1.0097989118761233,-1.4196749194222893,-1.7321309657139534,-1.830736692838132,,, +7.7734375,15,0.027263922852535986,0.056734695199496366,0.10351998436235488,0.16723097690257627,0.24718028183383545,0.34239373145634044,0.4516272043805397,0.5733881763039497,0.7059616213237587,0.8474398103863645,0.9957554852390144,1.1487178271413414,1.3040505906574278,1.4594317349405117,,, +7.78125,15,1.6125338586958875,1.761064730938816,1.902807207983146,2.03565783784235,2.157663476209269,2.26705527299244,2.362279434431236,2.4420242222674813,2.505242717339044,2.5511709491254013,2.5793410739130707,2.589589370947918,2.582058916674808,2.557196890350184,,, +7.7890625,15,2.515746558315437,2.458734077393516,2.3874503485859218,2.303428238914061,0.5013551605278543,0.2689730713520992,0.04953276818477748,-0.13961977421199698,-0.28328523835679353,-0.36947782232015625,-0.3902679260918496,-0.342341886250621,-0.22723971048958924,-0.051254217907761856,,, +7.796875,15,0.1750013974684239,0.4373274402301949,0.7189218639543558,1.0015460851480884,1.2667911790941817,1.4973561755028686,1.678249327604575,1.7978285990850766,1.8486088245487275,1.8277792691875312,1.7373955074982912,1.5842322510028854,1.3793073973576009,1.1371104993148329,,, +7.8046875,15,0.8745894630296784,0.6099661438993004,0.3614634388895783,0.14603264516587874,-0.021830164512554817,-0.13109620738515315,-0.17497391918727434,-0.15138305326808255,0.2565205421252108,0.27905932076460216,0.15188378536269387,-0.0965659007963756,-0.4190734980944325,-0.7570533015093017,,, +7.8125,15,-1.0497263101270065,-1.2436364475778547,-1.3010243694593822,-1.2057543404615076,-0.9658707973175716,-0.6123861702799105,-0.19448855073085136,0.22808456493350104,0.5943188107186768,0.8513976879361066,0.9629039142666403,0.9144701141499306,0.7159988391471327,0.4001062322137432,,, +7.8203125,15,0.0170318170523244,-0.3731927071634413,-0.7100958818314653,-0.9421834162377593,-1.0349528997020392,-0.9762579954770676,-0.7781866663245935,-0.4751609601655747,-0.11855441630349248,0.231334428647172,0.5147021354787502,0.6815866790436328,-0.6241376616383388,0.016586277035319785,,, +7.828125,15,0.5526854460758743,0.8690631785476228,0.9101794924023476,0.6950478575110984,0.3118088071069328,-0.10663048810418158,-0.4192124225482096,-0.5155638593943697,-0.3464047209228173,0.06280519422749087,0.6187225604502155,1.185601953650448,1.6224195081820776,1.8214649706485424,,, +7.8359375,15,1.7378256739886209,1.4016820010593785,0.9100445541415864,0.4001974503485857,0.012125758637909434,-0.14977599218377954,-0.04522046517346556,0.29104526261923924,0.7588955816148425,1.2204176279953225,1.5378745405452203,1.6116344859189844,1.407668495296951,0.9670789185839728,,, +7.84375,15,2.208415570350787,2.104344348902357,1.993296772735952,1.8774686146419104,1.7591306200940169,1.6405885969157414,1.5241428954657843,1.4120479889292152,1.3064728615415755,1.2094628984258458,1.1229039444261757,1.0484891613390657,0.9876892639429228,0.9417266560587264,,, +7.8515625,15,0.9115539195840644,0.8978370332191629,0.9009436147836652,0.9209363930579746,0.9575720235104496,1.010305268698199,1.0782984701904923,1.1604361462075876,1.2553444594119898,1.3614152140116005,1.4768339620222095,1.5996117265820764,1.7276197868759235,1.858626915610289,,, +7.859375,15,1.990338417038476,2.1204362820006,2.24661975688204,2.366645616144956,-0.06309988798915978,0.08243658444829127,0.2736439729291854,0.4956050920469922,0.7311094684497802,0.961855119134202,1.169726794824873,1.338061548603095,1.4528133730029074,1.5035356862707356,,, +7.8671875,15,1.4841131496611988,1.3931917768181203,1.2342773345878,1.015495164972049,0.7490281673918932,0.45027212264554295,0.13676724993026598,-0.17301950836169985,-0.4609765707646607,-0.7106047784099189,-0.9081617883365276,-1.0436140097951692,-1.1113297160331583,-1.110465013183103,,, +7.875,15,-1.0450157663610609,-0.9235318773507926,-0.7585138539139569,-0.5655337659151657,-0.3621419031272264,-0.1666353935435983,0.003225332821539806,0.1314627125871961,0.6996840817963241,0.5594176986076993,0.2754703854504569,-0.11545930575371376,-0.5603276496820501,-0.9979600143018564,,, +7.8828125,15,-1.368529708129334,-1.6228252893153738,-1.7298631745595725,-1.68166012128193,-1.4944225268922366,-1.20596759285402,-0.8697783108905182,-0.5466185298536166,-0.2950143917728868,-0.16208499277947164,-0.17615072766825335,-0.3422708884673129,-0.6414058343704331,-1.0333344965973477,,, +7.890625,15,-1.4628730594532229,-1.868426472830501,-2.1915410888788083,-2.385970772240465,-2.4248445981874407,-2.304819925463625,-2.046574158189856,-1.6915587625051218,-1.2955212591503975,-0.9198042992358896,-0.6217771420601232,-0.4458899668640378,-0.5836266631781586,-0.7550862169970222,,, +7.8984375,15,-0.6516417292158323,-0.31778082926382056,0.1394078671158343,0.5797953128875947,0.8688196102348015,0.9145574888085538,0.6930976504340695,0.25526017039013066,-0.287181238374956,-0.7919994965173519,-1.1253790596679882,-1.198494879602403,-0.9917811810934362,-0.5602394720966144,,, +7.90625,15,-0.0183315845794918,0.4914015289895182,0.8373944426298814,0.9350816934595001,0.7700190509126563,0.4017652372381458,-0.05253909865680465,-0.4503937839929278,-0.6631306618528121,-0.6113318199173914,-0.2867660457906209,0.2451701570584268,0.8631776827178487,1.423089948156259,,, +7.9140625,15,2.478367433270725,2.5797731624896443,2.6690203732466853,2.744468520449553,2.8047076854468442,2.848583284475368,2.8752163119246834,2.884018763946964,2.8747039723295624,2.847291667665457,2.8021076831428844,2.73977830411514,2.661219362360048,2.5676202659562137,,, +7.921875,15,2.460423244375633,2.341298172172667,2.2121134120625765,2.0749031878811595,1.9318320586759667,1.7851571159331592,1.6371885658128271,1.490249386537046,1.3466347672682804,1.2085720386389815,1.0781817964791454,0.95744089939711,0.8481479880508029,0.7518921297917031,,, +7.9296875,15,0.6700251376356642,0.6036380481732897,0.5535421702098576,0.5202550358862061,0.20500393366388905,0.2146002860873657,0.1554798524580172,0.02768800647016245,-0.1639080418369072,-0.4099509883279389,-0.6972383482532718,-1.0096355861355324,-1.3291938034766335,-1.6373940610265902,,, +7.9375,15,-1.9164315814652173,-2.1504502970801007,-2.326641669293948,-2.4361311712880047,-2.47459063149964,-2.44253375192671,-2.3452742079373525,-2.1925492650450944,-1.9978351721457608,-1.7774020835558269,-1.549174425091853,-1.3314761858147328,-1.1417486409216506,-0.9953299330658798,,, +7.9453125,15,-0.9043816251071096,-0.8770370878051109,-0.916831115977745,-1.0224505549452072,-1.1878233332484696,-1.4025396987080712,-1.6525762884995805,-1.9212725455434407,-0.4167444203575663,-0.5352597417935581,-0.7785316338962317,-1.1034058622568634,-1.4532099561876801,-1.7665944720942794,,, +7.953125,15,-1.9871066841587588,-2.0720054672494768,-1.9989443052220908,-1.7694813889567935,-1.4088699470631698,-0.9621613073671862,-0.4872274815380819,-0.04578984925976914,0.3061489366130992,0.5269797653923631,0.5959176921005069,0.5161870136677683,0.31446496407931296,0.036670944005058666,,, +7.9609375,15,-0.25924258926074795,-0.5123744318999455,-0.6684189266309464,-0.6881833732050933,-0.5537516310307375,-0.27133360595121025,0.12964349491402632,0.6010608895350747,1.0835463100385658,1.5156662147548712,1.8434406627970716,2.0286991260802334,1.7536378192697049,1.3998517213154744,,, +7.96875,15,0.9699055767300702,0.6064047495612439,0.4328561788478771,0.5195936899733238,0.8642840433249838,1.3923584438574528,1.9772531791159567,2.474913862647334,2.7631084136056803,2.7747758373422986,2.5162723293805,2.0655152520647158,1.5505347477828222,1.1143122462612771,,, +7.9765625,15,0.8755432806716967,0.89607885187305,1.16396898577524,1.5967558284042642,2.0641136242684635,2.4236303161325328,2.5599235757649317,2.416370008019114,2.010750584968004,1.430523260698922,0.8090171210977222,0.28907109472184755,-0.015918829793963533,-0.05286981879422925,,, +7.984375,15,0.5039915001890245,0.5046601446079699,0.5218650478191792,0.5549128922963705,0.6028252823162018,0.6643560575714559,0.7380132991300671,0.8220856423143535,0.914672435656798,1.0137172177440303,1.1170439256616815,1.2223952009203845,1.3274721220164498,1.429974667795429,,, +7.9921875,15,1.527642202991959,1.6182932769275329,1.699864038372913,1.7704445938128182,1.828312672357137,1.8719640077049,1.9001389050484776,1.9118445276061504,1.90637251241952,1.8833116068344813,1.8425551042720587,1.7843029489579465,1.709058472625558,1.6176198201993481,,, +8.0,16,1.5110662144617382,1.3907393000739114,1.258219893481231,1.1153005456767946,-2.190491395782689,-2.4418832510037745,-2.6581651958163923,-2.82432615773138,-2.928674019886325,-2.963651656974225,-2.9263649878225215,-2.8187862192390587,-2.6476181048668264,-2.4238286804799527,,, +8.0078125,16,-2.1618889150760072,-1.878766432957644,-1.5927454711607911,-1.3221553529954408,-1.0840961371760451,-0.893250298253796,-0.7608632941226645,-0.6939640986540728,-0.6948800433318193,-0.7610797880185329,-0.8853553588956778,-1.0563305468074706,-1.259260200544694,-1.4770646640535978,,, +8.015625,16,-1.6915272087386826,-1.8845709454063384,-2.0395261576074173,-2.142299665700385,-2.182364662309761,-2.153501978646445,-2.0542410743918498,-1.8879699828406016,2.054976034169212,1.9300280359611768,1.6845811353945468,1.3675030619310813,1.038153010517889,0.7571005096782366,,, +8.0234375,16,0.5766591766670488,0.5327099334353167,0.6390873985266643,0.8854039228571025,1.2386502865523008,1.6483238190252605,2.054285269180801,2.3961207145900043,2.6225503596995816,2.6994187488314325,2.615021850767888,2.38194124707179,2.035099672599218,1.6263406806392957,,, +8.03125,16,1.2163765711428909,0.8653586080856469,0.6235381190868171,0.523472897125107,0.574992618210952,0.7637072414998027,1.0532905050742265,1.3911826256038702,1.7168237382745417,1.9711354256806288,2.1057732776935447,2.090709078536767,0.9113163230905438,1.1824344252660743,,, +8.0390625,16,1.2275950104941231,1.0003788792935606,0.5292768018092,-0.08987832288220454,-0.7199413437202754,-1.2198148425834052,-1.4829019846100486,-1.4661153795855757,-1.2014933062011155,-0.7872413264498115,-0.3606560606533527,-0.060353295654289485,0.01184620670748271,-0.1810738025210864,,, +8.046875,16,-0.6010976951461908,-1.145536403614596,-1.6751331875803108,-2.0522140404650453,-2.178426905237023,-2.0217263556775182,-1.6252076880777315,-1.095368697149694,-0.5730154665933818,-0.1947850689459432,-0.055829511342260114,-0.18388683022567587,-0.5318442035571669,-0.9908296969769556,,, +8.0546875,16,0.9639543981104872,0.8063008769412449,0.6445688261866345,0.4810577251706155,0.31809766921430765,0.1580088141673311,0.0030609947702271434,-0.1445657762099012,-0.2828192365476624,-0.40981056683938016,-0.5238472216618063,-0.6234623248701702,-0.7074401144613827,-0.7748369915970534,,, +8.0625,16,-0.8249978053516882,-0.8575670881738152,-0.8724950454578733,-0.8700381944808677,-0.8507546416448881,-0.8154940808490545,-0.765382688245521,-0.7018031779977647,-0.6263703683879472,-0.5409026862325821,-0.4473901086847518,-0.3479591038791545,-0.2448351844275578,-0.14030372956671094,,, +8.0703125,16,-0.03666976207635103,0.06378261561479442,0.1588304157531955,0.2463508861028323,-1.6627065275952375,-1.3905467475584974,-1.0868289761345515,-0.7690718488044056,-0.4557602778919174,-0.1650640350589887,0.0864217184079511,0.2848261438797578,0.4199625242064049,0.4860312361646699,,, +8.078125,16,0.4820168927433146,0.4117519777488293,0.2836425514972416,0.11007517090244813,-0.09345360313897938,-0.3094243936820313,-0.5195230631595763,-0.7059239857911341,-0.8525390364885252,-0.9461451869847228,-0.9773120655631886,-0.941064786507885,-0.8372358164839749,-0.670481330127098,,, +8.0859375,16,-0.4499609040078744,-0.18870287529663526,0.09730038824366363,0.39020422545218536,0.6715529086587061,0.923563812287765,1.130364979971585,1.2790997958419597,1.9189613791630291,1.607737360975733,1.1958078526235094,0.7375240647498008,0.29440767610818114,-0.07437613231298346,,, +8.09375,16,-0.3211791103426013,-0.4172373405116965,-0.35709838004377825,-0.1594188692811327,0.1359913554909435,0.4744179888946738,0.7948103000280495,1.03933373541163,1.1624189863082228,1.1378978675730416,0.9631143593126767,0.6593703129273933,0.2686362353582963,-0.1529606831244049,,, +8.1015625,16,-0.5438571524240706,-0.8466248102013615,-1.0169010454137184,-1.0302886646165796,-0.8861497906802297,-0.6077031024071705,-0.23840927668212064,0.1647923942140366,0.5403428123844121,0.8316375603931431,0.9958258629608446,1.0104636356810013,-1.6998180148541608,-1.4391149618154582,,, +8.109375,16,-0.9579350255690182,-0.37003780013169735,0.181562585303874,0.563569725670807,0.6887178411550754,0.5394751380634988,0.17264328543886648,-0.2964056125674001,-0.7255325127502845,-0.9849572632526442,-0.9929819310833224,-0.7385194573649749,-0.28425189219048896,0.25044851834306,,, +8.1171875,16,0.7221555450065563,1.0026386618176693,1.0139696281518629,0.749864687122555,0.2774132994358233,-0.2812804135759569,-0.7825122277085764,-1.1002908914751055,-1.1607758307932081,-0.9624019818502494,-0.5761771670286174,-0.1260717173886281,0.2451236704445674,0.4151129803442155,,, +8.125,16,0.3243588721954497,0.3910417666715427,0.4447914336471047,0.4842325490115764,0.5082468603193044,0.515992941388997,0.5069210956140426,0.480783146935233,0.437636946946394,0.3778455191262132,0.3020708550956693,0.2112624714456945,0.10664092742499044,-0.010323407985956544,,, +8.1328125,16,-0.13793596790039764,-0.2743075298615396,-0.4173871714734659,-0.5649980623409799,-0.7148754656685349,-0.8647062841704238,-1.0121694579047125,-1.1549765067209568,-1.290911507476584,-1.4178698060732542,-1.533894786510661,-1.6372120531777008,-1.7262604278895142,-1.7997192189497422,,, +8.140625,16,-1.8565312847921325,-1.8959214883867173,-1.9174102193025169,-1.92082174667904,1.3608217321303706,1.3711167830397084,1.3104101833392412,1.1839360251419264,1.001371892678586,0.7761639934149336,0.5245898457020237,0.2646238833424861,0.014685079856409322,-0.20764607843785887,,, +8.1484375,16,-0.3868518048265992,-0.5105570465055287,-0.5703900319925812,-0.5625633291523741,-0.4881349017776668,-0.35293096814099817,-0.16713604927803832,0.05542119660786599,0.29823654274622435,0.5432856135319608,0.7722855731586896,0.96797508983641,1.1153233072756223,1.2025835051129816,,, +8.15625,16,1.222117959753261,1.170936471532011,1.0509109905917422,0.8686513601003888,0.6350508264046266,0.3645329935535879,0.07405271853115603,-0.21807939825559053,0.8769844889840596,0.6204481947821211,0.28560594629205704,-0.0701045621264858,-0.385542994996344,-0.6054296895706286,,, +8.1640625,16,-0.6889986699401925,-0.616392378397296,-0.3918018682842291,-0.042863103131600855,0.3835968715562423,0.8288015991937117,1.2311270756011634,1.5356464255889866,1.7026310465725287,1.7136844113142808,1.57455344860131,1.3141799047827205,0.9801397297508322,0.6311811115320363,,, +8.171875,16,0.3280236793011513,0.12385222022079635,0.05598582859018997,0.1400203166156676,0.3673564818622729,0.706499449422729,1.1079269288622209,1.5117683343491102,1.8570988941888449,2.0914013164382914,2.1787214621928763,2.1052478751749595,-0.5988467281917926,-1.2093200863603597,,, +8.1796875,16,-1.7350449399636951,-2.054898204388424,-2.103788318841312,-1.8902642849959999,-1.4939452166047689,-1.0434770125970996,-0.6810596513040199,-0.5232691280117491,-0.6289135013038302,-0.9827345738890818,-1.4994238021607424,-2.0468533738621155,-2.482156943237844,-2.6907726452125638,,, +8.1875,16,-2.6177489641818537,-2.282734367976254,-1.7745432149771023,-1.2267877733709496,-0.7812551975334232,-0.549066838622409,-0.5802648537064068,-0.8501612006443373,-1.2661898343765954,-1.693383408086414,-1.9914911713368653,-2.05356406930323,-1.8354307561349803,-1.3679845988007,,, +8.1953125,16,-1.9062872568667093,-1.8742425225640649,-1.8254202442786776,-1.7608371982227302,-1.6817764156898791,-1.5897647059558495,-1.4865459162749557,-1.3740503971873357,-1.2543612077906532,-1.12967765271119,-1.0022767892281566,-0.8744735785419242,-0.7485803789186658,-0.6268664899603584,,, +8.203125,16,-0.5115184563530059,-0.4046018261442741,-0.3080250331277209,-0.2235060357183939,-0.15254229643165984,-0.09638462758250277,-0.056015361121733435,-0.0321312248060831,-0.025131224490415386,-0.035109744668363696,-0.06185498801479794,-0.10485278119439134,-0.1632956802350659,-0.2360972159665929,,, +8.2109375,16,-0.3219110300200213,-0.419154566247242,-0.5260369026516201,-0.6405902364193937,-0.493466971670899,-0.7349036981436544,-0.9275661761842202,-1.0600405189393522,-1.1251111868983108,-1.1202570500644038,-1.047820104742236,-0.9148350968977332,-0.7325319500485328,-0.5155457119160936,,, +8.21875,16,-0.2808891295757123,-0.046759515324017176,0.1687368792962597,0.3488540117203458,0.4793802012470567,0.5496353936583934,0.553221979996046,0.4884767977694941,0.3585927808097005,0.1714017609002486,-0.06116644621420009,-0.32391096359366245,-0.5994151329238531,-0.869256575024335,,, +8.2265625,16,-1.1152876607037359,-1.3208971110390673,-1.472164761396228,-1.5588289728402205,-1.5749992385706333,-1.5195643006402308,-1.3962673245009287,-1.2134428952687797,1.8814462453222964,1.5404164517573982,1.1327281636529762,0.7185394402271015,0.3582259375333795,0.10298028958702343,,, +8.234375,16,-0.013154144200712035,0.021425595525552232,0.19409014445111827,0.4699641277055331,0.7973812439475749,1.1159583553773291,1.3660308752793946,1.4979796966989565,1.4799967809124157,1.303079694159296,0.982476970794141,0.5553589682893991,0.07507676493427064,-0.3970969315585424,,, +8.2421875,16,-0.8014587179821048,-1.0891192700168375,-1.229562304718438,-1.2153406605494872,-1.0631783396876446,-0.8113071524547993,-0.5134530875833938,-0.2304093566890791,-0.020508949816771867,0.06951905536996582,0.011884962578729064,-0.19787711978850764,0.3897915479670128,0.6639327213576599,,, +8.25,16,0.6655326805256491,0.4289241660427694,0.0538771311581593,-0.3219916506711331,-0.5611804233644445,-0.5642293622191488,-0.297215798851448,0.1987199442452679,0.818430869864414,1.4213734946833498,1.8699325358819547,2.0669581458301933,1.9822294230600623,1.6605927500138558,,, +8.2578125,16,1.2095457221432162,0.7696706022282431,0.4760214772890037,0.42104841924132586,0.6292205028791713,1.0503030238300384,1.5731314951269866,2.0561072410313512,2.366056312055339,2.414801106359884,2.1834207629799325,1.7275503392117566,1.1622653022043292,0.6306927454495962,,, +8.265625,16,-0.7607044706706411,-0.8841642972376611,-1.0086881260693557,-1.1319681795231726,-1.251711049408558,-1.3656780065372471,-1.4717243568703935,-1.5678371550423011,-1.652170614800709,-1.7230785962296329,-1.77914360080141,-1.8192017664528641,-1.8423634249162693,-1.84802886123902,,, +8.2734375,16,-1.8358989994334656,-1.805980827039364,-1.7585874635014065,-1.6943328710487404,-1.6141213005718735,-1.519131657179209,-1.4107970590723564,-1.2907799475404642,-1.1609431837733146,-1.0233176384626628,-0.8800668415686412,-0.7334493111074636,-0.5857792204516288,-0.4393860927277924,,, +8.28125,16,-0.2965742279321354,-0.15958257305958967,-0.03054573779004888,0.08854316178931987,-0.9834341810656628,-0.7217309109667291,-0.4458882827633591,-0.17430219140031222,0.07507381266229707,0.2859803633703225,0.4449856221178049,0.5424210927347362,0.5730546523318223,0.5364538675119274,,, +8.2890625,16,0.4370142636602148,0.2836505797266867,0.08917254280955134,-0.13061130291949458,-0.3579992139940119,-0.5746342070228085,-0.7627880251920223,-0.9066015684776474,-0.9931952793543564,-1.0135720435091926,-0.9632496329782688,-0.8425785783454326,-0.6567232920450549,-0.4153077467859144,,, +8.296875,16,-0.13175040417711065,0.17766524232689582,0.4949197101056738,0.8015074383546246,1.0797204219592371,1.3138760716619626,1.4914036935648909,1.6037138402812294,-0.5401590781878538,-0.9742799370331172,-1.4447711659066391,-1.8899674356299776,-2.2515650108718623,-2.483659239963876,,, +8.3046875,16,-2.559853722237784,-2.4773340647615507,-2.2572719056713333,-1.9414964447830558,-1.5859520598684036,-1.2519611525907846,-0.9966531959608328,-0.8640508039249193,-0.8782012887907951,-1.0394235560618688,-1.324254935135799,-1.6891062387536524,-2.0770557468009416,-2.4267238849904658,,, +8.3125,16,-2.681846268867966,-2.8000539888715243,-2.7594934683192163,-2.5622547043289163,-2.234073793678387,-1.82035592687252,-1.3791381224432069,-0.9720876082497076,-0.6549376990047027,-0.4688506173399937,-0.4340523156688594,-0.5467304674787544,0.3011138584986865,0.6588066533695374,,, +8.3203125,16,1.1064393931586871,1.5018464527678297,1.7166424895157115,1.6716367051808387,1.3587649224448968,0.8435263954224883,0.2472553587617045,-0.2859159499624647,-0.6283503953420352,-0.7036880850301576,-0.5075866806968946,-0.10873734615410163,0.3701204720166908,0.7859806590454907,,, +8.328125,16,1.014888578208097,0.9860186569111559,0.7011707807724744,0.2343413197559871,-0.28851424804843273,-0.7239810590603877,-0.9504917907256034,-0.9016679317439604,-0.5845573359368763,-0.07776926977839435,0.4899825440636793,0.975049000110084,1.2580890215501614,1.2766330558181804,,, +8.3359375,16,0.1958671809531921,0.28981713852550073,0.3690195704428091,0.4323605553602965,0.4790049952511499,0.5084110135310042,0.5203392187316096,0.5148566716524914,0.4923354866600258,0.4534460917602438,0.3991452655952121,0.3306591609689409,0.2494616122931679,0.15724810692264635,,, +8.34375,16,0.05590587627281324,-0.052519369444836594,-0.1658594802645377,-0.28186204811383603,-0.3982300623764772,-0.5126623448757759,-0.6228940561353324,-0.7267365635268956,-0.8221159730912541,-0.9071096502151659,-0.9799800895666542,-1.0392055411048509,-1.0835068557832643,-1.1118700807604425,,, +8.3515625,16,-1.1235644083579288,-1.1181551643641583,-1.0955116081444063,-1.05580940786415,1.6467899273939088,1.621460876467452,1.533335789116714,1.3924052244701317,1.2123369013187208,1.0095149550868576,0.801889762568555,0.6077185571101398,0.4442846724452826,0.3266847436241596,,, +8.359375,16,0.2667684545284924,0.2723047837762954,0.3464329061993129,0.4874360569337852,0.6888541437091321,0.93992727064991,1.226339261073336,1.5312093465300962,1.8362628835160584,2.1230994746947704,2.3744700786798045,2.575474065131695,2.7145927538708614,2.784487378633978,,, +8.3671875,16,2.782505842942096,2.710862941782735,2.5764814924376567,2.3905054630052405,2.167519059124529,1.924526233166236,1.679761785930766,1.451416973737261,-0.7796785295810544,-1.0865852965950793,-1.4093015557226174,-1.6869517436282329,-1.8654711326957167,-1.906082791235165,,, +8.375,16,-1.7913936952345155,-1.528160197695103,-1.1462918269604947,-0.6942482873126706,-0.2315463161488763,0.18045678810067056,0.4880677292992355,0.6535697507560752,0.661048684077708,0.5188253208391314,0.2581154895965776,-0.07187323739231126,-0.4116442837686548,-0.7007143176791001,,, +8.3828125,16,-0.8870659563175814,-0.9352784561323488,-0.8320698470844847,-0.5883871692661002,-0.23771914077515946,0.1691060181342163,0.5718274038482982,0.910131407306101,1.1330438940124472,1.2068717075818984,1.1204565477350394,0.8869228645831058,0.1889850847429697,-0.15773595407922325,,, +8.390625,16,-0.2889843317320733,-0.14851187834056967,0.2455836779140276,0.8055918129256792,1.3979997293084043,1.87985670714663,2.1377280583490026,2.1185647029747336,1.8440300270251881,1.4043594802877557,0.9334377521917844,0.5719259615469499,0.4285463112953676,0.550136509740695,,, +8.3984375,16,0.9086825820075376,1.4088852670209764,1.9141873826182003,2.2841297606612443,2.412798340919748,2.2578257597064257,1.8519992948154231,1.2942938969435995,0.7227877957774897,0.27688340388441457,0.05918713351621385,0.10749502277115386,0.38456117452587535,0.7884520904330056,,, +8.40625,16,-0.9995277473727446,-0.9274411152964352,-0.8406059200049776,-0.7403421647171952,-0.6282105035100499,-0.5059850798760039,-0.37562262332620827,-0.23922834505746896,-0.09901922975321947,0.04271463381513459,0.18365000637987366,0.3214710364619923,0.4539096736139477,0.578785249068871,,, +8.4140625,16,0.6940425308211758,0.7977875868757399,0.8883208287750719,0.9641666568883012,1.0240991884436448,1.0671636178746085,1.0926928355263072,1.1003190137893246,1.0899799578476823,1.061920109894564,1.0166861892845542,0.9551175450120664,0.8783313894901952,0.7877031722286446,,, +8.421875,16,0.6848424371066464,0.5715645860161689,0.4498590433250423,0.32185437863086785,1.2563684948307938,1.1089994926135165,1.020194795781773,0.9965804645604576,1.0400606751726782,1.147684239524157,1.3118500697469884,1.520837260716339,1.7596228261817712,2.0109300643224226,,, +8.4296875,16,2.2564344451888605,2.4780429271608666,2.659157488299856,2.7858347584044343,2.8477608820041382,2.838973626270879,2.7582813724607407,2.609349766014038,2.4004499749099684,2.1438861022779245,1.8551416721485272,1.5518046964701284,1.252346271079648,0.9748378615736404,,, +8.4375,16,0.7356967147628292,0.5485468695190839,0.4232751791649322,0.3653481582495094,0.3754372779549643,0.4493788248133549,0.5784711068268718,0.7500882663867998,0.5416474657668559,0.13676700074882056,-0.26692128953614325,-0.6094041762661114,-0.8407714911090628,-0.9289582849350968,,, +8.4453125,16,-0.8647043885613629,-0.6629590878963477,-0.36051233339310496,-0.01022165519156823,0.3272657947347869,0.5930064930061496,0.7389902085267266,0.7356682458333087,0.5766074317280018,0.2795446829368575,-0.1163223840554109,-0.556387087153552,-0.9790852729063216,-1.32543078111495,,, +8.453125,16,-1.5481498705686492,-1.618992158129135,-1.5330796370725592,-1.309616669915986,-0.9888506414567024,-0.6257569288716951,-0.2814320409178418,-0.013535732013284285,0.13272898812499226,0.13169282214121014,-0.018748346515439884,-0.29677559267127995,1.421398862324298,1.1408817678033574,,, +8.4609375,16,0.6263285678922395,-0.015218180068020788,-0.6424664900238729,-1.1183565507330806,-1.3473792536362037,-1.3015059274257252,-1.0276248976732396,-0.6344489036688702,-0.2624837961787666,-0.04529128439497465,-0.0726644710573845,-0.3658105892824604,-0.8713444356903213,-1.475740425073854,,, +8.46875,16,-2.036283960015655,-2.420040689774692,-2.5401646049188256,-2.37959508293914,-1.9956491237971608,-1.5042508749669143,-1.0481211526011842,-0.7576455439185122,-0.7151460493312949,-0.9323482063827454,-1.3472189449774823,-1.8410412834344598,-2.271045465383035,-2.5096523920443614,,, +8.4765625,16,0.1897809985306499,0.05593206069589792,-0.077376705332696,-0.20784756707908708,-0.3332410374175059,-0.4514150974548301,-0.5603627072103942,-0.658246947277906,-0.7434331761404945,-0.8145176400657733,-0.8703520346293605,-0.9100635878033748,-0.9330703129672862,-0.9390911647766093,,, +8.484375,16,-0.9281509200777788,-0.9005796984260264,-0.8570071306257651,-0.7983512774295494,-0.7258024924583636,-0.6408025119369681,-0.5450191374180196,-0.4403169548389741,-0.32872460266287684,-0.2123991622806476,-0.09358829424777884,0.025409216601493603,0.14228381625426592,0.2547557301592838,,, +8.4921875,16,0.3606149953436994,0.4577602749803407,0.5442357756994882,0.6182656211551264,0.9485678810339668,1.1563104406889764,1.3550140148781948,1.5269579960133541,1.6562463823413351,1.7299238854473724,1.7388870154110774,1.6785265934870108,1.5490568705442214,1.3555082834656162,,, +8.5,17,1.1073843373328809,0.8180065228682794,0.5035929330092497,0.1821348126412892,-0.12785063352561488,-0.4086042208200804,-0.6443560324988855,-0.822418092815381,-0.93406228534558,-0.9751223117986808,-0.9462777296683128,-0.8530002762835741,-0.7051662361850856,-0.5163618960986305,,, +8.5078125,17,-0.30293053321803953,-0.08282740563894431,0.12563739819219,0.3050805748267097,0.44026230441929104,0.5191531785679635,0.533776948060693,0.4807703147036725,-0.6600186039780538,-1.052131849673802,-1.4115511240051857,-1.6810667009030378,-1.8167221253791896,-1.7946526826247502,,, +8.515625,17,-1.6147984713346069,-1.30091378383367,-0.8968713443295989,-0.4598370309258138,-0.05137812465555136,0.2721100280307186,0.4681679128122336,0.5148613733730655,0.4141705235387769,0.19165033529092312,-0.10758408304041807,-0.4259220374420509,-0.7022711029287446,-0.881616127126254,,, +8.5234375,17,-0.9236343027816748,-0.8090242376545358,-0.5425629945179007,-0.15241469847717898,0.3142018631655008,0.7983121259357048,1.2383145572450371,1.5795178142323147,1.782601077111064,1.8296801087871868,1.7270345137024838,1.5040717045973893,-1.6640363157388232,-1.0689146493524964,,, +8.53125,17,-0.5339893379790747,-0.1857121182759084,-0.09833233553322107,-0.2737702308320316,-0.6413185405307569,-1.0772520576367932,-1.4389686058323048,-1.604302248821558,-1.5052320191462685,-1.1467455062486351,-0.6056853062974491,-0.00989250726020774,0.4966385335483159,0.7930458674519453,,, +8.5390625,17,0.8145607140410691,0.5701112572776894,0.13974616019152708,-0.3474148782673866,-0.7486594262951187,-0.9468651250450076,-0.8826475427197832,-0.5706618930475921,-0.09559058970753473,0.4110836818011994,0.8071533730744487,0.9787223723188421,0.8715039113403388,0.5058014619116994,,, +8.546875,17,0.6782850798940055,0.7229681006552732,0.7512506728802018,0.7623496033115138,0.7557763798218358,0.7313458796311668,0.6891797693449229,0.6297045371878147,0.5536441917962168,0.4620077553176018,0.3560717697152937,0.2373581224913212,0.10760757999747196,-0.031250508340288134,,, +8.5546875,17,-0.17713180451233718,-0.3278332870004603,-0.4810716308494432,-0.6345229908115589,-0.7858634910787914,-0.9328097127445114,-1.073158470177756,-1.2048251799485121,-1.3258801505838766,-1.4345821578470184,-1.5294087177599365,-1.6090825274150249,-1.6725936107250845,-1.7192167814660393,,, +8.5625,17,-1.7485241179645827,-1.7603922311279872,-1.75500419868313,-1.7328461318871693,0.36162072355931296,0.18256556672842705,-0.04584017857000034,-0.30945773295652523,-0.5915485543799114,-0.8739400176406525,-1.1382914503078134,-1.3673722423893562,-1.5462629043579603,-1.6633953203579177,,, +8.5703125,17,-1.7113596560221105,-1.6874216514172151,-1.5937142245729117,-1.437090021592027,-1.2286451917955574,-0.9829475920775028,-0.7170232349369199,-0.4491716523170375,-0.1976927768524387,0.02038588844903311,0.19049306190876056,0.3015258957456833,0.34662003443465395,0.3236238306373538,,, +8.578125,17,0.2352436611605581,0.08885022125726616,-0.1040406827666513,-0.3285766238451245,-0.5676099354016834,-0.8028993508847615,-1.0163880931262188,-1.1914692735382575,1.2086892368631392,0.8997581402761966,0.6378982931350203,0.4759829011510771,0.4508513292893954,0.5775213185145172,,, +8.5859375,17,0.8468023167582217,1.2266819004004934,1.6672695710166017,2.1085281182211384,2.4895885462447307,2.7581978973760948,2.8788285889662126,2.838186339103936,2.647258920937084,2.3395867504513927,1.9660247619828024,1.5868115058129315,1.2621807958499187,1.0429782199427524,,, +8.59375,17,0.9627440469146212,1.03249564426035,1.2390220364041842,1.546956178161341,1.9043020984448609,2.250555934859831,2.5261558480100383,2.6817888052916103,2.686104498949989,2.5306347428934464,2.231151937529625,1.8252548101674104,-1.0604760469136765,-1.3032608772866303,,, +8.6015625,17,-1.2762995256917666,-1.0038319852412592,-0.5780243697555788,-0.1334946098100271,0.1898024647795125,0.2851564717260566,0.10857312691739728,-0.3089432492116828,-0.8696647862999013,-1.435706863122432,-1.8666075738367007,-2.0576224807283587,-1.9682411535340687,-1.6331118115298362,,, +8.609375,17,-1.1523816797696838,-0.6641020739145449,-0.30626260096228464,-0.1788610510644829,-0.31640560158205866,-0.67838658827773,-1.1603299882219718,-1.622403731268093,-1.9277370500539384,-1.979950819458283,-1.749612872491089,-1.2823674036275434,-0.6865099481581508,-0.10341257613236132,,, +8.6171875,17,-1.6946984349578709,-1.6416219104029368,-1.5749389536759455,-1.4962101665732308,-1.4072067990029389,-1.3098795018048608,-1.2063239378913695,-1.0987438539916448,-0.9894122597465341,-0.8806313940399063,-0.7746921796909381,-0.6738338765873891,-0.5802046398668477,-0.4958236739052973,,, +8.625,17,-0.4225456449281263,-0.3620279755126961,-0.3157015937866517,-0.28474564963573346,-0.27006664077169906,-0.2722823142936249,-0.2917106257572669,-0.3283639492088157,-0.3819486396949662,-0.4518699560381172,-0.537242257807719,-0.6369042980650313,-0.7494393442323584,-0.8731997748954684,,, +8.6328125,17,-1.0063357219727715,-1.14682725685162,-1.292519557032104,-1.4411604376324718,-1.3141503456797483,-1.3740353966209768,-1.3650567619489409,-1.2859049304205858,-1.14012674323375,-0.9358850235368924,-0.6853963811617839,-0.4040863792853904,-0.1095209588768705,0.17981138102755753,,, +8.640625,17,0.44578174192295816,0.6718779314464581,0.8443488711021201,0.953156519887445,0.9926689500037824,0.962046260939617,0.8652924373636859,0.7109695508081626,0.5115942506747644,0.28275864474204904,0.04203688818917185,-0.1922462570246875,-0.4022990057707577,-0.5721087540653838,,, +8.6484375,17,-0.688563988881405,-0.7423736562223751,-0.7287198646690807,-0.6475983975561395,-0.5038232776488938,-0.30669505551535137,-0.06935594307081794,0.1921232482612364,1.366557245646818,0.9163850950083858,0.5342739833142953,0.26874787746175033,0.1498144353265899,0.1843457515620217,,, +8.65625,17,0.3550636927852697,0.6232875756911791,0.9350159329727892,1.2293948077642618,1.4482533020249468,1.5452208744663911,1.493006030475331,1.2877024229951437,0.9494513848602092,0.519357424652965,0.053136846833503136,-0.3875115006197436,-0.7444695464569079,-0.9722080817029308,,, +8.6640625,17,-1.0448367754372416,-0.9600982510707524,-0.7396843166418493,-0.42582527012694815,-0.0746836716469493,0.2524183225687827,0.498571554280495,0.6201613016974189,0.5936741497262072,0.4193700247945063,0.121247414903768,-0.2566928275604379,0.4495379270369089,0.15780909295974505,,, +8.671875,17,-0.2408767963878684,-0.6055512719485253,-0.8036291937801954,-0.7474746847343691,-0.4186552545791468,0.1267652992966764,0.7733479767870725,1.3776715779886843,1.8073959232464345,1.977291404197966,1.872362388420188,1.5517291391004588,1.132206356905905,0.7560809113477728,,, +8.6796875,17,0.5519217527103013,0.5991645448278713,0.9061788846325134,1.407830650905952,1.983208830694972,2.488659517994765,2.7970743571282086,2.8326663537500227,2.591702553118874,2.143511681473848,1.6114906792408812,1.1393155497219207,0.8516167925996309,0.8198965784140408,,, +8.6875,17,-1.5904395906979143,-1.7380288453490778,-1.8816227439327675,-2.0189787237977157,-2.147956201226485,-2.2665538732731463,-2.372944584458913,-2.4655071479171697,-2.5428545639009257,-2.603858141649259,-2.6476671023367606,-2.6737233199541883,-2.6817709421014726,-2.6718607223228292,,, +8.6953125,17,-2.644348988213384,-2.599891263450517,-2.5394306555106545,-2.46418121248142,-2.375606540468443,-2.275394056079022,-2.165425324892171,-2.0477430053564207,-1.9245149769908003,-1.797996281067452,-1.6704895402516065,-1.5443045503068211,-1.4217177514676351,-1.3049322891837414,,, +8.703125,17,-1.1960393636205198,-1.0969815447280291,-1.0095186952725868,-0.9351970985564324,0.4598607025020286,0.7154078014401486,0.9410331791042,1.1209570933767352,1.2424500435148966,1.2967190281115335,1.2795196457370148,1.19145135755267,1.037915324489146,0.8287377605093535,,, +8.7109375,17,0.5774850672733711,0.3005185077587686,0.015854338333932627,-0.2580911160356134,-0.5037839363146239,-0.7057932062056395,-0.8518646195191039,-0.9337722372279208,-0.9478890044338084,-0.8954362500136541,-0.7823947780225171,-0.6190837589514329,-0.4194367950258453,-0.20002565144867893,,, +8.71875,17,0.021100257779871123,0.2256776921606989,0.3965085731756973,0.518664938829026,0.5805358261718254,0.5746430660586835,0.4981690883510053,0.3531599177290031,-0.6573031664624296,-1.0191967151905237,-1.2863188151636569,-1.4166919718060462,-1.3889719938300278,-1.2057940784147885,,, +8.7265625,17,-0.8933875483764582,-0.4975191058647881,-0.07639630208400483,0.30836363218187485,0.6012931363814777,0.7616731397652576,0.7698322618439217,0.6301654955602042,0.3704024445222989,0.0372393477391111,-0.3109845064120589,-0.6134250156658544,-0.8162625400597819,-0.8811376987013165,,, +8.734375,17,-0.7911794789166613,-0.5536864578669015,-0.1990432318631769,0.2239594638637043,0.6556723152212705,1.0348273788910205,1.3080315269278984,1.4380350013280792,1.4094874680326326,1.2312852850636864,0.935144624568682,0.5706229191564196,1.9085511903930847,2.2828631069442986,,, +8.7421875,17,2.4496626768383623,2.3431556877492787,1.9709369614938048,1.4121179542899616,0.7958631757331759,0.26621592491348656,-0.057148535801560325,-0.11148812698610623,0.0920455504548594,0.4716975640422629,0.8977469071860424,1.228284355111788,1.3483232190951222,1.201521924184262,,, +8.75,17,0.8058223040950812,0.2487158346921717,-0.3365664768818675,-0.8074164365412014,-1.0507987852688678,-1.014115243756513,-0.7195245975882801,-0.2577949560380935,0.2366262608187041,0.6224915961903711,0.7904743526659297,0.6931186725049181,0.35781066171389764,-0.12078405444397172,,, +8.7578125,17,-0.8753223314326115,-0.8309363576416089,-0.8027992425929955,-0.7913758097924405,-0.7968274725828085,-0.8190093842454136,-0.8574729563802483,-0.9114737014822688,-0.9799842624014568,-1.0617124005485268,-1.1551236278789545,-1.2584680863701776,-1.3698112043323931,-1.4870675927567931,,, +8.765625,17,-1.6080375881686435,-1.73044580211135,-1.851981002244752,-1.9703366267247888,-2.0832512224376982,-2.1885480989919746,-2.2841735041022107,-2.3682326518825016,-2.439022973162976,-2.49506400557994,-2.5351234000248173,-2.558238588037185,-2.5637337306989667,-2.5512316522063063,,, +8.7734375,17,-2.5206605491094485,-2.472255357686347,-2.406553755447892,-2.324386866726602,0.1463891898139953,-0.11110734497929796,-0.40479438488543934,-0.717643547448006,-1.03131357919921,-1.3274220210641607,-1.5888196689189624,-1.8007789740194742,-1.9520135294125032,-2.0354575674681445,,, +8.78125,17,-2.048751128936332,-1.9943970884212745,-1.8795791036619407,-1.7156532008193484,-1.5173484662874226,-1.3017326003437388,-1.0870144847295202,-0.8912672815785017,-0.7311611224784992,-0.6207937774215757,-0.5707008606327345,-0.5871146102438056,-0.6715229445438949,-0.8205595578799094,,, +8.7890625,17,-1.026232734377032,-1.2764769372947111,-1.5559887231389415,-1.8472887022373683,-2.131935503964011,-2.3918071044248945,-2.6103601763884896,-2.773779653155652,0.197364281398106,-0.12422308866020905,-0.3424052828621862,-0.4222066084883623,-0.3508797946057407,-0.1399103385392516,,, +8.796875,17,0.17675730513181234,0.5479955029836914,0.9134495284183886,1.212934801888566,1.395811644715693,1.4288773869181637,1.3015465783435007,1.0275124236193272,0.6426306085517844,0.19935504750636365,-0.2414078823694237,-0.6197579895998108,-0.8860996997085694,-1.0088321426495126,,, +8.8046875,17,-0.9792332951992042,-0.8127776346057898,-0.5466822749517521,-0.2340640060745041,0.06438246174812262,0.28988864649791385,0.3948182605321754,0.3501408518466336,0.1500087885132123,-0.18727558314617296,-0.622053532195415,-1.0994294612631241,-1.0759728623774572,-0.9121809394477368,,, +8.8125,17,-0.5022213927640798,0.05439452637652386,0.6190954313529857,1.052034730697072,1.2502149500063575,1.175504671275568,0.8648715226287887,0.4200287561770912,-0.020664892166360804,-0.3203485055795721,-0.381389368356156,-0.1723575338361374,0.2631504282864359,0.8182588564247748,,, +8.8203125,17,1.3519139246612435,1.7273642332591723,1.8494764235405348,1.6906603329174423,1.2982998436093909,0.7816541538190356,0.2818205700194132,-0.0670079340229236,-0.17437149325896173,-0.01836423996351444,0.34835571304657875,0.8130145016417799,1.233669069278465,1.4781702683623201,,, +8.828125,17,-2.2268648350281994,-2.1153575147056336,-1.9914706199732632,-1.857017748815868,-1.7139887715779918,-1.5645151376675333,-1.4108327077702345,-1.2552427622976108,-1.1000718687197129,-0.9476313104169448,-0.8001767873560358,-0.659869094135834,-0.5287364638324558,-0.4086392369007047,,, +8.8359375,17,-0.3012374736788379,-0.207962077495217,-0.12998993390525893,-0.06822350126240961,-0.023275209881119863,0.004543057148183149,0.015225217415634653,0.009070885046471244,-0.013320089106319544,-0.05105833721244224,-0.10298076633571196,-0.16767114579059195,-0.2434851293778129,-0.3285792742366966,,, +8.84375,17,-0.4209435480714167,-0.5184367554234737,-0.6188242625515816,-0.719817360229284,-2.8719383531202722,-2.8990997561329843,-2.8543149328973727,-2.7414859555646967,-2.5690913742568253,-2.3495929086882263,-2.098564733150977,-1.8336060767735287,-1.5731129702630249,-1.3349947916928946,,, +8.8515625,17,-1.1354251124038142,-0.9877139514060866,-0.901380079640044,-0.8814880645063766,-0.9282962830736292,-1.0372404467069538,-1.1992537827683285,-1.4014015420571326,-1.6277855809278683,-1.860655933059444,-2.0816518510302133,-2.2730857687448305,-2.419180642003144,-2.5071743748646025,,, +8.859375,17,-2.528214307274955,-2.4779793784339663,-2.3569865697486376,-2.1705602467643543,-1.928466525973485,-1.6442381506958237,-1.334236941448528,-1.0165191854603983,-1.5577634943187837,-1.9382146620956413,-2.193848576651704,-2.2968913177247803,-2.2429999873612125,-2.051885053990957,,, +8.8671875,17,-1.764187828729336,-1.4350996917368548,-1.1257171668367667,-0.8934795855813314,-0.7831789616307502,-0.8199425584422415,-1.0052813616522407,-1.316820121387143,-1.7117511894886666,-2.13347435869938,-2.5203886561764315,-2.8154668466449237,-2.9751214698877897,-2.975981564523652,,, +8.875,17,-2.818524631202281,-2.5269981806109296,-2.1456431074065225,-1.7318071201836929,-1.3470208266354853,-1.04742637925134,-0.8750494082049566,-0.8512736011972651,-0.9735341961011822,-1.2157452701140103,-1.5323941317588403,-1.8656649333388131,0.6477046180509539,0.027428202270058905,,, +8.8828125,17,-0.5531027304721061,-0.9628081412018404,-1.1187109226681768,-1.0084733153907903,-0.6935617876011306,-0.2921748994336183,0.053384880210298524,0.21595091900051447,0.1185871609096376,-0.24408271821894426,-0.8041595968627213,-1.4388390301811047,-2.0038346506931344,-2.3726965905526614,,, +8.890625,17,-2.471250953854082,-2.2977234561475046,-1.9230337855619573,-1.4711817301941823,-1.0851022301641544,-0.8873488941923052,-0.9463827198847996,-1.257706363816561,-1.7450154028341542,-2.2810517780858106,-2.722444636359968,-2.9489900527924657,-2.8966043472572105,-2.5749193762801537,,, +8.8984375,17,-0.8191135750895709,-0.9144372235376244,-1.0035794980013688,-1.0844373834806604,-1.1550507228347977,-1.2136367816630915,-1.2586217074158284,-1.2886683317520449,-1.3026998291919758,-1.2999188176663603,-1.2798215663771608,-1.2422070620546433,-1.1871807747247671,-1.115153056912233,,, +8.90625,17,-1.0268322041726683,-0.9232122983279472,-0.8055560461318536,-0.6753729137257735,-0.5343929396125089,-0.3845366845469801,-0.2278818443858837,-0.06662711036777152,0.09694609050265936,0.2605133051765541,0.4217475192050865,0.5783596679021459,0.7281384848090136,0.8689889898426464,,, +8.9140625,17,0.9989689433317674,1.1163226277582061,1.2195113658116914,1.3072402405137913,-0.7095830711687127,-0.4310854984446134,-0.1966177303989209,-0.018625249004357247,0.09445287937518654,0.13876512990649748,0.11530862932572115,0.02985205873013763,-0.10747425776076892,-0.2828924770023047,,, +8.921875,17,-0.4799457581569234,-0.680653626014684,-0.8667735918094692,-1.0210810373570005,-1.128578094803537,-1.1775472057012095,-1.160375874236086,-1.0740950849339879,-0.920593822441092,-0.7064947176264911,-0.4426994752535621,-0.14363576594013205,0.17374191668907055,0.4911277756013324,,, +8.9296875,17,0.7901346489301735,1.053569825173438,1.2666277824000276,1.4179166914889632,1.5002471150586325,1.5111279160223354,1.452934806316169,1.3327397935634429,-2.154481787070863,-2.3440626789040198,-2.3944958991854217,-2.2870029431531544,-2.026912165578214,-1.6428797792875856,,, +8.9375,17,-1.1824792725957964,-0.7048459492254266,-0.2715219665417743,0.06307247673057037,0.2600579280084473,0.30209346405343185,0.1960195766059074,-0.02826518929285648,-0.3225185821385345,-0.6277254014264837,-0.8833451941807153,-1.0367962323574815,-1.0516983178494104,-0.9135902892952362,,, +8.9453125,17,-0.6322314430938276,-0.24012816541330506,0.21248497245118225,0.6654281535103056,1.0579112598480274,1.3379670445832708,1.47051343684254,1.4427893877886122,1.2663177322484789,0.9750894570838105,0.6202522836349051,0.26213092295271545,-1.0115638161779492,-0.7298907175498458,,, +8.953125,17,-0.7108144833841865,-0.9403357507358936,-1.334402743418356,-1.7621344666393943,-2.0818916931232843,-2.1803079298914536,-2.003581210468768,-1.5724485480398207,-0.976736911903269,-0.3509820047174764,0.16220516152340214,0.4509859394315856,0.4647111464911693,0.22757330259393385,,, +8.9609375,17,-0.1682455907553842,-0.5880507398766399,-0.8917514091774483,-0.9724435130173612,-0.7858819380512158,-0.362763575684815,0.19954673382863333,0.7635808970114116,1.1893433611058308,1.3726004664227445,1.273390057446493,0.9269381857480032,0.4339912208549368,-0.06678690322641223,,, +8.96875,17,1.3784805496635275,1.432487601550866,1.4688135404547813,1.4873149774697434,1.4881552931615725,1.4718015718470088,1.4390162212903792,1.3908434246662351,1.3285906621221957,1.2538056256041932,1.1682489312696704,1.073863107394497,0.9727384008939028,0.8670760012817308,,, +8.9765625,17,0.7591493261086226,0.6512640458640588,0.5457175483934349,0.4447585526947645,0.35054757934146674,0.26511896977385263,0.1903451195819528,0.12790355212954874,0.07924740913425665,0.04557987498471894,0.02783298269282497,0.02665117265553718,0.0423798921748858,0.07505943541948358,,, +8.984375,17,0.1244241317476008,0.18990689665995567,0.270649065747248,0.36551533949021003,1.1618134294565283,0.9548345795409098,0.7288628288531791,0.5021451893070346,0.2928403286480298,0.11774929153612344,-0.008858770176557007,-0.07624396697581848,-0.07794658663374998,-0.012239187051928946,,, +8.9921875,17,0.11775166189876418,0.30426247919285604,0.535433678373485,0.7961363666371385,1.069027481682918,1.335759687177467,1.5782616550580322,1.77999945377428,1.9271310782985696,2.0094736084954974,2.0212155476603098,1.961324661654173,1.8336228720017305,1.6465229729495827,,, +9.0,18,1.4124455238342142,1.1469565697867892,0.8676863106284873,0.5931041123169183,0.34123527234564344,0.1284090115513592,-0.031875013321664425,-0.12988264735672062,-0.039178051959536934,-0.2331717825600751,-0.2868083968229699,-0.18965061376306847,0.04451543614961606,0.3798382667048975,,, +9.0078125,18,0.7639997708432106,1.136382513616116,1.4375333758745616,1.6184494086839565,1.6482394315482245,1.5189678762179917,1.2469262410563993,0.8701339234538417,0.44245747709812017,0.02526402523339738,-0.3220913833951723,-0.551463081042865,-0.6333644806135516,-0.5615101068681219,,, +9.015625,18,-0.35374278961642425,-0.049201885278835816,0.2978261227420101,0.6264165545267162,0.8785493938132001,1.0081994368510792,0.9885576026932708,0.8162583622667061,0.511954560947061,0.11714982815822192,-0.3122183244273395,-0.7144455082218784,-0.4474772891012154,-0.09294337014673704,,, +9.0234375,18,0.3843321888617121,0.8450978415873864,1.1530415931690996,1.2123147962823857,0.99398012250184,0.5441333743718604,-0.028528659946281926,-0.5822889813252421,-0.9810346093361408,-1.1313406126779455,-1.0078524487167977,-0.6600122231995007,-0.198287553248632,0.2363205814569335,,, +9.03125,18,0.5111319261410852,0.5383522060444051,0.2993261559067601,-0.15017056237498616,-0.6950526556072005,-1.1923170321567018,-1.510103085329634,-1.5637174908471951,-1.3387513475005188,-0.8949549106181225,-0.3498087444825181,0.15370547503143306,0.4863010771363654,0.5678067842138834,,, +9.0390625,18,0.4731135772758469,0.5918190940804479,0.7198030344272544,0.8550643268276716,0.9954646592206594,1.1387658630226198,1.2826690512220498,1.4248548252391635,1.5630238465494086,1.6949370626836178,1.8184548832638203,1.9315746201154416,2.032465535891236,2.1195008875104056,,, +9.046875,18,2.1912864033372217,2.246684695463113,2.2848351796295487,2.305169153987393,2.3074197726523016,2.291626739405757,2.258135639337105,2.207591920108724,2.140929628207127,2.0593550973808363,1.9643258748483632,1.8575252542434573,1.7408328611879271,1.6162918064953908,,, +9.0546875,18,1.4860729821102805,1.3524371249104703,1.2176953125853631,1.0841685832527157,-0.16031837285792427,-0.12268871631190716,-0.02133059965206164,0.13489732650099528,0.33323882820142275,0.5579361730240788,0.7913356517323691,1.0151254291138259,1.2116193883260802,1.3649974256025557,,, +9.0625,18,1.4624156888311055,1.4949093225979504,1.4580247513641549,1.3521373925349365,1.1824326271272043,0.9585513378658874,0.6939247153697911,0.4048447014952205,0.10933487390220907,-0.17409950806369956,-0.4277551494051839,-0.6359585609639662,-0.7861524910600824,-0.8697652026010879,,, +9.0703125,18,-0.8828019935095726,-0.8261177267759315,-0.7053513802309047,-0.5305271941095273,-0.31535024318179056,-0.07624556844571341,0.16879211476920122,0.4014579069132827,-1.0316278829847256,-1.2186400616963111,-1.2501253628418885,-1.1244098513022365,-0.8637307301230991,-0.5107436886261555,,, +9.078125,18,-0.12185336746776525,0.2415941003342993,0.5228845390697227,0.6787839495453916,0.6862832549851708,0.5461889780978855,0.2830005372707609,-0.05890675064426179,-0.4221984468079384,-0.7455202040128219,-0.9730670491307228,-1.0632922087896954,-0.9953989529121154,-0.7726042173585571,,, +9.0859375,18,-0.4216655598185733,0.011255010284122569,0.4677462541206902,0.8862076883627318,1.2114033826819741,1.4030217214580292,1.4419081220533274,1.3330001645944427,1.104508217070779,0.8034694342715148,0.4883678847000612,0.21997053374832,-0.4356561147631199,-0.8186764775137496,,, +9.09375,18,-1.0081433967961426,-0.9290136570910552,-0.5782755686344085,-0.02594798640489937,0.6039212138201148,1.1670511299322737,1.5382576305889173,1.6455397461693988,1.4895825958344968,1.1433337550739306,0.7317712933500011,0.3974106139508502,0.26100580839170784,0.3882182710079364,,, +9.1015625,18,0.7713898465129009,1.331418038516542,1.93922137051054,2.4509138344084085,2.74705001075904,2.765186677290628,2.516838337955032,2.0841811135130373,1.5974096385734489,1.198953866043376,1.0043638005590654,1.0705832102495263,1.3803080694328391,1.8467169384037927,,, +9.109375,18,0.9541473858153038,0.8298515710235898,0.7133916237356159,0.6067318151316825,0.5116559200200453,0.4297360994505196,0.3623054934292023,0.3104350035576405,0.27491467205388986,0.2562399831273977,0.2546033264862708,0.2698907723655967,0.3016842144571993,0.34926884312805884,,, +9.1171875,18,0.4116458179786364,0.4875499177506247,0.5754718584370799,0.6736848887068293,0.7802751968568633,0.8931755967642645,1.0102019028938325,1.1290913573274082,1.2475424358511251,1.3632553359861397,1.4739724379057453,1.577518029656623,1.6718366009790857,1.7550290350865851,,, +9.125,18,1.825386064567979,1.8814184054799872,1.921883041861504,1.9458052003042003,0.604417573044106,0.762520422089788,0.8638596286695489,0.9006060485879421,0.8695573748316593,0.7723643318340968,0.6154181276632871,0.4094070061107745,0.1685728161479373,-0.09028056425222647,,, +9.1328125,18,-0.3489578081521276,-0.5891400984460354,-0.7936620489777781,-0.947708545744468,-1.0398480493530355,-1.0628303031479058,-1.0140928193371996,-0.8959408224598513,-0.7153880995684622,-0.4836698517415143,-0.2154615131166973,0.0721419933366145,0.36081538937194096,0.6322776488609725,,, +9.140625,18,0.8695632039377611,1.0582011127253883,1.187219970323914,1.2499084969240708,1.2442787749959534,1.1731998433845106,1.0441923438342844,0.8688985519617296,0.051806707888992665,0.021774199587781932,0.14617969616262816,0.417142059275874,0.8037632007786415,1.2568844768513978,,, +9.1484375,18,1.7166880567186629,2.1219595986274333,2.419569803137705,2.5726983157306917,2.566519328301043,2.410463573329189,2.1367046385401602,1.795105599686068,1.4454132798390678,1.1479161257556547,0.9540209760427404,0.8982166123364171,0.9926759684812108,1.225337869553142,,, +9.15625,18,1.5617671984764885,1.950503858381826,2.331067480415,2.6433711598402714,2.8370780188639815,2.8794432786218453,2.7604203915860803,2.4942359015617805,2.117187691766869,1.6820094879715282,1.2496792871660307,0.8799474843669643,2.852889927039908,2.713790862503965,,, +9.1640625,18,2.3157060379725762,1.7501372925072096,1.152247473859403,0.6639740356038719,0.3953026176665633,0.39431278500970623,0.6342037775135466,1.0208542919386059,1.4188424511072004,1.6887926461192664,1.72581151401556,1.4884767656891935,1.0104317304233548,0.39140572571108,,, +9.171875,18,-0.22988086392972545,-0.7135030267234177,-0.9564550344447286,-0.9206652161397296,-0.6432255093026445,-0.22603399268080746,0.19230923401487954,0.4746487715347093,0.5230069686686263,0.3055605619635172,-0.134533641200966,-0.69088376613931,-1.2229602888224234,-1.5945716195957305,,, +9.1796875,18,1.9524956296813785,1.9415628833411207,1.9129203885758543,1.8667881794533745,1.8036892625383047,1.7244406790093474,1.6301394195429189,1.5221434384614267,1.402048099453418,1.2716584651683334,1.1329579157585759,0.9880736457228348,0.8392396430653856,0.6887577988676198,,, +9.1875,18,0.5389578281088356,0.3921567033836333,0.2506183116950397,0.11651404059649252,-0.008115016319480306,-0.12139357293803145,-0.22164476144064085,-0.3074192695450778,-0.37752049410821975,-0.43102527078752784,-0.4672998169165834,-0.4860106085685735,-0.4871300014811551,-0.4709364975505619,,, +9.1953125,18,-0.4380096523577285,-0.38921971302323655,-0.3257121679587577,-0.2488874791736039,0.6622647617440088,0.44149305164360775,0.2248355427581712,0.030315243398469364,-0.1255373056810708,-0.2288434725913661,-0.2693511951761096,-0.2411568794354117,-0.14312417911854358,0.021029562739359745,,, +9.203125,18,0.24298525481039346,0.5103948291827523,0.8077349195852714,1.11738193355074,1.4208335675123238,1.6999916019468302,1.9384165404239169,2.122466619796798,2.2422417818642213,2.292266797365312,2.2718659227561964,2.1852029804159976,2.040984083785024,1.8518437535046413,,, +9.2109375,18,1.6334572484727,1.4034410272838684,1.1801180294848377,0.9812338922024764,0.8227136386813484,0.7175455525553658,0.6748700820917399,0.6993373207125516,0.6220598645669767,0.5071202568386869,0.54328224362669,0.7145186608867543,0.9831603487734101,1.2958085167728188,,, +9.21875,18,1.5916996148888982,1.8122195988447127,1.9100854414278519,1.8567635599097696,1.6469694300639106,1.2995472702632889,0.8545924961121801,0.3672648496459149,-0.10074445121505582,-0.4907628002702449,-0.7562163451835233,-0.8698261967975953,-0.8278001478816603,-0.650367304477361,,, +9.2265625,18,-0.3785726378371915,-0.06783099476906987,0.22075517302413844,0.4299617974925852,0.5154027051693095,0.452486929636995,0.2402899714193533,-0.0982641649937004,-0.5199386954572609,-0.967887002505886,-1.3804789351412183,-1.7008758515135738,-1.146411330155489,-0.6229389326082049,,, +9.234375,18,-0.1170858921302983,0.23634458643860745,0.3462990594086741,0.1902990410410348,-0.1795454085373459,-0.6509803965931424,-1.0825507520725035,-1.342558266425076,-1.3453564921810928,-1.0750328419838329,-0.5899854131129804,-0.007138083556639806,0.5298820776165566,0.8898856167614013,,, +9.2421875,18,0.9898545488832492,0.8174778133816107,0.43431413522768414,-0.04128251572713429,-0.4667932860173402,-0.7147757496485171,-0.7079595467160201,-0.4405760593685005,0.019925185063190458,0.5512451279023497,1.0096556847480151,1.2693135661190036,1.2566934666389662,0.9707041144920392,,, +9.25,18,-0.16037635214752344,-0.06201097641527376,0.04420725943809517,0.15614301294295413,0.2715645758116729,0.3881831466231442,0.5036931003483732,0.615812549483701,0.722323486457892,0.8211108043103499,0.9101995122817772,0.9877894945687946,1.0522872035121291,1.1023337321713529,,, +9.2578125,18,1.1368287746356205,1.1549500544285831,1.1561678807214275,1.1402545773810946,1.1072886196608716,1.0576534060105949,0.9920306864259866,0.9113887623215616,0.8169656644659512,0.7102476034537828,0.592943069968803,0.466953038268442,0.3343377945527398,0.19728097098497133,,, +9.265625,18,0.05805141505975395,-0.08103643807818801,-0.21766299654478166,-0.34954403797225136,0.7907778808458397,0.9442101236440444,1.150183251313913,1.3954323473813142,1.66379969641534,1.9373581455211648,2.197658180180451,2.427011759275148,2.609723390045924,2.7331826020859458,,, +9.2734375,18,2.7887416437696406,2.7723172008410653,2.684674180885056,2.531371777146787,2.3223755746729915,2.071362748851888,1.7947688072365977,1.5106423477197035,1.2373876929211205,0.9924830785762094,0.7912637775879041,0.6458550124189981,0.5643290624860843,0.5501453385868472,,, +9.28125,18,0.6019124634251767,0.7134889420226124,0.8744153941075175,1.0706481989687209,1.2855433841016617,1.5010221379872113,1.6988366614466213,1.8618480744475727,-1.8858631540974784,-1.9125646966607264,-1.7819933317190892,-1.5188846343554008,-1.1678397322799865,-0.7863780271385739,,, +9.2890625,18,-0.4359818717273035,-0.17252801021716413,-0.03759608255477609,-0.052007866281715616,-0.21260345974999664,-0.492756420356324,-0.8465474903975126,-1.2159466804609422,-1.539884895138618,-1.7638019629595334,-1.8481837142255104,-1.7747581968544022,-1.549385708351597,-1.2011922652183782,,, +9.296875,18,-0.7780812243995945,-0.33932188348202164,0.05363084611615865,0.34665608603744424,0.5013435057183959,0.5009223056708437,0.35281948853963,0.08744924443999075,-0.2465776995379363,-0.5900783082753369,-0.8825672473085363,-1.071728538610051,-0.579853039509084,-0.8879829459310553,,, +9.3046875,18,-0.9369571529593096,-0.7305381808901379,-0.34430530330437426,0.09519452812442196,0.4452823433193773,0.586420625049167,0.4551593926122636,0.06172370455019983,-0.5125794129689815,-1.1374258253378702,-1.6689656090930485,-1.9890157887431623,-2.0372150551392108,-1.8273299746135725,,, +9.3125,18,-1.443245814285384,-1.015742941376048,-0.6864258273818467,-0.5686927291878014,-0.7164451173566005,-1.1091146072250622,-1.6571129105047648,-2.226212870903965,-2.6741800721467284,-2.8896168445744013,-2.822373983087384,-2.4971963530968417,-2.0068634656108952,-1.4867057238277943,,, +9.3203125,18,-0.474470621548394,-0.5903476870341094,-0.6952306649395888,-0.7873594568609689,-0.8651891910264243,-0.92741721456032,-0.9730058498688364,-1.0012005167155942,-1.0115429026994929,-1.003878951546464,-0.9783615293625808,-0.9354477221821992,-0.8758908121467556,-0.8007270728240088,,, +9.328125,18,-0.7112576148897333,-0.6090256000602863,-0.4957892222611578,-0.3734909291297172,-0.2442234227790866,-0.11019303513962107,0.026318880834150616,0.1629958680679738,0.29752689145687555,0.4276467635481657,0.5511757619914976,0.6660577450804283,0.7703960980152812,0.8624868805020893,,, +9.3359375,18,0.9408485953100836,1.004248056581707,1.0517219049827091,1.0825933930090788,1.9752272539453888,2.0274948520235645,2.0113279574978105,1.9240771363098768,1.7679577817413523,1.5499024164184323,1.2810842305522745,0.9761450661972066,0.6521816668638387,0.32756086841264165,,, +9.34375,18,0.020646335336500177,-0.2514743855008706,-0.4741737439548548,-0.6362964599165364,-0.7309296190129118,-0.7558769067560128,-0.7138039286365514,-0.612044499897181,-0.4620814303622624,-0.2787380281330398,-0.07913671835421587,0.11850258707992975,0.2961405585100515,0.4371838157217904,,, +9.3515625,18,0.5276493389085092,0.557146709199579,0.5196096682262255,0.4137259673364336,0.2430355166951135,0.01568997544035966,-0.2561094666722169,-0.5569569244763108,-1.1216133296258315,-1.0182866641220771,-0.7720434840230291,-0.4158484623161979,-0.00024243714903004327,0.4144914242228803,,, +9.359375,18,0.7676817772454503,1.0076868007754332,1.0999087654489652,1.032157316535554,0.8165262517541106,0.4874915972993482,0.09652731864104937,-0.2959226205318992,-0.6298653955107002,-0.855106221247624,-0.9390651674749986,-0.8718463791389114,-0.6677701663683422,-0.3631293758236643,,, +9.3671875,18,-0.010519564007958462,0.3293738381074246,0.5972520728865528,0.7444671707299828,0.7406305549856929,0.5783808967387182,0.2745684237623408,-0.13232897219745846,-0.5881555836307607,-1.0314671936649191,-1.4030533979212312,-1.655110037746336,-0.959585996287,-1.2659126255190791,,, +9.375,18,-1.7091501710519361,-2.15258707211593,-2.456987598036431,-2.5188740818156896,-2.2990283625802794,-1.83339979703274,-1.2234288664617816,-0.6084368212967504,-0.12764682843450526,0.11775634150338732,0.09213171762522544,-0.16508376356484578,-0.5504233711433951,-0.9249908196313792,,, +9.3828125,18,-1.1527720007694833,-1.138155933619281,-0.8523793987624608,-0.3416454378396707,0.2853114075119864,0.8868071428972091,1.3268320366146729,1.5121322306754763,1.4175879977136316,1.0929347949737247,0.6489864943089608,0.22713784086931305,-0.03949432130817376,-0.06264014141296592,,, +9.390625,18,1.0964841465885211,1.093320697082252,1.0733356693661191,1.0370636052444695,0.9853314953883012,0.919244185645564,0.8401649133240138,0.7496913143226203,0.6496273212976582,0.5419514449977543,0.42878199423690216,0.3123398435812736,0.19490940076585486,0.07879845738568203,,, +9.3984375,18,-0.0337023740410855,-0.14035992629342053,-0.23903774179983586,-0.3277336475135878,-0.4046149822783491,-0.4680508597582359,-0.5166409019084306,-0.5492399397621132,-0.5649782489198386,-0.5632769653110115,-0.5438584111903592,-0.5067511504502229,-0.4522896846182698,-0.381108794748654,,, +9.40625,18,-0.2941326281640646,-0.1925587210213371,-0.0778372363449209,0.04835421905088698,-0.8693103694899761,-1.1747093978825087,-1.4550573074153828,-1.6938780913639713,-1.8774607059094968,-1.9958108275971451,-2.043343741094588,-2.0192700485807524,-1.927647311883098,-1.7770940333046457,,, +9.4140625,18,-1.5801859265097649,-1.3525765829818583,-1.1119038575411688,-0.8765582381039627,-0.6643990883221643,-0.4915082859161731,-0.3710681709678595,-0.3124420490814449,-0.32052136870183057,-0.3953850950096016,-0.5322950315304539,-0.7220274130719652,-0.9515176435199888,-1.20477321463001,,, +9.421875,18,-1.4639911400428212,-1.7108019764698286,-1.927553675895715,-2.0985457343500302,-2.211127568030744,-2.2565845147078383,-2.230749667193357,-2.1342988635897333,-1.7586333482701684,-1.7078844111842089,-1.5212288254145268,-1.238221094123897,-0.913388136605924,-0.6076804657194353,,, +9.4296875,18,-0.3789228468145008,-0.2727520905049823,-0.3154537568493545,-0.509813780409114,-0.8346314316842809,-1.2479697523810327,-1.6936374636454228,-2.109893018984244,-2.4390153529833283,-2.636250873350609,-2.6767433847533715,-2.5593677883169916,-2.3068706391527862,-1.9622958548178795,,, +9.4375,18,-1.582252458159009,-1.2280730901479888,-0.956240533567376,-0.8095734804469997,-0.8105445002332445,-0.9577710439466668,-1.2262260819268112,-1.5711355993423948,-1.9349559050838725,-2.2563439913636616,-2.4797237321547843,-2.5639578826283933,1.1636337796775271,1.6539765229873042,,, +9.4453125,18,1.9635801813269087,2.0083798415446767,1.774598078147986,1.322610806974124,0.7705098252870084,0.2618659463757533,-0.07347339316832513,-0.1548092941867507,0.02746806227693943,0.4094350144430146,0.8713542616776105,1.2707005357257235,1.48143873816606,1.4287875047058565,,, +9.453125,18,1.1099384223166349,0.5950502353088793,0.008243405941132875,-0.5061982863378666,-0.8231580804386479,-0.8707712848484539,-0.6499253261729281,-0.2338322956103996,0.2522070857576295,0.6653003507631885,0.8842649578073213,0.8429619965069615,0.5485249817887208,0.07948677269577109,,, +9.4609375,18,0.18413975792048554,0.32747784569938115,0.4761968320924424,0.6280327591079563,0.780668783647153,0.931775524492182,1.0790516273459252,1.220263837763802,1.3532858804335497,1.476135464159877,1.5870087647330031,1.6843117820189732,1.7666880223457633,1.8330420216019567,,, +9.46875,18,1.882558297293728,1.9147153978462568,1.9292948032811053,1.9263845215546784,1.9063773177212544,1.869963607062778,1.8181191367610825,1.7520876719411298,1.6733589893856151,1.5836425643843937,1.4848374115944751,1.3789986081276742,1.2683010851792802,1.1550013223348754,,, +9.4765625,18,1.0413976154180449,0.9297896137175142,0.8224378352229961,0.7215238688866228,-1.9727082528565127,-1.755877383302195,-1.4974440851542523,-1.2138389099628388,-0.9231450505808574,-0.6438432294003185,-0.3935290635800448,-0.1876923348098395,-0.03864327394483347,0.045339281349702665,,, +9.484375,18,0.06057847005968042,0.008248959885440721,-0.1057119177845508,-0.2710252365519711,-0.4737943680912054,-0.6974812033286584,-0.924066609650964,-1.1353141846406407,-1.3140491636021363,-1.4453632814239885,-1.5176615528071506,-1.5234779585011742,-1.460003140236482,-1.3292872897453982,,, +9.4921875,18,-1.1381040672159026,-0.8974850222510172,-0.6219569675935879,-0.3285354702339078,-0.0355446315773289,0.23865455784746364,0.4769386278568033,0.6646099477566589,-2.488775097328893,-2.257950832205452,-1.8987465755153885,-1.4576946183920416,-0.9933847587856948,-0.5673762793937669,,, +9.5,19,-0.23465052174541925,-0.03509091724480495,0.012682710787286002,-0.08583453607486335,-0.3019395608914766,-0.5882449344044175,-0.8861144434105348,-1.1348521261168223,-1.2812132739946365,-1.2877557258509822,-1.138730406068513,-0.8425933317837278,-0.4307475364473585,0.047289432237237916,,, +9.5078125,19,0.5315400446847162,0.9608514075173114,1.2823641236383474,1.4596908477599038,1.4785309549750776,1.3488470698971022,1.1032647018718291,0.7919444912765866,0.47472596844659204,0.21176668903134988,0.054134947485810166,0.03582148469711921,-1.0559424302698834,-0.9805308134649792,,, +9.515625,19,-0.6397486807588153,-0.11650103039273532,0.4582900150096467,0.9414759709696828,1.2168035282042364,1.2266458242112233,0.9876480388324158,0.5860006728712115,0.15363746567758813,-0.16811696607803028,-0.2674849042836843,-0.09308516032349012,0.3317623742531527,0.9151997580227836,,, +9.5234375,19,1.5217746183414411,2.0093302070512227,2.267733599157547,2.2488299576544124,1.9794154367312893,1.5536753345050718,1.1071620032225646,0.7794463425287738,0.6756808335351371,0.8376102695003146,1.2319768768950814,1.7594990934646781,2.2819644877080516,2.6600125893540083,,, +9.53125,19,0.6291119608921009,0.547112657681488,0.4772491424736793,0.4210268548436561,0.3797069254465296,0.35428389116306946,0.34546808099427584,0.35367298124528124,0.3790078013506159,0.4212753706285269,0.4799754029053088,0.5543130719586719,0.6432127477339737,0.7453366529221901,,, +9.5390625,19,0.8591081133290059,0.9827389950271528,1.114260847971115,1.2515592108502356,1.3924104766036554,1.5345206731772008,1.675565480567844,1.8132307835499424,1.945253050094696,2.0694588285465945,2.183802672044403,2.2864028262144283,2.3755740553241265,2.44985703218673,,, +9.546875,19,2.5080437772751227,2.5491987016758197,2.5726748854901365,2.5781253067125447,0.7904161035358132,0.8473292618161093,0.8330311856053432,0.7500700921560328,0.6056784261179362,0.4112642659944943,0.18161183984181464,-0.06615308979443538,-0.3137608160001856,-0.5430747329154044,,, +9.5546875,19,-0.7373587767787444,-0.8824468734122738,-0.9677328371401852,-0.9869116874148328,-0.9384206846494008,-0.8255493271013369,-0.6562106358593283,-0.44238967526562906,-0.19930776432450986,0.05563933875009662,0.3040952343023228,0.5280240177347468,0.7109694145934975,0.8392041075067072,,, +9.5625,19,0.9026891047005065,0.8957762454289948,0.8176048487406248,0.6721648395875311,0.4680219431161896,0.21772410229532013,-0.06306949738071876,-0.3566760695905768,0.16841457285688355,0.4392680077000369,0.8134474808299634,1.2391522828908073,1.6557679673721653,2.003295798485719,,, +9.5703125,19,2.231690344509333,2.3086508638696777,2.2246529401214667,1.9944366466697048,1.6547194152590297,1.2584897837405429,0.8667707242160033,0.5391353587696391,0.3244521726423049,0.2533010703390501,0.3332413593257916,0.5476685258205397,0.8584376773764029,1.2118448332360519,,, +9.578125,19,1.54703422647443,1.805521904526926,1.940352033212919,1.9234595069120493,1.7500918353075958,1.4396013021521583,1.0324837340700526,0.5841248224240485,0.1562277534681098,-0.19274295181274206,-0.416613256985105,-0.4886375103864093,2.23886694225892,1.6956506394796358,,, +9.5859375,19,1.1479714498535019,0.733742939174729,0.5517084694370306,0.6344597866682036,0.93960714577482,1.3615201005051414,1.760420097895929,2.000850230607829,1.9889773372331727,1.698501506087847,1.1780702681038415,0.5381636509147368,-0.0789574194072864,-0.5380051431862614,,, +9.59375,19,-0.7475020690942693,-0.684607673005711,-0.4011322418142417,-0.009092016917952224,0.3502333296616259,0.545258326435005,0.4903852284324841,0.1696844440421632,-0.3585301736067171,-0.9774869592311706,-1.5437783419107334,-1.9264991779540648,-2.0429762990334552,-1.8812981463262684,,, +9.6015625,19,2.5655088240303368,2.53509080884463,2.487438415501348,2.423410572602599,2.3441428706994314,2.2510276110282663,2.145689364678846,2.029956470192797,1.9058289687042689,1.7754435381108422,1.6410360403066109,1.5049023372993349,1.3693580623457369,1.236698050529646,,, +9.609375,19,1.1091561391698097,0.9888660419651508,0.8778239819789362,0.7778537377664912,0.6905747146901978,0.6173736004935519,0.5593801014422439,0.5174471838854645,0.4921361671996343,0.4837069291241258,0.4921133949788015,0.5170043897289786,0.5577298379574642,0.6133522031579365,,, +9.6171875,19,0.6826629660211317,0.7642038531492984,0.856292444451141,0.957051710797468,-0.6446177006092262,-0.9089049998012064,-1.1332864254839818,-1.30437617864429,-1.412582025417488,-1.4527683613955866,-1.4246082937823283,-1.3326002036751678,-1.1857476480810911,-0.9969249380867656,,, +9.625,19,-0.7819726487944689,-0.5585861497027882,-0.3450746778773572,-0.1590775039940081,-0.016326733635591006,0.07045696559681525,0.09245868977132303,0.04539129587721225,-0.07019832034866746,-0.248960040946296,-0.481106304878508,-0.7530873600356243,-1.0485289177345123,-1.3493668410823942,,, +9.6328125,19,-1.6370997586278386,-1.894072271225688,-2.1046992864592045,-2.256546120051349,-2.34118906122771,-2.3547964075960444,-2.2983894672805487,-2.1777653425384376,-0.4056109487772401,-0.188316544617385,0.12176312281963655,0.4689565567619681,0.7921222543339516,1.034217568945392,,, +9.640625,19,1.1512268790954967,1.1190582225187242,0.9373339901344366,0.6294850552795924,0.2391334886447386,-0.17667290182734602,-0.5563206045863206,-0.8432051510846681,-0.9945293755774156,-0.9879549107031416,-0.8250709912620077,-0.5311403391760917,-0.15116174610798927,0.2571373569773677,,, +9.6484375,19,0.6322869043163618,0.9186391825858512,1.07502305079276,1.0811395201426146,0.9407026365776722,0.6808365647268924,0.3478229076248517,-0.00013921485794105018,-0.3020325095115014,-0.5035628241257577,-0.5656561262348584,-0.4705874855962147,-0.5989380128989524,-0.3432683742260648,,, +9.65625,19,-0.3391743501560325,-0.5930208197510369,-1.03797105891508,-1.5523512058398798,-1.993065659768123,-2.2349045380791877,-2.2049692879229963,-1.9027803319703385,-1.4005545787845963,-0.8235753112492804,-0.3160328994626934,-0.0016966614035063274,0.04980529620134122,-0.1581414954299757,,, +9.6640625,19,-0.5502835240739349,-1.0003469678314532,-1.365871535528321,-1.5274814161144823,-1.4218281929077352,-1.0591749173065814,-0.5207999678962261,0.06306983438278546,0.5487509652021569,0.8182944595873207,0.8116373311716317,0.542904065507834,0.09639195364144736,-0.3966580726208401,,, +9.671875,19,1.0644429646931772,1.1763016469592809,1.2903753227554593,1.4043632215851811,1.5159566288893715,1.6228794219165696,1.7229280400322415,1.81401018952742,1.89418160514328,1.961680224553696,2.014957177340849,2.05270404577762,2.0738759200059054,2.0777098438380928,,, +9.6796875,19,2.063738328116377,2.031797694927775,1.9820311064829448,1.9148862255344,1.831107548209736,1.7317235434175922,1.6180288239196998,1.4915616611541958,1.3540772374242862,1.207517103703008,1.0539753777406151,0.8956622742387178,0.7348656055661532,0.5739109270266861,,, +9.6875,19,0.41512102442074506,0.2607754531561529,0.11307083726156165,-0.025917376654358004,-2.003086893692656,-1.7881684903097554,-1.5495073697639734,-1.3051281623930502,-1.0733211703642396,-0.8713623956685664,-0.7143045847195049,-0.6139236041730501,-0.5778936301700872,-0.6092486766175039,,, +9.6953125,19,-0.7061680200785988,-0.8621004917636967,-1.0662189760810177,-1.304173428082789,-1.5590899046912714,-1.812745948464202,-2.0468403642359427,-2.2442688458371416,-2.3903165013290804,-2.4736841192964256,-2.487276611670416,-2.4286986519164557,-2.3004229447839566,-2.109619391432774,,, +9.703125,19,-1.8676570597694733,-1.5893136853466423,-1.2917478221926386,-0.9933053133190544,-0.7122433032861435,-0.4654607644877663,-0.2673240538491216,-0.12866938911597692,-0.22478721370002064,0.14211314884368692,0.581846654197803,1.0349776875126826,1.4401069100544026,1.7433809630471888,,, +9.7109375,19,1.9068260279580351,1.9142075340886888,1.7735036229859125,1.5156074059761238,1.1894604365064685,0.8543756746172421,0.5707459692808011,0.39058554398725387,0.3493779756184593,0.4605006560541449,0.7130944164067917,1.0737103813922508,1.4914777863981656,1.9059880686169584,,, +9.71875,19,2.25666745574376,2.49217841939928,2.5783858486121547,2.5036473341280496,2.280603720349197,1.9441911648688013,1.5461844464208243,1.1471215185643435,0.8068671709178505,0.5752856052600375,0.4844747488361793,0.5437718573588929,-0.90607930372776,-0.5860177234715541,,, +9.7265625,19,-0.1108669826002526,0.3858125776175192,0.7624735759946201,0.9084188622652613,0.7742052064664954,0.3852800740259296,-0.16488673492767222,-0.7402951505768915,-1.1995451531857708,-1.43443037131531,-1.3994190987355537,-1.1239444988389722,-0.7041373795488789,-0.27626920832716345,,, +9.734375,19,0.0208141939766654,0.08397044045919555,-0.12574304679349868,-0.5721662143466681,-1.1537174020783338,-1.7310070932502957,-2.1648184253506484,-2.3540472380926323,-2.2632054642210693,-1.9319519640326583,-1.4640405454358778,-0.9987159284941196,-0.6723987743130913,-0.5811622284832774,,, +9.7421875,19,-0.15427104093073676,-0.2702626715040034,-0.3723854715890647,-0.4593794888017533,-0.5302534478387462,-0.5843018765518898,-0.6211172256679853,-0.6405967700668992,-0.6429441709068429,-0.6286656713746667,-0.5985609928048461,-0.5537090907084877,-0.4954490202553558,-0.4253562463886582,,, +9.75,19,-0.34521481351435124,-0.256985862207359,-0.16277304434147555,-0.06478544235578748,0.03470135792220618,0.13338535914987054,0.2289787068957022,0.31924799637580115,0.4020536255975829,0.4753875057003949,0.5374084680531248,0.5864747479959743,0.6211729763020292,0.640343170586164,,, +9.7578125,19,0.6430992889266145,0.6288449856739826,0.5972842934304241,0.5484270440255296,-0.05605179603767518,-0.051292889851699004,-0.1113590151414512,-0.2285782305518961,-0.3911809954978224,-0.584126842636669,-0.7901593766136679,-0.9910160171395546,-1.1687081131322967,-1.3067821469915983,,, +9.765625,19,-1.3914740662742189,-1.4126762321980866,-1.364649540858781,-1.2464310426167169,-1.0619086187008204,-0.8195574909672141,-0.5318569219788148,-0.21442776372982705,0.11504902069192098,0.4380574648680284,0.7365299229293989,0.9940991366753074,1.1972317526761092,1.3361642629144257,,, +9.7734375,19,1.405576120065299,1.4049531060265392,1.3386156317647169,1.2154100117319404,1.0480842577165317,0.852391936161771,0.6459865956624185,0.4471838751961869,0.7383082961068143,1.0313385633164245,1.3699807410813574,1.6934741906163315,1.9426682144879384,2.0692636591835134,,, +9.78125,19,2.043367893150002,1.8581862777519944,1.5311192373428515,1.101093864849389,0.6225454745011839,0.15698628708059242,-0.2365257636269784,-0.5105338149027334,-0.6365200462434579,-0.6092921760378082,-0.44773553826064616,-0.19181388069126654,0.10371368697423786,0.3778806857649981,,, +9.7890625,19,0.573068282328688,0.6440387877487342,0.5650403313822303,0.3338758275102149,-0.027697816466269898,-0.477302712288267,-0.958486366058068,-1.4094620527694233,-1.772682090239036,-2.0037531733874303,-2.078305395466721,-1.9957452936956623,-1.6485868324379402,-2.1206266730350167,,, +9.796875,19,-2.4269462563799578,-2.4750296263207527,-2.2405210785504446,-1.7739374355925606,-1.1868824639428248,-0.6215411815134775,-0.21181408240509114,-0.046742358463123024,-0.14624711619546227,-0.4558305132513445,-0.8616896790346499,-1.2220995987095429,-1.4064621656243441,-1.3313174162897126,,, +9.8046875,19,-0.9834454290170636,-0.4237253389313429,0.2293082526840328,0.831706914401708,1.253313768574296,1.413189784458319,1.3015538702167329,0.9822257895030496,0.5749044723115044,0.22214073710785087,0.05005815922344314,0.1335891635674431,0.4757558129620912,1.0066753987384005,,, +9.8125,19,0.482588933436481,0.4003862293842597,0.3027252141460616,0.19078654731048306,0.06600482215521475,-0.06995632651345107,-0.2152331273235374,-0.3677940841031988,-0.5254753270438265,-0.6860182843843595,-0.8471090151087691,-1.0064185140598378,-1.1616432838467143,-1.3105454632487543,,, +9.8203125,19,-1.4509918095821102,-1.5809908525623206,-1.698727569208394,-1.8025949727411672,-1.8912220624607536,-1.9634976453052184,-2.018589612077628,-2.05595933091376,-2.075370906058513,-2.076895139924078,-2.0609081291463047,-2.0280845193108084,-1.9793855365455333,-1.916042005629488,,, +9.828125,19,-1.8395326520511983,-1.751558068026025,-1.6540107984005894,-1.5489420703138268,0.2736776302883965,0.1412996203627236,0.06290926239765038,0.047490885580946614,0.09952145142185433,0.21865284280608235,0.3997308890038589,0.6331498113562795,0.905517383778287,1.2005844344187446,,, +9.8359375,19,1.5003738807855602,1.78643057582607,2.041104817197791,2.248780023772494,2.396958976048795,2.4771328791599183,2.485372650836898,2.4226012060254254,2.294527754155593,2.111248693177352,1.8865429329128216,1.6369107878667533,1.3804234605179972,1.1354633434145478,,, +9.84375,19,0.9194429811192276,0.7475920203419666,0.6318967347520251,0.5802660706299053,0.5959823627058364,0.677475017785523,0.8184329414210725,1.0082478604955294,-1.7793085720838204,-1.4724044836003367,-1.1318214310639672,-0.8188522105356447,-0.5897213295280186,-0.4868055189994618,,, +9.8515625,19,-0.5320149945006737,-0.7233664537608443,-1.035281647771594,-1.42256506395894,-1.8274411979486795,-2.1885553223062963,-2.4505358145300944,-2.5726286198166783,-2.5350589232469867,-2.3421290847519733,-2.021570214496664,-1.6202482621342469,-1.1968932782492914,-0.8129841448761891,,, +9.859375,19,-0.5232083501518043,-0.3669825549657968,-0.3623544602353216,-0.5032355690760923,-0.7603956206593736,-1.0860635605114697,-1.4214181644202275,-1.7058013451120015,-1.8862188461492533,-1.9256482590137205,-1.8088600601329008,-1.5448447214123011,2.4329243626433774,2.4713632605854707,,, +9.8671875,19,2.2362814267250295,1.8014652608872128,1.2928153670025415,0.8538424622619256,0.6063595646570482,0.6171432507985303,0.8797006283950916,1.3161384450110551,1.7986211693539491,2.1845359471057515,2.355725515667311,2.251035093664627,1.883251550004388,1.3357906296337834,,, +9.875,19,0.7400383434152982,0.239554639845954,-0.04905195422011521,-0.06785771536971097,0.1667299144446106,0.5686990316921404,1.0062354334357315,1.3380746325930488,1.4524386154187934,1.2978838821139151,0.8976042570581039,0.3432665957181649,-0.2299329589483282,-0.6801575103892441,,, +9.8828125,19,-1.438525749245629,-1.3250201526489276,-1.2107283898720198,-1.0979579228770804,-0.9889800559060912,-0.8859900634822014,-0.7910686549568475,-0.7061454504069468,-0.6329651074627736,-0.5730566922300264,-0.5277068306589361,-0.4979371105169019,-0.4844861296896955,-0.4877965051754379,,, +9.890625,19,-0.5080070702723657,-0.5449503966117121,-0.5981556844470776,-0.6668569706099537,-0.7500065104266533,-0.8462930992916223,-0.9541650130969404,-1.0718571658380855,-1.1974220088697822,-1.3287636307684352,-1.463674460708568,-1.5998739326733988,-1.735048433480461,-1.8668918351202568,,, +9.8984375,19,-1.9931459016737616,-2.111639863263375,-2.220328464078039,-2.317327818226506,1.2327576194253285,1.4752376088476309,1.7175711818879802,1.9415174310549832,2.1299879088756484,2.268243251085205,2.3449262460223044,2.352859298427874,2.289550664824775,2.1573741454138933,,, +9.90625,19,1.963409687853443,1.71895600352126,1.43874916805188,1.1399416802011104,0.8409131567462577,0.5599955813656452,0.3142019835890405,0.1180471844819373,-0.017457174581791083,-0.0855632571749424,-0.08425028736301554,-0.01635814841847838,0.11061797435660492,0.2850575692890512,,, +9.9140625,19,0.4920324184173072,0.7143548296638446,0.93378336756242,1.1323019862850738,1.293383350337788,1.4031482311605052,1.4513401151042724,1.4320470444573776,-1.1654675678421709,-0.7205606036044495,-0.2702154901430367,0.1245222023970496,0.4111083347522635,0.5536326883431173,,, +9.921875,19,0.538362198302741,0.37583180466289023,0.09915751349622297,-0.24116534061807,-0.5851682033905832,-0.8727881469847624,-1.0532584477220333,-1.0930480780133125,-0.9811133261578922,-0.7306434254769582,-0.3770281691438892,0.0276360482373832,0.42264614333056016,0.7481366808305354,,, +9.9296875,19,0.9543976824142956,1.0096146426040884,0.9048252148733684,0.6553205286000534,0.2982728439714921,-0.11304100110473835,-0.5175206952500202,-0.8557383753014435,-1.079170437195334,-1.1577274635611532,-1.0844095912459455,-0.876362387526986,-0.5185855258119355,-0.044011541707617376,,, +9.9375,19,0.4529050178439404,0.8320030852751283,0.9875160247302324,0.8770651301186261,0.5332582676298814,0.0547149885000463,-0.4210217693061233,-0.7552627270743866,-0.846283733541075,-0.6573254848023768,-0.2268064710576895,0.3420512245262633,0.9093414885667778,1.3366339892923207,,, +9.9453125,19,1.524717523747035,1.440584440721012,1.126262474348887,0.6870754814810741,0.26255255541172706,-0.012039412159295493,-0.0429947973398308,0.19592476986443488,0.6560796870094825,1.227070078573805,1.7667887816208765,2.1401749548462785,2.2560489725681085,2.0919350143238318,,, +9.953125,19,-2.4009484455545755,-2.4697249089393902,-2.5224415340754964,-2.558153761362824,-2.576204755983333,-2.576236985279352,-2.558198560666287,-2.522344232981091,-2.4692310237839554,-2.3997085690511977,-2.314904344280632,-2.2162040296530785,-2.1052273589896044,-1.9837998753183383,,, +9.9609375,19,-1.8539210875376968,-1.7177295856770658,-1.5774657255062734,-1.4354325358061577,-1.293955532728013,-1.1553421448056582,-1.0218414589988545,-0.8956049925213081,-0.7786491772458175,-0.6728202134864644,-0.5797619084696924,-0.5008870625417864,-0.4373529040365888,-0.3900410028349797,,, +9.96875,19,-0.35954201422226306,-0.3461455200704413,-0.34983514511597824,-0.3702890337358038,1.3441203397801735,1.1912609896177,0.9817676686808668,0.7279639417592607,0.4453445825060017,0.15150052376210532,-0.13510260664648244,-0.3964072001766933,-0.6160181956818231,-0.7803419500301817,,, +9.9765625,19,-0.8795300444003642,-0.9081622212041012,-0.8656208371354585,-0.7561307286892612,-0.5884617176021743,-0.3753145081062048,-0.13243280520424067,0.12249642612320925,0.3710778680670189,0.595491806004388,0.7797375963702331,0.9107499335660908,0.979310074031813,0.9806884747269504,,, +9.984375,19,0.9149740334172198,0.7870669732402504,0.6063358699973017,0.3859627418311813,0.1420218741581772,-0.10764337899046003,-0.3446674875244192,-0.5514463757145289,-0.5721689602798727,-0.2258002695935717,0.10183387416984396,0.3524169214575661,0.4793558869247209,0.4550875007353037,,, +9.9921875,19,0.2754219747542854,-0.03975245085409529,-0.4495141946225757,-0.8982283111911707,-1.3241576764331922,-1.6690244326631192,-1.887032739504633,-1.9519477801739915,-1.8611287196035369,-1.6358877455543597,-1.3181195510093426,-0.9637265082808592,-0.633863865484617,-0.3853688299205604,,, +10.0,20,1.636111020434646,1.4399177837363433,1.0723023881619116,0.6640528443060513,0.3566887338918744,0.26343588039588484,0.4379590028168385,0.8594239276275366,1.4379854431300785,2.0391987566842444,2.5206660369105585,2.7708761488356024,2.739594480200144,2.4514754864575568,65537.0,10.0,0.0 +10.0078125,20,1.9991685797103576,1.5178080812038388,1.1478798503402319,0.996642621295857,1.108677995417244,1.4536409464650362,1.9345683463378285,2.414468474771932,2.7539039989375125,2.849267721377605,2.661260323378025,2.2257644705092527,1.6441340832407634,1.055559076960261,,, +10.015625,20,-0.5325571084347556,-0.5217786634976752,-0.527936910725188,-0.5511523047308612,-0.591238944481824,-0.6477076617173539,-0.719774423515995,-0.8063739019783511,-0.9061779735179668,-1.0176188239284398,-1.1389162547508027,-1.2681087128950683,-1.4030875002717034,-1.5416335645115278,,, +10.0234375,20,-1.6814562266447055,-1.8202331677015111,-1.9556509741442785,-2.085445532251845,-2.2074415642274205,-2.319590613814764,-2.4200068163652184,-2.5069998270817537,-2.579104330924612,-2.6351056175198755,-2.6740607733032555,-2.6953151198775696,-2.698513610792822,-2.6836069872346786,,, +10.03125,20,-2.6508525848750506,-2.600809777793036,-2.5343301392756357,-2.4525424918114656,0.6068632495695971,0.36116352432540666,0.09652731864104937,-0.16875971243804722,-0.4165024163315035,-0.6298653955107002,-0.7945470873768998,-0.8997767985499928,-0.9390651674749986,-0.9106557242916716,,, +10.0390625,20,-0.8176460611867569,-0.6677701663683422,-0.4728571037611005,-0.248003790755826,-0.010519564007958462,0.22128386200930653,0.4293726569563566,0.5972520728865528,0.7111206232672763,0.7608367492658258,0.7406305549856929,0.6495109697983269,0.4913399341069525,0.2745684237623408,,, +10.046875,20,0.011652708817048996,-0.2818084599974395,-0.5881555836307607,-0.8888936470719653,-1.1659754266532314,-1.4030533979212312,-1.5866129597165302,-1.7069079666617846,-1.592443077156382,-1.7950306022689753,-1.8478479257149585,-1.7407387274473307,-1.4878177112435047,-1.1253038598920233,,, +10.0546875,20,-0.7059139516956169,-0.29068938414890017,0.06047088858611571,0.2980969822428262,0.3908080676595037,0.3301528788604872,0.13187706704659607,-0.16657972986949915,-0.5119669832230191,-0.8435699313168596,-1.1027194776788742,-1.241983824555267,-1.2326099060077036,-1.0690552876747672,,, +10.0625,20,-0.7699043767136473,-0.3750259509632348,0.06058554498780073,0.4753259626103338,0.8105285341894548,1.0195553313196386,1.075017305135646,0.9729985882632748,0.7336273279564994,0.3979043531994392,0.021283825792314248,-0.3349940948010373,0.4206752331407778,0.6944986823511625,,, +10.0703125,20,1.0934950955021592,1.4786945909132945,1.7141032008661474,1.7042127900856745,1.4204180456387634,0.9090982652816212,0.27914679448171154,-0.32763624026297594,-0.7751755634493526,-0.9701910477418196,-0.8875488179409184,-0.5769470909899723,-0.14910616084483794,0.2547508897715232,,, +10.078125,20,0.5017607993163157,0.5039736084652877,0.2425775920481397,-0.22684471456495506,-0.7894707554785838,-1.3026497845802636,-1.6349636910485836,-1.7022316595745164,-1.4905909004130922,-1.060327538051228,-0.529407345004855,-0.04121946808400912,0.27462715749314714,0.3377111504987905,,, +10.0859375,20,-2.356833108079668,-2.248821409633744,-2.1303315888192973,-2.0033606508376463,-1.870043435551868,-1.7326152315144612,-1.5933726368447054,-1.454633352290054,-1.3186956104879657,-1.1877979518192467,-1.0640800511717472,-0.9495452815212404,-0.8460256698329308,-0.7551498588831371,,, +10.09375,20,-0.6783146359714811,-0.6166605270330445,-0.5710518834680967,-0.5420618103426574,-0.5299621998321681,-0.5347190443888883,-0.555993111660472,-0.5931459693016528,-0.6452512541396278,-0.7111109883246886,-0.7892766567209804,-0.8780746764180699,-0.975635812341482,-1.0799280238321929,,, +10.1015625,20,-1.1887921669956434,-1.2999799276075732,-1.4111933203031966,-1.5201250623563058,-1.7586333482701684,-1.7412879269801236,-1.6592021510982442,-1.5212288254145268,-1.3401184226853036,-1.1316225545189391,-0.9133881366059241,-0.7037193788798847,-0.5202939481952873,-0.3789228468145008,,, +10.109375,20,-0.29244050150901035,-0.2698024779828798,-0.3154537568493545,-0.4290116400942755,-0.6052854165884791,-0.8346314316842809,-1.1036188168692456,-1.3959594718131636,-1.6936374636454228,-1.9781591019081992,-2.231836532107283,-2.4390153529833283,-2.5871606655194777,-2.6677258332064047,,, +10.1171875,20,-2.6767433847533715,-2.6150968657506386,-2.488454693621469,-2.3068706391527862,-2.084078804417808,-1.836532269959127,-1.582252458159009,-1.3395694583427524,-0.6134684241917763,-0.7694303894903108,-0.7779066023107346,-0.6375645921202778,-0.3709323019906495,-0.020897288793366803,,, +10.125,20,0.35596915393221795,0.6982231763419721,0.949122476092312,1.0654720954026593,1.0243640978537938,0.8267613299301952,0.4973670022303612,0.08080030830431137,-0.3653263664528519,-0.7793505187883109,-1.1051301060478254,-1.300751131108701,-1.345016168285718,-1.240703410543205,,, +10.1328125,20,-1.0140888413523304,-0.7108061860913976,-0.3886897203859267,-0.1087149597839534,0.07455147003773943,0.12150502723584646,0.013727027645451528,-0.24309067187240285,-0.6199759042812396,-1.0691323160225652,-1.5313276112111558,-1.9450634504310864,-0.7331153345508791,-1.1433858125058651,,, +10.140625,20,-1.3629772149012234,-1.3171723321507636,-1.0032687851088973,-0.4915362809788577,0.09382135758493038,0.6084837847061151,0.9273451075311084,0.9785809548622579,0.7631170044865077,0.3541653166105748,-0.123042423364084,-0.5257682958048634,-0.7330672370615694,-0.6790993922239924,,, +10.1484375,20,-0.3713242092149488,0.1114116407475894,0.6403697736497456,1.0721088898405278,1.2877236131195766,1.2253799417408346,0.8972308812836968,0.3860765499620379,-0.17731572707048304,-0.6500155089103028,-0.9160449519626008,-0.918086169862564,-0.6730908730992868,-0.26751501758310114,,, +10.15625,20,-1.6244991150252566,-1.7221106825188457,-1.8108649681211064,-1.888814008773996,-1.9541909430675828,-2.0054411125144704,-2.041249451442665,-2.060563685817443,-2.062612934687612,-2.046921388452003,-2.0133168243392308,-1.9619338098963035,-1.8932115382888608,-1.8078863332127184,,, +10.1640625,20,-1.7069789545469316,-1.5917769269181452,-1.463812200489349,-1.3248345350186703,-1.176781073119228,-1.0217426353698709,-0.8619273273344513,-0.6996220956044631,-0.5371529058969903,-0.376844240366768,-0.22097862320275166,-0.07175688309445216,0.06874015176191217,0.1985878555246772,,, +10.171875,20,0.3160512696704073,0.4196152452242935,0.5080107345950077,0.5802367727809215,-1.1258411620259583,-0.956240533567376,-0.8426955894322298,-0.7930560096213826,-0.8105445002332445,-0.8935311687259732,-1.0356466479184259,-1.2262260819268112,-1.4510530143435576,-1.6933513050124218,,, +10.1796875,20,-1.9349559050838725,-2.1575808468694766,-2.344096025079241,-2.4797237321547843,-2.5530715054145974,-2.5569292574012983,-2.488775097328893,-2.350954564629664,-2.1505207688560044,-1.8987465755153885,-1.6103428459727398,-1.302437236619088,-0.9933847587856948,-0.7014930320798135,,, +10.1875,20,-0.44375111186053096,-0.23465052174541925,-0.08518069168032671,-0.002068839709374437,0.012682710787286002,-0.03807047176330847,-0.14682087526724774,-0.3019395608914766,-2.2560990341043023,-2.425845308698181,-2.43732263549209,-2.2977542587462607,-2.0373918942105425,-1.704756616779765,,, +10.1953125,20,-1.359036551540147,-1.0608257034418425,-0.8626466241142524,-0.8007332685814871,-0.8893540980851321,-1.1185598121359877,-1.4557066716145837,-1.8505182884281963,-2.2428976035982533,-2.5722723998235257,-2.78701881849966,-2.852495181107088,-2.7564348465433834,-2.5108581590462435,,, +10.203125,20,-2.1502056902377515,-1.7259835110679056,-1.2987544781685447,-0.9287228705862236,-0.666378785493705,-0.5446593736915304,-0.5738477204114847,-0.7400037554092675,-1.0071714260219735,-1.3230181767244535,-1.6270281624945069,-1.8599728504402129,0.5838450929274778,0.4040065014752492,,, +10.2109375,20,-0.028559509662495205,-0.6219338727424668,-1.2406390046097848,-1.7425414065499756,-2.0175732208641795,-2.0176624523888167,-1.769671036139791,-1.3677969836222341,-0.9475251120259592,-0.6482678122258538,-0.5749369848573956,-0.7689811417021516,-1.196827466483996,-1.7588983489984806,,, +10.21875,20,-2.3167329407719217,-2.730782101577193,-2.8985196996165468,-2.78242636159009,-2.4201772511277966,-1.9142426105198929,-1.4037519507437963,-1.026333576346405,-0.8803883867213511,-0.9981376656165076,-1.3368315353554214,-1.7905272516833275,-2.2192087346356257,-2.4872658188087104,,, +10.2265625,20,0.6355777631886529,0.6736157655236918,0.6942375707276053,0.6976364392140209,0.684308472102351,0.655043679123525,0.6109118997356484,0.5532438241032562,0.4836074464016968,0.4037803628810257,0.31571839988604844,0.22152112129298346,0.1233948194562804,0.023613637834705964,,, +10.234375,20,-0.07552049383266564,-0.1717184101302055,-0.2627440361731292,-0.34645378318052256,-0.42083432345888006,-0.4840380832310792,-0.5344158316983887,-0.5705457955700113,-0.5912587891398629,-0.5956589197500075,-0.5831395059643809,-0.5533939295970198,-0.506421231450387,-0.4425263526583712,,, +10.2421875,20,-0.36231501728383375,-0.26668334565406193,-0.15680238018270176,-0.03409779451263961,-0.4884942386763649,-0.6892978389827839,-0.8861144434105348,-1.0609384653389409,-1.1972578620877052,-1.2812132739946365,-1.3025722428845836,-1.2554505573832568,-1.138730406068513,-0.9561461619652679,,, +10.25,20,-0.7160317989877804,-0.4307475364473585,-0.1158256762450135,0.211104820926488,0.5315400446847162,0.8273839525441422,1.0822028576541252,1.2823641236383474,1.4179796777735918,1.483588564066159,1.4785309549750776,1.4069875557009677,1.2776816677522262,1.1032647018718291,,, +10.2578125,20,0.8994280039747041,0.6838029422757527,0.474725968446592,0.28995478081558823,0.1454251268381923,0.054134947485810166,0.02523368559057271,0.06338027274884828,-1.9731836898643096,-1.936182346696971,-1.7414798043048338,-1.405796586020104,-0.9675137745964176,-0.4807515691216558,,, +10.265625,20,-0.0069973922535294655,0.3944127739338655,0.6754775330354614,0.8069476707797616,0.7828231673142143,0.6212294851313619,0.3615369368173472,0.05817209290817962,-0.2279145832007637,-0.4387956382946636,-0.5286408240872923,-0.4709049739849731,-0.2625097671933745,0.07563218427461216,,, +10.2734375,20,0.5018327741349586,0.9600827488821876,1.3887398535560678,1.73009772381149,1.939345273454662,1.9915212417742911,1.8853808103830745,1.6435721410661062,1.3090954152358567,0.9385959550056338,0.5935360935454009,0.3306208373453081,-1.7338529597592398,-1.1124685557103668,,, +10.28125,20,-0.5114631312644394,-0.06599149044782326,0.13263755230893148,0.06175838181836778,-0.22667459695044626,-0.6205664959659731,-0.9786472884528308,-1.1694341181199637,-1.107509996229057,-0.777173820296382,-0.2369778231074925,0.3960932048556553,0.9784669257972812,1.3791268525480445,,, +10.2890625,20,1.5153279120268035,1.375097294371555,1.0203553246062809,0.5698024099076514,0.1662634602090487,-0.06255925789402728,-0.0391675108021532,0.2424326880530563,0.7150502511646293,1.2567084978625302,1.7240822468321473,1.991808258015353,1.9868948465105405,1.7087994581310555,,, +10.296875,20,0.0997748588489219,0.2429589291029773,0.39342897211006395,0.5490260141738612,0.7074951572982758,0.8665248675656918,1.0237872587995391,1.1769786662561683,1.3238598000031292,1.462294774998581,1.5902883345602268,1.7060206155327189,1.807878846515446,1.8944854242050035,,, +10.3046875,20,1.9647218763248016,2.017748291640742,2.0530178769248923,2.070286386058447,2.069616256247475,2.0513753790027325,2.0162305274752645,1.9651355553059524,1.8993145736920576,1.8202404013035505,1.7296086644532949,1.6293080010797445,1.5213868903291834,1.4080176885974711,,, +10.3125,20,1.2914585018090103,1.1740135615959215,1.0579927992256748,0.9456713251823012,0.16841457285688355,0.3353652012985649,0.5547931815042674,0.8134474808299634,1.095186718579317,1.3821027771825531,1.6557679673721653,1.8985187815899884,2.0946867176113244,2.231690344509333,,, +10.3203125,20,2.3009124582780704,2.2983011599663463,2.2246529401214667,2.085558027214084,1.891011808308148,1.6547194152590297,1.393141965470449,1.1243509606797308,0.8667707242160033,0.6378965638421219,0.4530780392539908,0.3244521726423049,0.2601009839773805,0.2634920891219772,,, +10.328125,20,0.3332413593257916,0.4632141816451284,0.6429582474871693,0.8584376773764029,1.093017276338342,1.328628271347391,1.54703422647443,1.73110884515909,0.19296856777651986,0.20340196451892426,0.3609040767948673,0.6407914592842284,0.998577316911198,1.3769228445879242,,, +10.3359375,20,1.7145939261255492,1.9560279927437887,2.0600207882367725,2.006179850133388,1.798139345970695,1.4630353248705323,1.0473228908135828,0.6095865563331498,0.21146335195045285,-0.09190779518480574,-0.2604231226370561,-0.27520811785742405,-0.14150414779268486,0.1122016884012137,,, +10.34375,20,0.4386676641648647,0.7793096838392888,1.0733799055221354,1.2674818205381078,1.32393947983981,1.2267170349228005,0.9839663183375368,0.6268053970155023,0.2045180863779894,-0.22307812231336765,-0.5949072227953864,-0.8581085118072662,0.18788500922357687,-0.10717670290847092,,, +10.3515625,20,-0.1411070730782249,0.08247339272150067,0.4881173692440868,0.9494305520094076,1.3239231750358162,1.4922794211136094,1.3912800680847202,1.0313531319060498,0.4939402515173759,-0.09060154063917823,-0.578508332604777,-0.8517984058686452,-0.8504033524305992,-0.5884370175019802,,, +10.359375,20,-0.1501452996506787,0.3333514055611643,0.7201473015697823,0.8965794137535357,0.8084971579773372,0.4762020576446378,-0.011037884996601743,-0.5193964937337411,-0.9071313954183452,-1.0634175805200172,-0.9387296054521438,-0.5584455511156219,-0.015944057908808956,0.5529141152832515,,, +10.3671875,20,0.8392495239425529,0.7408144627214162,0.6523032899501015,0.5754692643995396,0.5118510098074269,0.4627455333748512,0.4291854805971576,0.41192102471059344,0.4114067078786956,0.4277934645387198,0.4609259665819928,0.5103453368566246,0.575297183476349,0.6547448142518347,,, +10.375,20,0.747387399850035,0.8516827676362589,0.965874427064908,1.0880223533855204,1.2160369906266526,1.3477158784371317,1.4807822614280823,1.612925004935709,1.7418391182456618,1.8652661756883369,1.981033927786932,2.0870944088317622,2.1815598735704578,2.262735933713661,,, +10.3828125,20,2.3291513139899265,2.3795837066624417,2.413081271742244,2.42897940636702,1.8660365396869183,1.940352033212919,1.946746484074868,1.8825839029516065,1.7500918353075958,1.5562129958276003,1.312128184205796,1.0324837340700526,0.734377350504134,0.4361730398682448,,, +10.390625,20,0.1562277534681098,-0.08838147692095655,-0.2830411679569599,-0.416613256985105,-0.4822046735959316,-0.4776409627250918,-0.4056109487772401,-0.2734723694122145,-0.09273204904028463,0.12176312281963655,0.3528679770022166,0.5823409516500501,0.7921222543339516,0.9655991545474976,,, +10.3984375,20,1.0887701596585324,1.1512268790954967,1.1468850952308138,1.0744140485977267,0.9373339901344366,0.7437751865492263,0.5059151734877136,0.2391334886447386,-0.9762336773881004,-0.9348906128966278,-0.743955082040617,-0.4360059184698928,-0.061227630030181626,0.32042552051105383,,, +10.40625,20,0.648583366237417,0.8718746203317606,0.9559361253429012,0.8887690391069344,0.6826076784342432,0.3720099345865384,0.008466705699552428,-0.3476300063214259,-0.6364092642268466,-0.8078659974069666,-0.8296728358603874,-0.6922421229336451,-0.4102495338684341,-0.020381832561655044,,, +10.4140625,20,0.4243406080509624,0.8627824144238722,1.2351730633596985,1.4923716584612858,1.6034738272936009,1.5605761699857927,1.3799564271255818,1.0994858148796325,0.7726768431548763,0.4602939805448559,0.2208341344450261,0.10135995071639536,1.2012785439689957,0.9260476063205534,,, +10.421875,20,0.508779831316722,0.08587379372166465,-0.2037889937154236,-0.25711411624623204,-0.035265558415287335,0.4254668503487188,1.0233843503878075,1.6190195289176377,2.0731267395397452,2.2846127943128693,2.218014421628432,1.9129938745587811,1.4732523135527442,1.0379014923534238,,, +10.4296875,20,0.7431418446421697,0.6847516916976423,0.8916698686091921,1.3179135588996709,1.8550478478029568,2.36179073269602,2.7026408403713384,2.784942063284769,2.5842275275531765,2.1508973892892937,1.5964005887813717,1.062707834627049,0.6834422538104853,0.5473203195526519,,, +10.4375,20,2.426912489650401,2.4068203972844846,2.368949671754088,2.313849327600696,2.24236136510956,2.155606158448228,2.054962974026569,1.9420459601203943,1.8186760280906629,1.6868491174690718,1.5487014004982766,1.4064720352954825,1.2624641197398212,1.1190045296761633,,, +10.4453125,20,0.9784033445683092,0.8429135709562484,0.7146918688482058,0.5957609686260629,0.4879744364288301,0.3929844048626832,0.31221283396018296,0.24682680549074346,0.19771828310582096,0.1654886925976128,0.1504385921531648,0.15256261335646892,0.1715497613999457,0.20678906912511366,,, +10.453125,20,0.2573805057669243,0.32215094926504706,0.3996749423392108,0.4882998687668957,-0.03905718132411981,-0.3102289141705489,-0.5563206045863206,-0.7608947614367708,-0.9102814155870056,-0.9945293755774156,-1.0080985018718558,-0.9502447291864582,-0.8250709912620077,-0.6412404993012177,,, +10.4609375,20,-0.41137236963073626,-0.15116174610798927,0.12171422616196452,0.3888282868100831,0.6322869043163618,0.8359765542949708,0.9866855284077656,1.07502305079276,1.0960716141018232,1.0497270514565171,0.9407026365776722,0.7781969334785741,0.5752485656686546,0.3478229076248517,,, +10.46875,20,0.11369439590545324,-0.1087975899423057,-0.3020325095115014,-0.4503425730462782,-0.5411107257358001,-0.5656561262348584,-0.5198453590147782,-0.40438674508642203,0.1301139859768261,0.31206442601847184,0.6280764192902006,1.0378383833998062,1.4860877819372311,1.9111669537189828,,, +10.4765625,20,2.2545766518566404,2.4700395432934803,2.5306622361490074,2.4330805556206,2.1979426519779874,1.866654912753776,1.4948977246767414,1.1439212282254092,0.8709769689880381,0.7203759211674882,0.7165657795433008,0.8603058855295361,1.1285356605254149,1.4779571164324905,,, +10.484375,20,1.8517735055960802,2.1885345662722098,2.4317106853336976,2.538504746148917,2.4865291430172967,2.277307934176468,1.9360585860795048,1.5077872145550142,1.0503054008427934,0.6252561220975055,0.2885464081724086,0.08167672406991844,1.4367869194463243,1.817084845678136,,, +10.4921875,20,2.0186388439189704,1.957974749275508,1.6219040755349692,1.0713469339863395,0.4248553871304779,-0.17364895184709805,-0.5940829471226811,-0.7556119479823566,-0.6485590995426945,-0.3368114435993914,0.05993445068835108,0.3992192187017592,0.5551005414585146,0.4528985857178242,,, +10.5,21,0.08988234663349459,-0.4637745379539105,-1.0840322802608109,-1.6268015583366524,-1.9672716920962177,-2.033973110589498,-1.8282398483022064,-1.4237390449581808,-0.9461972724721,-0.5388807732239288,-0.3232909181606024,-0.3658473526685511,-0.6596900449863337,-1.1265876064489388,,, +10.5078125,21,0.5861751088947245,0.6912846637466104,0.8014826763504923,0.9145312281732788,1.0281397487243709,1.1400053481280739,1.247853366316562,1.3494774286931777,1.4427783067573223,1.5258009031148334,1.5967687131270094,1.6541151596473793,1.6965112520392407,1.7228890850302316,,, +10.515625,21,1.7324607658086886,1.7247324378109314,1.6995131555120693,1.6569184546873394,1.597368555495733,1.5215812297160487,1.4305594568973985,1.3255740854311973,1.2081418020165673,1.0799987951437091,0.9430705736125128,0.7994384684378057,0.651303404558933,0.5009475765833498,,, +10.5234375,21,0.3506946994962432,0.20286953021405807,0.059757368640009474,-0.07643575277153825,-0.22478721370002064,0.00902527212577997,0.2833874218239988,0.581846654197803,0.8863015106633242,1.1782569362577209,1.4401069100544026,1.656354999689568,1.8146877436535949,1.9068260279580351,,, +10.53125,21,1.9290951050521503,1.8826735229266751,1.7735036229859125,1.6118698651645091,1.4116744021772614,1.1894604365064685,0.9632514815082354,0.7512874854634604,0.5707459692808011,0.4365373733536536,0.36025863398599,0.3493779756184593,0.4067077813454806,0.5302023152107078,,, +10.5390625,21,0.7130944164067917,0.9443616474676982,1.209489404187334,1.4914777863981656,1.7720220299722134,2.0327841968725013,2.25666745574376,2.4290041042771797,0.025317390623138425,0.11613235176600688,0.32734479028740504,0.6129562673058331,0.9149619922823722,1.1724381556281205,,, +10.546875,21,1.3310856620507332,1.3517435069651036,1.21654551426208,0.9317612064717636,0.5268780375402747,0.05006764284952772,-0.43925803218797055,-0.8796415970252933,-1.2170942186043752,-1.4134471956632872,-1.4522405886538636,-1.3412319998953095,-1.111135020713382,-0.8107841028330924,,, +10.5546875,21,-0.4994792044985897,-0.2377028153462473,-0.07765546204436491,-0.05508405546555295,-0.18367605836242773,-0.4528927965064546,-0.8295795546167839,-1.2631018265098803,-1.6932078532523902,-2.0593929301691367,-2.310307035335169,-2.4117405643858536,-2.250243371237892,-2.170735499843429,,, +10.5625,21,-1.826642203649272,-1.3013466806464002,-0.7261663629291297,-0.24454224486593426,0.027081791286882703,0.030969698679244036,-0.2162949722974576,-0.6285729618462128,-1.074001111243289,-1.411358381790331,-1.5289970955846608,-1.3756673589373791,-0.974784482348888,-0.418227026152058,,, +10.5703125,21,0.15863680095803773,0.6138518423661941,0.8375957427170727,0.7821055856737021,0.4746110602387449,0.009731053247818977,-0.4765811325595842,-0.8444019365606634,-0.9882696953315188,-0.8661508987028441,-0.5110011658454068,-0.02175202708787952,0.4638064281287663,0.8068149697418086,,, +10.578125,21,-0.20362149398171026,-0.31986557416325745,-0.4234214436677088,-0.5127606716801822,-0.5865995175942158,-0.6439212209537241,-0.6839936197768878,-0.7063817888765711,-0.7109554769861992,-0.6978912125734792,-0.6676690415710137,-0.6210639542478941,-0.5591321514337111,-0.4831923906714831,,, +10.5859375,21,-0.3948027390187536,-0.2957331396460605,-0.18793427268157992,-0.07350325562851068,0.04535321597088214,0.1663576421432864,0.2872017273598339,0.405586924047144,0.5192648007516065,0.6260765280347911,0.7239907906419409,0.8111394620358119,0.8858504165728469,0.9466769047272774,,, +10.59375,21,0.9924229769429708,1.0221645108933357,1.0352654739104192,1.0313891357814182,2.538574498972733,2.5783858486121547,2.54615657252622,2.444472455911109,2.280603720349197,2.065995772385387,1.8154691477110936,1.5461844464208243,1.2764444419457766,1.0244168998364849,,, +10.6015625,21,0.8068671709178505,0.6379889409187057,0.5284146730753166,0.4844747488361793,0.5077569684392519,0.5949971272697439,0.7383082961068143,0.9257328136575118,1.1420784952009335,1.3699807410813574,1.5911164752747626,1.7874852558752838,1.9426682144879384,2.0429770268002425,,, +10.609375,21,2.0784127843726647,2.043367893150002,1.9370220430742728,1.7634046259064693,1.5311192373428515,1.2527494628302016,0.9439873709919132,0.6225454745011839,-2.3519444032576207,-2.143455740506873,-1.821145249269124,-1.436789789427805,-1.0510159280617426,-0.7238690643104393,,, +10.6171875,21,-0.50547699357207,-0.42826201634777217,-0.5019144833809124,-0.7119105413869349,-1.0218047973660571,-1.3789406384208829,-1.7226886094388298,-1.993929476893676,-2.1443047259246764,-2.1437934477432625,-1.9854352355867264,-1.6864632205212968,-1.2856705082356712,-0.8374199371829878,,, +10.625,21,-0.4032298918042885,-0.04224644119203602,0.19791446985901173,0.28852869065555165,0.224183067733824,0.023564158022837508,-0.2735061052477164,-0.6123257977691635,-0.9318848507492076,-1.1744179744898604,-1.2944504744529484,-1.2659277692243975,0.29753302927261555,-0.26748429978611943,,, +10.6328125,21,-0.8323603578671772,-1.2588303583171907,-1.4478911089903037,-1.366757228332827,-1.0576557769301191,-0.6260507398664681,-0.21152656500772785,0.05068731360988932,0.06700393950985706,-0.18864319898791607,-0.6674262161022574,-1.2587760287854546,-1.8204599668019217,-2.2173425522458707,,, +10.640625,21,-2.3582083675068994,-2.2205569903929825,-1.8565763880376749,-1.3786594803684036,-0.9284350696859364,-0.6378024169864632,-0.5926501579369197,-0.8092043930642334,-1.2294893357541792,-1.737145539637307,-2.189271133224421,-2.4555598653075283,-2.4540097237749503,-2.173415586308117,,, +10.6484375,21,1.0105040355338248,0.9728845976885312,0.919106387152722,0.8500360858030639,0.7668163662381241,0.6708459275283339,0.563755042513849,0.4473770447902862,0.3237162546250885,0.1949129054062076,0.0632056847410085,-0.06910745389485627,-0.19970952278448634,-0.32630507042025075,,, +10.65625,21,-0.44666038038914097,-0.5586425948149711,-0.6602570772950875,-0.7496823611042904,-0.8253020707093689,-0.8857332576329051,-0.9298506544911264,-0.9568064224921752,-0.9660450465945916,-0.9573131174817522,-0.9306638290386348,-0.8864561125452151,-0.8253484227082089,-0.7482872842955693,,, +10.6640625,21,-0.6564907998764622,-0.5514274073993463,-0.4347902595078087,-0.30846767316117124,0.306928017192824,0.015147255353758047,-0.2365257636269784,-0.4346888280977994,-0.5697359768976373,-0.6365200462434579,-0.6347041633677175,-0.568777692553454,-0.44773553826064616,-0.2844431854413078,,, +10.671875,21,-0.09473177184836944,0.10371368697423786,0.2925953751335758,0.4542864946341082,0.573068282328688,0.6362339471136924,0.6349825290193822,0.5650403313822303,0.4269665746039055,0.2261219404204261,-0.027697816466269898,-0.3209376563659421,-0.6372213334538411,-0.958486366058068,,, +10.6796875,21,-1.2662367687011722,-1.5428262039297873,-1.772682090239036,-1.9433853192699968,-2.046530303764345,-2.078305395466721,-2.039753211096224,-1.9366927249388617,-1.0863179038662862,-0.7770478359008914,-0.3802053184721458,0.04798012764037024,0.4458619722982901,0.7559484133132647,,, +10.6875,21,0.9338304028573448,0.9550755163937814,0.8190140295106216,0.5488276036506521,0.18792684993560008,-0.20681795327317906,-0.5739385962471496,-0.8569428445991407,-1.0131093308909884,-1.02013360191151,-0.8795902071103381,-0.6166716527221441,-0.27624496424296924,0.08415982826045487,,, +10.6953125,21,0.4033370789792605,0.6259688147362876,0.7112742309510413,0.6393980140298069,0.4145422824845185,0.06435412236982707,-0.3643361106152869,-0.8127621757037852,-1.2193264469996707,-1.5291437124634832,-1.7025380416441862,-1.7211695646772969,-0.5356792752191742,-0.163910270264624,,, +10.703125,21,-0.0456575734410386,-0.18766629236457344,-0.5234750171658047,-0.9318113664510708,-1.27002452598272,-1.4133902134948502,-1.2895139258888424,-0.8984016341226981,-0.3126951266582461,0.3419945914999328,0.9212679606395906,1.3012658665270302,1.4123702609449915,1.258042244071247,,, +10.7109375,21,0.913636795412702,0.5055210896612901,0.17622146085739465,0.04515311873379069,0.17569725072150078,0.5576503930994393,1.1098577393943716,1.7023100906697135,2.1916495872055464,2.4603542400993303,2.4488628463427924,2.171836505586051,1.7141004374328537,1.2073786127574002,,, +10.71875,21,-0.17451016692505572,-0.035094663048644975,0.1075135189118698,0.2510002115047761,0.3930427993832389,0.5313507625692221,0.6637056531421621,0.7879998054372991,0.9022731020243124,1.0047471517720021,1.0938562816320396,1.1682747995618528,1.2269400513029711,1.2690708673860631,,, +10.7265625,21,1.2941810774479652,1.3020878553241442,1.292914748891635,1.2670893417117872,1.2253355875190055,1.1686609518848048,1.098338586311209,1.0158848469931956,0.9230325520083852,0.8217004453072193,0.7139594023073261,0.6019959689414885,0.4880738727077923,0.37449417978312816,,, +10.734375,21,0.26355479596143844,0.15751002068234493,0.058530862474272076,-0.03133318918627581,-1.7793085720838204,-1.5814362121371608,-1.3595928112001114,-1.1318214310639672,-0.9164291325630782,-0.730706996974251,-0.5897213295280186,-0.5052603445737743,-0.485009788919092,-0.5320149945006737,,, +10.7421875,21,-0.6444668770979329,-0.8158268072120473,-1.035281647771594,-1.2884972289292818,-1.5586177184063563,-1.8274411979486795,-2.0766894682075643,-2.2892835326815937,-2.4505358145300944,-2.549175965710892,-2.5781387312448265,-2.5350589232469867,-2.422438982752236,-2.2474774380809954,,, +10.75,21,-2.021570214496664,-1.7595195622812387,-1.4785057583326815,-1.1968932782492914,-0.9329546780708152,-0.7036011625812805,-0.5232083501518043,-0.4026191051587039,-1.5908371652286508,-1.340520838853375,-1.0178131635643533,-0.681451746078922,-0.3921160459181488,-0.2029223106539677,,, +10.7578125,21,-0.15109737374818422,-0.2521284481883265,-0.4973003941072549,-0.8550043145704207,-1.2756139209829749,-1.6991704007913326,-2.0646790699464423,-2.3195700361985208,-2.427849540101934,-2.3756725597212567,-2.1734689009861867,-1.8542917916656283,-1.4686463442470161,-1.07660351356444,,, +10.765625,21,-0.7384279543793779,-0.5051796323444362,-0.4107531096140568,-0.4665944803857303,-0.6599188527107716,-0.9557060233476572,-1.3021634978649137,-1.6388059298594395,-1.90589251121438,-2.053752316651238,-2.050545037317088,-1.8872482147577456,0.6461322877339818,0.946376217364304,,, +10.7734375,21,1.400955283509489,1.8766761370098568,2.2324176704232896,2.3579580749284963,2.204349582176815,1.7975144916858263,1.2313344937154764,0.6421254530989151,0.17149140634091584,-0.07226364843907818,-0.043592386292556684,0.2280418332345967,0.6464698798870903,1.0754024050704176,,, +10.78125,21,1.3760075880416878,1.4451800366562324,1.2440104341083005,0.8086512788191518,0.2405988597697325,-0.3209468883639324,-0.7370709642349853,-0.9070702901469592,-0.7959258148047126,-0.4437916324872604,0.045098560334920684,0.5310664481092974,0.8773169098853097,0.9874537419284444,,, +10.7890625,21,-0.11019026609881732,-0.1763394653765683,-0.22830085131126376,-0.2648415896099573,-0.2849977562623677,-0.2880914390353827,-0.27374283201922045,-0.2418771113155556,-0.19272597134367367,-0.1268237947293115,-0.04499852270843109,0.051642614230966166,0.1617322557460933,0.28366662573228896,,, +10.796875,21,0.41563338601373984,0.5556431420482694,0.7015640491223148,0.8511589132132741,1.0021241370244232,1.1521298293822386,1.2988603758146904,1.4400547600609022,1.573545930611922,1.6972985231145217,1.809444278250539,1.908314535056668,1.9924692308628,2.060721900187024,,, +10.8046875,21,2.1121602349902258,2.146161846407148,2.162404952093712,2.160873802181769,-0.3483929609491517,-0.3623544602353216,-0.4414718948305039,-0.5780748863575487,-0.7603956206593736,-0.973395978817234,-1.199822870839303,-1.4214181644202275,-1.6201988204816842,-1.7797179511771186,,, +10.8125,21,-1.8862188461492533,-1.9296014763125555,-1.9041340607950348,-1.8088600601329008,-1.6476721976161115,-1.4290483298398269,-1.1654675678421709,-0.8725473474019875,-0.5679616062446132,-0.2702154901430367,0.0026379852369047274,0.2342498421032083,0.4111083347522635,0.5234744250847047,,, +10.8203125,21,0.56605432149917,0.538362198302741,0.4447478170863813,0.294087138543076,0.09915751349622297,-0.12425896328775275,-0.3584813973679393,-0.5851682033905832,-1.5790940546379302,-1.1632318777136998,-0.6929801247256443,-0.22956300995779594,0.16738131846417534,0.4490429240414277,,, +10.828125,21,0.5849932505884823,0.5678731111844524,0.41448557260037816,0.16312377688848145,-0.13244982115707915,-0.4114347551121434,-0.6155208811559679,-0.6980293670002251,-0.6312422853158717,-0.4107788945734137,-0.0563366844163975,0.3913185284966324,0.8766449348472583,1.3379197173362432,,, +10.8359375,21,1.716798249690719,1.9673488849057523,2.063156378321421,2.001387801067378,1.8031878958488727,1.5103425228413314,1.1787300939979568,0.869581166647096,0.6399077417803465,0.5335931182019821,0.5745302506664439,0.7628774761282846,-0.032509590721848905,-0.4929847261262679,,, +10.84375,21,-0.79060521229426,-0.8333790079005488,-0.597488294521177,-0.133958582482329,0.44516790955944696,0.9973666367739776,1.3885059537278257,1.529410417219834,1.4000931395316059,1.055017801704043,0.6079502122774973,0.2005532460008248,-0.03666551473238922,-0.0203482014604024,,, +10.8515625,21,0.26264399812770434,0.7514113203762469,1.3274946299597552,1.8471389168998151,2.1805005731460807,2.2470547551476163,2.037500465179612,1.6161614221984768,1.1032261647735044,0.6416961296952794,0.3581013623669046,0.3277514374505808,0.5540460117311052,0.9675159095868944,,, +10.859375,21,2.1418587489569463,2.105950959162526,2.05403186163756,1.9872575151822032,1.907038170483616,1.8150133840927591,1.7130231203168231,1.6030753471460908,1.4873106937230518,1.3679647883039008,1.24732893628729,1.1277098269361832,1.011388974432048,0.9005826035504886,,, +10.8671875,21,0.7974026824517647,0.7038197850042206,0.6216284330087847,0.552415525275707,0.4975324064503298,0.4580710647454679,0.4348448754466507,0.4283742274500136,0.4388772845936664,0.4662660436285254,0.5101477579281908,0.5698317020812957,0.6443411589885617,0.7324304196384268,,, +10.875,21,0.8326064979583253,0.9431551805801932,1.0621709554444347,1.1875902952530677,-0.7866010290600702,-0.9469249508262041,-1.0532584477220333,-1.0965957412303569,-1.0724385687225078,-0.9811133261578922,-0.8277514566677402,-0.6219344453122647,-0.3770281691438892,-0.10925301471086593,,, +10.8828125,21,0.16344539828674912,0.42264614333056016,0.6507364054226775,0.8321388971260872,0.9543976824142956,1.0090466912656482,0.992200360795038,0.9048252148733684,0.7526734425409245,0.5458831045915951,0.2982728439714921,0.026380278038286558,-0.2516888761886077,-0.5175206952500202,,, +10.890625,21,-0.7536741109910025,-0.9448938154649816,-1.0791704371953341,-1.148574067953176,-1.149803024909405,-1.0844095912459455,-0.9586870042849626,-0.7832255831183681,1.0750149063480858,1.467208366883471,1.882410272233504,2.2591382118501784,2.5410483863679016,2.6857127857201952,,, +10.8984375,21,2.6712330011315535,2.4996604976170835,2.1966905634343523,1.8076775268698653,1.3905917926645592,1.0070155585073872,0.7125795390068224,0.5483300723373471,0.5343710553378844,0.6667708198071516,0.9182155154108854,1.2423070120095274,1.5808356677906936,1.8728949464710083,,, +10.90625,21,2.064417978282549,2.116650430020745,2.012239716753258,1.7579918484614008,1.3838662330544729,0.9383647115646899,0.4810327164125037,0.07324024494930992,-0.2313217309068833,-0.3949494735077753,-0.40174554451850775,-0.26004265590071085,2.037155282339032,1.9574127263257064,,, +10.9140625,21,1.6056547838796469,1.05634587487948,0.4359963719237762,-0.11136485287642794,-0.4635012481994937,-0.5532902658190096,-0.3869249952120008,-0.04200893012653712,0.3539321416829147,0.6586299497779408,0.7543015052016505,0.5801715772657025,0.14937431029107873,-0.4544004143808094,,, +10.921875,21,-1.0995989193831854,-1.6426169661682295,-1.9669210927648595,-2.014758163223722,-1.802764518389445,-1.4171986672940502,-0.9901059301745642,-0.6629493028672281,-0.5476758080882664,-0.6958903040486978,-1.0845865458605892,-1.6223472734191926,-2.174314967921299,-2.5990902484077205,,, +10.9296875,21,1.3172277130317558,1.4488139585166957,1.5800356866013492,1.7085759032875358,1.8321544809800665,1.9485680337390687,2.0557284543083982,2.151699438174682,2.2347303551443227,2.3032868753782254,2.3560778136428286,2.3920777217532287,2.4105448336332937,2.4110340487842103,,, +10.9375,21,2.393404726832032,2.3578231566755763,2.3047596570025197,2.23498035894093,2.149533814728005,2.049732666867901,1.9371306987393888,1.8134956684833183,1.6807784018250227,1.5410786849984883,1.396608554956546,1.2496536296274643,1.1025331552946804,0.9575594706283732,,, +10.9453125,21,0.8169975971209159,0.6830256634496846,0.5576968566935201,0.4429035665902453,-0.5721689602798727,-0.34222229528886344,-0.11148164352319397,0.10183387416984396,0.28065867723473376,0.4102770702422226,0.4793558869247209,0.4807414085380047,0.4119649692021754,0.2754219747542854,,, +10.953125,21,0.07821183526487774,-0.16835004329688236,-0.4495141946225757,-0.7481184448974291,-1.04577747776987,-1.3241576764331922,-1.5662483611968767,-1.7575407923018682,-1.887032739504633,-1.947988583686417,-1.9384019631469651,-1.8611287196035369,-1.7236808897714748,-1.5376961245476122,,, +10.9609375,21,-1.3181195510093426,-1.082155144418365,-0.8480597498837843,-0.633863865484617,-0.4561084054225307,-0.3286855469669451,-0.2618645064012983,-0.26157019297792394,-0.0010550523121425348,0.3260322558801398,0.661771275774135,0.9457550589163476,1.1260685884785229,1.1674142820637743,,, +10.96875,21,1.0566463156642911,0.8048515795714466,0.4456529738197199,0.029999158675376638,-0.381747852965909,-0.7291949801294071,-0.9613089935115996,-1.0443534636499447,-0.9671355740402856,-0.7427456176792158,-0.4065182576251919,-0.010533091305989345,0.3844889409989916,0.7186311729526004,,, +10.9765625,21,0.9420977167634914,1.0229498483101716,0.9520573972270754,0.7444940632865191,0.4371594762113356,0.08299853847189155,-0.25728140129938865,-0.5247052545498881,-0.6712577173025858,-0.6674061525815232,-0.5067468646607651,-0.2070508344300284,-2.3413676807271857,-1.8300973198715231,,, +10.984375,21,-1.295058085294334,-0.8768436012951246,-0.6815787853393213,-0.7519488400475266,-1.0556343242254826,-1.4943206263941828,-1.9308111761169509,-2.226811888639616,-2.2810295396271383,-2.057140609918145,-1.593963239326109,-0.9950424390269732,-0.4005008555826425,0.05113218548191134,,, +10.9921875,21,0.2606540012657327,0.1951448310526921,-0.10323868411155013,-0.5290407357684229,-0.94262444886734,-1.208648463424584,-1.2333548239202077,-0.9904468968527694,-0.5284632929042333,0.042374699619665085,0.5802388143840147,0.9504509940462056,1.0623009057408908,0.8938340442604245,,, +11.0,22,0.34034435061326873,0.25149429825974456,0.17757931341018152,0.11955476501772574,0.07808887989124225,0.053551168297775176,0.04600608498598635,0.055212036554602384,0.08062575247513204,0.1214119431556997,0.1764580758578087,0.2443940096570065,0.32361614555953955,0.4123156688212827,,, +11.0078125,22,0.5085103888566576,0.6100796191366546,0.7148014862314279,0.8203920146278356,0.9245453028490016,1.0249740872916098,1.1194499834139888,1.205842699542433,1.28215753656353,1.3465705167738098,1.3974605266704279,1.4334379107565234,1.4533690155658692,1.4563962540305244,,, +11.015625,22,1.4419533387457175,1.4097754172790429,1.359903931935727,1.292686118762116,-0.3289650553556649,-0.4603632918596913,-0.6474834185115633,-0.8780215933970066,-1.1365057279214144,-1.4053708346808198,-1.6661806334287197,-1.9009102368793327,-2.09320047804635,-2.229496417588116,,, +11.0234375,22,-2.2999906453679886,-2.2993056019559384,-2.2268673439857887,-2.086944693063421,-1.8883510409827624,-1.643829607223415,-1.3691650177659964,-1.0820831579034969,-0.8010160152320334,-0.5438176428429027,-0.32652078043978183,-0.1622208351013147,-0.06016504138051273,-0.02511031183707879,,, +11.03125,22,-0.056994551659938164,-0.15094435140960796,-0.2976185144278364,-0.4838634558942253,-0.6936347619747412,-0.9091206365965804,-1.1119888844420294,-1.284670463485713,0.19245422214086372,0.6371424067941112,1.0654454270343905,1.4183888674410023,1.6487239058200638,1.7282324504476356,,, +11.0390625,22,1.652068175480589,1.4394576061395328,1.1306523452032478,0.7806074338739935,0.4503707573931586,0.1975249166962204,0.0671705633932449,0.08485585080149928,0.2525535257864309,0.5483124885810307,0.9296383173175122,1.3400764342149714,1.7179727470811208,2.006047430505439,,, +11.046875,22,2.1602908433927217,2.156796142490884,1.9954645034764145,1.7000059497578195,1.3142357479681426,0.895243293837411,0.5044975176103526,0.1982742152258128,0.0188963040685578,-0.011848636245297084,0.10391167777614928,0.3404831646384603,-0.4956232786313288,-0.8182640811929236,,, +11.0546875,22,-0.8941465591415855,-0.7064038958438797,-0.3123736055839373,0.17221652778632004,0.6050847755549766,0.8565275163023836,0.8451207701764251,0.5602050147756215,0.06498924451298105,-0.5205782093880931,-1.0524793695996142,-1.4018849926907544,-1.4902441316521546,-1.3105899796662095,,, +11.0625,22,-0.9292248357245464,-0.4673245450200994,-0.06750623485559781,0.14547574515443096,0.0991315279892181,-0.20669542260506524,-0.6995945373683037,-1.2542553612943177,-1.7266473091604937,-1.993345916969572,-1.9852289037599968,-1.7063082650876502,-1.2325382157293039,-0.6909266360617965,,, +11.0703125,22,1.208769154436893,1.1090890534117332,0.9948545095869852,0.8675259653238732,0.7287902741679175,0.580531400805436,0.42479767116534495,0.26376614598585923,0.09970474152574886,-0.06506723944305287,-0.2282194754001616,-0.3874511858938847,-0.5405311733435166,-0.6853366458375012,,, +11.078125,22,-0.8198901412723075,-0.942393906433352,-1.0512611291760767,-1.1451434769688509,-1.2229544597387658,-1.283888208071252,-1.3274333380971952,-1.3533816604285955,-1.3618315807862618,-1.3531861329097268,-1.3281456783289278,-1.2876954009578427,-1.2330878156128413,-1.1658205968659603,,, +11.0859375,22,-1.0876101165772782,-1.0003611535994028,-0.9061333061620512,-0.8071046951853299,-1.4115900896669125,-1.4802580678729034,-1.4821471999486198,-1.4132936071522524,-1.2745795562490856,-1.0716785528387651,-0.8146665162076528,-0.5173261347628585,-0.1961928961798869,0.13059070011627613,,, +11.09375,22,0.4445328648124584,0.7280744863351722,0.9658059651938136,1.145534078172892,1.2591244935659054,1.303061203369683,1.278683878728243,1.1920866144228457,1.0536851406395331,0.8774826990688251,0.6800857934191534,0.4795384663889454,0.2940564097391912,0.140749198872969,,, +11.1015625,22,0.034419771257933274,-0.013475118706711696,0.004369038554040028,0.09058815447657742,0.24295891989535645,0.4545472212032469,0.7141852602326021,1.007244120938582,0.6526287723978629,0.9826395733467422,1.2693520805903078,1.4577071549388738,1.5073614966461455,1.399010263919389,,, +11.109375,22,1.1374358475496218,0.7508077337815502,0.2863422857036552,-0.19700177816345932,-0.6376547358907665,-0.9809720451033628,-1.187690312326117,-1.2399862614435346,-1.1441952664023456,-0.9297663092082676,-0.6446164248068283,-0.34760849580312714,-0.09932431431619536,0.04742965116195808,,, +11.1171875,22,0.05590471554090004,-0.0888096611386211,-0.3774082146645215,-0.7777655295112501,-1.239887891626462,-1.7036503229302364,-2.1081139618932854,-2.40097279533585,-2.546658586272682,-2.531841821297042,-2.3674720692613187,-2.087040131501488,0.057270011146541074,-0.18169567639476625,,, +11.125,22,-0.5904178429661763,-1.0396696477899896,-1.3868830166531123,-1.515326340195844,-1.366221364374052,-0.9549959432814042,-0.3672170311158842,0.2646828394967014,0.7975085700481049,1.1163419375472703,1.1658197393951408,0.9650801618180506,0.6022830310567144,0.2102078631249681,,, +11.1328125,22,-0.07038031272923727,-0.12955486334885635,0.08140145213450732,0.5364043478152859,1.1414820768941625,1.7603028553772715,2.2513213718766547,2.506365583994869,2.4800901594812736,2.202225979073032,1.7692700653719116,1.3178949140656864,0.9873662035216692,0.8812701573544348,,, +11.140625,22,-0.7055335942061761,-0.6037186578976911,-0.5039584457114814,-0.4085109495011387,-0.3195538339223989,-0.2391460859231259,-0.16919174495405132,-0.11140634910840684,-0.06728668482939004,-0.03808436998528342,-0.02478373298655445,-0.028084375390222568,-0.048388723433654864,-0.08579478657623517,,, +11.1484375,22,-0.14009424995505335,-0.21077593425980634,-0.2970345625482943,-0.3977846805957673,-0.5116794871332454,-0.6371342443546026,-0.7723538588675793,-0.9153641502432476,-1.064046259737631,-1.2161735967814755,-1.3694506763896843,-1.5215531675285767,-1.6701684512804906,-1.8130359787042243,,, +11.15625,22,-1.9479867218062141,-2.072981026906388,-2.1861442076544453,-2.285799254534292,1.3166479230170942,1.6240588554517312,1.911150466404718,2.160880430904999,2.3586740535713453,2.4934359876986947,2.5583196303978504,2.5512005507936664,2.474820946303499,2.3365950615340743,,, +11.1640625,22,2.1480891457486573,1.9242122195391518,1.6821740867655597,1.4402832577428293,1.2166686123596435,1.0280139488597175,0.8883936646226576,0.8082907622229671,0.7938656590748563,0.8465267888252528,0.9628329369221784,1.1347341190838982,1.3501342028951968,1.59373603577526,,, +11.171875,22,1.8481101416822905,2.0949124579558682,2.3161661898849646,2.4955183886572083,2.619383620228791,2.677894965402753,2.665596026090875,2.5818256724973367,-1.7413328224023912,-1.3904974922337592,-1.0946524071332275,-0.9045055719938526,-0.8534432469396757,-0.952320475089765,,, +11.1796875,22,-1.1877650660077002,-1.5242592190041149,-1.9096745620305688,-2.283398473139731,-2.5857859245709967,-2.767464611652392,-2.7970439599235686,-2.66602718829454,-2.3901612253626023,-2.0070140803512087,-1.5701568458943629,-1.140856339148148,-0.7785721026008489,-0.5317376979287749,,, +11.1875,22,-0.4302619319043904,-0.4809177518169807,-0.6663367663099978,-0.9477657418342929,-1.2711554682105164,-1.5756333449240532,-1.8030397563646705,-1.9070426085556773,-1.860410100090332,-1.6593086628035831,-1.323956352796404,-0.8955296313753668,1.938530369057852,2.440794839683812,,, +11.1953125,22,2.7936365813031454,2.8970405973761086,2.716689347372085,2.2934429710715105,1.732236859195121,1.173438505165746,0.7545127725242236,0.5725007101912046,0.6575939157113472,0.9650453401413184,1.3876318247631882,1.7852509276006647,2.0235385007269846,2.010921077736996,,, +11.203125,22,1.7239460364191452,1.2139451649341764,0.5932031866629018,0.004419867466236904,-0.4181669303396319,-0.5853443660354475,-0.4771551277460657,-0.14815647313640934,0.2877316324779485,0.6886348082289939,0.9237792320429516,0.9094879625361268,0.6322517121695634,0.15254984653698914,,, +11.2109375,22,-2.370496088171872,-2.4390368442859645,-2.4904967475978337,-2.524240209251669,-2.539931865932619,-2.5375423674335167,-2.5173488113754776,-2.479929817510315,-2.426155327892552,-2.357171311552042,-2.2743796415216284,-2.1794134965977685,-2.0741087185735507,-1.9604716265015365,,, +11.21875,22,-1.8406438515706536,-1.7168648083577451,-1.59143245958711,-1.466663061415726,-1.3448505941099334,-1.228226588476899,-1.1189210514935417,-1.0189251753132431,-0.9300564826086308,-0.8539270185442491,-0.7919151463179497,-0.7451414401169465,-0.7144490975774459,-0.7003892147029999,,, +11.2265625,22,-0.703211181049969,-0.722858363329181,-0.7589691529711204,-0.8108833592753178,2.4307686914222253,2.2211687930077755,1.9657239774288693,1.6802064124806866,1.3823681831536736,1.0907092055810494,0.8231932089214147,0.5960013096529715,0.4224100808619855,0.3118723372451443,,, +11.234375,22,0.2693647201653143,0.2950475619204761,0.384260731862209,0.5278557376334876,0.7128409064297131,0.9232946389096356,1.1414830346794065,1.3491039366628832,1.5285706259951548,1.6642456340940917,1.7435386170241371,1.7577917166961914,1.7028906527242968,1.5795589145555518,,, +11.2421875,22,1.3933145220696588,1.1540923532088143,0.8755583585044242,0.5741634683421695,0.26800315117390744,-0.02443786620963606,-0.2855681968153918,-0.4999102850709585,-0.4298050323634221,0.011474224971087963,0.3701622608097193,0.6007158221306146,0.6772384750009545,0.5974667853505148,,, +11.25,22,0.383077862036008,0.07627059079830023,-0.2668467335872624,-0.5850322640922303,-0.8214828752116977,-0.9327117523956384,-0.8953484141385677,-0.7098018941670843,-0.40021640959384863,-0.0107263254057908,0.4014063500934893,0.7747031215173216,1.053040887819664,1.1943936900442305,,, +11.2578125,22,1.177382743177545,1.0046145202252208,0.7022869135962089,0.3161247449629716,-0.0957224020944738,-0.4717139378006167,-0.7564766854424119,-0.9093993386775204,-0.9109244911879096,-0.7655584050035776,-0.5011299291296266,-0.16441420950461694,-1.2343841145116363,-1.2837327951908166,,, +11.265625,22,-1.056389427395871,-0.6173030273288413,-0.08729513161456727,0.38999983629676016,0.6874253855296711,0.729057295554779,0.5108973083777357,0.1018357932154862,-0.3753791453624067,-0.7779488527908631,-0.9823404570941632,-0.918335180801908,-0.5884751571202333,-0.06757701064397084,,, +11.2734375,22,0.5175565137615805,1.0226685290401658,1.32536154095081,1.3584200290099429,1.1280115033399671,0.7117798036638038,0.2373553001463081,-0.15282626357886353,-0.3407522323334613,-0.26535560436486305,0.060583504351885635,0.5537912961213219,1.0831910229227435,1.505713478044603,,, +11.28125,22,-0.8776538361614891,-0.958063138894474,-1.050644919082028,-1.1537096832678817,-1.2653744640402418,-1.3835958840606626,-1.5062060340038828,-1.630950536132825,-1.755528126947702,-1.8776310657585893,-1.9949856615583128,-2.105392208498207,-2.20676363062993,-2.297162159162029,,, +11.2890625,22,-2.3748333999401887,-2.4382371945464043,-2.4860747345547107,-2.5173114540904606,-2.5311952997514657,-2.527270057896551,-2.5053835058448044,-2.4656902441618405,-2.4086491603407523,-2.3350155681870333,-2.2458281604424752,-2.1423910030008115,-2.026250885889475,-1.8991704274876413,,, +11.296875,22,-1.7630974028166695,-1.6201308328459323,-1.472484428474536,-1.3224480291683611,-0.6551736974309907,-0.7431063817799506,-0.7600645478777571,-0.7072614419884509,-0.5906776799947386,-0.42063940329408267,-0.21109368492469271,0.0213682755945852,0.2586720433911183,0.4825239638328809,,, +11.3046875,22,0.6756901506007819,0.8232012509089721,0.9133989691078644,0.9387513653450272,0.8963800708124452,0.7882626508614855,0.6210960010523112,0.4058302992619691,0.15690601097510376,-0.10875284725939316,-0.3729189834979453,-0.6173333402240535,-0.8249791704925182,-0.981269832762174,,, +11.3125,22,-1.0750674726599834,-1.0994615518838329,-1.0522529302785937,-0.9361097390446944,-0.7583841693032591,-0.5306029449308143,-0.267667002859739,0.013183818793100474,0.1861969521244733,0.4898362203349448,0.6926893001829607,0.7564265767602956,0.6642242783481332,0.42343705861407777,,, +11.3203125,22,0.0645054467270662,-0.3637319507922481,-0.8015916365357056,-1.1877876389247026,-1.4689238943125833,-1.607758394353739,-1.5889521992484572,-1.4214081580459434,-1.1368353420244988,-0.7847630545301655,-0.4247812687544193,-0.11721633293508027,0.08630551389482177,0.15093681136282466,,, +11.328125,22,0.0640712290940828,-0.16266138285830067,-0.495178160662024,-0.8822270322490683,-1.2633483226293143,-1.578274219710829,-1.7763021876267364,-1.824182452487887,-1.711291106153907,-1.4512831322359614,-1.0799679082737417,-0.6497380862388311,1.2823089725822396,0.7637825424319407,,, +11.3359375,22,0.20237301189989504,-0.25970739721242264,-0.5097512903144432,-0.4953872280302397,-0.2388529262395591,0.16920067228647848,0.5946754861161996,0.8969190497767182,0.9674315219508706,0.7597771350650233,0.30250071845718296,-0.30849241364706304,-0.9360065675968532,-1.4389326462905738,,, +11.34375,22,-1.7106900895910693,-1.7082000706711438,-1.4634513915630216,-1.0744913735998154,-0.6783130436202927,-0.4130715926557417,-0.3799875838449653,-0.6153801932378864,-1.0804973640984643,-1.6719320718075648,-2.2497717597662445,-2.675767758193879,-2.8510651865975087,-2.7431541497862404,,, +11.3515625,22,-1.1723477113362275,-1.0245052648314887,-0.8811977470166372,-0.7446178224764275,-0.6168355827066747,-0.4997625141837467,-0.3951182456107344,-0.304400656461981,-0.22885987009723896,-0.16947658669542576,-0.12694513526440646,-0.10166154135606607,-0.09371681928650266,-0.10289560618270843,,, +11.359375,22,-0.12868016163908844,-0.17025966281771954,-0.2265446320993197,-0.2961862445249107,-0.377600176820784,-0.4689945802743021,-0.5684016875265566,-0.6737124997076971,-0.7827139464149343,-0.8931278677272374,-1.0026511355463583,-1.1089962116132457,-1.2099314318897234,-1.3033203118004528,,, +11.3671875,22,-1.3871591839666837,-1.459612509262627,-1.5190452427728238,-1.5640516877871662,0.2935688983805357,0.5552442154751792,0.7813699371680056,0.9576798242697236,1.0734709227956387,1.122344538787711,1.102646838874629,1.0175783655609651,0.8749648443509457,0.6867052794814378,,, +11.375,22,0.4679358391470244,0.2359678504139177,0.009073976410727769,-0.1947927645475533,-0.35925779481133063,-0.4706737919313752,-0.5190793946952792,-0.4989009302027807,-0.4093482113259157,-0.2544767872570645,-0.04291228907559018,0.2127439245619181,0.4967863925280162,0.7914936830078398,,, +11.3828125,22,1.0783571700322203,1.339364785100706,1.5582502404427332,1.7216206280386417,1.8198837794917009,1.8479107348627373,1.805387139942182,1.6968290830668398,-0.22141956194064372,0.14518809803564958,0.4006074558473535,0.5133674413799988,0.4748792727597847,0.3007447303490245,,, +11.390625,22,0.028293154777713325,-0.2892690461895207,-0.5911849602479644,-0.8186527036114823,-0.9240291792884856,-0.8782983039749004,-0.6756402519522591,-0.33438978427442023,0.10576586017189801,0.5899133364514211,1.0564098894442508,1.4464272511098857,1.713056514428423,1.828556143085476,,, +11.3984375,22,1.7886144944711295,1.6129632394196107,1.3422464282508726,1.031633153031469,0.7421689540872053,0.5312133158384946,0.4434529365717241,0.503890768608568,0.7139030790093833,1.0509789095789168,1.4721827495644353,1.920801310963936,-1.4340109163568835,-1.0979925952357863,,, +11.40625,22,-0.9978744810584356,-1.1606086669680378,-1.5383367291174173,-2.02153833848008,-2.4691021239802007,-2.747076762764808,-2.7654810833862533,-2.5030837401381225,-2.013360010692905,-1.4099918791277914,-0.8358839739064797,-0.4241855888835823,-0.26199977172322864,-0.36672389892745816,,, +11.4140625,22,-0.6815041415602712,-1.091047596019254,-1.453456361886401,-1.6393566659045828,-1.5675967494718623,-1.2277276273397466,-0.6831032549286078,-0.0537483113102214,0.5163130549208951,0.8983153160420051,1.0138389484032326,0.856112524561798,0.4916929421786368,0.04206484298792632,,, +11.421875,22,-1.5934803324760085,-1.6064542342245829,-1.6023865945691318,-1.5809912518929274,-1.542287908026866,-1.4866019971134268,-1.4145591989049071,-1.3270746924462182,-1.225337338186636,-1.1107890653730643,-0.985099825529956,-0.8501385504727308,-0.7079406232653719,-0.5606724315860525,,, +11.4296875,22,-0.41059362406321503,-0.2600177303571351,-0.11127183442119276,0.033343993041729365,0.17159679270133166,0.3013596432799842,0.4206487352914915,0.5276579427742614,0.6207902877633844,0.6986857466568079,0.7602449116736271,0.8046480931848249,0.8313695285190523,0.8401864485309731,,, +11.4375,22,0.8311828432576627,0.8047478608037413,0.7615688675654657,0.7026192913803099,1.531262281883949,1.32158700569941,1.0836730332388629,0.8352477706181436,0.5946550774013702,0.3795713639726291,0.20576850247609213,0.08600982849859118,0.029156229169947312,0.03954466271134971,,, +11.4453125,22,0.11668245624194352,0.2552787077316031,0.4456106099026565,0.6741991579698399,0.9247471280120704,1.1792739230370597,1.419368154788322,1.6274706184493517,1.7880981972095158,1.8889233519617068,1.921633921106624,1.8825132742684487,1.7727003635148666,1.5981115366085583,,, +11.453125,22,1.36902956239965,1.0993885239996102,0.8058044426688264,0.5064192255556186,0.2196385471330464,-0.03714833024094821,-0.24877753256498256,-0.4033640491249408,2.3351393409847634,2.6580946666668006,2.8460212805027703,2.875500149730496,2.7469632966751814,2.4846067981008875,,, +11.4609375,22,2.1326063522828385,1.7482249369253722,1.392886133700257,1.1226035324863215,0.9792569013142508,0.984073898683265,1.1343325589881783,1.403798108456443,1.7468260066482837,2.1054920542782325,2.4186389067197243,2.631429822940039,2.703921456402252,2.6173202659453616,,, +11.46875,22,2.376947896040269,2.011453455085794,1.568395170762373,1.1068793761573952,0.6884031038442432,0.36732635108283584,0.18245774974918705,0.1510639470772014,0.2662354900772929,0.4980192073300887,0.7981404254647744,1.1075792189010774,-0.5118070222418791,-0.20837779755097274,,, +11.4765625,22,0.2796678454929739,0.8275761906303031,1.2919024595365238,1.5498309820782823,1.5328637504659883,1.245643987295233,0.7647552009865322,0.2178241221836023,-0.2513461610739958,-0.522058030373966,-0.5296514500293632,-0.2830621156383885,0.1378049243319666,0.6041646322642225,,, +11.484375,22,0.9738484536408936,1.1304774371285853,1.0155738031853163,0.6448080600987545,0.10392669497070828,-0.4745256103200706,-0.9473116459067208,-1.1995418756956715,-1.1759515206307771,-0.8958444506623113,-0.4476101740379973,0.03568148077826544,0.4129174703780835,0.5737676708105118,,, +11.4921875,22,0.6291414605387718,0.5426247392097119,0.4447793421941524,0.337506287566966,0.2228640133928163,0.10303224311308228,-0.01972626763477672,-0.14310543289902686,-0.26479629177872616,-0.38252750885595455,-0.4941052104930925,-0.5974514594328829,-0.6906406939733368,-0.7719334936447885,,, +11.5,23,-0.8398070801244817,-0.892982019294533,-0.9304446568744926,-0.9514648947606392,-0.9556089967981132,-0.9427471997448632,-0.9130559961527368,-0.8670150491879282,-0.8053987934113854,-0.7292628685903906,-0.6399256240895482,-0.5389450177087296,-0.42809131347607854,-0.30931605647573723,,, +11.5078125,23,-0.18471786797347567,-0.05650565978841043,0.07304008794778874,0.201607307597797,-0.4931262523426138,-0.5149239752595132,-0.4704726345955191,-0.3662184783750133,-0.21288366861671165,-0.024712933666589658,0.1815256641665325,0.3877161531032869,0.5756642889885433,0.728372855196132,,, +11.515625,23,0.8312336801877138,0.873053234682682,0.846840274986596,0.750300591947838,0.5860043491130653,0.3612143247532506,0.08738701841140656,-0.2206186054015975,-0.5455695765432921,-0.8690528810113528,-1.172751683649322,-1.4397148340545312,-1.6555311463486233,-1.8093265839041568,,, +11.5234375,23,-1.8945148294555456,-1.9092489181604009,-1.856542456878832,-1.7440519935713168,-1.583535729586698,-1.3900263370041441,-1.1807755792802241,-0.9740443459953424,1.365820359128976,1.5203359422590643,1.534823434153502,1.3949157257210685,1.1104735431660109,0.7141028801515502,,, +11.53125,23,0.2561280989589304,-0.20319659525825207,-0.6030244549384107,-0.8913481718450742,-1.0330576868112336,-1.015368994916633,-0.8497785798515582,-0.5702392467991229,-0.2278416433088624,0.11717000263525645,0.40480420700784536,0.5846854217309442,0.623915637299895,0.512209839791317,,, +11.5390625,23,0.2635053981513702,-0.08620531752916505,-0.484481513368428,-0.8706064774082055,-1.1850530686063108,-1.3787678342691072,-1.4208276302035796,-1.3032760890394544,-1.0423865161191472,-0.6761543761060134,-0.25840977631448914,0.14953321139124148,-0.3669095682775474,-0.8690319165954571,,, +11.546875,23,-1.241112499250027,-1.3756690516427827,-1.228076255053955,-0.8288068136710068,-0.27511267435803843,0.29557391302370883,0.7432299593203534,0.9635203896835096,0.9162755897466084,0.6363640245133438,0.22398127096669607,-0.18298168366656875,-0.4469163354750265,-0.4684104848515003,,, +11.5546875,23,-0.2137051549814175,0.2758324085111815,0.8948179127304356,1.5024987408482429,1.9610925879545007,2.173310694812921,2.1087838574813813,1.8121508022205324,1.3905942857877196,0.9842429985516524,0.7275532533872618,0.7122565309927762,0.9620296976669166,1.4258317615888696,,, +11.5625,23,0.3268928832922636,0.4466430388013835,0.5586928667754519,0.6610043071572623,0.7517019097283134,0.8291057545360506,0.8917609537228278,0.9384632181262986,0.9682800409253296,0.9805671273512492,0.9749797827167968,0.951479059297075,0.9103325543624944,0.8521098453212557,,, +11.5703125,23,0.777672641828264,0.6881598272224893,0.5849676511370141,0.4697254200275665,0.3442671111959137,0.21059940725522047,0.07086671066880909,-0.0726862491391717,-0.2177535614451894,-0.362008347314532,-0.5031433360902917,-0.6389110948845896,-0.7671632067632091,-0.8858877117175192,,, +11.578125,23,-0.993244154938886,-1.0875956288145652,-1.1675372476966417,-1.2319205569681868,-0.7878224919271797,-0.6385677652293532,-0.5400517779399503,-0.5023935071797829,-0.5313477377866956,-0.6278980787475389,-0.7881829463226664,-1.0037596873597103,-1.2621884360836182,-1.5478950009925114,,, +11.5859375,23,-1.8432526201568002,-2.129807160160053,-2.3895603304212614,-2.606221438312006,-2.766340403500676,-2.8602430293432843,-2.8827033176266377,-2.8333059489660704,-2.716473656098666,-2.5411575845792247,-2.320212235530553,-2.06949857936248,-1.8067778840508053,-1.5504733948804506,,, +11.59375,23,-1.3183862168465752,-1.1264549436965114,-0.9876455261545172,-0.9110487890773236,-0.9012485264519674,-0.958004234089634,-1.0762705983991976,-1.2465523757715724,0.4883899144784679,0.7100995549310762,0.7852690012867444,0.7077066039524279,0.4953401873053854,0.18737646966160096,,, +11.6015625,23,-0.16185539076519456,-0.491416952703951,-0.743304104523098,-0.871534381558958,-0.8493623033299846,-0.6734986142791769,-0.3646759686022651,0.03552733906450084,0.4711111641049667,0.8803245683602549,1.205233858727305,1.4006976078232904,1.4413510142705837,1.3255120066244852,,, +11.609375,23,1.0754009388833268,0.7336398910685308,0.35657704625302755,0.005476112150478718,-0.2630567295158003,-0.40591711997432894,-0.4002403653773885,-0.24698323206274764,0.029208306847439025,0.38382487332180815,0.7594172249326603,1.0945392146257953,2.869254352525847,2.958440598385329,,, +11.6171875,23,2.765649807732071,2.346068169044294,1.8142782697783109,1.3128434698675953,0.9732465371146116,0.8798880135903521,1.0470109938886232,1.4148760493499193,1.8662339444396867,2.258580581503649,2.4633529887895955,2.401322658605458,2.0644845697906447,1.518441204327886,,, +11.625,23,0.8846264670811801,0.3072395732068885,-0.08605059835281381,-0.21886294599564526,-0.08679949654846297,0.2415911718815329,0.643844314262245,0.9773853766193727,1.1188448531544497,0.9981044835076212,0.6177416621926368,0.05254091257501137,-0.5707956157431722,-1.1081797090726682,,, +11.6328125,23,-1.2798734491167572,-1.3108152382011156,-1.3244666288762916,-1.3208544055372622,-1.3003107595954295,-1.2634672667878262,-1.2112436201003471,-1.1448313157125634,-1.065672577750886,-0.9754348910000892,-0.8759815876323092,-0.7693390031093299,-0.6576607764807008,-0.5431899203143031,,, +11.640625,23,-0.42821932453841305,-0.3150513859047338,-0.2059574700932216,-0.10313791640198516,-0.008683285478602532,0.07546247122913298,0.1475362752653141,0.20598701810780665,0.24950294662397754,0.2770348573826271,0.2878146935603429,0.2813692186747002,0.25752852758354405,0.21642924559001764,,, +11.6484375,23,0.1585123595020761,0.0845157184915164,-0.004538664071872756,-0.10736228559795058,-1.4555699084951992,-1.6871888606970111,-1.9235493321900807,-2.1463156041256126,-2.3379593576451647,-2.48298687187262,-2.569024613447831,-2.5876875040122944,-2.535169306011748,-2.4125139442151005,,, +11.65625,23,-2.225548829178148,-1.9844848180744807,-1.7032106942824858,-1.3983313488787648,-1.0880167192643702,-0.7907417363085161,-0.5240051313999685,-0.3031164286647894,-0.1401356926175028,-0.0430399491647,-0.0151743910751726,-0.055026619969729684,-0.15633965043578313,-0.30855577886116914,,, +11.6640625,23,-0.4975603473301637,-0.7066735203179929,-0.9178208972640041,-1.1128013134379269,-1.274563404389331,-1.3884018983719772,-1.442990198966986,-1.4311772364023132,1.33331729444379,1.4341560794166397,1.3762240299976138,1.1627090486117948,0.8203368678971844,0.3952271774240205,,, +11.671875,23,-0.05426716811053401,-0.4666226351562636,-0.7866977883830811,-0.97428860820969,-1.0103539759628308,-0.8999418546106622,-0.6713605932437767,-0.3717246404016826,-0.059568670343693626,0.20431925060821346,0.3664174249372286,0.3888601986657719,0.2553905444186243,-0.026051870472502903,,, +11.6796875,23,-0.42451051939532986,-0.8907762778941075,-1.3649943436126706,-1.7859292899332802,-2.1004454656723572,-2.2717264106196717,-2.284953358823194,-2.1495586577022965,-1.8977034001970807,-1.5792166586612937,-1.2537848247375625,-0.981607859962652,-1.277401212789039,-0.8726514612178304,,, +11.6875,23,-0.40550911761972064,-0.01889335023724159,0.1686671022798758,0.0955605960459216,-0.2260024044063416,-0.7133392043898993,-1.2359814238042042,-1.6514801763695472,-1.8445162239161543,-1.7585954533789994,-1.411641973102377,-0.8912141213537617,-0.33065325552416513,0.1272992176604023,,, +11.6953125,23,0.3694466788188472,0.3429721090731602,0.06971381974881019,-0.3600285141174909,-0.812457918452537,-1.1471703017292274,-1.255858138137376,-1.0922179869295332,-0.6848629432880715,-0.1296989703715795,0.43614756800150745,0.8717075369749393,1.0706097054020651,0.9900509071174708,,, +11.703125,23,-0.22242249671233685,-0.3479691200643941,-0.4820648795467238,-0.6226191072411338,-0.7674241380108427,-0.9141937546043918,-1.0606030102205848,-1.2043287313742603,-1.3430899919823545,-1.4746878500923646,-1.5970436515921596,-1.708235230319847,-1.806530370835555,-1.8904169480388529,,, +11.7109375,23,-1.958629216003592,-2.010169785831016,-2.044326907799197,-2.060686755312211,-2.059140495664688,-2.039886023920304,-2.0034243296479803,-1.9505505602374598,-1.8823399373743084,-1.8001287733740432,-1.705490919876189,-1.6002100613698076,-1.486248338785406,-1.365711852636742,,, +11.71875,23,-1.2408136498382842,-1.1138348423833446,-0.987084538767988,-0.8628592898447143,-1.3504930046681451,-1.2033275161191272,-0.9967706792751236,-0.7421242508362829,-0.4541198806873479,-0.14989776419955822,0.15218288972223198,0.4338186378558087,0.6780329470055504,0.870355074212019,,, +11.7265625,23,0.9998244868242638,1.0597507914232076,1.0481761890718424,0.968008217443004,0.8268135316104269,0.6362871113956734,0.4114339159569586,0.16952005749239546,-0.07113336268112208,-0.2924296415505596,-0.4777598659224629,-0.6131622048577556,-0.6882962598543795,-0.6971645270241829,,, +11.734375,23,-0.6385306610277686,-0.5160053743354949,-0.3377939830507555,-0.11612320581492593,0.13361281016857687,0.3939276819501447,0.6464642213706032,0.8732769237637417,-0.8139780372485684,-0.7852488133056342,-0.907444938082794,-1.168353505857915,-1.533393461696374,-1.9509725457938547,,, +11.7421875,23,-2.360497453650708,-2.7017897191631124,-2.9244408597696028,-2.995649763248556,-2.905321674376219,-2.667634639249685,-2.3188294562657825,-1.911567370402492,-1.5067343184079378,-1.1639682245704006,-0.9323847174644341,-0.8429457123163033,-0.9036593984184614,-1.0983591450118126,,, +11.75,23,-1.3892513844753147,-1.7228354751061359,-2.0382733244895794,-2.2769049745273082,-2.3914278437497685,-2.353309694905248,-2.157280488699256,-1.822203250956532,-1.3881880569675662,-0.9103983811607308,-0.4505142332064084,-0.06718146238423472,-0.3016666290873732,-0.6619079172895735,,, +11.7578125,23,-0.7929926427246133,-0.6580214146740521,-0.2951273589342131,0.1929371163010252,0.6669457385662043,0.989362363210657,1.0620639316045506,0.8532834543704528,0.4063883406147109,-0.17191242118075115,-0.7407009867283372,-1.1633398813843945,-1.3447701680003417,-1.2573975994479094,,, +11.765625,23,-0.9484736450977655,-0.5269501224707579,-0.1334119611050124,0.09866948748062232,0.07974130870413433,-0.2110571098522418,-0.7199430913595892,-1.3329956960782685,-1.9071435339680347,-2.30914469640504,-2.4518777168200314,-2.3179993936145693,-1.9644876104345,-1.5068260565058225,,, +11.7734375,23,-0.7434027592767319,-0.6308663248364917,-0.5272713004899495,-0.4344734408180848,-0.35413034937219434,-0.2876723616977056,-0.2362774129245541,-0.20085033004792274,-0.1820069115408537,-0.18006307311678116,-0.19502924974397784,-0.2266101519777538,-0.2742098809169532,-0.3369423122610925,,, +11.78125,23,-0.4136465676770097,-0.502907302605374,-0.6030794552968926,-0.7123170237469899,-0.8286053666727455,-0.9497964629573076,-1.0736465121910301,-1.197855217936607,-1.3201060658770594,-1.4381068915899464,-1.5496300276042192,-1.652551326771965,-1.7448873786516097,-1.8248302672369208,,, +11.7890625,23,-1.8907792614201056,-1.9413688832717608,-1.975492862651092,-1.9923235586801489,1.058086076734227,1.1874160291608682,1.2515382377041746,1.245153320859556,1.1677645497032685,1.0237167208992215,0.8218976908140444,0.5751233726646414,0.29924907112077304,0.012069111566523657,,, +11.796875,23,-0.2679185164685604,-0.5227963697294677,-0.7364710772942022,-0.8957894815912486,-0.9914495770767074,-1.0186427391033528,-0.9773824738549984,-0.8724967804403513,-0.7132846739209392,-0.5128608374359394,-0.2872341195441617,-0.054184152906744436,0.16798555177981425,0.3617310688343959,,, +11.8046875,23,0.5114985605376305,0.6048159959658534,0.6331699395610929,0.5926062511185864,0.4840127915086133,0.3130644033276243,0.08983398649701667,-0.17190322670332225,0.19306548402760226,0.3029938097612589,0.25885599914668245,0.08091549849267787,-0.1897671351247342,-0.497786751967776,,, +11.8125,23,-0.7820794928454318,-0.9854888820516964,-1.0637218836719606,-0.9922996990069921,-0.7704204216342855,-0.4211316715173571,0.012213918470259322,0.4726685119438289,0.8985192970065988,1.2328639739383165,1.4324402493106452,1.4743342585314174,1.3595231889189416,1.1127004466153076,,, +11.8203125,23,0.7784107046698208,0.4140969051474843,0.08114224721034491,-0.16469753609301194,-0.2819813647431433,-0.2500363840051726,-0.07217276194815014,0.224840970670948,0.5949602600928452,0.9800530474575536,1.3189747154796694,1.5571158737745519,-0.8324543762932092,-1.0898112568971756,,, +11.828125,23,-1.5444090402246855,-2.0767697910720053,-2.5434679209018007,-2.816383266651974,-2.817781822626565,-2.5416098991641145,-2.0551657606277227,-1.4806905307568283,-0.9619234716147648,-0.6247873508424472,-0.5429781774731499,-0.7178892514590811,-1.0783706800799706,-1.500389031142659,,, +11.8359375,23,-1.8411975969218544,-1.9786506670042128,-1.8448852511821383,-1.4451372833399247,-0.8565334235374491,-0.20718757430099904,0.35867095633199225,0.719982457171662,0.8117903090075528,0.6427990689406821,0.29274717044536924,-0.10968355470706953,-0.4223651016704133,-0.5288965141302786,,, +11.84375,23,-1.9913265079896048,-1.9722698449721547,-1.9352284290639763,-1.8805826067540383,-1.8090116299612948,-1.7214818459857375,-1.619229865782255,-1.50374100523706,-1.3767233768878029,-1.24007808568898,-1.0958660506408715,-0.946272033171206,-0.7935665020758244,-0.6400660026928013,,, +11.8515625,23,-0.4880927241792662,-0.3399339727988355,-0.19780226076290144,-0.06379670939962212,0.06013355760364214,0.17222338997973208,0.2709223608503021,0.354921752542243,0.4231773058153608,0.4749273342570809,0.5097058867528672,0.5273507276535336,0.5280059950047108,0.512119490392501,,, +11.859375,23,0.4804346479615098,0.43397732333067496,0.3740376338400044,0.3021471682091061,-0.4556236982412561,-0.7432014011836361,-1.016165540908809,-1.2569824910071148,-1.4502725652164268,-1.5838767903987074,-1.649699305011009,-1.64426665335736,-1.5689649871476168,-1.4299386458652457,,, +11.8671875,23,-1.2376571999973176,-1.006181159690865,-0.7521775637886717,-0.4937541051509426,-0.24919310153146665,-0.03567360465662328,0.1319292334299138,0.24208380581276145,0.28740820400278344,0.26518665806057484,0.17756024593739714,0.03137856946743388,-0.16227726287027233,-0.3888670846643407,,, +11.875,23,-0.6314056878023319,-0.8716476961615379,-1.0913606714555812,-1.273597672373207,-1.4038805254679776,-1.4712112917727835,-1.4688413927603692,-1.3947447576540652,1.6549357267459106,1.5941517507207452,1.3806214318900152,1.0434670292122559,0.6305794797004799,0.20120151686774984,,, +11.8828125,23,-0.18325501212298995,-0.4687276241309552,-0.6168751749185675,-0.6109996168035339,-0.4585954668315336,-0.19013017159767964,0.14575438238394794,0.4898715348468027,0.7817620438304682,0.9691643203438648,1.016207377153018,0.909050109661208,0.6580882780731612,0.29638516408256205,,, +11.890625,23,-0.1254299351823822,-0.5470010519541957,-0.9076019648595872,-1.1555526186971732,-1.2562291194568127,-1.1974199216722483,-0.9911941551428366,-0.6719912750780651,-0.2912297518941269,0.09072532270764884,0.4139844923258844,0.6284783746438675,0.6076884008522376,1.2101081906200892,,, +11.8984375,23,1.7010173674479292,1.9659207052587424,1.949998935860768,1.6730456289215498,1.2239766086582982,0.7364172234162811,0.3520585722997801,0.18182574749766425,0.27550060367609863,0.6081242267014847,1.0869052580665026,1.5767399927559944,1.9373490475037691,2.061851459286385,,, +11.90625,23,1.906202943839239,1.5014287416651777,0.9452968176770156,0.3757118287212861,-0.06688005581030121,-0.2777737007338593,-0.2164848358787217,0.0823762177621512,0.5188149653531652,0.95508381650271,1.253658821280751,1.3151516409129875,1.1057641146825214,0.6667588988494089,,, +11.9140625,23,0.22005196477925376,0.1296817315965466,0.03311584740557408,-0.06745326100772782,-0.16975872375192758,-0.27149913894876543,-0.3703790910787006,-0.4641495669552405,-0.5506475615210726,-0.6278341798519202,-0.6938305680714556,-0.7469510439074909,-0.7857328466444506,-0.8089619854217249,,, +11.921875,23,-0.8156947331489496,-0.8052743895456288,-0.7773430196563561,-0.7318479621662618,-0.6690429934234369,-0.5894841266522783,-0.4940201197787412,-0.3837778579393887,-0.2601428664898546,-0.12473529559485365,0.020618203231182075,0.17391621632478085,0.3330173672037639,0.495677566827941,,, +11.9296875,23,0.6595890626740546,0.8224206030190511,0.9818580132870472,1.1356444741111285,-1.2517619928168142,-1.0474055138451062,-0.7933392223634219,-0.5045690037988594,-0.19840048703472468,0.10676326429208802,0.39270029772890747,0.6426354084590029,0.8424046204194633,0.98143732076063,,, +11.9375,23,1.0534875725181292,1.0570636215582545,0.995525660261068,0.8768450444393228,0.7130417684054379,0.5193394396399291,0.31309669456638145,0.11258958679781984,-0.06427012826963874,-0.201191418198764,-0.2846474765742504,-0.3048265475522308,-0.2563237509346571,-0.13852564751474206,,, +11.9453125,23,0.04433928947782007,0.28348783365458685,0.5661867882638147,0.8766332364003642,1.197048893258536,1.5089122649731384,1.7942427087596418,2.0368468696812845,0.7017687420586994,0.6241095525319361,0.4099695942681215,0.09577955090545752,-0.2657456187372673,-0.6138246584691194,,, +11.953125,23,-0.8890883271370393,-1.0428416980864488,-1.0446677226705985,-0.8871876714661134,-0.5872368783544938,-0.18327252892567766,0.27058290491576564,0.7129349841642978,1.0846402554254548,1.3379757863592032,1.4440272946140391,1.3971453582587392,1.21577587009915,0.939535640264103,,, +11.9609375,23,0.6229888994649782,0.3270943161501155,0.10965497781466904,0.016259086203914253,0.07312268924312604,0.28294952321335154,0.6244531092445251,1.0556158326755347,1.5201776774062759,1.9563442484389617,2.3063580453201777,2.525442487213524,-0.8376703369647603,-0.9808816994240448,,, +11.96875,23,-0.8436448278954131,-0.4710770165977172,0.029114769519747088,0.5162381800548134,0.8552392382810754,0.9537593303456556,0.7874687864558123,0.406733655337313,-0.07721150811998621,-0.5227950280537064,-0.7969755336060295,-0.8117924329941988,-0.5485812534210709,-0.06321616532131186,,, +11.9765625,23,0.5290582914279157,1.0850504440778204,1.472689010849244,1.6070293102916942,1.4733316971298591,1.1308889923719725,0.6965558930544861,0.31249650175801424,0.10699151337070856,0.159048774526942,0.4765185592997977,0.993713665911394,1.5891887317696072,2.1188080863208563,,, +11.984375,23,1.2816197959762343,1.417758002879156,1.5422025670565402,1.653298677950935,1.7496219805241973,1.8300032798417327,1.893548779482369,1.939655499532508,1.9680216043234984,1.9786514592036768,1.9718553279270072,1.9482437160838684,1.908716459742872,1.8544467504862827,,, +11.9921875,23,1.7868603766791864,1.7076105445770215,1.6185487202732656,1.5216920031551409,1.4191876022772556,1.3132750377781357,1.2062467293039991,1.100407661646356,0.9980348339474056,0.901337202628056,0.8124168195330781,0.7332318458661446,0.6655620896394546,0.6109776701672387,,, +12.0,24,0.5708113583861458,0.5461350774095146,0.5377409748814038,0.5461273986397928,2.2234405927522345,2.34456809235014,2.3952542985331937,2.3753449059528142,2.289510428201151,2.146913990006067,1.9605660379012355,1.7464109816993143,1.5222094719420958,1.3062942689144652,,, +12.0078125,24,1.1162864731331044,0.9678616507623814,0.8736519074555029,0.8423604833918193,0.8781506218230501,0.9803513368112622,1.1435006067413958,1.3577229897002812,1.6094153357666412,1.8821927859273624,2.158029095942352,2.418511771790155,2.6461244963664785,2.82546742316793,,, +12.015625,24,2.944330244630831,2.994543208444618,2.972546738729557,2.8796399407172486,2.7218906592087877,2.5097133611895,2.2571442758262754,1.9808643354651625,2.58872588001846,2.4950671416678687,2.267187658930488,1.948088976924342,1.5943145108376997,1.2671050155030912,,, +12.0234375,24,1.0228255916905598,0.9041554538197424,0.9334128626328484,1.1090550452328944,1.4058983852091418,1.7790246945549288,2.1707652325244164,2.5196747409033424,2.7700977889229192,2.880837444746529,2.8315760867231456,2.6260482625788075,2.2914713693193005,1.8743227699317309,,, +12.03125,24,1.4331210041413502,1.0293353584984737,0.717839559324785,0.5383963383230597,0.5094990384880653,0.6255292890219311,0.8576732661328303,1.1584536214261456,1.4691709857550597,1.7290957612777609,1.88497828565654,1.899395853240492,2.3147222293108083,1.9029463990658115,,, +12.0390625,24,1.4092608212625155,0.9767005080404808,0.7291469870124191,0.7372790686063092,0.9991258542677879,1.4405525856800063,1.9355467436553808,2.3407449478623645,2.5347380256858254,2.4513818574634407,2.0979842342367494,1.5533827895667605,0.9464401186330098,0.420849063702242,,, +12.046875,24,0.09589293013074174,0.033913851316544674,0.223403852160952,0.5823512939841802,0.9809238521219544,1.277269490000362,1.3566215368655146,1.1629883307071496,0.7147401645487453,0.09981948764315744,-0.5481150654768987,-1.0860747926206122,-1.4006870185772953,-1.439029357314099,,, +12.0546875,24,0.5714900213372035,0.6137182695100112,0.6723971197013837,0.7468142302656221,0.835972284049083,0.9386063259012959,1.0532057915033175,1.1780408418578086,1.3111925423875486,1.4505863582655734,1.5940283795372534,1.739243641782595,1.883915871381988,2.025727959493945,,, +12.0625,24,2.1624024560902466,2.2917413750473505,2.411664613341323,2.520246311669124,2.615748519853643,2.696651577580946,2.7616806785344146,2.8098281528076625,2.8403710774553286,2.8528839068363188,2.847245901606143,2.823643226287345,2.7825656786958017,2.724798108493712,,, +12.0703125,24,2.6514066751293104,2.563720185784433,2.4633068400918026,2.351946788814689,1.6990380470558644,1.4300492584024944,1.1912219726767994,0.9976154064973964,0.8609773088717194,0.7889285215061678,0.7844356350795805,0.8456085055047399,0.9658367400053446,1.1342556247190556,,, +12.078125,24,1.3365089919030924,1.5557558176473034,1.7738503443259193,1.972613421018404,2.135106393679725,2.246818698557269,2.29668632960891,2.277870143961588,2.188239716292024,2.0305289856661872,1.8121528250013417,1.5446973079691064,1.2431192020184636,0.9247104925726172,,, +12.0859375,24,0.6079001284088085,0.31097652916398266,0.0508199213447893,-0.15826711622943734,-0.30554936507714936,-0.38459993927899694,-0.3937408641565336,-0.3361525555700561,1.7566362341463284,1.4652010273318008,1.0565386556332386,0.5802040585045001,0.09619869499643274,-0.33431635132459303,,, +12.09375,24,-0.6584879767143342,-0.8399450349655029,-0.8644058395978949,-0.7418460800217466,-0.5048897696508544,-0.20367411999174911,0.10201156870809724,0.35208833282794344,0.4955927921982354,0.4986600662267102,0.34984075590398656,0.06192363597795891,-0.33002002889753873,-0.7740661117869395,,, +12.1015625,24,-1.2094956602087508,-1.5762264005591464,-1.8241488250770848,-1.9209128184544468,-1.8569520977583232,-1.6469639440186905,-1.3276137900599552,-0.9518222067265696,-0.5805241180390563,-0.2731837684519475,-0.07854274261015504,-0.027042018180978625,-0.43212402511821785,-0.13191762760460626,,, +12.109375,24,-0.050539563380244346,-0.2345641248701439,-0.6557063118399269,-1.2184441738903555,-1.7860888884537998,-2.2181584684351128,-2.4088128149446035,-2.315816748062492,-1.972093441080749,-1.476701924210616,-0.9677113604667796,-0.5844061405162722,-0.42917974115909097,-0.5395603929602563,,, +12.1171875,24,-0.8780345847345179,-1.3424563949902644,-1.7941885085613047,-2.0962608910082547,-2.151087404354473,-1.927401667514429,-1.4690280268938358,-0.8830818512322977,-0.31083108498076184,0.11079704288856296,0.2865164223363388,0.1885688075091668,-0.1358957184095929,-0.577965177738803,,, +12.125,24,2.231600986968433,2.1043768867486405,1.972491570963813,1.8382329724758983,1.7039198586744784,1.571861281619627,1.4443162038489916,1.3234540067655285,1.2113165730579012,1.1097826070525838,1.0205348176963531,0.9450305387478009,0.8844763005665583,0.8398067986898808,,, +12.1328125,24,0.8116686274019492,0.8004090630577582,0.8060700935037624,0.8283877980733808,0.8667970889457947,0.9204417307747736,0.9881894630715068,1.0686519604727098,1.160209281309352,1.2610383763050326,1.3691451581286702,1.4823995701827752,1.5985730404837268,1.7153776647241736,,, +12.140625,24,1.8305064323358893,1.9416737910932849,2.0466558398806978,2.1433294457468053,-0.2196445824734674,-0.05610371497068739,0.13934223618768565,0.3493864642378561,0.5557570193948955,0.7404978087087154,0.8872273992798531,0.9822878295786176,1.0157033041478485,0.9818819048570161,,, +12.1484375,24,0.8800113726704795,0.7141213478488583,0.4928077159891765,0.22863827032845505,-0.06271887580612362,-0.36358335836918976,-0.6554912491177987,-0.9204786882300492,-1.142330959707217,-1.3077099152733442,-1.407081134903006,-1.4353761763258897,-1.3923437381696135,-1.2825652536485088,,, +12.15625,24,-1.115133831224919,-0.9030189337405684,-0.6621611011505696,-0.41035984609249576,-0.16603227339446675,0.05307101134877068,0.2311031614844413,0.3552252411799096,-0.12609827250412187,-0.3589700788419969,-0.6873904644372972,-1.0575556531978811,-1.4085370544290994,-1.6818061085934812,,, +12.1640625,24,-1.8303882515593481,-1.8262200103702357,-1.6645631012548885,-1.3647877750822208,-0.9674031526533978,-0.5277968329422943,-0.1076585964551292,0.23457626738266826,0.4527757873698204,0.5202431751206222,0.4338211902846619,0.2143300203014465,-0.09672923674676492,-0.443691746906476,,, +12.171875,24,-0.7654514018772061,-1.0050297156851469,-1.1185004739140516,-1.0818798050717786,-0.8949082484829902,-0.5811354910119234,-0.1842943350023226,0.2384715558446619,0.6254715315621988,0.9200430550565364,1.0793468356224285,1.0810122741006816,-1.2758176038881073,-1.024774927667672,,, +12.1796875,24,-0.5599395789309727,0.005093813424072502,0.5276404851514059,0.8749022889839329,0.96025368109294,0.7668930740397587,0.3523782755843084,-0.1671963636287198,-0.6490440745986191,-0.9628233027825852,-1.0263423606301658,-0.8280456955855138,-0.4301193375949993,0.0486350062439769,,, +12.1875,24,0.4654627386422755,0.6929031866095197,0.653862924133505,0.34290174212030244,-0.1721040539519852,-0.7683784973261237,-1.30169720577763,-1.6457068992588402,-1.7263388476941752,-1.541886591876275,-1.1632473320988301,-0.7142629623533789,-0.3375508378447526,-0.1551911923570496,,, +12.1953125,24,2.229709600203474,2.303984360562391,2.364546764375056,2.4100231580519065,2.439297443514424,2.4515308182090587,2.4461766627243198,2.4229903152102743,2.3820335613350263,2.3236737610382265,2.2485776272519,2.157699765399266,2.0522661742217188,1.9337529967069147,,, +12.203125,24,1.8038608930617333,1.6644854843324743,1.5176843840701248,1.3656413951896993,1.2106284987997609,1.0549663004458396,0.9009836262219528,0.7509769760819911,0.6071705441939321,0.4716775062390459,0.34646325138122835,0.23331120257928994,0.1337918235874731,0.04923535519914457,,, +12.2109375,24,-0.01929124201869969,-0.07100273490219977,-0.10540913190518064,-0.12232402785471265,0.4165002762103458,0.41051486223285416,0.33768498819824644,0.2032247540373514,0.016780169985458282,-0.2082464193933745,-0.4556341689589729,-0.7074784181811741,-0.9454430936436828,-1.1520434852396946,,, +12.21875,24,-1.311869933705821,-1.412667086947131,-1.4461934536077181,-1.4088013023365105,-1.3016964557975654,-1.1308598499001117,-0.9066363143965828,-0.6430192362371348,-0.3566809736807458,-0.06581661836615801,0.2111182819828825,0.4566880334350338,0.6556858743374694,0.7961875259128971,,, +12.2265625,24,0.8703757641323607,0.8750785296348728,0.8119830685155461,0.6875111883052724,0.5123643450484122,0.30077030113787906,0.06948390398279612,-0.1633883185483958,0.9265983045438818,0.6413307175816385,0.2701569891346595,-0.1292668136348905,-0.4955646523103682,-0.7732045882846399,,, +12.234375,24,-0.92114862134934,-0.9192410297384483,-0.7713402069136629,-0.5047062288718398,-0.16573959625419388,0.18726506021174025,0.4932215670806202,0.6977931975040578,0.7618858691802106,0.6677705382961923,0.4218810245034191,0.05385130441059105,-0.3880579820211105,-0.8444316833493912,,, +12.2421875,24,-1.2539073501789646,-1.562683681096601,-1.732849464291597,-1.7482360019300138,-1.616881743348825,-1.3697255264531067,-1.0557322463728622,-0.7342104427577485,-0.4655186731088606,-0.30160849565236514,-0.2778773337318756,-0.4076004707333149,-1.088924115789143,-1.6580569037991024,,, +12.25,24,-2.1354080837323792,-2.400272747022085,-2.3881149151159082,-2.108120188253282,-1.6405622184548367,-1.1147059246761213,-0.6733044816643754,-0.4334211681097343,-0.45431420799136,-0.7211867816685711,-1.1492560099961031,-1.6070256859742988,-1.9523841497861807,-2.07163351049733,,, +12.2578125,24,-1.9107528219563128,-1.4903260647410368,-0.9000425844081781,-0.274276034353081,0.2445664818353248,0.5448817071879755,0.5762515092840808,0.3630433475399392,-0.002495636651686034,-0.3857561997131501,-0.6469005654807076,-0.6794326565032563,-0.4396318788841902,0.04121863616523425,,, +12.265625,24,-0.12186763326590212,-0.10446443530827144,-0.07083553151396615,-0.021985770599963542,0.04081407430116269,0.11604978771947885,0.20199045544554212,0.2967190012362669,0.3981659817992046,0.5041460481821514,0.612396434995348,0.7206168033994966,0.8265097400817805,0.9278212029566448,,, +12.2734375,24,1.0223802052705846,1.1081370431139321,1.1831993968618468,1.2458656742870302,1.2946550113876178,1.3283334055040723,1.3459355230149506,1.3467817996496718,1.3304905338783422,1.2969847615137189,1.2464937910435618,1.1795493727024131,1.0969765682578307,0.9998794812774592,,, +12.28125,24,0.8896220976404219,0.7678045716736462,0.636235373049145,0.4968997820517563,-0.3796577642176423,-0.5623290135300575,-0.6967917934485233,-0.7718465118118287,-0.7804918324585377,-0.7204193549821725,-0.5941808879036945,-0.40901663549314254,-0.17635626444173785,0.08897237187029225,,, +12.2890625,24,0.3697716873278932,0.6476682914054808,0.9043891484223838,1.123030989509633,1.2892344690093918,1.3921811988693906,1.4253441452575757,1.386939069780989,1.2800455441248664,1.112389107912434,0.8957997684225986,0.6453846097620207,0.3784722143856401,0.11340251133930107,,, +12.296875,24,-0.1317535563224751,-0.340455259334528,-0.4988462526968664,-0.596721202536736,-0.6282374619045059,-0.5923221674293777,-0.4927463688505313,-0.33786102312822697,-0.6798097079151864,-1.0609493766071207,-1.5000520469608425,-1.936628056268966,-2.3100402789203294,-2.5689042152337564,,, +12.3046875,24,-2.6790495209887326,-2.628803149548727,-2.4307714371574387,-2.1198437546912583,-1.7477288437361642,-1.3748749902750592,-1.0610326522428517,-0.855929583355418,-0.7915109542351892,-0.8769531952960257,-1.0972282436102023,-1.4154418610956545,-1.7785818388684729,-2.1257807737812704,,, +12.3125,24,-2.3978064241856365,-2.546301429044842,-2.541333191728428,-2.3760779101165754,-2.067909086453212,-1.6557208521180131,-1.1939028710664352,-0.743905101828973,-0.3647060729182675,-0.1036690936680994,0.010789615810261277,-0.02642087787685121,1.7877852227719857,2.041302166785419,,, +12.3203125,24,2.0143496695374985,1.741706856477328,1.323599221605386,0.8980631369362916,0.6029652690672693,0.5380875319351682,0.7376700694388438,1.1609383453903694,1.7032113216279003,2.2245468472361316,2.5880737543830685,2.6975051134561308,2.523551311486126,2.1119936355106828,,, +12.328125,24,1.571205142844184,1.042538281736997,0.661694241619881,0.5216604637987045,0.6473727822099381,0.989045130613348,1.4359933820397321,1.8471629232912763,2.0899914541655096,2.076953962199026,1.7897719837627275,1.2846500436043078,0.6771019975254793,0.1105237690852523,,, +12.3359375,24,0.35192528477322954,0.20354447407448384,0.054056105826717236,-0.09421500774325717,-0.23895856542458385,-0.3779190948548463,-0.508935314924286,-0.6299778535965581,-0.7391846607735424,-0.8348934961994902,-0.9156709236055308,-0.9803373034697479,-1.0279873468328646,-1.0580058703262352,,, +12.34375,24,-1.070078476598029,-1.064196973172442,-1.040659434905797,-1.0000649089892213,-0.9433028552549181,-0.8715375067223058,-0.7861874242645537,-0.6889006034256585,-0.5815255692906368,-0.4660789655660105,-0.3447102054015856,-0.21966380293581425,-0.09324004515520858,0.03224530729205965,,, +12.3515625,24,0.15450158467619196,0.2713033278758492,0.3805292606798749,0.4801994322967277,-0.1400132649156096,0.08531633865348665,0.3205953834551476,0.5474646467862767,0.7480210992252638,0.9060694356035954,1.008254845239538,1.044998022403135,1.0111672076381153,0.9064403875347176,,, +12.359375,24,0.7353323860671058,0.5068849481127109,0.2340414157313512,-0.06725040849226771,-0.3791446629768491,-0.6831359533443127,-0.9613436501641416,-1.1977524138538205,-1.3793224552310923,-1.4968921244355,-1.54580990294335,-1.5262517433742833,-1.4432016438332729,-1.3060968275712703,,, +12.3671875,24,-1.1281622871564585,-0.9254811141862036,-0.7158654602896996,-0.5176068779274716,-0.3481932008701988,-0.2230814575901829,-0.15461240350572505,-0.15114238248501288,-0.1963233867031925,-0.4588805807273722,-0.7592850135268141,-1.0365512200357665,-1.2330713454675444,-1.303645682493529,,, +12.375,24,-1.2225812746352471,-0.9877526492014334,-0.6209919054027289,-0.16474710507463927,0.324470854012773,0.784832488966129,1.1587634302526224,1.4018566950252729,1.4897356759524687,1.4217991646799055,1.2212653588332416,0.9315082432040256,0.6092572056846957,0.3157193026908965,,, +12.3828125,24,0.10700713242243587,0.025363413849296523,0.09254926147625386,0.3064261213666738,0.6412638859472797,1.051727314080524,1.4799199477847669,1.8643884756190547,2.1496851222797857,2.294998707606622,2.280510056823329,2.1104818670349026,-0.2803581553304815,0.0709488954123404,,, +12.390625,24,0.5188594915933418,0.9210284107368776,1.148937038439,1.1232840528838477,0.835870983056139,0.3519830735134084,-0.2073882952642894,-0.6986103809293072,-0.994699850441343,-1.0200717980449785,-0.771223817733193,-0.3176865126913887,0.2170200054390234,0.6892045240849733,,, +12.3984375,24,0.9743297882516324,1.0010669492739237,0.7707468565541113,0.35687812265670155,-0.11513482697675742,-0.5025137471492863,-0.6844057087443287,-0.5951870599035645,-0.2426428617373894,0.29396248864453456,0.8853966106708244,1.3876588792306528,1.6812234457835165,1.7035723367275664,,, +12.40625,24,0.5685098797173026,0.6438642029966523,0.7049015005883754,0.7505201755969488,0.7798971961183458,0.7925024724437676,0.7881080994035298,0.7667923020464479,0.7289380155945785,0.6752261245722722,0.6066234795264402,0.5243659012058715,0.4299364698356606,0.32503947968599056,,, +12.4140625,24,0.2115705150399409,0.09158317157510326,-0.0327469940741931,-0.1591606552805775,-0.2853543781296042,-0.40902106131064897,-0.5278904450324793,-0.6397689795789285,-0.7425783553428539,-0.8343920196028783,-0.9134690405576168,-0.97828472558518,-1.027557457516382,-1.0602712789396973,,, +12.421875,24,-1.0756938289986542,-1.0733893185195358,-1.053226316185214,-1.0153802093235775,-0.21645307291062246,-0.3494802957696849,-0.5443808128978318,-0.7909324742314732,-1.0752398272341908,-1.3806960005940223,-1.6891338031828431,-1.982085784395992,-2.2420654034102383,-2.4537799825243694,,, +12.4296875,24,-2.605190876255865,-2.688346941528573,-2.69993320225528,-2.6414964614899312,-2.519332141258692,-2.344040253266624,-2.129781475636624,-1.893285222755237,-1.6526788889591806,-1.4262199162379083,-1.231019111798768,-1.081844250819144,-0.9900874004034952,-0.9629679832231968,,, +12.4375,24,-1.0030271596605775,-1.107948791924648,-1.2707194792139536,-1.48011650768935,-1.7214896916642206,-1.9777825876203905,-2.2307218696187032,-2.46209192739303,1.8126017396151584,1.4336806563774254,1.0323768156292632,0.6700780398089158,0.4013627588010823,0.2655251928460929,,, +12.4453125,24,0.2804845857330851,0.4400269927781706,0.7148090482143632,1.0569671725246248,1.4076140990580337,1.706054870234167,1.8992866245604576,1.9503022823780367,1.8439045272227577,1.5891242555550382,1.2178665322110962,0.7799946689189076,0.33561781989821193,-0.054216947392329407,,, +12.453125,24,-0.3369786383202128,-0.4767801566750852,-0.4599143073873546,-0.296936000894159,-0.0209666263566658,0.31751502805333404,0.6585836982818547,0.9422479839964492,1.1178388186380683,1.1519435290786095,1.0336494889477297,0.7762804286010564,0.5874779908392471,0.21811202700150625,,, +12.4609375,24,0.05760788221071511,0.16217326347173178,0.5137199677505927,1.0246541121953403,1.5617314570714798,1.9824412790259163,2.173948395599001,2.083921659971998,1.7348007396752612,1.2175918728257842,0.6668935914909928,0.2239975020125773,-0.0018227249975596442,0.036775347127152025,,, +12.46875,24,0.3122854402850441,0.7299707545467538,1.1539292775850611,1.444461656265215,1.4964991945657,1.2685588139803359,0.7942879196591375,0.17343354413285889,-0.4552908132473938,-0.9520060611885268,-1.2137779252950611,-1.202593969067176,-0.9555416368389392,-0.57439994927607,,, +12.4765625,24,-0.9603302961267798,-0.8888515601165142,-0.8020012707842602,-0.7011006449233372,-0.5877118896591627,-0.4636110290433021,-0.33075698990758856,-0.19125748817451452,-0.047332312835187226,0.09872534961864084,0.2445888732225437,0.387938733480492,0.5265029214666268,0.6580965235651135,,, +12.484375,24,0.7806597739252552,0.8922939134641589,0.9912942276502879,1.0761796847030578,1.145718655375728,1.198950264094044,1.2352009977254796,1.254096281288695,1.2555668180444512,1.2398495830848093,1.2074834531554732,1.1592995493650684,1.0964064620128795,1.0201706163830804,,, +12.4921875,24,0.9321921234296996,0.8342765383443094,0.7284030216428246,0.6166894604048357,-2.6550058047597487,-2.7950838503309,-2.8714578872093255,-2.877530874648453,-2.811439084151457,-2.676184556305805,-2.4794285962155485,-2.2329607014757107,-1.9518799489746472,-1.6535459172315232,,, +12.5,25,-1.35637229124643,-1.0785472663850024,-0.8367699716645259,-0.6450910150405827,-0.5139379919110777,-0.4493938993426689,-0.4527787620281208,-0.5205636314946487,-0.6446229421120677,-0.8128076122478762,-1.0097989118761233,-1.2181835387699134,-1.4196749194222893,-1.5963955537767944,,, +12.5078125,25,-1.7321309657139534,-1.8134678009927807,-1.830736692838132,-1.778694129323973,-1.6568957567628535,-1.4697350703089025,-1.2261447765011049,-0.9389816353630605,0.4153547669933055,0.0030837867847994392,-0.3997335713118865,-0.7331570108207675,-0.9474210928040432,-1.0106704173438388,,, +12.515625,25,-0.9139090645801268,-0.6723934601557164,-0.3232517646907145,0.08029939518693922,0.477240075736965,0.8082436064505272,1.0249055158858176,1.0972673979483665,1.0184639159859583,0.8057692485452328,0.4978801060598744,0.14885864054669828,-0.18032117219536115,-0.43130680922250303,,, +12.5234375,25,-0.5574950882585975,-0.531332744991317,-0.3486523769807913,-0.0293681753301257,0.3855771645664256,0.8405390740437626,1.273786142887516,1.6270619882857758,1.854604929326394,1.9302208901843096,1.8513081787677816,1.6392075512597435,0.03599487036834004,-0.2359701951283447,,, +12.53125,25,-0.733593952618402,-1.3497903407633252,-1.94339382798793,-2.3776517769714816,-2.5575220212341074,-2.455555118299269,-2.1192691936346097,-1.6579974537071387,-1.2128141986042391,-0.917782656554913,-0.8631461987086201,-1.0705516712983532,-1.4870957360674686,-1.9998260810157755,,, +12.5390625,25,-2.466723089074776,-2.755670545641867,-2.7807342049602504,-2.5258046696249195,-2.049123905610435,-1.4674537505835716,-0.9242241153856122,-0.5503890987329991,-0.4287176252509499,-0.5713037794376421,-0.9164587642406474,-1.3458343860019348,-1.7170830258223098,-1.9031009036821869,,, +12.546875,25,0.5013551605278543,0.3846817633817565,0.2689730713520992,0.15651448585310168,0.04953276818477748,-0.04984317204478195,-0.13961977421199698,-0.21797395297032707,-0.28328523835679353,-0.3341643668070368,-0.36947782232015625,-0.3883678979324401,-0.3902679260918496,-0.37491241112523066,,, +12.5546875,25,-0.342341886250621,-0.29290240996339234,-0.22723971048958924,-0.14628808071376853,-0.051254217907761856,0.056403708895088174,0.1750013974684239,0.3026577133484434,0.4373274402301949,0.5768369064652868,0.7189218639543558,0.8612669562855046,1.0015460851480884,1.137462968309034,,, +12.5625,25,1.2667911790941817,1.3874129663862929,1.4973561755028686,1.5948286235745817,-0.6241376616383388,-0.2994396465920248,0.016586277035319785,0.3059988932864908,0.5526854460758743,0.7434777677461257,0.8690631785476228,0.9246266535006796,0.9101794924023476,0.8305515895314346,,, +12.5703125,25,0.6950478575110984,0.5167927789758326,0.3118088071069328,0.0978928951816733,-0.10663048810418158,-0.2841928882695579,-0.4192124225482096,-0.4991855426472248,-0.5155638593943697,-0.4643548748474367,-0.3464047209228173,-0.16734317898531734,0.06280519422749087,0.3303167247777729,,, +12.578125,25,0.6187225604502155,0.909954375569667,1.185601953650448,1.4281949574029305,1.6224195081820776,1.7561847420792298,1.8214649706485424,1.8148587212440623,1.3358233297900657,0.9970421427734736,0.6839746422811394,0.4533846317728649,0.3487965973210437,0.3936669637891829,,, +12.5859375,25,0.5876829531819459,0.9067657723206174,1.3067778772773733,1.7303571203764838,2.115813543747153,2.4067033008470182,2.560588705531852,2.555620156624627,2.393914922841395,2.101206660546364,1.7228203708427658,1.3165998151058242,0.9438890586129975,0.6599728712100457,,, +12.59375,25,0.5054649790203799,0.4999855073787001,0.6391123804978989,0.8950814862770555,1.2211265038081076,1.5587823737833757,1.8470147686780312,2.0317534905821195,2.0743447913780333,1.9576059748222003,1.6885390793895727,1.2972807894554714,-0.9414903536821402,-0.32283217163882616,,, +12.6015625,25,0.2278319678343673,0.5841750421886844,0.6722225331895956,0.4904269704962749,0.10990518739468297,-0.3452250384480622,-0.7320182619744209,-0.9280172865308192,-0.8649351607782745,-0.5474709627640681,-0.052101645368509975,0.4938196285134029,0.9469306327598044,1.1871369546737505,,, +12.609375,25,1.1505340678947973,0.846951521292615,0.3573105736893104,-0.18848107036152545,-0.6470397702132944,-0.9006902665638501,-0.8895856712295556,-0.6279612863269919,-0.20006901143393568,0.2630918147228609,0.6198680383992015,0.7569767636802169,0.6207626097460233,0.2321194580264637,,, +12.6171875,25,1.678249327604575,1.7462760385055818,1.7978285990850766,1.832107717070488,1.8486088245487275,1.8471307812245483,1.8277792691875312,1.7909648198236965,1.7373955074982912,1.668064438015191,1.5842322510028854,1.4874049426755651,1.3793073973576009,1.2618530912980472,,, +12.625,25,1.1371104993148329,1.007266792549201,0.8745894630296784,0.7413865470502069,0.6099661438993004,0.482595938804174,0.3614634388895783,0.2486376184504775,0.14603264516587874,0.0553743224398644,-0.021830164512554817,-0.08431866905912755,-0.13109620738515315,-0.16145239915335596,,, +12.6328125,25,-0.17497391918727434,-0.17155174213783608,-0.15138305326808255,-0.11496779189228112,1.7378256739886209,1.5965849728671977,1.4016820010593785,1.1672538288500882,0.9100445541415864,0.6482391955752038,0.4001974503485857,0.18317561078291456,0.012125758637909434,-0.10134403343465824,,, +12.640625,25,-0.14977599218377954,-0.1303792087116845,-0.04522046517346556,0.09892397421809472,0.29104526261923924,0.5166742938604063,0.7588955816148425,0.9995319813502236,1.2204176279953225,1.4046703101658051,1.5378745405452203,1.6090928090017926,1.6116344859189844,1.543528742630003,,, +12.6484375,25,1.407668495296951,1.211615318806028,0.9670789185839728,0.6891074420776577,0.395045075483205,0.10332959904133716,-0.16778626572115066,-0.4015005693302716,0.8324519335153735,0.3536306963261961,-0.07787834545941097,-0.4085418329535088,-0.6008828289905632,-0.6392634142536501,,, +12.65625,25,-0.5322642767692347,-0.3112909397330338,-0.025623999727084783,0.26531538385570186,0.5012797648866208,0.6306384103465903,0.6184779326771261,0.4520985455571189,0.14304958232196796,-0.2746130512983269,-0.7495763589221487,-1.2212093077120232,-1.6289551691780668,-1.92171449363288,,, +12.6640625,25,-2.0657575127940087,-2.049933801722564,-1.8873679835581905,-1.613377562935517,-1.2799373813596393,-0.94755305273856,-0.6758092844762419,-0.5140653645299419,-0.4937471537489612,-0.6234362388767064,-0.8875212088273778,-1.2486211767185835,-1.3625714505319997,-1.6008292687953718,,, +12.671875,25,-1.5624694639334151,-1.2719571449794371,-0.8217031607100023,-0.3465438743694225,0.013394599547148613,0.15126813331596034,0.022949304817965758,-0.34074357211229744,-0.8423760564612441,-1.3445041042701047,-1.7072664514171558,-1.826660715346594,-1.6630134932060774,-1.2518420632267342,,, +12.6796875,25,-0.6941310235226208,-0.12868874257374094,0.3058403263060563,0.5088966029106987,0.4454672369692673,0.1555632125144984,-0.2568846817422041,-0.6526665466364268,-0.8956198196590708,-0.8901358324986671,-0.6075654010533501,-0.09428468441356892,0.5407911919911527,1.155826596698907,,, +12.6875,25,-0.06309988798915978,0.0031466545631611,0.08243658444829127,0.1731968094091786,0.2736439729291854,0.3818157182170779,0.4956050920469922,0.6127974860300903,0.7311094684497802,0.8482288266970329,0.961855119134202,1.0697400262922592,1.169726794824873,1.2597880835130386,,, +12.6953125,25,1.338061548603095,1.4028825453339542,1.4528133730029074,1.4866685514439126,1.5035356862707356,1.5027915574827118,1.4841131496611988,1.4474834305565485,1.3931917768181203,1.321829039344401,1.2342773345878,1.1316947404936568,1.015495164972049,0.8873237393222863,,, +12.703125,25,0.7490281673918932,0.6026265320570591,0.45027212264554295,0.2942158990849627,-0.5836266631781586,-0.7035753546616725,-0.7550862169970222,-0.7366570742457602,-0.6516417292158323,-0.5080091362474668,-0.31778082926382056,-0.09618585153499716,0.1394078671158343,0.3707111512012581,,, +12.7109375,25,0.5797953128875947,0.7503485830566552,0.8688196102348015,0.9253682730265688,0.9145574888085538,0.8357377630636833,0.6930976504340695,0.4953765961534845,0.25526017039013066,-0.011500143617513307,-0.287181238374956,-0.5533204497104353,-0.7919994965173519,-0.9870907681232644,,, +12.71875,25,-1.1253790596679882,-1.197480540521366,-1.198494879602403,-1.128345058508817,-0.9917811810934362,-0.7980480179254174,-0.5602394720966144,-0.2943849839951824,-1.653404102095336,-2.040893688690117,-2.351971003229896,-2.5385908556487844,-2.5712773876383004,-2.4437313182582376,,, +12.7265625,25,-2.1738311497776603,-1.8008722769309788,-1.3794738900486418,-0.9711025527936834,-0.6345325331144344,-0.4167285556074882,-0.34557083335543226,-0.4255552778842688,-0.6371383726280492,-0.939828507377802,-1.278542029022037,-1.5922337573435241,-1.8234574462714184,-1.9273668200859084,,, +12.734375,25,-1.8787549419067004,-1.6760352077835163,-1.3415436150665687,-0.9181149335636744,-0.4624657677210127,-0.03641484356211677,0.3026922787617872,0.510862946120457,0.5642588151369844,0.4628598287255127,0.2304203400850389,-0.089275535179654,1.7587165766911217,1.4682017437406394,,, +12.7421875,25,1.0630569420209453,0.6842483629529832,0.4643156561527432,0.4908277021513823,0.7821745103075135,1.282331822168273,1.876035035625181,2.4202053510508774,2.7830166475842004,2.8798973426145986,2.6966013442954826,2.29302599755372,1.7867314036922517,1.320678539296832,,, +12.75,25,1.024028549830268,0.9767471099165076,1.187714679290461,1.5923417147567869,2.0703419699896983,2.4787920869292317,2.6914159738224908,2.633326250671288,2.3016999469923056,1.7667204699778989,1.1525261309677477,0.6033849814628022,0.2443646116928855,0.14727422355128428,,, +12.7578125,25,0.13676724993026598,-0.019746268692890062,-0.17301950836169985,-0.3208099074724972,-0.4609765707646607,-0.591517565079926,-0.7106047784099189,-0.8166157319639601,-0.9081617883365276,-0.9841122619613759,-1.0436140097951692,-1.0861061593108643,-1.1113297160331583,-1.1193318825053078,,, +12.765625,25,-1.110465013183103,-1.0853802236759371,-1.0450157663610609,-0.9905803760359296,-0.9235318773507926,-0.8455514287330179,-0.7585138539139569,-0.6644545806859519,-0.5655337659151657,-0.4639982351116919,-0.3621419031272264,-0.2622653691380904,-0.1666353935435983,-0.07744496646474347,,, +12.7734375,25,0.003225332821539806,0.07344400878156833,0.1314627125871961,0.1757470985588422,-0.0183315845794918,0.24950044404018595,0.4914015289895182,0.6916068541811322,0.8373944426298814,0.9199707032540368,0.9350816934595,0.8833074763375035,0.7700190509126563,0.6050008645279634,,, +12.78125,25,0.4017652372381458,0.17660651280942155,-0.05253909865680465,-0.26734847098421866,-0.4503937839929278,-0.5863625938920468,-0.6631306618528121,-0.6726127176489511,-0.6113318199173914,-0.4806675971690267,-0.2867660457906209,-0.040117161460840316,0.2451701570584268,0.5523453830945136,,, +12.7890625,25,0.8631776827178487,1.1592203137254309,1.423089948156259,1.6396717232164828,1.7971660049517768,1.887903887125285,1.9088745747991451,1.8619278934699457,-0.4392758552747241,-0.7583710722015973,-0.9906645141782872,-1.0943122851132383,-1.0480711197011243,-0.8546341724056503,,, +12.796875,25,-0.5402350328379765,-0.15058152222570886,0.2562474990075498,0.6188360355583825,0.8819885575660009,1.0053226919320353,0.9695586684056332,0.7795259057696872,0.4634184251879692,0.06841502181818879,-0.34665368681665665,-0.7204492730444644,-0.9986564468779356,-1.1424165665919572,,, +12.8046875,25,-1.1343502895564652,-0.9812314629266634,-0.7128959580116482,-0.3775555957394821,-0.034247251902755016,0.2564065441461257,0.44168619686018296,0.485034673629897,0.3718014376119194,0.11157576997873442,-0.2632542198679468,-0.7024927349336972,1.077682145668283,1.4126181085178142,,, +12.8125,25,1.5472030070124618,1.4159583251490997,1.02675014342683,0.4588570113442989,-0.15854313184437918,-0.6815728337787226,-0.990896405163843,-1.02424945124817,-0.7933428664244649,-0.3805098401827193,0.08398390808150064,0.4577469942157917,0.6253718446627572,0.5301273390538453,,, +12.8203125,25,0.1895481078415966,-0.3093523795188841,-0.8339330860322602,-1.24230401194581,-1.4222615338824371,-1.32210895154235,-0.9649145375358252,-0.44229847712781534,0.1105495819779282,0.5517766966188267,0.7715830673437452,0.7221393122115956,0.4305068583334588,-0.008977812734928634,,, +12.828125,25,0.20500393366388905,0.2182039852462193,0.2146002860873657,0.19374145684546493,0.1554798524580172,0.09997438973154428,0.02768800647016245,-0.060620203500777126,-0.1639080418369072,-0.28086821530482986,-0.4099509883279389,-0.549391081936466,-0.6972383482532718,-0.8513916835430593,,, +12.8359375,25,-1.0096355861355324,-1.1696787192300215,-1.3291938034766335,-1.4858581409429996,-1.6373940610265902,-1.7816085802266537,-1.9164315814652173,-2.039951844560288,-2.1504502970801007,-2.246429903482121,-2.3266416692939482,-2.3901063051251707,-2.4361311712880047,-2.464322206441148,,, +12.84375,25,-2.47459063149964,-2.46715431153493,-2.44253375192671,-2.40154279897895,1.7536378192697049,1.5948365639033777,1.3998517213154744,1.1854996895208183,0.9699055767300702,0.7712319006093311,0.6064047495612439,0.4899262517464217,0.4328561788478771,0.4420337170724434,,, +12.8515625,25,0.5195936899733238,0.6628109843291383,0.8642840433249838,1.112444646671686,1.3923584438574528,1.6867604311507791,1.977253179115957,2.2455842677779434,2.474913862647334,2.6509840517322947,2.7631084136056803,2.804912821813045,2.7747758373422986,2.6759379888793733,,, +12.859375,25,2.5162723293805,2.307732277051001,2.065515252064716,1.8070004380758249,1.5505347477828222,1.3141516562557705,1.1143122462612771,0.9647562601154526,-1.1459004710953864,-1.5325228142000549,-1.8101294286409624,-1.9432952628266311,-1.9188646022701328,-1.7479474025010133,,, +12.8671875,25,-1.4641372455222637,-1.1182287599550382,-0.7702575648912011,-0.4801028200414063,-0.298116336535976,-0.2572380545987341,-0.3678261724203785,-0.6160073756834329,-0.9658043282303136,-1.3647092402307237,-1.7518355687265696,-2.067378330075855,-2.2619096622139176,-2.304061916225982,,, +12.875,25,-2.185401687843056,-1.9217357051802844,-1.5506452256560834,-1.1256330037394358,-0.7077944801000781,-0.35631043720831346,-0.11924190820293055,-0.026061027442291333,-0.0830811084605596,-0.27249764488263706,-0.5551894898012558,-0.8768437823453374,-0.8782426916238031,-0.6978178599786022,,, +12.8828125,25,-0.27795980518891084,0.2815262624329385,0.84193944773121,1.263485272187356,1.4433853867257185,1.3438521419544869,1.0022629089900676,0.5207474492523648,0.038043771654409635,-0.3086625496554575,-0.4214555456981349,-0.26862418052204473,0.10656733643747646,0.5976787531378962,,, +12.890625,25,1.0642293103658629,1.3701848575776454,1.421248604098126,1.1907352407842582,0.7269369151316875,0.13996186428484625,-0.4283477635358868,-0.8431750789632277,-1.0135428791360872,-0.9170947754367852,-0.6060525997045749,-0.1927188418680112,0.18150089145877124,0.3850636116113262,,, +12.8984375,25,-2.3452742079373525,-2.2750803312103645,-2.1925492650450944,-2.099476872422568,-1.9978351721457608,-1.8897376477208176,-1.7774020835558269,-1.6631115793074789,-1.549174425091853,-1.4378835402269587,-1.3314761858147328,-1.2320946566645123,-1.1417486409216506,-1.062279906548317,,, +12.90625,25,-0.9953299330658798,-0.9423110553927604,-0.9043816251071096,-0.882425624124075,-0.8770370878051109,-0.8885096103063138,-0.916831115977745,-0.9616839884144576,-1.0224505549452072,-1.098223830568278,-1.1878233332484696,-1.2898156936846252,-1.4025396987080712,-1.5241353298292657,,, +12.9140625,25,-1.6525762884995805,-1.7857054385949767,-1.9212725455434407,-2.056973651308548,0.8755432806716967,0.8523509049102178,0.89607885187305,1.0027866120726905,1.16396898577524,1.3671502946559748,1.5967558284042642,1.8351997545437349,2.0641136242684635,2.265629802071309,,, +12.921875,25,2.4236303161325328,2.5248740369886384,2.559923575764932,2.5238072587137217,2.416370008019114,2.2422886516747864,2.010750584968004,1.7348181809953693,1.430523260698922,1.1157547560981291,0.8090171210977222,0.5281460568494302,0.28907109472184755,0.10471131187345993,,, +12.9296875,25,-0.015918829793963533,-0.06833118354213796,-0.05286981879422925,0.02532019251715456,0.15665891157922418,0.327807042163944,0.5226036918972153,0.7232009754425825,-1.1764504805145757,-1.3958432629952586,-1.488800568314363,-1.4282890347401929,-1.21072092034893,-0.8565621572559053,,, +12.9375,25,-0.4071960894256299,0.08146887081632129,0.5476522906113992,0.9332679837971504,1.1929137810690194,1.3008848848515395,1.2551187320346022,1.0774572243626883,0.8101857769340112,0.5093885402494509,0.2361550472281672,0.04700818525448392,-0.014955328717372485,0.0731682257040348,,, +12.9453125,25,0.3104696841788608,0.6723181253970236,1.1141490720611131,1.5783599720440435,2.003239178495857,2.3325379053864066,2.524194472987417,2.5568521768827983,2.4331557517369555,2.179313133903268,1.8409909076203896,1.4761828482536254,-0.5288880714883399,-1.1620693468231822,,, +12.953125,25,-1.7474756883880236,-2.153946055945282,-2.298577438905969,-2.1692135964042176,-1.8275511097336068,-1.392013518497066,-1.0050891935738688,-0.7940865260753648,-0.8360640130014642,-1.1365484756609228,-1.6278755878930606,-2.187608845612836,-2.6719900396015928,-2.9552544274865027,,, +12.9609375,25,-2.964036271871279,-2.6974357966727047,-2.227248185175963,-1.6782920252983522,-1.194228543315046,-0.8982392985566329,-0.8593389473460447,-1.0735550794377955,-1.465132316339136,-1.9074296239687485,-2.25778229501015,-2.3967725925036456,-2.261144610324287,-1.86134069548564,,, +12.96875,25,-2.190491395782689,-2.3195355785806537,-2.4418832510037745,-2.5554176361685426,-2.6581651958163923,-2.7483301947582106,-2.82432615773138,-2.8848036678500644,-2.928674019886325,-2.955128314201799,-2.963651656974225,-2.9540322180541585,-2.926364987822521,-2.881050167238977,,, +12.9765625,25,-2.8187862192390587,-2.7405577031158947,-2.6476181048668264,-2.5414679641035063,-2.4238286804799527,-2.2966124582354266,-2.1618889150760072,-2.021848940014008,-1.8787664329576441,-1.7349585959317944,-1.5927454711607911,-1.4544094344405405,-1.3221553529954408,-1.198072105385476,,, +12.984375,25,-1.0840961371760451,-0.9819776904279612,-0.893250298253796,-0.8192040785033774,0.9113163230905438,1.0695151501506608,1.1824344252660743,1.2378617970106671,1.2275950104941231,1.1480216667696606,1.0003788792935606,0.7906747035603836,0.5292768018092,0.2301970096138263,,, +12.9921875,25,-0.08987832288220454,-0.4127446141480717,-0.7199413437202754,-0.99403234609517,-1.2198148425834052,-1.385372916562418,-1.4829019846100486,-1.5092467847086573,-1.4661153795855757,-1.359954265219515,-1.2014933062011155,-1.004992243067047,-0.7872413264498115,-0.5663857777703237,,, +13.0,26,-0.3606560606533527,-0.18709251470072608,-0.060353295654289485,0.008311243949597369,0.01184620670748271,-0.05211309707482015,-0.1810738025210864,-0.3678572235630613,1.1461624122044878,0.9059284381229326,0.7956322383407259,0.8343213817973449,1.0169746117177842,1.3152897086290218,,, +13.0078125,26,1.6821015472639984,2.058742153273996,2.3841963131743147,2.604626604003722,2.681784150516122,2.598994952599888,2.363789225093842,2.0067640432582383,1.5768562531397494,1.133761710702451,0.7386813734710855,0.4448353566520168,0.28922219436401353,0.2869065885127997,,, +13.015625,26,0.4287250930878229,0.6827668120812929,0.9993982042866598,1.3190490696590838,1.5815467196147641,1.7355441935667069,1.7465737350838,1.6024708648991055,1.3153239336813063,0.919645216132859,0.4670481281019326,0.01825934489067293,-0.10094382789521196,0.2325483599426561,,, +13.0234375,26,0.296183467884348,0.10391581033355546,-0.26022225507357544,-0.6653899018747353,-0.9700314729604622,-1.0608999043427598,-0.8843127554268182,-0.4610725601785958,0.11903956520801676,0.7216896464091906,1.2046431394771555,1.4565999328132957,1.427569833006434,1.142464630215117,,, +13.03125,26,0.6941824863533702,0.21808073546868528,-0.14516613591996708,-0.2881434912481403,-0.16613561296862922,0.19064143670694225,0.6853655261979802,1.1812104075025704,1.5389324143060643,1.6551396261167963,1.4907539914846986,1.0818645445383206,0.5299957592197275,-0.025543371022555383,,, +13.0390625,26,-0.7608632941226645,-0.7189685730165577,-0.6939640986540728,-0.6859899956179037,-0.6948800433318193,-0.7201647579032728,-0.7610797880185329,-0.8165794777800028,-0.8853553588956778,-0.9658592483210412,-1.0563305468074706,-1.154827260249739,-1.259260200544694,-1.3674297669871551,,, +13.046875,26,-1.4770646640535978,-1.5858618775092317,-1.6915272087386826,-1.7918156574330149,-1.8845709454063384,-1.9677634893657912,-2.0395261576074173,-2.0981871844134923,-2.142299665700385,-2.1706671193169416,-2.182364662309761,-2.1767554342108903,-2.153501978646445,-2.112572383844972,,, +13.0546875,26,-2.0542410743918498,-1.9790842402343225,-1.8879699828406016,-1.7820433509205929,-0.6010976951461908,-0.8660337416933928,-1.145536403614596,-1.4213030150238997,-1.6751331875803108,-1.8901980220315056,-2.0522140404650453,-2.150439975585651,-2.178426905237023,-2.134469419607583,,, +13.0625,26,-2.0217263556775182,-1.8480026747996805,-1.6252076880777315,-1.3685274027350456,-1.095368697149694,-0.8241489426070548,-0.5730154665933818,-0.3585841441067621,-0.1947850689459432,-0.09189578923080166,-0.055829511342260114,-0.0877278960989234,-0.18388683022567587,-0.3360203361969285,,, +13.0703125,26,-0.5318442035571669,-0.7559386291410305,-0.9908296969769556,-1.2182142678693535,-1.4202428478321878,-1.5807709611724703,-1.6864917499624348,-1.7278708038271788,-0.3662902897284721,-0.635830803893925,-0.757115677811838,-0.7195575580192526,-0.5368374104958918,-0.2447366833665213,,, +13.078125,26,0.10446967942647388,0.4501858830464961,0.7329604973937078,0.9037698490838092,0.931673534329618,0.8086495675526127,0.5508559872081261,0.19612235886646626,-0.2019381502802995,-0.5822790665798411,-0.8859326677522474,-1.0652022247675252,-1.0911026412813192,-0.9578905048588386,,, +13.0859375,26,-0.6839778833997662,-0.30908743111897163,0.11190821496234804,0.5175033464096932,0.8491060115046926,1.0601279709800158,1.1232021685350957,1.034403767774585,0.8138175314322054,0.5023634079353607,0.15537500577889732,-0.16606859876675212,-0.5413197884456162,-0.22122111268175765,,, +13.09375,26,0.22724321797150546,0.6650524732618835,0.9561752585096148,1.0050735050848898,0.7831050055378591,0.3365862453320162,-0.2256963023322401,-0.7621056213232129,-1.1367884284121996,-1.2567375695797822,-1.097126507349263,-0.7079739981678559,-0.20031373992499288,0.28433932400151785,,, +13.1015625,26,0.6128566500566707,0.6970443966655218,0.5178549477898813,0.13062556398433528,-0.3500918331510299,-0.7819520722091405,-1.0338774954924494,-1.0220523081715454,-0.7329849560761499,-0.2273170430538952,0.3766660955847194,0.9353050613699446,1.3187734804591529,1.4464785085987508,,, +13.109375,26,-1.6627065275952375,-1.5315945158038133,-1.3905467475584974,-1.2415751140317648,-1.0868289761345515,-0.9285577681075388,-0.7690718488044056,-0.6107022860182739,-0.4557602778919174,-0.3064969218073308,-0.1650640350589887,-0.033476713209857345,0.0864217184079511,0.1929917464819713,,, +13.1171875,26,0.2848261438797578,0.3607743777354477,0.4199625242064049,0.4618083413272551,0.4860312361646699,0.4926569518780263,0.4820168927433146,0.45474209908638397,0.4117519777488293,0.35423798553935265,0.2836425514972416,0.201633607155579,0.11007517090244813,0.010994501620525454,,, +13.125,26,-0.09345360313897938,-0.20102473919348346,-0.3094243936820313,-0.4163483172088025,-1.6998180148541608,-1.602049590288941,-1.4391149618154582,-1.220086697912348,-0.9579350255690182,-0.6686305607824624,-0.37003780013169735,-0.08067651664256137,0.18156258530387398,0.40065841148650416,,, +13.1328125,26,0.563569725670807,0.6611376992136417,0.6887178411550754,0.6464972583796649,0.5394751380634988,0.3771078288523507,0.17264328543886648,-0.057808697541187275,-0.2964056125674001,-0.5248219759259327,-0.7255325127502845,-0.8830392971876228,-0.9849572632526442,-1.0228823787763104,,, +13.140625,26,-0.9929819310833224,-0.8962657517209925,-0.7385194573649749,-0.5299043534165991,-0.28425189219048896,-0.018101878015905203,0.25044851834306,0.5030046798854093,-0.404707336089816,-0.5160709071440389,-0.47545831170529107,-0.28183875674590353,0.04193393109689025,0.4526270753585761,,, +13.1484375,26,0.8933093503304019,1.3021652250234506,1.6220710405109968,1.80944147773552,1.8409688074569213,1.7172055168949187,1.4624325595494807,1.1208339982834,0.7495740990259013,0.4098553793779056,0.1573505794607164,0.03349902226295831,0.05902318151651775,0.23067544916574,,, +13.15625,26,0.5217219560634866,0.8860882152296654,1.2655209895980368,1.5986509735193215,1.8305447952370009,1.921258612618557,1.8520610606270989,1.6283562987509566,1.2788518623516365,0.8511008924820387,0.404113007567675,-0.0008153656875669046,0.5501552472714601,0.1911528372506759,,, +13.1640625,26,0.019128422263712586,0.10863879528275544,0.4622401692983722,1.0095510261166782,1.6263074986106685,2.168190924694484,2.5101585629238503,2.5805001492821344,2.3802883855570665,1.9828944386614813,1.513702999140306,1.1155880240820717,0.9096127140936046,0.96172600973626,,, +13.171875,26,1.2645842562632073,1.7394811495086098,2.2578578091529646,2.6764983027161007,2.8767649692970543,2.7971204974932213,2.450023402770335,1.918566123540394,1.3337766894071212,0.8388042475213396,0.5498032777613846,0.5242359293540335,0.7452786482299683,1.1266053938281777,,, +13.1796875,26,-0.5195230631595763,-0.6167459842400411,-0.7059239857911341,-0.7851103572151404,-0.8525390364885252,-0.9066557076980544,-0.9461451869847228,-0.9699546172737612,-0.9773120655631886,-0.967740197040222,-0.941064786507885,-0.8974179180008495,-0.8372358164839749,-0.7612513495201947,,, +13.1875,26,-0.670481330127098,-0.5662088430731932,-0.4499609040078744,-0.3234818425458059,-0.18870287529663526,-0.04770840155632666,0.09730038824366363,0.2440439541710548,0.39020422545218536,0.5334650989904596,0.6715529086587061,0.8022761568010691,0.923563812287765,1.0335015045631066,,, +13.1953125,26,1.130364979971585,1.2126502345708907,1.2790997958419597,1.3287246931288923,0.7221555450065563,0.8926863664982362,1.0026386618176693,1.044143443563608,1.0139696281518629,0.9137493814017812,0.749864687122555,0.5330030479661377,0.2774132994358233,-8.657080791216881e-05,,, +13.203125,26,-0.2812804135759569,-0.5478220657607429,-0.7825122277085764,-0.9704950351856368,-1.1002908914751055,-1.1645935440275537,-1.160775830793208,-1.0910688374888726,-0.9624019818502494,-0.7859151862485151,-0.5761771670286174,-0.3501643629831023,-0.1260717173886281,0.07796174601409668,,, +13.2109375,26,0.2451236704445674,0.3611068101370033,0.4151129803442155,0.40061249017474665,0.31580608568204915,0.16375717512182952,-0.047814899786260516,-0.3070661467497633,-0.309623076330524,-0.4838757514184967,-0.5067198328788165,-0.385471931742196,-0.15044036707766956,0.14983736932222186,,, +13.21875,26,0.4561992273695331,0.7081206136747943,0.8531909662536095,0.8553286170028799,0.7004541773619589,0.39873852130522,-0.016925043966270648,-0.4959867334759345,-0.9780556035404424,-1.4022472480019221,-1.7166082117974049,-1.8861495138249367,-1.898238309043676,-1.764508201360226,,, +13.2265625,26,-1.5189909537350557,-1.2127608741236515,-0.9059263184384484,-0.6582159442089375,-0.5196262142521684,-0.5225870989237701,-0.6768664461029761,-0.9680069129279256,-1.3595391238167345,-1.7986265367328682,-2.2242629765692405,-2.5767461858313347,1.905001645965133,1.7013737651238616,,, +13.234375,26,1.2455843077941084,0.6296908709637519,-0.010742037596755127,-0.5335528488686052,-0.828701182521792,-0.8481851592366457,-0.6189604852376367,-0.2353226781658141,0.16715772405221369,0.44900143873527204,0.5052453687605593,0.2943933302422013,-0.15004355171291828,-0.7285811107443574,,, +13.2421875,26,-1.302896342758593,-1.733625994940506,-1.9184710183833555,-1.820164342210576,-1.4766373874939327,-0.9905993265037276,-0.5013852345439531,-0.14678863791583552,-0.025338730766772732,-0.169360458622429,-0.5362002063932564,-1.020020988176061,-1.4809333678695284,-1.7834769607596457,,, +13.25,26,1.3608217321303706,1.3749857709890043,1.3711167830397084,1.3494215825636808,1.3104101833392412,1.2548868537593134,1.1839360251419264,1.098903299981239,1.001371892678586,0.8931349152694794,0.7761639934149336,0.6525747621722133,0.5245898457020237,0.3944999691115511,,, +13.2578125,26,0.2646238833424861,0.1372678047939871,0.014685079856409322,-0.1009632193976141,-0.20764607843785887,-0.30349804087034826,-0.3868518048265992,-0.4562673444355654,-0.5105570465055287,-0.5488064223280351,-0.5703900319925812,-0.5749823424345286,-0.5625633291523741,-0.5334187235699746,,, +13.265625,26,-0.4881349017776668,-0.4275885042171461,-0.35293096814099817,-0.2655682437530004,-0.5988467281917926,-0.905750207594098,-1.2093200863603597,-1.4913295124890509,-1.7350449399636951,-1.926385637030616,-2.054898204388424,-2.11447816425778,-2.103788318841312,-2.026344721840251,,, +13.2734375,26,-1.890264284996,-1.7076916367364081,-1.4939452166047689,-1.2664421674950266,-1.0434770125970996,-0.8429392997195535,-0.6810596513040199,-0.5712716772821329,-0.5232691280117491,-0.5423240493967404,-0.6289135013038302,-0.7786808827853654,-0.9827345738890818,-1.2282630811122512,,, +13.28125,26,-1.4994238021607424,-1.7784434447016984,-2.0468533738621155,-2.2867737535226493,-2.482156943237844,-2.6199034531177414,-2.690772645212564,-2.6900246821758893,-2.806951978195936,-2.8839646187979517,-2.7998750619017208,-2.5709997777107296,-2.235330391683206,-1.8466114097487407,,, +13.2890625,26,-1.4659684751898232,-1.1523910994592619,-0.9535522098115772,-0.8983943746495605,-0.9926373773720784,-1.2179067736492923,-1.5346190598219238,-1.8881739486919555,-2.2174891307796574,-2.464548026586424,-2.5834732395161497,-2.5477122774013417,-2.3542161194187194,-2.0239595711397054,,, +13.296875,26,-1.5987221231922706,-1.134630463459911,-0.6934681717451887,-0.33310588973383404,-0.09854224190524853,-0.014950649003878103,-0.08381474243884858,-0.2827540187089507,-0.5690665967088069,-0.8864369820370165,-1.1737637770205,-1.3747320851231808,-1.1486790712580153,-0.5723361985909959,,, +13.3046875,26,-0.019240456723628285,0.3754701374190449,0.5205573504479044,0.3934649686617049,0.04627622579176255,-0.4087841765696543,-0.8303278528100351,-1.086768129728053,-1.0925917496549788,-0.8319939046334354,-0.3633970458677873,0.1963867980391483,0.7040112348130809,1.028739232138292,,, +13.3125,26,1.0881486150706792,0.8706147505460023,0.4384096320082422,-0.08943114605853282,-0.5697772138758359,-0.8746540463360644,-0.9263177034367464,-0.7185407077332132,-0.31827539632294943,0.15276076371052744,0.5515304175084121,0.7529850210438165,0.6844627068848296,0.3457467578827672,,, +13.3203125,26,-0.16713604927803832,-0.05947109831928527,0.055421196607865986,0.17540197876953598,0.29823654274622435,0.4216336124138161,0.5432856135319608,0.6609092356733579,0.7722855731586896,0.8752991420394555,0.96797508983641,1.0485139463964854,1.1153233072756223,1.167045894765551,,, +13.328125,26,1.2025835051129816,1.2211164225019944,1.222117959753261,1.2053638710174726,1.170936471532011,1.1192233921873729,1.0509109905917422,0.9669725338853018,0.8686513601003888,0.7574393127898413,0.6350508264046266,0.5033931160625676,0.3645329935535879,0.22066089050475976,,, +13.3359375,26,0.07405271853115603,-0.0729697659355561,-0.21807939825559053,-0.3589841357202179,-2.6177489641818537,-2.47885615646929,-2.282734367976254,-2.042593460542581,-1.7745432149771023,-1.4964696384875904,-1.2267877733709496,-0.9831579780033952,-0.7812551975334232,-0.6336770456963149,,, +13.34375,26,-0.549066838622409,-0.5315127313843513,-0.5802648537064068,-0.6897901653514658,-0.8501612006443373,-1.0477515876480314,-1.2661898343765954,-1.4875048638864512,-1.693383408086414,-1.866451569141241,-1.9914911713368653,-2.0565060728923736,-2.05356406930323,-1.9793556678943545,,, +13.3515625,26,-1.8354307561349803,-1.6280966471792873,-1.3679845988007,-1.0693150197751284,-0.7489125887779173,-0.4250399497929429,-0.11613129887557486,0.16048584239263966,-1.4466393724477862,-1.3670998326710275,-1.1375827430811156,-0.7832334304287505,-0.3490044782624592,0.10730048209440296,,, +13.359375,26,0.5239871609846667,0.8450397690765906,1.028808700287557,1.0544637727563502,0.9252080710081706,0.6677519682969064,0.3281293863509169,-0.035491953516928236,-0.36188635197402397,-0.5963183443225865,-0.6990760658079884,-0.6516606197729692,-0.4596674097291787,-0.15191066151175575,,, +13.3671875,26,0.2240724743987458,0.6094379300102328,0.9432156830552316,1.171825601567712,1.257445915836356,1.183930753967302,0.9593549051392608,0.6147892840344689,0.19949764131083275,-0.2266975410580603,-0.6026911311462405,-0.8755688338600187,-1.3363334102751572,-1.6775555793422563,,, +13.375,26,-1.7536682539407056,-1.568230792190767,-1.1966426365375626,-0.7652473769180548,-0.4164725498435357,-0.2695614688083736,-0.3876614751988153,-0.7602908766622045,-1.3059919653583272,-1.8944450525041088,-2.3819846988761784,-2.650786086719941,-2.6409834910280736,-2.3669197792831094,,, +13.3828125,26,-1.9130749341657671,-1.4107908063271026,-1.00217231164909,-0.8010596585793426,-0.8617687442776992,-1.1641676393061622,-1.6191796464275725,-2.0932049017884387,-2.4447672739275603,-2.563342520663857,-2.399725640480046,-1.9796140055527245,-1.396682717567502,-0.7870490046943368,,, +13.390625,26,-0.49346697167089904,-0.6194245348349936,-0.7349036981436544,-0.8381355561415362,-0.9275661761842202,-1.0018835851035053,-1.0600405189393522,-1.1012725375287662,-1.1251111868983108,-1.1313919791239442,-1.1202570500644038,-1.0921524485666931,-1.047820104742236,-0.9882846180843292,,, +13.3984375,26,-0.9148350968977332,-0.8290023671639981,-0.7325319500485328,-0.6273532813387996,-0.5155457119160936,-0.3993018847159767,-0.2808891295757123,-0.16260955207365366,-0.046759515324017176,0.06441077566802161,0.1687368792962597,0.2641782186756518,0.3488540117203458,0.42107640072792907,,, +13.40625,26,0.4793802012470567,0.5225487492141629,0.5496353936583934,0.5599802585233433,0.3897915479670128,0.5601133751932421,0.6639327213576599,0.6984014359347706,0.6655326805256491,0.5720527443652782,0.4289241660427694,0.25057343300078483,0.0538771311581593,-0.14302273898479995,,, +13.4140625,26,-0.3219916506711331,-0.4661748638644244,-0.5611804233644445,-0.5960903308973807,-0.5642293622191488,-0.463637900679022,-0.297215798851448,-0.07252722041731452,0.1987199442452679,0.5014838019050866,0.818430869864414,1.1311385023503475,1.4213734946833498,1.6723577173322837,,, +13.421875,26,1.8699325358819547,2.003540830320824,2.0669581458301933,2.0587220004819065,1.9822294230600623,1.8454959289107358,1.6605927500138558,1.4428015711084632,-1.0088027774038597,-0.9878929446117724,-0.8225760273719074,-0.5452579328568767,-0.2059143635525469,0.13574598511785513,,, +13.4296875,26,0.4196346997976104,0.5946962857479654,0.6269138067464683,0.5046603175945046,0.2405622870888796,-0.13041551150346795,-0.5563656342697981,-0.9764740003045008,-1.3304449368310372,-1.5678474924887569,-1.6559275279292511,-1.5846690444231668,-1.3683166438852024,-1.0431221970486004,,, +13.4375,26,-0.6616668807802732,-0.2846431336325054,0.028623307314890045,0.2294349042424293,0.2873247012882273,0.19481537771068452,-0.03140635946348004,-0.3530830241641701,-0.7163433715519076,-1.0600953739551535,-1.3255479026283268,-1.4653780425457257,-0.016142286562418118,-0.2508925596706594,,, +13.4453125,26,-0.6280472207794617,-1.0113300389049191,-1.2620001806642858,-1.2771168493268998,-1.017996263341876,-0.5210596082451207,0.1119033148791064,0.7413884778371896,1.2281729644421835,1.4712399865503518,1.4352415140744883,1.1599738005612723,0.749270711956248,0.34236061201392465,,, +13.453125,26,0.07553863807118401,0.044660314359941,0.2787371853575901,0.7318722484673847,1.2957463937722795,1.829234452652571,2.197034546827354,2.306723950541808,2.1340857173064505,1.729764745785925,1.2054287922781841,0.7032268112187661,0.3569145057111455,0.2553005434468896,,, +13.4609375,26,0.553221979996046,0.5293042137094033,0.4884767977694941,0.4312915511343328,0.3585927808097005,0.2715026639753613,0.1714017609002486,0.0599049997630452,-0.06116644621420009,-0.18981689698230025,-0.32391096359366245,-0.4612107966185767,-0.5994151329238531,-0.7361994571904074,,, +13.46875,26,-0.869256575024335,-0.9963368873141604,-1.115287660703736,-1.2240906066372412,-1.3208971110390673,-1.4040604978268951,-1.472164761396228,-1.524049265031462,-1.5588289728402205,-1.5759098610069318,-1.5749992385706333,-1.5561107970635897,-1.5195643006402308,-1.4659799221685468,,, +13.4765625,26,-1.3962673245009287,-1.3116096781522673,-1.2134428952687797,-1.1034304435367819,1.2095457221432162,0.9791723649930428,0.7696706022282431,0.5974149033060775,0.4760214772890037,0.4153973442508216,0.42104841924132586,0.493694860070799,0.6292205028791713,0.8189599116139726,,, +13.484375,26,1.0503030238300384,1.3075752273856194,1.5731314951269866,1.8285882768841848,2.0561072410313512,2.239641341445778,2.366056312055339,2.4260493772404046,2.414801106359884,2.3323149486402555,2.1834207629799325,1.9774420872136784,1.7275503392117566,1.449850972762936,,, +13.4921875,26,1.1622653022043292,0.88328595780151,0.6306927454495962,0.4203184448220443,0.26495059721895764,0.17344585087691233,0.15011860872872018,0.19444659520509572,-1.45111614104568,-1.2775982677239899,-0.963792508722257,-0.5498702929460862,-0.09097878434654612,0.35131581811557544,,, +13.5,27,0.7185814809114045,0.9645822520053864,1.0624376442744794,1.008764582903217,0.8241570092676362,0.5499286762961137,0.2416267098784972,-0.03967350823093885,-0.2369360003357437,-0.3061039063405669,-0.22301856110505747,0.012760034521975938,0.3778266984556785,0.8285185063860964,,, +13.5078125,27,1.3076577161403862,1.7534002240636493,2.1088116499174965,2.3306798108557474,2.396191276004796,2.306432366988102,2.086169570685063,1.779943821980333,1.445087237403573,1.142750212785066,0.9283366808275838,0.8428374921096145,1.25824657350922,1.6799144566532112,,, +13.515625,27,1.924763611348576,1.9094311401442765,1.6208324991689769,1.1199638233467322,0.5254066199174626,-0.018946416663829124,-0.3831012286797645,-0.4863637781916472,-0.31923267925068194,0.05421491692795189,0.5140960151623685,0.9177800861095116,1.1391707888583316,1.1034433562711317,,, +13.5234375,27,0.8077154805764646,0.3219848788977808,-0.2299248197651184,-0.7041889414216541,-0.9763080673678592,-0.9751584842107324,-0.702435258762737,-0.23215965618588635,0.3096138193224189,0.7793289997312759,1.055234312934251,1.070691404311356,0.8323577730277314,0.4182608526526465,,, +13.53125,27,-0.9834341810656628,-0.8554817229528263,-0.7217309109667291,-0.5844320084974927,-0.4458882827633591,-0.308415664485351,-0.17430219140031222,-0.04576794576431481,0.07507381266229707,0.18625363758108326,0.2859803633703225,0.3726724450320456,0.4449856221178049,0.5018364222543499,,, +13.5390625,27,0.5424210927347362,0.5662296287048159,0.5730546523318223,0.562994987506282,0.5364538675119274,0.4941318070784201,0.4370142636602148,0.3663543040286864,0.2836505797266867,0.1906209970737429,0.08917254280955134,-0.01863220622751649,-0.13061130291949458,-0.2445017449205139,,, +13.546875,27,-0.3579992139940119,-0.4687985437337649,-0.5746342070228085,-0.6733201142277004,0.3011138584986865,0.4603881939159738,0.6588066533695374,0.8801213219695788,1.1064393931586871,1.319478024593248,1.5018464527678297,1.6382659434109277,1.7166424895157115,1.72891743717247,,, +13.5546875,27,1.6716367051808387,1.546198887783969,1.3587649224448968,1.1198356048344522,0.8435263954224883,0.5465900710627686,0.2472553587617045,-0.03603747876292485,-0.2859159499624647,-0.4872803391485905,-0.6283503953420352,-0.7014807310667659,-0.7036880850301576,-0.6368536948009978,,, +13.5625,27,-0.5075866806968946,-0.3267579803194296,-0.10873734615410163,0.12961337558164415,0.3701204720166908,0.5945697853124245,0.7859806590454907,0.929793563999834,0.9064119798761466,1.1152175858501518,1.4419815041292288,1.8402254428426703,2.251485591846877,2.6144033459514247,,, +13.5703125,27,2.874270932976899,2.9915452215390497,2.948003674059493,2.749583637745716,2.425462732765808,2.0235235446633024,1.602908970792022,1.224827695808346,0.943041802558994,0.7955180139024675,0.7985428000496224,0.9442178073327986,1.2017255435549905,1.5221680007184777,,, +13.578125,27,1.846224376026619,2.113434947598595,2.2716648652028577,2.2852735808599585,2.1407172360223123,1.8487111423750464,1.4426152679674047,0.9732939197448872,0.5012499700099776,0.08725847393569919,-0.21704175006144105,-0.3771334593286658,-0.5655523356433518,-0.4464772158549932,,, +13.5859375,27,-0.06677364461385715,0.4899538733772516,1.0922183348533228,1.5964702107631688,1.886216973686468,1.9037227804156216,1.6656025101184382,1.2580384556035915,0.8129327878435413,0.4715338297380779,0.3455071917130225,0.4861230525855365,0.8700064025713088,1.4053575614175189,,, +13.59375,27,1.9569398861683396,2.3829879327345207,2.573922154701497,2.482260949017312,2.135533232622416,1.6286535987022812,1.0978506028932726,0.6832942667035876,0.49066588863815597,0.5622029291230936,0.8651546939795168,1.3008125557569217,1.731639382709294,2.0190621930884416,,, +13.6015625,27,-0.7627880251920223,-0.8411239023700613,-0.9066015684776474,-0.9577130792437286,-0.9931952793543564,-1.0120520765119183,-1.0135720435091926,-0.9973410400152628,-0.9632496329782688,-0.9114951856194268,-0.8425785783454326,-0.7572956188973949,-0.6567232920450549,-0.5422010894900045,,, +13.609375,27,-0.4153077467859144,-0.2778337945065924,-0.13175040417711065,0.02082492563165525,0.17766524232689582,0.3364729259040938,0.4949197101056738,0.6506872374825593,0.8015074383546246,0.9452020267625936,1.0797204219592371,1.2031754315585328,1.3138760716619626,1.4103569494045092,,, +13.6171875,27,1.4914036935648909,1.556073988077729,1.6037138402812294,1.6339687991760152,1.014888578208097,1.0343636918984347,0.986018656911156,0.8725106342513117,0.7011707807724744,0.4834945605811379,0.2343413197559871,-0.029101062205132387,-0.28851424804843273,-0.5257267010636073,,, +13.625,27,-0.7239810590603877,-0.8691032455169366,-0.9504917907256034,-0.9618583722881568,-0.9016679317439604,-0.7732476728218016,-0.5845573359368763,-0.3476367630485269,-0.07776926977839435,0.20758084141157776,0.4899825440636793,0.7513194605973833,0.9750490001100841,1.1473514672407283,,, +13.6328125,27,1.2580890215501614,1.3015076272481108,1.2766330558181804,1.1873333393389784,1.0420433323189475,0.8531706026365788,0.6362240946211479,0.4087263397418165,-0.3809397799369719,-0.2406483152896023,0.009243255420882779,0.31735539632192866,0.6234829995302663,0.8680246556925116,,, +13.640625,27,1.0013159897508062,0.9914130937609182,0.8291135056200402,0.5294324620333827,0.12930427764270042,-0.3181333262866257,-0.7517818806003093,-1.1120681428371078,-1.3501960452880606,-1.4357237064466348,-1.361285456750104,-1.1437234887677916,-0.8214529416545178,-0.44847087151790216,,, +13.6484375,27,-0.08594227094819085,0.20732633271054413,0.384041926319433,0.4157827942402888,0.2974130774471685,0.04786659309746498,-0.29282207388800396,-0.6697766689406249,-1.0218535339999084,-1.2911954021675736,-1.4322764970999131,-1.4190299287897714,1.3410525873272845,0.7201535390966659,,, +13.65625,27,0.09999985168582183,-0.3809657585540436,-0.6236120317811144,-0.5950622018670375,-0.33747037509425165,0.043772025145718735,0.4091653645538703,0.6235808801407561,0.5935415979867961,0.2930853292182581,-0.22888068134438624,-0.8617512549779316,-1.4633130659203466,-1.898507979111896,,, +13.6640625,27,-2.076247944501508,-1.974193348070994,-1.644705443534528,-1.200342961708761,-0.7828791615961777,-0.5243319675103784,-0.5106886275494483,-0.7582676500010616,-1.2091970774359269,-1.7472487403320682,-2.2296889622571983,-2.52641635170163,-2.5556599361856955,-2.306453395802968,,, +13.671875,27,1.6467899273939088,1.642434422440794,1.621460876467452,1.5847192577043676,1.533335789116714,1.46869298919098,1.3924052244701317,1.3062902020469944,1.2123369013187208,1.1126705066460645,1.0095149550868576,0.9051537551212552,0.801889762568555,0.7020046181553166,,, +13.6796875,27,0.6077185571101398,0.5211512946593522,0.4442846724452826,0.3789277200633693,0.3266847436241596,0.2889270002365541,0.2667684545284924,0.26104604183484026,0.2723047837762954,0.3007880169849864,0.3464329061993129,0.40887132042307495,0.4874360569337852,0.5811723042849645,,, +13.6875,27,0.6888541437091321,0.8090058001086693,0.93992727064991,1.0797238823285586,0.1889850847429697,-0.0051899892893012564,-0.15773595407922325,-0.2554636366862175,-0.2889843317320733,-0.2533715842623729,-0.14851187834056967,0.020880240128570704,0.2455836779140276,0.5125065431977442,,, +13.6953125,27,0.8055918129256792,1.1069297809087986,1.3979997293084043,1.6609542549217369,1.87985670714663,2.0417854640169057,2.1377280583490026,2.1632028202290794,2.1185647029747336,2.0089739823021806,1.844030027025188,1.6370956948702902,1.4043594802877557,1.16370082809699,,, +13.703125,27,0.9334377521917844,0.7310441052977606,0.5719259615469499,0.4683424509666209,0.4285463112953676,0.4562041003275511,0.550136509740695,0.7043968989892677,-1.248947054202261,-0.9435100891304622,-0.5448903596561847,-0.1094262157081918,0.3011037971449217,0.6290535209916931,,, +13.7109375,27,0.8298368147343766,0.8788199817103828,0.7751057471238371,0.5416196980351816,0.22148601199733492,-0.1287427358347427,-0.44794690407757976,-0.6800117682145892,-0.7826189845746225,-0.7338879394201798,-0.5358322857028437,-0.21409302934387292,0.18601051667737725,0.6064970699339667,,, +13.71875,27,0.9857144085187759,1.2679049120797443,1.4118559351531688,1.3972878607796475,1.2279850341994096,0.9311820726814936,0.5533012743114376,0.15270516525634958,-0.20940688652746345,-0.4785400117745412,-0.6153969619341199,-0.6020001263942383,-0.7685071248439187,-0.4323532808777977,,, +13.7265625,27,-0.3510134185466693,-0.5312559355475984,-0.9066334471038652,-1.3558946084737993,-1.7364260180506947,-1.923556785747902,-1.844951500103575,-1.5006633984935585,-0.9633496207459205,-0.3585873918580668,0.16931627457759255,0.4966529422913172,0.5540025396937529,0.3450532192783756,,, +13.734375,27,-0.05460474454530817,-0.5183786408113567,-0.9035369119004693,-1.090480017798729,-1.0156541928674212,-0.6890861687634986,-0.19173204335004496,0.3466340032081881,0.782931807337571,0.9999558375730406,0.9384863941135256,0.6135307678160671,0.11024302829838988,-0.43935961782259264,,, +13.7421875,27,1.226339261073336,1.3775911352157872,1.5312093465300962,1.6848754033799198,1.8362628835160584,1.9830779791825288,2.1230994746947704,2.2542174565963458,2.3744700786798045,2.48207773822546,2.575474065131695,2.6533331814156957,2.7145927538708614,2.758472436319863,,, +13.75,27,2.784487378633978,2.7924565660631684,2.782505842942096,2.755065567910001,2.710862941782735,2.650909142492618,2.5764814924376567,2.489100970563353,2.3905054630052405,2.2826192207435296,2.1675190591245292,2.0473978911558683,1.924526233166236,1.8012123569129452,,, +13.7578125,27,1.6797617859307659,1.5624368453821489,1.451416973737261,1.3487604912692257,0.9086825820075376,1.1490501948337355,1.4088852670209764,1.6700583924973695,1.9141873826182003,2.1239173928861397,2.2841297606612443,2.3829952616017067,2.412798340919748,2.370474845389401,,, +13.765625,27,2.2578257597064257,2.0813920432260944,1.8519992948154231,1.584003996668489,1.2942938969435995,1.0011122349448582,0.7227877957774897,0.4764593473911776,0.27688340388441457,0.13540844752824946,0.05918713351621385,0.05068140539179966,0.10749502277115386,0.2225451707609779,,, +13.7734375,27,0.38456117452587535,0.5788755317012748,0.7884520904330056,0.9950796632933341,1.1806478303272634,1.3284159526221615,1.424186890682686,1.4573035666161995,-0.4444888915589166,-0.17215664249118362,0.16712257566207414,0.514365368834352,0.808684515002483,0.996794799527192,,, +13.78125,27,1.0413384740087317,0.9267334783476212,0.6616333896851875,0.2776157853762869,-0.17569686556884814,-0.6383240317995501,-1.0492246167830293,-1.3557572149333486,-1.5218298801780998,-1.5334702874318444,-1.4009489652130322,-1.157125163999592,-0.8522732769396378,-0.5461959082467157,,, +13.7890625,27,-0.29885230825172304,-0.16096213681147908,-0.1660483612157324,-0.3251589421952229,-0.6250897249457471,-1.0303856181483564,-1.4888086513816192,-1.9394215109609665,-2.3220277724505363,-2.586498726802668,-2.7005343507154502,-2.6546498507647183,-1.1109658700964773,-0.8408433996149748,,, +13.796875,27,-0.4128062933296836,0.040109950941991664,0.3769598950220988,0.4877106286067752,0.3236026326339908,-0.0892738975128553,-0.656910148284891,-1.2429196788857768,-1.705691413178782,-1.936974263028184,-1.8913206514736995,-1.5983214904538965,-1.1542814789401716,-0.695618324209542,,, +13.8046875,27,-0.3612783399149953,-0.254471064466656,-0.4142120703176939,-0.8044748784161327,-1.3239266240306942,-1.8335805767512063,-2.1947879779763637,-2.307157783935087,-2.1360124731863235,-1.7218557323924026,-1.1692576367826355,-0.6182037829353099,-0.20576072803649725,-0.02856389144040605,,, +13.8125,27,1.2563684948307938,1.1759515111558907,1.1089994926135165,1.056755680819635,1.020194795781773,1.0000059325046915,0.9965804645604576,1.0100051664462133,1.0400606751726782,1.0862253180311674,1.147684239524157,1.2233436676505869,1.3118500697469884,1.4116138624648136,,, +13.8203125,27,1.520837260716339,1.6375457779516471,1.7596228261817712,1.884846809893308,2.0109300643224226,2.135558956257498,2.2564344451888605,2.3713123945476062,2.4780429271608666,2.57460813577518,2.659157488299856,2.730040307790988,2.7858347584044343,2.8253728297333507,,, +13.828125,27,2.8477608820041382,2.8523953923326437,2.838973626270879,2.8074990477255177,1.4213988623242981,1.3148465460920329,1.1408817678033574,0.9073827046470349,0.6263285678922395,0.3129717493635552,-0.015218180068020788,-0.33976499842691843,-0.6424664900238729,-0.9066559451179832,,, +13.8359375,27,-1.1183565507330806,-1.267248190609472,-1.3473792536362037,-1.3575738314615156,-1.3015059274257252,-1.1874355192326402,-1.0276248976732396,-0.837475998913558,-0.6344489036688702,-0.4368369362825683,-0.2624837961787666,-0.12753219613741495,-0.04529128439497465,-0.02530184403348445,,, +13.84375,27,-0.0726644710573845,-0.18767759375938065,-0.3658105892824604,-0.5980138853680492,-0.8713444356903213,-1.1698629645884882,-1.475740425073854,-1.7704965242309605,-2.4636113298106226,-2.1640971783329324,-1.8089496417113744,-1.4589120966066256,-1.1731391668015778,-0.9999579278152492,,, +13.8515625,27,-0.9693193227068378,-1.0881156329644348,-1.3390934254141342,-1.6835313614776992,-2.067265837317833,-2.429125960189584,-2.710464078439897,-2.8642974232256595,-2.8626369703411374,-2.7008619596897327,-2.3984586436875968,-1.9960081061658683,-1.5488922006121062,-1.1186978076520675,,, +13.859375,27,-0.7636580920926068,-0.5296194145709656,-0.4429406625562191,-0.5064307651116852,-0.6989569278935057,-0.9787843771634508,-1.290127186909748,-1.5718896088290446,-1.7672361326537671,-1.832499416624509,-1.7440383510140218,-1.5019777894761088,-0.8443396910004171,-1.2365293793120644,,, +13.8671875,27,-1.4662010242324994,-1.4416624704934182,-1.1393967853429046,-0.6107101804528492,0.03211464898882907,0.6463667019842851,1.097786011299193,1.2971205459061166,1.2243436460853854,0.9338968775829803,0.5395235735619642,0.1828519121819281,-0.0056598785597127286,0.05728967400284745,,, +13.875,27,0.3847914308764799,0.9159250808344548,1.532255375116699,2.090105800334054,2.4597660799096324,2.560889394698916,2.3843793380540568,1.9947692076304755,1.5124425194180526,1.0805683546182212,0.8258141576213005,0.8236038138979034,1.0774429050885608,1.5179774391691834,,, +13.8828125,27,2.7582813724607407,2.6919312641831565,2.609349766014038,2.511712652331433,2.4004499749099684,2.277221161426541,2.1438861022779245,2.002472731899811,1.8551416721485272,1.7041485567572634,1.5518046964701284,1.4004367735161618,1.252346271079648,1.1097693480533457,,, +13.890625,27,0.9748378615736404,0.8495422197253004,0.7356967147628292,0.6349079437584534,0.5485468695190839,0.4777250108795693,0.4232751791649322,0.38573709801450295,0.3653481582495094,0.3620394695494852,0.3754372779549643,0.4048697242568711,0.4493788248133549,0.5077374648866055,,, +13.8984375,27,0.5784711068268718,0.659883832865535,0.7500882663867998,0.8470388476297429,-2.036283960015655,-2.2571288251569888,-2.4200406897746918,-2.515914961328639,-2.5401646049188256,-2.4930371787723757,-2.37959508293914,-2.20936040365058,-1.9956491237971608,-1.7546411306687255,,, +13.90625,27,-1.5042508749669143,-1.2628774355038588,-1.0481211526011842,-0.8755563236280103,-0.7576455439185122,-0.7028713980762937,-0.7151460493312949,-0.7935398950739765,-0.9323482063827454,-1.1214910998593943,-1.3472189449774823,-1.5930740103799073,-1.84104128343446,-2.0728082049729304,,, +13.9140625,27,-2.271045465383035,-2.420619538861416,-2.5096523920443614,-2.5303544595866088,-2.4795727894403865,-2.359016122079995,-2.1751411957614097,-1.938708193123134,-1.130247175472325,-0.6729117549022124,-0.1873675141095548,0.2645405259500615,0.6260935785236214,0.8544768125738214,,, +13.921875,27,0.9273926340637648,0.8464797507526332,0.637005752563541,0.34388135004618625,0.02461732412573673,-0.2596785826105608,-0.4538623263691846,-0.517382440181014,-0.4306329405700917,-0.19804058472010388,0.1525945407280983,0.5744025367660329,1.0087211450816018,1.3942137415910212,,, +13.9296875,27,1.6764077811343914,1.8161680961811781,1.7957853337804957,1.6217312488656628,1.3236517056535653,0.9497542146284426,0.5593083817205063,0.21342730470544624,-0.03443431706144652,-0.14678549004911198,-0.10791417513770696,0.07369313995154825,2.66748760738983,2.6145903980073486,,, +13.9375,27,2.290152966241176,1.768837410500249,1.1773106185803122,0.6597057263025214,0.3383104619822118,0.28025472922291284,0.4793254611722227,0.8578907577237509,1.2884038940554965,1.6285914807188409,1.7606796066695063,1.6239050930064332,1.2313993409937245,0.6668152869855423,,, +13.9453125,27,0.061619829063313536,-0.4407268308221319,-0.7238894988569632,-0.7303546355282727,-0.4770199533314302,-0.050405907569418665,0.4171970996374254,0.7841071953690025,0.9381838460341421,0.8276437733411119,0.4753135371745632,-0.027587942152531568,-0.546433216910266,-0.9400892935395778,,, +13.953125,27,0.9485678810339668,1.052423722917998,1.1563104406889764,1.257928249027553,1.3550140148781948,1.445381121869539,1.526957996013354,1.5978246179581956,1.6562463823413351,1.7007047112259412,1.7299238854473724,1.7428936239213024,1.7388870154110774,1.7174734886374623,,, +13.9609375,27,1.6785265934870108,1.6222264569349951,1.5490568705442214,1.4597970604017143,1.3555082834656162,1.237515484884108,1.1073843373328809,0.9668940642737808,0.8180065228682794,0.662832087765844,0.5035929330092497,0.3425843548596838,0.1821348126412892,0.024565387164367014,,, +13.96875,27,-0.12785063352561488,-0.2729273335470005,-0.4086042208200804,-0.5329820847918766,-1.6640363157388232,-1.3680113837520316,-1.0689146493524964,-0.7851544797303656,-0.5339893379790747,-0.3303310968773634,-0.1857121182759084,-0.10748811064768447,-0.09833233553322107,-0.156056416728245,,, +13.9765625,27,-0.2737702308320316,-0.4403697124276009,-0.6413185405307569,-0.8596691796270463,-1.0772520576367932,-1.2759499384457018,-1.4389686058323048,-1.5520152329188297,-1.6043022488215581,-1.5893066829746485,-1.5052320191462685,-1.3551403363704404,-1.1467455062486351,-0.8918818520264891,,, +13.984375,27,-0.6056853062974491,-0.30554415298025656,-0.00989250726020774,0.2630693459429402,0.4966385335483159,0.6767689952537049,0.7930458674519453,0.8394069149748457,0.3667042491502125,0.7218555367303982,1.079662166642378,1.3797230444318982,1.5701710351281195,1.6157962829296681,,, +13.9921875,27,1.5035771379850051,1.2447569637324858,0.8731430862600488,0.4398925604761174,0.005596618169292744,-0.3691035975073005,-0.6329086502740883,-0.7517972776910758,-0.7142718508893713,-0.5330961087041424,-0.2432547921206379,0.10354674008569964,0.4469859229210901,0.727567004064202,,, +14.0,28,0.8959344518191452,0.9206048869256708,0.7929130072403902,0.5284009218804784,0.164434282591915,-0.2455836890783853,-0.6404992689321094,-0.9609058064656604,-1.158372664606062,-1.2029682002985285,-1.087905156528755,-0.8305850163581588,-0.6040539171201909,-0.07269528779455525,,, +14.0078125,28,0.4789977476471117,0.9102483404696656,1.114798327875626,1.0498675795358845,0.7477015761163462,0.30654407737815703,-0.13648917823301188,-0.44319931451717803,-0.5123969044246783,-0.3078561951632801,0.13153256201768346,0.7021972724089317,1.264047111579353,1.6786480679722542,,, +14.015625,28,1.8469502508836089,1.7362290954326842,1.3888586716657654,0.910514489852772,0.4410408441648823,0.11596874243683145,0.029232723898630963,0.20730613376631246,0.6018448008429929,1.1028562888436837,1.5687862612637615,1.8652768314607209,1.9019748376931327,1.6573022345867052,,, +14.0234375,28,-0.6443560324988855,-0.7412451246347547,-0.822418092815381,-0.8869146878521107,-0.93406228534558,-0.9634874579506788,-0.9751223117986808,-0.9692054762370876,-0.9462777296683128,-0.9071723381854632,-0.8530002762835741,-0.7851305885332356,-0.7051662361850856,-0.6149158517320638,,, +14.03125,28,-0.5163618960986305,-0.41162577612392826,-0.30293053321803953,-0.19256175660337416,-0.08282740563894431,0.023982755183776683,0.12563739819219,0.2200028467221056,0.3050805748267097,0.3790423358101359,0.44026230441929104,0.487345669810589,0.5191531785679635,0.5348211979589225,,, +14.0390625,28,0.533776948060693,0.5157486359863066,0.4807703147036725,0.429181381319014,0.8145607140410691,0.7220724356520207,0.5701112572776894,0.3708770257252049,0.13974616019152708,-0.10580363794107517,-0.3474148782673866,-0.5671327927377098,-0.7486594262951187,-0.8784918504901619,,, +14.046875,28,-0.9468651250450076,-0.9484342487170659,-0.8826475427197832,-0.7537854281772547,-0.5706618930475921,-0.34600946651604303,-0.09559058970753473,0.16290264835109136,0.4110836818011994,0.6311554100462711,0.8071533730744487,0.926061464241985,0.978722372318842,0.9604792580160362,,, +14.0546875,28,0.8715039113403388,0.7167884980670689,0.5058014619116994,0.25183156777118804,-0.028934182344191206,-0.31853447182751105,-0.5984810673466939,-0.8510427192643071,-0.4698787300887731,-0.06006741090852805,0.3376131989109463,0.6645074847679692,0.8736688593280187,0.9371609602136448,,, +14.0625,28,0.8503939960978895,0.6328209033452358,0.3248849742604635,-0.018305509200110117,-0.3355902970628567,-0.5693161762486758,-0.6743529270771583,-0.6251617654319991,-0.4198151243667171,-0.08034145895577299,0.3506588585867673,0.8165997017833214,1.2556718329742622,1.6104174606308392,,, +14.0703125,28,1.8366256936939296,1.910163656914384,1.830679568701017,1.6216012956965868,1.3264309002122572,1.0019126166729615,0.7091386729944164,0.5039785626728017,0.4283227463447125,0.5035049052130391,0.7269275417051767,1.0724167769394726,0.03651105724459225,-0.3631101387863819,,, +14.078125,28,-0.5154887117981719,-0.40354960151258745,-0.08442821851674652,0.32635983277900993,0.6867649055715077,0.8673356277897915,0.7869106266966529,0.4350857518988255,-0.12470277017207575,-0.7723263045222211,-1.3636452691479226,-1.769769236544275,-1.9121378347520508,-1.7838100015616738,,, +14.0859375,28,-1.4511290026510362,-1.0353089993695312,-0.6789917939307776,-0.5069415255162423,-0.5916516068723721,-0.9332917802756991,-1.4594928462174224,-2.0450295631166933,-2.5460085668578007,-2.8391925979395665,-2.8556844351667565,-2.59973957971214,-2.147552299035284,-1.6263481380702267,,, +14.09375,28,0.36162072355931296,0.2790156169035769,0.18256556672842705,0.0737213783535462,-0.04584017857000034,-0.1742456677367112,-0.30945773295652523,-0.449310720655802,-0.5915485543799114,-0.7338641981431173,-0.8739400176406525,-1.0094883326127218,-1.1382914503078134,-1.2582404790631878,,, +14.1015625,28,-1.3673722423893562,-1.4639036471941815,-1.5462629043579603,-1.6131170549881555,-1.6633953203579177,-1.6963078666646365,-1.7113596560221105,-1.7083591411385992,-1.6874216514172151,-1.6489674111633192,-1.5937142245729117,-1.522664955556229,-1.437090021592027,-1.338505208104528,,, +14.109375,28,-1.2286451917955574,-1.1094332364905823,-0.9829475920775028,-0.8513851848440892,-1.0604760469136765,-1.2141175884927706,-1.3032608772866303,-1.3237573971851015,-1.2762995256917666,-1.1663657490386532,-1.0038319852412592,-0.8022761346079974,-0.5780243697555788,-0.34900568675280896,,, +14.1171875,28,-0.1334946098100271,0.05117025847137946,0.18980246477951251,0.27043388220224496,0.2851564717260566,0.2306809122499207,0.10857312691739728,-0.07484780506648793,-0.3089432492116828,-0.5794899096357062,-0.8696647862999013,-1.1612115278907509,-1.435706863122432,-1.6758388141446483,,, +14.125,28,-1.8666075738367007,-1.9963653212880632,-2.0576224807283587,-2.0475642153874305,-1.9682411535340687,-1.8264210602796576,-1.6331118115298362,-1.4027889470653396,1.4942513435772011,1.9342384870260023,2.3307349043321355,2.6282078873702845,2.7858476832662786,2.7838898477836698,,, +14.1328125,28,2.626663031925493,2.3418876559642405,1.9763348512247776,1.5885219387432754,1.2395822695722298,0.9837315844133636,0.8598158741196206,0.885257252463457,1.0533408285511412,1.3342651668871388,1.6797927033625144,2.0307757523171515,2.326385830513253,2.5136087027473577,,, +14.140625,28,2.555526146156044,2.4370943855976464,2.1675190401781164,1.7788565140066268,1.321059497989323,0.8542380813137824,0.4393416391487933,0.12871262095154234,-0.04201669745501724,-0.05942262076477167,0.0656725486069979,0.2999411546545072,-0.9339948029273633,-1.1902064119028406,,, +14.1484375,28,-1.6156855331153732,-2.081345478738561,-2.4447861458934943,-2.589468141845884,-2.456816467979802,-2.0624535863352933,-1.4921112109656918,-0.8783394919169196,-0.36439500837913896,-0.06520279910493665,-0.036089503016763835,-0.2578548002269371,-0.6422704707648558,-1.0564977761426593,,, +14.15625,28,-1.3597289290795922,-1.442008185693745,-1.2545907696387126,-0.8235171275792499,-0.2426802715517196,0.3517156066070798,0.8183068525792677,1.0491518257982104,0.9991695599326365,0.6983686431185553,0.2435158646602205,-0.2284710654517338,-0.5781137265271619,-0.7016432362471651,,, +14.1640625,28,-0.7170232349369199,-0.5821794729689129,-0.4491716523170375,-0.32027706598870503,-0.1976927768524387,-0.0834972575272993,0.02038588844903311,0.1122214890105676,0.19049306190876056,0.2539292392685764,0.3015258957456833,0.3325635929015777,0.34662003443465395,0.3435773142631292,,, +14.171875,28,0.3236238306373538,0.2872508328576637,0.2352436611605581,0.16866783325858792,0.08885022125726616,-0.002644351356121621,-0.1040406827666513,-0.21338445301540016,-0.3285766238451245,-0.4474103757574552,-0.5676099354016834,-0.6868706133223451,-0.8028993508847615,-0.9134550662934576,,, +14.1796875,28,-1.0163880931262188,-1.1096780206954175,-1.1914692735382575,-1.2601038069120745,-1.1523816797696838,-0.9000880810487262,-0.6641020739145449,-0.4613410144888136,-0.30626260096228464,-0.2098536192384327,-0.1788610510644829,-0.2153191689822489,-0.31640560158205866,-0.4746364116131617,,, +14.1875,28,-0.67838658827773,-0.9126996620616078,-1.1603299882219718,-1.4029450195032993,-1.622403731268093,-1.802022051068533,-1.9277370500539384,-1.9890887124620875,-1.979950819458283,-1.898959977822944,-1.749612872491089,-1.5400249569388231,-1.2823674036275434,-0.992021571874543,,, +14.1953125,28,-0.6865099481581508,-0.3842781003770846,-0.10341257613236132,0.13961585881967584,0.33109601353376183,0.4610273461952803,0.5238120092769342,0.5186396185638412,0.5927975037351298,0.8843342734108867,1.1147115895227342,1.2335360822587351,1.2077687904292955,1.0269299219944,,, +14.203125,28,0.7047895084288675,0.2772803332799164,-0.20304208033794152,-0.6751298196014521,-1.078897200156289,-1.3645273137275695,-1.5001812196102204,-1.4769092803322357,-1.3099999105136722,-1.0365558863407551,-0.7096759259741803,-0.3901479826637603,-0.13694823971594985,0.0019742026700885207,,, +14.2109375,28,-0.0028085250851027643,-0.15759745435464556,-0.44456716005139896,-0.8245279092324957,-1.2430194185981132,-1.6387871265133782,-1.9533207749967048,-2.1399696156830608,-2.171214475762953,-2.042963977732228,-1.775205689833821,-1.4089107024653085,0.3150479358308045,0.8083031139274283,,, +14.21875,28,1.1547586499547138,1.254656533837828,1.0739424984247457,0.6537250117197239,0.09915195114627226,-0.4492478734440336,-0.8539054731565151,-1.0177283496674514,-0.9105126979171748,-0.5770142633410279,-0.12446787318442795,0.30702176975002315,0.5831009216446379,0.6122123059923296,,, +14.2265625,28,0.3709100822387131,-0.08949593843508298,-0.6567899191665534,-1.1883997564752478,-1.5502761883822742,-1.6534475546088214,-1.4782334398532606,-1.0794826381127054,-0.5714014018268311,-0.09613147740702087,0.21530904082278668,0.279016060735509,0.08125632023439877,-0.3177291488826779,,, +14.234375,28,-1.3141503456797483,-1.3524296544864003,-1.3740353966209768,-1.3783502162007428,-1.3650567619489409,-1.3341434594130253,-1.2859049304205858,-1.2209370522982264,-1.14012674323375,-1.0446366525082074,-0.9358850235368924,-0.8155210821830403,-0.6853963811617839,-0.5475326021542456,,, +14.2421875,28,-0.4040863792853904,-0.2573117597658673,-0.1095209588768705,0.03695590365625065,0.17981138102755753,0.3168008800721344,0.44578174192295816,0.5647505384344617,0.6718779314464581,0.7655404846418585,0.8443488711021201,0.9071719827834646,0.953156519887445,0.9817417172474626,,, +14.25,28,0.9926689500037824,0.9859860504998392,0.962046260939617,0.921501840270782,0.4495379270369089,0.3250858826904348,0.15780909295974505,-0.03670013426248546,-0.2408767963878684,-0.4364149454401641,-0.6055512719485253,-0.7323109994865344,-0.8036291937801954,-0.8102692777075652,,, +14.2578125,28,-0.7474746847343691,-0.6153081921783351,-0.4186552545791468,-0.16689108762439395,0.1267652992966764,0.4461650938626301,0.7733479767870725,1.0897867580067024,1.3776715779886843,1.6211441399569213,1.8073959232464345,1.9275538128525955,1.977291404197966,1.9571233714483585,,, +14.265625,28,1.872362388420188,1.7327416220958105,1.5517291391004588,1.3455820490101202,1.132206356905905,0.9299020456750808,0.7560809113477728,0.6260465742777488,-0.9996736545808584,-0.6090786856211535,-0.29513596890356186,-0.10327822627007366,-0.059319386668972185,-0.16547192089439489,,, +14.2734375,28,-0.4000429646248005,-0.7208563371580514,-1.0718672224582,-1.391938993463116,-1.6244148850270432,-1.7259934099801817,-1.67352485081152,-1.4676699567270877,-1.132850699124626,-0.7135004667343041,-0.2671974616938444,0.14424948450807207,0.4643745336144013,0.6507970462607979,,, +14.28125,28,0.6817710085517406,0.5595218485103611,0.3098511851094731,-0.02192866686206743,-0.3780969629419654,-0.6975571111920517,-0.9253924711386088,-1.0214567900768854,-0.9666610725341104,-0.7659774872018014,-0.44769227119905297,-0.059023847631302,-1.4579536702109617,-1.4246877091024377,,, +14.2890625,28,-1.1151666120569872,-0.5947075669653781,0.015533220887916257,0.5716330650003604,0.946196526360193,1.0631024186069422,0.9181824537048372,0.5801657533895057,0.17163211681567375,-0.16480395009110305,-0.3058085350815307,-0.18136576013174774,0.20579338586703835,0.7806978311102313,,, +14.296875,28,1.4164420983599817,1.96872787235596,2.3151768056540742,2.3886422204371702,2.195392029221722,1.813181466058738,1.3697457248362763,1.0076088052825385,0.8448550559530613,0.9426162637364718,1.28818645256974,1.798393298438657,2.342303156814188,2.7770377461712705,,, +14.3046875,28,0.8652924373636859,0.7946284341929946,0.7109695508081626,0.6159990868372336,0.5115942506747644,0.3997930960093293,0.28275864474204904,0.16274082462378356,0.04203688818917185,-0.07704899383606345,-0.1922462570246875,-0.30135787595046243,-0.4022990057707577,-0.49313365597881,,, +14.3125,28,-0.5721087540653838,-0.6376850025354308,-0.688563988881405,-0.7237110737185046,-0.7423736562223751,-0.7440944969493745,-0.7287198646690807,-0.6964023644731677,-0.6475983975561395,-0.5830602970663417,-0.5038232776488938,-0.4111874271191148,-0.30669505551535137,-0.19210379808107947,,, +14.3203125,28,-0.06935594307081794,0.059455478615588586,0.1921232482612364,0.32636451861414323,0.5519217527103013,0.5417976156204696,0.5991645448278713,0.7226640121865762,0.9061788846325134,1.1392558695345127,1.407830650905952,1.6952051587063774,1.983208830694972,2.2534628951467384,,, +14.328125,28,2.488659517994765,2.6737666206474042,2.7970743571282086,2.8510102799978028,2.8326663537500227,2.7440010673497617,2.591702553118874,2.3867222574516203,2.143511681473848,1.8790154148078884,1.6114906792408812,1.359235696271812,1.1393155497219207,0.9663743884415786,,, +14.3359375,28,0.8516167925996309,0.8020293299407775,0.8198965784140408,0.9026453567578341,1.0430280169032489,1.2296320074919254,1.447680165182209,1.6800659163898464,0.3412114719388605,0.6917439551636115,0.9383808785123159,1.0424385748129907,0.9867628129748984,0.7783998332794012,,, +14.34375,28,0.4475020187034553,0.04263863699429757,-0.37675800356538025,-0.7496344881435518,-1.022806914151591,-1.159222076067569,-1.1437026079381658,-0.9852813811044592,-0.7157617144945638,-0.3847278219671663,-0.05178283212984552,0.22277644802828825,0.3873953543206015,0.4073378622991525,,, +14.3515625,28,0.2701455604463774,-0.012371417811584684,-0.4059218647874219,-0.8590212356725965,-1.3109563379374558,-1.701186714886692,-1.9787186966454509,-2.109992351577552,-2.0840531957842847,-1.9142034310816767,-1.6358758118578824,-1.3010615831608108,2.5789563141578857,2.065990567706009,,, +14.359375,28,1.509108652116434,1.0507134050965274,0.8036632564256259,0.8204513254070731,1.078948694021578,1.4886180094056431,1.9154930974581783,2.2190769125296717,2.2910435474049704,2.08513546175638,1.6300601026724082,1.021849353816313,0.3977737968434868,-0.10104101510459762,,, +14.3671875,28,-0.3680526693345133,-0.3602618298677116,-0.1097591172954654,0.2853035755442122,0.6878407380708758,0.9596229503676179,0.9993696611402996,0.7707030875911403,0.3123001677185325,-0.2725413928717351,-0.8440648119320783,-1.2642266904746449,-1.43441944926965,-1.3224061048765905,,, +14.375,28,0.4598607025020286,0.5902979923908862,0.7154078014401486,0.833006417978812,0.9410331791042,1.037586495020618,1.1209570933767352,1.1896579015275548,1.2424500435148966,1.2783644965922931,1.2967190281115335,1.2971301162317062,1.2795196457370148,1.2441162617362391,,, +14.3828125,28,1.19145135755267,1.1223497670661906,1.037915324489146,0.9395115444260188,0.8287377605093535,0.7074011404155283,0.5774850672733711,0.44111444109100106,0.3005185077587686,0.1579918664760197,0.015854338333932627,-0.12358960126340054,-0.2580911160356134,-0.3854963226118817,,, +14.390625,28,-0.5037839363146239,-0.6111005898063709,-0.7057932062056395,-0.7864378598672118,1.9085511903930847,2.1150434977530463,2.2828631069442986,2.3979119420097232,2.4496626768383623,2.4318990394013724,2.3431556877492787,2.1868269689370288,1.9709369614938048,1.7075868214541297,,, +14.3984375,28,1.4121179542899616,1.1020493511414162,0.7958631757331759,0.5117232701101141,0.26621592491348656,0.07320070722239147,-0.057148535801560325,-0.11904564083768775,-0.11148812698610623,-0.038319632009406135,0.0920455504548594,0.26721660672826403,0.4716975640422629,0.6879750970559715,,, +14.40625,28,0.8977469071860424,1.0832049996328983,1.2282843551117881,1.3197899067437129,1.3483232190951222,1.3089442341682178,1.201521924184262,1.0307493849986291,-0.9701606489563372,-0.7025236242749784,-0.5471591630611582,-0.5350542017304628,-0.6743035276899904,-0.9488075030418208,,, +14.4140625,28,-1.3207410015862489,-1.7364092166408216,-2.1345784588502164,-2.4559845540904544,-2.6525380168629926,-2.6947923853041824,-2.5765126068281576,-2.3156320263453085,-1.9514490031747642,-1.5384998599793869,-1.1380625250897816,-0.8086142405841085,-0.5967295971854233,-0.5298365527017791,,, +14.421875,28,-0.6119586790434448,-0.8231067412319459,-1.1224142886995505,-1.4545287695119202,-1.7582625938382437,-1.9761565551319968,-2.0634658948743514,-1.9951692057621448,-1.7699083051837106,-1.4102452130344625,-0.9591959840436246,-0.4735810312029298,-0.009641687960288971,0.3239349219543233,,, +14.4296875,28,0.4194995406736802,0.2499671657949457,-0.13693214540869747,-0.6318184466460709,-1.0937434820688212,-1.3889431683886877,-1.4276388632751182,-1.1887999081522649,-0.7260792351054368,-0.1532935882762602,0.38657400448924095,0.7603559223981804,0.8809840856755969,0.7311342017322546,,, +14.4375,28,0.3677520561686083,-0.09377653094425828,-0.5114713924030486,-0.7558892562426721,-0.745813732109499,-0.4707204247958627,0.006141832933264757,0.5649000093389532,1.0617379335771129,1.3681541706925548,1.4060388514814517,1.1689573446213084,0.7238087847634188,0.19240595749432465,,, +14.4453125,28,-0.8518646195191039,-0.9011779388020632,-0.9337722372279208,-0.9493423987870288,-0.9478890044338084,-0.9297182068888038,-0.8954362500136541,-0.8459387287888821,-0.7823947780225171,-0.7062264667139879,-0.6190837589514329,-0.5228154798550019,-0.4194367950258453,-0.3110937730217933,,, +14.453125,28,-0.20002565144867893,-0.08852546747505463,0.021100257779871123,0.12657207497472778,0.2256776921606989,0.3163108882946699,0.3965085731756973,0.4644853447843152,0.518664938829026,0.5577080197090022,0.5805358261718254,0.5863492575203589,0.5746430660586835,0.5452149071567978,,, +14.4609375,28,0.4981690883510053,0.4339149517181694,0.3531599177290031,0.2568973122635527,0.8058223040950812,0.5398032116049178,0.2487158346921717,-0.04956730300162114,-0.3365664768818675,-0.5944789820955029,-0.8074164365412014,-0.9625088943851764,-1.0507987852688678,-1.067862349806322,,, +14.46875,28,-1.014115243756513,-0.8947810064217897,-0.7195245975882801,-0.5017765623738932,-0.2577949560380935,-0.005530446832757885,0.2366262608187041,0.4511273351892568,0.6224915961903711,0.7383838265843383,0.7904743526659297,0.7750189549504605,0.6931186725049181,0.5506413873997344,,, +14.4765625,28,0.35781066171389764,0.12849050385422878,-0.12078405444397172,-0.3719629628852353,-0.6067431198857175,-0.8078482932665703,-0.9602377326036468,-1.0521591833292907,-0.01522741326901711,0.35860688336971513,0.6040954689803921,0.6976127730095487,0.6393559061729346,0.4532553263920615,,, +14.484375,28,0.1831885147264768,-0.11391330489386806,-0.37699144303795296,-0.5504284111892666,-0.5927683162320849,-0.4832304488973656,-0.2250012592868468,0.15520829724819107,0.6112713639314322,1.0847800554012963,1.5140955504236646,1.8439040374066933,2.033790342834597,2.0644940591296206,,, +14.4921875,28,1.94087393563508,1.6911189850742785,1.362329334090561,1.013155259588086,0.7046410365737467,0.4906998135871933,0.4097031810475288,0.4784954579637295,0.6897650389650308,1.0131822427313617,1.4001264293839426,1.7912660857771705,-0.6101888227096953,-0.3899514203627631,,, +14.5,29,0.015176665122900557,0.4807199579828675,0.8635444457449116,1.0411751995259446,0.9454724479404693,0.5814355594063939,0.025980198734970927,-0.5929774967424877,-1.131398781971073,-1.4684048411436037,-1.5391995720894192,-1.3526113269929767,-0.988447900135521,-0.5753917177728607,,, +14.5078125,29,-0.25549559442123004,-0.14501184564987046,-0.3022924880308343,-0.7115602877366786,-1.2870006797179956,-1.896055202487108,-2.3955344787835173,-2.6706552449348693,-2.666304444788618,-2.401963621902357,-1.966204938623438,-1.4922688124137702,-1.121417964543187,-0.9641126260575608,,, +14.515625,29,0.1463891898139953,0.023144453519061026,-0.11110734497929796,-0.2544460672188226,-0.40479438488543934,-0.5599539274205647,-0.717643547448006,-0.8755390341295154,-1.0313135791992099,-1.1826782872482084,-1.3274220210641607,-1.4634498844629398,-1.5888196689189624,-1.7017756259474437,,, +14.5234375,29,-1.8007789740194742,-1.8845346059739567,-1.9520135294125032,-2.0024706472857914,-2.0354575674681445,-2.050830217161439,-2.048751128936332,-2.029686358518065,-1.9943970884212745,-1.943926064588384,-1.8795791036619407,-1.8029019948284464,-1.7156532008193484,-1.6197728362026569,,, +14.53125,29,-1.5173484662874226,-1.4105783256349118,-1.3017326003437388,-1.1931134521912237,-1.0759728623774572,-1.0286889260726657,-0.9121809394477368,-0.7330604490123984,-0.5022213927640798,-0.23408610397762802,0.05439452637652386,0.34491702093045035,0.6190954313529857,0.8597370437814491,,, +14.5390625,29,1.052034730697072,1.1845928185203685,1.2502149500063575,1.246399017631847,1.175504671275568,1.0445817361150258,0.8648715226287887,0.6510158209731983,0.4200287561770912,0.19010321710761668,-0.020664892166360804,-0.1955455995005576,-0.3203485055795721,-0.38441925999870985,,, +14.546875,29,-0.381389368356156,-0.3096270274087767,-0.1723575338361374,0.02255514587396612,0.2631504282864359,0.534199004892304,0.8182588564247748,1.0968857649063632,2.125811191967347,2.3509966948692336,2.430319898692084,2.349248645970973,2.1175110814692912,1.767610209168528,,, +14.5546875,29,1.3497944431443147,0.9242673338424658,0.551849648271891,0.28454802174380833,0.15749893691809225,0.18354255881668927,0.3512713291292185,0.6268570009887711,0.9593712746389628,1.2887710403553412,1.5553042024590018,1.7088707908714027,1.716881027943217,1.5693861240052562,,, +14.5625,29,1.2806823620918966,0.8871383376924538,0.4415834860389051,0.00513163163796565,-0.3622871903374405,-0.6112121902079575,-0.7103085579548806,-0.6512031476270652,-0.4497461660106783,-0.14350257545933826,0.2141358513093184,0.5623005504349351,-1.8996509610234815,-2.3953289805718723,,, +14.5703125,29,-2.7589557650041687,-2.8833198013194288,-2.724087413723624,-2.312022772574231,-1.7446475506674484,-1.1596252574589103,-0.6971638092356554,-0.4617394845246632,-0.4936312320945749,-0.7580654182932128,-1.154944463968889,-1.5464912664606647,-1.7952310110296994,-1.8018987131962958,,, +14.578125,29,-1.5328811117902843,-1.0296697953035814,-0.3977325869803091,0.22214896669167933,0.692222643016748,0.9152825986951784,0.8610802451430812,0.5743925645390764,0.16253855299825087,-0.2342329689210657,-0.4813666088766352,-0.4870476181023137,-0.22751805933573466,0.2462777954080113,,, +14.5859375,29,-1.0870144847295202,-0.9856803612136068,-0.8912672815785017,-0.8058050106319541,-0.7311611224784992,-0.6690080873709656,-0.6207937774215757,-0.5877159077377709,-0.5707008606327345,-0.5703872638191279,-0.5871146102438056,-0.6209171189455676,-0.6715229445438949,-0.7383587493111489,,, +14.59375,29,-0.8205595578799094,-0.9169837221373386,-1.0262327343770319,-1.1466755418818566,-1.2764769372947111,-1.4136295277573137,-1.5559887231389415,-1.7013101308054934,-1.8472887022373683,-1.9915989461351709,-2.131935503964011,-2.266053377550003,-2.3918071044248945,-2.507188195037412,,, +14.6015625,29,-2.6103601763884896,-2.6996906285459046,-2.7737796531556516,-2.8314842755332883,1.3519139246612435,1.5667173648022368,1.7273642332591723,1.8235834629818253,1.8494764235405348,1.8039239437343118,1.6906603329174423,1.5180092493426025,1.2982998436093909,1.047003900046509,,, +14.609375,29,0.7816541538190356,0.5206192201294411,0.2818205700194132,0.0814810277629554,-0.0670079340229236,-0.15402111038843525,-0.17437149325896173,-0.12767235564589852,-0.01836423996351444,0.1445950323197096,0.34835571304657875,0.57707323308224,0.8130145016417799,1.0377962509639194,,, +14.6171875,29,1.233669069278465,1.384757578239186,1.47817026836232,1.5049015943860402,1.460463418073792,1.3452017586714575,1.1642767549914768,0.9273072276839716,0.8421575212274781,1.0060984096065215,1.0251796164243714,0.8936506244234922,0.629866126366431,0.2734397987402213,,, +14.625,29,-0.12091703079186115,-0.4919122081113467,-0.7812185542963289,-0.9425618393691126,-0.9489354114152216,-0.7968177267152338,-0.5067358197597074,-0.1200868707165722,0.3072871710538816,0.7137712397072412,1.0415445636467036,1.2455538151977996,1.3004945568119708,1.204713776136134,,, +14.6328125,29,0.9804258744050048,0.6702086860774377,0.33032552565420964,0.0219136326415863,-0.1985882838395553,-0.2882821756235312,-0.2245449799366976,-0.008605951637889686,0.3345904698119321,0.7602151879131835,1.2104820370286775,1.6235937136682812,1.7226128761762016,1.8244574236516289,,, +14.640625,29,1.6455970321769722,1.2414798899529322,0.7269249346572753,0.2446921062960645,-0.0735834670672918,-0.14338723531503694,0.049613568652557394,0.4457626358514625,0.9279034547942738,1.3536438705230345,1.5945520530525352,1.5715397692185449,1.2767336743556523,0.7758384618819479,,, +14.6484375,29,0.1903422160794352,-0.33556111006932354,-0.6742686442895365,-0.7495169974688063,-0.5570607772037082,-0.16561599673540262,0.30218806442295465,0.7036259560307483,0.9151918557408452,0.8666368735218082,0.5603974444307467,0.07108837637265814,-0.4748020652284562,-0.93345147639473,,, +14.65625,29,-2.871938353120272,-2.8945676417732327,-2.8990997561329843,-2.885568849725366,-2.8543149328973727,-2.8059778405824822,-2.7414859555646967,-2.6620398847421622,-2.5690913742568253,-2.464317832722984,-2.3495929086882263,-2.2269536375405297,-2.098564733150977,-1.9666806495235043,,, +14.6640625,29,-1.8336060767735287,-1.701655563169551,-1.5731129702630249,-1.4501914710636656,-1.3349947916928946,-1.2294803751798775,-1.1354251124038142,-1.0543942402262363,-0.9877139514060866,-0.9364481958846764,-0.9013800796400441,-0.8829981868017404,-0.8814880645063766,-0.8967290195744273,,, +14.671875,29,-0.9282962830736292,-0.975468504841542,-1.0372404467069538,-1.112340652121593,0.6477046180509539,0.34174273982273146,0.027428202270058905,-0.2767497378079119,-0.5531027304721061,-0.7859707997106528,-0.9628081412018404,-1.0750515483455787,-1.1187109226681768,-1.094640705091078,,, +14.6796875,29,-1.0084733153907903,-0.8702192568048362,-0.6935617876011306,-0.4948953605536122,-0.2921748994336183,-0.1036561728124405,0.053384880210298524,0.16386454979468368,0.21595091900051447,0.201896687257182,0.1185871609096376,-0.032234819615161066,-0.24408271821894426,-0.5061709860433774,,, +14.6875,29,-0.8041595968627213,-1.12114653311637,-1.4388390301811047,-1.7388219208573072,-2.0038346506931344,-2.2189679298093186,-2.3726965905526614,-2.457676641828649,1.9433129657531392,2.12766856491527,2.155440345140102,2.0294135078790463,1.7758955907511782,1.4405715986148158,,, +14.6953125,29,1.0813431367176238,0.7592671323261104,0.5290057181672972,0.4302749767644905,0.4816246524034411,0.6775178613772742,0.9891658224947532,1.3689877481727917,1.7580013803192265,2.094993172851367,2.3260399137842778,2.412898821136485,2.3389593675734695,2.111829841489213,,, +14.703125,29,1.7621557887568686,1.3388543627323963,0.901506830212042,0.5110940922974353,0.22051814258983932,0.06638570620112727,0.06333369185568694,0.20178016926719144,0.4494510216835023,0.7564443242936942,1.0630434626690122,1.3090618585631262,-0.8620546651698572,-0.3768365616650343,,, +14.7109375,29,0.17032053402755115,0.6361913946751288,0.9019770575566224,0.9058226877919549,0.6597070160529285,0.2460749977672096,-0.204862685424992,-0.5509408310190393,-0.6771457421690544,-0.5272970049356065,-0.11962054817908765,0.4580567142190866,1.0721753800689722,1.5798353992023462,,, +14.71875,29,1.867739290214244,1.8830155934355681,1.6474768676060791,1.2514066768459071,0.828580528985427,0.5193689421299305,0.4320371325134497,0.612850033982362,1.0331780282025247,1.5971393069121584,2.167686221546127,2.6039879230919434,2.7998654953468325,2.7127471868759483,,, +14.7265625,29,-1.1992537827683285,-1.2962472309962774,-1.4014015420571326,-1.512644113402808,-1.6277855809278683,-1.7445582549775458,-1.860655933059444,-1.9737743920806403,-2.0816518510302133,-2.182108695549947,-2.2730857687448305,-2.352680557699657,-2.419180642003144,-2.471093818521472,,, +14.734375,29,-2.5071743748646025,-2.5264450514134627,-2.528214307274955,-2.5120885877514048,-2.4779793784339663,-2.4261049223134656,-2.3569865697486376,-2.271439825108622,-2.1705602467643543,-2.0557044472210286,-1.928466525973485,-1.7906503476432052,-1.6442381506958237,-1.4913560362914884,,, +14.7421875,29,-1.334236941448528,-1.1751817447411643,-1.0165191854603983,-0.8605652979304986,-2.471250953854082,-2.415628324764864,-2.2977234561475046,-2.128669009959973,-1.9230337855619573,-1.6978015481977655,-1.4711817301941823,-1.2613349495708164,-1.0851022301641544,-0.9568265485573192,,, +14.75,29,-0.8873488941923052,-0.8832488589422901,-0.9463827198847996,-1.0737512331079435,-1.257706363816561,-1.4864825421136736,-1.7450154028341542,-2.015990919822185,-2.2810517780858106,-2.5220768617598384,-2.722444636359968,-2.868192326106956,-2.9489900527924657,-2.958862005152312,,, +14.7578125,29,-2.8966043472572105,-2.7658707209509696,-2.5749193762801537,-2.3360395588008847,-2.064697148296771,-1.7784591201342808,-1.4957718231301873,-1.2346782608702087,1.4432635993544611,1.4313924310360917,1.261558316534627,0.9461423226642685,0.5199228774024677,0.0347149717085247,,, +14.765625,29,-0.4486430001672783,-0.8697069547681874,-1.1777828186670156,-1.3397633059098824,-1.3452254484138817,-1.2079952063548225,-0.9639357550734148,-0.6653042244074845,-0.3725561435446899,-0.1448743719387383,-0.030897957504248837,-0.06109521484377424,-0.2429692102434363,-0.5598426664728763,,, +14.7734375,29,-0.9734117742916188,-1.4296713566377872,-1.8672887105951144,-2.2271220417717643,-2.46140111251345,-2.541140319536201,-2.4606297064481155,-2.238304524421074,-1.9138579946750685,-1.5420470472605696,-1.1841558763505473,-0.8984469387558746,1.3826110689648148,1.0040705052389538,,, +14.78125,29,0.8522572282207942,0.964236998262164,1.3020480976600908,1.7631314307679296,2.208487526971939,2.5008430620664095,2.54236600188991,2.3015919835561736,1.822181235150294,1.2111048574806431,0.6094969152249317,0.15415940779641812,-0.059731189335503476,-0.004496566109709055,,, +14.7890625,29,0.2726806280359323,0.662919777974259,1.025721444819491,1.2277167487741496,1.179464793280654,0.8602108844338252,0.3238178844445189,-0.3157570629739968,-0.9154621578657014,-1.3421329099160837,-1.508774636738382,-1.3982034329500792,-1.0675680985096294,-0.63251534011913,,, +14.796875,29,-0.7095830711687127,-0.5657430401283154,-0.4310854984446134,-0.3074849942203273,-0.1966177303989209,-0.099932440421035,-0.018625249004357247,0.04638104189668113,0.09445287937518654,0.12525681936344168,0.13876512990649748,0.13525603993689395,0.11530862932572115,0.07979244981924705,,, +14.8046875,29,0.02985205873013763,-0.033113263668310244,-0.10747425776076892,-0.19140045583106705,-0.2828924770023047,-0.37981728026210815,-0.4799457581569234,-0.5809920127530978,-0.680653626014684,-0.7766522193224912,-0.8667735918094692,-0.948906734553988,-1.0210810373570005,-1.0815010364845716,,, +14.8125,29,-1.128578094803537,-1.1609584594636129,-1.1775472057012095,-1.1775276473764429,-1.0115638161779492,-0.8400178742836637,-0.7298907175498458,-0.6866114470480029,-0.7108144833841865,-0.798300680347635,-0.9403357507358936,-1.1242651813009594,-1.334402743418356,-1.5531306268881988,,, +14.8203125,29,-1.7621344666393943,-1.943687125151096,-2.0818916931232843,-2.1637970143706013,-2.1803079298914536,-2.126826750629933,-2.0035812104687682,-1.815616013496193,-1.5724485480398207,-1.2874127585315966,-0.976736911903269,-0.658419551529844,-0.3509820047174764,-0.07218441807782305,,, +14.828125,29,0.16220516152340214,0.3395028416862449,0.4509859394315856,0.4924938934120272,0.4647111464911693,0.3731122887819193,0.22757330259393385,0.04167603420210048,-0.7310867123656221,-0.7089595637616789,-0.8354889702479941,-1.0901169093902752,-1.4315224297052682,-1.8040779987975517,,, +14.8359375,29,-2.1465379046344384,-2.401605312541191,-2.5248877068204503,-2.491845690632177,-2.3016526460692144,-1.977363890412482,-1.5623687652752456,-1.1136780345617734,-0.6930918721236952,-0.3576238182023617,-0.15067196074905842,-0.0953122050646258,-0.19075796176779614,-0.41253739118962196,,, +14.84375,29,-0.7163603092199649,-1.0450721728203254,-1.3376117334440425,-1.538576865195314,-1.6069083501198578,-1.5223387893110778,-1.2886019068924115,-0.9329021062490332,-0.5017266311334561,-0.05365235207221547,0.3497326879952707,0.6533791868648977,-0.025667017524951485,-0.3057756362452088,,, +14.8515625,29,-0.7834207683907964,-1.339263640281727,-1.8300564858198376,-2.127894651440144,-2.155286172177043,-1.906427071018064,-1.4488510254577411,-0.9050006407548016,-0.4187702590010181,-0.1161888965454878,-0.07101773919526444,-0.284689525008885,-0.6860863093831346,-1.1512148619739972,,, +14.859375,29,-1.537385476662902,-1.7225249175358166,-1.638847020682511,-1.2916507967010755,-0.7580919313092177,-0.16626223840546905,0.3396913946525524,0.6388508673536992,0.6664491267478803,0.4314099010521356,0.013699802574322684,-0.4577795636863551,-0.8406985505749421,-1.0184723818244923,,, +14.8671875,29,-1.160375874236086,-1.1258701612211426,-1.074095084933988,-1.0054402750546674,-0.920593822441092,-0.8205304592081206,-0.7064947176264911,-0.5799793626014884,-0.4426994752535621,-0.2965626412753745,-0.14363576594013205,0.013890903286172512,0.17374191668907055,0.3335962570930091,,, +14.875,29,0.4911277756013324,0.6440457203795752,0.7901346489301735,0.9272930251113614,1.053569825173438,1.1671985119464083,1.2666277824000276,1.3505485502843848,1.4179166914889632,1.4679711539445448,1.5002471150586325,1.5145839563911203,1.5111279160223354,1.4903293722579305,,, +14.8828125,29,1.452934806316169,1.3999735848136032,1.3327397935634429,1.252769440855357,-0.1682455907553842,-0.3842510827782122,-0.5880507398766399,-0.7622871415650737,-0.8917514091774483,-0.9644494056966068,-0.9724435130173612,-0.9124112748658606,-0.7858819380512158,-0.5991343865437807,,, +14.890625,29,-0.362763575684815,-0.09094569106218547,0.19954673382863333,0.4905110701194138,0.7635808970114116,1.0015040592241071,1.1893433611058308,1.3155161740868422,1.3726004664227445,1.3578510514881512,1.273390057446493,1.1260583378729738,0.9269381857480032,0.6905806334678809,,, +14.8984375,29,0.4339912208549368,0.17544495510181268,-0.06678690322641223,-0.2757094461970936,-0.4367873777759617,-0.5389564188402403,-0.5753923351635316,-0.5439839680752485,0.8173107277783104,0.8228131255151172,0.6753151431386741,0.4035120688098631,0.05486881921881287,-0.3117968740615131,,, +14.90625,29,-0.6354958652818121,-0.8625834279484411,-0.9551272969255294,-0.8968244900541759,-0.6955452913480739,-0.3821081360733022,-0.005476215934042239,0.3748760204704425,0.6982374721152526,0.912131463753196,0.9805080444726221,0.8893814100079303,0.6490342682608753,0.29244566544474865,,, +14.9140625,29,-0.1298130118216681,-0.5574190600994646,-0.929655420098258,-1.1948263867428317,-1.318265743717312,-1.2876902481882777,-1.1150648788708055,-0.8346895823450066,-0.4978057832268595,-0.16456299669669844,0.10540293383279586,0.2623121995294916,-0.09982577473353356,0.4292601915215768,,, +14.921875,29,0.8469491564481236,1.0390842951829065,0.9512119262624724,0.6034977445596463,0.08521427326443806,-0.4696897457015819,-0.9192426372309266,-1.1522807040760257,-1.118815090232217,-0.8436128573640008,-0.4192711995263216,0.019315789222486057,0.3320984745132758,0.4124402603575519,,, +14.9296875,29,0.21654118587520788,-0.22434941472302106,-0.8122802445788404,-1.4092196320895756,-1.874657277996228,-2.1038827796338846,-2.0564520927409364,-1.7670422897718232,-1.3357217997954165,-0.9003048806288729,-0.5983691954681775,-0.5293483273397139,-0.7270904364067368,-1.150405701828665,,, +14.9375,29,1.1618134294565283,1.061806770664287,0.9548345795409098,0.8430954468120284,0.7288628288531791,0.6144451318775526,0.5021451893070346,0.39421984193119824,0.2928403286480298,0.20005418139634767,0.11774929153612344,0.0476207769160506,-0.008858770176557007,-0.05046513319579904,,, +14.9453125,29,-0.07624396697581848,-0.08552756241556891,-0.07794658663374998,-0.05343659300263015,-0.012239187051928946,0.04510217218811796,0.11775166189876418,0.20459571008523814,0.30426247919285604,0.4151458775756427,0.535433678373485,0.6631392534376311,0.7961363666371385,0.9321964173046694,,, +14.953125,29,1.069027481682918,1.204314468734864,1.335759687177467,1.4611231133869007,-0.4474772891012154,-0.29328044116528657,-0.09294337014673704,0.138651656873715,0.3843321888617121,0.6258377013075297,0.8450978415873864,1.0254976611259876,1.1530415931690996,1.2173349951933088,,, +14.9609375,29,1.2123147962823857,1.136678285004648,0.99398012250184,0.7923908007876822,0.5441333743718604,0.26463772799502344,-0.028528659946281926,-0.31687891330996953,-0.5822889813252421,-0.8082544921438102,-0.9810346093361408,-1.0906031435920047,-1.1313406126779455,-1.102419007250561,,, +14.96875,29,-1.0078524487167977,-0.8562102237074729,-0.6600122231995007,-0.4348489611461918,-0.19828755324863198,0.03136003799311965,0.2363205814569335,0.4006054547691719,0.2740485785846196,0.13121582035362245,-0.1513449881474802,-0.5368137009208547,-0.9720735850826079,-1.3959331942808124,,, +14.9765625,29,-1.748607320574333,-1.9809805867071928,-2.062211087139147,-1.9844900224696391,-1.7642162297456203,-1.4394028975570845,-1.063720598285431,-0.6981046664335621,-0.4012343021249869,-0.22036649683771914,-0.18395259537312847,-0.29718763466308595,-0.5411857854474632,-0.8759104185347626,,, +14.984375,29,-1.2464024945965615,-1.5913372246145068,-1.8525762868085736,-1.984227801711537,-1.959802915217474,-1.7763542817605416,-1.4549518038613651,-1.037421455303381,-0.5798550393872309,-0.14390165784873454,0.21280284289176946,0.4455779353945257,-2.5848969204981613,-2.697902541356644,,, +14.9921875,29,-2.5274843151881874,-2.1190686365286298,-1.5806600565015716,-1.0532217398924115,-0.6720457354842773,-0.5297003420356613,-0.6507094093707833,-0.9849028360297238,-1.4212601070031756,-1.8184519898755904,-2.043708852751557,-2.0093618082616835,-1.6970405249826672,-1.1628943253288802,,, +15.0,30,-0.5224039908552732,0.08105486026279818,0.5152828670249274,0.6952562519975749,0.6061901001260566,0.3073467524928151,-0.08445229539602989,-0.42708991984249145,-0.5923476771400338,-0.5012867506420049,-0.14611656001211626,0.4074445597748501,1.0379655870268294,1.6013804283402546,,, +15.0078125,30,1.5782616550580322,1.6851667230895813,1.77999945377428,1.8611229645248717,1.9271310782985696,1.976873013713913,2.0094736084954974,2.0243487220834395,2.0212155476603098,2.0000976529766716,1.961324661654173,1.9055265804861008,1.8336228720017305,1.7468064635665823,,, +15.015625,30,1.6465229729495827,1.5344455140467859,1.4124455238342142,1.2825601212958722,1.1469565697867892,1.0078944650124195,0.8676863106284873,0.7286571716878432,0.5931041123169183,0.4632561277684055,0.34123527234564344,0.2290196637516867,0.1284090115513592,0.0409932732452245,,, +15.0234375,30,-0.031875013321664425,-0.08910423686127689,-0.12988264735672062,-0.15369238715414135,0.5111319261410852,0.5586416347436142,0.5383522060444051,0.4502965483112745,0.2993261559067601,0.09477817536342714,-0.15017056237498616,-0.4194175107635579,-0.6950526556072005,-0.9586030745996276,,, +15.03125,30,-1.1923170321567018,-1.3803980756906091,-1.510103085329634,-1.5726277153684018,-1.5637174908471951,-1.4839619528660863,-1.3387513475005188,-1.137898884320075,-0.8949549106181225,-0.626260830359719,-0.3498087444825181,-0.08398633602085476,0.15370547503143306,0.3478726842003371,,, +15.0390625,30,0.4863010771363654,0.5608070121136415,0.5678067842138834,0.5085648699902537,0.3891037449171417,0.2197815663392556,0.014567176237377688,-0.20993701424434985,0.5296193803646665,0.4638213098711632,0.2709043168617584,-0.0061701829473709,-0.31094060436795634,-0.5822907259840925,,, +15.046875,30,-0.7640221107030571,-0.8136621944416957,-0.7091358639026293,-0.4522611100179298,-0.06852400482743315,0.3968322397339456,0.8857952742868178,1.3365605516088683,1.6930992916172132,1.9138275028657308,1.9780261036175528,1.8890124588649684,1.6735696275326943,1.3777224877791363,,, +15.0546875,30,1.0595188922494785,0.7799404770685027,0.5933590529635403,0.539025271927758,0.6349154663750731,0.8748952447525963,1.2296418090515748,1.6511815017761906,2.0803359808940365,2.455917368428344,2.7242402870838545,2.847469322396402,1.8926261840941752,1.5112368191814864,,, +15.0625,30,1.0475588431023335,0.6447850571526551,0.4269259877014654,0.464768510118588,0.7564439722895241,1.2279317131772076,1.7533599703619385,2.189540092482092,2.415268844979268,2.364626604471013,2.0451445877366394,1.5358610164288151,0.965797778700932,0.4787551351421422,,, +15.0703125,30,0.19407167440716167,0.17410238657441768,0.40732636177003295,0.8117119009091522,1.2574147846650712,1.6025867346768918,1.7324779360353717,1.5911146515700647,1.1968678874960166,0.6376440538759317,0.04701358739731898,-0.4321821194586193,-0.6867732549657529,-0.6640825483198393,,, +15.078125,30,-0.16031837285792427,-0.1498518726219138,-0.12268871631190716,-0.07952216999686756,-0.02133059965206164,0.05063985979610508,0.13489732650099528,0.22973049907516466,0.33323882820142275,0.44336600405245136,0.5579361730240788,0.6746922495073518,0.7913356517323691,0.90556676577983,,, +15.0859375,30,1.015125429113826,1.1178307246334425,1.2116193883260802,1.2945821578718522,1.3649974256025557,1.4213616064253352,1.4624156888311055,1.4871675039515195,1.4949093225979504,1.4852304720246292,1.4580247513641549,1.4134925157550424,1.3521373925349365,1.274757686863235,,, +15.09375,30,1.1824326271272043,1.076503690837708,0.9585513378658874,0.830367558284826,-0.4356561147631199,-0.6443068466182659,-0.8186764775137496,-0.9438274074444082,-1.0081433967961426,-1.0041444698320359,-0.9290136570910552,-0.7847988339582034,-0.5782755686344085,-0.3204805310323803,,, +15.1015625,30,-0.02594798640489937,0.2882973981805377,0.6039212138201148,0.9025511195984516,1.1670511299322737,1.382709534715248,1.5382576305889173,1.6266482400516598,1.6455397461693988,1.5974519062355652,1.4895825958344968,1.3332982793359467,1.1433337550739306,0.9367569967656664,,, +15.109375,30,0.7317712933500011,0.5464382351623605,0.3974106139508502,0.2987636128676544,0.26100580839170784,0.2903389671281502,0.3882182710079364,0.5512436543492161,2.8095018160978187,2.6184697608235554,2.30547113809516,1.9197283045044464,1.5209275159776934,1.169932711592085,,, +15.1171875,30,0.9193198752331958,0.8052062188227277,0.8416467354815472,1.0184707700131024,1.3028954343261998,1.6446644136750332,1.9839115939920968,2.260524518812187,2.423549062425261,2.4391702717701085,2.29602608551312,2.007026045084835,1.6073914675461576,1.1492220679019185,,, +15.125,30,0.6934350341760449,0.3003318062057937,0.020261546258205088,-0.1141647744206915,-0.09309726786906636,0.06907504894655514,0.33602138989082536,0.6551832124193078,0.9660148341271872,1.2094668533367472,1.3372350074143622,1.3193336450008972,0.529325215057636,0.8919949009274085,,, +15.1328125,30,1.0356182769360394,0.913423891609063,0.5534940797528969,0.05112531833835365,-0.4572544725875728,-0.8314635291671053,-0.9659947888649988,-0.8189631869522817,-0.4236378287164543,0.12060207941177364,0.6754095260521469,1.1012722167800717,1.2956158571356982,1.2207664774516391,,, +15.140625,30,0.9141095759277882,0.4776633244814794,0.049925205379715336,-0.2322901125674041,-0.271560645164728,-0.03677756149648392,0.4281039155275349,1.015883657019535,1.5852687001083932,1.9993706939687144,2.1629998717243133,2.048536504745412,1.7032913140919546,1.2363395649538729,,, +15.1484375,30,0.6939247153697911,0.5513412291844297,0.4048447014952205,0.2567331275696045,0.10933487390220907,-0.035031877470264094,-0.17409950806369956,-0.30569045854737986,-0.4277551494051839,-0.5384076627984022,-0.6359585609639662,-0.7189442666209243,-0.7861524910600824,-0.8366432647880478,,, +15.15625,30,-0.8697652026010879,-0.8851667184027678,-0.8828019935095726,-0.8629315940525875,-0.8261177267759315,-0.7732142164112742,-0.7053513802309047,-0.6239160647321869,-0.5305271941095273,-0.4270072587642357,-0.31535024318179056,-0.1976865548554563,-0.07624556844571341,0.04668355888853768,,, +15.1640625,30,0.16879211476920122,0.2877923970299173,0.4014579069132827,0.5076624661694713,0.7713898465129009,1.0365590945628167,1.331418038516542,1.6384603965281517,1.93922137051054,2.2155591023080783,2.4509138344084085,2.6314569834251262,2.74705001075904,2.791946237746344,,, +15.171875,30,2.765186677290628,2.6706622905646054,2.516838337955032,2.3161600559995095,2.0841811135130373,1.8384756308784105,1.5974096385734489,1.3788576519865154,1.198953866043376,1.0709650582115835,1.0043638005590654,1.0041666125457906,1.0705832102495263,1.199001313170626,,, +15.1796875,30,1.3803080694328391,1.6015256859026894,1.8467169384037927,2.0980974167911275,2.3372769425238777,2.546543587965284,2.7101007550526663,2.815171043492676,1.1488139480853747,0.8428917709705745,0.4403091964139473,-0.004659459038545144,-0.4306237993029056,-0.7786049917168879,,, +15.1875,30,-1.0011910910728026,-1.0698942103237483,-0.979563757180769,-0.7491684701537185,-0.4188255466576353,-0.04353967095515332,0.31537282032613856,0.5998388660775719,0.7640744549710463,0.7817123234578904,0.6499014263398976,0.38973971199807056,0.042972862094406566,-0.3345267284588551,,, +15.1953125,30,-0.6814849411298672,-0.940795803722813,-1.0684455382643834,-1.0404006567676751,-0.8563870681380731,-0.5399713848389295,-0.13493155479885313,0.3015181127245976,0.7075925266265203,1.0265113867891558,1.2152935632745914,1.2514007787479464,0.44067967415115095,0.6518351878861581,,, +15.203125,30,1.0733793599919943,1.591907977402538,2.064975280733507,2.360071286639476,2.390897961456848,2.141002495608753,1.6682907622065606,1.0891840032617688,0.5467607589973096,0.17161501312340888,0.04615758994709995,0.18214394886593088,0.5175863718448187,0.9338956765841504,,, +15.2109375,30,1.2885531100692251,1.4543565607688134,1.3544832576436039,0.9837575677753728,0.4102931570863717,-0.2429425219147492,-0.8315908444431798,-1.2292227429516465,-1.3617430738465015,-1.2274515934583192,-0.8972646108679581,-0.4950387308211219,-0.16339148267572412,-0.024388442857772863,,, +15.21875,30,0.604417573044106,0.6899073429707695,0.762520422089788,0.8208783147154233,0.8638596286695489,0.8906198138846744,0.9006060485879421,0.8935670123524749,0.8695573748316593,0.8289369215253604,0.7723643318340968,0.7007857182996621,0.6154181276632871,0.5177282925946541,,, +15.2265625,30,0.4094070061107745,0.2923395673474193,0.1685728161479373,0.04027933365813322,-0.09028056425222647,-0.220798375269042,-0.3489578081521276,-0.4724753221440513,-0.5891400984460354,-0.6968527438706422,-0.7936620489777781,-0.8777991570699303,-0.947708545744468,-1.002075278519828,,, +15.234375,30,-1.0398480493530355,-1.0602576165308388,-1.0628303031479058,-1.0473963277616307,2.852889927039908,2.818926912962361,2.713790862503965,2.5427981738416623,2.315706037972576,2.046036332765806,1.7501372925072096,1.4460483753230182,1.152247473859403,0.8863678185481371,,, +15.2421875,30,0.6639740356038719,0.4974826962996302,0.3953026176665633,0.3612548503018367,0.39431278500970623,0.4886804866523443,0.6342037775135466,0.8170853884236409,1.020854291938606,1.2275216066315071,1.4188424511072004,1.5775957378844914,1.6887926461192664,1.740729485421915,,, +15.25,30,1.72581151401556,1.6410902464963382,1.4884767656891935,1.2746161463720558,1.0104317304233548,0.7103710153499639,0.39140572571108,0.07185577874035445,1.136196080821836,0.8946787102740597,0.5715369466105643,0.22413400992003973,-0.08648020782141352,-0.30513132136577736,,, +15.2578125,30,-0.3911668920614074,-0.32484011445620264,-0.11043617534116767,0.2243459371748904,0.6326601561778219,1.0557642848515132,1.4321260474374058,1.7069661645478726,1.8407522935756049,1.8153210693743798,1.6366749012752502,1.3340180907329169,0.9551825625644644,0.5591558216601137,,, +15.265625,30,0.20687507210950887,-0.04827852918838793,-0.16880482655033335,-0.1389321041854299,0.03292380676559992,0.3154717977202881,0.6594247407766002,1.0051857492304048,1.2921442278613204,1.4681337463005844,1.4975785435115438,1.3670597038932941,-1.0778158387207282,-1.6834735997441868,,, +15.2734375,30,-2.1958189866404174,-2.4943167017318424,-2.5146381561997075,-2.2661944888957133,-1.8294812731116783,-1.3339632716492202,-0.9225607867288532,-0.7124710457381469,-0.7630623123011344,-1.0596397823282018,-1.5175321386057632,-2.0053781525700742,-2.381230368578382,-2.531579939274787,,, +15.28125,30,-2.402605900876172,-2.015083055899545,-1.4588611595151102,-0.8684268556420227,-0.38624433198266495,-0.12392003854915667,-0.1318330795056364,-0.3855526259193944,-0.7927628220787264,-1.2187951327409683,-1.5237683205448271,-1.6011549427528964,-1.4072023131886764,-0.9731424344150996,,, +15.2890625,30,-1.0140928193371996,-0.9633614636682128,-0.8959408224598513,-0.8128534595371859,-0.7153880995684622,-0.6050771316665121,-0.4836698517415143,-0.3531019120912981,-0.2154615131166973,-0.07295292910144993,0.0721419933366145,0.21750369001448355,0.36081538937194096,0.4998035688119905,,, +15.296875,30,0.6322776488609725,0.7561682301760966,0.8695632039377611,0.9707411034046992,1.0582011127253883,1.130689207624373,1.187219970323914,1.2270936968020885,1.2499084969240708,1.2555671756611808,1.2442787749959534,1.2165547496062052,1.1731998433845106,1.1152978266422375,,, +15.3046875,30,1.0441923438342844,0.9614632072637446,0.8688985519617296,0.7684633394143509,-0.22988086392972545,-0.4966039034235483,-0.7135030267234177,-0.869183717112791,-0.9564550344447286,-0.9728244459474306,-0.9206652161397296,-0.8070446974747995,-0.6432255093026445,-0.4438744027674104,,, +15.3125,30,-0.22603399268080746,-0.007929072878909593,0.19230923401487954,0.3579125124816781,0.4746487715347093,0.5318189871297387,0.5230069686686263,0.44653025093146426,0.3055605619635172,0.1079054597165212,-0.134533641200966,-0.4065892641787585,-0.69088376613931,-0.9690397064332941,,, +15.3203125,30,-1.2229602888224234,-1.436090589057046,-1.5945716195957305,-1.6882067549951154,-1.7111731253658344,-1.6624283686362584,-1.5457843751534963,-1.3696428790062476,1.0874339256703385,0.6921747351347485,0.2321943559787802,-0.232047418037524,-0.6399184519139519,-0.9400135635788448,,, +15.328125,30,-1.0981141135197667,-1.1024683750042967,-0.9655704848129048,-0.7221611499130343,-0.4237617765846558,-0.13059363449560307,0.09785903030526066,0.2121718020256349,0.18073645460878074,-0.0052575227410113215,-0.3303924266923016,-0.757365968563922,-1.2327442893360436,-1.6952285859829397,,, +15.3359375,30,-2.085148060892335,-2.353700893281854,-2.4705041704116733,-2.428277095441967,-2.243928285317959,-1.9558780419984327,-1.6180328898501497,-1.2913510848607297,-1.03431300468378,-0.8937808826902681,-0.8976716894443308,-1.050584539584952,0.6285465976735514,0.8329170010009884,,, +15.34375,30,0.7568279329442121,0.4353539070220089,-0.030990996892861906,-0.5039046530917424,-0.8452846342440546,-0.9551401270748836,-0.7990369475578453,-0.4175534499137458,0.08484439598344128,0.5684596884861847,0.8966988325481936,0.9735765942510975,0.7701122875468903,0.3323818228583598,,, +15.3515625,30,-0.2309822608170508,-0.7784181436243179,-1.1740708794659651,-1.324849892510597,-1.2057531506338013,-0.8665192240786199,-0.4177860087549759,-0.0005515888817502201,0.2526908351738993,0.25449008965311315,-0.013369637876417872,-0.4946520932696876,-1.0738607670312343,-1.6076777174633776,,, +15.359375,30,0.6622647617440088,0.5525151522190207,0.44149305164360775,0.3315031124603232,0.2248355427581712,0.12372580043782982,0.030315243398469364,-0.05338657511470901,-0.1255373056810708,-0.1844942764311468,-0.2288434725913661,-0.2574245142960692,-0.2693511951761096,-0.2640272219710973,,, +15.3671875,30,-0.2411568794354117,-0.20075043366714995,-0.14312417911854358,-0.06889512833315202,0.021029562739359745,0.12546824882174498,0.24298525481039346,0.3719157825910607,0.5103948291827523,0.6563896099924689,0.8077349195852714,0.9621708109373456,1.11738193355074,1.2710378417510244,,, +15.375,30,1.4208335675123238,1.5645297475150242,1.6999916019468302,1.8252260826703488,-1.146411330155489,-0.8916397756822955,-0.6229389326082049,-0.3587548921580784,-0.1170858921302983,0.08576936692873817,0.23634458643860745,0.3249409263992925,0.3462990594086741,0.2999613682383301,,, +15.3828125,30,0.1902990410410348,0.026202186620389426,-0.1795454085373459,-0.41116326829267175,-0.6509803965931424,-0.8806734781718699,-1.0825507520725035,-1.2407920145066016,-1.342558266425076,-1.3788936109001395,-1.3453564921810928,-1.242336241875006,-1.0750328419838329,-0.853101299288406,,, +15.390625,30,-0.5899854131129804,-0.3019873779702094,-0.007138083556639806,0.2760531274547542,0.5298820776165566,0.7386772552363945,0.8898856167614013,0.9749409915069333,-1.333063800292999,-1.7046127783038187,-2.1099886699944035,-2.4877983645730515,-2.7800562996106333,-2.941215702402061,,, +15.3984375,30,-2.9452665524880928,-2.789794697909829,-2.496369853118514,-2.107201981719744,-1.678586765542328,-1.272160958249718,-0.945329524308078,-0.7423554441107704,-0.6874998342594997,-0.7812806673960191,-1.0004326213606678,-1.3015741017723368,-1.6280100561239537,-1.91861076840576,,, +15.40625,30,-2.1173834665295264,-2.182245655088952,-2.0916334122720848,-1.8479150977196663,-1.4770784858386778,-1.0247397678172492,-0.5490957505179834,-0.111916691733984,0.2310176078764029,0.43854911901302296,0.4904962206938399,0.3907421768677845,-1.8753982969718823,-1.475491954059954,,, +15.4140625,30,-0.9756128116225008,-0.5183315271592814,-0.2323721864903145,-0.19722841349148929,-0.42129231423187496,-0.8394913240723179,-1.331081301631583,-1.7527197909665528,-1.977755333025193,-1.9309648675400983,-1.6092186001907156,-1.0824083624233034,-0.4743844718412271,0.07087502764414311,,, +15.421875,30,0.42859169713795,0.5272332947230408,0.3679497823297706,0.02407338559197561,-0.3791786628952073,-0.6992340834158288,-0.8154627249415057,-0.6624688192036191,-0.24825186227666424,0.34774333510853617,0.9961551558492404,1.5529140994320043,1.8984845887014896,1.9703868212207023,,, +15.4296875,30,1.9384165404239169,2.0379543041738253,2.122466619796798,2.1908404590205364,2.2422417818642213,2.276129915424051,2.292266797365312,2.290720922396915,2.2718659227561964,2.2363738076869435,2.1852029804159976,2.1195812425751384,2.040984083785024,1.9511086366752481,,, +15.4375,30,1.8518437535046413,1.7452367284648762,1.6334572484727,1.5187592037899214,1.4034410272838684,1.2898052568941851,1.1801180294848377,1.0765692154466002,0.9812338922024764,0.8960358313217792,0.8227136386813484,0.7627901406667635,0.7175455525553658,0.687994899002198,,, +15.4453125,30,0.6748700820917399,0.6786069110345837,0.6993373207125516,0.7368869154124816,0.9898545488832492,0.9354861695636528,0.8174778133816107,0.6458535465299304,0.43431413522768414,0.19927541154582806,-0.04128251572713429,-0.26907494232169865,-0.4667932860173402,-0.6193175182233637,,, +15.453125,30,-0.7147757496485171,-0.7453770690914351,-0.7079595467160201,-0.6042151762658557,-0.4405760593685005,-0.2277697583947725,0.019925185063190458,0.2856716599314236,0.5512451279023497,0.7983018381783216,1.0096556847480151,1.1704746728163709,1.2693135661190036,1.2989107096888493,,, +15.4609375,30,1.2566934666389662,1.1449570259721455,0.9707041144920392,0.74515679129346,0.4829743692143735,0.20123199949113196,-0.08176885523480315,-0.3477751122942005,0.16657668564466793,-0.1356066692783679,-0.4575866564774804,-0.738430757489851,-0.9240314862348764,-0.9755771046862848,,, +15.46875,30,-0.8756371593477876,-0.6309147820415275,-0.27123688332100543,0.1550606483861439,0.5886341143278522,0.9683513268699254,1.2407932414269909,1.3685580644410948,1.3360745034903343,1.1520187692891448,0.8479589020788707,0.4734375880192619,0.08825933411538739,-0.2468167148993224,,, +15.4765625,30,-0.4795287254433853,-0.5742367699903403,-0.5174547108048713,-0.31992786344404245,-0.014932963077536663,0.3469346286461297,0.7056743900116913,1.001262031886122,1.1830374164733026,1.217636570812503,1.0942321148832617,0.8262656403312147,0.9889455468772486,0.6600182045106601,,, +15.484375,30,0.5378053051384571,0.6785466306089165,1.0641975284089265,1.6072372108148656,2.174538090997906,2.6237553094742925,2.842264007121628,2.777973443764931,2.453573171922031,1.9603070455841567,1.4329814416467046,1.0130570023816583,0.8099389499998653,0.8710745388893745,,, +15.4921875,30,1.1690522417253382,1.6092374108506502,2.0558505440684667,2.3693395497388168,2.4448019021956777,2.2409246913072782,1.7915092018881364,1.1964196039622548,0.5944344734541109,0.12543967708058146,-0.1076776905550546,-0.06699273546564842,0.21029821350518324,0.6223051086096861,,, +15.5,31,0.7907778808458397,0.8602372135480084,0.9442101236440444,1.0413783763764226,1.150183251313913,1.2688527173005202,1.3954323473813142,1.5278194324594028,1.66379969641534,1.8010859698768922,1.9373581455211648,2.0703037153482606,2.197658180180451,2.317244623862586,,, +15.5078125,31,2.427011759275148,2.5250697800182937,2.609723390045924,2.679501432945376,2.7331826020859458,2.769816781489098,2.7887416437696406,2.7895942145445747,2.7723172008410653,2.7371599727115994,2.684674180885056,2.615704087200273,2.531371777146787,2.4330575134440333,,, +15.515625,31,2.3223755746729915,2.2011460020212783,2.071362748851888,1.935158790790504,-0.579853039509084,-0.7635668798900108,-0.8879829459310553,-0.9464291702544566,-0.9369571529593096,-0.8624744926305751,-0.7305381808901379,-0.5528234762118369,-0.34430530330437426,-0.12220927155247545,,, +15.5234375,31,0.09519452812442196,0.2898708244273204,0.4452823433193773,0.5475487643562656,0.586420625049167,0.5560002463171579,0.4551593926122636,0.28762452748560885,0.06172370455019983,-0.21018727136944027,-0.5125794129689815,-0.8278262732839856,-1.1374258253378702,-1.4232833096117012,,, +15.53125,31,-1.6689656090930485,-1.86083969729524,-1.9890157887431623,-2.0480294402490764,-2.0372150551392108,-1.9607447620797671,-1.8273299746135725,-1.6496064598162397,0.4494019617711048,0.016023615972163358,-0.4128771497006911,-0.7771463105872122,-1.0267846366043043,-1.1296820839791522,,, +15.5390625,31,-1.0765656237476071,-0.8823901470553511,-0.5839560965279781,-0.2341251784655385,0.10646462587518483,0.378894039089231,0.5351882896677073,0.5458365037960115,0.4044332449267661,0.1287190102242688,-0.2421426138517728,-0.6536272614304877,-1.044307533725575,-1.355389036209916,,, +15.546875,31,-1.5398395948725998,-1.5696898873141742,-1.4403685182535149,-1.1713964512018031,-0.8033327381721531,-0.3914473494623973,0.002893343369966161,0.3217866326039672,0.5198100355774325,0.5710899747272463,0.4733216129284522,0.2481137751788632,1.3281462200464935,1.0887019742872075,,, +15.5546875,31,0.6238149438391842,0.040444221854806665,-0.520420507212171,-0.9222537793840556,-1.0702838655947509,-0.9373581955303988,-0.5712967163124871,-0.08171862246520675,0.39004657109121377,0.7097167701403028,0.7868613578710949,0.599664722462102,0.2008625655965791,-0.2967755177054036,,, +15.5625,31,-0.7514377439550098,-1.0312413855198246,-1.0505016704461936,-0.7933569085950629,-0.31827352822930266,0.2578052028325292,0.7913240808335551,1.1512630728678432,1.2548394783315535,1.08998224135421,0.7184209372416469,0.2585449431756488,-0.14726727961674202,-0.3718925769097312,,, +15.5703125,31,1.7947688072365977,1.6524900877359208,1.5106423477197035,1.3715271572171028,1.2373876929211205,1.110369518315304,0.9924830785762094,0.8855685669256671,0.7912637775879041,0.7109755082066987,0.6458550124189981,0.5967779323681985,0.5643290624860843,0.5487922112795306,,, +15.578125,31,0.5501453385868472,0.5680610533927397,0.6019124634251767,0.6507842740450843,0.7134889420226124,0.7885876012776102,0.8744153941075175,0.9691107642760458,1.0706481989687209,1.1768738462248236,1.2855433841016617,1.3943614784046925,1.5010221379872113,1.603249260915871,,, +15.5859375,31,1.6988366614466213,1.7856868768441292,1.8618480744475727,1.9255484126370843,-1.4432458142853841,-1.225855324039806,-1.015742941376048,-0.8306335173476179,-0.6864258273818467,-0.5960770826090355,-0.5686927291878014,-0.6088850221442972,-0.7164451173566005,-0.8863515622586952,,, +15.59375,31,-1.1091146072250622,-1.3714323412486382,-1.6571129105047648,-1.948198523022444,-2.226212870903965,-2.4734449946362456,-2.6741800721467284,-2.8157913157202428,-2.8896168445744013,-2.8915603945156847,-2.8223739830873837,-2.687602826117613,-2.4971963530968417,-2.2648124520179715,,, +15.6015625,31,-2.0068634656108952,-1.7413704685791076,-1.4867057238277943,-1.2603110124646482,-1.0774812139419787,-0.9502979617782455,-0.8867877342085336,-0.8903630877394636,-0.06239470442607231,-0.4021201059083909,-0.7097946464498857,-0.9285383367281541,-1.0147508624468782,-0.9449383745322836,,, +15.609375,31,-0.7194117030085275,-0.3622797854478533,0.08226087465681073,0.5567630056962873,0.999426990327689,1.3536751838790992,1.5769111365312038,1.6470996918919318,1.5661433525099735,1.3595293077063513,1.0723023881619116,0.7619914715462273,0.4895913815897547,0.3100051907220845,,, +15.6171875,31,0.26343588039588484,0.3690684433054765,0.6220267593142255,0.9940795081947442,1.4379854431300785,1.894801490981252,2.3030156597346063,2.6080824991856897,2.7708761488356024,2.773744584963992,2.623222290091777,2.348979020670192,0.44988749049410703,1.0141604246920854,,, +15.625,31,1.50679070738888,1.8016815766400185,1.8251361038364493,1.5759131232351753,1.1254429403480448,0.5981449430244437,0.13724253528425398,-0.13455462244825633,-0.1487245590645423,0.09026638349615004,0.5061892209304841,0.9719684508155896,1.3445560192772534,1.504204886453264,,, +15.6328125,31,1.3873779452303248,1.0042722073981536,0.4361544724571985,-0.18676242282578115,-0.7208406069451889,-1.0482016382357449,-1.108836745096001,-0.9168441218922356,-0.5563449762426343,-0.1581995687148709,0.13609328509030796,0.2134170874050505,0.020282311140740084,-0.4222705592037903,,, +15.640625,31,1.9752272539453888,2.0095626836690763,2.0274948520235645,2.0282447310168576,2.0113279574978105,1.97656351987819,1.9240771363098768,1.8542992650509824,1.7679577817413523,1.666065451690914,1.5499024164184323,1.4209940009791078,1.2810842305522745,1.1321055198835532,,, +15.6484375,31,0.9761450661972066,0.8154085339049724,0.6521816668638387,0.4887905002230529,0.32756086841264165,0.1707779181622065,0.020646335336500177,-0.12074801811633795,-0.2514743855008706,-0.36979067984972297,-0.4741737439548548,-0.5633457762435701,-0.6362964599165364,-0.6923004080034938,,, +15.65625,31,-0.7309296190129118,-0.7520607252116422,-0.7558769067560128,-0.742864438292803,-0.959585996287,-1.0882697963181829,-1.2659126255190791,-1.4784321256151465,-1.709150171051936,-1.9399589493726528,-2.15258707211593,-2.329877418849035,-2.456987598036431,-2.522429303871812,,, +15.6640625,31,-2.5188740818156896,-2.4436693039474293,-2.2990283625802794,-2.091881807748452,-1.83339979703274,-1.538219146042597,-1.2234288664617816,-0.9073849194816592,-0.6084368212967504,-0.34365488374431985,-0.12764682843450526,0.02845371994539425,0.11775634150338732,0.1380869141004335,,, +15.671875,31,0.09213171762522544,-0.012757482510156515,-0.16508376356484578,-0.3500144841058339,-0.5504233711433951,-0.7480925704054928,-0.9249908196313792,-1.064538596452354,1.9991685797103576,1.6329022017009782,1.3110189956129197,1.0865911148825749,0.996642621295857,1.05637195028562,,, +15.6796875,31,1.256777915482555,1.5660590503224976,1.9345683463378285,2.302551654864785,2.609464427571861,2.803415615673172,2.849267721377605,2.734131286137212,2.4693979106124546,2.088995023878732,1.6441340832407634,1.1953700347910003,0.8032086331703291,0.5187243814701845,,, +15.6875,31,0.3756501830451259,0.3851705561767324,0.534229155603179,0.7876139616074815,1.0934950955021592,1.3915524467432403,1.6224269126336457,1.737022885938281,1.7042127900856745,1.5157433481145277,1.1875791146834571,0.7574737155037472,-2.159828781781861,-2.4394457640967326,,, +15.6953125,31,-2.439458331780539,-2.1844669240231482,-1.7670219681883117,-1.322087279444404,-0.9898963284200172,-0.8773827380474659,-1.0287569641436731,-1.4132942411780178,-1.9336815952837336,-2.452636907415917,-2.830504987152941,-2.9635269425738247,-2.8122943932080418,-2.4125899045805648,,, +15.703125,31,-1.865642224044424,-1.3104664794947527,-0.885869278667835,-0.6925309967411962,-0.7655562033385386,-1.0650140063670843,-1.4870594351859705,-1.8925861955208068,-2.145556175790736,-2.150498863724703,-1.8789012383574903,-1.3772534114806223,-0.7545428416885394,-0.15262243359190295,,, +15.7109375,31,-0.7138039286365514,-0.6697564070504738,-0.612044499897181,-0.5422290273889401,-0.4620814303622624,-0.373552510019588,-0.2787380281330398,-0.1798417701875659,-0.07913671835421587,0.021074985713885608,0.11850258707992975,0.21090706262976144,0.2961405585100515,0.37218422922783934,,, +15.71875,31,0.4371838157217904,0.4894823393076791,0.5276493389085092,0.5505061394993624,0.557146709199579,0.5469537396838287,0.5196096682262255,0.4751024482659896,0.4137259673364336,0.3360751049259028,0.2430355166951135,0.1357683238203029,0.01568997544035966,-0.1155523632868246,,, +15.7265625,31,-0.2561094666722169,-0.4039622458721517,-0.5569569244763108,-0.7128425764869791,-1.1527720007694833,-1.1793241931949463,-1.138155933619281,-1.0279842601852485,-0.8523793987624608,-0.6195231286005336,-0.3416454378396707,-0.03417873674834152,0.2853114075119864,0.5983444665397764,,, +15.734375,31,0.8868071428972091,1.1342101618802891,1.3268320366146729,1.4546700614540462,1.5121322306754763,1.4984218449996052,1.4175879977136316,1.2782384308180517,1.0929347949737247,0.8773124933359472,0.6489864943089608,0.4263194225828618,0.22713784086931305,0.06748624679942905,,, +15.7421875,31,-0.03949432130817376,-0.08448486626259287,-0.06264014141296592,0.026071961673227784,0.17686701658393322,0.38047689527002027,0.6237956226592671,0.8907932154566574,0.27914679448171154,-0.18602664919945328,-0.5785203889757549,-0.8498745242489343,-0.9701910477418196,-0.9327402150112944,,, +15.75,31,-0.7549605018698425,-0.4756966417057101,-0.14910616084483794,0.1638162847942395,0.4047764435088245,0.5272941679108272,0.5039736084652877,0.33079738127881697,0.027775741227679784,-0.3641504621248074,-0.7894707554785838,-1.1867392552023972,-1.4981373486572132,-1.6784754342490316,,, +15.7578125,31,-1.7022316595745164,-1.5675313238406838,-1.2964470974498252,-0.9315732429517032,-0.529407345004855,-0.15157028417052842,0.1447681252794203,0.3157667103559276,0.3377111504987905,0.2106741375853404,-0.04153241790194684,-0.3751054882973705,0.4070871708038391,0.10131644588625854,,, +15.765625,31,-0.31927456305598245,-0.7135901441935479,-0.9489809405190588,-0.937782107150701,-0.6615072054008927,-0.17606552394352454,0.4034284154352489,0.9340910700755982,1.2843370646068148,1.3698710016525006,1.1767402132053273,0.7651307761386432,0.2528666025899057,-0.2168660136758785,,, +15.7734375,31,-0.5147228921247806,-0.5605911615670656,-0.3454646774492498,0.06618890362270903,0.554217117604612,0.9758511294309772,1.2049891833324755,1.1669271356236346,0.8590158167393771,0.35158187861101475,-0.2311421381229529,-0.7448540000558947,-1.0645128055359,-1.1183874884928555,,, +15.78125,31,-0.8693103694899761,-1.0240338259696966,-1.1747093978825087,-1.3190966441153928,-1.4550573074153828,-1.5805926066306872,-1.6938780913639713,-1.7932954488091997,-1.8774607059094968,-1.94524833309312,-1.995810827597145,-2.0285934335454776,-2.043343741094588,-2.0401159966272906,,, +15.7890625,31,-2.0192700485807524,-1.981464947421561,-1.9276473118830981,-1.8590346652195,-1.7770940333046457,-1.6835161793609732,-1.5801859265097649,-1.46914908782562,-1.3525765829818583,-1.2327263698344455,-1.1119038575411688,-0.9924214944097672,-0.8765582381039627,-0.7665196179007598,,, +15.796875,31,-0.6643990883221643,-0.5721413508420657,-0.4915082859161731,-0.4240480918619479,1.1636337796775271,1.4239198970403757,1.6539765229873042,1.8380848630091309,1.9635801813269087,2.0217369835875747,2.0083798415446767,1.9241772587582084,1.774598078147986,1.5695334635102935,,, +15.8046875,31,1.322610806974124,1.0502473966370174,0.7705098252870084,0.501858666747349,0.2618659463757533,0.06599482880985208,-0.07347339316832513,-0.14829019709107105,-0.1548092941867507,-0.094234961146468,0.02746806227693943,0.19999681186425644,0.4094350144430146,0.6392301140485993,,, +15.8125,31,0.8713542616776105,1.0875682929037986,1.2707005357257235,1.4058512566302026,1.48143873816606,1.4900140247362414,1.4287875047058565,1.2998305914492134,-0.7331153345508791,-1.054416818951747,-1.283219398566591,-1.3778249692564852,-1.3171723321507636,-1.1041686763409022,,, +15.8203125,31,-0.7652889038659828,-0.34650492092293256,0.09382135758493038,0.4939746277703869,0.7984452301330401,0.9665220166313898,0.9785809548622579,0.8390902702043508,0.5758643381545597,0.2356828094422213,-0.123042423364084,-0.4394100041773224,-0.6595573564875129,-0.7450900848795482,,, +15.828125,31,-0.6790993922239924,-0.4688300634000852,-0.144583273758925,0.2449750571743997,0.6403697736497456,0.980559180519722,1.212425448749196,1.29903464799743,1.2253799417408346,1.0007134706645378,0.6571037591214102,0.24444335318328514,-0.036390399857892775,0.3559826626554627,,, +15.8359375,31,0.5512807381284375,0.4839273544903298,0.16167653862853315,-0.336337923584313,-0.8811307861335251,-1.3290725082580974,-1.5611274782529652,-1.5153705331796812,-1.2038710553102412,-0.7093181200886136,-0.1623123475852709,0.2944514133803283,0.5452938139180473,0.5332342472504892,,, +15.84375,31,0.2755642899867213,-0.14095655219816156,-0.5839655703698373,-0.9118807231010408,-1.0128310110096677,-0.8354626092564493,-0.40317644868412417,0.19210628378241595,0.8149436215595163,1.3232873857959104,1.6071975083121657,1.6187476179704072,1.3849276931335424,1.0000096425488916,,, +15.8515625,31,-0.3710681709678595,-0.3336122375926172,-0.3124420490814449,-0.3080240793838045,-0.32052136870183057,-0.3497906918674141,-0.3953850950096016,-0.4565617560740205,-0.5322950315304539,-0.6212944607940428,-0.7220274130719652,-0.8327459800534964,-0.9515176435199888,-1.0762591808405368,,, +15.859375,31,-1.20477321463001,-1.3347867665382365,-1.4639911400428212,-1.5900824338523605,-1.7108019764698286,-1.8239759738553607,-1.927553675895715,-2.019643393320811,-2.0985457343500302,-2.162783479020554,-2.211127568030744,-2.2426187509572797,-2.2565845147078383,-2.2526509957134917,,, +15.8671875,31,-2.230749667193357,-2.1911186843125066,-2.1342988635897333,-2.061124366865335,1.1099384223166349,0.8701631328305365,0.5950502353088793,0.3016313347028741,0.008243405941132875,-0.2667430483172,-0.5061982863378666,-0.6954212183544852,-0.8231580804386479,-0.8823808713784014,,, +15.875,31,-0.8707712848484539,-0.790876405509013,-0.6499253261729281,-0.4593194877616831,-0.2338322956103996,0.00942616176834868,0.2522070857576295,0.476400082433051,0.6653003507631885,0.8047775687743614,0.8842649578073213,0.8974995452421262,0.8429619965069615,0.7239853378979786,,, +15.8828125,31,0.5485249817887208,0.3286060850281534,0.07948677269577109,-0.18140442622864505,-0.43568283898067495,-0.6652889335928373,-0.8537472819612472,-0.9873154111443004,-0.17731572707048304,-0.5474893768726338,-0.8140988935813495,-0.9419486892941824,-0.918086169862564,-0.753793482161465,,, +15.890625,31,-0.4828010305798161,-0.15600116172521952,0.16651444849846234,0.4248533067405976,0.5686924492973894,0.5651609324458834,0.4040065014752492,0.0992414644885704,-0.3129888322080079,-0.779983190951485,-1.2406390046097848,-1.6349141328497752,-1.913122758546988,-2.0436176332671763,,, +15.8984375,31,-2.0176624523888167,-1.8507357542766087,-1.580063547044928,-1.2587652606989024,-0.9475251120259592,-0.7050863953004333,-0.579049541559791,-0.5984074684372791,-0.7689811417021516,-1.0724665364048036,-1.4692416796701866,-1.9044967920919784,0.2741879730527014,0.4953750513358001,,, +15.90625,31,0.9523425802804488,1.5452610365459238,2.135460831619313,2.5832389689280166,2.7859627369285365,2.7060290406516803,2.3810180994743924,1.913260074807961,1.4416753226856092,1.103607055699272,0.99710779138988,1.1540163995783477,1.5312049803018,2.0223947931259123,,, +15.9140625,31,2.487302890911873,2.7901310767598204,2.836848145457014,2.601046891719323,2.131288482673271,1.5379203586629189,0.9629793338956492,0.5414272357112895,0.36434175257053736,0.4541491508023934,0.7586850742139217,1.1657093133036138,1.5338945138875633,1.731793702954655,,, +15.921875,31,-1.9727082528565127,-1.870423149198536,-1.755877383302195,-1.6308869898752631,-1.4974440851542523,-1.3576821615023913,-1.2138389099628388,-1.0682172216280588,-0.9231450505808574,-0.780934841094628,-0.6438432294003185,-0.5140317255311265,-0.3935290635800448,-0.2841958794989562,,, +15.9296875,31,-0.1876923348098395,-0.10544925300881323,-0.03864327394483347,0.011823538910482044,0.045339281349702665,0.061592708744771525,0.06057847005968042,0.04259698404105139,0.008248959885440721,-0.0415753415442498,-0.1057119177845508,-0.18274362915640466,-0.2710252365519711,-0.3687124340822397,,, +15.9375,31,-0.4737943680912054,-0.5841290729937989,-0.6974812033286584,-0.8115614011991505,-1.0559424302698834,-1.0539705845327831,-0.9805308134649792,-0.8396047278788985,-0.6397486807588153,-0.3934991698170013,-0.11650103039273532,0.1735807927243666,0.4582900150096467,0.719662644276655,,, +15.9453125,31,0.9414759709696828,1.1103758289285248,1.2168035282042364,1.2556578316854952,1.2266458242112233,1.1342982180080767,0.9876480388324158,0.7995951113250509,0.5860006728712115,0.3645752648002469,0.15363746567758813,-0.02916996147061868,-0.16811696607803028,-0.250489883140088,,, +15.953125,31,-0.2674849042836843,-0.21482902631727396,-0.09308516032349012,0.0923798914090721,0.3317623742531527,0.611497864983297,0.9151997580227836,1.2247945277065613,-2.3167329407719217,-2.6473056940217257,-2.8495274872958207,-2.8959111260994685,-2.78242636159009,-2.529106685718016,,, +15.9609375,31,-2.1769119461043562,-1.7813355368598691,-1.4037519507437963,-1.1018524080292056,-0.9206582934204048,-0.8855121146189979,-0.9981376656165076,-1.23638301191249,-1.5576862750509228,-1.9057243276296807,-2.2192087346356257,-2.4414588122796235,-2.529260616204988,-2.4596318727520305,,, +15.96875,31,-2.233439009669436,-1.875302727980932,-1.4298066201390711,-0.9545991448413094,-0.5114631312644394,-0.15674354103682808,0.06737584024311838,0.13938834526423516,0.06175838181836778,-0.1395193667095188,-0.4190265544129097,-0.7190536827525942,0.8040781787901665,0.16760605967517925,,, +15.9765625,31,-0.4204464409573002,-0.8290054688062325,-0.9753040938410245,-0.8473539459132281,-0.5070304713192442,-0.07292801028341195,0.3123147480828016,0.5212623167362511,0.4767450445353874,0.17312603955253436,-0.32205724105439304,-0.8865274533435845,-1.3767261597238576,-1.667127311227488,,, +15.984375,31,-1.6846309766884588,-1.4286110255906812,-0.9711220844663192,-0.43720862887078377,0.02928772118326684,0.305052322949237,0.3209764911216681,0.08096212027392691,-0.3393004839304662,-0.8132451007748271,-1.198299284972753,-1.3751527449301515,-1.2806602444452129,-0.9253593576881104,,, +15.9921875,31,-0.9240666096509641,-1.032720625964738,-1.1353141846406407,-1.2297438680946928,-1.3140491636021363,-1.386447017493314,-1.4453632814239885,-1.4894604999628211,-1.5176615528071506,-1.5291687375171197,-1.5234779585011742,-1.5003877736720137,-1.460003140236482,-1.4027337939011162,,, +16.0,32,-1.3292872897453982,-1.24065682648799,-1.1381040672159026,-1.0231372572610278,-0.8974850222510172,-0.7630663050110179,-0.6219569675935879,-0.4763536431149772,-0.3285354702339078,-0.18082438017741576,-0.0355446315773289,0.10501769845953024,0.23865455784746364,0.3632744000350153,,, +16.0078125,32,0.4769386278568033,0.5778953626939785,0.6646099477566589,0.7357916514768046,1.5217746183414411,1.78848161129894,2.0093302070512227,2.1718876871852792,2.267733599157547,2.293039732208277,2.2488299576544124,2.140901830654265,1.9794154367312893,1.7781781701448498,,, +16.015625,32,1.5536753345050718,1.3239141802962653,1.1071620032225646,0.920666314319457,0.7794463425287738,0.6952401556787993,0.6756808335351371,0.7237591534983937,0.8376102695003146,1.0106392709671317,1.2319768768950814,1.4872334980515864,1.759499093464678,2.0305191066541544,,, +16.0234375,32,2.281964487708052,2.4967072456796813,2.6600125893540083,2.760564530214575,2.7912534338706414,2.7496706054758566,2.638275423322219,2.464223368218313,-0.9786472884528308,-1.1431623682169167,-1.1728319061259225,-1.0490184628530188,-0.777173820296382,-0.3860454177863055,,, +16.03125,32,0.07674709566044358,0.5520764872842416,0.9784669257972812,1.3016210155761876,1.4828312321829025,1.5049658589397177,1.375097294371555,1.1233635535002786,0.7982404696411961,0.4589611384744114,0.1662634602090487,-0.027092975579670497,-0.0845635111337576,0.008474435617333964,,, +16.0390625,32,0.2424326880530563,0.5849986082643206,0.9861649003875472,1.386019504604437,1.7240822468321473,1.9487339728135424,2.025269469638564,1.9413198096673705,1.7087994581310555,1.362074752597892,0.9526388848803452,0.5411226285057857,0.6810033693960241,0.9564916074903602,,, +16.046875,32,0.9590236642218786,0.7027475455291856,0.27189899972951515,-0.2024848296894841,-0.5786678949209834,-0.7432374379629528,-0.6423493618452809,-0.29663177960981524,0.204339307493386,0.7264794237826162,1.1278531141168158,1.2975037167893957,1.1858140631020229,0.8180776726946197,,, +16.0546875,32,0.2875613093890774,-0.2700396416653883,-0.7137520532694539,-0.9359005499316388,-0.8915357343500694,-0.6106504558719177,-0.18983690451442992,0.23432784823275155,0.5228723811502785,0.5726936713101128,0.3450038172349625,-0.1238373622501534,-0.7320745705504826,-1.3402232507183272,,, +16.0625,32,0.7904161035358132,0.8277430707736078,0.8473292618161093,0.8490359363084229,0.8330311856053432,0.7997868450735942,0.7500700921560328,0.6849298773995246,0.6056784261179362,0.5138681346728744,0.4112642659944943,0.29981392251071315,0.18161183984181464,0.05886360027373001,,, +16.0703125,32,-0.06615308979443538,-0.191128380335082,-0.3137608160001856,-0.4317977223672742,-0.5430747329154044,-0.6455537645642823,-0.7373587767787444,-0.8168086880600237,-0.8824468734122738,-0.9330667262525072,-0.9677328371401852,-0.9857974184568772,-0.9869116874148328,-0.9710320080522834,,, +16.078125,32,-0.9384206846494008,-0.8896413926531085,-0.8255493271013369,-0.7472762410337151,2.2388669422589196,1.9769642802151568,1.6956506394796358,1.4132444888864395,1.147971449853502,0.9166950708912176,0.733742939174729,0.6099099839330607,0.5517084694370306,0.5609169721452704,,, +16.0859375,32,0.6344597866682036,0.7646251626007198,0.93960714577482,1.1443332307977645,1.3615201005051414,1.5728838220427217,1.760420097895929,1.907665284373032,2.000850230607829,2.029866464515927,1.9889773372331727,1.8772245219027512,1.698501506087847,1.4612889382258951,,, +16.09375,32,1.1780702681038415,0.8644684150653335,0.5381636509147368,0.2176681407803983,-0.0789574194072864,-0.3353555926065148,-0.5380051431862614,-0.6771561457102919,0.18788500922357687,-0.05635071897418409,-0.15835750183725816,-0.10753723365820557,0.08247339272150067,0.37597380929711627,,, +16.1015625,32,0.7208088812499261,1.056542655927338,1.3239231750358162,1.4741638762070133,1.4765956722191382,1.3234975681033856,1.0313531319060498,0.6383368264345967,0.198421429306451,-0.2269759456278911,-0.578508332604777,-0.8080922508262668,-0.886348254201985,-0.8071300517841081,,, +16.109375,32,-0.5884370175019802,-0.2695682029674914,0.0950386394320722,0.4443232022927317,0.7201473015697823,0.8763812676237123,0.8861166262479686,0.7458815047295174,0.4762020576446378,0.1184223527806709,-0.27172205829282103,-0.6327760096395997,-1.99040421724832,-1.7072335764747038,,, +16.1171875,32,-1.2917794162823406,-0.8830703319418934,-0.6171327558037973,-0.5894924157852066,-0.8287857812733808,-1.2887157232756707,-1.8605579108531205,-2.4027920029556142,-2.7797381638102383,-2.898611188336295,-2.7348380438991167,-2.3387011029776974,-1.8214872220760585,-1.3249394598124755,,, +16.125,32,-0.9823842714519524,-0.8821883137984537,-1.0435603101301862,-1.4113298059959969,-1.8711334433423563,-2.2808460883568724,-2.509641722842688,-2.473977728035328,-2.160639212502315,-1.6305263166991486,-1.0021450382424808,-0.41932463063422587,-0.012007518650675177,0.1391438273255705,,, +16.1328125,32,-0.6562106358593283,-0.5539734505395576,-0.44238967526562906,-0.3234563866773735,-0.19930776432450986,-0.07217770094377464,0.05563933875009662,0.18182852538305166,0.3040952343023228,0.4202052666363044,0.5280240177347468,0.6255539071304818,0.7109694145934975,0.7826491087631791,,, +16.140625,32,0.8392041075067072,0.8795024716201099,0.9026891047005065,0.9082008106962012,0.8957762454289948,0.8654605877870629,0.8176048487406248,0.7528598302218638,0.6721648395875311,0.5767313572113092,0.4680219431161896,0.3477247519249917,0.21772410229532013,0.08006761609287838,,, +16.1484375,32,-0.06306949738071876,-0.2094223868098697,-0.3566760695905768,-0.5025058161200827,-0.7475020690942693,-0.7485419868942857,-0.684607673005711,-0.5645537106721449,-0.4011322418142417,-0.2100959746564501,-0.009092016917952224,0.1835763119143428,0.3502333296616259,0.4750709584440101,,, +16.15625,32,0.545258326435005,0.5518436123364254,0.49038522843248405,0.3612683125460813,0.1696844440421632,-0.07472401607332968,-0.3585301736067171,-0.6654529919903834,-0.9774869592311706,-1.276152268054156,-1.5437783419107334,-1.764731213604572,-1.9264991779540648,-2.0205610222394808,,, +16.1640625,32,-2.0429762990334552,-1.9946564881489095,-1.8812981463262684,-1.7129827131855513,-1.503470886324298,-1.2692407763075897,-1.0283369185582505,-0.7991104078789011,-0.9071313954183452,-1.0499986230613167,-1.0363855067412209,-0.8649965933542499,-0.5584455511156219,-0.15974748996828025,,, +16.171875,32,0.2743625173592177,0.6822441290401666,1.0069268183054811,1.2049541081078423,1.2531195685295062,1.1520455759442292,0.9260476063205534,0.6193053986033865,0.2889375634608078,-0.003941468836500484,-0.2037889937154236,-0.2693356236282798,-0.1800653451050198,0.060535531814298486,,, +16.1796875,32,0.4254668503487188,0.868364710566143,1.3306670871081556,1.7506791690548806,2.0731267395397452,2.257709897853952,2.2853251270249366,2.1609868741719502,1.9129938745587811,1.5884703450913815,1.245976798634013,0.9463416435500379,-0.6895971207867372,-1.027105763102639,,, +16.1875,32,-1.1782439178005821,-1.0685233461929975,-0.6954460362766214,-0.12942190143840382,0.505303366323874,1.0644851777631097,1.4232098874613728,1.5099402536368742,1.3259473387871052,0.9448046688776176,0.4920846489816752,0.11082303185420272,-0.07778239422231427,-0.007666763355362316,,, +16.1953125,32,0.3139390414236965,0.8084560051252538,1.3474814785417597,1.787991350864666,2.01157184331282,1.9569282659055585,1.6367604600339374,1.1343790753179859,0.5809890695776391,0.11986517498390906,-0.13276357670385108,-0.11940138506943898,0.1431376977119836,0.5685313771598137,,, +16.203125,32,-0.6446177006092262,-0.7807886084631047,-0.9089049998012064,-1.0269997504581316,-1.1332864254839818,-1.226190385113998,-1.30437617864429,-1.3667707466556636,-1.412582025417488,-1.4413126278207595,-1.4527683613955866,-1.4470614343752652,-1.4246082937823283,-1.386122133506614,,, +16.2109375,32,-1.3326002036751678,-1.2653061436438808,-1.1857476480810911,-1.0956498573266875,-0.9969249380867656,-0.8916383872248301,-0.7819726487944689,-0.6701886815062856,-0.5585861497027882,-0.4494629350298157,-0.3450746778773572,-0.24759505714923136,-0.1590775039940081,-0.08141902001456336,,, +16.21875,32,-0.016326733635591006,0.034712219645972715,0.07045696559681525,0.08993484807737008,-0.5989380128989524,-0.4430095927152635,-0.3432683742260648,-0.30757798838780104,-0.3391743501560325,-0.4364406030028925,-0.5930208197510369,-0.7982645280963007,-1.03797105891508,-1.2953818070620613,,, +16.2265625,32,-1.5523512058398798,-1.790614753264252,-1.993065659768123,-2.1449510850138767,-2.234904538079188,-2.2557424394007493,-2.2049692879229963,-2.084956196115618,-1.9027803319703385,-1.6697364525018372,-1.4005545787845963,-1.1123783536844465,-0.8235753112492804,-0.5524620075769149,,, +16.234375,32,-0.3160328994626934,-0.12878159536476486,-0.0016966614035063274,0.05849800754293644,0.04980529620134122,-0.024912751359258082,-0.1581414954299757,-0.3382447867870702,0.7431418446421697,0.6743155705782592,0.7562134272004376,0.9810150394686179,1.3179135588996709,1.7178837829597409,,, +16.2421875,32,2.1212913893613403,2.4671582516435318,2.7026408403713384,2.7912455057252545,2.718501154735783,2.494205840247859,2.1508973892892937,1.7387863033389486,1.3179401616945357,0.9489368309172501,0.6834422538104853,0.5561803177269725,0.5795454577472147,0.7416970102892863,,, +16.25,32,1.0084320121145858,1.3285446079288157,1.641837153818283,1.888535070700148,2.0186388439189704,1.9997563393476343,1.8221952905390368,1.5005225408708462,1.0713469339863395,0.5876709215945647,0.11069038847695034,-0.29968036005992665,1.494752282699718,1.3457282126307843,,, +16.2578125,32,0.9472530622022476,0.3913648285721432,-0.18644604925854147,-0.6441530372145053,-0.8719076952727035,-0.8219433333368789,-0.5214743802474779,-0.06505797831026422,0.41148701252273,0.7684539879774626,0.9006710178812694,0.7664399899200381,0.3990600119197813,-0.10222407984161813,,, +16.265625,32,-0.5993681068490183,-0.9533303642637072,-1.062168865178189,-0.8889928376073245,-0.4721077358217829,0.08542695602637397,0.6439657187643181,1.0654514729676479,1.2511349330263373,1.1685021604600083,0.8600315210176935,0.4313814296180167,0.0222478224300251,-0.2321198597520324,,, +16.2734375,32,0.09245868977132302,0.07763905444290352,0.04539129587721225,-0.004062730059026798,-0.07019832034866746,-0.15219688288587951,-0.248960040946296,-0.359128637233864,-0.48110630487850803,-0.6130871927898476,-0.7530873600356243,-0.8989792896585896,-1.0485289177345123,-1.1994345294244435,,, +16.28125,32,-1.3493668410823942,-1.4960095667191176,-1.6370997586278386,-1.7704672159445318,-1.894072271225688,-2.0060412935274545,-2.1046992864592045,-2.188599010539531,-2.256546120051349,-2.3076198743697125,-2.34118906122771,-2.3569228532249364,-2.3547964075960444,-2.335091111304344,,, +16.2890625,32,-2.2983894672805487,-2.245564711461063,-2.1777653425384376,-2.096394835416888,-0.5502835240739349,-0.7770645848361499,-1.0003469678314532,-1.2021210213239395,-1.365871535528321,-1.4777366026065404,-1.5274814161144823,-1.5092190867721007,-1.4218281929077352,-1.2690379317635498,,, +16.296875,32,-1.0591749173065814,-0.8045892649100307,-0.5207999678962261,-0.22541914593385398,0.06306983438278546,0.32659517610705835,0.5487509652021569,0.7159355272147571,0.8182944595873207,0.8504025919010798,0.8116373311716317,0.7062173694228467,0.542904065507834,0.3343863352942041,,, +16.3046875,32,0.09639195364144736,-0.15341275093025453,-0.3966580726208401,-0.6155548352845724,-0.7941374920185817,-0.9193797258962216,-0.9821047520253487,-0.9776268380128679,-0.5940829471226811,-0.7413443681735759,-0.7332734950302466,-0.5858778526470242,-0.3368114435993914,-0.03945142868063898,,, +16.3125,32,0.24547345676934176,0.4593985448402387,0.5551005414585146,0.5041068075697188,0.30118231275122553,-0.034804863686330616,-0.4637745379539105,-0.9306318794954644,-1.3738062565964273,-1.7348017073631896,-1.9672716920962177,-2.044204862251231,-1.9621027829172029,-1.7414990466256732,,, +16.3203125,32,-1.4237390449581808,-1.0645220671321174,-0.7252116593114413,-0.4632677630705324,-0.3232909181606024,-0.3300734615287798,-0.4847400331892188,-0.7645785026809903,-1.1265876064489388,-1.5141886684868184,-1.866055933563647,-2.1256900373922343,0.5234337894356605,1.1314990649284635,,, +16.328125,32,1.71186910794945,2.1293877888983657,2.2928553137192216,2.1797949778896344,1.8423906921707944,1.3929700576465895,0.9730136499799844,0.7141860573129307,0.7020707091955396,0.9525493843589018,1.4073016208676468,1.9496589091569203,2.4364697486860285,2.7372433756340997,,, +16.3359375,32,2.76984491770256,2.5229596882448413,2.059170313120211,1.4978036192545547,0.9822485072543521,0.6407018591920004,0.5511005037247436,0.7198497839689513,1.080177839713637,1.5105657040579914,1.8682009527113759,2.0282849659814346,1.9184194024231287,1.5386459753999129,,, +16.34375,32,-2.003086893692656,-1.8996766745904958,-1.7881684903097554,-1.67070055142204,-1.5495073697639734,-1.4268804792382035,-1.3051281623930502,-1.186534888058382,-1.0733211703642396,-0.9676045520997468,-0.8713623956685664,-0.7863971332510771,-0.7143045847195049,-0.6564458981278448,,, +16.3515625,32,-0.6139236041730501,-0.5875622039778907,-0.5778936301700872,-0.5851478358964722,-0.6092486766175039,-0.6498151568495215,-0.7061680200785988,-0.7773415665088297,-0.8621004917636967,-0.9589614517439418,-1.0662189760810177,-1.18197527648549,-1.304173428082789,-1.4306333427634264,,, +16.359375,32,-1.5590899046912714,-1.6872326002393778,-1.812745948464202,-1.9333500242007118,-0.90607930372776,-0.7724061248470747,-0.5860177234715541,-0.3601349472129905,-0.1108669826002526,0.14391249693045186,0.3858125776175192,0.5972087701619491,0.7624735759946201,0.8690681401881896,,, +16.3671875,32,0.9084188622652613,0.8765178309120499,0.7742052064664954,0.6071138530705511,0.3852800740259296,0.12244758683624316,-0.16488673492767222,-0.4586188190744648,-0.7402951505768915,-0.9923946292950372,-1.1995451531857708,-1.3495901029273014,-1.43443037131531,-1.450583233312777,,, +16.375,32,-1.3994190987355537,-1.2870596523135671,-1.1239444988389722,-0.9240965477284108,-0.7041373795488789,-0.4821212719673599,-0.27626920832716345,-0.10369116686253632,-2.250243371237892,-2.2172226011482983,-2.0280242283886007,-1.7077523310683786,-1.3013466806464002,-0.8666240903825524,,, +16.3828125,32,-0.4653166191346703,-0.1535022413061724,0.027081791286882703,0.05549016419313069,-0.06521925171295008,-0.3085140129956235,-0.6285729618462128,-0.9674770744007332,-1.2642849976051442,-1.4645794211317016,-1.5289970955846608,-1.4394136119801468,-1.2018193435649225,-0.8454383242545297,,, +16.390625,32,-0.418227026152058,0.020546144371741903,0.4094851104922936,0.6945839021823941,0.8375957427170727,0.8219501423285893,0.6552965940039374,0.36827887607586784,0.009731053247818977,-0.36095640980057625,-0.6831112558896557,-0.9042500650575652,-0.2628071088779099,-0.6421166513360853,,, +16.3984375,32,-0.7553777166260558,-0.6061518656415184,-0.26985130158360016,0.1271737710514202,0.4425046359043109,0.5569215936189009,0.4073054053238876,0.004153352557724754,-0.5710926205740451,-1.1881752053434065,-1.7035451623796578,-1.9995445156204943,-2.0165119443866866,-1.7690124568727903,,, +16.40625,32,-1.3417443072798727,-0.8662457880202161,-0.4847865103491391,-0.31133993205664456,-0.4003336275971271,-0.7317419424590113,-1.2166065085387163,-1.72147122749783,-2.1050342385278653,-2.2569708811989906,-2.128286469761124,-1.74487893913258,-1.2005929231954289,-0.6316674513605061,,, +16.4140625,32,-2.0468403642359427,-2.151126557825205,-2.2442688458371416,-2.3245120876911063,-2.3903165013290804,-2.4403846379665093,-2.4736841192964256,-2.48946573900995,-2.487276611670416,-2.466968138690948,-2.428698651916456,-2.3729306885022354,-2.3004229447839566,-2.2122170500005867,,, +16.421875,32,-2.109619391432774,-1.9941783091675265,-1.8676570597694733,-1.7320030222292846,-1.5893136853466423,-1.4418000120637364,-1.2917478221926386,-1.1414778696674803,-0.9933053133190544,-0.8494992907748607,-0.7122433032861435,-0.583597105080783,-0.4654607644877663,-0.359541526058036,,, +16.4296875,32,-0.2673240538491216,-0.19004457684049814,-0.12866938911597692,-0.08387808119302964,0.0208141939766654,0.08579873551647654,0.08397044045919555,0.01270922184539558,-0.12574304679349868,-0.3244315487029722,-0.5721662143466681,-0.8542947913039627,-1.1537174020783338,-1.4520718584257994,,, +16.4375,32,-1.7310070932502957,-1.973455926205999,-2.1648184253506484,-2.2939733613544915,-2.3540472380926323,-2.3428872880712714,-2.2632054642210693,-2.122383401637796,-1.9319519640326583,-1.7067816814082746,-1.4640405454358778,-1.221991851325647,-0.9987159284941196,-0.8108449091733007,,, +16.4453125,32,-0.6723987743130913,-0.5938038530788864,-0.5811622284832774,-0.6358230045222271,-0.7542853396840007,-0.9284400158447964,-1.146132703647666,-1.392009651778787,-0.9882696953315188,-0.921083583471442,-0.7128249513413636,-0.3962737066440795,-0.02175202708787952,0.3507163408242476,,, +16.453125,32,0.6607618252802058,0.857082575067534,0.9054495442247708,0.7940562065213358,0.5353795586352351,0.1642624364435601,-0.26748429978611943,-0.6991191250950833,-1.0703950627242902,-1.3309049097339516,-1.4478911089903037,-1.4113040552597045,-1.2353212075385915,-0.9560906401644718,,, +16.4609375,32,-0.6260507398664681,-0.3057110489902735,-0.054174703363857324,0.08012107648796662,0.06700393950985706,-0.1006790615146731,-0.4058921897500963,-0.8100094114061742,-1.2587760287854546,-1.69070529263103,-2.046602462785453,-2.2787331751272806,0.004329518987035597,-0.2795763096770767,,, +16.46875,32,-0.7078929938966334,-1.1442978533061097,-1.450018612497079,-1.5220933770541365,-1.321814038003155,-0.8855554895052404,-0.3150206055238975,0.2504274958901097,0.6717649560920487,0.8482257779143698,0.7447489153803258,0.40143303692439103,-0.07759084075753411,-0.5528178661104983,,, +16.4765625,32,-0.8877034410386547,-0.9861657085977128,-0.8189773716740283,-0.4318130725135097,0.06725357420445535,0.5373767629255779,0.8435692304734395,0.8937491581749716,0.6640493359373264,0.20545144268187526,-0.3700736716469237,-0.9201222137859584,-1.3107368604207759,-1.4529550629511712,,, +16.484375,32,-0.05605179603767518,-0.04526671531595694,-0.051292889851699004,-0.073598434678534,-0.1113590151414512,-0.16347245784994213,-0.2285782305518961,-0.3050814497375022,-0.3911809954978224,-0.4849012412507193,-0.584126842636669,-0.6866399763312764,-0.7901593766136679,-0.8923804860485459,,, +16.4921875,32,-0.9910160171395546,-1.0838362145987317,-1.1687081131322967,-1.2436331032200376,-1.3067821469915983,-1.356528027456238,-1.3914740662742189,-1.4104788071047234,-1.4126762321980866,-1.3974911581134484,-1.364649540858781,-1.3141835098785526,-1.2464310426167169,-1.162030285220893,,, +16.5,33,-1.0619086187008204,-0.947266661858754,-0.8195574909672141,-0.6804614399212826,-1.6485868324379402,-1.897467992204592,-2.1206266730350167,-2.3016628064656333,-2.4269462563799578,-2.4865675682830832,-2.4750296263207527,-2.3916319857608457,-2.2405210785504446,-2.0304027884652323,,, +16.5078125,33,-1.7739374355925606,-1.4868593556782992,-1.1868824639428248,-0.8924681161681877,-0.6215411815134775,-0.3902438521340837,-0.21181408240509114,-0.09566685901780868,-0.046742358463123024,-0.06516643682148504,-0.14624711619546227,-0.2808073013672291,-0.4558305132513445,-0.6553745974638867,,, +16.515625,33,-0.8616896790346499,-1.0564623910054174,-1.2220995987095429,-1.3429620868885888,-1.406462165624344,-1.403948640058586,-1.3313174162897126,-1.1893051477949836,-2.3582083675068994,-2.2794357898334856,-2.0609450091820856,-1.7424576574378217,-1.3786594803684036,-1.0306444457045518,,, +16.5234375,33,-0.7563637426148295,-0.6015674830221761,-0.5926501579369197,-0.7325143648540288,-1.000097192520229,-1.3536331523725658,-1.737145539637307,-2.089155242162367,-2.352250615422665,-2.482027905813674,-2.4540097237749503,-2.2674639765999567,-1.9455284194373177,-1.531621381448605,,, +16.53125,33,-1.082697651120394,-0.6603998673812949,-0.32148352924293244,-0.10900685494411856,-0.0456575734410386,-0.13025587448790765,-0.3379780228709052,-0.6242656129524214,-0.9318113664510708,-1.199533174281108,-1.3721383906974074,-1.4087884411943938,-0.5484939307247955,-0.15151559805561055,,, +16.5390625,33,0.07292063952606143,0.04158723115925767,-0.2584771711168873,-0.7661854837652426,-1.3629156384797994,-1.9047960156842405,-2.2619165198763005,-2.353720793552778,-2.1708816346902475,-1.7776661453610307,-1.294144214708938,-0.863118156303903,-0.6108386568100251,-0.6122750279836953,,, +16.546875,33,-0.870459392480677,-1.3155670159162285,-1.823985727044577,-2.252148765345112,-2.475858982917173,-2.4243271075403707,-2.09959528344086,-1.5760223547204208,-0.9799716270172713,-0.4552675451797809,-0.12388783824279047,-0.05266330567065047,-0.2351107203847457,-0.5933766168871905,,, +16.5546875,33,-0.5318569219788148,-0.3757877838649557,-0.21442776372982705,-0.050042675166909086,0.11504902069192098,0.2785165647591761,0.4380574648680284,0.5914375657939634,0.7365299229293989,0.8713517990757551,0.9940991366753074,1.1031779020108698,1.1972317526761092,1.2751655439926246,,, +16.5625,33,1.3361642629144257,1.3797070580205522,1.405576120065299,1.4138602577198052,1.4049531060265392,1.3795459990660448,1.3386156317647169,1.2834067270154177,1.2154100117319404,1.1363358876068346,1.0480842577165317,0.9527110374333788,0.852391936161771,0.7493841441923667,,, +16.5703125,33,0.6459865956624185,0.5444995035264455,0.4471838751961869,0.3562217178454445,-0.9834454290170636,-0.7236905741727239,-0.4237253389313429,-0.10002042424827233,0.2293082526840328,0.5457549910151629,0.831706914401708,1.0716643317979209,1.2533137685742959,1.3683788593808577,,, +16.578125,33,1.413189784458319,1.3889315578201709,1.3015538702167329,1.1613487904341209,0.9822257895030496,0.7807346587317787,0.5749044723115044,0.3829795726456673,0.22214073710785087,0.10730071780775907,0.05005815922344314,0.05788285385440607,0.1335891635674431,0.2751343390453028,,, +16.5859375,33,0.4757558129620912,0.7244379041814237,1.0066753987384005,1.3054807705438431,1.6025648142670692,1.8796083695711392,2.1195364630381395,2.307706024774788,-1.2895139258888424,-1.018380763044966,-0.6229139521493554,-0.1498684249889312,0.3419945914999328,0.7910008729965528,,, +16.59375,33,1.1421101210679776,1.3554298227007842,1.4123702609449915,1.3184822920707868,1.1025361771714994,0.8119852261637059,0.5055210896612901,0.2438805169430819,0.08033573181811328,0.052349845264371135,0.17569725072150078,0.44196500032431496,0.8198245400529849,1.2598759127679289,,, +16.6015625,33,1.7023100906697135,2.0861961426349773,2.3589468468583448,2.484488546376495,2.4488628463427924,2.2623877359275966,1.9580415848864958,1.586321751162026,1.2073786127574002,0.8816501830493568,0.6604559896869432,0.5780152212141554,-1.4120178080670145,-1.2394095633832074,,, +16.609375,33,-0.8073131647044194,-0.19952206262376004,0.4523382442039525,1.0046389250221237,1.340865625286736,1.4033065303269452,1.2086281033860953,0.8430717881274771,0.43859019426571616,0.1364651281516044,0.048380589828573406,0.2256212670382255,0.6448399768217656,1.2142963138233926,,, +16.6171875,33,1.798858066577771,2.2569144843819906,2.479085618288266,2.4181195219520735,2.1017840455497527,1.6252204260469685,1.1248545765523867,0.7410162507385181,0.5795108825784367,0.6826757353406483,1.0178524261986914,1.4864343893335978,1.9510086768455648,2.273152200418605,,, +16.625,33,0.2736776302883965,0.20146245407355745,0.1412996203627236,0.09469478196852156,0.06290926239765038,0.04693778690347239,0.04749088558094661,0.06498227671858592,0.09952145142185433,0.15091158944371974,0.21865284280608235,0.3019509298048797,0.3997308890038589,0.5106557524691523,,, +16.6328125,33,0.6331498113562795,0.7654260665512636,0.905517383778287,1.05131080772543,1.2005844344187446,1.3510461962760942,1.5003738807855602,1.6462556821388508,1.78643057582607,1.91872780928808,2.041104817197791,2.1516828975296987,2.248780023772494,2.3309402187921817,,, +16.640625,33,2.396958976048795,2.4459042830789315,2.4771328791599183,2.4903014625129742,2.4329243626433774,2.4882273780700017,2.4713632605854707,2.3849479353388983,2.236281426725029,2.0368379458337875,1.8014652608872128,1.5473491816093317,1.2928153670025415,1.0560520091342185,,, +16.6484375,33,0.8538424622619256,0.7003961923067719,0.6063595646570482,0.5780754467962262,0.6171432507985303,0.7203100893258882,0.8797006283950916,1.0833696010302307,1.3161384450110551,1.5606577143273197,1.7986211693539491,2.012046873023175,2.1845359471057515,2.302421199902291,,, +16.65625,33,2.355725515667311,2.3388631614502646,2.251035093664627,2.096290684575338,1.883251550004388,1.6245167218749743,1.3357906296337834,1.0347946836441535,0.6461322877339818,0.8523774578335287,1.1620458376586562,1.5235894420865557,1.8766761370098568,2.161620064921359,,, +16.6640625,33,2.3287145333400114,2.3460135215638664,2.204349582176815,1.9188063459898617,1.5264160406555058,1.0804403958146358,0.6421254530989151,0.27121424322289345,0.016694753801974938,-0.09077604208309133,-0.043592386292556684,0.14167074100075538,0.4268944126964472,0.7584078753834017,,, +16.671875,33,1.0754024050704176,1.3194561090576535,1.443685853882788,1.4201005824514357,1.2440104341083005,0.9348046645307986,0.5329769511753306,0.09386117104523736,-0.3209468883639324,-0.6531459820312321,-0.8567757520888883,-0.9053441280135958,1.7068301036794469,1.1261655067579426,,, +16.6796875,33,0.5478984637262247,0.11047825628851704,-0.08701079153801905,-0.011778452101430359,0.29391401779115656,0.7245662194128354,1.1405811191990836,1.4067484958873189,1.4295200713052765,1.1828582903288587,0.7155724129716058,0.13812944934302124,-0.4074470892710461,-0.7863423988200556,,, +16.6875,33,-0.9077566505382686,-0.7496661477055949,-0.3647542335576893,0.13411256188355347,0.6048818019330515,0.9152898411748992,0.9791317636027204,0.779885882612068,0.3752180669740517,-0.11886837016445427,-0.5598927370525197,-0.8180344528401821,-0.8118207115125456,-0.5305823775306677,,, +16.6953125,33,2.485372650836898,2.4626155908265566,2.4226012060254254,2.3661921662383216,2.294527754155593,2.2090038941826853,2.1112486931773518,2.003093921381616,1.8865429329128216,1.7637355875275698,1.6369107878667533,1.5083672881457346,1.3804234605179972,1.2553767235806237,,, +16.703125,33,1.1354633434145478,1.0228193110143209,0.9194429811192276,0.8271601266114984,0.7475920203419666,0.682127103239381,0.6318967347520251,0.5977554501917736,0.5802660706299053,0.5796899260219915,0.5959823627058364,0.6287936138827764,0.677475017785523,0.7410904745926391,,, +16.7109375,33,0.8184329414210725,0.9080456765025436,1.0082478604955294,1.1171641462343225,0.7400383434152982,0.4695353518080552,0.239554639845954,0.06349298883241307,-0.04905195422011521,-0.092943683278363,-0.06785771536971097,0.021703102883094183,0.1667299144446106,0.3543433729566483,,, +16.71875,33,0.5686990316921404,0.7920994476685248,1.0062354334357315,1.1934698833657538,1.3380746325930488,1.4273340822128382,1.4524386154187934,1.4091054881329963,1.2978838821139151,1.1241228332614928,0.8976042570581039,0.6318666473768335,0.3432665957181649,0.04984356106198298,,, +16.7265625,33,-0.2299329589483282,-0.4784465036784823,-0.6801575103892441,-0.8226826272919477,-0.8976542248566866,-0.9013001782320416,-0.8347034993247511,-0.7037237214521616,-0.7959258148047126,-0.5495936527745795,-0.20811578852171772,0.1725668030196458,0.5310664481092974,0.8101193478956827,,, +16.734375,33,0.9655098828544292,0.9729586152679092,0.8319011427759191,0.5655692433951964,0.2173617109058349,-0.15592979948033062,-0.4929847261262679,-0.7375266501009025,-0.8471142672677581,-0.7997809058892846,-0.597488294521177,-0.2658564649161904,0.14978833019602275,0.5914323314731758,,, +16.7421875,33,0.9973666367739776,1.311752838678886,1.4932722816454176,1.5215120265410318,1.4000931395316059,1.1560543305001716,0.8355872218747531,0.4967877867152522,0.2005532460008248,0.001042571753919419,-0.0628132859670838,0.026571168976432642,1.0803859562569185,1.4326021411106482,,, +16.75,33,1.5257071367187884,1.3528982924510389,0.9806046031990864,0.5300581397452814,0.14384228462297788,-0.053412959570297465,0.010585802647092524,0.33575915676968304,0.8494591442537305,1.4261697186643416,1.9217060993963693,2.2125419336648533,2.22948769715162,1.9764918007859185,,, +16.7578125,33,1.5294131560964566,1.015103024333071,0.5765304462851091,0.3335104111282061,0.3497988954514797,0.6155737428384517,1.0501033578164898,1.5238721097761854,1.8940986350655944,2.0439124259098818,1.9144512608961943,1.5210820121675641,0.9492984706365888,0.33141955669401657,,, +16.765625,33,1.2327576194253285,1.352865593080963,1.4752376088476309,1.5975749797518917,1.7175711818879802,1.832952387701924,1.9415174310549832,2.0411765041818843,2.1299879088756484,2.2061922182895133,2.268243251085205,2.3148353154770467,2.3449262460223044,2.3577558296853813,,, +16.7734375,33,2.352859298427874,2.33007565196152,2.289550664824775,2.2317345250153786,2.1573741454138933,2.0675002825082065,1.963409687853443,1.8466426046737607,1.71895600352126,1.5822930255102898,1.43874916805188,1.2905358050516804,1.1399416802011104,0.9892930474900208,,, +16.78125,33,0.8409131567462577,0.6970817934808502,0.5599955813656452,0.4317297423100568,-0.5185855258119355,-0.29316330252664397,-0.044011541707617376,0.21079132674223605,0.4529050178439404,0.665007388386845,0.8320030852751283,0.9420765609050048,0.9875160247302324,0.9652508743308252,,, +16.7890625,33,0.8770651301186261,0.7294719919305649,0.5332582676298814,0.30273044551890155,0.0547149885000463,-0.19261743237635026,-0.4210217693061233,-0.6134539381509131,-0.7552627270743866,-0.8352151497909034,-0.846283733541075,-0.7861408322635269,-0.6573254848023768,-0.467071171820373,,, +16.796875,33,-0.2268064710576895,0.04863658018269301,0.3420512245262633,0.6350501018580366,0.9093414885667778,1.1479986766288932,1.3366339892923207,1.4643955805418285,0.26264399812770434,0.6156844488728196,1.03738158706413,1.4683100677110246,1.8471389168998151,2.1201392629274425,,, +16.8046875,33,2.2495103807874663,2.219227455939646,2.037500465179612,1.7354613942938455,1.362284453021501,0.9774995107663672,0.6416961296952794,0.4070662265422924,0.30925850989648584,0.3618135042137558,0.5540460117311052,0.8527048863207672,1.2071516362891788,1.5572512759671648,,, +16.8125,33,1.842746377833381,2.012654239527889,2.0332234589554044,1.8932105697632624,1.6056547838796469,1.2058743061975257,0.7459961772371285,0.2868715022434952,-0.11136485287642794,-0.3986199039821523,-0.5426012099787387,-0.5338003140624324,-0.5413878004388895,-0.33654316957141706,,, +16.8203125,33,0.02735884003766785,0.4174401562014165,0.692930384478327,0.7439851412352354,0.5220335192665938,0.05333521174234057,-0.567970478429334,-1.2054208655995566,-1.717389317120259,-1.9956657465960803,-1.9948864921825888,-1.7447497452975536,-1.3416705694672064,-0.9221644330930302,,, +16.828125,33,-0.6252557219684454,-0.5542154817193478,-0.7481163246812645,-1.1710016792957143,-1.7216388198558998,-2.261183530807968,-2.651175023194388,-2.7914483075073364,-2.6475736443549343,-2.2603028000587853,-1.7344330206243772,-1.2101404162407805,-0.824638853313282,-0.6746717407710243,,, +16.8359375,33,0.3142019835890405,0.20913914422059632,0.1180471844819373,0.04218504391324529,-0.017457174581791083,-0.060175312675811325,-0.0855632571749424,-0.0935198214469295,-0.08425028736301554,-0.05826258088762426,-0.01635814841847838,0.04038230623522565,0.11061797435660492,0.19277164881036826,,, +16.84375,33,0.2850575692890512,0.3855129186072304,0.4920324184173072,0.6024054184428721,0.7143548296638446,0.8255772196107292,0.9337833675624201,1.0367385694052085,1.1323019862850738,1.2184643479298995,1.293383350337788,1.3554161278864962,1.4031482311605052,1.4354186029692044,,, +16.8515625,33,1.4513401151042724,1.4503153061216958,1.4320470444573776,1.3965439300512992,1.524717523747035,1.515770899183967,1.440584440721012,1.3068263449325273,1.126262474348887,0.9139287528297968,0.6870754814810741,0.4639572083710384,0.26255255541172706,0.09930329010012352,,, +16.859375,33,-0.012039412159295493,-0.061381044236794025,-0.0429947973398308,0.0440720543685863,0.19592476986443488,0.4040858919543985,0.6560796870094825,0.936295534986092,1.227070078573805,1.5099126852074272,1.7667887816208765,1.9813715845854745,2.1401749548462785,2.233488390446356,,, +16.8671875,33,2.2560489725681085,2.2074034196022128,2.091935014323832,1.9185535379086325,1.7000698435029706,1.4522986924785075,1.1929524249480343,0.9404026211885721,-0.3869249952120008,-0.13855748951926405,0.15859632237382282,0.44397078020666497,0.6586299497779408,0.7545044502365021,,, +16.875,33,0.7019366337408375,0.4943586266611032,0.14937431029107873,-0.2939235772043021,-0.7809836362726211,-1.2502343569214869,-1.6426169661682295,-1.9107280661758328,-2.02614832847852,-1.9838160337137405,-1.802764518389445,-1.5231089207572066,-1.1997517978624228,-0.8937882262987675,,, +16.8828125,33,-0.6629493028672281,-0.5525727206717486,-0.5885069854141346,-0.7730546450542719,-1.0845865458605892,-1.4808873275848666,-1.9057111910995417,-2.297526935151087,-2.5990902484077205,-2.766352372916184,-2.775317597845832,-2.625781501800651,-1.57465134472777,-1.9960258581378056,,, +16.890625,33,-2.2556248839443653,-2.261890782075353,-1.9914383028359681,-1.4956819747433414,-0.8869700904980837,-0.3080234524355244,0.10694733857146144,0.2687916273039702,0.15762045621378318,-0.1719705039064744,-0.6060861862680775,-1.0029616573506843,-1.232020078928874,-1.2098526085131396,,, +16.8984375,33,-0.9232574598450956,-0.4330221687923016,0.1425890375244018,0.6601184916697288,0.9901222573921674,1.0525567034531147,0.8386468836185061,0.4132438614281396,-0.10297468900271536,-0.5665821274805681,-0.8506931578359312,-0.8796987260124148,-0.6499261354423036,-0.2305626857492297,,, +16.90625,33,1.3441203397801735,1.275391115789269,1.1912609896177,1.0929089271897188,0.9817676686808668,0.8594988214075879,0.7279639417592607,0.5891921124201978,0.4453445825060017,0.29867708966134576,0.15150052376210532,0.006140620906310511,-0.13510260664648244,-0.26999499429153423,,, +16.9140625,33,-0.3964072001766933,-0.5123518492119846,-0.6160181956818231,-0.7058036976022611,-0.7803419500301817,-0.8385264882909356,-0.8795300444003642,-0.902818919570604,-0.9081622212041012,-0.8956358026983301,-0.8656208371354585,-0.8187970498875482,-0.7561307286892612,-0.6788577211690487,,, +16.921875,33,-0.5884617176021743,-0.4866481991948834,-0.3753145081062048,-0.2565165633205351,0.7123961153235622,0.5248149050384561,0.3905664393209518,0.31868167379412105,0.313683794108084,0.3752716325307982,0.4983398575055987,0.6733345308832097,0.8869192404558501,1.1229053571994625,,, +16.9296875,33,1.3633815475424642,1.5899637754584803,1.7850786262319764,1.9331904592701847,2.021886813518976,2.0427463727065245,1.991928959634364,1.8704464117449568,1.68409544256878,1.4430571636928615,1.1611911859588406,0.855073515835475,0.542845328162181,0.24295288397883136,,, +16.9375,33,-0.027133547729668358,-0.25213244205154983,-0.4200108868309877,-0.5228176725551239,-0.5572315225393244,-0.5247862472169683,-0.4317571359392585,-0.2887165231509743,-2.3413676807271857,-1.9658572077673808,-1.5563824770892771,-1.1745454518548708,-0.8768436012951246,-0.7058946232426132,,, +16.9453125,33,-0.6838266143208162,-0.80886305173334,-1.0556343242254826,-1.379167103416987,-1.7219299879267005,-2.022837807436254,-2.226811888639616,-2.2934069786863285,-2.2031608836182626,-1.9606775686597069,-1.593963239326109,-1.1501185333055095,-0.6880575024559622,-0.2693871532977846,,, +16.953125,33,0.05113218548191134,0.2340601126749909,0.2613635597700974,0.13917049606905907,-0.10323868411155013,-0.4180447140772299,-0.7463890872143903,-1.0275913949451418,-1.208648463424584,-1.2525355011527242,-1.1440160746470514,-0.8920557555574556,0.8747341218003181,0.8142719991525973,,, +16.9609375,33,0.486236080877824,-0.034517419478717226,-0.6211767907041239,-1.1295240098545272,-1.4372467474978454,-1.4772409998805842,-1.255779198778857,-0.8505666030012765,-0.3892208088979626,-0.014074647838447585,0.15704893711333678,0.06333752795520542,-0.2821440816605369,-0.7958457346610759,,, +16.96875,33,-1.3464545214866348,-1.7907222823437876,-2.0125803386398644,-1.9548227125738191,-1.6346756867683572,-1.1389876531467575,-0.6003584837630049,-0.16075136919991406,0.06743944879214481,0.03219456447089808,-0.2438941670908097,-0.6698583494351651,-1.1113498568039262,-1.4275483562719278,,, +16.9765625,33,-0.13243280520424067,-0.005326000113600257,0.12249642612320925,0.2487228312636222,0.3710778680670189,0.4873623547036289,0.595491806004388,0.6935329508644307,0.7797375963702331,0.8525732456836487,0.9107499335660908,0.95324280964989,0.979310074031813,0.9885059511420392,,, +16.984375,33,0.9806884747269504,0.9560219476444938,0.9149740334172198,0.8583075304890615,0.7870669732402504,0.7025602944035214,0.6063358699973017,0.5001553487541536,0.3859627418311813,0.26585031407939697,0.1420218741581772,0.01675410632160143,-0.10764337899046003,-0.2288685761999352,,, +16.9921875,33,-0.3446674875244192,-0.4528736902851889,-0.5514463757145289,-0.6385061931354856,-0.10978953574936001,0.08833806383098193,0.2875907367686197,0.4697710653877417,0.6178362581312881,0.7170942305760881,0.7562358390660332,0.7281312689895734,0.6303350258169165,0.4652642969776282,,, +17.0,34,0.2400382294917703,-0.03401068633301696,-0.34211907171669176,-0.6671144069600561,-0.9906048392113844,-1.2942540984215285,-1.5610526344005111,-1.7764963512023626,-1.9295907583265617,-2.013610532174069,-2.0265615368864043,-1.9713131017763776,-1.8553913462131444,-1.6904479786212652,,, +17.0078125,34,-1.4914416260116086,-1.2755887961006689,-1.06115763781535,-0.8661886275591056,-0.7072314037379893,-0.5981858453549911,-0.5493282205503881,-0.5665903248031137,-0.5284632929042333,-0.10297076227635676,0.3244811917642476,0.6930515651341255,0.9504509940462056,1.0610654687863383,,, +17.015625,34,1.0114865532136732,0.8125868321867422,0.4978173877135597,0.11799252285392316,-0.26662593881413155,-0.595711866044244,-0.8182640811929236,-0.9005392848390157,-0.8312931114706538,-0.62351307705781,-0.3123736055839373,0.05026822792104165,0.4039787799276017,0.6891930225910968,,, +17.0234375,34,0.8565275163023836,0.8745104337733157,0.7345244361333663,0.4521923003514633,0.06498924451298105,-0.37354640258691263,-0.8021027257753721,-1.1610930707650284,-1.4018849926907544,-1.4943221287602144,-1.4313677087629586,-1.2301467406673878,-0.8619615915614559,-0.25615297847889723,,, +17.03125,34,0.3684735140964736,0.8709271864456631,1.144787738676621,1.1471525877122035,0.9101666960670008,0.5319769563096547,0.1495923544820607,-0.09890973285574167,-0.1124708194976448,0.14500858994683194,0.6345357896194205,1.2524788966106324,1.8587433347528848,2.314951464954422,,, +17.0390625,34,2.5221633985151133,2.4478026719162607,2.1344089623214257,1.6878205474553445,1.2480267505513858,0.9506800825070466,0.8898175130814638,1.0920087303495865,1.5090172583873491,2.03098628341594,2.516535626708761,2.831521256953032,2.8858343841959813,2.658154262187037,,, +17.046875,34,-0.7123682718250796,-0.7715718422792245,-0.814905938140497,-0.8414307286797951,-0.8504941082205032,-0.8417432519498955,-0.8151309356926264,-0.7709165089035691,-0.7096615037568328,-0.632219957126044,-0.5397236148260294,-0.4335622770944005,-0.3153596293679193,-0.1869449814542164,,, +17.0546875,34,-0.05032140984715562,0.09236913909371228,0.2388831741620752,0.3869147590680305,0.5341357024240697,0.6782361343349093,0.8169647592143505,0.9481680801169567,1.0698279078832609,1.180096498436836,1.277328703095959,1.3601105690738675,1.4272838894946662,1.4779662731788692,,, +17.0625,34,1.5115663829034445,1.5277940754402128,1.5266652659486697,1.508501431675252,-0.6511418860219012,-0.7993053652930019,-1.0028091023037922,-1.2493611598679597,-1.5235038578361684,-1.807689412541536,-2.08350167873781,-2.3329388019878907,-2.5396673411833017,-2.690160409509744,,, +17.0703125,34,-2.7746404691322195,-2.7877610361442384,-2.7289797581178936,-2.602596847330994,-2.4174561877288574,-2.1863299556874694,-1.9250296634145592,-1.6513056104418933,-1.3836114828244628,-1.1398202425752508,-0.9359808457570646,-0.7852024797989939,-0.6967441175410689,-0.6753728673964451,,, +17.078125,34,-0.7210358543229947,-0.8288685021118182,-0.9895386285206179,-1.1899023468458485,-1.4139260236877804,-1.643809989124639,-1.8612356261539758,-2.048648862102776,-0.9292248357245464,-0.5825478010997623,-0.25098622993834924,0.00719764960148972,0.14547574515443096,0.13635082683183952,,, +17.0859375,34,-0.02431256382591529,-0.31659784600664354,-0.6995945373683037,-1.117728716744501,-1.5093800369028518,-1.816443356593971,-1.993345916969572,-2.014115773457116,-1.8764007046887912,-1.6018117816987558,-1.2325382157293039,-0.8247608518734229,-0.4398902838872246,-0.13499437202003628,,, +17.09375,34,0.04609382009428165,0.07960265313939074,-0.03448018846891443,-0.2724144813601984,-0.5904178429661763,-0.9315017417595428,-1.234368319458643,-1.4429822041593454,-1.515326340195844,-1.4299779351009818,-1.1894801337952174,-0.8199840948183689,1.0869284359960196,0.7039389227580947,,, +17.1015625,34,0.5684250716391228,0.6975189510878721,1.0341322061288418,1.4628031094571408,1.84155313443292,2.0410201662140635,1.9801410778328803,1.6486020508648762,1.1099015411591393,0.48418425860715,-0.08445131574866349,-0.4672139982129052,-0.5856913910848467,-0.4331218084167788,,, +17.109375,34,-0.07603862714356491,0.364161711982174,0.7446746146015297,0.940594512724416,0.8792998835994944,0.5604908490466085,0.05638646221540852,-0.5079733978875071,-0.9889236854311012,-1.2634960214418458,-1.2630901909287309,-0.9922671744098388,-0.5275131182192656,0.0036871949656565603,,, +17.1171875,34,1.4739237637799023,1.4238420698183458,1.3594386213312502,1.2821472294964358,1.1936279153613172,1.0957376183139582,0.9904974558132664,0.8800571077994872,0.7666569495400041,0.6525885960989176,0.5401545494321891,0.4316276548131516,0.3292110766473704,0.2349994946258465,,, +17.125,34,0.15094219980751655,0.0788087369533168,0.02015769484101504,-0.02369080881851837,-0.051678465948062136,-0.06302753136101691,-0.057254662206920874,-0.0341796011485197,0.006071448905823672,0.06306781773378556,0.1360816936296929,0.2241006539868865,0.3258451813505122,0.4397908583608162,,, +17.1328125,34,0.5641948530813745,0.6971262310795907,0.8364995636175161,0.9801112436005602,-2.1904905457999417,-2.2742878976983114,-2.2915309075167034,-2.2382725499102984,-2.1154109473616747,-1.9286337880161943,-1.6880288579491982,-1.407387830021854,-1.1032518414789276,-0.7937653981794527,,, +17.140625,34,-0.4974185092338042,-0.2317647497807922,-0.012204628227729164,0.14908091962480674,0.24397255591920985,0.2689713855469533,0.22543566738701715,0.11947890217390167,-0.038463579728367336,-0.2343692910546721,-0.4516132736960697,-0.6721341170224758,-0.8776999828567713,-1.0511863381191702,,, +17.1484375,34,-1.1777762801500349,-1.24599973803496,-1.2485390694450489,-1.1827448629865422,-1.0508259649124183,-0.8597004669831564,-0.6205180351352895,-0.3478868776901076,-0.3672170311158842,0.11059598757699562,0.5517542208708308,0.90064240974204,1.1163419375472703,1.1789510205324,,, +17.15625,34,1.0926297889992762,0.8848962444545039,0.6022830310567144,0.3030317877818828,0.0479632643915755,-0.10905447851745588,-0.12955486334885635,0.003477654647778161,0.2828998227143044,0.6784656483641047,1.1414820768941625,1.6123394199369845,2.0297439010508134,2.3402145615659227,,, +17.1640625,34,2.506365583994869,2.5126842561784253,2.36790485357081,2.103608906615724,1.7692700653719116,1.4245155300193326,1.129809533274045,0.9370101164501607,0.8812701573544348,0.9755442144907616,1.2085568624801508,1.5465490277124891,0.7086704733658041,0.4504218820068033,,, +17.171875,34,0.01959375578634906,-0.4548488452596856,-0.8306460307908788,-0.9914140000566668,-0.8787359388727277,-0.5083758691946927,0.03383024424449091,0.6152820469330254,1.0927352035697908,1.3513372767609235,1.3358826631508345,1.06572269438014,0.6292466158619923,0.15944812278932358,,, +17.1796875,34,-0.20272404834584834,-0.34718503155589475,-0.22506130851247874,0.13775230501948188,0.6475433179822572,1.1683363457731084,1.5590495006989151,1.7120700519881469,1.5826778544136864,1.2012532052304536,0.6649238623931178,0.11094086247825348,-0.32091984221552705,-0.5266254221672604,,, +17.1875,34,1.1256778735093105,1.2708760532662724,1.4133828714695669,1.5509163911076675,1.6812754209704663,1.8023778764679927,1.9122970582751493,2.009295213671324,2.09185379302277,2.158699871725092,2.2088282750578023,2.241519018648039,2.2563497592578208,2.2532030379780443,,, +17.1953125,34,2.2322681890936065,2.1940378812867656,2.139299351829113,2.069120487336296,1.984830994895694,1.8879989933359664,1.7804034346066007,1.6640028382383152,1.5409008864158635,1.413309482163871,1.283509917555461,1.1538128319572998,1.0265176614947902,0.9038722898356004,,, +17.203125,34,0.7880336068615192,0.6810296658903292,0.5847241021286574,0.5007834354270857,-0.0588592489252399,0.22825377740292396,0.4951556237390062,0.7248368292981259,0.9027582389575382,1.0178622594793396,1.06334167073023,1.0371123852234696,0.9419571931413162,0.7853304724125832,,, +17.2109375,34,0.5788374845915905,0.33742456862361914,0.0783367037684422,-0.18008486578032512,-0.4196810998800359,-0.6237405748812621,-0.7781636006997155,-0.8724438681371094,-0.9003991770789562,-0.8606002943875537,-0.7564680414639584,-0.5960318476309906,-0.391366613307705,-0.15774716017763546,,, +17.21875,34,0.08742076018279123,0.3258183457336626,0.5394955748804278,0.7121275920678984,0.8301580250127706,0.8837494945501164,0.8674750225361734,0.7807021107200067,1.938530369057852,2.324219642505424,2.64343629983217,2.8454805129606666,2.8970405973761086,2.78739615254174,,, +17.2265625,34,2.5301064230539607,2.1609208095902157,1.732236859195121,1.3049687938098853,0.939092940015292,0.6843424851633881,0.5725007101912046,0.6124928627125418,0.7890409165828097,1.0650905124628356,1.3876318247631882,1.6960074676081691,1.9314131735598392,2.046111190074157,,, +17.234375,34,2.010921077736996,1.8198208928439443,1.4909418060280393,1.0638009477382306,0.5932031866629018,0.1407613792290322,-0.23464443368837395,-0.4859831383265143,-0.5853443660354475,-0.5282336675471128,-0.33422231314398465,-0.04385076501517218,0.2461959438133205,0.6598847918910392,,, +17.2421875,34,0.9281099814921018,0.9514299867482076,0.6961100361407295,0.2035601153350262,-0.42080896212001706,-1.0362590220243508,-1.5050709255200598,-1.7300563128184616,-1.680955935782299,-1.4024917228302818,-1.0018679111919733,-0.6191489857578825,-0.3886351074759637,-0.4018230026814256,,, +17.25,34,-0.682105708279726,-1.1781472313494277,-1.7777498612759162,-2.3384153468969284,-2.7262257423071956,-2.8523894163642387,-2.6974374778692,-2.3164403541825687,-1.8238158911498463,-1.3618935076475018,-1.06185072169162,-1.0077286684844404,-1.2133891663480678,-1.6187287888495492,,, +17.2578125,34,0.4306478299101408,0.3755058225193693,0.3362734630046356,0.3135782306587892,0.30774800944023983,0.3188053145575576,0.3464668716317788,0.3901485558264733,0.44897560447882456,0.5217979244243679,0.6072102259964625,0.703576631161281,0.8090593249098186,0.9216507482194576,,, +17.265625,34,1.0392087688905427,1.1594942144121874,1.280210109648126,1.3990419322871577,1.5136981811659276,1.6219505471028135,1.7216729828302515,1.8108789878867242,1.8877564555897144,1.9506994718841464,1.9983365092413483,2.0295545218954216,2.0435185204698243,2.039686283202921,,, +17.2734375,34,2.017817946130368,1.9779803042535704,1.9205457483270776,1.8461858558270063,0.6276426939879611,0.4170654705435689,0.16169065465085453,-0.12269065716754772,-0.41831111240471225,-0.7066594052188865,-0.9697643390646552,-1.1914411238182248,-1.3584130156436045,-1.461230100815103,,, +17.28125,34,-1.4949211706610748,-1.4593332473317957,-1.3591351012777415,-1.2034845323025292,-1.0053826328894613,-0.7807600801926922,-0.5473591895119659,-0.3234897041389289,-0.12674510110558124,0.02723105450165641,0.1258426642515622,0.16042600801605011,0.12686028906140945,0.025861221860890567,,, +17.2890625,34,-0.13706282526420732,-0.35198908904562554,-0.6052667087467797,-0.880463218277982,-1.1595052442870803,-1.4239338784380235,-1.656187194915105,-1.840820490668396,0.2877316324779485,0.5993998598061372,0.8336144393272038,0.9454212472285504,0.9094879625361268,0.7240810160281225,,, +17.296875,34,0.4113634525759686,0.013967175788400454,-0.4116266526394187,-0.8038681201976906,-1.1057124461240764,-1.273496115098974,-1.2837327951908166,-1.136770556813711,-0.8567407573170346,-0.487806527455589,-0.08729513161456727,0.28321619384737884,0.5674725834950957,0.7232812309097689,,, +17.3046875,34,0.729057295554779,0.5871566135691693,0.3234762876767382,-0.016614454116253063,-0.3753791453624067,-0.691747879493974,-0.9108727335390056,-0.9927162724785696,-0.918335180801908,-0.6928800536833736,-0.3448438468093159,0.07832423239938315,-2.770529788561011,-2.7393824154325705,,, +17.3125,34,-2.4315306385351168,-1.9125303360045216,-1.3037391731235242,-0.7492316208693622,-0.3765028240383277,-0.26172947727748586,-0.4091068105103168,-0.7499228453782584,-1.1616216079810269,-1.501628546143095,-1.646665477537535,-1.5267778542536432,-1.144746319690165,-0.5755602752704231,,, +17.3203125,34,0.05390438610530685,0.599435725010116,0.9387971340587852,1.005027484733029,0.8046052661783953,0.4155001396309298,-0.03435255308185958,-0.4022534627183697,-0.5699681598470068,-0.4762308175237484,-0.13361352642176114,0.3748627741483964,0.9184473494654448,1.3544823331413678,,, +17.328125,34,1.7558597482630272,1.6507974186365042,1.532478320914541,1.4026055963499615,1.2630763878748403,1.1159487622844089,0.9634058193310882,0.8077176160942278,0.6512015732483135,0.4961820564322634,0.3449498403569893,0.19972216534951934,0.06260408564565179,-0.06444821387090449,,, +17.3359375,34,-0.17966149025562472,-0.2814763079088741,-0.3685741564451044,-0.4399003462987413,-0.4946822812688304,-0.5324427881582348,-0.5530082702150185,-0.5565115417203224,-0.5433892942014729,-0.5143742387506111,-0.4704820621543866,-0.4129934253463097,-0.3434313195116331,-0.263534176454982,,, +17.34375,34,-0.17522520419022553,-0.08057848481134318,0.01821757161256754,0.11889877706394053,-1.9655791680933927,-2.022249454881292,-2.0072276472370323,-1.9217681902127,-1.7718933039021143,-1.5679704649801365,-1.3239872138268636,-1.0565738631438375,-0.7838422628221176,-0.5241216020124169,,, +17.3515625,34,-0.2946794084468285,-0.1105169365149461,0.016677052612470874,0.07934116150737602,0.07456805391065358,0.004306251371658521,-0.12477704140101176,-0.30176251460832393,-0.5122421958164394,-0.7393265156487685,-0.9648247661549444,-1.1705166292581108,-1.3394261013193267,-1.4570089719852548,,, +17.359375,34,-1.5121710428704889,-1.4980460739535268,-1.41247919978239,-1.2581820954353455,-1.0425490614313475,-0.7771468413458432,-0.4769137369137807,-0.1591238564275448,0.5175565137615805,0.9113137199200784,1.205116506335366,1.3599773884101498,1.3584200290099429,1.2071486394671165,,, +17.3671875,34,0.9359520066663404,0.5930131311352429,0.2373553001463081,-0.07039857223758272,-0.2775137974497525,-0.3474009249804761,-0.26535560436486305,-0.04088705791905267,0.2937277187376441,0.6884390335647779,1.0831910229227435,1.4172501102992716,1.638642587661777,1.7122314931834273,,, +17.375,34,1.6251748765902074,1.3889153862828345,1.0373913570169118,0.6217480775135783,0.20237301189989504,-0.16050446382038686,-0.4161846857937186,-0.531381044084821,-0.4953872280302397,-0.3217236278535527,-0.046006555279141936,0.2796277186669029,1.1726682978342748,0.6701309685096735,,, +17.3828125,34,0.12655794298011436,-0.31549047151538057,-0.54304788295368,-0.5035521778087639,-0.21908540810971866,0.21985790031381647,0.6793643473338622,1.0190053068050124,1.1305344830184674,0.9677715016797276,0.5594792474836761,0.0017035256453837994,-0.5683276331695936,-1.0095937554009526,,, +17.390625,34,-1.2157155040811591,-1.1439006502060756,-0.8264712390521345,-0.3618146468950717,0.11275957973328572,0.4588162426791835,0.5748838741426439,0.4243963678787175,0.045827598505787104,-0.4577596935483766,-0.9468873603467264,-1.2838369040287376,-1.3703640539644162,-1.1746167847971676,,, +17.3984375,34,0.2191650443952347,0.31672089653220936,0.4093158966155578,0.494784291027676,0.571083171017641,0.636328484590964,0.6888282679618138,0.7271125145512379,0.7499591583977365,0.7564157168712492,0.7458162135973739,0.7177930851342309,0.6722838627805208,0.6095325123823601,,, +17.40625,34,0.5300854085407283,0.4347820135759568,0.3247404243226873,0.20133803969511946,0.06618768739464276,-0.07889037235363061,-0.23190007595995304,-0.3907042648342931,-0.5530618653470123,-0.7166668895047471,-0.8791885735703144,-1.0383119519383168,-1.1917781559502016,-1.3374237321480344,,, +17.4140625,34,-1.4732182916404604,-1.5972998314667848,-1.70800710961566,-1.8039085069382896,0.15781129033737995,0.455620295620311,0.7174393852658699,0.9289816039325048,1.0795261378712624,1.1626588020254944,1.1767120706607281,1.1248739828584902,1.0149583449038078,0.858852270706552,,, +17.421875,34,0.6716796018491384,0.4707385616569073,0.2742877412144507,0.10026509162818832,-0.03497073138407436,-0.11778888320122627,-0.13824459931587674,-0.09078037723878728,0.02537884152538284,0.2061640637794944,0.4429385241805143,0.7230926028447859,1.0309159119216866,1.3486857538948331,,, +17.4296875,34,1.657896065741943,1.9405411662121683,2.180364801475588,2.3639874038223705,2.4818329702228787,2.5287909401915885,2.504566931219605,2.4136978864209864,0.5946754861161996,0.8397247313909998,0.9657473845903456,0.9417771928131421,0.7597771350650233,0.435938035694204,,, +17.4375,34,0.008205877415168372,-0.4695772973551753,-0.9360065675968532,-1.3316237262557165,-1.6081223892823218,-1.7358151579045336,-1.7082000706711438,-1.5429153866021732,-1.2789342796784189,-0.9704366794098032,-0.6783130436202927,-0.4606236864712755,-0.3634999589044532,-0.4139047526893035,,, +17.4453125,34,-0.6153801932378864,-0.9474451079348714,-1.368736375574084,-1.8234051225306842,-2.2497717597662445,-2.5898920151601152,-2.7985442089520944,-2.8502381490728066,-2.7431541497862404,-2.499398809203196,-2.1615378472374074,-1.7859461541323762,0.3860321063309053,0.8000485491964693,,, +17.453125,34,0.9745186805065896,0.8821400276548998,0.5704343783260959,0.1485659329173456,-0.24275115739361786,-0.4700068782276763,-0.4436880463095204,-0.14302402740356554,0.3780984970478705,1.005674779900243,1.5965925785978652,2.0176171063381894,2.181667917952723,2.071447495674086,,, +17.4609375,34,1.7439478112463624,1.314601885576604,0.9254260146230628,0.7058859412065257,0.7372143148874695,1.0299607842667204,1.5209292784421984,2.0903434517110004,2.5945371826717483,2.9052119038005246,2.9445025911253992,2.7062427787701897,2.257601202553753,1.720642023989566,,, +17.46875,34,-1.88382687071062,-1.946859904960891,-1.992395750649808,-2.020123483017753,-2.0300383424096013,-2.022441607104886,-1.997935110494634,-1.957410498725712,-1.9020334170213211,-1.833222901685584,-1.7526263387485248,-1.6620904278261273,-1.5636286597277025,-1.4593858773733372,,, +17.4765625,34,-1.3516005406603069,-1.2425653561197785,-1.1345869608258372,-1.029945366590915,-0.9308538746622452,-0.8394201629024589,-0.7576092269042195,-0.6872088240159668,-0.6297980254399401,-0.5867194271265672,-0.5590555061294958,-0.5476095364940984,-0.552891398908695,-0.5751085326615091,,, +17.484375,34,-0.6141621883963952,-0.6696490473447896,-0.7408681787392428,-0.8268332136415312,2.265230590059868,2.0720859804247573,1.8501535992375282,1.6171793345376326,1.391524027605221,1.1908795188392816,1.0310316746747712,0.92475666076244,0.8809274341592168,0.9038927672758372,,, +17.4921875,34,0.9931721110229108,1.1434875793224142,1.3451308277968217,1.5846392453938516,1.845734307506424,2.110456656957233,2.36041875994478,2.5780877843183365,2.74800923924619,2.857886045396862,2.8994377852278537,2.8689802109142075,2.767684593958475,2.6014988254030333,,, +17.5,35,2.3807357619861262,2.119357516828667,1.8340055952383896,1.5428444985351415,1.264299425548982,1.0157760856773108,0.8124518841470728,0.6662227624735066,-1.4340109163568835,-1.1625580611426722,-1.0149932126373211,-1.014537042906802,-1.1606086669680378,-1.428920385473187,,, +17.5078125,35,-1.7752689956075711,-2.1424331097970253,-2.4691021239802007,-2.6994460166461427,-2.791835327100576,-2.7253530060233047,-2.5030837401381225,-2.1516682601366166,-1.7171918723335815,-1.2580474021932158,-0.8358839739064797,-0.5060511771015046,-0.3090267548658924,-0.2641627468274297,,, +17.515625,35,-0.36672389892745816,-0.5886793544812643,-0.8831240399892911,-1.191640808746539,-1.453456361886401,-1.6149645728337594,-1.6381336142190408,-1.5064871396146795,-1.2277276273397466,-0.8325929972081503,-0.3701243028344165,0.0999186983307464,0.8910432336967656,1.0993852907952677,,, +17.5234375,35,1.4914284245445448,1.9428743226631928,2.3107951901851136,2.4729491255763345,2.3614440737427222,1.9815226351786592,1.4103177877748363,0.7759188145523872,0.2224829931634952,-0.12904706123091025,-0.21385623371815776,-0.04078160386111185,0.3103518533072825,0.7108521855930603,,, +17.53125,35,1.0186731454082718,1.1175835120935664,0.9492557897891998,0.5294776552656312,-0.055958920279807416,-0.6745661215807917,-1.1832799717524551,-1.4674936081748031,-1.4723078447720837,-1.2174355678852151,-0.7916763398313543,-0.3284765992769973,0.03072546963639444,0.1753236669691729,,, +17.5390625,35,-0.9262895220739285,-1.0377360927344146,-1.1594517322300448,-1.2895251251231246,-1.4258882284853376,-1.566352416255643,-1.7086467405551395,-1.8504576400351391,-1.98946939999328,-2.123404655833681,-2.2500642306731016,-2.367365609562772,-2.4733793766573315,-2.566362977328522,,, +17.546875,35,-2.6447912140640115,-2.7073829421704065,-2.7531234978464627,-2.7812824659091078,-2.7914264760559697,-2.7834268035964382,-2.757461641550668,-2.714013004319129,-2.653858317121084,-2.578056838451288,-2.4879311532711226,-2.385044060963108,-2.271171262706812,-2.148270326486037,,, +17.5546875,35,-2.018446473114024,-1.8839157823172823,-1.746966463100346,-1.609918866494655,0.5848791221853011,0.5715682845891711,0.6245809577411061,0.7374765872125274,0.8995388353191273,1.0965294121073264,1.3116876759723517,1.526906283090601,1.7240008880516169,1.8859853392937025,,, +17.5625,35,1.9982634294715491,2.0496540795654217,2.033178450515403,1.9465540775595904,1.7923615525768355,1.5778721139100285,1.314548149110173,1.01725142485362,0.7032142394425296,0.3908452255250156,0.09845306116938868,-0.15702292792240713,-0.3611867726111239,-0.5031826203420993,,, +17.5703125,35,-0.5764447599422993,-0.5791486254548447,-0.5143313446167668,-0.3896734408994794,-0.21695692646233505,-0.0112375891947111,0.21021079328740933,0.4291066761023673,0.5163130549208951,0.825857881196734,0.9916122412982412,0.9986028074010168,0.856112524561798,0.5961940276604772,,, +17.578125,35,0.26863955583763965,-0.0668089867649701,-0.3497963301667529,-0.5287821677149351,-0.5690928696361811,-0.4583423695708071,-0.20837779755097274,0.14655325789736728,0.5551284541154148,0.9569398919701776,1.2919024595365238,1.5096159140065684,1.5772224785653306,1.4845360415881397,,, +17.5859375,35,1.245643987295233,0.8967320730370545,0.4904710290843644,0.08783906749848669,-0.2513461610739958,-0.4777116312348493,-0.5599831683714545,-0.4898178487055461,-0.2830621156383885,0.02276011864185851,0.3743379051749094,0.7109245071172383,-0.8059600371923227,-1.3199042939683776,,, +17.59375,35,-1.7036113348355926,-1.850094187539829,-1.7152544142035147,-1.33008127089378,-0.7922900861176524,-0.2396902188122333,0.1874198281225604,0.3845253801794741,0.3113489183691416,0.002687413630807823,-0.4413345677766727,-0.8829226266142101,-1.1845989088525504,-1.2471040442009642,,, +17.6015625,35,-1.0368247116582123,-0.595227609679692,-0.02771213265171607,0.5250651903832259,0.9255374161223096,1.0767373358150285,0.9486925051286575,0.5864728151555769,0.09768662316632692,-0.3771461496039141,-0.7032227944127344,-0.7885003335682015,-0.6089985754056632,-0.21542812437202435,,, +17.609375,35,-1.4750849408191866,-1.3447278393391322,-1.2210223875304775,-1.1060171021144782,-1.0015984268410605,-0.9094578111892132,-0.8310622083689351,-0.7676285091307781,-0.7201023589768281,-0.6891417296051583,-0.6751055321749412,-0.6780474716924461,-0.6977152500450989,-0.7335551315522142,,, +17.6171875,35,-0.7847217910031096,-0.8500932716539059,-0.9282907911744676,-1.0177030486537155,-1.1165146069465084,-1.2227378532938868,-1.3342479784848196,-1.4488203619695532,-1.5641697082140045,-1.6779902489041445,-1.7879963069589049,-1.8919625119636718,-1.9877629627383064,-2.073408651196663,,, +17.625,35,-2.1470824920833738,-2.207171345107055,-2.2522944686412387,-2.2813279066474683,0.6274410006198629,0.7887381907176031,0.8992099469509799,0.9487213699541948,0.931502031948836,0.8465524014740802,0.6977172711481475,0.4934210599247218,0.246083440613372,-0.028743963879973574,,, +17.6328125,35,-0.31345962059972554,-0.5896374139147906,-0.8393098185998839,-1.0462194424098108,-1.196951666836631,-1.2818694053041892,-1.2957847962140498,-1.2383209918027105,-1.1139388135376789,-0.931626413880456,-0.7042735830529362,-0.4477743293397593,-0.1799203089846705,0.08083773432158943,,, +17.640625,35,0.3166741570635022,0.511628686375184,0.6527162923555009,0.7308292750462604,0.7413686691409312,0.6845609457470844,0.5654379364385096,0.3934813900856855,0.9738484536408936,1.1157027327000506,1.1077805809239585,0.9445994249588958,0.6448080600987545,0.2483354791786845,,, +17.6484375,35,-0.1897748537524004,-0.6078852306964329,-0.9473116459067208,-1.1614126030490677,-1.2228034338666347,-1.127572734091513,-0.8958444506623113,-0.5685983293008111,-0.20124420114194946,0.14504881792985466,0.4129174703780835,0.5577738132255855,0.5547817546606479,0.40275386224262494,,, +17.65625,35,0.12436133498286164,-0.2373757063096692,-0.6257710772705218,-0.9792877497053296,-1.241112499250027,-1.3679987421721729,-1.3370002852544238,-1.149047193178602,-0.8288068136710068,-0.4208515858783191,0.017269525501327432,0.4239768719436323,1.0218494838108496,1.0456645299187664,,, +17.6640625,35,0.7902203246423342,0.31133180883880224,-0.2758469214818064,-0.8282664801116219,-1.2140523919920434,-1.3484948736532272,-1.2170958528562914,-0.8793582636846979,-0.4522807573300882,-0.07808322961488567,0.11498946612603822,0.04804110023981578,-0.28662196140505103,-0.8231480320998462,,, +17.671875,35,-1.4399528488752764,-1.992808014474078,-2.3541387474826405,-2.44776273994132,-2.2695513311679463,-1.8883524117058528,-1.4269240545257995,-1.0281062283351088,-0.8155036274912,-0.8594568564375421,-1.1576296779080135,-1.6355340470947697,-2.1668501308714454,-2.6079731153479044,,, +17.6796875,35,-2.2934243816882685,-2.2880283455753743,-2.2648859239955965,-2.2240495808557483,-2.16587742054664,-2.091027140215388,-2.000444737811003,-1.8953481734943327,-1.7772062703681215,-1.6477132238434495,-1.5087591658467143,-1.362397299155941,-1.2108081772055117,-1.0562617546844533,,, +17.6875,35,-0.9010778732873452,-0.7475858743708829,-0.5980840455659928,-0.4547996112934533,-0.3198499676132974,-0.1952058400495582,-0.08265700935605902,0.016218794767881014,0.10008328748053197,0.16786083058834478,0.2187570361960864,0.2522724466018419,0.26821105103497,0.2666834902419206,,, +17.6953125,35,0.2481048929386207,0.21318738214537536,0.16292738274481666,0.09858795263936693,0.1819569598025978,-0.053015924998412525,-0.2935934283131705,-0.521457151553286,-0.7190972828078834,-0.8710395593544209,-0.9649304690017579,-0.9924050009022208,-0.9496764195697428,-0.8378069196921921,,, +17.703125,35,-0.6626402721996428,-0.43440114218025583,-0.16698900301952524,0.12298413230094125,0.4173450775322524,0.6976196656705109,0.946313907490308,1.1481267939824271,1.2910101872686937,1.3670019075523068,1.3727739393613625,1.309857545870408,1.1845296101703469,1.0073681458916404,,, +17.7109375,35,0.7925079892449598,0.5566485915692546,0.3178831180229429,0.09443051858575358,-0.09664099676515348,-0.24061004783152995,-0.3261343174963868,-0.3460469338053429,0.7432299593203534,0.9332308325294748,0.972905530595068,0.8651542323662372,0.6363640245133438,0.332260357073468,,, +17.71875,35,0.010743536881270556,-0.2671737791667622,-0.4469163354750265,-0.4888956141395033,-0.3747269047127716,-0.11014550787411292,0.2758324085111815,0.7353738752039911,1.209223089382858,1.6358739218702858,1.9610925879545007,2.1463075681853008,2.1745602978564684,2.0530900660509124,,, +17.7265625,35,1.8121508022205324,1.5002443276721231,1.176512798324515,0.9014755291183189,0.7275532533872618,0.6908559689376552,0.8055137012317711,1.0614334290447451,1.4258317615888696,1.848304848287024,2.2686460440347536,2.6261938587411224,-2.469073906551244,-1.9573976072795165,,, +17.734375,35,-1.3822839521727304,-0.8871966747176372,-0.5911342742644251,-0.5561211314801522,-0.7703338745007658,-1.1514864584450029,-1.569544940439079,-1.8825450792708625,-1.9756946473796213,-1.7930419657924137,-1.353029427623032,-0.7436673133211182,-0.09864858172444416,0.4390512394608629,,, +17.7421875,35,0.7561150291363377,0.7996955325362156,0.5916549877723429,0.22233243191187385,-0.1744509840029121,-0.4582962943749162,-0.5209242590331091,-0.3160583854571143,0.1276984236574613,0.7145243942386503,1.3074786117518569,1.7658882085969445,1.9837775384799363,1.9188081137188664,,, +17.75,35,0.02167644701309246,-0.06608209307695223,-0.16277536168737644,-0.2663374857649799,-0.3745854095369722,-0.4852573283108841,-0.5960524985881442,-0.7046717272971044,-0.8088578310713159,-0.9064353570100292,-0.9953488693059994,-1.073699131229277,-1.139776548810724,-1.1920912905258565,,, +17.7578125,35,-1.2293995554728745,-1.2507255299919071,-1.255378648162063,-1.2429658538460475,-1.2133986494795648,-1.1668948080842472,-1.1039747184359645,-1.0254524272929024,-0.9324215354468742,-0.8262361944703361,-0.7084875368243473,-0.5809759519527932,-0.445679693729802,-0.3047203688694863,,, +17.765625,35,-0.16032591051756406,-0.014791685291121319,0.12955958529101572,0.27041838727570583,-0.2978614532623295,-0.1839502184558407,-0.011383640350993374,0.20855839902838091,0.461168963092404,0.729335746333368,0.9947307934383168,1.2390852979700258,1.4454605931531606,1.599426712084603,,, +17.7734375,35,1.6900663394344688,1.7107341519281498,1.6595186016418877,1.5393739449591544,1.3579133140462512,1.1268772634745334,0.8613148539447375,0.5785343799525515,0.29689691085083664,0.034536775078617736,-0.19190178903827185,-0.36842372066526574,-0.4846571380974092,-0.5345743381777303,,, +17.78125,35,-0.5169095204559137,-0.43524411220023146,-0.2977537503976324,-0.11663457138771086,0.09275117758702392,0.3129506173043907,0.5256418003115366,0.7129161661844441,2.869254352525847,2.9631305242871977,2.895508190424821,2.6783595714031523,2.346068169044294,1.95006705073676,,, +17.7890625,35,1.5508256911419944,1.2084334770575111,0.9732465371146116,0.8780546736955749,0.9329883896008848,1.1239591971032747,1.4148760493499193,1.7532925632486709,2.078605319828553,2.3315261656747928,2.4633529887895955,2.4435948139033297,2.264763369595254,1.9435846015168416,,, +17.796875,35,1.518441204327886,1.0434442709134442,0.5800571786685751,0.18757607444351576,-0.08605059835281381,-0.21163390202113275,-0.18323339352162726,-0.01902440552683193,0.2415911718815329,0.5441803042245377,0.8278151584509393,1.034620508560574,0.6582867103226233,0.30467033613373595,,, +17.8046875,35,0.1788880898669024,0.3181150504228389,0.6844939139726414,1.1755820855862051,1.6525204520571926,1.978202677853086,2.054982840781275,1.851585579476812,1.4118420326950971,0.8428557092769259,0.28583993512064065,-0.12238239095566472,-0.2866669175810336,-0.179406309153184,,, +17.8125,35,0.15212588058968962,0.5989565360396203,1.0205047510748404,1.2833346400002716,1.2979460707811477,1.043517987584348,0.5738208804991732,0.002676007932454122,-0.5270553073644986,-0.8824549636156747,-0.97682142850777,-0.7932932020092944,-0.3893492418717237,0.11904591842199988,,, +17.8203125,35,0.4055287504529115,0.5327276520217503,0.6499827978382792,0.7554281197542925,0.847396367537406,0.9244482247345558,0.98539743870784,1.0293315248532229,1.0556276825119013,1.0639636439193911,1.0543232662586215,1.0269967689276074,0.9825756118913264,0.9219421048178512,,, +17.828125,35,0.8462539289593614,0.7569238428151236,0.6555949269368221,0.5441118013502823,0.4244883195757566,0.29887230492517824,0.16950794654230686,0.038696513618450376,-0.09124392432640824,-0.21801906581858205,-0.3393985241244372,-0.4532548493127537,-0.5576007424379483,-0.6506238102445951,,, +17.8359375,35,-0.7307182518728695,-0.7965129227610507,-0.8468952843811413,-0.8810308204887483,0.8585324481490101,0.9490545810702496,0.9747942491193644,0.930492333951938,0.8156917309404351,0.6347755223586276,0.39666783162872415,0.11421820458582548,-0.1966875680643005,-0.5182281972023577,,, +17.84375,35,-0.831882467771984,-1.1197134928847359,-1.3656121107212107,-1.5564127347804089,-1.6828038624747788,-1.7399697663866447,-1.727918638136618,-1.6514743195772317,-1.5199322152171826,-1.346403397519323,-1.1468926600143536,-0.9391748257665642,-0.7415476869593597,-0.5715485541149423,,, +17.8515625,35,-0.4447239309281645,-0.3735381258676739,-0.3664969229344821,-0.4275474369492813,-0.5557960191735011,-0.7455639000675834,-0.9867767041048744,-1.2656606891796558,1.1188448531544497,1.054042085908382,0.8372448573156684,0.4894793333919318,0.05254091257501137,-0.4174671523192929,,, +17.859375,35,-0.8588260741191249,-1.2137711466602568,-1.4374483515674252,-1.5048631168435178,-1.4147391045703748,-1.189686167285664,-0.8726514612178304,-0.5202066038660361,-0.1937165469346297,0.05023425020924355,0.1686671022798758,0.13891120120804246,-0.03786137601903283,-0.33681835868050736,,, +17.8671875,35,-0.7133392043898993,-1.1099731453668529,-1.465399551480076,-1.7239949107350172,-1.8445162239161543,-1.80654821366154,-1.613710026929819,-1.2931218175392312,-0.8912141213537617,-0.4665325494328594,-0.08065830388985085,0.21134152277097973,0.9433500648450022,0.734062906277871,,, +17.875,35,0.3260184221597431,-0.16170297183230065,-0.5861435804894773,-0.8197194206726294,-0.7852785640773339,-0.4773575637183154,0.0361908000833191,0.6326457647319523,1.1678880727790544,1.5157192363363994,1.6022560056446826,1.4259753333088026,1.0579180032516806,0.6219970995971145,,, +17.8828125,35,0.2608102302258851,0.09632745988256408,0.1962313567131333,0.5551364965287289,1.095837751358215,1.6902473753652982,2.1942847482111776,2.487158567454373,2.5042773605206627,2.2547703725900767,1.8188186032026603,1.325529063096016,0.9174176938584708,0.7112363949698688,,, +17.890625,35,-0.8983775799473533,-0.8986955915283661,-0.8820509858793709,-0.8488147525356495,-0.7996561537908178,-0.7355309108065539,-0.6576643688785901,-0.5675299366956922,-0.4668231771855237,-0.35743200367747385,-0.24140350332154764,-0.12090796875084794,0.0017992321317485407,0.124417280504083,,, +17.8984375,35,0.24464033121818834,0.3601980297135395,0.4688954117221225,0.568651487032872,0.6575358316231562,0.7338025473440861,0.7959209944254141,0.8426027585837043,0.8728243804388531,0.8858454491454225,0.8812217433195301,0.8588131890548959,0.8187864955784105,0.7616124222835468,,, +17.90625,35,0.6880577248846911,0.5991719216008574,0.4962691109776925,0.3809051595989749,-1.5656971737996557,-1.8687686105143773,-2.1564163993988865,-2.4111227428649142,-2.6175271660219197,-2.763492882158144,-2.840948653068072,-2.8464474487330738,-2.781402958662951,-2.6519874709211626,,, +17.9140625,35,-2.468698248038585,-2.2456226450328525,-1.9994532216595584,-1.748321533945731,-1.5105319333164156,-1.3032836736355984,-1.1414704409717782,-1.0366410211641934,-0.9961935827852716,-1.0228597615159123,-1.1145145223572817,-1.264325057740379,-1.4612283367232235,-1.6907040017474189,,, +17.921875,35,-1.9357887130981264,-2.178261203465216,-2.399915400065061,-2.583832829747025,-2.7155655717306533,-2.7841472596700507,-2.7828616246403604,-2.7097149773765348,0.3694466788188472,0.3748707394944575,0.2329389458666433,-0.02779107926871449,-0.3600285141174909,-0.7051673697912737,,, +17.9296875,35,-1.002467690417666,-1.1985696138434163,-1.255858138137376,-1.1583754468200644,-0.9143596270498222,-0.5550140741994065,-0.1296989703715795,0.3017064896505978,0.6780817739100401,0.9465378078580688,1.0706097054020651,1.0358936197322242,0.8522499770628978,0.5522301471582599,,, +17.9375,35,0.18597180979176167,-0.18664171992870576,-0.5053368080195724,-0.7188621644107024,-0.7929926427246133,-0.7158774244259429,-0.4998994803088134,-0.1797566092360271,0.1929371163010252,0.557688682514891,0.8545504047878392,1.0334632525575616,1.5269950301485922,2.016536998302889,,, +17.9453125,35,2.3924715789435496,2.540950061998095,2.4078513216271906,2.0136774121033314,1.4480191259069481,0.8451076359281717,0.3471518862700028,0.06550876992437049,0.050326923695434685,0.27698244206810874,0.653022499311556,1.0437121299291356,1.3091807289154822,1.3429855936406248,,, +17.953125,35,1.1015213738593213,0.6162130898926833,-0.014851162771607791,-0.6535567687865897,-1.1593703081642053,-1.42761345527198,-1.4179154740475144,-1.1650484238186076,-0.7691774911321184,-0.3682004713791601,-0.09975914497592052,-0.06333579439566928,-0.29282463599361674,-0.7470969286661601,,, +17.9609375,35,0.25485065901099585,0.12006012526435722,-0.021362019737242888,-0.16719808953524876,-0.3151557556020759,-0.4629079748609449,-0.6081335232356739,-0.7485574256220917,-0.8819905744780061,-1.0063678434461736,-1.1197840287712593,-1.2205269893087392,-1.3071074049807847,-1.3782846327394225,,, +17.96875,35,-1.4330882074360949,-1.470834611250546,-1.4911390181817197,-1.4939218080891998,-1.4794097363597358,-1.4481317388519113,-1.400909445708566,-1.3388425702763826,-1.263289429102502,-1.175842934241316,-1.0783024783747035,-0.9726422051709722,-0.8609762206032644,-0.7455213545018724,,, +17.9765625,35,-0.6285581245239773,-0.5123905861847653,-0.3993057721075183,-0.29153343084241873,-2.5675796726282885,-2.3639985412799898,-2.110663917012161,-1.8226075752047453,-1.5171580601722938,-1.2127380969926054,-0.9275859350494552,-0.678489774356131,-0.4796235129494151,-0.34156498772596355,,, +17.984375,35,-0.2705651548338731,-0.2681191565224608,-0.33086916949935397,-0.4508457933443309,-0.6160311297795809,-0.8112042708252438,-1.0190102203877005,-1.2211776929588678,-1.3998008512752564,-1.5385955860601543,-1.6240427161656654,-1.6463383728256038,-1.6000852774388776,-1.4846766906712792,,, +17.9921875,35,-1.3043462417974363,-1.0678801465734968,-0.788011864849212,-0.4805413938330475,-0.16324059522990753,0.1453791246997284,0.4273508641948913,0.6664984785863018,1.0620639316045506,0.9307396837284606,0.6541434256578963,0.26893314956301273,-0.17191242118075115,-0.6073166803443224,,, +18.0,36,-0.9775858839694741,-1.2336712787535653,-1.3447701680003417,-1.3030822047949564,-1.1249803055529244,-0.8484140328994322,-0.5269501224707579,-0.221378622425224,0.00980770654988128,0.1195775783272206,0.07974130870413433,-0.11460289326700135,-0.444249290561378,-0.8688195930092159,,, +18.0078125,36,-1.3329956960782685,-1.7750796941247309,-2.1365481920066074,-2.3711130689435493,-2.4518777168200314,-2.375474409221154,-2.1625386550394525,-1.854446915784032,-1.5068260565058225,-1.1808457084170167,-0.9336500318944316,-0.8094193976979407,-2.2708777381043763,-2.413057961954153,,, +18.015625,36,-2.2719061479223863,-1.8930930400483752,-1.3848467083934848,-0.8883177843350406,-0.538943862154984,-0.4294013851587201,-0.5842980540884593,-0.953540879059152,-1.426196379880078,-1.861042984103351,-2.1254406810670674,-2.131863332629107,-1.8620795044782248,-1.3723527351539466,,, +18.0234375,36,-0.7782340629477098,-0.22311269900586594,0.16085792306138247,0.2887518536784728,0.14591799665548222,-0.20823129387100325,-0.656726589000987,-1.057316726487873,-1.2816653667198614,-1.250724189296938,-0.9565861170801262,-0.4648274834607418,0.10330441980495664,0.6039780588093385,,, +18.03125,36,-0.19120677034783887,-0.10032489365039744,-0.02071758455423156,0.04598693987056801,0.09839074524103664,0.13535086132181373,0.155999496693352,0.15975943255302172,0.14635432598191,0.11581374214888294,0.06847282722250958,0.004966627601162954,-0.07378084518167438,-0.16657261251701005,,, +18.0390625,36,-0.2719595097285825,-0.3882653862660521,-0.5136162839327674,-0.6459730823459735,-0.7831670401108753,-0.9229376094826912,-1.0629718624865097,-1.2009448382362198,-1.3345601050712113,-1.4615898273592929,-1.579913635485278,-1.687555618504457,-1.7827187918002445,-1.8638164363045424,,, +18.046875,36,-1.9294997606092323,-1.9786814016820984,-2.0105543527661416,-2.0246059871039384,0.8495581461165709,0.9670970510226258,1.0141651351094567,0.9906344825043488,0.9012026840783148,0.7550599592087657,0.5652432592366683,0.3477224040952409,0.12028198912132118,-0.09872296001517288,,, +18.0546875,36,-0.2916508030992717,-0.442807038984126,-0.5395419558947475,-0.5731356289386118,-0.5394085450694439,-0.4390152694073041,-0.27740067013790803,-0.06442175088728119,0.18633854147102907,0.4585176852589795,0.7341141366445292,0.9947425325274888,1.222916013957324,1.4032662483369904,,, +18.0625,36,1.5236160723058807,1.5758299536162914,1.5563829628751307,1.4666085744369697,1.3126080111929983,1.1048274488480387,0.8573325557166294,0.5868309490849154,-0.8324543762932092,-1.0033594240745771,-1.2989208442933888,-1.6756981799844752,-2.0767697910720053,-2.4405820677966816,,, +18.0703125,36,-2.710524060399087,-2.8437362973087965,-2.817781822626565,-2.634140433394266,-2.3179818794436056,-1.914253338697942,-1.4806905307568283,-1.0788409702647317,-0.7644974606393827,-0.5790317667145916,-0.5429781774731499,-0.6528662186830552,-0.8817956845669164,-1.18366425406377,,, +18.078125,36,-1.500389031142659,-1.7709970133622512,-1.9411683826644004,-1.971745969283296,-1.8448852511821383,-1.5668867392367931,-1.1672693244171417,-0.6942286446646884,-0.20718757430099904,0.23240114964050346,0.5705679150264973,0.7691734312284025,0.7079066526558866,0.2655014314177383,,, +18.0859375,36,-0.2579342718107146,-0.718922722519514,-0.9932049425254524,-1.0097744674782163,-0.7702942881199417,-0.3485757852705538,0.1297369208364541,0.5217084884827228,0.7064119496224769,0.6182143667837888,0.26492460787150196,-0.2741720218309636,-0.8698552844541287,-1.3781855405027796,,, +18.09375,36,-1.6797436656949891,-1.7121428431619408,-1.4869037723481306,-1.0860704100457859,-0.6394959074817239,-0.2890261431327208,-0.1493992233344732,-0.27657935419127433,-0.6522059072793288,-1.1884217484052069,-1.7517594733098347,-2.1995408948609385,-2.4188155034453263,-2.3571676337048197,,, +18.1015625,36,-2.0206269320016568,-1.9987146379119127,-1.95927158010391,-1.9029981244671192,-1.8308801824257632,-1.7441718711770884,-1.6443734829219918,-1.5332051488947986,-1.4125766593729845,-1.2845539681631537,-1.1513229681008037,-1.0151511718891841,-0.878347969277654,-0.7432241564964803,,, +18.109375,36,-0.6120514466175452,-0.4870226698282456,-0.3702133605307981,-0.2635454038919718,-0.16875337839741178,-0.08735418376522941,-0.020620486033463892,0.03044155519873548,0.06510988738188772,0.08295918529915502,0.08386827004631893,0.06802219681481103,0.03590897493343825,-0.011689022380994007,,, +18.1171875,36,-0.07370880813108928,-0.14882545071470754,-0.2354753352487909,-0.3318836097063684,0.31151072701987953,0.04977605944587876,-0.18103199999627728,-0.3658402898726024,-0.4928899028520969,-0.5545511791161755,-0.5478505114588931,-0.47467223911228607,-0.3416215649538945,-0.1595580691779298,,, +18.125,36,0.057167636672690585,0.2917208700097053,0.5259632181244691,0.741723935292988,0.9220737216228146,1.052512042852728,1.1219851791030997,1.1236639941686537,1.0554271722251942,0.9200162073575844,0.7248513209470938,0.4815211264610503,0.20498161180403468,-0.08747972039287191,,, +18.1328125,36,-0.3774423378154498,-0.6466302316488348,-0.8781794668870173,-1.0578073561138608,-1.1748017430028341,-1.2227614258373691,-1.2000361048722668,-1.109835190176727,0.8117903090075528,0.7062032304218135,0.4831385860476963,0.19142173376993152,-0.10968355470706953,-0.3597600106945493,,, +18.140625,36,-0.5066997043764067,-0.5148706527032285,-0.3707149571509619,-0.08490629373894533,0.3092695102813449,0.7610587903157943,1.2101081906200892,1.5958313169866496,1.8668151526719297,1.9888012829341308,1.949998935860768,1.762902411434078,1.4623299107792025,1.099989293995026,,, +18.1484375,36,0.7364172234162811,0.4315472372804287,0.2353758290086901,0.18018032138341555,0.27550060367609863,0.5066662928278076,0.8370986408606278,1.2140285540848128,1.5767399927559944,1.8660546596897933,2.0335805309153416,2.0492835469978448,-1.0278693408349442,-0.6144482862547282,,, +18.15625,36,-0.4177314825429361,-0.4846962008190439,-0.7874691871873616,-1.2309834642160749,-1.6790735563681434,-1.9918569383279137,-2.0641560851386203,-1.8544301045629696,-1.3962857762879888,-0.789412097809006,-0.17242165937483844,0.3149591998748408,0.5699904754389842,0.5548684336435734,,, +18.1640625,36,0.3068669866694908,-0.07210700951300877,-0.443679936352257,-0.6711774799902521,-0.6573282725347888,-0.3711695015099599,0.14322171279796347,0.7785663517588411,1.393548636851048,1.851317076609455,2.0567714663446197,1.9824185323607901,1.6757117995999635,1.24586575918391,,, +18.171875,36,-0.4360953352509687,-0.5460097952967604,-0.6594173624992838,-0.7740382781007922,-0.8875626645585973,-0.9976910707863946,-1.102174840018331,-1.198855593394887,-1.2857031378638664,-1.3608511345681342,-1.4226299031034897,-1.4695957871846876,-1.5005565674536885,-1.5145924763860783,,, +18.1796875,36,-1.5110724472489232,-1.4896653125140802,-1.4503457555653287,-1.39339491140065,-1.3193956057277032,-1.2292223157268798,-1.124026028179423,-1.0052142599997411,-0.874426590918465,-0.7335061366383291,-0.5844674618672686,-0.4294614949699783,-0.2707380584725037,-0.11060667140757408,,, +18.1875,36,0.04860369026276826,0.204585170662744,0.3550912380654061,0.4979758121493046,-0.9599978976551488,-0.7624406799834845,-0.5323205392414526,-0.2869725800097592,-0.04469590414250847,0.17652747648448908,0.3602913626586052,0.4929139394703072,0.5643960922552228,0.5691226299415724,,, +18.1953125,36,0.5062575074623432,0.379805477999774,0.1983358674415308,-0.02561227454817821,-0.27640217307429377,-0.5363876751106508,-0.7871420566563951,-1.010741605914047,-1.191014477968103,-1.3146677373457634,-1.3722139983721433,-1.3586330470998913,-1.2737223083301563,-1.122111718245172,,, +18.203125,36,-0.912941964399078,-0.6592285284604205,-0.3769558762398208,-0.08396495642374036,0.20128841814693416,0.4610177298296294,0.6793429136305255,0.8433942485943929,1.906202943839239,1.6215755795677835,1.2341939176070464,0.7984089407392818,0.3757118287212861,0.02520534165943289,,, +18.2109375,36,-0.20555122376216567,-0.2878978320271446,-0.2164848358787217,-0.01005266117013637,0.2915411022792004,0.6335838672107527,0.95508381650271,1.1983232608667769,1.3179013133958075,1.2878571532656522,1.1057641146825214,0.7931566540167914,0.3922234299133872,-0.040718686554982536,,, +18.21875,36,-0.4439534565329003,-0.7599376391226328,-0.9442261482277812,-0.9723600620899348,-0.8436448278954131,-0.5812303557157253,-0.2284806787634882,0.15780124174820784,0.5162381800548134,0.7904519643980437,0.9378542808341264,0.936285693689232,0.5540331519585472,0.7975861092927824,,, +18.2265625,36,1.250565736368362,1.7996895464195115,2.3026738750999267,2.627211688843912,2.68723892305516,2.4665497202979427,2.0232880182567907,1.4740839515550144,0.9621820778724294,0.6182956067793689,0.524914210145611,0.6938462962172528,1.0631492983881812,1.5142877082547452,,, +18.234375,36,1.904814631187019,2.1076179931348893,2.045973252687768,1.7147937004650695,1.1822521907215022,0.5713277063662565,0.026332133943863027,-0.3264109065885949,-0.41296057154163934,-0.23180225219467104,0.14595126958338242,0.5962541141840146,0.9763175370546529,1.1639237996774676,,, +18.2421875,36,0.6312306294435535,0.7530201928157647,0.8617136931560232,0.955913344429708,1.0344786360780769,1.096546078229205,1.1415440941082258,1.1692027990062086,1.1795584947065478,1.172952800798713,1.1500264382210368,1.1117077740109422,1.0591963279747318,0.9939415302086928,,, +18.25,36,0.9176171015541396,0.8320915057225704,0.7393949906015143,0.6416837959823578,0.5412021545689607,0.4402427517558472,0.3411063366670484,0.24606119179303826,0.15730317104914687,0.07691700612562025,0.0068395587825166295,-0.05117433731641573,-0.09558284699381248,-0.12508437374426362,,, +18.2578125,36,-0.1386405926045784,-0.13549487227368118,-0.11518576377262126,-0.07755531932882664,0.9442060127777588,0.9773375926576892,0.9431787440021856,0.8469177270571479,0.6981745484181673,0.5103248957921453,0.2995619214364857,0.08376131131571324,-0.11877120489468385,-0.2905825495310748,,, +18.265625,36,-0.41629573808216497,-0.4836887369961645,-0.4845534911904837,-0.4152752033561017,-0.27709145450713435,-0.0760130805579613,0.17758769376068695,0.4696931594095153,0.7836101603937933,1.1011266370974593,1.4037740432184005,1.674107621153329,1.8969152754179603,2.0602707628111645,,, +18.2734375,36,2.1563577743218616,2.182007460169281,2.1389119318118244,2.033498869783811,1.8764759982322343,1.6820772080532875,1.4670629152978347,1.2495443791712786,0.7874687864558123,0.5167375653868586,0.16908528078419136,-0.19785373221230687,-0.5227950280537064,-0.7503673782288106,,, +18.28125,36,-0.8397588223075799,-0.771098664056515,-0.5485812534210709,-0.1998448606886234,0.2282977794469941,0.6771124464338556,1.0850504440778204,1.3972913911877,1.5742356800562909,1.5976240975873102,1.4733316971298591,1.2304010221162385,0.9164655320540817,0.590276333725174,,, +18.2890625,36,0.31249650175801424,0.13619710920155748,0.0985355518455472,0.21491260291347825,0.4765185592997977,0.8516509699759099,1.2905989902274868,1.7333338799407223,2.1188080863208563,2.3944147983178787,2.524134856788341,2.4941023453433444,0.2559630904285281,-0.30190563718952196,,, +18.296875,36,-0.7672008690648534,-1.0196855177662851,-0.9953588569284132,-0.7039695535225209,-0.2263383168207111,0.3077760316375795,0.7552010058213499,0.9985296261604812,0.9782170711519264,0.7087988696000578,0.27478669172392084,-0.19263226234253028,-0.5517049510475271,-0.6891331906847256,,, +18.3046875,36,-0.5513093352856206,-0.15920441891479165,0.3971735003700135,0.9832339557295872,1.4564714087419703,1.705297988422715,1.6794008783414949,1.4033064560145343,0.96943581226513,0.5125570538712432,0.1726383348056093,0.056284512853886914,0.20732843468282325,0.5946387459643278,,, +18.3125,36,-0.02275209568604386,0.048771210880110834,0.13626545656155076,0.2386979344769233,0.35477022611444153,0.4829407073101045,0.6214513148092298,0.7683581048599004,0.921565068881138,1.0788606142227235,1.2379560713624491,1.3965255534013925,1.5522464700440162,1.7028399867786967,,, +18.3203125,36,1.8461107209418224,1.97998497970267,2.1025468705359365,2.2120716520045653,2.307055740987796,2.386242851040397,2.448645804305514,2.4935636351591097,2.5205936862042018,2.5296384849128506,2.5209072806034047,2.4949122149342395,2.4524591930619737,2.3946336153964918,,, +18.328125,36,2.3227812198794147,2.2384843703180186,2.143534206047296,2.0398991406598785,1.047713979508018,0.8785700109956813,0.7567249333822724,0.6933801968542581,0.6955391454748359,0.7655128991628163,0.9007536838399144,1.0940272448224455,1.3339123326039712,1.6055924417709206,,, +18.3359375,36,1.891884603420355,2.174433500289352,2.4349876446597025,2.656668635878185,2.8251449962085804,2.9296287370287346,2.9636251682054366,2.9253836698452265,2.8180179976654385,2.6492877369044745,2.43105614806304,2.1784622131829807,1.908864620235663,1.6406313258626362,,, +18.34375,36,1.3918591041719008,1.1791123707710125,1.0162692262646382,0.913555185852982,0.8768319729172248,0.9071909672274898,1.0008796530834232,1.149566190753089,2.3147222293108083,2.0190104340595543,1.6574151148862342,1.2899259285003288,0.9767005080404808,0.7686682798452541,,, +18.3515625,36,0.6995752714026231,0.7807090992737273,0.9991258542677879,1.3196551423118799,1.6903710514364223,2.05067695835599,2.3407449478623645,2.5108396091115317,2.5290739606772106,2.386389439439046,2.0979842342367494,1.7009674137178,1.2486041301417727,0.8020481191850037,,, +18.359375,36,0.420849063702242,0.1537131925050087,0.03095602509767048,0.05982259606275864,0.223403852160952,0.4833177778331522,0.7857374151388734,1.0698266355374129,1.277269490000362,1.3614086237838192,1.2945691242429749,1.0724267916751429,2.0346886812104144,2.1788654224136885,,, +18.3671875,36,2.03994509751558,1.65334512279072,1.1199138955934882,0.5782629579555888,0.16677185900132574,-0.014320809091999953,0.06964944756483704,0.3783340388818292,0.8075129305238413,1.2177626461178783,1.4727927242260628,1.4769427020852524,1.2015615952072898,0.6930386499770689,,, +18.375,36,0.06028282843067696,-0.5549191690635051,-1.0165441822297592,-1.231384678104272,-1.1743587936705262,-0.8951436934316089,-0.5043163720124395,-0.14280245834684402,0.056991633946758775,0.007708527860429638,-0.30878219518252936,-0.8361865119262605,-1.458995416272329,-2.03393480907349,,, +18.3828125,36,1.9296902614603937,1.8151242355783752,1.6984843723170033,1.5820805236042608,1.4682085247554102,1.3591098857930723,1.2569324391946817,1.163692633173553,1.08124013079256,1.0112253348302798,0.9550704070803708,0.9139442895845621,0.888742165213225,0.8800697172782361,,, +18.390625,36,0.8882324638266768,0.9132303534020744,0.9547577169312536,1.0122085766041429,1.0846872188117278,1.171023846028293,1.2697950335929449,1.3793486332028606,1.4978326870719914,1.6232278464753902,1.7533827270328473,1.8860515816677603,2.0189336315800737,2.14971336654879,,, +18.3984375,36,2.276101108895912,2.3958731308234484,2.506910622660421,2.607236829661564,1.3409236553947708,1.5594931954404363,1.787765911746037,2.0074080059810724,2.200543755396486,2.3510068380233187,2.4454727386866097,2.4743932582174257,2.432667947584473,2.320005633146944,,, +18.40625,36,2.1409508096052288,1.9045730465312078,1.6238410530003935,1.3147250341721637,0.9950899203058572,0.6834566314206185,0.3977177427571008,0.1538970956339354,-0.03496016643445954,-0.15968975171288835,-0.21563967112754312,-0.20298697002161847,-0.12671767125274902,0.003728654467807568,,, +18.4140625,36,0.1751248884239479,0.3713864743179816,0.5747007623887829,0.7667768172367138,0.9301285191394052,1.0493014671253,1.1119581111552448,1.1097454270923328,0.7147401645487453,0.2623319910756807,-0.229209994748444,-0.6981321496909727,-1.0860747926206122,-1.3471041617243955,,, +18.421875,36,-1.4548099703999966,-1.4063633625790488,-1.2229034953767728,-0.9461928044992984,-0.6320621706895866,-0.3416671845052727,-0.13191762760460626,-0.046571051304408966,-0.10937788206972876,-0.3203459319683015,-0.6557063118399269,-1.0715862145605175,-1.5108166530009244,-1.9118149326509841,,, +18.4296875,36,-2.2181584684351128,-2.3873588547016174,-2.3974696416442907,-2.2504986622651675,-1.972093441080749,-1.607548681847388,-1.2147576660871229,-0.8552053752502785,-0.5844061405162722,-0.4432751216030168,-0.4517774472845041,-0.6058440731127329,-2.411394350773456,-2.044105689958952,,, +18.4375,36,-1.5751685518173435,-1.147310416221022,-0.8893854342669796,-0.8809971659094045,-1.1306419119659727,-1.5733632110973983,-2.0885604401351245,-2.533070612812957,-2.78045633925326,-2.755731781554209,-2.456008549427506,-1.9514022084690128,-1.365949862536509,-0.8437674616827824,,, +18.4453125,36,-0.5097206724123428,-0.4353866652110243,-0.6196339576269971,-0.9891409616512444,-1.4187091814722117,-1.7658018036898624,-1.909839603232272,-1.7854822042161684,-1.4007711418312123,-0.8351600903760227,-0.2179699596827941,0.3068284488914502,0.6198542777246867,0.6588264746128785,,, +18.453125,36,2.6950517070771416,2.768763486656848,2.8270166018294454,2.8687154825611807,2.8930438032062504,2.8994788462852514,2.887800730638808,2.8580963423271784,2.8107578993984763,2.7464761756048084,2.6662285016646643,2.5712617541111498,2.4630706295319467,2.3433715845520715,,, +18.4609375,36,2.2140728978065924,2.077241378044657,1.935066301233652,1.7898212080507008,1.6438242306037092,1.4993976429848548,1.3588273438371288,1.2243229803091538,1.0979794115399502,0.9817401863518792,0.8773636745680441,0.7863924448943349,0.7101264254628632,0.6496003168953534,,, +18.46875,36,0.6055656532795557,0.578477825068241,0.5684882910223804,0.5754421154604733,1.0388846124078766,0.9004416652276562,0.7002599626838514,0.4485595247682046,0.15923089336735585,-0.15112714794882207,-0.4643589245423644,-0.7620120178919492,-1.026618348260866,-1.2429068712784082,,, +18.4765625,36,-1.3988633350687674,-1.4865632088793892,-1.5027197109908559,-1.4489087300515056,-1.3314549645315914,-1.1609872286131646,-0.9516939421715334,-0.7203307288753055,-0.4850493319356206,-0.2641295163644801,-0.07470239084266284,0.0684458201522613,0.15390613417508506,0.1744433068254343,,, +18.484375,36,0.12750092237162106,0.015379856879045197,-0.15492233067371208,-0.37219987840266777,-0.6218211074533981,-0.8867499598113074,-1.1487355493452451,-1.3895867705303375,-0.8780345847345179,-1.2218435507049414,-1.5789795095649497,-1.888482656297021,-2.0962608910082547,-2.163558716485992,,, +18.4921875,36,-2.073039672781285,-1.8315346894879705,-1.4690280268938358,-1.0340384835158267,-0.5861149961490912,-0.18661520094075126,0.11079704288856296,0.2684553952103045,0.27050298250375204,0.12530760052947265,-0.1358957184095929,-0.4639230591586375,-0.799354555980432,-1.0818402964752984,,, +18.5,37,-1.2595494837075427,-1.29729083849537,-1.1820391951562699,-0.9250072543154274,-0.5599395789309727,-0.13789433892929776,0.28067462364879703,0.6353023319350684,0.8749022889839329,0.9656988365208721,0.8964668810455115,0.6802629832419573,-0.4214757807625844,-0.7826751972273275,,, +18.5078125,37,-0.9365195574016664,-0.8266135810186495,-0.4708431023737248,0.043450854685824214,0.5833550337640987,1.0067787885449682,1.2013863274680046,1.1153962439030547,0.7718069407345871,0.2621488171668048,-0.2785250168859266,-0.7085559741093962,-0.9183882249090778,-0.8604603096071839,,, +18.515625,37,-0.5620890450173366,-0.11781610251508885,0.33668355546878564,0.6619787228499954,0.7532986977870181,0.5694589008094233,0.14436568871026914,-0.4220548498782361,-0.9910201020674022,-1.4227036712919956,-1.6143364634559838,-1.5281558844856278,-1.2015452034674945,-0.7365862175694929,,, +18.5234375,37,0.5988808738257977,0.638050875586002,0.6919165603665677,0.7591788326402155,0.8382980138156787,0.9275210097151376,1.024912217624908,1.1283876316107055,1.235751548798329,1.3447352337686551,1.4530368639271911,1.5583620562873959,1.658464265910062,1.7511843485025795,,, +18.53125,37,1.8344885943064768,1.9065045671690184,1.9655541211333518,2.010183016289171,2.039186615184921,2.0516312097224683,2.0468706049665464,2.0245576693561107,1.9846506489355225,1.9274141349113096,1.8534146674555472,1.7635110525981348,1.6588395616225768,1.5407942719881191,,, +18.5390625,37,1.4110028938711954,1.2712985054666457,1.1236876918286438,0.970315645000284,-1.592443077156382,-1.7429528096416995,-1.830276895708249,-1.8478479257149585,-1.7938316616955126,-1.6712587886808778,-1.4878177112435047,-1.255322833919411,-0.9888953930539212,-0.7059139516956169,,, +18.546875,37,-0.4248077306994912,-0.1637769081484466,0.06047088858611571,0.2338798035148256,0.3460198635462891,0.3908080676595037,0.3669261850053139,0.2779061430288332,0.13187706704659607,-0.05900837287109001,-0.2794282886704267,-0.5119669832230191,-0.738336432887838,-0.9406586489402003,,, +18.5546875,37,-1.1027194776788742,-1.2111063906261874,-1.2561509059625573,-1.2326099060077036,-1.1400383232422353,-0.982827189288734,-0.7699043767136473,-0.5141188851762339,0.3523782755843084,-0.03516787698819898,-0.4217357815175769,-0.7475120081280023,-0.9628233027825852,-1.0358671430821258,,, +18.5625,37,-0.9576548956112412,-0.7433977061425552,-0.4301193375949993,-0.0708678635346328,0.2735721092188033,0.5441756905046804,0.6929031866095197,0.6902177236056731,0.5297239189036671,0.22920490189739065,-0.1721040539519852,-0.6195808711656469,-1.051676513821711,-1.4094519262473986,,, +18.5703125,37,-1.6457068992588402,-1.7322792661551472,-1.6643778184562614,-1.4612743506489991,-1.1632473320988301,-0.8252535356364473,-0.5083135913627477,-0.2699535019072841,-0.1551911923570496,-0.1894722725402812,-0.3746555842562321,-0.6886740795153466,0.14816213300293402,-0.025490530735762795,,, +18.578125,37,-0.42178680553591935,-0.9339789017151224,-1.4213360698762316,-1.747641418550423,-1.8184729706006484,-1.6070519130524341,-1.1615741815178653,-0.5920161763607448,-0.04003072435530086,0.3598163518223725,0.5168456197533656,0.4090144294562477,0.08883582480973484,-0.3311551813555725,,, +18.5859375,37,-0.7094034923304694,-0.9143059012510204,-0.8604705656980379,-0.5323246698285367,0.01140168196443092,0.6535461531141971,1.2503917686401291,1.6708167984304167,1.8319892507672129,1.7218253490731543,1.402058973550249,0.9910829957236782,0.631267324736229,0.4497129057651986,,, +18.59375,37,0.8134288363963119,0.6553359149059756,0.4983675152560045,0.3448356802561454,0.19699360730517784,0.056996423867635926,-0.07313632139413173,-0.19155579518187624,-0.2966160287055836,-0.3869025166102704,-0.4612567650428215,-0.5187963591510224,-0.5589301987561182,-0.5813686355459565,,, +18.6015625,37,-0.5861283344074683,-0.5735317738967685,-0.5442013947104957,-0.49904849873414703,-0.4392570931608076,-0.3662629626774764,-0.2817283362793295,-0.1875125923990524,-0.08563951541092296,0.021738323046014085,0.13237743414828626,0.2439828701608772,0.35424857989867525,0.4608979546560734,,, +18.609375,37,0.5617238545515435,0.654627414343287,0.7376549491319432,0.8090323136534867,-0.2313515911206337,0.06058554498780073,0.3431850680658541,0.5985282685173203,0.8105285341894548,0.9660471261809752,1.0558035863821915,1.075017305135646,1.023735523977984,0.9068249137736863,,, +18.6171875,37,0.7336273279564994,0.5173037481414282,0.2739121820980588,0.021283825792314248,-0.22222413178952227,-0.4390120808886212,-0.6134684241917763,-0.7330610611793257,-0.7892138038566756,-0.7779066023107346,-0.6999577189119475,-0.5609681695143124,-0.3709323019906495,-0.1435416645624411,,, +18.625,37,0.104769294936006,0.35596915393221795,0.5916871558350036,0.7944948671647923,0.949122476092312,1.0435249142349483,1.0697234550190498,1.0243640978537938,-1.088924115789143,-1.5188555244077782,-1.9167362603389944,-2.2252267272006327,-2.400272747022085,-2.417932254705376,,, +18.6328125,37,-2.2780726150292603,-2.004362860726491,-1.6405622184548367,-1.243683144074367,-0.8750938814520165,-0.5909464696222424,-0.4334211681097343,-0.4241510883487453,-0.5608512198108055,-0.8176769170981016,-1.1492560099961031,-1.4977664912552653,-1.801957351140976,-2.0067074516644667,,, +18.640625,37,-2.07163351049733,-1.9774063507438069,-1.72879150296883,-1.3539404264559751,-0.9000425844081781,-0.4260154067230749,0.006629477737917222,0.34332131715521963,0.5448817071879755,0.5935763323354923,0.4958246370651361,0.2811456411582423,1.3829478084172966,1.9785104865721241,,, +18.6484375,37,2.4996431963566144,2.8204153186974317,2.8673383058993114,2.639402720464094,2.2082721722034218,1.6985817316297036,1.2537409638844004,0.9966142713569192,0.9958550016427634,1.2471200415233687,1.6743131154177575,2.150515535068772,2.5328672075257206,2.701837167591051,,, +18.65625,37,2.5941196785447462,2.220138809822162,1.6613625909282776,1.0481612792056532,0.5242764172123394,0.207636815595606,0.15825869175919138,0.3620255542702129,0.734791194014238,1.1456791414861944,1.4531907460478917,1.5442235656588483,1.3653041383463638,0.9374730423761952,,, +18.6640625,37,0.8671961134463576,0.9108212213044328,0.9388441171299295,0.9504816424259876,0.9452448409694374,0.9229476432418204,0.8837102424873879,0.8279571032192762,0.756409636982415,0.6700736735612305,0.5702219469539296,0.458371902731591,0.33625921532082304,0.20580747887760376,,, +18.671875,37,0.06909460241599191,-0.07168350242874003,-0.21425130521275987,-0.35629344001357305,-0.4954951916986203,-0.6295829762539352,-0.7563641063875766,-0.8737651461343614,-0.9798681828986834,-1.0729443818236977,-1.1514842349688643,-1.2142239756412199,-1.2601676953720171,-1.2886047762769406,,, +18.6796875,37,-1.299122333556654,-1.291612450268505,-1.2662740776803556,-1.223609567921864,0.9089537959650092,0.7297580499326898,0.4973670022303612,0.2259602837745055,-0.06767813029299016,-0.3653263664528519,-0.6485910691294805,-0.9001854857853497,-1.1051301060478254,-1.2517921413571569,,, +18.6875,37,-1.3326913704032506,-1.345016168285718,-1.290813747717258,-1.1768413593671163,-1.0140888413523304,-0.8170058262379873,-0.6024875095386195,-0.3886897203859267,-0.19375593874161826,-0.034545044101899285,0.07455147003773943,0.12262032014749755,0.10299479045102378,0.013727027645451528,,, +18.6953125,37,-0.14226867905943652,-0.35741164109250945,-0.6199759042812396,-0.914900450166582,-1.2248319842140605,-1.5313276112111558,-1.8161335486153607,-2.062450726129952,-0.002495636651686034,-0.29621605061083506,-0.5394437061879619,-0.6794110318559629,-0.6794326565032563,-0.5246784755353407,,, +18.703125,37,-0.224542425842412,0.18876227283304708,0.6651629022593946,1.144469829862402,1.56569622539985,1.8765035892088664,2.041302166785419,2.046744823229572,1.9037589223049483,1.645799966510964,1.323599221605386,0.99722361471523,0.7266848069521369,0.5625602984396337,,, +18.7109375,37,0.5380875319351682,0.6639625155247978,0.9266532226843348,1.2904905631917123,1.7032113216279003,2.104089777469722,2.4333914991332533,2.6416768476953942,2.6975051134561308,2.5923392972864057,2.341887542132678,1.983672209908508,-0.7534856718651098,-1.01722267290124,,, +18.71875,37,-1.0015314606267562,-0.7312600288027691,-0.2992027202541568,0.1594532547158699,0.5042799737806309,0.628176471607447,0.4867810066502516,0.1106664314142437,-0.4030239887902013,-0.9172080003955212,-1.292464010481884,-1.4252936737271509,-1.2765602368066644,-0.8823077919225017,,, +18.7265625,37,-0.3439952644776048,0.1991794184638756,0.6082811597694346,0.7825518173901451,0.6868471000420662,0.36107833543402135,-0.09092674782522682,-0.5300893552109962,-0.820412746546448,-0.8664750993166442,-0.6398043205330473,-0.18690411511356125,0.3832705432464337,0.9289580726362608,,, +18.734375,37,-1.164415899631814,-1.0897707502242662,-1.001013658626003,-0.8997226083014404,-0.7876864405704213,-0.6668735812265886,-0.5393976280234201,-0.407480401548983,-0.27341310642893024,-0.13951628288294535,-0.008099249830224529,0.11858025034925468,0.2383554988361789,0.3491886485129689,,, +18.7421875,37,0.449206310561459,0.5367322564620703,0.610316662842752,0.6687613871716765,0.7111408317844706,0.7368180309895852,0.7454556796426598,0.7370219101561977,0.7117907168694594,0.6703370204292436,0.6135264586903354,0.5425000829806832,0.4586542277921106,0.3636159064658402,,, +18.75,37,0.25921416378823303,0.1474478872105736,0.03045064040963416,-0.08954686494049006,-2.2560990341043023,-2.386499050682924,-2.4474028051949865,-2.43732263549209,-2.359628249508073,-2.222305238134928,-2.0373918942105425,-1.8201336247225528,-1.587913936009926,-1.359036551540147,,, +18.7578125,37,-1.151443602302607,-0.9814592872003371,-0.8626466241142524,-0.8048570255584582,-0.8135389859382783,-0.8893540980851321,-1.0281271850282794,-1.2211340333359777,-1.4557066716145837,-1.7161139935721297,-1.9846563236572945,-2.2428976035982533,-2.47294928065527,-2.6587163722641534,,, +18.765625,37,-2.78701881849966,-2.848509929558662,-2.8383278838309067,-2.7564348465433834,-2.6076200613315548,-2.4011666985033493,-2.1502056902377515,-1.8708016095391318,1.571205142844184,1.1656762332046866,0.8264497213849407,0.6018483264283883,0.5216604637987045,0.5925374084226526,,, +18.7734375,37,0.796997120820221,1.0961896824414463,1.4359933820397321,1.7554917158367926,1.9965107129512067,2.1127308362541712,2.076953962199026,1.8853932920301613,1.558317735021738,1.1369501101899373,0.6771019975254793,0.24053635242950305,-0.1145970899825981,-0.342764174565632,,, +18.78125,37,-0.4180845717165107,-0.33830994725652663,-0.1251227118366276,0.1792909133185872,0.5188594915933418,0.8324054966109773,1.0632173354237011,1.1679231512039805,1.1232840528838477,0.9298484944839346,0.611898435436114,0.21369550489016745,1.2995781970315334,0.9247821296491558,,, +18.7890625,37,0.4326039929493805,-0.03561382886548403,-0.3469958672459502,-0.4136661997277015,-0.2169286441885535,0.18753352447121727,0.6848642082317616,1.1324803786221245,1.399139240817647,1.400919714209626,1.1242567601487123,0.6297153060194624,0.035469007934186884,-0.5149888126084536,,, +18.796875,37,-0.8920534305687331,-1.0153913936547294,-0.8758014858544825,-0.5375639143527838,-0.1206354034326374,0.2324283478836752,0.3957554906738545,0.29487798854452685,-0.072628975538099,-0.6362468571410493,-1.2716016967430006,-1.8343108783343447,-2.1993144917842464,-2.2949139205044515,,, +18.8046875,37,-0.21025600197106645,-0.32937047892424753,-0.4446069020708157,-0.553744940883434,-0.6546663920564526,-0.7453924582574529,-0.8241185887442284,-0.8892462716718579,-0.9394112212959262,-0.973507466390056,-0.9907069179751516,-0.9904740736058428,-0.9725756006190028,-0.9370846304195908,,, +18.8125,37,-0.884379688482875,-0.8151382786832833,-0.7303252341586502,-0.6311760385576152,-0.5191754095828494,-0.3960315197022304,-0.26364630528857913,-0.12408238394152862,0.020472840863467817,0.16774525941045015,0.3154136530193259,0.4611501157551925,0.6026605929214021,0.7377248266424331,,, +18.8203125,37,0.8642350092302651,0.9802324676458724,1.0839417368514366,1.1738014255633258,-1.580834334375242,-1.2987544781685447,-1.0422993696816958,-0.8272591155452397,-0.666378785493705,-0.5684732673202514,-0.5378165076896095,-0.5738477204114847,-0.671215039919087,-0.8201535658767685,,, +18.828125,37,-1.0071714260219735,-1.2159960046101037,-1.4287143410313838,-1.6270281624945069,-1.7935360202839434,-1.912953108575179,-1.9731836898643096,-1.966171328811848,-1.8884676300005496,-1.7414798043048338,-1.5313797845193569,-1.26868121179836,-0.9675137745964176,-0.6446454861080124,,, +18.8359375,37,-0.3183210630470007,-0.0069973922535294655,0.27193575212141397,0.5033605496787193,0.6754775330354614,0.7806205939008132,0.8157837803482755,0.7828231673142143,-0.2073882952642894,-0.5897855457857452,-0.8773055796698269,-1.027873037291358,-1.0200717980449785,-0.8564750829567758,,, +18.84375,37,-0.5632430726906232,-0.18605071851268484,0.2170200054390234,0.5845163769103778,0.8611723381192643,1.0064985074415806,1.0010669492739237,0.8495119341879266,0.5797794422117141,0.23874245824738616,-0.11513482697675742,-0.4209411320696445,-0.6248460676497855,-0.6885277341573628,,, +18.8515625,37,-0.5951870599035645,-0.35221187033910684,0.009924509241857948,0.4423588335218815,0.8853966106708244,1.2777568454266437,1.5660632185913692,1.713103689744909,1.7035723367275664,1.5463994010599296,1.2733069125276024,0.9338151497678232,-1.317086498374732,-0.9526793999274284,,, +18.859375,37,-0.7820601371824971,-0.8708475915320066,-1.2113411103898253,-1.7244895001420004,-2.281434218278358,-2.7387235399494503,-2.9775474867083864,-2.936241142557644,-2.627148716241652,-2.133226754525727,-1.5853175944847149,-1.12632164155649,-0.8720874909404975,-0.8797382452954153,,, +18.8671875,37,-1.1321141428146064,-1.5425944184464246,-1.9789757987314176,-2.299862003077978,-2.3935895681376462,-2.2090200300283875,-1.7697575488974022,-1.1678935273030375,-0.5389907053790111,-0.02516082480374371,0.2636469196840594,0.2795391025739523,0.04956229345393137,-0.3319507183914069,,, +18.875,37,1.2484913340819919,1.3069553495030326,1.3484197175470591,1.3724063712044106,1.3787410829423918,1.3675562978635167,1.3392885983362257,1.2946708446249722,1.2347191292646975,1.1607147737371082,1.0741816828163877,0.976859453230524,0.8706727076359441,0.7576971909852392,,, +18.8828125,37,0.6401232230639182,0.5202171472652426,0.4002814507468091,0.2826142543899777,0.16946888200146756,0.06301421681700192,-0.034703460420802856,-0.12179648349088698,-0.19656903214177526,-0.2575470009755421,-0.3035039826553886,-0.3334829103662714,-0.34681298047100995,-0.3431215589422177,,, +18.890625,37,-0.3223408629936617,-0.28470930081780865,-0.2307674458773081,-0.16134871614844315,0.6883197404376482,0.5431128718233597,0.3615369368173472,0.16041432157120467,-0.04212494142919748,-0.2279145832007637,-0.380025878263221,-0.4839549546566369,-0.5286408240872923,-0.5072431271506751,,, +18.8984375,37,-0.4176253448863783,-0.2625097671933745,-0.04929339859415949,0.21046237367990667,0.5018327741349586,0.8075654513981999,1.1092788887136975,1.3887398535560678,1.6291308150472832,1.816218956713,1.939345273454662,1.992164786971084,1.9730862683857235,1.8853808103830745,,, +18.90625,37,1.7369516825314637,1.5397815224735198,1.3090954152358567,1.0622982241292434,0.8177602780221076,0.5935360935454009,0.4061054796458584,0.26922481026920964,0.5874779908392471,0.2945568174448199,0.10658583318221017,0.058298560852175,0.16217326347173178,0.4064471115771615,,, +18.9140625,37,0.7569086317232488,1.1621894705029576,1.5617314570714798,1.8951882397373163,2.1117973131770915,2.178262847161929,2.083921659971998,1.8423878252180923,1.4894198526231834,1.0773427172246526,0.6668935914909928,0.3177613858796844,0.07929362859956379,-0.017181869695446217,,, +18.921875,37,0.036775347127152025,0.22541955348592946,0.5112910544864963,0.8410742881417373,1.1539292775850611,1.3909986368719416,1.5046092166299747,1.4657350194143528,1.2685588139803359,0.9314217545300512,0.4940128831649468,0.011236037820799237,-1.049765668444423,-0.8265678473478463,,, +18.9296875,37,-0.3678699820628116,0.2265698110825523,0.8182017774355584,1.2674951651451891,1.472035367552572,1.3944675328233358,1.0726292093788916,0.6090958605199192,0.14300520238505246,-0.18811703822879172,-0.2860672435577181,-0.1188746087358935,0.2704628599642552,0.7758109944234527,,, +18.9375,37,1.2570572511305336,1.578601626001092,1.6466305670218817,1.4349571151514382,0.9923439851535844,0.4293011079323432,-0.1120255570960072,-0.4966230879852439,-0.6334149446707927,-0.5000138363851828,-0.1486421119330114,0.3084008480993784,0.7297391620803808,0.9838904390222838,,, +18.9453125,37,-0.07756492143350023,0.01921306827971048,0.12737919499991213,0.2451202075354401,0.3704472888136479,0.5012307619964216,0.6352372677673811,0.770168761888455,0.9037026502470408,1.0335323587019367,1.15740762740918,1.273173824141299,1.3788095882807725,1.4724621463959553,,, +18.953125,37,1.5524796810808823,1.6174401863256145,1.666176304210044,1.697795708071924,1.7116966752796534,1.707578576968415,1.6854471010961631,1.6456141173942802,1.5886921866028991,1.5155838101582246,1.4274656085867887,1.325767705661452,1.2121486793121148,1.0884665179100286,,, +18.9609375,37,0.9567460904886752,0.8191437004945404,0.677909343735806,0.5353473313821688,0.19296856777651986,0.18302799067249492,0.24031572972404536,0.3609040767948673,0.5363010688452208,0.7540452076464671,0.998577316911198,1.2523287321069494,1.4969499319115172,1.7145939261255492,,, +18.96875,37,1.8891648957897973,2.007445003678808,2.0600207882367725,2.041944529081166,1.95308445287984,1.798139345970695,1.5863165415427216,1.3306957226369986,1.0473228908135828,0.7540976662753887,0.4695314964944161,0.21146335195045285,-0.004177548181348301,-0.16447571741363198,,, +18.9765625,37,-0.2604231226370561,-0.2875403387197799,-0.2461818387205885,-0.14150414779268486,0.016900901435429327,0.2156822206157762,0.4386676641648647,0.6679989337671969,-0.4552908132473938,-0.8467800388783582,-1.1163762753768112,-1.2363984173100453,-1.202593969067176,-1.0347434041781869,,, +18.984375,37,-0.7735206895001029,-0.4740992565501863,-0.19749961760954504,-0.0010265750534224072,0.07071422844119646,-0.007179090510199494,-0.2359701951283447,-0.5930332986498801,-1.0353245678748435,-1.5060357338738493,-1.94339382798793,-2.2902366794934648,-2.502872969678604,-2.5578470572934706,,, +18.9921875,37,-2.455555118299269,-2.2201495512073754,-1.8957467045526144,-1.5395287422744783,-1.2128141986042391,-0.9714881420933196,-0.8572825928491236,-0.8912653853238316,-1.0705516712983532,-1.368750293595384,-1.7400755141721738,-2.1264836608768336,0.24315623355303456,-0.3251621813473583,,, +19.0,38,-0.8423907248486466,-1.1776872720606388,-1.2485652424330564,-1.0433474751697416,-0.6242300684838465,-0.11011781632276472,0.3560632940730656,0.6466168679271158,0.684131905575745,0.4627352705316562,0.04971575279116286,-0.4329255806763804,-0.8419422467560308,-1.0521539424732504,,, +19.0078125,38,-0.99082832880976,-0.6577093659593459,-0.1252022172864496,0.4813369604682577,1.017805549065069,1.3606802409750287,1.4406875479954293,1.2615926225877712,0.8989587190936925,0.4792191790816766,0.14479966454635096,0.014851646068845146,0.15236103239921872,0.5466486295638141,,, +19.015625,38,0.3937759675006227,0.2554869871641335,0.12270546535148358,-0.0024491013782651505,-0.11799985900352328,-0.22214715697943244,-0.3133000008628544,-0.3901038459218681,-0.4514642450929442,-0.4965659372498353,-0.5248870415860052,-0.5362081096094721,-0.5306158762948296,-0.5085016447574189,,, +19.0234375,38,-0.4705543327842161,-0.4177483030293425,-0.35132619002523,-0.2727770247634551,-0.18381003994934786,-0.08632461466021768,0.017623115256179208,0.12585639631923662,0.2361161132273092,0.3461004914029997,0.4535055510097817,0.5560656040082814,0.6515930850642305,0.7380170187907253,,, +19.03125,38,0.8134194496688154,0.8760691966751059,0.9244523414778636,0.9572989162571895,0.8853840312855616,1.0733799055221354,1.2166158329042902,1.3028722051136974,1.32393947983981,1.2761973809814773,1.1608739427995185,0.9839663183375368,0.7558288590254962,0.4904571750068628,,, +19.0390625,38,0.2045180863779894,-0.08380690417614609,-0.3560839826468677,-0.5949072227953864,-0.7851073532815971,-0.9148048136201709,-0.9762336773881004,-0.9662789986340056,-0.8866901206847625,-0.743955082040617,-0.548844886118437,-0.3156594223305476,-0.061227630030181626,0.19626836645787848,,, +19.046875,38,0.4385631492424208,0.648583366237417,0.8116396195302159,0.9164517652958172,0.9559361253429012,0.9276997138754136,0.8342070146232752,0.6826076784342432,-2.466723089074776,-2.7058878246276867,-2.803986783070299,-2.7421937688646585,-2.5258046696249195,-2.1834411128581803,,, +19.0546875,38,-1.7626244676014744,-1.322409393661505,-0.9242241153856122,-0.6223438932598632,-0.4554812833099663,-0.4408028151176292,-0.5713037794376421,-0.8169497620069714,-1.1294068598033182,-1.4496235513862614,-1.7170830258223098,-1.879284586397211,-1.8999770616705864,-1.7648615352793948,,, +19.0625,38,-1.4838748717909729,-1.0896980753946657,-0.6327215223916991,-0.1732509724948023,0.2278319678343673,0.5185005231056227,0.6636359571330348,0.6504492403742346,0.4904269704962749,0.2174986943774565,-0.11728869668192568,-0.453759799266813,2.245030628013972,2.542918606667284,,, +19.0703125,38,2.563873662094241,2.322194423803852,1.9022758371481896,1.4353056150638492,1.0631524967148915,0.8993449178051321,0.9978359676347552,1.338116347856697,1.8307563683450525,2.3418588379214693,2.7297216003340603,2.883661964701959,2.754362562171264,2.3674216746030807,,, +19.078125,38,1.816394023314716,1.2372288497381485,0.7711103627271196,0.5258839955583224,0.5466393159710125,0.8035106917059677,1.2000377782793343,1.5997929126929094,1.8639759476159683,1.889671091330038,1.6382787765409264,1.1463282222816735,0.5157052061855752,-0.1140288135455298,,, +19.0859375,38,0.9736053237527302,0.9726520968592948,0.9540166867018138,0.9175810551639154,0.8635339388183217,0.7923677445095584,0.7048701308352116,0.6021104228210912,0.4854210975531939,0.3563746648370246,0.2167563475821508,0.06853304016028082,-0.08618091184964828,-0.24516051145641385,,, +19.09375,38,-0.406108845351194,-0.5666970761822129,-0.7246049918683708,-0.8775614020676623,-1.0233836745874632,-1.1600157195847571,-1.2855637565895708,-1.3983292382003831,-1.4968383540953458,-1.5798675988770436,-1.646464956192946,-1.695966328334204,-1.7280069237651716,-1.7425274033245102,,, +19.1015625,38,-1.7397746776129297,-1.720297341742662,-1.6849358275193094,-1.6348074456301365,0.4842371573315277,0.25382509905447753,0.008466705699552428,-0.2335712098327997,-0.4541262080198182,-0.6364092642268466,-0.7661783675677671,-0.8327348319067819,-0.8296728358603874,-0.7553299160468586,,, +19.109375,38,-0.6129069905888908,-0.4102495338684341,-0.15930515185325195,0.12470462773351156,0.4243406080509624,0.7211565747087516,0.9969799362254328,1.2351730633596985,1.4217873837353103,1.5465297671883704,1.6034738272936009,1.5914665527468452,1.5142019282945611,1.3799564271255818,,, +19.1171875,38,1.2010048357442802,0.9927571640409972,0.7726768431548763,0.5590556654030849,0.369730910562161,0.2208341344450261,0.12565888787347534,0.0937263408273966,-0.7320182619744209,-0.9018076270439019,-0.9303672896647732,-0.8075598265505256,-0.5474709627640681,-0.18623287037694475,,, +19.125,38,0.22359025153440729,0.6211799028825882,0.9469306327598044,1.1517324453731388,1.2046224782677588,1.097614142833254,0.846951521292615,0.4905935788477989,0.08231995544972683,-0.31662371145332946,-0.6470397702132944,-0.8609701320468208,-0.9291339640547616,-0.8454532142424824,,, +19.1328125,38,-0.6279612863269919,-0.31595354085808786,0.03617633131946145,0.36745381137871147,0.6198680383992015,0.7474564180140346,0.7235141121798112,0.5448052203055005,0.2321194580264637,-0.17291265697094746,-0.6142503487891555,-1.030117555930588,-0.8242397665797958,-0.5597365748098654,,, +19.140625,38,-0.16243547730980482,0.2285522647608983,0.4771365729530107,0.4877422229977131,0.23168396907158784,-0.2448070879837648,-0.8331071033719869,-1.3918419828436497,-1.7855257401448756,-1.921606007253216,-1.7757643454059555,-1.3985378115392038,-0.9014473135128986,-0.42643465433724215,,, +19.1484375,38,-0.1069845449800485,-0.03158655894275675,-0.21955049016042816,-0.6158026797549869,-1.106088571143424,-1.5484138346183551,-1.8121057246022187,-1.813787694064385,-1.5404061258289243,-1.0529965329921307,-0.4701551963154824,0.06425576370223253,0.4203208228865473,0.5174561231846309,,, +19.15625,38,-1.5712865798822615,-1.4959803804252352,-1.410700381706869,-1.3174305422601802,-1.2182922660852495,-1.1155070182285338,-1.0113571892954345,-0.9081458942932285,-0.8081564098506419,-0.7136119602070565,-0.6266365562412575,-0.5492175733801554,-0.4831707237785259,-0.4301080362281111,,, +19.1640625,38,-0.391409404601034,-0.3681982031339658,-0.36132139565649546,-0.3713344871751386,-0.3984915814301069,-0.4427407186412913,-0.5037245751970179,-0.5807865131541923,-0.6729818737395061,-0.7790943172192965,-0.8976569231400888,-1.0269776815888048,-1.1651689292317784,-1.3101802148150918,,, +19.171875,38,-1.4598340187627818,-1.6118637015238804,-1.7639530163004895,-1.9137764943891336,0.1301139859768261,0.2350942504294461,0.4041082335623379,0.6280764192902006,0.8940247126755574,1.1859821620302204,1.4860877819372311,1.7758293110795824,2.0373275382390457,2.2545766518566404,,, +19.1796875,38,2.414554134805276,2.5081228226270254,2.5306622361490074,2.482385177471609,2.3683175253945734,2.1979426519779874,1.9845352683961783,1.7442311647328852,1.4948977246767414,1.2548839880476734,1.0417374328963498,0.8709769689880381,0.7550077139633695,0.7022532357616179,,, +19.1875,38,0.7165657795433008,0.7969556118183394,0.937658360658398,1.1285356605254149,1.355781167060821,1.602882711936057,1.8517735055960802,2.0840921119824323,-1.3625714505319997,-1.5664744463198872,-1.6164725445096613,-1.5108933860508642,-1.2719571449794371,-0.9422676849608588,,, +19.1953125,38,-0.5781307612341909,-0.2407402446901584,0.013394599547148613,0.14128954935986715,0.12021641975174112,-0.04872397347294522,-0.34074357211229744,-0.7112016434004637,-1.10253505246725,-1.4532049438978194,-1.7072664514171558,-1.8230709951376145,-1.779745809658905,-1.5804415337881763,,, +19.203125,38,-1.2518420632267342,-0.8400130188184237,-0.4032354417974293,-0.0029408732690341392,0.3058403263060563,0.4830297669874045,0.5097191921546025,0.3910876164859916,0.1555632125144984,-0.14963936216904522,-0.4659109431022901,-0.7324176169926823,-0.4887124280219529,-0.8900728150062838,,, +19.2109375,38,-1.1072362968630016,-1.0656183164136586,-0.7626139750712623,-0.2684969990721697,0.2926684663077308,0.7768733812353326,1.0594921224802791,1.0693162272984236,0.8079671308697272,0.3493684588442514,-0.18057667364415367,-0.6385328868977512,-0.9030355019733134,-0.9077772623564832,,, +19.21875,38,-0.6597559069637621,-0.23730908314044896,0.2314244295852361,0.6037134514493729,0.7614626354992616,0.6437079332955521,0.2634720941431237,-0.2956407252868536,-0.9021794194660712,-1.4126802650841577,-1.7107817754785506,-1.738901748176156,-1.5137967495832112,-1.1217416975123928,,, +19.2265625,38,-2.0590399960854944,-2.1975207172079574,-2.3271059508150014,-2.4458299254955507,-2.551908075281422,-2.6437681412016154,-2.7200775599776392,-2.779766660361679,-2.8220472610310523,-2.84642634446374,-2.8527145674384338,-2.841029459209629,-2.811793251424308,-2.7657253778410325,,, +19.234375,38,-2.7038297752409486,-2.627377207950328,-2.5378829255221964,-2.4370800448455507,-2.3268891228044466,-2.2093844523145445,-2.0867576719364185,-1.9612793262926769,-1.8352590504066093,-1.7110050751593564,-1.5907837629547683,-1.4767798821488594,-1.3710583158539618,-1.2755278756208708,,, +19.2421875,38,-1.1919078536306773,-1.121697899081625,-1.0661517462450358,-1.02625525421427,2.282463333474001,2.4317106853336976,2.5199159085775698,2.5392516358758788,2.4865291430172967,2.3634229856483886,2.176356852009896,1.9360585860795048,1.6568154045445995,1.3554812366959872,,, +19.25,38,1.0503054008427934,0.7596642888704688,0.5007844934185035,0.2885464081724086,0.13445171946129852,0.04582677803858337,0.025317390623138425,0.07071024856391828,0.17509343297640326,0.32734479028740504,0.5129141081651408,0.7148445337210465,0.9149619922823722,1.0951496494401936,,, +19.2578125,38,1.238618528352167,1.3310856620507332,1.3617776081040818,1.3241893307291668,1.21654551426208,1.0419321220965991,0.8080890098964721,0.5268780375402747,-0.8956198196590708,-0.9176579075468244,-0.7822978755323702,-0.4975109012790922,-0.09428468441356892,0.3781485433550359,,, +19.265625,38,0.8599243472254932,1.2898133768673246,1.6147004692158509,1.797799436071831,1.8243243325996352,1.7037341705395577,1.4682017437406394,1.167545346212465,0.8614130827317943,0.6099373904172986,0.4643156561527432,0.4587843179798355,0.6052367870349705,0.8913237271768432,,, +19.2734375,38,1.282331822168273,1.7265486279516942,2.163278117313632,2.532258649698462,2.7830166475842004,2.882699257724876,2.8211661636513337,2.6125475987317177,2.29302599755372,1.915186891679748,1.5398189936756728,1.2264406949665916,-0.27038316183519506,-0.4357444638668363,,, +19.28125,38,-0.8461526313921536,-1.409561948792472,-1.990529696720636,-2.447138492748114,-2.6697059309651334,-2.6106741152730004,-2.297488876557201,-1.8249403350627376,-1.3290653386182103,-0.9497654720863608,-0.7923868744986635,-0.8987924465826916,-1.2358552539742258,-1.7045271010912575,,, +19.2890625,38,-2.166997007096141,-2.4844962077903903,-2.555388206167299,-2.343104065416946,-1.8862660510433755,-1.288224172326606,-0.6888722922909849,-0.2264669358911443,8.828010123540508e-05,-0.04184256122918562,-0.3098885116412544,-0.6985015489694071,-1.0681112139373896,-1.2836116715383836,,, +19.296875,38,-1.002709142876963,-0.995916727400292,-1.0059768659967143,-1.0326822444476909,-1.0755230274144194,-1.1336958125880543,-1.2061177308778772,-1.291445445725066,-1.3880987188408356,-1.4942881297127375,-1.6080464634785652,-1.7272632175404958,-1.8497216226741544,-1.9731375303542704,,, +19.3046875,38,-2.09519948534682,-2.213609281847304,-2.3261222929881784,-2.4305868674950584,-2.524982103602808,-2.607453338761601,-2.6763447336442043,-2.7302283798535,-2.7679294215881702,-2.7885467513186635,-2.7914689170256626,-2.7763849623890717,-2.743290010042873,-2.692485490052749,,, +19.3125,38,-2.624574009534855,-2.5404489531639016,-2.4412789965789283,-2.3284878037661803,0.21346375269877385,-0.1147362377929588,-0.43925803218797055,-0.7418711994993943,-1.0058423216853316,-1.2170942186043752,-1.3651800362161437,-1.4440042884509243,-1.4522405886538636,-1.3934169570184147,,, +19.3203125,38,-1.275662771084324,-1.111135020713382,-0.9151638916794756,-0.7051772736931456,-0.4994792044985897,-0.31596744671322075,-0.17087963799113692,-0.07765546204436491,-0.04599419696257912,-0.08117337236692945,-0.18367605836242773,-0.3491527866973345,-0.5687207688951401,-0.8295795546167839,,, +19.328125,38,-1.1159002064096002,-1.409925993072429,-1.6932078532523902,-1.9478884821439408,-2.1579455027242087,-2.310307035335169,-2.395761876659632,-2.4096008208772672,1.024028549830268,0.9633918363484738,1.05238087885655,1.2746754221232837,1.5923417147567869,1.9517599424970853,,, +19.3359375,38,2.2919986822161604,2.5543318915004467,2.6914159738224908,2.6746973860747274,2.498896840206416,2.182871470056264,1.7667204699778989,1.3055847964584488,0.8611064277684191,0.4918772007435038,0.2443646116928855,0.1457276692780487,0.1996414935505305,0.3857807206185524,,, +19.34375,38,0.6630418889253263,0.9760026133220964,1.2636112041327014,1.4687529841554383,1.5472030070124618,1.4745704538334459,1.2501527957572058,0.8970991353141774,0.4588570113442989,-0.0075441695535201905,-0.4403271904120746,-0.7825428645578498,-0.4169001778450947,0.2260031603604181,,, +19.3515625,38,0.8400155429663172,1.2900136238804771,1.4848820539180156,1.4022641549299468,1.0944789697216106,0.6739848476289914,0.2823752869250902,0.05140593411030892,0.06673551113734655,0.34431947243814576,0.8259272855720341,1.3950128333555327,1.9085890626063424,2.2363715213402964,,, +19.359375,38,2.2964630377658333,2.077799556369258,1.6432053076971516,1.1122196808476497,0.6284019325048361,0.32007382588257105,0.2652585664700481,0.4704241379060566,0.8688555951039623,1.3391010009595383,1.7384339602156709,1.94215997049184,1.877992076410992,1.5460725665437387,,, +19.3671875,38,-2.203729263824972,-2.0688587006270933,-1.925900559387291,-1.7770131358565897,-1.6244509656238353,-1.4705255319849435,-1.3175649802796954,-1.1678735439840977,-1.0236913929013505,-0.8871556063917813,-0.7602629548874051,-0.6448351412711723,-0.5424871106226559,-0.4545989831104726,,, +19.375,38,-0.3822921013622421,-0.3264096116018325,-0.28750191845414685,-0.2658172679787933,-0.26129762369793263,-0.2735799077025536,-0.3020025849782948,-0.34561747552895883,-0.4032065873418749,-0.4733036753157371,-0.5542201485277117,-0.6440748720715312,-0.740827341502126,-0.8423136488767959,,, +19.3828125,38,-0.9462846104877382,-1.0504453885433287,-1.1524959128871388,-1.25017139483436,-2.3519444032576207,-2.227734212386129,-2.046388376812337,-1.821145249269124,-1.5681410537508529,-1.3052858115340278,-1.0510159280617426,-0.8230104226177946,-0.6369603172428132,-0.50547699357207,,, +19.390625,38,-0.4372156348416519,-0.43627487097256296,-0.5019144833809124,-0.6286108461272806,-0.8064462278866809,-1.0218047973660571,-1.2583267867246646,-1.4980542647607216,-1.7226886094388298,-1.914871979630828,-2.0594034118344187,-2.1443047259246764,-2.161661896813932,-2.1081832058948917,,, +19.3984375,38,-1.9854352355867264,-1.7997402349271563,-1.5617419974848703,-1.2856705082356712,-0.988356621573423,-0.6880654635026632,-0.4032298918042885,-0.15117231708230328,-0.990896405163843,-1.0424497900393837,-0.9381563984132392,-0.7026775712625665,-0.3805098401827193,-0.029026185186345144,,, +19.40625,38,0.2904846801788604,0.5223851991290467,0.6253718446627572,0.5789214930014208,0.3864971822241183,0.07501390446489903,-0.3093523795188841,-0.7083597311773502,-1.0607785474900169,-1.3119391555932451,-1.4222615338824371,-1.3734385236279452,-1.1713093565767618,-0.8449758054720126,,, +19.4140625,38,-0.44229847712781534,-0.022474561722248262,0.3531470864038009,0.6305831323125246,0.7715830673437452,0.7595436115131571,0.6020492491942675,0.32964344485300257,-0.008977812734928634,-0.3546012393227563,-0.6467707548563414,-0.8332564206627908,-0.09844658647066562,-0.4211192799219168,,, +19.421875,38,-0.47578485255846,-0.26618435735696583,0.1320793517393625,0.5924717197485477,0.9724060107091038,1.15251092196621,1.0695224291970389,0.7337835296739175,0.2265542036872724,-0.3221325192191526,-0.7690006076123782,-0.9967104981911749,-0.9459509134413896,-0.6316482699457554,,, +19.4296875,38,-0.13885161137660795,0.4005788760216863,0.8440907528743291,1.0774666906441506,1.0460644599847022,0.7697081816334942,0.33715037323522096,-0.11837645302827197,-0.4558169197204878,-0.5651107021628439,-0.3975309315519313,0.02077338435840892,0.5957442454002935,1.1909832987601665,,, +19.4375,38,-1.341282223602028,-1.4237525466046947,-1.4956568579477894,-1.5552539543172623,-1.6010176635620752,-1.6316638077834544,-1.6461729286671192,-1.6438083770090373,-1.6241294495508516,-1.5869993429651137,-1.532587785584694,-1.4613683006596758,-1.3741101489309815,-1.2718650914729677,,, +19.4453125,38,-1.155949204457195,-1.0279200641282211,-0.8895497013544116,-0.742793799188126,-0.5897576726579908,-0.4326596263615933,-0.2737923313367804,-0.11548289738232476,0.03994766016629886,0.19022484958985167,0.3331603200715237,0.4666899735409141,0.5889099038497709,0.6981095341039184,,, +19.453125,38,0.7928013720280853,0.8717468624579472,0.9339778843934288,0.9788135163044448,0.053096000901205136,0.19791446985901173,0.2757790229776734,0.2838581404295077,0.224183067733824,0.10349898350890352,-0.06721248787682255,-0.2735061052477164,-0.4984872727330882,-0.7239969909488115,,, +19.4609375,38,-0.9318848507492076,-1.1052812838409098,-1.2297803367460318,-1.2944504744529484,-1.2926029125491143,-1.2222638853976098,-1.0863179038662862,-0.8923119995881994,-0.6519345937524711,-0.3802053184721458,-0.09443227556044022,0.18699056448199625,0.4458619722982901,0.6654389263300236,,, +19.46875,38,0.8316007001166991,0.9338304028573448,0.9659455346606566,0.926526619172494,0.8190140295106216,0.6514662605951222,0.43599650857643796,0.18792684993560008,-0.8782426916238031,-0.7679603312043438,-0.5128844986265491,-0.1461563542420855,0.2815262624329385,0.7097535639997073,,, +19.4765625,38,1.0777623788736883,1.333851177151308,1.4433853867257185,1.3941463886707668,1.1981913066931185,0.8899341562356403,0.5207474492523648,0.15092529418192274,-0.15974002331770232,-0.3613000516055941,-0.4214555456981349,-0.3306093280876363,-0.10337950130475926,0.2236627861207517,,, +19.484375,38,0.5976787531378962,0.9577851134408328,1.2445341679580242,1.4091743141697122,1.421248604098126,1.2733478194235044,0.9822777101876984,0.5864585356639951,0.13996186428484625,-0.29588666596999114,-0.662030830395447,-0.9108503479607698,1.8789968870607519,1.6034602170171732,,, +19.4921875,38,1.1790896523922476,0.7422451238994807,0.43172410195198097,0.3505057576096914,0.5373206061730875,0.9558395012137142,1.5044468155856592,2.0439210246673585,2.435437895979109,2.5784822280115973,2.4382789866443635,2.0552269353984656,1.53375025071825,1.0136243356672208,,, +19.5,39,0.6316351440646407,0.4840804187096423,0.6003902974439633,0.9350970476112356,1.380354536202876,1.7955757714700993,2.0460651005422257,2.040056286604009,1.7540044017596068,1.2391985697686494,0.6078818198191015,0.002680643548540141,-0.4422789837419352,-0.6379139913463698,,, +19.5078125,39,1.0058717762347609,1.0150761312356145,1.0066566622495108,0.981145864142735,0.9393691545242762,0.8824302576316674,0.8116917193011715,0.7287508942937748,0.6354118265177898,0.5336535146117414,0.4255951186301169,0.3134587171397151,0.19953026692478365,0.08611944895956727,,, +19.515625,39,-0.02448089618071664,-0.13003503312721792,-0.2284035916428663,-0.31758113416448264,-0.3957313731044221,-0.461219421198017,-0.5126405101491535,-0.5488446746613036,-0.5689569695921686,-0.5723928661913721,-0.5588685577919442,-0.5284059944699803,-0.4813325584816743,-0.41827538613224735,,, +19.5234375,39,-0.34015043547311496,-0.2481464912296705,-0.14370438701102495,-0.02849180860306544,-0.07528099532366161,-0.3352437532823915,-0.5739385962471496,-0.7749596553161807,-0.9246614253960836,-1.0131093308909884,-1.0347711683902745,-0.9889012129745659,-0.8795902071103381,-0.7154777509715193,,, +19.53125,39,-0.5091471556346338,-0.27624496424296924,-0.03438654678200208,0.19807590739781605,0.4033370789792605,0.5653843650396589,0.6711189956276818,0.7112742309510413,0.6810665991557017,0.5805347499738188,0.4145422824845185,0.19244433681499784,-0.07255881410099417,-0.3643361106152869,,, +19.5390625,39,-0.6649442445113045,-0.9558724048896756,-1.2193264469996707,-1.4394629504948924,-1.6034871282959535,-1.7025380416441862,-1.7322994090086357,-1.693293431920786,-1.0135428791360872,-0.9645718788310984,-0.7824877172499992,-0.5069943797066998,-0.1927188418680112,0.0993461940153395,,, +19.546875,39,0.3113931178190251,0.39785593877145903,0.3325616536237751,0.11286231852556328,-0.2398960481738221,-0.6836410524627157,-1.1620693468231822,-1.6133584842504751,-1.9797385803505605,-2.2164332394431696,-2.298577438905969,-2.225035161765657,-2.018522442932511,-1.7220169391888056,,, +19.5546875,39,-1.392013518497066,-1.0896766039061945,-0.8712675881273598,-0.7793385344165549,-0.8360640130014642,-1.0397498820364277,-1.3650629807419628,-1.766946134255459,-2.187608845612836,-2.5655049776274934,-2.8448992243624285,-2.9845324452656667,0.112675586503151,0.4607476477121729,,, +19.5625,39,0.637628913841785,0.5602020926119236,0.21560724049004265,-0.3349955351038606,-0.9729570941679954,-1.5544353858393287,-1.949607231302833,-2.078050849285336,-1.930603571835826,-1.5717058083066968,-1.1215903003213792,-0.7231993491653219,-0.5028981275300135,-0.5357523104544923,,, +19.5703125,39,-0.82488712484311,-1.300585423405263,-1.8393723105290718,-2.29785592637377,-2.5520495671091865,-2.5313978419989445,-2.2381808278153,-1.7469774329994319,-1.1843341623912818,-0.6942103935073366,-0.3986693311615373,-0.3645866602198101,-0.5854994950366476,-0.9835685869375772,,, +19.578125,39,0.09562588047352856,0.226618280312072,0.3623254913289675,0.5004959240957281,0.6388257202447343,0.7749990941856385,0.9067288892510112,1.0317966381193286,1.1480914260528494,1.2536468764390882,1.3466756110004527,1.425600581258365,1.4890827226088432,1.5360444467642376,,, +19.5859375,39,1.5656885611758558,1.5775122841243046,1.5713161100380384,1.5472073697658415,1.5055984234203867,1.4471995173877916,1.3730064305274845,1.2842831258218743,1.1825397111904494,1.069506095312053,0.9471017996788608,0.8174024554084653,0.6826035713810946,0.5449822080544556,,, +19.59375,39,0.4068572279679164,0.2705488188732463,0.13833799816299247,0.012426807585743549,-1.5908371652286508,-1.4346644912353113,-1.2382400757960328,-1.0178131635643533,-0.7912772114429898,-0.5769148987938517,-0.3921160459181488,-0.2521578614353803,-0.16913259262404368,-0.15109737374818422,,, +19.6015625,39,-0.20150557259511706,-0.318959305419125,-0.4973003941072549,-0.7260334383891784,-0.9910515161134704,-1.2756139209829749,-1.5615077713422971,-1.8303125012089765,-2.0646790699464423,-2.2495347000510177,-2.373129145122104,-2.427849540101934,-2.4107470227309618,-2.3237384136365464,,, +19.609375,39,-2.1734689009861867,-1.9708453141793527,-1.7302725411972566,-1.4686463442470161,-1.2041728146871769,-0.9550967964585642,-0.7384279543793779,-0.5687533270833842,-2.964036271871279,-2.7870979391143447,-2.480882442165912,-2.0918020399364354,-1.6782920252983522,-1.3017179506890728,,, +19.6171875,39,-1.016830512472874,-0.8632547311852111,-0.8593389473460447,-0.9993215788324024,-1.2542568075218314,-1.5765548710862156,-1.9074296239687485,-2.1860931918740514,-2.3592654087914924,-2.389516681272011,-2.261144610324287,-1.982668818543544,-1.5855551506343826,-1.11936769996261,,, +19.625,39,-0.6441034895138258,-0.2209034443258686,0.09741381274042593,0.2745212186780481,0.296183467884348,0.1724161825387739,-0.06413195278396916,-0.3633218087863835,-0.6653899018747353,-0.9103124867447584,-1.0472088644710305,-1.042319018500146,-1.9299637640155205,-1.8028944352871648,,, +19.6328125,39,-1.4178956640986369,-0.8587687676597588,-0.2570956477546321,0.2435978916318521,0.5269574541334648,0.5354757223731242,0.2860491367308912,-0.1348461289531914,-0.595034972168792,-0.9530342555688294,-1.0969785965854828,-0.975411273153568,-0.6115001585468984,-0.09678147689693284,,, +19.640625,39,0.43385483299227867,0.8390830516384028,1.0098452798846569,0.8992334737786848,0.5353601997119679,0.013690469907516142,-0.5290640863094467,-0.95233445240272,-1.1501203485426026,-1.0799227513688752,-0.7742544050689276,-0.3315749401059885,0.11086352743593247,0.4148165029893741,,, +19.6484375,39,-0.10510010484164978,-0.21231184311723905,-0.3074649251876255,-0.38903365920380506,-0.4557367023090728,-0.5065593370087323,-0.5407710751642106,-0.5579382814653578,-0.5579315954477831,-0.5409280221999913,-0.5074076552596312,-0.4581450891881177,-0.39419567229917546,-0.3168768403696355,,, +19.65625,39,-0.22774485828779026,-0.12856737701263726,-0.021292286482668173,0.0919865900216639,0.20906635924876005,0.32767383348937834,0.4455055391447604,0.5602682576840775,0.6697193889930668,0.771706430224559,0.8642048787574652,0.9453538954489596,1.013489103595283,1.0671719491598035,,, +19.6640625,39,1.1052151080397228,1.126703495364265,1.1310105088150926,1.1178092214204325,-0.4572191727499899,-0.4107531096140568,-0.4315807959212469,-0.5170708539899146,-0.6599188527107716,-0.8486575183617637,-1.0684575938548733,-1.3021634978649137,-1.5314915611206164,-1.7383072793193182,,, +19.671875,39,-1.90589251121438,-2.02011425080848,-2.070413465333691,-2.050545037317088,-1.959017204585649,-1.799199846277521,-1.5790940546379302,-1.3107790512903637,-1.0095750058008572,-0.6929801247256443,-0.3794561195576185,-0.08714673439266453,0.16738131846417534,0.37028722985152585,,, +19.6796875,39,0.5114146715925467,0.5849932505884823,0.5900339394421306,0.5303909242781638,0.41448557260037816,0.25471178579685105,0.06656421928335482,-0.13244982115707915,-0.8843127554268182,-0.5861031694859937,-0.18288173089839987,0.2733191873653024,0.7216896464091906,1.102075637003777,,, +19.6875,39,1.3643136038602002,1.4760122670435405,1.427569833006434,1.2336452719206377,0.9308546167568836,0.5720511926106392,0.21808073546868528,-0.07170436169108296,-0.2486941859198845,-0.28259321024561723,-0.16613561296862922,0.0837903958407421,0.4287843099063863,0.8149295890488468,,, +19.6953125,39,1.1812104075025704,1.4690378243636832,1.63140149481623,1.6402213463552422,1.4907539914846986,1.2023673719182058,0.815562780550707,0.3857078833826079,-0.025543371022555383,-0.3598077999558539,-0.5710186831859752,-0.6325514537485883,-0.18054474807243245,-0.7618575636394648,,, +19.703125,39,-1.3361112276522955,-1.7648604219063553,-1.949083063303645,-1.8560949796028416,-1.5282877369242671,-1.0712969407051078,-0.6248457641193749,-0.3242565816271035,-0.26318108298495835,-0.4677651820682312,-0.8893309725372202,-1.4175828721563044,-1.9107198762665,-2.2342022141983597,,, +19.7109375,39,-2.2975486099514963,-2.0790799111607163,-1.6318281921239772,-1.0689922124059317,-0.532925636366531,-0.15615738691202907,-0.025127051759262768,-0.15657394025168614,-0.4930502010300696,-0.9187868836778532,-1.291563507902992,-1.4818454435726391,-1.408461347917183,-1.061041017100629,,, +19.71875,39,1.0870783277020812,1.039102738924883,0.9744688168927306,0.8940543296117998,0.7990133045628061,0.6907560446653835,0.5709246567208355,0.4413645206919896,0.30409219926021,0.16126034942464745,0.01512025040680724,-0.13201739613665242,-0.2778227073438376,-0.4199871973258457,,, +19.7265625,39,-0.5562639819075667,-0.6845069060774032,-0.8027079091552234,-0.909031973549458,-1.001849045276726,-1.0797623674482009,-1.1416327307294096,-1.1865982162743256,-1.214089085560912,-1.2238375565295314,-1.2158822949662986,-1.190567542606446,-1.1485368973442855,-1.0907218545719521,,, +19.734375,39,-1.018325310405713,-0.932800315767612,-0.8358244534495054,-0.7292702869278946,-0.3240389130957259,-0.4904107946710633,-0.6155208811559679,-0.6861989405719664,-0.6930753443578348,-0.6312422853158717,-0.5006038366480337,-0.30589042404513905,-0.0563366844163975,0.23495484190216154,,, +19.7421875,39,0.5519198306301795,0.8766449348472583,1.1906096082283717,1.4759704101224014,1.716798249690719,1.9001823076633069,2.017123670875299,2.063156378321421,2.0386525854592774,1.948790580443445,1.8031878958488727,1.6152251128516608,1.4011075232341936,1.1787300939979568,,, +19.75,39,0.966424895041812,0.7816783459401176,0.6399077417803465,0.5533823835799121,0.5303645543619926,0.5745302506664439,0.6847100702912106,0.8549683307630366,-0.5413197884456162,-0.318204386953208,-0.00474793720367256,0.3433686698977365,0.6650524732618835,0.9033674902979087,,, +19.7578125,39,1.0144559615962714,0.9744219723987282,0.7831050055378591,0.4641553948846843,0.06139965310901387,-0.3679384731325647,-0.7621056213232129,-1.0643941729847817,-1.2319341775565402,-1.2423326738000091,-1.097126507349263,-0.821511042578658,-0.4603871998525062,-0.07134267230027544,,, +19.765625,39,0.28433932400151785,0.5512432092195919,0.6884664925303123,0.6760008602028679,0.5178549477898813,0.24143236576630425,-0.1067381671469598,-0.4682555292567222,-0.7819520722091405,-0.9934343386947768,-1.0635725423486844,-0.9746164460863488,0.7400212992538932,1.1521993374421202,,, +19.7734375,39,1.303407199159078,1.1868069562431265,0.8688066064128908,0.4706142321231366,0.13477584897603545,-0.014129934440291203,0.09613407529221783,0.4654439074289123,1.0211377108157993,1.6377323642374295,2.171131426421824,2.497950664416332,2.5491846766016564,2.3289889014347738,,, +19.78125,39,1.9134305558661933,1.4295517790027312,1.0204838980869797,0.806174503533736,0.8504912131182232,1.1437181391215063,1.605242185948093,2.1056926714548294,2.50246598795078,2.6788983805259754,2.5763498865550862,2.2104051319710685,1.6667495963090004,1.0778501375719238,,, +19.7890625,39,-0.6151723984712263,-0.4956915938130241,-0.3730769002628149,-0.24962602376954984,-0.12764495743432272,-0.00940744881556288,0.10288496414527988,0.20714164872292412,0.30141962688147705,0.3839577350507709,0.4532075959901246,0.5078608603350174,0.5468722407535875,0.5694779353061343,,, +19.796875,39,0.5752091173403824,0.5639002556451898,0.5356921191056226,0.4910294131831165,0.4306530895408532,0.3555874634127281,0.2671223642303981,0.16679063199714886,0.05634135339163648,-0.06229069381276764,-0.18701885303030408,-0.31564106584316143,-0.4458783750042737,-0.5754147793186906,,, +19.8046875,39,-0.7019377425785661,-0.8231786472708224,-0.936952484747948,-1.0411960869071135,1.0750149063480858,1.3309210690860225,1.6060894193614617,1.882410272233504,2.141523862762185,2.3661003536647907,2.5410483863679016,2.6545678986106864,2.6989737906976323,2.6712330011315535,,, +19.8125,39,2.5731775364164617,2.4113785957470903,2.1966905634343523,1.943496662292834,1.6687088645752806,1.3905917926645592,1.1274926147598705,0.896565495314914,0.7125795390068224,0.5868933440577409,0.5266676618620675,0.5343710553378844,0.6076130160689762,0.7393161649873845,,, +19.8203125,39,0.9182155154108854,1.1296499696432174,1.3565908414592651,1.5808356677906936,1.784284046347182,1.950206515585674,2.064417978282549,2.1162738260938583,-0.7329849560761499,-0.3682948154378653,0.07122045703932997,0.5261880175876054,0.9353050613699446,1.2448458851372382,,, +19.828125,39,1.4169860814151851,1.4356475492735727,1.308954165762904,1.0679158814890828,0.7615464572575733,0.4491755472270104,0.1911528372506759,0.03939239946663309,0.02923031638755447,0.17386408267070694,0.4622401692983722,0.8607190659808946,1.3182587544596012,1.7743095487562013,,, +19.8359375,39,2.168190924694484,2.4484901279332427,2.5810189506819348,2.5540896317531456,2.3802883855570665,2.0944705673379347,1.7482899697201129,1.4021145594227469,1.1155880240820717,0.9383074056152348,0.9020689988191886,1.0158904107312017,0.2977875875721453,0.5355041552529686,,, +19.84375,39,0.9332173332175148,1.3580305324846829,1.66917112170995,1.7568053578936276,1.5723732017756131,1.142127001090356,0.5601613701073241,-0.03715750933964773,-0.5083570115095236,-0.7454336905542929,-0.7032687995918144,-0.4118234885688196,0.03222709933550496,0.4921265835894063,,, +19.8515625,39,0.8286364736025285,0.9382958090529324,0.7818546135401222,0.3950877183008212,-0.12097527567331492,-0.6277265057894466,-0.9869776020202844,-1.0988645115147977,-0.9292704809953156,-0.5192508395245962,0.026124207550350144,0.5664518484699369,0.964344162294048,1.1229322304923453,,, +19.859375,39,-1.1340042299691926,-1.2136629781978685,-1.2786796837253964,-1.3278091172047066,-1.3600752717453597,-1.3747884583557983,-1.3715573935513001,-1.3502960674728148,-1.3112252722518023,-1.2548687638508915,-1.182044124574876,-1.0938484862337097,-0.9916393639278,-0.8770109360308685,,, +19.8671875,39,-0.7517661856857828,-0.6178853915833751,-0.4774915197191942,-0.3328131220849464,-0.1861453918944264,-0.03981005723050829,0.10388518467516672,0.24268698227058544,0.3744356877569732,0.497103069307162,0.6088277171397295,0.70794752355349,0.7930286682578077,0.8628906015308092,,, +19.875,39,0.9166265878211596,0.9536194501433736,0.9735522396577052,0.9764136436848656,2.099419285856776,2.012239716753258,1.8579804409045533,1.6445277342818825,1.3838662330544729,1.091250574987499,0.7841490227496551,0.4810327164125037,0.20009496720788256,-0.04201011685699352,,, +19.8828125,39,-0.2313217309068833,-0.35753873643608713,-0.4147309169747941,-0.40174554451850775,-0.3222809217352459,-0.1846217875003866,-0.0010550523121425348,0.2129933786132561,0.4400404877533011,0.661771275774135,0.8603216940439563,1.019529902873245,1.1260685884785229,1.1703793664031978,,, +19.890625,39,1.1473441008438154,1.0566463156642911,0.902797484405659,0.6948263563332974,0.4456529738197199,0.17119102455955973,-0.11075888308610499,-0.381747852965909,1.2645842562632073,1.6111057604803574,2.002308712391317,2.3772133262155686,2.6764983027161007,2.851738686702725,,, +19.8984375,39,2.872950689354555,2.7332683220502747,2.450023402770335,2.062060668887724,1.6237061114878708,1.196327904427907,0.8388042475213396,0.5983826778630396,0.5033544114284816,0.5586845587153985,0.7452786482299683,1.022999501462801,1.3369643509612883,1.6261411640433692,,, +19.90625,39,1.8329050085625456,1.9120657540280968,1.8379607335072323,1.6085073754404156,1.2455843077941084,0.7916812907538967,0.30333947927106336,-0.15759656323040627,-0.5335528488686052,-0.7801350424523541,-0.8729852883789011,-0.8115190896584596,0.2253686143285731,-0.2032675116641444,,, +19.9140625,39,-0.4743126526083995,-0.49631316814777704,-0.24597858048400445,0.2252110154401648,0.8048897350592258,1.3503796304494329,1.7275761546049393,1.847490124231736,1.6904331691192105,1.3112201307147588,0.8239644638769482,0.37063553052678144,0.08199692506800227,0.0416329597564381,,, +19.921875,39,0.2629239102178257,0.6852815862519035,1.1906779365446138,1.6359374956770494,1.8919438895649945,1.8790154775900745,1.5887549285205331,1.08638440832274,0.4929261582088636,-0.047888191059944574,-0.4089110297035721,-0.5143065811514015,-0.3601962753343689,-0.015564596027733413,,, +19.9296875,39,0.9624980375406306,0.9324001793619898,0.8870046409032941,0.8274701594525019,0.7552091849531184,0.6718629805537492,0.5792727126615188,0.4794470368123335,0.3745267470201358,0.2667471076948835,0.15839852780034872,0.05178626594260188,-0.050810127934858895,-0.14717692397413135,,, +19.9375,39,-0.23520517448225145,-0.3129278443285369,-0.3785544594009864,-0.4305026663063651,-0.467426150593978,-0.4882384245348805,-0.492132067812355,-0.4785930841017954,-0.4474101220298282,-0.3986783989325843,-0.3327982585806474,-0.2504683879982881,-0.15267381202176664,-0.04066887568242028,,, +19.9453125,39,0.08404448773871764,0.21974282259093825,0.3645110943866564,0.516275986813193,-0.6239628744332972,-0.8214669918142116,-0.9613089935115996,-1.0344252422379774,-1.0362707616982747,-0.9671355740402856,-0.8321242300292276,-0.6407999597168959,-0.4065182576251919,-0.14549637235555596,,, +19.953125,39,0.1243164140573299,0.3844889409989916,0.6173915848166005,0.807423442980133,0.9420977167634914,1.0129096113965133,1.0159262391567414,0.9520573972270754,0.8269883464996335,0.6507792879586775,0.4371594762113356,0.20256520430849376,-0.035011244668823466,-0.25728140129938865,,, +19.9609375,39,-0.4469413063733261,-0.5888837804019971,-0.6712577173025858,-0.6863005204372132,-0.6308856182454599,-0.5067468646607651,-0.32036416095813586,-0.08251825941722503,-0.6189604852376367,-0.3386703253354473,-0.027339806591269555,0.2538903277191219,0.44900143873527204,0.5158684184526343,,, +19.96875,39,0.4328644675886919,0.20227028178341133,-0.15004355171291828,-0.5786116615514691,-1.025424411057022,-1.4289358210504262,-1.733625994940506,-1.8986287583746293,-1.9040808036698005,-1.7542034965973927,-1.4766373874939327,-1.118133108834921,-0.7372698323728109,-0.39533541114470416,,, +19.9765625,39,-0.14678863791583552,-0.030789118423014794,-0.06511395061269931,-0.2434086233728047,-0.5362002063932564,-0.8955148871398216,-1.262380496572416,-1.5760452955675268,-1.7834769607596457,-1.8476620503675587,-1.7534130475880243,-1.5097782736350938,0.8733737183337384,0.7442430446965522,,, +19.984375,39,0.3496899220595927,-0.2352091723162347,-0.8834718637142744,-1.4507692345126972,-1.814737683685189,-1.9082712670435087,-1.737672260773884,-1.3806875745198075,-0.9649712826657064,-0.6328780940248123,-0.5022387789848262,-0.6338696992193541,-1.0147228538249011,-1.5612961276368982,,, +19.9921875,39,-2.142370567338169,-2.6148443923848053,-2.862843853484187,-2.8293927829322434,-2.5319619287224637,-2.0576370331417086,-1.539230303172107,-1.1188825572416057,-0.909131554547103,-0.9621162485365397,-1.255356688010579,-1.6980062006668155,-2.155861460791584,-2.4882748827984122,,, +20.0,40,0.498571554280495,0.5545669337218218,0.5953922950897592,0.6201613016974189,0.6282775987326671,0.6194452902715091,0.5936741497262072,0.5512794724825281,0.4928765732962182,0.4193700247945063,0.3319378255112593,0.23201077467589315,0.121247414903768,0.0015049815478531126,65540.0,20.0,0.0 +20.0078125,40,-0.12519313260030368,-0.2566928275604379,-0.39074704060944815,-0.5250551240053668,-1.1303741285290003,-1.170985007736627,-1.1437026079381658,-1.0524309193049706,-0.9056381938677114,-0.7157617144945638,-0.4983355231737186,-0.2709019463419432,-0.05178283212984552,0.14120380231552165,,, +20.015625,40,0.29199220796552794,0.3873953543206015,0.4180308279313817,0.3789815985378847,0.2701455604463774,0.09624945905772098,-0.1334737843871019,-0.4059218647874219,-0.7050296127419031,-1.0128820438258603,-1.3109563379374558,-1.5814061585348949,-1.8082987692009709,-1.9787186966454509,,, +20.0234375,40,-2.083660995445064,-2.118651841549557,-2.0840531957842847,-1.985030309295588,-1.8311843538780543,-1.6358758118578824,-1.4152858243460933,-1.18728096941619,0.1495923544820607,-0.0558110089972893,-0.13905506724311645,-0.0732629727754247,0.14500858994683194,0.4951760953324065,,, +20.03125,40,0.9357792982629928,1.4108844189579943,1.8587433347528852,2.2213603290032102,2.4534765806721137,2.529573256960672,2.4478026719162607,2.2302354302622573,1.919385265648477,1.57155303544546,1.2480267505513858,1.0055084349136028,0.8872590163470172,0.9163405939650021,,, +20.0390625,40,1.0920087303495865,1.3898167634223388,1.7654159457458038,2.161459553502134,2.516535626708761,2.7747370110993765,2.894378087949657,2.8545004650285546,2.658154262187037,2.331943822919195,1.9219084987722104,1.4863799659538892,-0.3430496477392593,-0.936720222639158,,, +20.046875,40,-1.4756657295658808,-1.8294283669562523,-1.9159884696313656,-1.7241819472044573,-1.3167205316988304,-0.8129873451495234,-0.35632306823754034,-0.07476844375206881,-0.046022064429394716,-0.2762169086159272,-0.6983315853328382,-1.190670774946333,-1.6103488055346222,-1.832598224323886,,, +20.0546875,40,-1.7851286078795907,-1.4681172898259969,-0.9543514140682986,-0.36948053254754815,0.14221002836760746,0.4571265656679052,0.5060187889342146,0.2927351837061709,-0.10705618337923876,-0.5668286771753621,-0.9440930065268074,-1.119662018989923,-1.030521037961511,-0.6872930075980721,,, +20.0625,40,-0.6573031664624296,-0.7852045523215105,-0.9065400482034698,-1.0191967151905237,-1.1212049651555207,-1.2107731123432302,-1.2863188151636569,-1.346496857612687,-1.39022278381548,-1.4166919718060462,-1.4253938125057717,-1.416120745570464,-1.3889719938300278,-1.344351930866496,,, +20.0703125,40,-1.2829631102491403,-1.2057940784147885,-1.1141021845190109,-1.00939168818048,-0.8933875483764582,-0.7680053523624328,-0.6353179110774021,-0.4975191058647881,-0.35688561945939185,-0.2157372212442712,-0.07639630208400483,0.05885263281537467,0.18780280383689316,0.30836363218187485,,, +20.078125,40,0.4185971767947313,0.5167518950821434,0.6012931363814777,0.6709298343461589,-0.9701606489563372,-0.7813744487090861,-0.6362989295105784,-0.5471591630611582,-0.5221702316184231,-0.5649585717895163,-0.6743035276899904,-0.844217149003157,-1.0643566820404722,-1.3207410015862489,,, +20.0859375,40,-1.5967210359521338,-1.8741365252760347,-2.1345784588502164,-2.3606691672295943,-2.537270813066149,-2.6525380168629926,-2.698741222071394,-2.67280339027522,-2.5765126068281576,-2.416395776322254,-2.203262219743687,-1.951449003174764,-1.677820626276863,-1.4005928272570445,,, +20.09375,40,-1.1380625250897816,-0.9073324642962448,-0.7231194961604422,-0.5967295971854233,-0.5352710976690064,-0.5411609812924787,-0.6119586790434448,-0.7405389427608241,1.0869284359960196,0.7788077693552953,0.6023875324387677,0.576906300938081,0.6975189510878721,0.936097610678588,,, +20.1015625,40,1.2456612767364486,1.5677439114573444,1.84155313443292,2.013492725716405,2.0455654814826625,1.921347349203112,1.6486020508648762,1.2581286615785792,0.7990213465868812,0.331079285073753,-0.08445131574866349,-0.3943614238984097,-0.561712671645469,-0.5715379979266908,,, +20.109375,40,-0.4331218084167788,-0.17850476672262028,0.1425536465501724,0.4703699603806874,0.7446746146015297,0.9140382968427928,0.9439183169533448,0.8220715732302667,0.5604908490466085,0.19356270596618447,-0.2272662356620803,-0.641483981294166,0.8434773741813469,1.0817748375989371,,, +20.1171875,40,1.0420642511168559,0.7391967213856938,0.2581161244585849,-0.2694802088637779,-0.7012729434752295,-0.9233413895516728,-0.8813787774866417,-0.5955470107466565,-0.15489988448078074,0.30709636677962154,0.6492354730803831,0.761384847905538,0.5948019273313506,0.17564313317399416,,, +20.125,40,-0.4020383062146409,-1.0018881101749786,-1.482426907608113,-1.7356193772687478,-1.716267817866561,-1.4541762392920947,-1.0457532224967512,-0.6273570661381042,-0.3376906639591296,-0.2795547118802045,-0.4914437012314671,-0.9367715172312636,-1.5136816714442207,-2.0827555025585607,,, +20.1328125,40,0.7246369309770921,0.7616731397652576,0.7815937370283812,0.7842581575793481,0.7698322618439217,0.7387852348469793,0.69188117148717,0.6301654955602042,0.5549464504553462,0.4677719857479527,0.3704024445222989,0.26477952980016084,0.15299209359295185,0.0372393477391111,,, +20.140625,40,-0.08020785916503563,-0.197047020579196,-0.31098450641205894,-0.4197759431138913,-0.5212657322806467,-0.6134250156658544,-0.6943874217083927,-0.7624819675152554,-0.8162625400597819,-0.8545334402440996,-0.8763705424150856,-0.8811376987013165,-0.8684981007930122,-0.8384204000898194,,, +20.1484375,40,-0.7911794789166613,-0.7273518591699393,-0.6478058286547682,-0.5536864578669015,-0.9155917377062144,-1.1224142886995505,-1.3439400408076605,-1.5619327740125692,-1.7582625938382437,-1.9161748097507156,-2.0214632083863595,-2.0634658948743514,-2.0358142477468464,-1.9368827484924764,,, +20.15625,40,-1.7699083051837106,-1.5427707362668002,-1.2674497084550325,-0.9591959840436246,-0.6354747546151615,-0.3147547307969931,-0.01522741326901711,0.24645416147880686,0.4563292654919686,0.6040954689803921,0.6838194303764633,0.6943429380515085,0.6393559061729346,0.5271312516614486,,, +20.1640625,40,0.3699401574196462,0.1831885147264768,-0.01566521920557663,-0.20833526994312265,-0.37699144303795296,-0.5055101920368674,-0.5806065993151446,-0.5927683162320849,-0.9889236854311012,-1.2191243423404252,-1.2991837141384384,-1.2188803871843037,-0.9922671744098388,-0.6554876666294767,,, +20.171875,40,-0.2611559793967596,0.1298249783771812,0.4577324445012168,0.673305213241745,0.7453920040106164,0.6657756519321171,0.4504218820068033,0.13695833589318313,-0.22122330519686395,-0.5633232719525307,-0.8306460307908788,-0.9757871537515944,-0.9700635872376108,-0.8080297615298273,,, +20.1796875,40,-0.5083758691946927,-0.11106812870999756,0.3288238264128057,0.7496513002438057,1.0927352035697908,1.3114520738327529,1.3784425408967276,1.2898197717991742,1.0657226943801401,0.7471281158006107,0.3894185434694824,0.0537078255802016,-2.572474663363954,-2.2231131136788385,,, +20.1875,40,-1.736087482889962,-1.2509682399353117,-0.9042600088112421,-0.7919161368108383,-0.942989043454659,-1.3116385290674195,-1.789688652087372,-2.2362918309811257,-2.5165700414524435,-2.5386424195391157,-2.2788906139296405,-1.7885367102189966,-1.1797300189045208,-0.5949548384223959,,, +20.1953125,40,-0.16814234867882694,0.0118567251370717,-0.0745707936460116,-0.3726327047031723,-0.7683673815342924,-1.1201058475496266,-1.2975351427746908,-1.2176547927322643,-0.8677696495334728,-0.30921528717647384,0.3392072477987545,0.9335494618750664,1.3439309542859366,1.4899067571204494,,, +20.203125,40,-0.4463957694413109,-0.32756840736626297,-0.1990432318631769,-0.06283133716999545,0.07891894789211656,0.2239594638637043,0.3699813742904304,0.5146553836129121,0.6556723152212705,0.7907833392756327,0.9178391460346936,1.0348273788910205,1.1399076717836192,1.2314436776086346,,, +20.2109375,40,1.3080315269278984,1.3685242187856417,1.4120515166658942,1.4380350013280792,1.4461980170595359,1.4365703372972085,1.4094874680326326,1.3655846013040358,1.3057853247563205,1.2312852850636864,1.1435310913722372,1.0441948282571691,0.935144624568682,0.8184117936012678,,, +20.21875,40,0.6961551200461087,0.5706229191564196,0.44411353254850383,0.3189349524415699,-0.5369263193568009,-0.4128156924006876,-0.2250012592868468,0.017433734889130914,0.3015142011460599,0.6112713639314322,0.9288498816682149,1.235746741593904,1.5140955504236646,1.7479066762218003,,, +20.2265625,40,1.924176774957364,2.033790342834597,2.072150437578104,2.0394945971183227,1.9408739356350801,1.7857968839387683,1.5875624258685153,1.362329334090561,1.1279863175131073,0.9029018748551432,0.7046410365737467,0.5487384855569301,0.4476136147124501,0.4097031810475288,,, +20.234375,40,0.4388720413377277,0.5341430621295267,0.6897650389650308,0.8956138884216184,1.137899135568528,1.4001264293839426,1.6642489642260443,1.9119275116070993,-0.20272404834584834,-0.3353969030185848,-0.3196003514765914,-0.15428194692864228,0.13775230501948188,0.5133565073101558,,, +20.2421875,40,0.9157346582892156,1.2832598655210532,1.5590495006989151,1.6998050497279102,1.6825399207152638,1.508147414703398,1.2012532052304536,0.8063753596389356,0.3809900341161151,-0.013417088915307018,-0.32091984221552705,-0.4998506933214609,-0.5292750574594155,-0.4122324649320959,,, +20.25,40,-0.1752398438709485,0.1358656056913596,0.4630963232680856,0.7453801858973075,0.9281099814921018,0.9716889944354996,0.8577414850111256,0.5920205343489342,0.2035601153350262,-0.2597967812173481,-0.7387976988815701,-1.1719556890132723,0.5996012611435702,0.22738596810616696,,, +20.2578125,40,0.03493078968212848,0.09696424721234642,0.4162464348232661,0.922706345760188,1.4925611272485113,1.9821779416000216,2.267398404847448,2.2775482405961873,2.0148112022686964,1.5536573234731053,1.0204818594046745,0.5590347341471686,0.2911145060730017,0.2832985253514129,,, +20.265625,40,0.5288264356076624,0.9496009224070592,1.417755917148244,1.790879465583485,1.9512360041609171,1.8382365534019092,1.4652557815922496,0.9161848638756708,0.3226628096074482,-0.17177566040202666,-0.4508118475718889,-0.4569972229508555,-0.2072766752229902,0.2118714947223221,,, +20.2734375,40,0.197364281398106,0.08160773749529265,-0.026238094681153568,-0.12422308866020905,-0.2105778314547564,-0.28374470979718125,-0.3424052828621862,-0.3855034621139095,-0.41226409234397465,-0.4222066084883623,-0.4151535290390633,-0.3912336372815617,-0.3508797946057407,-0.29482142413480583,,, +20.28125,40,-0.22407179624077334,-0.1399103385392516,-0.04386028007630627,0.0623379788727757,0.17675730513181234,0.2973175461310387,0.4218219282923546,0.5479955029836914,0.6735249668663909,0.7960991594021435,0.9134495284183886,1.0233898551870484,1.1238545434416871,1.212934801888566,,, +20.2890625,40,1.2889120866602166,1.3502882181274565,1.395811644715693,1.4244993938383192,2.125811191967347,2.2907496690992506,2.3948522311782816,2.4303198986920838,2.3939925263410577,2.2875727396269085,2.1175110814692912,1.8945603683893943,1.63303032218947,1.3497944431443147,,, +20.296875,40,1.0631183670848725,0.7913913966337429,0.551849648271891,0.3593798410073645,0.2254871285225747,0.15749893691809225,0.15806031229994832,0.2249559541411248,0.3512713291292185,0.5258816147132765,0.7342343606411978,0.9593712746389628,1.1831178632413994,1.3873579535441385,,, +20.3046875,40,1.5553042024590018,1.6726759797444948,1.7287024701456797,1.716881027943217,1.6354378842665065,1.4874590634395208,1.2806823620918966,1.0269648800572733,-1.5050709255200598,-1.699616197535866,-1.738680479567742,-1.6295451255437774,-1.4024917228302818,-1.106027582663114,,, +20.3125,40,-0.7992728154807439,-0.5426950362853259,-0.3886351074759637,-0.3730998691660549,-0.5101004610232331,-0.7894183430006244,-1.1781472313494277,-1.6257710374477523,-2.0719871344310548,-2.4560566646345405,-2.726225742307196,-2.8477503487431783,-2.8082751832149904,-2.619728851428423,,, +20.3203125,40,-2.3164403541825687,-1.949770372706787,-1.5800936666621448,-1.2673814590868546,-1.06185072169162,-0.9961368331159184,-1.0802087884732234,-1.2998189506047426,-1.6187287888495492,-1.984363900125078,-2.3360174574574173,-2.614324279511247,1.15767351126655,1.0277449228336972,,, +20.328125,40,0.6545192388357219,0.12983074403148148,-0.41118196682698666,-0.8270087199471887,-1.0084668257432212,-0.9085610309761836,-0.5553212555903639,-0.044100086746926566,0.4885587387567506,0.9023190008860384,1.0914681687432943,1.0138227736474148,0.7022015037982683,0.2553224016024436,,, +20.3359375,40,-0.18938003101838094,-0.4935666242733644,-0.5560698041760347,-0.3407972636134956,0.1131861634441264,0.7021633359875205,1.2859791712032913,1.726233805860616,1.9239890049935453,1.846655729080584,1.5366959269352551,1.0997558128725582,0.6754850960060814,0.39904186693951815,,, +20.34375,40,1.4356543255678869,1.4288773869181637,1.4040746521412324,1.3614590257393897,1.3015465783435007,1.2251475795847089,1.1333523849379428,1.0275124236193272,0.9092166203987944,0.7802636641330383,0.6426306085517844,0.4984383550418149,0.3499146217709628,0.19935504750636365,,, +20.3515625,40,0.04908311113258257,-0.09859043137987132,-0.2414078823694237,-0.3772040040371377,-0.5039437963094838,-0.6197579895998108,-0.7229756310636499,-0.8121531938473875,-0.8860996997085694,-0.9438974151961744,-0.9849177590901482,-1.0088321426495126,-1.015617552949637,-1.0055567816377786,,, +20.359375,40,-0.9792332951992042,-0.9375208366515952,-0.8815679408452826,-0.8127776346057898,0.7414632170504514,0.4415834860389051,0.14577434587967358,-0.12775279716049293,-0.3622871903374405,-0.5437776522338648,-0.6618062074265946,-0.7103085579548806,-0.6879911649528615,-0.5984158696561898,,, +20.3671875,40,-0.4497461660106783,-0.2541728306652188,-0.02705897498190532,0.2141358513093184,0.4510774684050685,0.6658395759935952,0.8421575212274781,0.9665658871677284,1.0293405660569266,1.0251796164243714,0.9535754192012632,0.8188521755114385,0.629866126366431,0.3993893947733964,,, +20.375,40,0.14322041357408918,-0.12091703079186117,-0.3746093671190324,-0.6000372615838877,-0.7812185542963289,-0.9051234355607828,-0.9625840954364124,-0.9489354114152216,-2.770529788561011,-2.7741100518793322,-2.617555909851609,-2.3175758842055534,-1.9125303360045218,-1.4564963290703912,,, +20.3828125,40,-1.0108874241412489,-0.6349334468384763,-0.3765028240383277,-0.26469671407717943,-0.30536817890790546,-0.4802640458739002,-0.7499228453782584,-1.0598771751452103,-1.3491941543977446,-1.5600234574045513,-1.646665477537535,-1.5827469141224002,-1.3653858537707777,-1.0156973219692178,,, +20.390625,40,-0.5755602752704231,-0.101149309752378,0.34576171961955626,0.7073699295959591,0.9387971340587852,1.0150327224138809,0.9347845372508796,0.7206381798450943,0.4155001396309298,0.07587894242188728,-0.2369490089412204,-0.466512774810447,1.0457191305783111,1.6032576944397758,,, +20.3984375,40,2.1263111803225163,2.480174395693398,2.574248704193254,2.3867587196538214,1.9706266951839468,1.4388955471007017,0.9336963671403964,0.5872660395542549,0.485699203623825,0.6453691931075272,1.0084801895602888,1.458969327250407,1.8543999713240709,2.0651044894542854,,, +20.40625,40,2.009847774169061,1.6782361443653868,1.1337287715665338,0.496424876929409,-0.08965735315563228,-0.4958439686419946,-0.6438515348292357,-0.5270132866750288,-0.21186972568664744,0.18031018690125936,0.5070106154453742,0.6437747464712875,0.5185602495338714,0.13172633042831228,,, +20.4140625,40,-0.7327826772737539,-0.6434167752887711,-0.5466822749517521,-0.4447148991814384,-0.3397461458295156,-0.23406400607450406,-0.1299726908324335,-0.029752070483684057,0.06438246174812262,0.15031899986101255,0.2260863253938049,0.28988864649791385,0.3401372673632768,0.3754786333352687,,, +20.421875,40,0.3948182605321754,0.3973401308255814,0.38252121244823606,0.3501408518466336,0.3002848721927963,0.2333443066607181,0.1500087885132123,0.051254713605569546,-0.06167161755500894,-0.18727558314617296,-0.3238401709765996,-0.4694558031274866,-0.622053532195415,-0.7794410280115414,,, +20.4296875,40,-0.939340724843334,-1.0994294612631241,-1.2573789187260287,-1.4108961509139482,-0.8643419937721363,-0.7137887786165333,-0.5067358197597074,-0.2564613462116791,0.02086111043146059,0.3072871710538816,0.5843492426375059,0.8343403376359964,1.0415445636467036,1.1933284874749386,,, +20.4375,40,1.281017280000064,1.3004945568119708,1.2524840977671263,1.1424938127856736,0.9804258744050048,0.7798802173780627,0.5571999885930995,0.33032552565420964,0.1175367948168235,-0.0638280025819895,-0.1985882838395553,-0.2747865973771728,-0.2845294761357348,-0.22454497993669756,,, +20.4453125,40,-0.0964180308620708,0.09351288595778427,0.3345904698119321,0.6125745009493764,0.9106275869690408,1.2104820370286775,1.4937065111863712,1.7429841344768735,-0.5699681598470068,-0.5247928510754112,-0.3323125063235817,-0.017508502656647718,0.3748627741483964,0.7872347003887809,,, +20.453125,40,1.1581944672259399,1.4320502174745158,1.5675111138421498,1.5441283307699862,1.3654936892583465,1.058697647915703,0.6701309685096735,0.2582838468894094,-0.11533605801970424,-0.3957522908888148,-0.54304788295368,-0.5385451182810633,-0.3876744594419349,-0.1190860037225277,,, +20.4609375,40,0.21985790031381647,0.5705065809871229,0.8721049437545186,1.0713066368466042,1.1305344830184674,1.033885716160896,0.7896619662662865,0.4291296460721776,0.0017035256453837994,-0.4326966118756124,-0.8129260314810671,-1.0860866925947337,-1.6397738192778513,-1.992424542624189,,, +20.46875,40,-2.071287576380249,-1.8804500165967,-1.4958780855408793,-1.0444507261086522,-0.6690587312341869,-0.4893357748722941,-0.568784690128932,-0.8973094008694185,-1.393940485637638,-1.9290076793043616,-2.3596825884097288,-2.569150313549461,-2.4986738905411707,-2.163763123035225,,, +20.4765625,40,-1.6500156893165494,-1.0897694331834171,-0.6259636434974383,-0.3731125857106011,-0.3860858320543683,-0.6452501795079216,-1.0620435908916928,-1.5034516724231597,-1.8286764824961657,-1.9279458316214977,-1.752824525011825,-1.329718016988955,-0.7528653767164254,-0.15873982376082985,,, +20.484375,40,-1.5577634943187837,-1.6958771613630694,-1.8232838404335543,-1.9382146620956413,-2.0391159368751937,-2.124676126526644,-2.193848576651704,-2.2458696127557607,-2.2802716830105405,-2.2968913177247803,-2.2958717662812758,-2.277660265496781,-2.2429999873612125,-2.1929168072763483,,, +20.4921875,40,-2.1287011246079324,-2.051885053990957,-1.9642153868939107,-1.867622796998845,-1.764187828729336,-1.656104264585039,-1.5456405128273596,-1.4350996917368548,-1.3267791094696544,-1.2229298491306448,-1.1257171668367667,-1.037182396297252,-0.9592070270706332,-0.8934795855813314,,, +20.5,41,-0.8414658989094588,-0.8043832621314988,-0.7831789616307502,-0.7785135305301588,1.9433129657531392,2.0830451256046265,2.154692138305082,2.155440345140102,2.0873404638493844,1.9571580914351987,1.7758955907511782,1.5580187163522594,1.3204419241493597,1.0813431367176238,,, +20.5078125,41,0.8588906282073661,0.6699708205037922,0.5290057181672972,0.4469424583382576,0.4304854490631469,0.4816246524034411,0.5974929169347536,0.7705623178979122,0.9891658224947532,1.2383079111384432,1.5007076349267343,1.7580013803192265,1.9920214743562732,2.1860614743587083,,, +20.515625,41,2.3260399137842778,2.4014813560966792,2.406246347362272,2.338959367573469,2.203104939366769,2.00678519242128,1.7621557887568686,1.4845795422472123,-1.2157155040811591,-1.1874141008757575,-1.0110435445606751,-0.7191423729131936,-0.3618146468950717,0.0011155511232501247,,, +20.5234375,41,0.30946096190444083,0.5120817446928982,0.5748838741426439,0.486159362761149,0.2584363742105679,-0.07344908667220335,-0.4577596935483766,-0.8338995457623948,-1.1418405348692626,-1.3314641961612257,-1.3703640539644162,-1.2488932348752249,-0.9816711661426932,-0.605314671528288,,, +20.53125,41,-0.1727468259643778,0.2550300583819758,0.6184159877101091,0.8684726755969804,0.9745186805065896,0.9288774419227692,0.7480388347120137,0.4700534923980816,0.1485659329173456,-0.15558393954201655,-0.3838826299898492,-0.4893048456078719,0.508937988609263,0.2217212160009148,,, +20.5390625,41,-0.21630454853077252,-0.6685123973693883,-0.9958769529359156,-1.095223596811359,-0.9276343100120068,-0.5292237423058456,-0.0013310978023195206,0.5171848813014043,0.8879553520152291,1.0109984143693382,0.8521175458061551,0.4522923566920674,-0.08351224557445436,-0.6150518055660836,,, +20.546875,41,-1.0051561936021765,-1.1572207509984769,-1.041560490535919,-0.7034056181843189,-0.2503483741395854,0.17731687523957862,0.4452297734361757,0.4619855738498084,0.2043938241605121,-0.27595047708201204,-0.8665862495142362,-1.424783442802715,-1.816434277620144,-1.9525818483621091,,, +20.5546875,41,-0.7907490295300739,-0.8199425584422415,-0.8658451121172285,-0.927905800879743,-1.0052813616522407,-1.0968507933045941,-1.2012348600404847,-1.316820121387143,-1.4417870680964808,-1.5741418713616722,-1.7117511894886666,-1.8523794226188115,-1.993727763229404,-2.13347435869938,,, +20.5625,41,-2.2693148827410767,-2.3990028053479127,-2.5203886561764315,-2.631457593903371,-2.730364623763988,-2.8154668466449237,-2.8853521750888995,-2.9388640134228714,-2.9751214698877897,-2.993534746881898,-2.993815439852808,-2.975981564523652,-2.9403572244390204,-2.8875669246630973,,, +20.5703125,41,-2.818524631202281,-2.734417767726669,-2.636686429805417,-2.5269981806109296,1.1915567509052312,0.901506830212042,0.6324862042006212,0.40093185513401375,0.22051814258983934,0.1012066033239788,0.04855498537133052,0.06333369185568694,0.1414763725930056,0.27436809966955944,,, +20.578125,41,0.4494510216835023,0.6511052518707537,0.8617435517487245,1.0630434626690122,1.2372309523698504,1.3683260507766415,1.4432635993544611,1.4528109465432673,1.392218580940197,1.261558316534627,1.0657254319007112,0.8141045984278243,0.5199228774024677,0.199334887132566,,, +20.5859375,41,-0.12969608231025515,-0.4486430001672783,-0.7396992759240297,-0.9870126572575082,-1.1777828186670156,-1.3031461197870713,-1.3587858537530009,-1.3452254484138817,-0.4436880463095204,-0.24217087412272265,0.09599611089737624,0.530393936706953,1.005674779900243,1.4601260213927687,,, +20.59375,41,1.8352251894673768,2.0846978492966404,2.181667917952723,2.1227869983895906,1.9286998577599053,1.6407738369237856,1.314601885576604,1.0112914359403729,0.7878961875527621,0.6884813626581169,0.7372143148874695,0.934556902670557,1.2571529096516123,1.6614282571709282,,, +20.6015625,41,2.0903434517110004,2.482246716722788,2.7804490484162128,2.9420299736035584,2.9445025911253992,2.7892998868371888,2.501539395554388,2.126102930027325,1.720642023989566,1.3465985515867145,1.059639111110764,0.900993049180254,-0.9886437003968456,-0.5586091254576806,,, +20.609375,41,-0.29468071866519696,-0.2801496793003433,-0.5280649038418944,-0.9775073402120044,-1.510154205110547,-1.9825946091824431,-2.2655409750796838,-2.2791905214698795,-2.0150460464948385,-1.5382161457191599,-0.9695647974579248,-0.4526027252774421,-0.11419456028105225,-0.02985052175196279,,, +20.6171875,41,-0.20311465058573408,-0.5646979868761515,-0.9915933915667025,-1.340932156161479,-1.4893020855160055,-1.3667497467590182,-0.97614633461826,-0.3926078577933709,0.2568732606340606,0.8280047252274377,1.1985046730431337,1.301374050209552,1.1430142357983362,0.8012265835217003,,, +20.625,41,-2.4072188694135934,-2.279379983819839,-2.1456431074065225,-2.008262105075944,-1.8695436982463047,-1.7318071201836929,-1.5973435578774349,-1.468376090606852,-1.3470208266354853,-1.2352499184942929,-1.1348571044172449,-1.04742637925134,-0.9743043433717584,-0.9165767137197409,,, +20.6328125,41,-0.8750494082049566,-0.8502345346296256,-0.8423415294100612,-0.8512736011972651,-0.8766295416057013,-0.917710871279825,-0.9735341961011822,-1.0428485571115385,-1.1241574702782902,-1.2157452701140103,-1.3157072957947022,-1.4219833911349622,-1.5323941317588403,-1.6446791450366738,,, +20.640625,41,-1.7565368517246154,-1.8656649333388131,-1.9698008165858083,-2.066761465879153,-1.2677841918453765,-1.1361985867631152,-0.9639357550734148,-0.7672467879321838,-0.5640260709045827,-0.3725561435446899,-0.21022563445388764,-0.09230969011318536,-0.030897957504248837,-0.034044890763084146,,, +20.6484375,41,-0.1052016483116871,-0.2429692102434363,-0.4411899455424678,-0.6893712569982213,-0.9734117742916188,-1.2765794674882462,-1.5806734853616495,-1.8672887105951144,-2.1190948604885222,-2.3210409467906343,-2.46140111251345,-2.5325889241506454,-2.5316833433000907,-2.4606297064481155,,, +20.65625,41,-2.326101703597194,-2.1390339852621123,-1.9138579946750685,-1.6674943162907376,-1.4181718097379008,-1.1841558763505473,-0.9824745410584399,-0.8277311839133978,0.8910432336967656,1.0261677856221016,1.2793246051432328,1.6042875477759302,1.9428743226631928,2.2340401899121765,,, +20.6640625,41,2.4234209075644566,2.4718383884035817,2.3614440737427222,2.0985429538480136,1.7126581570392465,1.2519815674610155,0.7759188145523872,0.3458895333716885,0.015815536273112052,-0.1762218621979036,-0.21385623371815776,-0.1049274582780183,0.1197975811692114,0.4114754797535232,,, +20.671875,41,0.7108521855930603,0.9575499751376204,1.0995287429559948,1.1012476734666756,0.9492557897891998,0.6543403476695179,0.2498981844026185,-0.21321656305095088,-0.6745661215807917,-1.0734979961570308,-1.3585500972995224,-1.4954273893614205,-0.014544780308308638,0.14303037238162486,,, +20.6796875,41,0.5518913453919114,1.128247293537057,1.7406299824308826,2.2457447941186564,2.527579481543456,2.5290535721254193,2.267535541508324,1.8299760633926976,1.3489920779950029,0.9664570370325052,0.7945766651765641,0.8851185176248517,1.2152286951681277,1.6937228276552734,,, +20.6875,41,2.1861268469205286,2.551604111189705,2.6816475511438123,2.5299315752748446,2.125141132184944,1.5632606033136591,0.9814344807583708,0.5205622558770293,0.28687742410288786,0.32303881555317016,0.5966553158554972,1.0093869883447897,1.4241261691432665,1.7028068823630758,,, +20.6953125,41,-2.154481787070863,-2.2310509698560623,-2.294746132391285,-2.3440626789040198,-2.377740838631161,-2.394787921276,-2.3944958991854217,-2.3764540082689742,-2.3405561469033564,-2.2870029431531544,-2.216298453990861,-2.12924155419418,-2.026912165578214,-1.910652567566402,,, +20.703125,41,-1.7820441162251697,-1.6428797792875856,-1.495132967947444,-1.3409232110500573,-1.1824792725957964,-1.022100358232946,-0.8621160898859721,-0.7048459492254266,-0.5525588999912727,-0.4074338960488984,-0.2715219665417743,-0.1467105418978567,-0.03469064520073328,0.06307247673057037,,, +20.7109375,41,0.14536476844016388,0.21124438223278846,0.2600579280084473,0.2914516721378163,-0.7310867123656221,-0.6994821489137875,-0.7351558430173001,-0.8354889702479941,-0.993190088341206,-1.1968058754880209,-1.4315224297052682,-1.6802012455952633,-1.9245776192416368,-2.1465379046344384,,, +20.71875,41,-2.3293865456996143,-2.4590145203112805,-2.5248877068204503,-2.520786240355249,-2.4452432897972045,-2.3016526460692144,-2.0980376066428907,-1.846497259505334,-1.5623687652752456,-1.2631640400115096,-0.9673549725734912,-0.6930918721236952,-0.4569444970630109,-0.27275344166348003,,, +20.7265625,41,-0.15067196074905842,-0.09646503266209316,-0.1111145224615725,-0.19075796176779614,-0.3269651973504828,-0.5073335997877362,-0.7163603092199649,-0.936530676522672,-1.4723078447720837,-1.3016514474795111,-1.0182306398789327,-0.6736891193359373,-0.3284765992769973,-0.04241583758817924,,, +20.734375,41,0.13462875347468714,0.17052744398060826,0.0558952263236302,-0.19444479852350927,-0.5437726144735386,-0.939197057781756,-1.3199042939683776,-1.6266441937634004,-1.8109769680390349,-1.842839742795466,-1.715254414203515,-1.4454433657864747,-1.0721791064059905,-0.6497804573981847,,, +20.7421875,41,-0.2396902188122333,0.0990540729586412,0.3189722909088171,0.3914915088277877,0.3113489183691416,0.09736235318720264,-0.21055132527316844,-0.5576453029581876,-0.8829226266142101,-1.128690118470947,-1.2495980307824357,-1.2197571760082753,1.0481393226406983,0.4530281701796557,,, +20.75,41,-0.1320194016773114,-0.5687167958667501,-0.7583061836229177,-0.6684424838467458,-0.3418903707110043,0.11534774719627787,0.5632176332164077,0.8661128215540019,0.9301352897959242,0.7289043256410913,0.3108394994893509,-0.2140787531011769,-0.7044426590200328,-1.026186089527314,,, +20.7578125,41,-1.089363414472711,-0.872857875156378,-0.4302470764711329,0.1247827299946061,0.6494770274470816,1.0110019867019373,1.1226976024315565,0.9676605881810092,0.6031952826733695,0.14491445314610066,-0.2651506529623873,-0.4976889756502736,-0.4717682627706326,-0.1772385942442284,,, +20.765625,41,0.3053774894217235,0.30209346405343185,0.2821591291948683,0.2464254286596035,0.1960195766059074,0.13232508048113067,0.05695727715152087,-0.02826518929285648,-0.1213524484964142,-0.22017848169673515,-0.3225185821385345,-0.4260885419791767,-0.5285848794021203,-0.6277254014264837,,, +20.7734375,41,-0.7212893920392186,-0.8071567218281981,-0.8833451941807153,-0.9480454739994948,-0.9996529872060684,-1.0367962323574815,-1.0583610085186177,-1.0635101350419918,-1.0516983178494104,-1.0226819017886997,-0.9765233381919476,-0.9135902892952362,-0.8345493850924406,-0.7403547418322541,,, +20.78125,41,-0.6322314430938276,-0.5116542725821285,-0.38032207092897297,-0.24012816541330506,-1.1495469822151532,-1.3376117334440425,-1.4846760335758151,-1.5775659546174563,-1.6069083501198578,-1.5677915320450209,-1.4601147240964447,-1.2886019068924115,-1.0624790736859686,-0.7948373871367199,,, +20.7890625,41,-0.5017266311334561,-0.20104215947232587,0.08871705624850129,0.3497326879952707,0.5661040795489395,0.7249517924191905,0.8173107277783104,0.8387505557068723,0.7896801981329321,0.6753151431386741,0.5053098794645134,0.293081091581815,0.05486881921881287,-0.1913989429240696,,, +20.796875,41,-0.4273590235700232,-0.6354958652818121,-0.8003648687574946,-0.9096709790432622,-0.9551272969255294,-0.9330338391418644,-0.8445360867666616,-0.6955452913480739,-1.0368247116582123,-0.7224219083516747,-0.31881854556211464,0.117599923573201,0.5250651903832259,0.8459989773854003,,, +20.8046875,41,1.0359352253688665,1.0704021523441418,0.9486925051286575,0.6939349920364161,0.3494559818143248,-0.02800165042530581,-0.3771461496039141,-0.6417096366063453,-0.7792348411099058,-0.7677071044434655,-0.6089985754056632,-0.32858805947962977,0.028399911250900824,0.4042198988193924,,, +20.8125,41,0.7375001440758833,0.9728059666226976,1.0692824142322626,1.0070299867908057,0.7902203246423342,0.4464664984507695,0.02254588319305853,-0.42285831643473465,-0.8282664801116219,-1.1389442410861883,-1.3153904174863222,-1.3394493545742254,1.4314862283962937,1.7685141481006714,,, +20.8203125,41,1.8394287251814951,1.6377394060326818,1.2302294266381002,0.7384733287195038,0.30535198054282864,0.05574394418324069,0.06216797505964755,0.324794324404864,0.7713042872148996,1.276637448651745,1.697215270519365,1.9102619317171723,1.847446129517934,1.5136237963724626,,, +20.828125,41,0.9855448709089502,0.39087830553495656,-0.12669653173223916,-0.4467653217648321,-0.5050577540133043,-0.31091988777424057,0.05540751434067098,0.4649573663225906,0.7755741230271447,0.8710795852616111,0.6933306678023721,0.25838114396141404,-0.3476840873717498,-0.9921025869774158,,, +20.8359375,41,-0.09312739027418764,0.058499725001430185,0.21248497245118225,0.3665120218869915,0.5182568240796235,0.6654281535103056,0.8058075808647525,0.937288175437996,1.0579112598480274,1.1659005735582886,1.2596932470830016,1.3379670445832708,1.3996633979070694,1.4440058288096365,,, +20.84375,41,1.47051343684254,1.4790092167973148,1.469623060119279,1.4427893877886122,1.3992394561644064,1.3399884705627048,1.2663177322484789,1.1797521314891397,1.0820333807977294,0.9750894570838105,0.8610007878102768,0.7419637732557112,0.6202522836349051,0.4981778052753325,,, +20.8515625,41,0.3780489337066431,0.26213092295271545,0.1526059993204778,0.05153513460247405,-0.496326095899468,-0.26078022787412203,-0.005476215934042239,0.2515072062815368,0.4918433531631945,0.6982374721152526,0.8556350053581898,0.9522739671390972,0.980508044472622,0.937343016954704,,, +20.859375,41,0.8246490816215543,0.6490342682608753,0.4213877631192377,0.15612497659364827,-0.1298130118216681,-0.4181358706604321,-0.6904742721837406,-0.929655420098258,-1.1208949156472758,-1.252821862949177,-1.318265743717312,-1.3147502045257695,-1.2446593381428608,-1.1150648788708055,,, +20.8671875,41,-0.9372263777424136,-0.7257992278879042,-0.4978057832268595,-0.2714413341227511,-0.06479821981080036,0.10540293383279586,0.22498635937114755,0.2833168514927026,-1.2170958528562914,-0.9774591337795606,-0.6682380978363481,-0.3482222173310199,-0.07808322961488567,0.0891278618602146,,, +20.875,41,0.11629806323760784,-0.01191179687530075,-0.28662196140505103,-0.6760604730969528,-1.1304553838261189,-1.5897307500591495,-1.992808014474078,-2.2870643241903346,-2.436474888696148,-2.4271714431308573,-2.2695513311679463,-1.9966089728585332,-1.6587498568235923,-1.3158950507727536,,, +20.8828125,41,-1.0281062283351088,-0.8461916343100895,-0.8037563649609238,-0.9119353648420536,-1.1576296779080135,-1.5055208229735968,-1.9035496826059308,-2.291006659398302,-2.6079731153479044,-2.8046436205467424,-2.8490770814674367,-2.7321695086068605,-1.8962011114242536,-1.6857469370718108,,, +20.890625,41,-1.3084250479063406,-0.8972356393142258,-0.5930277034768319,-0.5056892323257617,-0.6838360425010569,-1.101308334840866,-1.6641774707596872,-2.236344063704897,-2.676712999899579,-2.8777579393775765,-2.794906849010029,-2.458695605850878,-1.9663592642100192,-1.4551658945345831,,, +20.8984375,41,-1.0648015078079736,-0.8991151394509623,-0.9977083201589444,-1.325154905236392,-1.7808050816950467,-2.226485673376187,-2.5245038408313847,-2.5755372460134254,-2.346024704608054,-1.877548799362445,-1.275637254537219,-0.6810504510259244,-0.2314223812793691,-0.023766090048764062,,, +20.90625,41,-0.039178051959536934,-0.11782063087233086,-0.18290035501940186,-0.2331717825600751,-0.2676580726940929,-0.2856680726648966,-0.2868083968229699,-0.2709902862649153,-0.23843112895868254,-0.18965061376306855,-0.12546158571259958,-0.04695576272252156,0.04451543614961606,0.14736461515531166,,, +20.9140625,41,0.2597962635600711,0.3798382667048975,0.5053765146189425,0.6341920021355111,0.7639997708432106,0.8924890109375249,1.0173636207386314,1.136382513616116,1.2473989664812732,1.3483983207954926,1.437533375874562,1.5131568546868228,1.5738503735922291,1.6184494086839565,,, +20.921875,41,1.6460638214960683,1.6560935845850184,1.6482394315482245,1.6225082449077823,0.2740485785846196,0.1955747680122044,0.05114688998291162,-0.1513449881474802,-0.3999153775061495,-0.6793122127366455,-0.972073585082608,-1.2597386905845889,-1.5241285662967354,-1.748607320574333,,, +20.9296875,41,-1.9192359233776972,-2.0257381142855597,-2.062211087139147,-2.027531407336455,-1.925427869714666,-1.7642162297456203,-1.5562143188782327,-1.316878342132503,-1.063720598285431,-0.8150841044880968,-0.5888595849898552,-0.4012343021249869,-0.2655599865600813,-0.19141881790207996,,, +20.9375,41,-0.18395259537312847,-0.24350188440809886,-0.3655803086718188,-0.5411857854474632,-0.7574270054297805,-0.9984214741492864,-1.2464024945965615,-1.4829578996549917,-2.4690739065512437,-2.096846127819848,-1.66868333678374,-1.2456524279139891,-0.8871966747176372,-0.6418991623069753,,, +20.9453125,41,-0.5399415412091627,-0.5884325653642567,-0.7703338745007658,-1.0471501732768362,-1.3649646177757786,-1.6628791699901018,-1.8825450792708625,-1.9772988425335472,-1.9194804307862123,-1.704793679397766,-1.3530294276230321,-0.9050385047743692,-0.4164257588365144,0.05105296804219445,,, +20.953125,41,0.4390512394608629,0.7016610094049142,0.8125041735171535,0.7687824346559251,0.5916549877723429,0.3228854878943482,0.018280839618429717,-0.2610559684997775,-0.4582962943749162,-0.5297886280788761,-0.4519068223455107,-0.2247768764555628,-0.7906755643252986,-1.1814064367616053,,, +20.9609375,41,-1.4174889581464236,-1.4075740298092698,-1.1284636878050367,-0.6316802908961099,-0.029545926205493806,0.5354145595813621,0.9293628789959509,1.0636721253739954,0.9190781351551442,0.5508394570872193,0.0734927886061564,-0.37061717677966455,-0.6504077946525908,-0.682020009028476,,, +20.96875,41,-0.4518151403742836,-0.02010413315691345,0.4954126640948714,0.9519561730065228,1.220873771088528,1.2229932699447548,0.9504352767791844,0.4689046989981444,-0.10016793858127224,-0.6127422920019511,-0.9414666682046949,-1.0103903690760538,-0.81557814586912,-0.4259789062071686,,, +20.9765625,41,1.5792130874269483,1.5189678762179917,1.442676792801335,1.3515186144472102,1.2469262410563993,1.1305617759623992,1.0042875968815121,0.8701339234538417,0.7302634491542043,0.5869336567568809,0.44245747709812017,0.2991629798809324,0.1593528022235049,0.02526402523339738,,, +20.984375,41,-0.10097079895045223,-0.21736078735255251,-0.3220913833951723,-0.41355592444480205,-0.4903835670525549,-0.551463081042865,-0.5959620959440726,-0.6233414628855827,-0.6333644806135516,-0.6261008242081387,-0.6019251078404512,-0.5615101068681219,-0.5058147580793035,-0.4360671483362941,,, +20.9921875,41,-0.35374278961642425,-0.2605385609873899,-0.1583427739282459,-0.049201885278835816,-1.6903141547886709,-1.8525762868085736,-1.9568371740751689,-1.9940788425321359,-1.959802915217474,-1.8543462490721356,-1.68285974494173,-1.4549518038613651,-1.1840212871975977,-0.8863264893188553,,, +21.0,42,-0.5798550393872309,-0.2830735299402906,-0.013644056247959946,0.21280284289176946,0.3837532859879868,0.4906775342787596,0.5296193803646665,0.5014663518679279,0.4118819003166861,0.2709043168617584,0.09224035717859558,-0.10769715270191853,-0.31094060436795634,-0.4992274909555863,,, +21.0078125,42,-0.6552810160146312,-0.7640221107030571,-0.8136283254952829,-0.7963657401880377,-0.7091358639026293,-0.5536993711907039,-0.3365610554158571,-0.06852400482743315,0.1276984236574613,0.5615210641768267,1.0194123413282927,1.439699164904764,1.7658882085969445,1.9554368349225268,,, +21.015625,42,1.9863548106660336,1.860608675416089,1.6037986096857912,1.2611582067286826,0.8905002586990641,0.5532073213045049,0.30467033613373595,0.18566453667565685,0.2160058561757268,0.3914758344116943,0.6844939139726414,1.0484323207446642,1.4249013519176101,1.7528702190397634,,, +21.0234375,42,1.978202677853086,2.062122053731984,1.987287007033248,1.7605315066866254,1.4118420326950971,0.9897310859825752,0.5537273656542854,0.16515205676034314,-0.12238239095566472,-0.2712713978766116,-0.2657229459160925,-0.11416399791079868,0.6240737775417421,0.5577157161805589,,, +21.03125,42,0.2306291955933173,-0.2820904551088625,-0.8535426864287805,-1.3395992535291104,-1.618213616047087,-1.6226905506560354,-1.3597995267951246,-0.9077691372814509,-0.3947137311499264,0.036593815090947945,0.2679473074145483,0.23817899872634465,-0.040022412875023616,-0.4835574485030122,,, +21.0390625,42,-0.9616812080694176,-1.331849303052147,-1.4788200402788447,-1.346295886318022,-0.9524317958430032,-0.3849593941601861,0.22273750907187093,0.7280401176103671,1.018024902009019,1.0402386673063433,0.8168854404651134,0.4385386464211997,0.03910367125163194,-0.24110527357267156,,, +21.046875,42,0.06471555918638322,0.18115711908580825,0.2978261227420101,0.4124221048370084,0.5226813102230445,0.6264165545267162,0.721555743462542,0.8061783762481934,0.8785493938132001,0.9371497789938876,0.9807033727678514,1.0081994368510792,1.0189105674543129,1.0124056463990514,,, +21.0546875,42,0.9885576026932708,0.9475458485308756,0.8898533469355439,0.8162583622667061,0.7278210379117256,0.6258650360632364,0.511954560947061,0.387867167700046,0.25556283289333825,0.11714982815822192,-0.02515200565502107,-0.16904994082814429,-0.3122183244273395,-0.4523391196406305,,, +21.0625,42,-0.5871423170314655,-0.7144455082218784,-0.8321919291727551,-0.938486307033556,0.2360559272134329,0.5602633870281649,0.8857952742868178,1.1942292917869155,1.4683008486492262,1.6930992916172132,1.8571000645432012,1.9529608372117415,1.9780261036175528,1.9345050789193168,,, +21.0703125,42,1.8293105059296488,1.6735696275326943,1.4818414419761643,1.2710948394278492,1.0595188922494785,0.8652482754613036,0.7050927115912513,0.5933590529635403,0.5408481540210563,0.5540964970152374,0.6349154663750731,0.7802604104239781,0.9824386313443948,1.2296418090515748,,, +21.078125,42,1.5067657401328287,1.796460236877241,2.0803359808940365,2.340244180104204,2.559539800299483,2.7242402870838545,2.8239989809773944,2.852825349704669,0.15212588058968962,0.4839405869099746,0.8218656826813362,1.105586290042521,1.2833346400002716,1.320005482104719,,, +21.0859375,42,1.2026750570401674,0.942663748740726,0.5738208804991732,0.14729854959683888,-0.2763717438166506,-0.6366658021454679,-0.8824549636156747,-0.9799338048743396,-0.9178527245380104,-0.7092405821038542,-0.3893492418717237,-0.010140311776661769,0.3678270803182272,0.6848438475504379,,, +21.09375,42,0.8913622509671913,0.95572060379851,0.8690781668348889,0.6467915770009925,0.3260184221597431,-0.040078761938779316,-0.3906252735925182,-0.6665320997985237,-0.8197194206726294,-0.8206290522112216,-0.662855603413955,-0.3641748804101807,0.39053352014771225,1.002760032386327,,, +21.1015625,42,1.6254947188892237,2.1176988644397894,2.3730742610405997,2.3489705798043903,2.077858032565115,1.6582229645638271,1.2273834760419609,0.9236772303716986,0.8483862375409721,1.0378353406496386,1.4533126648392556,1.99157564954478,2.5130642106463723,2.8800893938370296,,, +21.109375,42,2.9945316985832617,2.824717432370542,2.4141072246744506,1.8694153626603731,1.331415797175191,0.9364355263986706,0.7790881741315412,0.8864604852670463,1.2108253740014885,1.6428774120429832,2.041861894481685,2.2743384466375582,2.250953529308954,1.9511417793703765,,, +21.1171875,42,-1.0316278829847256,-1.1101400329432578,-1.1727959675744994,-1.2186400616963111,-1.2470044396939481,-1.2575205266247411,-1.2501253628418885,-1.225062571653432,-1.1828779631564386,-1.1244098513022365,-1.050774253817805,-0.9633452342088328,-0.8637307301230991,-0.7537442913924874,,, +21.125,42,-0.6353732226812465,-0.5107436886261555,-0.3820833925392162,-0.2516824822186929,-0.12185336746776525,0.005109847040243531,0.12697160317024592,0.2415941003342993,0.3469747894812778,0.44128149350306456,0.5228845390697227,0.5903853372307757,0.6426409123064576,0.6787839495453916,,, +21.1328125,42,0.6982380104875812,0.7007276495944891,0.6862832549851708,0.6552405285037101,2.8095018160978187,2.6976681165784804,2.5255673084988937,2.30547113809516,2.0528248391720134,1.7851709967990896,1.5209275159776934,1.278104908125791,1.0730523390013191,0.9193198752331958,,, +21.140625,42,0.8267162629572002,0.8006279361964582,0.8416467354815472,0.9455322891195682,1.103511671702188,1.3028954343261998,1.5279670387020003,1.7610836613595349,1.9839115939920968,2.178710079576695,2.3295740457291534,2.423549062425261,2.451540760911477,2.4089552829877543,,, +21.1484375,42,2.29602608551312,2.1178042959898167,1.8838132763511968,1.6073914675461576,1.3047693243694642,0.9939446924295526,0.6934350341760449,0.42099349841283695,0.0361908000833191,0.4836446216874752,0.91667904787173,1.2764132990306931,1.5157192363363994,1.6065144824855309,,, +21.15625,42,1.5440870838974,1.347778382585005,1.0579180032516806,0.7294886218509282,0.4235075421202863,0.1974677307776376,0.09632745988256408,0.1454522584319946,0.34660879330798544,0.6776349446283474,1.095837751358215,1.5445902635968909,1.9621000858727085,2.2909841365245582,,, +21.1640625,42,2.487158567454373,2.52665944620239,2.4093320858947807,2.1588146208936863,1.8188186032026603,1.4462861385746806,1.1024895609445955,0.8434600876315641,0.7112363949698688,0.7272963287202949,0.8891949098251737,1.1709323789809174,0.20318293088438652,-0.2241567633364222,,, +21.171875,42,-0.3964807900905506,-0.2966892112047513,0.0180463726886278,0.4321834410588832,0.8036997286122151,1.0032325284633141,0.9497372880541628,0.6328907249694237,0.11609674072431853,-0.4807302611552745,-1.013887488277549,-1.3551444013225735,-1.426782791847785,-1.2228137471306058,,, +21.1796875,42,-0.8105572597028472,-0.3121520487176025,0.12893651775761972,0.38723114734372,0.3896051376708855,0.13527528192303528,-0.30405375114761346,-0.8039323961975178,-1.2213846432588835,-1.434222601403936,-1.3746809492889285,-1.0481516359962448,-0.5318826228579709,0.046004420137470366,,, +21.1875,42,0.6082346142101955,0.5461889780978855,0.4702992337463363,0.3820121971207656,0.2830005372707609,0.17513346679414735,0.06044398528749734,-0.05890675064426179,-0.18066730692383254,-0.3025354377940684,-0.4221984468079384,-0.537373736265961,-0.6458488350611267,-0.7455202040128219,,, +21.1953125,42,-0.8344301391746379,-0.9108011269095484,-0.9730670491307228,-1.0199006922678482,-1.0502370782297858,-1.0632922087896954,-1.0585768951298742,-1.0359054303334525,-0.9953989529121154,-0.9374834424120368,-0.8628823821315994,-0.7726042173585571,-0.6679248286636568,-0.5503653270686037,,, +21.203125,42,-0.4216655598185733,-0.2837537905956673,-0.13871308498679175,0.011255010284122569,0.192378348852032,0.020261546258205088,-0.0866474249939011,-0.12420140483748797,-0.09309726786906636,0.0011801311911218135,0.14874785091206455,0.33602138989082536,0.5466692588997585,0.7627590163809331,,, +21.2109375,42,0.9660148341271872,1.1390988828715265,1.2668271668009212,1.3372350074143622,1.3424178619532,1.279088828686258,1.1488139480853747,0.9579088777347404,0.7170041328007031,0.4403091964139473,0.1446268036322103,-0.15181387554733924,-0.4306237993029056,-0.6745320521324432,,, +21.21875,42,-0.8685861688545128,-1.0011910910728026,-1.0649143146482694,-1.0570010902462943,-0.979563757180769,-0.839432013736464,-0.6476745703369147,-0.4188255466576353,1.5269950301485922,1.8994395063162344,2.226917174709348,2.454232999985862,2.540950061998095,2.4676994895080413,,, +21.2265625,42,2.2392129538855907,1.8836053247060756,1.448019125906948,0.9913090800651914,0.5749060309643589,0.2532830874577269,0.06550876992437049,0.029202617288821012,0.13783450063965674,0.3617880745861775,0.653022499311556,0.9526061039783164,1.199948330656199,1.3422917716833465,,, +21.234375,42,1.3429855936406248,1.1872514391917524,0.8845434518895022,0.4671345478570605,-0.014851162771607791,-0.5011863723428645,-0.9308624929901724,-1.2515338496223136,-1.42761345527198,-1.4457596940839732,-1.316899611044665,-1.0744739418297933,0.8580501067617157,0.6238067343347264,,, +21.2421875,42,0.21097179487669665,-0.2515964702391438,-0.6217907606979943,-0.7834192041103888,-0.6782612070818851,-0.3222270827182361,0.1988093806452212,0.7523651148747617,1.1954898103757965,1.4137919852660268,1.3526547049758506,1.0320869982541696,0.5411418115953845,0.013431363268946894,,, +21.25,42,-0.40954879499450014,-0.6172346293883009,-0.5603089990541609,-0.2642088222514181,0.1778778657884138,0.6306054502058362,0.953640026222722,1.040216830319225,0.846517557964938,0.4038151179509624,-0.18994387764752516,-0.7968132578445646,-1.2764690019813707,-1.5244691875656078,,, +21.2578125,42,0.16386885847462124,0.3168065221533727,0.4677462541206902,0.6144069810239283,0.7545880708918127,0.8862076883627318,1.007339066106925,1.1162440574329957,1.2114033826819741,1.2915430398988397,1.3556564174433408,1.4030217214580292,1.4332144131520383,1.4461144382383493,,, +21.265625,42,1.4419081220533274,1.4210846972919218,1.3844275252761578,1.3330001645944427,1.2681275311671687,1.1913724797527117,1.104508217070779,1.0094870297148713,0.9084058745562938,0.8034694342715148,0.6969512850253808,0.5911538563853622,0.4883678847000612,0.390832070045674,,, +21.2734375,42,0.3006936432705896,0.21997053374832,0.1505158004062077,0.093984948977881,-0.16986956211051246,0.08094370460323486,0.31537282032613856,0.5164569738964495,0.6696986969933658,0.7640744549710463,0.7928026372582924,0.7538153950293147,0.6499014263398976,0.4885097556100301,,, +21.28125,42,0.2812281950772432,0.042972862094406566,-0.2090547240735239,-0.4565702341326738,-0.6814849411298672,-0.8671707972064641,-0.9996239478398546,-1.0684455382643834,-1.0675714069042015,-0.9956997708946156,-0.8563870681380731,-0.6578052602364854,-0.4121775074962936,-0.13493155479885313,,, +21.2890625,42,0.15637014844471586,0.4432490024744291,0.7075925266265203,0.9329109425033272,1.1054804608916602,1.2152935632745914,1.2567500279697987,1.229040529872027,-0.7691774911321184,-0.4610143255572979,-0.20990546739331573,-0.06631221840584678,-0.06333579439566928,-0.2115239930031565,,, +21.296875,42,-0.4971939664890389,-0.8845325022955035,-1.3211468295877111,-1.7462015137244395,-2.099874184503365,-2.3326574088262624,-2.413057961954153,-2.332494344444896,-2.1066297589506986,-1.7729329358964916,-1.3848467083934848,-1.003472576658746,-0.6880663791181741,-0.4868253432492376,,, +21.3046875,42,-0.4294013851587201,-0.5223066349626428,-0.7479266666019311,-1.0672949734712718,-1.426196379880078,-1.7636485624905678,-2.021440437066503,-2.1532415390006268,-2.131863332629107,-1.9535412189618224,-1.6385700424359568,-1.2281938494147782,-0.8426707697521726,-0.4464728907439559,,, +21.3125,42,-0.1887711360742419,-0.16862264189714127,-0.4193889230705904,-0.8993573127037926,-1.5029429926650824,-2.0894035747548663,-2.5211984654042348,-2.7014818199044948,-2.600455250125305,-2.2633595405393634,-1.7979166917595188,-1.344665512005858,-1.0383221813467045,-0.9707568264215292,,, +21.3203125,42,-1.1657340603370343,-1.5723411008396866,-2.078905176804926,-2.5435862302302805,-2.8332605157901787,-2.8600382053169344,-2.6054063448740483,-2.1253798260819337,-1.5352479655214641,-0.9780963225933842,-0.5857299195483255,-0.4427063979351831,-0.5633351397730554,-0.8879446472202532,,, +21.328125,42,0.051806707888992665,0.025157774618747242,0.014941974868189156,0.021774199587781932,0.045969401264045806,0.08753684227547898,0.14617969616262816,0.22130000893128987,0.3120089336507561,0.417142059275874,0.5352795654195035,0.664770850302519,0.8037632007786415,0.9502340025589388,,, +21.3359375,42,1.1020259267686372,1.2568844768513978,1.4124972385118468,1.5665341455572084,1.716688056718663,1.8607149330808492,1.9964729127403,2.1219595986274333,2.235346906704267,2.3350128644747934,2.419569803137705,2.487888449858358,2.5391174984260334,2.5726983157306917,,, +21.34375,42,2.5883745266663456,2.586196309742534,2.566519328301043,2.5299983161603805,1.136196080821836,0.9867998797879778,0.7933816834366723,0.5715369466105643,0.3388321749766488,0.11357284023360766,-0.08648020782141352,-0.24535630661739216,-0.3499956493415225,-0.3911668920614074,,, +21.3515625,42,-0.36411769511884906,-0.26891281804112266,-0.11043617534116767,0.10194330604559664,0.3550187424412586,0.6326601561778219,0.9169333639524182,1.1893448815136294,1.4321260474374058,1.6294668333685174,1.7686133160963835,1.840752293575605,1.8416213695278183,1.7718019746040121,,, +21.359375,42,1.6366749012752502,1.446041462950889,1.2134367042068517,0.9551825625644644,0.6892470155171947,0.4339887750296729,0.20687507210950892,0.023261949770765237,-0.7782340629477098,-0.3504482403277721,-0.0029650483035066344,0.21871502913521035,0.2887518536784728,0.204935661260398,,, +21.3671875,42,-0.011023105888844031,-0.3169290179990174,-0.656726589000987,-0.9692827725109696,-1.1979588293608256,-1.2994804327007548,-1.250724189296938,-1.0523632955415794,-0.7288042649998362,-0.3244243627070115,0.10330441980495664,0.4927340616442002,0.7876129213955454,0.9458210608020748,,, +21.375,42,0.9459080487521414,0.7904150674336808,0.5054639849347377,0.13667747821136844,-0.2579342718107146,-0.6170123395921151,-0.8854054166195916,-1.0227553248845678,-1.0097744674782163,-0.851237515389106,-0.5752214252708914,-0.2287122454481891,-1.8283189725424287,-1.7388781676193386,,, +21.3828125,42,-1.3798268793546855,-0.8172316664329036,-0.17281995122657484,0.4091392470802513,0.8011354117041185,0.9271286213801442,0.7831621855520551,0.4382285405962841,0.015153028547873147,-0.3432634253513982,-0.5135617471186594,-0.42562495485807095,-0.08204133417037396,0.4424775795307591,,, +21.390625,42,1.0214657853844409,1.5112767976117158,1.7903878403513738,1.7926626652753057,1.5254569561609617,1.0676042694082102,0.5478343927561802,0.10953868449913984,-0.1284613653943929,-0.10439091275991486,0.16965612216331005,0.6111589368583382,1.0899311435564687,1.4639618621287815,,, +21.3984375,42,2.4775754301134345,2.410463573329189,2.3301249817692,2.2382454486737524,2.1367046385401594,2.0275430104972743,1.9129259303358952,1.795105599686068,1.6763814690524144,1.5590598279544032,1.4454132798390678,1.3376408114344631,1.2378291558102377,1.1479161257556547,,, +21.40625,42,1.0696565595747851,1.0045914756647698,0.9540209760427404,0.9189813733482592,0.9002269418905025,0.8982166123364171,0.913105843075904,0.9447438106486172,0.9926759684812109,1.0561519291795325,1.1341385324042328,1.225337869553142,1.3282099496804685,1.4409996098101538,,, +21.4140625,42,1.5617671984764885,1.688422495259403,1.818761272407011,1.950503858381826,-0.10467787696768582,-0.16880482655033335,-0.16558065920840626,-0.09631546301684067,0.03292380676559992,0.21173685773166528,0.4261161253170555,0.6594247407766002,0.8935582033460623,1.1102087467106163,,, +21.421875,42,1.2921442278613204,1.4244123529468258,1.4953862604016042,1.4975785435115438,1.428166941268127,1.2891950318787695,1.0874339256703385,0.8339145929828004,0.5431634296269411,0.2321943559787802,-0.08067227717334108,-0.37708162624184266,-0.6399184519139519,-0.8544945416752621,,, +21.4296875,42,-1.0095666684173548,-1.0981141135197667,-1.117821549624353,-1.0712336249625496,-0.9655704848129048,-0.8122171099660015,-0.6259220982078143,-0.4237617765846558,0.1297369208364541,0.43915310885937103,0.6456709751181315,0.7109564519626049,0.6182143667837888,0.37484411252512906,,, +21.4375,42,0.011329524841337923,-0.4234643506284502,-0.8698552844541287,-1.2665907946184438,-1.5603379832704447,-1.7139384547364642,-1.7121428431619408,-1.5639320484085533,-1.301063921677281,-0.9730720516288266,-0.6394959074817239,-0.3605528265130111,-0.18770502295268088,-0.15559114339612412,,, +21.4453125,42,-0.27657935419127433,-0.5387906230062531,-0.9079003484968604,-1.3324379856774131,-1.7517594733098347,-2.105450955274645,-2.342699343728874,-2.430170422619021,-2.35716763370482,-2.1372682193342007,-1.8061820495872372,-1.4161667804585,1.1202489436587553,0.5741113745076041,,, +21.453125,42,-0.006968355053910803,-0.4801221604400362,-0.7322417430426121,-0.7107544725562701,-0.4378097313302855,-0.003989806302629517,0.4567289136909159,0.803900003183585,0.9292945753144426,0.7867473808750405,0.40497973722774,-0.12011674135224455,-0.6516223217420127,-1.0489938050270946,,, +21.4609375,42,-1.2064813474413951,-1.0820295588343294,-0.7087427744696883,-0.18577283730120026,0.3488728011221384,0.7561499602014694,0.9340585602730744,0.8455487877279323,0.5286047559219681,0.08574263802627692,-0.3441976801449398,-0.6242353754006921,-0.6569399671431434,-0.4112997134600883,,, +21.46875,42,2.081335028104017,2.2089445214307566,2.331067480415,2.4455240972938963,2.5502577789858907,2.6433711598402714,2.7231593320574627,2.788139711919465,2.8370780188639815,2.869009912505492,2.8832579087262147,2.8794432786218453,2.8574927219351607,2.8176396981029934,,, +21.4765625,42,2.7604203915860803,2.6866643820996647,2.597480183078708,2.4942359015617805,2.3785353581031745,2.2521900848089866,2.117187691766869,1.975657155726748,1.8298316387712752,1.6820094879715282,1.5345140988611212,1.3896533454599953,1.2496792871660307,1.1167488579749558,,, +21.484375,42,0.9928862262961828,0.8799474843669643,0.7795882854802808,0.693234995621694,-0.22394189672272916,-0.0445204915610965,0.09785903030526066,0.1891361901922637,0.2188216579350839,0.18073645460878074,0.07345057507128339,-0.09960957354194457,-0.3303924266923016,-0.6067751017475678,,, +21.4921875,42,-0.9134012178381063,-1.2327442893360436,-1.5463225558799265,-1.8359805514600112,-2.085148060892335,-2.2799886885318132,-2.410357961415098,-2.4705041704116733,-2.4594630922265908,-2.381119081309784,-2.243928285317959,-2.060323298461167,-1.8458407808487949,-1.6180328898501497,,, +21.5,43,-1.3952384443303107,-1.195299523273804,-1.03431300468378,-0.9255041134484148,-0.8783005381134437,-0.8976716894443308,-0.983779183755992,-1.131962930527336,-1.0278693408349442,-0.7008645896575066,-0.4843648874962099,-0.40954768569164335,-0.4846962008190439,-0.6939100684936976,,, +21.5078125,43,-0.9995868063779676,-1.3482875717661291,-1.6790735563681434,-1.9330145253134468,-2.0623884191463517,-2.0381390359941403,-1.8544301045629696,-1.5295862919498364,-1.1032744257840712,-0.6303637990253718,-0.17242165937483844,0.21183169806130708,0.4756217836642953,0.5913557495021782,,, +21.515625,43,0.5548684336435734,0.3860175243987232,0.12553540992652915,-0.17137167190298105,-0.443679936352257,-0.6341112560506226,-0.6981134565511283,-0.6108586816016098,-0.3711695015099599,-0.0017609586045560512,0.4542394420724983,0.939952055608152,1.2679675930560688,1.7093278593840655,,, +21.5234375,43,1.9045053324960304,1.826056434344686,1.5214136475663076,1.0996505341721905,0.7013533386274653,0.4598586275307205,0.4644827066379014,0.7358226280358169,1.2199000789060659,1.802755095317775,2.3414917634781296,2.7032689599109,2.8015515542402785,2.619688177153665,,, +21.53125,43,2.2153549045880565,1.7046481154697315,1.2301871487607359,0.9219696284528671,0.8617084031115788,1.060424636997447,1.4554382696022474,1.9275806155629711,2.3339113872240995,2.546972919589174,2.4898225250216792,2.157240797680396,1.6173022574611875,0.9928766387431875,,, +21.5390625,43,0.6220598645669767,0.5669606511150662,0.5285450591311016,0.5071202568386869,0.5026876627882739,0.5149430897084929,0.54328224362669,0.5868114818745542,0.6443636415084375,0.7145186608867543,0.7956286332234468,0.8858468533208861,0.9831603487734101,1.0854253259114341,,, +21.546875,43,1.1904049097158445,1.2958085167728188,1.3993321717283975,1.4986990611944688,1.5916996148888982,1.6762304120691949,1.7503312318957525,1.8122195988447127,1.8603222181646868,1.893302750816113,1.9100854414278516,1.9098741854233523,1.8921667013186119,1.8567635599097698,,, +21.5546875,43,1.8037719121170148,1.7336038500791116,1.6469694300639106,1.5448644792296338,-1.333063800292999,-1.5740603772007475,-1.8389753977064505,-2.1099886699944035,-2.3686788693298064,-2.5973076168147027,-2.7800562996106333,-2.9041293853718946,-2.9606472925682663,-2.9452665524880928,,, +21.5625,43,-2.8584840147086057,-2.7056038796446567,-2.496369853118514,-2.2442880691896407,-1.96568799040986,-1.678586765542328,-1.4014362295711875,-1.151839913786908,-0.945329524308078,-0.7942861997651681,-0.7070817622634341,-0.6874998342594997,-0.7344771773947165,-0.8421832786286271,,, +21.5703125,43,-1.0004326213606678,-1.195400879501722,-1.4105950783989272,-1.6280100561239537,-1.8293905668420272,-1.9975110007870804,-2.1173834665295264,-2.1773099763584143,1.393548636851048,1.7578281763783714,1.9890738153059664,2.063811587972748,1.98241853236079,1.769018423830531,,, +21.578125,43,1.4676815969215666,1.1355209634810883,0.8337597538732517,0.6181624064939514,0.5303192065970814,0.5911422814084688,0.7975861092927824,1.1231034462450404,1.5217657420417507,1.9354063343968892,2.3026738750999267,2.568585892457813,2.6930944743764718,2.657329902770408,,, +21.5859375,43,2.4665497202979427,2.149333835930753,1.7531509546378914,1.336986781843105,0.9621820778724294,0.6829074440513866,0.5377582849413279,0.5437789005548547,0.6938462962172528,0.9578209886048654,1.2872853426828734,1.6231311842496383,-0.07016012927213401,0.07140701718371611,,, +21.59375,43,0.4027285832469817,0.799837033465163,1.1201868801563806,1.241965879466898,1.0977254237347729,0.6931108702750569,0.10555621404210892,-0.5367012892599368,-1.0895371853934126,-1.4322191561253976,-1.5002862864585853,-1.3030188887219578,-0.9207126541280791,-0.4825057948160884,,, +21.6015625,43,-0.1308375312431349,0.0177199362276087,-0.09547991184221184,-0.4549958551429962,-0.9754637367214442,-1.5249472055926991,-1.9610749819671984,-2.1700606189595684,-2.0979105207699007,-1.7652667346635136,-1.2618160471330788,-0.7217969779097853,-0.2873165715170123,-0.069529670265143,,, +21.609375,43,1.4285533996062418,1.2995472702632889,1.1595776309607273,1.0105664061915427,0.8545924961121801,0.6938556192128544,0.5306380397054365,0.3672648496459149,0.2060635011087903,0.049323296871576994,-0.10074445121505582,-0.2420448986808079,-0.3726361061267093,-0.4907628002702449,,, +21.6171875,43,-0.5948868673214971,-0.6837140448904373,-0.7562163451835233,-0.8116498169938351,-0.8495673356061817,-0.8698261967975953,-0.8725903820934104,-0.8583274557433562,-0.8278001478816603,-0.7820527713739456,-0.7223927103211707,-0.650367304477361,-0.5677365344582228,-0.4764419861460417,,, +21.625,43,-0.3785726378371915,-0.2763280693236655,-0.17197973722693732,-0.06783099476906987,-2.169705346487662,-2.0916334122720848,-1.9450191498312075,-1.7365218953443886,-1.4770784858386778,-1.181148162582125,-0.8657118751391186,-0.5490957505179834,-0.2497007533397747,0.015272895402326347,,, +21.6328125,43,0.2310176078764029,0.3861435300924989,0.4734653871619996,0.4904962206938399,0.43961360500189306,0.32788676763315205,0.16657668564466793,-0.029655966828692787,-0.24377977210351234,-0.4575866564774804,-0.6529678298090646,-0.8131825878491677,-0.9240314862348764,-0.9748520640745516,,, +21.640625,43,-0.9592676697757084,-0.8756371593477876,-0.7271740971287782,-0.5217271361856556,-0.27123688332100543,0.0090928859271103,0.30185187691681825,0.5886341143278522,1.904814631187019,2.0798363977220826,2.1119706981126893,1.9869607804479859,1.7147937004650695,1.3281997416295874,,, +21.6484375,43,0.8776099154057458,0.4233566462650137,0.026332133943863027,-0.26144088866036075,-0.40485763624545335,-0.3911456816501665,-0.23180225219467104,0.03924706024994756,0.3709811211256731,0.7032767378724369,0.9763175370546529,1.1399525210341177,1.161546442432857,1.031099056570763,,, +21.65625,43,0.7628357143749036,0.39302138219650185,-0.02566158634240314,-0.4322963693220244,-0.7672008690648534,-0.9812083975177176,-1.0433144146068467,-0.9454983550943076,-0.7039695535225209,-0.3566432214574189,0.042760400572362176,0.4330746566673959,-0.8482429135343412,-1.301818187731633,,, +21.6640625,43,-1.6296064287697123,-1.7252284597418028,-1.5452014456382623,-1.1210777663373446,-0.5510220969300017,0.02686698266533538,0.4721812570544651,0.6804634818337612,0.6116203514040481,0.30070274193634905,-0.15189932767118808,-0.6081578561109888,-0.9304102983579704,-1.0192480187096091,,, +21.671875,43,-0.8409041477445935,-0.4366332846281825,0.08848885280985733,0.5942771757131022,0.9437921795483776,1.0408268085788128,0.8562516477587139,0.4359982535031594,-0.11150733735414914,-0.6450169991907736,-1.029106880522502,-1.1712065150922084,-1.0468628951680574,-0.7063163545796283,,, +21.6796875,43,0.033823443850426516,0.13073788459003988,0.22075517302413844,0.3018446600381015,0.3721379488741151,0.4299617974925852,0.4738676000337324,0.5026569310544331,0.5154027051693095,0.5114655814939085,0.4905053255556002,0.452486929636995,0.3976813842945853,0.3266610874590714,,, +21.6875,43,0.2402899714193533,0.1397085204867482,0.02631394159951161,-0.0982641649937004,-0.23219220904123544,-0.3734645903156836,-0.5199386954572609,-0.6693722989091805,-0.8194627131125247,-0.967887002505886,-1.1123425572384045,-1.2505873162030166,-1.3804789351412183,-1.5000122140283727,,, +21.6953125,43,-1.6073541284362711,-1.7008758515135738,-1.7791812059169605,-1.8411310475383504,0.8513185407132835,1.0733300811636703,1.240793241426991,1.3434978000393718,1.3756092574837069,1.3360745034903343,1.2286944161821256,1.0618583318407004,0.8479589020788707,0.6025281419768157,,, +21.703125,43,0.3431549141590443,0.08825933411538739,-0.14419044139254333,-0.3379295640224537,-0.4795287254433853,-0.5593283219128105,-0.572109415553676,-0.5174547108048713,-0.3997743815059938,-0.2279949558337036,-0.014932963077536663,0.2236029705190285,0.4699189528258282,0.7056743900116913,,, +21.7109375,43,0.9131659032534144,1.076567054200376,1.1830374164733026,1.2236236408280308,1.193889666075513,1.0942321148832617,0.9298588662078658,0.7104322834624425,0.7552010058213499,0.9612976004451392,1.0222108336465792,0.9319924623741926,0.7087988696000578,0.3920325481244999,,, +21.71875,43,0.036171200077360514,-0.2977542156336191,-0.5517049510475271,-0.6797164823766296,-0.6551022708162952,-0.4746570081277716,-0.15920441891479165,0.24959596396114936,0.6956859584016319,1.117287481490854,1.4564714087419703,1.6681264304992736,1.7269312482990518,1.6312444456522581,,, +21.7265625,43,1.403306456014534,1.0857224593141848,0.7347743002071434,0.4116034131022773,0.1726383348056093,0.06075803747490838,0.09856769772992248,0.2848344843681835,0.5946387459643278,0.9832172736677844,1.3929002403135993,1.7620615454565798,0.39025714409648016,0.3755180063854871,,, +21.734375,43,0.08689986382464387,-0.419115832868868,-1.0268309656491137,-1.5928143417690177,-1.984982158765836,-2.1185666991440906,-1.979117474733216,-1.6262330568023242,-1.1770029485618478,-0.7736996851047783,-0.5445778264789813,-0.5685256250313265,-0.8532591494766583,-1.3330369536009226,,, +21.7421875,43,-1.886523252308804,-2.3699053217586274,-2.656189956827601,-2.669910154202575,-2.407730927347692,-1.9393075938863409,-1.3881618828519393,-0.8978175219796207,-0.5924766926743599,-0.5430147163446708,-0.7476125601921071,-1.1323347578192329,-1.5714936987655466,-1.9222181955075996,,, +21.75,43,-1.8858631540974784,-1.912807270382048,-1.9216950467167642,-1.9125646966607266,-1.885760292394996,-1.8419257101528872,-1.7819933317190892,-1.707167699841493,-1.6189044137552409,-1.5188846343554008,-1.4089856454337901,-1.2912479864424051,-1.1678397322799865,-1.0410185455516103,,, +21.7578125,43,-0.9130921657441824,-0.7863780271385739,-0.6631627125200263,-0.5456619526280089,-0.4359818717273035,-0.33608215785264084,-0.24774180258566114,-0.17252801021716413,-0.11176882065565596,-0.06652992541089986,-0.03759608255477609,-0.02545745603562599,-0.03030111848979533,-0.052007866281715616,,, +21.765625,43,-0.09015440248164774,-0.1440208494976547,-0.21260345974999664,-0.2946323017599042,0.4494019617711048,0.16307350814398058,-0.1305217246297008,-0.4128771497006911,-0.666294517950187,-0.8751110590947644,-1.0267846366043043,-1.1127612621732508,-1.1290644923185602,-1.0765656237476071,,, +21.7734375,43,-0.9609158630429416,-0.7921452177613917,-0.5839560965279781,-0.35276089449380954,-0.11653069305176544,0.10646462587518483,0.2989369789261052,0.4457920775834467,0.5351882896677073,0.5593685130163719,0.5152070372708011,0.4044332449267661,0.2335165382753477,0.013220503158434926,,, +21.78125,43,-0.2421426138517728,-0.5157051395793839,-0.7892156701378591,-1.044307533725575,-1.2637755769558578,-1.4327722502781417,-1.5398395948725998,-1.5777051758234553,2.0346886812104144,2.16908172308446,2.1443266754387267,1.9635350385279016,1.6533451227907199,1.2597628687355282,,, +21.7890625,43,0.8409900517150428,0.4583569609066104,0.16677185900132574,0.006174772019202468,-0.00467329211807721,0.1289016260517648,0.3783340388818292,0.6962901454010474,1.0240659939216123,1.3007602501270776,1.4727927242260628,1.502285938700704,1.3730040882185055,1.092924175782828,,, +21.796875,43,0.6930386499770689,0.2225758172516049,-0.2586177596924473,-0.6893466428650181,-1.0165441822297592,-1.2034825326040568,-1.2354365463206298,-1.1219196427145892,-0.8951436934316089,-0.6049430957395553,-0.310953929645714,-0.07326663050260618,-1.5311561050093685,-0.9446282493951484,,, +21.8046875,43,-0.3004970163435885,0.25724797768068497,0.6092398611697203,0.6932142840799581,0.5208332023282551,0.17424390742253545,-0.21668146642511812,-0.51018580990474,-0.5917214748111284,-0.4055825189035921,0.02959679248515712,0.6257269405123439,1.2491946982217943,1.7572842026201902,,, +21.8125,43,2.037107366119288,2.036375571222324,1.7775805028784033,1.35169886818535,0.8931474670967683,0.5428536096855152,0.40956290972949705,0.5399893673279639,0.9059890430401204,1.4122727634154717,1.922543957500884,2.2968977411340945,2.4302307911404397,2.281134324382435,,, +21.8203125,43,-0.3885936119003842,-0.492756420356324,-0.6052029850046425,-0.7238625002351672,-0.8465474903975126,-0.970992250541902,-1.0948926612703431,-1.2159466804609422,-1.3318948027592754,-1.4405597783072197,-1.539884895138618,-1.6279701548195569,-1.7031057078060834,-1.7638019629595334,,, +21.828125,43,-1.8088158439053093,-1.837172732379161,-1.8481837142255104,-1.8414578259646728,-1.816909087377196,-1.7747581968544022,-1.7155288597129261,-1.640038813648164,-1.549385708351597,-1.4449280864200142,-1.3282617984576,-1.2011922652183782,-1.065703072355099,-0.9239214475501332,,, +21.8359375,43,-0.7780812243995945,-0.6304839414199089,-0.4834587572038793,-0.33932188348202164,-1.5437864664109655,-1.4403685182535149,-1.274442534081078,-1.0572166054851626,-0.8033327381721531,-0.5298447679547721,-0.2550284437607203,0.002893343369966161,0.22702128998598725,0.4029577559748595,,, +21.84375,43,0.5198100355774325,0.5709488634043074,0.5544692642629676,0.4733216129284522,0.3351037681204561,0.15152878012349452,-0.06239470442607231,-0.28941218175257266,-0.5112299658532101,-0.7097946464498857,-0.8685561011718026,-0.9736259792532422,-1.0147508624468782,-0.9860322312964196,,, +21.8515625,43,-0.8863430203428655,-0.7194117030085275,-0.4935680305173442,-0.22116814256602768,0.08226087465681073,0.3990973442040564,0.710847224420936,0.999426990327689,0.056991633946758775,0.04567774655993706,-0.11899298274274905,-0.4245562165585368,-0.8361865119262605,-1.302069977968807,,, +21.859375,43,-1.7614251071358793,-2.1539227400682703,-2.429038189521541,-2.5538791020270093,-2.518270033330581,-2.3363019793915534,-2.044105689958952,-1.6941957400656524,-1.347266439025085,-1.0627175273057432,-0.8893854342669796,-0.8579238324598599,-0.9760203170390608,-1.2271942765742196,,, +21.8671875,43,-1.5733632110973983,-1.9607777765914118,-2.3284011171438643,-2.6174273143399107,-2.7804563392532597,-2.7888963735199037,-2.6374404426966733,-2.344919976999458,-1.9514022084690132,-1.5119833379132206,-1.088244039148251,-0.7386979551526023,0.7796411110333871,0.3519254180825174,,, +21.875,43,0.15603123985733636,0.2294940693901853,0.534772321915705,0.9697470417768304,1.3959278879814474,1.6766329113570064,1.7146760712958258,1.4792313255885463,1.0145084947977234,0.4278609608493363,-0.13941759222564346,-0.5506057225390992,-0.7108229210969069,-0.5928421249541755,,, +21.8828125,43,-0.2443734169874945,0.22517565467893808,0.6748330002718875,0.9708282393383632,1.0233663928238017,0.8113294071905017,0.3881347066676236,-0.13285554308851485,-0.6093760401043518,-0.9092435061935841,-0.9466007912768356,-0.7054863448134051,-0.2442690076293749,0.3202678838794077,,, +21.890625,43,-0.20033624627941327,-0.06867208137288039,0.05363084611615865,0.1646987365908663,0.2628563439290835,0.34665608603744424,0.41490316841606223,0.4666762809582487,0.5013435057183959,0.5185731572391283,0.5183393657584698,0.5009223056708437,0.4669030653753112,0.4171532484740125,,, +21.8984375,43,0.35281948853963,0.2753031487273355,0.1862355618284831,0.08744924443999075,-0.01905441057830759,-0.13114039752014142,-0.2465776995379363,-0.36307857009446703,-0.4783388062220502,-0.5900783082753369,-0.6960812158481723,-0.7942349169569929,-0.8825672473085363,-0.9592812281771002,,, +21.90625,43,-1.0227867345069803,-1.071728538610051,-1.1050102382993825,-1.1218136503543439,1.248417726092297,1.4442029922603448,1.5769111365312038,1.6410963539417325,1.636111020434646,1.5661433525099735,1.4399177837363433,1.2700789688771643,1.0723023881619116,0.8641935893615993,,, +21.9140625,43,0.6640528443060513,0.4895913815897547,0.3566887338918744,0.2782778712260001,0.26343588039588484,0.31674361737522905,0.4379590028168385,0.6220267593142255,0.8594239276275366,1.1368170838338965,1.4379854431300785,1.7449454945020115,2.0391987566842444,2.3030156597346063,,, +21.921875,43,2.5206660369105585,2.679510434062803,2.7708761488356024,2.790656922877035,2.739594480200144,2.623222290091777,2.4514754864575568,2.237994154793474,-0.5097206724123428,-0.42837180866022173,-0.4982279739274751,-0.6988753937903286,-0.9891409616512444,-1.3135581978671345,,, +21.9296875,43,-1.6110607321226589,-1.8245489708065747,-1.909839603232272,-1.8426037234638024,-1.622212626491646,-1.2718919833318916,-0.8351600903760227,-0.3691046661734773,0.06445491394842673,0.40854369502062216,0.6198542777246867,0.675443024260841,0.5762566176538186,0.3469399352138891,,, +21.9375,43,0.031955389211216295,-0.31138161749604804,-0.621866156672824,-0.8439698699544659,-0.9365195574016664,-0.8791363741661494,-0.675432565644706,-0.35246772111873664,0.04345085468582421,0.4539696095791975,0.8177704359943389,1.080118096093456,1.2997491991470236,1.1361441134646937,,, +21.9453125,43,0.7700727236651166,0.3201759162632653,-0.0710934511884016,-0.2767200678393877,-0.22015298470872435,0.10349210298281177,0.6258681076128134,1.2239003188126092,1.7532895177326315,2.0878343939556823,2.153798308429554,1.9499036034805208,1.5474756612079106,1.070699193053085,,, +21.953125,43,0.6623997890079271,0.4447307345728024,0.4855412882989084,0.779645351307545,1.2501255525520758,1.7693164977455091,2.193717281241073,2.4032655775954206,2.3342100544174094,1.996572153516592,1.4714116726537252,0.8886455441967942,0.3914987840603874,0.09733009931420744,,, +21.9609375,43,-1.1216133296258315,-1.1041859594349837,-1.0696144487261274,-1.0182866641220771,-0.9508888189718956,-0.8683936350407987,-0.7720434840230291,-0.6633288039658427,-0.543962168427013,-0.4158484623161979,-0.2810516865384492,-0.14175897259541956,-0.00024243714903004335,0.14118045561135378,,, +21.96875,43,0.2801873298442694,0.4144914242228803,0.5418814988685859,0.6602604243668467,0.7676817772454503,0.8623838012155465,0.9428201395822838,1.0076868007754332,1.0559448849037167,1.0868386734534818,1.0999087654489652,1.09500003011603,1.0722642368565931,1.032157316535554,,, +21.9765625,43,0.975431302086144,0.9031210895992456,0.8165262517541106,0.7171882220775033,1.9991685797103576,1.7529930391325224,1.5178080812038388,1.3110189956129197,1.147879850340232,1.0404278919316408,0.996642621295857,1.0198881888699511,1.108677995417244,1.256777915482555,,, +21.984375,43,1.4536409464650362,1.6851429740779906,1.9345683463378285,2.183776527435699,2.414468474771932,2.609464427571861,2.7539039989375125,2.8362848804101546,2.849267721377605,2.7901910502660696,2.661260323378025,2.4693979106124546,2.2257644705092527,1.944985081427056,,, +21.9921875,43,1.6441340832407634,1.3415494091791946,1.055559076960261,0.8032086331703291,0.5990782777893926,0.4542721414857232,0.3756501830451259,0.3653562551044952,1.2013863274680046,1.1632346318293054,0.9714736466574866,0.6551727496252229,0.2621488171668048,-0.14846130725401052,,, +22.0,44,-0.5153878716400612,-0.7847440006623898,-0.9183882249090778,-0.8998314147569088,-0.7367682680174515,-0.4598392597319001,-0.11781610251508885,0.2300391635649988,0.5232510981681272,0.7095986222089197,0.7532986977870181,0.6406310047228663,0.38212726318699297,0.010983920888380572,,, +22.0078125,44,-0.4220548498782361,-0.8565471347078141,-1.231713853530268,-1.495852262000338,-1.6143364634559838,-1.574959094108129,-1.3897824653941182,-1.0932111114174108,-0.7365862175694929,-0.38014413250119894,-0.08359171288563294,0.10323332585996492,0.6606558898166177,1.0717086288916622,,, +22.015625,44,1.373052030679706,1.4515913905941136,1.2539889358238332,0.8014990345872461,0.18436995555044555,-0.4626555121345566,-0.9970281068030458,-1.3072158458438474,-1.34302521972974,-1.1291118788369294,-0.7579801145135392,-0.36439191743479454,-0.08820142910680928,-0.03580279138798581,,, +22.0234375,44,-0.25075934277892764,-0.7016656785968334,-1.2905709642474374,-1.8796565353800312,-2.328857718676809,-2.5341201633722865,-2.4558069000609457,-2.1294715498614485,-1.656045823802192,-1.1741311784581114,-0.8219890035134958,-0.6996468329729575,-0.8415060647995262,-1.2069583177814531,,, +22.03125,44,0.6068632495695971,0.4874915972993482,0.36116352432540666,0.2300826466304748,0.09652731864104937,-0.03718928844024921,-0.16875971243804722,-0.2959226205318992,-0.4165024163315035,-0.5284473401748162,-0.6298653955107002,-0.7190574722889522,-0.7945470873768998,-0.855106221247624,,, +22.0390625,44,-0.8997767985499928,-0.9278874364475138,-0.9390651674749986,-0.933241931665978,-0.9106557242916716,-0.8718463791389114,-0.8176460611867569,-0.7491646351862422,-0.6677701663683422,-0.5750648947493987,-0.4728571037611005,-0.3631293758236643,-0.24800379075582601,-0.1297046764364505,,, +22.046875,44,-0.010519564007958462,0.10724096865375944,0.22128386200930653,0.3293738381074246,0.4206752331407778,0.534229155603179,0.6944986823511625,0.8866334927171041,1.0934950955021592,1.296859316104312,1.4786945909132945,1.6224269126336457,1.7141032008661474,1.7433719552822011,,, +22.0546875,44,1.7042127900856745,1.5953639597008331,1.4204180456387634,1.1875791146834571,0.9090982652816212,0.6004269061223138,0.27914679448171154,-0.03624857069678972,-0.32763624026297594,-0.5785203889757549,-0.7751755634493526,-0.9075968973535626,-0.9701910477418196,-0.9621596862906908,,, +22.0625,44,-0.8875488179409184,-0.7549605018698425,-0.5769470909899723,-0.36913024461762345,-0.14910616084483794,0.06478661786734348,0.2547508897715232,0.4047764435088245,0.14816213300293402,0.04173946599457812,-0.20127248204366133,-0.544165574262835,-0.9339789017151224,-1.3097270322028118,,, +22.0703125,44,-1.6118818634324519,-1.7916313326314413,-1.8184729706006484,-1.6849596245011818,-1.4078582176947891,-1.0255410823791324,-0.5920161763607448,-0.16852598575278838,0.18597641554238176,0.4239908106956184,0.5168456197533656,0.4591373031821106,0.26954205343880205,-0.012126507120686079,,, +22.078125,44,-0.3311551813555725,-0.6264928478878408,-0.8403021898213393,-0.9270135592217288,-0.8604705656980379,-0.6380541884549081,-0.2811428102453854,0.1681637393840249,0.6535461531141971,1.1131811880628313,1.4893135727889957,1.7371936922582227,-2.4634710357981167,-2.5188876556736424,,, +22.0859375,44,-2.2935937927902668,-1.8341199129908057,-1.2494563621409696,-0.6813739524179261,-0.26577211301262804,-0.09564600073348684,-0.19582017045407374,-0.5163714756585229,-0.9465416627468729,-1.345324482691864,-1.580342148862051,-1.5643541186962842,-1.279390115668226,-0.7818911816148247,,, +22.09375,44,-0.18744774687868568,0.3606843622740095,0.7306629742498579,0.8380249771478981,0.6686825943329213,0.28264934439287265,-0.20252424991474666,-0.6440643661112015,-0.9131799062723079,-0.9304149632108852,-0.6874581951484001,-0.2494315347216949,0.2629691064271086,0.7065863054129783,,, +22.1015625,44,0.4293726569563566,0.5192766785661962,0.5972520728865528,0.6616670610451836,0.7111206232672763,0.7444671707299828,0.7608367492658258,0.7596504210688708,0.7406305549856929,0.7038058451217922,0.6495109697983269,0.5783808967387182,0.4913399341069525,0.3895857190145629,,, +22.109375,44,0.2745684237623408,0.14796554380726212,0.011652708817048996,-0.13232897219745846,-0.2818084599974395,-0.43452260611749466,-0.5881555836307607,-0.740379237352828,-0.8888936470719653,-1.031467193664919,-1.1659754266532314,-1.2904380527612005,-1.4030533979212312,-1.5022297394242596,,, +22.1171875,44,-1.5866129597165302,-1.655110037746336,-1.7069079666617846,-1.741487766733869,0.5017607993163157,0.5364268796341689,0.5039736084652877,0.4044140632906576,0.2425775920481397,0.027775741227679784,-0.22684471456495506,-0.5052165310232072,-0.7894707554785838,-1.0611814795060122,,, +22.125,44,-1.3026497845802636,-1.4981373486572132,-1.6349636910485836,-1.7043905410613684,-1.7022316595745164,-1.629145586952501,-1.4905909004130922,-1.2964470974498252,-1.060327538051228,-0.7986323513971235,-0.529407345004855,-0.27108848161778176,-0.04121946808400912,0.1447681252794203,,, +22.1328125,44,0.27462715749314714,0.3401448570450023,0.3377111504987905,0.2685657590757008,0.1387068438502449,-0.04153241790194684,-0.2582097858860348,-0.4947518032881768,1.8319892507672129,1.7725946783374087,1.5817452392682934,1.302418362522363,0.9910829957236782,0.7088487173441104,,, +22.140625,44,0.5118934597303796,0.4426610487492274,0.5231998543050195,0.7516803468474116,1.1026342124403692,1.5308780141766918,1.978510486572124,2.383893800288312,2.691220104891669,2.8591734804415774,2.8673383058993114,2.7193560413466003,2.4423388535701744,2.0826315111987204,,, +22.1484375,44,1.6985817316297036,1.351445090755378,1.0958411373152193,0.9712472348571562,0.9958550016427634,1.1637462106686658,1.4458279676568646,1.7943814368517952,2.150515535068772,2.4533645305168865,2.6495968413263222,2.70175383918403,0.6396853900266484,0.1433966948631013,,, +22.15625,44,-0.4310427510436043,-0.9395223778799376,-1.2572907904758437,-1.3129654236120611,-1.1079031259692116,-0.7156246197258986,-0.26145251561370864,0.11205448534312347,0.284395671224592,0.19037922480936487,-0.16178527006062804,-0.6925134876805448,-1.2724388753251652,-1.757655263467066,,, +22.1640625,44,-2.028952673525157,-2.024294934677122,-1.7556398452231416,-1.3054937418369603,-0.8041464034463339,-0.3938270145398951,-0.18960630150996186,-0.24776156323788634,-0.5502757822108213,-1.009719946366801,-1.4931810892523387,-1.858678494250828,-1.9940876717993523,-1.847904205326452,,, +22.171875,44,-1.7586333482701684,-1.7584350694596012,-1.7412879269801236,-1.7078844111842089,-1.6592021510982442,-1.5964865657047531,-1.5212288254145268,-1.4351395097590065,-1.3401184226853036,-1.238221094123897,-1.1316225545189391,-1.0225790167604132,-0.913388136605924,-0.8063485475580572,,, +22.1796875,44,-0.7037193788798847,-0.6076804657194353,-0.5202939481952873,-0.4434679319805641,-0.3789228468145008,-0.3281610921409772,-0.29244050150901035,-0.2727520905049823,-0.2698024779828798,-0.284001288525205,-0.3154537568493545,-0.36395866378505226,-0.4290116400942755,-0.509813780409114,,, +22.1875,44,-0.6052854165884791,-0.7140848094461546,-0.8346314316842809,-0.965133434475286,-0.7331153345508791,-0.9550517825284722,-1.1433858125058651,-1.283219398566591,-1.3629772149012234,-1.3752204578410878,-1.3171723321507636,-1.1909185414136436,-1.0032687851088973,-0.7652889038659828,,, +22.1953125,44,-0.4915362809788577,-0.19905180102339973,0.09382135758493038,0.3687097439072928,0.6084837847061151,0.7984452301330401,0.9273451075311084,0.9881612150720828,0.978580954862258,0.9011558525372484,0.7631170044865077,0.5758643381545597,0.3541653166105748,0.1151189795855049,,, +22.203125,44,-0.123042423364084,-0.3422306271181305,-0.5257682958048634,-0.6595573564875129,-0.7330672370615694,-0.7400740828752169,-0.6790993922239924,-0.5535174719465252,2.5941196785447462,2.335207710784422,1.9564760114126152,1.5074718690656186,1.0481612792056532,0.6396379232031103,,, +22.2109375,44,0.3346585057837801,0.16947835937464728,0.15825869175919138,0.2909162991676253,0.534750378947516,0.8395927684236273,1.1456791414861944,1.3930148895694374,1.5307766088884895,1.5252845715735617,1.3653041383463638,1.0638501064614363,0.6562126790447858,0.19451225190445925,,, +22.21875,44,-0.2603691221611765,-0.6482231249207591,-0.9188480468748428,-1.0398257255475856,-1.0015314606267562,-0.8185967819912582,-0.5275974174073632,-0.1813267346522543,0.1594532547158699,0.4354983783275054,0.5983285952871046,0.6177938512049506,-0.2700606290234228,0.22188907232729935,,, +22.2265625,44,0.4939449254310308,0.4986564335573118,0.2634589939701463,-0.1170352738629834,-0.5071715541999438,-0.7676468757035197,-0.7939145473884436,-0.545070994689318,-0.05530591361981296,0.5752245242832121,1.207602196254877,1.701975516024456,1.955646406703264,1.9309794147184007,,, +22.234375,44,1.6654860236916709,1.2613224078719951,0.8570809422577494,0.5896084375610766,0.556317327573441,0.7883208009948938,1.2417562045962411,1.8096760249271748,2.3512486274203583,2.7302666639140587,2.8524099154560147,2.6910505105142293,2.294528445980609,1.7729035650789848,,, +22.2421875,44,-1.1036188168692456,-1.2479697523810327,-1.3959594718131636,-1.5452910566175968,-1.6936374636454228,-1.838682080559288,-1.9781591019081992,-2.109893018984244,-2.231836532107283,-2.342106221604144,-2.4390153529833283,-2.5211032419993447,-2.5871606655194777,-2.636250873350609,,, +22.25,44,-2.6677258332064047,-2.681237424456942,-2.6767433847533715,-2.6545079054879905,-2.6150968657506386,-2.5593677883169916,-2.488454693621469,-2.4037481169965766,-2.3068706391527862,-2.1996483584314235,-2.0840788044178082,-1.9622958548178795,-1.836532269959127,-1.709080501001177,,, +22.2578125,44,-1.582252458159009,-1.4583389434484086,-1.3395694583427524,-1.2280730901479888,-0.3713242092149488,-0.144583273758925,0.1114116407475894,0.3792001252174164,0.6403697736497456,0.8768376125888186,1.0721088898405278,1.212425448749196,1.2877236131195766,1.2923347904930536,,, +22.265625,44,1.2253799417408346,1.0908304118051717,0.8972308812836968,0.6571037591214102,0.3860765499620379,0.10179304675715553,-0.17731572707048304,-0.43331512229881375,-0.6500155089103028,-0.8140988935813495,-0.9160449519626008,-0.950791906311366,-0.9180861698625641,-0.8224963833844599,,, +22.2734375,44,-0.6730908730992868,-0.4828010305798161,-0.26751501758310114,-0.04496500477630075,0.16651444849846234,0.34927027989616466,0.4875675337266305,0.5686924492973894,0.4867810066502516,0.2223286632400957,-0.13702377866923715,-0.5372399374251782,-0.9172080003955212,-1.2182682693163558,,, +22.28125,44,-1.393362677526505,-1.4143811153926529,-1.2765602368066644,-0.9992494917635076,-0.6229249348053556,-0.20291576964052094,0.1991794184638756,0.5250499640456319,0.7287155605765407,0.7836456482597546,0.6868471000420662,0.4592837709586299,0.14256281832289086,-0.2075958201730798,,, +22.2890625,44,-0.5300893552109962,-0.7680014703575232,-0.8775202857616899,-0.8348156536043609,-0.6398043205330473,-0.3162162227197716,0.09204870189577792,0.5277060257903202,0.9289580726362608,1.2390694223171952,1.415155516172853,1.4348157540629496,0.8010527276590929,0.9516437793741328,,, +22.296875,44,1.3127311365209633,1.7716103306094582,2.186658603596741,2.4263143657130484,2.405314571015456,2.1082567504003182,1.5940262496487159,0.9798733865827411,0.4095024990395003,0.013916645856475562,-0.12425286997657592,0.006841896387516422,0.3452529850722638,0.7724465311412496,,, +22.3046875,44,1.1460164363061598,1.338933795136366,1.2745729711235467,0.9479127970608124,0.4271004610527544,-0.16505224188605794,-0.6845705405178875,-1.00563582850254,-1.0549473756983638,-0.8317101771298601,-0.4077717664894405,0.09212879911057836,0.5245861190045664,0.7668473993935293,,, +22.3125,44,-1.1258411620259583,-1.0346923007032802,-0.956240533567376,-0.8918669738091727,-0.8426955894322298,-0.8095734804469997,-0.7930560096213826,-0.7933970471720599,-0.8105445002332445,-0.8441412053989439,-0.8935311687259732,-0.9577710439466668,-1.035646647918426,-1.1256942241269121,,, +22.3203125,44,-1.2262260819268112,-1.3353601625736735,-1.4510530143435576,-1.5711355993423948,-1.6933513050124218,-1.8153954947502795,-1.9349559050838725,-2.049753182036894,-2.1575808468694766,-2.2563439913636616,-2.344096025079241,-2.4190728310977265,-2.4797237321547843,-2.524738724906773,,, +22.328125,44,-2.5530715054145974,-2.5639578826283933,-2.5569292574012983,-2.5318209309648294,0.5838450929274778,0.5287592738994226,0.4040065014752492,0.21496277246961812,-0.028559509662495212,-0.3129888322080079,-0.6219338727424668,-0.9373193166182656,-1.2406390046097848,-1.514239041406685,,, +22.3359375,44,-1.7425414065499756,-1.913122758546988,-2.0175732208641795,-2.05207528113587,-2.0176624523888167,-1.9201396762811327,-1.769671036139791,-1.580063547044928,-1.367796983622234,-1.150867415632979,-0.9475251120259592,-0.7749948399010247,-0.6482678122258538,-0.579049541559791,,, +22.34375,44,-0.5749369848573956,-0.6388823748737483,-0.7689811417021516,-0.9585987277034816,-1.196827466483996,-1.4692416796701866,-1.7588983489984806,-2.04751359592792,1.2995781970315334,1.0346195876863624,0.6848045271457825,0.3076609447944782,-0.03561382886548403,-0.2897153476219573,,, +22.3515625,44,-0.41387314628721616,-0.3882245992931358,-0.2169286441885535,0.07246572473686314,0.4332979286373404,0.8070549238136902,1.1324803786221245,1.355115140340858,1.4357830280982682,1.3567002379577366,1.1242567601487123,0.7680365392228676,0.3362289228784203,-0.11185399926556887,,, +22.359375,44,-0.5149888126084536,-0.8195463523028871,-0.9878110398631036,-1.0038183663850146,-0.8758014858544825,-0.6348660470309803,-0.3300998791458315,-0.02087945087290716,0.2324283478836752,0.3779206033994913,0.38029612083000697,0.2264087453149667,0.03164013516758732,-0.4674547792132259,,, +22.3671875,44,-0.8744647219521418,-1.0699506263390337,-0.9907676580308726,-0.647518673968321,-0.12181145726789222,0.4559301428715976,0.9420215794347888,1.2186966559072918,1.2261743848498048,0.9788271071144301,0.5610207530484884,0.10376942723860694,-0.25139525885686465,-0.3914356233135133,,, +22.375,44,-0.26300611890827186,0.11271428613363665,0.6456227092873726,1.2011929537903014,1.6371631104362359,1.8423569633047028,1.7670010643017555,1.4362299822679874,0.9430796941386452,0.42289060258741795,0.01613654934106024,-0.1701319075140676,-0.09166209093481216,0.22085943774474626,,, +22.3828125,44,-2.488775097328893,-2.4282384671526422,-2.350954564629664,-2.257950832205452,-2.1505207688560044,-2.030201414613324,-1.8987465755153883,-1.7580962577280304,-1.6103428459727398,-1.4576946183920416,-1.302437236619088,-1.146893885279996,-0.9933847587856948,-0.8441866047140834,,, +22.390625,44,-0.7014930320798135,-0.5673762793937669,-0.44375111186053096,-0.3323414797625153,-0.23465052174541925,-0.15193443813872365,-0.08518069168032671,-0.03509091724480495,-0.002068839709374437,0.013786588593113323,0.012682710787286002,-0.004870677816216307,-0.03807047176330847,-0.08583453607486335,,, +22.3984375,44,-0.14682087526724774,-0.21945135500394966,-0.3019395608914766,-0.3923223064845385,-2.3167329407719217,-2.5494067731544914,-2.730782101577193,-2.8495274872958207,-2.8985196996165468,-2.8753372449178323,-2.78242636159009,-2.6269279123269267,-2.420177251127797,-2.176911946104356,,, +22.40625,44,-1.9142426105198929,-1.650458612916292,-1.4037519507437963,-1.190948277833188,-1.026333576346405,-0.9206582934204048,-0.8803883867213511,-0.9072555045357329,-0.9981376656165076,-1.1452787563702511,-1.3368315353554214,-1.5576862750509228,-1.7905272516833275,-2.0170434045309253,,, +22.4140625,44,-2.2192087346356257,-2.380543148951248,-2.4872658188087104,-2.5292606162049878,-2.500786295111844,-2.400881884083514,-2.233439009669436,-2.006936095496281,-0.072628975538099,-0.4831197283464696,-0.9539725339340992,-1.4246027610662657,-1.8343108783343447,-2.1316794473731377,,, +22.421875,44,-2.282525017908001,-2.2751666637866044,-2.1221908419571864,-1.8584379665526132,-1.5355245706110143,-1.213754519630478,-0.9526793999274284,-0.801778591413529,-0.7927108802414622,-0.93434467721597,-1.2113411103898253,-1.5865108653370583,-2.0065778485336265,-2.4104521007626927,,, +22.4296875,44,-2.7387235399494503,-2.9428979429236084,-2.9929367034003107,-2.881926078949132,-2.627148716241652,-2.26739058706188,-1.8569028010805413,-1.4569587608534933,-1.12632164155649,-0.9121068797937588,-0.8424628104636257,-0.9222093843577176,1.4290570654767896,1.4959735724990628,,, +22.4375,44,1.2812898312843464,0.8213412450350588,0.21782359928241346,-0.3899234453822152,-0.8629330170721924,-1.100510130419701,-1.0676278608368337,-0.8043139022759109,-0.4144568230687493,-0.03710187238656315,0.19189464487872687,0.17734092218705522,-0.10895794620718048,-0.6202298101713165,,, +22.4453125,44,-1.2473141093690896,-1.848344042195941,-2.2873993768954315,-2.471538379437374,-2.3760614887512364,-2.0510845971848393,-1.6076221555341672,-1.1869959331242046,-0.9219550550369828,-0.9001644692371172,-1.1400697091894256,-1.5857536642230476,-2.122195739576427,-2.6067519071952403,,, +22.453125,44,-0.4884942386763649,-0.5882449344044175,-0.6892978389827839,-0.7893503641254838,-0.8861144434105348,-0.9773568349368456,-1.0609384653389409,-1.1348521261168223,-1.1972578620877052,-1.2465154321715557,-1.2812132739946365,-1.300193465003057,-1.3025722428845836,-1.2877557258509822,,, +22.4609375,44,-1.2554505573832568,-1.2056692889152854,-1.138730406068513,-1.0552529978424798,-0.956146161965268,-0.8425933317837278,-0.7160317989877804,-0.5781277905931969,-0.4307475364473585,-0.2759248337269766,-0.1158256762450135,0.047289432237237916,0.211104820926488,0.37328996238417417,,, +22.46875,44,0.5315400446847162,0.6836160950510181,0.8273839525441422,0.9608514075173114,-1.7338529597592398,-1.4298066201390711,-1.1124685557103668,-0.8003389145917945,-0.5114631312644394,-0.26218043296296456,-0.06599149044782326,0.06737584024311838,0.13263755230893148,0.12931452192980264,,, +22.4765625,44,0.061758381818367784,-0.06115955285217456,-0.22667459695044626,-0.4190265544129097,-0.6205664959659731,-0.8129952591075722,-0.9786472884528308,-1.1017302728454068,-1.1694341181199637,-1.1728319061259225,-1.107509996229057,-0.9738833134173774,-0.777173820296382,-0.5270536577555562,,, +22.484375,44,-0.2369778231074925,0.07674709566044358,0.3960932048556553,0.7025618059792365,0.9784669257972812,1.2081623851149086,1.3791268525480445,1.4828312321829025,-1.1321141428146064,-1.431918084724701,-1.7666399772937704,-2.075177009509751,-2.299862003077978,-2.3954883909975013,,, +22.4921875,44,-2.3363970572946533,-2.1205209932034985,-1.7697575488974022,-1.3266100451323035,-0.8476215662789901,-0.3946233824855866,-0.02516082480374371,0.21641245238001394,0.3057849961249788,0.2424161541996661,0.04956229345393137,-0.2294031532395193,-0.5378023483136453,-0.8145370236512934,,, +22.5,45,-1.0036597592151884,-1.0631415130363573,-0.971469545389468,-0.7310478168483011,-0.3678699820628116,0.07248432412070058,0.5319065318649988,0.9487705497975818,1.2674951651451891,1.4471682135307589,1.4678894184686282,1.3338441117202409,-2.6971968211815898,-2.232025051178591,,, +22.5078125,45,-1.6655897129959547,-1.1413753010938839,-0.7888725875725661,-0.6882208224557519,-0.8483941447517194,-1.2049092708567133,-1.6376811766508803,-2.0041313894089368,-2.1784730987434178,-2.08640430726171,-1.7256986699314014,-1.1670486196048118,-0.5349275791356797,0.026285804000346302,,, +22.515625,45,0.3916392406044089,0.4896167576476531,0.3215080596455051,-0.03916917627458921,-0.4670337148112357,-0.819408670681858,-0.9756170455536696,-0.8702334465371304,-0.5111771030614001,0.022314006572311033,0.6012739612082777,1.0822483426964753,1.3465251621169383,1.3326059692848915,,, +22.5234375,45,1.0822028576541252,1.1898308738929746,1.2823641236383474,1.3586911624556637,1.4179796777735918,1.4596908477599038,1.483588564066159,1.4897433570662422,1.4785309549750776,1.4506255021882128,1.4069875557009677,1.3488470698971022,1.2776816677522262,1.1951905790234916,,, +22.53125,45,1.1032647018718291,1.003953312236384,0.8994280039747041,0.7919444912765866,0.6838029422757527,0.5773075385125409,0.47472596844659204,0.3782495643706577,0.28995478081558823,0.21176668903134988,0.1454251268381923,0.09245409663630244,0.054134947485810166,0.03148381091105512,,, +22.5390625,45,0.02523368559057271,0.03582148469711921,0.06338027274884828,0.1077368279639529,1.5153279120268035,1.4775207950906968,1.375097294371555,1.218127044695378,1.0203553246062809,0.7982404696411961,0.5698024099076514,0.3533626350729298,0.1662634602090487,0.02365590862032163,,, +22.546875,45,-0.06255925789402728,-0.0845635111337576,-0.0391675108021532,0.07196510310659165,0.2424326880530563,0.4615413306975229,0.7150502511646293,0.9861649003875472,1.2567084978625302,1.5083903130783174,1.7240822468321473,1.8890146890502657,1.991808258015353,2.025269469638564,,, +22.5546875,45,1.9868948465105405,1.8790483071273665,1.7087994581310555,1.4874340579832517,1.2296707802792637,0.9526388848803452,0.6746880770113355,0.4141135358751302,1.0726292093788916,0.7309365300275341,0.3672658844934378,0.042802975050281744,-0.18811703822879175,-0.28647493264710644,,, +22.5625,45,-0.2346432492298645,-0.03912622883432937,0.2704628599642552,0.6460276524563464,1.028497283061886,1.357048038513181,1.578601626001092,1.6561205103423386,1.5744081190694326,1.3425103271159813,0.9923439851535844,0.5737658982061088,0.14685006564172004,-0.22742419137439435,,, +22.5703125,45,-0.4966230879852439,-0.6249764551048033,-0.5988988724687911,-0.4290541833599201,-0.1486421119330114,0.1918258636251681,0.5324474085949424,0.8133129882542917,0.9838904390222838,1.0109484685170778,0.8837846709861339,0.6159434846997489,0.07703635195208575,-0.3456118071659942,,, +22.578125,45,-0.5613913306533271,-0.5134070276262231,-0.21906461822690126,0.2348076748377805,0.7158828663499748,1.08274624539995,1.2238131186225505,1.0880855073218958,0.6993166091965876,0.14969915030289976,-0.4251944618267509,-0.8833540384676739,-1.1150329690723273,-1.072604276650463,,, +22.5859375,45,-0.7833908648869605,-0.341955722321628,0.11603275521406105,0.4511954888734213,0.5588466646753077,0.3978795557889396,0.0022155927491075427,-0.5283229467491506,-1.055216764269573,-1.439075648818653,-1.5777212299283645,-1.4340902335548074,-1.0463118157097786,-0.5171979117298805,,, +22.59375,45,0.16841457285688355,0.24464182181616245,0.3353652012985649,0.4392680077000369,0.5547931815042674,0.6801704954688573,0.8134474808299634,0.9525235500392896,1.095186718579317,1.2391522828908073,1.3821027771825531,1.52172850951314,1.6557679673721653,1.7820473852794358,,, +22.6015625,45,1.8985187815899884,2.003295798485719,2.0946867176113244,2.1712240732491117,2.231690344509333,2.275139276663848,2.3009124582780704,2.3086508638696777,2.2983011599663463,2.270116664128223,2.2246529401214667,2.162758106349835,2.085558027214084,1.9944366466697048,,, +22.609375,45,1.8910118083081482,1.7771069853121848,1.6547194152590297,1.5259851976790806,0.18788500922357687,0.010468586151458292,-0.10717670290847092,-0.15835750183725816,-0.1411070730782249,-0.05831644148704629,0.08247339272150067,0.269603667296497,0.4881173692440868,0.7208088812499261,,, +22.6171875,45,0.9494305520094076,1.1559720361905492,1.3239231750358162,1.4394323361868755,1.4922794211136094,1.4765956722191382,1.3912800680847202,1.2400832531369153,1.0313531319060498,0.7774598512764224,0.4939402515173759,0.198421429306451,-0.09060154063917823,-0.3550485085432957,,, +22.625,45,-0.578508332604777,-0.7473767069424049,-0.8517984058686452,-0.886348254201985,-0.8504033524305992,-0.7481806148956653,-0.5884370175019802,-0.3838534713135086,0.24315623355303456,-0.1821761674888032,-0.5990987566614698,-0.9475525319843292,-1.1776872720606388,-1.2575868779713402,,, +22.6328125,45,-1.1782041877304232,-0.9547368393839614,-0.6242300684838465,-0.23977998378010976,0.13775965921033073,0.4492753421302835,0.6466168679271158,0.7001090090930703,0.6031816692297742,0.3733973344174838,0.04971575279116286,-0.3135781267759801,-0.6553371899486496,-0.9170879714769928,,, +22.640625,45,-1.0521539424732504,-1.0329451966237386,-0.8552790344078083,-0.5390583779716415,-0.1252022172864496,0.3306939643343773,0.7669805319694435,1.1255160184419457,1.3606802409750287,1.4464345908439455,1.3803300484509446,1.1838388965708613,0.5716645377675081,0.468184564883027,,, +22.6484375,45,0.14230722190897782,-0.29978308196362763,-0.7180195768650075,-0.976955455880976,-0.9830194045208692,-0.7103125529299499,-0.20787534940648505,0.4135687661358924,1.0117613615771317,1.4516877868453155,1.642360502037565,1.5615277265400236,1.2615375614087674,0.8547525156358162,,, +22.65625,45,0.4825140271924066,0.2761650424374391,0.32081536533626864,0.6317827571220459,1.1501686845651922,1.758783323012397,2.314057222365548,2.685195483486185,2.7898452242972147,2.6165025877285104,2.2275196924686123,1.7418887423120422,1.3025228129914328,1.037001649273462,,, +22.6640625,45,1.393141965470449,1.2584897837405429,1.1243509606797308,0.9930294741294377,0.8667707242160033,0.7477223167265761,0.6378965638421219,0.5391353587696391,0.4530780392539908,0.3811328025977431,0.3244521726423049,0.2839129482026811,0.2601009839773805,0.2533010703390501,,, +22.671875,45,0.2634920891219772,0.29034753014376313,0.3332413593257916,0.3912591355707744,0.4632141816451284,0.5476685258205397,0.6429582474871693,0.7472227828372058,0.8584376773764029,0.9744502116586682,1.093017276338342,1.2118448332360519,1.328628271347391,1.441092951051767,,, +22.6796875,45,1.54703422647443,1.6443562451034592,1.7311088451590901,1.805521904526926,-0.1501452996506787,0.0950386394320722,0.3333514055611643,0.5470318398750001,0.7201473015697823,0.8397086070207568,0.8965794137535357,0.8861166262479686,0.8084971579773372,0.668708256204647,,, +22.6875,45,0.4762020576446378,0.24423845812395634,-0.011037884996601743,-0.27172205829282103,-0.5193964937337411,-0.7364146695007187,-0.9071313954183451,-1.0189938922451158,-1.0634175805200172,-1.0363855067412209,-0.9387296054521438,-0.7760741815945359,-0.5584455511156219,-0.2995750568646193,,, +22.6953125,45,-0.015944057908808956,0.2743625173592177,0.5529141152832515,0.8022162848481518,1.0069268183054811,1.1549215077678698,1.2381352084509147,1.2531195685295062,0.8989587190936925,0.5816178936830163,0.2929099794619056,0.0895225690105711,0.014851646068845146,0.0921857233967025,,, +22.703125,45,0.32102165881350153,0.6770862732201689,1.1160606959161368,1.5804276413816016,2.0083754053286866,2.343372018099465,2.5429186066672838,2.5851188513330525,2.472041568843954,2.2293529306383366,1.9022758371481898,1.5485060208845367,1.2291884424004955,0.9993596475862352,,, +22.7109375,45,0.8993449178051321,0.9484503132056814,1.1419322497774589,1.4517167388154046,1.8307563683450525,2.2203464886296755,2.55926113181752,2.793285741879248,2.883661964701959,2.8131291794731728,2.588621751589121,2.2402018552944365,1.6962642543353663,2.1948386448481934,,, +22.71875,45,2.6172544008049825,2.838425696639095,2.785795012274884,2.459312291147873,1.9315627370294899,1.3280071958547024,0.7927494334805271,0.4492110959225181,0.36649063497993495,0.5406245368109232,0.8958847914609032,1.305755099973302,1.6278348728558978,1.7431028108953912,,, +22.7265625,45,1.5887769745061582,1.1757632234755504,0.5859077593271835,-0.05019540296183106,-0.5887618717408474,-0.9119960966646924,-0.9601565548879274,-0.7477207521943009,-0.3592215485087816,0.0741023207552916,0.4104405366560443,0.5364255259033688,0.3983328810307231,0.01691565673477724,,, +22.734375,45,1.8660365396869183,1.9113326082210065,1.940352033212919,1.9523175410028009,1.9467464840748676,1.9234595069120493,1.8825839029516065,1.8245516037314535,1.7500918353075958,1.6602185703974832,1.5562129958276003,1.4396013021521583,1.312128184205796,1.1757265164656452,,, +22.7421875,45,1.0324837340700526,0.8846055080232007,0.734377350504134,0.5841248224240485,0.4361730398682448,0.2928061883250996,0.1562277534681098,0.028522164720846118,-0.08838147692095655,-0.19274295181274206,-0.2830411679569599,-0.3580005711954104,-0.416613256985105,-0.4581563967206808,,, +22.75,45,-0.4822046735959316,-0.4886375103864093,-0.4776409627250918,-0.4497042448486212,1.2012785439689957,1.088765286408527,0.9260476063205534,0.7271723255525473,0.508779831316722,0.2889375634608078,0.08587379372166465,-0.08329999094244322,-0.2037889937154236,-0.2641536134327217,,, +22.7578125,45,-0.25711411624623204,-0.1800653451050198,-0.035265558415287335,0.17031378700661748,0.4254668503487188,0.7155274462890757,1.0233843503878075,1.3306670871081556,1.6190195289176377,1.8713725116067936,2.073126739539745,2.2131635102359466,2.2846127943128693,2.2853251270249366,,, +22.765625,45,2.218014421628432,2.090061762237517,1.912993874558781,1.7016726583308812,1.4732523135527442,1.245976798634013,1.0379014923534238,0.8656282165948787,1.816394023314716,1.3766480102240175,0.9821038164923768,0.6860971480135651,0.5258839955583224,0.5168731160176693,,, +22.7734375,45,0.6502645610162144,0.8944618721633304,1.2000377782793343,1.507479738844813,1.75650868898447,1.8955192948134296,1.889671091330038,1.72636999777622,1.4172861597779502,0.996593546340348,0.5157052061855752,0.035323903781589894,-0.3839540030146509,-0.691018242163855,,, +22.78125,45,-0.8521472222295822,-0.8562029627584268,-0.7163095093965202,-0.4677536932915231,-0.16243547730980482,0.13926745661582718,0.37795348872937895,0.5044964890869708,0.4877422229977131,0.31940275822031416,0.015386338437292313,-0.38664460197222505,-1.5057373955758035,-1.7058633873276785,,, +22.7890625,45,-1.6241912417332518,-1.2864747965095136,-0.7863755508121227,-0.25985740715514183,0.15199153718644676,0.34152159942118343,0.26390073352459265,-0.050740356246684604,-0.5057244170405524,-0.964496980965278,-1.288237875719323,-1.3741049149573827,-1.1836264062041666,-0.7534589419460491,,, +22.796875,45,-0.18556001910243414,0.38053323810847933,0.8057238251007901,0.9892551537036534,0.8961067048977276,0.5663788197205998,0.10409659613445604,-0.3514966052288045,-0.6642865594904662,-0.7387648169509458,-0.5463616921213015,-0.13341698947580627,0.3913974491592455,0.8867574862746048,,, +22.8046875,45,-0.4056109487772401,-0.3464251108064443,-0.2734723694122145,-0.188316544617385,-0.09273204904028463,0.011327386175617736,0.12176312281963655,0.23636856179795065,0.3528679770022166,0.4689565567619681,0.5823409516500501,0.6907796185328526,0.7921222543339516,0.8843476289203497,,, +22.8125,45,0.9655991545474976,1.034217568945392,1.0887701596585324,1.1280760178238405,1.1512268790954967,1.1576031866949341,1.1468850952308138,1.1190582225187242,1.0744140485977267,1.01354495486836,0.9373339901344366,0.8469395426590847,0.7437751865492263,0.6294850552795924,,, +22.8203125,45,0.5059151734877136,0.3750812489531593,0.2391334886447386,0.10031905484469,0.7431418446421697,0.6808296354504413,0.6847516916976423,0.7562134272004376,0.8916698686091921,1.08296847581894,1.3179135588996709,1.5811129427301107,1.8550478478029566,2.1212913893613403,,, +22.828125,45,2.36179073269602,2.560123502701438,2.7026408403713384,2.77941740259722,2.784942063284769,2.718501154735783,2.5842275275531765,2.3908120100533927,2.1508973892892937,1.8801971737477885,1.5964005887813717,1.3179401616945357,1.062707834627049,0.8468091318720089,,, +22.8359375,45,0.6834422538104853,0.5819802572785376,0.5473203195526519,0.5795454577472147,0.6739222861458486,0.8212349602356419,1.0084320121145858,1.2195409623096625,-0.8331071033719869,-1.2628145585014598,-1.6164815425926935,-1.8459362874370684,-1.921606007253216,-1.8371092765424024,,, +22.84375,45,-1.6102402315096285,-1.2801913383201522,-0.9014473135128986,-0.5353012464153271,-0.24031430694336275,-0.06320494340088989,-0.03158655894275675,-0.1496847247525832,-0.3977008896296496,-0.7349215653692869,-1.106088571143424,-1.4500379750960826,-1.7092619928574737,-1.8389043312155569,,, +22.8515625,45,-1.8137876940643851,-1.632378654932782,-1.3170721089268964,-0.9107507503360472,-0.4701551963154824,-0.05709712689832103,0.2711162343045742,0.4705551425044126,0.5174561231846309,0.4118694315432626,0.17759735943733224,-0.14156671059913153,1.0832035589281517,0.6452856481200341,,, +22.859375,45,0.08880940025052991,-0.4441682720321233,-0.8201572367683503,-0.9507512623112137,-0.8167678626813937,-0.4733956326387138,-0.034939304010315815,0.3566554111651308,0.5708694803031655,0.5245619659989174,0.2049503743535772,-0.3266800380978053,-0.9515564734736436,-1.525746142461103,,, +22.8671875,45,-1.9193731858141083,-2.051978888877214,-1.9143361594645616,-1.5707417407723172,-1.1411600994423412,-0.7681149615536692,-0.5774046430171467,-0.6434099757391291,-0.9685048616704792,-1.4822142849913904,-2.0603523149629472,-2.5588965877018603,-2.853316784935223,-2.8725796934042367,,, +22.875,45,-0.03905718132411981,-0.17667290182734602,-0.3102289141705489,-0.4374893240156553,-0.5563206045863206,-0.6647288788101603,-0.7608947614367708,-0.8432051510846681,-0.9102814155870056,-0.9610034771425316,-0.9945293755774156,-1.010309967196361,-1.0080985018718558,-0.9879549107031416,,, +22.8828125,45,-0.9502447291864582,-0.8956326747699072,-0.8250709912620077,-0.7397827641960882,-0.6412404993012177,-0.5311403391760917,-0.41137236963073626,-0.2839875356255174,-0.15116174610798927,-0.015157796252808197,0.12171422616196452,0.2571373569773677,0.3888282868100831,0.5145772974596479,,, +22.890625,45,0.6322869043163618,0.7400085281647109,0.8359765542949708,0.9186391825858512,1.4367869194463243,1.641837153818283,1.817084845678136,1.946882476692364,2.0186388439189704,2.023703185145163,1.957974749275508,1.8221952905390368,1.6219040755349692,1.3670585257392855,,, +22.8984375,45,1.0713469339863395,0.7512411657141607,0.4248553871304779,0.11069038847695034,-0.17364895184709805,-0.4126736438151939,-0.5940829471226811,-0.7096143553299115,-0.7556119479823566,-0.7332734950302466,-0.6485590995426945,-0.5117677667044769,-0.3368114435993914,-0.14023717050743667,,, +22.90625,45,0.05993445068835108,0.24547345676934176,0.3992192187017592,0.5062844484185507,0.5551005414585146,0.538231344506909,0.4528985857178242,0.30118231275122553,-0.4887124280219529,-0.8027288067281041,-1.0278737199343002,-1.1225057825919091,-1.0656183164136586,-0.8601574385713483,,, +22.9140625,45,-0.5326072149867259,-0.12890625493004734,0.2926684663077308,0.6705423858433014,0.9494007801462271,1.088774401217342,1.0693162272984236,0.8957918367058019,0.5963177653398264,0.21796658552593096,-0.18057667364415372,-0.5381628954451709,-0.8007070802232167,-0.9296122912441716,,, +22.921875,45,-0.9077772623564832,-0.7422519665952686,-0.4631275635287566,-0.1188336792729114,0.2314244295852361,0.5269107786712863,0.7148455653610144,0.7586563126103045,0.6437079332955521,0.3796190552596549,-0.0011963614210574458,-0.4485351683671962,-1.6386991244024864,-1.182294696487293,,, +22.9296875,45,-0.9173666704327432,-0.9100498396028652,-1.1531534745606842,-1.5681832412960208,-2.0269275423063204,-2.3866914796848624,-2.529521039359344,-2.394666306809901,-1.9953853235832184,-1.4154817856418191,-0.7865239742212791,-0.25198686204996723,0.07185682384557512,0.12757989848747994,,, +22.9375,45,-0.06789210885801156,-0.4281578880611552,-0.8212626414304015,-1.1061071937227749,-1.1713630977626923,-0.9662261001701968,-0.5145772159489495,0.09133181945519986,0.7159401356783508,1.2173196837408358,1.4858747437637292,1.47419435600762,1.2098776327639391,0.7878183834861013,,, +22.9453125,45,0.9866855284077656,1.0390684998587645,1.07502305079276,1.0940794900795026,1.0960716141018232,1.0811395201426146,1.0497270514565171,1.0025739188205849,0.9407026365776722,0.865400501984919,0.7781969334785741,0.6808365647268924,0.5752485656686546,0.4635127277991727,,, +22.953125,45,0.3478229076248517,0.23044846847598585,0.11369439590545324,-0.00013921485794105018,-0.1087975899423057,-0.21011091831727424,-0.3020325095115014,-0.3826747993352189,-0.4503425730462782,-0.5035628241257577,-0.5411107257358001,-0.5620312599941176,-0.5656561262348584,-0.5516156320820931,,, +22.9609375,45,-0.5198453590147782,-0.4705874855962147,-0.404386745086422,-0.3220810881013985,0.08988234663349459,-0.16994960155725658,-0.4637745379539105,-0.774574211861432,-1.0840322802608109,-1.3738062565964273,-1.6268015583366524,-1.8283588207720496,-1.9672716920962177,-2.0365641452037297,,, +22.96875,45,-2.033973110589498,-1.9621027829172029,-1.8282398483022064,-1.6438425236791134,-1.4237390449581808,-1.1850915009594076,-0.9461972724721,-0.7252116593114413,-0.5388807732239288,-0.4013730577996132,-0.3232909181606024,-0.3109313827155489,-0.3658473526685511,-0.4847400331892188,,, +22.9765625,45,-0.6596900449863337,-0.8787110969407735,-1.1265876064489388,-1.3859378527400603,-1.6384285205162907,-1.866055933563647,-2.0524046267007514,-2.1837954839851488,-0.9021794194660712,-1.3012283378950171,-1.5935346008644542,-1.743775446198759,-1.738901748176156,-1.5901166133500877,,, +22.984375,45,-1.3310755994308678,-1.0125891677503471,-0.6946527792703997,-0.4370462800325116,-0.28996706351419,-0.28615623575499083,-0.4357444638668363,-0.7246205798576589,-1.1165773187935524,-1.558900255130643,-1.9905296967206356,-2.35152453485396,-2.5923542513930986,-2.6815720374608016,,, +22.9921875,45,-2.6106741152730004,-2.3953886039890597,-2.073193372291229,-1.6974496591300243,-1.3290653386182103,-1.0269864578024062,-0.8389981597949498,-0.7942678967862404,-0.8987924465826916,-1.1344579430974986,-1.4618593644740978,-1.8264403461651764,-0.08396535073622302,0.07851537063713265,,, +23.0,46,0.4724756296553129,0.9986581015138036,1.5191346811053674,1.8951271082832788,2.0250827959049054,1.8725699472628659,1.47634607646488,0.9398395865173907,0.4029261370069941,0.003733823929531921,-0.1590561670246492,-0.053082718483938085,0.27901169390519764,0.7314652005232228,,, +23.0078125,46,1.1645894503747032,1.443268340994159,1.47420915554199,1.231734575194725,0.7650446071598165,0.1849559985516768,-0.3662486785638884,-0.7536009236702509,-0.8862288443225738,-0.7420633390174595,-0.3736986117968513,0.10619736880671538,0.5559222288719037,0.8437198643441893,,, +23.015625,46,-0.22478721370002064,-0.1138812221292642,0.00902527212577997,0.14211314884368692,0.2833874218239988,0.4307119560082995,0.581846654197803,0.7344864623599742,0.8863015106633242,1.0349776875126826,1.178256936257721,1.3139765691152079,1.4401069100544026,1.5547866076457852,,, +23.0234375,46,1.656354999689568,1.7433809630471888,1.8146877436535949,1.8693733320735784,1.9068260279580351,1.9267349210074185,1.9290951050521503,1.9142075340886888,1.8826735229266751,1.8353839888760723,1.7735036229859125,1.6984502681302414,1.6118698651645091,1.5156074059761238,,, +23.03125,46,1.4116744021772614,1.3022134391886264,1.1894604365064685,1.0757052751040015,-2.2502433712378918,-2.246157474823863,-2.170735499843429,-2.0280242283886007,-1.826642203649272,-1.579183866083985,-1.3013466806464002,-1.010842110210769,-0.7261663629291297,-0.4653166191346703,,, +23.0390625,46,-0.24454224486593426,-0.07721805891223099,0.027081791286882703,0.06324477899118541,0.030969698679244036,-0.06521925171295008,-0.21629497229745756,-0.4093640406969229,-0.6285729618462128,-0.8562208754351263,-1.074001111243289,-1.2642849976051442,-1.411358381790331,-1.5025246186527474,,, +23.046875,46,-1.5289970955846608,-1.48651903820288,-1.3756673589373791,-1.2018193435649225,-0.9747844823488879,-0.7081271032259648,-0.41822702615205803,-0.12314372666802376,-2.166997007096141,-2.425221248427167,-2.554797060152957,-2.5286329714111844,-2.343104065416946,-2.018642736056031,,, +23.0546875,46,-1.5965860464875037,-1.132770585318586,-0.6888722922909849,-0.32283994113371994,-0.0799121186518651,0.014383358701302362,-0.04184256122918562,-0.2265963288693145,-0.4974798404883802,-0.7983483856266761,-1.0681112139373896,-1.250303709054137,-1.3019399689427005,-1.2002666678692426,,, +23.0625,46,-0.9463659582553938,-0.5650459475035402,-0.10103551436456698,0.38792415077604014,0.8400155429663172,1.1989168345328631,1.42251925384958,1.4894323465303168,1.4022641549299468,1.1871656653812743,0.8897107213191079,0.5677533584584955,0.2329706795975249,-0.28344122960051155,,, +23.0703125,46,-0.7453177035829225,-1.0225362044448718,-1.0334430492671434,-0.7672522133340096,-0.2870434613586479,0.2874622416635229,0.8126298507337077,1.1601711226220959,1.2521799726476357,1.082341292037276,0.7175018229741734,0.2791740191718317,-0.08995626712572657,-0.26533729778695625,,, +23.078125,46,-0.17489929953660802,0.18097301314910488,0.7293191439134705,1.3443680862389669,1.881775230084264,2.217949754820132,2.2836962134833603,2.0829523060077597,1.6914894897323034,1.2359346041822894,0.858864031350746,0.6795389192714641,0.7610445395877344,1.0928415416356392,,, +23.0859375,46,0.9632514815082354,0.8543756746172421,0.7512874854634604,0.6560906518592978,0.5707459692808011,0.4970367468421728,0.4365373733536536,0.39058554398725387,0.36025863398599,0.34635463323068016,0.3493779756184593,0.3695305114975006,0.4067077813454806,0.4605006560541449,,, +23.09375,46,0.5302023152107078,0.6148204412992313,0.7130944164067917,0.8235172204330503,0.9443616474676982,1.0737103813922508,1.209489404187334,1.3495041520590656,1.4914777863981656,1.6330909095362256,1.7720220299722134,1.9059880686169584,2.0327841968725013,2.1503223090777297,,, +23.1015625,46,2.25666745574376,2.350071599716736,2.4290041042771793,2.4921784193992793,0.15863680095803773,0.4094851104922936,0.6138518423661941,0.7593464267145393,0.8375957427170727,0.8448228699399988,0.7821055856737021,0.6552965940039374,0.4746110602387449,0.2539102235260232,,, +23.109375,46,0.009731053247818977,-0.2398703767285867,-0.4765811325595842,-0.6831112558896557,-0.8444019365606634,-0.9486777668937856,-0.9882696953315188,-0.9601512879012264,-0.8661508987028441,-0.7128249513413636,-0.5110011658454068,-0.2750235821987655,-0.02175202708787952,0.2306142052324288,,, +23.1171875,46,0.4638064281287663,0.6607618252802058,0.8068149697418086,0.8907225071779404,0.9054495442247708,0.8486628992253745,0.7228968132115602,0.5353795586352351,0.2823752869250902,0.08833370010939412,0.025497400909150425,0.11260528355585575,0.34431947243814576,0.6920322406537363,,, +23.125,46,1.108301140912632,1.534221648472431,1.9085890626063424,2.1774227060325684,2.3023690110763235,2.2666746795866475,2.077799556369258,1.7662622171910944,1.3808980261087844,0.981268173088385,0.6284019325048361,0.3753139730189673,0.2587735671110641,0.2936075401509942,,, +23.1328125,46,0.4704241379060566,0.7571121485326899,1.1038815834700666,1.4510605904193905,1.7384339602156709,1.914668465574364,1.9453567339279605,1.8184265172526453,1.5460725665437387,1.162909934096038,0.7206360535960997,0.280032720057045,2.5679295016038455,2.7812438334113576,,, +23.140625,46,2.713803200242844,2.3807714075759367,1.8673982265049327,1.3056618707077312,0.8381274514408018,0.5789265117052398,0.5825515602224919,0.8290174663700961,1.2294557149770298,1.6506072967841003,1.9515002813411555,2.022258493936885,1.814403489531481,1.3543433054895693,,, +23.1484375,46,0.7363493462728931,0.09694432902192653,-0.4222812049424811,-0.7132350008298547,-0.7307041331487405,-0.5045006792733504,-0.13104543760393053,0.25330148344632164,0.5098517668475432,0.5358314930999033,0.2927720504139789,-0.18273371736154745,-0.7888599340682232,-1.3862687662200155,,, +23.15625,46,2.538574498972733,2.5674565565253817,2.5783858486121547,2.57122826209598,2.54615657252622,2.5036473341280496,2.444472455911109,2.3696856114504112,2.280603720349197,2.1787838256900702,2.065995772385387,1.9441911648688013,1.8154691477110936,1.6820396083691684,,, +23.1640625,46,1.5461844464208243,1.410217587475827,1.2764444419457766,1.1471215185643435,1.0244168998364849,0.9103722715079616,0.8068671709178505,0.7155860802556681,0.6379889409187057,0.5752856052600375,0.5284146730753166,0.4980270833884043,0.4844747488361793,0.4878044316486302,,, +23.171875,46,0.5077569684392519,0.5437718573588929,0.5949971272697439,0.6603043161039576,0.29753302927261555,0.0241801980613853,-0.26748429978611943,-0.5590886837206814,-0.8323603578671772,-1.0703950627242902,-1.2588303583171907,-1.3868416204503498,-1.4478911089903037,-1.4401778867036832,,, +23.1796875,46,-1.366757228332827,-1.2353212075385915,-1.0576557769301191,-0.8488122159585765,-0.6260507398664681,-0.4076299511262811,-0.21152656500772785,-0.054174703363857324,0.05068731360988932,0.09298224387703646,0.06700393950985706,-0.02817742671383905,-0.18864319898791612,-0.4058921897500963,,, +23.1875,46,-0.6674262161022574,-0.9576144072070674,-1.2587760287854546,-1.5524063328209745,-1.8204599668019217,-2.046602462785453,-2.2173425522458707,-2.3229663627375152,-0.09844658647066562,-0.3640382505428794,-0.4835211243664338,-0.4463373888782069,-0.26618435735696583,0.02117042944024333,,, +23.1953125,46,0.3635102316733045,0.7003504907367097,0.9724060107091038,1.130869130269291,1.1450535253740008,1.0072128575808843,0.7337835296739175,0.3628577896035912,-0.05171941693709814,-0.4487105588959711,-0.7690006076123782,-0.964785198110799,-1.0070008633114806,-0.8898401270328499,,, +23.203125,46,-0.6316482699457554,-0.272062135475965,0.13416335614246955,0.5256794315616218,0.8440907528743291,1.0430387713034626,1.09540642730864,0.99752210894614,0.7697081816334942,0.4530887741473,0.10315416504476004,-0.21891569167745506,-1.9572736942653712,-1.6344567349659136,,, +23.2109375,46,-1.1740598203107002,-0.7158394195453673,-0.3964533271563256,-0.31197908736897983,-0.4915768970065091,-0.889515150726764,-1.3977439359428152,-1.87557000326098,-2.18829953631829,-2.244257045529445,-2.0200335792574093,-1.5670432596771848,-0.9975898120919544,-0.4542602993598499,,, +23.21875,46,-0.07103264716430957,0.06324557599799407,-0.0710003436237957,-0.4189232326461794,-0.8665075970343078,-1.2720431300353892,-1.505190073414822,-1.4829276330014172,-1.192530919031532,-0.6952770019460179,-0.10986229306289773,0.4199259566028404,0.7644256870085299,0.8434574684554068,,, +23.2265625,46,0.7383082961068143,0.8273915987945165,0.9257328136575118,1.0313385633164245,1.1420784952009335,1.2557226770052072,1.3699807410813574,1.4825420922971808,1.5911164752747626,1.6934741906163315,1.7874852558752838,1.871156825504268,1.942668214487938,2.0004029123365568,,, +23.234375,46,2.0429770268002425,2.0692636591835134,2.0784127843726647,2.069866287396368,2.043367893150002,1.9989678153278967,1.9370220430742728,1.8581862777519944,1.7634046259064693,1.6538932463116334,1.5311192373428517,1.396775134257518,1.2527494628302016,1.101093864849389,,, +23.2421875,46,0.9439873709919132,0.7836984465535951,0.6225454745011839,0.4628563676704411,-2.3582083675068994,-2.3226123158698018,-2.2205569903929825,-2.0609450091820856,-1.8565763880376749,-1.6232505594420783,-1.3786594803684036,-1.1411490283974135,-0.9284350696859364,-0.7563637426148295,,, +23.25,46,-0.6378024169864632,-0.581738675555889,-0.5926501579369197,-0.6701892181069994,-0.8092043930642334,-1.000097192520229,-1.2294893357541792,-1.4811539124909037,-1.737145539637307,-1.9790507082706277,-2.189271133224421,-2.352250615422665,-2.4555598653075283,-2.4907636397282604,,, +23.2578125,46,-2.4540097237749503,-2.3462986848636547,-2.173415586308117,-1.9455284194373177,-1.6764812532638502,-1.382831388224559,-1.082697651120394,-0.7945001373141358,-0.4558169197204878,-0.5630866442877557,-0.5160705454034283,-0.31380758631209593,0.02077338435840892,0.4443760247936413,,, +23.265625,46,0.9000295123082731,1.3259099700336678,1.6649165983634222,1.8735112587809017,1.9284449838537827,1.8303240131105127,1.6034602170171732,1.2920294979224554,0.9531368078485096,0.6478682312378221,0.43172410195198097,0.3459235255074713,0.4109349446180399,0.6232406597598121,,, +23.2734375,46,0.955839501213714,1.3624096011679083,1.7844831222775033,2.1605156574527715,2.435437895979109,2.5692020198128867,2.5429918533132208,2.36212965479767,2.0552269353984656,1.66971168415982,1.264428752492229,0.9004660017722091,-0.2510850718877541,-0.6915559574750797,,, +23.28125,46,-0.9519323819038332,-0.9572649432038908,-0.70457752589359,-0.2637123917635111,0.24180411189572,0.6686311754201424,0.8929357105354203,0.8443897343723873,0.5255247577992197,0.011137989265983916,-0.5720878276984606,-1.0801664592930615,-1.3911154877714844,-1.4382173673204044,,, +23.2890625,46,-1.2281199611232163,-0.8388174675697486,-0.39806694227435785,-0.04815773877676921,0.09330847148481157,-0.034124004783513184,-0.4169662451310369,-0.971251888974584,-1.5653220402940011,-2.055685381428707,-2.326127426046978,-2.3193522932331136,-2.0524869229383302,-1.6122003815096884,,, +23.296875,46,0.306928017192824,0.15698628708059242,0.015147255353758047,-0.11661961974709055,-0.2365257636269784,-0.34299457943885203,-0.4346888280977994,-0.5105338149027334,-0.5697359768976373,-0.6117965456365112,-0.6365200462434579,-0.6440174840827221,-0.6347041633677175,-0.6092921760378082,,, +23.3046875,46,-0.568777692553454,-0.5144232772818051,-0.44773553826064616,-0.3704385028277201,-0.2844431854413078,-0.19181388069126654,-0.09473177184836944,0.004543507706344806,0.10371368697423786,0.20048234650434602,0.2925953751335758,0.3778806857649981,0.4542864946341082,0.5199174936538558,,, +23.3125,46,0.573068282328688,0.6122534737117687,0.6362339471136924,0.6440387877487342,-0.5356792752191742,-0.32148352924293244,-0.163910270264624,-0.07087366112610771,-0.0456575734410386,-0.08669167521327525,-0.18766629236457344,-0.3379780228709052,-0.5234750171658047,-0.7274499412206327,,, +23.3203125,46,-0.9318113664510708,-1.1183518878385963,-1.2700245259827199,-1.3721383906974074,-1.4133902134948502,-1.3866598012949571,-1.2895139258888424,-1.1243834950613798,-0.8984016341226981,-0.6229139521493554,-0.3126951266582461,0.01507358039800447,0.3419945914999328,0.6497290834004336,,, +23.328125,46,0.9212679606395906,1.1421101210679776,1.3012658665270302,1.3920155049017633,1.4123702609449915,1.3652033720588004,1.258042244071247,1.1025361771714994,0.6316351440646407,0.496089968463529,0.5103874707058548,0.6669168875749644,0.9350970476112356,1.2661554936265016,,, +23.3359375,46,1.6007449320177904,1.8782106150031743,2.0460651005422257,2.0681945153160908,1.9305180026237765,1.6432186991143234,1.2391985697686494,0.7689975685159034,0.29296827680907905,-0.1280753676135591,-0.4422789837419352,-0.6147711984203262,-0.6330402040922851,-0.5088262680582525,,, +23.34375,46,-0.27623570440972944,0.013629647155018076,0.3006906588283512,0.5253076929349331,0.637628913841785,0.6054137905029129,0.4191129452911061,0.09341284639653458,-0.3349955351038606,-0.8130768389252322,-1.279658878816623,-1.6749095465771795,-0.5807631001158484,-0.6752492096042813,,, +23.3515625,46,-1.0098367369839611,-1.4928763412988793,-1.9894566527408584,-2.3583416529414616,-2.490663976538656,-2.339769679584896,-1.9340349297697408,-1.3691417503678436,-0.7819294002453243,-0.3129873345439157,-0.06824108820187458,-0.09005824407068352,-0.3457922970255141,-0.7369028513745346,,, +23.359375,46,-1.1261510756373103,-1.3754153091187065,-1.3837609208261652,-1.1153287255856594,-0.6093965946512181,0.030145386816459736,0.6630237924619098,1.1507802302803392,1.394472371231302,1.3615470880783842,1.0945227403636644,0.6991031677450839,0.31498304526348064,0.07734795332874789,,, +23.3671875,46,0.6349825290193822,0.6086773953954907,0.5650403313822303,0.5042946933691782,0.4269665746039055,0.3338758275102149,0.2261219404204261,0.1050650158888905,-0.027697816466269898,-0.17036013971604647,-0.3209376563659421,-0.477302712288267,-0.6372213334538411,-0.7983921270644262,,, +23.375,46,-0.958486366058068,-1.1151885552192018,-1.2662367687011722,-1.4094620527694233,-1.5428262039297873,-1.6644572610685295,-1.772682090239036,-1.866055491645948,-1.9433853192699968,-2.0037531733874303,-2.046530303764345,-2.071388445154265,-2.078305395466721,-2.067565239025345,,, +23.3828125,46,-2.0397532110962238,-1.9957452936956623,-1.9366927249388617,-1.864001693252706,0.9136367954127019,0.7085483469741238,0.5055210896612901,0.32257191791789097,0.17622146085739465,0.08033573181811328,0.04515311873379069,0.07656457969427444,0.17569725072150078,0.338830514305292,,, +23.390625,46,0.5576503930994393,0.8198245400529849,1.1098577393943716,1.4101682712735606,1.7023100906697135,1.9682556023274416,2.1916495872055464,2.3589468468583448,2.4603542400993303,2.490511425880728,2.4488628463427924,2.339695013996954,2.171836505586051,1.958041584886496,,, +23.3984375,46,1.7141004374328537,1.4577380635486397,1.2073786127574002,0.9808613250156776,0.7941976180129698,0.6604559896869432,0.588852491361031,0.5841101909968998,-1.949607231302833,-2.0727610778307066,-2.0363944168168326,-1.8567465358635984,-1.5717058083066968,-1.234874166062954,,, +23.40625,46,-0.9071875718424952,-0.6473977940956347,-0.5028981275300135,-0.5023221113874163,-0.6510681240462091,-0.930446991544203,-1.300585423405263,-1.7066330783402721,-2.0873064835523327,-2.384439033036223,-2.5520495671091865,-2.5635169981264867,-2.4157434200750942,-2.129657179129476,,, +23.4140625,46,-1.746977432999432,-1.3237440007244743,-0.9216201093261844,-0.5983225092907593,-0.3986693311615373,-0.34763982346176603,-0.4465267365087974,-0.6727804073489471,-0.9835685869375772,-1.322497293297822,-1.6284456183423328,-1.8451381483408444,0.8325750297854956,1.4238119905155426,,, +23.421875,46,1.979486383429036,2.3650645013945133,2.4901598668100533,2.3332325000948915,1.947441625751004,1.446048150636952,0.9713678360696668,0.655784138180745,0.5855056897368659,0.7770009671786404,1.1725680492789028,1.6562528241614478,2.0857519149685397,2.331555484871068,,, +23.4296875,46,2.3126006817224183,2.0186626575490823,1.5133447908547415,0.9168467914524931,0.3732315351126239,0.01115981791887388,-0.09114760450862848,0.07288004755391009,0.4365925283296913,0.8786148207548885,1.2563392733885714,1.445232304057649,1.3731808021813738,1.040462896849665,,, +23.4375,46,-1.7793085720838204,-1.6844511288218975,-1.5814362121371608,-1.4724044836003367,-1.3595928112001114,-1.2452949833091391,-1.1318214310639672,-1.0214586644695416,-0.9164291325630782,-0.8188522105356447,-0.730706996974251,-0.6537975726960066,-0.5897213295280186,-0.5398409236416969,,, +23.4453125,46,-0.5052603445737743,-0.4868055189994618,-0.485009788919092,-0.5001045185608551,-0.5320149945006737,-0.5803616908097421,-0.6444668770979329,-0.7233664537608443,-0.8158268072120473,-0.9203663899744314,-1.035281647771594,-1.1586768396430402,-1.2884972289292818,-1.42256506395894,,, +23.453125,46,-1.5586177184063563,-1.6943473234764044,-1.8274411979486795,-1.9556223681306941,0.6461322877339818,0.7700116662085157,0.9463762173643041,1.1620458376586562,1.400955283509489,1.6452785181957583,1.8766761370098568,2.077578873184677,2.2324176704232896,2.3287145333400114,,, +23.4609375,46,2.3579580749284963,2.316202693369679,2.204349582176815,2.0280899639387067,1.7975144916858263,1.5264160406555058,1.2313344937154764,0.930410114915618,0.6421254530989151,0.3840234903512005,0.17149140634091584,0.016694753801974938,-0.07226364843907818,-0.09190146886004223,,, +23.46875,46,-0.043592386292556684,0.06653702395527006,0.2280418332345967,0.4268944126964472,0.6464698798870903,0.8687126034617346,1.0754024050704176,1.2494321454369055,-1.9299637640155205,-1.8606669611988635,-1.6388691952394918,-1.289871490460608,-0.8587687676597588,-0.4034808126404751,,, +23.4765625,46,0.014214939675232132,0.3382523995853848,0.5269574541334648,0.5594884551253385,0.43903368909790463,0.19226806243369565,-0.1348461289531914,-0.4842600598690282,-0.7949190740507327,-1.0123086480807548,-1.0969785965854828,-1.0307176550269768,-0.8194165598008782,-0.4921735474753169,,, +23.484375,46,-0.09678147689693284,0.3077006213361755,0.6601346277267888,0.9068181721029904,1.0098452798846569,0.9530106296502828,0.7443377997145809,0.41483769194268,0.013690469907516142,-0.3993986156349685,-0.7634789793407931,-1.025824767265073,-0.564307081665202,-0.8606145385667237,,, +23.4921875,46,-0.8832162191461121,-0.6365197944992096,-0.19681070125285974,0.3087331041717757,0.7369532986916038,0.9679813647929576,0.9381036950102668,0.6572141852381513,0.20607118768443594,-0.2858890802891078,-0.6761014796954398,-0.8480396354086239,-0.7432667723331763,-0.37758444181066986,,, +23.5,47,0.16314800505054222,0.7463788645449168,1.229012253564039,1.4964335872354408,1.4937184752515078,1.240473543135845,0.8252437666572809,0.3810211782158904,0.04856939673308847,-0.062382224046095176,0.09656284615361456,0.4989831168771421,1.0506652373706191,1.6152179109017666,,, +23.5078125,47,-2.0766894682075643,-2.1885553223062963,-2.2892835326815937,-2.3771224333386316,-2.4505358145300944,-2.508229880114506,-2.549175965710892,-2.5726286198166783,-2.5781387312448265,-2.565561472971285,-2.5350589232469867,-2.487097318024348,-2.4224389827522357,-2.3421290847519733,,, +23.515625,47,-2.2474774380809954,-2.140035679409777,-2.021570214496664,-1.8940314088944272,-1.7595195622812387,-1.620248262134247,-1.4785057583326815,-1.3366150349442754,-1.1968932782492914,-1.0616114506254055,-0.9329546780708152,-0.8129841448761891,-0.7036011625812805,-0.6065140422676777,,, +23.5234375,47,-0.5232083501518043,-0.4549210672056253,-0.4026191051587039,-0.3669825549657968,1.3760075880416878,1.4436858538827881,1.4451800366562324,1.3778738544016766,1.2440104341083005,1.0505420499224831,0.8086512788191518,0.5329769511753306,0.2405988597697325,-0.05014798617112598,,, +23.53125,47,-0.3209468883639324,-0.5547719728758498,-0.7370709642349853,-0.8567757520888883,-0.9070702901469592,-0.8858622884624202,-0.7959258148047126,-0.6447048687096679,-0.4437916324872604,-0.20811578852171775,0.045098560334920684,0.29753562547530343,0.5310664481092974,0.7290140378243597,,, +23.5390625,47,0.8773169098853097,0.9655098828544292,0.9874537419284444,0.9417628866244516,0.8319011427759191,0.665939059584311,0.45598961900681,0.2173617109058349,-1.1501203485426026,-1.1220864429288566,-0.9516707466994452,-0.6714620339564548,-0.3315749401059885,0.00819764076153956,,, +23.546875,47,0.2877420153335009,0.4560332970813438,0.479131314836476,0.3455171604434664,0.06793891251062023,-0.31852122008472383,-0.7618575636394648,-1.2011870003271878,-1.5761774231937025,-1.8363903847321856,-1.949083063303645,-1.9042546396657871,-1.7161513706786486,-1.4209962194638264,,, +23.5546875,47,-1.0712969407051078,-0.7276194361280909,-0.44910798408131947,-0.2842291180342772,-0.26318108298495835,-0.3931513636337006,-0.6571611622125927,-1.016677002665524,-1.4175828721563044,-1.798582872612022,-2.1007257725090773,-2.2765680887312443,2.169471066013842,1.8370013987842024,,, +23.5625,47,1.3504406487841785,0.8466676940713265,0.4649372932133634,0.3086334678865193,0.4168752865143331,0.7537576907337299,1.2181765692423057,1.6715455536982025,1.9758082196564195,2.0313275058992835,1.8042676097917243,1.335963210192704,0.7317074046700055,0.13203026991086075,,, +23.5703125,47,-0.3256614326775176,-0.5445713343462921,-0.4948547288656069,-0.22159632076647215,0.16776024190862704,0.5330839812089014,0.7401952724715386,0.6978798371864217,0.383131504760092,-0.1522966967067762,-0.7958307550467076,-1.4046853253444198,-1.8447577893834133,-2.0271491477329038,,, +23.578125,47,-0.3483929609491517,-0.3469268258255793,-0.3623544602353216,-0.39414419680309787,-0.4414718948305039,-0.5032355690760923,-0.5780748863575487,-0.6643951884693935,-0.7603956206593736,-0.8641008730106821,-0.973395978817234,-1.0860635605114697,-1.199822870839303,-1.3123699455534317,,, +23.5859375,47,-1.4214181644202275,-1.5247385101917144,-1.6201988204816842,-1.7058013451120015,-1.7797179511771186,-1.8403223592507327,-1.8862188461492533,-1.9162669115350104,-1.9296014763125555,-1.9256482590137205,-1.9041340607950348,-1.865091778823877,-1.8088600601329012,-1.7360776018711557,,, +23.59375,47,-1.6476721976161115,-1.5448447214123011,-1.4290483298398269,-1.3019632461462118,-0.032509590721848905,-0.2752813499613396,-0.4929847261262679,-0.6692811641173975,-0.79060521229426,-0.8471142672677581,-0.8333790079005488,-0.7487663626717601,-0.597488294521177,-0.3883129902426287,,, +23.6015625,47,-0.133958582482329,0.14978833019602275,0.44516790955944696,0.7336796900071121,0.9973666367739776,1.2200611228916705,1.3885059537278257,1.4932722816454176,1.529410417219834,1.4967881697298084,1.400093139531606,1.2484988188811426,1.055017801704043,0.8355872218747531,,, +23.609375,47,0.6079502122774973,0.3904114011431656,0.2005532460008248,0.05400273654104082,-0.03666551473238922,-0.0628132859670838,-0.020348201460402397,0.08998388696815751,-2.2975486099514963,-2.1584258306494024,-1.8780872117542644,-1.4966042704162428,-1.0689922124059317,-0.6566460844766645,,, +23.6171875,47,-0.3177872971788185,-0.09840848762225808,-0.02512705175926277,-0.10106036985199572,-0.3053650839816443,-0.5965120713427875,-0.9187868836778532,-1.2110030214479623,-1.4160707330769309,-1.4899307603005498,-1.408461347917183,-1.1712824962501858,-0.8018646918519918,-0.3439249365706239,,, +23.625,47,0.14532884318092526,0.6040530535376158,0.9753443776011884,1.2160451842710065,1.3034071991590779,1.238575826316162,1.0463527125025551,0.7712738301503204,0.4706142321231366,0.2054093164709212,0.030891374978099236,-0.012168733047012048,-1.1898808685442386,-0.7983939722144772,,, +23.6328125,47,-0.5713103611099734,-0.5919794450074573,-0.8735095587852779,-1.3550602871836672,-1.9184227793174309,-2.420344686059211,-2.7317410273905334,-2.7730448670468006,-2.5360094281708063,-2.085986328730384,-1.5440553169607094,-1.053902780199519,-0.7425260020465427,-0.6855321238085789,,, +23.640625,47,-0.8865413073405287,-1.2763378792406892,-1.7320007395902413,-2.110768446518656,-2.2893559143495983,-2.197945413649811,-1.839534066212984,-1.2893332814718816,-0.6743826715072491,-0.13896354500320096,0.19471104519733096,0.25975818638207915,0.06272499660139952,-0.31843198143662704,,, +23.6484375,47,-1.165467567842171,-1.0216046087765942,-0.8725473474019875,-0.7205606036044495,-0.5679616062446132,-0.4170796417463799,-0.2702154901430367,-0.1296013587316019,0.0026379852369047274,0.1245222023970496,0.2342498421032083,0.33022967298605543,0.4111083347522635,0.4757938271718157,,, +23.65625,47,0.5234744250847047,0.5536326883431173,0.56605432149917,0.5608317282189843,0.538362198302741,0.4993407591689914,0.4447478170863813,0.37583180466289023,0.294087138543076,0.20122787337921444,0.09915751349622297,-0.010064489046815395,-0.12425896328775275,-0.24116534061806996,,, +23.6640625,47,-0.3584813973679393,-0.4739037227380809,-0.5851682033905832,-0.6900898157353982,0.26264399812770434,0.4876794708067434,0.7514113203762469,1.03738158706413,1.3274946299597552,1.6032727959747488,1.8471389168998151,2.043636216424252,2.1805005731460807,2.2495103807874663,,, +23.671875,47,2.2470547551476163,2.1743804773632127,2.037500465179612,1.8467701660627625,1.6161614221984768,1.362284453021501,1.1032261647735044,0.8572858040006365,0.6416961296952794,0.4714192878703778,0.3581013623669046,0.30925850989648584,0.3277514374505808,0.4115848723619096,,, +23.6796875,47,0.5540460117311052,0.7441722989965869,0.9675159095868944,1.2071516362891788,1.4448578911085002,1.6623884676048233,1.842746377833381,1.9713709325526576,0.09613407529221783,0.3516865243902694,0.7269474511913399,1.1751896098609471,1.6377323642374295,2.0530389626105943,,, +23.6875,47,2.366261656602296,2.537748156530784,2.5491846766016564,2.406418919628108,2.1385234497984005,1.7932454625725822,1.4295517790027312,1.1084303059029108,0.8833807474675515,0.7920757339140381,0.8504912131182232,1.0504203293896797,1.3607579964887686,1.7323560454872085,,, +23.6953125,47,2.1056926714548294,2.4201615406175603,2.6235336289716304,2.6801179399756543,2.5763498865550862,2.322936759340944,1.9532259377314172,1.5180498116756669,1.0778501375719238,0.6933082798229248,0.415940492621192,0.2801228297680516,-1.255097759350433,-1.1383614085060496,,, +23.703125,47,-0.7704208974606629,-0.23492256998751945,0.3368524071040003,0.8018453995908313,1.044325032764572,1.007522783430014,0.7091298046487972,0.2364083040226736,-0.2777423681128767,-0.6912052283555667,-0.891569355460193,-0.8268902435032348,-0.5198568164411987,-0.061483043017864676,,, +23.7109375,47,0.4139460235785967,0.7658061726361529,0.8858207518244623,0.7278978962658657,0.3209392235062924,-0.238892178494897,-0.8143271719919127,-1.2644029001691768,-1.4828804336473689,-1.4271406783844736,-1.1296411610211499,-0.6887958757200124,-0.2417799059248813,0.0732856007471836,,, +23.71875,47,-0.7866010290600702,-0.8727881469847624,-0.946924950826204,-1.0075030556948406,-1.0532584477220333,-1.083193737674806,-1.0965957412303569,-1.0930480780133125,-1.0724385687225078,-1.0349613007634302,-0.9811133261578922,-0.9116860494953056,-0.8277514566677402,-0.7306434254769582,,, +23.7265625,47,-0.6219344453122647,-0.5034081534962263,-0.3770281691438892,-0.2449037702130532,-0.10925301471086593,0.0276360482373832,0.16344539828674912,0.2958675940190966,0.42264614333056016,0.5416149871883522,0.6507364054226775,0.7481366808305354,0.8321388971260872,0.9012922964538482,,, +23.734375,47,0.9543976824142956,0.9905284238009052,1.0090466912656482,1.0096146426040884,2.037155282339032,2.0332234589554044,1.9574127263257064,1.8124275993770929,1.605654783879647,1.3486519347071548,1.05634587487948,0.7459961772371285,0.4359963719237762,0.1445963650050459,,, +23.7421875,47,-0.11136485287642794,-0.3176278471194417,-0.4635012481994937,-0.5426012099787387,-0.5532902658190096,-0.4987849934684761,-0.3869249952120008,-0.22961931778430825,-0.04200893012653712,0.15859632237382282,0.3539321416829147,0.5260608771049811,0.6586299497779408,0.7380198309888478,,, +23.75,47,0.7543015052016505,0.7019366337408375,0.5801715772657025,0.3930977832771864,0.14937431029107873,-0.1383681794230051,-0.4544004143808094,-0.7809836362726211,0.2977875875721453,0.4566170712122516,0.722015740449971,1.0425532815904932,1.3580305324846829,1.6089116606530325,,, +23.7578125,47,1.7456531914014837,1.736476548461548,1.5723732017756131,1.2685625555747784,0.8621752182831235,0.40652221793056215,-0.03715750933964773,-0.4091862494913863,-0.6606955317702442,-0.7611928560446438,-0.7032687995918144,-0.5037115641084665,-0.20085556921351355,0.15142274984224532,,, +23.765625,47,0.4921265835894063,0.7626659608127037,0.9160064838452986,0.9240145072534092,0.7818546135401222,0.5087543798735927,0.1450172639031264,-0.2542511672654266,-0.6277265057894466,-0.9174213728910222,-1.0777254844190227,-1.0825218252172946,-0.448101014021968,-0.9910182873116892,,, +23.7734375,47,-1.5202349799010642,-1.8976964726001868,-2.024927710725368,-1.8699009700109583,-1.4757116462232291,-0.9486853302290318,-0.429176510913948,-0.05306275897595625,0.08551186669288091,-0.040066972167901005,-0.38161807640823536,-0.8294204597368569,-1.242357288949148,-1.4866858878317402,,, +23.78125,47,-1.4728073353275484,-1.1799572487470966,-0.6620496012812849,-0.033070638989169836,0.5639754932624574,0.996059970626636,1.176376237727376,1.0879083596627774,0.7878633667464143,0.3917548699292092,0.04150226086469433,-0.1337092992867568,-0.0530788257562147,0.29342336555673304,,, +23.7890625,47,0.9922003607950379,0.957078440806186,0.9048252148733684,0.8363086998380045,0.7526734425409245,0.6553205286000534,0.5458831045915951,0.4261978422008152,0.2982728439714921,0.16425255258184124,0.026380278038286558,-0.11304100110473835,-0.2516888761886077,-0.38726208202970747,,, +23.796875,47,-0.5175206952500202,-0.6403252535485432,-0.7536741109910025,-0.8557383753014435,-0.9448938154649816,-1.019749181013091,-1.079170437195334,-1.1223004917516497,-1.148574067953176,-1.1577274635611532,-1.149803024909405,-1.1251482578541223,-1.0844095912459455,-1.02852090221531,,, +23.8046875,47,-0.9586870042849626,-0.876362387526986,-0.7832255831183681,-0.6811496012735141,-1.0995989193831854,-1.3922309796616354,-1.6426169661682295,-1.8373731692450772,-1.9669210927648595,-2.02614832847852,-2.014758163223722,-1.9372835550350511,-1.802764518389445,-1.6241114299313866,,, +23.8125,47,-1.4171986672940502,-1.1997517978624228,-0.9901059301745642,-0.8059218243437771,-0.6629493028672281,-0.5739242041521715,-0.5476758080882664,-0.5885069854141346,-0.6958903040486978,-0.8645012921420892,-1.0845865458605892,-1.3426410193633416,-1.6223472734191926,-1.9057111910995417,,, +23.8203125,47,-2.174314967921299,-2.4106000050883747,-2.59909024840772,-2.727470667575714,-2.7874456711943294,-2.775317597845832,-2.6922449427018704,-2.5441623113753007,-0.9292704809953156,-0.6394239594958928,-0.2551092029045973,0.16740704321462646,0.5664518484699369,0.884518561534896,,, +23.828125,47,1.0771873395039493,1.1200045209764249,1.012249556855085,0.7770030058896915,0.4575052432422955,0.11037328267209044,-0.2032675116641444,-0.4273552722234527,-0.5196758920301715,-0.4584912281265753,-0.24597858048400445,0.0920545598611825,0.5101363545916455,0.9501596431979988,,, +23.8359375,47,1.3503796304494329,1.654979084591712,1.8227114971498284,1.833276261411996,1.6904331691192105,1.4213713842946556,1.0724314277344658,0.7018467318792312,0.37063553052678144,0.13306192895362326,0.028152087279228574,0.07358709434351672,2.040998249011586,2.418678356796345,,, +23.84375,47,2.5275959861650894,2.3614172290933513,1.987092070822818,1.5263529197377237,1.1222176032893414,0.8996785350426968,0.9313529734534391,1.2175094169411125,1.6859449152741168,2.2117473342004157,2.65152653498549,2.8827327268821885,2.837285800919916,2.5202984364010583,,, +23.8515625,47,2.0087609186246027,1.4305473032360163,0.929495701788512,0.6261319487425898,0.5847997597166718,0.7962045075796643,1.1801531906016312,1.6077378697907654,1.9368808705638798,2.0514978921591718,1.8935435333521915,1.4791544032095372,0.8944633237806553,0.2722296585879287,,, +23.859375,47,-0.5721689602798727,-0.4584438840636713,-0.34222229528886344,-0.2258002695935717,-0.11148164352319397,-0.0015374835266634967,0.10183387416984396,0.19654551299923206,0.28065867723473376,0.3524169214575661,0.4102770702422226,0.4529364458313966,0.4793558869247209,0.4887781553996556,,, +23.8671875,47,0.4807414085380047,0.4550875007353037,0.4119649692021754,0.3518266512504673,0.2754219747542854,0.1837840566529637,0.07821183526487774,-0.03975245085409529,-0.16835004329688236,-0.3056362346490227,-0.4495141946225757,-0.5977714593296093,-0.7481184448974291,-0.8982283111911707,,, +23.875,47,-1.04577747776987,-1.1884860827705526,-1.3241576764331922,-1.450717454361771,-2.3413676807271857,-2.097805745265038,-1.8300973198715231,-1.5563824770892771,-1.295058085294334,-1.0634977770370122,-0.8768436012951246,-0.7469536138668526,-0.6815787853393213,-0.6838266143208162,,, +23.8828125,47,-0.7519488400475266,-0.8794680473447787,-1.0556343242254826,-1.2661801161787332,-1.4943206263941828,-1.7219299879267005,-1.9308111761169509,-2.103971092285673,-2.2268118886396158,-2.288155444646016,-2.2810295396271383,-2.2031608836182626,-2.057140609918145,-1.85025067274438,,, +23.890625,47,-1.593963239326109,-1.3031479686654426,-0.9950424390269732,-0.6880575024559622,-0.4005008555826425,-0.14930781896866466,0.05113218548191134,0.1899716427992272,0.2629239102178257,0.5665773733293265,0.9364104438775768,1.3132178340818337,1.6359374956770494,1.8511552918703196,,, +23.8984375,47,1.9214224952856285,1.8310906410937744,1.5887549285205331,1.2259255793065018,0.7921340563094454,0.34723631396614496,-0.047888191059944574,-0.3407931519977555,-0.4956049240429853,-0.498577264011752,-0.3601962753343689,-0.11350787724814625,0.19107150468533,0.4936525572912937,,, +23.90625,47,0.7342486903835871,0.8621691036106447,0.8439660428661376,0.6686981613962081,0.3496899220595927,-0.07748727084715701,-0.5604980429528189,-1.0383364100096857,-1.4507692345126972,-1.7476592039312255,-1.8967155216165532,-1.8884653926957995,-0.5613356170378484,-0.3265622518446424,,, +23.9140625,47,0.07517406102187191,0.5106967792370363,0.8390018835698271,0.9500659612345952,0.7951463684039,0.40026780732255,-0.14080207515980786,-0.6921638345615602,-1.1129656278710258,-1.2959616625056427,-1.1968823334916192,-0.8465667212986441,-0.34253223468346083,0.17770836275786026,,, +23.921875,47,0.5742700137708502,0.7431478380913378,0.6446160257181892,0.31399092132656226,-0.14819031001440658,-0.6038823100350944,-0.915538703815034,-0.9839955181356316,-0.7758463310671058,-0.332804538646402,0.2395151719454688,0.8003235439612957,1.2120206473323316,1.3776846988410885,,, +23.9296875,47,-1.5662483611968767,-1.6690244326631192,-1.7575407923018682,-1.8305397777904977,-1.887032739504633,-1.926317129767355,-1.947988583686417,-1.9519477801739915,-1.938401963146965,-1.9078610963990903,-1.8611287196035369,-1.7992876656839796,-1.7236808897714748,-1.6358877455543597,,, +23.9375,47,-1.5376961245476122,-1.4310709462448914,-1.3181195510093426,-1.201054601797607,-1.082155144418365,-0.9637265082808592,-0.8480597498837843,-0.7373913492995786,-0.633863865484617,-0.5394882394422129,-0.4561084054225307,-0.3853688299205604,-0.3286855469669451,-0.287221196988218,,, +23.9453125,47,-0.2618645064012983,-0.253214567355472,-0.26157019297792394,-0.2869245346069519,0.2606540012657327,0.2613635597700974,0.1951448310526921,0.06968307402636498,-0.10323868411155013,-0.3085682561112072,-0.5290407357684229,-0.7463890872143903,-0.94262444886734,-1.101296857466413,,, +23.953125,47,-1.208648463424584,-1.2545788061231384,-1.2333548239202077,-1.1440160746470514,-0.9904468968527694,-0.7811104679348648,-0.5284632929042333,-0.24809094277767044,0.042374699619665085,0.3244811917642476,0.5802388143840147,0.7933719056387359,0.9504509940462056,1.0418267892175757,,, +23.9609375,47,1.0623009057408908,1.0114865532136732,0.8938340442604245,0.7183193448727254,0.4978173877135597,0.2482038506906696,-0.0127519627451865,-0.26662593881413155,-1.7376722607738841,-1.480980184749491,-1.1711515383124191,-0.8687958158925029,-0.6328780940248123,-0.5114857626803112,,, +23.96875,47,-0.5342919032825107,-0.7078894163345583,-1.0147228538249011,-1.4157845355976808,-1.8566552062298551,-2.2759485425904296,-2.6148443923848053,-2.8262260301248587,-2.881998374364745,-2.7774474152887434,-2.531961928722464,-2.186005125156271,-1.7948079539327848,-1.4197663811886931,,, +23.9765625,47,-1.1188825572416057,-0.9377386872496568,-0.902409426684546,-1.0154166669756612,-1.255356688010579,-1.5802576437633908,-1.9341443089154624,-2.2557874478252957,-2.488274882798412,-2.58791333752302,-2.5310743506236903,-2.3179177610772173,0.4618639243287936,0.014372099692222641,,, +23.984375,47,-0.2817952707917539,-0.33516178979232397,-0.12239697921131065,0.3051326784770976,0.8353013036929279,1.3258313104519708,1.6431838006804365,1.6990740220014784,1.4746049618890682,1.0254054543481712,0.4663650680693525,-0.059850249867189786,-0.4218727997611863,-0.5355889923730082,,, +23.9921875,47,-0.3871223829647342,-0.03654547639713779,0.3986962328599167,0.7761040630503782,0.9673307696166352,0.8935238761470196,0.547119700250273,-0.0058866263801704575,-0.6438190327764681,-1.2224483504516428,-1.6142927351664271,-1.7433216440109622,-1.6055541531278932,-1.2699083822860604,,, +24.0,48,-0.3289650553556649,-0.3870788605597363,-0.4603632918596913,-0.5476415995005031,-0.6474834185115633,-0.7582296903045854,-0.8780215933970066,-1.0048329767547846,-1.1365057279214144,-1.270787456710475,-1.4053708346808198,-1.5379339016349312,-1.6661806334287197,-1.7878810608122868,,, +24.0078125,48,-1.9009102368793327,-2.0032853708518066,-2.09320047804635,-2.1690579393418465,-2.229496417588116,-2.2734146421807777,-2.2999906453679886,-2.308696113499752,-2.2993056019559384,-2.2719004524280764,-2.2268673439857887,-2.1648915033195646,-2.086944693063421,-1.9942681885354472,,, +24.015625,48,-1.8883510409827624,-1.7709040079450755,-1.643829607223415,-1.5091888188010332,-0.4956232786313288,-0.6838183891848947,-0.8182640811929236,-0.8898927294438893,-0.8941465591415855,-0.8312931114706538,-0.7064038958438797,-0.5289977241137251,-0.3123736055839373,-0.07267973029758315,,, +24.0234375,48,0.17221652778632004,0.4039787799276017,0.6050847755549766,0.7600530498308703,0.8565275163023836,0.8861443604419736,0.8451207701764251,0.7345244361333663,0.5602050147756215,0.33239231950628445,0.06498924451298105,-0.2253912870607517,-0.5205782093880931,-0.8021027257753721,,, +24.03125,48,-1.0524793695996142,-1.256418398262798,-1.4018849926907544,-1.4809314177960793,-1.4902441316521546,-1.4313677087629586,-1.3105899796662095,-1.1384964136049978,-1.9724125877919536,-1.5386518131402378,-1.0740348125742427,-0.6403790427154858,-0.2943451202303321,-0.07866635917725584,,, +24.0390625,48,-0.015548529706309044,-0.10326757286837228,-0.3164949045707893,-0.6102993483501458,-0.9272020821414444,-1.2061854625334478,-1.3922522661216787,-1.4450461615655903,-1.3451904499974656,-1.0973575104482918,-0.7295906055135409,-0.2889834271530027,0.1656099250009413,0.5726993020745327,,, +24.046875,48,0.8776962490183576,1.0413797784899472,1.0459717706859857,0.8978758907602176,0.6266535724611341,0.28039669490797897,-0.0817822057119395,-0.3989724083452904,-0.6179636426816328,-0.7015413743163009,-0.6342866746581413,-0.4249773058189802,-0.3627789768075947,-0.4702846374283812,,, +24.0546875,48,-0.8351868295995613,-1.382377701474542,-1.9849934012832693,-2.4989999144279484,-2.8025004896308205,-2.8289931850010976,-2.5854649991705316,-2.1503647207171097,-1.6520110887219424,-1.2333547621781569,-1.0127524107577643,-1.0515039948706415,-1.337050509481407,-1.786437194797557,,, +24.0625,48,-2.2690928523960734,-2.6426817341186384,-2.7922014684786927,-2.6616106507225843,-2.2693169279256264,-1.7032795838513837,-1.097067512309698,-0.5934328668338712,-0.30538210941152955,-0.2854119405336508,-0.5113397319073978,-0.8926099335546995,-1.2953460006421291,-1.5792797436973751,,, +24.0703125,48,-1.3691650177659964,-1.2260257697603512,-1.0820831579034969,-0.9396533358573956,-0.8010160152320334,-0.6683745966921968,-0.5438176428429027,-0.4292823674736296,-0.32652078043978183,-0.2370690809427212,-0.1622208351013147,-0.10300440743365437,-0.060165041380512714,-0.03415190259763168,,, +24.078125,48,-0.02511031183707879,-0.03287930337174505,-0.056994551659938164,-0.09669661494870553,-0.15094435140960796,-0.21843327283098346,-0.2976185144278364,-0.3867420185012905,-0.4838634558942253,-0.586894343731417,-0.6936347619747412,-0.8018120258046697,-0.9091206365965804,-1.0132628118701568,,, +24.0859375,48,-1.1119888844420294,-1.203136863313348,-1.284670463485713,-1.3547149387133992,-0.9292248357245464,-0.6994724668345712,-0.4673245450200994,-0.25098622993834924,-0.06750623485559781,0.06841879184857191,0.14547574515443096,0.1565304575770814,0.0991315279892181,-0.02431256382591529,,, +24.09375,48,-0.20669542260506524,-0.436702503180432,-0.6995945373683037,-0.9782300048950386,-1.2542553612943177,-1.5093800369028518,-1.7266473091604937,-1.891612437579924,-1.9933459169695718,-2.0251918989216167,-1.9852289037599968,-1.8764007046887912,-1.7063082650876502,-1.4866772450063517,,, +24.1015625,48,-1.232538215729304,-0.9611767542946958,-0.6909266360617965,-0.4398902838872246,-0.22467570430712647,-0.059237990584087415,0.04609382009428165,0.085336674156544,-0.10521605044298354,0.27550003613012825,0.6575014080625533,0.9802560634702908,1.1918176502385305,1.256939937343066,,, +24.109375,48,1.1625936474057366,0.9200262237865034,0.5630435441612678,0.14278102760584752,-0.28022163801085304,-0.6454079608296596,-0.9015923838524214,-1.0148863493493328,-0.9739284148663314,-0.7916040647912022,-0.5029876182083863,-0.15982706915342298,0.17756884263268571,0.4497774120250993,,, +24.1171875,48,0.6075709246200252,0.6196375791776907,0.4775115120350976,0.19694375824103935,-0.18449966947879576,-0.6132387515256782,-1.0279762232387213,-1.3691981284412749,-1.5883986592915336,-1.655592710245538,-1.5639462596035274,-1.330803592536728,-0.9619325633692956,-0.35562621914668624,,, +24.125,48,0.2606505967106175,0.7459655527961229,0.9941792160925818,0.9628378988680434,0.6846260926983299,0.2582413426523743,-0.17880603971206271,-0.4880123262367597,-0.5679524917072537,-0.3821697152543572,0.03076218341973208,0.5677617587213114,1.0894647332815002,1.458415167274854,,, +24.1328125,48,1.5767559066682324,1.4130882394985596,1.0111388794403675,0.4778582609450548,-0.04578880401478291,-0.4233357397682269,-0.5600761530327949,-0.4288641088511915,-0.07738318637090069,0.3851062460099829,0.8179075696326229,1.0876537530814012,1.1050719485757945,0.8496687176988356,,, +24.140625,48,-1.4115900896669125,-1.4538398694341543,-1.4802580678729034,-1.4899096249758383,-1.4821471999486198,-1.4566227057695518,-1.4132936071522524,-1.3524238715231478,-1.2745795562490856,-1.1806191092679112,-1.0716785528387651,-0.9491518097301936,-0.8146665162076528,-0.6700557452166467,,, +24.1484375,48,-0.5173261347628585,-0.3586229794324145,-0.19619289617988692,-0.03234471796727599,0.13059070011627613,0.2903010585930463,0.4445328648124584,0.591130652970556,0.7280744863351722,0.853515085139622,0.9658059651938136,1.0635320246031956,1.145534078172892,1.2109289100432183,,, +24.15625,48,1.2591244935659054,1.2898301120599909,1.303061203369683,1.299138843531312,0.057270011146541074,-0.03448018846891443,-0.18169567639476625,-0.3721407967051633,-0.5904178429661763,-0.8190432613617673,-1.0396696477899896,-1.234368319458643,-1.3868830166531123,-1.4837673027882756,,, +24.1640625,48,-1.515326340195844,-1.4762973598666873,-1.366221364374052,-1.1894801337952174,-0.9549959432814042,-0.6756149204672366,-0.3672170311158842,-0.04761474386701445,0.2646828394967014,0.5517542208708308,0.7975085700481049,0.9888009481825876,1.1163419375472703,1.1753382616940171,,, +24.171875,48,1.1658197393951408,1.0926297889992762,0.9650801618180506,0.7962939977777251,0.6022830310567144,0.4008233121639563,0.21020786312496806,0.0479632643915755,-0.9949515761566626,-0.6105472808187243,-0.2386549269161176,0.062289520675252175,0.24560078190962745,0.2836327280534302,,, +24.1796875,48,0.172097567598272,-0.06925706508522644,-0.3997186387895481,-0.7639496607318258,-1.100609558353309,-1.3519156017541605,-1.4726536792850309,-1.4372354061631205,-1.243702319211688,-0.9140533978587057,-0.4908447929188432,-0.030591248555350614,0.4050031627896196,0.7586192948011651,,, +24.1875,48,0.9862111091711916,1.0638235987956,0.9912787350801692,0.7921555580853473,0.5100677480295722,0.20181871527504386,-0.07149940063911064,-0.2540761761757497,-0.30413186920819024,-0.20048192414918287,0.05410572741896158,0.4332837791942773,-0.7432512391967523,-1.1118565708197323,,, +24.1953125,48,-1.2221731374334115,-1.0573189666406744,-0.6747006599739941,-0.19009361068618064,0.2542619873217388,0.5288037229660578,0.5522987823777743,0.3142324982240653,-0.12220363574351067,-0.6373444752980107,-1.0877822279454208,-1.3456260486092733,-1.3335308395504706,-1.0458951951898892,,, +24.203125,48,-0.55041884782589,0.03040736619442438,0.5528063130851711,0.8910320206691258,0.9717247946286388,0.7938892178426752,0.4290207783440969,0.0013477096323337714,-0.34639538807671433,-0.4922801244564447,-0.3688069647463209,0.018378862431689846,0.5918096131447571,1.2231950755687144,,, +24.2109375,48,1.278683878728243,1.2426058084177392,1.1920866144228457,1.1285598192758657,1.0536851406395331,0.9693191857371904,0.8774826990688251,0.780324937037828,0.6800857934191534,0.579056338988751,0.4795384663889454,0.3838043469833435,0.2940564097391912,0.21238854303371899,,, +24.21875,48,0.140749198872969,0.08090704568794428,0.034419771257933274,0.002606582144381475,-0.013475118706711696,-0.013048467694762422,0.004369038554040028,0.03895687927945235,0.09058815447657742,0.1588315974484611,0.24295891989535645,0.34195736104557883,0.4545472212032469,0.5792040728122303,,, +24.2265625,48,0.7141852602326021,0.8575602243200107,1.007244120938582,1.1610341448450956,-0.07038031272923727,-0.13237984122263113,-0.12955486334885635,-0.0579865420472877,0.08140145213450732,0.2828998227143044,0.5364043478152859,0.8281131713581567,1.1414820768941625,1.4583711457957031,,, +24.234375,48,1.7603028553772715,2.0297439010508134,2.2513213718766547,2.412888486171044,2.506365583994869,2.528297744914807,2.4800901594812736,2.36790485357081,2.202225979073032,1.997123995708044,1.7692700653719116,1.5367693982202242,1.3178949140656864,1.129809533274045,,, +24.2421875,48,0.9873662035216692,0.9020693472277572,0.8812701573544348,0.9276518614772552,1.0390408528304325,1.2085568624801508,1.4250917035544006,1.6740832052584596,0.8911712546762879,1.3694419575393468,1.8063518968033847,2.146299907519873,2.348432635538916,2.3929538946003435,,, +24.25,48,2.2841559530168416,2.049700875448334,1.7362641090870108,1.4022190919795825,1.1085025251641132,0.9090833078597984,0.8425198517307378,0.9259209536855576,1.1522510229528606,1.491399539730946,1.8948483053460723,2.3032096497417016,2.655461575631532,2.898441491618393,,, +24.2578125,48,2.9951198893642403,2.9303653291528255,2.713302819066177,2.375898248762109,1.9679893296564552,1.5495369477408618,1.1813037500002168,0.9154117317497662,0.7872494186790115,0.8099890116485123,0.9725673283049971,1.241444853190742,2.1729747989122288,1.9770492769318555,,, +24.265625,48,1.5988023150832698,1.1671364272280491,0.8241900461434968,0.686174035034226,0.8113263766462585,1.1837694889117816,1.7176960575911144,2.280737698779816,2.730113171027264,2.9516501978997454,2.890987212490054,2.5684043956206697,2.073219902608952,1.5392875399045365,,, +24.2734375,48,1.1083114722153469,0.8910323188261701,0.9369221777377756,1.2206938678413697,1.6493212037352225,2.087645461779367,2.395549088473376,2.4665072870306783,2.256950312363608,1.7983876554379816,1.1889696020781662,0.5667971203163402,0.07229315245078237,-0.19005376725511933,,, +24.28125,48,1.3166479230170942,1.4717633052603205,1.6240588554517312,1.7712543345218787,1.911150466404718,2.0416672907461297,2.160880430904999,2.2670546422727944,2.3586740535713453,2.434468571676561,2.4934359876986947,2.534859397315756,2.5583196303978504,2.5637024723506707,,, +24.2890625,48,2.5512005507936664,2.521309854599555,2.474820946303499,2.4128050218090467,2.3365950615340743,2.247762403089661,2.1480891457486573,2.0395368699407688,1.924212219539152,1.804329949620016,1.6821740867655597,1.5600578820197015,1.4402832577428293,1.3251004584791737,,, +24.296875,48,1.2166686123596435,1.1170178936316546,1.0280139488597175,0.951325209701428,1.9385303690578517,2.2001789573986867,2.440794839683812,2.64343629983217,2.7936365813031454,2.8804142040903105,2.8970405973761086,2.841511513877943,2.716689347372085,2.5301064230539607,,, +24.3046875,48,2.2934429710715105,2.0217161781808173,1.732236859195121,1.4434064937616726,1.1734385051657459,0.939092940015292,0.7545127725242236,0.6302429698983725,0.5725007101912046,0.5827476297976221,0.6575939157113472,0.7890409165828097,0.9650453401413184,1.1703656788737342,,, +24.3125,48,1.3876318247631882,1.5985632698396868,1.7852509276006647,1.9314131735598392,2.0235385007269846,2.0518350922724324,2.0109210777369957,1.9002073219541549,1.5658687308279071,1.885819762703696,2.1414054064411125,2.282235539171591,2.2753204190811718,2.110260443177022,,, +24.3203125,48,1.8009191062587568,1.383318317360901,0.9100836103667912,0.4423041518321825,0.040075103637978726,-0.24680487457079905,-0.3865323634180815,-0.37019533637823104,-0.21310441676079056,0.04764782297416825,0.35901908402541355,0.6603324093612364,0.8927787116466659,1.0086264313556128,,, +24.328125,48,0.9787036217995291,0.7969868480096198,0.4815819282875421,0.07194355076317127,-0.37723337253253103,-0.8044993410307395,-1.1511913716532025,-1.370543643729368,-1.4349487789383202,-1.3402388814438349,-1.1063196315780526,-0.7740587372429532,0.4516990018032469,0.8355069457802371,,, +24.3359375,48,1.0813055411336674,1.0900616168441524,0.8284354488635571,0.33814069345790804,-0.2752758184830513,-0.8711611833376534,-1.3121189515345075,-1.5014946971648668,-1.4097124511074792,-1.0822453034302797,-0.6270368330436892,-0.18482175267331705,0.10951922125191438,0.16397821181694094,,, +24.34375,48,-0.045333404809767,-0.4676304823154871,-0.9913878549020626,-1.4749433001616508,-1.7853819226761911,-1.835044276921049,-1.6056516147005424,-1.1534352296093249,-0.5938629001049396,-0.07014708914083058,0.2858356617958999,0.3895049822059328,0.22656272398823885,-0.1432930810284852,,, +24.3515625,48,0.8883936646226576,0.8404096013354216,0.8082907622229671,0.7926662777352709,0.7938656590748563,0.8119130429026329,0.8465267888252528,0.8971244366980369,0.9628329369221784,1.042503974584072,1.1347341190838982,1.2378894464107044,1.3501342028951968,1.4694630085058726,,, +24.359375,48,1.5937360357752601,1.720716548328702,1.8481101416822905,1.9736049991532163,2.094912457955868,2.2098071751226773,2.3161661898849646,2.412006198482918,2.4955183886572083,2.565100223809853,2.619383620228791,2.657259023921161,2.677894965402753,2.680752749961285,,, +24.3671875,48,2.665596026090875,2.6324950644730696,2.5818256724973367,2.5142627632402124,1.7239460364191452,1.4909418060280393,1.2139451649341764,0.9087709921377952,0.5932031866629018,0.2857619856920135,0.004419867466236904,-0.23464443368837395,-0.4181669303396319,-0.5367162482058233,,, +24.375,48,-0.5853443660354475,-0.563924866725344,-0.4771551277460657,-0.33422231314398465,-0.14815647313640934,0.06508412415272044,0.2877316324779485,0.5014532193659059,0.6886348082289939,0.8336144393272038,0.9237792320429516,0.9504494431080424,0.9094879625361268,0.8015927358148139,,, +24.3828125,48,0.6322517121695634,0.4113634525759686,0.15254984653698914,-0.1277911423521164,-0.4116266526394187,-0.6805444500733502,-0.9170352537760292,-1.1057124461240764,-0.398913430065371,-0.04228958340802103,0.2380216798273741,0.3968403568996013,0.4086257173883128,0.2714416238052271,,, +24.390625,48,0.007241479223425106,-0.3415714819821071,-0.7187726897588126,-1.0631009606453985,-1.317831025153987,-1.4396427165621024,-1.4054052096457512,-1.215819424381133,-0.8953510525853926,-0.488464407249678,-0.05274344861598987,0.3500288310897728,0.6634434954166185,0.8452004370983954,,, +24.3984375,48,0.8736446288186149,0.7510860796933237,0.5033866843327235,0.17587860468317154,-0.17374979133681107,-0.4844920922314186,-0.7015780776331416,-0.7850556194562642,-0.7160632950462011,-0.4998164483955749,-0.1648413415004169,0.24142357279010196,-1.2368186977367115,-1.2042272274577643,,, +24.40625,48,-0.9049212726061562,-0.4049292628515173,0.17410847186934966,0.6880690592771143,1.0096471604254995,1.0630567149455352,0.8446254701472025,0.4236396539461568,-0.07679114023477351,-0.5136030774382065,-0.7630974476125347,-0.7549329342842569,-0.4914736269269078,-0.04718936206956509,,, +24.4140625,48,0.4517277648014154,0.8619445169164777,1.0622877130471868,0.9869941134143101,0.6437958806338289,0.11188441161461274,-0.4796901281623464,-0.9872644422072026,-1.2917942386776655,-1.3313217848423684,-1.1177819320682516,-0.7335421672272355,-0.30862667605161165,0.01513154479440515,,, +24.421875,48,2.4307686914222253,2.3325765604882696,2.2211687930077755,2.098251339535445,1.9657239774288695,1.825647219594037,1.6802064124806866,1.5316736518621834,1.3823681831536736,1.2346159795379497,1.0907092055810494,0.9528662760123964,0.8231932089214147,0.7036469499654605,,, +24.4296875,48,0.5960013096529715,0.501816110026486,0.4224100808619855,0.3588379798473489,0.3118723372451443,0.2819901445593541,0.2693647201653143,0.27386289420619137,0.2950475619204761,0.33218556056259074,0.384260731862209,0.4499919411685894,0.5278557376334876,0.6161132585231845,,, +24.4375,48,0.7128409064297131,0.8159642620965918,0.9232946389096356,1.0325676388522218,-1.2343841145116363,-1.2949026697345076,-1.2837327951908166,-1.202198121951347,-1.056389427395871,-0.8567407573170346,-0.6173030273288413,-0.35476575432232904,-0.08729513161456727,0.16673053245335806,,, +24.4453125,48,0.38999983629676016,0.5674725834950957,0.6874253855296711,0.7422656636347282,0.729057295554779,0.6497212615950236,0.5108973083777357,0.3234762876767382,0.1018357932154862,-0.13716759112122162,-0.3753791453624067,-0.5946176120008947,-0.7779488527908631,-0.9108727335390056,,, +24.453125,48,-0.9823404570941632,-0.985531387682938,-0.9183351808019079,-0.7835055825003782,-0.5884751571202333,-0.3448438468093159,-0.06757701064397084,0.22603115009699176,0.659974374202413,1.0293923344178586,1.2953734661539291,1.4191528871530708,1.3835120471100928,1.1954333308687182,,, +24.4609375,48,0.884988722588797,0.5006357622038666,0.10165358969331416,-0.25110270046792915,-0.5046892603282376,-0.622324507540568,-0.5891187876904023,-0.4143902406401848,-0.13020616939240942,0.2136228711333228,0.5573165195956826,0.8404547634877021,1.0114114936499905,1.0354220227325155,,, +24.46875,48,0.9000278803649796,0.6170506821873099,0.2207874670915001,-0.2372915937004241,-0.696517454124032,-1.0964265978591483,-1.3861310315274211,-1.5321946804806073,-1.5237896483478113,-1.374329487244304,-1.119325358553104,-0.8107992763142244,-0.4560113110114966,-1.0362811637856186,,, +24.4765625,48,-1.6471516068249317,-2.1457423683064247,-2.4189932698590293,-2.4144274299730406,-2.154318567762301,-1.7293815686179468,-1.273717442196765,-0.9278813035602556,-0.8001970065778578,-0.9369224586391148,-1.3094437854379597,-1.8220092509578192,-2.3378843292699694,-2.7167604522423767,,, +24.484375,48,-2.8531654669412805,-2.705349096378522,-2.3067270071940293,-1.7567470421838314,-1.1936807341380018,-0.7567967485040493,-0.5482827935974256,-0.6053512765489295,-0.8901727331914867,-1.3003948204181288,-1.6973626033159244,-1.9443043165791176,-1.9440153966941407,-1.6657109597389974,,, +24.4921875,48,1.1414830346794065,1.2477452798357909,1.3491039366628832,1.443393314859602,1.5285706259951548,1.6027519858567865,1.664245634094092,1.7115817893566223,1.7435386170241371,1.7591638547033916,1.7577917166961914,1.7390547813087085,1.7028906527242968,1.6495432806580774,,, +24.5,49,1.5795589145555518,1.4937767630448673,1.3933145220696588,1.2795490249707346,1.1540923532088143,1.018763825900946,0.8755583585044242,0.7266117445692807,0.5741634683421695,0.4205176992568817,0.26800315117390744,0.11893250911076148,-0.02443786620963606,-0.15994725054650671,,, +24.5078125,49,-0.2855681968153918,-0.3994418452768124,-0.4999102850709585,-0.5855454005511023,0.5175565137615805,0.7887227196301629,1.0226685290401658,1.205116506335366,1.32536154095081,1.377010294950828,1.3584200290099429,1.2728062230206514,1.1280115033399671,0.9359520066663404,,, +24.515625,49,0.7117798036638038,0.4728198052464632,0.23735530014630815,0.023346827482684903,-0.15282626357886353,-0.2775137974497525,-0.3407522323334613,-0.3369648166463821,-0.26535560436486305,-0.12996984076597906,0.060583504351885635,0.2937277187376441,0.5537912961213219,0.8230969876723584,,, +24.5234375,49,1.0831910229227435,1.316126791436334,1.505713478044603,1.638642587661777,1.7054138100495593,1.7009956668125903,1.6251748765902074,1.4825700802823951,-0.50912488381517,-0.273566893747174,-0.1529930153547987,-0.1782053277807717,-0.3570858215322665,-0.6733125070001318,,, +24.53125,49,-1.088846351291189,-1.5498019737611723,-1.9947879863968927,-2.3644181975916574,-2.610512520866922,-2.703554750026745,-2.6372458529709704,-2.4294438119463537,-2.1193438385292387,-1.7613383580801143,-1.4165132857526266,-1.1431052592006152,-0.9874063117487504,-0.9765327599514992,,, +24.5390625,49,-1.114184698990342,-1.3800566765463027,-1.7329914051923956,-2.1173853546807915,-2.471848547149869,-2.7387697531801427,-2.8732972445816602,-2.8503362688503153,-2.6684732954212214,-2.3502157347584114,-1.9385096956602,-1.4900780416467152,0.10771340325707046,0.5788064488741528,,, +24.546875,49,0.8028411050390061,0.752409146247728,0.4749968887562826,0.07973136327184642,-0.2927612047557672,-0.5091216601969445,-0.4800222748151,-0.18485129981529916,0.3224493568961944,0.9279949083041836,1.4890140486732433,1.872840626324297,1.9931553574616292,1.8335458101854096,,, +24.5546875,49,1.4519283795266902,0.964620931072366,0.514431729084137,0.2315107154651897,0.19769262036013213,0.4241041711943899,0.8481721700208398,1.35085181176132,1.789352659019475,2.0363920585625825,2.015216630017221,1.7207921341243009,1.2213527048263404,0.6398831973499266,,, +24.5625,49,-0.6551736974309907,-0.7078966741388247,-0.7431063817799506,-0.7604959003532089,-0.7600645478777571,-0.7421177313153808,-0.7072614419884509,-0.6563914919689884,-0.5906776799947386,-0.5115431642533189,-0.42063940329408267,-0.3198171039326421,-0.21109368492469271,-0.09661782619013977,,, +24.5703125,49,0.0213682755945852,0.1405682840728228,0.2586720433911183,0.3733961354247573,0.4825239638328809,0.5839446630108934,0.6756901506007819,0.7559696747150955,0.8232012509089721,0.8760394383967249,0.9133989691078644,0.9344738158053224,0.9387513653450272,0.9260214488730676,,, +24.578125,49,0.8963800708124452,0.8502277713197317,0.7882626508614855,0.7114681790304492,1.2823089725822396,1.0373913570169118,0.7637825424319407,0.4793003021680615,0.20237301189989504,-0.04924443563243097,-0.25970739721242264,-0.4161846857937186,-0.5097512903144432,-0.53600836050743,,, +24.5859375,49,-0.4953872280302397,-0.3931162691629405,-0.2388529262395591,-0.046006555279141936,0.16920067228647848,0.3888693188628613,0.5946754861161996,0.7691535044419044,0.8969190497767182,0.9657473845903456,0.9674315219508706,0.898360457611178,0.7597771350650233,0.5576981412213078,,, +24.59375,49,0.30250071845718296,0.008205877415168372,-0.30849241364706304,-0.6293842806616304,-0.9360065675968531,-1.2109230016610613,-1.4389326462905738,-1.6081223892823218,-1.066616243390519,-0.7252171653386844,-0.5095160046471823,-0.4429344163660792,-0.5250758837552191,-0.7318335549330164,,, +24.6015625,49,-1.0191935173283055,-1.3301408851887186,-1.603592784826212,-1.783966612569365,-1.8298929849416796,-1.7207160123342833,-1.4597681579821409,-1.0739093153581651,-0.6094016022745509,-0.1247621004022933,0.31829352962310953,0.6644062691307543,0.8731398100909941,0.9252235439214732,,, +24.609375,49,0.8255003682297349,0.6021204433619933,0.3021067344094029,-0.0160167227619048,-0.2913854086221689,-0.4703167272248054,-0.5147108594838009,-0.4080213917021461,-0.1578655852285722,0.2051324359719654,0.6320855420754582,1.0634357408252422,-0.27923314842256963,-0.08481751661307713,,, +24.6171875,49,0.3016486775030649,0.7561082282140907,1.1359393573767638,1.319266768897171,1.2385821368446497,0.8994575810116094,0.3792213122503281,-0.1940435197161573,-0.6764228233332716,-0.9474485031033364,-0.9429652906081044,-0.6725810908644558,-0.21691950067141544,0.2945713990452997,,, +24.625,49,0.7191711164692963,0.9400552068356712,0.8983446902261225,0.6092523229954007,0.157900398151743,-0.3240436187125797,-0.694509849064043,-0.8400410090792908,-0.7069861213333676,-0.3163227760979126,0.241955473791355,0.8333495917604237,1.3155472405717241,1.5772420108170746,,, +24.6328125,49,0.6210960010523112,0.5186440430251082,0.4058302992619691,0.28456276070673353,0.15690601097510376,0.025045074921317332,-0.10875284725939316,-0.2421780903459395,-0.3729189834979453,-0.4987023502925144,-0.6173333402240535,-0.7267338942024264,-0.8249791704925182,-0.9103312932612482,,, +24.640625,49,-0.981269832762174,-1.0365184834216326,-1.0750674726599834,-1.096191308030103,-1.0994615518838329,-1.0847543998356102,-1.0522529302785937,-1.002443985512733,-0.9361097390446944,-0.8543140966566971,-0.7583841693032591,-0.6498871421818001,-0.5306029449308143,-0.4024932014369792,,, +24.6484375,49,-0.267667002859739,-0.12834410311814715,0.013183818793100474,0.15459315144538985,-1.7106900895910693,-1.743480999178415,-1.7082000706711438,-1.611285363203752,-1.4634513915630216,-1.2789342796784189,-1.0744913735998154,-0.8682250913735785,-0.6783130436202927,-0.5217329945382922,,, +24.65625,49,-0.4130715926557417,-0.3634999589044532,-0.3799875838449653,-0.4648093675086771,-0.6153801932378864,-0.8244285865396845,-1.0804973640984643,-1.368736375574084,-1.6719320718075648,-1.9717021178699548,-2.2497717597662445,-2.489242952100206,-2.675767758193879,-2.7985442089520944,,, +24.6640625,49,-2.8510651865975087,-2.83156812111053,-2.7431541497862404,-2.5935684389948084,-2.3946569947291865,-2.1615378472374074,-1.911544411870589,-1.6630147143644047,1.4382121948668,1.703513211570434,1.8227353986367956,1.7812682935586146,1.5887675198740063,1.2776524145732515,,, +24.671875,49,0.8980621084954126,0.5100556352287088,0.17427088040861605,-0.057502793330929676,-0.15036998497309662,-0.09173975977270997,0.10674135395382822,0.4110347916357353,0.7700461920076489,1.1236211098598154,1.4119546201702424,1.584948996643304,1.6100617223408338,1.4774212170491643,,, +24.6796875,49,1.2014132230560337,0.8184904954021894,0.3815466751562194,-0.048269635478100585,-0.41102588021804587,-0.6572867669916821,-0.7557603889828791,-0.6981186153473729,-0.5002412397323184,-0.1996903906417612,0.15019113990978522,0.4886381561089088,0.9064148644412808,0.4805861914052172,,, +24.6875,49,0.17628559156660514,0.09978727521161436,0.2944742463427128,0.7287184039659734,1.304322723280201,1.8832138864494663,2.3250717808805934,2.525584745278195,2.4448478561430917,2.1181229375215773,1.6460129757921582,1.1667453761595836,0.818161773947303,0.6998330722343103,,, +24.6953125,49,0.8456838793600779,1.2146300218317116,1.701795769957825,2.167236930919884,2.474297925763952,2.5270903731569456,2.2968212630226392,1.829754589013134,1.234623822771854,0.6529443220221154,0.2203611879579732,0.02962481909514358,0.1053401337628389,0.39740846417786974,,, +24.703125,49,0.2935688983805357,0.4278450703891261,0.5552442154751792,0.6737153944313516,0.7813699371680056,0.8765143537921488,0.9576798242697236,1.023647750400594,1.0734709227956387,1.1064899323267126,1.122344538787711,1.1209797978127076,1.102646838874629,1.0678982808537862,,, +24.7109375,49,1.0175783655609651,0.9528079820920748,0.8749648443509457,0.785659168949299,0.6867052794814378,0.5800896344999131,0.4679358391470244,0.35246725320344674,0.2359678504139177,0.12074201456533645,0.009073976410727769,-0.0968123981705093,-0.19479276454755326,-0.2828797144872269,,, +24.71875,49,-0.35925779481133063,-0.4223155162569881,-0.4706737919313752,-0.5032103072771573,-1.4340109163568835,-1.2410584364950838,-1.0979925952357863,-1.0149932126373211,-0.9978744810584356,-1.0476796327246354,-1.1606086669680378,-1.3282841758185893,-1.5383367291174173,-1.7752689956075711,,, +24.7265625,49,-2.02153833848008,-2.2587823881527984,-2.4691021239802007,-2.6363129855396017,-2.747076762764808,-2.7918353271005762,-2.7654810833862533,-2.6677173807357444,-2.5030837401381225,-2.2806441292112667,-2.013360010692905,-1.7171918723335817,-1.4099918791277914,-1.1102648539390216,,, +24.734375,49,-0.8358839739064797,-0.6028507273418223,-0.4241855888835823,-0.3090267548658924,-0.26199977172322864,-0.2829019996496034,-0.36672389892745816,-0.5040056383167719,0.7569757936014347,0.9078048103085284,0.9124285238695772,0.7653643707666904,0.4852371601288346,0.1119146789732341,,, +24.7421875,49,-0.2996684060711229,-0.6880365744485117,-0.9947215983604272,-1.1733457856657932,-1.1968256870600396,-1.0615743640897284,-0.7880477848647953,-0.4175503155430834,-0.005796920686755108,0.3857651755442909,0.6995236605830061,0.8906670109498618,0.9341526256203146,0.8285919448012657,,, +24.75,49,0.5964474999859248,0.2805112974443702,-0.06278684108544039,-0.3721985867941985,-0.5912302565699741,-0.676978572589761,-0.6068526272777118,-0.3821348710310909,-0.027826264216526345,0.4112005177116789,0.8771409093846143,1.308210649833908,1.3510211909742662,1.2900622631134322,,, +24.7578125,49,0.956260555177294,0.4062617666841575,-0.2441166520343471,-0.8513812724084809,-1.2834454658543872,-1.4555899326256827,-1.353447403835788,-1.0367141670490478,-0.6225731892761437,-0.25337395937499685,-0.05742882114582204,-0.11367200392973564,-0.429868765126563,-0.9403482232540944,,, +24.765625,49,-1.5238824333655576,-2.036812596204085,-2.352344321458963,-2.395242916177973,-2.1624201820179456,-1.7237707128417266,-1.2030284952389243,-0.7438902418565508,-0.4706896276928768,-0.4543998313166256,-0.6932812580244252,-1.11347732830859,-1.5893938693798764,-1.978275387022784,,, +24.7734375,49,-0.5190793946952792,-0.5177270646893981,-0.4989009302027807,-0.4626548502395961,-0.4093482113259157,-0.339639859257858,-0.2544767872570645,-0.15507777846643234,-0.042912289075590186,0.0803250583094195,0.2127439245619181,0.35229113166507875,0.4967863925280162,0.6439602674855274,,, +24.78125,49,0.7914936830078398,0.9370583207740084,1.0783571700322203,1.2131645333103702,1.339364785100706,1.4549892049948752,1.5582502404427332,1.647572599325203,1.7216206280386417,1.7793214958208343,1.8198837794917009,1.8428111233068536,1.8479107348627375,1.83529656840868,,, +24.7890625,49,1.805387139942182,1.7588980124609646,1.6968290830668398,1.6204468946357722,-0.6815041415602712,-0.8831240399892911,-1.091047596019254,-1.2869847872839864,-1.453456361886401,-1.5750203759639412,-1.6393566659045828,-1.6381336142190408,-1.5675967494718623,-1.4288381181613692,,, +24.796875,49,-1.2277276273397466,-0.9745111287885432,-0.6831032549286078,-0.3701243028344165,-0.0537483113102214,0.24755735756222474,0.5163130549208951,0.7372391840326712,0.8983153160420051,0.9916122412982412,1.0138389484032326,0.9665664016151884,0.856112524561798,0.6930964228011126,,, +24.8046875,49,0.4916929421786368,0.26863955583763965,0.04206484298792632,-0.1697797371758905,-0.3497963301667529,-0.4832364081218832,-0.5587323401164966,-0.5690928696361811,1.648216257581958,1.855253406186156,1.9081786611091929,1.809846855184416,1.5866101529566063,1.2841571185428455,,, +24.8125,49,0.9603401665604212,0.6761088505738746,0.4859614674203847,0.4294024772726157,0.5247365733460321,0.7661662833421462,1.1246454345134198,1.5523558095296282,1.9901099787947076,2.376527515678108,2.657555574402642,2.7948511598402517,2.771719700720457,2.5956851400942984,,, +24.8203125,49,2.2972913986515344,1.9253220319826216,1.5391827692904063,1.1996334977823728,0.9593133195500964,0.8545345173835887,0.8996236059588841,1.084690901910626,1.377176015301781,1.7269285242533134,2.0740324500693705,2.358155768025547,-1.7114586031984422,-1.170025340627623,,, +24.828125,49,-0.5729524754143448,-0.06422224601614313,0.2368638529995644,0.2681539572150113,0.04145177140818634,-0.3609442885935118,-0.8090181036206824,-1.1608844269295564,-1.301881984282237,-1.1761949088464831,-0.8023341795345491,-0.2682343360550665,0.29269228324351354,0.7379824164132193,,, +24.8359375,49,0.9550476428871276,0.8919317725940171,0.5714711175640376,0.08497748502499802,-0.43282425963748977,-0.8407348549699657,-1.0297716149383125,-0.9530077462269008,-0.6383822273944112,-0.18096992802621012,0.2831688223923497,0.6143912927048272,0.7078759194196341,0.5224998855066838,,, +24.84375,49,1.531262281883949,1.4310037433571403,1.32158700569941,1.2050813132360243,1.0836730332388629,0.9596272142414346,0.8352477706181436,0.7128369906807714,0.5946550774013702,0.482880430289581,0.3795713639726291,0.28662993387389635,0.20576850247609213,0.13847963167729638,,, +24.8515625,49,0.08600982849859118,0.04933760392895548,0.029156229169947312,0.025861491283749486,0.03954466271134971,0.06999080782683609,0.11668245624194352,0.1788085785971768,0.2552787077316031,0.34474195802049623,0.4456106099026565,0.5560878466818813,0.6741991579698399,0.7978268599451663,,, +24.859375,49,0.9247471280120704,1.0526688934540078,1.1792739230370597,1.3022573797915522,-0.5118070222418791,-0.38922129933776217,-0.20837779755097274,0.019475461229086662,0.2796678454929739,0.5551284541154148,0.8275761906303031,1.078794584243751,1.2919024595365238,1.452531845482051,,, +24.8671875,49,1.5498309820782823,1.5772224785653306,1.5328637504659883,1.4197776229120642,1.245643987295233,1.0222670333247568,0.7647552009865322,0.4904710290843644,0.2178241221836023,-0.035008603088281236,-0.2513461610739958,-0.41716215012426494,-0.522058030373966,-0.5599831683714545,,, +24.875,49,-0.5296514500293632,-0.4346254231647133,-0.2830621156383885,-0.08713826802780232,0.1378049243319666,0.3743379051749094,0.6041646322642225,0.8094050126003611,2.52796863612627,2.5491633009170838,2.4098264160438605,2.122326866009409,1.7214248978109254,1.2588968969814829,,, +24.8828125,49,0.7955128348392491,0.3916157336867492,0.09777022538116564,-0.053063496218224704,-0.05061162856597101,0.09116666294144883,0.33630866452493496,0.6325060099212914,0.919309522931944,1.1376027713894397,1.238868485193989,1.1928042514105683,0.9921010075801364,0.6536397644131425,,, +24.890625,49,0.21591987106723592,-0.2668809027774757,-0.7332895761783416,-1.1240590033156197,-1.3913440704271745,-1.5061040591845118,-1.4625784653968252,-1.2791393744474455,-0.9953878518342926,-0.6659468070474319,-0.35191731510745616,-0.11132929224617603,-1.0639286376127353,-1.5114002202460275,,, +24.8984375,49,-1.72262148595041,-1.6600382946995145,-1.361198479792241,-0.9282335670953764,-0.4996392976317081,-0.21209122313494533,-0.1627627213518843,-0.3824750495265322,-0.8270402682085963,-1.3891716788948418,-1.9276993934019409,-2.3060857304995097,-2.429686209929664,-2.271545570516168,,, +24.90625,49,-1.879660292947949,-1.363718417773682,-0.8649519302247609,-0.5173651359448964,-0.4109658395211416,-0.5670770290700099,-0.9324956609918996,-1.3940995070180564,-1.8098986172913327,-2.048020770596647,-2.022945611276945,-1.7190560260543553,-1.1950510859006724,-0.5680099654708879,,, +24.9140625,49,1.419368154788322,1.5284482637162575,1.6274706184493517,1.7145745122412976,1.7880981972095158,1.8466079836939822,1.8889233519617068,1.9141376365559448,1.9216339211066236,1.9110958652780303,1.8825132742684487,1.836182313326596,1.7727003635148666,1.69295560877512,,, +24.921875,49,1.5981115366085583,1.4895866237335902,1.36902956239965,1.2382904611112782,1.0993885239996102,0.954476774742804,0.8058044426688264,0.6556776696206115,0.5064192255556186,0.3603279382052333,0.2196385471330464,0.0864826850799193,-0.03714833024094821,-0.14943824244949122,,, +24.9296875,49,-0.24877753256498256,-0.3337914702487529,-0.4033640491249408,-0.4566573871404394,0.9738484536408936,1.0840911001614677,1.1304774371285853,1.1077805809239585,1.0155738031853163,0.8582673627340581,0.6448080600987545,0.3880624485233867,0.10392669497070828,-0.18977485375240036,,, +24.9375,49,-0.4745256103200706,-0.7324010225996649,-0.9473116459067208,-1.106118345015847,-1.1995418756956715,-1.2228034338666347,-1.175951520630777,-1.063852345291645,-0.8958444506623113,-0.6850816594030178,-0.4476101740379973,-0.20124420114194946,0.03568148077826544,0.24559500961811925,,, +24.9453125,49,0.4129174703780835,0.5251536827808471,0.5737676708105118,0.5547817546606479,0.4690574789324277,0.3222387781936453,0.12436133498286163,-0.11084463645653576,0.00992596062559692,-0.014731095238974534,-0.1884067734472432,-0.4902326523119449,-0.8786022094003467,-1.297641536432156,,, +24.953125,49,-1.6859063242933636,-1.985950533653522,-2.1532763759413616,-2.1632715725934357,-2.01505333158389,-1.731620254682579,-1.3562884278288516,-0.945966685243092,-0.5623183339658494,-0.2621858018373927,-0.08876945764507682,-0.0649343688760805,-0.18968730898355124,-0.4383725279640931,,, +24.9609375,49,-0.7665555691525152,-1.1169899697483598,-1.4285814957190943,-1.6459534249784076,-1.7281227674867263,-1.6549357797082354,-1.4302601265639412,-1.0814362087213087,-0.6550728247167459,-0.2098417249850584,0.1926069467617747,0.4971936461710509,0.5950559682655621,0.4908169350116317,,, +24.96875,49,0.18300169369002092,-0.20986349773036705,-0.5454554655466378,-0.6969040379233222,-0.5878093072627594,-0.21342688130501894,0.3577872979082785,1.0026981190391244,1.5770044824686298,1.9545616122984053,2.0617374314614807,1.8973888535568817,1.5329848840106957,1.0928444601748812,,, +24.9765625,49,0.7199067712138546,0.5364167557621203,0.6103019040191396,0.9364564957917216,1.4380635364486651,1.9875927248453824,2.4417199753194785,2.680598329687609,2.640717301660309,2.33234470617475,1.8367702978381528,1.2841060579155883,0.8177266112284199,0.5550946040817789,,, +24.984375,49,-0.4931262523426138,-0.512527459807673,-0.5149239752595132,-0.5006836536103443,-0.4704726345955191,-0.4252435112341685,-0.3662184783750133,-0.29486775649153074,-0.21288366861671165,-0.12215082442935175,-0.02471293366658966,0.07726316994151036,0.18152566416653254,0.28577736535565745,,, +24.9921875,49,0.3877161531032869,0.48507548457772504,0.5756642889885433,0.6574055435252762,0.728372855196132,0.7868244078977981,0.8312336801877138,0.8603163957719802,0.873053234682682,0.868707907353029,0.846840274986596,0.8073142863586256,0.750300591947838,0.6762737894988049,,, +25.0,50,0.5860043491130653,0.4805453591312433,0.3612143247532506,0.22957033796693335,-0.3669095682775474,-0.6257710772705218,-0.8690319165954571,-1.0792416243784426,-1.241112499250027,-1.3425851116998215,-1.3756690516427827,-1.3370002852544238,-1.228076255053955,-1.05515232835883,,, +25.0078125,50,-0.8288068136710068,-0.5632048755332941,-0.27511267435803843,0.017269525501327432,0.29557391302370883,0.5425430375517984,0.7432299593203534,0.8860369601775772,0.9635203896835096,0.972905530595068,0.9162755897466084,0.8004216452888456,0.6363640245133438,0.4385784993140845,,, +25.015625,50,0.22398127096669612,0.010743536881270556,-0.18298168366656875,-0.3403316688135423,-0.4469163354750265,-0.49182833988215796,-0.4684104848515003,-0.3747269047127716,0.663935835234067,0.6741240525453998,0.5331859671545073,0.2697925929243584,-0.06865386517081991,-0.4234474916543474,,, +25.0234375,50,-0.7337643608003187,-0.9461755100169283,-1.023005279181605,-0.9482329640617788,-0.7300183897328562,-0.3994578690818232,-0.005764166676519071,0.3913789131690598,0.7310966089076363,0.9607926213045234,1.0443330259597077,0.967670038673488,0.7410297290683286,0.3973229400674617,,, +25.03125,50,-0.012973094609774636,-0.4296652563185687,-0.7922044702657546,-1.04909727661373,-1.165903239825647,-1.1305726748716016,-0.9552934475121468,-0.6745593542376976,-0.3397611137493869,-0.011142640001480908,0.2516243463478486,0.3987790956106182,1.2182448838846156,1.6644801520038992,,, +25.0390625,50,2.002076097111499,2.1180325018714474,1.9591088270583328,1.546640306836662,0.970919536127984,0.36668124645491657,-0.12359300288077968,-0.38849529412470973,-0.3779995924784737,-0.11695327601003568,0.30194363432474025,0.7437454066967935,1.0684337429860076,1.1694673494363563,,, +25.046875,50,1.003141040591444,0.6007064604408399,0.05993118720982076,-0.481591518664979,-0.8840682811595054,-1.0437552156689431,-0.9213490738779484,-0.5527391298460242,-0.03917319592778595,0.4804670811916537,0.8676833917639694,1.0222514971641885,0.9096014755798728,0.5701842312909965,,, +25.0546875,50,0.08738701841140656,-0.06337830116239562,-0.2206186054015975,-0.3821138470960128,-0.5455695765432921,-0.7086568732640448,-0.8690528810113528,-1.0244812364369345,-1.1727516836493221,-1.311798181154082,-1.4397148340545312,-1.5547890224879513,-1.6555311463486233,-1.7407004656077532,,, +25.0625,50,-1.8093265839041568,-1.860726199360005,-1.8945148294555456,-1.9106133047903058,-1.909248918160401,-1.890951208963592,-1.8565424568788318,-1.8071230514055985,-1.7440519935713168,-1.6689228713499469,-1.583535729586698,-1.4898653271154003,-1.390026337004144,-1.2862360993986428,,, +25.0703125,50,-1.180775579280224,-1.0759492128848926,-0.9740443459953424,-0.8772909744492845,-0.2137051549814175,0.007060717613462497,0.2758324085111815,0.5775384916928994,0.8948179127304356,1.209223089382858,1.5024987408482429,1.757847286043881,1.9610925879545011,2.1016609097583787,,, +25.078125,50,2.173310694812921,2.1745602978564684,2.1087838574813813,1.9839686413752449,1.8121508022205324,1.6085689073839708,1.3905942857877196,1.176512798324515,0.9842429985516524,0.8300800857403756,0.7275532533872618,0.6864761284117398,0.7122565309927762,0.8055137012317711,,, +25.0859375,50,0.9620296976669166,1.1730383692298014,1.4258317615888696,1.7046416824884103,1.9917349623428664,2.2686460440347536,2.5174609587513803,2.7220631607062877,0.39826920016257095,0.2407918332557607,-0.058706598918819915,-0.4633062351698013,-0.9198107755817188,-1.366978675352278,,, +25.09375,50,-1.745006749240703,-2.0047893539749877,-2.1155112732438193,-2.069391965325339,-1.8828425230250492,-1.5938554323517495,-1.2560339741238797,-0.9301915008173912,-0.6748293190997412,-0.5369765634721819,-0.5448190549957066,-0.7032654844390351,-0.9931417433725724,-1.3741391103085716,,, +25.1015625,50,-1.7910573018576734,-2.1823701908028896,-2.489780208893718,-2.6672734419385544,-2.688265176352873,-2.5497230596727976,-2.272625770532735,-1.8986858372595232,-1.4838471022732558,-1.089569674621231,-0.7732598023292127,-0.5793352584122661,-0.6289930172127454,-0.6728835858851364,,, +25.109375,50,-0.4402066152414797,0.022322160985432996,0.6055715688407389,1.1676883630260997,1.5727534804004561,1.7278087711505217,1.6081084351133708,1.2636766569797817,0.8053763353180923,0.374309166069936,0.10293566849020963,0.07857298944472313,0.3192765584243731,0.7687175201905161,,, +25.1171875,50,1.3114615789940434,1.8044633375455976,2.116145882842199,2.1623563187314825,1.9293439789985536,1.4774645632993817,0.9245956907634708,0.41380965762233207,0.0741636084940469,-0.014646565962583404,0.1559185681084727,0.5209707557956089,0.960068725293417,1.3303391099602226,,, +25.125,50,-0.7878224919271797,-0.7076381324358576,-0.6385677652293532,-0.5822396587207443,-0.5400517779399503,-0.5131471182284884,-0.5023935071797829,-0.5083682285946705,-0.5313477377866956,-0.5713026484186885,-0.6278980787475389,-0.7004993513073571,-0.7881829463226664,-0.8897525171429084,,, +25.1328125,50,-1.0037596873597103,-1.1285292655307315,-1.2621884360836182,-1.4026994153499197,-1.5478950009925114,-1.6955163924398335,-1.8432526201568,-1.9887808934175848,-2.1298071601600532,-2.2641061687753448,-2.3895603304212614,-2.5041967014308995,-2.606221438312006,-2.6940511220831067,,, +25.140625,50,-2.7663404035006756,-2.8220054851612257,-2.8602430293432843,-2.8805441605534314,2.869254352525847,2.9496721496500715,2.958440598385329,2.895508190424821,2.765649807732071,2.5781324660704747,2.346068169044294,2.0854990024647364,1.8142782697783109,1.5508256911419944,,, +25.1484375,50,1.3128434698675953,1.1160827579545467,0.9732465371146116,0.8931054181950181,0.8798880135903521,0.9329883896008848,1.0470109938886232,1.2121499191924092,1.4148760493499193,1.6388841633191829,1.8662339444396867,2.078605319828553,2.258580581503649,2.390863872555109,,, +25.15625,50,2.4633529887895955,2.4679887441244395,2.401322658605458,2.264763369595254,2.0644845697906447,1.8110008780116849,1.518441204327886,1.2035702653124598,-0.5323178286989042,-0.6330287368670978,-0.8584795225490741,-1.165475281671141,-1.4973689382780817,-1.7929144079268815,,, +25.1640625,50,-1.995839580587056,-2.063647917267575,-1.9742775849420482,-1.7295807377903225,-1.3550808165326649,-0.8960454417946179,-0.4104863301310165,0.03982371798386708,0.3989178678372125,0.6252964896102016,0.6983338312115436,0.6214325358917889,0.42143496084046667,0.14438327923338126,,, +25.171875,50,-0.15171095377834193,-0.4059612986420712,-0.5641481835268303,-0.5872214425213615,-0.4574390387093683,-0.18118555332330444,0.2119688267160421,0.6738225197963005,1.1450008714011737,1.5641571571251125,1.8774833930428607,2.047049811738586,1.0463181287892755,0.4796961879729081,,, +25.1796875,50,-0.16359104547376302,-0.7392278342995742,-1.1223135584558337,-1.2413635783621804,-1.0976635337155225,-0.7646747482195895,-0.3676558487414025,-0.049087874495481465,0.07061900549222833,-0.07363410651354751,-0.4735596428281901,-1.0495295266246452,-1.6721835455840264,-2.1976798469672834,,, +25.1875,50,-2.5069282531389043,-2.5380553994942194,-2.303205510137425,-1.885073603215188,-1.414122482822212,-1.0327286899837342,-0.8560847769695089,-0.9405740676864554,-1.2682858808313169,-1.75191537021058,-2.258705116778065,-2.6468666260000755,-2.8044993099695907,-2.680339845024181,,, +25.1953125,50,-2.8827033176266377,-2.8668218004113615,-2.8333059489660704,-2.7828599871729263,-2.716473656098666,-2.635404853658375,-2.5411575845792247,-2.4354556067659483,-2.320212235530553,-2.197496834416773,-2.06949857936248,-1.9384881306926416,-1.8067778840508053,-1.6766814962715668,,, +25.203125,50,-1.5504733948804506,-1.4303489801909277,-1.3183862168465752,-1.216509287308566,-1.1264549436965114,-1.0497421471302677,-0.9876455261545172,-0.9411731189579544,-0.9110487890773236,-0.8976996224506838,-0.9012485264519674,-0.9215121604516002,-0.958004234089634,-1.0099441154567272,,, +25.2109375,50,-1.0762705983991976,-1.1556605878248596,-1.2465523757715724,-1.3471731006078809,0.8846264670811801,0.5800571786685751,0.3072395732068885,0.08127622050135352,-0.08605059835281381,-0.18709295209046428,-0.21886294599564526,-0.18323339352162726,-0.08679949654846297,0.059588802947959214,,, +25.21875,50,0.2415911718815329,0.4423846178712432,0.643844314262245,0.8278151584509393,0.9773853766193727,1.0780733454399192,1.1188448531544497,1.0928898466872878,0.9981044835076212,0.8372448573156684,0.6177416621926368,0.35118870408763586,0.05254091257501137,-0.2609222362469179,,, +25.2265625,50,-0.5707956157431722,-0.8588260741191249,-1.1081797090726682,-1.304610432855043,-1.4374483515674252,-1.5003390468367874,-1.491682217720038,-1.4147391045703748,2.0566742889475536,1.9144077131264008,1.6512483581479973,1.3162856542642036,0.9690298740182716,0.6701225392298994,,, +25.234375,50,0.4718745466267907,0.4101058232110512,0.4985575817220113,0.7267475296555601,1.0616021061069159,1.452611507615665,1.8397045502114813,2.1626167651585444,2.3702925263024284,2.4288566860727787,2.326913984062768,2.0773506864459184,1.7153576920244202,1.2929828495039826,,, +25.2421875,50,0.8710608074468091,0.5097771656099432,0.25933639634511474,0.15218682832825858,0.19801345173735785,0.38227819000349,0.6685347367238292,1.004157139371264,1.3285895952333668,1.5828322272542388,1.7186850928143675,1.7063103322964224,-1.1696063896289353,-0.7009329170286078,,, +25.25,50,-0.4527658440997792,-0.4725893246870744,-0.7329816183992859,-1.1393425473675498,-1.5560413601351306,-1.8438166128596096,-1.8981757786343936,-1.6782682605721804,-1.2183164184436197,-0.6184695436859552,-0.017585289796488712,0.4446037530517649,0.6655713778146999,0.6078919950051533,,, +25.2578125,50,0.3093046801266635,-0.12780946178122582,-0.5646510481033891,-0.8641905205279059,-0.928853059234332,-0.7273708507862722,-0.3034423353534997,0.23617559032624505,0.7508794311980277,1.1047293040720592,1.2037031853064188,1.0214848957169966,0.6067178736625884,0.06973625351331549,,, +25.265625,50,-1.4555699084951992,-1.5696442714026946,-1.6871888606970111,-1.8059263305793072,-1.9235493321900807,-2.037761057664559,-2.1463156041256126,-2.2470574507593186,-2.3379593576451647,-2.4171580226390086,-2.48298687187262,-2.534005409609624,-2.569024613447831,-2.5871279300996743,,, +25.2734375,50,-2.5876875040122944,-2.5703753545632395,-2.5351693060117477,-2.482353566265219,-2.4125139442151005,-2.3265277892773586,-2.225548829178148,-2.1109871713613697,-1.9844848180744807,-1.8478871237405117,-1.7032106942824858,-1.5526082903507086,-1.3983313488787648,-1.2426907790869812,,, +25.28125,50,-1.0880167192643702,-0.9366179588666768,-0.7907417363085161,-0.6525346162669879,-1.277401212789039,-1.0916364722919831,-0.8726514612178304,-0.6378281213803243,-0.40550911761972064,-0.1937165469346297,-0.01889335023724159,0.10524480437484908,0.1686671022798758,0.16572784987410194,,, +25.2890625,50,0.0955605960459216,-0.03786137601903283,-0.2260024044063416,-0.4563603091305628,-0.7133392043898993,-0.9793383954138198,-1.2359814238042042,-1.465399551480076,-1.6514801763695472,-1.7809931176213591,-1.8445162239161543,-1.8370957515226856,-1.7585954533789994,-1.613710026929819,,, +25.296875,50,-1.411641973102377,-1.1654643895360417,-0.8912141213537617,-0.6067784951687858,-0.33065325552416513,-0.08065830388985085,0.1272992176604023,0.2803282579251549,1.5389343216447386,1.233957152893126,0.8302963460578894,0.3823782374344693,-0.04828736377991538,-0.4026372336413113,,, +25.3046875,50,-0.6332054166319634,-0.7114695246517962,-0.6322486745126499,-0.4144682977452296,-0.09817292233963117,0.2617475899242268,0.6041409855145641,0.8711477248356191,1.0172398334015391,1.016335507641398,0.8658812145498214,0.5872653725601251,0.2224990964607722,-0.17231906604426422,,, +25.3125,50,-0.535736547625473,-0.8105180716464947,-0.9525640788277856,-0.9377871586030914,-0.7658754041697381,-0.4603564675591725,-0.06495225615435249,0.3632080557424283,0.7624597121043201,1.0761770852551835,1.2615602571684257,1.2962650907892217,-0.9287955978182828,-0.7801673647619064,,, +25.3203125,50,-0.4174098094123842,0.046868465637410095,0.4711549087290722,0.7240137550418175,0.7203145739226359,0.4447774882094952,-0.043620025904999526,-0.6275846360296429,-1.1634300008224574,-1.520234025077753,-1.615500839494344,-1.437555745236336,-1.0485374130946634,-0.5671692715422283,,, +25.328125,50,-0.1360338510602842,0.11767897547128615,0.11719042637566712,-0.1426811487326165,-0.5939744965527989,-1.1141048591263,-1.5593740124756597,-1.804287744313692,-1.775905732761414,-1.4738100585008498,-0.9702198795414824,-0.3902209317474883,0.12247176029630236,0.44483487162924906,,, +25.3359375,50,-0.5240051313999685,-0.4069888424873148,-0.3031164286647894,-0.2137853663475785,-0.1401356926175028,-0.08303027731918944,-0.0430399491647,-0.020433736155877846,-0.0151743910751726,-0.02691928026122037,-0.055026619969729684,-0.098566950986525,-0.15633965043578313,-0.22689419152902598,,, +25.34375,50,-0.30855577886116914,-0.3994549102457715,-0.4975603473301637,-0.6007149175375177,-0.7066735203179929,-0.8131426720833949,-0.917820897264004,-1.0184392581117192,-1.1128013134379269,-1.1988218064872531,-1.274563404389331,-1.3382708457556816,-1.3884018983719772,-1.4236545847882027,,, +25.3515625,50,-1.442990198966986,-1.445651710842056,-1.4311772364023132,-1.3994083373186466,0.3694466788188472,0.3902013238999045,0.3429721090731602,0.2329389458666433,0.06971381974881019,-0.13333630394801854,-0.3600285141174909,-0.5924994294675823,-0.812457918452537,-1.002467690417666,,, +25.359375,50,-1.1471703017292274,-1.234363275657552,-1.255858138137376,-1.2080585187333075,-1.0922179869295332,-0.9143596270498222,-0.6848629432880715,-0.4177468846556061,-0.1296989703715795,0.1610817982728523,0.43614756800150745,0.6780817739100401,0.8717075369749393,1.0051400680837237,,, +25.3671875,50,1.0706097054020651,1.0649982059090624,0.9900509071174708,0.8522499770628978,0.662357603472978,0.4346609886215227,0.18597180979176167,-0.06555007348698608,1.1818443143067698,0.9434638581721588,0.6259388479369351,0.2867069020906617,-0.013166573138362449,-0.21854986262485446,,, +25.375,50,-0.2888836781431692,-0.20455134867196975,0.030012005811916983,0.3869558725577944,0.8192974827361684,1.2681848563308251,1.6720087890549182,1.9759448316349733,2.1404393356983267,2.147318103667575,2.0025664664997223,1.735348048816573,1.3934153168501822,1.0356269937349427,,, +25.3828125,50,0.7227380362477542,0.5078969124638935,0.4283304956581079,0.4995118976567928,0.7127198182252825,1.036369723900331,1.4209096697964183,1.8065183476239504,2.1324064625985573,2.346272795329244,2.412442191626338,2.3174179992630917,-0.0532002186708683,-0.4750474645641562,,, +25.390625,50,-0.8061380080601053,-0.9273185278058034,-0.7757379844809551,-0.3622817551210565,0.23119229519846304,0.8740602407149174,1.4224969367047031,1.7586541161191782,1.8227163433911848,1.6290514199813226,1.262031076415062,0.8526695366526863,0.5424847530041998,0.4444889396630152,,, +25.3984375,50,0.6120017342834607,1.0238352793192729,1.5899133552605065,2.175786213246485,2.639323870627209,2.8695327278702605,2.8168582597333227,2.5066697671441123,2.0322322809250735,1.5290924690393493,1.1378990612395552,0.9658478509257148,1.0573180879966495,1.381747783685272,,, +25.40625,50,-1.3504930046681451,-1.284883274391334,-1.2033275161191272,-1.1068575302763648,-0.9967706792751236,-0.8746073655727713,-0.7421242508362829,-0.601263685040467,-0.4541198806873479,-0.3029024243274097,-0.14989776419955822,0.002570651770518073,0.15218288972223198,0.29666298606646185,,, +25.4140625,50,0.4338186378558087,0.5615794324257611,0.6780329470055504,0.7814580862746677,0.870355074212019,0.9434715751636872,0.9998244868242638,1.0387170236186791,1.0597507914232076,1.062832642269414,1.0481761890718424,1.0162979539206214,0.9680082174430041,0.904396729518892,,, +25.421875,50,0.8268135316104269,0.7368452265558679,0.6362871113956734,0.5271116612237603,-0.3016666290873732,-0.5053368080195724,-0.6619079172895735,-0.7601401241105403,-0.7929926427246133,-0.7581167744828446,-0.6580214146740521,-0.4998994803088134,-0.2951273589342131,-0.05847228064048815,,, +25.4296875,50,0.1929371163010252,0.4408052416720408,0.6669457385662043,0.8545504047878392,0.989362363210657,1.0606716701042411,1.0620639316045506,0.9918697211948636,0.8532834543704528,0.6541434256578963,0.4063883406147109,0.12522823368345867,-0.17191242118075115,-0.4666057152111204,,, +25.4375,50,-0.7407009867283372,-0.977585883969474,-1.1633398813843945,-1.2876998221116067,-1.3447701680003417,-1.3334284414881443,-1.2573975994479094,-1.1249803055529244,2.0719841634202734,1.7095295803473554,1.2808556908833693,0.8462760283357136,0.4662382067153411,0.19192895235619167,,, +25.4453125,50,0.057325402759613626,0.07393061294367709,0.2290131108724034,0.4876245508610834,0.7980810373796787,1.1000541898214498,1.3340115218945328,1.4505355314911492,1.418069774482647,1.2278851887962547,0.8954928843489853,0.45828308597453105,-0.030242295732119482,-0.5087454376691285,,, +25.453125,50,-0.9175480117111592,-1.2078675565284311,-1.3493564929636217,-1.3347698358354063,-1.181034875607467,-0.9265565139201174,-0.6251782506082798,-0.3377397151359777,-0.1225459801483273,-0.026233383032862267,-0.07645481421531775,-0.27752402913588703,2.620655643939981,2.6967929757813502,,, +25.4609375,50,2.4911991588465345,2.040430026091377,1.4463690328772405,0.8484951479824717,0.3858597406216899,0.15919159038033534,0.20351393472349355,0.4787763553042561,0.881066917060021,1.271329503282907,1.5137136195781742,1.5130439675107143,1.2411383519086103,0.7447588610820036,,, +25.46875,50,0.1330150855296416,-0.4523302031919286,-0.8755164744716853,-1.0438094416686647,-0.9327481208612558,-0.5926969835262534,-0.13490879668121658,0.2990809199204933,0.5763387668079477,0.6090396887220132,0.3785886832211461,-0.05925344619722823,-0.5896453055135233,-1.0701546065038454,,, +25.4765625,50,0.4114339159569586,0.291474376137078,0.16952005749239546,0.04788438623098856,-0.07113336268112208,-0.18528837398992812,-0.2924296415505596,-0.3905376696268611,-0.4777598659224629,-0.5524430066067256,-0.6131622048577556,-0.6587458756792277,-0.6882962598543795,-0.7012051476599632,,, +25.484375,50,-0.6971645270241829,-0.676171969682232,-0.6385306610277686,-0.5848440731482499,-0.5160053743354949,-0.4331817605262164,-0.3377939830507555,-0.2314914311822399,-0.11612320581492593,0.006294309194069203,0.13361281016857687,0.2635897519940488,0.3939276819501447,0.5223145402209539,,, +25.4921875,50,0.6464642213706032,0.7641566865142129,0.8732769237637417,0.9718520747003982,-0.9484736450977655,-0.7433051104556415,-0.5269501224707579,-0.31770658769940724,-0.1334119611050124,0.00980770654988128,0.09866948748062232,0.12366712698093152,0.07974130870413433,-0.03336012150647505,,, +25.5,51,-0.2110571098522418,-0.444249290561378,-0.7199430913595892,-1.0221503356205153,-1.3329956960782685,-1.63395579102199,-1.9071435339680347,-2.1365481920066074,-2.3091446964050397,-2.4157948663288784,-2.4518777168200314,-2.417604913721976,-2.3179993936145693,-2.1625386550394525,,, +25.5078125,51,-1.9644876104345,-1.7399675356872395,-1.5068260565058225,-1.2833869846401331,-1.0871671949265873,-0.9336500318944316,-0.8352007921270802,-0.8001999205492476,-0.6096976457408024,-1.0322068878301236,-1.4895670779357033,-1.9201823415588315,-2.265905477223148,-2.481064157637253,,, +25.515625,51,-2.539547731114476,-2.43885094544986,-2.2004448725183687,-1.86641734980551,-1.492906277148944,-1.14134861596001,-0.8689081331349318,-0.7195728256039247,-0.7173086340924918,-0.8623357557604301,-1.1311074833269257,-1.4799947897439738,-1.852102667957308,-2.186156428319669,,, +25.5234375,51,-2.4260737303955797,-2.529731300874152,-2.475560703663552,-2.265945648239396,-1.9268914839534277,-1.5040181401458996,-1.0555004011656957,-0.6430548618831436,-0.32237713812986524,-0.13451852258638894,-0.09954494481752284,-0.213465606437972,-1.1630150646487791,-0.7043807981456532,,, +25.53125,51,-0.1477357359256116,0.363271505528452,0.6990402722824816,0.7793686140477853,0.595251840816323,0.21115633843998896,-0.2528526589861733,-0.6542291248707439,-0.8672314118921874,-0.8176055521455323,-0.5031588982722154,0.005416662593381194,0.5836996858135142,1.0874246533698717,,, +25.5390625,51,1.3918130467089942,1.425572553475403,1.1902481750510805,0.7596235055772431,0.2593379847006799,-0.16769199939428558,-0.4005696897495298,-0.3736609424572843,-0.09467161262221546,0.3573960353974506,0.8538485257876356,1.2515471610947664,1.4321352526917437,1.3344956953472165,,, +25.546875,51,1.058086076734227,1.1303912146994133,1.1874160291608682,1.228069092687644,1.2515382377041746,1.2573048991681128,1.245153320859556,1.2151744640033288,1.1677645497032685,1.1036182606280345,1.0237167208992215,0.9293104645691664,0.8218976908140444,0.7031981865034467,,, +25.5546875,51,0.5751233726646414,0.4397429992260661,0.29924907112077304,0.1559176372905832,0.012069111566523657,-0.12997217990355792,-0.2679185164685604,-0.39955865666620416,-0.5227963697294677,-0.6356869503283953,-0.7364710772942022,-0.8236054235798705,-0.8957894815912486,-0.9519881343059874,,, +25.5625,51,-0.9914495770767074,-1.013718276433682,-1.0186427391033528,-1.0063779553312,-0.8324543762932092,-0.9309282254853124,-1.0898112568971756,-1.2989208442933888,-1.5444090402246855,-1.8097256005180025,-2.0767697910720053,-2.327150663429177,-2.5434679209018007,-2.710524060399087,,, +25.5703125,51,-2.816383266651974,-2.853203221143484,-2.817781822626565,-2.711780695381305,-2.5416098991641145,-2.3179818794436056,-2.0551657606277227,-1.769993980177178,-1.4806905307568283,-1.2056025165938444,-0.9619234716147648,-0.7644974606393827,-0.6247873508424472,-0.5500791918506358,,, +25.578125,51,-0.5429781774731499,-0.6012313284322011,-0.7178892514590811,-0.8817956845669164,-1.0783706800799706,-1.2906328000687382,-1.500389031142659,-1.6895094293515631,-0.4489093878947671,-0.7594433842863321,-1.0868606444689273,-1.3703017177641337,-1.555788988055499,-1.6046884833757824,,, +25.5859375,51,-1.499780904134935,-1.2479959950600048,-0.8793840943345035,-0.4424847809254007,0.003186278553040267,0.396362315749202,0.6835256725751437,0.8272037514736229,0.8117687718734348,0.6458381806429124,0.3609020139914367,0.006391163122226276,-0.3580451741974109,-0.6718499088643244,,, +25.59375,51,-0.8830060960092871,-0.9561509293909292,-0.878091837434638,-0.6598654808278268,-0.33501893380116443,0.045619232953751546,0.42186351246952464,0.7335573280397072,0.9299582425505616,0.977660629138034,0.8658216999334291,0.6078767865857875,-0.16865398522930775,-0.6715257631222673,,, +25.6015625,51,-0.9659306304781572,-0.9947636326826992,-0.7752401197736623,-0.393999522651222,0.016832402430341842,0.3160605287518533,0.3923338867938069,0.1948887989969985,-0.2523061702477709,-0.8568822440356112,-1.483146158897208,-1.989029247914284,-2.264785419133632,-2.2628342360050766,,, +25.609375,51,-2.010572136718612,-1.6026427000697478,-1.1747864539350892,-0.8664391281347708,-0.7823308606413951,-0.9636125516443168,-1.3764243159419678,-1.921040475531976,-2.4590859562890364,-2.8513659459536367,-2.995941707288844,-2.85601778162414,-2.4699980088642435,-1.940954576773189,,, +25.6171875,51,-0.9773824738549984,-0.9324101598710358,-0.8724967804403513,-0.7989416523519863,-0.7132846739209392,-0.6172791430202428,-0.5128608374359394,-0.4021138990780555,-0.2872341195441617,-0.17049027004170073,-0.054184152906744436,0.05938992564606638,0.16798555177981425,0.2694437618287084,,, +25.625,51,0.3617310688343959,0.4429752918549203,0.5114985605376305,0.5658469169152962,0.6048159959658534,0.6274723351347637,0.6331699395610929,0.621561812815847,0.5926062511185864,0.5465677906878732,0.4840127915086133,0.4057997347112586,0.3130644033276243,0.20720020577842324,,, +25.6328125,51,0.08983398649701667,-0.037202252876413884,-0.17190322670332225,-0.31212527497808085,-1.8411975969218544,-1.9411683826644004,-1.9786506670042128,-1.9471452895244596,-1.8448852511821383,-1.6749660843015235,-1.4451372833399247,-1.1672693244171417,-0.8565334235374491,-0.5303512148546247,,, +25.640625,51,-0.20718757430099902,0.094729248259728,0.35867095633199225,0.5705679150264973,0.719982457171662,0.8008289329478,0.8117903090075528,0.7564022835598729,0.6427990689406821,0.4831385860476963,0.29274717044536924,0.0890434490653994,-0.10968355470706953,-0.28555686496322474,,, +25.6484375,51,-0.4223651016704133,-0.5066997043764067,-0.5288965141302786,-0.4837160397172458,-0.3707149571509619,-0.19428292316842244,0.036657877271564776,0.3092695102813449,0.23947656512590604,-0.1870326480659098,-0.6107259845978584,-0.9715504119238751,-1.219636682632348,-1.3230226836136754,,, +25.65625,51,-1.2725854692440262,-1.0834140365043383,-0.7924092834743395,-0.4524852376813442,-0.12427501848906584,0.13336634531527558,0.272582720779329,0.2640248209070681,0.1014756062322938,-0.19712758362847185,-0.5924336602594982,-1.029754597544872,-1.4475322104493669,-1.7868764324687578,,, +25.6640625,51,-2.000689723894745,-2.060956696670292,-1.963063808762116,-1.7264765519485643,-1.391668883931187,-1.013783374589563,-0.6540097298185149,-0.370024715154774,-0.20698267648666654,-0.19046007896480568,-0.3224531181056807,-0.5810519057945843,-0.844288822839549,-0.9430364784364288,,, +25.671875,51,-1.2633429930293991,-1.6991686907457697,-2.1106152768961524,-2.3624303360600187,-2.361254800892367,-2.0814033636947222,-1.5721104468553433,-0.9442539662324746,-0.3401935435810547,0.1050124340234332,0.3003837726341544,0.22371213483758104,-0.072594213348538,-0.4761142682499736,,, +25.6796875,51,-0.8454621291734838,-1.0492674129268982,-1.0024028171181043,-0.6895279562374255,-0.1694949169690646,0.44059368164420737,0.9973065725957464,1.3700383536876002,1.4766669097874912,1.305942304526397,0.9204720276715852,0.4394852521169376,0.006100524625596737,-0.25193174378885164,,, +25.6875,51,-0.4556236982412561,-0.6000918641671524,-0.7432014011836361,-0.8826427754653796,-1.016165540908809,-1.1416175574322476,-1.2569824910071148,-1.3604149389017763,-1.4502725652164268,-1.5251446841187677,-1.5838767903987074,-1.6255906079186682,-1.649699305011009,-1.6559176105065658,,, +25.6953125,51,-1.64426665335736,-1.6150734412092942,-1.5689649871476168,-1.5068571875475207,-1.4299386458652457,-1.3396497257010345,-1.2376571999973176,-1.1258249403423204,-1.006181159690865,-0.8808827821497959,-0.7521775637886717,-0.6223646278070875,-0.4937541051509426,-0.3686265873389347,,, +25.703125,51,-0.24919310153146665,-0.1375563087412609,-0.03567360465662328,0.05467723076857989,0.6076884008522376,0.9141267102149276,1.2101081906200892,1.477752347227033,1.7010173674479292,1.8668151526719299,1.9659207052587424,1.993612463186668,1.9499989358607677,1.8400088689997447,,, +25.7109375,51,1.6730456289215498,1.4623299107792025,1.2239766086582982,0.9758702223411776,0.7364172234162811,0.5232623825865022,0.3520585722997801,0.23537582900869006,0.18182574749766425,0.19546226313589574,0.27550060367609863,0.4163740044504465,0.6081242267014847,0.8370986408606278,,, +25.71875,51,1.0869052580665026,1.339559104917789,1.5767399927559944,1.7810739641499782,1.937349047503769,2.0335805309153416,2.061851459286385,2.018869732454466,-0.9238420682172432,-1.2945040084442627,-1.63158201266579,-1.878057393610072,-1.9902346106163091,-1.9445562922744144,,, +25.7265625,51,-1.741285650848208,-1.404482677120333,-0.9782777469533008,-0.5200229483384851,-0.0913877294986849,0.2512143676174731,0.4653769555488718,0.5292671496062756,0.44498446099290667,0.2381892733131995,-0.04594101222553168,-0.3497980790930395,-0.6123671029166992,-0.7787836095100105,,, +25.734375,51,-0.8089339870404986,-0.6837598033731048,-0.4082837170901086,-0.010885394162500115,0.4610600804459435,0.9485022489755488,1.3898539432649508,1.7305254622511628,1.9313695579489398,1.9747221671337416,1.8670982962674876,1.638123438290239,0.44022062774246334,0.9536922699304696,,, +25.7421875,51,1.3932512511014097,1.634018166400779,1.6036562984261904,1.302331806669946,0.8028199288768115,0.2307265931004996,-0.2697555337669111,-0.5751730852417658,-0.6164439092713829,-0.39757932588151135,0.005632438630517628,0.4666187121682885,0.8429351946941517,1.0155284274987413,,, +25.75,51,0.9215851024294524,0.5719630776316967,0.04842470087848835,-0.5185713148460035,-0.985434820452105,-1.2346205231686338,-1.206680318452712,-0.916408669229344,-0.4486575116186213,0.06503102140297784,0.4825686788899375,0.6903350383255697,0.6343680312546867,0.335182122768002,,, +25.7578125,51,0.1319292334299138,0.19475375853955013,0.24208380581276145,0.27313275791214603,0.28740820400278344,0.28472060633314866,0.26518665806057484,0.2292272734964267,0.17756024593739714,0.11118770162057344,0.031378569467433885,-0.06035362644897735,-0.16227726287027233,-0.2724729378191432,,, +25.765625,51,-0.3888670846643407,-0.5092682912001028,-0.6314056878023319,-0.7529687324770062,-0.8716476961615379,-0.985174139375356,-1.0913606714555812,-1.1881392961874944,-1.273597672373207,-1.3460126543969475,-1.4038805254679776,-1.4459433941249316,-1.4712112917727835,-1.4789795842854565,,, +25.7734375,51,-1.4688413927603692,-1.4406948058952966,-1.3947447576540652,-1.3314995372945728,1.906202943839239,1.7301745707089449,1.5014287416651777,1.2341939176070464,0.9452968176770156,0.6529953374859359,0.3757118287212861,0.13075505702661905,-0.06688005581030121,-0.20555122376216567,,, +25.78125,51,-0.2777737007338593,-0.28073518515333684,-0.2164848358787217,-0.09178323572910707,0.0823762177621512,0.2915411022792004,0.5188149653531652,0.7460427277380919,0.95508381650271,1.1290842312353564,1.253658821280751,1.3179013133958075,1.3151516409129875,1.2434670499030875,,, +25.7890625,51,1.1057641146825214,0.909621743881866,0.6667588988494089,0.3922234299133872,0.1033485811241129,-0.1814500842276079,-0.4439534565329003,-0.6674041912589025,1.3358672277985923,1.0193064022144895,0.7490912516905274,0.5780539691725892,0.5429374993897615,0.6586333721094234,,, +25.796875,51,0.9158262021579776,1.2824119160524512,1.7084689700289952,2.134008409014448,2.498295778148652,2.7492930546730854,2.851750054189515,2.7926850963441607,2.5834013308102377,2.257724692634262,1.8667379360355216,1.470830928899771,1.1303053757324544,0.8959972714698495,,, +25.8046875,51,0.8013776063853075,0.8573615769190421,1.0506346736853147,1.3457562269056091,1.6907126124751282,2.0250550017542968,2.2893539654797395,2.4344981198283637,2.429388279634375,2.265828478790392,1.959851808671236,1.549274310630705,-0.9428732659634728,-1.0632415569524332,,, +25.8125,51,-0.9033017164183972,-0.489173334943162,0.08514319998593464,0.6833891148048293,1.1642339133914774,1.419835954616378,1.405210208118593,1.1503560660891592,0.7518231614939007,0.34602867313758995,0.07164105469485005,0.03134175833140252,0.2634470458732917,0.7311696561413126,,, +25.8203125,51,1.3324655517654789,1.9277692062055312,2.378018149679839,2.5825474659872967,2.5064705058674357,2.1900435076652367,1.7374493811244942,1.2880763779099298,0.9781648610053312,0.9033350482169896,1.092266991469717,1.4987473841403878,2.014263806112341,2.4976953859359803,,, +25.828125,51,-1.2517619928168142,-1.1566155818038408,-1.0474055138451062,-0.9257153146815352,-0.7933392223634219,-0.6522508987011111,-0.5045690037988594,-0.3525202363852623,-0.19840048703472468,-0.04453478439793601,0.106763264292088,0.25323182832897684,0.39270029772890747,0.5231271259282276,,, +25.8359375,51,0.6426354084590029,0.7495455747070807,0.8424046204194633,0.920011369199936,0.9814373207606301,1.0260427209853882,1.0534875725181292,1.0637373931892882,1.0570636215582545,1.0340386625804394,0.995525660261068,0.942663176489014,0.8768450444393228,0.7996957494257413,,, +25.84375,51,0.7130417684054379,0.6188793700948481,0.5193394396399291,0.4166499438810791,-0.8376703369647603,-0.9442261482277812,-0.9808816994240448,-0.9462104315737082,-0.8436448278954131,-0.6812335554498675,-0.4710770165977172,-0.2284806787634882,0.029114769519747088,0.2833518264861567,,, +25.8515625,51,0.5162381800548134,0.7114029030301309,0.8552392382810754,0.9378542808341264,0.9537593303456556,0.902252772096691,0.7874687864558123,0.6180884904167722,0.406733655337313,0.16908528078419136,-0.07721150811998621,-0.3137798713052802,-0.5227950280537064,-0.6882298681599391,,, +25.859375,51,-0.7969755336060295,-0.8397588223075799,-0.8117924329941988,-0.7131126993788595,-0.5485812534210709,-0.32755049207873943,-0.06321616532131186,0.22829777944699406,1.087857649778369,0.6369894894934891,0.25617711084970685,-0.006165340569742384,-0.12020133553490042,-0.07926271434647736,,, +25.8671875,51,0.09916802917925828,0.3762366373205975,0.6978240359597195,1.0030298657451344,1.2337109627102525,1.3435888471693038,1.3055074172549768,1.1157101685913011,0.7944704971196574,0.3829766809228224,-0.06304349614054625,-0.4819656835694464,-0.8158334701896901,-1.0193549054824698,,, +25.875,51,-1.0669299338701668,-0.9566143169250072,-0.7104027575903658,-0.3707872245844313,0.005873387761735072,0.3581394981617915,0.6290644377098729,0.7750642574316945,0.7727022319270622,0.6223313650188245,0.3480276069128105,-0.006175745834186786,2.6452243639364554,2.1876152452887903,,, +25.8828125,51,1.6102340029479365,1.0553769603723029,0.6567303050352735,0.502858252701969,0.6130768728690321,0.9323245375956446,1.346433390236576,1.7136147753671878,1.903527677814296,1.8332208262416647,1.4900958512270237,0.9355959449451052,0.2886069675584237,-0.3068818893193989,,, +25.890625,51,-0.720996813201472,-0.8733309610119631,-0.7547422808095212,-0.42962556251625295,-0.018038088061177848,0.3374202987970522,0.5108936189609488,0.4279536548930381,0.08617383341620244,-0.4440471173538046,-1.0386388491565464,-1.553742168332554,-1.8650356782076656,-1.901728874178232,,, +25.8984375,51,0.31309669456638145,0.2109830966782928,0.11258958679781984,0.02013347187162984,-0.06427012826963874,-0.13864555061871298,-0.201191418198764,-0.2503124187870444,-0.2846474765742504,-0.3030938233438307,-0.3048265475522308,-0.28931327887138825,-0.2563237509346571,-0.2059340747065224,,, +25.90625,51,-0.13852564751474206,-0.05477871671022938,0.04433928947782007,0.15759045970581964,0.28348783365458685,0.4203211973692485,0.5661867882638147,0.7190203897859319,0.8766332364003642,1.036750100324885,1.197048893258536,1.3552010898148803,1.508912264973138,1.6559620358818328,,, +25.9140625,51,1.7942427087596418,1.9217959543220888,2.0368468696812845,2.1378348304191483,0.5290582914279157,0.8205682231091805,1.0850504440778204,1.306681529903262,1.472689010849244,1.5742356800562909,1.6070293102916942,1.5716152769288274,1.473331697129859,1.3219302293785455,,, +25.921875,51,1.1308889923719725,0.9164655320540817,0.6965558930544861,0.4894393719598937,0.31249650175801424,0.18098968358175194,0.10699151337070856,0.0985355518455472,0.159048774526942,0.2871052960283925,0.4765185592997977,0.7167655781262275,0.9937136659113941,1.2905989902274868,,, +25.9296875,51,1.5891887317696072,1.8710458227603437,2.1188080863208563,2.3173925937837963,2.4550412712883234,2.524134856788341,2.521718461803081,2.4497021024625125,-0.3831658657484531,-0.7216690598136863,-0.9658210270225478,-1.0738979429367412,-1.0248482939992498,-0.8216079122772165,,, +25.9375,51,-0.4906816789199637,-0.07805683574793218,0.3579157979983084,0.7555641545658438,1.0594526520083978,1.228966926611795,1.2445887149485406,1.1108838157240353,0.8557380225361051,0.5259603213349303,0.17993846688554702,-0.12150883860942865,-0.3246580530146469,-0.391301157827882,,, +25.9453125,51,-0.3047484763415768,-0.07247869508730098,0.2749769408682004,0.6887427333463798,1.1091658830399105,1.4750646808329229,1.733217320049429,1.8466136203788297,1.8001846232335268,1.6031178379909663,1.2873977053032502,0.9027987689273491,-0.7259958208087319,-0.2916577341947609,,, +25.953125,51,-0.05041233147509827,-0.06850786165836252,-0.33885113089842656,-0.7830471643452542,-1.2730001413702166,-1.6661542796701303,-1.8447148736355417,-1.7480986944027566,-1.3897184443793968,-0.8534993962609853,-0.2710810344906971,0.21404991638750195,0.4856670538385511,0.486436336179271,,, +25.9609375,51,0.2334053390068633,-0.1868932595044029,-0.6423798268965121,-0.9918447021367712,-1.1238610256049364,-0.9875266084612704,-0.6066074710843611,-0.07320488208344758,0.4773201619990618,0.9032941724702126,1.0954254493427669,1.0066417651113893,0.6648949654040235,0.16542407561521258,,, +25.96875,51,2.2234405927522345,2.2926091713507173,2.3445680923501397,2.3788407020712588,2.3952542985331937,2.3939429435020094,2.3753449059528142,2.340194781829649,2.289510428201151,2.2245749407108324,2.146913990006067,2.0582689140963795,1.9605660379012353,1.8558827573055383,,, +25.9765625,51,1.7464109816993143,1.6344185752167446,1.5222094719420958,1.4120831635601412,1.3062942689144652,1.207012893508074,1.1162864731331044,1.0360037698404303,0.9678616507623814,0.913335231572765,0.8736519074555029,0.8497697263722572,0.8423604833918193,0.8517978321706233,,, +25.984375,51,0.8781506218230501,0.9211815759198914,0.9803513368112622,1.0548278045200348,2.3147222293108083,2.1276739244021865,1.902946399065812,1.6574151148862342,1.4092608212625155,1.1766978718800738,0.9767005080404808,0.8238159378524307,0.7291469870124191,0.6995752714026231,,, +25.9921875,51,0.7372790686063092,0.8395795143911714,0.999125854267788,1.2044068360509836,1.4405525856800063,1.6903710514364223,1.9355467436553808,2.1579181788286683,2.340744947862364,2.469876050946445,2.5347380256858254,2.5290739606772106,2.4513818574634407,2.3050217683693357,,, +26.0,52,2.0979842342367494,1.8423361639105216,1.5533827895667605,1.2486041301417727,0.9464401186330098,0.6650091014845471,0.420849063702242,0.2277693479541567,0.5091115389540767,0.1668120335561113,-0.07237162768999805,-0.17352619093199373,-0.1239972581609372,0.06463767399942788,,, +26.0078125,52,0.3583744612756744,0.7060846700005747,1.047489157558374,1.3225609080534322,1.4808925214256616,1.489569239184526,1.3383211404397433,1.0411519059173802,0.6341903218575693,0.17009900564403246,-0.29008895150666064,-0.6864341305009585,-0.9693818354641286,-1.10743314136716,,, +26.015625,52,-1.0920013669292985,-0.938697798475139,-0.6848466642002439,-0.3836166819098422,-0.09568349788735736,0.12027808205288283,0.21679089702068374,0.16502852934904322,-0.040636455763469866,-0.381697835404595,-0.8183404924874083,-1.2955849365963392,-0.9354390605135776,-0.8473985906631841,,, +26.0234375,52,-0.5265232967540682,-0.0718225990785977,0.3790491433342515,0.6876164271109392,0.7526512890975853,0.5380523462022531,0.0828921548067707,-0.5091221828297781,-1.097888179141668,-1.54510906608491,-1.7519888742946883,-1.6860923091253572,-1.3900099384668283,-0.9694558951196012,,, +26.03125,52,-0.5640622777410659,-0.3088767812104957,-0.2971180644029805,-0.5543986467043673,-1.0314821906373146,-1.6175622609247429,-2.170425262198409,-2.5552327250448656,-2.6812957016230325,-2.5267642140567665,-2.1444666837080466,-1.647300343117655,-1.1771779303318266,-0.8660425193062737,,, +26.0390625,52,1.1435006067413958,1.2450004466379494,1.3577229897002812,1.4798568714717353,1.6094153357666412,1.7442709494441118,1.8821927859273624,2.020885426418299,2.158029095942352,2.291320231468539,2.418511771790155,2.537452463719987,2.6461244963664785,2.742678804544329,,, +26.046875,52,2.82546742316793,2.8930723261189097,2.944330244630831,2.9783530306251254,2.9945432084446186,2.9926044426704994,2.972546738729557,2.9346862852213933,2.8796399407172486,2.8083144615512348,2.7218906592087873,2.621802764695484,2.5097133611894997,2.3874843238842414,,, +26.0546875,52,2.2571442758262754,2.120853129567144,1.9808643354651625,1.8394854976254635,0.09589293013074174,0.03095602509767048,0.033913851316544674,0.10088003297977287,0.22340385216095196,0.3890660035910219,0.5823512939841802,0.7857374151388734,0.9809238521219544,1.150115215364708,,, +26.0625,52,1.277269490000362,1.3492241418817006,1.3566215368655146,1.2945691242429749,1.1629883307071496,0.9666278182926468,0.7147401645487453,0.4204444937673352,0.09981948764315744,-0.22920999474844397,-0.5481150654768987,-0.8390471231043959,-1.0860747926206122,-1.2762872512556724,,, +26.0703125,52,-1.4006870185772953,-1.4548099703999966,-1.439029357314099,-1.3585226437023068,-1.2229034953767728,-1.0455445938411976,-0.8426385144205154,-0.6320621706895866,-1.7517948275542785,-2.1282226916691265,-2.378107309892231,-2.4739060783851756,-2.4115361203067,-2.2109638194922088,,, +26.078125,52,-1.9130511870679519,-1.5731504766558366,-1.252444926723124,-1.0083845456267428,-0.885706790181323,-0.9094408708949748,-1.0809854383982764,-1.3778706913043308,-1.7572420580643588,-2.162522930514198,-2.532218752200801,-2.8094912164706227,-2.9510113596065466,-2.933712629080196,,, +26.0859375,52,-2.7583920758399807,-2.449598719871398,-2.0518264098863592,-1.6226040721282682,-1.2235594713633875,-0.9108482239049904,-0.7264386491789908,-0.6916097269975022,-0.8036747077427308,-1.0364404940450538,-1.3443310313064232,-1.6695322416619058,-1.3908274884738347,-1.8738799729241031,,, +26.09375,52,-2.3004259135017664,-2.5406283907009968,-2.5131471125665903,-2.207518676754636,-1.6871327397827864,-1.0719874851845437,-0.5059494852094123,-0.11748975727420108,0.015344366742570116,-0.11387700155425462,-0.4384137611214711,-0.8368681415978889,-1.166686264584281,-1.3034651365047505,,, +26.1015625,52,-1.1752901040712975,-0.7826897588314535,-0.1987370769426754,0.4507331046154637,1.0213706447170394,1.3896368657803253,1.4864353237133403,1.3158314008817145,0.9537321579125956,0.5268900632626559,0.17798672894478573,0.02636769291858343,0.13519105164937115,0.4939947353833378,,, +26.109375,52,1.6990380470558644,1.5618166781043323,1.4300492584024944,1.3058579142358102,1.1912219726767994,1.087943409311325,0.9976154064973964,0.9215945726427952,0.8609773088717194,0.8165807368290023,0.7889285215061678,0.7782418372521813,0.7844356350795805,0.8071202765437958,,, +26.1171875,52,0.8456085055047399,0.8989276356091161,0.9658367400053446,1.0448485422090918,1.1342556247190556,1.2321604963785255,1.3365089919030924,1.4451264186574682,1.5557558176473034,1.6660976686757718,1.7738503443259193,1.876750604308352,1.972613421018404,2.0593704388421905,,, +26.125,52,2.135106393679725,2.1980928548670158,2.246818698557269,2.280016778860732,-0.43212402511821785,-0.26028144039999124,-0.13191762760460626,-0.059263490834542076,-0.050539563380244346,-0.10937788206972876,-0.2345641248701439,-0.4201180031631581,-0.6557063118399269,-0.9273598423668288,,, +26.1328125,52,-1.2184441738903555,-1.5108166530009244,-1.7860888884537998,-2.0269067284834263,-2.2181584684351128,-2.3480270403449093,-2.4088128149446035,-2.3974696416442907,-2.315816748062492,-2.1704117231791282,-1.9720934410807491,-1.7352267975168418,-1.476701924210616,-1.2147576660871229,,, +26.140625,52,-0.9677113604667796,-0.7526834903475389,-0.5844061405162722,-0.4741983406425098,-0.42917974115909097,-0.4517774472845041,-0.5395603929602563,-0.6854127953549757,-1.951045401795673,-2.1342386031862195,-2.179408344043167,-2.0680174704215504,-1.8056375972336585,-1.4211374283660612,,, +26.1484375,52,-0.9622431113936256,-0.4881618339207002,-0.060417282463862125,0.2666759035308117,0.4544153202127332,0.4856830782930173,0.3675572429831496,0.1301559679958163,-0.1781053728029844,-0.4981050666624979,-0.7692713837125783,-0.9390623769996318,-0.9711924032512615,-0.8513238254135871,,, +26.15625,52,-0.5893371842125078,-0.2178260633603959,0.21294908623684985,0.6428623444116874,1.0112639640591974,1.2664073597773664,1.3734932318508215,1.3200779828487854,1.118004088839131,0.8015517902675244,0.4220999959349752,0.04012798091760805,2.049423153693369,2.2898859212427873,,, +26.1640625,52,2.2501618523260927,1.9456647471970785,1.4618778720112806,0.9309783213107836,0.495685539645904,0.270241264868161,0.30921415660823315,0.5926776808812276,1.0318222331284386,1.4934619122518995,1.8367177568419304,1.951821922362444,1.7904058783993793,1.3789695834248523,,, +26.171875,52,0.8118381057777915,0.2255339757197896,-0.23841309599063695,-0.4720285467532047,-0.43026071477175015,-0.1431073298783943,0.29282067066611844,0.7409838616141187,1.0625321468085092,1.1545438984060703,0.9784044703359772,0.5705447690482635,0.032595287916610136,-0.4963472267070294,,, +26.1796875,52,2.29668632960891,2.2961107043694686,2.277870143961588,2.2418493477890697,2.1882397162920237,2.1175362251249004,2.0305289856661872,1.9282896395036333,1.812152825001342,1.6836930403313328,1.5446973079691064,1.3971341191625273,1.2431192020184636,1.0848787124798238,,, +26.1875,52,0.9247104925726171,0.7649440741616087,0.6079001284088085,0.4558500708341813,0.31097652916398266,0.1753353660260666,0.0508199213447893,-0.060871899589723825,-0.15826711622943734,-0.2401432248133083,-0.30554936507714936,-0.3538227311297829,-0.38459993927899694,-0.3978231538916301,,, +26.1953125,52,-0.3937408641565336,-0.3729032982841045,-0.336152555570056,-0.2846076292428881,-0.8780345847345179,-1.1027339027871736,-1.3424563949902644,-1.5789795095649497,-1.7941885085613047,-1.971345197976376,-2.0962608910082547,-2.158291796166284,-2.151087404354473,-2.073039672781285,,, +26.203125,52,-1.927401667514429,-1.7220673758335798,-1.4690280268938358,-1.1835428170323794,-0.8830818512322977,-0.5861149961490912,-0.31083108498076184,-0.07387677110037373,0.11079704288856296,0.2329007756918361,0.2865164223363388,0.27050298250375204,0.1885688075091668,0.049005837979500984,,, +26.2109375,52,-0.1358957184095929,-0.3507114360195969,-0.577965177738803,-0.799354555980432,-0.9970338768906712,-1.1548650883283031,-1.2595494837075427,-1.3015612294758525,-0.2841963763357976,-0.5003759393349191,-0.575433547711248,-0.499028674540169,-0.28504467399950845,0.030600470262918626,,, +26.21875,52,0.3955787576971462,0.7493359128641209,1.0325594108694365,1.1964558905804548,1.2103927342072198,1.0667133680352192,0.7819760345851388,0.3944228386151375,-0.04192698565616466,-0.4656398517508423,-0.8173843733098926,-1.0491197213197396,-1.1315249380345511,-1.0585123422216234,,, +26.2265625,52,-0.8481223295269003,-0.5396604880261118,-0.18752322624394666,0.14732611097497084,0.4069027194551629,0.5452803742383122,0.5357915007830598,0.37522557397358297,0.08437167699567116,-0.2951795196241468,-0.7074764703767895,-1.0908871895661079,-0.8633060147025113,-0.4740914914593175,,, +26.234375,52,0.0513121444517126,0.5728394968571573,0.9535640673104844,1.0971761453394604,0.9743074638769093,0.6304884726097807,0.17355822483487576,-0.2560215177899013,-0.5238107400718185,-0.5384015266623597,-0.27664935761244924,0.20979146344889954,0.8084212059406041,1.3765146266846475,,, +26.2421875,52,1.7800173924856308,1.9300607304017776,1.8070888498367468,1.4659886809145228,1.0208181814333377,0.6133208777521411,0.37385798467247455,0.3854675168544763,0.6609027239350648,1.138944854068737,1.7010026333749342,2.2034507496479785,2.516845904925705,2.5612739167499883,,, +26.25,52,-0.2196445824734674,-0.14287222479614908,-0.05610371497068739,0.03867541235265004,0.13934223618768565,0.24367384219834115,0.3493864642378561,0.4541756889599015,0.5557570193948955,0.6519060871078308,0.7404978087087154,0.8195438009661306,0.8872273992798531,0.9419356662232348,,, +26.2578125,52,0.9822878295786176,1.0071596518088568,1.0157033041478485,1.0073623972141048,0.981881904857016,0.9393128073702732,0.8800113726704795,0.8046330879334908,0.7141213478488583,0.6096910974708065,0.4928077159891765,0.3651615110754657,0.22863827032845505,0.08528638537297134,,, +26.265625,52,-0.06271887580612362,-0.21311332278316572,-0.36358335836918976,-0.5118063641935114,-1.2758176038881073,-1.18203919515627,-1.024774927667672,-0.8130901580880314,-0.5599395789309727,-0.2812686471278216,0.005093813424072502,0.28067462364879703,0.5276404851514059,0.7300378956004268,,, +26.2734375,52,0.8749022889839329,0.9531590647149266,0.96025368109294,0.8964668810455115,0.7668930740397587,0.581083386446521,0.3523782755843084,0.096976249556052,-0.1671963636287198,-0.4217357815175769,-0.6490440745986191,-0.833555926602035,-0.9628233027825852,-1.0283823905671865,,, +26.28125,52,-1.0263423606301658,-0.9576548956112412,-0.8280456955855138,-0.6476127416253641,-0.4301193375949993,-0.1920312351752959,0.0486350062439769,0.2735721092188033,-1.3876675756449346,-1.5529274824041015,-1.5615981811626072,-1.4123161339205077,-1.1276182794449947,-0.7504185161235011,,, +26.2890625,52,-0.3373142686486467,0.05023426364905803,0.3554782586720775,0.5352165803766599,0.566517945239846,0.4502819569410621,0.2110844036582525,-0.1066690212369762,-0.4456814114449922,-0.7447149097556965,-0.9481583646561821,-1.0147220251440079,-0.923904867753214,-0.6792270568992149,,, +26.296875,52,-0.307723870908447,0.1442202927168533,0.6180491814817244,1.0521055621278017,1.3911831175617912,1.5950718677867082,1.644766389257375,1.5453701462908946,1.3252438524634909,1.0315307969011254,0.722756380584366,0.459654816848255,1.3448718190938158,0.8587076891833021,,, +26.3046875,52,0.5505109476467901,0.4954405825292753,0.6966749397242582,1.0845841585616829,1.535879494135127,1.907490747835294,2.075886295327862,1.9710583553910064,1.5958580554956407,1.0253798561851788,0.3865626050823219,-0.17640363060002184,-0.5413857295145297,-0.6415593362701689,,, +26.3125,52,-0.4834929579915205,-0.14511006182409336,0.2459101999916382,0.5473717788178033,0.6417799648316068,0.4687883472807507,0.041979594226376094,-0.5546211914286997,-1.1893470381688571,-1.7187566553109457,-2.026740669017002,-2.0561505142258603,-1.8242831434412463,-1.41797920997869,,, +26.3203125,52,-0.6554912491177987,-0.7924184505396836,-0.9204786882300492,-1.0377097921876244,-1.142330959707217,-1.2327738418837977,-1.3077099152733442,-1.3660736594838785,-1.407081134903006,-1.4302436353054937,-1.4353761763258897,-1.4226006711954866,-1.3923437381696135,-1.345329178064444,,, +26.328125,52,-1.2825652536485088,-1.2053269936455062,-1.115133831224919,-1.0137229685445646,-0.9030189337405684,-0.7850998634349478,-0.6621611011505696,-0.5364767490313419,-0.41035984609249576,-0.2861218702712578,-0.16603227339446675,-0.05227875758400047,0.05307101134877068,0.14810558314248026,,, +26.3359375,52,0.2311031614844413,0.3005617160820697,0.3552252411799096,0.3941057007612964,0.4654627386422755,0.6091914188711629,0.6929031866095197,0.7088351455137274,0.653862924133505,0.5297239189036671,0.34290174212030244,0.10417991954738016,-0.1721040539519852,-0.4690522978446632,,, +26.34375,52,-0.7683784973261237,-1.051676513821711,-1.30169720577763,-1.5035444387472423,-1.6457068992588402,-1.7208537771795498,-1.7263388476941752,-1.6643778184562614,-1.541886591876275,-1.3699917381006976,-1.16324733209883,-0.9386127844830549,-0.7142629623533789,-0.5083135913627477,,, +26.3515625,52,-0.3375508378447526,-0.21625367821288236,-0.1551911923570496,-0.16086471954580572,-0.23504774007383344,-0.3746555842562321,-0.571954070155816,-0.8150925365043742,0.2956520791447824,0.26848771927484594,0.3942807915302353,0.6649644316629131,1.049488948178393,1.4986063107142336,,, +26.359375,52,1.95249109027218,2.3500111038842224,2.63820405491217,2.7804843628420466,2.762302142446837,2.593373118585607,2.3061323419213644,1.9506527169685923,1.5868199603151207,1.2749829138708006,1.0665355903431981,0.9958979414524832,1.0751444607600202,1.2921172981491535,,, +26.3671875,52,1.6123178110716307,1.9842819451616536,2.347602190931739,2.6423466239908224,2.8184079122131336,2.843326060636,2.7073663679813684,2.425061564151412,2.0329778012661346,1.584052306989397,1.1393844727825777,0.7587587737651688,-0.4838318518102343,-0.609561942943849,,, +26.375,52,-0.9749610617130352,-1.488496361575249,-2.015406439699988,-2.414643343252709,-2.577560148031566,-2.4577406472023173,-2.0837951662580227,-1.5516147957888926,-0.9982059737612496,-0.5642754402212898,-0.3558186009976013,-0.4152373131747242,-0.7099012307459233,-1.1412859615843962,,, +26.3828125,52,-1.572181685697167,-1.864513216004535,-1.9174041254444556,-1.69505061218407,-1.2367635783011592,-0.6464245331080949,-0.06424298340961576,0.3714463775416731,0.561878540293242,0.4747161204375492,0.1527113831449945,-0.2981997766484277,-0.7381070543545254,-1.0316311523986,,, +26.390625,52,0.4165002762103458,0.42200361446480217,0.41051486223285416,0.3822393631494249,0.33768498819824644,0.2776531637030613,0.2032247540373514,0.1157410463025268,0.016780169985458282,-0.09187063545161384,-0.2082464193933745,-0.3302390354505016,-0.4556341689589729,-0.5821502281861364,,, +26.3984375,52,-0.7074784181811741,-0.8293232955039631,-0.9454430936436828,-1.053689112943586,-1.1520434852396946,-1.2386546518638553,-1.311869933705821,-1.3702646229431734,-1.412667086947131,-1.4381794447040803,-1.446193453607718,-1.4364013283453847,-1.4088013023365105,-1.363697834238771,,, +26.40625,52,-1.3016964557975654,-1.2236933511445454,-1.1308598499001117,-1.0246221054897289,-1.088924115789143,-1.3760560618967272,-1.6580569037991024,-1.916736260338994,-2.1354080837323792,-2.300049254447561,-2.400272747022085,-2.4300475163207014,-2.388114915115908,-2.2780726150292603,,, +26.4140625,52,-2.108120188253282,-1.8904841002313109,-1.6405622184548367,-1.3758475008099882,-1.1147059246761213,-0.8750938814520165,-0.6733044816643754,-0.5228301990030394,-0.4334211681097343,-0.4104048066001749,-0.45431420799135996,-0.5608512198108055,-0.7211867816685711,-0.9225775790428647,,, +26.421875,52,-1.149256009996103,-1.3835314022372622,-1.6070256859742988,-1.8019573511409759,-1.9523841497861807,-2.0453178804221763,-2.07163351049733,-2.0267092338434383,0.4913754248157548,0.3682323066538869,0.3973444878293945,0.5625456854446234,0.8260580902410528,1.1344300290527904,,, +26.4296875,52,1.4269163705084094,1.6449961024855222,1.7415443834908382,1.688230183296581,1.4799869991468912,1.1358600163897372,0.6960974704665649,0.21593895430233748,-0.242932113487316,-0.6219408202127823,-0.8746903421374685,-0.9741364135643502,-0.9167494816060446,-0.7230165197581152,,, +26.4375,52,-0.4342045791770524,-0.1058903977629509,0.2007359233676438,0.4284384808233954,0.5328839884256646,0.4895771280103675,0.2977024682643925,-0.01972557465536551,-0.4194281997191275,-0.8445878552041552,-1.2336865591412238,-1.5300803379971328,-0.4429194278569877,0.09383327477564833,,, +26.4453125,52,0.5959301826467249,0.9291367038398708,1.0033981447146174,0.7975212540556007,0.3650050133290945,-0.1805775958618264,-0.6966408577966191,-1.0505782919640057,-1.155999623075187,-0.9962822993774458,-0.6289839866606867,-0.16990806465385616,0.2388091915746839,0.4678417454436963,,, +26.453125,52,0.4363175104893655,0.13419188015131678,-0.3747828166935681,-0.9703078255383051,-1.5082827008546875,-1.860072057506484,-1.9475346565350065,-1.7642165545907533,-1.3769020358507174,-0.907099342637631,-0.4975374261457786,-0.2728578853109197,-0.3052770856885296,-0.5946311552778227,,, +26.4609375,52,-0.9066363143965828,-0.7787599101368785,-0.6430192362371348,-0.5015742641369072,-0.3566809736807458,-0.2106520548006014,-0.06581661836615801,0.07552037845306736,0.2111182819828825,0.33883976410579336,0.4566880334350338,0.5628415841746728,0.6556858743374694,0.733841378770279,,, +26.46875,52,0.7961875259128971,0.8418820992866369,0.8703757641323607,0.8814214649657575,0.8750785296348728,0.8517114081517951,0.8119830685155461,0.7568431652995719,0.6875111883052724,0.6054548864828453,0.5123643450484122,0.4101221698437303,0.30077030113787906,0.18647403809679133,,, +26.4765625,52,0.06948390398279612,-0.047903980046352816,-0.1633883185483958,-0.2747031548776361,-1.9107528219563128,-1.72879150296883,-1.4903260647410368,-1.2086732925252397,-0.9000425844081781,-0.5824111237376299,-0.274276034353081,0.006629477737917222,0.2445664818353248,0.4268813960851823,,, +26.484375,52,0.5448817071879755,0.5944352841830218,0.5762515092840808,0.4958246370651361,0.3630433475399392,0.1914937363740068,-0.002495636651686034,-0.20100003244554465,-0.38575619971315006,-0.5394437061879619,-0.6469005654807076,-0.6961883727449645,-0.6794326565032563,-0.593379828865941,,, +26.4921875,52,-0.4396318788841902,-0.224542425842412,0.04121863616523425,0.34340156069823274,0.6651629022593946,0.9882326494609568,1.2941809665359905,1.56569622539985,-1.6908185403929046,-1.6933343763039683,-1.53896457899596,-1.2527499468354657,-0.8795477739174087,-0.477061600757135,,, +26.5,53,-0.10687383990430743,0.17512212541805894,0.32740025521362537,0.3292390408035509,0.18391511330326735,-0.0818439602569555,-0.4220622591873839,-0.7787186769599621,-1.0908285114793144,-1.3039887284719605,-1.3788999183394073,-1.2975373427649275,-1.066009625966462,-0.7136595556306536,,, +26.5078125,53,-0.2885467646134179,0.1499843980870727,0.5404945036416533,0.828965143224663,0.977159598345102,0.9685261505645856,0.8107248425011502,0.5343844119621373,0.1882832846605544,-0.16829452547915366,-0.4748377459778743,-0.6790750139242073,-2.0485884394766045,-2.288519671482455,,, +26.515625,53,-2.2522084527192017,-1.9444109934868024,-1.44175783836075,-0.8717495743160761,-0.3778332455031324,-0.08013088370090815,-0.042582980660726084,-0.2555113808433908,-0.6383798726317901,-1.0619949795163774,-1.3840612919888629,-1.4883454265814915,-1.3167135181307217,-0.8852601510670137,,, +26.5234375,53,-0.2801065581531925,0.365982162107112,0.9097542308100732,1.2364952039396897,1.2912256002753506,1.0935239508638506,0.7319148880934921,0.3393625105071137,0.056587725030402665,-0.006734680481051858,0.1977375700157329,0.643546990732785,1.2364811241548066,1.8402004280788724,,, +26.53125,53,-0.3796577642176423,-0.4761752279119834,-0.5623290135300575,-0.6363769200199343,-0.6967917934485233,-0.7422884753668321,-0.7718465118118287,-0.7847282251868114,-0.7804918324585377,-0.7589993798515828,-0.7204193549821725,-0.6652239305746532,-0.5941808879036945,-0.5083403612698396,,, +26.5390625,53,-0.40901663549314254,-0.2977653150404194,-0.17635626444173785,-0.04674279369633971,0.08897237187029225,0.2285737415462729,0.3697716873278932,0.5102423738962254,0.6476682914054808,0.7797786814449243,0.9043891484223838,1.0194397628602545,1.123030989509633,1.2134568112720403,,, +26.546875,53,1.2892344690093918,1.3491302965893779,1.3921811988693906,1.417711396619726,1.7877852227719857,1.9488119028051856,2.041302166785419,2.0624586625102226,2.0143496695374985,1.903758922304948,1.7417068564773281,1.5426766760073212,1.323599221605386,1.1026674402161245,,, +26.5546875,53,0.8980631369362916,0.7266848069521369,0.6029652690672693,0.5378615595399642,0.5380875319351682,0.6056426833064593,0.7376700694388438,0.9266532226843348,1.1609383453903694,1.4255453686309203,1.7032113216279003,1.9755932566742551,2.224546847236132,2.4333914991332533,,, +26.5625,53,2.5880737543830685,2.6781478588089977,2.6975051134561308,2.644801147130937,2.523551311486126,2.341887542132678,2.1119936355106828,1.8492583155573377,-0.7451560906389286,-0.6592726383628955,-0.43184289063495296,-0.0959197552765843,0.2979298743033787,0.6894771784261826,,, +26.5703125,53,1.0181919764385323,1.2326539566145274,1.298548818486999,1.2040039626996035,0.9614327225071309,0.6055999233206775,0.18821008382047025,-0.2301388319772429,-0.5893828939909541,-0.8393325857742576,-0.947471340584008,-0.9039976602648436,-0.7233255897267649,-0.4418099687964335,,, +26.578125,53,-0.1120509126306278,0.2053352071442366,0.4511963855416508,0.577100356596424,0.5529229290083681,0.3715871348993448,0.050214804684014964,-0.3724890469026256,-0.8422118892382333,-1.2974389269759818,-1.6789790493191277,-1.939128044160474,2.500758263938731,2.2006195556765715,,, +26.5859375,53,1.7451792141801217,1.2714978109742263,0.9189816336818928,0.7911385731293894,0.9271954797144332,1.2913558901080848,1.7826421209140184,2.262623961726444,2.5934338161858363,2.6756487343145743,2.475656068804087,2.0350015279614952,1.4591563097264837,0.8887804527202606,,, +26.59375,53,0.4613566547290751,0.27370784258478603,0.355669451476922,0.6621301015259196,1.0856200520569983,1.4859952225405917,1.7290791445152318,1.7236700855335991,1.4467686402020257,0.9501095164178608,0.3462052403670733,-0.2222752721047712,-0.6214028422580838,-0.7625004783831411,,, +26.6015625,53,1.4253441452575757,1.4150082222669589,1.386939069780989,1.3416745723835726,1.2800455441248664,1.2031610913808717,1.112389107912434,1.0093322437043757,0.8957997684225986,0.7737758222058955,0.6453846097620207,0.5128531472651895,0.3784722143856401,0.24455619522045005,,, +26.609375,53,0.11340251133930107,-0.012748642702511637,-0.1317535563224751,-0.2416025649390521,-0.340455259334528,-0.4266727258243027,-0.4988462526968664,-0.5558220002623014,-0.596721202536736,-0.6209555468246079,-0.6282374619045059,-0.6185851346755485,-0.5923221674293777,-0.5500718817583392,,, +26.6171875,53,-0.4927463688505313,-0.4215304779167154,-0.33786102312822697,-0.24340157317762426,1.571205142844184,1.2962738796026223,1.042538281736997,0.8264497213849407,0.661694241619881,0.5582427342323371,0.5216604637987045,0.5527240755573681,0.6473727822099381,0.796997120820221,,, +26.625,53,0.9890451306133481,1.207903667186093,1.435993382039732,1.655000996321186,1.8471629232912763,1.9965107129512067,2.0899914541655096,2.1183849889454724,2.076953962199026,1.9657813602668293,1.7897719837627275,1.558317735021738,1.2846500436043078,0.9849245701011944,,, +26.6328125,53,0.6771019975254793,0.37970293903772906,0.1105237690852523,-0.1145970899825981,-0.2828764120203625,-0.3854704444069136,-0.4180845717165107,-0.3812658683122527,-2.049042146251628,-2.0031737415270414,-1.8200786358757832,-1.539469444627811,-1.215974343970564,-0.9105735797583958,,, +26.640625,53,-0.6810478261562587,-0.5729263901808768,-0.6123453971389504,-0.8019285935308316,-1.1203326052206288,-1.525527718942604,-1.961303415046824,-2.365985593462812,-2.6820079369813485,-2.8648468034892027,-2.8899281555413587,-2.7564308836564333,-2.487394264143286,-2.126112923491009,,, +26.6484375,53,-1.729380901928912,-1.3586371578354481,-1.070391695644502,-0.9074235256429876,-0.8921214260757312,-1.0230047041249328,-1.2749658296826374,-1.6031970936871731,-1.9501896159721064,-2.254714472796255,-2.461386968933212,-2.5293242323243845,0.19817254956404876,0.6297996098672931,,, +26.65625,53,0.896162708720303,0.9137285862137704,0.6692120607325068,0.22326612380601146,-0.3061141346723581,-0.7759254957994292,-1.0573667086257137,-1.0711782002539492,-0.8094254360640933,-0.3377551541040653,0.22249469909960876,0.7274291966666722,1.0498949001007971,1.1141733801941551,,, +26.6640625,53,0.9165628353527348,0.5262086433993014,0.0659569839959257,-0.32151914416810423,-0.5130356999136368,-0.43887785140390667,-0.1021296364381249,0.4219467844180765,1.0063143060155781,1.5067567380267242,1.8011877839656565,1.822901810414628,1.578655387872895,1.1466259335758264,,, +26.671875,53,-0.1400132649156096,-0.0297221521483243,0.08531633865348665,0.2028552233221341,0.3205953834551476,0.43622590803640987,0.5474646467862767,0.652098265108479,0.7480210992252638,0.8332721310905477,0.9060694356035954,0.9648414968894312,1.008254845239538,1.0352375307268598,,, +26.6796875,53,1.044998022403135,1.0370392020872576,1.0111672076381153,0.9674949707916548,0.9064403875347176,0.8287191529729566,0.7353323860671058,0.6275492608430474,0.5068849481127109,0.3750742538509824,0.2340414157313512,0.08586658657701313,-0.06725040849226771,-0.22302840670987292,,, +26.6875,53,-0.3791446629768491,-0.5332753298250275,-0.6831359533443127,-0.8265212760938618,-0.2803581553304815,-0.1251227118366276,0.0709488954123404,0.2915819300117162,0.5188594915933418,0.7344778290625694,0.9210284107368776,1.0632173354237011,1.1489370384389999,1.1701155470815463,,, +26.6953125,53,1.1232840528838477,1.0098232112420105,0.835870983056139,0.611898435436114,0.3519830735134084,0.07283036821794454,-0.2073882952642894,-0.4703002213207759,-0.6986103809293072,-0.8773055796698269,-0.994699850441343,-1.0432481756606995,-1.0200717980449785,-0.9271584900943384,,, +26.703125,53,-0.771223817733193,-0.5632430726906232,-0.3176865126913887,-0.05151123699231214,0.2170200054390234,0.4696107100656395,0.6892045240849733,0.8611723381192643,-2.438547510703719,-2.193131806593257,-1.8206120895783648,-1.3677383668803047,-0.8932405631611107,-0.4587298849459006,,, +26.7109375,53,-0.11915358508127005,0.08571040811239927,0.13739450644562512,0.04156190083189848,-0.17293259353492946,-0.4585947209228238,-0.7567466805759955,-1.0067251459138815,-1.1553884734306197,-1.165452009903856,-1.0213529384416271,-0.7317308948054781,-0.32813770209186915,0.13982308693690856,,, +26.71875,53,0.6121700663875549,1.0278362850103278,1.3341329077530244,1.49491045241828,1.4961466691573069,1.3480909301485808,1.0836313231200263,0.7531389597585684,0.41659268512442654,0.13421094792693775,-0.04294990975097301,-0.08096647381830613,0.037450852342265306,0.09066840794374832,,, +26.7265625,53,0.3923835646519935,0.8591606028374903,1.3599699918611197,1.7520517290983408,1.9200157204508743,1.8074632948831868,1.432463471482032,0.8826423172824059,0.2912309666349984,-0.19936367257333787,-0.4764820438851825,-0.4879621262796375,-0.2562900488750843,0.12772587207254188,,, +26.734375,53,0.5300225021778272,0.8102188835168498,0.8602978287924286,0.6344288247898475,0.16175675097019304,-0.4613506096189531,-1.0974736303241803,-1.6055599072759348,-1.8793380568239104,-1.87620035301064,-1.6286405090790603,-1.2351139887647475,-0.8328278507074736,-0.5599196334050861,,, +26.7421875,53,-0.9613436501641416,-1.0856693878943255,-1.1977524138538205,-1.2960646289688726,-1.3793224552310923,-1.4465090963137377,-1.4968921244355,-1.5300360856460011,-1.54580990294335,-1.5443889477171768,-1.5262517433742833,-1.4921713589931007,-1.4432016438332729,-1.3806585438614554,,, +26.75,53,-1.3060968275712703,-1.2212826287584972,-1.1281622871564585,-1.0288280326676378,-0.9254811141862036,-0.8203930187620202,-0.7158654602896996,-0.614189838451668,-0.5176068779274716,-0.4282671547126564,-0.3481932008701988,-0.27924385139205576,-0.2230814575901829,-0.1811425412477972,,, +26.7578125,53,-0.15461240350572505,-0.14440413321974946,-0.15114238248501288,-0.17515219355240166,0.9743297882516324,1.0217142211623536,1.0010669492739237,0.914987174633776,0.7707468565541113,0.5797794422117141,0.35687812265670155,0.11915953306794255,-0.11513482697675742,-0.32791586051940314,,, +26.765625,53,-0.5025137471492863,-0.6248460676497855,-0.6844057087443287,-0.6749996441559791,-0.5951870599035645,-0.4483862570269217,-0.2426428617373894,0.009924509241857948,0.29396248864453456,0.5919466670807841,0.8853966106708244,1.156157477592289,1.3876588792306528,1.5660632185913692,,, +26.7734375,53,1.6812234457835165,1.7273834604073628,1.7035723367275664,1.6136648981878419,1.4661044342775824,1.2733069125276024,1.0507882486238775,0.8160755094677556,0.03165339033046355,0.2821699654813774,0.6355893804125137,1.0401115624085024,1.4351998975081812,1.761015685688721,,, +26.78125,53,1.9677478832184707,2.0233849133071704,1.91871796185762,1.6687963659757026,1.3106082887424717,0.8973477865577215,0.4901610446918165,0.14865717233655862,-0.07833864144176328,-0.16034957369437375,-0.08995123488510348,0.11611709107187708,0.4196068690473959,0.7667666999751537,,, +26.7890625,53,1.096764880595525,1.3512160037003036,1.4833275004924795,1.4652412178072804,1.2924262523997427,0.9844385448856292,0.5819286318855603,0.1403633252231123,-0.27856108713303124,-0.6164769618659796,-0.8273862922223628,-0.8847766588547294,-1.192416886234687,-1.7673539057622658,,, +26.796875,53,-2.3262294157744927,-2.7311530784456624,-2.8838589031088397,-2.7525565747356833,-2.3805858583546518,-1.8745026628712216,-1.3748623073788753,-1.0177075027298599,-0.8973159111694667,-1.0404167269885511,-1.3989422025371774,-1.863299972522993,-2.2925277022711046,-2.5530644635401463,,, +26.8046875,53,-2.555511481597972,-2.2793057886072665,-1.7785428797278624,-1.1673508273281985,-0.588822522726325,-0.17601883808017993,-0.01572854132868995,-0.1249151899205012,-0.44630406452816573,-0.8643164686230353,-1.2369821126878984,-1.4350812035090366,-1.3777864488261682,-1.0550345101731466,,, +26.8125,53,-0.21645307291062246,-0.2747584164304564,-0.3494802957696849,-0.4397395223611609,-0.5443808128978318,-0.6619927908938475,-0.7909324742314732,-0.9293538200425234,-1.0752398272341908,-1.2264376346753725,-1.3806960005940223,-1.5357045070574855,-1.6891338031828431,-1.838676182544868,,, +26.8203125,53,-1.9820857843959916,-2.117217714887754,-2.2420654034102383,-2.354795540049237,-2.4537799825243694,-2.5376240740323333,-2.6051908762558655,-2.655620893334055,-2.688346941528573,-2.703103904324451,-2.69993320225528,-2.679181899284809,-2.6414964614899312,-2.5878112774236444,,, +26.828125,53,-2.5193321412586918,-2.43751498800927,-2.344040253266624,-2.2407833064881166,0.5874779908392471,0.382803882417774,0.21811202700150625,0.10658583318221017,0.05760788221071511,0.07609977433822868,0.16217326347173178,0.3111170213921989,0.5137199677505927,0.7569086317232488,,, +26.8359375,53,1.0246541121953403,1.2990854028074816,1.5617314570714798,1.7948053906706458,1.982441279025916,2.1117973131770915,2.173948395599001,2.1645059398266016,2.083921659971998,1.9374541718256757,1.7348007396752612,1.4894198526231834,1.2175918728257842,0.9372832623357944,,, +26.84375,53,0.6668935914909928,0.4239727049997119,0.2239975020125773,0.07929362859956379,-0.0018227249975596442,-0.015623079391946404,0.036775347127152025,0.14948990632437276,-0.7857040542287127,-0.55120691078052,-0.22298708619778088,0.14312501214857656,0.4859031079098506,0.7482951809219991,,, +26.8515625,53,0.8863402555217007,0.8760428481116127,0.7171341930250525,0.4331342848057809,0.06770496145276181,-0.3221380372497924,-0.6748968508519652,-0.9341653438539116,-1.0574138697846234,-1.0226166903792024,-0.8316897832837197,-0.5102035495498828,-0.10341511535266877,0.33076185556665505,,, +26.859375,53,0.7307549435559695,1.0408970101517414,1.2200669737882304,1.2480616285236026,1.1287062298069737,0.8892195423001805,0.5759324478229925,0.2470271784810729,-0.036571693024245566,-0.22073548786547334,-0.26661299712258224,-0.15673408638592526,0.6196269688451239,0.9729676943633332,,, +26.8671875,53,1.057909174635514,0.8683915871655009,0.4716409479580405,-0.01035181266387894,-0.4343402898408231,-0.6751359902648801,-0.6599506091721731,-0.3883547799358965,0.0676168215427832,0.5832426397119723,1.0153529531776573,1.2416457440212259,1.1943036347878713,0.8786975224725926,,, +26.875,53,0.37204964756916975,-0.19757881568404084,-0.6862182604280971,-0.9732674642794736,-0.9943538802094708,-0.7587732480260772,-0.3467308129623929,0.11285771266826733,0.4779192606129919,0.6323844180742828,0.5182213316389312,0.15156082409645488,-0.3815088125977072,-0.9483269118727032,,, +26.8828125,53,-2.1297814756366242,-2.0131982406456483,-1.893285222755237,-1.7723426353633116,-1.6526788889591806,-1.536570057528995,-1.4262199162379083,-1.3237212501879885,-1.231019111798768,-1.1498766702211456,-1.0818442508191441,-1.0282321068853904,-0.9900874004034952,-0.9681757949703088,,, +26.890625,53,-0.9629679832231968,-0.9746313847178399,-1.0030271596605775,-1.0477125908180605,-1.107948791924648,-1.1827136076418852,-1.2707194792139536,-1.370435963012278,-1.4801165076893499,-1.5978290210831434,-1.7214896916642206,-1.8488994723154517,-1.9777825876203905,-2.1058263904023726,,, +26.8984375,53,-2.2307218696187032,-2.350204100321604,-2.46209192739303,-2.5643261881828705,0.3122854402850441,0.5112910544864963,0.7299707545467538,0.9502802540200253,1.1539292775850611,1.3236613266849533,1.444461656265215,1.5046092166299747,1.4964991945657,1.4171787840932044,,, +26.90625,53,1.268558813980336,1.0572864621030431,0.7942879196591375,0.4940128831649468,0.17343354413285889,-0.1491321344644041,-0.4552908132473938,-0.7278492697000809,-0.9520060611885268,-1.1163762753768112,-1.2137779252950611,-1.2417251678694323,-1.202593969067176,-1.103448680329275,,, +26.9140625,53,-0.9555416368389392,-0.7735206895001029,-0.57439994927607,-0.3763655345095335,-0.19749961760954504,-0.054511764653740746,0.038433947175017136,0.07071422844119646,0.10221561099195496,0.4803813635363097,0.9293339792941882,1.389557060744679,1.7996609885470898,2.105888799753607,,, +26.921875,53,2.270433661681209,2.27727274099892,2.1346090987745097,1.873541555188108,1.5431699749140582,1.202898618415556,0.9131366112851904,0.7258442305562476,0.6763977099685412,0.7780398868847166,1.0197812409142988,1.368078442363554,1.77202914528557,2.1712740690937244,,, +26.9296875,53,2.505375720201198,2.7232130919260924,2.790929172754308,2.6971934808390348,2.4549600210030085,2.099446896189108,1.682652281550076,1.2652609280658371,0.9072017802340924,0.6583273674765971,0.5506666412084921,0.5934578365775829,-1.5947559382796936,-1.2914954138633858,,, +26.9375,53,-0.818696059953136,-0.309811965981155,0.09389769777529766,0.2821755288583222,0.2060554814387896,-0.10866702275327322,-0.5684767675242703,-1.0377626381300895,-1.3760011428860357,-1.4763086091052928,-1.2947957821159468,-0.8626791364184873,-0.2778288750590082,0.32193081467500606,,, +26.9453125,53,0.7964527088432186,1.0415164195277329,1.017215451181643,0.758702953986296,0.3663527776803132,-0.021965799333614592,-0.2688990797120402,-0.275486008798398,-0.008518242173142676,0.4901174856383261,1.1146773171368154,1.7243007407574475,2.181378839146056,2.3890368697161013,,, +26.953125,53,-2.6550058047597487,-2.732421113776508,-2.7950838503309,-2.8417532607745235,-2.871457887209325,-2.8835126421943094,-2.877530874648453,-2.8534312156402994,-2.811439084151457,-2.752082826404449,-2.676184556305805,-2.5848458573399986,-2.4794285962155485,-2.3615311841612847,,, +26.9609375,53,-2.2329607014757107,-2.095701373361808,-1.9518799489746472,-1.8037285898157465,-1.6535459172315232,-1.503656900995913,-1.35637229124643,-1.2139483040464196,-1.0785472663850024,-0.9521999096416012,-0.8367699716645259,-0.7339217271878091,-0.6450910150405827,-0.5714602693588667,,, +26.96875,53,-0.5139379919110777,-0.4731430248743129,-0.4493938993426689,-0.4427034459730956,0.03599487036834004,-0.06732016569891419,-0.2359701951283447,-0.4620580763458647,-0.733593952618402,-1.0353245678748435,-1.3497903407633252,-1.6585364984368307,-1.94339382798793,-2.1877397483126404,,, +26.9765625,53,-2.3776517769714816,-2.502872969678604,-2.5575220212341074,-2.5404985216382743,-2.455555118299269,-2.31103156226572,-2.1192691936346097,-1.8957467045526144,-1.6579974537071387,-1.4243838385574408,-1.2128141986042391,-1.0394917297259971,-0.917782656554913,-0.8572825928491236,,, +26.984375,53,-0.8631461987086201,-0.935726882143464,-1.0705516712983532,-1.2586330102946222,-1.4870957360674686,-1.7400755141721738,-1.9998260810157755,-2.2479580783938884,0.7717349143421259,1.0486876299753,1.3714274958624968,1.679261398468172,1.9131840345331568,2.025110476387459,,, +26.9921875,53,1.985410637300536,1.787571881403117,1.4492633161048991,1.0096357498248232,0.5232776020809238,0.05176789662610076,-0.3458582727233803,-0.6222470323989507,-0.7490428823273421,-0.7212463184798601,-0.5579334957467325,-0.2992261341612035,1.6085028967632864e-05,0.2787978999013215,,, +27.0,54,0.4795454717964822,0.5571291772464901,0.4859465656507341,0.26396200813745063,-0.08692641592124263,-0.5242501852216002,-0.9915401429443006,-1.4270797815981124,-1.7734788417608287,-1.9865762763544668,-2.0422860703066,-1.9403197990839616,1.5798389542820686,1.1617868494047,,, +27.0078125,54,0.8921542185814303,0.8624838194859809,1.0961735410795659,1.5419431998820352,2.0877888019628554,2.5916007280010427,2.9200550238604044,2.9851193689913065,2.7681688352678977,2.32510212572909,1.7710559723265604,1.2489066965236058,0.8901911840917456,0.7791569367855756,,, +27.015625,54,0.9297930845396212,1.2821363655924949,1.7188632174349818,2.097619144743489,2.2902232658566293,2.218001524527249,1.873562951531652,1.3230488119156516,0.6882361856535086,0.11339875930331812,-0.27399484878365576,-0.3979759864591704,-0.2546574313089517,0.08693718272881995,,, +27.0234375,54,-0.4527787620281208,-0.4790265352871921,-0.5205636314946487,-0.5762327598484211,-0.6446229421120677,-0.724094426825313,-0.8128076122478762,-0.9087554714795048,-1.0097989118761233,-1.1137044494941934,-1.2181835387699134,-1.3209328686435828,-1.4196749194222893,-1.5121980701074056,,, +27.03125,54,-1.5963955537767944,-1.6703025787932888,-1.7321309657139534,-1.780300693280747,-1.8134678009927807,-1.8305481595526636,-1.8307366928381317,-1.8135217146867308,-1.778694129323973,-1.7263513342000103,-1.6568957567628535,-1.571028050651505,-1.4697350703089025,-1.3542728344422599,,, +27.0390625,54,-1.2261447765011049,-1.087075662875689,-0.9389816353630605,-0.7839369023252905,-2.466723089074776,-2.64025332932143,-2.755670545641867,-2.803986783070299,-2.7807342049602504,-2.686280037621952,-2.5258046696249195,-2.3089444241669725,-2.049123905610435,-1.7626244676014744,,, +27.046875,54,-1.4674537505835716,-1.1820951079726416,-0.9242241153856122,-0.7094816521382125,-0.5503890987329991,-0.4554812833099663,-0.4287176252509499,-0.4692125240844925,-0.5713037794376421,-0.7249542554139387,-0.9164587642406474,-1.1294068598033182,-1.3458343860019348,-1.5474834621572386,,, +27.0546875,54,-1.7170830258223098,-1.8395606196867316,-1.9031009036821869,-1.8999770616705864,-1.8270971088303458,-1.6862269867369242,-1.4838748717909729,-1.2308447473943716,-1.704206255642062,-1.3776052074412473,-1.017489534315585,-0.685257744066633,-0.4371611966812887,-0.3155370850101282,,, +27.0625,54,-0.3422126979192097,-0.5151082821541738,-0.8085675995090985,-1.1773646467843186,-1.5637624036398563,-1.9065240837105144,-2.150473231857262,-2.255113505441771,-2.2009654181039204,-1.992632901773564,-1.6581218737059182,-1.2445167492389626,-0.8106880951006725,-0.4181670196677473,,, +27.0703125,54,-0.1216074242145031,0.03967857949119369,0.04779394141215343,-0.09100704054676888,-0.3473453355534125,-0.6733465136056929,-1.0101514685657982,-1.2971384064160216,-1.4814194345265927,-1.5261323171845649,-1.416235623306794,-1.1609043550920977,1.0133872058566984,0.9125852715805736,,, +27.078125,54,0.5544141170280106,0.013890569163351102,-0.5822541184651207,-1.0901678721492734,-1.3881827523228707,-1.4100599863899048,-1.1630644659496343,-0.7259156876375361,-0.2271771785121277,0.1899925340219584,0.40706666386765994,0.36260391191617614,0.06903498915071328,-0.3908181914217793,,, +27.0859375,54,-0.8865358983623544,-1.2759585980552508,-1.4442808561711042,-1.3356653475610325,-0.9687110535423036,-0.4315346637158259,0.1421885211752144,0.6096595727800336,0.8578830223956047,0.8344193363107646,0.5615365382439975,0.1298845729803358,-0.3265717729137505,-0.6674891105654674,,, +27.09375,54,-0.6241376616383388,-0.4618638870003453,-0.2994396465920248,-0.13919264876211618,0.016586277035319785,0.16568305470142258,0.3059988932864908,0.4355868015523245,0.5526854460758743,0.6557497601633046,0.7434777677461257,0.8148331527037467,0.8690631785476228,0.9057116448256244,,, +27.1015625,54,0.9246266535006796,0.92596304943987,0.9101794924023476,0.8780302119158203,0.8305515895314346,0.769043803517933,0.6950478575110984,0.6103183954573212,0.5167927789758326,0.4165569686973883,0.3118088071069328,0.2048193459102237,0.0978928951816733,-0.00667350606218442,,, +27.109375,54,-0.10663048810418158,-0.19981591010924804,-0.2841928882695579,-0.3578856265504322,-0.9414903536821402,-0.6327215223916991,-0.32283217163882616,-0.03023167178977815,0.2278319678343673,0.4364680710366544,0.5841750421886844,0.6636359571330348,0.6722225331895956,0.6121723490872893,,, +27.1171875,54,0.4904269704962749,0.3181422824410361,0.10990518739468297,-0.11728869668192568,-0.3452250384480622,-0.555745501902464,-0.7320182619744209,-0.8597157203104456,-0.9280172865308192,-0.9303672896647732,-0.8649351607782745,-0.7347457901322854,-0.5474709627640681,-0.3148964112390852,,, +27.125,54,-0.052101645368509975,0.22359025153440729,0.49381962851340294,0.7404699084490792,0.9469306327598044,1.099255833411357,1.1871369546737505,1.2046224782677588,-0.7921526438682582,-0.35989775951685643,0.07576602857341275,0.4538806119504169,0.7220739007603946,0.8446747516945698,,, +27.1328125,54,0.8082292489098659,0.6235593597324603,0.32404351531453485,-0.03961289447379193,-0.4073024252382735,-0.7189013898110752,-0.9236545605600516,-0.9880969372595212,-0.9012786350587738,-0.6764790205843482,-0.34914306290734404,0.028638703096563,0.39624683190315096,0.6939820138773789,,, +27.140625,54,0.8723747381596115,0.8999054858219537,0.7679329150781941,0.4920623502066936,0.10974130776211433,-0.3255435664756656,-0.7525644463990268,-1.1118528827298673,-1.354923394810017,-1.451783677778196,-1.3955618890772403,-1.2035305216829264,-0.23998769937013786,0.2970521909533763,,, +27.1484375,54,0.8413293672677711,1.2521495216927159,1.4236630361979492,1.3137426973014237,0.9554153342327438,0.4477154505239799,-0.07153144812280954,-0.4635357889598814,-0.6266133321411267,-0.5240629875395523,-0.1942124135491694,0.26012175365026186,0.6998701526866813,0.987904264180982,,, +27.15625,54,1.0267189232888496,0.7852752781581336,0.3076463041908121,-0.2989058203869709,-0.893154229092077,-1.3384257483171438,-1.5398580911481454,-1.4701865878231732,-1.176994994052869,-0.7694451484154965,-0.3881245531876435,-0.1662778760557917,-0.1930498118089161,-0.4888155029298553,,, +27.1640625,54,-0.4192124225482096,-0.466715270448239,-0.4991855426472248,-0.5156853002756332,-0.5155638593943697,-0.4984693227144822,-0.4643548748474367,-0.4134797307835639,-0.3464047209228173,-0.26398258989623313,-0.16734317898531734,-0.05787375153009655,0.06280519422749087,0.19286820140415464,,, +27.171875,54,0.3303167247777729,0.4730140371265296,0.6187225604502155,0.7651429684420019,0.909954375569667,1.0508549090960233,1.185601953650448,1.3120513637102618,1.4281949574029305,1.5321956351404655,1.6224195081820776,1.697464474567669,1.7561847420792298,1.7977108688396908,,, +27.1796875,54,1.8214649706485424,1.8271708287782031,1.8148587212440623,1.784864892951208,1.1505340678947973,1.0285502110025129,0.846951521292615,0.6180454581549611,0.3573105736893104,0.08231995544972683,-0.18848107036152545,-0.437057748359335,-0.6470397702132944,-0.8048587900839137,,, +27.1875,54,-0.9006902665638501,-0.9291339640547616,-0.8895856712295556,-0.7862742272735709,-0.6279612863269919,-0.4273247694515532,-0.20006901143393568,0.03617633131946145,0.2630918147228609,0.4629520102304634,0.6198680383992015,0.7209021713883859,0.7569767636802169,0.7235141121798112,,, +27.1953125,54,0.6207626097460233,0.4537864317546319,0.2321194580264637,-0.03089245374020028,-0.319014994750052,-0.6142503487891555,-0.8980851240381673,-1.152774267915416,-0.9143676342276446,-0.5820822705731611,-0.2675504810419277,-0.028980527074252468,0.08720735677744185,0.05366583380563883,,, +27.203125,54,-0.1335649764370287,-0.4543855582646632,-0.8677126283321575,-1.3178235780559415,-1.7429818383866509,-2.0850000059621165,-2.2982515032039954,-2.3567274320315095,-2.258039744179613,-2.0237474689588897,-1.695955431682417,-1.3307154631602256,-0.9892581162350974,-0.7284208009114974,,, +27.2109375,54,-0.5917633961464217,-0.6027553017990281,-0.7610952391242228,-1.0427371479021388,-1.4036182652958993,-1.7865088176689878,-2.1299165288642232,-2.37765907946458,-2.4876135938931343,-2.438280393434761,-2.2321386717990155,-1.8952714037174851,-2.179218371331609,-2.5725123274751764,,, +27.21875,54,-2.7037896030717525,-2.5563361707762793,-2.1877413966652064,-1.7139587048442515,-1.2773884180631234,-1.0077315812872851,-0.9863446571593156,-1.2238653136507749,-1.6572421230120233,-2.1669827616507833,-2.609893811721796,-2.858339274624785,-2.8352581147945197,-2.5353432670173266,,, +27.2265625,54,-2.0265770632001114,-1.4317015501954808,-0.8947012208484654,-0.5414831428558381,-0.4455296139577597,-0.6079354881510036,-0.9572997607056776,-1.3694994074534583,-1.7019242246356059,-1.8327879861794771,-1.6947398837398588,-1.2935622694901503,-0.706828070980572,-0.0628836719225273,,, +27.234375,54,1.737825673988621,1.674666349050625,1.5965849728671977,1.505031415022157,1.4016820010593785,1.2884101938912682,1.1672538288500882,1.0403794760634146,0.9100445541415864,0.7785578585205405,0.6482391955752038,0.5213788292645343,0.4001974503485857,0.28680736907409954,,, +27.2421875,54,0.18317561078291456,0.09108956059084272,0.012125758637909434,-0.052377607757112976,-0.10134403343465824,-0.13397743780038118,-0.14977599218377954,-0.14854079010566668,-0.1303792087116845,-0.09570290258899228,-0.04522046517346556,0.02007511367365233,0.09892397421809472,0.18982159056012526,,, +27.25,54,0.29104526261923924,0.4006844324364376,0.5166742938604063,0.6368321070188996,-1.3625714505319997,-1.51482013517153,-1.6008292687953718,-1.6164725445096613,-1.5624694639334151,-1.4443286162292122,-1.2719571449794371,-1.0589636515295335,-0.8217031607100023,-0.5781307612341909,,, +27.2578125,54,-0.3465438743694225,-0.14430087030095384,0.013394599547148613,0.1145587690767126,0.15126813331596034,0.12021641975174112,0.022949304817965758,-0.1342395023429469,-0.34074357211229744,-0.5823801159138222,-0.8423760564612441,-1.10253505246725,-1.3445041042701047,-1.5510514219534453,,, +27.265625,54,-1.7072664514171558,-1.801598381203281,-1.826660715346594,-1.779745809658905,-1.6630134932060774,-1.4833406229910082,-1.2518420632267342,-0.9830964923668832,-1.4733178627406966,-1.0243840978837138,-0.6100155123500031,-0.28563750542122945,-0.0919529711914161,-0.04863639358864491,,, +27.2734375,54,-0.15130655216333244,-0.3722491750736409,-0.6647767854360835,-0.9705464599756386,-1.228695494358624,-1.3853718081204476,-1.4021744275751626,-1.2621891358070525,-0.972678935146378,-0.5640099904448521,-0.08498005891682316,0.4047232607830855,0.8437600850905447,1.178633103630709,,, +27.28125,54,1.371961159031189,1.4082431878696875,1.2962150488736444,1.0674324359965677,0.771300875408631,0.4673271836606118,0.215799527720306,0.06834797119118552,0.059855994614791415,0.2029830439150606,0.4861514659201978,0.8753115785174772,0.920400360144847,0.7345835861274581,,, +27.2890625,54,0.3661388170035394,-0.055902380552055216,-0.3892924872174981,-0.5177310845315132,-0.38290015430835406,-0.0005903112990103264,0.5435029799570175,1.1171621288585365,1.5778014490471275,1.8114844347794368,1.7641112922340536,1.4562294276491614,0.9774078427500716,0.4617170996428887,,, +27.296875,54,0.051034707256406915,-0.143767735095514,-0.07311895240829236,0.23777787773817485,0.6959830105494504,1.166439861607839,1.5091535208176037,1.6177369347215291,1.4487586716329075,1.0338470793755412,0.4712315031879343,-0.10096316348340599,-0.5423515193646762,-0.7485397794078813,,, +27.3046875,54,0.7588955816148425,0.8805626568518713,0.9995319813502236,1.113543384141866,1.2204176279953225,1.3180947488847052,1.4046703101658051,1.4784289365451504,1.5378745405452203,1.5817567120883131,1.6090928090017926,1.619185361520853,1.6116344859189844,1.5863450897806426,,, +27.3125,54,1.543528742630003,1.4837001790353561,1.407668495296951,1.316523193733506,1.2116153188060281,1.094534015254954,0.9670789185839728,0.8312288612078136,0.6891074420776577,0.5429460625326819,0.395045075483205,0.2477337280650044,0.10332959904133716,-0.03590175894320469,,, +27.3203125,54,-0.16778626572115066,-0.29027915800677073,-0.4015005693302716,-0.4997682226267529,-0.6941310235226208,-0.4032354417974293,-0.12868874257374094,0.11251323046528093,0.3058403263060563,0.4402383495914074,0.5088966029106987,0.5097191921546025,0.4454672369692673,0.32356207792705016,,, +27.328125,54,0.1555632125144984,-0.0436426250626315,-0.2568846817422041,-0.4659109431022901,-0.6526665466364268,-0.8005586906395805,-0.8956198196590708,-0.927487960447498,-0.8901358324986671,-0.7822978755323702,-0.6075654010533501,-0.37414321747218654,-0.09428468441356892,0.21655542433545968,,, +27.3359375,54,0.5407911919911527,0.8599243472254932,1.155826596698907,1.411996097560547,1.6147004692158509,1.753926655769091,1.824071419528146,1.8243243325996352,1.3192101427348657,1.7573418138918417,2.129345243123962,2.3843804701817883,2.489027143226683,2.4324734705550077,,, +27.34375,54,2.2281877717454504,1.9118123287676003,1.5356076134028998,1.1603122433320945,0.8456865120487529,0.6412123570038016,0.5783982434460351,0.6658874467393537,0.8881315516329246,1.2078356658987883,1.5717943622151005,1.9192092199264303,2.191192298371992,2.339975141603033,,, +27.3515625,54,2.336388763476149,2.1744493512692973,1.872335211864784,1.4696025550602578,1.021073518271336,0.5883481429321407,0.2302620863867097,-0.006223946811615089,-0.0932843185388036,-0.026507602365013042,0.1744714486231821,0.4690852521947873,0.07846078388312035,0.5290639032500509,,, +27.359375,54,0.8439308513689773,0.923896766488588,0.7354881707104785,0.3202649594415873,-0.2164173163362635,-0.7341464355921656,-1.095818591867128,-1.2051160140684574,-1.0328266075659824,-0.6247929778161389,-0.0893128370508328,0.4325556483867292,0.8056449755203978,0.9376928017929254,,, +27.3671875,54,0.8045754922530809,0.4568453974324931,0.005780829886747052,-0.4072271428564561,-0.6495599050231048,-0.6338700298867965,-0.34218897091984124,0.16896501084188953,0.7838802765525318,1.3591569155270091,1.7627908215258268,1.9101269566557104,1.7868301548973116,1.4525799740992045,,, +27.375,54,-0.5836266631781586,-0.651872520168592,-0.7035753546616725,-0.7380937290879211,-0.7550862169970222,-0.7545171604323235,-0.7366570742457602,-0.7020776904076051,-0.6516417292158323,-0.5864875766429484,-0.5080091362474668,-0.4178312085722991,-0.31778082926382056,-0.20985506790512354,,, +27.3828125,54,-0.09618585153499716,0.020997571090358026,0.1394078671158343,0.2567398719164115,0.3707111512012581,0.4791021625275723,0.5797953128875947,0.6708122283504839,0.7503485830566552,0.8168058775984876,0.8688196102348015,0.9052833475580188,0.9253682730265688,0.9285378709645776,,, +27.390625,54,0.9145574888085538,0.8834986100655345,0.8357377630636833,0.771950084505979,1.7587165766911217,1.6358321654251093,1.4682017437406394,1.271421253727686,1.0630569420209453,0.8614130827317943,0.6842483629529832,0.5475304574970825,0.4643156561527432,0.44383168608475865,,, +27.3984375,54,0.4908277021513823,0.6052367870349705,0.7821745103075135,1.012273660610254,1.282331822168273,1.5762266506971103,1.876035035625181,2.1632781173136317,2.4202053510508774,2.6310280860602235,2.7830166475842004,2.8673844277308147,2.8798973426145986,2.8211661636513337,,, +27.40625,54,2.6966013442954826,2.5160334979957724,2.29302599755372,2.0439276346220043,1.7867314036922517,1.5398189936756728,1.320678539296832,1.1446850484001896,0.8022068535665994,1.1127904993373452,1.3434332277709506,1.4493679260710823,1.4054868636260802,1.2103014816430484,,, +27.4140625,54,0.8862214229183539,0.4761090936803491,0.036646166689585265,-0.3704549953094187,-0.6880263375548005,-0.8723143699305945,-0.899764270570965,-0.7706613368273885,-0.5090627507780037,-0.15903041079487062,0.22224831020241398,0.5733803172725378,0.8383376942163695,0.975188990961184,,, +27.421875,54,0.9626309310246928,0.8033031896921128,0.5233699682334931,0.16843357658790886,-0.203583433355005,-0.5314788571518522,-0.7603259290101673,-0.8500545381598399,-0.7817218610649401,-0.5604955677772109,-0.21488477737197514,0.20766164605806509,0.4414053663050112,0.4931696875754179,,, +27.4296875,54,0.8074525989065245,1.3182282707388189,1.903907811706948,2.4204782457415117,2.740802112672199,2.7893084422148235,2.5625687889268844,2.1301203349861986,1.6153115797685618,1.1614211605674298,0.8923363490186935,0.8785685980831334,1.1179205848389504,1.5361034517562917,,, +27.4375,54,2.007134990083729,2.387927938731928,2.5575882822728357,2.4506523617791136,2.0751526076765896,1.5105595371948617,0.8861627949242995,0.3458149216851001,0.008698952408923709,-0.06312944417151944,0.11846860901070475,0.4711937475787497,0.8650995020318291,1.158447562265729,,, +27.4453125,54,0.6930976504340695,0.6004127788318312,0.4953765961534845,0.37969324298140505,0.25526017039013066,0.12413504704144245,-0.011500143617513307,-0.14937718746740775,-0.287181238374956,-0.4225912380910326,-0.5533204497104353,-0.6771563950237591,-0.7919994965173519,-0.8958997474724856,,, +27.453125,54,-0.9870907681232644,-1.0640206516096482,-1.1253790596679882,-1.1701200936599767,-1.197480540521366,-1.2069931741835072,-1.198494879602403,-1.172129457180349,-1.128345058508817,-1.067886298362938,-0.9917811810934362,-0.9013230703587476,-0.7980480179254174,-0.683707848530415,,, +27.4609375,54,-0.5602394720966144,-0.4297309606583693,-0.2943849839951824,-0.15648024421583015,1.024028549830268,0.9668647046942852,0.9767471099165076,1.05238087885655,1.187714679290461,1.3723648065248804,1.592341714756787,1.8310283376130116,2.0703419699896983,2.2919986822161604,,, +27.46875,54,2.478792086929232,2.615797277457266,2.6914159738224908,2.6981899849042463,2.633326250671288,2.498896840206416,2.3016999469923056,2.0527915620938297,1.7667204699778989,1.4605198994587376,1.1525261309677477,0.8611064277684191,0.6033849814628022,0.3940557001786877,,, +27.4765625,54,0.2443646116928855,0.16133282561719464,0.14727422355128428,0.1996414935505305,0.31121122855112715,0.4705951642327128,0.6630418889253263,0.8714731025496039,0.6481040748705272,1.044963955063953,1.3438532862969377,1.5058977238577176,1.5137416165273505,1.3741999297754413,,, +27.484375,54,1.1171442768915094,0.7907968446513884,0.454165494470465,0.16779860050239834,-0.015700102044869938,-0.05991900489566016,0.04963642878217656,0.30323324117076145,0.6683752220007984,1.0948140307251122,1.5223269610194812,1.8900501824754,2.145914010830955,2.254710855537624,,, +27.4921875,54,2.203539448848809,2.0037776050565426,1.6892764435824628,1.3110575208270108,0.9293389893998022,0.6041329038278905,0.3858783249791161,0.3075692805069926,0.3796037872833787,0.5881563018766522,0.8973271521046614,1.2547341971428032,0.6007540122051374,-0.006509218475703016,,, +27.5,55,-0.643391265676033,-1.167062109034135,-1.4645664645657628,-1.4835737116886407,-1.2465255888335036,-0.8443059014805612,-0.4111687503380305,-0.08779811229469503,0.017375718354628478,-0.14200024486716112,-0.5374126341152613,-1.0732330435545243,-1.6128857951706732,-2.016260639698729,,, +27.5078125,55,-2.178116771648174,-2.0569526398713567,-1.686428867687351,-1.1662130620107711,-0.6347549351227986,-0.2314523301628838,-0.05857619354254096,-0.15338843044223882,-0.4780928558948341,-0.9303717907207004,-1.3716188120818071,-1.6651280674393572,-1.713771666542418,-1.4868368874550937,,, +27.515625,55,-0.0183315845794918,0.11775052896444473,0.24950044404018595,0.3747369678866702,0.4914015289895182,0.5975941861042767,0.6916068541811322,0.7719531654218096,0.8373944426298814,0.8869613300908386,0.9199707032540368,0.9360375611669526,0.9350816934595001,0.9173290051814456,,, +27.5234375,55,0.8833074763375035,0.8338378269158487,0.7700190509126563,0.6932090727042451,0.6050008645279634,0.5071944433097413,0.4017652372381458,0.29082937604216963,0.17660651280942155,0.06138082840089457,-0.05253909865680465,-0.16286085404468625,-0.26734847098421866,-0.3638617295844315,,, +27.53125,55,-0.4503937839929278,-0.5251064584171509,-0.5863625938920468,-0.6327548793195958,1.077682145668283,1.2636112041327014,1.4126181085178142,1.5106443732124064,1.5472030070124618,1.5161171951162324,1.4159583251490997,1.2501527957572058,1.02675014342683,0.7578686408369908,,, +27.5390625,55,0.4588570113442989,0.1472307006722297,-0.15854313184437918,-0.4403271904120746,-0.6815728337787226,-0.8684683139523626,-0.990896405163843,-1.0431346568181912,-1.02424945124817,-0.9381563984132392,-0.7933428664244649,-0.6022720064390112,-0.3805098401827193,-0.14563628936409953,,, +27.546875,55,0.08398390808150064,0.2904846801788604,0.4577469942157917,0.5725250628545152,0.6253718446627572,0.6112992973137668,0.5301273390538453,0.3864971822241183,1.5996757974212508,1.872593659410134,2.024361636978793,2.0239536583157927,1.8632963864675436,1.5585506938817997,,, +27.5546875,55,1.1476222425587244,0.6842887788650804,0.2298586980131945,-0.156340066801136,-0.42615960946076414,-0.5500873899150363,-0.5217963541753408,-0.3590813594022549,-0.10103629285435814,0.19808818338217749,0.4773893098345653,0.6788544087519056,0.7564540407075814,0.6833695462087397,,, +27.5625,55,0.4562289548048465,0.09569120376233232,-0.3567126230056043,-0.8449893361541473,-1.3073468570173703,-1.685761556383723,-1.9349598372060133,-2.029415311017124,-1.9672719920298944,-1.770582712907362,-1.481825879554005,-1.1572433389974228,0.11761035158866955,0.5276026164793071,,, +27.5703125,55,0.6883835325644541,0.5727524773228483,0.22842213820248725,-0.23525489971518335,-0.6774415157588501,-0.964586919974572,-1.0071854540134608,-0.784447345727247,-0.3501185632158998,0.18214645151659534,0.6698512679106465,0.9806495848266144,1.028577020808783,0.7975929376333638,,, +27.578125,55,0.34598039173807466,-0.20960168662800568,-0.7260434803323879,-1.0729371758919308,-1.1682277452118353,-1.0005916249426496,-0.6324109730464698,-0.18252953115757706,0.20648245551718455,0.4075810508855514,0.34425950672595684,0.011720001097582866,-0.5215981872183121,-1.1325548734310855,,, +27.5859375,55,-0.6631306618528121,-0.6766123021022878,-0.6726127176489511,-0.6508458425966381,-0.6113318199173914,-0.5543968355668789,-0.4806675971690267,-0.3910605538378422,-0.2867660457906209,-0.16922766117503502,-0.040117161460840316,0.09869458566529547,0.2451701570584268,0.3971410386769572,,, +27.59375,55,0.5523453830945136,0.7084673989447794,0.8631776827178487,1.0141737868279164,1.1592203137254309,1.2961878341455164,1.423089948156259,1.5381178402019782,1.6396717232164828,1.7263886213466269,1.7971660049517768,1.8511808641579452,1.8879038871252851,1.9071084949022885,,, +27.6015625,55,1.908874574799145,1.8935868470461992,1.8619278934699457,1.8148659703904115,0.1895481078415966,-0.04771977959825496,-0.3093523795188841,-0.5775547676153361,-0.8339330860322602,-1.0607785474900169,-1.24230401194581,-1.3657469008402843,-1.4222615338824371,-1.4075386568006283,,, +27.609375,55,-1.32210895154235,-1.1713093565767618,-0.9649145375358252,-0.7164591978620871,-0.44229847712781534,-0.16047194802023074,0.1105495819779282,0.3531470864038009,0.5517766966188267,0.6940481425094741,0.7715830673437452,0.7805933776396645,0.7221393122115956,0.6020492491942675,,, +27.6171875,55,0.4305068583334588,0.2213344032651202,-0.008977812734928634,-0.2424281615399728,-0.4607658876731475,-0.6467707548563414,-0.7854608909623005,-0.8651445875528471,-0.8580372500025277,-0.6407973036471954,-0.5486495030753089,-0.6045053088413349,-0.8074627962135584,-1.1329205104096318,,, +27.625,55,-1.5363864148103004,-1.960388777653992,-2.3434126795689445,-2.6294703028282207,-2.77681442766729,-2.7644379900855194,-2.5953473670420024,-2.296099542829474,-1.9126752095644448,-1.5033305314776515,-1.1295408711711517,-0.8464469428848235,-0.6942913377845322,-0.6921790916316214,,, +27.6328125,55,-0.8351339650407918,-1.0949087644452415,-1.4244233036601766,-1.7651385661878145,-2.056218285114188,-2.2440507443184696,-2.2906474861600317,-2.1796105275721143,-1.9187383945440528,-1.5388647984669537,-1.0891105568969153,-0.6292880120003634,-2.1131415770823656,-1.9302709520451307,,, +27.640625,55,-1.550981679754732,-1.0994024138473641,-0.7182148920914068,-0.5293425171572608,-0.6003392745660218,-0.9256926234268374,-1.4281664067458466,-1.979817327700814,-2.4369264569970857,-2.679273383274582,-2.642990257667748,-2.337992358785494,-1.8452087254015772,-1.2943724005062358,,, +27.6484375,55,-0.8284576535788917,-0.5645110033514951,-0.5616110060509004,-0.8047377856687075,-1.2089726948875368,-1.642876415858891,-1.9646373808009232,-2.0610822445240995,-1.8788555618311675,-1.4392218433058472,-0.8324316251988795,-0.19319394142842333,0.3360243685633715,0.6438158891833309,,, +27.65625,55,1.7536378192697049,1.679726776234156,1.5948365639033777,1.5008612245674362,1.3998517213154744,1.2939797920614409,1.1854996895208183,1.07670847719681,0.9699055767300702,0.8673522750675908,0.7712319006093311,0.6836113657833303,0.6064047495612439,0.5413395577182714,,, +27.6640625,55,0.4899262517464217,0.4534315800965678,0.4328561788478771,0.4289168341389282,0.4420337170724434,0.4723228147328728,0.5195936899733238,0.5833526093174448,0.6628109843291383,0.7568989787590995,0.8642840433249838,0.9833940536998598,1.112444646671686,1.2494702759383838,,, +27.671875,55,1.3923584438574528,1.5388865098637456,1.686760431150779,1.8336547573644104,-0.8782426916238031,-0.8218242244480576,-0.6978178599786022,-0.5128844986265491,-0.27795980518891084,-0.007498594238305013,0.2815262624329385,0.5708006136196347,0.84193944773121,1.0777623788736883,,, +27.6796875,55,1.263485272187356,1.3877449281721208,1.4433853867257185,1.4279510342039619,1.3438521419544869,1.1981913066931185,1.0022629089900676,0.7707605070798034,0.5207474492523648,0.2704624990123471,0.038043771654409635,-0.15974002331770232,-0.3086625496554575,-0.3980352178506439,,, +27.6875,55,-0.4214555456981349,-0.3772563127128784,-0.26862418052204473,-0.10337950130475926,0.10656733643747646,0.34604511862392273,0.5976787531378962,0.8431002528166205,-0.22064070957690365,0.08363960890048239,0.24664196497021185,0.253429640465526,0.11331171057265645,-0.141660904871467,,, +27.6953125,55,-0.4617403433531928,-0.7872816109231213,-1.0580821750908913,-1.2228063920915908,-1.2470266185508592,-1.1186283283292304,-0.8497371386213247,-0.4748673947358722,-0.04558049056498372,0.3775152547421838,0.734177259431313,0.9738879480516676,1.0637029910425364,0.9933662107184448,,, +27.703125,55,0.7768945604676011,0.4503863682728324,0.06639426141016419,-0.314260762727718,-0.6319591207979586,-0.8375613375688491,-0.9000504889751209,-0.8113481086020059,-0.5875535403021588,-0.2664138065976717,0.09858180114426696,0.4465624687726765,0.10524518655903738,-0.27862402988167634,,, +27.7109375,55,-0.5421084173441788,-0.579001188350466,-0.3459858181797025,0.125262451165695,0.7365374826674616,1.3498085592591131,1.8248545769244784,2.057513426270424,2.0080651313875726,1.7119712045326656,1.2700281425570663,0.8206347810298955,0.5017750910680093,0.4131364984421305,,, +27.71875,55,0.5887464616762702,0.9876271018990336,1.5050292625807546,2.001166964979564,2.3395766848800084,2.4245877975583845,2.227633941044482,1.7951932248146194,1.2361800094754682,0.6922425171930914,0.2991053698256251,0.14955031997297075,0.2681793272224564,0.6048748271009547,,, +27.7265625,55,1.9772531791159575,2.115288920404305,2.2455842677779434,2.3660885441807507,2.474913862647334,2.5703680339020565,2.6509840517322947,2.7155456399365954,2.7631084136056803,2.7930162842800748,2.804912821813045,2.7987473740642472,2.7747758373422986,2.7335560641742798,,, +27.734375,55,2.6759379888793733,2.6030486439093603,2.5162723293805,2.4172262830849145,2.307732277051001,2.1897846380521053,2.0655152520647158,1.9371561654965133,1.8070004380758249,1.6773619329033482,1.5505347477828222,1.4287529982102574,1.3141516562557705,1.2087291310715638,,, +27.7421875,55,1.114312246261277,1.0325242273804611,0.9647562601154526,0.9121431171745218,1.0642293103658629,1.2445341679580242,1.3701848575776454,1.4310183926766482,1.421248604098126,1.3398711191848216,1.1907352407842582,0.9822777101876984,0.7269369151316875,0.4402883867906847,,, +27.75,55,0.13996186428484625,-0.15558456352999225,-0.4283477635358868,-0.662030830395447,-0.8431750789632277,-0.9620938293423754,-1.0135428791360872,-0.9970809197537326,-0.9170947754367851,-0.7824877172499992,-0.6060525997045749,-0.4035735465444079,-0.1927188418680112,0.008197756850832683,,, +27.7578125,55,0.18150089145877124,0.3113931178190251,0.3850636116113262,0.393588735731182,0.3325616536237751,0.2024070671072804,0.008359114279801627,-0.2398960481738221,0.7187895502076059,0.8678412173644403,0.8650373171810138,0.7049477656657134,0.4062820493830877,0.009021053517768995,,, +27.765625,55,-0.4317622985042436,-0.8544313841393614,-1.2003351330273024,-1.4228911190446667,-1.4947880345748494,-1.4121860092690883,-1.1952608402938505,-0.8850076577973259,-0.5368021621619,-0.21172259353756573,0.0330156309579569,0.1530224746793264,0.12369679174669612,-0.055894082158324136,,, +27.7734375,55,-0.36282318547684056,-0.7538312548954218,-1.1720233574788383,-1.555692021350784,-1.8478928283444795,-2.0052812172313623,-2.0048343005603493,-1.847410901543321,-1.5575954635652365,-1.1798502728151936,-0.7715754150247743,-0.394157504251512,1.702545683764132,1.6930291518945513,,, +27.78125,55,1.4124044002279286,0.9173009231401382,0.3234743282599252,-0.2257008402868991,-0.598315420095793,-0.7098772314703578,-0.5462785946094385,-0.16748683497201128,0.30905202640772084,0.7407463346551212,0.9990657352690988,1.0048753465249345,0.7502121219379125,0.30053433121709905,,, +27.7890625,55,-0.22317298438602287,-0.677532652411876,-0.9360691173547802,-0.9238920749630948,-0.638264057521348,-0.14941461466578246,0.41862265231818574,0.9218990049080312,1.235878481072767,1.2894273724233596,1.0841511031741655,0.6937803434949369,0.2437762388358472,-0.12325388868905862,,, +27.796875,55,0.8755432806716967,0.855523908066416,0.8523509049102178,0.8659842782248091,0.89607885187305,0.9419903313901608,1.0027866120726905,1.0772641323063898,1.16396898577524,1.2612224228569984,1.3671502946559748,1.4797159240867843,1.5967558284042642,1.7160176676562442,,, +27.8046875,55,1.8351997545437349,1.9519914338371485,2.0641136242684635,2.169358812962918,2.265629802071309,2.3509765290952265,2.4236303161325328,2.4820349482856616,2.5248740369886384,2.551094189065879,2.5599235757649317,2.5508855765543883,2.5238072587137217,2.4788225441649985,,, +27.8125,55,2.416370008019114,2.3371853473052795,2.2422886516747864,2.1329666988822917,-0.5288880714883399,-0.8422940976806248,-1.1620693468231822,-1.4696977866163103,-1.7474756883880236,-1.9797385803505605,-2.153946055945282,-2.2615488071846586,-2.298577438905969,-2.2659120207218426,,, +27.8203125,55,-2.1692135964042176,-2.018522442932511,-1.8275511097336068,-1.6127215522230305,-1.392013518497066,-1.1837045095147447,-1.0050891935738688,-0.8712675881273598,-0.7940865260753648,-0.7813082341292252,-0.8360640130014642,-0.9566311275189008,-1.1365484756609228,-1.3650629807419628,,, +27.828125,55,-1.6278755878930606,-1.9081348529350648,-2.1876088456128358,-2.447953653968668,-2.6719900396015928,-2.8448992243624285,-2.9552544274865027,-2.995816225003723,-0.10340146073871426,0.05916431233572739,0.07275506079158434,-0.059438176704089685,-0.31075482211302785,-0.6352305219942403,,, +27.8359375,55,-0.9747735262418848,-1.268233846220038,-1.4609525263900598,-1.5133035636516108,-1.4068978899880094,-1.1474829615678002,-0.7640861566010388,-0.3045352141085101,0.17194677499376365,0.6039186739008319,0.9372417213461832,1.1334604571319329,1.1757390340216058,1.0714285695021757,,, +27.84375,55,0.8508659326198195,0.5625913419519115,0.2657299453543691,0.02072428098179369,-0.12013861941441173,-0.12092973732009182,0.03226769282042219,0.32913318019542603,0.7366600546382258,1.204241318758788,1.6714984036156402,2.0776337267811633,0.1831469847788426,0.7286513526836554,,, +27.8515625,55,1.3251000090360656,1.828519262453194,2.119677975338786,2.1365450014951066,1.8910767222009408,1.465735750516456,0.9906968721189766,0.6079892418135997,0.43240411996848505,0.5198837703238343,0.8520566327257462,1.3411585153225254,1.8539921829768675,2.248359683410397,,, +27.859375,55,2.4119831584881815,2.293247670796088,1.9153407124811483,1.369913327578269,0.7920000819721693,0.323071294737634,0.07234333023834838,0.08694996248843911,0.3391490744568195,0.734069893940144,1.1358762457328817,1.4051738563929173,1.4374079373548132,1.1917257274795072,,, +27.8671875,55,2.010750584968004,1.8773890807398712,1.734818180995369,1.5851273795790866,1.430523260698922,1.2732910439239264,1.1157547560981291,0.960236727462442,0.8090171210977222,0.6642942042165232,0.5281460568494302,0.402494388283806,0.28907109472184755,0.18938814361398748,,, +27.875,55,0.10471131187345993,0.036038237701155114,-0.015918829793963533,-0.0507452812418121,-0.06833118354213796,-0.06887297919411872,-0.05286981879422925,-0.021114591047469825,0.02532019251715456,0.08510141083948564,0.15665891157922418,0.2382132413370269,0.32780704216394396,0.4233395644724111,,, +27.8828125,55,0.5226036918972153,0.6233248296711915,0.7232009754425825,0.8199432707686551,-2.964036271871279,-2.8622342632618105,-2.6974357966727047,-2.4808824421659117,-2.227248185175963,-1.953616881082686,-1.6782920252983522,-1.4195218349903809,-1.194228543315046,-1.016830512472874,,, +27.890625,55,-0.8982392985566329,-0.8451016004002848,-0.8593389473460447,-0.9380172177847688,-1.0735550794377955,-1.2542568075218314,-1.465132316339136,-1.6889472108335242,-1.9074296239687485,-2.1025496719756593,-2.25778229501015,-2.3592654087914924,-2.3967725925036456,-2.3644324707055637,,, +27.8984375,55,-2.261144610324287,-2.0906629163117136,-1.86134069548564,-1.5855551506343826,-1.278851420949409,-0.9588658414441644,-0.6441034895138258,-0.352655247525834,2.370850602161334,2.5163735499312523,2.5018200381238564,2.33908720277462,2.062459889712756,1.723234894806574,,, +27.90625,55,1.3816988835629662,1.0977096321013216,0.9213477534556456,0.8850950758926779,0.9987580363272124,1.2479268813570241,1.5962107273123711,1.9909004000147963,2.3711770591740993,2.6775880718914804,2.8613141978946306,2.8917846324288066,2.7614537618304524,2.4869955445408998,,, +27.9140625,55,2.1067293840233474,1.6746783055338983,1.2521847662688226,0.8983898217386062,0.6610583922026676,0.5691794496793702,0.6284934774457588,0.8206436015129348,1.106082374420453,1.4302812171105237,1.7322751076162002,1.9542113689907423,-0.5676289944797117,-1.0695435518400618,,, +27.921875,55,-1.3334813440855964,-1.3218812799516355,-1.0723065817279094,-0.6869073803001842,-0.30418720129462506,-0.06081339826643795,-0.05394017750085822,-0.3143722877371702,-0.7979262441329638,-1.3973584378416035,-1.9715925807633048,-2.3842375561724527,-2.540840361069013,-2.414665324363381,,, +27.9296875,55,-2.0539352033248757,-1.5685503099705056,-1.099926075138898,-0.7822159828186881,-0.7055476112896346,-0.8913475770375626,-1.2865177647000787,-1.7780584501560568,-2.2241298445894677,-2.4930381165807143,-2.4994599032401554,-2.227975994222553,-1.7374628846429734,-1.145137027058105,,, +27.9375,55,0.9113163230905438,0.995177592019846,1.0695151501506608,1.13248315706677,1.1824344252660743,1.2179495076339049,1.2378617970106671,1.2412781982256922,1.2275950104941231,1.1965087419432163,1.1480216667696606,1.0824420275883393,1.0003788792935606,0.9027316645860152,,, +27.9453125,55,0.7906747035603836,0.6656368688107278,0.5292768018092,0.3834541043846285,0.2301970096138263,0.07166709806911145,-0.08987832288220454,-0.25212551811843137,-0.4127446141480717,-0.5694301734890443,-0.7199413437202754,-0.8621408783106891,-0.9940323460951701,-1.113794877981291,,, +27.953125,55,-1.2198148425834052,-1.3107138962681566,-1.385372916562418,-1.4429513999640653,-0.10094382789521196,0.09741381274042593,0.2325483599426561,0.2990186650092155,0.296183467884348,0.22823841533939135,0.10391581033355546,-0.06413195278396916,-0.26022225507357544,-0.4667433515942356,,, +27.9609375,55,-0.6653899018747353,-0.8384467582282231,-0.9700314729604622,-1.0472088644710305,-1.0608999043427598,-1.006521530514008,-0.8843127554268182,-0.6993243141239018,-0.4610725601785958,-0.18288173089839987,0.11903956520801676,0.4267232516249162,0.7216896464091906,0.9862312778889576,,, +27.96875,55,1.2046431394771555,1.3643136038602002,1.4565999328132957,1.4774273390041293,1.4275698330064341,1.3125932781296694,1.142464630215117,0.9308546167568836,2.050415007238824,1.9945583434253615,1.7838179452538232,1.4393711038830976,1.0031542348181912,0.5313878062290973,,, +27.9765625,55,0.0858760294327281,-0.27556385867134603,-0.5080523167861544,-0.5865843817958862,-0.5098725295477722,-0.30049723248379434,-0.0013420187215766322,0.3311314653889909,0.6357207134028143,0.8560552702001188,0.9494140620570292,0.8934136121604799,0.6895252458609181,0.3628733090294425,,, +27.984375,55,-0.04165430696759148,-0.4663776434765957,-0.8497924078686118,-1.1361372665274558,-1.2840705969898616,-1.2731052843546242,-1.1067993225352215,-0.8122052603788481,-0.4356642163223768,-0.03559951712167958,0.3265676800178943,0.5959659318290002,-0.09412563805505447,-0.2382984662572184,,, +27.9921875,55,-0.5872396946194571,-1.022357891225818,-1.4012787011494532,-1.5970959145175112,-1.533379934155223,-1.2053467574860832,-0.6813836277715043,-0.08451122889532311,0.441138820711852,0.7696454549547319,0.8276434568643593,0.6142810790595842,0.2013215781442354,-0.2866379559750642,,, +28.0,56,-0.7064080197442653,-0.9355229753715024,-0.9058561288599712,-0.6223202745760544,-0.16152820510213034,0.3492197356896334,0.7668620040212837,0.9718434702883962,0.9009616420309716,0.5647885555926122,0.044892552859171216,-0.5283797760915756,-1.0114734986068121,-1.286799924606429,,, +28.0078125,56,-1.4829019846100486,-1.504979843614616,-1.5092467847086573,-1.4960699844951868,-1.4661153795855757,-1.4203358304341829,-1.359954265219515,-1.2864420990121537,-1.2014933062011155,-1.1069946002570945,-1.004992243067047,-0.8976560650953179,-0.7872413264498115,-0.6760490867469171,,, +28.015625,56,-0.5663857777703237,-0.4605226868747107,-0.3606560606533527,-0.268868527511001,-0.18709251470072608,-0.11707630044938964,-0.060353295654289485,-0.018215093085878875,0.008311243949597369,0.01848125575994997,0.01184620670748271,-0.01173897784167677,-0.05211309707482015,-0.10881142861198724,,, +28.0234375,56,-0.1810738025210864,-0.2678578541234441,-0.3678572235630613,-0.4795243834861893,0.6941824863533702,0.4504694449622914,0.21808073546868526,0.014444081537987374,-0.14516613591996708,-0.24869418591988454,-0.2881434912481403,-0.26013371913074257,-0.16613561296862922,-0.012367192359267865,,, +28.03125,56,0.19064143670694225,0.4287843099063863,0.6853655261979802,0.9422661055725878,1.1812104075025704,1.385043791224034,1.5389324143060643,1.6314014948162299,1.6551396261167963,1.6075130465630445,1.4907539914846986,1.3118099814930155,1.0818645445383206,0.815562780550707,,, +28.0390625,56,0.5299957592197275,0.24351455828653698,-0.025543371022555383,-0.2601267115636364,-0.445652939946548,-0.5710186831859752,-0.6293673327770242,-0.6185604041414356,0.7327972488921516,0.7185095422076672,0.5586565323695019,0.2819998401664373,-0.06400670567637656,-0.4206470032306676,,, +28.046875,56,-0.7271293907116233,-0.9300990332771416,-0.9919941401806054,-0.8969442373738901,-0.6532915484212912,-0.2923424966191533,0.13645648757808035,0.5731677422460801,0.9566446818755524,1.2340021581228375,1.3688001052407397,1.3466661145136598,1.1774814806485026,0.8937905172246277,,, +28.0546875,56,0.5456811793847457,0.1929346382822069,-0.10433318062021467,-0.2950802076996617,-0.3453312995276906,-0.2435105705565731,-0.002282224218772777,0.3433870448638502,0.7416424805263908,1.1317893785281825,1.4537215085858115,1.6572614614971033,-0.6369163657141971,-0.1866664817335419,,, +28.0625,56,0.15925882186746598,0.2879324729289987,0.14618426989623,-0.24460157745192945,-0.7941244524382376,-1.3676978048972144,-1.8229511186130216,-2.0486464972141687,-1.9949733612108784,-1.6870202463716255,-1.2177332315797802,-0.7222924935678112,-0.3409310747794191,-0.18038743454887,,, +28.0703125,56,-0.2845576220743889,-0.6223913880693573,-1.0963503157011325,-1.569110421579328,-1.9011912130620208,-1.9891983680031189,-1.7941988196348095,-1.3524512331136649,-0.7655505123872263,-0.1726867710853922,0.2873791055841043,0.5142029948302855,0.4730255523404896,0.204121347626714,,, +28.078125,56,-0.6010976951461908,-0.7306322191966896,-0.8660337416933928,-1.005095419524907,-1.145536403614596,-1.2850417636168838,-1.4213030150238997,-1.552058539055584,-1.6751331875803108,-1.7884763795716712,-1.8901980220315056,-1.9786016263848567,-2.0522140404650453,-2.1098112754631124,,, +28.0859375,56,-2.150439975585651,-2.1734341544654234,-2.178426905237023,-2.165356879202441,-2.134469419607583,-2.0863123306385383,-2.0217263556775182,-1.9418305314983892,-1.8480026747996805,-1.7418553427001993,-1.6252076880777315,-1.5000537024969396,-1.3685274027350456,-1.2328655704216305,,, +28.09375,56,-1.095368697149694,-0.9583608188446836,-0.8241489426070548,-0.6949827763943552,-0.5413197884456162,-0.4050309937177277,-0.22122111268175765,-0.0047479372036725595,0.22724321797150546,0.4565222210962856,0.6650524732618835,0.8362557416830977,0.9561752585096148,1.0144559615962714,,, +28.1015625,56,1.0050735050848898,0.9267611868803374,0.7831050055378591,0.5823002017069806,0.3365862453320162,0.06139965310901387,-0.22569630233224006,-0.5062303716210288,-0.7621056213232129,-0.9768558357340296,-1.1367884284121996,-1.2319341775565402,-1.2567375695797822,-1.2104396228572627,,, +28.109375,56,-1.097126507349263,-0.925440580277375,-0.7079739981678559,-0.4603871998525062,-0.20031373992499288,0.05387215009803853,0.28433932400151785,0.475045279363763,1.7099582373411688,1.6021276642629785,1.348350661149999,0.9851960466689248,0.5655226232724224,0.15024803983164925,,, +28.1171875,56,-0.20113352189284892,-0.43980793551430863,-0.5352302704187811,-0.4798644962830983,-0.29033559878379833,-0.004814759483920017,0.32295500750253336,0.6320620839784807,0.8639493364634575,0.9715736189864504,0.9267748574938346,0.7247067351136199,0.3846386542272528,-0.05299616919828404,,, +28.125,56,-0.5328469509644213,-0.993213295643886,-1.3756006278481667,-1.6337750641122302,-1.7409076631940057,-1.6936955871536823,-1.5128185713819768,-1.239659898890752,-0.9298028980436548,-0.6443162112832053,-0.44018549065425816,-0.36138212061261177,-0.7911625261289736,-0.7703488081009665,,, +28.1328125,56,-0.4749707198622172,0.04805688280951975,0.6894474464716813,1.3072495340494308,1.7655069588288548,1.9712788283425755,1.8998755612217664,1.6013965421654257,1.1867796746532,0.7971881809025649,0.5651266571034791,0.5779450359858936,0.8537345203440739,1.3362231344689466,,, +28.140625,56,1.9100711528704333,2.432375497221396,2.771749616276989,2.8442689580093985,2.6364309906997208,2.2088374475521557,1.6795897219007832,1.1919481480779774,0.8751184920643434,0.8089123966669876,1.0019665912322242,1.3894894318400628,1.8511512974526447,2.244214365841146,,, +28.1484375,56,-0.5730154665933818,-0.4602660308825739,-0.3585841441067621,-0.2696178936670505,-0.1947850689459432,-0.13524848739511475,-0.09189578923080166,-0.06532405443879752,-0.055829511342260114,-0.06340251683877972,-0.0877278960989234,-0.12819063567478228,-0.18388683022567587,-0.2536396910775853,,, +28.15625,56,-0.3360203361969285,-0.4293729974354796,-0.5318442035571669,-0.6414154279340356,-0.7559386291410305,-0.8731740620131829,-0.9908296969769556,-1.1066015573059098,-1.2182142678693535,-1.323461105251097,-1.4202428478321878,-1.5066047454502818,-1.5807709611724703,-1.641175881975704,,, +28.1640625,56,-1.6864917499624348,-1.7156521301561125,-1.7278708038271788,-1.7226557563961788,0.6128566500566707,0.6884664925303123,0.6970443966655218,0.6385740837928718,0.5178549477898813,0.3441674303171266,0.13062556398433528,-0.1067381671469598,-0.3500918331510299,-0.5810488962661664,,, +28.171875,56,-0.7819520722091405,-0.9371066835894892,-1.0338774954924494,-1.0635725423486844,-1.0220523081715454,-0.9100217734678564,-0.7329849560761499,-0.5008651078254199,-0.2273170430538952,0.07122045703932997,0.3766660955847194,0.6705517806486403,0.9353050613699446,1.155468863422722,,, +28.1796875,56,1.3187734804591529,1.4169860814151851,1.4464785085987508,1.408473786438846,1.308954165762904,1.158237131079091,0.9702489527269976,0.7615464572575733,-0.4319603429130863,-0.6522582173099679,-0.9987944047899698,-1.4278771066651812,-1.8823632940986488,-2.300515676135923,,, +28.1875,56,-2.6255781070771134,-2.814578218804592,-2.8449864118593107,-2.7181942059073783,-2.4592703342925644,-2.1130327100642545,-1.7370481943002063,-1.392650588912498,-1.1353759279837328,-1.0063048799525374,-1.02566076486269,-1.1896603458948778,-1.471107896564657,-1.8236399889520558,,, +28.1953125,56,-2.1889598083443813,-2.5059341444343315,-2.720136067179178,-2.7923468577608634,-2.704692847232061,-2.4634611723284374,-2.0981557161200004,-1.6569400951135085,-1.1991772747987877,-0.786227595916547,-0.4719382413728831,-0.2943052206216654,2.031571264038843,1.4902685738729289,,, +28.203125,56,0.8732511192189056,0.32486934352806673,-0.02999875772028981,-0.119938978496141,0.05366182718308532,0.41723014465622665,0.8454013250130028,1.1956043139471717,1.3473548752371496,1.2354862142923997,0.8682075726287647,0.3250396683130514,-0.2648088670632228,-0.7576992300025941,,, +28.2109375,56,-1.0347926685963582,-1.0345025875629346,-0.7692754365688526,-0.3221021071998905,0.17628337117902634,0.5832682152303107,0.7834587363195821,0.7202960507585344,0.4115248853757517,-0.05572369977149148,-0.5488874336075745,-0.9263996638459092,-1.0766034459916092,-0.94848657840715,,, +28.21875,56,-1.6998180148541608,-1.6594751798248957,-1.602049590288941,-1.5282611529715855,-1.4391149618154582,-1.3358839241900995,-1.220086697912348,-1.0934613252684948,-0.9579350255690182,-0.8155906750289772,-0.6686305607824624,-0.5193380435521296,-0.37003780013169735,-0.2230553416971261,,, +28.2265625,56,-0.08067651664256137,0.054892293080540985,0.181562585303874,0.29740008817018143,0.40065841148650416,0.4898094098010071,0.563569725670807,0.620923048485084,0.6611376992136417,0.6837792333010524,0.6887178411550754,0.6761304167689144,0.6464972583796649,0.6005934590528658,,, +28.234375,56,0.5394751380634988,0.46446075427727,0.3771078288523507,0.2791854849559922,0.5501552472714601,0.354305401758516,0.1911528372506759,0.0755755102031257,0.019128422263712586,0.02923031638755447,0.10863879528275544,0.2552504811234567,0.4622401692983722,0.7185292898024557,,, +28.2421875,56,1.0095510261166782,1.3182587544596012,1.6263074986106683,1.915326030397184,2.1681909246944837,2.370213741201441,2.5101585629238503,2.5810189506819348,2.5805001492821344,2.5111729343054234,2.3802883855570665,2.1992665173986707,1.9828944386614813,1.7482899697201129,,, +28.25,56,1.513702999140306,1.2972381766612908,1.1155880240820717,0.9828648185188098,0.9096127140936046,0.9020689988191886,0.96172600973626,1.0852242627567141,-0.26960631090035536,-0.3899185198311599,-0.6244064678637006,-0.9241807408251338,-1.229969215010244,-1.4814062172859384,,, +28.2578125,56,-1.6264923931524242,-1.6297515653568473,-1.4778138160921699,-1.1815549063823882,-0.7744585177766681,-0.30745612114809745,0.15895208862232224,0.5640682577185059,0.8564006083314172,1.0016354150616222,0.987935786948802,0.8277421708172544,0.5557943531789742,0.22368324457065547,,, +28.265625,56,-0.10821878105909666,-0.3801919322987526,-0.5424978794711299,-0.5631503137882787,-0.4329167688840454,-0.16677255240261835,0.19841974191618045,0.6096437648815396,1.0059829882273967,1.3281087982870496,1.5275252749399968,1.574130700361786,0.5510950850363912,1.0078743541688095,,, +28.2734375,56,1.2399490737390717,1.1998428276404298,0.9150120607972848,0.4800997848624001,0.03077330102427112,-0.2936816161249709,-0.3887561117902912,-0.21357806458340303,0.19767538160084447,0.7449424355469546,1.289508638802631,1.6918446036178931,1.8496810723990904,1.7258876911328898,,, +28.28125,56,1.358516241676491,0.8502571069080433,0.3401997880680603,-0.034361958664263385,-0.17561151772893047,-0.05204941627529746,0.2928644899613181,0.7526353884658352,1.1869562969904155,1.4602199393406858,1.4787643175079548,1.2166434419570558,0.7228593959202405,0.10807261335139587,,, +28.2890625,56,0.17264328543886648,0.059576914227583176,-0.057808697541187275,-0.17723815487365432,-0.2964056125674001,-0.4130153184108477,-0.5248219759259327,-0.629670219808185,-0.7255325127502845,-0.8105447999915599,-0.8830392971876228,-0.9415738373995431,-0.9849572632526442,-1.0122704195632828,,, +28.296875,56,-1.0228823787763104,-1.0164616150252597,-0.9929819310833224,-0.9527230343502796,-0.8962657517209925,-0.8244819670531389,-0.7385194573649749,-0.6397818932181831,-0.5299043534165991,-0.4107247827062617,-0.28425189219048896,-0.15263006447683294,-0.018101878015905203,0.11703109321799746,,, +28.3046875,56,0.25044851834306,0.3798518819545386,0.5030046798854093,0.6177715345518455,1.2645842562632073,1.487760789938653,1.7394811495086098,2.002308712391317,2.2578578091529646,2.488075127273845,2.6764983027161007,2.8094039347218818,2.8767649692970543,2.872950689354555,,, +28.3125,56,2.7971204974932213,2.65328402938887,2.450023402770335,2.1998969665094124,1.918566123540394,1.6237061114878708,1.3337766894071212,1.0667384474622148,0.8388042475213396,0.663312852092338,0.5498032777613846,0.5033544114284816,0.5242359293540335,0.607894850253886,,, +28.3203125,56,0.7452786482299683,0.9234723813517606,1.1266053938281777,1.3369643509612883,1.5362349773166666,1.7067858932179152,1.8329050085625458,1.9019022408984916,1.460917999513436,1.205081920249217,0.8453604100294353,0.4360241703241736,0.03845041474234662,-0.28840688840934064,,, +28.328125,56,-0.4971661476275204,-0.559361813396634,-0.46983896329078007,-0.2475145426155493,0.06761307771565794,0.4207402077168144,0.750841820292059,1.0002261461721316,1.1235714329029136,1.095037067688884,0.9123411863759762,0.5971693725794355,0.1918505004978676,-0.2471828140365171,,, +28.3359375,56,-0.6581308750019743,-0.983400187009446,-1.17852255096975,-1.2190310578797006,-1.1042222814094862,-0.8572189530411707,-0.5213236135610242,-0.15323142409720966,0.18584048956123506,0.4397252878083827,0.5660891287884993,0.5430561965022921,-1.114067855425425,-1.0360935628651968,,, +28.34375,56,-0.7418139609950966,-0.3437040010627153,0.01687058386953122,0.2086357163603325,0.1466291414614478,-0.18427069827701856,-0.7249578138486512,-1.3580583213434154,-1.939864678501976,-2.339494391887252,-2.474543005827691,-2.3334619137616563,-1.9785297597697191,-1.5286047948276344,,, +28.3515625,56,-1.1263868521681286,-0.8991629062347974,-0.9237959721794338,-1.2055539569438718,-1.676581773832697,-2.2144362110730307,-2.675604246934518,-2.934818786727761,-2.919396690392627,-2.6291879915363388,-2.1366685415602054,-1.5671501985154277,-1.0645316639571023,-0.751975751144202,,, +28.359375,56,0.7221555450065563,0.8143332177220676,0.8926863664982362,0.955830422941286,1.0026386618176693,1.0322619171112402,1.0441434435636079,1.0380286634824478,1.0139696281518629,0.9723241157266912,0.9137493814017812,0.8391906692857086,0.749864687122555,0.6472383332069677,,, +28.3671875,56,0.5330030479661377,0.40904523928892733,0.2774132994358233,0.14028179102784974,-8.657080791216881e-05,-0.1413804744800452,-0.2812804135759569,-0.4174992267075838,-0.5478220657607429,-0.6701450927440799,-0.7825122277085764,-0.8831493043364846,-0.9704950351856368,-1.0432282444541068,,, +28.375,56,-1.1002908914751055,-1.1409064818671744,-1.1645935440275537,-1.171173935062642,1.905001645965133,1.8379607335072323,1.7013737651238616,1.5006378675858758,1.2455843077941084,0.9498006247059751,0.6296908709637519,0.30333947927106336,-0.010742037596755127,-0.2948981739160281,,, +28.3828125,56,-0.5335528488686052,-0.7142878595720235,-0.828701182521792,-0.8729852883789011,-0.8481851592366457,-0.7601180326387422,-0.6189604852376367,-0.4385316661473183,-0.2353226781658141,-0.027339806591269555,0.16715772405221369,0.33093743057912245,0.449001438735272,0.5096382957777348,,, +28.390625,56,0.5052453687605593,0.4328644675886919,0.2943933302422013,0.09645821135167064,-0.15004355171291828,-0.4306991068908779,-0.7285811107443574,-1.0254244110570219,0.37264398814875416,0.0804736396082042,-0.2881997315343117,-0.6755184905522227,-1.0200206707724435,-1.26620344535374,,, +28.3984375,56,-1.3731623848721657,-1.3209609304410606,-1.113738022066619,-0.7790698504192521,-0.3636851191973504,0.07379885570876643,0.47198788436480105,0.7762513623162268,0.9472055798714388,0.9668186856039614,0.8411865671852241,0.599547452812143,0.2896888927621044,-0.029537297358515287,,, +28.40625,56,-0.2974260846279459,-0.4609213646787536,-0.4829289589783656,-0.3481454214662426,-0.06549452780031084,0.3332083173799412,0.7981560058551203,1.2692510773101753,1.6854092582929456,1.994016404279112,2.159066168972005,2.1667112090195437,-1.2787835776156564,-1.7102911057358257,,, +28.4140625,56,-2.0512519752577623,-2.182645984164898,-2.0417615678928698,-1.639611255632631,-1.0581472575620423,-0.4280381755858432,0.10690458690395643,0.4289032337163857,0.4782578858476721,0.2694785396609625,-0.11291453151992376,-0.5377689366904705,-0.8634477110753921,-0.9768374684717456,,, +28.421875,56,-0.8245245007046258,-0.4275928309371899,0.12401288987170064,0.6960159262536839,1.1465059715103116,1.3647505518713845,1.3014829686229352,0.9823662501893662,0.5009433323273694,-0.006994313375839834,-0.4005949445763285,-0.5724998575022527,-0.4781959766808109,-0.14812380041089102,,, +28.4296875,56,-1.1607758307932081,-1.1338313475512858,-1.0910688374888726,-1.0334999923854589,-0.9624019818502494,-0.8792949387597566,-0.7859151862485151,-0.6841846751359884,-0.5761771670286174,-0.4640817553284554,-0.3501643629831023,-0.23672789125303584,-0.1260717173886281,-0.020451250511602848,,, +28.4375,56,0.07796174601409668,0.16711737086928236,0.2451236704445674,0.3102799619164399,0.3611068101370033,0.3963721333260353,0.4151129803442155,0.4166525981074575,0.40061249017474665,0.3669192552424269,0.31580608568204915,0.24780889975748754,0.16375717512182952,0.06475964397275212,,, +28.4453125,56,-0.047814899786260516,-0.17236134543631346,-0.3070661467497633,-0.4499388516381517,-1.302896342758593,-1.5438720624804858,-1.733625994940506,-1.8608563133603675,-1.9184710183833555,-1.9040808036698003,-1.820164342210576,-1.6738944697369722,-1.4766373874939327,-1.2431598072273238,,, +28.453125,56,-0.9905993265037276,-0.7372698323728109,-0.5013852345439531,-0.299790523567276,-0.14678863791583552,-0.05314494196998931,-0.02533873076677273,-0.06511395061269931,-0.169360458622429,-0.3303340939580981,-0.5362002063932564,-0.7718627313978804,-1.020020988176061,-1.262380496572416,,, +28.4609375,56,-1.4809333678695284,-1.6592189722903652,-1.7834769607596457,-1.8436122244008963,-1.8339044888764984,-1.7534130475880243,-1.6060483962131833,-1.4003057586301266,2.027363586630806,1.7740175105107854,1.4570559420443931,1.136350244539588,0.8718836690137656,0.7143593817352906,,, +28.46875,56,0.6972561365451228,0.8315692054621859,1.1040559255056328,1.4792593435405643,1.9049949675113045,2.320446219517207,2.6656078503505007,2.8906066053160027,2.9634475314808912,2.874979511981347,2.6403067133199887,2.2964261791311342,1.8964595808611744,1.5013775929191735,,, +28.4765625,56,1.1705058757464613,0.9522914001221792,0.8767672754166042,0.9508896726715096,1.1574730688105097,1.4578895605457143,1.79811170304836,2.117157537655429,2.356622300717082,2.469812031649143,2.4290562876448045,2.2300607703055437,1.1259214035293226,1.220387041314693,,, +28.484375,56,1.0367284161948165,0.6116617797034442,0.04719013202874898,-0.5171439575772716,-0.9422873411291016,-1.1275665693694992,-1.0380569925274967,-0.7139317822912669,-0.2592307387581984,0.1868708515392352,0.4884168663303873,0.5501346080638853,0.3437388794480676,-0.08413515555010465,,, +28.4921875,56,-0.6245462457113569,-1.1359529019665495,-1.4828708325311593,-1.5728884569575805,-1.381896825056239,-0.9606201649841296,-0.4206580324304197,0.09613490819576308,0.4565389865338846,0.5724707076993543,0.4250911462117839,0.06991438493992819,-0.3784836454387476,-0.7779644512094139,,, +28.5,57,-0.5988467281917926,-0.751551880945892,-0.905750207594098,-1.0591115141631997,-1.2093200863603597,-1.3541150068277723,-1.4913295124890509,-1.61892870296958,-1.735044939963695,-1.8380103178351404,-1.926385637030616,-1.9989853731201797,-2.054898204388424,-2.0935027386806824,,, +28.5078125,57,-2.11447816425778,-2.1178096382999545,-2.103788318841312,-2.0730060397087517,-2.026344721840251,-1.964960706521324,-1.8902642849959996,-1.8038947830169592,-1.707691636736408,-1.6036619665212857,-1.4939452166047689,-1.3807754798577327,-1.2664421674950266,-1.1532497125176784,,, +28.515625,57,-1.0434770125970996,-0.9393373226812672,-0.8429392997195535,-0.7562498817282646,-1.1486790712580153,-0.8667962751049871,-0.5723361985909959,-0.28380254424295986,-0.019240456723628285,0.20501484660780067,0.3754701374190449,0.4824080050708544,0.5205573504479044,0.4894538063958098,,, +28.5234375,57,0.3934649686617049,0.2414786950501656,0.04627622579176255,-0.1763661435550936,-0.4087841765696543,-0.6326643784628618,-0.8303278528100351,-0.9859697888153957,-1.086768129728053,-1.1237840957329257,-1.0925917496549788,-0.9935926889004684,-0.8319939046334354,-0.6174503380532345,,, +28.53125,57,-0.3633970458677873,-0.08611753211175081,0.1963867980391483,0.4656472378111984,0.7040112348130809,0.8958692146819147,1.028739232138292,1.094133822654443,1.8926217038772748,1.4575904673521434,0.9805610128350069,0.5232630345370184,0.14400118416755905,-0.11137079688164386,,, +28.5390625,57,-0.21653548151081206,-0.16875339329880654,0.0107683412803955,0.2802374519036112,0.5838442360053991,0.8605122736743203,1.0534688840383275,1.1191443854843384,1.0340137691086022,0.798314880962596,0.4360637164674501,-0.008635816310420097,-0.4784131414864177,-0.9115210625804911,,, +28.546875,57,-1.251410166685815,-1.4554965338567731,-1.501757331834055,-1.3921271783542968,-1.1521664335179675,-0.8270532332836293,-0.4745236531842404,-0.15585971681207975,0.0736709977940152,0.17343500454130625,0.12376920616218255,-0.07095309610395695,-0.6368252553565787,-0.1043323112065544,,, +28.5546875,57,0.5236075981543109,1.10312298748311,1.5044476299456218,1.6472638818419176,1.522485817711347,1.1945141353509907,0.7833469478633287,0.4314515129271792,0.2644785357374185,0.3565882443437227,0.7098934643330805,1.2536558308409895,1.8634574713590937,2.3950957345456088,,, +28.5625,57,2.7239132959733285,2.778786181629417,2.5614562219882417,2.145910953824941,1.6579822219203757,1.2407560206564237,1.0152746456538058,1.0473022701934096,1.3292630596599193,1.7823023960018116,2.277906436580884,2.673154670816728,2.8499435346493565,2.7474305895957114,,, +28.5703125,57,-0.6810596513040199,-0.6189512901770902,-0.5712716772821329,-0.5391081190177442,-0.5232691280117491,-0.5242700870643093,-0.5423240493967404,-0.5773378363987809,-0.6289135013038302,-0.6963551332646915,-0.7786808827853654,-0.874639998043558,-0.9827345738890818,-1.101245632785824,,, +28.578125,57,-1.2282630811122512,-1.361719016366536,-1.4994238021607424,-1.6391042794072386,-1.7784434447016984,-1.9151209012144084,-2.0468533738621155,-2.1714345794218355,-2.2867737535226493,-2.3909321599769533,-2.482156943237844,-2.5589117312807805,-2.6199034531177414,-2.6641049014173595,,, +28.5859375,57,-2.6907726452125638,-2.6994599790917952,-2.6900246821758893,-2.662631451063833,1.0881486150706792,1.0117316672813341,0.8706147505460023,0.6749113806313849,0.4384096320082422,0.17760905430252485,-0.08943114605853282,-0.34435233577309793,-0.5697772138758359,-0.750521787194863,,, +28.59375,57,-0.8746540463360644,-0.9343255173877963,-0.9263177034367464,-0.8522653124661934,-0.7185407077332132,-0.5358076415767459,-0.31827539632294943,-0.08270534832630191,0.15276076371052744,0.3698691510980017,0.5515304175084121,0.6830151129738619,0.7529850210438165,0.7542882547734485,,, +28.6015625,57,0.6844627068848296,0.545912736174873,0.3457467578827672,0.09528705136366143,-0.1907140448357016,-0.4950969064248901,-0.7994850577332059,-1.085560268377438,-0.38300403218535134,-0.765624617598657,-1.1603163947863977,-1.505965492046323,-1.748377901546331,-1.8487407083723029,,, +28.609375,57,-1.7896912718048488,-1.5780489151745145,-1.2437834943395056,-0.8353813234473357,-0.4123300507674153,-0.035892800611832754,0.24039166121868336,0.3790033210217475,0.3642382181847523,0.20460594807961616,-0.0685457927404391,-0.4059651125231632,-0.7482195208148311,-1.0350059405906915,,, +28.6171875,57,-1.2145967648693572,-1.2519503947967707,-1.1342227095500226,-0.8728207378115602,-0.50167837321926,-0.07202241661408823,0.3555561166855357,0.7204907603980656,0.9716263455005087,1.0751419513782094,1.0197762613638617,0.8185416766836967,1.2258569711196818,0.7162899489612047,,, +28.625,57,0.41515381414050223,0.37963588294138095,0.5925818624436803,0.9674104416856334,1.3720656458177682,1.6654403203386792,1.73628608014506,1.5339435419836018,1.0824684425315612,0.4742799224471089,-0.1549303748929402,-0.6631538643669197,-0.9407589188178076,-0.9403202925427157,,, +28.6328125,57,-0.6894106544799753,-0.2828502874722297,0.143459210494704,0.4499442512280711,0.5317574103075648,0.3476393684741825,-0.06866663628299917,-0.6175771042453463,-1.1608969130674898,-1.5596522540376163,-1.7121592951495763,-1.5818951878416776,-1.2075326979504173,-0.6923879499395055,,, +28.640625,57,-2.6177489641818537,-2.556141628973922,-2.47885615646929,-2.387203198336164,-2.282734367976254,-2.1672150480434187,-2.0425934605425815,-1.9109665411021537,-1.7745432149771023,-1.6356057178179173,-1.4964696384875904,-1.3594433835744288,-1.2267877733709496,-1.1006764767928532,,, +28.6484375,57,-0.9831579780033951,-0.8761197407008566,-0.7812551975334232,-0.7000341426358486,-0.6336770456963149,-0.583133737282441,-0.549066838622409,-0.5318402259522581,-0.5315127313843513,-0.5478371905579088,-0.5802648537064068,-0.6279550828618418,-0.6897901653514658,-0.7643949841556914,,, +28.65625,57,-0.8501612006443373,-0.945275526202246,-1.0477515876480314,-1.1554648284238938,-1.3363334102751572,-1.5373224691332947,-1.6775555793422563,-1.7503291532200302,-1.7536682539407056,-1.6904571252306846,-1.568230792190767,-1.3986422823845486,-1.1966426365375626,-0.9794309063957533,,, +28.6640625,57,-0.7652473769180548,-0.5720941824833528,-0.4164725498435357,-0.3122247410983324,-0.2695614688083736,-0.2943426217126619,-0.38766147519881533,-0.545761397536633,-0.7602908766622045,-1.0188790998795294,-1.3059919653583272,-1.6040088485718251,-1.8944450525041088,-2.159234711030848,,, +28.671875,57,-2.3819846988761784,-2.5491121228363904,-2.650786086719941,-2.6816080705213152,-2.6409834910280736,-2.5331585453726597,-2.3669197792831094,-2.154977340422528,0.50666042385573,0.13604432049804113,-0.2328218076146911,-0.5403286869692376,-0.7370513178382428,-0.7914678394225723,,, +28.6796875,57,-0.6948861685835657,-0.4628109656475772,-0.13253793865942287,0.2426498701738757,0.6017798921588255,0.8856895209916475,1.0462476806792416,1.0538621370372498,0.9021032008928244,0.6087235877053916,0.21291549568617524,-0.2307679822439872,-0.6608804689744205,-1.0186202082455962,,, +28.6875,57,-1.2569528500506038,-1.3478983762757242,-1.286847387290217,-1.0932346778945834,-0.8074654162929995,-0.4845729293110808,-0.18559617808497786,0.03197981111511028,0.12323133779997075,0.0628480140185631,-0.15086932041633594,-0.4956877383854217,0.34733872109292185,0.2241475295996066,,, +28.6953125,57,-0.12345818545734688,-0.589507405123923,-1.0341854131286028,-1.3223409311586638,-1.3607260372334538,-1.1237605925334453,-0.6607579074325607,-0.08262923165238346,0.4682911526215448,0.8570323444754191,0.9927567039602732,0.8534378131482979,0.4916851310184397,0.020121025481412317,,, +28.703125,57,-0.4196801278559332,-0.6961760382342922,-0.7240776419029221,-0.4878785196914901,-0.046242377465998685,0.483955237656406,0.9595584816705868,1.2502855451090502,1.2743755610516927,1.020958963144737,0.5530206696168127,-0.009855812152072013,-0.5242340304737834,-0.8620855857398124,,, +28.7109375,57,-1.2661898343765954,-1.3776394304843886,-1.4875048638864512,-1.5934963695338644,-1.693383408086414,-1.785033871415547,-1.866451569141241,-1.9358113397396808,-1.9914911713368653,-2.032100769668502,-2.0565060728923736,-2.063849283904668,-2.05356406930323,-2.0253856587643204,,, +28.71875,57,-1.9793556678943545,-1.915821560005189,-1.8354307561349803,-1.7391194963386165,-1.6280966471792873,-1.5038227388402248,-1.3679845988007,-1.2224660261311822,-1.0693150197751284,-0.9107081345367071,-0.7489125887779173,-0.5862467871934386,-0.4250399497929429,-0.2675915538508349,,, +28.7265625,57,-0.11613129887557486,0.027219704519444003,0.16048584239263966,0.2818713557671342,-1.9130749341657671,-1.6588885563856277,-1.4107908063271026,-1.1865669554611238,-1.00217231164909,-0.8706175375256916,-0.8010596585793426,-0.7981621521962328,-0.8617687442776992,-0.986913663385822,,, +28.734375,57,-1.1641676393061622,-1.380295519553839,-1.6191796464275725,-1.8629446040431672,-2.0932049017884387,-2.292348587070874,-2.4447672739275603,-2.53794680987303,-2.563342520663857,-2.51697799394703,-2.399725640480046,-2.217249461506756,-1.9796140055527245,-1.7005867748439392,,, +28.7421875,57,-1.396682717567502,-1.0860174266643536,-0.7870490046943368,-0.5172963172993439,-0.2921230037008896,-0.12367202660605635,-0.020025045741825957,0.015354778954856927,-0.9288486879848536,-1.3936714949448308,-1.828325666968457,-2.1754059581583025,-2.3908191145653546,-2.450598426640396,,, +28.75,57,-2.354584963387637,-2.126402386405465,-1.8097295276356364,-1.4614515472404737,-1.1427566541525511,-0.9095653485112152,-0.8037830945294779,-0.8467390636770322,-1.0358330800323348,-1.3449131882777243,-1.7283251828032555,-2.1280034904828944,-2.4824990735265846,-2.736538297888524,,, +28.7578125,57,-2.8496239916769306,-2.802339081312294,-2.5993710078502144,-2.2687858605846642,-1.857665270219236,-1.4247856022323064,-1.0314796475237318,-0.7321040724978751,-0.5655972756165155,-0.5494424412287613,-0.6769759402899552,-0.9184601538010628,-0.3999745697001237,0.04072003422591708,,, +28.765625,57,0.409872008404716,0.5828843309594102,0.4877122000134586,0.12480450167510924,-0.4328112870097866,-1.0593259126883476,-1.6104031428387366,-1.9625063875042934,-2.0465210101242794,-1.866459610192,-1.4981258882441084,-1.0681054527574765,-0.7188437014146465,-0.5693839828604815,,, +28.7734375,57,-0.6825285709378109,-1.0474246033928651,-1.58234951937814,-2.156934338607491,-2.6277356648280485,-2.87740866539106,-2.846746199559848,-2.5508042707767244,-2.0746952567232597,-1.5502026315834885,-1.1196269499784397,-0.8967721863240683,-0.9357650591948492,-1.216252975709557,,, +28.78125,57,0.3897915479670128,0.48290029468171797,0.5601133751932421,0.620627216371001,0.6639327213576599,0.6898239409449577,0.6984014359347706,0.6900702717473273,0.6655326805256491,0.6257755193588935,0.5720527443652782,0.505863207649149,0.4289241660427694,0.34314096562799346,,, +28.7890625,57,0.25057343300078483,0.1533995618960552,0.0538771311581593,-0.04569607374116688,-0.14302273898479995,-0.23584649157931264,-0.3219916506711331,-0.3994015648271131,-0.4661748638644244,-0.5205989903306625,-0.5611804233644445,-0.5866710655926386,-0.5960903308973807,-0.5887425461699068,,, +28.796875,57,-0.5642293622191488,-0.5224569563943761,-0.463637900679022,-0.3882876624213305,-0.016142286562418118,-0.10837626269801924,-0.2508925596706594,-0.42965811567781137,-0.6280472207794617,-0.8280082658188846,-1.0113300389049191,-1.1609192499620975,-1.2620001806642858,-1.3031527873182245,,, +28.8046875,57,-1.2771168493268998,-1.1813060701225806,-1.017996263341876,-0.7941744840522993,-0.5210596082451207,-0.21332777480072726,0.1119033148791064,0.43626042863270986,0.7413884778371896,1.0102230335618252,1.2281729644421835,1.3841307433142176,1.4712399865503518,1.4873667186069213,,, +28.8125,57,1.4352415140744883,1.3222626198566183,1.1599738005612723,0.9632533322827584,0.749270711956248,0.5362838468549893,0.34236061201392465,0.18411393683869626,-1.225753448577746,-1.539849742846798,-1.8001131297595978,-1.9537689980371185,-1.964173124713512,-1.816570539909212,,, +28.8203125,57,-1.5204469337725923,-1.1081060955316582,-0.6296946816461764,-0.14544895034920466,0.283629212228178,0.6052150070221479,0.7837517187076216,0.8059300728896213,0.6827028087078452,0.4475209781247139,0.15106696558454508,-0.1466951290868131,-0.3859132733480666,-0.5162220505635958,,, +28.828125,57,-0.5046375800870643,-0.3407428849316472,-0.038355822173534386,0.3665804362141544,0.8215560123897765,1.2656364325160014,1.6389202381855419,1.891839186519356,1.992852625546763,1.93333772831106,1.7289140094234403,1.4169959070846212,-2.4297804133918994,-2.5266134494169488,,, +28.8359375,57,-2.342574889329551,-1.904054216527304,-1.3052926859024447,-0.6827441988980152,-0.17788067022565854,0.10136599282115523,0.10995962134334124,-0.12213028986890916,-0.4983813496559639,-0.8824149483325179,-1.1356179230412635,-1.1553760637181325,-0.903438632868106,-0.41663789246780375,,, +28.84375,57,0.20297635892821314,0.8158854418284596,1.2831305160643782,1.5042006777645842,1.4443981663522965,1.144182287833749,0.7079326038312674,0.27521233434266695,-0.01759108622299288,-0.07473421145234327,0.13257508899070924,0.5582417481218409,1.0938943733298967,1.5985867216997485,,, +28.8515625,57,-0.297215798851448,-0.19151199944527464,-0.07252722041731452,0.05814975844730207,0.1987199442452679,0.3472054253504996,0.5014838019050866,0.6593251496334879,0.818430869864414,0.9764737455985748,1.1311385023503475,1.2801621636508962,1.4213734946833498,1.552730843502824,,, +28.859375,57,1.6723577173322837,1.7785754710920871,1.8699325358819547,1.9452296757103689,2.003540830320824,2.04422917923703,2.0669581458301933,2.071697148806482,2.0587220004819065,2.0286099449452286,1.9822294230600623,1.9207247435889747,1.845495928910736,1.758174088296792,,, +28.8671875,57,1.6605927500138558,1.5547556542854906,1.4428015711084632,1.3269667590098484,0.07553863807118401,0.027031120523339558,0.044660314359941,0.12974069746463635,0.2787371853575901,0.4835085281970088,0.7318722484673847,1.0084517301106881,1.2957463937722795,1.57535033550571,,, +28.875,57,1.829234452652571,2.041002652633544,2.197034546827354,2.2874349466698187,2.306723950541808,2.2542194986315898,2.1340857173064505,1.9550436792713564,1.729764745785925,1.4739887909708316,1.205428792278184,0.9425381677728202,0.7032268112187661,0.5036153526371916,,, +28.8828125,57,0.3569145057111455,0.27250763996588345,0.2553005434468896,0.3053837089007453,0.4180306825390924,0.5840325791356447,0.7903454246455057,1.0210051725097078,1.0509546918230233,0.6917990576956511,0.3986702089950078,0.2196318830208812,0.18418979056836315,0.2987055689120064,,, +28.890625,57,0.5454194857870706,0.8852340304861648,1.263824730268362,1.620126277989019,1.895872070881504,2.0447011680298326,2.039414033740075,1.876246754086965,1.575497787181109,1.1784094056236007,0.7407893280403329,0.32436575753383945,-0.012777931783907737,-0.22519927849938626,,, +28.8984375,57,-0.28712267446935835,-0.19640111536873686,0.025203017048541,0.3354615856650405,0.6783120875510131,0.9926436376402654,1.2218687935550745,1.3227900724118735,1.2723798700273456,1.0714174971660873,0.7444165751437894,0.3358538376702765,1.8188557980482527,1.3892732760852866,,, +28.90625,57,0.8421637512644731,0.31997425189312234,-0.04351083746336615,-0.15967591700727524,-0.009186213549378321,0.3529009600247991,0.8124247478964177,1.227617041847795,1.4681723228665755,1.4511811091075577,1.1640766107178488,0.6683034557878902,0.08270084678260547,-0.4488478140340893,,, +28.9140625,57,-0.7966346698340261,-0.880469623640994,-0.6914607635091589,-0.29426552915414084,0.1908025733700508,0.6209060370178167,0.8699721746216961,0.8633694427226536,0.5984663291968169,0.1454372086754473,-0.371906529928958,-0.8100071111980762,-1.0448847916569621,-1.0061186603364771,,, +28.921875,57,1.2095457221432162,1.0928509529007648,0.9791723649930428,0.8707371273565854,0.7696706022282431,0.6779590713957424,0.5974149033060775,0.5296447709848912,0.4760214772890037,0.4376598808482912,0.4153973442508216,0.4097790468304348,0.42104841924132586,0.4491428673139891,,, +28.9296875,57,0.493694860070799,0.5540383628481891,0.6292205028791713,0.7180182630643643,0.8189599116139726,0.9303507923170524,1.0503030238300384,1.1767685879378065,1.3075752273856194,1.4404645246876884,1.5731314951269866,1.7032650006357264,1.8285882768841852,1.9468988639052225,,, +28.9375,57,2.0561072410313512,2.154273489604912,2.239641341445778,2.310669016845319,1.25824657350922,1.4837478631824088,1.6799144566532112,1.8311121201656024,1.924763611348576,1.9522323006021352,1.9094311401442765,1.7971144993095989,1.6208324991689769,1.3905510142875248,,, +28.9453125,57,1.1199638233467322,0.8255448576103133,0.5254066199174626,0.23804436313817995,-0.018946416663829124,-0.2300897562456932,-0.3831012286797645,-0.4697374371633895,-0.4863637781916472,-0.4342008989487784,-0.31923267925068194,-0.15178217110788622,0.05421491692795189,0.2821885126128684,,, +28.953125,57,0.5140960151623685,0.7316866391917916,0.9177800861095116,1.0574703629525586,1.1391707888583316,1.1554273043670995,1.1034433562711317,0.9852797440614915,-0.09671352884589028,-0.4915702366106826,-0.7924154643019413,-0.9570948781389144,-0.9641322476632932,-0.8160435066938863,,, +28.9609375,57,-0.5389172442813662,-0.17832711608945526,0.2077870290597804,0.5581603932051823,0.8177585299053773,0.9463583407178824,0.9248181802227852,0.7580604366433028,0.4743020253229993,0.12065266069694572,-0.2442334690066793,-0.5593080312319119,-0.7706555974673686,-0.8399134291230559,,, +28.96875,57,-0.7502724618400264,-0.5091246711455332,-0.14694432775325386,0.28742277528641225,0.7343285808040143,1.1325717599530931,1.4288860750172925,1.5861904791547266,1.5893161980928276,1.4473190233158784,1.192016927476078,0.8729810472111202,0.3865625957659598,0.8889819741637459,,, +28.9765625,57,1.1957532794294998,1.2404264024151832,1.0299150053807966,0.6424389694108517,0.20590866983732176,-0.13732307067406813,-0.2696791620906579,-0.13079616340893818,0.2657102902020073,0.8357494939341122,1.4475708734001034,1.957639558919754,2.249742077791436,2.2666066295357155,,, +28.984375,57,2.0253739169805005,1.6126805438270664,1.1607045134793903,0.8107400021545232,0.6742863344263474,0.8023172580393133,1.1711545104030134,1.6888187861767319,2.220118815686123,2.6236035392131267,2.790250862199394,2.6732903410997158,2.300986875391354,1.7688821548434166,,, +28.9921875,57,2.366056312055339,2.4047674619161894,2.4260493772404046,2.429444937551652,2.414801106359884,2.3822717268040865,2.3323149486402555,2.265685331551936,2.1834207629799325,2.0868244194555152,1.9774420872136784,1.857035239115593,1.7275503392117566,1.5910849123380209,,, +29.0,58,1.449850972762936,1.306136452160651,1.1622653022043292,1.0205569702794541,0.88328595780151,0.7526421691558006,0.6306927454495962,0.5193460512551176,0.4203184448220443,0.3351044135060309,0.26495059721895764,0.2108341546402892,0.17344585087691233,0.1531781625869496,,, +29.0078125,58,0.15011860872872018,0.16404842358890104,0.19444659520509575,0.2404991983450869,0.8077154805764646,0.5817793586471331,0.3219848788977808,0.0453218801228112,-0.2299248197651184,-0.4854474003714889,-0.7041889414216541,-0.8715304246490405,-0.9763080673678592,-1.0115900508807605,,, +29.015625,58,-0.9751584842107324,-0.8696629977346588,-0.702435258762737,-0.4849773452864006,-0.23215965618588635,0.03881570968129204,0.3096138193224189,0.5620444171694539,0.7793289997312759,0.94726909936026,1.055234312934251,1.096901181834212,1.070691404311356,0.979878828620006,,, +29.0234375,58,0.8323577730277314,0.6400888363063326,0.4182608526526465,0.18422743983922074,-0.043707691572918095,-0.2475719531187203,-0.4109822629688138,-0.520292837116788,0.5497604923765125,0.2825522924425701,0.12276997310175765,0.10498004765350456,0.2414626489900489,0.5202438039233133,,, +29.03125,58,0.9069061231408072,1.3498961685628372,1.7885021290788037,2.162259514717031,2.4203201501455216,2.52932545558663,2.47855795783503,2.2815688923101503,1.97402861144094,1.6081348183372404,1.2444497662713847,0.9424380003783618,0.7511785981537074,0.7016986682075042,,, +29.0390625,58,0.8021223284365246,1.0363908395999628,1.3667533240529748,1.7396401904720025,2.094004490388036,2.3708320179836258,2.5223389056184127,2.5194241206079067,2.3562160561395884,2.051004998553596,1.6434161515545382,1.1882634309276021,0.5602295057725124,0.6097404691466809,,, +29.046875,58,0.8910891773675073,1.3054545364385528,1.7153940437735289,1.9826710348167411,2.0063165566249417,1.7504927117784967,1.2545192862957664,0.6223138585473278,-0.005862375499707695,-0.4916114443643958,-0.7360888394073615,-0.7068495175473074,-0.4464941500182264,-0.0607481192581223,,, +29.0546875,58,0.31075737335779785,0.5329919197947566,0.5127646286613565,0.22448690566496665,-0.28260346777966416,-0.8977387136679315,-1.4787954902807818,-1.8910790726482756,-2.0440891522415,-1.916192142911037,-1.5604391698625981,-1.0899361367070592,-0.6467762347372238,-0.3630501004778144,,, +29.0625,58,0.3011138584986865,0.37493909349015603,0.4603881939159738,0.5556672241326271,0.6588066533695374,0.7676960629796368,0.8801213219695788,0.993803579742981,1.1064393931586871,1.2157412851499176,1.319478024593248,1.4155139219900266,1.5018464527678297,1.57664154928022,,, +29.0703125,58,1.6382659434109277,1.685315993330896,1.7166424895157115,1.7313710055403773,1.72891743717247,1.7089984575416637,1.6716367051808387,1.6171606139640669,1.546198887783969,1.459669716584742,1.3587649224448968,1.2449293131767296,1.1198356048344522,0.9853553520989404,,, +29.078125,58,0.8435263954224883,0.6965173948021188,0.5465900710627686,0.39605981568503373,-0.5655523356433518,-0.5412036062002252,-0.4464772158549932,-0.2854513150397213,-0.06677364461385715,0.1969349435530864,0.4899538733772516,0.7945522503891046,1.0922183348533228,1.364943363402508,,, +29.0859375,58,1.5964702107631688,1.7734198351555397,1.886216973686468,1.929750553088696,1.9037227804156216,1.8126625876814644,1.6656025101184382,1.475441547536696,1.2580384556035915,1.0310987117321977,0.8129327878435413,0.6211723362786387,0.4715338297380779,0.3767158867720838,,, +29.09375,58,0.3455071917130225,0.3821672321935636,0.4861230525855365,0.6520031844933035,0.8700064025713088,1.126579605025881,1.4053575614175189,1.6882990089844334,0.7470412113111048,0.3783790890796391,0.12894622293553493,0.026221772356468498,0.0742572830279512,0.2530908414415074,,, +29.1015625,58,0.5219040241679426,0.825429694107486,1.102612347457696,1.296171857796201,1.3615807453892357,1.2740564384095725,1.0324791616189564,0.6596249326869998,0.19867708408854504,-0.29344063434518103,-0.7548712621937512,-1.1284006691370012,-1.3703112018058854,-1.4571342217590149,,, +29.109375,58,-1.3892500729028967,-1.1907750393012326,-0.9057531668376992,-0.5912463494762847,-0.30839918149203593,-0.11287050570197545,-0.046122214671114437,-0.12892232563115025,-0.3580744493945649,-0.7068832290551573,-1.1292834097688125,-1.566989552740449,-0.9738953394284484,-1.4872964786428429,,, +29.1171875,58,-1.9452653685313976,-2.2181538893240886,-2.224829241907327,-1.9550359764203369,-1.4723505713519405,-0.8969173925135905,-0.3726960277100249,-0.028194823982852,0.058549429579692676,-0.1188504251123319,-0.4935983555581386,-0.9442443233751354,-1.3281958003027654,-1.5210249670461196,,, +29.125,58,-1.4507965155147164,-1.1180056899191777,-0.5956600353379639,-0.009480387327982788,0.4963545743344987,0.7985337208229214,0.8282327043443752,0.5898146747327734,0.1594887125443352,-0.3357049556692787,-0.7528222211203676,-0.9722812806210648,-0.9307052109753816,-0.638339106329545,,, +29.1328125,58,0.24725535876170446,0.10247820117894246,-0.03603747876292485,-0.16616374237977627,-0.2859159499624647,-0.3934873136845616,-0.4872803391485905,-0.5659346051487104,-0.6283503953420352,-0.6737077681463999,-0.7014807310667659,-0.7114462713615962,-0.7036880850301576,-0.6785949389293702,,, +29.140625,58,-0.6368536948009978,-0.5794371174568576,-0.5075866806968946,-0.42279067212255,-0.3267579803194296,-0.22138802348829512,-0.10873734615410163,0.00901653106824915,0.12961337558164415,0.2507499507079857,0.3701204720166908,0.4854571036261388,0.5945697853124245,0.6953846929880982,,, +29.1484375,58,0.7859806590454907,0.8646229147782815,0.929793563999834,0.9802182542043976,1.9569398861683394,2.193676323047455,2.3829879327345207,2.5125161101512328,2.573922154701497,2.5634653862738475,2.482260949017312,2.3361993330048314,2.135533232622416,1.8941605574310547,,, +29.15625,58,1.6286535987022812,1.35710205541936,1.0978506028932726,0.8682190402035572,0.6832942667035876,0.5548783281061412,0.490665888638156,0.4937084862971425,0.5622029291230936,0.6896185861877854,0.8651546939795168,1.0744957850230683,1.3008125557569217,1.5259383746402435,,, +29.1640625,58,1.731639382709294,1.9008896115624865,2.0190621930884416,2.074953585719841,2.061569385560664,1.9766169154775783,1.8226702318824928,1.6069960316276315,-1.9585529062711968,-2.2489148773218384,-2.397969178782536,-2.3867991110610705,-2.2206185258816333,-1.9279584180213496,,, +29.171875,58,-1.5562258328649297,-1.1643267875126468,-0.8135021776451129,-0.5578039585460199,-0.4356948975845513,-0.4640801734346411,-0.6357003050843285,-0.9202913302511584,-1.2693313660159984,-1.6236340695675167,-1.92260608119301,-2.113726342643134,-2.1607706117799355,-2.0494999239990976,,, +29.1796875,58,-1.7899267430443175,-1.4148055765506635,-0.9745828823120304,-0.5295925679580046,-0.14071239404924918,0.1400636915316119,0.2776691689187799,0.2593719670217985,0.0967030089051053,-0.17639380962448814,-0.5089017709586413,-0.8407295773137744,0.7251162350767193,0.9050247355321585,,, +29.1875,58,0.8070276327439367,0.4468844704940087,-0.08960001484061769,-0.6699696011421881,-1.1512778847615723,-1.4191077626897726,-1.4187564914453623,-1.1700410470636742,-0.7616678249093429,-0.3267116334419196,-0.005926408808491046,0.09105488365853244,-0.08400487589800965,-0.5044968809356953,,, +29.1953125,58,-1.0760295315076398,-1.6620711463769071,-2.1211464958142487,-2.345394802657483,-2.2899236637735068,-1.984915829116712,-1.5271726046454412,-1.0534133371540513,-0.7026504208011317,-0.5779531928892051,-0.7180814160476701,-1.086763916637392,-1.5825617608353693,-2.066613556103397,,, +29.203125,58,1.014888578208097,1.0330798139669135,1.0343636918984347,1.0186159661091247,0.9860186569111559,0.9370569253241,0.8725106342513117,0.7934407440640334,0.7011707807724744,0.5972637012508819,0.4834945605811379,0.3618194600855622,0.2343413197559871,0.10327307438023074,,, +29.2109375,58,-0.029101062205132387,-0.16046558648422884,-0.28851424804843273,-0.4109904358922715,-0.5257267010636073,-0.630682723616389,-0.7239810590603877,-0.8039400383788873,-0.8691032455169366,-0.918265056178866,-0.9504917907256034,-0.9651381107628076,-0.9618583722881568,-0.940612736573038,,, +29.21875,58,-0.9016679317439604,-0.8455926516900943,-0.7732476728218016,-0.6857708616896575,1.3410525873272843,1.039696639578776,0.7201535390966659,0.4008224405380604,0.09999985168582183,-0.16538946549845035,-0.3809657585540436,-0.5358899128271626,-0.6236120317811144,-0.6423207844389289,,, +29.2265625,58,-0.5950622018670375,-0.4895196552337451,-0.33747037509425165,-0.15395642754226635,0.043772025145718735,0.237467472313914,0.4091653645538703,0.5424446877175675,0.6235808801407561,0.6425106791737616,0.5935415979867961,0.4757565414799798,0.2930853292182581,0.05403812114335649,,, +29.234375,58,-0.22888068134438624,-0.5400372045931126,-0.8617512549779316,-1.1755223381106632,-1.4633130659203466,-1.7088004702443422,-1.898507979111896,-2.0227391331757443,-1.1121216385580914,-1.273014435484379,-1.2908813956483929,-1.155844151160183,-0.8822538346981048,-0.506495892858652,,, +29.2421875,58,-0.08136011690661543,0.3321474085451109,0.6742752876353868,0.8958057346687601,0.9656963400601302,0.8758945630431865,0.6425751768852096,0.3036080165514844,-0.08734949121050004,-0.4692148480885831,-0.7829955212427456,-0.9809744741243582,-1.0341355113712476,-0.9366719372492104,,, +29.25,58,-0.7068763371441761,-0.3842729712191545,-0.023439522360125076,0.3145193894063175,0.5715187451484578,0.7015726402556568,0.6779924191353414,0.4975820959777303,0.18117739912278785,-0.22955573803351764,-0.6785648191195346,-1.1040931722283258,-2.2854652023464714,-1.843527656701731,,, +29.2578125,58,-1.2642782674517086,-0.6880708985089949,-0.2520778323999213,-0.0528157158664464,-0.11983354734776895,-0.4077728332566827,-0.8089746117660931,-1.183176607584742,-1.3961597476542578,-1.3567503902167883,-1.0420351594915425,-0.5038757569043159,0.1450638390614742,0.7619503879320654,,, +29.265625,58,1.212681191384902,1.4083915974176475,1.3295667687833508,1.0311515546124763,0.6272601096763268,0.25967793916969184,0.058790974470269826,0.1076517086592198,0.41903252953088,0.9317568536045246,1.5273150501294477,2.0622125306483032,2.4071854921637903,2.482537400675477,,, +29.2734375,58,-0.5845573359368763,-0.4712351259108549,-0.3476367630485269,-0.21576729246450604,-0.07776926977839435,0.06411464496982451,0.20758084141157776,0.3503049754232057,0.4899825440636793,0.6243691084871072,0.7513194605973833,0.8688250477270849,0.975049000110084,1.0683581479050002,,, +29.28125,58,1.1473514672407283,1.2108844572789517,1.2580890215501614,1.2883885055302238,1.3015076272481108,1.2974771271382597,1.2766330558181804,1.23961071236563,1.1873333393389784,1.1209957725974535,1.0420433323189475,0.9521463249459118,0.8531706026365788,0.7471446958406678,,, +29.2890625,58,0.6362240946211479,0.5226533042693767,0.4087263397418165,0.29674635077145284,-2.076247944501508,-2.058599164155497,-1.9741933480709941,-1.8319549847569612,-1.644705443534528,-1.4282644798024733,-1.200342961708761,-0.9793040407108484,-0.7828791615961777,-0.6269284559751617,,, +29.296875,58,-0.5243319675103784,-0.4840890330314244,-0.5106886275494483,-0.6037945851949246,-0.7582676500010616,-0.9645228214146452,-1.2091970774359269,-1.476080913834847,-1.7472487403320682,-2.004309306880539,-2.2296889622571983,-2.4078582568797637,-2.52641635170163,-2.576957609879213,,, +29.3046875,58,-2.5556599361856955,-2.4635538317679018,-2.306453395802968,-2.0945540783608747,-1.8417252265348782,-1.5645467482014943,-1.281157060575461,-1.0099926497185838,-1.448249009611048,-1.6659709922008092,-1.731994137293039,-1.6447313715769785,-1.4264664415223056,-1.1198284225040243,,, +29.3125,58,-0.7810972309768474,-0.4713831328240536,-0.24705437659334986,-0.1509041866798203,-0.20543318856423354,-0.4092938433593687,-0.7374509626486754,-1.145033567450779,-1.5742783993869185,-1.963483840228724,-2.256579852244199,-2.411823589999589,-2.4082665011439524,-2.248985820534276,,, +29.3203125,58,-1.9605773083852818,-1.5889883966785263,-1.1923408905766746,-0.8318612453224613,-0.5623311746846879,-0.4235460378096829,-0.43411146408032897,-0.588544461896787,-0.8581305455212531,-1.1954033734331286,-1.5415491453154198,-1.835582437278988,1.3573252632197417,0.9017276150714564,,, +29.328125,58,0.6244470285890851,0.6007520380493834,0.8339146198600309,1.2544003660368173,1.7390331052249084,2.1448804651584075,2.348572126104268,2.280273412639314,1.9430015307679027,1.4119887610907558,0.8142653275316917,0.29405574950394475,-0.02652950336900484,-0.0807358870606466,,, +29.3359375,58,0.12476829075448916,0.5119493465493709,0.9530240464919612,1.3057073829104304,1.4524298242168419,1.3327736968845911,0.9602368590744368,0.4187273316527373,-0.16025220660783918,-0.6334787025899876,-0.8851112776816918,-0.8583066062462807,-0.5706835323205739,-0.10939959632503836,,, +29.34375,58,0.18898508474296974,0.08764289725579105,-0.0051899892893012564,-0.08757030058962599,-0.15773595407922325,-0.21413713156971687,-0.2554636366862175,-0.2806680579414951,-0.2889843317320733,-0.279941380090333,-0.2533715842623729,-0.20941394560794446,-0.14851187834056967,-0.0714056726258886,,, +29.3515625,58,0.020880240128570704,0.1270549969400976,0.2455836779140276,0.3747139542619206,0.5125065431977442,0.6568689365920337,0.8055918129256792,0.9563874951089204,1.1069297809087986,1.2548944486825484,1.3979997293084043,1.5340460357777912,1.6609542549217369,1.7768019309200431,,, +29.359375,58,1.87985670714663,1.968606440926132,2.0417854640169057,2.098396529132632,-0.7685071248439187,-0.5719590804948055,-0.4323532808777977,-0.3576089884189356,-0.3510134185466693,-0.4109984194499285,-0.5312559355475984,-0.7011841884911246,-0.9066334471038652,-1.130899365995657,,, +29.3671875,58,-1.3558946084737993,-1.5634170367287252,-1.7364260180506947,-1.86023782962046,-1.923556785747902,-1.9192701668376904,-1.844951500103575,-1.7030370795160072,-1.5006633984935585,-1.249176814460434,-0.9633496207459205,-0.6603571745165783,-0.3585873918580668,-0.07636561086703242,,, +29.375,58,0.16931627457759255,0.3639778052379874,0.4966529422913172,0.5606481229323339,0.5540025396937529,0.4796185618999517,0.3450532192783756,0.16198530253265725,-2.0238642233726094,-2.068479513755596,-1.9531696406694203,-1.685895080491749,-1.2976294931733992,-0.8375726501454426,,, +29.3828125,58,-0.3655276816258719,0.05737026973425596,0.3781301399868683,0.5601100549367573,0.588673711021144,0.47341726578888393,0.2466201493589277,-0.04183863849543838,-0.33230665408897,-0.5647073138005708,-0.6879558839136807,-0.6679752739674627,-0.4930628375230636,-0.17577197853543747,,, +29.390625,58,0.2489847998007136,0.7293162338371088,1.2043782957199367,1.6137960360859451,1.907014044540532,2.0511194087918687,2.035918959722884,1.875480237814585,1.6058963978329084,1.279623396461214,0.9572716777114108,0.6981310304160866,0.9822544724492782,0.9057728118043756,,, +29.3984375,58,0.5876504053372916,0.11920586626511745,-0.3650383635673689,-0.7243025676903924,-0.8502315948143542,-0.6967095161687782,-0.29263467835847656,0.2658473980659873,0.841525996208657,1.2935479601809967,1.5158265072152328,1.4659112372359695,1.1764088807599022,0.7458267254698829,,, +29.40625,58,0.3113503498968373,0.011018599382574434,-0.05433533996101792,0.15105619482463462,0.5878722320805497,1.1522659415237573,1.704120402551872,2.1052552762721994,2.2571149551845933,2.1276107648668225,1.7597622135544837,1.2597704776408891,0.7677941615334232,0.4194379888056343,,, +29.4140625,58,2.1377280583490026,2.1593663915005608,2.1632028202290794,2.14943528463874,2.1185647029747336,2.071385998713599,2.0089739823021806,1.9326643348725259,1.8440300270251877,1.7448535857025995,1.6370956948702902,1.5228606799232551,1.4043594802877557,1.2838707586793252,,, +29.421875,58,1.16370082809699,1.0461430983324522,0.9334377521917844,0.8277323575893347,0.7310441052977606,0.6452243336629981,0.5719259615469499,0.5125743998402955,0.4683424509666209,0.440129635976531,0.4285463112953676,0.4339028533210248,0.4562041003275511,0.4951491490721748,,, +29.4296875,58,0.550136509740695,0.6202745290385386,0.7043968989892677,0.8010829799430249,-0.05460474454530817,-0.2874849393848101,-0.5183786408113567,-0.7292440232984009,-0.9035369119004693,-1.0273689054093502,-1.090480017798729,-1.0869580029451102,-1.0156541928674212,-0.8802668435336545,,, +29.4375,58,-0.6890861687634986,-0.454418835083687,-0.19173204335004496,0.08142312214662441,0.3466340032081881,0.585909103967571,0.782931807337571,0.924197648024096,0.9999558375730406,1.0048893862402637,0.9384863941135256,0.8050766188401355,0.6135307678160671,0.3766434811682402,,, +29.4453125,58,0.11024302829838988,-0.16791020292128472,-0.43935961782259264,-0.6862365496198567,-0.8925030772151762,-1.04506686817727,-1.1346903137593998,-1.156630568192357,0.5509045904115824,0.546095366876368,0.6912312644634112,0.9696724429937094,1.3431868687638202,1.7578929755629016,,, +29.453125,58,2.1526438877947034,2.4685473510403635,2.6581386019205406,2.69277744455642,2.5671173690366498,2.299950571328639,1.931297185897936,1.516192005748965,1.1161363285847028,0.7895462175710394,0.5826847604221986,0.5224905075737261,0.6124189135186906,0.8319442984304647,,, +29.4609375,58,1.1397996870740648,1.4804496742552773,1.7927878926581058,2.019704154147112,2.1170308695002227,2.0604750236158247,1.8494557364936604,1.5072494059042056,1.0774195370740185,0.6170870415692046,0.1880888999475984,-0.1525980184737592,0.8291333357278374,1.3020999333033851,,, +29.46875,58,1.7387891530812791,2.00528530575382,2.0118826962160683,1.7377494207201163,1.2367362788650853,0.6227379277580322,0.03861733329610295,-0.3827907993864148,-0.5549111891449166,-0.4609653798904228,-0.15836614549430902,0.2372336874702652,0.5838643607323744,0.752383086711455,,, +29.4765625,58,0.6621084951507521,0.3031771670494333,-0.2605071606117453,-0.9085421864191819,-1.4967828053480972,-1.896608820623144,-2.029944615442905,-1.8904349915651861,-1.5449754800934414,-1.1151795803999331,-0.7438639529312555,-0.5557385886608308,-0.6230770730190495,-0.9457770072525146,,, +29.484375,58,0.9086825820075376,1.0253447710354051,1.1490501948337355,1.2776463636217672,1.4088852670209764,1.5404626689624654,1.6700583924973695,1.7953768891688155,1.9141873826182003,2.0243628835414245,2.12391739288614,2.211040641885651,2.2841297606612443,2.3418173209006548,,, +29.4921875,58,2.3829952616017067,2.4068342789638515,2.412798340919748,2.4006540721692056,2.370474845389401,2.3226395069874544,2.2578257597064257,2.1769983179510666,2.0813920432260944,1.9724903549721515,1.8519992948154231,1.721817698341528,1.584003996668489,1.4407402290967553,,, +29.5,59,1.2942938969435995,1.14697832647632,1.0011122349448582,0.8589792076811728,-1.1109658700964773,-1.0025854010481283,-0.8408433996149748,-0.6389016623155201,-0.4128062933296836,-0.1803630970085804,0.040109950941991664,0.23106614554408905,0.3769598950220988,0.4653371880193697,,, +29.5078125,59,0.4877106286067752,0.4401580045176913,0.3236026326339908,0.1437559161294628,-0.0892738975128553,-0.3616794917530255,-0.656910148284891,-0.9568186816498824,-1.2429196788857768,-1.497671320306352,-1.705691413178782,-1.8548228575521317,-1.936974263028184,-1.948677114600004,,, +29.515625,59,-1.8913206514736995,-1.7710480967197402,-1.5983214904538965,-1.3871854883310564,-1.1542814789401716,-0.9176807844302224,-0.695618324209542,-0.5052150622096444,-0.3616767278952816,-0.4162200507016045,-0.31718898502477033,-0.08923178614621641,0.2232046766185719,0.5628453524998472,,, +29.5234375,59,0.8685533017617788,1.0848950646099182,1.170815026652175,1.10606749369525,0.8944044524369333,0.5630223288635622,0.15835375411684666,-0.26114035007281083,-0.6340558195498527,-0.90559248984817,-1.036076683569099,-1.0071315849618108,-0.8245344769244743,-0.5173158334118977,,, +29.53125,59,-0.13324059004174252,0.26862461049890324,0.6271005477898175,0.8884097333455346,1.0145340780576253,0.9891142679094224,0.8199721097813397,0.5378631181524474,0.19165379142127065,-0.15932508276579754,-0.4545578890959795,-0.6418108816119334,-2.491364378536219,-2.759589271356625,,, +29.5390625,59,-2.7508192298084,-2.4700611914413684,-1.9941852600200576,-1.4509014719000797,-0.9838249483736534,-0.7132033608566345,-0.7030692708313131,-0.9438188543493232,-1.3549904348095354,-1.8074799208940533,-2.1591030213789386,-2.2937560190643858,-2.1534405060149053,-1.7543731500589703,,, +29.546875,59,-1.1827632890729167,-0.5714135175914083,-0.06355422145102008,0.22617822353363304,0.24292704852122535,0.006419603784716178,-0.394664559021715,-0.8272164155048356,-1.1503880519874072,-1.2543933896671295,-1.0907831125860559,-0.6858946476799069,-0.13378939437737994,0.4293885191072759,,, +29.5546875,59,0.7227877957774897,0.5946329329863068,0.4764593473911776,0.3700276084505826,0.27688340388441457,0.19833058430601305,0.13540844752824946,0.08887366023727372,0.05918713351621385,0.0465060819652664,0.05068140539179966,0.07126043884562439,0.10749502277115386,0.15835475189208234,,, +29.5625,59,0.2225451707609779,0.2985305972879005,0.38456117452587535,0.47870367694594607,0.5788755317012748,0.6828814590731547,0.7884520904330056,0.8932838874267117,0.995079663293334,1.091588996698265,1.1806478303272634,1.260216560768215,1.3284159526221615,1.3835602478752738,,, +29.5703125,59,1.424186890682686,1.4490823469667409,1.4573035666161995,1.4481947123671268,-0.3612783399149953,-0.2752637656721861,-0.254471064466656,-0.3015299770026847,-0.4142120703176939,-0.5855815947152933,-0.8044748784161327,-1.0562748406889262,-1.3239266240306942,-1.58912353125576,,, +29.578125,59,-1.8335805767512063,-2.040306850812886,-2.194787977976364,-2.2859962189538314,-2.307157783935087,-2.256223854659985,-2.1360124731863235,-1.9540114059793865,-1.7218557323924026,-1.4545165882868976,-1.1692576367826355,-0.8844320344156981,-0.6182037829353099,-0.3872826289408564,,, +29.5859375,59,-0.20576072803649725,-0.08413219298292017,-0.02856389144040605,-0.04046833767352065,-0.11640845581858328,-0.24834084909803744,-0.4241806035049556,-0.6286482321294465,-0.685311407562103,-0.5713654670628081,-0.3105383984004313,0.06394122052980727,0.5013061194189555,0.941105429570883,,, +29.59375,59,1.3225671323380637,1.594009896167405,1.7208386474227193,1.6908788130908277,1.5162186898478254,1.231273270661884,0.8873713854735816,0.5447095206125598,0.262925829768534,0.0917627547872596,0.06327286477652971,0.1867821478399566,0.44739549093644093,0.8082773565573805,,, +29.6015625,59,1.2163526445991408,1.6105400012718725,1.931235379219851,2.129568903129152,2.1749933864008115,2.0600226802555763,1.8013819461886662,1.4373907848989234,1.0219868871119888,0.6163211076016417,0.27923310649914723,0.058091038548330864,0.9726914538017702,0.6359545181604231,,, +29.609375,59,0.1456805847805166,-0.3607937167320552,-0.743825581396521,-0.8997078000369414,-0.7890399315471238,-0.44745371760265146,0.024246047853883637,0.4878221843808145,0.8056233408400697,0.8784588351475149,0.672948325873665,0.23084900856252305,-0.3421976839270036,-0.9054175186435218,,, +29.6171875,59,-1.3212750647755571,-1.492950972025454,-1.390655607168875,-1.0595693941560171,-0.6072357967890614,-0.1738643015568403,0.10631540109176664,0.14205427604790322,-0.08970302896158099,-0.5373050954947833,-1.0883675098258645,-1.6004054815795248,-1.9397314707058964,-2.0179586559538296,,, +29.625,59,1.421398862324298,1.376864481093387,1.314846546092033,1.2359023091954362,1.1408817678033574,1.0309130120575585,0.9073827046470349,0.7719120348738637,0.6263285678922395,0.4726344819057219,0.3129717493635552,0.14958487168975765,-0.015218180068020788,-0.17910613487882965,,, +29.6328125,59,-0.33976499842691843,-0.4949383264993449,-0.6424664900238729,-0.7803242443560087,-0.9066559451179832,-1.019807794100438,-1.1183565507330806,-1.201134206532569,-1.267248190609472,-1.316096752575855,-1.3473792536362037,-1.3611011857990438,-1.3575738314615156,-1.3374085694603184,,, +29.640625,59,-1.3015059274257252,-1.251039572264418,-1.1874355192326402,-1.1123469237774102,-0.8443396910004171,-1.0529448411539497,-1.2365293793120644,-1.378790833045848,-1.4662010242324994,-1.4889553209299096,-1.4416624704934182,-1.3237268962887403,-1.1393967853429046,-0.8974745992426332,,, +29.6484375,59,-0.6107101804528492,-0.2949187594206885,0.03211464898882907,0.3518680757845931,0.6463667019842851,0.8994287084694055,1.097786011299193,1.2320017470141122,1.2971205459061166,1.2930062648857483,1.2243436460853854,1.1003038029057801,0.9338968775829803,0.7410570288388483,,, +29.65625,59,0.5395235735619642,0.3475963211851055,0.1828519121819281,0.0609106912361177,-0.0056598785597127286,-0.008228775831059632,0.057289674002847464,0.1901440251538649,-0.01857795252968919,0.05448137425226785,0.2584501626745107,0.5533868360545358,0.8844722604136072,1.1905758648971818,,, +29.6640625,59,1.4138083697329562,1.5085730841369531,1.4487058191891569,1.2315911520477056,0.8786137111453276,0.4318739768542687,-0.05232010030690834,-0.5121721911002053,-0.8899695975020766,-1.1410175535755946,-1.2405445249756315,-1.1875032497681899,-1.0046757737696672,-0.7350664103593251,,, +29.671875,59,-0.4351447329497285,-0.16599133371604358,0.0162742627188196,0.06929233545432745,-0.02888238538128607,-0.2763069410926001,-0.6473985742364905,-1.0968669424202606,-1.5667179149982011,-1.9952383260480249,-2.3265625010465887,-2.5193307474987785,-0.8535012332783821,-0.34994126748511606,,, +29.6796875,59,-0.010110049187779135,0.08221638836672174,-0.08648030701420828,-0.4557881200985283,-0.90797638143108,-1.300338698595625,-1.5044022668861494,-1.4412566553377433,-1.1033185098274243,-0.5565659425267974,0.07737111996902696,0.6543576377525907,1.047054341615858,1.1796033852396837,,, +29.6875,59,1.0481943595895258,0.7218761272365017,0.3233940388289168,-0.004693405162710329,-0.13932988380576672,-0.010931248432574758,0.37730215118879307,0.9500258891758564,1.5801712255492197,2.123549815102194,2.458161222663039,2.517432108530926,2.308278980140326,1.9090456799816955,,, +29.6953125,59,-1.0276248976732396,-0.9352858605930138,-0.837475998913558,-0.736433454214489,-0.6344489036688702,-0.5338252226927537,-0.4368369362825683,-0.34569016916793416,-0.2624837961787666,-0.18917247319601072,-0.12753219613741495,-0.07912899115522054,-0.04529128439497465,-0.02708643523725329,,, +29.703125,59,-0.025301844033484452,-0.04043096525280576,-0.0726644710573845,-0.12188672014013202,-0.18767759375938065,-0.2693196669269177,-0.3658105892824604,-0.4758804589654835,-0.5980138853680492,-0.7304763545401857,-0.8713444356903213,-1.0185392999511962,-1.1698629645884882,-1.3230366281056132,,, +29.7109375,59,-1.475740425073854,-1.625653904672424,-1.7704965242309605,-1.9080674488115776,0.3847914308764799,0.6312776824665202,0.9159250808344548,1.2222801869918594,1.532255375116699,1.8273845968163405,2.090105800334054,2.304980589104127,2.4597660799096324,2.5462642268588547,,, +29.71875,59,2.560889394698916,2.5049146116684566,2.3843793380540568,2.2096651894632915,1.9947692076304755,1.7563253617743018,1.5124425194180526,1.281439922944762,1.0805683546182212,0.9248061699411042,0.8258141576213005,0.7911221080875457,0.8236038138979034,0.9212771112838448,,, +29.7265625,59,1.0774429050885608,1.281153480150557,1.5179774391691834,1.7710079215770242,2.0220437923669587,2.2528614273126326,2.4464884026408233,2.5883902636613745,-2.5530914171647296,-2.431449583035713,-2.181472089968799,-1.8494418103561927,-1.4936225488328374,-1.1751616285215931,,, +29.734375,59,-0.9485472378712704,-0.8531069456616885,-0.9068716039326437,-1.1037604162738879,-1.414525638945383,-1.7913097785970975,-2.175105463846936,-2.5049560402109377,-2.727463790200348,-2.8051247456206667,-2.722191803437136,-2.487152816674413,-2.131437548310238,-1.7045547322726755,,, +29.7421875,59,-1.2664164978009818,-0.8780454797976444,-0.59211182739179,-0.44477380261037625,-0.4500926066293104,-0.5978911093546972,-0.8553897410701938,-1.172364482372534,-1.4890232950324345,-1.7453739181058232,-1.8906236602656,-1.8911468318922044,0.885913978139659,0.9640748093996718,,, +29.75,59,1.289031353073224,1.7774683893513392,2.298511377428565,2.709595749708091,2.895562976118601,2.800268093297289,2.4420355703829983,1.908726867827175,1.3337706731701426,0.8597241690313709,0.5993508804035667,0.6048811127263959,0.853878235680194,1.2555827640490318,,, +29.7578125,59,1.675993713139385,1.9748112740313144,2.044113932088814,1.8381677217252037,1.3861956730981089,0.7846055733953771,0.17080401164144016,-0.3142286701341088,-0.5643475715832047,-0.5371118554348819,-0.2652027955839989,0.15273615411633845,0.5793249720061504,0.876274921546695,,, +29.765625,59,-2.036283960015655,-2.1532178015412207,-2.2571288251569888,-2.3464953480099955,-2.420040689774692,-2.4767554250373705,-2.515914961328639,-2.5370921350691704,-2.5401646049188256,-2.5253169131185906,-2.493037178772376,-2.444108481009049,-2.37959508293914,-2.300823737657285,,, +29.7734375,59,-2.20936040365058,-2.106982777348688,-1.9956491237971612,-1.8774639512399776,-1.7546411306687255,-1.6294651061247178,-1.5042508749669143,-1.3813034388622918,-1.2628774355038588,-1.1511376579095245,-1.0481211526011842,-0.955701560314584,-0.8755563236280103,-0.8091373356819399,,, +29.78125,59,-0.7576455439185122,-0.7220099535063085,-0.7028713980762937,-0.700571361918644,2.66748760738983,2.676932546204248,2.6145903980073486,2.483193003151929,2.290152966241176,2.04705176505055,1.768837410500249,1.4727875949226832,1.1773106185803122,0.9006676960853471,,, +29.7890625,59,0.6597057263025214,0.4686888792193053,0.3383104619822118,0.2749539544969455,0.28025472922291284,0.3509930018118108,0.4793254611722227,0.6533394101007922,0.8578907577237509,1.0756674109292488,1.2884038940554965,1.4781624803638698,1.6285914807188409,1.7260729277568372,,, +29.796875,59,1.7606796066695063,1.7268746786525784,1.6239050930064332,1.4558613371107831,1.2313993409937245,0.9631439124733217,0.6668152869855423,0.36013968462178786,-1.7357785557148242,-1.4376101246041215,-1.0320059782260187,-0.571150875228946,-0.11597628163532984,0.27327679782051273,,, +29.8046875,59,0.5463889308660316,0.6709342077917549,0.6372827650300811,0.4600549587784473,0.1758009274103658,-0.16273281623747327,-0.4948565479187576,-0.7614245858623796,-0.9140787712906436,-0.9228082976693156,-0.7806482665356299,-0.504785025015584,-0.13389602233309514,0.2778615638789845,,, +29.8125,59,0.6692771884493738,0.9816158760092016,1.1677655710553836,1.1995781501957594,1.072260671672444,0.8051328574566596,0.4386327610099733,0.028036918351928924,-0.3651270032255409,-0.6826376581175055,-0.8786190965270704,-0.926653737391818,0.31302043029088106,-0.2402750255613951,,, +29.8203125,59,-0.7785427037071402,-1.1641427617489146,-1.2990948967983842,-1.151912961750927,-0.7662377768459652,-0.2489020436562415,0.2593018946727529,0.6221402762158021,0.7451861451601295,0.6015898585221675,0.23931003648513996,-0.232175572077262,-0.6720357357840813,-0.9468588312711508,,, +29.828125,59,-0.9674051341328614,-0.7132637883508655,-0.2386547951682319,0.3422161371533268,0.8862381593271846,1.260395131147166,1.3779982123201533,1.2222230796315787,0.8505030633552118,0.37857628027131296,-0.051438983451578935,-0.3101890809989972,-0.31671969931714483,-0.060832258172956226,,, +29.8359375,59,-0.7151460493312949,-0.7463258049357614,-0.7935398950739765,-0.8559265665267887,-0.9323482063827454,-1.0214113375668934,-1.1214910998593943,-1.2307597876922909,-1.3472189449774823,-1.4687344549252306,-1.5930740103799073,-1.7179463085017919,-1.8410412834344596,-1.9600706724197463,,, +29.84375,59,-2.0728082049729304,-2.1771287113421987,-2.271045465383035,-2.352745107898859,-2.420619538861416,-2.4732942199918675,-2.5096523920443614,-2.5288547826555514,-2.5303544595866088,-2.513906569183607,-2.4795727894403865,-2.427720419592119,-2.359016122079995,-2.27441442636217,,, +29.8515625,59,-2.1751411957614097,-2.062672346741735,-1.938708193123134,-1.8051438643593392,0.061619829063313536,-0.2107488511969946,-0.4407268308221319,-0.6149568497912424,-0.7238894988569632,-0.7624434977239263,-0.7303546355282727,-0.6321890532173384,-0.4770199533314302,-0.27779029235384617,,, +29.859375,59,-0.050405907569418665,0.1873776726291433,0.4171970996374254,0.6213651487567345,0.7841071953690025,0.8926639928739545,0.938183846034142,0.9163419602978249,0.8276437733411119,0.6773911128002558,0.4753135371745632,0.2348905655406485,-0.02758794215253157,-0.294157732027133,,, +29.8671875,59,-0.546433216910266,-0.7668902696048858,-0.9400892935395778,-1.053753279386048,-1.0996256677057907,-1.0740481917030476,-0.978218400056038,-0.8181088959297302,-0.823861535203421,-0.5913101832248051,-0.27069267111556217,0.08221009177584332,0.406263120403468,0.6445470752781157,,, +29.875,59,0.7532730683569269,0.7086537585086914,0.5106602525610677,0.18307937401775431,-0.23013790592865865,-0.6716684126184319,-1.0796914966113158,-1.39746455155245,-1.5821081729905444,-1.611232909631215,-1.4863757375081772,-1.2327112841842809,-0.8950830501439981,-0.5309730456845023,,, +29.8828125,59,-0.20150510949806544,0.03811657176107064,0.14724426582059535,0.10615337916679303,-0.08085281866731707,-0.3860841896514787,-0.7627507670627144,-1.1522282584784242,-1.4931705000254725,-1.7310496583974704,-1.82663833341238,-1.762112498218145,1.3968420745907175,1.67324365791968,,, +29.890625,59,1.6794855767586958,1.4098773132416444,0.9320134917728679,0.3682331838261188,-0.1379022277812586,-0.4609251922169091,-0.5277969528361957,-0.33785153790165234,0.037116674527796434,0.4726450243356542,0.8258488758197146,0.9747351149342408,0.8518068539574415,0.4627478107270439,,, +29.8984375,59,-0.1149361016725158,-0.7529474414001729,-1.3071381655918857,-1.6567865353814537,-1.7374474310622277,-1.558374904658004,-1.1997441235642463,-0.7904362593835923,-0.4724769893584956,-0.36187710191156974,-0.5166097332873631,-0.9205027666250534,-1.4874629783382805,-2.084876098656395,,, +29.90625,59,-1.6640363157388232,-1.5175685080411139,-1.3680113837520316,-1.2176843055043236,-1.0689146493524964,-0.9239972602778294,-0.7851544797303656,-0.6544974450074151,-0.5339893379790747,-0.4254112265551675,-0.3303310968773634,-0.2500766183511157,-0.1857121182759084,-0.1380201691096875,,, +29.9140625,59,-0.10748811064768447,-0.09429974297741904,-0.09833233553322107,-0.11915900448926132,-0.156056416728245,-0.20801768535673826,-0.2737702308320316,-0.3517982948197468,-0.4403697124276009,-0.537566473904156,-0.6413185405307569,-0.7494403224577733,-0.8596691796270463,-0.9697052714913104,,, +29.921875,59,-1.0772520576367932,-1.1800567400057589,-1.2759499384457018,-1.3628839047364658,-0.6040539171201909,-0.3500320788794405,-0.07269528779455525,0.20978846534895332,0.4789977476471117,0.7175377234013308,0.9102483404696656,1.045256424569641,1.114798327875626,1.1157557787672452,,, +29.9296875,59,1.0498675795358845,0.92360240350542,0.7477015761163462,0.5364237380228412,0.30654407737815703,0.07617793352356181,-0.13648917823301188,-0.3144765451943475,-0.443199314517178,-0.5114925562832824,-0.5123969044246783,-0.4436509733103807,-0.30785619516328006,-0.1123025665417352,,, +29.9375,59,0.13153256201768346,0.4087777193482876,0.7021972724089317,0.9933863051355796,1.264047111579353,1.497258306092565,1.6786480679722542,1.797389722729223,-1.5438247607285622,-1.2013160240151293,-0.7827194915577448,-0.3472728534883493,0.04389511497661292,0.3372685631628849,,, +29.9453125,59,0.4952589596453309,0.5020349580273598,0.3659598178951761,0.11825687527794397,-0.19188892353898815,-0.5050302914922911,-0.7607582836106299,-0.9071555590687116,-0.9089296085321026,-0.7529589217285542,-0.4503880060016179,-0.0349446901857981,0.4422584626741984,0.9206292000507128,,, +29.953125,59,1.3394761103881092,1.6474038584009776,1.810260058053365,1.8163963086622816,1.6784242538662586,1.4311934413712306,1.1263062338464227,0.8240243903615725,0.5838281938325003,0.455098866554179,0.4693758052319557,0.6353948712473323,-2.804617505834262,-2.5202802681987913,,, +29.9609375,59,-2.0640086533571194,-1.5694570131313732,-1.1780572965881055,-1.000213307425784,-1.085021612495655,-1.406817872698788,-1.8722358157960632,-2.345843963062098,-2.6873334109883444,-2.790063969851297,-2.6104034801081566,-2.1798182529860406,-1.5963998019416743,-0.9981487594840552,,, +29.96875,59,-0.5253365267560013,-0.28225852801037354,-0.3088595593455674,-0.5700059674055951,-0.9653428358158334,-1.3570325513001842,-1.6077703178921208,-1.6186555501914164,-1.3565375611555257,-0.8633387452266084,-0.244797910435622,0.35828322239791605,0.8084119143191935,1.0088800616367273,,, +29.9765625,59,-1.4389686058323048,-1.5025050443774952,-1.5520152329188297,-1.586268296839202,-1.604302248821558,-1.6054410534432058,-1.5893066829746485,-1.5558259531580378,-1.5052320191462685,-1.43806050528296,-1.3551403363704404,-1.2575794308443171,-1.1467455062486351,-1.0242423329871713,,, +29.984375,59,-0.8918818520264891,-0.7516526446591616,-0.6056853062974491,-0.4562153304946185,-0.30554415298025656,-0.15599903771515475,-0.00989250726020774,0.13051797228344106,0.2630693459429402,0.3857306751558415,0.4966385335483159,0.5941294735206593,0.6767689952537049,0.7433765109748668,,, +29.9921875,59,0.7930458674519453,0.8251610674534988,0.8394069149748457,0.8357743979166374,1.8469502508836089,1.825539544037256,1.7362290954326842,1.5867318632133571,1.3888586716657654,1.1576890713058223,0.910514489852772,0.6656273845022678,0.4410408441648823,0.2532279396938457,,, +30.0,60,-1.2941442147089381,-1.0633352302650918,-0.863118156303903,-0.7084177184230017,-0.6108386568100251,-0.5778528628583708,-0.6122750279836953,-0.7120633775011774,-0.25108507188775414,-0.5940348855522352,-0.8504737938510111,-0.9786030840619572,-0.9572649432038907,-0.7892482353287116,65538.0,30.0,0.0 +30.0078125,60,-0.5008605242376545,-0.13783296557543195,0.24180411189572,0.5767652638929962,0.8120649402487858,0.9075951555004714,0.8443897343723873,0.6275993540773043,0.2857138962490058,-0.1338468965492515,-0.5720878276984606,-0.9675923933283109,-1.2660510436318022,-1.4286796789068639,,, +30.015625,60,-1.4382173673204044,-1.3015693342541814,-1.048683802392686,-0.7278378707743882,-0.39806694227435785,-0.11991712521056186,0.05403875228994848,0.08744405190915672,-0.034124004783513184,-0.30085275302612846,-0.6801673634956522,-1.121749803405417,-0.797839617331427,-0.29671835324501383,,, +30.0234375,60,0.006632510252671864,0.04564491303906559,-0.1728331083770921,-0.5706323275108063,-1.0199092938715433,-1.3784104486753679,-1.5286864039528631,-1.4105067727840066,-1.037589478353174,-0.49405743512759004,0.0884083312412926,0.566459458422001,0.8241802177408037,0.8046823282259893,,, +30.03125,60,0.5255370746247152,0.07381675850961623,-0.417894173567702,-0.807942508149801,-0.9845151045714416,-0.8963486305207974,-0.5668229514893001,-0.08757517512448265,0.40661566952057715,0.774789973801084,0.9084847221498527,0.7615258421000245,0.3627699394880911,-0.191697507874302,,, +30.0390625,60,-0.21181408240509114,-0.14553592702387508,-0.09566685901780869,-0.06267935895869658,-0.046742358463123024,-0.04771844529538105,-0.06516643682148504,-0.09834927666436122,-0.14624711619546227,-0.20757535171100616,-0.2808073013672291,-0.3642011246966398,-0.45583051325134444,-0.5536186148717821,,, +30.046875,60,-0.6553745974638867,-0.7588322119492701,-0.8616896790346499,-0.9616502012837738,-1.0564623910054174,-1.1439599059541263,-1.2220995987095429,-1.2889975116140493,-1.3429620868885888,-1.382524010289453,-1.406462165624344,-1.4138252455416493,-1.403948640058586,-1.3764663069893777,,, +30.0546875,60,-1.3313174162897126,-1.2687476518475629,-1.1893051477949836,-1.093831130364317,-0.870459392480677,-1.0764567830260943,-1.3155670159162285,-1.570828019073969,-1.823985727044577,-2.0567660781090398,-2.252148765345112,-2.39555392084856,-2.4758589829171735,-2.4861748370702763,,, +30.0625,60,-2.4243271075403707,-2.293009035837439,-2.09959528344086,-1.8556296396848808,-1.5760223547204208,-1.278013065389039,-0.9799716270172711,-0.7001204666652082,-0.45526754517978085,-0.25963827485014324,-0.12388783824279048,-0.05436277313865423,-0.05266330567065047,-0.11553694097629263,,, +30.0703125,60,-0.23511072038474568,-0.39944593725275757,-0.5933766168871905,-0.799573277682505,-0.9997577804654596,-1.175984536688294,-1.3118987182279898,-1.393883714841187,-1.5653220402940011,-1.9499815003601575,-2.223635016793468,-2.351062157199407,-2.3193522932331136,-2.1398688201436125,,, +30.078125,60,-1.8464348384638725,-1.4900231257214647,-1.1307776885899263,-0.8286097923086875,-0.6338333819371923,-0.5792986583689553,-0.6752492096042813,-0.9077038718023575,-1.2406154807877516,-1.6214703847985488,-1.9894566527408586,-2.2849288040210425,-2.4586949252687704,-2.4796796825781677,,, +30.0859375,60,-2.339769679584896,-2.055086455151946,-1.6634888073176053,-1.2186934116788535,-0.7819294002453243,-0.41242664538251006,-0.15821913032476176,-0.048695692377030086,-0.09005824407068352,-0.2643947049935902,-0.5325108501555038,-0.8400797940375795,-1.4387656574670535,-1.3915774115608586,,, +30.09375,60,-1.1070003690472923,-0.6836913052534752,-0.25890292344890126,0.029351693981851112,0.08034886491273485,-0.14151208807704818,-0.5967219043662633,-1.1812604000692064,-1.754878715256777,-2.179315612514979,-2.3559759785809278,-2.25274701348527,-1.912604545419157,-1.441652591366447,,, +30.1015625,60,-0.9798758983165624,-0.6626229215791762,-0.5833770594608896,-0.7680207313046028,-1.1676468706010599,-1.671888932707711,-2.1391168165377445,-2.4352234605305414,-2.4703722237754353,-2.22363384392002,-1.748760658735519,-1.159515280298201,-0.5985742162012888,-0.198528345133399,,, +30.109375,60,-0.9834454290170637,-0.8595271104113524,-0.7236905741727239,-0.5777575288939514,-0.42372533893134284,-0.2637322961031197,-0.10002042424827232,0.06510353220108885,0.22930825268403277,0.39027841521569423,0.5457549910151629,0.6935745536309754,0.831706914401708,0.9582904253940301,,, +30.1171875,60,1.071664331797921,1.170397607430882,1.2533137685742959,1.319511231789198,1.3683788593808575,1.3996064204453253,1.413189784458319,1.4094307565985282,1.388931557820171,1.3525840464565113,1.301553870216733,1.2372598261959475,1.161348790434121,1.075666656130218,,, +30.125,60,0.9822257895030495,0.8831695732750436,0.7807346587317787,0.6772115874486259,-1.4120178080670145,-1.3607733339080796,-1.2394095633832074,-1.0520318877665873,-0.8073131647044194,-0.5178966397741959,-0.19952206262376004,0.13006408079273857,0.4523382442039525,0.7492836733622585,,, +30.1328125,60,1.0046389250221237,1.2050240067096696,1.3408656252867361,1.4070570409940282,1.4033065303269452,1.3341501752190208,1.2086281033860953,1.0396467730551957,0.843071788127477,0.6366145204886032,0.43859019426571616,0.2666340498333538,0.1364651281516044,0.06078389483881619,,, +30.140625,60,0.048380589828573406,0.10351649333999047,0.2256212670382255,0.40932748772944016,0.6448399768217656,0.9186141817613249,1.2142963138233926,1.5138596928362342,-1.1261510756373103,-1.3326937760354456,-1.4136870318108161,-1.3423417920250984,-1.1153287255856594,-0.7533534852886083,,, +30.1484375,60,-0.2979894464654861,0.19473904925064678,0.6630237924619098,1.0488404940884888,1.3069273239725847,1.4117760390987097,1.361547088078384,1.17829918179712,0.9044978563541168,0.5963471143944299,0.31498304526348064,0.1169013230252075,0.045109798326933626,0.12238445081387395,,, +30.15625,60,0.34767934616766727,0.6962499745960605,1.1234709534554255,1.5717536435466968,1.9794863834290362,2.2906049944883797,2.4633030226083856,2.4765251533816777,2.3332325000948915,2.059931241136301,1.702538065666782,1.3192264268697884,-0.47327615994405414,-0.8802110096380911,,, +30.1640625,60,-1.235196342081839,-1.4090652520215574,-1.32118845972864,-0.9618008045092907,-0.39491372019324394,0.25898661416469937,0.8557156670715649,1.2666606336479416,1.4137836313873664,1.2907668597740765,0.9645066148821145,0.5565487915881608,0.20955587554020438,0.04799776099502895,,, +30.171875,60,0.1438417034873788,0.49664648339506123,1.0335179587932726,1.6289396249609844,2.139044491668731,2.440936482496472,2.466285452885032,2.2199891594094296,1.778788013260368,1.2702125863990714,0.8376338335908361,0.6009946136503891,0.6239845122012772,0.8966538483719231,,, +30.1796875,60,0.5749044723115044,0.47609044392843247,0.3829795726456673,0.2976759680336718,0.22214073710785087,0.15815744998966352,0.10730071780775907,0.0709084331491373,0.050058159223443144,0.04554808127156529,0.05788285385440606,0.08726459193104064,0.1335891635674431,0.19644784927936587,,, +30.1875,60,0.2751343390453028,0.36865694455772924,0.47575581296209124,0.5949248407504992,0.7244379041814237,0.8623789470057043,1.0066753987384005,1.1551343383971164,1.3054807705438431,1.4553973434913583,1.602564814267069,1.7447025518559518,1.8796083695711392,2.0051969891369246,,, +30.1953125,60,2.1195364630381395,2.2208819174237933,2.3077060247747876,2.378725672802716,1.798858066577771,2.0517085148428955,2.2569144843819906,2.4021436750378573,2.479085618288266,2.484029151373953,2.4181195219520735,2.2872771977870965,2.1017840455497527,1.875565737380358,,, +30.203125,60,1.6252204260469685,1.3688614221892095,1.1248545765523867,0.9105384118141473,0.7410162507385181,0.6281045660247038,0.5795108825784367,0.5982985547194287,0.6826757353406483,0.8261232463378188,1.0178524261986914,1.2435610195534506,1.4864343893335978,1.7283222243887086,,, +30.2109375,60,1.9510086768455646,2.1374873477001524,2.273152200418605,2.3468213443072363,2.351522283386343,2.2849838596905885,2.149800572549263,1.9532578011685762,0.9713678360696669,0.7139791174330303,0.5871634711614702,0.6098783815083886,0.7770009671786404,1.0601477576886413,,, +30.21875,60,1.412121088218528,1.7742894217956693,2.0857519149685393,2.292859620588914,2.357610157013092,2.2636081212300683,2.0186626575490823,1.6536173611513,1.2175945177823115,0.7703941563653134,0.37323153511262386,0.07925547163030722,-0.07467594405282785,-0.07368156349124833,,, +30.2265625,60,0.07288004755391009,0.3329234254144503,0.6566886930539365,0.9845464713612622,1.2563392733885714,1.4208041266620723,1.4436085225509514,1.3127477804928398,1.040462896849665,0.6613799109420484,0.22716035057261294,-0.20150425041821163,2.1977332624768087,2.357142959050684,,, +30.234375,60,2.2395935881567848,1.861324630251918,1.3085629589755199,0.7140942606469671,0.22108348249973342,-0.055941976541927674,-0.062255076969302325,0.18230071276119852,0.5889798315060911,1.0246859025154365,1.3486749581276816,1.4513492472400848,1.2845073475643096,0.8747579470874973,,, +30.2421875,60,0.3164190823866575,-0.2541528501454578,-0.6957703278841673,-0.900962319841853,-0.8252989153431063,-0.49945716799089157,-0.020722296627677158,0.473745650771932,0.8445522199205711,0.9882995051551846,0.86592943970521,0.5134113437411678,0.031844769085588066,-0.44030946543687144,,, +30.25,60,2.4329243626433774,2.469569944192939,2.488227378070002,2.4887663007720873,2.4713632605854707,2.4364985851204453,2.3849479353388983,2.3177686939786906,2.236281426725029,2.1420467407496435,2.0368379458337875,1.9226099967734616,1.8014652608872126,1.6756167100300263,,, +30.2578125,60,1.547349181609332,1.4189793869164224,1.2928153670025415,1.1711161060143267,1.0560520091342185,0.9496669371295448,0.8538424622619256,0.7702649713965783,0.7003961923067719,0.6454476592177221,0.6063595646570482,0.5837843678742267,0.5780754467962262,0.5892809921766294,,, +30.265625,60,0.6171432507985303,0.6611031309293135,0.7203100893258882,0.7936371266121958,1.7068301036794469,1.4253875628049257,1.1261655067579426,0.8275694342261144,0.5478984637262247,0.3040763089043135,0.11047825628851704,-0.02206407272901123,-0.08701079153801905,-0.08256250139038701,,, +30.2734375,60,-0.011778452101430359,0.11764411214886017,0.29391401779115656,0.5019756810739197,0.7245662194128354,0.9434264221650874,1.1405811191990836,1.2995996464600732,1.4067484958873189,1.4519557556350042,1.4295200713052765,1.3385146746324605,1.1828582903288587,0.9710479618784869,,, +30.28125,60,0.7155724129716058,0.43204683903085206,0.13812944934302124,-0.14770469990608642,-0.4074470892710461,-0.6248068534366141,-0.7863423988200556,-0.8823946203164852,-0.564307081665202,-0.8106838395184489,-0.9076562245629891,-0.8449396552423548,-0.6365197944992096,-0.3184524689655885,,, +30.2890625,60,0.056770232370304034,0.42841007707670103,0.7369532986916038,0.9333865468565024,0.9868333684935053,0.8893617871725125,0.6572141852381513,0.3282679594128744,-0.04387748169444969,-0.39826632422300123,-0.6761014796954398,-0.8299270954116117,-0.8310480886959478,-0.6740309234496077,,, +30.296875,60,-0.37758444181066986,0.01831662757281105,0.45861765596040005,0.8817163104847543,1.2290122535640393,1.4539871706386043,1.5294011160556849,1.4514845701830614,1.2404735431358447,0.937404657340802,0.5976696747966608,0.28233367262076836,-0.6423717810072092,-0.20289102904190032,,, +30.3046875,60,0.36907831693597615,0.9328291625866179,1.3509443491838549,1.5267618167899926,1.4306599671281914,1.1079611564253735,0.6662892448038241,0.2458482137590744,-0.01923027490897311,-0.0378747509366828,0.2127421806298606,0.6807282231951515,1.2534809045401731,1.7883446700064667,,, +30.3125,60,2.1515153183230025,2.2545310997335926,2.078351105673266,1.6784234000032734,1.1693553380507806,0.6933887890593433,0.38132139668817155,0.3165851449267162,0.5123279837121315,0.907780322535652,1.3849025938481538,1.8007514491060297,2.026693936800836,1.9837219777580128,,, +30.3203125,60,0.8797006283950916,0.9768847046359304,1.0833696010302307,1.1971636848355072,1.3161384450110551,1.43806589373574,1.5606577143273195,1.6816054700056968,1.7986211693539491,1.9094774781011723,2.012046873023175,2.104339052288749,2.1845359471057515,2.2510237215114723,,, +30.328125,60,2.302421199902291,2.337604224430031,2.355725515667311,2.3562296886778,2.3388631614502646,2.3036787820947953,2.251035093664627,2.18159024936468,2.096290684575338,1.996354743928423,1.8832515500043874,1.7586754835399543,1.6245167218749743,1.482828351384179,,, +30.3359375,60,1.3357906296337834,1.1856730228994101,1.0347946836441537,0.8854840598649933,-0.9077566505382686,-0.8620334466403455,-0.7496661477055949,-0.5796195115469162,-0.36475423355768927,-0.12092792365660507,0.13411256188355347,0.38197018824835943,0.6048818019330515,0.7869576384393453,,, +30.34375,60,0.9152898411748991,0.9808526900212187,0.9791317636027204,0.9104381624280716,0.779885882612068,0.5970339202800982,0.37521806697405174,0.13061899601114946,-0.11886837016445428,-0.3548853635315441,-0.5598927370525197,-0.7183970079139567,-0.8180344528401821,-0.8504371565048577,,, +30.3515625,60,-0.8118207115125456,-0.7032525778299872,-0.5305823775306677,-0.3040389743932429,-0.037522423440634556,0.2523598474029979,0.5474454263988587,0.8292775315804166,0.048569396733088466,-0.059302015475903525,-0.016768198078730534,0.17700329843351703,0.49898311687714214,0.9058160687077133,,, +30.359375,60,1.3405245024307324,1.7413352465838976,2.0512555417591956,2.2269067065964454,2.245239882747918,2.1070880681866404,1.8370013987842024,1.479391526512612,1.091585803986666,0.7348732818592201,0.4649372932133634,0.3231649227304533,0.3301870594848192,0.48265528718213546,,, +30.3671875,60,0.7537576907337299,1.097393281439805,1.4553548729430228,1.766401637030167,1.9758082196564195,2.043903049820244,1.95226589174414,1.706619255496181,1.3359632101927041,0.8880882342300677,0.42216485799832804,-0.0004358586947273979,0.5147013764312807,-0.04973625069430254,,, +30.375,60,-0.432171601157179,-0.5569817308185687,-0.4205909533635628,-0.0922445402742271,0.30518728736224754,0.6291121084654402,0.7565310593490048,0.6179902503088262,0.21686064459096255,-0.3713398023510199,-1.0193981415405604,-1.5830294611602604,-1.9401839624022696,-2.0242672913323307,,, +30.3828125,60,-1.8421714660964739,-1.4721766146419704,-1.042300442870773,-0.6950309244177045,-0.5481095187641418,-0.6621145066204798,-1.0237301608428147,-1.5492882800467211,-2.1076123814119136,-2.5559043766862026,-2.7788388025777766,-2.720150377880856,-2.398057806087868,-1.9002965337785607,,, +30.390625,60,0.7400383434152982,0.6006834672365147,0.46953535180805517,0.3485630792617155,0.23955463984595393,0.1440858503841418,0.06349298883241306,-0.00115037603313084,-0.04905195422011521,-0.07971437839761963,-0.092943683278363,-0.08885247216811076,-0.06785771536971097,-0.030673219127696605,,, +30.3984375,60,0.021703102883094183,0.08800693251665903,0.1667299144446106,0.25614629599743005,0.3543433729566483,0.4592552080617095,0.5686990316921404,0.680413687210401,0.7920994476685248,0.9014585065510206,1.0062354334357315,1.104256886069471,1.1934698833657538,1.2719779690498072,,, +30.40625,60,1.3380746325930488,1.390273402116104,1.427334082212838,1.4482846771449251,1.0803859562569185,1.2854990364902457,1.432602141110648,1.513768887679037,1.5257071367187884,1.469981706272451,1.352898292451039,1.1850567070629001,0.9806046031990864,0.7562437457454135,,, +30.4140625,60,0.5300581397452814,0.32024575207134,0.14384228462297788,0.015526011591339595,-0.05341295957029746,-0.05586710968177999,0.010585802647092524,0.14350685447785172,0.33575915676968304,0.5759987734641789,0.8494591442537305,1.138974326604614,1.4261697186643416,1.692737245320291,,, +30.421875,60,1.9217060993963697,2.0986204394884895,2.2125419336648533,2.2568072518234543,2.2294876971516198,2.133518937364474,1.976491800785918,1.770118736750657,-0.32566143267751757,-0.5151541897053512,-0.5521801896971867,-0.4441876069609526,-0.22159632076647218,0.06699250755564698,,, +30.4296875,60,0.3624204781932622,0.6042418636042726,0.7401952724715386,0.734401522305973,0.5730105707018736,0.26641767430689944,-0.1522966967067762,-0.6324604914108269,-1.1136441913568718,-1.535015490695773,-1.8447577893834133,-2.0080858009370672,-2.0126100761148673,-1.8702151558907425,,, +30.4375,60,-1.615159077985722,-1.2986904942899165,-0.9810220446640436,-0.7219103961484332,-0.5713103611099734,-0.5615589540801253,-0.7023069342688711,-0.9789874278861476,-1.355060287183667,-1.7776827332223597,-2.185923147920021,-2.5202387519262626,-0.6919791984358985,-0.7284061542116069,,, +30.4453125,60,-1.0063959595148448,-1.4349311217321785,-1.8798293997578448,-2.2007002940137106,-2.2896163965027854,-2.1008991197838007,-1.663853502433915,-1.0749598495032633,-0.47166016451372245,0.005078402842071172,0.24916501402557767,0.2182289812394541,-0.054997089226881846,-0.4718725074474756,,, +30.453125,60,-0.8950998638622076,-1.1865617673595255,-1.2453711334815287,-1.0357047776416064,-0.5967902807942131,-0.03230748596365164,0.5178920313500235,0.9159978976323008,1.0639143085176763,0.9300695492134061,0.5580146486754467,0.05445499939904361,-0.44000462324358547,-0.7893836769240291,,, +30.4609375,60,1.4524386154187934,1.4394069740185147,1.4091054881329965,1.3617562235207852,1.297883882113915,1.2183068054373751,1.124122833261493,1.0166902649926315,0.8976042570581039,0.7686690694636684,0.6318666473768335,0.4893220877725329,0.34326659571816487,0.1959985788323276,,, +30.46875,60,0.04984356106198298,-0.09288638241422076,-0.22993295894832821,-0.35913105469864326,-0.4784465036784823,-0.5860115683217716,-0.6801575103892441,-0.7594436819727,-0.8226826272919477,-0.8689607558254571,-0.8976542248566866,-0.9084397534022504,-0.9013001782320416,-0.8765246547572049,,, +30.4765625,60,-0.834703499324751,-0.7767177632870631,-0.7037237214521616,-0.6171325465719252,1.5294131560964566,1.2716388886442782,1.015103024333071,0.7778763253119961,0.5765304462851091,0.4249800275243031,0.3335104111282061,0.3080587862031966,0.3497988954514797,0.45505826654503023,,, +30.484375,60,0.6155737428384517,0.8190674964700695,1.0501033578164898,1.2911637470955923,1.5238721097761854,1.7302756102121872,1.8940986350655946,2.0018796928048515,2.043912425909882,2.0149251114419986,1.9144512608961946,1.746865470077843,1.5210820121675641,1.2499371843639722,,, +30.4921875,60,0.9492984706365889,0.6369626323655347,0.33141955669401657,0.050568052876947656,-0.18952686292329313,-0.3757485476767386,-0.4988374655353369,-0.5540307199079032,-2.7317410273905334,-2.7898057836909027,-2.686842573776813,-2.439480593729395,-2.085986328730384,-1.6803151130219895,,, +30.5,61,-1.2837230364408048,-0.9552455985991977,-0.7425260020465427,-0.6744214982557661,-0.7565392406354389,-0.970396794717611,-1.2763378792406892,-1.619748998767884,-1.9396084822458959,-2.178036143446624,-2.2893559143495983,-2.247259648117139,-2.0489560308844523,-1.715658118009501,,, +30.5078125,61,-1.2893332814718816,-0.8262214983239842,-0.38813125342503507,-0.03286847501654977,0.19471104519733096,0.2696324067405045,0.19063631877396447,-0.01967920788507249,-0.318431981436627,-0.6491867531109916,-0.9507956669222253,-1.1669708277570163,-0.3710037658770113,0.10972694057004832,,, +30.515625,61,0.557173252551954,0.8378333675030124,0.8624522698559589,0.610650920835445,0.13669248417187285,-0.4451964993615686,-0.9919288150907031,-1.3705607868981837,-1.4945101431428889,-1.3470633942883974,-0.9857321846840843,-0.5262668233741705,-0.11071055664094442,0.13174792020523984,,, +30.5234375,61,0.12039246633219025,-0.15469584740662012,-0.6297279050579114,-1.1845091719519527,-1.6752154018926548,-1.9736602104641559,-2.0022939303702323,-1.7553429346756313,-1.3002969257567722,-0.7593375399396234,-0.27579891146957314,0.025147066830134013,0.07080541404996288,-0.13913213442247774,,, +30.53125,61,-0.5185855258119355,-0.40992525320133966,-0.29316330252664397,-0.17044494674365968,-0.044011541707617376,0.08383876709164578,0.21079132674223605,0.3345555427005781,0.4529050178439404,0.5637165619283222,0.665007388386845,0.7549698471456797,0.8320030852751283,0.8947410811025583,,, +30.5390625,61,0.9420765609050049,0.9731803794059203,0.9875160247302324,0.9848489938442454,0.9652508743308252,0.92909806104185,0.8770651301186261,0.8101129864209122,0.729471991930565,0.6366203705742652,0.5332582676298814,0.4212779179684195,0.30273044551890155,0.1797898753428874,,, +30.546875,61,0.0547149885000463,-0.07019031232286227,-0.19261743237635023,-0.31029360163631586,-0.5413878004388895,-0.4657798435011031,-0.33654316957141706,-0.16682127232545382,0.02735884003766785,0.22821152589939556,0.41744015620141645,0.5775205066383146,0.692930384478327,0.7512397273921642,,, +30.5546875,61,0.7439851412352354,0.6672678753307657,0.5220335192665938,0.3140138997323437,0.05333521174234057,-0.2461803068537921,-0.567970478429334,-0.8938804113126819,-1.2054208655995566,-1.4850500261119537,-1.717389317120259,-1.8902884926751455,-1.9956657465960803,-2.030064274449579,,, +30.5625,61,-1.9948864921825886,-1.8962895937185529,-1.7447497452975536,-1.5543253209089827,-1.3416705694672064,-1.12486850706654,-0.9221644330930302,-0.7506883981980883,-1.2550977593504333,-1.1929167704835628,-0.9820313450705423,-0.6476968933742395,-0.23492256998751945,0.19850686053459976,,, +30.5703125,61,0.5910023936850991,0.8867381992541896,1.0443250327645721,1.0432388234707948,0.887003241614096,0.6026306121738372,0.2364083040226736,-0.15331308601613086,-0.5052064694197854,-0.7645146301099914,-0.891569355460193,-0.8679564909525695,-0.6993667554542023,-0.4146883844289351,,, +30.578125,61,-0.06148304301786468,0.3014502053245023,0.6132645200823952,0.8205769919322179,0.8858207518244623,0.7931363928988582,0.5508848676702234,0.1903902326506075,-0.238892178494897,-0.6770298246557145,-1.0628973716694645,-1.3436456265545458,-1.3524753078355436,-1.5138219263073731,,, +30.5859375,61,-1.4011732602603613,-1.02019640499006,-0.4483772032424851,0.1860405264366478,0.7390118338640009,1.089964605151909,1.1746286373858958,1.002424263989378,0.6536468301845203,0.25722074236986436,-0.04487783378335242,-0.13677679371724905,0.039291179490552275,0.4669155932855076,,, +30.59375,61,1.0597701085610414,1.6850435137583384,2.199620021969905,2.4890949133671887,2.4989343615461213,2.249241208046681,1.8290814331769119,1.3719277225051254,1.0189516039473525,0.8802257988176041,1.0044709939396617,1.3656392801069375,1.8700118779878419,2.3818662179069743,,, +30.6015625,61,-0.4210217693061233,-0.5227191774334303,-0.6134539381509131,-0.6914789740136884,-0.7552627270743866,-0.8035160989063184,-0.8352151497909034,-0.8496191595268118,-0.846283733541075,-0.8250687247342084,-0.7861408322635269,-0.7299708316762243,-0.6573254848023768,-0.5692542709752976,,, +30.609375,61,-0.46707117182037305,-0.3523318284669107,-0.22680647105768947,-0.09244909446147531,0.04863658018269301,0.19423376218415916,0.3420512245262633,0.48976323724836146,0.6350501018580366,0.7756385771318917,0.9093414885667778,1.0340958280327854,1.1479986766288932,1.2493403218477974,,, +30.6171875,61,1.3366339892923207,1.4086416684647152,1.4643955805418285,1.5032149123636005,-0.6252557219684454,-0.557329214801532,-0.5542154817193478,-0.6185513618697398,-0.7481163246812645,-0.9359839129151095,-1.1710016792957143,-1.4385661557387581,-1.7216388198558998,-2.001932217126078,,, +30.625,61,-2.2611835308079677,-2.4824267928779067,-2.6511750231943876,-2.7564298642736746,-2.7914483075073364,-2.7542130446017334,-2.647573644354934,-2.4790487084400556,-2.2603028000587853,-2.006334617622607,-1.7344330206243772,-1.4629737024415537,-1.2101404162407805,-0.9926599205154683,,, +30.6328125,61,-0.824638853313282,-0.7165836356648214,-0.6746717407710243,-0.7003251362883303,-0.7901156348628039,-0.936008742395785,-1.125928988352167,-1.3446073038684456,-1.4828804336473687,-1.4662779101909043,-1.303761706430918,-1.0279034603977864,-0.6887958757200124,-0.3461972576418287,,, +30.640625,61,-0.06017132499126587,0.1183195191459252,0.15540203149903398,0.03961666630399119,-0.21625078235889628,-0.5771159763051317,-0.9910182873116892,-1.3971741968031899,-1.7354077003201125,-1.9554890858386442,-2.0249277107253674,-1.9340051835177443,-1.6972651608492866,-1.3512278524968238,,, +30.6484375,61,-0.9486853302290318,-0.5504662744289166,-0.21595292085222084,0.006172699243225499,0.08551186669288091,0.014680504794772231,-0.18954819217271546,-0.48886777659042535,-0.8294204597368569,-1.1502051365509365,-1.3926018407561511,-1.5095290383299265,2.755087951499822,2.3583396447978995,,, +30.65625,61,1.8074047523358119,1.2401345279263756,0.7965960058045766,0.5808353969811157,0.6325304984920758,0.9162997776199802,1.3315964913299199,1.7404743394259343,2.005612994233701,2.0281798385689314,1.775149065713188,1.2885886666246522,0.6743678609234662,0.0733777572412494,,, +30.6640625,61,-0.3768493621930088,-0.5796052586808427,-0.5052894426208543,-0.19930980194615666,0.2305632499250717,0.6439214415957202,0.906373792788027,0.926536471706367,0.6812181456057917,0.22189703520263943,-0.33928655788709294,-0.8601841016696838,-1.2075384467834138,-1.2934684703973094,,, +30.671875,61,1.524717523747035,1.5288264232590016,1.515770899183967,1.4860822860147003,1.440584440721012,1.3803790956892263,1.3068263449325273,1.2215206053870045,1.126262474348887,1.02302697595229,0.9139287528297968,0.8011848125800638,0.6870754814810741,0.5739042492903669,,, +30.6796875,61,0.4639572083710384,0.35946279750538573,0.26255255541172706,0.1752235713004554,0.09930329010012351,0.03641728873632866,-0.012039412159295493,-0.044926998648761596,-0.061381044236794025,-0.06082786746868463,-0.042994797339830804,-0.007915166634421933,0.0440720543685863,0.11232797753873502,,, +30.6875,61,0.19592476986443486,0.29366168774254686,0.4040858919543985,0.5255176789845524,-1.57465134472777,-1.7977641090718635,-1.996025858137806,-2.1531499334733493,-2.2556248839443653,-2.2936632433645103,-2.261890782075353,-2.1597281530194223,-1.9914383028359681,-1.7658363255022045,,, +30.6953125,61,-1.4956819747433414,-1.1967971804482302,-0.8869700904980837,-0.5847220455636737,-0.3080234524355244,-0.0730480848937215,0.10694733857146144,0.22254018679448773,0.2687916273039702,0.2455837276209153,0.15762045621378318,0.014092529999840675,-0.1719705039064744,-0.3846157545954328,,, +30.703125,61,-0.6060861862680775,-0.8180654687913453,-1.0029616573506845,-1.1451401713839644,-1.232020078928874,-1.2549572251743275,-1.2098526085131396,-1.097443567318674,-1.4728073353275484,-1.2775825178349278,-0.9431188483495726,-0.5098388775202066,-0.03307063898916984,0.4255240775931933,,, +30.7109375,61,0.8075055101431139,1.0667076398756343,1.1763762377273759,1.1332817143766696,0.9581664461043083,0.6924571810351816,0.39175486992920916,0.11711620346986273,-0.07451490539525663,-0.13923525324264208,-0.0530788257562147,0.18419263059805457,0.5489956360844432,0.9975425265937345,,, +30.71875,61,1.472607351249728,1.9123865669587778,2.2600746937383756,2.472663725808742,2.5275959861650894,2.4262344372801947,2.193610144790969,1.8744864291752206,1.5263529197377235,1.2104408922423757,0.9821594492991998,0.8824422908101162,-0.15556080008609147,0.33637423317188464,,, +30.7265625,61,0.6625559922054357,0.7389360740513411,0.5517656487600949,0.16123274514465297,-0.3151814862975012,-0.7350645373713793,-0.9702813511953832,-0.9422824931813933,-0.6438329329710816,-0.14120429071282797,0.4437723015184474,0.9668760332675196,1.3008002130981897,1.3698201861188999,,, +30.734375,61,1.1703260863316134,0.7715951459104241,0.29659399100278205,-0.11192552144472023,-0.33074284757942385,-0.2901203254409199,0.006917097608793665,0.4852596064909986,1.018163471026596,1.4618715515869898,1.694916081859599,1.6513330015793697,1.3386855846448174,0.8359582279440723,,, +30.7421875,61,0.6560796870094825,0.7937295652800904,0.9362955349860919,1.081514219050089,1.2270700785738047,1.3706357655257588,1.5099126852074272,1.6426710583725335,1.7667887816208765,1.8802884057356781,1.981371584585474,2.068450391494907,2.1401749548462785,2.195456929112419,,, +30.75,61,2.2334883904463556,2.2537558260648436,2.2560489725681085,2.2404643485312072,2.2074034196022128,2.1575654283254733,2.0919350143238313,2.011764841697485,1.9185535379086325,1.8140193305231007,1.7000698435029706,1.5787685819859514,1.4522986924785077,1.3229246330780455,,, +30.7578125,61,1.1929524249480343,1.0646891811001329,0.9404026211885721,0.8222812812738178,-0.9232574598450957,-0.6972310556799057,-0.4330221687923016,-0.14706152384572085,0.1425890375244018,0.41749239854644016,0.6601184916697288,0.8550636924325978,0.9901222573921674,1.0571350973520897,,, +30.765625,61,1.0525567034531147,0.9777006969916572,0.8386468836185061,0.6458162961261421,0.4132438614281396,0.1575994121280696,-0.10297468900271536,-0.3501282560105843,-0.5665821274805681,-0.7373319790254358,-0.8506931578359312,-0.8991136834233409,-0.8796987260124148,-0.7944099943951157,,, +30.7734375,61,-0.6499261354423036,-0.4571738869592643,-0.23056268574922978,0.01302388753358313,0.25540948788391676,0.47839681867178796,0.6650411796079896,0.8008369302951236,0.9313529734534393,1.124944766743127,1.4358642724247257,1.8176048424054574,2.211747334200416,2.5570604281820577,,, +30.78125,61,2.7990430733228737,2.8984227431632537,2.8372858009199153,2.6218850635429423,2.2816871780398484,1.864808072723159,1.4305473032360165,1.0401839572181304,0.7474675351382366,0.5902847171813461,0.5847997597166718,0.7229809693153139,0.9738982891599662,1.2885896496332807,,, +30.7890625,61,1.6077378697907654,1.8709621284809077,2.026276537578342,2.038242315646963,1.8935435333521915,1.6031176899665343,1.2005089808919083,0.7367004506833903,0.2722296585879287,-0.13218440735288883,-0.42504354725997207,-0.572037534969646,-0.4920140151280871,-0.5120208956550509,,, +30.796875,61,-0.2828274578403245,0.11266494420101433,0.5440404427076593,0.8692498325954573,0.9736981560518466,0.8018245994909445,0.37251808275658027,-0.2258580699703867,-0.8594705762882322,-1.3854727580271726,-1.6909235610691233,-1.7235045625956835,-1.5056184770661667,-1.1280073408596418,,, +30.8046875,61,-0.7246416133418996,-0.43576450816158174,-0.36922214099559325,-0.5706798429443796,-1.0108894949079414,-1.593499483838363,-2.1812686663073535,-2.633501622320212,-2.8444469309118845,-2.7721361163341522,-2.4497606780785457,-1.9764702322734977,-1.4901146644691048,-1.1294016064446235,,, +30.8125,61,0.7123961153235622,0.6126641608640444,0.524814905038456,0.4503599400434376,0.3905664393209518,0.3464349189671103,0.31868167379412105,0.30772619561834713,0.313683794108084,0.33636354942519164,0.3752716325307982,0.42961993503620266,0.4983398575055987,0.5801010147921676,,, +30.8203125,61,0.6733345308832097,0.7762605153737396,0.8869192404558501,1.0032054725167323,1.1229053571994623,1.2437352120572767,1.3633815475424642,1.479541615544285,1.5899637754584803,1.692486970962744,1.7850786262319764,1.86587029801498,1.9331904592701852,1.9855938402902475,,, +30.828125,61,2.021886813518976,2.041148377530668,2.0427463727065245,2.0263486446229138,0.874734121800318,0.8799143909841791,0.8142719991525973,0.6805664572817235,0.486236080877824,0.24288546151999207,-0.034517419478717226,-0.32867846267683265,-0.6211767907041239,-0.8937425391397105,,, +30.8359375,61,-1.1295240098545272,-1.31425584062403,-1.4372467474978454,-1.4921179783509313,-1.4772409998805842,-1.3958439138224885,-1.255779198778857,-1.0689689909162405,-0.8505666030012765,-0.6178927688061835,-0.3892208088979626,-0.18249544891213343,-0.014074647838447585,0.10241781093049673,,, +30.84375,61,0.15704893711333678,0.14427563575717195,0.06333752795520542,-0.08168391777205153,-0.28214408166053695,-0.5254322964496155,-0.7958457346610759,-1.0756791538763768,-0.5613356170378484,-0.4053784146189303,-0.1388913891836358,0.18657046607718375,0.5106967792370363,0.7738569812381579,,, +30.8515625,61,0.9264267271021577,0.9365527230372391,0.7951463684039,0.5173282654280476,0.14009846353868882,-0.2834048142862139,-0.6921638345615602,-1.0267711604708913,-1.238672580464785,-1.2977235674675724,-1.1968823334916192,-0.9533085138074046,-0.6056963359154812,-0.20825760648783198,,, +30.859375,61,0.17770836275786023,0.493344942662321,0.6913842116711052,0.7434843969713998,0.6446160257181892,0.41381377730515295,0.09117710614147045,-0.2684130055605839,-0.6038823100350944,-0.8575186838738094,-0.9840061098395467,-0.957529915004899,-1.481054127482881,-1.9582956009002122,,, +30.8671875,61,-2.418496924764336,-2.72457358342661,-2.779159077529333,-2.5514061183770576,-2.085576439624664,-1.4890637802377271,-0.9031311775302874,-0.4643810452431646,-0.26751623871110874,-0.33959636566626594,-0.6328429933808748,-1.037963618814929,-1.4143406215120358,-1.6288091828149378,,, +30.875,61,-1.5923941459851911,-1.2849351737178867,-0.7608490225059943,-0.1344475321557858,0.4511668580415391,0.8631052803848868,1.0149083576986886,0.8900500030707148,0.5462891229634272,0.09967812471746793,-0.3073875620238501,-0.5453210251985651,-0.5329651273417358,-0.25991986535344513,,, +30.8828125,61,1.9919289596343637,1.9397675690177167,1.870446411744957,1.7848390398261744,1.68409544256878,1.5696220354162667,1.443057163692862,1.3062425501169883,1.1611911859588406,1.0100522279952187,0.855073515835475,0.6985623658559863,0.542845328162181,0.3902276111386122,,, +30.890625,61,0.24295288397883136,0.10316416095828462,-0.02713354772966836,-0.14610816468331667,-0.25213244205154983,-0.3438122679266107,-0.42001088683098764,-0.47986861030303896,-0.5228176725551239,-0.5485919711920805,-0.5572315225393244,-0.5490815536807527,-0.5247862472169683,-0.48527724839178454,,, +30.8984375,61,-0.43175713593925846,-0.36567814619785843,-0.2887165231509743,-0.20274294364229528,-1.346454521486635,-1.5902047855925874,-1.7907222823437876,-1.9346847354278673,-2.0125803386398644,-2.0193674223846583,-1.954822712573819,-1.82355390511144,-1.6346756867683572,-1.40117180144966,,, +30.90625,61,-1.1389876531467575,-0.8659167266116169,-0.6003584837630049,-0.3600343554043477,-0.16075136919991406,-0.015299632190563961,0.06743944879214481,0.08311202169785259,0.03219456447089808,-0.08004053140902834,-0.2438941670908097,-0.44591878349056224,-0.6698583494351651,-0.897784538027878,,, +30.9140625,61,-1.111349856803926,-1.2930703409130517,-1.4275483562719278,-1.5025502351782434,-1.5098635891626535,-1.4458745069100578,-1.3118243777046867,-1.1137284208978127,-0.7758463310671058,-0.4606822561923568,-0.05440268035330978,0.3865354392817064,0.8003235439612957,1.129375009995047,,, +30.921875,61,1.3292410176020035,1.3754803489349712,1.2674133974719919,1.0281759689692054,0.7010647770682117,0.34274411927215553,0.01437209969222264,-0.2279712018207768,-0.34206249875175876,-0.3061534244678167,-0.12239697921131065,0.1834516049891799,0.5660131903776862,0.9673227902548727,,, +30.9296875,61,1.3258313104519708,1.585969057589141,1.7067815798145167,1.6682928757181217,1.4746049618890682,1.1532510987879139,0.7509034665412139,0.3261038750770454,-0.059850249867189786,-0.35244505885822075,-0.5124289003368582,-0.5219098332084346,1.2415607526341446,1.5312913554992216,,, +30.9375,61,1.5510498442842664,1.2956934222769885,0.8333418262642451,0.28679733306080446,-0.20000233161722092,-0.5013050303778406,-0.5438637536287507,-0.32685013893788273,0.07809414655250163,0.54668052886089,0.9362364007348561,1.125015389376894,1.0457792401490167,0.7044454527383381,,, +30.9453125,61,0.17868779102830668,-0.40312892098923603,-0.8969085276277634,-1.1820985171738236,-1.194518252828336,-0.9437452715039254,-0.5102965595384535,-0.023379212783450287,0.3746898723386101,0.5676421375962063,0.4972597576979111,0.1794500469561845,-0.3000148150525497,-0.8089261274017429,,, +30.953125,61,-0.10978953574936001,-0.012014067936926165,0.08833806383098192,0.18897338529185265,0.2875907367686197,0.3819218023218306,0.4697710653877417,0.5490544911416532,0.6178362581312881,0.6743628958805932,0.7170942305760881,0.7447305968534861,0.7562358390660332,0.7508556991511,,, +30.9609375,61,0.7281312689895734,0.6879072715691636,0.6303350258169165,0.5558700430473833,0.4652642969776282,0.35955330252348033,0.24003822949177028,0.10826336421896776,-0.03401068633301696,-0.1848375789647198,-0.34211907171669176,-0.5036415220745529,-0.6671144069600561,-0.8302101901543664,,, +30.96875,61,-0.9906048392113845,-1.1460182825459246,-1.2942540984215285,-1.4332377410228732,-0.8619615915614559,-0.570540726772384,-0.25615297847889723,0.06300172942966906,0.36847351409647355,0.6428425706436378,0.8709271864456631,1.0408355088769379,1.144787738676621,1.1796514303982608,,, +30.9765625,61,1.1471525877122035,1.0537478494874655,0.9101666960670008,0.7306556159225376,0.5319769563096547,0.33223228838408836,0.1495923544820607,0.0010221797014912104,-0.09890973285574167,-0.13905506724311645,-0.11247081949764481,-0.016911115689324463,0.14500858994683197,0.3659864037775655,,, +30.984375,61,0.6345357896194205,0.9357792982629929,1.2524788966106324,1.566231064195687,1.8587433347528854,2.1131032807023553,2.314951464954422,2.4534765806721137,-0.3871223829647342,-0.13743269689283577,0.1792628370964413,0.5040286873104349,0.7761040630503782,0.9424043086223112,,, +30.9921875,61,0.9658297298672337,0.831087509251467,0.547119700250273,0.14575889897344607,-0.32317926244881356,-0.7996026837849861,-1.2224483504516428,-1.53913775590232,-1.7137097398330683,-1.7323642947579967,-1.6055541531278932,-1.366298671453623,-1.0649829263629678,-0.7614523841738032,,, +31.0,62,-0.5156347325024638,-0.37814986155925,-0.382370823851518,-0.5391725972866155,-0.8351868295995613,-1.2348346579283969,-1.6858212319512655,-2.1272363787468467,-2.498999914427948,-2.7511806576519513,-2.8517378566537968,-2.7914794426257528,-1.2625493171802114,-0.891420086879355,,, +31.0078125,62,-0.3503937084150395,0.2262975671286266,0.6967242224230029,0.9500633028559786,0.9368566312016585,0.6824315366033631,0.27980705598736105,-0.13596884849622337,-0.4250161543121857,-0.48115753518473314,-0.26122801504749216,0.20287526306656878,0.8127076134642761,1.4300241960995281,,, +31.015625,62,1.9144316740272465,2.1616271021070554,2.131746084540386,1.86005298930585,1.4470454977720253,1.030687638814568,0.7483834416282119,0.6991150499259543,0.9161239682402225,1.3576244397630806,1.918095757763694,2.4570600983604276,2.8374600459857877,2.9631188233183554,,, +31.0234375,62,-1.5610526344005113,-1.6759735024149647,-1.7764963512023626,-1.861364579293326,-1.9295907583265621,-1.980473703098185,-2.013610532174069,-2.0289035080038516,-2.026561536886404,-2.007096302637679,-1.9713131017763779,-1.9202965408161337,-1.8553913462131444,-1.7781786231009789,,, +31.03125,62,-1.6904479786212652,-1.5941659980799245,-1.4914416260116086,-1.384489058426454,-1.2755887961006689,-1.1670475409521268,-1.06115763781535,-0.9601567718776189,-0.8661886275591056,-0.7812651977923085,-0.7072314037379893,-0.64573264453389,-0.5981858453549911,-0.5657545108077747,,, +31.0390625,62,-0.5493282205503881,-0.5495069262347368,-0.5665903248031137,-0.6005724942760755,2.5221633985151133,2.519241377901818,2.4478026719162607,2.3155813091453905,2.1344089623214257,1.9193852656484767,1.6878205474553445,1.4580247143298108,1.2480267505513858,1.0743141342946698,,, +31.046875,62,0.9506800825070466,0.8872590163470172,0.8898175130814638,0.9593501936738812,1.0920087303495865,1.2793689281120872,1.5090172583873493,1.7654159457458038,2.03098628341594,2.287334634713177,2.5165356267087615,2.702383053452562,2.831521256953032,2.894378087949657,,, +31.0546875,62,2.8858343841959813,2.8055832766134032,2.6581542621870375,2.452600358566876,2.2018701489641117,1.9219084987722106,1.630548645205881,1.3462729087573997,-2.585464999170532,-2.2706350737995646,-1.9000362058794618,-1.5345412611416027,-1.2333547621781569,-1.0447821272703084,,, +31.0625,62,-0.9987006040024645,-1.1019046152998078,-1.337050509481407,-1.6653650587131872,-2.03269580551311,-2.377960825739755,-2.6426817341186384,-2.780115017584383,-2.762559324596264,-2.5857004240781936,-2.2693169279256264,-1.8542366837773665,-1.396017706038449,-0.9563376679679202,,, +31.0703125,62,-0.5934328668338712,-0.35307561026135037,-0.26149509786017144,-0.32134415160233865,-0.5113397319073978,-0.7896329566587166,-1.1003834439084832,-1.3825137033388886,-1.5792797436973753,-1.647166931089983,-1.562725227936276,-1.326278895440057,1.8840591877310058,1.3707256509454218,,, +31.078125,62,1.0042849368539977,0.876842856121082,1.0123234658687146,1.3599879245832098,1.808437709756234,2.216263474563674,2.4509385624195943,2.4252964073065293,2.121593065629689,1.5965585145312835,0.9660506206182534,0.37351585494657635,-0.04910119242902622,-0.21728797728359095,,, +31.0859375,62,-0.11688854464135556,0.19225834743817094,0.5929624606339865,0.94304307893157,1.1145364325976792,1.0290018238559002,0.679248010260872,0.13152326770998984,-0.49243304112733366,-1.0485601076579263,-1.4097774460484702,-1.50064894081879,-1.317910234715388,-0.9312347893837207,,, +31.09375,62,-0.6511418860219012,-0.7176866737024744,-0.7993053652930019,-0.8948224924135746,-1.0028091023037922,-1.1216076936768427,-1.2493611598679597,-1.3840452325318577,-1.5235038578361684,-1.6654868857523812,-1.807689412541536,-1.9477920875725845,-2.08350167873781,-2.21259118618343,,, +31.1015625,62,-2.3329388019878907,-2.4425650336241085,-2.5396673411833017,-2.622651681881904,-2.6901604095097436,-2.7410960403071414,-2.7746404691322195,-2.790269299438755,-2.7877610361442384,-2.767200980409096,-2.7289797581178936,-2.6737865078114336,-2.602596847330994,-2.5166558298530335,,, +31.109375,62,-2.4174561877288574,-2.3067122450489927,-2.1863299556874694,-2.0583735914278405,1.0869284359960196,0.8684875183926293,0.7039389227580947,0.6023875324387677,0.5684250716391228,0.6018157812032923,0.6975189510878721,0.8460467241825349,1.0341322061288418,1.2456612767364486,,, +31.1171875,62,1.4628031094571408,1.6672605484498026,1.84155313443292,1.970243293492579,2.0410201662140635,2.0455654814826625,1.9801410778328803,1.8458570855138974,1.6486020508648762,1.3986398583905637,1.1099015411591393,0.7990213465868812,0.48418425860715,0.18386532508662579,,, +31.125,62,-0.08445131574866349,-0.30548440027974444,-0.4672139982129052,-0.561712671645469,-0.5856913910848467,-0.5407221556079967,-0.43312180841677883,-0.27350516457207485,-0.9619325633692957,-0.5138724349972322,-0.039538452447420935,0.39926938121175826,0.7459655527961229,0.9579434333452413,,, +31.1328125,62,1.0131646619988706,0.9135474226494221,0.6846260926983299,0.3715354822426994,0.031945330981044295,-0.27295427296087427,-0.4880123262367597,-0.5727321240723174,-0.5076002692965672,-0.2971435991540623,0.03076218341973208,0.42922455019472255,0.8396321612481222,1.2007821664649827,,, +31.140625,62,1.458415167274854,1.5736726947992798,1.529159863371007,1.3316688443188616,1.0111388794403675,0.6160147125015683,0.20572626315608894,-0.15853926930266027,-0.4233357397682269,-0.5512475911775354,-0.5266796438604284,-0.35824555940316544,0.15854414417226803,0.11990151808134131,,, +31.1484375,62,-0.17299545260158888,-0.6456255115764579,-1.171851345810786,-1.6085349429916862,-1.8348338882744315,-1.7854079571460404,-1.4684341736603774,-0.9634918628853313,-0.39989608276149324,0.07858382931054286,0.3529525775282597,0.3614144952114421,0.11611134132259526,-0.3004130971910349,,, +31.15625,62,-0.7580506425511405,-1.115007418523013,-1.2568882059680797,-1.1282724672522975,-0.7481258470426375,-0.20482118139133984,0.36786849777193736,0.8272274177110277,1.0605150651934885,1.015680365732717,0.7154559886441793,0.25097160901566234,-0.24336194299390362,-0.6268127814068386,,, +31.1640625,62,-1.925029663414559,-1.7885687086263526,-1.6513056104418933,-1.515559148032437,-1.3836114828244628,-1.2576682913600006,-1.1398202425752508,-1.0320064939661573,-0.9359808457570646,-0.8532811456496312,-0.7852024797989939,-0.7327746193748407,-0.6967441175410689,-0.6775613702585553,,, +31.171875,62,-0.6753728673964451,-0.6900187697522614,-0.7210358543229947,-0.7676657761680696,-0.8288685021118182,-0.9033406809657685,-0.9895386285206179,-1.0857055247412706,-1.1899023468458483,-1.3000419965339747,-1.4139260236877804,-1.52928330342044,-1.643809989124639,-1.7552100418385403,,, +31.1796875,62,-1.8612356261539762,-1.9597266652158147,-2.048648862102776,-2.1261295217129854,-0.07603862714356491,0.14255364655017239,0.36416171198217395,0.5705581998501635,0.7446746146015297,0.8717965569712861,0.9405945127244161,0.9439183169533449,0.8792998835994944,0.7491291341506475,,, +31.1875,62,0.5604908490466085,0.3246738109865425,0.05638646221540852,-0.22726623566208032,-0.5079733978875071,-0.7674932493166712,-0.9889236854311012,-1.157879764307929,-1.263496021441846,-1.2991837141384384,-1.263090190928731,-1.1582283523764172,-0.9922671744098388,-0.7769978996650624,,, +31.1953125,62,-0.5275131182192656,-0.2611559793967596,0.0036871949656565595,0.24886670609699957,0.45773244450121675,0.6162919629028343,0.714182907351392,0.7453920040106164,-0.07738318637090069,0.26658730883573545,0.6141925562024995,0.9051182331133005,1.0876537530814012,1.1267980576203533,,, +31.203125,62,1.0097637107953583,0.7480217194133882,0.37556829880535925,-0.05631674561863718,-0.48700390170515484,-0.8559046436119904,-1.1118565708197323,-1.2210414899678335,-1.1722034325177204,-0.9783541431317606,-0.674700659973994,-0.3131180271539828,0.045971717877680396,0.34304916548127284,,, +31.2109375,62,0.5288037229660578,0.571846686328138,0.46362966158718066,0.21980210105523706,-0.12220363574351067,-0.5089836854071789,-0.8794655007263846,-1.1744089690095185,-1.3456260486092733,-1.3634829653738274,-1.221516490173391,-0.9374452947748625,-0.3515052470041421,0.12784424561590715,,, +31.21875,62,0.6118022039276028,0.9603827152386858,1.068564135799385,0.8951199617598973,0.47398698491360736,-0.09494552913024794,-0.6731020195842161,-1.1210703034739669,-1.3366624431659142,-1.2827567965527376,-0.9972920670130154,-0.5826759155537823,-0.17751267735887266,0.08159935937519402,,, +31.2265625,62,0.09772892379680731,-0.15959280642225615,-0.645788241967884,-1.253215638162596,-1.8404357580107313,-2.270743991776425,-2.4494095788676047,-2.349417882012515,-2.0186625723583282,-1.566618528240353,-1.134149874211348,-0.8547296248698362,-0.8177010892429373,-1.0436514610914918,,, +31.234375,62,-2.1904905457999417,-2.2402780232998114,-2.2742878976983114,-2.2915872618883233,-2.2915309075167034,-2.27377283891939,-2.238272549910298,-2.1852959533887155,-2.1154109473616747,-2.0294776948885604,-1.9286337880161946,-1.814274555350591,-1.688028857949198,-1.5517307972103076,,, +31.2421875,62,-1.4073878300218539,-1.2571458493372005,-1.1032518414789276,-0.9480147739093793,-0.7937653981794527,-0.642815671773384,-0.49741850923380426,-0.35972856718574586,-0.2317647497807922,-0.11537509094753795,-0.012204628227729164,0.07633316941123336,0.14908091962480674,0.20515736142373087,,, +31.25,62,0.24397255591920985,0.2652379870478949,0.2689713855469533,0.25549619184209227,0.7086704733658041,0.6076169133486227,0.45042188200680333,0.24929200174655491,0.01959375578634906,-0.22122330519686395,-0.45484884525968555,-0.6633942672951112,-0.8306460307908788,-0.9432023511274412,,, +31.2578125,62,-0.9914140000566668,-0.9700635872376109,-0.8787359388727277,-0.7218537299481049,-0.5083758691946927,-0.2511796529611525,0.03383024424449091,0.3288238264128057,0.6152820469330254,0.8752811016798709,1.092735203569791,1.2545111931143105,1.3513372767609235,1.3784425408967276,,, +31.265625,62,1.3358826631508345,1.228529124969084,1.06572269438014,0.8606153591838053,0.6292466158619923,0.38941854346948235,0.15944812278932358,-0.04311617924637523,-0.55041884782589,-0.11493231471108485,0.30764480831868735,0.6586069423700364,0.8910320206691258,0.9770621212107786,,, +31.2734375,62,0.9122112756424777,0.7160296440920778,0.4290207783440969,0.10629231371320427,-0.19107076871987194,-0.4055664314559735,-0.4922801244564447,-0.42593083440591684,-0.20486092504480768,0.1486519348168892,0.5918096131447571,1.0679035268228456,1.5150905654208744,1.8759683197516135,,, +31.28125,62,2.106458515031692,2.182615300163304,2.1042982588085684,1.895138341940474,1.5988023150832698,1.2721378342215295,0.9762671164617369,0.7670166807170335,0.686174035034226,0.7549333752321916,0.97055139751658,1.3067343224627075,-2.4919548113848093,-2.79550504851649,,, +31.2890625,62,-2.8337916013080546,-2.5910024502037174,-2.125635314402162,-1.5544975954715823,-1.0207479962717556,-0.6547381949682052,-0.5383860409204112,-0.6828436593706886,-1.0255799283810303,-1.4476757162996783,-1.8065903896945112,-1.9754177362519183,-1.8778707526960972,-1.509405212606529,,, +31.296875,62,-0.9386907648293299,-0.28902437419648486,0.2952219544004786,0.6879256273133912,0.8155346015040368,0.6769809963818394,0.34373162748811226,-0.0600362409227036,-0.3916985919239735,-0.5294951134542937,-0.40611064788068707,-0.02732211462945422,0.5294013890886514,1.1359632380451803,,, +31.3046875,62,0.22543566738701715,0.17970175769100172,0.11947890217390167,0.04620307446475569,-0.038463579728367336,-0.13266206295538474,-0.23436929105467208,-0.3414337290334779,-0.4516132736960697,-0.5626147195793567,-0.6721341170224758,-0.7778973155964441,-0.8776999828567713,-0.9694463975817683,,, +31.3125,62,-1.05118633811917,-1.12114941981081,-1.1777762801500353,-1.2197460655078358,-1.24599973803496,-1.2557587945359412,-1.2485390694450489,-1.2241593801215878,-1.1827448629865422,-1.1247249419932692,-1.0508259649124185,-0.9620586362819543,-0.8597004669831564,-0.7452735476668922,,, +31.3203125,62,-0.6205180351352895,-0.48736181585052,-0.34788687769010757,-0.2042929786981797,-0.20272404834584834,-0.30691342382436704,-0.34718503155589475,-0.3196003514765914,-0.22506130851247874,-0.06925217079571389,0.13775230501948188,0.3821851672728677,0.6475433179822572,0.9157346582892157,,, +31.328125,62,1.1683363457731084,1.3878764298762976,1.5590495006989151,1.6697815871488664,1.7120700519881469,1.6825399207152638,1.5826778544136864,1.4187274547931294,1.2012532052304536,0.9444034578552749,0.6649238623931178,0.3809900341161151,0.11094086247825347,-0.12799921018871496,,, +31.3359375,62,-0.32091984221552705,-0.4562627253903414,-0.5266254221672604,-0.5292750574594155,-0.46633604876244616,-0.344638789474227,-0.1752398438709485,0.02735288052276802,1.7176960575911144,2.14525561121971,2.5278684744476325,2.8101854451659025,2.9516501978997454,2.932796604915155,,, +31.34375,62,2.758265070320122,2.4560681499204655,2.073219902608952,1.6684097662938928,1.3028620612011823,1.0308048004086814,0.8910323188261701,0.9008758428038646,1.0535210523937493,1.3190903560445317,1.6493212037352223,1.9851116430867493,2.2657577160160938,2.438443762221363,,, +31.3515625,62,2.4665072870306783,2.335190902775717,2.053985239070216,1.6551976776561061,1.1889696020781662,0.7155180030747783,0.29580959120323014,-0.01788029576526684,-0.19005376725511935,-0.2074622702702681,-0.08111230790644874,0.15550712388163496,1.9678428465613678,1.7207756803456564,,, +31.359375,62,1.2869747755949528,0.7961993846341153,0.39134189845452116,0.1892639455831454,0.24878925514332073,0.5546251913119187,1.0216190911488272,1.5181821787487777,1.902460377975912,2.0613376187968853,1.9415807556730598,1.5645888013660705,1.0207025942238872,0.4446327529245497,,, +31.3671875,62,-0.021261436750133145,-0.2657799668328472,-0.23914279497434165,0.033588200259642265,0.459602433213871,0.9040028106935023,1.2270015241267829,1.3224530416025317,1.1471614524685254,0.7329278415487921,0.17803388030613773,-0.37950617319950675,-0.7995960353000077,-0.9782933006195582,,, +31.375,62,-0.0588592489252399,0.08609560236272226,0.22825377740292402,0.36533886964770146,0.49515562373900623,0.6156282796003263,0.7248368292981259,0.821050551868365,0.9027582389575382,0.96869458207873,1.0178622594793396,1.0495493359200547,1.06334167073023,1.0591301169058474,,, +31.3828125,62,1.0371123852234696,0.9977895407535485,0.9419571931413162,0.8706915349299105,0.7853304724125832,0.6874501794193044,0.5788374845915905,0.4614585756475423,0.33742456862361914,0.20895454497901425,0.0783367037684422,-0.052111690894770135,-0.18008486578032512,-0.30332888777112005,,, +31.390625,62,-0.4196810998800359,-0.5271079535597685,-0.623740574881262,-0.7079074418480836,0.24619594381332047,0.46309632326808564,0.6598847918910392,0.8196879190326762,0.9281099814921018,0.9742423551286025,0.9514299867482077,0.8577414850111256,0.6961100361407295,0.4741353041378929,,, +31.3984375,62,0.20356011533502621,-0.10054159500095725,-0.420808962120017,-0.7387976988815701,-1.0362590220243508,-1.296404830221063,-1.5050709255200598,-1.651697179769152,-1.7300563128184616,-1.738680479567742,-1.680955935782299,-1.5648791986120767,-1.4024917228302818,-1.2090325319475004,,, +31.40625,62,-1.0018679111919733,-0.7992728154807439,-0.6191489857578825,-0.4777691804440153,-0.38863510747596364,-0.3615287134425008,-0.40182300268142557,-0.5101004610232331,0.45169900180324685,0.7475128234471955,0.9831399825616047,1.1082863020121945,1.0900616168441524,0.9181572826969453,,, +31.4140625,62,0.6065049117520701,0.19115771412558907,-0.27527581848305127,-0.7317791481309672,-1.118387102081606,-1.3854843256560885,-1.5014946971648668,-1.4577642260859909,-1.2698770686682281,-0.9751998383641339,-0.6270368330436892,-0.2863066495001346,-0.012036693028535494,0.14784381117432932,,, +31.421875,62,0.16397821181694094,0.030160019183901432,-0.2356993109043931,-0.5943631273688943,-0.9913878549020626,-1.3656137839773599,-1.6587058252024893,-1.8242581155777717,-1.835044276921049,-1.6872839319145458,-1.401260798363447,-1.0181959254268353,-0.03758530472197046,0.45930259140901997,,, +31.4296875,62,0.8237546469080224,0.9561651514592836,0.8226429018980314,0.4643013565424807,-0.014029878690333092,-0.4725782260998964,-0.7749997405829212,-0.8258320654788575,-0.5967632393338085,-0.13451590235165217,0.4518150630433482,1.0205023970150937,1.4358544992135527,1.6052155057234143,,, +31.4375,62,1.5041585421581947,1.1829692992491012,0.7526449353916037,0.3542476235840478,0.12001411275347451,0.13688214325621306,0.42243219020324596,0.9198403406578266,1.51322771069493,2.059201690307855,2.425946552018579,2.5291518280572953,2.354933438479533,1.9634673366335693,,, +31.4453125,62,-0.7781636006997155,-0.8333159096573829,-0.8724438681371094,-0.8949156667470917,-0.9003991770789562,-0.8888676889071278,-0.8606002943875537,-0.816176912579248,-0.7564680414639584,-0.68261941696324,-0.5960318476309906,-0.49833657818321364,-0.391366613307705,-0.2771245039459074,,, +31.453125,62,-0.15774716017763546,-0.03546830690472664,0.08742076018279123,0.20861143112758335,0.3258183457336626,0.4368195547466099,0.5394955748804278,0.6318666537425403,0.7121275920678984,0.7786795134248271,0.8301580250127706,0.8654572763601351,0.8837494945501164,0.8844996538165893,,, +31.4609375,62,0.8674750225361734,0.8327494203437561,0.7807021107200067,0.712011348330256,-0.682105708279726,-0.9090356963596951,-1.1781472313494277,-1.4736394694371817,-1.777749861275916,-2.071987134431055,-2.338415346896928,-2.5608994827678186,-2.7262257423071956,-2.8250184160009395,,, +31.46875,62,-2.852389416364239,-2.80827518321499,-2.6974374778692,-2.5291280190793644,-2.316440354182569,-2.0753941682409045,-1.8238158911498465,-1.5800936666621448,-1.361893507647502,-1.1849261676891722,-1.06185072169162,-1.0013913142079958,-1.0077286684844404,-1.0802087884732234,,, +31.4765625,62,-1.2133891663480678,-1.3974192719042136,-1.6187287888495492,-1.8609756020230042,-2.1061874254877067,-2.3360174574574173,-2.533026495770732,-2.681902101648773,-0.5938629001049396,-0.18993929162181877,0.13555882063690494,0.3372695891601627,0.38950498220593277,0.29020412248949723,,, +31.484375,62,0.0612048875343707,-0.25520826267389035,-0.6029422605544102,-0.9208850268560568,-1.1524773754216142,-1.2545760630848446,-1.2042272274577643,-1.002294923661387,-0.673379307658099,-0.2620369241168867,0.17410847186934966,0.5732918080092472,0.879179315081935,1.049597146292502,,, +31.4921875,62,1.0630567149455352,0.922060630857944,0.6526745417349722,0.3004317767470652,-0.07679114023477351,-0.4178182533305639,-0.6677284386470493,-0.7864318995254442,-0.7549329342842569,-0.5783034122768449,-0.2849037384106154,0.07802741995545043,0.7474823883962008,0.7212137502590008,,, +31.5,63,0.9531760541463629,1.3777653918301032,1.8739271329234093,2.2983210872183544,2.524617280626832,2.4781525257389534,2.156449226837266,1.6299723904411052,1.0229167251238602,0.4792886713195502,0.12357823155422787,0.026798065726543085,0.1871961416398642,0.5309264943754888,,, +31.5078125,63,0.93249258792213,1.249358569482811,1.3612406029468143,1.203307706542115,0.784190667845601,0.18386120442851825,-0.46803953548195704,-1.027485804398872,-1.3752970809132279,-1.4495633220113335,-1.2623809604821017,-0.8963148559229263,-0.4815578332270564,-0.1600495541775071,,, +31.515625,63,0.6276426939879611,0.5288323017319001,0.41706547054356885,0.29405083614351446,0.16169065465085453,0.022047698311848496,-0.12269065716754773,-0.27025052498099916,-0.41831111240471225,-0.5645451454403572,-0.7066594052188865,-0.8424346664981769,-0.9697643390646553,-1.0866911355614286,,, +31.5234375,63,-1.1914411238182248,-1.2824545675657768,-1.3584130156436045,-1.4182621655052037,-1.461230100815103,-1.486840583931844,-1.4949211706610748,-1.4856060053235611,-1.4593332473317955,-1.4168371744686221,-1.3591351012777415,-1.2875093417537888,-1.2034845323025292,-1.1088007121782266,,, +31.53125,63,-1.0053826328894613,-0.8953058341050841,-0.7807600801926922,-0.6640107977537812,-2.770529788561011,-2.7908415309987022,-2.7393824154325705,-2.6175559098516095,-2.4315306385351168,-2.1918151523576634,-1.912530336004522,-1.610430177597751,-1.3037391731235242,-1.0108874241412487,,, +31.5390625,63,-0.7492316208693622,-0.5338510865233989,-0.3765028240383277,-0.2848084181344964,-0.26172947727748586,-0.30536817890790546,-0.40910681051031683,-0.5620765595358379,-0.7499228453782584,-0.9558138075469986,-1.1616216079810269,-1.3491941543977446,-1.501628546143095,-1.6044574238335865,,, +31.546875,63,-1.6466654775375347,-1.6214652118790547,-1.5267778542536432,-1.3653858537707775,-1.144746319690165,-0.8764783920664927,-0.5755602752704231,-0.25929191144198305,0.45172776480141535,0.7750648586920628,0.9940627734717578,1.07031805204966,0.98699411341431,0.7514603804432135,,, +31.5546875,63,0.394164991801057,-0.036083421691973476,-0.4796901281623464,-0.8755252409787855,-1.1704104937732134,-1.3273644034887149,-1.3313217848423684,-1.1914369780613847,-0.9396122708341863,-0.6254809545101293,-0.30862667605161165,-0.04925121941799204,0.10125547513663546,0.10837401047007811,,, +31.5625,63,-0.040112515118568504,-0.3321596438407337,-0.7332811757321867,-1.1918641441928781,-1.6471516068249317,-2.038650181473914,-2.3154973434085906,-2.4443297631661425,-2.4144274299730406,-2.2393326096516635,-1.9546917407408197,-1.6126566602742294,-0.5910265202196616,-1.142681015503765,,, +31.5703125,63,-1.7178856393375677,-2.174405664257801,-2.4000264221965693,-2.3432605244748763,-2.02743412993924,-1.54429178026434,-1.0288724591691014,-0.6225423201830845,-0.43431522431871905,-0.5110612885903251,-0.8247675152706215,-1.2803409224199762,-1.7418143371712143,-2.0697712312832457,,, +31.578125,63,-2.1597310241652097,-1.9709729061736065,-1.5378966281156081,-0.9608046916188399,-0.3786302644314718,0.06891678879791141,0.279413242019132,0.2155653399276758,-0.08479759993113961,-0.519315613823454,-0.9493713635004986,-1.238293329909028,-1.2890165812332235,-1.0708775174626557,,, +31.5859375,63,-0.5473591895119659,-0.43310172308641626,-0.3234897041389289,-0.22068964188522522,-0.12674510110558124,-0.043540708749010504,0.027231054501656415,0.08409969609361223,0.1258426642515622,0.15150695684934679,0.16042600801605011,0.15223155667283306,0.12686028906140945,0.08455513883965049,,, +31.59375,63,0.02586122186089057,-0.048383523294354136,-0.13706282526420732,-0.23880144671948522,-0.35198908904562554,-0.4748084164281428,-0.6052667087467797,-0.741230589142874,-0.880463218277982,-1.0206633041197073,-1.1595052442870803,-1.2946796981610031,-1.4239338784380235,-1.545110856708522,,, +31.6015625,63,-1.656187194915105,-1.7553082438453806,-1.8408204906683956,-1.9113003891912728,0.053904386105306845,0.34576171961955626,0.599435725010116,0.8006726761187359,0.9387971340587852,1.0074502837613313,1.005027484733029,0.9347845372508795,0.8046052661783953,0.6264466413977272,,, +31.609375,63,0.4155001396309298,0.1891278391624281,-0.03435255308185958,-0.2369490089412204,-0.4022534627183697,-0.5165893192417731,-0.5699681598470068,-0.5567889258220317,-0.4762308175237484,-0.33231250632358167,-0.13361352642176116,0.1073227283573403,0.3748627741483964,0.6513726437658863,,, +31.6171875,63,0.9184473494654448,1.15819446722594,1.3544823331413678,1.494065809380362,1.5675111138421498,1.5698552187209662,1.5009538317559556,1.3654936892583465,-1.273717442196765,-0.9972391591347332,-0.8321767355002245,-0.8094143067568815,-0.9369224586391149,-1.1984878038501474,,, +31.625,63,-1.5562129259041346,-1.9563974469162746,-2.3378843292699694,-2.641571528266102,-2.8196075832384695,-2.842838942242545,-2.705349096378522,-2.425382544687944,-2.0425096711876973,-1.6114740922210424,-1.1936807341380018,-0.8476503492342372,-0.619927140260175,-0.5378555698623986,,, +31.6328125,63,-0.6053512765489295,-0.8023246522688846,-1.0878466974553278,-1.4065638729046732,-1.6973626033159244,-1.9029336771816063,-1.9787466100230846,-1.900035926547067,-1.6657109597389974,-1.2985799331079861,-0.8418531531627718,-0.35246967986822675,0.46775727093744357,0.8437031354384703,,, +31.640625,63,0.9652975710743499,0.8060620777071614,0.41446574945265907,-0.09940941510281898,-0.5940676597667441,-0.9353861232151339,-1.0333586750316646,-0.8667266953700861,-0.4887465896917899,-0.01251388768988293,0.4201330999396127,0.6776065520260853,0.6747713268809503,0.3964328434168496,,, +31.6484375,63,-0.0983281242824437,-0.6921633769105013,-1.2414223837929255,-1.615315715934405,-1.7315452433205791,-1.5786379558771928,-1.2188644668865904,-0.770944455831735,-0.3772811235262591,-0.1647068684977051,-0.20950075585350847,-0.5162675427520335,-1.0164689314464184,-1.5870115597523475,,, +31.65625,63,-1.965579168093393,-2.0027631828255457,-2.0222494548812913,-2.023736126418627,-2.0072276472370323,-1.9730346033498847,-1.9217681902127,-1.854329427438215,-1.7718933039021145,-1.6758881309066849,-1.5679704649801365,-1.4499960394504736,-1.3239872138268636,-1.1920975109853513,,, +31.6640625,63,-1.0565738631438375,-0.9197172277365981,-0.7838422628221176,-0.6512367681385858,-0.5241216020124169,-0.40461177599008236,-0.2946794084468285,-0.19611918585719124,-0.1105169365149461,-0.03922186697918295,0.016677052612470877,0.05637014086838932,0.07934116150737602,0.08537633588881188,,, +31.671875,63,0.07456805391065358,0.0473132183095234,0.0043062513716585205,-0.05347311347581063,1.1726682978342748,0.9355397297370569,0.6701309685096735,0.39431209042345416,0.12655794298011436,-0.11533605801970426,-0.31549047151538057,-0.46104449710729134,-0.54304788295368,-0.5570798921575782,,, +31.6796875,63,-0.503552177808764,-0.38767445944193485,-0.21908540810971866,-0.011174493818112363,0.21985790031381647,0.45613654088141287,0.6793643473338622,0.8721049437545186,1.0190053068050124,1.1078732343713866,1.1305344830184674,1.0834097865890189,0.9677715016797276,0.7896619662662865,,, +31.6875,63,0.5594792474836761,0.291259148551689,0.0017035256453837994,-0.29097734382195906,-0.5683276331695936,-0.8129260314810671,-1.0095937554009526,-1.1464462857207103,0.10771340325707046,0.48149709097813365,0.7251906941064765,0.8153580360094439,0.752409146247728,0.5604783188099998,,, +31.6953125,63,0.28360781773289767,-0.021168076585109802,-0.29276120475576717,-0.47559741531693717,-0.528323689071192,-0.4302980670572978,-0.18485129981529913,0.18118803032122244,0.6216311645828687,1.0780853395940035,1.4890140486732433,1.79929037668776,1.9687555760213193,1.9784499715233856,,, +31.703125,63,1.8335458101854099,1.5625253409233746,1.212732214827708,0.8429891500075081,0.514431729084137,0.28098602301821873,0.1809731898608331,0.23114864371374944,0.4241041711943899,0.729437555392946,1.0985074379989717,1.472032710901207,-2.4056401308879023,-2.1569595690732073,,, +31.7109375,63,-1.7070089871981105,-1.1805429181048668,-0.7208054302424337,-0.45021462288500647,-0.4367769950140089,-0.6754369031635434,-1.0894728577737904,-1.5515579628771767,-1.918712244425219,-2.0715670568244957,-1.947179743720362,-1.5564042142464385,-0.981055666882431,-0.35164533091459094,,, +31.71875,63,0.1882138984768983,0.5209771039366097,0.5871787068552924,0.4015139816789324,0.04858516357365619,-0.3405199924872403,-0.6243960181323955,-0.6903192679500443,-0.4853884212862106,-0.03126909349357199,0.5815006748037297,1.2180855090429257,1.7360751880407856,2.0242920439484586,,, +31.7265625,63,-0.12477704140101176,-0.20811150586379445,-0.30176251460832393,-0.40382619269855297,-0.5122421958164394,-0.6248298687142646,-0.7393265156487685,-0.8534271126420747,-0.9648247661549444,-1.0712512097025255,-1.1705166292581108,-1.260548120050249,-1.3394261013193267,-1.4054180513444197,,, +31.734375,63,-1.457008971985255,-1.492928049232125,-1.5121710428704889,-1.51401801314542,-1.4980460739535268,-1.4641369491796719,-1.41247919978239,-1.3435650825489498,-1.2581820954353455,-1.1573993574437096,-1.0425490614313477,-0.9152033245184367,-0.7771468413458432,-0.6303458189223409,,, +31.7421875,63,-0.4769137369137807,-0.3190745328004555,-0.15912385642754479,0.0006109277294491511,-1.2157155040811591,-1.2142849155832145,-1.1439006502060756,-1.0110435445606751,-0.8264712390521345,-0.6044622359850513,-0.3618146468950717,-0.11666946319436208,0.11275957973328571,0.30946096190444083,,, +31.75,63,0.45881624267918353,0.5496237752500237,0.5748838741426439,0.5322906734844353,0.4243963678787175,0.25843637421056787,0.045827598505787104,-0.19862521187925733,-0.45775969354837664,-0.7132508345984487,-0.9468873603467264,-1.1418405348692626,-1.2838369040287376,-1.3621532033060277,,, +31.7578125,63,-1.3703640539644162,-1.30679030908028,-1.1746167847971676,-0.9816711661426933,-0.7398795033045613,-0.46443626580146236,-0.1727468259643778,0.11678388844380871,1.789352659019475,1.997905387092999,2.061448046619748,1.965738333818074,1.7207921341243009,1.359365457356374,,, +31.765625,63,0.9318968807482729,0.49869799932563513,0.12060800934624316,-0.15043223980370224,-0.2794188550212183,-0.25368439227461514,-0.08481751661307713,0.19319588040021857,0.5293202852174853,0.8634736802921948,1.1359393573767638,1.296720198190581,1.3133781591453773,1.1761376391964045,,, +31.7734375,63,0.8994575810116094,0.519827176926692,0.09012825389138654,-0.3285578199578748,-0.6764228233332716,-0.9042087639421542,-0.9808446066914984,-0.8982533782593815,-0.6725810908644558,-0.34165623128376027,0.04092434752076021,0.41416185809128303,1.3808858942811393,0.9481777448703348,,, +31.78125,63,0.6295686295114479,0.5315912592785075,0.6978774254364724,1.097108363637921,1.631528547462065,2.163690103158745,2.554098367611397,2.699441228440989,2.560924679606382,2.174948407479642,1.6431950846353551,1.1048489325066209,0.6985567503266812,0.5245557032307565,,, +31.7890625,63,0.6173462817361677,0.9363985642822956,1.3774373746912367,1.801211730615197,2.071861936805412,2.094367144539391,1.840808126703004,1.358245361709228,0.756051160637776,0.17616557075698946,-0.24557414242084374,-0.41643415961476105,-0.3119762720520798,0.01746079381125243,,, +31.796875,63,0.15781129033737995,0.31020792909792066,0.455620295620311,0.5919945652705774,0.71743938526587,0.8302587751859873,0.9289816039325047,1.0123871271215614,1.0795261378712624,1.1297373607603138,1.1626588020254944,1.1782338573840803,1.1767120706607281,1.1586445300646862,,, +31.8046875,63,1.1248739828584902,1.0765198416385648,1.0149583449038078,0.9417982194254073,0.858852270706552,0.768105399114051,0.6716796018491384,0.5717965737139536,0.4707385616569073,0.3708081586752169,0.2742877412144507,0.18339926044726362,0.10026509162818831,0.02687062717525579,,, +31.8125,63,-0.03497073138407436,-0.08364956948060309,-0.11778888320122627,-0.13626843277844092,0.38603210633090534,0.6184159877101091,0.8000485491964693,0.9207023506755491,0.9745186805065897,0.9604117942690693,0.8821400276548998,0.7480388347120137,0.5704343783260959,0.3647785765698153,,, +31.8203125,63,0.1485659329173456,-0.059892304170582444,-0.24275115739361786,-0.38388262998984923,-0.47000687822767634,-0.49162495211986995,-0.4436880463095204,-0.3259565766930508,-0.14302402740356557,0.09599611089737625,0.3780984970478705,0.6872854030672675,1.005674779900243,1.3147396732998589,,, +31.828125,63,1.5965925785978652,1.8352251894673768,2.0176171063381894,2.134636208011165,2.181667917952723,2.158929501725953,2.071447495674086,1.928699857759905,0.7191711164692963,0.9083630101630852,0.9528636174783099,0.8470143711666447,0.6092523229954007,0.27923340519477086,,, +31.8359375,63,-0.08835322121983825,-0.4323162397114042,-0.694509849064043,-0.8289108471066076,-0.8088112190580767,-0.6310058230557157,-0.3163227760979126,0.09358623060485155,0.5426959393533932,0.9692934280098189,1.315547240571724,1.5364695270459607,1.606875528369145,1.5252566779484042,,, +31.84375,63,1.3139643222834594,1.0156757127800922,0.6866929844115517,0.38811912219950384,0.17628559156660517,0.09392286933899852,0.1634494032144418,0.3834245715009744,0.7287184039659734,1.1543719168089972,1.6025470779343636,2.011484186841658,1.132801118083374,1.1418410307544535,,, +31.8515625,63,0.8858992022413231,0.42140443017050094,-0.1362118300847574,-0.6440538291389292,-0.9708476048322616,-1.0328631554188226,-0.8168280117639878,-0.3835525786043056,0.14872626672397424,0.636718420322488,0.9512984357917389,1.0128201329959767,0.8128499872017954,0.4163637504753908,,, +31.859375,63,-0.0561946180900004,-0.4620733272976182,-0.6755027322095943,-0.6223451263408194,-0.3006061609330233,0.2188155087569657,0.8113477413372132,1.3326681160215497,1.6580355764459367,1.71625301354878,1.5089548122893126,1.1099353783528576,0.6447048137461941,0.25587701984134925,,, +31.8671875,63,-0.13824459931587674,-0.12316539691916517,-0.09078037723878729,-0.041145252863477144,0.025378841525382834,0.10813143743127651,0.20616406377949437,0.3182566228335739,0.44293852418051427,0.5785142068553377,0.7230926028447859,0.8746200261892179,1.0309159119216866,1.189710779182622,,, +31.875,63,1.3486857538948331,1.5055129590862617,1.657896065741943,1.80361029426096,1.9405411662121685,2.0667213279566443,2.180364801475588,2.279898062778785,2.3639874038223705,2.4315620989365767,2.4818329702228787,2.5143060269457362,2.5287909401915885,2.5254042045026965,,, +31.8828125,63,2.504566931219605,2.466997312265895,2.4136978864209864,2.345937831137868,1.7439478112463624,1.533303990394317,1.314601885576604,1.1061454409212392,0.9254260146230628,0.7878961875527621,0.7058859412065257,0.6877367977045284,0.7372143148874695,0.8532399184696855,,, +31.890625,63,1.0299607842667204,1.2571529096516125,1.5209292784421984,1.8047037476695,2.0903434517110004,2.3594293727062476,2.594537182671748,2.780449048416213,2.9052119038005246,2.960968399441188,2.9445025911253992,2.857462319577568,2.70624277877019,2.5015393955543876,,, +31.8984375,63,2.2576012025537535,1.9912367709783674,1.7206420239895661,1.4641316712406978,1.2388627251874265,1.059639111110764,0.9378807270188597,0.8808288411880592,2.3250717808805934,2.5015387668501936,2.519915185082972,2.383255549115194,2.1181229375215773,1.7704144083291393,,, +31.90625,63,1.3981781499642598,1.0625413196636813,0.818161773947303,0.7046910342989816,0.7405783075969388,0.9201807300382026,1.2146300218317116,1.5763206389365032,1.9463204202776363,2.263549513910184,2.4742979257639517,2.540599271308648,2.44615644176469,2.1988961778790586,,, +31.9140625,63,1.8297545890131341,1.3878826852225445,0.93301857203358,0.5262142457201754,0.22036118795797321,0.05199027912802412,0.03562305083308592,0.16155389775746143,0.39740846417786974,0.6932352475933421,0.9893371322265818,1.2256227953098378,0.45712696666747,0.9543853067051971,,, +31.921875,63,1.4962873042984324,1.9392771997425338,2.16470459838464,2.1112441542662577,1.7916246871300703,1.2890835981772266,0.7345189410544409,0.27060149615956286,0.01268286226333526,0.01721348720102267,0.2663261025351388,0.6728093689334957,1.1041079917533407,1.4187707850296973,,, +31.9296875,63,1.5053563634199492,1.3131323991592636,0.8661533488994233,0.25685686047126777,-0.37906775885600885,-0.8996529936558735,-1.195337069612635,-1.2187582778497026,-0.9974960073292116,-0.6262686714389692,-0.2407290017563644,0.019959190342903388,0.051504022252411574,-0.18669346574698875,,, +31.9375,63,2.265230590059868,2.173307228057691,2.0720859804247573,1.9636385294920249,1.8501535992375282,1.733898505417076,1.6171793345376326,1.5023004490112333,1.391524027605221,1.2870303497013775,1.1908795188392816,1.1049752958152177,1.0310316746747712,0.9705427868919004,,, +31.9453125,63,0.92475666076244,0.8946532955235907,0.8809274341592168,0.8839763365766641,0.9038927672758373,0.9404633203285286,0.9931721110229108,1.0612097695573515,1.143487579322414,1.2386565122304243,1.3451308277968215,1.461115822765577,1.584639245393852,1.7135858243316813,,, +31.953125,63,1.8457343075064234,1.9787963624549876,2.110456656957233,2.2384134181543023,0.8910432336967656,0.966226143272104,1.0993852907952675,1.2793246051432328,1.4914284245445448,1.7186844808959263,1.9428743226631928,2.145848155227899,2.3107951901851136,2.4234209075644566,,, +31.9609375,63,2.4729491255763345,2.452878988585818,2.3614440737427222,2.2017415883576796,1.981522635178659,1.7126581570392463,1.4103177877748363,1.0919188558319417,0.7759188145523872,0.4805352911163858,0.22248299316349518,0.015815536273112052,-0.12904706123091025,-0.2060374170977397,,, +31.96875,63,-0.21385623371815776,-0.156055203041637,-0.04078160386111185,0.11979758116921141,0.3103518533072825,0.5134639682611962,0.7108521855930603,0.8846527484835898,1.3510211909742662,1.3314924831863948,1.155387402527466,0.8353199927440319,0.4062617666841575,-0.07984617617800224,,, +31.9765625,63,-0.562124173823156,-0.9801775871296166,-1.2834454658543872,-1.4390184801516648,-1.436708717852449,-1.290581977834343,-1.0367141670490478,-0.727521515430919,-0.42354795846149373,-0.1839890849214979,-0.05742882114582204,-0.07423187406319154,-0.24177704702227332,-0.5432740452484124,,, +31.984375,63,-0.9403482232540943,-1.3789908317152904,-1.7979481083474702,-2.13824267511158,-2.352344321458963,-2.4115618429793395,-2.3105046640246774,-2.0679193485867895,-1.7237707128417266,-1.3330221548187713,-0.9570839099270517,-0.654261153198629,-1.8733408211358031,-2.3346276937937556,,, +31.9921875,63,-2.550349881418855,-2.4835143853340433,-2.172311281253138,-1.719515255550168,-1.2642064610223827,-0.9435621260059665,-0.8551914680008613,-1.0303373613444062,-1.4252897538121192,-1.9333643263842044,-2.41416336608824,-2.7320990780084307,-2.793620800285228,-2.57294260581289,,, +32.0,64,-2.119219277826722,-1.5432029030061556,-0.9870358946941882,-0.585457890573707,-0.4290570145992293,-0.5396355544634054,-0.8644397840240631,-1.2908334566548751,-1.6773914089631043,-1.8928893834113771,-1.8525020093806561,-1.541286009312306,-1.018510421809581,-0.4016448983039418,,, +32.0078125,64,2.36041875994478,2.474318072522021,2.5780877843183365,2.669870835127015,2.74800923924619,2.811073168432175,2.857886045396862,2.8875452084233597,2.899437785227854,2.8932514980764035,2.8689802109142075,2.8269241213323006,2.767684593958475,2.692153725687162,,, +32.015625,64,2.6014988254030333,2.49714207990107,2.3807357619861262,2.254133414794304,2.119357516828667,1.9785641938200584,1.8340055952383896,1.6879905941563345,1.5428444985351415,1.4008684793025314,1.2642994255489821,1.1352709296945207,1.0157760856773108,0.9076327514796998,,, +32.0234375,64,0.8124518841470728,0.7316095016547839,0.6662227624735066,0.6171305815741791,1.0186731454082718,1.0995287429559948,1.1175835120935664,1.0676292316375533,0.9492557897891998,0.7668867456220965,0.5294776552656312,0.24989818440261852,-0.05595892027980742,-0.37027988059840067,,, +32.03125,64,-0.6745661215807917,-0.9509184979484668,-1.1832799717524551,-1.3585500972995224,-1.4674936081748031,-1.5053797584366015,-1.4723078447720837,-1.3731962193016685,-1.2174355678852147,-1.0182306398789327,-0.7916763398313543,-0.5556326146031452,-0.3284765992769973,-0.1278190435537052,,, +32.0390625,64,0.030725469636394442,0.13462875347468717,0.1753236669691729,0.1488021913109836,0.0558952263236302,-0.09778540405548297,-0.30223869224861044,-0.5437726144735386,-0.4706896276928768,-0.4331705237439123,-0.545020495842154,-0.7855830614466849,-1.1134773283085901,-1.473077870902994,,, +32.046875,64,-1.8032162915915206,-2.046748947519725,-2.1595004000361966,-2.1171893645680875,-1.9192581631099488,-1.5890089664247808,-1.170025340627623,-0.7194361881352976,-0.29907098009644895,0.034116385361785406,0.23686385299956436,0.2862847186267218,0.183377675324904,-0.04718301995650076,,, +32.0546875,64,-0.3609442885935118,-0.7006506588295823,-1.0052134861387618,-1.2192756899139807,-1.3018819842822367,-1.2329039145245266,-1.0162187222617372,-0.6791466830552148,-0.26823433605506647,0.15795981356660233,0.5379536424761151,0.8168884206279556,0.6767455902826356,0.5270961716812494,,, +32.0625,64,0.166009833802507,-0.287524858205619,-0.6907831267177994,-0.9165617387558519,-0.8881642192660875,-0.6005240308766893,-0.1216755821207231,0.4258308109312131,0.8984769250859818,1.1710934053306499,1.171169873057633,0.8987548948230802,0.4264915193226244,-0.120221868893443,,, +32.0703125,64,-0.5975087752329701,-0.8823364446733097,-0.9061064833380928,-0.6733093315171099,-0.2601313796482315,0.20660195359193356,0.5843744051533359,0.754238241169418,0.6536230788041977,0.2937002339929358,-0.24345852544024027,-0.8271512405384656,-1.3136435715642238,-1.585340018503065,,, +32.078125,64,0.5848791221853011,0.569712417234888,0.5715682845891711,0.5900796075013409,0.6245809577411061,0.6741204453203462,0.7374765872125274,0.8131798995817713,0.8995388353191273,0.9946696126096737,1.0965294121073264,1.2029523613160638,1.3116876759723515,1.4204392904420575,,, +32.0859375,64,1.526906283090601,1.6288233886448085,1.7240008880516173,1.8103631772375017,1.8859853392937023,1.9491270795894735,1.9982634294715491,2.0321116807998942,2.0496540795654217,2.0501558810871794,2.033178450515403,1.998587179111697,1.9465540775595902,1.877555000761046,,, +32.09375,64,1.7923615525768355,1.692027812123138,1.5778721139100285,1.4514542007155316,-0.8059600371923227,-1.0707857008521025,-1.3199042939683776,-1.5359218831004169,-1.7036113348355926,-1.8109769680390349,-1.8500941875398293,-1.8176655409376228,-1.7152544142035153,-1.5491800603271917,,, +32.1015625,64,-1.33008127089378,-1.0721791064059905,-0.7922900861176524,-0.5086586388051912,-0.2396902188122333,-0.0026734181035318327,0.18741982812256042,0.31897229090881707,0.38452538017947413,0.3812929147660087,0.3113489183691416,0.1814763615720234,0.0026874136308078223,-0.21055132527316844,,, +32.109375,64,-0.4413345677766727,-0.6715042112847928,-0.8829226266142101,-1.0587445558542652,-1.1845989088525504,-1.2495980307824355,-1.247104044200964,-1.17519880903388,0.9550476428871275,0.9340209636450316,0.7595532858660541,0.46063534116852545,0.08497748502499802,-0.3084282559371415,,, +32.1171875,64,-0.658499348293297,-0.9115755404947349,-1.0297716149383125,-0.9968691452440137,-0.8208296343379947,-0.5325376672715947,-0.18096992802621015,0.174457360169139,0.4731705168454269,0.6629041292022431,0.7078759194196341,0.5943972947269783,0.333045510590555,-0.04294109077363756,,, +32.125,64,-0.48279504225024705,-0.9260798224270629,-1.312054037410884,-1.5890814532918083,-1.7226214859504099,-1.70055586356768,-1.5350220883078576,-1.2604684125539696,-0.9282335670953763,-0.5984957683453367,-0.3308452803273426,-0.17494919414725818,-0.8840910562580084,-0.40399651240723794,,, +32.1328125,64,-0.022195245952728926,0.14824866832850392,0.054034601999731646,-0.2836292405251808,-0.7747191692932525,-1.28496890874467,-1.6725883723339776,-1.8270656267785264,-1.6994182258170896,-1.3156033633429935,-0.7694117525521282,-0.19679282513898555,0.26135224546464286,0.49771277569507866,,, +32.140625,64,0.46788338662214896,0.20241788545664513,-0.20168040881716456,-0.6076984837850086,-0.8768536782756096,-0.9065164526356941,-0.6585385317437074,-0.1699207587071302,0.45710496086516567,1.0828633603141187,1.5682794397400572,1.8127535182545305,1.781489449843266,1.5147883331367327,,, +32.1484375,64,1.314548149110173,1.1691115415729407,1.01725142485362,0.8611876505175166,0.7032142394425296,0.5456594466386693,0.3908452255250156,0.24104680130324974,0.09845306116938868,-0.034871545203547405,-0.15702292792240713,-0.26629047299846687,-0.36118677261112386,-0.4404734490579446,,, +32.15625,64,-0.5031826203420993,-0.5486336316597447,-0.5764447599422993,-0.5865396866295517,-0.5791486254548447,-0.554804085613614,-0.5143313446167668,-0.45883379776752786,-0.3896734408994794,-0.3084468282369073,-0.21695692646233505,-0.11718135792962053,-0.0112375891947111,0.09865432549532588,,, +32.1640625,64,0.21021079328740935,0.3211248405377619,0.42910667610236725,0.5319239497394077,-1.0368247116582125,-0.8395864485033889,-0.595227609679692,-0.31881854556211464,-0.02771213265171607,0.2596597595769419,0.5250651903832259,0.7517372901588542,0.9255374161223096,1.0359352253688665,,, +32.171875,64,1.0767373358150283,1.046513776856258,0.9486925051286577,0.7913154070889087,0.5864728151555769,0.3494559818143248,0.09768662316632692,-0.1505018116308786,-0.3771461496039141,-0.5659093745532223,-0.7032227944127344,-0.779234841109906,-0.7885003335682015,-0.7303621335678916,,, +32.1796875,64,-0.6089985754056632,-0.43313335773530404,-0.21542812437202435,0.028399911250900828,0.2806737688717399,0.5229895185569533,0.7375001440758833,0.9081609238841056,-0.1627627213518843,-0.3035004152454457,-0.5821508549679938,-0.9617664066379324,-1.3891716788948418,-1.8032018002583243,,, +32.1875,64,-2.144187601180701,-2.363210558899895,-2.429686209929664,-2.3360950700012397,-2.099124375912492,-1.757042980175879,-1.3637184177736819,-0.9802081451457432,-0.6652347676391412,-0.4660288765713886,-0.41096583952114163,-0.5051434491971762,-0.7295892610581939,-1.0442210856664702,,, +32.1953125,64,-1.3940995070180564,-1.7179985267199083,-1.9579593527155965,-2.0683392007705192,-2.0229456112769455,-1.819144955315585,-1.478305070925583,-1.0425029307072127,-0.5680099654708879,-0.11656954901666339,0.2541749839015204,0.49961112010331493,0.4800291684834408,0.47220579817000397,,, +32.203125,64,0.7311187434434887,1.2098789130010876,1.7993544022657726,2.357913678458806,2.750093451109498,2.8835948579314983,2.7344695836347817,2.353594132615075,1.852658641266594,1.3735108677117926,1.0492576397391893,0.9677848683181898,1.1476941693767633,1.5332509087546895,,, +32.2109375,64,2.0097278187979377,2.4349383192013785,2.6783163667483283,2.6568311933610183,2.357892575279513,1.8429676135359254,1.2309162467963854,0.6656110635142528,0.27671405676522476,0.144358332846525,0.2774124627566328,0.6112824979491749,1.0258519304975398,1.3786406372854225,,, +32.21875,64,0.627441000619863,0.7136564086095679,0.7887381907176031,0.8510560263403047,0.8992099469509799,0.932054987808802,0.948721369954195,0.9486298590333901,0.9315020319488359,0.8973652714969741,0.8465524014740802,0.779695968574807,0.6977172711481475,0.6018103268582937,,, +32.2265625,64,0.49342105992472185,0.3742220723169094,0.246083440613372,0.11104004982478932,-0.028743963879973577,-0.1710130389718847,-0.31345962059972554,-0.4537645084419146,-0.5896374139147906,-0.7188570166111674,-0.8393098185998839,-0.94902711627786,-1.0462194424098108,-1.1293078752930321,,, +32.234375,64,-1.196951666836631,-1.248071705792107,-1.2818694053041892,-1.2978406840582672,1.0218494838108496,1.0692824142322626,1.0456645299187664,0.9510254936039023,0.7902203246423342,0.5725937516970073,0.31133180883880224,0.02254588319305853,-0.2758469214818064,-0.5653690380730796,,, +32.2421875,64,-0.8282664801116219,-1.0487421460108037,-1.2140523919920434,-1.3153904174863222,-1.3484948736532272,-1.3139412673179387,-1.2170958528562914,-1.0677352408793621,-0.8793582636846979,-0.6682380978363481,-0.45228075733008816,-0.24976957361885044,-0.07808322961488567,0.04752324072708913,,, +32.25,64,0.11498946612603822,0.11629806323760783,0.04804110023981578,-0.08833481952370781,-0.28662196140505103,-0.536276854661148,-0.8231480320998462,-1.1304553838261189,0.5950559682655621,0.5395487984408287,0.3559468697491061,0.087309887178734,-0.20986349773036705,-0.47449340992990807,,, +32.2578125,64,-0.6504907734284223,-0.6955524494088268,-0.5878093072627594,-0.32929146210245386,0.05432934404849887,0.5176803835118697,1.0026981190391244,1.447616325700431,1.7965324875528152,2.0080627206578607,2.0617374314614807,1.961141801214634,1.7333121855719775,1.4244826662362007,,, +32.265625,64,1.0928444601748812,0.7994461396992351,0.598652178680093,0.5296461159473274,0.6103019040191396,0.8343781351360833,1.1724722613515548,1.5765862665194932,1.9875927248453822,2.3444384094323896,2.593651960652337,2.697674744149316,1.0891287407107448,0.5377292084903389,,, +32.2734375,64,-0.08144825429750346,-0.6241956141098376,-0.9659535198366993,-1.0357705371664592,-0.8355858593146244,-0.4395521277608734,0.02641475834310897,0.419252949958859,0.6180505811223743,0.5572497563995851,0.24465784042601735,-0.24067063672793293,-0.7701010779209567,-1.2006965377390704,,, +32.28125,64,-1.4144372089851156,-1.350632299805417,-1.0226404863188603,-0.5143154811133112,0.04285018954429026,0.5056202400226539,0.7581121621741165,0.7433833414217517,0.4788506393112044,0.051319211175014284,-0.40701507286551963,-0.7550105859065952,-0.8814817440723189,-0.735893716902432,,, +32.2890625,64,-1.2957847962140498,-1.2758078555071628,-1.2383209918027105,-1.184033172366576,-1.1139388135376787,-1.0293003997013361,-0.9316264138804559,-0.8226449663572837,-0.7042735830529362,-0.5785856826405508,-0.4477743293397593,-0.3141138960386511,-0.1799203089846705,-0.04751057010519982,,, +32.296875,64,0.08083773432158942,0.20292622969721252,0.3166741570635022,0.4201547125932986,0.511628686375184,0.5895748115358059,0.6527162923555009,0.7000430469396,0.7308292750462604,0.7446460435352249,0.7413686691409312,0.7211787693778837,0.6845609457470844,0.6322941574069846,,, +32.3046875,64,0.5654379364385096,0.485313686165347,0.39348139008568545,0.29171213933179685,-1.4399528488752764,-1.733193383725919,-1.992808014474078,-2.2037097972304194,-2.3541387474826405,-2.4364748886961474,-2.4477627399413193,-2.3899106843134135,-2.2695513311679463,-2.097572624802477,,, +32.3125,64,-1.8883524117058532,-1.6587498568235923,-1.4269240545257995,-1.211062229684673,-1.0281062283351088,-0.8925661160777123,-0.8155036274912,-0.8037563649609238,-0.8594568564375421,-0.9798800195423873,-1.1576296779080137,-1.3811511317465388,-1.6355340470947695,-1.9035496826059308,,, +32.3203125,64,-2.1668501308714454,-2.4072459526936725,-2.607973115347904,-2.7548608909168677,-2.837319276361828,-2.8490770814674367,-2.7886192167087485,-2.6592926879963765,2.640717301660309,2.4312291787664826,2.100597377390973,1.6982760719847798,1.2841060579155883,0.9190200951111762,,, +32.328125,64,0.655581696641319,0.5298308356377261,0.5557064674104437,0.7229143947727875,0.9985723589829465,1.3323759017340995,1.664480152003899,1.9348696601710134,2.092756620097694,2.1045433892269796,1.9591088270583332,1.669594795517808,1.2714142780531779,0.8167910737668773,,, +32.3359375,64,0.36668124645491657,-0.01866568638445809,-0.28903597073578546,-0.4120184526754386,-0.3779995924784737,-0.20160893460802887,0.08060983494584528,0.41593923636504543,0.7437454066967935,1.0049661968298338,1.151351904685245,1.1530191363059514,0.7748918990882792,1.2211828073245814,,, +32.34375,64,1.4358462434295927,1.3717366141708678,1.0567150914599563,0.5858432514277764,0.09517406916556082,-0.27567510188608124,-0.421908568647384,-0.30237568556681915,0.0490690665738196,0.5327836117528001,1.0106078214209167,1.3437117553811915,1.4306497787813197,1.2351911014407546,,, +32.3515625,64,0.7962990537690238,0.21752370277565938,-0.36128560565918255,-0.8021958121685829,-1.0068610451039643,-0.943325543555989,-0.6546140460163186,-0.24675675663693486,0.1404674884096314,0.37204967869012684,0.35497208793279955,0.06392948088768069,-0.4515013890172621,-1.080211042684588,,, +32.359375,64,0.1819569598025978,0.06631248489389244,-0.053015924998412525,-0.1737529703261651,-0.29359342831317053,-0.4102426961644019,-0.521457151553286,-0.6250836235586281,-0.7190972828078834,-0.8016372872606883,-0.8710395593544209,-0.9258661204778202,-0.9649304690017579,-0.9873185573815895,,, +32.3671875,64,-0.9924050009022207,-0.9798642341252669,-0.9496764195697429,-0.9021280050364497,-0.837806919692192,-0.757592492901616,-0.6626402721996428,-0.5543620061100588,-0.43440114218025583,-0.30460426912893723,-0.16698900301952524,-0.023708879642308972,0.12298413230094124,0.2707788409472479,,, +32.375,64,0.41734507753225236,0.5603742745857672,0.6976196656705109,0.8269354029101276,-2.4690739065512433,-2.230013538896053,-1.9573976072795163,-1.6686833367837401,-1.3822839521727304,-1.116287159963874,-0.887196674717637,-0.708784540837986,-0.5911342742644251,-0.5399415412091627,,, +32.3828125,64,-0.5561211314801522,-0.6357476243125507,-0.7703338745007658,-0.9474278886596263,-1.1514864584450029,-1.3649646177757786,-1.5695449404390793,-1.7474209423433171,-1.8825450792708622,-1.9617542993387374,-1.9756946473796217,-1.9194804307862123,-1.7930419657924137,-1.6011376390818355,,, +32.390625,64,-1.353029427623032,-1.0618444874601736,-0.7436673133211182,-0.41642575883651434,-0.09864858172444418,0.19181886288686512,0.43905123946086294,0.630145943488401,1.003141040591444,0.7190432040417327,0.3395343460707159,-0.08111257731379629,-0.48159151866497896,-0.8030936507901254,,, +32.3984375,64,-0.9984525419853826,-1.0394798586962821,-0.9213490738779484,-0.6633444271452592,-0.305858493057543,0.09589400811643031,0.4804670811916537,0.7897409870298053,0.9779578703080836,1.0188282301400564,0.9096014755798727,0.6714666869371049,0.3462213119795121,-0.010273167452704124,,, +32.40625,64,-0.3368290999145478,-0.5765028915691089,-0.6855067681818119,-0.6400737898047817,-0.4402066152414797,-0.10972587467467604,0.3073896455367431,0.7538012405306985,1.1676883630260995,1.4923240135283413,1.6848563142563306,1.7229287800601527,-2.2958293317403546,-2.199726912649913,,, +32.4140625,64,-1.8796641516756698,-1.448344079798186,-1.047324299132336,-0.8080255245282233,-0.8155326426472401,-1.085110974608143,-1.5578754287401617,-2.116800840032067,-2.618686714077837,-2.9333167891455076,-2.9790817563125094,-2.7453026225239565,-2.2951369531198234,-1.7482716737443122,,, +32.421875,64,-1.2481458005097208,-0.9226861413905851,-0.8493167054797959,-1.0338310594299078,-1.4089172562074954,-1.852738592249068,-2.2224765690196806,-2.3936415753434996,-2.2943758917984898,-1.9253459307095593,-1.359770056641417,-0.7235724632034874,-0.16110034073292623,0.20420183634224476,,, +32.4296875,64,0.9463139074903079,1.053920799264267,1.1481267939824271,1.2275360097589623,1.2910101872686937,1.3376883997106015,1.3670019075523068,1.3786838980818912,1.3727739393613625,1.34961707072369,1.309857545870408,1.254427338258023,1.1845296101703469,1.1016174350659558,,, +32.4375,64,1.0073681458916404,0.9036537586526544,0.7925079892449598,0.6760904412037613,0.5566485915692546,0.4364782406054779,0.3178831180229429,0.20313435311332206,0.09443051858575358,-0.006141052142322412,-0.09664099676515348,-0.17531206172807046,-0.24061004783152995,-0.2912310218378644,,, +32.4453125,64,-0.32613431749638677,-0.34456092314352027,-0.3460469338053429,-0.3304318321598301,0.7561150291363377,0.8125041735171535,0.7996955325362156,0.7228733864368365,0.5916549877723429,0.4194123708739987,0.22233243191187385,0.018280839618429717,-0.1744509840029121,-0.3384284201170462,,, +32.453125,64,-0.45829629437491626,-0.521856329324344,-0.5209242590331091,-0.4519068223455107,-0.3160583854571143,-0.11939928545922662,0.1276984236574613,0.41122894739467436,0.7145243942386503,1.0194123413282927,1.3074786117518569,1.5613472155095023,1.7658882085969445,1.9092692504251279,,, +32.4609375,64,1.9837775384799363,1.9863548106660338,1.9188081137188666,1.7876816451332767,1.6037986096857912,1.381505041734509,1.1376683265477445,0.890500258699064,1.6081084351133708,1.3655881186388295,1.0402096357429795,0.6894274537940173,0.37430916606993603,0.1499747219360289,,, +32.46875,64,0.05696383004607797,0.1148763641566466,0.3192765584243731,0.6423434149244291,1.0371662407683109,1.4450164699303703,1.8044633375455976,2.0609137685032155,2.1750907513057354,2.1291297866676278,1.9293439789985536,1.6052271959067137,1.204850641657499,0.7873699149033693,,, +32.4765625,64,0.413809657622332,0.13756115543377645,-0.003927062173263551,0.00502858965640951,0.1559185681084727,0.41738416429370995,0.7401241968315718,1.0646000904462545,1.3303391099602226,1.48538658005327,1.49443469771139,1.3443616546980617,-0.20804203199289642,-0.6160342437375235,,, +32.484375,64,-0.9409149930543093,-1.0637803709101346,-0.9220411062664676,-0.5267855077553134,0.04006282451101889,0.6480152724590024,1.153614453995673,1.4396020538195071,1.4469248046558258,1.1908078677759886,0.7564913262469009,0.27579904312667375,-0.10903778825948995,-0.28438717194098184,,, +32.4921875,64,-0.19636225204411573,0.13442943390113382,0.6185754480515935,1.1224268972516578,1.5048116813338024,1.6558296763494407,1.527096202918194,1.145143722511537,0.6043073644725634,0.04104260146672428,-0.40328785501441433,-0.6209607480531447,-0.5672099743476557,-0.2722821827733986,,, +32.5,65,-0.2978614532623295,-0.24878558102665993,-0.1839502184558407,-0.10438466687924186,-0.011383640350993374,0.0935152717012333,0.20855839902838097,0.33180657322671553,0.46116896309240396,0.5944395702844746,0.729335746333368,0.8635380566278377,0.9947307934383167,1.120642428653828,,, +32.5078125,65,1.239085297970026,1.347993821720049,1.4454605931531606,1.5297697023165713,1.599426712084603,1.6531847615045587,1.6900663394344688,1.7093803472549949,1.7107341519281498,1.6940404183853948,1.6595186016418877,1.6076910725361568,1.5393739449591544,1.4556627652057168,,, +32.515625,65,1.3579133140462512,1.2477178576873413,1.1268772634745334,0.9973694686030216,0.6582867103226233,0.4581124936028239,0.30467033613373595,0.20923702153022794,0.1788880898669024,0.21600585617572676,0.31811505042283894,0.4780575354974431,0.6844939139726414,0.9226970386269664,,, +32.5234375,65,1.1755820855862051,1.42490135191761,1.6525204520571926,1.841686910512883,1.9782026778530861,2.0514187960616637,2.054982840781275,1.9872870070332476,1.8515855794768115,1.655773582599048,1.411842032695097,1.1350477646009098,0.842855709276926,0.5537273656542854,,, +32.53125,65,0.28583993512064065,0.055825421780817286,-0.12238239095566472,-0.23851269976862643,-0.2866669175810336,-0.26572294591609247,-0.179406309153184,-0.03602320729296826,1.0463181287892755,0.6340359526825085,0.15862217086854816,-0.3193508990164636,-0.7392278342995742,-1.049663441866467,,, +32.5390625,65,-1.2165644664399657,-1.2283429860596902,-1.0976635337155223,-0.8594121097522949,-0.5652037136704081,-0.2752841698182317,-0.049087874495481465,0.06407756164867007,0.03276856920477156,-0.1516406315254788,-0.4735596428281901,-0.895556943256698,-1.3641387215268919,-1.8180316630972573,,, +32.546875,65,-2.197679846967283,-2.4544767939316348,-2.5582949455148545,-2.5021400223353414,-2.303205510137425,-2.000163204130119,-1.6471119784606374,-1.3051274283336791,-1.0327286899837342,-0.8767473792257754,-0.8650209371427606,-1.0020484897892923,0.9308644949790443,1.0141084394466358,,, +32.5546875,65,0.8259341652119383,0.4032915687706608,-0.15170713298510546,-0.6995762921850328,-1.101499900484396,-1.257204176531852,-1.1322816086745306,-0.7674792932802723,-0.2674073025231888,0.22823699692503308,0.5830410758824324,0.7013283135724544,0.5544231247974583,0.1885311922290821,,, +32.5625,65,-0.28792519492609,-0.7340457489266717,-1.0151141272409316,-1.0395867763026843,-0.7842705829294973,-0.3007881363482532,0.29844228301101683,0.870870655666791,1.2827203512385255,1.445473168709134,1.3399364449201574,1.0212979015844883,0.6037847070295493,0.2291332001041294,,, +32.5703125,65,0.8613148539447375,0.7209391293007534,0.5785343799525515,0.4364189565773237,0.29689691085083664,0.16221768699757966,0.03453677507861774,-0.08412198504465207,-0.19190178903827182,-0.2871453231395099,-0.36842372066526574,-0.43456151298402135,-0.48465713809740923,-0.5180986477645724,,, +32.578125,65,-0.5345743381777303,-0.5340781180915627,-0.5169095204559137,-0.4836683573985887,-0.43524411220023146,-0.3728002540662938,-0.2977537503976324,-0.21175013536339982,-0.11663457138771083,-0.01441941032643096,0.09275117758702392,0.2026388876180258,0.3129506173043907,0.4213787672666072,,, +32.5859375,65,0.5256418003115366,0.6235243485507396,0.7129161661844441,0.7918492457937953,0.15212588058968962,0.3696111337499736,0.5989565360396203,0.8218656826813362,1.0205047510748404,1.1787531530791648,1.2833346400002716,1.324749968137988,1.2979460707811477,1.2026750570401674,,, +32.59375,65,1.0435179875843479,0.8295717538452052,0.5738208804991732,0.29223804274551857,0.002676007932454122,-0.2763717438166506,-0.5270553073644986,-0.7334080039628252,-0.8824549636156747,-0.9651133449748445,-0.97682142850777,-0.9178527245380105,-0.7932932020092944,-0.612683234781151,,, +32.6015625,65,-0.38934924187172365,-0.13947163593349654,0.11904591842199988,0.36782708031822714,0.5893060305727106,0.7679538060895751,0.8913622509671913,0.9511099942220491,-1.2682858808313169,-1.623189694589127,-2.0115361408699046,-2.3720305748603847,-2.646866626000075,-2.7907459824221346,,, +32.609375,65,-2.777953862973161,-2.606388025909558,-2.297913646751722,-1.8949886444359425,-1.4540849143547112,-1.0369299643111523,-0.7009329170286078,-0.49028586712810995,-0.4291263764701678,-0.5178258459280427,-0.7329816183992859,-1.031113782045226,-1.3554906072978312,-1.6450192425960357,,, +32.6171875,65,-1.8438166128596096,-1.9099695150208,-1.822119188797441,-1.5828444887486093,-1.2183164184436195,-0.774277544045309,-0.3089722270865593,0.11587145334028587,0.4446037530517649,0.6362702196998227,0.6709416786737559,0.5527715701306645,0.40375739958646206,0.9322630517684134,,, +32.625,65,1.5481378479875896,2.107448877095027,2.480549325620835,2.58739562905475,2.41928037579699,2.0410265148873283,1.5730432776721803,1.1581633958667699,0.9223520455486829,0.9400573660252458,1.2137001170188233,1.6729247441869581,2.1938179248118983,2.632827981741366,,, +32.6328125,65,2.866089284404136,2.8233742046765515,2.5073674130602184,1.9929797983112714,1.406889627365247,0.8929174797544152,0.5727238309976658,0.5125998915087733,0.7054521488952126,1.0729167540919082,1.487022748888175,1.8054652386974888,1.9108194091255044,1.7429461064076428,,, +32.640625,65,0.8585324481490101,0.9113830390758613,0.9490545810702495,0.9704606911901491,0.9747942491193644,0.9615417189709279,0.930492333951938,0.8817419829584443,0.8156917309404351,0.7330409988326012,0.6347755223586276,0.5221503004343577,0.39666783162872415,0.2600520196402788,,, +32.6484375,65,0.11421820458582549,-0.03876015526958132,-0.1966875680643005,-0.3572847274536709,-0.5182281972023577,-0.6771908665018853,-0.831882467771984,-0.9800894476113917,-1.1197134928847359,-1.2488080374928074,-1.3656121107212107,-1.4685809346187382,-1.5564127347804089,-1.6280712952114516,,, +32.65625,65,-1.6828038624747788,-1.7201540857537507,-1.7399697663866447,-1.7424052813131667,0.943350064845002,0.8690781668348889,0.734062906277871,0.548442836522499,0.3260184221597431,0.083288297621226,-0.16170297183230065,-0.3906252735925182,-0.5861435804894773,-0.733129524843841,,, +32.6640625,65,-0.8197194206726294,-0.8381449478255178,-0.7852785640773339,-0.662855603413955,-0.4773575637183154,-0.23956471272412028,0.0361908000833191,0.33301925389867676,0.6326457647319523,0.9166790478717299,1.1678880727790544,1.3713975986818405,1.5157192363363994,1.5935461511918905,,, +32.671875,65,1.6022560056446826,1.5440870838974,1.4259753333088026,1.2590637018328321,1.0579180032516806,0.839504006930052,0.6219970995971145,0.4235075421202863,0.3093046801266635,-0.012854838773989546,-0.35534121610218067,-0.6571537207935277,-0.8641905205279059,-0.9377046295898543,,, +32.6796875,65,-0.8603647398616816,-0.638976800289033,-0.30344233535349974,0.09788433933249321,0.5057169352387272,0.8590646842588775,1.1047293040720592,1.2055922396743886,1.1464013850819867,0.9361559374237582,0.6067178736625884,0.20786624315230476,-0.20043550065396432,-0.5573548417004192,,, +32.6875,65,-0.8106374377011007,-0.9247149478809406,-0.886210786042091,-0.7059864362213343,-0.4174098094123842,-0.07111557129402728,0.2729262216846718,0.554797583261371,0.7240137550418175,0.7474366327967273,0.6144876320245772,0.3388477831672201,0.06789507804786887,-0.47724567634234605,,, +32.6953125,65,-0.8058936897150115,-0.8609251413971459,-0.6596426858721536,-0.2888023041645539,0.11938637085151049,0.4237066973474822,0.5128378358513521,0.33604988261643787,-0.08272291148948352,-0.6512893588197441,-1.2343342787813532,-1.6903901255402327,-1.9105154471096764,-1.8480803409200777,,, +32.703125,65,-1.5314961781340402,-1.0564011296676892,-0.5594433683747352,-0.18084713849688905,-0.02602095544302474,-0.1367295173083709,-0.47972958258707943,-0.9559835251427751,-1.4279243673860083,-1.7572985475142975,-1.8432134718921116,-1.6499606256477912,-1.2169870889882928,-0.6482807701660114,,, +32.7109375,65,-1.727918638136618,-1.6972632135003691,-1.6514743195772317,-1.591850834027444,-1.5199322152171826,-1.437471305302048,-1.346403397519323,-1.2488121094605045,-1.1468926600143536,-1.0429131931307531,-0.9391748257665642,-0.8379711196940444,-0.7415476869593597,-0.6520626364266024,,, +32.71875,65,-0.5715485541149423,-0.5018766831890156,-0.44472393092816453,-0.40154328051672417,-0.3735381258676739,-0.36164097900044,-0.3664969229344821,-0.3884520999553056,-0.4275474369492813,-0.4835177177950517,-0.5557960191735011,-0.6435234322426553,-0.7455639000675834,-0.8605239111167718,,, +32.7265625,65,-0.9867767041048744,-1.122490560468493,-1.2656606891796558,-1.4141441457075135,0.2608102302258851,0.14816755410772042,0.09632745988256408,0.11176659846706305,0.1962313567131333,0.34660879330798544,0.5551364965287289,0.8099367467173795,1.095837751358215,1.3954247019464718,,, +32.734375,65,1.6902473753652982,1.9621000858727085,2.1942847482111776,2.372768989715048,2.4871585674543732,2.531416295112823,2.5042773605206627,2.409332085894781,2.254770372590077,2.052805663409282,1.8188186032026603,1.5702801241726618,1.325529063096016,1.1024895609445955,,, +32.7421875,65,0.9174176938584708,0.7837647453347147,0.7112363949698688,0.7051134364922522,0.7658813997664679,0.8891949098251737,1.0661792729085244,1.284048262783636,-0.043620025904999526,-0.48040332592460744,-0.910465469384265,-1.2736988771002946,-1.520234025077753,-1.6181545356534184,,, +32.75,65,-1.5584169907726662,-1.3562094593567209,-1.0485374130946634,-0.6884133010788368,-0.3365550422468357,-0.051886683014790824,0.11767897547128614,0.14273990762368405,0.01701825574646887,-0.24163116433098109,-0.5939744965527989,-0.9854858787129228,-1.354819926292089,-1.6433501496915643,,, +32.7578125,65,-1.8042877443136922,-1.8099605319763277,-1.6561183778423745,-1.3625945283986078,-0.9702198795414825,-0.5344707886532225,-0.11683979124980381,0.22472676848525985,0.44483487162924906,0.5176900581211139,0.4410882242574384,0.23672852360184493,0.5174250332126404,0.42394437708546107,,, +32.765625,65,0.09979984944489062,-0.349063934939033,-0.7828931576067605,-1.0666430027943168,-1.107198190965467,-0.8790928078491252,-0.43167848117278723,0.12422548803841044,0.6465429318666437,1.000734238862471,1.0965416853424408,0.9126171226163233,0.5022833755637319,-0.021148793540963606,,, +32.7734375,65,-0.515483289340204,-0.8486360779909947,-0.9348390732980669,-0.7581280392621196,-0.3766773109269224,0.09320634595522437,0.5090433930633654,0.7413347732850724,0.7091770977074452,0.4025775982212395,-0.1146482996010375,-0.7221923687418318,-1.2760379040423797,-1.6477295057767254,,, +32.78125,65,-1.5656971737996557,-1.718014316333979,-1.8687686105143775,-2.0156521636868616,-2.1564163993988865,-2.2889112690832447,-2.4111227428649142,-2.52120792311857,-2.6175271660219197,-2.698672648747343,-2.7634928821581437,-2.811112739873291,-2.840948653068072,-2.852718705022455,,, +32.7890625,65,-2.8464474487330738,-2.8224653632987424,-2.781402958662951,-2.724179631998642,-2.6519874709211626,-2.5662702871849845,-2.468698248038585,-2.361138549489506,-2.2456226450328525,-2.124310603716054,-1.999453221659558,-1.8733525505019286,-1.748321533945731,-1.6266434591942398,,, +32.796875,65,-1.5105319333164156,-1.402092085366592,-1.3032836736355984,-1.2158867440384902,1.5269950301485922,1.7772940113665996,2.016536998302889,2.2269171747093477,2.3924715789435496,2.5001953510111385,2.540950061998095,2.5101027824203093,2.4078513216271906,2.239212953885591,,, +32.8046875,65,2.0136774121033314,1.744548341055888,1.4480191259069481,1.1420475339250442,0.8451076359281717,0.5749060309643589,0.3471518862700028,0.17446655116016174,0.06550876992437049,0.024376483752295397,0.05032692369543468,0.13783450063965674,0.27698244206810874,0.4541608516395131,,, +32.8125,65,0.653022499311556,0.8556296768960794,1.0437121299291356,1.199948330656199,1.3091807289154822,1.3594802213608634,1.3429855936406248,1.2564593817871934,-0.0532002186708683,-0.3726277301755032,-0.6603757076744214,-0.8597297224654918,-0.9273185278058034,-0.8399175431241561,,, +32.8203125,65,-0.59811659733665,-0.22628041005857313,0.23119229519846304,0.7167286532089185,1.1684923126707076,1.5299572877209862,1.758654116119178,1.8327263557768743,1.7542765042897601,1.5489804906395377,1.262031076415062,0.951042292782196,0.6770203697316846,0.4948077623688172,,, +32.828125,65,0.44448893966301517,0.545096792778716,0.7916001765217026,1.1556420322549945,1.5899133552605065,2.035481953756637,2.4309347075751466,2.7219095563544373,2.8695327278702605,2.85644721391453,2.6894936585144933,2.3986262084791483,-1.250789650991324,-0.8190540442022225,,, +32.8359375,65,-0.45210464824701846,-0.27424841454399285,-0.35722583615845804,-0.7003220676848755,-1.230342182160635,-1.8214594039051837,-2.3294984960199496,-2.631260146455366,-2.658110500373364,-2.4146316116108015,-1.977222798177098,-1.4730375866306422,-1.045030186865124,-0.8126922205016844,,, +32.84375,65,-0.8392414096389853,-1.1142554478437634,-1.5565110123499524,-2.036250047667616,-2.4107708107097787,-2.56358904207564,-2.436435957185532,-2.0453227607492908,-1.4762680784363682,-0.8618582935483763,-0.34506372103483207,-0.04022617348425295,-0.0019085524664320674,-0.21014220933985694,,, +32.8515625,65,-1.1414704409717782,-1.0813655167761516,-1.0366410211641934,-1.0080855787894767,-0.9961935827852716,-1.0011565460217426,-1.0228597615159125,-1.0608843304615367,-1.1145145223572817,-1.1827503383424018,-1.264325057740379,-1.3577274605461331,-1.4612283367232237,-1.5729108181031979,,, +32.859375,65,-1.6907040017474189,-1.8124192759967892,-1.9357887130981266,-2.058504856123455,-2.1782612034652162,-2.292792681981989,-2.3999154000650615,-2.497564984492284,-2.5838328297470254,-2.656999625013043,-2.7155655717306533,-2.7582767625434474,-2.7841472596700507,-2.7924764860459987,,, +32.8671875,65,-2.7828616246403604,-2.755204808762194,-2.709714977376535,-2.6469043628622777,1.1015213738593213,0.8845434518895022,0.6162130898926833,0.31079592927394656,-0.014851162771607793,-0.34244774666465494,-0.6535567687865897,-0.9308624929901724,-1.1593703081642053,-1.3274447624246357,,, +32.875,65,-1.4276134552719801,-1.4570807462829383,-1.4179154740475144,-1.316899611044665,-1.1650484238186076,-0.9768356144027563,-0.7691774911321184,-0.5602470201450596,-0.3682004713791601,-0.20990546739331573,-0.09975914497592053,-0.048678855086398465,-0.06333579439566928,-0.14568502069702294,,, +32.8828125,65,-0.29282463599361674,-0.4971939664890389,-0.74709692866616,-1.0275140936671916,-1.3211468295877111,-1.6096207170120043,-1.874764325718256,-2.099874184503365,2.032232280925073,1.649585291018339,1.3116059190871163,1.0713709292723395,0.9658478509257148,1.0101428783407078,,, +32.890625,65,1.1951578762673691,1.4890213716398395,1.8420705730409572,2.1946083479755423,2.486226853912134,2.6652454854075827,2.6967929757813502,2.5682746542308603,2.2913731183314656,1.9002705048322936,1.4463690328772403,0.9903318926364535,0.5926839102347087,0.3044357310288516,,, +32.8984375,65,0.15919159038033537,0.16796965590338764,0.31754142082975634,0.5725485116732151,0.881066917060021,1.1827516878454232,1.4182932355356856,1.5387120679921527,1.5130439675107143,1.3332183168718665,1.0153694657574948,0.5973766090665691,-1.2413270725005263,-1.2904642175461791,,, +32.90625,65,-1.0661581343304714,-0.5952817102402285,0.027555774444771253,0.6656946317992247,1.1776398442954314,1.455607814730421,1.4548423355884614,1.2056671262624872,0.8049735779657812,0.38947842414390327,0.09808223984923681,0.03364666374092906,0.23466738791865016,0.664607656619304,,, +32.9140625,65,1.2218166175790652,1.7673149889102984,2.162833411605896,2.308678701249791,2.171050173604198,1.7913194287339134,1.2747300452838375,0.7616138160248155,0.38901164587378556,0.2532168324580817,0.38350546466023916,0.734252443594384,1.1975925167594805,1.6331547909146658,,, +32.921875,65,-2.5675796726282885,-2.47282811891057,-2.3639985412799898,-2.2426779523119453,-2.1106639170121615,-1.9699332495330553,-1.8226075752047453,-1.6709163607864725,-1.5171580601722938,-1.36366005578846,-1.2127380969926054,-1.0666559456029188,-0.9275859350494551,-0.7975711336409003,,, +32.9296875,65,-0.678489774356131,-0.5720225738710047,-0.4796235129494151,-0.4024945897113327,-0.34156498772596355,-0.2974750235743887,-0.2705651548338731,-0.26087024082983856,-0.26811915652246077,-0.29173976616297403,-0.33086916949935397,-0.3843690409959094,-0.45084579334433084,-0.5286752120737177,,, +32.9375,65,-0.6160311297795809,-0.7109176377477222,-0.8112042708252438,-0.9146635493125664,-2.2708777381043763,-2.377313198038686,-2.4130579619541535,-2.376754808367245,-2.2719061479223863,-2.1066297589506986,-1.8930930400483752,-1.646665229599031,-1.3848467083934848,-1.1260500454020528,,, +32.9453125,65,-0.8883177843350406,-0.6880663791181741,-0.538943862154984,-0.4508808975244234,-0.42940138515872006,-0.47524068197206115,-0.5842980540884593,-0.7479266666019311,-0.953540879059152,-1.1854984874367485,-1.426196379880078,-1.6573031908103806,-1.8610429841033507,-2.021440437066503,,, +32.953125,65,-2.1254406810670674,-2.163825694788823,-2.131863332629107,-2.0296437145381447,-1.8620795044782252,-1.6385700424359568,-1.3723527351539466,-1.079586918903792,0.1330150855296416,-0.31637019663810695,-0.6913725481101666,-0.9437318497429168,-1.0438094416686647,-0.985165506708143,,, +32.9609375,65,-0.7855261911932936,-0.4839900074424003,-0.13490879668121658,0.20060353210312537,0.4642118042048401,0.6094637868117403,0.6090396887220132,0.4590177395122481,0.1794914176068998,-0.1885578325338381,-0.5896453055135233,-0.9624306921404346,-1.249281730655185,-1.4052642025600495,,, +32.96875,65,-1.4051579529617446,-1.2474060524885788,-0.9543818777817943,-0.5689323723355806,-0.1477357359256116,0.24749205684476988,0.5595724684534534,0.7447301571552987,0.7793686140477853,0.6637005707267235,0.4216679676291326,0.09716420428807027,1.671822014033297,1.1925637764953112,,, +32.9765625,65,0.6021496055815719,0.04337109930551519,-0.34981889965602253,-0.48879245287647677,-0.3543131091645538,-0.0015891156663120354,0.45506960085532105,0.8737836117897889,1.1241813745479785,1.1233100680684343,0.8585360895396966,0.39115730408230126,-0.16026438191527567,-0.6522833400320802,,, +32.984375,65,-0.9557900414445625,-0.9913223042689544,-0.7507909203001741,-0.2996658265888552,0.24097603831289385,0.7276209524498268,1.0336158520433454,1.0838230641821394,0.8751350290167172,0.47722726116570713,0.01334409768652789,-0.37361562234812173,-0.5604167804513263,-0.47743272790386143,,, +32.9921875,65,-1.0190102203877003,-1.1219415118156344,-1.221177692958868,-1.3145022327438372,-1.3998008512752564,-1.475098781173899,-1.5385955860601543,-1.5886969263709014,-1.6240427161656654,-1.6435311777553223,-1.6463383728256038,-1.6319328679323433,-1.6000852774388776,-1.5508725166697261,,, +33.0,66,-1.4846766906712792,-1.4021786379060766,-1.3043462417974365,-1.1924177146588102,-1.0678801465734968,-0.9324436947043923,-0.788011864849212,-0.6366484054805757,-0.4805413938330475,-0.3219651427571015,-0.16324059522990753,-0.006694899889511274,0.1453791246997284,0.2907629273857072,,, +33.0078125,66,0.42735086419489143,0.5531868640566024,0.6664984785863018,0.7657277198309811,-0.7782340629477098,-0.4868123839300055,-0.22311269900586594,-0.0029650483035066344,0.16085792306138247,0.2595243699466716,0.2887518536784728,0.24909872718420256,0.14591799665548222,-0.011023105888844031,,, +33.015625,66,-0.20823129387100325,-0.42943513622146673,-0.656726589000987,-0.8718165297828258,-1.0573167264878727,-1.1979588293608256,-1.2816653667198614,-1.300398045749268,-1.250724189296938,-1.1340617953544219,-0.9565861170801262,-0.7288042649998362,-0.46482748346074176,-0.18139183612969167,,, +33.0234375,66,0.10330441980495664,0.37086570754971004,0.6039780588093385,0.7876129213955454,0.9100719093618668,0.9637996495096626,0.9459080487521414,0.8583754295899878,-0.25285265898617326,-0.5672828198378844,-0.7904537019895567,-0.8808442710874369,-0.8176055521455323,-0.6038614537068214,,, +33.03125,66,-0.26627548750080204,0.1490494201101835,0.5836996858135142,0.9759983373965382,1.2705619098569132,1.426878702963274,1.4255725534754027,1.271376758710693,0.9923551883894,0.6354921295364666,0.25933798470067987,-0.0751435045881299,-0.314100730940279,-0.41920857982872106,,, +33.0390625,66,-0.3736609424572843,-0.18480788484889177,0.11697339320469763,0.48299804902416876,0.8538485257876356,1.1686251372253333,1.374431513217347,1.4346175095334834,1.3344956953472165,1.0836410147610156,0.714415386376063,0.2769469701467199,1.017308677327681,1.5416349548790942,,, +33.046875,66,1.8636890042951486,1.9168975811405171,1.708137153617321,1.3156194847092995,0.8672281871780997,0.5052456970262899,0.3471400549920125,0.4531607207366498,0.8096264204808088,1.332487222727754,1.8901863709879243,2.339557793457,2.5649223815051263,2.5096692879224887,,, +33.0546875,66,2.1916679592799726,1.6982879489751945,1.1623922649847667,0.7258843938518063,0.5008001046573441,0.5386078331662524,0.8161315130012683,1.2419537986577578,1.6815443578994578,1.9942257284697624,2.0718447152704194,1.8685496761552265,1.4135114719477784,0.8031003149930013,,, +33.0625,66,0.8495581461165709,0.9169377218382032,0.9670970510226258,0.99956266549973,1.0141651351094567,1.011041858035571,0.9906344825043489,0.9536810050900175,0.9012026840783147,0.8344859971229898,0.7550599592087657,0.6646691981610728,0.5652432592366683,0.45886267634912375,,, +33.0703125,66,0.3477224040952409,0.23409325096806569,0.12028198912132118,0.00859083923795917,-0.09872296001517289,-0.19948678994837288,-0.2916508030992717,-0.37332391969731216,-0.442807038984126,-0.4986228838119465,-0.5395419558947475,-0.5646041471870098,-0.5731356289386118,-0.5647607226552327,,, +33.078125,66,-0.5394085450694439,-0.4973143107351894,-0.43901526940730407,-0.36534134931453777,0.7079066526558866,0.5054639849347377,0.2655014314177383,0.004955925571898804,-0.2579342718107146,-0.5049015673155411,-0.718922722519514,-0.8854054166195916,-0.9932049425254525,-1.035400141017299,,, +33.0859375,66,-1.0097744674782163,-0.9189686485737795,-0.7702942881199417,-0.5752214252708914,-0.3485757852705538,-0.10750170785593342,0.1297369208364541,0.3450341097177093,0.5217084884827228,0.6456709751181315,0.7064119496224769,0.6977390841658881,0.6182143667837888,0.47125983131319726,,, +33.09375,66,0.26492460787150196,0.011329524841337923,-0.27417202183096356,-0.5740584311014243,-0.8698552844541287,-1.1434170210276804,-1.3781855405027796,-1.5603379832704447,-0.16865398522930775,-0.5616304037282657,-0.8500108673538314,-0.9986703159759905,-0.9947636326826992,-0.8496859895331498,,, +33.1015625,66,-0.5972548198329317,-0.2883967995658869,0.016832402430341842,0.2586523979672636,0.3869213586617406,0.3689996577076704,0.1948887989969985,-0.12115506057130387,-0.5427845949219444,-1.0171651138279239,-1.483146158897208,-1.880728414626678,-2.160351706373608,-2.290557721978087,,, +33.109375,66,-2.2628342360050766,-2.092886606638618,-1.818138780259793,-1.4918533051456715,-1.174786453935089,-0.9256784638925585,-0.7920603289503468,-0.8028092600159727,-0.9636125516443169,-1.2560465784605372,-1.6404145529999001,-2.0619012126617164,-0.6076469879371889,-0.6131759252722602,,, +33.1171875,66,-0.38025065684231285,-0.007456213186980657,0.3680375240868442,0.6083162616941895,0.6127657958009282,0.3458915408287996,-0.15271357046593875,-0.7789868370428182,-1.3926912434723957,-1.8556356656616764,-2.069346703866582,-2.001869197757773,-1.6963518507815194,-1.2590664013849178,,, +33.125,66,-0.8301452679073416,-0.5450587711240442,-0.4973908610319794,-0.713116203214019,-1.1434291051870007,-1.6780900576860558,-2.1756321969222894,-2.5021489873597575,-2.56803236164429,-2.35259206668344,-1.9098081608341806,-1.3536392482857251,-0.8269120074567361,-0.46231726606502677,,, +33.1328125,66,-0.27740067013790803,-0.17656017934070478,-0.06442175088728119,0.05720583514907379,0.18633854147102907,0.32085179676822684,0.4585176852589795,0.5970439513798378,0.7341141366445292,0.8674281458822142,0.9947425325274889,1.1139097975598014,1.222916013957324,1.3199161178391476,,, +33.140625,66,1.4032662483369904,1.471552569896471,1.523616072305881,1.5585729141753322,1.5758299536162914,1.5750951941472704,1.5563829628751307,1.5200137302405703,1.4666085744369695,1.3970783873822885,1.3126080111929985,1.2146355828752111,1.1048274488480387,0.985049088481468,,, +33.1484375,66,0.8573325557166294,0.7238410087908552,0.5868309490849154,0.4486128302142823,-1.6797436656949891,-1.7306634567827115,-1.7121428431619408,-1.6280712895565324,-1.4869037723481306,-1.301063921677281,-1.0860704100457859,-0.8594475243023967,-0.6394959074817239,-0.44400920767522445,,, +33.15625,66,-0.2890261431327208,-0.18770502295268088,-0.1493992233344732,-0.1789981058985901,-0.27657935419127433,-0.43739698804934635,-0.6522059072793288,-0.9079003484968604,-1.1884217484052069,-1.4758727198120516,-1.7517594733098347,-1.9982760601335543,-2.1995408948609385,-2.342699343728874,,, +33.1640625,66,-2.418815503445326,-2.423490995156669,-2.3571676337048197,-2.225092876016353,-2.0369504672698397,-1.8061820495872374,-1.5490470474432858,-1.2834863940295818,-2.4590859562890364,-2.7734885912915663,-2.958660998245519,-2.987408725817677,-2.8560177816241397,-2.5848283204665066,,, +33.171875,66,-2.215065900388938,-1.8024238594609934,-1.408396375103572,-1.09071208981704,-0.8943582578676081,-0.8445933701503632,-0.9430364784364288,-1.1674422084000355,-1.4751963664246734,-1.8099875247682773,-2.1106152768961524,-2.320563040493069,-2.396844187838268,-2.3167434517272274,,, +33.1796875,66,-2.081403363694722,-1.7156968719728583,-1.2644057227835581,-0.7852995758222201,-0.3401935435810547,0.0146232914419685,0.2370978594688311,0.3059052508495964,0.223712134837581,0.01670344866797918,-0.2695536294390588,-0.5772639246775146,-0.851268431757398,-1.2989519219166268,,, +33.1875,66,-1.696073512559404,-1.9135180177937658,-1.8707153855784244,-1.5579503684388787,-1.0392549356742533,-0.43508854436334204,0.11044906697092616,0.46888870172553454,0.5623852755464579,0.38484546609584214,0.003400924524525173,-0.46017487817717817,-0.8630113668318411,-1.0804519550762364,,, +33.1953125,66,-1.0403560883421108,-0.7429898011890427,-0.2610522822787009,0.2801697521966132,0.7370815126801569,0.9870989765298804,0.9622313249849346,0.667723156889688,0.18064711849913,-0.3711676288678133,-0.8440965288452076,-1.1179892434469405,-1.1289860296988286,-0.8868879723616785,,, +33.203125,66,0.31151072701987953,0.1778217705799955,0.04977605944587876,-0.07050225102417507,-0.18103199999627728,-0.2800095644803875,-0.3658402898726024,-0.4371662574715395,-0.4928899028520969,-0.5321930716393298,-0.5545511791161755,-0.5597422258328049,-0.5478505114588931,-0.5192649819549899,,, +33.2109375,66,-0.47467223911228595,-0.41504433497120163,-0.3416215649538945,-0.2558905611095747,-0.1595580691779298,-0.05452086874843193,0.05716763667269059,0.17333357455429071,0.2917208700097053,0.4100309540663519,0.5259632181244691,0.6372555061273649,0.741723935292988,0.8373013480317267,,, +33.21875,66,0.9220737216228146,0.9943138979915886,1.052512042852728,1.0954023007446037,-1.027869340834944,-0.7997107449239674,-0.6144482862547282,-0.4843648874962099,-0.417731482542936,-0.4182299134971671,-0.48469620081904385,-0.6112020898727775,-0.7874691871873616,-0.9995868063779676,,, +33.2265625,66,-1.2309834642160749,-1.4635842786640054,-1.6790735563681434,-1.8601745210709142,-1.9918569383279139,-2.0623884191463513,-2.0641560851386194,-1.9942012904686797,-1.8544301045629696,-1.6514848690799409,-1.3962857762879888,-1.1032744257840712,-0.789412097809006,-0.47300258518545046,,, +33.234375,66,-0.17242165937483844,0.09515824373263826,0.3149591998748408,0.4756217836642953,0.5699904754389842,0.595605733570256,0.5548684336435734,0.4548652232213928,-0.8454621291734838,-1.019563192919296,-1.0599174432877714,-0.9480376611618089,-0.6895279562374255,-0.31325800697674966,,, +33.2421875,66,0.13308895296933596,0.590401198689503,0.9973065725957464,1.2996957557273556,1.459117627018873,1.45873924672127,1.305942304526397,1.0311517424274,0.6830791014274169,0.3211215468605597,0.006100524625596737,-0.20921740885398987,-0.28834113349698953,-0.2167364980965617,,, +33.25,66,-0.004083933187760236,0.3172394466021601,0.6972167652932382,1.0759996057841508,1.39325125110141,1.597569563179896,1.6545216931609028,1.552039013774507,1.3023318066699459,0.9400252879307929,0.5168070863977128,0.09341963499719314,0.3444801226352559,0.48856167005015977,,, +33.2578125,66,0.35995079336367697,-0.024941328179086564,-0.5797544211886172,-1.1716243420609822,-1.6573709059695756,-1.9225124714764532,-1.912416710109653,-1.6470522136740562,-1.215300078065714,-0.7503865476260433,-0.39317188387797264,-0.25335877770059634,-0.37925370781094825,-0.7443704190714611,,, +33.265625,66,-1.2545486356115012,-1.7736383604413444,-2.1607116772002266,-2.308604450033555,-2.1732256454846235,-1.7856021231005486,-1.2433582302940427,-0.6839656345990484,-0.24709484958194516,-0.036386601196251256,-0.09111997904841462,-0.3755417020095786,-0.7887802482407044,-1.1926267151849332,,, +33.2734375,66,1.1219851791030997,1.1315452692924826,1.1236639941686535,1.0982271588326085,1.055427172225194,0.9957599005318575,0.9200162073575845,0.8292683286697391,0.7248513209470938,0.6083399072446662,0.4815211264610503,0.34636326458574673,0.20498161180403468,0.05960164491488419,,, +33.28125,66,-0.08747972039287191,-0.23393412907505956,-0.3774423378154498,-0.5157346077440463,-0.6466302316488348,-0.7680755036874387,-0.8781794668870173,-0.9752468126195295,-1.0578073561138608,-1.124641572017177,-1.1748017430028341,-1.207628351240755,-1.2227614258373687,-1.220146647674712,,, +33.2890625,66,-1.2000361048722668,-1.1629836857644782,-1.109835190176727,-1.0417133322683045,0.3068669866694908,0.12553540992652917,-0.07210700951300877,-0.26787166618288283,-0.443679936352257,-0.5828316509763972,-0.6711774799902521,-0.6981134565511283,-0.6573282725347888,-0.5472512166220275,,, +33.296875,66,-0.37116950150995986,-0.13700678138502087,0.14322171279796347,0.45423944207249833,0.7785663517588411,1.0977304406574622,1.393548636851048,1.6493876765609259,1.851317076609455,1.9890738153059662,2.056771466344619,2.053304349938605,1.9824185323607901,1.8524447362567495,,, +33.3046875,66,1.6757117995999637,1.4676815969215666,1.24586575918391,1.0285997439012573,0.8337597538732517,0.677511987586295,0.5731814490129801,0.5303192065970814,-0.2697555337669111,-0.522055290248602,-0.6303769857641004,-0.5842839283306646,-0.39757932588151135,-0.10610382768607274,,, +33.3125,66,0.23790000609114026,0.5739782546070185,0.8429351946941517,0.9961066433863337,1.0029924235871532,0.8560588699585877,0.5719630776316967,0.1890079345592216,-0.23877593907493602,-0.6499998353072562,-0.985434820452105,-1.1971955962929224,-1.2561601516597531,-1.1564697669000235,,, +33.3203125,66,-0.9164086692293439,-0.5755265095394293,-0.1884520146905307,0.1836384814959618,0.4825686788899375,0.6622389187234515,0.6958179392717169,0.5799295564145645,0.33518212276800197,0.0029582714605663474,-0.36103504803483505,-0.6954516119407821,-1.1927570878131109,-0.6879482320717397,,, +33.328125,66,-0.05208122194173029,0.5739429869929626,1.052571580178176,1.2870599450949476,1.247743010707615,0.9799198343267895,0.591192683608286,0.22173276945713127,0.005624059884979937,0.03388179714037587,0.3292832970184818,0.8399111408538461,1.453180270850162,2.026506364309647,,, +33.3359375,66,2.4262118588994457,2.564008164685135,2.4210567357701818,2.0530157664160615,1.5746903655819535,1.1284939484797945,0.845365246145143,0.8088528199728121,1.0322106437218825,1.4547821641488032,1.958663650267009,2.401079490738503,2.6535957233093366,2.6374237295582557,,, +33.34375,66,-0.9599978976551489,-0.8663014023695541,-0.7624406799834845,-0.6504048945034187,-0.5323205392414526,-0.41041403463288545,-0.2869725800097592,-0.1643039449216333,-0.04469590414250846,0.06962397324180258,0.17652747648448908,0.27402316191730997,0.36029136265860523,0.4337161861949887,,, +33.3515625,66,0.4929139394703072,0.5367574836818616,0.5643960922552228,0.5752704642066468,0.5691226299415724,0.5460005759654087,0.5062575074623432,0.4505457615889136,0.379805477999774,0.2952482249237201,0.19833586744153076,0.09075504792794509,-0.025612274548178215,-0.14872171005395635,,, +33.359375,66,-0.27640217307429377,-0.40639384155857616,-0.5363876751106508,-0.6640658003976478,0.5540331519585472,0.6446289334306982,0.7975861092927824,1.003871188838565,1.250565736368362,1.5217657420417507,1.7996895464195117,2.0659170615710365,2.302673875099927,2.4940706927525844,,, +33.3671875,66,2.6272116888439117,2.6930944743764713,2.68723892305516,2.6100010021950317,2.4665497202979427,2.266508794224997,2.023288018256791,1.7531509546378914,1.4740839515550144,1.204545347835855,0.9621820778724294,0.7626031628448923,0.6182956067793689,0.5377582849413279,,, +33.375,66,0.524914210145611,0.5788421497548526,0.6938462962172528,0.8598591198734612,1.0631492983881812,1.2872853426828734,1.5142877082547452,1.725889036651441,-0.9428732659634729,-1.0587693506778155,-1.0184526544400696,-0.8209483709681552,-0.48917333494316195,-0.0663974835865227,,, +33.3828125,66,0.39046146323722664,0.8196658865068578,1.1642339133914774,1.380771570548194,1.4461860089408547,1.3612344114641037,1.150356066089159,0.8578140147995644,0.5407475013730784,0.2602176087046387,0.07164105469485005,0.016102418647375605,0.11389825401651721,0.3613189177628563,,, +33.390625,66,0.7311696561413126,1.1769500773367345,1.6400413262955984,2.058781808086769,2.378018149679839,2.5576440627079133,2.5787974015372197,2.446750450148315,2.1900435076652367,1.8559969565186436,1.50330105443205,1.1928378370963635,1.2522567538795228,0.7174514084087715,,, +33.3984375,66,0.36562929377487996,0.2724255338382847,0.4413982914540563,0.8032739673063951,1.2351597803458345,1.5944560274220032,1.7581715427887277,1.656865006882415,1.2939076508945433,0.7447858920821468,0.13663293397982962,-0.3864029244200722,-0.7024637121164196,-0.7451903546171305,,, +33.40625,66,-0.5217346485111024,-0.11063970100284115,0.359828804304804,0.7469604728280415,0.9328174710913587,0.8566419905473801,0.531571243551165,0.041078364544358564,-0.4838856864790884,-0.900784638783931,-1.0945867141728194,-1.009338101216583,-0.6635662788837606,-0.1452909211086189,,, +33.4140625,66,-0.7871420566563951,-0.9034019913847299,-1.010741605914047,-1.1072041724544222,-1.191014477968103,-1.2606098952735612,-1.3146677373457634,-1.3521284158442346,-1.372213998372143,-1.374441839532433,-1.3586330470998913,-1.3249156350648674,-1.2737223083301563,-1.205782917841257,,, +33.421875,66,-1.122111718245172,-1.0239896511812905,-0.9129419643990779,-0.7907115585697326,-0.6592285284604205,-0.5205764317714374,-0.37695587623982074,-0.23064606255349784,-0.08396495642374036,0.06077121284347853,0.20128841814693416,0.33539455624902925,0.4610177298296294,0.5762424196666914,,, +33.4296875,66,0.6793429136305255,0.7688134072132063,0.8433942485943929,0.9020938687648556,1.904814631187019,2.0359938596587717,2.107617993134889,2.1119706981126893,2.0459732526877676,1.9114064503513855,1.7147937004650695,1.4669534601390832,1.1822521907215022,0.8776099154057458,,, +33.4375,66,0.5713277063662565,0.2818188472487373,0.026332133943863023,-0.18024367511809003,-0.32641090658859495,-0.40485763624545335,-0.41296057154163934,-0.3529611013237838,-0.231802252194671,-0.06063793671417256,0.14595126958338242,0.3709811211256731,0.5962541141840146,0.8036342925176879,,, +33.4453125,66,0.9763175370546529,1.1000087453056064,1.1639237996774676,1.161546442432857,1.0910872668174338,0.9556128068963847,0.7628357143749036,0.5245806448456947,0.9781648610053312,0.8971431697721861,0.9660136310894866,1.1768444267089357,1.4987473841403878,1.8826738022921232,,, +33.453125,66,2.2690428782167302,2.5970146290783,2.813963043946429,2.883673992081704,2.7919910192547825,2.549029647354534,2.18761524528879,1.7581877170467959,1.320966544233963,0.9365964145552116,0.6567303050352735,0.5160166116845023,0.5267382115478028,0.6769382734140136,,, +33.4609375,66,0.9323245375956446,1.2416552534094338,1.5447676621454796,1.7819983098969472,1.9035276778142958,1.8771933948130504,1.6935548147929351,1.3674198470643968,0.9355959449451052,0.4512152597919959,-0.02448244397721433,-0.4316295521515613,1.103417178805071,1.0729287229016307,,, +33.46875,66,0.7969665828252053,0.36647788079718724,-0.08443423388507332,-0.4154727316642529,-0.5188135590118563,-0.3488777137415876,0.06495320745364763,0.6261650830279976,1.197339675282563,1.63759709685871,1.8409925910242673,1.76534628295932,1.4436065255571653,0.9746343930927591,,, +33.4765625,66,0.4959368164139183,0.14582306679968504,0.025357900614843998,0.1705402540635782,0.5423336960702738,1.0372820398894937,1.5158015538288105,1.8403963920362993,1.913324009115282,1.7033878603810244,1.2545143668953278,0.6737633026548157,0.1020572363266562,-0.32434835511471205,,, +33.484375,66,0.9442060127777587,0.9693219704828172,0.977337592657689,0.9684549697625978,0.9431787440021855,0.9023071193532004,0.8469177270571479,0.7783485941577345,0.6981745484181673,0.6081794728524693,0.5103248957921453,0.4067154665700128,0.29956192143648575,0.19114218828240226,,, +33.4921875,66,0.08376131131571324,-0.02028910247783261,-0.11877120489468385,-0.20954028995879426,-0.29058254953107476,-0.3600505398813458,-0.416295738082165,-0.45789761804990853,-0.4836887369961645,-0.49277539290220906,-0.48455349119048374,-0.4587193426405044,-0.4152752033561017,-0.3545294596537326,,, +33.5,67,-0.27709145450713435,-0.18386104601005515,-0.0760130805579613,0.04502294750687108,0.2559630904285281,-0.02566158634240314,-0.30190563718952196,-0.5546287358100035,-0.7672008690648534,-0.9256602508863832,-1.019685517766285,-1.0433144146068467,-0.9953588569284132,-0.8794874272534474,,, +33.5078125,67,-0.7039695535225209,-0.481099208564157,-0.22633831682071112,0.042760400572362176,0.3077760316375795,0.5507022776535915,0.7552010058213499,0.9077391414081563,0.9985296261604812,1.022210833646579,0.9782170711519265,0.8708143400160953,0.7087988696000578,0.5048794566490052,,, +33.515625,67,0.27478669172392084,0.03617120007736051,-0.19263226234253028,-0.3938886621326063,-0.5517049510475271,-0.6531440978538218,-0.6891331906847256,-0.6551022708162952,-0.720996813201472,-0.8616030315290022,-0.8454832820134768,-0.688873257635838,-0.42962556251625295,-0.12126065010111373,,, +33.5234375,67,0.17542073049710155,0.40185691875580665,0.5108936189609488,0.47417282898378277,0.28659133854229946,-0.03286584142665505,-0.4440471173538046,-0.8918561303135659,-1.3148048249144992,-1.654565719592922,-1.8650356782076658,-1.9194995493261189,-1.8147779751310074,-1.5717133827367535,,, +33.53125,67,-1.2319184973078001,-0.8512938272459424,-0.49132380032759126,-0.2095071954025055,-0.05041233147509827,-0.03875014611899352,-0.1755439780112399,-0.4379925206642491,-0.7830471643452542,-1.1541463891547383,-1.4900581271022528,-1.7344526669423832,-0.1334783420699036,0.2732953409141088,,, +33.5390625,67,0.6480924500438057,0.8576611862691614,0.8130086675346897,0.49401331227455725,-0.04482971208673453,-0.6891066756637988,-1.2956008832154051,-1.731299980873865,-1.9096064139728366,-1.8138290130417998,-1.5015195292808428,-1.0884677286764428,-0.7167435763141741,-0.515547181153023,,, +33.546875,67,-0.5655982551138216,-0.8768266548921099,-1.3854800201362356,-1.9714427358313802,-2.4910209730104564,-2.8162096051316046,-2.869680130049581,-2.645901282284508,-2.2126044369937987,-1.6921926072452926,-1.2281884890057237,-0.9459171479528746,-0.9181988455702459,-1.1454541666956382,,, +33.5546875,67,0.17758769376068695,0.3198207849931895,0.4696931594095153,0.6250423595941845,0.7836101603937933,0.9430818729924544,1.1011266370974593,1.2554379958631077,1.4037740432184005,1.5439964407584923,1.674107621153329,1.7922855267756121,1.8969152754179603,1.9866171987658094,,, +33.5625,67,2.0602707628111645,2.1170339514972545,2.1563577743218616,2.1779956440075274,2.182007460169281,2.1687583276092375,2.1389119318118244,2.0934186877702152,2.033498869783811,1.960621017756985,1.8764759982322343,1.782947174473337,1.6820772080532875,1.5760320733660218,,, +33.5703125,67,1.4670629152978347,1.3574664180499383,1.2495443791712786,1.1455631967871223,-0.5513093352856206,-0.3828288298011604,-0.15920441891479165,0.10620976891082501,0.39717350037001353,0.6956859584016319,0.9832339557295872,1.2420758157691232,1.4564714087419703,1.6137725857377268,,, +33.578125,67,1.705297988422715,1.726931248299052,1.6794008783414947,1.5682223563871054,1.4033064560145339,1.1982611541380561,0.9694358122651299,0.7347743002071434,0.5125570538712432,0.3201198034436784,0.1726383348056093,0.08206404198055905,0.056284512853886914,0.09856769772992247,,, +33.5859375,67,0.20732843468282325,0.3762336262130881,0.5946387459643278,0.8483252490115631,1.120487475685531,1.3929002403135993,1.647185695894934,1.866091142225446,-1.8447148736355419,-1.7986229602671422,-1.5978533321117223,-1.26776536597363,-0.8534993962609853,-0.4129954067236208,,, +33.59375,67,-0.00801953439961356,0.3054042211749586,0.48566705383855113,0.5120025840566311,0.3876674833567099,0.1393803815742236,-0.18689325950440286,-0.5331534891633338,-0.8384517814793823,-1.0484350598627754,-1.1238610256049364,-1.046758215952798,-0.8232710720252296,-0.4827466343968452,,, +33.6015625,67,-0.07320488208344758,0.3461019898985345,0.7138826320462773,0.9763202674279843,1.0954254493427669,1.0549270246116889,0.8627838971499001,0.5499264959307065,0.16542407561521258,-0.2311693463854726,-0.5790981906314226,-0.8258717022967057,-2.40829430598747,-2.585866797649489,,, +33.609375,67,-2.489632515949542,-2.1254554876809353,-1.5709912578047984,-0.954608039152153,-0.4204196288451192,-0.08901154122244348,-0.02462209107662794,-0.2177709956921553,-0.5880943252602272,-1.006606659742061,-1.331286898226213,-1.4462325755913514,-1.2936495623642505,-0.8899076912223783,,, +33.6171875,67,-0.32125998477145323,0.2796031462966997,0.769740691073808,1.034972715696416,1.0210264699303369,0.7482820202908007,0.30607721285934036,-0.17186623888013047,-0.5441598036512107,-0.70054471020171,-0.5921347107440151,-0.24481623749924875,0.2478665795807451,0.7503917749248249,,, +33.625,67,1.0477139795080181,0.9580739776183985,0.8785700109956813,0.8109445342473136,0.7567249333822724,0.717196591732553,0.6933801968542581,0.6860136858674051,0.6955391454748359,0.7220948961452357,0.7655128991628163,0.8253215320470827,0.9007536838399144,0.9907600286066985,,, +33.6328125,67,1.0940272448224455,1.2090008617138914,1.3339123326039712,1.4668098612900367,1.6055924417709206,1.7480465153624716,1.891884603420355,2.0347852392813803,2.174433500289352,2.308561430261559,2.4349876446597025,2.551655425050647,2.6566686358781855,2.7483248347033147,,, +33.640625,67,2.8251449962085804,2.885899329547226,2.929628737028735,2.955661538440407,2.0346886812104144,2.1414130722143025,2.1788654224136885,2.144326675438727,2.03994509751558,1.872584692737647,1.65334512279072,1.3967866126977124,1.1199138955934882,0.8409900517150428,,, +33.6484375,67,0.5782629579555888,0.34869315747669594,0.16677185900132574,0.04351148955547879,-0.014320809091999953,-0.00467329211807721,0.06964944756483704,0.20118453349118548,0.37833403888182915,0.5861769064531845,0.8075129305238413,1.0240659939216123,1.2177626461178783,1.3719968545085988,,, +33.65625,67,1.4727927242260628,1.5097840961915174,1.4769427020852524,1.3730040882185055,1.2015615952072898,0.9708218272899232,0.6930386499770689,0.3836651714386575,-0.9354390605135777,-0.8937998914607127,-0.7111763366568445,-0.42040840471806823,-0.0718225990785977,0.27462685956689,,, +33.6640625,67,0.5587200695567334,0.7293784368684224,0.7526512890975853,0.6170380006495824,0.3353165057499675,-0.057406791994774775,-0.5091221828297781,-0.958972109652397,-1.346682476038654,-1.6219010733609693,-1.7519888742946885,-1.727050923668151,-1.561423512853003,-1.2913862830446168,,, +33.671875,67,-0.9694558951196013,-0.6561503464880974,-0.41050697750536447,-0.28083133016951267,-0.2971180644029805,-0.46632470312595875,-0.7712346302869875,-1.173086715597435,-1.6175622609247429,-2.0431970345417274,-2.3909084295798264,-2.6131540856034503,1.112202632084851,0.7180340079046366,,, +33.6796875,67,0.17325824756600725,-0.38410493757297376,-0.8138770650955929,-1.0119542937399577,-0.9386425444569854,-0.6293304252407558,-0.18457682061618264,0.2576681010831958,0.5600929651030946,0.623881309123233,0.4160163661085546,-0.021451052977543905,-0.5827137390414753,-1.127000338031682,,, +33.6875,67,-1.516959583108279,-1.6561184518788457,-1.51514990026913,-1.1397526631192996,-0.6379850558594868,-0.15052560246763724,0.1879876044173644,0.28594202894559073,0.11992291421369872,-0.2588270320241903,-0.7384313768670038,-1.1770439192884907,-1.4417488657272028,-1.4450357171059975,,, +33.6953125,67,2.9636251682054366,2.953452640598083,2.9253836698452265,2.8799604255324476,2.8180179976654385,2.7406697383682697,2.6492877369044745,2.5454787699250843,2.43105614806304,2.3080079518546572,2.1784622131829807,2.044649651917109,1.908864620235663,1.7734249384873444,,, +33.703125,67,1.6406313258626362,1.5127271362335573,1.391859104171901,1.2800397884729446,1.1791123707710125,1.0907184256067899,1.0162692262646382,0.9569210887854913,0.913555185852982,0.8867621839732528,0.8768319729172248,0.8837486672211955,0.9071909672274898,0.9465378732958689,,, +33.7109375,67,1.0008796530834232,1.069033869803229,1.149566190753089,1.240815611702657,0.06028282843067696,-0.25861775969244727,-0.5549191690635051,-0.8121333727110169,-1.016544182229759,-1.1581562798145817,-1.231384678104272,-1.23543654632063,-1.1743587936705262,-1.0567481089512443,,, +33.71875,67,-0.895143693431609,-0.7051450509674186,-0.5043163720124395,-0.310953929645714,-0.14280245834684402,-0.015810043756002257,0.05699163394675877,0.06640360184722949,0.007708527860429637,-0.11899298274274905,-0.30878219518252936,-0.5522581868088385,-0.8361865119262605,-1.1444153716536531,,, +33.7265625,67,-1.4589954162723293,-1.7614251071358793,-2.03393480907349,-2.2607200828942178,-2.429038189521541,-2.5300913553798443,-2.5596352178859845,-2.518270033330581,-2.6812957016230325,-2.590021306266595,-2.3581373971294033,-2.0256077576569016,-1.647300343117655,-1.2844163452489235,,, +33.734375,67,-0.994936539823757,-0.82457306565351,-0.7996360403753762,-0.9229261522965014,-1.1732930353053608,-1.5089282480068047,-1.873879972924103,-2.206774730625615,-2.45038762831786,-2.5605704778571106,-2.5131471125665903,-2.3077018314828344,-1.9676707914766465,-1.5367219837681807,,, +33.7421875,67,-1.0719874851845437,-0.6352019314533821,-0.2831272596576597,-0.0587549182507211,0.015344366742570115,-0.05951231207728214,-0.2583758630645622,-0.5366038337116018,-0.8368681415978889,-1.0981401359305345,-1.265253240393085,-1.2975534605032562,-0.06298037603802917,0.5079576565455193,,, +33.75,67,0.9115035931446371,1.0634073833161588,0.9497477066648297,0.6305512038486077,0.22313230690238628,-0.13027842465852302,-0.3017434062599492,-0.2129164944158466,0.14324553379679972,0.7003110974761665,1.3363389421827645,1.9070587548320865,2.2851756113168658,2.3950282111074213,,, +33.7578125,67,2.233104185938258,1.8687918474940248,1.425164245807307,1.045063844832305,0.8517846552246149,0.9151291977723034,1.2321444357453017,1.727817581552228,2.27554210156867,2.731745636528419,2.975190002694095,2.9401727598032315,2.6345310232423964,2.1375132383362483,,, +33.765625,67,1.3409236553947708,1.4478670328407974,1.5594931954404363,1.6735581553426626,1.787765911746037,1.899808792703417,2.0074080059810724,2.1083536888409578,2.200543755396486,2.2820208612435375,2.3510068380233187,2.4059339948886005,2.44547273868661,2.46855502913815,,, +33.7734375,67,2.4743932582174257,2.4624942230524924,2.4326679475844735,2.3850311984109753,2.320005633146944,2.238310613616239,2.1409508096052288,2.0291988101230687,1.9045730465312078,1.76881141399143,1.6238410530003935,1.471744820019595,1.3147250341721637,1.1550651346818763,,, +33.78125,67,0.9950899203058571,0.8371250668397282,0.6834566314206185,0.5362912525712653,-2.411394350773456,-2.2488243922129243,-2.044105689958952,-1.8135649913027219,-1.5751685518173437,-1.347266439025085,-1.147310416221022,-0.9906348178311953,-0.8893854342669796,-0.8516711022620947,,, +33.7890625,67,-0.8809971659094045,-0.9760203170390608,-1.1306419119659727,-1.3344332577619935,-1.5733632110973985,-1.8307773506348568,-2.0885604401351245,-2.3284011171438643,-2.533070612812957,-2.687626329168332,-2.7804563392532593,-2.80409196777336,-2.755731781554209,-2.6374404426966733,,, +33.796875,67,-2.456008549427506,-2.222483229336433,-1.951402208469013,-1.6597847566479687,-1.365949862536509,-1.088244039148251,-0.8437674616827824,-0.6471872552647743,-1.1752901040712977,-0.9027510338717942,-0.5076538263369893,-0.036887372329723556,0.4507331046154637,0.8935694583284903,,, +33.8046875,67,1.2367048396017104,1.4404424423100535,1.4864353237133403,1.3804928104719492,1.1516266311307182,0.8474855867882901,0.5268900632626559,0.25062938911860544,0.07195559997058398,0.028254439717565916,0.13519105164937117,0.3842423485472317,0.7440005392434257,1.1650448923761094,,, +33.8125,67,1.5876230265383517,1.950945397192136,2.2026453661588983,2.30693142830526,2.2501618523260927,2.0429734441037106,1.718632833617099,1.3278670274538658,0.9309783213107837,0.5884716220258838,0.351653909008775,0.25466988537602075,0.821049667446109,0.8035339039282625,,, +33.8203125,67,1.0347436060084627,1.4318894984255952,1.8646847674383231,2.191232665465303,2.297110414999148,2.1269359197391653,1.6997639147926216,1.1040899574312477,0.4738294611969619,-0.04814691293159512,-0.34892980474492774,-0.37627595523900315,-0.15268816514329986,0.23098633294733684,,, +33.828125,67,0.6406824855882869,0.9360805132366693,1.0092730429684074,0.8145369043963149,0.3810482727157526,-0.19494531052365782,-0.7763521101331319,-1.22267580936311,-1.428407643362908,-1.3518498971337705,-1.02647189665152,-0.5516867437216361,-0.06557699888853413,0.2929554379345263,,, +33.8359375,67,0.3977177427571008,0.2696707458372206,0.1538970956339354,0.05192546455253244,-0.03496016643445954,-0.10574275202871675,-0.15968975171288835,-0.19636571622217636,-0.21563967112754312,-0.217687168378902,-0.20298697002161847,-0.1723124222902782,-0.12671767125274902,-0.06751896150887238,,, +33.84375,67,0.0037286544678075684,0.08525878838635709,0.1751248884239479,0.27123456578265426,0.37138647431798155,0.47330909735418153,0.5747007623887829,0.6732701828993468,0.7667768172367138,0.8530703377814466,0.9301285191394051,0.9960928818163797,1.0493014671253,1.0883181693111488,,, +33.8515625,67,1.1119581111552448,1.1193086186136254,1.1097454270923328,1.082943835465745,-0.5097206724123428,-0.43835905258716135,-0.4353866652110243,-0.4982279739274751,-0.619633957626997,-0.7881944798745635,-0.9891409616512445,-1.2053833682577129,-1.4187091814722121,-1.6110607321226587,,, +33.859375,67,-1.7658018036898624,-1.8688851655987295,-1.9098396032322722,-1.8825075986888302,-1.7854822042161684,-1.6222126264916459,-1.4007711418312123,-1.133297578962572,-0.8351600903760227,-0.5238907175215818,-0.2179699596827941,0.06445491394842673,0.3068284488914502,0.49533473731940936,,, +33.8671875,67,0.6198542777246867,0.6746632524222234,0.6588264746128785,0.5762566176538186,0.43543560989924013,0.24881763620320857,0.031955389211216295,-0.19758948835219153,0.30921415660823315,0.5027433737047874,0.8004666232408524,1.1508038491571306,1.4934619122518997,1.768870168922133,,, +33.875,67,1.9275056861657618,1.9376553884365348,1.7904058783993793,1.5010834695944615,1.1069198603147354,0.6613067487345436,0.22553397571978956,-0.14070226700186717,-0.38854305780205844,-0.4875227431543032,-0.43026071477175015,-0.2335584819010572,0.06426855596162762,0.4094087719105739,,, +33.8828125,67,0.7409838616141187,1.0005770772487992,1.1413758268930383,1.1355043974922583,0.9784044703359773,0.6895809341638749,0.3095966403881166,-0.10621599169594279,-0.49634722670702935,-0.8026679730195323,-0.979464868760343,-1.000545333058153,-0.07833188762978988,-0.5669260789421293,,, +33.890625,67,-1.0411342673439345,-1.3640563600888649,-1.4385272391292234,-1.2339016932266125,-0.7946232694113049,-0.22822691768337816,0.3239382410179057,0.7252439053100717,0.8810160400128653,0.764264262049413,0.42285761868758903,-0.03381776910287561,-0.4650603076739718,-0.7376342798302236,,, +33.8984375,67,-0.7625000213907308,-0.5194242160013084,-0.06272336069526013,0.49343562918247863,1.0061508302751363,1.342790635063114,1.4172003641296034,1.2131884350206708,0.7888564849657413,0.26058776764899616,-0.22891698359544366,-0.5497951158742307,-0.6206371757750553,-0.4308002556786059,,, +33.90625,67,1.0388846124078766,0.9778545514931176,0.9004416652276562,0.8075251020424848,0.7002599626838514,0.5800572817476537,0.4485595247682046,0.3076120297895373,0.15923089336735585,0.005567863206266038,-0.15112714794882207,-0.30854527088713485,-0.4643589245423644,-0.6162623920535073,,, +33.9140625,67,-0.762012017891949,-0.8994653223032596,-1.026618348260866,-1.1416405870868909,-1.2429068712784082,-1.329025676186061,-1.3988633350687674,-1.4515637435995168,-1.4865632088793892,-1.5036001830280736,-1.5027197109908559,-1.4842725147508222,-1.4489087300515056,-1.3975664053621082,,, +33.921875,67,-1.3314549645315914,-1.252033922758567,-1.1609872286131646,-1.060193681439557,-0.42147578076258435,-0.621866156672824,-0.7826751972273275,-0.8906949565971808,-0.9365195574016663,-0.9152043381387359,-0.8266135810186495,-0.675432565644706,-0.47084310237372484,-0.2258851666172469,,, +33.9296875,67,0.043450854685824214,0.31933800709962484,0.5833550337640987,0.8177704359943389,1.0067787885449682,1.1376030972837978,1.2013863274680046,1.193809931816952,1.1153962439030547,0.9714736466574866,0.7718069407345871,0.5299186833687894,0.26214881716680477,-0.013481842606787642,,, +33.9375,67,-0.2785250168859266,-0.5153878716400612,-0.7085559741093962,-0.8456710252676319,-0.9183882249090778,-0.9229534933452817,-0.8604603096071839,-0.7367682680174515,-0.8633060147025113,-0.5891310169081958,-0.2200579128475979,0.18776914298836866,0.5728394968571573,0.8778479800049394,,, +33.9453125,67,1.0586079516495737,1.090917211443509,0.9743074638769091,0.732093440181408,0.40771415048337556,0.05793627790507608,-0.25602151778990134,-0.4780607729547458,-0.5659807591586334,-0.4980940316502814,-0.27664935761244924,0.07247135096845281,0.5037351432576918,0.9589991985958058,,, +33.953125,67,1.3765146266846475,1.7004907846570747,1.8897306995209073,1.9239928695286466,1.807088849836747,1.566234448409433,1.2477558783893494,0.9098199466683194,0.6133208777521411,0.41234348148390565,0.34568835426810385,0.4307793788834101,0.8236283178492916,1.0328863668431467,,, +33.9609375,67,0.9736881200813324,0.6412484283494709,0.10402344091750315,-0.5148888427646423,-1.07130785821764,-1.439293594189751,-1.545457980954101,-1.388862668889021,-1.041051756959317,-0.6262125284499666,-0.2869036330788135,-0.14474573022587134,-0.2668502723324899,-0.647189461747874,,, +33.96875,67,-1.2080154733410113,-1.8209420995758323,-2.3419130417316483,-2.6504750857660913,-2.6825944709728615,-2.4480242683759412,-2.0274645655058388,-1.5502952991643715,-1.1589858774577169,-0.969937057391003,-1.041488177694112,-1.3578588498316533,-1.8334268578174748,-2.33617027128818,,, +33.9765625,67,-0.9516939421715334,-0.8376547152525573,-0.7203307288753055,-0.6020251793030389,-0.4850493319356206,-0.37168198652839773,-0.2641295163644801,-0.16448718111818872,-0.07470239084266284,0.003459435644974307,0.0684458201522613,0.11894444033017704,0.15390613417508503,0.1725632909975826,,, +33.984375,67,0.1744433068254343,0.15937686863767508,0.12750092237162103,0.07925627273826408,0.015379856879045195,-0.0631081728352767,-0.15492233067371208,-0.25853433095251266,-0.37219987840266777,-0.49398924637869474,-0.6218211074533981,-0.7534990240052235,-0.8867499598113074,-1.0192641382763195,,, +33.9921875,67,-1.1487355493452447,-1.272902395776835,-1.3895867705303377,-1.4967328704610585,-0.5620890450173366,-0.35026866122516026,-0.11781610251508885,0.11725394842652576,0.33668355546878564,0.5232510981681272,0.6619787228499954,0.7411834605211505,0.7532986977870181,0.6954087006785874,,, +34.0,68,0.5694589008094233,0.38212726318699297,0.14436568871026917,-0.1293565862131214,-0.4220548498782361,-0.7154061895813975,-0.9910201020674022,-1.2317138535302679,-1.4227036712919956,-1.5526287184800507,-1.6143364634559838,-1.6053746942345584,-1.5281558844856278,-1.3897824653941182,,, +34.0078125,68,-1.2015452034674945,-0.9781296793735439,-0.736586217569493,-0.4951351113837971,-0.27189047312763104,-0.08359171288563294,0.05556888288959494,0.1349407037083774,0.6609027239350648,1.006207635409822,1.4183133826489405,1.8378050309813374,2.2034507496479785,2.4617052106221315,,, +34.015625,68,2.575019057918268,2.527660371034887,2.3281415484658483,2.007873742511463,1.616258536198145,1.2129814517420887,0.8587076891833021,0.6056293343713455,0.4893363889469028,0.5232777617390866,0.6966749397242582,0.9762132626190283,1.3112473226114771,1.6417096466352095,,, +34.0234375,68,1.907490747835294,2.0578294395942027,2.0592506879308257,1.9008144880689013,1.5958580554956407,1.179959789684846,0.7054419316513892,0.23326793829092562,-0.17640363060002184,-0.47353767409882297,-0.6259624001866033,-0.6243252061469923,-2.7601287619815507,-2.376337234938584,,, +34.03125,68,-1.8217298532236008,-1.2307757317649521,-0.7455953504364405,-0.477157995437988,-0.4750343735192285,-0.7139928140635777,-1.1011110067174996,-1.501452399201479,-1.7752682495531031,-1.816527394001325,-1.5822118257658064,-1.104346934052004,-0.48146712327302393,0.14814634332292176,,, +34.0390625,68,0.6441227461731229,0.9022359496046073,0.8827383933131125,0.6210315966130309,0.21775069143618397,-0.18901759849760352,-0.46176754144881865,-0.5014323107937899,-0.2746900099069023,0.17676729518992257,0.7475430712396557,1.2973257394202764,1.6892685086046288,1.8274414645010277,,, +34.046875,68,-1.592443077156382,-1.675011273086316,-1.7429528096416995,-1.7950306022689753,-1.830276895708249,-1.848010318162924,-1.8478479257149583,-1.8297120260152844,-1.7938316616955126,-1.7407387274473307,-1.6712587886808778,-1.5864967624436108,-1.4878177112435047,-1.3768230859856478,,, +34.0546875,68,-1.255322833919411,-1.1253038598920233,-0.9888953930539213,-0.8483318653512697,-0.7059139516956169,-0.5639684538989655,-0.42480773069949124,-0.29068938414890017,-0.1637769081484466,-0.046101988059400245,0.06047088858611571,0.15427689072425832,0.23387980351482562,0.2980969822428262,,, +34.0625,68,0.3460198635462891,0.37702967493642914,0.3908080676595037,0.3873424868408285,0.14816213300293402,0.0936085074519365,-0.025490530735762795,-0.20127248204366133,-0.42178680553591935,-0.6718251194094272,-0.9339789017151225,-1.1898509416879157,-1.4213360698762316,-1.611881863432452,,, +34.0703125,68,-1.747641418550423,-1.8184378077366605,-1.8184729706006484,-1.7467316075120027,-1.6070519130524341,-1.4078582176947891,-1.1615741815178653,-0.8837574590716601,-0.5920161763607448,-0.3047827750438289,-0.04003072435530086,0.18597641554238176,0.3598163518223725,0.47184095131644466,,, +34.078125,68,0.5168456197533656,0.4944284971525573,0.4090144294562477,0.26954205343880205,0.08883582480973484,-0.11729320996230591,-0.33115518135557254,-0.5344204445238138,-0.48349295799152053,-0.2401788483297816,0.05283425186830323,0.33497391390037656,0.5473717788178033,0.6420917149738599,,, +34.0859375,68,0.5896548773519116,0.38368930879410845,0.041979594226376094,-0.39624720547240116,-0.8763768878146662,-1.3368618312548994,-1.7187566553109457,-1.9748508396690347,-2.0769760877303156,-2.020350500306003,-1.8242831434412465,-1.5291294669597728,-1.189971963827859,-0.868010504325709,,, +34.09375,68,-0.6210034911664863,-0.49424880269599947,-0.5135093969848576,-0.680985538578631,-0.9749610617130351,-1.3531788125596853,-1.759419552802472,-2.132259629820454,-2.414643343252709,-2.562779023457331,-2.552973152074908,-2.385337995162715,0.7943819368911514,0.2999878470721805,,, +34.1015625,68,-0.04541126592359823,-0.1495912989197905,0.0114636394173665,0.3870976768711278,0.8660030619996972,1.3068796997533685,1.5773299700426322,1.5903272763534884,1.328261614021577,0.8479701050110049,0.26537180471570254,-0.27608412978909935,-0.64451160274652,-0.7555099485367325,,, +34.109375,68,-0.5950724149682358,-0.22320437972815144,0.2427382234894402,0.6604217557987455,0.9017445623022647,0.8881353717758436,0.6122643468246276,0.14021472696198667,-0.4064816943425674,-0.8840231505678061,-1.1656385547546173,-1.1762401881288198,-0.9129320729970964,-0.4457540185467275,,, +34.1171875,68,0.36692618500531393,0.33015287886048716,0.2779061430288332,0.2113437265715966,0.13187706704659607,0.04114636094276691,-0.05900837287109001,-0.16657972986949915,-0.2794282886704267,-0.3953202924774524,-0.5119669832230191,-0.6270648995519393,-0.738336432887838,-0.8435699313168596,,, +34.125,68,-0.9406586489402005,-1.027637858552171,-1.1027194776788742,-1.1643236015349143,-1.2111063906261874,-1.241983824555267,-1.256150905962557,-1.2530959782158533,-1.2326099060077036,-1.1947899579776988,-1.1400383232422353,-1.0690552876747672,-0.9828271892887339,-0.8826093634923613,,, +34.1328125,68,-0.7699043767136473,-0.6464359293930125,-0.5141188851762339,-0.3750259509632348,-0.7094034923304694,-0.8403021898213393,-0.9143059012510204,-0.9224952228105907,-0.8604705656980379,-0.7286657418282786,-0.5323246698285367,-0.2811428102453854,0.01140168196443092,0.3289804629209739,,, +34.140625,68,0.653546153114197,0.9665832762599674,1.250391768640129,1.4893135727889955,1.6708167984304167,1.7863618659452278,1.8319892507672129,1.8085878607580654,1.7218253490731545,1.5817452392682934,1.402058973550249,1.199182268882374,0.9910829957236782,0.7960209370703384,,, +34.1484375,68,0.631267324736229,0.5118934597303796,0.4497129057651986,0.45245103545418297,0.5231998543050195,0.6601961338553262,0.8569383394519154,1.1026342124403692,-2.0837951662580227,-1.692374445571915,-1.2683841960279632,-0.8735169638797284,-0.5642754402212898,-0.3832098005216178,,, +34.15625,68,-0.35233104749305144,-0.46972604417716324,-0.7099012307459233,-1.0278012443251592,-1.3658762648792693,-1.6630970455964935,-1.864513216004535,-1.9298658218905578,-1.8399123684320489,-1.5994789190172574,-1.2367635783011592,-0.7989995540773946,-0.34515300812461114,0.06320724415872447,,, +34.1640625,68,0.3714463775416731,0.5403214408629962,0.5520433935029941,0.4129993645562796,0.1527113831449945,-0.18080599312726559,-0.5285658461740719,-0.8298353378454338,-1.0316311523986,-1.0970047876375495,-1.0108270454257111,-0.7821706025175091,0.8818564268699107,0.920342780221719,,, +34.171875,68,0.7030997760093545,0.30441261057617763,-0.14983599564352068,-0.5167883817414642,-0.6759054501156715,-0.5621606596929342,-0.18403560759525162,0.3786164233220834,0.9962551228236072,1.5249447325900267,1.8455821157841987,1.896312097504894,1.689248087822002,1.3069174973803972,,, +34.1796875,68,0.8794083089934602,0.5484824103049968,0.4284932999575356,0.5748215729002955,0.968481141184283,1.5211171625263518,2.0990278046629602,2.5596280041968833,2.790363277851636,2.7394100191148096,2.429749637784844,1.95276046435777,1.4430847296322826,1.0416596826055016,,, +34.1875,68,-0.23135159112063367,-0.08537380759251784,0.06058554498780072,0.20420121442173328,0.3431850680658541,0.47532596261033383,0.5985282685173203,0.7108483746759032,0.8105285341894548,0.8960274587758652,0.9660471261809752,1.0195553313196386,1.0558035863821917,1.0743400565807995,,, +34.1953125,68,1.075017305135646,1.0579947119865603,1.023735523977984,0.9729985882632747,0.9068249137736863,0.8265192961472202,0.7336273279564994,0.6299081968714628,0.5173037481414282,0.39790435319943923,0.2739121820980588,0.1476025229575117,0.021283825792314248,-0.10274282958460601,,, +34.203125,68,-0.22222413178952227,-0.33499409480103726,-0.4390120808886212,-0.5323986236999969,1.3829478084172966,1.6809939106055842,1.9785104865721237,2.2571274403417845,2.499643196356614,2.6912201048916695,2.8204153186974317,2.8799752630330575,2.867338305899311,2.784810582662478,,, +34.2109375,68,2.6394027204640946,2.4423388535701744,2.2082721722034218,1.9542617109646794,1.6985817316297036,1.4594467280374874,1.2537409638844004,1.0958411373152193,0.9966142713569192,0.9626607093327856,0.9958550016427634,1.093216696546389,1.2471200415233687,1.4458279676568646,,, +34.21875,68,1.6743131154177577,1.9153086431189568,2.150515535068772,2.361882212479346,2.5328672075257215,2.6495968413263222,2.701837167591051,2.6837123948720323,-0.44291942785698774,-0.04282151995006074,0.3582445708514732,0.6995849826260618,0.9291367038398707,1.0115734036095176,,, +34.2265625,68,0.933808419722816,0.7070377791905087,0.36500501332909446,-0.04124201609638215,-0.45128569592639844,-0.8047288818790609,-1.0505782919640057,-1.1551596875812682,-1.1073321571328743,-0.9201895138156918,-0.6289839866606867,-0.2855957976280399,0.049589771048033526,0.31713240413021987,,, +34.234375,68,0.4678417454436963,0.4704878035289557,0.31671557468127465,0.02239813633443477,-0.3747828166935681,-0.8211524308246024,-1.25534864539013,-1.6178252310313739,-1.8600720575064842,-1.9521167764998093,-1.8871397821726508,-1.6824839313482882,1.2490080355341793,1.7016086594502737,,, +34.2421875,68,2.1571151179303634,2.4757999081880295,2.5529295583793847,2.3475798467391513,1.8939828829043541,1.2922950122057866,0.6813144663424962,0.20062455649840394,-0.04746380010023066,-0.025741564147023333,0.22792228687519883,0.6111901561370787,0.9855409945654445,1.21447701153544,,, +34.25,68,1.2011784637026355,0.9152842994122694,0.4014567103457064,-0.23261985601820123,-0.8455182351201324,-1.3006040580067229,-1.503267800274902,-1.4266510757206103,-1.1188181538524977,-0.6894088597764797,-0.2794324091954429,-0.02248213805387389,-0.008002192417690623,-0.2566746833163873,,, +34.2578125,68,-0.6134684241917763,-0.6807599415869032,-0.7330610611793257,-0.7694303894903108,-0.7892138038566756,-0.7920559666267175,-0.7779066023107346,-0.7470214277398615,-0.6999577189119475,-0.6375645921202778,-0.5609681695143124,-0.47155188882275256,-0.3709323019906495,-0.26093078648131585,,, +34.265625,68,-0.1435416645624411,-0.020897288793366803,0.104769294936006,0.23116345305857927,0.35596915393221795,0.4768895376722428,0.5916871558350036,0.698223176341972,0.7944948671647923,0.8786707024115759,0.9491224760923119,1.0044538612322356,1.0435249142349483,1.0654720954026593,,, +34.2734375,68,1.0697234550190498,1.056008719054288,1.0243640978537938,0.9751317335694369,2.5941196785447462,2.436811346119884,2.220138809822162,1.9564760114126152,1.6613625909282776,1.3524265150350994,1.0481612792056532,0.7666429384913858,0.5242764172123394,0.3346585057837801,,, +34.28125,68,0.20763681559560598,0.148630297781716,0.15825869175919138,0.23230672654313522,0.3620255542702129,0.534750378947516,0.734791194014238,0.9445344975155427,1.1456791414861944,1.320520118559327,1.4531907460478917,1.5307766088884895,1.5442235656588483,1.4889764826448975,,, +34.2890625,68,1.3653041383463638,1.1782876253748902,0.9374730423761953,0.6562126790447858,0.3507406200191497,0.03904721364948002,-0.2603691221611765,-0.5297857306939581,-1.3769020358507174,-1.0244711203055374,-0.6861216000984084,-0.42010101411509915,-0.2728578853109197,-0.2717658336161274,,, +34.296875,68,-0.420821423840952,-0.6999860424884664,-1.068274505596636,-1.47010951061403,-1.843952355845516,-2.131865792542864,-2.288519671482455,-2.288236814295479,-2.128981765326865,-1.832671221919893,-1.4417578383607499,-1.0126195194720566,-0.6067838606568459,-0.2813545573897671,,, +34.3046875,68,-0.08013088370090815,-0.02680336914213788,-0.1212854044191336,-0.3397520482928468,-0.63837987263179,-0.9602052072605445,-1.2440324207921067,-1.4340045521911784,-1.4883454265814915,-1.3859114189305262,-1.1295321734882755,-0.7456197105474964,-1.7754019185144108,-2.103755266742443,,, +34.3125,68,-2.167883054951353,-1.9522232082323216,-1.5155119015643934,-0.9747632722472589,-0.4732974346155575,-0.14157836288105097,-0.061593627982904464,-0.2445370900376802,-0.6279095512733834,-1.0928303522239888,-1.496813554394786,-1.7130238633149157,-1.6652514507188267,-1.3490180812876047,,, +34.3203125,68,-0.8330278869411623,-0.2405630377344052,0.2840789560111157,0.6149099321181385,0.678562165031775,0.47418429783516536,0.0734712603956666,-0.39917808699195584,-0.8009355504070332,-1.0098550779321291,-0.9584454274699724,-0.6523013222050585,-0.16868556962151007,0.3645503684981133,,, +34.328125,68,0.9089537959650091,0.8267613299301952,0.7297580499326898,0.619399365111809,0.49736700223036123,0.36553967077152627,0.2259602837745055,0.08080030830431137,-0.06767813029299016,-0.21716172686214041,-0.3653263664528519,-0.5098776790700447,-0.6485910691294805,-0.7793505187883109,,, +34.3359375,68,-0.9001854857853497,-1.0093052498052972,-1.1051301060478254,-1.1863188598973065,-1.2517921413571567,-1.300751131108701,-1.3326913704032506,-1.34741141307549,-1.345016168285718,-1.3259148755632224,-1.2908137477172579,-1.2407034105432053,-1.1768413593671165,-1.100729739725666,,, +34.34375,68,-1.0140888413523304,-0.9188267697113275,-0.8170058262379873,-0.7108061860913976,-0.7534856718651098,-0.9188480468748427,-1.01722267290124,-1.0445281260567674,-1.0015314606267562,-0.893790109699852,-0.7312600288027691,-0.5275974174073632,-0.2992027202541568,-0.0640735813783018,,, +34.3515625,68,0.1594532547158699,0.3539833569458736,0.5042799737806309,0.5983285952871046,0.628176471607447,0.5904885422127941,0.4867810066502516,0.32331624741837317,0.1106664314142437,-0.13702377866923715,-0.4030239887902013,-0.669185502056763,-0.9172080003955212,-1.1299171464552427,,, +34.359375,68,-1.292464010481884,-1.393362677526505,-1.425293673727151,-1.3856171798301418,-1.2765602368066644,-1.1050648812456945,-0.8823077919225017,-0.6229249348053556,-0.2801065581531925,0.20865469081367938,0.6589247314402875,1.0151370920189016,1.2364952039396895,1.3032682443924655,,, +34.3671875,68,1.2198054322290481,1.013799577947731,0.731914888093492,0.43246031024917797,0.17624987528074176,0.01707387460273546,-0.006734680481051858,0.12167552722896768,0.39499743580931324,0.7828538147047875,1.2364811241548066,1.6962797237366625,2.1010546679250783,2.3975079944103808,,, +34.375,68,2.548504224076182,2.538821853844112,2.377495176104121,2.0963818148405404,1.7451792141801215,1.3836663899133665,1.072379414429707,0.8631730392278875,0.7911385731293894,0.869136869256049,1.0857979358295111,1.4072987197826694,0.9782537619214993,0.66025213392241,,, +34.3828125,68,0.15701885803066348,-0.40135839430787223,-0.8717009725384787,-1.1369036479381747,-1.1379324637681147,-0.8898872665168335,-0.4777277280169336,-0.03283547047549973,0.3031626805878065,0.41739379693450185,0.2568701241409179,-0.15678143013433055,-0.7330304267572083,-1.3370314016394023,,, +34.390625,68,-1.8263528511004596,-2.0897825069891565,-2.077575693017284,-1.814858757708158,-1.3945162566312523,-0.9515134145911802,-0.6256933808654158,-0.5232474345925566,-0.6874199141900845,-1.0864785784540283,-1.6222490482200977,-2.156875842332126,-2.5504770070700213,-2.6993735660272984,,, +34.3984375,68,-0.6024875095386195,-0.49434915927226647,-0.3886897203859267,-0.2877665319241335,-0.19375593874161823,-0.1087149597839534,-0.03454504410189929,0.02704145063387131,0.07455147003773943,0.10673763618655852,0.12262032014749757,0.12150502723584644,0.10299479045102378,0.0669973549536127,,, +34.40625,68,0.013727027645451528,-0.056298840666267336,-0.14226867905943652,-0.24309067187240285,-0.35741164109250945,-0.483640505263247,-0.6199759042812396,-0.7644375065115459,-0.914900450166582,-1.0691323160225652,-1.2248319842140603,-1.379669694861946,-1.5313276112111558,-1.6775401751482233,,, +34.4140625,68,-1.8161335486153611,-1.9450634504310862,-2.062450726129952,-2.166614028126835,-0.3439952644776048,-0.06385434104800891,0.1991794184638756,0.42807704363951765,0.6082811597694346,0.7287155605765407,0.7825518173901451,0.7676794807146132,0.6868471000420662,0.5474642430658697,,, +34.421875,68,0.36107833543402135,0.14256281832289083,-0.09092674782522682,-0.3211558229597526,-0.5300893552109962,-0.7011564084916985,-0.820412746546448,-0.87752028576169,-0.8664750993166442,-0.7860331894895951,-0.6398043205330473,-0.43600735174574445,-0.18690411511356125,0.09204870189577793,,, +34.4296875,68,0.38327054324643367,0.6682761742185425,0.9289580726362607,1.1488426123025348,1.3142324567757002,1.415155516172853,1.4460543082975488,1.4061676674022419,1.7826421209140184,2.151614938420046,2.4541851734572813,2.639874904092922,2.6756487343145743,2.551089007205537,,, +34.4375,68,2.2800515550853055,1.8985439171866423,1.4591563097264837,1.0229125450010543,0.6498099384408493,0.3895214266757223,0.273707842584786,0.31113749245701905,0.4863729191172611,0.7622291191358809,1.0856200520569983,1.3958825304334805,1.6342807109585833,1.753210520276001,,, +34.4453125,68,1.7236700855335991,1.5398323197466441,1.2200071694651142,0.8038433654961312,0.34620524036707334,-0.09132194085286638,-0.4499753096214554,-0.6829202120183299,-0.7625004783831411,-0.6845041060373668,-0.4687801681347906,-0.15611106267814845,-1.6523999187388614,-1.1154530157758602,,, +34.453125,68,-0.7090530642424396,-0.5330185364431971,-0.621435884367581,-0.9333863803952392,-1.3642513829952467,-1.7744968350042127,-2.028047077193888,-2.029729733043693,-1.7515278392719922,-1.2404428337140643,-0.6058117766888428,0.01044697280747009,0.4725067233037373,0.6876269240922745,,, +34.4609375,68,0.6313321162750598,0.35387667521695754,-0.0337742956431709,-0.3906035278307784,-0.5844348364474075,-0.5283994191387723,-0.20497876026888362,0.32896736962428835,0.957567839870756,1.53749230216947,1.9370428481881712,2.0720729993385487,1.9288912368586204,1.5678732711606962,,, +34.46875,68,-2.2560990341043023,-2.3297036921436565,-2.3864990506829233,-2.4258453086981815,-2.4474028051949865,-2.4511377557090523,-2.43732263549209,-2.4065312027946937,-2.359628249508073,-2.297754258746261,-2.2223052381349273,-2.134908082032972,-2.0373918942105425,-1.931755773231466,,, +34.4765625,68,-1.8201336247225535,-1.704756616779765,-1.587913936009926,-1.471912531478089,-1.359036551540147,-1.2515071839155922,-1.1514436023026067,-1.0608257034418425,-0.9814592872003371,-0.9149442894568196,-0.8626466241142524,-0.8256741273736316,-0.8048570255584582,-0.800733268581487,,, +34.484375,68,-0.8135389859382783,-0.8432042324165349,-0.889354098085132,-0.9513151631943079,1.2995781970315334,1.1349221716346947,0.924782129649156,0.6848045271457825,0.4326039929493805,0.18653060652719783,-0.03561382886548403,-0.21782098918670278,-0.3469958672459502,-0.41387314628721616,,, +34.4921875,68,-0.41366619972770147,-0.34640345284561314,-0.2169286441885535,-0.034564962596552395,0.18753352447121735,0.4332979286373404,0.6848642082317616,0.9238183705383957,1.1324803786221243,1.2951372328789814,1.399139240817647,1.435783028098268,1.400919714209626,1.2952458405015523,,, +34.5,69,1.1242567601487123,0.8978657364176221,0.6297153060194624,0.33622892287842027,0.03546900793418689,-0.2541189702508658,-0.5149888126084536,-0.7317128928958758,0.19817254956404873,0.5328394428942733,0.7903210850883639,0.9257007962724455,0.9137285862137704,0.752768978720572,,, +34.5078125,69,0.4650668553598375,0.0932898591849815,-0.30611413467235815,-0.671709883543323,-0.9466484319065407,-1.0875303780279086,-1.071178200253949,-0.8982627451366482,-0.5932189402474869,-0.2004637477136043,0.22249469909960873,0.613983637077099,0.9177377044057425,1.0916257508286213,,, +34.515625,69,1.1141733801941553,0.9878655193655825,0.7387148490738991,0.41216355636694235,0.0659569839959257,-0.23890059510911532,-0.4476991224743758,-0.520596588107873,-0.43887785140390667,-0.2079233176777564,0.14357520619417408,0.5680296331219448,0.4414422917796108,0.4448763580780962,,, +34.5234375,69,0.7066461501643925,1.1612593901083197,1.6877981703054439,2.1430925908095597,2.4010151192246885,2.387125671838505,2.0991714456034893,1.607822129332938,1.0374378315381678,0.5321393259084943,0.21647825197456216,0.1614847554610065,0.3653961299556362,0.7543462879611694,,, +34.53125,69,1.2028251308275468,1.568298475014669,1.7304981514594193,1.6246119027879227,1.259274567436085,0.7144275528421784,0.11963111947181021,-0.3812286630293986,-0.6691675532629555,-0.682516200978816,-0.4336370398927124,-0.005365148961149202,0.47184985868493373,0.8558347367918251,,, +34.5390625,69,-1.0281271850282794,-1.1185598121359877,-1.2211340333359775,-1.3341479859774124,-1.4557066716145837,-1.5837550588222755,-1.7161139935721295,-1.8505182884281963,-1.9846563236572943,-2.1162104668875434,-2.2428976035982533,-2.3625090687886923,-2.47294928065527,-2.572272399823526,,, +34.546875,69,-2.6587163722641534,-2.730733759816868,-2.78701881849966,-2.826530350477233,-2.848509929558662,-2.8524951811070873,-2.838327883830907,-2.8061567515957258,-2.7564348465433834,-2.689911668808789,-2.6076200613315548,-2.5108581590462435,-2.4011666985033493,-2.2803020852065723,,, +34.5546875,69,-2.1502056902377515,-2.0129699137512045,-1.8708016095391318,-1.7259835110679056,-0.8920534305687331,-0.9878110398631035,-1.0153913936547294,-0.9760504980598969,-0.8758014858544825,-0.7249894407449351,-0.5375639143527838,-0.3300998791458315,-0.1206354034326374,0.0725928844766982,,, +34.5625,69,0.23242834788367522,0.34399773628253283,0.3957554906738545,0.38029612083000697,0.29487798854452685,0.14162195519110454,-0.072628975538099,-0.33677924915004953,-0.6362468571410493,-0.9539725339340993,-1.2716016967430006,-1.5707567252561985,-1.8343108783343451,-2.0475750306905103,,, +34.5703125,69,-2.1993144917842464,-2.282525017908001,-2.2949139205044515,-2.2390527381063974,-2.1221908419571864,-1.9557429892367535,-1.7544865741697557,-1.5355245706110145,1.006314306015578,1.396922427446583,1.6854943315985493,1.8332338001584731,1.8229018104146282,1.661454423792279,,, +34.578125,69,1.3789142067045097,1.0236512122972086,0.6548087696681388,0.33305402542434137,0.1110940969431703,0.025435188590935853,0.09066840794374831,0.29717245494899847,0.612591143042192,0.986855742454165,1.3599699918611197,1.6713453043672373,1.8692322225684006,1.918779165373444,,, +34.5859375,69,1.807463294883187,1.5470476167427358,1.1717594637404343,0.7329740309549226,0.2912309666349984,-0.0931726067688694,-0.36954755856449883,-0.5046781051655944,-0.4879621262796375,-0.33302597064190437,-0.07556241416971238,0.2322712863412244,0.6103407747425292,0.11917766781529696,,, +34.59375,69,-0.3966039550339135,-0.7950646757781689,-0.9643193558609929,-0.8532296474529314,-0.48546943729211034,0.04689216140211902,0.6085322283185566,1.0578502210312966,1.2856459118107404,1.2448998397541708,0.9634957401934385,0.5363996575232597,0.09944089190592781,-0.2081175622242396,,, +34.6015625,69,-0.281958858466801,-0.08152166272358063,0.35865880820835516,0.9381884280075449,1.5181008688324056,1.9587170661696676,2.157703446452872,2.0779004195680537,1.7572962532246885,1.2984147933601136,0.8400274554080273,0.5189441940194046,0.4323570922371176,0.6110586180941068,,, +34.609375,69,-1.580834334375242,-1.4376682563917105,-1.2987544781685447,-1.1662775810185777,-1.0422993696816958,-0.9287228705862236,-0.8272591155452397,-0.7393972924397895,-0.666378785493705,-0.6091755596283636,-0.5684732673202514,-0.5446593736915304,-0.5378165076896095,-0.5477211557031622,,, +34.6171875,69,-0.5738477204114847,-0.6153778737189216,-0.671215039919087,-0.7400037554092675,-0.8201535658767685,-0.909867042429739,-1.0071714260219735,-1.1099533459778121,-1.2159960046101035,-1.3230181767244535,-1.4287143410313838,-1.530795240666795,-1.6270281624945069,-1.7152762298056228,,, +34.625,69,-1.7935360202839434,-1.8599728504402129,-1.912953108575179,-1.9510730700016832,-1.3170864983747321,-1.1172510402804903,-0.9526793999274284,-0.8374477407601052,-0.782060137182497,-0.7927108802414622,-0.8708475915320066,-1.0130656220311498,-1.2113411103898253,-1.4535864587333733,,, +34.6328125,69,-1.7244895001420004,-2.0065778485336265,-2.281434218278358,-2.5309779725025514,-2.7387235399494503,-2.8909279525111087,-2.977547486708387,-2.992936703400311,-2.9362411425576433,-2.811456291533932,-2.627148716241652,-2.395858802275194,-2.133226754525727,-1.8569028010805413,,, +34.640625,69,-1.5853175944847149,-1.3363985514976662,-1.12632164155649,-0.968385661368833,-0.8720874909404975,-0.8424628104636257,-0.8797382452954153,-0.9793191886246788,0.5300225021778272,0.7584068991774582,0.868592409200653,0.829857230621212,0.6344288247898475,0.29874994079071215,,, +34.6484375,69,-0.13902579789605474,-0.6249189521452754,-1.0974736303241803,-1.497270990010776,-1.7761253937314883,-1.9045311630760309,-1.8762003530106401,-1.7089850546775258,-1.442040859679728,-1.1296735722966587,-0.8328278507074736,-0.6095437319541211,-0.505867743205319,-0.5486344865577953,,, +34.65625,69,-0.7412432362599884,-1.0630875846843506,-1.4727271771827852,-1.9143077101360326,-2.3262294157744927,-2.650714026036778,-2.8427802465984287,-2.8772298807259773,-2.752556574735683,-2.4911684545663597,-2.1358900332789896,-1.743288271586867,2.011614954653601,2.335722966119441,,, +34.6640625,69,2.4030768598923276,2.187545379166736,1.7379470081030242,1.1646943213932626,0.6095798241441286,0.20698373482141563,0.04713494790854922,0.1514934988257025,0.46700052134482556,0.8807704904769769,1.2511977533504095,1.4469505251168018,1.383163661050057,1.0449091135924093,,, +34.671875,69,0.49150966994213197,-0.15948825322631793,-0.7642922223263973,-1.192029807405621,-1.36037092939275,-1.2578456924073926,-0.9467432329358365,-0.5457992632883151,-0.19741926438131885,-0.02842254304179359,-0.11506803240436891,-0.4619491250446601,-1.0005436338458442,-1.607817969348786,,, +34.6796875,69,-1.9731836898643098,-1.9784109393107325,-1.9661713288118479,-1.936182346696971,-1.8884676300005498,-1.8233567769579022,-1.7414798043048338,-1.6437563463077343,-1.531379784519357,-1.405796586020104,-1.26868121179836,-1.1219070344932836,-0.9675137745964177,-0.807672025167798,,, +34.6875,69,-0.6446454861080124,-0.48075156912165584,-0.3183210630470007,-0.15965756567306028,-0.006997392253529466,0.13752933741377232,0.27193575212141397,0.39441277393386553,0.5033605496787193,0.5974162190207483,0.6754775330354614,0.7367219098613434,0.7806205939008132,0.8069476707797616,,, +34.6953125,69,0.8157837803482755,0.8075144628448573,0.7828231673142143,0.742679044836104,-1.1321141428146064,-1.3251729531684096,-1.5425944184464246,-1.7666399772937704,-1.9789757987314176,-2.1619566502446825,-2.299862003077978,-2.379998164439506,-2.393589568137646,-2.336397057294653,,, +34.703125,69,-2.2090200300283875,-2.0168613637573203,-1.7697575488974022,-1.4812998083396298,-1.1678935273030377,-0.8476215662789901,-0.5389907053790111,-0.25964861777262016,-0.02516082480374371,0.1520670974867453,0.2636469196840594,0.3057849961249788,0.2795391025739523,0.19073698166061326,,, +34.7109375,69,0.04956229345393137,-0.1301631386540516,-0.33195071839140694,-0.5378023483136453,-0.7294728658236936,-0.8897495933246693,-1.0036597592151884,-1.0595215765042991,-1.3748623073788753,-1.0874690939206024,-0.924476176520004,-0.9090195609454488,-1.0404167269885511,-1.2942933898244067,,, +34.71875,69,-1.626404156127373,-1.9795518590933925,-2.2925277022711046,-2.5096795727072725,-2.5896180261838966,-2.5117037434063327,-2.2793057886072665,-1.9193229526201514,-1.4780424940625978,-1.0139810503060314,-0.588822522726325,-0.257864138123169,-0.0614584850113602,-0.018784189088831726,,, +34.7265625,69,-0.12491518992050121,-0.3516448032957823,-0.6519359245921944,-0.9673039378765018,-1.2369821126878984,-1.4074416415973947,-1.440783238996261,-1.3206929879050269,-1.0550345101731466,-0.6746734546949329,-0.22871714473823151,0.22308940511682196,-2.528041577607027,-2.3110187748126823,,, +34.734375,69,-1.8919920048914092,-1.3959192804044402,-0.9662162547723132,-0.725438909571657,-0.7417060651351164,-1.0100641223142794,-1.4539010196603788,-1.9460212991216652,-2.3436054561859567,-2.527471294519532,-2.43487577368823,-2.0768660250300277,-1.535422661800564,-0.9411766908506087,,, +34.7421875,69,-0.43780539640945426,-0.14286334730890016,-0.11578160877291654,-0.3418035724844031,-0.7362580110859326,-1.167996101098596,-1.4955668700867255,-1.6062143045211736,-1.4470060425555027,-1.0395601124587621,-0.4743315202145979,0.11397740004530649,0.5831454526996438,0.8222354452561892,,, +34.75,69,0.6883197404376482,0.6212294851313619,0.5431128718233597,0.45586477439629774,0.36153693681734717,0.2623018174204066,0.16041432157120467,0.05817209290817962,-0.04212494142919748,-0.13821506309258585,-0.22791458320076374,-0.30915629402390477,-0.380025878263221,-0.4387956382946636,,, +34.7578125,69,-0.48395495465663685,-0.514236940344668,-0.5286408240872923,-0.5264496705593406,-0.5072431271506751,-0.4709049739849731,-0.41762534488637826,-0.34789758030298845,-0.2625097671933745,-0.16253111391490527,-0.04929339859415949,0.07563218427461216,0.21046237367990667,0.35323290958112297,,, +34.765625,69,0.5018327741349586,0.6540410071763962,0.8075654513981999,0.9600827488821877,-1.049765668444423,-0.9714695453894681,-0.8265678473478463,-0.6217236770507056,-0.36786998206281163,-0.0794529535167699,0.2265698110825523,0.5319065318649988,0.8182017774355584,1.0683117153342825,,, +34.7734375,69,1.2674951651451891,1.4044374079510435,1.472035367552572,1.4678894184686282,1.3944675328233358,1.2589303263294465,1.0726292093788916,0.8503126438983579,0.6090958605199192,0.36726588449343783,0.14300520238505243,-0.046876925780801826,-0.18811703822879178,-0.2699921596233217,,, +34.78125,69,-0.28606724355771807,-0.23464324922986446,-0.1188746087358935,0.0534521033204407,0.2704628599642552,0.5170262440837476,0.7758109944234527,1.028497283061886,0.6196269688451239,0.9078824627063558,1.0511697557221247,1.0348106841866582,0.8683915871655009,0.5842440427564914,,, +34.7890625,69,0.23238656694559356,-0.1272847586520674,-0.43434028984082307,-0.6372400067693988,-0.7013681251926319,-0.6144276712914593,-0.3883547799358965,-0.057454568661941485,0.32695102987132724,0.7045297926290408,1.0153529531776573,1.2092498336619626,1.2536462124119025,1.1386654250544503,,, +34.796875,69,0.8786975224725926,0.51019191025707,0.08601709043282751,-0.33273419741274324,-0.6862182604280971,-0.9251168789781061,-1.0182722657751935,-0.9574916262829827,-0.7587732480260772,-0.4597634204022984,-0.11384056132609477,0.21825173728691677,0.032458787159047445,-0.44775139769320704,,, +34.8046875,69,-0.8127957513565045,-0.9559297227854097,-0.8333264651546994,-0.4761098349349918,0.01817648655536371,0.5123256551285482,0.8671166679777876,0.9795368000109458,0.8111012009503464,0.39850725827576594,-0.1562973452066658,-0.71391203919547,-1.1355291773166152,-1.320802563782797,,, +34.8125,69,-1.2351617344832535,-0.9190877573049456,-0.47681022973383874,-0.0475252734543653,0.23297513312053364,0.2697441269432497,0.03492764865968445,-0.4243770107134983,-0.9988077436249096,-1.5464943620471905,-1.9317321805598175,-2.0619751850123396,-1.9130119918173785,-1.535426442727804,,, +34.8203125,69,1.1092788887136975,1.2528895957722805,1.3887398535560678,1.514781869065397,1.629130815047283,1.73009772381149,1.8162189567129998,1.886281733341249,1.939345273454662,1.9747571815147018,1.9921647869710837,1.991521241774291,1.9730862683857233,1.9374215452245427,,, +34.828125,69,1.8853808103830743,1.8180948569265944,1.7369516825314637,1.6435721410661062,1.5397815224735198,1.4275775586043262,1.3090954152358567,1.1865702832672231,1.0622982241292434,0.9385959550056338,0.8177602780221076,0.7020278637997522,0.5935360935454009,0.49428564532910557,,, +34.8359375,69,0.4061054796458584,0.3306208373453081,0.26922481026920964,0.22305398236488172,1.2570572511305336,1.4450154992227606,1.578601626001092,1.6477144356452946,1.6466305670218815,1.5744081190694326,1.4349571151514382,1.2367718808759711,0.9923439851535845,0.7172966690393671,,, +34.84375,69,0.4293011079323432,0.14685006564172004,-0.1120255570960072,-0.3310077953549062,-0.4966230879852439,-0.599175255552088,-0.6334149446707927,-0.5988988724687911,-0.5000138363851828,-0.3456638316990933,-0.1486421119330114,0.07526800267974873,0.3084008480993784,0.5324474085949424,,, +34.8515625,69,0.7297391620803808,0.8844872349268023,0.9838904390222838,1.0190349071741749,0.9855225756256465,0.8837846709861339,0.7190583247377336,0.501027929929461,0.4779192606129919,0.617897087411709,0.6096647610239181,0.4479414731324961,0.15156082409645488,-0.23941137254717976,,, +34.859375,69,-0.669867602989938,-1.0781935504772178,-1.40581828582993,-1.60629251313975,-1.6524811298111528,-1.5407500534773897,-1.2914954138633858,-0.9459328891685398,-0.5596474532914784,-0.19390836679370704,0.09389769777529766,0.2592251685179324,0.27732427166602014,0.14710858498449242,,, +34.8671875,69,-0.10866702275327322,-0.4469458388619989,-0.8110748897006416,-1.1396322455386878,-1.3760011428860355,-1.477199678141104,-1.4205907541333629,-1.2074271022810916,-0.8626791364184873,-0.431172343021759,0.029364297608155926,0.45725626010585474,-0.256134556098364,-0.18664052474466442,,, +34.875,69,-0.3795502190857919,-0.7786441021893225,-1.2687328485701805,-1.7072053147209005,-1.9631145133685286,-1.953089387971262,-1.6642299287710567,-1.1577104399669684,-0.5521028800959995,0.009009882533450253,0.39625558757664125,0.529780540039563,0.4009684375527601,0.07461903308377965,,, +34.8828125,69,-0.32900887935011935,-0.6673669488870588,-0.8149066144697614,-0.6977183338084026,-0.3140250880043781,0.26508859184582634,0.914914025871894,1.491051992257167,1.8687445352683942,1.9768274717867165,1.8170003655277562,1.4631347267062247,1.040812046290208,0.6927015925878551,,, +34.890625,69,0.19296856777651983,0.17953739366469035,0.18302799067249498,0.20340196451892423,0.24031572972404536,0.29312659257776363,0.36090407679486725,0.44244629349927256,0.5363010688452208,0.6407914592842284,0.754045207646467,0.8740276242040543,0.9985773169111979,1.1254441451143689,,, +34.8984375,69,1.2523287321069494,1.376922844587924,1.4969499319115172,1.6102051152142147,1.714593926125549,1.8081691166786804,1.8891648957897973,1.9560279927437894,2.0074450036788076,2.0423655421380222,2.0600207882367725,2.0599371115490515,2.041944529081166,2.0061798501333876,,, +34.90625,69,1.9530844528798394,1.8833967314951823,1.798139345970695,1.698601497766842,0.24315623355303456,-0.03824820585001011,-0.3251621813473583,-0.5990987566614698,-0.8423907248486466,-1.0394171207698437,-1.1776872720606388,-1.2487068070614287,-1.2485652424330564,-1.1782041877304232,,, +34.9140625,69,-1.0433474751697416,-0.8540980972155856,-0.6242300684838465,-0.3702246016772691,-0.11011781632276471,0.13775965921033073,0.3560632940730656,0.529646162915015,0.6466168679271158,0.6991700982542368,0.684131905575745,0.6031816692297742,0.4627352705316562,0.2734976217276226,,, +34.921875,69,0.04971575279116286,-0.1918154588404178,-0.43292558067638043,-0.6553371899486496,-0.8419422467560308,-0.9779972662971727,-1.0521539424732504,-1.0572533488659746,0.7964527088432186,1.005216740985725,1.0625832836748923,0.9715790060424516,0.758702953986296,0.4697490406878055,,, +34.9296875,69,0.16262131267028002,-0.1017386873402395,-0.2688990797120402,-0.2994720313466088,-0.17530580427863796,0.09763026320745405,0.4901174856383261,0.9541807865355566,1.4305033736532118,1.8576085506723046,2.1813788391460553,2.3634300421996417,2.387036224593319,2.259683034096991,,, +34.9375,69,2.011851934093686,1.6922249626850114,1.3600571441210139,1.0759048187876195,0.8921542185814303,0.8448257124284486,0.947930438362198,1.1912584740810999,1.5419431998820352,1.9495583275020512,2.353953817796521,2.694610294076472,1.0033307952838029,1.5329462883146583,,, +34.9453125,69,2.105305689539797,2.5770128143204047,2.8296224980498317,2.8020470002287823,2.50726505598944,2.0287543807231443,1.4976254183695166,1.0567231253486842,0.8215350455722484,0.8486190283027454,1.120202834159684,1.5491754544821843,2.003101030675765,2.340672565018989,,, +34.953125,69,2.4506130816626666,2.282360978255526,1.8601278846628504,1.2764743274719015,0.6671619562837736,0.17417254104191315,-0.09297297784667635,-0.08699624128960948,0.16441609579715688,0.5664339233265869,0.9833034261013397,1.2757768713287438,1.339492002916565,1.1337804300592822,,, +34.9609375,69,1.5863165415427216,1.4630353248705323,1.3306957226369986,1.1913888994697688,1.0473228908135828,0.9007841402286122,0.7540976662753887,0.6095865563331498,0.4695314964944161,0.3361310460387731,0.21146335195045285,0.0974499737338661,-0.004177548181348301,-0.09190779518480574,,, +34.96875,69,-0.16447571741363198,-0.22088456541298906,-0.26042312263705614,-0.2826779371840712,-0.2875403387197799,-0.27520811785742405,-0.24618183872058852,-0.20125584939311647,-0.14150414779268483,-0.06826135059340632,0.016900901435429327,0.1122016884012137,0.2156822206157762,0.3252403621781288,,, +34.9765625,69,0.4386676641648647,0.5536882588470611,0.6679989337671969,0.7793096838392888,-0.9908283288097601,-0.8552790344078083,-0.6577093659593459,-0.4094357090138342,-0.1252022172864496,0.17784264754324489,0.4813369604682577,0.7669805319694435,1.017805549065069,1.2193540650871357,,, +34.984375,69,1.3606802409750287,1.435107462041474,1.4406875479954293,1.3803300484509446,1.2615926225877712,1.096147135705576,0.8989587190936925,0.6872350559255572,0.47921917908167655,0.29290997946190556,0.14479966454635096,0.048716225174911476,0.014851646068845148,0.049043643259690684,,, +34.9921875,69,0.15236103239921872,0.32102165881350153,0.5466486295638141,0.816846996850505,1.1160606959161368,1.4266499974336986,1.7301143570252902,2.008375405328687,2.920055023860405,2.9958729316253616,2.91006491547999,2.674918891034999,2.32510212572909,1.9122719597419544,,, +35.0,70,1.497044268347929,1.139570545664401,0.8901911840917456,0.7816206360685072,0.8238815269548128,1.0027766057163414,1.2821363655924949,1.6094920696013368,1.9242903751252884,2.1673698695222505,2.2902232658566293,2.262602379894776,2.0772811188919946,1.7512343574813336,,, +35.0078125,70,1.3230488119156516,0.8469689029460874,0.3845047102192673,-0.00509116596468695,-0.27399484878365576,-0.3932023585996859,-0.35698979498634953,-0.1837481212789039,0.08693718272881995,0.40050645766711535,0.6959770642916033,0.9154932829167433,-0.4545671825196056,-0.8833745883025474,,, +35.015625,70,-1.0671651310635144,-0.9692404398413994,-0.628093009648061,-0.14678655661432546,0.33533906116741974,0.6808831278068361,0.7920457047815443,0.637413709178991,0.26053039805967815,-0.2320999512494873,-0.7002839784982348,-1.0086644114785712,-1.063938865473346,-0.8405705251558162,,, +35.0234375,70,-0.3879428254567336,0.1830042635758111,0.7299954068318202,1.118217590642126,1.257062930098077,1.1247484733153665,0.7740675027788517,0.31769817789804133,-0.10290188369342346,-0.35648787269061133,-0.3582181463975507,-0.09312186714304904,0.3795899300071805,0.9425533855457875,,, +35.03125,70,0.8853840312855616,0.9840784072689125,1.0733799055221354,1.1514417467810907,1.21661583290429,1.2674818205381078,1.3028722051136974,1.3218929758314624,1.32393947983981,1.3087072176988368,1.2761973809814773,1.2267170349228005,1.1608739427995185,1.0795661225438193,,, +35.0390625,70,0.9839663183375368,0.8755016589698671,0.7558288590254962,0.6268053970155023,0.49045717500686276,0.34894322592348676,0.2045180863779894,0.05949249378238956,-0.08380690417614609,-0.22307812231336765,-0.35608398264686775,-0.480691128189189,-0.5949072227953864,-0.6969156857925932,,, +35.046875,70,-0.785107353281597,-0.8581085118072662,-0.9148048136201709,-0.9543606548537368,2.2450306280139714,2.4264903287253743,2.5429186066672833,2.5889127468704416,2.563873662094241,2.472041568843954,2.322194423803852,2.1270301632820594,1.90227583714819,1.6655857727220058,,, +35.0546875,70,1.4353056150638492,1.2291884424004955,1.0631524967148915,0.9501671669076031,0.8993449178051321,0.9153024962973768,0.9978359676347552,1.1419322497774587,1.338116347856697,1.5731100805840335,1.8307563683450523,2.0931446334376957,2.341858837921469,2.5592611318175202,,, +35.0625,70,2.7297216003340603,2.8407083566784204,2.883661964701959,2.8545932141772616,2.7543625621712633,2.5886217515891214,2.3674216746030807,2.1045138216729016,1.0133872058566984,0.9633390920739927,0.7625216838396964,0.43208276198382567,0.013890569163351102,-0.43595117619799395,,, +35.0703125,70,-0.8558087830606547,-1.1880888414206792,-1.388182752322871,-1.4313925011860886,-1.3167590539228986,-1.0671971682682926,-0.7259156876375361,-0.34968091983684146,2.7611838005259237e-05,0.2665915044729774,0.40706666386766,0.3988626845388934,0.24324813314811322,-0.0348641501771666,,, +35.078125,70,-0.3908181914217793,-0.7671947198742557,-1.1027824175334016,-1.342143104227602,-1.4442808561711042,-1.3890646063669139,-1.1804036670015088,-0.8456813492334849,-0.43153466371582594,0.0033628095178436235,0.3973910316065831,0.6955310283251042,1.8381348849783565,1.6214050874994113,,, +35.0859375,70,1.1906773772682286,0.665244306473104,0.1881119794027345,-0.1132608866422351,-0.1619412933305311,0.04736934085525313,0.446881689683383,0.9143186987808425,1.306471582324701,1.498514635656664,1.4183033397138214,1.0662549625627515,0.5153620748620942,-0.1086658169411055,,, +35.09375,70,-0.6616912044501307,-1.0204719411164223,-1.11624326314181,-0.9533563602605526,-0.6078670604772624,-0.20646336807115123,0.1084907901358938,0.2182130577883611,0.06029994053027621,-0.3539270253192067,-0.9422824674835789,-1.5740037326511405,-2.1053568584674753,-2.4188055156080766,,, +35.1015625,70,-0.9762336773881004,-0.9801841405511161,-0.9662789986340056,-0.9348906128966278,-0.8866901206847625,-0.8226355778329167,-0.743955082040617,-0.652125172796466,-0.548844886118437,-0.4360059184698928,-0.3156594223305476,-0.1899800148767392,-0.06122763003018163,0.06829211812245276,,, +35.109375,70,0.19626836645787848,0.32042552051105383,0.4385631492424208,0.5485945582849789,0.648583366237417,0.7367774435232984,0.8116396195302159,0.8718746203317606,0.9164517652958173,0.9446230251566841,0.9559361253429011,0.9502424651190442,0.9276997138754136,0.8887690391069344,,, +35.1171875,70,0.8342070146232752,0.7650523506853456,0.6826076784342432,0.5884167075787389,1.8163940233147158,1.5211551617240946,1.2372288497381485,0.9821038164923768,0.7711103627271196,0.6163556407098049,0.5258839955583224,0.5031209098243512,0.5466393159710125,0.6502645610162144,,, +35.125,70,0.8035106917059677,0.9923176239769576,1.2000377782793343,1.4086033657933483,1.5997929126929094,1.75650868898447,1.8639759476159683,1.9107803315618106,1.889671091330038,1.7980740857711344,1.6382787765409264,1.4172861597779502,1.1463282222816737,0.8400924149486513,,, +35.1328125,70,0.5157052061855752,0.1915455780501718,-0.1140288135455298,-0.3839540030146509,-0.6036418949915539,-0.761989840017514,-0.8521472222295822,-0.8719856194318603,0.8578830223956047,0.8658287100613127,0.7248781593443532,0.463758198504835,0.1298845729803358,-0.2180766033669314,,, +35.140625,70,-0.5193992200710165,-0.7208076292729503,-0.7848256053200247,-0.695663132967266,-0.46172385555315937,-0.11434237287661775,0.2970521909533763,0.7125932910972385,1.0712623315950107,1.3203562711429453,1.4236630361979492,1.3670715627768697,1.1607428416858943,0.8375039662527584,,, +35.1484375,70,0.4477154505239799,0.051411373612006706,-0.2910633421112069,-0.5284601520360062,-0.6266133321411267,-0.5737616807442456,-0.3823765846789501,-0.08721172863547527,0.26012175365026186,0.5992096860415295,0.8702642261599595,1.0234594436860618,-1.825336171959958,-1.3757922639176954,,, +35.15625,70,-1.0220518953958708,-0.8772704624474875,-0.9948315777225499,-1.3536182111562158,-1.8637236951324079,-2.391038053207994,-2.7939717506663575,-2.9622522565795744,-2.8471605036828818,-2.474920190937747,-1.9395699667215145,-1.3772714533771433,-0.929093753929827,-0.702473140535681,,, +35.1640625,70,-0.7419095343247356,-1.0169296866552484,-1.4306145268694224,-1.8463519740423793,-2.1254813256259024,-2.165510165731562,-1.9284277266071963,-1.4513528211857007,-0.8365959665035096,-0.2238572277220251,0.24782264750340255,0.4779319217718596,0.43180159404066965,0.14987940190169685,,, +35.171875,70,0.48423715733152767,0.3720099345865384,0.25382509905447753,0.13188521133112996,0.008466705699552428,-0.11412003593295972,-0.23357120983279966,-0.3476300063214259,-0.4541262080198182,-0.5510142770490924,-0.6364092642268466,-0.7086199114480402,-0.7661783675677671,-0.8078659974069666,,, +35.1796875,70,-0.8327348319067819,-0.8401242837732336,-0.8296728358603874,-0.8013244975558267,-0.7553299160468586,-0.6922421229336451,-0.6129069905888908,-0.5184485652915967,-0.4102495338684341,-0.2899271657854776,-0.15930515185325195,-0.020381832561655044,0.12470462773351157,0.2737135110654054,,, +35.1875,70,0.42434060805096235,0.5742583881504053,0.7211565747087516,0.8627824144238722,-0.8242397665797958,-0.7163095093965202,-0.5597365748098654,-0.3693926606483835,-0.16243547730980482,0.04289444479497978,0.2285522647608983,0.377953488729379,0.4771365729530107,0.5157423869784048,,, +35.1953125,70,0.4877422229977131,0.39186357268858274,0.23168396907158784,0.015386338437292313,-0.24480708798376477,-0.5334828371970224,-0.8331071033719869,-1.12524483295121,-1.3918419828436495,-1.6164815425926937,-1.7855257401448756,-1.8890647868649801,-1.9216060072532162,-1.882455301828663,,, +35.203125,70,-1.7757643454059555,-1.6102402315096285,-1.3985378115392038,-1.1563771031794245,-0.9014473135128986,-0.6521739014940771,-0.42643465433724215,-0.24031430694336275,1.0267189232888496,0.870742300754676,0.5704876731342337,0.16287882229336437,-0.2989058203869709,-0.7536731445163312,,, +35.2109375,70,-1.1417010626300046,-1.413992724287182,-1.5398580911481454,-1.5116422554482676,-1.345864304120962,-1.0805896158635322,-0.7694451484154965,-0.47321015103260794,-0.250292381866946,-0.1475735012019821,-0.19304981180891612,-0.3914148827069971,-0.7232723770522145,-1.1481019782667745,,, +35.21875,70,-1.610516738981994,-2.0488375147550757,-2.404649238717715,-2.631850857475783,-2.7037896030717525,-2.6173686389998014,-2.393488518253495,-2.0737539054720187,-1.7139587048442515,-1.3753644995966887,-1.1151308950596661,-0.9773884348906994,-0.9312848271621638,-0.9544452719882051,,, +35.2265625,70,-0.7106411508740095,-0.24664998511661124,0.3285411407217822,0.873489897287542,1.2529682425407374,1.3749498245368788,1.2157787368329929,0.8266220430581214,0.31943783864657227,-0.16369541339221616,-0.4894825678626802,-0.5698865806391484,-0.38617835727758165,0.00602886799549518,,, +35.234375,70,0.4921394000913102,0.9301183448823417,1.1895718615901072,1.1876521837887035,0.9119452809782339,0.42406657377948276,-0.1570226508412135,-0.6874076230614229,-1.037445535288083,-1.1270756299884186,-0.9475386292626685,-0.5635550127123086,-0.09536728947643083,0.31442993868493235,,, +35.2421875,70,0.9969799362254327,1.1217275122538561,1.2351730633596985,1.335666292784972,1.4217873837353103,1.4923716584612858,1.5465297671883704,1.5836630535067093,1.603473827293601,1.6059703654121713,1.5914665527468452,1.5605761699857927,1.5142019282945611,1.453519443014204,,, +35.25,70,1.3799564271255818,1.2951674689340185,1.2010048357442802,1.0994858148796325,0.9927571640409973,0.8830572936003898,0.7726768431548763,0.6639183427743044,0.5590556654030849,0.46029398054485593,0.369730910562161,0.28931956988547436,0.2208341344450261,0.16583854433605227,,, +35.2578125,70,0.12565888787347534,0.10135995071639536,0.09372634082739661,0.1032485198999169,-0.1069845449800485,-0.035787488007021806,-0.03158655894275675,-0.0944299996902832,-0.21955049016042816,-0.39770088962964956,-0.6158026797549869,-0.8578618821852627,-1.106088571143424,-1.342141903395331,,, +35.265625,70,-1.5484138346183551,-1.7092619928574737,-1.8121057246022187,-1.8483088698478953,-1.8137876940643853,-1.7093015701476788,-1.5404061258289243,-1.3170721089268964,-1.0529965329921307,-0.7646541237798004,-0.4701551963154824,-0.18798959022974282,0.06425576370223252,0.2711162343045742,,, +35.2734375,70,0.42032082288654726,0.5036407477903847,0.5174561231846309,0.46300123292333695,0.34627131290683955,0.17759735943733224,-0.02908136938516237,-0.25719641145866673,-0.9863446571593157,-1.142497165351365,-1.4225436355254468,-1.7830028431588438,-2.166982761650783,-2.5130415904495305,,, +35.28125,70,-2.7647615649283024,-2.8795443594130643,-2.8352581147945193,-2.6337007220436393,-2.300339857382726,-1.8803701602702956,-1.431701550195481,-1.0159706505510626,-0.6889751811010519,-0.4920210387832985,-0.4455296139577597,-0.5459008301099879,-0.7661202843709338,-1.060015689451544,,, +35.2890625,70,-1.3694994074534583,-1.6336687556541891,-1.7983463969411781,-1.824574573982094,-1.6947398837398588,-1.4153743394995102,-1.0161961494928007,-0.5455393228432218,-0.0628836719225273,0.3703515905239497,0.7003170046008411,0.8890639533099527,0.21527349692809972,-0.2666135290829079,,, +35.296875,70,-0.8135220452845906,-1.2814847701342242,-1.5462362580914932,-1.5371602825710458,-1.256553285640367,-0.7789252841046913,-0.23053056417041173,0.24526127997492086,0.5272628749536286,0.5496647680143937,0.3200314374725922,-0.08283426088013798,-0.5305724241017311,-0.8805503110976837,,, +35.3046875,70,-1.0150781977736512,-0.8738079140459535,-0.4704333449249989,0.11088562590387593,0.7383972071247175,1.2686624274419112,1.585651916757925,1.6323214162541348,1.426014134248014,1.053470709067874,0.6468165321514876,0.3471097486248078,0.26544250717441276,0.45225860146484453,,, +35.3125,70,0.1301139859768261,0.17420376178840002,0.2350942504294461,0.31206442601847184,0.40410823356233794,0.5099519810385962,0.6280764192902006,0.7567431232480922,0.8940247126755574,1.0378383833998062,1.1859821620302204,1.3361732494667096,1.4860877819372313,1.6334013134701115,,, +35.3203125,70,1.7758293110795824,1.9111669537189828,2.0373275382390457,2.15237881998992,2.2545766518566404,2.3423953328272114,2.414554134805276,2.4700395432934803,2.5081228226270254,2.528372598296227,2.5306622361490074,2.515171889366359,2.4823851774716092,2.4330805556206,,, +35.328125,70,2.3683175253945734,2.289417928638406,2.1979426519779874,2.0956641500150033,-0.4887124280219529,-0.7053917310851092,-0.8900728150062838,-1.0278737199343002,-1.1072362968630016,-1.1207385388025939,-1.0656183164136586,-0.943971981551038,-0.7626139750712623,-0.5326072149867259,,, +35.3359375,70,-0.26849699907216973,0.012698168549023165,0.2926684663077308,0.553084954443003,0.7768733812353326,0.949400780146227,1.059492122480279,1.1002061402852836,1.0693162272984236,0.9694628908745554,0.8079671308697272,0.5963177653398264,0.3493684588442514,0.08430045172728975,,, +35.34375,70,-0.18057667364415375,-0.42710256032475047,-0.6385328868977512,-0.8007070802232167,-0.9030355019733134,-0.9392372696130562,-0.9077772623564832,-0.8119718402403211,0.920400360144847,0.802359213762858,0.5658957011379409,0.2600161352689483,-0.05590238055205521,-0.32140506433443633,,, +35.3515625,70,-0.48441767031108035,-0.5093964333167411,-0.382900154308354,-0.11571637032986826,0.25878971090532377,0.6898464891031956,1.1171621288585365,1.4802973868694962,1.7280653226309202,1.8264938985429886,1.7641112922340536,1.5537307245418055,1.230456804469891,0.8462238900074024,,, +35.359375,70,0.46171709964288865,0.1369342546290253,-0.07814130602613012,-0.15130438474791108,-0.07311895240829236,0.1416406925093966,0.4563229396979557,0.8181425002015852,1.166439861607839,1.4421699023100063,1.5971415397800355,1.6015690528053725,2.0647828108387434,2.537756172484251,,, +35.3671875,70,2.7756720895806546,2.731565607501189,2.4334996079050444,1.976737411163891,1.4975172488095974,1.135617302265517,0.995971987113498,1.1198599927471418,1.4735610556044412,1.9575905833233478,2.433981268019854,2.764134480304561,2.8468671687271314,2.6462262030485277,,, +35.375,70,2.201446337166155,1.6163216732212855,1.0309024662495396,0.5832730291715195,0.3718848092853584,0.42876640370070673,0.7109511055134947,1.1124695770541362,1.4936188624025264,1.719483943286469,1.6971521347017047,1.401418826079263,0.881937226252217,0.24985040781675466,,, +35.3828125,70,1.9845352683961783,1.8666549127537757,1.7442311647328852,1.619542491018768,1.4948977246767414,1.3725955195932276,1.2548839880476734,1.143921228225409,1.0417374328963498,0.9501992428042664,0.8709769689880381,0.8055152580343454,0.7550077139633695,0.7203759211674882,,, +35.390625,70,0.702253235761618,0.7009736291986517,0.7165657795433008,0.7487525139033717,0.7969556118183394,0.8603058855295361,0.9376583606583981,1.0276122915052834,1.1285356605254147,1.238593733019683,1.355781167060821,1.4779571164324903,1.602882711936057,1.7282602647781393,,, +35.3984375,70,1.8517735055960802,1.9711281545320396,2.0840921119824323,2.1885345662722098,-0.6597559069637621,-0.46312756352875656,-0.237309083140449,0.00031727956601142193,0.23142442958523607,0.4380217805217729,0.6037134514493729,0.7148455653610144,0.7614626354992616,0.7380063380562785,,, +35.40625,70,0.6437079332955521,0.482646959342125,0.26347209414312367,-0.0011963614210574458,-0.2956407252868536,-0.6021359504851983,-0.9021794194660713,-1.177774773309309,-1.4126802650841577,-1.593534600864454,-1.7107817754785506,-1.759330427128858,-1.738901748176156,-1.6540417076105367,,, +35.4140625,70,-1.5137967495832112,-1.3310755994308678,-1.1217416975123928,-0.9034995654611124,-0.6946527792703997,-0.5128201769502425,-0.3736998408825011,-0.28996706351419,1.4487586716329077,1.1562002168035495,0.7628934910904452,0.3233255784377372,-0.100963163483406,-0.4509110614623608,,, +35.421875,70,-0.6790806715943434,-0.7569937343393444,-0.6795133723446133,-0.465591269780895,-0.1552637423133506,0.19663514243096464,0.5290639032500509,0.7843291832918954,0.917117902054059,0.9015989660753911,0.7354881707104785,0.4404429369659544,0.05872518866009463,-0.35334805314157547,,, +35.4296875,70,-0.7341464355921656,-1.0262989881103857,-1.185606931411491,-1.1879084930337855,-1.0328266075659824,-0.7438158671128079,-0.36450147865230775,0.04811949621993386,0.4325556483867292,0.7323947496538866,0.9050821890335681,0.9285370641221389,-0.9723594361146793,-0.8776933317126171,,, +35.4375,70,-0.5589692887407698,-0.12906305246886207,0.2703144483184382,0.5076126250585209,0.49763409716685447,0.22500432480244315,-0.2515153365840098,-0.8150540717251089,-1.3226058032574666,-1.6441884192778005,-1.6984558917466726,-1.4750030953209348,-1.0372500599119834,-0.5051147787226068,,, +35.4453125,70,-0.02222284166779731,0.28336004041723795,0.3341115633024966,0.12416563276122294,-0.27923061366341245,-0.7543134074667089,-1.1583541744610288,-1.366969280439971,-1.3084122084148995,-0.9834477493906739,-0.4653592499378396,0.11991516437050098,0.628075456941999,0.9357851437807343,,, +35.453125,70,2.282463333474001,2.364059775543263,2.4317106853336976,2.4840365801766287,2.5199159085775698,2.538504746148917,2.5392516358758788,2.521907312829764,2.486529143017297,2.433480198601711,2.3634229856483886,2.2773079341764677,2.1763568520098953,2.0620416320968125,,, +35.4609375,70,1.936058586079505,1.8002988534758706,1.6568154045445997,1.5077872145550142,1.3554812366959872,1.2022128394132774,1.0503054008427934,0.9020497677634554,0.7596642888704688,0.6252561220975055,0.5007844934185035,0.38802655037904876,0.2885464081724086,0.2036679301757166,,, +35.46875,70,0.13445171946129852,0.08167672406991844,0.04582677803858337,0.027082313750722453,-0.27038316183519506,-0.3191773028115734,-0.4357444638668363,-0.6146806071849875,-0.8461526313921536,-1.1165773187935524,-1.409561948792472,-1.7070410009370558,-1.9905296967206354,-2.242406981279437,,, +35.4765625,70,-2.447138492748114,-2.5923542513930986,-2.6697059309651334,-2.67544394460663,-2.6106741152730004,-2.481276043617754,-2.2974888765572006,-2.0731933722912292,-1.8249403350627376,-1.5707931786973772,-1.3290653386182103,-1.1170405838327704,-0.9497654720863608,-0.8389981597949498,,, +35.484375,70,-0.7923868744986635,-0.8129353416590277,-0.8987924465826916,-1.0433808014875492,-1.2358552539742258,-1.4618593644740978,-1.7045271010912575,-1.9456598996446535,0.8045754922530809,0.5586080189126209,0.23565835002278207,-0.1066763725204655,-0.4072271428564561,-0.6108143151832321,,, +35.4921875,70,-0.6768790978928412,-0.5858407297003455,-0.34218897091984124,0.0261699796638174,0.4722124966872369,0.9370721186252197,1.359156915527009,1.6836898202672614,1.871186239045,1.9035487881907618,1.786830154897312,1.5502340407885198,1.2415100881223653,0.9194603456647389,,, +35.5,71,0.6447247235829219,0.47028094128067144,0.4331389376747563,0.5485236646252849,0.8074525989065245,1.178085554875554,1.6106368149671015,2.045084734726293,2.420478245741512,2.684390941394005,2.801050429284794,2.7568769529264903,0.3328063297238163,-0.14409017127009194,,, +35.5078125,71,-0.5402227783103151,-0.7365204187611779,-0.6702325027001949,-0.35227559580020484,0.13562696171892547,0.6632298388623756,1.0873684318848498,1.2911228200510678,1.2158100435097907,0.8770371315512809,0.36041557650184197,-0.20188807044223073,-0.6673387689869252,-0.9220393449809503,,, +35.515625,71,-0.9118666370915163,-0.6572046291544024,-0.24723753049607217,0.1846320425627785,0.4975014110786684,0.5817579081848429,0.38930793713798717,-0.053041554542974545,-0.6507184575884558,-1.2670840640698844,-1.7606536125644987,-2.023639857094458,-2.0112581510501095,-1.753763559688133,,, +35.5234375,71,0.025317390623138425,0.04010209205519033,0.07071024856391828,0.11613235176600689,0.17509343297640323,0.24607559325385164,0.32734479028740504,0.4169814129671686,0.5129141081651408,0.612956267305833,0.7148445337210465,0.816278656416497,0.9149619922823722,1.0086419474348602,,, +35.53125,71,1.0951496494401936,1.1724381556281203,1.238618528352167,1.2919931453838671,1.3310856620507332,1.3546671003531312,1.3617776081040818,1.3517435069651036,1.3241893307291668,1.279044642929275,1.21654551426208,1.1372306338209668,1.041932122096599,0.9317612064717635,,, +35.5390625,71,0.8080890098964721,0.6725227889948958,0.5268780375402747,0.3731469436240251,-2.166997007096141,-2.3514905208109718,-2.48449620779039,-2.554797060152957,-2.555388206167299,-2.4839684367756276,-2.343104065416946,-2.14005368741923,-1.8862660510433753,-1.5965860464875037,,, +35.546875,71,-1.288224172326606,-0.9795613316238033,-0.6888722922909849,-0.43305681742622093,-0.2264669358911443,-0.0799121186518651,8.828010123540508e-05,0.011753201104802047,-0.041842561229185615,-0.1529896025481009,-0.3098885116412544,-0.49747984048838023,-0.6985015489694071,-0.8947001690888126,,, +35.5546875,71,-1.0681112139373896,-1.2023195276894185,-1.2836116715383836,-1.3019399689427003,-1.2516309670398593,-1.1317888936619025,-0.9463659582553938,-0.7038945770388445,2.562568788926884,2.2514097664420283,1.8740626619582168,1.4906595469751118,1.1614211605674298,0.9372664708170573,,, +35.5625,71,0.8518750968452028,0.9164389516767399,1.1179205848389504,1.4210894955529076,1.7740192274362616,2.1161889996996517,2.3879279387319277,2.5397308365169624,2.539994352601804,2.3799685812005125,2.0751526076765896,1.6629165279985851,1.19672013574525,0.7378285519061605,,, +35.5703125,71,0.3458149216851001,0.06932920901300477,-0.06142933973875775,-0.03936385870916914,0.11846860901070477,0.3735692294288343,0.6720504385865967,0.9530868668456352,1.158447562265729,1.2416245272203859,1.1751354568796102,0.9548629453554984,-0.6394231724021736,-0.5779430373094602,,, +35.578125,71,-0.7839478173440944,-1.2205026809175252,-1.785551220696478,-2.339717100013709,-2.7443507023827003,-2.8993947555030966,-2.7706923506795134,-2.3992541253846156,-1.8899456429375814,-1.3826961156044892,-1.0141197922278429,-0.8800687273930402,-1.009380177715212,-1.3560135510286848,,, +35.5859375,71,-1.8117316023572956,-2.235849804757975,-2.4938997491943677,-2.494609167049587,-2.2150623478211355,-1.7071439494613743,-1.0834986968423084,-0.4868533951626586,-0.051107440936805526,0.1351460973668589,0.052673004543339896,-0.24336598974826568,-0.6387736940552622,-0.9918580677589494,,, +35.59375,71,0.21346375269877382,0.05006764284952771,-0.11473623779295879,-0.27861688939454976,-0.43925803218797055,-0.594398421391378,-0.7418711994993943,-0.8796415970252933,-1.0058423216853316,-1.1188060165006541,-1.2170942186043752,-1.29952231181908,-1.3651800362161435,-1.4134471956632872,,, +35.6015625,71,-1.4440042884509245,-1.4568378749806774,-1.4522405886538636,-1.4308057898913806,-1.3934169570184147,-1.3412319998953095,-1.275662771084324,-1.1983501334273883,-1.111135020713382,-1.016025998282021,-0.9151638916794756,-0.8107841028330924,-0.7051772736931456,-0.6006489862226584,,, +35.609375,71,-0.4994792044985897,-0.4038821691823397,-0.31596744671322075,-0.23770281534624726,-0.4169001778450947,-0.10103551436456698,0.22600316036041812,0.5457024995316102,0.8400155429663172,1.092612787677138,1.290013623880477,1.42251925384958,1.4848820539180156,1.4766647182313366,,, +35.6171875,71,1.4022641549299468,1.2705984828885892,1.0944789697216106,0.8897107213191079,0.6739848476289914,0.4656393698825538,0.2823752869250902,0.14001734458650517,0.051405934110308915,0.025497400909150425,0.06673551113734655,0.17473791413873596,0.34431947243814576,0.5658508393421635,,, +35.625,71,0.8259272855720341,1.108301140912632,1.3950128333555327,1.66764165858,1.9085890626063426,2.1023049524189252,2.2363715213402964,2.3023690110763235,0.6007540122051374,0.15377070384860703,-0.3304335565932376,-0.790127210053464,-1.167062109034135,-1.415494375825742,,, +35.6328125,71,-1.5092597808284567,-1.4458018579305991,-1.2465255888335036,-0.9534217865853352,-0.6224881521811995,-0.31497189731656583,-0.08779811229469503,0.015325135120689448,-0.02926059315020968,-0.22145812314708424,-0.5374126341152613,-0.9332139646456677,-1.3517266618310297,-1.7314839922603107,,, +35.640625,71,-2.0162606396987295,-2.163833084262994,-2.152563159671631,-1.9847793158408948,-1.6864288676873507,-1.3030553043542892,-0.8927271044685228,-0.5170193029039891,-0.2314523301628838,-0.07687716044944604,-0.0731483950596612,-0.21607053378540275,-0.7563919389524382,-0.2090747943839098,,, +35.6484375,71,0.4248616425130175,1.00155116330333,1.3914693942195848,1.5147410661148986,1.3628550600516074,1.0008373238346273,0.5492875112770801,0.15120377794305517,-0.06731090144431906,-0.0316908252686694,0.2605969449192468,0.7393213479511218,1.280720997436819,1.7414314337889625,,, +35.65625,71,1.9978073441602413,1.9798623355874096,1.6905238110776368,1.2049249907117927,0.6499271492175323,0.1694832648298007,-0.1146654518170136,-0.13618972049814015,0.09782850441543733,0.5090289104162816,0.9694514664939369,1.3368174057309559,1.4937410590808857,1.3801236615756896,,, +35.6640625,71,-0.17087963799113692,-0.11708132827157036,-0.07765546204436491,-0.05369002279902457,-0.045994196962579115,-0.05508405546555295,-0.08117337236692945,-0.12416974137800563,-0.18367605836242773,-0.25899734392505946,-0.3491527866973345,-0.45289279650645464,-0.5687207688951401,-0.6949191799555506,,, +35.671875,71,-0.8295795546167839,-0.9706357837002196,-1.1159002064096002,-1.2631018265098803,-1.409925993072429,-1.5540548510236714,-1.6932078532523902,-1.8251816249414816,-1.9478884821439406,-2.059392930169137,-2.1579455027242087,-2.2420133493143743,-2.310307035335169,-2.3618030856118186,,, +35.6796875,71,-2.395761876659632,-2.4117405643858536,-2.409600820877267,-2.389511244807184,2.2964630377658333,2.219672524763073,2.077799556369258,1.8810260412261768,1.6432053076971516,1.3808980261087844,1.1122196808476497,0.8555799557243412,0.6284019325048361,0.44591040943353144,,, +35.6875,71,0.32007382588257105,0.25877356711106414,0.2652585664700481,0.3379232270360688,0.47042413790605664,0.6521274345447103,0.8688555951039623,1.1038815834700666,1.3391010009595383,1.5563004949824804,1.738433960215671,1.8708175239687956,1.94215997049184,1.9453567339279605,,, +35.6953125,71,1.8779920764109914,1.7425144166762585,1.5460725665437387,1.300024278382261,1.0191513572695865,0.7206360535960997,0.4228700984192958,0.14417941417554692,-0.47809285589483413,-0.8126444527668573,-1.1614339688837827,-1.4635768275583616,-1.665128067439357,-1.7275357310564186,,, +35.703125,71,-1.6336978692055044,-1.3906794685409518,-1.0286658399980402,-0.5963151938474667,-0.15323397152708967,0.239253349678823,0.5276026164793071,0.6743373900659111,0.663834843596169,0.5047092575303389,0.22842213820248725,-0.11566430069115138,-0.4680195993129508,-0.7682588476721642,,, +35.7109375,71,-0.9645869199745719,-1.0219019485776306,-0.9272956843284508,-0.6920938548850886,-0.3501185632158998,0.04755677647513282,0.44054314374467224,0.7685263353630802,0.9806495848266145,1.043427050801438,0.9459556515633785,0.7016134985433597,-0.11600814657395175,-0.5963547153831477,,, +35.71875,71,-0.8578912056152309,-0.8437244455109805,-0.5714139765232014,-0.1279780808860927,0.35412293577603093,0.7334423329495289,0.8984485444704322,0.7982097356551413,0.45645045333424583,-0.034873094841461894,-0.54071907648624,-0.9199361828323102,-1.0639362050493268,-0.9264642083055032,,, +35.7265625,71,-0.5363071470968764,0.010542380590329907,0.5771200177964313,1.022931909391502,1.2423443919016939,1.1934006900232088,0.9091680449037768,0.4885067495846159,0.06879255793273437,-0.21192988881106123,-0.2529882091338038,-0.018890159404974183,0.45072505727745893,1.0517214733327895,,, +35.734375,71,-2.3519444032576207,-2.297668556751735,-2.227734212386129,-2.143455740506873,-2.046388376812337,-1.9383010125549225,-1.8211452492691242,-1.6970212598535876,-1.5681410537508533,-1.436789789427805,-1.3052858115340278,-1.1759401124571465,-1.0510159280617426,-0.9326891750459697,,, +35.7421875,71,-0.8230104226177946,-0.7238690643104393,-0.6369603172428132,-0.5637556266112487,-0.50547699357207,-0.4630756759764927,-0.43721563484165193,-0.42826201634777217,-0.436274870972563,-0.4610082196715467,-0.5019144833809124,-0.5581541982094194,-0.6286108461272806,-0.7119105413869349,,, +35.75,71,-0.8064462278866809,-0.910405963690901,-1.0218047973660567,-1.1385196778831226,-0.09844658647066562,-0.29053252076978286,-0.4211192799219168,-0.4835211243664338,-0.47578485255846,-0.40081904065922686,-0.26618435735696583,-0.08355959209954056,0.1320793517393625,0.36351023167330454,,, +35.7578125,71,0.5924717197485477,0.8009429344701406,0.9724060107091038,1.0930036505673888,1.15251092196621,1.1450535253740008,1.0695224291970387,0.9296559481361906,0.7337835296739175,0.4942491046673026,0.22655420368727242,-0.05171941693709814,-0.3221325192191526,-0.5666712397657642,,, +35.765625,71,-0.7690006076123782,-0.915601318202901,-0.9967104981911747,-1.0070008633114806,-0.9459509134413895,-0.8178803531308763,-0.6316482699457554,-0.40003511911981454,0.34598039173807466,-0.0686957474464199,-0.4816246628842564,-0.8329261957161397,-1.072937175891931,-1.1699232761561187,,, +35.7734375,71,-1.1149947863683374,-0.9234607890623452,-0.6324109730464698,-0.2949019044310121,0.02834653546430349,0.27845101577269904,0.4075810508855514,0.38645600431303173,0.20895485822110138,-0.10687950357678477,-0.5215981872183121,-0.980437072567161,-1.421792097783258,-1.786759259939902,,, +35.78125,71,-2.0282537154181117,-2.118287923396708,-2.0522755151668224,-1.8496908299593162,-1.550981679754732,-1.211216480958695,-0.8914555250652056,-0.649190630873497,-0.5293425171572608,-0.557218357065818,-0.73452665602949,-1.0390703884350954,2.2876039709052187,2.208709389490871,,, +35.7890625,71,1.8948899114430224,1.452193659389476,1.020468436385729,0.7348386472605325,0.6884900581607788,0.9069636841364233,1.3410056527152818,1.879934105418937,2.3818609317913744,2.712486552006525,2.781836163947899,2.568869860195545,2.1272222287921863,1.5704986891500667,,, +35.796875,71,1.0411584922602635,0.6715125085994781,0.5475248196558288,0.6853384859847164,1.026958349951757,1.456273169888724,1.8310247972310627,2.0219613275982855,1.9484420820013308,1.6007345713759318,1.0428907901632978,0.39541268817894604,-0.19754425300803713,-0.6074428561987631,,, +35.8046875,71,-1.2583267867246646,-1.3789406384208829,-1.4980542647607216,-1.6133797789655289,-1.7226886094388298,-1.8238506985000686,-1.9148719796308273,-1.993929476893676,-2.0594034118344187,-2.1099057555584055,-2.1443047259246764,-2.1617448007990046,-2.161661896813932,-2.1437934477432625,,, +35.8125,71,-2.1081832058948917,-2.055180682329987,-1.9854352355867264,-1.899884912290816,-1.7997402349271565,-1.686463220521297,-1.5617419974848699,-1.427461464952203,-1.2856705082356712,-1.1385463443195891,-0.988356621573423,-0.8374199371829878,-0.6880654635026632,-0.5425923901407648,,, +35.8203125,71,-0.40322989180428853,-0.2720983227347864,-0.15117231708230328,-0.04224644119203602,-0.13885161137660795,0.13416335614246955,0.4005788760216863,0.642556113106091,0.8440907528743291,0.9921271792090879,1.0774666906441506,1.0954064273086401,1.0460644599847022,0.9343683783652211,,, +35.828125,71,0.7697081816334942,0.5652776844822607,0.33715037323522096,0.10315416504476005,-0.11837645302827199,-0.3098838769162081,-0.45581691972048777,-0.5437206757568228,-0.5651107021628439,-0.5160705454034283,-0.3975309315519313,-0.21521113732904018,0.02077338435840892,0.2966097779238761,,, +35.8359375,71,0.5957442454002935,0.9000295123082731,1.1909832987601663,1.451070054978271,1.6649165983634222,1.8203768986780324,1.9093717774614367,1.9284449838537827,-1.4281664067458466,-1.845258735588653,-2.22869588332825,-2.521305229892037,-2.679273383274582,-2.6789494779365337,,, +35.84375,71,-2.5205118819820687,-2.2279273010466394,-1.8452087254015774,-1.4295551209705621,-1.0424414288741155,-0.7400466674266396,-0.5645110033514951,-0.5373835216488088,-0.6562811897241126,-0.8952793302678923,-1.2089726948875368,-1.5395744952172339,-1.8259475510210526,-2.0131607587202214,,, +35.8515625,71,-2.0610822445240995,-1.9506705906610504,-1.6869840444299156,-1.2984387961186792,-0.8324316251988795,-0.34800847015152275,0.09327942126334565,0.4369078209145306,0.6438158891833309,0.6964328536946885,0.6013565957965286,0.3882672302755514,-0.31950980912455995,0.07773745027553283,,, +35.859375,71,0.41112264379443986,0.5563609236298357,0.44174017589116055,0.06799351641728613,-0.4916948758792375,-1.111554000281568,-1.6475178472629781,-1.9765479764628868,-2.0302111175706856,-1.813310411399988,-1.4024650793986928,-0.9250286565001871,-0.5241243367647301,-0.31938066277241983,,, +35.8671875,71,-0.37412899106413244,-0.6780529793749709,-1.1500451979022135,-1.6604875941187174,-2.066848842217588,-2.2528416520627492,-2.160407243700498,-1.8057598703114284,-1.2750927634033706,-0.7011209086149672,-0.22688796445477,0.033244978141664605,0.02473883923882303,-0.23238823936240782,,, +35.875,71,0.05309600090120514,0.13351046269638345,0.19791446985901173,0.24550634616185163,0.2757790229776734,0.28852869065555165,0.28385814042950774,0.26217473847681316,0.22418306773382402,0.17087236644163661,0.10349898350890352,0.02356415802283751,-0.06721248787682255,-0.1669232784938645,,, +35.8828125,71,-0.2735061052477164,-0.38478074968975173,-0.49848727273308824,-0.6123257977691635,-0.7239969909488115,-0.8312425296997985,-0.9318848507492076,-1.0238654815553816,-1.10528128384091,-1.1744179744898604,-1.2297803367460318,-1.27011859259594,-1.2944504744529484,-1.302078609552042,,, +35.890625,71,-1.2926029125491145,-1.2659277692243975,-1.2222638853976098,-1.1621247685798866,1.8789968870607519,1.7671795065437288,1.6034602170171732,1.4018845696536937,1.1790896523922476,0.9531368078485096,0.7422451238994807,0.563514031289701,0.43172410195198097,0.3582996882799645,,, +35.8984375,71,0.3505057576096914,0.4109349446180399,0.5373206061730875,0.7226889295498115,0.9558395012137139,1.2221208382821203,1.5044468155856592,1.784483122277503,2.0439210246673585,2.265749623214891,2.4354378959791094,2.5419441110649448,2.5784822280115973,2.542991853313221,,, +35.90625,71,2.438278986644363,2.2718177504372497,2.0552269353984656,1.803457869903255,1.53375025071825,1.264428752492229,1.0136243356672208,0.7980094226309444,0.10524518655903738,-0.18877668092355115,-0.43325103536832826,-0.5755049022209603,-0.579001188350466,-0.42908581527819734,,, +35.9140625,71,-0.13532504067567663,0.269931354099175,0.7365374826674616,1.2043128149488795,1.612369034440586,1.9085498133762457,2.0575134262704236,2.0461994925000684,1.8858285582111174,1.6101232394791127,1.2700281425570665,0.9257510924351819,0.6373654019673918,0.4554370196071309,,, +35.921875,71,0.4131364984421305,0.5210644398991426,0.765596406568026,1.111005101692477,1.5050292625807546,1.8870218503397156,2.197408358480963,2.386981984458526,2.4245877975583845,2.3019989391290543,2.0352252279160523,1.6620501965534857,-1.422155627468165,-1.5280065837426575,,, +35.9296875,71,-1.362301405927182,-0.9518706185344766,-0.3912427097331476,0.18305614484214244,0.6297226431417421,0.8412180316172356,0.7730695331611221,0.455902513111777,-0.013092788778910146,-0.49691992160287124,-0.8564253786897373,-0.9885187652944661,-0.8544881907025282,-0.4906498951577396,,, +35.9375,71,0.0015870198978120437,0.4835179817979878,0.8171840019436377,0.9032302531491478,0.7082058324305478,0.27382202578110787,-0.29436917063174367,-0.8557744158360238,-1.2731444329380919,-1.4500265386157944,-1.357021198975522,-1.0396481381327425,-0.6056679205065136,-0.1953356742969906,,, +35.9453125,71,-1.0863179038662862,-0.9959307784811354,-0.8923119995881994,-0.7770478359008914,-0.651934593752471,-0.5189473112333385,-0.3802053184721458,-0.23793526701214684,-0.09443227556044022,0.04798012764037024,0.18699056448199625,0.32034015857953446,0.44586197229829005,0.561518838740718,,, +35.953125,71,0.6654389263300236,0.7559484133132647,0.831600700116699,0.8912016481037859,0.9338304028573449,0.9588554374256594,0.9659455346606566,0.9550755163937814,0.9265266191724941,0.8808815100178901,0.8190140295106216,0.7420738418361834,0.6514662605951222,0.5488276036506521,,, +35.9609375,71,0.43599650857643796,0.314981710981891,0.18792684993560008,0.057072916753194786,0.6316351440646407,0.5249517389148713,0.48408041870964225,0.5103874707058548,0.6003902974439633,0.7460019424913134,0.9350970476112357,1.1523597713570657,1.380354536202876,1.6007449320177904,,, +35.96875,71,1.7955757714700993,1.9485288884133212,2.0460651005422257,2.078372694987587,2.040056286604009,1.9305180026237765,1.7540044017596068,1.519315844586613,1.2391985697686494,0.9294618560241328,0.6078818198191015,0.29296827680907905,0.0026806435485401403,-0.24681759088212296,,, +35.9765625,71,-0.44227898374193514,-0.5742887539746295,-0.6379139913463698,-0.6330402040922851,-0.5643717529630653,-0.4410961580756608,-0.27623570440972944,-0.08573157762284259,1.2361800094754682,0.8189154130992875,0.46964365427440713,0.2366310844250814,0.14955031997297075,0.214905651000322,,, +35.984375,71,0.4150689616141443,0.7110760595206281,1.0487476004077476,1.3671809626223839,1.6082901340936886,1.7259074360763629,1.6930291518945513,1.506076224526733,1.185506106067122,0.772680171494898,0.32347432825992517,-0.10037227733195553,-0.4408232461944579,-0.6525359181439999,,, +35.9921875,71,-0.7098772314703578,-0.6108719393218548,-0.377468461489318,-0.05208118477411003,0.30905202640772084,0.6446623150436487,0.8980226612865899,1.02580988042979,1.0048753465249343,0.8358697447981793,0.5431571770807556,0.1710319172227172,-0.20627033960999686,-0.6929668738507428,,, +36.0,72,-1.2861545662374958,-1.8430546664886027,-2.2297905098859716,-2.357865760239598,-2.20821459469606,-1.8362343315339054,-1.3564230424941535,-0.910834234564364,-0.6299958076252388,-0.5970056614105621,-0.8246455389682215,-1.2517866120861367,-1.7600728426589354,-2.2063104316807185,,, +36.0078125,72,-2.4616869010441658,-2.4470713517825153,-2.154721267074857,-1.6504465781201394,-1.0556375811121956,-0.5140818028151699,-0.15266360467847684,-0.04671667950000291,-0.19952419093918383,-0.5415836864488124,-0.9498368190614548,-1.2815920077641165,-1.4138411362979597,-1.277192925600296,,, +36.015625,72,-0.07528099532366161,-0.20681795327317906,-0.3352437532823915,-0.4583270862118902,-0.5739385962471496,-0.6800881488301342,-0.7749596553161807,-0.8569428445991407,-0.9246614253960836,-0.976997146093409,-1.0131093308909884,-1.032449550191644,-1.0347711683902743,-1.02013360191151,,, +36.0234375,72,-0.9889012129745661,-0.9417368584927358,-0.879590207110338,-0.803681028986583,-0.7154777509715193,-0.6166716527221441,-0.5091471556346338,-0.3949487248950323,-0.27624496424296924,-0.15529053221592173,-0.03438654678200208,0.08415982826045487,0.19807590739781605,0.30516340839208694,,, +36.03125,72,0.4033370789792605,0.49066134884727763,0.565384365039659,0.6259688147362876,0.11267558650315099,0.30069065882835116,0.4607476477121729,0.5772424749177839,0.637628913841785,0.6333012495317705,0.5602020926119236,0.41911294529110604,0.21560724049004265,-0.040330887820255956,,, +36.0390625,72,-0.3349955351038606,-0.6519076323423163,-0.9729570941679954,-1.279658878816623,-1.5544353858393287,-1.7818357804620426,-1.949607231302833,-2.049543374225985,-2.0780508492853356,-2.0363944168168326,-1.930603571835826,-1.77104718008313,-1.5717058083066968,-1.3491925014509338,,, +36.046875,72,-1.1215903003213792,-0.9071875718424953,-0.7231993491653219,-0.5845638536733971,-0.5028981275300135,-0.48568560932398985,-0.5357523104544923,-0.651068124046209,-0.22317298438602287,-0.5780119165261918,-0.8374974575185121,-0.9598249639911406,-0.9238920749630947,-0.7325976407686788,,, +36.0546875,72,-0.4124061872987973,-0.009245668216023711,0.41862265231818574,0.8096517566465345,1.1085648078725001,1.2749312345043053,1.2894273724233596,1.1568067297505884,0.9051174489501947,0.5812890734361195,0.2437762388358472,-0.0465946797019553,-0.23615002324175383,-0.2867806566428398,,, +36.0625,72,-0.18193066981293748,0.07077008015222963,0.4406399041367494,0.8786693662555647,1.3251000090360656,1.7186775834059715,2.0061388342670443,2.1504545121391825,2.136545001495107,1.9735786039910281,1.6934947771396671,1.3459826035081188,0.37113345515623425,0.9437099306561436,,, +36.0703125,72,1.3124452192659313,1.4107851346343387,1.2456553232741774,0.8953267661947064,0.4877352989550123,0.16519913585520163,0.04520619432031847,0.18802005912215614,0.5799845186906633,1.1371039598965267,1.727919750718569,2.2094141234844393,2.466102447502416,2.441600751373429,,, +36.078125,72,2.1540174687653177,1.6909514753695256,1.1854675829374073,0.7796339566298289,0.5856146171092153,0.6549800598050481,0.9646464808582085,1.4232964988340213,1.8965207065288283,2.2437883868467603,2.3571135355405564,2.190817540648961,1.7742298607454794,1.203844094598379,,, +36.0859375,72,0.6711189956276818,0.6998036597863506,0.7112742309510413,0.7050780761466591,0.6810665991557017,0.6393980140298069,0.5805347499738188,0.5052355329410436,0.4145422824845185,0.30976205319444483,0.19244433681499784,0.06435412236982707,-0.07255881410099418,-0.2161938525738747,,, +36.09375,72,-0.3643361106152869,-0.5146950230787062,-0.6649442445113045,-0.8127621757037852,-0.9558724048896757,-1.0920833555894647,-1.2193264469996707,-1.3356920988614962,-1.4394629504948924,-1.5291437124634832,-1.6034871282959537,-1.6615155918093398,-1.7025380416441862,-1.7261618373221856,,, +36.1015625,72,-1.7322994090086357,-1.7211695646772973,-1.693293431920786,-1.64948510560039,-0.82488712484311,-1.0462170787978837,-1.300585423405263,-1.5710483051603155,-1.8393723105290716,-2.0873064835523327,-2.29785592637377,-2.456468167795522,-2.5520495671091865,-2.5777408718111365,,, +36.109375,72,-2.5313978419989445,-2.4157434200750942,-2.2381808278153,-2.010280616705742,-1.7469774329994319,-1.4655325007203284,-1.1843341623912818,-0.9216201093261845,-0.6942103935073366,-0.5163395606202792,-0.39866933116153724,-0.3475506657950864,-0.3645866602198101,-0.4465267365087974,,, +36.1171875,72,-0.5854994950366476,-0.7695679747983941,-0.9835685869375771,-1.2101752044942724,-1.4311141901891844,-1.6284456183423328,-1.7858213308681883,-1.8896320824531316,0.9906968721189766,0.6879243989927284,0.48915458462718886,0.42902310822770284,0.5198837703238343,0.7498541316777929,,, +36.125,72,1.0846395174606847,1.4728514377286728,1.8539921829768673,2.1678620636365147,2.363924158316172,2.409168033606071,2.293247670796088,2.0300933705698583,1.6557465822541015,1.222754882479504,0.7920000819721693,0.4232322220698669,0.16578376653325022,0.050910207539139773,,, +36.1328125,72,0.08694996248843911,0.2580572996618862,0.5267054942279769,0.839570165146036,1.1358762457328817,1.3569083008491138,1.4552026914580876,1.4019896276186594,1.1917257274795072,0.8430108576811906,0.39574618779685666,-0.09502416636406455,-0.07694307198483374,-0.035979967029593274,,, +36.140625,72,0.24486972794426032,0.6669113321292495,1.092875617145224,1.3847648961755392,1.4418930060207145,1.2286915162239573,0.7846593446058715,0.21372700833252842,-0.34405131902184183,-0.7507212288482243,-0.908092584385974,-0.7845237456940499,-0.4234859353994863,0.06843849497611837,,, +36.1484375,72,0.550833776383839,0.8879796586898385,0.9860715381605757,0.8189306526455393,0.4351579554442683,-0.055228783226146994,-0.5110118614165674,-0.798562358260543,-0.8285690389851634,-0.580640160080171,-0.1090343777109809,0.4720512590561208,1.019605614675061,1.4008114804319405,,, +36.15625,72,-1.590837165228651,-1.5187013158067728,-1.4346644912353113,-1.340520838853375,-1.2382400757960328,-1.1299327713816323,-1.0178131635643533,-0.904160160676747,-0.7912772114429898,-0.681451746078922,-0.5769148987938517,-0.4798022170814187,-0.39211604591814875,-0.3156902456416044,,, +36.1640625,72,-0.2521578614353803,-0.2029223106539677,-0.16913259262404368,-0.15166295513069272,-0.15109737374818422,-0.16771911591303545,-0.20150557259511703,-0.25212844818832647,-0.318959305419125,-0.401080368302544,-0.4973003941072549,-0.6061753365303435,-0.7260334383891784,-0.8550043145704207,,, +36.171875,72,-0.9910515161134703,-1.1320080053414527,-1.2756139209829747,-1.4195559721294229,-1.9299637640155205,-1.9012960069683627,-1.8028944352871648,-1.6388691952394918,-1.4178956640986367,-1.152616796513361,-0.8587687676597588,-0.5540908677927563,-0.25709564775463206,0.01421493967523213,,, +36.1796875,72,0.24359789163185208,0.4176949650201972,0.5269574541334648,0.5663054641085067,0.5354757223731242,0.43903368909790463,0.28604913673089116,0.08945783562133408,-0.1348461289531914,-0.36912409961329573,-0.595034972168792,-0.7949190740507327,-0.9530342555688294,-1.0566579866986112,,, +36.1875,72,-1.0969785965854828,-1.0697134974038855,-0.9754112731535679,-0.8194165598008782,-0.6115001585468984,-0.3651801691168163,-0.09678147689693284,0.17570082605771728,-0.5676289944797117,-0.9633172357356862,-1.2353498719457712,-1.3562206525665919,-1.3218812799516357,-1.152313254011525,,, +36.1953125,72,-0.8883576006894154,-0.5852965596556847,-0.30418720129462506,-0.10229708567603413,-0.02413193012238657,-0.09445303452027853,-0.3143722877371702,-0.6611332173617539,-1.0916124112952643,-1.5489961581107239,-1.9715925807633052,-2.3024069077175473,-2.497988645668336,-2.535172805200655,,, +36.203125,72,-2.414665324363381,-2.160914348500791,-1.8182875022233616,-1.4441506301764553,-1.099926075138898,-0.8415232386582656,-0.7106319187382959,-0.7282345158327653,-0.8913475770375626,-1.173500141089102,-1.5288742999043952,-1.899462962771267,1.035817275525729,0.5874120053949058,,, +36.2109375,72,0.18517406267435355,-0.04182120912914433,-0.0130464671645526,0.2811842274770151,0.7768424919549238,1.353522653447542,1.86723919105478,2.1896977322982414,2.243278441984014,2.0221456289932203,1.59369965107233,1.0799746362646285,0.6240816284414757,0.3508951919402725,,, +36.21875,72,0.33275902221162623,0.5696103586763835,0.9889710363636629,1.4658079598109373,1.8568199635206177,2.0397539755828733,1.9469748125030182,1.5840876356156763,1.0285085157705605,0.4083739805359791,-0.1324312731249041,-0.4735448997497441,-0.5509342068947947,-0.3742503105067019,,, +36.2265625,72,-1.5615077713422971,-1.6991704007913326,-1.8303125012089765,-1.9528091818074018,-2.0646790699464423,-2.1641188519054415,-2.2495347000510177,-2.3195700361985208,-2.3731291451221033,-2.4093962248277734,-2.427849540101934,-2.428270431589728,-2.4107470227309618,-2.375672559721257,,, +36.234375,72,-2.3237384136365464,-2.2559218673258723,-2.173468900986187,-2.077872277909395,-1.9708453141793534,-1.854291791665628,-1.7302725411972566,-1.6009692810870302,-1.4686463442470161,-1.3356109640954688,-1.2041728146871769,-1.07660351356444,-0.9550967964585639,-0.8417300612215372,,, +36.2421875,72,-0.7384279543793779,-0.6469286379302779,-0.5687533270833842,-0.5051796323444362,0.43385483299227867,0.6601346277267888,0.8390830516384028,0.9584091666096328,1.009845279884657,0.9897237677900819,0.8992334737786848,0.744337799714581,0.535360199711968,0.28626597809208715,,, +36.25,72,0.013690469907516142,-0.264218632788628,-0.5290640863094467,-0.7634789793407931,-0.95233445240272,-1.0837910425742832,-1.1501203485426026,-1.1482397280118073,-1.079922751368875,-0.9516707466994451,-0.7742544050689276,-0.5619574233202427,-0.33157494010598854,-0.10123662046257861,,, +36.2578125,72,0.11086352743593247,0.28774201533350086,0.4148165029893741,0.48092915005901893,0.479131314836476,0.4071748646180645,0.26767582102917775,0.06793891251062023,-2.2241298445894673,-2.4481603991892618,-2.5318159332673797,-2.4565583790237864,-2.227975994222553,-1.8749540909159974,,, +36.265625,72,-1.445219736188562,-0.9979541280284054,-0.5946230623752171,-0.2894534383902563,-0.12103887088826715,-0.10638160649126804,-0.2382984662572184,-0.4865945675225842,-0.8028217225299981,-1.1278800769533928,-1.4012787011494532,-1.570612457160533,-1.5997787808345167,-1.4746542870613901,,, +36.2734375,72,-1.2053467574860832,-0.8246714790146255,-0.38308898695437993,0.059107568961515145,0.44113882071185195,0.7111638216879976,0.8343152110732569,0.7980935876228556,0.6142810790595842,0.3170762303541528,-0.04225913378012226,-0.40340715670298943,0.6682556590020996,0.752416436150201,,, +36.28125,72,0.56571351044659,0.12473117334782496,-0.48403379287583426,-1.1276334452065937,-1.6628642413424548,-1.9752788555848408,-2.01032437188827,-1.7880748318187023,-1.3975223228625486,-0.9719930780709828,-0.6524280041499653,-0.5485929136001659,-0.7088509906856257,-1.1067832049276363,,, +36.2890625,72,-1.6483246927949846,-2.1974621310697686,-2.613449920370674,-2.7893458365897197,-2.6813049763056043,-2.3206034887839575,-1.8050966258332346,-1.2724518698094713,-0.862492600028866,-0.6789720333942479,-0.7612531275109773,-1.073655024030714,-1.5153845682160079,-1.9483295278191846,,, +36.296875,72,-0.4572191727499899,-0.42559985225352115,-0.41075310961405676,-0.4128063650502144,-0.4315807959212469,-0.46659448038573026,-0.5170708539899146,-0.581952331107825,-0.6599188527107716,-0.7494110356886428,-0.8486575183617637,-0.9557060233476571,-1.0684575938548733,-1.1847034038972604,,, +36.3046875,72,-1.3021634978649135,-1.4185267810867996,-1.5314915611206164,-1.6388059298594397,-1.7383072793193182,-1.8279602591547435,-1.9058925112143794,-1.9704275553800217,-2.0201142508084793,-2.053752316651238,-2.070413465333691,-2.069457778284845,-2.0505450373170877,-2.013640813176934,,, +36.3125,72,-1.9590172045856498,-1.887248214757746,-1.799199846277521,-1.6960150876942977,-0.18054474807243243,-0.46289184890756685,-0.7618575636394648,-1.059030878833131,-1.336111227652296,-1.5761774231937025,-1.7648604219063553,-1.8913381537226615,-1.9490830633036451,-1.9363102509372783,,, +36.3203125,72,-1.8560949796028419,-1.7161513706786486,-1.5282877369242671,-1.3075765502284458,-1.071296940705108,-0.8377234855169393,-0.6248457641193749,-0.44910798408131947,-0.32425658162710347,-0.2603761711103556,-0.26318108298495835,-0.33361190627729764,-0.46776518206823114,-0.6571611622125927,,, +36.328125,72,-0.8893309725372202,-1.1486822460170565,-1.4175828721563044,-1.6775872981738724,-1.9107198762664999,-2.1007257725090773,-2.2342022141983597,-2.3015311960723808,-0.7064080197442653,-0.9010144456272858,-0.9545295446249793,-0.8569071605669987,-0.6223202745760544,-0.2869531640228465,,, +36.3359375,72,0.09663879480686,0.46772316322405055,0.7668620040212837,0.9451856586625685,0.9720242097926682,0.8397078805093043,0.5647885555926122,0.18549202049620672,-0.24420241834484196,-0.6629329820885376,-1.011473498606812,-1.241916232645546,-1.3250894182556678,-1.255054411769316,,, +36.34375,72,-1.0499822595691477,-0.7492734102457848,-0.4073694596152304,-0.08522105773170441,0.15925882186746598,0.2802690107726502,0.251308039600858,0.0693559540501244,-0.24460157745192945,-0.6487887862118252,-1.0870944073461044,-1.4977603084461268,-2.0406449891307292,-1.5686179510949276,,, +36.3515625,72,-0.9667099253148667,-0.37583926106980403,0.0664831687251689,0.26360816996611147,0.18600477892924683,-0.12087482168644548,-0.5492754468172324,-0.958886808212391,-1.215504178041775,-1.2280041970627895,-0.9735000852470855,-0.503780309656052,0.06873545185940155,0.6016753630127843,,, +36.359375,72,0.9616224830764014,1.0605875811743792,0.8800524335715415,0.4759946886547748,-0.03648243562593592,-0.5147028590733075,-0.827505084410989,-0.891151875271567,-0.6922207982065165,-0.29120261613257203,0.19417788418335144,0.6213463869359258,0.8620920834844561,0.8378608019272377,,, +36.3671875,72,-1.5790940546379302,-1.4500696331021454,-1.3107790512903637,-1.1632318777137,-1.0095750058008572,-0.8520552380419876,-0.6929801247256443,-0.5346777428751068,-0.3794561195576185,-0.22956300995779594,-0.08714673439266452,0.04578124009185913,0.16738131846417537,0.2760177837193434,,, +36.375,72,0.37028722985152585,0.44904292404142765,0.5114146715925467,0.5568238359025773,0.5849932505884823,0.595951850326458,0.5900339394421306,0.5678731111844524,0.5303909242781638,0.4787805351565607,0.41448557260037816,0.3391746248127957,0.254711785796851,0.16312377688848145,,, +36.3828125,72,0.06656421928335483,-0.032724316726030614,-0.13244982115707915,-0.23031122043789182,-2.2975486099514963,-2.2219031415794395,-2.0790799111607163,-1.8780872117542644,-1.6318281921239772,-1.356201299636237,-1.0689922124059317,-0.7886345291523769,-0.532925636366531,-0.3177872971788185,,, +36.390625,72,-0.15615738691202907,-0.05709005422611613,-0.025127051759262775,-0.05998406988613458,-0.15657394025168614,-0.3053650839816443,-0.49305020103006963,-0.7034785623121916,-0.9187868836778533,-1.1206499123559728,-1.291563507902992,-1.4160707330769307,-1.4818454435726391,-1.4805578019821286,,, +36.3984375,72,-1.408461347917183,-1.2666606724628973,-1.061041017100629,-0.8018646918519918,-0.5030624407058195,-0.18126915428562856,0.14532884318092523,0.45825456632447825,-1.8229511186130218,-2.017714605812463,-2.0569374357385657,-1.939213165084797,-1.6870202463716257,-1.3431825438700677,,, +36.40625,72,-0.9641638647081976,-0.6112411130417315,-0.3409310747794191,-0.1961620742625081,-0.1995657088054298,-0.34993363501056507,-0.6223913880693573,-0.9722622478975084,-1.3420194014612201,-1.6702436115299664,-1.9011912130620208,-1.9934821755867829,-1.9265550032423504,-1.7038830499620459,,, +36.4140625,72,-1.352451233113665,-0.9185745710552803,-0.46070973014157435,-0.04037910177410142,0.2873791055841043,0.4825474670447413,0.5263231877291996,0.4240046609889352,0.20412134762671402,-0.08605727759309888,-0.3879339730431256,-0.6407624283793641,-0.547101780469831,-1.0732168748226658,,, +36.421875,72,-1.4119339243210471,-1.4876380514331902,-1.2968272467944022,-0.908847706335786,-0.44666409764838866,-0.0529371978287152,0.14929186869379873,0.09053343680411341,-0.22590456177595308,-0.7246328624537787,-1.2786650723344812,-1.7440574400320161,-1.9992120684169277,-1.9780731920186398,,, +36.4296875,72,-1.688119708703624,-1.2082238738210909,-0.6669639632653281,-0.20733550131783407,0.05246680379992519,0.051447575876069296,-0.19748986245782352,-0.6111199991459066,-1.0587670289224786,-1.3982031554859835,-1.514733971153551,-1.3527579087604311,-0.931149204827856,-0.3382471261961433,,, +36.4375,72,-0.3240389130957259,-0.4114347551121434,-0.4904107946710633,-0.5590260779230991,-0.6155208811559679,-0.6583477698413169,-0.6861989405719664,-0.6980293670002251,-0.6930753443578348,-0.670868107703979,-0.6312422853158717,-0.5743390390636369,-0.5006038366480337,-0.41077889457341366,,, +36.4453125,72,-0.30589042404513905,-0.18723090298051803,-0.0563366844163975,0.08503866674339894,0.23495484190216154,0.3913185284966324,0.5519198306301795,0.7144707330144844,0.8766449348472583,1.0361183562654563,1.1906096082283715,1.3379197173362432,1.4759704101224014,1.6028402865861837,,, +36.453125,72,1.716798249690719,1.8163336055914612,1.900182307663307,1.9673488849057525,0.7400212992538932,0.9753443776011885,1.1521993374421202,1.2626526600454737,1.303407199159078,1.2760242737406342,1.1868069562431263,1.046352712502555,0.8688066064128908,0.6708671631047513,,, +36.4609375,72,0.4706142321231366,0.2862406045006316,0.13477584897603545,0.03089137497809924,-0.014129934440291203,0.006812347160627619,0.09613407529221785,0.25139126560314407,0.4654439074289123,0.7269474511913399,1.0211377108157993,1.3308544610690898,1.6377323642374295,1.9234761916021132,,, +36.46875,72,2.1711314264218236,2.366261656602296,2.4979506644163316,2.559559344417284,2.5491846766016564,2.46978875780054,2.3289889014347738,2.1385234497984005,-0.7911625261289736,-0.8014898479582164,-0.6557555560944563,-0.36217431546006623,0.04805688280951975,0.5255590827552354,,, +36.4765625,72,1.0104035216116916,1.4413871298615712,1.765506958828855,1.9461581352188078,1.9687787556837564,1.8430627819183967,1.6013965421654257,1.2937626301902252,0.9799052047919137,0.7199772334773048,0.5651266571034791,0.5494879523571293,0.6848266565020763,0.9586711904192748,,, +36.484375,72,1.3362231344689466,1.765748580337143,2.186610967960807,2.53869437241608,2.7717496162769892,2.8532075831623134,2.773242829211073,2.5462988490254905,2.208837447552156,1.8136627636695737,1.4217039861942287,1.092536604123942,1.1246000738178679,1.1616723589809321,,, +36.4921875,72,0.9511678425286071,0.5839372156916197,0.19397862907071828,-0.07853057451603362,-0.1258967023869636,0.0973313728402343,0.5616654199825518,1.1705251287064424,1.7864808506280403,2.268701479890032,2.5113460726796024,2.4723790509089945,2.1849133228368522,1.7479740906176053,,, +36.5,73,1.2992161359491254,0.9770732210464058,0.8827144066170189,1.0522348212807184,1.4467032670898186,1.9627948227820071,2.4610946714276825,2.804316019279332,2.8949576092482188,2.702079715343208,2.2698595976465348,1.7055809008280518,1.1503478250782386,0.740549335336485,,, +36.5078125,73,2.017123670875299,2.0490950315779575,2.0631563783214215,2.05950784283905,2.0386525854592774,2.001387801067378,1.948790580443445,1.882198874646691,1.8031878958488727,1.7135423679349588,1.615225112851661,1.5103425228413314,1.4011075232341936,1.2898006743925161,,, +36.515625,73,1.1787300939979568,1.0701909015168232,0.966424895041812,0.869581166647096,0.7816783459401176,0.704569132998495,0.6399077417803465,0.5891208241325903,0.5533823835799121,0.5335931182019821,0.5303645543619926,0.544008249151945,0.5745302506664439,0.6216309131495101,,, +36.5234375,73,0.6847100702912106,0.7628774761282846,0.8549683307630366,0.9595636190790471,1.913430555866193,1.6709972063803253,1.4295517790027312,1.207184336350557,1.0204838980869797,0.8833807474675515,0.806174503533736,0.7948157352966221,0.8504912131182232,0.9695417180998859,,, +36.53125,73,1.1437181391215065,1.3607579964887686,1.605242185948093,1.8596721953869717,2.1056926714548294,2.3253740768522424,2.50246598795078,2.6235336289716304,2.678898380525975,2.6633166690550425,2.5763498865550862,2.422399534723324,2.2104051319710685,1.9532259377314174,,, +36.5390625,73,1.6667495963090004,1.3687898447095228,1.0778501375719238,0.8118393918495344,0.5868293922175127,0.41594049262119204,0.3084333024483721,0.26906968146796595,0.8751184920643434,0.8001836497519871,0.8754782061788204,1.0845805817823155,1.3894894318400628,1.736576124448212,,, +36.546875,73,2.0649744452275978,2.316100593799742,2.4428204728755083,2.4168361926772506,2.233141067054106,1.9108489636958055,1.490268573872929,1.0266780315399262,0.5817692419192066,0.21409422834193903,-0.029998757720289815,-0.12352790512938927,-0.06302395879864253,0.13098570425255618,,, +36.5546875,73,0.41723014465622665,0.7401781049325251,1.0387413444209344,1.255842195940709,1.3473548752371496,1.2890276241616259,1.0803072741368813,0.7444702920965426,0.3250396683130514,-0.12095448107420159,-0.531821101245886,-0.8507835205362508,0.9828110250265522,1.4074136880939414,,, +36.5625,73,1.8004916269420783,2.0288802787448477,2.0036846716479992,1.704875688928009,1.1870154533745434,0.5645405137674822,-0.019365897974471302,-0.43178351340859306,-0.5862573254570852,-0.4662726418834049,-0.1295710821015007,0.3078734632043517,0.7038254046443013,0.9289407127227061,,, +36.5703125,73,0.902370597744507,0.6140563334019662,0.1276036713060198,-0.4370519771924193,-0.9364394840361306,-1.2428178872913622,-1.2791530632025894,-1.0402193757755263,-0.5940430120509275,-0.06329125762643126,0.408292023074325,0.6952062531402972,0.724493736671266,0.4956194556826639,,, +36.578125,73,1.0750149063480858,1.199473156588613,1.3309210690860223,1.467208366883471,1.6060894193614617,1.745262540142408,1.8824102722335039,2.0152399550163724,2.1415238627621855,2.2591382118501784,2.3661003536647907,2.460603501926835,2.541048386367902,2.6060712784822795,,, +36.5859375,73,2.6545678986106864,2.6857127857201952,2.6989737906976323,2.694121439349103,2.6712330011315535,2.630691192339225,2.5731775364164617,2.4996604976170835,2.4113785957470903,2.309818797605063,2.1966905634343523,2.073896002784831,1.943496662292834,1.8076775268698653,,, +36.59375,73,1.6687088645752806,1.528906583201409,1.390591792664559,1.2560502811850374,0.2977875875721453,0.3897124350945711,0.5355041552529686,0.722015740449971,0.9332173332175149,1.1513214031375956,1.358030532484683,1.5358207813239253,1.66917112170995,1.7456531914014837,,, +36.6015625,73,1.7568053578936276,1.698730124403288,1.5723732017756133,1.3834647689013786,1.1421270010903561,0.8621752182831235,0.5601613701073241,0.2542265427734133,-0.03715750933964773,-0.2964700655186253,-0.5083570115095236,-0.6606955317702442,-0.7454336905542929,-0.7591463684134532,,, +36.609375,73,-0.7032687995918144,-0.5839914371284366,-0.41182348856881956,-0.20085556921351355,0.03222709933550496,0.2693121229858144,0.49212658358940625,0.6835145664725623,-1.0347926685963582,-1.0612056365314442,-0.9312894905046945,-0.6700047147023247,-0.32210210719989046,0.05485886877063037,,, +36.6171875,73,0.3994827966463932,0.6561045021641787,0.7834587363195821,0.7611030066959164,0.5925931982366239,0.304917415434664,-0.05572369977149148,-0.43113284434500787,-0.7602041019148006,-0.9884675195630118,-1.0766034459916092,-1.00660031092206,-0.7845965553206994,-0.43996386721234065,,, +36.625,73,-0.020774299601509824,0.4136429371932759,0.8018959303213495,1.0900439330920269,1.2399490737390715,1.2351653515215852,1.0834479549120228,0.8154923449447249,0.48009978486240007,0.13652259972651143,-0.1548182773317648,-0.34179739093385464,-0.7923587944503376,-0.9855284619547069,,, +36.6328125,73,-0.9087591331981977,-0.5680597167529018,-0.041195880104803406,0.5434063268983935,1.0416372069669746,1.3329765654847128,1.353301833549195,1.1122415909253844,0.6903205373821861,0.21668047799822354,-0.1665146400825036,-0.34323217866382216,-0.2555501084304538,0.08030414775411987,,, +36.640625,73,0.5782527029982488,1.1058272667103426,1.520361884452365,1.708000148641051,1.6148271280664603,1.2615944521748317,0.7380034124264055,0.17811327426731155,-0.2763851997415542,-0.5149654414414335,-0.48849750689081134,-0.22263190622085105,0.1893326081765084,0.612141710681229,,, +36.6484375,73,1.12749261475987,1.0070155585073872,0.896565495314914,0.797904482251461,0.7125795390068224,0.6418957060342882,0.5868933440577409,0.5483300723373471,0.5266676618620675,0.5220641128721802,0.5343710553378844,0.5631365178112359,0.6076130160689762,0.6667708198071516,,, +36.65625,73,0.7393161649873845,0.8237140928264596,0.9182155154108854,1.0208880339102033,1.1296499696432174,1.2423070120095274,1.3565908414592651,1.4701990510988607,1.5808356677906936,1.686251563094737,1.784284046347182,1.8728949464710085,1.950206515585674,2.014534525621189,,, +36.6640625,73,2.064417978282549,2.098644908024819,2.116273826093858,2.116650430020745,0.8286364736025285,0.9160064838452986,0.9382958090529324,0.8928457272974782,0.7818546135401222,0.6122259220093783,0.39508771830082123,0.14501726390312641,-0.12097527567331492,-0.38463313011149936,,, +36.671875,73,-0.6277265057894466,-0.8333246372282498,-0.9869776020202844,-1.0777254844190227,-1.0988645115147975,-1.0484167321669384,-0.9292704809953156,-0.7489818261529891,-0.5192508395245962,-0.25510920290459727,0.026124207550350144,0.3060469374004269,0.5664518484699369,0.7905921210409853,,, +36.6796875,73,0.9643441622940481,1.0771873395039493,1.1229322304923453,1.1001466210775996,1.0122495568550853,0.8672669047567703,0.6772654843027666,0.4575052432422955,-0.38875611179029124,-0.28210823210401026,-0.03250642694237693,0.3267681298791192,0.7449424355469546,1.1616148070047152,,, +36.6875,73,1.5161200281788776,1.756938059097196,1.8496810723990906,1.7824150015005453,1.5674869333117227,1.2395738952542967,0.8502571069080433,0.4599669257649291,0.1285532260830866,-0.09404997350695898,-0.17561151772893047,-0.10662882805683938,0.0981905009627626,0.40222200942223907,,, +36.6953125,73,0.7526353884658352,1.0886336629409719,1.3509372015875907,1.4910353069637297,1.4787643175079548,1.3070317887257605,0.9929508142578748,0.5752076683701925,0.10807261335139587,-0.3470134572238748,-0.7309663084014216,-0.9962158704289694,0.7438472424880859,0.2770379563345568,,, +36.703125,73,-0.3378731092886848,-0.9626494490102866,-1.4569548697326975,-1.7165833043930019,-1.7017810301523282,-1.4479011498339285,-1.0554724246215181,-0.6624064673903434,-0.4059626382646514,-0.38489706340835894,-0.6321716887498798,-1.1057050258260182,-1.6997014760510802,-2.2734560466250633,,, +36.7109375,73,-2.689741671571069,-2.8522599117443295,-2.731892357537294,-2.3745592862519325,-1.8885328507697112,-1.414682787621662,-1.087810123437798,-0.999666671060045,-1.1737958775301025,-1.559090500927015,-2.043832663431532,-2.4863680158495836,-2.7540066333221143,-2.759488361862893,,, +36.71875,73,2.099419285856776,2.0645302784590243,2.012239716753258,1.9431060744848732,1.8579804409045533,1.7579918484614008,1.6445277342818823,1.519209877415995,1.383866233054473,1.2404991567628911,1.091250574987499,0.9383647115646899,0.7841490227496551,0.6309340246592906,,, +36.7265625,73,0.48103271641250367,0.3367003093305492,0.20009496720788256,0.07324024494930992,-0.04201011685699352,-0.14400442511946732,-0.23132173090688335,-0.3027964872469483,-0.35753873643608713,-0.3949494735077753,-0.41473091697479414,-0.41689150713083023,-0.40174554451850775,-0.3699074750161476,,, +36.734375,73,-0.3222809217352459,-0.26004265590071085,-0.1846217875003866,-0.0976745401985254,0.22536861432857308,-0.0008582717790330263,-0.20326751166414436,-0.36558508339269147,-0.4743126526083995,-0.5196758920301715,-0.49631316814777704,-0.40365655382388066,-0.24597858048400445,-0.03210145257896979,,, +36.7421875,73,0.2252110154401648,0.5101363545916455,0.8048897350592258,1.0909571670260099,1.3503796304494329,1.5669986039613695,1.7275761546049393,1.8227114971498284,1.8474901242317354,1.801820256925208,1.6904331691192103,1.522547377816025,1.3112201307147588,1.0724314277344658,,, +36.75,73,0.8239644638769482,0.584160576473985,0.37063553052678144,0.1990466712313329,0.08199692506800227,0.028152087279228577,0.041632959756438104,0.12172473647576354,-1.114067855425425,-1.0791231100836485,-0.9100666153226011,-0.646703501106596,-0.34370400106271526,-0.062031879468678164,,, +36.7578125,73,0.1406083190187326,0.2188170179202359,0.1466291414614478,-0.0783833244901817,-0.4346750324293761,-0.8800254830004155,-1.3580583213434154,-1.806966591504409,-2.1690852253860364,-2.399820074434027,-2.474543005827691,-2.392379371304117,-2.1762981750601567,-1.869491128920689,,, +36.765625,73,-1.5286047948276344,-1.2148801482272584,-0.984579810469803,-0.8801941309562078,-0.9237959721794338,-1.1135793607025066,-1.4241212440771989,-1.8103256807049113,-2.2144362110730307,-2.5750242528696328,-2.8365535653981677,-2.958031081922317,-1.382060946744077,-0.8126902016033867,,, +36.7734375,73,-0.410943833183846,-0.2611323347944009,-0.3772066050362971,-0.6991573826409496,-1.1096924855942847,-1.466619033741115,-1.6420535221612744,-1.5577112760657463,-1.2066013341219046,-0.6551786834454396,-0.0253618550284182,0.5386577595296009,0.9097203055434802,1.012345337724247,,, +36.78125,73,0.8432290351723085,0.471974773424845,0.021858372623066002,-0.3640989162823086,-0.5624500833250341,-0.5032572968182002,-0.18934069460889896,0.3044351558109395,0.8516420368542523,1.3089231965401895,1.555290410797173,1.5253126955239913,1.227100280742969,0.740154418696476,,, +36.7890625,73,-0.0010550523121425348,0.10321728475589803,0.2129933786132561,0.3260322558801398,0.4400404877533011,0.5527125306955689,0.661771275774135,0.7650080965300573,0.8603216940439563,0.9457550589163476,1.019529902873245,1.0800779569993002,1.1260685884785229,1.1564322521860442,,, +36.796875,73,1.170379366403198,1.1674142820637743,1.1473441008438154,1.1102821876126225,1.0566463156642913,0.9871514771325265,0.902797484405659,0.8048515795714466,0.6948263563332974,0.5744533809186381,0.4456529738197199,0.31050068142343445,0.17119102455955973,0.02999915867537664,,, +36.8046875,73,-0.11075888308610499,-0.24876666780221918,-0.381747852965909,-0.5075059800123876,0.2629239102178257,0.45531943715313894,0.6852815862519035,0.9364104438775768,1.1906779365446138,1.4296837394167028,1.6359374956770494,1.7940779363627528,1.891943889564994,1.9214224952856283,,, +36.8125,73,1.8790154775900743,1.7660839856063264,1.5887549285205331,1.3574953339844993,1.0863844083227399,0.7921340563094454,0.4929261582088636,0.2071476790671501,-0.047888191059944574,-0.25714569390605113,-0.40891102970357207,-0.4956049240429853,-0.5143065811514015,-0.4669524964890104,,, +36.8203125,73,-0.36019627533436893,-0.20493924379840256,-0.015564596027733413,0.19107150468532996,0.396821504231135,0.5835183067474718,0.7342486903835871,0.8345394759620415,-2.919396690392627,-2.7246566926574336,-2.4012728405596424,-1.9959020402681524,-1.5671501985154275,-1.176468727699933,,, +36.828125,73,-0.878611498223592,-0.7131384704194251,-0.6982891947958285,-0.8281802327851913,-1.0737628160689519,-1.3873913705162337,-1.7102911057358257,-1.9817613136990029,-2.148680662659519,-2.1738337250039783,-2.0417615678928698,-1.761224868433521,-1.3638956262725879,-0.8994809578462278,,, +36.8359375,73,-0.42803817558584323,-0.01067782609001433,0.29989755488368686,0.46754562315822057,0.478257885847672,0.342286996907727,0.09249662880698661,-0.22080879321563399,-0.5377689366904705,-0.7983386297932483,-0.9516853185947308,-0.9641489831803344,-0.5283483579153443,-0.5235730082885063,,, +36.84375,73,-0.26681586894430603,0.15917621211712682,0.6241673913732967,0.9863273608855653,1.1313121109813158,1.0038180343815444,0.6229592526541713,0.07725157427726792,-0.49942431729898207,-0.964294826193866,-1.2046068174782785,-1.1683195056128775,-0.8781651664007155,-0.4252270103167662,,, +36.8515625,73,0.05620380872325281,0.42559936036855484,0.5748599724932582,0.4580747307521995,0.10421966354445045,-0.39068772915765837,-0.8898283646732184,-1.253025098504528,-1.3751283155218612,-1.2148236343177854,-0.8059665729783123,-0.24833765239158515,0.3196485538148008,0.7588012372653798,,, +36.859375,73,-0.6239628744332972,-0.729194980129407,-0.8214669918142116,-0.8992621966009103,-0.9613089935115995,-1.0066031265761395,-1.0344252422379774,-1.0443534636499447,-1.0362707616982747,-1.0103669936940736,-0.9671355740402856,-0.9073648351704909,-0.8321242300292276,-0.7427456176792158,,, +36.8671875,73,-0.6407999597168959,-0.5280698355284261,-0.4065182576251919,-0.2782543330877571,-0.14549637235555596,-0.010533091305989346,0.1243164140573299,0.25674321949949724,0.3844889409989916,0.5053852129387044,0.6173915848166005,0.7186311729526004,0.807423442980133,0.8823135491483031,,, +36.875,73,0.9420977167634914,0.9858442233765411,1.0129096113965133,1.0229498483101716,0.8733737183337384,0.8439660428661376,0.7442430446965522,0.5769952349734042,0.3496899220595927,0.07395805950367623,-0.2352091723162347,-0.5604980429528189,-0.8834718637142744,-1.1858488604526252,,, +36.8828125,73,-1.4507692345126972,-1.6639630730110468,-1.814737683685189,-1.8967155216165534,-1.9082712670435087,-1.852637592511496,-1.737672260773884,-1.575302811145041,-1.3806875745198077,-1.1711515383124191,-0.9649712826657064,-0.780093733659325,-0.6328780940248123,-0.5369486951685885,,, +36.890625,73,-0.5022387789848262,-0.5342919032825107,-0.6338696992193541,-0.7968933456828345,-1.0147228538249013,-1.2747546977769755,-1.5612961276368982,-1.856655206229855,-0.8245245007046258,-0.5458435014030132,-0.16337800209218456,0.27082340330170207,0.6960159262536839,1.0521971056946318,,, +36.8984375,73,1.289433479386797,1.3756228160039141,1.3014829686229352,1.0819903580760974,0.7540440625857087,0.37071935082271446,-0.0069943133758398335,-0.3196839805346074,-0.5187544672478686,-0.573980852896363,-0.47819597668081093,-0.24838294869713623,0.07699735432302707,0.44402739871791985,,, +36.90625,73,0.791764718847043,1.061770784441741,1.2072526363289975,1.2003932153060546,1.0367284161948165,0.7358888750803662,0.3385906987962452,-0.09965641682095083,-0.5171439575772716,-0.855523847790578,-1.0688435722715846,-1.1306501828286095,0.6194778275817837,0.20419409669848732,,, +36.9140625,73,-0.19908223555929916,-0.4537028502981039,-0.4627674261560071,-0.1958926100345879,0.30223974666950204,0.9238998961828884,1.5276015311046072,1.9766413951251431,2.1763267730460276,2.0996900927811275,1.7946452035391793,1.370626148439826,0.9683724370802501,0.7211437976061964,,, +36.921875,73,0.7179962270809948,0.9791861178672967,1.450445177955366,2.0176968109642393,2.5381820822238383,2.8794658602948253,2.9556338297938227,2.75076078517252,2.3232189822201392,1.7896462897543466,1.2929683178420661,0.9632388179396941,0.8820307378499899,1.0601369787870762,,, +36.9296875,73,1.0159262391567414,0.9921059877982153,0.9520573972270754,0.8966397930269854,0.8269883464996335,0.7444940632865191,0.6507792879586775,0.5476691535751257,0.4371594762113356,0.32138165670825236,0.20256520430849378,0.08299853847189155,-0.035011244668823466,-0.14917893662984394,,, +36.9375,73,-0.25728140129938865,-0.3571966763199873,-0.4469413063733261,-0.5247052545498881,-0.588883780401997,-0.6381057263888976,-0.6712577173025858,-0.6875038488374772,-0.6863005204372132,-0.6674061525815232,-0.6308856182454599,-0.5771093108151015,-0.5067468646607651,-0.42075563819572914,,, +36.9453125,73,-0.32036416095813586,-0.20705083443002842,-0.08251825941722502,0.05133636061508806,-2.142370567338169,-2.4004951491910997,-2.6148443923848053,-2.7721218686789375,-2.862843853484187,-2.881998374364745,-2.829392782932243,-2.7096656169435165,-2.5319619287224637,-2.3092947227602947,,, +36.953125,73,-2.0576370331417086,-1.7948079539327848,-1.539230303172107,-1.3086465516602481,-1.1188825572416055,-0.9827453108332992,-0.909131554547103,-0.9024094266845459,-0.9621162485365395,-1.082993521565443,-1.255356688010579,-1.465773863092881,-1.6980062006668157,-1.9341443089154626,,, +36.9609375,73,-2.155861460791584,-2.3456961987328455,-2.4882748827984114,-2.5713889186373096,-2.5868515347473426,-2.5310743506236903,-2.405323516708771,-2.2156375510198365,-1.0380569925274967,-0.8121398390838708,-0.49460148706662554,-0.141223993376356,0.18687085153923522,0.43279149578556136,,, +36.96875,73,0.5527861658348956,0.5231040023413994,0.3437388794480676,0.03847254428278912,-0.3487898741865083,-0.7608214415191714,-1.1359529019665495,-1.4176472325117964,-1.563278151516613,-1.5507454376920118,-1.3818968250562387,-1.0822236133098053,-0.6968775019774025,-0.2836291254541129,,, +36.9765625,73,0.09613490819576309,0.38697417917872623,0.5480264456238393,0.5593649882447562,0.4250911462117839,0.1726804125554917,-0.15131599411859237,-0.4885444906921051,-0.7779644512094139,-0.9653856025336751,-1.0119418485386247,-0.9001815162748666,2.272833748524705,2.466674981099976,,, +36.984375,73,2.391702367983635,2.0433757767140985,1.490373146247736,0.8559720898381813,0.284478965001276,-0.09809574010145639,-0.21834002907801764,-0.07532179871866584,0.2593977378271183,0.6616201177822745,0.9887910570765763,1.1193095641747175,0.9860891563312097,0.595170971716064,,, +36.9921875,73,0.024285467041345737,-0.598245030887038,-1.128482563716059,-1.4461443320796665,-1.4874066542510715,-1.262252921364829,-0.8516122391140091,-0.3850740356105515,-0.005287273497772693,0.17119793950109452,0.08591371615277421,-0.24548323056593502,-0.737507002435634,-1.2582983475237648,,, +37.0,74,0.19245422214086377,0.3386507523646646,0.48765364093646246,0.6371424067941112,0.7847888074475539,0.9282973832745678,1.0654454270343905,1.1941216788641094,1.3123630693509836,1.4183888674410023,1.5106316353920899,1.5877644488875837,1.6487239058200638,1.6927285210006728,,, +37.0078125,74,1.7192921848360156,1.7282324504476356,1.7196735042602582,1.6940437681802143,1.652068175480589,1.594755255777012,1.5233792553677543,1.4394576061395328,1.344724137694759,1.24109850187672,1.1306523452032478,1.0155728216546034,0.8981240848294375,0.7806074338739935,,, +37.015625,74,0.6653208111416222,0.5545183609088935,0.45037075739315857,0.3549269968450214,-1.9724125877919536,-1.6896839454365618,-1.3841540973172266,-1.0740348125742427,-0.7777841924045077,-0.512826656149886,-0.2943451202303321,-0.13422957848880168,-0.04025538592562605,-0.015548529706309044,,, +37.0234375,74,-0.05837515865430887,-0.16227003078816749,-0.3164949045707893,-0.506794891528309,-0.7164000101175985,-0.9272020821414444,-1.1210248859341045,-1.280898977577636,-1.3922522661216787,-1.4439333037098894,-1.4289959171268463,-1.3451904499974656,-1.1951273441780756,-0.9861016380936262,,, +37.03125,74,-0.729590605513541,-0.44045955166770484,-0.1359311351902316,0.1656099250009413,0.445893419132101,0.6880324853038546,0.8776962490183576,1.004104502646856,-0.6368252553565787,-0.2517618362548208,0.20656195486281143,0.6786395026715741,1.1031229874831099,1.4263268494381482,,, +37.0390625,74,1.6105361383871901,1.639825949998139,1.522485817711347,1.2896717322662352,0.9904960321344068,0.6843202316952264,0.4314515129271792,0.2836922442806481,0.27621478089114815,0.42202737784865874,0.7098934643330805,1.1060286414621021,1.5593113590132828,2.0091959435028106,,, +37.046875,74,2.395095734545609,2.6657750980103834,2.7872876891741454,2.7482247545827687,2.5614562219882417,2.2620935785649756,1.9019919970445,1.5416481820567667,1.2407560206564237,1.0488911559008556,0.9977755020918223,1.0963266157278184,-1.7480219770815775,-1.3907887437450388,,, +37.0546875,74,-0.8654096896845132,-0.3065065634483799,0.14370240902421993,0.37420335597884224,0.3354228118074878,0.0526140368607374,-0.38127324296428994,-0.8312834655102809,-1.1576631173019885,-1.254386184345503,-1.0784363509070096,-0.6618184235342555,-0.10300487559404231,0.4598403392600246,,, +37.0625,74,0.886524196324481,1.0730530612251163,0.9799518015090614,0.6429138909385343,0.16286526634354154,-0.3218333730019943,-0.6734259729317104,-0.7926156125758057,-0.6458583071801713,-0.27461491516165143,0.21597512278043365,0.6858944246967252,0.9986294921686333,1.0586144001074735,,, +37.0703125,74,0.27007832286177336,0.1975249166962204,0.13874593593654594,0.09497342629097927,0.0671705633932449,0.0560146057297638,0.06188485728648707,0.08485585080149927,0.12469587108880242,0.18087084439472512,0.25255352578643087,0.3386378238023974,0.4377580116388895,0.5483124885810307,,, +37.078125,74,0.6684916757123108,0.7963095575369856,0.9296383173175122,1.0662454597462752,1.2038327710205294,1.3400764342149714,1.4726675976066017,1.5993526856863474,1.717972747081121,1.8265011504787636,1.9230789685712524,2.006047430505439,2.0739768746687424,2.1256916949023146,,, +37.0859375,74,2.1602908433927217,2.1771635312906934,2.175999852188913,2.156796142490884,1.0607750730428698,1.0459717706859855,0.9628216924303296,0.8190937062471219,0.6266535724611341,0.4006337044061098,0.15837546973063246,-0.0817822057119395,-0.30178345245445726,-0.4851159855350089,,, +37.09375,74,-0.6179636426816328,-0.6901705604301126,-0.6959497519220588,-0.6342866746581413,-0.509009646619457,-0.32852220172391655,-0.10521605044298354,0.1453944153546377,0.4057557158519927,0.6575014080625533,0.8827352350013025,1.065281815074433,1.1918176502385305,1.2528035765040264,,, +37.1015625,74,1.2431536256780436,1.1625936474057366,1.0156846738913374,0.811509387556403,0.5630435441612678,0.2862561723465601,-0.0009987167431740052,-0.28022163801085304,1.3292630596599193,1.6594830123007027,2.033845649893403,2.3914548088431418,2.6731546708167278,2.8307584134051877,,, +37.109375,74,2.834572340647142,2.678043475411359,2.378806611918253,1.975967610585835,1.524045924048588,1.0845196678634457,0.7162899489612047,0.4665494804077195,0.36347752650212417,0.4118987480964863,0.5925818624436803,0.8652871004548384,1.1750875393824711,1.4609794571680281,,, +37.1171875,74,1.6654403203386792,1.7434454128783063,1.6695384287950228,1.4418544538884848,1.0824684425315612,0.634014619156043,0.15310305915921493,-0.2984414364711379,-0.6631538643669197,-0.896825934089523,-0.9753399029416858,-0.8983751842445992,-0.19917747829375715,-0.7640862919540644,,, +37.125,74,-1.177351836115439,-1.3465497569748455,-1.2474959879493177,-0.930692498498682,-0.5072904901077042,-0.11841988765566258,0.10370711643011987,0.07225613005689746,-0.2302004272901651,-0.7466731143691152,-1.3611393568413943,-1.9301073381419882,-2.3217113390062956,-2.4516258041306367,,, +37.1328125,74,-2.3059572622397146,-1.9448421423333984,-1.4857663819282403,-1.0711802715183296,-0.8292860670842923,-0.8387469089416879,-1.1069907253108138,-1.5680566606449673,-2.100575376322189,-2.5609562978300664,-2.8226869230086136,-2.8109739744711653,-2.523232636058789,-2.0298085213857893,,, +37.140625,74,2.119854984853673,2.065779854685851,1.9954645034764145,1.91007726488971,1.8110405584531084,1.7000059497578195,1.5788252038916786,1.4495178389761552,1.3142357479681426,1.1752255082039764,1.0347890386616694,0.895243293837411,0.758879699997675,0.6279240440849624,,, +37.1484375,74,0.5044975176103526,0.3905795976547555,0.2879734149206361,0.1982742152258128,0.12284146666730689,0.06277510083416438,0.0188963040685578,-0.008266804906334135,-0.018488360234116263,-0.011848636245297084,0.011267431183603183,0.05017706330520266,0.10391167777614929,0.17123393768410888,,, +37.15625,74,0.25065951174940504,0.3404831646384603,0.4388087204933538,0.5435823749642397,-0.5335519376408993,-0.7450073502211204,-0.9015923838524214,-0.9941982568143812,-1.0182316455419262,-0.9739284148663314,-0.8663304690006116,-0.7049273536930011,-0.5029876182083863,-0.2766265800219032,,, +37.1640625,74,-0.04367551678623047,0.17756884263268571,0.3696273090342844,0.5170642215103837,0.6075709246200252,0.6328311626692116,0.5891080273476756,0.47751151203509756,0.30392799853726243,0.07861657672037403,-0.18449966947879576,-0.46879800496656343,-0.7561087845278451,-1.0279762232387213,,, +37.171875,74,-1.2669392939391302,-1.457743445500903,-1.5883986592915336,-1.6510100760880007,-1.6423232845765354,-1.5639462596035274,-1.4222324860130122,-1.2278334299275495,-0.6894106544799753,-0.3920225373664785,-0.0630547132743948,0.23627457550306452,0.4499442512280711,0.5358891646013524,,, +37.1796875,74,0.472581710968745,0.26241103404850696,-0.06866663628299918,-0.47515215565865354,-0.8990754457251584,-1.2790138501648003,-1.5596522540376163,-1.7003959507392454,-1.6816947594713851,-1.5080933598033108,-1.2075326979504173,-0.8270112139825961,-0.4252815958820428,-0.06372047866971031,,, +37.1875,74,0.20320693915118504,0.33640231462444325,0.3181927959189289,0.1550493843769153,-0.12345818545734688,-0.46930705886430235,-0.8235435679918679,-1.1255103605881718,-1.3223409311586638,-1.3772424754377073,-1.2752767047550397,-1.0257379549623482,-0.6152034577104135,-0.5456553653980893,,, +37.1953125,74,-0.731081389573461,-1.0973538636994702,-1.5187639547110217,-1.852651835209345,-1.9786978016973054,-1.8321041200098036,-1.4215716250731383,-0.8271422980605234,-0.17849708740022652,0.3803451981675647,0.7302550884746118,0.8093969132822415,0.6299316148699323,0.2744423418343557,,, +37.203125,74,-0.126935398141708,-0.43240899651595965,-0.5276095769544666,-0.3571455833894587,0.060020600498745025,0.6355889811362393,1.2359579828189924,1.7186940423008332,1.971440807382638,1.9426051785887941,1.655410967853392,1.2014691912329554,0.7156276882827204,0.33899333061459946,,, +37.2109375,74,0.6526287723978629,0.7636892164048292,0.8744613446868836,0.9826395733467422,1.0859556024360824,1.1822182734223494,1.2693520805903078,1.345433661978353,1.4087256308078184,1.4577071549388738,1.4911007488245644,1.507894808744836,1.5073614966461455,1.489069659343946,,, +37.21875,74,1.452892556780534,1.399010263919389,1.327906704118741,1.2403613658290398,1.1374358475496218,1.0204554665362493,0.8909862531805218,0.7508077337815502,0.6018819781658762,0.44631945401939455,0.2863422857036552,0.12424556077347969,-0.03764263839702872,-0.19700177816345937,,, +37.2265625,74,-0.3515592825365176,-0.499130100051005,-0.6376547358907665,-0.7652350834508539,-0.9949515761566626,-0.7403461302670863,-0.48216073063097953,-0.23865492691611756,-0.026927891426357653,0.1382766294019967,0.24560078190962742,0.28786662668092833,0.2625783395617506,0.172097567598272,,, +37.234375,74,0.02347970800605037,-0.17201747598784162,-0.39971863878954805,-0.6425543114179729,-0.8822516672558771,-1.1006095583533093,-1.2807689087643261,-1.4083898743735697,-1.472653679285031,-1.4670192639101176,-1.3896819768386535,-1.243702319211688,-1.0367957578225298,-0.7807982571490377,,, +37.2421875,74,-0.49084479291884314,-0.18431812377319673,0.12035888247589066,0.40500316278961956,0.652934370954444,0.8501327319122108,0.9862111091711917,1.0551335122075938,-0.6607579074325607,-0.23035395970424022,0.20530779986803036,0.585230220986453,0.8570323444754191,0.9850551095883275,,, +37.25,74,0.9558632958147494,0.7802870256731624,0.49168513101843964,0.14070114314870585,-0.2126710491132182,-0.5084758054638503,-0.6961760382342922,-0.7425639538485965,-0.6369698765635551,-0.3929576520141925,-0.046242377465998685,0.3508453851254741,0.7374868361131068,1.0538278792648725,,, +37.2578125,74,1.2502855451090502,1.2952584658486463,1.1800405285175786,0.9201724322018692,0.5530206696168127,0.1319610308602702,-0.2819274302573854,-0.6293642893831747,-0.8620855857398124,-0.9503419429154896,-0.887509196704808,-0.6910935123116333,0.6277005651141678,1.1101138463971674,,, +37.265625,74,1.5969908002886983,1.9487676939939251,2.0608954640100805,1.8926396438076742,1.478406792124135,0.9184916034702612,0.35177892259513066,-0.08211961331007245,-0.28091902963924986,-0.20747727383886416,0.10024724192535894,0.5398237537350267,0.9726479185043617,1.2621532482031521,,, +37.2734375,74,1.3114604600566546,1.0901440827014,0.6427783463954795,0.07691821045306696,-0.46619231534224126,-0.8501583588516133,-0.9806583701887092,-0.8311537775259061,-0.45003922047016826,0.052725119645318994,0.5358344103927482,0.8654298236314744,0.9518269796482182,0.7741155956092598,,, +37.28125,74,-0.8801674280613553,-0.9809720451033627,-1.0664188743868934,-1.1355488213642584,-1.187690312326117,-1.222470813833303,-1.239823114811429,-1.2399862614435346,-1.223501128623488,-1.1912007056519187,-1.1441952664023456,-1.0838526837657692,-1.0117742332018178,-0.9297663092082675,,, +37.2890625,74,-0.839808550095311,-0.7440189293248672,-0.6446164248068283,-0.5438819199447619,-0.4441180211846141,-0.34760849580312714,-0.25657804030212245,-0.1731530840053317,-0.09932431431619537,-0.03691157994907923,0.012468213183328025,0.047429651161958075,0.06684330629889446,0.0698557473994561,,, +37.296875,74,0.05590471554090004,0.02472919950849961,-0.023625765654924025,-0.0888096611386211,1.0556299528955009,0.9912787350801693,0.8702504528737061,0.7047315638485707,0.5100677480295722,0.30368680419607513,0.10387620897538002,-0.07149940063911064,-0.20625137107675406,-0.28700340004958025,,, +37.3046875,74,-0.30413186920819024,-0.25244455224797757,-0.13155035289933203,0.05410572741896158,0.2955448479777161,0.5798727530340454,0.8911712546762879,1.2116006255598797,1.5226360453810444,1.8063518968033851,2.0466643697183886,2.2304457397865294,2.3484326355389156,2.395864973867128,,, +37.3125,74,2.3728110247623686,2.284155953016842,2.13925465103035,1.9512730864917471,1.7362641090870108,1.5120421769319525,1.2969354848384629,1.1085025251641132,-0.39997456970012374,-0.06831635504389297,0.24290584810880778,0.4754423681058305,0.5828843309594102,0.5379371695654196,,, +37.3203125,74,0.3367193403302521,-0.0005835417428839973,-0.4328112870097866,-0.9041870104445229,-1.3529503041924753,-1.720921319710475,-1.962506387504293,-2.051742790316203,-1.9862857205691458,-1.7877167251676298,-1.4981258882441084,-1.1735003857292454,-0.8749494667540857,-0.6591329001898674,,, +37.328125,74,-0.5693839828604815,-0.6289100167768807,-0.8371295769540852,-1.169717309338988,-1.58234951937814,-2.0175673812160104,-2.4136889976072196,-2.714382406141202,-2.87740866539106,-2.8811734018284323,-2.7280665242464837,-2.444070053495558,-0.539915457538463,-0.8037187890185081,,, +37.3359375,74,-0.8056822830354392,-0.5305855487669832,-0.037487818600200784,0.5563124647388579,1.1072630717404839,1.4847236731240492,1.606579291152796,1.4615427048970884,1.112035268615399,0.6768585703874435,0.2984081580071217,0.1034171713433143,0.16799101623166535,0.4965181867841584,,, +37.34375,74,1.0202393049015268,1.6158686961054003,2.139166980430006,2.464265471175175,2.5179666962447667,2.299622152461169,1.8811411353679763,1.3871298313056106,0.9606054108737802,0.7236831620150133,0.7440122679366932,1.01616012153364,1.4630479315052294,1.9570447197724343,,, +37.3515625,74,-0.17017239816757346,-0.2667754796949786,-0.37740821466452146,-0.5006087010547139,-0.6346892104122765,-0.7777655295112501,-0.9277897454856097,-1.082585900479923,-1.239887891626462,-1.3973789528291864,-1.552732027141666,-1.7036503229302364,-1.8479073437862994,-1.9833856913768557,,, +37.359375,74,-2.1081139618932854,-2.2203010901445945,-2.318367540029628,-2.40097279533585,-2.4670386695989697,-2.515768026955057,-2.546658586272682,-2.5595115669394852,-2.5544350249984467,-2.531841821297042,-2.4924422573037757,-2.4372315076127054,-2.367472069261319,-2.2846715352462006,,, +37.3671875,74,-2.1905560814804135,-2.087040131501488,-1.9761927301577298,-1.8602012151218288,0.9623025916238351,0.8708059742212706,0.8425198517307378,0.8813908461998416,0.986525910764485,1.1522510229528606,1.3685035986889007,1.6215312700469886,1.8948483053460723,2.170382983162882,,, +37.375,74,2.4297359152379405,2.6554615756315316,2.832283674413782,2.9481596266135677,2.99511988936424,2.9698236385286907,2.8737920357975257,2.713302819066177,2.4989535650683137,2.2449240769542196,1.9679893296564552,1.6863517994640427,1.4183745983530875,1.1813037500002168,,, +37.3828125,74,0.9900687008394797,0.8562447031640442,0.7872494186790115,0.7858297572494546,0.8498747258485426,0.9725673283049971,1.1428649126883146,1.346274458841938,-2.0746952567232593,-1.6778819855023472,-1.3149662496706438,-1.0411229203783785,-0.8967721863240683,-0.9012882564153589,,, +37.390625,74,-1.0499901939387988,-1.3148835370511054,-1.6490371348183432,-1.9939134035449337,-2.28851017720636,-2.478890140946123,-2.5266134494169488,-2.414759948313475,-2.150602831919992,-1.7645171094721945,-1.3052926859024447,-0.8325818483243008,-0.4076572676135807,-0.08391975850479216,,, +37.3984375,74,0.10136599282115522,0.13282079667674096,0.01929020409167459,-0.2075904403977148,-0.4983813496559639,-0.793597262878869,-1.0330312390231335,-1.1651907506715427,-1.1553760637181325,-0.9911423615726398,-0.6842945719515758,-0.26910390939996365,2.440787904793992,2.0764668031359244,,, +37.40625,74,1.5259597229123025,0.9196421085804152,0.4009358523742733,0.08714462904730713,0.03746561752744759,0.23694323396181005,0.6007611205713838,0.9976943903150496,1.2862927528814925,1.3538758883109265,1.1476515927177724,0.6894260617201156,0.0698725281529571,-0.5760731197223242,,, +37.4140625,74,-1.105948597200494,-1.408567225614418,-1.4342533584999013,-1.208226705472607,-0.8234693424461419,-0.41503229124660934,-0.12282530543825787,-0.05308978650983598,-0.24911553322190294,-0.6792284192849324,-1.245342487993859,-1.8097336878555208,-2.2326982832900195,-2.410775618302467,,, +37.421875,74,-1.7413328224023912,-1.6218948981800199,-1.504194413711164,-1.390497492233759,-1.2829896565955299,-1.1837374937119645,-1.0946524071332275,-1.0174570924495514,-0.9536553225752216,-0.9045055719938526,-0.8709989418292491,-0.8538417722866534,-0.8534432469396757,-0.8699082059222117,,, +37.4296875,74,-0.9030352938761452,-0.952320475089765,-1.0169658542808113,-1.0958936485721282,-1.1877650660077002,-1.2910037600426048,-1.40382344930518,-1.5242592190041147,-1.6502019558734244,-1.7794353136830292,-1.9096745620305686,-2.0386066381410615,-2.1639307003498,-2.283398473139731,,, +37.4375,74,-2.394853677260745,-2.4962698544750337,-2.5857859245709967,-2.661738852008132,1.5658687308279073,1.7834724222158338,1.980935567420255,2.1414054064411125,2.2505079977152875,2.297357166856788,2.275320419081172,2.1824883903764434,2.021815085327167,1.8009191062587568,,, +37.4453125,74,1.5315597182392213,1.2288242689491597,0.9100836103667913,0.5937883470116481,0.2981898350236166,0.040075103637978726,-0.16639610031218077,-0.31067106558781366,-0.3865323634180815,-0.39252382230641236,-0.33204454330821254,-0.21310441676079056,-0.04775820584509388,0.14874232330963733,,, +37.453125,74,0.35901908402541355,0.5647864858788947,0.7481333782983682,0.8927787116466659,0.9852133396732683,1.0156483273801213,0.978703621799529,0.8737890490293521,0.20297635892821314,0.6712731441762494,1.0752938617174865,1.364100948728952,1.504200677764584,1.4847177635294777,,, +37.4609375,74,1.3190499976799508,1.042745385084848,0.7079326038312674,0.3751724317804249,0.10399946239063396,-0.056372592142911904,-0.07473421145234327,0.057244805720733205,0.3237077846783011,0.6870748868523766,1.0938943733298967,1.4831700522758056,1.7958678429462467,1.984120714519529,,, +37.46875,74,2.018698216920548,1.8935770995169627,1.626901014463274,1.2581797012925604,0.842163751264473,0.4403488280872275,0.11143242916871576,-0.09779059720161809,-0.15967591700727524,-0.06999228829680038,0.151464831037749,0.4640039701965635,-1.4526677015165192,-0.9465250270626624,,, +37.4765625,74,-0.5718055579727193,-0.4284401364812209,-0.5506012503710553,-0.8974471436942133,-1.3644441644771075,-1.812162969582944,-2.104654984768186,-2.1468897084808805,-1.9109907079806523,-1.4440779800225685,-0.8555653900181373,-0.2873925661853117,0.12465228626607239,0.2879205202799556,,, +37.484375,74,0.17806694510354593,-0.15450502421915202,-0.5986812441925853,-1.0133082759589862,-1.2660901977003012,-1.2700483625269428,-1.0075496819269008,-0.5353162169118769,0.030958563783505227,0.5481721587079882,0.8849051104654757,0.9573300208897886,0.75209694517964,0.32992380194443094,,, +37.4921875,74,-2.7226928501471668,-2.7674646116523918,-2.7951441232300414,-2.805110700177453,-2.7970439599235686,-2.770929542348228,-2.7270594766535954,-2.66602718829454,-2.5887172333258945,-2.496289939842386,-2.390161225362602,-2.2719779434740195,-2.1435891913341063,-2.0070140803512087,,, +37.5,75,-1.8644065342858553,-1.718017731070272,-1.5701568458943633,-1.423150782848102,-1.2793036001257903,-1.140856339148148,-1.00994796089639,-0.8885780733555475,-0.7785721026008489,-0.6815495172758882,-0.5988956627355131,-0.5317376979287749,-0.4809250562509758,-0.44701477237968235,,, +37.5078125,75,-0.43026193190439044,-0.43061541085794586,-0.44771897963080975,-0.4809177518169807,0.7051510564510393,0.481581928287542,0.21581174004976061,-0.07637455832152981,-0.377233372532531,-0.6682955734502283,-0.9316505065483047,-1.1511913716532025,-1.3137351363820677,-1.4099388951007885,,, +37.515625,75,-1.4349487789383202,-1.3887361716914515,-1.2760977908058575,-1.1063196315780526,-0.8925282117848656,-0.650774358670701,-0.398913430065371,-0.15536005586785523,0.062195764585046165,0.2380216798273741,0.3594391380005092,0.4177062376770393,0.40862571738831277,0.33283569122630396,,, +37.5234375,75,0.19576286181196578,0.007241479223425107,-0.2191753761545986,-0.46716415292540886,-0.7187726897588126,-0.9556759437169975,-1.1604580102406832,-1.317831025153987,0.8124247478964177,1.1356662981719565,1.376369706911518,1.489864778260442,1.4511811091075577,1.2589911710411554,,, +37.53125,75,0.9358709535319374,0.5248372811681895,0.08270084678260547,-0.32873002582372335,-0.6522251112772153,-0.8439963100155674,-0.880469623640994,-0.7619105676136348,-0.5123385943888361,-0.17574409489647141,0.19080257337005077,0.5260765139904087,0.774267794905669,0.8937043451096898,,, +37.5390625,75,0.8633694427226536,0.6861985141911503,0.388641622115515,0.016559677038400333,-0.37190652992895795,-0.7153838574465803,-0.9588217556736807,-1.062066415042004,-1.0061186603364773,-0.7961008762734056,-0.4604708154355118,-0.046604686545279106,-0.9715378052352663,-1.0227861737325519,,, +37.546875,75,-0.8135083493004991,-0.40898873265024643,0.07007944596969573,0.48077622433973655,0.697247896831762,0.6453407116690724,0.32308189659884023,-0.19860670240135292,-0.7951595812830832,-1.3223087804094629,-1.6554149310161956,-1.7234106482346712,-1.5280554446531074,-1.143227068087644,,, +37.5546875,75,-0.6944456231615399,-0.32424445612075714,-0.15288075900531362,-0.24515607157451136,-0.5924422794218619,-1.1148412767120528,-1.682888350150361,-2.152852896573676,-2.4059633515383796,-2.380807567571059,-2.090030139981033,-1.6167517546154442,-1.0916930460806524,-0.657273587801805,,, +37.5625,75,-0.5292698649518922,-0.5915631884847188,-0.6663367663099978,-0.7519066182703366,-0.846395448720858,-0.9477657418342929,-1.0538556640124137,-1.1624171446342733,-1.2711554682105164,-1.3777696845576866,-1.4799931292826631,-1.575633344924053,-1.6626107036108078,-1.7389950548146857,,, +37.5703125,75,-1.8030397563646705,-1.8532124927089746,-1.8882223406571632,-1.9070426085556775,-1.908929048842213,-1.8934331249451568,-1.860410100090332,-1.8100218062432738,-1.7427340445709274,-1.659308662803583,-1.5607904480889176,-1.448489064708643,-1.323956352796404,-1.1889593854196823,,, +37.578125,75,-1.0454497556648579,-0.8955296313753668,-0.7414151717905213,-0.5853979465332548,-1.4157059398148757,-1.4460404892577454,-1.405405209645751,-1.2952280220738677,-1.1217003138327015,-0.8953510525853926,-0.6303186175633737,-0.34337111058630154,-0.05274344861598987,0.22312768441722355,,, +37.5859375,75,0.4668828265180115,0.6634434954166185,0.8010567897912034,0.872108007160537,0.873644628818615,0.8075751496136216,0.6805289045900269,0.5033866843327235,0.29051488783896495,0.058756634996146674,-0.17374979133681107,-0.3888427628604896,-0.5696106782755677,-0.7015780776331416,,, +37.59375,75,-0.7737217706107679,-0.7792461046420256,-0.7160632950462011,-0.5869453066085387,-0.399336680160781,-0.1648413415004169,0.10158083534635953,0.3826516982867986,0.3865625957659598,0.7776937759693875,1.0725762011633089,1.2325356062382877,1.2404264024151832,1.1032656207955491,,, +37.6015625,75,0.8511004475887438,0.5322859413000228,0.20590866983732176,-0.0674634429718387,-0.2352640580482338,-0.2611668765590929,-0.13079616340893818,0.1459803777879759,0.5365337848696259,0.9905004998054812,1.4475708734001034,1.8468267026137195,2.136173722040003,2.2804001809282393,,, +37.609375,75,2.2666066295357155,2.1061614829847732,1.8328780542505285,1.4976972674574658,1.1607045134793905,0.8817243218261748,0.7109580248419328,0.6811228819199342,0.8023172580393133,1.0604118392475979,1.419217653491208,1.826093391455293,-0.738076304783065,-1.1705894047350294,,, +37.6171875,75,-1.6262499594612876,-1.9634132012436973,-2.070520343005075,-1.8967764435057117,-1.4661951483111695,-0.8711600182715773,-0.24726586772822762,0.2636660447256355,0.5522640922048943,0.5713753560226476,0.3487707023256743,-0.020694303382920755,-0.40131217746614156,-0.6539582968737603,,, +37.625,75,-0.674465792874832,-0.42242098673978823,0.06751477731061561,0.6948620499573392,1.3206240491378272,1.805151065477388,2.0461930392221377,2.0067131907874054,1.7248416729449514,1.303242977698161,0.8808127680615585,0.5944626297285652,0.5414676786452418,0.7526975241629348,,, +37.6328125,75,-0.429805032363422,-0.2769584862779303,-0.12913490445386772,0.011474224971087965,0.14280068117900124,0.2629355139744658,0.37016226080971926,0.4629867960248061,0.5401632897622128,0.6007158221306146,0.6439552742719888,0.6694912006804745,0.6772384750009545,0.6674185930472764,,, +37.640625,75,0.6405556103330505,0.5974667853505148,0.539248092537404,0.46725485869896566,0.383077862036008,0.28851531238540684,0.1855412033831077,0.07627059079830023,-0.0370775948999367,-0.15221955051025055,-0.2668467335872624,-0.37866642464462835,-0.48544200774489665,-0.5850322640922303,,, +37.6484375,75,-0.6754289905285219,-0.7547922841582284,-0.8214828752116977,-0.8740909419289284,0.659974374202413,0.9153110768911201,1.1318500727040464,1.2953734661539291,1.395244383287557,1.4251447239627708,1.3835120471100928,1.2736451327982465,1.1034708684256975,0.884988722588797,,, +37.65625,75,0.6334315522492755,0.3662012690580477,0.10165358969331417,-0.1421833818710836,-0.3488673789232134,-0.5046892603282376,-0.599629356253907,-0.6280561808343341,-0.5891187876904023,-0.48680540831063757,-0.32966428527987024,-0.13020616939240942,0.09596985090165042,0.3312662255459322,,, +37.6640625,75,0.5573165195956826,0.756268943240697,0.9120343246164415,1.0114114936499903,1.0450115929451362,1.0079168524163284,0.9000278803649796,0.7260752437071187,2.220118815686123,2.5415613463454654,2.7411614739881665,2.7877908489598826,2.673290341099716,2.4137345775265397,,, +37.671875,75,2.0469260403243066,1.6265090509124014,1.2136204171884417,0.867377176264334,0.6356829730414786,0.5477849649627514,0.6097404691466809,0.8034993403957188,1.089744879988504,1.4140506453746153,1.715394043773529,1.9357004938868028,2.028931407262857,1.9683002779314611,,, +37.6796875,75,1.750492711778497,1.3962328661572896,0.9471078242883694,0.4591442647701177,-0.005862375499707695,-0.3899159935872957,-0.6477951706982283,-0.7540381106415228,-0.7068495175473074,-0.5283211898900648,-0.26093226642694856,0.03912547763751867,2.2454958479540528,2.5990941956357365,,, +37.6875,75,2.6956659081925323,2.509326207580841,2.0891340104770104,1.5457154856605273,1.0210351152550214,0.6495982107874866,0.5217170309504963,0.6589069015901889,1.0081541054385834,1.4566249731833139,1.8627831519227294,2.0953849181420603,2.0696631636361693,1.7707810979387033,,, +37.6953125,75,1.2581256326636734,0.6492616338342017,0.0879425460431359,-0.29505744564830394,-0.4175571370931509,-0.26826937547091023,0.09032050894612947,0.5392858056788363,0.9360472197043379,1.1536311350807138,1.1156361579054392,0.8173231205458348,0.32704702472275593,-0.23236274875392895,,, +37.703125,75,-0.9114609028576149,-0.9327117523956383,-0.9372525834448062,-0.9247930253264931,-0.8953484141385677,-0.849239604975625,-0.787087429255835,-0.7098018941670843,-0.6185663133101043,-0.5148166463768531,-0.40021640959384863,-0.27662759621692684,-0.14607811623825384,-0.010726325405790799,,, +37.7109375,75,0.1271767353633699,0.26532672900693505,0.40140635009348924,0.5331258852157499,0.6582632958054023,0.7747031215173216,0.8804735229885796,0.9737808153531433,1.053040887819664,1.1169069591539285,1.1642931830496897,1.1943936900442305,1.2066967325357498,1.2009936851989078,,, +37.71875,75,1.177382743177545,1.136267253267574,1.0783487072789515,1.0046145202252208,0.4952945195788867,0.2207874670915001,-0.08138614477349305,-0.39332273555695413,-0.696517454124032,-0.9731484288287676,-1.2073131859863324,-1.3861310315274213,-1.5006345379946695,-1.5463879857927598,,, +37.7265625,75,-1.5237896483478113,-1.4380368577392955,-1.298756303079127,-1.119325358553104,-0.915931783774744,-0.706437383421034,-0.50912488381517,-0.34141542791735224,-0.21864613909727026,-0.1529930153547987,-0.1526142812790674,-0.22107395178444256,-0.35708582153226653,-0.5545957495148048,,, +37.734375,75,-0.803196517738802,-1.088846351291189,-1.3948410115698182,-1.7029716917131916,-1.9947879863968931,-2.2528778806270813,-2.4620755150017186,-2.610512520866922,0.31075737335779785,0.4975381893520116,0.5565558297300927,0.4651486722944158,0.22448690566496665,-0.1405602023573277,,, +37.7421875,75,-0.5852506759775259,-1.0518940966855244,-1.4787954902807818,-1.8098259818197007,-2.003129726478502,-2.0376111372156496,-1.916192142911037,-1.6653322770820487,-1.3308864619678944,-0.9709457563772139,-0.6467762347372238,-0.41326737038558203,-0.3103776725059785,-0.35690997764567656,,, +37.75,75,-0.5475859196585495,-0.8538752164568146,-1.2284505585644676,-1.6125741572757695,-1.9452653685313979,-2.172821376899437,-2.2572079139493737,-2.1820129648032367,-1.9550359764203367,-1.607109102568951,-1.1873338847089887,-0.7554750678197582,-1.014418155174515,-0.7542119885391511,,, +37.7578125,75,-0.2939890496802664,0.240993786061173,0.7070630390505108,0.9814478483951474,0.9958493598598891,0.7550606808918778,0.33553518606167565,-0.13570330714612822,-0.5160270981247673,-0.6864631490523677,-0.5844824177158535,-0.22133166504626056,0.3208442452544895,0.9113028149349509,,, +37.765625,75,1.4063172883425605,1.6883444707955695,1.6980143954966969,1.450176583003594,1.0296072476798428,0.56755611046808,0.20556272738715298,0.05646122850222368,0.17326285738150093,0.5344465370671532,1.0496906284433516,1.584476600718372,1.9968229651689748,2.1760831245167216,,, +37.7734375,75,0.916320807307034,0.8149704612182054,0.7022869135962089,0.5801840400036962,0.45073273534956204,0.3161247449629716,0.17863438457165678,0.040578819410426376,-0.0957224020944738,-0.22798785157026652,-0.3540140517254225,-0.47171393780061666,-0.5791532760535928,-0.6745844016715118,,, +37.78125,75,-0.7564766854424119,-0.8235431957950845,-0.8747630894459136,-0.9093993386775204,-0.927011484936864,-0.9274631955294591,-0.9109244911879095,-0.8778686056057988,-0.8290635320260131,-0.7655584050035776,-0.688664955898671,-0.5999343669237771,-0.5011299291296266,-0.3941959832013987,,, +37.7890625,75,-0.28122368701973227,-0.16441420950461694,-0.04603999533852199,0.07159522107304925,-2.6904396267048845,-2.698761256334998,-2.637245852970971,-2.512397275305154,-2.334996245729963,-2.1193438385292387,-1.8822597729160848,-1.6419053733968738,-1.4165132857526266,-1.2231125384515027,,, +37.796875,75,-1.0763378631797678,-0.9874063117487505,-0.9633325398019025,-1.0064374839579369,-1.1141846989903421,-1.2793557720655935,-1.490552585336316,-1.7329914051923956,-1.9895334256494137,-2.2418799038344215,-2.4718485471498686,-2.6626421449597637,-2.800020977595185,-2.87329724458166,,, +37.8046875,75,-2.8760821643306356,-2.806733643721572,-2.6684732954212214,-2.4691646374112555,-2.2207679352641185,-1.9385096956602001,-1.639824717178257,-1.3431444639395487,-0.37269602771002486,-0.09207857644085915,0.04959651454532599,0.03752830746877689,-0.1188504251123319,-0.38739501652189706,,, +37.8125,75,-0.718309101714832,-1.0519547535930003,-1.3281958003027654,-1.4958187616449896,-1.5205637532200176,-1.3905142135671607,-1.1180056899191775,-0.7377560978915574,-0.30150840189331357,0.12998012047785018,0.4963545743344987,0.7470186518800576,0.8489733037110371,0.7919171864392467,,, +37.8203125,75,0.5898146747327734,0.2786874062565897,-0.08902648351191673,-0.45266669623792166,-0.7528222211203676,-0.9406045474792347,-0.9852781822714183,-0.8790598934557066,-0.638339106329545,-0.301129324865292,0.07885249132075106,0.44055642908654796,1.1920934471362843,0.6433421572558183,,, +37.828125,75,0.20834901557825558,-0.005890379782144017,0.0446824844800372,0.3291725903085394,0.7502793177758055,1.171065371373594,1.4526092997463618,1.4922211511241867,1.2517462893866067,0.7681987657611371,0.14380842448381237,-0.4817921425990432,-0.9696198718676992,-1.2192056569966554,,, +37.8359375,75,-1.1958954289172505,-0.9401075545358402,-0.5560115078274928,-0.1827328132185857,0.044021699596951236,0.029398790337485492,-0.25436807697214314,-0.7601192117427942,-1.3784733843388133,-1.9675967064243118,-2.391878803399026,-2.5589180389561537,-2.4446808561378743,-2.0999412705134244,,, +37.84375,75,0.1861969521244733,0.29552033410736495,0.3974096377634068,0.4898362203349448,0.5709342544620538,0.6390336081822767,0.6926893001829607,0.7307070144206882,0.7521642272150462,0.7564265767602956,0.7431591882904165,0.7123327564658655,0.6642242783481332,0.599412423994822,,, +37.8515625,75,0.518767625604291,0.42343705861407777,0.31482477760023064,0.19456735466139713,0.0645054467270662,-0.07334821049379281,-0.2168438216311799,-0.36373195079224807,-0.5117026856486662,-0.6584258608415918,-0.8015916365357056,-0.9389507217230648,-1.0683535381043596,-1.1877876389247026,,, +37.859375,75,-1.295412727690788,-1.3895926637313634,-1.4689238943125833,-1.5322598155959077,-1.066616243390519,-0.8268424940521907,-0.637728086064881,-0.5095160046471823,-0.4480786494132427,-0.45451415701484366,-0.5250758837552191,-0.6514399519955631,-0.8212921893983977,-1.0191935173283055,,, +37.8671875,75,-1.227663427131177,-1.4284059746628017,-1.603592784826212,-1.7371135820370953,-1.815707026802686,-1.8298929849416794,-1.7746412025119898,-1.649729740596011,-1.459768157982141,-1.2138838078839196,-0.925093106897858,-0.6094016022745509,-0.2846955753459115,0.030497544128281984,,, +37.875,75,0.31829352962310953,0.5626909306111378,0.7506794439251594,0.873139810090994,0.925472498367305,0.9079113563687113,0.8255003682297349,0.6877351574189633,0.7251162350767193,0.8850297385411728,0.8915731247525925,0.7392941667055066,0.4468844704940087,0.05429475793766153,,, +37.8828125,75,-0.3834576420319088,-0.8048247339884413,-1.1512778847615723,-1.3763846633757906,-1.4529989322502534,-1.3774445151757488,-1.1700410470636742,-0.8718903469234238,-0.5384241094560912,-0.23071816174300608,-0.005926408808491046,0.09167528854687623,0.03764005518161295,-0.168787172239954,,, +37.890625,75,-0.5044968809356953,-0.9260594800832045,-1.376435277795604,-1.793805111037347,-2.1211464958142487,-2.3150640408340672,-2.3524990134061374,-2.234273271339319,-1.9849158291167122,-1.6487993149958535,-1.2831883173778895,-0.9492825949242627,-0.9096149062913974,-0.8670351207155287,,, +37.8984375,75,-1.0856707027426844,-1.5094157192510094,-2.0232201713965132,-2.4846476129915747,-2.7629611176990307,-2.7750248165326834,-2.508180783228192,-2.0238305171992326,-1.4407383784850913,-0.9026317574228931,-0.5389763909426185,-0.4296755734102268,-0.5833664511487725,-0.9352599159479797,,, +37.90625,75,-1.365114194420083,-1.7304141015892611,-1.9056604426690336,-1.8169993898030943,-1.4626988040613917,-0.9138573910319036,-0.29515017580869884,0.24911474078383955,0.5943273960316826,0.6695176505219453,0.4766068664309845,0.08969508533324122,-0.36541923965260514,-0.7458723766309823,,, +37.9140625,75,-1.5787306360093454,-1.607758394353739,-1.6190668698070918,-1.6126862104292221,-1.5889521992484572,-1.5485001709041994,-1.4922536854915727,-1.4214081580459434,-1.337409730438048,-1.2419297557500326,-1.1368353420244988,-1.0241564712868936,-0.9060502696903494,-0.7847630545301655,,, +37.921875,75,-0.662590822791156,-0.5418388731772534,-0.4247812687544193,-0.3136208501078026,-0.21045049929152893,-0.11721633293508027,-0.035683469089542896,0.03259503266304964,0.08630551389482177,0.12439686394453953,0.14609906507479797,0.15093681136282466,0.13873796277224137,0.10963668629694923,,, +37.9296875,75,0.0640712290940828,0.0027763625230816658,-0.07322937067967683,-0.16266138285830067,0.5078942483230895,0.30210673440940294,0.0882213814828155,-0.11544395935769769,-0.2913854086221689,-0.42413910108766967,-0.5013647064644386,-0.5147108594838009,-0.46040213958205367,-0.3395066582735362,,, +37.9375,75,-0.1578655852285722,0.07431048112237537,0.3431501599232432,0.6320855420754582,0.9230048180687909,1.1975129085918212,1.4382121948668,1.6299140432625445,1.7606966438318663,1.8227353986367953,1.8128479557207733,1.7327158824232636,1.5887675198740063,1.3917301865821998,,, +37.9453125,75,1.155882955553153,0.8980621084954126,0.6364886164953489,0.3894994063623196,0.17427088040861605,0.005623696821357216,-0.10500784954362863,-0.15036998497309662,-0.7026504208011317,-0.5845423057277463,-0.6154382041689243,-0.7918334138195063,-1.0867639166373921,-1.4539894529732589,,, +37.953125,75,-1.8351828894910425,-2.1690061753899506,-2.4006593148066395,-2.4904150876793603,-2.419810205410211,-2.194528589131202,-1.8435276567017307,-1.4145436547807821,-0.9666760344938792,-0.5612058031737432,-0.2520778323999213,-0.07752942374793093,-0.05416887940421811,-0.17442620571717915,,, +37.9609375,75,-0.40777283325668273,-0.7055201766706463,-1.0084494194257112,-1.256083916343584,-1.3961597476542578,-1.3928190836620273,-1.2322499377618636,-0.9248936152017059,-0.5038757569043159,-0.01990506662837402,0.4665660179533461,0.8946979860444072,-0.5279250738511896,-0.027212481333803884,,, +37.96875,75,0.5175632465005685,0.9632550663480463,1.1917030369095076,1.1421272226424164,0.8278165266968952,0.332539200927907,-0.21234174249686072,-0.6637769839005114,-0.9061227199358105,-0.8827030808179976,-0.6111941195126497,-0.17861453274810396,0.28270239719331197,0.6315685429049007,,, +37.9765625,75,0.7568379910000712,0.6080789622370337,0.2096123181554278,-0.345932962443119,-0.9227832123999558,-1.379008018156724,-1.6051975410157742,-1.5542310584502856,-1.2539801583242924,-0.7994670617265747,-0.32662920725865235,0.02511769252364937,0.15125602030256557,0.010962605731090758,,, +37.984375,75,-0.2639914312087466,-0.37547427888405344,-0.495178160662024,-0.6210185197851309,-0.7507944252938455,-0.8822270322490683,-1.0129994114528895,-1.1407970513011119,-1.2633483226293145,-1.3784641980509111,-1.4840765303507126,-1.578274219710829,-1.6593366365174567,-1.7257637145474498,,, +37.9921875,75,-1.7763021876267364,-1.8099675103864867,-1.8260610793012604,-1.824182452487887,-1.8042363543099387,-1.7664343421474675,-1.7112911061539067,-1.6396154667943033,-1.5524962277981316,-1.4512831322359614,-1.3375632551756418,-1.2131332462665692,-1.0799679082737415,-0.940185661732628,,, +38.0,76,-0.7960115004152345,-0.6497380862388311,-0.503685664809301,-0.3601615034529846,-0.12789178229688536,-0.03986063396473938,0.10674135395382822,0.3007286278724444,0.5274968444718011,0.7700461920076489,1.0101720035965513,1.2297396245733285,1.4119546201702424,1.5425397341702127,,, +38.0078125,76,1.6107365112924108,1.6100617223408338,1.538765829137287,1.399961503586885,1.2014132230560337,0.9550025981640108,0.6759067010270012,0.38154667515621943,0.09037992700413078,-0.17937989343696098,-0.41102588021804587,-0.5905157721651768,-0.70744403981478,-0.7557603889828791,,, +38.015625,76,-0.7341845945265539,-0.6462887536325127,-0.5002412397323184,-0.308230228672894,-0.08560701300419071,0.15019113990978522,0.3808634574540438,0.5885281966195595,1.212681191384902,1.385746623347621,1.401523084449939,1.2719066554895817,1.0311515546124763,0.730480028494202,,, +38.0234375,76,0.4300510855228346,0.18953924639953001,0.05879097447026982,0.07001433772403842,0.23271863269509052,0.53219236564833,0.9317568536045246,1.378444619100905,1.811218305907476,2.1704501256286757,2.40718549216379,2.4907480956236308,2.4135019770559953,2.1920289570939753,,, +38.03125,76,1.8645380785371541,1.484910585617238,1.1143079745748827,0.8116501934915379,0.6244470285890851,0.5814106826203582,0.6880001004322037,0.9255909415086891,1.2544003660368173,1.6197109499584919,1.9604241694245936,2.2186110347649377,-1.3650600973069085,-1.718580634864398,,, +38.0390625,76,-1.8253669271866895,-1.6490924461619287,-1.2286266368364178,-0.6673938531676868,-0.10506216463680862,0.32067894228922034,0.5117768131566689,0.4365894612021598,0.13843791310957448,-0.2764058596962575,-0.6680020806200905,-0.901270384198265,-0.8832004350466178,-0.5885459732385017,,, +38.046875,76,-0.06695853019292036,0.5703962219492792,1.1810734231170004,1.630150854413126,1.8269653497305884,1.749717601145664,1.4512040948561535,1.0441073978077426,0.669878434107462,0.45974129002468844,0.4985100022227017,0.8011360221671623,1.3084158539667525,1.9030370178579432,,, +38.0546875,76,-0.22141956194064377,-0.08962110202980678,0.033203074482407224,0.14518809803564958,0.244667592833006,0.3302027575173091,0.40060745584735347,0.454968878088726,0.4926634113997972,0.5133674413799988,0.51706289570975,0.5040374328775545,0.4748792727597847,0.4304667596380949,,, +38.0625,76,0.3719528404808084,0.3007447303490245,0.21847912106184597,0.12699336730338356,0.028293154777713325,-0.07548278336675596,-0.1821002839424249,-0.2892690461895207,-0.3946829111939276,-0.4960604228795758,-0.5911849602479644,-0.677943738053258,-0.7543649929124406,-0.8186527036114823,,, +38.0703125,76,-0.8692182375591507,-0.9047083691443304,-0.9240291792884856,-0.9263654176013545,0.7569757936014347,0.8728052270999395,0.9263643385718997,0.9124285238695771,0.8305704553570233,0.6851950395590213,0.48523716012883467,0.24354327155912686,-0.024020044251186923,-0.2996684060711229,,, +38.078125,76,-0.5649359872398809,-0.8019596898595319,-0.9947215983604272,-1.130163080136454,-1.1990928506353962,-1.1968256870600396,-1.1235072567828945,-0.9841024140111482,-0.7880477848647953,-0.5485928704594694,-0.281875617399135,-0.005796920686755108,0.26122745566452366,0.5015505078420256,,, +38.0859375,76,0.6995236605830061,0.8425867276852538,0.9221421607897968,0.9341526256203146,0.8794202389392386,0.7635279990748929,0.5964474999859248,0.39184029070320686,2.3485721261042682,2.3239956803875113,2.142098603365181,1.8241051919754483,1.411988761090756,0.9619834299302572,,, +38.09375,76,0.5358763782986878,0.19143657804335568,-0.026529503369004837,-0.09310238989971242,-0.007076037352828246,0.20890947049367814,0.5119493465493709,0.8456115290145759,1.1487804348501574,1.3652292913443036,1.452429824216842,1.3882268728231084,1.1743380598644286,0.8361331667214645,,, +38.1015625,76,0.41872733165273734,-0.02000365852997482,-0.418398299361211,-0.7205768363889962,-0.8851112776816918,-0.8914477262873809,-0.7430808785435434,-0.4669863833132278,-0.10939959632503836,0.2714016874363081,0.6141863140518942,0.8643149302241048,2.8774449902815222,2.6822699387249167,,, +38.109375,76,2.2711198361581126,1.763506042723798,1.3026249509714567,1.016093803906902,0.9809792396134347,1.2027031257051224,1.6136066903220478,2.091566001988255,2.4935561767751864,2.6949644990545725,2.623876850770584,2.2809393325961564,1.7393502017347193,1.124982782426605,,, +38.1171875,76,0.5820853709749735,0.23395694739753203,0.14937438045664164,0.32397041295720996,0.6816640843488899,1.0957494259534488,1.4238604906709482,1.5472276812591454,1.403464234018647,1.0038949338126442,0.4306756952346888,-0.18550857057213327,-0.7010573887901627,-0.9986207071434641,,, +38.125,76,-0.9111949879910394,-0.8782983039749004,-0.8277623497580566,-0.7599793758521685,-0.675640251952259,-0.5757225933401504,-0.46147386859580025,-0.33438978427442023,-0.19618832490601013,-0.048779902745971215,0.10576586017189799,0.26525613617084776,0.42741305195168217,0.5899133364514211,,, +38.1328125,76,0.750428762442665,0.9066666738716445,1.0564098894442508,1.1975552838797907,1.3281503714136247,1.4464272511098857,1.5508333197360216,1.6400582145589457,1.7130565144284233,1.7690658017906489,1.8076197695027871,1.828556143085476,1.8320192798305261,1.8184573993895028,,, +38.140625,76,1.7886144944711295,1.743517063423758,1.6844558971540495,1.612963239419611,0.16610160584689593,-0.06278684108544039,-0.27651499455340595,-0.4577257806254592,-0.5912302565699741,-0.6650718393583563,-0.6713653896558929,-0.6068526272777118,-0.47313513463372214,-0.27656868693992753,,, +38.1484375,76,-0.027826264216526342,0.2588397965306254,0.5665850710918575,0.8771409093846143,1.1720814650905262,1.4341015553738932,1.6482162575819579,1.8027986076117803,1.8903830545702935,1.908178661109193,1.8582562793406634,1.7473966670798742,1.5866101529566063,1.3903613629254457,,, +38.15625,76,1.1755530877083407,0.9603401665604212,0.7628561161415282,0.5999413177610354,0.4859614674203847,0.4317986985779909,0.44408574632851494,0.524736573346032,0.9822544724492782,0.9497357895338022,0.7725953175201937,0.47985822344828927,0.11920586626511745,-0.2504663944474842,,, +38.1640625,76,-0.5682417973225944,-0.7806932859017258,-0.8502315948143542,-0.7609899150074534,-0.5213284103578293,-0.16256831688748064,0.26584739806598734,0.7040132724022701,1.090847737768055,1.373560491634605,1.5158265072152328,1.503393793833886,1.3462517363721807,1.0770225580430368,,, +38.171875,76,0.7458267254698829,0.41242232189516886,0.1368430115091085,-0.030006927932541783,-0.054335339961017914,0.07522095117891958,0.3457735724686545,0.722138482901777,1.1522659415237573,1.5752990866409853,1.9310062214504393,2.1691179294785954,-0.3593513757157384,0.10403999414218978,,, +38.1796875,76,0.4705656643125501,0.6268998598349401,0.5195064798110828,0.16935172874330928,-0.3338243031196771,-0.8561072121129286,-1.2561368835758562,-1.423898592166071,-1.310944595631224,-0.9437626637136918,-0.41662671137932294,0.13411213813271877,0.5672492866645934,0.7752647179738719,,, +38.1875,76,0.7136148361606967,0.4127517875830114,-0.030422036522016353,-0.4793203198756113,-0.795322104051984,-0.8759834182986219,-0.6833364736697196,-0.25451831570081895,0.3081862095220282,0.8651603866309928,1.2775090472324444,1.444922216537153,1.3329736720641714,0.9823745774318579,,, +38.1953125,76,1.530785720555577,1.439853538695523,1.3422464282508726,1.2401570116777638,1.1358521763596925,1.031633153031469,0.9297949948946513,0.8325861670671189,0.7421689540872053,0.6605813788483442,0.5897012998929227,0.5312133158384946,0.48657905655655465,0.4570113814280041,,, +38.203125,76,0.44345293657172424,0.44655944662923464,0.4666880337765811,0.503890768608568,0.5579135659302242,0.6282004448959891,0.7139030790093833,0.8138954688660638,0.9267934808243796,1.0509789095789168,1.1846276434037035,1.3257414389854454,1.4721827495644353,1.6217119966365305,,, +38.2109375,76,1.7720266326728973,1.9208013109639355,2.0657284592927807,2.204558547077377,0.6708062044424556,0.8746895594720563,1.12464543451342,1.405609107216207,1.7002369150880559,1.9901099787947074,2.2570131443543087,2.48419997231435,2.657555574402642,2.7665762209865656,,, +38.21875,76,2.8050974191775393,2.771719700720457,2.6699024377805496,2.5077191535176833,2.2972913986515344,2.0539406791056893,1.7951175802522992,1.5391827692904063,1.3041248855334933,1.1063047285571466,0.9593133195500965,0.873023469635677,0.8529009942579869,0.8996236059588841,,, +38.2265625,76,1.0090340616419224,1.1724308309720097,1.377176015301781,1.6075781228111352,1.8459881381101193,2.0740324500693705,2.27389665724923,2.4295707216625857,2.2571149551845933,2.1852540741034168,1.968049360920895,1.6419783395092287,1.2597704776408893,0.8821677901188467,,, +38.234375,76,0.5684410288548642,0.3671387437901291,0.30851020864100387,0.3997824723672919,0.6240272319947882,0.9427940681885478,1.302099933303385,1.6408420065471052,1.90032355767001,2.0334090825730633,2.0118826962160683,1.830863599792365,1.5095907950602037,1.088454707913371,,, +38.2421875,76,0.6227379277580322,0.17403982339868362,-0.19927947317473493,-0.45114750181349794,-0.5549111891449166,-0.5074412585025244,-0.3295702823747214,-0.06279639186505573,0.23723368747026516,0.5094469572694019,0.6969130047142805,0.7557687170832612,-0.31941344805002414,-0.42021307072613834,,, +38.25,76,-0.25574382446084953,0.12743970053578646,0.6206039531990444,1.082601481819668,1.3785417850846002,1.4167696431546628,1.174016279385937,0.7018299678546205,0.11252323799904997,-0.45151248846554504,-0.8567157021710639,-1.0148243166906592,-0.9069118668727671,-0.588404143552297,,, +38.2578125,76,-0.17370286167614418,0.19536779806232757,0.3886421412215535,0.323508600806791,-0.012219832998351499,-0.5567305516805623,-1.1909135686720735,-1.7707656318007623,-2.1666173846451193,-2.2984347584163367,-2.157521689466885,-1.8086782041048832,-1.3722244483485888,-0.9908193003001429,,, +38.265625,76,2.335139340984763,2.455453461723158,2.5636535844735584,2.658094666666801,2.7373626388677565,2.8002990564547847,2.8460212805027703,2.873937834564619,2.883758668506513,2.875500149730496,2.8494846944358776,2.8063350454230274,2.746963296675182,2.6725548569377073,,, +38.2734375,76,2.5845476331275403,2.4846067981008875,2.3745955846291515,2.2565426169984297,2.1326063522828385,2.005037253941464,1.8761383600914998,1.7482249369253722,1.6235839237393694,1.5044338797029915,1.392886133700257,1.2909078175058433,1.2002874295859658,1.1226035324863215,,, +38.28125,76,1.0591971319106346,1.011148221115847,0.9792569013142508,0.9640294086462098,2.52796863612627,2.5598445202387956,2.520441254973198,2.4098264160438605,2.2328920711565803,1.9990184453869253,1.7214248978109254,1.4162534566321696,1.1014488089829741,0.7955128348392491,,, +38.2890625,76,0.516220522356664,0.2793867944090892,0.09777022538116564,-0.019809918974342033,-0.06908176195349358,-0.05061162856597101,0.03024267311368367,0.1637128280142569,0.336308664524935,0.5317664409415757,0.7321906240456187,0.9193095229319439,1.0757572016086776,1.1862922612467155,,, +38.296875,76,1.238868485193989,1.225482669920366,1.1427405025953694,0.9921010075801363,0.7797824985972819,0.5163365777744644,0.21591987106723592,-0.10468573240811882,0.6621084951507521,0.415766488046551,0.040401453560688805,-0.42012926782059196,-0.908542186419182,-1.36299195436747,,, +38.3046875,76,-1.7266471428364885,-1.956486311748939,-2.029944615442905,-1.9483759704150632,-1.7367917951450338,-1.4399172650657885,-1.1151795803999331,-0.8237205867719148,-0.6208337918519343,-0.5473154593327724,-0.6230770730190495,-0.8440142262359847,-1.1826197684107211,-1.5922458340816035,,, +38.3125,76,-2.0143510275656737,-2.387604062771823,-2.6574259846455854,-2.7844847665383066,-2.7508192298083998,-2.562638456451233,-2.2493606538972566,-1.8590411352735503,-1.4509014719000795,-1.0861233620430997,-0.8183410193983293,-0.685312822460302,-1.1555735099016473,-1.652988361609562,,, +38.3203125,76,-2.2124235163700914,-2.6900828918267226,-2.961921075029709,-2.957578655259507,-2.6796262692570063,-2.2028435082314775,-1.65373047408459,-1.1758672013476508,-0.8906146285112398,-0.863927338284433,-1.0883730324692495,-1.4852858023945754,-1.9264619994334145,-2.2694512923459658,,, +38.328125,76,-2.3967692990830693,-2.2482832413006695,-1.8378929999506357,-1.249933985680376,-0.6162857724394163,-0.08045832432023337,0.24150337468663974,0.29258355005766334,0.09018007938363815,-0.2789050911031751,-0.6824944124984947,-0.9794944606459608,-1.0587923153021679,-0.8699262345210284,,, +38.3359375,76,0.9656692923654557,0.984073898683265,1.0188362218094749,1.069252089748262,1.1343325589881785,1.2128213010214637,1.303216676212074,1.403798108456443,1.5126562987732435,1.627726748727144,1.7468260066482837,1.8676900019156333,1.9880137960157054,2.1054920542782325,,, +38.34375,76,2.217859529558239,2.32293084893974,2.418638906719724,2.5030711913425674,2.574503410127922,2.631429822940039,2.6725897535842917,2.6969898146274733,2.703921456402251,2.692973532824946,2.6640396639060206,2.6173202659453616,2.5533192137648983,2.4728351933253196,,, +38.3515625,76,2.3769478960402695,2.2669992964238124,2.1445703407910135,2.011453455085794,-0.4272360317473028,-0.7332895761783416,-1.0054866365630268,-1.2287529151932939,-1.3913440704271745,-1.4856582327834609,-1.5087598673225768,-1.4625784653968252,-1.3537682234974198,-1.1932385068252556,,, +38.359375,76,-0.9953878518342926,-0.7770949345669654,-0.5565368784991843,-0.35191731510745616,-0.1801929029322421,-0.05588711766093535,0.009925960625596919,0.010396992109703684,-0.056618219881845344,-0.18840677344724321,-0.3775857613245345,-0.6126153702125254,-0.8786022094003467,-1.1583368524862323,,, +38.3671875,76,-1.433493242701368,-1.6859063242933636,-1.8988388066143134,-2.0581487245571988,-2.1532763759413616,-2.1779818110340265,-2.1307814433893606,-2.01505333158389,-0.7030692708313131,-0.8634485785399808,-1.1354035746975981,-1.4698761643930194,-1.8074799208940535,-2.087793984624311,,, +38.375,76,-2.258820461560897,-2.2851320357553266,-2.1534405060149053,-1.8747186519377537,-1.4825446636154758,-1.0279267182644347,-0.5714135175914083,-0.173719321870621,0.113676610424012,0.25649228286363823,0.24292704852122537,0.08544478916803422,-0.18122126823690632,-0.5055310576386296,,, +38.3828125,76,-0.8272164155048356,-1.0867174866434617,-1.2345067691133536,-1.2388482849061027,-1.090783112586056,-0.8055645402806172,-0.42031910221586993,0.011702383849279421,0.42938851910727593,0.7732588054075838,0.9947046942318566,1.0635409781893965,0.7473389765586558,1.2218055195760895,,, +38.390625,76,1.4614856480874268,1.4196598894557426,1.1246485225712242,0.6719627650074509,0.1980624051915154,-0.15708735573119792,-0.2883974914201609,-0.15445581796197128,0.21114655721256137,0.7090669382716279,1.2015047712421598,1.5500562998369145,1.6537544199342604,1.4768670644937525,,, +38.3984375,76,1.0588341561905845,0.5036182854686533,-0.0486137972136752,-0.4597193269080605,-0.6312419436145209,-0.531188171736005,-0.20258133867637967,0.248549366394631,0.6824507360283727,0.9641708707721158,1.000767201402847,0.7669974676684475,0.31245042368527454,-0.25184009281315567,,, +38.40625,76,1.8696213531130854,1.72119269122856,1.5683951707623727,1.4135267341304618,1.258915533975687,1.1068793761573952,0.9596853466191428,0.8195103289498301,0.6884031038442432,0.5682486939805701,0.46073557850699354,0.36732635108283584,0.289232335125283,0.2273926006151249,,, +38.4140625,76,0.18245774974918705,0.15477875521991358,0.14440104643272134,0.1510639470772014,0.17420547376944884,0.2129724116066144,0.26623549007729286,0.33260939346620344,0.4104772552312247,0.4980192073300887,0.5932444844584407,0.6940265209218537,0.7981404254647744,0.9033021777301741,,, +38.421875,76,1.007208859897449,1.1075792189010774,1.2021938488553174,1.288934289960531,-1.8388037852721755,-1.6141115651219633,-1.3562884278288516,-1.0828145467928607,-0.8121230369498725,-0.5623183339658494,-0.34991778984360555,-0.18870422737068515,-0.08876945764507682,-0.05581544784585013,,, +38.4296875,76,-0.09076185902625389,-0.18968730898355124,-0.3441084429932497,-0.5415773382768805,-0.7665555691525152,-1.0015039669423624,-1.2281120672184849,-1.4285814957190945,-1.5868737826436246,-1.6898355752065153,-1.7281227674867263,-1.6968590885038137,-1.595983206316645,-1.4302601265639412,,, +38.4375,76,-1.2089560735434826,-0.9451995082887654,-0.6550728247167459,-0.356498045605385,-0.06799420522449662,0.1926069467617747,0.4093973790053833,0.5694951461201334,0.9726914538017702,0.7392791166392474,0.40195114242378777,0.014855338883167965,-0.36079371673205524,-0.6662452413880036,,, +38.4453125,76,-0.8543551022407779,-0.89691696411006,-0.7890399315471238,-0.549890932797296,-0.21968632339192673,0.14659858991992605,0.4878221843808145,0.7462328039200073,0.8765000675217173,0.8528143329886849,0.672948325873665,0.3586480882241186,-0.04770788307872911,-0.48966120094268284,,, +38.453125,76,-0.9054175186435218,-1.2374201814137633,-1.4412627279804435,-1.4925523546290682,-1.390655607168875,-1.158743178638751,-0.8401271258278985,-0.4914612929923782,-0.1738643015568403,0.056651967139901394,0.1579573004224527,0.10841447750839162,-1.255434125317433,-1.083720037269308,,, +38.4609375,76,-0.6863806498000238,-0.17660438126720374,0.3036071603789794,0.6224392673084216,0.6944513816614797,0.5040330327377305,0.1096994604449626,-0.3719506041191604,-0.798218330483855,-1.0394634781444014,-1.0147057689272672,-0.7139110794029041,-0.20085368454763852,0.40423088445051614,,, +38.46875,76,0.9574491999848035,1.330520431832141,1.445752601892834,1.2971402928673201,0.9518033258692529,0.5313739851274435,0.17843596493008318,0.017215165561021872,0.11929791923333877,0.4837743984358316,1.0372514689286303,1.6537336305779098,2.1889254221045578,2.519556135032831,,, +38.4765625,76,1.3658203591289761,1.4310450585493382,1.4830064508013665,1.5203359422590645,1.5419224794106379,1.5469322342826386,1.534823434153502,1.505356075754154,1.458596353733853,1.3949157257210685,1.3149846302231527,1.219760967239325,1.110473543166011,0.9886007697511368,,, +38.484375,76,0.8558449899546187,0.7141028801515502,0.5654324468109193,0.41201719542290327,0.2561280989589304,0.10008403167949595,-0.05378863901437292,-0.20319659525825212,-0.3459195361321457,-0.479848870079261,-0.6030244549384107,-0.7136687423709609,-0.8102177289203496,-0.891348171845074,,, +38.4921875,76,-0.9560005932737057,-1.003397669972614,-1.0330576868112336,-1.0448028184442184,0.663935835234067,0.6882909443969172,0.6429700874125875,0.5331859671545073,0.36858457529157196,0.16256642081127876,-0.06865386517081991,-0.30718395740169446,-0.5347070368737269,-0.7337643608003187,,, +38.5,77,-0.8889777518748896,-0.9881267467332482,-1.0230052791816053,-0.9899981481443703,-0.8903370612339333,-0.7300183897328562,-0.5193883614175048,-0.27242460898513615,-0.005764166676519071,0.2624543105923318,0.5138533756324744,0.7310966089076363,0.899096188274452,1.0060640042740836,,, +38.5078125,77,1.0443330259597077,1.0108916425778947,0.9075937207147728,0.7410297290683286,0.522067917021107,0.2650975405502646,-0.012973094609774635,-0.2938939061054323,-0.089703028961581,-0.4105195571117415,-0.8085441634188841,-1.2257151891050497,-1.6004054815795248,-1.8769858708140585,,, +38.515625,77,-2.014457534440496,-1.9928088947303997,-1.8161070898029412,-1.511842650829457,-1.1266295813098854,-0.7189306805433704,-0.349941267485116,-0.0740512797563817,0.06962862784766888,0.06335710534945604,-0.08648030701420828,-0.3503755215186382,-0.6803077041614358,-1.0172404748135446,,, +38.5234375,77,-1.3003386985956247,-1.4764692053454724,-1.5085055310933482,-1.3811430363675377,-1.1033185098274243,-0.7068572175161014,-0.24155793668855433,0.2325186997750885,0.6543576377525907,0.9714431669567765,1.1478867889445157,1.1699634867641826,1.9619770848675588,1.492938738743618,,, +38.53125,77,1.101264628444687,0.9061432912774748,0.9704343299368597,1.2833377091837828,1.7632719691158747,2.280173300761751,2.6911045563426037,2.8794152096699355,2.786719866460195,2.4289309358981104,1.8919511424152597,1.3082059781002782,0.8204471915744707,0.542746840284982,,, +38.5390625,77,0.5293712273840677,0.7600642261137152,1.14577200670059,1.5532386513228027,1.841730058187998,1.9018194107682067,1.685602366553701,1.220058885454006,0.5998975456561695,-0.03815862432404399,-0.5525994792018118,-0.8356675387687629,-0.8426497920551368,-0.6038956650186154,,, +38.546875,77,-1.0387620942820626,-1.0153689949166327,-0.9753537221661013,-0.9197302781704086,-0.8497785798515582,-0.7670219219878546,-0.6732001835902777,-0.5702392467991229,-0.46021716384367906,-0.3453276645309851,-0.22784164330886233,-0.11006730031462231,0.005690365614003712,0.11717000263525645,,, +38.5546875,77,0.22219358207000672,0.31870461026197916,0.40480420700784536,0.4787844187918183,0.5391581834740906,0.5846854217309442,0.6143947983552167,0.6276007723571975,0.623915637299895,0.6032563410253988,0.565845965347731,0.512209839791317,0.4431663574173528,0.3598126535473073,,, +38.5625,77,0.2635053981513702,0.15583703822459294,0.03860790615465881,-0.08620531752916505,-0.5593435333803519,-0.7922044702657546,-0.9777539182736925,-1.1046873249495681,-1.165903239825647,-1.1589947653218604,-1.0864133407478491,-0.9552934475121468,-0.7769504693833655,-0.5660867342295895,,, +38.5703125,77,-0.3397611137493869,-0.11619404616413498,0.08650867609863044,0.2516243463478486,0.3649855453178841,0.4159743491908251,0.39826920016257095,0.3102923429542055,0.15532661075921805,-0.05870659891881991,-0.31979269211214995,-0.6126545759886722,-0.9198107755817189,-1.2227872005635934,,, +38.578125,77,-1.5033980786647407,-1.7450067492407033,-1.9336784150101622,-2.0591444841372653,-2.115511273243819,-2.1016636684434293,-2.021335612958787,-1.8828425230250494,1.0481943595895258,0.8156515158174226,0.5227495280297049,0.2293349951316162,-0.004693405162710329,-0.1287731040368305,,, +38.5859375,77,-0.10961151569873084,0.06357043813219165,0.37730215118879307,0.7959052092987712,1.2669955700363036,1.7295893276094592,2.123549815102194,2.3989048663102728,2.5235832720505504,2.488365672497589,2.308278980140326,2.0202173523680425,1.6771604520091188,1.3398897079650098,,, +38.59375,77,1.067492970388667,0.9081366506023418,0.8915427548049275,1.0243426549522119,1.289031353073224,1.6466851790191506,2.0430196661913,2.416844078519021,2.709595749708091,2.8744691883127644,2.8837179985017816,2.732992239250742,0.4570599230591934,0.501466962270943,,, +38.6015625,77,0.2786657354730927,-0.17447169933448559,-0.7559841854879217,-1.3266354211690432,-1.7479637840124944,-1.9201406401951584,-1.8092620475019856,-1.4565945522562262,-0.9672414171522794,-0.48133565226647157,-0.13565489226721994,-0.026178040201504937,-0.1818452838738519,-0.556712383052775,,, +38.609375,77,-1.0426486150126315,-1.4990971809523157,-1.7917403925338053,-1.8294712616595248,-1.5895371304574708,-1.1239625316345778,-0.5454891505315083,0.0031155951299218776,0.3879717643373345,0.5205590182606923,0.38175386480300394,0.026846280274158085,-0.4298370440726548,-0.8464863830529773,,, +38.6171875,77,-0.2164842348002257,-0.3500058477688053,-0.484481513368428,-0.6175970529711006,-0.7470533145909688,-0.8706064774082055,-0.9861073928443425,-1.0915392733034577,-1.1850530686063108,-1.264999910639398,-1.3299600580720432,-1.3787678342691072,-1.4105321216939524,-1.4246520538875274,,, +38.625,77,-1.4208276302035796,-1.3990650673772005,-1.359676794158212,-1.3032760890394544,-1.230766454904247,-1.143325916572414,-1.0423865161191472,-0.9296093649297638,-0.8068556892445059,-0.6761543761060134,-0.5396665878934004,-0.3996480649520382,-0.25840977631448914,-0.11827760741771937,,, +38.6328125,77,0.018448209405827087,0.14953321139124148,0.272847666420988,0.38640369661075075,-1.6984943084422839,-1.4837299464258342,-1.25603397412388,-1.033710472442346,-0.8346000510867314,-0.6748293190997412,-0.5676800595047332,-0.5226569788766506,-0.5448190549957066,-0.6344211237121223,,, +38.640625,77,-0.7868907116867936,-0.9931417433725724,-1.2402032587260026,-1.512119310843772,-1.7910573018576734,-2.0585474797176455,-2.29676717153825,-2.489780208893718,-2.6246451243109057,-2.6923148484914914,-2.6882651763528735,-2.612808183018321,-2.4710687395488535,-2.272625770532735,,, +38.6484375,77,-2.0308432734622395,-1.7619377529007585,-1.4838471022732558,-1.214979810945731,-0.9729317187557905,-0.7732598023292127,-0.6283984996822509,-0.5467941391457823,2.4420355703829983,2.051633496282212,1.617287909978787,1.200603017508533,0.8597241690313709,0.6403186207104924,,, +38.65625,77,0.5685028266052061,0.6468176621992917,0.853878235680194,1.1477525936365565,1.4725428211754168,1.7671432361208899,1.9748112740313142,2.0520600721093,1.9754874027633018,1.7454770271999025,1.3861956730981089,0.941885814690226,0.47003138152380564,0.03246058125953588,,, +38.6640625,77,-0.3142286701341088,-0.5274297056672075,-0.5851101658079209,-0.48919208388528634,-0.26520279558399895,0.041748701434482616,0.3740429924207902,0.6705674816299141,0.876274921546695,0.9507942426850087,0.8747523164489429,0.6528218344879245,-0.8144385453696538,-0.3388016765523239,,, +38.671875,77,0.22177554550427878,0.7236553728895226,1.037595161352554,1.0840441349061036,0.8548399916230016,0.415359995938773,-0.11346214520713296,-0.5883243351428521,-0.8828527677894445,-0.922236947431308,-0.7037105881972522,-0.29726536050505437,0.17359775889033996,0.5658034803327932,,, +38.6796875,77,0.7560222019449203,0.6745976222729119,0.32478227985855224,-0.21799217987757322,-0.8266114868488501,-1.3569261265337822,-1.6870555610301907,-1.7505790475157161,-1.554518407805085,-1.177186251247514,-0.7464914881608642,-0.404650081680488,-0.26897492293850245,-0.39949331000988664,,, +38.6875,77,0.48838991447846797,0.5772029653187578,0.6514754235860429,0.7100995549310762,0.7522465279276849,0.7773807392081205,0.7852690012867444,0.775984432310485,0.7499049797427157,0.707706603952428,0.6503512411804526,0.5790697567747664,0.4953401873053854,0.40086165265996054,,, +38.6953125,77,0.29752439505010164,0.18737646966160096,0.0725876703276569,-0.04458867798875148,-0.16185539076519456,-0.2769118647569532,-0.3874945798642693,-0.491416952703951,-0.5866078439219349,-0.67114804485523,-0.743304104523098,-0.8015589045147297,-0.8446384462672802,-0.871534381558958,,, +38.703125,77,-0.8815218915759397,-0.8741726013533774,-0.8493623033299846,-0.8072733546387435,-0.5323178286989042,-0.5839977430759873,-0.6960894725696664,-0.858479522549074,-1.0573938202568618,-1.2763618155728171,-1.4973689382780817,-1.7021170389299594,-1.8733049097020278,-1.9958395805870557,,, +38.7109375,77,-2.057893912973121,-2.0517367300896887,-1.974277584942048,-1.8272881649807136,-1.6172848813293037,-1.3550808165326649,-1.0550382609535103,-0.7340739463757808,-0.41048633013101654,-0.1026866916502755,0.1720774895906143,0.3989178678372125,0.5663359384463127,0.6670172609926315,,, +38.71875,77,0.6983338312115436,0.6625195867981809,0.566506825641615,0.42143496084046667,0.2418658859050612,0.04476068260599274,-0.15171095377834193,-0.32944553193205534,0.31302043029088106,-0.09762992408163826,-0.5204072877431873,-0.89402028694747,-1.1641427617489146,-1.2918675049979025,,, +38.7265625,77,-1.259762411488057,-1.0745857713765923,-0.7662377768459652,-0.3831115196223438,0.01543246558743494,0.3682960543230719,0.6221402762158021,0.7396698935154148,0.7054155785028589,0.5281132346181807,0.23931003648513993,-0.11158551078223841,-0.46503831415381436,-0.7607012959264565,,, +38.734375,77,-0.9468588312711508,-0.9885279146143057,-0.8729550040438443,-0.6116521199737956,-0.2386547951682319,0.1947270672716275,0.6278481289345531,1.0001200998019812,1.260395131147166,1.3748788951588442,1.3323411375702612,1.1458124204481501,-1.9199270521883338,-2.3997146542366083,,, +38.7421875,77,-2.656579015330529,-2.633831305466277,-2.3492607748013903,-1.890119551795658,-1.3890885165611557,-0.9878124418983978,-0.7979993041772823,-0.8707460641731193,-1.1824983920701913,-1.6414927431988597,-2.1129153869532975,-2.455883028007503,-2.562109507174285,-2.385660759465818,,, +38.75,77,-1.9556424460203026,-1.3683421222141743,-0.7609785106632714,-0.27425120917239876,-0.013953460144152885,-0.022167239202393718,-0.2659335531573018,-0.6465012809088079,-1.0266178201884126,-1.268379993433525,-1.2712693421079804,-0.9999453486345488,-0.4941771344066692,0.1418105255132264,,, +38.7578125,77,-0.7483917060247709,-0.6734986142791769,-0.5836571831707631,-0.4801939684090407,-0.36467596860226514,-0.23888340496545352,-0.10477876627087884,0.03552733906450084,0.17981292596219312,0.3257833274935576,0.4711111641049667,0.6134768875269412,0.7506091895666804,0.8803245683602549,,, +38.765625,77,1.0005653594001729,1.1094355655415176,1.205233858727305,1.2864831756909756,1.351956389539672,1.4006976078232904,1.4320387242776826,1.445610934534574,1.4413510142705837,1.4195022499743697,1.3806100061419808,1.325512006624485,1.2553235004025483,1.1714175716405557,,, +38.7734375,77,1.0754009388833268,0.9690856672516289,0.8544572890479298,0.733639891068531,-0.47167591040143125,-0.5641481835268303,-0.5961232224730204,-0.5611330140187676,-0.4574390387093683,-0.2881607080197012,-0.061064888319037225,0.2119688267160421,0.5157698221194359,0.832927860613713,,, +38.78125,77,1.1450008714011737,1.4337949195738147,1.682627113025513,1.8774833930428612,2.007990484237169,2.068134238143947,2.0566742889475536,1.9772261162495708,1.8380048018742454,1.6512483581479973,1.432360848862143,1.1988350631217113,0.9690298740182717,0.7608875465436352,,, +38.7890625,77,0.5906804459337778,0.47187454662679074,0.4141889963336385,0.4229173173652545,0.49855758172201126,0.6367773499202888,0.8287158185507552,1.061602106106916,0.8505030633552118,0.498268698693281,0.14948473379065336,-0.1364044191058651,-0.3101890809989972,-0.3406016600176325,,, +38.796875,77,-0.2192269256437709,0.0381498192207228,0.39396686045997564,0.7947051114065009,1.1791958977103185,1.4881236657162087,1.6732436579196799,1.70487897578812,1.576529425258342,1.3058743753965198,0.932013491772868,0.5093751562633695,0.09924138943385336,-0.23979068706782614,,, +38.8046875,77,-0.4609251922169091,-0.5364417557501742,-0.46199477408191725,-0.25726810395260624,0.037116674527796434,0.3659567479708104,0.6680991142066875,0.8860016904541057,0.9747351149342408,0.9090229702250772,0.6872236674751266,0.3316335687671515,1.4756473104723977,1.4273110145945558,,, +38.8125,77,1.1432089757507193,0.7295215524667371,0.3262122077900288,0.0684990805808342,0.0496445991985599,0.29526268763141683,0.7561863144749169,1.3218511188401278,1.850527814267304,2.208118128515927,2.304881825045209,2.120029173489525,1.707438744419405,1.1809331783639112,,, +38.8203125,77,0.6831479199332933,0.34652438345257364,0.2571172795031126,0.43113436905363955,0.8106371597323108,1.2795794553298527,1.6957865231018316,1.9301086616727927,1.9020165431371499,1.6018808013780674,1.0938277002910985,0.4983861608842351,-0.04032004086767682,-0.39384541813583296,,, +38.828125,77,0.6088587800387932,0.48240137997538596,0.35657704625302755,0.23367650010934604,0.11593159396493607,0.005476112150478718,-0.09569170651732073,-0.18574426800381416,-0.2630567295158003,-0.32623555090482137,-0.37414299101253723,-0.405917119974329,-0.42098699700399334,-0.41908274784454913,,, +38.8359375,77,-0.4002403653773885,-0.3648011492821469,-0.3134057945136235,-0.24698323206274764,-0.1667344173601425,-0.07411135014812853,0.029208306847439025,0.14135056605532975,0.2602778963213366,0.38382487332180815,0.5097360749146943,0.635705557893697,0.7594172249326603,0.8785853749019532,,, +38.84375,77,0.9909947265330504,1.0945392146257953,1.1872588794741175,1.2673742035847915,1.3196465604542396,1.5851429318440022,1.8397045502114815,2.065548300155718,2.2467368531148146,2.3702925263024284,2.427105089098457,2.412570205493312,2.326913984062768,2.175180994935173,,, +38.8515625,77,1.966886580026259,1.7153576920244202,1.4368082168310383,1.1492132488354556,0.8710608074468091,0.6200680291485123,0.41195134599724437,0.25933639634511474,0.17088366908546748,0.15069083848653675,0.19801345173735785,0.307323431195602,0.4687012960813055,0.6685347367238292,,, +38.859375,77,0.8904748112602903,1.1165830695870167,1.328589595233367,1.5091742209669161,1.643181557854722,1.7186850928143675,1.727826134559099,1.6673690883979737,-0.1149361016725158,-0.5957756416008191,-1.0490562724492432,-1.4174053886776612,-1.6567865353814537,-1.7433012933715513,,, +38.8671875,77,-1.6768539298918665,-1.4811083173838642,-1.1997441235642465,-0.8895956845231396,-0.6117425101454707,-0.4219394126077025,-0.36187710191156974,-0.4526347372731997,-0.6913445075122426,-1.051588014804885,-1.4874629783382805,-1.9406870916865528,-2.349632802648633,-2.658886019465148,,, +38.875,77,-2.827840128278318,-2.836986946412829,-2.690924933668754,-2.4176162706365085,-2.064008653357119,-1.6887038491906612,-1.3528150215231727,-1.110436919591418,-1.000213307425784,-1.03931508421904,-1.2207670495471987,-1.5145396766123862,0.07436650168293729,0.5348102119031863,,, +38.8828125,77,0.9326485827497337,1.1434434038054953,1.0953377137948015,0.7889126001717609,0.29717478523274893,-0.2543229916774443,-0.7217816173404407,-0.9824758225501345,-0.9683193494052557,-0.6844765355814845,-0.20791991134513127,0.3336706033326098,0.7968837437767253,1.061842450005936,,, +38.890625,77,1.0649977646242013,0.816463811595265,0.39714361185755986,-0.06356559239392462,-0.42337607698315183,-0.5662632242852282,-0.43443667976320716,-0.04436513803265274,0.517538889999162,1.1183935041105906,1.615049349365509,1.8930992243138571,1.8980060912755774,1.6498203688238626,,, +38.8984375,77,1.3333172944437899,1.3837593673156516,1.4176340468427513,1.4341560794166401,1.4328351286552357,1.413484412402989,1.3762240299976138,1.3214789215146723,1.2499714946935567,1.1627090486117948,1.060966214281859,0.9462627195943997,0.8203368678971844,0.6851151945563823,,, +38.90625,77,0.5426788327565442,0.39522717742402047,0.24503948345957013,0.0944350706322894,-0.054267168110534,-0.1987892459827706,-0.33693384061825193,-0.46662263515626357,-0.5859325708776513,-0.6931293766808614,-0.7866977883830811,-0.8653679287843022,-0.9281373866661973,-0.9742886082096901,,, +38.9140625,77,-1.0034012963961398,-1.0153596013715056,-1.010353975962831,-0.988877663953472,1.5389343216447386,1.3488923641097925,1.1079268044321204,0.8302963460578894,0.532847465403938,0.23384650628408274,-0.04828736377991538,-0.2962599962246074,-0.4951018105502035,-0.6332054166319634,,, +38.921875,77,-0.703128968240335,-0.7021092416485654,-0.6322486745126499,-0.500363335491516,-0.31750243890073226,-0.09817292233963115,0.14067682847477955,0.3808432286345565,0.6041409855145641,0.7936750185895779,0.9350221036484571,1.0172398334015393,1.0336325289847617,0.9822206861964803,,, +38.9296875,77,0.8658812145498214,0.6921486846533821,0.47269143920361356,0.2224990964607722,-0.04116189857223164,-0.29995184448453033,-0.535736547625473,-0.731852108108724,-1.8722358157960632,-2.2346423004850346,-2.540970182894716,-2.738344294187332,-2.7900639698512966,-2.681348159444396,,, +38.9375,77,-2.42166994162036,-2.043316665612961,-1.5963998019416745,-1.141091545551275,-0.7382971475285582,-0.44021558118223136,-0.28225852801037354,-0.2775860922037101,-0.4151100728439795,-0.6612755238210445,-0.9653428358158334,-1.2673473440379996,-1.5074964220930207,-1.635540123406379,,, +38.9453125,77,-1.6186555501914164,-1.4466166247698609,-1.1334437525155616,-0.715276144154303,-0.24479791043562202,0.2169141836816733,0.6098518205723998,0.8843717324851594,1.0088800616367273,0.9747078382391815,0.7974184222029368,0.5143434808381974,0.46044846149507723,0.3460117362514189,,, +38.953125,77,0.49880645025406367,0.8920437500581773,1.4312761766039288,1.9801117303977729,2.3974394341050194,2.5759654790535986,2.4714996936921447,2.114966962045312,1.6038526128264599,1.0754271419893877,0.6690891725564068,0.4881477177454907,0.5715182772996623,0.8830900047734448,,, +38.9609375,77,1.3216778652660566,1.7488317689587167,2.0268804023810585,2.0567822593454634,1.8054090251219086,1.3147825624233396,0.6907325549153981,0.07408188762728973,-0.3977446760405571,-0.6281684013285637,-0.5876996266887093,-0.32178550939466033,0.061886289803796395,0.42314617832618295,,, +38.96875,77,-0.951717882703448,-0.8999418546106622,-0.8348779320988249,-0.7580921467404017,-0.6713605932437767,-0.576638131965233,-0.47602395808067555,-0.3717246404016826,-0.26601527714531686,-0.16119944893154584,-0.05956867034369362,0.03663794981982704,0.12527313314617539,0.20431925060821343,,, +38.9765625,77,0.27192387363495507,0.3264324346322306,0.3664174249372286,0.3907036188337649,0.39838888182223864,0.38886019866577193,0.36180464043245864,0.3172150783677231,0.2553905444186243,0.17693123196179739,0.0827282241398577,-0.026051870472502903,-0.14798710597680653,-0.2814248576780616,,, +38.984375,77,-0.42451051939532986,-0.5752197372031371,-0.7313936153303022,-0.8907762778941075,-0.8742675295696194,-0.9525640788277857,-0.9606630994201509,-0.8972515232369082,-0.7658754041697381,-0.5746949467509843,-0.3359181070089508,-0.06495225615435249,0.22066694266662906,0.5024947594300657,,, +38.9921875,77,0.7624597121043201,0.9841195605764048,1.1538034050374941,1.2615602571684255,1.3018479483910852,1.2739143471822456,1.1818443143067698,1.0342691345390245,0.8437587005627429,0.6259388479369351,0.39839540656479117,0.1794414074951045,-0.013166573138362447,-0.16347340400339372,,, +39.0,78,-0.25844488925333386,-0.2888836781431692,-0.25007770780003047,-0.14213594448972044,0.030012005811916986,0.25695240739622094,0.5254365765555129,0.8192974827361684,0.1787314851976221,-0.14857969022145873,-0.4086688628042823,-0.5537355603949059,-0.5545682599913451,-0.40511351959236297,,, +39.0078125,78,-0.1234342471687857,0.251092218026598,0.6638998469523669,1.0537293963756476,1.3621704103547918,1.542763516334325,1.5682452501397912,1.4348069342300875,1.1627041900723158,0.7931220533851573,0.3817838510438315,-0.009700844259948105,-0.32340173316876464,-0.5140570732493221,,, +39.015625,78,-0.5560867859655629,-0.4475372613947155,-0.21034365384549458,0.11313095495053407,0.466740238702851,0.7893479574910787,1.024400065863206,1.1287844204672826,1.079597862870821,0.8777663852790379,0.5479542319596353,0.13477580465642477,0.27345260188205855,-0.2563515028788682,,, +39.0234375,78,-0.890984150338198,-1.4876886053995797,-1.9126680781445327,-2.077555537947391,-1.9634470085582958,-1.6259131592203306,-1.1796171379718907,-0.7667557497188694,-0.5179744448152582,-0.5164691036758343,-0.7751140061300826,-1.2328850894629029,-1.7715591358713607,-2.2481122994787386,,, +39.03125,78,-2.5339384569646475,-2.5501385492694624,-2.289208699969439,-1.8171823821977624,-1.2556386699860096,-0.7485065252978026,-0.42276184542405726,-0.3537876410754077,-0.5448895387683492,-0.9265791133532185,-1.3758196649164696,-1.749957841533734,-1.9260394714636178,-1.834732248388359,,, +39.0390625,78,-1.0510541289080222,-1.2098961232537904,-1.3649943436126706,-1.5141041729932216,-1.655083359567397,-1.7859292899332802,-1.9048138182813208,-2.0101150417431546,-2.1004454656723572,-2.174676065815119,-2.231955826178744,-2.2717264106196717,-2.293731711383798,-2.298022107532994,,, +39.046875,78,-2.284953358823194,-2.255180154526955,-2.2096444302878333,-2.1495586577022965,-2.076384399348671,-1.9918065048912594,-1.8977034001970807,-1.7961139898257716,-1.689201752543804,-1.5792166586612935,-1.4684555761386484,-1.3592218588512472,-1.2537848247375623,-1.154339833471621,,, +39.0546875,78,-1.062969662801373,-0.9816078599626521,-0.9120047099755775,-0.855696416823984,1.120569868803267,1.410735798040844,1.6720087890549182,1.8885670087909996,2.0476495460675563,2.140439335698327,2.1626711805718424,2.1149224886066906,2.0025664664997223,1.8353910498259862,,, +39.0625,78,1.6269101579322909,1.393415316850182,1.1528337979734928,0.9234729120422625,0.7227380362477542,0.5659137833766411,0.46509331829284306,0.4283304956581079,0.4590739541479273,0.555922640057877,0.7127198182252825,0.9189790237158031,1.1606122597204078,1.4209096697964183,,, +39.0703125,78,1.6817023757154896,1.9246273987219507,2.1324064625985573,2.2900495081355174,2.3858989979060463,2.412442191626338,2.366834751724223,2.2510991677573675,-0.30409990278314597,-0.7068786096936464,-1.0172132949704362,-1.192929293880885,-1.2125432441101973,-1.0785607928732217,,, +39.078125,78,-0.8170396937319279,-0.4734865975914496,-0.10572687796532382,0.22514171552064088,0.4643023409100074,0.5717911067017463,0.5287525443037171,0.3404040153425588,0.035247177082316505,-0.3393508121198262,-0.7245182144035844,-1.059035356783725,-1.2888608808161346,-1.3755438915524127,,, +39.0859375,78,-1.3022118061828363,-1.0762012793028726,-0.7279224192547431,-0.30613317371405363,0.12964012309952444,0.5183555695407953,0.8069407945828527,0.9585330885671687,0.958191250001224,0.815189643885263,0.5615373235559303,0.2469530512993025,-0.33176123131052615,0.1893829370408351,,, +39.09375,78,0.5054025009303318,0.5499430131559593,0.33015800051943245,-0.07544635612264089,-0.5387094519743509,-0.9171088686439779,-1.0929731594279288,-1.0058663525584584,-0.6692673062995227,-0.16697153458375244,0.36979923084856126,0.7983068522995174,1.0033846631814878,0.9289908851724635,,, +39.1015625,78,0.5935798228000481,0.08507792680514971,-0.46315869542522786,-0.9088165327747333,-1.1395314703721713,-1.103567875495518,-0.8238628606988877,-0.39158789371801717,0.059006234999327556,0.3875652590007397,0.48629240547058217,0.30969683811275284,-0.11272552013176307,-0.6843562373671308,,, +39.109375,78,-0.8139780372485684,-0.7878806411758039,-0.778153098799276,-0.7852488133056342,-0.8093176316468526,-0.850203075084515,-0.907444938082794,-0.9802872101236187,-1.0676911818118058,-1.168353505857915,-1.2807288967641481,-1.4030570718145121,-1.533393461696374,-1.6696431530818885,,, +39.1171875,78,-1.80959746889341,-1.9509725457938547,-2.091449233469691,-2.228713617118315,-2.3604974536507073,-2.4846178136136388,-2.5990152347487245,-2.7017897191631124,-2.791233943835062,-2.865863102980789,-2.9244408597696028,-2.9660009530035496,-2.9898640804540646,-2.9956497632485553,,, +39.125,78,-2.983282983582102,-2.9529954795407516,-2.905321674376219,-2.841089311516762,2.0719841634202734,1.840494889801814,1.5711266648580262,1.2808556908833693,0.9879571276545429,0.7107329371326557,0.4662382067153411,0.2690947633429561,0.13047480288220192,0.05732540275961362,,, +39.1328125,78,0.0518879874897632,0.11154624800922963,0.2290131108724034,0.392843709650931,0.5882385770233175,0.7980810373796787,1.0041364475982206,1.188329646838282,1.3340115218945328,1.4271263530813272,1.457198524012308,1.418069774482647,1.3083355706248145,1.1314501476181842,,, +39.140625,78,0.8954928843489853,0.6126122854830399,0.29818632755634156,-0.03024229573211948,-0.3541817970991432,-0.6554730358119831,-0.9175480117111593,-1.1265773715940808,-0.06892091840313935,-0.32585333683001266,-0.4724526169544153,-0.4742208457884952,-0.31897844787375595,-0.018814319317574935,,, +39.1484375,78,0.3917425809184864,0.861045675390004,1.328318532792291,1.733064104401313,2.024430185325623,2.1690726734971877,2.1562921753223834,1.9996441962310365,1.7347724091607377,1.4138027651987874,1.0971718716440004,0.8441626819030671,0.703621875837662,0.7063049999341872,,, +39.15625,78,0.8600418931005537,1.1484756369045859,1.5335716600190499,1.9615063903180172,2.371018449762229,2.7029218162470388,2.9092993763960755,2.9609450554385233,2.8518954845059614,2.6003454656930742,2.245804717542941,1.842938803298491,-1.9409763343710935,-1.8828280667345831,,, +39.1640625,78,-1.5804167662048418,-1.1325726316923388,-0.6766926871879153,-0.3508884871803085,-0.2559501097423361,-0.42755273778058167,-0.8263248166236195,-1.3485013126511796,-1.8542436837419978,-2.2058660887928196,-2.3054921816271507,-2.1218227059331802,-1.6986783143406234,-1.1429766969464064,,, +39.171875,78,-0.5954393372499923,-0.1920562963801582,-0.026870165480350483,-0.1262785755669389,-0.4418975607411228,-0.8639409008943353,-1.2514475662271214,-1.4710716464796822,-1.4338022579822935,-1.1195480952851886,-0.5828470872687335,0.06186546841645124,0.6713946232846811,1.1127974220389372,,, +39.1796875,78,-2.761404959301811,-2.667634639249685,-2.561379917056681,-2.444449874967103,-2.3188294562657825,-2.1866447361732377,-2.0501257272256175,-1.9115673704024914,-1.7732893950224073,-1.637595750230348,-1.5067343184079378,-1.3828576158827648,-1.2679851690373651,-1.1639682245704006,,, +39.1875,78,-1.072457411789697,-0.9948739231291144,-0.9323847174644339,-0.8858821803714442,-0.8559685974194052,-0.8429457123163033,-0.846809552683437,-0.8672506139979831,-0.9036593984184614,-0.9551372114407412,-1.020512027267484,-1.0983591450118126,-1.1870262739764461,-1.2846626086838362,,, +39.1953125,78,-1.3892513844753147,-1.498645343551695,-1.6106044903533032,-1.7228354751061359,-1.2724269260206655,-1.3493564929636215,-1.3564123530738665,-1.2974859667341292,-1.181034875607467,-1.0194852682275612,-0.8283578875701716,-0.6251782506082798,-0.42824719021313895,-0.2553574696492845,,, +39.203125,78,-0.1225459801483273,-0.042968550336966005,-0.025975845832026723,-0.07645481421531775,-0.19448161283043341,-0.3753102356709792,-0.6096976457408024,-0.8845427531284658,-1.183794692994977,-1.4895670779357033,-1.7833805352803391,-2.0474468935460477,-2.2659054772231477,-2.4259253080214975,,, +39.2109375,78,-2.51859636074641,-2.539547731114476,-2.489249615368847,-2.3729780495726995,-2.2004448725183687,-1.985118720401511,-1.7432844059514483,-1.492906277148944,1.4530535794025836,1.1345495147285012,0.9338326580120742,0.878097884527677,0.9711084147726443,1.1926288922085961,,, +39.21875,78,1.5016002257821721,1.8425615836670923,2.1543191445798273,2.3795112503254408,2.473579966271714,2.4117514948699696,2.192938003097413,1.8399529159902528,1.396005911875055,0.9180232985617934,0.46783390220397136,0.10259304835576899,-0.1340641225606951,-0.21876236796007087,,, +39.2265625,78,-0.15196962407653913,0.04213396960242877,0.31948060964989156,0.623036945764059,0.8917453259896713,1.0700912324698761,1.1168064411367886,1.0113520591317895,0.7571713958869593,0.38120574702942317,-0.07025174953029525,-0.538718650886064,0.9171422376588797,0.5213423137158347,,, +39.234375,78,0.16973878268769582,-0.008642925119832556,0.06666814023328038,0.40531079786033974,0.9432378090765183,1.5600697247491206,2.1119020984140153,2.470576221809619,2.5586519359376148,2.370498843288679,1.9737266046793653,1.490563288697201,1.0642861875270526,0.819905985069192,,, +39.2421875,78,0.8298799433612292,1.0942512635296182,1.540657787651631,2.044207410032654,2.4617724920224324,2.6713035571176467,2.605386713709576,2.269846686979048,1.7422957133490211,1.151024621572895,0.6400198874137658,0.3296927635893645,0.2840816540883506,0.49351467258472415,,, +39.25,78,-1.8330319158319919,-1.9389149526953715,-2.0382733244895794,-2.12900226541915,-2.209140541008146,-2.2769049745273073,-2.330721859282436,-2.369254706631419,-2.3914278437497685,-2.3964454478456254,-2.383805683418246,-2.353309694905248,-2.305065297141832,-2.239485298893478,,, +39.2578125,78,-2.1572804886992554,-2.059447405721056,-1.9472511096089784,-1.8222032509565316,-1.6860358262086554,-1.5406710764425993,-1.3881880569675662,-1.2307864629782912,-1.0707483445418653,-0.9103983811607307,-0.7520634113638895,-0.5980319258336639,-0.45051423320640843,-0.31160399590676313,,, +39.265625,78,-0.18324180939099555,-0.06718146238423472,0.03504053123766193,0.12213159556379405,-1.2523748189885484,-1.0392239027348282,-0.8689081331349318,-0.7537255524125753,-0.7019608228246437,-0.7173086340924918,-0.7986175402136424,-0.9399720847979506,-1.1311074833269257,-1.3581279397061983,,, +39.2734375,78,-1.6044785003066948,-1.8521026679573078,-2.082705043977984,-2.279030941652733,-2.42607373039558,-2.5121257087068427,-2.5295992146075,-2.4755607036635516,-2.351940539774733,-2.1654038569039,-1.9268914839534275,-1.65086293201965,-1.3542942188888145,-1.0555004011656957,,, +39.28125,78,-0.7728649076665262,-0.5235642663776918,-0.32237713812986524,-0.18066069084049252,-0.10556567870690614,-0.09954494481752285,-0.16018960410311756,-0.2804043131784766,-0.9625867743777586,-1.2866753171757597,-1.4707857917924458,-1.4959264961731042,-1.367237203074929,-1.1131586944122056,,, +39.2890625,78,-0.7809766334443009,-0.42943396484302604,-0.11956260556290177,0.09483747574787582,0.17558879229086033,0.10608957157846788,-0.10609758377992229,-0.43042480677538986,-0.8181221766579768,-1.2098030946509786,-1.5447271868643935,-1.7702779076227977,-1.8501785556327786,-1.7701668949113796,,, +39.296875,78,-1.5402443892166657,-1.1931495626862152,-0.7792930943448364,-0.35894334143635387,0.007120768653838594,0.2670338369231212,0.38587746219970975,0.35107207172361465,0.17428756279796975,-0.11042457172636144,-0.45198642971849784,-0.7903018196898833,1.6398580046898954,1.7604779539239983,,, +39.3046875,78,1.6111733904438719,1.2085247160271377,0.6389897866831621,0.035427240998009035,-0.4591060363388316,-0.7303632197495981,-0.7240324412541819,-0.46044959270169294,-0.028868270132204707,0.43714127711881046,0.7964205192811767,0.9390111070118519,0.8163717624096212,0.45474134493798746,,, +39.3125,78,-0.0520148361709606,-0.5681151612798618,-0.9530820165444353,-1.1002712105009138,-0.9661504228549851,-0.5823018262969533,-0.046858608973100284,0.5022785163558997,0.9251053554331198,1.1177375076373108,1.0407184460471854,0.7296555813486385,0.2852709917576231,-0.15440455852912038,,, +39.3203125,78,0.19306548402760226,0.2471000071129157,0.28378978611323424,0.302993809761259,0.30487766154935025,0.28991037887503956,0.25885599914668245,0.21275994100769047,0.15293045928130178,0.08091549849267787,-0.0015246496067463644,-0.09244840560703521,-0.1897671351247342,-0.2912819550538661,,, +39.328125,78,-0.39472246877845246,-0.497786751967776,-0.5981818886676072,-0.6936643477856208,-0.7820794928454318,-0.861399533072601,-0.9297592511686876,-0.9854888820516965,-1.027143566745424,-1.053528865554123,-1.0637218836719606,-1.0570876392024138,-1.033290386865662,-0.9922996990069921,,, +39.3359375,78,-0.9343911973125293,-0.8601419223113067,-0.7704204216342855,-0.6663717304794202,-0.4489093878947671,-0.6510347371828797,-0.8697502324651616,-1.0868606444689273,-1.2842818035077506,-1.4453089753935635,-1.555788988055499,-1.6051143558906564,-1.5869700616818638,-1.499780904134935,,, +39.34375,78,-1.3468281998501166,-1.1360276858061475,-0.8793840943345035,-0.592160419583224,-0.29181979034614636,0.003186278553040267,0.2746987711331573,0.5061118846255549,0.6835256725751437,0.7967102515082205,0.8398143456753824,0.8117687718734348,0.7163567385054302,0.561946066462926,,, +39.3515625,78,0.3609020139914367,0.12872165947679878,-0.1170497879740094,-0.3580451741974109,-0.576358569944351,-0.7557959403198078,-0.8830060960092871,-0.9484130577322464,-1.0656697229569319,-1.2281366135671477,-1.2453306728318145,-1.107557387659479,-0.8293625768540439,-0.4473191087820016,,, +39.359375,78,-0.014381757827217304,0.40831081698489907,0.760910356658415,0.9941341425313399,1.0768965926479064,1.0011088941302089,0.7828993325375795,0.4600644609394928,0.08614830341156447,-0.27792802668405453,-0.5733823940475419,-0.7527510658883613,-0.7873016171111905,-0.6715246036174218,,, +39.3671875,78,-0.4240043079929908,-0.08453286051051262,0.2920828270254969,0.6445567444496623,0.9146726173420581,1.0563586014324637,1.0428743753494265,0.8709911529191796,0.561513484209814,0.1560614800443185,-0.28938546631347795,-0.7131779918133299,-0.29234860821821607,0.155686220761711,,, +39.375,78,0.7291346570246823,1.2871130495559489,1.6922086707843356,1.8479274374863024,1.7249350539945616,1.3689016470579083,0.8878018016181851,0.4221524564026956,0.10634721383008738,0.03168568409603101,0.22123177089073465,0.6233926813914383,1.125979476361312,1.586896413193069,,, +39.3828125,78,1.873048686282608,1.896805551809893,1.6400256142788612,1.1590596827185724,0.5693598737168778,0.013912747843656148,-0.37585258982857694,-0.5159683051940407,-0.3928043949054786,-0.06664937966493334,0.34498489150759415,0.6997571777872273,0.8697096774081323,0.7765509227145058,,, +39.390625,78,-0.5493975071681193,-0.421131671517357,-0.2834119724981986,-0.13824798292985002,0.012213918470259322,0.16572796461736378,0.3199881620783649,0.4726685119438289,0.6214635853754423,0.7641287434307656,0.8985192970065988,1.0226279212846665,1.1346196696320252,1.2328639739383163,,, +39.3984375,78,1.315963071131577,1.3827763581980137,1.432440249310645,1.4643831874323814,1.4783355475990168,1.4743342585314174,1.452722061705109,1.4141414208998102,1.3595231889189416,1.29007022996552,1.2072362844897762,1.1127004466153076,1.008337701080149,0.8961860356187124,,, +39.40625,78,0.7784107046698208,0.6572662701820888,0.5350570841921006,0.4140969051474843,-0.9468848142841453,-0.878091837434638,-0.7465303520280121,-0.5612087381332307,-0.33501893380116443,-0.08383667370398964,0.17458669109461586,0.42186351246952464,0.6402538783415879,0.8139048153834227,,, +39.4140625,78,0.9299582425505615,0.9794504082729265,0.9579400839012855,0.865821699933429,0.7083015807516533,0.49503892610242584,0.23947656512590604,-0.04209185877878145,-0.33165323510510136,-0.6107259845978584,-0.8616434849704573,-1.0687804394101528,-1.219636682632348,-1.305702861078776,,, +39.421875,78,-1.323047634933276,-1.2725854692440262,-1.1600063553745563,-0.995372379054849,-0.7924092834743395,-0.5675424451406262,-0.33874450336616135,-0.12427501848906586,-1.0575658537986543,-1.2776565285664372,-1.3483681532960778,-1.2682940538418324,-1.0598771524762811,-0.7658673190817671,,, +39.4296875,78,-0.44261369296790976,-0.1512369838490193,0.051943025141063415,0.1242335345727631,0.04327336296240747,-0.1894284079645675,-0.5486712278957636,-0.9894317553400527,-1.4538201433251903,-1.8800407474574938,-2.2119618693224408,-2.4078042845040533,-2.4465955537661372,-2.331385100737932,,, +39.4375,78,-2.0887195595588635,-1.7644603695374041,-1.4165952978616436,-1.106163771211431,-0.8877096685139212,-0.800748813337904,-0.8635803445126724,-1.0704060559567865,-1.3922065459495898,-1.7812378552502703,-2.1784483445492357,-2.5226606996947574,-0.8016182452084568,-1.387028904113211,,, +39.4453125,78,-1.782340603688195,-1.9119310515580539,-1.7723251160546218,-1.4329101914450397,-1.0166888113873997,-0.6663456970891386,-0.5049312209654065,-0.601938649075329,-0.9540741389303649,-1.4859914961146308,-2.070791806961001,-2.5646709465679995,-2.8462202824908696,-2.849610411631201,,, +39.453125,78,-2.58256405421009,-2.1241928664163754,-1.6032914255756423,-1.1630375373865474,-0.9217734254177533,-0.9406162675327122,-1.2067746189475206,-1.637142547711613,-2.1011856001633613,-2.4568452142955275,-2.5896200544799983,-2.444111874745131,-2.0393886095220393,-1.4639524622857791,,, +39.4609375,78,0.29666835510307454,0.18498292770145158,0.08114224721034491,-0.012898743035021698,-0.09536601820826274,-0.16469753609301196,-0.2195705837842481,-0.25892492815523027,-0.2819813647431433,-0.2882553402743907,-0.2775654103195152,-0.2500363840051726,-0.2060971007446819,-0.1464728779430674,,, +39.46875,78,-0.07217276194815014,0.015528194483110824,0.11511131784753703,0.224840970670948,0.34279501260053513,0.4668985323912085,0.5949602600928452,0.7247110218134686,0.8538435636548811,0.9800530474575535,1.1010775092080318,1.2147375716229099,1.3189747154796694,1.4118874394889758,,, +39.4765625,78,1.4917646754880143,1.5571158737745519,1.6066972317140378,1.639533606278906,0.058599936719652024,0.19481894854313675,0.272582720779329,0.28418406311927813,0.22655251453779313,0.10147560623229379,-0.08451868235838889,-0.32061009474432345,-0.5924336602594982,-0.8830745353901718,,, +39.484375,78,-1.174240766603607,-1.4475322104493669,-1.6857171410528569,-1.8739275387555878,-2.000689723894745,-2.058718481240817,-2.045419312724125,-1.963063808762116,-1.8186259224792511,-1.6232905769037296,-1.391668883931187,-1.140774712145486,-0.8888339818962423,-0.6540097298185149,,, +39.4921875,78,-0.4531318580142012,-0.30052015573164315,-0.20698267648666657,-0.17905932475932262,-0.218563406390344,-0.32245311810568067,-0.4830419431019968,-0.6885332858486879,-2.7600890052366323,-2.852708617860188,-2.784175232943619,-2.5623712426721115,-2.2181827801055687,-1.8006979130618792,,, +39.5,79,-1.3695738553776393,-0.9857619828121761,-0.7020352008477975,-0.554792976323985,-0.5584203223595151,-0.7030792153428067,-0.9562762851543164,-1.2679624278720996,-1.578369858137953,-1.8273657321127548,-1.9638652436711972,-1.953837819770413,-1.7856591611010573,-1.471975261777676,,, +39.5078125,79,-1.047787809985223,-0.5650589031418654,-0.08467513955286687,0.33297756576473114,0.6373607101250305,0.7955959682080994,0.7975274079938175,0.6572449842223321,0.41083230845034485,0.1106897797894546,-0.182682439174499,-0.4101614810676165,-0.057858223472847636,-0.04118207392784479,,, +39.515625,79,-0.272740817249873,-0.6616154996337408,-1.0737494137775223,-1.3689232204016775,-1.4394145109585477,-1.2397442938765926,-0.7993557579435564,-0.21474850005583768,0.3767778537910435,0.8345762741041839,1.0530381508867825,0.9903933549789571,0.6800325864466161,0.22125000176033421,,, +39.5234375,79,-0.24805578830873215,-0.5892397811742979,-0.7009514137568712,-0.54693198323982,-0.16595009589373738,0.3388477793710203,0.8282526672891324,1.1652134673078536,1.2524866049798908,1.0593954262645502,0.6303643153330123,0.07288734315856803,-0.4717725309751481,-0.8671247956689214,,, +39.53125,79,1.6549357267459106,1.6525124060779124,1.6321775370773914,1.5941517507207452,1.5389587075426907,1.4674160869137123,1.3806214318900152,1.2799330973923784,1.1669466352087383,1.0434670292122559,0.9114772668527371,0.7731037971197343,0.6305794797004799,0.48620467397805023,,, +39.5390625,79,0.3423071490839074,0.20120151686774984,0.06514889798720452,-0.06368247275115968,-0.18325501212298995,-0.29169726413607844,-0.38733646454129833,-0.46872762413095514,-0.5346786216988448,-0.5842708674136922,-0.6168751749185675,-0.6321625643651119,-0.6301098073516515,-0.6109996168035339,,, +39.546875,79,-0.5754154786023947,-0.5242312155920645,-0.45859546683153357,-0.379911353989551,-0.9238420682172431,-1.1716459975324565,-1.413593200550977,-1.63158201266579,-1.8090236791970518,-1.9319999163785755,-1.9902346106163094,-1.9778118944677598,-1.8935905229431853,-1.741285650848208,,, +39.5546875,79,-1.5292123042644028,-1.2697084296026604,-0.978277746953301,-0.6725121726182021,-0.370868946286783,-0.0913877294986849,0.1495628727222318,0.3384219676246837,0.4653769555488718,0.5250424570591297,0.516830254216643,0.44498446099290667,0.3182794830336504,0.1494018423056364,,, +39.5625,79,-0.04594101222553168,-0.2501227480995363,-0.4448341833086463,-0.6123671029166992,-0.7368563181742833,-0.8053933394873244,-0.8089339870404986,-0.7429366320118386,-0.5232624978130372,-0.49174038577163914,-0.3083482561897426,0.009988740739255597,0.42476728901470684,0.8818636748114113,,, +39.5703125,79,1.3199276870899501,1.6799054315862576,1.9142079872893454,1.994097978241912,1.9141436835639745,1.6930470354776872,1.3707166210389328,1.00204164330694,0.6483366197846566,0.36778937000031564,0.20640006591239302,0.19082261221272523,0.3242233047507309,0.5858017376492868,,, +39.578125,79,0.9340484948268608,1.313232117902439,1.6621048463212071,1.923471021375427,2.053127663503371,2.0267845024094506,1.8438854343722213,1.5277359849673158,1.12191670058521,0.683540865392054,0.2744064417616452,-0.04857989238246774,-0.5579671042110629,-0.10322620775425836,,, +39.5859375,79,0.3239008132414712,0.5902602877007542,0.6069733850257588,0.3540168910353491,-0.11407082349851577,-0.6829245833989468,-1.2094916328346486,-1.5610429600961302,-1.6513667853441711,-1.464226451028109,-1.0576552761325568,-0.5479128095351472,-0.07750096463640777,0.22399294035499195,,, +39.59375,79,0.27549345947928716,0.06671762531424685,-0.3389682091367505,-0.8218987150239673,-1.2389121524236322,-1.4626149919617717,-1.416347166276061,-1.0952646463326594,-0.5677606592430959,0.04316474518826574,0.5934817067900245,0.9574528468803396,1.061925102839964,0.9061942250127463,,, +39.6015625,79,-0.289811691058636,-0.19013017159767964,-0.08286903814411295,0.02983619995558845,0.14575438238394794,0.26259798856577676,0.3780634151463987,0.4898715348468027,0.5958078263697075,0.6937613725612573,0.7817620438304682,0.858015215616402,0.9209334118710835,0.9691643203438647,,, +39.609375,79,1.0016146889978395,1.0174696849957856,1.016207377153018,0.9976080881410279,0.961758452554586,0.909050109661208,0.8401730535938441,0.7561037573003211,0.6580882780731612,0.5476206403602815,0.4264168742479589,0.296385164082562,0.15959262980793698,0.0182293225563378,,, +39.6171875,79,-0.12542993518238219,-0.2690651967572282,-0.4103518318050979,-0.5470010519541957,-0.6076865450308245,-0.4082837170901086,-0.1542949850860425,0.14090529684728764,0.46106008044594354,0.7881554673652101,1.1036690828464852,1.389853943264951,1.630968306629653,1.8143657617933227,,, +39.625,79,1.93136955794894,1.9778702214189061,1.9546048025577347,1.8670982962674874,1.7252713370135966,1.5427415406298137,1.3358672277985923,1.122600228214098,0.9212277774171137,0.7490912516905274,0.6213711010814098,0.550022723842438,0.5429374993897615,0.6033874952617508,,, +39.6328125,79,0.7297925814260506,0.9158262021579776,1.1508524393535189,1.4206638984440654,1.7084689700289952,1.9960596298621127,2.265078349536785,2.498295778148652,-0.2422153700536107,-0.28367808747087087,-0.17402859274021898,0.06200899417099526,0.37995194947885635,0.7225414916719676,,, +39.640625,79,1.028715046473268,1.243170463738759,1.3250322224947289,1.254269534855896,1.0348664189226844,0.6942497160234674,0.279063881209877,-0.1520496047051874,-0.5375437959946777,-0.822512983671645,-0.9672078015171346,-0.9531926616700419,-0.7861866485928446,-0.49514555225081514,,, +39.6484375,79,-0.12772816595667352,0.2571468742770444,0.5984942877749252,0.8427734056250414,0.952235987522299,0.9108103334033993,0.7266051801812303,0.43064338114376016,0.07202261782707739,-0.28974307637371094,-0.5940080773762655,-0.7884599899494807,-0.1762612480283643,-0.30617405039400436,,, +39.65625,79,-0.1691064511019157,0.22874491493419957,0.8094619587986218,1.4445185583829652,1.9897664491649563,2.324707156454865,2.3852888266971277,2.181241388243664,1.793200974835053,1.3504136063486212,0.995130651505454,0.8434558515682847,0.9533760606710665,1.3087388596380136,,, +39.6640625,79,1.8235694706339465,2.3655448272648143,2.792192063411439,2.989891105518494,2.904992329501177,2.558521060983955,2.04043884278582,1.485034061839597,1.0341861976802211,0.7985712287867356,0.8274398034568072,1.0952500556588576,1.5088174145563764,1.9330204958497292,,, +39.671875,79,-0.6767998122890388,-0.7976493900058719,-0.9076019648595872,-1.0048945609776245,-1.0879797558236344,-1.1555526186971732,-1.206573407170954,-1.2402856241491382,-1.2562291194568127,-1.2542480066423738,-1.2344932564552138,-1.1974199216722483,-1.1437790419454137,-1.0746043704955102,,, +39.6796875,79,-0.9911941551428366,-0.8950882927585739,-0.7880412572369401,-0.6719912750780651,-0.5490262883853214,-0.42134730132329956,-0.29122975189412686,-0.16098358547347424,-0.03291272925952743,0.09072532270764883,0.20775910624788752,0.3161412720859941,0.4139844923258844,0.49959455960442467,,, +39.6875,79,0.571500099319491,0.6284783746438675,0.6695767324530473,0.6941293146219188,2.6808101033338834,2.8010844608146046,2.851750054189515,2.8301189836349194,2.738371024292771,2.5834013308102377,2.376339688369815,2.1317748338123077,1.8667379360355216,1.5995161186086904,,, +39.6953125,79,1.348378758413754,1.1303053757324544,0.9598038193877415,0.8479011532223155,0.8013776063853075,0.8222969995266228,0.9078663840390562,1.0506346736853147,1.239016408218685,1.4581041154259111,1.6907126124751282,1.9185824129212716,2.123658310194966,2.289353965479739,,, +39.703125,79,2.4017143032978705,2.450394643782832,2.429388279634375,2.337451747057843,2.178198120286692,1.9598518086712358,1.6946819394426886,1.3981538221825782,-0.8372902341307702,-0.7267976709794557,-0.4675523388496875,-0.09278213391620954,0.34676645243719334,0.7906932592120209,,, +39.7109375,79,1.1783102434350006,1.4580495764101318,1.595448918777746,1.5784703687704669,1.4193248835335712,1.1525182740402393,0.8294233922839311,0.5102242001929422,0.2544867584792605,0.11182604199705126,0.11412256528187259,0.27050141171445674,0.5658560003561945,0.9631468108202887,,, +39.71875,79,1.409117313403076,1.8425370988773424,2.2036885712217558,2.4436198670975045,2.5317230679748346,2.4604576046769746,2.2464833934423605,1.9280274327066373,1.5588942337987088,1.2000531839452955,0.9101133290705808,0.7361693368903544,2.0692949461684442,1.6047108241245063,,, +39.7265625,79,0.9926108779319835,0.37130390442741656,-0.11886010137928338,-0.3737154548571381,-0.35358938115651106,-0.09393733598144555,0.30460763057596085,0.7040421962407795,0.9670335852857447,0.9947660817553496,0.7542187882638153,0.2873968765211343,-0.30001528521682663,-0.8674707492393053,,, +39.734375,79,-1.2779498779618241,-1.4354031146067605,-1.3109856373665307,-0.9508945161529909,-0.4636609943893619,0.009618951557206046,0.3339567233392786,0.4174470830216904,0.23641427296567386,-0.15816304606303677,-0.6547082438667482,-1.111731235180546,-1.3967302986550207,-1.422648147572212,,, +39.7421875,79,0.7017687420586994,0.6924325668674243,0.6663643796480115,0.6241095525319361,0.5665056924853944,0.4946679720342969,0.4099695942681215,0.3140177341799393,0.2086253776101853,0.09577955090545753,-0.022393502407573124,-0.14366558815961192,-0.2657456187372673,-0.38631977703568166,,, +39.75,79,-0.5030920838662147,-0.6138246584691194,-0.7163769671350388,-0.8087433726637514,-0.8890883271370393,-0.9557785917372064,-1.0074119194096673,-1.0428416980864488,-1.061197122923043,-1.0618985442829154,-1.0446677226705983,-1.009532810995931,-0.9568279768673854,-0.8871876714661134,,, +39.7578125,79,-0.8015356452853133,-0.7010689030017296,-0.5872368783544938,-0.4617161936052404,1.087857649778369,0.7822891244107539,0.49956702263171293,0.25617711084970685,0.06582998491265701,-0.06148753692980169,-0.12020133553490042,-0.10953120342659894,-0.033537782482150336,0.09916802917925827,,, +39.765625,79,0.27603292005020647,0.4814438540673519,0.6978240359597195,0.9068657114228103,1.0908138187324525,1.2337109627102523,1.3225168793573667,1.3480243120250734,1.3055074172549768,1.195057470404754,1.0215824472357249,0.7944704971196574,0.5269407619683372,0.2351267979174621,,, +39.7734375,79,-0.06304349614054625,-0.3490933482627477,-0.6052811414068016,-0.8158334701896901,-0.9680412507092644,-1.0531424567082146,-1.0669299338701668,-1.0100419144455985,0.7064445692838421,0.8258772648954669,1.0753374084543528,1.4145963447007843,1.7885866645852997,2.1359773934173676,,, +39.78125,79,2.3987288691468645,2.5311390859522707,2.506972464233877,2.323560659253708,2.0022366209117504,1.5850342121320482,1.128167332321001,0.6933040819080504,0.3379949192194771,0.10674551293858259,0.024124561498511055,0.09097987758754367,0.2843518919658694,0.5610978240283926,,, +39.7890625,79,0.864661797594916,1.133936171017277,1.3128336224643613,1.3590788182449942,1.2508500381733199,0.9902360062038272,0.602969218135634,0.13447701000689788,-0.35713485987784893,-0.8100735655313396,-1.1684253468886758,-1.3908067373070132,-0.12684450333938058,0.408118200918267,,, +39.796875,79,0.7717808979837955,0.879870180995829,0.7185095253766035,0.34780055156121825,-0.11487193881812807,-0.5272334135681149,-0.7613313342327318,-0.7388162871576582,-0.452620962168338,0.030906569490131097,0.5900018486957439,1.0806841075722948,1.3760599649279415,1.4009603131571327,,, +39.8046875,79,1.1524188519362735,0.7003809389128943,0.1684495280983354,-0.3000539841572426,-0.5814116367042275,-0.6054360929503382,-0.37470445708750855,0.03617274811769103,0.5010469365853261,0.8768736250599086,1.0430064685455693,0.9343730877144029,0.559439237069702,-0.0019632604926985986,,, +39.8125,79,-0.32638144546252934,-0.18327252892567775,-0.03455907112823933,0.11749740214897939,0.27058290491576564,0.4223713438878724,0.5705650793968478,0.7129349841642978,0.8473592986180583,0.9718606024895853,1.0846402554254548,1.1841097036642227,1.2689181047029678,1.3379757863592032,,, +39.8203125,79,1.3904731295675012,1.425894544387108,1.4440272946140391,1.444965016595276,1.4291058707464244,1.3971453582587392,1.350063928894657,1.2891095969778636,1.21577587009915,1.13177537712233,1.0390096573929326,0.939535640264103,0.8355294020061671,0.7292478348512632,,, +39.828125,79,0.6229888994649782,0.5190511569606882,0.4196932891776511,0.3270943161501155,-0.8879149799667522,-0.7104027575903658,-0.4910869442840238,-0.2463287072072589,0.005873387761735072,0.24713927682348263,0.45998954899352973,0.6290644377098729,0.7421946493872337,0.791249357670677,,, +39.8359375,79,0.7727022319270622,0.6878760316927254,0.5428487142302195,0.34802760691281054,0.11742134384765046,-0.13233965720946939,-0.3831658657484531,-0.6167733730557283,-0.8159624883444353,-0.9658210270225478,-1.054768372437013,-1.0753674951245076,-1.0248482939992498,-0.9053057537380368,,, +39.84375,79,-0.7235590881041221,-0.4906816789199637,-0.22123457631394317,0.06774300301874021,0.35791579799830836,0.6309248272994048,0.8696612073134201,1.059452652008398,-1.4567536971666102,-1.3698537932435686,-1.1571338442263261,-0.8647986751783969,-0.5509849479089222,-0.2766589407564085,,, +39.8515625,79,-0.09607622846348118,-0.0482894356778798,-0.15102697979604074,-0.3978964090734367,-0.7593481019000258,-1.1872493794731322,-1.6223567247379698,-2.003522386080004,-2.2772014849520748,-2.4057789213503704,-2.3734191732244634,-2.188527887311483,-1.8824418692440497,-1.5045515063373731,,, +39.859375,79,-1.1146153028732577,-0.7734635300179765,-0.5335388758555427,-0.43074734876832865,-0.4788885888261858,-0.6675329662226868,-0.9636759720440746,-1.3169120557132903,-1.667321874234885,-1.9548442742388545,-2.128673057957335,-2.1552147103324826,-1.4776462229181084,-1.5359284026087796,,, +39.8671875,79,-1.33902405182643,-0.9695828121501694,-0.5577374147914129,-0.2452018036044329,-0.1461930723857111,-0.3158895073048219,-0.7350716077504612,-1.3151576730344376,-1.922255966916969,-2.4136435421775517,-2.676675957360062,-2.6594657894776113,-2.3849236611585463,-1.944315208547853,,, +39.875,79,-1.4721013392301259,-1.1089586611673017,-0.9631162547308681,-1.080606219692608,-1.4325822414791536,-1.9231823923810285,-2.415781622667154,-2.770439128188281,-2.8822773930833945,-2.7102741537321986,-2.288575854214433,-1.7172312955133628,-1.1348842909618804,-0.6809084458935108,,, +39.8828125,79,0.2433152074983721,0.17026256004688956,0.10965497781466904,0.06299274319390114,0.031531310506291876,0.016259086203914253,0.017879884910230515,0.036800368636145,0.07312268924312604,0.12664246311912664,0.19685211366712607,0.28294952321335154,0.3838518429771368,0.49821421942460753,,, +39.890625,79,0.6244531092445251,0.7607737748332078,0.9052014789813718,1.0556158326755347,1.2097876947186126,1.3654179771924901,1.5201776774062759,1.6717484355092354,1.8178629077301538,1.956344248438962,2.0851440098294067,2.2023777957219406,2.3063580453201777,2.395623372996841,,, +39.8984375,79,2.4689639504936505,2.5254424872135237,2.564410441357795,2.5855191781699527,1.189079932060919,1.2515524284359218,1.2445887149485406,1.1707686738487826,1.0373465536972333,0.8557380225361051,0.640717002794643,0.4093783123017573,0.179938466885547,-0.029541714464968782,,, +39.90625,79,-0.202423607968665,-0.3246580530146469,-0.3857719755189465,-0.3796055495864,-0.30474847634157676,-0.16464494054591972,0.03264008994289569,0.2749769408682004,0.5470109227530864,0.8312270971660208,1.1091658830399105,1.3627047490218476,1.5753166289289398,1.733217320049429,,, +39.9140625,79,1.8263218650527495,1.8489432378651829,1.8001846232335268,1.683997945736953,1.508904576842148,1.2873977053032502,1.0350680541453614,0.7695139186412334,-2.023367389668699,-1.7462987003025807,-1.359445088826766,-0.9150441988302537,-0.4740515217843785,-0.09670008561078758,,, +39.921875,79,0.16682672791723996,0.2841567689916098,0.2457164921642413,0.06616759687053142,-0.21793053887494868,-0.5538682571667466,-0.8810473821689737,-1.1404702570300307,-1.2839778205562289,-1.2817975857174628,-1.1272256341776588,-0.8377131447022572,-0.4521879989962039,-0.025028429039045105,,, +39.9296875,79,0.38237285267537663,0.7111402875307568,0.9140584291295583,0.9629023053501687,0.8528135666968137,0.6030409185294947,0.2539295968905861,-0.13937114145188897,-0.5155023781365193,-0.8164531007108542,-0.996592333825223,-1.0297690500168053,-0.7742442163936115,-1.174025603206765,,, +39.9375,79,-1.5618928240072378,-1.801332078699108,-1.7955905740079074,-1.514430147493841,-1.00265553014469,-0.3680777491015237,0.24779063446848437,0.7082790691029442,0.9187798598338281,0.8524473087820698,0.5573338324636437,0.1430092258333532,-0.24966780172989694,-0.48733935226413244,,, +39.9453125,79,-0.4808666074832112,-0.20991179081712774,0.2713546681118943,0.8489870704671905,1.380400589771115,1.7333779040662827,1.8222563412457,1.631378093593824,1.2193766614516757,0.7031246924274398,0.22574237621791815,-0.08256612646379313,-0.14011532229670298,0.06397666840831828,,, +39.953125,79,2.58872588001846,2.574294104946679,2.5427889840188165,2.4950671416678687,2.432261515642301,2.3557613424607986,2.267187658930488,2.1683647487934232,2.061288034573728,1.948088976924342,1.8309975961838083,1.7123032724775686,1.5943145108376997,1.4793183759455748,,, +39.9609375,79,1.3695403068659497,1.2671050155030912,1.1739991535203986,1.0920364014974637,1.0228255916905598,0.9677424226271236,0.9279052608838126,0.9041554538197423,0.8970424980491198,0.9068143234134157,0.9334128626328484,0.9764749842676315,1.0353387727014405,1.1090550452328944,,, +39.96875,79,1.1964039046526953,1.2959160375153318,1.4058983852091418,1.5244637383604562,0.5091115389540767,0.2717315596530886,0.07349108706586638,-0.07237162768999805,-0.15642140406057448,-0.17368479409230753,-0.12399725816093721,-0.012014643145122017,0.15311183811313467,0.3583744612756744,,, +39.9765625,79,0.587817128645388,0.8236494618866839,1.047489157558374,1.241645968677883,1.3903577720441986,1.480892521425662,1.5044392381540956,1.4567259009774862,1.3383211404397433,1.15459869163655,0.9153670753881173,0.6341903218575693,0.3274470945432022,0.013193814099055207,,, +39.984375,79,-0.29008895150666064,-0.5647794243641652,-0.7953374308878925,-0.9693818354641286,-1.0785474743368773,-1.119061847242492,-1.0920013669292983,-1.0032093125801342,-0.9133740503418675,-0.6687312150789358,-0.3377572650649666,0.023589606620672415,0.35405170311283707,0.5966426464502941,,, +39.9921875,79,0.707556192033055,0.6630252663913406,0.4630627068426859,0.1315008576176605,-0.2876763647626587,-0.7371378697837626,-1.1550866791482899,-1.4848350495489593,-1.6835823214217878,-1.7290285706736457,-1.6227942320863376,-1.3901133549697575,-1.0758485567015328,-0.7374486568554874,,, diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/box-tutorials/pybox/dataset-creator.xml b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/box-tutorials/pybox/dataset-creator.xml new file mode 100644 index 0000000..0e47d69 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/box-tutorials/pybox/dataset-creator.xml @@ -0,0 +1,271 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00002553, 0x00001145) + DatasetCreator + (0x7b6738c4, 0x2c5156ed) + + + (0x544a003e, 0x6dcba5f6) + input_StreamMatrix + + + + + (0x6f752dd0, 0x082a321e) + stim_out + + + + + (0x007deef9, 0x2f3e95c6) + Clock frequency (Hz) + 64 + 64 + false + + + (0x330306dd, 0x74a95f98) + Path directory + ${Player_ScenarioDirectory}/datas/ + ${Player_ScenarioDirectory}/datas/ + false + + + (0x79a9edeb, 0x245d83fc) + Label_1 + right + right + false + + + (0x79a9edeb, 0x245d83fc) + Label_2 + left + left + false + + + (0x79a9edeb, 0x245d83fc) + Label_3 + up + up + false + + + (0x79a9edeb, 0x245d83fc) + Label_4 + down + down + false + + + (0x2cdb2f0b, 0x12f231ea) + Several CSV + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of folds + 1 + 1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of actions + 4 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xd79a853e, 0x3396ae60) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002a38, 0x00000aed) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003615, 0x000063b8) + Sinus oscillator + (0x7e33bdb8, 0x68194a4a) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + + + (0x00004d38, 0x00007bd2) + + (0x00002553, 0x00001145) + 0 + + + (0x00002a38, 0x00000aed) + 0 + + + + (0x00007380, 0x00007709) + + (0x00003615, 0x000063b8) + 0 + + + (0x00002553, 0x00001145) + 0 + + + + + + + (0x0000716e, 0x00000d37) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000227a, 0x00001a2b)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00005d03, 0x00003bf1)","index":0,"name":"Default tab","parentIdentifier":"(0x0000227a, 0x00001a2b)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000792d, 0x0000021b)","index":0,"name":"Empty","parentIdentifier":"(0x00005d03, 0x00003bf1)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/box-tutorials/pybox/process-sklearn.xml b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/box-tutorials/pybox/process-sklearn.xml new file mode 100644 index 0000000..63387a2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/box-tutorials/pybox/process-sklearn.xml @@ -0,0 +1,223 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00001a44, 0x00001322) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/datas/data-tutorial.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00002a38, 0x00000aed) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004501, 0x000079b6) + Process Sklearn + (0x681d3dfe, 0x060e2afb) + + + (0x544a003e, 0x6dcba5f6) + input_StreamMatrix + + + + + (0x6f752dd0, 0x082a321e) + stim_out + + + + + (0x007deef9, 0x2f3e95c6) + Clock frequency (Hz) + 64 + 64 + false + + + (0x330306dd, 0x74a95f98) + Model filename + ${Player_ScenarioDirectory}/model.clf + ${Player_ScenarioDirectory}/model.clf + false + + + (0x330306dd, 0x74a95f98) + Predictions filename + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0xb942ac8a, 0x83cd7760) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00002056, 0x00007dc0) + + (0x00004501, 0x000079b6) + 0 + + + (0x00002a38, 0x00000aed) + 0 + + + + (0x00002361, 0x0000065a) + + (0x00001a44, 0x00001322) + 0 + + + (0x00004501, 0x000079b6) + 0 + + + + + + + (0x00005f34, 0x0000794a) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00005a92, 0x00001b40)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000023fa, 0x00007573)","index":0,"name":"Default tab","parentIdentifier":"(0x00005a92, 0x00001b40)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00001a40, 0x00000ba9)","index":0,"name":"Empty","parentIdentifier":"(0x000023fa, 0x00007573)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/box-tutorials/pybox/trainer-sklearn.xml b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/box-tutorials/pybox/trainer-sklearn.xml new file mode 100644 index 0000000..6720851 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/box-tutorials/pybox/trainer-sklearn.xml @@ -0,0 +1,271 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00000206, 0x00006ab1) + Trainer Sklearn + (0x44b85a3a, 0xabfc390a) + + + (0x544a003e, 0x6dcba5f6) + input_StreamMatrix + + + (0x6f752dd0, 0x082a321e) + input_Stimulations + + + + + (0x6f752dd0, 0x082a321e) + stim_out + + + + + (0x007deef9, 0x2f3e95c6) + Clock frequency (Hz) + 64 + 64 + false + + + (0x330306dd, 0x74a95f98) + Filename to save model to + ${Player_ScenarioDirectory}/model.clf + ${Player_ScenarioDirectory}/model.clf + false + + + (0x330306dd, 0x74a95f98) + Filename to load model from + + + false + + + (0x73ae164d, 0xea21ab0a) + Classifier + None + AdaBoost + false + + + (0x512a166f, 0x5c3ef83f) + Test set share + 0.2 + 0.2 + false + + + (0x79a9edeb, 0x245d83fc) + Labels + + + false + + + (0x007deef9, 0x2f3e95c6) + n_estimators + 50 + 50 + false + + + (0x512a166f, 0x5c3ef83f) + learning_rate + 1.0 + 1.0 + false + + + (0x27025481, 0x09bedc31) + algorithm + SAMME.R + SAMME.R + false + + + (0x79a9edeb, 0x245d83fc) + random_state + None + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0xbe66982a, 0x597f92cf) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001a44, 0x00001322) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/datas/data-tutorial.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00002a38, 0x00000aed) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00003f8b, 0x00002044) + + (0x00001a44, 0x00001322) + 1 + + + (0x00000206, 0x00006ab1) + 1 + + + + (0x00005663, 0x000061f4) + + (0x00000206, 0x00006ab1) + 0 + + + (0x00002a38, 0x00000aed) + 0 + + + + (0x00006e58, 0x000045c5) + + (0x00001a44, 0x00001322) + 0 + + + (0x00000206, 0x00006ab1) + 0 + + + + + + + (0x00004b79, 0x00004f0d) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x000033dc, 0x0000473a)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006ab8, 0x00002aa8)","index":0,"name":"Default tab","parentIdentifier":"(0x000033dc, 0x0000473a)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00006208, 0x00003307)","index":0,"name":"Empty","parentIdentifier":"(0x00006ab8, 0x00002aa8)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/doc/Doc_BoxAlgorithm_DataViz.dox-part b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/doc/Doc_BoxAlgorithm_DataViz.dox-part new file mode 100644 index 0000000..b08e1e2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/doc/Doc_BoxAlgorithm_DataViz.dox-part @@ -0,0 +1,61 @@ +/** + * \page BoxAlgorithmDataViz DataViz +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithmDataViz_Description| + This box aims to transform the data with a LDA or a PCA and plot the data in 2D or 3D. + * |OVP_DocEnd_BoxAlgorithmDataViz_Description| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithmDataViz_Settings| + * |OVP_DocEnd_BoxAlgorithmDataViz_Settings| + + * |OVP_DocBegin_BoxAlgorithmDataViz_Setting1| + The box clock frequency. The Python process function is called at + each tick. + * |OVP_DocEnd_BoxAlgorithmDataViz_Setting1| + + * |OVP_DocBegin_BoxAlgorithmDataViz_Setting2| + If specified, path to save the model which transform the data. + * |OVP_DocEnd_BoxAlgorithmDataViz_Setting2| + + * |OVP_DocBegin_BoxAlgorithmDataViz_Setting3| + If specified, path to load the model which transform the data. + If empty, a new model will be created depending on the input's data. + * |OVP_DocEnd_BoxAlgorithmDataViz_Setting3| + + * |OVP_DocBegin_BoxAlgorithmDataViz_Setting4| + Algorithm to use to reduce the data's dimensions. Two options are available : + PCA or LDA. By default, the box will use PCA. + * |OVP_DocEnd_BoxAlgorithmDataViz_Setting4| + + * |OVP_DocBegin_BoxAlgorithmDataViz_Setting5| + Number of dimensions to plot the data. The user can only choose between 2 or 3. + * |OVP_DocEnd_BoxAlgorithmDataViz_Setting5| + + * |OVP_DocBegin_BoxAlgorithmDataViz_Setting6| + Labels of the data, if not specified then labels will be "1, 2, 3, etc". + * |OVP_DocEnd_BoxAlgorithmDataViz_Setting6| + +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithmDataViz_Examples| + See this page for commented examples. + * |OVP_DocEnd_BoxAlgorithmDataViz_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithmDataViz_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithmDataViz_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/doc/Doc_BoxAlgorithm_DatasetCreator.dox-part b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/doc/Doc_BoxAlgorithm_DatasetCreator.dox-part new file mode 100644 index 0000000..7d876fc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/doc/Doc_BoxAlgorithm_DatasetCreator.dox-part @@ -0,0 +1,84 @@ +/** + * \page BoxAlgorithmDatasetCreator DatasetCreator +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithmDatasetCreator_Description| + + This box aims to monitor the user to create a dataset. + The user first configure the box and chooses some labels, then + the box will randomly determine an order between them. It will + then record the user's brain activity while verbally indicating + the current action. In this way, we will be able to create a + labeled dataset that can be used for learning. + + * |OVP_DocEnd_BoxAlgorithmDatasetCreator_Description| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithmDatasetCreator_Settings| + * |OVP_DocEnd_BoxAlgorithmDatasetCreator_Settings| + + * |OVP_DocBegin_BoxAlgorithmDatasetCreator_Setting1| + The box clock frequency. The Python process function is called at + each tick. + * |OVP_DocEnd_BoxAlgorithmDatasetCreator_Setting1| + + * |OVP_DocBegin_BoxAlgorithmDatasetCreator_Setting2| + The path to the dir where the user want to save the data. + * |OVP_DocEnd_BoxAlgorithmDatasetCreator_Setting2| + + * |OVP_DocBegin_BoxAlgorithmDatasetCreator_Setting3| + Name of the first label. That label has to be configured with the + manager to associate a sound. + * |OVP_DocEnd_BoxAlgorithmDatasetCreator_Setting3| + + * |OVP_DocBegin_BoxAlgorithmDatasetCreator_Setting4| + Name of the second label. That label has to be configured with the + manager to associate a sound. + * |OVP_DocEnd_BoxAlgorithmDatasetCreator_Setting4| + + * |OVP_DocBegin_BoxAlgorithmDatasetCreator_Setting5| + Name of the third label. That label has to be configured with the + manager to associate a sound. + * |OVP_DocEnd_BoxAlgorithmDatasetCreator_Setting5| + + * |OVP_DocBegin_BoxAlgorithmDatasetCreator_Setting6| +Name of the fourth label. That label has to be configured with the +manager to associate a sound. + * |OVP_DocEnd_BoxAlgorithmDatasetCreator_Setting6| + + * |OVP_DocBegin_BoxAlgorithmDatasetCreator_Setting7| + True if you want one csv per label, false if you want one csv + containing all the labels. + * |OVP_DocEnd_BoxAlgorithmDatasetCreator_Setting7| + + * |OVP_DocBegin_BoxAlgorithmDatasetCreator_Setting3| + Number of folds you want to create. + * |OVP_DocEnd_BoxAlgorithmDatasetCreator_Setting3| + + * |OVP_DocBegin_BoxAlgorithmDatasetCreator_Setting3| + Number of action to record. For exemple, if you want two record for + 4 labels, then number of actions if 8. + * |OVP_DocEnd_BoxAlgorithmDatasetCreator_Setting3| + +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithmDatasetCreator_Examples| + See this page for commented examples. + * |OVP_DocEnd_BoxAlgorithmDatasetCreator_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithmDatasetCreator_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithmDatasetCreator_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/doc/Doc_BoxAlgorithm_ProcessML.dox-part b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/doc/Doc_BoxAlgorithm_ProcessML.dox-part new file mode 100644 index 0000000..443a31f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/doc/Doc_BoxAlgorithm_ProcessML.dox-part @@ -0,0 +1,49 @@ +/** + * \page BoxAlgorithmProcessML Process Sklearn +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithmProcessML_Description| + This box aims to load a machine learning model from scikit-learn + or pyriemann already trained and to use it to predict its input's data. + * |OVP_DocEnd_BoxAlgorithmProcessML_Description| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithmProcessML_Settings| + * |OVP_DocEnd_BoxAlgorithmProcessML_Settings| + + * |OVP_DocBegin_BoxAlgorithmProcessML_Setting1| + The box clock frequency. The Python process function is called at + each tick. + * |OVP_DocEnd_BoxAlgorithmProcessML_Setting1| + + * |OVP_DocBegin_BoxAlgorithmProcessML_Setting2| + The path to the model the user want to load. + * |OVP_DocEnd_BoxAlgorithmProcessML_Setting2| + + * |OVP_DocBegin_BoxAlgorithmProcessML_Setting3| + If not empty, the path where the user want to save the predictions + results. + * |OVP_DocEnd_BoxAlgorithmProcessML_Setting3| + +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithmProcessML_Examples| + See this page for commented examples. + * |OVP_DocEnd_BoxAlgorithmProcessML_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithmProcessML_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithmProcessML_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/doc/Doc_BoxAlgorithm_TrainerML.dox-part b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/doc/Doc_BoxAlgorithm_TrainerML.dox-part new file mode 100644 index 0000000..a60ece0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/doc/Doc_BoxAlgorithm_TrainerML.dox-part @@ -0,0 +1,85 @@ +/** + * \page BoxAlgorithmTrainerML Trainer Sklearn +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithmTrainerML_Description| + This box aims to create a machine learning model based on algorithm implemented in scikit-learn. + The user can modify nearly all the settings from scikit-learn. + It is possible for the user to test his model with a test set. + He can also save the model in a file which he can use with the ProcessML box. + + An AdaBoost classifier is a meta-estimator that begins by fitting + a classifier on the original dataset and then fits additional + copies of the classifier on the same dataset but where the weights + of incorrectly classified instances are adjusted such that + subsequent classifiers focus more on difficult cases. + * |OVP_DocEnd_BoxAlgorithmTrainerML_Description| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithmTrainerML_Settings| + * |OVP_DocEnd_BoxAlgorithmTrainerML_Settings| + + * |OVP_DocBegin_BoxAlgorithmTrainerML_Setting1| + The box clock frequency. The Python process function is called at + each tick. + * |OVP_DocEnd_BoxAlgorithmTrainerML_Setting1| + + * |OVP_DocBegin_BoxAlgorithmTrainerML_Setting2| + The path to the file where the user want to save the model. + If empty, the model is not saved. + * |OVP_DocEnd_BoxAlgorithmTrainerML_Setting2| + + * |OVP_DocBegin_BoxAlgorithmTrainerML_Setting3| + The path to the file where the user want to load a model. + If empty, a new model will be created. + * |OVP_DocEnd_BoxAlgorithmTrainerML_Setting3| + + * |OVP_DocBegin_BoxAlgorithmTrainerML_Setting4| + The name of the scikit-learn algorithm. The user should not try + to modify this setting. + * |OVP_DocEnd_BoxAlgorithmTrainerML_Setting4| + + * |OVP_DocBegin_BoxAlgorithmTrainerML_Setting5| + Float between 0 and 1 (1 not included) which represents the proportion + of the input dataset transformed into a test set, allowing us to + evaluate our model once the training on the set train is done. If 0 + is filled in, then all the data will constitute the train set and no + metrics will be displayed. + * |OVP_DocEnd_BoxAlgorithmTrainerML_Setting5| + + * |OVP_DocBegin_BoxAlgorithmTrainerML_Setting6| + Names of the labels of input's data. This parameter is only usefull + when the PolyMode is used (several streamed matrix in input, one for + each label). Then the labels as to be described as follows : + "my_label_1, mylabel_2, my_label_3, etc" + Otherwise the labels will be "1, 2, 3, etc". + If the input mode is ov-mode (one input streamed matrix and one + stimulation), the labels will be read by the stimulations. + * |OVP_DocEnd_BoxAlgorithmTrainerML_Setting6| + +The rest of the settings are from scikit-learn. You can find +their purpose here : +https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html + +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithmTrainerML_Examples| + See this page for commented examples. + * |OVP_DocEnd_BoxAlgorithmTrainerML_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithmTrainerML_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithmTrainerML_Miscellaneous| + */ \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/manager_utils.py b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/manager_utils.py new file mode 100644 index 0000000..9fa03fe --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/manager_utils.py @@ -0,0 +1,725 @@ +# -*- coding: utf-8 -*- + +import re +import os +import sys +import shutil +import platform +import subprocess +import time +import inspect +import ast +import copy +from pathlib import Path +from collections import namedtuple +from shutil import copyfile +from filecmp import cmp as compare_file + +from PyQt5.QtWidgets import QMessageBox + + + +system = platform.system() +if system != 'Linux' and system != 'Windows': + raise Exception("OS {} is not handled with that script.".format(system)) + +def find_folders() : + """Find openvibe and the manager folders.""" + + current_file = inspect.getfile(lambda : None) + current_file = Path(current_file) + manager_folder = str(current_file.parent) + '/' + openvibe_folder = str(current_file.parent.parent.parent.parent.parent.parent) + '/' + return manager_folder, openvibe_folder + +def find_all_stims(): + """Retrieve all stimulation from Poly_Stimulation""" + + prefixe_stim = 'OVPoly_' + stims = [k for k in Poly_stimulation.keys() if prefixe_stim in k] + stims = [k[len(prefixe_stim):] for k in stims] + return stims + +def find_all_custom_settings(manager_folder) : + """ Generate a list containing all custom settings and their values""" + + def get_custom_settings(path_header, prefixe) : + with open(path_header, 'r') as f : + text = f.read() + matchs = re.findall(r"{}[a-zA-Z0-9_]+".format(prefixe), text) + return matchs + + def get_custom_settings_confirmed(path_cpp, custom_settings) : + with open(path_cpp, 'r') as f : + text = f.read() + custom_settings_confirmed = [] + + for ct in custom_settings : + match = re.search(r"rPluginModuleContext\.getTypeManager\(\)\.registerEnumerationType\({}, \"[a-zA-Z0-9_ \.]+\"\);".format(ct), text) + if match is not None : + custom_settings_confirmed += [ct] + return custom_settings_confirmed + + def get_custom_values(path_cpp, custom_settings, prefixe) : + custom_values = {} + + with open(path_cpp, 'r') as f : + text = f.read() + + for ct in custom_settings : + matchs = re.findall(r'rPluginModuleContext\.getTypeManager\(\)\.registerEnumerationEntry\({}, "[0-9a-zA-Z_ \.]+", [0-9]+\);'.format(ct), text) + values = [] + + for match in matchs : + m_text = match.split('"')[1] + m_id = int(match.split(',')[-1][1:-2]) + values += [Value(text=m_text, id=m_id)] + + cs_name = ct[len(prefixe):] + custom_values[cs_name] = Custom_Setting(ct, values) + + return custom_values + + prefixe = 'OVPoly_ClassId_' + path_header = "{}/src/defines.hpp".format(manager_folder) + path_cpp = "{}/src/main.cpp".format(manager_folder) + + custom_settings = get_custom_settings(path_header, prefixe) + custom_settings = get_custom_settings_confirmed(path_cpp, custom_settings) + custom_values = get_custom_values(path_cpp, custom_settings, prefixe) + + return custom_values + +def find_all_boxes(manager_folder, io_dic_type, settings_dic_type): + """Generate a list containing all the existing box inside""" + + path_all_boxes = "{}/src/box-algorithms/".format(manager_folder) + list_all_files = os.listdir(path_all_boxes) + + directories = {} + for elem in list_all_files: + if elem[:3] == 'ovp' : + + with open(path_all_boxes + elem, 'r') as f: + file_h = f.read() + + # Path Script + script = re.findall( + r"m_script = \"(.*.py)\";", file_h)[0] + + # Description + desc = re.findall(r"virtual CString getShortDescription\(void\) const " + r"{ return CString\(\"(.*?)\"\); }", file_h, flags=re.DOTALL)[0] + desc = desc.replace("\"", "\\\"") + + author = re.search(r'virtual CString getAuthorName\(void\) const { return CString\(\"[a-zA-Z 0-9\-&]*\"\); }', file_h).group() + author = author[89:-5] + + category = re.search(r'virtual CString getCategory\(void\) const { return CString\(\"[/a-zA-Z ]+\"\); }', file_h).group() + category = category[89:-5] + category = category[16:] + + # Creation of the object + + # workaround to allow creation of box with spaces + boxname = elem[3:-2] + name = boxname.replace('_',' ') + + box = BoxPython(name=name, filename= boxname, desc=desc, path_script=script) + box.author = author + box.category = category + + # Settings + setts = re.findall(r"(? {}'.format(path_generator, filename_tmp)) + with open(filename_tmp, 'r') as f: + text = f.read() + text = text.split('\n') + line = text[0] + tab = line.split(',') + val1 = tab[0][-10:] + val2 = tab[1][1:11] + line = text[1] + tab = line.split(',') + val3 = tab[0][-10:] + val4 = tab[1][1:11] + if system == 'Linux' : + os.system('rm {}'.format(filename_tmp)) + elif system == 'Windows' : + os.system('del {}'.format(filename_tmp)) + return val1, val2, val3, val4 + +def create_box(openvibe_folder, manager_folder, setting_type, io_type, box_name, desc, path_script, category, author, settings, inputs, outputs, modify_settings, modify_inputs, modify_outputs): + """Create and modify the files to create/modify a new box in openvibe.""" + + global system + + # preventing the use of spaces which would cause problems for c++ filenames + box_name = box_name.replace(' ','_') + + # force category to be in scripting + category = 'Scripting/PyBox/' + category + + # 1/ We place ourselves at the root of the python boxe + old_location = os.getcwd() + os.chdir("{}/src/".format(manager_folder)) + + # 2/ We create the corresponding directory + path_dir_box = 'box-algorithms/' + full_path_dir_box = os.getcwd() + '/' + path_dir_box + + # We duplicate files from the original box + path_file_header = path_dir_box + 'ovp{}.h'.format(box_name) + path_pattern_header = '{}Assets/BoxManager/NewBoxPattern-skeletton.h'.format( + manager_folder) + copyfile(path_pattern_header, path_file_header) + + + # 3/ We insert in defines.hpp the declaration of CIdentifiers + filename = 'defines.hpp' + tag = '// Tag Box Declaration' + time.sleep(1) + new_id1, new_id2, new_id3, new_id4 = generate_new_id(openvibe_folder) + new_line = "#define OVP_ClassId_BoxAlgorithm_{} OpenViBE::CIdentifier({}, {})"\ + .format(box_name, new_id1, new_id2) + insert_line_in_file(filename, new_line, tag) + new_line = "#define OVP_ClassId_BoxAlgorithm_{}Desc OpenViBE::CIdentifier({}, {})"\ + .format(box_name, new_id3, new_id4) + insert_line_in_file(filename, new_line, tag) + + # 4/ We add our lines in main.cpp + filename = 'main.cpp' + tag = '#include "box-algorithms/CPolyBox.hpp"' + new_line = '#include "{}"'.format(path_file_header) + insert_line_in_file(filename, new_line, tag) + + tag = '// OVP_Declare_New' + new_line = '\t\tOVP_Declare_New(Python::CBoxAlgorithm{}Desc);'.format( + box_name) + insert_line_in_file(filename, new_line, tag) + + # 5/ We replace in ovpmyBox.h + replace_in_file(path_file_header, 'CBoxAlgorithmNewBoxPattern', + 'CBoxAlgorithm{}'.format(box_name)) + replace_in_file(path_file_header, 'OVP_ClassId_BoxAlgorithm_NewBoxPattern', + 'OVP_ClassId_BoxAlgorithm_{}'.format(box_name)) + replace_in_file(path_file_header, 'OVP_ClassId_BoxAlgorithm_NewBoxPatternDesc', + 'OVP_ClassId_BoxAlgorithm_{}Desc'.format(box_name)) + + + # 6/ We change the name, the description, the author name and the category + desc = desc.replace("\"", "\\\"") + + # we reset the spaces for the name of the box + box_name = box_name.replace('_',' ') + + replace_in_file(path_file_header, + 'CString getName() const override { return CString("NewBoxPattern"); }', + 'CString getName() const override { return CString("' + box_name + '"); }') + replace_in_file(path_file_header, + 'CString getShortDescription() const override { return CString("Default Python Description"); }', + 'CString getShortDescription() const override { return CString("' + desc + '"); }') + replace_in_file(path_file_header, + 'CString getAuthorName() const override { return CString("NewAuthor"); }', + 'CString getAuthorName() const override { return CString("' + author + '"); }') + replace_in_file(path_file_header, + 'CString getCategory() const override { return CString("Scripting/Pybox/"); }', + 'CString getCategory() const override { return CString("' + category + '"); }') + + # 7/ We set the python script to execute + # On set le script python a executer + replace_in_file(path_file_header, + 'm_script = "NewScript.py";', + 'm_script = "{}";'.format(path_script.replace('\\', '/'))) + + + # 8/ We can then add our params + tag = '// settings' + for number, (key, kind, value) in reversed(list(settings.items())): + if key: + new_line = ' prototype.addSetting("{}", {}, "{}");'.format( + key, all_settings_type[kind], value) + insert_line_in_file(path_file_header, new_line, tag) + + # 9/ We can then add our inputs and our outputs + tag_inoutset = '// input & output' + for number, (name, kind) in reversed(list(inputs.items())): + if name: + new_line = ' prototype.addInput("{}", {});'.format( + name, io_type[kind]) + insert_line_in_file(path_file_header, new_line, tag_inoutset) + + for number, (name, kind) in reversed(list(outputs.items())): + new_line = ' prototype.addOutput("{}", {});'.format( + name, io_type[kind]) + insert_line_in_file(path_file_header, new_line, tag_inoutset) + + + # 10/ Permissions to modify boxes in OV + if not modify_settings : + replace_in_file(path_file_header, + "prototype.addFlag(Kernel::BoxFlag_CanModifySetting);", + "//prototype.addFlag(Kernel::BoxFlag_CanModifySetting);") + if not modify_inputs : + replace_in_file(path_file_header, + "prototype.addFlag(Kernel::BoxFlag_CanModifyInput);", + "//prototype.addFlag(Kernel::BoxFlag_CanModifyInput);") + if not modify_outputs : + replace_in_file(path_file_header, + "prototype.addFlag(Kernel::BoxFlag_CanModifyOutput);", + "//prototype.addFlag(Kernel::BoxFlag_CanModifyOutput);") + + os.chdir(old_location) + + +def delete_box(manager_folder, box_name): + """Delete and modify files to delete an existing box.""" + + global system + + box_name = box_name.replace(' ', '_') + + # 1/ Change directory to src/ + old_location = os.getcwd() + os.chdir("{}src/".format(manager_folder)) + + # 2/ Remove directory with the box algorithms + path_box = 'box-algorithms/ovp{}.h'.format(box_name) + os.remove(path_box) + + # 3/ Remove lines from defines.hpp + path = 'defines.hpp' + tag = 'OVP_ClassId_BoxAlgorithm_{}Desc'.format(box_name) + remove_line_from_file(path, tag) + tag = 'OVP_ClassId_BoxAlgorithm_{}'.format(box_name) + remove_line_from_file(path, tag) + + # 4/ Remove lines from main.cpp + path = 'main.cpp' + tag = 'OVP_Declare_New(Python::CBoxAlgorithm{}Desc);'.format(box_name) + remove_line_from_file(path, tag) + tag = '#include "box-algorithms/ovp{}.h"'.format(box_name) + remove_line_from_file(path, tag) + + os.chdir(old_location) + + +# ------------------------------------------------------------ + + +def create_custom_setting(manager_folder, openvibe_folder, cs) : + """ Make all modification to openvibe to create a custom setting.""" + + prefixe = 'OVPoly_ClassId_' + path_cpp = '{}/src/main.cpp'.format(manager_folder) + path_header = '{}/src/defines.hpp'.format(manager_folder) + + tag = '// Custom Type Settings' + cs_define = "{}{}".format(prefixe, cs.name) + + # header + id_1, id_2, _, _ = generate_new_id(openvibe_folder) + line_header = '#define {} OpenViBE::CIdentifier({}, {})'.format(cs_define, id_1, id_2) + insert_line_in_file(path_header, line_header, tag) + + # cpp + for value in reversed(cs.values) : + line_entry = '\trKernelContext.getTypeManager().registerEnumerationEntry({}, "{}", {});'.format(cs_define, value.text, value.id) + insert_line_in_file(path_cpp, line_entry, tag) + + line_type = '\trKernelContext.getTypeManager().registerEnumerationType({}, "{}");'.format(cs_define, cs.name) + insert_line_in_file(path_cpp, line_type, tag) + +def delete_custom_setting(manager_folder, cs) : + """Make all the modification to openvibe to delete a custom setting.""" + + def remove_lines_with_tag_in_file(file, tag) : + with open(file, 'r') as f : + text = f.read() + new_text = [] + for line in text.split('\n') : + if not (tag in line) : + new_text += [line] + new_text = '\n'.join(new_text) + with open(file, 'w') as f : + f.write(new_text) + + prefixe = 'OVPoly_ClassId_' + path_cpp = '{}/src/main.cpp'.format(manager_folder) + path_header = '{}/src/defines.hpp'.format(manager_folder) + + tag = '{}{}'.format(prefixe, cs.name) + remove_lines_with_tag_in_file(path_header, tag) + remove_lines_with_tag_in_file(path_cpp, tag) + +def compile(manager_folder, openvibe_folder): + """Compile OpenVibe.""" + + # Go to openvibe folder directory + old_location = os.getcwd() + os.chdir(openvibe_folder) + + path_log = manager_folder + 'compilation.log' + + if system == 'Linux': + os.system('./build.sh | tee {}'.format(path_log)) + elif system == 'Windows': + os.system('build.cmd > {}'.format(path_log)) + + # Set back to normal + os.chdir(old_location) + + + +def add_stimulation(manager_folder, label, file_sound) : + """Make all the modifications to add a stimulation to openvibe.""" + + def find_next_id(path_file_stim) : + # We open the PolyStimulations.py to find the next id + with open(path_file_stim, 'r') as f : + text = f.read() + # On charge de dictionnaire de stimulation + dico_string = '' + flag = False + for c in text : + if c == '{' : + flag = True + elif c == '}' : + dico_string += c + break + + if flag : + dico_string += c + dico = ast.literal_eval(dico_string) + + ids = [int(value) for key, value in Poly_stimulation.items() if 'OVPoly' in key] + ids.sort() + try : + current_id = ids[0] + except IndexError : + return 0x10001 + while True : + if not current_id in ids : + return hex(current_id) + current_id += 1 + + def get_line_to_add(label, path_file_stim) : + key = '\'OVPoly_' + label[0].upper() + label[1:].lower() + '\''+ ' '*(29-len(label)) + value = find_next_id(path_file_stim) + line = '{}: {},'.format(key, value) + return line + + + path_file_stim = '{}/share/PolyStimulations.py'.format(manager_folder) + tag = '# New Stims' + + line = get_line_to_add(label, path_file_stim) + insert_line_in_file(path_file_stim, line, tag) + + copyfile(file_sound, '{}/Assets/Sounds/{}.mp3'.format(manager_folder, label)) + + +def get_name_duplicate(dict, name) : + """Find the name for a duplicated box.""" + + def regex_handling(regex, name): + res = re.search(regex, name) + + try: + prefix_1 = res.group(1) + idx_1 = res.group(2) # useless ? + max_idx = 1 + + # Does we already have a duplicate ? + # we do so we find the max index and increment it + for bn in dict.keys() : + + regex = '(' + prefix_1 + ')(\d+)' + res_2 = re.search(regex,bn) + try: + idx = int(res_2.group(2)) + + if idx >= max_idx: + max_idx = idx + 1 + + except: + pass + + current_name = prefix_1 + str(max_idx) + + except AttributeError: + # current_name = 'rr' + + for bn in dict.keys() : + if bn == name : + current_name = '{}_{}'.format(name, 1) + finally: + return current_name + + + current_name = name + + regex = '(.+?_)(\d+)' + res = re.search(regex, current_name) # useless ? + + + # We already have doublon + for bn in dict.keys(): + + # if we have the "original" name + if current_name in bn: + current_name = regex_handling(regex, bn) + break + else: + current_name = regex_handling(regex, current_name) + + + return current_name + + +def delete_stimulation(manager_folder, label) : + """Make the modification to remove a stimulation from openvibe.""" + + path_file_stim = '{}/share/PolyStimulations.py'.format(manager_folder) + remove_line_from_file(path_file_stim, label) + path_sound = '{}/Assets/Sounds/{}.mp3'.format(manager_folder, label.lower()) + os.remove(path_sound) + + +def retrieve_settings_type(custom_settings, all_settings=False) : + """If 'mode=developer' in args : load all default and custom settings, + else load only default settings""" + + settings = { + 'Integer': 'OV_TypeId_Integer', + 'Float': 'OV_TypeId_Float', + 'String': 'OV_TypeId_String', + 'Boolean': 'OV_TypeId_Boolean', + 'Filename': 'OV_TypeId_Filename', + 'Stimulation': 'OV_TypeId_Stimulation', + } + + flag = False + for arg in sys.argv[1:] : + if 'mode=developer' in arg : + flag = True + + if flag or all_settings : + for k,v in custom_settings.items() : + settings[k] = v.name + + return settings + +Setting = namedtuple('Setting', ['name', 'type', 'value', 'button_delete']) +Input = namedtuple('Input', ['name', 'type', 'button_delete']) +Output = namedtuple('Output', ['name', 'type', 'button_delete']) + +Custom_Setting_Line = namedtuple('CSV', ['name', 'value', 'button_delete']) +Custom_Setting = namedtuple("Custom_Setting", ['name', 'values']) +Value = namedtuple("Value", ["text", "id"]) + + +class BoxPython: + """This class aim to contain all the data needed to create a box in openvibe.""" + + def __init__(self, name='Default Box', filename='Default filename', desc='Default Python Description', path_script='/home/', old_name=None,): + self.name = name + self.filename = filename + self.description = desc + self.py_script = path_script + self.category = '' + self.author = '' + self.settings = {} + self.inputs = {} + self.outputs = {} + self.modify_settings = True + self.modify_inputs = True + self.modify_outputs = True + self.to_be_updated = False + + if old_name is None : + self.old_name = name + else : + self.old_name = old_name + + + + def __eq__(self, obj): + equals = False + if isinstance(obj, BoxPython): + equals = self.name == obj.name and \ + self.description == obj.description and \ + self.py_script == obj.py_script and \ + cmp(self.settings, obj.settings) == 0 and \ + cmp(self.inputs, obj.inputs) == 0 and \ + cmp(self.outputs, obj.outputs) == 0 + return equals + + def __ne__(self, obj): + return not self == obj + + +# Load all the data necessary to make the manager work. + +manager_folder, openvibe_folder = find_folders() + +io_type = { + 'Signal': 'OV_TypeId_Signal', + 'Stimulations': 'OV_TypeId_Stimulations', + 'Streamed Matrix': 'OV_TypeId_StreamedMatrix' + } + + +modes = ['ov-mode', 'poly-mode'] + +category = ['Acquisition and network IO', + 'Advanced Visualization', + 'Classification', + 'Data generation', + 'Evaluation', + 'Examples', + 'Feature extraction', + 'File reading and writing', + 'Signal processing', + 'Stimulation', + 'Streaming', + 'Tests', + 'Tools', + 'Visualization' + ] + + +sys.path.append('{}/share/'.format(manager_folder)) +from PolyStimulations import Poly_stimulation + +custom_settings = find_all_custom_settings(manager_folder) +all_settings_type = retrieve_settings_type(custom_settings, all_settings=True) +settings_type = retrieve_settings_type(custom_settings) + +boxes = find_all_boxes(manager_folder, io_type, all_settings_type) +stims = find_all_stims() \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/pybox_manager.py b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/pybox_manager.py new file mode 100644 index 0000000..6930449 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/pybox_manager.py @@ -0,0 +1,1480 @@ +# -*- coding: utf-8 -*- + +import platform +import shutil +import re +import sys +import copy +import os +import manager_utils as mu +from PyQt5 import QtCore, QtGui, QtWidgets +from PyQt5.QtWidgets import * + +system = platform.system() +if system != 'Linux' and system != 'Windows': + raise Exception("OS {} is not handled with that script.".format(system)) + +class Ui_MainWindow(object): + """ This class aim to define the manager's ui, + It calls function from the file manager_utils.py to + create box, stimulations or settings in openvibe.""" + + def __init__(self) : + self.current_box = None + self.current_custom_setting = None + self.is_loaded = False + self.current_settings = [] + self.current_inputs = [] + self.current_outputs = [] + self.current_custom_settings_lines = [] + + self._translate = QtCore.QCoreApplication.translate + + def setupUi(self, MainWindow): + MainWindow.setObjectName("Pybox-Manager") + MainWindow.resize(1000, 800) + + # Main widget + self.centralwidget = QtWidgets.QWidget(MainWindow) + self.centralwidget.setObjectName("centralwidget") + + + # Main tabs + self.main_tabs = QtWidgets.QTabWidget(self.centralwidget) + self.main_tabs.setGeometry(QtCore.QRect(-1, -1, 1000, 800)) + self.main_tabs.setAutoFillBackground(False) + self.main_tabs.setObjectName("main_tabs") + + + # Tab Box Manager + self.tab_boxmanager = QtWidgets.QWidget() + self.tab_boxmanager.setObjectName("tab_boxmanager") + + + ## Box Select + self.label_boxname = QtWidgets.QLabel(self.tab_boxmanager) + self.label_boxname.setGeometry(QtCore.QRect(40, 10, 91, 30)) + self.label_boxname.setObjectName("label_boxname") + + self.dropdown_boxname = QtWidgets.QComboBox(self.tab_boxmanager) + self.dropdown_boxname.setGeometry(QtCore.QRect(140, 10, 201, 30)) + self.dropdown_boxname.setEditable(True) + self.dropdown_boxname.setObjectName("dropdown_boxname") + + regex=QtCore.QRegExp("[a-z-A-Z0-9_- ]+") + validator = QtGui.QRegExpValidator(regex) + self.dropdown_boxname.setValidator(validator) + + self.button_new = QtWidgets.QPushButton(self.tab_boxmanager) + self.button_new.setGeometry(QtCore.QRect(390, 10, 70, 30)) + self.button_new.setObjectName("button_new") + + self.button_duplicate = QtWidgets.QPushButton(self.tab_boxmanager) + self.button_duplicate.setGeometry(QtCore.QRect(470, 10, 120, 30)) + self.button_duplicate.setObjectName("button_duplicate") + + self.label_script = QtWidgets.QLabel(self.tab_boxmanager) + self.label_script.setGeometry(QtCore.QRect(70, 50, 67, 30)) + self.label_script.setObjectName("label_script") + + self.text_script = QtWidgets.QLineEdit(self.tab_boxmanager) + self.text_script.setGeometry(QtCore.QRect(140, 50, 321, 30)) + self.text_script.setObjectName("text_script") + + self.button_script = QtWidgets.QPushButton(self.tab_boxmanager) + self.button_script.setGeometry(QtCore.QRect(470, 50, 120, 30)) + self.button_script.setObjectName("button_script") + + self.label_description = QtWidgets.QLabel(self.tab_boxmanager) + self.label_description.setGeometry(QtCore.QRect(30, 90, 91, 30)) + self.label_description.setObjectName("label_description") + + self.text_description = QtWidgets.QTextEdit(self.tab_boxmanager) + self.text_description.setGeometry(QtCore.QRect(140, 100, 321, 75)) + self.text_description.setObjectName("text_description") + + self.button_reset = QtWidgets.QPushButton(self.tab_boxmanager) + self.button_reset.setGeometry(QtCore.QRect(470, 100, 120, 30)) + self.button_reset.setObjectName("button_reset") + + self.label_category = QtWidgets.QLabel(self.tab_boxmanager) + self.label_category.setGeometry(QtCore.QRect(30, 200, 120, 30)) + self.label_category.setObjectName("label_category") + + self.dropdown_category = QtWidgets.QComboBox(self.tab_boxmanager) + self.dropdown_category.setGeometry(QtCore.QRect(140, 200, 320, 30)) + self.dropdown_category.setObjectName("dropdown_category") + + self.label_author = QtWidgets.QLabel(self.tab_boxmanager) + self.label_author.setGeometry(QtCore.QRect(30, 250, 120, 30)) + self.label_author.setObjectName("label_author") + + self.text_author = QtWidgets.QLineEdit(self.tab_boxmanager) + self.text_author.setGeometry(QtCore.QRect(140, 250, 320, 30)) + self.text_author.setObjectName("text_author") + + + + ## CheckBox + self.label_settings_modifs = QtWidgets.QLabel(self.tab_boxmanager) + self.label_settings_modifs.setGeometry(675, 10, 210, 30) + self.label_settings_modifs.setObjectName("label_settings_modifs") + + self.checkbox_settings_modifs = QtWidgets.QCheckBox(self.tab_boxmanager) + self.checkbox_settings_modifs.setGeometry(QtCore.QRect(910, 17, 20, 20)) + self.checkbox_settings_modifs.setObjectName("checkbox_settings_modifs") + + self.label_inputs_modifs = QtWidgets.QLabel(self.tab_boxmanager) + self.label_inputs_modifs.setGeometry(675, 40, 210, 30) + self.label_inputs_modifs.setObjectName("label_inputs_modifs") + + self.checkbox_inputs_modifs = QtWidgets.QCheckBox(self.tab_boxmanager) + self.checkbox_inputs_modifs.setGeometry(QtCore.QRect(910, 47, 20, 20)) + self.checkbox_inputs_modifs.setObjectName("checkbox_inputs_modifs") + + self.label_outputs_modifs = QtWidgets.QLabel(self.tab_boxmanager) + self.label_outputs_modifs.setGeometry(675, 70, 210, 30) + self.label_outputs_modifs.setObjectName("label_outputs_modifs") + + self.checkbox_outputs_modifs = QtWidgets.QCheckBox(self.tab_boxmanager) + self.checkbox_outputs_modifs.setGeometry(QtCore.QRect(910, 77, 20, 20)) + self.checkbox_outputs_modifs.setObjectName("checkbox_outputs_modifs") + + self.img_info_checkbox_modifications = QtWidgets.QLabel(self.tab_boxmanager) + self.img_info_checkbox_modifications.setPixmap(QtGui.QPixmap('Assets/BoxManager/infobulle.png')) + self.img_info_checkbox_modifications.setScaledContents(True) + self.img_info_checkbox_modifications.setGeometry(QtCore.QRect(950, 42, 30, 30)) + self.img_info_checkbox_modifications.setObjectName("img_info_checkbox_modifications") + + + ## Set Mode + self.label_mode = QtWidgets.QLabel(self.tab_boxmanager) + self.label_mode.setGeometry(QtCore.QRect(660, 135, 67, 30)) + self.label_mode.setObjectName("label_mode") + + self.img_info_custom_setting_id = QtWidgets.QLabel(self.tab_boxmanager) + self.img_info_custom_setting_id.setPixmap(QtGui.QPixmap('Assets/BoxManager/infobulle.png')) + self.img_info_custom_setting_id.setScaledContents(True) + self.img_info_custom_setting_id.setGeometry(QtCore.QRect(950, 135, 30, 30)) + self.img_info_custom_setting_id.setObjectName("image_info_custom_setting_id") + + self.dropdown_mode = QtWidgets.QComboBox(self.tab_boxmanager) + self.dropdown_mode.setGeometry(QtCore.QRect(730, 135, 200, 30)) + self.dropdown_mode.setEditable(True) + self.dropdown_mode.setObjectName("dropdown_mode") + + self.button_mode = QtWidgets.QPushButton(self.tab_boxmanager) + self.button_mode.setGeometry(QtCore.QRect(730, 175, 200, 30)) + self.button_mode.setObjectName("button_mode") + + + ## Config Tabs + self.config_tabs = QtWidgets.QTabWidget(self.tab_boxmanager) + self.config_tabs.setGeometry(QtCore.QRect(30, 320, 941, 361)) + self.config_tabs.setObjectName("config_tabs") + + ### Tab Setting + self.tab_settings = QtWidgets.QWidget() + self.tab_settings.setObjectName("tab_settings") + + self.label_setting_name = QtWidgets.QLabel(self.tab_settings) + self.label_setting_name.setGeometry(QtCore.QRect(45, 10, 67, 31)) + self.label_setting_name.setObjectName("label_setting_name") + + self.label_setting_type = QtWidgets.QLabel(self.tab_settings) + self.label_setting_type.setGeometry(QtCore.QRect(400, 10, 67, 31)) + self.label_setting_type.setObjectName("label_setting_type") + + self.img_info_setting_type = QtWidgets.QLabel(self.tab_settings) + self.img_info_setting_type.setPixmap(QtGui.QPixmap('Assets/BoxManager/infobulle.png')) + self.img_info_setting_type.setScaledContents(True) + self.img_info_setting_type.setGeometry(QtCore.QRect(440, 10, 30, 30)) + self.img_info_setting_type.setObjectName("image_info_setting_type") + + self.label_setting_value = QtWidgets.QLabel(self.tab_settings) + self.label_setting_value.setGeometry(QtCore.QRect(650, 10, 67, 31)) + self.label_setting_value.setObjectName("label_setting_value") + + self.button_add_setting = QtWidgets.QPushButton(self.tab_settings) + self.button_add_setting.setGeometry(QtCore.QRect(820, 10, 99, 31)) + self.button_add_setting.setObjectName("button_add_setting") + + + self.scroll_settings = QtWidgets.QScrollArea(self.tab_settings) + self.scroll_settings.setGeometry(QtCore.QRect(20, 50, 901, 251)) + self.scroll_settings.setWidgetResizable(True) + self.scroll_settings.setObjectName("scroll_settings") + + self.scroll_settings_widget = QtWidgets.QWidget() + self.scroll_settings_widget.setGeometry(QtCore.QRect(0, 0, 899, 249)) + self.scroll_settings_widget.setObjectName("scroll_settings_widget") + + self.layout_settings = QtWidgets.QGridLayout(self.scroll_settings_widget) + self.layout_settings.setObjectName('layout_settings') + + self.scroll_settings.setWidget(self.scroll_settings_widget) + self.config_tabs.addTab(self.tab_settings, "") + + + ### Tab Inputs + self.tab_inputs = QtWidgets.QWidget() + self.tab_inputs.setObjectName("tab_inputs") + + self.label_inputs_name = QtWidgets.QLabel(self.tab_inputs) + self.label_inputs_name.setGeometry(QtCore.QRect(45, 10, 67, 31)) + self.label_inputs_name.setObjectName("label_inputs_name") + + self.label_inputs_type = QtWidgets.QLabel(self.tab_inputs) + self.label_inputs_type.setGeometry(QtCore.QRect(685, 10, 67, 31)) + self.label_inputs_type.setObjectName("label_inputs_type") + + self.button_add_input = QtWidgets.QPushButton(self.tab_inputs) + self.button_add_input.setGeometry(QtCore.QRect(820, 10, 99, 31)) + self.button_add_input.setObjectName("button_add_input") + + self.scroll_inputs = QtWidgets.QScrollArea(self.tab_inputs) + self.scroll_inputs.setGeometry(QtCore.QRect(20, 50, 901, 251)) + self.scroll_inputs.setWidgetResizable(True) + self.scroll_inputs.setObjectName("scroll_inputs") + + self.scroll_inputs_widget = QtWidgets.QWidget() + self.scroll_inputs_widget.setGeometry(QtCore.QRect(0, 0, 899, 249)) + self.scroll_inputs_widget.setObjectName("scroll_inputs_widget") + + self.layout_inputs = QtWidgets.QGridLayout(self.scroll_inputs_widget) + self.layout_inputs.setObjectName('layout_inputs') + + self.scroll_inputs.setWidget(self.scroll_inputs_widget) + self.config_tabs.addTab(self.tab_inputs, "") + + + ### Tab Outputs + self.tab_outputs = QtWidgets.QWidget() + self.tab_outputs.setObjectName("tab_outputs") + + self.label_outputs_name = QtWidgets.QLabel(self.tab_outputs) + self.label_outputs_name.setGeometry(QtCore.QRect(45, 10, 67, 31)) + self.label_outputs_name.setObjectName("label_outputs_name") + + self.label_outputs_type = QtWidgets.QLabel(self.tab_outputs) + self.label_outputs_type.setGeometry(QtCore.QRect(685, 10, 67, 31)) + self.label_outputs_type.setObjectName("label_outputs_type") + + self.button_add_output = QtWidgets.QPushButton(self.tab_outputs) + self.button_add_output.setGeometry(QtCore.QRect(820, 10, 99, 31)) + self.button_add_output.setObjectName("button_add_output") + + self.scroll_outputs = QtWidgets.QScrollArea(self.tab_outputs) + self.scroll_outputs.setGeometry(QtCore.QRect(20, 50, 901, 251)) + self.scroll_outputs.setWidgetResizable(True) + self.scroll_outputs.setObjectName("scroll_outputs") + + self.scroll_outputs_widget = QtWidgets.QWidget() + self.scroll_outputs_widget.setGeometry(QtCore.QRect(0, 0, 899, 249)) + self.scroll_outputs_widget.setObjectName("scroll_outputs_widget") + + self.layout_outputs = QtWidgets.QGridLayout(self.scroll_outputs_widget) + self.layout_outputs.setObjectName('layout_outputs') + + self.scroll_outputs.setWidget(self.scroll_outputs_widget) + self.config_tabs.addTab(self.tab_outputs, "") + + + ## Button Create/Modify and Delete + self.button_box_create = QtWidgets.QPushButton(self.tab_boxmanager) + self.button_box_create.setGeometry(QtCore.QRect(70, 700, 351, 41)) + self.button_box_create.setObjectName("button_box_create") + + self.button_box_delete = QtWidgets.QPushButton(self.tab_boxmanager) + self.button_box_delete.setGeometry(QtCore.QRect(550, 700, 351, 41)) + self.button_box_delete.setObjectName("button_box_delete") + + ## Line sep + self.line_sep_boxmanager = QtWidgets.QFrame(self.tab_boxmanager) + self.line_sep_boxmanager.setGeometry(QtCore.QRect(610, 0, 20, 350)) + self.line_sep_boxmanager.setFrameShape(QtWidgets.QFrame.VLine) + self.line_sep_boxmanager.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_sep_boxmanager.setObjectName("line_sep_boxmanager") + + self.line_sep2_boxmanager = QtWidgets.QFrame(self.tab_boxmanager) + self.line_sep2_boxmanager.setGeometry(QtCore.QRect(620, 100, 511, 20)) + self.line_sep2_boxmanager.setFrameShape(QtWidgets.QFrame.HLine) + self.line_sep2_boxmanager.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_sep2_boxmanager.setObjectName("line_sep2_boxmanager") + + + self.main_tabs.addTab(self.tab_boxmanager, "") + + + # Tab Stimulations/label manager + self.tab_labels_manager = QtWidgets.QWidget() + self.tab_labels_manager.setObjectName("tab_labels_manager") + + ## Add stim side + self.label_add_stim = QtWidgets.QLabel(self.tab_labels_manager) + self.label_add_stim.setGeometry(QtCore.QRect(150, 30, 221, 31)) + font = QtGui.QFont() + font.setPointSize(15) + self.label_add_stim.setFont(font) + self.label_add_stim.setObjectName("label_add_stim") + + self.label_name_stim_add = QtWidgets.QLabel(self.tab_labels_manager) + self.label_name_stim_add.setGeometry(QtCore.QRect(30, 110, 67, 31)) + self.label_name_stim_add.setObjectName("label_name_stim_add") + + self.text_name_stim_add = QtWidgets.QLineEdit(self.tab_labels_manager) + self.text_name_stim_add.setGeometry(QtCore.QRect(100, 110, 361, 31)) + self.text_name_stim_add.setObjectName("text_name_stim_add") + + self.label_sound_stim_add = QtWidgets.QLabel(self.tab_labels_manager) + self.label_sound_stim_add.setGeometry(QtCore.QRect(30, 160, 67, 31)) + self.label_sound_stim_add.setObjectName("label_sound_stim_add") + + self.text_sound_stim_add = QtWidgets.QLineEdit(self.tab_labels_manager) + self.text_sound_stim_add.setGeometry(QtCore.QRect(100, 160, 361, 31)) + self.text_sound_stim_add.setObjectName("text_sound_stim_add") + + self.button_sound_stim_add = QtWidgets.QPushButton(self.tab_labels_manager) + self.button_sound_stim_add.setGeometry(QtCore.QRect(100, 200, 99, 31)) + self.button_sound_stim_add.setObjectName("button_sound_stim_add") + + self.label_delete_stim = QtWidgets.QLabel(self.tab_labels_manager) + self.label_delete_stim.setGeometry(QtCore.QRect(630, 30, 261, 31)) + font = QtGui.QFont() + font.setPointSize(15) + self.label_delete_stim.setFont(font) + self.label_delete_stim.setObjectName("label_delete_stim") + + # Delete stim side + self.button_stim_create = QtWidgets.QPushButton(self.tab_labels_manager) + self.button_stim_create.setGeometry(QtCore.QRect(120, 650, 241, 51)) + self.button_stim_create.setObjectName("button_stim_create") + + self.button_stim_delete = QtWidgets.QPushButton(self.tab_labels_manager) + self.button_stim_delete.setGeometry(QtCore.QRect(640, 650, 241, 51)) + self.button_stim_delete.setObjectName("button_stim_delete") + + self.dropdown_stim_del = QtWidgets.QComboBox(self.tab_labels_manager) + self.dropdown_stim_del.setGeometry(QtCore.QRect(620, 110, 281, 31)) + self.dropdown_stim_del.setEditable(True) + self.dropdown_stim_del.setObjectName("dropdown_stim_del") + + self.label_name_stim_del = QtWidgets.QLabel(self.tab_labels_manager) + self.label_name_stim_del.setGeometry(QtCore.QRect(550, 110, 91, 30)) + self.label_name_stim_del.setObjectName("label_name_stim_del") + + # sep + self.line_sep_stim = QtWidgets.QFrame(self.tab_labels_manager) + self.line_sep_stim.setGeometry(QtCore.QRect(490, 0, 20, 800)) + self.line_sep_stim.setFrameShape(QtWidgets.QFrame.VLine) + self.line_sep_stim.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_sep_stim.setObjectName("line_sep_stim") + + self.main_tabs.addTab(self.tab_labels_manager, "") + + + + # Tab Custom Setting Manager + self.tab_custom_settings = QtWidgets.QWidget() + self.tab_custom_settings.setObjectName("tab_custom_settings") + + self.label_custom_setting_create_delete = QtWidgets.QLabel(self.tab_custom_settings) + self.label_custom_setting_create_delete.setGeometry(QtCore.QRect(75, 0, 400, 100)) + font = QtGui.QFont() + font.setPointSize(15) + self.label_custom_setting_create_delete.setFont(font) + self.label_custom_setting_create_delete.setObjectName("label_custom_setting_create_delete") + + self.label_custom_setting_manage_value = QtWidgets.QLabel(self.tab_custom_settings) + self.label_custom_setting_manage_value.setGeometry(QtCore.QRect(680, 0, 400, 100)) + font = QtGui.QFont() + font.setPointSize(15) + self.label_custom_setting_manage_value.setFont(font) + self.label_custom_setting_manage_value.setObjectName("label_custom_setting_manage_value") + + self.label_custom_setting_name = QtWidgets.QLabel(self.tab_custom_settings) + self.label_custom_setting_name.setGeometry(QtCore.QRect(50, 120, 100, 30)) + self.label_custom_setting_name.setObjectName("label_custom_setting_name") + + self.dropdown_custom_setting_name = QtWidgets.QComboBox(self.tab_custom_settings) + self.dropdown_custom_setting_name.setGeometry(QtCore.QRect(165, 120, 300, 30)) + self.dropdown_custom_setting_name.setEditable(True) + self.dropdown_custom_setting_name.setObjectName("dropdown_custom_setting_name") + + self.button_custom_setting_new = QtWidgets.QPushButton(self.tab_custom_settings) + self.button_custom_setting_new.setGeometry(QtCore.QRect(165, 170, 130, 30)) + self.button_custom_setting_new.setObjectName("button_custom_setting_new") + + self.button_custom_setting_reset = QtWidgets.QPushButton(self.tab_custom_settings) + self.button_custom_setting_reset.setGeometry(QtCore.QRect(165, 220, 130, 30)) + self.button_custom_setting_reset.setObjectName("button_custom_setting_reset") + + self.button_custom_setting_duplicate = QtWidgets.QPushButton(self.tab_custom_settings) + self.button_custom_setting_duplicate.setGeometry(QtCore.QRect(335, 170, 130, 30)) + self.button_custom_setting_duplicate.setObjectName("button_custom_setting_duplicate") + + self.button_custom_setting_create = QtWidgets.QPushButton(self.tab_custom_settings) + self.button_custom_setting_create.setGeometry(QtCore.QRect(45, 620, 200, 80)) + self.button_custom_setting_create.setObjectName("button_custom_setting_create") + + self.button_custom_setting_delete = QtWidgets.QPushButton(self.tab_custom_settings) + self.button_custom_setting_delete.setGeometry(QtCore.QRect(280, 620, 200, 80)) + self.button_custom_setting_delete.setObjectName("button_custom_setting_delete") + + self.label_custom_setting_scroll_name = QtWidgets.QLabel(self.tab_custom_settings) + self.label_custom_setting_scroll_name.setGeometry(QtCore.QRect(610, 90, 100, 30)) + self.label_custom_setting_scroll_name.setObjectName("label_custom_setting_scroll_name") + + + self.label_custom_setting_scroll_id = QtWidgets.QLabel(self.tab_custom_settings) + self.label_custom_setting_scroll_id.setGeometry(QtCore.QRect(750, 90, 100, 30)) + self.label_custom_setting_scroll_id.setObjectName("label_custom_setting_scroll_id") + + self.img_info_custom_setting_id = QtWidgets.QLabel(self.tab_custom_settings) + self.img_info_custom_setting_id.setPixmap(QtGui.QPixmap('Assets/BoxManager/infobulle.png')) + self.img_info_custom_setting_id.setScaledContents(True) + self.img_info_custom_setting_id.setGeometry(QtCore.QRect(770, 90, 30, 30)) + self.img_info_custom_setting_id.setObjectName("img_info_custom_setting_id") + + self.button_custom_setting_scroll_add = QtWidgets.QPushButton(self.tab_custom_settings) + self.button_custom_setting_scroll_add.setGeometry(QtCore.QRect(850, 90, 100, 30)) + self.button_custom_setting_scroll_add.setObjectName("button_custom_setting_scroll_add") + + self.scroll_custom_setting = QtWidgets.QScrollArea(self.tab_custom_settings) + self.scroll_custom_setting.setGeometry(QtCore.QRect(560, 130, 400, 570)) + self.scroll_custom_setting.setWidgetResizable(True) + self.scroll_custom_setting.setObjectName("scroll_custom_setting") + + self.scroll_custom_setting_widget = QtWidgets.QWidget() + self.scroll_custom_setting_widget.setGeometry(QtCore.QRect(0, 0, 400, 450)) + self.scroll_custom_setting_widget.setObjectName("scroll_custom_setting_widget") + + self.layout_custom_setting = QtWidgets.QGridLayout(self.scroll_custom_setting_widget) + self.layout_custom_setting.setObjectName('layout_custom_setting') + + ## Line sep + self.line_sep_custom_setting = QtWidgets.QFrame(self.tab_custom_settings) + self.line_sep_custom_setting.setGeometry(QtCore.QRect(510, 0, 20, 800)) + self.line_sep_custom_setting.setFrameShape(QtWidgets.QFrame.VLine) + self.line_sep_custom_setting.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line_sep_custom_setting.setObjectName("line_sep_custom_setting") + + self.scroll_custom_setting.setWidget(self.scroll_custom_setting_widget) + + self.main_tabs.addTab(self.tab_custom_settings, "") + + + + MainWindow.setCentralWidget(self.centralwidget) + self.retranslateUi(MainWindow) + + self.main_tabs.setCurrentIndex(0) + self.config_tabs.setCurrentIndex(0) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + + boxname = self.dropdown_boxname.currentText() + if len(boxname) == 0 : + self.new_box() + else : + self.load_box(reset=False) + + cs_name = self.dropdown_custom_setting_name.currentText() + if len(cs_name) == 0 : + self.new_custom_setting() + else : + self.load_custom_setting() + + def retranslateUi(self, MainWindow): + """Defines values and bind ui's button to function""" + + MainWindow.setWindowTitle(self._translate("Pybox-Manager", "Pybox-Manager")) + + # labels + self.label_boxname.setText(self._translate("Pybox-Manager", "Box Name :")) + self.label_script.setText(self._translate("Pybox-Manager", "Script :")) + self.label_description.setText(self._translate("Pybox-Manager", "Description :")) + self.label_mode.setText(self._translate("Pybox-Manager", "Mode :")) + self.label_setting_name.setText(self._translate("Pybox-Manager", "Name")) + self.label_setting_type.setText(self._translate("Pybox-Manager", "Type")) + self.label_setting_value.setText(self._translate("Pybox-Manager", "Value")) + self.label_inputs_name.setText(self._translate("Pybox-Manager", "Name")) + self.label_inputs_type.setText(self._translate("Pybox-Manager", "Type")) + self.label_outputs_name.setText(self._translate("Pybox-Manager", "Name")) + self.label_outputs_type.setText(self._translate("Pybox-Manager", "Type")) + self.label_settings_modifs.setText(self._translate("Pybox-Manager", "Enable settings modifications : ")) + self.label_inputs_modifs.setText(self._translate("Pybox-Manager", "Enable inputs modifications : ")) + self.label_outputs_modifs.setText(self._translate("Pybox-Manager", "Enable outputs modifications : ")) + self.label_category.setText(self._translate("PyBox-Manager", "Category : ")) + self.label_author.setText(self._translate("PyBox-Manager", "Author : ")) + + self.label_add_stim.setText(self._translate("Pybox-Manager", "Add Stimulation/Label")) + self.label_delete_stim.setText(self._translate("Pybox-Manager", "Delete Stimulation/Label")) + self.label_name_stim_add.setText(self._translate("Pybox-Manager", "Name :")) + self.label_sound_stim_add.setText(self._translate("Pybox-Manager", "Sound :")) + self.label_name_stim_del.setText(self._translate("Pybox-Manager", "Name :")) + + self.label_custom_setting_create_delete.setText(self._translate("PyBox-Manager", "Create / Modify / Delete custom settings")) + self.label_custom_setting_manage_value.setText(self._translate("PyBox-Manager", "Manage values")) + self.label_custom_setting_name.setText(self._translate("PyBox-Manager", "Setting type :")) + self.label_custom_setting_scroll_name.setText(self._translate("PyBox-Manager", "Name")) + self.label_custom_setting_scroll_id.setText(self._translate("PyBox-Manager", "id")) + + # tabs + self.main_tabs.setTabText(self.main_tabs.indexOf(self.tab_boxmanager), self._translate("Pybox-Manager", "Box Manager")) + self.main_tabs.setTabText(self.main_tabs.indexOf(self.tab_labels_manager), self._translate("Pybox-Manager", "Stimulations/Labels Manager")) + self.main_tabs.setTabText(self.main_tabs.indexOf(self.tab_custom_settings), self._translate("PyBox-Manager", "Custom Settings Manager")) + + self.config_tabs.setTabText(self.config_tabs.indexOf(self.tab_settings), self._translate("Pybox-Manager", "Settings")) + self.config_tabs.setTabText(self.config_tabs.indexOf(self.tab_inputs), self._translate("Pybox-Manager", "Inputs")) + self.config_tabs.setTabText(self.config_tabs.indexOf(self.tab_outputs), self._translate("Pybox-Manager", "Outputs")) + + # dropdown + self.config_dropdown_boxname(mu.boxes) + self.config_dropdown_category(mu.category) + self.config_dropdown_mode(mu.modes) + self.config_dropdown_stim_del(mu.stims) + self.config_dropdown_custom_setting(mu.custom_settings) + + # button + self.button_new.setText(self._translate("Pybox-Manager", "New")) + self.button_new.clicked.connect(self.new_box) + + self.button_duplicate.setText(self._translate("Pybox-Manager", "Duplicate")) + self.button_duplicate.clicked.connect(self.duplicate_box) + + self.button_script.setText(self._translate("Pybox-Manager", "Load File")) + self.button_script.clicked.connect(self.load_python_script) + + self.button_reset.setText(self._translate("Pybox-Manager", "Reset Box")) + self.button_reset.clicked.connect(self.reset_box) + + self.button_mode.setText(self._translate("Pybox-Manager", "Apply")) + self.button_mode.clicked.connect(self.apply_mode) + + self.button_add_setting.setText(self._translate("Pybox-Manager", "Add Setting")) + self.button_add_setting.clicked.connect(self.create_line_setting) + + self.button_add_input.setText(self._translate("Pybox-Manager", "Add Input")) + self.button_add_input.clicked.connect(self.create_line_input) + + self.button_add_output.setText(self._translate("Pybox-Manager", "Add Output")) + self.button_add_output.clicked.connect(self.create_line_output) + + self.button_box_create.setText(self._translate("Pybox-Manager", "Build")) + self.button_box_create.clicked.connect(self.compile_create_box) + + self.button_box_delete.setText(self._translate("Pybox-Manager", "Delete Box")) + self.button_box_delete.clicked.connect(self.compile_delete_box) + + + + self.button_sound_stim_add.setText(self._translate("Pybox-Manager", "Load File")) + self.button_sound_stim_add.clicked.connect(self.load_sound_file) + + self.button_stim_create.setText(self._translate("Pybox-Manager", "Create")) + self.button_stim_create.clicked.connect(self.create_label) + + self.button_stim_delete.setText(self._translate("Pybox-Manager", "Delete")) + self.button_stim_delete.clicked.connect(self.delete_label) + + + + self.button_custom_setting_new.setText(self._translate("PyBox-Manager", "New")) + self.button_custom_setting_new.clicked.connect(self.new_custom_setting) + + self.button_custom_setting_reset.setText(self._translate("PyBox-Manager", "Reset")) + self.button_custom_setting_reset.clicked.connect(self.reset_custom_setting) + + self.button_custom_setting_duplicate.setText(self._translate("PyBox-Manager", "Duplicate")) + self.button_custom_setting_duplicate.clicked.connect(self.duplicate_custom_setting) + + self.button_custom_setting_create.setText(self._translate("PyBox-Manager", "Create / Modify")) + self.button_custom_setting_create.clicked.connect(self.compile_create_custom_setting) + + self.button_custom_setting_delete.setText(self._translate("PyBox-Manager", "Delete")) + self.button_custom_setting_delete.clicked.connect(self.compile_delete_custom_setting) + + self.button_custom_setting_scroll_add.setText(self._translate("PyBox-Manager", "Add Value")) + self.button_custom_setting_scroll_add.clicked.connect(self.create_line_add_value) + + # Update when value changed + self.dropdown_boxname.currentTextChanged.connect(self.update_box) + self.text_script.textChanged.connect(self.update_box) + self.text_description.textChanged.connect(self.update_box) + self.text_author.textChanged.connect(self.update_box) + self.dropdown_category.activated.connect(lambda: self.update_box()) + + self.checkbox_settings_modifs.stateChanged.connect(self.update_box) + self.checkbox_inputs_modifs.stateChanged.connect(self.update_box) + self.checkbox_outputs_modifs.stateChanged.connect(self.update_box) + + + + self.dropdown_custom_setting_name.currentTextChanged.connect(self.update_custom_settings) + + # Tooltips + self.img_info_custom_setting_id.setToolTip("""You can choose to apply one of the two following modes :\n + OV-mode : + This is the default mode in OpenViBE to use boxes. The box will have only one + Streamed Matrix and one Stimulation as inputs. The box is able to identify the data's + label with the stimulation it receives.\n + Poly-mode : + This mode is usefull when you have several files containing your data : one + file for each label. The box will have several Streamed Matrix inputs, but no Stimulations or + Signals inputs. The box will then consider that each input corresponds to a different label.""") + + self.img_info_setting_type.setToolTip("""If you want to use custom type, you have to launch +the manager with the argument : \"mode=developer\".""") + + self.img_info_checkbox_modifications.setToolTip("""Uncheck to disable modifications in OpenViBE.""") + + self.img_info_custom_setting_id.setToolTip("""Each id must be Integer and different.""" ) + + + + + # config dropdown functions + + def config_dropdown_boxname(self, boxes) : + boxes = list(boxes.keys()) + boxes.sort() + + for i, boxname in enumerate(boxes) : + self.dropdown_boxname.addItem("") + self.dropdown_boxname.setItemText(i, boxname) + self.dropdown_boxname.setCurrentIndex(0) + self.dropdown_boxname.activated.connect(lambda: self.load_box(reset=False)) + + def config_dropdown_category(self, categories) : + categories.sort() + + for i, cat in enumerate(categories) : + self.dropdown_category.addItem(cat) + self.dropdown_category.setCurrentIndex(0) + + def config_dropdown_stim_del(self, stims) : + stims.sort() + self.dropdown_stim_del.setCurrentText(self._translate("Pybox-Manager", stims[0])) + for i, s in enumerate(stims) : + self.dropdown_stim_del.addItem("") + self.dropdown_stim_del.setItemText(i, self._translate("Pybox-Manager", s)) + + def config_dropdown_mode(self, modes) : + self.dropdown_mode.setCurrentText(self._translate("Pybox-Manager", modes[0])) + for i, m in enumerate(modes) : + self.dropdown_mode.addItem("") + self.dropdown_mode.setItemText(i, self._translate("Pybox-Manager", m)) + + def config_dropdown_custom_setting(self, custom_settings) : + custom_settings = list(custom_settings.keys()) + custom_settings.sort() + + for i, cs_name in enumerate(custom_settings) : + self.dropdown_custom_setting_name.addItem(self._translate("PyBox-Manager", cs_name)) + self.dropdown_custom_setting_name.setCurrentIndex(0) + self.dropdown_custom_setting_name.activated.connect(self.load_custom_setting) + + # Behaviour all tabs + + def delete_line(self, button) : + # We search which settings / inputs / outputs lines do have buttons + # We delete them and update the boxes + + def update_layout(layout, lines) : + # Replace all the lines + for line in lines : + for elem in line : + layout.removeWidget(elem) + + for i, line in enumerate(lines) : + for j, elem in enumerate(line) : + layout.addWidget(elem, i, j, 1, 1) + + + for line in self.current_settings : + if line.button_delete == button : + line.name.deleteLater() + line.type.deleteLater() + line.value.deleteLater() + line.button_delete.deleteLater() + self.current_settings.remove(line) + + update_layout(self.layout_settings, self.current_settings) + self.update_box() + return + + for line in self.current_inputs : + if line.button_delete == button : + line.name.deleteLater() + line.type.deleteLater() + line.button_delete.deleteLater() + self.current_inputs.remove(line) + lines_layout = self.current_inputs + + update_layout(self.layout_inputs, self.current_inputs) + self.update_box() + return + + for line in self.current_outputs : + if line.button_delete == button : + line.name.deleteLater() + line.type.deleteLater() + line.button_delete.deleteLater() + self.current_outputs.remove(line) + lines_layout = self.current_outputs + + update_layout(self.layout_outputs, self.current_outputs) + self.update_box() + return + + for line in self.current_custom_settings_lines : + if line.button_delete == button : + line.name.deleteLater() + line.value.deleteLater() + line.button_delete.deleteLater() + self.current_custom_settings_lines.remove(line) + lines_layout = self.current_custom_settings_lines + + update_layout(self.layout_custom_setting, self.current_custom_settings_lines) + self.update_custom_settings() + return + + # Behaviour BoxManager + + def clear_boxmanager(self, clear_name=True) : + """ Clear all fields in the manager """ + + self.current_box = None + if clear_name : + self.dropdown_boxname.setCurrentText(self._translate("Pybox-Manager", "")) + self.text_script.setText(self._translate("Pybox-Manager", "")) + self.text_description.setText(self._translate("Pybox-Manager", "")) + + for line in self.current_settings : + line.name.deleteLater() + line.type.deleteLater() + line.value.deleteLater() + line.button_delete.deleteLater() + + for line in self.current_inputs + self.current_outputs : + line.name.deleteLater() + line.type.deleteLater() + line.button_delete.deleteLater() + + self.checkbox_settings_modifs.setChecked(True) + self.checkbox_inputs_modifs.setChecked(True) + self.checkbox_outputs_modifs.setChecked(True) + + self.current_settings = [] + self.current_inputs = [] + self.current_outputs = [] + + def load_python_script(self) : + """Help the user to select the python script that will be used by the current box""" + + def get_boxname(dico, uri) : + symbol = '/' + if system == 'Windows' : + symbol = '\\' + + name = uri.split(symbol)[-1].split(".")[0] + current_name = name + i = 0 + while True : + flag = False + for bn in dico.keys() : + if bn == current_name : + i += 1 + current_name = '{}_{}'.format(name, i) + flag = True + break + if not flag : + return current_name + + + uri = QFileDialog().getOpenFileName(caption="Select the python script to insert.", + directory=mu.manager_folder, + filter="*.py")[0] + if uri == "" : + # The user close the dialog without pick any file. + return + + uri = os.path.relpath(uri, mu.openvibe_folder + 'dist/extras-Release/') + + if len(self.current_box.name) == 0 : + boxname = get_boxname(mu.boxes, uri) + del(mu.boxes['']) + mu.boxes[boxname] = mu.BoxPython(name=boxname, path_script=uri) + + index = len(mu.boxes.keys()) - 1 + self.dropdown_boxname.setItemText(index, self._translate("Pybox-Manager", boxname)) + self.dropdown_boxname.setCurrentIndex(index) + + self.text_script.setText(self._translate("Pybox-Manager", uri)) + + def load_box(self, reset=False) : + """Load a box and all of its settings.""" + + self.clear_boxmanager(clear_name=False) + + boxname = self.dropdown_boxname.currentText() + + if len(boxname) == 0 : + return + + self.is_loaded = True + + + if reset : + # We reset the box + self.current_box = mu.find_all_boxes(mu.manager_folder, mu.io_type, mu.all_settings_type)[boxname] + else : + # we load the box + self.current_box = mu.boxes[boxname] + + self.current_settings = [] + self.current_inputs = [] + self.current_outputs = [] + + # description, script, author, category + self.text_description.setText(self._translate("Pybox-Manager", self.current_box.description.replace('\\n', '\n'))) + self.text_script.setText(self._translate("Pybox-Manager", self.current_box.py_script)) + self.text_author.setText(self._translate("PyBox-Manager", self.current_box.author)) + + index = self.dropdown_category.findText(self.current_box.category, QtCore.Qt.MatchFixedString) + self.dropdown_category.setCurrentIndex(index) + + # Settings loading + for i, setting in enumerate(self.current_box.settings.values()) : + # Retrieve the values + self.create_line_setting() + line = self.current_settings[i] + name, kind, value = setting + # Set the values + line.name.setText(self._translate("Pybox-Manager", name)) + index = line.type.findText(kind, QtCore.Qt.MatchFixedString) + if index >= 0 : + line.type.setCurrentIndex(index) + line.value.setText(self._translate("Pybox-Manager", str(value))) + + # Inputs loading + for i, my_input in enumerate(self.current_box.inputs.values()) : + # Retrieve the values + self.create_line_input() + line = self.current_inputs[i] + name, kind = my_input + # Set the values + line.name.setText(self._translate("Pybox-Manager", name)) + index = line.type.findText(kind, QtCore.Qt.MatchFixedString) + if index >= 0 : + line.type.setCurrentIndex(index) + + # Outputs loading + for i, my_output in enumerate(self.current_box.outputs.values()) : + # Retrieve the values + self.create_line_output() + line = self.current_outputs[i] + name, kind = my_output + # Set the values + line.name.setText(self._translate("Pybox-Manager", name)) + index = line.type.findText(kind, QtCore.Qt.MatchFixedString) + if index >= 0 : + line.type.setCurrentIndex(index) + + # Modify Permissions + self.checkbox_settings_modifs.setChecked(self.current_box.modify_settings) + self.checkbox_inputs_modifs.setChecked(self.current_box.modify_inputs) + self.checkbox_outputs_modifs.setChecked(self.current_box.modify_outputs) + + self.is_loaded = False + self.update_box() + + def reset_box(self) : + """Remove all changes since the last compilation.""" + if self.current_box is None : + return + + boxes = mu.find_all_boxes(mu.manager_folder, mu.io_type, mu.all_settings_type) + current_name = self.current_box.name + + if current_name in boxes : + # the box already exists + self.load_box(reset=True) + + else : + self.clear_boxmanager(clear_name=False) + self.current_box = mu.BoxPython(name=current_name, desc='', path_script='') + + def new_box(self) : + """Clear every field and prepare new box""" + + self.clear_boxmanager() + + self.current_box = mu.BoxPython(name='', desc='', path_script='') + mu.boxes[''] = self.current_box + + index = len(mu.boxes.keys())-1 + self.dropdown_boxname.addItem('') + self.dropdown_boxname.setCurrentIndex(index) + + def duplicate_box(self) : + """ Duplicate the current box""" + + if self.current_box is None : + mu.warning_msg('Cannot duplicate the box, no box has been selected.') + return + + box = self.extract_infos_box() + box.name = mu.get_name_duplicate(mu.boxes, box.name) + # print(mu.boxes) + mu.boxes[box.name] = box + self.current_box = box + # print(mu.boxes) + + index = len(mu.boxes.keys()) + self.dropdown_boxname.addItem('') + self.dropdown_boxname.setItemText(index-1, self._translate("Pybox-Manager", box.name)) + self.dropdown_boxname.setCurrentIndex(index-1) + + def create_line_setting(self) : + """Create a new line of setting and update the box""" + + def config_dropdown_settings_type(self, dropdown) : + types = sorted(list(mu.settings_type.keys())) + dropdown.setCurrentText(self._translate("Pybox-Manager", types[0])) + for i, t in enumerate(types) : + dropdown.addItem("") + dropdown.setItemText(i, self._translate("Pybox-Manager", t)) + + # We add to the dropdown all custom settings used by the box + for k, (name, cid, value) in self.current_box.settings.items() : + if cid not in mu.settings_type : + dropdown.addItem(self._translate("PyBox-Manager", cid)) + + y = len(self.current_settings) + + text = QtWidgets.QLineEdit(self.scroll_settings_widget) + text.setObjectName("text_setting_name") + text.textChanged.connect(self.update_box) + + dropdown = QtWidgets.QComboBox(self.scroll_settings_widget) + dropdown.setObjectName("dropdown_setting_type") + config_dropdown_settings_type(self, dropdown) + dropdown.currentIndexChanged.connect(self.update_box) + + value = QtWidgets.QLineEdit(self.scroll_settings_widget) + value.setObjectName("value_setting_value") + value.textChanged.connect(self.update_box) + + + button_delete = QtWidgets.QPushButton(self.scroll_settings_widget) + button_delete.setObjectName('button_setting_delete') + button_delete.setText(self._translate("Pybox-Manager", "Delete")) + button_delete.clicked.connect(lambda : self.delete_line(button_delete)) + + self.layout_settings.addWidget(text, y, 0, 1, 1) + self.layout_settings.addWidget(dropdown, y, 1, 1, 1) + self.layout_settings.addWidget(value, y, 2, 1, 1) + self.layout_settings.addWidget(button_delete, y, 3, 1, 1) + + self.current_settings += [mu.Setting(text, dropdown, value, button_delete)] + self.centralwidget.show() + self.update_box() + + def create_line_input(self) : + """Create a new line of input and update the box""" + + def config_dropdown_input_type(self, dropdown) : + types = list(mu.io_type.keys()) + dropdown.setCurrentText(self._translate("Pybox-Manager", types[0])) + for i, t in enumerate(types) : + dropdown.addItem("") + dropdown.setItemText(i, self._translate("Pybox-Manager", t)) + + y = len(self.current_inputs) + + text = QtWidgets.QLineEdit(self.scroll_inputs_widget) + text.setObjectName("text_input_name") + text.textChanged.connect(self.update_box) + + dropdown = QtWidgets.QComboBox(self.scroll_inputs_widget) + dropdown.setObjectName("dropdown_input_type") + config_dropdown_input_type(self, dropdown) + dropdown.currentIndexChanged.connect(self.update_box) + + button_delete = QtWidgets.QPushButton(self.scroll_inputs_widget) + button_delete.setObjectName('button_input_delete') + button_delete.setText(self._translate("Pybox-Manager", "Delete")) + button_delete.clicked.connect(lambda : self.delete_line(button_delete)) + + self.layout_inputs.addWidget(text, y, 0, 1, 1) + self.layout_inputs.addWidget(dropdown, y, 1, 1, 1) + self.layout_inputs.addWidget(button_delete, y, 3, 1, 1) + + self.current_inputs += [mu.Input(text, dropdown, button_delete)] + self.centralwidget.show() + self.update_box() + + def create_line_output(self) : + """Create a new line of output and update the box""" + + def config_dropdown_output_type(self, dropdown) : + types = list(mu.io_type.keys()) + dropdown.setCurrentText(self._translate("Pybox-Manager", types[0])) + for i, t in enumerate(types) : + dropdown.addItem("") + dropdown.setItemText(i, self._translate("Pybox-Manager", t)) + + y = len(self.current_outputs) + + text = QtWidgets.QLineEdit(self.scroll_outputs_widget) + text.setObjectName("text_output_name") + text.textChanged.connect(self.update_box) + + dropdown = QtWidgets.QComboBox(self.scroll_outputs_widget) + dropdown.setObjectName("dropdown_output_type") + config_dropdown_output_type(self, dropdown) + dropdown.currentIndexChanged.connect(self.update_box) + + button_delete = QtWidgets.QPushButton(self.scroll_outputs_widget) + button_delete.setObjectName('button_output_delete') + button_delete.setText(self._translate("Pybox-Manager", "Delete")) + button_delete.clicked.connect(lambda : self.delete_line(button_delete)) + + self.layout_outputs.addWidget(text, y, 0, 1, 1) + self.layout_outputs.addWidget(dropdown, y, 1, 1, 1) + self.layout_outputs.addWidget(button_delete, y, 3, 1, 1) + + self.current_outputs += [mu.Output(text, dropdown, button_delete)] + self.centralwidget.show() + self.update_box() + + def apply_mode(self) : + """ Reset the inputs and add one steamed matrix and one stimulation input""" + + mode = self.dropdown_mode.currentText() + # delete old inputs + for line in self.current_inputs : + line.name.deleteLater() + line.type.deleteLater() + line.button_delete.deleteLater() + self.current_inputs = [] + + if mode == 'poly-mode' : + for i in range(6) : + self.create_line_input() + line = self.current_inputs[i] + line.name.setText(self._translate("Pybox-Manager", "input_{}".format(i))) + index = line.type.findText('Streamed Matrix', QtCore.Qt.MatchFixedString) + if index >= 0 : + line.type.setCurrentIndex(index) + + elif mode == 'ov-mode' : + self.create_line_input() + line = self.current_inputs[0] + line.name.setText(self._translate("Pybox-Manager", "input_StreamMatrix")) + index = line.type.findText('Streamed Matrix', QtCore.Qt.MatchFixedString) + if index >= 0 : + line.type.setCurrentIndex(index) + + self.create_line_input() + line = self.current_inputs[1] + line.name.setText(self._translate("Pybox-Manager", "input_Stimulations")) + index = line.type.findText('Stimulations', QtCore.Qt.MatchFixedString) + if index >= 0 : + line.type.setCurrentIndex(index) + + else : + raise Exception("Mode {} not known.".format(mode)) + + def extract_infos_box(self) : + """Read all the fields and retrieve all information from the current box.""" + + boxname = self.dropdown_boxname.currentText() + boxdesc = self.text_description.toPlainText().replace('\n', '\\n') + boxscript = self.text_script.text() + box_author = self.text_author.text() + box_category = self.dropdown_category.currentText() + + settings = {} + for i, setting in enumerate(self.current_settings) : + settings[i+2] = [setting.name.text(), setting.type.currentText(), setting.value.text()] + + inputs = {} + + # This operation is useful for streamed matrix label + for i, inp in enumerate(self.current_inputs) : + inputs[i+2] = [inp.name.text(), ' '.join([w for w in inp.type.currentText().split(' ') if len(w) > 0])] + + outputs = {} + for i, out in enumerate(self.current_outputs) : + outputs[i+2] = [out.name.text(), ' '.join([w for w in out.type.currentText().split(' ') if len(w) > 0])] + + box = mu.BoxPython(name=boxname, desc=boxdesc, path_script=boxscript, old_name=self.current_box.old_name) + box.author = box_author + box.category = box_category + box.settings = settings + box.inputs = inputs + box.outputs = outputs + box.modify_settings = self.checkbox_settings_modifs.isChecked() + box.modify_inputs = self.checkbox_inputs_modifs.isChecked() + box.modify_outputs = self.checkbox_outputs_modifs.isChecked() + return box + + def compile_create_box(self) : + """Modify the files for all the box that have been opened by the manager and compile openvibe. + If the compilation failed, set all the files back to before all modifications.""" + + if self.current_box is None : + return + + if len(self.current_box.name.replace(' ', '')) == 0 : + mu.warning_msg('The box needs a name.') + return + + if len(self.current_box.py_script.replace(' ', '')) == 0 : + mu.warning_msg('The box needs a script.') + return + + old_boxes = mu.find_all_boxes(mu.manager_folder, mu.io_type, mu.all_settings_type) + + # rollback prep + boxes_path = "{}/src/".format(mu.manager_folder) + copy_path = mu.manager_folder + 'boxes_copy/' + log_path = mu.manager_folder + 'compilation.log' + + try: + shutil.copytree(boxes_path, copy_path) + + except Exception as e: + print(e) + + + print('Generation of the files in progress...') + + + for box in filter(lambda x: mu.boxes[x].to_be_updated, mu.boxes): + + cb = mu.boxes[box] + + if cb.name in old_boxes.keys() and cb.to_be_updated : + # Modification of an existing box + mu.delete_box(mu.manager_folder, cb.name) + + cb.to_be_updated = False + + mu.create_box(mu.openvibe_folder, + mu.manager_folder, + mu.settings_type, + mu.io_type, + cb.name, + cb.description, + cb.py_script, + cb.category, + cb.author, + cb.settings, + cb.inputs, + cb.outputs, + cb.modify_settings, + cb.modify_inputs, + cb.modify_outputs) + + + print('Compilation in progress...') + mu.compile(mu.manager_folder, mu.openvibe_folder) + + # catch error when building + regex = '(recipe .*? failed)|(Error while building) ' + + with open(log_path, 'r') as log_file: + f = log_file.read() + res = re.search(regex, f) + + if res is not None : + # There was an error during compilation so we have to rollback the boxes + print('An error occured during the compilation. A rollback has been applied. For more information, please refer to the logs in {}.'.format(log_path)) + + shutil.rmtree(boxes_path) + shutil.copytree(copy_path, boxes_path) + + else : + print('Compilation successfull !\n') + + bns = list(mu.boxes.keys()) + path_bns = [boxes_path + 'box-algorithms/' + bns[i] + '.h' for i in range(len(bns))] + path_bns = [pbns.replace('\\', '/').replace('//', '/') for pbns in path_bns] + print('List of Python Box existing :\n{}'.format('\n'.join(['{} - {}'.format(bns[i], path_bns[i]) for i in range(len(bns))]))) + + shutil.rmtree(copy_path) + + + def compile_delete_box(self) : + """Delete a box from the manager, to apply the deletion, openvibe needs to compile.""" + + if self.current_box is None : + return + + mu.delete_box(mu.manager_folder, self.current_box.name) + # mu.compile(mu.manager_folder, mu.openvibe_folder) + + self.dropdown_boxname.removeItem(self.dropdown_boxname.currentIndex()) + boxname = self.dropdown_boxname.currentText() + if len(boxname) > 0 : + self.load_box(reset=False) + else : + self.new_box() + + def update_box(self) : + """Retrieve all the settings the user as set to a local session memory.""" + + if self.current_box is not None and not self.is_loaded : + + old_name = self.current_box.name + self.current_box = self.extract_infos_box() + + if self.current_box.name != old_name and self.current_box.name not in mu.boxes.keys() : + # The name of the box has been modified + del(mu.boxes[old_name]) + mu.boxes[self.current_box.name] = self.current_box + + index = self.dropdown_boxname.currentIndex() + self.dropdown_boxname.setItemText(index, self._translate("Pybox-Manager", self.current_box.name)) + + elif self.current_box.name == old_name : + mu.boxes[self.current_box.name] = self.current_box + + mu.boxes[self.current_box.name].to_be_updated = True + + + # Behaviour Stim manager + + def load_sound_file(self) : + """Help the user to select a .mp3 file in his computer system. + This will be the sound played by the box DatasetCreator when it comes to record + the associated action.""" + + uri = QFileDialog().getOpenFileName(caption="Select the .mp3 file.", + directory=mu.manager_folder, + filter="*.mp3")[0] + self.text_sound_stim_add.setText(self._translate("Pybox-Manager", uri)) + + def create_label(self) : + """Add a stimlulation to openvibe, and compile openvibe.""" + + label = self.text_name_stim_add.text() + label = label.lower().replace(' ', '_') + path_sound = self.text_sound_stim_add.text() + if len(label) >= 2 and len(path_sound) != 0 : + mu.add_stimulation(mu.manager_folder, label, path_sound) + mu.compile(mu.manager_folder, mu.openvibe_folder) + label = label[0].upper() + label[1:].lower() + self.dropdown_stim_del.addItem(label) + else : + print('The stimulation name must have a size above 2, and the path to the sound has to be defined.') + + def delete_label(self) : + """Remove a stimulation from openvibe and compile openvibe.""" + + label = self.dropdown_stim_del.currentText() + mu.delete_stimulation(mu.manager_folder, label) + self.dropdown_stim_del.removeItem(self.dropdown_stim_del.currentIndex()) + mu.compile(mu.manager_folder, mu.openvibe_folder) + + # Behaviour custom types + + def create_line_add_value(self) : + """Create a line in the ui to set a value to a custom setting""" + + y = len(self.current_custom_settings_lines) + + text = QtWidgets.QLineEdit(self.scroll_custom_setting_widget) + text.setObjectName("setting_v_name") + text.textChanged.connect(self.update_custom_settings) + + regex=QtCore.QRegExp('^[a-zA-Z0-9_]+( [a-zA-Z0-9_]+)*$') + validator = QtGui.QRegExpValidator(regex) + text.setValidator(validator) + + text_2 = QtWidgets.QLineEdit(self.scroll_custom_setting_widget) + text_2.setObjectName("setting_v_value") + text_2.textChanged.connect(self.update_custom_settings) + + button = QtWidgets.QPushButton(self.scroll_custom_setting_widget) + button.setText(self._translate("PyBox-Manager", "Delete")) + button.clicked.connect(lambda : self.delete_line(button)) + + self.layout_custom_setting.addWidget(text, y, 0, 1, 1) + self.layout_custom_setting.addWidget(text_2, y, 1, 1, 1) + self.layout_custom_setting.addWidget(button, y, 2, 1, 1) + + self.current_custom_settings_lines += [mu.Custom_Setting_Line(text, text_2, button)] + self.centralwidget.show() + self.update_custom_settings() + + def clear_custom_settings_manager(self, clear_name=True) : + """Clear every field in the custom setting window.""" + + self.current_custom_setting = None + if clear_name : + self.dropdown_custom_setting_name.setCurrentText(self._translate("PyBox-Manager", "")) + + for line in self.current_custom_settings_lines : + line.name.deleteLater() + line.value.deleteLater() + line.button_delete.deleteLater() + + self.current_custom_settings_lines = [] + + def extract_infos_custom_setting(self) : + """Retireve all information of the current custom setting, and + add it to a local session memory.""" + + cs_name = self.dropdown_custom_setting_name.currentText() + + values = [] + for line in self.current_custom_settings_lines : + values += [mu.Value(line.name.text(), line.value.text())] + + return mu.Custom_Setting(cs_name, values) + + def load_custom_setting(self, reset=False) : + """Load all information from a custom setting and + fill the fields with it.""" + + self.clear_custom_settings_manager(clear_name=False) + + cs_name = self.dropdown_custom_setting_name.currentText() + if len(cs_name) == 0 : + return + + self.is_loaded = True + + if reset : + # We reset the box + self.current_custom_setting = mu.find_all_custom_settings(mu.manager_folder)[cs_name] + else : + # We load the box + self.current_custom_setting = mu.custom_settings[cs_name] + + for i, value in enumerate(self.current_custom_setting.values) : + # Retrieve the values + self.create_line_add_value() + line = self.current_custom_settings_lines[i] + v_text, v_id = value + # Set the values + line.name.setText(self._translate("PyBox-Manager", v_text)) + line.value.setText(self._translate("PyBox-Manager", str(v_id))) + + self.is_loaded = False + self.update_custom_settings() + + def new_custom_setting(self) : + """Clear every fields and prepare a new custom setting.""" + + self.clear_custom_settings_manager() + + self.current_custom_setting = mu.Custom_Setting(name='', values=[]) + mu.custom_settings[''] = self.current_custom_setting + + index = len(mu.custom_settings.keys()) - 1 + self.dropdown_custom_setting_name.addItem('') + self.dropdown_custom_setting_name.setCurrentIndex(index) + + def reset_custom_setting(self) : + """Reset all fields from the current custom setting.""" + + if self.current_custom_setting is None : + return + + custom_settings = mu.find_all_custom_settings(mu.manager_folder) + current_name = self.current_custom_setting.name + + if current_name in custom_settings.keys() : + # the setting already exists + self.load_custom_setting(reset=True) + else : + self.clear_custom_settings_manager(clear_name=False) + self.current_custom_setting = mu.Custom_Setting(name=current_name, values=[]) + + def duplicate_custom_setting(self) : + """Duplicate the current custom setting.""" + + if self.current_custom_setting is None : + mu.warning_msg('Cannot duplicate the custom setting, no custom setting have been selected.') + return + + cs = self.extract_infos_custom_setting() + cs_name = mu.get_name_duplicate(mu.custom_settings, cs.name) + + cs = mu.Custom_Setting(cs_name, cs.values) + + mu.custom_settings[cs.name] = cs + self.current_custom_setting = cs + + index = len(mu.custom_settings.keys()) + self.dropdown_custom_setting_name.addItem(self._translate("PyBox-Manager", cs_name)) + self.dropdown_custom_setting_name.setCurrentIndex(index-1) + + def update_custom_settings(self) : + """Verify if a modification has been made. If so, + retireve all information from the current custom settings, + and save it to the local session memory """ + if self.current_custom_setting is not None and not self.is_loaded : + + old_name = self.current_custom_setting.name + self.current_custom_setting = self.extract_infos_custom_setting() + + if self.current_custom_setting.name != old_name and \ + self.current_custom_setting.name not in mu.custom_settings.keys() : + # The name of the custom setting has been modified + del(mu.custom_settings[old_name]) + mu.custom_settings[self.current_custom_setting.name] = self.current_custom_setting + + index = self.dropdown_custom_setting_name.currentIndex() + self.dropdown_custom_setting_name.setItemText(index, self._translate("PyBox-Manager", self.current_custom_setting.name)) + + elif self.current_custom_setting.name == old_name : + mu.custom_settings[self.current_custom_setting.name] = self.current_custom_setting + + def compile_create_custom_setting(self) : + """Make all the modification to create/modify the current custom setting + Then compile OpenViBE""" + if self.current_custom_setting is None : + return + + old_custom_settings = mu.find_all_custom_settings(mu.manager_folder) + if self.current_custom_setting.name in old_custom_settings.keys() : + # Modification of an existing custom setting + mu.delete_custom_setting(mu.manager_folder, self.current_custom_setting) + + mu.create_custom_setting(mu.manager_folder, mu.openvibe_folder, self.current_custom_setting) + mu.compile(mu.manager_folder, mu.openvibe_folder) + + def compile_delete_custom_setting(self) : + """Make all the modification to delete the current custom setting + Then compile OpenViBE""" + if self.current_custom_setting is None : + return + + mu.delete_custom_setting(mu.manager_folder, self.current_custom_setting) + mu.compile(mu.manager_folder, mu.openvibe_folder) + + self.dropdown_custom_setting_name.removeItem(self.dropdown_custom_setting_name.currentIndex()) + cs_name = self.dropdown_custom_setting_name.currentText() + if len(cs_name) > 0 : + self.load_custom_setting() + else : + self.new_custom_setting() + + + + +if __name__ == "__main__": + + app = QtWidgets.QApplication(sys.argv) + MainWindow = QtWidgets.QMainWindow() + ui = Ui_MainWindow() + ui.setupUi(MainWindow) + MainWindow.show() + sys.exit(app.exec_()) + diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/PolyBox.py b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/PolyBox.py new file mode 100644 index 0000000..07da68a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/PolyBox.py @@ -0,0 +1,203 @@ +# -*- coding: utf-8 -*- +# File Name : PolyBox.py +# Created By : Yannis Bendi-Ouis + +from StimulationsCodes import * +from PolyStimulations import * +from openvibe import * +import sys, traceback, collections +from io import StringIO +import re + + +def get_label_from_stim(stim): + stims_1 = list(OpenViBE_stimulation.items()) + stims_2 = list(Poly_stimulation.items()) + inv_dictstim = {v: k for k, v in stims_1 + stims_2} + label = inv_dictstim[stim.identifier][7:].lower() + label = ' '.join(label.split('_')) + return label + + +class PolyBox(OVBox): + + def __init__(self, record=True): + OVBox.__init__(self) + self.acquiring_channel = [] + self.signalHeader = [] + self.data = {} + self.record = record + + self.mode = '' + self.current_stimulation = None + self.labels = [] + + def initialize(self): + + def verify_entry(self): + # Verify that the inputs corresponds to ov-mode or poly-mode + # ov-mode : 1 stimulations and 1 streamed matrix + # poly-mode : several streamed-matrix + # others : others -> warning + list_entry_type = [entry.type() for entry in self.input] + nb_matrix = list_entry_type.count('StreamedMatrix') + nb_stim = list_entry_type.count('Stimulations') + nb_signal = list_entry_type.count('Signal') + + if nb_stim == 1 and nb_matrix == 1 and nb_signal == 0: + # ov-mode + self.mode = 'ov-mode' + elif nb_stim == 0 and nb_matrix >= 1 and nb_signal == 0: + # poly-mode + self.mode = 'poly-mode' + else: + raise Exception("ERROR : Entry of the box does not corresponds to any mode. \ + You can use 1 stimulations and 1 streamed matrix, or several streamed matrix. \ + But you can not use {} StreamedMatrix, {} Stimulations and {} Signal entry.".format(nb_matrix, nb_stim, nb_signal)) + + def verify_stim_output(self): + # Verify that an output stim exist, otherwise prevent the user that the program won't stop + flag = False + for out in self.output: + if out.type() == 'Stimulations': + flag = True + break + + if not flag: + print('WARNING : The DatasetCreator does not have any output Stimulation. The program may never stop.') + + def get_labels(self): + # retrieve labels in form : label1, label2, label3, mon label4 + # Useless if you are in OV-MODE + if 'Labels' in self.setting.keys(): + string = self.setting['Labels'] + if len(string) > 0: + labels_cut = string.lower().split(',') + for label in labels_cut: + self.labels += ['_'.join([w for w in label.split(' ') if w != ''])] + + def init_acquiring_channel(self): + # We get data for every input channel + for _ in range(len(self.input)): + self.acquiring_channel += [False] + self.signalHeader += [None] + + verify_entry(self) + verify_stim_output(self) + get_labels(self) + init_acquiring_channel(self) + self.on_initialize() + + def process(self): + # we go through every input + for inputIndex in range(len(self.input)): + for chunkIndex in range(len(self.input[inputIndex])): + + # Signal init + if type(self.input[inputIndex][chunkIndex]) == OVStreamedMatrixHeader: + self.header_received(inputIndex, chunkIndex) + + # Process every chunk received + elif type(self.input[inputIndex][chunkIndex]) == OVStreamedMatrixBuffer: + self.chunk_received(inputIndex, chunkIndex) + + # End of signal + elif type(self.input[inputIndex][chunkIndex]) == OVStreamedMatrixEnd: + self.end_received(inputIndex, chunkIndex) + + # Stimulations init + elif type(self.input[inputIndex][chunkIndex]) == OVStimulationHeader: + self.header_received(inputIndex, chunkIndex) + + # Process every stimulation + elif type(self.input[inputIndex][chunkIndex]) == OVStimulationSet: + self.stimulation_received(inputIndex, chunkIndex) + + # End of stim + elif type(self.input[inputIndex][chunkIndex]) == OVStimulationEnd: + self.end_received(inputIndex, chunkIndex) + + def uninitialize(self): + pass + + # ------- * -------- * --------- + + def header_received(self, inputIndex, chunkIndex): + header = self.input[inputIndex].pop() + self.signalHeader[inputIndex] = header + self.acquiring_channel[inputIndex] = True + self.on_header_received(header) + + def chunk_received(self, inputIndex, chunkIndex): + chunk = list(self.input[inputIndex].pop()) + if self.acquiring_channel[inputIndex]: + + # We look for the best key to use in function of mode and settings labels. + key = None + if self.mode == 'poly-mode': + if len(self.labels) > 0: + key = self.labels[inputIndex] + else: + key = inputIndex + + elif self.mode == 'ov-mode': + key = get_label_from_stim(self.current_stimulation) + + if self.record: + try: + self.data[key].append(chunk) + except KeyError: + self.data[key] = [chunk] + + shape = tuple(self.signalHeader[inputIndex].dimensionSizes) + self.on_chunk_received(chunk, key, shape) + + def stimulation_received(self, inputIndex, chunkIndex): + stim_list = self.input[inputIndex].pop() + if len(stim_list) > 0: + self.current_stimulation = stim_list[0] + + def end_received(self, inputIndex, chunkIndex): + self.acquiring_channel[inputIndex] = False + self.input[inputIndex].pop() + if not self.is_acquiring(): + print("Fin de l'acquisition des données...") + self.on_end_box() + self.send_end_stim() + + def is_acquiring(self): + # Return false when all inputs of type StreamedMatrix received End flag. + nb_inputs = len(self.input) + for i in range(nb_inputs): + acquiring = self.acquiring_channel[i] + kind = self.input[i].type() + if kind == 'StreamedMatrix' and acquiring: + return True + return False + + def send_end_stim(self): + indice = -1 + for i, out in enumerate(self.output): + if out.type() == 'Stimulations': + indice = i + + if indice != -1: + stimLabel = 'OVTK_StimulationId_ExperimentStop' + stimCode = OpenViBE_stimulation[stimLabel] + stimSet = OVStimulationSet(0, self.getCurrentTime()) + stimSet.append(OVStimulation(stimCode, self.getCurrentTime(), 0.)) + self.output[indice].append(stimSet) + + # ---------- * -------------- * --------------- + + def on_initialize(self): + pass + + def on_header_received(self, header): + pass + + def on_chunk_received(self, chunk, label, shape): + pass + + def on_end_box(self): + pass diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/PolyStimulations.py b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/PolyStimulations.py new file mode 100644 index 0000000..093a6cb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/PolyStimulations.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +#File Name : StimulationsCodes.py +#Created By : + +## Stimulation codes +# Avoid the declaration of new stimulation (added in new tab here). Only Stimulation contains gdf in original list is really standard... +Poly_stimulation = { +'OVPoly_Down' : 0x10001, #Useless use 'OVTK_GDF_Down' +'OVPoly_Up' : 0x10002, #Useless use 'OVTK_GDF_Up' +'OVPoly_Right' : 0x10003, #Useless use 'OVTK_GDF_Right' +'OVPoly_Left' : 0x10004, #Useless use 'OVTK_GDF_Left' +'OVPoly_Neutral' : 0x10005, +'OVPoly_Push' : 0x10006, +'OVPoly_Pull' : 0x10007, +'OVPoly_Left_Wink' : 0x10008, +'OVPoly_Right_Wink' : 0x10009, +# New Stims +} diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/pybox/DataViz.py b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/pybox/DataViz.py new file mode 100644 index 0000000..a231789 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/pybox/DataViz.py @@ -0,0 +1,173 @@ +# -*- coding: utf-8 -*- +from matplotlib import pyplot as plt +from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA +from sklearn.decomposition import PCA +import numpy as np +import pandas as pd +import pickle +from PolyBox import PolyBox +import warnings +warnings.filterwarnings("ignore") + + +flag_3D = True +try: + from mpl_toolkits.mplot3d import Axes3D +except: + print('Unable to import Axes3D from mpl_toolkits.mplot3d, 3D visualization disabled.') + flag_3D = False + + +class DataViz(PolyBox): + + def __init__(self): + PolyBox.__init__(self) + + self.x_data = [] + self.y_data = [] + self.model = None + + self.path_load_model = '' + self.path_save_model = '' + self.algo = '' + self.dimension_reduction = -1 + + def on_initialize(self): + # We retrieve the setting from OpenViBE + + def retrieve_path_save_model(self): + try: + self.path_save_model = self.setting["Path to save the model"] + except KeyError: + pass + if self.path_save_model == '': + print('No path has been given to save the model, thus it won\'t be saved.') + + def retrieve_path_load_model(self): + try: + self.path_load_model = self.setting["Path to load the model"] + except KeyError: + pass + if self.path_load_model == '': + print('No path has been given to load the model, thus a new model will be created.') + + def retrieve_algo(self): + try: + self.algo = self.setting['Algorithm (PCA or LDA)'].upper() + except KeyError: + pass + if self.algo == '': + print('No algo has been given to the model, default algo is PCA.') + self.algo = 'PCA' + + def retrieve_dimension_reduction(self): + try: + self.dimension_reduction = int(self.setting['Dimension reduction']) + except KeyError: + pass + except ValueError: + print('{} is not a number. Please use 2 or 3 dimensions only.'.format(self.setting['Dimension reduction'])) + + if self.dimension_reduction == -1: + print('No dimension reduction has been given, default value is 2.') + self.dimension_reduction = 2 + + elif self.dimension_reduction == 3 and not flag_3D: + print('3D disabled, cannot show data in 3 dimensions. Default dimension is 2.') + self.dimension_reduction = 3 + + retrieve_path_save_model(self) + retrieve_path_load_model(self) + retrieve_algo(self) + retrieve_dimension_reduction(self) + def on_end_box(self): + self.prepare_data() + self.make_model_and_transform() + self.make_plot() + + # --------- + + def prepare_data(self): + for label in self.data.keys(): + self.x_data += self.data[label] + self.y_data += [label for _ in range(len(self.data[label]))] + + def make_model_and_transform(self): + # load the model if it exists, else create a new one + # then transform the data + + def load_model(self): + model = pickle.load(open(self.path_load_model, 'rb')) + print('Model load from {}.'.format(self.path_load_model)) + return model + + def save_model(self): + pickle.dump(self.model, open(self.path_save_model, 'wb')) + print('Dataviz model saved in {}'.format(self.path_save_model)) + + def map_algo(self): + switcher = { 'LDA': LDA, 'PCA': PCA } + clf = switcher.get(self.algo) + return clf, switcher + + def create_fit_model(self): + clf, _ = map_algo(self) + clf = clf(n_components=self.dimension_reduction) + if self.algo == 'PCA': + clf.fit(self.x_data) + elif self.algo == 'LDA': + clf.fit(self.x_data, self.y_data) + else: + raise Exception('{} is not known as an Algorithm. Please use PCA or LDA.'.format(self.algo)) + return clf + + # Load or create the model + if len(self.path_load_model) > 0: + self.model = load_model(self) + else: + self.model = create_fit_model(self) + + # Save the model + if self.path_save_model != '': + save_model(self) + + # Transform data + self.x_data = self.model.transform(self.x_data) + self.y_data = np.array(self.y_data) + + def make_plot(self): + + fig = plt.figure(figsize=(12, 12)) + + all_labels = list(self.data.keys()) + colors = np.array([all_labels.index(label) for label in self.y_data]) + + if self.dimension_reduction == 2: + + ax = plt.axes() + + for label in all_labels: + ax.text(self.x_data[self.y_data == label, 0].mean(), self.x_data[self.y_data == label, 1].mean(), + label, horizontalalignment='center', bbox=dict(alpha=0.5, edgecolor='w', facecolor='w')) + + ax.scatter(self.x_data[:, 0], self.x_data[:, 1], alpha=0.5, c=colors, cmap='Spectral', edgecolor='g') + + plt.show() + elif self.dimension_reduction == 3: + + ax = Axes3D(fig) + + for label in all_labels: + ax.text3D(self.x_data[self.y_data == label, 0].mean(), + self.x_data[self.y_data == label, 1].mean(), + self.x_data[self.y_data == label, 2].mean(), + label, horizontalalignment='center', bbox=dict(alpha=0.5, edgecolor='w', facecolor='w')) + + ax.scatter(self.x_data[:, 0], self.x_data[:, 1], self.x_data[:, 2], + alpha=0.5, c=colors, cmap='Spectral', edgecolor='g') + + plt.show() + + +box = DataViz() + diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/pybox/DatasetCreator.py b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/pybox/DatasetCreator.py new file mode 100644 index 0000000..ba7780a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/pybox/DatasetCreator.py @@ -0,0 +1,421 @@ +# -*- coding: utf-8 -*- +''' + * Software License Agreement (AGPL-3 License) + * + * OpenViBE + * Copyright (C) Inria, 2006-2019 + * + * Authors + * + * 2019, Yannis Bendi-Ouis + * 2019, Jimmy Leblanc + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + * +''' + +from pandas import Series, DataFrame, read_csv +import numpy as np +import pandas as pd +from natsort import natsorted +from PolyStimulations import Poly_stimulation +import os +import pickle +import random +import inspect + +# Dans les settings : +# - "Path directory" : path qui mène au directory de sauvegarde des données. Donc finir par un '/'. +# - "Label_X" : Nom des labels, où X est un nombre. Il en faut autant qu'il y a de labels. +# - "Several CSV" : Boolean ou string qui return "true" ou "false". +# - "Number of folds" : Integer qui indique en combien de différents folds les data doivent être séparées. +# - "Number of actions" : Integer qui indique le nombre d'actions à enregistrer lors d'une session. + +#------------------------------------------------------------ +ACTION_DURATION = 12 # in seconds +TAMPON_DURATION = 3 # in seconds +BEGIN_RECORD = 2 # in seconds +END_RECORD = ACTION_DURATION +FREQ = 128 +NB_POINTS_ONE_RECORD = ACTION_DURATION * FREQ +NB_POINTS_ONE_TAMPON = TAMPON_DURATION * FREQ + +CHANNELS_NAME = ['AF3', 'F7', 'F3', 'FC5', 'T7', 'P7', 'O1', 'O2', 'P8', 'T8', 'FC6', 'F4', 'F8', 'AF4'] # 14 +CHANNELS_STIMULATION = ['Event Id', 'Event Date', 'Event Duration'] + +PREFIXE_STIM = 'OVPoly_' + +#------------------------------------------------------------ +def ovdf(df, rewrite_stim=True): + shape = df.shape + timer = Series([float(i)/FREQ for i in range(shape[0])]) + epochs = Series([int(i/64) for i in range(shape[0])]) + + df.insert(0, 'Time:{}Hz'.format(FREQ), timer) + df.insert(1, 'Epoch', epochs) + + if rewrite_stim: + df['Event Id'] = Series([None for i in range(shape[0])]) + df['Event Date'] = Series([None for i in range(shape[0])]) + df['Event Duration'] = Series([None for i in range(shape[0])]) + + else: + # re-compute the time informations for stimulations + stim = df['Event Id'].values.tolist() + date = [] + duration = [] + for i, event_id in enumerate(stim): + if not pd.isnull(event_id): + date += [timer[i]] + duration += [0] + else: + date += [None] + duration += [None] + df['Event Date'] = Series(date) + df['Event Duration'] = Series(duration) + + +#------------------------------------------------------------ +def get_stim_code_from_label(label): + key = label.split('_') + key = "_".join([w[0].upper() + w[1:] for w in key]) + key = PREFIXE_STIM + key + return Poly_stimulation[key] + + +#------------------------------------------------------------ +class DatasetCreator(OVBox): + + #---------------------------------------- + def __init__(self): + OVBox.__init__(self) + self.dir_name = None + self.url = None + self.signalHeader = None + self.labels_queue = None + self.current_label = None + + self.is_tampon = False + self.several_csv = False + + self.nb_fold = 0 + self.nb_action_per_session = 0 + + self.labels = [] + self.data_recorded = [] + self.labels_order = [] + self.dic_fold = {} + self.dic_dicount = {} + + #---------------------------------------- + def initialize(self): + + def verify_labels_correct(self): + for label in self.labels: + try: + get_stim_code_from_label(label) + except KeyError: + raise Exception('Label {} not defined in PolyStimulations. You may want to add it with the manager.'.format(label)) + + def get_labels(self): + param_names = self.setting.keys() + param_names = natsorted(param_names) + for n in param_names: + if 'Label_' in n: + label = self.setting[n] + label = label.replace(' ', '_') + if len(label) > 0: + self.labels += [label.lower()] + + def init_dict(self): + self.dic_fold = {'fold_{}'.format(i): None for i in range(1, self.nb_fold+1)} + self.dic_dicount = {'fold_{}'.format(i): None for i in range(1, self.nb_fold+1)} + + def retrieve_settings(self): + + # On récupère la booleen indiquant si l'on souhaite plusieurs ou un seul csv par fold + self.several_csv = self.setting['Several CSV'] + if self.several_csv == 'true': + self.several_csv = True + elif self.several_csv == 'false': + self.several_csv = False + # On récupère le path du directory où l'on créé les fold + self.dir_name = self.setting['Path directory'] + if self.dir_name[-1] != '/': + self.dir_name += '/' + + # On récupère le nombre de fold + self.nb_fold = int(self.setting['Number of folds']) + # On récupère le nombre d'action à record par session + self.nb_action_per_session = int(self.setting['Number of actions']) + # On récupère les labels + get_labels(self) + + def verify_stim_output(self): + # Verify that an output stim exist, otherwise prevent the user that the program won't stop + flag = False + for out in self.output: + if out.type() == 'Stimulations': + flag = True + break + + if not flag: + print('WARNING : The DatasetCreator does not have any output Stimulation. The program may never stop.') + + retrieve_settings(self) + verify_stim_output(self) + verify_labels_correct(self) + init_dict(self) + + self.verify_arborescence() + self.prepare_session() + self.new_record() + + #---------------------------------------- + def process(self): + # On parcours tous les inputs + for inputIndex in range(len(self.input)): + for chunkIndex in range(len(self.input[inputIndex])): + + # Initialisation pour le signal + if type(self.input[inputIndex][chunkIndex]) == OVStreamedMatrixHeader: + self.header_received(inputIndex, chunkIndex) + + # Traitement à effectuer pour chaque chunk reçu + elif type(self.input[inputIndex][chunkIndex]) == OVStreamedMatrixBuffer: + self.chunk_received(inputIndex, chunkIndex) + + # Fin du signal + elif type(self.input[inputIndex][chunkIndex]) == OVStreamedMatrixEnd: + self.end_received(inputIndex, chunkIndex) + + #---------------------------------------- + def uninitialize(self): + pass + + # -------------- * ------------- * ------------- + + #---------------------------------------- + def header_received(self, inputIndex, chunkIndex): + self.signalHeader = self.input[inputIndex].pop() + + #---------------------------------------- + def chunk_received(self, inputIndex, chunkIndex): + chunk = self.input[inputIndex].pop() + + # Plusieurs lignes sont envoyées en même temps, il faut les séparer + indices = [(len(CHANNELS_NAME)*i, len(CHANNELS_NAME)*(i+1)) for i in range(int(len(chunk)/len(CHANNELS_NAME)))] + for begin, end in indices: + self.data_recorded += [chunk[begin:end]] + + # Fin d'un tampon + if self.is_tampon and len(self.data_recorded) >= NB_POINTS_ONE_TAMPON: + self.empty_tampon() + self.new_record() + + # Fin d'un record + if not self.is_tampon and len(self.data_recorded) >= NB_POINTS_ONE_RECORD: + if not self.end_record(): + self.end_of_session() + self.end_of_box() + + #---------------------------------------- + def end_received(self, inputIndex, chunkIndex): + self.input[inputIndex].pop() + print("Error : entry signal stoped.") + self.end_of_box() + + #---------------------------------------- + def end_of_box(self): + indice = -1 + for i, out in enumerate(self.output): + if out.type() == 'Stimulations': + indice = i + + if indice != -1: + stimLabel = 'OVTK_StimulationId_ExperimentStop' + stimCode = OpenViBE_stimulation[stimLabel] + stimSet = OVStimulationSet(0, self.getCurrentTime()) + stimSet.append(OVStimulation(stimCode, self.getCurrentTime(), 0.)) + self.output[0].append(stimSet) + + # -------------- * ------------- * ------------- + + #---------------------------------------- + def verify_arborescence(self): + # On vérifie que chaque dossier du path existe, sinon on les créé + # et on vérifie les dicount + + def verify_dir(self): + # On vérifie que le dossier existe et ses sous-dossiers, sinon on les créé + if not os.path.exists(self.dir_name): + os.mkdir(self.dir_name, 0o775) + + def verify_folds(self): + # On vérifie que les dossiers des différents folds existent, sinon on les créés + for i in range(1, self.nb_fold+1): + name = self.dir_name + 'fold_{}/'.format(i) + if not os.path.exists(name): + os.mkdir(name, 0o775) + + def verify_and_load_dicount(self): + # On vérifie que les fichiers contenant les compteurs par label existent, sinon on les créé + for i in range(1, self.nb_fold+1): + fold = 'fold_{}'.format(i) + filename = self.dir_name + fold + '/dicount.pick' + + if not os.path.isfile(filename): + dicount = {l: 0 for l in self.labels} + self.dic_dicount[fold] = dicount + pickle.dump(dicount, open(filename, 'wb')) + else: + self.dic_dicount[fold] = pickle.load(open(filename, 'rb')) + + verify_dir(self) + verify_folds(self) + verify_and_load_dicount(self) + + #---------------------------------------- + def prepare_session(self): + + def create_labels_queue(self): + nb_label = len(self.labels) + nb_total = int(self.nb_action_per_session / nb_label) # in Python 3 / create float automatically and range hate that + nb_reste = self.nb_action_per_session - nb_total*nb_label + + choice_label = [] + tmp = [l for l in self.labels] + for _ in range(nb_reste): + l = random.choice(tmp) + tmp.remove(l) + choice_label += [l] + + tmp = [l for l in self.labels] + self.labels_queue = tmp*nb_total + choice_label + random.shuffle(self.labels_queue) + + # Prepare la suite aléatoire d'action a exectuer + create_labels_queue(self) + + # Initialise self.dic_fold + for key in self.dic_fold.keys(): + self.dic_fold[key] = {l: [] for l in self.labels} + + #---------------------------------------- + def empty_tampon(self): + # Supprime les données tampons entre deux records + self.is_tampon = False + end = TAMPON_DURATION * FREQ + self.data_recorded = self.data_recorded[end:] + + #---------------------------------------- + def new_record(self): + # Prevent the user a new record begin + if len(self.labels_queue) > 0: + self.current_label = self.labels_queue.pop(0) + print('Current label : {}'.format(self.current_label)) + + #---------------------------------------- + def end_record(self): + # Démarre un nouvel enregistrement de 10 sec. Si le dernier est fini, l'enregistre. + # Return True s'il y a encore d'autres label à étudié pour la session, False sinon. + + def retrieve_record(self): + + def add_to_fold(self, data, label): + # Ajoute les éléments dans la liste data au dic_fold label et mets à jour dic_dicount + print('hello', self.dic_dicount) + tmp = [(key, value[label]) for key, value in self.dic_dicount.items()] + fold = min(tmp, key=lambda x: x[1])[0] + self.dic_fold[fold][label] += [data] + self.dic_dicount[fold][label] += len(data) + self.labels_order += [label] + + # Extract the 10s recorded + record = self.data_recorded[:NB_POINTS_ONE_RECORD] + self.data_recorded = self.data_recorded[NB_POINTS_ONE_RECORD:] + + # Extract data between begin and end + begin = FREQ*BEGIN_RECORD + end = FREQ*END_RECORD + data = record[begin:end] + add_to_fold(self, data, self.current_label) + + # End record + print('Stop.') + + retrieve_record(self) + self.is_tampon = True + + return len(self.labels_queue) > 0 + + #---------------------------------------- + def end_of_session(self): + + def maj_dicount(self, fold): + filename = self.dir_name + fold + '/dicount.pick' + dicount = self.dic_dicount[fold] + pickle.dump(dicount, open(filename, 'wb')) + + def add_label_stimulation(self, data, label): + # Add the stimulations indicating the begginning of a label + length = len(data) + event_id = [None for _ in range(length)] + event_date = [None for _ in range(length)] + event_duration = [None for _ in range(length)] + event_id[0] = get_stim_code_from_label(label) + + dict_event = {"Event Id": event_id, "Event Date": event_date, "Event Duration": event_duration} + dict_data = {c: np.array(data)[:, i].tolist() for i, c in enumerate(CHANNELS_NAME)} + dict_data.update(dict_event) + + return dict_data + + def append_data_to_csv(self, data, fold, label, several_csv=False): + # Create all csv, either you can us one CSV with stimulations, either one CSV per label + if several_csv: + filename = self.dir_name + fold + '/' + label + '.csv' + columns = CHANNELS_NAME + else: + filename = self.dir_name + fold + '/' + fold + '.csv' + columns = CHANNELS_NAME + CHANNELS_STIMULATION + data = add_label_stimulation(self, data, label) + + old_df = DataFrame() + if os.path.isfile(filename): + old_df = read_csv(filename).filter(columns) + + add_df = DataFrame(data, columns=columns) + new_df = old_df.append(add_df, ignore_index=True) + + ovdf(new_df, rewrite_stim=several_csv) + new_df.to_csv(filename, index=False) + labels_count = {label: 0 for label in self.labels} + + self.labels_order = {'fold_{}'.format(n): self.labels_order[self.nb_action_per_session*i: self.nb_action_per_session*(i+1)] + for i in range(self.nb_fold) for n in range(1, self.nb_fold+1)} + + for i in range(1, self.nb_fold+1): + fold = 'fold_{}'.format(i) + + for label in self.labels_order[fold]: + count = labels_count[label] + data = self.dic_fold[fold][label][count] + labels_count[label] += 1 + append_data_to_csv(self, data, fold, label, several_csv=self.several_csv) + + maj_dicount(self, fold) + + +box = DatasetCreator() diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/pybox/ProcessML.py b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/pybox/ProcessML.py new file mode 100644 index 0000000..d741fec --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/pybox/ProcessML.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- +from pyriemann.classification import MDM +from pyriemann.tangentspace import TangentSpace +from pyriemann.estimation import Covariances +from sklearn.pipeline import make_pipeline +from sklearn.tree import DecisionTreeClassifier +from sklearn.linear_model import LogisticRegression, SGDClassifier +from sklearn.neural_network import MLPClassifier +from sklearn.discriminant_analysis import LinearDiscriminantAnalysis +from sklearn.naive_bayes import GaussianNB +from sklearn.svm import SVC +from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier, ExtraTreesClassifier, BaggingClassifier +from sklearn.neighbors import KNeighborsClassifier, NearestCentroid +from sklearn.metrics import confusion_matrix, classification_report +from collections import defaultdict +import numpy as np +import pickle +import os +from PolyBox import PolyBox +import warnings +warnings.filterwarnings("ignore") + + +class ProcessML(PolyBox): + + #---------------------------------------- + def __init__(self): + PolyBox.__init__(self, record=False) + self.model_path = None + self.pred_saving_path = None + self.model = None + self.predictions = [] + self.shape = None + + #---------------------------------------- + def on_initialize(self): + # we get the model file + self.model_path = self.setting['Model filename'] + + # we load the model + try: + self.model = pickle.load(open(self.model_path, 'rb')) + except IOError as err: + print(err) + print('Please indicate an existing model.') + self.send_end_stim() + + try: + self.pred_saving_path = self.setting['Predictions filename'] + if len(self.pred_saving_path.replace(' ', '')) > 0: + self.pred_saving_path = os.path.abspath(self.pred_saving_path) + except IOError: + print('No filename to save predictions has been given, they will not be saved') + + #---------------------------------------- + def on_end_box(self): + self.save_preds() + self.make_stats() + + #---------------------------------------- + def list_to_str(self, preds): + string = '' + for x in preds: + string += str(x) + ',' + return string + + #---------------------------------------- + def save_preds(self): + + if self.pred_saving_path is not None and self.pred_saving_path != "": + + preds_str = self.list_to_str(self.predictions) + + with open(self.pred_saving_path, 'wb') as file: + file.write(preds_str) + print('Predictions saved in {}\n'.format(self.pred_saving_path)) + + #---------------------------------------- + def on_chunk_received(self, chunk, label, shape): + + chunk = np.array(chunk) + + if self.shape is None: + # Riemanian Geometry + if self.model.custom_classifier == 'Riemann Minimum Distance to Mean' or self.model.custom_classifier == 'Riemann Tangent Space': + self.shape = (1, shape[0], shape[1]) + else: + self.shape = (1, chunk.shape[0]) + + chunk = chunk.reshape(self.shape) + pred = self.model.predict(chunk) + + self.predictions += list(pred) + + #---------------------------------------- + def make_stats(self): + + length = len(self.predictions) + dictpred = defaultdict(int) + + for elem in self.predictions: + dictpred[elem] += 1 + print("Metrics : \n") + print('\n'.join(['{} : {}'.format(l, float(v)/length) for l, v in dictpred.items()])) + + +box = ProcessML() diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/pybox/TrainerML.py b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/pybox/TrainerML.py new file mode 100644 index 0000000..d891b74 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/share/pybox/TrainerML.py @@ -0,0 +1,247 @@ +# -*- coding: utf-8 -*- +from pyriemann.classification import MDM +from pyriemann.tangentspace import TangentSpace +from pyriemann.estimation import Covariances +import time +from sklearn.pipeline import make_pipeline +from sklearn.tree import DecisionTreeClassifier +from sklearn.linear_model import LogisticRegression, SGDClassifier +from sklearn.neural_network import MLPClassifier +from sklearn.discriminant_analysis import LinearDiscriminantAnalysis +from sklearn.naive_bayes import GaussianNB +from sklearn.svm import LinearSVC +from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier, ExtraTreesClassifier, BaggingClassifier +from sklearn.neighbors import KNeighborsClassifier, NearestCentroid +from sklearn.metrics import confusion_matrix, classification_report +from natsort import natsorted +import random +import pickle +import numpy as np +from collections import defaultdict +from PolyBox import PolyBox +import warnings +warnings.filterwarnings("ignore") + + +#---------------------------------------- +def train_test_split(data_dict, test_size=0.2): + def create_xy(data_dict): + # used to shuffle data in a way that prevent any training data to be in the test set + y = np.array([]) + for label in data_dict: + y_tmp = np.array([label for _ in data_dict[label]]) + y = np.concatenate((y, y_tmp)) + + array = [] + for label in data_dict: + array.append(data_dict[label]) + + x = np.concatenate(array, axis=0) + # shuffling + permutation = np.random.permutation(x.shape[0]) + + permut = True + if permut: + x = x[permutation] + y = y[permutation] + + return x, y + + dict_train = {} + dict_test = {} + + for key, data in data_dict.items(): + icut = int(len(data)*test_size) + dict_test[key] = data[:icut] + dict_train[key] = data[icut:] + + x_train, y_train = create_xy(dict_train) + x_test, y_test = create_xy(dict_test) + + return np.array(x_train), np.array(y_train), np.array(x_test), np.array(y_test) + + +#---------------------------------------- +class TrainerML(PolyBox): + + #---------------------------------------- + # is exec first + def __init__(self): + PolyBox.__init__(self) + self.model_path = None + self.config_path = None + self.save_path = None + self.model = None + self.clf = None + self.config = None + self.std_settings = [] + self.clf_dependant_settings = None + + #---------------------------------------- + def on_initialize(self): + + try: + self.model_path = self.setting['Filename to save model to'] + except KeyError: + self.model_path = '' + if self.model_path == '': + print('No correct file location has been given for saving the model, thus it won\'t be saved') + + try: + self.test_set_share = float(self.setting['Test set share']) + + # wrong value + diff = (1 - self.test_set_share) + if diff <= 0 or diff > 1: + self.test_set_share = 0 + print('The value of the test set share must be between 0 and 1 (1 not included), no prediction will be performed') + + except KeyError: + self.test_set_share = 0 + print('The value of the test set share must be between 0 and 1 (1 not included), no prediction will be performed') + + try: + self.save_path = self.setting['Filename to load model from'] + self.model = pickle.load(open(self.save_path, 'rb')) + except KeyError: + self.save_path = '' + print('No correct location has been given to load the model from, thus a new model will be created.') + + # if model doesn't exist we will init a new one with params from the box + # FileNotFoundError doesn't exist in Python 2.7 + except IOError: + print('No correct location has been given to load the model from, thus a new model will be created.') + + # special case for Riemannian Geometry because it needs a pipeline + clf = self.setting['Classifier'] + + try: + discriminator, _ = self.map_clf(self.setting['Discriminator']) + except KeyError: + discriminator = None + + if clf == 'Riemann Tangent Space': + + if discriminator is not None: + self.clf = make_pipeline(Covariances(), TangentSpace(metric='riemann'), discriminator()) + else: + self.clf = make_pipeline(Covariances(), TangentSpace(metric='riemann'), LinearDiscriminantAnalysis()) + + elif clf == 'Riemann Minimum Distance to Mean': + if discriminator is not None: + self.clf = make_pipeline(Covariances(), MDM(metric=dict(mean='riemann', distance='riemann')), discriminator()) + else: + self.clf = make_pipeline(Covariances(), MDM(metric=dict(mean='riemann', distance='riemann'))) + + else: + self.clf, _ = self.map_clf(clf) + self.init_params() + + try: + self.clf = self.clf(**self.clf_dependant_settings) + except TypeError: + self.clf = self.clf() + + #---------------------------------------- + def init_params(self): + + # default settings + self.std_settings = ['Classifier', 'Discriminator', 'Filename to load model from', 'Test set share', + 'Filename to save configuration to', 'Filename to save model to', 'Clock frequency (Hz)', 'Labels'] + settings = [key for key in self.setting.keys()] + + # we get only settings that are clf relevant + clf_dependant_settings = list(set(settings) - set(self.std_settings)) + clf_dependant_settings = dict((k, v) for k, v in self.setting.items() if (k in clf_dependant_settings and len(v) > 0)) + + # we convert values that need to be + for k, v in clf_dependant_settings.items(): + + try: + expr = eval(v) + clf_dependant_settings[k] = expr + except: + if v.lower() == 'true': + clf_dependant_settings[k] = True + elif v.lower() == 'false': + clf_dependant_settings[k] = False + elif v.lower() == 'none': + clf_dependant_settings[k] = None + else: + pass + + self.clf_dependant_settings = clf_dependant_settings + + #---------------------------------------- + def map_clf(self, classifier): + """ + Returns the correct algorithm according to the classifier string + """ + + switcher = { + '': None, + 'None': None, + 'Nearest Centroid': NearestCentroid, + 'Nearest Neighbors Classifier': KNeighborsClassifier, + 'Gaussian Naive Bayes': GaussianNB, + 'Stochastic Gradient Descent': SGDClassifier, + 'Logistic Regression': LogisticRegression, + 'Decision Tree Classifier': DecisionTreeClassifier, + 'Extra Trees': ExtraTreesClassifier, + 'Bagging': BaggingClassifier, + 'Random Forest': RandomForestClassifier, + 'Support Vector Machine': LinearSVC, + 'Linear Discriminant Analysis': LinearDiscriminantAnalysis, + 'AdaBoost': AdaBoostClassifier, + 'Multi Layer Perceptron': MLPClassifier, + 'Linear SVC': LinearSVC, + } + clf = switcher.get(classifier, lambda: 'unknown classifier') + return clf, switcher + + #---------------------------------------- + def on_chunk_received(self, chunk, label, shape): + + # special case for riemannian geometry + if self.setting['Classifier'] == 'Riemann Minimum Distance to Mean' or self.setting['Classifier'] == 'Riemann Tangent Space': + numpyBuffer = np.array(chunk).reshape(shape) + self.data[label][-1] = numpyBuffer + + #---------------------------------------- + def on_end_box(self): + try: + self.train() + self.save() + except Exception as e: + print(e) + self.send_end_stim() + + #---------------------------------------- + def train(self): + x_train, y_train, x_test, y_test = train_test_split(self.data, self.test_set_share) + + if self.model != None: + self.clf = self.model + + self.clf.fit(x_train, y_train) + + # to be used in ProcessML + self.clf.custom_classifier = self.setting['Classifier'] + + if x_test.shape[0] > 0: + predictions = self.clf.predict(x_test) + report = classification_report(y_test, predictions, labels=list(self.data.keys())) + matrix = confusion_matrix(y_test, predictions) + + print("Report :\n{}\n".format(report)) + print("Confusion Matrix : \n{}\n".format(matrix)) + print("Fin de l'entrainement...") + + #---------------------------------------- + def save(self): + if self.model_path != "": + pickle.dump(self.clf, open(self.model_path, 'wb')) + print('Model saved in {}\n'.format(self.model_path)) + + +box = TrainerML() diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/CPolyBox.cpp b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/CPolyBox.cpp new file mode 100644 index 0000000..d3a80b0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/CPolyBox.cpp @@ -0,0 +1,1505 @@ +#if defined TARGET_HAS_ThirdPartyPython3 && !(defined(WIN32) && defined(TARGET_BUILDTYPE_Debug)) + +#include "CPolyBox.hpp" + +#if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace PyBox { + + +#define DICTIONNARY_REFERENCE(obj, ref, error)\ + obj = PyDict_GetItemString(m_mainDictionnary, ref);\ + if (obj == nullptr) { this->getLogManager() << Kernel::LogLevel_Error << error; return false; } + +//**************************** +//***** Static Functions ***** +//**************************** +///------------------------------------------------------------------------------------------------- +static bool appendToPyObject(PyObject* obj, PyObject* buffer) +{ + PyObject* methodToCall = PyUnicode_FromString("append"); + PyObject* result = PyObject_CallMethodObjArgs(buffer, methodToCall, obj, NULL); + Py_CLEAR(methodToCall); + if (result == nullptr) { return false; } + Py_CLEAR(result); + return true; +} + +static bool getLenFromPyObject(PyObject* obj, size_t& len) +{ + PyObject* pyLen = PyObject_CallMethod(obj, "__len__", nullptr); + if (pyLen == nullptr) { return false; } + len = size_t(PyLong_AsUnsignedLongMask(pyLen)); + Py_CLEAR(pyLen); + return true; +} + +static void getTimeFromPyObject(PyObject* obj, const char* attr, uint64_t& time) +{ + PyObject* pyTime = PyObject_GetAttrString(obj, attr); + time = CTime(PyFloat_AsDouble(pyTime)).time(); + Py_CLEAR(pyTime); +} + +static void getTimesFromPyObject(PyObject* obj, uint64_t& start, uint64_t& end) +{ + getTimeFromPyObject(obj, "startTime", start); + getTimeFromPyObject(obj, "endTime", end); +} + +static bool setMatrixInfosFromPyObject(PyObject* obj, CMatrix* matrix) +{ + PyObject* pyNDim = PyObject_CallMethod(obj, "getDimensionCount", nullptr); + if (pyNDim == nullptr) { return false; } + + const size_t nDim = PyLong_AsUnsignedLongMask(pyNDim); + matrix->setDimensionCount(nDim); + Py_CLEAR(pyNDim); + + PyObject* pySizeDim = PyObject_GetAttrString(obj, "dimensionSizes"); + PyObject* pyLabelDim = PyObject_GetAttrString(obj, "dimensionLabels"); + + size_t offset = 0; + for (size_t i = 0; i < nDim; ++i) + { + const size_t size = PyLong_AsUnsignedLongMask(PyList_GetItem(pySizeDim, Py_ssize_t(i))); + matrix->setDimensionSize(i, size); + for (size_t j = 0; j < size; ++j) { matrix->setDimensionLabel(i, j, PyBytes_AS_STRING(PyList_GetItem(pyLabelDim, offset + j))); } + offset = offset + size; + } + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return true; +} +///------------------------------------------------------------------------------------------------- + +bool CPolyBox::m_isInitialized = false; +PyObject* CPolyBox::m_mainModule = nullptr; +PyObject* CPolyBox::m_mainDictionnary = nullptr; +PyObject* CPolyBox::m_matrixHeader = nullptr; +PyObject* CPolyBox::m_matrixBuffer = nullptr; +PyObject* CPolyBox::m_matrixEnd = nullptr; +PyObject* CPolyBox::m_signalHeader = nullptr; +PyObject* CPolyBox::m_signalBuffer = nullptr; +PyObject* CPolyBox::m_signalEnd = nullptr; +PyObject* CPolyBox::m_stimulationHeader = nullptr; +PyObject* CPolyBox::m_stimulation = nullptr; +PyObject* CPolyBox::m_stimulationSet = nullptr; +PyObject* CPolyBox::m_stimulationEnd = nullptr; +PyObject* CPolyBox::m_buffer = nullptr; +PyObject* CPolyBox::m_execFileFunction = nullptr; +PyObject* CPolyBox::m_stdout = nullptr; +PyObject* CPolyBox::m_stderr = nullptr; + +bool CPolyBox::logSysStd(const bool out) +{ + PyObject* pyLog = PyObject_CallMethod((out ? m_stdout : m_stderr), "getvalue", nullptr); + if (pyLog == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to call sys.std" << (out ? "out" : "err") << ".getvalue().\n"; + return false; + } + + char* log = PyBytes_AS_STRING(PyUnicode_AsEncodedString(pyLog, "utf-8", "strict")); + if (log == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to convert pyLog to (char *).\n"; + Py_CLEAR(pyLog); + return false; + } + Py_CLEAR(pyLog); + + if (strlen(log) > 0) + { + this->getLogManager() << Kernel::LogLevel_Info << log; + PyObject* result = PyObject_CallMethod((out ? m_stdout : m_stderr), "flush", nullptr); + if (result == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to call sys.std" << (out ? "out" : "err") << ".flush().\n"; + return false; + } + Py_CLEAR(result); + } + return true; +} + +void CPolyBox::buildPythonSettings() +{ + const Kernel::IBox* boxCtx = getBoxAlgorithmContext()->getStaticBoxContext(); + for (uint32_t i = 1; i < boxCtx->getSettingCount(); ++i) + { + CString name; + boxCtx->getSettingName(i, name); + const CString value = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i); + PyDict_SetItemString(m_boxSetting, name.toASCIIString(), PyUnicode_FromString(value.toASCIIString())); + } +} + +bool CPolyBox::initializePythonSafely() +{ + // Only the first Python box does the initialization of the global parts + if (m_isInitialized) { return true; } + + this->getLogManager() << Kernel::LogLevel_Info << "Discovered Python is " << Py_GetVersion() << " (" << Py_GetPlatform() << ")\n"; + this->getLogManager() << Kernel::LogLevel_Debug << "The Python path is [" << Py_GetPath() << "]\n"; + + const std::string cmd = std::string("import sys\nsys.path.append('") + Directories::getDataDir().toASCIIString() + "/plugins/python3')\nsys.argv = [\"openvibe\"]\n"; + this->getLogManager() << Kernel::LogLevel_Trace << "Running [\n" << cmd << "\n].\n"; + + PyRun_SimpleString(cmd.c_str()); + + //Borrowed reference + m_mainModule = PyImport_AddModule("__main__"); + m_mainDictionnary = PyModule_GetDict(m_mainModule); + + // Open & Run Base + //**************************************** + const std::string path = std::string(Directories::getDataDir().toASCIIString()) + "/plugins/python3/PolyBox.py"; + std::ifstream file; + file.open(path); + if (!file.is_open()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to open '" << path << "'.\n"; + return false; + } + const std::string str((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + if (PyRun_SimpleString(str.c_str()) == -1) // Yolo but PyRun_File crash + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to run '" << path << "'.\n"; + return false; + } + file.close(); + //**************************************** + + // Apply References + //**************************************** + m_stdout = PySys_GetObject("stdout"); + if (m_stdout == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "sys.stdout does not exist.\n"; + return false; + } + m_stderr = PySys_GetObject("stderr"); + if (m_stderr == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "sys.stderr does not exist.\n"; + return false; + } + + DICTIONNARY_REFERENCE(m_execFileFunction, "execfileHandlingException", "PolyBox.py doesn't have a execfileHandlingException function, quitting.\n") + + if (!PyCallable_Check(m_execFileFunction)) + { + this->getLogManager() << Kernel::LogLevel_Error << "PolyBox.py doesn't have a execfileHandlingException function callable.\n"; + return false; + } + + //Streams + DICTIONNARY_REFERENCE(m_matrixHeader, "OVStreamedMatrixHeader", "Failed to load class \"OVStreamedMatrixHeader\".\n") + DICTIONNARY_REFERENCE(m_matrixBuffer, "OVStreamedMatrixBuffer", "Failed to load class \"OVStreamedMatrixBuffer\".\n") + DICTIONNARY_REFERENCE(m_matrixEnd, "OVStreamedMatrixEnd", "Failed to load class \"OVStreamedMatrixEnd\".\n") + + DICTIONNARY_REFERENCE(m_signalHeader, "OVSignalHeader", "Failed to load class \"OVSignalHeader\".\n") + DICTIONNARY_REFERENCE(m_signalBuffer, "OVSignalBuffer", "Failed to load class \"OVSignalBuffer\".\n") + DICTIONNARY_REFERENCE(m_signalEnd, "OVSignalEnd", "Failed to load class \"OVSignalEnd\".\n") + + DICTIONNARY_REFERENCE(m_stimulationHeader, "OVStimulationHeader", "Failed to load class \"OVStimulationHeader\".\n") + DICTIONNARY_REFERENCE(m_stimulation, "OVStimulation", "Failed to load class \"OVStimulation\".\n") + DICTIONNARY_REFERENCE(m_stimulationSet, "OVStimulationSet", "Failed to load class \"OVStimulationSet\".\n") + DICTIONNARY_REFERENCE(m_stimulationEnd, "OVStimulationEnd", "Failed to load class \"OVStimulationEnd\".\n") + + DICTIONNARY_REFERENCE(m_buffer, "OVBuffer", "Failed to load class \"OVBuffer\".\n") + + m_isInitialized = true; + this->getLogManager() << Kernel::LogLevel_Info << "Python Interpreter initialized\n"; + return true; +} + +bool CPolyBox::initialize() +{ + m_box = nullptr; + m_boxInput = nullptr; + m_boxOutput = nullptr; + m_boxTime = nullptr; + m_boxSetting = nullptr; + m_boxInitialize = nullptr; + m_boxProcess = nullptr; + m_boxUninitialize = nullptr; + m_initializeSucceeded = false; + + if (!initializePythonSafely()) { return false; } + + //Initialize the clock frequency of the box depending on the first setting of the box + m_clockFrequency = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + if (strlen(m_script.toASCIIString()) == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "You have to choose a script.\n"; + return false; + } + + //Create the decoders for the inputs + const Kernel::IBox& boxCtx = this->getStaticBoxContext(); + CIdentifier typeID; + for (size_t i = 0; i < boxCtx.getInputCount(); ++i) + { + boxCtx.getInputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { m_decoders.push_back(new Toolkit::TStreamedMatrixDecoder(*this, i)); } + else if (typeID == OV_TypeId_Signal) { m_decoders.push_back(new Toolkit::TSignalDecoder(*this, i)); } + else if (typeID == OV_TypeId_FeatureVector) { m_decoders.push_back(new Toolkit::TFeatureVectorDecoder(*this, i)); } + else if (typeID == OV_TypeId_Spectrum) { m_decoders.push_back(new Toolkit::TSpectrumDecoder(*this, i)); } + else if (typeID == OV_TypeId_ChannelLocalisation) { m_decoders.push_back(new Toolkit::TChannelLocalisationDecoder(*this, i)); } + else if (typeID == OV_TypeId_Stimulations) { m_decoders.push_back(new Toolkit::TStimulationDecoder(*this, i)); } + else if (typeID == OV_TypeId_ExperimentInfo) { m_decoders.push_back(new Toolkit::TExperimentInfoDecoder(*this, i)); } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Codec to decode " << typeID.str() << " is not implemented.\n"; + return false; + } + } + + //Create the encoders for the outputs + for (size_t i = 0; i < boxCtx.getOutputCount(); ++i) + { + boxCtx.getOutputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { m_encoders.push_back(new Toolkit::TStreamedMatrixEncoder(*this, i)); } + else if (typeID == OV_TypeId_Signal) { m_encoders.push_back(new Toolkit::TSignalEncoder(*this, i)); } + else if (typeID == OV_TypeId_FeatureVector) { m_encoders.push_back(new Toolkit::TFeatureVectorEncoder(*this, i)); } + else if (typeID == OV_TypeId_Spectrum) { m_encoders.push_back(new Toolkit::TSpectrumEncoder(*this, i)); } + else if (typeID == OV_TypeId_ChannelLocalisation) { m_encoders.push_back(new Toolkit::TChannelLocalisationEncoder(*this, i)); } + else if (typeID == OV_TypeId_Stimulations) { m_encoders.push_back(new Toolkit::TStimulationEncoder(*this, i)); } + else if (typeID == OV_TypeId_ExperimentInfo) { m_encoders.push_back(new Toolkit::TExperimentInfoEncoder(*this, i)); } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Codec to encode " << typeID.str() << " is not implemented.\n"; + return false; + } + } + + PyObject* pyTmp = Py_BuildValue("s,O", m_script.toASCIIString(), m_mainDictionnary); + if (pyTmp == nullptr) { this->getLogManager() << Kernel::LogLevel_Error << "Failed to load [" << m_script << "]"; } + + PyObject* result = PyObject_CallObject(m_execFileFunction, pyTmp); + if (result == nullptr || PyLong_AsLong(result) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to run [" << m_script << "], result = " + << (result ? std::to_string(PyLong_AsLong(result)) : "NULL") << "\n"; + logSysStdout(); + logSysStderr(); + Py_CLEAR(pyTmp); + Py_CLEAR(result); + return false; + } + + Py_CLEAR(pyTmp); + Py_CLEAR(result); + + m_box = PyObject_GetAttrString(m_mainModule, "box"); // la box qui vient juste d'etre creee + if (m_box == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load \"box\" object.\n"; + return false; + } + + m_boxInput = PyObject_GetAttrString(m_box, "input"); + if (m_boxInput == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load \"box.input\".\n"; + return false; + } + + m_boxOutput = PyObject_GetAttrString(m_box, "output"); + if (m_boxOutput == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load \"box.output\".\n"; + return false; + } + + std::string type; + for (size_t i = 0; i < boxCtx.getInputCount(); ++i) + { + boxCtx.getInputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { type = "StreamedMatrix"; } + else if (typeID == OV_TypeId_Signal) { type = "Signal"; } + else if (typeID == OV_TypeId_FeatureVector) { type = "FeatureVector"; } + else if (typeID == OV_TypeId_Spectrum) { type = "Spectrum"; } + else if (typeID == OV_TypeId_ChannelLocalisation) { type = "ChannelLocalisation"; } + else if (typeID == OV_TypeId_Stimulations) { type = "Stimulations"; } + else if (typeID == OV_TypeId_ExperimentInfo) { type = "ExperimentInfo"; } + PyObject* res = PyObject_CallMethod(m_box, "addInput", "s", type.c_str()); + if (res == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to call box.addInput().\n"; + return false; + } + Py_CLEAR(res); + } + + for (size_t i = 0; i < boxCtx.getOutputCount(); ++i) + { + boxCtx.getOutputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { type = "StreamedMatrix"; } + else if (typeID == OV_TypeId_Signal) { type = "Signal"; } + else if (typeID == OV_TypeId_FeatureVector) { type = "FeatureVector"; } + else if (typeID == OV_TypeId_Spectrum) { type = "Spectrum"; } + else if (typeID == OV_TypeId_ChannelLocalisation) { type = "ChannelLocalisation"; } + else if (typeID == OV_TypeId_Stimulations) { type = "Stimulations"; } + else if (typeID == OV_TypeId_ExperimentInfo) { type = "ExperimentInfo"; } + PyObject* res = PyObject_CallMethod(m_box, "addOutput", "s", type.c_str()); + if (res == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to call box.addOutput().\n"; + return false; + } + Py_CLEAR(res); + } + + m_boxSetting = PyObject_GetAttrString(m_box, "setting"); + if (m_boxSetting == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load \"box.setting\".\n"; + return false; + } + buildPythonSettings(); + + if (!PyObject_HasAttrString(m_box, "_clock")) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to initialize \"box._clock\" attribute because it does not exist.\n"; + return false; + } + + PyObject* pyBoxClock = PyLong_FromLong(long(m_clockFrequency)); + if (pyBoxClock == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to convert m_ClockFrequency into PyInt.\n"; + return false; + } + if (PyObject_SetAttrString(m_box, "_clock", pyBoxClock) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to initialize \"box._clock\" attribute.\n"; + return false; + } + Py_CLEAR(pyBoxClock); + + if (!PyObject_HasAttrString(m_box, "_currentTime")) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to initialize \"box._currentTime\" attribute because it does not exist.\n"; + return false; + } + + m_boxTime = PyFloat_FromDouble(CTime(this->getPlayerContext().getCurrentTime()).toSeconds()); + if (m_boxTime == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to convert the current time into a PyFloat.\n"; + return false; + } + if (PyObject_SetAttrString(m_box, "_currentTime", m_boxTime) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to initialize \"box._currentTime\" attribute.\n"; + return false; + } + + if (!PyObject_HasAttrString(m_box, "realInitialize")) + { + this->getLogManager() << Kernel::LogLevel_Error << "No realInitialize.\n"; + return false; + } + + m_boxInitialize = PyObject_GetAttrString(m_box, "realInitialize"); + if (m_boxInitialize == nullptr) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Failed to load \"box.realInitialize\" function.\n"; } + else if (!PyCallable_Check(m_boxInitialize)) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "\"box.realInitialize\" is not callable.\n"; } + + m_boxProcess = PyObject_GetAttrString(m_box, "realProcess"); + if (m_boxProcess == nullptr) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Failed to load \"box.realProcess\" function.\n"; } + else if (!PyCallable_Check(m_boxProcess)) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "\"box.realProcess\" is not callable.\n"; } + + m_boxUninitialize = PyObject_GetAttrString(m_box, "realUninitialize"); + if (m_boxUninitialize == nullptr) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Failed to load \"box.realUninitialize\" function.\n"; } + else if (!PyCallable_Check(m_boxUninitialize)) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "\"box.realUninitialize\" is not callable.\n"; } + + //Execute the initialize function defined in the python user script + if (m_boxInitialize && PyCallable_Check(m_boxInitialize)) + { + PyObject* res = PyObject_CallObject(m_boxInitialize, nullptr); + const bool stdoutError = logSysStdout(); // souci car la si l'init plante pas de sortie au bon endroit + const bool stderrError = logSysStderr(); + if ((res == nullptr) || (!stdoutError) || (!stderrError)) + { + if (res == nullptr) { this->getLogManager() << Kernel::LogLevel_Error << "Failed to call \"box.__initialize\" function.\n"; } + if (!stdoutError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStdout() failed during box.__initialization.\n"; } + if (!stderrError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStderr() failed during box.__initialization.\n"; } + Py_CLEAR(res); + return false; + } + Py_CLEAR(res); + } + + m_initializeSucceeded = true; + return true; +} + +bool CPolyBox::uninitialize() +{ + for (size_t i = 0; i < m_decoders.size(); ++i) + { + m_decoders[i]->uninitialize(); + delete m_decoders[i]; + } + m_decoders.clear(); + + for (size_t i = 0; i < m_encoders.size(); ++i) + { + m_encoders[i]->uninitialize(); + delete m_encoders[i]; + } + m_encoders.clear(); + + if (m_initializeSucceeded) // we call this uninit only if init had succeeded Execute the uninitialize function defined in the python script + { // il y a un souci ici si le script n'a pas ete charge ca ne passe pas + if (m_boxUninitialize && PyCallable_Check(m_boxUninitialize)) + { + PyObject* result = PyObject_CallObject(m_boxUninitialize, nullptr); + const bool stdoutError = logSysStdout(); + const bool stderrError = logSysStderr(); + if ((result == nullptr) || (!stdoutError) || (!stderrError)) + { + if (result == nullptr) { this->getLogManager() << Kernel::LogLevel_Error << "Failed to call \"box.__uninitialize\" function.\n"; } + if (!stdoutError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStdout() failed during box.__uninitialization.\n"; } + if (!stderrError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStderr() failed during box.__uninitialization.\n"; } + Py_CLEAR(result); + return false; + } + Py_CLEAR(result); + } + } + + // Note: Py_CLEAR is safe to use on NULL pointers, so we can clean everything here + Py_CLEAR(m_box); + Py_CLEAR(m_boxInput); + Py_CLEAR(m_boxOutput); + Py_CLEAR(m_boxTime); + Py_CLEAR(m_boxSetting); + Py_CLEAR(m_boxInitialize); + Py_CLEAR(m_boxProcess); + Py_CLEAR(m_boxUninitialize); + + // Py_Initialize() and Py_Finalize() are called in ovp_main.cpp, we never uninitialize Python here + + return true; +} + +bool CPolyBox::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CPolyBox::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CPolyBox::transferStreamedMatrixInputChunksToPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + + if (!PyList_Check(m_boxInput)) + { + this->getLogManager() << Kernel::LogLevel_Error << "box.input must be a list.\n"; + return false; + } + + PyObject* pyBuffer = PyList_GetItem(m_boxInput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.input[" << index << "].\n"; + return false; + } + //Expose input streamed matrix chunks to python + for (size_t idx = 0; idx < boxCtx.getInputChunkCount(index); ++idx) + { + m_decoders[index]->decode(idx); + + if (m_decoders[index]->isHeaderReceived()) + { + CMatrix* matrix = dynamic_cast*>(m_decoders[index])->getOutputMatrix(); + size_t nDim = matrix->getDimensionCount(); + + PyObject* pySizeDim = PyList_New(nDim); + if (pySizeDim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new list pySizeDim.\n"; + return false; + } + + PyObject* pyLabelDim = PyList_New(0); + if (pyLabelDim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new list pyLabelDim.\n"; + Py_CLEAR(pySizeDim); + return false; + } + + for (size_t i = 0; i < nDim; ++i) + { + size_t dimSize = matrix->getDimensionSize(i); + if (PyList_SetItem(pySizeDim, i, PyLong_FromLong(dimSize)) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item " << i << " in dimension size list.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + for (size_t j = 0; j < dimSize; ++j) + { + if (PyList_Append(pyLabelDim, PyUnicode_FromString(matrix->getDimensionLabel(i, j))) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append \"" << matrix->getDimensionLabel(i, j) << "\" in dimension label list.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + } + } + + PyObject* pyArg = PyTuple_New(4); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 2, pySizeDim) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 2 (dimension size) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 3, pyLabelDim) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 3 (dimension label) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + + PyObject* pyMatrixHeader = PyObject_Call(m_matrixHeader, pyArg, nullptr); + if (pyMatrixHeader == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStreamedMatrixHeader pyMatrixHeader.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + + if (!appendToPyObject(pyMatrixHeader, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVStreamedMatrixHeader to box.input[" << index << "].\n"; + Py_CLEAR(pyMatrixHeader); + return false; + } + Py_CLEAR(pyMatrixHeader); + } + + if (m_decoders[index]->isBufferReceived()) + { + PyObject* pyArg = PyTuple_New(3); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 2, PyList_New(0)) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 2 (bufferElements) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + PyObject* pyMatrixBuffer = PyObject_Call(m_matrixBuffer, pyArg, nullptr); + if (pyMatrixBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStreamedMatrixBuffer pyMatrixBuffer.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + CMatrix* matrix = dynamic_cast*>(m_decoders[index])->getOutputMatrix(); + double* bufferBase = matrix->getBuffer(); + for (size_t i = 0; i < matrix->getBufferElementCount(); ++i) + { + if (PyList_Append(pyMatrixBuffer, PyFloat_FromDouble(bufferBase[i])) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append element " << i << " to pyMatrixBuffer.\n"; + Py_CLEAR(pyMatrixBuffer); + return false; + } + } + + if (!appendToPyObject(pyMatrixBuffer, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVStreamedMatrixBuffer to box.input[" << index << "].\n"; + Py_CLEAR(pyMatrixBuffer); + return false; + } + Py_CLEAR(pyMatrixBuffer); + } + + if (m_decoders[index]->isEndReceived()) + { + PyObject* pyArg = PyTuple_New(2); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + PyObject* pyMatrixEnd = PyObject_Call(m_matrixEnd, pyArg, nullptr); + if (pyMatrixEnd == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStreamedMatrixEnd pyMatrixEnd.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + if (!appendToPyObject(pyMatrixEnd, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVStreamedMatrixEnd to box.input[" << index << "].\n"; + Py_CLEAR(pyMatrixEnd); + return false; + } + Py_CLEAR(pyMatrixEnd); + } + } + + return true; +} + +bool CPolyBox::transferStreamedMatrixOutputChunksFromPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + CMatrix* matrix = dynamic_cast*>(m_encoders[index])->getInputMatrix(); + + if (!PyList_Check(m_boxOutput)) + { + this->getLogManager() << Kernel::LogLevel_Error << "box.output must be a list.\n"; + return false; + } + + PyObject* pyBuffer = PyList_GetItem(m_boxOutput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].\n"; + return false; + } + + size_t len; + if (!getLenFromPyObject(pyBuffer, len)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].__len__().\n"; + return false; + } + + for (size_t idx = 0; idx < len; ++idx) + { + PyObject* pyChunk = PyObject_CallMethod(pyBuffer, "pop", nullptr); + if (pyChunk == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get item " << idx << " of box.output[" << index << "].\n"; + return false; + } + + if (PyObject_IsInstance(pyChunk, m_matrixHeader) == 1) + { + if (!setMatrixInfosFromPyObject(pyChunk, matrix)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to call chunk's getDimensionCount method.\n"; + Py_CLEAR(pyChunk); + return false; + } + + m_encoders[index]->encodeHeader(); + + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_matrixBuffer) == 1) + { + double* bufferBase = matrix->getBuffer(); + for (size_t i = 0; i < matrix->getBufferElementCount(); ++i) { bufferBase[i] = PyFloat_AsDouble(PyList_GetItem(pyChunk, i)); } + + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeBuffer(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_matrixEnd) == 1) + { + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeEnd(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Unexpected object type for item " << idx << " in box.output[" << index << "].\n"; + Py_CLEAR(pyChunk); + return false; + } + + Py_CLEAR(pyChunk); + } + return true; +} + +bool CPolyBox::transferSignalInputChunksToPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + + if (!PyList_Check(m_boxInput)) + { + this->getLogManager() << Kernel::LogLevel_Error << "box.input must be a list.\n"; + return false; + } + + PyObject* pyBuffer = PyList_GetItem(m_boxInput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.input[" << index << "].\n"; + return false; + } + //Expose input signal chunks to python + for (size_t idx = 0; idx < boxCtx.getInputChunkCount(index); ++idx) + { + m_decoders[index]->decode(idx); + + if (m_decoders[index]->isHeaderReceived()) + { + CMatrix* matrix = dynamic_cast*>(m_decoders[index])->getOutputMatrix(); + size_t nDim = matrix->getDimensionCount(); + + PyObject* pySizeDim = PyList_New(nDim); + if (pySizeDim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new list pySizeDim.\n"; + return false; + } + + PyObject* pyLabelDim = PyList_New(0); + if (pyLabelDim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new list pyLabelDim.\n"; + Py_CLEAR(pySizeDim); + return false; + } + + for (size_t i = 0; i < nDim; ++i) + { + size_t dimSize = matrix->getDimensionSize(i); + if (PyList_SetItem(pySizeDim, i, PyLong_FromLong(dimSize)) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item " << i << " in dimension size list.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + for (size_t j = 0; j < dimSize; ++j) + { + if (PyList_Append(pyLabelDim, PyUnicode_FromString(matrix->getDimensionLabel(i, j))) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append \"" << matrix->getDimensionLabel(i, j) << "\" in dimension label list.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + } + } + + PyObject* pyArg = PyTuple_New(5); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 2, pySizeDim) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 2 (dimension size) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 3, pyLabelDim) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 3 (dimension label) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem( + pyArg, 4, PyLong_FromLong(long(dynamic_cast*>(m_decoders[index])->getOutputSamplingRate()))) + != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 4 (samplingRate) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + + PyObject* pySignalHeader = PyObject_Call(m_signalHeader, pyArg, nullptr); + if (pySignalHeader == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVSignalHeader pySignalHeader.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + + if (!appendToPyObject(pySignalHeader, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVSignalHeader to box.input[" << index << "].\n"; + Py_CLEAR(pySignalHeader); + return false; + } + Py_CLEAR(pySignalHeader); + } + + if (m_decoders[index]->isBufferReceived()) + { + PyObject* pyArg = PyTuple_New(3); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (startTime) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (endTime) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 2, PyList_New(0)) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 2 (bufferElements) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + PyObject* pySignalBuffer = PyObject_Call(m_signalBuffer, pyArg, nullptr); + if (pySignalBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVSignalBuffer pySignalBuffer.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + CMatrix* matrix = dynamic_cast*>(m_decoders[index])->getOutputMatrix(); + double* bufferBase = matrix->getBuffer(); + for (size_t i = 0; i < matrix->getBufferElementCount(); ++i) + { + if (PyList_Append(pySignalBuffer, PyFloat_FromDouble(bufferBase[i])) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append element " << i << " to pySignalBuffer.\n"; + Py_CLEAR(pySignalBuffer); + return false; + } + } + + if (!appendToPyObject(pySignalBuffer, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVSignalBuffer to box.input[" << index << "].\n"; + Py_CLEAR(pySignalBuffer); + return false; + } + Py_CLEAR(pySignalBuffer); + } + + if (m_decoders[index]->isEndReceived()) + { + PyObject* pyArg = PyTuple_New(2); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + PyObject* pySignalEnd = PyObject_Call(m_signalEnd, pyArg, nullptr); + if (pySignalEnd == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new m_signalEnd pySignalEnd.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + if (!appendToPyObject(pySignalEnd, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVSignalEnd to box.input[" << index << "].\n"; + Py_CLEAR(pySignalEnd); + return false; + } + Py_CLEAR(pySignalEnd); + } + } + return true; +} + +bool CPolyBox::transferSignalOutputChunksFromPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + CMatrix* matrix = dynamic_cast*>(m_encoders[index])->getInputMatrix(); + + if (!PyList_Check(m_boxOutput)) + { + this->getLogManager() << Kernel::LogLevel_Error << "box.output must be a list.\n"; + return false; + } + + PyObject* pyBuffer = PyList_GetItem(m_boxOutput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].\n"; + return false; + } + + size_t len; + if (!getLenFromPyObject(pyBuffer, len)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].__len__().\n"; + return false; + } + + for (size_t idx = 0; idx < len; ++idx) + { + PyObject* pyChunk = PyObject_CallMethod(pyBuffer, "pop", nullptr); + if (pyChunk == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get item " << idx << " of box.output[" << index << "].\n"; + return false; + } + + if (PyObject_IsInstance(pyChunk, m_signalHeader) == 1) + { + if (!setMatrixInfosFromPyObject(pyChunk, matrix)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to call chunk's getDimensionCount method.\n"; + Py_CLEAR(pyChunk); + return false; + } + + PyObject* pySampling = PyObject_GetAttrString(pyChunk, "samplingRate"); + if (pySampling == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load signal header sampling rate.\n"; + return false; + } + Kernel::TParameterHandler& sampling = dynamic_cast*>(m_encoders[index])->getInputSamplingRate(); + sampling = uint64_t(PyLong_AsLong(pySampling)); + m_encoders[index]->encodeHeader(); + Py_CLEAR(pySampling); + + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_signalBuffer) == 1) + { + double* bufferBase = matrix->getBuffer(); + for (size_t i = 0; i < matrix->getBufferElementCount(); ++i) { bufferBase[i] = PyFloat_AsDouble(PyList_GetItem(pyChunk, i)); } + + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeBuffer(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_signalEnd) == 1) + { + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeEnd(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Unexpected object type for item " << idx << " in box.output[" << index << "].\n"; + Py_CLEAR(pyChunk); + return false; + } + + Py_CLEAR(pyChunk); + } + return true; +} + +bool CPolyBox::transferStimulationInputChunksToPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + PyObject* pyBuffer = PyList_GetItem(m_boxInput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.input[" << index << "].\n"; + return false; + } + for (size_t idx = 0; idx < boxCtx.getInputChunkCount(index); ++idx) + { + m_decoders[index]->decode(idx); + + if (m_decoders[index]->isHeaderReceived()) + { + PyObject* pyArg = PyTuple_New(2); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + PyObject* pyStimHeader = PyObject_Call(m_stimulationHeader, pyArg, nullptr); + if (pyStimHeader == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStimulationHeader pyStimHeader.\n"; + PyErr_Print(); + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + if (!appendToPyObject(pyStimHeader, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVStimulationHeader to box.input[" << index << "].\n"; + Py_CLEAR(pyStimHeader); + return false; + } + Py_CLEAR(pyStimHeader); + } + + if (m_decoders[index]->isBufferReceived()) + { + IStimulationSet* stimSet = dynamic_cast*>(m_decoders[index])->getOutputStimulationSet(); + + PyObject* pyArg = PyTuple_New(2); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + PyObject* pyStimSet = PyObject_Call(m_stimulationSet, pyArg, nullptr); + if (pyStimSet == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStimulationSet pyStimSet.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + for (size_t i = 0; i < stimSet->getStimulationCount(); ++i) + { + const uint64_t id = stimSet->getStimulationIdentifier(i); + const uint64_t date = stimSet->getStimulationDate(i); + const uint64_t duration = stimSet->getStimulationDuration(i); + + pyArg = PyTuple_New(3); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyLong_FromLong(long(id))) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (identifier) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(date).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (date) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 2, PyFloat_FromDouble(CTime(duration).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 2 (duration) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + PyObject* pyStim = PyObject_Call(m_stimulation, pyArg, nullptr); + if (pyStim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStimulation pyStim.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + if (!appendToPyObject(pyStim, pyStimSet)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append stimulation to box.input[" << index << "].\n"; + Py_CLEAR(pyStim); + return false; + } + Py_CLEAR(pyStim); + } + + if (!appendToPyObject(pyStimSet, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append stimulation to box.input[" << index << "].\n"; + Py_CLEAR(pyStimSet); + return false; + } + Py_CLEAR(pyStimSet); + } + + if (m_decoders[index]->isEndReceived()) + { + PyObject* pyArg = PyTuple_New(2); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + PyObject* pyStimEnd = PyObject_Call(m_stimulationEnd, pyArg, nullptr); + if (pyStimEnd == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStimulationEnd pyStimEnd.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + if (!appendToPyObject(pyStimEnd, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVStimulationEnd to box.input[" << index << "].\n"; + Py_CLEAR(pyStimEnd); + return false; + } + Py_CLEAR(pyStimEnd); + } + } + return true; +} + +bool CPolyBox::transferStimulationOutputChunksFromPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + IStimulationSet* stimSet = dynamic_cast*>(m_encoders[index])->getInputStimulationSet(); + + if (!PyList_Check(m_boxOutput)) + { + this->getLogManager() << Kernel::LogLevel_Error << "box.output must be a list.\n"; + return false; + } + + PyObject* pyBuffer = PyList_GetItem(m_boxOutput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].\n"; + return false; + } + + size_t len; + if (!getLenFromPyObject(pyBuffer, len)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].__len__().\n"; + return false; + } + + for (size_t idx = 0; idx < len; ++idx) + { + PyObject* pyChunk = PyObject_CallMethod(pyBuffer, "pop", nullptr); + if (pyChunk == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get item " << idx << " of box.output[" << index << "].\n"; + return false; + } + + if (PyObject_IsInstance(pyChunk, m_stimulationHeader) == 1) + { + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + stimSet->setStimulationCount(0); + m_encoders[index]->encodeHeader(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_stimulationSet) == 1) + { + size_t chunkLen; + if (!getLenFromPyObject(pyChunk, chunkLen)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get stimulations set length.\n"; + return false; + } + + stimSet->setStimulationCount(0); + for (size_t i = 0; i < chunkLen; ++i) + { + PyObject* pyStim = PyList_GetItem(pyChunk, Py_ssize_t(i)); + if (pyStim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get item " << i << " of chunk " << idx << ".\n"; + return false; + } + if (PyObject_IsInstance(pyStim, m_stimulation) < 1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Item " << i << " is not an OVStimulation.\n"; + return false; + } + + PyObject* pyID = PyObject_GetAttrString(pyStim, "identifier"); + const uint64_t id = uint64_t(PyFloat_AsDouble(pyID)); + Py_CLEAR(pyID); + + uint64_t date, duration; + getTimeFromPyObject(pyStim, "date", date); + getTimeFromPyObject(pyStim, "duration", duration); + + stimSet->appendStimulation(id, date, duration); + } + + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeBuffer(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_stimulationEnd) == 1) + { + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeEnd(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Unexpected object type for item " << idx << " in box.output[" << index << "].\n"; + Py_CLEAR(pyChunk); + return false; + } + + Py_CLEAR(pyChunk); + } + return true; +} + +bool CPolyBox::process() +{ + const Kernel::IBox& boxCtx = this->getStaticBoxContext(); + CIdentifier typeID; + + for (size_t i = 0; i < boxCtx.getInputCount(); ++i) + { + boxCtx.getInputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { if (!transferStreamedMatrixInputChunksToPython(i)) { return false; } } + else if (typeID == OV_TypeId_Signal) { if (!transferSignalInputChunksToPython(i)) { return false; } } + else if (typeID == OV_TypeId_Stimulations) { if (!transferStimulationInputChunksToPython(i)) { return false; } } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Codec to decode " << typeID.str() << " is not implemented.\n"; + return false; + } + } + + //update the python current time + m_boxTime = PyFloat_FromDouble(CTime(this->getPlayerContext().getCurrentTime()).toSeconds()); + if (m_boxTime == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to convert the current time into a PyFloat during update.\n"; + return false; + } + if (PyObject_SetAttrString(m_box, "_currentTime", m_boxTime) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to update \"box._currentTime\" attribute.\n"; + return false; + } + + //call the python process function + if (m_boxProcess && PyCallable_Check(m_boxProcess)) + { + PyObject* result = PyObject_CallObject(m_boxProcess, nullptr); + const bool stdoutError = logSysStdout(); + const bool stderrError = logSysStderr(); + if ((result == nullptr) || (!stdoutError) || (!stderrError)) + { + if (result == nullptr) { this->getLogManager() << Kernel::LogLevel_Error << "Failed to call \"box.__process\" function.\n"; } + if (!stdoutError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStdout() failed during box.__process.\n"; } + if (!stderrError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStderr() failed during box.__process.\n"; } + Py_CLEAR(result); + return false; + } + Py_CLEAR(result); + } + + for (size_t i = 0; i < boxCtx.getOutputCount(); ++i) + { + boxCtx.getOutputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { if (!transferStreamedMatrixOutputChunksFromPython(i)) { return false; } } + else if (typeID == OV_TypeId_Signal) { if (!transferSignalOutputChunksFromPython(i)) { return false; } } + else if (typeID == OV_TypeId_Stimulations) { if (!transferStimulationOutputChunksFromPython(i)) { return false; } } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Codec to encode " << typeID.str() << " is not implemented.\n"; + return false; + } + } + return true; +} + +} // namespace PyBox +} // namespace Plugins +} // namespace OpenViBE +#endif // #if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) +#endif // TARGET_HAS_ThirdPartyPython3 diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/CPolyBox.hpp b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/CPolyBox.hpp new file mode 100644 index 0000000..414f1ec --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/CPolyBox.hpp @@ -0,0 +1,120 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovpADA.h +/// \brief Class NewBoxPattern +/// \author Thibaut Monseigne (Inria) & Jimmy Leblanc (Polymont) & Yannis Bendi-Ouis (Polymont) +/// \version 1.0. +/// \date 12/03/2020. +/// \copyright +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace PyBox { +/// Enumeration of Adaptation Methods for classifier. +enum class EClassifier +{ + NearestCentroid, NearestNeighbors, GaussianNaiveBayes, StochasticGradientDescent, LogisticRegression, DecisionTree, ExtraTrees, + Bagging, RandomForest, SVM, LDA, AdaBoost, MultiLayerPerceptron, MDM, TangentSpace, None +}; + +/// Convert classifier to string. +/// The type of classifier. +/// std::string +inline std::string toString(const EClassifier type) +{ + switch (type) + { + case EClassifier::None: return "None"; + case EClassifier::NearestCentroid: return "Nearest Centroid"; + case EClassifier::NearestNeighbors: return "Nearest Neighbors"; + case EClassifier::GaussianNaiveBayes: return "Gaussian Naive Bayes"; + case EClassifier::StochasticGradientDescent: return "Stochastic Gradient Descent"; + case EClassifier::LogisticRegression: return "Logistic Regression"; + case EClassifier::DecisionTree: return "Decision Tree"; + case EClassifier::ExtraTrees: return "Extra Trees"; + case EClassifier::Bagging: return "Bagging"; + case EClassifier::RandomForest: return "Random Forest"; + case EClassifier::SVM: return "Support Vector Machine"; + case EClassifier::LDA: return "Linear Discriminant Analysis"; + case EClassifier::AdaBoost: return "AdaBoost"; + case EClassifier::MultiLayerPerceptron: return "Multi Layer Perceptron"; + case EClassifier::MDM: return "Riemann Minimum Distance to Mean"; + case EClassifier::TangentSpace: return "Riemann Tangent Space"; + default: return "Invalid"; + } +} + +class CPolyBox : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + uint64_t getClockFrequency() override { return m_clockFrequency << 32; } + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool processInput(size_t index) override; + bool process() override; + +protected: + + uint64_t m_clockFrequency = 0; + CString m_script; + + std::vector*> m_decoders; + std::vector*> m_encoders; + + // These are all borrowed references in python v2.7. Do not free them. + static bool m_isInitialized; + + static PyObject *m_mainModule, *m_mainDictionnary; + static PyObject *m_matrixHeader, *m_matrixBuffer, *m_matrixEnd; + static PyObject *m_signalHeader, *m_signalBuffer, *m_signalEnd; + static PyObject *m_stimulationHeader, *m_stimulation, *m_stimulationSet, *m_stimulationEnd; + static PyObject* m_buffer; + static PyObject* m_execFileFunction; + static PyObject *m_stdout, *m_stderr; + + + //std::map m_PyObjectMap; + PyObject *m_box = nullptr, *m_boxInput = nullptr, *m_boxOutput = nullptr, *m_boxSetting = nullptr, *m_boxTime = nullptr; + PyObject *m_boxInitialize = nullptr, *m_boxProcess = nullptr, *m_boxUninitialize = nullptr; + bool m_initializeSucceeded = false; + + + bool logSysStd(const bool out); + bool logSysStdout() { return logSysStd(true); } + bool logSysStderr() { return logSysStd(false); } + void buildPythonSettings(); + + bool initializePythonSafely(); + bool transferStreamedMatrixInputChunksToPython(const size_t index); + bool transferStreamedMatrixOutputChunksFromPython(const size_t index); + bool transferSignalInputChunksToPython(const size_t index); + bool transferSignalOutputChunksFromPython(const size_t index); + bool transferStimulationInputChunksToPython(const size_t index); + bool transferStimulationOutputChunksFromPython(const size_t index); +}; +} // namespace PyBox +} // namespace Plugins +} // namespace OpenViBE + +#endif // #if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) + +#endif // TARGET_HAS_ThirdPartyPython3 diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/DataViz.hpp b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/DataViz.hpp new file mode 100644 index 0000000..411ef24 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/DataViz.hpp @@ -0,0 +1,99 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file DataViz.hpp +/// \brief Class NewBoxPattern +/// \author Thibaut Monseigne (Inria) & Jimmy Leblanc (Polymont) & Yannis Bendi-Ouis (Polymont) +/// \version 1.0. +/// \date 12/03/2020. +/// \copyright , OVP_ClassId_BoxAlgorithm_DataViz) +}; + +class CBoxAlgorithmDataVizListener final : public Toolkit::TBoxListener +{ +public: + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + box.setInputType(index, OV_TypeId_StreamedMatrix); + return true; + } + + _IsDerivedFromClass_Final_(OpenViBE::Toolkit::TBoxListener < OpenViBE::Plugins::IBoxListener >, CIdentifier::undefined()) +}; + +class CBoxAlgorithmDataVizDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("DataViz"); } + CString getAuthorName() const override { return CString("Yannis Bendi-Ouis & Jimmy Leblanc"); } + CString getAuthorCompanyName() const override { return CString("Polymont IT Services"); } + CString getShortDescription() const override { return CString("Transform the data with a LDA or a PCA and plot the data in 2D or 3D."); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Scripting/PyBox"); } + CString getVersion() const override { return CString("0.1"); } + CString getStockItemName() const override { return CString("gtk-convert"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_DataViz; } + IPluginObject* create() override { return new CBoxAlgorithmDataViz; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmDataVizListener; } + void releaseBoxListener(IBoxListener* pBoxListener) const override { delete pBoxListener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("Clock frequency (Hz)", OV_TypeId_Integer, "64"); + // settings + prototype.addSetting("Path to save the model", OV_TypeId_Filename, ""); + prototype.addSetting("Path to load the model", OV_TypeId_Filename, ""); + prototype.addSetting("Algorithm (PCA or LDA)", OV_TypeId_String, "PCA"); + prototype.addSetting("Dimension reduction", OV_TypeId_Integer, "2"); + prototype.addSetting("Labels", OV_TypeId_String, ""); + + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + prototype.addFlag(Kernel::BoxFlag_CanAddSetting); + prototype.addFlag(Kernel::BoxFlag_CanModifySetting); + + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_Stimulations); + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + + prototype.addOutputSupport(OV_TypeId_Signal); + prototype.addOutputSupport(OV_TypeId_Stimulations); + prototype.addOutputSupport(OV_TypeId_StreamedMatrix); + + // input & output + prototype.addOutput("stim_out", OV_TypeId_Stimulations); + prototype.addInput("input_StreamMatrix", OV_TypeId_StreamedMatrix); + prototype.addInput("input_Stimulations", OV_TypeId_Stimulations); + + return true; + } + + _IsDerivedFromClass_Final_(OpenViBE::Plugins::IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_DataVizDesc) +}; +} // namespace PyBox +} // namespace Plugins +} // namespace OpenViBE + +#endif // #if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) + +#endif // TARGET_HAS_ThirdPartyPython3 diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/DatasetCreator.hpp b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/DatasetCreator.hpp new file mode 100644 index 0000000..436c7fb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/DatasetCreator.hpp @@ -0,0 +1,101 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file DatasetCreator.hpp +/// \brief Class NewBoxPattern +/// \author Thibaut Monseigne (Inria) & Jimmy Leblanc (Polymont) & Yannis Bendi-Ouis (Polymont) +/// \version 1.0. +/// \date 12/03/2020. +/// \copyright , OVP_ClassId_BoxAlgorithm_DatasetCreator) +}; + +class CBoxAlgorithmDatasetCreatorListener final : public Toolkit::TBoxListener +{ +public: + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + box.setInputType(index, OV_TypeId_StreamedMatrix); + return true; + } + + _IsDerivedFromClass_Final_(OpenViBE::Toolkit::TBoxListener < OpenViBE::Plugins::IBoxListener >, CIdentifier::undefined()) +}; + +class CBoxAlgorithmDatasetCreatorDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("DatasetCreator"); } + CString getAuthorName() const override { return CString("Yannis Bendi-Ouis & Jimmy LeBlanc"); } + CString getAuthorCompanyName() const override { return CString("Polymont IT Services"); } + CString getShortDescription() const override { return CString("Monitor the user to create a dataset."); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Scripting/PyBox"); } + CString getVersion() const override { return CString("0.1"); } + CString getStockItemName() const override { return CString("gtk-convert"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_DatasetCreator; } + IPluginObject* create() override { return new CBoxAlgorithmDatasetCreator; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmDatasetCreatorListener; } + void releaseBoxListener(IBoxListener* pBoxListener) const override { delete pBoxListener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("Clock frequency (Hz)", OV_TypeId_Integer, "64"); + // settings + prototype.addSetting("Path directory", OV_TypeId_Filename, "${Player_ScenarioDirectory}/datas/"); + prototype.addSetting("Label_1", OV_TypeId_String, "right"); + prototype.addSetting("Label_2", OV_TypeId_String, "left"); + prototype.addSetting("Label_3", OV_TypeId_String, "up"); + prototype.addSetting("Label_4", OV_TypeId_String, "down"); + prototype.addSetting("Several CSV", OV_TypeId_Boolean, "false"); + prototype.addSetting("Number of folds", OV_TypeId_Integer, "1"); + prototype.addSetting("Number of actions", OV_TypeId_Integer, "4"); + + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + prototype.addFlag(Kernel::BoxFlag_CanAddSetting); + prototype.addFlag(Kernel::BoxFlag_CanModifySetting); + + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_Stimulations); + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + + prototype.addOutputSupport(OV_TypeId_Signal); + prototype.addOutputSupport(OV_TypeId_Stimulations); + prototype.addOutputSupport(OV_TypeId_StreamedMatrix); + + // input & output + prototype.addOutput("stim_out", OV_TypeId_Stimulations); + prototype.addInput("input_StreamMatrix", OV_TypeId_StreamedMatrix); + + return true; + } + + _IsDerivedFromClass_Final_(OpenViBE::Plugins::IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_DatasetCreatorDesc) +}; +} // namespace PyBox +} // namespace Plugins +} // namespace OpenViBE + +#endif // #if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) + +#endif // TARGET_HAS_ThirdPartyPython3 diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/ProcessML.hpp b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/ProcessML.hpp new file mode 100644 index 0000000..c319364 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/ProcessML.hpp @@ -0,0 +1,98 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ProcessML.hpp +/// \brief Class NewBoxPattern +/// \author Thibaut Monseigne (Inria) & Jimmy Leblanc (Polymont) & Yannis Bendi-Ouis (Polymont) +/// \version 1.0. +/// \date 12/03/2020. +/// \copyright , OVP_ClassId_BoxAlgorithm_ProcessML) +}; + +class CBoxAlgorithmProcessMLListener final : public Toolkit::TBoxListener +{ +public: + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + box.setInputType(index, OV_TypeId_StreamedMatrix); + return true; + } + + _IsDerivedFromClass_Final_(OpenViBE::Toolkit::TBoxListener < OpenViBE::Plugins::IBoxListener >, CIdentifier::undefined()) +}; + +class CBoxAlgorithmProcessMLDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Process Sklearn"); } + CString getAuthorName() const override { return CString("Jimmy Leblanc & Yannis Bendi-Ouis"); } + CString getAuthorCompanyName() const override { return CString("Polymont IT Services"); } + CString getShortDescription() const override + { + return CString("This box aim to use a machine learning model previously trained to predict labels of input's data."); + } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Scripting/PyBox"); } + CString getVersion() const override { return CString("0.1"); } + CString getStockItemName() const override { return CString("gtk-convert"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ProcessML; } + IPluginObject* create() override { return new CBoxAlgorithmProcessML; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmProcessMLListener; } + void releaseBoxListener(IBoxListener* pBoxListener) const override { delete pBoxListener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("Clock frequency (Hz)", OV_TypeId_Integer, "64"); + // settings + prototype.addSetting("Model filename", OV_TypeId_Filename, "${Player_ScenarioDirectory}/model.clf"); + prototype.addSetting("Predictions filename", OV_TypeId_Filename, ""); + + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + prototype.addFlag(Kernel::BoxFlag_CanAddSetting); + prototype.addFlag(Kernel::BoxFlag_CanModifySetting); + + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_Stimulations); + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + + prototype.addOutputSupport(OV_TypeId_Signal); + prototype.addOutputSupport(OV_TypeId_Stimulations); + prototype.addOutputSupport(OV_TypeId_StreamedMatrix); + + // input & output + prototype.addOutput("stim_out", OV_TypeId_Stimulations); + prototype.addInput("input_StreamMatrix", OV_TypeId_StreamedMatrix); + + return true; + } + + _IsDerivedFromClass_Final_(OpenViBE::Plugins::IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ProcessMLDesc) +}; +} // namespace PyBox +} // namespace Plugins +} // namespace OpenViBE + +#endif // #if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) + +#endif // TARGET_HAS_ThirdPartyPython3 diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/TrainerML.cpp b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/TrainerML.cpp new file mode 100644 index 0000000..1854e79 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/TrainerML.cpp @@ -0,0 +1,257 @@ +#include "TrainerML.hpp" +#include +#include + +#if defined TARGET_HAS_ThirdPartyPython3 && !(defined(WIN32) && defined(TARGET_BUILDTYPE_Debug)) +#if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) + +namespace OpenViBE { +namespace Plugins { +namespace PyBox { + +static const std::vector> ADA_BOOST_SETTING = { + std::make_tuple("Test set share", OV_TypeId_Float, "0.2"), + std::make_tuple("Labels", OV_TypeId_String, ""), + std::make_tuple("n_estimators", OV_TypeId_Integer, "50"), + std::make_tuple("learning_rate", OV_TypeId_Float, "1.0"), + std::make_tuple("algorithm", OVPoly_ClassId_ADA_algorithm, "SAMME.R"), + std::make_tuple("random_state", OV_TypeId_String, "None") +}; + +static const std::vector> BAGGING_SETTING = { + std::make_tuple("Test set share", OV_TypeId_Float, "0.2"), + std::make_tuple("Labels", OV_TypeId_String, ""), + std::make_tuple("max_features", OV_TypeId_Float, "1.0"), + std::make_tuple("random_state", OV_TypeId_String, "None"), + std::make_tuple("n_estimators", OV_TypeId_Integer, "10"), + std::make_tuple("bootstrap", OV_TypeId_Boolean, "true"), + std::make_tuple("bootstrap_features", OV_TypeId_Boolean, "false"), + std::make_tuple("oob_score", OV_TypeId_Boolean, "false"), + std::make_tuple("warm_start", OV_TypeId_Boolean, "false"), + std::make_tuple("n_jobs", OV_TypeId_String, "None"), + std::make_tuple("verbose", OV_TypeId_Integer, "0") +}; + +static const std::vector> TREE_SETTING = { + std::make_tuple("Test set share", OV_TypeId_Float, "0.2"), + std::make_tuple("Labels", OV_TypeId_String, ""), + std::make_tuple("criterion", OVPoly_ClassId_Criterion, "gini"), + std::make_tuple("splitter", OVPoly_ClassId_DecisionTree_splitter, "best"), + std::make_tuple("max_depth", OV_TypeId_String, "None"), + std::make_tuple("min_samples_split", OV_TypeId_Float, "2"), + std::make_tuple("min_samples_leaf", OV_TypeId_Float, "1"), + std::make_tuple("min_weight_fraction_leaf", OV_TypeId_Float, "0"), + std::make_tuple("max_features", OV_TypeId_String, "None"), + std::make_tuple("random_state", OV_TypeId_String, "None"), + std::make_tuple("max_leaf_nodes", OV_TypeId_String, "None"), + std::make_tuple("min_impurity_decrease", OV_TypeId_Float, "0"), + std::make_tuple("min_impurity_split", OV_TypeId_Float, "1e-7") +}; + +static const std::vector> XTREE_SETTING = { + std::make_tuple("Test set share", OV_TypeId_Float, "0.2"), + std::make_tuple("Labels", OV_TypeId_String, ""), + std::make_tuple("criterion", OVPoly_ClassId_Criterion, "gini"), + std::make_tuple("max_depth", OV_TypeId_String, "None"), + std::make_tuple("min_samples_split", OV_TypeId_Float, "2"), + std::make_tuple("min_samples_leaf", OV_TypeId_Float, "1"), + std::make_tuple("min_weight_fraction_leaf", OV_TypeId_Float, "0"), + std::make_tuple("max_features", OV_TypeId_String, "auto"), + std::make_tuple("random_state", OV_TypeId_String, "None"), + std::make_tuple("max_leaf_nodes", OV_TypeId_String, "None"), + std::make_tuple("min_impurity_decrease", OV_TypeId_Float, "0"), + std::make_tuple("min_impurity_split", OV_TypeId_Float, "1e-7"), + std::make_tuple("bootstrap", OV_TypeId_Boolean, "false"), + std::make_tuple("oob_score", OV_TypeId_Boolean, "false"), + std::make_tuple("verbose", OV_TypeId_Integer, "0"), + std::make_tuple("warm_start", OV_TypeId_Boolean, "false"), + std::make_tuple("max_samples", OV_TypeId_String, "None"), +}; + +static const std::vector> GAUSSIAN_SETTING = { + std::make_tuple("Discriminator", OV_TypeId_String, ""), + std::make_tuple("Test set share", OV_TypeId_Float, "0.2"), + std::make_tuple("Labels", OV_TypeId_String, ""), + std::make_tuple("var_smoothing", OV_TypeId_Float, "0.000000001"), +}; + +static const std::vector> KNN_SETTING = { + std::make_tuple("Discriminator", OV_TypeId_String, ""), + std::make_tuple("Test set share", OV_TypeId_Float, "0.2"), + std::make_tuple("Labels", OV_TypeId_String, ""), + std::make_tuple("n_neighbors", OV_TypeId_Integer, "5"), + std::make_tuple("weights", OVPoly_ClassId_Knn_Weights, "uniform"), + std::make_tuple("algorithm", OVPoly_ClassId_Knn_Algorithm, "auto"), + std::make_tuple("leaf_size", OV_TypeId_Integer, "30"), + std::make_tuple("p", OV_TypeId_Integer, "2"), + std::make_tuple("metric", OVPoly_ClassId_Metric, "minkowski"), +}; + + +static const std::vector> LDA_SETTING = { + std::make_tuple("Test set share", OV_TypeId_Float, "0.2"), + std::make_tuple("Labels", OV_TypeId_String, ""), + std::make_tuple("solver", OVPoly_ClassId_LDA_solver, "svd"), + std::make_tuple("n_components", OV_TypeId_String, ""), +}; + +static const std::vector> LR_SETTING = { + std::make_tuple("Test set share", OV_TypeId_Float, "0.2"), + std::make_tuple("Labels", OV_TypeId_String, ""), + std::make_tuple("penalty", OVPoly_ClassId_Penalty, "l2"), + std::make_tuple("dual", OV_TypeId_Boolean, "false"), + std::make_tuple("tol", OV_TypeId_Float, "1e-4"), + std::make_tuple("fit_intercept", OV_TypeId_Boolean, "true"), + std::make_tuple("intercept_scaling", OV_TypeId_Float, "1"), + std::make_tuple("random_state", OV_TypeId_String, "None"), + std::make_tuple("solver", OVPoly_ClassId_Log_reg_solver, "lbfgs"), + std::make_tuple("max_iter", OV_TypeId_Integer, "100"), + std::make_tuple("verbose", OV_TypeId_Integer, "0"), + std::make_tuple("warm_start", OV_TypeId_Boolean, "false"), + std::make_tuple("n_jobs", OV_TypeId_String, "None"), + std::make_tuple("multi_class", OVPoly_ClassId_Log_reg_multi_class, "auto"), + std::make_tuple("C", OV_TypeId_Float, "1.0") +}; + +static const std::vector> MLP_SETTING = { + std::make_tuple("Test set share", OV_TypeId_Float, "0.2"), + std::make_tuple("Labels", OV_TypeId_String, ""), + std::make_tuple("hidden_layer_sizes", OV_TypeId_String, "(100,)"), + std::make_tuple("activation", OVPoly_ClassId_MLP_activation, "relu"), + std::make_tuple("learning_rate", OVPoly_ClassId_MLP_learning_rate, "constant"), + std::make_tuple("solver", OVPoly_ClassId_MLP_solver, "adam"), + std::make_tuple("alpha", OV_TypeId_Float, "0.0001"), + std::make_tuple("batch_size", OV_TypeId_String, "auto"), + std::make_tuple("learning_rate_init", OV_TypeId_Float, "0.001"), + std::make_tuple("power_t", OV_TypeId_Float, "0.5"), + std::make_tuple("max_iter", OV_TypeId_Integer, "200"), + std::make_tuple("shuffle", OV_TypeId_Boolean, "true"), + std::make_tuple("random_state", OV_TypeId_String, "None"), + std::make_tuple("tol", OV_TypeId_Float, "1e-4"), + std::make_tuple("verbose", OV_TypeId_Boolean, "true"), + std::make_tuple("warm_start", OV_TypeId_Boolean, "false"), + std::make_tuple("momentum", OV_TypeId_Float, "0.9"), + std::make_tuple("nesterovs_momentum", OV_TypeId_Boolean, "true"), + std::make_tuple("early_stopping", OV_TypeId_Boolean, "false"), + std::make_tuple("validation_fraction", OV_TypeId_Float, "0.1"), + std::make_tuple("beta_1", OV_TypeId_Float, "0.9"), + std::make_tuple("beta_2", OV_TypeId_Float, "0.999"), + std::make_tuple("epsilon", OV_TypeId_Float, "1e-8"), + std::make_tuple("n_iter_no_change", OV_TypeId_Integer, "10") +}; + +static const std::vector> NC_SETTING = { + std::make_tuple("Test set share", OV_TypeId_Float, "0.2"), + std::make_tuple("Labels", OV_TypeId_String, ""), + std::make_tuple("metric", OVPoly_ClassId_Metric, "euclidean"), + std::make_tuple("shrink_threshold", OV_TypeId_String, "") +}; + +static const std::vector> RF_SETTING = { + std::make_tuple("Test set share", OV_TypeId_Float, "0.2"), + std::make_tuple("Labels", OV_TypeId_String, ""), + std::make_tuple("criterion", OVPoly_ClassId_Criterion, "gini"), + std::make_tuple("max_depth", OV_TypeId_String, "None"), + std::make_tuple("min_samples_split", OV_TypeId_Float, "2"), + std::make_tuple("min_samples_leaf", OV_TypeId_Float, "1"), + std::make_tuple("min_weight_fraction_leaf", OV_TypeId_Float, "0"), + std::make_tuple("max_features", OV_TypeId_String, "auto"), + std::make_tuple("random_state", OV_TypeId_String, "None"), + std::make_tuple("max_leaf_nodes", OV_TypeId_String, "None"), + std::make_tuple("min_impurity_decrease", OV_TypeId_Float, "0"), + std::make_tuple("min_impurity_split", OV_TypeId_Float, "1e-7"), + std::make_tuple("bootstrap", OV_TypeId_Boolean, "false"), + std::make_tuple("oob_score", OV_TypeId_Boolean, "false"), + std::make_tuple("verbose", OV_TypeId_Integer, "0"), + std::make_tuple("warm_start", OV_TypeId_Boolean, "false"), + std::make_tuple("max_samples", OV_TypeId_String, "None"), + std::make_tuple("n_estimators", OV_TypeId_Integer, "100") +}; + +static const std::vector> RTS_SETTING = { + std::make_tuple("Test set share", OV_TypeId_Float, "0.2"), + std::make_tuple("Labels", OV_TypeId_String, ""), + std::make_tuple("Discriminator", OVPoly_ClassId_Classifier_Algorithm, "Linear Discriminant Analysis") +}; + +static const std::vector> RMDM_SETTING = { + std::make_tuple("Test set share", OV_TypeId_Float, "0.2"), + std::make_tuple("Labels", OV_TypeId_String, ""), + std::make_tuple("Discriminator", OVPoly_ClassId_Classifier_Algorithm, "None") +}; + +static const std::vector> SGD_SETTING = { + std::make_tuple("Test set share", OV_TypeId_Float, "0.2"), + std::make_tuple("Labels", OV_TypeId_String, ""), + std::make_tuple("loss", OVPoly_ClassId_SGD_loss, "hinge"), + std::make_tuple("penalty", OVPoly_ClassId_Penalty, "l2"), + std::make_tuple("alpha", OV_TypeId_Float, "0.0001"), + std::make_tuple("l1_ratio", OV_TypeId_Float, "0.15"), + std::make_tuple("fit_intercept", OV_TypeId_Boolean, "true"), + std::make_tuple("max_iter", OV_TypeId_Integer, "1000"), + std::make_tuple("tol", OV_TypeId_Float, "0.001"), + std::make_tuple("shuffle", OV_TypeId_Boolean, "true"), + std::make_tuple("verbose", OV_TypeId_Integer, "0"), + std::make_tuple("epsilon", OV_TypeId_Float, "0.1"), + std::make_tuple("random_state", OV_TypeId_String, ""), + std::make_tuple("learning_rate", OVPoly_ClassId_SGD_learning_rate, "optimal"), + std::make_tuple("early_stopping", OV_TypeId_Boolean, "false"), + std::make_tuple("n_iter_no_change", OV_TypeId_Integer, "5") +}; + +static const std::vector> SVM_SETTING = { + std::make_tuple("Test set share", OV_TypeId_Float, "0.2"), + std::make_tuple("Labels", OV_TypeId_String, ""), + std::make_tuple("penalty", OVPoly_ClassId_Penalty, "l2"), + std::make_tuple("loss", OVPoly_ClassId_SVM_Loss, "squared_hinge"), + std::make_tuple("dual", OV_TypeId_Boolean, "true"), + std::make_tuple("tol", OV_TypeId_Float, "0.0001"), + std::make_tuple("C", OV_TypeId_Float, "1.0"), + std::make_tuple("multi_class", OVPoly_ClassId_SVM_MultiClass, "ovr"), + std::make_tuple("fit_intercept", OV_TypeId_Boolean, "true"), + std::make_tuple("intercept_scaling", OV_TypeId_Float, "1"), + std::make_tuple("verbose", OV_TypeId_Integer, "0"), + std::make_tuple("max_iter", OV_TypeId_Integer, "1000") +}; + + +static void ClearSetting(Kernel::IBox& box) { while (box.getSettingCount() > 4) { box.removeSetting(4); } } + +static bool SetSetting(Kernel::IBox& box, const std::vector>& settings) +{ + for (const auto& t : settings) { box.addSetting(std::get<0>(t).c_str(), std::get<1>(t), std::get<2>(t).c_str()); } + return true; +} + +bool CBoxAlgorithmTrainerMLListener::onSettingValueChanged(Kernel::IBox& box, const size_t index) +{ + if (index == 3) + { + CString value; + box.getSettingValue(index, value); + ClearSetting(box); + + if (std::string(value.toASCIIString()) == toString(EClassifier::NearestCentroid)) { return SetSetting(box, NC_SETTING); } + if (std::string(value.toASCIIString()) == toString(EClassifier::NearestNeighbors)) { return SetSetting(box, KNN_SETTING); } + if (std::string(value.toASCIIString()) == toString(EClassifier::GaussianNaiveBayes)) { return SetSetting(box, GAUSSIAN_SETTING); } + if (std::string(value.toASCIIString()) == toString(EClassifier::StochasticGradientDescent)) { return SetSetting(box, SGD_SETTING); } + if (std::string(value.toASCIIString()) == toString(EClassifier::LogisticRegression)) { return SetSetting(box, LR_SETTING); } + if (std::string(value.toASCIIString()) == toString(EClassifier::DecisionTree)) { return SetSetting(box, TREE_SETTING); } + if (std::string(value.toASCIIString()) == toString(EClassifier::ExtraTrees)) { return SetSetting(box, XTREE_SETTING); } + if (std::string(value.toASCIIString()) == toString(EClassifier::Bagging)) { return SetSetting(box, BAGGING_SETTING); } + if (std::string(value.toASCIIString()) == toString(EClassifier::RandomForest)) { return SetSetting(box, RF_SETTING); } + if (std::string(value.toASCIIString()) == toString(EClassifier::SVM)) { return SetSetting(box, SVM_SETTING); } + if (std::string(value.toASCIIString()) == toString(EClassifier::LDA)) { return SetSetting(box, LDA_SETTING); } + if (std::string(value.toASCIIString()) == toString(EClassifier::AdaBoost)) { return SetSetting(box, ADA_BOOST_SETTING); } + if (std::string(value.toASCIIString()) == toString(EClassifier::MultiLayerPerceptron)) { return SetSetting(box, MLP_SETTING); } + if (std::string(value.toASCIIString()) == toString(EClassifier::MDM)) { return SetSetting(box, RMDM_SETTING); } + if (std::string(value.toASCIIString()) == toString(EClassifier::TangentSpace)) { return SetSetting(box, RTS_SETTING); } + return true; + } +} + +} // namespace PyBox +} // namespace Plugins +} // namespace OpenViBE +#endif // #if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) +#endif // TARGET_HAS_ThirdPartyPython3 diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/TrainerML.hpp b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/TrainerML.hpp new file mode 100644 index 0000000..11e895d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/TrainerML.hpp @@ -0,0 +1,94 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file TrainerML.hpp +/// \brief Class TrainerML +/// \author Thibaut Monseigne (Inria) & Jimmy Leblanc (Polymont) & Yannis Bendi-Ouis (Polymont) +/// \version 1.0. +/// \date 12/03/2020. +/// \copyright , OVP_ClassId_BoxAlgorithm_TrainerML) +}; + +class CBoxAlgorithmTrainerMLListener final : public Toolkit::TBoxListener +{ +public: + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + box.setInputType(index, OV_TypeId_StreamedMatrix); + return true; + } + + bool onSettingValueChanged(Kernel::IBox& box, const size_t index) override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmTrainerMLDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Trainer Sklearn"); } + CString getAuthorName() const override { return CString("Jimmy Leblanc & Yannis Bendi-Ouis"); } + CString getAuthorCompanyName() const override { return CString("Polymont IT Services"); } + CString getShortDescription() const override { return CString("Train an TrainerML Classifier from Sklearn."); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Scripting/PyBox"); } + CString getVersion() const override { return CString("0.1"); } + CString getStockItemName() const override { return CString("gtk-convert"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_TrainerML; } + IPluginObject* create() override { return new CBoxAlgorithmTrainerML; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmTrainerMLListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("Clock frequency (Hz)", OV_TypeId_Integer, "64"); + // settings + prototype.addSetting("Filename to save model to", OV_TypeId_Filename, "${Player_ScenarioDirectory}/model.clf"); + prototype.addSetting("Filename to load model from", OV_TypeId_Filename, ""); + prototype.addSetting("Classifier", OVPoly_ClassId_Classifier_Algorithm, "None"); + + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_Stimulations); + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + + prototype.addOutputSupport(OV_TypeId_Signal); + prototype.addOutputSupport(OV_TypeId_Stimulations); + prototype.addOutputSupport(OV_TypeId_StreamedMatrix); + + // input & output + prototype.addOutput("stim_out", OV_TypeId_Stimulations); + prototype.addInput("input_StreamMatrix", OV_TypeId_StreamedMatrix); + prototype.addInput("input_Stimulations", OV_TypeId_Stimulations); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_TrainerMLDesc) +}; +} // namespace PyBox +} // namespace Plugins +} // namespace OpenViBE + +#endif // #if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) + +#endif // TARGET_HAS_ThirdPartyPython3 diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/defines.hpp b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/defines.hpp new file mode 100644 index 0000000..d5f7005 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/defines.hpp @@ -0,0 +1,58 @@ +#pragma once + +//__________________________________________________________________// +// // +// Box // +//__________________________________________________________________// +// // + +// Tag Box Declaration +#define OVP_ClassId_BoxAlgorithm_DatasetCreatorDesc OpenViBE::CIdentifier(0x6EBF2A07, 0x52EA5F3E) +#define OVP_ClassId_BoxAlgorithm_DatasetCreator OpenViBE::CIdentifier(0x7B6738C4, 0x2C5156ED) +#define OVP_ClassId_BoxAlgorithm_DataVizDesc OpenViBE::CIdentifier(0x44E07FAC, 0x57BE15DB) +#define OVP_ClassId_BoxAlgorithm_DataViz OpenViBE::CIdentifier(0x057B49AD, 0x040868CF) +#define OVP_ClassId_BoxAlgorithm_ProcessMLDesc OpenViBE::CIdentifier(0x764A11C8, 0x04006876) +#define OVP_ClassId_BoxAlgorithm_ProcessML OpenViBE::CIdentifier(0x681D3DFE, 0x060E2AFB) +#define OVP_ClassId_BoxAlgorithm_TrainerMLDesc OpenViBE::CIdentifier(0x6b14815c, 0x41da26d4) +#define OVP_ClassId_BoxAlgorithm_TrainerML OpenViBE::CIdentifier(0x44b85a3a, 0xabfc390a) + + +//__________________________________________________________________// +// // +// Custom Settings // +//__________________________________________________________________// +// // + +// Custom Type Settings + +#define OVPoly_ClassId_Classifier_Algorithm OpenViBE::CIdentifier(0x73AE164D, 0xEA21AB0A) +#define OVPoly_ClassId_Knn_Algorithm OpenViBE::CIdentifier(0xBF763F3B, 0x303EC694) +#define OVPoly_ClassId_Knn_Weights OpenViBE::CIdentifier(0x178AF88A, 0xEC44DFF3) +#define OVPoly_ClassId_Metric OpenViBE::CIdentifier(0xA04E99E9, 0x020A6874) +#define OVPoly_ClassId_SVM_Loss OpenViBE::CIdentifier(0xF05612EC, 0x139AFC45) +#define OVPoly_ClassId_Penalty OpenViBE::CIdentifier(0xBA4193F2, 0xCD152A47) +#define OVPoly_ClassId_SVM_MultiClass OpenViBE::CIdentifier(0x743F2BC9, 0xA84BC9DF) +#define OVPoly_ClassId_Criterion OpenViBE::CIdentifier(0x7455C643, 0x5D1E74E7) + + +// Logistic regression +#define OVPoly_ClassId_Log_reg_solver OpenViBE::CIdentifier(0x8CF680DF, 0x9EA77031) +#define OVPoly_ClassId_Log_reg_multi_class OpenViBE::CIdentifier(0xC0B45F28, 0x13AEBFD2) + +// Decision Tree +#define OVPoly_ClassId_DecisionTree_splitter OpenViBE::CIdentifier(0x4E3C6F6F, 0x9AC56CEA) + +// MLP +#define OVPoly_ClassId_MLP_activation OpenViBE::CIdentifier(0x324DA925, 0x58A1BCD9) +#define OVPoly_ClassId_MLP_solver OpenViBE::CIdentifier(0xAD038F27, 0x9B0AB84F) +#define OVPoly_ClassId_MLP_learning_rate OpenViBE::CIdentifier(0x5B10D3BC, 0x57658821) + +// SGD +#define OVPoly_ClassId_SGD_loss OpenViBE::CIdentifier(0x57CA4145, 0xB25841A5) +#define OVPoly_ClassId_SGD_learning_rate OpenViBE::CIdentifier(0xB6075C69, 0x93BE696B) + +// LDA +#define OVPoly_ClassId_LDA_solver OpenViBE::CIdentifier(0x2B78F491, 0xB86A6DE7) + +// ADA +#define OVPoly_ClassId_ADA_algorithm OpenViBE::CIdentifier(0x27025481, 0x09BEDC31) diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/main.cpp b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/main.cpp new file mode 100644 index 0000000..847488e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/developer-tools/pybox-manager/src/main.cpp @@ -0,0 +1,167 @@ +#if defined TARGET_HAS_ThirdPartyPython3 && !(defined(WIN32) && defined(TARGET_BUILDTYPE_Debug)) + +#include "box-algorithms/CPolyBox.hpp" +#include "box-algorithms/DataViz.hpp" +#include "box-algorithms/DatasetCreator.hpp" +#include "box-algorithms/ProcessML.hpp" +#include "box-algorithms/TrainerML.hpp" + +#if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) + +#ifdef TARGET_OS_Windows +#include "windows.h" +#endif + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace PyBox { +OVP_Declare_Begin() + // OVP_Declare_New + OVP_Declare_New(CBoxAlgorithmDatasetCreatorDesc); + OVP_Declare_New(CBoxAlgorithmDataVizDesc); + OVP_Declare_New(CBoxAlgorithmProcessMLDesc); + OVP_Declare_New(CBoxAlgorithmTrainerMLDesc); + + // Custom Type Settings + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_Classifier_Algorithm, "Classifier_Algorithm"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Classifier_Algorithm, "Nearest Centroid", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Classifier_Algorithm, "Nearest Neighbors", 1); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Classifier_Algorithm, "Gaussian Naive Bayes", 2); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Classifier_Algorithm, "Stochastic Gradient Descent", 3); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Classifier_Algorithm, "Logistic Regression", 4); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Classifier_Algorithm, "Decision Tree", 5); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Classifier_Algorithm, "Extra Trees", 6); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Classifier_Algorithm, "Bagging", 7); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Classifier_Algorithm, "Random Forest", 8); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Classifier_Algorithm, "Support Vector Machine", 9); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Classifier_Algorithm, "Linear Discriminant Analysis", 10); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Classifier_Algorithm, "AdaBoost", 11); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Classifier_Algorithm, "Multi Layer Perceptron", 12); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Classifier_Algorithm, "Riemann Minimum Distance to Mean", 13); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Classifier_Algorithm, "Riemann Tangent Space", 14); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Classifier_Algorithm, "None", 15); + + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_Knn_Algorithm, "Knn_Algorithm"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Knn_Algorithm, "auto", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Knn_Algorithm, "ball_tree", 1); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Knn_Algorithm, "kd_tree", 2); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Knn_Algorithm, "brute", 3); + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_Knn_Weights, "Knn_Weights"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Knn_Weights, "uniform", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Knn_Weights, "distance", 1); + + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_Metric, "Metric"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "cityblock", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "cosine", 1); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "euclidean", 2); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "l1", 3); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "l2", 4); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "manhattan", 5); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "braycurtis", 6); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "canberra", 7); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "chebyshev", 8); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "correlation", 9); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "dice", 10); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "hamming", 11); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "jaccard", 12); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "kulsinski", 13); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "minkowski", 14); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "mahalanobis", 15); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "rogerstanimoto", 16); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "russellrao", 17); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "seuclidean", 18); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "sokalmichener", 19); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "sokalsneath", 20); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "sqeuclidean", 21); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Metric, "yule", 22); + + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_Penalty, "Penalty"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Penalty, "l1", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Penalty, "l2", 1); + + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_SVM_Loss, "SVM_Loss"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_SVM_Loss, "hinge", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_SVM_Loss, "squared_hinge", 1); + + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_SVM_MultiClass, "SVM_MultiClass"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_SVM_MultiClass, "ovr", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_SVM_MultiClass, "crammer_singer", 1); + + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_Criterion, "Criterion"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Criterion, "gini", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Criterion, "entropy", 1); + + + // Logistic regression + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_Log_reg_solver, "Solver"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Log_reg_solver, "newton-cg", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Log_reg_solver, "lbfgs", 1); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Log_reg_solver, "liblinear", 2); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Log_reg_solver, "sag", 3); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Log_reg_solver, "saga", 4); + + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_Log_reg_multi_class, "Multi_class"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Log_reg_multi_class, "auto", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Log_reg_multi_class, "ovr", 1); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_Log_reg_multi_class, "multinominal", 2); + + + // Decision Tree Classifier + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_DecisionTree_splitter, "Splitter"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_DecisionTree_splitter, "best", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_DecisionTree_splitter, "random", 1); + + // MLP + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_MLP_activation, "Activation"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_MLP_activation, "identity", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_MLP_activation, "logistic", 1); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_MLP_activation, "tanh", 2); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_MLP_activation, "relu", 3); + + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_MLP_solver, "Solver"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_MLP_solver, "lbfgs", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_MLP_solver, "sgd", 1); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_MLP_solver, "adam", 2); + + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_MLP_learning_rate, "Learning rate"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_MLP_learning_rate, "constant", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_MLP_learning_rate, "invscaling", 1); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_MLP_learning_rate, "adaptive", 2); + + // SGD + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_SGD_loss, "Loss"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_SGD_loss, "hinge", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_SGD_loss, "log", 1); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_SGD_loss, "modified_huber", 2); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_SGD_loss, "squared_hinge", 3); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_SGD_loss, "perceptron", 4); + + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_SGD_learning_rate, "Learning rate"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_SGD_learning_rate, "optimal", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_SGD_learning_rate, "constant", 1); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_SGD_learning_rate, "invscaling", 2); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_SGD_learning_rate, "adaptive", 3); + + // LDA + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_LDA_solver, "Loss"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_LDA_solver, "svd", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_LDA_solver, "lsqr", 1); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_LDA_solver, "eigen", 2); + + // ADA + context.getTypeManager().registerEnumerationType(OVPoly_ClassId_ADA_algorithm, "Algorithm"); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_ADA_algorithm, "SAMME", 0); + context.getTypeManager().registerEnumerationEntry(OVPoly_ClassId_ADA_algorithm, "SAMME.R", 1); +OVP_Declare_End() + +} // namespace PyBox +} // namespace Plugins +} // namespace OpenViBE +#else +#pragma message ("WARNING: Python 3.7 headers are required to build the Python plugin, different includes found, skipped") +#endif // #if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) + +#endif // TARGET_HAS_ThirdPartyPython3 diff --git a/Masterarbeit/openvibe/extras-master/contrib/applications/platform/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/applications/platform/CMakeLists.txt new file mode 100644 index 0000000..f919b76 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/applications/platform/CMakeLists.txt @@ -0,0 +1,5 @@ + +# Add all the subdirs as projects of the named branch +# n.b. the folder is currently empty, don't bother adding +#OV_ADD_PROJECTS("CONTRIB_APPLICATIONS_PLATFORM") + diff --git a/Masterarbeit/openvibe/extras-master/contrib/cmake-modules/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/cmake-modules/CMakeLists.txt new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/cmake-modules/CMakeLists.txt @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/cmake-modules/FindThirdPartyGNEEDaccessAPI.cmake b/Masterarbeit/openvibe/extras-master/contrib/cmake-modules/FindThirdPartyGNEEDaccessAPI.cmake new file mode 100644 index 0000000..1c3fb11 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/cmake-modules/FindThirdPartyGNEEDaccessAPI.cmake @@ -0,0 +1,77 @@ +# --------------------------------- +# Finds GNEEDaccessAPI +# Adds library to target +# Adds include path +# --------------------------------- + +IF(WIN32) + + IF("${PLATFORM_TARGET}" STREQUAL "x64") + SET(PATHS_GNEEDaccessAPI "C:/Program Files/gtec/gNEEDaccess Client API/C") + SET(PATHS_GNEEDaccessLIB "C:/Program Files/gtec/gNEEDaccess Client API/C/x64") + SET(PATHS_GNEEDaccessServer "C:/Program Files/gtec/gNEEDaccess/") + ELSE() + SET(PATHS_GNEEDaccessAPI "C:/Program Files/gtec/gNEEDaccess Client API/C" "C:/Program Files (x86)/gtec/gNEEDaccess Client API/C") + SET(PATHS_GNEEDaccessLIB "C:/Program Files/gtec/gNEEDaccess Client API/C/win32" "C:/Program Files (x86)/gtec/gNEEDaccess Client API/C/win32") + SET(PATHS_GNEEDaccessServer "C:/Program Files/gtec/gNEEDaccess/" "C:/Program Files (x86)/gtec/gNEEDaccess/") + ENDIF() + + FIND_PATH(PATH_GNEEDaccessAPI GDSClientAPI.h PATHS + ${PATHS_GNEEDaccessAPI} + NO_DEFAULT_PATH) + IF(PATH_GNEEDaccessAPI) + MESSAGE(STATUS " Found gtec gNEEDaccessAPI...") + + # Find GDSClientAPI lib and dll + FIND_PATH(PATH_ClientLIB GDSClientAPI.dll PATHS + ${PATHS_GNEEDaccessLIB} + NO_DEFAULT_PATH) + + FIND_LIBRARY(LIB_GDSClientAPI GDSClientAPI PATHS ${PATHS_GNEEDaccessLIB} NO_DEFAULT_PATH) + IF(LIB_GDSClientAPI) + MESSAGE(STATUS " [ OK ] lib ${LIB_GDSClientAPI}") + ELSE(LIB_GDSClientAPI) + MESSAGE(STATUS " [FAILED] lib GDSClientAPI") + ENDIF(LIB_GDSClientAPI) + + # Find GDSServer dll + FIND_PATH(PATH_ServerDLL GDSServer.dll PATHS + ${PATHS_GNEEDaccessServer} + NO_DEFAULT_PATH) + IF(PATH_ServerDLL) + MESSAGE(STATUS " [ OK ] dll ${PATH_ServerDLL}") + ELSE(PATH_ServerDLL) + MESSAGE(STATUS " [FAILED] dll GDSServer") + ENDIF(PATH_ServerDLL) + + # Find GDSServer lib + FIND_LIBRARY(LIB_GDSServer GDSServer PATHS ${PATHS_GNEEDaccessLIB} NO_DEFAULT_PATH) + IF(LIB_GDSServer) + MESSAGE(STATUS " [ OK ] lib ${LIB_GDSServer}") + ELSE(LIB_GDSServer) + MESSAGE(STATUS " [FAILED] lib GDSServer") + ENDIF(LIB_GDSServer) + + # MESSAGE(STATUS "1, ${PATH_ClientLIB} 2, ${LIB_GDSClientAPI} 3, ${PATH_ServerDLL} 4, ${LIB_GDSServer}") + + # Only add the compile/install directive if all necessary components were found + IF(PATH_ClientLIB AND LIB_GDSClientAPI AND PATH_ServerDLL AND LIB_GDSServer) + # Copy the DLL file at install + INSTALL(PROGRAMS "${PATH_ClientLIB}/GDSClientAPI.dll" DESTINATION ${DIST_BINDIR}) + INSTALL(PROGRAMS "${PATH_ClientLIB}/gAPI.dll" DESTINATION ${DIST_BINDIR}) + INSTALL(PROGRAMS "${PATH_ClientLIB}/Networking.dll" DESTINATION ${DIST_BINDIR}) + INSTALL(PROGRAMS "${PATH_ServerDLL}/GDSServer.dll" DESTINATION ${DIST_BINDIR}) + + INCLUDE_DIRECTORIES(${PATH_GNEEDaccessAPI}) + + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_GDSClientAPI} ) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_GDSServer} ) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyGNEEDaccessAPI) + SET(OV_ThirdPartyGNEEDaccess "YES") + ENDIF(PATH_ClientLIB AND LIB_GDSClientAPI AND PATH_ServerDLL AND LIB_GDSServer) + ELSE(PATH_GNEEDaccessAPI) + MESSAGE(STATUS " FAILED to find gtec gNEEDaccessAPI (optional driver)") + ENDIF(PATH_GNEEDaccessAPI) +ENDIF(WIN32) + diff --git a/Masterarbeit/openvibe/extras-master/contrib/cmake-modules/FindThirdPartyGtecUnicornCAPI.cmake b/Masterarbeit/openvibe/extras-master/contrib/cmake-modules/FindThirdPartyGtecUnicornCAPI.cmake new file mode 100644 index 0000000..ccc3b7d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/cmake-modules/FindThirdPartyGtecUnicornCAPI.cmake @@ -0,0 +1,26 @@ + +GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyGtecUnicornCAPI) + + +IF(WIN32) + FIND_PATH(PATH_UNICORN Unicorn.dll PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_gtec_unicorn NO_DEFAULT_PATH) + + IF(PATH_UNICORN) + OV_PRINT(OV_PRINTED " Found Gtec Unicorn device API...") + INCLUDE_DIRECTORIES(${PATH_UNICORN}/) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PATH_UNICORN}/unicorn.lib) + + INSTALL(PROGRAMS "${PATH_UNICORN}/Unicorn.dll" DESTINATION ${DIST_BINDIR}) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyGtecUnicron) + ELSE(PATH_UNICORN) + OV_PRINT(OV_PRINTED " FAILED to find Gtec Unicorn device API (optional driver)") + ENDIF(PATH_UNICORN) + +ENDIF(WIN32) + +IF (UNIX) + OV_PRINT(OV_PRINTED " Gtec Unicorn device API (optional driver): No Linux support") +ENDIF(UNIX) + +SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyGtecUnicornCAPI "Yes") + diff --git a/Masterarbeit/openvibe/extras-master/contrib/common/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/common/CMakeLists.txt new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/common/CMakeLists.txt @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/common/contribAcquisitionServer.cmake b/Masterarbeit/openvibe/extras-master/contrib/common/contribAcquisitionServer.cmake new file mode 100644 index 0000000..1bf05fd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/common/contribAcquisitionServer.cmake @@ -0,0 +1,80 @@ +INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/contrib/common") + +SET(ADDITIONAL_PATH "${CMAKE_SOURCE_DIR}/contrib/plugins/server-extensions/external-stimulations/") +INCLUDE_DIRECTORIES(${ADDITIONAL_PATH}) +FILE(GLOB_RECURSE ADDITIONAL_SRC_FILES ${ADDITIONAL_PATH}/*.cpp ${ADDITIONAL_PATH}/*.h) +SET(SRC_FILES "${SRC_FILES};${ADDITIONAL_SRC_FILES}") + +SET(ADDITIONAL_PATH "${CMAKE_SOURCE_DIR}/contrib/plugins/server-extensions/tcp-tagging/") +INCLUDE_DIRECTORIES(${ADDITIONAL_PATH}) +FILE(GLOB ADDITIONAL_SRC_FILES ${ADDITIONAL_PATH}/*.cpp ${ADDITIONAL_PATH}/*.h) +SET(SRC_FILES "${SRC_FILES};${ADDITIONAL_SRC_FILES}") + +FUNCTION(OV_ADD_CONTRIB_DRIVER DRIVER_PATH) + + SET(ADDITIONAL_PATH ${DRIVER_PATH}) + INCLUDE_DIRECTORIES(${ADDITIONAL_PATH}/src) + FILE(GLOB_RECURSE ADDITIONAL_SRC_FILES ${ADDITIONAL_PATH}/src/*.cpp ${ADDITIONAL_PATH}/src/*.h) + SET(SRC_FILES "${SRC_FILES};${ADDITIONAL_SRC_FILES}" PARENT_SCOPE) + + #MESSAGE(STATUS "DO I EXIST: ${ADDITIONAL_PATH}/share/") + IF(EXISTS "${ADDITIONAL_PATH}/share/") + #MESSAGE(STATUS "I EXIST: ${ADDITIONAL_PATH}/share/") + INSTALL(DIRECTORY "${ADDITIONAL_PATH}/share/" DESTINATION "${DIST_DATADIR}/openvibe/applications/acquisition-server/") + ENDIF(EXISTS "${ADDITIONAL_PATH}/share/") + + #MESSAGE(STATUS "DO I EXIST: ${ADDITIONAL_PATH}/bin/") + IF(EXISTS "${ADDITIONAL_PATH}/bin/") + #MESSAGE(STATUS "I EXIST: ${ADDITIONAL_PATH}/bin/") + INSTALL(DIRECTORY "${ADDITIONAL_PATH}/bin/" DESTINATION "${DIST_BINDIR}") + ENDIF(EXISTS "${ADDITIONAL_PATH}/bin/") + + # Add the dir to be parsed for documentation later. + GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS) + SET(OV_TMP "${OV_TMP};${ADDITIONAL_PATH}") + SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS ${OV_TMP}) + +ENDFUNCTION(OV_ADD_CONTRIB_DRIVER) + +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/brainmaster-discovery") +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/brainproducts-brainvisionrecorder") +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/cognionics") +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/ctfvsm-meg") +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/encephalan") +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/gtec-gipsa/common") +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/gtec-gipsa/gusbamp") +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/gtec-gipsa/unicorn") +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/gtec-bcilab") +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/gtec-gmobilabplus") +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/gtec-gusbamp") +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/gtec-gnautilus") +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/mbt-smarting") +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/mitsarEEG202A") +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/openal-mono16bit-audiocapture") +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/openeeg-modulareeg") +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/openbci") + +IF(WIN32 AND "${PLATFORM_TARGET}" STREQUAL "x64") + MESSAGE(STATUS " SKIPPED fieldtrip on x64") +ELSE() + OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/field-trip-protocol") +ENDIF() + +OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/contrib/plugins/server-drivers/eemagine-eego") +# The block is used to compile wrapper.cc into Acquisition Server which is not in OV git. +# nb. we need to add the wrapper.cc file before the cmake add_executable() directive, and at that +# point FindThirdPartyEemagineEEGO has not yet been run on some builds (e.g. win command line build), +# nor can we do the adding at that point; it'd be too late. On the other hand, the find script +# cannot be called before the executable has been added. +if (WIN32) + FIND_PATH(PATH_EEGOAPI amplifier.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_eemagine_eego/eemagine/sdk/) +else() + FIND_PATH(PATH_EEGOAPI amplifier.h PATHS /usr/include PATH_SUFFIXES eemagine/sdk/) +endif(WIN32) +IF(PATH_EEGOAPI) + SET(SRC_FILES "${SRC_FILES};${PATH_EEGOAPI}/wrapper.cc") +ENDIF(PATH_EEGOAPI) + +IF(OV_COMPILE_TESTS) +ADD_SUBDIRECTORY("../../../contrib/plugins/server-extensions/tcp-tagging/test" "./test") +ENDIF(OV_COMPILE_TESTS) diff --git a/Masterarbeit/openvibe/extras-master/contrib/common/contribAcquisitionServer.inl b/Masterarbeit/openvibe/extras-master/contrib/common/contribAcquisitionServer.inl new file mode 100644 index 0000000..eff6592 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/common/contribAcquisitionServer.inl @@ -0,0 +1,90 @@ +#pragma once +/* +#include "openeeg-modulareeg/src/ovasCDriverOpenEEGModularEEG.h" +#include "field-trip-protocol/src/ovasCDriverFieldtrip.h" +#include "brainproducts-brainvisionrecorder/src/ovasCDriverBrainProductsBrainVisionRecorder.h" +*/ +#include "ovasCPluginExternalStimulations.h" +#include "ovasCPluginTCPTagging.h" + +#include "ovasCDriverBrainmasterDiscovery.h" +#include "ovasCDriverBrainProductsBrainVisionRecorder.h" +#include "ovasCDriverCognionics.h" +#include "ovasCDriverCtfVsmMeg.h" +#include "ovasCDriverEncephalan.h" +#include "CDriverGTecGUSBamp.hpp" +#include "ovasCDriverGTecGUSBampLegacy.h" +#include "ovasCDriverGTecGUSBampLinux.h" +#include "CDriverGTecUnicorn.hpp" +#include "ovasCDriverGTecGMobiLabPlus.h" +#include "ovasCDrivergNautilusInterface.h" +#include "ovasCDriverMBTSmarting.h" +#include "ovasCDriverMitsarEEG202A.h" +#include "ovasCDriverOpenALAudioCapture.h" +#include "ovasCDriverOpenEEGModularEEG.h" +#include "ovasCDriverOpenBCI.h" +#include "ovasCDriverEEGO.h" + +#if !defined(WIN32) || defined(TARGET_PLATFORM_i386) +#include "ovasCDriverFieldtrip.h" +#endif + +namespace OpenViBE { +namespace Contributions { +inline void InitiateContributions(AcquisitionServer::CAcquisitionServerGUI* pGUI, AcquisitionServer::CAcquisitionServer* pAS, + const Kernel::IKernelContext& context, std::vector* drivers) +{ + //No Limitations + drivers->push_back(new AcquisitionServer::CDriverBrainProductsBrainVisionRecorder(pAS->getDriverContext())); + drivers->push_back(new AcquisitionServer::CDriverCtfVsmMeg(pAS->getDriverContext())); + drivers->push_back(new AcquisitionServer::CDriverMBTSmarting(pAS->getDriverContext())); + drivers->push_back(new AcquisitionServer::CDriverOpenEEGModularEEG(pAS->getDriverContext())); + drivers->push_back(new AcquisitionServer::CDriverOpenBCI(pAS->getDriverContext())); + + //OS Limitations +#if defined WIN32 + drivers->push_back(new AcquisitionServer::CDriverCognionics(pAS->getDriverContext())); +#endif +#if defined TARGET_OS_Windows + drivers->push_back(new AcquisitionServer::CDriverEncephalan(pAS->getDriverContext())); +#endif +#if defined TARGET_HAS_PThread +#if !defined(WIN32) || defined(TARGET_PLATFORM_i386) + drivers->push_back(new AcquisitionServer::CDriverFieldtrip(pAS->getDriverContext())); +#endif +#endif + //Commercial Limitations +#if defined TARGET_HAS_ThirdPartyGUSBampCAPI + drivers->push_back(new AcquisitionServer::CDriverGTecGUSBamp(pAS->getDriverContext())); + drivers->push_back(new AcquisitionServer::CDriverGTecGUSBampLegacy(pAS->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyGUSBampCAPI_Linux + drivers->push_back(new AcquisitionServer::CDriverGTecGUSBampLinux(pAS->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyGtecUnicron + drivers->push_back(new AcquisitionServer::CDriverGTecUnicorn(pAS->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyGMobiLabPlusAPI + drivers->push_back(new AcquisitionServer::CDriverGTecGMobiLabPlus(pAS->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyGNEEDaccessAPI + drivers->push_back(new AcquisitionServer::CDrivergNautilusInterface(pAS->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyBrainmasterCodeMakerAPI + drivers->push_back(new AcquisitionServer::CDriverBrainmasterDiscovery(pAS->getDriverContext())); +#endif +#if defined(TARGET_HAS_ThirdPartyMitsar) + drivers->push_back(new AcquisitionServer::CDriverMitsarEEG202A(pAS->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyOpenAL + drivers->push_back(new AcquisitionServer::CDriverOpenALAudioCapture(pAS->getDriverContext())); +#endif +#if defined(TARGET_HAS_ThirdPartyEEGOAPI) + drivers->push_back(new AcquisitionServer::CDriverEEGO(pAS->getDriverContext())); +#endif + + pGUI->registerPlugin(new AcquisitionServer::Plugins::CPluginExternalStimulations(context)); + pGUI->registerPlugin(new AcquisitionServer::Plugins::CPluginTCPTagging(context)); +} +} // namespace Contributions +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/common/contribAcquisitionServerLinkLibs.cmake b/Masterarbeit/openvibe/extras-master/contrib/common/contribAcquisitionServerLinkLibs.cmake new file mode 100644 index 0000000..c7943b5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/common/contribAcquisitionServerLinkLibs.cmake @@ -0,0 +1,9 @@ + +INCLUDE("FindThirdPartyBrainmasterCodeMakerAPI") +INCLUDE("FindThirdPartyEemagineEEGO") +INCLUDE("FindThirdPartyGMobiLabPlusAPI") +INCLUDE("FindThirdPartyGUSBampCAPI") +INCLUDE("FindThirdPartyMitsar") + +INCLUDE("FindThirdPartyGNEEDaccessAPI") +INCLUDE("FindThirdPartyGtecUnicornCAPI") \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/packages/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/packages/CMakeLists.txt new file mode 100644 index 0000000..829caa7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/packages/CMakeLists.txt @@ -0,0 +1,2 @@ +# These files can be included by non-contrib projects. + diff --git a/Masterarbeit/openvibe/extras-master/contrib/packages/libSVM/COPYRIGHT b/Masterarbeit/openvibe/extras-master/contrib/packages/libSVM/COPYRIGHT new file mode 100644 index 0000000..20391d4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/packages/libSVM/COPYRIGHT @@ -0,0 +1,31 @@ + +Copyright (c) 2000-2013 Chih-Chung Chang and Chih-Jen Lin +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +3. Neither name of copyright holders nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. + + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Masterarbeit/openvibe/extras-master/contrib/packages/libSVM/svm.cpp b/Masterarbeit/openvibe/extras-master/contrib/packages/libSVM/svm.cpp new file mode 100644 index 0000000..8b1bf31 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/packages/libSVM/svm.cpp @@ -0,0 +1,2875 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "svm.h" + +int libsvm_version = LIBSVM_VERSION; + +typedef float Qfloat; +typedef signed char schar; + +#ifndef min +template +static T min(const T x, const T y) { return (x < y) ? x : y; } +#endif + +#ifndef max +template +static T max(const T x, const T y) { return (x > y) ? x : y; } +#endif + +template +static void swap(T& x, T& y) +{ + T t = x; + x = y; + y = t; +} + +template +static void clone(T*& dst, S* src, const int n) +{ + dst = new T[n]; + memcpy((void*)dst, (void*)src, sizeof(T) * n); +} + +static double powi(const double base, const int times) +{ + double tmp = base, ret = 1.0; + + for (int t = times; t > 0; t /= 2) + { + if (t % 2 == 1) { ret *= tmp; } + tmp = tmp * tmp; + } + return ret; +} +#define INF HUGE_VAL +#define TAU 1e-12 +#define Malloc(type,n) (type *)malloc((n)*sizeof(type)) + +static void print_string_stdout(const char* s) +{ + fputs(s, stdout); + fflush(stdout); +} +static void (*svm_print_string)(const char*) = &print_string_stdout; +#if 0 +static void info(const char* fmt, ...) +{ + char buf[BUFSIZ]; + va_list ap; + va_start(ap, fmt); + vsprintf(buf, fmt, ap); + va_end(ap); + (*svm_print_string)(buf); +} +#else +static void info(const char* /*fmt*/, ...) {} +#endif + +// +// Kernel Cache +// +// l is the number of total data items +// size is the cache size limit in bytes +// +class Cache +{ +public: + Cache(const int l_, const long int size_); + ~Cache(); + + // request data [0,len) + // return some position p where [p,len) need to be filled + // (p >= len if nothing needs to be filled) + int get_data(const int index, Qfloat** data, int len); + void swap_index(int i, int j); +private: + int l; + long int size; + + struct head_t + { + head_t *prev, *next; // a circular list + Qfloat* data; + int len; // data[0,len) is cached in this entry + }; + + head_t* head; + head_t lru_head; + void lru_delete(head_t* h); + void lru_insert(head_t* h); +}; + +Cache::Cache(const int l_, const long int size_) : l(l_), size(size_) +{ + head = (head_t*)calloc(l, sizeof(head_t)); // initialized to 0 + size /= sizeof(Qfloat); + size -= l * sizeof(head_t) / sizeof(Qfloat); + size = max(size, 2 * long(l)); // cache must be large enough for two columns + lru_head.next = lru_head.prev = &lru_head; +} + +Cache::~Cache() +{ + for (head_t* h = lru_head.next; h != &lru_head; h = h->next) { free(h->data); } + free(head); +} + +void Cache::lru_delete(head_t* h) +{ + // delete from current location + h->prev->next = h->next; + h->next->prev = h->prev; +} + +void Cache::lru_insert(head_t* h) +{ + // insert to last position + h->next = &lru_head; + h->prev = lru_head.prev; + h->prev->next = h; + h->next->prev = h; +} + +int Cache::get_data(const int index, Qfloat** data, int len) +{ + head_t* h = &head[index]; + if (h->len) { lru_delete(h); } + const int more = len - h->len; + + if (more > 0) + { + // free old space + while (size < more) + { + head_t* old = lru_head.next; + lru_delete(old); + free(old->data); + size += old->len; + old->data = nullptr; + old->len = 0; + } + + // allocate new space + h->data = (Qfloat*)realloc(h->data, sizeof(Qfloat) * len); + size -= more; + swap(h->len, len); + } + + lru_insert(h); + *data = h->data; + return len; +} + +void Cache::swap_index(int i, int j) +{ + if (i == j) { return; } + + if (head[i].len) { lru_delete(&head[i]); } + if (head[j].len) { lru_delete(&head[j]); } + swap(head[i].data, head[j].data); + swap(head[i].len, head[j].len); + if (head[i].len) { lru_insert(&head[i]); } + if (head[j].len) { lru_insert(&head[j]); } + + if (i > j) { swap(i, j); } + for (head_t* h = lru_head.next; h != &lru_head; h = h->next) + { + if (h->len > i) + { + if (h->len > j) { swap(h->data[i], h->data[j]); } + else + { + // give up + lru_delete(h); + free(h->data); + size += h->len; + h->data = nullptr; + h->len = 0; + } + } + } +} + +// +// Kernel evaluation +// +// the static method k_function is for doing single kernel evaluation +// the constructor of Kernel prepares to calculate the l*l kernel matrix +// the member function get_Q is for getting one column from the Q Matrix +// +class QMatrix +{ +public: + virtual Qfloat* get_Q(int column, int len) const = 0; + virtual double* get_QD() const = 0; + virtual void swap_index(int i, int j) const = 0; + virtual ~QMatrix() {} +}; + +class Kernel : public QMatrix +{ +public: + Kernel(const int l, svm_node* const* x_, const svm_parameter& param); + ~Kernel() override; + + static double k_function(const svm_node* x, const svm_node* y, const svm_parameter& param); + Qfloat* get_Q(int column, int len) const override = 0; + double* get_QD() const override = 0; + void swap_index(const int i, const int j) const override + // no so const... + { + swap(x[i], x[j]); + if (x_square) { swap(x_square[i], x_square[j]); } + } +protected: + + double (Kernel::* kernel_function)(int i, int j) const; + +private: + const svm_node** x; + double* x_square; + + // svm_parameter + const int kernel_type; + const int degree; + const double gamma; + const double coef0; + + static double dot(const svm_node* px, const svm_node* py); + double kernel_linear(const int i, const int j) const { return dot(x[i], x[j]); } + double kernel_poly(const int i, const int j) const { return powi(gamma * dot(x[i], x[j]) + coef0, degree); } + double kernel_rbf(const int i, const int j) const { return exp(-gamma * (x_square[i] + x_square[j] - 2 * dot(x[i], x[j]))); } + double kernel_sigmoid(const int i, const int j) const { return tanh(gamma * dot(x[i], x[j]) + coef0); } + double kernel_precomputed(const int i, const int j) const { return x[i][int(x[j][0].value)].value; } +}; + +Kernel::Kernel(const int l, svm_node* const* x_, const svm_parameter& param) + : kernel_type(param.kernel_type), degree(param.degree), gamma(param.gamma), coef0(param.coef0) +{ + switch (kernel_type) + { + case LINEAR: + kernel_function = &Kernel::kernel_linear; + break; + case POLY: + kernel_function = &Kernel::kernel_poly; + break; + case RBF: + kernel_function = &Kernel::kernel_rbf; + break; + case SIGMOID: + kernel_function = &Kernel::kernel_sigmoid; + break; + case PRECOMPUTED: + kernel_function = &Kernel::kernel_precomputed; + break; + } + + clone(x, x_, l); + + if (kernel_type == RBF) + { + x_square = new double[l]; + for (int i = 0; i < l; i++) { x_square[i] = dot(x[i], x[i]); } + } + else { x_square = nullptr; } +} + +Kernel::~Kernel() +{ + delete[] x; + delete[] x_square; +} + +double Kernel::dot(const svm_node* px, const svm_node* py) +{ + double sum = 0; + while (px->index != -1 && py->index != -1) + { + if (px->index == py->index) + { + sum += px->value * py->value; + ++px; + ++py; + } + else + { + if (px->index > py->index) { ++py; } + else { ++px; } + } + } + return sum; +} + +double Kernel::k_function(const svm_node* x, const svm_node* y, const svm_parameter& param) +{ + switch (param.kernel_type) + { + case LINEAR: + return dot(x, y); + case POLY: + return powi(param.gamma * dot(x, y) + param.coef0, param.degree); + case RBF: + { + double sum = 0; + while (x->index != -1 && y->index != -1) + { + if (x->index == y->index) + { + const double d = x->value - y->value; + sum += d * d; + ++x; + ++y; + } + else + { + if (x->index > y->index) + { + sum += y->value * y->value; + ++y; + } + else + { + sum += x->value * x->value; + ++x; + } + } + } + + while (x->index != -1) + { + sum += x->value * x->value; + ++x; + } + + while (y->index != -1) + { + sum += y->value * y->value; + ++y; + } + + return exp(-param.gamma * sum); + } + case SIGMOID: + return tanh(param.gamma * dot(x, y) + param.coef0); + case PRECOMPUTED: //x: test (validation), y: SV + return x[int(y->value)].value; + default: + return 0; // Unreachable + } +} + +// An SMO algorithm in Fan et al., JMLR 6(2005), p. 1889--1918 +// Solves: +// +// min 0.5(\alpha^T Q \alpha) + p^T \alpha +// +// y^T \alpha = \delta +// y_i = +1 or -1 +// 0 <= alpha_i <= Cp for y_i = 1 +// 0 <= alpha_i <= Cn for y_i = -1 +// +// Given: +// +// Q, p, y, Cp, Cn, and an initial feasible point \alpha +// l is the size of vectors and matrices +// eps is the stopping tolerance +// +// solution will be put in \alpha, objective value will be put in obj +// +class Solver +{ +public: + Solver() {} + virtual ~Solver() {} + + struct SolutionInfo + { + double obj; + double rho; + double upper_bound_p; + double upper_bound_n; + double r; // for Solver_NU + }; + + void Solve(int l, const QMatrix& Q, const double* p_, const schar* y_, double* alpha_, double Cp, double Cn, double eps, SolutionInfo* si, int shrinking); +protected: + enum { LOWER_BOUND, UPPER_BOUND, FREE }; + + int active_size = 0; + schar* y = nullptr; + double* G = nullptr; // gradient of objective function + + char* alpha_status = nullptr; // LOWER_BOUND, UPPER_BOUND, FREE + double* alpha = nullptr; + const QMatrix* Q; + const double* QD; + double eps = 0.0; + double Cp = 0.0, Cn = 0.0; + double* p = nullptr; + int* active_set = nullptr; + double* G_bar = nullptr; // gradient, if we treat free variables as 0 + int l = 0.0; + bool unshrink = true; // XXX + + double get_C(const int i) { return (y[i] > 0) ? Cp : Cn; } + void update_alpha_status(const int i) + { + if (alpha[i] >= get_C(i)) { alpha_status[i] = UPPER_BOUND; } + else if (alpha[i] <= 0) { alpha_status[i] = LOWER_BOUND; } + else { alpha_status[i] = FREE; } + } + bool is_upper_bound(const int i) { return alpha_status[i] == UPPER_BOUND; } + bool is_lower_bound(const int i) { return alpha_status[i] == LOWER_BOUND; } + bool is_free(const int i) { return alpha_status[i] == FREE; } + void swap_index(const int i, const int j); + void reconstruct_gradient(); + virtual int select_working_set(int& out_i, int& out_j); + virtual double calculate_rho(); + virtual void do_shrinking(); +private: + bool be_shrunk(int i, double Gmax1, double Gmax2); +}; + +void Solver::swap_index(const int i, const int j) +{ + Q->swap_index(i, j); + swap(y[i], y[j]); + swap(G[i], G[j]); + swap(alpha_status[i], alpha_status[j]); + swap(alpha[i], alpha[j]); + swap(p[i], p[j]); + swap(active_set[i], active_set[j]); + swap(G_bar[i], G_bar[j]); +} + +void Solver::reconstruct_gradient() +{ + // reconstruct inactive elements of G from G_bar and free variables + + if (active_size == l) { return; } + + int i, j; + int nr_free = 0; + + for (j = active_size; j < l; j++) { G[j] = G_bar[j] + p[j]; } + + for (j = 0; j < active_size; j++) { if (is_free(j)) { nr_free++; } } + + if (2 * nr_free < active_size) { info("\nWARNING: using -h 0 may be faster\n"); } + + if (nr_free * l > 2 * active_size * (l - active_size)) + { + for (i = active_size; i < l; i++) + { + const Qfloat* Q_i = Q->get_Q(i, active_size); + for (j = 0; j < active_size; j++) { if (is_free(j)) { G[i] += alpha[j] * Q_i[j]; } } + } + } + else + { + for (i = 0; i < active_size; i++) + { + if (is_free(i)) + { + const Qfloat* Q_i = Q->get_Q(i, l); + const double alpha_i = alpha[i]; + for (j = active_size; j < l; j++) { G[j] += alpha_i * Q_i[j]; } + } + } + } +} + +void Solver::Solve(const int l, const QMatrix& Q, const double* p_, const schar* y_, double* alpha_, const double Cp, const double Cn, const double eps, + SolutionInfo* si, const int shrinking) +{ + this->l = l; + this->Q = &Q; + QD = Q.get_QD(); + clone(p, p_, l); + clone(y, y_, l); + clone(alpha, alpha_, l); + this->Cp = Cp; + this->Cn = Cn; + this->eps = eps; + unshrink = false; + + // initialize alpha_status + { + alpha_status = new char[l]; + for (int i = 0; i < l; i++) { update_alpha_status(i); } + } + + // initialize active set (for shrinking) + { + active_set = new int[l]; + for (int i = 0; i < l; i++) { active_set[i] = i; } + active_size = l; + } + + // initialize gradient + { + G = new double[l]; + G_bar = new double[l]; + int i; + for (i = 0; i < l; i++) + { + G[i] = p[i]; + G_bar[i] = 0; + } + for (i = 0; i < l; i++) + { + if (!is_lower_bound(i)) + { + const Qfloat* Q_i = Q.get_Q(i, l); + const double alpha_i = alpha[i]; + int j; + for (j = 0; j < l; j++) { G[j] += alpha_i * Q_i[j]; } + if (is_upper_bound(i)) { for (j = 0; j < l; j++) { G_bar[j] += get_C(i) * Q_i[j]; } } + } + } + } + + // optimization step + + int iter = 0; + const int max_iter = max(10000000, l > INT_MAX / 100 ? INT_MAX : 100 * l); + int counter = min(l, 1000) + 1; + + while (iter < max_iter) + { + // show progress and do shrinking + + if (--counter == 0) + { + counter = min(l, 1000); + if (shrinking) { do_shrinking(); } + info("."); + } + + int i, j; + if (select_working_set(i, j) != 0) + { + // reconstruct the whole gradient + reconstruct_gradient(); + // reset active set size and check + active_size = l; + info("*"); + if (select_working_set(i, j) != 0) { break; } // do shrinking next iteration + counter = 1; + } + + ++iter; + + // update alpha[i] and alpha[j], handle bounds carefully + + const Qfloat* Q_i = Q.get_Q(i, active_size); + const Qfloat* Q_j = Q.get_Q(j, active_size); + + const double C_i = get_C(i); + const double C_j = get_C(j); + + const double old_alpha_i = alpha[i]; + const double old_alpha_j = alpha[j]; + + if (y[i] != y[j]) + { + double quad_coef = QD[i] + QD[j] + 2 * Q_i[j]; + if (quad_coef <= 0) { quad_coef = TAU; } + const double delta = (-G[i] - G[j]) / quad_coef; + const double diff = alpha[i] - alpha[j]; + alpha[i] += delta; + alpha[j] += delta; + + if (diff > 0) + { + if (alpha[j] < 0) + { + alpha[j] = 0; + alpha[i] = diff; + } + } + else + { + if (alpha[i] < 0) + { + alpha[i] = 0; + alpha[j] = -diff; + } + } + if (diff > C_i - C_j) + { + if (alpha[i] > C_i) + { + alpha[i] = C_i; + alpha[j] = C_i - diff; + } + } + else + { + if (alpha[j] > C_j) + { + alpha[j] = C_j; + alpha[i] = C_j + diff; + } + } + } + else + { + double quad_coef = QD[i] + QD[j] - 2 * Q_i[j]; + if (quad_coef <= 0) { quad_coef = TAU; } + const double delta = (G[i] - G[j]) / quad_coef; + const double sum = alpha[i] + alpha[j]; + alpha[i] -= delta; + alpha[j] += delta; + + if (sum > C_i) + { + if (alpha[i] > C_i) + { + alpha[i] = C_i; + alpha[j] = sum - C_i; + } + } + else + { + if (alpha[j] < 0) + { + alpha[j] = 0; + alpha[i] = sum; + } + } + if (sum > C_j) + { + if (alpha[j] > C_j) + { + alpha[j] = C_j; + alpha[i] = sum - C_j; + } + } + else + { + if (alpha[i] < 0) + { + alpha[i] = 0; + alpha[j] = sum; + } + } + } + + // update G + + const double delta_alpha_i = alpha[i] - old_alpha_i; + const double delta_alpha_j = alpha[j] - old_alpha_j; + + for (int k = 0; k < active_size; k++) { G[k] += Q_i[k] * delta_alpha_i + Q_j[k] * delta_alpha_j; } + + // update alpha_status and G_bar + + { + const bool ui = is_upper_bound(i); + const bool uj = is_upper_bound(j); + update_alpha_status(i); + update_alpha_status(j); + int k; + if (ui != is_upper_bound(i)) + { + Q_i = Q.get_Q(i, l); + if (ui) { for (k = 0; k < l; k++) { G_bar[k] -= C_i * Q_i[k]; } } + else { for (k = 0; k < l; k++) { G_bar[k] += C_i * Q_i[k]; } } + } + + if (uj != is_upper_bound(j)) + { + Q_j = Q.get_Q(j, l); + if (uj) { for (k = 0; k < l; k++) { G_bar[k] -= C_j * Q_j[k]; } } + else { for (k = 0; k < l; k++) { G_bar[k] += C_j * Q_j[k]; } } + } + } + } + + if (iter >= max_iter) + { + if (active_size < l) + { + // reconstruct the whole gradient to calculate objective value + reconstruct_gradient(); + active_size = l; + info("*"); + } + fprintf(stderr, "\nWARNING: reaching max number of iterations\n"); + } + + // calculate rho + + si->rho = calculate_rho(); + + // calculate objective value + { + double v = 0; + for (int i = 0; i < l; i++) { v += alpha[i] * (G[i] + p[i]); } + + si->obj = v / 2; + } + + // put back the solution + { + for (int i = 0; i < l; i++) { alpha_[active_set[i]] = alpha[i]; } + } + + // juggle everything back + /*{ + for(int i=0;iupper_bound_p = Cp; + si->upper_bound_n = Cn; + + info("\noptimization finished, #iter = %d\n", iter); + + delete[] p; + delete[] y; + delete[] alpha; + delete[] alpha_status; + delete[] active_set; + delete[] G; + delete[] G_bar; +} + +// return 1 if already optimal, return 0 otherwise +int Solver::select_working_set(int& out_i, int& out_j) +{ + // return i,j such that + // i: maximizes -y_i * grad(f)_i, i in I_up(\alpha) + // j: minimizes the decrease of obj value + // (if quadratic coefficeint <= 0, replace it with tau) + // -y_j*grad(f)_j < -y_i*grad(f)_i, j in I_low(\alpha) + + double Gmax = -INF; + double Gmax2 = -INF; + int Gmax_idx = -1; + int Gmin_idx = -1; + double obj_diff_min = INF; + + for (int t = 0; t < active_size; t++) + { + if (y[t] == +1) + { + if (!is_upper_bound(t)) + { + if (-G[t] >= Gmax) + { + Gmax = -G[t]; + Gmax_idx = t; + } + } + } + else + { + if (!is_lower_bound(t)) + { + if (G[t] >= Gmax) + { + Gmax = G[t]; + Gmax_idx = t; + } + } + } + } + + const int i = Gmax_idx; + const Qfloat* Q_i = nullptr; + if (i != -1) { Q_i = Q->get_Q(i, active_size); } // NULL Q_i not accessed: Gmax=-INF if i=-1 + + for (int j = 0; j < active_size; j++) + { + if (y[j] == +1) + { + if (!is_lower_bound(j)) + { + const double grad_diff = Gmax + G[j]; + if (G[j] >= Gmax2) { Gmax2 = G[j]; } + if (grad_diff > 0) + { + double obj_diff; + const double quad_coef = QD[i] + QD[j] - 2.0 * y[i] * Q_i[j]; + if (quad_coef > 0) { obj_diff = -(grad_diff * grad_diff) / quad_coef; } + else { obj_diff = -(grad_diff * grad_diff) / TAU; } + + if (obj_diff <= obj_diff_min) + { + Gmin_idx = j; + obj_diff_min = obj_diff; + } + } + } + } + else + { + if (!is_upper_bound(j)) + { + const double grad_diff = Gmax - G[j]; + if (-G[j] >= Gmax2) { Gmax2 = -G[j]; } + if (grad_diff > 0) + { + double obj_diff; + const double quad_coef = QD[i] + QD[j] + 2.0 * y[i] * Q_i[j]; + if (quad_coef > 0) { obj_diff = -(grad_diff * grad_diff) / quad_coef; } + else { obj_diff = -(grad_diff * grad_diff) / TAU; } + + if (obj_diff <= obj_diff_min) + { + Gmin_idx = j; + obj_diff_min = obj_diff; + } + } + } + } + } + + if (Gmax + Gmax2 < eps || Gmin_idx == -1) { return 1; } + + out_i = Gmax_idx; + out_j = Gmin_idx; + return 0; +} + +bool Solver::be_shrunk(const int i, const double Gmax1, const double Gmax2) +{ + if (is_upper_bound(i)) + { + if (y[i] == +1) { return (-G[i] > Gmax1); } + return (-G[i] > Gmax2); + } + if (is_lower_bound(i)) + { + if (y[i] == +1) { return (G[i] > Gmax2); } + return (G[i] > Gmax1); + } + return (false); +} + +void Solver::do_shrinking() +{ + int i; + double Gmax1 = -INF; // max { -y_i * grad(f)_i | i in I_up(\alpha) } + double Gmax2 = -INF; // max { y_i * grad(f)_i | i in I_low(\alpha) } + + // find maximal violating pair first + for (i = 0; i < active_size; i++) + { + if (y[i] == +1) + { + if (!is_upper_bound(i)) { if (-G[i] >= Gmax1) { Gmax1 = -G[i]; } } + if (!is_lower_bound(i)) { if (G[i] >= Gmax2) { Gmax2 = G[i]; } } + } + else + { + if (!is_upper_bound(i)) { if (-G[i] >= Gmax2) { Gmax2 = -G[i]; } } + if (!is_lower_bound(i)) { if (G[i] >= Gmax1) { Gmax1 = G[i]; } } + } + } + + if (unshrink == false && Gmax1 + Gmax2 <= eps * 10) + { + unshrink = true; + reconstruct_gradient(); + active_size = l; + info("*"); + } + + for (i = 0; i < active_size; i++) + { + if (be_shrunk(i, Gmax1, Gmax2)) + { + active_size--; + while (active_size > i) + { + if (!be_shrunk(active_size, Gmax1, Gmax2)) + { + swap_index(i, active_size); + break; + } + active_size--; + } + } + } +} + +double Solver::calculate_rho() +{ + double r; + int nr_free = 0; + double ub = INF, lb = -INF, sum_free = 0; + for (int i = 0; i < active_size; i++) + { + const double yG = y[i] * G[i]; + + if (is_upper_bound(i)) + { + if (y[i] == -1) { ub = min(ub, yG); } + else { lb = max(lb, yG); } + } + else if (is_lower_bound(i)) + { + if (y[i] == +1) { ub = min(ub, yG); } + else { lb = max(lb, yG); } + } + else + { + ++nr_free; + sum_free += yG; + } + } + + if (nr_free > 0) { r = sum_free / nr_free; } + else { r = (ub + lb) / 2; } + + return r; +} + +// +// Solver for nu-svm classification and regression +// +// additional constraint: e^T \alpha = constant +// +class Solver_NU : public Solver +{ +public: + Solver_NU() {} + void Solve(const int l, const QMatrix& Q, const double* p, const schar* y, double* alpha, const double Cp, const double Cn, const double eps, + SolutionInfo* si, const int shrinking) + { + this->si = si; + Solver::Solve(l, Q, p, y, alpha, Cp, Cn, eps, si, shrinking); + } +private: + SolutionInfo* si = nullptr; + int select_working_set(int& out_i, int& out_j) override; + double calculate_rho() override; + bool be_shrunk(const int i, const double Gmax1, const double Gmax2, const double Gmax3, const double Gmax4); + void do_shrinking() override; +}; + +// return 1 if already optimal, return 0 otherwise +int Solver_NU::select_working_set(int& out_i, int& out_j) +{ + // return i,j such that y_i = y_j and + // i: maximizes -y_i * grad(f)_i, i in I_up(\alpha) + // j: minimizes the decrease of obj value + // (if quadratic coefficeint <= 0, replace it with tau) + // -y_j*grad(f)_j < -y_i*grad(f)_i, j in I_low(\alpha) + + double Gmaxp = -INF; + double Gmaxp2 = -INF; + int Gmaxp_idx = -1; + + double Gmaxn = -INF; + double Gmaxn2 = -INF; + int Gmaxn_idx = -1; + + int Gmin_idx = -1; + double obj_diff_min = INF; + + for (int t = 0; t < active_size; t++) + { + if (y[t] == +1) + { + if (!is_upper_bound(t)) + { + if (-G[t] >= Gmaxp) + { + Gmaxp = -G[t]; + Gmaxp_idx = t; + } + } + } + else + { + if (!is_lower_bound(t)) + { + if (G[t] >= Gmaxn) + { + Gmaxn = G[t]; + Gmaxn_idx = t; + } + } + } + } + + const int ip = Gmaxp_idx; + const int in = Gmaxn_idx; + const Qfloat* Q_ip = nullptr; + const Qfloat* Q_in = nullptr; + if (ip != -1) { Q_ip = Q->get_Q(ip, active_size); } // NULL Q_ip not accessed: Gmaxp=-INF if ip=-1 + if (in != -1) { Q_in = Q->get_Q(in, active_size); } + + for (int j = 0; j < active_size; j++) + { + if (y[j] == +1) + { + if (!is_lower_bound(j)) + { + const double grad_diff = Gmaxp + G[j]; + if (G[j] >= Gmaxp2) { Gmaxp2 = G[j]; } + if (grad_diff > 0) + { + double obj_diff; + const double quad_coef = QD[ip] + QD[j] - 2 * Q_ip[j]; + if (quad_coef > 0) { obj_diff = -(grad_diff * grad_diff) / quad_coef; } + else { obj_diff = -(grad_diff * grad_diff) / TAU; } + + if (obj_diff <= obj_diff_min) + { + Gmin_idx = j; + obj_diff_min = obj_diff; + } + } + } + } + else + { + if (!is_upper_bound(j)) + { + const double grad_diff = Gmaxn - G[j]; + if (-G[j] >= Gmaxn2) { Gmaxn2 = -G[j]; } + if (grad_diff > 0) + { + double obj_diff; + const double quad_coef = QD[in] + QD[j] - 2 * Q_in[j]; + if (quad_coef > 0) { obj_diff = -(grad_diff * grad_diff) / quad_coef; } + else { obj_diff = -(grad_diff * grad_diff) / TAU; } + + if (obj_diff <= obj_diff_min) + { + Gmin_idx = j; + obj_diff_min = obj_diff; + } + } + } + } + } + + if (max(Gmaxp + Gmaxp2, Gmaxn + Gmaxn2) < eps || Gmin_idx == -1) { return 1; } + + if (y[Gmin_idx] == +1) { out_i = Gmaxp_idx; } + else { out_i = Gmaxn_idx; } + out_j = Gmin_idx; + + return 0; +} + +bool Solver_NU::be_shrunk(const int i, const double Gmax1, const double Gmax2, const double Gmax3, const double Gmax4) +{ + if (is_upper_bound(i)) + { + if (y[i] == +1) { return (-G[i] > Gmax1); } + return (-G[i] > Gmax4); + } + if (is_lower_bound(i)) + { + if (y[i] == +1) { return (G[i] > Gmax2); } + return (G[i] > Gmax3); + } + return (false); +} + +void Solver_NU::do_shrinking() +{ + double Gmax1 = -INF; // max { -y_i * grad(f)_i | y_i = +1, i in I_up(\alpha) } + double Gmax2 = -INF; // max { y_i * grad(f)_i | y_i = +1, i in I_low(\alpha) } + double Gmax3 = -INF; // max { -y_i * grad(f)_i | y_i = -1, i in I_up(\alpha) } + double Gmax4 = -INF; // max { y_i * grad(f)_i | y_i = -1, i in I_low(\alpha) } + + // find maximal violating pair first + int i; + for (i = 0; i < active_size; i++) + { + if (!is_upper_bound(i)) + { + if (y[i] == +1) { if (-G[i] > Gmax1) { Gmax1 = -G[i]; } } + else if (-G[i] > Gmax4) { Gmax4 = -G[i]; } + } + if (!is_lower_bound(i)) + { + if (y[i] == +1) { if (G[i] > Gmax2) { Gmax2 = G[i]; } } + else if (G[i] > Gmax3) { Gmax3 = G[i]; } + } + } + + if (unshrink == false && max(Gmax1 + Gmax2, Gmax3 + Gmax4) <= eps * 10) + { + unshrink = true; + reconstruct_gradient(); + active_size = l; + } + + for (i = 0; i < active_size; i++) + { + if (be_shrunk(i, Gmax1, Gmax2, Gmax3, Gmax4)) + { + active_size--; + while (active_size > i) + { + if (!be_shrunk(active_size, Gmax1, Gmax2, Gmax3, Gmax4)) + { + swap_index(i, active_size); + break; + } + active_size--; + } + } + } +} + +double Solver_NU::calculate_rho() +{ + int nr_free1 = 0, nr_free2 = 0; + double ub1 = INF, ub2 = INF; + double lb1 = -INF, lb2 = -INF; + double sum_free1 = 0, sum_free2 = 0; + + for (int i = 0; i < active_size; i++) + { + if (y[i] == +1) + { + if (is_upper_bound(i)) { lb1 = max(lb1, G[i]); } + else if (is_lower_bound(i)) { ub1 = min(ub1, G[i]); } + else + { + ++nr_free1; + sum_free1 += G[i]; + } + } + else + { + if (is_upper_bound(i)) { lb2 = max(lb2, G[i]); } + else if (is_lower_bound(i)) { ub2 = min(ub2, G[i]); } + else + { + ++nr_free2; + sum_free2 += G[i]; + } + } + } + + double r1, r2; + if (nr_free1 > 0) { r1 = sum_free1 / nr_free1; } + else { r1 = (ub1 + lb1) / 2; } + + if (nr_free2 > 0) { r2 = sum_free2 / nr_free2; } + else { r2 = (ub2 + lb2) / 2; } + + si->r = (r1 + r2) / 2; + return (r1 - r2) / 2; +} + +// +// Q matrices for various formulations +// +class SVC_Q : public Kernel +{ +public: + SVC_Q(const svm_problem& prob, const svm_parameter& param, const schar* y_) + : Kernel(prob.l, prob.x, param) + { + clone(y, y_, prob.l); + cache = new Cache(prob.l, long(param.cache_size * (1 << 20))); + QD = new double[prob.l]; + for (int i = 0; i < prob.l; i++) { QD[i] = (this->*kernel_function)(i, i); } + } + + Qfloat* get_Q(const int i, const int len) const override + { + Qfloat* data; + int start; + if ((start = cache->get_data(i, &data, len)) < len) + { + for (int j = start; j < len; j++) { data[j] = Qfloat(y[i] * y[j] * (this->*kernel_function)(i, j)); } + } + return data; + } + + double* get_QD() const override { return QD; } + + void swap_index(const int i, const int j) const override + { + cache->swap_index(i, j); + Kernel::swap_index(i, j); + swap(y[i], y[j]); + swap(QD[i], QD[j]); + } + + ~SVC_Q() override + { + delete[] y; + delete cache; + delete[] QD; + } +private: + schar* y; + Cache* cache; + double* QD; +}; + +class ONE_CLASS_Q : public Kernel +{ +public: + ONE_CLASS_Q(const svm_problem& prob, const svm_parameter& param) + : Kernel(prob.l, prob.x, param) + { + cache = new Cache(prob.l, long(param.cache_size * (1 << 20))); + QD = new double[prob.l]; + for (int i = 0; i < prob.l; i++) { QD[i] = (this->*kernel_function)(i, i); } + } + + Qfloat* get_Q(const int i, const int len) const override + { + Qfloat* data; + int start; + if ((start = cache->get_data(i, &data, len)) < len) { for (int j = start; j < len; j++) { data[j] = Qfloat((this->*kernel_function)(i, j)); } } + return data; + } + + double* get_QD() const override { return QD; } + + void swap_index(const int i, const int j) const override + { + cache->swap_index(i, j); + Kernel::swap_index(i, j); + swap(QD[i], QD[j]); + } + + ~ONE_CLASS_Q() override + { + delete cache; + delete[] QD; + } +private: + Cache* cache; + double* QD; +}; + +class SVR_Q : public Kernel +{ +public: + SVR_Q(const svm_problem& prob, const svm_parameter& param) + : Kernel(prob.l, prob.x, param) + { + l = prob.l; + cache = new Cache(l, long(param.cache_size * (1 << 20))); + QD = new double[2 * l]; + sign = new schar[2 * l]; + index = new int[2 * l]; + for (int k = 0; k < l; k++) + { + sign[k] = 1; + sign[k + l] = -1; + index[k] = k; + index[k + l] = k; + QD[k] = (this->*kernel_function)(k, k); + QD[k + l] = QD[k]; + } + buffer[0] = new Qfloat[2 * l]; + buffer[1] = new Qfloat[2 * l]; + next_buffer = 0; + } + + void swap_index(const int i, const int j) const override + { + swap(sign[i], sign[j]); + swap(index[i], index[j]); + swap(QD[i], QD[j]); + } + + Qfloat* get_Q(const int i, const int len) const override + { + Qfloat* data; + int j, real_i = index[i]; + if (cache->get_data(real_i, &data, l) < l) { for (j = 0; j < l; j++) { data[j] = Qfloat((this->*kernel_function)(real_i, j)); } } + + // reorder and copy + Qfloat* buf = buffer[next_buffer]; + next_buffer = 1 - next_buffer; + const schar si = sign[i]; + for (j = 0; j < len; j++) { buf[j] = Qfloat(si) * Qfloat(sign[j]) * data[index[j]]; } + return buf; + } + + double* get_QD() const override { return QD; } + + ~SVR_Q() override + { + delete cache; + delete[] sign; + delete[] index; + delete[] buffer[0]; + delete[] buffer[1]; + delete[] QD; + } +private: + int l; + Cache* cache; + schar* sign; + int* index; + mutable int next_buffer; + Qfloat* buffer[2]; + double* QD; +}; + +// +// construct and solve various formulations +// +static void solve_c_svc(const svm_problem* prob, const svm_parameter* param, double* alpha, Solver::SolutionInfo* si, const double Cp, const double Cn) +{ + const int l = prob->l; + double* minus_ones = new double[l]; + schar* y = new schar[l]; + + int i; + + for (i = 0; i < l; i++) + { + alpha[i] = 0; + minus_ones[i] = -1; + if (prob->y[i] > 0) { y[i] = +1; } + else { y[i] = -1; } + } + + Solver s; + s.Solve(l, SVC_Q(*prob, *param, y), minus_ones, y, alpha, Cp, Cn, param->eps, si, param->shrinking); + + double sum_alpha = 0; + for (i = 0; i < l; i++) { sum_alpha += alpha[i]; } + + if (Cp == Cn) { info("nu = %f\n", sum_alpha / (Cp * prob->l)); } + + for (i = 0; i < l; i++) { alpha[i] *= y[i]; } + + delete[] minus_ones; + delete[] y; +} + +static void solve_nu_svc(const svm_problem* prob, const svm_parameter* param, double* alpha, Solver::SolutionInfo* si) +{ + int i; + const int l = prob->l; + const double nu = param->nu; + + schar* y = new schar[l]; + + for (i = 0; i < l; i++) + { + if (prob->y[i] > 0) { y[i] = +1; } + else { y[i] = -1; } + } + + double sum_pos = nu * l / 2; + double sum_neg = nu * l / 2; + + for (i = 0; i < l; i++) + { + if (y[i] == +1) + { + alpha[i] = min(1.0, sum_pos); + sum_pos -= alpha[i]; + } + else + { + alpha[i] = min(1.0, sum_neg); + sum_neg -= alpha[i]; + } + } + + double* zeros = new double[l]; + + for (i = 0; i < l; i++) { zeros[i] = 0; } + + Solver_NU s; + s.Solve(l, SVC_Q(*prob, *param, y), zeros, y, alpha, 1.0, 1.0, param->eps, si, param->shrinking); + const double r = si->r; + + info("C = %f\n", 1 / r); + + for (i = 0; i < l; i++) { alpha[i] *= y[i] / r; } + + si->rho /= r; + si->obj /= (r * r); + si->upper_bound_p = 1 / r; + si->upper_bound_n = 1 / r; + + delete[] y; + delete[] zeros; +} + +static void solve_one_class(const svm_problem* prob, const svm_parameter* param, double* alpha, Solver::SolutionInfo* si) +{ + const int l = prob->l; + double* zeros = new double[l]; + schar* ones = new schar[l]; + int i; + + const int n = int(param->nu * prob->l); // # of alpha's at upper bound + + for (i = 0; i < n; i++) { alpha[i] = 1; } + if (n < prob->l) { alpha[n] = param->nu * prob->l - n; } + for (i = n + 1; i < l; i++) { alpha[i] = 0; } + + for (i = 0; i < l; i++) + { + zeros[i] = 0; + ones[i] = 1; + } + + Solver s; + s.Solve(l, ONE_CLASS_Q(*prob, *param), zeros, ones, alpha, 1.0, 1.0, param->eps, si, param->shrinking); + + delete[] zeros; + delete[] ones; +} + +static void solve_epsilon_svr(const svm_problem* prob, const svm_parameter* param, double* alpha, Solver::SolutionInfo* si) +{ + const int l = prob->l; + double* alpha2 = new double[2 * l]; + double* linear_term = new double[2 * l]; + schar* y = new schar[2 * l]; + int i; + + for (i = 0; i < l; i++) + { + alpha2[i] = 0; + linear_term[i] = param->p - prob->y[i]; + y[i] = 1; + + alpha2[i + l] = 0; + linear_term[i + l] = param->p + prob->y[i]; + y[i + l] = -1; + } + + Solver s; + s.Solve(2 * l, SVR_Q(*prob, *param), linear_term, y, alpha2, param->C, param->C, param->eps, si, param->shrinking); + + double sum_alpha = 0; + for (i = 0; i < l; i++) + { + alpha[i] = alpha2[i] - alpha2[i + l]; + sum_alpha += fabs(alpha[i]); + } + info("nu = %f\n", sum_alpha / (param->C * l)); + + delete[] alpha2; + delete[] linear_term; + delete[] y; +} + +static void solve_nu_svr(const svm_problem* prob, const svm_parameter* param, double* alpha, Solver::SolutionInfo* si) +{ + const int l = prob->l; + const double C = param->C; + double* alpha2 = new double[2 * l]; + double* linear_term = new double[2 * l]; + schar* y = new schar[2 * l]; + int i; + + double sum = C * param->nu * l / 2; + for (i = 0; i < l; i++) + { + alpha2[i] = alpha2[i + l] = min(sum, C); + sum -= alpha2[i]; + + linear_term[i] = -prob->y[i]; + y[i] = 1; + + linear_term[i + l] = prob->y[i]; + y[i + l] = -1; + } + + Solver_NU s; + s.Solve(2 * l, SVR_Q(*prob, *param), linear_term, y, alpha2, C, C, param->eps, si, param->shrinking); + + info("epsilon = %f\n", -si->r); + + for (i = 0; i < l; i++) { alpha[i] = alpha2[i] - alpha2[i + l]; } + + delete[] alpha2; + delete[] linear_term; + delete[] y; +} + +// +// decision_function +// +struct decision_function +{ + double* alpha; + double rho; +}; + +static decision_function svm_train_one(const svm_problem* prob, const svm_parameter* param, const double Cp, const double Cn) +{ + double* alpha = Malloc(double, prob->l); + Solver::SolutionInfo si; + switch (param->svm_type) + { + case C_SVC: + solve_c_svc(prob, param, alpha, &si, Cp, Cn); + break; + case NU_SVC: + solve_nu_svc(prob, param, alpha, &si); + break; + case ONE_CLASS: + solve_one_class(prob, param, alpha, &si); + break; + case EPSILON_SVR: + solve_epsilon_svr(prob, param, alpha, &si); + break; + case NU_SVR: + solve_nu_svr(prob, param, alpha, &si); + break; + } + + info("obj = %f, rho = %f\n", si.obj, si.rho); + + // output SVs + + int nSV = 0; + int nBSV = 0; + for (int i = 0; i < prob->l; i++) + { + if (fabs(alpha[i]) > 0) + { + ++nSV; + if (prob->y[i] > 0) { if (fabs(alpha[i]) >= si.upper_bound_p) { ++nBSV; } } + else { if (fabs(alpha[i]) >= si.upper_bound_n) { ++nBSV; } } + } + } + + info("nSV = %d, nBSV = %d\n", nSV, nBSV); + + decision_function f; + f.alpha = alpha; + f.rho = si.rho; + return f; +} + +// Platt's binary SVM Probablistic Output: an improvement from Lin et al. +static void sigmoid_train(const int l, const double* dec_values, const double* labels, double& A, double& B) +{ + double prior1 = 0, prior0 = 0; + int i; + + for (i = 0; i < l; i++) + { + if (labels[i] > 0) { prior1 += 1; } + else { prior0 += 1; } + } + + const int max_iter = 100; // Maximal number of iterations + const double min_step = 1e-10; // Minimal step taken in line search + const double sigma = 1e-12; // For numerically strict PD of Hessian + const double eps = 1e-5; + const double hiTarget = (prior1 + 1.0) / (prior1 + 2.0); + const double loTarget = 1 / (prior0 + 2.0); + double* t = Malloc(double, l); + double fApB, p, q; + int iter; + + // Initial Point and Initial Fun Value + A = 0.0; + B = log((prior0 + 1.0) / (prior1 + 1.0)); + double fval = 0.0; + + for (i = 0; i < l; i++) + { + if (labels[i] > 0) { t[i] = hiTarget; } + else { t[i] = loTarget; } + fApB = dec_values[i] * A + B; + if (fApB >= 0) { fval += t[i] * fApB + log(1 + exp(-fApB)); } + else { fval += (t[i] - 1) * fApB + log(1 + exp(fApB)); } + } + for (iter = 0; iter < max_iter; iter++) + { + // Update Gradient and Hessian (use H' = H + sigma I) + double h11 = sigma; // numerically ensures strict PD + double h22 = sigma; + double h21 = 0.0; + double g1 = 0.0; + double g2 = 0.0; + for (i = 0; i < l; i++) + { + fApB = dec_values[i] * A + B; + if (fApB >= 0) + { + p = exp(-fApB) / (1.0 + exp(-fApB)); + q = 1.0 / (1.0 + exp(-fApB)); + } + else + { + p = 1.0 / (1.0 + exp(fApB)); + q = exp(fApB) / (1.0 + exp(fApB)); + } + const double d2 = p * q; + h11 += dec_values[i] * dec_values[i] * d2; + h22 += d2; + h21 += dec_values[i] * d2; + const double d1 = t[i] - p; + g1 += dec_values[i] * d1; + g2 += d1; + } + + // Stopping Criteria + if (fabs(g1) < eps && fabs(g2) < eps) { break; } + + // Finding Newton direction: -inv(H') * g + const double det = h11 * h22 - h21 * h21; + const double dA = -(h22 * g1 - h21 * g2) / det; + const double dB = -(-h21 * g1 + h11 * g2) / det; + const double gd = g1 * dA + g2 * dB; + + + double stepsize = 1; // Line Search + while (stepsize >= min_step) + { + const double newA = A + stepsize * dA; + const double newB = B + stepsize * dB; + + // New function value + double newf = 0.0; + for (i = 0; i < l; i++) + { + fApB = dec_values[i] * newA + newB; + if (fApB >= 0) { newf += t[i] * fApB + log(1 + exp(-fApB)); } + else { newf += (t[i] - 1) * fApB + log(1 + exp(fApB)); } + } + // Check sufficient decrease + if (newf < fval + 0.0001 * stepsize * gd) + { + A = newA; + B = newB; + fval = newf; + break; + } + stepsize = stepsize / 2.0; + } + + if (stepsize < min_step) + { + info("Line search fails in two-class probability estimates\n"); + break; + } + } + + if (iter >= max_iter) { info("Reaching maximal iterations in two-class probability estimates\n"); } + free(t); +} + +static double sigmoid_predict(const double decision_value, const double A, const double B) +{ + const double fApB = decision_value * A + B; + // 1-p used later; avoid catastrophic cancellation + if (fApB >= 0) { return exp(-fApB) / (1.0 + exp(-fApB)); } + return 1.0 / (1 + exp(fApB)); +} + +// Method 2 from the multiclass_prob paper by Wu, Lin, and Weng +static void multiclass_probability(const int k, double** r, double* p) +{ + int t, j; + int iter = 0, max_iter = max(100, k); + double** Q = Malloc(double*, k); + double* Qp = Malloc(double, k); + const double eps = 0.005 / k; + + for (t = 0; t < k; t++) + { + p[t] = 1.0 / k; // Valid if k = 1 + Q[t] = Malloc(double, k); + Q[t][t] = 0; + for (j = 0; j < t; j++) + { + Q[t][t] += r[j][t] * r[j][t]; + Q[t][j] = Q[j][t]; + } + for (j = t + 1; j < k; j++) + { + Q[t][t] += r[j][t] * r[j][t]; + Q[t][j] = -r[j][t] * r[t][j]; + } + } + for (; iter < max_iter; iter++) + { + // stopping condition, recalculate QP,pQP for numerical accuracy + double pQp = 0; + for (t = 0; t < k; t++) + { + Qp[t] = 0; + for (j = 0; j < k; j++) { Qp[t] += Q[t][j] * p[j]; } + pQp += p[t] * Qp[t]; + } + double max_error = 0; + for (t = 0; t < k; t++) + { + const double error = fabs(Qp[t] - pQp); + if (error > max_error) { max_error = error; } + } + if (max_error < eps) { break; } + + for (t = 0; t < k; t++) + { + const double diff = (-Qp[t] + pQp) / Q[t][t]; + p[t] += diff; + pQp = (pQp + diff * (diff * Q[t][t] + 2 * Qp[t])) / (1 + diff) / (1 + diff); + for (j = 0; j < k; j++) + { + Qp[j] = (Qp[j] + diff * Q[t][j]) / (1 + diff); + p[j] /= (1 + diff); + } + } + } + if (iter >= max_iter) { info("Exceeds max_iter in multiclass_prob\n"); } + for (t = 0; t < k; t++) { free(Q[t]); } + free(Q); + free(Qp); +} + +// Cross-validation decision values for probability estimates +static void svm_binary_svc_probability(const svm_problem* prob, const svm_parameter* param, const double Cp, const double Cn, double& probA, double& probB) +{ + int i; + const int nr_fold = 5; + int* perm = Malloc(int, prob->l); + double* dec_values = Malloc(double, prob->l); + + // random shuffle + for (i = 0; i < prob->l; i++) { perm[i] = i; } + for (i = 0; i < prob->l; i++) + { + const int j = i + rand() % (prob->l - i); + swap(perm[i], perm[j]); + } + for (i = 0; i < nr_fold; i++) + { + const int begin = i * prob->l / nr_fold; + const int end = (i + 1) * prob->l / nr_fold; + int j; + struct svm_problem subprob; + + subprob.l = prob->l - (end - begin); + subprob.x = Malloc(struct svm_node*, subprob.l); + subprob.y = Malloc(double, subprob.l); + + int k = 0; + for (j = 0; j < begin; j++) + { + subprob.x[k] = prob->x[perm[j]]; + subprob.y[k] = prob->y[perm[j]]; + ++k; + } + for (j = end; j < prob->l; j++) + { + subprob.x[k] = prob->x[perm[j]]; + subprob.y[k] = prob->y[perm[j]]; + ++k; + } + int p_count = 0, n_count = 0; + for (j = 0; j < k; j++) + { + if (subprob.y[j] > 0) { p_count++; } + else { n_count++; } + } + + if (p_count == 0 && n_count == 0) { for (j = begin; j < end; j++) { dec_values[perm[j]] = 0; } } + else if (p_count > 0 && n_count == 0) { for (j = begin; j < end; j++) { dec_values[perm[j]] = 1; } } + else if (p_count == 0 && n_count > 0) { for (j = begin; j < end; j++) { dec_values[perm[j]] = -1; } } + else + { + svm_parameter subparam = *param; + subparam.probability = 0; + subparam.C = 1.0; + subparam.nr_weight = 2; + subparam.weight_label = Malloc(int, 2); + subparam.weight = Malloc(double, 2); + subparam.weight_label[0] = +1; + subparam.weight_label[1] = -1; + subparam.weight[0] = Cp; + subparam.weight[1] = Cn; + struct svm_model* submodel = svm_train(&subprob, &subparam); + for (j = begin; j < end; j++) + { + svm_predict_values(submodel, prob->x[perm[j]], &(dec_values[perm[j]])); + // ensure +1 -1 order; reason not using CV subroutine + dec_values[perm[j]] *= submodel->label[0]; + } + svm_free_and_destroy_model(&submodel); + svm_destroy_param(&subparam); + } + free(subprob.x); + free(subprob.y); + } + sigmoid_train(prob->l, dec_values, prob->y, probA, probB); + free(dec_values); + free(perm); +} + +// Return parameter of a Laplace distribution +static double svm_svr_probability(const svm_problem* prob, const svm_parameter* param) +{ + int i; + const int nr_fold = 5; + double* ymv = Malloc(double, prob->l); + double mae = 0; + + svm_parameter newparam = *param; + newparam.probability = 0; + svm_cross_validation(prob, &newparam, nr_fold, ymv); + for (i = 0; i < prob->l; i++) + { + ymv[i] = prob->y[i] - ymv[i]; + mae += fabs(ymv[i]); + } + mae /= prob->l; + const double std = sqrt(2 * mae * mae); + int count = 0; + mae = 0; + for (i = 0; i < prob->l; i++) + { + if (fabs(ymv[i]) > 5 * std) { count = count + 1; } + else { mae += fabs(ymv[i]); } + } + mae /= (prob->l - count); + info("Prob. model for test data: target value = predicted value + z,\nz: Laplace distribution e^(-|z|/sigma)/(2sigma),sigma= %g\n", mae); + free(ymv); + return mae; +} + + +// label: label name, start: begin of each class, count: #data of classes, perm: indices to the original data +// perm, length l, must be allocated before calling this subroutine +static void svm_group_classes(const svm_problem* prob, int* nr_class_ret, int** label_ret, int** start_ret, int** count_ret, int* perm) +{ + const int l = prob->l; + int max_nr_class = 16; + int nr_class = 0; + int* label = Malloc(int, max_nr_class); + int* count = Malloc(int, max_nr_class); + int* data_label = Malloc(int, l); + int i; + + for (i = 0; i < l; i++) + { + const int this_label = int(prob->y[i]); + int j; + for (j = 0; j < nr_class; j++) + { + if (this_label == label[j]) + { + ++count[j]; + break; + } + } + data_label[i] = j; + if (j == nr_class) + { + if (nr_class == max_nr_class) + { + max_nr_class *= 2; + label = (int*)realloc(label, max_nr_class * sizeof(int)); + count = (int*)realloc(count, max_nr_class * sizeof(int)); + } + label[nr_class] = this_label; + count[nr_class] = 1; + ++nr_class; + } + } + + // + // Labels are ordered by their first occurrence in the training set. + // However, for two-class sets with -1/+1 labels and -1 appears first, + // we swap labels to ensure that internally the binary SVM has positive data corresponding to the +1 instances. + // + if (nr_class == 2 && label[0] == -1 && label[1] == 1) + { + swap(label[0], label[1]); + swap(count[0], count[1]); + for (i = 0; i < l; i++) + { + if (data_label[i] == 0) { data_label[i] = 1; } + else { data_label[i] = 0; } + } + } + + int* start = Malloc(int, nr_class); + start[0] = 0; + for (i = 1; i < nr_class; i++) { start[i] = start[i - 1] + count[i - 1]; } + for (i = 0; i < l; i++) + { + perm[start[data_label[i]]] = i; + ++start[data_label[i]]; + } + start[0] = 0; + for (i = 1; i < nr_class; i++) { start[i] = start[i - 1] + count[i - 1]; } + + *nr_class_ret = nr_class; + *label_ret = label; + *start_ret = start; + *count_ret = count; + free(data_label); +} + +// +// Interface functions +// +svm_model* svm_train(const svm_problem* prob, const svm_parameter* param) +{ + svm_model* model = Malloc(svm_model, 1); + model->param = *param; + model->free_sv = 0; // XXX + + if (param->svm_type == ONE_CLASS || param->svm_type == EPSILON_SVR || param->svm_type == NU_SVR) + { + // regression or one-class-svm + model->nr_class = 2; + model->label = nullptr; + model->nSV = nullptr; + model->probA = nullptr; + model->probB = nullptr; + model->sv_coef = Malloc(double*, 1); + + if (param->probability && (param->svm_type == EPSILON_SVR || param->svm_type == NU_SVR)) + { + model->probA = Malloc(double, 1); + model->probA[0] = svm_svr_probability(prob, param); + } + + decision_function f = svm_train_one(prob, param, 0, 0); + model->rho = Malloc(double, 1); + model->rho[0] = f.rho; + + int nSV = 0; + int i; + for (i = 0; i < prob->l; i++) { if (fabs(f.alpha[i]) > 0) { ++nSV; } } + model->l = nSV; + model->SV = Malloc(svm_node*, nSV); + model->sv_coef[0] = Malloc(double, nSV); + model->sv_indices = Malloc(int, nSV); + int j = 0; + for (i = 0; i < prob->l; i++) + { + if (fabs(f.alpha[i]) > 0) + { + model->SV[j] = prob->x[i]; + model->sv_coef[0][j] = f.alpha[i]; + model->sv_indices[j] = i + 1; + ++j; + } + } + + free(f.alpha); + } + else + { + // classification + int l = prob->l; + int nr_class; + int* label = nullptr; + int* start = nullptr; + int* count = nullptr; + int* perm = Malloc(int, l); + + // group training data of the same class + svm_group_classes(prob, &nr_class, &label, &start, &count, perm); + if (nr_class == 1) { info("WARNING: training data in only one class. See README for details.\n"); } + + svm_node** x = Malloc(svm_node*, l); + int i; + for (i = 0; i < l; i++) { x[i] = prob->x[perm[i]]; } + + // calculate weighted C + + double* weighted_C = Malloc(double, nr_class); + for (i = 0; i < nr_class; i++) { weighted_C[i] = param->C; } + for (i = 0; i < param->nr_weight; i++) + { + int j; + for (j = 0; j < nr_class; j++) { if (param->weight_label[i] == label[j]) { break; } } + if (j == nr_class) { fprintf(stderr, "WARNING: class label %d specified in weight is not found\n", param->weight_label[i]); } + else { weighted_C[j] *= param->weight[i]; } + } + + // train k*(k-1)/2 models + + bool* nonzero = Malloc(bool, l); + for (i = 0; i < l; i++) { nonzero[i] = false; } + decision_function* f = Malloc(decision_function, nr_class * (nr_class - 1) / 2); + + double *probA = nullptr, *probB = nullptr; + if (param->probability) + { + probA = Malloc(double, nr_class * (nr_class - 1) / 2); + probB = Malloc(double, nr_class * (nr_class - 1) / 2); + } + + int p = 0; + for (i = 0; i < nr_class; i++) + { + for (int j = i + 1; j < nr_class; j++) + { + svm_problem sub_prob; + int si = start[i], sj = start[j]; + int ci = count[i], cj = count[j]; + sub_prob.l = ci + cj; + sub_prob.x = Malloc(svm_node*, sub_prob.l); + sub_prob.y = Malloc(double, sub_prob.l); + int k; + for (k = 0; k < ci; k++) + { + sub_prob.x[k] = x[si + k]; + sub_prob.y[k] = +1; + } + for (k = 0; k < cj; k++) + { + sub_prob.x[ci + k] = x[sj + k]; + sub_prob.y[ci + k] = -1; + } + + if (param->probability) { svm_binary_svc_probability(&sub_prob, param, weighted_C[i], weighted_C[j], probA[p], probB[p]); } + + f[p] = svm_train_one(&sub_prob, param, weighted_C[i], weighted_C[j]); + for (k = 0; k < ci; k++) { if (!nonzero[si + k] && fabs(f[p].alpha[k]) > 0) { nonzero[si + k] = true; } } + for (k = 0; k < cj; k++) { if (!nonzero[sj + k] && fabs(f[p].alpha[ci + k]) > 0) { nonzero[sj + k] = true; } } + free(sub_prob.x); + free(sub_prob.y); + ++p; + } + } + + // build output + + model->nr_class = nr_class; + + model->label = Malloc(int, nr_class); + for (i = 0; i < nr_class; i++) { model->label[i] = label[i]; } + + model->rho = Malloc(double, nr_class * (nr_class - 1) / 2); + for (i = 0; i < nr_class * (nr_class - 1) / 2; i++) { model->rho[i] = f[i].rho; } + + if (param->probability) + { + model->probA = Malloc(double, nr_class * (nr_class - 1) / 2); + model->probB = Malloc(double, nr_class * (nr_class - 1) / 2); + for (i = 0; i < nr_class * (nr_class - 1) / 2; i++) + { + model->probA[i] = probA[i]; + model->probB[i] = probB[i]; + } + } + else + { + model->probA = nullptr; + model->probB = nullptr; + } + + int total_sv = 0; + int* nz_count = Malloc(int, nr_class); + model->nSV = Malloc(int, nr_class); + for (i = 0; i < nr_class; i++) + { + int nSV = 0; + for (int j = 0; j < count[i]; j++) + { + if (nonzero[start[i] + j]) + { + ++nSV; + ++total_sv; + } + } + model->nSV[i] = nSV; + nz_count[i] = nSV; + } + + info("Total nSV = %d\n", total_sv); + + model->l = total_sv; + model->SV = Malloc(svm_node*, total_sv); + model->sv_indices = Malloc(int, total_sv); + p = 0; + for (i = 0; i < l; i++) + { + if (nonzero[i]) + { + model->SV[p] = x[i]; + model->sv_indices[p++] = perm[i] + 1; + } + } + + int* nz_start = Malloc(int, nr_class); + nz_start[0] = 0; + for (i = 1; i < nr_class; i++) { nz_start[i] = nz_start[i - 1] + nz_count[i - 1]; } + + model->sv_coef = Malloc(double*, nr_class - 1); + for (i = 0; i < nr_class - 1; i++) { model->sv_coef[i] = Malloc(double, total_sv); } + + p = 0; + for (i = 0; i < nr_class; i++) + { + for (int j = i + 1; j < nr_class; j++) + { + // classifier (i,j): coefficients with + // i are in sv_coef[j-1][nz_start[i]...], + // j are in sv_coef[i][nz_start[j]...] + + int si = start[i]; + int sj = start[j]; + int ci = count[i]; + int cj = count[j]; + + int q = nz_start[i]; + int k; + for (k = 0; k < ci; k++) { if (nonzero[si + k]) { model->sv_coef[j - 1][q++] = f[p].alpha[k]; } } + q = nz_start[j]; + for (k = 0; k < cj; k++) { if (nonzero[sj + k]) { model->sv_coef[i][q++] = f[p].alpha[ci + k]; } } + ++p; + } + } + + free(label); + free(probA); + free(probB); + free(count); + free(perm); + free(start); + free(x); + free(weighted_C); + free(nonzero); + for (i = 0; i < nr_class * (nr_class - 1) / 2; i++) { free(f[i].alpha); } + free(f); + free(nz_count); + free(nz_start); + } + return model; +} + +// Stratified cross validation +void svm_cross_validation(const svm_problem* prob, const svm_parameter* param, int nr_fold, double* target) +{ + int i; + const int l = prob->l; + int* perm = Malloc(int, l); + int nr_class; + if (nr_fold > l) + { + nr_fold = l; + fprintf(stderr, "WARNING: # folds > # data. Will use # folds = # data instead (i.e., leave-one-out cross validation)\n"); + } + int* fold_start = Malloc(int, nr_fold + 1); + // stratified cv may not give leave-one-out rate + // Each class to l folds -> some folds may have zero elements + if ((param->svm_type == C_SVC || param->svm_type == NU_SVC) && nr_fold < l) + { + int* start = nullptr; + int* label = nullptr; + int* count = nullptr; + svm_group_classes(prob, &nr_class, &label, &start, &count, perm); + + // random shuffle and then data grouped by fold using the array perm + int* fold_count = Malloc(int, nr_fold); + int c; + int* index = Malloc(int, l); + for (i = 0; i < l; i++) { index[i] = perm[i]; } + for (c = 0; c < nr_class; c++) + { + for (i = 0; i < count[c]; i++) + { + const int j = i + rand() % (count[c] - i); + swap(index[start[c] + j], index[start[c] + i]); + } + } + for (i = 0; i < nr_fold; i++) + { + fold_count[i] = 0; + for (c = 0; c < nr_class; c++) { fold_count[i] += (i + 1) * count[c] / nr_fold - i * count[c] / nr_fold; } + } + fold_start[0] = 0; + for (i = 1; i <= nr_fold; i++) { fold_start[i] = fold_start[i - 1] + fold_count[i - 1]; } + for (c = 0; c < nr_class; c++) + { + for (i = 0; i < nr_fold; i++) + { + const int begin = start[c] + i * count[c] / nr_fold; + const int end = start[c] + (i + 1) * count[c] / nr_fold; + for (int j = begin; j < end; j++) + { + perm[fold_start[i]] = index[j]; + fold_start[i]++; + } + } + } + fold_start[0] = 0; + for (i = 1; i <= nr_fold; i++) { fold_start[i] = fold_start[i - 1] + fold_count[i - 1]; } + free(start); + free(label); + free(count); + free(index); + free(fold_count); + } + else + { + for (i = 0; i < l; i++) { perm[i] = i; } + for (i = 0; i < l; i++) + { + const int j = i + rand() % (l - i); + swap(perm[i], perm[j]); + } + for (i = 0; i <= nr_fold; i++) { fold_start[i] = i * l / nr_fold; } + } + + for (i = 0; i < nr_fold; i++) + { + const int begin = fold_start[i]; + const int end = fold_start[i + 1]; + int j; + struct svm_problem subprob; + + subprob.l = l - (end - begin); + subprob.x = Malloc(struct svm_node*, subprob.l); + subprob.y = Malloc(double, subprob.l); + + int k = 0; + for (j = 0; j < begin; j++) + { + subprob.x[k] = prob->x[perm[j]]; + subprob.y[k] = prob->y[perm[j]]; + ++k; + } + for (j = end; j < l; j++) + { + subprob.x[k] = prob->x[perm[j]]; + subprob.y[k] = prob->y[perm[j]]; + ++k; + } + struct svm_model* submodel = svm_train(&subprob, param); + if (param->probability && (param->svm_type == C_SVC || param->svm_type == NU_SVC)) + { + double* prob_estimates = Malloc(double, svm_get_nr_class(submodel)); + for (j = begin; j < end; j++) { target[perm[j]] = svm_predict_probability(submodel, prob->x[perm[j]], prob_estimates); } + free(prob_estimates); + } + else { for (j = begin; j < end; j++) { target[perm[j]] = svm_predict(submodel, prob->x[perm[j]]); } } + svm_free_and_destroy_model(&submodel); + free(subprob.x); + free(subprob.y); + } + free(fold_start); + free(perm); +} + + +int svm_get_svm_type(const svm_model* model) { return model->param.svm_type; } +int svm_get_nr_class(const svm_model* model) { return model->nr_class; } + +void svm_get_labels(const svm_model* model, int* label) +{ + if (model->label != nullptr) { for (int i = 0; i < model->nr_class; i++) { label[i] = model->label[i]; } } +} + +void svm_get_sv_indices(const svm_model* model, int* indices) +{ + if (model->sv_indices != nullptr) { for (int i = 0; i < model->l; i++) { indices[i] = model->sv_indices[i]; } } +} + +int svm_get_nr_sv(const svm_model* model) { return model->l; } + +double svm_get_svr_probability(const svm_model* model) +{ + if ((model->param.svm_type == EPSILON_SVR || model->param.svm_type == NU_SVR) && model->probA != nullptr) { return model->probA[0]; } + fprintf(stderr, "Model doesn't contain information for SVR probability inference\n"); + return 0; +} + +double svm_predict_values(const svm_model* model, const svm_node* x, double* dec_values) +{ + int i; + if (model->param.svm_type == ONE_CLASS || model->param.svm_type == EPSILON_SVR || model->param.svm_type == NU_SVR) + { + double* sv_coef = model->sv_coef[0]; + double sum = 0; + for (i = 0; i < model->l; i++) { sum += sv_coef[i] * Kernel::k_function(x, model->SV[i], model->param); } + sum -= model->rho[0]; + *dec_values = sum; + + if (model->param.svm_type == ONE_CLASS) { return (sum > 0) ? 1 : -1; } + return sum; + } + const int nr_class = model->nr_class; + const int l = model->l; + + double* kvalue = Malloc(double, l); + for (i = 0; i < l; i++) { kvalue[i] = Kernel::k_function(x, model->SV[i], model->param); } + + int* start = Malloc(int, nr_class); + start[0] = 0; + for (i = 1; i < nr_class; i++) { start[i] = start[i - 1] + model->nSV[i - 1]; } + + int* vote = Malloc(int, nr_class); + for (i = 0; i < nr_class; i++) { vote[i] = 0; } + + int p = 0; + for (i = 0; i < nr_class; i++) + { + for (int j = i + 1; j < nr_class; j++) + { + double sum = 0; + const int si = start[i]; + const int sj = start[j]; + const int ci = model->nSV[i]; + const int cj = model->nSV[j]; + + int k; + double* coef1 = model->sv_coef[j - 1]; + double* coef2 = model->sv_coef[i]; + for (k = 0; k < ci; k++) { sum += coef1[si + k] * kvalue[si + k]; } + for (k = 0; k < cj; k++) { sum += coef2[sj + k] * kvalue[sj + k]; } + sum -= model->rho[p]; + dec_values[p] = sum; + + if (dec_values[p] > 0) { ++vote[i]; } + else { ++vote[j]; } + p++; + } + } + + int vote_max_idx = 0; + for (i = 1; i < nr_class; i++) { if (vote[i] > vote[vote_max_idx]) { vote_max_idx = i; } } + + free(kvalue); + free(start); + free(vote); + return model->label[vote_max_idx]; +} + +double svm_predict(const svm_model* model, const svm_node* x) +{ + const int nr_class = model->nr_class; + double* dec_values; + if (model->param.svm_type == ONE_CLASS || model->param.svm_type == EPSILON_SVR || model->param.svm_type == NU_SVR) { dec_values = Malloc(double, 1); } + else { dec_values = Malloc(double, nr_class * (nr_class - 1) / 2); } + const double pred_result = svm_predict_values(model, x, dec_values); + free(dec_values); + return pred_result; +} + +double svm_predict_probability(const svm_model* model, const svm_node* x, double* prob_estimates) +{ + if ((model->param.svm_type == C_SVC || model->param.svm_type == NU_SVC) && model->probA != nullptr && model->probB != nullptr) + { + int i; + const int nr_class = model->nr_class; + double* dec_values = Malloc(double, nr_class * (nr_class - 1) / 2); + svm_predict_values(model, x, dec_values); + + const double min_prob = 1e-7; + double** pairwise_prob = Malloc(double*, nr_class); + for (i = 0; i < nr_class; i++) { pairwise_prob[i] = Malloc(double, nr_class); } + int k = 0; + for (i = 0; i < nr_class; i++) + { + for (int j = i + 1; j < nr_class; j++) + { + pairwise_prob[i][j] = min(max(sigmoid_predict(dec_values[k], model->probA[k], model->probB[k]), min_prob), 1 - min_prob); + pairwise_prob[j][i] = 1 - pairwise_prob[i][j]; + k++; + } + } + if (nr_class == 2) + { + prob_estimates[0] = pairwise_prob[0][1]; + prob_estimates[1] = pairwise_prob[1][0]; + } + else { multiclass_probability(nr_class, pairwise_prob, prob_estimates); } + + int prob_max_idx = 0; + for (i = 1; i < nr_class; i++) { if (prob_estimates[i] > prob_estimates[prob_max_idx]) { prob_max_idx = i; } } + for (i = 0; i < nr_class; i++) { free(pairwise_prob[i]); } + free(dec_values); + free(pairwise_prob); + return model->label[prob_max_idx]; + } + return svm_predict(model, x); +} + +static const char* svm_type_table[] = { "c_svc", "nu_svc", "one_class", "epsilon_svr", "nu_svr", nullptr }; +static const char* kernel_type_table[] = { "linear", "polynomial", "rbf", "sigmoid", "precomputed", nullptr }; + +int svm_save_model(const char* model_file_name, const svm_model* model) +{ + FILE* fp = fopen(model_file_name, "w"); + if (fp == nullptr) { return -1; } + + char* old_locale = setlocale(LC_ALL, nullptr); + if (old_locale) { old_locale = strdup(old_locale); } + setlocale(LC_ALL, "C"); + + const svm_parameter& param = model->param; + + fprintf(fp, "svm_type %s\n", svm_type_table[param.svm_type]); + fprintf(fp, "kernel_type %s\n", kernel_type_table[param.kernel_type]); + + if (param.kernel_type == POLY) { fprintf(fp, "degree %d\n", param.degree); } + if (param.kernel_type == POLY || param.kernel_type == RBF || param.kernel_type == SIGMOID) { fprintf(fp, "gamma %.17g\n", param.gamma); } + if (param.kernel_type == POLY || param.kernel_type == SIGMOID) { fprintf(fp, "coef0 %.17g\n", param.coef0); } + + const int nr_class = model->nr_class; + const int l = model->l; + fprintf(fp, "nr_class %d\n", nr_class); + fprintf(fp, "total_sv %d\n", l); + + { + fprintf(fp, "rho"); + for (int i = 0; i < nr_class * (nr_class - 1) / 2; i++) { fprintf(fp, " %.17g", model->rho[i]); } + fprintf(fp, "\n"); + } + + if (model->label) + { + fprintf(fp, "label"); + for (int i = 0; i < nr_class; i++) { fprintf(fp, " %d", model->label[i]); } + fprintf(fp, "\n"); + } + + if (model->probA) // regression has probA only + { + fprintf(fp, "probA"); + for (int i = 0; i < nr_class * (nr_class - 1) / 2; i++) { fprintf(fp, " %.17g", model->probA[i]); } + fprintf(fp, "\n"); + } + if (model->probB) + { + fprintf(fp, "probB"); + for (int i = 0; i < nr_class * (nr_class - 1) / 2; i++) { fprintf(fp, " %.17g", model->probB[i]); } + fprintf(fp, "\n"); + } + + if (model->nSV) + { + fprintf(fp, "nr_sv"); + for (int i = 0; i < nr_class; i++) { fprintf(fp, " %d", model->nSV[i]); } + fprintf(fp, "\n"); + } + + fprintf(fp, "SV\n"); + const double* const* sv_coef = model->sv_coef; + const svm_node* const* SV = model->SV; + + for (int i = 0; i < l; i++) + { + for (int j = 0; j < nr_class - 1; j++) { fprintf(fp, "%.17g ", sv_coef[j][i]); } + + const svm_node* p = SV[i]; + + if (param.kernel_type == PRECOMPUTED) { fprintf(fp, "0:%d ", int(p->value)); } + else + { + while (p->index != -1) + { + fprintf(fp, "%d:%.8g ", p->index, p->value); + p++; + } + } + fprintf(fp, "\n"); + } + + setlocale(LC_ALL, old_locale); + free(old_locale); + + if (ferror(fp) != 0 || fclose(fp) != 0) { return -1; } + return 0; +} + +static char* line = nullptr; +static int max_line_len; + +static char* readline(FILE* input) +{ + if (fgets(line, max_line_len, input) == nullptr) { return nullptr; } + + while (strrchr(line, '\n') == nullptr) + { + max_line_len *= 2; + line = (char*)realloc(line, max_line_len); + const int len = int(strlen(line)); + if (fgets(line + len, max_line_len - len, input) == nullptr) { break; } + } + return line; +} + +// +// FSCANF helps to handle fscanf failures. +// Its do-while block avoids the ambiguity when +// if (...) +// FSCANF(); +// is used +// +#define FSCANF(_stream, _format, _var) do{ if (fscanf(_stream, _format, _var) != 1) return false; }while(0) +bool read_model_header(FILE* fp, svm_model* model) +{ + svm_parameter& param = model->param; + // parameters for training only won't be assigned, but arrays are assigned as NULL for safety + param.nr_weight = 0; + param.weight_label = nullptr; + param.weight = nullptr; + + char cmd[81]; + while (true) + { + FSCANF(fp, "%80s", cmd); + + if (strcmp(cmd, "svm_type") == 0) + { + FSCANF(fp, "%80s", cmd); + int i; + for (i = 0; svm_type_table[i]; i++) + { + if (strcmp(svm_type_table[i], cmd) == 0) + { + param.svm_type = i; + break; + } + } + if (svm_type_table[i] == nullptr) + { + fprintf(stderr, "unknown svm type.\n"); + return false; + } + } + else if (strcmp(cmd, "kernel_type") == 0) + { + FSCANF(fp, "%80s", cmd); + int i; + for (i = 0; kernel_type_table[i]; i++) + { + if (strcmp(kernel_type_table[i], cmd) == 0) + { + param.kernel_type = i; + break; + } + } + if (kernel_type_table[i] == nullptr) + { + fprintf(stderr, "unknown kernel function.\n"); + return false; + } + } + else if (strcmp(cmd, "degree") == 0) { FSCANF(fp, "%d", ¶m.degree); } + else if (strcmp(cmd, "gamma") == 0) { FSCANF(fp, "%lf", ¶m.gamma); } + else if (strcmp(cmd, "coef0") == 0) { FSCANF(fp, "%lf", ¶m.coef0); } + else if (strcmp(cmd, "nr_class") == 0) { FSCANF(fp, "%d", &model->nr_class); } + else if (strcmp(cmd, "total_sv") == 0) { FSCANF(fp, "%d", &model->l); } + else if (strcmp(cmd, "rho") == 0) + { + const int n = model->nr_class * (model->nr_class - 1) / 2; + model->rho = Malloc(double, n); + for (int i = 0; i < n; i++) { FSCANF(fp, "%lf", &model->rho[i]); } + } + else if (strcmp(cmd, "label") == 0) + { + const int n = model->nr_class; + model->label = Malloc(int, n); + for (int i = 0; i < n; i++) { FSCANF(fp, "%d", &model->label[i]); } + } + else if (strcmp(cmd, "probA") == 0) + { + const int n = model->nr_class * (model->nr_class - 1) / 2; + model->probA = Malloc(double, n); + for (int i = 0; i < n; i++) { FSCANF(fp, "%lf", &model->probA[i]); } + } + else if (strcmp(cmd, "probB") == 0) + { + const int n = model->nr_class * (model->nr_class - 1) / 2; + model->probB = Malloc(double, n); + for (int i = 0; i < n; i++) { FSCANF(fp, "%lf", &model->probB[i]); } + } + else if (strcmp(cmd, "nr_sv") == 0) + { + const int n = model->nr_class; + model->nSV = Malloc(int, n); + for (int i = 0; i < n; i++) { FSCANF(fp, "%d", &model->nSV[i]); } + } + else if (strcmp(cmd, "SV") == 0) + { + while (true) + { + const int c = getc(fp); + if (c == EOF || c == '\n') { break; } + } + break; + } + else + { + fprintf(stderr, "unknown text in model file: [%s]\n", cmd); + return false; + } + } + + return true; +} + +svm_model* svm_load_model(const char* model_file_name) +{ + FILE* fp = fopen(model_file_name, "rb"); + if (fp == nullptr) { return nullptr; } + + char* old_locale = setlocale(LC_ALL, nullptr); + if (old_locale) { old_locale = strdup(old_locale); } + setlocale(LC_ALL, "C"); + + // read parameters + + svm_model* model = Malloc(svm_model, 1); + model->rho = nullptr; + model->probA = nullptr; + model->probB = nullptr; + model->sv_indices = nullptr; + model->label = nullptr; + model->nSV = nullptr; + + // read header + if (!read_model_header(fp, model)) + { + fprintf(stderr, "ERROR: fscanf failed to read model\n"); + setlocale(LC_ALL, old_locale); + free(old_locale); + free(model->rho); + free(model->label); + free(model->nSV); + free(model); + return nullptr; + } + + // read sv_coef and SV + + int elements = 0; + const long pos = ftell(fp); + + max_line_len = 1024; + line = Malloc(char, max_line_len); + char *p, *endptr; + + while (readline(fp) != nullptr) + { + p = strtok(line, ":"); + while (true) + { + p = strtok(nullptr, ":"); + if (p == nullptr) { break; } + ++elements; + } + } + elements += model->l; + + fseek(fp, pos, SEEK_SET); + + const int m = model->nr_class - 1; + const int l = model->l; + model->sv_coef = Malloc(double*, m); + int i; + for (i = 0; i < m; i++) { model->sv_coef[i] = Malloc(double, l); } + model->SV = Malloc(svm_node*, l); + svm_node* x_space = nullptr; + if (l > 0) { x_space = Malloc(svm_node, elements); } + + int j = 0; + for (i = 0; i < l; i++) + { + readline(fp); + model->SV[i] = &x_space[j]; + + p = strtok(line, " \t"); + model->sv_coef[0][i] = strtod(p, &endptr); + for (int k = 1; k < m; k++) + { + p = strtok(nullptr, " \t"); + model->sv_coef[k][i] = strtod(p, &endptr); + } + + while (true) + { + char* idx = strtok(nullptr, ":"); + char* val = strtok(nullptr, " \t"); + + if (val == nullptr) { break; } + x_space[j].index = int(strtol(idx, &endptr, 10)); + x_space[j].value = strtod(val, &endptr); + + ++j; + } + x_space[j++].index = -1; + } + free(line); + + setlocale(LC_ALL, old_locale); + free(old_locale); + + if (ferror(fp) != 0 || fclose(fp) != 0) { return nullptr; } + + model->free_sv = 1; // XXX + return model; +} + +void svm_free_model_content(svm_model* model_ptr) +{ + if (model_ptr->free_sv && model_ptr->l > 0 && model_ptr->SV != nullptr) { free((void*)(model_ptr->SV[0])); } + if (model_ptr->sv_coef) { for (int i = 0; i < model_ptr->nr_class - 1; i++) { free(model_ptr->sv_coef[i]); } } + + free(model_ptr->SV); + model_ptr->SV = nullptr; + + free(model_ptr->sv_coef); + model_ptr->sv_coef = nullptr; + + free(model_ptr->rho); + model_ptr->rho = nullptr; + + free(model_ptr->label); + model_ptr->label = nullptr; + + free(model_ptr->probA); + model_ptr->probA = nullptr; + + free(model_ptr->probB); + model_ptr->probB = nullptr; + + free(model_ptr->sv_indices); + model_ptr->sv_indices = nullptr; + + free(model_ptr->nSV); + model_ptr->nSV = nullptr; +} + +void svm_free_and_destroy_model(svm_model** model_ptr_ptr) +{ + if (model_ptr_ptr != nullptr && *model_ptr_ptr != nullptr) + { + svm_free_model_content(*model_ptr_ptr); + free(*model_ptr_ptr); + *model_ptr_ptr = nullptr; + } +} + +void svm_destroy_param(svm_parameter* param) +{ + free(param->weight_label); + free(param->weight); +} + +const char* svm_check_parameter(const svm_problem* prob, const svm_parameter* param) +{ + // svm_type + + const int svm_type = param->svm_type; + if (svm_type != C_SVC && svm_type != NU_SVC && svm_type != ONE_CLASS && svm_type != EPSILON_SVR && svm_type != NU_SVR) { return "unknown svm type"; } + + // kernel_type, degree + + const int kernel_type = param->kernel_type; + if (kernel_type != LINEAR && kernel_type != POLY && kernel_type != RBF && kernel_type != SIGMOID && kernel_type != PRECOMPUTED) + { + return "unknown kernel type"; + } + + if ((kernel_type == POLY || kernel_type == RBF || kernel_type == SIGMOID) && param->gamma < 0) { return "gamma < 0"; } + if (kernel_type == POLY && param->degree < 0) { return "degree of polynomial kernel < 0"; } + + // cache_size,eps,C,nu,p,shrinking + + if (param->cache_size <= 0) { return "cache_size <= 0"; } + if (param->eps <= 0) { return "eps <= 0"; } + if (svm_type == C_SVC || svm_type == EPSILON_SVR || svm_type == NU_SVR) { if (param->C <= 0) { return "C <= 0"; } } + if (svm_type == NU_SVC || svm_type == ONE_CLASS || svm_type == NU_SVR) { if (param->nu <= 0 || param->nu > 1) { return "nu <= 0 or nu > 1"; } } + if (svm_type == EPSILON_SVR) { if (param->p < 0) { return "p < 0"; } } + if (param->shrinking != 0 && param->shrinking != 1) { return "shrinking != 0 and shrinking != 1"; } + if (param->probability != 0 && param->probability != 1) { return "probability != 0 and probability != 1"; } + if (param->probability == 1 && svm_type == ONE_CLASS) { return "one-class SVM probability output not supported yet"; } + + + // check whether nu-svc is feasible + + if (svm_type == NU_SVC) + { + const int l = prob->l; + int max_nr_class = 16; + int nr_class = 0; + int* label = Malloc(int, max_nr_class); + int* count = Malloc(int, max_nr_class); + + int i; + for (i = 0; i < l; i++) + { + const int this_label = int(prob->y[i]); + int j; + for (j = 0; j < nr_class; j++) + { + if (this_label == label[j]) + { + ++count[j]; + break; + } + } + if (j == nr_class) + { + if (nr_class == max_nr_class) + { + max_nr_class *= 2; + label = (int*)realloc(label, max_nr_class * sizeof(int)); + count = (int*)realloc(count, max_nr_class * sizeof(int)); + } + label[nr_class] = this_label; + count[nr_class] = 1; + ++nr_class; + } + } + + for (i = 0; i < nr_class; i++) + { + const int n1 = count[i]; + for (int j = i + 1; j < nr_class; j++) + { + const int n2 = count[j]; + if (param->nu * (n1 + n2) / 2 > min(n1, n2)) + { + free(label); + free(count); + return "specified nu is infeasible"; + } + } + } + free(label); + free(count); + } + + return nullptr; +} + +int svm_check_probability_model(const svm_model* model) +{ + return ((model->param.svm_type == C_SVC || model->param.svm_type == NU_SVC) && model->probA != nullptr && model->probB != nullptr) + || ((model->param.svm_type == EPSILON_SVR || model->param.svm_type == NU_SVR) && model->probA != nullptr); +} + +void svm_set_print_string_function(void (*print_func)(const char*)) +{ + if (print_func == nullptr) { svm_print_string = &print_string_stdout; } + else { svm_print_string = print_func; } +} diff --git a/Masterarbeit/openvibe/extras-master/contrib/packages/libSVM/svm.h b/Masterarbeit/openvibe/extras-master/contrib/packages/libSVM/svm.h new file mode 100644 index 0000000..9b81ee8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/packages/libSVM/svm.h @@ -0,0 +1,112 @@ +#pragma once + +#define LIBSVM_VERSION 324 + +extern "C" { + +extern int libsvm_version; + +struct svm_node +{ + int index; + double value; +}; + +struct svm_problem +{ + int l; + double* y; + struct svm_node** x; +}; + +enum { C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR }; // svm_type +enum { LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED }; // kernel_type + +/* Table help you to transforms Enums to strings */ +//extern static const char *svm_type_table[5]; +//extern static const char *kernel_type_table[5]; +inline const char* get_svm_type(const unsigned int code) +{ + static const char* svm_type_table[] = { "c_svc", "nu_svc", "one_class", "epsilon_svr", "nu_svr", nullptr }; + return svm_type_table[code]; +} + +inline const char* get_kernel_type(const unsigned int code) +{ + static const char* types[] = { "linear", "polynomial", "rbf", "sigmoid", "precomputed", nullptr }; + return types[code]; +} + +struct svm_parameter +{ + int svm_type; + int kernel_type; + int degree; // for poly + double gamma; // for poly/rbf/sigmoid + double coef0; // for poly/sigmoid + + // these are for training only + double cache_size; // in MB + double eps; // stopping criteria + double C; // for C_SVC, EPSILON_SVR and NU_SVR + int nr_weight; // for C_SVC + int* weight_label; // for C_SVC + double* weight; // for C_SVC + double nu; // for NU_SVC, ONE_CLASS, and NU_SVR + double p; // for EPSILON_SVR + int shrinking; // use the shrinking heuristics + int probability; // do probability estimates +}; + +// +// svm_model +// +struct svm_model +{ + struct svm_parameter param; // parameter + int nr_class; // number of classes, = 2 in regression/one class svm + int l; // total #SV + struct svm_node** SV; // SVs (SV[l]) + double** sv_coef; // coefficients for SVs in decision functions (sv_coef[k-1][l]) + double* rho; // constants in decision functions (rho[k*(k-1)/2]) + double* probA; // pariwise probability information + double* probB; + int* sv_indices; // sv_indices[0,...,nSV-1] are values in [1,...,num_traning_data] to indicate SVs in the training set + + // for classification only + + int* label; // label of each class (label[k]) + int* nSV; // number of SVs for each class (nSV[k]) + // nSV[0] + nSV[1] + ... + nSV[k-1] = l + // XXX + int free_sv; // 1 if svm_model is created by svm_load_model + // 0 if svm_model is created by svm_train +}; + +struct svm_model* svm_train(const struct svm_problem* prob, const struct svm_parameter* param); +void svm_cross_validation(const struct svm_problem* prob, const struct svm_parameter* param, int nr_fold, double* target); + +int svm_save_model(const char* model_file_name, const struct svm_model* model); +struct svm_model* svm_load_model(const char* model_file_name); + +int svm_get_svm_type(const struct svm_model* model); +int svm_get_nr_class(const struct svm_model* model); +void svm_get_labels(const struct svm_model* model, int* label); +void svm_get_sv_indices(const struct svm_model* model, int* indices); +int svm_get_nr_sv(const struct svm_model* model); +double svm_get_svr_probability(const struct svm_model* model); + +double svm_predict_values(const struct svm_model* model, const struct svm_node* x, double* dec_values); +double svm_predict(const struct svm_model* model, const struct svm_node* x); +double svm_predict_probability(const struct svm_model* model, const struct svm_node* x, double* prob_estimates); + +void svm_free_model_content(struct svm_model* model_ptr); +void svm_free_and_destroy_model(struct svm_model** model_ptr_ptr); +void svm_destroy_param(struct svm_parameter* param); + +const char* svm_check_parameter(const struct svm_problem* prob, const struct svm_parameter* param); +int svm_check_probability_model(const struct svm_model* model); + +void svm_set_print_string_function(void (*print_func)(const char*)); + +} diff --git a/Masterarbeit/openvibe/extras-master/contrib/packages/wavelet2d/COPYING b/Masterarbeit/openvibe/extras-master/contrib/packages/wavelet2d/COPYING new file mode 100755 index 0000000..623b625 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/packages/wavelet2d/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Masterarbeit/openvibe/extras-master/contrib/packages/wavelet2d/COPYRIGHT b/Masterarbeit/openvibe/extras-master/contrib/packages/wavelet2d/COPYRIGHT new file mode 100755 index 0000000..135d4e5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/packages/wavelet2d/COPYRIGHT @@ -0,0 +1,18 @@ +/*Copyright (C) 2011 Rafat Hussain + + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 or any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + *You should have received a copy of the GNU General Public License + *along with this program; if not, write to the Free Software + *Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/packages/wavelet2d/README b/Masterarbeit/openvibe/extras-master/contrib/packages/wavelet2d/README new file mode 100755 index 0000000..8360acd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/packages/wavelet2d/README @@ -0,0 +1,22 @@ +1. This package contains two wavelet libraries- libwavelet2d.so.1.0 (shared) and libwavelet2s.a (static) compiled essentially from the same source code. Source code is available in the 'src' folder. + +2. You may need to link to header files that are included with their resepctive libraries. They are also available in the 'src' folder. + +3. You may want to install shared library in one of your existing paths to make compilation easier. You can create sym links once inside the folder( say /usr/local/lib) by using following commands + +ln -sf libwavelet2d.so.1.0 libwavelet2d.so +ln -sf libwavelet2d.so.1.0 libwavelet2d.so.1 +ldconfig + +You will probably need superuser privileges to perform previous steps. If you don't have su privilege then you can move libwavelet2d.so.1.0 to your work folder or where your source code is, create sym links as before and then put your folder in the path during runtime. + +ln -sf libwavelet2d.so.1.0 libwavelet2d.so +ln -sf libwavelet2d.so.1.0 libwavelet2d.so.1 +export LD_LIBRARY_PATH=. + +libwavelet2s.a : Working with static library is pretty straightforward. You will only need to include wavelet2s.h in your program and specify the library (-lwavelet2s flag) , include path (-I flag) and library path (-L flag). + + +4. These libraries are licensed under GNU-GPL v2.0 (or any later version). See COPYRIGHT and COPYING files for more information. + +5. These libraries statically link to FFTW-3.2.2 static library. More information, fftw libraries and associated files for this version are available at www.fftw.org. I have not modified fftw source codes in any way shape or form so you may want to download copies of source code and other files from the FFTW website itself if you are so inclined. However, you will find FFTW3 licensing and copyright information in the fftw3 folder. diff --git a/Masterarbeit/openvibe/extras-master/contrib/packages/wavelet2d/wavelet2s.cpp b/Masterarbeit/openvibe/extras-master/contrib/packages/wavelet2d/wavelet2s.cpp new file mode 100755 index 0000000..f18c786 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/packages/wavelet2d/wavelet2s.cpp @@ -0,0 +1,3447 @@ +//============================================================================ +// Name : 1D/2D Wavelet Transform +// Author : Rafat Hussain +// Version : +// Copyright : GNU Lesser GPL License +// Description : Wavelet Library +//============================================================================ +/*Copyright (C) 2011 Rafat Hussain + + * This program is free software; you can redistribute it and/or modify it under the terms of + * the GNU General Public License as published by the Free Software Foundation; version 2 or any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + *You should have received a copy of the GNU General Public License + *along with this program; if not, write to the Free Software + *Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ +#if defined(TARGET_HAS_ThirdPartyFFTW3) + +#include "wavelet2s.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "fftw3.h" + +// extern "C" int _get_output_format( void ){ return 0; } + +fftw_plan plan_forward_inp, plan_forward_filt, plan_backward; +static std::size_t fftTransientSize = 0; + + +void* per_ext2d(std::vector>& signal, std::vector>& temp2, const int a) +{ + const std::size_t rows = signal.size(); + const std::size_t cols = signal[0].size(); + const std::size_t cols2 = (cols % 2) != 0 ? cols + 1 : cols; + std::vector> tempVec(rows, std::vector(cols2 + 2 * a)); + + for (std::size_t i = 0; i < rows; ++i) + { + std::vector sig; + for (std::size_t j = 0; j < cols; ++j) + { + double temp = signal[i][j]; + sig.push_back(temp); + } + per_ext(sig, a); + for (std::size_t j = 0; j < sig.size(); ++j) { tempVec[i][j] = sig[j]; } + } + for (std::size_t j = 0; j < tempVec[0].size(); ++j) + { + std::vector sig; + for (std::size_t i = 0; i < rows; ++i) + { + double temp = tempVec[i][j]; + sig.push_back(temp); + } + per_ext(sig, a); + for (std::size_t i = 0; i < sig.size(); ++i) { temp2[i][j] = sig[i]; } + } + + + return nullptr; +} + +void* swt_2d(std::vector>& sig, int J, const std::string& nm, std::vector& swtOutput) +{ + std::size_t m = sig.size(); // No. of rows + std::size_t n = sig[0].size(); //No. of columns + + //std::vector> sig2 = sig; + + std::size_t nRows = m; + std::size_t nCols = n; + std::vector lp1, hp1, lp2, hp2; + filtcoef(nm, lp1, hp1, lp2, hp2); + + for (std::size_t it = 0; it < std::size_t(J); ++it) + { + int U = int(pow(2.0, double(it))); + std::vector lowPass, highPass; + if (it > 0) + { + upsamp(lp1, U, lowPass); + upsamp(hp1, U, highPass); + } + else + { + lowPass = lp1; + highPass = hp1; + } + int lf = lowPass.size(); + + if ((sig.size() % 2) == 0) { nRows = sig.size(); } + else { nRows = sig.size() + 1; } + + if ((sig[0].size() % 2) == 0) { nCols = sig[0].size(); } + else { nCols = sig[0].size() + 1; } + + std::vector> signal(nRows + lf, std::vector(nCols + lf)); + // per_ext2d(sig,signal,lf/2); Edit per_ext if you want to use per_ext2d. Remove + // the even indexing. + + per_ext2d(sig, signal, lf / 2); + std::size_t lenX = signal.size(); + std::size_t lenY = signal[0].size(); + std::vector> sigL(nRows + lf, std::vector(nCols)); + std::vector> sigH(nRows + lf, std::vector(nCols)); + std::vector> cA(nRows, std::vector(nCols)); + std::vector> cH(nRows, std::vector(nCols)); + std::vector> cV(nRows, std::vector(nCols)); + std::vector> cD(nRows, std::vector(nCols)); + + for (std::size_t i = 0; i < lenX; ++i) + { + std::vector tempRow; + for (std::size_t j = 0; j < lenY; ++j) { tempRow.push_back(signal[i][j]); } + + // ------------------Low Pass Branch-------------------------- + std::vector oup; + convfftm(tempRow, lowPass, oup); + oup.erase(oup.begin(), oup.begin() + lf); + oup.erase(oup.begin() + nCols, oup.end()); + + // ------------------High Pass Branch-------------------------- + std::vector oup2; + convfftm(tempRow, highPass, oup2); + oup2.erase(oup2.begin(), oup2.begin() + lf); + oup2.erase(oup2.begin() + nCols, oup2.end()); + + tempRow.clear(); + + for (std::size_t j = 0; j < oup.size(); ++j) + { + sigL[i][j] = oup[j]; + sigH[i][j] = oup2[j]; + } + } + + for (std::size_t j = 0; j < nCols; ++j) + { + std::vector tempRow; + for (std::size_t i = 0; i < lenX; ++i) { tempRow.push_back(sigL[i][j]); } + + // ------------------Low Pass Branch-------------------------- + + + std::vector oup; + convfftm(tempRow, lowPass, oup); + oup.erase(oup.begin(), oup.begin() + lf); + oup.erase(oup.begin() + nRows, oup.end()); + + // ------------------High Pass Branch-------------------------- + + std::vector oup2; + convfftm(tempRow, highPass, oup2); + oup2.erase(oup2.begin(), oup2.begin() + lf); + oup2.erase(oup2.begin() + nRows, oup2.end()); + + tempRow.clear(); + + + for (std::size_t i = 0; i < oup.size(); ++i) { cA[i][j] = oup[i]; } + for (std::size_t i = 0; i < oup2.size(); ++i) { cH[i][j] = oup2[i]; } + } + + for (std::size_t j = 0; j < nCols; ++j) + { + std::vector tempRow; + for (std::size_t i = 0; i < lenX; ++i) { tempRow.push_back(sigH[i][j]); } + + // ------------------Low Pass Branch-------------------------- + std::vector oup; + convfftm(tempRow, lowPass, oup); + oup.erase(oup.begin(), oup.begin() + lf); + oup.erase(oup.begin() + nRows, oup.end()); + + // ------------------High Pass Branch-------------------------- + std::vector oup2; + convfftm(tempRow, highPass, oup2); + oup2.erase(oup2.begin(), oup2.begin() + lf); + oup2.erase(oup2.begin() + nRows, oup2.end()); + + tempRow.clear(); + + + for (std::size_t i = 0; i < oup.size(); ++i) { cV[i][j] = oup[i]; } + for (std::size_t i = 0; i < oup2.size(); ++i) { cD[i][j] = oup2[i]; } + } + + sig = cA; + std::vector tempSig2; + + if (it == std::size_t(J - 1)) { for (std::size_t i = 0; i < nRows; ++i) { for (std::size_t j = 0; j < nCols; ++j) { tempSig2.push_back(cA[i][j]); } } } + for (std::size_t i = 0; i < nRows; ++i) { for (std::size_t j = nCols; j < nCols * 2; ++j) { tempSig2.push_back(cH[i][j - nCols]); } } + for (std::size_t i = nRows; i < nRows * 2; ++i) { for (std::size_t j = 0; j < nCols; ++j) { tempSig2.push_back(cV[i - nRows][j]); } } + for (std::size_t i = nRows; i < nRows * 2; ++i) { for (std::size_t j = nCols; j < nCols * 2; ++j) { tempSig2.push_back(cD[i - nRows][j - nCols]); } } + + swtOutput.insert(swtOutput.begin(), tempSig2.begin(), tempSig2.end()); + } + + return nullptr; +} + + +void* per_ext(std::vector& sig, const int a) +{ + std::size_t len = sig.size(); + if ((len % 2) != 0) + { + sig.push_back(sig[len - 1]); + len = sig.size(); + } + + for (std::size_t i = 0; i < std::size_t(a); ++i) + { + double temp1 = sig[2 * i]; + double temp2 = sig[len - 1]; + sig.insert(sig.begin(), temp2); + sig.insert(sig.end(), temp1); + } + + return nullptr; +} + + +void* iswt(std::vector& swtop, int J, const std::string& nm, std::vector& iswtOutput) +{ + std::size_t n = swtop.size() / (J + 1); + + std::vector lpd, hpd, lpr, hpr; + filtcoef(nm, lpd, hpd, lpr, hpr); + + std::vector appxSig; + + std::vector lowPass = lpr; + std::vector highPass = hpr; + int lf = lowPass.size(); + + for (std::size_t iter = 0; iter < std::size_t(J); ++iter) + { + std::vector detSig; + if (iter == 0) + { + for (std::size_t i = 0; i < n; ++i) + { + double temp = swtop[i]; + appxSig.push_back(temp); + double temp1 = swtop[(iter + 1) * n + i]; + detSig.push_back(temp1); + } + } + else + { + for (std::size_t i = 0; i < n; ++i) + { + double temp1 = swtop[(iter + 1) * n + i]; + detSig.push_back(temp1); + } + } + + + std::size_t value = std::size_t(pow(2.0, double(J - 1 - iter))); + iswtOutput.assign(n, 0.0); + + for (std::size_t count = 0; count < value; ++count) + { + std::vector appx1, det1; + for (std::size_t index = count; index < n; index += value) + { + double temp = appxSig[index]; + appx1.push_back(temp); + double temp1 = detSig[index]; + det1.push_back(temp1); + } + std::size_t len = appx1.size(); + + // Shift = 0 + + std::vector appx2, det2; + + for (std::size_t i = 0; i < len; i += 2) + { + double temp = appx1[i]; + appx2.push_back(temp); + double temp1 = det1[i]; + det2.push_back(temp1); + } + + int U = 2; // Upsampling Factor + + std::vector cL0, cH0; + upsamp(appx2, U, cL0); + upsamp(det2, U, cH0); + per_ext(cL0, lf / 2); + per_ext(cH0, lf / 2); + + std::vector oup00L, oup00H, oup00; + convfft(cL0, lowPass, oup00L); + convfft(cH0, highPass, oup00H); + + oup00L.erase(oup00L.begin(), oup00L.begin() + lf - 1); + oup00L.erase(oup00L.begin() + len, oup00L.end()); + oup00H.erase(oup00H.begin(), oup00H.begin() + lf - 1); + oup00H.erase(oup00H.begin() + len, oup00H.end()); + + vecsum(oup00L, oup00H, oup00); + + // Shift = 1 + + std::vector appx3, det3; + + for (std::size_t i = 1; i < len; i += 2) + { + double temp = appx1[i]; + appx3.push_back(temp); + double temp1 = det1[i]; + det3.push_back(temp1); + } + + + std::vector cL1, cH1; + upsamp(appx3, U, cL1); + upsamp(det3, U, cH1); + per_ext(cL1, lf / 2); + per_ext(cH1, lf / 2); + + std::vector oup01L, oup01H, oup01; + convfft(cL1, lowPass, oup01L); + convfft(cH1, highPass, oup01H); + + oup01L.erase(oup01L.begin(), oup01L.begin() + lf - 1); + oup01L.erase(oup01L.begin() + len, oup01L.end()); + oup01H.erase(oup01H.begin(), oup01H.begin() + lf - 1); + oup01H.erase(oup01H.begin() + len, oup01H.end()); + + vecsum(oup01L, oup01H, oup01); + circshift(oup01, -1); + + // Continue + std::size_t index2 = 0; + for (std::size_t index = count; index < n; index += value) + { + double temp = oup00[index2] + oup01[index2]; + iswtOutput.at(index) = temp / 2; + index2++; + } + } + appxSig = iswtOutput; + } + return nullptr; +} + +void* swt(std::vector& signal1, const int J, const std::string& nm, std::vector& swtOutput, int& length) +{ + std::vector lpd, hpd, lpr, hpr; + std::vector sig = signal1; + + const std::size_t n = sig.size(); + length = int(n); + + filtcoef(nm, lpd, hpd, lpr, hpr); + + for (std::size_t iter = 0; iter < std::size_t(J); ++iter) + { + std::vector lowPass; + std::vector highPass; + if (iter > 0) + { + const int m = int(pow(2.0, iter)); + upsamp(lpd, m, lowPass); + upsamp(hpd, m, highPass); + } + else + { + lowPass = lpd; + highPass = hpd; + } + + const std::size_t lenFilt = lowPass.size(); + per_ext(sig, int(lenFilt / 2)); + + std::vector cA; + convfft(sig, lowPass, cA); + std::vector cD; + convfft(sig, highPass, cD); + // Resize cA and cD + cA.erase(cA.begin(), cA.begin() + lenFilt); + cA.erase(cA.begin() + n, cA.end()); + cD.erase(cD.begin(), cD.begin() + lenFilt); + cD.erase(cD.begin() + n, cD.end()); + // Reset signal value; + + sig = cA; + + if (iter == std::size_t(J - 1)) + { + swtOutput.insert(swtOutput.begin(), cD.begin(), cD.end()); + swtOutput.insert(swtOutput.begin(), cA.begin(), cA.end()); + } + else { swtOutput.insert(swtOutput.begin(), cD.begin(), cD.end()); } + } + + return nullptr; +} + +void* DwtOutputDimSym(std::vector& length, std::vector& length2, const int J) +{ + const std::size_t sz = length.size(); + std::size_t rows = length[sz - 2]; + std::size_t cols = length[sz - 1]; + for (std::size_t i = 0; i < std::size_t(J); ++i) + { + rows = std::size_t(ceil(double(rows) / 2.0)); + cols = std::size_t(ceil(double(cols) / 2.0)); + } + for (std::size_t i = 0; i < std::size_t(J + 1); ++i) + { + length2.push_back(rows); + length2.push_back(cols); + rows = rows * 2; + cols = cols * 2; + } + return nullptr; +} + +void* dwt_output_dim2(std::vector& length, std::vector& length2, const int j) +{ + std::size_t row = length[0]; + std::size_t col = length[1]; + + for (std::size_t i = 0; i < std::size_t(j + 1); ++i) + { + length2.push_back(row); + length2.push_back(col); + row = row * 2; + col = col * 2; + } + + + return nullptr; +} + +void* dispDWT(std::vector& output, std::vector>& dwtdisp, std::vector& length, std::vector& length2, const int J) +{ + std::size_t sum = 0; + + for (std::size_t it = 0; it < std::size_t(J); ++it) + { + const int dRows = int(length[2 * it] - length2[2 * it]); + const int dCols = int(length[2 * it + 1] - length2[2 * it + 1]); + + const std::size_t nRows = length[2 * it]; + const std::size_t nCols = length[2 * it + 1]; + std::vector> oDwt(2 * nRows, std::vector(2 * nCols)); + if (it == 0) + { + for (std::size_t i = 0; i < nRows; ++i) { for (std::size_t j = 0; j < nCols; ++j) { oDwt[i][j] = output[i * nCols + j]; } } + + for (std::size_t i = 0; i < nRows; ++i) + { + for (std::size_t j = nCols; j < nCols * 2; ++j) { oDwt[i][j] = output[nRows * nCols + i * nCols + (j - nCols)]; } + } + + for (std::size_t i = nRows; i < nRows * 2; ++i) + { + for (std::size_t j = 0; j < nCols; ++j) { oDwt[i][j] = output[2 * nRows * nCols + (i - nRows) * nCols + j]; } + } + + + for (std::size_t i = nRows; i < nRows * 2; ++i) + { + for (std::size_t j = nCols; j < nCols * 2; ++j) { oDwt[i][j] = output[3 * nRows * nCols + (i - nRows) * nCols + (j - nCols)]; } + } + } + else + { + for (std::size_t i = 0; i < nRows; ++i) { for (std::size_t j = nCols; j < nCols * 2; ++j) { oDwt[i][j] = output[sum + i * nCols + (j - nCols)]; } } + + for (std::size_t i = nRows; i < nRows * 2; ++i) + { + for (std::size_t j = 0; j < nCols; ++j) { oDwt[i][j] = output[sum + nRows * nCols + (i - nRows) * nCols + j]; } + } + + + for (std::size_t i = nRows; i < nRows * 2; ++i) + { + for (std::size_t j = nCols; j < nCols * 2; ++j) { oDwt[i][j] = output[sum + 2 * nRows * nCols + (i - nRows) * nCols + (j - nCols)]; } + } + } + + const std::size_t rowsX = length2[2 * it]; + const std::size_t colsX = length2[2 * it + 1]; + + const int dCols2 = int(ceil(double(dCols - 1) / 2.0)); + const int dRows2 = int(ceil(double(dRows - 1) / 2.0)); + if (it == 0) + { + for (std::size_t i = 0; i < rowsX; ++i) + { + for (std::size_t j = 0; j < colsX; ++j) + { + if (i + dRows - 1 < 0) { dwtdisp[i][j] = 0; } + else if (j + dCols - 1 < 0) { dwtdisp[i][j] = 0; } + else { dwtdisp[i][j] = oDwt[i + dRows - 1][j + dCols - 1]; } + } + } + } + for (std::size_t i = 0; i < rowsX; ++i) + { + for (std::size_t j = colsX; j < colsX * 2; ++j) + { + if (i + dRows2 < 0) { dwtdisp[i][j] = 0; } + else if (int(j + 2 * (dCols - 1) + 1) > signed(oDwt[0].size()) - 1) { dwtdisp[i][j] = 0; } + else { dwtdisp[i][j] = oDwt[i + dRows2][j + 2 * (dCols - 1) + 1]; } + } + } + + for (std::size_t i = rowsX; i < rowsX * 2; ++i) + { + for (std::size_t j = 0; j < colsX; ++j) + { + if (int(i + 2 * (dRows - 1) + 1) > signed(oDwt.size()) - 1) { dwtdisp[i][j] = 0; } + else if (j + dCols2 < 0) { dwtdisp[i][j] = 0; } + else { dwtdisp[i][j] = oDwt[i + 2 * (dRows - 1) + 1][j + dCols2]; } + } + } + + for (std::size_t i = rowsX; i < rowsX * 2; ++i) + { + for (std::size_t j = colsX; j < colsX * 2; ++j) + { + if (int(i + (dRows - 1) + 1 + dRows2) > signed(oDwt.size()) - 1) { dwtdisp[i][j] = 0; } + else if (int(j + (dCols - 1) + 1 + dCols2) > signed(oDwt[0].size()) - 1) { dwtdisp[i][j] = 0; } + else { dwtdisp[i][j] = oDwt[i + (dRows - 1) + 1 + dRows2][j + (dCols - 1) + 1 + dCols2]; } + } + } + if (it == 0) { sum += 4 * nRows * nCols; } + else { sum += 3 * nRows * nCols; } + } + + return nullptr; +} + +void symm_ext2d(std::vector>& signal, std::vector>& temp2, const int a) +{ + const std::size_t rows = signal.size(); + const std::size_t cols = signal[0].size(); + std::vector> tempVec(rows, std::vector(cols + 2 * a)); + + for (std::size_t i = 0; i < rows; ++i) + { + std::vector sig; + for (std::size_t j = 0; j < cols; ++j) + { + double temp = signal[i][j]; + sig.push_back(temp); + } + symm_ext(sig, a); + for (std::size_t j = 0; j < sig.size(); ++j) { tempVec[i][j] = sig[j]; } + } + for (std::size_t j = 0; j < tempVec[0].size(); ++j) + { + std::vector sig; + for (std::size_t i = 0; i < rows; ++i) + { + double temp = tempVec[i][j]; + sig.push_back(temp); + } + symm_ext(sig, a); + for (std::size_t i = 0; i < sig.size(); ++i) { temp2[i][j] = sig[i]; } + } +} + +void* circshift2d(std::vector>& signal, const int x, const int y) +{ + const std::size_t rows = signal.size(); + const std::size_t cols = signal[0].size(); + std::vector> tempVec(rows, std::vector(cols)); + + for (std::size_t i = 0; i < rows; ++i) + { + std::vector sig; + for (std::size_t j = 0; j < cols; ++j) + { + double temp = signal[i][j]; + sig.push_back(temp); + } + circshift(sig, x); + for (std::size_t j = 0; j < cols; ++j) { tempVec[i][j] = sig[j]; } + } + + for (std::size_t j = 0; j < cols; ++j) + { + std::vector sig; + for (std::size_t i = 0; i < rows; ++i) + { + double temp = tempVec[i][j]; + sig.push_back(temp); + } + circshift(sig, y); + for (std::size_t i = 0; i < rows; ++i) { signal[i][j] = sig[i]; } + } + return nullptr; +} + +void* idwt_2d_sym(std::vector& dwtop, std::vector& flag, const std::string& nm, std::vector>& idwtOutput, std::vector& length) +{ + int J = int(flag[0]); + std::size_t rows = length[0]; + std::size_t cols = length[1]; + + std::size_t sumCoef = 0; + std::vector lp1, hp1, lp2, hp2; + filtcoef(nm, lp1, hp1, lp2, hp2); + std::size_t lf = lp1.size(); + std::vector> cLL(rows, std::vector(cols)); + + + for (std::size_t it = 0; it < std::size_t(J); ++it) + { + std::size_t nRows = length[2 * it]; + std::size_t nCols = length[2 * it + 1]; + + std::vector> cLH(nRows, std::vector(nCols)); + std::vector> cHL(nRows, std::vector(nCols)); + std::vector> cHH(nRows, std::vector(nCols)); + + for (std::size_t i = 0; i < nRows; ++i) + { + for (std::size_t j = 0; j < nCols; ++j) + { + if (it == 0) + { + cLL[i][j] = dwtop[sumCoef + i * nCols + j]; + cLH[i][j] = dwtop[sumCoef + nRows * nCols + i * nCols + j]; + cHL[i][j] = dwtop[sumCoef + 2 * nRows * nCols + i * nCols + j]; + cHH[i][j] = dwtop[sumCoef + 3 * nRows * nCols + i * nCols + j]; + } + else + { + cLH[i][j] = dwtop[sumCoef + i * nCols + j]; + cHL[i][j] = dwtop[sumCoef + nRows * nCols + i * nCols + j]; + cHH[i][j] = dwtop[sumCoef + 2 * nRows * nCols + i * nCols + j]; + } + } + } + + + // temp_A = cLL; + // idwt2_sym(nm,idwtOutput2, cA, cH,cV,cD); + + std::size_t lenX = cLH.size(); + std::size_t lenY = cLH[0].size(); + + // Row Upsampling and Column Filtering at the first LP Stage + std::vector> cL(2 * lenX - lf + 2, std::vector(lenY)); + std::vector> cH(2 * lenX - lf + 2, std::vector(lenY)); + + if (it == 0) + { + for (std::size_t j = 0; j < lenY; ++j) + { + std::vector sigLL, sigLH, oup; + + for (std::size_t i = 0; i < lenX; ++i) + { + double temp1 = cLL[i][j]; + double temp2 = cLH[i][j]; + sigLL.push_back(temp1); + sigLH.push_back(temp2); + } + idwt1_sym_m(nm, oup, sigLL, sigLH); + + for (std::size_t i = 0; i < oup.size(); ++i) { cL[i][j] = oup[i]; } + } + } + else + { + std::size_t rows1 = cLH.size(); + std::size_t cols1 = cLH[0].size(); + + for (std::size_t j = 0; j < cols1; ++j) + { + std::vector tempL1, tempL2, oup; + for (std::size_t i = 0; i < rows1; ++i) + { + double temp = cLL[i][j]; + tempL1.push_back(temp); + + double temp2 = cLH[i][j]; + tempL2.push_back(temp2); + } + idwt1_sym_m(nm, oup, tempL1, tempL2); + + for (std::size_t i = 0; i < oup.size(); ++i) { cL[i][j] = oup[i]; } + } + } + + + for (std::size_t j = 0; j < lenY; ++j) + { + std::vector sigHL, sigHH, oup2; + for (std::size_t i = 0; i < lenX; ++i) + { + double temp3 = cHL[i][j]; + double temp4 = cHH[i][j]; + sigHL.push_back(temp3); + sigHH.push_back(temp4); + } + idwt1_sym_m(nm, oup2, sigHL, sigHH); + + for (std::size_t i = 0; i < oup2.size(); ++i) { cH[i][j] = oup2[i]; } + } + + std::vector> signal(2 * lenX - lf + 2, std::vector(2 * lenY - lf + 2)); + for (std::size_t i = 0; i < 2 * lenX - lf + 2; ++i) + { + std::vector sigL, sigH, oup; + for (std::size_t j = 0; j < lenY; ++j) + { + double temp5 = cL[i][j]; + double temp6 = cH[i][j]; + sigL.push_back(temp5); + sigH.push_back(temp6); + } + idwt1_sym_m(nm, oup, sigL, sigH); + + for (std::size_t j = 0; j < oup.size(); ++j) { signal[i][j] = oup[j]; } + } + + + idwtOutput = signal; + + + if (it == 0) { sumCoef += 4 * nRows * nCols; } + else { sumCoef += 3 * nRows * nCols; } + cLL = signal; + } + + + return nullptr; +} + + +void* dwt2_sym(const std::string& name, std::vector>& signal, std::vector>& cLL, std::vector>& cLH, + std::vector>& cHL, std::vector>& cHH) +{ + //Analysis + const std::size_t rows = signal.size(); + std::size_t cols = signal[0].size(); + const std::size_t colsLp1 = cLL[0].size(); + const std::size_t colsHp1 = cLL[0].size(); + std::vector lp1, hp1, lp2, hp2; + filtcoef(name, lp1, hp1, lp2, hp2); + std::vector> lpDn1(rows, std::vector(colsLp1)); + std::vector> hpDn1(rows, std::vector(colsHp1)); + + // Implementing row filtering and column downsampling in each branch. + for (std::size_t i = 0; i < rows; ++i) + { + std::vector tempRow, oupLp, oupHp; + for (std::size_t j = 0; j < cols; ++j) + { + double temp = signal[i][j]; + tempRow.push_back(temp); + } + dwt1_sym_m(name, tempRow, oupLp, oupHp); + + for (std::size_t j = 0; j < oupLp.size(); ++j) + { + lpDn1[i][j] = oupLp[j]; + hpDn1[i][j] = oupHp[j]; + } + } + + + cols = colsLp1; + // Implementing column filtering and row downsampling in Low Pass branch. + + for (std::size_t j = 0; j < cols; ++j) + { + std::vector tempRow3, oupLp, oupHp; + for (std::size_t i = 0; i < rows; ++i) + { + double temp = lpDn1[i][j]; + tempRow3.push_back(temp); + } + dwt1_sym_m(name, tempRow3, oupLp, oupHp); + + for (std::size_t i = 0; i < oupLp.size(); ++i) + { + cLL[i][j] = oupLp[i]; + cLH[i][j] = oupHp[i]; + } + } + + + // Implementing column filtering and row downsampling in High Pass branch. + + for (std::size_t j = 0; j < cols; ++j) + { + std::vector tempRow5, oupLp, oupHp; + for (std::size_t i = 0; i < rows; ++i) + { + double temp = hpDn1[i][j]; + tempRow5.push_back(temp); + } + dwt1_sym_m(name, tempRow5, oupLp, oupHp); + + for (std::size_t i = 0; i < oupLp.size(); ++i) + { + cHL[i][j] = oupLp[i]; + cHH[i][j] = oupHp[i]; + } + } + return nullptr; +} + + +void* dwt_2d_sym(std::vector>& origsig, const int J, const std::string& nm, std::vector& dwtOutput, std::vector& flag, std::vector& length) +{ + // flag will contain + + std::vector> sig = origsig; + std::size_t nRows = sig.size(); // No. of rows + std::size_t nCols = sig[0].size(); //No. of columns + std::vector> originalCopy = sig; + const int maxIter = std::min(int(ceil(log(double(sig.size())) / log(2.0))), int(ceil(log(double(sig[0].size())) / log(2.0)))); + if (maxIter < J) + { + std::cout << J << " Iterations are not possible with signals of this dimension " << std::endl; + exit(1); + } + std::vector lp1, hp1, lp2, hp2; + + flag.push_back(double(J)); + + + length.insert(length.begin(), nCols); + length.insert(length.begin(), nRows); + + + // Flag Values + /* + double temp = (double) (sig2.size() - sig.size()); // Number of zeropad rows + flag.push_back(temp); + double temp2 = (double) (sig2[0].size() - sig[0].size());// Number of zpad cols + flag.push_back(temp2); + flag.push_back((double) J); // Number of Iterations + */ + std::size_t sumCoef = 0; + for (std::size_t iter = 0; iter < std::size_t(J); ++iter) + { + filtcoef(nm, lp1, hp1, lp2, hp2); + const std::size_t lf = lp1.size(); + + nRows = std::size_t(floor(double(nRows + lf - 1) / 2)); + nCols = std::size_t(floor(double(nCols + lf - 1) / 2)); + length.insert(length.begin(), nCols); + length.insert(length.begin(), nRows); + + std::vector> cA(nRows, std::vector(nCols)); + std::vector> cH(nRows, std::vector(nCols)); + std::vector> cV(nRows, std::vector(nCols)); + std::vector> cD(nRows, std::vector(nCols)); + + if (iter == 0) { dwt2_sym(nm, originalCopy, cA, cH, cV, cD); } + else { dwt2_sym(nm, originalCopy, cA, cH, cV, cD); } + std::vector tempSig2; + + originalCopy = cA; + if (iter == std::size_t(J - 1)) + { + for (std::size_t i = 0; i < nRows; ++i) + { + for (std::size_t j = 0; j < nCols; ++j) + { + double temp = cA[i][j]; + tempSig2.push_back(temp); + } + } + } + for (std::size_t i = 0; i < nRows; ++i) + { + for (std::size_t j = nCols; j < nCols * 2; ++j) + { + double temp = cH[i][j - nCols]; + tempSig2.push_back(temp); + } + } + + for (std::size_t i = nRows; i < nRows * 2; ++i) + { + for (std::size_t j = 0; j < nCols; ++j) + { + double temp = cV[i - nRows][j]; + tempSig2.push_back(temp); + } + } + + for (std::size_t i = nRows; i < nRows * 2; ++i) + { + for (std::size_t j = nCols; j < nCols * 2; ++j) + { + double temp = cD[i - nRows][j - nCols]; + tempSig2.push_back(temp); + } + } + + dwtOutput.insert(dwtOutput.begin(), tempSig2.begin(), tempSig2.end()); + sumCoef += 4 * nRows * nCols; + } + /* + ofstream dwt2out("dwt2out.dat"); + for (std::size_t i= 0; i < dwtOutput.size(); ++i){ dwt2out << dwtOutput[i] <& x, std::vector& app, std::vector& detail) +{ + std::vector flag; + std::vector idwtOutput; + std::vector length; + length[0] = app.size(); + length[1] = detail.size(); + std::vector dwtop = app; + dwtop.insert(dwtop.end(), detail.begin(), detail.end()); + flag.push_back(1); + flag.push_back(0); + idwt_sym(dwtop, flag, wname, idwtOutput, length); + x = idwtOutput; + + return nullptr; +} + +void* idwt1_sym_m(const std::string& wname, std::vector& x, std::vector& app, std::vector& detail) +{ + const int U = 2; // Upsampling Factor + std::vector lpd1, hpd1, lpr1, hpr1; + + filtcoef(wname, lpd1, hpd1, lpr1, hpr1); + const std::size_t lf = lpr1.size(); + + // Operations in the Low Frequency branch of the Synthesis Filter Bank + std::vector xLp, cAUp; + upsamp(app, U, cAUp); + cAUp.pop_back(); + convfftm(cAUp, lpr1, xLp); + + + // Operations in the High Frequency branch of the Synthesis Filter Bank + std::vector xHp, cDUp; + upsamp(detail, U, cDUp); + cDUp.pop_back(); + convfftm(cDUp, hpr1, xHp); + + + vecsum(xLp, xHp, x); + + x.erase(x.begin(), x.begin() + lf - 2); + x.erase(x.end() - (lf - 2), x.end()); + + return nullptr; +} + + +void* symm_ext(std::vector& sig, const int a) +{ + const std::size_t len = sig.size(); + for (std::size_t i = 0; i < std::size_t(a); ++i) + { + double temp1 = sig[i * 2]; + double temp2 = sig[len - 1]; + sig.insert(sig.begin(), temp1); + sig.insert(sig.end(), temp2); + } + + return nullptr; +} + +void* idwt_sym(std::vector& dwtop, std::vector& flag, const std::string& nm, std::vector& idwtOutput, std::vector& length) +{ + const int J = int(flag[1]); + + std::vector app, detail; + std::size_t appLen = length[0], detLen = length[1]; + + const auto dwt = dwtop.begin(); + app.assign(dwt, dwtop.begin() + appLen); + detail.assign(dwtop.begin() + appLen, dwtop.begin() + 2 * appLen); + + for (std::size_t i = 0; i < std::size_t(J); ++i) + { + const int U = 2; // Upsampling Factor + std::vector lpd1, hpd1, lpr1, hpr1; + + filtcoef(nm, lpd1, hpd1, lpr1, hpr1); + const std::size_t lf = lpr1.size(); + + // Operations in the Low Frequency branch of the Synthesis Filter Bank + std::vector xLp, cAUp; + upsamp(app, U, cAUp); + cAUp.pop_back(); + convfft(cAUp, lpr1, xLp); + + // Operations in the High Frequency branch of the Synthesis Filter Bank + std::vector xHp; + std::vector cDUp; + upsamp(detail, U, cDUp); + cDUp.pop_back(); + convfft(cDUp, hpr1, xHp); + + appLen += detLen; + vecsum(xLp, xHp, idwtOutput); + + idwtOutput.erase(idwtOutput.begin(), idwtOutput.begin() + lf - 2); + idwtOutput.erase(idwtOutput.end() - (lf - 2), idwtOutput.end()); + + app.clear(); + detail.clear(); + if (i < std::size_t(J - 1)) + { + detLen = length[i + 2]; + // detail.assign(dwtop.begin()+app_len, dwtop.begin()+ det_len); + + for (std::size_t l = 0; l < detLen; ++l) + { + double temp = dwtop[appLen + l]; + detail.push_back(temp); + } + } + app = idwtOutput; + + for (std::size_t iter1 = 0; iter1 < app.size() - detLen; iter1++) { app.pop_back(); } + } + + + // Remove ZeroPadding + + const int zerop = int(flag[0]); + idwtOutput.erase(idwtOutput.end() - zerop, idwtOutput.end()); + return nullptr; +} + +void* dwt1_sym(const std::string& wname, std::vector& signal, std::vector& cA, std::vector& cD) +{ + std::vector lp1, hp1, lp2, hp2; + + filtcoef(wname, lp1, hp1, lp2, hp2); + const int d = 2; // Downsampling Factor is 2 + const int lf = int(lp1.size()); + symm_ext(signal, lf - 1); + + std::vector cAUndec; + //sig value + convfft(signal, lp1, cAUndec); + cAUndec.erase(cAUndec.begin(), cAUndec.begin() + lf); + cAUndec.erase(cAUndec.end() - lf + 1, cAUndec.end()); + downsamp(cAUndec, d, cA); + // cA.erase(cA.begin(),cA.begin()+(int) ceil(((double)lf-1.0)/2.0)); + // cA.erase(cA.end()-(int) ceil(((double)lf-1.0)/2.0),cA.end()); + + + //High Pass Branch Computation + + std::vector cDUndec; + convfft(signal, hp1, cDUndec); + cDUndec.erase(cDUndec.begin(), cDUndec.begin() + lf); + cDUndec.erase(cDUndec.end() - lf + 1, cDUndec.end()); + downsamp(cDUndec, d, cD); + // cD.erase(cD.begin(),cD.begin()+(int) ceil(((double)lf-1.0)/2.0)); + // cD.erase(cD.end()-(int) ceil(((double)lf-1.0)/2.0),cD.end()); + + filtcoef(wname, lp1, hp1, lp2, hp2); + + return nullptr; +} + +void* dwt1_sym_m(const std::string& wname, std::vector& signal, std::vector& cA, std::vector& cD) +{ + std::vector lp1, hp1, lp2, hp2; + + filtcoef(wname, lp1, hp1, lp2, hp2); + const int d = 2; // Downsampling Factor is 2 + const int lf = int(lp1.size()); + symm_ext(signal, lf - 1); + + std::vector cAUndec; + //sig value + convfftm(signal, lp1, cAUndec); + cAUndec.erase(cAUndec.begin(), cAUndec.begin() + lf); + cAUndec.erase(cAUndec.end() - lf + 1, cAUndec.end()); + downsamp(cAUndec, d, cA); + // cA.erase(cA.begin(),cA.begin()+(int) ceil(((double)lf-1.0)/2.0)); + // cA.erase(cA.end()-(int) ceil(((double)lf-1.0)/2.0),cA.end()); + + + //High Pass Branch Computation + + std::vector cDUndec; + convfftm(signal, hp1, cDUndec); + cDUndec.erase(cDUndec.begin(), cDUndec.begin() + lf); + cDUndec.erase(cDUndec.end() - lf + 1, cDUndec.end()); + downsamp(cDUndec, d, cD); + // cD.erase(cD.begin(),cD.begin()+(int) ceil(((double)lf-1.0)/2.0)); + // cD.erase(cD.end()-(int) ceil(((double)lf-1.0)/2.0),cD.end()); + + filtcoef(wname, lp1, hp1, lp2, hp2); + + return nullptr; +} + +void* dwt_sym(std::vector& signal, const int J, const std::string& nm, std::vector& dwtOutput, std::vector& flag, std::vector& length) +{ + std::size_t tempLen = signal.size(); + if ((tempLen % 2) != 0) + { + const double temp = signal[tempLen - 1]; + signal.push_back(temp); + flag.push_back(1); + tempLen++; + } + else { flag.push_back(0); } + length.push_back(tempLen); + flag.push_back(double(J)); + // flag[2] contains symmetric extension length + + + std::vector appxSig, detSig; + const std::vector originalCopy = signal; + + + // Storing Filter Values for GnuPlot + std::vector lp1, hp1, lp2, hp2; + filtcoef(nm, lp1, hp1, lp2, hp2); + for (std::size_t iter = 0; iter < std::size_t(J); ++iter) + { + dwt1_sym(nm, signal, appxSig, detSig); + dwtOutput.insert(dwtOutput.begin(), detSig.begin(), detSig.end()); + std::size_t temp = detSig.size(); + length.insert(length.begin(), temp); + + if (iter == std::size_t(J - 1)) + { + dwtOutput.insert(dwtOutput.begin(), appxSig.begin(), appxSig.end()); + length.insert(length.begin(), appxSig.size()); + } + + signal.clear(); + signal = appxSig; + appxSig.clear(); + detSig.clear(); + } + signal = originalCopy; + + return nullptr; +} + + +void* freq(std::vector& sig, std::vector& freqResp) +{ + const std::size_t k = sig.size(); + const std::size_t n = std::size_t(pow(2.0, ceil(log10(double(k)) / log10(2.0)))); + std::vector> fftOup; + for (std::size_t i = 0; i < sig.size(); ++i) + { + double temp = sig[i]; + fftOup.push_back(std::complex(temp, 0)); + } + fft(fftOup, 1, n); + + for (std::size_t i = 0; i < n; ++i) + { + double temp = abs(fftOup[i]); + freqResp.push_back(temp); + } + circshift(freqResp, int(n) / 2); + return nullptr; +} + +double convfft(std::vector& a, std::vector& b, std::vector& c) +{ + const std::size_t sz = a.size() + b.size() - 1; + fftw_complex* inpData = static_cast(fftw_malloc(sizeof(fftw_complex) * sz)); + fftw_complex* filtData = static_cast(fftw_malloc(sizeof(fftw_complex) * sz)); + + fftw_complex* inpFFT = static_cast(fftw_malloc(sizeof(fftw_complex) * sz)); + fftw_complex* filtFFT = static_cast(fftw_malloc(sizeof(fftw_complex) * sz)); + + fftw_complex* tempData = static_cast(fftw_malloc(sizeof(fftw_complex) * sz)); + fftw_complex* tempIfft = static_cast(fftw_malloc(sizeof(fftw_complex) * sz)); + + fftw_plan plan_forward_inp = fftw_plan_dft_1d(int(sz), inpData, inpFFT, FFTW_FORWARD, FFTW_ESTIMATE); + fftw_plan plan_forward_filt = fftw_plan_dft_1d(int(sz), filtData, filtFFT, FFTW_FORWARD, FFTW_ESTIMATE); + fftw_plan plan_backward = fftw_plan_dft_1d(int(sz), tempData, tempIfft, FFTW_BACKWARD, FFTW_ESTIMATE); + + + for (std::size_t i = 0; i < sz; ++i) + { + if (i < a.size()) { inpData[i][0] = a[i]; } + else { inpData[i][0] = 0.0; } + inpData[i][1] = 0.0; + if (i < b.size()) { filtData[i][0] = b[i]; } + else { filtData[i][0] = 0.0; } + filtData[i][1] = 0.0; + } + + + fftw_execute(plan_forward_inp); + + fftw_execute(plan_forward_filt); + + for (std::size_t i = 0; i < sz; ++i) + { + tempData[i][0] = inpFFT[i][0] * filtFFT[i][0] - inpFFT[i][1] * filtFFT[i][1]; + tempData[i][1] = inpFFT[i][0] * filtFFT[i][1] + inpFFT[i][1] * filtFFT[i][0]; + } + + + fftw_execute(plan_backward); + + for (std::size_t i = 0; i < sz; ++i) + { + double temp1; + temp1 = tempIfft[i][0] / double(sz); + c.push_back(temp1); + } + fftw_free(inpData); + fftw_free(filtData); + fftw_free(inpFFT); + fftw_free(filtFFT); + fftw_free(tempData); + fftw_free(tempIfft); + fftw_destroy_plan(plan_forward_inp); + fftw_destroy_plan(plan_forward_filt); + fftw_destroy_plan(plan_backward); + + return 0; +} + +double convfftm(std::vector& a, std::vector& b, std::vector& c) +{ + const std::size_t sz = a.size() + b.size() - 1; + fftw_complex* inpData = static_cast(fftw_malloc(sizeof(fftw_complex) * sz)); + fftw_complex* filtData = static_cast(fftw_malloc(sizeof(fftw_complex) * sz)); + + fftw_complex* inpFFT = static_cast(fftw_malloc(sizeof(fftw_complex) * sz)); + fftw_complex* filtFFT = static_cast(fftw_malloc(sizeof(fftw_complex) * sz)); + + fftw_complex* tempData = static_cast(fftw_malloc(sizeof(fftw_complex) * sz)); + fftw_complex* tempIfft = static_cast(fftw_malloc(sizeof(fftw_complex) * sz)); + + if (sz != fftTransientSize) + { + if (fftTransientSize != 0) + { + fftw_destroy_plan(plan_forward_inp); + fftw_destroy_plan(plan_forward_filt); + fftw_destroy_plan(plan_backward); + } + + plan_forward_inp = fftw_plan_dft_1d(int(sz), inpData, inpFFT, FFTW_FORWARD, FFTW_MEASURE); + plan_forward_filt = fftw_plan_dft_1d(int(sz), filtData, filtFFT, FFTW_FORWARD, FFTW_MEASURE); + plan_backward = fftw_plan_dft_1d(int(sz), tempData, tempIfft, FFTW_BACKWARD, FFTW_MEASURE); + fftTransientSize = sz; + } + + for (std::size_t i = 0; i < sz; ++i) + { + if (i < a.size()) { inpData[i][0] = a[i]; } + else { inpData[i][0] = 0.0; } + inpData[i][1] = 0.0; + if (i < b.size()) { filtData[i][0] = b[i]; } + else { filtData[i][0] = 0.0; } + filtData[i][1] = 0.0; + } + + + fftw_execute_dft(plan_forward_inp, inpData, inpFFT); + fftw_execute_dft(plan_forward_filt, filtData, filtFFT); + + + for (std::size_t i = 0; i < sz; ++i) + { + tempData[i][0] = inpFFT[i][0] * filtFFT[i][0] - inpFFT[i][1] * filtFFT[i][1]; + tempData[i][1] = inpFFT[i][0] * filtFFT[i][1] + inpFFT[i][1] * filtFFT[i][0]; + } + + fftw_execute_dft(plan_backward, tempData, tempIfft); + + + for (std::size_t i = 0; i < sz; ++i) + { + double temp1; + temp1 = tempIfft[i][0] / double(sz); + c.push_back(temp1); + } + fftw_free(inpData); + fftw_free(filtData); + fftw_free(inpFFT); + fftw_free(filtFFT); + fftw_free(tempData); + fftw_free(tempIfft); + + return 0; +} + +void* fft(std::vector>& data, const int sign, std::size_t n) +{ + double pi = - 3.14159265358979; + if (sign == 1 || sign == -1) { pi = sign * pi; } + else + { + std::cout << "Format fft(data, num), num = +1(fft) and num = -1 (Ifft)" << std::endl; + exit(1); + } + const std::size_t len = data.size(); + const auto it = data.end(); + if (len != n) + { + const std::size_t al = n - len; + data.insert(it, al, std::complex(0, 0)); + } + + const std::size_t k = std::size_t(pow(2.0, ceil(log10(double(n)) / log10(2.0)))); + const auto it1 = data.end(); + if (n < k) + { + const std::size_t al = k - n; + data.insert(it1, al, std::complex(0, 0)); + n = k; + } + + bitreverse(data); + + // radix2(data); + for (std::size_t iter = 1; iter < n; iter <<= 1) + { + const std::size_t step = iter << 1; + + const double theta = pi / double(iter); + + double wtemp = sin(theta * .5); + // Multipliers + const double wreal = -2 * wtemp * wtemp; + const double wimag = sin(theta); + + // Factors + double wr = 1.0; + double wi = 0.0; + // Iteration through two loops + + for (std::size_t m = 0; m < iter; ++m) + { + // Iteration within m + for (std::size_t i = m; i < n; i += step) + { + // jth position + const std::size_t j = i + iter; + + double tempr = wr * std::real(data[j]) - wi * std::imag(data[j]); + double tempi = wr * std::imag(data[j]) + wi * std::real(data[j]); + + std::complex temp(tempr, tempi); + data[j] = data[i] - temp; + data[i] += temp; + } + // Twiddle Factors updated + wtemp = wr; + wr += wr * wreal - wi * wimag; + wi += wi * wreal + wtemp * wimag; + } + } + + if (sign == -1) + { + const double scale = 1.0 / double(n); + for (std::size_t i = 0; i < n; ++i) { data[i] *= scale; } + } + + + // Place holder + return nullptr; +} + + +void* bitreverse(std::vector>& sig) +{ + const std::size_t len = sig.size(); + const std::size_t n = std::size_t(pow(2.0, ceil(log10(double(len)) / log10(2.0)))); + std::size_t rev = 0; + // Processing Input Data + for (std::size_t iter = 0; iter < n; ++iter) + { + if (rev > iter) + { + // Replacing current values with reversed values + + double tempr = std::real(sig[rev]); + double tempi = std::imag(sig[rev]); + const std::complex temp(tempr, tempi); + sig[rev] = sig[iter]; + sig[iter] = temp; + } + // Using filter "filt" such that the value of reverse changes with each iteration + std::size_t filt = n; + while (rev & (filt >>= 1)) { rev &= ~filt; } + rev |= filt; + } + return nullptr; +} + + +void* dwt(std::vector& sig, int j, const std::string& nm, std::vector& dwtOutput, std::vector& flag, std::vector& length) +{ + const int maxIter = int(ceil(log(double(sig.size())) / log(2.0))) - 2; + + if (maxIter < j) { j = maxIter; } + + std::vector appxSig, detSig; + const std::vector originalCopy = sig; + + // Zero Pad the Signal to nearest 2^ M value ,where M is an integer. + std::size_t tempLen = sig.size(); + if ((tempLen % 2) != 0) + { + const double temp = sig[tempLen - 1]; + sig.push_back(temp); + flag.push_back(1); + tempLen++; + } + else { flag.push_back(0); } + length.push_back(tempLen); + flag.push_back(double(j)); + + std::vector orig = sig; + + + // Storing Filter Values for GnuPlot + std::vector lp1, hp1, lp2, hp2; + filtcoef(nm, lp1, hp1, lp2, hp2); + + + for (std::size_t iter = 0; iter < std::size_t(j); ++iter) + { + dwt1(nm, orig, appxSig, detSig); + dwtOutput.insert(dwtOutput.begin(), detSig.begin(), detSig.end()); + + const int temp = detSig.size(); + length.insert(length.begin(), temp); + + if (iter == std::size_t(j - 1)) + { + dwtOutput.insert(dwtOutput.begin(), appxSig.begin(), appxSig.end()); + std::size_t temp2 = appxSig.size(); + length.insert(length.begin(), temp2); + } + + orig = appxSig; + appxSig.clear(); + detSig.clear(); + } + + sig = originalCopy; + return nullptr; +} + + +void circshift(std::vector& sigCir, int l) +{ + if (abs(l) > int(sigCir.size())) { l = sign(l) * int(abs(l) % sigCir.size()); } + + if (l < 0) + { + l = int((sigCir.size() + l) % sigCir.size()); + // std::cout << "L" << L << std::endl; + } + for (std::size_t i = 0; i < std::size_t(l); ++i) + { + sigCir.push_back(sigCir[0]); + sigCir.erase(sigCir.begin()); + } +} + +double convol(std::vector& a1, std::vector& b1, std::vector& c) +{ + const std::size_t lenC = a1.size() + b1.size() - 1; + std::vector a = a1; + std::vector b = b1; + std::vector oup(lenC); + const auto itA = a.end(); + const double al = double(lenC - a.size()); + a.insert(itA, al, 0); + + const auto itB = b.end(); + const double bl = double(lenC - b.size()); + b.insert(itB, bl, 0); + + for (std::size_t ini = 0; ini < lenC; ++ini) + { + oup[ini] = 0; + double temp = 0; + for (std::size_t jni = 0; jni <= ini; ++jni) + { + const double ou1 = a[jni] * b[ini - jni]; + oup[ini] += ou1; + } + temp = oup[ini]; + c.push_back(temp); + } + oup.clear(); + return 0; +} + +void downsamp(std::vector& sig, const int m, std::vector& sigD) +{ + const std::size_t len = sig.size(); + const std::size_t n = std::size_t(ceil(double(len) / double(m))); + for (std::size_t i = 0; i < n; ++i) + { + double temp = sig[i * m]; + sigD.push_back(temp); + } +} + + +void* dwt1(const std::string& wname, std::vector& signal, std::vector& cA, std::vector& cD) +{ + std::vector lpd, hpd, lpr, hpr; + + filtcoef(wname, lpd, hpd, lpr, hpr); + + const std::size_t lenLpfilt = lpd.size(); + const std::size_t lenHpfilt = hpd.size(); + const std::size_t lenAvg = (lenLpfilt + lenHpfilt) / 2; + const std::size_t lenSig = 2 * std::size_t(ceil(double(signal.size()) / 2.0)); + + // std::cout << lenLpfilt << "Filter" << std::endl; + per_ext(signal, int(lenAvg / 2)); // Periodic Extension + // computations designed to deal with boundary distortions + + // Low Pass Filtering Operations in the Analysis Filter Bank Section + // int len_cA =(int) floor(double (len_sig + lenLpfilt -1) / double (2)); + std::vector cAUndec; + // convolving signal with lpd, Low Pass Filter, and O/P is stored in cA_undec + convfft(signal, lpd, cAUndec); + const int d = 2; // Downsampling Factor is 2 + cAUndec.erase(cAUndec.begin(), cAUndec.begin() + lenAvg - 1); + cAUndec.erase(cAUndec.end() - lenAvg + 1, cAUndec.end()); + cAUndec.erase(cAUndec.begin() + lenSig, cAUndec.end()); + cAUndec.erase(cAUndec.begin()); + + + // Downsampling by 2 gives cA + downsamp(cAUndec, d, cA); + + // cA.erase(cA.begin(),cA.begin()+len_avg/2); + // cA.erase(cA.end()-len_avg/2,cA.end()); + + // High Pass Filtering Operations in the Analysis Filter Bank Section + // int len_cA =(int) floor(double (len_sig + lenLpfilt -1) / double (2)); + + std::vector cDUndec; + // convolving signal with lpd, Low Pass Filter, and O/P is stored in cA_undec + convfft(signal, hpd, cDUndec); + cDUndec.erase(cDUndec.begin(), cDUndec.begin() + lenAvg - 1); + cDUndec.erase(cDUndec.end() - lenAvg + 1, cDUndec.end()); + cDUndec.erase(cDUndec.begin() + lenSig, cDUndec.end()); + cDUndec.erase(cDUndec.begin()); + + // Downsampling Factor is 2 + + // Downsampling by 2 gives cA + downsamp(cDUndec, d, cD); + + // cD.erase(cD.begin(),cD.begin()+len_avg/2); + // cD.erase(cD.end()-len_avg/2,cD.end()); + + filtcoef(wname, lpd, hpd, lpr, hpr); + + return nullptr; +} + +void* dwt1_m(const std::string& wname, std::vector& signal, std::vector& cA, std::vector& cD) +{ + std::vector lpd, hpd, lpr, hpr; + + filtcoef(wname, lpd, hpd, lpr, hpr); + + const std::size_t lenLpfilt = lpd.size(); + const std::size_t lenHpfilt = hpd.size(); + const std::size_t lenAvg = (lenLpfilt + lenHpfilt) / 2; + const std::size_t lenSig = 2 * std::size_t(ceil(double(signal.size()) / 2.0)); + + // std::cout << lenLpfilt << "Filter" << std::endl; + per_ext(signal, int(lenAvg / 2)); // Periodic Extension + // computations designed to deal with boundary distortions + + // Low Pass Filtering Operations in the Analysis Filter Bank Section + // int len_cA =(int) floor(double (len_sig + lenLpfilt -1) / double (2)); + std::vector cAUndec; + // convolving signal with lpd, Low Pass Filter, and O/P is stored in cA_undec + convfftm(signal, lpd, cAUndec); + const int d = 2; // Downsampling Factor is 2 + cAUndec.erase(cAUndec.begin(), cAUndec.begin() + lenAvg - 1); + cAUndec.erase(cAUndec.end() - lenAvg + 1, cAUndec.end()); + cAUndec.erase(cAUndec.begin() + lenSig, cAUndec.end()); + cAUndec.erase(cAUndec.begin()); + + + // Downsampling by 2 gives cA + downsamp(cAUndec, d, cA); + + // cA.erase(cA.begin(),cA.begin()+len_avg/2); + // cA.erase(cA.end()-len_avg/2,cA.end()); + + // High Pass Filtering Operations in the Analysis Filter Bank Section + // int len_cA =(int) floor(double (len_sig + lenLpfilt -1) / double (2)); + + std::vector cDUndec; + // convolving signal with lpd, Low Pass Filter, and O/P is stored in cA_undec + convfftm(signal, hpd, cDUndec); + cDUndec.erase(cDUndec.begin(), cDUndec.begin() + lenAvg - 1); + cDUndec.erase(cDUndec.end() - lenAvg + 1, cDUndec.end()); + cDUndec.erase(cDUndec.begin() + lenSig, cDUndec.end()); + cDUndec.erase(cDUndec.begin()); + + // Downsampling Factor is 2 + + // Downsampling by 2 gives cA + downsamp(cDUndec, d, cD); + + // cD.erase(cD.begin(),cD.begin()+len_avg/2); + // cD.erase(cD.end()-len_avg/2,cD.end()); + + filtcoef(wname, lpd, hpd, lpr, hpr); + + return nullptr; +} + + +void* dyadic_zpad_1d(std::vector& signal) +{ + const std::size_t n = signal.size(); + const double m = log10(double(n)) / log10(2.0); + const int d = int(ceil(m)); + const double intVal = pow(2.0, double(d)) - pow(2.0, m); + + const int z = int(intVal); + const auto itA = signal.end(); + const double val = signal[n - 1]; + // double val = 0; + signal.insert(itA, z, val); + return nullptr; +} + + +void* idwt(std::vector& dwtop, std::vector& flag, const std::string& nm, std::vector& idwtOutput, std::vector& length) +{ + const std::size_t j = std::size_t(flag[1]); + // int zpad =(int) flag[0]; + + std::vector app; + std::vector detail; + std::size_t appLen = length[0]; + std::size_t detLen = length[1]; + + const auto dwt = dwtop.begin(); + app.assign(dwt, dwtop.begin() + appLen); + detail.assign(dwtop.begin() + appLen, dwtop.begin() + 2 * appLen); + + for (std::size_t i = 0; i < j; ++i) + { + idwt1(nm, idwtOutput, app, detail); + appLen += detLen; + app.clear(); + detail.clear(); + if (i < j - 1) + { + detLen = length[i + 2]; + for (std::size_t l = 0; l < detLen; ++l) + { + double temp = dwtop[appLen + l]; + detail.push_back(temp); + } + app = idwtOutput; + + if (app.size() >= detail.size()) + { + const std::size_t t = app.size() - detail.size(); + const std::size_t lent = std::size_t(floor(double(t) / 2.0)); + app.erase(app.begin() + detail.size() + lent, app.end()); + app.erase(app.begin(), app.begin() + lent); + } + } + + //int value1 = (int) ceil(double(app.size() - det_len)/2.0); + //int value2 = (int) floor(double(app.size() - det_len)/2.0); + + //app.erase(app.end() -value2,app.end()); + //app.erase(app.begin(),app.begin()+value1); + } + + + // Remove ZeroPadding + + const int zerop = int(flag[0]); + idwtOutput.erase(idwtOutput.end() - zerop, idwtOutput.end()); + + return nullptr; +} + +void* idwt1_m(const std::string& wname, std::vector& x, std::vector& cA, std::vector& cD) +{ + std::vector lpd1, hpd1, lpr1, hpr1; + + filtcoef(wname, lpd1, hpd1, lpr1, hpr1); + const std::size_t lenLpfilt = lpr1.size(); + const std::size_t lenHpfilt = hpr1.size(); + const std::size_t lenAvg = (lenLpfilt + lenHpfilt) / 2; + const std::size_t n = 2 * cD.size(); + const int U = 2; // Upsampling Factor + + // Operations in the Low Frequency branch of the Synthesis Filter Bank + + std::vector cAUp; + std::vector xLp; + // int len1 = cAUp.size(); + upsamp(cA, U, cAUp); + per_ext(cAUp, int(lenAvg / 2)); + convfftm(cAUp, lpr1, xLp); + + // Operations in the High Frequency branch of the Synthesis Filter Bank + std::vector cDUp, xHp; + upsamp(cD, U, cDUp); + per_ext(cDUp, int(lenAvg / 2)); + convfftm(cDUp, hpr1, xHp); + + // Remove periodic extension + // X.erase(X.begin(),X.begin()+len_avg+len_avg/2-1); + // X.erase(X.end()-len_avg-len_avg/2,X.end()); + xLp.erase(xLp.begin() + n + lenAvg - 1, xLp.end()); + xLp.erase(xLp.begin(), xLp.begin() + lenAvg - 1); + xHp.erase(xHp.begin() + n + lenAvg - 1, xHp.end()); + xHp.erase(xHp.begin(), xHp.begin() + lenAvg - 1); + vecsum(xLp, xHp, x); + return nullptr; +} + +void* idwt1(const std::string& wname, std::vector& X, std::vector& cA, std::vector& cD) +{ + std::vector lpd1, hpd1, lpr1, hpr1; + + filtcoef(wname, lpd1, hpd1, lpr1, hpr1); + const std::size_t lenLpfilt = lpr1.size(); + const std::size_t lenHpfilt = hpr1.size(); + const std::size_t lenAvg = (lenLpfilt + lenHpfilt) / 2; + const std::size_t n = 2 * cD.size(); + const int U = 2; // Upsampling Factor + + // Operations in the Low Frequency branch of the Synthesis Filter Bank + + std::vector cAUp, xLp; + // int len1 = cAUp.size(); + upsamp(cA, U, cAUp); + + per_ext(cAUp, int(lenAvg / 2)); + + + convfft(cAUp, lpr1, xLp); + + + // Operations in the High Frequency branch of the Synthesis Filter Bank + + std::vector cDUp, xHp; + upsamp(cD, U, cDUp); + per_ext(cDUp, int(lenAvg / 2)); + + + convfft(cDUp, hpr1, xHp); + + // Remove periodic extension + + // X.erase(X.begin(),X.begin()+len_avg+len_avg/2-1); + // X.erase(X.end()-len_avg-len_avg/2,X.end()); + + xLp.erase(xLp.begin() + n + lenAvg - 1, xLp.end()); + xLp.erase(xLp.begin(), xLp.begin() + lenAvg - 1); + + xHp.erase(xHp.begin() + n + lenAvg - 1, xHp.end()); + xHp.erase(xHp.begin(), xHp.begin() + lenAvg - 1); + + vecsum(xLp, xHp, X); + + return nullptr; +} + +int sign(const int x) +{ + if (x >= 0) { return 1; } + return -1; +} + +void upsamp(std::vector& sig, const int m, std::vector& sigU) +{ + const std::size_t len = sig.size(); + const std::size_t n = std::size_t(ceil(double(len) * double(m))); + + for (std::size_t i = 0; i < n; ++i) + { + if (i % m == 0) + { + double temp = sig[i / m]; + sigU.push_back(temp); + } + else { sigU.push_back(0); } + } +} + +double OPSum(const double i, const double j) { return (i + j); } + +int vecsum(std::vector& a, std::vector& b, std::vector& c) +{ + c.resize(a.size()); + transform(a.begin(), a.end(), b.begin(), b.begin(), OPSum); + c = b; + return 0; +} + +void* getcoeff2d(std::vector>& dwtoutput, std::vector>& cH, std::vector>& cV, + std::vector>& cD, std::vector& flag, int& n) +{ + if (n > flag[2]) + { + std::cout << "Signal is decimated only up to " << flag[2] << " levels" << std::endl; + exit(1); + } + const std::size_t rows = dwtoutput.size(); + const std::size_t cols = dwtoutput[0].size(); + // Getting Horizontal Coefficients + const std::size_t r = std::size_t(ceil(double(rows) / pow(2.0, n))); + const std::size_t c = std::size_t(ceil(double(cols) / pow(2.0, n))); + + for (std::size_t i = 0; i < std::size_t(ceil(double(rows) / pow(2.0, n))); ++i) + { + for (std::size_t j = 0; j < std::size_t(ceil(double(cols) / pow(2.0, n))); ++j) { cH[i][j] = dwtoutput[i][c + j]; } + } + for (std::size_t i = 0; i < std::size_t(ceil(double(rows) / pow(2.0, n))); ++i) + { + for (std::size_t j = 0; j < std::size_t(ceil(double(cols) / pow(2.0, n))); ++j) { cV[i][j] = dwtoutput[i + r][j]; } + } + for (std::size_t i = 0; i < std::size_t(ceil(double(rows) / pow(2.0, n))); ++i) + { + for (std::size_t j = 0; j < std::size_t(ceil(double(cols) / pow(2.0, n))); ++j) { cD[i][j] = dwtoutput[i + r][c + j]; } + } + + return nullptr; +} + +void* zero_remove(std::vector>& input, std::vector>& output) +{ + const int zeroRows = int(output.size() - input.size()); + const int zeroCols = int(output[0].size() - input[0].size()); + + auto row = output.end() - zeroRows; + + const std::size_t ousize = output.size(); + for (std::size_t i = input.size(); i < ousize; ++i) + { + output.erase(row); + ++row; + } + + // std::size_t ousize2 = output[0].size(); + + + for (std::size_t i = 0; i < ousize; ++i) + { + const auto col = output[i].end() - zeroCols; + output[i].erase(col, output[i].end()); + } + return nullptr; +} + +void* dwt_output_dim(std::vector>& signal, int& r, int& c) +{ + const std::size_t rows = signal.size(); + const std::size_t cols = signal[0].size(); + + const double mr = log10(double(rows)) / log10(2.0); + const int dr = int(ceil(mr)); + const double intValRow = pow(2.0, double(dr)); + const int r1 = int(intValRow); + + const double mc = log10(double(cols)) / log10(2.0); + const int dc = int(ceil(mc)); + const double intValCols = pow(2.0, double(dc)); + const int c1 = int(intValCols); + r = std::max(r1, c1); + c = std::max(r1, c1); + + return nullptr; +} + +void* dyadic_zpad_2d(std::vector>& signal, std::vector>& mod) +{ + const std::size_t rows = signal.size(); + const std::size_t cols = signal[0].size(); + + for (std::size_t i = 0; i < rows; ++i) { for (std::size_t j = 0; j < cols; ++j) { mod[i][j] = signal[i][j]; } } + // Zeropadding the columns + + const double mr = log10(double(rows)) / log10(2.0); + const int dr = int(ceil(mr)); + const double intValRow = pow(2.0, double(dr)) - pow(2.0, mr); + + const int zerosRow = int(intValRow); + + const double mc = log10(double(cols)) / log10(2.0); + const int dc = int(ceil(mc)); + const double intValCols = pow(2.0, double(dc)) - pow(2.0, mc); + + const int zerosCols = int(intValCols); + + for (std::size_t i = 0; i < rows + zerosRow; ++i) { for (std::size_t j = cols; j < cols + zerosCols; ++j) { mod[i][j] = 0; } } + for (std::size_t i = rows; i < rows + zerosRow; ++i) { for (std::size_t j = 0; j < cols + zerosCols; ++j) { mod[i][j] = 0; } } + + return nullptr; +} + +void* idwt_2d(std::vector& dwtop, std::vector& flag, const std::string& nm, std::vector>& idwtOutput, std::vector& length) +{ + std::size_t J = std::size_t(flag[0]); + std::size_t rows = length[0]; + std::size_t cols = length[1]; + + std::size_t sumCoef = 0; + std::vector lp1, hp1, lp2, hp2; + filtcoef(nm, lp1, hp1, lp2, hp2); + std::vector> cLL(rows, std::vector(cols)); + + + for (std::size_t iter = 0; iter < J; ++iter) + { + std::size_t nRows = length[2 * iter]; + std::size_t nCols = length[2 * iter + 1]; + + std::vector> cLH(nRows, std::vector(nCols)); + std::vector> cHL(nRows, std::vector(nCols)); + std::vector> cHH(nRows, std::vector(nCols)); + + for (std::size_t i = 0; i < nRows; ++i) + { + for (std::size_t j = 0; j < nCols; ++j) + { + if (iter == 0) + { + cLL[i][j] = dwtop[sumCoef + i * nCols + j]; + cLH[i][j] = dwtop[sumCoef + nRows * nCols + i * nCols + j]; + cHL[i][j] = dwtop[sumCoef + 2 * nRows * nCols + i * nCols + j]; + cHH[i][j] = dwtop[sumCoef + 3 * nRows * nCols + i * nCols + j]; + } + else + { + cLH[i][j] = dwtop[sumCoef + i * nCols + j]; + cHL[i][j] = dwtop[sumCoef + nRows * nCols + i * nCols + j]; + cHH[i][j] = dwtop[sumCoef + 2 * nRows * nCols + i * nCols + j]; + } + } + } + + + // temp_A = cLL; + // idwt2_sym(nm,idwtOutput2, cA, cH,cV,cD); + + std::size_t lenX = cLH.size(); + std::size_t lenY = cLH[0].size(); + + // Row Upsampling and Column Filtering at the first LP Stage + std::vector> cL(2 * lenX, std::vector(lenY)); + std::vector> cH(2 * lenX, std::vector(lenY)); + + if (iter == 0) + { + for (std::size_t j = 0; j < lenY; ++j) + { + std::vector sigLL, sigLH, oup; + + for (std::size_t i = 0; i < lenX; ++i) + { + double temp1 = cLL[i][j]; + double temp2 = cLH[i][j]; + sigLL.push_back(temp1); + sigLH.push_back(temp2); + } + idwt1_m(nm, oup, sigLL, sigLH); + + for (std::size_t i = 0; i < oup.size(); ++i) { cL[i][j] = oup[i]; } + } + } + else + { + std::size_t rows1 = cLH.size(); + std::size_t cols1 = cLH[0].size(); + + for (std::size_t j = 0; j < cols1; ++j) + { + std::vector tempL1, tempL2, oup; + for (std::size_t i = 0; i < rows1; ++i) + { + double temp = cLL[i][j]; + tempL1.push_back(temp); + + double temp2 = cLH[i][j]; + tempL2.push_back(temp2); + } + idwt1_m(nm, oup, tempL1, tempL2); + + for (std::size_t i = 0; i < oup.size(); ++i) { cL[i][j] = oup[i]; } + } + } + + + for (std::size_t j = 0; j < lenY; ++j) + { + std::vector sigHL, sigHH, oup2; + for (std::size_t i = 0; i < lenX; ++i) + { + double temp3 = cHL[i][j]; + double temp4 = cHH[i][j]; + sigHL.push_back(temp3); + sigHH.push_back(temp4); + } + idwt1_m(nm, oup2, sigHL, sigHH); + + for (std::size_t i = 0; i < oup2.size(); ++i) { cH[i][j] = oup2[i]; } + } + + std::vector> signal(2 * lenX, std::vector(2 * lenY)); + for (std::size_t i = 0; i < 2 * lenX; ++i) + { + std::vector sigL, sigH, oup; + for (std::size_t j = 0; j < lenY; ++j) + { + double temp5 = cL[i][j]; + double temp6 = cH[i][j]; + sigL.push_back(temp5); + sigH.push_back(temp6); + } + idwt1_m(nm, oup, sigL, sigH); + + for (std::size_t j = 0; j < oup.size(); ++j) { signal[i][j] = oup[j]; } + } + + idwtOutput = signal; + + + if (iter == 0) { sumCoef += 4 * nRows * nCols; } + else { sumCoef += 3 * nRows * nCols; } + cLL = signal; + } + + + return nullptr; +} + + +void* dwt_2d(std::vector>& origsig, const int J, const std::string& nm, std::vector& dwtOutput, std::vector& flag, std::vector& length) +{ + // flag will contain + + std::vector> sig = origsig; + std::size_t nRows = sig.size(); // No. of rows + std::size_t nCols = sig[0].size(); //No. of columns + std::vector> originalCopy = sig; + const int maxIter = std::min(int(ceil(log(double(sig.size())) / log(2.0))), int(ceil(log(double(sig[0].size())) / log(2.0)))); + if (maxIter < J) + { + std::cout << J << " Iterations are not possible with signals of this dimension " << std::endl; + exit(1); + } + std::vector lp1, hp1, lp2, hp2; + + flag.push_back(double(J)); + flag.push_back(0); + + + length.insert(length.begin(), nCols); + length.insert(length.begin(), nRows); + + + std::size_t sumCoef = 0; + for (std::size_t iter = 0; iter < std::size_t(J); ++iter) + { + filtcoef(nm, lp1, hp1, lp2, hp2); + + nRows = int(ceil(double(nRows) / 2.0)); + nCols = int(ceil(double(nCols) / 2.0)); + length.insert(length.begin(), nCols); + length.insert(length.begin(), nRows); + + std::vector> cA(nRows, std::vector(nCols)); + std::vector> cH(nRows, std::vector(nCols)); + std::vector> cV(nRows, std::vector(nCols)); + std::vector> cD(nRows, std::vector(nCols)); + + if (iter == 0) { dwt2(nm, originalCopy, cA, cH, cV, cD); } + else { dwt2(nm, originalCopy, cA, cH, cV, cD); } + std::vector tempSig2; + + originalCopy = cA; + if (iter == std::size_t(J - 1)) + { + for (std::size_t i = 0; i < nRows; ++i) + { + for (std::size_t j = 0; j < nCols; ++j) + { + double temp = cA[i][j]; + tempSig2.push_back(temp); + } + } + } + for (std::size_t i = 0; i < nRows; ++i) + { + for (std::size_t j = nCols; j < nCols * 2; ++j) + { + double temp = cH[i][j - nCols]; + tempSig2.push_back(temp); + } + } + + for (std::size_t i = nRows; i < nRows * 2; ++i) + { + for (std::size_t j = 0; j < nCols; ++j) + { + double temp = cV[i - nRows][j]; + tempSig2.push_back(temp); + } + } + + for (std::size_t i = nRows; i < nRows * 2; ++i) + { + for (std::size_t j = nCols; j < nCols * 2; ++j) + { + double temp = cD[i - nRows][j - nCols]; + tempSig2.push_back(temp); + } + } + + dwtOutput.insert(dwtOutput.begin(), tempSig2.begin(), tempSig2.end()); + sumCoef += 4 * nRows * nCols; + } + /* + ofstream dwt2out("dwt2out.dat"); + for (std::size_t i= 0; i < dwtOutput.size(); ++i){ dwt2out << dwtOutput[i] <& cA, std::vector& cD, std::vector& x) +{ + std::vector lpd1, hpd1, lpr1, hpr1; + + filtcoef(wname, lpd1, hpd1, lpr1, hpr1); + const std::size_t lenLpfilt = lpr1.size(); + const std::size_t lenHpfilt = hpr1.size(); + const std::size_t lenAvg = (lenLpfilt + lenHpfilt) / 2; + //std::size_t N = 2 * cA.size(); + const int U = 2; // Upsampling Factor + + // Operations in the Low Frequency branch of the Synthesis Filter Bank + + std::vector cAUp; + std::vector xLp; + per_ext(cA, int(lenAvg / 2)); + upsamp(cA, U, cAUp); + convfftm(cAUp, lpr1, xLp); + + // Operations in the High Frequency branch of the Synthesis Filter Bank + + std::vector cDUp; + std::vector xHp; + per_ext(cD, int(lenAvg / 2)); + upsamp(cD, U, cDUp); + convfftm(cDUp, hpr1, xHp); + vecsum(xLp, xHp, x); + // Remove periodic extension + x.erase(x.begin(), x.begin() + lenAvg + lenAvg / 2 - 1); + x.erase(x.end() - lenAvg - lenAvg / 2, x.end()); + + return nullptr; +} + +void* branch_hp_dn(const std::string& wname, std::vector& signal, std::vector& sigop) +{ + std::vector lpd, hpd, lpr, hpr; + + filtcoef(wname, lpd, hpd, lpr, hpr); + //for (std::size_t i = 0; i < signal.size(); ++i) { + // std::cout << signal[i] << std::endl; + // out2 << signal[i] << std::endl; + //} + + const std::size_t tempLen = signal.size(); + + if ((tempLen % 2) != 0) + { + const double temp = signal[tempLen - 1]; + signal.push_back(temp); + } + + const std::size_t lenLpfilt = lpd.size(); + const std::size_t lenHpfilt = hpd.size(); + const std::size_t lenAvg = (lenLpfilt + lenHpfilt) / 2; + + // std::cout << lenLpfilt << "Filter" << std::endl; + per_ext(signal, int(lenAvg / 2)); // Periodic Extension + // computations designed to deal with boundary distortions + + // Low Pass Filtering Operations in the Analysis Filter Bank Section + // int len_cA =(int) floor(double (len_sig + lenLpfilt -1) / double (2)); + std::vector cAUndec; + // convolving signal with lpd, Low Pass Filter, and O/P is stored in cA_undec + convfftm(signal, hpd, cAUndec); + const int d = 2; // Downsampling Factor is 2 + + // Downsampling by 2 gives cA + downsamp(cAUndec, d, sigop); + + sigop.erase(sigop.begin(), sigop.begin() + lenAvg / 2); + sigop.erase(sigop.end() - lenAvg / 2, sigop.end()); + return nullptr; +} + +void* branch_lp_dn(const std::string& wname, std::vector& signal, std::vector& sigop) +{ + std::vector lpd, hpd, lpr, hpr; + + filtcoef(wname, lpd, hpd, lpr, hpr); + // for (std::size_t i = 0; i < signal.size(); ++i) { + // std::cout << signal[i] << endl; + // out2 << signal[i] < cAUndec; + // convolving signal with lpd, Low Pass Filter, and O/P is stored in cA_undec + convfftm(signal, lpd, cAUndec); + const int d = 2; // Downsampling Factor is 2 + + // Downsampling by 2 gives cA + downsamp(cAUndec, d, sigop); + + sigop.erase(sigop.begin(), sigop.begin() + lenAvg / 2); + sigop.erase(sigop.end() - lenAvg / 2, sigop.end()); + + + return nullptr; +} + +void* idwt2(const std::string& name, std::vector>& signal, std::vector>& cLL, std::vector>& cLH, + std::vector>& cHL, std::vector>& cHH) +{ + // Synthesis + const std::size_t rows = cLL.size(); + const std::size_t cols = cLL[0].size(); + const std::size_t nRows = 2 * rows; + // Row Upsampling and Column Filtering at the first LP Stage + std::vector> cL(nRows, std::vector(cols)); + std::vector> cH(nRows, std::vector(cols)); + + for (std::size_t j = 0; j < cols; ++j) + { + std::vector sigLL; + std::vector sigLH; + for (std::size_t i = 0; i < rows; ++i) + { + double temp1 = cLL[i][j]; + double temp2 = cLH[i][j]; + sigLL.push_back(temp1); + sigLH.push_back(temp2); + } + std::vector oup; + + branch_lp_hp_up(name, sigLL, sigLH, oup); + sigLL.clear(); + sigLH.clear(); + for (std::size_t i = 0; i < oup.size(); ++i) { cL[i][j] = oup[i]; } + } + + for (std::size_t j = 0; j < cols; ++j) + { + std::vector sigHL; + std::vector sigHH; + for (std::size_t i = 0; i < rows; ++i) + { + double temp3 = cHL[i][j]; + double temp4 = cHH[i][j]; + sigHL.push_back(temp3); + sigHH.push_back(temp4); + } + std::vector oup2; + branch_lp_hp_up(name, sigHL, sigHH, oup2); + sigHL.clear(); + sigHH.clear(); + + for (std::size_t i = 0; i < oup2.size(); ++i) { cH[i][j] = oup2[i]; } + } + + for (std::size_t i = 0; i < nRows; ++i) + { + std::vector sigL; + std::vector sigH; + for (std::size_t j = 0; j < cols; ++j) + { + double temp5 = cL[i][j]; + double temp6 = cH[i][j]; + sigL.push_back(temp5); + sigH.push_back(temp6); + } + std::vector oup3; + branch_lp_hp_up(name, sigL, sigH, oup3); + sigL.clear(); + sigH.clear(); + + for (std::size_t j = 0; j < oup3.size(); ++j) { signal[i][j] = oup3[j]; } + } + return nullptr; +} + +void* dwt2(const std::string& name, std::vector>& signal, std::vector>& cLL, std::vector>& cLH, + std::vector>& cHL, std::vector>& cHH) +{ + //Analysis + const std::size_t rows = signal.size(); + std::size_t cols = signal[0].size(); + const std::size_t colsLp1 = cLL[0].size(); + const std::size_t colsHp1 = cLL[0].size(); + std::vector lp1, hp1, lp2, hp2; + filtcoef(name, lp1, hp1, lp2, hp2); + std::vector> lpDn1(rows, std::vector(colsLp1)); + std::vector> hpDn1(rows, std::vector(colsHp1)); + + // Implementing row filtering and column downsampling in each branch. + for (std::size_t i = 0; i < rows; ++i) + { + std::vector tempRow, oupLp, oupHp; + for (std::size_t j = 0; j < cols; ++j) + { + double temp = signal[i][j]; + tempRow.push_back(temp); + } + dwt1_m(name, tempRow, oupLp, oupHp); + + for (std::size_t j = 0; j < oupLp.size(); ++j) + { + lpDn1[i][j] = oupLp[j]; + hpDn1[i][j] = oupHp[j]; + } + } + + + cols = colsLp1; + // Implementing column filtering and row downsampling in Low Pass branch. + + for (std::size_t j = 0; j < cols; ++j) + { + std::vector tempRow3, oupLp, oupHp; + for (std::size_t i = 0; i < rows; ++i) + { + double temp = lpDn1[i][j]; + tempRow3.push_back(temp); + } + dwt1_m(name, tempRow3, oupLp, oupHp); + + for (std::size_t i = 0; i < oupLp.size(); ++i) + { + cLL[i][j] = oupLp[i]; + cLH[i][j] = oupHp[i]; + } + } + + + // Implementing column filtering and row downsampling in High Pass branch. + + for (std::size_t j = 0; j < cols; ++j) + { + std::vector tempRow5, oupLp, oupHp; + for (std::size_t i = 0; i < rows; ++i) + { + double temp = hpDn1[i][j]; + tempRow5.push_back(temp); + } + dwt1_m(name, tempRow5, oupLp, oupHp); + + for (std::size_t i = 0; i < oupLp.size(); ++i) + { + cHL[i][j] = oupLp[i]; + cHH[i][j] = oupHp[i]; + } + } + return nullptr; +} + + +void* downsamp2(std::vector>& vec1, std::vector>& vec2, const int rowsDn, const int colsDn) +{ + const std::size_t rows = vec1.size(); + const std::size_t cols = vec1[0].size(); + const std::size_t nRows = std::size_t(ceil(double(rows) / double(rowsDn))); + const std::size_t nCols = std::size_t(ceil(double(cols) / double(colsDn))); + for (std::size_t i = 0; i < nRows; ++i) { for (std::size_t j = 0; j < nCols; ++j) { vec2[i][j] = vec1[i * rowsDn][j * colsDn]; } } + return nullptr; +} + +void* upsamp2(std::vector>& vec1, std::vector>& vec2, const int rowsUp, const int colsUp) +{ + const std::size_t rows = vec1.size(); + const std::size_t cols = vec1[0].size(); + const std::size_t nRows = rows * rowsUp; + const std::size_t nCols = cols * colsUp; + for (std::size_t i = 0; i < nRows; ++i) + { + for (std::size_t j = 0; j < nCols; ++j) + { + if (i % rowsUp == 0 && j % colsUp == 0) { vec2[i][j] = vec1[i / rowsUp][j / colsUp]; } + else { vec2[i][j] = 0; } + } + } + return nullptr; +} + + +int filtcoef(const std::string& name, std::vector& lp1, std::vector& hp1, std::vector& lp2, std::vector& hp2) +{ + if (name == "haar" || name == "db1") + { + lp1.push_back(0.7071); + lp1.push_back(0.7071); + hp1.push_back(-0.7071); + hp1.push_back(0.7071); + lp2.push_back(0.7071); + lp2.push_back(0.7071); + hp2.push_back(0.7071); + hp2.push_back(-0.7071); + // std::cout << lp2[1] << std::endl; + // hpd = {-0.7071, 0.7071}; + // lpr = {0.7071, 0.7071}; + // hpr = {0.7071, -0.7071}; + return 0; + } + if (name == "db2") + { + lp1 = { -0.12940952255092145, 0.22414386804185735, 0.83651630373746899, 0.48296291314469025 }; + hp1 = { -0.48296291314469025, 0.83651630373746899, -0.22414386804185735, -0.12940952255092145 }; + lp2 = { 0.48296291314469025, 0.83651630373746899, 0.22414386804185735, -0.12940952255092145 }; + hp2 = { -0.12940952255092145, -0.22414386804185735, 0.83651630373746899, -0.48296291314469025 }; + return 0; + } + if (name == "db3") + { + lp1 = { 0.035226291882100656, -0.085441273882241486, -0.13501102001039084, 0.45987750211933132, 0.80689150931333875, 0.33267055295095688 }; + hp1 = { -0.33267055295095688, 0.80689150931333875, -0.45987750211933132, -0.13501102001039084, 0.085441273882241486, 0.035226291882100656 }; + lp2 = { 0.33267055295095688, 0.80689150931333875, 0.45987750211933132, -0.13501102001039084, -0.085441273882241486, 0.035226291882100656 }; + hp2 = { 0.035226291882100656, 0.085441273882241486, -0.13501102001039084, -0.45987750211933132, 0.80689150931333875, -0.33267055295095688 }; + return 0; + } + if (name == "db4") + { + lp1 = { + -0.010597401784997278, 0.032883011666982945, 0.030841381835986965, -0.18703481171888114, -0.027983769416983849, 0.63088076792959036, + 0.71484657055254153, 0.23037781330885523 + }; + + hp1 = { + -0.23037781330885523, 0.71484657055254153, -0.63088076792959036, -0.027983769416983849, 0.18703481171888114, 0.030841381835986965, + -0.032883011666982945, -0.010597401784997278 + }; + + lp2 = { + 0.23037781330885523, 0.71484657055254153, 0.63088076792959036, -0.027983769416983849, -0.18703481171888114, 0.030841381835986965, + 0.032883011666982945, -0.010597401784997278 + }; + + hp2 = { + -0.010597401784997278, -0.032883011666982945, 0.030841381835986965, 0.18703481171888114, -0.027983769416983849, -0.63088076792959036, + 0.71484657055254153, -0.23037781330885523 + }; + return 0; + } + if (name == "db5") + { + lp1 = { + 0.0033357252850015492, -0.012580751999015526, -0.0062414902130117052, 0.077571493840065148, -0.03224486958502952, -0.24229488706619015, + 0.13842814590110342, 0.72430852843857441, 0.60382926979747287, 0.16010239797412501 + }; + + hp1 = { + -0.16010239797412501, 0.60382926979747287, -0.72430852843857441, 0.13842814590110342, 0.24229488706619015, -0.03224486958502952, + -0.077571493840065148, -0.0062414902130117052, 0.012580751999015526, 0.0033357252850015492 + }; + + lp2 = { + 0.16010239797412501, 0.60382926979747287, 0.72430852843857441, 0.13842814590110342, -0.24229488706619015, -0.03224486958502952, + 0.077571493840065148, -0.0062414902130117052, -0.012580751999015526, 0.0033357252850015492 + }; + + hp2 = { + 0.0033357252850015492, 0.012580751999015526, -0.0062414902130117052, -0.077571493840065148, -0.03224486958502952, 0.24229488706619015, + 0.13842814590110342, -0.72430852843857441, 0.60382926979747287, -0.16010239797412501 + }; + return 0; + } + if (name == "db6") + { + lp1 = { + -0.0010773010849955799, 0.0047772575110106514, 0.0005538422009938016, -0.031582039318031156, 0.027522865530016288, 0.097501605587079362, + -0.12976686756709563, -0.22626469396516913, 0.3152503517092432, 0.75113390802157753, 0.49462389039838539, 0.11154074335008017 + }; + + hp1 = { + -0.11154074335008017, 0.49462389039838539, -0.75113390802157753, 0.3152503517092432, 0.22626469396516913, -0.12976686756709563, + -0.097501605587079362, 0.027522865530016288, 0.031582039318031156, 0.0005538422009938016, -0.0047772575110106514, -0.0010773010849955799 + }; + + lp2 = { + 0.11154074335008017, 0.49462389039838539, 0.75113390802157753, 0.3152503517092432, -0.22626469396516913, -0.12976686756709563, 0.097501605587079362, + 0.027522865530016288, -0.031582039318031156, 0.0005538422009938016, 0.0047772575110106514, -0.0010773010849955799 + }; + + hp2 = { + -0.0010773010849955799, -0.0047772575110106514, 0.0005538422009938016, 0.031582039318031156, 0.027522865530016288, -0.097501605587079362, + -0.12976686756709563, 0.22626469396516913, 0.3152503517092432, -0.75113390802157753, 0.49462389039838539, -0.11154074335008017 + }; + return 0; + } + if (name == "db7") + { + lp1 = { + 0.00035371380000103988, -0.0018016407039998328, 0.00042957797300470274, 0.012550998556013784, -0.01657454163101562, -0.038029936935034633, + 0.080612609151065898, 0.071309219267050042, -0.22403618499416572, -0.14390600392910627, 0.4697822874053586, 0.72913209084655506, + 0.39653931948230575, 0.077852054085062364 + }; + + hp1 = { + -0.077852054085062364, 0.39653931948230575, -0.72913209084655506, 0.4697822874053586, 0.14390600392910627, -0.22403618499416572, + -0.071309219267050042, 0.080612609151065898, 0.038029936935034633, -0.01657454163101562, -0.012550998556013784, 0.0004295779730047027, + 0.0018016407039998328, 0.00035371380000103988 + }; + + lp2 = { + 0.077852054085062364, 0.39653931948230575, 0.72913209084655506, 0.4697822874053586, -0.14390600392910627, -0.22403618499416572, + 0.071309219267050042, 0.080612609151065898, -0.038029936935034633, -0.01657454163101562, 0.012550998556013784, 0.00042957797300470274, + -0.0018016407039998328, 0.00035371380000103988 + }; + + hp2 = { + 0.00035371380000103988, 0.0018016407039998328, 0.00042957797300470274, -0.01255099855601378, -0.01657454163101562, 0.038029936935034633, + 0.080612609151065898, -0.071309219267050042, -0.22403618499416572, 0.14390600392910627, 0.4697822874053586, -0.72913209084655506, + 0.39653931948230575, -0.077852054085062364 + }; + return 0; + } + if (name == "db8") + { + lp1 = { + -0.00011747678400228192, 0.00067544940599855677, -0.00039174037299597711, -0.0048703529930106603, 0.0087460940470156547, 0.013981027917015516, + -0.044088253931064719, -0.017369301002022108, 0.12874742662018601, 0.00047248457399797254, -0.28401554296242809, -0.015829105256023893, + 0.58535468365486909, 0.67563073629801285, 0.31287159091446592, 0.054415842243081609 + }; + + hp1 = { + -0.054415842243081609, 0.31287159091446592, -0.67563073629801285, 0.58535468365486909, 0.015829105256023893, -0.28401554296242809, + -0.00047248457399797254, 0.12874742662018601, 0.017369301002022108, -0.044088253931064719, -0.013981027917015516, 0.0087460940470156547, + 0.0048703529930106603, -0.00039174037299597711, -0.00067544940599855677, -0.00011747678400228192 + }; + + lp2 = { + 0.054415842243081609, 0.31287159091446592, 0.67563073629801285, 0.58535468365486909, -0.015829105256023893, -0.28401554296242809, + 0.00047248457399797254, 0.12874742662018601, -0.017369301002022108, -0.044088253931064719, 0.013981027917015516, 0.0087460940470156547, + -0.0048703529930106603, -0.00039174037299597711, 0.00067544940599855677, -0.00011747678400228192 + }; + + hp2 = { + -0.00011747678400228192, -0.00067544940599855677, -0.00039174037299597711, 0.0048703529930106603, 0.0087460940470156547, -0.013981027917015516, + -0.044088253931064719, 0.017369301002022108, 0.12874742662018601, -0.00047248457399797254, -0.28401554296242809, 0.015829105256023893, + 0.58535468365486909, -0.67563073629801285, 0.31287159091446592, -0.054415842243081609 + }; + return 0; + } + if (name == "db9") + { + lp1 = { + 3.9347319995026124e-05, -0.00025196318899817888, 0.00023038576399541288, 0.0018476468829611268, -0.0042815036819047227, -0.004723204757894831, + 0.022361662123515244, 0.00025094711499193845, -0.067632829059523988, 0.030725681478322865, 0.14854074933476008, -0.096840783220879037, + -0.29327378327258685, 0.13319738582208895, 0.65728807803663891, 0.6048231236767786, 0.24383467463766728, 0.038077947363167282 + }; + + hp1 = { + -0.038077947363167282, 0.24383467463766728, -0.6048231236767786, 0.65728807803663891, -0.13319738582208895, -0.29327378327258685, + 0.096840783220879037, 0.14854074933476008, -0.030725681478322865, -0.067632829059523988, -0.00025094711499193845, 0.022361662123515244, + 0.004723204757894831, -0.0042815036819047227, -0.0018476468829611268, 0.00023038576399541288, 0.00025196318899817888, 3.9347319995026124e-05 + }; + + lp2 = { + 0.038077947363167282, 0.24383467463766728, 0.6048231236767786, 0.65728807803663891, 0.13319738582208895, -0.29327378327258685, + -0.096840783220879037, 0.14854074933476008, 0.030725681478322865, -0.067632829059523988, 0.00025094711499193845, 0.022361662123515244, + -0.004723204757894831, -0.0042815036819047227, 0.0018476468829611268, 0.00023038576399541288, -0.00025196318899817888, 3.9347319995026124e-05 + }; + + hp2 = { + 3.9347319995026124e-05, 0.00025196318899817888, 0.00023038576399541288, -0.0018476468829611268, -0.0042815036819047227, 0.004723204757894831, + 0.022361662123515244, -0.00025094711499193845, -0.067632829059523988, -0.030725681478322865, 0.14854074933476008, 0.096840783220879037, + -0.29327378327258685, -0.13319738582208895, 0.65728807803663891, -0.6048231236767786, 0.24383467463766728, -0.038077947363167282 + }; + return 0; + } + if (name == "db10") + { + lp1 = { + -1.3264203002354869e-05, 9.3588670001089845e-05, -0.0001164668549943862, -0.00068585669500468248, 0.0019924052949908499, 0.0013953517469940798, + -0.010733175482979604, 0.0036065535669883944, 0.033212674058933238, -0.029457536821945671, -0.071394147165860775, 0.093057364603806592, + 0.12736934033574265, -0.19594627437659665, -0.24984642432648865, 0.28117234366042648, 0.68845903945259213, 0.52720118893091983, 0.18817680007762133, + 0.026670057900950818 + }; + + hp1 = { + -0.026670057900950818, 0.18817680007762133, -0.52720118893091983, 0.68845903945259213, -0.28117234366042648, -0.24984642432648865, + 0.19594627437659665, 0.12736934033574265, -0.093057364603806592, -0.071394147165860775, 0.029457536821945671, 0.033212674058933238, + -0.0036065535669883944, -0.010733175482979604, -0.0013953517469940798, 0.0019924052949908499, 0.00068585669500468248, -0.0001164668549943862, + -9.3588670001089845e-05, -1.3264203002354869e-05 + }; + + lp2 = { + 0.026670057900950818, 0.18817680007762133, 0.52720118893091983, 0.68845903945259213, 0.28117234366042648, -0.24984642432648865, + -0.19594627437659665, 0.12736934033574265, 0.093057364603806592, -0.071394147165860775, -0.029457536821945671, 0.033212674058933238, + 0.0036065535669883944, -0.010733175482979604, 0.0013953517469940798, 0.0019924052949908499, -0.00068585669500468248, -0.0001164668549943862, + 9.3588670001089845e-05, -1.3264203002354869e-05 + }; + + hp2 = { + -1.3264203002354869e-05, -9.3588670001089845e-05, -0.0001164668549943862, 0.00068585669500468248, 0.0019924052949908499, -0.0013953517469940798, + -0.010733175482979604, -0.0036065535669883944, 0.033212674058933238, 0.029457536821945671, -0.071394147165860775, -0.093057364603806592, + 0.12736934033574265, 0.19594627437659665, -0.24984642432648865, -0.28117234366042648, 0.68845903945259213, -0.52720118893091983, + 0.18817680007762133, -0.026670057900950818 + }; + return 0; + } + if (name == "db12") + { + lp1 = { + -1.5290717580684923e-06, 1.2776952219379579e-05, -2.4241545757030318e-05, -8.8504109208203182e-05, 0.00038865306282092672, 6.5451282125215034e-06, + -0.0021795036186277044, 0.0022486072409952287, 0.0067114990087955486, -0.012840825198299882, -0.01221864906974642, 0.041546277495087637, + 0.010849130255828966, -0.09643212009649671, 0.0053595696743599965, 0.18247860592758275, -0.023779257256064865, -0.31617845375277914, + -0.044763885653777619, 0.51588647842780067, 0.65719872257929113, 0.37735513521420411, 0.10956627282118277, 0.013112257957229239 + }; + + hp1 = { + -0.013112257957229239, 0.10956627282118277, -0.37735513521420411, 0.65719872257929113, -0.51588647842780067, -0.044763885653777619, + 0.31617845375277914, -0.023779257256064865, -0.18247860592758275, 0.0053595696743599965, 0.09643212009649671, 0.010849130255828966, + -0.041546277495087637, -0.01221864906974642, 0.012840825198299882, 0.0067114990087955486, -0.0022486072409952287, -0.0021795036186277044, + -6.5451282125215034e-06, 0.00038865306282092672, 8.8504109208203182e-05, -2.4241545757030318e-05, -1.2776952219379579e-05, -1.5290717580684923e-06 + }; + + lp2 = { + 0.013112257957229239, 0.10956627282118277, 0.37735513521420411, 0.65719872257929113, 0.51588647842780067, -0.044763885653777619, + -0.31617845375277914, -0.023779257256064865, 0.18247860592758275, 0.0053595696743599965, -0.09643212009649671, 0.010849130255828966, + 0.041546277495087637, -0.01221864906974642, -0.012840825198299882, 0.0067114990087955486, 0.0022486072409952287, -0.0021795036186277044, + 6.5451282125215034e-06, 0.00038865306282092672, -8.8504109208203182e-05, -2.4241545757030318e-05, 1.2776952219379579e-05, -1.5290717580684923e-06 + }; + + hp2 = { + -1.5290717580684923e-06, -1.2776952219379579e-05, -2.4241545757030318e-05, 8.8504109208203182e-05, 0.00038865306282092672, -6.5451282125215034e-06, + -0.0021795036186277044, -0.0022486072409952287, 0.0067114990087955486, 0.012840825198299882, -0.01221864906974642, -0.041546277495087637, + 0.010849130255828966, 0.09643212009649671, 0.0053595696743599965, -0.18247860592758275, -0.023779257256064865, 0.31617845375277914, + -0.044763885653777619, -0.51588647842780067, 0.65719872257929113, -0.37735513521420411, 0.10956627282118277, -0.013112257957229239 + }; + return 0; + } + if (name == "db13") + { + lp1 = { + 5.2200350984547998e-07, -4.7004164793608082e-06, 1.0441930571407941e-05, 3.0678537579324358e-05, -0.00016512898855650571, 4.9251525126285676e-05, + 0.00093232613086724904, -0.0013156739118922766, -0.002761911234656831, 0.0072555894016171187, 0.0039239414487955773, -0.023831420710327809, + 0.0023799722540522269, 0.056139477100276156, -0.026488406475345658, -0.10580761818792761, 0.072948933656788742, 0.17947607942935084, + -0.12457673075080665, -0.31497290771138414, 0.086985726179645007, 0.58888957043121193, 0.61105585115878114, 0.31199632216043488, + 0.082861243872901946, 0.0092021335389622788 + }; + + hp1 = { + -0.0092021335389622788, 0.082861243872901946, -0.31199632216043488, 0.61105585115878114, -0.58888957043121193, 0.086985726179645007, + 0.31497290771138414, -0.12457673075080665, -0.17947607942935084, 0.072948933656788742, 0.10580761818792761, -0.026488406475345658, + -0.056139477100276156, 0.0023799722540522269, 0.023831420710327809, 0.0039239414487955773, -0.0072555894016171187, -0.002761911234656831, + 0.0013156739118922766, 0.00093232613086724904, -4.9251525126285676e-05, -0.00016512898855650571, -3.0678537579324358e-05, 1.0441930571407941e-05, + 4.7004164793608082e-06, 5.2200350984547998e-07 + }; + + lp2 = { + 0.0092021335389622788, 0.082861243872901946, 0.31199632216043488, 0.61105585115878114, 0.58888957043121193, 0.086985726179645007, + -0.31497290771138414, -0.12457673075080665, 0.17947607942935084, 0.072948933656788742, -0.10580761818792761, -0.026488406475345658, + 0.056139477100276156, 0.0023799722540522269, -0.023831420710327809, 0.0039239414487955773, 0.0072555894016171187, -0.002761911234656831, + -0.0013156739118922766, 0.00093232613086724904, 4.9251525126285676e-05, -0.00016512898855650571, 3.0678537579324358e-05, 1.0441930571407941e-05, + -4.7004164793608082e-06, 5.2200350984547998e-07 + }; + + hp2 = { + 5.2200350984547998e-07, 4.7004164793608082e-06, 1.0441930571407941e-05, -3.0678537579324358e-05, -0.00016512898855650571, -4.9251525126285676e-05, + 0.00093232613086724904, 0.0013156739118922766, -0.002761911234656831, -0.0072555894016171187, 0.0039239414487955773, 0.023831420710327809, + 0.0023799722540522269, -0.056139477100276156, -0.026488406475345658, 0.10580761818792761, 0.072948933656788742, -0.17947607942935084, + -0.12457673075080665, 0.31497290771138414, 0.086985726179645007, -0.58888957043121193, 0.61105585115878114, -0.31199632216043488, + 0.082861243872901946, -0.0092021335389622788 + }; + return 0; + } + if (name == "db11") + { + lp1 = { + 4.4942742772363519e-06, -3.4634984186983789e-05, 5.4439074699366381e-05, 0.00024915252355281426, -0.00089302325066623663, -0.00030859285881515924, + 0.0049284176560587777, -0.0033408588730145018, -0.015364820906201324, 0.020840904360180039, 0.031335090219045313, -0.066438785695020222, + -0.04647995511667613, 0.14981201246638268, 0.066043588196690886, -0.27423084681792875, -0.16227524502747828, 0.41196436894789695, + 0.68568677491617847, 0.44989976435603013, 0.14406702115061959, 0.018694297761470441 + }; + + hp1 = { + -0.018694297761470441, 0.14406702115061959, -0.44989976435603013, 0.68568677491617847, -0.41196436894789695, -0.16227524502747828, + 0.27423084681792875, 0.066043588196690886, -0.14981201246638268, -0.04647995511667613, 0.066438785695020222, 0.031335090219045313, + -0.020840904360180039, -0.015364820906201324, 0.0033408588730145018, 0.0049284176560587777, 0.00030859285881515924, -0.00089302325066623663, + -0.00024915252355281426, 5.4439074699366381e-05, 3.4634984186983789e-05, 4.4942742772363519e-06 + }; + + lp2 = { + 0.018694297761470441, 0.14406702115061959, 0.44989976435603013, 0.68568677491617847, 0.41196436894789695, -0.16227524502747828, + -0.27423084681792875, 0.066043588196690886, 0.14981201246638268, -0.04647995511667613, -0.066438785695020222, 0.031335090219045313, + 0.020840904360180039, -0.015364820906201324, -0.0033408588730145018, 0.0049284176560587777, -0.00030859285881515924, -0.00089302325066623663, + 0.00024915252355281426, 5.4439074699366381e-05, -3.4634984186983789e-05, 4.4942742772363519e-06 + }; + + hp2 = { + 4.4942742772363519e-06, 3.4634984186983789e-05, 5.4439074699366381e-05, -0.00024915252355281426, -0.00089302325066623663, 0.00030859285881515924, + 0.0049284176560587777, 0.0033408588730145018, -0.015364820906201324, -0.020840904360180039, 0.031335090219045313, 0.066438785695020222, + -0.04647995511667613, -0.14981201246638268, 0.066043588196690886, 0.27423084681792875, -0.16227524502747828, -0.41196436894789695, + 0.68568677491617847, -0.44989976435603013, 0.14406702115061959, -0.018694297761470441 + }; + return 0; + } + if (name == "db14") + { + lp1 = { + -1.7871399683109222e-07, 1.7249946753674012e-06, -4.3897049017804176e-06, -1.0337209184568496e-05, 6.875504252695734e-05, -4.1777245770370672e-05, + -0.00038683194731287514, 0.00070802115423540481, 0.001061691085606874, -0.003849638868019787, -0.00074621898926387534, 0.012789493266340071, + -0.0056150495303375755, -0.030185351540353976, 0.026981408307947971, 0.05523712625925082, -0.071548955503983505, -0.086748411568110598, + 0.13998901658445695, 0.13839521386479153, -0.21803352999321651, -0.27168855227867705, 0.21867068775886594, 0.63118784910471981, 0.55430561794077093, + 0.25485026779256437, 0.062364758849384874, 0.0064611534600864905 + }; + + hp1 = { + -0.0064611534600864905, 0.062364758849384874, -0.25485026779256437, 0.55430561794077093, -0.63118784910471981, 0.21867068775886594, + 0.27168855227867705, -0.21803352999321651, -0.13839521386479153, 0.13998901658445695, 0.086748411568110598, -0.071548955503983505, + -0.05523712625925082, 0.026981408307947971, 0.030185351540353976, -0.0056150495303375755, -0.012789493266340071, -0.00074621898926387534, + 0.003849638868019787, 0.001061691085606874, -0.00070802115423540481, -0.00038683194731287514, 4.1777245770370672e-05, 6.875504252695734e-05, + 1.0337209184568496e-05, -4.3897049017804176e-06, -1.7249946753674012e-06, -1.7871399683109222e-07 + }; + + lp2 = { + 0.0064611534600864905, 0.062364758849384874, 0.25485026779256437, 0.55430561794077093, 0.63118784910471981, 0.21867068775886594, + -0.27168855227867705, -0.21803352999321651, 0.13839521386479153, 0.13998901658445695, -0.086748411568110598, -0.071548955503983505, + 0.05523712625925082, 0.026981408307947971, -0.030185351540353976, -0.0056150495303375755, 0.012789493266340071, -0.00074621898926387534, + -0.003849638868019787, 0.001061691085606874, 0.00070802115423540481, -0.00038683194731287514, -4.1777245770370672e-05, 6.875504252695734e-05, + -1.0337209184568496e-05, -4.3897049017804176e-06, 1.7249946753674012e-06, -1.7871399683109222e-07 + }; + + hp2 = { + -1.7871399683109222e-07, -1.7249946753674012e-06, -4.3897049017804176e-06, 1.0337209184568496e-05, 6.875504252695734e-05, 4.1777245770370672e-05, + -0.00038683194731287514, -0.00070802115423540481, 0.001061691085606874, 0.003849638868019787, -0.00074621898926387534, -0.012789493266340071, + -0.0056150495303375755, 0.030185351540353976, 0.026981408307947971, -0.05523712625925082, -0.071548955503983505, 0.086748411568110598, + 0.13998901658445695, -0.13839521386479153, -0.21803352999321651, 0.27168855227867705, 0.21867068775886594, -0.63118784910471981, + 0.55430561794077093, -0.25485026779256437, 0.062364758849384874, -0.0064611534600864905 + }; + return 0; + } + if (name == "db15") + { + lp1 = { + 6.1333599133037138e-08, -6.3168823258794506e-07, 1.8112704079399406e-06, 3.3629871817363823e-06, -2.8133296266037558e-05, 2.579269915531323e-05, + 0.00015589648992055726, -0.00035956524436229364, -0.00037348235413726472, 0.0019433239803823459, -0.00024175649075894543, -0.0064877345603061454, + 0.0051010003604228726, 0.015083918027862582, -0.020810050169636805, -0.025767007328366939, 0.054780550584559995, 0.033877143923563204, + -0.11112093603713753, -0.039666176555733602, 0.19014671400708816, 0.065282952848765688, -0.28888259656686216, -0.19320413960907623, + 0.33900253545462167, 0.64581314035721027, 0.49263177170797529, 0.20602386398692688, 0.046743394892750617, 0.0045385373615773762 + }; + + hp1 = { + -0.0045385373615773762, 0.046743394892750617, -0.20602386398692688, 0.49263177170797529, -0.64581314035721027, 0.33900253545462167, + 0.19320413960907623, -0.28888259656686216, -0.065282952848765688, 0.19014671400708816, 0.039666176555733602, -0.11112093603713753, + -0.033877143923563204, 0.054780550584559995, 0.025767007328366939, -0.020810050169636805, -0.015083918027862582, 0.0051010003604228726, + 0.0064877345603061454, -0.00024175649075894543, -0.0019433239803823459, -0.00037348235413726472, 0.00035956524436229364, 0.00015589648992055726, + -2.579269915531323e-05, -2.8133296266037558e-05, -3.3629871817363823e-06, 1.8112704079399406e-06, 6.3168823258794506e-07, 6.1333599133037138e-08 + }; + + lp2 = { + 0.0045385373615773762, 0.046743394892750617, 0.20602386398692688, 0.49263177170797529, 0.64581314035721027, 0.33900253545462167, + -0.19320413960907623, -0.28888259656686216, 0.065282952848765688, 0.19014671400708816, -0.039666176555733602, -0.11112093603713753, + 0.033877143923563204, 0.054780550584559995, -0.025767007328366939, -0.020810050169636805, 0.015083918027862582, 0.0051010003604228726, + -0.0064877345603061454, -0.00024175649075894543, 0.0019433239803823459, -0.00037348235413726472, -0.00035956524436229364, 0.00015589648992055726, + 2.579269915531323e-05, -2.8133296266037558e-05, 3.3629871817363823e-06, 1.8112704079399406e-06, -6.3168823258794506e-07, 6.1333599133037138e-08 + }; + + hp2 = { + 6.1333599133037138e-08, 6.3168823258794506e-07, 1.8112704079399406e-06, -3.3629871817363823e-06, -2.8133296266037558e-05, -2.579269915531323e-05, + 0.00015589648992055726, 0.00035956524436229364, -0.00037348235413726472, -0.0019433239803823459, -0.00024175649075894543, 0.0064877345603061454, + 0.0051010003604228726, -0.015083918027862582, -0.020810050169636805, 0.025767007328366939, 0.054780550584559995, -0.033877143923563204, + -0.11112093603713753, 0.039666176555733602, 0.19014671400708816, -0.065282952848765688, -0.28888259656686216, 0.19320413960907623, + 0.33900253545462167, -0.64581314035721027, 0.49263177170797529, -0.20602386398692688, 0.046743394892750617, -0.0045385373615773762 + }; + return 0; + } + if (name == "bior1.1") + { + lp1 = { 0.70710678118654757, 0.70710678118654757 }; + hp1 = { -0.70710678118654757, 0.70710678118654757 }; + lp2 = { 0.70710678118654757, 0.70710678118654757 }; + hp2 = { 0.70710678118654757, -0.70710678118654757 }; + return 0; + } + if (name == "bior1.3") + { + lp1 = { -0.088388347648318447, 0.088388347648318447, 0.70710678118654757, 0.70710678118654757, 0.088388347648318447, -0.088388347648318447, }; + hp1 = { 0.0, 0.0, -0.70710678118654757, 0.70710678118654757, 0.0, 0.0 }; + lp2 = { 0.0, 0.0, 0.70710678118654757, 0.70710678118654757, 0.0, 0.0 }; + hp2 = { -0.088388347648318447, -0.088388347648318447, 0.70710678118654757, -0.70710678118654757, 0.088388347648318447, 0.088388347648318447 }; + return 0; + } + if (name == "bior1.5") + { + lp1 = { + 0.01657281518405971, -0.01657281518405971, -0.12153397801643787, 0.12153397801643787, 0.70710678118654757, 0.70710678118654757, 0.12153397801643787, + -0.12153397801643787, -0.01657281518405971, 0.01657281518405971 + }; + + hp1 = { 0.0, 0.0, 0.0, 0.0, -0.70710678118654757, 0.70710678118654757, 0.0, 0.0, 0.0, 0.0 }; + + lp2 = { 0.0, 0.0, 0.0, 0.0, 0.70710678118654757, 0.70710678118654757, 0.0, 0.0, 0.0, 0.0 }; + + hp2 = { + 0.01657281518405971, 0.01657281518405971, -0.12153397801643787, -0.12153397801643787, 0.70710678118654757, -0.70710678118654757, + 0.12153397801643787, 0.12153397801643787, -0.01657281518405971, -0.01657281518405971 + }; + return 0; + } + if (name == "bior2.2") + { + lp1 = { 0.0, -0.17677669529663689, 0.35355339059327379, 1.0606601717798214, 0.35355339059327379, -0.17677669529663689 }; + + hp1 = { 0.0, 0.35355339059327379, -0.70710678118654757, 0.35355339059327379, 0.0, 0.0 }; + + lp2 = { 0.0, 0.35355339059327379, 0.70710678118654757, 0.35355339059327379, 0.0, 0.0 }; + + hp2 = { 0.0, 0.17677669529663689, 0.35355339059327379, -1.0606601717798214, 0.35355339059327379, 0.17677669529663689 }; + return 0; + } + if (name == "bior2.4") + { + lp1 = { + 0.0, 0.033145630368119419, -0.066291260736238838, -0.17677669529663689, 0.4198446513295126, 0.99436891104358249, 0.4198446513295126, + -0.17677669529663689, -0.066291260736238838, 0.033145630368119419 + }; + + hp1 = { 0.0, 0.0, 0.0, 0.35355339059327379, -0.70710678118654757, 0.35355339059327379, 0.0, 0.0, 0.0, 0.0 }; + + lp2 = { 0.0, 0.0, 0.0, 0.35355339059327379, 0.70710678118654757, 0.35355339059327379, 0.0, 0.0, 0.0, 0.0 }; + + hp2 = { + 0.0, -0.033145630368119419, -0.066291260736238838, 0.17677669529663689, 0.4198446513295126, -0.99436891104358249, 0.4198446513295126, + 0.17677669529663689, -0.066291260736238838, -0.033145630368119419 + }; + return 0; + } + if (name == "bior2.6") + { + lp1 = { + 0.0, -0.0069053396600248784, 0.013810679320049757, 0.046956309688169176, -0.10772329869638811, -0.16987135563661201, 0.44746600996961211, + 0.96674755240348298, 0.44746600996961211, -0.16987135563661201, -0.10772329869638811, 0.046956309688169176, 0.013810679320049757, + -0.0069053396600248784 + }; + + hp1 = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.35355339059327379, -0.70710678118654757, 0.35355339059327379, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; + + lp2 = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.35355339059327379, 0.70710678118654757, 0.35355339059327379, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; + + hp2 = { + 0.0, 0.0069053396600248784, 0.013810679320049757, -0.046956309688169176, -0.10772329869638811, 0.16987135563661201, 0.44746600996961211, + -0.96674755240348298, 0.44746600996961211, 0.16987135563661201, -0.10772329869638811, -0.046956309688169176, 0.013810679320049757, + 0.0069053396600248784 + }; + return 0; + } + if (name == "bior2.8") + { + lp1 = { + 0.0, 0.0015105430506304422, -0.0030210861012608843, -0.012947511862546647, 0.028916109826354178, 0.052998481890690945, -0.13491307360773608, + -0.16382918343409025, 0.46257144047591658, 0.95164212189717856, 0.46257144047591658, -0.16382918343409025, -0.13491307360773608, + 0.052998481890690945, 0.028916109826354178, -0.012947511862546647, -0.0030210861012608843, 0.0015105430506304422 + }; + + hp1 = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.35355339059327379, -0.70710678118654757, 0.35355339059327379, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; + + lp2 = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.35355339059327379, 0.70710678118654757, 0.35355339059327379, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; + + hp2 = { + 0.0, -0.0015105430506304422, -0.0030210861012608843, 0.012947511862546647, 0.028916109826354178, -0.052998481890690945, -0.13491307360773608, + 0.16382918343409025, 0.46257144047591658, -0.95164212189717856, 0.46257144047591658, 0.16382918343409025, -0.13491307360773608, + -0.052998481890690945, 0.028916109826354178, 0.012947511862546647, -0.0030210861012608843, -0.0015105430506304422 + }; + return 0; + } + if (name == "bior3.1") + { + lp1 = { -0.35355339059327379, 1.0606601717798214, 1.0606601717798214, -0.35355339059327379 }; + + hp1 = { -0.17677669529663689, 0.53033008588991071, -0.53033008588991071, 0.17677669529663689 }; + + lp2 = { 0.17677669529663689, 0.53033008588991071, 0.53033008588991071, 0.17677669529663689 }; + + hp2 = { -0.35355339059327379, -1.0606601717798214, 1.0606601717798214, 0.35355339059327379 }; + return 0; + } + if (name == "bior3.3") + { + lp1 = { + 0.066291260736238838, -0.19887378220871652, -0.15467960838455727, 0.99436891104358249, 0.99436891104358249, -0.15467960838455727, + -0.19887378220871652, 0.066291260736238838 + }; + + hp1 = { 0.0, 0.0, -0.17677669529663689, 0.53033008588991071, -0.53033008588991071, 0.17677669529663689, 0.0, 0.0 }; + + lp2 = { 0.0, 0.0, 0.17677669529663689, 0.53033008588991071, 0.53033008588991071, 0.17677669529663689, 0.0, 0.0 }; + + hp2 = { + 0.066291260736238838, 0.19887378220871652, -0.15467960838455727, -0.99436891104358249, 0.99436891104358249, 0.15467960838455727, + -0.19887378220871652, -0.066291260736238838 + }; + return 0; + } + if (name == "bior3.5") + { + lp1 = { + -0.013810679320049757, 0.041432037960149271, 0.052480581416189075, -0.26792717880896527, -0.071815532464258744, 0.96674755240348298, + 0.96674755240348298, -0.071815532464258744, -0.26792717880896527, 0.052480581416189075, 0.041432037960149271, -0.013810679320049757 + }; + + hp1 = { 0.0, 0.0, 0.0, 0.0, -0.17677669529663689, 0.53033008588991071, -0.53033008588991071, 0.17677669529663689, 0.0, 0.0, 0.0, 0.0 }; + + lp2 = { 0.0, 0.0, 0.0, 0.0, 0.17677669529663689, 0.53033008588991071, 0.53033008588991071, 0.17677669529663689, 0.0, 0.0, 0.0, 0.0 }; + + hp2 = { + -0.013810679320049757, -0.041432037960149271, 0.052480581416189075, 0.26792717880896527, -0.071815532464258744, -0.96674755240348298, + 0.96674755240348298, 0.071815532464258744, -0.26792717880896527, -0.052480581416189075, 0.041432037960149271, 0.013810679320049757 + }; + return 0; + } + if (name == "bior3.7") + { + lp1 = { + 0.0030210861012608843, -0.0090632583037826529, -0.016831765421310641, 0.074663985074019001, 0.031332978707362888, -0.301159125922835, + -0.026499240945345472, 0.95164212189717856, 0.95164212189717856, -0.026499240945345472, -0.301159125922835, 0.031332978707362888, + 0.074663985074019001, -0.016831765421310641, -0.0090632583037826529, 0.0030210861012608843 + }; + + hp1 = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.17677669529663689, 0.53033008588991071, -0.53033008588991071, 0.17677669529663689, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + }; + + lp2 = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.17677669529663689, 0.53033008588991071, 0.53033008588991071, 0.17677669529663689, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 + }; + + hp2 = { + 0.0030210861012608843, 0.0090632583037826529, -0.016831765421310641, -0.074663985074019001, 0.031332978707362888, 0.301159125922835, + -0.026499240945345472, -0.95164212189717856, 0.95164212189717856, 0.026499240945345472, -0.301159125922835, -0.031332978707362888, + 0.074663985074019001, 0.016831765421310641, -0.0090632583037826529, -0.0030210861012608843 + }; + return 0; + } + if (name == "bior3.9") + { + lp1 = { + -0.00067974437278369901, 0.0020392331183510968, 0.0050603192196119811, -0.020618912641105536, -0.014112787930175846, 0.09913478249423216, + 0.012300136269419315, -0.32019196836077857, 0.0020500227115698858, 0.94212570067820678, 0.94212570067820678, 0.0020500227115698858, + -0.32019196836077857, 0.012300136269419315, 0.09913478249423216, -0.014112787930175846, -0.020618912641105536, 0.0050603192196119811, + 0.0020392331183510968, -0.00067974437278369901 + }; + + hp1 = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.17677669529663689, 0.53033008588991071, -0.53033008588991071, 0.17677669529663689, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0 + }; + + lp2 = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.17677669529663689, 0.53033008588991071, 0.53033008588991071, 0.17677669529663689, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0 + }; + + hp2 = { + -0.00067974437278369901, -0.0020392331183510968, 0.0050603192196119811, 0.020618912641105536, -0.014112787930175846, -0.09913478249423216, + 0.012300136269419315, 0.32019196836077857, 0.0020500227115698858, -0.94212570067820678, 0.94212570067820678, -0.0020500227115698858, + -0.32019196836077857, -0.012300136269419315, 0.09913478249423216, 0.014112787930175846, -0.020618912641105536, -0.0050603192196119811, + 0.0020392331183510968, 0.00067974437278369901 + }; + return 0; + } + if (name == "bior4.4") + { + lp1 = { + 0.0, 0.03782845550726404, -0.023849465019556843, -0.11062440441843718, 0.37740285561283066, 0.85269867900889385, 0.37740285561283066, + -0.11062440441843718, -0.023849465019556843, 0.03782845550726404 + }; + + hp1 = { + 0.0, -0.064538882628697058, 0.040689417609164058, 0.41809227322161724, -0.7884856164055829, 0.41809227322161724, 0.040689417609164058, + -0.064538882628697058, 0.0, 0.0 + }; + + lp2 = { + 0.0, -0.064538882628697058, -0.040689417609164058, 0.41809227322161724, 0.7884856164055829, 0.41809227322161724, -0.040689417609164058, + -0.064538882628697058, 0.0, 0.0 + }; + + hp2 = { + 0.0, -0.03782845550726404, -0.023849465019556843, 0.11062440441843718, 0.37740285561283066, -0.85269867900889385, 0.37740285561283066, + 0.11062440441843718, -0.023849465019556843, -0.03782845550726404 + }; + return 0; + } + if (name == "bior5.5") + { + lp1 = { + 0.0, 0.0, 0.03968708834740544, 0.0079481086372403219, -0.054463788468236907, 0.34560528195603346, 0.73666018142821055, 0.34560528195603346, + -0.054463788468236907, 0.0079481086372403219, 0.03968708834740544, 0.0 + }; + + hp1 = { + -0.013456709459118716, -0.0026949668801115071, 0.13670658466432914, -0.093504697400938863, -0.47680326579848425, 0.89950610974864842, + -0.47680326579848425, -0.093504697400938863, 0.13670658466432914, -0.0026949668801115071, -0.013456709459118716, 0.0 + }; + + lp2 = { + 0.013456709459118716, -0.0026949668801115071, -0.13670658466432914, -0.093504697400938863, 0.47680326579848425, 0.89950610974864842, + 0.47680326579848425, -0.093504697400938863, -0.13670658466432914, -0.0026949668801115071, 0.013456709459118716, 0.0 + }; + + hp2 = { + 0.0, 0.0, 0.03968708834740544, -0.0079481086372403219, -0.054463788468236907, -0.34560528195603346, 0.73666018142821055, -0.34560528195603346, + -0.054463788468236907, -0.0079481086372403219, 0.03968708834740544, 0.0 + }; + return 0; + } + if (name == "bior6.8") + { + lp1 = { + 0.0, 0.0019088317364812906, -0.0019142861290887667, -0.016990639867602342, 0.01193456527972926, 0.04973290349094079, -0.077263173167204144, + -0.09405920349573646, 0.42079628460982682, 0.82592299745840225, 0.42079628460982682, -0.09405920349573646, -0.077263173167204144, + 0.04973290349094079, 0.01193456527972926, -0.016990639867602342, -0.0019142861290887667, 0.0019088317364812906 + }; + + hp1 = { + 0.0, 0.0, 0.0, 0.014426282505624435, -0.014467504896790148, -0.078722001062628819, 0.040367979030339923, 0.41784910915027457, -0.75890772945365415, + 0.41784910915027457, 0.040367979030339923, -0.078722001062628819, -0.014467504896790148, 0.014426282505624435, 0.0, 0.0, 0.0, 0.0 + }; + + lp2 = { + 0.0, 0.0, 0.0, 0.014426282505624435, 0.014467504896790148, -0.078722001062628819, -0.040367979030339923, 0.41784910915027457, 0.75890772945365415, + 0.41784910915027457, -0.040367979030339923, -0.078722001062628819, 0.014467504896790148, 0.014426282505624435, 0.0, 0.0, 0.0, 0.0 + }; + + hp2 = { + 0.0, -0.0019088317364812906, -0.0019142861290887667, 0.016990639867602342, 0.01193456527972926, -0.04973290349094079, -0.077263173167204144, + 0.09405920349573646, 0.42079628460982682, -0.82592299745840225, 0.42079628460982682, 0.09405920349573646, -0.077263173167204144, + -0.04973290349094079, 0.01193456527972926, 0.016990639867602342, -0.0019142861290887667, -0.0019088317364812906 + }; + return 0; + } + if (name == "coif1") + { + lp1 = { -0.01565572813546454, -0.072732619512853897, 0.38486484686420286, 0.85257202021225542, 0.33789766245780922, -0.072732619512853897 }; + + hp1 = { 0.072732619512853897, 0.33789766245780922, -0.85257202021225542, 0.38486484686420286, 0.072732619512853897, -0.01565572813546454 }; + + lp2 = { -0.072732619512853897, 0.33789766245780922, 0.85257202021225542, 0.38486484686420286, -0.072732619512853897, -0.01565572813546454 }; + + hp2 = { -0.01565572813546454, 0.072732619512853897, 0.38486484686420286, -0.85257202021225542, 0.33789766245780922, 0.072732619512853897 }; + return 0; + } + if (name == "coif2") + { + lp1 = { + -0.00072054944536451221, -0.0018232088707029932, 0.0056114348193944995, 0.023680171946334084, -0.059434418646456898, -0.076488599078306393, + 0.41700518442169254, 0.81272363544554227, 0.38611006682116222, -0.067372554721963018, -0.041464936781759151, 0.016387336463522112 + }; + + hp1 = { + -0.016387336463522112, -0.041464936781759151, 0.067372554721963018, 0.38611006682116222, -0.81272363544554227, 0.41700518442169254, + 0.076488599078306393, -0.059434418646456898, -0.023680171946334084, 0.0056114348193944995, 0.0018232088707029932, -0.00072054944536451221 + }; + + lp2 = { + 0.016387336463522112, -0.041464936781759151, -0.067372554721963018, 0.38611006682116222, 0.81272363544554227, 0.41700518442169254, + -0.076488599078306393, -0.059434418646456898, 0.023680171946334084, 0.0056114348193944995, -0.0018232088707029932, -0.00072054944536451221 + }; + + hp2 = { + -0.00072054944536451221, 0.0018232088707029932, 0.0056114348193944995, -0.023680171946334084, -0.059434418646456898, 0.076488599078306393, + 0.41700518442169254, -0.81272363544554227, 0.38611006682116222, 0.067372554721963018, -0.041464936781759151, -0.016387336463522112 + }; + return 0; + } + if (name == "coif3") + { + lp1 = { + -3.4599772836212559e-05, -7.0983303138141252e-05, 0.00046621696011288631, 0.0011175187708906016, -0.0025745176887502236, -0.0090079761366615805, + 0.015880544863615904, 0.034555027573061628, -0.082301927106885983, -0.071799821619312018, 0.42848347637761874, 0.79377722262562056, + 0.4051769024096169, -0.061123390002672869, -0.0657719112818555, 0.023452696141836267, 0.0077825964273254182, -0.0037935128644910141 + }; + + hp1 = { + 0.0037935128644910141, 0.0077825964273254182, -0.023452696141836267, -0.0657719112818555, 0.061123390002672869, 0.4051769024096169, + -0.79377722262562056, 0.42848347637761874, 0.071799821619312018, -0.082301927106885983, -0.034555027573061628, 0.015880544863615904, + 0.0090079761366615805, -0.0025745176887502236, -0.0011175187708906016, 0.00046621696011288631, 7.0983303138141252e-05, -3.4599772836212559e-05 + }; + + lp2 = { + -0.0037935128644910141, 0.0077825964273254182, 0.023452696141836267, -0.0657719112818555, -0.061123390002672869, 0.4051769024096169, + 0.79377722262562056, 0.42848347637761874, -0.071799821619312018, -0.082301927106885983, 0.034555027573061628, 0.015880544863615904, + -0.0090079761366615805, -0.0025745176887502236, 0.0011175187708906016, 0.00046621696011288631, -7.0983303138141252e-05, -3.4599772836212559e-05 + }; + + hp2 = { + -3.4599772836212559e-05, 7.0983303138141252e-05, 0.00046621696011288631, -0.0011175187708906016, -0.0025745176887502236, 0.0090079761366615805, + 0.015880544863615904, -0.034555027573061628, -0.082301927106885983, 0.071799821619312018, 0.42848347637761874, -0.79377722262562056, + 0.4051769024096169, 0.061123390002672869, -0.0657719112818555, -0.023452696141836267, 0.0077825964273254182, 0.0037935128644910141 + }; + return 0; + } + if (name == "coif4") + { + lp1 = { + -1.7849850030882614e-06, -3.2596802368833675e-06, 3.1229875865345646e-05, 6.2339034461007128e-05, -0.00025997455248771324, -0.00058902075624433831, + 0.0012665619292989445, 0.0037514361572784571, -0.0056582866866107199, -0.015211731527946259, 0.025082261844864097, 0.039334427123337491, + -0.096220442033987982, -0.066627474263425038, 0.4343860564914685, 0.78223893092049901, 0.41530840703043026, -0.056077313316754807, + -0.081266699680878754, 0.026682300156053072, 0.016068943964776348, -0.0073461663276420935, -0.0016294920126017326, 0.00089231366858231456 + }; + + hp1 = { + -0.00089231366858231456, -0.0016294920126017326, 0.0073461663276420935, 0.016068943964776348, -0.026682300156053072, -0.081266699680878754, + 0.056077313316754807, 0.41530840703043026, -0.78223893092049901, 0.4343860564914685, 0.066627474263425038, -0.096220442033987982, + -0.039334427123337491, 0.025082261844864097, 0.015211731527946259, -0.0056582866866107199, -0.0037514361572784571, 0.0012665619292989445, + 0.00058902075624433831, -0.00025997455248771324, -6.2339034461007128e-05, 3.1229875865345646e-05, 3.2596802368833675e-06, -1.7849850030882614e-06 + }; + + lp2 = { + 0.00089231366858231456, -0.0016294920126017326, -0.0073461663276420935, 0.016068943964776348, 0.026682300156053072, -0.081266699680878754, + -0.056077313316754807, 0.41530840703043026, 0.78223893092049901, 0.4343860564914685, -0.066627474263425038, -0.096220442033987982, + 0.039334427123337491, 0.025082261844864097, -0.015211731527946259, -0.0056582866866107199, 0.0037514361572784571, 0.0012665619292989445, + -0.00058902075624433831, -0.00025997455248771324, 6.2339034461007128e-05, 3.1229875865345646e-05, -3.2596802368833675e-06, -1.7849850030882614e-06 + }; + + hp2 = { + -1.7849850030882614e-06, 3.2596802368833675e-06, 3.1229875865345646e-05, -6.2339034461007128e-05, -0.00025997455248771324, 0.00058902075624433831, + 0.0012665619292989445, -0.0037514361572784571, -0.0056582866866107199, 0.015211731527946259, 0.025082261844864097, -0.039334427123337491, + -0.096220442033987982, 0.066627474263425038, 0.4343860564914685, -0.78223893092049901, 0.41530840703043026, 0.056077313316754807, + -0.081266699680878754, -0.026682300156053072, 0.016068943964776348, 0.0073461663276420935, -0.0016294920126017326, -0.00089231366858231456 + }; + return 0; + } + if (name == "coif5") + { + lp1 = { + -9.517657273819165e-08, -1.6744288576823017e-07, 2.0637618513646814e-06, 3.7346551751414047e-06, -2.1315026809955787e-05, -4.1340432272512511e-05, + 0.00014054114970203437, 0.00030225958181306315, -0.00063813134304511142, -0.0016628637020130838, 0.0024333732126576722, 0.0067641854480530832, + -0.0091642311624818458, -0.019761778942572639, 0.032683574267111833, 0.041289208750181702, -0.10557420870333893, -0.062035963962903569, + 0.43799162617183712, 0.77428960365295618, 0.42156620669085149, -0.052043163176243773, -0.091920010559696244, 0.02816802897093635, + 0.023408156785839195, -0.010131117519849788, -0.004159358781386048, 0.0021782363581090178, 0.00035858968789573785, -0.00021208083980379827 + }; + + hp1 = { + 0.00021208083980379827, 0.00035858968789573785, -0.0021782363581090178, -0.004159358781386048, 0.010131117519849788, 0.023408156785839195, + -0.02816802897093635, -0.091920010559696244, 0.052043163176243773, 0.42156620669085149, -0.77428960365295618, 0.43799162617183712, + 0.062035963962903569, -0.10557420870333893, -0.041289208750181702, 0.032683574267111833, 0.019761778942572639, -0.0091642311624818458, + -0.0067641854480530832, 0.0024333732126576722, 0.0016628637020130838, -0.00063813134304511142, -0.00030225958181306315, 0.00014054114970203437, + 4.1340432272512511e-05, -2.1315026809955787e-05, -3.7346551751414047e-06, 2.0637618513646814e-06, 1.6744288576823017e-07, -9.517657273819165e-08 + }; + + lp2 = { + -0.00021208083980379827, 0.00035858968789573785, 0.0021782363581090178, -0.004159358781386048, -0.010131117519849788, 0.023408156785839195, + 0.02816802897093635, -0.091920010559696244, -0.052043163176243773, 0.42156620669085149, 0.77428960365295618, 0.43799162617183712, + -0.062035963962903569, -0.10557420870333893, 0.041289208750181702, 0.032683574267111833, -0.019761778942572639, -0.0091642311624818458, + 0.0067641854480530832, 0.0024333732126576722, -0.0016628637020130838, -0.00063813134304511142, 0.00030225958181306315, 0.00014054114970203437, + -4.1340432272512511e-05, -2.1315026809955787e-05, 3.7346551751414047e-06, 2.0637618513646814e-06, -1.6744288576823017e-07, -9.517657273819165e-08 + }; + + hp2 = { + -9.517657273819165e-08, 1.6744288576823017e-07, 2.0637618513646814e-06, -3.7346551751414047e-06, -2.1315026809955787e-05, 4.1340432272512511e-05, + 0.00014054114970203437, -0.00030225958181306315, -0.00063813134304511142, 0.0016628637020130838, 0.0024333732126576722, -0.0067641854480530832, + -0.0091642311624818458, 0.019761778942572639, 0.032683574267111833, -0.041289208750181702, -0.10557420870333893, 0.062035963962903569, + 0.43799162617183712, -0.77428960365295618, 0.42156620669085149, 0.052043163176243773, -0.091920010559696244, -0.02816802897093635, + 0.023408156785839195, 0.010131117519849788, -0.004159358781386048, -0.0021782363581090178, 0.00035858968789573785, 0.00021208083980379827 + }; + return 0; + } + if (name == "sym2") + { + lp1 = { -0.12940952255092145, 0.22414386804185735, 0.83651630373746899, 0.48296291314469025 }; + + hp1 = { -0.48296291314469025, 0.83651630373746899, -0.22414386804185735, -0.12940952255092145 }; + + lp2 = { 0.48296291314469025, 0.83651630373746899, 0.22414386804185735, -0.12940952255092145 }; + + hp2 = { -0.12940952255092145, -0.22414386804185735, 0.83651630373746899, -0.48296291314469025 }; + return 0; + } + if (name == "sym3") + { + lp1 = { 0.035226291882100656, -0.085441273882241486, -0.13501102001039084, 0.45987750211933132, 0.80689150931333875, 0.33267055295095688 }; + + hp1 = { -0.33267055295095688, 0.80689150931333875, -0.45987750211933132, -0.13501102001039084, 0.085441273882241486, 0.035226291882100656 }; + + lp2 = { 0.33267055295095688, 0.80689150931333875, 0.45987750211933132, -0.13501102001039084, -0.085441273882241486, 0.035226291882100656 }; + + hp2 = { 0.035226291882100656, 0.085441273882241486, -0.13501102001039084, -0.45987750211933132, 0.80689150931333875, -0.33267055295095688 }; + return 0; + } + if (name == "sym4") + { + lp1 = { + -0.075765714789273325, -0.02963552764599851, 0.49761866763201545, 0.80373875180591614, 0.29785779560527736, -0.099219543576847216, + -0.012603967262037833, 0.032223100604042702 + }; + + hp1 = { + -0.032223100604042702, -0.012603967262037833, 0.099219543576847216, 0.29785779560527736, -0.80373875180591614, 0.49761866763201545, + 0.02963552764599851, -0.075765714789273325 + }; + + lp2 = { + 0.032223100604042702, -0.012603967262037833, -0.099219543576847216, 0.29785779560527736, 0.80373875180591614, 0.49761866763201545, + -0.02963552764599851, -0.075765714789273325 + }; + + hp2 = { + -0.075765714789273325, 0.02963552764599851, 0.49761866763201545, -0.80373875180591614, 0.29785779560527736, 0.099219543576847216, + -0.012603967262037833, -0.032223100604042702 + }; + return 0; + } + if (name == "sym5") + { + lp1 = { + 0.027333068345077982, 0.029519490925774643, -0.039134249302383094, 0.1993975339773936, 0.72340769040242059, 0.63397896345821192, + 0.016602105764522319, -0.17532808990845047, -0.021101834024758855, 0.019538882735286728 + }; + + hp1 = { + -0.019538882735286728, -0.021101834024758855, 0.17532808990845047, 0.016602105764522319, -0.63397896345821192, 0.72340769040242059, + -0.1993975339773936, -0.039134249302383094, -0.029519490925774643, 0.027333068345077982 + }; + + lp2 = { + 0.019538882735286728, -0.021101834024758855, -0.17532808990845047, 0.016602105764522319, 0.63397896345821192, 0.72340769040242059, + 0.1993975339773936, -0.039134249302383094, 0.029519490925774643, 0.027333068345077982 + }; + + hp2 = { + 0.027333068345077982, -0.029519490925774643, -0.039134249302383094, -0.1993975339773936, 0.72340769040242059, -0.63397896345821192, + 0.016602105764522319, 0.17532808990845047, -0.021101834024758855, -0.019538882735286728 + }; + return 0; + } + if (name == "sym6") + { + lp1 = { + 0.015404109327027373, 0.0034907120842174702, -0.11799011114819057, -0.048311742585632998, 0.49105594192674662, 0.787641141030194, + 0.3379294217276218, -0.072637522786462516, -0.021060292512300564, 0.044724901770665779, 0.0017677118642428036, -0.007800708325034148 + }; + + hp1 = { + 0.007800708325034148, 0.0017677118642428036, -0.044724901770665779, -0.021060292512300564, 0.072637522786462516, 0.3379294217276218, + -0.787641141030194, 0.49105594192674662, 0.048311742585632998, -0.11799011114819057, -0.0034907120842174702, 0.015404109327027373 + }; + + lp2 = { + -0.007800708325034148, 0.0017677118642428036, 0.044724901770665779, -0.021060292512300564, -0.072637522786462516, 0.3379294217276218, + 0.787641141030194, 0.49105594192674662, -0.048311742585632998, -0.11799011114819057, 0.0034907120842174702, 0.015404109327027373 + }; + + hp2 = { + 0.015404109327027373, -0.0034907120842174702, -0.11799011114819057, 0.048311742585632998, 0.49105594192674662, -0.787641141030194, + 0.3379294217276218, 0.072637522786462516, -0.021060292512300564, -0.044724901770665779, 0.0017677118642428036, 0.007800708325034148 + }; + return 0; + } + if (name == "sym7") + { + lp1 = { + 0.0026818145682578781, -0.0010473848886829163, -0.01263630340325193, 0.03051551316596357, 0.067892693501372697, -0.049552834937127255, + 0.017441255086855827, 0.5361019170917628, 0.76776431700316405, 0.28862963175151463, -0.14004724044296152, -0.10780823770381774, + 0.0040102448715336634, 0.010268176708511255 + }; + + hp1 = { + -0.010268176708511255, 0.0040102448715336634, 0.10780823770381774, -0.14004724044296152, -0.28862963175151463, 0.76776431700316405, + -0.5361019170917628, 0.017441255086855827, 0.049552834937127255, 0.067892693501372697, -0.03051551316596357, -0.01263630340325193, + 0.0010473848886829163, 0.0026818145682578781 + }; + + lp2 = { + 0.010268176708511255, 0.0040102448715336634, -0.10780823770381774, -0.14004724044296152, 0.28862963175151463, 0.76776431700316405, + 0.5361019170917628, 0.017441255086855827, -0.049552834937127255, 0.067892693501372697, 0.03051551316596357, -0.01263630340325193, + -0.0010473848886829163, 0.0026818145682578781 + }; + + hp2 = { + 0.0026818145682578781, 0.0010473848886829163, -0.01263630340325193, -0.03051551316596357, 0.067892693501372697, 0.049552834937127255, + 0.017441255086855827, -0.5361019170917628, 0.76776431700316405, -0.28862963175151463, -0.14004724044296152, 0.10780823770381774, + 0.0040102448715336634, -0.010268176708511255 + }; + return 0; + } + if (name == "sym8") + { + lp1 = { + -0.0033824159510061256, -0.00054213233179114812, 0.031695087811492981, 0.0076074873249176054, -0.14329423835080971, -0.061273359067658524, + 0.48135965125837221, 0.77718575170052351, 0.3644418948353314, -0.051945838107709037, -0.027219029917056003, 0.049137179673607506, + 0.0038087520138906151, -0.014952258337048231, -0.0003029205147213668, 0.0018899503327594609 + }; + + hp1 = { + -0.0018899503327594609, -0.0003029205147213668, 0.014952258337048231, 0.0038087520138906151, -0.049137179673607506, -0.027219029917056003, + 0.051945838107709037, 0.3644418948353314, -0.77718575170052351, 0.48135965125837221, 0.061273359067658524, -0.14329423835080971, + -0.0076074873249176054, 0.031695087811492981, 0.00054213233179114812, -0.0033824159510061256 + }; + + lp2 = { + 0.0018899503327594609, -0.0003029205147213668, -0.014952258337048231, 0.0038087520138906151, 0.049137179673607506, -0.027219029917056003, + -0.051945838107709037, 0.3644418948353314, 0.77718575170052351, 0.48135965125837221, -0.061273359067658524, -0.14329423835080971, + 0.0076074873249176054, 0.031695087811492981, -0.00054213233179114812, -0.0033824159510061256 + }; + + hp2 = { + -0.0033824159510061256, 0.00054213233179114812, 0.031695087811492981, -0.0076074873249176054, -0.14329423835080971, 0.061273359067658524, + 0.48135965125837221, -0.77718575170052351, 0.3644418948353314, 0.051945838107709037, -0.027219029917056003, -0.049137179673607506, + 0.0038087520138906151, 0.014952258337048231, -0.0003029205147213668, -0.0018899503327594609 + }; + return 0; + } + if (name == "sym9") + { + lp1 = { + 0.0014009155259146807, 0.00061978088898558676, -0.013271967781817119, -0.01152821020767923, 0.03022487885827568, 0.00058346274612580684, + -0.054568958430834071, 0.238760914607303, 0.717897082764412, 0.61733844914093583, 0.035272488035271894, -0.19155083129728512, -0.018233770779395985, + 0.06207778930288603, 0.0088592674934004842, -0.010264064027633142, -0.00047315449868008311, 0.0010694900329086053 + }; + + hp1 = { + -0.0010694900329086053, -0.00047315449868008311, 0.010264064027633142, 0.0088592674934004842, -0.06207778930288603, -0.018233770779395985, + 0.19155083129728512, 0.035272488035271894, -0.61733844914093583, 0.717897082764412, -0.238760914607303, -0.054568958430834071, + -0.00058346274612580684, 0.03022487885827568, 0.01152821020767923, -0.013271967781817119, -0.00061978088898558676, 0.0014009155259146807 + }; + + lp2 = { + 0.0010694900329086053, -0.00047315449868008311, -0.010264064027633142, 0.0088592674934004842, 0.06207778930288603, -0.018233770779395985, + -0.19155083129728512, 0.035272488035271894, 0.61733844914093583, 0.717897082764412, 0.238760914607303, -0.054568958430834071, + 0.00058346274612580684, 0.03022487885827568, -0.01152821020767923, -0.013271967781817119, 0.00061978088898558676, 0.0014009155259146807 + }; + + hp2 = { + 0.0014009155259146807, -0.00061978088898558676, -0.013271967781817119, 0.01152821020767923, 0.03022487885827568, -0.00058346274612580684, + -0.054568958430834071, -0.238760914607303, 0.717897082764412, -0.61733844914093583, 0.035272488035271894, 0.19155083129728512, + -0.018233770779395985, -0.06207778930288603, 0.0088592674934004842, 0.010264064027633142, -0.00047315449868008311, -0.0010694900329086053 + }; + return 0; + } + if (name == "sym10") + { + lp1 = { + 0.00077015980911449011, 9.5632670722894754e-05, -0.0086412992770224222, -0.0014653825813050513, 0.045927239231092203, 0.011609893903711381, + -0.15949427888491757, -0.070880535783243853, 0.47169066693843925, 0.7695100370211071, 0.38382676106708546, -0.035536740473817552, + -0.0319900568824278, 0.049994972077376687, 0.0057649120335819086, -0.02035493981231129, -0.00080435893201654491, 0.0045931735853118284, + 5.7036083618494284e-05, -0.00045932942100465878 + }; + + hp1 = { + 0.00045932942100465878, 5.7036083618494284e-05, -0.0045931735853118284, -0.00080435893201654491, 0.02035493981231129, 0.0057649120335819086, + -0.049994972077376687, -0.0319900568824278, 0.035536740473817552, 0.38382676106708546, -0.7695100370211071, 0.47169066693843925, + 0.070880535783243853, -0.15949427888491757, -0.011609893903711381, 0.045927239231092203, 0.0014653825813050513, -0.0086412992770224222, + -9.5632670722894754e-05, 0.00077015980911449011 + }; + + lp2 = { + -0.00045932942100465878, 5.7036083618494284e-05, 0.0045931735853118284, -0.00080435893201654491, -0.02035493981231129, 0.0057649120335819086, + 0.049994972077376687, -0.0319900568824278, -0.035536740473817552, 0.38382676106708546, 0.7695100370211071, 0.47169066693843925, + -0.070880535783243853, -0.15949427888491757, 0.011609893903711381, 0.045927239231092203, -0.0014653825813050513, -0.0086412992770224222, + 9.5632670722894754e-05, 0.00077015980911449011 + }; + + hp2 = { + 0.00077015980911449011, -9.5632670722894754e-05, -0.0086412992770224222, 0.0014653825813050513, 0.045927239231092203, -0.011609893903711381, + -0.15949427888491757, 0.070880535783243853, 0.47169066693843925, -0.7695100370211071, 0.38382676106708546, 0.035536740473817552, + -0.0319900568824278, -0.049994972077376687, 0.0057649120335819086, 0.02035493981231129, -0.00080435893201654491, -0.0045931735853118284, + 5.7036083618494284e-05, 0.00045932942100465878 + }; + return 0; + } + std::cout << "Filter Not in Database" << std::endl; + return -1; +} + +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/packages/wavelet2d/wavelet2s.h b/Masterarbeit/openvibe/extras-master/contrib/packages/wavelet2d/wavelet2s.h new file mode 100755 index 0000000..a5d3f05 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/packages/wavelet2d/wavelet2s.h @@ -0,0 +1,87 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyFFTW3) + +#include +#include + +// 1D Functions +// void* dwt(std::vector &, int ,std::string , std::vector &, std::vector &); +void* dwt1(const std::string& wname, std::vector& signal, std::vector& cA, std::vector& cD); +void* dyadic_zpad_1d(std::vector& signal); +double convol(std::vector& a1, std::vector& b1, std::vector& c); +int filtcoef(const std::string& name, std::vector& lp1, std::vector& hp1, std::vector& lp2, std::vector& hp2); +void downsamp(std::vector& sig, int m, std::vector& sigD); +void upsamp(std::vector& sig, int m, std::vector& sigU); +void circshift(std::vector& sigCir, int l); +int sign(int x); +void* idwt1(const std::string& wname, std::vector& X, std::vector& cA, std::vector& cD); +int vecsum(std::vector& a, std::vector& b, std::vector& c); + +// 1D Symmetric Extension DWT Functions +void* dwt_sym(std::vector& signal, int J, const std::string& nm, std::vector& dwtOutput, std::vector& flag, + std::vector& length); +void* dwt1_sym(const std::string& wname, std::vector& signal, std::vector& cA, std::vector& cD); +void* idwt_sym(std::vector& dwtop, std::vector& flag, const std::string& nm, std::vector& idwtOutput, std::vector& length); +void* symm_ext(std::vector& sig, int a); +void* idwt1_sym(const std::string& wname, std::vector& x, std::vector& app, std::vector& detail); // Not Tested + +// 1D Stationary Wavelet Transform +void* swt(std::vector& signal1, int J, const std::string& nm, std::vector& swtOutput, int& length); +void* iswt(std::vector& swtop, int J, const std::string& nm, std::vector& iswtOutput); +void* per_ext(std::vector& sig, int a); + +// 2D Functions +void* branch_lp_dn(const std::string& wname, std::vector& signal, std::vector& sigop); +void* branch_hp_dn(const std::string& wname, std::vector& signal, std::vector& sigop); +void* branch_lp_hp_up(const std::string& wname, std::vector& cA, std::vector& cD, std::vector& x); +// void* dwt_2d(std::vector > &, int , std::string , std::vector > &, std::vector &) ; +// void* idwt_2d(std::vector > &,std::vector &, std::string ,std::vector > &); +void* dyadic_zpad_2d(std::vector>& signal, std::vector>& mod); +void* dwt_output_dim(std::vector>& signal, int& r, int& c); +void* zero_remove(std::vector>& input, std::vector>& output); +void* getcoeff2d(std::vector>& dwtoutput, std::vector>& cH, std::vector>& cV, + std::vector>& cD, std::vector& flag, int& n); +void* idwt2(const std::string& name, std::vector>& signal, std::vector>& cLL, std::vector>& cLH, + std::vector>& cHL, std::vector>& cHH); +void* dwt2(const std::string& name, std::vector>& signal, std::vector>& cLL, std::vector>& cLH, + std::vector>& cHL, std::vector>& cHH); +void* downsamp2(std::vector>& vec1, std::vector>& vec2, int rowsDn, int colsDn); +void* upsamp2(std::vector>& vec1, std::vector>& vec2, int rowsUp, int colsUp); + +// 2D DWT (Symmetric Extension) Functions +void* dwt_2d_sym(std::vector>& origsig, int J, const std::string& nm, std::vector& dwtOutput, std::vector& flag, + std::vector& length); +void* dwt2_sym(const std::string& name, std::vector>& signal, std::vector>& cLL, std::vector>& cLH, + std::vector>& cHL, std::vector>& cHH); +void* idwt_2d_sym(std::vector& dwtop, std::vector& flag, const std::string& nm, std::vector>& idwtOutput, + std::vector& length); +void* circshift2d(std::vector>& signal, int x, int y); +void symm_ext2d(std::vector>& signal, std::vector>& temp2, int a); +void* dispDWT(std::vector& output, std::vector>& dwtdisp, std::vector& length, std::vector& length2, int J); + +//2D Stationary Wavelet Transform +void* swt_2d(std::vector>& sig, int J, const std::string& nm, std::vector& swtOutput); +void* per_ext2d(std::vector>& signal, std::vector>& temp2, int a); + +// FFT functions +double convfft(std::vector& a, std::vector& b, std::vector& c); +double convfftm(std::vector& a, std::vector& b, std::vector& c); +void* fft(std::vector>& data, int sign, size_t n); +void* bitreverse(std::vector>& sig); +void* freq(std::vector& sig, std::vector& freqResp); + +//New +void* dwt1_sym_m(const std::string& wname, std::vector& signal, std::vector& cA, std::vector& cD);//FFTW3 for 2D +void* idwt1_sym_m(const std::string& wname, std::vector& x, std::vector& app, std::vector& detail); +void* dwt(std::vector& sig, int j, const std::string& nm, std::vector& dwtOutput, std::vector& flag, std::vector& length); +void* idwt(std::vector& dwtop, std::vector& flag, const std::string& nm, std::vector& idwtOutput, std::vector& length); +void* dwt_2d(std::vector>& origsig, int J, const std::string& nm, std::vector& dwtOutput, std::vector& flag, + std::vector& length); +void* dwt1_m(const std::string& wname, std::vector& signal, std::vector& cA, std::vector& cD); +void* idwt_2d(std::vector& dwtop, std::vector& flag, const std::string& nm, std::vector>& idwtOutput, + std::vector& length); +void* idwt1_m(const std::string& wname, std::vector& x, std::vector& cA, std::vector& cD); +void* dwt_output_dim2(std::vector& length, std::vector& length2, int j); + +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/plugins/CMakeLists.txt new file mode 100644 index 0000000..8108044 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/CMakeLists.txt @@ -0,0 +1,4 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("CONTRIB_PLUGINS") + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/CMakeLists.txt new file mode 100644 index 0000000..20068c7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/CMakeLists.txt @@ -0,0 +1,4 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("CONTRIB_PLUGINS_PROCESSING") + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/classification/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/classification/CMakeLists.txt new file mode 100644 index 0000000..95aa659 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/classification/CMakeLists.txt @@ -0,0 +1,3 @@ + +# fill this once there is a contribution to this category... + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/classification/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/classification/src/ovp_defines.h new file mode 100644 index 0000000..f435f6e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/classification/src/ovp_defines.h @@ -0,0 +1,15 @@ + +#pragma once + +//___________________________________________________________________// +// // +// Global defines // +//___________________________________________________________________// +// // + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + #include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/classification/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/classification/src/ovp_main.cpp new file mode 100644 index 0000000..0be7bb1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/classification/src/ovp_main.cpp @@ -0,0 +1,10 @@ + +#include +#include +#include "ovp_defines.h" + +OVP_Declare_Begin(); + +// For the moment this plugin is empty + +OVP_Declare_End() diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/CMakeLists.txt new file mode 100755 index 0000000..ff18b9d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/CMakeLists.txt @@ -0,0 +1,27 @@ +PROJECT(openvibe-plugins-contrib-file-io) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl src/*.c) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindThirdPartyBoost") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/doc/Doc_BoxAlgorithm_EDFFileWriter.dox-part b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/doc/Doc_BoxAlgorithm_EDFFileWriter.dox-part new file mode 100644 index 0000000..cf1d0f3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/doc/Doc_BoxAlgorithm_EDFFileWriter.dox-part @@ -0,0 +1,59 @@ +/** + * \page BoxAlgorithm_EDFFileWriter EDF File Writer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EDFFileWriter_Description| + + * Writes EEG data in European Data Format (EDF). + + * |OVP_DocEnd_BoxAlgorithm_EDFFileWriter_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EDFFileWriter_Inputs| + * |OVP_DocEnd_BoxAlgorithm_EDFFileWriter_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_EDFFileWriter_Input1| + * Experiment Information stream, coming from an acquisition client/server. + * |OVP_DocEnd_BoxAlgorithm_EDFFileWriter_Input1| + + * |OVP_DocBegin_BoxAlgorithm_EDFFileWriter_Input2| + * EEG signal. + * |OVP_DocEnd_BoxAlgorithm_EDFFileWriter_Input2| + + * |OVP_DocBegin_BoxAlgorithm_EDFFileWriter_Input3| + * Stimulation stream. + * |OVP_DocEnd_BoxAlgorithm_EDFFileWriter_Input3| + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EDFFileWriter_Settings| + * |OVP_DocEnd_BoxAlgorithm_EDFFileWriter_Settings| + + * |OVP_DocBegin_BoxAlgorithm_EDFFileWriter_Setting1| + * The file name to be written. + * |OVP_DocEnd_BoxAlgorithm_EDFFileWriter_Setting1| + +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EDFFileWriter_Examples| + * |OVP_DocEnd_BoxAlgorithm_EDFFileWriter_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EDFFileWriter_Miscellaneous| + EDF format can be read by several programs, (e.g EDF browser). + This box is based on the free software EDFlib by Teunis van Beelen. + * |OVP_DocEnd_BoxAlgorithm_EDFFileWriter_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/edf/edflib.c b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/edf/edflib.c new file mode 100644 index 0000000..143f50f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/edf/edflib.c @@ -0,0 +1,4419 @@ +/* +***************************************************************************** +* +* Copyright (c) 2009, 2010, 2011 Teunis van Beelen +* All rights reserved. +* +* email: teuniz@gmail.com +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY Teunis van Beelen ''AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL Teunis van Beelen BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +***************************************************************************** +*/ + +/* compile with options "-D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE" */ + +#include "edflib.h" + +#define EDFLIB_VERSION 109 +#define EDFLIB_MAXFILES 64 + +#if defined(__APPLE__) || defined(__MACH__) || defined(__APPLE_CC__) +#define fopeno fopen +#else +#define fseeko fseeko64 +#define ftello ftello64 +#define fopeno fopen64 +#endif + +#ifdef _WIN32 +#ifndef __MINGW32__ +/* needed for visual c */ +#undef fseeko +#define fseeko _fseeki64 +#undef ftello +#define ftello _ftelli64 +#undef fopeno +#define fopeno fopen +#endif +#endif + +/* max size of annotationtext */ +#define EDFLIB_WRITE_MAX_ANNOTATION_LEN 40 +/* bytes in datarecord for EDF annotations, must be a multiple of three and two */ +#define EDFLIB_ANNOTATION_BYTES 114 + +struct edfparamblock +{ + char label[17]; + char transducer[81]; + char physdimension[9]; + double phys_min; + double phys_max; + int dig_min; + int dig_max; + char prefilter[81]; + int smp_per_record; + char reserved[33]; + int offset; + int buf_offset; + double bitvalue; + int annotation; + long long sample_pntr; +}; + +struct edfhdrblock +{ + FILE* file_hdl; + char path[1024]; + int writemode; + char version[32]; + char patient[81]; + char recording[81]; + char plus_patientcode[81]; + char plus_gender[16]; + char plus_birthdate[16]; + char plus_patient_name[81]; + char plus_patient_additional[81]; + char plus_startdate[16]; + char plus_admincode[81]; + char plus_technician[81]; + char plus_equipment[81]; + char plus_recording_additional[81]; + long long l_starttime; + int startdate_day; + int startdate_month; + int startdate_year; + int starttime_second; + int starttime_minute; + int starttime_hour; + char reserved[45]; + int hdrsize; + int edfsignals; + long long datarecords; + int recordsize; + int annot_ch[EDFLIB_MAXSIGNALS]; + int nr_annot_chns; + int mapped_signals[EDFLIB_MAXSIGNALS]; + int edf; + int edfplus; + int bdf; + int bdfplus; + int discontinuous; + int signal_write_sequence_pos; + long long starttime_offset; + double data_record_duration; + long long long_data_record_duration; + long long annots_in_file; + struct edfparamblock* edfparam; +}; + +struct edf_annotationblock +{ + long long onset; + char duration[16]; + char annotation[EDFLIB_MAX_ANNOTATION_LEN + 1]; + struct edf_annotationblock* former_annotation; + struct edf_annotationblock* next_annotation; +} * annotationslist[EDFLIB_MAXFILES]; + +struct edf_write_annotationblock +{ + long long onset; + long long duration; + char annotation[EDFLIB_WRITE_MAX_ANNOTATION_LEN + 1]; + struct edf_write_annotationblock* former_annotation; + struct edf_write_annotationblock* next_annotation; +} * write_annotationslist[EDFLIB_MAXFILES]; + +static int files_open = 0; + +static struct edfhdrblock* hdrlist[EDFLIB_MAXFILES]; + +struct edfhdrblock* CheckEdfFile(FILE* inputfile, int* edfError); +int IsIntegerNumber(char* str); +int IsNumber(char* str); +int IsDurationNumber(char* str); +int IsOnsetNumber(char* str); +long long GetLongDuration(const char* str); +int GetAnnotations(struct edfhdrblock* edfhdr, int hdl, int annotations); +long long GetLongTime(char* str); +int WriteEdfHeader(struct edfhdrblock* hdr); +void Latin1ToASCII(char* str, const int len); +void Latin12UTF8(char* latin, const int len); +void RemovePaddingTrailingSpaces(char* str); +int AtoiNonlocalized(const char* str); +double AtofNonlocalized(const char* str); +int SprintNumberNonlocalized(char* str, const double nr); +int SprintIntNumberNonlocalized(char* str, int q, int minimum, const int sign); +int SprintLLNumberNonlocalized(char* str, long long q, int minimum, const int sign); +int FprintIntNumberNonlocalized(FILE* file, int q, int minimum, const int sign); +int FprintLLNumberNonlocalized(FILE* file, long long q, int minimum, const int sign); + +int EdfopenFileReadonly(const char* path, struct edf_hdr_struct* edfhdr, const int readAnnotations) +{ + int i, error; + + struct edf_annotationblock* annot; + + if (readAnnotations < 0) + { + edfhdr->filetype = EDFLIB_INVALID_READ_ANNOTS_VALUE; + return -1; + } + + if (readAnnotations > 2) + { + edfhdr->filetype = EDFLIB_INVALID_READ_ANNOTS_VALUE; + return -1; + } + + memset(edfhdr, 0, sizeof(struct edf_hdr_struct)); + + if (files_open >= EDFLIB_MAXFILES) + { + edfhdr->filetype = EDFLIB_MAXFILES_REACHED; + + return -1; + } + + for (i = 0; i < EDFLIB_MAXFILES; ++i) + { + if (hdrlist[i] != NULL) + { + if (!(strcmp(path, hdrlist[i]->path))) + { + edfhdr->filetype = EDFLIB_FILE_ALREADY_OPENED; + return -1; + } + } + } + + FILE* file = fopeno(path, "rb"); + if (file == NULL) + { + edfhdr->filetype = EDFLIB_NO_SUCH_FILE_OR_DIRECTORY; + return -1; + } + + struct edfhdrblock* hdr = CheckEdfFile(file, &error); + if (hdr == NULL) + { + edfhdr->filetype = error; + fclose(file); + return -1; + } + + if (hdr->discontinuous) + { + edfhdr->filetype = EDFLIB_FILE_IS_DISCONTINUOUS; + free(hdr->edfparam); + free(hdr); + fclose(file); + return -1; + } + + hdr->writemode = 0; + + for (i = 0; i < EDFLIB_MAXFILES; ++i) + { + if (hdrlist[i] == NULL) + { + hdrlist[i] = hdr; + edfhdr->handle = i; + break; + } + } + + if ((hdr->edf) && (!(hdr->edfplus))) { edfhdr->filetype = EDFLIB_FILETYPE_EDF; } + if (hdr->edfplus) { edfhdr->filetype = EDFLIB_FILETYPE_EDFPLUS; } + if ((hdr->bdf) && (!(hdr->bdfplus))) { edfhdr->filetype = EDFLIB_FILETYPE_BDF; } + if (hdr->bdfplus) { edfhdr->filetype = EDFLIB_FILETYPE_BDFPLUS; } + + edfhdr->edfsignals = hdr->edfsignals - hdr->nr_annot_chns; + edfhdr->file_duration = hdr->long_data_record_duration * hdr->datarecords; + edfhdr->startdate_day = hdr->startdate_day; + edfhdr->startdate_month = hdr->startdate_month; + edfhdr->startdate_year = hdr->startdate_year; + edfhdr->starttime_hour = hdr->starttime_hour; + edfhdr->starttime_second = hdr->starttime_second; + edfhdr->starttime_minute = hdr->starttime_minute; + edfhdr->starttime_subsecond = hdr->starttime_offset; + edfhdr->datarecords_in_file = hdr->datarecords; + edfhdr->datarecord_duration = hdr->long_data_record_duration; + + if ((!(hdr->edfplus)) && (!(hdr->bdfplus))) + { + strcpy(edfhdr->patient, hdr->patient); + strcpy(edfhdr->recording, hdr->recording); + edfhdr->patientcode[0] = 0; + edfhdr->gender[0] = 0; + edfhdr->birthdate[0] = 0; + edfhdr->patient_name[0] = 0; + edfhdr->patient_additional[0] = 0; + edfhdr->admincode[0] = 0; + edfhdr->technician[0] = 0; + edfhdr->equipment[0] = 0; + edfhdr->recording_additional[0] = 0; + } + else + { + edfhdr->patient[0] = 0; + edfhdr->recording[0] = 0; + strcpy(edfhdr->patientcode, hdr->plus_patientcode); + strcpy(edfhdr->gender, hdr->plus_gender); + strcpy(edfhdr->birthdate, hdr->plus_birthdate); + strcpy(edfhdr->patient_name, hdr->plus_patient_name); + strcpy(edfhdr->patient_additional, hdr->plus_patient_additional); + strcpy(edfhdr->admincode, hdr->plus_admincode); + strcpy(edfhdr->technician, hdr->plus_technician); + strcpy(edfhdr->equipment, hdr->plus_equipment); + strcpy(edfhdr->recording_additional, hdr->plus_recording_additional); + + annotationslist[edfhdr->handle] = NULL; + + if ((readAnnotations == EDFLIB_READ_ANNOTATIONS) || (readAnnotations == EDFLIB_READ_ALL_ANNOTATIONS)) + { + if (GetAnnotations(hdr, edfhdr->handle, readAnnotations)) + { + edfhdr->filetype = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + + if (annotationslist[edfhdr->handle]) + { + annot = annotationslist[edfhdr->handle]; + + while (annot->next_annotation) + { + annot = annot->next_annotation; + free(annot->former_annotation); + } + + free(annot); + } + + fclose(file); + free(hdr->edfparam); + free(hdr); + return -1; + } + } + } + + if (annotationslist[edfhdr->handle]) + { + hdr->annots_in_file++; + annot = annotationslist[edfhdr->handle]; + + while (annot->next_annotation) + { + hdr->annots_in_file++; + annot = annot->next_annotation; + } + } + + edfhdr->annotations_in_file = hdr->annots_in_file; + strcpy(hdr->path, path); + files_open++; + int j = 0; + + for (i = 0; i < hdr->edfsignals; ++i) { if (!(hdr->edfparam[i].annotation)) { hdr->mapped_signals[j++] = i; } } + + for (i = 0; i < edfhdr->edfsignals; ++i) + { + const int channel = hdr->mapped_signals[i]; + + strcpy(edfhdr->signalparam[i].label, hdr->edfparam[channel].label); + strcpy(edfhdr->signalparam[i].transducer, hdr->edfparam[channel].transducer); + strcpy(edfhdr->signalparam[i].physdimension, hdr->edfparam[channel].physdimension); + strcpy(edfhdr->signalparam[i].prefilter, hdr->edfparam[channel].prefilter); + edfhdr->signalparam[i].smp_in_file = hdr->edfparam[channel].smp_per_record * hdr->datarecords; + edfhdr->signalparam[i].phys_max = hdr->edfparam[channel].phys_max; + edfhdr->signalparam[i].phys_min = hdr->edfparam[channel].phys_min; + edfhdr->signalparam[i].dig_max = hdr->edfparam[channel].dig_max; + edfhdr->signalparam[i].dig_min = hdr->edfparam[channel].dig_min; + edfhdr->signalparam[i].smp_in_datarecord = hdr->edfparam[channel].smp_per_record; + } + + return 0; +} + +int EdfcloseFile(const int handle) +{ + struct edf_write_annotationblock* annot2; + int i, n, p; + char str[EDFLIB_ANNOTATION_BYTES * 2]; + + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + + struct edfhdrblock* hdr = hdrlist[handle]; + + if (hdr->writemode) + { + if (hdr->datarecords == 0LL) + { + if (WriteEdfHeader(hdr)) { return -1; } + + annot2 = write_annotationslist[handle]; + + while (annot2) + { + p = FprintLLNumberNonlocalized(hdr->file_hdl, (hdr->datarecords * hdr->long_data_record_duration) / EDFLIB_TIME_DIMENSION, 0, 1); + + if (hdr->long_data_record_duration % EDFLIB_TIME_DIMENSION) + { + fputc('.', hdr->file_hdl); + p++; + p += FprintLLNumberNonlocalized(hdr->file_hdl, (hdr->datarecords * hdr->long_data_record_duration) % EDFLIB_TIME_DIMENSION, 7, 0); + } + fputc(20, hdr->file_hdl); + fputc(20, hdr->file_hdl); + p += 2; + for (; p < EDFLIB_ANNOTATION_BYTES; ++p) { fputc(0, hdr->file_hdl); } + + hdr->datarecords++; + annot2 = annot2->next_annotation; + } + } + + if (hdr->datarecords < 100000000LL) + { + fseeko(hdr->file_hdl, 236LL, SEEK_SET); + p = FprintIntNumberNonlocalized(hdr->file_hdl, (int)(hdr->datarecords), 0, 0); + if (p < 2) { fputc(' ', hdr->file_hdl); } + } + + annot2 = write_annotationslist[handle]; + long long datarecords = 0LL; + long long offset = (long long)((hdr->edfsignals + 2) * 256); + int datrecsize = EDFLIB_ANNOTATION_BYTES; + + for (i = 0; i < hdr->edfsignals; ++i) + { + if (hdr->edf) + { + offset += (long long)(hdr->edfparam[i].smp_per_record * 2); + datrecsize += (hdr->edfparam[i].smp_per_record * 2); + } + else + { + offset += (long long)(hdr->edfparam[i].smp_per_record * 3); + datrecsize += (hdr->edfparam[i].smp_per_record * 3); + } + } + + while (annot2 != NULL) + { + if (fseeko(hdr->file_hdl, offset, SEEK_SET)) { break; } + + p = SprintLLNumberNonlocalized(str, (datarecords * hdr->long_data_record_duration) / EDFLIB_TIME_DIMENSION, 0, 1); + + if (hdr->long_data_record_duration % EDFLIB_TIME_DIMENSION) + { + str[p++] = '.'; + n = SprintLLNumberNonlocalized(str + p, (datarecords * hdr->long_data_record_duration) % EDFLIB_TIME_DIMENSION, 7, 0); + p += n; + } + str[p++] = 20; + str[p++] = 20; + str[p++] = 0; + + n = SprintLLNumberNonlocalized(str + p, annot2->onset / 10000LL, 0, 1); + p += n; + if (annot2->onset % 10000LL) + { + str[p++] = '.'; + n = SprintLLNumberNonlocalized(str + p, annot2->onset % 10000LL, 4, 0); + p += n; + } + if (annot2->duration >= 0LL) + { + str[p++] = 21; + n = SprintLLNumberNonlocalized(str + p, annot2->duration / 10000LL, 0, 0); + p += n; + if (annot2->duration % 10000LL) + { + str[p++] = '.'; + n = SprintLLNumberNonlocalized(str + p, annot2->duration % 10000LL, 4, 0); + p += n; + } + } + str[p++] = 20; + for (i = 0; i < EDFLIB_WRITE_MAX_ANNOTATION_LEN; ++i) + { + if (annot2->annotation[i] == 0) { break; } + str[p++] = annot2->annotation[i]; + } + str[p++] = 20; + + for (; p < EDFLIB_ANNOTATION_BYTES; ++p) { str[p] = 0; } + + fwrite(str, EDFLIB_ANNOTATION_BYTES, 1, hdr->file_hdl); + offset += datrecsize; + datarecords++; + + if (datarecords >= hdr->datarecords) { break; } + annot2 = annot2->next_annotation; + } + + fclose(hdr->file_hdl); + + if (write_annotationslist[handle] != NULL) + { + annot2 = write_annotationslist[handle]; + + while (annot2->next_annotation) + { + annot2 = annot2->next_annotation; + free(annot2->former_annotation); + } + + free(annot2); + } + + free(hdr->edfparam); + free(hdr); + hdrlist[handle] = NULL; + files_open--; + return 0; + } + if (annotationslist[handle] != NULL) + { + struct edf_annotationblock* annot = annotationslist[handle]; + + while (annot->next_annotation) + { + annot = annot->next_annotation; + free(annot->former_annotation); + } + free(annot); + } + + fclose(hdr->file_hdl); + free(hdr->edfparam); + free(hdr); + hdrlist[handle] = NULL; + files_open--; + return 0; +} + +long long edfseek(const int handle, const int edfsignal, const long long offset, const int whence) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (edfsignal < 0) { return -1; } + if (hdrlist[handle]->writemode) { return -1; } + if (edfsignal >= (hdrlist[handle]->edfsignals - hdrlist[handle]->nr_annot_chns)) { return -1; } + + const int channel = hdrlist[handle]->mapped_signals[edfsignal]; + const long long smp_in_file = hdrlist[handle]->edfparam[channel].smp_per_record * hdrlist[handle]->datarecords; + + if (whence == EDFSEEK_SET) { hdrlist[handle]->edfparam[channel].sample_pntr = offset; } + if (whence == EDFSEEK_CUR) { hdrlist[handle]->edfparam[channel].sample_pntr += offset; } + if (whence == EDFSEEK_END) + { + hdrlist[handle]->edfparam[channel].sample_pntr = (hdrlist[handle]->edfparam[channel].smp_per_record * hdrlist[handle]->datarecords) + offset; + } + if (hdrlist[handle]->edfparam[channel].sample_pntr > smp_in_file) { hdrlist[handle]->edfparam[channel].sample_pntr = smp_in_file; } + if (hdrlist[handle]->edfparam[channel].sample_pntr < 0LL) { hdrlist[handle]->edfparam[channel].sample_pntr = 0LL; } + return hdrlist[handle]->edfparam[channel].sample_pntr; +} + +long long edftell(const int handle, const int edfsignal) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (edfsignal < 0) { return -1; } + if (hdrlist[handle]->writemode) { return -1; } + if (edfsignal >= (hdrlist[handle]->edfsignals - hdrlist[handle]->nr_annot_chns)) { return -1; } + const int channel = hdrlist[handle]->mapped_signals[edfsignal]; + return hdrlist[handle]->edfparam[channel].sample_pntr; +} + +void edfrewind(const int handle, const int edfsignal) +{ + if (handle < 0) { return; } + if (handle >= EDFLIB_MAXFILES) { return; } + if (hdrlist[handle] == NULL) { return; } + if (edfsignal < 0) { return; } + if (hdrlist[handle]->writemode) { return; } + if (edfsignal >= (hdrlist[handle]->edfsignals - hdrlist[handle]->nr_annot_chns)) { return; } + const int channel = hdrlist[handle]->mapped_signals[edfsignal]; + hdrlist[handle]->edfparam[channel].sample_pntr = 0LL; +} + +int EdfreadPhysicalSamples(const int handle, const int edfsignal, int n, double* buf) +{ + int nBytes = 2, tmp, i; + + union + { + unsigned int one; + signed int one_signed; + unsigned short two[2]; + signed short two_signed[2]; + unsigned char four[4]; + } var; + + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (edfsignal < 0) { return -1; } + if (hdrlist[handle]->writemode) { return -1; } + if (edfsignal >= (hdrlist[handle]->edfsignals - hdrlist[handle]->nr_annot_chns)) { return -1; } + + const int channel = hdrlist[handle]->mapped_signals[edfsignal]; + + if (n < 0LL) { return -1; } + if (n == 0LL) { return 0LL; } + + struct edfhdrblock* hdr = hdrlist[handle]; + + if (hdr->edf) { nBytes = 2; } + if (hdr->bdf) { nBytes = 3; } + + const long long smpInFile = hdr->edfparam[channel].smp_per_record * hdr->datarecords; + + if ((hdr->edfparam[channel].sample_pntr + n) > smpInFile) + { + n = (int)(smpInFile - hdr->edfparam[channel].sample_pntr); + + if (n == 0) { return 0LL; } + if (n < 0) { return -1; } + } + + FILE* file = hdr->file_hdl; + + long long offset = hdr->hdrsize; + offset += (hdr->edfparam[channel].sample_pntr / hdr->edfparam[channel].smp_per_record) * hdr->recordsize; + offset += hdr->edfparam[channel].buf_offset; + offset += ((hdr->edfparam[channel].sample_pntr % hdr->edfparam[channel].smp_per_record) * nBytes); + + fseeko(file, offset, SEEK_SET); + + long long samplePntr = hdr->edfparam[channel].sample_pntr; + const long long nSmp = hdr->edfparam[channel].smp_per_record; + const long long jump = hdr->recordsize - (nSmp * nBytes); + const double physBitvalue = hdr->edfparam[channel].bitvalue; + const int physOffset = hdr->edfparam[channel].offset; + + if (hdr->edf) + { + for (i = 0; i < n; ++i) + { + if (!(samplePntr % nSmp)) { if (i) { fseeko(file, jump, SEEK_CUR); } } + + var.four[0] = fgetc(file); + tmp = fgetc(file); + if (tmp == EOF) { return -1; } + var.four[1] = tmp; + var.two_signed[0] += (short)physOffset; + buf[i] = physBitvalue * (double)var.two_signed[0]; + samplePntr++; + } + } + + if (hdr->bdf) + { + for (i = 0; i < n; ++i) + { + if (!(samplePntr % nSmp)) { if (i) { fseeko(file, jump, SEEK_CUR); } } + + var.four[0] = fgetc(file); + var.four[1] = fgetc(file); + tmp = fgetc(file); + if (tmp == EOF) { return -1; } + var.four[2] = tmp; + + if (var.four[2] & 0x80) { var.four[3] = 0xff; } + else { var.four[3] = 0x00; } + + var.one_signed += physOffset; + buf[i] = physBitvalue * (double)var.one_signed; + } + } + + hdr->edfparam[channel].sample_pntr = samplePntr; + return n; +} + +int EdfreadDigitalSamples(const int handle, const int edfsignal, int n, int* buf) +{ + int nBytes = 2, tmp, i; + + union + { + unsigned int one; + signed int one_signed; + unsigned short two[2]; + signed short two_signed[2]; + unsigned char four[4]; + } var; + + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (edfsignal < 0) { return -1; } + if (hdrlist[handle]->writemode) { return -1; } + if (edfsignal >= (hdrlist[handle]->edfsignals - hdrlist[handle]->nr_annot_chns)) { return -1; } + if (n < 0LL) { return -1; } + if (n == 0LL) { return 0LL; } + + const int channel = hdrlist[handle]->mapped_signals[edfsignal]; + + + struct edfhdrblock* hdr = hdrlist[handle]; + + if (hdr->edf) { nBytes = 2; } + if (hdr->bdf) { nBytes = 3; } + + const long long nSmp = hdr->edfparam[channel].smp_per_record * hdr->datarecords; + + if ((hdr->edfparam[channel].sample_pntr + n) > nSmp) + { + n = (int)(nSmp - hdr->edfparam[channel].sample_pntr); + + if (n == 0) { return 0LL; } + if (n < 0) { return -1; } + } + + FILE* file = hdr->file_hdl; + + long long offset = hdr->hdrsize; + offset += (hdr->edfparam[channel].sample_pntr / hdr->edfparam[channel].smp_per_record) * hdr->recordsize; + offset += hdr->edfparam[channel].buf_offset; + offset += ((hdr->edfparam[channel].sample_pntr % hdr->edfparam[channel].smp_per_record) * nBytes); + + fseeko(file, offset, SEEK_SET); + + long long samplePntr = hdr->edfparam[channel].sample_pntr; + const long long smpPerRecord = hdr->edfparam[channel].smp_per_record; + const long long jump = hdr->recordsize - (smpPerRecord * nBytes); + + if (hdr->edf) + { + for (i = 0; i < n; ++i) + { + if (!(samplePntr % smpPerRecord)) { if (i) { fseeko(file, jump, SEEK_CUR); } } + + var.four[0] = fgetc(file); + tmp = fgetc(file); + if (tmp == EOF) { return -1; } + var.four[1] = tmp; + buf[i] = var.two_signed[0]; + samplePntr++; + } + } + + if (hdr->bdf) + { + for (i = 0; i < n; ++i) + { + if (!(samplePntr % smpPerRecord)) { if (i) { fseeko(file, jump, SEEK_CUR); } } + + var.four[0] = fgetc(file); + var.four[1] = fgetc(file); + tmp = fgetc(file); + if (tmp == EOF) { return -1; } + var.four[2] = tmp; + + if (var.four[2] & 0x80) { var.four[3] = 0xff; } + else { var.four[3] = 0x00; } + + buf[i] = var.one_signed; + samplePntr++; + } + } + hdr->edfparam[channel].sample_pntr = samplePntr; + return n; +} + +int EdfGetAnnotation(const int handle, const int n, struct edf_annotation_struct* annot) +{ + memset(annot, 0, sizeof(struct edf_annotation_struct)); + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (hdrlist[handle]->writemode) { return -1; } + if (n < 0) { return -1; } + if (n >= hdrlist[handle]->annots_in_file) { return -1; } + struct edf_annotationblock* listAnnot = annotationslist[handle]; + if (listAnnot == NULL) { return -1; } + + for (int i = 0; i < n; ++i) + { + if (listAnnot->next_annotation == NULL) { return -1; } + listAnnot = listAnnot->next_annotation; + } + + annot->onset = listAnnot->onset; + strcpy(annot->duration, listAnnot->duration); + strcpy(annot->annotation, listAnnot->annotation); + + return 0; +} + +struct edfhdrblock* CheckEdfFile(FILE* inputfile, int* edfError) +{ + int i, j, p, r = 0, n, dotposition, error; + char *edfHdr, scratchpad[128], scratchpad2[64]; + struct edfhdrblock* edfhdr; + + /***************** check header ******************************/ + + edfHdr = (char*)calloc(1, 256); + if (edfHdr == NULL) + { + *edfError = EDFLIB_MALLOC_ERROR; + return NULL; + } + + edfhdr = (struct edfhdrblock*)calloc(1, sizeof(struct edfhdrblock)); + if (edfhdr == NULL) + { + free(edfHdr); + *edfError = EDFLIB_MALLOC_ERROR; + return NULL; + } + + rewind(inputfile); + if (fread(edfHdr, 256, 1, inputfile) != 1) + { + *edfError = EDFLIB_FILE_READ_ERROR; + free(edfHdr); + free(edfhdr); + return NULL; + } + + /**************************** VERSION ***************************************/ + + strncpy(scratchpad, edfHdr, 8); + scratchpad[8] = 0; + + if (scratchpad[0] == -1) /* BDF-file */ + { + for (i = 1; i < 8; ++i) + { + if ((scratchpad[i] < 32) || (scratchpad[i] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + } + + if (strcmp(scratchpad + 1, "BIOSEMI") != 0) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + + edfhdr->bdf = 1; + } + else /* EDF-file */ + { + for (i = 0; i < 8; ++i) + { + if ((scratchpad[i] < 32) || (scratchpad[i] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + } + + if (strcmp(scratchpad, "0 ") != 0) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + + edfhdr->edf = 1; + } + + strncpy(edfhdr->version, edfHdr, 8); + edfhdr->version[8] = 0; + if (edfhdr->bdf) { edfhdr->version[0] = '.'; } + + /********************* PATIENTNAME *********************************************/ + + strncpy(scratchpad, edfHdr + 8, 80); + scratchpad[80] = 0; + for (i = 0; i < 80; ++i) + { + if ((((unsigned char*)scratchpad)[i] < 32) || (((unsigned char*)scratchpad)[i] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + } + + strncpy(edfhdr->patient, edfHdr + 8, 80); + edfhdr->patient[80] = 0; + + /********************* RECORDING *********************************************/ + + strncpy(scratchpad, edfHdr + 88, 80); + scratchpad[80] = 0; + for (i = 0; i < 80; ++i) + { + if ((((unsigned char*)scratchpad)[i] < 32) || (((unsigned char*)scratchpad)[i] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + } + + strncpy(edfhdr->recording, edfHdr + 88, 80); + edfhdr->recording[80] = 0; + + /********************* STARTDATE *********************************************/ + + strncpy(scratchpad, edfHdr + 168, 8); + scratchpad[8] = 0; + for (i = 0; i < 8; ++i) + { + if ((scratchpad[i] < 32) || (scratchpad[i] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + } + + error = 0; + + if ((edfHdr[170] != '.') || (edfHdr[173] != '.')) { error = 1; } + if ((edfHdr[168] < 48) || (edfHdr[168] > 57)) { error = 1; } + if ((edfHdr[169] < 48) || (edfHdr[169] > 57)) { error = 1; } + if ((edfHdr[171] < 48) || (edfHdr[171] > 57)) { error = 1; } + if ((edfHdr[172] < 48) || (edfHdr[172] > 57)) { error = 1; } + if ((edfHdr[174] < 48) || (edfHdr[174] > 57)) { error = 1; } + if ((edfHdr[175] < 48) || (edfHdr[175] > 57)) { error = 1; } + strncpy(scratchpad, edfHdr + 168, 8); + + if (error) + { + scratchpad[8] = 0; + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + + scratchpad[2] = 0; + scratchpad[5] = 0; + scratchpad[8] = 0; + + if ((AtofNonlocalized(scratchpad) < 1) || (AtofNonlocalized(scratchpad) > 31)) + { + strncpy(scratchpad, edfHdr + 168, 8); + scratchpad[8] = 0; + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + + if ((AtofNonlocalized(scratchpad + 3) < 1) || (AtofNonlocalized(scratchpad + 3) > 12)) + { + strncpy(scratchpad, edfHdr + 168, 8); + scratchpad[8] = 0; + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + + edfhdr->startdate_day = (int)AtofNonlocalized(scratchpad); + edfhdr->startdate_month = (int)AtofNonlocalized(scratchpad + 3); + edfhdr->startdate_year = (int)AtofNonlocalized(scratchpad + 6); + if (edfhdr->startdate_year > 84) { edfhdr->startdate_year += 1900; } + else { edfhdr->startdate_year += 2000; } + + /********************* STARTTIME *********************************************/ + + strncpy(scratchpad, edfHdr + 176, 8); + scratchpad[8] = 0; + for (i = 0; i < 8; ++i) + { + if ((scratchpad[i] < 32) || (scratchpad[i] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + } + + error = 0; + + if ((edfHdr[178] != '.') || (edfHdr[181] != '.')) { error = 1; } + if ((edfHdr[176] < 48) || (edfHdr[176] > 57)) { error = 1; } + if ((edfHdr[177] < 48) || (edfHdr[177] > 57)) { error = 1; } + if ((edfHdr[179] < 48) || (edfHdr[179] > 57)) { error = 1; } + if ((edfHdr[180] < 48) || (edfHdr[180] > 57)) { error = 1; } + if ((edfHdr[182] < 48) || (edfHdr[182] > 57)) { error = 1; } + if ((edfHdr[183] < 48) || (edfHdr[183] > 57)) { error = 1; } + + strncpy(scratchpad, edfHdr + 176, 8); + + if (error) + { + strncpy(scratchpad, edfHdr + 176, 8); + scratchpad[8] = 0; + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + + scratchpad[2] = 0; + scratchpad[5] = 0; + scratchpad[8] = 0; + + if (AtofNonlocalized(scratchpad) > 23) + { + strncpy(scratchpad, edfHdr + 176, 8); + scratchpad[8] = 0; + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + + if (AtofNonlocalized(scratchpad + 3) > 59) + { + strncpy(scratchpad, edfHdr + 176, 8); + scratchpad[8] = 0; + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + + if (AtofNonlocalized(scratchpad + 6) > 59) + { + strncpy(scratchpad, edfHdr + 176, 8); + scratchpad[8] = 0; + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + + edfhdr->starttime_hour = (int)AtofNonlocalized(scratchpad); + edfhdr->starttime_minute = (int)AtofNonlocalized(scratchpad + 3); + edfhdr->starttime_second = (int)AtofNonlocalized(scratchpad + 6); + + edfhdr->l_starttime = (long long)(3600 * AtofNonlocalized(scratchpad)); + edfhdr->l_starttime += (long long)(60 * AtofNonlocalized(scratchpad + 3)); + edfhdr->l_starttime += (long long)AtofNonlocalized(scratchpad + 6); + + edfhdr->l_starttime *= EDFLIB_TIME_DIMENSION; + + /***************** NUMBER OF SIGNALS IN HEADER *******************************/ + + strncpy(scratchpad, edfHdr + 252, 4); + scratchpad[4] = 0; + for (i = 0; i < 4; ++i) + { + if ((scratchpad[i] < 32) || (scratchpad[i] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + } + + if (IsIntegerNumber(scratchpad)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + edfhdr->edfsignals = (int)AtofNonlocalized(scratchpad); + if (edfhdr->edfsignals < 1) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + + if (edfhdr->edfsignals > EDFLIB_MAXSIGNALS) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + + /***************** NUMBER OF BYTES IN HEADER *******************************/ + + strncpy(scratchpad, edfHdr + 184, 8); + scratchpad[8] = 0; + + for (i = 0; i < 8; ++i) + { + if ((scratchpad[i] < 32) || (scratchpad[i] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + } + + if (IsIntegerNumber(scratchpad)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + + n = (int)AtofNonlocalized(scratchpad); + if ((edfhdr->edfsignals * 256 + 256) != n) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + + /********************* RESERVED FIELD *************************************/ + + edfhdr->edfplus = 0; + edfhdr->discontinuous = 0; + strncpy(scratchpad, edfHdr + 192, 44); + scratchpad[44] = 0; + + for (i = 0; i < 44; ++i) + { + if ((scratchpad[i] < 32) || (scratchpad[i] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + } + + if (edfhdr->edf) + { + if (!strncmp(scratchpad, "EDF+C", 5)) { edfhdr->edfplus = 1; } + + if (!strncmp(scratchpad, "EDF+D", 5)) + { + edfhdr->edfplus = 1; + edfhdr->discontinuous = 1; + } + } + + if (edfhdr->bdf) + { + if (!strncmp(scratchpad, "BDF+C", 5)) { edfhdr->bdfplus = 1; } + + if (!strncmp(scratchpad, "BDF+D", 5)) + { + edfhdr->bdfplus = 1; + edfhdr->discontinuous = 1; + } + } + + strncpy(edfhdr->reserved, edfHdr + 192, 44); + edfhdr->reserved[44] = 0; + + /********************* NUMBER OF DATARECORDS *************************************/ + + strncpy(scratchpad, edfHdr + 236, 8); + scratchpad[8] = 0; + + for (i = 0; i < 8; ++i) + { + if ((scratchpad[i] < 32) || (scratchpad[i] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + } + + if (IsIntegerNumber(scratchpad)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + + edfhdr->datarecords = (long long)AtofNonlocalized(scratchpad); + if (edfhdr->datarecords < 1) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + + /********************* DATARECORD DURATION *************************************/ + + strncpy(scratchpad, edfHdr + 244, 8); + scratchpad[8] = 0; + + for (i = 0; i < 8; ++i) + { + if ((scratchpad[i] < 32) || (scratchpad[i] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + } + + if (IsNumber(scratchpad)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + + edfhdr->data_record_duration = AtofNonlocalized(scratchpad); + if (edfhdr->data_record_duration < -0.000001) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr); + return NULL; + } + + edfhdr->long_data_record_duration = GetLongDuration(scratchpad); + + free(edfHdr); + + /********************* START WITH THE SIGNALS IN THE HEADER *********************/ + + edfHdr = (char*)calloc(1, (edfhdr->edfsignals + 1) * 256); + if (edfHdr == NULL) + { + *edfError = EDFLIB_MALLOC_ERROR; + free(edfhdr); + return NULL; + } + + rewind(inputfile); + if (fread(edfHdr, (edfhdr->edfsignals + 1) * 256, 1, inputfile) != 1) + { + *edfError = EDFLIB_FILE_READ_ERROR; + free(edfHdr); + free(edfhdr); + return NULL; + } + + edfhdr->edfparam = (struct edfparamblock*)calloc(1, sizeof(struct edfparamblock) * edfhdr->edfsignals); + if (edfhdr->edfparam == NULL) + { + *edfError = EDFLIB_MALLOC_ERROR; + free(edfHdr); + free(edfhdr); + return NULL; + } + + /**************************** LABELS *************************************/ + + edfhdr->nr_annot_chns = 0; + for (i = 0; i < edfhdr->edfsignals; ++i) + { + strncpy(scratchpad, edfHdr + 256 + (i * 16), 16); + for (j = 0; j < 16; ++j) + { + if ((scratchpad[j] < 32) || (scratchpad[j] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + if (edfhdr->edfplus) + { + if (!strncmp(scratchpad, "EDF Annotations ", 16)) + { + edfhdr->annot_ch[edfhdr->nr_annot_chns] = i; + edfhdr->nr_annot_chns++; + edfhdr->edfparam[i].annotation = 1; + } + } + if (edfhdr->bdfplus) + { + if (!strncmp(scratchpad, "BDF Annotations ", 16)) + { + edfhdr->annot_ch[edfhdr->nr_annot_chns] = i; + edfhdr->nr_annot_chns++; + edfhdr->edfparam[i].annotation = 1; + } + } + strncpy(edfhdr->edfparam[i].label, edfHdr + 256 + (i * 16), 16); + edfhdr->edfparam[i].label[16] = 0; + } + if (edfhdr->edfplus && (!edfhdr->nr_annot_chns)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + if (edfhdr->bdfplus && (!edfhdr->nr_annot_chns)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + if ((edfhdr->edfsignals != edfhdr->nr_annot_chns) || ((!edfhdr->edfplus) && (!edfhdr->bdfplus))) + { + if (edfhdr->data_record_duration < 0.0000001) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + + /**************************** TRANSDUCER TYPES *************************************/ + + for (i = 0; i < edfhdr->edfsignals; ++i) + { + strncpy(scratchpad, edfHdr + 256 + (edfhdr->edfsignals * 16) + (i * 80), 80); + for (j = 0; j < 80; ++j) + { + if ((scratchpad[j] < 32) || (scratchpad[j] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + strncpy(edfhdr->edfparam[i].transducer, edfHdr + 256 + (edfhdr->edfsignals * 16) + (i * 80), 80); + edfhdr->edfparam[i].transducer[80] = 0; + + if ((edfhdr->edfplus) || (edfhdr->bdfplus)) + { + if (edfhdr->edfparam[i].annotation) + { + for (j = 0; j < 80; ++j) + { + if (edfhdr->edfparam[i].transducer[j] != ' ') + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + } + } + } + + /**************************** PHYSICAL DIMENSIONS *************************************/ + + for (i = 0; i < edfhdr->edfsignals; ++i) + { + strncpy(scratchpad, edfHdr + 256 + (edfhdr->edfsignals * 96) + (i * 8), 8); + for (j = 0; j < 8; ++j) + { + if ((scratchpad[j] < 32) || (scratchpad[j] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + strncpy(edfhdr->edfparam[i].physdimension, edfHdr + 256 + (edfhdr->edfsignals * 96) + (i * 8), 8); + edfhdr->edfparam[i].physdimension[8] = 0; + } + + /**************************** PHYSICAL MINIMUMS *************************************/ + + for (i = 0; i < edfhdr->edfsignals; ++i) + { + strncpy(scratchpad, edfHdr + 256 + (edfhdr->edfsignals * 104) + (i * 8), 8); + scratchpad[8] = 0; + + for (j = 0; j < 8; ++j) + { + if ((scratchpad[j] < 32) || (scratchpad[j] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + + if (IsNumber(scratchpad)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + + edfhdr->edfparam[i].phys_min = AtofNonlocalized(scratchpad); + } + + /**************************** PHYSICAL MAXIMUMS *************************************/ + + for (i = 0; i < edfhdr->edfsignals; ++i) + { + strncpy(scratchpad, edfHdr + 256 + (edfhdr->edfsignals * 112) + (i * 8), 8); + scratchpad[8] = 0; + + for (j = 0; j < 8; ++j) + { + if ((scratchpad[j] < 32) || (scratchpad[j] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + + if (IsNumber(scratchpad)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + + edfhdr->edfparam[i].phys_max = AtofNonlocalized(scratchpad); + if (edfhdr->edfparam[i].phys_max == edfhdr->edfparam[i].phys_min) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + + /**************************** DIGITAL MINIMUMS *************************************/ + + for (i = 0; i < edfhdr->edfsignals; ++i) + { + strncpy(scratchpad, edfHdr + 256 + (edfhdr->edfsignals * 120) + (i * 8), 8); + scratchpad[8] = 0; + + for (j = 0; j < 8; ++j) + { + if ((scratchpad[j] < 32) || (scratchpad[j] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + + if (IsIntegerNumber(scratchpad)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + + n = (int)AtofNonlocalized(scratchpad); + if (edfhdr->edfplus) + { + if (edfhdr->edfparam[i].annotation) + { + if (n != -32768) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + } + if (edfhdr->bdfplus) + { + if (edfhdr->edfparam[i].annotation) + { + if (n != -8388608) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + } + if (edfhdr->edf) + { + if ((n > 32767) || (n < -32768)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + if (edfhdr->bdf) + { + if ((n > 8388607) || (n < -8388608)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + edfhdr->edfparam[i].dig_min = n; + } + + /**************************** DIGITAL MAXIMUMS *************************************/ + + for (i = 0; i < edfhdr->edfsignals; ++i) + { + strncpy(scratchpad, edfHdr + 256 + (edfhdr->edfsignals * 128) + (i * 8), 8); + scratchpad[8] = 0; + + for (j = 0; j < 8; ++j) + { + if ((scratchpad[j] < 32) || (scratchpad[j] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + + if (IsIntegerNumber(scratchpad)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + + n = (int)AtofNonlocalized(scratchpad); + if (edfhdr->edfplus) + { + if (edfhdr->edfparam[i].annotation) + { + if (n != 32767) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + } + if (edfhdr->bdfplus) + { + if (edfhdr->edfparam[i].annotation) + { + if (n != 8388607) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + } + if (edfhdr->edf) + { + if ((n > 32767) || (n < -32768)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + else + { + if ((n > 8388607) || (n < -8388608)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + edfhdr->edfparam[i].dig_max = n; + if (edfhdr->edfparam[i].dig_max < (edfhdr->edfparam[i].dig_min + 1)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + + /**************************** PREFILTER FIELDS *************************************/ + + for (i = 0; i < edfhdr->edfsignals; ++i) + { + strncpy(scratchpad, edfHdr + 256 + (edfhdr->edfsignals * 136) + (i * 80), 80); + for (j = 0; j < 80; ++j) + { + if ((scratchpad[j] < 32) || (scratchpad[j] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + strncpy(edfhdr->edfparam[i].prefilter, edfHdr + 256 + (edfhdr->edfsignals * 136) + (i * 80), 80); + edfhdr->edfparam[i].prefilter[80] = 0; + + if ((edfhdr->edfplus) || (edfhdr->bdfplus)) + { + if (edfhdr->edfparam[i].annotation) + { + for (j = 0; j < 80; ++j) + { + if (edfhdr->edfparam[i].prefilter[j] != ' ') + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + } + } + } + + /*********************** NR OF SAMPLES IN EACH DATARECORD ********************/ + + edfhdr->recordsize = 0; + + for (i = 0; i < edfhdr->edfsignals; ++i) + { + strncpy(scratchpad, edfHdr + 256 + (edfhdr->edfsignals * 216) + (i * 8), 8); + scratchpad[8] = 0; + + for (j = 0; j < 8; ++j) + { + if ((scratchpad[j] < 32) || (scratchpad[j] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + + if (IsIntegerNumber(scratchpad)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + + n = (int)AtofNonlocalized(scratchpad); + if (n < 1) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + edfhdr->edfparam[i].smp_per_record = n; + edfhdr->recordsize += n; + } + + if (edfhdr->bdf) + { + edfhdr->recordsize *= 3; + + if (edfhdr->recordsize > 15728640) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + else + { + edfhdr->recordsize *= 2; + + if (edfhdr->recordsize > 10485760) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + + /**************************** RESERVED FIELDS *************************************/ + + for (i = 0; i < edfhdr->edfsignals; ++i) + { + strncpy(scratchpad, edfHdr + 256 + (edfhdr->edfsignals * 224) + (i * 32), 32); + for (j = 0; j < 32; ++j) + { + if ((scratchpad[j] < 32) || (scratchpad[j] > 126)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + strncpy(edfhdr->edfparam[i].reserved, edfHdr + 256 + (edfhdr->edfsignals * 224) + (i * 32), 32); + edfhdr->edfparam[i].reserved[32] = 0; + } + + /********************* EDF+ PATIENTNAME *********************************************/ + + if (edfhdr->edfplus || edfhdr->bdfplus) + { + error = 0; + dotposition = 0; + strncpy(scratchpad, edfHdr + 8, 80); + scratchpad[80] = 0; + for (i = 0; i < 80; ++i) + { + if (scratchpad[i] == ' ') + { + dotposition = i; + break; + } + } + dotposition++; + if ((dotposition > 73) || (dotposition < 2)) { error = 1; } + if (scratchpad[dotposition + 2] != 'X') { if (dotposition > 65) { error = 1; } } + if ((scratchpad[dotposition] != 'M') && (scratchpad[dotposition] != 'F') && (scratchpad[dotposition] != 'X')) { error = 1; } + dotposition++; + if (scratchpad[dotposition] != ' ') { error = 1; } + if (scratchpad[dotposition + 1] == 'X') + { + if (scratchpad[dotposition + 2] != ' ') { error = 1; } + if (scratchpad[dotposition + 3] == ' ') { error = 1; } + } + else + { + if (scratchpad[dotposition + 12] != ' ') { error = 1; } + if (scratchpad[dotposition + 13] == ' ') { error = 1; } + dotposition++; + strncpy(scratchpad2, scratchpad + dotposition, 11); + scratchpad2[11] = 0; + if ((scratchpad2[2] != '-') || (scratchpad2[6] != '-')) { error = 1; } + scratchpad2[2] = 0; + scratchpad2[6] = 0; + if ((scratchpad2[0] < 48) || (scratchpad2[0] > 57)) { error = 1; } + if ((scratchpad2[1] < 48) || (scratchpad2[1] > 57)) { error = 1; } + if ((scratchpad2[7] < 48) || (scratchpad2[7] > 57)) { error = 1; } + if ((scratchpad2[8] < 48) || (scratchpad2[8] > 57)) { error = 1; } + if ((scratchpad2[9] < 48) || (scratchpad2[9] > 57)) { error = 1; } + if ((scratchpad2[10] < 48) || (scratchpad2[10] > 57)) { error = 1; } + if ((AtofNonlocalized(scratchpad2) < 1) || (AtofNonlocalized(scratchpad2) > 31)) { error = 1; } + if (strcmp(scratchpad2 + 3, "JAN") != 0 && strcmp(scratchpad2 + 3, "FEB") != 0 && strcmp(scratchpad2 + 3, "MAR") != 0 + && strcmp(scratchpad2 + 3, "APR") != 0 && strcmp(scratchpad2 + 3, "MAY") != 0 && strcmp(scratchpad2 + 3, "JUN") != 0 + && strcmp(scratchpad2 + 3, "JUL") != 0 && strcmp(scratchpad2 + 3, "AUG") != 0 && strcmp(scratchpad2 + 3, "SEP") != 0 + && strcmp(scratchpad2 + 3, "OCT") != 0 && strcmp(scratchpad2 + 3, "NOV") != 0 && strcmp(scratchpad2 + 3, "DEC") != 0) { error = 1; } + } + + if (error) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + + p = 0; + if (edfhdr->patient[p] == 'X') + { + edfhdr->plus_patientcode[0] = 0; + p += 2; + } + else + { + for (i = 0; i < (80 - p); ++i) + { + if (edfhdr->patient[i + p] == ' ') { break; } + edfhdr->plus_patientcode[i] = edfhdr->patient[i + p]; + if (edfhdr->plus_patientcode[i] == '_') { edfhdr->plus_patientcode[i] = ' '; } + } + edfhdr->plus_patientcode[i] = 0; + p += i + 1; + } + + if (edfhdr->patient[p] == 'M') { strcpy(edfhdr->plus_gender, "Male"); } + if (edfhdr->patient[p] == 'F') { strcpy(edfhdr->plus_gender, "Female"); } + if (edfhdr->patient[p] == 'X') { edfhdr->plus_gender[0] = 0; } + for (i = 0; i < (80 - p); ++i) { if (edfhdr->patient[i + p] == ' ') { break; } } + p += i + 1; + + if (edfhdr->patient[p] == 'X') + { + edfhdr->plus_birthdate[0] = 0; + p += 2; + } + else + { + for (i = 0; i < (80 - p); ++i) + { + if (edfhdr->patient[i + p] == ' ') { break; } + edfhdr->plus_birthdate[i] = edfhdr->patient[i + p]; + } + edfhdr->plus_birthdate[2] = ' '; + edfhdr->plus_birthdate[3] += 32; + edfhdr->plus_birthdate[4] += 32; + edfhdr->plus_birthdate[5] += 32; + edfhdr->plus_birthdate[6] = ' '; + edfhdr->plus_birthdate[11] = 0; + p += i + 1; + } + + for (i = 0; i < (80 - p); ++i) + { + if (edfhdr->patient[i + p] == ' ') { break; } + edfhdr->plus_patient_name[i] = edfhdr->patient[i + p]; + if (edfhdr->plus_patient_name[i] == '_') { edfhdr->plus_patient_name[i] = ' '; } + } + edfhdr->plus_patient_name[i] = 0; + p += i + 1; + + for (i = 0; i < (80 - p); ++i) { edfhdr->plus_patient_additional[i] = edfhdr->patient[i + p]; } + edfhdr->plus_patient_additional[i] = 0; + //p += i + 1; + } + + /********************* EDF+ RECORDINGFIELD *********************************************/ + + if (edfhdr->edfplus || edfhdr->bdfplus) + { + error = 0; + strncpy(scratchpad, edfHdr + 88, 80); + scratchpad[80] = 0; + if (strncmp(scratchpad, "Startdate ", 10) != 0) { error = 1; } + if (scratchpad[10] == 'X') + { + if (scratchpad[11] != ' ') { error = 1; } + if (scratchpad[12] == ' ') { error = 1; } + p = 12; + } + else + { + if (scratchpad[21] != ' ') { error = 1; } + if (scratchpad[22] == ' ') { error = 1; } + p = 22; + strncpy(scratchpad2, scratchpad + 10, 11); + scratchpad2[11] = 0; + if ((scratchpad2[2] != '-') || (scratchpad2[6] != '-')) { error = 1; } + scratchpad2[2] = 0; + scratchpad2[6] = 0; + if ((scratchpad2[0] < 48) || (scratchpad2[0] > 57)) { error = 1; } + if ((scratchpad2[1] < 48) || (scratchpad2[1] > 57)) { error = 1; } + if ((scratchpad2[7] < 48) || (scratchpad2[7] > 57)) { error = 1; } + if ((scratchpad2[8] < 48) || (scratchpad2[8] > 57)) { error = 1; } + if ((scratchpad2[9] < 48) || (scratchpad2[9] > 57)) { error = 1; } + if ((scratchpad2[10] < 48) || (scratchpad2[10] > 57)) { error = 1; } + if ((AtofNonlocalized(scratchpad2) < 1) || (AtofNonlocalized(scratchpad2) > 31)) { error = 1; } + r = 0; + if (!strcmp(scratchpad2 + 3, "JAN")) { r = 1; } + else if (!strcmp(scratchpad2 + 3, "FEB")) { r = 2; } + else if (!strcmp(scratchpad2 + 3, "MAR")) { r = 3; } + else if (!strcmp(scratchpad2 + 3, "APR")) { r = 4; } + else if (!strcmp(scratchpad2 + 3, "MAY")) { r = 5; } + else if (!strcmp(scratchpad2 + 3, "JUN")) { r = 6; } + else if (!strcmp(scratchpad2 + 3, "JUL")) { r = 7; } + else if (!strcmp(scratchpad2 + 3, "AUG")) { r = 8; } + else if (!strcmp(scratchpad2 + 3, "SEP")) { r = 9; } + else if (!strcmp(scratchpad2 + 3, "OCT")) { r = 10; } + else if (!strcmp(scratchpad2 + 3, "NOV")) { r = 11; } + else if (!strcmp(scratchpad2 + 3, "DEC")) { r = 12; } + else { error = 1; } + } + + n = 0; + for (i = p; i < 80; ++i) + { + if (i > 78) + { + error = 1; + break; + } + if (scratchpad[i] == ' ') + { + n++; + if (scratchpad[i + 1] == ' ') + { + error = 1; + break; + } + } + if (n > 1) { break; } + } + + if (error) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + + if (edfHdr[98] != 'X') + { + error = 0; + + strncpy(scratchpad, edfHdr + 168, 8); + scratchpad[2] = 0; + scratchpad[5] = 0; + scratchpad[8] = 0; + + if (AtofNonlocalized(scratchpad) != AtofNonlocalized(scratchpad2)) { error = 1; } + if (AtofNonlocalized(scratchpad + 3) != r) { error = 1; } + if (AtofNonlocalized(scratchpad + 6) != AtofNonlocalized(scratchpad2 + 9)) { error = 1; } + if (error) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + + edfhdr->startdate_year = (int)AtofNonlocalized(scratchpad2 + 7); + + if (edfhdr->startdate_year < 1970) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + } + + p = 10; + for (i = 0; i < (80 - p); ++i) + { + if (edfhdr->recording[i + p] == ' ') { break; } + edfhdr->plus_startdate[i] = edfhdr->recording[i + p]; + } + edfhdr->plus_startdate[2] = ' '; + edfhdr->plus_startdate[3] += 32; + edfhdr->plus_startdate[4] += 32; + edfhdr->plus_startdate[5] += 32; + edfhdr->plus_startdate[6] = ' '; + edfhdr->plus_startdate[11] = 0; + p += i + 1; + + if (edfhdr->recording[p] == 'X') + { + edfhdr->plus_admincode[0] = 0; + p += 2; + } + else + { + for (i = 0; i < (80 - p); ++i) + { + if (edfhdr->recording[i + p] == ' ') { break; } + edfhdr->plus_admincode[i] = edfhdr->recording[i + p]; + if (edfhdr->plus_admincode[i] == '_') { edfhdr->plus_admincode[i] = ' '; } + } + edfhdr->plus_admincode[i] = 0; + p += i + 1; + } + + if (edfhdr->recording[p] == 'X') + { + edfhdr->plus_technician[0] = 0; + p += 2; + } + else + { + for (i = 0; i < (80 - p); ++i) + { + if (edfhdr->recording[i + p] == ' ') { break; } + edfhdr->plus_technician[i] = edfhdr->recording[i + p]; + if (edfhdr->plus_technician[i] == '_') { edfhdr->plus_technician[i] = ' '; } + } + edfhdr->plus_technician[i] = 0; + p += i + 1; + } + + if (edfhdr->recording[p] == 'X') + { + edfhdr->plus_equipment[0] = 0; + p += 2; + } + else + { + for (i = 0; i < (80 - p); ++i) + { + if (edfhdr->recording[i + p] == ' ') { break; } + edfhdr->plus_equipment[i] = edfhdr->recording[i + p]; + if (edfhdr->plus_equipment[i] == '_') { edfhdr->plus_equipment[i] = ' '; } + } + edfhdr->plus_equipment[i] = 0; + p += i + 1; + } + + for (i = 0; i < (80 - p); ++i) { edfhdr->plus_recording_additional[i] = edfhdr->recording[i + p]; } + edfhdr->plus_recording_additional[i] = 0; + //p += i + 1; + } + + /********************* FILESIZE *********************************************/ + + edfhdr->hdrsize = edfhdr->edfsignals * 256 + 256; + + fseeko(inputfile, 0LL, SEEK_END); + if (ftello(inputfile) != (edfhdr->recordsize * edfhdr->datarecords + edfhdr->hdrsize)) + { + *edfError = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; + free(edfHdr); + free(edfhdr->edfparam); + free(edfhdr); + return NULL; + } + + n = 0; + + for (i = 0; i < edfhdr->edfsignals; ++i) + { + edfhdr->edfparam[i].buf_offset = n; + if (edfhdr->bdf) { n += edfhdr->edfparam[i].smp_per_record * 3; } + else { n += edfhdr->edfparam[i].smp_per_record * 2; } + + edfhdr->edfparam[i].bitvalue = (edfhdr->edfparam[i].phys_max - edfhdr->edfparam[i].phys_min) / ( + edfhdr->edfparam[i].dig_max - edfhdr->edfparam[i].dig_min); + edfhdr->edfparam[i].offset = (int)(edfhdr->edfparam[i].phys_max / edfhdr->edfparam[i].bitvalue - edfhdr->edfparam[i].dig_max); + } + + edfhdr->file_hdl = inputfile; + + free(edfHdr); + + return edfhdr; +} + +int IsIntegerNumber(char* str) +{ + int i = 0, hasspace = 0, digit = 0; //hassign = 0, + + const size_t l = strlen(str); + + if (!l) { return 1; } + + if ((str[0] == '+') || (str[0] == '-')) + { + //hassign++; + i++; + } + + for (; i < l; ++i) + { + if (str[i] == ' ') + { + if (!digit) { return 1; } + hasspace++; + } + else + { + if ((str[i] < 48) || (str[i] > 57)) { return 1; } + if (hasspace) { return 1; } + digit++; + } + } + + if (digit) { return 0; } + return 1; +} + +int IsNumber(char* str) +{ + int i = 0, hasspace = 0, digit = 0, hasdot = 0, hasexp = 0; //hassign = 0, + const int l = (int)strlen(str); + if (!l) { return 1; } + + if ((str[0] == '+') || (str[0] == '-')) + { + //hassign++; + i++; + } + + for (; i < l; ++i) + { + if ((str[i] == 'e') || (str[i] == 'E')) + { + if ((!digit) || hasexp) { return 1; } + hasexp++; + //hassign = 0; + digit = 0; + + break; + } + + if (str[i] == ' ') + { + if (!digit) { return 1; } + hasspace++; + } + else + { + if (((str[i] < 48) || (str[i] > 57)) && str[i] != '.') { return 1; } + if (hasspace) { return 1; } + if (str[i] == '.') + { + if (hasdot) { return 1; } + hasdot++; + } + else { digit++; } + } + } + + if (hasexp) + { + if (++i == l) { return 1; } + + if ((str[i] == '+') || (str[i] == '-')) + { + //hassign++; + i++; + } + + for (; i < l; ++i) + { + if (str[i] == ' ') + { + if (!digit) { return 1; } + hasspace++; + } + else + { + if ((str[i] < 48) || (str[i] > 57)) { return 1; } + if (hasspace) { return 1; } + digit++; + } + } + } + + if (digit) { return 0; } + return 1; +} + +long long GetLongDuration(const char* str) +{ + int i, len = 8, hasdot = 0, dotposition = 0; + + long long value = 0, radix; + + for (i = 0; i < 8; ++i) + { + if (str[i] == ' ') + { + len = i; + break; + } + } + + for (i = 0; i < len; ++i) + { + if (str[i] == '.') + { + hasdot = 1; + dotposition = i; + break; + } + } + + if (hasdot) + { + radix = EDFLIB_TIME_DIMENSION; + + for (i = dotposition - 1; i >= 0; i--) + { + value += ((long long)(str[i] - 48)) * radix; + radix *= 10; + } + + radix = EDFLIB_TIME_DIMENSION / 10; + + for (i = dotposition + 1; i < len; ++i) + { + value += ((long long)(str[i] - 48)) * radix; + radix /= 10; + } + } + else + { + radix = EDFLIB_TIME_DIMENSION; + + for (i = len - 1; i >= 0; i--) + { + value += ((long long)(str[i] - 48)) * radix; + radix *= 10; + } + } + + return value; +} + +int edflib_version() { return EDFLIB_VERSION; } + +int GetAnnotations(struct edfhdrblock* edfhdr, int hdl, int annotations) +{ + int i, j, k, p, r = 0, n, edfsignals, datarecords, recordsize, discontinuous, *annotCh, + nrAnnotChns, max, onset, duration, + durationStart, zero, maxTalLn, error, annotsInRecord, annotsInTal, samplesize = 2; + + char *scratchpad, *cnvBuf, *timeInTxt, *durationInTxt; + + long long dataRecordDuration, elapsedtime, timeTmp = 0; + + FILE* inputfile; + + struct edfparamblock* edfparam; + struct edf_annotationblock *newAnnotation = NULL, + *tmpAnnotation; + + inputfile = edfhdr->file_hdl; + edfsignals = edfhdr->edfsignals; + recordsize = edfhdr->recordsize; + edfparam = edfhdr->edfparam; + nrAnnotChns = edfhdr->nr_annot_chns; + datarecords = (int)edfhdr->datarecords; + dataRecordDuration = edfhdr->long_data_record_duration; + discontinuous = edfhdr->discontinuous; + annotCh = edfhdr->annot_ch; + + if (edfhdr->edfplus) { samplesize = 2; } + if (edfhdr->bdfplus) { samplesize = 3; } + + cnvBuf = (char*)calloc(1, recordsize); + if (cnvBuf == NULL) { return 1; } + + maxTalLn = 0; + + for (i = 0; i < nrAnnotChns; ++i) + { + if (maxTalLn < edfparam[annotCh[i]].smp_per_record * samplesize) { maxTalLn = edfparam[annotCh[i]].smp_per_record * samplesize; } + } + + if (maxTalLn < 128) { maxTalLn = 128; } + + scratchpad = (char*)calloc(1, maxTalLn + 3); + if (scratchpad == NULL) + { + free(cnvBuf); + return 1; + } + + timeInTxt = (char*)calloc(1, maxTalLn + 3); + if (timeInTxt == NULL) + { + free(cnvBuf); + free(scratchpad); + return 1; + } + + durationInTxt = (char*)calloc(1, maxTalLn + 3); + if (durationInTxt == NULL) + { + free(cnvBuf); + free(scratchpad); + free(timeInTxt); + return 1; + } + + if (fseeko(inputfile, (long long)((edfsignals + 1) * 256), SEEK_SET)) + { + free(cnvBuf); + free(scratchpad); + free(timeInTxt); + free(durationInTxt); + return 2; + } + + elapsedtime = 0; + + for (i = 0; i < datarecords; ++i) + { + if (fread(cnvBuf, recordsize, 1, inputfile) != 1) + { + free(cnvBuf); + free(scratchpad); + free(timeInTxt); + free(durationInTxt); + return 2; + } + + /************** process annotationsignals (if any) **************/ + + error = 0; + + for (r = 0; r < nrAnnotChns; ++r) + { + n = 0; + zero = 0; + onset = 0; + duration = 0; + durationStart = 0; + scratchpad[0] = 0; + annotsInTal = 0; + annotsInRecord = 0; + + p = edfparam[annotCh[r]].buf_offset; + max = edfparam[annotCh[r]].smp_per_record * samplesize; + + /************** process one annotation signal ****************/ + + if (cnvBuf[p + max - 1] != 0) + { + error = 5; + goto END; + } + + if (!r) /* if it's the first annotation signal, then check */ + { /* the timekeeping annotation */ + error = 1; + + for (k = 0; k < (max - 2); ++k) + { + scratchpad[k] = cnvBuf[p + k]; + + if (scratchpad[k] == 20) + { + if (cnvBuf[p + k + 1] != 20) + { + error = 6; + goto END; + } + scratchpad[k] = 0; + if (IsOnsetNumber(scratchpad)) + { + error = 36; + goto END; + } + timeTmp = GetLongTime(scratchpad); + if (i) + { + if (discontinuous) + { + if ((timeTmp - elapsedtime) < dataRecordDuration) + { + error = 4; + goto END; + } + } + else + { + if ((timeTmp - elapsedtime) != dataRecordDuration) + { + error = 3; + goto END; + } + } + } + else + { + if (timeTmp >= EDFLIB_TIME_DIMENSION) + { + error = 2; + goto END; + } + edfhdr->starttime_offset = timeTmp; + } + elapsedtime = timeTmp; + error = 0; + break; + } + } + } + + for (k = 0; k < max; ++k) + { + scratchpad[n] = cnvBuf[p + k]; + + if (!scratchpad[n]) + { + if (!zero) + { + if (k) + { + if (cnvBuf[p + k - 1] != 20) + { + error = 33; + goto END; + } + } + n = 0; + onset = 0; + duration = 0; + durationStart = 0; + scratchpad[0] = 0; + annotsInTal = 0; + } + zero++; + continue; + } + if (zero > 1) + { + error = 34; + goto END; + } + zero = 0; + + if ((scratchpad[n] == 20) || (scratchpad[n] == 21)) + { + if (scratchpad[n] == 21) + { + if (duration || durationStart || onset || annotsInTal) + { /* it's not allowed to have multiple duration fields */ + error = 35; /* in one TAL or to have a duration field which is */ + goto END; /* not immediately behind the onsetfield */ + } + durationStart = 1; + } + + if ((scratchpad[n] == 20) && onset && (!durationStart)) + { + if (r || annotsInRecord) + { + if (n >= 0) + { + newAnnotation = (struct edf_annotationblock*)calloc(1, sizeof(struct edf_annotationblock)); + if (newAnnotation == NULL) + { + free(cnvBuf); + free(scratchpad); + free(timeInTxt); + free(durationInTxt); + return 1; + } + + newAnnotation->next_annotation = NULL; + + newAnnotation->annotation[0] = 0; + + if (duration) { strcpy(newAnnotation->duration, durationInTxt); } + else { newAnnotation->duration[0] = 0; } + + for (j = 0; j < n; ++j) + { + if (j == EDFLIB_MAX_ANNOTATION_LEN) { break; } + newAnnotation->annotation[j] = scratchpad[j]; + } + newAnnotation->annotation[j] = 0; + + newAnnotation->onset = GetLongTime(timeInTxt); + + if (annotationslist[hdl] == NULL) + { + newAnnotation->former_annotation = NULL; + annotationslist[hdl] = newAnnotation; + } + else + { + tmpAnnotation = annotationslist[hdl]; + while (tmpAnnotation->next_annotation) { tmpAnnotation = tmpAnnotation->next_annotation; } + + newAnnotation->former_annotation = tmpAnnotation; + tmpAnnotation->next_annotation = newAnnotation; + } + + if (annotations == EDFLIB_READ_ANNOTATIONS) + { + if (!(strncmp(newAnnotation->annotation, "Recording ends", 14))) { if (nrAnnotChns == 1) { goto END; } } + } + } + } + + annotsInTal++; + annotsInRecord++; + n = 0; + continue; + } + + if (!onset) + { + scratchpad[n] = 0; + if (IsOnsetNumber(scratchpad)) + { + error = 36; + goto END; + } + onset = 1; + n = 0; + strcpy(timeInTxt, scratchpad); + continue; + } + + if (durationStart) + { + scratchpad[n] = 0; + if (IsDurationNumber(scratchpad)) + { + error = 37; + goto END; + } + + for (j = 0; j < n; ++j) + { + if (j == 15) { break; } + durationInTxt[j] = scratchpad[j]; + if ((durationInTxt[j] < 32) || (durationInTxt[j] > 126)) { durationInTxt[j] = '.'; } + } + durationInTxt[j] = 0; + + duration = 1; + durationStart = 0; + n = 0; + continue; + } + } + + n++; + } + + END: + + /****************** end ************************/ + + if (error) + { + free(cnvBuf); + free(scratchpad); + free(timeInTxt); + free(durationInTxt); + return 9; + } + } + } + + free(cnvBuf); + free(scratchpad); + free(timeInTxt); + free(durationInTxt); + + return 0; +} + +int IsDurationNumber(char* str) +{ + int hasdot = 0; + + const size_t l = strlen(str); + + if (!l) { return 1; } + + if ((str[0] == '.') || (str[l - 1] == '.')) { return 1; } + + for (size_t i = 0; i < l; ++i) + { + if (str[i] == '.') + { + if (hasdot) { return 1; } + hasdot++; + } + else { if ((str[i] < 48) || (str[i] > 57)) { return 1; } } + } + + return 0; +} + +int IsOnsetNumber(char* str) +{ + int hasdot = 0; + + const size_t l = strlen(str); + + if (l < 2) { return 1; } + + if ((str[0] != '+') && (str[0] != '-')) { return 1; } + + if ((str[1] == '.') || (str[l - 1] == '.')) { return 1; } + + for (size_t i = 1; i < l; ++i) + { + if (str[i] == '.') + { + if (hasdot) { return 1; } + hasdot++; + } + else { if ((str[i] < 48) || (str[i] > 57)) { return 1; } } + } + + return 0; +} + +long long GetLongTime(char* str) +{ + size_t hasdot = 0, dotposition = 0; + + long long value = 0, radix; + + str = str + 1; + + size_t len = strlen(str); + + for (size_t i = 0; i < len; ++i) + { + if (str[i] == '.') + { + hasdot = 1; + dotposition = i; + break; + } + } + + if (hasdot) + { + radix = EDFLIB_TIME_DIMENSION; + + for (size_t i = dotposition - 1; i >= 0; i--) + { + value += ((long long)(str[i] - 48)) * radix; + radix *= 10; + } + + radix = EDFLIB_TIME_DIMENSION / 10; + + for (size_t i = dotposition + 1; i < len; ++i) + { + value += ((long long)(str[i] - 48)) * radix; + radix /= 10; + } + } + else + { + radix = EDFLIB_TIME_DIMENSION; + + for (size_t i = len - 1; i >= 0; i--) + { + value += ((long long)(str[i] - 48)) * radix; + radix *= 10; + } + } + + if (str[-1] == '-') { value = -value; } + + return value; +} + +void Latin1ToASCII(char* str, const int len) +{ + for (int i = 0; i < len; ++i) + { + const int value = *((unsigned char*)(str + i)); + + if ((value > 31) && (value < 127)) { continue; } + + switch (value) + { + case 128: str[i] = 'E'; + break; + + case 130: str[i] = ','; + break; + + case 131: str[i] = 'F'; + break; + + case 132: str[i] = '\"'; + break; + + case 133: str[i] = '.'; + break; + + case 134: str[i] = '+'; + break; + + case 135: str[i] = '+'; + break; + + case 136: str[i] = '^'; + break; + + case 137: str[i] = 'm'; + break; + + case 138: str[i] = 'S'; + break; + + case 139: str[i] = '<'; + break; + + case 140: str[i] = 'E'; + break; + + case 142: str[i] = 'Z'; + break; + + case 145: str[i] = '`'; + break; + + case 146: str[i] = '\''; + break; + + case 147: str[i] = '\"'; + break; + + case 148: str[i] = '\"'; + break; + + case 149: str[i] = '.'; + break; + + case 150: str[i] = '-'; + break; + + case 151: str[i] = '-'; + break; + + case 152: str[i] = '~'; + break; + + case 154: str[i] = 's'; + break; + + case 155: str[i] = '>'; + break; + + case 156: str[i] = 'e'; + break; + + case 158: str[i] = 'z'; + break; + + case 159: str[i] = 'Y'; + break; + + case 171: str[i] = '<'; + break; + + case 180: str[i] = '\''; + break; + + case 181: str[i] = 'u'; + break; + + case 187: str[i] = '>'; + break; + + case 191: str[i] = '\?'; + break; + + case 192: str[i] = 'A'; + break; + + case 193: str[i] = 'A'; + break; + + case 194: str[i] = 'A'; + break; + + case 195: str[i] = 'A'; + break; + + case 196: str[i] = 'A'; + break; + + case 197: str[i] = 'A'; + break; + + case 198: str[i] = 'E'; + break; + + case 199: str[i] = 'C'; + break; + + case 200: str[i] = 'E'; + break; + + case 201: str[i] = 'E'; + break; + + case 202: str[i] = 'E'; + break; + + case 203: str[i] = 'E'; + break; + + case 204: str[i] = 'I'; + break; + + case 205: str[i] = 'I'; + break; + + case 206: str[i] = 'I'; + break; + + case 207: str[i] = 'I'; + break; + + case 208: str[i] = 'D'; + break; + + case 209: str[i] = 'N'; + break; + + case 210: str[i] = 'O'; + break; + + case 211: str[i] = 'O'; + break; + + case 212: str[i] = 'O'; + break; + + case 213: str[i] = 'O'; + break; + + case 214: str[i] = 'O'; + break; + + case 215: str[i] = 'x'; + break; + + case 216: str[i] = 'O'; + break; + + case 217: str[i] = 'U'; + break; + + case 218: str[i] = 'U'; + break; + + case 219: str[i] = 'U'; + break; + + case 220: str[i] = 'U'; + break; + + case 221: str[i] = 'Y'; + break; + + case 222: str[i] = 'I'; + break; + + case 223: str[i] = 's'; + break; + + case 224: str[i] = 'a'; + break; + + case 225: str[i] = 'a'; + break; + + case 226: str[i] = 'a'; + break; + + case 227: str[i] = 'a'; + break; + + case 228: str[i] = 'a'; + break; + + case 229: str[i] = 'a'; + break; + + case 230: str[i] = 'e'; + break; + + case 231: str[i] = 'c'; + break; + + case 232: str[i] = 'e'; + break; + + case 233: str[i] = 'e'; + break; + + case 234: str[i] = 'e'; + break; + + case 235: str[i] = 'e'; + break; + + case 236: str[i] = 'i'; + break; + + case 237: str[i] = 'i'; + break; + + case 238: str[i] = 'i'; + break; + + case 239: str[i] = 'i'; + break; + + case 240: str[i] = 'd'; + break; + + case 241: str[i] = 'n'; + break; + + case 242: str[i] = 'o'; + break; + + case 243: str[i] = 'o'; + break; + + case 244: str[i] = 'o'; + break; + + case 245: str[i] = 'o'; + break; + + case 246: str[i] = 'o'; + break; + + case 247: str[i] = '-'; + break; + + case 248: str[i] = '0'; + break; + + case 249: str[i] = 'u'; + break; + + case 250: str[i] = 'u'; + break; + + case 251: str[i] = 'u'; + break; + + case 252: str[i] = 'u'; + break; + + case 253: str[i] = 'y'; + break; + + case 254: str[i] = 't'; + break; + + case 255: str[i] = 'y'; + break; + + default: str[i] = ' '; + break; + } + } +} + +void Latin12UTF8(char* latin, const int len) +{ + int i, j = 0; + unsigned char tmp[512]; + unsigned char* str = (unsigned char*)latin; + + for (i = 0; i < len; ++i) + { + if (str[i] == 0) + { + tmp[j] = 0; + break; + } + + tmp[j] = str[i]; + + if (str[i] < 32) { tmp[j] = '.'; } + if ((str[i] > 126) && (str[i] < 160)) { tmp[j] = '.'; } + if (str[i] > 159) + { + if ((len - j) < 2) { tmp[j] = ' '; } + else + { + tmp[j] = 192 + (str[i] >> 6); + j++; + tmp[j] = 128 + (str[i] & 63); + } + } + + j++; + + if (j >= len) { break; } + } + + for (i = 0; i < len; ++i) { str[i] = tmp[i]; } +} + +int EdfopenFileWriteonly(const char* path, const int filetype, const int nSignals) +{ + int i; + + if ((filetype != EDFLIB_FILETYPE_EDFPLUS) && (filetype != EDFLIB_FILETYPE_BDFPLUS)) { return EDFLIB_FILETYPE_ERROR; } + + if (files_open >= EDFLIB_MAXFILES) { return EDFLIB_MAXFILES_REACHED; } + + for (i = 0; i < EDFLIB_MAXFILES; ++i) { if (hdrlist[i] != NULL) { if (!(strcmp(path, hdrlist[i]->path))) { return EDFLIB_FILE_ALREADY_OPENED; } } } + + if (nSignals < 0) { return EDFLIB_NUMBER_OF_SIGNALS_INVALID; } + if (nSignals > EDFLIB_MAXSIGNALS) { return EDFLIB_NUMBER_OF_SIGNALS_INVALID; } + + struct edfhdrblock* hdr = (struct edfhdrblock*)calloc(1, sizeof(struct edfhdrblock)); + if (hdr == NULL) { return EDFLIB_MALLOC_ERROR; } + + hdr->edfparam = (struct edfparamblock*)calloc(1, sizeof(struct edfparamblock) * nSignals); + if (hdr->edfparam == NULL) + { + free(hdr); + return EDFLIB_MALLOC_ERROR; + } + + hdr->writemode = 1; + + hdr->edfsignals = nSignals; + + FILE* file = fopeno(path, "wb"); + if (file == NULL) + { + free(hdr->edfparam); + free(hdr); + return EDFLIB_NO_SUCH_FILE_OR_DIRECTORY; + } + + hdr->file_hdl = file; + + int handle = -1; + + for (i = 0; i < EDFLIB_MAXFILES; ++i) + { + if (hdrlist[i] == NULL) + { + hdrlist[i] = hdr; + handle = i; + break; + } + } + + if (handle < 0) { return EDFLIB_MAXFILES_REACHED; } + + write_annotationslist[handle] = NULL; + + strcpy(hdr->path, path); + + files_open++; + + if (filetype == EDFLIB_FILETYPE_EDFPLUS) + { + hdr->edf = 1; + hdr->edfplus = 1; + } + + if (filetype == EDFLIB_FILETYPE_BDFPLUS) + { + hdr->bdf = 1; + hdr->bdfplus = 1; + } + + hdr->long_data_record_duration = EDFLIB_TIME_DIMENSION; + hdr->data_record_duration = 1.0; + + return handle; +} + +int EdfSetSampling(const int handle, const int edfsignal, const int sampling) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (edfsignal < 0) { return -1; } + if (edfsignal >= hdrlist[handle]->edfsignals) { return -1; } + if (sampling < 1) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + + hdrlist[handle]->edfparam[edfsignal].smp_per_record = sampling; + return 0; +} + +int EdfSetDatarecordDuration(const int handle, const int duration) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + if ((duration < 2500) || (duration > 2000000)) { return -1; } + + hdrlist[handle]->long_data_record_duration = (long long)duration * 100LL; + + if (hdrlist[handle]->long_data_record_duration < (EDFLIB_TIME_DIMENSION * 10LL)) + { + hdrlist[handle]->long_data_record_duration /= 10LL; + hdrlist[handle]->long_data_record_duration *= 10LL; + } + else + { + hdrlist[handle]->long_data_record_duration /= 100LL; + hdrlist[handle]->long_data_record_duration *= 100LL; + } + + hdrlist[handle]->data_record_duration = ((double)(hdrlist[handle]->long_data_record_duration)) / EDFLIB_TIME_DIMENSION; + + return 0; +} + +int EdfwriteDigitalSamples(const int handle, const int* buf) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (hdrlist[handle]->edfsignals == 0) { return -1; } + + struct edfhdrblock* hdr = hdrlist[handle]; + + FILE* file = hdr->file_hdl; + + const int edfsignal = hdr->signal_write_sequence_pos; + + if (!hdr->datarecords) + { + if (!edfsignal) + { + const int error = WriteEdfHeader(hdr); + if (error) { return error; } + } + } + + const int sf = hdr->edfparam[edfsignal].smp_per_record; + const int digmax = hdr->edfparam[edfsignal].dig_max; + const int digmin = hdr->edfparam[edfsignal].dig_min; + + for (int i = 0; i < sf; ++i) + { + int value = buf[i]; + + if (value > digmax) { value = digmax; } + if (value < digmin) { value = digmin; } + + fputc((value) & 0xff, file); + + if (fputc((value >> 8) & 0xff, file) == EOF) { return -1; } + if (hdr->bdf) { fputc((value >> 16) & 0xff, file); } + } + + hdr->signal_write_sequence_pos++; + + if (hdr->signal_write_sequence_pos == hdr->edfsignals) + { + hdr->signal_write_sequence_pos = 0; + + int p = FprintLLNumberNonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) / EDFLIB_TIME_DIMENSION, 0, 1); + if (hdr->long_data_record_duration % EDFLIB_TIME_DIMENSION) + { + fputc('.', file); + p++; + p += FprintLLNumberNonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) % EDFLIB_TIME_DIMENSION, 7, 0); + } + fputc(20, file); + fputc(20, file); + p += 2; + for (; p < EDFLIB_ANNOTATION_BYTES; ++p) { fputc(0, file); } + + hdr->datarecords++; + + fflush(file); + } + + return 0; +} + +int EdfBlockwriteDigitalSamples(const int handle, const int* buf) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (hdrlist[handle]->signal_write_sequence_pos) { return -1; } + if (hdrlist[handle]->edfsignals == 0) { return -1; } + + struct edfhdrblock* hdr = hdrlist[handle]; + + FILE* file = hdr->file_hdl; + + const int edfsignals = hdr->edfsignals; + + if (!hdr->datarecords) + { + const int error = WriteEdfHeader(hdr); + if (error) { return error; } + } + + int offset = 0; + + for (int j = 0; j < edfsignals; ++j) + { + const int sf = hdr->edfparam[j].smp_per_record; + const int digmax = hdr->edfparam[j].dig_max; + const int digmin = hdr->edfparam[j].dig_min; + + for (int i = 0; i < sf; ++i) + { + int value = buf[i + offset]; + if (value > digmax) { value = digmax; } + if (value < digmin) { value = digmin; } + fputc(value & 0xff, file); + if (fputc((value >> 8) & 0xff, file) == EOF) { return -1; } + if (hdr->bdf) { fputc((value >> 16) & 0xff, file); } + } + + offset += sf; + } + + int p = FprintLLNumberNonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) / EDFLIB_TIME_DIMENSION, 0, 1); + if (hdr->long_data_record_duration % EDFLIB_TIME_DIMENSION) + { + fputc('.', file); + p++; + p += FprintLLNumberNonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) % EDFLIB_TIME_DIMENSION, 7, 0); + } + fputc(20, file); + fputc(20, file); + p += 2; + for (; p < EDFLIB_ANNOTATION_BYTES; ++p) { fputc(0, file); } + + hdr->datarecords++; + + fflush(file); + + return 0; +} + +int EdfwritePhysicalSamples(const int handle, const double* buf) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (hdrlist[handle]->edfsignals == 0) { return -1; } + + struct edfhdrblock* hdr = hdrlist[handle]; + FILE* file = hdr->file_hdl; + const int edfsignal = hdr->signal_write_sequence_pos; + + if (!hdr->datarecords) + { + if (!edfsignal) + { + const int error = WriteEdfHeader(hdr); + if (error) { return error; } + } + } + + const int sf = hdr->edfparam[edfsignal].smp_per_record; + const int digmax = hdr->edfparam[edfsignal].dig_max; + const int digmin = hdr->edfparam[edfsignal].dig_min; + const double bitvalue = hdr->edfparam[edfsignal].bitvalue; + const int offset = hdr->edfparam[edfsignal].offset; + + for (int i = 0; i < sf; ++i) + { + int value = (int)(buf[i] / bitvalue); + value -= offset; + if (value > digmax) { value = digmax; } + if (value < digmin) { value = digmin; } + + fputc(value & 0xff, file); + + if (fputc((value >> 8) & 0xff, file) == EOF) { return -1; } + if (hdr->bdf) { fputc((value >> 16) & 0xff, file); } + } + + hdr->signal_write_sequence_pos++; + + if (hdr->signal_write_sequence_pos == hdr->edfsignals) + { + hdr->signal_write_sequence_pos = 0; + + int p = FprintLLNumberNonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) / EDFLIB_TIME_DIMENSION, 0, 1); + if (hdr->long_data_record_duration % EDFLIB_TIME_DIMENSION) + { + fputc('.', file); + p++; + p += FprintLLNumberNonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) % EDFLIB_TIME_DIMENSION, 7, 0); + } + fputc(20, file); + fputc(20, file); + p += 2; + for (; p < EDFLIB_ANNOTATION_BYTES; ++p) { fputc(0, file); } + + hdr->datarecords++; + + fflush(file); + } + + return 0; +} + +int EdfBlockwritePhysicalSamples(const int handle, const double* buf) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (hdrlist[handle]->signal_write_sequence_pos) { return -1; } + if (hdrlist[handle]->edfsignals == 0) { return -1; } + + struct edfhdrblock* hdr = hdrlist[handle]; + FILE* file = hdr->file_hdl; + const int edfsignals = hdr->edfsignals; + + if (!hdr->datarecords) + { + const int error = WriteEdfHeader(hdr); + if (error) { return error; } + } + + int bufOffset = 0; + + for (int j = 0; j < edfsignals; ++j) + { + const int sf = hdr->edfparam[j].smp_per_record; + const int digmax = hdr->edfparam[j].dig_max; + const int digmin = hdr->edfparam[j].dig_min; + const double bitvalue = hdr->edfparam[j].bitvalue; + const int offset = hdr->edfparam[j].offset; + + for (int i = 0; i < sf; ++i) + { + int value = (int)(buf[i + bufOffset] / bitvalue); + value -= offset; + if (value > digmax) { value = digmax; } + if (value < digmin) { value = digmin; } + + fputc(value & 0xff, file); + + if (fputc((value >> 8) & 0xff, file) == EOF) { return -1; } + if (hdr->bdf) { fputc((value >> 16) & 0xff, file); } + } + + bufOffset += sf; + } + + int p = FprintLLNumberNonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) / EDFLIB_TIME_DIMENSION, 0, 1); + if (hdr->long_data_record_duration % EDFLIB_TIME_DIMENSION) + { + fputc('.', file); + p++; + p += FprintLLNumberNonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) % EDFLIB_TIME_DIMENSION, 7, 0); + } + fputc(20, file); + fputc(20, file); + p += 2; + for (; p < EDFLIB_ANNOTATION_BYTES; ++p) { fputc(0, file); } + + hdr->datarecords++; + + fflush(file); + + return 0; +} + +int WriteEdfHeader(struct edfhdrblock* hdr) +{ + int i, j, p, q, len, rest, edfsignals; + + char str[128]; + struct tm* dateTime; + time_t elapsedTime; + FILE* file; + + file = hdr->file_hdl; + + edfsignals = hdr->edfsignals; + + if (edfsignals < 0) { return -20; } + if (edfsignals > EDFLIB_MAXSIGNALS) { return -21; } + + for (i = 0; i < edfsignals; ++i) + { + if (hdr->edfparam[i].smp_per_record < 1) { return -22; } + if (hdr->edfparam[i].dig_max == hdr->edfparam[i].dig_min) { return -23; } + if (hdr->edfparam[i].dig_max < hdr->edfparam[i].dig_min) { return -24; } + if (hdr->edfparam[i].phys_max == hdr->edfparam[i].phys_min) { return -25; } + } + + for (i = 0; i < edfsignals; ++i) + { + hdr->edfparam[i].bitvalue = (hdr->edfparam[i].phys_max - hdr->edfparam[i].phys_min) / (hdr->edfparam[i].dig_max - hdr->edfparam[i].dig_min); + hdr->edfparam[i].offset = (int)(hdr->edfparam[i].phys_max / hdr->edfparam[i].bitvalue - hdr->edfparam[i].dig_max); + } + + rewind(file); + + if (hdr->edf) { fprintf(file, "0 "); } + else + { + fputc(255, file); + fprintf(file, "BIOSEMI"); + } + + p = 0; + + if (hdr->plus_birthdate[0] == 0) { rest = 72; } + else { rest = 62; } + + len = (int)(strlen(hdr->plus_patientcode)); + if (len && rest) + { + if (len > rest) + { + len = rest; + rest = 0; + } + else { rest -= len; } + strcpy(str, hdr->plus_patientcode); + Latin1ToASCII(str, len); + str[len] = 0; + for (i = 0; i < len; ++i) { if (str[i] == ' ') { str[i] = '_'; } } + p += fprintf(file, "%s ", str); + } + else { p += fprintf(file, "X "); } + + if (hdr->plus_gender[0] == 'M') { fputc('M', file); } + else + { + if (hdr->plus_gender[0] == 'F') { fputc('F', file); } + else { fputc('X', file); } + } + fputc(' ', file); + p += 2; + + if (hdr->plus_birthdate[0] == 0) + { + fputc('X', file); + fputc(' ', file); + + p += 2; + } + else + { + fputc(hdr->plus_birthdate[0], file); + fputc(hdr->plus_birthdate[1], file); + fputc('-', file); + q = (int)AtofNonlocalized(&(hdr->plus_birthdate[3])); + switch (q) + { + case 1: fprintf(file, "JAN"); + break; + case 2: fprintf(file, "FEB"); + break; + case 3: fprintf(file, "MAR"); + break; + case 4: fprintf(file, "APR"); + break; + case 5: fprintf(file, "MAY"); + break; + case 6: fprintf(file, "JUN"); + break; + case 7: fprintf(file, "JUL"); + break; + case 8: fprintf(file, "AUG"); + break; + case 9: fprintf(file, "SEP"); + break; + case 10: fprintf(file, "OCT"); + break; + case 11: fprintf(file, "NOV"); + break; + case 12: fprintf(file, "DEC"); + break; + default: fprintf(file, "UND"); + break; + } + fputc('-', file); + fputc(hdr->plus_birthdate[6], file); + fputc(hdr->plus_birthdate[7], file); + fputc(hdr->plus_birthdate[8], file); + fputc(hdr->plus_birthdate[9], file); + fputc(' ', file); + + p += 12; + } + + len = (int)strlen(hdr->plus_patient_name); + if (len && rest) + { + if (len > rest) + { + len = rest; + rest = 0; + } + else { rest -= len; } + strcpy(str, hdr->plus_patient_name); + Latin1ToASCII(str, len); + str[len] = 0; + for (i = 0; i < len; ++i) { if (str[i] == ' ') { str[i] = '_'; } } + p += fprintf(file, "%s ", str); + } + else + { + fputc('X', file); + p++; + } + + len = (int)strlen(hdr->plus_patient_additional); + if (len && rest) + { + if (len > rest) { len = rest; } + strcpy(str, hdr->plus_patient_additional); + Latin1ToASCII(str, len); + str[len] = 0; + p += fprintf(file, "%s", str); + } + + for (; p < 80; ++p) { fputc(' ', file); } + + if (!hdr->startdate_year) + { + elapsedTime = time(NULL); + dateTime = localtime(&elapsedTime); + + hdr->startdate_year = dateTime->tm_year + 1900; + hdr->startdate_month = dateTime->tm_mon + 1; + hdr->startdate_day = dateTime->tm_mday; + hdr->starttime_hour = dateTime->tm_hour; + hdr->starttime_minute = dateTime->tm_min; + hdr->starttime_second = dateTime->tm_sec % 60; + } + + p = 0; + + p += fprintf(file, "Startdate %02u-", hdr->startdate_day); + switch (hdr->startdate_month) + { + case 1: fprintf(file, "JAN"); + break; + case 2: fprintf(file, "FEB"); + break; + case 3: fprintf(file, "MAR"); + break; + case 4: fprintf(file, "APR"); + break; + case 5: fprintf(file, "MAY"); + break; + case 6: fprintf(file, "JUN"); + break; + case 7: fprintf(file, "JUL"); + break; + case 8: fprintf(file, "AUG"); + break; + case 9: fprintf(file, "SEP"); + break; + case 10: fprintf(file, "OCT"); + break; + case 11: fprintf(file, "NOV"); + break; + case 12: fprintf(file, "DEC"); + break; + default: fprintf(file, "UND"); + break; + } + p += 3; + fputc('-', file); + p++; + p += FprintIntNumberNonlocalized(file, hdr->startdate_year, 4, 0); + fputc(' ', file); + p++; + + rest = 42; + + len = (int)strlen(hdr->plus_admincode); + if (len && rest) + { + if (len > rest) + { + len = rest; + rest = 0; + } + else { rest -= len; } + strcpy(str, hdr->plus_admincode); + Latin1ToASCII(str, len); + str[len] = 0; + for (i = 0; i < len; ++i) { if (str[i] == ' ') { str[i] = '_'; } } + p += fprintf(file, "%s ", str); + } + else { p += fprintf(file, "X "); } + + len = (int)strlen(hdr->plus_technician); + if (len && rest) + { + if (len > rest) + { + len = rest; + rest = 0; + } + else { rest -= len; } + strcpy(str, hdr->plus_technician); + Latin1ToASCII(str, len); + str[len] = 0; + for (i = 0; i < len; ++i) { if (str[i] == ' ') { str[i] = '_'; } } + p += fprintf(file, "%s ", str); + } + else { p += fprintf(file, "X "); } + + len = (int)strlen(hdr->plus_equipment); + if (len && rest) + { + if (len > rest) + { + len = rest; + rest = 0; + } + else { rest -= len; } + strcpy(str, hdr->plus_equipment); + Latin1ToASCII(str, len); + str[len] = 0; + for (i = 0; i < len; ++i) { if (str[i] == ' ') { str[i] = '_'; } } + p += fprintf(file, "%s ", str); + } + else { p += fprintf(file, "X "); } + + len = (int)strlen(hdr->plus_recording_additional); + if (len && rest) + { + if (len > rest) { len = rest; } + strcpy(str, hdr->plus_recording_additional); + Latin1ToASCII(str, len); + str[len] = 0; + p += fprintf(file, "%s", str); + } + + for (; p < 80; ++p) { fputc(' ', file); } + + fprintf(file, "%02u.%02u.%02u", hdr->startdate_day, hdr->startdate_month, (hdr->startdate_year % 100)); + fprintf(file, "%02u.%02u.%02u", hdr->starttime_hour, hdr->starttime_minute, hdr->starttime_second); + p = FprintIntNumberNonlocalized(file, edfsignals * 256 + 512, 0, 0); + for (; p < 8; ++p) { fputc(' ', file); } + if (hdr->edf) { fprintf(file, "EDF+C"); } + else { fprintf(file, "BDF+C"); } + for (i = 0; i < 39; ++i) { fputc(' ', file); } + fprintf(file, "-1 "); + if (hdr->long_data_record_duration == EDFLIB_TIME_DIMENSION) { fprintf(file, "1 "); } + else + { + SprintNumberNonlocalized(str, hdr->data_record_duration); + strcat(str, " "); + str[8] = 0; + fprintf(file, "%s", str); + } + p = FprintIntNumberNonlocalized(file, edfsignals + 1, 0, 0); + for (; p < 4; ++p) { fputc(' ', file); } + + for (i = 0; i < edfsignals; ++i) + { + len = (int)strlen(hdr->edfparam[i].label); + Latin1ToASCII(hdr->edfparam[i].label, len); + for (j = 0; j < len; ++j) { fputc(hdr->edfparam[i].label[j], file); } + for (; j < 16; ++j) { fputc(' ', file); } + } + if (hdr->edf) { fprintf(file, "EDF Annotations "); } + else { fprintf(file, "BDF Annotations "); } + for (i = 0; i < edfsignals; ++i) + { + len = (int)strlen(hdr->edfparam[i].transducer); + Latin1ToASCII(hdr->edfparam[i].transducer, len); + for (j = 0; j < len; ++j) { fputc(hdr->edfparam[i].transducer[j], file); } + for (; j < 80; ++j) { fputc(' ', file); } + } + for (i = 0; i < 80; ++i) { fputc(' ', file); } + for (i = 0; i < edfsignals; ++i) + { + len = (int)strlen(hdr->edfparam[i].physdimension); + Latin1ToASCII(hdr->edfparam[i].physdimension, len); + for (j = 0; j < len; ++j) { fputc(hdr->edfparam[i].physdimension[j], file); } + for (; j < 8; ++j) { fputc(' ', file); } + } + fprintf(file, " "); + for (i = 0; i < edfsignals; ++i) + { + p = SprintNumberNonlocalized(str, hdr->edfparam[i].phys_min); + for (; p < 8; ++p) { str[p] = ' '; } + str[8] = 0; + fprintf(file, "%s", str); + } + fprintf(file, "-1 "); + for (i = 0; i < edfsignals; ++i) + { + p = SprintNumberNonlocalized(str, hdr->edfparam[i].phys_max); + for (; p < 8; ++p) { str[p] = ' '; } + str[8] = 0; + fprintf(file, "%s", str); + } + fprintf(file, "1 "); + for (i = 0; i < edfsignals; ++i) + { + p = FprintIntNumberNonlocalized(file, hdr->edfparam[i].dig_min, 0, 0); + for (; p < 8; ++p) { fputc(' ', file); } + } + if (hdr->edf) { fprintf(file, "-32768 "); } + else { fprintf(file, "-8388608"); } + for (i = 0; i < edfsignals; ++i) + { + p = FprintIntNumberNonlocalized(file, hdr->edfparam[i].dig_max, 0, 0); + for (; p < 8; ++p) { fputc(' ', file); } + } + if (hdr->edf) { fprintf(file, "32767 "); } + else { fprintf(file, "8388607 "); } + for (i = 0; i < edfsignals; ++i) + { + len = (int)strlen(hdr->edfparam[i].prefilter); + Latin1ToASCII(hdr->edfparam[i].prefilter, len); + for (j = 0; j < len; ++j) { fputc(hdr->edfparam[i].prefilter[j], file); } + for (; j < 80; ++j) { fputc(' ', file); } + } + for (j = 0; j < 80; ++j) { fputc(' ', file); } + for (i = 0; i < edfsignals; ++i) + { + p = FprintIntNumberNonlocalized(file, hdr->edfparam[i].smp_per_record, 0, 0); + for (; p < 8; ++p) { fputc(' ', file); } + } + if (hdr->edf) + { + p = FprintIntNumberNonlocalized(file, EDFLIB_ANNOTATION_BYTES / 2, 0, 0); + for (; p < 8; ++p) { fputc(' ', file); } + } + else + { + p = FprintIntNumberNonlocalized(file, EDFLIB_ANNOTATION_BYTES / 3, 0, 0); + for (; p < 8; ++p) { fputc(' ', file); } + } + for (i = 0; i < (edfsignals * 32 + 32); ++i) { fputc(' ', file); } + + return 0; +} + +int EdfSetLabel(const int handle, const int edfsignal, const char* label) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (edfsignal < 0) { return -1; } + if (edfsignal >= hdrlist[handle]->edfsignals) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + strncpy(hdrlist[handle]->edfparam[edfsignal].label, label, 16); + hdrlist[handle]->edfparam[edfsignal].label[16] = 0; + RemovePaddingTrailingSpaces(hdrlist[handle]->edfparam[edfsignal].label); + return 0; +} + +int EdfSetPhysicalDimension(const int handle, const int edfsignal, const char* dim) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (edfsignal < 0) { return -1; } + if (edfsignal >= hdrlist[handle]->edfsignals) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + strncpy(hdrlist[handle]->edfparam[edfsignal].physdimension, dim, 8); + hdrlist[handle]->edfparam[edfsignal].physdimension[8] = 0; + RemovePaddingTrailingSpaces(hdrlist[handle]->edfparam[edfsignal].physdimension); + return 0; +} + +int EdfSetPhysicalMaximum(const int handle, const int edfsignal, const double max) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (edfsignal < 0) { return -1; } + if (edfsignal >= hdrlist[handle]->edfsignals) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + hdrlist[handle]->edfparam[edfsignal].phys_max = max; + return 0; +} + +int EdfSetPhysicalMinimum(const int handle, const int edfsignal, const double min) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (edfsignal < 0) { return -1; } + if (edfsignal >= hdrlist[handle]->edfsignals) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + hdrlist[handle]->edfparam[edfsignal].phys_min = min; + return 0; +} + +int EdfSetDigitalMaximum(const int handle, const int edfsignal, const int max) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (edfsignal < 0) { return -1; } + if (edfsignal >= hdrlist[handle]->edfsignals) { return -1; } + if (hdrlist[handle]->edf) { if (max > 32767) { return -1; } } + else { if (max > 8388607) { return -1; } } + if (hdrlist[handle]->datarecords) { return -1; } + hdrlist[handle]->edfparam[edfsignal].dig_max = max; + return 0; +} + +int EdfSetDigitalMinimum(const int handle, const int edfsignal, const int min) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (edfsignal < 0) { return -1; } + if (edfsignal >= hdrlist[handle]->edfsignals) { return -1; } + if (hdrlist[handle]->edf) { if (min < (-32768)) { return -1; } } + else { if (min < (-8388608)) { return -1; } } + if (hdrlist[handle]->datarecords) { return -1; } + hdrlist[handle]->edfparam[edfsignal].dig_min = min; + return 0; +} + +int EdfSetPatientname(const int handle, const char* patientname) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + strncpy(hdrlist[handle]->plus_patient_name, patientname, 80); + hdrlist[handle]->plus_patient_name[80] = 0; + RemovePaddingTrailingSpaces(hdrlist[handle]->plus_patient_name); + return 0; +} + +int EdfSetPatientcode(const int handle, const char* patientcode) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + strncpy(hdrlist[handle]->plus_patientcode, patientcode, 80); + hdrlist[handle]->plus_patientcode[80] = 0; + RemovePaddingTrailingSpaces(hdrlist[handle]->plus_patientcode); + return 0; +} + +int EdfSetGender(const int handle, const int gender) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + if ((gender < 0) || (gender > 1)) { return -1; } + if (gender) { hdrlist[handle]->plus_gender[0] = 'M'; } + else { hdrlist[handle]->plus_gender[0] = 'F'; } + hdrlist[handle]->plus_gender[1] = 0; + return 0; +} + +int EdfSetBirthdate(const int handle, const int year, const int month, const int day) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + if ((year < 1800) || (year > 3000) || (month < 1) || (month > 12) || (day < 1) || (day > 31)) { return -1; } + sprintf(hdrlist[handle]->plus_birthdate, "%02i.%02i.%02i%02i", day, month, year / 100, year % 100); + hdrlist[handle]->plus_birthdate[10] = 0; + return 0; +} + +int EdfSetPatientAdditional(const int handle, const char* additional) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + strncpy(hdrlist[handle]->plus_patient_additional, additional, 80); + hdrlist[handle]->plus_patient_additional[80] = 0; + RemovePaddingTrailingSpaces(hdrlist[handle]->plus_patient_additional); + return 0; +} + +int EdfSetAdmincode(const int handle, const char* admincode) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + strncpy(hdrlist[handle]->plus_admincode, admincode, 80); + hdrlist[handle]->plus_admincode[80] = 0; + RemovePaddingTrailingSpaces(hdrlist[handle]->plus_admincode); + return 0; +} + +int EdfSetTechnician(const int handle, const char* technician) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + strncpy(hdrlist[handle]->plus_technician, technician, 80); + hdrlist[handle]->plus_technician[80] = 0; + RemovePaddingTrailingSpaces(hdrlist[handle]->plus_technician); + return 0; +} + +int EdfSetEquipment(const int handle, const char* equipment) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + strncpy(hdrlist[handle]->plus_equipment, equipment, 80); + hdrlist[handle]->plus_equipment[80] = 0; + RemovePaddingTrailingSpaces(hdrlist[handle]->plus_equipment); + return 0; +} + +int EdfSetRecordingAdditional(const int handle, const char* additional) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + strncpy(hdrlist[handle]->plus_recording_additional, additional, 80); + hdrlist[handle]->plus_recording_additional[80] = 0; + RemovePaddingTrailingSpaces(hdrlist[handle]->plus_recording_additional); + return 0; +} + +int EdfSetStartdatetime(const int handle, const int year, const int month, const int day, const int hour, const int minute, const int second) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + if ((year < 1970) || (year > 3000) || (month < 1) || (month > 12) || + (day < 1) || (day > 31) || (hour < 0) || (hour > 23) || + (minute < 0) || (minute > 59) || (second < 0) || (second > 59)) { return -1; } + + hdrlist[handle]->startdate_year = year; + hdrlist[handle]->startdate_month = month; + hdrlist[handle]->startdate_day = day; + hdrlist[handle]->starttime_hour = hour; + hdrlist[handle]->starttime_minute = minute; + hdrlist[handle]->starttime_second = second; + return 0; +} + +int EdfwriteAnnotationUTF8(const int handle, const long long onset, const long long duration, const char* description) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (onset < 0LL) { return -1; } + + struct edf_write_annotationblock* listAnnot = (struct edf_write_annotationblock*)calloc(1, sizeof(struct edf_write_annotationblock)); + if (listAnnot == NULL) { return -1; } + + listAnnot->onset = onset; + listAnnot->duration = duration; + strncpy(listAnnot->annotation, description, EDFLIB_WRITE_MAX_ANNOTATION_LEN); + listAnnot->annotation[EDFLIB_WRITE_MAX_ANNOTATION_LEN] = 0; + listAnnot->next_annotation = NULL; + listAnnot->former_annotation = NULL; + + for (int i = 0; ; ++i) + { + if (listAnnot->annotation[i] == 0) { break; } + if (listAnnot->annotation[i] < 32) { listAnnot->annotation[i] = '.'; } + } + + if (write_annotationslist[handle] == NULL) { write_annotationslist[handle] = listAnnot; } + else + { + struct edf_write_annotationblock* tmpAnnot = write_annotationslist[handle]; + while (tmpAnnot->next_annotation != NULL) { tmpAnnot = tmpAnnot->next_annotation; } + tmpAnnot->next_annotation = listAnnot; + } + + return 0; +} + +int EdfwriteAnnotationLatin1(const int handle, const long long onset, const long long duration, const char* description) +{ + char str[EDFLIB_WRITE_MAX_ANNOTATION_LEN + 1]; + + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (onset < 0LL) { return -1; } + + struct edf_write_annotationblock* listAnnot = (struct edf_write_annotationblock*)calloc(1, sizeof(struct edf_write_annotationblock)); + if (listAnnot == NULL) { return -1; } + + listAnnot->onset = onset; + listAnnot->duration = duration; + strncpy(str, description, EDFLIB_WRITE_MAX_ANNOTATION_LEN); + str[EDFLIB_WRITE_MAX_ANNOTATION_LEN] = 0; + Latin12UTF8(str, (int)strlen(str)); + strncpy(listAnnot->annotation, str, EDFLIB_WRITE_MAX_ANNOTATION_LEN); + listAnnot->annotation[EDFLIB_WRITE_MAX_ANNOTATION_LEN] = 0; + listAnnot->next_annotation = NULL; + listAnnot->former_annotation = NULL; + + if (write_annotationslist[handle] == NULL) { write_annotationslist[handle] = listAnnot; } + else + { + struct edf_write_annotationblock* tmpAnnot = write_annotationslist[handle]; + while (tmpAnnot->next_annotation != NULL) { tmpAnnot = tmpAnnot->next_annotation; } + tmpAnnot->next_annotation = listAnnot; + } + + return 0; +} + +void RemovePaddingTrailingSpaces(char* str) +{ + int i; + + while (str[0] == ' ') + { + for (i = 0; ; ++i) + { + if (str[i] == 0) { break; } + str[i] = str[i + 1]; + } + } + + for (i = (int)strlen(str); i > 0; i--) + { + if (str[i - 1] == ' ') { str[i - 1] = 0; } + else { break; } + } +} + +int EdfSetPrefilter(const int handle, const int edfsignal, const char* prefilter) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (edfsignal < 0) { return -1; } + if (edfsignal >= hdrlist[handle]->edfsignals) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + strncpy(hdrlist[handle]->edfparam[edfsignal].prefilter, prefilter, 80); + hdrlist[handle]->edfparam[edfsignal].prefilter[80] = 0; + RemovePaddingTrailingSpaces(hdrlist[handle]->edfparam[edfsignal].prefilter); + return 0; +} + +int EdfSetTransducer(const int handle, const int edfsignal, const char* transducer) +{ + if (handle < 0) { return -1; } + if (handle >= EDFLIB_MAXFILES) { return -1; } + if (hdrlist[handle] == NULL) { return -1; } + if (!(hdrlist[handle]->writemode)) { return -1; } + if (edfsignal < 0) { return -1; } + if (edfsignal >= hdrlist[handle]->edfsignals) { return -1; } + if (hdrlist[handle]->datarecords) { return -1; } + strncpy(hdrlist[handle]->edfparam[edfsignal].transducer, transducer, 80); + hdrlist[handle]->edfparam[edfsignal].transducer[80] = 0; + RemovePaddingTrailingSpaces(hdrlist[handle]->edfparam[edfsignal].transducer); + return 0; +} + +/* minimum is the minimum digits that will be printed (minus sign not included), leading zero's will be added if necessary */ +/* if sign is zero, only negative numbers will have the sign '-' character */ +/* if sign is one, the sign '+' or '-' character will always be printed */ +/* returns the amount of characters printed */ +int FprintIntNumberNonlocalized(FILE* file, int q, int minimum, const int sign) +{ + int flag = 0, j = 0, base = 1000000000; + if (minimum < 0) { minimum = 0; } + if (minimum > 9) { flag = 1; } + + if (q < 0) + { + fputc('-', file); + j++; + q = -q; + } + else + { + if (sign) + { + fputc('+', file); + j++; + } + } + + for (int i = 10; i; i--) + { + if (minimum == i) { flag = 1; } + + const int z = q / base; + q %= base; + + if (z || flag) + { + fputc('0' + z, file); + j++; + flag = 1; + } + base /= 10; + } + + if (!flag) + { + fputc('0', file); + j++; + } + + return j; +} + +/* minimum is the minimum digits that will be printed (minus sign not included), leading zero's will be added if necessary */ +/* if sign is zero, only negative numbers will have the sign '-' character */ +/* if sign is one, the sign '+' or '-' character will always be printed */ +/* returns the amount of characters printed */ +int FprintLLNumberNonlocalized(FILE* file, long long q, int minimum, const int sign) +{ + int flag = 0, j = 0; + long long base = 1000000000000000000LL; + if (minimum < 0) { minimum = 0; } + if (minimum > 18) { flag = 1; } + + if (q < 0LL) + { + fputc('-', file); + j++; + q = -q; + } + else + { + if (sign) + { + fputc('+', file); + j++; + } + } + + for (int i = 19; i; i--) + { + if (minimum == i) { flag = 1; } + + const int z = (int)(q / base); + q %= base; + + if (z || flag) + { + fputc('0' + z, file); + j++; + flag = 1; + } + base /= 10LL; + } + + if (!flag) + { + fputc('0', file); + j++; + } + + return j; +} + +/* minimum is the minimum digits that will be printed (minus sign not included), leading zero's will be added if necessary */ +/* if sign is zero, only negative numbers will have the sign '-' character */ +/* if sign is one, the sign '+' or '-' character will always be printed */ +/* returns the amount of characters printed */ +int SprintIntNumberNonlocalized(char* str, int q, int minimum, const int sign) +{ + int flag = 0, j = 0, base = 1000000000; + + if (minimum < 0) { minimum = 0; } + if (minimum > 9) { flag = 1; } + + if (q < 0) + { + str[j++] = '-'; + q = -q; + } + else { if (sign) { str[j++] = '+'; } } + + for (int i = 10; i; i--) + { + if (minimum == i) { flag = 1; } + + const int z = q / base; + q %= base; + + if (z || flag) + { + str[j++] = '0' + z; + flag = 1; + } + base /= 10; + } + + if (!flag) { str[j++] = '0'; } + str[j] = 0; + return j; +} + +/* minimum is the minimum digits that will be printed (minus sign not included), leading zero's will be added if necessary */ +/* if sign is zero, only negative numbers will have the sign '-' character */ +/* if sign is one, the sign '+' or '-' character will always be printed */ +/* returns the amount of characters printed */ +int SprintLLNumberNonlocalized(char* str, long long q, int minimum, const int sign) +{ + int flag = 0, j = 0; + long long base = 1000000000000000000LL; + + if (minimum < 0) { minimum = 0; } + if (minimum > 18) { flag = 1; } + + if (q < 0LL) + { + str[j++] = '-'; + q = -q; + } + else { if (sign) { str[j++] = '+'; } } + + for (int i = 19; i; i--) + { + if (minimum == i) { flag = 1; } + + const int z = (int)(q / base); + q %= base; + + if (z || flag) + { + str[j++] = '0' + z; + flag = 1; + } + base /= 10LL; + } + + if (!flag) { str[j++] = '0'; } + str[j] = 0; + return j; +} + +int SprintNumberNonlocalized(char* str, const double nr) +{ + int flag = 0, z, i, j = 0, base = 1000000000; + int q = (int)nr; + double var = nr - q; + + if (nr < 0.0) + { + str[j++] = '-'; + if (q < 0) { q = -q; } + } + + for (i = 10; i; i--) + { + z = q / base; + q %= base; + + if (z || flag) + { + str[j++] = '0' + z; + flag = 1; + } + base /= 10; + } + + if (!flag) { str[j++] = '0'; } + + base = 100000000; + var *= (base * 10); + q = (int)var; + + if (q < 0) { q = -q; } + + if (!q) + { + str[j] = 0; + return j; + } + + str[j++] = '.'; + + for (i = 9; i; i--) + { + z = q / base; + q %= base; + str[j++] = '0' + z; + base /= 10; + } + + str[j] = 0; + j--; + + for (; j > 0; j--) + { + if (str[j] == '0') { str[j] = 0; } + else + { + j++; + break; + } + } + return j; +} + +double AtofNonlocalized(const char* str) +{ + int i = 0, dotPos = -1, decimals = 0, sign = 1; + double value2 = 0.0; + const double value = AtoiNonlocalized(str); + + while (str[i] == ' ') { i++; } + + if ((str[i] == '+') || (str[i] == '-')) + { + if (str[i] == '-') { sign = -1; } + i++; + } + + for (; ; ++i) + { + if (str[i] == 0) { break; } + if (((str[i] < '0') || (str[i] > '9')) && (str[i] != '.')) { break; } + + if (dotPos >= 0) + { + if ((str[i] >= '0') && (str[i] <= '9')) { decimals++; } + else { break; } + } + + if (str[i] == '.') { if (dotPos < 0) { dotPos = i; } } + } + + if (decimals) + { + value2 = AtoiNonlocalized(str + dotPos + 1) * sign; + i = 1; + while (decimals--) { i *= 10; } + value2 /= i; + } + + return (value + value2); +} + +int AtoiNonlocalized(const char* str) +{ + int i = 0, value = 0, sign = 1; + + while (str[i] == ' ') { i++; } + + if ((str[i] == '+') || (str[i] == '-')) + { + if (str[i] == '-') { sign = -1; } + i++; + } + + for (; ; ++i) + { + if (str[i] == 0) { break; } + if ((str[i] < '0') || (str[i] > '9')) { break; } + + value *= 10; + value += (str[i] - '0'); + } + return (value * sign); +} diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/edf/edflib.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/edf/edflib.h new file mode 100644 index 0000000..b18f9e5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/edf/edflib.h @@ -0,0 +1,535 @@ +/* +***************************************************************************** +* +* Copyright (c) 2009, 2010, 2011 Teunis van Beelen +* All rights reserved. +* +* email: teuniz@gmail.com +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY Teunis van Beelen ''AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL Teunis van Beelen BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +***************************************************************************** +*/ + + +/* compile with options "-D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE" */ + + +#ifndef EDFLIB_INCLUDED +#define EDFLIB_INCLUDED + +#include +#include +#include +#include + +#define EDFLIB_TIME_DIMENSION (10000000LL) +#define EDFLIB_MAXSIGNALS 256 +#define EDFLIB_MAX_ANNOTATION_LEN 512 + +#define EDFSEEK_SET 0 +#define EDFSEEK_CUR 1 +#define EDFSEEK_END 2 + + +/* the following defines are used in the member "filetype" of the edf_hdr_struct */ +/* and as return value for the function edfopen_file_readonly() */ +#define EDFLIB_FILETYPE_EDF 0 +#define EDFLIB_FILETYPE_EDFPLUS 1 +#define EDFLIB_FILETYPE_BDF 2 +#define EDFLIB_FILETYPE_BDFPLUS 3 +#define EDFLIB_MALLOC_ERROR -1 +#define EDFLIB_NO_SUCH_FILE_OR_DIRECTORY -2 +#define EDFLIB_FILE_CONTAINS_FORMAT_ERRORS -3 +#define EDFLIB_MAXFILES_REACHED -4 +#define EDFLIB_FILE_READ_ERROR -5 +#define EDFLIB_FILE_ALREADY_OPENED -6 +#define EDFLIB_FILETYPE_ERROR -7 +#define EDFLIB_FILE_WRITE_ERROR -8 +#define EDFLIB_NUMBER_OF_SIGNALS_INVALID -9 +#define EDFLIB_FILE_IS_DISCONTINUOUS -10 +#define EDFLIB_INVALID_READ_ANNOTS_VALUE -11 + +/* values for annotations */ +#define EDFLIB_DO_NOT_READ_ANNOTATIONS 0 +#define EDFLIB_READ_ANNOTATIONS 1 +#define EDFLIB_READ_ALL_ANNOTATIONS 2 + +/* the following defines are possible errors returned by edfopen_file_writeonly() */ +#define EDFLIB_NO_SIGNALS -20 +#define EDFLIB_TOO_MANY_SIGNALS -21 +#define EDFLIB_NO_SAMPLES_IN_RECORD -22 +#define EDFLIB_DIGMIN_IS_DIGMAX -23 +#define EDFLIB_DIGMAX_LOWER_THAN_DIGMIN -24 +#define EDFLIB_PHYSMIN_IS_PHYSMAX -25 + + +#ifdef __cplusplus +extern "C" { +#endif + + +struct edf_param_struct // this structure contains all the relevant EDF-signal parameters of one signal +{ + char label[17]; // label (name) of the signal, null-terminated string + long long smp_in_file; // number of samples of this signal in the file + double phys_max; // physical maximum + double phys_min; // physical minimum + int dig_max; // digital maximum + int dig_min; // digital minimum + int smp_in_datarecord; // number of samples of this signal in a datarecord + char physdimension[9]; // physical dimension (uV, bpm, mA, etc.), null-terminated string + char prefilter[81]; // null-terminated string + char transducer[81]; // null-terminated string +}; + + +struct edf_annotation_struct // this structure is used for annotations +{ + long long onset; // onset time of the event, expressed in units of 100 nanoSeconds + char duration[16]; // duration time, this is a null-terminated ASCII text-string + char annotation[EDFLIB_MAX_ANNOTATION_LEN + 1]; // description of the event in UTF-8, this is a null terminated string +}; + + +struct edf_hdr_struct // this structure contains all the relevant EDF header info and will be filled when calling the function edf_open_file_readonly() +{ + int handle; // a handle (identifier) used to distinguish the different files + int filetype; // 0: EDF, 1: EDFplus, 2: BDF, 3: BDFplus, a negative number means an error + int edfsignals; // number of EDF signals in the file, annotation channels are NOT included + long long file_duration; // duration of the file expressed in units of 100 nanoSeconds + int startdate_day; + int startdate_month; + int startdate_year; + long long + starttime_subsecond; // starttime offset expressed in units of 100 nanoSeconds. Is always less than 10000000 (one second). Only used by EDFplus and BDFplus + int starttime_second; + int starttime_minute; + int starttime_hour; + char patient[81]; // null-terminated string, contains patientfield of header, is always empty when filetype is EDFPLUS or BDFPLUS + char recording[81 + ]; // null-terminated string, contains recordingfield of header, is always empty when filetype is EDFPLUS or BDFPLUS + char patientcode[81]; // null-terminated string, is always empty when filetype is EDF or BDF + char gender[16]; // null-terminated string, is always empty when filetype is EDF or BDF + char birthdate[16]; // null-terminated string, is always empty when filetype is EDF or BDF + char patient_name[81]; // null-terminated string, is always empty when filetype is EDF or BDF + char patient_additional[81]; // null-terminated string, is always empty when filetype is EDF or BDF + char admincode[81]; // null-terminated string, is always empty when filetype is EDF or BDF + char technician[81]; // null-terminated string, is always empty when filetype is EDF or BDF + char equipment[81]; // null-terminated string, is always empty when filetype is EDF or BDF + char recording_additional[81]; // null-terminated string, is always empty when filetype is EDF or BDF + long long datarecord_duration; // duration of a datarecord expressed in units of 100 nanoSeconds + long long datarecords_in_file; // number of datarecords in the file + long long annotations_in_file; // number of annotations in the file + struct edf_param_struct signalparam[EDFLIB_MAXSIGNALS]; // array of structs which contain the relevant signal parameters +}; + + +int edflib_version(); + +/* Returns the version number of this library, multiplied by hundred. if version is "1.00" than it will return 100 */ + + +/***************** the following functions are used to read files **************************/ + + +int EdfopenFileReadonly(const char* path, struct edf_hdr_struct* edfhdr, const int readAnnotations); + +/* opens an existing file for reading */ +/* path is a null-terminated string containing the path to the file */ +/* hdr is a pointer to an edf_hdr_struct, all fields in this struct will be overwritten */ +/* the edf_hdr_struct will be filled with all the relevant header- and signalinfo/parameters */ + +/* read_annotations must have one of the following values: */ +/* EDFLIB_DO_NOT_READ_ANNOTATIONS annotations will not be read (this saves time when opening a very large EDFplus or BDFplus file */ +/* EDFLIB_READ_ANNOTATIONS annotations will be read immediately, stops when an annotation has */ +/* been found which contains the description "Recording ends" */ +/* EDFLIB_READ_ALL_ANNOTATIONS all annotations will be read immediately */ + +/* returns 0 on success, in case of an error it returns -1 and an errorcode will be set in the member "filetype" of struct edf_hdr_struct */ +/* This function is required if you want to read a file */ + + +int EdfcloseFile(const int handle); + +/* closes and finalizes the file */ +/* returns -1 in case of an error, 0 on success */ +/* this function MUST be called when you are finished reading or writing */ +/* This function is required after reading or writing. Failing to do so will cause */ +/* unnessecary memory usage and in case of writing it will cause a corrupted and incomplete file */ + + +int EdfreadPhysicalSamples(const int handle, const int edfsignal, int n, double* buf); + +/* reads n samples from edfsignal, starting from the current sample position indicator, into buf (edfsignal starts at 0) */ +/* the values are converted to their physical values e.g. microVolts, beats per minute, etc. */ +/* bufsize should be equal to or bigger than sizeof(double[n]) */ +/* the sample position indicator will be increased with the amount of samples read */ +/* returns the amount of samples read (this can be less than n or zero!) */ +/* or -1 in case of an error */ + + +int EdfreadDigitalSamples(const int handle, const int edfsignal, int n, int* buf); + +/* reads n samples from edfsignal, starting from the current sample position indicator, into buf (edfsignal starts at 0) */ +/* the values are the "raw" digital values */ +/* bufsize should be equal to or bigger than sizeof(int[n]) */ +/* the sample position indicator will be increased with the amount of samples read */ +/* returns the amount of samples read (this can be less than n or zero!) */ +/* or -1 in case of an error */ + + +long long edfseek(const int handle, const int edfsignal, const long long offset, const int whence); + +/* The edfseek() function sets the sample position indicator for the edfsignal pointed to by edfsignal. */ +/* The new position, measured in samples, is obtained by adding offset samples to the position specified by whence. */ +/* If whence is set to EDFSEEK_SET, EDFSEEK_CUR, or EDFSEEK_END, the offset is relative to the start of the file, */ +/* the current position indicator, or end-of-file, respectively. */ +/* Returns the current offset. Otherwise, -1 is returned. */ +/* note that every signal has it's own independent sample position indicator and edfseek() affects only one of them */ + + +long long edftell(const int handle, const int edfsignal); + +/* The edftell() function obtains the current value of the sample position indicator for the edfsignal pointed to by edfsignal. */ +/* Returns the current offset. Otherwise, -1 is returned */ +/* note that every signal has it's own independent sample position indicator and edftell() affects only one of them */ + + +void edfrewind(const int handle, const int edfsignal); + +/* The edfrewind() function sets the sample position indicator for the edfsignal pointed to by edfsignal to the beginning of the file. */ +/* It is equivalent to: () edfseek(int handle, int edfsignal, 0LL, EDFSEEK_SET) */ +/* note that every signal has it's own independent sample position indicator and edfrewind() affects only one of them */ + + +int EdfGetAnnotation(const int handle, const int n, struct edf_annotation_struct* annot); + +/* Fills the edf_annotation_struct with the annotation n, returns 0 on success, otherwise -1 */ +/* To obtain the number of annotations in a file, check edf_hdr_struct -> annotations_in_file */ + +/* +Notes: + +Annotationsignals + +EDFplus and BDFplus store the annotations in one or more signals (in order to be backwards compatibel with EDF and BDF). +The counting of the signals in the file starts at 0. Signals used for annotations are skipped by EDFlib. +This means that the annotationsignal(s) in the file are hided. +Use the function edf_get_annotation() to get the annotations. + +So, when a file contains 5 signals and the third signal is used to store the annotations, the library will +report that there are only 4 signals in the file. +The library will "map" the signalnumbers as follows: 0->0, 1->1, 2->3, 3->4. +This way you don't need to worry about which signals are annotationsignals. The library will do it for you. + +How the library stores time-values + +To avoid rounding errors, the library stores some timevalues in variables of type long long int. +In order not to loose the subsecond precision, all timevalues have been multiplied by 10000000. +This will limit the timeresolution to 100 nanoSeconds. To calculate the amount of seconds, divide +the timevalue by 10000000 or use the macro EDFLIB_TIME_DIMENSION which is declared in edflib.h. +The following variables do use this when you open a file in read mode: "file_duration", "starttime_subsecond" and "onset". +*/ + + +/***************** the following functions are used to write files **************************/ + + +int EdfopenFileWriteonly(const char* path, const int filetype, const int nSignals); + +/* opens an new file for writing. warning, an already existing file with the same name will be silently overwritten without advance warning!! */ +/* path is a null-terminated string containing the path and name of the file */ +/* filetype must be EDFLIB_FILETYPE_EDFPLUS or EDFLIB_FILETYPE_BDFPLUS */ +/* returns a handle on success, you need this handle for the other functions */ +/* in case of an error it returns a negative number corresponding to one of the following values: */ +/* EDFLIB_MALLOC_ERROR */ +/* EDFLIB_NO_SUCH_FILE_OR_DIRECTORY */ +/* EDFLIB_MAXFILES_REACHED */ +/* EDFLIB_FILE_ALREADY_OPENED */ +/* EDFLIB_NUMBER_OF_SIGNALS_INVALID */ +/* This function is required if you want to write a file */ + + +int EdfSetSampling(const int handle, const int edfsignal, const int sampling); + +/* Sets the sampling of signal edfsignal. */ +/* Returns 0 on success, otherwise -1 */ +/* This function is required for every signal and can be called only after opening a */ +/* file in writemode and before the first sample write action */ + + +int EdfSetPhysicalMaximum(const int handle, const int edfsignal, const double max); + +/* Sets the maximum physical value of signal edfsignal. */ +/* Returns 0 on success, otherwise -1 */ +/* This function is required for every signal and can be called only after opening a */ +/* file in writemode and before the first sample write action */ + + +int EdfSetPhysicalMinimum(const int handle, const int edfsignal, const double min); + +/* Sets the minimum physical value of signal edfsignal. */ +/* Usually this will be (-(phys_max)) */ +/* Returns 0 on success, otherwise -1 */ +/* This function is required for every signal and can be called only after opening a */ +/* file in writemode and before the first sample write action */ + + +int EdfSetDigitalMaximum(const int handle, const int edfsignal, const int max); + +/* Sets the maximum digital value of signal edfsignal. Usually, the value 32767 is used for EDF+ and 8388607 for BDF+ */ +/* Returns 0 on success, otherwise -1 */ +/* This function is required for every signal and can be called only after opening a file in writemode */ +/* and before the first sample write action */ + + +int EdfSetDigitalMinimum(const int handle, const int edfsignal, const int min); + +/* Sets the minimum digital value of signal edfsignal. Usually, the value -32768 is used for EDF+ and -8388608 for BDF+ */ +/* Usually this will be (-(dig_max + 1)) */ +/* Returns 0 on success, otherwise -1 */ +/* This function is required for every signal and can be called only after opening a file in writemode */ +/* and before the first sample write action */ + + +int EdfSetLabel(const int handle, const int edfsignal, const char* label); + +/* Sets the label (name) of signal edfsignal. ("FP1", "SaO2", etc.) */ +/* label is a pointer to a NULL-terminated ASCII-string containing the label (name) of the signal edfsignal */ +/* Returns 0 on success, otherwise -1 */ +/* This function is recommended for every signal when you want to write a file */ +/* and can be called only after opening a file in writemode and before the first sample write action */ + + +int EdfSetPrefilter(const int handle, const int edfsignal, const char* prefilter); + +/* Sets the prefilter of signal edfsignal ("HP:0.1Hz", "LP:75Hz N:50Hz", etc.). */ +/* prefilter is a pointer to a NULL-terminated ASCII-string containing the prefilter text of the signal edfsignal */ +/* Returns 0 on success, otherwise -1 */ +/* This function is optional and can be called only after opening a file in writemode and before */ +/* the first sample write action */ + + +int EdfSetTransducer(const int handle, const int edfsignal, const char* transducer); + +/* Sets the transducer of signal edfsignal ("AgAgCl cup electrodes", etc.). */ +/* transducer is a pointer to a NULL-terminated ASCII-string containing the transducer text of the signal edfsignal */ +/* Returns 0 on success, otherwise -1 */ +/* This function is optional and can be called only after opening a file in writemode and before */ +/* the first sample write action */ + + +int EdfSetPhysicalDimension(const int handle, const int edfsignal, const char* dim); + +/* Sets the physical dimension of signal edfsignal. ("uV", "BPM", "mA", "Degr.", etc.) */ +/* phys_dim is a pointer to a NULL-terminated ASCII-string containing the physical dimension of the signal edfsignal */ +/* Returns 0 on success, otherwise -1 */ +/* This function is recommended for every signal when you want to write a file */ +/* and can be called only after opening a file in writemode and before the first sample write action */ + + +int EdfSetStartdatetime(const int handle, const int year, const int month, const int day, const int hour, const int minute, const int second); + +/* Sets the startdate and starttime. */ +/* year: 1970 - 3000, month: 1 - 12, day: 1 - 31 */ +/* hour: 0 - 23, minute: 0 - 59, second: 0 - 59 */ +/* If not called, the library will use the system date and time at runtime */ +/* Returns 0 on success, otherwise -1 */ +/* This function is optional and can be called only after opening a file in writemode */ +/* and before the first sample write action */ + + +int EdfSetPatientname(const int handle, const char* patientname); + +/* Sets the patientname. patientname is a pointer to a null-terminated ASCII-string. */ +/* Returns 0 on success, otherwise -1 */ +/* This function is optional and can be called only after opening a file in writemode */ +/* and before the first sample write action */ + + +int EdfSetPatientcode(const int handle, const char* patientcode); + +/* Sets the patientcode. patientcode is a pointer to a null-terminated ASCII-string. */ +/* Returns 0 on success, otherwise -1 */ +/* This function is optional and can be called only after opening a file in writemode */ +/* and before the first sample write action */ + + +int EdfSetGender(const int handle, const int gender); + +/* Sets the gender. 1 is male, 0 is female. */ +/* Returns 0 on success, otherwise -1 */ +/* This function is optional and can be called only after opening a file in writemode */ +/* and before the first sample write action */ + + +int EdfSetBirthdate(const int handle, const int year, const int month, const int day); + +/* Sets the birthdate. */ +/* year: 1800 - 3000, month: 1 - 12, day: 1 - 31 */ +/* This function is optional */ +/* Returns 0 on success, otherwise -1 */ +/* This function is optional and can be called only after opening a file in writemode */ +/* and before the first sample write action */ + + +int EdfSetPatientAdditional(const int handle, const char* additional); + +/* Sets the additional patientinfo. patient_additional is a pointer to a null-terminated ASCII-string. */ +/* Returns 0 on success, otherwise -1 */ +/* This function is optional and can be called only after opening a file in writemode */ +/* and before the first sample write action */ + + +int EdfSetAdmincode(const int handle, const char* admincode); + +/* Sets the admincode. admincode is a pointer to a null-terminated ASCII-string. */ +/* Returns 0 on success, otherwise -1 */ +/* This function is optional and can be called only after opening a file in writemode */ +/* and before the first sample write action */ + + +int EdfSetTechnician(const int handle, const char* technician); + +/* Sets the technicians name. technician is a pointer to a null-terminated ASCII-string. */ +/* Returns 0 on success, otherwise -1 */ +/* This function is optional and can be called only after opening a file in writemode */ +/* and before the first sample write action */ + + +int EdfSetEquipment(const int handle, const char* equipment); + +/* Sets the name of the equipment used during the aquisition. equipment is a pointer to a null-terminated ASCII-string. */ +/* Returns 0 on success, otherwise -1 */ +/* This function is optional and can be called only after opening a file in writemode */ +/* and before the first sample write action */ + + +int EdfSetRecordingAdditional(const int handle, const char* additional); + +/* Sets the additional recordinginfo. recording_additional is a pointer to a null-terminated ASCII-string. */ +/* Returns 0 on success, otherwise -1 */ +/* This function is optional and can be called only after opening a file in writemode */ +/* and before the first sample write action */ + + +int EdfwritePhysicalSamples(const int handle, const double* buf); + +/* Writes n physical samples (uV, mA, Ohm) from *buf belonging to one signal */ +/* where n is the sampling of the signal. */ +/* The physical samples will be converted to digital samples using the */ +/* values of physical maximum, physical minimum, digital maximum and digital minimum */ +/* The number of samples written is equal to the sampling of the signal */ +/* Size of buf should be equal to or bigger than sizeof(double[sampling]) */ +/* Call this function for every signal in the file. The order is important! */ +/* When there are 4 signals in the file, the order of calling this function */ +/* must be: signal 0, signal 1, signal 2, signal 3, signal 0, signal 1, signal 2, etc. */ +/* Returns 0 on success, otherwise -1 */ + + +int EdfBlockwritePhysicalSamples(const int handle, const double* buf); + +/* Writes physical samples (uV, mA, Ohm) from *buf */ +/* buf must be filled with samples from all signals, starting with n samples of signal 0, n samples of signal 1, n samples of signal 2, etc. */ +/* where n is the sampling of the signal. */ +/* buf must be filled with samples from all signals, starting with signal 0, 1, 2, etc. */ +/* one block equals one second */ +/* The physical samples will be converted to digital samples using the */ +/* values of physical maximum, physical minimum, digital maximum and digital minimum */ +/* The number of samples written is equal to the sum of the samplefrequencies of all signals */ +/* Size of buf should be equal to or bigger than sizeof(double) multiplied by the sum of the samplefrequencies of all signals */ +/* Returns 0 on success, otherwise -1 */ + + +int EdfwriteDigitalSamples(const int handle, const int* buf); + +/* Writes n "raw" digital samples from *buf belonging to one signal */ +/* where n is the sampling of the signal. */ +/* The 16 (or 24 in case of BDF) least significant bits of the sample will be written to the */ +/* file without any conversion. */ +/* The number of samples written is equal to the sampling of the signal */ +/* Size of buf should be equal to or bigger than sizeof(int[sampling]) */ +/* Call this function for every signal in the file. The order is important! */ +/* When there are 4 signals in the file, the order of calling this function */ +/* must be: signal 0, signal 1, signal 2, signal 3, signal 0, signal 1, signal 2, etc. */ +/* Returns 0 on success, otherwise -1 */ + + +int EdfBlockwriteDigitalSamples(const int handle, const int* buf); + +/* Writes "raw" digital samples from *buf. */ +/* buf must be filled with samples from all signals, starting with n samples of signal 0, n samples of signal 1, n samples of signal 2, etc. */ +/* where n is the sampling of the signal. */ +/* One block equals one second. */ +/* The 16 (or 24 in case of BDF) least significant bits of the sample will be written to the */ +/* file without any conversion. */ +/* The number of samples written is equal to the sum of the samplefrequencies of all signals. */ +/* Size of buf should be equal to or bigger than sizeof(int) multiplied by the sum of the samplefrequencies of all signals */ +/* Returns 0 on success, otherwise -1 */ + + +int EdfwriteAnnotationUTF8(const int handle, const long long onset, const long long duration, const char* description); + +/* writes an annotation/event to the file */ +/* onset is relative to the starttime and startdate of the file */ +/* onset and duration are in units of 100 microSeconds! resolution is 0.0001 second! */ +/* for example: 34.071 seconds must be written as 340710 */ +/* if duration is unknown or not applicable: set a negative number (-1) */ +/* description is a null-terminated UTF8-string containing the text that describes the event */ +/* This function is optional and can be called only after opening a file in writemode */ +/* and before closing the file */ + + +int EdfwriteAnnotationLatin1(const int handle, const long long onset, const long long duration, const char* description); + +/* writes an annotation/event to the file */ +/* onset is relative to the starttime and startdate of the file */ +/* onset and duration are in units of 100 microSeconds! resolution is 0.0001 second! */ +/* for example: 34.071 seconds must be written as 340710 */ +/* if duration is unknown or not applicable: set a negative number (-1) */ +/* description is a null-terminated Latin1-string containing the text that describes the event */ +/* This function is optional and can be called only after opening a file in writemode */ +/* and before closing the file */ + + +int EdfSetDatarecordDuration(const int handle, const int duration); + +/* Sets the datarecord duration. The default value is 1 second. */ +/* ATTENTION: the argument "duration" is expressed in units of 10 microSeconds! */ +/* So, if you want to set the datarecord duration to 0.1 second, you must give */ +/* the argument "duration" a value of "10000". */ +/* This function is optional, normally you don't need to change the default value. */ +/* The datarecord duration must be in the range 0.025 to 20.0 seconds. */ +/* Returns 0 on success, otherwise -1 */ +/* This function is NOT REQUIRED but can be called after opening a */ +/* file in writemode and before the first sample write action. */ +/* This function can be used when you want to use a samplerate */ +/* which is not an integer. For example, if you want to use a samplerate of 0.5 Hz, */ +/* set the sampling to 5 Hz and the datarecord duration to 10 seconds, */ +/* or set the sampling to 1 Hz and the datarecord duration to 2 seconds. */ +/* Do not use this function, except when absolutely necessary! */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmBrainampFileWriterGipsa.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmBrainampFileWriterGipsa.cpp new file mode 100644 index 0000000..f226a31 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmBrainampFileWriterGipsa.cpp @@ -0,0 +1,315 @@ +/* Project: Gipsa-lab plugins for OpenVibe + * AUTHORS AND CONTRIBUTORS: Andreev A., Barachant A., Congedo M., Ionescu,Gelu, + + * This file is part of "Gipsa-lab plugins for OpenVibe". + * You can redistribute it and/or modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * You should have received a copy of the GNU General Public License along with Brain Invaders. If not, see http://www.gnu.org/licenses/. + */ + +#include "ovpCBoxAlgorithmBrainampFileWriterGipsa.h" + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + + +//documentation Appendix B EEG file format: http://tsgdoc.socsci.ru.nl/images/d/d1/BrainVision_Recorder_UM.pdf + +bool CBoxAlgorithmBrainampFileWriterGipsa::initialize() +{ + m_isVmrkHeaderFileWritten = false; + + //init input signal 1 + m_streamDecoder = new Toolkit::TSignalDecoder(*this, 0); + + //init input stimulation 1 + m_stimDecoder = new Toolkit::TStimulationDecoder(*this, 1); + + //Get parameters: + const CString filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + const CString tmp = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + const CIdentifier binaryFormatID = this->getTypeManager().getEnumerationEntryValueFromName(OVP_TypeId_BinaryFormat, tmp); + + if (binaryFormatID == OVP_TypeId_BinaryFormat_int16_t) { m_binaryFormat = BinaryFormat_Integer16; } + else if (binaryFormatID == OVP_TypeId_BinaryFormat_uint16_t) { m_binaryFormat = BinaryFormat_UnsignedInteger16; } + else if (binaryFormatID == OVP_TypeId_BinaryFormat_float) { m_binaryFormat = BinaryFormat_Float32; } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Unknown binary format: " << binaryFormatID << "\n"; + return false; + } + + //Perform checks: + if (std::string(filename).empty()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Header file path is empty!\n"; + return false; + } + + if (std::string(filename).substr(filename.length() - 5, 5) != std::string(".vhdr")) + { + this->getLogManager() << Kernel::LogLevel_Warning << "The supplied output file does not end with .vhdr\n"; + } + + m_headerFilename = filename; + + m_headerFile.open(m_headerFilename.c_str()); + if (!m_headerFile.good()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Could not open header file [" << m_headerFilename << "]\n"; + return false; + } + + //this->getLogManager() << Kernel::LogLevel_ImportantWarning << m_sHeaderFilename << "\n"; + + m_dataFilename = m_headerFilename.substr(0, m_headerFilename.length() - 5) + std::string(".eeg"); + + m_dataFile.open(m_dataFilename.c_str(), std::ios::binary); + if (!m_dataFile.good()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Could not open data file [" << m_dataFilename << "]\n"; + return false; + } + + m_markerFilename = m_headerFilename.substr(0, m_headerFilename.length() - 5) + std::string(".vmrk"); + + m_markerFile.open(m_markerFilename.c_str()); + if (!m_markerFile.good()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Could not open marker file [" << m_markerFilename << "]\n"; + return false; + } + + return true; +} + +bool CBoxAlgorithmBrainampFileWriterGipsa::uninitialize() +{ + if (m_streamDecoder) + { + m_streamDecoder->uninitialize(); + delete m_streamDecoder; + } + + // uninit input stimulation + if (m_stimDecoder) + { + m_stimDecoder->uninitialize(); + delete m_stimDecoder; + } + + //close files + m_headerFile.flush(); + m_headerFile.close(); + + m_dataFile.flush(); + m_dataFile.close(); + + m_markerFile.flush(); + m_markerFile.close(); + + return true; +} + +bool CBoxAlgorithmBrainampFileWriterGipsa::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmBrainampFileWriterGipsa::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + //1. Process signal + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) //first input channel data + { + m_streamDecoder->decode(i); + + //HEADER + if (m_streamDecoder->isHeaderReceived()) + { + m_matrix = m_streamDecoder->getOutputMatrix(); + m_sampling = m_streamDecoder->getOutputSamplingRate(); + + writeHeaderFile(); + } + + //BUFFER + if (m_streamDecoder->isBufferReceived()) + { + // size_t channelCount = m_Matrix->getDimensionSize(0); + switch (m_binaryFormat) + { + case BinaryFormat_Integer16: + saveBuffer(int16_t(0)); + break; + + case BinaryFormat_UnsignedInteger16: + saveBuffer(uint16_t(0)); + break; + + case BinaryFormat_Float32: + saveBuffer(float(0)); + break; + default: break; + } + } + + //END + if (m_streamDecoder->isEndReceived()) { } + + boxContext.markInputAsDeprecated(0, i); + } + + // Make sure the marker file header is written in any case + if (!m_isVmrkHeaderFileWritten) + { + const boost::posix_time::ptime now = boost::posix_time::second_clock::local_time(); + const std::string formated(formatTime(now)); + + m_markerFile << "Brain Vision Data Exchange Marker File, Version 1.0" << std::endl << std::endl + << "[Common Infos]" << std::endl + << "Codepage=ANSI" << std::endl + << "DataFile=" << getShortName(m_dataFilename) << std::endl << std::endl + << "[Marker Infos]" << std::endl + << "; Each entry: Mk=,,," << std::endl + << "; , " << std::endl + << "; Fields are delimited by commas, some fields might be omitted (empty)." << std::endl + << "; Commas in type or description text are coded as \"\\1\"." << std::endl + << "Mk1=New Segment,,1,1,0," << formated << "000000" << std::endl; + + m_isVmrkHeaderFileWritten = true; + } + + //2. Process stimulations - input channel 1 + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + // uint64_t chunkStartTime =boxContext.getInputChunkStartTime(0, i); + + m_stimDecoder->decode(i); + + //buffer + if (m_stimDecoder->isBufferReceived()) + { + IStimulationSet* stimSet = m_stimDecoder->getOutputStimulationSet(); + + // Loop on stimulations + for (size_t j = 0; j < stimSet->getStimulationCount(); ++j) + { + const uint64_t code = stimSet->getStimulationIdentifier(j); + const uint64_t position = CTime(stimSet->getStimulationDate(j)).toSampleCount(m_sampling) + 1; + + m_markerFile << "Mk" << m_stimulationCounter << "=Stimulus," << "S" << std::right << std::setw(3) << code << "," << position << ",1,0" << std:: + endl; + + m_stimulationCounter++; + } + } + + boxContext.markInputAsDeprecated(1, i); + } + + return true; +} + +bool CBoxAlgorithmBrainampFileWriterGipsa::writeHeaderFile() +{ + const size_t nChannel = m_matrix->getDimensionSize(0); + // size_t samplesPerChunk = m_Matrix->getDimensionSize(1); + + const double samplingInterval = 1000000.0 / double(m_sampling); + + CString format("UNKNOWN"); + switch (m_binaryFormat) + { + case BinaryFormat_Integer16: + format = "INT_16"; + break; + + case BinaryFormat_UnsignedInteger16: + format = "UINT_16"; + break; + + case BinaryFormat_Float32: + format = "IEEE_FLOAT_32"; + break; + default: + this->getLogManager() << Kernel::LogLevel_Error << "EEG format unknown!\n"; + break; + } + + m_headerFile << "Brain Vision Data Exchange Header File Version 1.0" << std::endl + << "; Data created by the Vision Recorder" << std::endl << std::endl + << "[Common Infos]" << std::endl + << "Codepage=ANSI" << std::endl + << "DataFile=" << getShortName(m_dataFilename) << std::endl + << "MarkerFile=" << getShortName(m_markerFilename) << std::endl + << "DataFormat=BINARY" << std::endl + << "; Data orientation: MULTIPLEXED=ch1,pt1, ch2,pt1 ..." << std::endl //sample 1, sample 2 ... + << "DataOrientation=MULTIPLEXED" << std::endl + << "NumberOfChannels=" << nChannel << std::endl + << "; Sampling interval in microseconds" << std::endl + << "SamplingInterval=" << std::fixed << std::setprecision(5) << samplingInterval << std::endl + << std::endl + << "[Binary Infos]" << std::endl + << "BinaryFormat=" << format.toASCIIString() << std::endl + << std::endl; + + m_headerFile << "[Channel Infos]" << std::endl + << "; Each entry: Ch=,," << std::endl + << "; ,, Future extensions.." << std::endl + << "; Fields are delimited by commas, some fields might be omitted (empty)." << std::endl + << "; Commas in channel names are coded as \"\\1\"." << std::endl; + + for (size_t i = 0; i < nChannel; ++i) + { + m_headerFile << "Ch" << (i + 1) << "=" << m_matrix->getDimensionLabel(0, i) << ",,1," << std::endl; //resolution = 1 + } + + m_headerFile << std::endl; + + m_headerFile << "[Comment]" << std::endl << std::endl + << "A m p l i f i e r S e t u p" << std::endl + << "============================" << std::endl + << "Number of channels: " << nChannel << std::endl + << "Sampling Rate [Hz]: " << m_sampling << std::endl + << "Interval [µS]: " << std::fixed << std::setprecision(5) << samplingInterval << std::endl + << std::endl; + + return true; +} + +std::string CBoxAlgorithmBrainampFileWriterGipsa::getShortName(std::string fullpath) +{ + size_t pos = fullpath.find_last_of('\\'); + if (pos == std::string::npos) { pos = fullpath.find_last_of('/'); } + if (pos != std::string::npos) { return fullpath.substr(pos + 1, fullpath.size() - pos); } + return fullpath; +} + +std::string CBoxAlgorithmBrainampFileWriterGipsa::formatTime(const boost::posix_time::ptime now) +{ + using namespace boost::posix_time; + + static std::locale loc(std::wcout.getloc(), new wtime_facet(L"%Y%m%d%H%M%S")); + + std::basic_stringstream wss; + wss.imbue(loc); + wss << now; + std::wstring wstr = wss.str(); + std::string str(wstr.begin(), wstr.end()); + + return str; +} +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmBrainampFileWriterGipsa.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmBrainampFileWriterGipsa.h new file mode 100644 index 0000000..99cae63 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmBrainampFileWriterGipsa.h @@ -0,0 +1,152 @@ +/* Project: Gipsa-lab plugins for OpenVibe + * AUTHORS AND CONTRIBUTORS: Andreev A., Barachant A., Congedo M., Ionescu,Gelu, + + * This file is part of "Gipsa-lab plugins for OpenVibe". + * You can redistribute it and/or modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * You should have received a copy of the GNU General Public License along with Brain Invaders. If not, see http://www.gnu.org/licenses/.*/ + +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +class CBoxAlgorithmBrainampFileWriterGipsa final : public Toolkit::TBoxAlgorithm +{ +public: + + CBoxAlgorithmBrainampFileWriterGipsa() { } + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + bool writeHeaderFile(); //write the .vhdr file + + static std::string getShortName(std::string fullpath); //of a file + static std::string formatTime(boost::posix_time::ptime now); + + + template + bool saveBuffer(const T /*myDummy*/) + { + std::vector output(m_matrix->getBufferElementCount()); + + if (output.size() != m_matrix->getBufferElementCount()) { return false; } + + const size_t nChannel = m_matrix->getDimensionSize(0); + const size_t nSamplesPerChunk = m_matrix->getDimensionSize(1); + double* input = m_matrix->getBuffer(); + + for (size_t k = 0; k < nChannel; ++k) + { + for (size_t j = 0; j < nSamplesPerChunk; ++j) + { + const size_t index = (k * nSamplesPerChunk) + j; + output[j * nChannel + k] = T(input[index]); + } + } + + m_dataFile.write((char*)&output[0], m_matrix->getBufferElementCount() * sizeof(T)); + + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_BrainampFileWriterGipsa) + +protected: + + enum EBinaryFormat + { + BinaryFormat_Integer16, + BinaryFormat_UnsignedInteger16, + BinaryFormat_Float32, + }; + + //input signal 1 + Toolkit::TSignalDecoder* m_streamDecoder = nullptr; + CMatrix* m_matrix = nullptr; + uint64_t m_sampling = 0; + + //input stimulation 1 + Toolkit::TStimulationDecoder* m_stimDecoder = nullptr; + //Kernel::TParameterHandler ip_bufferToDecodeTrigger; + //Kernel::TParameterHandler < IStimulationSet* > op_pStimulationSetTrigger; + + std::string m_headerFilename; + std::string m_dataFilename; + std::string m_markerFilename; + + std::ofstream m_headerFile; + std::ofstream m_dataFile; + std::ofstream m_markerFile; + + size_t m_binaryFormat = 0; + size_t m_stimulationCounter = 2; //because the first is outputed manually + + bool m_isVmrkHeaderFileWritten = false; //Is the beginning of the .vmrk (file with stimulations is written) +}; + +class CBoxAlgorithmBrainampFileWriterGipsaListener final : public Toolkit::TBoxListener +{ +public: + + bool onInputTypeChanged(Kernel::IBox& /*box*/, const size_t /*index*/) override { return true; } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmBrainampFileWriterGipsaDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("BrainVision Format file writer (Gipsa)"); } + CString getAuthorName() const override { return CString("Anton Andreev"); } + CString getAuthorCompanyName() const override { return CString("Gipsa-lab"); } + CString getShortDescription() const override { return CString("Writes signal in the Brainamp file format."); } + + CString getDetailedDescription() const override + { + return CString( + "You must select the location of the output header file .vhdr. The .eeg and .vmrk files will be created with the same name and in the same folder. Integer codes of OpenVibe stimulations are saved in the .vmrk file. OV Stimulation with code 233 will be saved as S233 on the .vmrk file."); + } + + CString getCategory() const override { return CString("File reading and writing/BrainVision Format"); } + CString getVersion() const override { return CString("1.1"); } + CString getStockItemName() const override { return CString("gtk-save"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_BrainampFileWriterGipsa; } + IPluginObject* create() override { return new CBoxAlgorithmBrainampFileWriterGipsa; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmBrainampFileWriterGipsaListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Streamed matrix", OV_TypeId_Signal); + prototype.addInput("Input stimulation channel", OV_TypeId_Stimulations); + + prototype.addSetting("Header filename", OV_TypeId_Filename, "record-[$core{date}-$core{time}].vhdr"); + prototype.addSetting("Binary format", OVP_TypeId_BinaryFormat, "INT_16"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_BrainampFileWriterGipsaDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmEDFFileWriter.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmEDFFileWriter.cpp new file mode 100644 index 0000000..fb92650 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmEDFFileWriter.cpp @@ -0,0 +1,314 @@ +#include "ovpCBoxAlgorithmEDFFileWriter.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +/*******************************************************************************/ + +bool CBoxAlgorithmEDFFileWriter::initialize() +{ + m_experimentInfoDecoder.initialize(*this, 0); + m_signalDecoder.initialize(*this, 1); + m_stimDecoder.initialize(*this, 2); + + m_filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + m_sampling = 0; + m_nChannels = 0; + + m_isFileOpened = false; + m_fileHandle = -1; + + return true; +} + +/*******************************************************************************/ + +bool CBoxAlgorithmEDFFileWriter::uninitialize() +{ + if (!m_isFileOpened) + { + // Fine, we didn't manage to write anything + this->getLogManager() << Kernel::LogLevel_Warning << "Exiting without writing a file (open failed or no signal header received).\n"; + + // Clear the queue + std::queue empty; + std::swap(m_buffer, empty); + + m_experimentInfoDecoder.uninitialize(); + m_signalDecoder.uninitialize(); + m_stimDecoder.uninitialize(); + + return true; + } + + this->getLogManager() << Kernel::LogLevel_Info << "Writing the file, this may take a moment.\n"; + + for (size_t c = 0; c < m_nChannels; ++c) + { + if (EdfSetSampling(m_fileHandle, c, m_sampling) == -1) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "edf_set_sampling failed!\n"; + return false; + } + if (EdfSetPhysicalMaximum(m_fileHandle, c, m_channelInfo[c].max) == -1)//1.7*10^308) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "edf_set_physical_maximum failed!\n"; + return false; + } + if (EdfSetPhysicalMinimum(m_fileHandle, c, m_channelInfo[c].min) == -1)//-1.7*10^308) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "edf_set_physical_minimum failed!\n"; + return false; + } + if (EdfSetDigitalMaximum(m_fileHandle, c, 32767) == -1) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "edf_set_digital_maximum failed!\n"; + return false; + } + if (EdfSetDigitalMinimum(m_fileHandle, c, -32768) == -1) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "edf_set_digital_minimum failed!\n"; + return false; + } + if (EdfSetLabel(m_fileHandle, c, m_signalDecoder.getOutputMatrix()->getDimensionLabel(0, c)) == -1) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "edf_set_label failed!\n"; + return false; + } + } + const size_t n = m_sampling * m_nChannels; + std::vector tmpBuffer(n), tmpBufferToWrite(n); // A buffer chunk and Transposed buffer chunk + + // Write out all the complete buffers + if (m_buffer.size() >= n) + { + this->getLogManager() << Kernel::LogLevel_Trace << "((int) buffer.size() >= m_sampling*m_NChannels)\n"; + while (m_buffer.size() >= n) + { + this->getLogManager() << Kernel::LogLevel_Trace << "while((int)buffer.size() >= m_sampling*m_NChannels)\n"; + for (size_t i = 0; i < n; ++i) + { + tmpBuffer[i] = double(m_buffer.front()); + m_buffer.pop(); + } + + for (size_t c = 0; c < m_nChannels; ++c) + { + for (size_t s = 0; s < m_sampling; ++s) { tmpBufferToWrite[c * m_sampling + s] = tmpBuffer[s * m_nChannels + c]; } + } + + if (EdfBlockwritePhysicalSamples(m_fileHandle, tmpBufferToWrite.data()) == -1) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "edf_blockwrite_physical_samples: Could not write samples in file [" << m_filename << "]\n"; + return false; + } + } + } + + // Do we have a partial buffer? If so, write it out padded by zeroes + if (!m_buffer.empty()) + { + this->getLogManager() << Kernel::LogLevel_Trace << "if(buffer.size() > 0))\n"; + for (size_t i = 0; i < n; ++i) { tmpBuffer[i] = 0; } + + for (size_t i = 0; i < m_buffer.size(); ++i) + { + tmpBuffer[i] = double(m_buffer.front()); + m_buffer.pop(); + } + + for (size_t c = 0; c < m_nChannels; ++c) + { + for (size_t s = 0; s < m_sampling; ++s) { tmpBufferToWrite[c * m_sampling + s] = tmpBuffer[s * m_nChannels + c]; } + } + + if (EdfBlockwritePhysicalSamples(m_fileHandle, tmpBufferToWrite.data()) == -1) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "edf_blockwrite_physical_samples: Could not write samples in file [" << m_filename << "]\n"; + return false; + } + } + + if (EdfcloseFile(m_fileHandle) == -1) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "edfclose_file: Could not close file [" << m_filename << "]\n"; + return false; + } + + m_experimentInfoDecoder.uninitialize(); + m_signalDecoder.uninitialize(); + m_stimDecoder.uninitialize(); + + return true; +} + +/*******************************************************************************/ + +bool CBoxAlgorithmEDFFileWriter::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +/*******************************************************************************/ + +bool CBoxAlgorithmEDFFileWriter::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + //iterate over all chunk on signal input + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + m_signalDecoder.decode(i); + + if (m_signalDecoder.isHeaderReceived()) + { + m_sampling = size_t(m_signalDecoder.getOutputSamplingRate()); + m_nChannels = m_signalDecoder.getOutputMatrix()->getDimensionSize(0); + m_nSamplesPerChunk = m_signalDecoder.getOutputMatrix()->getDimensionSize(1); + + m_fileHandle = EdfopenFileWriteonly(m_filename.toASCIIString(), EDFLIB_FILETYPE_EDFPLUS, m_nChannels); + if (m_fileHandle < 0) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Could not open file [" << m_filename << "]\n"; + switch (m_fileHandle) + { + case EDFLIB_MALLOC_ERROR: + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "EDFLIB_MALLOC_ERROR: "; + break; + case EDFLIB_NO_SUCH_FILE_OR_DIRECTORY: + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "EDFLIB_NO_SUCH_FILE_OR_DIRECTORY: "; + break; + case EDFLIB_MAXFILES_REACHED: + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "EDFLIB_MAXFILES_REACHED: "; + break; + case EDFLIB_FILE_ALREADY_OPENED: + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "EDFLIB_FILE_ALREADY_OPENED: "; + break; + case EDFLIB_NUMBER_OF_SIGNALS_INVALID: + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "EDFLIB_NUMBER_OF_SIGNALS_INVALID: "; + break; + default: + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "EDFLIB_UNKNOWN_ERROR: "; + break; + } + return false; + } + + //set file parameters + EdfSetStartdatetime(m_fileHandle, 0, 0, 0, 0, 0, 0); + + for (size_t c = 0; c < m_nChannels; ++c) + { + //Creation of one information channel structure per channel + channel_info_t channelInfo = { std::numeric_limits::max(), -std::numeric_limits::max() }; + m_channelInfo.push_back(channelInfo); + } + + m_isFileOpened = true; + } + + if (m_signalDecoder.isBufferReceived()) + { + //put sample in the buffer + CMatrix* matrix = m_signalDecoder.getOutputMatrix(); + for (size_t s = 0; s < m_nSamplesPerChunk; ++s) + { + for (size_t c = 0; c < m_nChannels; ++c) + { + double value = matrix->getBuffer()[c * m_nSamplesPerChunk + s]; + if (value > m_channelInfo[c].max) { m_channelInfo[c].max = value; } + if (value < m_channelInfo[c].min) { m_channelInfo[c].min = value; } + m_buffer.push(value); + } + } + } + + if (m_signalDecoder.isEndReceived()) { } + } + + if (m_isFileOpened) + { + //iterate over all chunk on experiment information input + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_experimentInfoDecoder.decode(i); + + if (m_experimentInfoDecoder.isHeaderReceived()) + { + //set patient code + EdfSetPatientcode(m_fileHandle, std::to_string(m_experimentInfoDecoder.getOutputSubjectID()).c_str()); + + //set patient gender + switch (m_experimentInfoDecoder.getOutputSubjectGender()) + { + case 2: //female + EdfSetGender(m_fileHandle, 0); + break; + case 1: //male + EdfSetGender(m_fileHandle, 1); + break; + case 0: //unknown + break; + case 9: //unspecified + default: + break; + } + + //set patient age + const char* patientAge = ("Patient age = " + std::to_string(m_experimentInfoDecoder.getOutputSubjectAge())).c_str(); + EdfSetPatientAdditional(m_fileHandle, patientAge); + } + } + } + + + //iterate over all chunk on stimulation input + for (size_t i = 0; i < boxContext.getInputChunkCount(2); ++i) + { + m_stimDecoder.decode(i); + + if (m_stimDecoder.isHeaderReceived()) { } + + if (m_stimDecoder.isBufferReceived()) + { + const IStimulationSet* stimSet = m_stimDecoder.getOutputStimulationSet(); + for (size_t j = 0; j < stimSet->getStimulationCount(); ++j) + { + const uint64_t date = stimSet->getStimulationDate(j); + const int64_t stimDate = int64_t(CTime(date).toSeconds() / 0.0001); + + const uint64_t duration = stimSet->getStimulationDuration(j); + const int64_t stimDuration = int64_t(CTime(duration).toSeconds() / 0.0001); + + const uint64_t id = stimSet->getStimulationIdentifier(j); + CString stimID = this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, id); + if (stimID.length() == 0) + { + // If the stimulation number has not been registered as an enum, just pass the number + std::stringstream ss; + ss << id; + stimID = ss.str().c_str(); + } + const int result = EdfwriteAnnotationUTF8(m_fileHandle, stimDate, stimDuration, stimID.toASCIIString()); + if (result == -1) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "edfwrite_annotation_utf8 failed!\n"; + return false; + } + } + } + + if (m_stimDecoder.isEndReceived()) { } + } + + return true; +} +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmEDFFileWriter.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmEDFFileWriter.h new file mode 100644 index 0000000..1782d5a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmEDFFileWriter.h @@ -0,0 +1,92 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include "edf/edflib.h" +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +typedef struct +{ + double min; + double max; +} channel_info_t; + + +class CBoxAlgorithmEDFFileWriter final : public Toolkit::TBoxAlgorithm +{ +public: + + //CBoxAlgorithmEDFFileWriter(); + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_EDFFileWriter) + +protected: + + Toolkit::TExperimentInfoDecoder m_experimentInfoDecoder; + Toolkit::TSignalDecoder m_signalDecoder; + Toolkit::TStimulationDecoder m_stimDecoder; + + CString m_filename; + bool m_isFileOpened = false; + int m_fileHandle = 0; + size_t m_sampling = 0; + size_t m_nChannels = 0; + size_t m_nSamplesPerChunk = 0; + std::queue> m_buffer; + //int * m_pTemporyBuffer; + //int * m_pTemporyBufferToWrite; + + std::vector m_channelInfo; +}; + +class CBoxAlgorithmEDFFileWriterDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("EDF File Writer"); } + CString getAuthorName() const override { return CString("Aurelien Van Langhenhove"); } + CString getAuthorCompanyName() const override { return CString("CICIT Garches"); } + + CString getShortDescription() const override { return CString("Writes experiment information, signal and stimulations in a EDF file"); } + + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("File reading and writing/EDF"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-save"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_EDFFileWriter; } + IPluginObject* create() override { return new CBoxAlgorithmEDFFileWriter; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Experiment information", OV_TypeId_ExperimentInfo); + prototype.addInput("Signal", OV_TypeId_Signal); + prototype.addInput("Stimulations", OV_TypeId_Stimulations); + + prototype.addSetting("Filename", OV_TypeId_Filename, "record-[$core{date}-$core{time}].edf"); + + //prototype.addFlag(Kernel::BoxFlag_IsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_EDFFileWriterDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/ovp_defines.h new file mode 100644 index 0000000..cd0e143 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/ovp_defines.h @@ -0,0 +1,13 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_EDFFileWriter OpenViBE::CIdentifier(0x0D454DCE, 0x470A4C02) +#define OVP_ClassId_BoxAlgorithm_EDFFileWriterDesc OpenViBE::CIdentifier(0x0D454DCE, 0x470A4C02) +#define OVP_ClassId_BoxAlgorithm_BrainampFileWriterGipsa OpenViBE::CIdentifier(0x0C7E0BDE, 0x4EC90F95) +#define OVP_ClassId_BoxAlgorithm_BrainampFileWriterGipsaDesc OpenViBE::CIdentifier(0x0A77142C, 0x316B6E47) + +#define OVP_TypeId_BinaryFormat OpenViBE::CIdentifier(0x567234C5, 0x3D870DC3) +#define OVP_TypeId_BinaryFormat_int16_t OpenViBE::CIdentifier(0x1C777556, 0x123861C3) +#define OVP_TypeId_BinaryFormat_uint16_t OpenViBE::CIdentifier(0x6A7B6C73, 0x4B9D129D) +#define OVP_TypeId_BinaryFormat_float OpenViBE::CIdentifier(0x15183866, 0x7AAC69FC) diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/ovp_main.cpp new file mode 100644 index 0000000..7ebf408 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/file-io/src/ovp_main.cpp @@ -0,0 +1,35 @@ +#include +#include + +// @BEGIN CICIT-GARCHES +#include "box-algorithms/ovpCBoxAlgorithmEDFFileWriter.h" +// @END CICIT-GARCHES + +// @BEGIN GIPSA +#include "box-algorithms/ovpCBoxAlgorithmBrainampFileWriterGipsa.h" +// @END GIPSA + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +OVP_Declare_Begin() + // @BEGIN CICIT-GARCHES + OVP_Declare_New(CBoxAlgorithmEDFFileWriterDesc) + // @END CICIT_GARCHES + + // @BEGIN GIPSA + //Register dropdowns + context.getTypeManager().registerEnumerationType(OVP_TypeId_BinaryFormat, "Binary format select"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_BinaryFormat, "INT_16", OVP_TypeId_BinaryFormat_int16_t.id()); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_BinaryFormat, "UINT_16", OVP_TypeId_BinaryFormat_uint16_t.id()); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_BinaryFormat, "IEEE_FLOAT_32", OVP_TypeId_BinaryFormat_float.id()); + + OVP_Declare_New(CBoxAlgorithmBrainampFileWriterGipsaDesc) + // @END GIPSA + +OVP_Declare_End() + +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/misc/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/misc/CMakeLists.txt new file mode 100644 index 0000000..7d561c6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/misc/CMakeLists.txt @@ -0,0 +1,28 @@ +PROJECT(openvibe-plugins-contrib-misc) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +# INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyOpenAL") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/misc/src/box-algorithms/ovpCMouseControl.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/misc/src/box-algorithms/ovpCMouseControl.cpp new file mode 100644 index 0000000..c1e4901 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/misc/src/box-algorithms/ovpCMouseControl.cpp @@ -0,0 +1,83 @@ +#include "ovpCMouseControl.h" + +#include + +#if defined TARGET_OS_Linux + #include +#endif + +namespace OpenViBE { +namespace Plugins { +namespace Tools { //Ambiguous without OpenViBEPlugins + +bool CMouseControl::initialize() +{ + m_decoder = new Toolkit::TStreamedMatrixDecoder(*this, 0); + +#if !defined(TARGET_OS_Linux) + getLogManager() << Kernel::LogLevel_Error << "This box algorithm is not implemented for your operating system\n"; + return false; +#else + return true; +#endif +} + +bool CMouseControl::uninitialize() +{ + m_decoder->uninitialize(); + delete m_decoder; + + return true; +} + +bool CMouseControl::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CMouseControl::process() +{ + Kernel::IBoxIO* boxContext = getBoxAlgorithmContext()->getDynamicBoxContext(); + const size_t nInputChunk = boxContext->getInputChunkCount(0); + + for (size_t i = 0; i < nInputChunk; ++i) + { + m_decoder->decode(i); + if (m_decoder->isBufferReceived()) + { + CMatrix* iMatrix = m_decoder->getOutputMatrix(); + if (iMatrix->getBufferElementCount() != 1) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error << "Error, dimension size isn't 1 for Amplitude input !\n"; + return false; + } +#if defined TARGET_OS_Linux + const double* iBuffer = iMatrix->getBuffer(); + m_pMainDisplay=::XOpenDisplay(NULL); + if (!m_pMainDisplay) + { + getLogManager() << Kernel::LogLevel_Error << "Impossible to open Display.\n"; + return false; + } + m_oRootWindow=DefaultRootWindow(m_pMainDisplay); //all X11 screens + ::XSelectInput(m_pMainDisplay, m_oRootWindow, ButtonPressMask|ButtonReleaseMask|ButtonMotionMask|OwnerGrabButtonMask); + + int offsetY = 0; + int offsetX = int(iBuffer[0]*100.0); + + getLogManager() << Kernel::LogLevel_Debug << "offsetX = " << offsetX << "\n"; + + ::XWarpPointer(m_pMainDisplay, m_oRootWindow, 0, 0, 0, 0, 0, offsetX, offsetY); + ::XCloseDisplay(m_pMainDisplay); +#endif + // TODO + // For windows use: + // SetCursorPos(int x, int y) + } + } + return true; +} +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/misc/src/box-algorithms/ovpCMouseControl.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/misc/src/box-algorithms/ovpCMouseControl.h new file mode 100644 index 0000000..57ad566 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/misc/src/box-algorithms/ovpCMouseControl.h @@ -0,0 +1,77 @@ +#pragma once + +#include "../ovp_defines.h" + +#include + +#include +#include + +#if defined TARGET_OS_Linux + #include + #include + #include +#endif + +namespace OpenViBE { +namespace Plugins { +namespace Tools { +class CMouseControl : public Toolkit::TBoxAlgorithm +{ +public: + + CMouseControl() { } + + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_MouseControl) + +protected: + + //codec + Toolkit::TStreamedMatrixDecoder* m_decoder = nullptr; + +#if defined TARGET_OS_Linux + ::Display* m_pMainDisplay = nullptr; + ::Window m_oRootWindow; +#endif +}; + +class CMouseControlDesc : public IBoxAlgorithmDesc +{ +public: + + CString getName() const override { return CString("Mouse Control"); } + CString getAuthorName() const override { return CString("Guillaume Gibert"); } + CString getAuthorCompanyName() const override { return CString("INSERM"); } + CString getShortDescription() const override { return CString("Mouse Control for Feedback"); } + + CString getDetailedDescription() const override + { + return CString("Experimental box to move the mouse in x direction with respect to the input value. Only implemented on Linux."); + } + + CString getCategory() const override { return CString("Tools"); } + CString getVersion() const override { return CString("0.1"); } + void release() override { } + CIdentifier getCreatedClass() const override { return OVP_ClassId_MouseControl; } + IPluginObject* create() override { return new CMouseControl(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Amplitude", OV_TypeId_StreamedMatrix); + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_MouseControlDesc) +}; +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/misc/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/misc/src/ovp_defines.h new file mode 100644 index 0000000..b35c00c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/misc/src/ovp_defines.h @@ -0,0 +1,14 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_MouseControl OpenViBE::CIdentifier(0xDA4B4EEB, 0x64FC6A16) +#define OVP_ClassId_MouseControlDesc OpenViBE::CIdentifier(0xB6B65C98, 0xA756ED0E) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/misc/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/misc/src/ovp_main.cpp new file mode 100755 index 0000000..f8ecc85 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/misc/src/ovp_main.cpp @@ -0,0 +1,22 @@ +#include +#include +#include "ovp_defines.h" + +#include "box-algorithms/ovpCMouseControl.h" // inserm + +namespace OpenViBE { +namespace Plugins { +namespace Tools { + +OVP_Declare_Begin() + // @BEGIN inserm + OVP_Declare_New(CMouseControlDesc); + context.getTypeManager().registerEnumerationEntry(OV_TypeId_BoxAlgorithmFlag, OV_AttributeId_Box_FlagIsUnstable.toString(), + OV_AttributeId_Box_FlagIsUnstable.id()); + // @END inserm + +OVP_Declare_End() + +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/CMakeLists.txt new file mode 100755 index 0000000..f9ee024 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/CMakeLists.txt @@ -0,0 +1,27 @@ +PROJECT(openvibe-plugins-contrib-network-io) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +# INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindThirdPartyLSL") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/doc/Doc_BoxAlgorithm_OSCController.dox-part b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/doc/Doc_BoxAlgorithm_OSCController.dox-part new file mode 100644 index 0000000..c45ee45 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/doc/Doc_BoxAlgorithm_OSCController.dox-part @@ -0,0 +1,75 @@ +/** + * \page BoxAlgorithm_OSCController OSC Controller +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_OSCController_Description| +By this box, you can control OSC supporting devices, such as +synthesizers and oscillators. It can be used to turn OpenViBE +streams into sound, e.g. for brain music or auditory BCI. + +The OSC Controller box simply sends the incoming data as UDP +messages to the specified OSC Server. Each message is flagged with +an OSC Address specifying the device that the message is intended to +control. + * |OVP_DocEnd_BoxAlgorithm_OSCController_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_OSCController_Inputs| + * |OVP_DocEnd_BoxAlgorithm_OSCController_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_OSCController_Input1| +Data to send to the OSC Server. This input can be either a signal, a matrix, or a stimulation. The signal or matrix must have only 1 channel (row). Signals are sent as float and stimulations as size_t. + * |OVP_DocEnd_BoxAlgorithm_OSCController_Input1| + +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_OSCController_Settings| + * |OVP_DocEnd_BoxAlgorithm_OSCController_Settings| + + * |OVP_DocBegin_BoxAlgorithm_OSCController_Setting1| +Server address (IP or DNS) + * |OVP_DocEnd_BoxAlgorithm_OSCController_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_OSCController_Setting2| +Server port + * |OVP_DocEnd_BoxAlgorithm_OSCController_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_OSCController_Setting3| +The OSC Address specifying the device the messages are intended to, e.g. /oscillator/4/frequency + * |OVP_DocEnd_BoxAlgorithm_OSCController_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_OSCController_Examples| +Utilities such as OSC DataMonitor by Kasper Kamperman can be used to debug the messages sent out by the box. + * |OVP_DocEnd_BoxAlgorithm_OSCController_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_OSCController_Miscellaneous| +In the current implementation, the data is sent when received. OpenViBE internal timing is not passed to the OSC. +The box supports only one input, but the input type can be modified. The input must have only one channel. For signals, you can extract a +channel by using the Channel Selector box. Also, if input type is a signal, its sampling rate is ignored. +However, several OSC Controller boxes can be used at the same time if multiple sources are needed to be +sent to the OSC Server(s) or device(s). These limitations are to keep the code simple. + +The box is not intended to transmit large chunks of numeric data. It may be meaningful to limit the +amount of data on the OpenViBE side e.g. with boxes such as Signal Average, Downsampling or Signal Decimation, or Stimulation Filter. + +For more information about the OSC protocol and applications that support it, please see http://www.opensoundcontrol.org + + * |OVP_DocEnd_BoxAlgorithm_OSCController_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/osc-controller/oscpkt.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/osc-controller/oscpkt.h new file mode 100644 index 0000000..83e8549 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/osc-controller/oscpkt.h @@ -0,0 +1,850 @@ +/** + OSCPKT : a minimalistic OSC ( http://opensoundcontrol.org ) c++ library + + Before using this file please take the time to read the OSC spec, it + is short and not complicated: http://opensoundcontrol.org/spec-1_0 + + Features: + - handles basic OSC types: TFihfdsb + - handles bundles + - handles OSC pattern-matching rules (wildcards etc in message paths) + - portable on win / macos / linux + - robust wrt malformed packets + - optional udp transport for packets + - concise, all in a single .h file + - does not throw exceptions + + does not: + - take into account timestamp values. + - provide a cpu-scalable message dispatching. + - not suitable for use inside a realtime thread as it allocates memory when + building or reading messages. + + + There are basically 3 classes of interest: + - oscpkt::Message : read/write the content of an OSC message + - oscpkt::PacketReader : read the bundles/messages embedded in an OSC packet + - oscpkt::PacketWriter : write bundles/messages into an OSC packet + + And optionaly: + - oscpkt::UdpSocket : read/write OSC packets over UDP. + + example: oscpkt_demo.cc + example: oscpkt_test.cc +*/ + +/* Copyright (C) 2010 Julien Pommier + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + (this is the zlib license) +*/ + +#pragma once + +#ifndef _MSC_VER +#include +#else +namespace oscpkt { +typedef __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +} +#endif +#include +#include +#include +#include +#include + +#if defined(OSCPKT_OSTREAM_OUTPUT) || defined(OSCPKT_TEST) +#include +#endif + +namespace oscpkt { + +/** + OSC timetag stuff, the highest 32-bit are seconds, the lowest are fraction of a second. +*/ +class TimeTag +{ + uint64_t v = 1; +public: + TimeTag() {} + explicit TimeTag(const uint64_t w): v(w) {} + operator uint64_t() const { return v; } + static TimeTag immediate() { return TimeTag(1); } +}; + +/* the various types that we handle (OSC 1.0 specifies that INT32/FLOAT/STRING/BLOB are the bare minimum) */ +enum +{ + TYPE_TAG_TRUE = 'T', + TYPE_TAG_FALSE = 'F', + TYPE_TAG_INT32 = 'i', + TYPE_TAG_INT64 = 'h', + TYPE_TAG_FLOAT = 'f', + TYPE_TAG_DOUBLE = 'd', + TYPE_TAG_STRING = 's', + TYPE_TAG_BLOB = 'b' +}; + +/* a few utility functions follow.. */ + +// round to the next multiple of 4, works for size_t and pointer arguments +template +Type ceil4(Type p) { return Type((size_t(p) + 3) & (~size_t(3))); } + +// check that a memory area is zero padded until the next address which is a multiple of 4 +inline bool isZeroPaddingCorrect(const char* p) +{ + const char* q = ceil4(p); + for (; p < q; ++p) { if (*p != 0) { return false; } } + return true; +} + +// stuff for reading / writing POD ("Plain Old Data") variables to unaligned bytes. +template +union PodBytes +{ + char bytes[sizeof(POD)]; + POD value; +}; + +inline bool isBigEndian() +{ // a compile-time constant would certainly improve performances.. + PodBytes p; + p.value = 0x12345678; + return p.bytes[0] == 0x12; +} + +/** read unaligned bytes into a POD type, assuming the bytes are a little endian representation */ +template +POD bytes2pod(const char* bytes) +{ + PodBytes p; + for (size_t i = 0; i < sizeof(POD); ++i) + { + if (isBigEndian()) { p.bytes[i] = bytes[i]; } + else { p.bytes[i] = bytes[sizeof(POD) - i - 1]; } + } + return p.value; +} + +/** stored a POD type into an unaligned bytes array, using little endian representation */ +template +void pod2bytes(const POD value, char* bytes) +{ + PodBytes p; + p.value = value; + for (size_t i = 0; i < sizeof(POD); ++i) + { + if (isBigEndian()) { bytes[i] = p.bytes[i]; } + else { bytes[i] = p.bytes[sizeof(POD) - i - 1]; } + } +} + +/** internal stuff, handles the dynamic storage with correct alignments to 4 bytes */ +struct Storage +{ + std::vector data; + Storage() { data.reserve(200); } + + char* getBytes(const size_t sz) + { + assert((data.size() & 3) == 0); + if (data.size() + sz > data.capacity()) { data.reserve((data.size() + sz) * 2); } + const size_t sz4 = ceil4(sz); + const size_t pos = data.size(); + data.resize(pos + sz4); // resize will fill with zeros, so the zero padding is OK + return &(data[pos]); + } + + char* begin() { return !data.empty() ? &data.front() : nullptr; } + char* end() { return begin() + size(); } + const char* begin() const { return !data.empty() ? &data.front() : nullptr; } + const char* end() const { return begin() + size(); } + size_t size() const { return data.size(); } + void assign(const char* beg, const char* end) { data.assign(beg, end); } + void clear() { data.resize(0); } +}; + +/** check if the path matches the supplied path pattern , according to the OSC spec pattern rules ('*' and '//' wildcards, '{}' alternatives, brackets etc) */ +bool fullPatternMatch(const std::string& pattern, const std::string& path); +/** check if the path matches the beginning of pattern */ +bool partialPatternMatch(const std::string& pattern, const std::string& path); + +#if defined(OSCPKT_DEBUG) +#define OSCPKT_SET_ERR(errcode) do { if (!err) { err = errcode; std::cerr << "set " #errcode << " at line " << __LINE__ << "\n"; } } while (0) +#else +#define OSCPKT_SET_ERR(errcode) do { if (!err) err = errcode; } while (0) +#endif + +typedef enum +{ + OK_NO_ERROR=0, + // errors raised by the Message class: + MALFORMED_ADDRESS_PATTERN, + MALFORMED_TYPE_TAGS, + MALFORMED_ARGUMENTS, + UNHANDLED_TYPE_TAGS, + // errors raised by ArgReader + TYPE_MISMATCH, + NOT_ENOUGH_ARG, + PATTERN_MISMATCH, + // errors raised by PacketReader/PacketWriter + INVALID_BUNDLE, + INVALID_PACKET_SIZE, + BUNDLE_REQUIRED_FOR_MULTI_MESSAGES +} ErrorCode; + +/** + struct used to hold an OSC message that will be written or read. + + The list of arguments is exposed as a sort of queue. You "pop" + arguments from the front of the queue when reading, you push + arguments at the back of the queue when writing. + + Many functions return *this, so they can be chained: init("/foo").pushInt32(2).pushStr("kllk")... + + Example of use: + + creation of a message: + @code + msg.init("/foo").pushInt32(4).pushStr("bar"); + @endcode + reading a message, with error detection: + @code + if (msg.match("/foo/b*ar/plop")) { + int i; std::string s; std::vector b; + if (msg.arg().popInt32(i).popStr(s).popBlob(b).isOkNoMoreArgs()) { + process message...; + } else arguments mismatch; + } + @endcode +*/ +class Message +{ + TimeTag time_tag; + std::string address; + std::string type_tags; + std::vector> arguments; // array of pairs (pos,size), pos being an index into the 'storage' array. + Storage storage; // the arguments data is stored here + ErrorCode err; +public: + /** ArgReader is used for popping arguments from a Message, holds a + pointer to the original Message, and maintains a local error code */ + class ArgReader + { + const Message* msg; + ErrorCode err; + size_t arg_idx; // arg index of the next arg that will be popped out. + public: + ArgReader(const Message& m, const ErrorCode e = OK_NO_ERROR) : msg(&m), err(msg->getErr()), arg_idx(0) + { + if (e != OK_NO_ERROR && err == OK_NO_ERROR) { err = e; } + } + + ArgReader(const ArgReader& other) : msg(other.msg), err(other.err), arg_idx(other.arg_idx) {} + bool isBool() { return currentTypeTag() == TYPE_TAG_TRUE || currentTypeTag() == TYPE_TAG_FALSE; } + bool isInt32() { return currentTypeTag() == TYPE_TAG_INT32; } + bool isInt64() { return currentTypeTag() == TYPE_TAG_INT64; } + bool isFloat() { return currentTypeTag() == TYPE_TAG_FLOAT; } + bool isDouble() { return currentTypeTag() == TYPE_TAG_DOUBLE; } + bool isStr() { return currentTypeTag() == TYPE_TAG_STRING; } + bool isBlob() { return currentTypeTag() == TYPE_TAG_BLOB; } + + size_t nbArgRemaining() const { return msg->arguments.size() - arg_idx; } + bool isOk() const { return err == OK_NO_ERROR; } + operator bool() const { return isOk(); } // implicit bool conversion is handy here + /** call this at the end of the popXXX() chain to make sure everything is ok and + all arguments have been popped */ + bool isOkNoMoreArgs() const { return err == OK_NO_ERROR && nbArgRemaining() == 0; } + ErrorCode getErr() const { return err; } + + /** retrieve an int32_t argument */ + ArgReader& popInt32(int32_t& i) { return popPod(TYPE_TAG_INT32, i); } + /** retrieve an int64_t argument */ + ArgReader& popInt64(int64_t& i) { return popPod(TYPE_TAG_INT64, i); } + /** retrieve a single precision floating point argument */ + ArgReader& popFloat(float& f) { return popPod(TYPE_TAG_FLOAT, f); } + /** retrieve a double precision floating point argument */ + ArgReader& popDouble(double& d) { return popPod(TYPE_TAG_DOUBLE, d); } + /** retrieve a string argument (no check performed on its content, so it may contain any byte value except 0) */ + ArgReader& popStr(std::string& s) + { + if (precheck(TYPE_TAG_STRING)) { s = argBeg(arg_idx++); } + return *this; + } + /** retrieve a binary blob */ + ArgReader& popBlob(std::vector& b) + { + if (precheck(TYPE_TAG_BLOB)) + { + b.assign(argBeg(arg_idx) + 4, argEnd(arg_idx)); + ++arg_idx; + } + return *this; + } + /** retrieve a bool argument */ + ArgReader& popBool(bool& b) + { + b = false; + if (arg_idx >= msg->arguments.size()) { OSCPKT_SET_ERR(NOT_ENOUGH_ARG); } + else if (currentTypeTag() == TYPE_TAG_TRUE) { b = true; } + else if (currentTypeTag() == TYPE_TAG_FALSE) { b = false; } + else { OSCPKT_SET_ERR(TYPE_MISMATCH); } + ++arg_idx; + return *this; + } + /** skip whatever comes next */ + ArgReader& pop() + { + if (arg_idx >= msg->arguments.size()) { OSCPKT_SET_ERR(NOT_ENOUGH_ARG); } + else { ++arg_idx; } + return *this; + } + + private: + const char* argBeg(const size_t idx) const + { + if (err || idx >= msg->arguments.size()) { return nullptr; } + return msg->storage.begin() + msg->arguments[idx].first; + } + + const char* argEnd(const size_t idx) const + { + if (err || idx >= msg->arguments.size()) { return nullptr; } + return msg->storage.begin() + msg->arguments[idx].first + msg->arguments[idx].second; + } + + int currentTypeTag() + { + if (!err && arg_idx < msg->type_tags.size()) { return msg->type_tags[arg_idx]; } + OSCPKT_SET_ERR(NOT_ENOUGH_ARG); + return -1; + } + + template + ArgReader& popPod(const int tag, POD& v) + { + if (precheck(tag)) + { + v = bytes2pod(argBeg(arg_idx)); + ++arg_idx; + } + else { v = POD(0); } + return *this; + } + /* pre-check stuff before popping an argument from the message */ + bool precheck(const int tag) + { + if (arg_idx >= msg->arguments.size()) { OSCPKT_SET_ERR(NOT_ENOUGH_ARG); } + else if (!err && currentTypeTag() != tag) { OSCPKT_SET_ERR(TYPE_MISMATCH); } + return err == OK_NO_ERROR; + } + }; + + Message() { clear(); } + Message(const std::string& s, const TimeTag tt = TimeTag::immediate()) : time_tag(tt), address(s), err(OK_NO_ERROR) {} + + Message(const void* ptr, const size_t sz, const TimeTag tt = TimeTag::immediate()) + { + buildFromRawData(ptr, sz); + time_tag = tt; + } + + bool isOk() const { return err == OK_NO_ERROR; } + ErrorCode getErr() const { return err; } + + /** return the type_tags string, with its initial ',' stripped. */ + const std::string& typeTags() const { return type_tags; } + /** retrieve the address pattern. If you want to follow to the whole OSC spec, you + have to handle its matching rules for address specifications -- this file does + not provide this functionality */ + const std::string& addressPattern() const { return address; } + TimeTag timeTag() const { return time_tag; } + /** clear the message and start a new message with the supplied address and time_tag. */ + Message& init(const std::string& addr, const TimeTag tt = TimeTag::immediate()) + { + clear(); + address = addr; + time_tag = tt; + if (address.empty() || address[0] != '/') { OSCPKT_SET_ERR(MALFORMED_ADDRESS_PATTERN); } + return *this; + } + + /** start a matching test. The typical use-case is to follow this by + a sequence of calls to popXXX() and a final call to + isOkNoMoreArgs() which will allow to check that everything went + fine. For example: + @code + if (msg.match("/foo").popInt32(i).isOkNoMoreArgs()) { blah(i); } + else if (msg.match("/bar").popStr(s).popInt32(i).isOkNoMoreArgs()) { plop(s,i); } + else std::cerr << "unhandled message: " << msg << "\n"; + @endcode + */ + ArgReader match(const std::string& test) const { return ArgReader(*this, fullPatternMatch(address, test) ? OK_NO_ERROR : PATTERN_MISMATCH); } + /** return true if the 'test' path matched by the first characters of addressPattern(). + For ex. ("/foo/bar").partialMatch("/foo/") is true */ + ArgReader partialMatch(const std::string& test) const { return ArgReader(*this, partialPatternMatch(address, test) ? OK_NO_ERROR : PATTERN_MISMATCH); } + + ArgReader arg() const { return ArgReader(*this, OK_NO_ERROR); } + + /** build the osc message for raw data (the message will keep a copy of that data) */ + void buildFromRawData(const void* ptr, const size_t sz) + { + clear(); + storage.assign((const char*)ptr, (const char*)ptr + sz); + const char* address_beg = storage.begin(); + const char* address_end = (const char*)memchr(address_beg, 0, storage.end() - address_beg); + if (!address_end || !isZeroPaddingCorrect(address_end + 1) || address_beg[0] != '/') + { + OSCPKT_SET_ERR(MALFORMED_ADDRESS_PATTERN); + return; + } + address.assign(address_beg, address_end); + + const char* type_tags_beg = ceil4(address_end + 1); + const char* type_tags_end = (const char*)memchr(type_tags_beg, 0, storage.end() - type_tags_beg); + if (!type_tags_end || !isZeroPaddingCorrect(type_tags_end + 1) || type_tags_beg[0] != ',') + { + OSCPKT_SET_ERR(MALFORMED_TYPE_TAGS); + return; + } + type_tags.assign(type_tags_beg + 1, type_tags_end); + // we do not copy the initial ',' + + const char* arg = ceil4(type_tags_end + 1); + assert(arg <= storage.end()); + size_t iarg = 0; + while (isOk() && iarg < type_tags.size()) + { + assert(arg <= storage.end()); + size_t len = getArgSize(type_tags[iarg], arg); + if (isOk()) { arguments.push_back(std::make_pair(arg - storage.begin(), len)); } + arg += ceil4(len); + ++iarg; + } + if (iarg < type_tags.size() || arg != storage.end()) { OSCPKT_SET_ERR(MALFORMED_ARGUMENTS); } + } + + /* below are all the functions that serve when *writing* a message */ + Message& pushBool(const bool b) + { + type_tags += (b ? TYPE_TAG_TRUE : TYPE_TAG_FALSE); + arguments.push_back(std::make_pair(storage.size(), storage.size())); + return *this; + } + + Message& pushInt32(const int32_t i) { return pushPod(TYPE_TAG_INT32, i); } + Message& pushInt64(const int64_t h) { return pushPod(TYPE_TAG_INT64, h); } + Message& pushFloat(const float f) { return pushPod(TYPE_TAG_FLOAT, f); } + Message& pushDouble(const double d) { return pushPod(TYPE_TAG_DOUBLE, d); } + + Message& pushStr(const std::string& s) + { + assert(s.size() < 2147483647); // insane values are not welcome + type_tags += TYPE_TAG_STRING; + arguments.push_back(std::make_pair(storage.size(), s.size() + 1)); + strcpy(storage.getBytes(s.size() + 1), s.c_str()); + return *this; + } + + Message& pushBlob(void* ptr, const size_t size) + { + assert(size < 2147483647); // insane values are not welcome + type_tags += TYPE_TAG_BLOB; + arguments.push_back(std::make_pair(storage.size(), size + 4)); + pod2bytes(int32_t(size), storage.getBytes(4)); + if (size) { memcpy(storage.getBytes(size), ptr, size); } + return *this; + } + + /** reset the message to a clean state */ + void clear() + { + address.clear(); + type_tags.clear(); + storage.clear(); + arguments.clear(); + err = OK_NO_ERROR; + time_tag = TimeTag::immediate(); + } + + /** write the raw message data (used by PacketWriter) */ + void packMessage(Storage& s, const bool size) const + { + if (!isOk()) { return; } + const size_t addr = address.size() + 1; + const size_t type = type_tags.size() + 2; + if (size) { pod2bytes(uint32_t(ceil4(addr) + ceil4(type) + ceil4(storage.size())), s.getBytes(4)); } + strcpy(s.getBytes(addr), address.c_str()); + strcpy(s.getBytes(type), ("," + type_tags).c_str()); + if (storage.size()) { memcpy(s.getBytes(storage.size()), const_cast(storage).begin(), storage.size()); } + } + +private: + + /* get the number of bytes occupied by the argument */ + size_t getArgSize(const int type, const char* p) + { + if (err) { return 0; } + size_t sz = 0; + assert(p >= storage.begin() && p <= storage.end()); + switch (type) + { + case TYPE_TAG_TRUE: + case TYPE_TAG_FALSE: sz = 0; + break; + case TYPE_TAG_INT32: + case TYPE_TAG_FLOAT: sz = 4; + break; + case TYPE_TAG_INT64: + case TYPE_TAG_DOUBLE: sz = 8; + break; + case TYPE_TAG_STRING: + { + const char* q = (const char*)memchr(p, 0, storage.end() - p); + if (!q) { OSCPKT_SET_ERR(MALFORMED_ARGUMENTS); } + else { sz = (q - p) + 1; } + } + break; + case TYPE_TAG_BLOB: + { + if (p == storage.end()) + { + OSCPKT_SET_ERR(MALFORMED_ARGUMENTS); + return 0; + } + sz = 4 + bytes2pod(p); + } + break; + default: + { + OSCPKT_SET_ERR(UNHANDLED_TYPE_TAGS); + return 0; + } + } + if (p + sz > storage.end() || /* string or blob too large.. */ + p + sz < p /* or even blob so large that it did overflow */) + { + OSCPKT_SET_ERR(MALFORMED_ARGUMENTS); + return 0; + } + if (!isZeroPaddingCorrect(p + sz)) + { + OSCPKT_SET_ERR(MALFORMED_ARGUMENTS); + return 0; + } + return sz; + } + + template + Message& pushPod(const int tag, POD v) + { + type_tags += char(tag); + arguments.push_back(std::make_pair(storage.size(), sizeof(POD))); + pod2bytes(v, storage.getBytes(sizeof(POD))); + return *this; + } + +#ifdef OSCPKT_OSTREAM_OUTPUT + friend std::ostream &operator<<(std::ostream &os, const Message &msg) { + os << "osc_address: '" << msg.address << "', types: '" << msg.type_tags << "', timetag=" << msg.time_tag << ", args=["; + Message::ArgReader arg(msg); + while (arg.nbArgRemaining() && arg.isOk()) { + if (arg.isBool()) { bool b; arg.popBool(b); os << (b?"True":"False"); } + else if (arg.isInt32()) { int32_t i; arg.popInt32(i); os << i; } + else if (arg.isInt64()) { int64_t h; arg.popInt64(h); os << h << "ll"; } + else if (arg.isFloat()) { float f; arg.popFloat(f); os << f << "f"; } + else if (arg.isDouble()) { double d; arg.popDouble(d); os << d; } + else if (arg.isStr()) { std::string s; arg.popStr(s); os << "'" << s << "'"; } + else if (arg.isBlob()) { std::vector b; arg.popBlob(b); os << "Blob " << b.size() << " bytes"; } + else { + assert(0); // I forgot a case.. + } + if (arg.nbArgRemaining()) os << ", "; + } + if (!arg.isOk()) { os << " ERROR#" << arg.getErr(); } + os << "]"; + return os; + } +#endif +}; + +/** + parse an OSC packet and extracts the embedded OSC messages. +*/ +class PacketReader +{ +public: + PacketReader() { err = OK_NO_ERROR; } + /** pointer and size of the osc packet to be parsed. */ + PacketReader(const void* ptr, size_t sz) { init(ptr, sz); } + + void init(const void* ptr, const size_t sz) + { + err = OK_NO_ERROR; + messages.clear(); + if ((sz % 4) == 0) { parse((const char*)ptr, (const char*)ptr + sz, TimeTag::immediate()); } + else { OSCPKT_SET_ERR(INVALID_PACKET_SIZE); } + it_messages = messages.begin(); + } + + /** extract the next osc message from the packet. return 0 when all messages have been read, or in case of error. */ + Message* popMessage() + { + if (!err && !messages.empty() && it_messages != messages.end()) { return &*it_messages++; } + return nullptr; + } + + bool isOk() const { return err == OK_NO_ERROR; } + ErrorCode getErr() const { return err; } + +private: + std::list messages; + std::list::iterator it_messages; + ErrorCode err; + + void parse(const char* beg, const char* end, const TimeTag time_tag) + { + assert(beg <= end && !err); + assert(((end-beg)%4)==0); + + if (beg == end) { return; } + if (*beg == '#') + { + /* it's a bundle */ + if (end - beg >= 20 + && memcmp(beg, "#bundle\0", 8) == 0) + { + const TimeTag timeTag2(bytes2pod(beg + 8)); + const char* pos = beg + 16; + do + { + const uint32_t sz = bytes2pod(pos); + pos += 4; + if ((sz & 3) != 0 || pos + sz > end || pos + sz < pos) { OSCPKT_SET_ERR(INVALID_BUNDLE); } + else + { + parse(pos, pos + sz, timeTag2); + pos += sz; + } + } while (!err && pos != end); + } + else { OSCPKT_SET_ERR(INVALID_BUNDLE); } + } + else + { + messages.push_back(Message(beg, end - beg, time_tag)); + if (!messages.back().isOk()) { OSCPKT_SET_ERR(messages.back().getErr()); } + } + } +}; + + +/** + Assemble messages into an OSC packet. Example of use: + @code + PacketWriter pkt; + Message msg; + pkt.startBundle(); + pkt.addMessage(msg.init("/foo").pushBool(true).pushStr("plop").pushFloat(3.14f)); + pkt.addMessage(msg.init("/bar").pushBool(false)); + pkt.endBundle(); + if (pkt.isOk()) { + send(pkt.data(), pkt.size()); + } + @endcode +*/ +class PacketWriter +{ +public: + PacketWriter() { init(); } + + PacketWriter& init() + { + err = OK_NO_ERROR; + storage.clear(); + bundles.clear(); + return *this; + } + + /** begin a new bundle. If you plan to pack more than one message in the Osc packet, you have to + put them in a bundle. Nested bundles inside bundles are also allowed. */ + PacketWriter& startBundle(const TimeTag ts = TimeTag::immediate()) + { + char* p; + if (!bundles.empty()) { p = storage.getBytes(4); } // hold the bundle size + p = storage.getBytes(8); + strcpy(p, "#bundle"); + bundles.push_back(p - storage.begin()); + p = storage.getBytes(8); + pod2bytes(ts, p); + return *this; + } + /** close the current bundle. */ + PacketWriter& endBundle() + { + if (!bundles.empty()) + { + if (storage.size() - bundles.back() == 16) { pod2bytes(0, storage.getBytes(4)); } // the 'empty bundle' case, not very elegant + if (bundles.size() > 1) // no size stored for the top-level bundle + { + pod2bytes(uint32_t(storage.size() - bundles.back()), storage.begin() + bundles.back() - 4); + } + bundles.pop_back(); + } + else { OSCPKT_SET_ERR(INVALID_BUNDLE); } + return *this; + } + + /** insert an Osc message into the current bundle / packet. + */ + PacketWriter& addMessage(const Message& msg) + { + if (storage.size() != 0 && bundles.empty()) { OSCPKT_SET_ERR(BUNDLE_REQUIRED_FOR_MULTI_MESSAGES); } + else { msg.packMessage(storage, !bundles.empty()); } + if (!msg.isOk()) { OSCPKT_SET_ERR(msg.getErr()); } + return *this; + } + + /** the error flag will be raised if an opened bundle is not closed, or if more than one message is + inserted in the packet without a bundle */ + bool isOk() const { return err == OK_NO_ERROR; } + ErrorCode getErr() const { return err; } + + /** return the number of bytes of the osc packet -- will always be a + multiple of 4 -- returns 0 if the construction of the packet has + failed. */ + size_t packetSize() const { return err ? 0 : storage.size(); } + + /** return the bytes of the osc packet (NULL if the construction of the packet has failed) */ + char* packetData() { return err ? nullptr : storage.begin(); } +private: + std::vector bundles; // hold the position in the storage array of the beginning marker of each bundle + Storage storage; + ErrorCode err; +}; + +// see the OSC spec for the precise pattern matching rules +inline const char* internalPatternMatch(const char* pattern, const char* path) +{ + while (*pattern) + { + const char* p = pattern; + if (*p == '?' && *path) + { + ++p; + ++path; + } + else if (*p == '[' && *path) + { // bracketted range, e.g. [a-zABC] + ++p; + bool reverse = false; + if (*p == '!') + { + reverse = true; + ++p; + } + bool match = reverse; + for (; *p && *p != ']'; ++p) + { + const char c0 = *p; + char c1 = c0; + if (p[1] == '-' && p[2]) + { + p += 2; + c1 = *p; + } + if (*path >= c0 && *path <= c1) { match = !reverse; } + } + if (!match || *p != ']') { return pattern; } + ++p; + ++path; + } + else if (*p == '*') + { // wildcard '*' + while (*p == '*') { ++p; } + const char* best = nullptr; + while (true) + { + const char* ret = internalPatternMatch(p, path); + if (ret && ret > best) { best = ret; } + if (*path == 0 || *path == '/') { break; } + ++path; + } + return best; + } + else if (*p == '/' && *(p + 1) == '/') + { // the super-wildcard '//' + while (*(p + 1) == '/') { ++p; } + const char* best = nullptr; + while (true) + { + const char* ret = internalPatternMatch(p, path); + if (ret && ret > best) { best = ret; } + if (*path == 0) { break; } + if (*path == 0 || (path = strchr(path + 1, '/')) == nullptr) { break; } + } + return best; + } + else if (*p == '{') + { // braced list {foo,bar,baz} + const char *end = strchr(p, '}'), *q; + if (!end) { return nullptr; } // syntax error in brace list.. + bool match = false; + do + { + ++p; + q = strchr(p, ','); + if (q == nullptr || q > end) { q = end; } + if (strncmp(p, path, q - p) == 0) + { + path += (q - p); + p = end + 1; + match = true; + } + else { p = q; } + } while (q != end && !match); + if (!match) { return pattern; } + } + else if (*p == *path) + { + ++p; + ++path; + } // any other character + else { break; } + pattern = p; + } + return (*path == 0 ? pattern : nullptr); +} + +inline bool partialPatternMatch(const std::string& pattern, const std::string& path) +{ + const char* q = internalPatternMatch(pattern.c_str(), path.c_str()); + return q != nullptr; +} + +inline bool fullPatternMatch(const std::string& pattern, const std::string& path) +{ + const char* q = internalPatternMatch(pattern.c_str(), path.c_str()); + return q && *q == 0; +} +} // namespace oscpkt diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/osc-controller/oscpkt_udp.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/osc-controller/oscpkt_udp.h new file mode 100644 index 0000000..5e390fc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/osc-controller/oscpkt_udp.h @@ -0,0 +1,345 @@ +/* + This file provides a dumb c++ wrapper for sending OSC packets over UDP. +*/ + +/* Copyright (C) 2010 Julien Pommier + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + (this is the zlib license) +*/ + +#pragma once + +#if defined(_MSC_VER) || defined(WIN32) +/* + if windows.h has been already included, be prepared for tons of + compile errors. winsock2 must be included BEFORE windows.h . -- OR + define WIN32_LEAN_AND_MEAN before the first #include to + prevent it from including tons of crap (winsock.h etc) +*/ +#include +#include +#include +#if defined(_MSC_VER) +# pragma comment(lib, "ws2_32.lib") +#endif +#else + +#include +#include +#include +#include +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +namespace oscpkt { + +/** a wrapper class for holding an ip address, mostly used internnally */ +class SockAddr +{ + union + { + sockaddr_storage ss; // hold an IPv4 or IPv6 address + struct sockaddr sa; + } addr_; + +public: + + struct sockaddr& addr() { return addr_.sa; } + const struct sockaddr& addr() const { return addr_.sa; } + size_t maxLen() const { return sizeof addr_; } + + size_t actualLen() const + { + if (addr().sa_family == AF_UNSPEC) { return 0; } + if (addr().sa_family == AF_INET) { return sizeof(struct sockaddr_in); } + if (addr().sa_family == AF_INET6) { return sizeof(struct sockaddr_in6); } + return sizeof addr_; + } + + SockAddr() { memset(&addr_, 0, sizeof addr_); } + + bool empty() const + { + return addr().sa_family == AF_UNSPEC; /* this is the 0 value */ + } + /** retrieve the current port number, -1 in case of error */ + int getPort() const + { + char servname[512]; + const int err = getnameinfo(&addr_.sa, sizeof addr_, nullptr, 0, servname, sizeof servname, NI_NUMERICSERV); + return (err == 0 ? atoi(servname) : -1); + } + /* convert to a string representation (ip:port) */ + std::string asString() const + { + std::string s; + if (addr().sa_family) + { + char hostname[512], servname[512]; + const int err = getnameinfo(&addr_.sa, sizeof addr_, hostname, sizeof hostname, servname, sizeof servname, NI_NUMERICHOST | NI_NUMERICSERV); + if (err == 0) + { + s = hostname; + s += ":"; + s += servname; + } + } + return s; + } + + /* NOTE: This breaks build with OpenViBE + friend std::ostream &operator<<(std::ostream &os, const SockAddr &ip) { + os << "["; + switch (ip.addr().sa_family) { + case AF_UNSPEC: os << "AF_UNSPEC"; break; + case AF_INET: os << "IPv4"; break; + case AF_INET6: os << "IPv6"; break; + default: os << "unknown family '" << ip.addr().sa_family << "'"; break; + } + os << " " << ip.asString() << "]"; + return os; + }*/ +}; + + +/** + just a wrapper over the classical socket stuff + + should be robust, simple to use, IPv6 ready (avoids all deprecated + stuff such as gethostbyname etc), and portable (mac/linux/windows) + + Try to avoid sending packets larger than 8192 because some other + implementation may truncate them (python's DatagramRequestHandler + of OSC.py for example). + */ +struct UdpSocket +{ + std::string error_message; + int handle; /* the file descriptor for the socket */ + SockAddr local_addr /* initialised only for bound sockets */; + SockAddr remote_addr; /* initialised for connected sockets. Also updated for bound sockets after each datagram received */ + + std::vector buffer; + + UdpSocket() : handle(-1) + { +#ifdef WIN32 + WSADATA wsa_data; + if (WSAStartup(MAKEWORD(2, 2), &wsa_data) != 0) { setErr("winsock failed to initialise"); } +#endif + } + + ~UdpSocket() + { + close(); +#ifdef WIN32 + WSACleanup(); +#endif + } + + void close() + { + if (handle != -1) + { +#ifdef WIN32 + closesocket(handle); +#else + ::close(handle); +#endif + handle = -1; + } + } + + bool isOk() const { return error_message.empty(); } + const std::string& errorMessage() const { return error_message; } + + bool isBound() const { return !local_addr.empty(); } + int boundPort() const { return local_addr.getPort(); } + + std::string boundPortAsString() const + { + char s[512]; +#ifndef _MSC_VER + snprintf(s, 512, "%d", boundPort()); +#else + _snprintf_s(s, 512, 512, "%d", boundPort()); +#endif + return s; + } + + int socketHandle() const { return handle; } + + static std::string localHostName() + { + /* this stuff is not very nice but this is what liblo does in order to + find out a sensible name for the local host */ + char hostname_buf[512]; + if (gethostname(hostname_buf, sizeof hostname_buf) != 0) { hostname_buf[0] = 0; } + hostname_buf[sizeof hostname_buf - 1] = 0; + struct hostent* host = gethostbyname(hostname_buf); + if (host) { return host->h_name; } + return hostname_buf[0] ? hostname_buf : "localhost"; + } + + std::string localHostNameWithPort() const { return (localHostName() + ":") + boundPortAsString(); } + + enum + { + OPTION_UNSPEC = 0, + OPTION_FORCE_IPV4 = 1, + OPTION_FORCE_IPV6 = 2, + OPTION_DEFAULT = OPTION_FORCE_IPV4 // according to liblo's README, using ipv6 sockets causes issues with other non-ipv6 enabled osc software + }; + + /** open the socket, and prepare for sending datagrams to the specified host:port */ + bool connectTo(const std::string& host, const std::string& port, const int options = OPTION_DEFAULT) { return openSocket(host, port, options); } + + bool connectTo(const std::string& host, const int port, const int options = OPTION_DEFAULT) { return openSocket(host, port, options); } + + void setErr(const std::string& msg) { if (error_message.empty()) { error_message = msg; } } + + void* packetData() { return buffer.empty() ? nullptr : &buffer[0]; } + size_t packetSize() const { return buffer.size(); } + SockAddr& packetOrigin() { return remote_addr; } + + bool sendPacket(const void* ptr, const size_t sz) { return sendPacketTo(ptr, sz, remote_addr); } + + bool sendPacketTo(const void* ptr, const size_t sz, SockAddr& addr) + { + if (!isOk() || handle == -1) + { + setErr("not opened.."); + return false; + } + if (!ptr || sz == 0) { return false; } + + int sent = 0; + do + { + int res; + errno = 0; + if (isBound()) { res = sendto(handle, (const char*)ptr, int(sz), 0, &addr.addr(), int(addr.actualLen())); } + else + { + res = send(handle, (const char*)ptr, int(sz), 0); + // res = write(handle, ptr, sz); + } +#ifdef WIN32 + if (res == -1 && WSAGetLastError() == WSAEINTR) { continue; } + sent = res; +#else + //if (res == -1) std::cerr << "sendto handle=" << handle << ", res:" << res << ", sz=" << sz << ", errno=" << errno << " " << strerror(errno) << "\n"; + if (res == -1 && errno == EINTR) continue; + else sent = res; +#endif + } while (false); + + return size_t(sent) == sz; + } + +private: + bool openSocket(const std::string& hostname, const int port, const int options) + { + char port_string[64]; +#ifdef _MSC_VER + _snprintf_s(port_string, 64, 64, "%d", port); +#else + snprintf(port_string, 64, "%d", port); +#endif + return openSocket(hostname, port_string, options); + } + + bool openSocket(const std::string& hostname, const std::string& port, const int options) + { + const bool binding = hostname.empty(); + close(); + error_message.clear(); + + struct addrinfo hints; + struct addrinfo* result = nullptr; + + memset(&hints, 0, sizeof(struct addrinfo)); + if (options == OPTION_FORCE_IPV4) { hints.ai_family = AF_INET; } + else if (options == OPTION_FORCE_IPV6) { hints.ai_family = AF_INET6; } + else { hints.ai_family = AF_UNSPEC; } // Allow IPv4 or IPv6 -- in case of problem, try with AF_INET ... + hints.ai_socktype = SOCK_DGRAM; // Datagram socket + hints.ai_flags = (binding ? AI_PASSIVE : 0); // AI_PASSIVE means socket address is intended for bind + + const int err = getaddrinfo(binding ? nullptr : hostname.c_str(), port.empty() ? nullptr : port.c_str(), &hints, &result); + if (err != 0) + { + setErr(gai_strerror(err)); + return false; + } + + struct addrinfo* rp = result; + for (; rp && handle == -1; rp = rp->ai_next) + { + handle = socket(rp->ai_family, rp->ai_socktype, + rp->ai_protocol); + if (handle == -1) { continue; } + + if (binding) + { + if (bind(handle, rp->ai_addr, socklen_t(rp->ai_addrlen)) != 0) { close(); } + else + { + socklen_t len = socklen_t(local_addr.maxLen()); + if (getsockname(handle, &local_addr.addr(), &len) == 0) + { + /* great */ + } + break; + } + } + else + { + if (connect(handle, rp->ai_addr, socklen_t(rp->ai_addrlen)) != 0) { close(); } + else + { + assert(size_t(rp->ai_addrlen) <= sizeof remote_addr); + memcpy(&remote_addr.addr(), rp->ai_addr, rp->ai_addrlen); + break; + } + } + } + + + freeaddrinfo(result); + result = nullptr; + + if (!rp) + { // we failed miserably + setErr(binding ? "bind failed" : "connect failed"); + assert(handle == -1); + return false; + } + return true; + } +}; +} // namespace oscpkt diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/osc-controller/ovpCBoxAlgorithmOSCController.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/osc-controller/ovpCBoxAlgorithmOSCController.cpp new file mode 100644 index 0000000..f47cc92 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/osc-controller/ovpCBoxAlgorithmOSCController.cpp @@ -0,0 +1,173 @@ +#include "ovpCBoxAlgorithmOSCController.h" + +// #include + +namespace OpenViBE { +namespace Plugins { +namespace NetworkIO { + +bool CBoxAlgorithmOSCController::initialize() +{ + const CString address = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + const uint64_t port = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_oscAddress = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + + const char* tmp = m_oscAddress.toASCIIString(); + if (!tmp || !tmp[0] || tmp[0] != '/') + { + this->getLogManager() << Kernel::LogLevel_Error << "OSC Address must start with a '/'\n"; + return false; + } + + // Connect the socket + const std::string str = std::string(address.toASCIIString()); + m_udpSocket.connectTo(str, uint32_t(port)); + + if (!m_udpSocket.isOk()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Error connecting to socket\n"; + return false; + } + + // Get appropriate decoder + CIdentifier streamType; + this->getStaticBoxContext().getInputType(0, streamType); + + m_decoder = nullptr; + if (this->getTypeManager().isDerivedFromStream(streamType,OV_TypeId_StreamedMatrix)) + { + m_decoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixDecoder)); + } + else if (streamType == OV_TypeId_Stimulations) + { + m_decoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Unsupported type\n"; + return false; + } + m_decoder->initialize(); + + return true; +} + +bool CBoxAlgorithmOSCController::uninitialize() +{ + if (m_udpSocket.isOk()) { m_udpSocket.close(); } + + if (m_decoder) + { + this->getAlgorithmManager().releaseAlgorithm(*m_decoder); + m_decoder = nullptr; + } + + return true; +} + +bool CBoxAlgorithmOSCController::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmOSCController::process() +{ + // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + CIdentifier streamType; + this->getStaticBoxContext().getInputType(0, streamType); + + oscpkt::PacketWriter pw; + oscpkt::Message msg; + bool haveData = false; + + for (size_t j = 0; j < boxContext.getInputChunkCount(0); ++j) + { + if (this->getTypeManager().isDerivedFromStream(streamType,OV_TypeId_StreamedMatrix)) + { + Kernel::TParameterHandler ip_buffer( + m_decoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_InputParameterId_MemoryBufferToDecode)); + Kernel::TParameterHandler op_pMatrix( + m_decoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + + ip_buffer = boxContext.getInputChunk(0, j); + m_decoder->process(); + + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedBuffer)) + { + // Check that the dimensions are acceptable + const CMatrix* matrix = op_pMatrix; + if (matrix->getDimensionCount() < 1 || matrix->getDimensionCount() > 2) + { + this->getLogManager() << Kernel::LogLevel_Error << "Only matrixes of 1 or 2 dimensions are supported\n"; + return false; + } + if (matrix->getDimensionCount() == 2 && matrix->getDimensionSize(0) != 1) + { + this->getLogManager() << Kernel::LogLevel_Error << "The matrix should have only 1 channel. Use e.g. Channel Selector to prune\n"; + return false; + } + + if (!haveData) + { + haveData = true; + pw.startBundle(); + } + + for (size_t k = 0; k < matrix->getBufferElementCount(); ++k) + { + const float inputVal = float(matrix->getBuffer()[k]); + pw.addMessage(msg.init(m_oscAddress.toASCIIString()).pushFloat(inputVal)); + // std::cout << "Add float " << inputVal << "\n"; + } + } + } + else if (streamType == OV_TypeId_Stimulations) + { + Kernel::TParameterHandler ip_buffer( + m_decoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + const Kernel::TParameterHandler op_pStimulationSet( + m_decoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + + ip_buffer = boxContext.getInputChunk(0, j); + m_decoder->process(); + + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + if (!haveData) + { + haveData = true; + pw.startBundle(); + } + + for (size_t k = 0; k < op_pStimulationSet->getStimulationCount(); ++k) + { + const uint64_t stimulus = op_pStimulationSet->getStimulationIdentifier(k); + pw.addMessage(msg.init(m_oscAddress.toASCIIString()).pushInt32(int32_t(stimulus))); + // std::cout << "Add stimulus " << stimulus << "\n"; + } + } + } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Unknown stream type\n"; + return false; + } + + boxContext.markInputAsDeprecated(0, j); + } + + if (haveData) + { + pw.endBundle(); + if (!m_udpSocket.sendPacket(pw.packetData(), pw.packetSize())) { this->getLogManager() << Kernel::LogLevel_Warning << "Error sending out UDP packet\n"; } + } + return true; +} +} // namespace NetworkIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/osc-controller/ovpCBoxAlgorithmOSCController.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/osc-controller/ovpCBoxAlgorithmOSCController.h new file mode 100644 index 0000000..199d05b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/osc-controller/ovpCBoxAlgorithmOSCController.h @@ -0,0 +1,108 @@ +#pragma once + +#include "../../ovp_defines.h" + +#include +#include + +#include "oscpkt.h" +#include "oscpkt_udp.h" + +namespace OpenViBE { +namespace Plugins { +namespace NetworkIO { +/** + * \class CBoxAlgorithmOSCController + * \author Ozan Caglayan (Galatasaray University) + * \date Thu May 8 20:57:24 2014 + * \brief The class CBoxAlgorithmOSCController describes the box OSC Controller. + * + */ +class CBoxAlgorithmOSCController final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + //Here is the different process callbacks possible + // - On new input received (the most common behaviour for signal processing) : + bool processInput(const size_t index) override; + + bool process() override; + + // As we do with any class in openvibe, we use the macro below + // to associate this box to an unique identifier. + // The inheritance information is also made available, + // as we provide the superclass Toolkit::TBoxAlgorithm < IBoxAlgorithm > + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_OSCController) + +private: + + // Decodes the stream + Kernel::IAlgorithmProxy* m_decoder = nullptr; + + // UDP Socket (oscpkt_udp.h) + oscpkt::UdpSocket m_udpSocket; + + // OSC Address to some device + CString m_oscAddress; +}; + +/** + * \class CBoxAlgorithmOSCControllerDesc + * \author Ozan Caglayan (Galatasaray University) + * \date Thu May 8 20:57:24 2014 + * \brief Descriptor of the box OSC Controller. + * + */ +class CBoxAlgorithmOSCControllerDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("OSC Controller"); } + CString getAuthorName() const override { return CString("Ozan Caglayan"); } + CString getAuthorCompanyName() const override { return CString("Galatasaray University"); } + // + Stimulation support & some code refactoring in v1.1 by Jussi T. Lindgren / Inria + CString getShortDescription() const override { return CString("Sends OSC messages to an OSC controller"); } + + CString getDetailedDescription() const override + { + return CString( + "This box allows OpenViBE to send OSC (Open Sound Control) messages to an OSC server. See http://www.opensoundcontrol.org to learn about the OSC protocol and its use cases."); + } + + CString getCategory() const override { return CString("Acquisition and network IO"); } + CString getVersion() const override { return CString("1.1"); } + CString getStockItemName() const override { return CString("gtk-network"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_OSCController; } + IPluginObject* create() override { return new CBoxAlgorithmOSCController; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input",OV_TypeId_Signal); + + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + prototype.addInputSupport(OV_TypeId_Stimulations); + + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + + prototype.addSetting("OSC Server IP",OV_TypeId_String, "127.0.0.1"); + prototype.addSetting("OSC Server Port",OV_TypeId_Integer, "9001"); + prototype.addSetting("OSC Address",OV_TypeId_String, "/a/b/c"); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_OSCControllerDesc) +}; +} // namespace NetworkIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/ovpCBoxLSLExportGipsa.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/ovpCBoxLSLExportGipsa.cpp new file mode 100755 index 0000000..51225c0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/ovpCBoxLSLExportGipsa.cpp @@ -0,0 +1,184 @@ +#if defined TARGET_HAS_ThirdPartyLSL + +#include "ovpCBoxLSLExportGipsa.h" + +namespace OpenViBE { +namespace Plugins { +namespace NetworkIO { + + +bool CBoxAlgorithmLSLExportGipsa::initialize() +{ + m_inputChannel1.initialize(this); + + m_streamName = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_streamType = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + m_outlet = nullptr; + m_stims.clear(); + + return true; +} + +bool CBoxAlgorithmLSLExportGipsa::uninitialize() +{ + m_inputChannel1.uninitialize(); + m_stims.clear(); + delete m_outlet; + return true; +} + +bool CBoxAlgorithmLSLExportGipsa::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmLSLExportGipsa::process() +{ + if (!m_inputChannel1.isWorking()) + { + m_inputChannel1.waitForSignalHeader(); + + if (m_inputChannel1.isWorking()) + { + try + { + //if it fails here then most likely you are using the wrong dll - e.x debug instead of release or vice-versa + lsl::stream_info info(m_streamName.toASCIIString(), m_streamType.toASCIIString(), int(m_inputChannel1.getNChannels()) + 1, + double(m_inputChannel1.getSamplingRate()), lsl::cf_float32); + + lsl::xml_element channels = info.desc().append_child("channels"); + + for (size_t i = 0; i < m_inputChannel1.getNChannels(); ++i) + { + channels.append_child("channel") + .append_child_value("label", m_inputChannel1.getChannelName(i)) + .append_child_value("type", "EEG") + .append_child_value("unit", "microvolts"); + } + + channels.append_child("channel") + .append_child_value("label", "Stimulations") + .append_child_value("type", "marker"); + + if (m_outlet != nullptr) { this->getLogManager() << Kernel::LogLevel_Error << "Possible double initialization!\n"; } + + m_outlet = new lsl::stream_outlet(info); //here the length of the buffered signal can be specified + } + catch (std::exception& e) + { + this->getLogManager() << Kernel::LogLevel_Error << "Could not initialize LSL library: " << e.what() << "\n"; + return false; + } + } + } + else + { + //stimulations + for (size_t i = 0; i < m_inputChannel1.getNStimulationBuffers(); ++i) + { + uint64_t tStart, tEnd; + IStimulationSet* set = m_inputChannel1.getStimulation(tStart, tEnd, i); + + for (size_t j = 0; j < set->getStimulationCount(); ++j) + { + uint64_t time = m_inputChannel1.getStartTimestamp() + set->getStimulationDate(j); + const uint64_t identifier = set->getStimulationIdentifier(j); + + + if (m_stims.empty()) + { + m_stims.push_back(std::pair(float(identifier), time)); + //std::cout<< "added: " << m_stims[m_stims.size()-1].first << " " << m_stims[m_stims.size()-1].second<< "\n"; + } + else + { + const auto last = m_stims[m_stims.size() - 1]; + if (last.first != identifier && last.second != time) + { + m_stims.push_back(std::pair(float(identifier), time)); + //std::cout<< "added: " << m_stims[m_stims.size()-1].first << " " << m_stims[m_stims.size()-1].second<< "\n"; + } + else + { + //std::cout<< "duplicate: " << m_stims[m_stims.size()-1].first << " " << m_stims[m_stims.size()-1].second<< "\n"; + } + } + } + } + + //signal + for (size_t i = 0; i < m_inputChannel1.getNSignalBuffers(); ++i) + { + uint64_t tStart, tEnd; + double* inputBuffer = m_inputChannel1.getSignal(tStart, tEnd, i); + + if (inputBuffer) + { + const size_t samplesPerChannelInput = m_inputChannel1.getNSamples(); + std::vector> mychunk(samplesPerChannelInput); + + for (size_t k = 0; k < samplesPerChannelInput; ++k) { mychunk[k] = std::vector(m_inputChannel1.getNChannels() + 1); } + + //Fill a matrix - OpenVibe provides the data ch1 (all values from all samples), ch2(all values from all samples) ... chN, + //In the generated chunk every row is a single sample (containing the data from all channels) and every column number is the number of the channel + for (size_t k = 0; k < m_inputChannel1.getNChannels(); ++k) + { + for (size_t j = 0; j < samplesPerChannelInput; ++j) + { + const size_t index = (k * samplesPerChannelInput) + j; + mychunk[j][k] = float(inputBuffer[index]); // @note 64bit->32bit conversion + } + } + + //Process stimulations and add them to the output in a dedicated channel + std::vector stimChan = std::vector(samplesPerChannelInput); + + auto it = m_stims.begin(); + while (it != m_stims.end()) + { + auto current = *it; + + if (!(current.second >= tStart && current.second <= tEnd)) + { + // not in current time range, do not send now. + ++it; + continue; + } + const uint64_t posCurrent = CTime(current.second).toSampleCount(m_inputChannel1.getSamplingRate()); + const uint64_t posStart = CTime(tStart).toSampleCount(m_inputChannel1.getSamplingRate()); + //uint64_t posEnd = CTime(tStart).toSampleCount(m_inputChannel1.getSamplingRate()); + + int pos = int(posCurrent) - int(posStart); + if (pos < 0) { pos = 0; } //fix position + if (pos == int(stimChan.size())) { pos = int(stimChan.size() - 1); } //fix position + + if (pos >= 0 && pos < int(stimChan.size())) + { + stimChan[pos] = float(current.first); + //std::cout<< "pos relative: " << pos << " value: " << stim_chan[pos] << " time:" << CTime(current.second).toSeconds()<< "\n"; + } + else { this->getLogManager() << Kernel::LogLevel_Warning << "Bad stimulation position: " << pos << "stim code: " << current.first << "\n"; } + + // processed, erase + it = m_stims.erase(it); + } + + //add the stim channel at the end of the matrix + const size_t k = m_inputChannel1.getNChannels(); + for (size_t j = 0; j < samplesPerChannelInput; ++j) { mychunk[j][k] = stimChan[j]; } + + //send all channels + m_outlet->push_chunk(mychunk); + } + } + } + + return true; +} + +#endif +} // namespace NetworkIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/ovpCBoxLSLExportGipsa.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/ovpCBoxLSLExportGipsa.h new file mode 100644 index 0000000..a1bbb5e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/box-algorithms/ovpCBoxLSLExportGipsa.h @@ -0,0 +1,83 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyLSL + +#include "../ovp_defines.h" +#include +#include +#include + +#include "../ovpCInputChannel.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace NetworkIO { +class CBoxAlgorithmLSLExportGipsa final : public Toolkit::TBoxAlgorithm +{ +public: + + CBoxAlgorithmLSLExportGipsa() : m_inputChannel1(0) {} + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_CBoxAlgorithmLSLExportGipsa) + +protected: + + int64_t m_decimationFactor = 0; + uint64_t m_outputSampling = 0; + CString m_streamName; + CString m_streamType; + + SignalProcessing::CInputChannel m_inputChannel1; + + lsl::stream_outlet* m_outlet = nullptr; + std::vector> m_stims;//identifier,time +}; + +class CBoxAlgorithmLSLExportGipsaDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("LSL Export (Gipsa)"); } + CString getAuthorName() const override { return CString("Anton Andreev"); } + CString getAuthorCompanyName() const override { return CString("Gipsa-lab"); } + + CString getShortDescription() const override { return CString("Streams signal outside OpenVibe using Lab Streaming Layer library"); } + + CString getDetailedDescription() const override + { + return CString("More on how to read the signal in your application: https://code.google.com/p/labstreaminglayer/"); + } + + CString getCategory() const override { return CString("Acquisition and network IO"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-connect"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_CBoxAlgorithmLSLExportGipsa; } + IPluginObject* create() override { return new CBoxAlgorithmLSLExportGipsa; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addInput("Input stimulations", OV_TypeId_Stimulations); + prototype.addSetting("Stream name", OV_TypeId_String, "OpenViBE Stream"); + prototype.addSetting("Stream type", OV_TypeId_String, "EEG"); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_CBoxAlgorithmLSLExportGipsaDesc) +}; +} // namespace NetworkIO +} // namespace Plugins +} // namespace OpenViBE + +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/ovpCInputChannel.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/ovpCInputChannel.cpp new file mode 100644 index 0000000..3d540b7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/ovpCInputChannel.cpp @@ -0,0 +1,130 @@ +#include "ovpCInputChannel.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CInputChannel::initialize(Toolkit::TBoxAlgorithm* boxAlgorithm) +{ + m_isWorking = false; + + m_startTimestamp = 0; + m_endTimestamp = 0; + + m_stimulationSet = nullptr; + m_boxAlgorithm = boxAlgorithm; + + m_signalDecoder = new Toolkit::TSignalDecoder>(); + m_signalDecoder->initialize(*m_boxAlgorithm, 0); + + m_stimDecoder = new Toolkit::TStimulationDecoder>(); + m_stimDecoder->initialize(*m_boxAlgorithm, 1); + + return true; +} + +bool CInputChannel::uninitialize() const +{ + m_stimDecoder->uninitialize(); + delete m_stimDecoder; + + m_signalDecoder->uninitialize(); + delete m_signalDecoder; + + return true; +} + +bool CInputChannel::waitForSignalHeader() +{ + Kernel::IBoxIO& boxContext = m_boxAlgorithm->getDynamicBoxContext(); + + if (boxContext.getInputChunkCount(m_signalChannel)) + { + m_signalDecoder->decode(0); + + if (m_signalDecoder->isHeaderReceived()) + { + m_isWorking = true; + + m_startTimestamp = boxContext.getInputChunkStartTime(m_signalChannel, 0); + m_endTimestamp = boxContext.getInputChunkEndTime(m_signalChannel, 0); + + boxContext.markInputAsDeprecated(m_signalChannel, 0); + + return true; + } + } + + return false; +} + +IStimulationSet* CInputChannel::getStimulation(uint64_t& startTime, uint64_t& endTime, const size_t index) +{ + Kernel::IBoxIO& boxContext = m_boxAlgorithm->getDynamicBoxContext(); + + m_stimDecoder->decode(index); + m_stimulationSet = m_stimDecoder->getOutputStimulationSet(); + + startTime = boxContext.getInputChunkStartTime(m_stimulationChannel, index); + endTime = boxContext.getInputChunkEndTime(m_stimulationChannel, index); + + boxContext.markInputAsDeprecated(m_stimulationChannel, index); + + return m_stimulationSet; +} + +IStimulationSet* CInputChannel::discardStimulation(const size_t index) +{ + Kernel::IBoxIO& boxContext = m_boxAlgorithm->getDynamicBoxContext(); + + m_stimDecoder->decode(index); + m_stimulationSet = m_stimDecoder->getOutputStimulationSet(); + + boxContext.markInputAsDeprecated(m_stimulationChannel, index); + + return m_stimulationSet; +} + + +double* CInputChannel::getSignal(uint64_t& startTime, uint64_t& endTime, const size_t index) const +{ + Kernel::IBoxIO& boxContext = m_boxAlgorithm->getDynamicBoxContext(); + m_signalDecoder->decode(index); + if (!m_signalDecoder->isBufferReceived()) { return nullptr; } + + startTime = boxContext.getInputChunkStartTime(m_signalChannel, index); + endTime = boxContext.getInputChunkEndTime(m_signalChannel, index); + + boxContext.markInputAsDeprecated(m_signalChannel, index); + + return m_signalDecoder->getOutputMatrix()->getBuffer(); +} + + +double* CInputChannel::discardSignal(const size_t index) const +{ + Kernel::IBoxIO& boxContext = m_boxAlgorithm->getDynamicBoxContext(); + m_signalDecoder->decode(index); + if (!m_signalDecoder->isBufferReceived()) { return nullptr; } + + boxContext.markInputAsDeprecated(m_signalChannel, index); + + return m_signalDecoder->getOutputMatrix()->getBuffer(); +} + +#if 0 +void CInputChannel::copyData(const bool copyFirstBlock, size_t index) +{ + CMatrix*& matrixBuffer = m_oMatrixBuffer[index & 1]; + + double* srcData = m_signalDecoder->getOutputMatrix()->getBuffer() + (copyFirstBlock ? 0 : m_firstBlock); + double* dstData = matrixBuffer->getBuffer() + (copyFirstBlock ? m_secondBlock : 0); + size_t size = (copyFirstBlock ? m_firstBlock : m_secondBlock)*sizeof(double); + + for (size_t i=0; i < m_nChannels; i++, srcData += m_nSamples, dstData += m_nSamples) { System::Memory::copy(dstData, srcData, size); } +} +#endif +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/ovpCInputChannel.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/ovpCInputChannel.h new file mode 100755 index 0000000..d572f27 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/ovpCInputChannel.h @@ -0,0 +1,73 @@ +#pragma once + +// @author Gipsa-lab + +#include +#include + +/** + Use this class to receive send and stimulations channels +*/ + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CInputChannel +{ + typedef enum + { + SIGNAL_CHANNEL, + STIMULATION_CHANNEL, + NB_CHANNELS, + } channel_t; + +public: + + explicit CInputChannel(const uint16_t index = 0) + : m_signalChannel(index * NB_CHANNELS + SIGNAL_CHANNEL), m_stimulationChannel(index * NB_CHANNELS + STIMULATION_CHANNEL) {} + + ~CInputChannel() { } + + bool initialize(Toolkit::TBoxAlgorithm* boxAlgorithm); + bool uninitialize() const; + + bool isLastChannel(const size_t index) const { return index == m_stimulationChannel; } + bool isWorking() const { return m_isWorking; } + bool waitForSignalHeader(); + size_t getNStimulationBuffers() const { return m_boxAlgorithm->getDynamicBoxContext().getInputChunkCount(m_stimulationChannel); } + size_t getNSignalBuffers() const { return m_boxAlgorithm->getDynamicBoxContext().getInputChunkCount(m_signalChannel); } + IStimulationSet* getStimulation(uint64_t& startTime, uint64_t& endTime, size_t index); + IStimulationSet* discardStimulation(size_t index); + double* getSignal(uint64_t& startTime, uint64_t& endTime, size_t index) const; + double* discardSignal(size_t index) const; + uint64_t getSamplingRate() const { return m_signalDecoder->getOutputSamplingRate(); } + size_t getNChannels() const { return m_signalDecoder->getOutputMatrix()->getDimensionSize(0); } + size_t getNSamples() const { return m_signalDecoder->getOutputMatrix()->getDimensionSize(1); } + uint64_t getStartTimestamp() const { return m_startTimestamp; } + uint64_t getEndTimestamp() const { return m_endTimestamp; } + const char* getChannelName(const size_t index) const { return m_signalDecoder->getOutputMatrix()->getDimensionLabel(0, index); } + const Kernel::TParameterHandler& getOpMatrix() const { return m_signalDecoder->getOutputMatrix(); } + +protected: + size_t m_signalChannel = 0; + size_t m_stimulationChannel = 0; + bool m_isWorking = false; + + uint64_t m_startTimestamp = 0; + uint64_t m_endTimestamp = 0; + + IStimulationSet* m_stimulationSet = nullptr; + + // parent memory + Toolkit::TBoxAlgorithm* m_boxAlgorithm = nullptr; + + // signal section + //Kernel::IAlgorithmProxy* m_signalDecoder; + Toolkit::TSignalDecoder>* m_signalDecoder = nullptr; + + // stimulation section + Toolkit::TStimulationDecoder>* m_stimDecoder = nullptr; +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/ovp_defines.h new file mode 100755 index 0000000..787b6e1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/ovp_defines.h @@ -0,0 +1,16 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_OSCController OpenViBE::CIdentifier(0xC66F2F0C, 0x3BA5B424) +#define OVP_ClassId_BoxAlgorithm_OSCControllerDesc OpenViBE::CIdentifier(0xF7A35BD7, 0x6331C7D9) +#define OVP_ClassId_BoxAlgorithm_CBoxAlgorithmLSLExportGipsa OpenViBE::CIdentifier(0x591D2E94, 0x221C23AD) +#define OVP_ClassId_BoxAlgorithm_CBoxAlgorithmLSLExportGipsaDesc OpenViBE::CIdentifier(0x22AF11F5, 0x58F2787D) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/ovp_main.cpp new file mode 100755 index 0000000..0ef62a8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/network-io/src/ovp_main.cpp @@ -0,0 +1,31 @@ +#include +#include +#include "ovp_defines.h" + +#include "box-algorithms/osc-controller/ovpCBoxAlgorithmOSCController.h" + +// @BEGIN gipsa + +#include "box-algorithms/ovpCBoxLSLExportGipsa.h" + +// @END gipsa + +namespace OpenViBE { +namespace Plugins { +namespace NetworkIO { + +OVP_Declare_Begin() + OVP_Declare_New(CBoxAlgorithmOSCControllerDesc); + context.getTypeManager().registerEnumerationEntry(OV_TypeId_BoxAlgorithmFlag, OV_AttributeId_Box_FlagIsUnstable.toString(), + OV_AttributeId_Box_FlagIsUnstable.id()); + // @BEGIN gipsa +#if defined TARGET_HAS_ThirdPartyLSL + OVP_Declare_New(CBoxAlgorithmLSLExportGipsaDesc); +#endif // TARGET_HAS_ThirdPartyLSL + // @END gipsa + +OVP_Declare_End() + +} // namespace NetworkIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/CMakeLists.txt new file mode 100644 index 0000000..37e8e6b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/CMakeLists.txt @@ -0,0 +1,36 @@ +PROJECT(openvibe-plugins-contrib-python2) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# ----------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyPython2") +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +IF(WIN32) + # The pygame scenario doesn't work on Windows, so do not install it + INSTALL(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/ PATTERN "*-pygame-*" EXCLUDE) +ELSE() + INSTALL(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) +ENDIF() + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/plugins/python2) diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/python2-hello-world.xml b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/python2-hello-world.xml new file mode 100755 index 0000000..4e2e598 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/python2-hello-world.xml @@ -0,0 +1,119 @@ + + 1 + openvibe + 2.0 + + + (0x00003954, 0x000010bb) + Hello World! + (0x5dc4f669, 0xd3fd4d64) + + + (0x007deef9, 0x2f3e95c6) + Clock frequency (Hz) + 60 + 1 + false + + + (0xb0d0db45, 0x49cbc34a) + Script + + ${Player_ScenarioDirectory}/scripts/python-hello-world.py + false + + + (0x79a9edeb, 0x245d83fc) + Message + Hello World! + Hello World! + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 176 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x2a651510, 0xb4fad0d4) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 101 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + + + + (0x000047c8, 0x000050cf) + <b>Hello World!</b> + +Prints a friendly message. + +You can customize the message by editing +the box configuration. + + + + (0x473d9a43, 0x97fc0a97) + -80 + + + (0x7234b86b, 0x2b8651a5) + 304 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":507,"identifier":"(0x00003962, 0x00000a21)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":798},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000781e, 0x00004e65)","index":0,"name":"Default tab","parentIdentifier":"(0x00003962, 0x00000a21)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00006808, 0x00000e28)","index":0,"name":"Empty","parentIdentifier":"(0x0000781e, 0x00004e65)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/python2-print-stimulations.xml b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/python2-print-stimulations.xml new file mode 100644 index 0000000..8575538 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/python2-print-stimulations.xml @@ -0,0 +1,215 @@ + + 1 + openvibe + 2.0 + + + (0x00004db4, 0x00006a35) + Python 2 scripting + (0x5dc4f669, 0xd3fd4d64) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x007deef9, 0x2f3e95c6) + Clock frequency (Hz) + 64 + 64 + false + + + (0xb0d0db45, 0x49cbc34a) + Script + + ${Player_ScenarioDirectory}/scripts/python-print-stimulations.py + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 128.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 400.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x2a651510, 0xb4fad0d4) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 114 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05874423) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005777, 0x00006c19) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 1.0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 400.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xad100179, 0xa3c984ab) + 114 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0062599e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + + + (0x0000412b, 0x00003ac4) + + (0x00005777, 0x00006c19) + 0 + + + (0x00004db4, 0x00006a35) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 66 + + + (0x358ae8b5, 0x0f8bacd1) + 400 + + + (0x3f0a3b27, 0x570913d2) + 107 + + + (0x6267b5c5, 0x676e3e42) + 400 + + + + + + + (0x00003cb4, 0x00004c5e) + The clock stimulator generates +1 stim per second. + +The associated python script should +print all the received stimulations. + + + (0x473d9a43, 0x97fc0a97) + 640.000000 + + + (0x7234b86b, 0x2b8651a5) + 96.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x000051c6, 0x0000403f)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006099, 0x00001a73)","index":0,"name":"Default tab","parentIdentifier":"(0x000051c6, 0x0000403f)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00004197, 0x00001dca)","index":0,"name":"Empty","parentIdentifier":"(0x00006099, 0x00001a73)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/python2-pygame-multiprocessing.xml b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/python2-pygame-multiprocessing.xml new file mode 100644 index 0000000..278dbdb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/python2-pygame-multiprocessing.xml @@ -0,0 +1,276 @@ + + 1 + OpenVIBE + 0.2.99 + + + + + + (0x441e2100, 0x610e711c) + Multiprocessing + (0x5dc4f669, 0xd3fd4d64) + + + (0x007deef9, 0x2f3e95c6) + Clock frequency (Hz) + 60 + 4 + false + + + (0xb0d0db45, 0x49cbc34a) + Script + + ${Player_ScenarioDirectory}/scripts/python-multiprocessing.py + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x2a651510, 0xb4fad0d4) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x47008917, 0x4f6a4317) + Moving circle + (0x5dc4f669, 0xd3fd4d64) + + + (0x007deef9, 0x2f3e95c6) + Clock frequency (Hz) + 60 + 4 + false + + + (0xb0d0db45, 0x49cbc34a) + Script + + ${Player_ScenarioDirectory}/scripts/python-moving-circle.py + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x2a651510, 0xb4fad0d4) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x51f53da2, 0x789994d2) + Star field + (0x5dc4f669, 0xd3fd4d64) + + + (0x007deef9, 0x2f3e95c6) + Clock frequency (Hz) + 60 + 4 + false + + + (0xb0d0db45, 0x49cbc34a) + Script + + ${Player_ScenarioDirectory}/scripts/python-star-field.py + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x2a651510, 0xb4fad0d4) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + + + + (0x0ad104c8, 0x2ee0799b) + <big>Do not forget to look at the python scripts used +in all of the python boxes in this scenario.</big> + + + (0x473d9a43, 0x97fc0a97) + 368 + + + (0x7234b86b, 0x2b8651a5) + -32 + + + + + (0x4e7de8aa, 0x561bc220) + <b>Multiprocessing</b> + +Creates a new processus +which works in the background. + + + (0x473d9a43, 0x97fc0a97) + 480 + + + (0x7234b86b, 0x2b8651a5) + 224 + + + + + (0x6bfbf8ad, 0x3b970ba1) + <b>Moving Circle</b> and <b>Starfield</b> + +These two scripts illustrate running +several instances of pygame at +the same time. + + + (0x473d9a43, 0x97fc0a97) + 496 + + + (0x7234b86b, 0x2b8651a5) + 384 + + + + + (0x704b39c7, 0x74448e12) + <big><b><span color="red">Warning</span></b></big> + +For the time being multiprocessing and pygame only work +on <b>Linux</b> operating system provided <span color="red">you have installed <i>pygame</i> module</span> in Python. + + + (0x473d9a43, 0x97fc0a97) + 368 + + + (0x7234b86b, 0x2b8651a5) + 80 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x71777b71, 0x7d9b955c)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x3587c6af, 0x788f3c37)","index":0,"name":"Default tab","parentIdentifier":"(0x71777b71, 0x7d9b955c)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x5aab9723, 0x14698840)","index":0,"name":"Empty","parentIdentifier":"(0x3587c6af, 0x788f3c37)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/python2-sinus-oscillator.xml b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/python2-sinus-oscillator.xml new file mode 100644 index 0000000..bd05f04 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/python2-sinus-oscillator.xml @@ -0,0 +1,1183 @@ + + 1 + OpenVIBE + 2.0.0 + + + + + + (0x00000274, 0x0000068c) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000003b1, 0x0000610e) + Sinus + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 576.000000 + + + (0x207c9054, 0x3c841b63) + 272.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000012bf, 0x0000401e) + Clock stimulator + (0x5dc4f669, 0xd3fd4d64) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Clock frequency (Hz) + 60 + 1 + false + + + (0xb0d0db45, 0x49cbc34a) + Script + + ${Player_ScenarioDirectory}/scripts/python-clock-stimulator.py + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 176 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x2a651510, 0xb4fad0d4) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x000019c7, 0x00007a0a) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001d15, 0x000035b2) + Sinus generator + (0x5dc4f669, 0xd3fd4d64) + + + (0x5ba36127, 0x195feae1) + Generated signals + + + + + (0x007deef9, 0x2f3e95c6) + Clock frequency (Hz) + 60 + 16 + false + + + (0xb0d0db45, 0x49cbc34a) + Script + + ${Player_ScenarioDirectory}/scripts/python-sinus-oscillator.py + false + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 176 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x2a651510, 0xb4fad0d4) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x000028f8, 0x00007abf) + Spectral analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imag Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000432f, 0x00000c65) + Mean + (0x5dc4f669, 0xd3fd4d64) + + + (0x5ba36127, 0x195feae1) + Signal + + + + + (0x5ba36127, 0x195feae1) + Signal + + + + + (0x007deef9, 0x2f3e95c6) + Clock frequency (Hz) + 60 + 60 + false + + + (0xb0d0db45, 0x49cbc34a) + Script + + ${Player_ScenarioDirectory}/scripts/python-signal-average.py + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 176 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x2a651510, 0xb4fad0d4) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004d1c, 0x00000772) + Spectral analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imag Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006467, 0x00001c99) + Mean + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560.000000 + + + (0x207c9054, 0x3c841b63) + 144.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00fdde89, 0x1b93e4d6) + Mean spectrum + (0xecb46081, 0x96da0d49) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0x6b60e2b2, 0xf4839b7d) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x600f781b, 0x55dd55ad) + Sinus spectrum + (0xecb46081, 0x96da0d49) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x6b60e2b2, 0xf4839b7d) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000005a9, 0x0000648a) + + (0x000012bf, 0x0000401e) + 0 + + + (0x00006467, 0x00001c99) + 1 + + + + (0x00000819, 0x0000461a) + + (0x00001d15, 0x000035b2) + 0 + + + (0x0000432f, 0x00000c65) + 0 + + + + (0x00000b01, 0x00006b2f) + + (0x000019c7, 0x00007a0a) + 0 + + + (0x00004d1c, 0x00000772) + 0 + + + + (0x000033b9, 0x00003383) + + (0x00001d15, 0x000035b2) + 0 + + + (0x00000274, 0x0000068c) + 0 + + + + (0x000044b9, 0x0000033f) + + (0x0000432f, 0x00000c65) + 0 + + + (0x00006467, 0x00001c99) + 0 + + + + (0x00004f68, 0x00007af8) + + (0x00000274, 0x0000068c) + 0 + + + (0x000028f8, 0x00007abf) + 0 + + + + (0x00005d70, 0x000018f7) + + (0x000012bf, 0x0000401e) + 0 + + + (0x000003b1, 0x0000610e) + 1 + + + + (0x000062f9, 0x00005eab) + + (0x0000432f, 0x00000c65) + 0 + + + (0x000019c7, 0x00007a0a) + 0 + + + + (0x00006a22, 0x00007e73) + + (0x00001d15, 0x000035b2) + 0 + + + (0x000003b1, 0x0000610e) + 0 + + + + (0x0812dc20, 0x1ceb73ca) + + (0x00004d1c, 0x00000772) + 0 + + + (0x00fdde89, 0x1b93e4d6) + 0 + + + + (0x3c41f60b, 0x5f25ccd9) + + (0x000028f8, 0x00007abf) + 0 + + + (0x600f781b, 0x55dd55ad) + 0 + + + + + + (0x00000c06, 0x00005ae8) + <b>Sinus generator</b> + +This script generates a sine wave. + + + (0x473d9a43, 0x97fc0a97) + -80 + + + (0x7234b86b, 0x2b8651a5) + 160 + + + + + (0x00001db4, 0x0000366b) + <b>Mean</b> + +This script calculates the mean of +all of the channels in a signal. + +It describes the use of the +<b>numpy</b> python library. + + + (0x473d9a43, 0x97fc0a97) + -80 + + + (0x7234b86b, 0x2b8651a5) + 304 + + + + + (0x00002594, 0x00000a0b) + Spectra are displayed to better compare the generated results + + + (0x473d9a43, 0x97fc0a97) + 528 + + + (0x7234b86b, 0x2b8651a5) + 304 + + + + + (0x0000325b, 0x0000062b) + <b>Clock stimulator</b> + +This script generates stimulations +every time it is triggered. + +It illustrates the use of +<i>Clock Frequency</i> parameter. + + + (0x473d9a43, 0x97fc0a97) + -80 + + + (0x7234b86b, 0x2b8651a5) + 464 + + + + + (0x000048e9, 0x00002016) + This scenario illustrates several user cases of the <b>Python Scripting Box</b> + +Three boxes are used: + +- Sinus generator : generates signal +- Clock stimulator : generates stimulations +- Mean : transforms signal + +<b>Note:</b> This tutorial needs the <b>numpy</b> package +installed for your Python distribution! + + + (0x473d9a43, 0x97fc0a97) + 480 + + + (0x7234b86b, 0x2b8651a5) + 48 + + + + + (0x00006e8c, 0x000030a5) + <big>Do not forget to look at the python scripts used +in all of the python boxes in this scenario.</big> + + + (0x473d9a43, 0x97fc0a97) + -80 + + + (0x7234b86b, 0x2b8651a5) + 16 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":507,"identifier":"(0x00000a5d, 0x000009b3)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":788},{"boxIdentifier":"(0x00fdde89, 0x1b93e4d6)","childCount":0,"identifier":"(0x18420731, 0x0ec50e67)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0x600f781b, 0x55dd55ad)","childCount":0,"identifier":"(0x32b90808, 0x5251ed21)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000127e, 0x00006228)","index":0,"name":"Default tab","parentIdentifier":"(0x00000a5d, 0x000009b3)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":86,"identifier":"(0x000062c5, 0x000061a6)","index":0,"maxDividerPosition":370,"name":"Vertical split","parentIdentifier":"(0x0000127e, 0x00006228)","type":4},{"boxIdentifier":"(0x000003b1, 0x0000610e)","childCount":0,"identifier":"(0x000012aa, 0x00005e34)","index":0,"parentIdentifier":"(0x000062c5, 0x000061a6)","type":3},{"boxIdentifier":"(0x00006467, 0x00001c99)","childCount":0,"identifier":"(0x00006c89, 0x00003a9d)","index":1,"parentIdentifier":"(0x000062c5, 0x000061a6)","type":3}] + + + + + (0x4c536d0a, 0xb23dc545) + /home/ceriou/workspace/wip-ceriou-openvibe20-fix-build/openvibe/contrib/plugins/processing/python/box-tutorials/python/python-sinus-oscillator.xml + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-clock-stimulator.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-clock-stimulator.py new file mode 100644 index 0000000..8c5af33 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-clock-stimulator.py @@ -0,0 +1,31 @@ +# We construct a box instance that inherits from the basic OVBox class +class MyOVBox(OVBox): + # the constructor creates the box and initializes object variables + def __init__(self): + OVBox.__init__(self) + self.stimLabel = None + self.stimCode = None + + # the initialize method reads settings and outputs the first header + def initialize(self): + # the stim label is taken from the box setting + self.stimLabel = self.setting['Stimulation'] + # we get the corresponding code using the OpenViBE_stimulation dictionnary + self.stimCode = OpenViBE_stimulation[self.stimLabel] + # we append to the box output a stimulation header. This is just a header, dates are 0. + self.output[0].append(OVStimulationHeader(0., 0.)) + + def process(self): + # During each process call we produce a stimulation + # A stimulation set is a chunk which starts at current time and end time is the time step between two calls + stimSet = OVStimulationSet(self.getCurrentTime(), self.getCurrentTime()+1./self.getClock()) + # the date of the stimulation is simply the current openvibe time when calling the box process + stimSet.append(OVStimulation(self.stimCode, self.getCurrentTime(), 0.)) + self.output[0].append(stimSet) + + def uninitialize(self): + # we send a stream end. + end = self.getCurrentTime() + self.output[0].append(OVStimulationEnd(end, end)) + +box = MyOVBox() diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-hello-world.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-hello-world.py new file mode 100755 index 0000000..82e4447 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-hello-world.py @@ -0,0 +1,19 @@ + +class MyOVBox(OVBox): + def __init__(self): + OVBox.__init__(self) + + def initialize(self): + # nop + return + + def process(self): + # print the string specified in the box configuration. + # 'Message' is the name of the config entry. + print(self.setting['Message']) + + def uninitialize(self): + # nop + return + +box = MyOVBox() diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-moving-circle.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-moving-circle.py new file mode 100644 index 0000000..e14fd2a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-moving-circle.py @@ -0,0 +1,80 @@ +from multiprocessing import Process, Event +import time +import pygame +from pygame.locals import * +import math +from random import randint, randrange +import sys +sys.argv = ['openvibe'] + +class OVProcess(Process): + def __init__(self): + Process.__init__(self) + self.initialized = Event() + self.stop_asked = Event() + + def initialize(self): + pass + + def process(self): + pass + + def uninitialize(self): + pass + + def stop(self): + self.stop_asked.set() + + def run(self): + self.initialize() + self.initialized.set() + while not self.stop_asked.is_set(): + self.process() + self.uninitialize() + +class MovingCircle(OVProcess): + def __init__(self): + OVProcess.__init__(self) + self.screen = None + self.pos = [320,240] + self.speed = 5 + self.dirx = -self.speed + self.diry = -self.speed + + def initialize(self): + pygame.init() + pygame.display.set_caption(self.name) + self.screen = pygame.display.set_mode((640,480),0,32) + + def process(self): + begining = time.time() + self.pos[0] += self.dirx + self.pos[1] += self.diry + if self.pos[0] > 640 or self.pos[0] < 0: + self.dirx = -self.dirx + if self.pos[1] > 480 or self.pos[1] < 0: + self.diry = -self.diry + self.screen.fill((255,255,255)) + pygame.draw.circle(self.screen, (0,0,0), self.pos, 25, 0) + pygame.display.update() + while (time.time() - begining) < (1.0/60.0): + pass + + +class MyOVBox(OVBox): + def __init__(self): + OVBox.__init__(self) + self.p = None + def initialize(self): + self.p = MovingCircle() + self.p.start() + + def process(self): + pass + + def uninitialize(self): + self.p.stop() + self.p.join() + +if __name__ == '__main__': + box = MyOVBox() diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-multiprocessing.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-multiprocessing.py new file mode 100644 index 0000000..c5d3c9a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-multiprocessing.py @@ -0,0 +1,31 @@ +from multiprocessing import Process, Queue +import time + +class MyOVBox(OVBox): + def __init__(self): + OVBox.__init__(self) + self.p = None + self.q = None + + def f(self, queue): + while True: + queue.put('hello') + time.sleep(1) + + def initialize(self): + print "process initialize!" + self.q = Queue() + self.p = Process(target=self.f, args=(self.q,)) + self.p.start() + + def process(self): + for i in range(self.q.qsize()): + print self.q.get() + + def uninitialize(self): + print "process uninitialize!" + self.p.terminate() + self.p.join() + +if __name__ == '__main__': + box = MyOVBox() diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-print-stimulations.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-print-stimulations.py new file mode 100644 index 0000000..49ea94f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-print-stimulations.py @@ -0,0 +1,25 @@ + +class MyOVBox(OVBox): + def __init__(self): + OVBox.__init__(self) + + def initialize(self): + # nop + return + + def process(self): + for chunkIdx in range( len(self.input[0]) ): + chunk = self.input[0].pop() + if(type(chunk) == OVStimulationSet): + for stimIdx in range(len(chunk)): + stim=chunk.pop(); + print 'Received stim', stim.identifier, 'stamped at', stim.date, 's' + #else: + # print 'Received chunk of type ', type(chunk), " looking for StimulationSet" + return + + def uninitialize(self): + # nop + return + +box = MyOVBox() diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-signal-average.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-signal-average.py new file mode 100644 index 0000000..6a6d12e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-signal-average.py @@ -0,0 +1,27 @@ +import numpy + +class MyOVBox(OVBox): + def __init__(self): + OVBox.__init__(self) + self.signalHeader = None + + def process(self): + for chunkIdx in range( len(self.input[0]) ): + if(type(self.input[0][chunkIdx]) == OVSignalHeader): + self.signalHeader = self.input[0].pop() + + outputHeader = OVSignalHeader(self.signalHeader.startTime, self.signalHeader.endTime, [1, self.signalHeader.dimensionSizes[1]], ['Mean']+self.signalHeader.dimensionSizes[1]*[''], self.signalHeader.samplingRate) + + self.output[0].append(outputHeader) + + elif(type(self.input[0][chunkIdx]) == OVSignalBuffer): + chunk = self.input[0].pop() + numpyBuffer = numpy.array(chunk).reshape(tuple(self.signalHeader.dimensionSizes)) + numpyBuffer = numpyBuffer.mean(axis=0) + chunk = OVSignalBuffer(chunk.startTime, chunk.endTime, numpyBuffer.tolist()) + self.output[0].append(chunk) + + elif(type(self.input[0][chunkIdx]) == OVSignalEnd): + self.output[0].append(self.input[0].pop()) + +box = MyOVBox() diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-sinus-oscillator-without-numpy.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-sinus-oscillator-without-numpy.py new file mode 100644 index 0000000..43a99fc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-sinus-oscillator-without-numpy.py @@ -0,0 +1,76 @@ +from math import * +import random, time + +class MyOVBox(OVBox): + def __init__(self): + OVBox.__init__(self) + self.nChannel = 0 + self.sampling = 0 + self.epochSampleCount = 0 + self.startTime = 0 + self.endTime = 0 + self.dimensionSizes = list() + self.dimensionLabels = list() + self.timeBuffer = list() + self.signalBuffer = list() + self.signalHeader = None + + def initialize(self): + random.seed(time.time()) + self.nChannel = int(self.setting['Channel count']) + self.sampling = int(self.setting['Sampling frequency']) + self.epochSampleCount = int(self.setting['Generated epoch sample count']) + + #creation of the signal header + for i in range(self.nChannel): + self.dimensionLabels.append( 'Sinus'+str(i) ) + self.dimensionLabels += self.epochSampleCount*[''] + self.dimensionSizes = [self.nChannel, self.epochSampleCount] + self.signalHeader = OVSignalHeader(0., 0., self.dimensionSizes, self.dimensionLabels, self.sampling) + self.output[0].append(self.signalHeader) + + #creation of the first signal chunk + self.endTime = self.epochSampleCount + self.signalBuffer = [0.]*self.nChannel*self.epochSampleCount + self.update_timeBuffer() + self.update_signalBuffer() + + + def updateStartTime(self): + self.startTime += self.epochSampleCount + + def updateEndTime(self): + self.endTime += self.epochSampleCount + + def updateTimeBuffer(self): + self.timeBuffer = range(self.startTime, self.endTime) + for instant_index, instant in enumerate(self.timeBuffer): + self.timeBuffer[instant_index] = float(instant)/self.sampling + + + def updateSignalBuffer(self): + for channel in range(self.nChannel): + for instantIndex, instant in enumerate(self.timeBuffer): + newSample = 100.*sin(2.*pi*float(channel+1)*instant) + (1000.*random.random()-500.) + self.signalBuffer[channel*self.epochSampleCount+instantIndex] = newSample + + def sendSignalBufferToOpenvibe(self): + start = self.timeBuffer[0] + end = self.timeBuffer[-1] + 1.0/self.sampling + self.output[0].append( OVSignalBuffer(start, end, self.signalBuffer) ) + + def process(self): + start = self.timeBuffer[0] + end = self.timeBuffer[-1] + if self.getCurrentTime() >= end: + self.sendSignalBufferToOpenvibe() + self.updateStartTime() + self.updateEndTime() + self.updateTimeBuffer() + self.updateSignalBuffer() + + def uninitialize(self): + end = self.timeBuffer[-1] + self.output[0].append(OVSignalEnd(end, end)) + +box = MyOVBox() diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-sinus-oscillator.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-sinus-oscillator.py new file mode 100644 index 0000000..3402348 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-sinus-oscillator.py @@ -0,0 +1,69 @@ +import numpy + +class MyOVBox(OVBox): + def __init__(self): + OVBox.__init__(self) + self.nChannel = 0 + self.sampling = 0 + self.epochSampleCount = 0 + self.startTime = 0. + self.endTime = 0. + self.dimensionSizes = list() + self.dimensionLabels = list() + self.timeBuffer = list() + self.signalBuffer = None + self.signalHeader = None + + def initialize(self): + self.nChannel = int(self.setting['Channel count']) + self.sampling = int(self.setting['Sampling frequency']) + self.epochSampleCount = int(self.setting['Generated epoch sample count']) + + #creation of the signal header + for i in range(self.nChannel): + self.dimensionLabels.append( 'Sinus'+str(i) ) + self.dimensionLabels += self.epochSampleCount*[''] + self.dimensionSizes = [self.nChannel, self.epochSampleCount] + self.signalHeader = OVSignalHeader(0., 0., self.dimensionSizes, self.dimensionLabels, self.sampling) + self.output[0].append(self.signalHeader) + + #creation of the first signal chunk + self.endTime = 1.*self.epochSampleCount/self.sampling + self.signalBuffer = numpy.zeros((self.nChannel, self.epochSampleCount)) + self.updateTimeBuffer() + self.updateSignalBuffer() + + def updateStartTime(self): + self.startTime += 1.*self.epochSampleCount/self.sampling + + def updateEndTime(self): + self.endTime = float(self.startTime + 1.*self.epochSampleCount/self.sampling) + + def updateTimeBuffer(self): + self.timeBuffer = numpy.arange(self.startTime, self.endTime, 1./self.sampling) + + def updateSignalBuffer(self): + for rowIndex, row in enumerate(self.signalBuffer): + self.signalBuffer[rowIndex,:] = 100.*numpy.sin( 2.*numpy.pi*(rowIndex+1.)*self.timeBuffer ) + + def sendSignalBufferToOpenvibe(self): + start = self.timeBuffer[0] + end = self.timeBuffer[-1] + 1./self.sampling + bufferElements = self.signalBuffer.reshape(self.nChannel*self.epochSampleCount).tolist() + self.output[0].append( OVSignalBuffer(start, end, bufferElements) ) + + def process(self): + start = self.timeBuffer[0] + end = self.timeBuffer[-1] + if self.getCurrentTime() >= end: + self.sendSignalBufferToOpenvibe() + self.updateStartTime() + self.updateEndTime() + self.updateTimeBuffer() + self.updateSignalBuffer() + + def uninitialize(self): + end = self.timeBuffer[-1] + self.output[0].append(OVSignalEnd(end, end)) + +box = MyOVBox() diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-star-field.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-star-field.py new file mode 100644 index 0000000..b6b277f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/box-tutorials/python2/scripts/python-star-field.py @@ -0,0 +1,106 @@ +from multiprocessing import Process, Event +import time +import pygame +from pygame.locals import * +import math +from random import randint, randrange +import sys +sys.argv = ['openvibe'] + +class OVProcess(Process): + def __init__(self): + Process.__init__(self) + self.initialized = Event() + self.stop_asked = Event() + + def initialize(self): + pass + + def process(self): + pass + + def uninitialize(self): + pass + + def stop(self): + self.stop_asked.set() + + def run(self): + self.initialize() + self.initialized.set() + while not self.stop_asked.is_set(): + self.process() + self.uninitialize() + + +class StarField(OVProcess): + def __init__(self, num_stars, max_depth): + OVProcess.__init__(self) + self.pygame_is_running = False + self.screen = None + self.clock = None + self.num_stars = num_stars + self.max_depth = max_depth + self.stars = [] + for i in range(self.num_stars): + star = [randrange(-25,25), randrange(-25,25), randrange(1, self.max_depth)] + self.stars.append(star) + + def initialize(self): + pygame.init() + self.pygame_is_running = True + self.screen = pygame.display.set_mode((640, 480)) + pygame.display.set_caption("3D Starfield Simulation") + self.clock = pygame.time.Clock() + + def move_and_draw_stars(self): + origin_x = self.screen.get_width() / 2 + origin_y = self.screen.get_height() / 2 + for star in self.stars: + star[2] -= 0.19 + if star[2] <= 0: + star[0] = randrange(-25,25) + star[1] = randrange(-25,25) + star[2] = self.max_depth + k = 128.0 / star[2] + x = int(star[0] * k + origin_x) + y = int(star[1] * k + origin_y) + if 0 <= x < self.screen.get_width() and 0 <= y < self.screen.get_height(): + size = (1 - float(star[2]) / self.max_depth) * 5 + shade = (1 - float(star[2]) / self.max_depth) * 255 + self.screen.fill((shade,shade,shade),(x,y,size,size)) + + def process(self): + if self.pygame_is_running: + self.clock.tick(50) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + self.pygame_is_running = False + return + self.screen.fill((0,0,0)) + self.move_and_draw_stars() + pygame.display.flip() + + def uninitialize(self): + if self.pygame_is_running: + pygame.quit() + self.pygame_is_running = False + +class MyOVBox(OVBox): + def __init__(self): + OVBox.__init__(self) + self.p = None + def initialize(self): + self.p = StarField(512, 32) + self.p.start() + + def process(self): + pass + + def uninitialize(self): + self.p.stop() + self.p.join() + +if __name__ == '__main__': + box = MyOVBox() diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/doc/Doc_BoxAlgorithm_PythonScripting2.dox-part b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/doc/Doc_BoxAlgorithm_PythonScripting2.dox-part new file mode 100644 index 0000000..6a08329 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/doc/Doc_BoxAlgorithm_PythonScripting2.dox-part @@ -0,0 +1,50 @@ +/** + * \page BoxAlgorithm_Python2Scripting Python 2 scripting +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Python2Scripting_Description| + This box can process data from and to OpenViBE using Python script. + Available IO types are Streamed Matrix, Signal and Stimulations. + + The user Python Script must define a new class that inherits from OVBox, + and implements the initialize, process and uninitialize methods. + + User script must end with : box = MyOVBox() where MyOVBox is the new class. + + Please look at the documentation page for more details. + + * |OVP_DocEnd_BoxAlgorithm_Python2Scripting_Description| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Python2Scripting_Settings| + * |OVP_DocEnd_BoxAlgorithm_Python2Scripting_Settings| + + * |OVP_DocBegin_BoxAlgorithm_Python2Scripting_Setting1| + The box clock frequency. The Python process function is called at each tick. + * |OVP_DocEnd_BoxAlgorithm_Python2Scripting_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_Python2Scripting_Setting2| + The Python script file. + * |OVP_DocEnd_BoxAlgorithm_Python2Scripting_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Python2Scripting_Examples| + See this page for commented examples. + * |OVP_DocEnd_BoxAlgorithm_Python2Scripting_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Python2Scripting_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_Python2Scripting_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/share/StimulationsCodes.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/share/StimulationsCodes.py new file mode 100644 index 0000000..ad4a62e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/share/StimulationsCodes.py @@ -0,0 +1,227 @@ +# -*- coding: utf-8 -*- +#File Name : StimulationsCodes.py +#Created By : Aurelien Van Langhenhove + +## Stimulation codes +## Originally from openvibe-toolkit/ovtk_defines.h + +OpenViBE_stimulation = { +'OVTK_StimulationId_ExperimentStart' : 0x00008001, +'OVTK_StimulationId_ExperimentStop' : 0x00008002, +'OVTK_StimulationId_SegmentStart' : 0x00008003, +'OVTK_StimulationId_SegmentStop' : 0x00008004, +'OVTK_StimulationId_TrialStart' : 0x00008005, +'OVTK_StimulationId_TrialStop' : 0x00008006, +'OVTK_StimulationId_BaselineStart' : 0x00008007, +'OVTK_StimulationId_BaselineStop' : 0x00008008, +'OVTK_StimulationId_RestStart' : 0x00008009, +'OVTK_StimulationId_RestStop' : 0x0000800a, +'OVTK_StimulationId_VisualStimulationStart' : 0x0000800b, +'OVTK_StimulationId_VisualStimulationStop' : 0x0000800c, +'OVTK_StimulationId_VisualSteadyStateStimulationStart' : 0x00008010, +'OVTK_StimulationId_VisualSteadyStateStimulationStop' : 0x00008011, + +'OVTK_StimulationId_RemovedSamples' : 0x00008310, +'OVTK_StimulationId_AddedSamplesBegin' : 0x00008311, +'OVTK_StimulationId_AddedSamplesEnd' : 0x00008312, + +'OVTK_StimulationId_LabelStart' : 0x00008100, +'OVTK_StimulationId_Label_00' : 0x00008100, +'OVTK_StimulationId_Label_01' : 0x00008101, +'OVTK_StimulationId_Label_02' : 0x00008102, +'OVTK_StimulationId_Label_03' : 0x00008103, +'OVTK_StimulationId_Label_04' : 0x00008104, +'OVTK_StimulationId_Label_05' : 0x00008105, +'OVTK_StimulationId_Label_06' : 0x00008106, +'OVTK_StimulationId_Label_07' : 0x00008107, +'OVTK_StimulationId_Label_08' : 0x00008108, +'OVTK_StimulationId_Label_09' : 0x00008109, +'OVTK_StimulationId_Label_0A' : 0x0000810a, +'OVTK_StimulationId_Label_0B' : 0x0000810b, +'OVTK_StimulationId_Label_0C' : 0x0000810c, +'OVTK_StimulationId_Label_0D' : 0x0000810d, +'OVTK_StimulationId_Label_0E' : 0x0000810e, +'OVTK_StimulationId_Label_0F' : 0x0000810f, +'OVTK_StimulationId_Label_10' : 0x00008110, +'OVTK_StimulationId_Label_11' : 0x00008111, +'OVTK_StimulationId_Label_12' : 0x00008112, +'OVTK_StimulationId_Label_13' : 0x00008113, +'OVTK_StimulationId_Label_14' : 0x00008114, +'OVTK_StimulationId_Label_15' : 0x00008115, +'OVTK_StimulationId_Label_16' : 0x00008116, +'OVTK_StimulationId_Label_17' : 0x00008117, +'OVTK_StimulationId_Label_18' : 0x00008118, +'OVTK_StimulationId_Label_19' : 0x00008119, +'OVTK_StimulationId_Label_1A' : 0x0000811a, +'OVTK_StimulationId_Label_1B' : 0x0000811b, +'OVTK_StimulationId_Label_1C' : 0x0000811c, +'OVTK_StimulationId_Label_1D' : 0x0000811d, +'OVTK_StimulationId_Label_1E' : 0x0000811e, +'OVTK_StimulationId_Label_1F' : 0x0000811f, +'OVTK_StimulationId_LabelEnd' : 0x000081ff, + +'OVTK_StimulationId_NumberStart' : 0x00000000, +'OVTK_StimulationId_Number_00' : 0x00000000, +'OVTK_StimulationId_Number_01' : 0x00000001, +'OVTK_StimulationId_Number_02' : 0x00000002, +'OVTK_StimulationId_Number_03' : 0x00000003, +'OVTK_StimulationId_Number_04' : 0x00000004, +'OVTK_StimulationId_Number_05' : 0x00000005, +'OVTK_StimulationId_Number_06' : 0x00000006, +'OVTK_StimulationId_Number_07' : 0x00000007, +'OVTK_StimulationId_Number_08' : 0x00000008, +'OVTK_StimulationId_Number_09' : 0x00000009, +'OVTK_StimulationId_Number_0A' : 0x0000000a, +'OVTK_StimulationId_Number_0B' : 0x0000000b, +'OVTK_StimulationId_Number_0C' : 0x0000000c, +'OVTK_StimulationId_Number_0D' : 0x0000000d, +'OVTK_StimulationId_Number_0E' : 0x0000000e, +'OVTK_StimulationId_Number_0F' : 0x0000000f, +'OVTK_StimulationId_Number_10' : 0x00000010, +'OVTK_StimulationId_Number_11' : 0x00000011, +'OVTK_StimulationId_Number_12' : 0x00000012, +'OVTK_StimulationId_Number_13' : 0x00000013, +'OVTK_StimulationId_Number_14' : 0x00000014, +'OVTK_StimulationId_Number_15' : 0x00000015, +'OVTK_StimulationId_Number_16' : 0x00000016, +'OVTK_StimulationId_Number_17' : 0x00000017, +'OVTK_StimulationId_Number_18' : 0x00000018, +'OVTK_StimulationId_Number_19' : 0x00000019, +'OVTK_StimulationId_Number_1A' : 0x0000001a, +'OVTK_StimulationId_Number_1B' : 0x0000001b, +'OVTK_StimulationId_Number_1C' : 0x0000001c, +'OVTK_StimulationId_Number_1D' : 0x0000001d, +'OVTK_StimulationId_Number_1E' : 0x0000001e, +'OVTK_StimulationId_Number_1F' : 0x0000001f, +'OVTK_StimulationId_NumberEnd' : 0x000000ff, + +'OVTK_StimulationId_Train' : 0x00008201, +'OVTK_StimulationId_Beep' : 0x00008202, +'OVTK_StimulationId_DoubleBeep' : 0x00008203, +'OVTK_StimulationId_EndOfFile' : 0x00008204, +'OVTK_StimulationId_Target' : 0x00008205, +'OVTK_StimulationId_NonTarget' : 0x00008206, + +'OVTK_GDF_Artifact_EOG_Large' : 0x101, +'OVTK_GDF_Artifact_ECG' : 0x102, +'OVTK_GDF_Artifact_EMG' : 0x103, +'OVTK_GDF_Artifact_Movement' : 0x104, +'OVTK_GDF_Artifact_Failing_Electrode' : 0x105, +'OVTK_GDF_Artifact_Sweat' : 0x106, +'OVTK_GDF_Artifact_50_60_Hz_Interference' : 0x107, +'OVTK_GDF_Artifact_Breathing' : 0x108, +'OVTK_GDF_Artifact_Pulse' : 0x109, +'OVTK_GDF_Artifact_EOG_Small' : 0x10A, + +'OVTK_GDF_Calibration' : 0x10F, + +'OVTK_GDF_EEG_Sleep_Splindles' : 0x111, +'OVTK_GDF_EEG_K_Complexes' : 0x112, +'OVTK_GDF_EEG_Saw_Tooth_Waves' : 0x113, +'OVTK_GDF_EEG_Idling_EEG_Eyes_Open' : 0x114, +'OVTK_GDF_EEG_Idling_EEG_Eyes_Closed' : 0x115, +'OVTK_GDF_EEG_Spike' : 0x116, +'OVTK_GDF_EEG_Seizure' : 0x117, + +'OVTK_GDF_VEP' : 0x121, +'OVTK_GDF_AEP' : 0x122, +'OVTK_GDF_SEP' : 0x123, +'OVTK_GDF_TMS' : 0x12F, + +'OVTK_GDF_SSVEP' : 0x131, +'OVTK_GDF_SSAEP' : 0x132, +'OVTK_GDF_SSSEP' : 0x133, + +'OVTK_GDF_Start_Of_Trial' : 0x300, +'OVTK_GDF_Left' : 0x301, +'OVTK_GDF_Right' : 0x302, +'OVTK_GDF_Foot' : 0x303, +'OVTK_GDF_Tongue' : 0x304, +'OVTK_GDF_class5' : 0x305, +'OVTK_GDF_Down' : 0x306, +'OVTK_GDF_class7' : 0x307, +'OVTK_GDF_class8' : 0x308, +'OVTK_GDF_class9' : 0x309, +'OVTK_GDF_class10' : 0x30A, +'OVTK_GDF_class11' : 0x30B, +'OVTK_GDF_Up' : 0x30C, +'OVTK_GDF_Feedback_Continuous' : 0x30D, +'OVTK_GDF_Feedback_Discrete' : 0x30E, +'OVTK_GDF_Cue_Unknown_Undefined' : 0x30F, +'OVTK_GDF_Beep' : 0x311, +'OVTK_GDF_Cross_On_Screen' : 0x312, +'OVTK_GDF_Flashing_Light' : 0x313, + +'OVTK_GDF_End_Of_Trial' : 0x320, + +'OVTK_GDF_Correct' : 0x381, +'OVTK_GDF_Incorrect' : 0x382, + +'OVTK_GDF_End_Of_Session' : 0x3F2, +'OVTK_GDF_Rejection' : 0x3FF, + +'OVTK_GDF_OAHE' : 0x401, +'OVTK_GDF_RERA' : 0x402, +'OVTK_GDF_CAHE' : 0x403, +'OVTK_GDF_CSB' : 0x404, +'OVTK_GDF_Sleep_Hypoventilation' : 0x405, +'OVTK_GDF_Maximum_Inspiration' : 0x40E, +'OVTK_GDF_Start_Of_Inspiration' : 0x40F, + +'OVTK_GDF_Wake' : 0x410, +'OVTK_GDF_Stage_1' : 0x411, +'OVTK_GDF_Stage_2' : 0x412, +'OVTK_GDF_Stage_3' : 0x413, +'OVTK_GDF_Stage_4' : 0x414, +'OVTK_GDF_REM' : 0x415, + +'OVTK_GDF_Lights_On' : 0x420, +'OVTK_GDF_Lights_Off' : 0x8420, + +'OVTK_GDF_Eyes_Left' : 0x431, +'OVTK_GDF_Eyes_Right' : 0x432, +'OVTK_GDF_Eyes_Up' : 0x433, +'OVTK_GDF_Eyes_Down' : 0x434, +'OVTK_GDF_Horizontal_Eye_Movement' : 0x435, +'OVTK_GDF_Vertical_Eye_Movement' : 0x436, +'OVTK_GDF_Rotation_Clockwise' : 0x437, +'OVTK_GDF_Rotation_Counterclockwise' : 0x438, +'OVTK_GDF_Eye_Blink' : 0x439, + +'OVTK_GDF_Left_Hand_Movement' : 0x441, +'OVTK_GDF_Right_Hand_Movement' : 0x442, +'OVTK_GDF_Head_Movement' : 0x443, +'OVTK_GDF_Tongue_Movement' : 0x444, +'OVTK_GDF_Swallowing' : 0x445, +'OVTK_GDF_Biting' : 0x446, +'OVTK_GDF_Foot_Movement' : 0x447, +'OVTK_GDF_Foot_Right_Movement' : 0x448, +'OVTK_GDF_Arm_Movement' : 0x449, +'OVTK_GDF_Arm_Right_Movement' : 0x44A, + +'OVTK_GDF_ECG_Fiducial_Point_QRS_Complex' : 0x501, +'OVTK_GDF_ECG_P_Wave' : 0x502, +'OVTK_GDF_ECG_QRS_Complex' : 0x503, +'OVTK_GDF_ECG_R_Point' : 0x504, +'OVTK_GDF_ECG_T_Wave' : 0x506, +'OVTK_GDF_ECG_U_Wave' : 0x507, + +'OVTK_GDF_Start' : 0x580, +'OVTK_GDF_25_Watt' : 0x581, +'OVTK_GDF_50_Watt' : 0x582, +'OVTK_GDF_75_Watt' : 0x583, +'OVTK_GDF_100_Watt' : 0x584, +'OVTK_GDF_125_Watt' : 0x585, +'OVTK_GDF_150_Watt' : 0x586, +'OVTK_GDF_175_Watt' : 0x587, +'OVTK_GDF_200_Watt' : 0x588, +'OVTK_GDF_225_Watt' : 0x589, +'OVTK_GDF_250_Watt' : 0x58A, +'OVTK_GDF_275_Watt' : 0x58B, +'OVTK_GDF_300_Watt' : 0x58C, +'OVTK_GDF_325_Watt' : 0x58D, +'OVTK_GDF_350_Watt' : 0x58E, + +'OVTK_GDF_Start_Of_New_Segment' : 0x7FFE, +'OVTK_GDF_Non_Equidistant_Sampling_Value' : 0x7FFF +} diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/share/openvibe.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/share/openvibe.py new file mode 100644 index 0000000..3a34f50 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/share/openvibe.py @@ -0,0 +1,180 @@ +# -*- coding: utf-8 -*- +#File Name : openvibe.py +#Created By : Aurelien Van Langhenhove + +from StimulationsCodes import * +import sys, traceback, collections +from StringIO import StringIO + +class NewStd(StringIO): + def __init__(self): + StringIO.__init__(self) + def flush(self): + self.buf = str() + def isempty(self): + if len(self.buf) == 0: + return True + else: + return False + +sys.stdout = NewStd() +sys.stderr = NewStd() + + +def execfileHandlingException(filename, maindictionary): + print "executing script file" + + try: + maindictionary['box'] = OVBox(default=True) # on en cree une au cas ou + #print globals() + execfile(filename, maindictionary) + return 0 + except: + print "error" + print traceback.format_exc() + return -1 + +def decoratorFunction(target): + """ add a try except block to protect openvibe box in case of exception """ + def wrapper(self): + try : + print "using decorator" + print 'Calling function "%s"' % target.__name__ + return target(self) + except: + print traceback.format_exc() + + return wrapper + +class OVChunk(object): + def __init__(self, startTime, endTime): + self.startTime = startTime + self.endTime = endTime + + +class OVStreamedMatrixHeader(OVChunk): + def __init__(self, startTime, endTime, dimensionSizes, dimensionLabels): + OVChunk.__init__(self, startTime, endTime) + self.dimensionSizes = list(dimensionSizes) + self.dimensionLabels = list(dimensionLabels) + + def getDimensionCount(self): + return len(self.dimensionSizes) + + def getBufferElementCount(self): + elementCount = 0 + for dimension, size in enumerate(self.dimensionSizes): + if dimension == 0: + elementCount = int(size) + else: + elementCount *= int(size) + return elementCount + +class OVStreamedMatrixBuffer(OVChunk, list): + def __init__(self, startTime, endTime, bufferElements): + OVChunk.__init__(self, startTime, endTime) + list.__init__(self, bufferElements) + +class OVStreamedMatrixEnd(OVChunk): + pass + + + +class OVSignalHeader(OVStreamedMatrixHeader): + def __init__(self, startTime, endTime, dimensionSizes, dimensionLabels, samplingRate): + OVStreamedMatrixHeader.__init__(self, startTime, endTime, dimensionSizes, dimensionLabels) + self.samplingRate = int(samplingRate) + +class OVSignalBuffer(OVStreamedMatrixBuffer): + pass + +class OVSignalEnd(OVChunk): + pass + + + +class OVStimulation(object): + def __init__(self, identifier, date, duration): + self.identifier = identifier + self.date = date + self.duration = duration + +class OVStimulationHeader(OVChunk): + pass + +class OVStimulationSet(OVChunk, list): + def __init__(self, startTime, endTime): + list.__init__(self) + OVChunk.__init__(self, startTime, endTime) + + def append(self, item): + if isinstance(item, OVStimulation): + list.append(self, item) + else: + raise TypeError("The item must be an OVStimulation") + +class OVStimulationEnd(OVChunk): + pass + + + +class OVBuffer(object): + def __init__(self, inputType): + self.__deque = collections.deque() + self.__type = inputType + def __len__(self): + return len(self.__deque) + def __getitem__(self, key): + return self.__deque[key] + def __setitem__(self, key, item): + self.__deque[key] = item + def __delitem__(self, key): + del self.__deque[key] + def append(self, toAppend): + self.__deque.appendleft(toAppend) + def pop(self): + return self.__deque.pop() + def type(self): + return self.__type + + +class OVBox(object): + def __init__(self, default=False): + self.input = list() + self.output = list() + self.setting = dict() + self.var = dict() + self._clock = 0 + self._currentTime = 0. + self.default= default + def addInput(self, inputType): + self.input.append(OVBuffer(inputType)) + def addOutput(self, outputType): + self.output.append(OVBuffer(outputType)) + def getClock(self): + return self._clock + def getCurrentTime(self): + return self._currentTime + def initialize(self): + if self.default == True: + print "The box instance has not been created by user script, using default one from openvibe.py (dummy box)." + pass + def process(self): + pass + def uninitialize(self): + pass + def realInitialize(self): + try : + self.initialize() + except: + print traceback.format_exc() + def realProcess(self): + try : + self.process() + except: + print traceback.format_exc() + def realUninitialize(self): + try : + self.uninitialize() + except: + print traceback.format_exc() diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/src/box-algorithms/ovpCBoxAlgorithmPython2.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/src/box-algorithms/ovpCBoxAlgorithmPython2.cpp new file mode 100644 index 0000000..f10a42a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/src/box-algorithms/ovpCBoxAlgorithmPython2.cpp @@ -0,0 +1,1667 @@ +#if defined(WIN32) && defined(TARGET_BUILDTYPE_Debug) +// Windows debug build doesn't typically link as most people don't have the python debug library. +#else + +#if defined TARGET_HAS_ThirdPartyPython2 + +#include "ovpCBoxAlgorithmPython2.h" + +#if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 2) + +#define UN_CONST(c) const_cast(c) +//#define UN_CONST(c) (char*)(c) +//#define UN_CONST(c) (c) + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Python { + +//**************************** +//***** Static Functions ***** +//**************************** +///------------------------------------------------------------------------------------------------- +static bool appendToPyObject(PyObject* obj, PyObject* buffer) +{ + PyObject* methodToCall = PyString_FromString("append"); + PyObject* result = PyObject_CallMethodObjArgs(buffer, methodToCall, obj, NULL); + Py_CLEAR(methodToCall); + if (result == nullptr) { return false; } + Py_CLEAR(result); + return true; +} + +static bool getLenFromPyObject(PyObject* obj, size_t& len) +{ + PyObject* pyLen = PyObject_CallMethod(obj, UN_CONST("__len__"), nullptr); + if (pyLen == nullptr) { return false; } + len = size_t(PyInt_AsUnsignedLongMask(pyLen)); + Py_CLEAR(pyLen); + return true; +} + +static void getTimeFromPyObject(PyObject* obj, const char* attr, uint64_t& time) +{ + PyObject* pyTime = PyObject_GetAttrString(obj, attr); + time = CTime(PyFloat_AsDouble(pyTime)).time(); + Py_CLEAR(pyTime); +} + +static void getTimesFromPyObject(PyObject* obj, uint64_t& start, uint64_t& end) +{ + getTimeFromPyObject(obj, "startTime", start); + getTimeFromPyObject(obj, "endTime", end); +} + +static bool setMatrixInfosFromPyObject(PyObject* obj, CMatrix* matrix) +{ + PyObject* pyNDim = PyObject_CallMethod(obj, UN_CONST("getDimensionCount"), nullptr); + if (pyNDim == nullptr) { return false; } + + const size_t nDim = PyInt_AsUnsignedLongMask(pyNDim); + matrix->setDimensionCount(nDim); + Py_CLEAR(pyNDim); + + PyObject* pySizeDim = PyObject_GetAttrString(obj, "dimensionSizes"); + PyObject* pyLabelDim = PyObject_GetAttrString(obj, "dimensionLabels"); + + size_t offset = 0; + for (size_t i = 0; i < nDim; ++i) + { + const size_t size = PyInt_AsUnsignedLongMask(PyList_GetItem(pySizeDim, Py_ssize_t(i))); + matrix->setDimensionSize(i, size); + for (size_t j = 0; j < size; ++j) { matrix->setDimensionLabel(i, j, PyString_AsString(PyList_GetItem(pyLabelDim, offset + j))); } + offset = offset + size; + } + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return true; +} +///------------------------------------------------------------------------------------------------- + +bool CBoxAlgorithmPython2::m_isPythonInitialized = false; +PyObject* CBoxAlgorithmPython2::m_mainModule = nullptr; +PyObject* CBoxAlgorithmPython2::m_mainDictionnary = nullptr; +PyObject* CBoxAlgorithmPython2::m_matrixHeader = nullptr; +PyObject* CBoxAlgorithmPython2::m_matrixBuffer = nullptr; +PyObject* CBoxAlgorithmPython2::m_matrixEnd = nullptr; +PyObject* CBoxAlgorithmPython2::m_signalHeader = nullptr; +PyObject* CBoxAlgorithmPython2::m_signalBuffer = nullptr; +PyObject* CBoxAlgorithmPython2::m_signalEnd = nullptr; +PyObject* CBoxAlgorithmPython2::m_stimulationHeader = nullptr; +PyObject* CBoxAlgorithmPython2::m_stimulation = nullptr; +PyObject* CBoxAlgorithmPython2::m_stimulationSet = nullptr; +PyObject* CBoxAlgorithmPython2::m_stimulationEnd = nullptr; +PyObject* CBoxAlgorithmPython2::m_buffer = nullptr; +PyObject* CBoxAlgorithmPython2::m_execFileFunction = nullptr; +PyObject* CBoxAlgorithmPython2::m_stdout = nullptr; +PyObject* CBoxAlgorithmPython2::m_stderr = nullptr; + +bool CBoxAlgorithmPython2::logSysStd(const bool out) +{ + //New reference + PyObject* pyLog = PyObject_CallMethod((out ? m_stdout : m_stderr), UN_CONST("getvalue"), nullptr); + if (pyLog == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to call sys.std" << (out ? "out" : "err") << ".getvalue().\n"; + return false; + } + + char* log = PyString_AsString(pyLog); + if (log == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to convert pyLog to (char *).\n"; + Py_CLEAR(pyLog); + return false; + } + Py_CLEAR(pyLog); + + if (strlen(log) > 0) + { + this->getLogManager() << Kernel::LogLevel_Info << log; + + PyObject* result = PyObject_CallMethod((out ? m_stdout : m_stderr), UN_CONST("flush"), nullptr); + if (result == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to call sys.std" << (out ? "out" : "err") << ".flush().\n"; + return false; + } + Py_CLEAR(result); + } + return true; +} + +uint64_t CBoxAlgorithmPython2::getClockFrequency() +{ + getLogManager() << Kernel::LogLevel_Trace << "Clock frequency requested at time " << getPlayerContext().getCurrentTime() << "\n"; + return m_clockFrequency << 32; +} + +void CBoxAlgorithmPython2::buildPythonSettings() +{ + const Kernel::IBox* boxCtx = getBoxAlgorithmContext()->getStaticBoxContext(); + for (uint32_t i = 2; i < boxCtx->getSettingCount(); ++i) + { + CString name; + boxCtx->getSettingName(i, name); + const CString value = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i); + PyDict_SetItemString(m_boxSetting, name, PyString_FromString(value.toASCIIString())); + } +} + +bool CBoxAlgorithmPython2::initializePythonSafely() +{ + // Only the first Python box does the initialization of the global parts + if (m_isPythonInitialized) { return true; } + + this->getLogManager() << Kernel::LogLevel_Info << "Discovered Python is " << Py_GetVersion() << " (" << Py_GetPlatform() << ")\n"; + this->getLogManager() << Kernel::LogLevel_Debug << "The Python path is [" << Py_GetPath() << "]\n"; + + const std::string cmd = string("import sys\nsys.path.append('") + Directories::getDataDir().toASCIIString() + "/plugins/python2')\nsys.argv = [\"openvibe\"]\n"; + // cmd += "import openvibe\n" + "from StimulationsCodes import *\n"; + this->getLogManager() << Kernel::LogLevel_Trace << "Running [" << cmd << "].\n"; + + PyRun_SimpleString(cmd.c_str()); + + //Borrowed reference + m_mainModule = PyImport_AddModule("__main__"); + //Borrowed reference + m_mainDictionnary = PyModule_GetDict(m_mainModule); + + //Execute the script which contains the different classes to interact with OpenViBE + const std::string path = string(Directories::getDataDir().toASCIIString()) + "/plugins/python2/openvibe.py"; + //New reference + PyObject* pyScriptFile = PyFile_FromString(UN_CONST(path.c_str()), UN_CONST("r")); + if (pyScriptFile == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to open '" << path << "'.\n"; + return false; + } + + if (PyRun_SimpleFile(PyFile_AsFile(pyScriptFile), UN_CONST(path.c_str())) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to run " << path << ".\n"; + Py_CLEAR(pyScriptFile); + return false; + } + Py_CLEAR(pyScriptFile); + + //Borrowed reference + m_stdout = PySys_GetObject(UN_CONST("stdout")); + if (m_stdout == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "sys.stdout does not exist.\n"; + return false; + } + //Borrowed reference + m_stderr = PySys_GetObject(UN_CONST("stderr")); + if (m_stderr == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "sys.stderr does not exist.\n"; + return false; + } + + //Borrowed reference + m_execFileFunction = PyDict_GetItemString(m_mainDictionnary, "execfileHandlingException"); + if (m_execFileFunction == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "openvibe.py doesn't have a execfileHandlingException function, quitting" << ".\n"; + return false; + } + + if (!PyCallable_Check(m_execFileFunction)) + { + this->getLogManager() << Kernel::LogLevel_Error << "openvibe.py doesn't have a execfileHandlingException function callable, " << ".\n"; + return false; + } + + //Borrowed reference + m_matrixHeader = PyDict_GetItemString(m_mainDictionnary, "OVStreamedMatrixHeader"); + if (m_matrixHeader == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVStreamedMatrixHeader\".\n"; + return false; + } + + //Borrowed reference + m_matrixBuffer = PyDict_GetItemString(m_mainDictionnary, "OVStreamedMatrixBuffer"); + if (m_matrixBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVStreamedMatrixBuffer\".\n"; + return false; + } + + //Borrowed reference + m_matrixEnd = PyDict_GetItemString(m_mainDictionnary, "OVStreamedMatrixEnd"); + if (m_matrixEnd == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVStreamedMatrixEnd\".\n"; + return false; + } + + //Borrowed reference + m_signalHeader = PyDict_GetItemString(m_mainDictionnary, "OVSignalHeader"); + if (m_signalHeader == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVSignalHeader\".\n"; + return false; + } + + //Borrowed reference + m_signalBuffer = PyDict_GetItemString(m_mainDictionnary, "OVSignalBuffer"); + if (m_signalBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVSignalBuffer\".\n"; + return false; + } + + //Borrowed reference + m_signalEnd = PyDict_GetItemString(m_mainDictionnary, "OVSignalEnd"); + if (m_signalEnd == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVSignalEnd\".\n"; + return false; + } + + //Borrowed reference + m_stimulationHeader = PyDict_GetItemString(m_mainDictionnary, "OVStimulationHeader"); + if (m_stimulationHeader == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVStimulationHeader\".\n"; + return false; + } + + //Borrowed reference + m_stimulation = PyDict_GetItemString(m_mainDictionnary, "OVStimulation"); + if (m_stimulation == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVStimulation\".\n"; + return false; + } + + //Borrowed reference + m_stimulationSet = PyDict_GetItemString(m_mainDictionnary, "OVStimulationSet"); + if (m_stimulationSet == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVStimulationSet\".\n"; + return false; + } + + //Borrowed reference + m_stimulationEnd = PyDict_GetItemString(m_mainDictionnary, "OVStimulationEnd"); + if (m_stimulationEnd == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVStimulationEnd\".\n"; + return false; + } + + //Borrowed reference + m_buffer = PyDict_GetItemString(m_mainDictionnary, "OVBuffer"); + if (m_buffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVBuffer\".\n"; + return false; + } + + m_isPythonInitialized = true; + + this->getLogManager() << Kernel::LogLevel_Info << "Python Interpreter initialized\n"; + + return true; +} + +bool CBoxAlgorithmPython2::initialize() +{ + m_box = nullptr; + m_boxInput = nullptr; + m_boxOutput = nullptr; + m_boxCurrentTime = nullptr; + m_boxSetting = nullptr; + m_boxInitialize = nullptr; + m_boxProcess = nullptr; + m_boxUninitialize = nullptr; + m_initializeSucceeded = false; + + if (!initializePythonSafely()) { return false; } + + //Initialize the clock frequency of the box depending on the first setting of the box + m_clockFrequency = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_scriptFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + if (strlen(m_scriptFilename.toASCIIString()) == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "You have to choose a script.\n"; + return false; + } + + //Create the decoders for the inputs + const Kernel::IBox& boxCtx = this->getStaticBoxContext(); + CIdentifier typeID; + for (size_t i = 0; i < boxCtx.getInputCount(); ++i) + { + boxCtx.getInputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { m_decoders.push_back(new Toolkit::TStreamedMatrixDecoder(*this, i)); } + else if (typeID == OV_TypeId_Signal) { m_decoders.push_back(new Toolkit::TSignalDecoder(*this, i)); } + else if (typeID == OV_TypeId_FeatureVector) { m_decoders.push_back(new Toolkit::TFeatureVectorDecoder(*this, i)); } + else if (typeID == OV_TypeId_Spectrum) { m_decoders.push_back(new Toolkit::TSpectrumDecoder(*this, i)); } + else if (typeID == OV_TypeId_ChannelLocalisation) { m_decoders.push_back(new Toolkit::TChannelLocalisationDecoder(*this, i)); } + else if (typeID == OV_TypeId_Stimulations) { m_decoders.push_back(new Toolkit::TStimulationDecoder(*this, i)); } + else if (typeID == OV_TypeId_ExperimentInfo) { m_decoders.push_back(new Toolkit::TExperimentInfoDecoder(*this, i)); } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Codec to decode " << typeID.str() << " is not implemented.\n"; + return false; + } + } + + //Create the encoders for the outputs + for (size_t i = 0; i < boxCtx.getOutputCount(); ++i) + { + boxCtx.getOutputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { m_encoders.push_back(new Toolkit::TStreamedMatrixEncoder(*this, i)); } + else if (typeID == OV_TypeId_Signal) { m_encoders.push_back(new Toolkit::TSignalEncoder(*this, i)); } + else if (typeID == OV_TypeId_FeatureVector) { m_encoders.push_back(new Toolkit::TFeatureVectorEncoder(*this, i)); } + else if (typeID == OV_TypeId_Spectrum) { m_encoders.push_back(new Toolkit::TSpectrumEncoder(*this, i)); } + else if (typeID == OV_TypeId_ChannelLocalisation) { m_encoders.push_back(new Toolkit::TChannelLocalisationEncoder(*this, i)); } + else if (typeID == OV_TypeId_Stimulations) { m_encoders.push_back(new Toolkit::TStimulationEncoder(*this, i)); } + else if (typeID == OV_TypeId_ExperimentInfo) { m_encoders.push_back(new Toolkit::TExperimentInfoEncoder(*this, i)); } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Codec to encode " << typeID.str() << " is not implemented.\n"; + return false; + } + } + + //New reference + PyObject* pyTmp = Py_BuildValue("s,O", m_scriptFilename.toASCIIString(), m_mainDictionnary); + //New reference + PyObject* result = PyObject_CallObject(m_execFileFunction, pyTmp); + if (result == nullptr || PyInt_AsLong(result) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to run [" << m_scriptFilename << "]"; + if (result) { this->getLogManager() << ", result = " << PyInt_AsLong(result) << "\n"; } + else { this->getLogManager() << ", result = NULL\n"; } + logSysStdout(); + logSysStderr(); + Py_CLEAR(pyTmp); + Py_CLEAR(result); + return false; + } + + Py_CLEAR(pyTmp); + Py_CLEAR(result); + + /* + PyObject *pyScriptFile = PyFile_FromString((char *) m_scriptFilename.toASCIIString(), (char *) "r"); + if (pyScriptFile == NULL) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to open " << m_scriptFilename.toASCIIString() << ".\n"; + Py_CLEAR(pyScriptFile); + return false; + } + + if (PyRun_SimpleFile(PyFile_AsFile(pyScriptFile), m_scriptFilename.toASCIIString()) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to run " << m_scriptFilename.toASCIIString() << ".\n"; + Py_CLEAR(pyScriptFile); + return false; + } + Py_CLEAR(pyScriptFile); + */ + + //New reference + m_box = PyObject_GetAttrString(m_mainModule, "box"); // la box qui vient juste d'etre creee + if (m_box == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load \"box\" object.\n"; + return false; + } + //New reference + m_boxInput = PyObject_GetAttrString(m_box, "input"); + if (m_boxInput == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load \"box.input\".\n"; + return false; + } + //New reference + m_boxOutput = PyObject_GetAttrString(m_box, "output"); + if (m_boxOutput == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load \"box.output\".\n"; + return false; + } + + std::string type; + for (size_t i = 0; i < boxCtx.getInputCount(); ++i) + { + boxCtx.getInputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { type = "StreamedMatrix"; } + else if (typeID == OV_TypeId_Signal) { type = "Signal"; } + else if (typeID == OV_TypeId_FeatureVector) { type = "FeatureVector"; } + else if (typeID == OV_TypeId_Spectrum) { type = "Spectrum"; } + else if (typeID == OV_TypeId_ChannelLocalisation) { type = "ChannelLocalisation"; } + else if (typeID == OV_TypeId_Stimulations) { type = "Stimulations"; } + else if (typeID == OV_TypeId_ExperimentInfo) { type = "ExperimentInfo"; } + //New reference + PyObject* pyCall = PyObject_CallMethod(m_box, UN_CONST("addInput"), UN_CONST("s"), type.c_str()); + if (pyCall == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to call box.addInput().\n"; + return false; + } + Py_CLEAR(pyCall); + } + + for (size_t i = 0; i < boxCtx.getOutputCount(); ++i) + { + boxCtx.getOutputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { type = "StreamedMatrix"; } + else if (typeID == OV_TypeId_Signal) { type = "Signal"; } + else if (typeID == OV_TypeId_FeatureVector) { type = "FeatureVector"; } + else if (typeID == OV_TypeId_Spectrum) { type = "Spectrum"; } + else if (typeID == OV_TypeId_ChannelLocalisation) { type = "ChannelLocalisation"; } + else if (typeID == OV_TypeId_Stimulations) { type = "Stimulations"; } + else if (typeID == OV_TypeId_ExperimentInfo) { type = "ExperimentInfo"; } + //New reference + PyObject* pyCall = PyObject_CallMethod(m_box, UN_CONST("addOutput"), UN_CONST("s"), type.c_str()); + if (pyCall == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to call box.addOutput().\n"; + return false; + } + Py_CLEAR(pyCall); + } + + //New reference + m_boxSetting = PyObject_GetAttrString(m_box, "setting"); + if (m_boxSetting == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load \"box.setting\".\n"; + return false; + } + buildPythonSettings(); + + if (!PyObject_HasAttrString(m_box, "_clock")) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to initialize \"box._clock\" attribute because it does not exist.\n"; + return false; + } + //New reference + PyObject* pyBoxClock = PyInt_FromLong(long(m_clockFrequency)); + if (pyBoxClock == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to convert m_clockFrequency into PyInt.\n"; + return false; + } + if (PyObject_SetAttrString(m_box, "_clock", pyBoxClock) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to initialize \"box._clock\" attribute.\n"; + return false; + } + Py_CLEAR(pyBoxClock); + + if (!PyObject_HasAttrString(m_box, "_currentTime")) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to initialize \"box._currentTime\" attribute because it does not exist.\n"; + return false; + } + //New reference + m_boxCurrentTime = PyFloat_FromDouble(CTime(this->getPlayerContext().getCurrentTime()).toSeconds()); + if (m_boxCurrentTime == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to convert the current time into a PyFloat.\n"; + return false; + } + if (PyObject_SetAttrString(m_box, "_currentTime", m_boxCurrentTime) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to initialize \"box._currentTime\" attribute.\n"; + return false; + } + + if (!PyObject_HasAttrString(m_box, "realInitialize")) + { + this->getLogManager() << Kernel::LogLevel_Error << "No realInitialize.\n"; + return false; + } + + //New reference + m_boxInitialize = PyObject_GetAttrString(m_box, "realInitialize"); + if (m_boxInitialize == nullptr) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Failed to load \"box.realInitialize\" function.\n"; } + else if (!PyCallable_Check(m_boxInitialize)) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "\"box.realInitialize\" is not callable.\n"; } + + //New reference + m_boxProcess = PyObject_GetAttrString(m_box, "realProcess"); + if (m_boxProcess == nullptr) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Failed to load \"box.realProcess\" function.\n"; } + else if (!PyCallable_Check(m_boxProcess)) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "\"box.realProcess\" is not callable.\n"; } + + //New reference + m_boxUninitialize = PyObject_GetAttrString(m_box, "realUninitialize"); + if (m_boxUninitialize == nullptr) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Failed to load \"box.realUninitialize\" function.\n"; } + else if (!PyCallable_Check(m_boxUninitialize)) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "\"box.realUninitialize\" is not callable.\n"; } + + //Execute the initialize function defined in the python user script + if (m_boxInitialize && PyCallable_Check(m_boxInitialize)) + { + //New reference + result = PyObject_CallObject(m_boxInitialize, nullptr); + bool stdoutError = logSysStdout(); // souci car la si l'init plante pas de sortie au bon endroit + bool stderrError = logSysStderr(); + if ((result == nullptr) || (!stdoutError) || (!stderrError)) + { + if (result == nullptr) { this->getLogManager() << Kernel::LogLevel_Error << "Failed to call \"box.__initialize\" function.\n"; } + if (!stdoutError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStdout() failed during box.__initialization.\n"; } + if (!stderrError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStderr() failed during box.__initialization.\n"; } + Py_CLEAR(result); + return false; + } + Py_CLEAR(result); + } + + m_initializeSucceeded = true; + return true; +} + +bool CBoxAlgorithmPython2::uninitialize() +{ + for (size_t i = 0; i < m_decoders.size(); ++i) + { + m_decoders[i]->uninitialize(); + delete m_decoders[i]; + } + m_decoders.clear(); + + for (size_t i = 0; i < m_encoders.size(); ++i) + { + m_encoders[i]->uninitialize(); + delete m_encoders[i]; + } + m_encoders.clear(); + + if (m_initializeSucceeded) // we call this uninit only if init had succeeded Execute the uninitialize function defined in the python script + { // il y a un souci ici si le script n'a pas ete charge ca ne passe pas + if (m_boxUninitialize && PyCallable_Check(m_boxUninitialize)) + { + //New reference + PyObject* result = PyObject_CallObject(m_boxUninitialize, nullptr); + const bool stdoutError = logSysStdout(); + const bool stderrError = logSysStderr(); + if ((result == nullptr) || (!stdoutError) || (!stderrError)) + { + if (result == nullptr) { this->getLogManager() << Kernel::LogLevel_Error << "Failed to call \"box.__uninitialize\" function.\n"; } + if (!stdoutError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStdout() failed during box.__uninitialization.\n"; } + if (!stderrError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStderr() failed during box.__uninitialization.\n"; } + Py_CLEAR(result); + return false; + } + Py_CLEAR(result); + } + } + + // Note: Py_CLEAR is safe to use on NULL pointers, so we can clean everything here + Py_CLEAR(m_box); + Py_CLEAR(m_boxInput); + Py_CLEAR(m_boxOutput); + Py_CLEAR(m_boxCurrentTime); + Py_CLEAR(m_boxSetting); + Py_CLEAR(m_boxInitialize); + Py_CLEAR(m_boxProcess); + Py_CLEAR(m_boxUninitialize); + + // Py_Initialize() and Py_Finalize() are called in ovp_main.cpp, we never uninitialize Python here + + return true; +} + +bool CBoxAlgorithmPython2::processClock(Kernel::CMessageClock& msg) +{ + this->getLogManager() << Kernel::LogLevel_Trace << "Received clock message at time " << msg.getTime() << "\n"; + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmPython2::processInput(size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmPython2::transferStreamedMatrixInputChunksToPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + + if (!PyList_Check(m_boxInput)) + { + this->getLogManager() << Kernel::LogLevel_Error << "box.input must be a list.\n"; + return false; + } + + //Borrowed reference + PyObject* pyBuffer = PyList_GetItem(m_boxInput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.input[" << index << "].\n"; + return false; + } + //Expose input streamed matrix chunks to python + for (size_t idx = 0; idx < boxCtx.getInputChunkCount(index); ++idx) + { + m_decoders[index]->decode(idx); + + if (m_decoders[index]->isHeaderReceived()) + { + CMatrix* matrix = (dynamic_cast*>(m_decoders[index]))->getOutputMatrix(); + size_t nDim = matrix->getDimensionCount(); + + //New reference + PyObject* pySizeDim = PyList_New(nDim); + if (pySizeDim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new list pySizeDim.\n"; + return false; + } + + //New reference + PyObject* pyLabelDim = PyList_New(0); + if (pyLabelDim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new list pyLabelDim.\n"; + Py_CLEAR(pySizeDim); + return false; + } + + for (size_t i = 0; i < nDim; ++i) + { + size_t dimSize = matrix->getDimensionSize(i); + if (PyList_SetItem(pySizeDim, i, PyInt_FromLong(dimSize)) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item " << i << " in dimension size list.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + for (size_t j = 0; j < dimSize; ++j) + { + if (PyList_Append(pyLabelDim, PyString_FromString(matrix->getDimensionLabel(i, j))) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append \"" << matrix->getDimensionLabel(i, j) << + "\" in dimension label list.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + } + } + + //New reference + PyObject* pyArg = PyTuple_New(4); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 2, pySizeDim) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 2 (dimension size) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 3, pyLabelDim) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 3 (dimension label) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + //New reference + PyObject* pyMatrixHeader = PyObject_Call(m_matrixHeader, pyArg, nullptr); + if (pyMatrixHeader == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStreamedMatrixHeader pyMatrixHeader.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + + if (!appendToPyObject(pyMatrixHeader, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVStreamedMatrixHeader to box.input[" << index << "].\n"; + Py_CLEAR(pyMatrixHeader); + return false; + } + Py_CLEAR(pyMatrixHeader); + } + + if (m_decoders[index]->isBufferReceived()) + { + //New reference + PyObject* pyArg = PyTuple_New(3); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 2, PyList_New(0)) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 2 (bufferElements) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + //New reference + PyObject* pyMatrixBuffer = PyObject_Call(m_matrixBuffer, pyArg, nullptr); + if (pyMatrixBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStreamedMatrixBuffer pyMatrixBuffer.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + CMatrix* matrix = (dynamic_cast*>(m_decoders[index]))->getOutputMatrix(); + double* bufferBase = matrix->getBuffer(); + for (size_t i = 0; i < matrix->getBufferElementCount(); ++i) + { + if (PyList_Append(pyMatrixBuffer, PyFloat_FromDouble(bufferBase[i])) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append element " << i << " to pyMatrixBuffer.\n"; + Py_CLEAR(pyMatrixBuffer); + return false; + } + } + + if (!appendToPyObject(pyMatrixBuffer, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVStreamedMatrixBuffer to box.input[" << index << "].\n"; + Py_CLEAR(pyMatrixBuffer); + return false; + } + Py_CLEAR(pyMatrixBuffer); + } + + if (m_decoders[index]->isEndReceived()) + { + //New reference + PyObject* pyArg = PyTuple_New(2); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + //New reference + PyObject* pyMatrixEnd = PyObject_Call(m_matrixEnd, pyArg, nullptr); + if (pyMatrixEnd == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStreamedMatrixEnd pyMatrixEnd.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + if (!appendToPyObject(pyMatrixEnd, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVStreamedMatrixEnd to box.input[" << index << "].\n"; + Py_CLEAR(pyMatrixEnd); + return false; + } + Py_CLEAR(pyMatrixEnd); + } + } + + return true; +} + +bool CBoxAlgorithmPython2::transferStreamedMatrixOutputChunksFromPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + CMatrix* matrix = (dynamic_cast*>(m_encoders[index]))->getInputMatrix(); + + if (!PyList_Check(m_boxOutput)) + { + this->getLogManager() << Kernel::LogLevel_Error << "box.output must be a list.\n"; + return false; + } + + //Borrowed reference + PyObject* pyBuffer = PyList_GetItem(m_boxOutput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].\n"; + return false; + } + + size_t len; + if (!getLenFromPyObject(pyBuffer, len)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].__len__().\n"; + return false; + } + + for (size_t idx = 0; idx < len; ++idx) + { + //New reference + PyObject* pyChunk = PyObject_CallMethod(pyBuffer, UN_CONST("pop"), nullptr); + if (pyChunk == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get item " << idx << " of box.output[" << index << "].\n"; + return false; + } + + if (PyObject_IsInstance(pyChunk, m_matrixHeader) == 1) + { + if (!setMatrixInfosFromPyObject(pyChunk, matrix)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to call chunk's getDimensionCount method.\n"; + Py_CLEAR(pyChunk); + return false; + } + + m_encoders[index]->encodeHeader(); + + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_matrixBuffer) == 1) + { + double* bufferBase = matrix->getBuffer(); + for (size_t i = 0; i < matrix->getBufferElementCount(); ++i) { bufferBase[i] = PyFloat_AsDouble(PyList_GetItem(pyChunk, i)); } + + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeBuffer(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_matrixEnd) == 1) + { + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeEnd(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Unexpected object type for item " << idx << " in box.output[" << index << "].\n"; + Py_CLEAR(pyChunk); + return false; + } + + Py_CLEAR(pyChunk); + } + return true; +} + +bool CBoxAlgorithmPython2::transferSignalInputChunksToPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + + if (!PyList_Check(m_boxInput)) + { + this->getLogManager() << Kernel::LogLevel_Error << "box.input must be a list.\n"; + return false; + } + + //Borrowed reference + PyObject* pyBuffer = PyList_GetItem(m_boxInput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.input[" << index << "].\n"; + return false; + } + //Expose input signal chunks to python + for (size_t idx = 0; idx < boxCtx.getInputChunkCount(index); ++idx) + { + m_decoders[index]->decode(idx); + + if (m_decoders[index]->isHeaderReceived()) + { + CMatrix* matrix = (dynamic_cast*>(m_decoders[index]))->getOutputMatrix(); + size_t nDim = matrix->getDimensionCount(); + + //New reference + PyObject* pySizeDim = PyList_New(nDim); + if (pySizeDim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new list pySizeDim.\n"; + return false; + } + + //New reference + PyObject* pyLabelDim = PyList_New(0); + if (pyLabelDim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new list pyLabelDim.\n"; + Py_CLEAR(pySizeDim); + return false; + } + + for (size_t i = 0; i < nDim; ++i) + { + size_t dimSize = matrix->getDimensionSize(i); + if (PyList_SetItem(pySizeDim, i, PyInt_FromLong(dimSize)) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item " << i << " in dimension size list.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + for (size_t j = 0; j < dimSize; ++j) + { + if (PyList_Append(pyLabelDim, PyString_FromString(matrix->getDimensionLabel(i, j))) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append \"" << matrix->getDimensionLabel(i, j) << "\" in dimension label list.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + } + } + + //New reference + PyObject* pyArg = PyTuple_New(5); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 2, pySizeDim) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 2 (dimension size) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 3, pyLabelDim) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 3 (dimension label) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem( + pyArg, 4, PyInt_FromLong(long((dynamic_cast*>(m_decoders[index]))->getOutputSamplingRate()))) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 4 (samplingRate) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + //New reference + PyObject* pySignalHeader = PyObject_Call(m_signalHeader, pyArg, nullptr); + if (pySignalHeader == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVSignalHeader pySignalHeader.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + + if (!appendToPyObject(pySignalHeader, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVSignalHeader to box.input[" << index << "].\n"; + Py_CLEAR(pySignalHeader); + return false; + } + Py_CLEAR(pySignalHeader); + } + + if (m_decoders[index]->isBufferReceived()) + { + //New reference + PyObject* pyArg = PyTuple_New(3); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (startTime) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (endTime) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 2, PyList_New(0)) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 2 (bufferElements) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + //New reference + PyObject* pySignalBuffer = PyObject_Call(m_signalBuffer, pyArg, nullptr); + if (pySignalBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVSignalBuffer pySignalBuffer.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + CMatrix* matrix = (dynamic_cast*>(m_decoders[index]))->getOutputMatrix(); + double* bufferBase = matrix->getBuffer(); + for (size_t i = 0; i < matrix->getBufferElementCount(); ++i) + { + if (PyList_Append(pySignalBuffer, PyFloat_FromDouble(bufferBase[i])) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append element " << i << " to pySignalBuffer.\n"; + Py_CLEAR(pySignalBuffer); + return false; + } + } + + if (!appendToPyObject(pySignalBuffer, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVSignalBuffer to box.input[" << index << "].\n"; + Py_CLEAR(pySignalBuffer); + return false; + } + Py_CLEAR(pySignalBuffer); + } + + if (m_decoders[index]->isEndReceived()) + { + //New reference + PyObject* pyArg = PyTuple_New(2); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + //New reference + PyObject* pySignalEnd = PyObject_Call(m_signalEnd, pyArg, nullptr); + if (pySignalEnd == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new m_signalEnd pySignalEnd.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + if (!appendToPyObject(pySignalEnd, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVSignalEnd to box.input[" << index << "].\n"; + Py_CLEAR(pySignalEnd); + return false; + } + Py_CLEAR(pySignalEnd); + } + } + return true; +} + +bool CBoxAlgorithmPython2::transferSignalOutputChunksFromPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + CMatrix* matrix = (dynamic_cast*>(m_encoders[index]))->getInputMatrix(); + + if (!PyList_Check(m_boxOutput)) + { + this->getLogManager() << Kernel::LogLevel_Error << "box.output must be a list.\n"; + return false; + } + + //Borrowed reference + PyObject* pyBuffer = PyList_GetItem(m_boxOutput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].\n"; + return false; + } + + size_t len; + if (!getLenFromPyObject(pyBuffer, len)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].__len__().\n"; + return false; + } + + for (size_t idx = 0; idx < len; ++idx) + { + //New reference + PyObject* pyChunk = PyObject_CallMethod(pyBuffer, UN_CONST("pop"), nullptr); + if (pyChunk == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get item " << idx << " of box.output[" << index << "].\n"; + return false; + } + + if (PyObject_IsInstance(pyChunk, m_signalHeader) == 1) + { + if (!setMatrixInfosFromPyObject(pyChunk, matrix)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to call chunk's getDimensionCount method.\n"; + Py_CLEAR(pyChunk); + return false; + } + + //New reference + PyObject* pySampling = PyObject_GetAttrString(pyChunk, "samplingRate"); + if (pySampling == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load signal header sampling rate.\n"; + return false; + } + Kernel::TParameterHandler& sampling = (dynamic_cast*>(m_encoders[index]))->getInputSamplingRate(); + sampling = uint64_t(PyInt_AsLong(pySampling)); + m_encoders[index]->encodeHeader(); + Py_CLEAR(pySampling); + + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_signalBuffer) == 1) + { + double* bufferBase = matrix->getBuffer(); + for (size_t i = 0; i < matrix->getBufferElementCount(); ++i) { bufferBase[i] = PyFloat_AsDouble(PyList_GetItem(pyChunk, i)); } + + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeBuffer(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_signalEnd) == 1) + { + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeEnd(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Unexpected object type for item " << idx << " in box.output[" << index << "].\n"; + Py_CLEAR(pyChunk); + return false; + } + + Py_CLEAR(pyChunk); + } + return true; +} + +bool CBoxAlgorithmPython2::transferStimulationInputChunksToPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + //Borrowed reference + PyObject* pyBuffer = PyList_GetItem(m_boxInput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.input[" << index << "].\n"; + return false; + } + for (size_t idx = 0; idx < boxCtx.getInputChunkCount(index); ++idx) + { + m_decoders[index]->decode(idx); + + if (m_decoders[index]->isHeaderReceived()) + { + //New reference + PyObject* pyArg = PyTuple_New(2); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + PyObject* pyStimHeader = PyObject_Call(m_stimulationHeader, pyArg, nullptr); + if (pyStimHeader == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStimulationHeader pyStimHeader.\n"; + PyErr_Print(); + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + if (!appendToPyObject(pyStimHeader, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVStimulationHeader to box.input[" << index << "].\n"; + Py_CLEAR(pyStimHeader); + return false; + } + Py_CLEAR(pyStimHeader); + } + + if (m_decoders[index]->isBufferReceived()) + { + IStimulationSet* stimSet = (dynamic_cast*>(m_decoders[index]))->getOutputStimulationSet(); + + //New reference + PyObject* pyArg = PyTuple_New(2); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + //New reference + PyObject* pyStimSet = PyObject_Call(m_stimulationSet, pyArg, nullptr); + if (pyStimSet == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStimulationSet pyStimSet.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + for (size_t i = 0; i < stimSet->getStimulationCount(); ++i) + { + const uint64_t id = stimSet->getStimulationIdentifier(i); + const uint64_t date = stimSet->getStimulationDate(i); + const uint64_t duration = stimSet->getStimulationDuration(i); + + //New reference + pyArg = PyTuple_New(3); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyInt_FromLong(long(id))) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (identifier) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(date).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (date) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 2, PyFloat_FromDouble(CTime(duration).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 2 (duration) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + //New reference + PyObject* pyStim = PyObject_Call(m_stimulation, pyArg, nullptr); + if (pyStim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStimulation pyStim.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + if (!appendToPyObject(pyStim, pyStimSet)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append stimulation to box.input[" << index << "].\n"; + Py_CLEAR(pyStim); + return false; + } + Py_CLEAR(pyStim); + } + + if (!appendToPyObject(pyStimSet, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append stimulation to box.input[" << index << "].\n"; + Py_CLEAR(pyStimSet); + return false; + } + Py_CLEAR(pyStimSet); + } + + if (m_decoders[index]->isEndReceived()) + { + //New reference + PyObject* pyArg = PyTuple_New(2); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + //New reference + PyObject* pyStimEnd = PyObject_Call(m_stimulationEnd, pyArg, nullptr); + if (pyStimEnd == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStimulationEnd pyStimEnd.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + if (!appendToPyObject(pyStimEnd, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVStimulationEnd to box.input[" << index << "].\n"; + Py_CLEAR(pyStimEnd); + return false; + } + Py_CLEAR(pyStimEnd); + } + } + return true; +} + +bool CBoxAlgorithmPython2::transferStimulationOutputChunksFromPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + IStimulationSet* stimSet = (dynamic_cast*>(m_encoders[index]))->getInputStimulationSet(); + + if (!PyList_Check(m_boxOutput)) + { + this->getLogManager() << Kernel::LogLevel_Error << "box.output must be a list.\n"; + return false; + } + //Borrowed reference + PyObject* pyBuffer = PyList_GetItem(m_boxOutput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].\n"; + return false; + } + + size_t len; + if (!getLenFromPyObject(pyBuffer, len)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].__len__().\n"; + return false; + } + + for (size_t idx = 0; idx < len; ++idx) + { + //New reference + PyObject* pyChunk = PyObject_CallMethod(pyBuffer, UN_CONST("pop"), nullptr); + if (pyChunk == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get item " << idx << " of box.output[" << index << "].\n"; + return false; + } + + if (PyObject_IsInstance(pyChunk, m_stimulationHeader) == 1) + { + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + stimSet->setStimulationCount(0); + m_encoders[index]->encodeHeader(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_stimulationSet) == 1) + { + size_t chunkLen; + if (!getLenFromPyObject(pyChunk, chunkLen)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get stimulations set length.\n"; + return false; + } + + stimSet->setStimulationCount(0); + for (size_t i = 0; i < chunkLen; ++i) + { + //Borrowed reference + PyObject* pyStim = PyList_GetItem(pyChunk, Py_ssize_t(i)); + if (pyStim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get item " << i << " of chunk " << idx << ".\n"; + return false; + } + if (PyObject_IsInstance(pyStim, m_stimulation) < 1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Item " << i << " is not an OVStimulation.\n"; + return false; + } + //New reference + PyObject* pyID = PyObject_GetAttrString(pyStim, "identifier"); + const uint64_t id = uint64_t(PyFloat_AsDouble(pyID)); + Py_CLEAR(pyID); + + uint64_t date, duration; + getTimeFromPyObject(pyStim, "date", date); + getTimeFromPyObject(pyStim, "duration", duration); + + stimSet->appendStimulation(id, date, duration); + } + + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeBuffer(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_stimulationEnd) == 1) + { + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeEnd(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Unexpected object type for item " << idx << " in box.output[" << index << "].\n"; + Py_CLEAR(pyChunk); + return false; + } + + Py_CLEAR(pyChunk); + } + + return true; +} + +bool CBoxAlgorithmPython2::process() +{ + const Kernel::IBox& boxCtx = this->getStaticBoxContext(); + CIdentifier typeID; + + for (size_t i = 0; i < boxCtx.getInputCount(); ++i) + { + boxCtx.getInputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { if (!transferStreamedMatrixInputChunksToPython(i)) { return false; } } + else if (typeID == OV_TypeId_Signal) { if (!transferSignalInputChunksToPython(i)) { return false; } } + else if (typeID == OV_TypeId_Stimulations) { if (!transferStimulationInputChunksToPython(i)) { return false; } } + //else if (typeID == OV_TypeId_FeatureVector) { } + //else if (typeID == OV_TypeId_Spectrum) { } + //else if (typeID == OV_TypeId_ChannelLocalisation) { } + //else if (typeID == OV_TypeId_ExperimentInfo) { } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Codec to decode " << typeID.str() << " is not implemented.\n"; + return false; + } + } + + //update the python current time + m_boxCurrentTime = PyFloat_FromDouble(CTime(this->getPlayerContext().getCurrentTime()).toSeconds()); + if (m_boxCurrentTime == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to convert the current time into a PyFloat during update.\n"; + return false; + } + if (PyObject_SetAttrString(m_box, "_currentTime", m_boxCurrentTime) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to update \"box._currentTime\" attribute.\n"; + return false; + } + + //call the python process function + if (m_boxProcess && PyCallable_Check(m_boxProcess)) + { + //New reference + PyObject* result = PyObject_CallObject(m_boxProcess, nullptr); + const bool stdoutError = logSysStdout(); + const bool stderrError = logSysStderr(); + if ((result == nullptr) || (!stdoutError) || (!stderrError)) + { + if (result == nullptr) { this->getLogManager() << Kernel::LogLevel_Error << "Failed to call \"box.__process\" function.\n"; } + if (!stdoutError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStdout() failed during box.__process.\n"; } + if (!stderrError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStderr() failed during box.__process.\n"; } + Py_CLEAR(result); + return false; + } + Py_CLEAR(result); + } + + for (size_t i = 0; i < boxCtx.getOutputCount(); ++i) + { + boxCtx.getOutputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { if (!transferStreamedMatrixOutputChunksFromPython(i)) { return false; } } + else if (typeID == OV_TypeId_Signal) { if (!transferSignalOutputChunksFromPython(i)) { return false; } } + else if (typeID == OV_TypeId_Stimulations) { if (!transferStimulationOutputChunksFromPython(i)) { return false; } } + //else if (typeID == OV_TypeId_FeatureVector) { } + //else if (typeID == OV_TypeId_Spectrum) { } + //else if (typeID == OV_TypeId_ChannelLocalisation) { } + //else if (typeID == OV_TypeId_ExperimentInfo) { } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Codec to encode " << typeID.str() << " is not implemented.\n"; + return false; + } + } + + return true; +} + +} // namespace Python +} // namespace Plugins +} // namespace OpenViBE +#endif // #if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 2) +#endif // TARGET_HAS_ThirdPartyPython +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/src/box-algorithms/ovpCBoxAlgorithmPython2.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/src/box-algorithms/ovpCBoxAlgorithmPython2.h new file mode 100644 index 0000000..c39bb89 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/src/box-algorithms/ovpCBoxAlgorithmPython2.h @@ -0,0 +1,146 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyPython2 + +#include + +#if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 2) + +#include "../ovp_defines.h" +#include +#include + +#include +#include +//#include + +namespace OpenViBE +{ + namespace Plugins + { + namespace Python + { + class CBoxAlgorithmPython2 final : virtual public Toolkit::TBoxAlgorithm + { + public: + void release() override { delete this; } + + uint64_t getClockFrequency() override; + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_Python2) + + protected: + + uint64_t m_clockFrequency = 0; + CString m_scriptFilename; + + std::vector*> m_decoders; + std::vector*> m_encoders; + + //std::map m_PyObjectMap; + PyObject *m_box = nullptr, *m_boxInput = nullptr, *m_boxOutput = nullptr, *m_boxSetting = nullptr, + *m_boxCurrentTime = nullptr, *m_boxInitialize = nullptr, *m_boxProcess = nullptr, *m_boxUninitialize = nullptr; + bool m_initializeSucceeded = false; + + + bool logSysStd(const bool out); + bool logSysStdout() { return logSysStd(true); } + bool logSysStderr() { return logSysStd(false); } + void buildPythonSettings(); + + bool initializePythonSafely(); + //bool clearPyObjectMap(); + bool transferStreamedMatrixInputChunksToPython(const size_t index); + bool transferStreamedMatrixOutputChunksFromPython(const size_t index); + bool transferSignalInputChunksToPython(const size_t index); + bool transferSignalOutputChunksFromPython(const size_t index); + bool transferStimulationInputChunksToPython(const size_t index); + bool transferStimulationOutputChunksFromPython(const size_t index); + + static bool m_isPythonInitialized; + + // These are all borrowed references in python v2.7. Do not free them. + static PyObject *m_mainModule, *m_mainDictionnary; + static PyObject *m_matrixHeader, *m_matrixBuffer, *m_matrixEnd; + static PyObject *m_signalHeader, *m_signalBuffer, *m_signalEnd; + static PyObject *m_stimulationHeader, *m_stimulation, *m_stimulationSet, *m_stimulationEnd; + static PyObject* m_buffer; + static PyObject* m_execFileFunction; + static PyObject *m_stdout, *m_stderr; + }; + + class CBoxAlgorithmPython2Listener final : public Toolkit::TBoxListener + { + public: + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + box.setInputType(index, OV_TypeId_StreamedMatrix); + return true; + } + + bool onOutputAdded(Kernel::IBox& box, const size_t index) override + { + box.setOutputType(index, OV_TypeId_StreamedMatrix); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) + }; + + class CBoxAlgorithmPython2Desc final : virtual public IBoxAlgorithmDesc + { + public: + + void release() override { } + + CString getName() const override { return CString("Python 2 scripting"); } + CString getAuthorName() const override { return CString("Aurelien Van Langhenhove and Laurent George"); } + CString getAuthorCompanyName() const override { return CString("CICIT Garches, Inria"); } + CString getShortDescription() const override { return CString("This box executes a python script."); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Scripting"); } + CString getVersion() const override { return CString("0.1"); } + CString getStockItemName() const override { return CString("gtk-convert"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_Python2; } + IPluginObject* create() override { return new CBoxAlgorithmPython2; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmPython2Listener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("Clock frequency (Hz)", OV_TypeId_Integer, "64"); + prototype.addSetting("Script", OV_TypeId_Script, ""); + + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + prototype.addFlag(Kernel::BoxFlag_CanAddOutput); + prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + prototype.addFlag(Kernel::BoxFlag_CanAddSetting); + prototype.addFlag(Kernel::BoxFlag_CanModifySetting); + + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_Stimulations); + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + + prototype.addOutputSupport(OV_TypeId_Signal); + prototype.addOutputSupport(OV_TypeId_Stimulations); + prototype.addOutputSupport(OV_TypeId_StreamedMatrix); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_Python2Desc) + }; + } // namespace Python + } // namespace Plugins +} // namespace OpenViBE + +#endif // #if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 2) + +#endif // TARGET_HAS_ThirdPartyPython2 diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/src/ovp_defines.h new file mode 100644 index 0000000..70036ee --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/src/ovp_defines.h @@ -0,0 +1,6 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_Python2 OpenViBE::CIdentifier(0x5DC4F669, 0xD3FD4D64) +#define OVP_ClassId_BoxAlgorithm_Python2Desc OpenViBE::CIdentifier(0x404B6FFD, 0x12BDD429) diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/src/ovp_main.cpp new file mode 100644 index 0000000..b499334 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python2/src/ovp_main.cpp @@ -0,0 +1,104 @@ +#if defined TARGET_HAS_ThirdPartyPython2 && !(defined(WIN32) && defined(TARGET_BUILDTYPE_Debug)) +// Windows debug build doesn't typically link as most people don't have the python debug library. + +#include "box-algorithms/ovpCBoxAlgorithmPython2.h" + +#if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 2) + +#ifdef TARGET_OS_Windows +#include "windows.h" +#endif + +#include +#include + +//------------------------------------------------------------------------------------------------- +class CPython2Initializer +{ +public: + CPython2Initializer(); + ~CPython2Initializer(); + bool isPython2Available() const { return m_pythonAvailable; } +private: +#ifdef TARGET_OS_Windows + static bool checkPython2Path(); +#endif + // PyThreadState *m_pMainPyThreadState; + bool m_pythonAvailable; +}; + +#ifdef TARGET_OS_Windows +bool CPython2Initializer::checkPython2Path() +{ + std::string path = Py_GetPath(); + size_t found = path.find_first_of(';'); + while (found != std::string::npos) + { + if (found > 0) + { + std::string filename = path.substr(0, found); + const bool exists = (_access(filename.c_str(), 0) == 0); + if (exists) { return true; } + } + path = path.substr(found + 1); + found = path.find_first_of(';'); + } + + std::cout << "Python directory not found. You probably have a corrupted python installation!" << std::endl; + std::cout << "The tried path from Py_GetPath() was [" << Py_GetPath() << "]\n"; + + return false; +} +#endif + +CPython2Initializer::CPython2Initializer() : m_pythonAvailable(false) +{ +#ifdef TARGET_OS_Windows + __try + { + // We do not care about the last file, since it is the OpenViBE runtime path + if (!Py_IsInitialized() && checkPython2Path()) + { + Py_Initialize(); + m_pythonAvailable = true; + } + } + __except (EXCEPTION_EXECUTE_HANDLER) { } +#else + if (!Py_IsInitialized()) + { + Py_Initialize(); + m_pythonAvailable = true; + } +#endif +} + +CPython2Initializer::~CPython2Initializer() +{ + if (m_pythonAvailable) + { + m_pythonAvailable = false; + Py_Finalize(); + } +} +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +namespace OpenViBE { +namespace Plugins { +namespace Python { + +OVP_Declare_Begin() + static CPython2Initializer python2Init; + if (python2Init.isPython2Available()) { OVP_Declare_New(CBoxAlgorithmPython2Desc); } +OVP_Declare_End() + +} // namespace Python +} // namespace Plugins +} // namespace OpenViBE +//------------------------------------------------------------------------------------------------- + +#else +#pragma message ("WARNING: Python 2.x headers are required to build the Python plugin, different includes found, skipped") +#endif // #if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 2) +#endif // TARGET_HAS_ThirdPartyPython2 diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/CMakeLists.txt new file mode 100644 index 0000000..1963935 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/CMakeLists.txt @@ -0,0 +1,37 @@ +PROJECT(openvibe-plugins-contrib-python3) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyPython3") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +IF(WIN32) + # The pygame scenario doesn't work on Windows, so do not install it + INSTALL(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/ PATTERN "*-pygame-*" EXCLUDE) +ELSE() + INSTALL(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) +ENDIF() + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/plugins/python3) diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/python3-hello-world.xml b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/python3-hello-world.xml new file mode 100644 index 0000000..b9365e5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/python3-hello-world.xml @@ -0,0 +1,111 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00003a96, 0x00003a53) + Hello World! + (0x5dc4f669, 0xd3fd4d63) + + + (0x007deef9, 0x2f3e95c6) + Clock frequency (Hz) + 64 + 2 + false + + + (0xb0d0db45, 0x49cbc34a) + Script + + ${Player_ScenarioDirectory}/scripts/python-hello-world.py + false + + + (0x78b47164, 0x584420aa) + (0x79a9edeb, 0x245d83fc) + Message + Hello World! + Hello World! + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 112 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x2a651510, 0xb4fad0d4) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + + + + (0x000047c8, 0x000050cf) + <b>Hello World!</b> + +Prints a friendly message. + +You can customize the message by editing +the box configuration. + + + + (0x473d9a43, 0x97fc0a97) + -80 + + + (0x7234b86b, 0x2b8651a5) + 304 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":507,"identifier":"(0x00003962, 0x00000a21)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":798},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000781e, 0x00004e65)","index":0,"name":"Default tab","parentIdentifier":"(0x00003962, 0x00000a21)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00006808, 0x00000e28)","index":0,"name":"Empty","parentIdentifier":"(0x0000781e, 0x00004e65)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/python3-print-stimulations.xml b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/python3-print-stimulations.xml new file mode 100644 index 0000000..760a97a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/python3-print-stimulations.xml @@ -0,0 +1,177 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00005777, 0x00006c19) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 1.0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0062599e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00006593, 0x00001e93) + Python 3 scripting + (0x5dc4f669, 0xd3fd4d63) + + + (0xed15d980, 0xc7e2bbc3) + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x007deef9, 0x2f3e95c6) + Clock frequency (Hz) + 64 + 64 + false + + + (0xb0d0db45, 0x49cbc34a) + Script + + ${Player_ScenarioDirectory}/scripts/python-print-stimulations.py + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x2a651510, 0xb4fad0d4) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000061b9, 0x00000505) + + (0x00005777, 0x00006c19) + 0 + + + (0x00006593, 0x00001e93) + (0xed15d980, 0xc7e2bbc3) + + + + + + (0x00003cb4, 0x00004c5e) + The clock stimulator generates +1 stim per second. + +The associated python script should +print all the received stimulations. + + + (0x473d9a43, 0x97fc0a97) + 640.000000 + + + (0x7234b86b, 0x2b8651a5) + 96.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x000051c6, 0x0000403f)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006099, 0x00001a73)","index":0,"name":"Default tab","parentIdentifier":"(0x000051c6, 0x0000403f)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00004197, 0x00001dca)","index":0,"name":"Empty","parentIdentifier":"(0x00006099, 0x00001a73)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/python3-sinus-oscillator.xml b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/python3-sinus-oscillator.xml new file mode 100644 index 0000000..bb5cd5a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/python3-sinus-oscillator.xml @@ -0,0 +1,1183 @@ + + 1 + OpenVIBE + 2.0.0 + + + + + + (0x00000274, 0x0000068c) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000003b1, 0x0000610e) + Sinus + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 576.000000 + + + (0x207c9054, 0x3c841b63) + 272.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000012bf, 0x0000401e) + Clock stimulator + (0x5dc4f669, 0xd3fd4d63) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Clock frequency (Hz) + 60 + 1 + false + + + (0xb0d0db45, 0x49cbc34a) + Script + + ${Player_ScenarioDirectory}/scripts/python-clock-stimulator.py + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 176 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x2a651510, 0xb4fad0d4) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x000019c7, 0x00007a0a) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001d15, 0x000035b2) + Sinus generator + (0x5dc4f669, 0xd3fd4d63) + + + (0x5ba36127, 0x195feae1) + Generated signals + + + + + (0x007deef9, 0x2f3e95c6) + Clock frequency (Hz) + 60 + 16 + false + + + (0xb0d0db45, 0x49cbc34a) + Script + + ${Player_ScenarioDirectory}/scripts/python-sinus-oscillator.py + false + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 176 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x2a651510, 0xb4fad0d4) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x000028f8, 0x00007abf) + Spectral analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imag Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000432f, 0x00000c65) + Mean + (0x5dc4f669, 0xd3fd4d63) + + + (0x5ba36127, 0x195feae1) + Signal + + + + + (0x5ba36127, 0x195feae1) + Signal + + + + + (0x007deef9, 0x2f3e95c6) + Clock frequency (Hz) + 60 + 60 + false + + + (0xb0d0db45, 0x49cbc34a) + Script + + ${Player_ScenarioDirectory}/scripts/python-signal-average.py + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 176 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x2a651510, 0xb4fad0d4) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004d1c, 0x00000772) + Spectral analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imag Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006467, 0x00001c99) + Mean + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560.000000 + + + (0x207c9054, 0x3c841b63) + 144.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00fdde89, 0x1b93e4d6) + Mean spectrum + (0xecb46081, 0x96da0d49) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0x6b60e2b2, 0xf4839b7d) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x600f781b, 0x55dd55ad) + Sinus spectrum + (0xecb46081, 0x96da0d49) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x6b60e2b2, 0xf4839b7d) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000005a9, 0x0000648a) + + (0x000012bf, 0x0000401e) + 0 + + + (0x00006467, 0x00001c99) + 1 + + + + (0x00000819, 0x0000461a) + + (0x00001d15, 0x000035b2) + 0 + + + (0x0000432f, 0x00000c65) + 0 + + + + (0x00000b01, 0x00006b2f) + + (0x000019c7, 0x00007a0a) + 0 + + + (0x00004d1c, 0x00000772) + 0 + + + + (0x000033b9, 0x00003383) + + (0x00001d15, 0x000035b2) + 0 + + + (0x00000274, 0x0000068c) + 0 + + + + (0x000044b9, 0x0000033f) + + (0x0000432f, 0x00000c65) + 0 + + + (0x00006467, 0x00001c99) + 0 + + + + (0x00004f68, 0x00007af8) + + (0x00000274, 0x0000068c) + 0 + + + (0x000028f8, 0x00007abf) + 0 + + + + (0x00005d70, 0x000018f7) + + (0x000012bf, 0x0000401e) + 0 + + + (0x000003b1, 0x0000610e) + 1 + + + + (0x000062f9, 0x00005eab) + + (0x0000432f, 0x00000c65) + 0 + + + (0x000019c7, 0x00007a0a) + 0 + + + + (0x00006a22, 0x00007e73) + + (0x00001d15, 0x000035b2) + 0 + + + (0x000003b1, 0x0000610e) + 0 + + + + (0x0812dc20, 0x1ceb73ca) + + (0x00004d1c, 0x00000772) + 0 + + + (0x00fdde89, 0x1b93e4d6) + 0 + + + + (0x3c41f60b, 0x5f25ccd9) + + (0x000028f8, 0x00007abf) + 0 + + + (0x600f781b, 0x55dd55ad) + 0 + + + + + + (0x00000c06, 0x00005ae8) + <b>Sinus generator</b> + +This script generates a sine wave. + + + (0x473d9a43, 0x97fc0a97) + -80 + + + (0x7234b86b, 0x2b8651a5) + 160 + + + + + (0x00001db4, 0x0000366b) + <b>Mean</b> + +This script calculates the mean of +all of the channels in a signal. + +It describes the use of the +<b>numpy</b> python library. + + + (0x473d9a43, 0x97fc0a97) + -80 + + + (0x7234b86b, 0x2b8651a5) + 304 + + + + + (0x00002594, 0x00000a0b) + Spectra are displayed to better compare the generated results + + + (0x473d9a43, 0x97fc0a97) + 528 + + + (0x7234b86b, 0x2b8651a5) + 304 + + + + + (0x0000325b, 0x0000062b) + <b>Clock stimulator</b> + +This script generates stimulations +every time it is triggered. + +It illustrates the use of +<i>Clock Frequency</i> parameter. + + + (0x473d9a43, 0x97fc0a97) + -80 + + + (0x7234b86b, 0x2b8651a5) + 464 + + + + + (0x000048e9, 0x00002016) + This scenario illustrates several user cases of the <b>Python Scripting Box</b> + +Three boxes are used: + +- Sinus generator : generates signal +- Clock stimulator : generates stimulations +- Mean : transforms signal + +<b>Note:</b> This tutorial needs the <b>numpy</b> package +installed for your Python distribution! + + + (0x473d9a43, 0x97fc0a97) + 480 + + + (0x7234b86b, 0x2b8651a5) + 48 + + + + + (0x00006e8c, 0x000030a5) + <big>Do not forget to look at the python scripts used +in all of the python boxes in this scenario.</big> + + + (0x473d9a43, 0x97fc0a97) + -80 + + + (0x7234b86b, 0x2b8651a5) + 16 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":507,"identifier":"(0x00000a5d, 0x000009b3)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":788},{"boxIdentifier":"(0x00fdde89, 0x1b93e4d6)","childCount":0,"identifier":"(0x18420731, 0x0ec50e67)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0x600f781b, 0x55dd55ad)","childCount":0,"identifier":"(0x32b90808, 0x5251ed21)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000127e, 0x00006228)","index":0,"name":"Default tab","parentIdentifier":"(0x00000a5d, 0x000009b3)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":86,"identifier":"(0x000062c5, 0x000061a6)","index":0,"maxDividerPosition":370,"name":"Vertical split","parentIdentifier":"(0x0000127e, 0x00006228)","type":4},{"boxIdentifier":"(0x000003b1, 0x0000610e)","childCount":0,"identifier":"(0x000012aa, 0x00005e34)","index":0,"parentIdentifier":"(0x000062c5, 0x000061a6)","type":3},{"boxIdentifier":"(0x00006467, 0x00001c99)","childCount":0,"identifier":"(0x00006c89, 0x00003a9d)","index":1,"parentIdentifier":"(0x000062c5, 0x000061a6)","type":3}] + + + + + (0x4c536d0a, 0xb23dc545) + /home/ceriou/workspace/wip-ceriou-openvibe20-fix-build/openvibe/contrib/plugins/processing/python/box-tutorials/python/python-sinus-oscillator.xml + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/scripts/python-clock-stimulator.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/scripts/python-clock-stimulator.py new file mode 100644 index 0000000..8c5af33 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/scripts/python-clock-stimulator.py @@ -0,0 +1,31 @@ +# We construct a box instance that inherits from the basic OVBox class +class MyOVBox(OVBox): + # the constructor creates the box and initializes object variables + def __init__(self): + OVBox.__init__(self) + self.stimLabel = None + self.stimCode = None + + # the initialize method reads settings and outputs the first header + def initialize(self): + # the stim label is taken from the box setting + self.stimLabel = self.setting['Stimulation'] + # we get the corresponding code using the OpenViBE_stimulation dictionnary + self.stimCode = OpenViBE_stimulation[self.stimLabel] + # we append to the box output a stimulation header. This is just a header, dates are 0. + self.output[0].append(OVStimulationHeader(0., 0.)) + + def process(self): + # During each process call we produce a stimulation + # A stimulation set is a chunk which starts at current time and end time is the time step between two calls + stimSet = OVStimulationSet(self.getCurrentTime(), self.getCurrentTime()+1./self.getClock()) + # the date of the stimulation is simply the current openvibe time when calling the box process + stimSet.append(OVStimulation(self.stimCode, self.getCurrentTime(), 0.)) + self.output[0].append(stimSet) + + def uninitialize(self): + # we send a stream end. + end = self.getCurrentTime() + self.output[0].append(OVStimulationEnd(end, end)) + +box = MyOVBox() diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/scripts/python-hello-world.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/scripts/python-hello-world.py new file mode 100644 index 0000000..7e5df84 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/scripts/python-hello-world.py @@ -0,0 +1,21 @@ + +class MyOVBox(OVBox): + def __init__(self): + OVBox.__init__(self) + + def initialize(self): + print('Initialize Hello World Script') + # nop + return + + def process(self): + # print the string specified in the box configuration. + # 'Message' is the name of the config entry. + print(self.setting['Message']) + + def uninitialize(self): + print('Uninitialize Hello World Script') + # nop + return + +box = MyOVBox() diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/scripts/python-print-stimulations.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/scripts/python-print-stimulations.py new file mode 100644 index 0000000..a494ed1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/scripts/python-print-stimulations.py @@ -0,0 +1,25 @@ + +class MyOVBox(OVBox): + def __init__(self): + OVBox.__init__(self) + + def initialize(self): + # nop + return + + def process(self): + for chunkIdx in range( len(self.input[0]) ): + chunk = self.input[0].pop() + if(type(chunk) == OVStimulationSet): + for stimIdx in range(len(chunk)): + stim=chunk.pop() + print('Received stim', stim.identifier, 'stamped at', stim.date, 's') + #else: + # print 'Received chunk of type ', type(chunk), " looking for StimulationSet" + return + + def uninitialize(self): + # nop + return + +box = MyOVBox() diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/scripts/python-signal-average.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/scripts/python-signal-average.py new file mode 100644 index 0000000..6a6d12e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/scripts/python-signal-average.py @@ -0,0 +1,27 @@ +import numpy + +class MyOVBox(OVBox): + def __init__(self): + OVBox.__init__(self) + self.signalHeader = None + + def process(self): + for chunkIdx in range( len(self.input[0]) ): + if(type(self.input[0][chunkIdx]) == OVSignalHeader): + self.signalHeader = self.input[0].pop() + + outputHeader = OVSignalHeader(self.signalHeader.startTime, self.signalHeader.endTime, [1, self.signalHeader.dimensionSizes[1]], ['Mean']+self.signalHeader.dimensionSizes[1]*[''], self.signalHeader.samplingRate) + + self.output[0].append(outputHeader) + + elif(type(self.input[0][chunkIdx]) == OVSignalBuffer): + chunk = self.input[0].pop() + numpyBuffer = numpy.array(chunk).reshape(tuple(self.signalHeader.dimensionSizes)) + numpyBuffer = numpyBuffer.mean(axis=0) + chunk = OVSignalBuffer(chunk.startTime, chunk.endTime, numpyBuffer.tolist()) + self.output[0].append(chunk) + + elif(type(self.input[0][chunkIdx]) == OVSignalEnd): + self.output[0].append(self.input[0].pop()) + +box = MyOVBox() diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/scripts/python-sinus-oscillator.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/scripts/python-sinus-oscillator.py new file mode 100644 index 0000000..3402348 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/box-tutorials/python3/scripts/python-sinus-oscillator.py @@ -0,0 +1,69 @@ +import numpy + +class MyOVBox(OVBox): + def __init__(self): + OVBox.__init__(self) + self.nChannel = 0 + self.sampling = 0 + self.epochSampleCount = 0 + self.startTime = 0. + self.endTime = 0. + self.dimensionSizes = list() + self.dimensionLabels = list() + self.timeBuffer = list() + self.signalBuffer = None + self.signalHeader = None + + def initialize(self): + self.nChannel = int(self.setting['Channel count']) + self.sampling = int(self.setting['Sampling frequency']) + self.epochSampleCount = int(self.setting['Generated epoch sample count']) + + #creation of the signal header + for i in range(self.nChannel): + self.dimensionLabels.append( 'Sinus'+str(i) ) + self.dimensionLabels += self.epochSampleCount*[''] + self.dimensionSizes = [self.nChannel, self.epochSampleCount] + self.signalHeader = OVSignalHeader(0., 0., self.dimensionSizes, self.dimensionLabels, self.sampling) + self.output[0].append(self.signalHeader) + + #creation of the first signal chunk + self.endTime = 1.*self.epochSampleCount/self.sampling + self.signalBuffer = numpy.zeros((self.nChannel, self.epochSampleCount)) + self.updateTimeBuffer() + self.updateSignalBuffer() + + def updateStartTime(self): + self.startTime += 1.*self.epochSampleCount/self.sampling + + def updateEndTime(self): + self.endTime = float(self.startTime + 1.*self.epochSampleCount/self.sampling) + + def updateTimeBuffer(self): + self.timeBuffer = numpy.arange(self.startTime, self.endTime, 1./self.sampling) + + def updateSignalBuffer(self): + for rowIndex, row in enumerate(self.signalBuffer): + self.signalBuffer[rowIndex,:] = 100.*numpy.sin( 2.*numpy.pi*(rowIndex+1.)*self.timeBuffer ) + + def sendSignalBufferToOpenvibe(self): + start = self.timeBuffer[0] + end = self.timeBuffer[-1] + 1./self.sampling + bufferElements = self.signalBuffer.reshape(self.nChannel*self.epochSampleCount).tolist() + self.output[0].append( OVSignalBuffer(start, end, bufferElements) ) + + def process(self): + start = self.timeBuffer[0] + end = self.timeBuffer[-1] + if self.getCurrentTime() >= end: + self.sendSignalBufferToOpenvibe() + self.updateStartTime() + self.updateEndTime() + self.updateTimeBuffer() + self.updateSignalBuffer() + + def uninitialize(self): + end = self.timeBuffer[-1] + self.output[0].append(OVSignalEnd(end, end)) + +box = MyOVBox() diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/doc/Doc_BoxAlgorithm_PythonScripting3.dox-part b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/doc/Doc_BoxAlgorithm_PythonScripting3.dox-part new file mode 100644 index 0000000..db1fc33 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/doc/Doc_BoxAlgorithm_PythonScripting3.dox-part @@ -0,0 +1,52 @@ +/** + * \page BoxAlgorithm_Python3Scripting Python 3 scripting +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Python3Scripting_Description| + This box can process data from and to OpenViBE using Python script. + Available IO types are Streamed Matrix, Signal and Stimulations. + + The user Python Script must define a new class that inherits from OVBox, + and implements the initialize, process and uninitialize methods. + + User script must end with : box = MyOVBox() where MyOVBox is the new class. + + Please look at the documentation page for more details. + + After version 2.2.0, Python 3 is used by default (Python 2 is no longer officially supported since January 1, 2020). To convert your previous scripts, python 3 has a script called 2to3. + + * |OVP_DocEnd_BoxAlgorithm_Python3Scripting_Description| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Python3Scripting_Settings| + * |OVP_DocEnd_BoxAlgorithm_Python3Scripting_Settings| + + * |OVP_DocBegin_BoxAlgorithm_Python3Scripting_Setting1| + The box clock frequency. The Python process function is called at each tick. + * |OVP_DocEnd_BoxAlgorithm_Python3Scripting_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_Python3Scripting_Setting2| + The Python script file. + * |OVP_DocEnd_BoxAlgorithm_Python3Scripting_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Python3Scripting_Examples| + See this page for commented examples. + * |OVP_DocEnd_BoxAlgorithm_Python3Scripting_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Python3Scripting_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_Python3Scripting_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/share/StimulationsCodes.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/share/StimulationsCodes.py new file mode 100644 index 0000000..ad4a62e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/share/StimulationsCodes.py @@ -0,0 +1,227 @@ +# -*- coding: utf-8 -*- +#File Name : StimulationsCodes.py +#Created By : Aurelien Van Langhenhove + +## Stimulation codes +## Originally from openvibe-toolkit/ovtk_defines.h + +OpenViBE_stimulation = { +'OVTK_StimulationId_ExperimentStart' : 0x00008001, +'OVTK_StimulationId_ExperimentStop' : 0x00008002, +'OVTK_StimulationId_SegmentStart' : 0x00008003, +'OVTK_StimulationId_SegmentStop' : 0x00008004, +'OVTK_StimulationId_TrialStart' : 0x00008005, +'OVTK_StimulationId_TrialStop' : 0x00008006, +'OVTK_StimulationId_BaselineStart' : 0x00008007, +'OVTK_StimulationId_BaselineStop' : 0x00008008, +'OVTK_StimulationId_RestStart' : 0x00008009, +'OVTK_StimulationId_RestStop' : 0x0000800a, +'OVTK_StimulationId_VisualStimulationStart' : 0x0000800b, +'OVTK_StimulationId_VisualStimulationStop' : 0x0000800c, +'OVTK_StimulationId_VisualSteadyStateStimulationStart' : 0x00008010, +'OVTK_StimulationId_VisualSteadyStateStimulationStop' : 0x00008011, + +'OVTK_StimulationId_RemovedSamples' : 0x00008310, +'OVTK_StimulationId_AddedSamplesBegin' : 0x00008311, +'OVTK_StimulationId_AddedSamplesEnd' : 0x00008312, + +'OVTK_StimulationId_LabelStart' : 0x00008100, +'OVTK_StimulationId_Label_00' : 0x00008100, +'OVTK_StimulationId_Label_01' : 0x00008101, +'OVTK_StimulationId_Label_02' : 0x00008102, +'OVTK_StimulationId_Label_03' : 0x00008103, +'OVTK_StimulationId_Label_04' : 0x00008104, +'OVTK_StimulationId_Label_05' : 0x00008105, +'OVTK_StimulationId_Label_06' : 0x00008106, +'OVTK_StimulationId_Label_07' : 0x00008107, +'OVTK_StimulationId_Label_08' : 0x00008108, +'OVTK_StimulationId_Label_09' : 0x00008109, +'OVTK_StimulationId_Label_0A' : 0x0000810a, +'OVTK_StimulationId_Label_0B' : 0x0000810b, +'OVTK_StimulationId_Label_0C' : 0x0000810c, +'OVTK_StimulationId_Label_0D' : 0x0000810d, +'OVTK_StimulationId_Label_0E' : 0x0000810e, +'OVTK_StimulationId_Label_0F' : 0x0000810f, +'OVTK_StimulationId_Label_10' : 0x00008110, +'OVTK_StimulationId_Label_11' : 0x00008111, +'OVTK_StimulationId_Label_12' : 0x00008112, +'OVTK_StimulationId_Label_13' : 0x00008113, +'OVTK_StimulationId_Label_14' : 0x00008114, +'OVTK_StimulationId_Label_15' : 0x00008115, +'OVTK_StimulationId_Label_16' : 0x00008116, +'OVTK_StimulationId_Label_17' : 0x00008117, +'OVTK_StimulationId_Label_18' : 0x00008118, +'OVTK_StimulationId_Label_19' : 0x00008119, +'OVTK_StimulationId_Label_1A' : 0x0000811a, +'OVTK_StimulationId_Label_1B' : 0x0000811b, +'OVTK_StimulationId_Label_1C' : 0x0000811c, +'OVTK_StimulationId_Label_1D' : 0x0000811d, +'OVTK_StimulationId_Label_1E' : 0x0000811e, +'OVTK_StimulationId_Label_1F' : 0x0000811f, +'OVTK_StimulationId_LabelEnd' : 0x000081ff, + +'OVTK_StimulationId_NumberStart' : 0x00000000, +'OVTK_StimulationId_Number_00' : 0x00000000, +'OVTK_StimulationId_Number_01' : 0x00000001, +'OVTK_StimulationId_Number_02' : 0x00000002, +'OVTK_StimulationId_Number_03' : 0x00000003, +'OVTK_StimulationId_Number_04' : 0x00000004, +'OVTK_StimulationId_Number_05' : 0x00000005, +'OVTK_StimulationId_Number_06' : 0x00000006, +'OVTK_StimulationId_Number_07' : 0x00000007, +'OVTK_StimulationId_Number_08' : 0x00000008, +'OVTK_StimulationId_Number_09' : 0x00000009, +'OVTK_StimulationId_Number_0A' : 0x0000000a, +'OVTK_StimulationId_Number_0B' : 0x0000000b, +'OVTK_StimulationId_Number_0C' : 0x0000000c, +'OVTK_StimulationId_Number_0D' : 0x0000000d, +'OVTK_StimulationId_Number_0E' : 0x0000000e, +'OVTK_StimulationId_Number_0F' : 0x0000000f, +'OVTK_StimulationId_Number_10' : 0x00000010, +'OVTK_StimulationId_Number_11' : 0x00000011, +'OVTK_StimulationId_Number_12' : 0x00000012, +'OVTK_StimulationId_Number_13' : 0x00000013, +'OVTK_StimulationId_Number_14' : 0x00000014, +'OVTK_StimulationId_Number_15' : 0x00000015, +'OVTK_StimulationId_Number_16' : 0x00000016, +'OVTK_StimulationId_Number_17' : 0x00000017, +'OVTK_StimulationId_Number_18' : 0x00000018, +'OVTK_StimulationId_Number_19' : 0x00000019, +'OVTK_StimulationId_Number_1A' : 0x0000001a, +'OVTK_StimulationId_Number_1B' : 0x0000001b, +'OVTK_StimulationId_Number_1C' : 0x0000001c, +'OVTK_StimulationId_Number_1D' : 0x0000001d, +'OVTK_StimulationId_Number_1E' : 0x0000001e, +'OVTK_StimulationId_Number_1F' : 0x0000001f, +'OVTK_StimulationId_NumberEnd' : 0x000000ff, + +'OVTK_StimulationId_Train' : 0x00008201, +'OVTK_StimulationId_Beep' : 0x00008202, +'OVTK_StimulationId_DoubleBeep' : 0x00008203, +'OVTK_StimulationId_EndOfFile' : 0x00008204, +'OVTK_StimulationId_Target' : 0x00008205, +'OVTK_StimulationId_NonTarget' : 0x00008206, + +'OVTK_GDF_Artifact_EOG_Large' : 0x101, +'OVTK_GDF_Artifact_ECG' : 0x102, +'OVTK_GDF_Artifact_EMG' : 0x103, +'OVTK_GDF_Artifact_Movement' : 0x104, +'OVTK_GDF_Artifact_Failing_Electrode' : 0x105, +'OVTK_GDF_Artifact_Sweat' : 0x106, +'OVTK_GDF_Artifact_50_60_Hz_Interference' : 0x107, +'OVTK_GDF_Artifact_Breathing' : 0x108, +'OVTK_GDF_Artifact_Pulse' : 0x109, +'OVTK_GDF_Artifact_EOG_Small' : 0x10A, + +'OVTK_GDF_Calibration' : 0x10F, + +'OVTK_GDF_EEG_Sleep_Splindles' : 0x111, +'OVTK_GDF_EEG_K_Complexes' : 0x112, +'OVTK_GDF_EEG_Saw_Tooth_Waves' : 0x113, +'OVTK_GDF_EEG_Idling_EEG_Eyes_Open' : 0x114, +'OVTK_GDF_EEG_Idling_EEG_Eyes_Closed' : 0x115, +'OVTK_GDF_EEG_Spike' : 0x116, +'OVTK_GDF_EEG_Seizure' : 0x117, + +'OVTK_GDF_VEP' : 0x121, +'OVTK_GDF_AEP' : 0x122, +'OVTK_GDF_SEP' : 0x123, +'OVTK_GDF_TMS' : 0x12F, + +'OVTK_GDF_SSVEP' : 0x131, +'OVTK_GDF_SSAEP' : 0x132, +'OVTK_GDF_SSSEP' : 0x133, + +'OVTK_GDF_Start_Of_Trial' : 0x300, +'OVTK_GDF_Left' : 0x301, +'OVTK_GDF_Right' : 0x302, +'OVTK_GDF_Foot' : 0x303, +'OVTK_GDF_Tongue' : 0x304, +'OVTK_GDF_class5' : 0x305, +'OVTK_GDF_Down' : 0x306, +'OVTK_GDF_class7' : 0x307, +'OVTK_GDF_class8' : 0x308, +'OVTK_GDF_class9' : 0x309, +'OVTK_GDF_class10' : 0x30A, +'OVTK_GDF_class11' : 0x30B, +'OVTK_GDF_Up' : 0x30C, +'OVTK_GDF_Feedback_Continuous' : 0x30D, +'OVTK_GDF_Feedback_Discrete' : 0x30E, +'OVTK_GDF_Cue_Unknown_Undefined' : 0x30F, +'OVTK_GDF_Beep' : 0x311, +'OVTK_GDF_Cross_On_Screen' : 0x312, +'OVTK_GDF_Flashing_Light' : 0x313, + +'OVTK_GDF_End_Of_Trial' : 0x320, + +'OVTK_GDF_Correct' : 0x381, +'OVTK_GDF_Incorrect' : 0x382, + +'OVTK_GDF_End_Of_Session' : 0x3F2, +'OVTK_GDF_Rejection' : 0x3FF, + +'OVTK_GDF_OAHE' : 0x401, +'OVTK_GDF_RERA' : 0x402, +'OVTK_GDF_CAHE' : 0x403, +'OVTK_GDF_CSB' : 0x404, +'OVTK_GDF_Sleep_Hypoventilation' : 0x405, +'OVTK_GDF_Maximum_Inspiration' : 0x40E, +'OVTK_GDF_Start_Of_Inspiration' : 0x40F, + +'OVTK_GDF_Wake' : 0x410, +'OVTK_GDF_Stage_1' : 0x411, +'OVTK_GDF_Stage_2' : 0x412, +'OVTK_GDF_Stage_3' : 0x413, +'OVTK_GDF_Stage_4' : 0x414, +'OVTK_GDF_REM' : 0x415, + +'OVTK_GDF_Lights_On' : 0x420, +'OVTK_GDF_Lights_Off' : 0x8420, + +'OVTK_GDF_Eyes_Left' : 0x431, +'OVTK_GDF_Eyes_Right' : 0x432, +'OVTK_GDF_Eyes_Up' : 0x433, +'OVTK_GDF_Eyes_Down' : 0x434, +'OVTK_GDF_Horizontal_Eye_Movement' : 0x435, +'OVTK_GDF_Vertical_Eye_Movement' : 0x436, +'OVTK_GDF_Rotation_Clockwise' : 0x437, +'OVTK_GDF_Rotation_Counterclockwise' : 0x438, +'OVTK_GDF_Eye_Blink' : 0x439, + +'OVTK_GDF_Left_Hand_Movement' : 0x441, +'OVTK_GDF_Right_Hand_Movement' : 0x442, +'OVTK_GDF_Head_Movement' : 0x443, +'OVTK_GDF_Tongue_Movement' : 0x444, +'OVTK_GDF_Swallowing' : 0x445, +'OVTK_GDF_Biting' : 0x446, +'OVTK_GDF_Foot_Movement' : 0x447, +'OVTK_GDF_Foot_Right_Movement' : 0x448, +'OVTK_GDF_Arm_Movement' : 0x449, +'OVTK_GDF_Arm_Right_Movement' : 0x44A, + +'OVTK_GDF_ECG_Fiducial_Point_QRS_Complex' : 0x501, +'OVTK_GDF_ECG_P_Wave' : 0x502, +'OVTK_GDF_ECG_QRS_Complex' : 0x503, +'OVTK_GDF_ECG_R_Point' : 0x504, +'OVTK_GDF_ECG_T_Wave' : 0x506, +'OVTK_GDF_ECG_U_Wave' : 0x507, + +'OVTK_GDF_Start' : 0x580, +'OVTK_GDF_25_Watt' : 0x581, +'OVTK_GDF_50_Watt' : 0x582, +'OVTK_GDF_75_Watt' : 0x583, +'OVTK_GDF_100_Watt' : 0x584, +'OVTK_GDF_125_Watt' : 0x585, +'OVTK_GDF_150_Watt' : 0x586, +'OVTK_GDF_175_Watt' : 0x587, +'OVTK_GDF_200_Watt' : 0x588, +'OVTK_GDF_225_Watt' : 0x589, +'OVTK_GDF_250_Watt' : 0x58A, +'OVTK_GDF_275_Watt' : 0x58B, +'OVTK_GDF_300_Watt' : 0x58C, +'OVTK_GDF_325_Watt' : 0x58D, +'OVTK_GDF_350_Watt' : 0x58E, + +'OVTK_GDF_Start_Of_New_Segment' : 0x7FFE, +'OVTK_GDF_Non_Equidistant_Sampling_Value' : 0x7FFF +} diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/share/openvibe.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/share/openvibe.py new file mode 100644 index 0000000..7589d8c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/share/openvibe.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- +#File Name : openvibe.py +#Created By : Aurelien Van Langhenhove + +from StimulationsCodes import * +import sys, traceback, collections +from io import StringIO + +class NewStd(StringIO): + def __init__(self): + StringIO.__init__(self) + def flush(self): + self.truncate(0) + self.seek(0) + def isempty(self): + if len(self.len) == 0: + return True + else: + return False + +sys.stdout = NewStd() +sys.stderr = NewStd() + + +def execfileHandlingException(filename, maindictionary): + print("executing script file") + + try: + maindictionary['box'] = OVBox(default=True) # on en cree une au cas ou + #print(globals()) + exec(compile(open(filename, "rb").read(), filename, 'exec'), maindictionary) + return 0 + except: + print("error") + print(traceback.format_exc()) + return -1 + +def decoratorFunction(target): + """ add a try except block to protect openvibe box in case of exception """ + def wrapper(self): + try : + print("using decorator") + print('Calling function "%s"' % target.__name__) + return target(self) + except: + print(traceback.format_exc()) + + return wrapper + +class OVChunk(object): + def __init__(self, startTime, endTime): + self.startTime = startTime + self.endTime = endTime + + +class OVStreamedMatrixHeader(OVChunk): + def __init__(self, startTime, endTime, dimensionSizes, dimensionLabels): + OVChunk.__init__(self, startTime, endTime) + self.dimensionSizes = list(dimensionSizes) + self.dimensionLabels = list(dimensionLabels) + + def getDimensionCount(self): + return len(self.dimensionSizes) + + def getBufferElementCount(self): + elementCount = 0 + for dimension, size in enumerate(self.dimensionSizes): + if dimension == 0: + elementCount = int(size) + else: + elementCount *= int(size) + return elementCount + +class OVStreamedMatrixBuffer(OVChunk, list): + def __init__(self, startTime, endTime, bufferElements): + OVChunk.__init__(self, startTime, endTime) + list.__init__(self, bufferElements) + +class OVStreamedMatrixEnd(OVChunk): + pass + + + +class OVSignalHeader(OVStreamedMatrixHeader): + def __init__(self, startTime, endTime, dimensionSizes, dimensionLabels, samplingRate): + OVStreamedMatrixHeader.__init__(self, startTime, endTime, dimensionSizes, dimensionLabels) + self.samplingRate = int(samplingRate) + +class OVSignalBuffer(OVStreamedMatrixBuffer): + pass + +class OVSignalEnd(OVChunk): + pass + + +class OVStimulation(object): + def __init__(self, identifier, date, duration): + self.identifier = identifier + self.date = date + self.duration = duration + +class OVStimulationHeader(OVChunk): + pass + +class OVStimulationSet(OVChunk, list): + def __init__(self, startTime, endTime): + list.__init__(self) + OVChunk.__init__(self, startTime, endTime) + + def append(self, item): + if isinstance(item, OVStimulation): + list.append(self, item) + else: + raise TypeError("The item must be an OVStimulation") + +class OVStimulationEnd(OVChunk): + pass + + +class OVBuffer(object): + def __init__(self, inputType): + self.__deque = collections.deque() + self.__type = inputType + def __len__(self): + return len(self.__deque) + def __getitem__(self, key): + return self.__deque[key] + def __setitem__(self, key, item): + self.__deque[key] = item + def __delitem__(self, key): + del self.__deque[key] + def append(self, toAppend): + self.__deque.appendleft(toAppend) + def pop(self): + return self.__deque.pop() + def type(self): + return self.__type + + +class OVBox(object): + def __init__(self, default=False): + self.input = list() + self.output = list() + self.setting = dict() + self.var = dict() + self._clock = 0 + self._currentTime = 0. + self.default= default + def addInput(self, inputType): + self.input.append(OVBuffer(inputType)) + def addOutput(self, outputType): + self.output.append(OVBuffer(outputType)) + def getClock(self): + return self._clock + def getCurrentTime(self): + return self._currentTime + def initialize(self): + if self.default == True: + print("The box instance has not been created by user script, using default one from openvibe.py (dummy box).") + pass + def process(self): + pass + def uninitialize(self): + pass + def realInitialize(self): + try : + self.initialize() + except: + print(traceback.format_exc()) + def realProcess(self): + try : + self.process() + except: + print(traceback.format_exc()) + def realUninitialize(self): + try : + self.uninitialize() + except: + print(traceback.format_exc()) diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/src/box-algorithms/ovpCBoxAlgorithmPython3.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/src/box-algorithms/ovpCBoxAlgorithmPython3.cpp new file mode 100644 index 0000000..355b335 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/src/box-algorithms/ovpCBoxAlgorithmPython3.cpp @@ -0,0 +1,1613 @@ +#if defined(WIN32) && defined(TARGET_BUILDTYPE_Debug) +// Windows debug build doesn't typically link as most people don't have the python debug library. +#else + +#if defined TARGET_HAS_ThirdPartyPython3 + +#include "ovpCBoxAlgorithmPython3.h" + +#if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Python { + +//**************************** +//***** Static Functions ***** +//**************************** +///------------------------------------------------------------------------------------------------- +static bool appendToPyObject(PyObject* obj, PyObject* buffer) +{ + PyObject* methodToCall = PyUnicode_FromString("append"); + PyObject* result = PyObject_CallMethodObjArgs(buffer, methodToCall, obj, NULL); + Py_CLEAR(methodToCall); + if (result == nullptr) { return false; } + Py_CLEAR(result); + return true; +} + +static bool getLenFromPyObject(PyObject* obj, size_t& len) +{ + PyObject* pyLen = PyObject_CallMethod(obj, "__len__", nullptr); + if (pyLen == nullptr) { return false; } + len = size_t(PyLong_AsUnsignedLongMask(pyLen)); + Py_CLEAR(pyLen); + return true; +} + +static void getTimeFromPyObject(PyObject* obj, const char* attr, uint64_t& time) +{ + PyObject* pyTime = PyObject_GetAttrString(obj, attr); + time = CTime(PyFloat_AsDouble(pyTime)).time(); + Py_CLEAR(pyTime); +} + +static void getTimesFromPyObject(PyObject* obj, uint64_t& start, uint64_t& end) +{ + getTimeFromPyObject(obj, "startTime", start); + getTimeFromPyObject(obj, "endTime", end); +} + +static bool setMatrixInfosFromPyObject(PyObject* obj, CMatrix* matrix) +{ + PyObject* pyNDim = PyObject_CallMethod(obj, "getDimensionCount", nullptr); + if (pyNDim == nullptr) { return false; } + + const size_t nDim = PyLong_AsUnsignedLongMask(pyNDim); + matrix->setDimensionCount(nDim); + Py_CLEAR(pyNDim); + + PyObject* pySizeDim = PyObject_GetAttrString(obj, "dimensionSizes"); + PyObject* pyLabelDim = PyObject_GetAttrString(obj, "dimensionLabels"); + + size_t offset = 0; + for (size_t i = 0; i < nDim; ++i) + { + const size_t size = PyLong_AsUnsignedLongMask(PyList_GetItem(pySizeDim, Py_ssize_t(i))); + matrix->setDimensionSize(i, size); + for (size_t j = 0; j < size; ++j) + { + PyObject* label = PyList_GetItem(pyLabelDim, offset + j); + if (PyUnicode_Check(label)) { matrix->setDimensionLabel(i, j, PyUnicode_AsUTF8(label)); } + else + { + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + } + offset = offset + size; + } + + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return true; +} +///------------------------------------------------------------------------------------------------- + +bool CBoxAlgorithmPython3::m_isPythonInitialized = false; +PyObject* CBoxAlgorithmPython3::m_mainModule = nullptr; +PyObject* CBoxAlgorithmPython3::m_mainDictionnary = nullptr; +PyObject* CBoxAlgorithmPython3::m_matrixHeader = nullptr; +PyObject* CBoxAlgorithmPython3::m_matrixBuffer = nullptr; +PyObject* CBoxAlgorithmPython3::m_matrixEnd = nullptr; +PyObject* CBoxAlgorithmPython3::m_signalHeader = nullptr; +PyObject* CBoxAlgorithmPython3::m_signalBuffer = nullptr; +PyObject* CBoxAlgorithmPython3::m_signalEnd = nullptr; +PyObject* CBoxAlgorithmPython3::m_stimulationHeader = nullptr; +PyObject* CBoxAlgorithmPython3::m_stimulation = nullptr; +PyObject* CBoxAlgorithmPython3::m_stimulationSet = nullptr; +PyObject* CBoxAlgorithmPython3::m_stimulationEnd = nullptr; +PyObject* CBoxAlgorithmPython3::m_buffer = nullptr; +PyObject* CBoxAlgorithmPython3::m_execFileFunction = nullptr; +PyObject* CBoxAlgorithmPython3::m_stdout = nullptr; +PyObject* CBoxAlgorithmPython3::m_stderr = nullptr; + +bool CBoxAlgorithmPython3::logSysStd(const bool out) +{ + PyObject* pyLog = PyObject_CallMethod((out ? m_stdout : m_stderr), "getvalue", nullptr); + if (pyLog == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to call sys.std" << (out ? "out" : "err") << ".getvalue().\n"; + return false; + } + + char* log = PyBytes_AS_STRING(PyUnicode_AsEncodedString(pyLog, "utf-8", "strict")); + if (log == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to convert pyLog to (char *).\n"; + Py_CLEAR(pyLog); + return false; + } + Py_CLEAR(pyLog); + + if (strlen(log) > 0) + { + this->getLogManager() << Kernel::LogLevel_Info << log; + PyObject* result = PyObject_CallMethod((out ? m_stdout : m_stderr), "flush", nullptr); + if (result == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to call sys.std" << (out ? "out" : "err") << ".flush().\n"; + return false; + } + Py_CLEAR(result); + } + return true; +} + +void CBoxAlgorithmPython3::buildPythonSettings() +{ + const Kernel::IBox* boxCtx = getBoxAlgorithmContext()->getStaticBoxContext(); + for (uint32_t i = 2; i < boxCtx->getSettingCount(); ++i) + { + CString name; + boxCtx->getSettingName(i, name); + const CString value = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i); + PyDict_SetItemString(m_boxSetting, name.toASCIIString(), PyUnicode_FromString(value.toASCIIString())); + } +} + +bool CBoxAlgorithmPython3::initializePythonSafely() +{ + // Only the first Python box does the initialization of the global parts + if (m_isPythonInitialized) { return true; } + + this->getLogManager() << Kernel::LogLevel_Info << "Discovered Python is " << Py_GetVersion() << " (" << Py_GetPlatform() << ")\n"; + this->getLogManager() << Kernel::LogLevel_Debug << "The Python path is [" << Py_GetPath() << "]\n"; + + const std::string cmd = std::string("import sys\nsys.path.append('") + Directories::getDataDir().toASCIIString() + "/plugins/python3')\nsys.argv = [\"openvibe\"]\n"; + // cmd += "import openvibe\n" + "from StimulationsCodes import *\n"; + this->getLogManager() << Kernel::LogLevel_Trace << "Running [\n" << cmd << "\n].\n"; + + PyRun_SimpleString(cmd.c_str()); + + m_mainModule = PyImport_AddModule("__main__"); + m_mainDictionnary = PyModule_GetDict(m_mainModule); + + //**************************************** + /* + //Execute the script which contains the different classes to interact with OpenViBE + const char* path = (Directories::getDataDir() + "/plugins/python3/openvibe.py").toASCIIString(); + FILE* file = fopen(path, "r"); + if (!file) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to open '" << path << "'.\n"; + return false; + } + this->getLogManager() << Kernel::LogLevel_Info << "file open check\n"; + + if (PyRun_SimpleFile(file, path) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to run '" << path << "'.\n"; + return false; + } + fclose(file); + + this->getLogManager() << Kernel::LogLevel_Info << "file run check\n"; + */ + const std::string path = std::string(Directories::getDataDir().toASCIIString()) + "/plugins/python3/openvibe.py"; + std::ifstream file; + file.open(path); + if (!file.is_open()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to open '" << path << "'.\n"; + return false; + } + const std::string str((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + if (PyRun_SimpleString(str.c_str()) == -1) // Yolo but PyRun_File crash + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to run '" << path << "'.\n"; + return false; + } + //this->getLogManager() << Kernel::LogLevel_Trace << "Running [\n" << str << "\n].\n"; + file.close(); + //**************************************** + + // Apply References + //**************************************** + m_stdout = PySys_GetObject("stdout"); + if (m_stdout == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "sys.stdout does not exist.\n"; + return false; + } + m_stderr = PySys_GetObject("stderr"); + if (m_stderr == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "sys.stderr does not exist.\n"; + return false; + } + + m_execFileFunction = PyDict_GetItemString(m_mainDictionnary, "execfileHandlingException"); + if (m_execFileFunction == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "openvibe.py doesn't have a execfileHandlingException function, quitting" << ".\n"; + return false; + } + + if (!PyCallable_Check(m_execFileFunction)) + { + this->getLogManager() << Kernel::LogLevel_Error << "openvibe.py doesn't have a execfileHandlingException function callable, " << ".\n"; + return false; + } + + // Streams + m_matrixHeader = PyDict_GetItemString(m_mainDictionnary, "OVStreamedMatrixHeader"); + if (m_matrixHeader == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVStreamedMatrixHeader\".\n"; + return false; + } + + m_matrixBuffer = PyDict_GetItemString(m_mainDictionnary, "OVStreamedMatrixBuffer"); + if (m_matrixBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVStreamedMatrixBuffer\".\n"; + return false; + } + + m_matrixEnd = PyDict_GetItemString(m_mainDictionnary, "OVStreamedMatrixEnd"); + if (m_matrixEnd == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVStreamedMatrixEnd\".\n"; + return false; + } + + m_signalHeader = PyDict_GetItemString(m_mainDictionnary, "OVSignalHeader"); + if (m_signalHeader == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVSignalHeader\".\n"; + return false; + } + + m_signalBuffer = PyDict_GetItemString(m_mainDictionnary, "OVSignalBuffer"); + if (m_signalBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVSignalBuffer\".\n"; + return false; + } + + m_signalEnd = PyDict_GetItemString(m_mainDictionnary, "OVSignalEnd"); + if (m_signalEnd == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVSignalEnd\".\n"; + return false; + } + + m_stimulationHeader = PyDict_GetItemString(m_mainDictionnary, "OVStimulationHeader"); + if (m_stimulationHeader == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVStimulationHeader\".\n"; + return false; + } + + m_stimulation = PyDict_GetItemString(m_mainDictionnary, "OVStimulation"); + if (m_stimulation == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVStimulation\".\n"; + return false; + } + + m_stimulationSet = PyDict_GetItemString(m_mainDictionnary, "OVStimulationSet"); + if (m_stimulationSet == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVStimulationSet\".\n"; + return false; + } + + m_stimulationEnd = PyDict_GetItemString(m_mainDictionnary, "OVStimulationEnd"); + if (m_stimulationEnd == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVStimulationEnd\".\n"; + return false; + } + + m_buffer = PyDict_GetItemString(m_mainDictionnary, "OVBuffer"); + if (m_buffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load class \"OVBuffer\".\n"; + return false; + } + + m_isPythonInitialized = true; + this->getLogManager() << Kernel::LogLevel_Info << "Python Interpreter initialized\n"; + return true; +} + +bool CBoxAlgorithmPython3::initialize() +{ + m_box = nullptr; + m_boxInput = nullptr; + m_boxOutput = nullptr; + m_boxCurrentTime = nullptr; + m_boxSetting = nullptr; + m_boxInitialize = nullptr; + m_boxProcess = nullptr; + m_boxUninitialize = nullptr; + m_initializeSucceeded = false; + + if (!initializePythonSafely()) { return false; } + + //Initialize the clock frequency of the box depending on the first setting of the box + m_clockFrequency = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_scriptFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + if (strlen(m_scriptFilename.toASCIIString()) == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "You have to choose a script.\n"; + return false; + } + + //Create the decoders for the inputs + const Kernel::IBox& boxCtx = this->getStaticBoxContext(); + CIdentifier typeID; + for (size_t i = 0; i < boxCtx.getInputCount(); ++i) + { + boxCtx.getInputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { m_decoders.push_back(new Toolkit::TStreamedMatrixDecoder(*this, i)); } + else if (typeID == OV_TypeId_Signal) { m_decoders.push_back(new Toolkit::TSignalDecoder(*this, i)); } + else if (typeID == OV_TypeId_FeatureVector) { m_decoders.push_back(new Toolkit::TFeatureVectorDecoder(*this, i)); } + else if (typeID == OV_TypeId_Spectrum) { m_decoders.push_back(new Toolkit::TSpectrumDecoder(*this, i)); } + else if (typeID == OV_TypeId_ChannelLocalisation) { m_decoders.push_back(new Toolkit::TChannelLocalisationDecoder(*this, i)); } + else if (typeID == OV_TypeId_Stimulations) { m_decoders.push_back(new Toolkit::TStimulationDecoder(*this, i)); } + else if (typeID == OV_TypeId_ExperimentInfo) { m_decoders.push_back(new Toolkit::TExperimentInfoDecoder(*this, i)); } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Codec to decode " << typeID.str() << " is not implemented.\n"; + return false; + } + } + + //Create the encoders for the outputs + for (size_t i = 0; i < boxCtx.getOutputCount(); ++i) + { + boxCtx.getOutputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { m_encoders.push_back(new Toolkit::TStreamedMatrixEncoder(*this, i)); } + else if (typeID == OV_TypeId_Signal) { m_encoders.push_back(new Toolkit::TSignalEncoder(*this, i)); } + else if (typeID == OV_TypeId_FeatureVector) { m_encoders.push_back(new Toolkit::TFeatureVectorEncoder(*this, i)); } + else if (typeID == OV_TypeId_Spectrum) { m_encoders.push_back(new Toolkit::TSpectrumEncoder(*this, i)); } + else if (typeID == OV_TypeId_ChannelLocalisation) { m_encoders.push_back(new Toolkit::TChannelLocalisationEncoder(*this, i)); } + else if (typeID == OV_TypeId_Stimulations) { m_encoders.push_back(new Toolkit::TStimulationEncoder(*this, i)); } + else if (typeID == OV_TypeId_ExperimentInfo) { m_encoders.push_back(new Toolkit::TExperimentInfoEncoder(*this, i)); } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Codec to encode " << typeID.str() << " is not implemented.\n"; + return false; + } + } + + PyObject* pyTmp = Py_BuildValue("s,O", m_scriptFilename.toASCIIString(), m_mainDictionnary); + if (pyTmp == nullptr) { this->getLogManager() << Kernel::LogLevel_Error << "Failed to load [" << m_scriptFilename << "]"; } + + PyObject* result = PyObject_CallObject(m_execFileFunction, pyTmp); + if (result == nullptr || PyLong_AsLong(result) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to run [" << m_scriptFilename << "], result = " + << (result ? std::to_string(PyLong_AsLong(result)) : "NULL") << "\n"; + logSysStdout(); + logSysStderr(); + Py_CLEAR(pyTmp); + Py_CLEAR(result); + return false; + } + + Py_CLEAR(pyTmp); + Py_CLEAR(result); + + m_box = PyObject_GetAttrString(m_mainModule, "box"); // la box qui vient juste d'etre creee + if (m_box == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load \"box\" object.\n"; + return false; + } + + m_boxInput = PyObject_GetAttrString(m_box, "input"); + if (m_boxInput == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load \"box.input\".\n"; + return false; + } + + m_boxOutput = PyObject_GetAttrString(m_box, "output"); + if (m_boxOutput == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load \"box.output\".\n"; + return false; + } + + std::string type; + for (size_t i = 0; i < boxCtx.getInputCount(); ++i) + { + boxCtx.getInputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { type = "StreamedMatrix"; } + else if (typeID == OV_TypeId_Signal) { type = "Signal"; } + else if (typeID == OV_TypeId_FeatureVector) { type = "FeatureVector"; } + else if (typeID == OV_TypeId_Spectrum) { type = "Spectrum"; } + else if (typeID == OV_TypeId_ChannelLocalisation) { type = "ChannelLocalisation"; } + else if (typeID == OV_TypeId_Stimulations) { type = "Stimulations"; } + else if (typeID == OV_TypeId_ExperimentInfo) { type = "ExperimentInfo"; } + PyObject* res = PyObject_CallMethod(m_box, "addInput", "s", type.c_str()); + if (res == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to call box.addInput().\n"; + return false; + } + Py_CLEAR(res); + } + + for (size_t i = 0; i < boxCtx.getOutputCount(); ++i) + { + boxCtx.getOutputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { type = "StreamedMatrix"; } + else if (typeID == OV_TypeId_Signal) { type = "Signal"; } + else if (typeID == OV_TypeId_FeatureVector) { type = "FeatureVector"; } + else if (typeID == OV_TypeId_Spectrum) { type = "Spectrum"; } + else if (typeID == OV_TypeId_ChannelLocalisation) { type = "ChannelLocalisation"; } + else if (typeID == OV_TypeId_Stimulations) { type = "Stimulations"; } + else if (typeID == OV_TypeId_ExperimentInfo) { type = "ExperimentInfo"; } + PyObject* res = PyObject_CallMethod(m_box, "addOutput", "s", type.c_str()); + if (res == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to call box.addOutput().\n"; + return false; + } + Py_CLEAR(res); + } + + m_boxSetting = PyObject_GetAttrString(m_box, "setting"); + if (m_boxSetting == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load \"box.setting\".\n"; + return false; + } + buildPythonSettings(); + + if (!PyObject_HasAttrString(m_box, "_clock")) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to initialize \"box._clock\" attribute because it does not exist.\n"; + return false; + } + + PyObject* pyBoxClock = PyLong_FromLong(long(m_clockFrequency)); + if (pyBoxClock == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to convert m_ClockFrequency into PyInt.\n"; + return false; + } + if (PyObject_SetAttrString(m_box, "_clock", pyBoxClock) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to initialize \"box._clock\" attribute.\n"; + return false; + } + Py_CLEAR(pyBoxClock); + + if (!PyObject_HasAttrString(m_box, "_currentTime")) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to initialize \"box._currentTime\" attribute because it does not exist.\n"; + return false; + } + + m_boxCurrentTime = PyFloat_FromDouble(CTime(this->getPlayerContext().getCurrentTime()).toSeconds()); + if (m_boxCurrentTime == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to convert the current time into a PyFloat.\n"; + return false; + } + if (PyObject_SetAttrString(m_box, "_currentTime", m_boxCurrentTime) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to initialize \"box._currentTime\" attribute.\n"; + return false; + } + + if (!PyObject_HasAttrString(m_box, "realInitialize")) + { + this->getLogManager() << Kernel::LogLevel_Error << "No realInitialize.\n"; + return false; + } + + m_boxInitialize = PyObject_GetAttrString(m_box, "realInitialize"); + if (m_boxInitialize == nullptr) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Failed to load \"box.realInitialize\" function.\n"; } + else if (!PyCallable_Check(m_boxInitialize)) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "\"box.realInitialize\" is not callable.\n"; } + + m_boxProcess = PyObject_GetAttrString(m_box, "realProcess"); + if (m_boxProcess == nullptr) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Failed to load \"box.realProcess\" function.\n"; } + else if (!PyCallable_Check(m_boxProcess)) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "\"box.realProcess\" is not callable.\n"; } + + m_boxUninitialize = PyObject_GetAttrString(m_box, "realUninitialize"); + if (m_boxUninitialize == nullptr) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Failed to load \"box.realUninitialize\" function.\n"; } + else if (!PyCallable_Check(m_boxUninitialize)) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "\"box.realUninitialize\" is not callable.\n"; } + + //Execute the initialize function defined in the python user script + if (m_boxInitialize && PyCallable_Check(m_boxInitialize)) + { + PyObject* res = PyObject_CallObject(m_boxInitialize, nullptr); + const bool stdoutError = logSysStdout(); // souci car la si l'init plante pas de sortie au bon endroit + const bool stderrError = logSysStderr(); + if ((res == nullptr) || (!stdoutError) || (!stderrError)) + { + if (res == nullptr) { this->getLogManager() << Kernel::LogLevel_Error << "Failed to call \"box.__initialize\" function.\n"; } + if (!stdoutError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStdout() failed during box.__initialization.\n"; } + if (!stderrError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStderr() failed during box.__initialization.\n"; } + Py_CLEAR(res); + return false; + } + Py_CLEAR(res); + } + + m_initializeSucceeded = true; + return true; +} + +bool CBoxAlgorithmPython3::uninitialize() +{ + for (size_t i = 0; i < m_decoders.size(); ++i) + { + m_decoders[i]->uninitialize(); + delete m_decoders[i]; + } + m_decoders.clear(); + + for (size_t i = 0; i < m_encoders.size(); ++i) + { + m_encoders[i]->uninitialize(); + delete m_encoders[i]; + } + m_encoders.clear(); + + if (m_initializeSucceeded) // we call this uninit only if init had succeeded Execute the uninitialize function defined in the python script + { // il y a un souci ici si le script n'a pas ete charge ca ne passe pas + if (m_boxUninitialize && PyCallable_Check(m_boxUninitialize)) + { + PyObject* result = PyObject_CallObject(m_boxUninitialize, nullptr); + const bool stdoutError = logSysStdout(); + const bool stderrError = logSysStderr(); + if ((result == nullptr) || (!stdoutError) || (!stderrError)) + { + if (result == nullptr) { this->getLogManager() << Kernel::LogLevel_Error << "Failed to call \"box.__uninitialize\" function.\n"; } + if (!stdoutError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStdout() failed during box.__uninitialization.\n"; } + if (!stderrError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStderr() failed during box.__uninitialization.\n"; } + Py_CLEAR(result); + return false; + } + Py_CLEAR(result); + } + } + + // Note: Py_CLEAR is safe to use on NULL pointers, so we can clean everything here + Py_CLEAR(m_box); + Py_CLEAR(m_boxInput); + Py_CLEAR(m_boxOutput); + Py_CLEAR(m_boxCurrentTime); + Py_CLEAR(m_boxSetting); + Py_CLEAR(m_boxInitialize); + Py_CLEAR(m_boxProcess); + Py_CLEAR(m_boxUninitialize); + + // Py_Initialize() and Py_Finalize() are called in ovp_main.cpp, we never uninitialize Python here + + return true; +} + +bool CBoxAlgorithmPython3::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmPython3::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmPython3::transferStreamedMatrixInputChunksToPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + + if (!PyList_Check(m_boxInput)) + { + this->getLogManager() << Kernel::LogLevel_Error << "box.input must be a list.\n"; + return false; + } + + PyObject* pyBuffer = PyList_GetItem(m_boxInput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.input[" << index << "].\n"; + return false; + } + //Expose input streamed matrix chunks to python + for (size_t idx = 0; idx < boxCtx.getInputChunkCount(index); ++idx) + { + m_decoders[index]->decode(idx); + + if (m_decoders[index]->isHeaderReceived()) + { + CMatrix* matrix = dynamic_cast*>(m_decoders[index])->getOutputMatrix(); + size_t nDim = matrix->getDimensionCount(); + + PyObject* pySizeDim = PyList_New(nDim); + if (pySizeDim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new list pySizeDim.\n"; + return false; + } + + PyObject* pyLabelDim = PyList_New(0); + if (pyLabelDim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new list pyLabelDim.\n"; + Py_CLEAR(pySizeDim); + return false; + } + + for (size_t i = 0; i < nDim; ++i) + { + size_t dimSize = matrix->getDimensionSize(i); + if (PyList_SetItem(pySizeDim, i, PyLong_FromLong(dimSize)) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item " << i << " in dimension size list.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + for (size_t j = 0; j < dimSize; ++j) + { + if (PyList_Append(pyLabelDim, PyUnicode_FromString(matrix->getDimensionLabel(i, j))) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append \"" << matrix->getDimensionLabel(i, j) << "\" in dimension label list.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + } + } + + PyObject* pyArg = PyTuple_New(4); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 2, pySizeDim) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 2 (dimension size) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 3, pyLabelDim) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 3 (dimension label) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + + PyObject* pyMatrixHeader = PyObject_Call(m_matrixHeader, pyArg, nullptr); + if (pyMatrixHeader == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStreamedMatrixHeader pyMatrixHeader.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + + if (!appendToPyObject(pyMatrixHeader, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVStreamedMatrixHeader to box.input[" << index << "].\n"; + Py_CLEAR(pyMatrixHeader); + return false; + } + Py_CLEAR(pyMatrixHeader); + } + + if (m_decoders[index]->isBufferReceived()) + { + PyObject* pyArg = PyTuple_New(3); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 2, PyList_New(0)) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 2 (bufferElements) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + PyObject* pyMatrixBuffer = PyObject_Call(m_matrixBuffer, pyArg, nullptr); + if (pyMatrixBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStreamedMatrixBuffer pyMatrixBuffer.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + CMatrix* matrix = dynamic_cast*>(m_decoders[index])->getOutputMatrix(); + double* bufferBase = matrix->getBuffer(); + for (size_t i = 0; i < matrix->getBufferElementCount(); ++i) + { + if (PyList_Append(pyMatrixBuffer, PyFloat_FromDouble(bufferBase[i])) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append element " << i << " to pyMatrixBuffer.\n"; + Py_CLEAR(pyMatrixBuffer); + return false; + } + } + + if (!appendToPyObject(pyMatrixBuffer, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVStreamedMatrixBuffer to box.input[" << index << "].\n"; + Py_CLEAR(pyMatrixBuffer); + return false; + } + Py_CLEAR(pyMatrixBuffer); + } + + if (m_decoders[index]->isEndReceived()) + { + PyObject* pyArg = PyTuple_New(2); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + PyObject* pyMatrixEnd = PyObject_Call(m_matrixEnd, pyArg, nullptr); + if (pyMatrixEnd == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStreamedMatrixEnd pyMatrixEnd.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + if (!appendToPyObject(pyMatrixEnd, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVStreamedMatrixEnd to box.input[" << index << "].\n"; + Py_CLEAR(pyMatrixEnd); + return false; + } + Py_CLEAR(pyMatrixEnd); + } + } + + return true; +} + +bool CBoxAlgorithmPython3::transferStreamedMatrixOutputChunksFromPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + CMatrix* matrix = dynamic_cast*>(m_encoders[index])->getInputMatrix(); + + if (!PyList_Check(m_boxOutput)) + { + this->getLogManager() << Kernel::LogLevel_Error << "box.output must be a list.\n"; + return false; + } + + PyObject* pyBuffer = PyList_GetItem(m_boxOutput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].\n"; + return false; + } + + size_t len; + if (!getLenFromPyObject(pyBuffer, len)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].__len__().\n"; + return false; + } + + for (size_t idx = 0; idx < len; ++idx) + { + PyObject* pyChunk = PyObject_CallMethod(pyBuffer, "pop", nullptr); + if (pyChunk == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get item " << idx << " of box.output[" << index << "].\n"; + return false; + } + + if (PyObject_IsInstance(pyChunk, m_matrixHeader) == 1) + { + if (!setMatrixInfosFromPyObject(pyChunk, matrix)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed setting matrix info.\n"; + Py_CLEAR(pyChunk); + return false; + } + + m_encoders[index]->encodeHeader(); + + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_matrixBuffer) == 1) + { + double* bufferBase = matrix->getBuffer(); + for (size_t i = 0; i < matrix->getBufferElementCount(); ++i) { bufferBase[i] = PyFloat_AsDouble(PyList_GetItem(pyChunk, i)); } + + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeBuffer(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_matrixEnd) == 1) + { + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeEnd(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Unexpected object type for item " << idx << " in box.output[" << index << "].\n"; + Py_CLEAR(pyChunk); + return false; + } + + Py_CLEAR(pyChunk); + } + return true; +} + +bool CBoxAlgorithmPython3::transferSignalInputChunksToPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + + if (!PyList_Check(m_boxInput)) + { + this->getLogManager() << Kernel::LogLevel_Error << "box.input must be a list.\n"; + return false; + } + + PyObject* pyBuffer = PyList_GetItem(m_boxInput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.input[" << index << "].\n"; + return false; + } + //Expose input signal chunks to python + for (size_t idx = 0; idx < boxCtx.getInputChunkCount(index); ++idx) + { + m_decoders[index]->decode(idx); + + if (m_decoders[index]->isHeaderReceived()) + { + CMatrix* matrix = dynamic_cast*>(m_decoders[index])->getOutputMatrix(); + size_t nDim = matrix->getDimensionCount(); + + PyObject* pySizeDim = PyList_New(nDim); + if (pySizeDim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new list pySizeDim.\n"; + return false; + } + + PyObject* pyLabelDim = PyList_New(0); + if (pyLabelDim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new list pyLabelDim.\n"; + Py_CLEAR(pySizeDim); + return false; + } + + for (size_t i = 0; i < nDim; ++i) + { + size_t dimSize = matrix->getDimensionSize(i); + if (PyList_SetItem(pySizeDim, i, PyLong_FromLong(dimSize)) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item " << i << " in dimension size list.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + for (size_t j = 0; j < dimSize; ++j) + { + if (PyList_Append(pyLabelDim, PyUnicode_FromString(matrix->getDimensionLabel(i, j))) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append \"" << matrix->getDimensionLabel(i, j) << "\" in dimension label list.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + } + } + + PyObject* pyArg = PyTuple_New(5); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 2, pySizeDim) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 2 (dimension size) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 3, pyLabelDim) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 3 (dimension label) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem( + pyArg, 4, PyLong_FromLong(long(dynamic_cast*>(m_decoders[index])->getOutputSamplingRate()))) + != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 4 (samplingRate) in tuple pyArg.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + + PyObject* pySignalHeader = PyObject_Call(m_signalHeader, pyArg, nullptr); + if (pySignalHeader == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVSignalHeader pySignalHeader.\n"; + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pySizeDim); + Py_CLEAR(pyLabelDim); + Py_CLEAR(pyArg); + + if (!appendToPyObject(pySignalHeader, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVSignalHeader to box.input[" << index << "].\n"; + Py_CLEAR(pySignalHeader); + return false; + } + Py_CLEAR(pySignalHeader); + } + + if (m_decoders[index]->isBufferReceived()) + { + PyObject* pyArg = PyTuple_New(3); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (startTime) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (endTime) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 2, PyList_New(0)) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 2 (bufferElements) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + PyObject* pySignalBuffer = PyObject_Call(m_signalBuffer, pyArg, nullptr); + if (pySignalBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVSignalBuffer pySignalBuffer.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + CMatrix* matrix = dynamic_cast*>(m_decoders[index])->getOutputMatrix(); + double* bufferBase = matrix->getBuffer(); + for (size_t i = 0; i < matrix->getBufferElementCount(); ++i) + { + if (PyList_Append(pySignalBuffer, PyFloat_FromDouble(bufferBase[i])) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append element " << i << " to pySignalBuffer.\n"; + Py_CLEAR(pySignalBuffer); + return false; + } + } + + if (!appendToPyObject(pySignalBuffer, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVSignalBuffer to box.input[" << index << "].\n"; + Py_CLEAR(pySignalBuffer); + return false; + } + Py_CLEAR(pySignalBuffer); + } + + if (m_decoders[index]->isEndReceived()) + { + PyObject* pyArg = PyTuple_New(2); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + PyObject* pySignalEnd = PyObject_Call(m_signalEnd, pyArg, nullptr); + if (pySignalEnd == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new m_signalEnd pySignalEnd.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + if (!appendToPyObject(pySignalEnd, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVSignalEnd to box.input[" << index << "].\n"; + Py_CLEAR(pySignalEnd); + return false; + } + Py_CLEAR(pySignalEnd); + } + } + return true; +} + +bool CBoxAlgorithmPython3::transferSignalOutputChunksFromPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + CMatrix* matrix = dynamic_cast*>(m_encoders[index])->getInputMatrix(); + + if (!PyList_Check(m_boxOutput)) + { + this->getLogManager() << Kernel::LogLevel_Error << "box.output must be a list.\n"; + return false; + } + + PyObject* pyBuffer = PyList_GetItem(m_boxOutput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].\n"; + return false; + } + + size_t len; + if (!getLenFromPyObject(pyBuffer, len)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].__len__().\n"; + return false; + } + + for (size_t idx = 0; idx < len; ++idx) + { + PyObject* pyChunk = PyObject_CallMethod(pyBuffer, "pop", nullptr); + if (pyChunk == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get item " << idx << " of box.output[" << index << "].\n"; + return false; + } + + if (PyObject_IsInstance(pyChunk, m_signalHeader) == 1) + { + if (!setMatrixInfosFromPyObject(pyChunk, matrix)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed setting matrix info.\n"; + Py_CLEAR(pyChunk); + return false; + } + + PyObject* pySampling = PyObject_GetAttrString(pyChunk, "samplingRate"); + if (pySampling == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load signal header sampling rate.\n"; + return false; + } + Kernel::TParameterHandler& sampling = dynamic_cast*>(m_encoders[index])-> + getInputSamplingRate(); + sampling = uint64_t(PyLong_AsLong(pySampling)); + m_encoders[index]->encodeHeader(); + Py_CLEAR(pySampling); + + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_signalBuffer) == 1) + { + double* bufferBase = matrix->getBuffer(); + for (size_t i = 0; i < matrix->getBufferElementCount(); ++i) { bufferBase[i] = PyFloat_AsDouble(PyList_GetItem(pyChunk, i)); } + + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeBuffer(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_signalEnd) == 1) + { + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeEnd(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Unexpected object type for item " << idx << " in box.output[" << index << "].\n"; + Py_CLEAR(pyChunk); + return false; + } + + Py_CLEAR(pyChunk); + } + return true; +} + +bool CBoxAlgorithmPython3::transferStimulationInputChunksToPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + PyObject* pyBuffer = PyList_GetItem(m_boxInput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.input[" << index << "].\n"; + return false; + } + for (size_t idx = 0; idx < boxCtx.getInputChunkCount(index); ++idx) + { + m_decoders[index]->decode(idx); + + if (m_decoders[index]->isHeaderReceived()) + { + PyObject* pyArg = PyTuple_New(2); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + PyObject* pyStimHeader = PyObject_Call(m_stimulationHeader, pyArg, nullptr); + if (pyStimHeader == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStimulationHeader pyStimHeader.\n"; + PyErr_Print(); + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + if (!appendToPyObject(pyStimHeader, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVStimulationHeader to box.input[" << index << "].\n"; + Py_CLEAR(pyStimHeader); + return false; + } + Py_CLEAR(pyStimHeader); + } + + if (m_decoders[index]->isBufferReceived()) + { + IStimulationSet* stimSet = dynamic_cast*>(m_decoders[index])->getOutputStimulationSet(); + + PyObject* pyArg = PyTuple_New(2); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + PyObject* pyStimSet = PyObject_Call(m_stimulationSet, pyArg, nullptr); + if (pyStimSet == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStimulationSet pyStimSet.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + for (size_t i = 0; i < stimSet->getStimulationCount(); ++i) + { + const uint64_t id = stimSet->getStimulationIdentifier(i); + const uint64_t date = stimSet->getStimulationDate(i); + const uint64_t duration = stimSet->getStimulationDuration(i); + + pyArg = PyTuple_New(3); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyLong_FromLong(long(id))) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (identifier) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(date).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (date) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 2, PyFloat_FromDouble(CTime(duration).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 2 (duration) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + PyObject* pyStim = PyObject_Call(m_stimulation, pyArg, nullptr); + if (pyStim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStimulation pyStim.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + if (!appendToPyObject(pyStim, pyStimSet)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append stimulation to box.input[" << index << "].\n"; + Py_CLEAR(pyStim); + return false; + } + Py_CLEAR(pyStim); + } + + if (!appendToPyObject(pyStimSet, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append stimulation to box.input[" << index << "].\n"; + Py_CLEAR(pyStimSet); + return false; + } + Py_CLEAR(pyStimSet); + } + + if (m_decoders[index]->isEndReceived()) + { + PyObject* pyArg = PyTuple_New(2); + if (pyArg == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new tuple pyArg.\n"; + return false; + } + if (PyTuple_SetItem(pyArg, 0, PyFloat_FromDouble(CTime(boxCtx.getInputChunkStartTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 0 (start time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + if (PyTuple_SetItem(pyArg, 1, PyFloat_FromDouble(CTime(boxCtx.getInputChunkEndTime(index, idx)).toSeconds())) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to set item 1 (end time) in tuple pyArg.\n"; + Py_CLEAR(pyArg); + return false; + } + + PyObject* pyStimEnd = PyObject_Call(m_stimulationEnd, pyArg, nullptr); + if (pyStimEnd == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create a new OVStimulationEnd pyStimEnd.\n"; + Py_CLEAR(pyArg); + return false; + } + Py_CLEAR(pyArg); + + if (!appendToPyObject(pyStimEnd, pyBuffer)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to append an OVStimulationEnd to box.input[" << index << "].\n"; + Py_CLEAR(pyStimEnd); + return false; + } + Py_CLEAR(pyStimEnd); + } + } + return true; +} + +bool CBoxAlgorithmPython3::transferStimulationOutputChunksFromPython(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + IStimulationSet* stimSet = dynamic_cast*>(m_encoders[index])->getInputStimulationSet(); + + if (!PyList_Check(m_boxOutput)) + { + this->getLogManager() << Kernel::LogLevel_Error << "box.output must be a list.\n"; + return false; + } + + PyObject* pyBuffer = PyList_GetItem(m_boxOutput, Py_ssize_t(index)); + if (pyBuffer == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].\n"; + return false; + } + + size_t len; + if (!getLenFromPyObject(pyBuffer, len)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get box.output[" << index << "].__len__().\n"; + return false; + } + + for (size_t idx = 0; idx < len; ++idx) + { + PyObject* pyChunk = PyObject_CallMethod(pyBuffer, "pop", nullptr); + if (pyChunk == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get item " << idx << " of box.output[" << index << "].\n"; + return false; + } + + if (PyObject_IsInstance(pyChunk, m_stimulationHeader) == 1) + { + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + stimSet->setStimulationCount(0); + m_encoders[index]->encodeHeader(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_stimulationSet) == 1) + { + size_t chunkLen; + if (!getLenFromPyObject(pyChunk, chunkLen)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get stimulations set length.\n"; + return false; + } + + stimSet->setStimulationCount(0); + for (size_t i = 0; i < chunkLen; ++i) + { + PyObject* pyStim = PyList_GetItem(pyChunk, Py_ssize_t(i)); + if (pyStim == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get item " << i << " of chunk " << idx << ".\n"; + return false; + } + if (PyObject_IsInstance(pyStim, m_stimulation) < 1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Item " << i << " is not an OVStimulation.\n"; + return false; + } + + PyObject* pyID = PyObject_GetAttrString(pyStim, "identifier"); + const uint64_t id = uint64_t(PyFloat_AsDouble(pyID)); + Py_CLEAR(pyID); + + uint64_t date, duration; + getTimeFromPyObject(pyStim, "date", date); + getTimeFromPyObject(pyStim, "duration", duration); + + stimSet->appendStimulation(id, date, duration); + } + + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeBuffer(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else if (PyObject_IsInstance(pyChunk, m_stimulationEnd) == 1) + { + uint64_t startTime, endTime; + getTimesFromPyObject(pyChunk, startTime, endTime); + + m_encoders[index]->encodeEnd(); + boxCtx.markOutputAsReadyToSend(index, startTime, endTime); + } + + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Unexpected object type for item " << idx << " in box.output[" << index << "].\n"; + Py_CLEAR(pyChunk); + return false; + } + + Py_CLEAR(pyChunk); + } + return true; +} + +bool CBoxAlgorithmPython3::process() +{ + const Kernel::IBox& boxCtx = this->getStaticBoxContext(); + CIdentifier typeID; + + for (size_t i = 0; i < boxCtx.getInputCount(); ++i) + { + boxCtx.getInputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { if (!transferStreamedMatrixInputChunksToPython(i)) { return false; } } + else if (typeID == OV_TypeId_Signal) { if (!transferSignalInputChunksToPython(i)) { return false; } } + else if (typeID == OV_TypeId_Stimulations) { if (!transferStimulationInputChunksToPython(i)) { return false; } } + // else if (typeID == OV_TypeId_FeatureVector) { } + // else if (typeID == OV_TypeId_Spectrum) { } + // else if (typeID == OV_TypeId_ChannelLocalisation) { } + // else if (typeID == OV_TypeId_ExperimentInfo) { } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Codec to decode " << typeID.str() << " is not implemented.\n"; + return false; + } + } + + //update the python current time + m_boxCurrentTime = PyFloat_FromDouble(CTime(this->getPlayerContext().getCurrentTime()).toSeconds()); + if (m_boxCurrentTime == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to convert the current time into a PyFloat during update.\n"; + return false; + } + if (PyObject_SetAttrString(m_box, "_currentTime", m_boxCurrentTime) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to update \"box._currentTime\" attribute.\n"; + return false; + } + + //call the python process function + if (m_boxProcess && PyCallable_Check(m_boxProcess)) + { + PyObject* result = PyObject_CallObject(m_boxProcess, nullptr); + const bool stdoutError = logSysStdout(); + const bool stderrError = logSysStderr(); + if ((result == nullptr) || (!stdoutError) || (!stderrError)) + { + if (result == nullptr) { this->getLogManager() << Kernel::LogLevel_Error << "Failed to call \"box.__process\" function.\n"; } + if (!stdoutError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStdout() failed during box.__process.\n"; } + if (!stderrError) { this->getLogManager() << Kernel::LogLevel_Error << "logSysStderr() failed during box.__process.\n"; } + Py_CLEAR(result); + return false; + } + Py_CLEAR(result); + } + + for (size_t i = 0; i < boxCtx.getOutputCount(); ++i) + { + boxCtx.getOutputType(i, typeID); + if (typeID == OV_TypeId_StreamedMatrix) { if (!transferStreamedMatrixOutputChunksFromPython(i)) { return false; } } + else if (typeID == OV_TypeId_Signal) { if (!transferSignalOutputChunksFromPython(i)) { return false; } } + else if (typeID == OV_TypeId_Stimulations) { if (!transferStimulationOutputChunksFromPython(i)) { return false; } } + // else if (typeID == OV_TypeId_FeatureVector) { } + // else if (typeID == OV_TypeId_Spectrum) { } + // else if (typeID == OV_TypeId_ChannelLocalisation) { } + // else if (typeID == OV_TypeId_ExperimentInfo) { } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Codec to encode " << typeID.str() << " is not implemented.\n"; + return false; + } + } + return true; +} + +} // namespace Python +} // namespace Plugins +} // namespace OpenViBE +#endif // #if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) +#endif // TARGET_HAS_ThirdPartyPython3 +#endif // else WIN32 && TARGET_BUILDTYPE_Debug diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/src/box-algorithms/ovpCBoxAlgorithmPython3.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/src/box-algorithms/ovpCBoxAlgorithmPython3.h new file mode 100644 index 0000000..3c6eb49 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/src/box-algorithms/ovpCBoxAlgorithmPython3.h @@ -0,0 +1,143 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyPython3 + +#include + +#if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) + +#include "../ovp_defines.h" +#include +#include + +#include +#include +//#include + +namespace OpenViBE { +namespace Plugins { +namespace Python { +class CBoxAlgorithmPython3 final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + uint64_t getClockFrequency() override { return m_clockFrequency << 32; } + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_Python3) + +protected: + + uint64_t m_clockFrequency = 0; + CString m_scriptFilename; + + std::vector*> m_decoders; + std::vector*> m_encoders; + + //std::map m_PyObjectMap; + PyObject *m_box = nullptr, *m_boxInput = nullptr, *m_boxOutput = nullptr, *m_boxSetting = nullptr, + *m_boxCurrentTime = nullptr, *m_boxInitialize = nullptr, *m_boxProcess = nullptr, *m_boxUninitialize = nullptr; + bool m_initializeSucceeded = false; + + + bool logSysStd(const bool out); + bool logSysStdout() { return logSysStd(true); } + bool logSysStderr() { return logSysStd(false); } + void buildPythonSettings(); + + bool initializePythonSafely(); + //bool clearPyObjectMap(); + bool transferStreamedMatrixInputChunksToPython(const size_t index); + bool transferStreamedMatrixOutputChunksFromPython(const size_t index); + bool transferSignalInputChunksToPython(const size_t index); + bool transferSignalOutputChunksFromPython(const size_t index); + bool transferStimulationInputChunksToPython(const size_t index); + bool transferStimulationOutputChunksFromPython(const size_t index); + + static bool m_isPythonInitialized; + + // These are all borrowed references in python v3.7. Do not free them. + static PyObject *m_mainModule, *m_mainDictionnary; + static PyObject *m_matrixHeader, *m_matrixBuffer, *m_matrixEnd; + static PyObject *m_signalHeader, *m_signalBuffer, *m_signalEnd; + static PyObject *m_stimulationHeader, *m_stimulation, *m_stimulationSet, *m_stimulationEnd; + static PyObject* m_buffer; + static PyObject* m_execFileFunction; + static PyObject *m_stdout, *m_stderr; +}; + +class CBoxAlgorithmPython3Listener final : public Toolkit::TBoxListener +{ +public: + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + box.setInputType(index, OV_TypeId_StreamedMatrix); + return true; + } + + bool onOutputAdded(Kernel::IBox& box, const size_t index) override + { + box.setOutputType(index, OV_TypeId_StreamedMatrix); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmPython3Desc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Python 3 scripting"); } + CString getAuthorName() const override { return CString("Aurelien Van Langhenhove and Laurent George"); } + CString getAuthorCompanyName() const override { return CString("CICIT Garches, Inria"); } + CString getShortDescription() const override { return CString("This box executes a python script."); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Scripting"); } + CString getVersion() const override { return CString("0.1"); } + CString getStockItemName() const override { return CString("gtk-convert"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_Python3; } + IPluginObject* create() override { return new CBoxAlgorithmPython3; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmPython3Listener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("Clock frequency (Hz)", OV_TypeId_Integer, "64"); + prototype.addSetting("Script", OV_TypeId_Script, ""); + + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + prototype.addFlag(Kernel::BoxFlag_CanAddOutput); + prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + prototype.addFlag(Kernel::BoxFlag_CanAddSetting); + prototype.addFlag(Kernel::BoxFlag_CanModifySetting); + + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_Stimulations); + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + + prototype.addOutputSupport(OV_TypeId_Signal); + prototype.addOutputSupport(OV_TypeId_Stimulations); + prototype.addOutputSupport(OV_TypeId_StreamedMatrix); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_Python3Desc) +}; +} // namespace Python +} // namespace Plugins +} // namespace OpenViBE + +#endif // #if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) + +#endif // TARGET_HAS_ThirdPartyPython3 diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/src/ovp_defines.h new file mode 100644 index 0000000..70bc503 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/src/ovp_defines.h @@ -0,0 +1,6 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_Python3 OpenViBE::CIdentifier(0x5DC4F669, 0xD3FD4D63) +#define OVP_ClassId_BoxAlgorithm_Python3Desc OpenViBE::CIdentifier(0x404B6FFD, 0x12BDD423) diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/src/ovp_main.cpp new file mode 100644 index 0000000..58bdde1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/python3/src/ovp_main.cpp @@ -0,0 +1,106 @@ +#if defined TARGET_HAS_ThirdPartyPython3 && !(defined(WIN32) && defined(TARGET_BUILDTYPE_Debug)) +// Windows debug build doesn't typically link as most people don't have the python debug library. + +#include "box-algorithms/ovpCBoxAlgorithmPython3.h" + +#if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 3) + +#ifdef TARGET_OS_Windows +#include "windows.h" +#endif + +#include +#include + +//------------------------------------------------------------------------------------------------- +class CPython3Initializer +{ +public: + CPython3Initializer(); + ~CPython3Initializer(); + bool isPython3Available() const { return m_pythonAvailable; } +private: +#ifdef TARGET_OS_Windows + static bool checkPython3Path(); +#endif + // PyThreadState *m_pMainPyThreadState; + bool m_pythonAvailable; +}; + +#ifdef TARGET_OS_Windows +bool CPython3Initializer::checkPython3Path() +{ + std::wstring ws(Py_GetPath()); + std::string path(ws.begin(), ws.end()); + + size_t found = path.find_first_of(';'); + while (found != std::string::npos) + { + if (found > 0) + { + std::string filename = path.substr(0, found); + const bool exists = (_access(filename.c_str(), 0) == 0); + if (exists) { return true; } + } + path = path.substr(found + 1); + found = path.find_first_of(';'); + } + + std::cout << "Python directory not found. You probably have a corrupted python installation!" << std::endl; + std::cout << "The tried path from Py_GetPath() was [" << Py_GetPath() << "]\n"; + + return false; +} +#endif + +CPython3Initializer::CPython3Initializer() : m_pythonAvailable(false) +{ +#ifdef TARGET_OS_Windows + __try + { + // We do not care about the last file, since it is the OpenViBE runtime path + if (!Py_IsInitialized() && checkPython3Path()) + { + Py_Initialize(); + m_pythonAvailable = true; + } + } + __except (EXCEPTION_EXECUTE_HANDLER) { } +#else + if (!Py_IsInitialized()) + { + Py_Initialize(); + m_pythonAvailable = true; + } +#endif +} + +CPython3Initializer::~CPython3Initializer() +{ + if (m_pythonAvailable) + { + m_pythonAvailable = false; + Py_Finalize(); + } +} +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +namespace OpenViBE { +namespace Plugins { +namespace Python { + +OVP_Declare_Begin() + static CPython3Initializer python3Init; + if (python3Init.isPython3Available()) { OVP_Declare_New(CBoxAlgorithmPython3Desc); } +OVP_Declare_End() + +} // namespace Python +} // namespace Plugins +} // namespace OpenViBE +//------------------------------------------------------------------------------------------------- + +#else +#pragma message ("WARNING: Python 3.x headers are required to build the Python plugin, different includes found, skipped") +#endif // #if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 2) +#endif // TARGET_HAS_ThirdPartyPython3 diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/CMakeLists.txt new file mode 100644 index 0000000..4c9584f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/CMakeLists.txt @@ -0,0 +1,32 @@ +PROJECT(openvibe-plugins-contrib-signal-processing) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# ----------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +# INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyITPP") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) +INSTALL(DIRECTORY metaboxes DESTINATION ${DIST_DATADIR}/openvibe/) diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/box-tutorials/fft-decomposition.xml b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/box-tutorials/fft-decomposition.xml new file mode 100644 index 0000000..09451db --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/box-tutorials/fft-decomposition.xml @@ -0,0 +1,790 @@ + + 1 + OpenVIBE + 2.0 + + + + + + (0x000002df, 0x00004ca1) + Reconstructed + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560.000000 + + + (0x207c9054, 0x3c841b63) + 800.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000005e4, 0x00006597) + Amplitude + (0x7b0ddb65, 0xfdc51488) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 560 + + + (0x4e7b798a, 0x183beafb) + (0xafb1edd5, 0x68e1da05) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000009d1, 0x00005baa) + Sinus oscillator + (0x7e33bdb8, 0x68194a4a) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 1 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 256 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 128 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x207c9054, 0x3c841b63) + 768.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x013a1c38) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00000d81, 0x00006768) + IFFT box + (0xd533e997, 0x4afd2423) + + + (0x1f261c0a, 0x593bf6bd) + real part + + + (0x1f261c0a, 0x593bf6bd) + imaginary part + + + + + (0x5ba36127, 0x195feae1) + Signal output + + + + + (0x1fa7a38f, 0x54edbe0b) + 464.000000 + + + (0x207c9054, 0x3c841b63) + 784.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9e5c01e9, 0xe6051e24) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x378ea7ca) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00002fc6, 0x000073a3) + Phase + (0x7b0ddb65, 0xfdc51488) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0xafb1edd5, 0x68e1da05) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004b02, 0x00001fdd) + Spectral analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imag Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256.000000 + + + (0x207c9054, 0x3c841b63) + 768.000000 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x3a916194) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000051d7, 0x00000db5) + Original + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256.000000 + + + (0x207c9054, 0x3c841b63) + 576.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + + + (0x000011ae, 0x00002344) + + (0x00004b02, 0x00001fdd) + 1 + + + (0x00002fc6, 0x000073a3) + 0 + + + + (0x00002717, 0x00002653) + + (0x00004b02, 0x00001fdd) + 2 + + + (0x00000d81, 0x00006768) + 0 + + + + (0x00003b98, 0x00007502) + + (0x00004b02, 0x00001fdd) + 3 + + + (0x00000d81, 0x00006768) + 1 + + + + (0x0000501d, 0x0000052c) + + (0x000009d1, 0x00005baa) + 0 + + + (0x00004b02, 0x00001fdd) + 0 + + + + (0x000063c7, 0x00005015) + + (0x00000d81, 0x00006768) + 0 + + + (0x000002df, 0x00004ca1) + 0 + + + + (0x0000688a, 0x00001068) + + (0x000009d1, 0x00005baa) + 0 + + + (0x000051d7, 0x00000db5) + 0 + + + + (0x00006c16, 0x00004c37) + + (0x00004b02, 0x00001fdd) + 0 + + + (0x000005e4, 0x00006597) + 0 + + + + + + (0x00002920, 0x00007fea) + The reconstructed signal should +equal the original one + + + + (0x473d9a43, 0x97fc0a97) + 1104.000000 + + + (0x7234b86b, 0x2b8651a5) + 498.000000 + + + + + (0x00006544, 0x00006793) + A signal is decomposed by Fast Fourier Transform + + + (0x473d9a43, 0x97fc0a97) + 1104.000000 + + + (0x7234b86b, 0x2b8651a5) + 256.000000 + + + + + (0x00006c55, 0x00000be7) + At this stage the signals are in Fourier space +transmitted in the Spectrum stream format using +one stream for real and one for imaginary part + + + (0x473d9a43, 0x97fc0a97) + 1104.000000 + + + (0x7234b86b, 0x2b8651a5) + 377.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00003f5d, 0x000063e0)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":475},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000498b, 0x00003981)","index":0,"name":"Default tab","parentIdentifier":"(0x00003f5d, 0x000063e0)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":228,"identifier":"(0x00007431, 0x00007d23)","index":0,"maxDividerPosition":275,"name":"Vertical split","parentIdentifier":"(0x0000498b, 0x00003981)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":158,"identifier":"(0x000025c1, 0x00006774)","index":0,"maxDividerPosition":212,"name":"Vertical split","parentIdentifier":"(0x00007431, 0x00007d23)","type":4},{"boxIdentifier":"(0x000002df, 0x00004ca1)","childCount":0,"identifier":"(0x0000293c, 0x000050be)","index":1,"parentIdentifier":"(0x00007431, 0x00007d23)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":69,"identifier":"(0x00007b2e, 0x00005e1f)","index":0,"maxDividerPosition":142,"name":"Vertical split","parentIdentifier":"(0x000025c1, 0x00006774)","type":4},{"boxIdentifier":"(0x00002fc6, 0x000073a3)","childCount":0,"identifier":"(0x00001fb9, 0x00004ce1)","index":1,"parentIdentifier":"(0x000025c1, 0x00006774)","type":3},{"boxIdentifier":"(0x000051d7, 0x00000db5)","childCount":0,"identifier":"(0x00007d91, 0x0000288c)","index":0,"parentIdentifier":"(0x00007b2e, 0x00005e1f)","type":3},{"boxIdentifier":"(0x000005e4, 0x00006597)","childCount":0,"identifier":"(0x00001fb4, 0x0000332d)","index":1,"parentIdentifier":"(0x00007b2e, 0x00005e1f)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren / Inria + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + FFT Decomposition + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/box-tutorials/ica-decomposition.xml b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/box-tutorials/ica-decomposition.xml new file mode 100644 index 0000000..910dea0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/box-tutorials/ica-decomposition.xml @@ -0,0 +1,1205 @@ + + 2 + OpenViBE Designer + 2.1.0 + + + + + + (0x000002c2, 0x000010cf) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + a-b + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 126 + + + (0x207c9054, 0x3c841b63) + 512 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0a37d63b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000e3b, 0x00000dfb) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(a*M_PI) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05b2e606) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001949, 0x000019d7) + Separated signals + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Global + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 353 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01fa2453) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000022bb, 0x0000076d) + Independent Component Analysis (FastICA) + (0x00649b6e, 0x6c88cd17) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Number of components to extract + 14 + 2 + false + + + (0x43a71032, 0x4af96b9f) + Operating mode + ICA + ICA + false + + + (0x007deef9, 0x2f3e95c6) + Sample size (seconds) for estimation + 120 + 10 + false + + + (0x7b876033, 0x13590b93) + Decomposition type + Symmetric + Symmetric + false + + + (0x007deef9, 0x2f3e95c6) + Max number of reps for the ICA convergence + 100000 + 100000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Fine tuning + true + true + false + + + (0x007deef9, 0x2f3e95c6) + Max number of reps for the fine tuning + 100 + 100 + false + + + (0x4313472f, 0x37fd5961) + Used nonlinearity + Tanh + Tanh + false + + + (0x512a166f, 0x5c3ef83f) + Internal Mu parameter for FastICA + 1.0 + 1.0 + false + + + (0x512a166f, 0x5c3ef83f) + Internal Epsilon parameter for FastICA + 0.0001 + 0.0001 + false + + + (0x330306dd, 0x74a95f98) + Spatial filter filename + + + false + + + (0x2cdb2f0b, 0x12f231ea) + Save the spatial filter/demixing matrix + true + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0xa3cf700a, 0x9631c4b2) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x06f2dd0a) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 12 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000023e1, 0x00003233) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x016ecb8e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x0000407c, 0x0000154c) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x027477c8) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004ae9, 0x00004c23) + Mixed signals + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + None + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 3 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 560 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x022ce260) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000057be, 0x000077ee) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 1 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 512 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01a15ab2) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x000062c2, 0x000019ee) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01c539ea) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006d6f, 0x00004247) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + a+b + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01cc3fec) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000077b4, 0x00007f7a) + Original signals + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + None + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 3 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0279c0ab) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + + + (0x00000146, 0x00006a5c) + + (0x000057be, 0x000077ee) + 0 + + + (0x000002c2, 0x000010cf) + 1 + + + + (0x000008b0, 0x00000ec0) + + (0x00006d6f, 0x00004247) + 0 + + + (0x000062c2, 0x000019ee) + 0 + + + + (0x00001018, 0x00002660) + + (0x000023e1, 0x00003233) + 0 + + + (0x00000e3b, 0x00000dfb) + 0 + + + + (0x00001bf2, 0x00007bc9) + + (0x00000e3b, 0x00000dfb) + 0 + + + (0x000002c2, 0x000010cf) + 0 + + + + (0x00002cee, 0x00002f38) + + (0x000057be, 0x000077ee) + 0 + + + (0x0000407c, 0x0000154c) + 1 + + + + (0x0000391d, 0x00006632) + + (0x000022bb, 0x0000076d) + 0 + + + (0x00001949, 0x000019d7) + 0 + + + + (0x00003dc6, 0x00004982) + + (0x000062c2, 0x000019ee) + 0 + + + (0x00004ae9, 0x00004c23) + 0 + + + + (0x00003f6f, 0x00005f18) + + (0x000002c2, 0x000010cf) + 0 + + + (0x000062c2, 0x000019ee) + 1 + + + + (0x000049a3, 0x00005261) + + (0x00000e3b, 0x00000dfb) + 0 + + + (0x0000407c, 0x0000154c) + 0 + + + + (0x00005a44, 0x000004b2) + + (0x00000e3b, 0x00000dfb) + 0 + + + (0x00006d6f, 0x00004247) + 0 + + + + (0x000076f8, 0x000056b6) + + (0x0000407c, 0x0000154c) + 0 + + + (0x000077b4, 0x00007f7a) + 0 + + + + (0x00007c09, 0x000007c9) + + (0x000057be, 0x000077ee) + 0 + + + (0x00006d6f, 0x00004247) + 1 + + + + (0x00007d56, 0x00004c14) + + (0x000062c2, 0x000019ee) + 0 + + + (0x000022bb, 0x0000076d) + 0 + + + + + + (0x00003676, 0x000038af) + The last display changes as the Signal Display autoscaling +reacts to the changed dynamic range of the input. +The other two displays are configured to fixed scale. + + + (0x473d9a43, 0x97fc0a97) + 768.000000 + + + (0x7234b86b, 0x2b8651a5) + 416.000000 + + + + + (0x000054ad, 0x00003107) + Note that the ICA will output the +channels as-are before the model is +estimated (10 seconds in this case). +If you wish to decompose +your whole signal, store the decomposition +matrix from the ICA and use it in another +scenario with the spatial filter box. + + + (0x473d9a43, 0x97fc0a97) + 816.000000 + + + (0x7234b86b, 0x2b8651a5) + 304.000000 + + + + + (0x00006e20, 0x00006033) + ICA decomposition example + +The scenario produces uniform random noise +signal and a low-frequency sine wave signal. +These are combined as a+b and a-b to form +two mixed channels. + +This signal is then decomposed by <i><b>FastICA</b></i>, +result visible after 10s. + +The ICA box first collects 10s of data, then estimates +the decomposition, which is subsequently used +on the incoming signal. + + + (0x473d9a43, 0x97fc0a97) + 784.000000 + + + (0x7234b86b, 0x2b8651a5) + 112.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":617,"identifier":"(0x00001636, 0x00004aa8)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":721},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003700, 0x00007fe0)","index":0,"name":"Default tab","parentIdentifier":"(0x00001636, 0x00004aa8)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":433,"identifier":"(0x00004625, 0x000025fb)","index":0,"maxDividerPosition":572,"name":"Vertical split","parentIdentifier":"(0x00003700, 0x00007fe0)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":206,"identifier":"(0x00000ab1, 0x00005ed8)","index":0,"maxDividerPosition":417,"name":"Vertical split","parentIdentifier":"(0x00004625, 0x000025fb)","type":4},{"boxIdentifier":"(0x00001949, 0x000019d7)","childCount":0,"identifier":"(0x00000205, 0x00002fe1)","index":1,"parentIdentifier":"(0x00004625, 0x000025fb)","type":3},{"boxIdentifier":"(0x000077b4, 0x00007f7a)","childCount":0,"identifier":"(0x000017f0, 0x00003d29)","index":0,"parentIdentifier":"(0x00000ab1, 0x00005ed8)","type":3},{"boxIdentifier":"(0x00004ae9, 0x00004c23)","childCount":0,"identifier":"(0x0000389c, 0x00003aae)","index":1,"parentIdentifier":"(0x00000ab1, 0x00005ed8)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + ICA example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/box-tutorials/pca-decomposition.xml b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/box-tutorials/pca-decomposition.xml new file mode 100644 index 0000000..b4c8b1f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/box-tutorials/pca-decomposition.xml @@ -0,0 +1,1241 @@ + + 2 + OpenViBE Designer + 2.1.0 + + + + + + (0x0000038e, 0x00002205) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0104f0d3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x0000038e, 0x00002206) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 272 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0108b15a) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00000e3b, 0x00000dfd) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + 1*(x-0.5) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 144 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x04fce871) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000e3b, 0x00000dfe) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + 0.5*sin(a*M_PI*1+1) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 415 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02196a63) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000e3b, 0x00000dff) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + 2*sin(a*M_PI*17) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0315de65) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001949, 0x000019d7) + Principal components + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Global + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 3 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0393c956) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000057be, 0x000077ef) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 1 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 112 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0139549a) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x00005831, 0x00005020) + Mixer + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0.25;-0.3;0.4;1;-0.8;0.7;-0.4;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 3 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 3 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0497ca19) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005cee, 0x00000ae4) + PCA + (0x00649b6e, 0x6c88cd17) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x007deef9, 0x2f3e95c6) + Number of components to extract + 14 + 3 + false + + + (0x43a71032, 0x4af96b9f) + Operating mode + ICA + PCA + false + + + (0x007deef9, 0x2f3e95c6) + Sample size (seconds) for estimation + 120 + 10 + false + + + (0x7b876033, 0x13590b93) + Decomposition type + Symmetric + Symmetric + false + + + (0x007deef9, 0x2f3e95c6) + Max number of reps for the ICA convergence + 100000 + 100000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Fine tuning + true + true + false + + + (0x007deef9, 0x2f3e95c6) + Max number of reps for the fine tuning + 100 + 100 + false + + + (0x4313472f, 0x37fd5961) + Used nonlinearity + Tanh + Tanh + false + + + (0x512a166f, 0x5c3ef83f) + Internal Mu parameter for FastICA + 1.0 + 1.0 + false + + + (0x512a166f, 0x5c3ef83f) + Internal Epsilon parameter for FastICA + 0.0001 + 0.0001 + false + + + (0x330306dd, 0x74a95f98) + Spatial filter filename + + + false + + + (0x2cdb2f0b, 0x12f231ea) + Save the spatial filter/demixing matrix + true + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0xa3cf700a, 0x9631c4b2) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05d61b69) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 12 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000062c2, 0x000019ee) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + (0x5ba36127, 0x195feae1) + Input 3 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 224 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x081cdda3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000077b4, 0x00007f7a) + Original signals + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Global + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 3 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 112 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01b7faf6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000077b4, 0x00007f7b) + Mixed signals + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Global + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 3 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0201ce50) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + + + (0x0000088e, 0x0000440e) + + (0x00005831, 0x00005020) + 0 + + + (0x00005cee, 0x00000ae4) + 0 + + + + (0x0000194f, 0x00006c7a) + + (0x00000e3b, 0x00000dff) + 0 + + + (0x000062c2, 0x000019ee) + 1 + + + + (0x00001e1d, 0x00006425) + + (0x00000e3b, 0x00000dfe) + 0 + + + (0x000062c2, 0x000019ee) + 2 + + + + (0x00002d69, 0x00000cc5) + + (0x000057be, 0x000077ef) + 0 + + + (0x00000e3b, 0x00000dfd) + 0 + + + + (0x00004a43, 0x0000497e) + + (0x000062c2, 0x000019ee) + 0 + + + (0x00005831, 0x00005020) + 0 + + + + (0x00004de1, 0x00000b9d) + + (0x00005831, 0x00005020) + 0 + + + (0x000077b4, 0x00007f7b) + 0 + + + + (0x00005b0d, 0x00002ad1) + + (0x00005cee, 0x00000ae4) + 0 + + + (0x00001949, 0x000019d7) + 0 + + + + (0x00005cc7, 0x00004a52) + + (0x000062c2, 0x000019ee) + 0 + + + (0x000077b4, 0x00007f7a) + 0 + + + + (0x00005efb, 0x000029c8) + + (0x0000038e, 0x00002205) + 0 + + + (0x00000e3b, 0x00000dfe) + 0 + + + + (0x00005efb, 0x000029c9) + + (0x0000038e, 0x00002206) + 0 + + + (0x00000e3b, 0x00000dff) + 0 + + + + (0x000069cd, 0x00005502) + + (0x00000e3b, 0x00000dfd) + 0 + + + (0x000062c2, 0x000019ee) + 0 + + + + + + (0x00006e20, 0x00006033) + PCA decomposition example + +In the source, the channels have non-ordered, uneven variances. + +The channels are then blended by the mixer. + +This signal is then decomposed by +<i><b>Principal Components Analysis</b></i> +as provided by the FastICA box. + +In the PCA result, the channels should have +increasing variance, visible after 10s. + +If the transform is changed to Whiten (not shown) +the PCA channels will be scaled to equal variance. +Its sometimes said the data is 'sphered' and 'decorrelated'. + +Observe that the transform does not recover the +original channels exactly, although there is some resemblance +(visible if you change the display scaling to 'Per Channel'). + + + (0x473d9a43, 0x97fc0a97) + 704.000000 + + + (0x7234b86b, 0x2b8651a5) + 95.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":617,"identifier":"(0x00001636, 0x00004aa8)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":711},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003700, 0x00007fe0)","index":0,"name":"Default tab","parentIdentifier":"(0x00001636, 0x00004aa8)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":435,"identifier":"(0x00004625, 0x000025fb)","index":0,"maxDividerPosition":574,"name":"Vertical split","parentIdentifier":"(0x00003700, 0x00007fe0)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":207,"identifier":"(0x00005fd9, 0x00003e96)","index":0,"maxDividerPosition":419,"name":"Vertical split","parentIdentifier":"(0x00004625, 0x000025fb)","type":4},{"boxIdentifier":"(0x00001949, 0x000019d7)","childCount":0,"identifier":"(0x00000205, 0x00002fe1)","index":1,"parentIdentifier":"(0x00004625, 0x000025fb)","type":3},{"boxIdentifier":"(0x000077b4, 0x00007f7a)","childCount":0,"identifier":"(0x000017f0, 0x00003d29)","index":0,"parentIdentifier":"(0x00005fd9, 0x00003e96)","type":3},{"boxIdentifier":"(0x000077b4, 0x00007f7b)","childCount":0,"identifier":"(0x00003ebb, 0x00001557)","index":1,"parentIdentifier":"(0x00005fd9, 0x00003e96)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + PCA example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_CSPSpatialFilterTrainer.dox-part b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_CSPSpatialFilterTrainer.dox-part new file mode 100644 index 0000000..932d192 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_CSPSpatialFilterTrainer.dox-part @@ -0,0 +1,93 @@ +/** + * \page BoxAlgorithm_CSPSpatialFilterTrainer CSP Spatial Filter Trainer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Description| + + This box computes spatial filters according to the Common Spatial Pattern algorithm. The goal of the algorithm is to improve the discrimination of two types of signals. + The spatial filters are constructed in a way they maximize the variance for signals of the first condition while at the same time they minimize it for the second condition. + This can be used for discriminating the signals of two commonly used motor-imagery tasks (e.g. left versus right hand movement). + It can also be used for two-class SSVEP experiments or any other experiment where the discriminative information is contained in the variance (or power in a certain band) of the signal conditions. + + Please note that this implementation computes a trace normalization. + + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Inputs| + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Input1| + This stimulus input is needed to indicate the end of a recording session (or end of file). It then triggers the training/computation of the CSP filters. + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Input1| + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Input2| + This input expects epoched data for the first condition (e.g. epochs for left hand motor imagery). + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Input2| + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Input3| + This input expects epoched data for the second condition (e.g. epochs for right hand motor imagery). + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Input3| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Outputs| + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Output1| + The CSP Trainer outputs the stimulation OVTK_StimulationId_TrainCompleted when the training process was successful. No output is produced if the process failed. + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Settings| + + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Settings| + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Setting1| + This should contain the stimulus identifier denoting the end of a recording session or end of file, e.g. OVTK_GDF_End_Of_Session or OVTK_StimulationId_ExperimentStop. + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Setting2| + This setting contains the path and filename of the configuration file in which the computed spatial filters are saved. + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Setting3| + Here you need to determine how many spatial filters will be computed (default value is two). + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Setting4| + If true, the output file will be a box configuration XML. Otherwise it will be a text format matrix. + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Setting4| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Examples| + Before training the spatial filter you should first filter the data with respect to the desired band (e.g. for motor imagery, certain people display good results in a narrow pass-band of 8-12Hz, others in 8-30Hz). + As in the example scenario below, one could also opt for different pass-bands and compute filters in each of them, finally letting the subsequently trained classifier decide which features are important. + + \image html csp_training.png "Example scenario to compute CSP filters" + + Once the spatial filters are computed and saved in the configuration file, you will need to load it into the \ref Doc_BoxAlgorithm_SpatialFilter "Spatial Filter" box. + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Miscellaneous| + For the moment it is only implemented for two classes. Multiple classes can be supported in the future according to an all-versus-one scheme or through joint diagonalization. + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Downsampling.dox-part b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Downsampling.dox-part new file mode 100644 index 0000000..b0c8ee6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Downsampling.dox-part @@ -0,0 +1,91 @@ +/** + * \page BoxAlgorithm_Downsampling Downsampling - +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Downsampling_Description| + * + * NOTE: This box has been deprecated. Please use + * Signal Resampling box instead. + * + * This plugin is used to downsample the input signal. First, a + * low-pass filter is applied to the input signal for anti-aliasing. + * Then, the input signal is downsampled at the new sampling rate. + * This plugin allows the selection of the kind of filter (Butterworth + * or Chebyshev), the new sampling rate and the frequency + * cutoff for the filter. + * + * |OVP_DocEnd_BoxAlgorithm_Downsampling_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Downsampling_Inputs| + * |OVP_DocEnd_BoxAlgorithm_Downsampling_Inputs| + * + * |OVP_DocBegin_BoxAlgorithm_Downsampling_Input1| + * The input signal. + * |OVP_DocEnd_BoxAlgorithm_Downsampling_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Downsampling_Outputs| + * |OVP_DocEnd_BoxAlgorithm_Downsampling_Outputs| + * + * |OVP_DocBegin_BoxAlgorithm_Downsampling_Output1| + * |OVP_DocEnd_BoxAlgorithm_Downsampling_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Downsampling_Settings| + * |OVP_DocEnd_BoxAlgorithm_Downsampling_Settings| + * + * |OVP_DocBegin_BoxAlgorithm_Downsampling_Setting1| + * New sampling rate in Hz chosen to downsample the input signal. + * |OVP_DocEnd_BoxAlgorithm_Downsampling_Setting1| + * + * |OVP_DocBegin_BoxAlgorithm_Downsampling_Setting2| + * Select the frequency cutoff of the low-pass filter as a ratio (1/2, + * 1/3 or 1/4) of the new sampling rate. + * |OVP_DocEnd_BoxAlgorithm_Downsampling_Setting2| + * + * |OVP_DocBegin_BoxAlgorithm_Downsampling_Setting3| + * Select the kind of filter between Butterworth and Chebyshev. + * |OVP_DocEnd_BoxAlgorithm_Downsampling_Setting3| + * + * |OVP_DocBegin_BoxAlgorithm_Downsampling_Setting4| + * Order of the low-pass filter. + * |OVP_DocEnd_BoxAlgorithm_Downsampling_Setting4| + * + * |OVP_DocBegin_BoxAlgorithm_Downsampling_Setting5| + * If Chebyshev filter is selected, PassBand Ripple is a necessary info. + * |OVP_DocEnd_BoxAlgorithm_Downsampling_Setting5| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Downsampling_Examples| + * Let's consider our input signal sampling rate is 1 kHz. + * If the new selected sampling rate is 200 Hz and the Frequency + * cutoff ratio is 1/4, then a low-pass filter (with frequency + * cutoff equal to 200*1/4 = 50 Hz) is applied before downsampling + * at 200 Hz. + * |OVP_DocEnd_BoxAlgorithm_Downsampling_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Downsampling_Miscellaneous| + * This plugin downsamples the input signal and previously realizes + * an anti-aliasing filtering. + * |OVP_DocEnd_BoxAlgorithm_Downsampling_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_IndependentComponentAnalysisFastICA.dox-part b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_IndependentComponentAnalysisFastICA.dox-part new file mode 100644 index 0000000..1b460ea --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_IndependentComponentAnalysisFastICA.dox-part @@ -0,0 +1,129 @@ +/** + * \page BoxAlgorithm_IndependentComponentAnalysisFastICA Independent Component Analysis (FastICA) +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Description| + * This box attempts to find a decomposition of the signal to its + * independent components. The approach is based on the FastICA algorithm. + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Inputs| + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Inputs| + * + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Input1| + * The input signal. + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Outputs| + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Outputs| + * + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Output1| + * The decomposed signal. + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Settings| + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Settings| + * + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting1| + * Number of independent components to extract (equals PCA dimension reduction) + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting1| + * + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting2| + * Which decomposition is desired? + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting2| + * + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting3| + * How many seconds of sample to collect to estimate the ICA model? + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting3| + * + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting4| + * Decomposition type. Deflation is an approach where each component is + * estimated separately in turns. Symmetric estimation optimizes all + * components at once. + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting4| + * + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting5| + * Maximum number of iterations + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting5| + * + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting6| + * Enable fine tuning? + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting6| + * + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting7| + * Maximum number of iterations for the fine tuning + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting7| + * + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting8| + * Used nonlinearity type + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting8| + * + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting9| + * Mu parameter + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting9| + * + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting10| + * Epsilon parameter + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting10| + * + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting11| + * Filename to save the estimated decomposition matrix W to + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting11| + * + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting12| + * Should the matrix W be saved to a file? + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Setting12| + * + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Settings| + + +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Examples| + * One use-case of ICA is to attempt to separate the signal of interest from + * nuisance artifacts. For example, supposing that ICA makes a meaningful decomposition + * of your EEG signal, you will see artifacts such as those from eyeblinks more + * clearly segregated to specific output channels instead of contaminating + * all of the channels. + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_IndependentComponentAnalysisFastICA_Miscellaneous| + * This plugin applies the FastICA algorithm to the input signal. The box can store the + * estimated decomposition matrix W to a file. This file can then be used later + * in the spatial filter box to apply the decomposition on fresh data. + * + * The box also outputs the decomposed signal, but the decomposition is active only + * after the model has been estimated (after the specified number of samples have been collected). + * If you wish to decompose the whole data, then you can first train the ICA model, save the matrix, + * and then separately apply it to the original data with the spatial filter. + * + * The FastICA algorithm is described in + * + * A. Hyvrinen. "Fast and Robust Fixed-Point Algorithms for Independent Component Analysis", IEEE Transactions on Neural Networks 10(3):626-634, 1999. + * + * The implementation used by the box is from the ITPP toolkit. + * + * |OVP_DocEnd_BoxAlgorithm_IndependentComponentAnalysisFastICA_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Min_MaxDetection.dox-part b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Min_MaxDetection.dox-part new file mode 100644 index 0000000..6903176 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Min_MaxDetection.dox-part @@ -0,0 +1,71 @@ +/** + * \page BoxAlgorithm_Min_MaxDetection Min/Max detection - +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Min_MaxDetection_Description| + * This plugin is used to detect the minimum or the maximum value between + * 2 dates. This plugin allows the selection of the minimum or the maximum + * value to detect and the time start and time stop in between you are looking at. + * |OVP_DocEnd_BoxAlgorithm_Min_MaxDetection_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Min_MaxDetection_Inputs| + * |OVP_DocEnd_BoxAlgorithm_Min_MaxDetection_Inputs| + * + * |OVP_DocBegin_BoxAlgorithm_Min_MaxDetection_Input1| + * The input signal. + * |OVP_DocEnd_BoxAlgorithm_Min_MaxDetection_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Min_MaxDetection_Outputs| + * |OVP_DocEnd_BoxAlgorithm_Min_MaxDetection_Outputs| + * + * |OVP_DocBegin_BoxAlgorithm_Min_MaxDetection_Output1| + * |OVP_DocEnd_BoxAlgorithm_Min_MaxDetection_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Min_MaxDetection_Settings| + * |OVP_DocEnd_BoxAlgorithm_Min_MaxDetection_Settings| + * + * |OVP_DocBegin_BoxAlgorithm_Min_MaxDetection_Setting1| + * Select if you want to detect the Min or the Max. + * |OVP_DocEnd_BoxAlgorithm_Min_MaxDetection_Setting1| + * + * |OVP_DocBegin_BoxAlgorithm_Min_MaxDetection_Setting2| + * Starting time the algorithm will search the Min/Max value. + * |OVP_DocEnd_BoxAlgorithm_Min_MaxDetection_Setting2| + * + * |OVP_DocBegin_BoxAlgorithm_Min_MaxDetection_Setting3| + * Ending time the algorithm will search the Min/Max value. + * |OVP_DocEnd_BoxAlgorithm_Min_MaxDetection_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Min_MaxDetection_Examples| + * Let's consider our input signal is an ERP. + * To detect the P300 ERP, select Max value and a Time Window Start equal + * to 250 ms and a Time Window End equal to 450 ms. + * |OVP_DocEnd_BoxAlgorithm_Min_MaxDetection_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Min_MaxDetection_Miscellaneous| + * This plugin detects the minimum or the maximum value in a time window interval. + * |OVP_DocEnd_BoxAlgorithm_Min_MaxDetection_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ModifiableTemporalFilter.dox-part b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ModifiableTemporalFilter.dox-part new file mode 100644 index 0000000..b32bb45 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ModifiableTemporalFilter.dox-part @@ -0,0 +1,86 @@ +/** + * \page BoxAlgorithm_ModifiableTemporalFilter Modifiable Temporal filter - +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ModifiableTemporalFilter_Description| + * This plugin is used to filter the input signal. This plugin allows + * the selection of the kind of filter (Butterworth or Chebyshev), + * the kind of filter (low pass, high pass, band pass, band stop), the low + * or/and the high passband edge and the passband ripple for the Chebyshev filter. + * This box is a duplicate of the Temporal Filter box with all its settings marked as modifiable. + * Each time a setting changes, the box recompute the filter coefficients accordingly. + * |OVP_DocEnd_BoxAlgorithm_ModifiableTemporalFilter_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ModifiableTemporalFilter_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ModifiableTemporalFilter_Inputs| + * + * |OVP_DocBegin_BoxAlgorithm_ModifiableTemporalFilter_Input1| + * The input signal. + * |OVP_DocEnd_BoxAlgorithm_ModifiableTemporalFilter_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ModifiableTemporalFilter_Outputs| + * |OVP_DocEnd_BoxAlgorithm_ModifiableTemporalFilter_Outputs| + * + * |OVP_DocBegin_BoxAlgorithm_ModifiableTemporalFilter_Output1| + * |OVP_DocEnd_BoxAlgorithm_ModifiableTemporalFilter_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ModifiableTemporalFilter_Settings| + * |OVP_DocEnd_BoxAlgorithm_ModifiableTemporalFilter_Settings| + * + * |OVP_DocBegin_BoxAlgorithm_ModifiableTemporalFilter_Setting1| + * Select the name of filter between Butterworth and Chebyshev. Modifiable online. + * |OVP_DocEnd_BoxAlgorithm_ModifiableTemporalFilter_Setting1| + * + * |OVP_DocBegin_BoxAlgorithm_ModifiableTemporalFilter_Setting2| + * Select the kind of filter between Low pass, High pass, Band pass, Band stop. Modifiable online. + * |OVP_DocEnd_BoxAlgorithm_ModifiableTemporalFilter_Setting2| + * + * |OVP_DocBegin_BoxAlgorithm_ModifiableTemporalFilter_Setting3| + * Order of the low-pass filter. Modifiable online. + * |OVP_DocEnd_BoxAlgorithm_ModifiableTemporalFilter_Setting3| + * + * |OVP_DocBegin_BoxAlgorithm_ModifiableTemporalFilter_Setting4| + * Low edge for High pass, Band pass and Band stop filters. Modifiable online. + * |OVP_DocEnd_BoxAlgorithm_ModifiableTemporalFilter_Setting4| + * + * |OVP_DocBegin_BoxAlgorithm_ModifiableTemporalFilter_Setting5| + * High edge for Low pass, Band pass and Band stop filters. Modifiable online. + * |OVP_DocEnd_BoxAlgorithm_ModifiableTemporalFilter_Setting5| + * + * |OVP_DocBegin_BoxAlgorithm_ModifiableTemporalFilter_Setting6| + * If Chebyshev filter is selected, PassBand Ripple is a necessary info. Modifiable online. + * |OVP_DocEnd_BoxAlgorithm_ModifiableTemporalFilter_Setting6| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ModifiableTemporalFilter_Examples| + * Let's consider our input signal is very noisy (50 Hz). + * To filter this signal, select a Low pass Butterworth filter of 4th + * order and High PassBand Edge equal to 30 Hz for example. + * |OVP_DocEnd_BoxAlgorithm_ModifiableTemporalFilter_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ModifiableTemporalFilter_Miscellaneous| + * This plugin filters the input signal. Several filtering are available. + * |OVP_DocEnd_BoxAlgorithm_ModifiableTemporalFilter_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib.dox-part b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib.dox-part new file mode 100644 index 0000000..f7d3800 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib.dox-part @@ -0,0 +1,75 @@ +/** + * \page BoxAlgorithm_SpectralAnalysisFFTINSERMContrib Spectral analysis - +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Description| + The Spectral Analysis box performs spectrum computations on incoming signals and possible outputs include the spectrum amplitude (the power of the signal in a number of frequency bands), as well as its phase, real part and imaginary part. Output computations may be enabled/disabled from the settings dialog box. The analysis is performed using a Fast Fourier Transform . + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Inputs| + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Input1| +The input signal. + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Outputs| + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Output1| +Amplitude of input signal in frequency bands. + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Output1| + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Output2| +Phase of input signal + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Output2| + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Output3| +Real part of input signal + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Output3| + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Output4| +Imaginary part of input signal + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Output4| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Settings| + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Settings| + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Setting1| + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Examples| +Practical example : visualizing the power spectrum of a signal. + + Let's use a Signal Oscillator box to generator sinusoidal signals on one channel. Next we add a Spectral Analysis box and connect boxes together. We make sure the 'Amplitude' of the signal is computed by checking the appropriate setting in the settings dialog box (see image below). Finally, we connect the 'Amplitude' output connector of the Spectral Analysis box to the input connector of a Power Spectrum Display box. The player may now be launched to visualize the power spectrum of the signal. + + \image html SpectralAnalysisFFTINSERMContrib_online.png "Visualizing the power spectrum of sinusoidal signals." + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysisFFTINSERMContrib_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_TemporalFilterINSERMContrib.dox-part b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_TemporalFilterINSERMContrib.dox-part new file mode 100644 index 0000000..e10d945 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_TemporalFilterINSERMContrib.dox-part @@ -0,0 +1,90 @@ +/** + * \page BoxAlgorithm_TemporalFilterINSERMContrib Temporal filter - +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilterINSERMContrib_Description| + * This plugin is used to filter the input signal. This plugin allows + * the selection of the kind of filter (Butterworth or Chebyshev), + * the kind of filter (low pass, high pass, band pass, band stop), the low + * or/and the high passband edge and the passband ripple for the Chebyshev filter. + * |OVP_DocEnd_BoxAlgorithm_TemporalFilterINSERMContrib_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilterINSERMContrib_Inputs| + * |OVP_DocEnd_BoxAlgorithm_TemporalFilterINSERMContrib_Inputs| + * + * |OVP_DocBegin_BoxAlgorithm_TemporalFilterINSERMContrib_Input1| + * The input signal. + * |OVP_DocEnd_BoxAlgorithm_TemporalFilterINSERMContrib_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilterINSERMContrib_Outputs| + * |OVP_DocEnd_BoxAlgorithm_TemporalFilterINSERMContrib_Outputs| + * + * |OVP_DocBegin_BoxAlgorithm_TemporalFilterINSERMContrib_Output1| + * |OVP_DocEnd_BoxAlgorithm_TemporalFilterINSERMContrib_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilterINSERMContrib_Settings| + * |OVP_DocEnd_BoxAlgorithm_TemporalFilterINSERMContrib_Settings| + * + * |OVP_DocBegin_BoxAlgorithm_TemporalFilterINSERMContrib_Setting1| + * Select the name of filter between Butterworth and Chebyshev. + * |OVP_DocEnd_BoxAlgorithm_TemporalFilterINSERMContrib_Setting1| + * + * |OVP_DocBegin_BoxAlgorithm_TemporalFilterINSERMContrib_Setting2| + * Select the kind of filter between Low pass, High pass, Band pass, Band stop. + * |OVP_DocEnd_BoxAlgorithm_TemporalFilterINSERMContrib_Setting2| + * + * |OVP_DocBegin_BoxAlgorithm_TemporalFilterINSERMContrib_Setting3| + * Order of the low-pass filter. + * |OVP_DocEnd_BoxAlgorithm_TemporalFilterINSERMContrib_Setting3| + * + * |OVP_DocBegin_BoxAlgorithm_TemporalFilterINSERMContrib_Setting4| + * Low edge for High pass, Band pass and Band stop filters + * |OVP_DocEnd_BoxAlgorithm_TemporalFilterINSERMContrib_Setting4| + * + * |OVP_DocBegin_BoxAlgorithm_TemporalFilterINSERMContrib_Setting5| + * High edge for Low pass, Band pass and Band stop filters + * |OVP_DocEnd_BoxAlgorithm_TemporalFilterINSERMContrib_Setting5| + * + * |OVP_DocBegin_BoxAlgorithm_TemporalFilterINSERMContrib_Setting6| + * If Chebyshev filter is selected, PassBand Ripple is a necessary info. + * |OVP_DocEnd_BoxAlgorithm_TemporalFilterINSERMContrib_Setting6| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilterINSERMContrib_Examples| + * Let's consider our input signal is very noisy (50 Hz). + * To filter this signal, select a Low pass Butterworth filter of 4th + * order and High PassBand Edge equal to 30 Hz for example. + * |OVP_DocEnd_BoxAlgorithm_TemporalFilterINSERMContrib_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilterINSERMContrib_Miscellaneous| + * This plugin filters the input signal. Several filtering are available. + * + * The box is able to use filter orders that are larger than the input chunk + * size. However, with high order filters in general, remember to check that the + * filtered output of the box remains stable and meaningful. If not, + * try decreasing the filter order. + * + * |OVP_DocEnd_BoxAlgorithm_TemporalFilterINSERMContrib_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_UnivariateStatistics.dox-part b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_UnivariateStatistics.dox-part new file mode 100644 index 0000000..1356227 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_UnivariateStatistics.dox-part @@ -0,0 +1,143 @@ +/** + * \page BoxAlgorithm_UnivariateStatistics Univariate Statistics +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Description| + * This plugin computes the mean, variance, range, median, Inter- + * Quantile-Range and Percentile of each incoming sample + * buffer (or chunk) and outputs the resulting signals. + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Inputs| + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Input1| + * The input signal. + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Outputs| + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Output1| + * Signal containing the averages of the input sample buffers. + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Output1| + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Output2| + * Signal containing the variance of the input sample buffers. + * Sample variance is a measure of the spread of or dispersion + * within a set of sample data. + * The sample variance is the sum of the squared deviations + * from their average divided by the number of observations in + * the data set. + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Output2| + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Output3| + * Signal containing the range of the input sample buffers. + * The range of a sample (or a data set) is a measure of the + * spread or the dispersion of the observations. It is the + * difference between the largest and the smallest observed + * value of some quantitative characteristic. + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Output3| + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Output4| + * Signal containing the median of the input sample buffers. + * The median is the value halfway through the ordered data + * set, below and above which there lies an equal number of + * data values. + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Output4| + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Output5| + * Signal containing the Inter-Quantile-Range of the input + * sample buffers. + * The inter-quartile range is a measure of the spread of or + * dispersion within a data set. + * It is calculated by taking the difference between the upper + * and the lower quartiles. + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Output5| + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Output6| + * Signal containing the percentile of the input sample buffers. + * Percentiles are values that divide a sample of data into one + * hundred groups containing (as far as possible) equal numbers + * of observations. For example, 30% of the data values lie below + * the 30th percentile. + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Output6| + +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Settings| + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Settings| + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Setting1| + * Mean activation. If the box is checked, the mean is computed + * and the mean output send signal + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Setting2| + * Variance activation. If the box is checked, the variance is computed + * and the variance output send signal + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Setting3| + * Range activation. If the box is checked, the range is computed + * and the range output send signal + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Setting4| + * Median activation. If the box is checked, the median is computed + * and the median output send signal + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Setting5| + * Inter-Quantile-Range (IQR) activation. If the box is checked, + * the IQR is computed and the IQR output send signal + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Setting6| + * Percentile activation. If the box is checked, the percentile + * is computed and the percentile output send signal + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Setting7| + * Percentile value. Change the percentile value for percentile + * signal output + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Setting7| + +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Examples| + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_UnivariateStatistics_Miscellaneous| + * The output signal's sample count per channel per buffer is one, + * since a buffer contains the averages (per channel) of the values + * of an input buffer. + * Be careful of Down-sampling effect for signal, the sampling rate + * at output is divided by the number of input samples. This information + * is saved on integer, so this stay true only if division is without + * fractional part (or the subsampling should be a divisor of the number + * of samples) + * http://www.stats.gla.ac.uk/steps/glossary/presenting_data.html + * |OVP_DocEnd_BoxAlgorithm_UnivariateStatistics_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_WindowingINSERMContrib.dox-part b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_WindowingINSERMContrib.dox-part new file mode 100644 index 0000000..836bbc4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_WindowingINSERMContrib.dox-part @@ -0,0 +1,66 @@ +/** + * \page BoxAlgorithm_WindowingINSERMContrib Windowing functions - +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_WindowingINSERMContrib_Description| + * This plugin is used to apply a window to the input signal. + * This plugin allows the selection of the kind of window + * (Hamming, Hanning, Hann, Blackman, Triangular, Square Root). + * |OVP_DocEnd_BoxAlgorithm_WindowingINSERMContrib_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_WindowingINSERMContrib_Inputs| + * |OVP_DocEnd_BoxAlgorithm_WindowingINSERMContrib_Inputs| + * + * |OVP_DocBegin_BoxAlgorithm_WindowingINSERMContrib_Input1| + * |OVP_DocEnd_BoxAlgorithm_WindowingINSERMContrib_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_WindowingINSERMContrib_Outputs| + * |OVP_DocEnd_BoxAlgorithm_WindowingINSERMContrib_Outputs| + * + * |OVP_DocBegin_BoxAlgorithm_WindowingINSERMContrib_Output1| + * |OVP_DocEnd_BoxAlgorithm_WindowingINSERMContrib_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_WindowingINSERMContrib_Settings| + * |OVP_DocEnd_BoxAlgorithm_WindowingINSERMContrib_Settings| + * + * |OVP_DocBegin_BoxAlgorithm_WindowingINSERMContrib_Setting1| + * Select the name of window between Hamming, Hanning, Hann, + * Blackman, Triangular and Square Root. + * |OVP_DocEnd_BoxAlgorithm_WindowingINSERMContrib_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_WindowingINSERMContrib_Examples| + * Let's consider our input signal. + * To prevent rebound in spectrum analysis due to the square root + * windowing, select a Hanning window for example. + * |OVP_DocEnd_BoxAlgorithm_WindowingINSERMContrib_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_WindowingINSERMContrib_Miscellaneous| + * This plugin applies a window (weighting function) to each of the channels of the + * input signal. Several windows are available. Note that the window is applied + * separately per each chunk and each channel. It does not 'slide' over the streaming data. + * |OVP_DocEnd_BoxAlgorithm_WindowingINSERMContrib_Miscellaneous| + */ + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/csp_training.png b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/csp_training.png new file mode 100644 index 0000000..69a4711 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/csp_training.png differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/spectralanalysisFFTINSERMContrib_online.png b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/spectralanalysisFFTINSERMContrib_online.png new file mode 100644 index 0000000..da553b9 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/doc/spectralanalysisFFTINSERMContrib_online.png differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/metaboxes/CSP-Trainer-Metabox.xml b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/metaboxes/CSP-Trainer-Metabox.xml new file mode 100644 index 0000000..79ab97a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/metaboxes/CSP-Trainer-Metabox.xml @@ -0,0 +1,675 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x53e968eb, 0x121c769a) + (0x512a166f, 0x5c3ef83f) + Low Cut Frequency + 5 + 5 + + + (0x8cad39ce, 0xdbca80d0) + (0x512a166f, 0x5c3ef83f) + High Cut Frequency + 35 + 35 + + + (0x454af4a9, 0x3e55e77a) + (0x512a166f, 0x5c3ef83f) + Epoch Duration + 4 + 4 + + + (0xbb21ad6d, 0xda6c49a5) + (0x512a166f, 0x5c3ef83f) + Epoch Offset + 0.5 + 0.5 + + + (0xc956238b, 0xf31b7a91) + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_GDF_Left + OVTK_GDF_Left + + + (0xe28ee4db, 0xb8abaac1) + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_GDF_Right + OVTK_GDF_Right + + + (0x5b25c57b, 0xbcf2329e) + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + + + (0x4c8b6ef1, 0xf834b8a0) + (0x330306dd, 0x74a95f98) + Spatial Filter Configuration + ${Player_ScenarioDirectory}/scripts/csp-spatial-filter.xml + ${Player_ScenarioDirectory}/scripts/csp-spatial-filter.xml + + + (0x2ad32f66, 0xd86a0623) + (0x007deef9, 0x2f3e95c6) + Filter Dimension + 6 + 6 + + + + + (0xe02590b0, 0x52f82985) + (0x5ba36127, 0x195feae1) + Input Signal + (0x000016d5, 0x000033f5) + 0 + + + (0x9493bcb8, 0xd8d4848f) + (0x6f752dd0, 0x082a321e) + Input Stimulations + (0x00001c84, 0x0000598b) + 0 + + + + + (0xd3d905f7, 0x2b88c1ac) + (0x6f752dd0, 0x082a321e) + Train-completed Flag + (0x00005515, 0x00006ba1) + 0 + + + + + (0x000016d5, 0x000033f5) + Temporal Filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + $var{Low Cut Frequency} + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + $var{High Cut Frequency} + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1104 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002e3671) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001aa0, 0x00005f82) + Class 1 + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + $var{Epoch Duration} + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + $var{Epoch Offset} + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + $var{Class 1} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001aa0, 0x00005f83) + Class 2 + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + $var{Epoch Duration} + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + $var{Epoch Offset} + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + $var{Class 2} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 1184 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001c84, 0x0000598b) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001c84, 0x0000598c) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005515, 0x00006ba1) + CSP Spatial Filter Trainer + (0x51db0d64, 0x2109714e) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Signal condition 1 + + + (0x5ba36127, 0x195feae1) + Signal condition 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_GDF_End_Of_Session + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Spatial filter configuration + + $var{Spatial Filter Configuration} + false + + + (0x007deef9, 0x2f3e95c6) + Filter dimension + 2 + $var{Filter Dimension} + false + + + (0x2cdb2f0b, 0x12f231ea) + Save as box config + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 1104 + + + (0x4e7b798a, 0x183beafb) + (0x4b49a133, 0x42f38d94) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002a4d2d) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + + + (0x00000c54, 0x000048d9) + + (0x00001aa0, 0x00005f82) + 0 + + + (0x00005515, 0x00006ba1) + 1 + + + + (0x00000cdf, 0x000029b9) + + (0x00001c84, 0x0000598c) + 0 + + + (0x00005515, 0x00006ba1) + 0 + + + + (0x0000104a, 0x00004869) + + (0x00001c84, 0x0000598b) + 0 + + + (0x00001aa0, 0x00005f82) + 1 + + + + (0x00001135, 0x00003548) + + (0x000016d5, 0x000033f5) + 0 + + + (0x00001aa0, 0x00005f83) + 0 + + + + (0x000015b8, 0x00000ac7) + + (0x00001c84, 0x0000598b) + 0 + + + (0x00001aa0, 0x00005f83) + 1 + + + + (0x00002287, 0x000005db) + + (0x000016d5, 0x000033f5) + 0 + + + (0x00001aa0, 0x00005f82) + 0 + + + + (0x00002d57, 0x00004b2f) + + (0x00001c84, 0x0000598b) + 0 + + + (0x00001c84, 0x0000598c) + 0 + + + + (0x00007d7b, 0x000049f7) + + (0x00001aa0, 0x00005f83) + 0 + + + (0x00005515, 0x00006ba1) + 2 + + + + + + + (0x00004fc8, 0x00005801) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00006ba8, 0x000061b1)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000023d0, 0x00003bbe)","index":0,"name":"Default tab","parentIdentifier":"(0x00006ba8, 0x000061b1)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000383b, 0x00001860)","index":0,"name":"Empty","parentIdentifier":"(0x000023d0, 0x00003bbe)","type":0}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x198dd621, 0xab7f153f) + (0x18bc5b7e, 0xe8b6d7da) + + + (0x20c6d158, 0xfe90aadd) + (0x05a13f95, 0xdfdc0e8f) + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + Add Temporal Filter (Butterworth Order 5) and separate in two class before Train + + + (0x84009d7c, 0x3c4e763b) + Make typical process before train + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + CSP Spatial Filter Trainer Metabox + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Signal processing/Filtering/ + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCAlgorithmUnivariateStatistics.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCAlgorithmUnivariateStatistics.cpp new file mode 100644 index 0000000..c2a3409 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCAlgorithmUnivariateStatistics.cpp @@ -0,0 +1,230 @@ +#include "ovpCAlgorithmUnivariateStatistics.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +// ________________________________________________________________________________________________________________ +// + +bool CAlgoUnivariateStatistic::initialize() +{ + ip_matrix.initialize(getInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_Matrix)); + op_MeanMatrix.initialize(getOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Mean)); + op_VarianceMatrix.initialize(getOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Var)); + op_RangeMatrix.initialize(getOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Range)); + op_MedianMatrix.initialize(getOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Med)); + op_IQRMatrix.initialize(getOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_IQR)); + op_PercentileMatrix.initialize(getOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Percent)); + + ip_isMeanActive.initialize(this->getInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_MeanActive)); + ip_isVarianceActive.initialize(this->getInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_VarActive)); + ip_isRangeActive.initialize(this->getInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_RangeActive)); + ip_isMedianActive.initialize(this->getInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_MedActive)); + ip_isIQRActive.initialize(this->getInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_IQRActive)); + ip_isPercentileActive.initialize(this->getInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_PercentActive)); + + ip_percentileValue.initialize(this->getInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_PercentValue)); + op_compression.initialize(this->getOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Compression)); + + return true; +} + +bool CAlgoUnivariateStatistic::uninitialize() +{ + op_compression.uninitialize(); + ip_percentileValue.uninitialize(); + + ip_isMeanActive.uninitialize(); + ip_isVarianceActive.uninitialize(); + ip_isRangeActive.uninitialize(); + ip_isMedianActive.uninitialize(); + ip_isIQRActive.uninitialize(); + ip_isPercentileActive.uninitialize(); + + op_MeanMatrix.uninitialize(); + op_VarianceMatrix.uninitialize(); + op_RangeMatrix.uninitialize(); + op_MedianMatrix.uninitialize(); + op_IQRMatrix.uninitialize(); + op_PercentileMatrix.uninitialize(); + ip_matrix.uninitialize(); + + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CAlgoUnivariateStatistic::process() +{ + CMatrix* matrix = ip_matrix; + CMatrix* mean = op_MeanMatrix; + CMatrix* variance = op_VarianceMatrix; + CMatrix* range = op_RangeMatrix; + CMatrix* median = op_MedianMatrix; + CMatrix* iqr = op_IQRMatrix; + CMatrix* percentile = op_PercentileMatrix; + + if (this->isInputTriggerActive(OVP_Algorithm_UnivariateStatistic_InputTriggerId_Initialize)) + { + this->getLogManager() << Kernel::LogLevel_Debug << "input : " << matrix->getDimensionCount() << " : " << matrix->getDimensionSize(0) << "*" << + matrix->getDimensionSize(1) << "\n"; + + //initialize matrix output + if (!setMatrixDimension(mean, matrix)) { return false; } + if (!setMatrixDimension(variance, matrix)) { return false; } + if (!setMatrixDimension(range, matrix)) { return false; } + if (!setMatrixDimension(median, matrix)) { return false; } + if (!setMatrixDimension(iqr, matrix)) { return false; } + if (!setMatrixDimension(percentile, matrix)) { return false; } + + //inform about the compression on sampling rate due to this operation N->1 :=: fq->fq/N + op_compression = 1 / double(matrix->getDimensionSize(1)); + + //percentile value + m_percentileValue = ip_percentileValue; + //select operation to do (avoid unuseful calculus) + m_isSumActive = ip_isMeanActive || ip_isVarianceActive; + m_isSqaresumActive = ip_isVarianceActive; + m_isSortActive = ip_isRangeActive || ip_isMedianActive || ip_isIQRActive || ip_isPercentileActive; + + if (m_isSumActive) + { + m_sumMatrix.copyDescription(*matrix); + m_sumMatrix.setDimensionSize(1, 1); + } + + if (m_isSqaresumActive) + { + m_sumMatrix2.copyDescription(*matrix); + m_sumMatrix2.setDimensionSize(1, 1); + } + + if (m_isSortActive) { m_sortMatrix.copyDescription(*matrix); } + } + + if (this->isInputTriggerActive(OVP_Algorithm_UnivariateStatistic_InputTriggerId_Process)) + { + ///make necessary operations + //dimension + const double s = double(matrix->getDimensionSize(1)); + //sum, sum square, sort + std::vector vect(matrix->getDimensionSize(1)); + for (size_t i = 0; i < matrix->getDimensionSize(0); ++i) + { + if (m_isSortActive) + { + //copy fonctionne pas car le buffer n'est pas unidirectionnel... + for (size_t j = 0; j < matrix->getDimensionSize(1); ++j) { vect[j] = matrix->getBuffer()[i * matrix->getDimensionSize(1) + j]; } + std::sort(vect.begin(), vect.end()); + } + + double y = 0, y2 = 0; + for (size_t j = 0; j < matrix->getDimensionSize(1); ++j) + { + const double x = matrix->getBuffer()[i * matrix->getDimensionSize(1) + j]; + if (m_isSumActive) { y += x; } + if (m_isSqaresumActive) { y2 += x * x; } + if (m_isSortActive) { m_sortMatrix.getBuffer()[i * m_sortMatrix.getDimensionSize(1) + j] = vect.at(j); } + } + + if (m_isSumActive) { m_sumMatrix.getBuffer()[i * m_sumMatrix.getDimensionSize(1)] = y; } + if (m_isSqaresumActive) { m_sumMatrix2.getBuffer()[i * m_sumMatrix2.getDimensionSize(1)] = y2; } + } + + ///make statistics operations... + if (ip_isMeanActive) + { + for (size_t i = 0; i < mean->getDimensionSize(0); ++i) + { + mean->getBuffer()[i * mean->getDimensionSize(1)] = m_sumMatrix.getBuffer()[i * m_sumMatrix.getDimensionSize(1)] / matrix->getDimensionSize(1); + } + } + if (ip_isVarianceActive) + { + for (size_t i = 0; i < variance->getDimensionSize(0); ++i) + { + const double y = m_sumMatrix.getBuffer()[i * m_sumMatrix.getDimensionSize(1)]; + const double y2 = m_sumMatrix2.getBuffer()[i * m_sumMatrix2.getDimensionSize(1)]; + + variance->getBuffer()[i * variance->getDimensionSize(1)] = y2 / s - y * y / (s * s); + } + } + if (ip_isRangeActive) + { + for (size_t i = 0; i < range->getDimensionSize(0); ++i) + { + const double min = m_sortMatrix.getBuffer()[i * m_sortMatrix.getDimensionSize(1) + 0]; + const double max = m_sortMatrix.getBuffer()[(i + 1) * m_sortMatrix.getDimensionSize(1) - 1]; + + range->getBuffer()[i * range->getDimensionSize(1)] = max - min; + } + } + if (ip_isMedianActive) + { + for (size_t i = 0; i < median->getDimensionSize(0); ++i) + { + median->getBuffer()[i * median->getDimensionSize(1)] = + (m_sortMatrix.getDimensionSize(1) % 2) + ? m_sortMatrix.getBuffer()[i * m_sortMatrix.getDimensionSize(1) + m_sortMatrix.getDimensionSize(1) / 2 + 1 - 1] + : (m_sortMatrix.getBuffer()[i * m_sortMatrix.getDimensionSize(1) + m_sortMatrix.getDimensionSize(1) / 2 - 1] + + m_sortMatrix.getBuffer()[i * m_sortMatrix.getDimensionSize(1) + m_sortMatrix.getDimensionSize(1) / 2 + 1 - 1]) / 2; + } + } + if (ip_isIQRActive) + { + for (size_t i = 0; i < iqr->getDimensionSize(0); ++i) + { + double flow = 0, up = 0; + const size_t reste = m_sortMatrix.getDimensionSize(1) % 4; + const size_t nb = 4 - reste; + for (size_t k = 0; k < nb; ++k) + { + flow += m_sortMatrix.getBuffer()[i * m_sortMatrix.getDimensionSize(1) + m_sortMatrix.getDimensionSize(1) / 4 - (nb - 1) + k - 1]; + } + + flow /= nb; + + for (size_t k = 0; k < nb; ++k) + { + up += m_sortMatrix.getBuffer()[i * m_sortMatrix.getDimensionSize(1) + m_sortMatrix.getDimensionSize(1) + - m_sortMatrix.getDimensionSize(1) / 4 - 1 + k - 1]; + } + + up /= nb; + iqr->getBuffer()[i * iqr->getDimensionSize(1)] = up - flow; + } + } + if (ip_isPercentileActive) + { + const uint64_t value = m_percentileValue; + for (size_t i = 0; i < percentile->getDimensionSize(0); ++i) + { + percentile->getBuffer()[i * percentile->getDimensionSize(1)] = m_sortMatrix.getBuffer()[ + i * m_sortMatrix.getDimensionSize(1) + std::max(int(0), int(m_sortMatrix.getDimensionSize(1) * value / 100 - 1))]; + } + } + + this->activateOutputTrigger(OVP_Algorithm_UnivariateStatistic_OutputTriggerId_ProcessDone, true); + } + + return true; +} + +bool CAlgoUnivariateStatistic::setMatrixDimension(CMatrix* matrix, CMatrix* ref) +{ + //@todo We Allow matrix with 3 or more dimension ? + if (ref->getDimensionCount() < 2) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Input matrix doesn't respect basic criteria (2 Dimensions)\n"; + return false; + } + matrix->copyDescription(*ref); + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCAlgorithmUnivariateStatistics.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCAlgorithmUnivariateStatistics.h new file mode 100644 index 0000000..b60f571 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCAlgorithmUnivariateStatistics.h @@ -0,0 +1,101 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CAlgoUnivariateStatistic final : public Toolkit::TAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_AlgoUnivariateStatistic) + +protected: + + Kernel::TParameterHandler ip_matrix; + Kernel::TParameterHandler op_MeanMatrix; + Kernel::TParameterHandler op_VarianceMatrix; + Kernel::TParameterHandler op_RangeMatrix; + Kernel::TParameterHandler op_MedianMatrix; + Kernel::TParameterHandler op_IQRMatrix; + Kernel::TParameterHandler op_PercentileMatrix; + + Kernel::TParameterHandler ip_isMeanActive; + Kernel::TParameterHandler ip_isVarianceActive; + Kernel::TParameterHandler ip_isRangeActive; + Kernel::TParameterHandler ip_isMedianActive; + Kernel::TParameterHandler ip_isIQRActive; + Kernel::TParameterHandler ip_isPercentileActive; + Kernel::TParameterHandler ip_percentileValue; + + Kernel::TParameterHandler op_compression; + + bool m_isSumActive = false; + bool m_isSqaresumActive = false; + bool m_isSortActive = false; + CMatrix m_sumMatrix; + CMatrix m_sumMatrix2; + CMatrix m_sortMatrix; + + uint64_t m_percentileValue = 0; + + bool setMatrixDimension(CMatrix* matrix, CMatrix* ref); +}; + +class CAlgoUnivariateStatisticDesc final : public IAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Signal Statistic"); } + CString getAuthorName() const override { return CString("Matthieu Goyat"); } + CString getAuthorCompanyName() const override { return CString("Gipsa-lab"); } + + CString getShortDescription() const override { return CString("Calculate Mean, Variance, Median, etc. on the incoming buffer"); } + + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Signal processing/Statistics"); } + CString getVersion() const override { return CString("1.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_AlgoUnivariateStatistic; } + IPluginObject* create() override { return new CAlgoUnivariateStatistic(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_Matrix, "Matrix input", Kernel::ParameterType_Matrix); + prototype.addInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_MeanActive, "active mean", Kernel::ParameterType_Boolean); + prototype.addInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_VarActive, "active variance", Kernel::ParameterType_Boolean); + prototype.addInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_RangeActive, "active range", Kernel::ParameterType_Boolean); + prototype.addInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_MedActive, "active median", Kernel::ParameterType_Boolean); + prototype.addInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_IQRActive, "active IQR", Kernel::ParameterType_Boolean); + prototype.addInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_PercentActive, "active Percentile", Kernel::ParameterType_Boolean); + prototype.addInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_PercentValue, "Percentile Value", Kernel::ParameterType_Integer); + prototype.addOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Mean, "Mean output", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Var, "Variance output", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Range, "Range output", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Med, "Median output", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_IQR, "Inter-Quantile-Range output", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Percent, "Percentile output", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Compression, "compression ratio", Kernel::ParameterType_Float); + + prototype.addInputTrigger(OVP_Algorithm_UnivariateStatistic_InputTriggerId_Initialize, "Initialize"); + prototype.addInputTrigger(OVP_Algorithm_UnivariateStatistic_InputTriggerId_Process, "Process"); + prototype.addOutputTrigger(OVP_Algorithm_UnivariateStatistic_OutputTriggerId_ProcessDone, "Done"); + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_AlgoUnivariateStatisticDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCApplyTemporalFilter.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCApplyTemporalFilter.cpp new file mode 100644 index 0000000..8735aa0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCApplyTemporalFilter.cpp @@ -0,0 +1,324 @@ +#if defined TARGET_HAS_ThirdPartyITPP + +#include "ovpCApplyTemporalFilter.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +void ComputeFilterInitialCondition(itpp::vec b, itpp::vec a, itpp::vec& zi) +{ + int na, j, i; + na = length(a); + // FIXME is it necessary to keep next line uncomment ? + //int nb = length(b); + + //-------------------------------------- + // use sparse matrix to solve system of linear equations for initial conditions + // zi are the steady-state states of the filter b(z)/a(z) in the state-space + //implementation of the 'filter' command. + + itpp::mat eye1; + eye1 = itpp::eye(na - 1); + + itpp::mat eye2; + eye2 = itpp::eye(na - 2); + + itpp::vec a1(na - 1); + itpp::vec zeros1(na - 2); + zeros1 = itpp::zeros(na - 2); + itpp::vec b1(na - 1); + itpp::vec a2(na - 1); + + for (j = 1; j < na; ++j) + { + a1[j - 1] = - a[j]; + b1[j - 1] = b[j]; + a2[j - 1] = a[j]; + } + + itpp::mat matConc01; + itpp::mat matZeros1; + + matZeros1 = itpp::zeros(na - 2, 1); + matConc01 = concat_vertical(eye2, transpose(matZeros1)); + + itpp::mat matA1; + matA1 = itpp::zeros(na - 1, 1); + matA1.set_col(0, a1); + + itpp::mat matConc02; + matConc02 = concat_horizontal(matA1, matConc01); + + itpp::mat matNum; + matNum = eye1 - matConc02; + + + itpp::vec vecDenom(na - 1); + for (i = 0; i < na - 1; ++i) { vecDenom[i] = b1[i] - (a2[i] * b[0]); } + + zi = inv(matNum) * vecDenom; +} + + +void FilterIRR(itpp::vec b, itpp::vec a, itpp::vec data, itpp::vec v0, itpp::vec& dataFiltered, itpp::vec& vf) +{ + int i, j, iV0 = 0; + double sumA, sumB; + double sumVf; + // FIXME is it necessary to keep next line uncomment ? + //int na = length(a); + const int nb = length(b); + const int size = length(data); + + if (size < nb) + { + for (i = 0; i < size; ++i) + { + sumB = 0.0; + for (j = 0; j <= i; ++j) { sumB = sumB + (b[j] * data[i - j]); } + + + sumA = 0.0; + + for (j = 0; j <= i; ++j) { sumA = sumA + (a[j] * dataFiltered[i - j]); } + dataFiltered[i] = sumB - sumA + v0[i]; + } + + for (i = 0; i < (nb - 1); ++i) + { + sumVf = 0.0; + double tmp = 0.0; + for (j = 0; j < (nb - 1); ++j) + { + if ((i + j) < (nb - 1)) + { + if ((size - 1 - j) >= 0) + { + sumVf = sumVf + (b[i + j + 1] * data[size - 1 - j]) - (a[i + j + 1] * dataFiltered[size - 1 - j]); + iV0 = i + j + 1; + } + if ((size - 1 - j) < 0) { tmp = v0[iV0]; } + } + } + vf[i] = sumVf + tmp; + } + } + else + { + for (i = 0; i < nb - 1; ++i) + { + sumB = 0.0; + for (j = 0; j <= i; ++j) { sumB = sumB + (b[j] * data[i - j]); } + sumA = 0.0; + + for (j = 0; j <= i; ++j) { sumA = sumA + (a[j] * dataFiltered[i - j]); } + dataFiltered[i] = sumB - sumA + v0[i]; + } + + + for (i = nb - 1; i < size; ++i) + { + sumB = 0.0; + for (j = 0; j < nb; ++j) { sumB = sumB + (b[j] * data[i - j]); } + sumA = 0.0; + for (j = 0; j < nb; ++j) { sumA = sumA + (a[j] * dataFiltered[i - j]); } + dataFiltered[i] = sumB - sumA; + } + + for (i = 0; i < nb - 1; ++i) + { + sumVf = 0.0; + for (j = i; j < nb - 1; ++j) { sumVf = sumVf + (b[j + 1] * data[size - 1 - j + i]) - (a[j + 1] * dataFiltered[size - 1 - j + i]); } + vf[i] = sumVf; + } + } +} + + +void Filtfilt(const itpp::vec& b, const itpp::vec& a, itpp::vec data, itpp::vec& dataFiltered) +{ + int j; + const int na = length(a); + const int nb = length(b); + const int dataSize = length(data); + const int lengthEdgeTransients = 3 * (nb - 1); + + itpp::vec xB = itpp::zeros(dataSize + (2 * lengthEdgeTransients)); + itpp::vec yB = itpp::zeros(dataSize + (2 * lengthEdgeTransients)); + itpp::vec yB2 = itpp::zeros(dataSize + (2 * lengthEdgeTransients)); + itpp::vec yC = itpp::zeros(dataSize + (2 * lengthEdgeTransients)); + itpp::vec yC2 = itpp::zeros(dataSize + (2 * lengthEdgeTransients)); + + + itpp::vec zi(na - 1); + ComputeFilterInitialCondition(b, a, zi); + + for (j = 0; j < lengthEdgeTransients; ++j) { xB[j] = (2 * data[0]) - data[lengthEdgeTransients - j]; } + for (j = 0; j < dataSize; ++j) { xB[j + lengthEdgeTransients] = data[j]; } + for (j = 0; j < lengthEdgeTransients; ++j) { xB[j + lengthEdgeTransients + dataSize] = (2 * data[dataSize - 1]) - data[dataSize - j - 2]; } + + itpp::vec ziChan(na - 1); + for (j = 0; j < na - 1; ++j) { ziChan[j] = zi[j] * xB[0]; } + + itpp::vec finalStates(na - 1); + + FilterIRR(b, a, xB, ziChan, yB, finalStates); + + for (j = 0; j < dataSize + (2 * lengthEdgeTransients); ++j) { yC[j] = yB[(dataSize + (2 * lengthEdgeTransients)) - 1 - j]; } + + itpp::vec ziChan2(na - 1); + + for (j = 0; j < na - 1; ++j) { ziChan2[j] = zi[j] * yC[0]; } + + FilterIRR(b, a, yC, ziChan2, yB2, finalStates); + + + for (j = 0; j < dataSize + (2 * lengthEdgeTransients); ++j) { yC2[j] = yB2[(dataSize + (2 * lengthEdgeTransients)) - 1 - j]; } + for (j = 0; j < dataSize; ++j) { dataFiltered[j] = yC2[j + lengthEdgeTransients]; } +} + + +bool CApplyTemporalFilter::initialize() +{ + bool res = true; + res &= ip_signalMatrix.initialize(getInputParameter(OVP_Algorithm_ApplyTemporalFilter_InputParameterId_SignalMatrix)); + res &= ip_filterCoefsMatrix.initialize(getInputParameter(OVP_Algorithm_ApplyTemporalFilter_InputParameterId_FilterCoefsMatrix)); + res &= op_signalMatrix.initialize(getOutputParameter(OVP_Algorithm_ApplyTemporalFilter_OutputParameterId_FilteredSignalMatrix)); + return res; +} + +bool CApplyTemporalFilter::uninitialize() +{ + op_signalMatrix.uninitialize(); + ip_filterCoefsMatrix.uninitialize(); + ip_signalMatrix.uninitialize(); + return true; +} + +// +// + +bool CApplyTemporalFilter::process() +{ + CMatrix* iMatrix = ip_signalMatrix; + CMatrix* oMatrix = op_signalMatrix; + + if (isInputTriggerActive(OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_Initialize)) + { + m_flagInitialize = true; + + oMatrix->copyDescription(*iMatrix); + + // dimension of input coef (numerator, denominator) filter + const size_t filterCoefNumeratorDimSize = ip_filterCoefsMatrix->getDimensionSize(0); + const size_t filterCoefDenominatorDimSize = ip_filterCoefsMatrix->getDimensionSize(0); + + //coef filters vars + CMatrix* filterCoefInputMatrix = ip_filterCoefsMatrix; + double* filterCoefInput = filterCoefInputMatrix->getBuffer(); + + m_coefFilterDen = itpp::zeros(filterCoefDenominatorDimSize); + m_coefFilterNum = itpp::zeros(filterCoefNumeratorDimSize); + + + for (size_t i = 0; i < filterCoefNumeratorDimSize; ++i) { m_coefFilterNum[i] = filterCoefInput[i]; } + + + for (size_t i = 0; i < filterCoefDenominatorDimSize; ++i) { m_coefFilterDen[i] = filterCoefInput[filterCoefNumeratorDimSize + i]; } + } + + // This mode is used when the consecutive input chunks are discontinuous in time + if (isInputTriggerActive(OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_ApplyFilter)) + { + // signal input vars + double* input = iMatrix->getBuffer(); + + // dimension of input signal buffer + const size_t nDim = ip_signalMatrix->getDimensionCount(); + const size_t nChannels = ip_signalMatrix->getDimensionSize(0); + const size_t nEpoch = ip_signalMatrix->getDimensionSize(1); + + // signal output vars + oMatrix->setDimensionCount(nDim); + for (size_t i = 0; i < nDim; ++i) { oMatrix->setDimensionSize(i, ip_signalMatrix->getDimensionSize(i)); } + double* filteredSignalMatrix = oMatrix->getBuffer(); + + itpp::vec y(nEpoch); + itpp::vec x = itpp::zeros(nEpoch); + + // test that Filtfilt() won't exceed the data array boundaries + const size_t minSize = 3 * (m_coefFilterDen.size() - 1) + 1; + if (nEpoch < minSize) + { + this->getLogManager() << Kernel::LogLevel_Error << "Data chunk size (" << nEpoch << ") " + << "is too short for the requirements of the filter (" << minSize << "). Please use a larger chunk size.\n"; + return false; + } + + for (size_t i = 0; i < nChannels; ++i) + { + for (size_t j = 0; j < nEpoch; ++j) { x[int(j)] = double(input[i * nEpoch + j]); } + + // --- Modif Manu + Filtfilt(m_coefFilterNum, m_coefFilterDen, x, y); + // --- Fin Modif Manu + + for (size_t k = 0; k < nEpoch; ++k) { filteredSignalMatrix[i * nEpoch + k] = y[k]; } + } + } + + // This mode is used when the consecutive input chunks are continuous in time + if (isInputTriggerActive(OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_ApplyFilterWithHistoric)) + { + // signal input vars + double* input = iMatrix->getBuffer(); + + // dimension of input signal biuffer + const size_t nDim = ip_signalMatrix->getDimensionCount(); + const size_t nChannels = ip_signalMatrix->getDimensionSize(0); + const size_t nEpoch = ip_signalMatrix->getDimensionSize(1); + + // historic buffers + if (m_flagInitialize) + { + // --- Modif Manu + itpp::vec zi = itpp::zeros(int(ip_filterCoefsMatrix->getDimensionSize(0) - 1)); + ComputeFilterInitialCondition(m_coefFilterNum, m_coefFilterDen, zi); + + m_currentStates.resize(nChannels); + for (size_t i = 0; i < nChannels; ++i) { m_currentStates[i] = zi * double(input[i * nEpoch]); } + // --- Fin Modif Manu + + m_flagInitialize = false; + } + + // signal output vars + oMatrix->setDimensionCount(nDim); + for (size_t i = 0; i < nDim; ++i) { oMatrix->setDimensionSize(i, ip_signalMatrix->getDimensionSize(i)); } + double* filteredSignalMatrix = oMatrix->getBuffer(); + + itpp::vec x = itpp::zeros(nEpoch); + + itpp::vec y(nEpoch); + //y = zeros(nEpoch); + + for (size_t i = 0; i < nChannels; ++i) + { + for (size_t j = 0; j < nEpoch; ++j) { x[j] = double(input[i * nEpoch + j]); } + // --- Modif Manu + y = itpp::zeros(nEpoch); + FilterIRR(m_coefFilterNum, m_coefFilterDen, x, m_currentStates[i], y, m_currentStates[i]); + // --- Fin Modif Manu + + for (size_t k = 0; k < nEpoch; ++k) { filteredSignalMatrix[i * nEpoch + k] = y[k]; } + } + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyITPP diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCApplyTemporalFilter.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCApplyTemporalFilter.h new file mode 100644 index 0000000..828f3be --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCApplyTemporalFilter.h @@ -0,0 +1,78 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyITPP + +#include "../ovp_defines.h" + +#include + +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CApplyTemporalFilter final : virtual public Toolkit::TAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_ApplyTemporalFilter) + +protected: + + Kernel::TParameterHandler ip_signalMatrix; + Kernel::TParameterHandler ip_filterCoefsMatrix; + Kernel::TParameterHandler op_signalMatrix; + + itpp::vec m_coefFilterDen; + itpp::vec m_coefFilterNum; + std::vector m_currentStates; + + bool m_flagInitialize = false; +}; + +class CApplyTemporalFilterDesc final : virtual public IAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Temporal Filter (INSERM contrib)"); } + CString getAuthorName() const override { return CString("Guillaume Gibert"); } + CString getAuthorCompanyName() const override { return CString("INSERM/U821"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Algorithm/Signal processing/Filter"); } + CString getVersion() const override { return CString("1.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_ApplyTemporalFilter; } + IPluginObject* create() override { return new CApplyTemporalFilter(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_ApplyTemporalFilter_InputParameterId_SignalMatrix, "Signal matrix", Kernel::ParameterType_Matrix); + prototype.addInputParameter(OVP_Algorithm_ApplyTemporalFilter_InputParameterId_FilterCoefsMatrix, "Filter coefficients matrix", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_ApplyTemporalFilter_OutputParameterId_FilteredSignalMatrix, "Filtered signal matrix", Kernel::ParameterType_Matrix); + prototype.addInputTrigger(OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_Initialize, "Initialize"); + prototype.addInputTrigger(OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_ApplyFilter, "Apply filter"); + prototype.addInputTrigger(OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_ApplyFilterWithHistoric, "Apply filter with historic"); + + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_ApplyTemporalFilterDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyITPP diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCComputeTemporalFilterCoefficients.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCComputeTemporalFilterCoefficients.cpp new file mode 100644 index 0000000..e929f05 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCComputeTemporalFilterCoefficients.cpp @@ -0,0 +1,639 @@ +#if defined TARGET_HAS_ThirdPartyITPP + +#include "ovpCComputeTemporalFilterCoefficients.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +// Add 2complexes +void CComputeTemporalFilterCoefficients::addComplex(cmplex* a, cmplex* b, cmplex* c) +{ + c->real = b->real + a->real; + c->imag = b->imag + a->imag; +} + +// Substract 2 complex +void CComputeTemporalFilterCoefficients::subComplex(cmplex* a, cmplex* b, cmplex* c) +{ + c->real = b->real - a->real; + c->imag = b->imag - a->imag; +} + +// Multiply 2 complexes +void CComputeTemporalFilterCoefficients::mulComplex(cmplex* a, cmplex* b, cmplex* c) +{ + const double y = b->real * a->real - b->imag * a->imag; + c->imag = b->real * a->imag + b->imag * a->real; + c->real = y; +} + +// Divide 2 complex numbers +void CComputeTemporalFilterCoefficients::divComplex(cmplex* a, cmplex* b, cmplex* c) const +{ + const double y = a->real * a->real + a->imag * a->imag; + const double p = b->real * a->real + b->imag * a->imag; + const double q = b->imag * a->real - b->real * a->imag; + + if (y < 1.0) + { + const double w = MAXNUM * y; + if ((fabs(p) > w) || (fabs(q) > w) || (y == 0.0)) + { + c->real = MAXNUM; + c->imag = MAXNUM; + std::cout << "divCOMPLEX: OVERFLOW" << std::endl; + return; + } + } + c->real = p / y; + c->imag = q / y; +} + +// Compute abs of a complex +double CComputeTemporalFilterCoefficients::absComplex(cmplex* z) const +{ + int ex, ey; + + const double re = fabs(z->real); + const double im = fabs(z->imag); + + if (re == 0.0) { return (im); } + if (im == 0.0) { return (re); } + + // Get the exponents of the numbers + frexp(re, &ex); + frexp(im, &ey); + + // Check if one number is tiny compared to the other + int e = ex - ey; + if (e > PREC) { return (re); } + if (e < -PREC) { return (im); } + + // Find approximate exponent e of the geometric mean. + e = (ex + ey) >> 1; + + // Rescale so mean is about 1 + const double x = ldexp(re, -e); + double y = ldexp(im, -e); + + // Hypotenuse of the right triangle + double b = sqrt(x * x + y * y); + + // Compute the exponent of the answer. + y = frexp(b, &ey); + ey = e + ey; + + // Check it for overflow and underflow. + if (ey > MAXEXP) + { + std::cout << "absCOMPLEX: OVERFLOW" << std::endl; + return (std::numeric_limits::infinity()); + } + if (ey < MINEXP) { return (0.0); } + + // Undo the scaling + b = ldexp(b, e); + return (b); +} + +// Compute sqrt of a complex number +void CComputeTemporalFilterCoefficients::sqrtComplex(cmplex* z, cmplex* w) const +{ + cmplex q, s; + double r, t; + + const double x = z->real; + const double y = z->imag; + + if (y == 0.0) + { + if (x < 0.0) + { + w->real = 0.0; + w->imag = sqrt(-x); + return; + } + w->real = sqrt(x); + w->imag = 0.0; + return; + } + + if (x == 0.0) + { + r = fabs(y); + r = sqrt(0.5 * r); + if (y > 0) { w->real = r; } + else { w->real = -r; } + w->imag = r; + return; + } + + // Approximate sqrt(x^2+y^2) - x = y^2/2x - y^4/24x^3 + ... . + // The relative error in the first term is approximately y^2/12x^2 . + if ((fabs(y) < 2.e-4 * fabs(x)) && (x > 0)) { t = 0.25 * y * (y / x); } + else + { + r = absComplex(z); + t = 0.5 * (r - x); + } + r = sqrt(t); + q.imag = r; + q.real = y / (2.0 * r); + // Heron iteration in complex arithmetic + divComplex(&q, z, &s); + addComplex(&q, &s, w); + w->real *= 0.5; + w->imag *= 0.5; +} + +// compute s plane poles and zeros +void CComputeTemporalFilterCoefficients::findSPlanePolesAndZeros() +{ + m_nPoles = (m_filterOrder + 1) / 2; + m_nZeros = 0; + m_zs = itpp::zeros(m_arraySize); + + double dm; + size_t ii = 0; + double db; + + if (m_filterMethod == EFilterMethod::Butterworth)//poles equally spaced around the unit circle + { + if (m_filterOrder & 1) { dm = 0.0; } + else { dm = itpp::pi / (2.0 * double(m_filterOrder)); } + + for (size_t i = 0; i < m_nPoles; ++i)// poles + { + const size_t lr = i + i; + m_zs[lr] = -cos(dm); + m_zs[lr + 1] = sin(dm); + dm += itpp::pi / double(m_filterOrder); + } + + if (m_filterType == EFilterType::HighPass || m_filterType == EFilterType::BandStop) // high pass or band reject + { + // map s => 1/s + for (size_t j = 0; j < m_nPoles; ++j) + { + const size_t ir = j + j; + ii = ir + 1; + db = m_zs[ir] * m_zs[ir] + m_zs[ii] * m_zs[ii]; + m_zs[ir] = m_zs[ir] / db; + m_zs[ii] = m_zs[ii] / db; + } + + // The zeros at infinity map to the origin. + m_nZeros = m_nPoles; + if (m_filterType == EFilterType::BandStop) { m_nZeros += m_filterOrder / 2; } + for (size_t j = 0; j < m_nZeros; ++j) + { + const size_t ir = ii + 1; + ii = ir + 1; + m_zs[ir] = 0.0; + m_zs[ii] = 0.0; + } + } + } + + if (m_filterMethod == EFilterMethod::Chebyshev) + { + //For Chebyshev, find radii of two Butterworth circles (See Gold & Rader, page 60) + m_rho = (m_phi - 1.0) * (m_phi + 1); // m_rho = m_eps^2 = {sqrt(1+m_eps^2)}^2 - 1 + m_eps = sqrt(m_rho); // sqrt( 1 + 1/m_eps^2 ) + 1/m_eps = {sqrt(1 + m_eps^2) + 1} / m_eps + m_phi = (m_phi + 1.0) / m_eps; + m_phi = pow(m_phi, double(1.0) / m_filterOrder); // raise to the 1/n power + db = 0.5 * (m_phi + 1.0 / m_phi); // y coordinates are on this circle + const double da = 0.5 * (m_phi - 1.0 / m_phi); // x coordinates are on this circle + if (m_filterOrder & 1) { dm = 0.0; } + else { dm = itpp::pi / (2.0 * double(m_filterOrder)); } + + for (size_t i = 0; i < m_nPoles; ++i)// poles + { + const size_t lr = i + i; + m_zs[lr] = -da * cos(dm); + m_zs[lr + 1] = db * sin(dm); + dm += itpp::pi / double(m_filterOrder); + } + + if (m_filterType == EFilterType::HighPass || m_filterType == EFilterType::BandStop)// high pass or band reject + { + // map s => 1/s + for (size_t j = 0; j < m_nPoles; ++j) + { + const size_t ir = j + j; + ii = ir + 1; + db = m_zs[ir] * m_zs[ir] + m_zs[ii] * m_zs[ii]; + m_zs[ir] = m_zs[ir] / db; + m_zs[ii] = m_zs[ii] / db; + } + // The zeros at infinity map to the origin. + m_nZeros = m_nPoles; + if (m_filterType == EFilterType::BandStop) { m_nZeros += m_filterOrder / 2; } + + for (size_t j = 0; j < m_nZeros; ++j) + { + const size_t ir = ii + 1; + ii = ir + 1; + m_zs[ir] = 0.0; + m_zs[ii] = 0.0; + } + } + } +} + +//convert s plane poles and zeros to the z plane. +void CComputeTemporalFilterCoefficients::convertSPlanePolesAndZerosToZPlane() +{ + // Vars + cmplex r, cnum, cden, cwc, ca, cb, b4Ac; + cmplex cone = { 1.0, 0.0 }; + cmplex* z = new cmplex[m_arraySize]; + double* pp = new double[m_arraySize]; + double* y = new double[m_arraySize]; + double* aa = new double[m_arraySize]; + + double c = 0.0, a = 0.0, b = 0.0, pn = 0.0, an = 0.0, gam = 0.0, ai = 0.0, cng = 0.0, gain = 0.0; + size_t nc = 0, jt = 0, ii = 0, ir = 0, jj = 0, jh = 0, jl = 0, mh = 0; + + c = m_tanAng; + + for (size_t i = 0; i < m_arraySize; ++i) + { + z[i].real = 0.0; + z[i].imag = 0.0; + } + + nc = m_nPoles; + jt = -1; + ii = -1; + + for (size_t icnt = 0; icnt < 2; ++icnt) + { + do + { + ir = ii + 1; + ii = ir + 1; + + r.real = m_zs[ir]; + r.imag = m_zs[ii]; + + if (m_filterType == EFilterType::LowPass || m_filterType == EFilterType::HighPass) + { + // Substitute s - r = s/wc - r = (1/wc)(z-1)/(z+1) - r + // + // 1 1 - r wc ( 1 + r wc ) + // = --- -------- ( z - -------- ) + // z+1 wc ( 1 - r wc ) + // + // giving the root in the z plane. + cnum.real = 1 + c * r.real; + cnum.imag = c * r.imag; + cden.real = 1 - c * r.real; + cden.imag = -c * r.imag; + jt += 1; + divComplex(&cden, &cnum, &z[jt]); + + if (r.imag != 0.0) + { + // fill in complex conjugate root + jt += 1; + z[jt].real = z[jt - 1].real; + z[jt].imag = -z[jt - 1].imag; + } + } + + if (m_filterType == EFilterType::BandPass || m_filterType == EFilterType::BandStop) + { + // Substitute s - r => s/wc - r + // + // z^2 - 2 z cgam + 1 + // => ------------------ - r + // (z^2 + 1) wc + // + // 1 + // = ------------ [ (1 - r wc) z^2 - 2 cgam z + 1 + r wc ] + // (z^2 + 1) wc + // + // and solve for the roots in the z plane. + + if (m_filterMethod == EFilterMethod::Chebyshev) { cwc.real = m_cbp; } + else { cwc.real = m_tanAng; } + cwc.imag = 0.0; + + // r * wc // + mulComplex(&r, &cwc, &cnum); + // a = 1 - r wc // + subComplex(&cnum, &cone, &ca); + // 1 - (r wc)^2 // + mulComplex(&cnum, &cnum, &b4Ac); + subComplex(&b4Ac, &cone, &b4Ac); + // 4ac // + b4Ac.real *= 4.0; + b4Ac.imag *= 4.0; + // b // + cb.real = -2.0 * m_cosGam; + cb.imag = 0.0; + // b^2 // + mulComplex(&cb, &cb, &cnum); + // b^2 - 4ac// + subComplex(&b4Ac, &cnum, &b4Ac); + // sqrt() // + sqrtComplex(&b4Ac, &b4Ac); + // -b // + cb.real = -cb.real; + cb.imag = -cb.imag; + // 2a // + ca.real *= 2.0; + ca.imag *= 2.0; + // -b +sqrt(b^2-4ac) // + addComplex(&b4Ac, &cb, &cnum); + // ... /2a // + divComplex(&ca, &cnum, &cnum); + jt += 1; + + z[jt].real = cnum.real; + z[jt].imag = cnum.imag; + + if (cnum.imag != 0.0) + { + jt += 1; + z[jt].real = cnum.real; + z[jt].imag = -cnum.imag; + } + if ((r.imag != 0.0) || cnum.imag == 0.0) + { + // -b - sqrt( b^2 - 4ac) // + subComplex(&b4Ac, &cb, &cnum); + // ... /2a // + divComplex(&ca, &cnum, &cnum); + + jt += 1; + z[jt].real = cnum.real; + z[jt].imag = cnum.imag; + + if (cnum.imag != 0.0) + { + jt += 1; + z[jt].real = cnum.real; + z[jt].imag = -cnum.imag; + } + } + } + } while (--nc > 0); + + if (icnt == 0) + { + m_zOrd = jt + 1; + if (m_nZeros <= 0) { icnt = 2; } + } + nc = m_nZeros; + } + + // Generate the remaining zeros + while (2 * m_zOrd - 1 > jt) + { + if (m_filterType != EFilterType::HighPass) + { + jt += 1; + z[jt].real = -1.0; + z[jt].imag = 0.0; + } + + if (m_filterType == EFilterType::BandPass || m_filterType == EFilterType::HighPass) + { + jt += 1; + z[jt].real = 1.0; + z[jt].imag = 0.0; + } + } + + // Expand the poles and zeros into numerator and denominator polynomials + for (size_t j = 0; j < m_arraySize; ++j) { aa[j] = 0.0; } + for (size_t icnt = 0; icnt < 2; ++icnt) + { + for (size_t j = 0; j < m_arraySize; ++j) + { + pp[j] = 0.0; + y[j] = 0.0; + } + pp[0] = 1.0; + + for (size_t j = 0; j < m_zOrd; ++j) + { + jj = j; + if (icnt) { jj += m_zOrd; } + + a = z[jj].real; + b = z[jj].imag; + for (size_t k = 0; k <= j; ++k) + { + jh = j - k; + pp[jh + 1] = pp[jh + 1] - a * pp[jh] + b * y[jh]; + y[jh + 1] = y[jh + 1] - b * pp[jh] - a * y[jh]; + } + } + + if (icnt == 0) { for (size_t j = 0; j <= m_zOrd; ++j) { aa[j] = pp[j]; } } + } + + // Scale factors of the pole and zero polynomials + if (m_filterType == EFilterType::HighPass) { a = -1.0; } + else { a = 1.0; } + + if (m_filterType == EFilterType::HighPass || m_filterType == EFilterType::LowPass || m_filterType == + EFilterType::BandStop) + { + pn = 1.0; + an = 1.0; + for (size_t j = 1; j <= m_zOrd; ++j) + { + pn = a * pn + pp[j]; + an = a * an + aa[j]; + } + } + + if (m_filterType == EFilterType::BandPass) + { + gam = itpp::pi / 2.0 - asin(m_cosGam); // = acos( cgam ) // + mh = m_zOrd / 2; + pn = pp[mh]; + an = aa[mh]; + ai = 0.0; + if (mh > ((m_zOrd / 4) * 2)) + { + ai = 1.0; + pn = 0.0; + an = 0.0; + } + for (size_t j = 1; j <= mh; ++j) + { + a = gam * j - ai * itpp::pi / 2.0; + cng = cos(a); + jh = mh + j; + jl = mh - j; + pn = pn + cng * (pp[jh] + (1.0 - 2.0 * ai) * pp[jl]); + an = an + cng * (aa[jh] + (1.0 - 2.0 * ai) * aa[jl]); + } + } + + gain = an / (pn * m_scale); + if (pn == 0.0) { gain = 1.0; } + + for (size_t j = 0; j <= m_zOrd; ++j) { pp[j] = gain * pp[j]; } + + for (size_t j = 0; j <= m_zOrd; ++j) + { + m_coefFilterDen[j] = pp[j]; + m_coefFilterNum[j] = aa[j]; + } + + delete [] z; + delete [] pp; + delete [] y; + delete [] aa; +} + +bool CComputeTemporalFilterCoefficients::initialize() +{ + ip_sampling.initialize(getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_Sampling)); + ip_filterMethod.initialize(getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterMethod)); + ip_filterType.initialize(getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterType)); + ip_filterOrder.initialize(getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterOrder)); + ip_lowCutFrequency.initialize(getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_LowCutFrequency)); + ip_highCutFrequency.initialize(getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_HighCutFrequency)); + ip_bandPassRipple.initialize(getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_BandPassRipple)); + + op_matrix.initialize(getOutputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_OutputParameterId_Matrix)); + + return true; +} + +bool CComputeTemporalFilterCoefficients::uninitialize() +{ + op_matrix.uninitialize(); + + ip_bandPassRipple.uninitialize(); + ip_highCutFrequency.uninitialize(); + ip_lowCutFrequency.uninitialize(); + ip_filterOrder.uninitialize(); + ip_filterType.uninitialize(); + ip_filterMethod.uninitialize(); + ip_sampling.uninitialize(); + + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CComputeTemporalFilterCoefficients::process() +{ + if (isInputTriggerActive(OVP_Algorithm_ComputeTemporalFilterCoefs_InputTriggerId_Initialize)) + { + m_sampling = size_t(ip_sampling); + m_filterMethod = EFilterMethod(uint64_t(ip_filterMethod)); + m_filterType = EFilterType(uint64_t(ip_filterType)); + m_filterOrder = size_t(ip_filterOrder); + m_lowPassBandEdge = ip_lowCutFrequency; + m_highPassBandEdge = ip_highCutFrequency; + m_passBandRipple = ip_bandPassRipple; + + m_arraySize = 4 * m_filterOrder; // Maximum size of array involved in computation + } + + if (isInputTriggerActive(OVP_Algorithm_ComputeTemporalFilterCoefs_InputTriggerId_ComputeCoefs)) + { + if (m_filterMethod == EFilterMethod::Butterworth || m_filterMethod == EFilterMethod::Chebyshev) + { + if (m_filterType == EFilterType::LowPass || m_filterType == EFilterType::HighPass) + { + m_dimSize = m_filterOrder + 1; + m_coefFilterDen = itpp::zeros(m_dimSize); + m_coefFilterNum = itpp::zeros(m_dimSize); + } + else + { + m_dimSize = 2 * m_filterOrder + 1; + m_coefFilterDen = itpp::zeros(m_dimSize); + m_coefFilterNum = itpp::zeros(m_dimSize); + } + + if (m_filterMethod == EFilterMethod::Chebyshev) + { + // For Chebyshev filter, ripples go from 1.0 to 1/sqrt(1+m_eps^2) + m_phi = exp(0.5 * m_passBandRipple / (10.0 / log(10.0))); + + if ((m_filterOrder & 1) == 0) { m_scale = m_phi; } + else { m_scale = 1.0; } + } + + m_nyquist = m_sampling / 2; + + //locate edges + if (m_filterType == EFilterType::LowPass) { m_lowPassBandEdge = 0.0; } + + //local variables + double bandWidth, highFrequencyEdge; + + if (m_filterType == EFilterType::HighPass) + { + bandWidth = m_highPassBandEdge; + highFrequencyEdge = double(m_nyquist); + } + else + { + bandWidth = m_highPassBandEdge - m_lowPassBandEdge; + highFrequencyEdge = m_highPassBandEdge; + } + + //convert to Frequency correspondence for bilinear transformation + // Wanalog = tan( 2 pi Fdigital T / 2 ) + // where T = 1/fs + const double ang = double(bandWidth) * itpp::pi / double(m_sampling); + const double cosAng = cos(ang); + m_tanAng = sin(ang) / cosAng; // Wanalog + + // Transformation from low-pass to band-pass critical frequencies + // Center frequency + // cos( 1/2 (Whigh+Wlow) T ) + // cos( Wcenter T ) = ------------------------- + // cos( 1/2 (Whigh-Wlow) T ) + // + // Band edges + // cos( Wcenter T) - cos( Wdigital T ) + // Wanalog = ----------------------------------- + // sin( Wdigital T ) + + highFrequencyEdge = itpp::pi * (highFrequencyEdge + m_lowPassBandEdge) / double(m_sampling); + m_cosGam = cos(highFrequencyEdge) / cosAng; + highFrequencyEdge = 2.0 * itpp::pi * m_highPassBandEdge / double(m_sampling); + m_cbp = (m_cosGam - cos(highFrequencyEdge)) / sin(highFrequencyEdge); + + if (m_filterMethod == EFilterMethod::Butterworth) { m_scale = 1.0; } + + findSPlanePolesAndZeros(); + convertSPlanePolesAndZerosToZPlane(); + } + + CMatrix* oMatrix = op_matrix; + oMatrix->resize(m_dimSize, 2); // Push m_coefFilterDen and m_coefFilterNum as two column vectors m_dimension rows + + double* filterCoefMatrix = oMatrix->getBuffer(); + for (size_t i = 0; i < m_dimSize; ++i) + { + filterCoefMatrix[i] = m_coefFilterDen[i]; + filterCoefMatrix[m_dimSize + i] = m_coefFilterNum[i]; + } + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyITPP diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCComputeTemporalFilterCoefficients.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCComputeTemporalFilterCoefficients.h new file mode 100644 index 0000000..3dc41c0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCComputeTemporalFilterCoefficients.h @@ -0,0 +1,135 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyITPP + +#include "../ovp_defines.h" + +#include + +#include + +#include +#include + +#define PREC 27 +#define MAXEXP 1024 +#define MINEXP -1077 +#define MAXNUM 1.79769313486231570815E308 + +typedef struct +{ + double real; + double imag; +} cmplex; + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CComputeTemporalFilterCoefficients : virtual public Toolkit::TAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_ComputeTemporalFilterCoefs) + + // Functions for Butterworth and Chebyshev filters + void findSPlanePolesAndZeros(); + void convertSPlanePolesAndZerosToZPlane(); + // Functions for Complex arithmetic + double absComplex(cmplex* z) const; + void divComplex(cmplex* a, cmplex* b, cmplex* c) const; + void sqrtComplex(cmplex* z, cmplex* w) const; + static void addComplex(cmplex* a, cmplex* b, cmplex* c); + static void mulComplex(cmplex* a, cmplex* b, cmplex* c); + static void subComplex(cmplex* a, cmplex* b, cmplex* c); + +protected: + + Kernel::TParameterHandler ip_sampling; + Kernel::TParameterHandler ip_filterMethod; + Kernel::TParameterHandler ip_filterType; + Kernel::TParameterHandler ip_filterOrder; + Kernel::TParameterHandler ip_lowCutFrequency; + Kernel::TParameterHandler ip_highCutFrequency; + Kernel::TParameterHandler ip_bandPassRipple; + + Kernel::TParameterHandler op_matrix; + + size_t m_filterOrder = 0; + EFilterMethod m_filterMethod = EFilterMethod::Butterworth; + EFilterType m_filterType = EFilterType::BandPass; + double m_lowPassBandEdge = 0; + double m_highPassBandEdge = 0; + double m_passBandRipple = 0; + size_t m_arraySize = 0; + itpp::vec m_coefFilterNum; + itpp::vec m_coefFilterDen; + double m_phi = 0; + double m_scale = 0; + double m_tanAng = 0; + double m_cosGam = 0; + double m_cbp = 0; + + size_t m_sampling = 0; + size_t m_nyquist = 0; + + size_t m_nPoles = 0; + size_t m_nZeros = 0; + + itpp::vec m_zs; + size_t m_zOrd = 0; + + double m_rho = 0; + double m_eps = 0; + + size_t m_dimSize = 0; +}; + +class CComputeTemporalFilterCoefficientsDesc final : virtual public IAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Compute Filter Coefficients"); } + CString getAuthorName() const override { return CString("Guillaume Gibert"); } + CString getAuthorCompanyName() const override { return CString("INSERM/U821"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Algorithm/Signal processing/Filter"); } + CString getVersion() const override { return CString("1.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_ComputeTemporalFilterCoefs; } + IPluginObject* create() override { return new CComputeTemporalFilterCoefficients(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_Sampling, "Sampling frequency", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterMethod, "Filter method", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterType, "Filter type", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterOrder, "Filter order", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_LowCutFrequency, "Low cut frequency", + Kernel::ParameterType_Float); + prototype.addInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_HighCutFrequency, "High cut frequency", + Kernel::ParameterType_Float); + prototype.addInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_BandPassRipple, "Band pass ripple", Kernel::ParameterType_Float); + prototype.addOutputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_OutputParameterId_Matrix, "Matrix", Kernel::ParameterType_Matrix); + prototype.addInputTrigger(OVP_Algorithm_ComputeTemporalFilterCoefs_InputTriggerId_Initialize, "Initialize"); + prototype.addInputTrigger(OVP_Algorithm_ComputeTemporalFilterCoefs_InputTriggerId_ComputeCoefs, "Compute coefficients"); + + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_ComputeTemporalFilterCoefsDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyITPP diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCDetectingMinMax.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCDetectingMinMax.cpp new file mode 100644 index 0000000..e0cd802 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCDetectingMinMax.cpp @@ -0,0 +1,90 @@ +#include "ovpCDetectingMinMax.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +// ________________________________________________________________________________________________________________ +// + +bool CDetectingMinMax::initialize() +{ + ip_signalMatrix.initialize(getInputParameter(OVP_Algorithm_DetectingMinMax_InputParameterId_SignalMatrix)); + ip_sampling.initialize(getInputParameter(OVP_Algorithm_DetectingMinMax_InputParameterId_Sampling)); + ip_timeWindowStart.initialize(getInputParameter(OVP_Algorithm_DetectingMinMax_InputParameterId_TimeWindowStart)); + ip_timeWindowEnd.initialize(getInputParameter(OVP_Algorithm_DetectingMinMax_InputParameterId_TimeWindowEnd)); + + op_signalMatrix.initialize(getOutputParameter(OVP_Algorithm_DetectingMinMax_OutputParameterId_SignalMatrix)); + + return true; +} + +bool CDetectingMinMax::uninitialize() +{ + op_signalMatrix.uninitialize(); + + ip_timeWindowEnd.uninitialize(); + ip_timeWindowStart.uninitialize(); + ip_sampling.uninitialize(); + ip_signalMatrix.uninitialize(); + + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CDetectingMinMax::process() +{ + // signal input vars + CMatrix* iMatrix = ip_signalMatrix; + double* ibuffer = iMatrix->getBuffer(); + + // signal output vars + CMatrix* oMatrix = op_signalMatrix; + oMatrix->resize(1, 1); + + double* oBuffer = oMatrix->getBuffer(); + + if (isInputTriggerActive(OVP_Algorithm_DetectingMinMax_InputTriggerId_Initialize)) { } + + if (isInputTriggerActive(OVP_Algorithm_DetectingMinMax_InputTriggerId_DetectsMin)) + { + // dimension of input signal biuffer + const size_t nChannel = ip_signalMatrix->getDimensionSize(0); + const size_t EpochSize = ip_signalMatrix->getDimensionSize(1); + + // Must be changed + double minValue = 1E10; + + for (size_t i = 0; i < nChannel; ++i) + { + for (size_t j = 0; j < EpochSize; ++j) { if (ibuffer[i * EpochSize + j] < minValue) { minValue = ibuffer[i * EpochSize + j]; } } + } + oBuffer[0] = minValue; + } + + if (isInputTriggerActive(OVP_Algorithm_DetectingMinMax_InputTriggerId_DetectsMax)) + { + // dimension of input signal biuffer + const size_t nChannels = ip_signalMatrix->getDimensionSize(0); + const size_t epochSize = ip_signalMatrix->getDimensionSize(1); + + // Must be changed + double maxValue = -1E10; + + for (size_t i = 0; i < nChannels; ++i) + { + const uint64_t start = uint64_t(floor(ip_timeWindowStart / 1000. * ip_sampling)); + const uint64_t stop = uint64_t(floor(ip_timeWindowEnd / 1000. * ip_sampling)); + for (uint64_t j = start; j < stop; ++j) { if (ibuffer[i * epochSize + j] > maxValue) { maxValue = ibuffer[i * epochSize + j]; } } + } + oBuffer[0] = maxValue; + } + + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCDetectingMinMax.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCDetectingMinMax.h new file mode 100644 index 0000000..e63c4b3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCDetectingMinMax.h @@ -0,0 +1,70 @@ +#pragma once + +#include "../ovp_defines.h" + +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CDetectingMinMax final : virtual public Toolkit::TAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_DetectingMinMax) + +protected: + + Kernel::TParameterHandler ip_signalMatrix; + Kernel::TParameterHandler ip_sampling; + Kernel::TParameterHandler ip_timeWindowStart; + Kernel::TParameterHandler ip_timeWindowEnd; + + Kernel::TParameterHandler op_signalMatrix; +}; + +class CDetectingMinMaxDesc final : virtual public IAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Detects Min or Max of input buffer"); } + CString getAuthorName() const override { return CString("Guillaume Gibert"); } + CString getAuthorCompanyName() const override { return CString("INSERM/U821"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Algorithm/Signal processing/Basic"); } + CString getVersion() const override { return CString("1.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_DetectingMinMax; } + IPluginObject* create() override { return new CDetectingMinMax(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_DetectingMinMax_InputParameterId_SignalMatrix, "Signal input matrix", Kernel::ParameterType_Matrix); + prototype.addInputParameter(OVP_Algorithm_DetectingMinMax_InputParameterId_TimeWindowStart, "Time window start", Kernel::ParameterType_Float); + prototype.addInputParameter(OVP_Algorithm_DetectingMinMax_InputParameterId_TimeWindowEnd, "Time window end", Kernel::ParameterType_Float); + prototype.addInputParameter(OVP_Algorithm_DetectingMinMax_InputParameterId_Sampling, "Sampling frequency", Kernel::ParameterType_UInteger); + prototype.addOutputParameter(OVP_Algorithm_DetectingMinMax_OutputParameterId_SignalMatrix, "Signal output matrix", Kernel::ParameterType_Matrix); + prototype.addInputTrigger(OVP_Algorithm_DetectingMinMax_InputTriggerId_Initialize, "Initialize"); + prototype.addInputTrigger(OVP_Algorithm_DetectingMinMax_InputTriggerId_DetectsMin, "Detects min"); + prototype.addInputTrigger(OVP_Algorithm_DetectingMinMax_InputTriggerId_DetectsMax, "Detects max"); + + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_DetectingMinMaxDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCDownsampling.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCDownsampling.cpp new file mode 100644 index 0000000..77f1471 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCDownsampling.cpp @@ -0,0 +1,162 @@ +#include "ovpCDownsampling.h" + +#include //floor, ceil +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +// ________________________________________________________________________________________________________________ +// + +bool CDownsampling::initialize() +{ + ip_sampling.initialize(getInputParameter(OVP_Algorithm_Downsampling_InputParameterId_Sampling)); + ip_newSampling.initialize(getInputParameter(OVP_Algorithm_Downsampling_InputParameterId_NewSampling)); + ip_signalMatrix.initialize(getInputParameter(OVP_Algorithm_Downsampling_InputParameterId_SignalMatrix)); + op_signalMatrix.initialize(getOutputParameter(OVP_Algorithm_Downsampling_OutputParameterId_SignalMatrix)); + + m_lastValueOrigSignal = nullptr; + m_first = true; + + return true; +} + +bool CDownsampling::uninitialize() +{ + free(m_lastValueOrigSignal); + m_lastValueOrigSignal = nullptr; + + op_signalMatrix.uninitialize(); + ip_signalMatrix.uninitialize(); + ip_newSampling.uninitialize(); + ip_sampling.uninitialize(); + + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CDownsampling::process() +{ + size_t oEpochSize, indexBegOutput; + double blocDuration, endTime; + + // signal input vars + CMatrix* iMatrix = ip_signalMatrix; + double* iBuffer = iMatrix->getBuffer(); + const size_t nChannels = ip_signalMatrix->getDimensionSize(0); + const size_t iEpochSize = ip_signalMatrix->getDimensionSize(1); + + const double iSampling = double(ip_sampling); + const double oSampling = double(ip_newSampling); + + // signal output vars + CMatrix* oMatrix = op_signalMatrix; + oMatrix->setDimensionCount(ip_signalMatrix->getDimensionCount()); + if ((m_first) || (isInputTriggerActive(OVP_Algorithm_Downsampling_InputTriggerId_Resample))) + { + oEpochSize = size_t(floor(iEpochSize * (oSampling / iSampling))); + + blocDuration = double(iEpochSize - 1) / iSampling; + endTime = blocDuration; + + m_lastTimeOrigSignal = 0; + m_lastTimeNewSignal = 0; + + if (m_first) + { + m_lastValueOrigSignal = static_cast(calloc(nChannels, sizeof(double))); + if (m_lastValueOrigSignal == nullptr) { this->getLogManager() << Kernel::LogLevel_Error << "Memory allocation : last values of original signal.\n"; } + } + } + else + { + blocDuration = double(iEpochSize) / iSampling; + endTime = m_lastTimeOrigSignal + blocDuration; + const double timePassed = endTime - m_lastTimeNewSignal; + oEpochSize = size_t(floor(timePassed * oSampling)); + } + + if (oEpochSize == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Output epoch size is 0. Increase input epoch size.\n"; + return false; + } + + // this->getLogManager() << Kernel::LogLevel_Info << "blockDur " << blocDuration << " et " << endTime << " lt " << m_lastTimeNewSignal << " td " << timeDiff << " dim " << oMatrixDimensionSizeEpoch << "\n"; + + oMatrix->setDimensionSize(0, nChannels); + oMatrix->setDimensionSize(1, oEpochSize); + double* oBuffer = oMatrix->getBuffer(); + + if (isInputTriggerActive(OVP_Algorithm_Downsampling_InputTriggerId_Initialize)) { } + + if ((isInputTriggerActive(OVP_Algorithm_Downsampling_InputTriggerId_ResampleWithHistoric)) + || (isInputTriggerActive(OVP_Algorithm_Downsampling_InputTriggerId_Resample))) + { + double countNew = 0, prev; + int indexInput; + + for (size_t i = 0; i < nChannels; ++i) + { + double countOrig = m_lastTimeOrigSignal; + countNew = m_lastTimeNewSignal + (1.0 / double(ip_newSampling)); + double timePrev = m_lastTimeOrigSignal; + if ((m_first) || (isInputTriggerActive(OVP_Algorithm_Downsampling_InputTriggerId_Resample))) + { + prev = iBuffer[i * iEpochSize]; + oBuffer[i * oEpochSize] = prev; + indexBegOutput = 1; + indexInput = 0; + } + else + { + prev = m_lastValueOrigSignal[i]; + indexBegOutput = 0; + indexInput = -1; + } + for (uint64_t j = indexBegOutput; j < oEpochSize; ++j) + { + while ((indexInput < int(iEpochSize)) && (countOrig < countNew)) + { + countOrig += 1.0 / double(ip_sampling); + indexInput++; + } + + if (indexInput == -1) { this->getLogManager() << Kernel::LogLevel_Warning << "Downsampling problem : index value=-1\n"; } + else if (indexInput < int(iEpochSize)) + { + const double cur = iBuffer[(i * iEpochSize) + indexInput]; + oBuffer[(i * oEpochSize) + j] = ((cur - prev) * (countNew - timePrev) / (countOrig - timePrev)) + prev; + prev = cur; + timePrev = countOrig; + } + else + { + this->getLogManager() << Kernel::LogLevel_Warning << "Downsampling problem : sample #" << j << "/" << oEpochSize << + " time original signal=" << countOrig << " time new signal=" << countNew << " new signal sample #" << indexInput << + " /" << iEpochSize << "\n"; + j = oEpochSize; + } + + countNew += 1.0 / oSampling; + } + + if (oEpochSize > 0) { m_lastValueOrigSignal[i] = iBuffer[(i * iEpochSize) + iEpochSize - 1]; } + } + if (oEpochSize > 0) + { + m_lastTimeNewSignal = countNew - (1.0 / oSampling); + m_lastTimeOrigSignal = endTime; + } + if (m_first) { m_first = false; } + } + + + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCDownsampling.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCDownsampling.h new file mode 100644 index 0000000..d902afb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/algorithms/ovpCDownsampling.h @@ -0,0 +1,69 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CDownsampling final : virtual public Toolkit::TAlgorithm +{ +public: + + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_Downsampling) + +protected: + + Kernel::TParameterHandler ip_sampling; + Kernel::TParameterHandler ip_newSampling; + Kernel::TParameterHandler ip_signalMatrix; + Kernel::TParameterHandler op_signalMatrix; + double* m_lastValueOrigSignal = nullptr; + double m_lastTimeOrigSignal = 0; + double m_lastTimeNewSignal = 0; + bool m_first = false; +}; + +class CDownsamplingDesc final : virtual public IAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Downsampling"); } + CString getAuthorName() const override { return CString("G. Gibert - E. Maby - P.E. Aguera"); } + CString getAuthorCompanyName() const override { return CString("INSERM/U821"); } + CString getShortDescription() const override { return CString("Downsamples input signal."); } + + CString getDetailedDescription() const override { return CString("Downsamples input signal to the new sampling rate chosen by user."); } + + CString getCategory() const override { return CString("Signal processing Gpl/Basic"); } + CString getVersion() const override { return CString("1.1"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_Downsampling; } + IPluginObject* create() override { return new CDownsampling(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_Downsampling_InputParameterId_Sampling, "Sampling frequency", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_Downsampling_InputParameterId_NewSampling, "New sampling frequency", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_Downsampling_InputParameterId_SignalMatrix, "Signal matrix", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_Downsampling_OutputParameterId_SignalMatrix, "Signal matrix", Kernel::ParameterType_Matrix); + prototype.addInputTrigger(OVP_Algorithm_Downsampling_InputTriggerId_Initialize, "Initialize"); + prototype.addInputTrigger(OVP_Algorithm_Downsampling_InputTriggerId_Resample, "Resample"); + prototype.addInputTrigger(OVP_Algorithm_Downsampling_InputTriggerId_ResampleWithHistoric, "Resample with historic"); + + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_DownsamplingDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmCSPSpatialFilterTrainer.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmCSPSpatialFilterTrainer.cpp new file mode 100644 index 0000000..1127369 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmCSPSpatialFilterTrainer.cpp @@ -0,0 +1,307 @@ +#if defined TARGET_HAS_ThirdPartyITPP + +#include "ovpCBoxAlgorithmCSPSpatialFilterTrainer.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +// Taken from http://techlogbook.wordpress.com/2009/08/12/adding-generalized-eigenvalue-functions-to-it +// http://techlogbook.wordpress.com/2009/08/12/calling-lapack-functions-from-c-codes +// http://sourceforge.net/projects/itpp/forums/forum/115656/topic/3363490?message=7557038 +// +// http://icl.cs.utk.edu/projectsfiles/f2j/javadoc/org/netlib/lapack/DSYGV.html +// http://www.lassp.cornell.edu/sethna/GeneDynamics/NetworkCodeDocumentation/lapack_8h.html#a17 + +namespace { +extern "C" { +// This symbol comes from LAPACK +/* + void zggev_(char *jobvl, char *jobvr, int *n, std::complex *a, + int *lda, std::complex *b, int *ldb, std::complex *alpha, + std::complex *beta, std::complex *vl, + int *ldvl, std::complex *vr, int *ldvr, + std::complex *work, int *lwork, double *rwork, int *info); +*/ +int dsygv_(int* itype, char* jobz, char* uplo, int* n, double* a, + int* lda, double* b, int* ldb, double* w, double* work, int* lwork, int* info); +} +} // namespace + +namespace itppextcsp { +itpp::mat convert(const CMatrix& matrix) +{ + itpp::mat res(matrix.getDimensionSize(1), matrix.getDimensionSize(0)); + if (matrix.getBufferElementCount() != 0) { memcpy(res._data(), matrix.getBuffer(), matrix.getBufferElementCount() * sizeof(double)); } + return res.transpose(); +} + +itpp::mat cov(const itpp::mat& matrix) +{ + itpp::mat centered = repmat(sum(matrix, 2), 1, matrix.cols(), false); + centered = centered / double(matrix.cols()); + centered = matrix - centered; + itpp::mat res = centered * centered.transpose(); + res = res / double(matrix.cols() - 1); + res = res / trace(res); + return res; +} +} // namespace itppextcsp + +bool CBoxAlgorithmCSPSpatialFilterTrainer::initialize() +{ + m_stimDecoder = new Toolkit::TStimulationDecoder(); + m_stimDecoder->initialize(*this, 0); + + m_signalDecoderCondition1 = new Toolkit::TSignalDecoder(); + m_signalDecoderCondition1->initialize(*this, 1); + + m_signalDecoderCondition2 = new Toolkit::TSignalDecoder(); + m_signalDecoderCondition2->initialize(*this, 2); + + m_encoder.initialize(*this, 0); + + m_stimID = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_spatialFilterConfigFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_filterDimension = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2)); + m_saveAsBoxConfig = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + + return true; +} + +bool CBoxAlgorithmCSPSpatialFilterTrainer::uninitialize() +{ + m_signalDecoderCondition1->uninitialize(); + delete m_signalDecoderCondition1; + m_signalDecoderCondition2->uninitialize(); + delete m_signalDecoderCondition2; + m_stimDecoder->uninitialize(); + delete m_stimDecoder; + + m_encoder.uninitialize(); + + return true; +} + +bool CBoxAlgorithmCSPSpatialFilterTrainer::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmCSPSpatialFilterTrainer::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + bool shouldTrain = false; + uint64_t date = 0, startTime = 0, endTime = 0; + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_stimDecoder->decode(i); + if (m_stimDecoder->isHeaderReceived()) + { + m_encoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + if (m_stimDecoder->isBufferReceived()) + { + Kernel::TParameterHandler op_stimSet(m_stimDecoder->getOutputStimulationSet()); + for (size_t j = 0; j < op_stimSet->getStimulationCount(); ++j) { shouldTrain |= (op_stimSet->getStimulationIdentifier(j) == m_stimID); } + if (shouldTrain) + { + date = op_stimSet->getStimulationDate(op_stimSet->getStimulationCount() - 1); + startTime = boxContext.getInputChunkStartTime(0, i); + endTime = boxContext.getInputChunkEndTime(0, i); + } + } + if (m_stimDecoder->isEndReceived()) { m_encoder.encodeEnd(); } + boxContext.markInputAsDeprecated(0, i); + } + + if (shouldTrain) + { + this->getLogManager() << Kernel::LogLevel_Info << "Received train stimulation - be patient\n"; + + this->getLogManager() << Kernel::LogLevel_Trace << "Estimating cov for condition 1...\n"; + + itpp::mat covarianceMatrixCondition1; + int nCondition1Trials = 0; + int condition1ChunkSize = 0; + int condition2ChunkSize = 0; + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + m_signalDecoderCondition1->decode(i); + if (m_signalDecoderCondition1->isHeaderReceived()) + { + Kernel::TParameterHandler ip_matrix(m_signalDecoderCondition1->getOutputMatrix()); + covarianceMatrixCondition1.set_size(ip_matrix->getDimensionSize(0), ip_matrix->getDimensionSize(0)); + covarianceMatrixCondition1.zeros(); + + condition1ChunkSize = ip_matrix->getDimensionSize(1); + this->getLogManager() << Kernel::LogLevel_Debug << "Cov matrix size for condition 1 is [" << ip_matrix->getDimensionSize(0) << "x" + << ip_matrix->getDimensionSize(0) << "], chunk size is " << condition1ChunkSize << " samples\n"; + } + if (m_signalDecoderCondition1->isBufferReceived()) + { + Kernel::TParameterHandler ip_matrix(m_signalDecoderCondition1->getOutputMatrix()); + itpp::mat matrix = itppextcsp::convert(*ip_matrix); + covarianceMatrixCondition1 += itppextcsp::cov(matrix); + nCondition1Trials++; + } + if (m_signalDecoderCondition1->isEndReceived()) { } + boxContext.markInputAsDeprecated(1, i); + } + covarianceMatrixCondition1 = covarianceMatrixCondition1 / double(nCondition1Trials); + this->getLogManager() << Kernel::LogLevel_Trace << "Number of chunks for condition 1: " << nCondition1Trials << "\n"; + this->getLogManager() << Kernel::LogLevel_Trace << "Estimating cov for condition 2...\n"; + + itpp::mat covarianceMatrixCondition2; + int nCondition2Trials = 0; + for (size_t i = 0; i < boxContext.getInputChunkCount(2); ++i) + { + m_signalDecoderCondition2->decode(i); + if (m_signalDecoderCondition2->isHeaderReceived()) + { + Kernel::TParameterHandler ip_matrix(m_signalDecoderCondition2->getOutputMatrix()); + covarianceMatrixCondition2.set_size(ip_matrix->getDimensionSize(0), ip_matrix->getDimensionSize(0)); + covarianceMatrixCondition2.zeros(); + + condition2ChunkSize = ip_matrix->getDimensionSize(1); + this->getLogManager() << Kernel::LogLevel_Debug << "Cov matrix size for condition 2 is [" << ip_matrix->getDimensionSize(0) << "x" + << ip_matrix->getDimensionSize(0) << "], chunk size is " << condition2ChunkSize << " samples\n"; + } + if (m_signalDecoderCondition2->isBufferReceived()) + { + Kernel::TParameterHandler ip_matrix(m_signalDecoderCondition2->getOutputMatrix()); + itpp::mat matrix = itppextcsp::convert(*ip_matrix); + covarianceMatrixCondition2 += itppextcsp::cov(matrix); + nCondition2Trials++; + } + if (m_signalDecoderCondition2->isEndReceived()) { } + boxContext.markInputAsDeprecated(2, i); + } + covarianceMatrixCondition2 = covarianceMatrixCondition2 / double(nCondition2Trials); + + if (covarianceMatrixCondition1.cols() != covarianceMatrixCondition2.cols()) + { + this->getLogManager() << Kernel::LogLevel_Error << "The two inputs do not seem to have the same number of channels, " + << covarianceMatrixCondition1.cols() << " vs " << covarianceMatrixCondition2.cols() << "\n"; + return false; + } + + this->getLogManager() << Kernel::LogLevel_Info << "Data covariance dims are [" << covarianceMatrixCondition1.rows() << "x" << covarianceMatrixCondition1.cols() + << "]. Number of samples per condition : \n"; + this->getLogManager() << Kernel::LogLevel_Info << " cond1 = " << nCondition1Trials << " chunks, sized " << condition1ChunkSize << " -> " + << nCondition1Trials * condition1ChunkSize << " samples\n"; + this->getLogManager() << Kernel::LogLevel_Info << " cond2 = " << nCondition2Trials << " chunks, sized " << condition2ChunkSize << " -> " + << nCondition2Trials * condition2ChunkSize << " samples\n"; + + if (nCondition1Trials == 0 || nCondition2Trials == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "No signal received... Can't continue\n"; + return true; + } + + this->getLogManager() << Kernel::LogLevel_Trace << "Computing eigen vector decomposition...\n"; + + itpp::cmat eigenVector; + itpp::cvec eigenValue; + size_t nChannel = covarianceMatrixCondition1.rows(); + + if (eig(inv(covarianceMatrixCondition2) * covarianceMatrixCondition1, eigenValue, eigenVector)) + { + std::map vEigenVector; + for (size_t i = 0; i < nChannel; ++i) + { + itpp::cvec v = eigenVector.get_col(i); + vEigenVector[itpp::real(eigenValue)[i]] = itpp::real(v); + } + + // Collect the output vectors here + CMatrix outputVectors(m_filterDimension, nChannel); + + size_t steps = 0, cnt = 0; + this->getLogManager() << Kernel::LogLevel_Debug << "lowest eigenvalues: " << "\n"; + for (auto it = vEigenVector.begin(); it != vEigenVector.end() && steps < ceil(m_filterDimension / 2.0); ++it, steps++) + { + this->getLogManager() << Kernel::LogLevel_Debug << it->first << ", "; + for (size_t j = 0; j < nChannel; ++j) { outputVectors.getBuffer()[cnt++] = it->second[j]; } + } + this->getLogManager() << Kernel::LogLevel_Debug << "\n"; + this->getLogManager() << Kernel::LogLevel_Debug << "highest eigenvalues: " << "\n"; + steps = 0; + for (auto it = vEigenVector.rbegin(); it != vEigenVector.rend() && steps < floor(m_filterDimension / 2.0); ++it, steps++) + { + this->getLogManager() << Kernel::LogLevel_Debug << it->first << ", "; + for (size_t j = 0; j < nChannel; ++j) { outputVectors.getBuffer()[cnt++] = it->second[j]; } + } + this->getLogManager() << Kernel::LogLevel_Debug << "\n"; + + if (m_saveAsBoxConfig) + { + FILE* file = fopen(m_spatialFilterConfigFilename.toASCIIString(), "wb"); + if (!file) + { + this->getLogManager() << Kernel::LogLevel_Error << "The file [" << m_spatialFilterConfigFilename << + "] could not be opened for writing...\n"; + return false; + } + + fprintf(file, "\n"); + fprintf(file, "\t"); + + cnt = 0; + for (size_t i = 0; i < m_filterDimension; ++i) + { + for (size_t j = 0; j < nChannel; ++j) { fprintf(file, "%e ", outputVectors.getBuffer()[cnt++]); } + } + + fprintf(file, "\n"); + fprintf(file, "\t%d\n", m_filterDimension); + fprintf(file, "\t%d\n", nChannel); + fprintf(file, "\t\n"); + fprintf(file, "\n"); + fclose(file); + } + else + { + if (!Toolkit::Matrix::saveToTextFile(outputVectors, m_spatialFilterConfigFilename)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Unable to save to [" << m_spatialFilterConfigFilename << "\n"; + return false; + } + } + } + else + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Eigen vector decomposition failed...\n"; + return true; + } + + this->getLogManager() << Kernel::LogLevel_Info << "CSP Spatial filter trained successfully.\n"; + + m_encoder.getInputStimulationSet()->clear(); + m_encoder.getInputStimulationSet()->appendStimulation(OVTK_StimulationId_TrainCompleted, date, 0); + m_encoder.encodeBuffer(); + + boxContext.markOutputAsReadyToSend(0, startTime, endTime); + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyITPP diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmCSPSpatialFilterTrainer.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmCSPSpatialFilterTrainer.h new file mode 100644 index 0000000..5905e06 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmCSPSpatialFilterTrainer.h @@ -0,0 +1,88 @@ +// @copyright notice: Possibly due to dependencies, this box used to be GPL before upgrade to AGPL3 + +#pragma once +#include "../ovp_defines.h" + +#if defined TARGET_HAS_ThirdPartyITPP + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmCSPSpatialFilterTrainer final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_CSPSpatialFilterTrainer) + +protected: + + Toolkit::TStimulationDecoder* m_stimDecoder = nullptr; + Toolkit::TSignalDecoder* m_signalDecoderCondition1 = nullptr; + Toolkit::TSignalDecoder* m_signalDecoderCondition2 = nullptr; + + + Toolkit::TStimulationEncoder m_encoder; + + uint64_t m_stimID = 0; + CString m_spatialFilterConfigFilename; + size_t m_filterDimension = 0; + bool m_saveAsBoxConfig = false; +}; + +class CBoxAlgorithmCSPSpatialFilterTrainerDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("CSP Spatial Filter Trainer"); } + CString getAuthorName() const override { return CString("Dieter Devlaminck"); } + CString getAuthorCompanyName() const override { return CString("Ghent University"); } + + CString getShortDescription() const override { return CString("Computes spatial filter coeffcients according to the Common Spatial Pattern algorithm."); } + + CString getDetailedDescription() const override + { + return CString( + "The CSP algortihm increases the signal variance for one condition while minimizing the variance for the other condition."); + } + + CString getCategory() const override { return CString("Signal processing/Filtering"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString(""); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_CSPSpatialFilterTrainer; } + IPluginObject* create() override { return new CBoxAlgorithmCSPSpatialFilterTrainer; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Stimulations", OV_TypeId_Stimulations); + prototype.addInput("Signal condition 1", OV_TypeId_Signal); + prototype.addInput("Signal condition 2", OV_TypeId_Signal); + prototype.addSetting("Train Trigger", OV_TypeId_Stimulation, "OVTK_GDF_End_Of_Session"); + prototype.addSetting("Spatial filter configuration", OV_TypeId_Filename, ""); + prototype.addSetting("Filter dimension", OV_TypeId_Integer, "2"); + prototype.addSetting("Save as box config", OV_TypeId_Boolean, "true"); + + prototype.addOutput("Train-completed Flag", OV_TypeId_Stimulations); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_CSPSpatialFilterTrainerDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyITPP diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSynchro.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSynchro.cpp new file mode 100644 index 0000000..ad98069 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSynchro.cpp @@ -0,0 +1,68 @@ +#include "ovpCBoxAlgorithmSynchro.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmSynchro::initialize() +{ + m_inputChannel.initialize(this); + m_outputChannel.initialize(this); + m_stimulationReceivedStart = false; + return true; +} + +bool CBoxAlgorithmSynchro::uninitialize() +{ + m_inputChannel.uninitialize(); + m_outputChannel.uninitialize(); + return true; +} + +bool CBoxAlgorithmSynchro::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmSynchro::process() +{ + // FIXME is it necessary to keep next line uncomment ? + //IBoxIO& boxContext = this->getDynamicBoxContext(); + + if (m_inputChannel.isWorking()) + { + // process stimulations + for (size_t index = 0, nb = m_inputChannel.getNStimulationBuffers(); index < nb; ++index) + { + uint64_t startTime, endTime; + IStimulationSet* stimset = m_inputChannel.getStimulation(startTime, endTime, index); + + if (!stimset) { break; } + + m_outputChannel.sendStimulation(stimset, startTime, endTime); + } + // process signal + for (size_t index = 0, nb = m_inputChannel.getNSignalBuffers(); index < nb; ++index) + { + uint64_t startTime, endTime; + CMatrix* matrix = m_inputChannel.getSignal(startTime, endTime, index++); + + if (!matrix) { break; } + + m_outputChannel.sendSignal(matrix, startTime, endTime); + } + } + else if (m_inputChannel.hasSynchro()) + { + m_outputChannel.processSynchroSignal(m_inputChannel.getStimulationPosition(), m_inputChannel.getSignalPosition()); + m_inputChannel.startWorking(); + } + else if (m_inputChannel.hasHeader()) { m_inputChannel.waitForSynchro(); } + else if (m_inputChannel.waitForSignalHeader()) { m_outputChannel.sendHeader(m_inputChannel.getSamplingRate(), m_inputChannel.getMatrixPtr()); } + + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSynchro.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSynchro.h new file mode 100644 index 0000000..f163b34 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSynchro.h @@ -0,0 +1,72 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include "ovpCInputChannel.h" +#include "ovpCOutputChannel.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmSynchro final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_Synchro) + +protected: + + //Intern ressources + bool m_stimulationReceivedStart = false; + + // new + CInputChannel m_inputChannel; + COutputChannel m_outputChannel; +}; + +class CBoxAlgorithmSynchroDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Stream Synchronization"); } + CString getAuthorName() const override { return CString("Gelu Ionescu & Matthieu Goyat"); } + CString getAuthorCompanyName() const override { return CString("GIPSA-lab"); } + CString getShortDescription() const override { return CString("Synchronize two acquisition servers"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Signal processing/Basic"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-missing-image"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_Synchro; } + IPluginObject* create() override { return new CBoxAlgorithmSynchro; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addInput("Input stimulation", OV_TypeId_Stimulations); + prototype.addOutput("Output signal", OV_TypeId_Signal); + prototype.addOutput("Output stimulation", OV_TypeId_Stimulations); + prototype.addSetting("Synchronisation stimulation", OV_TypeId_Stimulation, "OVTK_StimulationId_ExperimentStart"); + // prototype.addFlag (Kernel::BoxFlag_CanModifyInput); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_SynchroDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmUnivariateStatistics.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmUnivariateStatistics.cpp new file mode 100644 index 0000000..2dafe4b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmUnivariateStatistics.cpp @@ -0,0 +1,360 @@ +#include "ovpCBoxAlgorithmUnivariateStatistics.h" +#include "../algorithms/ovpCAlgorithmUnivariateStatistics.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxUnivariateStatistic::initialize() +{ + //initialise en/decoder function of the input type + this->getStaticBoxContext().getInputType(0, m_inputTypeID); + +#if 0 // this is not needed as you know you always habe signal + if(m_inputTypeID==OV_TypeId_StreamedMatrix) + { + m_decoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixDecoder)); + m_meanEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder)); + m_varianceEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder)); + m_rangeEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder)); + m_medianEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder)); + m_iqrEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder)); + m_percentileEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder)); + } + else if(m_inputTypeID==OV_TypeId_FeatureVector) + { + m_decoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorDecoder)); + m_meanEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorEncoder)); + m_varianceEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorEncoder)); + m_rangeEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorEncoder)); + m_medianEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorEncoder)); + m_iqrEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorEncoder)); + m_percentileEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorEncoder)); + } + else if(m_inputTypeID==OV_TypeId_Signal) + { +#endif + m_decoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalDecoder)); + m_meanEncoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + m_varianceEncoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + m_rangeEncoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + m_medianEncoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + m_iqrEncoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + m_percentileEncoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); +#if 0 // this is not needed as you know you always habe signal + } + else if(m_inputTypeID==OV_TypeId_Spectrum) + { + m_decoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumDecoder)); + m_meanEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumEncoder)); + m_varianceEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumEncoder)); + m_rangeEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumEncoder)); + m_medianEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumEncoder)); + m_iqrEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumEncoder)); + m_percentileEncoder=&getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumEncoder)); + } + else + { + this->getLogManager() << Kernel::LogLevel_Debug << "Input type is not planned : no matrix base. This box can't work, so it is disabled\n"; + return false; + } +#endif + + m_decoder->initialize(); + m_meanEncoder->initialize(); + m_varianceEncoder->initialize(); + m_rangeEncoder->initialize(); + m_medianEncoder->initialize(); + m_iqrEncoder->initialize(); + m_percentileEncoder->initialize(); + + //initialize the real algorithm this box encapsulate + m_matrixStatistic = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_AlgoUnivariateStatistic)); + m_matrixStatistic->initialize(); + + //initialize all handlers + m_matrixStatistic->getInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_Matrix)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + m_meanEncoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)->setReferenceTarget( + m_matrixStatistic->getOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Mean)); + m_varianceEncoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)->setReferenceTarget( + m_matrixStatistic->getOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Var)); + m_rangeEncoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)->setReferenceTarget( + m_matrixStatistic->getOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Range)); + m_medianEncoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)->setReferenceTarget( + m_matrixStatistic->getOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Med)); + m_iqrEncoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)->setReferenceTarget( + m_matrixStatistic->getOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_IQR)); + m_percentileEncoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)->setReferenceTarget( + m_matrixStatistic->getOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Percent)); + +#if 0 // this is not needed as you know you always habe signal + + /// specific connection for what is different of matrix base + if(m_inputTypeID==OV_TypeId_Signal) + { +#endif + op_sampling.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + m_meanEncoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + m_varianceEncoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + m_rangeEncoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + m_medianEncoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + m_iqrEncoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + m_percentileEncoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); +#if 0 // this is not needed as you know you always habe signal + } + else if(m_inputTypeID==OV_TypeId_Spectrum) + { + m_meanEncoder->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_MinMaxFrequencyBands)->setReferenceTarget(m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_MinMaxFrequencyBands)); + m_varianceEncoder->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_MinMaxFrequencyBands)->setReferenceTarget(m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_MinMaxFrequencyBands)); + m_rangeEncoder->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_MinMaxFrequencyBands)->setReferenceTarget(m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_MinMaxFrequencyBands)); + m_medianEncoder->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_MinMaxFrequencyBands)->setReferenceTarget(m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_MinMaxFrequencyBands)); + m_iqrEncoder->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_MinMaxFrequencyBands)->setReferenceTarget(m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_MinMaxFrequencyBands)); + m_percentileEncoder->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_MinMaxFrequencyBands)->setReferenceTarget(m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_MinMaxFrequencyBands)); + } +#endif + + op_compression.initialize(m_matrixStatistic->getOutputParameter(OVP_Algorithm_UnivariateStatistic_OutputParameterId_Compression)); + + ip_isMeanActive.initialize(m_matrixStatistic->getInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_MeanActive)); + ip_isVarianceActive.initialize(m_matrixStatistic->getInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_VarActive)); + ip_isRangeActive.initialize(m_matrixStatistic->getInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_RangeActive)); + ip_isMedianActive.initialize(m_matrixStatistic->getInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_MedActive)); + ip_isIQRActive.initialize(m_matrixStatistic->getInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_IQRActive)); + ip_isPercentileActive.initialize(m_matrixStatistic->getInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_PercentActive)); + + //get dis/enabled output wanted + ip_isMeanActive = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + ip_isVarianceActive = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + ip_isRangeActive = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + ip_isMedianActive = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + ip_isIQRActive = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + ip_isPercentileActive = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5); + + //the percentile value + ip_parameterValue.initialize(m_matrixStatistic->getInputParameter(OVP_Algorithm_UnivariateStatistic_InputParameterId_PercentValue)); + ip_parameterValue = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 6); + + return true; +} + +bool CBoxUnivariateStatistic::uninitialize() +{ +#if 0 + if(m_inputTypeID==OV_TypeId_Signal) + { +#endif + op_sampling.uninitialize(); +#if 0 + } +#endif + + ip_parameterValue.uninitialize(); + + m_matrixStatistic->uninitialize(); + m_meanEncoder->uninitialize(); + m_varianceEncoder->uninitialize(); + m_rangeEncoder->uninitialize(); + m_medianEncoder->uninitialize(); + m_iqrEncoder->uninitialize(); + m_percentileEncoder->uninitialize(); + m_decoder->uninitialize(); + + this->getAlgorithmManager().releaseAlgorithm(*m_matrixStatistic); + this->getAlgorithmManager().releaseAlgorithm(*m_meanEncoder); + this->getAlgorithmManager().releaseAlgorithm(*m_varianceEncoder); + this->getAlgorithmManager().releaseAlgorithm(*m_rangeEncoder); + this->getAlgorithmManager().releaseAlgorithm(*m_medianEncoder); + this->getAlgorithmManager().releaseAlgorithm(*m_iqrEncoder); + this->getAlgorithmManager().releaseAlgorithm(*m_percentileEncoder); + this->getAlgorithmManager().releaseAlgorithm(*m_decoder); + + return true; +} + +bool CBoxUnivariateStatistic::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxUnivariateStatistic::process() +{ + Kernel::IBoxIO& boxContext = getDynamicBoxContext(); + + //for each input, calculate statistics and return the value + for (size_t j = 0; j < boxContext.getInputChunkCount(0); ++j) + { + Kernel::TParameterHandler iBufferHandle( + m_decoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_InputParameterId_MemoryBufferToDecode)); + Kernel::TParameterHandler oBufferHandleMean( + m_meanEncoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + Kernel::TParameterHandler oBufferHandleVar( + m_varianceEncoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + Kernel::TParameterHandler oBufferHandleRange( + m_rangeEncoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + Kernel::TParameterHandler oBufferHandleMedian( + m_medianEncoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + Kernel::TParameterHandler oBufferHandleIqr( + m_iqrEncoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + Kernel::TParameterHandler oBufferHandlePercent( + m_percentileEncoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + iBufferHandle = boxContext.getInputChunk(0, j); + oBufferHandleMean = boxContext.getOutputChunk(0); + oBufferHandleVar = boxContext.getOutputChunk(1); + oBufferHandleRange = boxContext.getOutputChunk(2); + oBufferHandleMedian = boxContext.getOutputChunk(3); + oBufferHandleIqr = boxContext.getOutputChunk(4); + oBufferHandlePercent = boxContext.getOutputChunk(5); + + m_decoder->process(); + + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedHeader)) + { + m_matrixStatistic->process(OVP_Algorithm_UnivariateStatistic_InputTriggerId_Initialize); + +#if 0 // this is not needed as you know you always habe signal + if(m_inputTypeID==OV_TypeId_FeatureVector) + { + } + if(m_inputTypeID==OV_TypeId_Signal) + { +#endif + this->getLogManager() << Kernel::LogLevel_Debug << "DownSampling information : " << op_sampling << "*" << op_compression << "=>" << + op_sampling * op_compression << "\n"; + op_sampling = uint64_t(op_sampling * op_compression); + if (op_sampling == 0) { this->getLogManager() << Kernel::LogLevel_Warning << "Output sampling Rate is null, it could produce problem in next boxes \n"; } +#if 0 // this is not needed as you know you always habe signal + } + else if(m_inputTypeID==OV_TypeId_Spectrum) + { + } +#endif + + if (ip_isMeanActive) + { + m_meanEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + if (ip_isVarianceActive) + { + m_varianceEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader); + boxContext.markOutputAsReadyToSend(1, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + if (ip_isRangeActive) + { + m_rangeEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader); + boxContext.markOutputAsReadyToSend(2, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + if (ip_isMedianActive) + { + m_medianEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader); + boxContext.markOutputAsReadyToSend(3, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + if (ip_isIQRActive) + { + m_iqrEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader); + boxContext.markOutputAsReadyToSend(4, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + if (ip_isPercentileActive) + { + m_percentileEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader); + boxContext.markOutputAsReadyToSend(5, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + }//end header + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedBuffer)) + { + m_matrixStatistic->process(OVP_Algorithm_UnivariateStatistic_InputTriggerId_Process); + if (m_matrixStatistic->isOutputTriggerActive(OVP_Algorithm_UnivariateStatistic_OutputTriggerId_ProcessDone)) + { +#if 0 + if(m_inputTypeID == OV_TypeId_FeatureVector) { } + if(m_inputTypeID == OV_TypeId_Signal) { } + else if(m_inputTypeID == OV_TypeId_Spectrum) { } +#endif + if (ip_isMeanActive) + { + m_meanEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + if (ip_isVarianceActive) + { + m_varianceEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(1, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + if (ip_isRangeActive) + { + m_rangeEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(2, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + if (ip_isMedianActive) + { + m_medianEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(3, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + if (ip_isIQRActive) + { + m_iqrEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(4, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + if (ip_isPercentileActive) + { + m_percentileEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(5, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + } + else { this->getLogManager() << Kernel::LogLevel_Debug << "Process not activated\n"; } + }//end buffer + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedEnd)) + { +#if 0 + if(m_inputTypeID == OV_TypeId_FeatureVector) { } + if(m_inputTypeID == OV_TypeId_Signal) { } + else if(m_inputTypeID == OV_TypeId_Spectrum) { } +#endif + if (ip_isMeanActive) + { + m_meanEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + if (ip_isVarianceActive) + { + m_varianceEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd); + boxContext.markOutputAsReadyToSend(1, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + if (ip_isRangeActive) + { + m_rangeEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd); + boxContext.markOutputAsReadyToSend(2, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + if (ip_isMedianActive) + { + m_medianEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd); + boxContext.markOutputAsReadyToSend(3, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + if (ip_isIQRActive) + { + m_iqrEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd); + boxContext.markOutputAsReadyToSend(4, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + if (ip_isPercentileActive) + { + m_percentileEncoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd); + boxContext.markOutputAsReadyToSend(5, boxContext.getInputChunkStartTime(0, j), boxContext.getInputChunkEndTime(0, j)); + } + }//end ender + + boxContext.markInputAsDeprecated(0, j); + } + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmUnivariateStatistics.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmUnivariateStatistics.h new file mode 100644 index 0000000..e5b0599 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmUnivariateStatistics.h @@ -0,0 +1,88 @@ +#pragma once + +#include "../ovp_defines.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxUnivariateStatistic final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_UnivariateStatistic) + +protected: + + Kernel::IAlgorithmProxy* m_decoder = nullptr; + Kernel::IAlgorithmProxy* m_meanEncoder = nullptr; + Kernel::IAlgorithmProxy* m_varianceEncoder = nullptr; + Kernel::IAlgorithmProxy* m_rangeEncoder = nullptr; + Kernel::IAlgorithmProxy* m_medianEncoder = nullptr; + Kernel::IAlgorithmProxy* m_iqrEncoder = nullptr; + Kernel::IAlgorithmProxy* m_percentileEncoder = nullptr; + Kernel::IAlgorithmProxy* m_matrixStatistic = nullptr; + + Kernel::TParameterHandler op_compression; + Kernel::TParameterHandler op_sampling; + + Kernel::TParameterHandler ip_isMeanActive; + Kernel::TParameterHandler ip_isVarianceActive; + Kernel::TParameterHandler ip_isRangeActive; + Kernel::TParameterHandler ip_isMedianActive; + Kernel::TParameterHandler ip_isIQRActive; + Kernel::TParameterHandler ip_isPercentileActive; + Kernel::TParameterHandler ip_parameterValue; + + CIdentifier m_inputTypeID = CIdentifier::undefined(); +}; + +class CBoxUnivariateStatisticDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("Univariate Statistics"); } + CString getAuthorName() const override { return CString("Matthieu Goyat"); } + CString getAuthorCompanyName() const override { return CString("Gipsa-lab"); } + CString getShortDescription() const override { return CString("Mean, Variance, Median, etc. on the incoming Signal"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Signal processing/Statistics"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-missing-image"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_UnivariateStatistic; } + IPluginObject* create() override { return new CBoxUnivariateStatistic(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input Signals", OV_TypeId_Signal); + prototype.addOutput("Mean", OV_TypeId_Signal); + prototype.addOutput("Variance", OV_TypeId_Signal); + prototype.addOutput("Range", OV_TypeId_Signal); + prototype.addOutput("Median", OV_TypeId_Signal); + prototype.addOutput("IQR", OV_TypeId_Signal); + prototype.addOutput("Percentile", OV_TypeId_Signal); + prototype.addSetting("Mean", OV_TypeId_Boolean, "true"); + prototype.addSetting("Variance", OV_TypeId_Boolean, "true"); + prototype.addSetting("Range", OV_TypeId_Boolean, "true"); + prototype.addSetting("Median", OV_TypeId_Boolean, "true"); + prototype.addSetting("IQR", OV_TypeId_Boolean, "true"); + prototype.addSetting("Percentile", OV_TypeId_Boolean, "true"); + prototype.addSetting("Percentile value", OV_TypeId_Float, "30"); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_UnivariateStatisticDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCDetectingMinMaxBoxAlgorithm.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCDetectingMinMaxBoxAlgorithm.cpp new file mode 100644 index 0000000..fb04883 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCDetectingMinMaxBoxAlgorithm.cpp @@ -0,0 +1,121 @@ +#include "ovpCDetectingMinMaxBoxAlgorithm.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CDetectingMinMaxBoxAlgorithm::initialize() +{ + CIdentifier inputTypeID; + getStaticBoxContext().getInputType(0, inputTypeID); + if (inputTypeID == OV_TypeId_Signal) + { + m_decoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalDecoder)); + m_encoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder)); + } + else { return false; } + m_decoder->initialize(); + m_encoder->initialize(); + + // Detects MinMax of signal input buffer + m_detectingMinMax = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_DetectingMinMax)); + m_detectingMinMax->initialize(); + + // compute filter coefs settings + const CString minMax = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_maxFlag = false; + m_minFlag = false; + + if (this->getTypeManager().getEnumerationEntryValueFromName(OVP_TypeId_MinMax, minMax) == size_t(EMinMax::Min)) { m_minFlag = true; } + if (this->getTypeManager().getEnumerationEntryValueFromName(OVP_TypeId_MinMax, minMax) == size_t(EMinMax::Max)) { m_maxFlag = true; } + + const double start = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + const double end = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + + // DetectingMinMax settings + m_detectingMinMax->getInputParameter(OVP_Algorithm_DetectingMinMax_InputParameterId_SignalMatrix)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + + m_detectingMinMax->getInputParameter(OVP_Algorithm_DetectingMinMax_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + m_detectingMinMax->getInputParameter(OVP_Algorithm_DetectingMinMax_InputParameterId_TimeWindowStart)->setValue(&start); + m_detectingMinMax->getInputParameter(OVP_Algorithm_DetectingMinMax_InputParameterId_TimeWindowEnd)->setValue(&end); + + // encoder settings + m_encoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)->setReferenceTarget( + m_detectingMinMax->getOutputParameter(OVP_Algorithm_DetectingMinMax_OutputParameterId_SignalMatrix)); + + m_lastStartTime = 0; + m_lastEndTime = 0; + return true; +} + +bool CDetectingMinMaxBoxAlgorithm::uninitialize() +{ + m_encoder->uninitialize(); + m_decoder->uninitialize(); + m_detectingMinMax->uninitialize(); + getAlgorithmManager().releaseAlgorithm(*m_encoder); + getAlgorithmManager().releaseAlgorithm(*m_decoder); + getAlgorithmManager().releaseAlgorithm(*m_detectingMinMax); + + return true; +} + +bool CDetectingMinMaxBoxAlgorithm::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CDetectingMinMaxBoxAlgorithm::process() +{ + Kernel::IBoxIO& boxContext = getDynamicBoxContext(); + const size_t nInput = getStaticBoxContext().getInputCount(); + + for (size_t i = 0; i < nInput; ++i) + { + for (size_t j = 0; j < boxContext.getInputChunkCount(i); ++j) + { + Kernel::TParameterHandler iBufferHandle( + m_decoder->getInputParameter(OVP_GD_Algorithm_SignalDecoder_InputParameterId_MemoryBufferToDecode)); + Kernel::TParameterHandler oBufferHandle( + m_encoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + iBufferHandle = boxContext.getInputChunk(i, j); + oBufferHandle = boxContext.getOutputChunk(i); + const uint64_t tEnd = m_lastStartTime + boxContext.getInputChunkEndTime(i, j) - boxContext.getInputChunkStartTime(i, j); + + m_decoder->process(); + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedHeader)) + { + m_detectingMinMax->process(OVP_Algorithm_DetectingMinMax_InputTriggerId_Initialize); + m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader); + boxContext.markOutputAsReadyToSend(i, m_lastStartTime, tEnd); + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedBuffer)) + { + if (m_minFlag) { m_detectingMinMax->process(OVP_Algorithm_DetectingMinMax_InputTriggerId_DetectsMin); } + if (m_maxFlag) { m_detectingMinMax->process(OVP_Algorithm_DetectingMinMax_InputTriggerId_DetectsMax); } + + m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(i, m_lastStartTime, tEnd); + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedEnd)) + { + m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd); + boxContext.markOutputAsReadyToSend(i, m_lastStartTime, tEnd); + } + + m_lastStartTime = boxContext.getInputChunkStartTime(i, j); + m_lastEndTime = boxContext.getInputChunkEndTime(i, j); + boxContext.markInputAsDeprecated(i, j); + } + } + + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCDetectingMinMaxBoxAlgorithm.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCDetectingMinMaxBoxAlgorithm.h new file mode 100644 index 0000000..b740955 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCDetectingMinMaxBoxAlgorithm.h @@ -0,0 +1,74 @@ +// @copyright notice: Possibly due to dependencies, this box used to be GPL before upgrade to AGPL3 + +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CDetectingMinMaxBoxAlgorithm final : virtual public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_Box_DetectingMinMaxBoxAlgorithm) + +protected: + + Kernel::IAlgorithmProxy* m_decoder = nullptr; + Kernel::IAlgorithmProxy* m_encoder = nullptr; + Kernel::IAlgorithmProxy* m_detectingMinMax = nullptr; + + uint64_t m_lastStartTime = 0; + uint64_t m_lastEndTime = 0; + + bool m_minFlag = false; + bool m_maxFlag = false; +}; + +class CDetectingMinMaxBoxAlgorithmDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("Min/Max detection"); } + CString getAuthorName() const override { return CString("Guillaume Gibert"); } + CString getAuthorCompanyName() const override { return CString("INSERM/U821"); } + + CString getShortDescription() const override { return CString("Outputs the minimum or the maximum value inside a time window"); } + + CString getDetailedDescription() const override { return CString("Either min or max detection can be specified as a box parameter"); } + + CString getCategory() const override { return CString("Signal processing/Basic"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString(""); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Box_DetectingMinMaxBoxAlgorithm; } + IPluginObject* create() override { return new CDetectingMinMaxBoxAlgorithm(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input epochs", OV_TypeId_Signal); + prototype.addOutput("Output epochs", OV_TypeId_StreamedMatrix); + prototype.addSetting("Min/Max", OVP_TypeId_MinMax, "Max"); + prototype.addSetting("Time window start", OV_TypeId_Float, "300"); + prototype.addSetting("Time window end", OV_TypeId_Float, "500"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_Box_DetectingMinMaxBoxAlgorithmDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCDownsamplingBoxAlgorithm.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCDownsamplingBoxAlgorithm.cpp new file mode 100644 index 0000000..8efcea6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCDownsamplingBoxAlgorithm.cpp @@ -0,0 +1,237 @@ +#include "ovpCDownsamplingBoxAlgorithm.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + + +bool CDownsamplingBoxAlgorithm::initialize() +{ + CIdentifier inputTypeID; + getStaticBoxContext().getInputType(0, inputTypeID); + if (inputTypeID == OV_TypeId_Signal) + { + CIdentifier algorithmID = getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalDecoder); + if (algorithmID == CIdentifier::undefined()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Unable to find algorithm " << OVP_GD_ClassId_Algorithm_SignalDecoder << "\n"; + return false; + } + m_decoder = &getAlgorithmManager().getAlgorithm(algorithmID); + + algorithmID = getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder); + if (algorithmID == CIdentifier::undefined()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Unable to find algorithm " << OVP_GD_ClassId_Algorithm_SignalEncoder << "\n"; + return false; + } + m_encoder = &getAlgorithmManager().getAlgorithm(algorithmID); + } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Only 'signal' input type is supported\n"; + return false; + } + m_decoder->initialize(); + m_encoder->initialize(); + + ip_bufferToDecode.initialize(m_decoder->getInputParameter(OVP_GD_Algorithm_SignalDecoder_InputParameterId_MemoryBufferToDecode)); + op_encodedBuffer.initialize(m_encoder->getOutputParameter(OVP_GD_Algorithm_SignalEncoder_OutputParameterId_EncodedMemoryBuffer)); + + // Compute filter coeff algorithm + m_computeTemporalFilterCoefs = &getAlgorithmManager().getAlgorithm( + getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_ComputeTemporalFilterCoefs)); + m_computeTemporalFilterCoefs->initialize(); + + // Apply filter to signal input buffer + m_applyTemporalFilter = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_ApplyTemporalFilter)); + m_applyTemporalFilter->initialize(); + + // Compute Downsampling of signal input buffer + m_downsampling = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_Downsampling)); + m_downsampling->initialize(); + + // Compute filter coefs settings + m_newSampling = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + const CString ratio = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + const CString filter = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + const CString filterOrder = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + const CString passBandRipple = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + + double ratioValue = 1.0 / 4; + if (this->getTypeManager().getEnumerationEntryValueFromName(OVP_TypeId_FrequencyCutOffRatio, ratio) == size_t(EFrequencyCutOffRatio::R14)) + { + ratioValue = 1.0 / 4; + } + if (this->getTypeManager().getEnumerationEntryValueFromName(OVP_TypeId_FrequencyCutOffRatio, ratio) == size_t(EFrequencyCutOffRatio::R13)) + { + ratioValue = 1.0 / 3; + } + if (this->getTypeManager().getEnumerationEntryValueFromName(OVP_TypeId_FrequencyCutOffRatio, ratio) == size_t(EFrequencyCutOffRatio::R12)) + { + ratioValue = 1.0 / 2; + } + + uint64_t filterValue = this->getTypeManager().getEnumerationEntryValueFromName(OVP_TypeId_FilterMethod, filter); + uint64_t kindFilter = uint64_t(EFilterType::LowPass); //Low Pass + uint64_t order = atoi(filterOrder); + double lowCutFrequency = 0; + double highCutFrequency = double(m_newSampling) * ratioValue; + double passBandRippleValue = atof(passBandRipple); + + // Compute filter settings + m_computeTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + m_computeTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterMethod)->setValue(&filterValue); + m_computeTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterType)->setValue(&kindFilter); + m_computeTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterOrder)->setValue(&order); + m_computeTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_LowCutFrequency)->setValue(&lowCutFrequency); + m_computeTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_HighCutFrequency)->setValue(&highCutFrequency); + m_computeTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_BandPassRipple)->setValue(&passBandRippleValue); + + // Apply filter settings + m_applyTemporalFilter->getInputParameter(OVP_Algorithm_ApplyTemporalFilter_InputParameterId_SignalMatrix)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Matrix)); + m_applyTemporalFilter->getInputParameter(OVP_Algorithm_ApplyTemporalFilter_InputParameterId_FilterCoefsMatrix)->setReferenceTarget( + m_computeTemporalFilterCoefs->getOutputParameter( + OVP_Algorithm_ComputeTemporalFilterCoefs_OutputParameterId_Matrix)); + + // Downsampling settings + m_downsampling->getInputParameter(OVP_Algorithm_Downsampling_InputParameterId_SignalMatrix)->setReferenceTarget( + m_applyTemporalFilter->getOutputParameter(OVP_Algorithm_ApplyTemporalFilter_OutputParameterId_FilteredSignalMatrix)); + m_downsampling->getInputParameter(OVP_Algorithm_Downsampling_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + m_downsampling->getInputParameter(OVP_Algorithm_Downsampling_InputParameterId_NewSampling)->setValue(&m_newSampling); + + // Encoder settings + m_encoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)->setValue(&m_newSampling); + + m_iSignal.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Matrix)); + m_oSignal.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Matrix)); + m_samplingRate.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + + m_signalDesc = new CMatrix(); + + m_lastEndTime = uint64_t(-1); + m_flagFirstTime = true; + m_warned = false; + m_lastBufferSize = 0; + m_currentBufferSize = 0; + + return true; +} + +bool CDownsamplingBoxAlgorithm::uninitialize() +{ + delete m_signalDesc; + m_signalDesc = nullptr; + + m_applyTemporalFilter->uninitialize(); + m_computeTemporalFilterCoefs->uninitialize(); + m_encoder->uninitialize(); + m_decoder->uninitialize(); + m_downsampling->uninitialize(); + + getAlgorithmManager().releaseAlgorithm(*m_applyTemporalFilter); + getAlgorithmManager().releaseAlgorithm(*m_computeTemporalFilterCoefs); + getAlgorithmManager().releaseAlgorithm(*m_encoder); + getAlgorithmManager().releaseAlgorithm(*m_decoder); + getAlgorithmManager().releaseAlgorithm(*m_downsampling); + + return true; +} + +bool CDownsamplingBoxAlgorithm::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CDownsamplingBoxAlgorithm::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t j = 0; j < boxContext.getInputChunkCount(0); ++j) + { + ip_bufferToDecode = boxContext.getInputChunk(0, j); + op_encodedBuffer = boxContext.getOutputChunk(0); + + const uint64_t tStart = boxContext.getInputChunkStartTime(0, j); + const uint64_t tEnd = boxContext.getInputChunkEndTime(0, j); + + m_decoder->process(); + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedHeader)) + { + m_computeTemporalFilterCoefs->process(OVP_Algorithm_ComputeTemporalFilterCoefs_InputTriggerId_Initialize); + m_computeTemporalFilterCoefs->process(OVP_Algorithm_ComputeTemporalFilterCoefs_InputTriggerId_ComputeCoefs); + m_applyTemporalFilter->process(OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_Initialize); + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedBuffer)) + { + bool success = true; + if (m_lastEndTime == tStart) + { + success &= m_applyTemporalFilter->process(OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_ApplyFilterWithHistoric); + success &= m_downsampling->process(OVP_Algorithm_Downsampling_InputTriggerId_ResampleWithHistoric); + } + else + { + success &= m_applyTemporalFilter->process(OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_ApplyFilter); + success &= m_downsampling->process(OVP_Algorithm_Downsampling_InputTriggerId_Resample); + } + + if (!success) + { + this->getLogManager() << Kernel::LogLevel_Error << "Subalgorithm failed, returning\n"; + return false; + } + + Kernel::TParameterHandler signal(m_downsampling->getOutputParameter(OVP_Algorithm_Downsampling_OutputParameterId_SignalMatrix)); + m_currentBufferSize = signal->getDimensionSize(1); + + if ((m_flagFirstTime) || (m_currentBufferSize != m_lastBufferSize)) + { + if (!m_flagFirstTime && !m_warned) + { + // this->getLogManager() << Kernel::LogLevel_Warning << "This box is flagged as unstable !\n"; + this->getLogManager() << Kernel::LogLevel_Warning << + "The input sampling frequency is not an integer multiple of the output sampling frequency, or the input epoch size is unsuitable. This results in creation of size varying output chunks. This may cause crash in downstream boxes.\n"; + this->getLogManager() << Kernel::LogLevel_Debug << "(current block size is " << m_currentBufferSize << ", new block size is " << + m_lastBufferSize << ")\n"; + m_warned = true; + } + + m_signalDesc->resize(m_iSignal->getDimensionSize(0), m_currentBufferSize); + for (size_t k = 0; k < m_iSignal->getDimensionSize(0); ++k) { m_signalDesc->setDimensionLabel(0, k, m_iSignal->getDimensionLabel(0, k)); } + m_oSignal.setReferenceTarget(m_signalDesc); + m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeHeader); + boxContext.markOutputAsReadyToSend(0, tStart, tStart); + m_lastBufferSize = m_currentBufferSize; + + m_flagFirstTime = false; + } + m_oSignal.setReferenceTarget(m_downsampling->getOutputParameter(OVP_Algorithm_Downsampling_OutputParameterId_SignalMatrix)); + m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(0, tStart, tEnd); + m_lastBufferSize = m_currentBufferSize; + } + + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedEnd)) + { + m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeEnd); + boxContext.markOutputAsReadyToSend(0, tStart, tEnd); + } + + m_lastEndTime = tEnd; + + boxContext.markInputAsDeprecated(0, j); + } + + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCDownsamplingBoxAlgorithm.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCDownsamplingBoxAlgorithm.h new file mode 100644 index 0000000..05541ef --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCDownsamplingBoxAlgorithm.h @@ -0,0 +1,93 @@ +// @copyright notice: Possibly due to dependencies, this box used to be GPL before upgrade to AGPL3 + +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CDownsamplingBoxAlgorithm final : virtual public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_Box_DownsamplingBoxAlgorithm) + +protected: + + Kernel::IAlgorithmProxy* m_decoder = nullptr; + Kernel::IAlgorithmProxy* m_encoder = nullptr; + Kernel::IAlgorithmProxy* m_computeTemporalFilterCoefs = nullptr; + Kernel::IAlgorithmProxy* m_applyTemporalFilter = nullptr; + Kernel::IAlgorithmProxy* m_downsampling = nullptr; + + Kernel::TParameterHandler ip_bufferToDecode; + Kernel::TParameterHandler op_encodedBuffer; + + Kernel::TParameterHandler m_iSignal; + Kernel::TParameterHandler m_oSignal; + CMatrix* m_signalDesc = nullptr; + uint64_t m_newSampling = 0; + Kernel::TParameterHandler m_samplingRate; + + uint64_t m_lastEndTime = 0; + bool m_flagFirstTime = false; + bool m_warned = false; + size_t m_lastBufferSize = 0; + size_t m_currentBufferSize = 0; + uint64_t m_signalType = 0; +}; + +class CDownsamplingBoxAlgorithmDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("Downsampling"); } + CString getAuthorName() const override { return CString("G. Gibert - E. Maby - P.E. Aguera"); } + CString getAuthorCompanyName() const override { return CString("INSERM/U821"); } + CString getShortDescription() const override { return CString("Filters and downsamples input buffer."); } + + CString getDetailedDescription() const override + { + return CString( + "First, applies a low-pass (Butterworth or Chebyshev) filter (frequency cut is 1/4, 1/3 or 1/2 of the new sampling rate) to input buffers of signal for anti-aliasing. Then, the input buffers of signal is downsampled."); + } + + CString getCategory() const override { return CString("Signal processing/Basic"); } + CString getVersion() const override { return CString("1.01"); } + CString getStockItemName() const override { return CString(""); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Box_DownsamplingBoxAlgorithm; } + IPluginObject* create() override { return new CDownsamplingBoxAlgorithm(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addOutput("Output signal", OV_TypeId_Signal); + prototype.addSetting("New sampling rate (Hz)", OV_TypeId_Integer, "32"); + prototype.addSetting("Frequency cutoff ratio", OVP_TypeId_FrequencyCutOffRatio, "1/4"); + prototype.addSetting("Name of filter", OVP_TypeId_FilterMethod, "Butterworth"); + prototype.addSetting("Filter order", OV_TypeId_Integer, "4"); + prototype.addSetting("Pass band ripple (dB)", OV_TypeId_Float, "0.5"); + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + prototype.addFlag(Kernel::BoxFlag_IsDeprecated); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_Box_DownsamplingBoxAlgorithmDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCFastICA.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCFastICA.cpp new file mode 100644 index 0000000..8af1bf5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCFastICA.cpp @@ -0,0 +1,234 @@ +#if defined TARGET_HAS_ThirdPartyITPP + +#include "ovpCFastICA.h" + +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +void CFastICA::computeICA() +{ + const size_t nChannel = m_decoder.getOutputMatrix()->getDimensionSize(0); + const size_t nSample = m_decoder.getOutputMatrix()->getDimensionSize(1); + const double* iBuffer = m_decoder.getOutputMatrix()->getBuffer(); + + const size_t nICs = m_encoder.getInputMatrix()->getDimensionSize(0); + + itpp::mat sources(nChannel, nSample); // current block (for decomposing) + itpp::mat bufferSources(nChannel, m_buffSize); // accumulated blocks (for training) + itpp::mat ICs(nICs, nSample); + //mat Mix_mat(nChannel, nChannel); + itpp::mat sepMat(nICs, nChannel); + //mat Dewhite(nChannel, nChannel); + + // Append the data to a FIFO buffer + for (size_t i = 0; i < nChannel; ++i) + { + for (size_t j = 0; j < m_buffSize; ++j) + { + if (j < m_buffSize - nSample) + { + m_fifoBuffer[i * m_buffSize + j + nSample] = m_fifoBuffer[i * m_buffSize + j]; // memory shift + if (j < nSample) + { + m_fifoBuffer[i * m_buffSize + j] = double(iBuffer[i * nSample + nSample - 1 - j]); + sources(int(i), int(j)) = double(iBuffer[i * nSample + j]); + } + } + + bufferSources(int(i), int(m_buffSize - 1 - j)) = m_fifoBuffer[i * m_buffSize + j]; + } + } + + m_nSample += nSample; + if ((m_nSample >= m_buffSize) && (m_trained == false)) + { + this->getLogManager() << Kernel::LogLevel_Trace << "Instanciating the Fast_ICA object with " << m_nSample << " samples.\n"; + itpp::Fast_ICA fastica(bufferSources); + this->getLogManager() << Kernel::LogLevel_Trace << "Setting the number of ICs to extract to " << nICs << " and configuring FastICA...\n"; + + if (m_mode == EFastICAMode::PCA || m_mode == EFastICAMode::Whiten) { fastica.set_pca_only(true); } + else + { + fastica.set_approach(int(m_type)); + fastica.set_non_linearity(int(m_nonLin)); + fastica.set_max_num_iterations(m_nRepMax); + fastica.set_fine_tune(m_setFineTune); + fastica.set_max_fine_tune(m_nTuneMax); + fastica.set_mu(m_setMu); + fastica.set_epsilon(m_epsilon); + } + + fastica.set_nrof_independent_components(nICs); + + //if(m_nSample>nSample) fastica.set_init_guess((Dewhite * Dewhite.T()) * Sep_mat.T()); + this->getLogManager() << Kernel::LogLevel_Trace << "Explicit launch of the Fast_ICA algorithm. Can occasionally take time.\n"; + fastica.separate(); + this->getLogManager() << Kernel::LogLevel_Trace << "Retrieving separating matrix from fastica .\n"; + if (m_mode == EFastICAMode::PCA) { sepMat = fastica.get_principal_eigenvectors().transpose(); } + else if (m_mode == EFastICAMode::Whiten) { sepMat = fastica.get_whitening_matrix(); } + else { sepMat = fastica.get_separating_matrix(); } + + m_trained = true; + double* demixer = m_demixer.getBuffer(); + for (size_t i = 0; i < nICs; ++i) { for (size_t j = 0; j < nChannel; ++j) { demixer[i * nChannel + j] = sepMat(int(i), int(j)); } } + } + else + { + // Use the previously stored matrix + const double* demixer = m_demixer.getBuffer(); + for (size_t i = 0; i < nICs; ++i) { for (size_t j = 0; j < nChannel; ++j) { sepMat(int(i), int(j)) = demixer[i * nChannel + j]; } } + } + + // Effective demixing (ICA after m_duration sec) + ICs = sepMat * sources; + + double* buffer = m_encoder.getInputMatrix()->getBuffer(); + //this->getLogManager() << Kernel::LogLevel_Trace << "Filling output buffer with ICs .\n"; + for (size_t i = 0; i < nICs; ++i) { for (size_t j = 0; j < nSample; ++j) { buffer[i * nSample + j] = ICs(int(i), int(j)); } } +} + + +bool CFastICA::initialize() +{ + m_decoder.initialize(*this, 0); + m_encoder.initialize(*this, 0); + + m_nICs = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_mode = EFastICAMode(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1))); + m_duration = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + m_type = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + m_nRepMax = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + m_setFineTune = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5); + m_nTuneMax = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 6); + m_nonLin = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 7); + m_setMu = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 8); + m_epsilon = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 9); + m_spatialFilterFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 10); + m_saveAsFile = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 11); + + m_fifoBuffer = nullptr; + m_fileSaved = false; + + if (m_saveAsFile && m_spatialFilterFilename == CString("")) + { + this->getLogManager() << "If save is enabled, filename must be provided\n"; + return false; + } + + return true; +} + +bool CFastICA::uninitialize() +{ + m_encoder.uninitialize(); + m_decoder.uninitialize(); + if (m_fifoBuffer) + { + delete[] m_fifoBuffer; + m_fifoBuffer = nullptr; + } + + return true; +} + +bool CFastICA::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CFastICA::process() +{ + IDynamicBoxContext* boxContext = getBoxAlgorithmContext()->getDynamicBoxContext(); + + // Process input data + for (size_t i = 0; i < boxContext->getInputChunkCount(0); ++i) + { + m_decoder.decode(i); + + if (m_decoder.isHeaderReceived()) + { + // Set the output (encoder) matrix prorperties from the input (decoder) + if (m_decoder.getOutputMatrix()->getDimensionCount() != 2) + { + this->getLogManager() << Kernel::LogLevel_Error << "Needs a 2 dimensional (rows x cols) matrix as input\n"; + return false; + } + m_buffSize = size_t(m_decoder.getOutputSamplingRate()) * m_duration; + const size_t nChannel = m_decoder.getOutputMatrix()->getDimensionSize(0); + const size_t nSample = m_decoder.getOutputMatrix()->getDimensionSize(1); + + delete[] m_fifoBuffer; + m_fifoBuffer = new double[nChannel * m_buffSize]; + this->getLogManager() << Kernel::LogLevel_Trace << "FIFO buffer initialized with " << nChannel * m_buffSize << ".\n"; + + if (m_nICs > nChannel) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Trying to estimate more components than channels, truncating\n"; + m_nICs = nChannel; + } + + for (size_t j = 0; j < nChannel * m_buffSize; ++j) { m_fifoBuffer[j] = 0.0; } + m_nSample = 0; + m_trained = false; + + CMatrix* matrix = m_encoder.getInputMatrix(); + matrix->resize(m_nICs, nSample); + + m_encoder.getInputSamplingRate() = m_decoder.getOutputSamplingRate(); + + std::string prefix; + if (m_mode == EFastICAMode::PCA) { prefix = "PC"; } + else if (m_mode == EFastICAMode::Whiten) { prefix = "Wh"; } + else { prefix = "IC"; } + + for (size_t c = 0; c < m_nICs; ++c) { matrix->setDimensionLabel(0, c, (prefix + std::to_string(c + 1)).c_str()); } + + m_encoder.encodeHeader(); + + m_demixer.resize(m_nICs, nChannel); + // Set the demixer to (partial) identity matrix to start with + m_demixer.resetBuffer(); + double* demixer = m_demixer.getBuffer(); + for (size_t c = 0; c < m_nICs; ++c) { demixer[c * nChannel + c] = 1.0; } + + getBoxAlgorithmContext()->getDynamicBoxContext()->markOutputAsReadyToSend(0, 0, 0); + } + + if (m_decoder.isBufferReceived()) + { + const uint64_t startTime = boxContext->getInputChunkStartTime(0, i); + const uint64_t endTime = boxContext->getInputChunkEndTime(0, i); + + computeICA(); + + if ((m_saveAsFile) && (m_trained) && (m_fileSaved == false)) + { + if (!Toolkit::Matrix::saveToTextFile(m_demixer, m_spatialFilterFilename)) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Unable to save to [" << m_spatialFilterFilename << "\n"; + } + m_fileSaved = true; + } + + m_encoder.encodeBuffer(); + + getBoxAlgorithmContext()->getDynamicBoxContext()->markOutputAsReadyToSend(0, startTime, endTime); + } + + // if (m_decoder.isEndReceived()) { } // NOP + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyITPP diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCFastICA.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCFastICA.h new file mode 100644 index 0000000..c9c3b82 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCFastICA.h @@ -0,0 +1,115 @@ +// @copyright notice: Possibly due to dependencies, this box used to be GPL before upgrade to AGPL3 + +#pragma once + +#if defined TARGET_HAS_ThirdPartyITPP + +#include "../ovp_defines.h" +#include +#include + +#include +#include + +// TODO create a member function to get rid of this +#ifndef CString2Boolean +#define CString2Boolean(string) (strcmp(string,"true"))?0:1 +#endif + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +/** +* The FastICA plugin's main class. +*/ +class CFastICA final : virtual public Toolkit::TBoxAlgorithm +{ +public: + + CFastICA() {} + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + + bool process() override; + + _IsDerivedFromClass_Final_(IBoxAlgorithm, OVP_ClassId_FastICA) + +protected: + + void computeICA(); + + Toolkit::TSignalDecoder m_decoder; + Toolkit::TSignalEncoder m_encoder; + + double* m_fifoBuffer = nullptr; + CMatrix m_demixer; // The estimated matrix W + + bool m_trained = false; + bool m_fileSaved = false; + + size_t m_buffSize = 0; + size_t m_nSample = 0; + size_t m_nICs = 0; + size_t m_duration = 0; + size_t m_nRepMax = 0; + size_t m_nTuneMax = 0; + CString m_spatialFilterFilename; + bool m_saveAsFile = false; + bool m_setFineTune = false; + double m_setMu = 0; + double m_epsilon = 0; + size_t m_nonLin = 0; + size_t m_type = 0; + EFastICAMode m_mode = EFastICAMode::ICA; +}; + +class CFastICADesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("Independent Component Analysis (FastICA)"); } + CString getAuthorName() const override { return CString("Guillaume Gibert / Jeff B."); } + CString getAuthorCompanyName() const override { return CString("INSERM / Independent"); } + CString getShortDescription() const override { return CString("Computes fast independent component analysis"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Signal processing/Independent component analysis"); } + CString getVersion() const override { return CString("0.2"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_FastICA; } + IPluginObject* create() override { return new CFastICA(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addOutput("Output signal", OV_TypeId_Signal); + + prototype.addSetting("Number of components to extract", OV_TypeId_Integer, "4"); + prototype.addSetting("Operating mode", OVP_TypeId_FastICA_OperatingMode, "ICA"); + prototype.addSetting("Sample size (seconds) for estimation", OV_TypeId_Integer, "120"); + prototype.addSetting("Decomposition type", OVP_TypeId_FastICA_DecompositionType, "Symmetric"); + prototype.addSetting("Max number of reps for the ICA convergence", OV_TypeId_Integer, "100000"); + prototype.addSetting("Fine tuning", OV_TypeId_Boolean, "true"); + prototype.addSetting("Max number of reps for the fine tuning", OV_TypeId_Integer, "100"); + prototype.addSetting("Used nonlinearity", OVP_TypeId_FastICA_Nonlinearity, "Tanh"); + prototype.addSetting("Internal Mu parameter for FastICA", OV_TypeId_Float, "1.0"); + prototype.addSetting("Internal Epsilon parameter for FastICA", OV_TypeId_Float, "0.0001"); + prototype.addSetting("Spatial filter filename", OV_TypeId_Filename, ""); + prototype.addSetting("Save the spatial filter/demixing matrix", OV_TypeId_Boolean, "false"); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_FastICADesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyITPP diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCInputChannel.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCInputChannel.cpp new file mode 100644 index 0000000..bf55707 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCInputChannel.cpp @@ -0,0 +1,253 @@ +#include "ovpCInputChannel.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +namespace { +class _AutoCast_ +{ +public: + _AutoCast_(const Kernel::IBox& box, Kernel::IConfigurationManager& configManager, const size_t index) : m_configManager(configManager) + { + box.getSettingValue(index, m_settingValue); + } + + operator uint64_t() const { return m_configManager.expandAsUInteger(m_settingValue); } + operator int64_t() const { return m_configManager.expandAsInteger(m_settingValue); } + operator double() const { return m_configManager.expandAsFloat(m_settingValue); } + operator bool() const { return m_configManager.expandAsBoolean(m_settingValue); } + operator const CString() const { return m_configManager.expand(m_settingValue); } +protected: + Kernel::IConfigurationManager& m_configManager; + CString m_settingValue; +}; +} // namespace + +CInputChannel::CInputChannel() +{ + m_oMatrix[0] = nullptr; + m_oMatrix[1] = nullptr; +} + +CInputChannel::~CInputChannel() +{ + if (m_oMatrix[0]) { delete m_oMatrix[0]; } + if (m_oMatrix[1]) { delete m_oMatrix[1]; } +} + +bool CInputChannel::initialize(Toolkit::TBoxAlgorithm* boxAlgorithm) +{ + m_status = 0; + m_oMatrix[0] = nullptr; + m_oMatrix[1] = nullptr; + + m_timeStimulationPos = 0; + m_timeStimulationStart = 0; + m_timeStimulationEnd = 0; + m_hasFirstStimulation = false; + + m_timeSignalPos = 0; + m_timeSignalStart = 0; + m_timeSignalEnd = 0; + + m_stimulationSet = nullptr; + m_boxAlgorithm = boxAlgorithm; + m_ptrMatrixIdx = 0; + + m_synchroStimulation = m_boxAlgorithm->getTypeManager().getEnumerationEntryValueFromName( + OV_TypeId_Stimulation, + _AutoCast_(m_boxAlgorithm->getStaticBoxContext(), m_boxAlgorithm->getConfigurationManager(), 0)); + + m_signalDecoder = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalDecoder)); + m_signalDecoder->initialize(); + ip_bufferSignal.initialize(m_signalDecoder->getInputParameter(OVP_GD_Algorithm_SignalDecoder_InputParameterId_MemoryBufferToDecode)); + op_matrixSignal.initialize(m_signalDecoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Matrix)); + op_sampling.initialize(m_signalDecoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + + m_stimDecoder = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_stimDecoder->initialize(); + ip_bufferStimulation.initialize(m_stimDecoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + op_stimulationSet.initialize(m_stimDecoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + + return true; +} + +bool CInputChannel::uninitialize() +{ + op_stimulationSet.uninitialize(); + ip_bufferStimulation.uninitialize(); + m_stimDecoder->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_stimDecoder); + + + op_sampling.uninitialize(); + op_matrixSignal.uninitialize(); + ip_bufferSignal.uninitialize(); + m_signalDecoder->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_signalDecoder); + + + return true; +} + +bool CInputChannel::waitForSignalHeader() +{ + Kernel::IBoxIO& boxContext = m_boxAlgorithm->getDynamicBoxContext(); + + if (boxContext.getInputChunkCount(SIGNAL_CHANNEL)) + { + ip_bufferSignal = boxContext.getInputChunk(SIGNAL_CHANNEL, 0); + m_signalDecoder->process(); + + if (m_signalDecoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedHeader)) + { + m_status |= SIGNAL_HEADER_DETECTED; + + if (m_oMatrix[0]) { delete m_oMatrix[0]; } + m_oMatrix[0] = new CMatrix(); + if (m_oMatrix[1]) { delete m_oMatrix[1]; } + m_oMatrix[1] = new CMatrix(); + m_oMatrix[0]->copyDescription(*op_matrixSignal); + m_oMatrix[1]->copyDescription(*op_matrixSignal); + boxContext.markInputAsDeprecated(SIGNAL_CHANNEL, 0); + + return true; + } + } + + return false; +} + +void CInputChannel::waitForSynchro() +{ + waitForSynchroStimulation(); + waitForSynchroSignal(); +} + +void CInputChannel::waitForSynchroStimulation() +{ + if (hasSynchroStimulation()) { return; } + + Kernel::IBoxIO& boxContext = m_boxAlgorithm->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(STIMULATION_CHANNEL); ++i) //Stimulation de l'input 1 + { + ip_bufferStimulation = boxContext.getInputChunk(STIMULATION_CHANNEL, i); + m_stimDecoder->process(); + m_stimulationSet = op_stimulationSet; + + m_timeStimulationStart = boxContext.getInputChunkStartTime(STIMULATION_CHANNEL, i); + m_timeStimulationEnd = boxContext.getInputChunkEndTime(STIMULATION_CHANNEL, i); + + for (size_t j = 0; j < m_stimulationSet->getStimulationCount(); ++j) + { + if (m_stimulationSet->getStimulationIdentifier(j) == m_synchroStimulation) + { + m_status |= STIMULATION_SYNCHRO_DETECTED; + m_timeStimulationPos = m_stimulationSet->getStimulationDate(j); + m_boxAlgorithm->getLogManager() << Kernel::LogLevel_Info << "Get Synchronisation Stimulation at channel " << STIMULATION_CHANNEL << "\n"; + + return; + } + } + boxContext.markInputAsDeprecated(STIMULATION_CHANNEL, i); + } +} + +void CInputChannel::waitForSynchroSignal() +{ + if (m_timeStimulationStart == 0 || hasSynchroSignal()) { return; } + + Kernel::IBoxIO& boxContext = m_boxAlgorithm->getDynamicBoxContext(); + + if (hasSynchroStimulation()) + { + for (size_t i = 0; i < boxContext.getInputChunkCount(SIGNAL_CHANNEL); ++i) //Stimulation de l'input 1 + { + m_timeSignalStart = boxContext.getInputChunkStartTime(SIGNAL_CHANNEL, i); + m_timeSignalEnd = boxContext.getInputChunkEndTime(SIGNAL_CHANNEL, i); + if ((m_timeStimulationPos >= m_timeSignalStart) && (m_timeStimulationPos < m_timeSignalEnd)) { processSynchroSignal(); } + boxContext.markInputAsDeprecated(SIGNAL_CHANNEL, i); + + if (hasSynchroSignal()) { break; } + } + } + else + { + for (size_t i = 0; i < boxContext.getInputChunkCount(SIGNAL_CHANNEL); ++i) //Stimulation de l'input 1 + { + m_timeSignalEnd = boxContext.getInputChunkEndTime(SIGNAL_CHANNEL, i); + if (m_timeSignalEnd < m_timeStimulationStart) { boxContext.markInputAsDeprecated(SIGNAL_CHANNEL, i); } + } + } +} + +void CInputChannel::processSynchroSignal() +{ + m_status |= SIGNAL_SYNCHRO_DETECTED; + m_nChannels = m_oMatrix[0]->getDimensionSize(0); + m_nSamples = m_oMatrix[0]->getDimensionSize(1); + m_firstBlock = size_t(double(m_nSamples * (m_timeStimulationPos - m_timeSignalStart)) / double(m_timeSignalEnd - m_timeSignalStart)); + m_secondBlock = m_nSamples - m_firstBlock; + m_timeSignalPos = m_timeSignalEnd; + + copyData(false, m_ptrMatrixIdx); + + m_boxAlgorithm->getLogManager() << Kernel::LogLevel_Info << "Cutting parameter for both part : " << m_firstBlock << "+" << m_secondBlock << "\n"; +} + +IStimulationSet* CInputChannel::getStimulation(uint64_t& startTimestamp, uint64_t& endTimestamp, const size_t stimulationIndex) +{ + Kernel::IBoxIO& boxContext = m_boxAlgorithm->getDynamicBoxContext(); + + ip_bufferStimulation = boxContext.getInputChunk(STIMULATION_CHANNEL, stimulationIndex); + m_stimDecoder->process(); + m_stimulationSet = op_stimulationSet; + + startTimestamp = m_hasFirstStimulation ? boxContext.getInputChunkStartTime(STIMULATION_CHANNEL, stimulationIndex) : m_timeStimulationPos; + endTimestamp = boxContext.getInputChunkEndTime(STIMULATION_CHANNEL, stimulationIndex); + m_hasFirstStimulation = true; + + boxContext.markInputAsDeprecated(STIMULATION_CHANNEL, stimulationIndex); + + return m_stimulationSet; +} + + +CMatrix* CInputChannel::getSignal(uint64_t& startTimestamp, uint64_t& endTimestamp, const size_t signalIndex) +{ + Kernel::IBoxIO& boxContext = m_boxAlgorithm->getDynamicBoxContext(); + ip_bufferSignal = boxContext.getInputChunk(SIGNAL_CHANNEL, signalIndex); + m_signalDecoder->process(); + if (!m_signalDecoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedBuffer)) { return nullptr; } + + startTimestamp = boxContext.getInputChunkStartTime(SIGNAL_CHANNEL, signalIndex); + endTimestamp = boxContext.getInputChunkEndTime(SIGNAL_CHANNEL, signalIndex); + + copyData(true, m_ptrMatrixIdx); + copyData(false, m_ptrMatrixIdx + 1); + + boxContext.markInputAsDeprecated(SIGNAL_CHANNEL, signalIndex); + + return getMatrix(); +} + +void CInputChannel::copyData(const bool copyFirstBlock, const size_t matrixIndex) +{ + CMatrix*& buffer = m_oMatrix[matrixIndex & 1]; + + double* src = op_matrixSignal->getBuffer() + (copyFirstBlock ? 0 : m_firstBlock); + double* dst = buffer->getBuffer() + (copyFirstBlock ? m_secondBlock : 0); + const size_t size = (copyFirstBlock ? m_firstBlock : m_secondBlock) * sizeof(double); + + for (size_t i = 0; i < m_nChannels; i++, src += m_nSamples, dst += m_nSamples) { memcpy(dst, src, size_t(size)); } +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCInputChannel.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCInputChannel.h new file mode 100644 index 0000000..982c3ae --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCInputChannel.h @@ -0,0 +1,102 @@ +#pragma once + +#include +#include + +#define SET_BIT(bit) (1 << bit) + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CInputChannel +{ + typedef enum + { + NOT_STARTED = 0, + SIGNAL_HEADER_DETECTED = SET_BIT(0), + STIMULATION_SYNCHRO_DETECTED = SET_BIT(1), + SIGNAL_SYNCHRO_DETECTED = SET_BIT(2), + IN_WORK = SET_BIT(3), + } status_t; + + typedef enum + { + SIGNAL_CHANNEL, + STIMULATION_CHANNEL, + } channel_t; + +public: + + CInputChannel(); + ~CInputChannel(); + bool initialize(Toolkit::TBoxAlgorithm* boxAlgorithm); + bool uninitialize(); + + bool hasHeader() const { return (m_status & SIGNAL_HEADER_DETECTED) != 0; } + bool hasSynchro() const { return hasSynchroStimulation() && hasSynchroSignal(); } + bool isWorking() const { return (m_status & IN_WORK) != 0; } + bool waitForSignalHeader(); + void waitForSynchro(); + void startWorking() { m_status |= IN_WORK; } + uint64_t getStimulationPosition() const { return m_timeStimulationPos; } + uint64_t getSignalPosition() const { return m_timeSignalPos; } + size_t getNStimulationBuffers() const { return m_boxAlgorithm->getDynamicBoxContext().getInputChunkCount(STIMULATION_CHANNEL); } + size_t getNSignalBuffers() const { return m_boxAlgorithm->getDynamicBoxContext().getInputChunkCount(SIGNAL_CHANNEL); } + IStimulationSet* getStimulation(uint64_t& startTimestamp, uint64_t& endTimestamp, size_t stimulationIndex); + CMatrix* getSignal(uint64_t& startTimestamp, uint64_t& endTimestamp, size_t signalIndex); + CMatrix* getMatrixPtr() { return m_oMatrix[m_ptrMatrixIdx & 1]; } + uint64_t getSamplingRate() const { return op_sampling; } + +private: + bool hasSynchroStimulation() const { return (m_status & STIMULATION_SYNCHRO_DETECTED) != 0; } + bool hasSynchroSignal() const { return (m_status & SIGNAL_SYNCHRO_DETECTED) != 0; } + void waitForSynchroStimulation(); + void waitForSynchroSignal(); + void processSynchroSignal(); + CMatrix* getMatrix() { return m_oMatrix[m_ptrMatrixIdx++ & 1]; } + void copyData(bool copyFirstBlock, size_t matrixIndex); + +protected: + uint16_t m_status = 0; + CMatrix* m_oMatrix[2]; + uint64_t m_ptrMatrixIdx = 0; + uint64_t m_synchroStimulation = 0; + + uint64_t m_timeStimulationPos = 0; + uint64_t m_timeStimulationStart = 0; + uint64_t m_timeStimulationEnd = 0; + bool m_hasFirstStimulation = false; + + + uint64_t m_timeSignalPos = 0; + uint64_t m_timeSignalStart = 0; + uint64_t m_timeSignalEnd = 0; + + size_t m_firstBlock = 0; + size_t m_secondBlock = 0; + size_t m_nSamples = 0; + size_t m_nChannels = 0; + bool m_hasFirstChunk = false; + + IStimulationSet* m_stimulationSet = nullptr; + + // parent memory + Toolkit::TBoxAlgorithm* m_boxAlgorithm = nullptr; + + // signal section + Kernel::IAlgorithmProxy* m_signalDecoder = nullptr; + + Kernel::TParameterHandler ip_bufferSignal; + Kernel::TParameterHandler op_matrixSignal; + Kernel::TParameterHandler op_sampling; + + + // stimulation section + Kernel::IAlgorithmProxy* m_stimDecoder = nullptr; + + Kernel::TParameterHandler ip_bufferStimulation; + Kernel::TParameterHandler op_stimulationSet; +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCModTemporalFilterBoxAlgorithm.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCModTemporalFilterBoxAlgorithm.cpp new file mode 100644 index 0000000..1f0c3f9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCModTemporalFilterBoxAlgorithm.cpp @@ -0,0 +1,297 @@ +#include "ovpCModTemporalFilterBoxAlgorithm.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CModTemporalFilterBoxAlgorithm::initialize() +{ + m_hasBeenInit = false; + + m_decoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalDecoder)); + m_encoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + + m_decoder->initialize(); + m_encoder->initialize(); + + ip_bufferToDecode.initialize(m_decoder->getInputParameter(OVP_GD_Algorithm_SignalDecoder_InputParameterId_MemoryBufferToDecode)); + op_encodedBuffer.initialize(m_encoder->getOutputParameter(OVP_GD_Algorithm_SignalEncoder_OutputParameterId_EncodedMemoryBuffer)); + + // Compute filter coeff algorithm + m_computeModTemporalFilterCoefs = &getAlgorithmManager().getAlgorithm( + getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_ComputeTemporalFilterCoefs)); + m_computeModTemporalFilterCoefs->initialize(); + + // Apply filter to signal input buffer + m_applyModTemporalFilter = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_ApplyTemporalFilter)); + m_applyModTemporalFilter->initialize(); + + m_lastEndTime = 0; + + m_encoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + + m_filterMethod = CString(""); + m_filterType = CString(""); + m_filterOrder = CString(""); + m_lowBand = CString(""); + m_highBand = CString(""); + m_passBandRiple = CString(""); + if (!updateSettings()) + { + this->getLogManager() << Kernel::LogLevel_Error << "The box cannot be initialized.\n"; + return false; + } + + m_computeModTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + + // apply filter settings + m_applyModTemporalFilter->getInputParameter(OVP_Algorithm_ApplyTemporalFilter_InputParameterId_SignalMatrix)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Matrix)); + m_applyModTemporalFilter->getInputParameter(OVP_Algorithm_ApplyTemporalFilter_InputParameterId_FilterCoefsMatrix)->setReferenceTarget( + m_computeModTemporalFilterCoefs->getOutputParameter( + OVP_Algorithm_ComputeTemporalFilterCoefs_OutputParameterId_Matrix)); + + m_encoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Matrix)->setReferenceTarget( + m_applyModTemporalFilter->getOutputParameter(OVP_Algorithm_ApplyTemporalFilter_OutputParameterId_FilteredSignalMatrix)); + return true; +} + +bool CModTemporalFilterBoxAlgorithm::updateSettings() +{ + bool retVal = false; + bool error = false; + char* endPtr = nullptr; + //get the settings + const CString filter = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + const CString kindFilter = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + const CString filterOrder = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + const CString lowPassBandEdge = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + const CString highPassBandEdge = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + const CString passBandRipple = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5); + + if (m_filterMethod != filter) + { + const uint64_t parameter = this->getTypeManager().getEnumerationEntryValueFromName(OVP_TypeId_FilterMethod, filter); + if (parameter == CIdentifier::undefined().id()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Unrecognized filter method " << filter << ".\n"; + error = true; + } + else + { + Kernel::TParameterHandler ip_nameFilter( + m_computeModTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterMethod)); + ip_nameFilter = parameter; + retVal = true; + } + m_filterMethod = filter; //We set up the new value to avoid to repeat the error log over and over again + } + + if (m_filterType != kindFilter) + { + const uint64_t parameter = this->getTypeManager().getEnumerationEntryValueFromName(OVP_TypeId_FilterType, kindFilter); + if (parameter == CIdentifier::undefined().id()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Unrecognized filter type " << kindFilter << ".\n"; + error = true; + } + else + { + Kernel::TParameterHandler ip_kindFilter( + m_computeModTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterType)); + ip_kindFilter = parameter; + retVal = true; + } + m_filterType = kindFilter; //We set up the new value to avoid to repeat the error log over and over again + } + + if (m_filterOrder != filterOrder) + { + errno = 0; + const int64_t parameter = strtol(filterOrder, &endPtr, 10); + if (parameter <= 0 || (errno != 0 && parameter == 0) || *endPtr != '\0' || errno == ERANGE) + { + this->getLogManager() << Kernel::LogLevel_Error << "Wrong filter order (" << filterOrder << "). Should be one or more.\n"; + error = true; + } + else + { + Kernel::TParameterHandler ip_filterOrder( + m_computeModTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterOrder)); + ip_filterOrder = parameter; + retVal = true; + } + m_filterOrder = filterOrder; //We set up the new value to avoid to repeat the error log over and over again + } + + if (m_lowBand != lowPassBandEdge) + { + Kernel::TParameterHandler ip_highCutFrequency( + m_computeModTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_HighCutFrequency)); + + errno = 0; + const double parameter = strtod(lowPassBandEdge, &endPtr); + if (parameter < 0 || (errno != 0 && parameter == 0) || *endPtr != '\0' || errno == ERANGE) + { + this->getLogManager() << Kernel::LogLevel_Error << "Wrong low cut frequency (" << lowPassBandEdge << " Hz). Should be positive.\n"; + error = true; + } + else if (m_hasBeenInit && parameter > double(ip_highCutFrequency) + )//If it's not the first init we need to check that we do not set a wrong frequency according to the high one + { + this->getLogManager() << Kernel::LogLevel_Error << "Wrong low cut frequency (" << lowPassBandEdge << " Hz). Should be under the high cut frequency " + << double(ip_highCutFrequency) << " Hz.\n"; + error = true; + } + else + { + Kernel::TParameterHandler ip_lowCutFrequency( + m_computeModTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_LowCutFrequency)); + ip_lowCutFrequency = parameter; + retVal = true; + } + m_lowBand = lowPassBandEdge; + } + + if (m_highBand != highPassBandEdge) + { + Kernel::TParameterHandler ip_lowCutFrequency( + m_computeModTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_LowCutFrequency)); + errno = 0; + const double parameter = strtod(highPassBandEdge, &endPtr); + if (parameter < 0 || (errno != 0 && parameter == 0) || *endPtr != '\0' || errno == ERANGE) + { + this->getLogManager() << Kernel::LogLevel_Error << "Wrong high cut frequency (" << highPassBandEdge << " Hz). Should be positive.\n"; + error = true; + } + else if (parameter < double(ip_lowCutFrequency)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Wrong high cut frequency (" << highPassBandEdge << " Hz). Should be over the low cut frequency " + << double(ip_lowCutFrequency) << " Hz.\n"; + error = true; + } + else + { + Kernel::TParameterHandler ip_highCutFrequency( + m_computeModTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_HighCutFrequency)); + ip_highCutFrequency = parameter; + retVal = true; + } + m_highBand = highPassBandEdge; + } + + if (m_passBandRiple != passBandRipple) + { + errno = 0; + const double parameter = strtod(passBandRipple, &endPtr); + if ((errno != 0 && parameter == 0) || *endPtr != '\0' || errno == ERANGE) + { + this->getLogManager() << Kernel::LogLevel_Error << "Wrong pass band ripple (" << passBandRipple << " dB).\n"; + error = true; + } + else + { + Kernel::TParameterHandler ip_passBandRipple( + m_computeModTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_BandPassRipple)); + ip_passBandRipple = parameter; + retVal = true; + } + m_passBandRiple = passBandRipple; + } + + //If it was the original init we return false to stop the init process + if (!m_hasBeenInit && error) { return false; } + m_hasBeenInit = true; + return retVal; +} + +bool CModTemporalFilterBoxAlgorithm::compute() +{ + //compute filter coeff + if (!m_computeModTemporalFilterCoefs->process(OVP_Algorithm_ComputeTemporalFilterCoefs_InputTriggerId_Initialize)) { return false; } + if (!m_computeModTemporalFilterCoefs->process(OVP_Algorithm_ComputeTemporalFilterCoefs_InputTriggerId_ComputeCoefs)) { return false; } + if (!m_applyModTemporalFilter->process(OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_Initialize)) { return false; } + + return true; +} + +bool CModTemporalFilterBoxAlgorithm::uninitialize() +{ + m_applyModTemporalFilter->uninitialize(); + m_computeModTemporalFilterCoefs->uninitialize(); + m_encoder->uninitialize(); + m_decoder->uninitialize(); + + getAlgorithmManager().releaseAlgorithm(*m_applyModTemporalFilter); + getAlgorithmManager().releaseAlgorithm(*m_computeModTemporalFilterCoefs); + getAlgorithmManager().releaseAlgorithm(*m_encoder); + getAlgorithmManager().releaseAlgorithm(*m_decoder); + + return true; +} + +bool CModTemporalFilterBoxAlgorithm::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CModTemporalFilterBoxAlgorithm::process() +{ + Kernel::IBoxIO& boxContext = getDynamicBoxContext(); + const size_t nInput = getStaticBoxContext().getInputCount(); + + for (size_t i = 0; i < nInput; ++i) + { + for (size_t j = 0; j < boxContext.getInputChunkCount(i); ++j) + { + //TParameterHandler < const IMemoryBuffer* > iBufferHandle(m_decoder->getInputParameter(OVP_GD_Algorithm_SignalDecoder_InputParameterId_MemoryBufferToDecode)); + //TParameterHandler < IMemoryBuffer* > oBufferHandle(m_encoder->getOutputParameter(OVP_GD_Algorithm_SignalEncoder_OutputParameterId_EncodedMemoryBuffer)); + //iBufferHandle=boxContext.getInputChunk(i, j); + //oBufferHandle=boxContext.getOutputChunk(i); + ip_bufferToDecode = boxContext.getInputChunk(i, j); + op_encodedBuffer = boxContext.getOutputChunk(i); + const uint64_t start = boxContext.getInputChunkStartTime(i, j); + const uint64_t end = boxContext.getInputChunkEndTime(i, j); + + if (!m_decoder->process()) { return false; } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedHeader)) + { + compute(); + if (!m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeHeader)) { return false; } + + boxContext.markOutputAsReadyToSend(i, start, end); + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedBuffer)) + { + //recompute if the settings have changed only + if (updateSettings() && !compute()) { this->getLogManager() << Kernel::LogLevel_Error << "error during computation\n"; } + + if (m_lastEndTime == start) + { + if (!m_applyModTemporalFilter->process(OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_ApplyFilterWithHistoric)) { return false; } + } + else { if (!m_applyModTemporalFilter->process(OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_ApplyFilter)) { return false; } } + if (!m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeBuffer)) { return false; } + boxContext.markOutputAsReadyToSend(i, start, end); + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedEnd)) + { + if (!m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeEnd)) { return false; } + boxContext.markOutputAsReadyToSend(i, start, end); + } + + m_lastEndTime = end; + boxContext.markInputAsDeprecated(i, j); + } + } + + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCModTemporalFilterBoxAlgorithm.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCModTemporalFilterBoxAlgorithm.h new file mode 100644 index 0000000..60088a0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCModTemporalFilterBoxAlgorithm.h @@ -0,0 +1,98 @@ +// @copyright notice: Possibly due to dependencies, this box used to be GPL before upgrade to AGPL3 + +#pragma once + +#include "../ovp_defines.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CModTemporalFilterBoxAlgorithm final : virtual public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_Box_ModTemporalFilterBoxAlgorithm) + +protected: + + //update the settings value from the UI + //return true if any setting has changed + bool updateSettings(); + + //compute the filter coeff + //return false if failed + bool compute(); + + Kernel::IAlgorithmProxy* m_decoder = nullptr; + Kernel::IAlgorithmProxy* m_encoder = nullptr; + Kernel::IAlgorithmProxy* m_computeModTemporalFilterCoefs = nullptr; + Kernel::IAlgorithmProxy* m_applyModTemporalFilter = nullptr; + + Kernel::TParameterHandler ip_bufferToDecode; + Kernel::TParameterHandler op_encodedBuffer; + uint64_t m_lastEndTime = 0; + + //setting last value to avoid recompute if they haven't changed + CString m_filterMethod; + CString m_filterType; + CString m_filterOrder; + CString m_lowBand; + CString m_highBand; + CString m_passBandRiple; + + bool m_hasBeenInit = false; +}; + +class CModTemporalFilterBoxAlgorithmDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("Modifiable Temporal filter"); } + CString getAuthorName() const override { return CString("Guillaume Gibert / lmahe"); } + CString getAuthorCompanyName() const override { return CString("INSERM/U821 INRIA"); } + + CString getShortDescription() const override { return CString("Applies temporal filtering on time signal, modifiable parameters"); } + + CString getDetailedDescription() const override + { + return CString("The user can choose among a variety of filter types to process the signal and change the settings online"); + } + + CString getCategory() const override { return CString("Signal processing/Temporal Filtering"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString(""); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Box_ModTemporalFilterBoxAlgorithm; } + IPluginObject* create() override { return new CModTemporalFilterBoxAlgorithm(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addOutput("Filtered signal", OV_TypeId_Signal); + prototype.addSetting("Filter method", OVP_TypeId_FilterMethod, "Butterworth", true); + prototype.addSetting("Filter type", OVP_TypeId_FilterType, "Band Pass", true); + prototype.addSetting("Filter order", OV_TypeId_Integer, "4", true); + prototype.addSetting("Low cut frequency (Hz)", OV_TypeId_Float, "29", true); + prototype.addSetting("High cut frequency (Hz)", OV_TypeId_Float, "40", true); + prototype.addSetting("Pass band ripple (dB)", OV_TypeId_Float, "0.5", true); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_Box_ModTemporalFilterBoxAlgorithmDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCOutputChannel.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCOutputChannel.cpp new file mode 100644 index 0000000..18b1d47 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCOutputChannel.cpp @@ -0,0 +1,102 @@ +#include "ovpCOutputChannel.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + + +bool COutputChannel::initialize(Toolkit::TBoxAlgorithm* boxAlgorithm) +{ + m_boxAlgorithm = boxAlgorithm; + + + m_signalEncoder = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + m_signalEncoder->initialize(); + op_bufferSignal.initialize(m_signalEncoder->getOutputParameter(OVP_GD_Algorithm_SignalEncoder_OutputParameterId_EncodedMemoryBuffer)); + ip_matrixSignal.initialize(m_signalEncoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Matrix)); + ip_sampling.initialize(m_signalEncoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)); + + + m_stimEncoder = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationEncoder)); + m_stimEncoder->initialize(); + op_bufferStimulation.initialize(m_stimEncoder->getOutputParameter(OVP_GD_Algorithm_StimulationEncoder_OutputParameterId_EncodedMemoryBuffer)); + ip_stimulationSet.initialize(m_stimEncoder->getInputParameter(OVP_GD_Algorithm_StimulationEncoder_InputParameterId_StimulationSet)); + + return true; +} + +bool COutputChannel::uninitialize() +{ + ip_sampling.uninitialize(); + ip_matrixSignal.uninitialize(); + op_bufferSignal.uninitialize(); + m_signalEncoder->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_signalEncoder); + + op_bufferStimulation.uninitialize(); + ip_stimulationSet.uninitialize(); + m_stimEncoder->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_stimEncoder); + + return true; +} + +void COutputChannel::sendStimulation(IStimulationSet* stimset, const uint64_t startTime, const uint64_t endTime) +{ + Kernel::IBoxIO& boxContext = m_boxAlgorithm->getDynamicBoxContext(); + + for (size_t j = 0; j < stimset->getStimulationCount(); ++j) + { + if (stimset->getStimulationDate(j) < m_timeStimulationPos) + { + stimset->removeStimulation(j); + j--; + } + else { stimset->setStimulationDate(j, stimset->getStimulationDate(j) - m_timeStimulationPos); } + } + + ip_stimulationSet = stimset; + op_bufferStimulation = boxContext.getOutputChunk(STIMULATION_CHANNEL); + m_stimEncoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(STIMULATION_CHANNEL, startTime - m_timeStimulationPos, endTime - m_timeStimulationPos); +} + +void COutputChannel::sendHeader(const size_t sampling, CMatrix* matrix) +{ + Kernel::IBoxIO& boxContext = m_boxAlgorithm->getDynamicBoxContext(); + + m_buffer = matrix; + m_sampling = sampling; + + op_bufferSignal = boxContext.getOutputChunk(SIGNAL_CHANNEL); + ip_matrixSignal = m_buffer; + ip_sampling = m_sampling; + + //copy channel names + for (size_t i = 0; i < matrix->getDimensionSize(0); ++i) { ip_matrixSignal->setDimensionLabel(0, i, matrix->getDimensionLabel(0, i)); } + + m_signalEncoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeHeader); + boxContext.markOutputAsReadyToSend(SIGNAL_CHANNEL, 0, 0); +} + +void COutputChannel::sendSignal(CMatrix* matrix, const uint64_t startTime, const uint64_t endTime) +{ + Kernel::IBoxIO& boxContext = m_boxAlgorithm->getDynamicBoxContext(); + + op_bufferSignal = boxContext.getOutputChunk(SIGNAL_CHANNEL); + ip_matrixSignal = matrix; + ip_sampling = m_sampling; + m_signalEncoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(SIGNAL_CHANNEL, startTime - m_timeSignalPos, endTime - m_timeSignalPos); +} + +void COutputChannel::processSynchroSignal(const uint64_t stimulationPos, const uint64_t signalPos) +{ + m_timeStimulationPos = stimulationPos; + m_timeSignalPos = signalPos; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCOutputChannel.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCOutputChannel.h new file mode 100644 index 0000000..f22ba00 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCOutputChannel.h @@ -0,0 +1,54 @@ +#pragma once + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class COutputChannel +{ + typedef enum + { + SIGNAL_CHANNEL, + STIMULATION_CHANNEL, + } channel_t; + +public: + + bool initialize(Toolkit::TBoxAlgorithm* boxAlgorithm); + bool uninitialize(); + + void sendStimulation(IStimulationSet* stimset, uint64_t startTime, uint64_t endTime); + void sendSignal(CMatrix* matrix, uint64_t startTime, uint64_t endTime); + + void sendHeader(const size_t sampling, CMatrix* matrix); + void processSynchroSignal(uint64_t stimulationPos, uint64_t signalPos); + +protected: + + CMatrix* m_buffer = nullptr; + + uint64_t m_timeStimulationPos = 0; + uint64_t m_timeSignalPos = 0; + uint64_t m_sampling = 0; + + // parent memory + Toolkit::TBoxAlgorithm* m_boxAlgorithm = nullptr; + + // signal section + Kernel::IAlgorithmProxy* m_signalEncoder = nullptr; + + Kernel::TParameterHandler op_bufferSignal; + Kernel::TParameterHandler ip_matrixSignal; + Kernel::TParameterHandler ip_sampling; + + // stimulation section + Kernel::IAlgorithmProxy* m_stimEncoder = nullptr; + + Kernel::TParameterHandler op_bufferStimulation; + Kernel::TParameterHandler ip_stimulationSet; +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCSpectralAnalysis.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCSpectralAnalysis.cpp new file mode 100644 index 0000000..167ac3a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCSpectralAnalysis.cpp @@ -0,0 +1,198 @@ +#if defined TARGET_HAS_ThirdPartyITPP + +#include "ovpCSpectralAnalysis.h" + +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CSpectralAnalysis::initialize() +{ + //reads the plugin settings + const CString setting = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + const uint64_t components = this->getTypeManager().getBitMaskEntryCompositionValueFromName(OVP_TypeId_SpectralComponent, setting); + + m_amplitudeSpectrum = ((components & uint64_t(ESpectralComponent::Amplitude)) > 0); + m_phaseSpectrum = ((components & uint64_t(ESpectralComponent::Phase)) > 0); + m_realPartSpectrum = ((components & uint64_t(ESpectralComponent::RealPart)) > 0); + m_imagPartSpectrum = ((components & uint64_t(ESpectralComponent::ImaginaryPart)) > 0); + + m_decoder.initialize(*this, 0); + for (size_t i = 0; i < 4; ++i) { m_encoders[i].initialize(*this, i); } + + return true; +} + +bool CSpectralAnalysis::uninitialize() +{ + for (size_t i = 0; i < 4; ++i) { m_encoders[i].uninitialize(); } + m_decoder.uninitialize(); + + return true; +} + +bool CSpectralAnalysis::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CSpectralAnalysis::process() +{ + Kernel::IBoxIO* context = getBoxAlgorithmContext()->getDynamicBoxContext(); + const size_t nInputChunk = context->getInputChunkCount(0); + char frequencyBandName[1024]; + + for (size_t idx = 0; idx < nInputChunk; ++idx) + { + m_lastChunkStartTime = context->getInputChunkStartTime(0, idx); + m_lastChunkEndTime = context->getInputChunkEndTime(0, idx); + + m_decoder.decode(idx); + + if (m_decoder.isHeaderReceived())//dealing with the signal header + { + //get signal info + m_nSample = m_decoder.getOutputMatrix()->getDimensionSize(1); + m_nChannel = m_decoder.getOutputMatrix()->getDimensionSize(0); + m_sampling = size_t(m_decoder.getOutputSamplingRate()); + + if (m_nSample == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Chunk size appears to be 0, not supported.\n"; + return false; + } + if (m_nChannel == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Channel count appears to be 0, not supported.\n"; + return false; + } + if (m_sampling == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Sampling rate appears to be 0, not supported.\n"; + return false; + } + + //we need two matrices for the spectrum encoders, the Frequency bands and the one inherited form streamed matrix (see doc for details) + CMatrix* frequencyBands = new CMatrix(); + CMatrix* streamedMatrix = new CMatrix(); + + // For real signals, if N is sample count, bins [0,N/2] (inclusive) contain non-redundant information, i.e. N/2+1 entries. + m_halfFFTSize = m_nSample / 2 + 1; + m_nFrequencyBand = m_halfFFTSize; + + streamedMatrix->copyDescription(*m_decoder.getOutputMatrix()); + streamedMatrix->setDimensionSize(1, m_nFrequencyBand); + frequencyBands->resize(m_nFrequencyBand); + double* buffer = frequencyBands->getBuffer(); + + // @fixme would be more proper to use 'bins', one bin with a hz tag per array entry + for (size_t j = 0; j < m_nFrequencyBand; ++j) + { + buffer[j] = j * (double(m_sampling) / m_nSample); + sprintf(frequencyBandName, "%lg", buffer[j]); + streamedMatrix->setDimensionLabel(0, j, frequencyBandName);//set the names of the frequency bands + } + + + for (size_t j = 0; j < 4; ++j) + { + //copy the information for each encoder + m_encoders[j].getInputFrequencyAbscissa()->copy(*frequencyBands); + m_encoders[j].getInputMatrix()->copy(*streamedMatrix); + m_encoders[j].getInputSamplingRate().setReferenceTarget(m_decoder.getOutputSamplingRate()); + } + + if (m_amplitudeSpectrum) + { + m_encoders[0].encodeHeader(); + context->markOutputAsReadyToSend(0, m_lastChunkStartTime, m_lastChunkEndTime); + } + if (m_phaseSpectrum) + { + m_encoders[1].encodeHeader(); + context->markOutputAsReadyToSend(1, m_lastChunkStartTime, m_lastChunkEndTime); + } + if (m_realPartSpectrum) + { + m_encoders[2].encodeHeader(); + context->markOutputAsReadyToSend(2, m_lastChunkStartTime, m_lastChunkEndTime); + } + if (m_imagPartSpectrum) + { + m_encoders[3].encodeHeader(); + context->markOutputAsReadyToSend(3, m_lastChunkStartTime, m_lastChunkEndTime); + } + + delete frequencyBands; + delete streamedMatrix; + } + if (m_decoder.isBufferReceived()) + { + //get input buffer + const double* buffer = m_decoder.getOutputMatrix()->getBuffer(); + //do the processing + itpp::vec x(m_nSample); + itpp::cvec y(m_nSample); + itpp::cvec z(m_nChannel * m_halfFFTSize); + + for (size_t i = 0; i < m_nChannel; ++i) + { + for (size_t j = 0; j < m_nSample; ++j) { x[j] = double(*(buffer + i * m_nSample + j)); } + + y = fft_real(x); + + //test block + // itpp::vec h = ifft_real(y); + // std::cout << "Fx: " << x.size() << ", x=" << x << "\n" << "FF: " << y.size() << ", y=" << y << "\n" << "Fr: " << h.size() << ", x'=" << h << "\n"; + + for (size_t k = 0; k < m_halfFFTSize; ++k) { z[k + i * m_halfFFTSize] = y[k]; } + } + + if (m_amplitudeSpectrum) + { + CMatrix* matrix = m_encoders[0].getInputMatrix(); + double* buf = matrix->getBuffer(); + for (size_t i = 0; i < m_nChannel * m_halfFFTSize; ++i) { *(buf + i) = sqrt(real(z[i]) * real(z[i]) + imag(z[i]) * imag(z[i])); } + m_encoders[0].encodeBuffer(); + context->markOutputAsReadyToSend(0, m_lastChunkStartTime, m_lastChunkEndTime); + } + if (m_phaseSpectrum) + { + CMatrix* matrix = m_encoders[1].getInputMatrix(); + double* buf = matrix->getBuffer(); + for (size_t i = 0; i < m_nChannel * m_halfFFTSize; ++i) { *(buf + i) = imag(z[i]) / real(z[i]); } + m_encoders[1].encodeBuffer(); + context->markOutputAsReadyToSend(1, m_lastChunkStartTime, m_lastChunkEndTime); + } + if (m_realPartSpectrum) + { + CMatrix* matrix = m_encoders[2].getInputMatrix(); + double* buf = matrix->getBuffer(); + for (size_t i = 0; i < m_nChannel * m_halfFFTSize; ++i) { *(buf + i) = real(z[i]); } + m_encoders[2].encodeBuffer(); + context->markOutputAsReadyToSend(2, m_lastChunkStartTime, m_lastChunkEndTime); + } + if (m_imagPartSpectrum) + { + CMatrix* matrix = m_encoders[3].getInputMatrix(); + double* buf = matrix->getBuffer(); + for (size_t i = 0; i < m_nChannel * m_halfFFTSize; ++i) { *(buf + i) = imag(z[i]); } + m_encoders[3].encodeBuffer(); + context->markOutputAsReadyToSend(3, m_lastChunkStartTime, m_lastChunkEndTime); + } + } + context->markInputAsDeprecated(0, idx); + } + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCSpectralAnalysis.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCSpectralAnalysis.h new file mode 100644 index 0000000..373d255 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCSpectralAnalysis.h @@ -0,0 +1,97 @@ +// @copyright notice: Possibly due to dependencies, this box used to be GPL before upgrade to AGPL3 + +#pragma once + +#if defined TARGET_HAS_ThirdPartyITPP + +#include "../ovp_defines.h" + +#include + +#include +#include + +#ifndef CString2Boolean +#define CString2Boolean(string) (strcmp(string,"true"))?0:1 +#endif + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +/** +* The Spectral Anlaysis plugin's main class. +*/ +class CSpectralAnalysis final : virtual public Toolkit::TBoxAlgorithm +{ +public: + + CSpectralAnalysis() { } + + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_SpectralAnalysis) + +private: + + //start time and end time of the last arrived chunk + uint64_t m_lastChunkStartTime = 0; + uint64_t m_lastChunkEndTime = 0; + + //codecs + Toolkit::TSignalDecoder m_decoder; + Toolkit::TSpectrumEncoder m_encoders[4]; + + ///number of channels + size_t m_nChannel = 0; + size_t m_sampling = 0; + size_t m_nFrequencyBand = 0; + size_t m_nSample = 0; + + size_t m_halfFFTSize = 1; // m_nSample / 2 + 1; + + bool m_amplitudeSpectrum = false; + bool m_phaseSpectrum = false; + bool m_realPartSpectrum = false; + bool m_imagPartSpectrum = false; +}; + +class CSpectralAnalysisDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("Spectral Analysis (FFT)(INSERM contrib)"); } + CString getAuthorName() const override { return CString("Guillaume Gibert"); } + CString getAuthorCompanyName() const override { return CString("INSERM"); } + CString getShortDescription() const override { return CString("Compute spectral analysis using Fast Fourier Transform"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Signal processing/Spectral Analysis"); } + CString getVersion() const override { return CString("0.1"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_SpectralAnalysis; } + IPluginObject* create() override { return new CSpectralAnalysis(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + + prototype.addOutput("Amplitude", OV_TypeId_Spectrum); + prototype.addOutput("Phase", OV_TypeId_Spectrum); + prototype.addOutput("Real Part", OV_TypeId_Spectrum); + prototype.addOutput("Imag Part", OV_TypeId_Spectrum); + + prototype.addSetting("Spectral components", OVP_TypeId_SpectralComponent, "Amplitude"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_SpectralAnalysisDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyITPP diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCTemporalFilterBoxAlgorithm.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCTemporalFilterBoxAlgorithm.cpp new file mode 100644 index 0000000..3169911 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCTemporalFilterBoxAlgorithm.cpp @@ -0,0 +1,206 @@ +#include "ovpCTemporalFilterBoxAlgorithm.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CTemporalFilterBoxAlgorithm::initialize() +{ + m_decoder = new Toolkit::TSignalDecoder(*this, 0); + m_encoder = new Toolkit::TSignalEncoder(*this, 0); + + // Compute filter coeff algorithm + m_computeTemporalFilterCoefs = &getAlgorithmManager().getAlgorithm( + getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_ComputeTemporalFilterCoefs)); + m_computeTemporalFilterCoefs->initialize(); + + // Apply filter to signal input buffer + m_applyTemporalFilter = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_ApplyTemporalFilter)); + m_applyTemporalFilter->initialize(); + + m_lastEndTime = 0; + + // compute filter coefs settings + const CString filter = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + const CString kindFilter = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + const CString order = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + const CString lowPassBandEdge = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + const CString highPassBandEdge = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + const CString passBandRipple = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5); + + bool initError = false; + char* endPtr = nullptr; + + + uint64_t uiParameter = this->getTypeManager().getEnumerationEntryValueFromName(OVP_TypeId_FilterMethod, filter); + if (uiParameter == CIdentifier::undefined().id()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Unrecognized filter method " << filter << ".\n"; + initError = true; + } + Kernel::TParameterHandler ip_nameFilter( + m_computeTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterMethod)); + ip_nameFilter = uiParameter; + + + uiParameter = this->getTypeManager().getEnumerationEntryValueFromName(OVP_TypeId_FilterType, kindFilter); + if (uiParameter == CIdentifier::undefined().id()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Unrecognized filter type " << kindFilter << ".\n"; + initError = true; + } + Kernel::TParameterHandler ip_kindFilter( + m_computeTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterType)); + ip_kindFilter = uiParameter; + + errno = 0; + const int64_t intParameter = strtol(order, &endPtr, 10); + if (intParameter <= 0 || (errno != 0 && intParameter == 0) || *endPtr != '\0' || errno == ERANGE) + { + this->getLogManager() << Kernel::LogLevel_Error << "Wrong filter order (" << order << "). Should be one or more.\n"; + initError = true; + } + Kernel::TParameterHandler ip_filterOrder( + m_computeTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterOrder)); + ip_filterOrder = intParameter; + + errno = 0; + double dParameter = strtod(lowPassBandEdge, &endPtr); + if (dParameter < 0 || (errno != 0 && dParameter == 0) || *endPtr != '\0' || errno == ERANGE) + { + this->getLogManager() << Kernel::LogLevel_Error << "Wrong low cut frequency (" << lowPassBandEdge << " Hz). Should be positive.\n"; + initError = true; + } + Kernel::TParameterHandler ip_lowCutFrequency( + m_computeTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_LowCutFrequency)); + ip_lowCutFrequency = dParameter; + + errno = 0; + dParameter = strtod(highPassBandEdge, &endPtr); + if (dParameter < 0 || (errno != 0 && dParameter == 0) || *endPtr != '\0' || errno == ERANGE) + { + this->getLogManager() << Kernel::LogLevel_Error << "Wrong high cut frequency (" << highPassBandEdge << " Hz). Should be positive.\n"; + initError = true; + } + else if (dParameter < double(ip_lowCutFrequency)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Wrong high cut frequency (" << highPassBandEdge << " Hz). Should be over the low cut frequency " + << lowPassBandEdge << " Hz.\n"; + initError = true; + } + Kernel::TParameterHandler ip_highCutFrequency( + m_computeTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_HighCutFrequency)); + ip_highCutFrequency = dParameter; + + errno = 0; + dParameter = strtod(passBandRipple, &endPtr); + if ((errno != 0 && dParameter == 0) || *endPtr != '\0' || errno == ERANGE) + { + this->getLogManager() << Kernel::LogLevel_Error << "Wrong pass band ripple (" << passBandRipple << " dB).\n"; + initError = true; + } + Kernel::TParameterHandler ip_passBandRipple( + m_computeTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_BandPassRipple)); + ip_passBandRipple = dParameter; + + + Kernel::TParameterHandler + ip_sampling(m_computeTemporalFilterCoefs->getInputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_Sampling)); + ip_sampling.setReferenceTarget(m_decoder->getOutputSamplingRate()); + + // apply filter settings + m_applyTemporalFilter->getInputParameter(OVP_Algorithm_ApplyTemporalFilter_InputParameterId_FilterCoefsMatrix)->setReferenceTarget( + m_computeTemporalFilterCoefs->getOutputParameter(OVP_Algorithm_ComputeTemporalFilterCoefs_OutputParameterId_Matrix)); + + m_encoder->getInputMatrix().setReferenceTarget( + m_applyTemporalFilter->getOutputParameter(OVP_Algorithm_ApplyTemporalFilter_OutputParameterId_FilteredSignalMatrix)); + m_encoder->getInputSamplingRate().setReferenceTarget(m_decoder->getOutputSamplingRate()); + + if (initError) + { + this->getLogManager() << Kernel::LogLevel_Error << "Something went wrong during the intialization. Desactivation of the box.\n"; + return false; + } + + return true; +} + +bool CTemporalFilterBoxAlgorithm::uninitialize() +{ + m_applyTemporalFilter->uninitialize(); + getAlgorithmManager().releaseAlgorithm(*m_applyTemporalFilter); + m_computeTemporalFilterCoefs->uninitialize(); + getAlgorithmManager().releaseAlgorithm(*m_computeTemporalFilterCoefs); + + //codecs + m_encoder->uninitialize(); + delete m_encoder; + m_decoder->uninitialize(); + delete m_decoder; + return true; +} + +bool CTemporalFilterBoxAlgorithm::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CTemporalFilterBoxAlgorithm::process() +{ + Kernel::IBoxIO& boxContext = getDynamicBoxContext(); + const size_t nInput = getStaticBoxContext().getInputCount(); + + for (size_t i = 0; i < nInput; ++i) + { + for (size_t j = 0; j < boxContext.getInputChunkCount(i); ++j) + { + const uint64_t tStart = boxContext.getInputChunkStartTime(i, j); + const uint64_t tEnd = boxContext.getInputChunkEndTime(i, j); + + if (!m_decoder->decode(j)) { return false; } + + //this has to be done here as it does not work if done once in initialize() + CMatrix* iMatrix = m_decoder->getOutputMatrix(); + Kernel::TParameterHandler matrixToFilter = m_applyTemporalFilter->getInputParameter( + OVP_Algorithm_ApplyTemporalFilter_InputParameterId_SignalMatrix); + matrixToFilter.setReferenceTarget(iMatrix); + + if (m_decoder->isHeaderReceived()) + { + if (!m_computeTemporalFilterCoefs->process(OVP_Algorithm_ComputeTemporalFilterCoefs_InputTriggerId_Initialize)) { return false; } + if (!m_computeTemporalFilterCoefs->process(OVP_Algorithm_ComputeTemporalFilterCoefs_InputTriggerId_ComputeCoefs)) { return false; } + if (!m_applyTemporalFilter->process(OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_Initialize)) { return false; } + if (!m_encoder->encodeHeader()) { return false; } + + boxContext.markOutputAsReadyToSend(i, tStart, tEnd); + } + if (m_decoder->isBufferReceived()) + { + if (m_lastEndTime == tStart) + { + if (!m_applyTemporalFilter->process(OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_ApplyFilterWithHistoric)) { return false; } + } + else { if (!m_applyTemporalFilter->process(OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_ApplyFilter)) { return false; } } + if (!m_encoder->encodeBuffer()) { return false; } + boxContext.markOutputAsReadyToSend(i, tStart, tEnd); + } + if (m_decoder->isEndReceived()) + { + if (!m_encoder->encodeEnd()) { return false; } + boxContext.markOutputAsReadyToSend(i, tStart, tEnd); + } + + // m_lastStartTime=tStart; + m_lastEndTime = tEnd; + boxContext.markInputAsDeprecated(i, j); + } + } + + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCTemporalFilterBoxAlgorithm.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCTemporalFilterBoxAlgorithm.h new file mode 100644 index 0000000..695cf87 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCTemporalFilterBoxAlgorithm.h @@ -0,0 +1,75 @@ +// @copyright notice: Possibly due to dependencies, this box used to be GPL before upgrade to AGPL3 + +#pragma once + +#include "../ovp_defines.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CTemporalFilterBoxAlgorithm final : virtual public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_Box_TemporalFilterBoxAlgorithm) + +protected: + + Toolkit::TSignalDecoder* m_decoder = nullptr; + Toolkit::TSignalEncoder* m_encoder = nullptr; + Kernel::IAlgorithmProxy* m_computeTemporalFilterCoefs = nullptr; + Kernel::IAlgorithmProxy* m_applyTemporalFilter = nullptr; + + Kernel::TParameterHandler ip_bufferToDecode; + Kernel::TParameterHandler op_encodedBuffer; + //uint64_t m_lastStartTime = 0; + uint64_t m_lastEndTime = 0; +}; + +class CTemporalFilterBoxAlgorithmDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("Temporal Filter (INSERM contrib)"); } + CString getAuthorName() const override { return CString("Guillaume Gibert"); } + CString getAuthorCompanyName() const override { return CString("INSERM/U821"); } + CString getShortDescription() const override { return CString("Applies temporal filtering on time signal"); } + + CString getDetailedDescription() const override { return CString("The user can choose among a variety of filter types to process the signal"); } + + CString getCategory() const override { return CString("Signal processing/Temporal Filtering"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString(""); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Box_TemporalFilterBoxAlgorithm; } + IPluginObject* create() override { return new CTemporalFilterBoxAlgorithm(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addOutput("Filtered signal", OV_TypeId_Signal); + prototype.addSetting("Filter method", OVP_TypeId_FilterMethod, "Butterworth"); + prototype.addSetting("Filter type", OVP_TypeId_FilterType, "Band Pass"); + prototype.addSetting("Filter order", OV_TypeId_Integer, "4"); + prototype.addSetting("Low cut frequency (Hz)", OV_TypeId_Float, "29"); + prototype.addSetting("High cut frequency (Hz)", OV_TypeId_Float, "40"); + prototype.addSetting("Pass band ripple (dB)", OV_TypeId_Float, "0.5"); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_Box_TemporalFilterBoxAlgorithmDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCWindowingFunctions.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCWindowingFunctions.cpp new file mode 100644 index 0000000..daf40e2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCWindowingFunctions.cpp @@ -0,0 +1,115 @@ +#if defined TARGET_HAS_ThirdPartyITPP + +#include "ovpCWindowingFunctions.h" + +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +void CWindowingFunctions::setSampleBuffer(const double* buffer) const +{ + itpp::vec windows = itpp::ones(int(m_SamplesPerBuffer)); + + if (m_WindowMethod == EWindowMethod::Hamming) { windows = itpp::hamming(int(m_SamplesPerBuffer)); } + else if (m_WindowMethod == EWindowMethod::Hanning) { windows = itpp::hanning(int(m_SamplesPerBuffer)); } + else if (m_WindowMethod == EWindowMethod::Hann) { windows = itpp::hann(int(m_SamplesPerBuffer)); } + else if (m_WindowMethod == EWindowMethod::Blackman) { windows = itpp::blackman(int(m_SamplesPerBuffer)); } + else if (m_WindowMethod == EWindowMethod::Triangular) { windows = itpp::triang(int(m_SamplesPerBuffer)); } + else if (m_WindowMethod == EWindowMethod::SquareRoot) { windows = itpp::sqrt_win(int(m_SamplesPerBuffer)); } + + for (size_t i = 0; i < m_NChannel; ++i) + { + for (size_t j = 0; j < m_SamplesPerBuffer; ++j) { m_Buffer[i * m_SamplesPerBuffer + j] = double(buffer[i * m_SamplesPerBuffer + j]) * windows(int(j)); } + } +} + +bool CWindowingFunctions::initialize() +{ + //reads the plugin settings + const CString method = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_WindowMethod = EWindowMethod(this->getTypeManager().getEnumerationEntryValueFromName(OVP_TypeId_WindowMethod, method)); + + m_Decoder = new Toolkit::TSignalDecoder(*this, 0); + m_Encoder = new Toolkit::TSignalEncoder(*this, 0); + + return true; +} + +bool CWindowingFunctions::uninitialize() +{ + m_Decoder->uninitialize(); + delete m_Decoder; + m_Encoder->uninitialize(); + delete m_Encoder; + + return true; +} + +bool CWindowingFunctions::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CWindowingFunctions::process() +{ + IDynamicBoxContext* boxContext = getBoxAlgorithmContext()->getDynamicBoxContext(); + + // Process input data + for (size_t i = 0; i < boxContext->getInputChunkCount(0); ++i) + { + size_t chunkSize; + const uint8_t* buffer; + boxContext->getInputChunk(0, i, m_LastChunkStartTime, m_LastChunkEndTime, chunkSize, buffer); + + + m_Decoder->decode(i); + if (m_Decoder->isHeaderReceived()) + { + CMatrix* iMatrix = m_Decoder->getOutputMatrix(); + CMatrix* oMatrix = m_Encoder->getInputMatrix(); + + oMatrix->copy(*iMatrix); + + m_Buffer = oMatrix->getBuffer(); + m_SamplesPerBuffer = oMatrix->getDimensionSize(1); + m_NChannel = oMatrix->getDimensionSize(0); + + const size_t sampling = m_Decoder->getOutputSamplingRate(); + m_Encoder->getInputSamplingRate() = sampling; + + m_Encoder->encodeHeader(); + boxContext->markOutputAsReadyToSend(i, m_LastChunkStartTime, m_LastChunkEndTime); + } + if (m_Decoder->isBufferReceived()) + { + CMatrix* iMatrix = m_Decoder->getOutputMatrix(); + m_Buffer = m_Encoder->getInputMatrix()->getBuffer(); + setSampleBuffer(iMatrix->getBuffer()); + + m_Encoder->encodeBuffer(); + boxContext->markOutputAsReadyToSend(i, m_LastChunkStartTime, m_LastChunkEndTime); + } + if (m_Decoder->isEndReceived()) + { + m_Encoder->encodeEnd(); + boxContext->markOutputAsReadyToSend(i, m_LastChunkStartTime, m_LastChunkEndTime); + } + + + boxContext->markInputAsDeprecated(0, i); + //m_pReader->processData(buffer, chunkSize); + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyITPP diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCWindowingFunctions.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCWindowingFunctions.h new file mode 100644 index 0000000..552f85b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCWindowingFunctions.h @@ -0,0 +1,110 @@ +// @copyright notice: Possibly due to dependencies, this box used to be GPL before upgrade to AGPL3 + +#pragma once + +#if defined TARGET_HAS_ThirdPartyITPP + +#include "../ovp_defines.h" + +#include + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +namespace WindowingFunctions { +// Used to store information about the signal stream +class CSignalDescription +{ +public: + + CSignalDescription() { } + + size_t m_StreamVersion = 1; + size_t m_Sampling = 0; + size_t m_NChannel = 0; + size_t m_NSample = 0; + std::vector m_ChannelName; + size_t m_CurrentChannel = 0; + + bool m_ReadyToSend = false; +}; +} // namespace WindowingFunctions + +/** +* The Window Anlaysis plugin's main class. +*/ +class CWindowingFunctions final : virtual public Toolkit::TBoxAlgorithm +{ +public: + + CWindowingFunctions() { } + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + + bool process() override; + + _IsDerivedFromClass_Final_(IBoxAlgorithm, OVP_ClassId_WindowingFunctions) + + void setSampleBuffer(const double* buffer) const; + + //start time and end time of the last arrived chunk + uint64_t m_LastChunkStartTime = 0; + uint64_t m_LastChunkEndTime = 0; + size_t m_SamplesPerBuffer = 0; + size_t m_NChannel = 0; + + // Needed to write on the plugin output + Toolkit::TSignalDecoder* m_Decoder = nullptr; + Toolkit::TSignalEncoder* m_Encoder = nullptr; + + //! Structure containing information about the signal stream + WindowingFunctions::CSignalDescription* m_SignalDesc = nullptr; + + //! Size of the matrix buffer (output signal) + size_t m_BufferSize = 0; + //! Output signal's matrix buffer + double* m_Buffer = nullptr; + + EWindowMethod m_WindowMethod = EWindowMethod::None; +}; + +class CWindowingFunctionsDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("Windowing (INSERM contrib)"); } + CString getAuthorName() const override { return CString("Guillaume Gibert"); } + CString getAuthorCompanyName() const override { return CString("INSERM"); } + CString getShortDescription() const override { return CString("Apply a window to the signal buffer"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Signal processing/Windowing"); } + CString getVersion() const override { return CString("0.1"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_WindowingFunctions; } + IPluginObject* create() override { return new CWindowingFunctions(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addOutput("Output signal", OV_TypeId_Signal); + prototype.addSetting("Window method", OVP_TypeId_WindowMethod, "Hamming"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_WindowingFunctionsDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyITPP diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/ovp_defines.h new file mode 100644 index 0000000..68c40dc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/ovp_defines.h @@ -0,0 +1,132 @@ +#pragma once + + +// @BEGIN inserm-gpl + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_SpectralAnalysis OpenViBE::CIdentifier(0x1491AFA8, 0xF81E49D5) +#define OVP_ClassId_SpectralAnalysisDesc OpenViBE::CIdentifier(0xD011A66C, 0x61EF37D0) +#define OVP_ClassId_Algorithm_DetectingMinMax OpenViBE::CIdentifier(0x46C14A64, 0xE00541DD) +#define OVP_ClassId_Algorithm_DetectingMinMaxDesc OpenViBE::CIdentifier(0x5B194CDA, 0x54E6DEC7) +#define OVP_ClassId_Box_DetectingMinMaxBoxAlgorithm OpenViBE::CIdentifier(0xD647A2C4, 0xD4833160) +#define OVP_ClassId_Box_DetectingMinMaxBoxAlgorithmDesc OpenViBE::CIdentifier(0xEF9E296A, 0x10285AE1) +#define OVP_ClassId_Algorithm_Downsampling OpenViBE::CIdentifier(0xBBBB4E18, 0x17695604) +#define OVP_ClassId_Algorithm_DownsamplingDesc OpenViBE::CIdentifier(0xC08BA8C1, 0x3A3B6E26) +#define OVP_ClassId_Box_DownsamplingBoxAlgorithm OpenViBE::CIdentifier(0x6755FD0F, 0xE4857EA8) +#define OVP_ClassId_Box_DownsamplingBoxAlgorithmDesc OpenViBE::CIdentifier(0xC8A99636, 0x81EF1AAD) +#define OVP_ClassId_Algorithm_ComputeTemporalFilterCoefs OpenViBE::CIdentifier(0x55BAD77B, 0x5D8563A7) +#define OVP_ClassId_Algorithm_ComputeTemporalFilterCoefsDesc OpenViBE::CIdentifier(0xD871BD98, 0x705ED068) +#define OVP_ClassId_Algorithm_ApplyTemporalFilter OpenViBE::CIdentifier(0x9662518A, 0xE301A6FF) +#define OVP_ClassId_Algorithm_ApplyTemporalFilterDesc OpenViBE::CIdentifier(0xAC0D004F, 0x0CFC5D9E) +#define OVP_ClassId_Box_TemporalFilterBoxAlgorithm OpenViBE::CIdentifier(0x4469F0B2, 0x1DA995E5) +#define OVP_ClassId_Box_TemporalFilterBoxAlgorithmDesc OpenViBE::CIdentifier(0x8BF6DD60, 0xBF02FA77) +#define OVP_ClassId_Box_ModTemporalFilterBoxAlgorithm OpenViBE::CIdentifier(0xBF49D042, 0x9D79FE52) +#define OVP_ClassId_Box_ModTemporalFilterBoxAlgorithmDesc OpenViBE::CIdentifier(0x7BF4BA62, 0xAF829A73) +#define OVP_ClassId_WindowingFunctions OpenViBE::CIdentifier(0x0B2F38AE, 0x6B0CF98F) +#define OVP_ClassId_WindowingFunctionsDesc OpenViBE::CIdentifier(0x40BFF79E, 0xA7BA6EAE) +#define OVP_ClassId_FastICA OpenViBE::CIdentifier(0x00649B6E, 0x6C88CD17) +#define OVP_ClassId_FastICADesc OpenViBE::CIdentifier(0x00E9436C, 0x41C904CA) +#define OVP_ClassId_AlgoUnivariateStatistic OpenViBE::CIdentifier(0x07A71212, 0x53D93D1C) +#define OVP_ClassId_AlgoUnivariateStatisticDesc OpenViBE::CIdentifier(0x408157F7, 0x4F1209F7) +#define OVP_ClassId_BoxAlgorithm_CSPSpatialFilterTrainer OpenViBE::CIdentifier(0x51DB0D64, 0x2109714E) +#define OVP_ClassId_BoxAlgorithm_CSPSpatialFilterTrainerDesc OpenViBE::CIdentifier(0x05120978, 0x14E061CD) +#define OVP_ClassId_BoxAlgorithm_Synchro OpenViBE::CIdentifier(0x7D8C1A18, 0x4C273A91) +#define OVP_ClassId_BoxAlgorithm_SynchroDesc OpenViBE::CIdentifier(0x4E806E5E, 0x5035290D) +#define OVP_ClassId_BoxAlgorithm_UnivariateStatistic OpenViBE::CIdentifier(0x6118159D, 0x600C40B9) +#define OVP_ClassId_BoxAlgorithm_UnivariateStatisticDesc OpenViBE::CIdentifier(0x36F742D9, 0x6D1477B2) + + +// Type definitions +//--------------------------------------------------------------------------------------------------- +#define OVP_TypeId_SpectralComponent OpenViBE::CIdentifier(0x764E148A, 0xC704D4F5) +#define OVP_TypeId_FilterMethod OpenViBE::CIdentifier(0x2F2C606C, 0x8512ED68) +#define OVP_TypeId_FilterType OpenViBE::CIdentifier(0xFA20178E, 0x4CBA62E9) +#define OVP_TypeId_WindowMethod OpenViBE::CIdentifier(0x0A430FE4, 0x4F318280) +#define OVP_TypeId_FrequencyCutOffRatio OpenViBE::CIdentifier(0x709FC9DF, 0x30A2CB2A) +#define OVP_TypeId_MinMax OpenViBE::CIdentifier(0x4263AC45, 0x0AF5E07E) +#define OVP_TypeId_FastICA_OperatingMode OpenViBE::CIdentifier(0x43A71032, 0x4AF96B9F) +#define OVP_TypeId_FastICA_DecompositionType OpenViBE::CIdentifier(0x7B876033, 0x13590B93) +#define OVP_TypeId_FastICA_Nonlinearity OpenViBE::CIdentifier(0x4313472F, 0x37FD5961) + +enum class ESpectralComponent { Amplitude = 1, Phase = 2, RealPart = 4, ImaginaryPart = 8 }; + +enum class EFilterMethod { Butterworth, Chebyshev, YuleWalker }; + +enum class EFilterType { LowPass, BandPass, HighPass, BandStop }; + +enum class EWindowMethod { None, Hamming, Hanning, Hann, Blackman, Triangular, SquareRoot }; + +enum class EFrequencyCutOffRatio { R14, R13, R12 }; + +enum class EMinMax { Min, Max }; + +enum class EFastICAMode { PCA, Whiten, ICA }; + +enum class EFastICADecomposition { Symmetric = 1, Deflate = 2 }; // Symmetric Must match ITPP + +enum class EFastICANonlinearity { Pow3 = 10, Tanh = 20, Gauss= 30, Skew = 40 }; // Use x^3/tanh(x)/Gaussian/skew non-linearity. Pow3 Must match ITPP. + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) + +#define OVP_Algorithm_DetectingMinMax_InputParameterId_SignalMatrix OpenViBE::CIdentifier(0x9CA3B6BB, 0x6E24A3E3) +#define OVP_Algorithm_DetectingMinMax_InputParameterId_TimeWindowStart OpenViBE::CIdentifier(0xB3DED659, 0xD8A85CFA) +#define OVP_Algorithm_DetectingMinMax_InputParameterId_TimeWindowEnd OpenViBE::CIdentifier(0x9F55A091, 0xA042E9C0) +#define OVP_Algorithm_DetectingMinMax_InputParameterId_Sampling OpenViBE::CIdentifier(0x8519915D, 0xB6BE506D) +#define OVP_Algorithm_DetectingMinMax_OutputParameterId_SignalMatrix OpenViBE::CIdentifier(0x853F2DE5, 0x628237CE) +#define OVP_Algorithm_DetectingMinMax_InputTriggerId_Initialize OpenViBE::CIdentifier(0x6B43B69D, 0xDA1EAE30) +#define OVP_Algorithm_DetectingMinMax_InputTriggerId_DetectsMin OpenViBE::CIdentifier(0xFCB3CFC2, 0x980E3085) +#define OVP_Algorithm_DetectingMinMax_InputTriggerId_DetectsMax OpenViBE::CIdentifier(0x24926194, 0x086E6C2A) + +#define OVP_Algorithm_Downsampling_InputParameterId_Sampling OpenViBE::CIdentifier(0x7C510AFB, 0x4F2B9FB7) +#define OVP_Algorithm_Downsampling_InputParameterId_NewSampling OpenViBE::CIdentifier(0x8617E5FA, 0xC39CDBE7) +#define OVP_Algorithm_Downsampling_InputTriggerId_Initialize OpenViBE::CIdentifier(0x82D96F84, 0x9479A701) +#define OVP_Algorithm_Downsampling_InputTriggerId_Resample OpenViBE::CIdentifier(0x2A88AFF5, 0x79ECAEB3) +#define OVP_Algorithm_Downsampling_InputTriggerId_ResampleWithHistoric OpenViBE::CIdentifier(0xD5740B33, 0x3785C886) +#define OVP_Algorithm_Downsampling_InputParameterId_SignalMatrix OpenViBE::CIdentifier(0xBB09054A, 0xEF13B2C6) +#define OVP_Algorithm_Downsampling_OutputParameterId_SignalMatrix OpenViBE::CIdentifier(0x4B9BE135, 0x14C10757) + +#define OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_Sampling OpenViBE::CIdentifier(0x25A9A0FF, 0x168F1B50) +#define OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterMethod OpenViBE::CIdentifier(0xCFB7CDC9, 0x3EFF788E) +#define OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterType OpenViBE::CIdentifier(0x1B7BCB2C, 0xE235A6E7) +#define OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_FilterOrder OpenViBE::CIdentifier(0x8DA1E555, 0x17E17828) +#define OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_LowCutFrequency OpenViBE::CIdentifier(0x3175B774, 0xA15AEEB2) +#define OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_HighCutFrequency OpenViBE::CIdentifier(0xE36387B7, 0xFB766612) +#define OVP_Algorithm_ComputeTemporalFilterCoefs_InputParameterId_BandPassRipple OpenViBE::CIdentifier(0xB1500ED4, 0x0E558759) +#define OVP_Algorithm_ComputeTemporalFilterCoefs_OutputParameterId_Matrix OpenViBE::CIdentifier(0xE5B2A753, 0x150500B4) +#define OVP_Algorithm_ComputeTemporalFilterCoefs_InputTriggerId_Initialize OpenViBE::CIdentifier(0x3D2CBA61, 0x3FCF0DAC) +#define OVP_Algorithm_ComputeTemporalFilterCoefs_InputTriggerId_ComputeCoefs OpenViBE::CIdentifier(0x053A2C6E, 0x3A878825) +#define OVP_Algorithm_ApplyTemporalFilter_InputParameterId_FilterCoefsMatrix OpenViBE::CIdentifier(0xD316C4E7, 0xE4E89FD3) +#define OVP_Algorithm_ApplyTemporalFilter_InputParameterId_SignalMatrix OpenViBE::CIdentifier(0xD5339105, 0x1D1293F0) +#define OVP_Algorithm_ApplyTemporalFilter_OutputParameterId_FilteredSignalMatrix OpenViBE::CIdentifier(0x463276D1, 0xEAEE8AAD) +#define OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_Initialize OpenViBE::CIdentifier(0x3DAE69C7, 0x7CFCBE2C) +#define OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_ApplyFilter OpenViBE::CIdentifier(0xBC1F5655, 0x9807B400) +#define OVP_Algorithm_ApplyTemporalFilter_InputTriggerId_ApplyFilterWithHistoric OpenViBE::CIdentifier(0xB7B7D546, 0x6000FF51) + + +#define OVP_Algorithm_UnivariateStatistic_OutputParameterId_Mean OpenViBE::CIdentifier(0x2E1E6A87, 0x17F37568) +#define OVP_Algorithm_UnivariateStatistic_OutputParameterId_Var OpenViBE::CIdentifier(0x479E18C9, 0x34A561AC) +#define OVP_Algorithm_UnivariateStatistic_OutputParameterId_Range OpenViBE::CIdentifier(0x3CBC7D63, 0x5BF90946) +#define OVP_Algorithm_UnivariateStatistic_OutputParameterId_Med OpenViBE::CIdentifier(0x2B236D6C, 0x4A37734F) +#define OVP_Algorithm_UnivariateStatistic_OutputParameterId_IQR OpenViBE::CIdentifier(0x7A4E5C6E, 0x16EA324E) +#define OVP_Algorithm_UnivariateStatistic_OutputParameterId_Percent OpenViBE::CIdentifier(0x77443BEF, 0x687B139F) +#define OVP_Algorithm_UnivariateStatistic_OutputParameterId_PercentValue OpenViBE::CIdentifier(0x2E9B5EEA, 0x58BC5AB6) +#define OVP_Algorithm_UnivariateStatistic_OutputParameterId_Compression OpenViBE::CIdentifier(0x2A9C502C, 0x582959DA) +#define OVP_Algorithm_UnivariateStatistic_InputParameterId_Matrix OpenViBE::CIdentifier(0x1769269C, 0x41910DB9) +#define OVP_Algorithm_UnivariateStatistic_InputParameterId_MeanActive OpenViBE::CIdentifier(0x6CE22614, 0x3BFD4A7A) +#define OVP_Algorithm_UnivariateStatistic_InputParameterId_VarActive OpenViBE::CIdentifier(0x304B052D, 0x04F51601) +#define OVP_Algorithm_UnivariateStatistic_InputParameterId_RangeActive OpenViBE::CIdentifier(0x4EA54A91, 0x69B90629) +#define OVP_Algorithm_UnivariateStatistic_InputParameterId_MedActive OpenViBE::CIdentifier(0x6B0F55F1, 0x30015B5B) +#define OVP_Algorithm_UnivariateStatistic_InputParameterId_IQRActive OpenViBE::CIdentifier(0x4F99672C, 0x7DFF3192) +#define OVP_Algorithm_UnivariateStatistic_InputParameterId_PercentActive OpenViBE::CIdentifier(0x3CA94023, 0x44E450C6) +#define OVP_Algorithm_UnivariateStatistic_InputParameterId_PercentValue OpenViBE::CIdentifier(0x0CB41979, 0x1CFF5A9C) +#define OVP_Algorithm_UnivariateStatistic_InputTriggerId_SpecialInitialize OpenViBE::CIdentifier(0x38274F8D, 0x5FB938D2) +#define OVP_Algorithm_UnivariateStatistic_InputTriggerId_Initialize OpenViBE::CIdentifier(0x42CC2481, 0x70300F6D) +#define OVP_Algorithm_UnivariateStatistic_InputTriggerId_Process OpenViBE::CIdentifier(0x6CCD1D92, 0x02043C21) +#define OVP_Algorithm_UnivariateStatistic_OutputTriggerId_ProcessDone OpenViBE::CIdentifier(0x34630103, 0x3F5F0A43) diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/ovp_main.cpp new file mode 100755 index 0000000..09d8acb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/processing/signal-processing/src/ovp_main.cpp @@ -0,0 +1,117 @@ +#include +#include +#include "ovp_defines.h" + +#include "box-algorithms/ovpCBoxAlgorithmCSPSpatialFilterTrainer.h" // ghent univ +#include "algorithms/ovpCAlgorithmUnivariateStatistics.h" // gipsa +#include "box-algorithms/ovpCBoxAlgorithmUnivariateStatistics.h" // gipsa +#include "box-algorithms/ovpCBoxAlgorithmSynchro.h" // gipsa + +// @BEGIN inserm-gpl +#include "algorithms/ovpCDetectingMinMax.h" +#include "box-algorithms/ovpCDetectingMinMaxBoxAlgorithm.h" + +#include "box-algorithms/ovpCWindowingFunctions.h" +#include "box-algorithms/ovpCFastICA.h" +#include "box-algorithms/ovpCSpectralAnalysis.h" + +#include "algorithms/ovpCApplyTemporalFilter.h" +#include "algorithms/ovpCComputeTemporalFilterCoefficients.h" +#include "box-algorithms/ovpCTemporalFilterBoxAlgorithm.h" +#include "box-algorithms/ovpCModTemporalFilterBoxAlgorithm.h" + +#include "algorithms/ovpCDownsampling.h" +#include "box-algorithms/ovpCDownsamplingBoxAlgorithm.h" + +#include "algorithms/ovpCDetectingMinMax.h" +#include "box-algorithms/ovpCDetectingMinMaxBoxAlgorithm.h" +// @END inserm-gpl + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +OVP_Declare_Begin() +#if defined TARGET_HAS_ThirdPartyITPP + OVP_Declare_New(CBoxAlgorithmCSPSpatialFilterTrainerDesc); // ghent univ +#endif + + OVP_Declare_New(CBoxAlgorithmSynchroDesc) // gipsa + OVP_Declare_New(CAlgoUnivariateStatisticDesc); // gipsa + OVP_Declare_New(CBoxUnivariateStatisticDesc); // gipsa + + + // @BEGIN inserm-gpl + context.getTypeManager().registerBitMaskType(OVP_TypeId_SpectralComponent, "Spectral component"); + context.getTypeManager().registerBitMaskEntry(OVP_TypeId_SpectralComponent, "Amplitude", size_t(ESpectralComponent::Amplitude)); + context.getTypeManager().registerBitMaskEntry(OVP_TypeId_SpectralComponent, "Phase", size_t(ESpectralComponent::Phase)); + context.getTypeManager().registerBitMaskEntry(OVP_TypeId_SpectralComponent, "Real part", size_t(ESpectralComponent::RealPart)); + context.getTypeManager().registerBitMaskEntry(OVP_TypeId_SpectralComponent, "Imaginary part", size_t(ESpectralComponent::ImaginaryPart)); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_FilterMethod, "Filter method"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterMethod, "Butterworth", size_t(EFilterMethod::Butterworth)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterMethod, "Chebyshev", size_t(EFilterMethod::Chebyshev)); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_FilterType, "Filter type"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterType, "Low Pass", size_t(EFilterType::LowPass)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterType, "Band Pass", size_t(EFilterType::BandPass)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterType, "High Pass", size_t(EFilterType::HighPass)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterType, "Band Stop", size_t(EFilterType::BandStop)); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_WindowMethod, "Window method"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WindowMethod, "Hamming", size_t(EWindowMethod::Hamming)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WindowMethod, "Hanning", size_t(EWindowMethod::Hanning)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WindowMethod, "Hann", size_t(EWindowMethod::Hann)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WindowMethod, "Blackman", size_t(EWindowMethod::Blackman)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WindowMethod, "Triangular", size_t(EWindowMethod::Triangular)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WindowMethod, "Square root", size_t(EWindowMethod::SquareRoot)); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_FrequencyCutOffRatio, "Frequency cut off ratio"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FrequencyCutOffRatio, "1/4", size_t(EFrequencyCutOffRatio::R14)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FrequencyCutOffRatio, "1/3", size_t(EFrequencyCutOffRatio::R13)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FrequencyCutOffRatio, "1/2", size_t(EFrequencyCutOffRatio::R12)); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_MinMax, "Min/Max"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_MinMax, "Min", size_t(EMinMax::Min)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_MinMax, "Max", size_t(EMinMax::Max)); + + context.getTypeManager().registerEnumerationEntry(OV_TypeId_BoxAlgorithmFlag, OV_AttributeId_Box_FlagIsUnstable.toString(), + OV_AttributeId_Box_FlagIsUnstable.id()); + +#if defined TARGET_HAS_ThirdPartyITPP + + OVP_Declare_New(CSpectralAnalysisDesc); + OVP_Declare_New(CFastICADesc); + context.getTypeManager().registerEnumerationType(OVP_TypeId_FastICA_OperatingMode, "Operating mode"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FastICA_OperatingMode, "PCA", size_t(EFastICAMode::PCA)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FastICA_OperatingMode, "Whiten", size_t(EFastICAMode::Whiten)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FastICA_OperatingMode, "ICA", size_t(EFastICAMode::ICA)); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_FastICA_DecompositionType, "Decomposition type"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FastICA_DecompositionType, "Symmetric", size_t(EFastICADecomposition::Symmetric)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FastICA_DecompositionType, "Deflate", size_t(EFastICADecomposition::Deflate)); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_FastICA_Nonlinearity, "Nonlinearity"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FastICA_Nonlinearity, "Pow3", size_t(EFastICANonlinearity::Pow3)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FastICA_Nonlinearity, "Tanh", size_t(EFastICANonlinearity::Tanh)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FastICA_Nonlinearity, "Gauss", size_t(EFastICANonlinearity::Gauss)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FastICA_Nonlinearity, "Skew", size_t(EFastICANonlinearity::Skew)); + + OVP_Declare_New(CWindowingFunctionsDesc); + OVP_Declare_New(CComputeTemporalFilterCoefficientsDesc); + OVP_Declare_New(CTemporalFilterBoxAlgorithmDesc); + OVP_Declare_New(CModTemporalFilterBoxAlgorithmDesc); + OVP_Declare_New(CApplyTemporalFilterDesc); +#endif // TARGET_HAS_ThirdPartyITPP + + OVP_Declare_New(CDownsamplingDesc); + OVP_Declare_New(CDownsamplingBoxAlgorithmDesc); + OVP_Declare_New(CDetectingMinMaxDesc); + OVP_Declare_New(CDetectingMinMaxBoxAlgorithmDesc); + // @END inserm-gpl + +OVP_Declare_End() + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/CMakeLists.txt new file mode 100644 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/interface-Brainmaster-Discovery.ui b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/interface-Brainmaster-Discovery.ui new file mode 100644 index 0000000..501baa7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/interface-Brainmaster-Discovery.ui @@ -0,0 +1,768 @@ + + + + + + 100 + 18 + 1 + 10 + + + 100 + 1 + 10 + + + 1 + 1024 + 4 + 1 + 10 + + + False + + + True + False + 8 + 2 + True + + + True + False + Sampling frequency : + right + True + + + 2 + 3 + + + + + True + False + model_sampling_frequency + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + Device type : + right + True + + + + + False + Number of channels : + right + True + + + 1 + 2 + + + + + False + model_type + + + + 0 + + + + + 1 + 2 + + + + + True + + True + False + False + True + True + adjustment3 + True + True + + + 1 + 2 + 1 + 2 + + + + + + + + + + + + + default + + + 9 600 + + + 115 200 + + + 460 800 + + + + + + + + + + + default + + + 8 bits + + + 16 bits + + + 24 bits + + + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + default + + + none + + + 50Hz + + + 60Hz + + + + + + + + + + + Custom + + + Discovery 24 + + + Atlantis 4x4 + + + Atlantis 2x2 + + + + + + + + + + + 256 + + + 512 + + + 1024 + + + 2048 + + + + + + + + + + + Discovery + + + Atlantis + + + + + False + 5 + Device configuration + center + dialog + center + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + Brainmaster Discovery / Atlantis + +<small><span color="darkred">Attention : You should obtain a device passkey from Brainmaster +in order to operate your device with OpenViBE</span></small> + True + center + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + 8 + 8 + + + True + False + 12 + 2 + True + + + True + False + Gender : + right + True + + + 4 + 5 + + + + + True + False + Age : + right + True + + + 3 + 4 + + + + + True + False + Identifier : + right + True + + + 2 + 3 + + + + + True + False + model_gender + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + True + + True + False + False + True + True + adjustment1 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + True + + True + False + False + True + True + adjustment2 + True + True + + + 1 + 2 + 2 + 3 + + + + + True + False + + + 2 + 1 + 2 + + + + + True + False + Configuration preset : + right + True + + + + + True + False + model_preset + + + + 0 + + + + + 1 + 2 + + + + + True + False + Device port : + right + True + + + 5 + 6 + + + + + True + False + + + + 0 + + + + + 1 + 2 + 5 + 6 + + + + + True + False + Baud rate : + right + True + + + 6 + 7 + + + + + True + False + Bit depth : + right + True + + + 7 + 8 + + + + + True + False + Notch filter : + right + True + + + 8 + 9 + + + + + True + False + model_baud_rate + + + + 0 + + + + + 1 + 2 + 6 + 7 + + + + + True + False + model_bit_depth + + + + 0 + + + + + 1 + 2 + 7 + 8 + + + + + True + False + model_notch_filters + + + + 0 + + + + + 1 + 2 + 8 + 9 + + + + + True + False + + + 2 + 9 + 10 + + + + + True + False + Device Serial Nr : + right + True + + + 10 + 11 + + + + + True + False + Device Passkey : + right + True + + + 11 + 12 + + + + + True + True + + True + False + False + True + True + + + 1 + 2 + 10 + 11 + + + + + True + True + + True + False + False + True + True + + + 1 + 2 + 11 + 12 + + + + + True + True + 0 + + + + + Change channel names + True + True + True + False + + + False + True + 1 + + + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/src/ovasCConfigurationBrainmasterDiscovery.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/src/ovasCConfigurationBrainmasterDiscovery.cpp new file mode 100644 index 0000000..2ca0d5d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/src/ovasCConfigurationBrainmasterDiscovery.cpp @@ -0,0 +1,317 @@ +/* + * ovasCConfigurationBrainmasterDiscovery.cpp + * + * Copyright (c) 2012, Yann Renard. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +#if defined TARGET_HAS_ThirdPartyBrainmasterCodeMakerAPI + +#include "ovasCConfigurationBrainmasterDiscovery.h" + +#include "ovas_defines_brainmaster_discovery.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +namespace { +static bool guardFlag = false; + +void on_spin_button_changed(GtkSpinButton* pAnySpinButton, GtkComboBox* pDevicePresetComboBox) +{ + if (!guardFlag) { gtk_combo_box_set_active(pDevicePresetComboBox, 0); } // Custom +} + +void on_combo_box_changed(GtkComboBox* pAnyComboBox, GtkComboBox* pDevicePresetComboBox) +{ + if (!guardFlag) { gtk_combo_box_set_active(pDevicePresetComboBox, 0); } // Custom +} + +void on_device_preset_changed(GtkComboBox* pComboBox, CConfigurationBrainmasterDiscovery* pThis) +{ + guardFlag = true; + + // int i; + const int active = gtk_combo_box_get_active(pComboBox); + switch (active) + { + default: + case Preset_Custom: break; + case Preset_Discovery_24: gtk_spin_button_set_value(pThis->m_buttonChannelCount, 24); // 22 EEG channels + 2 AUX + gtk_combo_box_set_active(pThis->m_comboBoxType, 0); // Discovery + gtk_combo_box_set_active(pThis->m_comboBoxSamplingRate, 0); // default + //gtk_combo_box_set_active(pThis->m_comboBoxDevice, ); + //gtk_combo_box_set_active(pThis->m_comboBoxPreset, ); + gtk_combo_box_set_active(pThis->m_comboBoxBaudRate, 0); // default + gtk_combo_box_set_active(pThis->m_comboBoxBitDepth, 0); // default + gtk_combo_box_set_active(pThis->m_comboBoxNotchFilters, 0); // default + gtk_widget_set_sensitive(GTK_WIDGET(pThis->m_comboBoxBitDepth), FALSE); // default + pThis->m_rvChannelType.clear(); + //for (i=0; i<22; ++i) pThis->m_rvChannelType[i]=ChannelType_EEG; + //for (i=22; i<24; ++i) pThis->m_rvChannelType[i]=ChannelType_AUX; + pThis->m_channelNames[0] = "Fp1"; + pThis->m_channelNames[1] = "F3"; + pThis->m_channelNames[2] = "C3"; + pThis->m_channelNames[3] = "P3"; + pThis->m_channelNames[4] = "O1"; + pThis->m_channelNames[5] = "F7"; + pThis->m_channelNames[6] = "T3"; + pThis->m_channelNames[7] = "T5"; + pThis->m_channelNames[8] = "Fz"; + pThis->m_channelNames[9] = "Fp2"; + pThis->m_channelNames[10] = "F4"; + pThis->m_channelNames[11] = "C4"; + pThis->m_channelNames[12] = "P4"; + pThis->m_channelNames[13] = "O2"; + pThis->m_channelNames[14] = "F8"; + pThis->m_channelNames[15] = "T4"; + pThis->m_channelNames[16] = "T6"; + pThis->m_channelNames[17] = "Cz"; + pThis->m_channelNames[18] = "Pz"; + pThis->m_channelNames[19] = "A2"; + pThis->m_channelNames[20] = "Fpz"; + pThis->m_channelNames[21] = "Oz"; + pThis->m_channelNames[22] = "AUX1"; + pThis->m_channelNames[23] = "AUX2"; + break; + case Preset_Atlantis_2x2: gtk_spin_button_set_value(pThis->m_buttonChannelCount, 4); // 2 EEG channels + 2 AUX + gtk_combo_box_set_active(pThis->m_comboBoxType, 1); // Atlantis + gtk_combo_box_set_active(pThis->m_comboBoxSamplingRate, 0); // default + //gtk_combo_box_set_active(pThis->m_comboBoxDevice, ); + //gtk_combo_box_set_active(pThis->m_comboBoxPreset, ); + gtk_combo_box_set_active(pThis->m_comboBoxBaudRate, 0); // default + gtk_combo_box_set_active(pThis->m_comboBoxBitDepth, 0); // default + gtk_combo_box_set_active(pThis->m_comboBoxNotchFilters, 0); // default + gtk_widget_set_sensitive(GTK_WIDGET(pThis->m_comboBoxBitDepth), TRUE); // default + pThis->m_rvChannelType.clear(); + pThis->m_rvChannelType[0] = ChannelType_AUX; + pThis->m_rvChannelType[1] = ChannelType_AUX; + pThis->m_rvChannelType[2] = ChannelType_EEG; + pThis->m_rvChannelType[3] = ChannelType_EEG; + pThis->m_channelNames[0] = "AUX1"; + pThis->m_channelNames[1] = "AUX2"; + pThis->m_channelNames[2] = "A1-R1"; + pThis->m_channelNames[3] = "A2-R2"; + break; + case Preset_Atlantis_4x4: gtk_spin_button_set_value(pThis->m_buttonChannelCount, 8); // 2 EEG channels + 2 AUX + 2 EEG channels + 2 AUX + gtk_combo_box_set_active(pThis->m_comboBoxType, 1); // Atlantis + gtk_combo_box_set_active(pThis->m_comboBoxSamplingRate, 0); // default + //gtk_combo_box_set_active(pThis->m_comboBoxDevice, ); + //gtk_combo_box_set_active(pThis->m_comboBoxPreset, ); + gtk_combo_box_set_active(pThis->m_comboBoxBaudRate, 0); // default + gtk_combo_box_set_active(pThis->m_comboBoxBitDepth, 0); // default + gtk_combo_box_set_active(pThis->m_comboBoxNotchFilters, 0); // default + gtk_widget_set_sensitive(GTK_WIDGET(pThis->m_comboBoxBitDepth), TRUE); // default + pThis->m_rvChannelType.clear(); + pThis->m_rvChannelType[0] = ChannelType_AUX; + pThis->m_rvChannelType[1] = ChannelType_AUX; + pThis->m_rvChannelType[2] = ChannelType_EEG; + pThis->m_rvChannelType[3] = ChannelType_EEG; + pThis->m_rvChannelType[4] = ChannelType_AUX; + pThis->m_rvChannelType[5] = ChannelType_AUX; + pThis->m_rvChannelType[6] = ChannelType_EEG; + pThis->m_rvChannelType[7] = ChannelType_EEG; + pThis->m_channelNames[0] = "AUX1"; + pThis->m_channelNames[1] = "AUX2"; + pThis->m_channelNames[2] = "A1-R1"; + pThis->m_channelNames[3] = "A2-R2"; + pThis->m_channelNames[4] = "AUX3"; + pThis->m_channelNames[5] = "AUX4"; + pThis->m_channelNames[6] = "A3-R3"; + pThis->m_channelNames[7] = "A4-R4"; + break; + } + + guardFlag = false; +} +} // namespace + +CConfigurationBrainmasterDiscovery::CConfigurationBrainmasterDiscovery(const char* gtkBuilderFilename, uint32_t& rPort, uint32_t& rPreset, uint32_t& rType, + uint32_t& rBaudRate, uint32_t& rSamplingRate, uint32_t& rBitDepth, + uint32_t& rNotchFilters, std::map& rvChannelType, + std::string& sDeviceSerial, std::string& sDevicePasskey) + : CConfigurationBuilder(gtkBuilderFilename), m_rPort(rPort), m_rPreset(rPreset), m_rType(rType), m_rBaudRate(rBaudRate), m_rSamplingRate(rSamplingRate), + m_rBitDepth(rBitDepth), m_rNotchFilters(rNotchFilters), m_rvChannelType(rvChannelType), m_deviceSerial(sDeviceSerial), m_devicePasskey(sDevicePasskey) +{ + m_listStore = gtk_list_store_new(1, G_TYPE_STRING); +} + +CConfigurationBrainmasterDiscovery::~CConfigurationBrainmasterDiscovery() { g_object_unref(m_listStore); } + +bool CConfigurationBrainmasterDiscovery::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + const uint32_t port = m_rPort; + + m_buttonChannelCount = GTK_SPIN_BUTTON(this->m_nChannels); + m_comboBoxDevice = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + m_comboBoxPreset = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device_preset")); + m_comboBoxType = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_type")); + m_comboBoxBaudRate = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_baud_rate")); + m_comboBoxSamplingRate = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")); + m_comboBoxBitDepth = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_bit_depth")); + m_comboBoxNotchFilters = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_notch_filters")); + m_pEntryDeviceSerial = GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_device_serial")); + m_pEntryDevicePasskey = GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_device_passkey")); + + g_signal_connect(G_OBJECT(m_buttonChannelCount), "value-changed", G_CALLBACK(on_spin_button_changed), m_comboBoxPreset); + g_signal_connect(G_OBJECT(m_comboBoxPreset), "changed", G_CALLBACK(on_device_preset_changed), this); + g_signal_connect(G_OBJECT(m_comboBoxType), "changed", G_CALLBACK(on_combo_box_changed), m_comboBoxPreset); + g_signal_connect(G_OBJECT(m_comboBoxBaudRate), "changed", G_CALLBACK(on_combo_box_changed), m_comboBoxPreset); + g_signal_connect(G_OBJECT(m_comboBoxSamplingRate), "changed", G_CALLBACK(on_combo_box_changed), m_comboBoxPreset); + g_signal_connect(G_OBJECT(m_comboBoxBitDepth), "changed", G_CALLBACK(on_combo_box_changed), m_comboBoxPreset); + g_signal_connect(G_OBJECT(m_comboBoxNotchFilters), "changed", G_CALLBACK(on_combo_box_changed), m_comboBoxPreset); + + g_object_unref(m_listStore); + m_listStore = gtk_list_store_new(1, G_TYPE_STRING); + + gtk_combo_box_set_model(m_comboBoxDevice, GTK_TREE_MODEL(m_listStore)); + + char buffer[1024]; + bool selected = false; + + gtk_combo_box_append_text(m_comboBoxDevice, "Auto"); + for (uint32_t i = 1; i < 17; ++i) + { + sprintf(buffer, "COM%i", i); + gtk_combo_box_append_text(m_comboBoxDevice, buffer); + if (port == i) + { + gtk_combo_box_set_active(m_comboBoxDevice, i); + selected = true; + } + } + + if (!selected) { gtk_combo_box_set_active(m_comboBoxDevice, 0); } + + switch (m_rType) + { + default: + case Type_Discovery: gtk_combo_box_set_active(m_comboBoxType, 0); + break; + case Type_Atlantis: gtk_combo_box_set_active(m_comboBoxType, 1); + break; + } + + switch (m_rBaudRate) + { + default: + case BaudRate_Default: gtk_combo_box_set_active(m_comboBoxBaudRate, 0); + break; + case BaudRate_9600: gtk_combo_box_set_active(m_comboBoxBaudRate, 1); + break; + case BaudRate_115200: gtk_combo_box_set_active(m_comboBoxBaudRate, 2); + break; + case BaudRate_460800: gtk_combo_box_set_active(m_comboBoxBaudRate, 3); + break; + } + + switch (m_rSamplingRate) + { + default: + case SamplingFrequency_256: gtk_combo_box_set_active(m_comboBoxSamplingRate, 0); + break; + case SamplingFrequency_512: gtk_combo_box_set_active(m_comboBoxSamplingRate, 1); + break; + case SamplingFrequency_1024: gtk_combo_box_set_active(m_comboBoxSamplingRate, 2); + break; + case SamplingFrequency_2048: gtk_combo_box_set_active(m_comboBoxSamplingRate, 3); + break; + } + + switch (m_rBitDepth) + { + default: + case BitDepth_Default: gtk_combo_box_set_active(m_comboBoxBitDepth, 0); + break; + case BitDepth_8: gtk_combo_box_set_active(m_comboBoxBitDepth, 1); + break; + case BitDepth_16: gtk_combo_box_set_active(m_comboBoxBitDepth, 2); + break; + case BitDepth_24: gtk_combo_box_set_active(m_comboBoxBitDepth, 3); + break; + } + + switch (m_rNotchFilters) + { + default: + case NotchFilter_Default: gtk_combo_box_set_active(m_comboBoxNotchFilters, 0); + break; + case NotchFilter_Off: gtk_combo_box_set_active(m_comboBoxNotchFilters, 1); + break; + case NotchFilter_50: gtk_combo_box_set_active(m_comboBoxNotchFilters, 2); + break; + case NotchFilter_60: gtk_combo_box_set_active(m_comboBoxNotchFilters, 3); + break; + } + + switch (m_rPreset) + { + default: + case Preset_Custom: gtk_combo_box_set_active(m_comboBoxPreset, 0); + break; + case Preset_Discovery_24: gtk_combo_box_set_active(m_comboBoxPreset, 1); + break; + case Preset_Atlantis_4x4: gtk_combo_box_set_active(m_comboBoxPreset, 2); + break; + case Preset_Atlantis_2x2: gtk_combo_box_set_active(m_comboBoxPreset, 3); + break; + } + + gtk_entry_set_text(m_pEntryDeviceSerial, m_deviceSerial.c_str()); + gtk_entry_set_text(m_pEntryDevicePasskey, m_devicePasskey.c_str()); + + return true; +} + +bool CConfigurationBrainmasterDiscovery::postConfigure() +{ + if (m_applyConfig) + { + const int port = gtk_combo_box_get_active(m_comboBoxDevice); + if (port >= 0) { m_rPort = uint32_t(port); } + + const int preset = gtk_combo_box_get_active(m_comboBoxPreset); + if (preset >= 0) { m_rPreset = uint32_t(preset); } + + const int type = gtk_combo_box_get_active(m_comboBoxType); + if (type >= 0) { m_rType = uint32_t(type); } + + const int baudRate = gtk_combo_box_get_active(m_comboBoxBaudRate); + if (baudRate >= 0) { m_rBaudRate = uint32_t(baudRate); } + + const int sampling = gtk_combo_box_get_active(m_comboBoxSamplingRate); + if (sampling >= 0) { m_rSamplingRate = uint32_t(sampling); } + + const int bitDepth = gtk_combo_box_get_active(m_comboBoxBitDepth); + if (bitDepth >= 0) { m_rBitDepth = uint32_t(bitDepth); } + + const int notchFilters = gtk_combo_box_get_active(m_comboBoxNotchFilters); + if (notchFilters >= 0) { m_rNotchFilters = uint32_t(notchFilters); } + + m_deviceSerial = gtk_entry_get_text(m_pEntryDeviceSerial); + m_devicePasskey = gtk_entry_get_text(m_pEntryDevicePasskey); + } + + if (!CConfigurationBuilder::postConfigure()) { return false; } + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyBrainmasterCodeMakerAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/src/ovasCConfigurationBrainmasterDiscovery.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/src/ovasCConfigurationBrainmasterDiscovery.h new file mode 100644 index 0000000..16cd3bd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/src/ovasCConfigurationBrainmasterDiscovery.h @@ -0,0 +1,78 @@ +/* + * ovasCConfigurationBrainmasterDiscovery.h + * + * Copyright (c) 2012, Yann Renard. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +#pragma once + +#if defined TARGET_HAS_ThirdPartyBrainmasterCodeMakerAPI + +#include "../ovasCConfigurationBuilder.h" + +#include +#include +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +class CConfigurationBrainmasterDiscovery final : public CConfigurationBuilder +{ +public: + CConfigurationBrainmasterDiscovery(const char* gtkBuilderFilename, uint32_t& rPort, uint32_t& rPreset, uint32_t& rType, + uint32_t& rBaudRate, uint32_t& rSamplingFrequency, uint32_t& rBitDepth, uint32_t& rNotchFilters, + std::map& rvChannelType, std::string& sDeviceSerial, std::string& sDevicePasskey); + ~CConfigurationBrainmasterDiscovery() override; + + bool preConfigure() override; + bool postConfigure() override; + + GtkSpinButton* m_buttonChannelCount = nullptr; + GtkComboBox* m_comboBoxDevice = nullptr; + GtkComboBox* m_comboBoxPreset = nullptr; + GtkComboBox* m_comboBoxType = nullptr; + GtkComboBox* m_comboBoxBaudRate = nullptr; + GtkComboBox* m_comboBoxSamplingRate = nullptr; + GtkComboBox* m_comboBoxBitDepth = nullptr; + GtkComboBox* m_comboBoxNotchFilters = nullptr; + GtkEntry* m_pEntryDeviceSerial = nullptr; + GtkEntry* m_pEntryDevicePasskey = nullptr; + + using CConfigurationBuilder::m_channelNames; + + + GtkListStore* m_listStore = nullptr; + + uint32_t& m_rPort; + uint32_t& m_rPreset; + uint32_t& m_rType; + uint32_t& m_rBaudRate; + uint32_t& m_rSamplingRate; + uint32_t& m_rBitDepth; + uint32_t& m_rNotchFilters; + std::map& m_rvChannelType; + std::string& m_deviceSerial; + std::string& m_devicePasskey; + + std::vector m_sensitiveWidgets; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyBrainmasterCodeMakerAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/src/ovasCDriverBrainmasterDiscovery.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/src/ovasCDriverBrainmasterDiscovery.cpp new file mode 100644 index 0000000..5a2555b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/src/ovasCDriverBrainmasterDiscovery.cpp @@ -0,0 +1,601 @@ +/* + * ovasCDriverBrainmasterDiscovery.cpp + * + * Copyright (c) 2012, Yann Renard. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +#if defined TARGET_HAS_ThirdPartyBrainmasterCodeMakerAPI + +#include "ovasCDriverBrainmasterDiscovery.h" +#include "ovasCConfigurationBrainmasterDiscovery.h" +#include "../ovasCConfigurationBuilder.h" + +#include + +#include "ovas_defines_brainmaster_discovery.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +extern "C" { +int OvAtlLoginDevice(const char* sSerialNumber, const char* sPassKey); +} + +static float decode_24(unsigned char*& rpBuffer) +{ + int res = rpBuffer[0] + rpBuffer[1] * 0x100 + rpBuffer[2] * 0x10000; + if (res > 0x800000) { res = res - 0x1000000; } + rpBuffer += 3; + return res * 0.01163f; +} + +static float decode_16(unsigned char*& rpBuffer) +{ + int res = rpBuffer[0] + rpBuffer[1] * 0x100; + if (res > 0x8000) { res = res - 0x10000; } + rpBuffer += 2; + return res * 0.1983f; +} + +static float decode_8(unsigned char*& rpBuffer) +{ + int res = rpBuffer[0]; + res -= 0x80; + rpBuffer += 1; + return res * 100 / 128.f; +} + +static uint32_t next_sync(uint32_t sync) +{ + sync++; + sync &= 7; + return sync ? sync : 1; +} + +//___________________________________________________________________// +// // + +CDriverBrainmasterDiscovery::CDriverBrainmasterDiscovery(IDriverContext& ctx) + : IDriver(ctx) + , m_preset(Preset_Discovery_24) +{ + m_deviceSerial = ctx.getConfigurationManager().expand("${AcquisitionServer_Driver_BrainmasterDeviceSerial}").toASCIIString(); + m_devicePasskey = ctx.getConfigurationManager().expand("${AcquisitionServer_Driver_BrainmasterDevicePasskey}").toASCIIString(); + m_frameDumpFilename = ctx.getConfigurationManager().expand("${AcquisitionServer_Driver_BrainmasterFrameDumpFilename}").toASCIIString(); + + m_baudRates[BaudRate_9600] = 0x30; // 9600 + m_baudRates[BaudRate_115200] = 0x20; // 115200 + m_baudRates[BaudRate_460800] = 0x10; // 460800 + + m_baudRateValues[BaudRate_9600] = 9600; // 9600 + m_baudRateValues[BaudRate_115200] = 115200; // 115200 + m_baudRateValues[BaudRate_460800] = 460800; // 460800 + + m_notchsFilters[NotchFilter_Default] = 0; // Off + m_notchsFilters[NotchFilter_Off] = 0; // Off + m_notchsFilters[NotchFilter_50] = 2; // 50 Hz + m_notchsFilters[NotchFilter_60] = 3; // 60 Hz + + m_notchFiltersValues[NotchFilter_Default] = 0; // Off + m_notchFiltersValues[NotchFilter_Off] = 0; // Off + m_notchFiltersValues[NotchFilter_50] = 50; // 50 Hz + m_notchFiltersValues[NotchFilter_60] = 60; // 60 Hz + + m_bitDepths[BitDepth_8] = 1; // 8 bits + m_bitDepths[BitDepth_16] = 2; // 16 bits + m_bitDepths[BitDepth_24] = 3; // 24 bits + + m_bitDepthValues[BitDepth_8] = 8; // 8 bits + m_bitDepthValues[BitDepth_16] = 16; // 16 bits + m_bitDepthValues[BitDepth_24] = 24; // 24 bits + + // 0xcc for 2 EEG, 0xff for 2 EEG + 2 AUX + m_channelSelectionMasks[24] = 0xffffff; // Type_Discovery + m_channelSelectionMasks[4] = 0xf; // Type_Atlantis 2x2 + m_channelSelectionMasks[8] = 0xff; // Type_Atlantis 4x4 + + m_bitDepthDecoders[ChannelType_EEG][BitDepth_8] = decode_8; // 8 bits + m_bitDepthDecoders[ChannelType_EEG][BitDepth_16] = decode_16; // 16 bits + m_bitDepthDecoders[ChannelType_EEG][BitDepth_24] = decode_24; // 24 bits + + m_bitDepthDecoders[ChannelType_AUX][BitDepth_8] = decode_8; // 8 bits + m_bitDepthDecoders[ChannelType_AUX][BitDepth_16] = decode_16; // 16 bits + m_bitDepthDecoders[ChannelType_AUX][BitDepth_24] = decode_16; // 24 bits + + m_startModules[Type_Discovery] = ::DiscStartModule; + m_startModules[Type_Atlantis] = ::AtlStartModule; + + m_stopModules[Type_Discovery] = ::DiscStopModule; + m_stopModules[Type_Atlantis] = ::AtlStopModule; + + m_header.setSamplingFrequency(256); + m_header.setChannelCount(24); + m_header.setChannelName(0, "Fp1"/*"FP1"*/); + m_header.setChannelName(1, "F3"); + m_header.setChannelName(2, "C3"); + m_header.setChannelName(3, "P3"); + m_header.setChannelName(4, "O1"); + m_header.setChannelName(5, "F7"); + m_header.setChannelName(6, "T3"); + m_header.setChannelName(7, "T5"); + m_header.setChannelName(8, "Fz"); + m_header.setChannelName(9, "Fp2"/*"FP2"*/); + m_header.setChannelName(10, "F4"); + m_header.setChannelName(11, "C4"); + m_header.setChannelName(12, "P4"); + m_header.setChannelName(13, "O2"); + m_header.setChannelName(14, "F8"); + m_header.setChannelName(15, "T4"); + m_header.setChannelName(16, "T6"); + m_header.setChannelName(17, "Cz"); + m_header.setChannelName(18, "Pz"); + m_header.setChannelName(19, "A2"); + m_header.setChannelName(20, "Fpz"/*"FPz"*/); + m_header.setChannelName(21, "Oz"); + m_header.setChannelName(22, "AUX1"); + m_header.setChannelName(23, "AUX2"); + + for (size_t i = 0; i < m_header.getChannelCount(); ++i) { m_header.setChannelUnits(i, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); } +} + +//___________________________________________________________________// +// // + +bool CDriverBrainmasterDiscovery::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + uint32_t i; + + if (m_driverCtx.isConnected()) { return false; } + + if (m_deviceSerial == "" || m_devicePasskey == "") + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "The device serial or passkey were not configured\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << + "You can set their value from the configuration pannel or from the following configuration tokens :\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " - " << CString("AcquisitionServer_Driver_BrainmasterDeviceSerial") << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " - " << CString("AcquisitionServer_Driver_BrainmasterDevicePasskey") << "\n"; + return false; + } + + switch (m_type) + { + default: + case Type_Discovery: m_baudRateReal = (m_baudRate != BaudRate_Default ? m_baudRate : BaudRate_460800); + m_samplingRateReal = m_samplingRate; + m_bitDepthReal = BitDepth_24; + m_notchFiltersReal = (m_notchFilters != NotchFilter_Default ? m_notchFilters : NotchFilter_Default); + m_frameSize = 3; + m_dataOffset = 3; + break; + + case Type_Atlantis: m_baudRateReal = (m_baudRate != BaudRate_Default ? m_baudRate : BaudRate_115200); + m_samplingRateReal = m_samplingRate; + m_bitDepthReal = (m_bitDepth != BitDepth_Default ? m_bitDepth : BitDepth_24); + m_notchFiltersReal = (m_notchFilters != NotchFilter_Default ? m_notchFilters : NotchFilter_Default); + m_frameSize = 1; + m_dataOffset = 1; + break; + } + + switch (m_bitDepthReal) + { + default: + case BitDepth_24: for (i = 0; i < m_header.getChannelCount(); ++i) + { + switch (m_channelTypes[i]) + { + default: + case ChannelType_EEG: m_frameSize += 3; + break; + + case ChannelType_AUX: m_frameSize += 2; + break; + } + } + break; + + case BitDepth_16: m_frameSize += m_header.getChannelCount() * 2; + break; + + case BitDepth_8: m_frameSize += m_header.getChannelCount(); + break; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Computed frame size of " << m_frameSize << " bytes\n"; + + m_samples.resize(m_header.getChannelCount()); + m_buffers.resize(m_frameSize); + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + // Sets/Autodetects port + m_portReal = m_port; + if (m_portReal == 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Auto detecting COM port...\n"; + + m_portReal = autoDetectPort(); + if (m_portReal == uint32_t(-1)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Port is not set and could not be auto detected, please configure the driver\n"; + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Found COM port " << m_portReal << " !\n"; + } + + // Opens device handle at default speed + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Opening COM port " << m_portReal << " at 9600 bauds\n"; + if (!::AtlOpenPort(m_portReal, 9600, nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not open port " << m_portReal << "\n"; + return false; + } + + // Writes baud rate + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Setting baud rate to " << m_baudRateValues[m_baudRateReal] << " bauds (code " << m_baudRates[ + m_baudRateReal] << ")\n"; + if (!::AtlSetBaudRate(m_baudRates[m_baudRateReal])) + { + ::AtlClosePort(m_portReal); + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not set baud rate\n"; + return false; + } + + // Closes port (which was at default speed) + ::AtlClosePort(m_portReal); + + // Opens device handle at targeted speed + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Re-opening COM port " << m_portReal << " at " << m_baudRateValues[m_baudRateReal] << + " bauds (code " << m_baudRates[m_baudRateReal] << ")\n"; + if (!::AtlOpenPort(m_portReal, m_baudRateValues[m_baudRateReal], nullptr)) + // if(!::AtlOpenPort(m_portReal, 9600, nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not open port " << m_portReal << "\n"; + return false; + } + + // Logs in the device + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Logging in the device...\n"; + const int code = OvAtlLoginDevice(m_deviceSerial.c_str(), m_devicePasskey.c_str()); + if (!code) + { + ::AtlSetBaudRate(m_baudRates[BaudRate_9600]); + ::AtlClosePort(m_portReal); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not log in device (error code was " << uint32_t(code) << ")\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Please check the device serial and passkey configuration\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << + "You can set their value from the configuration pannel or from the following configuration tokens :\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " - " << CString("AcquisitionServer_Driver_BrainmasterDeviceSerial") << " (was set to [" << + m_deviceSerial.c_str() << "])\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " - " << CString("AcquisitionServer_Driver_BrainmasterDevicePasskey") << " (was set to [" << + m_devicePasskey.c_str() << "])\n"; + + if (!checkDeviceSerial(m_deviceSerial)) + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << + "By the way, serial seems to be malformed, it is supposed to be XXXXX with each X be a digit\n"; + if (!checkDevicePasskey(m_devicePasskey)) + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << + "By the way, passkey seems to be malformed, it is supposed to be XXXX-XXXX-XXXX with each X be a digit or a letter\n"; + + return false; + } + + // Reads firmware version + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Successfully opened device on port " << m_portReal << " | Firware nr : " << + uint32_t(AtlQueryFirmware(0)) << "\n"; + + // Writes notch filters + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Setting notch filters to " << m_notchFiltersValues[m_notchFiltersReal] << " (code " << + m_notchsFilters + [m_notchFiltersReal] << ")...\n"; + if (!::AtlSetNotchFilters(m_notchsFilters[m_notchFiltersReal])) + { + ::AtlSetBaudRate(m_baudRates[BaudRate_9600]); + ::AtlClosePort(m_portReal); + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not set notch filters\n"; + return false; + } + + // Writes bit depth + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Setting bit depth to " << m_bitDepthValues[m_bitDepthReal] << " bits (code " << m_bitDepths[ + m_bitDepthReal] << ")...\n"; + if (!::AtlSetBytesPerSample(m_bitDepths[m_bitDepthReal])) + { + ::AtlSetBaudRate(m_baudRates[BaudRate_9600]); + ::AtlClosePort(m_portReal); + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not set bytes per sample\n"; + return false; + } + + // Selects all the channels + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Selecting all channels with channel mask " << m_channelSelectionMasks[m_header.getChannelCount()] + << + "...\n"; + if (!::AtlSelectChannels(m_channelSelectionMasks[m_header.getChannelCount()])) + { + ::AtlSetBaudRate(m_baudRates[BaudRate_9600]); + ::AtlClosePort(m_portReal); + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not select all the channels\n"; + return false; + } + + // Clears special data + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Clearing specials...\n"; + if (!::AtlClearSpecials()) + { + ::AtlSetBaudRate(m_baudRates[BaudRate_9600]); + ::AtlClosePort(m_portReal); + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not clear special data selection\n"; + return false; + } + + // Poking special code for Atlantis 4x4 + if (m_header.getChannelCount() == 8) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Poking special code for Atlantis 4x4...\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << uint32_t(AtlPoke(0xc006, 0x00)) << + "\n"; // Sets internal sampling rate set to 512 Hz - This hack solves the EEG chan 3 & 4 flat lines issue + // m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << uint32_t(AtlPoke(0xb607, 0xff)) << "\n"; // ATC_CHANOUTMASK + // m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << uint32_t(AtlPoke(0xb608, 0x20)) << "\n"; // ATC_ADCMODE + // m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << uint32_t(AtlPoke(0xb7e9, 0x03)) << "\n"; // ??? Bit mode ? + } + + // serialn_p ::AtlQuerySerialNumber(int auth) + + // Actually starts the acquisition + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Starting module !\n"; + if (!m_startModules[m_type]()) + { + ::AtlSetBaudRate(m_baudRates[BaudRate_9600]); + ::AtlClosePort(m_portReal); + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not start module\n"; + return false; + } + + m_syncByte = 1; + + // Preparing optional frame dump + if (m_frameDumpFilename == "") + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Won't dump frames\n"; + m_frameDumpFlag = false; + } + else + { + FILE* file = fopen(m_frameDumpFilename.c_str(), "wb"); + if (file) + { + m_frameDumpFlag = true; + fclose(file); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Will dump frames in [" << m_frameDumpFilename << "]\n"; + } + else + { + m_frameDumpFlag = false; + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Should have dumped frames in [" << m_frameDumpFilename << + "] but file can't be opened for writing !\n"; + } + } + + + return true; +} + +bool CDriverBrainmasterDiscovery::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + return true; +} + +bool CDriverBrainmasterDiscovery::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted()) { return true; } + bool gotData = false; + + for (uint32_t i = 0; i < m_nSamplePerSentBlock; ++i) + { + // Updates Sync bits + m_syncByte = next_sync(m_syncByte); + + // Searches for Sync bits + this->read(&m_buffers[0], 1); + if (((m_buffers[0] >> 5) & 7) != m_syncByte) + { + // Needs resync + uint32_t sync = this->sync(); + if (sync != uint32_t(-1)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Resynced by " << sync << " byte(s) !\n"; } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "Could not resync, did not find the sync bytes !\n"; } + + m_wasLastFrameCorrect = false; + } + else + { + // Sends samples if last frame was correct + if (m_wasLastFrameCorrect) + { + m_callback->setSamples(&m_samples[0], 1); + gotData = true; + } + + // Assumed synced stream - Reads leading bytes + this->read(&m_buffers[1], m_buffers.size() - 1); + +#if 1 + // For debug purpose + if (m_frameDumpFlag) + { + FILE* file = fopen(m_frameDumpFilename.c_str(), "ab"); + if (file) + { + fprintf(file, "Frame : "); + for (uint32_t i = 0; i < m_buffers.size(); ++i) { fprintf(file, "0x%02x ", m_buffers[i]); } + fprintf(file, "\n"); + fclose(file); + } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Unexpected: Could not open dump file [" << m_frameDumpFilename << + "] for writing\n"; + m_frameDumpFlag = false; + } + } +#endif + + // Converts new buffer to samples + unsigned char* buffer = &m_buffers[m_dataOffset]; + + for (uint32_t j = 0; j < m_samples.size(); ++j) { m_samples[j] = m_bitDepthDecoders[m_channelTypes[j]][m_bitDepthReal](buffer); } + + m_wasLastFrameCorrect = true; + } + } + + if (gotData) { m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); } + + return true; +} + +bool CDriverBrainmasterDiscovery::read(unsigned char* frame, uint32_t size) +{ + const uint32_t count = size; + uint32_t idx = 0; + + while (idx != count) + { + int iCode = ::AtlReadData(frame + idx, count - idx); + if (iCode >= 0) { idx += iCode; } + } + + return true; +} + +uint32_t CDriverBrainmasterDiscovery::sync() +{ + std::vector buffer; + buffer.resize(m_buffers.size() * 4); + + bool finished = false; + uint32_t nSync = 0; + uint32_t i = 0; + + while (!finished && i < 16) + { + i++; + this->read(&buffer[0], buffer.size()); + for (uint32_t i = 0; i < m_buffers.size() && !finished; ++i) + { + uint32_t syncCandidate[4]; + syncCandidate[0] = buffer[i + 0 * m_buffers.size()] >> 5; + syncCandidate[1] = buffer[i + 1 * m_buffers.size()] >> 5; + syncCandidate[2] = buffer[i + 2 * m_buffers.size()] >> 5; + syncCandidate[3] = buffer[i + 3 * m_buffers.size()] >> 5; + if (next_sync(syncCandidate[0]) == syncCandidate[1] + && next_sync(syncCandidate[1]) == syncCandidate[2] + && next_sync(syncCandidate[2]) == syncCandidate[3]) + { + this->read(&buffer[0], i); + m_syncByte = syncCandidate[3]; + nSync = i; + finished = true; + } + } + } + +#if 1 + // For debug purpose + if (m_frameDumpFlag) + { + FILE* file = fopen(m_frameDumpFilename.c_str(), "ab"); + if (file) + { + fprintf(file, "Syncing...\n"); + for (uint32_t i = 0; i < buffer.size(); ++i) + { + fprintf(file, "0x%02x ", buffer[i]); + if (((i + 1) % m_buffers.size()) == 0) { fprintf(file, "\n"); } + } + + fclose(file); + } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Unexpected: Could not open dump file [" << m_frameDumpFilename << + "] for writing\n"; + m_frameDumpFlag = false; + } + } +#endif + + return finished ? nSync : uint32_t(-1); +} + +bool CDriverBrainmasterDiscovery::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + return true; +} + +bool CDriverBrainmasterDiscovery::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // Stops acquisition + if (!m_stopModules[m_type]()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could stop module\n"; + return false; + } + + // Writes baud rate back to 9600 + if (!::AtlSetBaudRate(m_baudRates[BaudRate_9600])) + { + ::AtlClosePort(m_portReal); + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not set baud rate\n"; + return false; + } + + // Closes device handle + if (!::AtlClosePort(m_portReal)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not close port " << m_portReal << "\n"; + return false; + } + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverBrainmasterDiscovery::configure() +{ + CConfigurationBrainmasterDiscovery config(Directories::getDataDir() + "/applications/acquisition-server/interface-Brainmaster-Discovery.ui", + m_port, m_preset, m_type, m_baudRate, m_samplingRate, m_bitDepth, + m_notchFilters, m_channelTypes, m_deviceSerial, m_devicePasskey); + if (!config.configure(m_header)) { return false; } + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyBrainmasterCodeMakerAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/src/ovasCDriverBrainmasterDiscovery.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/src/ovasCDriverBrainmasterDiscovery.h new file mode 100644 index 0000000..7088988 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/src/ovasCDriverBrainmasterDiscovery.h @@ -0,0 +1,107 @@ +/* + * ovasCDriverBrainmasterDiscovery.h + * + * Copyright (c) 2012, Yann Renard. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +#pragma once + +#if defined TARGET_HAS_ThirdPartyBrainmasterCodeMakerAPI + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverBrainmasterDiscovery + * \author Yann Renard + */ +class CDriverBrainmasterDiscovery final : public IDriver +{ +public: + + explicit CDriverBrainmasterDiscovery(IDriverContext& ctx); + void release() { delete this; } + const char* getName() override { return "Brainmaster Discovery and Atlantis"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + bool read(unsigned char* frame, uint32_t size); + uint32_t sync(); + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + uint32_t m_nSamplePerSentBlock = 0; + + std::string m_deviceSerial; + std::string m_devicePasskey; + std::string m_frameDumpFilename; + bool m_frameDumpFlag = false; + + uint32_t m_port = 0; + uint32_t m_portReal = 0; + uint32_t m_preset = 0; + uint32_t m_type = 0; + uint32_t m_baudRate = 0; + uint32_t m_baudRateReal = 0; + uint32_t m_samplingRate = 0; + uint32_t m_samplingRateReal = 0; + uint32_t m_bitDepth = 0; + uint32_t m_bitDepthReal = 0; + uint32_t m_notchFilters = 0; + uint32_t m_notchFiltersReal = 0; + uint32_t m_frameSize = 0; + uint32_t m_dataOffset = 0; + + std::map m_baudRates; + std::map m_baudRateValues; + std::map m_notchsFilters; + std::map m_notchFiltersValues; + std::map m_bitDepths; + std::map m_bitDepthValues; + std::map m_channelTypes; + std::map m_channelSelectionMasks; + std::map> m_bitDepthDecoders; + std::map m_startModules; + std::map m_stopModules; + + std::vector m_samples; + std::vector m_buffers; + + uint32_t m_syncByte = 0; + bool m_wasLastFrameCorrect = false; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyBrainmasterCodeMakerAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/src/ovas_defines_brainmaster_discovery.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/src/ovas_defines_brainmaster_discovery.h new file mode 100644 index 0000000..c12bc32 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainmaster-discovery/src/ovas_defines_brainmaster_discovery.h @@ -0,0 +1,127 @@ +/* + * ovas_defines_brainmaster_discovery.h + * + * Copyright (c) 2012, Yann Renard. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +#pragma once + +#if defined TARGET_HAS_ThirdPartyBrainmasterCodeMakerAPI + +#include "ovasIDriver.h" + +#include "CMKRDLLU.H" +#include + +namespace OpenViBE { +namespace AcquisitionServer { +typedef enum +{ + Preset_Custom=0, + Preset_Discovery_24=1, + Preset_Atlantis_4x4=2, + Preset_Atlantis_2x2=3, + + Type_Discovery=0, + Type_Atlantis=1, + + ChannelType_EEG=0, + ChannelType_AUX=1, + + BaudRate_Default=0, + BaudRate_9600=1, + BaudRate_115200=2, + BaudRate_460800=3, + + NotchFilter_Default=0, + NotchFilter_Off=1, + NotchFilter_50=2, + NotchFilter_60=3, + + BitDepth_Default=0, + BitDepth_8=1, + BitDepth_16=2, + BitDepth_24=3, + + SamplingFrequency_256=0, + SamplingFrequency_512=1, + SamplingFrequency_1024=2, + SamplingFrequency_2048=3, +} EParameter; + +inline size_t autoDetectPort(const size_t startPort = 1, const size_t stopPort = 16, const size_t fallback = size_t(-1)) +{ + for (size_t i = startPort; i <= stopPort; ++i) + { + const BOOL res = ::AtlOpenPort(i, /*m_baudRate*/ 0, nullptr); + ::AtlClosePort(i); + if (res) { return i; } + } + return fallback; +} + +// returns true on success +// returns false on error +inline bool checkDeviceSerial(const std::string& serial) +{ + // Checks length + if (serial.length() != 5) { return false; } + + // Checks digits + for (size_t i = 0; i < serial.length(); ++i) { if (serial[i] < '0' || serial[i] > '9') { return false; } } + + // First digit gives device kind + switch (serial[0]) + { + case '3': // Atlantis + case '4': // Atlantis + case '6': // Discovery + default: break; + } + + // Everything's fine + return true; +} + +// returns true on success +// returns false on error +inline bool checkDevicePasskey(const std::string& passkey) +{ + // Checks length -- other checks are hardcoded assuming length is 15 + if (passkey.length() != 14) { return false; } + + // Checks separators + if (passkey[4] != '-' || passkey[9] != '-') { return false; } + + // Checks alpha-nums + for (size_t i = 0; i < 3; ++i) + { + for (size_t j = 0; j < 4; ++j) + { + const size_t k = i * 5 + j; + if ((passkey[k] < '0' || passkey[k] > '9') && (passkey[k] < 'a' || passkey[k] > 'z') + && (passkey[k] < 'A' || passkey[k] > 'Z')) { return false; } + } + } + // Everything's fine + return true; +} +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyBrainmasterCodeMakerAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainproducts-brainvisionrecorder/share/interface-BrainProducts-BrainVisionRecorder.ui b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainproducts-brainvisionrecorder/share/interface-BrainProducts-BrainVisionRecorder.ui new file mode 100644 index 0000000..380bf16 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainproducts-brainvisionrecorder/share/interface-BrainProducts-BrainVisionRecorder.ui @@ -0,0 +1,656 @@ + + + + + + 1025 + 65535 + 1 + 10 + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 1 + 1 + 1024 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 128 + + + 256 + + + 512 + + + 1024 + + + 2048 + + + 4096 + + + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + Brainamp Standard (through Vision Recorder) + center + + + False + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 5 + 2 + True + + + True + True + adjustment1 + True + True + + + 1 + 2 + 4 + 5 + + + + + True + True + + + + 1 + 2 + 3 + 4 + + + + + True + Vision Recorder connection port + + + 4 + 5 + + + + + True + Vision Recorder host name + + + 3 + 4 + + + + + True + Identifier : + right + True + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + True + adjustment3 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + 0 + + + + + 0 + + + + + False + 3 + + + + + True + + + False + 4 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + + + + True + 10 + 10 + + + True + True + adjustment4 + True + True + + + 2 + 3 + + + + + True + model2 + + + + 0 + + + + + 1 + 2 + + + + + Change channel names + True + False + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainproducts-brainvisionrecorder/src/ovasCDriverBrainProductsBrainVisionRecorder.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainproducts-brainvisionrecorder/src/ovasCDriverBrainProductsBrainVisionRecorder.cpp new file mode 100644 index 0000000..eecdeb3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainproducts-brainvisionrecorder/src/ovasCDriverBrainProductsBrainVisionRecorder.cpp @@ -0,0 +1,364 @@ +#include "ovasCDriverBrainProductsBrainVisionRecorder.h" +#include "../ovasCConfigurationNetworkBuilder.h" + +#include + +#include + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +CDriverBrainProductsBrainVisionRecorder::CDriverBrainProductsBrainVisionRecorder(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_BrainVisionRecorder", m_driverCtx.getConfigurationManager()) +{ + m_settings.add("Header", &m_header); + m_settings.add("ServerHostName", &m_sServerHostName); + m_settings.add("ServerHostPort", &m_serverHostPort); + m_settings.load(); +} + +//___________________________________________________________________// +// // + +bool CDriverBrainProductsBrainVisionRecorder::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) { return false; } + + // Initialize GUID value + M_DEFINE_GUID(GUID_RDAHeader, 1129858446, 51606, 19590, uint8_t(175), uint8_t(74), uint8_t(152), uint8_t(187), uint8_t(246), uint8_t(201), uint8_t(20), + uint8_t(80)); + + // Builds up client connection + m_connectionClient = Socket::createConnectionClient(); + + // Tries to connect to server + m_connectionClient->connect(m_sServerHostName, m_serverHostPort); + + // Checks if connection is correctly established + if (!m_connectionClient->isConnected()) + { + // In case it is not, try to reconnect + m_connectionClient->connect(m_sServerHostName, m_serverHostPort); + } + + if (!m_connectionClient->isConnected()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Connection problem! Tried 2 times without success! :(\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Verify port number and/or Hostname...\n"; + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Client connected\n"; + + // Initialize vars for reception + m_msgHeader = nullptr; + RDA_MessageHeader msgHeader; + m_msgHeaderStr = (char*)&msgHeader; + + uint32_t received = 0; + uint32_t size = sizeof(msgHeader); + + // Receive Header + while (received < size) + { + const uint32_t reqLength = size - received; + const uint32_t res = m_connectionClient->receiveBuffer((char*)m_msgHeaderStr, reqLength); + + received += res; + m_msgHeaderStr += res; + } + + // Check for correct header GUID. + if (!M_COMPARE_GUID(msgHeader.guid, GUID_RDAHeader)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "GUID received is not correct!\n"; + return false; + } + + // Check for correct header nType + if (msgHeader.nType != 1) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "First Message received is not an header!\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Try to reconnect....\n"; + return false; + } + + // Check if we need a larger buffer, allocate + if (!reallocateHeaderBuffer(msgHeader.nSize)) { return false; } + + // Retrieve rest of data + memcpy(*(&m_msgHeader), &msgHeader, sizeof(msgHeader)); + m_msgHeaderStr = (char*)(*(&m_msgHeader)) + sizeof(msgHeader); + received = 0; + size = msgHeader.nSize - sizeof(msgHeader); + while (received < size) + { + const uint32_t reqLength = size - received; + const uint32_t res = m_connectionClient->receiveBuffer((char*)m_msgHeaderStr, reqLength); + + received += res; + m_msgHeaderStr += res; + } + + m_msgStart = (RDA_MessageStart*)m_msgHeader; // pHeader will retain the pointer ownership + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Header received\n"; + + // Save Header info into m_header + //m_header.setExperimentID(); + //m_header.setExperimentDate(); + + //m_header.setSubjectId(); + //m_header.setSubjectName(); + //m_header.setSubjectAge(m_structHeader.subjectAge); + //m_header.setSubjectGender(); + + //m_header.setLaboratoryId(); + //m_header.setLaboratoryName(); + + //m_header.setTechnicianId(); + //m_header.setTechnicianName(); + + m_header.setChannelCount((uint32_t)m_msgStart->nChannels); + + char* channelNames = (char*)m_msgStart->dResolutions + (m_msgStart->nChannels * sizeof(m_msgStart->dResolutions[0])); + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + m_header.setChannelName(i, channelNames); + m_header.setChannelGain(i, float((m_msgStart->dResolutions[i]))); + m_header.setChannelUnits(i, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); + channelNames += strlen(channelNames) + 1; + } + + m_header.setSamplingFrequency(uint32_t(1000000 / m_msgStart->dSamplingInterval)); //dSamplingInterval in microseconds + + m_nSamplePerSentBlock = nSamplePerSentBlock; + + m_callback = &callback; + + m_indexIn = 0; + m_indexOut = 0; + m_buffDataIdx = 0; + + m_nMarker = 0; + m_nMarkers = 0; + + return true; +} + +bool CDriverBrainProductsBrainVisionRecorder::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + return true; +} + +bool CDriverBrainProductsBrainVisionRecorder::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted()) { return true; } + + M_DEFINE_GUID(GUID_RDAHeader, + 1129858446, 51606, 19590, uint8_t(175), uint8_t(74), uint8_t(152), uint8_t(187), uint8_t(246), uint8_t(201), uint8_t(20), uint8_t(80) + ); + + // Initialize var to receive buffer of data + m_msgHeader = nullptr; + RDA_MessageHeader msgHeader; + m_msgHeaderStr = (char*)&msgHeader; + uint32_t received = 0; + uint32_t size = sizeof(msgHeader); + + // Receive Header + while (received < size) + { + const uint32_t reqLength = size - received; + const uint32_t res = m_connectionClient->receiveBuffer((char*)m_msgHeaderStr, reqLength); + received += res; + m_msgHeaderStr += res; + } + + // Check for correct header nType + if (msgHeader.nType == 1) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Message received is a header!\n"; + return false; + } + if (msgHeader.nType == 3) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Message received is a STOP!\n"; + return false; + } + if (msgHeader.nType != 4) { return true; } + + // Check for correct header GUID. + if (!M_COMPARE_GUID(msgHeader.guid, GUID_RDAHeader)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "GUID received is not correct!\n"; + return false; + } + + // Check if we need a larger buffer, allocate + if (!reallocateHeaderBuffer(msgHeader.nSize)) { return false; } + + // Retrieve rest of block. + memcpy(*(&m_msgHeader), &msgHeader, sizeof(msgHeader)); + m_msgHeaderStr = (char*)(*(&m_msgHeader)) + sizeof(msgHeader); + received = 0; + size = msgHeader.nSize - sizeof(msgHeader); + while (received < size) + { + const uint32_t reqLength = size - received; + const uint32_t res = m_connectionClient->receiveBuffer((char*)m_msgHeaderStr, reqLength); + + received += res; + m_msgHeaderStr += res; + } + m_buffDataIdx++; + + // Put the data into MessageData32 structure + m_msgData = nullptr; + m_msgData = (RDA_MessageData32*)m_msgHeader; + + ////////////////////// + //Markers + if (m_msgData->nMarkers > 0) + { + // if (m_msgData->nMarkers == 0) + // { + // return true; + // } + + m_marker = (RDA_Marker*)((char*)m_msgData->fData + m_msgData->nPoints * m_header.getChannelCount() * sizeof(m_msgData->fData[0])); + + m_nMarkers = m_msgData->nMarkers; + + m_stimulationIDs.assign(m_nMarkers, 0); + m_stimulationDates.assign(m_nMarkers, 0); + m_stimulationSamples.assign(m_nMarkers, 0); + + for (uint32_t i = 0; i < m_msgData->nMarkers; ++i) + { + char* type = m_marker->sTypeDesc; + char* desc = type + strlen(type) + 1; + + m_stimulationIDs[i] = atoi(strtok(desc, "S")); + m_stimulationDates[i] = CTime(m_header.getSamplingFrequency(), m_marker->nPosition).time(); + m_stimulationSamples[i] = m_marker->nPosition; + m_marker = (RDA_Marker*)((char*)m_marker + m_marker->nSize); + } + + m_nMarker += m_msgData->nMarkers; + } + + size = m_header.getChannelCount() * uint32_t(m_msgData->nPoints); + if (m_signalBuffers.size() < size) { m_signalBuffers.resize(size); } + + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + for (uint32_t j = 0; j < uint32_t(m_msgData->nPoints); ++j) + { + m_signalBuffers[j + (i * uint32_t(m_msgData->nPoints))] = + float(m_msgData->fData[(m_header.getChannelCount() * j) + i]) * m_header.getChannelGain(i); + } + } + + // send data + CStimulationSet stimSet; + stimSet.setStimulationCount(m_nMarkers); + for (uint32_t i = 0; i < m_nMarkers; ++i) + { + stimSet.setStimulationIdentifier(i, OVTK_StimulationId_Label(m_stimulationIDs[i])); + stimSet.setStimulationDate(i, m_stimulationDates[i]); + stimSet.setStimulationDuration(i, 0); + } + + m_callback->setSamples(&m_signalBuffers[0], uint32_t(m_msgData->nPoints)); + m_callback->setStimulationSet(stimSet); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + + m_nMarkers = 0; + + return true; +} + +bool CDriverBrainProductsBrainVisionRecorder::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Connection stopped\n"; + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + return true; +} + +bool CDriverBrainProductsBrainVisionRecorder::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_msgHeader) + { + free(m_msgHeader); + m_msgHeader = nullptr; + } + + m_msgHeaderStr = nullptr; + m_msgStart = nullptr; + m_msgStop = nullptr; + m_msgData = nullptr; + m_marker = nullptr; + + m_callback = nullptr; + + m_headerBufferSize = 0; + m_signalBuffers.clear(); + + // Cleans up client connection + m_connectionClient->close(); + m_connectionClient->release(); + m_connectionClient = nullptr; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Client disconnected\n"; + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverBrainProductsBrainVisionRecorder::configure() +{ + CConfigurationNetworkBuilder + config(Directories::getDataDir() + "/applications/acquisition-server/interface-BrainProducts-BrainVisionRecorder.ui"); + + config.setHostName(m_sServerHostName); + config.setHostPort(m_serverHostPort); + + if (config.configure(m_header)) + { + m_sServerHostName = config.getHostName(); + m_serverHostPort = config.getHostPort(); + + m_settings.save(); + + return true; + } + + return false; +} + +bool CDriverBrainProductsBrainVisionRecorder::reallocateHeaderBuffer(const size_t newSize) +{ + // Reallocate buffer? + if (newSize > m_headerBufferSize) + { + if (m_msgHeader) { free(m_msgHeader); } + m_headerBufferSize = newSize; + m_msgHeader = (RDA_MessageHeader*)malloc(m_headerBufferSize); + if (!m_msgHeader) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Couldn't allocate memory\n"; + return false; + } + } + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainproducts-brainvisionrecorder/src/ovasCDriverBrainProductsBrainVisionRecorder.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainproducts-brainvisionrecorder/src/ovasCDriverBrainProductsBrainVisionRecorder.h new file mode 100644 index 0000000..b45e2f3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/brainproducts-brainvisionrecorder/src/ovasCDriverBrainProductsBrainVisionRecorder.h @@ -0,0 +1,141 @@ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include + +#include + +#ifndef M_DEFINE_GUID +#define M_DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } +#endif + +#ifndef M_COMPARE_GUID +#define M_COMPARE_GUID(name1, name2) \ + ( name1.Data1 == name2.Data1 && name1.Data2 == name2.Data2 && \ + name1.Data3 == name2.Data3 && name1.Data4[0] == name2.Data4[0] && \ + name1.Data4[1] == name2.Data4[1] && name1.Data4[2] == name2.Data4[2] &&\ + name1.Data4[3] == name2.Data4[3] && name1.Data4[4] == name2.Data4[4] &&\ + name1.Data4[5] == name2.Data4[5] && name1.Data4[6] == name2.Data4[6] &&\ + name1.Data4[7] == name2.Data4[7] \ + ) +#endif + +namespace OpenViBE { +namespace AcquisitionServer { +class CDriverBrainProductsBrainVisionRecorder final : public IDriver +{ +public: + + explicit CDriverBrainProductsBrainVisionRecorder(IDriverContext& ctx); + ~CDriverBrainProductsBrainVisionRecorder() override {} + const char* getName() override { return "Brain Products amplifiers (through BrainVision Recorder)"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + + const IHeader* getHeader() override { return &m_header; } + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + Socket::IConnectionClient* m_connectionClient = nullptr; + CString m_sServerHostName = "localhost"; + uint32_t m_serverHostPort = 51244; + + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + + uint32_t m_indexIn = 0; + uint32_t m_indexOut = 0; + uint32_t m_buffDataIdx = 0; + + uint32_t m_nMarker = 0; + uint32_t m_nMarkers = 0; + + std::vector m_stimulationIDs; + std::vector m_stimulationDates; + std::vector m_stimulationSamples; + +#pragma pack(push) +#pragma pack(1) + + typedef struct + { + uint32_t Data1; + unsigned short Data2; + unsigned short Data3; + uint8_t Data4[8]; + } GUID; + + struct RDA_Marker //; A single marker in the marker array of RDA_MessageData + { + uint32_t nSize; // Size of this marker. + uint32_t nPosition; // Relative position in the data block. + uint32_t nPoints; // Number of points of this marker + int nChannel; // Associated channel number (-1 = all channels). + char sTypeDesc[1]; // Type, description in ASCII delimited by '\0'. + }; + + struct RDA_MessageHeader //; Message header + { + GUID guid; // Always GUID_RDAHeader + uint32_t nSize; // Size of the message block in bytes including this header + uint32_t nType; // Message type. + }; + + // **** Messages sent by the RDA server to the clients. **** + struct RDA_MessageStart : RDA_MessageHeader //; Setup / Start infos, Header -> nType = 1 + { + uint32_t nChannels; // Number of channels + double dSamplingInterval; // Sampling interval in microseconds + double dResolutions[1]; // Array of channel resolutions -> double dResolutions[nChannels] coded in microvolts. i.e. RealValue = resolution * A/D value + char sChannelNames[1]; // Channel names delimited by '\0'. The real size is larger than 1. + }; + + struct RDA_MessageStop : RDA_MessageHeader { }; //; Data acquisition has been stopped. // Header -> nType = 3 + + struct RDA_MessageData32 : RDA_MessageHeader //; Block of 32-bit floating point data, Header -> nType = 4, sent only from port 51244 + { + uint32_t nBlock; // Block number, i.e. acquired blocks since acquisition started. + uint32_t nPoints; // Number of data points in this block + uint32_t nMarkers; // Number of markers in this data block + float fData[1]; // Data array -> float fData[nChannels * nPoints], multiplexed + RDA_Marker Markers[1]; // Array of markers -> RDA_Marker Markers[nMarkers] + }; +#pragma pack(pop) + + RDA_MessageHeader* m_msgHeader = nullptr; + char* m_msgHeaderStr = nullptr; + size_t m_headerBufferSize = 0; + + RDA_MessageStart* m_msgStart = nullptr; + RDA_MessageStop* m_msgStop = nullptr; + RDA_MessageData32* m_msgData = nullptr; + RDA_Marker* m_marker = nullptr; + + std::vector m_signalBuffers; + +private: + + bool reallocateHeaderBuffer(size_t newSize); +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/cognionics/share/interface-Cognionics.ui b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/cognionics/share/interface-Cognionics.ui new file mode 100755 index 0000000..8d86142 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/cognionics/share/interface-Cognionics.ui @@ -0,0 +1,432 @@ + + + + + + 100 + 18 + 1 + 10 + + + 100 + 1 + 10 + + + 1 + 128 + 128 + 1 + 10 + + + 1 + 254 + 1 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 300 + + + 500 + + + 540 + + + 600 + + + 1000 + + + + + False + 5 + Device configuration + center + dialog + center + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + Cognionics + center + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + 8 + 8 + + + True + False + 8 + + + True + False + 7 + 2 + True + + + True + False + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + False + False + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + False + False + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + False + Sampling frequency : + right + True + + + 4 + 5 + + + + + True + False + Number of channels : + right + True + + + 3 + 4 + + + + + True + False + Gender : + right + True + + + 2 + 3 + + + + + True + False + Age : + right + True + + + 1 + 2 + + + + + True + False + Identifier : + right + True + + + + + True + False + model2 + 0 + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + True + False + False + True + True + adjustment3 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + False + 0.49000000953674316 + COM Port: + + + 5 + 6 + + + + + True + True + + False + False + True + True + adjustment4 + + + 1 + 2 + 5 + 6 + + + + + True + False + Check impedance : + + + 6 + 7 + + + + + True + True + False + True + + + 1 + 2 + 6 + 7 + + + + + True + True + 0 + + + + + True + True + 0 + + + + + Change channel names + True + False + False + + + False + True + 1 + + + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/cognionics/src/ovasCConfigurationCognionics.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/cognionics/src/ovasCConfigurationCognionics.cpp new file mode 100755 index 0000000..486f578 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/cognionics/src/ovasCConfigurationCognionics.cpp @@ -0,0 +1,72 @@ +#if defined(WIN32) + +#include "ovasCConfigurationCognionics.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +/*_________________________________________________ + +Insert callback to specific widget here +Example with a button that launch a calibration of the device: + +//Callback connected to a dedicated gtk button: +static void button_calibrate_pressed_cb(GtkButton* button, void* data) +{ + CConfigurationCognionics* config=static_cast(data); + config->buttonCalibratePressedCB(); +} + +//Callback actually called: +void CConfigurationGTecGUSBamp::buttonCalibratePressedCB() +{ + // Connect to the hardware, ask for calibration, verify the return code, etc. +} +_________________________________________________*/ + +// If you added more reference attribute, initialize them here +CConfigurationCognionics::CConfigurationCognionics(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& comport) + : CConfigurationBuilder(gtkBuilderFilename), m_COMPORT(comport), m_driverCtx(ctx) {} + +bool CConfigurationCognionics::preConfigure() +{ + if (! CConfigurationBuilder::preConfigure()) { return false; } + + GtkSpinButton* comport = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_comport")); + + gtk_spin_button_set_value(comport, m_COMPORT); + + // Connect here all callbacks + // Example: + // g_signal_connect(gtk_builder_get_object(m_builder, "button_calibrate"), "pressed", G_CALLBACK(button_calibrate_pressed_cb), this); + + // Insert here the pre-configure code. + // For example, you may want to check if a device is currently connected + // and if more than one are connected. Then you can list in a dedicated combo-box + // the device currently connected so the user can choose which one he wants to acquire from. + + return true; +} + +bool CConfigurationCognionics::postConfigure() +{ + if (m_applyConfig) + { + GtkSpinButton* comport = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_comport")); + + m_COMPORT = uint32_t(gtk_spin_button_get_value(comport)); + //printf("Selected COM Port: %d", m_COMPORT); + // If the user pressed the "apply" button, you need to save the changes made in the configuration. + // For example, you can save the connection ID of the selected device: + // m_connectionID = + } + + if (! CConfigurationBuilder::postConfigure() + ) { return false; } // normal header is filled (Subject ID, Age, Gender, channels, sampling frequency), ressources are realesed + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // WIN32 diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/cognionics/src/ovasCConfigurationCognionics.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/cognionics/src/ovasCConfigurationCognionics.h new file mode 100755 index 0000000..752cd8b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/cognionics/src/ovasCConfigurationCognionics.h @@ -0,0 +1,43 @@ +#pragma once + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationCognionics + * \author Mike Chi (Cognionics, Inc.) + * \copyright AGPL3 + * \date Thu Apr 18 21:19:49 2013 + * \brief The CConfigurationCognionics handles the configuration dialog specific to the Cognionics device. + * + * TODO: details + * + * \sa CDriverCognionics + */ +class CConfigurationCognionics final : public CConfigurationBuilder +{ +public: + // you may have to add to your constructor some reference parameters + // for example, a connection ID: + //CConfigurationCognionics(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& rConnectionId); + CConfigurationCognionics(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& comport); + + bool preConfigure() override; + bool postConfigure() override; + + uint32_t& m_COMPORT; + + +protected: + IDriverContext& m_driverCtx; + + /* + * Insert here all specific attributes, such as a connection ID. + * use references to directly modify the corresponding attribute of the driver + * Example: + */ +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/cognionics/src/ovasCDriverCognionics.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/cognionics/src/ovasCDriverCognionics.cpp new file mode 100755 index 0000000..85c6e72 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/cognionics/src/ovasCDriverCognionics.cpp @@ -0,0 +1,398 @@ +#include "ovasCDriverCognionics.h" +#include "ovasCConfigurationCognionics.h" +#include +#include + +#if defined(WIN32) + +#include + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +//Cognionics functions + +int init_SPP(int port); +void getData(); +double get_IMP_CH(int ch); +void close_SPP(); +unsigned long grab_SPP(int bytes, unsigned char* buf); +void write_SPP(int bytes, unsigned char* buf); + +//Cognionics defs +#define GAIN 3.0 +#define VREF 2.5 +#define ISTIM 0.000000024 +#define ADC_TO_VOLTS 2.0*(VREF/(4294967296.0*GAIN)) +#define TO_Z 1.4/(ISTIM*2.0) + +//Cognionics variables +int EEG_GRAB; +int CHS; +int SAMPLE_RATE; +float* dataBufferPtr; +int prev_trigger; +CStimulationSet cogStimulationSet; + +//Cognionics Buffers +int* prev_4_samples; //buffer for previous 4 samples in each channel for computing MA and IMP + + +//___________________________________________________________________// +// // + +CDriverCognionics::CDriverCognionics(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_Cognionics", m_driverCtx.getConfigurationManager()), m_comPort(1) +{ + m_header.setSamplingFrequency(300); + m_header.setChannelCount(64); + + m_settings.add("Header", &m_header); + m_settings.add("ComPort", &m_comPort); + m_settings.load(); +} + +//___________________________________________________________________// +// // + +bool CDriverCognionics::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + // Builds up a buffer to store + // acquired samples. This buffer + // will be sent to the acquisition + // server later... + m_sample = new float[m_header.getChannelCount() * nSamplePerSentBlock]; + + //initalize Cognionics varaibles, pointers and buffers + EEG_GRAB = nSamplePerSentBlock; + SAMPLE_RATE = m_header.getSamplingFrequency(); + CHS = m_header.getChannelCount(); + dataBufferPtr = &m_sample[0]; + prev_4_samples = new int[EEG_GRAB * CHS]; + + if (!m_sample) + { + delete [] m_sample; + delete [] prev_4_samples; + m_sample = nullptr; + return false; + } + + // ... + // initialize hardware and get + // available header information + // from it + // Using for example the connection ID provided by the configuration (m_connectionID) + // ... + + //init serial port + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Attempting to Connect to Device at COM Port: " << m_comPort << "\n"; + + const int serSuccess = init_SPP(m_comPort); + if (serSuccess == -1) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unable to Open Port, Please Check Device and Settings\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Successfully Opened Port at COM: " << m_comPort << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Number Channels (EEG + Packet Counter + Trigger): " << m_header.getChannelCount() << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Sampling Rate: " << m_header.getSamplingFrequency() << "\n"; + + for (size_t c = 0; c < m_header.getChannelCount(); ++c) { m_header.setChannelUnits(c, OVTK_UNIT_Volts, OVTK_FACTOR_Base); } + + //set impedance check mode ON + getData(); + unsigned char imp_on = 0x11; + write_SPP(1, &imp_on); + + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + return true; +} + +bool CDriverCognionics::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // ... + // request hardware to start + // sending data + // ... + + //set impedance check mode off + getData(); + unsigned char imp_off = 0x12; + write_SPP(1, &imp_off); + + return true; +} + +bool CDriverCognionics::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + + if (m_driverCtx.isStarted()) + { + // ... + // receive samples from hardware + // put them the correct way in the sample array + // whether the buffer is full, send it to the acquisition server + //... + + //get the number of samples specified + getData(); + + //OpenVibe call back for new samples + m_callback->setSamples(m_sample); + + // When your sample buffer is fully loaded, + // it is advised to ask the acquisition server + // to correct any drift in the acquisition automatically. + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + + // ... + // receive events from hardware + // and put them the correct way in a CStimulationSet object + //... + m_callback->setStimulationSet(cogStimulationSet); + cogStimulationSet.clear(); + } + else + { + //get a fresh batch of samples to keep connection alive + getData(); + if (m_driverCtx.isImpedanceCheckRequested()) + { + //update impedance values + for (int c = 0; c < CHS; ++c) { m_driverCtx.updateImpedance(c, get_IMP_CH(c)); } + } + } + + return true; +} + +bool CDriverCognionics::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + // ... + // request the hardware to stop + // sending data + // ... + + //set impedance check mode on + getData(); + unsigned char imp_off = 0x11; + write_SPP(1, &imp_off); + + return true; +} + +bool CDriverCognionics::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // ... + // uninitialize hardware here + // ... + close_SPP(); + + //free buffers + delete [] m_sample; + delete [] prev_4_samples; + m_sample = nullptr; + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverCognionics::isConfigurable() +{ + return true; // change to false if your device is not configurable +} + +bool CDriverCognionics::configure() +{ + // Change this line if you need to specify some references to your driver attribute that need configuration, e.g. the connection ID. + CConfigurationCognionics config(m_driverCtx, + Directories::getDataDir() + "/applications/acquisition-server/interface-Cognionics.ui", + m_comPort); // the specific header is passed into the specific configuration + + if (!config.configure(m_header)) { return false; } + + m_settings.save(); + + return true; +} + +void getData() +{ + unsigned char packet_start = 0; + int lsb2, lsb1; + unsigned char temp; + + for (int c = 0; c < EEG_GRAB; ++c) + { + packet_start = 0; + + //wait for packet start + while (packet_start != 0xFF) { grab_SPP(1, &packet_start); } + + //get packet counter + grab_SPP(1, &packet_start); + + //grab CHS-2 since the last two channels are for sync and packet counter + for (int j = 0; j < (CHS - 2); ++j) + { + grab_SPP(1, &temp); + int msb = temp; + grab_SPP(1, &temp); + lsb2 = temp; + grab_SPP(1, &temp); + lsb1 = temp; + + //reassemble 24-bit 2's compltement promoted to 32 bit int + msb = (msb << 24) | (lsb2 << 17) | (lsb1 << 10); + + //shift previous 4 sample buffer + *(prev_4_samples + j * 4 + 3) = *(prev_4_samples + j * 4 + 2); + *(prev_4_samples + j * 4 + 2) = *(prev_4_samples + j * 4 + 1); + *(prev_4_samples + j * 4 + 1) = *(prev_4_samples + j * 4 + 0); + *(prev_4_samples + j * 4 + 0) = msb; + + const double sample = ADC_TO_VOLTS * double(msb); + + //4-point MA for devices without way to disable impedance + /* + eeg_sample = ADC_TO_VOLTS * ((double) *(prev_4_samples + j*4 + 3) + + *(prev_4_samples + j*4 + 2) + + *(prev_4_samples + j*4 + 1) + + *(prev_4_samples + j*4 + 0) )/4.0; + */ + + *(dataBufferPtr + j * EEG_GRAB + c) = float(sample); + } + + + //save packet counter; + *(dataBufferPtr + (CHS - 1) * EEG_GRAB + c) = float(packet_start); + + //dummy data + grab_SPP(1, &temp); + grab_SPP(1, &temp); + + //grab trigger + grab_SPP(1, &temp); + lsb2 = temp; + grab_SPP(1, &temp); + lsb1 = temp; + + //assemble trigger code + int newTrigger = (lsb2 << 8) | lsb1; + //downshift serial triggers if necessary + if (newTrigger > 255) { newTrigger = newTrigger >> 8; } + + //store in EEG channel + *(dataBufferPtr + (CHS - 2) * EEG_GRAB + c) = float(newTrigger); + + //detect new stimulation + if (newTrigger != prev_trigger) + { + //time offset from start of chunk (c - current sample in the chunk) + const uint64_t date = c * (1LL << 32) / SAMPLE_RATE; + cogStimulationSet.appendStimulation(OVTK_StimulationId_Label(newTrigger&0x000000ff), date, 0); + } + + prev_trigger = newTrigger; + } +} + +double get_IMP_CH(const int ch) +{ + double d1 = double(*(prev_4_samples + ch * 4 + 2)) - double(*(prev_4_samples + ch * 4 + 0)); + double d2 = double(*(prev_4_samples + ch * 4 + 3)) - double(*(prev_4_samples + ch * 4 + 1)); + d1 = d1 * ADC_TO_VOLTS; + d2 = d2 * ADC_TO_VOLTS; + + if (d1 < 0) { d1 = -d1; } + if (d2 < 0) { d2 = -d2; } + + if (d2 > d1) { d1 = d2; } + + return d1 * TO_Z; +} + +//serial port handling + +HANDLE hSerial; +COMMTIMEOUTS timeouts = { 0 }; + +int init_SPP(const int port) +{ + char com[100]; + + sprintf(com, "\\\\.\\COM%d", port); + + hSerial = CreateFile(com, GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); + + if (hSerial == INVALID_HANDLE_VALUE) { return -1; } + + //setup serial port parameters + DCB dcbSerialParams = { 0 }; + + if (!GetCommState(hSerial, &dcbSerialParams)) + { + //error getting state + } + + dcbSerialParams.BaudRate = 1500000; + dcbSerialParams.ByteSize = 8; + dcbSerialParams.StopBits = ONESTOPBIT; + dcbSerialParams.Parity = NOPARITY; + + if (!SetCommState(hSerial, &dcbSerialParams)) + { + //error setting serial port state + } + + //setup serial port timeout + COMMTIMEOUTS timeouts; + timeouts.ReadIntervalTimeout = 500; + timeouts.ReadTotalTimeoutConstant = 50; + timeouts.ReadTotalTimeoutMultiplier = 10; + + timeouts.WriteTotalTimeoutConstant = 50; + timeouts.WriteTotalTimeoutMultiplier = 10; + if (!SetCommTimeouts(hSerial, &timeouts)) + { + //error occureed. Inform user + } + return 0; +} + +void close_SPP() { CloseHandle(hSerial); } + +unsigned long grab_SPP(const int bytes, unsigned char* buf) +{ + DWORD dwBytesRead = 0; + ReadFile(hSerial, buf, bytes, &dwBytesRead, nullptr); + + return int(dwBytesRead); +} + +void write_SPP(const int bytes, unsigned char* buf) +{ + DWORD dwBytesWritten = 0; + WriteFile(hSerial, buf, bytes, &dwBytesWritten, nullptr); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif //WIN32 diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/cognionics/src/ovasCDriverCognionics.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/cognionics/src/ovasCDriverCognionics.h new file mode 100755 index 0000000..800af83 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/cognionics/src/ovasCDriverCognionics.h @@ -0,0 +1,64 @@ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverCognionics + * \author Mike Chi (Cognionics, Inc.) + * \copyright AGPL3 + * \date Thu Apr 18 21:19:49 2013 + + * \brief The CDriverCognionics allows the acquisition server to acquire data from a Cognionics device. + * + * TODO: details + * + * \sa CConfigurationCognionics + */ +class CDriverCognionics final : public IDriver +{ +public: + + explicit CDriverCognionics(IDriverContext& ctx); + ~CDriverCognionics() override {} + const char* getName() override { return "Cognionics"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + +protected: + + SettingsHelper m_settings; + IDriverCallback* m_callback = nullptr; + + // Replace this generic Header with any specific header you might have written + CHeader m_header; + uint32_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + +private: + + /* + * Insert here all specific attributes, such as USB port number or device ID. + * Example : + */ + uint32_t m_comPort = 0; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/ctfvsm-meg/share/interface-CtfVsm-Meg.ui b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/ctfvsm-meg/share/interface-CtfVsm-Meg.ui new file mode 100644 index 0000000..4b53b58 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/ctfvsm-meg/share/interface-CtfVsm-Meg.ui @@ -0,0 +1,639 @@ + + + + + + 100 + 1 + 10 + + + 65535 + 1 + 10 + + + 1 + 1 + 1024 + 1 + 10 + + + 100 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 128 + + + 256 + + + 512 + + + 1024 + + + 2048 + + + 4096 + + + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + CTF/VSM MEG + center + + + False + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 4 + 2 + True + + + True + Identifier : + right + True + + + + + True + True + adjustment1 + True + True + + + 1 + 2 + + + + + True + Gender : + right + True + + + 1 + 2 + + + + + True + model1 + + + + 0 + + + + + 1 + 2 + 1 + 2 + + + + + True + Connection host name + + + 2 + 3 + + + + + True + True + + localhost + + + 1 + 2 + 2 + 3 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + Connection host port + + + 3 + 4 + + + + + 0 + + + + + 0 + + + + + False + 3 + + + + + True + + + False + 4 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + + + + True + 10 + 10 + + + True + True + adjustment3 + True + True + + + 2 + 3 + + + + + True + model2 + + + + 0 + + + + + 1 + 2 + + + + + Change channel names + True + False + False + + + + + True + True + adjustment4 + True + True + + + 3 + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/ctfvsm-meg/src/ovasCDriverCtfVsmMeg.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/ctfvsm-meg/src/ovasCDriverCtfVsmMeg.cpp new file mode 100644 index 0000000..8f746b7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/ctfvsm-meg/src/ovasCDriverCtfVsmMeg.cpp @@ -0,0 +1,372 @@ +#include "ovasCDriverCtfVsmMeg.h" +#include "../ovasCConfigurationNetworkBuilder.h" + +#include + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverCtfVsmMeg::CDriverCtfVsmMeg(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_CtfVsmMeg", m_driverCtx.getConfigurationManager()) +{ + m_settings.add("Header", &m_header); + m_settings.add("ServerHostName", &m_sServerHostName); + m_settings.add("ServerHostPort", &m_serverHostPort); + m_settings.load(); +} + +//___________________________________________________________________// +// // + +bool CDriverCtfVsmMeg::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) { return false; } + + // Builds up client connection + m_connectionClient = Socket::createConnectionClient(); + + // Tries to connect to server + m_connectionClient->connect(m_sServerHostName, m_serverHostPort); + + // Checks if connection is correctly established + if (!m_connectionClient->isConnected()) + { + // In case it is not, try to reconnect + m_connectionClient->connect(m_sServerHostName, m_serverHostPort); + } + + if (!m_connectionClient->isConnected()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Connection problem! Tried 2 times without success! :(\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Verify port number and/or Hostname...\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Client connected\n"; + // Initialize vars for reception + uint32_t received = 0; + m_pStructHeader = (char*)&m_structHeader; + // Receive Header + while (received < sizeof(m_structHeader)) + { + const uint32_t reqLength = sizeof(m_structHeader) - received; + const uint32_t res = m_connectionClient->receiveBuffer((char*)m_pStructHeader, reqLength); + + received += res; + m_pStructHeader += res; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Receiving Header....\n"; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Header received\n"; + + // Save Header info into m_header + //m_header.setExperimentID(); + //m_header.setExperimentDate(); + + //m_header.setSubjectId(); + //m_header.setSubjectName(); + m_header.setSubjectAge(m_structHeader.subjectAge); + //m_header.setSubjectGender(); + + //m_header.setLaboratoryId(); + //m_header.setLaboratoryName(); + + //m_header.setTechnicianId(); + //m_header.setTechnicianName(); + + m_header.setChannelCount(m_structHeader.numberOfChannels); + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + m_header.setChannelName(i, m_structHeader.channelLabel[i]); + m_header.setChannelGain(i, (m_structHeader.qGain[i] * m_structHeader.properGain[i])); + } + + m_header.setSamplingFrequency(uint32_t(m_structHeader.samplingRate)); + + //m_header.setSampleCount(nSamplePerSentBlock); + + m_sample = new float[m_header.getChannelCount() * nSamplePerSentBlock]; + + if (!m_sample) + { + delete [] m_sample; + m_sample = nullptr; + return false; + } + + m_callback = &callback; + + m_nSamplePerSentBlock = nSamplePerSentBlock; + + m_indexIn = 0; + m_indexOut = 0; + m_socketFlag = 1976; + m_buffDataIdx = 0; + + return true; +} + +bool CDriverCtfVsmMeg::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_buffDataIdx == 0) + { + // Initialize var to send flag + uint32_t sent = 0; + uint32_t* flag = static_cast(&m_socketFlag); + + // Send flag to server + while (sent < sizeof(m_socketFlag)) + { + const uint32_t reqLength = sizeof(m_socketFlag) - sent; + const uint32_t res = m_connectionClient->sendBuffer(static_cast(flag), reqLength); + sent += res; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " > Sending flag to start....\n"; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Flag sent\n"; + } + + return true; +} + +bool CDriverCtfVsmMeg::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted()) { return true; } + + // Initialize var to receive buffer of data + uint32_t received = 0; + m_pStructBuffData = (char*)&m_structBuffData; + + // Read a first buffer of data + m_buffDataIdx++; + while (received < sizeof(m_structBuffData)) + { + const uint32_t reqLength = sizeof(m_structBuffData) - received; + const uint32_t res = m_connectionClient->receiveBuffer((char*)m_pStructBuffData, reqLength); + received += res; + m_pStructBuffData += res; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " > Receiving buffer of data....nb: " << m_buffDataIdx << "\n"; + } + + // if input flow is equal to output one + if (m_nSamplePerSentBlock == uint32_t(m_structBuffData.nbSamplesPerChanPerBlock)) + { + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + for (uint32_t j = 0; j < m_nSamplePerSentBlock; ++j) + { + if ((m_structHeader.channelTypeIndex[i] == 0) | (m_structHeader.channelTypeIndex[i] == 1) | (m_structHeader.channelTypeIndex[i] == 5)) + { + m_sample[j + i * m_nSamplePerSentBlock] = float( + float(m_structBuffData.data[m_header.getChannelCount() * j + i]) * 1e15 / m_header.getChannelGain(i)); + } + else + { + m_sample[j + i * m_nSamplePerSentBlock] = + float(m_structBuffData.data[m_header.getChannelCount() * j + i]) / m_header.getChannelGain(i); + } + } + } + // send data + m_callback->setSamples(m_sample); + } + else + { + // if output flow is bigger + if (m_nSamplePerSentBlock > uint32_t(m_structBuffData.nbSamplesPerChanPerBlock)) + { + while (m_indexOut + uint32_t(m_structBuffData.nbSamplesPerChanPerBlock) < m_nSamplePerSentBlock) + { + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + for (uint32_t j = 0; j < uint32_t(m_structBuffData.nbSamplesPerChanPerBlock); ++j) + { + if ((m_structHeader.channelTypeIndex[i] == 0) | (m_structHeader.channelTypeIndex[i] == 1) | (m_structHeader.channelTypeIndex[i] == 5)) + { + m_sample[m_indexOut + j + i * m_nSamplePerSentBlock] = float( + float(m_structBuffData.data[m_header.getChannelCount() * j + i]) * 1e15 / m_header.getChannelGain(i)); + } + else + { + m_sample[m_indexOut + j + i * m_nSamplePerSentBlock] = + float(m_structBuffData.data[m_header.getChannelCount() * j + i]) / m_header.getChannelGain(i); + } + } + } + + m_indexOut = m_indexOut + uint32_t(m_structBuffData.nbSamplesPerChanPerBlock); + + // Ask for another buffer + received = 0; + m_pStructBuffData = (char*)&m_structBuffData; + + while (received < sizeof(m_structBuffData)) + { + const uint32_t reqLength = sizeof(m_structBuffData) - received; + const uint32_t res = m_connectionClient->receiveBuffer((char*)m_pStructBuffData, reqLength); + + received += res; + m_pStructBuffData += res; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " > Receiving buffer of data....nb: " << m_buffDataIdx << "\n"; + } + } + + // Finishing filling up + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + for (uint32_t j = 0; j < m_nSamplePerSentBlock - m_indexOut; ++j) + { + if ((m_structHeader.channelTypeIndex[i] == 0) | (m_structHeader.channelTypeIndex[i] == 1) | (m_structHeader.channelTypeIndex[i] == 5)) + { + m_sample[m_indexOut + j + i * m_nSamplePerSentBlock] = float( + float(m_structBuffData.data[m_header.getChannelCount() * j + i]) * 1e15 / m_header.getChannelGain(i)); + } + else + { + m_sample[m_indexOut + j + i * m_nSamplePerSentBlock] = + float(m_structBuffData.data[m_header.getChannelCount() * j + i]) / m_header.getChannelGain(i); + } + } + } + + // send data + m_callback->setSamples(m_sample); + + // Reset index out because new output + m_indexIn = m_nSamplePerSentBlock - m_indexOut; + m_indexOut = 0; + + // Save the rest of the buffer input + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + for (uint32_t j = 0; j < uint32_t(m_structBuffData.nbSamplesPerChanPerBlock) - m_indexIn; ++j) + { + if ((m_structHeader.channelTypeIndex[i] == 0) | (m_structHeader.channelTypeIndex[i] == 1) | (m_structHeader.channelTypeIndex[i] == 5)) + { + m_sample[j + i * m_nSamplePerSentBlock] = float( + float(m_structBuffData.data[m_indexIn * m_header.getChannelCount() + m_header.getChannelCount() * j + i]) * 1e15 / m_header. + getChannelGain(i)); + } + else + { + m_sample[j + i * m_nSamplePerSentBlock] = + float(m_structBuffData.data[m_indexIn * m_header.getChannelCount() + m_header.getChannelCount() * j + i]) / m_header. + getChannelGain(i); + } + } + } + + m_indexOut = uint32_t(m_structBuffData.nbSamplesPerChanPerBlock) - m_indexIn; + m_indexIn = 0; + } + else + { + // if output flow is smaller + while (m_indexIn + (m_nSamplePerSentBlock - m_indexOut) < uint32_t(m_structBuffData.nbSamplesPerChanPerBlock)) + { + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + for (uint32_t j = 0; j < m_nSamplePerSentBlock - m_indexOut; ++j) + { + if ((m_structHeader.channelTypeIndex[i] == 0) | (m_structHeader.channelTypeIndex[i] == 1) | (m_structHeader.channelTypeIndex[i] == 5)) + { + m_sample[j + m_indexOut + i * m_nSamplePerSentBlock] = float( + float(m_structBuffData.data[m_header.getChannelCount() * m_indexIn + m_header.getChannelCount() * j + i]) * 1e15 / + m_header.getChannelGain(i)); + } + else + { + m_sample[j + m_indexOut + i * m_nSamplePerSentBlock] = + float(m_structBuffData.data[m_header.getChannelCount() * m_indexIn + m_header.getChannelCount() * j + i]) / m_header. + getChannelGain(i); + } + } + } + //send data + m_callback->setSamples(m_sample); + + m_indexIn = m_indexIn + (m_nSamplePerSentBlock - m_indexOut); + m_indexOut = 0; + } + + // save the rest of buff data + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + for (uint32_t j = 0; j < uint32_t(m_structBuffData.nbSamplesPerChanPerBlock) - m_indexIn; ++j) + { + if ((m_structHeader.channelTypeIndex[i] == 0) | (m_structHeader.channelTypeIndex[i] == 1) | (m_structHeader.channelTypeIndex[i] == 5)) + { + m_sample[j + m_indexOut + i * m_nSamplePerSentBlock] = float( + float(m_structBuffData.data[m_header.getChannelCount() * m_indexIn + m_header.getChannelCount() * j + i]) * 1e15 / m_header. + getChannelGain(i)); + } + else + { + m_sample[j + m_indexOut + i * m_nSamplePerSentBlock] = + float(m_structBuffData.data[m_header.getChannelCount() * m_indexIn + m_header.getChannelCount() * j + i]) / m_header. + getChannelGain(i); + } + } + } + + m_indexOut = uint32_t(m_structBuffData.nbSamplesPerChanPerBlock) - m_indexIn; + m_indexIn = 0; + } + } + + return true; +} + +bool CDriverCtfVsmMeg::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Connection stopped\n"; + + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + return true; +} + +bool CDriverCtfVsmMeg::uninitialize() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + delete [] m_sample; + m_sample = nullptr; + m_callback = nullptr; + + // Cleans up client connection + m_connectionClient->close(); + m_connectionClient->release(); + m_connectionClient = nullptr; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Client disconnected\n"; + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverCtfVsmMeg::configure() +{ + CConfigurationNetworkBuilder config(Directories::getDataDir() + "/applications/acquisition-server/interface-CtfVsm-Meg.ui"); + + config.setHostName(m_sServerHostName); + config.setHostPort(m_serverHostPort); + + if (config.configure(m_header)) + { + m_sServerHostName = config.getHostName(); + m_serverHostPort = config.getHostPort(); + + m_settings.save(); + + return true; + } + + return false; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/ctfvsm-meg/src/ovasCDriverCtfVsmMeg.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/ctfvsm-meg/src/ovasCDriverCtfVsmMeg.h new file mode 100644 index 0000000..9bbc7f5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/ctfvsm-meg/src/ovasCDriverCtfVsmMeg.h @@ -0,0 +1,109 @@ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include + +#include + +#define NB_CHAN_RECORDED_MAX 410 +#define NB_SAMP_ACQ_Packet 28160 + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverCtfVsmMeg + * \author Pierre-Emmanuel Aguera (INSERM) + */ +class CDriverCtfVsmMeg final : public IDriver +{ +public: + + typedef char str32[32]; + typedef char str100[100]; + + explicit CDriverCtfVsmMeg(IDriverContext& ctx); + ~CDriverCtfVsmMeg() override { } + const char* getName() override { return "CTF/VSM MEG"; } + + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + Socket::IConnectionClient* m_connectionClient = nullptr; + CString m_sServerHostName = "localhost"; + uint32_t m_serverHostPort = 9999; + + struct + { + int nbCharExperimentId; + str100 experimentId; + int nbCharExperimentDate; + str32 experimentDate; + + int nbCharSubjectName; + str32 subjectName; + int subjectAge; + char subjectGender[1]; /**F: female or M: Male*/ + + int labId; + str32 labName; + int technicianId; + str32 technicianName; + + float samplingRate; + int numberOfChannels; + str32 channelLabel[NB_CHAN_RECORDED_MAX]; + int channelTypeIndex[NB_CHAN_RECORDED_MAX]; + + float properGain[NB_CHAN_RECORDED_MAX]; + float qGain[NB_CHAN_RECORDED_MAX]; + float ioGain[NB_CHAN_RECORDED_MAX]; + + int numberOfCoils[NB_CHAN_RECORDED_MAX]; + int gradOrderNum[NB_CHAN_RECORDED_MAX]; + } m_structHeader; + + char* m_pStructHeader = nullptr; + + struct + { + int sampleNumber; + int nbSamplesPerChanPerBlock; + int nbSamplesTotPerBlock; + signed int data[NB_SAMP_ACQ_Packet]; + } m_structBuffData; + + char* m_pStructBuffData = nullptr; + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + + uint32_t m_indexIn = 0; + uint32_t m_indexOut = 0; + uint32_t m_socketFlag = 0; + uint32_t m_buffDataIdx = 0; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/share/interface-EEGO.ui b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/share/interface-EEGO.ui new file mode 100644 index 0000000..ff2ef9f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/share/interface-EEGO.ui @@ -0,0 +1,1099 @@ + + + + + + 1 + 89 + 16 + 1 + 10 + + + False + + + True + False + 7 + 8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + True + + False + False + True + True + ChannelAmountAdjustment + True + True + + + + + + + + + + + + + 500 + + + 512 + + + 1000 + + + 1024 + + + 2000 + + + 2048 + + + 4000 + + + 4096 + + + 8000 + + + 8192 + + + 16000 + + + 16384 + + + + + + + + + + + 350 + + + 700 + + + 1500 + + + 4000 + + + + + + + + + + + 150 + + + 750 + + + 1000 + + + + + 100 + 18 + 1 + 10 + + + 100 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + False + 5 + Device configuration + center + dialog + center + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + EEGO + center + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + 8 + 8 + + + True + False + 8 + + + True + False + 10 + 2 + True + + + True + False + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + False + False + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + False + False + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + False + Sampling frequency [Hz] : + right + True + + + 3 + 4 + + + + + True + False + Number of channels : + right + True + + + 8 + 9 + + + + + True + False + Gender : + right + True + + + 2 + 3 + + + + + True + False + Age : + right + True + + + 1 + 2 + + + + + True + False + Identifier : + right + True + + + + + True + False + SamplingRateModel + 0 + + + + 0 + + + + + 1 + 2 + 3 + 4 + + + + + True + False + Signal range EEG [mV] : + right + True + + + 4 + 5 + + + + + True + False + SignalRangeModelEEG + 0 + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + False + Signal range BIP [mV] : + right + True + + + 5 + 6 + + + + + True + False + SignalRangeModelBIP + 0 + + + + 0 + + + + + 1 + 2 + 5 + 6 + + + + + True + False + EEG channel mask : + right + True + + + 6 + 7 + + + + + True + False + BIP channel mask : + right + True + + + 7 + 8 + + + + + True + True + + False + False + True + True + + + 1 + 2 + 6 + 7 + + + + + True + True + + False + False + True + True + + + 1 + 2 + 7 + 8 + + + + + True + True + False + + False + False + True + True + + + 1 + 2 + 8 + 9 + + + + + True + False + Check impedance : + + + 9 + 10 + + + + + True + True + False + True + True + + + 1 + 2 + 9 + 10 + + + + + True + True + 0 + + + + + True + True + 0 + + + + + Change channel names + True + False + False + + + False + True + 1 + + + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCConfigurationEEGO.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCConfigurationEEGO.cpp new file mode 100644 index 0000000..bc72b76 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCConfigurationEEGO.cpp @@ -0,0 +1,165 @@ +#if defined(TARGET_HAS_ThirdPartyEEGOAPI) + +#include +#include + +#include "ovasCConfigurationEEGO.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +// Function to set a predefined string in the combobox. +// Copied from ovasCConfigurationBuilder. Seems to be OK, albeit it is strange to have the code duplication, +// but other amplifier drivers do it too. +// Would be nicer if the method would move to some utilities provider. +static void GTKComboBoxSetActiveText(GtkComboBox* box, const gchar* text) +{ + GtkTreeModel* treeModel = gtk_combo_box_get_model(box); + GtkTreeIter it; + int index = 0; + gchar* name = nullptr; + if (gtk_tree_model_get_iter_first(treeModel, &it)) + { + do + { + gtk_tree_model_get(treeModel, &it, 0, &name, -1); + if (std::string(name) == std::string(text)) + { + gtk_combo_box_set_active(box, index); + return; + } + index++; + } while (gtk_tree_model_iter_next(treeModel, &it)); + } +} + +// If you added more reference attribute, initialize them here +CConfigurationEEGO::CConfigurationEEGO(IDriverContext& ctx, const char* gtkBuilderFilename, CHeaderEEGO& eegoHeader) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx), m_eegoHeader(eegoHeader) {} + +bool CConfigurationEEGO::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + // Insert here the pre-configure code. + // For example, you may want to check if a device is currently connected + // and if more than one are connected. Then you can list in a dedicated combo-box + // the device currently connected so the user can choose which one he wants to acquire from. + // Steffen Heimes: This is actually a TODO: + + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_signal_range_eeg")); + m_eegRangeComboBox = GTK_COMBO_BOX(widget); + + widget = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_signal_range_bip")); + m_bipRangeComboBox = GTK_COMBO_BOX(widget); + + widget = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_eeg_mask")); + m_eegEntryMask = GTK_ENTRY(widget); + g_signal_connect(widget, "changed", G_CALLBACK(updateChannelNumCB), this); + + widget = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_bip_mask")); + m_bipEntryMask = GTK_ENTRY(widget); + g_signal_connect(widget, "changed", G_CALLBACK(updateChannelNumCB), this); + + widget = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_num_channels")); + m_nChannelEntry = GTK_ENTRY(widget); + + if (!m_eegRangeComboBox) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not connect to range widget \n"; } + else + { + if (m_eegoHeader.isEEGRangeSet()) + { + const std::string range = std::to_string(m_eegoHeader.getEEGRange()); + GTKComboBoxSetActiveText(m_eegRangeComboBox, range.c_str()); + } + else { gtk_combo_box_set_active(m_eegRangeComboBox, 0); } + + if (m_eegoHeader.isBIPRangeSet()) + { + const std::string range = std::to_string(m_eegoHeader.getBIPRange()); + GTKComboBoxSetActiveText(m_bipRangeComboBox, range.c_str()); + } + else { gtk_combo_box_set_active(m_bipRangeComboBox, 0); } + } + + if (m_eegoHeader.isBIPMaskSet()) { gtk_entry_set_text(m_bipEntryMask, m_eegoHeader.getBIPMask()); } + if (m_eegoHeader.isEEGMaskSet()) { gtk_entry_set_text(m_eegEntryMask, m_eegoHeader.getEEGMask()); } + + return true; +} + +bool CConfigurationEEGO::postConfigure() +{ + if (m_applyConfig) + { + const gchar* rangeEEG = gtk_combo_box_get_active_text(m_eegRangeComboBox); + const gchar* rangeBip = gtk_combo_box_get_active_text(m_bipRangeComboBox); + const gchar* maskBip = gtk_entry_get_text(m_bipEntryMask); + const gchar* maskEEG = gtk_entry_get_text(m_eegEntryMask); + + m_eegoHeader.setBIPMask(maskBip); + m_eegoHeader.setEEGMask(maskEEG); + m_eegoHeader.setEEGRange(rangeEEG ? atoi(rangeEEG) : 0); + m_eegoHeader.setBIPRange(rangeBip ? atoi(rangeBip) : 0); + } + + if (!CConfigurationBuilder::postConfigure() + ) { return false; } // normal header is filled (Subject ID, Age, Gender, channels, sampling frequency), ressources are released + + // get sum of max active channels. It would be a good idea to use the amplifier connected as a source of the maximum of available channels. + const uint64_t bip = m_eegoHeader.getBIPMaskInt(); + const uint64_t eeg = m_eegoHeader.getEEGMaskInt(); + + const std::bitset<64> bitsetEEG(eeg); + const std::bitset<24> bitsetBip(bip); + + m_header->setChannelCount(bitsetEEG.count() + bitsetBip.count() + 2); + // Plus status channels: trigger and sample counter + + return true; +} + +/// GTK Callbacks +/* static */ +void CConfigurationEEGO::updateChannelNumCB(GtkWidget* /*widget*/, CConfigurationEEGO* pThis) +{ + // get the values + const gchar* maskBip = gtk_entry_get_text(pThis->m_bipEntryMask); + const gchar* maskEEG = gtk_entry_get_text(pThis->m_eegEntryMask); + + uint64_t bip; + uint64_t eeg; + + const bool bipSuccess = CHeaderEEGO::convertMask(maskBip, bip); + const bool eegSuccess = CHeaderEEGO::convertMask(maskEEG, eeg); + + const std::bitset<64> bitsetEEG(eeg); + const std::bitset<24> bitsetBip(bip); + + // format them + std::stringstream ss; + if (eegSuccess) { ss << bitsetEEG.count(); } + else { ss << "Error"; } + + ss << " + "; + + if (bipSuccess) { ss << bitsetBip.count(); } + else { ss << "Error"; } + + ss << " + 2; (EEG + BIP + STATUS)"; + + // set text + gtk_entry_set_text(pThis->m_nChannelEntry, ss.str().c_str()); + + const uint32_t nChannel = bitsetEEG.count() + bitsetBip.count() + 2; + + pThis->m_header->setChannelCount(nChannel); + + // Workaround! The current channel number is not derived from the channel count. It is retrieved from the /here hidden/ + // widget when the channel editing window is opening. Thus we have to set the value there too. + if (GTK_SPIN_BUTTON(pThis->m_nChannels)) { gtk_spin_button_set_value(GTK_SPIN_BUTTON(pThis->m_nChannels), nChannel); } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyEEGOAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCConfigurationEEGO.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCConfigurationEEGO.h new file mode 100644 index 0000000..1da7c60 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCConfigurationEEGO.h @@ -0,0 +1,51 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyEEGOAPI) + +#include +#include <../ovasCConfigurationBuilder.h> +#include + +#include "ovasCHeaderEEGO.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationEEGO + * \author Steffen Heimes (Eemagine GmbH) + * \date Fri May 27 21:48:42 2011 + * \brief The CConfigurationEEGO handles the configuration dialog for setting specific for EEGO. + * \sa CDriverEEGO + */ +class CConfigurationEEGO final : public CConfigurationBuilder +{ +public: + + CConfigurationEEGO(IDriverContext& ctx, const char* gtkBuilderFilename, CHeaderEEGO& eegoHeader); + + bool preConfigure() override; + bool postConfigure() override; + + // Data +protected: + + IDriverContext& m_driverCtx; + + // Methods +private: + + static void updateChannelNumCB(GtkWidget* widget, CConfigurationEEGO* pThis); + + // Data + CHeaderEEGO& m_eegoHeader; + + GtkComboBox* m_eegRangeComboBox = nullptr; + GtkComboBox* m_bipRangeComboBox = nullptr; + GtkEntry* m_eegEntryMask = nullptr; + GtkEntry* m_bipEntryMask = nullptr; + GtkEntry* m_nChannelEntry = nullptr; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCDriverEEGO.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCDriverEEGO.cpp new file mode 100644 index 0000000..3a548ee --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCDriverEEGO.cpp @@ -0,0 +1,471 @@ +#if defined(TARGET_HAS_ThirdPartyEEGOAPI) + +// stl includes +#include +#include +#include +#include + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS +#include +#include +#include +#endif + +// OV includes +#include +#include + +// auxilliary classes for this implementation +#include "ovasCDriverEEGO.h" +#include "ovasCConfigurationEEGO.h" + +// The interface to the driver +// We have to setup the binding method and the unicode support first +#define _UNICODE +#if defined(_MBCS) // Only unicode should be supported. Better stay away from MBCS methods! +#undef _MBCS +#endif +#include // Where it all starts + +// Namespaces +namespace OpenViBE { +namespace AcquisitionServer { +namespace es = eemagine::sdk; + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS +namespace std { + template struct _Unique_if { + typedef unique_ptr _Single_object; + }; + + template struct _Unique_if { + typedef unique_ptr _Unknown_bound; + }; + + template struct _Unique_if { + typedef void _Known_bound; + }; + + template + typename _Unique_if::_Single_object + make_unique(Args&&... args) { + return unique_ptr(new T(std::forward(args)...)); + } + + template + typename _Unique_if::_Unknown_bound + make_unique(size_t n) { + typedef typename remove_extent::type U; + return unique_ptr(new U[n]()); + } + + template + typename _Unique_if::_Known_bound + make_unique(Args&&...) = delete; +} +#endif + +//___________________________________________________________________// +// // + +CDriverEEGO::CDriverEEGO(IDriverContext& ctx) + : IDriver(ctx) + , m_settings("AcquisitionServer_Driver_EEGO", m_driverCtx.getConfigurationManager()), m_triggerChannel(-1) // == Nonexistent + , m_lastTriggerValue(~0) // Set every bit to 1 + , m_iBIPRange(1500) + , m_iEEGRange(1000) + , m_sEEGMask("0xFFFFFFFFFFFFFFFF") // 64 channels + , m_sBIPMask("0xFFFFFF") // 24 channels +{ + m_header.setSamplingFrequency(500); + m_header.setChannelCount(88); + + // The following class allows saving and loading driver settings from the acquisition server .conf file + m_settings.add("Header", &m_header); + + // To save your custom driver settings, register each variable to the SettingsHelper + //m_settings.add("SettingName", &variable); + m_settings.add("BIPRange", &m_iBIPRange); + m_settings.add("EEGRange", &m_iEEGRange); + + m_settings.add("EEGMask", &m_sEEGMask); + m_settings.add("BIPMask", &m_sBIPMask); + + m_settings.load(); +} + +CDriverEEGO::~CDriverEEGO() {} + +const char* CDriverEEGO::getName() { return "EEGO"; } + +bool CDriverEEGO::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected() + || !m_header.isChannelCountSet() + || !m_header.isSamplingFrequencySet()) { return false; } + + try + { + // Builds up a buffer to store + // acquired samples. This buffer + // will be sent to the acquisition + // server later... + m_sample = std::make_unique(m_header.getChannelCount() * nSamplePerSentBlock); + m_samplesInBuffer = 0; + + // Get the amplifier. If none is connected an exception will be thrown + try { m_pAmplifier.reset(factory().getAmplifier()); } + catch (const std::exception& ex) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Failure to get an amplifier! Reason: " << ex.what() << "\n"; + throw; + } + + if (m_driverCtx.isImpedanceCheckRequested()) + { + // end streaming first, if started + m_pStream.reset(); + + // After init we are in impedance mode until the recording is started + m_pStream.reset(m_pAmplifier->OpenImpedanceStream(getRefChannelMask())); + } + } + catch (const std::exception& ex) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to initialize the driver. Exception: " << ex.what() << "\n"; + + m_sample.reset(); + m_pAmplifier.reset(); + m_pStream.reset(); + + return false; + } + + // Save parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; +} + +bool CDriverEEGO::check_configuration() +{ + // get masks from configuration + const uint64_t maskBip = getBipChannelMask(); + const uint64_t maskEEG = getRefChannelMask(); + + const std::bitset<64> bitsetEEG(maskEEG); + const std::bitset<24> bitsetBip(maskBip); + + const size_t allChannels = bitsetBip.count() + bitsetEEG.count() + 2; // trigger and sample count as additional channels + if (allChannels < m_header.getChannelCount()) + { + // Not enough channels, we have to reduce them + GtkWidget* dialog = gtk_message_dialog_new(nullptr, // parent + GTK_DIALOG_MODAL, // Behavoir + GTK_MESSAGE_QUESTION, // Type + GTK_BUTTONS_OK_CANCEL, // buttons + "The channels masks are set to only stream %ld channels, but %d channels should be streamed.\n" + "Change the amount of channels to %ld?", allChannels, m_header.getChannelCount(), allChannels); + const gint res = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + dialog = nullptr; + switch (res) + { + case GTK_RESPONSE_OK: + // update the channel count to contain only the selected masks + m_header.setChannelCount(allChannels); + break; + default: + // Nothing can be done here + return false; + } + } + + return true; +} + +uint64_t CDriverEEGO::getRefChannelMask() const +{ + uint64_t maskEEG(0); + if (!CHeaderEEGO::convertMask(m_sEEGMask, maskEEG)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Error converting mask: m_sEEGMask: " << m_sEEGMask << "\n"; + } + return maskEEG; +} + +uint64_t CDriverEEGO::getBipChannelMask() const +{ + uint64_t maskBip(0); + if (!CHeaderEEGO::convertMask(m_sBIPMask, maskBip)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Error converting mask: maskBip: " << maskBip << "\n"; + } + return maskBip; +} + +eemagine::sdk::factory& CDriverEEGO::factory() +{ + if (m_pFactory == nullptr) + { + // create the amplifier factory + // To initialize we need to locate the path of the DLL + // Create path to the dll +#ifdef _WIN32 + const CString libDir = Directories::getBinDir() + "\\eego-SDK.dll"; + const std::string path(libDir.toASCIIString()); +#else + const std::string path("libeego-SDK.so"); +#endif // _WIN32 + + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "SDK dll/so path: " << path << "\n"; + m_pFactory = std::make_unique(path); + + // to check what is going on case of error; Log version + const auto version = m_pFactory->getVersion(); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "EEGO SDK Version: " << version.major << "." << version.minor << "." << version.micro << "." << + version.build << "\n"; + } + + return *m_pFactory; +} + +bool CDriverEEGO::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted() || !m_pAmplifier) { return false; } + + // Check configuration + if (!check_configuration()) { return false; } + + // ... + // request hardware to start + // sending data + // .. + const double bipRange = m_iBIPRange / 1000.; + const double eegRange = m_iEEGRange / 1000.; + + try + { + // stop old streams, if existing + m_pStream.reset(); + // Create the eeg stream + m_pStream.reset(m_pAmplifier->OpenEegStream(m_header.getSamplingFrequency(), eegRange, bipRange, getRefChannelMask(), getBipChannelMask())); + + // Error check + if (!m_pStream) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "The stream returned is NULL!" << "\n"; + return false; + } + + // find trigger channel + auto list = m_pStream->getChannelList(); + const auto triggerIterator = std::find_if(list.begin(), list.end(), [](eemagine::sdk::channel& chan) + { + return chan.getType() == eemagine::sdk::channel::trigger; + }); + + if (triggerIterator == list.end()) + { + m_triggerChannel = -1; // Unkown + } + else { m_triggerChannel = (*triggerIterator).getIndex(); } + + // Wait till we are really getting data. + while (m_pStream->getData().getSampleCount() == 0) + { + System::Time::sleep(5); // Do Nothing + } + } + catch (const std::exception& ex) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not open EEG stream: " << ex.what() << "\n"; + return false; + } + + return true; +} + +bool CDriverEEGO::loop() +{ + bool result = false; + + try { result = loop_wrapped(); } + catch (const std::exception& ex) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error in data update: " << ex.what() << "\n"; } + catch (...) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unknown error in data update." << "\n"; } + + return result; +} + +bool CDriverEEGO::loop_wrapped() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted() && !m_driverCtx.isImpedanceCheckRequested()) { return true; } // Nothing to be done here! + if (!m_pStream) { return false; } + + // Check if we really provide enough channels + // When doing impedance only the normal EEG channels are tested. This is fine and handled. + if (m_pStream->getChannelList().size() < m_header.getChannelCount() && m_driverCtx.isStarted()) // !started -> impedance + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "The amplifier got asked for more channels than it could provide" << "\n"; + return false; + } + + if (m_driverCtx.isStarted()) // Normal operation + { + eemagine::sdk::buffer data; + + try { data = m_pStream->getData(); } + catch (const std::exception& ex) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error fetching data: " << ex.what() << "\n"; + return false; + } + + const size_t nSample = data.getSampleCount(); + + // For EEGO the with every index increment, the channel is incremented. + // For OpenVibe it means next sample. Therefor we have to transpose the data + for (size_t sample = 0; sample < nSample; ++sample) + { + for (size_t channel = 0; channel < m_header.getChannelCount(); ++channel) + { + const int ovIdx = int(m_samplesInBuffer + channel * m_nSamplePerSentBlock); + + const double& sampleVal = data.getSample(channel, sample); + m_sample[ovIdx] = float(sampleVal); + } + + // Add potential triggers to stimulation set + // check for triggers + if (m_triggerChannel >= 0) // Only try to find triggers when the channel exists + { + // A trigger is detected when the level changes in positive direction, all additional bits are seen as trigger code + // a change from 1 to 0 is ignored + const uint32_t currentTriggers = uint32_t(data.getSample(m_triggerChannel, sample)); + const uint32_t currentNewTriggers = currentTriggers & ~m_lastTriggerValue; + m_lastTriggerValue = currentTriggers; + + if (currentNewTriggers != 0) + { + const uint64_t currentTime = CTime(m_header.getSamplingFrequency(), m_samplesInBuffer).time(); + m_stimSet.appendStimulation(OVTK_StimulationId_Label(currentNewTriggers), currentTime, 0); + } + } + + // Send buffer counter + m_samplesInBuffer++; + + // Send buffer is full, so send it + if (m_samplesInBuffer == m_nSamplePerSentBlock) + { + m_callback->setSamples(m_sample.get()); + m_callback->setStimulationSet(m_stimSet); + + // When your sample buffer is fully loaded, + // it is advised to ask the acquisition server + // to correct any drift in the acquisition automatically. + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + + m_samplesInBuffer = 0; + m_stimSet.clear(); + } + } + } + else // Impedance + { + // Get the impedance data, here the data is always the most current state. + // The method can block if impedance still needs to be calculated. + eemagine::sdk::buffer data; + try { data = m_pStream->getData(); } + catch (const std::exception& ex) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error fetching data: " << ex.what() << "\n"; + return false; + } + + // We have to take care not to r/w over any boundary. + const size_t minChannels = std::min(size_t(data.getChannelCount()), m_header.getChannelCount()); + for (size_t channel = 0; channel < minChannels; ++channel) { m_driverCtx.updateImpedance(channel, data.getSample(channel, 0)); } + } + + return true; +} + +bool CDriverEEGO::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + // ... + // request the hardware to stop + // sending data + // ... + if (m_driverCtx.isImpedanceCheckRequested()) + { + try + { + m_pStream.reset(); + m_pStream.reset(m_pAmplifier->OpenImpedanceStream(getRefChannelMask())); // And we can stream Impedances once more. + } + catch (const std::exception& ex) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error restarting impedance: " << ex.what() << "\n"; + return false; + } + } + + return true; +} + +bool CDriverEEGO::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // ... + // uninitialize hardware here + // ... + m_pStream.reset(); + m_pAmplifier.reset(); + m_sample.reset(); + + m_callback = nullptr; + m_samplesInBuffer = 0; + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverEEGO::isConfigurable() +{ + return true; // change to false if your device is not configurable +} + +bool CDriverEEGO::configure() +{ + // Change this line if you need to specify some references to your driver attribute that need configuration, e.g. the connection ID. + CConfigurationEEGO config(m_driverCtx, + Directories::getDataDir() + "/applications/acquisition-server/interface-EEGO.ui", + m_header); + + m_header.setBIPRange(m_iBIPRange); + m_header.setEEGRange(m_iEEGRange); + m_header.setBIPMask(m_sBIPMask); + m_header.setEEGMask(m_sEEGMask); + if (!config.configure(m_header)) { return false; } + + m_iBIPRange = m_header.getBIPRange(); + m_iEEGRange = m_header.getEEGRange(); + m_sBIPMask = m_header.getBIPMask(); + m_sEEGMask = m_header.getEEGMask(); + + m_settings.save(); + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCDriverEEGO.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCDriverEEGO.h new file mode 100644 index 0000000..9d4e81d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCDriverEEGO.h @@ -0,0 +1,99 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyEEGOAPI) + +#include + +#include "ovasIDriver.h" +#include "ovasCHeaderEEGO.h" +#include + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +// forward declarations +namespace eemagine { +namespace sdk { +class amplifier; +class stream; +class factory; +} +} + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverEEGO + * \author Steffen Heimes (eemagine GmbH) + * \date Mon Oct 20 14:40:33 2014 + * \brief The CDriverEEGO allows the acquisition server to acquire data from an EEGO device. + * + * \sa CConfigurationEEGO + */ +class CDriverEEGO final : public IDriver +{ +public: + + explicit CDriverEEGO(IDriverContext& ctx); + ~CDriverEEGO() override; + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool isFlagSet(const EDriverFlag /*flag*/) const + override { return false; } // The only currently used flag is for checking for unstability. eego is stable now. + +private: + + bool loop_wrapped(); + + /** + * Check if the configuration makes sense and tries to fix it, informing the user. + */ + bool check_configuration(); + uint64_t getRefChannelMask() const; + uint64_t getBipChannelMask() const; + eemagine::sdk::factory& factory(); + +protected: + + SettingsHelper m_settings; + IDriverCallback* m_callback = nullptr; + CHeaderEEGO m_header; + + uint32_t m_nSamplePerSentBlock = 0; + std::unique_ptr m_sample; + + std::unique_ptr m_pFactory; + std::unique_ptr m_pAmplifier; + std::unique_ptr m_pStream; + +private: + + uint32_t m_samplesInBuffer = 0; + uint32_t m_triggerChannel = 0; + CStimulationSet m_stimSet; // Storing the samples over time + + // To detect flanks in the trigger signal. The last state on the trigger input. + uint32_t m_lastTriggerValue = 0; + + // For setting store/load + uint32_t m_iBIPRange = 0; // [mV] + uint32_t m_iEEGRange = 0; // [mV] + CString m_sEEGMask; // String interpreted as value to be interpreted as bitfield + CString m_sBIPMask; // String interpreted as value to be interpreted as bitfield +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + + +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCHeaderEEGO.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCHeaderEEGO.cpp new file mode 100644 index 0000000..2ac8bd4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCHeaderEEGO.cpp @@ -0,0 +1,94 @@ +#if defined TARGET_HAS_ThirdPartyEEGOAPI + +#include +#include +#include + +#include "ovasCHeaderEEGO.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +void CHeaderEEGO::setEEGRange(const uint32_t range) +{ + m_iEEGRange = range; + m_bEEGRangeSet = true; +} + +void CHeaderEEGO::setEEGMask(const CString& mask) +{ + m_sEEGMask = mask; + m_bEEGMaskSet = true; +} + +void CHeaderEEGO::setBIPRange(const uint32_t range) +{ + m_iBIPRange = range; + m_bBIPRangeSet = true; +} + +void CHeaderEEGO::setBIPMask(const CString& mask) +{ + m_sBIPMask = mask; + m_bBIPMaskSet = true; +} + +/* static */ +bool CHeaderEEGO::convertMask(char const* str, uint64_t& out) +{ + bool error = false; + + // init r_outValue anyway + out = 0; + + std::string input(str); //easier substring handling etc. Minor performance penalty which should not matter. + boost::algorithm::trim(input); // Make sure to handle whitespace correctly + + // check prefixes + if (boost::algorithm::istarts_with(input, "0b")) + { + // binary + const auto substring = input.substr(2); + + // check for valid string members + if (!std::all_of(substring.begin(), substring.end(), [&](const char& chr) { return chr == '0' || chr == '1'; })) { error = true; } + else + { + // use the substring for string to number conversion as base 2 + out = strtoull(substring.c_str(), nullptr, 2); + } + } + else if (boost::algorithm::istarts_with(input, "0x")) + { + // hex + const auto substring = input.substr(2); + std::locale loc; + + if (!std::all_of(substring.begin(), substring.end(), [&](const char& chr) { return std::isxdigit(chr, loc); })) { error = true; } + else { out = strtoull(substring.c_str(), nullptr, 16); } + } + else if (boost::algorithm::istarts_with(input, "0")) + { + // octal + const auto substring = input.substr(1); + + if (!std::all_of(substring.begin(), substring.end(), [&](const char& chr) { return chr >= '0' && chr < '8'; })) { error = true; } + else { out = strtoull(substring.c_str(), nullptr, 8); } + } + else + { + // decimal + //const auto substring = input; + std::locale loc; + + if (!std::all_of(input.begin(), input.end(), [&](const char& chr) { return std::isdigit(chr, loc); })) { error = true; } + else { out = strtoull(input.c_str(), nullptr, 10); } + } + + // if no special handling for the base 2 case is neccessary we can just use the std::stroull implementation and do not mess with that any further. + return !error; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCHeaderEEGO.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCHeaderEEGO.h new file mode 100644 index 0000000..626e9c6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/eemagine-eego/src/ovasCHeaderEEGO.h @@ -0,0 +1,63 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyEEGOAPI + +#include "../ovasCHeader.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class CHeaderEEGO final : public CHeader +{ +public: + + CHeaderEEGO() { } + + // EEG, referential channels + // range + uint32_t getEEGRange() const { return m_iEEGRange; } + + void setEEGRange(uint32_t range); + bool isEEGRangeSet() const { return m_bEEGRangeSet; } + + // mask + CString getEEGMask() const { return m_sEEGMask; } + uint64_t getEEGMaskInt() const { return strtoull(m_sEEGMask, nullptr, 0); } // Same as method above. Only string parsing has been done + void setEEGMask(const CString& mask); + bool isEEGMaskSet() const { return m_bEEGMaskSet; } + + // Bipolar channels + // range + uint32_t getBIPRange() const { return m_iBIPRange; } + uint64_t getBIPMaskInt() const { return strtoull(m_sBIPMask, nullptr, 0); } // Same as method above. Only string parsing has been done + void setBIPRange(uint32_t range); + bool isBIPRangeSet() const { return m_bBIPRangeSet; } + + // mask + CString getBIPMask() const { return m_sBIPMask; } + void setBIPMask(const CString& mask); + bool isBIPMaskSet() const { return m_bBIPMaskSet; } + + // Converts a string representing a number to this number as unsigned 64 bit value. + // Accepts 0x, 0b and 0 notation for hexadecimal, binary and octal notation. + // Otherwise it is interpreted as decimal. + // Returns true if the conversion was successfull, false on error. + // Please note that the error checking goes beyond the parsing strtoull etc.: + // The strto* methods stop parsing at the first character which could not be interpreted. + // Here the string is checked against all invalid chars and an error will be returned. + static bool convertMask(char const* str, uint64_t& out); + + // data +protected: + uint32_t m_iEEGRange = 1000; + uint32_t m_iBIPRange = 1500; + CString m_sEEGMask = "0xFFFFFFFFFFFFFFFF"; + CString m_sBIPMask = "0xFFFFFF"; + bool m_bEEGRangeSet = false; + bool m_bBIPRangeSet = false; + bool m_bEEGMaskSet = false; + bool m_bBIPMaskSet = false; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/encephalan/share/interface-Encephalan.ui b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/encephalan/share/interface-Encephalan.ui new file mode 100644 index 0000000..a3cc94c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/encephalan/share/interface-Encephalan.ui @@ -0,0 +1,380 @@ + + + + + + 18 + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 64 + 1 + 64 + 1 + 10 + + + 120 + 1 + 65536 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 250 + + + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + vertical + 8 + + + True + Encephalan + center + + + 1 + + + + + True + + + False + 2 + + + + + True + 8 + vertical + 8 + + + True + 8 + + + True + 7 + 2 + True + + + True + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + Sampling frequency : + right + True + + + 4 + 5 + + + + + True + Number of channels : + right + True + + + 3 + 4 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Identifier : + right + True + + + + + True + model2 + 0 + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + True + adjustment3 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + Connection IP : + right + True + + + 5 + 6 + + + + + True + Connection Port : + right + True + + + 6 + 7 + + + + + True + True + adjustment4 + True + True + + + 1 + 2 + 6 + 7 + + + + + True + True + 30 + + + 1 + 2 + 5 + 6 + + + + + 0 + + + + + 0 + + + + + Change channel names + True + False + False + + + False + 1 + + + + + 3 + + + + + True + + + False + 4 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/encephalan/src/ovasCConfigurationEncephalan.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/encephalan/src/ovasCConfigurationEncephalan.cpp new file mode 100644 index 0000000..a475b93 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/encephalan/src/ovasCConfigurationEncephalan.cpp @@ -0,0 +1,42 @@ +#include "ovasCConfigurationEncephalan.h" +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +//--------------------------------------------------------------------------------------------------- +CConfigurationEncephalan::CConfigurationEncephalan(IDriverContext& driverContext, const char* gtkFileName, uint32_t& connectionPort, char* connectionIp) + : CConfigurationBuilder(gtkFileName), m_driverContext(driverContext), m_connectionPort(connectionPort), m_connectionIp(connectionIp) { } +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CConfigurationEncephalan::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + GtkSpinButton* port = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_port")); + gtk_spin_button_set_value(port, m_connectionPort); + GtkEntry* ip = GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_ip")); + gtk_entry_set_text(ip, m_connectionIp); + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CConfigurationEncephalan::postConfigure() +{ + if (m_applyConfig) + { + GtkSpinButton* port = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_port")); + m_connectionPort = uint32_t(gtk_spin_button_get_value_as_int(port)); + GtkEntry* ip = GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_ip")); + m_connectionIp = const_cast(gtk_entry_get_text(ip)); + } + + return CConfigurationBuilder::postConfigure(); +} +//--------------------------------------------------------------------------------------------------- + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/encephalan/src/ovasCConfigurationEncephalan.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/encephalan/src/ovasCConfigurationEncephalan.h new file mode 100644 index 0000000..17e832b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/encephalan/src/ovasCConfigurationEncephalan.h @@ -0,0 +1,36 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovasCConfigurationEncephalan.h +/// \brief The CConfigurationEncephalan handles the configuration dialog specific to the Encephalan device. +/// \author Alexey Minin (UrFU) +/// \version 1.0. +/// \date 02/01/2019. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/// The CConfigurationEncephalan handles the configuration dialog specific to the Encephalan device. +/// +class CConfigurationEncephalan final : public CConfigurationBuilder +{ +public: + CConfigurationEncephalan(IDriverContext& driverContext, const char* gtkFileName, uint32_t& connectionPort, char* connectionIp); + + bool preConfigure() override; + bool postConfigure() override; + char* getConnectionIp() const { return m_connectionIp; } + +protected: + IDriverContext& m_driverContext; + uint32_t& m_connectionPort; + char* m_connectionIp = nullptr; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/encephalan/src/ovasCDriverEncephalan.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/encephalan/src/ovasCDriverEncephalan.cpp new file mode 100644 index 0000000..8ebdc47 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/encephalan/src/ovasCDriverEncephalan.cpp @@ -0,0 +1,274 @@ +#if defined TARGET_OS_Windows + +#include "ovasCDriverEncephalan.h" +#include "ovasCConfigurationEncephalan.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +//--------------------------------------------------------------------------------------------------- +CDriverEncephalan::CDriverEncephalan(IDriverContext& driverContext) + : IDriver(driverContext), m_settings("AcquisitionServer_Driver_Encephalan", m_driverCtx.getConfigurationManager()) +{ + m_connectionIp = static_cast("127.0.0.1"); + m_header.setSamplingFrequency(250); + m_header.setChannelCount(8); + + m_settings.add("Header", &m_header); + m_settings.load(); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CDriverEncephalan::initialize(const uint32_t sampleCountPerBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + m_sample = new float[m_header.getChannelCount() * sampleCountPerBlock]; + if (!m_sample) + { + delete[] m_sample; + m_sample = nullptr; + return false; + } + + // Saves parameters + m_callback = &callback; + m_nSamplePerBlock = sampleCountPerBlock; + return connectEncephalan(); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CDriverEncephalan::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // request hardware to start + return sendRequestForData(); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CDriverEncephalan::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted()) { return true; } + + m_currentPoint = 0; + ZeroMemory(m_sample, sizeof(float)*m_nSamplePerBlock*m_header.getChannelCount()); + while (m_currentPoint < m_nSamplePerBlock) { receiveData(); } + m_callback->setSamples(m_sample); + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CDriverEncephalan::stop() { return m_driverCtx.isConnected() && m_driverCtx.isStarted(); } +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CDriverEncephalan::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + delete[] m_sample; + m_sample = nullptr; + m_callback = nullptr; + + closesocket(m_client); + WSACleanup(); + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CDriverEncephalan::connectEncephalan() +{ + WSADATA wsaData; + const int wsaret = WSAStartup(0x101, &wsaData); + if (wsaret != 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error WSAStartup (initialization windows socket api): " << WSAGetLastError() << "\n"; + return false; + } + + m_client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (m_client == INVALID_SOCKET) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error socket (creation a socket): " << WSAGetLastError() << "\n"; + WSACleanup(); + return false; + } + + sockaddr_in sockaddrIn; + sockaddrIn.sin_family = AF_INET; + sockaddrIn.sin_addr.s_addr = inet_addr(m_connectionIp); + sockaddrIn.sin_port = htons(u_short(m_connectionPort)); + const int connectError = connect(m_client, reinterpret_cast(&sockaddrIn), sizeof(sockaddrIn)); + if (connectError != 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error connect (connection to a specified socket): " << WSAGetLastError() << "\n"; + return false; + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CDriverEncephalan::sendRequestForData() const +{ + BYTE* sendDataBuffer = new BYTE; + + unsigned long ID = 0x0001; //EEG_ONLY_MODE + //unsigned long ID = 0x000C; //ALL_CHANNELS_MODE + //unsigned long ID = 0x000E; //HD_CHANNELS_MODE + + CopyMemory(sendDataBuffer, &ID, sizeof(ID)); + if (!sendData(sendDataBuffer, sizeof(ID))) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error sendRequestForData: " << WSAGetLastError() << "\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "sendRequestForData\n"; + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CDriverEncephalan::sendData(BYTE* data, int dataSize) const +{ + if (m_client == INVALID_SOCKET) { return false; } + + const long fullLen = dataSize + long(sizeof(int)); + char* outData = new char[fullLen]; + + CopyMemory(&outData[0], &dataSize, sizeof(int)); + CopyMemory(&outData[sizeof(int)], &data[0], dataSize); + + if (send(m_client, outData, fullLen, 0) != fullLen) + { + delete[] outData; + return false; + } + + delete[]outData; + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CDriverEncephalan::receiveData() +{ + int inpSize = 0; + char* inpData = new char[sizeof(inpSize) * sizeof(BYTE)]; + const int nReadSize = recv(m_client, inpData, sizeof(inpSize), 0); + if (nReadSize <= 0) { return false; } + + CopyMemory(&inpSize, &inpData[0], sizeof(inpSize)); + delete[]inpData; + + if ((inpSize > 0) && (inpSize < 1024 * 512)) + { + //unsigned long ID = 0; + inpData = new char[inpSize * sizeof(BYTE)]; + if (recv(m_client, inpData, inpSize, 0) == inpSize) { readData(reinterpret_cast(inpData), inpSize); } + delete[]inpData; + inpData = nullptr; + } + else { return false; } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +void CDriverEncephalan::readData(BYTE* data, const int dataSize) +{ + BYTE* pCurData = data; + int curDataSize = dataSize; + + unsigned long ID = 0; + getData(pCurData, curDataSize, &ID, sizeof(ID)); + switch (ID) + { + case 0x0002: // Information on research + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Recieved information on research\n"; + break; + case 0x00E2: // This prompted all the data including the kilohertz + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Recieved all the data including the kilohertz\n"; + break; + case 0x0003: m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "0x0003 data package\n"; + break; + case 0x0006: m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "0x0006 data package\n"; + break; + case 0x0008: // We came signal data + receiveEEGData(pCurData, curDataSize); + break; + case 0x00E8: // Packet came with HD data + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Packet came with HD data\n"; + break; + case 0x0009: m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "0x0009 data package\n"; + break; + case 0x000A: m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "0x000A data package\n"; + break; + case 0x0101: m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "0x0101 data package\n"; + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Undefined data package\n"; + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +// Parsing package with EEG data +void CDriverEncephalan::receiveEEGData(BYTE* curData, int curDataSize) +{ + int sliceNum = 0; + int pointsNumber = 0; + getData(curData, curDataSize, &sliceNum, sizeof(sliceNum)); + getData(curData, curDataSize, &pointsNumber, sizeof(pointsNumber)); + + short* dstData = new short[pointsNumber]; + ZeroMemory(dstData, sizeof(short)*pointsNumber); + getData(curData, curDataSize, dstData, pointsNumber * int(sizeof(short))); + + for (size_t iPos = 0; iPos < m_header.getChannelCount(); ++iPos) + { + float val = float(dstData[iPos]); + CopyMemory(m_sample + (m_currentPoint + iPos * m_nSamplePerBlock), &val, sizeof(float)); + } + m_currentPoint++; + + delete[] dstData; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +void CDriverEncephalan::getData(BYTE* & data, int& dataSize, void* dstData, const int dstSize) +{ + if (dataSize < dstSize) { return; } + CopyMemory(dstData, data, dstSize); + data += dstSize; + dataSize -= dstSize; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CDriverEncephalan::configure() +{ + // Change this line if you need to specify some references to your driver attribute that need configuration, e.g. the connection ID. + CConfigurationEncephalan configuration(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-Encephalan.ui", + m_connectionPort, m_connectionIp); + + if (!configuration.configure(m_header)) { return false; } + m_connectionIp = configuration.getConnectionIp(); + m_settings.save(); + + return true; +} +//--------------------------------------------------------------------------------------------------- + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/encephalan/src/ovasCDriverEncephalan.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/encephalan/src/ovasCDriverEncephalan.h new file mode 100644 index 0000000..ac28c35 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/encephalan/src/ovasCDriverEncephalan.h @@ -0,0 +1,72 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovasCDriverEncephalan.h +/// \brief The CDriverEncephalan allows the acquisition server to acquire data from a Encephalan device. +/// \author Alexey Minin (UrFU) +/// \version 1.0. +/// \date 02/01/2019. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#if defined TARGET_OS_Windows + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include "winsock.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/// The CDriverEncephalan allows the acquisition server to acquire data from a Encephalan device. +/// +class CDriverEncephalan final : public IDriver +{ +public: + + explicit CDriverEncephalan(IDriverContext& driverContext); + ~CDriverEncephalan() override = default; + const char* getName() override { return "Encephalan"; } + + bool initialize(const uint32_t sampleCountPerBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } // change to false if your device is not configurable + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + +protected: + bool connectEncephalan(); + bool sendRequestForData() const; + bool sendData(BYTE* data, int dataSize) const; + bool receiveData(); + void readData(BYTE* data, int dataSize); + static void getData(BYTE* & data, int& dataSize, void* dstData, int dstSize); + void receiveEEGData(BYTE* curData, int curDataSize); + + SettingsHelper m_settings; + IDriverCallback* m_callback = nullptr; + CHeader m_header; + uint32_t m_nSamplePerBlock = 0; + float* m_sample = nullptr; + + char* m_connectionIp = nullptr; + uint32_t m_connectionPort = 120; + uint32_t m_currentPoint = 0; + SOCKET m_client = 0; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/share/interface-Fieldtrip.ui b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/share/interface-Fieldtrip.ui new file mode 100644 index 0000000..b4c700a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/share/interface-Fieldtrip.ui @@ -0,0 +1,702 @@ + + + + + + 1025 + 49151 + 1 + 10 + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 1 + 1 + 1024 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 128 + + + 256 + + + 512 + + + 1024 + + + 2048 + + + 4096 + + + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + Fieldtrip + center + + + False + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 7 + 2 + True + + + True + True + adjustment1 + True + True + + + 1 + 2 + 4 + 5 + + + + + True + True + 15 + + + + 1 + 2 + 3 + 4 + + + + + True + Buffer port number + + + 4 + 5 + + + + + True + Buffer host name + + + 3 + 4 + + + + + True + Identifier : + right + True + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + True + adjustment3 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + Min nb of samples in buffer + + + 5 + 6 + + + + + True + True + + adjustment5 + + + 1 + 2 + 5 + 6 + + + + + Correct manually drift due to non-integer sampling rate + True + True + False + True + + + 2 + 6 + 7 + + + + + 0 + + + + + 0 + + + + + False + 3 + + + + + True + + + False + 4 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + + + + True + 10 + 10 + + + True + True + adjustment4 + True + True + + + 2 + 3 + + + + + True + model2 + + + + 0 + + + + + 1 + 2 + + + + + Change channel names + True + False + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 1 + 10000 + 1 + 10 + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/GetCpuTime.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/GetCpuTime.h new file mode 100644 index 0000000..d0c90dc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/GetCpuTime.h @@ -0,0 +1,32 @@ +#pragma once + +#include "windows.h" +#include "ov_defines.h" +#include "ovCString.h" + +//___________________________________________________________________// +// // +// Get Cpu Time // +//___________________________________________________________________// +// // +namespace OpenViBE +{ + OV_API bool GetEnvVar( CString& sVar, CString& sValue ); + OV_API bool PutEnvVar( CString& sVar, CString& sValue ); + + OV_API inline double GetCPUTimeInMilliseconds() + { + static bool bGotCPUFreq = false; + static double timerFrequency = 1; + if ( !bGotCPUFreq ) + { + unsigned __int64 cpufreq = 1; + QueryPerformanceFrequency((LARGE_INTEGER*)&cpufreq); + timerFrequency = (1000.0/cpufreq); + } + unsigned __int64 curTime = 0; + QueryPerformanceCounter((LARGE_INTEGER *)&curTime); + return timerFrequency * curTime; + }; + +} \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/buffer.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/buffer.h new file mode 100644 index 0000000..fbf3226 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/buffer.h @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2008, Robert Oostenveld & Christian Hesse + * F.C. Donders Centre for Cognitive Neuroimaging, Radboud University Nijmegen, + * Kapittelweg 29, 6525 EN Nijmegen, The Netherlands + * + */ +/* prevent double include */ +#ifndef BUFFER_H +#define BUFFER_H + +#include +#include +#include + +#include "platform_includes.h" +#include "message.h" + +#ifndef POLLRDNORM +#define POLLRDNORM POLLIN +#endif + +#ifndef POLLRDBAND +#define POLLRDBAND POLLPRI +#endif + +#ifndef POLLWRNORM +#define POLLWRNORM POLLOUT +#endif + +#ifndef POLLWRBAND +#define POLLWRBAND POLLOUT +#endif + +#define BACKLOG 16 +#define DEFAULT_HOSTNAME "localhost" +#define DEFAULT_PORT 1972 + +#define SO_RCVBUF_SIZE 16384 +#define SO_SNDBUF_SIZE 16384 + +/* this is because the function has been renamed, but is perhaps already in use in other software */ +#define open_remotehost open_connection + +/* FIXME these should be variable */ +#define MAXNUMBYTE (512*1024*1024) +#define MAXNUMSAMPLE 600000 +#define MAXNUMEVENT 100 + +#define WRAP(x,y) ((x) - (int(float(x)/(y)))*(y)) +#define FREE(x) {if (x) {free(x); x= nullptr;}} + +#ifdef __cplusplus +extern "C" { + +#endif + +/* declaration of "public" buffer API functions */ +/* SK: where are these, and what are they for ? */ +int read_header( const char *hostname, int port, void **ppw); +int read_data( const char *hostname, int port, int *pnw, void **ppw); +int read_event( const char *hostname, int port, int *pnw, void **ppw); +int write_header(const char *hostname, int port, void **ppw); +int write_data( const char *hostname, int port, int *pnw, void **ppw); +int write_event( const char *hostname, int port, int *pnw, void **ppw); +int flush_header(const char *hostname, int port); +int flush_data( const char *hostname, int port); +int flush_event( const char *hostname, int port); +void cleanup_buffer(); + +/* definition of the functions that implement the network transparent server */ +void *tcpserver(void *); +void *tcpsocket(void *); + +/* definition of test functions that emulate an acquisition system */ +void *sinewave_thread(void *); +void *event_thread(void *); + +/* definition of the functions used in thread cancelation, see cleanup.c */ +void cleanup_message(void **arg); +void cleanup_header(void **arg); +void cleanup_data(void **arg); +void cleanup_event(void **arg); +void cleanup_buf(void **arg); +void cleanup_socket(int *); + +/* definition of helper functions for debugging and printing the content of various structures */ +void print_request(messagedef_t *); +void print_response(messagedef_t *); +void print_headerdef(headerdef_t *); +void print_datadef(datadef_t *); +void print_eventdef(eventdef_t *); +void print_datasel(datasel_t *); +void print_eventsel(eventsel_t *); +void print_buf(void *, int); + +/* definition of even more helper functions, see util.c */ +int open_connection(const char*, int); +int open_unix_connection(const char *name); +int close_connection(int); +unsigned int append(void **, unsigned int, void *, unsigned int); +unsigned int bufread(int, void *, unsigned int); +unsigned int bufwrite(int, const void *, unsigned int); +int clientrequest(int, const message_t *, message_t**); +int dmarequest(const message_t *, message_t**); +int tcprequest(int, const message_t *, message_t**); +unsigned int wordsize_from_type(UINT32_T data_type); +void check_datatypes(); +int check_event_array(unsigned int size, const void *buf); +const ft_chunk_t *find_chunk(const void *buf, unsigned int offset0, unsigned int size, UINT32_T chunk_type); + +void ft_swap16(unsigned int numel, void *data); +void ft_swap32(unsigned int numel, void *data); +void ft_swap64(unsigned int numel, void *data); +int ft_swap_buf_to_native(UINT16_T command, UINT32_T bufsize, void *buf); +int ft_convert_chunks_from_native(UINT32_T size, UINT32_T nchans, void *buf); +int ft_swap_from_native(UINT16_T orgCommand, message_t *msg); + +typedef struct { + char name[256]; + int port; +} host_t; + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/cleanup.c b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/cleanup.c new file mode 100644 index 0000000..7ed5c72 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/cleanup.c @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2008, Robert Oostenveld + * F.C. Donders Centre for Cognitive Neuroimaging, Radboud University Nijmegen, + * Kapittelweg 29, 6525 EN Nijmegen, The Netherlands + * + */ + +#include +#include +#include "buffer.h" + +/* this is used for debugging */ +int verbose = 0; + +void cleanup_socket(int *arg) { + if (verbose>0) fprintf(stderr, "cleanup_socket: s = %d\n", *arg); + if ((*arg)>0) { + close_connection(*arg); + } + *arg = 0; + return; +} + +void cleanup_message(void **arg) { + message_t *message = (message_t *)*arg; + if (verbose>0) fprintf(stderr, "cleanup_message()\n"); + if (message) { + FREE(message->def); + FREE(message->buf); + FREE(message); + } + return; +} + +void cleanup_header(void **arg) { + header_t *header = (header_t *)*arg; + if (verbose>0) fprintf(stderr, "cleanup_header()\n"); + if (header) { + FREE(header->def); + FREE(header->buf); + FREE(header); + } + return; +} + +void cleanup_data(void **arg) { + data_t *data = (data_t *)*arg; + if (verbose>0) fprintf(stderr, "cleanup_data()\n"); + if (data) { + FREE(data->def); + FREE(data->buf); + FREE(data); + } + return; +} + +void cleanup_event(void **arg) { + event_t *event = (event_t *)*arg; + if (verbose>0) fprintf(stderr, "cleanup_event()\n"); + if (event) { + FREE(event->def); + FREE(event->buf); + FREE(event); + } + return; +} + +void cleanup_buf(void **arg) { + if (verbose>0) fprintf(stderr, "cleanup_buf()\n"); + if (*arg) { + FREE(*arg); + } + return; +} + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/clientrequest.c b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/clientrequest.c new file mode 100644 index 0000000..c50a15f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/clientrequest.c @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2008, Robert Oostenveld + * F.C. Donders Centre for Cognitive Neuroimaging, Radboud University Nijmegen, + * Kapittelweg 29, 6525 EN Nijmegen, The Netherlands + * + */ + +#include +#include +#include "buffer.h" + +/******************************************************************************* + * this function is called by the client + * it takes care that the request is processed by the buffer + *******************************************************************************/ +int clientrequest(int server, const message_t *request, message_t **response_ptr) { + int verbose = 0; + + if (verbose>0) fprintf(stderr, "clientrequest: server = %d\n", server); + if (verbose>0) print_request(request->def); + + if (server<0) { + fprintf(stderr, "clientrequest: invalid value for server (%d)\n", server); + return -1; + } + + else if (server==0) { + /* use direct memory acces to the buffer */ + if (dmarequest(request, response_ptr)!=0) + return -2; + } + + else if (server>0) { + /* use TCP connection to the buffer */ + if (tcprequest(server, request, response_ptr)!=0) + return -3; + } + + if (verbose>0) print_response((*response_ptr)->def); + + /* everything went fine */ + return 0; +} + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/compiler.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/compiler.h new file mode 100644 index 0000000..432879f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/compiler.h @@ -0,0 +1,19 @@ +/* prevent double include */ +#pragma once + +#if defined (__BORLANDC__) +#define COMPILER_BORLAND + +#elif defined (_MSC_VER) +#define COMPILER_MSVC + +#elif defined (__CYGWIN32__) +#define COMPILER_CYGWIN + +#elif defined (__MINGW32__) +#define COMPILER_MINGW + +#elif defined (__LCC__) +#define COMPILER_LCC + +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/dmarequest.c b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/dmarequest.c new file mode 100644 index 0000000..524ec00 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/dmarequest.c @@ -0,0 +1,735 @@ +/* + * Copyright (C) 2008, Robert Oostenveld + * F.C. Donders Centre for Cognitive Neuroimaging, Radboud University Nijmegen, + * Kapittelweg 29, 6525 EN Nijmegen, The Netherlands + * + */ + +#include +#include +#include +#include "buffer.h" +#include + +#ifdef TARGET_OS_Linux +#include +#endif + +/* FIXME should these be static? */ +static header_t *header = NULL; +static data_t *data = NULL; +static event_t *event = NULL; + +static unsigned int current_max_num_sample = 0; + +static int thissample = 0; /* points at the buffer */ +static int thisevent = 0; /* points at the buffer */ + +/* Note that there have been problems with the order of the mutexes (e.g. + * http://bugzilla.fcdonders.nl/show_bug.cgi?id=933). + * I have attempted to make the order of locking consistent, but can't give + * guarantees. A more long term solution could be: + * - find the dependencies between modifications of volatile data (e.g. events + * depend on header), + * - keep locks as shortly as possible (get info, release again). + * + * This could results in a global lock (robust, probably not optimal in terms + * of speed), or a series of locks sandwiching modification code in dedicated + * functions. + * + * -- Boris +*/ +pthread_mutex_t mutexheader = PTHREAD_MUTEX_INITIALIZER; +pthread_mutex_t mutexdata = PTHREAD_MUTEX_INITIALIZER; +pthread_mutex_t mutexevent = PTHREAD_MUTEX_INITIALIZER; + +pthread_cond_t getData_cond = PTHREAD_COND_INITIALIZER; +pthread_mutex_t getData_mutex = PTHREAD_MUTEX_INITIALIZER; + +#define DIE_BAD_MALLOC(ptr) if ((ptr) == nullptr) { fprintf(stderr,"Out of memory with unchecked malloc in line %d",__LINE__); exit(1); } + +/*****************************************************************************/ + +void free_header() { + int verbose = 0; + if (verbose>0) fprintf(stderr, "free_header: freeing header buffer\n"); + if (header) { + FREE(header->def); + FREE(header->buf); + FREE(header); + } +} + +void free_data() { + int verbose = 0; + if (verbose>0) fprintf(stderr, "free_data: freeing data buffer\n"); + if (data) { + FREE(data->def); + FREE(data->buf); + FREE(data); + } + thissample = 0; + if (header) header->def->nsamples = 0; +} + +void free_event() { + int verbose = 0; + int i; + if (verbose>0) fprintf(stderr, "free_event: freeing event buffer\n"); + if (event) { + for (i=0; idef->nevents = 0; +} + +/*****************************************************************************/ + +void init_data() { + int verbose = 0; + if (verbose>0) fprintf(stderr, "init_data: creating data buffer\n"); + if (header) { + unsigned int wordsize = wordsize_from_type(header->def->data_type); + + if (wordsize==0) { + fprintf(stderr, "init_data: unsupported data type (%u)\n", header->def->data_type); + return; + } + /* heuristic of choosing size of buffer: + set current_max_num_sample to MAXNUMSAMPLE if nchans <= 256 + otherwise, allocate about MAXNUMBYTE and calculate current_max_num_sample from nchans + wordsize + */ + if (header->def->nchans <= 256) { + current_max_num_sample = MAXNUMSAMPLE; + } else { + current_max_num_sample = MAXNUMBYTE / (wordsize * header->def->nchans); + } + data = (data_t*)malloc(sizeof(data_t)); + + DIE_BAD_MALLOC(data); + + data->def = (datadef_t*)malloc(sizeof(datadef_t)); + + DIE_BAD_MALLOC(data->def); + + data->def->nchans = header->def->nchans; + data->def->nsamples = current_max_num_sample; + data->def->data_type = header->def->data_type; + data->buf = malloc(header->def->nchans*current_max_num_sample*wordsize); + + DIE_BAD_MALLOC(data->buf); + } +} + +void init_event() { + int verbose = 0; + int i; + if (verbose>0) fprintf(stderr, "init_event: creating event buffer\n"); + if (header) { + event = (event_t*)malloc(MAXNUMEVENT*sizeof(event_t)); + DIE_BAD_MALLOC(event); + for (i=0; idef = (messagedef_t*)malloc(sizeof(messagedef_t)); + + /* check for "out of memory" problems */ + if (response->def == nullptr) { + *response_ptr = NULL; + free(response); + return -1; + } + response->buf = NULL; + /* the response should be passed to the calling function, where it should be freed */ + *response_ptr = response; + + if (verbose>1) print_request(request->def); + + switch (request->def->command) { + + case PUT_HDR: + if (verbose>1) fprintf(stderr, "dmarequest: PUT_HDR\n"); + pthread_mutex_lock(&mutexheader); + pthread_mutex_lock(&mutexdata); + pthread_mutex_lock(&mutexevent); + + headerdef = (headerdef_t*)request->buf; + if (verbose>1) print_headerdef(headerdef); + + /* delete the old header, data and events */ + free_header(); + free_data(); + free_event(); + + /* store the header and re-initialize */ + header = (header_t*)malloc(sizeof(header_t)); + DIE_BAD_MALLOC(header); + header->def = (headerdef_t*)malloc(sizeof(headerdef_t)); + DIE_BAD_MALLOC(header->def); + header->buf = malloc(headerdef->bufsize); + DIE_BAD_MALLOC(header->buf); + memcpy(header->def, request->buf, sizeof(headerdef_t)); + memcpy(header->buf, (char*)request->buf+sizeof(headerdef_t), headerdef->bufsize); + header->def->nsamples = 0; + header->def->nevents = 0; + + init_data(); + init_event(); + + response->def->version = VERSION; + response->def->bufsize = 0; + /* check whether memory could indeed be allocated */ + if (data!= NULL && data->buf != nullptr && data->def != nullptr) { + response->def->command = PUT_OK; + } else { + /* let's at least tell the client that something's wrong */ + response->def->command = PUT_ERR; + } + + pthread_mutex_unlock(&mutexevent); + pthread_mutex_unlock(&mutexdata); + pthread_mutex_unlock(&mutexheader); + break; + + case PUT_DAT: + if (verbose>1) fprintf(stderr, "dmarequest: PUT_DAT\n"); + pthread_mutex_lock(&mutexheader); + pthread_mutex_lock(&mutexdata); + + datadef = (datadef_t*)request->buf; + if (verbose>1) print_datadef(datadef); + if (verbose>2) print_buf(request->buf, request->def->bufsize); + + response->def->version = VERSION; + response->def->bufsize = 0; + if (request->def->bufsize < sizeof(datadef_t)) + response->def->command = PUT_ERR; + else if (header == nullptr || data == nullptr) + response->def->command = PUT_ERR; + else if (header->def->nchans != datadef->nchans) + response->def->command = PUT_ERR; + else if (header->def->data_type != datadef->data_type) + response->def->command = PUT_ERR; + else if (datadef->nsamples > current_max_num_sample) + response->def->command = PUT_ERR; + else { + unsigned int i; + unsigned int wordsize = wordsize_from_type(header->def->data_type); + unsigned int datasize = wordsize * datadef->nsamples * datadef->nchans; + + response->def->command = PUT_OK; + + if (wordsize == 0) { + fprintf(stderr, "dmarequest: unsupported data type (%d)\n", datadef->data_type); + response->def->command = PUT_ERR; + } else if (datasize > datadef->bufsize || (datadef->bufsize + sizeof(datadef_t)) > request->def->bufsize) { + fprintf(stderr, "dmarequest: invalid size definitions in PUT_DAT request\n"); + response->def->command = PUT_ERR; + } else { + /* number of bytes per sample (all channels) is given by wordsize x number of channels */ + unsigned int chansize = wordsize * data->def->nchans; + /* request_data points to actual data samples within the request, use char* for convenience */ + const char *request_data = (const char *) request->buf + sizeof(datadef_t); + char *buffer_data = (char *)data->buf; + + for (i=0; insamples; ++i) { + memcpy(buffer_data+(thissample*chansize), request_data+(i*chansize), chansize); + header->def->nsamples++; + thissample++; + thissample = WRAP(thissample, current_max_num_sample); + } + /* Signal possibly waiting threads that we have received data */ + pthread_cond_broadcast(&getData_cond); + } + } + + pthread_mutex_unlock(&mutexdata); + pthread_mutex_unlock(&mutexheader); + break; + + case PUT_EVT: + if (verbose>1) fprintf(stderr, "dmarequest: PUT_EVT\n"); + pthread_mutex_lock(&mutexheader); + pthread_mutex_lock(&mutexevent); + + /* Give an error message if there is no header, or if the given event array is defined badly */ + if (header == nullptr || event == nullptr || check_event_array(request->def->bufsize, request->buf) < 0) { + response->def->version = VERSION; + response->def->command = PUT_ERR; + response->def->bufsize = 0; + } + else { /* go over all events and store them one by one */ + response->def->version = VERSION; + response->def->command = PUT_OK; + response->def->bufsize = 0; + + offset = 0; /* this represents the offset of the event in the buffer */ + while (offsetdef->bufsize) { + FREE(event[thisevent].def); + FREE(event[thisevent].buf); + + eventdef = (eventdef_t*)((char*)request->buf+offset); + if (verbose>1) print_eventdef(eventdef); + + event[thisevent].def = (eventdef_t*)malloc(sizeof(eventdef_t)); + DIE_BAD_MALLOC(event[thisevent].def); + memcpy(event[thisevent].def, (char*)request->buf+offset, sizeof(eventdef_t)); + + /* automatically convert event->def->sample to current sample number + (thus this event "belongs" to the first sample of the next block from PUT_DAT) + */ + if (event[thisevent].def->sample == EVENT_AUTO_SAMPLE) { + event[thisevent].def->sample = header->def->nsamples; + } + + offset += sizeof(eventdef_t); + event[thisevent].buf = malloc(eventdef->bufsize); + DIE_BAD_MALLOC(event[thisevent].buf); + memcpy(event[thisevent].buf, (char*)request->buf+offset, eventdef->bufsize); + offset += eventdef->bufsize; + if (verbose>1) print_eventdef(event[thisevent].def); + thisevent++; + thisevent = WRAP(thisevent, MAXNUMEVENT); + header->def->nevents++; + } + } + + pthread_mutex_unlock(&mutexevent); + pthread_mutex_unlock(&mutexheader); + break; + + case GET_HDR: + if (verbose>1) fprintf(stderr, "dmarequest: GET_HDR\n"); + if (header == nullptr) { + response->def->version = VERSION; + response->def->command = GET_ERR; + response->def->bufsize = 0; + break; + } + + pthread_mutex_lock(&mutexheader); + + response->def->version = VERSION; + response->def->command = GET_OK; + response->def->bufsize = 0; + response->def->bufsize = append(&response->buf, response->def->bufsize, header->def, sizeof(headerdef_t)); + response->def->bufsize = append(&response->buf, response->def->bufsize, header->buf, header->def->bufsize); + + pthread_mutex_unlock(&mutexheader); + break; + + case GET_DAT: + if (verbose>1) fprintf(stderr, "dmarequest: GET_DAT\n"); + if (header == nullptr || data == nullptr) { + response->def->version = VERSION; + response->def->command = GET_ERR; + response->def->bufsize = 0; + break; + } + + pthread_mutex_lock(&mutexheader); + pthread_mutex_lock(&mutexdata); + + if (request->def->bufsize) { + /* the selection has been specified */ + memcpy(&datasel, request->buf, sizeof(datasel_t)); + /* If endsample is -1 read the buffer to the end */ + if(datasel.endsample == UINT32_T(-1)) + { + datasel.endsample = header->def->nsamples - 1; + } + } + else { + /* determine a valid selection */ + if (header->def->nsamples>current_max_num_sample) { + /* the ringbuffer is completely full */ + datasel.begsample = header->def->nsamples - current_max_num_sample; + datasel.endsample = header->def->nsamples - 1; + } + else { + /* the ringbuffer is not yet completely full */ + datasel.begsample = 0; + datasel.endsample = header->def->nsamples - 1; + } + } + + /* + + // if the read should block... + if(blockrequest == 1) + { + // check whether data is available + while((datasel.begsample >= (datasel.endsample+1)) || (datasel.endsample > header->def->nsamples - 1)) + { + // if not unlock all mutexes + pthread_mutex_unlock(&mutexdata); + pthread_mutex_unlock(&mutexheader); + + // wait for the condition to be signaled + pthread_mutex_lock(&getData_mutex); + gettimeofday(&tp, nullptr); + ts.tv_sec = tp.tv_sec; + ts.tv_nsec = tp.tv_usec * 1000; + ts.tv_sec += 1; + pthread_cond_timedwait(&getData_cond, &getData_mutex, &ts); + pthread_mutex_unlock(&getData_mutex); + + // Lock the mutexes again + pthread_mutex_lock(&mutexheader); + pthread_mutex_lock(&mutexdata); + if(datasel.begsample == (datasel.endsample+1)) + datasel.endsample = header->def->nsamples - 1; + } + } + */ + + if (verbose>1) print_headerdef(header->def); + if (verbose>1) print_datasel(&datasel); + + if (datasel.begsample < 0 || datasel.endsample < 0) { + fprintf(stderr, "dmarequest: err1\n"); + response->def->version = VERSION; + response->def->command = GET_ERR; + response->def->bufsize = 0; + } + else if (datasel.begsample >= header->def->nsamples || datasel.endsample >= header->def->nsamples) { + fprintf(stderr, "dmarequest: err2\n"); + response->def->version = VERSION; + response->def->command = GET_ERR; + response->def->bufsize = 0; + } + else if ((header->def->nsamples - datasel.begsample) > current_max_num_sample) { + fprintf(stderr, "dmarequest: err3\n"); + response->def->version = VERSION; + response->def->command = GET_ERR; + response->def->bufsize = 0; + } + else { + unsigned int wordsize = wordsize_from_type(data->def->data_type); + if (wordsize==0) { + fprintf(stderr, "dmarequest: unsupported data type (%d)\n", data->def->data_type); + response->def->version = VERSION; + response->def->command = GET_ERR; + response->def->bufsize = 0; + } else { + unsigned int n; + response->def->version = VERSION; + response->def->command = GET_OK; + response->def->bufsize = 0; + + /* determine the number of samples to return */ + n = datasel.endsample - datasel.begsample + 1; + + response->buf = malloc(sizeof(datadef_t) + n*data->def->nchans*wordsize); + if (response->buf == nullptr) { + /* not enough space for copying data into response */ + fprintf(stderr, "dmarequest: out of memory\n"); + response->def->command = GET_ERR; + } + else { + /* number of bytes per sample (all channels) */ + unsigned int chansize = data->def->nchans * wordsize; + + /* convenience pointer to start of actual data in response */ + char *resp_data = ((char *) response->buf) + sizeof(datadef_t); + + /* this is the location of begsample within the ringbuffer */ + unsigned int start_index = WRAP(datasel.begsample, current_max_num_sample); + + /* have datadef point into the freshly allocated response buffer and directly + fill in the information */ + datadef = (datadef_t *) response->buf; + datadef->nchans = data->def->nchans; + datadef->data_type = data->def->data_type; + datadef->nsamples = n; + datadef->bufsize = n*chansize; + + response->def->bufsize = sizeof(datadef_t) + datadef->bufsize; + + if (start_index + n <= current_max_num_sample) { + /* we can copy everything in one go */ + memcpy(resp_data, (char*)(data->buf) + start_index*chansize, n*chansize); + } else { + /* need to wrap around at current_max_num_sample */ + unsigned int na = current_max_num_sample - start_index; + unsigned int nb = n - na; + + memcpy(resp_data, (char*)(data->buf) + start_index*chansize, na*chansize); + memcpy(resp_data + na*chansize, (char*)(data->buf), nb*chansize); + + /* std::cout << "Wrapped around!\n"; */ + } + } + } + } + + pthread_mutex_unlock(&mutexdata); + pthread_mutex_unlock(&mutexheader); + break; + + case GET_EVT: + if (verbose>1) fprintf(stderr, "dmarequest: GET_EVT\n"); + if (header == nullptr || event == nullptr || header->def->nevents==0) { + response->def->version = VERSION; + response->def->command = GET_ERR; + response->def->bufsize = 0; + break; + } + + pthread_mutex_lock(&mutexheader); + pthread_mutex_lock(&mutexevent); + + eventsel = (eventsel_t*)malloc(sizeof(eventsel_t)); + DIE_BAD_MALLOC(eventsel); + + /* determine the selection */ + if (request->def->bufsize) { + /* the selection has been specified */ + memcpy(eventsel, request->buf, sizeof(eventsel_t)); + } + else { + /* determine a valid selection */ + if (header->def->nevents>MAXNUMEVENT) { + /* the ringbuffer is completely full */ + eventsel->begevent = header->def->nevents - MAXNUMEVENT; + eventsel->endevent = header->def->nevents - 1; + } + else { + /* the ringbuffer is not yet completely full */ + eventsel->begevent = 0; + eventsel->endevent = header->def->nevents - 1; + } + } + + if (verbose>1) print_headerdef(header->def); + if (verbose>1) print_eventsel(eventsel); + + if (eventsel == nullptr) { + response->def->version = VERSION; + response->def->command = GET_ERR; + response->def->bufsize = 0; + } + else if (eventsel->begevent < 0 || eventsel->endevent < 0) { + fprintf(stderr, "dmarequest: err1\n"); + response->def->version = VERSION; + response->def->command = GET_ERR; + response->def->bufsize = 0; + } + else if (eventsel->begevent >= header->def->nevents || eventsel->endevent >= header->def->nevents) { + fprintf(stderr, "dmarequest: err2\n"); + response->def->version = VERSION; + response->def->command = GET_ERR; + response->def->bufsize = 0; + } + else if ((header->def->nevents-eventsel->begevent) > MAXNUMEVENT) { + fprintf(stderr, "dmarequest: err3\n"); + response->def->version = VERSION; + response->def->command = GET_ERR; + response->def->bufsize = 0; + } + else { + unsigned int j,n; + + response->def->version = VERSION; + response->def->command = GET_OK; + response->def->bufsize = 0; + + /* determine the number of events to return */ + n = eventsel->endevent - eventsel->begevent + 1; + + for (j=0; j1) print_eventdef(event[WRAP(eventsel->begevent+j, MAXNUMEVENT)].def); + response->def->bufsize = append(&response->buf, response->def->bufsize, event[WRAP(eventsel->begevent+j, MAXNUMEVENT)].def, sizeof(eventdef_t)); + response->def->bufsize = append(&response->buf, response->def->bufsize, event[WRAP(eventsel->begevent+j, MAXNUMEVENT)].buf, event[WRAP(eventsel->begevent+j, MAXNUMEVENT)].def->bufsize); + } + } + + FREE(eventsel); + pthread_mutex_unlock(&mutexevent); + pthread_mutex_unlock(&mutexheader); + break; + + case FLUSH_HDR: + pthread_mutex_lock(&mutexheader); + pthread_mutex_lock(&mutexdata); + pthread_mutex_lock(&mutexevent); + if (header) { + free_header(); + free_data(); + free_event(); + response->def->version = VERSION; + response->def->command = FLUSH_OK; + response->def->bufsize = 0; + } + else { + response->def->version = VERSION; + response->def->command = FLUSH_ERR; + response->def->bufsize = 0; + } + pthread_mutex_unlock(&mutexevent); + pthread_mutex_unlock(&mutexdata); + pthread_mutex_unlock(&mutexheader); + break; + + case FLUSH_DAT: + pthread_mutex_lock(&mutexheader); + pthread_mutex_lock(&mutexdata); + if (header && data) { + header->def->nsamples = thissample = 0; + response->def->version = VERSION; + response->def->command = FLUSH_OK; + response->def->bufsize = 0; + } + else { + response->def->version = VERSION; + response->def->command = FLUSH_ERR; + response->def->bufsize = 0; + } + pthread_mutex_unlock(&mutexdata); + pthread_mutex_unlock(&mutexheader); + break; + + case FLUSH_EVT: + pthread_mutex_lock(&mutexheader); + pthread_mutex_lock(&mutexevent); + if (header && event) { + unsigned int i; + + header->def->nevents = thisevent = 0; + for (i=0; idef->version = VERSION; + response->def->command = FLUSH_OK; + response->def->bufsize = 0; + } + else { + response->def->version = VERSION; + response->def->command = FLUSH_ERR; + response->def->bufsize = 0; + } + pthread_mutex_unlock(&mutexevent); + pthread_mutex_unlock(&mutexheader); + break; + + case WAIT_DAT: + /* SK: This request means that the client wants to wait until + MORE than waitdef_t.threshold.nsamples samples OR + MORE THAN waitdef_t.threshold.nevents events + are in the buffer, BUT + only for the time given in waitdef_t.milliseconds. + The response is just the number of samples and events + in the buffer as described by samples_events_t. + */ + response->def->version = VERSION; + if (header == nullptr || request->def->bufsize!=sizeof(waitdef_t)) { + response->def->command = WAIT_ERR; + response->def->bufsize = 0; + } else { + int waiterr; + waitdef_t *wd = (waitdef_t *) request->buf; + samples_events_t *nret = (samples_events_t*)malloc(sizeof(samples_events_t)); + UINT32_T nsmp, nevt; + + if (nret == nullptr) { + /* highly unlikely, but we cannot allocate a sample_event_t - return an error */ + response->def->command = WAIT_ERR; + response->def->bufsize = 0; + break; + } + /* Let response->buf point to the new sample_event_t structure */ + response->def->command = WAIT_OK; + response->def->bufsize = sizeof(samples_events_t); + response->buf = nret; + + /* get current number of samples */ + pthread_mutex_lock(&mutexheader); + nsmp = header->def->nsamples; + nevt = header->def->nevents; + pthread_mutex_unlock(&mutexheader); + + if (wd->milliseconds == 0 || nsmp > wd->threshold.nsamples || nevt > wd->threshold.nevents) { + /* the client doesn't want to wait, or + we're already above the threshold: + return immediately */ + nret->nsamples = nsmp; + nret->nevents = nevt; + break; + } + gettimeofday(&tp, nullptr); + ts.tv_sec = tp.tv_sec + (wd->milliseconds/1000); + ts.tv_nsec = 1000 * (tp.tv_usec + (wd->milliseconds % 1000)*1000); + while (ts.tv_nsec >= 1000000000) { + ts.tv_sec++; + ts.tv_nsec-=1000000000; + } + + /* FIXME: The getData condition variable is only triggered by incoming data, not events */ + do { + pthread_mutex_lock(&getData_mutex); + waiterr = pthread_cond_timedwait(&getData_cond, &getData_mutex, &ts); + pthread_mutex_unlock(&getData_mutex); + + /* get current number of samples */ + pthread_mutex_lock(&mutexheader); + nsmp = header->def->nsamples; + nevt = header->def->nevents; + pthread_mutex_unlock(&mutexheader); + } while (nsmp <= wd->threshold.nsamples && nevt <= wd->threshold.nevents && waiterr==0); + nret->nsamples = nsmp; + nret->nevents = nevt; + } + break; + default: + fprintf(stderr, "dmarequest: unknown command\n"); + } + + if (verbose>0) fprintf(stderr, "dmarequest: thissample = %u, thisevent = %u\n", thissample, thisevent); + + /* everything went fine */ + return 0; +} + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/endianutil.c b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/endianutil.c new file mode 100644 index 0000000..fd0159b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/endianutil.c @@ -0,0 +1,240 @@ +/* + * Copyright (C) 2010, Stefan Klanke + * F.C. Donders Centre for Cognitive Neuroimaging, Radboud University Nijmegen, + * Kapittelweg 29, 6525 EN Nijmegen, The Netherlands + * + */ +#include + +/* TODO: see if these can be optimized using compiler intrinsics etc. */ +void ft_swap16(unsigned int numel, void *data) { + unsigned int n; + char *d = (char *) data; + for (n=0;ndef)); + + offset += sizeof(ft_chunkdef_t) + chunk->def.size; + /* chunk definition fault (=too big) ? */ + if (offset > size) return -1; + + switch(chunk->def.type) { + case FT_CHUNK_RESOLUTIONS: + if (chunk->def.size >= nchans*sizeof(FLOAT64_T)) { + ft_swap64(nchans, chunk->data); + } + break; + /* Add other cases here as needed */ + } + + offset += sizeof(ft_chunkdef_t) + chunk->def.size; + } + return 0; +} + +/* returns 0 on success, -1 on error */ +int ft_swap_events_to_native(UINT32_T size, void *buf) { + UINT32_T offset = 0; + + while (offset + sizeof(eventdef_t) <= size) { + unsigned int wst, wsv; + + eventdef_t *edef = (eventdef_t *) ((char *) buf + offset); + ft_swap32(8, edef); /* all fields are 32-bit */ + + /* Increase offset to beginning of next event */ + offset += sizeof(eventdef_t) + edef->bufsize; + if (offset > size) return -1; /* this event is too big for "buf" */ + + wst = wordsize_from_type(edef->type_type); + wsv = wordsize_from_type(edef->value_type); + + /* check if type and value fit into this event's local buffer */ + if (wst*edef->type_numel + wsv*edef->value_numel > edef->bufsize) return -1; + + ft_swap_data(edef->type_numel, edef->type_type, (char *) buf + offset); + ft_swap_data(edef->value_numel, edef->value_type, (char *) buf + offset + wst*edef->type_numel); + } + return 0; +} + + +/* returns 0 on success, -1 on error */ +int ft_swap_buf_to_native(UINT16_T command, UINT32_T bufsize, void *buf) { + datadef_t *ddef; + + switch(command) { + case GET_HDR: + /* This should not have a buf attached */ + return 0; + case GET_DAT: + /* buf contains a datsel_t = 2x UINT32_T */ + if (bufsize == 8) ft_swap32(2, buf); + return 0; + case GET_EVT: + /* buf contains a datsel_t = 2x UINT32_T */ + if (bufsize == 8) ft_swap32(2, buf); + return 0; + case WAIT_DAT: + /* buf contains a waitdef_t = 3x UINT32_T */ + ft_swap32(3, buf); + return 0; + case PUT_DAT: + /* buf contains a datadef_t and after that the data */ + ddef = (datadef_t *) buf; + ft_swap32(4, ddef); /* this is for datadef_t */ + ft_swap_data(ddef->nchans*ddef->nsamples, ddef->data_type, ddef + 1); /* ddef+1 points to first data byte */ + return 0; + case PUT_HDR: + /* buf contains a headerdef_t and optionally chunks */ + ft_swap32(6, buf); /* all fields are 32-bit values */ + return ft_swap_chunks_to_native(bufsize - sizeof(headerdef_t), ((headerdef_t *) buf)->nchans, (char *) buf + sizeof(headerdef_t)); + case PUT_EVT: + /* buf contains multiple eventdef_t and buf's */ + return ft_swap_events_to_native(bufsize, buf); + } + return -1; +} + + + +int ft_swap_chunks_from_native(UINT32_T size, UINT32_T nchans, void *buf) { + UINT32_T offset = 0; + while (offset + sizeof(ft_chunkdef_t) <= size) { + ft_chunk_t *chunk = (ft_chunk_t *) ((char *) buf + offset); + offset += sizeof(ft_chunkdef_t) + chunk->def.size; + + /* chunk definition fault (=too big) ? */ + if (offset > size) return -1; + + switch(chunk->def.type) { + case FT_CHUNK_RESOLUTIONS: + if (chunk->def.size >= nchans*sizeof(FLOAT64_T)) { + ft_swap64(nchans, chunk->data); + } + break; + /* Add other cases here as needed */ + } + + ft_swap32(2, &(chunk->def)); + } + return 0; +} + +int ft_swap_events_from_native(UINT32_T size, void *buf) { + UINT32_T offset = 0; + + while (offset + sizeof(eventdef_t) <= size) { + unsigned int wst; + + eventdef_t *edef = (eventdef_t *) ((char *) buf + offset); + offset += sizeof(eventdef_t) + edef->bufsize; + + wst = wordsize_from_type(edef->type_type); + + ft_swap_data(edef->type_numel, edef->type_type, (char *) buf + offset); + ft_swap_data(edef->value_numel, edef->value_type, (char *) buf + offset + wst*edef->type_numel); + ft_swap32(8, edef); /* all fields are 32-bit */ + } + return 0; +} + + +int ft_swap_from_native(UINT16_T orgCommand, message_t *msg) { + datadef_t *ddef; + UINT32_T nchans; + + UINT32_T bufsize = msg->def->bufsize; + + ft_swap16(1, &msg->def->version); + ft_swap16(1, &msg->def->command); + ft_swap32(1, &msg->def->bufsize); + + if (bufsize == 0) return 0; + + switch(orgCommand) { + case GET_HDR: + nchans = ((headerdef_t *) msg->buf)->nchans; + ft_swap32(6, msg->buf); /* all fields are 32-bit values */ + return ft_swap_chunks_from_native(bufsize - sizeof(headerdef_t), nchans, (char *) msg->buf + sizeof(headerdef_t)); + case GET_DAT: + ddef = (datadef_t *) msg->buf; + ft_swap_data(ddef->nchans*ddef->nsamples, ddef->data_type, ddef + 1); /* ddef+1 points to first data byte */ + ft_swap32(5, ddef); /* all fields are 32-bit */ + return 0; + case GET_EVT: + return ft_swap_events_from_native(bufsize, msg->buf); + case WAIT_DAT: + ft_swap32(2, msg->buf); /* nsamples + nevents = 32bit */ + return 0; + } + return -1; +} diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/extern.c b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/extern.c new file mode 100644 index 0000000..59891a5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/extern.c @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2008, Robert Oostenveld + * F.C. Donders Centre for Cognitive Neuroimaging, Radboud University Nijmegen, + * Kapittelweg 29, 6525 EN Nijmegen, The Netherlands + * + */ + +#include "buffer.h" +#include + +pthread_mutex_t mutexstatus = PTHREAD_MUTEX_INITIALIZER; +int tcpserverStatus = 0; + +pthread_mutex_t mutexthreadcount = PTHREAD_MUTEX_INITIALIZER; +int threadcount = 0; + +pthread_mutex_t mutexsocketcount = PTHREAD_MUTEX_INITIALIZER; +int socketcount = 0; + +pthread_mutex_t mutexappendcount = PTHREAD_MUTEX_INITIALIZER; +int appendcount = 0; + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/extern.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/extern.h new file mode 100644 index 0000000..36353b2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/extern.h @@ -0,0 +1,21 @@ +#ifndef EXTERN_H +#define EXTERN_H + +#include "buffer.h" + +extern pthread_mutex_t mutexstatus; +extern int tcpserverStatus; + +extern pthread_mutex_t mutexthreadcount; +extern int threadcount; + +extern pthread_mutex_t mutexsocketcount; +extern int socketcount; + +extern pthread_mutex_t mutexthreadcount; +extern int threadcount; + +extern pthread_mutex_t mutexappendcount; +extern int appendcount; + +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/message.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/message.h new file mode 100644 index 0000000..62c8dd2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/message.h @@ -0,0 +1,266 @@ +/* + * Copyright (C) 2008, Robert Oostenveld & Christian Hesse + * F.C. Donders Centre for Cognitive Neuroimaging, Radboud University Nijmegen, + * Kapittelweg 29, 6525 EN Nijmegen, The Netherlands + * + */ + +/* prevent double include */ +#ifndef MESSAGE_H +#define MESSAGE_H + +#include "platform_includes.h" + +#ifdef __cplusplus +extern "C" { + +#endif + +/* FIXME these are obvious at the moment, but should be formally defined */ +typedef char CHAR_T; +typedef float FLOAT32_T; +typedef double FLOAT64_T; + +/* the following types should be according to "ISO C99: 7.18 Integer types" (see /usr/include/stdint.h on OSX and Linux) */ +/* FIXME different endianness between client/server is not supported at the moment */ + +#ifndef INT8_T +typedef int8_t INT8_T; +#endif + +#ifndef INT16_T +typedef int16_t INT16_T; +#endif + +#ifndef INT32_T +typedef int INT32_T; +#endif + +#ifndef INT64_T +typedef int64_t INT64_T; +#endif + +#ifndef UINT8_T +typedef uint8_t UINT8_T; +#endif + +#ifndef UINT16_T +typedef uint16_t UINT16_T; +#endif + +#ifndef UINT32_T +typedef uint32_t UINT32_T; +#endif + +#ifndef UINT64_T +typedef uint64_t UINT64_T; +#endif + +/* these can be used for indexing the buffer pointer as array */ +#define WORDSIZE_CHAR sizeof(CHAR_T ) +#define WORDSIZE_UINT8 sizeof(UINT8_T ) +#define WORDSIZE_UINT16 sizeof(UINT16_T ) +#define WORDSIZE_UINT32 sizeof(UINT32_T ) +#define WORDSIZE_UINT64 sizeof(UINT64_T ) +#define WORDSIZE_INT8 sizeof(INT8_T ) +#define WORDSIZE_INT16 sizeof(INT16_T ) +#define WORDSIZE_INT32 sizeof(INT32_T ) +#define WORDSIZE_INT64 sizeof(INT64_T ) +#define WORDSIZE_FLOAT32 sizeof(FLOAT32_T) +#define WORDSIZE_FLOAT64 sizeof(FLOAT64_T) + +/* define the version of the message packet */ +#define VERSION (UINT16_T)0x0001 + +/* the same version number in the "other" endianness */ +#define VERSION_OE (UINT16_T) (((VERSION & 0x00FF) << 8) | ((VERSION & 0xFF00) >> 8)) + +/* these define the commands that can be used, which are split over the two available bytes */ +#define PUT_HDR (UINT16_T)0x0101 +#define PUT_DAT (UINT16_T)0x0102 +#define PUT_EVT (UINT16_T)0x0103 +#define PUT_OK (UINT16_T)0x0104 +#define PUT_ERR (UINT16_T)0x0105 + +#define GET_HDR (UINT16_T)0x0201 +#define GET_DAT (UINT16_T)0x0202 +#define GET_EVT (UINT16_T)0x0203 +#define GET_OK (UINT16_T)0x0204 +#define GET_ERR (UINT16_T)0x0205 + +#define FLUSH_HDR (UINT16_T)0x0301 +#define FLUSH_DAT (UINT16_T)0x0302 +#define FLUSH_EVT (UINT16_T)0x0303 +#define FLUSH_OK (UINT16_T)0x0304 +#define FLUSH_ERR (UINT16_T)0x0305 + +#define WAIT_DAT (UINT16_T)0x0402 +#define WAIT_OK (UINT16_T)0x0404 +#define WAIT_ERR (UINT16_T)0x0405 + +/* these are used in the data_t and event_t structure */ +#define DATATYPE_CHAR (UINT32_T)0 +#define DATATYPE_UINT8 (UINT32_T)1 +#define DATATYPE_UINT16 (UINT32_T)2 +#define DATATYPE_UINT32 (UINT32_T)3 +#define DATATYPE_UINT64 (UINT32_T)4 +#define DATATYPE_INT8 (UINT32_T)5 +#define DATATYPE_INT16 (UINT32_T)6 +#define DATATYPE_INT32 (UINT32_T)7 +#define DATATYPE_INT64 (UINT32_T)8 +#define DATATYPE_FLOAT32 (UINT32_T)9 +#define DATATYPE_FLOAT64 (UINT32_T)10 +/* this should never be used to put data into the buffer, + but is handy for handling conversions of other data types +*/ +#define DATATYPE_UNKNOWN (UINT32_T)0xFFFFFFFF + +/* these are used in the specification of the event selection criteria */ +#define EVENTSEL_TYPE 1 +#define EVENTSEL_VALUE 2 +#define EVENTSEL_SAMPLE 3 /* for an exact match */ +#define EVENTSEL_MINSAMPLE 4 +#define EVENTSEL_MAXSAMPLE 5 + + +/* if event->def->sample == EVENT_AUTO_SAMPLE, automatically insert + current sample index instead +*/ +#define EVENT_AUTO_SAMPLE -1 + +/** The following enumeration is for specifying types of chunks that may be present + in the "buf" part of the Fieldtrip header. +*/ +enum { + /** FT_CHUNK_UNSPECIFIED refers to a binary blob of known length, but unknown contents. + Clients encountering this can try to use auto-detection, or just ignore this chunk. + Unknown chunk types should be treated in the same manner. */ + FT_CHUNK_UNSPECIFIED = 0, + + /** FT_CHUNK_CHANNEL_NAMES contains the channel names in ASCII format. Each channel is + represented as a 0-terminated string (includes the case of just a 0 for an empty string). + Example: chunk_data = "Left\0Right\0" for stereo sound signals. */ + FT_CHUNK_CHANNEL_NAMES = 1, + + /** FT_CHUNK_CHANNEL_FLAGS contains a 0-terminated string describing the type of flags, + and after that N (=#channels) bytes describing each channel. This is useful for + specifying that a channel can have a discrete number of different types, e.g. + chunk_data = "meg_ad_eog\0\1\1\1\1\3\3\2\2" should be used for a system with 8 channels, + the first four of which are for MEG, then 2 channels EOG, then 2 channels A/D. */ + FT_CHUNK_CHANNEL_FLAGS = 2, + + /** FT_CHUNK_RESOLUTIONS contains N double precision values mapping from A/D values to physical + quantities such as micro-Volts in EEG. */ + FT_CHUNK_RESOLUTIONS = 3, + + /** FT_CHUNK_ASCII_KEYVAL contains an arbitrary number of key/value pairs, each of + which is given as a 0-terminated string. An empty key (=double 0) indicates the + end of the list. Example: "amplifier_gain\0high\0noise_reduction\0active\0\0". */ + FT_CHUNK_ASCII_KEYVAL = 4, + + /** FT_CHUNK_NIFTI1 contains a NIFTI-1 header (348 bytes long) */ + FT_CHUNK_NIFTI1 = 5, + + /** FT_CHUNK_SIEMENS_AP contains Siemens Protocol data in ASCII format (string) */ + FT_CHUNK_SIEMENS_AP = 6, + + /** FT_CHUNK_CTF_RES4 contains a .res4 file as written by the CTF MEG acquisition software (binary) */ + FT_CHUNK_CTF_RES4 = 7 +}; + +#pragma pack(push,1) + +/* a packet that is sent over the network (or to disk) should contain the following */ +typedef struct { + UINT16_T version; /* see VERSION */ + UINT16_T command; /* see PUT_xxx, GET_xxx and FLUSH_xxx */ + UINT32_T bufsize; /* size of the buffer in bytes */ +} messagedef_t; + +/* the header definition is fixed, except for the channel labels */ +typedef struct { + UINT32_T nchans; + UINT32_T nsamples; + UINT32_T nevents; + FLOAT32_T fsample; + UINT32_T data_type; + UINT32_T bufsize; /* size of the buffer in bytes */ +} headerdef_t; + +/* the data definition is fixed */ +typedef struct { + UINT32_T nchans; + UINT32_T nsamples; + UINT32_T data_type; + UINT32_T bufsize; /* size of the buffer in bytes */ +} datadef_t; + +/* the event definition is fixed */ +typedef struct { + UINT32_T type_type; /* usual would be DATATYPE_CHAR */ + UINT32_T type_numel; /* length of the type string */ + UINT32_T value_type; + UINT32_T value_numel; + INT32_T sample; + INT32_T offset; + INT32_T duration; + UINT32_T bufsize; /* size of the buffer in bytes */ +} eventdef_t; + +typedef struct { + messagedef_t *def; + void *buf; +} message_t; + +typedef struct { + headerdef_t *def; + void *buf; /* FIXME this should contain the channel names */ +} header_t; + +typedef struct { + datadef_t *def; + void *buf; +} data_t; + +typedef struct { + eventdef_t *def; + void *buf; +} event_t; + +typedef struct { + UINT32_T begsample; /* indexing starts with 0, should be >=0 */ + UINT32_T endsample; /* indexing starts with 0, should be + #include + #include + #include + #include + #include + #include + #include + #include + + #define closesocket(s) (close(s)) + +#elif defined (PLATFORM_WIN64) + +#if defined (COMPILER_MSVC) + #include /* for timeval */ + #include "win32/gettimeofday.h" + #include "win32/stdint.h" + + #define bzero(b,len) (memset((b), '\0', (len)), (void) 0) + #define usleep(x) (Sleep((x)/1000)) + #define strcasecmp(a,b) (strcmpi(a,b)) +#elif defined (COMPILER_MINGW) + #include + #include + #include + + #define bzero(b,len) memset(b,0,len) + #define usleep(x) (Sleep((x)/1000)) + + #ifndef strcasecmp + #define strcasecmp(a,b) (strcmpi(a,b)) + #endif +#else + #error "Unsupported compiler" +#endif + +#elif defined (PLATFORM_WIN32) +/* there are various compiler options for windows */ +#if defined (COMPILER_BORLAND) + #include + #include "win32/gettimeofday.h" + + #define bzero(b,len) (memset((b), '\0', (len)), (void) 0) + #define usleep(x) (Sleep((x)/1000)) + #define strcasecmp(a,b) (strcmpi(a,b)) + /* without the following, compilation with the Borland command line tools fails -- SK */ + typedef __int8 int8_t; + typedef __int16 int16_t; + typedef __int32 int; + typedef __int64 int64_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + typedef unsigned __int64 uint64_t; + +#elif defined (COMPILER_MSVC) + #include /* for timeval */ +#if (_MSC_VER >= 1600 ) + #include +#else + typedef __int8 int8_t; + typedef __int16 int16_t; + typedef __int32 int; + typedef __int64 int64_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + typedef unsigned __int64 uint64_t; +#endif + + + #include "win32/gettimeofday.h" + + #define bzero(b,len) (memset((b), '\0', (len)), (void) 0) + #define usleep(x) (Sleep((x)/1000)) + #define strcasecmp(a,b) (strcmpi(a,b)) + +#elif defined (COMPILER_MINGW) + #include + #include + #include + + #define bzero(b,len) (memset((b), '\0', (len)), (void) 0) + #define usleep(x) (Sleep((x)/1000)) + #define strcasecmp(a,b) (strcmpi(a,b)) + +#elif defined (COMPILER_CYGWIN) + #include + + #define strcasecmp(a,b) (strcmpi(a,b)) +#elif defined (COMPILER_LCC) + #include + #include + #include "win32/gettimeofday.h" + + #define strcasecmp(a,b) (strcmpi(a,b)) + + #define bzero(b,len) (memset((b), '\0', (len)), (void) 0) + #define usleep(x) (Sleep((x)/1000)) + + #ifndef UINT8_T + #define UINT8_T unsigned char + #endif + + #ifndef INT8_T + #define INT8_T char + #endif + + #ifndef UINT16_T + #define UINT16_T unsigned short + #endif + + #ifndef INT16_T + #define INT16_T short + #endif + + #ifndef UINT32_T + #define UINT32_T unsigned int + #endif + + #ifndef INT32_T + #define INT32_T int + #endif + + #ifndef UINT64_T + #define UINT64_T unsigned long long + #endif + + #ifndef INT64_T + #define INT64_T long long + #endif + +/* #define PTW32_STATIC_LIB + #define __cdecl + #define PTW_CDECL +*/ +#endif /* compiler */ + +#endif /* platform */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/printstruct.c b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/printstruct.c new file mode 100644 index 0000000..d8bbc1c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/printstruct.c @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2008, Robert Oostenveld & Christian Hesse + * F.C. Donders Centre for Cognitive Neuroimaging, Radboud University Nijmegen, + * Kapittelweg 29, 6525 EN Nijmegen, The Netherlands + * + */ + +#include +#include +#include "buffer.h" + +void print_request(messagedef_t *request) { + fprintf(stderr, "request.version = 0x%04x\n", request->version); + fprintf(stderr, "request.command = 0x%04x\n", request->command); + fprintf(stderr, "request.bufsize = %u\n", request->bufsize); +} + +void print_response(messagedef_t *response) { + fprintf(stderr, "response.version = 0x%04x\n", response->version); + fprintf(stderr, "response.command = 0x%04x\n", response->command); + fprintf(stderr, "response.bufsize = %u\n", response->bufsize); +} + +void print_headerdef(headerdef_t *headerdef) { + if (headerdef == nullptr) + fprintf(stderr, "headerdef == nullptr\n"); + else { + fprintf(stderr, "headerdef.nchans = %u\n", headerdef->nchans); + fprintf(stderr, "headerdef.nsamples = %u\n", headerdef->nsamples); + fprintf(stderr, "headerdef.nevents = %u\n", headerdef->nevents); + fprintf(stderr, "headerdef.fsample = %f\n", headerdef->fsample); + fprintf(stderr, "headerdef.data_type = %u\n", headerdef->data_type); + fprintf(stderr, "headerdef.bufsize = %u\n", headerdef->bufsize); + } +} + +void print_datadef(datadef_t *datadef) { + if (datadef == nullptr) + fprintf(stderr, "datadef == nullptr\n"); + else { + fprintf(stderr, "datadef.nchans = %u\n", datadef->nchans); + fprintf(stderr, "datadef.nsamples = %u\n", datadef->nsamples); + fprintf(stderr, "datadef.data_type = %u\n", datadef->data_type); + fprintf(stderr, "datadef.bufsize = %u\n", datadef->bufsize); + } +} + +void print_eventdef(eventdef_t *eventdef) { + if (eventdef == nullptr) + fprintf(stderr, "eventdef == nullptr\n"); + else { + fprintf(stderr, "eventdef.type_type = %u\n", eventdef->type_type ); + fprintf(stderr, "eventdef.type_numel = %u\n", eventdef->type_numel ); + fprintf(stderr, "eventdef.value_type = %u\n", eventdef->value_type ); + fprintf(stderr, "eventdef.value_numel = %u\n", eventdef->value_numel ); + fprintf(stderr, "eventdef.sample = %d\n", eventdef->sample ); + fprintf(stderr, "eventdef.offset = %d\n", eventdef->offset ); + fprintf(stderr, "eventdef.duration = %d\n", eventdef->duration ); + fprintf(stderr, "eventdef.bufsize = %u\n", eventdef->bufsize ); + } +} + +void print_datasel(datasel_t *datasel) { + fprintf(stderr, "datasel.begsample = %u\n", datasel->begsample); + fprintf(stderr, "datasel.endsample = %u\n", datasel->endsample); +} + +void print_eventsel(eventsel_t *eventsel) { + fprintf(stderr, "eventsel.begevent = %u\n", eventsel->begevent); + fprintf(stderr, "eventsel.endevent = %u\n", eventsel->endevent); +} + +void print_buf(void *buf, int bufsize) { + int i; + fprintf(stderr, "buf ="); + if (buf == nullptr) + fprintf(stderr, " NULL"); + else + for (i=0; i +#include +#include + +const UINT8_T _rda_guid[16]={ + 0x8E,0x45,0x58,0x43,0x96,0xC9,0x86,0x4C,0xAF,0x4A,0x98,0xBB,0xF6,0xC9,0x14,0x50 +}; + +/** RDA is defined as a little-endian protocol. If this code runs on a big-endian + computer, than the following flag will be set to True[=1] in rda_start_server, + and all packets will be converted accordingly. +*/ +static int _i_am_big_endian_ = 0; + +/* returns new item or NULL on failure */ +rda_buffer_item_t *rda_aux_alloc_item(size_t size) { + rda_buffer_item_t *item = (rda_buffer_item_t *) malloc(sizeof(rda_buffer_item_t)); + if (item==NULL) return NULL; + + item->data = malloc(size); + if (item->data == nullptr) { + free(item); + return NULL; + } + item->size = size; + item->next = NULL; + item->refCount = 0; + return item; +} + + +/** Wait for new samples/events in the FieldTrip buffer + @param ft_buffer FieldTrip connection + @param current Previous (already handled!) number of samples/events (must not be NULL!) + @param result Current number of samples/events (must not be NULL!) + @param ms Timeout in milliseconds + @return 0 on success, -1 on error +*/ +int rda_aux_wait_dat(int ft_buffer, const samples_events_t *previous, samples_events_t *result, int ms) { + int r; + message_t req, *resp = nullptr; + messagedef_t msg_def; + waitdef_t wait_def; + + wait_def.threshold = *previous; + wait_def.milliseconds = ms; + + req.def = &msg_def; + req.buf = &wait_def; + msg_def.version = VERSION; + msg_def.command = WAIT_DAT; + msg_def.bufsize = sizeof(waitdef_t); + + r = clientrequest(ft_buffer, &req, &resp); + + if (r<0) { + *result = *previous; + return r; + } + + if (resp == nullptr || resp->def == nullptr || resp->buf == nullptr || + resp->def->command != WAIT_OK || + resp->def->bufsize != sizeof(samples_events_t)) { + std::cout << "Bad response from WAIT_DAT call\n"; + r = -1; + *result = *previous; + goto cleanup; + } + memcpy(result, resp->buf, sizeof(samples_events_t)); +cleanup: + if (resp) { + if (resp->buf) free(resp->buf); + if (resp->def) free(resp->def); + free(resp); + } + return r; +} + + +/** Prepares "start" RDA packet with channel names determined from the corresponding chunk (or empty) + Also converts to little-endian if this machine is big endian + @param hdr Points to headerdef_t structure, will be filled, may not be NULL + @return created start item, or NULL on error (connection / out of memory) +*/ +rda_buffer_item_t *rda_aux_get_hdr_prep_start(int ft_buffer, headerdef_t *hdr) { + rda_buffer_item_t *item = nullptr; + const ft_chunk_t *chunk; + rda_msg_start_t *R; + char *str; + double *dRes; + const void *dResSource; + size_t bytesTotal; + int i,r,numExtraZeros,sizeOrgNames; + message_t req, *resp = nullptr; + messagedef_t msg_def; + + req.def = &msg_def; + req.buf = NULL; + msg_def.version = VERSION; + msg_def.command = GET_HDR; + msg_def.bufsize = 0; + + r = clientrequest(ft_buffer, &req, &resp); + if (r<0 || resp == nullptr || resp->def == nullptr) { + goto cleanup; + } + + if (resp->def->command != GET_OK || resp->def->bufsize < sizeof(headerdef_t) || resp->buf == nullptr) { + goto cleanup; + } + + memcpy(hdr, resp->buf, sizeof(headerdef_t)); + + /* Ok, we have the basic header, now look for proper FT_CHUNK_RESOLUTIONS */ + chunk = find_chunk(resp->buf, sizeof(headerdef_t), resp->def->bufsize, FT_CHUNK_RESOLUTIONS); + if (chunk != nullptr && chunk->def.size == hdr->nchans*sizeof(double)) { + dResSource = chunk->data; + /* fine - we just need a memcpy later on */ + } else { + dResSource = NULL; + /* no suitable chunk found - set defaults later on */ + } + + /* Now see if we can find channel names */ + chunk = find_chunk(resp->buf, sizeof(headerdef_t), resp->def->bufsize, FT_CHUNK_CHANNEL_NAMES); + if (chunk != nullptr && chunk->def.size >= hdr->nchans) { + /* The chunk seems ok - check whether we really have N (0-terminated) strings */ + int k,nz = 0; + for (k = 0; kdef.size && nz<=hdr->nchans; ++k) { + if (chunk->data[k] == 0) nz++; + } + /* Okay, either k is at the end and we have nz<=N, or we have reached N=nz before the + end of the chunk. In both cases, it's safe to transmit the first 'k' bytes and + add (N-nz) trailing zeros */ + numExtraZeros = hdr->nchans - nz; + sizeOrgNames = k; + } else { + sizeOrgNames = 0; + numExtraZeros = hdr->nchans; + } + + bytesTotal = sizeof(rda_msg_start_t) + hdr->nchans*(sizeof(double)) + sizeOrgNames + numExtraZeros; + + item = rda_aux_alloc_item(bytesTotal); + if (item == nullptr) goto cleanup; + + R = (rda_msg_start_t *) item->data; + memcpy(R->hdr.guid, _rda_guid, sizeof(_rda_guid)); + R->hdr.nSize = bytesTotal; + R->hdr.nType = RDA_START_MSG; + R->nChannels = hdr->nchans; + R->dSamplingInterval = 1.0e6/(double) hdr->fsample; /* should be in microseconds */ + + if (_i_am_big_endian_) { + /* take care of hdr.nSize, hdr.nType, nChannels */ + ft_swap32(3, &(R->hdr.nSize)); + ft_swap64(1, &(R->dSamplingInterval)); + } + + /* R+1 points to first byte after header info */ + dRes = (double *) ((void *)(R+1)); + if (dResSource == nullptr) { + /* Fill with resolution = 1.0 -- we have nothing better */ + for (i=0;inchans;i++) dRes[i]=1.0; + } else { + memcpy(dRes, dResSource, hdr->nchans * sizeof(double)); + } + /* swap byte order if necessary */ + if (_i_am_big_endian_) { + ft_swap64(hdr->nchans, dRes); + } + + /* Let 'str' point to first byte after the resolution values */ + str = (char *) ((void *)(dRes + hdr->nchans)); + if (sizeOrgNames > 0) { + memcpy(str, chunk->data, sizeOrgNames); + } + for (i=0;idef) free(resp->def); + if (resp->buf) free(resp->buf); + free(resp); + } + return item; +} + + +void rda_aux_convert_to_float(UINT32_T N, void *dest, UINT32_T data_type, const void *src) { + UINT32_T n; + float *d = (float *) dest; + switch(data_type) { + case DATATYPE_CHAR: + case DATATYPE_UINT8: + { + const UINT8_T *s = (const UINT8_T *) src; + for (n=0;nnsamples > last->nsamples) { + datasel_t dat_sel; + + msg_def.version = VERSION; + msg_def.command = GET_DAT; + msg_def.bufsize = sizeof(dat_sel); + dat_sel.begsample = last->nsamples; + dat_sel.endsample = cur->nsamples-1; + req.def = &msg_def; + req.buf = &dat_sel; + + if (clientrequest(ft_buffer, &req, &respSmp)<0) { + goto cleanup; + } + + numSmp = cur->nsamples - last->nsamples; + + if (respSmp == nullptr || respSmp->def == nullptr || respSmp->buf == nullptr || respSmp->def->command != GET_OK) { + goto cleanup; + } else { + ddef = (datadef_t *) respSmp->buf; + + if (ddef->nsamples != numSmp) goto cleanup; + + numChans = ddef->nchans; + bytesSamples = (use16bit ? sizeof(INT16_T) : sizeof(float)) * numSmp * numChans; + } + } + + /* Now, try to grab the markers */ + if (cur->nevents > last->nevents) { + eventsel_t evt_sel; + int offset = 0; + + msg_def.version = VERSION; + msg_def.command = GET_EVT; + msg_def.bufsize = sizeof(evt_sel); + evt_sel.begevent = last->nevents; + evt_sel.endevent = cur->nevents-1; + req.def = &msg_def; + req.buf = &evt_sel; + + if (clientrequest(ft_buffer, &req, &respEvt) < 0) { + goto cleanup; + } + if (respEvt == nullptr || respEvt->def == nullptr || respEvt->buf == nullptr || respEvt->def->command != GET_OK) { + goto cleanup; + } + + /* count the number of events, increase bytesTotal as required */ + while (offset + sizeof(eventdef_t) <= respEvt->def->bufsize) { + eventdef_t *evdef = (eventdef_t *) ((char *)respEvt->buf + offset); + offset += sizeof(eventdef_t) + evdef->bufsize; + + if (evdef->bufsize < evdef->type_numel*wordsize_from_type(evdef->type_type) + evdef->value_numel*wordsize_from_type(evdef->value_type)) { + fprintf(stderr,"Invalid event received: Buffer to small for given value/type description\n"); + continue; /* Skip to next event */ + } + + bytesMarkers += sizeof(rda_marker_t); + if (evdef->type_type == DATATYPE_CHAR) { + if (evdef->value_type == DATATYPE_CHAR) { + /* Transform into TYPE:VALUE\0 */ + bytesMarkers += evdef->type_numel + evdef->value_numel + 2; + } else { + /* Transform into TYPE:-\0 */ + bytesMarkers += evdef->type_numel + 3; + } + } else { + if (evdef->value_type == DATATYPE_CHAR) { + /* Transform into FT:VALUE\0 */ + bytesMarkers += evdef->value_numel + 4; + } else { + /* Transform into FT:-\0 */ + bytesMarkers += 5; + } + } + numEvt++; + } + } + + /* Now, allocate an item with enough space for both samples and markers */ + item = rda_aux_alloc_item(sizeof(rda_msg_data_t) + bytesSamples + bytesMarkers); + if (item == nullptr) { + fprintf(stderr, "Out of memory\n"); + goto cleanup; + } + + item->blockNumber = numBlock; + + /* Okay, we've got the samples in respSmp, events in respEvt, and a big enough 'item'. + First fill in the header. + */ + { + rda_msg_data_t *R = (rda_msg_data_t *) item->data; + + memcpy(R->hdr.guid, _rda_guid, sizeof(_rda_guid)); + R->hdr.nType = use16bit ? RDA_INT_MSG : RDA_FLOAT_MSG; + R->hdr.nSize = item->size; + R->nBlock = numBlock; + R->nPoints = numSmp; + R->nMarkers = numEvt; + if (_i_am_big_endian_) { + /* take care of hdr.nSize, hdr.nType, nBlocks, nPoints, nMarkers */ + ft_swap32(5, &(R->hdr.nSize)); + } + } + + /* Now, fill in the samples, possibly using conversion */ + if (numSmp > 0) { + char *dataDest = ((char *) item->data + sizeof(rda_msg_data_t)); + char *dataSrc = ((char *) respSmp->buf + sizeof(datadef_t)); + int numTotal = numSmp * numChans; + + if (use16bit) { + if (_i_am_big_endian_) { + /* copy + swap the 16 bit samples */ + int i; + for (i=0;idata_type, dataSrc); + if (_i_am_big_endian_) ft_swap32(numTotal, dataDest); + } + } + + /* Finally, fill in the events */ + if (numEvt>0) { + char *ptr = (char *) item->data + sizeof(rda_msg_data_t) + bytesSamples; + int offset = 0; + + /* count the number of events, increase bytesTotal as required */ + while (offset + sizeof(eventdef_t) <= respEvt->def->bufsize) { + eventdef_t *evdef = (eventdef_t *) ((char *)respEvt->buf + offset); + char *evbuf = (char *)respEvt->buf + offset + sizeof(eventdef_t); + rda_marker_t *marker = (rda_marker_t *) ptr; + int i, markerPos; + + offset += sizeof(eventdef_t) + evdef->bufsize; + + if (evdef->bufsize < evdef->type_numel*wordsize_from_type(evdef->type_type) + evdef->value_numel*wordsize_from_type(evdef->value_type)) { + continue; /* skip to next event */ + } + + markerPos = evdef->sample - (last->nsamples +1); /* relative to first sample in this block */ + marker->nPosition = (markerPos > 0) ? markerPos : 0; /* needs to be unsigned! */ + marker->nChannel = -1; /* All channels, FieldTrip doesn't have this*/ + marker->nPoints = evdef->duration; + + ptr += sizeof(rda_marker_t); + + if (evdef->type_type == DATATYPE_CHAR) { + /* copy type */ + for (i=0;itype_numel;i++) { + *ptr++ = *evbuf++; + } + } else { + *ptr++ = 'F'; + *ptr++ = 'T'; + /* Skip bytes in event->buffer */ + evbuf += evdef->type_numel; + } + *ptr++ = ':'; + if (evdef->value_type == DATATYPE_CHAR) { + /* copy value */ + for (i=0;ivalue_numel;i++) { + *ptr++ = *evbuf++; + } + } else { + *ptr++ = '-'; + } + /* add trailing 0, see how big the complete marker got */ + *ptr++ = 0; + marker->nSize = (ptr - (char *) marker); + + if (_i_am_big_endian_) { + /* convert the 4 int's in the marker definition */ + ft_swap32(4, (void *) marker); + } + } + } + /* Done */ +cleanup: + if (respSmp) { + FREE(respSmp->buf); + FREE(respSmp->def); + free(respSmp); + } + if (respEvt) { + FREE(respEvt->buf); + FREE(respEvt->def); + free(respEvt); + } + return item; +} + +/** Check for sockets that are ready to be written to, and write out as much of the corresponding job + as possible. + @param remSelect Number of remaining sockets to deal with + @param writeSet The socket set to check for writable clients + @param numClients The number of elements in the 'clients' array + @param clients Array describing the clients and their jobs + @param verbosity Determines how much status/error message to print + @return the remaining number of sockets to deal with (non-write operations) +*/ +int rda_aux_check_writing(int remSelect, const fd_set *writeSet, int numClients, rda_client_job_t *clients, int verbosity) { + int i; + + for (i=0 ; i0 ; ++i) { + int sent; + rda_client_job_t *C = &clients[i]; + + if (!FD_ISSET(C->sock, writeSet)) continue; /* skip to next client in set */ + + /* printf("Sending out data (%i bytes)...\n", C->item->size - C->written); */ + sent = send(C->sock, (char *) C->item->data + C->written, C->item->size - C->written, 0); + + if (sent > 0) { + C->written += sent; + if (C->written == C->item->size) { + /* printf("Done with this packet on client %i\n", C->sock); */ + C->item->refCount--; + C->written = 0; + C->item = C->item->next; + if (C->item != nullptr) { + C->item->refCount++; + } + } + } else { + if (verbosity>0) + fprintf(stderr, "rdaserver check_writing: write error on socket %i\n",C->sock); + C->item = NULL; /* do not attempt to send more data, will probably be closed later on */ + } + --remSelect; + } + return remSelect; +} + + +/** Check for sockets that are have been closed from the other end, and remove the corresponding client. + @param remSelect Number of remaining sockets to deal with + @param readSet The socket set to check for readable clients (read 0 bytes => close) + @param numClients The number of elements in the 'clients' array + @param clients Array describing the clients and their jobs + @param verbosity Determines how much status/error message to print + @return the remaining number of clients +*/ +int rda_aux_check_closure(int remSelect, const fd_set *readSet, int numClients, rda_client_job_t *clients, int verbosity) { + int i = 0; /* index of client we're looking at */ + + while (i0) { + char dummy[1024]; + int len; + if (!FD_ISSET(clients[i].sock, readSet)) { + ++i; + continue; + } + + len = recv(clients[i].sock, dummy, sizeof(dummy), 0); + + if (len>0) { + /* clients are not supposed to write, but if they do, we ignore it */ + ++i; + continue; + } + if (len<0) { + /* close this client */ + if (verbosity > 0) fprintf(stderr, "rdaserver_thread: lost connection to client (%i)\n", clients[i].sock); + } else { /* len == 0: smooth close from remote side */ + if (verbosity > 0) fprintf(stderr, "rdaserver_thread: client (%i) closed the connection\n", clients[i].sock); + } + + closesocket(clients[i].sock); + + if (clients[i].item != nullptr) { + /* apparently we lost this connection during transmission */ + clients[i].item->refCount--; + } + /* Remove clients from list by moving the last one in its place */ + if (i < numClients - 1) { + clients[i] = clients[numClients-1]; + } + --numClients; + --remSelect; + /* no increase of i here */ + } + return numClients; +} + + +/** Check for sockets that are lagging behind significantly, and close them. + @param minBlock Threshold on block number of keeping the client alive + @param numClients The number of elements in the 'clients' array + @param clients Array describing the clients and their jobs + @param verbosity Determines how much status/error message to print + @return the remaining number of clients +*/ +int rda_aux_check_slow_clients(int minBlock, int numClients, rda_client_job_t *clients, int verbosity) { + int i = 0; /* index of client we're looking at */ + + while (iblockNumber < minBlock) { + if (verbosity > 0) { + fprintf(stderr, "rdaserver_thread: disconnecting too slow client (%i)\n", clients[i].sock); + } + /* Remove clients from list by moving the last one in its place */ + closesocket(clients[i].sock); + if (i < numClients - 1) { + clients[i] = clients[numClients-1]; + } + clients[i].item->refCount--; + --numClients; + /* no increase of i here */ + } else { + ++i; + } + } + return numClients; +} + + +/** Thread function of the RDA server. Can handle multiple clients in parallel. + + Incoming data (from the FieldTrip buffer) is first converted to "items" in a form that RDA clients expect, + and a linked list of these items is kept. Each item has a reference count that determines on how many client + sockets it's currently being streamed out. At the end of the main server loop, the linked list is inspected + for unreferenced items at the start of the list, and those are removed. + + On top of the data items, also a "start item" is kept that contains the header information (RDA start packet). + This is necessary for being able to write out the header information to newly connecting clients. + + Initially, both the "start item" and the "first data item" are empty, indicating that no header information + and data/events have been read yet. +*/ +void *_rdaserver_thread(void *arg) { + rda_server_ctrl_t *SC = (rda_server_ctrl_t *) arg; /* our control structure */ + rda_client_job_t clients[RDA_MAX_NUM_CLIENTS]; /* list of clients and their current jobs */ + rda_buffer_item_t *startItem = nullptr; /* item containing start packet (header info) */ + rda_buffer_item_t *firstDataItem = nullptr; /* first item in list of (mostly) data packets */ + rda_buffer_item_t *latestItem = nullptr; + + headerdef_t ftHdr; /* contains header information */ + int i,typeOk; /* typeOk is only interesting for 16-bit servers */ + int ftTimeout = 20; /* in milliseconds, wait up to 20ms for new data/events */ + int selTimeout = 0; /* in microseconds, for select */ + unsigned int numBlock = 0; /* running count of data blocks received */ + samples_events_t lastNum = {0,0}; /* number of samples + events handled so far */ + samples_events_t curNum = {0,0}; /* ... currently available */ + fd_set readSet, writeSet; /* for select on server + child sockets */ + int fdMax = 1; /* for select, not really used on Windows */ + struct timeval tv; /* for select timeout */ + int numClients = 0; /* current number of clients */ + int newNumClients = 0; /* number of clients after error checks */ + int opState = 0; /* 0 = waiting for clients or FT header, + 1 = running, + 2 = new header received, have all clients receive a stop message + */ + + if (SC==NULL) return NULL; + + SC->is_running = 1; + /* Set typeOk flag to 1 for floats, 0 for int16_t + (in the latter case we need to check the FT header first) + */ + typeOk = SC->use16bit ? 0 : 1; + + #ifndef PLATFORM_WIN32 + fdMax = SC->server_socket; + #endif + + /* Loop this until errors occur or this flag is set from another thread */ + while (!SC->should_exit) { + int sel; + + /* First, in case we have no header, we need to read it from the FT buffer */ + if (startItem == nullptr && opState == 0) { + startItem = rda_aux_get_hdr_prep_start(SC->ft_buffer, &ftHdr); + if (startItem == nullptr) { + /* no header yet, wait in select call for clients connecting */ + selTimeout = 100000; + } else { + /* yeah, we got it */ + if (SC->verbosity > 4) { + printf("Picked up FieldTrip header: %i channels @ %.1f Hz, datatype=%i\n",ftHdr.nchans, ftHdr.fsample, ftHdr.data_type); + } + /* don't wait in select call, but inside FT polling */ + selTimeout = 0; + /* set 'typeOk' flag if we're running a 16 bit server */ + if (SC->use16bit) { + typeOk = (ftHdr.data_type == DATATYPE_INT16) || (ftHdr.data_type == DATATYPE_UINT16); + } + /* start from the numbers of samples + events currently in the buffer */ + lastNum.nsamples = ftHdr.nsamples; + lastNum.nevents = ftHdr.nevents; + /* if we already have clients, change operation state */ + if (numClients > 0) { + opState = 1; + /* add start packet to all clients */ + for (i=0;iblockNumber = -1; + } + } + + /* Second, we deal with the things specific to client sockets */ + + /* Prepare read (also error!) and write sets: clear them first */ + FD_ZERO(&readSet); + FD_ZERO(&writeSet); + /* Add server socket to read set, but only if we can actually handle more clients */ + if (numClients < RDA_MAX_NUM_CLIENTS) { + FD_SET(SC->server_socket, &readSet); + } + for (i=0;i0 && FD_ISSET(SC->server_socket, &readSet)) { + struct sockaddr_in sa; + int size_sa = sizeof(sa); + SOCKET newSock; + + newSock = accept(SC->server_socket, (struct sockaddr *)&sa, &size_sa); + if (newSock == INVALID_SOCKET) { + perror("rda_server_thread - accept"); + } else { + if (SC->verbosity > 0) { + fprintf(stderr, "rdaserver_thread: opened connection (%i) to client at %s\n",newSock,inet_ntoa(sa.sin_addr)); + } + + clients[numClients].sock = newSock; + clients[numClients].item = startItem; + clients[numClients].written = 0; + numClients++; + pthread_mutex_lock(&SC->mutex); + SC->num_clients = numClients; + pthread_mutex_unlock(&SC->mutex); + #ifndef PLATFORM_WIN32 + if (newSock > fdMax) fdMax = newSock; + #endif + } + --sel; + if (numClients > 0 && startItem != nullptr) { + /* let's go running */ + opState = 1; + } + } + + /* Check for sockets that are ready to be written to */ + if (sel>0) { + sel = rda_aux_check_writing(sel, &writeSet, numClients, clients, SC->verbosity); + } + + /* Check for sockets on which we can read (=> read 0 bytes means closure ) */ + if (sel>0) { + newNumClients = rda_aux_check_closure(sel, &readSet, numClients, clients, SC->verbosity); + } else { + newNumClients = numClients; + } + /* Check for clients that lag behind */ + if (newNumClients > 0) { + newNumClients = rda_aux_check_slow_clients(numBlock - RDA_MAX_LAG, newNumClients, clients, SC->verbosity); + } + + if (newNumClients < numClients) { + #ifndef PLATFORM_WIN32 + fdMax = SC->server_socket; + for (i=0;i fdMax) fdMax = clients[i].sock; + } + #endif + pthread_mutex_lock(&SC->mutex); + SC->num_clients = numClients = newNumClients; + pthread_mutex_unlock(&SC->mutex); + } + if (numClients == 0) { + /* no clients any more - wait */ + opState = 0; + } + + /* Ok, (client) network stuff is done, let's see if there is more data */ + + /* If we already have the header, check for new data (samples / events) */ + if (startItem != nullptr && !rda_aux_wait_dat(SC->ft_buffer, &lastNum, &curNum, ftTimeout)) { + int newBlock; + + if (SC->blocksize > 0) { + /* only send out a DATA packet if there are enough new samples */ + newBlock = (curNum.nsamples - lastNum.nsamples) >= SC->blocksize; + if (newBlock) { + curNum.nsamples = lastNum.nsamples + SC->blocksize; + } + } else { + /* blocksize = 0: send out a new block if there are new samples or new events */ + newBlock = curNum.nsamples > lastNum.nsamples || curNum.nevents > lastNum.nevents; + } + + if (newBlock && SC->verbosity > 5) { + printf("New samples/events: %i, %i (Total: %i, %i)\n", curNum.nsamples-lastNum.nsamples, + curNum.nevents-lastNum.nevents, + curNum.nsamples, curNum.nevents); + } + + /* In case the new number of samples is smaller than what we had so far, + we need to send a STOP packet to all clients and later re-read the header + information. + */ + if (curNum.nsamples < lastNum.nsamples) { + rda_buffer_item_t *stopItem; + + free(startItem->data); + free(startItem); + startItem = NULL; + + if (opState == 1) { + if (SC->verbosity > 4) { + std::cout << "Sample count in FieldTrip buffer decreased, sending STOP packet to all clients.\n"; + } + + /* if currently running with clients, send STOP packet */ + stopItem = rda_aux_alloc_item(sizeof(rda_msg_hdr_t)); + if (stopItem == nullptr) { + fprintf(stderr, "Out of memory\n"); + break; + } + + /* First add a STOP message to be sent to the list */ + memcpy(stopItem->data, _rda_guid, sizeof(_rda_guid)); + ((rda_msg_hdr_t *) stopItem->data)->nSize = sizeof(rda_msg_hdr_t); + ((rda_msg_hdr_t *) stopItem->data)->nType = RDA_STOP_MSG; + stopItem->blockNumber = numBlock++; + stopItem->next = NULL; /* restart from opState=0 here */ + latestItem = stopItem; + + /* Add stop item to data packet list */ + if (firstDataItem == nullptr) { + firstDataItem = stopItem; + } else { + rda_buffer_item_t *last = firstDataItem; + while (last->next != nullptr) { + last = last->next; + } + last->next = stopItem; + } + /* ... and also add it to clients that are currently waiting */ + for (i=0;irefCount++; + } + } + /* switch to waiting-for-stop operation mode */ + opState = 2; + } else { + if (SC->verbosity > 4) { + std::cout << "Sample count in FieldTrip buffer decreased, will re-read header.\n"; + } + } + } + + if (opState != 1) { + /* if not running, just take note of the updated quantities */ + lastNum = curNum; + } else { + /* If the type is right (for 16 bit servers) AND we've got a new block, + then read this block and start streaming it out + */ + if (typeOk && newBlock && opState==1) { + /* There's new data to stream out */ + rda_buffer_item_t *item; + + item = rda_aux_get_samples_and_markers(SC->ft_buffer, &lastNum, &curNum, numBlock, SC->use16bit); + if (item != nullptr) { + if (firstDataItem == nullptr) { + firstDataItem = item; + } else { + rda_buffer_item_t *last = firstDataItem; + while (last->next != nullptr) last = last->next; + last->next = item; + } + for (i=0;iverbosity>6) { + printf("Adding new job for client %i\n", clients[i].sock); + } + clients[i].item = item; + item->refCount++; + } + } + lastNum = curNum; + latestItem = item; + /* modify startItem's block number (for new clients), + then increase block number + */ + startItem->blockNumber = numBlock++; + } else { + fprintf(stderr, "Could not get data from FT buffer or allocate memory\n"); + } + } + } + } + + + /* just for debugging - this will be removed */ + if (0) { + rda_buffer_item_t *item = firstDataItem; + + while (item != nullptr) { + printf("Item at 0x%lX has refcount %i and points at 0x%lX\n", (long) (void *) item, item->refCount, (long) (void *) item->next); + item = item->next; + } + } + + /* Done with the network-specific stuff, now clean up the data items */ + while (firstDataItem != nullptr && firstDataItem->refCount == 0) { + rda_buffer_item_t *next = firstDataItem->next; + free(firstDataItem->data); + free(firstDataItem); + firstDataItem = next; + } + + if (firstDataItem == nullptr) { + latestItem = NULL; + if (opState == 2) { + opState = 0; + } + } + + /* Update the startItem's (=header) next pointer */ + if (startItem != nullptr) startItem->next = latestItem; + } + /* shutdown clients */ + for (i=0;idata); + free(startItem); + } + /* ... and firstDataItem (including following list elements) */ + while (firstDataItem != nullptr) { + rda_buffer_item_t *next = firstDataItem->next; + free(firstDataItem->data); + free(firstDataItem); + firstDataItem = next; + } + SC->is_running = 0; + return NULL; +} + +/* see header file for documentation */ +rda_server_ctrl_t *rda_start_server(int ft_buffer, int use16bit, int port, int blocksize, int *errval) { + rda_server_ctrl_t *SC = nullptr; + SOCKET s = INVALID_SOCKET; + struct sockaddr_in sa; + unsigned long optval; + int interr = FT_ERR_SOCKET; /* if things go wrong here, it's most often because of socket errors */ + UINT16_T testEndian = 0x0100; /* this will be [0x00,0x01] on little-endian, [0x01,0x00] on big-endian */ + +#ifdef PLATFORM_WIN32 + WSADATA wsa; + if(WSAStartup(MAKEWORD(1, 1), &wsa)) + { + fprintf(stderr, "tcpserver: cannot start sockets\n"); + goto cleanup; + } +#endif + + if (*((UINT8_T *) &testEndian)) { + _i_am_big_endian_ = 1; + /* + std::cout << "Running on big-endian machine - conversion enabled\n"; + */ + } + + /* allocate the control structure */ + SC = (rda_server_ctrl_t *) malloc(sizeof(rda_server_ctrl_t)); + if (SC == nullptr) { + fprintf(stderr,"start_rda_server: out of memory\n"); + interr = FT_ERR_OUT_OF_MEM; + goto cleanup; + } + + /* create TCP socket */ + interr = FT_ERR_SOCKET; + s = socket(PF_INET, SOCK_STREAM, 0); + if (s == INVALID_SOCKET) { + perror("start_rda_server socket"); + goto cleanup; + } + + /* prevent "bind: address already in use" */ + optval = 1; + if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char*)&optval, sizeof(optval)) < 0) { + perror("start_rda_server setsockopt"); + /* not really critical - we go on */ + } + + /* check if user selected default port and select according to type */ + if (port == 0) { + port = use16bit ? 51234 : 51244; + } + + /* bind socket to the specified port (all interfaces) */ + bzero(&sa, sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_port = htons(port); + sa.sin_addr.s_addr = htonl(INADDR_ANY); + + if (bind(s, (struct sockaddr *)&sa, sizeof(sa)) != 0) { + perror("start_rda_server bind"); + goto cleanup; + } + + /* place the socket in non-blocking mode */ +#ifdef PLATFORM_WIN32 + optval = 1; + if (ioctlsocket(s, FIONBIO, &optval) != 0) { + fprintf(stderr,"start_rda_server: could not set non-blocking mode\n"); + goto cleanup; + } +#else + optval = fcntl(s, F_GETFL, nullptr); + optval = optval | O_NONBLOCK; + if (fcntl(s, F_SETFL, optval)<0) { + perror("start_rda_server fcntl"); + goto cleanup; + } +#endif + + if (listen(s, BACKLOG)<0) { + perror("tcpserver listen"); + goto cleanup; + } + + /* set some control variables */ + SC->num_clients = 0; + SC->should_exit = 0; + SC->server_socket = s; + SC->ft_buffer = ft_buffer; + SC->use16bit = use16bit; + SC->verbosity = 10; /* TODO: specify proper values */ + SC->blocksize = (blocksize < 0) ? 0 : blocksize; + + /* if things go wrong after this, it's because of pthread issues */ + interr = FT_ERR_THREADING; + + /* create the mutex */ + if (pthread_mutex_init(&SC->mutex, nullptr) != 0) { + fprintf(stderr,"start_rda_server: mutex could not be initialised\n"); + goto cleanup; + } + + /* create thread with default attributes, select thread function depending on use16bit flag */ + if (pthread_create(&SC->thread, nullptr, _rdaserver_thread, SC) == 0) { + /* everything went fine - thread should be running now */ + if (errval != nullptr) *errval = FT_NO_ERROR; + return SC; + } + + pthread_mutex_destroy(&SC->mutex); +cleanup: + if (errval != nullptr) *errval = interr; + if (SC != nullptr) free(SC); + if (s != INVALID_SOCKET) { + #ifdef PLATFORM_WIN32 + shutdown(s, SD_BOTH); + #else + shutdown(s, SHUT_RDWR); + #endif + closesocket(s); + } + return NULL; +} + +/* stops the server and free's the given control structure */ +/* see header file for documentation */ +int rda_stop_server(rda_server_ctrl_t *SC) { + if (SC==NULL) return -1; + + pthread_mutex_lock(&SC->mutex); + SC->should_exit = 1; + pthread_mutex_unlock(&SC->mutex); + + pthread_join(SC->thread, nullptr); + pthread_detach(SC->thread); + pthread_mutex_destroy(&SC->mutex); + + closesocket(SC->server_socket); + free(SC); + return 0; +} + +/* see header file for documentation */ +int rda_get_num_clients(rda_server_ctrl_t *SC) { + int nc; + if (SC==NULL) return 0; + pthread_mutex_lock(&SC->mutex); + nc = SC->num_clients; + pthread_mutex_unlock(&SC->mutex); + return nc; +} diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/rdaserver.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/rdaserver.h new file mode 100644 index 0000000..8103046 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/rdaserver.h @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2010 S. Klanke + * F.C. Donders Centre for Cognitive Neuroimaging, Radboud University Nijmegen, + * Kapittelweg 29, 6525 EN Nijmegen, The Netherlands + * + * + */ + +#ifndef __rdaserver_h +#define __rdaserver_h + +#include +#include "buffer.h" +#include "rdadefs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* On Windows, sockets are not described by a plain int, but by the type SOCKET, which has + the size of a pointer. On WIN64, sizeof(SOCKET) != sizeof(int), although some people still + argue that it is safe to cast between those. To be sure, the RDA server implementation + always uses SOCKET as the base type, and defines this as an 'int' on POSIX systems. +*/ +#ifndef WIN32 +typedef int SOCKET; +#define INVALID_SOCKET -1 +#endif + +/** Error values as returned by rda_start_server */ +#define FT_NO_ERROR 0 +#define FT_ERR_OUT_OF_MEM 1 +#define FT_ERR_SOCKET 2 +#define FT_ERR_THREADING 3 + +/** 'select' cannot handle more than 64 elements on Windows, but this + should really be enough for all practical purposes. Depending on + the sampling rate and number of channels, you would probably hit + other performance boundaries first. Since the server socket itself + also needs listening to (taking 1 away from the available 64), + NEVER set the following number to more than 63!!! +*/ +#define RDA_MAX_NUM_CLIENTS 32 + +/** Number of blocks any client can lag behind before being disconnected */ +#define RDA_MAX_LAG 5 + +/** RDA server control structure for starting, inspecting, and stopping a server */ +typedef struct { + pthread_t thread; ///< Thread handle + pthread_mutex_t mutex; ///< Mutex for protecting num_clients (actually not really necessary) + SOCKET server_socket; ///< The server socket that clients connect to + int ft_buffer; ///< Connection to FieldTrip buffer (socket or 0 for dmarequests) + volatile int num_clients; ///< Current number of clients + volatile int should_exit; ///< Flag to notify the server thread that it should stop + volatile int is_running; ///< Flag that indicates whether the thread is still running + int blocksize; ///< Block size for streaming out samples, 0 => adapt to incoming data + int use16bit; ///< Flag that indicates whether 16 bit data should be streamed + int verbosity; ///< Option that determines how much status information is printed during operation +} rda_server_ctrl_t; + +/** Internally used data structure to keep a linked list of + data packets that need to be sent out */ +typedef struct rda_buffer_item { + void *data; ///< Points to complete RDA packet + size_t size; ///< Size of the packet (=allocated memory block) + int blockNumber; ///< Number of this data block (or -1 for start packet) + unsigned int refCount; ///< Reference count (multiple clients get the same data) + struct rda_buffer_item *next; ///< Next item in list or NULL +} rda_buffer_item_t; + +/** Internally used data structure to describe a client and its pending jobs */ +typedef struct { + SOCKET sock; ///< Client socket + rda_buffer_item_t *item; ///< Points to the current/next packet to be written + size_t written; ///< Number of bytes that have been written (from item->data) +} rda_client_job_t; + +/** Helper function for converting any FieldTrip data type to single precision floats + @param N number of values to convert + @param dest destination, must point to an array of at least N floats + @param data_type data type as described by FieldTrip DATATYPE_** constants + @param src source buffer +*/ +void rda_aux_convert_to_float(UINT32_T N, void *dest, UINT32_T data_type, const void *src); + +/** Starts an RDA server with a given FieldTrip connection (usually 0 for DMA), serving + either single precision or 16 bit integer data. + @param ft_buffer FieldTrip connection (0 for DMA, or socket for TCP connection) + @param use16bit pass 0 to serve single precision data (with conversion as necessary) + pass non-zero to serve 16 bit integers (only works if the FieldTrip buffer + also contains 16 bit data) + @param port Port number to bind to, or 0 for default port (51244 for 16 bit, 51344 for single precision) + @param blocksize Block size for streaming out samples (0=send out variable blocks depending on incoming data) + @param errval Optional pointer to an integer error value. Will contain either + FT_NO_ERROR, FT_ERR_SOCKET, FT_OUT_OF_MEM or FT_THREADING on exit. + @return Pointer to RDA server control structure, or NULL if an error occurred +*/ +rda_server_ctrl_t *rda_start_server(int ft_buffer, int use16bit, int port, int blocksize, int *errval); + +/** Stops an RDA server by closing the associated connections, stopping the background thread, and + deallocating its memory (including the control structure pointed to by the argument) + @param SC Must point to an RDA server control structure as created by rda_start_server + @return -1 if SC is NULL + 0 on success +*/ +int rda_stop_server(rda_server_ctrl_t *SC); + +/** Simple helper function for retrieving the current number of clients of an RDA server + @param SC Must point to an RDA server control structure as created by rda_start_server + @return The number of clients +*/ +int rda_get_num_clients(rda_server_ctrl_t *SC); + +#ifdef __cplusplus +} +#endif + +#endif /* __rdaserver_h */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/socketserver.c b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/socketserver.c new file mode 100644 index 0000000..fb2ecb9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/socketserver.c @@ -0,0 +1,474 @@ +/* + * Copyright (C) 2010, Stefan Klanke + * F.C. Donders Centre for Cognitive Neuroimaging, Radboud University Nijmegen, + * Kapittelweg 29, 6525 EN Nijmegen, The Netherlands + */ + +#include +#include +#include +#include +#include +#include + +/************************************************************************ + * This function deals with the incoming client requests in a loop until + * the user requests to stop the server, or until the remote side closes + * the connection. The implementation follows the idea of a state machine + * with the four different states: + * state = 0 means we are waiting for a request to come in, or we are + * in the process of reading the first 8 bytes (the "def" part) + * state = 1 means we are in the process of reading the remainder of + * the request (the "buf" part") + * state = 2 means we are in the process of writing the response (def) + * state = 3 means ... writing the 2nd. part of the response ("buf") + * + * On top of those 4 states, we maintain two variables "bytesDone" and + * "bytesTotal" that determine how many bytes we've read/written within + * the current state, and how many bytes we need to process in total, + * and a variable "curPtr" which points to the memory region we currently + * need to read into, or write from. Whether any action is actually taken + * inside the while loop also depends on the state of the socket which + * we find out using "select" (and then set "canRead" + "canWrite" flags). + * + * Depending on the nature of the request, we might skip states 1 and 3. + * This is the case if there is no "buf" attached to the message, or if + * an outgoing message can be merged in to a single packet. + * + * The actual processing of the message happens before moving to state 2 + * and consists of + * 1) possibly swapping the message to native endianness + * 2) calling dmarequest or the user-supplied callback function + * 3) possibly swapping back to remote endianness + ************************************************************************/ +void *_buffer_socket_func(void *arg) { + SOCKET sock; + ft_buffer_server_t *SC; + int mergePackets; + messagedef_t reqdef; + message_t request; + message_t *response = nullptr; + int state=0; /* 0 = reading def, 1=reading buf, 2=writing def, 3=writing buf */ + int bytesDone, bytesTotal; + char mergeBuffer[MERGE_THRESHOLD]; + char *curPtr; /* points at buffer that needs to be filled or written out */ + int swap = 0; + int canRead, canWrite; + UINT16_T reqCommand; + UINT32_T respBufSize; + fd_set readSet, writeSet; + + if (arg == nullptr) return NULL; + + /* copy over necessary variables and free the given structure */ + SC = ((ft_buffer_socket_t *) arg)->server; + sock = ((ft_buffer_socket_t *) arg)->clientSocket; + mergePackets = ((ft_buffer_socket_t *) arg)->mergePackets; + free(arg); + + if (SC->verbosity > 0) { + printf("Started new client thread with packet merging = %i\n", mergePackets); + } + + pthread_mutex_lock(&SC->lock); + SC->numClients++; + pthread_mutex_unlock(&SC->lock); + + request.def = &reqdef; + request.buf = NULL; + bytesDone = 0; + bytesTotal = sizeof(messagedef_t); + curPtr = (char *) request.def; + + while (SC->keepRunning) { + int sel, res, n; + struct timeval tv = {0, 10000}; /* 10ms */ + + FD_ZERO(&readSet); + FD_ZERO(&writeSet); + if (state < 2) { + FD_SET(sock, &readSet); + } else { + FD_SET(sock, &writeSet); + } + sel = select((int) sock+1, &readSet, &writeSet, nullptr, &tv); + if (sel == 0) continue; + if (sel < 0) { + fprintf(stderr, "Error in 'select' operation - closing client connection.\n"); + break; + } + canRead = FD_ISSET(sock, &readSet); + canWrite = FD_ISSET(sock, &writeSet); + + if (canRead) { + n = recv(sock, curPtr + bytesDone, bytesTotal - bytesDone, 0); + if (n<=0) { + /* socket was closed */ + if (SC->verbosity>0) { + std::cout << "Remote side closed client connection\n"; + } + break; + } + bytesDone+=n; + if (bytesDone 0) { + request.buf = malloc(reqdef.bufsize); + if (request.buf == nullptr) { + fprintf(stderr, "Out of memory\n"); + break; + } + curPtr = request.buf; + bytesDone = 0; + bytesTotal = reqdef.bufsize; + state = 1; + continue; + } + } else { + /* Reaching this point means that the state=1, and that we've + read request.buf completely, so swap the endianness if + necessary, and then move on to handling the request. + */ + if (swap) ft_swap_buf_to_native(reqCommand, reqdef.bufsize, request.buf); + } + + /* Request has been read completely, now deal with it */ + if (SC->callback != nullptr) { + /* User supplied a callback function in ft_start_buffer_server */ + res = SC->callback(&request, &response, SC->user_data); + if (res != 0 || response == nullptr || response->def == nullptr) { + fprintf(stderr, "buffer_socket_func: an unexpected error occurred in user-defined request handler\n"); + break; + } + } else { + /* No callback, use normal dmarequest */ + res = dmarequest(&request, &response); + if (res != 0 || response == nullptr || response->def == nullptr) { + fprintf(stderr, "buffer_socket_func: an unexpected error occurred in dmarequest\n"); + break; + } + } + + /* Ok, the request has been handled, results are in response. + We can free the memory pointed to by request.buf ... + */ + if (request.buf != nullptr) { + free(request.buf); + request.buf = NULL; + } + + /* ... swap the response to the remote endianness, if necessary ... */ + respBufSize = response->def->bufsize; + if (swap) ft_swap_from_native(reqCommand, response); + + /* ... and then start writing back the response. To reduce latency, + we try to merge response->def and response->buf if they are small, + so we can send it in one go over TCP. To fit the merged packet into + our state machine logic, we apply a trick and jump to state=3 directly, + where "curPtr" points to the merged packet. + Otherwise, we move to state=2, transmit response->def, move to state=3, + and there transmit response->buf. + */ + if (mergePackets && respBufSize > 0 && respBufSize + sizeof(messagedef_t) <= MERGE_THRESHOLD) { + memcpy(mergeBuffer, response->def, sizeof(messagedef_t)); + memcpy(mergeBuffer + sizeof(messagedef_t), response->buf, respBufSize); + + curPtr = mergeBuffer; + bytesDone = 0; + bytesTotal = respBufSize + sizeof(messagedef_t); + state = 3; + } else { + curPtr = (char *) response->def; + bytesDone = 0; + bytesTotal = sizeof(messagedef_t); + state = 2; + } + canWrite = 1; + } + + if (state >= 2 && canWrite) { + n = send(sock, curPtr + bytesDone, bytesTotal - bytesDone, 0); + if (n<=0) { + /* socket was closed */ + fprintf(stderr, "Cannot write to socket -- closing client connection.\n"); + break; + } + bytesDone+=n; + if (bytesDone < bytesTotal) continue; + if (state==2 && respBufSize > 0) { + curPtr = (char *) response->buf; + bytesDone = 0; + bytesTotal = respBufSize; + state = 3; + continue; + } + /* Reaching this point means we are done with writing out the response, + so we will now free the allocated memory, and reset to state=0. + */ + if (response->buf) free(response->buf); + free(response->def); + free(response); + response = NULL; + state = 0; + curPtr = (char *) request.def; + bytesDone = 0; + bytesTotal = sizeof(messagedef_t); + } + } + + pthread_mutex_lock(&SC->lock); + SC->numClients--; + pthread_mutex_unlock(&SC->lock); + + closesocket(sock); + if (request.buf != nullptr) free(request.buf); + if (response != nullptr) { + if (response->buf != nullptr) free(response->buf); + if (response->def != nullptr) free(response->def); + free(response); + } + + return NULL; +} + + + +/*********************************************************************** + * this thread listens to incoming TCP/UNIX domain socket connections + * if a connection is made by a client, it starts _buffer_socket_func + ***********************************************************************/ +void *_buffer_server_func(void *arg) { + ft_buffer_server_t *SC = (ft_buffer_server_t *) arg; + int n; + + if (SC == nullptr) { + fprintf(stderr, "FieldTrip buffer server thread started with invalid argument\n"); + return NULL; + } + + + while (SC->keepRunning) { + SOCKET c; + fd_set readSet; + int sel, rc, merge; + pthread_t tid; + ft_buffer_socket_t *CC; + struct timeval tv = {0,10000}; /* 10 ms for select timeout */ + + FD_ZERO(&readSet); + FD_SET(SC->serverSocket, &readSet); + + sel = select((int) SC->serverSocket + 1, &readSet, nullptr, nullptr, &tv); + + if (sel == 0) continue; + + /* The following code portion looks weird because of the preprocessor + defines splitting an if/else clause, but it's just what we want: + On Windows, there is no if/else clause, and the second (TCP) bit + is always called. On POSIX systems, we branch depending on whether + the server runs a local domain socket or TCP socket. + */ +#ifndef WIN32 + if (SC->isUnixDomain) { + struct sockaddr_un sa; + socklen_t size_sa = sizeof(sa); + + c = accept(SC->serverSocket, (struct sockaddr *)&sa, &size_sa); + + if (c == INVALID_SOCKET) { + perror("buffer_server, accept"); + continue; + } + /* never merge packets for (local) UNIX sockets */ + merge = 0; + } else +#endif + { + struct sockaddr_in sa; + socklen_t size_sa = sizeof(sa); + + c = accept(SC->serverSocket, (struct sockaddr *)&sa, &size_sa); + + if (c == INVALID_SOCKET) { + perror("buffer_server, accept"); + continue; + } + /* enable packet merging only if it's not localhost */ + merge = (sa.sin_addr.s_addr == htonl(INADDR_LOOPBACK)) ? 0 : 1; + } + + CC = (ft_buffer_socket_t *) malloc(sizeof(ft_buffer_socket_t)); + if (CC == nullptr) { + fprintf(stderr, "Out of memory\n"); + closesocket(c); + continue; + } + + CC->server = SC; + CC->clientSocket = c; + CC->mergePackets = merge; + + rc = pthread_create(&tid, nullptr, _buffer_socket_func, CC); + if (rc) { + fprintf(stderr, "tcpserver: return code from pthread_create() is %d\n", rc); + closesocket(c); + free(CC); + } + } + while ((n=SC->numClients)>0) { + printf("Waiting for %i remaining client threads to stop...\n", n); + usleep(10000); + } + pthread_mutex_lock(&SC->lock); + SC->numClients--; + pthread_mutex_unlock(&SC->lock); + return NULL; +} + + +ft_buffer_server_t *ft_start_buffer_server(int port, const char *name, ft_request_callback_t callback, void *user_data) { + ft_buffer_server_t *SC; + int optval; + SOCKET s = INVALID_SOCKET; + + SC = (ft_buffer_server_t *) malloc(sizeof(ft_buffer_server_t)); + if (SC == nullptr) return NULL; + + SC->callback = callback; + SC->user_data = user_data; + +#ifdef WIN32 + { + /* We only need to do this once ... and actually have a corresponding WSACleanup call somewhere */ + static WSADATA wsa = {0,0}; + if (wsa.wVersion == 0) { + if(WSAStartup(MAKEWORD(1, 1), &wsa)) { + fprintf(stderr, "ft_start_buffer_server: cannot start WIN32 sockets.\n"); + goto cleanup; + } + } + } +#endif + + /* setup socket */ + if (port == 0) { +#ifdef WIN32 + fprintf(stderr, "ft_start_buffer_server: invalid port number given.\n"); + goto cleanup; +#else + struct sockaddr_un sa; + /* UNIX domain socket */ + s = socket(AF_UNIX, SOCK_STREAM, 0); + if (s == INVALID_SOCKET) { + perror("ft_start_buffer_server, socket"); + goto cleanup; + } + sa.sun_family = AF_UNIX; + strncpy(sa.sun_path, name, sizeof(sa.sun_path)); + if (bind(s, (struct sockaddr *) &sa, sizeof(sa)) == -1) { + perror("ft_start_buffer_server, bind"); + goto cleanup; + } + SC->isUnixDomain = 0; +#endif + } else { + /* TCP socket */ + struct sockaddr_in sa; + + s = socket(PF_INET, SOCK_STREAM, 0); + if (s == INVALID_SOCKET) { + perror("ft_start_buffer_server, socket"); + goto cleanup; + } + /* prevend "bind: address already in use" */ + optval = 1; + if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char*)&optval, sizeof(optval)) < 0) { + perror("ft_start_buffer_server, setsockopt"); + goto cleanup; + } + + bzero(&sa, sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_port = htons(port); + sa.sin_addr.s_addr = htonl(INADDR_ANY); + if (bind(s, (struct sockaddr *) &sa, sizeof(sa)) < 0) { + perror("ft_start_buffer_server, bind"); + goto cleanup; + } + SC->isUnixDomain = 0; + } + + /* place the socket in non-blocking mode, required to do thread cancelation */ +#ifdef WIN32 + { + unsigned long enable = 0; + ioctlsocket(s, FIONBIO, &enable); + } +#else + optval = fcntl(s, F_GETFL, nullptr); + optval = optval | O_NONBLOCK; + if (fcntl(s, F_SETFL, optval)<0) { + perror("ft_start_buffer_server, fcntl"); + goto cleanup; + } +#endif + + if (listen(s, BACKLOG)<0) { + perror("ft_start_buffer_server, listen"); + goto cleanup; + } + + /* set some control variables */ + SC->numClients = 0; + SC->keepRunning = 1; + SC->serverSocket = s; + SC->verbosity = 10; /* TODO: specify proper values */ + + /* create the mutex */ + if (pthread_mutex_init(&SC->lock, nullptr) != 0) { + fprintf(stderr,"start_tcp_server: mutex could not be initialised\n"); + goto cleanup; + } + + /* create thread with default attributes */ + if (pthread_create(&SC->threadID, nullptr, _buffer_server_func, SC) == 0) { + /* everything went fine - thread should be running now */ + return SC; + } + + fprintf(stderr,"start_tcp_server: could not spawn thread\n"); + pthread_mutex_destroy(&SC->lock); + +cleanup: + if (SC != nullptr) free(SC); + if (s != INVALID_SOCKET) { + #ifdef WIN32 + shutdown(s, SD_BOTH); + #else + shutdown(s, SHUT_RDWR); + #endif + closesocket(s); + } + return NULL; +} + +void ft_stop_buffer_server(ft_buffer_server_t *S) { + if (S == nullptr) return; + + S->keepRunning = 0; + pthread_join(S->threadID, nullptr); + pthread_detach(S->threadID); + free(S); +} diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/socketserver.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/socketserver.h new file mode 100644 index 0000000..6dc21d7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/socketserver.h @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2010, Stefan Klanke + * F.C. Donders Centre for Cognitive Neuroimaging, Radboud University Nijmegen, + * Kapittelweg 29, 6525 EN Nijmegen, The Netherlands + */ +#ifndef __socketserver_h +#define __socketserver_h + +#include "buffer.h" +#include + +#define MERGE_THRESHOLD 4096 /* TODO: optimize this value? Maybe look at MTU size */ + + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifndef WIN32 +#define INVALID_SOCKET -1 +typedef int SOCKET; +#include +#else +typedef int socklen_t; +#endif + +typedef int (*ft_request_callback_t)(const message_t *request, message_t **response, void *user_data); + +/** The following structure is used for managing a server. The structure is + allocated and filled in ft_start_buffer_server and then passed on to the + actual server thread, as well as to all threads handling the client + connections. Thread functions are written such that they monitor the + "keepRunning" member of this structure, and once this is set to 0, the + threads stop and exit. +*/ +typedef struct { + SOCKET serverSocket; ///< Socket the server listens on (TCP or UNIX domain) + int keepRunning; ///< Flag=1: thread functions keep looping, 0: threads exit + int numClients; ///< Current number of clients connected to the server + int verbosity; ///< Determines how much information is being printed during operation + int isUnixDomain; ///< 1: UNIX domain socket, 0: TCP socket + pthread_t threadID; ///< POSIX thread identifier of the server thread, client threads are detached immediately + pthread_mutex_t lock; ///< Mutex to protect the "numClients" member, commonly used by all threads + ft_request_callback_t callback; ///< Callback function to be called *instead* of dmarequest + void *user_data; ///< Pointer to user-defined data structure, passed on to callback +} ft_buffer_server_t; + +/** Small helper structure that is passed to client threads. Get's allocated + using malloc() in the server thread, and disposed using free() in the client + thread. +*/ +typedef struct { + ft_buffer_server_t *server; ///< Pointer to the common control structure + SOCKET clientSocket; ///< The newly created socket (from "accept") + int mergePackets; ///< 1: merge packets if total size below threshold, 0: never merge (=>local host) +} ft_buffer_socket_t; + +/** Creates a server socket, binds it to the specified UNIX domain name or port, + starts listening on this socket, and spawns a background thread to serve + requests on this socket. + TCP sockets are created for positive port numbers (name is ignored), + UNIX domain sockets are created for port=0 (name needs to be a UNIX pathname). + + If callback != nullptr, that function is called like + callback(request, &response, user_data) + for every request coming in over the socket, *instead* of the normal dmarequest. + Usually the user will call the latter function internally. Make sure your + callback is re-entrant!!! + + Returns allocated control structure, or NULL in case of errors. +*/ +ft_buffer_server_t *ft_start_buffer_server(int port, const char *name, ft_request_callback_t callback, void *user_data); + +/** Stops background thread(s), closes the sockets, and disposes the control structure S. + S cannot be used anymore after this call. +*/ +void ft_stop_buffer_server(ft_buffer_server_t *S); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/tcprequest.c b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/tcprequest.c new file mode 100644 index 0000000..6569d93 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/tcprequest.c @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2008, Robert Oostenveld + * F.C. Donders Centre for Cognitive Neuroimaging, Radboud University Nijmegen, + * Kapittelweg 29, 6525 EN Nijmegen, The Netherlands + * + */ + +#include +#include +#include "buffer.h" + +#define MERGE_THRESHOLD 4096 /* TODO: optimize this value? Maybe look at MTU size */ + +/******************************************************************************* + * communicate with the buffer through TCP + *******************************************************************************/ +int tcprequest(int server, const message_t *request, message_t **response_ptr) { + unsigned int n, total; + + /* this will hold the response */ + message_t *response; + response = (message_t*)malloc(sizeof(message_t)); + response->def = (messagedef_t*)malloc(sizeof(messagedef_t)); + response->buf = NULL; + /* the response should be passed to the calling function, where it should be freed */ + *response_ptr = response; + + total = sizeof(messagedef_t) + request->def->bufsize; + + /* Check whether request->def and request->buf are already contiguous in memory, + or whether request->buf is empty. If that's the case, we can write the request in one go. + */ + if (request->def->bufsize == 0 || (request->def+1) == (messagedef_t *) request->buf) { + if ((n = bufwrite(server, request->def, total)) != total) { + fprintf(stderr, "write size = %d, should be %d\n", n, total); + goto cleanup; + } + } + /* Now check whether the total size is below the merge threshold, in which case + we'll copy it to contiguous memory and again send it in one go + */ + else if (total <= MERGE_THRESHOLD) { + char merged[MERGE_THRESHOLD]; + + memcpy(merged, request->def, sizeof(messagedef_t)); + memcpy(merged + sizeof(messagedef_t), request->buf, request->def->bufsize); + + if ((n = bufwrite(server, merged, total)) != total) { + fprintf(stderr, "write size = %d, should be %d\n", n, total); + goto cleanup; + } + } + /* Otherwise, send "def" and "buf" in separate pieces. This might introduce latencies + if the other end runs Windows :-( + */ + else { + /* send the request to the server, first the message definition */ + if ((n = bufwrite(server, request->def, sizeof(messagedef_t)))!=sizeof(messagedef_t)) { + fprintf(stderr, "write size = %d, should be %lu\n", n, (long unsigned int)sizeof(messagedef_t)); + goto cleanup; + } + + /* send the request to the server, then the message payload */ + if ((n = bufwrite(server, request->buf, request->def->bufsize))!=request->def->bufsize) { + fprintf(stderr, "write size = %d, should be %d\n", n, request->def->bufsize); + goto cleanup; + } + } + + /* read the response from the server, first the message definition */ + if ((n = bufread(server, response->def, sizeof(messagedef_t))) != sizeof(messagedef_t)) { + fprintf(stderr, "packet size = %d, should be %lu\n", n, (long unsigned int)sizeof(messagedef_t)); + goto cleanup; + } + + if (response->def->version!=VERSION) { + fprintf(stderr, "incorrect version\n"); + goto cleanup; + } + + /* read the response from the server, then the message payload */ + if (response->def->bufsize>0) { + response->buf = malloc(response->def->bufsize); + if ((n = bufread(server, response->buf, response->def->bufsize)) != response->def->bufsize) { + fprintf(stderr, "read size = %d, should be %d\n", n, response->def->bufsize); + goto cleanup; + } + } + + /* everything went fine, return with the response */ + /* print_response(response->def); */ + return 0; + +cleanup: + /* there was a problem, clear the response and return */ + FREE(response->def); + FREE(response->buf); + FREE(response); + *response_ptr = NULL; /* SK: this was missing a "*", effectively never really returning 0 */ + return -1; +} + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/tiaserver.c b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/tiaserver.c new file mode 100644 index 0000000..1fc5863 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/tiaserver.c @@ -0,0 +1,4 @@ +/* + * This will contain the implementation of the TiA server on top of the FieldTrip buffer, similar to the RDA server. + * + */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/tiaserver.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/tiaserver.h new file mode 100644 index 0000000..758b3d6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/tiaserver.h @@ -0,0 +1,4 @@ +/* + * This will contain the implementation of the TiA server on top of the FieldTrip buffer, similar to the RDA server. + * + */ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/util.c b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/util.c new file mode 100644 index 0000000..192f12a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/util.c @@ -0,0 +1,482 @@ +/* + * Copyright (C) 2008, Robert Oostenveld & Christian Hesse + * F.C. Donders Centre for Cognitive Neuroimaging, Radboud University Nijmegen, + * Kapittelweg 29, 6525 EN Nijmegen, The Netherlands + * + */ + +#include +#include +#include /* for strerror */ + +#include "buffer.h" +#include +#include "extern.h" + +unsigned int bufread(int s, void* buf, unsigned int numel) +{ + unsigned int numcall = 0, numread = 0, verbose = 0; + int numthis = 0; + + while (numread < numel) + { + numthis = recv(s, (char*)buf + numread, numel - numread, 0); + if (numthis < 0) + { + perror("bufread"); + break; + } + else if (numthis == 0) { break; } + + if (verbose > 0) { fprintf(stderr, "bufread: read %d bytes\n", numthis); } + numread += numthis; + numcall++; +#ifndef PLATFORM_WIN32 /* SK: I think this shouldn't be necessary on any platform: the sockets are blocking */ + if (numread < numel) { usleep(1000); } +#endif + } + if (verbose > 1) { fprintf(stderr, "bufread: reading the complete buffer required %d calls\n", numcall); } + return numread; +} + +unsigned int bufwrite(int s, const void* buf, unsigned int numel) +{ + int numthis = 0; + unsigned int numcall = 0, numwrite = 0, verbose = 0; + + while (numwrite < numel) + { + numthis = send(s, (char*)buf + numwrite, numel - numwrite, 0); + if (numthis < 0) + { + perror("bufwrite"); + break; + } + else if (numthis == 0) { break; } + + if (verbose) fprintf(stderr, "bufwrite: wrote %d bytes\n", numthis); + numwrite += numthis; + numcall++; +#ifndef PLATFORM_WIN32 /* SK: I think this shouldn't be necessary on any platform: the sockets are blocking */ + if (numwrite < numel) { usleep(1000); } +#endif + } + if (verbose > 1) { fprintf(stderr, "bufwrite: writing the complete buffer required %d calls\n", numcall); } + return numwrite; +} + +unsigned int append(void** buf1, unsigned int bufsize1, void* buf2, unsigned int bufsize2) +{ + int verbose = 0; + + if (verbose > 1) + { + pthread_mutex_lock(&mutexappendcount); + appendcount++; + fprintf(stderr, "append: appendcount = %d\n", appendcount); + pthread_mutex_unlock(&mutexappendcount); + } + + if (((*buf1) != nullptr) && (bufsize1 == 0)) + { + perror("append err1"); + return 0; /* was -1, but this is never checked anyway */ + } + else if (((*buf1) == nullptr) && (bufsize1 != 0)) + { + perror("append err2"); + return 0; /* was -1, but this is never checked anyway */ + } + + if ((*buf1) == nullptr) + { + if (verbose > 0) { fprintf(stderr, "append: allocating %d bytes\n", bufsize2); } + (*buf1) = malloc(bufsize2); + } + else if ((*buf1) != nullptr) + { + if (verbose > 0) { fprintf(stderr, "append: reallocating from %d to %d bytes\n", bufsize1, bufsize1 + bufsize2); } + (*buf1) = realloc((*buf1), bufsize1 + bufsize2); + } + + memcpy((char*)(*buf1) + bufsize1, buf2, bufsize2); + return (bufsize1 + bufsize2); +} + +int close_connection(int s) +{ + int status = 0, verbose = 0; + if (verbose > 0) { fprintf(stderr, "close_connection: socket = %d\n", s); } + if (s > 0) status = closesocket(s); /* it is a TCP connection */ + if (status != 0) { perror("close_connection"); } + return status; +} + +int open_connection(const char* hostname, int port) +{ + int verbose = 0; + int s, retry; + struct sockaddr_in sa; + struct hostent* host; +#ifdef WIN32 + static WSADATA wsa = { 0, 0 }; /* check version fields to only initialise once */ +#endif + + if (port == 0) + { + if (verbose > 0) { fprintf(stderr, "open_connection: using direct memory copy\n"); } + return 0; + } + else { if (verbose > 0) { fprintf(stderr, "open_connection: server = %s, port = %d\n", hostname, port); } } + +#ifdef WIN32 + if (wsa.wVersion == 0) + { + /* We only need to do this once ... and actually have a corresponding WSACleanup call somewhere */ + if (WSAStartup(MAKEWORD(1, 1), &wsa)) + { + fprintf(stderr, "open_connection: cannot start sockets\n"); + /* FIXME should this exception be handled more explicitely? */ + } + } +#endif + + if ((host = gethostbyname(hostname)) == nullptr) + { + fprintf(stderr, "open_connection: nslookup1 failed on '%s'\n", hostname); + return -1; + } + + if (host->h_length == 0) + { + fprintf(stderr, "open_connection: nslookup2 failed on '%s'\n", hostname); + return -1; + } + + bzero(&sa, sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_port = htons(port); + + memcpy(&(sa.sin_addr.s_addr), host->h_addr_list[0], sizeof(sa.sin_addr.s_addr)); + + if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) + { + if (verbose > 0) { fprintf(stderr, "open_connection: socket = %d\n", s); } + perror("open_connection"); + return -1; + } + + retry = 10; + while (retry > 0) + { + if (connect(s, (struct sockaddr*)&sa, sizeof sa) < 0) + { + /* wait 5 miliseconds and try again */ + usleep(5000); + retry--; + } + else + { + /* this signals that the connection has been made */ + retry = -1; + } + } + if (retry == 0) + { + /* close the socket */ + closesocket(s); + /* it failed on mutliple attempts, give up */ + return -2; + } + + /* + while (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) { + perror("open_connection connect"); + usleep(1000000); + } + */ + + if (verbose > 0) { fprintf(stderr, "open_connection: connected to %s:%d on socket %d\n", hostname, port, s); } + +#ifdef DISABLE_NAGLE + { + int optval = 1; + setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof(optval)); + } +#endif + + return s; +} + +void check_datatypes() +{ + /* check datatypes */ + if (WORDSIZE_CHAR != 1) + { + fprintf(stderr, "invalid size of CHAR (%d)\n", (int)WORDSIZE_CHAR); + exit(-1); + } + if (WORDSIZE_UINT8 != 1) + { + fprintf(stderr, "invalid size of UINT8 (%d)\n", (int)WORDSIZE_UINT8); + exit(-1); + } + if (WORDSIZE_UINT16 != 2) + { + fprintf(stderr, "invalid size of UINT16 (%d)\n", (int)WORDSIZE_UINT16); + exit(-1); + } + if (WORDSIZE_UINT32 != 4) + { + fprintf(stderr, "invalid size of UINT32 (%d)\n", (int)WORDSIZE_UINT32); + exit(-1); + } + if (WORDSIZE_UINT64 != 8) + { + fprintf(stderr, "invalid size of UINT64 (%d)\n", (int)WORDSIZE_UINT64); + exit(-1); + } + if (WORDSIZE_INT8 != 1) + { + fprintf(stderr, "invalid size of INT8 (%d)\n", (int)WORDSIZE_INT8); + exit(-1); + } + if (WORDSIZE_INT16 != 2) + { + fprintf(stderr, "invalid size of INT16 (%d)\n", (int)WORDSIZE_INT16); + exit(-1); + } + if (WORDSIZE_INT32 != 4) + { + fprintf(stderr, "invalid size of INT32 (%d)\n", (int)WORDSIZE_INT32); + exit(-1); + } + if (WORDSIZE_INT64 != 8) + { + fprintf(stderr, "invalid size of INT64 (%d)\n", (int)WORDSIZE_INT64); + exit(-1); + } + if (WORDSIZE_FLOAT32 != 4) + { + fprintf(stderr, "invalid size of FLOAT32 (%d)\n", (int)WORDSIZE_FLOAT32); + exit(-1); + } + if (WORDSIZE_FLOAT64 != 8) + { + fprintf(stderr, "invalid size of FLOAT64 (%d)\n", (int)WORDSIZE_FLOAT64); + exit(-1); + } + if (sizeof(messagedef_t) != 8) + { + fprintf(stderr, "invalid size of messagedef_t\n"); + exit(-1); + } + if (sizeof(headerdef_t) != 24) + { + fprintf(stderr, "invalid size of headerdef_t \n"); + exit(-1); + } + if (sizeof(datadef_t) != 16) + { + fprintf(stderr, "invalid size of datadef_t \n"); + exit(-1); + } + if (sizeof(eventdef_t) != 32) + { + fprintf(stderr, "invalid size of eventdef_t \n"); + exit(-1); + } + if (sizeof(datasel_t) != 8) + { + fprintf(stderr, "invalid size of datasel_t \n"); + exit(-1); + } + if (sizeof(eventsel_t) != 8) + { + fprintf(stderr, "invalid size of eventsel_t \n"); + exit(-1); + } +} + + +unsigned int wordsize_from_type(UINT32_T data_type) +{ + switch (data_type) + { + case DATATYPE_CHAR: return WORDSIZE_CHAR; + case DATATYPE_UINT8: + case DATATYPE_INT8: return WORDSIZE_INT8; + case DATATYPE_UINT16: + case DATATYPE_INT16: return WORDSIZE_INT16; + case DATATYPE_UINT32: + case DATATYPE_INT32: return WORDSIZE_INT32; + case DATATYPE_UINT64: + case DATATYPE_INT64: return WORDSIZE_INT64; + case DATATYPE_FLOAT32: return WORDSIZE_FLOAT32; + case DATATYPE_FLOAT64: return WORDSIZE_FLOAT64; + } + return 0; +} + +const ft_chunk_t* find_chunk(const void* buf, unsigned int offset0, unsigned int size, UINT32_T chunk_type) +{ + unsigned int bufpos = offset0; + while (bufpos + sizeof(ft_chunkdef_t) <= size) + { + const ft_chunk_t* chunk = (ft_chunk_t*)((char*)buf + bufpos); + if (chunk->def.type == chunk_type) { return chunk; } + bufpos += sizeof(ft_chunkdef_t) + chunk->def.size; + } + return nullptr; +} + + +/** Iterate through an array of events and check whether all of them are properly defined, + that is, whether the "type" and "value" fields are of valid type and size, and whether the + "bufsize" fields are correct (that is, fully contained in the passed buffer, and big enough + to hold "type" and "value". + Returns the number of events on success (might also be 0), or + a negative number that indicates in which event definition an error happend, + for example, a return value of -2 means that the first event was ok, but the second event + definition was invalid. This function returns at the first error. +*/ +int check_event_array(unsigned int size, const void* buf) +{ + unsigned int offset = 0; + int numEvents = 0; + + while (offset + sizeof(eventdef_t) <= size) + { + const eventdef_t* E; + unsigned int wsType, wsValue; + + /* Set our event pointer to the current location within the array */ + E = (const eventdef_t*)((char*)buf + offset); + + /* Increase the offset by the size of this event, and check whether it's fully + contained within the given array. + */ + offset += sizeof(eventdef_t) + E->bufsize; + if (offset > size) { goto error; } + + /* Check whether "type" and "value" are of known type */ + wsType = wordsize_from_type(E->type_type); + if (wsType == 0) { goto error; } + wsValue = wordsize_from_type(E->value_type); + if (wsValue == 0) { goto error; } + + /* Check whether "type" and "value" are contained in this event's "buf" */ + if (wsType * E->type_numel + wsValue * E->value_numel > E->bufsize) { goto error; } + + /* all checks passed, continue at next offset */ + ++numEvents; + } + return numEvents; +error: + return -(1 + numEvents); +} + + +#ifdef WIN32 +int open_unix_connection(const char* name) { return -1; } +#else +int open_unix_connection(const char* name) +{ + int verbose = 0; + int s, retry; + struct sockaddr_un sa; + + bzero(&sa, sizeof(sa)); + sa.sun_family = AF_UNIX; + strncpy(sa.sun_path, name, sizeof(sa.sun_path)); + + s = socket(AF_UNIX, SOCK_STREAM, 0); + if (s < 0) { + perror("open_unix_connection, socket"); + return -1; + } + + retry = 10; + while (retry > 0) { + if (connect(s, (struct sockaddr*) & sa, sizeof(sa)) < 0) { + /* wait 5 miliseconds and try again */ + perror("open_connection"); + usleep(5000); + retry--; + } + else { + /* this signals that the connection has been made */ + retry = -1; + } + } + if (retry == 0) { + /* it failed on mutliple attempts, give up */ + return -2; + } + + if (verbose > 0) + fprintf(stderr, "open_unix_connection: connected to %s on socket %d\n", name, s); + + return s; +} +#endif + + +#ifdef WIN32 +#ifndef COMPILER_MINGW + +/* + * timeval.h 1.0 01/12/19 + * + * Defines gettimeofday, timeval, etc. for Win32 + * + * By Wu Yongwei + * + */ + +//#define EPOCHFILETIME (116444736000000000i64) +#define EPOCHFILETIME ((INT64_T) 116444736000000000LL) + +#ifdef COMPILER_LCC +VOID STDCALL GetSystemTimeAsFileTime(LPFILETIME); +#endif + +int gettimeofday(struct timeval* tv, struct timezone* tz) +{ + FILETIME ft; + LARGE_INTEGER li; + INT64_T t; + static int tzflag; + + if (tv) + { + GetSystemTimeAsFileTime(&ft); + li.LowPart = ft.dwLowDateTime; + li.HighPart = ft.dwHighDateTime; + t = li.QuadPart; /* In 100-nanosecond intervals */ + t -= EPOCHFILETIME; /* Offset to the Epoch time */ + t /= 10; /* In microseconds */ + tv->tv_sec = (long)(t / 1000000); + tv->tv_usec = (long)(t % 1000000); + } + +#ifndef COMPILER_LCC + /* LCC that comes with Matlab has problems with _timezone and _daylight, + and we don't need it anyway */ + if (tz) + { + if (!tzflag) + { + _tzset(); + tzflag++; + } + tz->tz_minuteswest = _timezone / 60; + tz->tz_dsttime = _daylight; + } +#endif + + return 0; +} + +#endif +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/win32/gettimeofday.c b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/win32/gettimeofday.c new file mode 100644 index 0000000..c58b2a6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/win32/gettimeofday.c @@ -0,0 +1,80 @@ +/* SK: This has now been moved into util.c for simplification of compile scripts and Makefiles */ + +/* + * timeval.h 1.0 01/12/19 + * + * Defines gettimeofday, timeval, etc. for Win32 + * + * By Wu Yongwei + * + */ +#ifndef _TIMEVAL_H +#define _TIMEVAL_H + +#if TIME_WITH_SYS_TIME +#include +#include +#elif HAVE_SYS_TIME_H +#include +#else +#include +#endif + +#if ! HAVE_GETTIMEOFDAY || MINGW + +#if __WIN32__ +#include +#else +#include +#endif + +#ifndef __GNUC__ +#define EPOCHFILETIME (116444736000000000i64) +#else +#define EPOCHFILETIME (116444736000000000LL) +#endif + +#include "gettimeofday.h" + +/*! + \brief A Windows gettimeofday implementation. + */ + +int gettimeofday(struct timeval *tv, struct timezone *tz) +{ + #if __WIN32__ + FILETIME ft; + LARGE_INTEGER li; + __int64 t; + static int tzflag; + + if (tv) { + GetSystemTimeAsFileTime(&ft); + li.LowPart = ft.dwLowDateTime; + li.HighPart = ft.dwHighDateTime; + t = li.QuadPart; /* In 100-nanosecond intervals */ + t -= EPOCHFILETIME; /* Offset to the Epoch time */ + t /= 10; /* In microseconds */ + tv->tv_sec = (long)(t / 1000000); + tv->tv_usec = (long)(t % 1000000); + } + + if (tz) { + if (!tzflag) { + _tzset(); + tzflag++; + } + tz->tz_minuteswest = _timezone / 60; + tz->tz_dsttime = _daylight; + } + + return 0; + #else + errno = ENOSYS; + return -1; + #endif +} +#endif +#endif + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/win32/gettimeofday.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/win32/gettimeofday.h new file mode 100644 index 0000000..087275d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/win32/gettimeofday.h @@ -0,0 +1,12 @@ +#ifndef __gettimeofday_h +#define __gettimeofday_h +#include + +struct timezone { + int tz_minuteswest; /* minutes W of Greenwich */ + int tz_dsttime; /* type of dst correction */ +}; + +int gettimeofday(struct timeval *tv, struct timezone *tz); + +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/win32/poll.c b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/win32/poll.c new file mode 100644 index 0000000..0ece672 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/win32/poll.c @@ -0,0 +1,61 @@ +#include +#include "poll.h" + +int poll (struct pollfd *p, int num, int timeout) +{ + struct timeval tv; + fd_set read, write, except; + int i, n, ret; + char buf[1024]; + + FD_ZERO (&read); + FD_ZERO (&write); + FD_ZERO (&except); + + n = -1; + for (i = 0; i < num; ++i) + { + if (p[i].fd < 0) + continue; + if (p[i].events & POLLIN) + FD_SET (p[i].fd, &read); + if (p[i].events & POLLOUT) + FD_SET (p[i].fd, &write); + if (p[i].events & POLLERR) + FD_SET (p[i].fd, &except); + if (p[i].fd > n) + n = p[i].fd; + } + + if (n == -1) + return (0); + + if (timeout < 0) + ret = select (n+1, &read, &write, &except, nullptr); + else + { + tv.tv_sec = timeout / 1000; + tv.tv_usec = 1000 * (timeout % 1000); + ret = select (n+1, &read, &write, &except, &tv); + } + + for (i = 0; ret >= 0 && i < num; ++i) + { + p[i].revents = 0; + if (FD_ISSET (p[i].fd, &read)) + { + + int j = recv(p[i].fd, buf, 1024, MSG_PEEK); + if(j>0) + p[i].revents |= POLLIN; + else + p[i].revents |= POLLHUP; + + } + if (FD_ISSET (p[i].fd, &write)) + p[i].revents |= POLLOUT; + if (FD_ISSET (p[i].fd, &except)) + p[i].revents |= POLLERR; + } + return (ret); +} diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/ovasCConfigurationFieldtrip.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/ovasCConfigurationFieldtrip.cpp new file mode 100644 index 0000000..7aa7ea0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/ovasCConfigurationFieldtrip.cpp @@ -0,0 +1,50 @@ +#if defined(TARGET_HAS_PThread) + +#include "ovasCConfigurationFieldtrip.h" + +#include + +#include +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +bool CConfigurationFieldtrip::preConfigure() +{ + const bool res = CConfigurationBuilder::preConfigure(); + + m_pHostName = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_host_name")); + m_pHostPort = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_host_port")); + m_pMinSamples = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_minSamples")); + m_pSRCorrection = GTK_WIDGET(gtk_builder_get_object(m_builder, "checkbutton_SRCorrection")); + + gtk_spin_button_set_range(GTK_SPIN_BUTTON(m_pMinSamples), 1.0, 10000.0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_pMinSamples), m_minSamples); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_pHostPort), m_hostPort); + gtk_entry_set_text(GTK_ENTRY(m_pHostName), m_hostName.toASCIIString()); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_pSRCorrection), m_srCorrection); + + return res; +} + +bool CConfigurationFieldtrip::postConfigure() +{ + if (m_applyConfig) + { + gtk_spin_button_update(GTK_SPIN_BUTTON(m_pMinSamples)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_pHostPort)); + + m_minSamples = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_pMinSamples)); + m_hostPort = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_pHostPort)); + m_hostName = gtk_entry_get_text(GTK_ENTRY(m_pHostName)); + m_srCorrection = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_pSRCorrection)) > 0); + } + + return CConfigurationBuilder::postConfigure(); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif //#if defined(TARGET_HAS_PThread) \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/ovasCConfigurationFieldtrip.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/ovasCConfigurationFieldtrip.h new file mode 100644 index 0000000..59f8d69 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/ovasCConfigurationFieldtrip.h @@ -0,0 +1,59 @@ +#pragma once + +#if defined(TARGET_HAS_PThread) + +#include "../ovasCConfigurationBuilder.h" + +namespace OpenViBE +{ + namespace AcquisitionServer + { + /** + * \class CConfigurationFieldtrip + * \author Amelie Serpollet (CEA/LETI/CLINATEC) + * \date Mon May 23 09:48:21 2011 + * \brief The CDriverFieldtrip allows the acquisition server to acquire data from a Fieldtrip buffer. + * + */ + class CConfigurationFieldtrip final : public CConfigurationBuilder + { + public: + + CConfigurationFieldtrip(const char* gtkBuilderFilename) : CConfigurationBuilder(gtkBuilderFilename) { } + ~CConfigurationFieldtrip() override { } + + void setHostName(const CString& hostName) { m_hostName = hostName; } + void setHostPort(const uint32_t hostPort) { m_hostPort = hostPort; } + void setMinSamples(const uint32_t minSamples) { m_minSamples = minSamples; } + void setSRCorrection(const bool bSRCorrection) { m_srCorrection = bSRCorrection; } + + CString getHostName() const { return m_hostName; } + uint32_t getHostPort() const { return m_hostPort; } + uint32_t getMinSamples() const { return m_minSamples; } + bool getSRCorrection() const { return m_srCorrection; } + + protected: + + bool preConfigure() override; + bool postConfigure() override; + + private: + + CConfigurationFieldtrip(); + + protected: + + GtkWidget* m_pHostName = nullptr; + GtkWidget* m_pHostPort = nullptr; + GtkWidget* m_pMinSamples = nullptr; + GtkWidget* m_pSRCorrection = nullptr; + + CString m_hostName = "localhost"; + uint32_t m_hostPort = 4000; + uint32_t m_minSamples = 1; + bool m_srCorrection = true; + }; + } // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // #if defined(TARGET_HAS_PThread) diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/ovasCDriverFieldtrip.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/ovasCDriverFieldtrip.cpp new file mode 100644 index 0000000..443bdfc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/ovasCDriverFieldtrip.cpp @@ -0,0 +1,533 @@ +/* This driver uses the FieldTrip buffer open source library. + * See http://www.ru.nl/fcdonders/fieldtrip for details. + */ +#if defined(TARGET_HAS_PThread) + +#include "ovasCDriverFieldtrip.h" +#include "ovasCConfigurationFieldtrip.h" + +#include + +#include +#include "fieldtrip/buffer.h" +#include "fieldtrip/extern.h" +#include "fieldtrip/extern.c" +#include "fieldtrip/util.c" +#include "fieldtrip/printstruct.c" +#include "fieldtrip/tcprequest.c" +#include "fieldtrip/dmarequest.c" +#include "fieldtrip/clientrequest.c" + +#include +//#include "GetCpuTime.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverFieldtrip::CDriverFieldtrip(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_FieldTrip", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(0); + m_header.setChannelCount(0); + + m_waitDataRequest = new message_t(); + m_waitDataRequest->def = new messagedef_t(); + m_waitDataRequest->buf = nullptr; + + m_getDataRequest = new message_t(); + m_getDataRequest->def = new messagedef_t(); + m_getDataRequest->buf = nullptr; + + m_settings.add("Header", &m_header); + m_settings.add("MinSamples", &m_minSamples); + m_settings.add("PortNumber", &m_portNumber); + m_settings.add("HostName", &m_hostName); + m_settings.add("CorrectNonIntegerSR", &m_correctNonIntegerSR); + m_settings.load(); +} + +CDriverFieldtrip::~CDriverFieldtrip() +{ + if (m_waitDataRequest) + { + //m_waitDataRequest->buf deleted with m_waitDataRequest->def + if (m_waitDataRequest->def) { delete m_waitDataRequest->def; } + delete m_waitDataRequest; + } + + if (m_getDataRequest) + { + //m_getDataRequest->buf deleted with m_getDataRequest->def + if (m_getDataRequest->def) { delete m_getDataRequest->def; } + delete m_getDataRequest; + } +} + +const char* CDriverFieldtrip::getName() { return "Fieldtrip Driver"; } + +//___________________________________________________________________// +// // + +bool CDriverFieldtrip::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) { return false; } + + // ... + // initialize hardware and get available header information + // from it : + + // connect to buffer + if (m_connectionID != -1) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Already connected to Fieldtrip buffer " << m_hostName << ":" << m_portNumber << "\n"; + return false; + } + + m_connectionID = open_connection(m_hostName.toASCIIString(), int(m_portNumber)); + if (m_connectionID < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to connect to Fieldtrip buffer :\n" << m_hostName << ":" << m_portNumber << "\n"; + m_connectionID = -1; + return false; + } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Connection to Fieldtrip buffer succeeded !\n"; } + + // request header + if (!requestHeader()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Request header failed, disconnecting.\n"; + if (close_connection(m_connectionID) != 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to disconnect correctly from Fieldtrip buffer\n"; + } + m_connectionID = -1; + return false; + } + + + if (!m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + // Builds up a buffer to store acquired samples. This buffer + // will be sent to the acquisition server later... + m_sample = new float[m_header.getChannelCount() * nSamplePerSentBlock]; + if (!m_sample) + { + delete [] m_sample; + m_sample = nullptr; + return false; + } + + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + if (m_minSamples < 1) { m_minSamples = 1; } + if (m_minSamples > m_nSamplePerSentBlock) { m_minSamples = m_nSamplePerSentBlock; } + + return true; +} + +bool CDriverFieldtrip::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // ... + // request hardware to start + // sending data + // ... + m_firstGetDataRequest = true; + m_waitingTimeMs = (m_header.getSamplingFrequency() > 1000 ? 1 : (1000 / m_header.getSamplingFrequency()) + ); //time for 1 sample if >= 1ms //(1000*m_nSamplePerSentBlock) + m_nTotalSample = 0; + + m_diffPerSample = (m_realSampling - m_header.getSamplingFrequency()) / m_realSampling; + if (m_diffPerSample <= 0.0) { m_diffPerSample = 0.0; } + m_driftSinceLastCorrection = 0.0; + + return true; +} + +bool CDriverFieldtrip::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted()) { return true; } + + CStimulationSet stimSet; + stimSet.setStimulationCount(0); + + // ... + // receive samples from hardware + // put them the correct way in the sample array + // whether the buffer is full, send it to the acquisition server + //... + const int count = requestChunk(stimSet); + if (count < 0) { return false; } + if (count == 0) { return true; } + m_callback->setSamples(m_sample, count); + m_callback->setStimulationSet(stimSet); + + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + + return true; +} + +bool CDriverFieldtrip::stop() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted()) { return false; } + + return true; +} + +bool CDriverFieldtrip::uninitialize() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (m_driverCtx.isStarted()) { return false; } + + if (close_connection(m_connectionID) != 0) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to disconnect correctly from Fieldtrip buffer\n"; } + m_connectionID = -1; + + delete [] m_sample; + m_sample = nullptr; + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverFieldtrip::isConfigurable() +{ + return true; // change to false if your device is not configurable +} + +bool CDriverFieldtrip::configure() +{ + CConfigurationFieldtrip config(Directories::getDataDir() + "/applications/acquisition-server/interface-Fieldtrip.ui"); + config.setMinSamples(m_minSamples); + config.setHostPort(m_portNumber); + config.setHostName(m_hostName); + config.setSRCorrection(m_correctNonIntegerSR); + + if (config.configure(m_header)) + { + m_minSamples = config.getMinSamples(); + m_portNumber = config.getHostPort(); + m_hostName = config.getHostName(); + m_correctNonIntegerSR = config.getSRCorrection(); + + m_settings.save(); + + return true; + } + + return false; +} + +//___________________________________________________________________// +// // +bool CDriverFieldtrip::requestHeader() +{ + m_waitDataRequest->def->command = GET_HDR; + m_waitDataRequest->def->version = VERSION; + m_waitDataRequest->def->bufsize = 0; + m_waitDataRequest->buf = nullptr; + + message_t* response = nullptr; + + const int res = clientrequest(m_connectionID, m_waitDataRequest, &response); + + if (res != 0) + { + FreeResponse(response, "Error while asking for header. Buffer aborted ?"); + return false; + } + else if (response == nullptr || response->def == nullptr) + { + FreeResponse(response, "Error while asking for header"); + return false; + } + else if (response->def->command != GET_OK || response->def->bufsize == 0) + { + FreeResponse(response, "No header in the buffer"); + return false; + } + else + { + const unsigned int size = response->def->bufsize; + headerdef_t* headerDef = (headerdef_t*)response->buf; + + if (size < sizeof(headerdef_t)) + { + FreeResponse(response, "Header received has wrong format"); + return false; + } + + m_header.setSamplingFrequency(uint32_t(headerDef->fsample)); + m_realSampling = headerDef->fsample; + m_header.setChannelCount(headerDef->nchans); + m_dataType = headerDef->data_type; + + if (m_dataType != DATATYPE_FLOAT32 && m_dataType != DATATYPE_FLOAT64) + { + FreeResponse(response, "Data type is not supported"); + return false; + } + + if (size == sizeof(headerdef_t)) //no chunk attached to the header + { + for (uint32_t i = 0; i < headerDef->nchans; i++) { m_header.setChannelName(i, ("Channel " + std::to_string(i)).c_str()); } + } + else //chunk(s) attached to the header, maybe channel names + { + int bytesInHeaderBuffer = headerDef->bufsize; + void* chunk = (headerdef_t*)headerDef + 1; + bool foundChannelNames = false; + + while (bytesInHeaderBuffer > 0) + { + if (((ft_chunk_t*)chunk)->def.type == FT_CHUNK_CHANNEL_NAMES) + { + foundChannelNames = true; + char* chunkdata = ((ft_chunk_t*)chunk)->data; + for (uint32_t i = 0; i < headerDef->nchans; i++) + { + std::string name = chunkdata; + m_header.setChannelName(i, name.c_str()); + chunkdata = (char*)chunkdata + name.size() + 1; + } + } + + bytesInHeaderBuffer -= ((ft_chunk_t*)chunk)->def.size + sizeof(ft_chunkdef_t); + if (bytesInHeaderBuffer > 0) { chunk = (char*)chunk + ((ft_chunk_t*)chunk)->def.size + sizeof(ft_chunkdef_t); } + } + + if (!foundChannelNames) + { + for (uint32_t i = 0; i < headerDef->nchans; i++) { m_header.setChannelName(i, ("Channel " + std::to_string(i)).c_str()); } + } + } + } /* end valid header */ + + FreeResponse(response, nullptr); + + return true; +} + + +int CDriverFieldtrip::requestChunk(CStimulationSet& oStimulationSet) +{ + //There are two basic opertations: + // - configure m_getDataRequest and m_waitDataRequest + // - use m_getDataRequest to call fieldtrip clientrequest() that gets the data from fieldtrip + // - transpose the data to fill m_sample in the correct way expected by OpenVube + //The rest are data validity checks and correction for non-integer sampling frequency + + //configure "wait data" request + m_waitDataRequest->def->command = WAIT_DAT; + m_waitDataRequest->def->version = VERSION; + + if (m_waitDataRequest->buf == nullptr) + { + m_waitDataRequest->def->bufsize = 0; + waitdef_t* waitDef = new waitdef_t(); + unsigned int requestSize = 0; + requestSize = append((void**)&m_waitDataRequest->def, sizeof(messagedef_t), waitDef, sizeof(waitdef_t)); + m_waitDataRequest->def->bufsize = requestSize - sizeof(messagedef_t); + m_waitDataRequest->buf = (messagedef_t*)m_waitDataRequest->def + 1; + } + + waitdef_t* waitDef = (waitdef_t*)m_waitDataRequest->buf; + waitDef->threshold.nevents = 0xFFFFFFFF; + waitDef->threshold.nsamples = m_nSamplePerSentBlock; + waitDef->milliseconds = m_waitingTimeMs; + + message_t* response = nullptr; + int res = clientrequest(m_connectionID, m_waitDataRequest, &response); + + uint32_t nDataReceived = 0; + uint32_t nDataToSend = 0; + + if (res) + { + FreeResponse(response, "Error while asking for data. Buffer aborted ?"); + return -1; + } + else if (response == nullptr || response->def == nullptr) + { + FreeResponse(response, "Error while asking for data"); + return -1; + } + else if (response->def->command != WAIT_OK || response->def->bufsize != 8 || response->buf == nullptr) + { + FreeResponse(response, "No header in buffer anymore"); + return -1; + } + else + { + // new header received ? stop acquisition + if (((samples_events_t*)response->buf)->nsamples < m_nTotalSample) + { + FreeResponse(response, "End of data"); + return -1; + } + + // no new data + if (((samples_events_t*)response->buf)->nsamples <= m_nTotalSample + m_minSamples) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "No new data\n"; + FreeResponse(response, nullptr); + return 0; + } + + // get data + uint32_t lastSample = ((samples_events_t*)response->buf)->nsamples; + if (lastSample > m_nTotalSample + m_nSamplePerSentBlock) + { + if (m_firstGetDataRequest) { m_nTotalSample = lastSample - m_nSamplePerSentBlock; } + else { lastSample = m_nTotalSample + m_nSamplePerSentBlock; } + } + + if (m_firstGetDataRequest) { m_firstGetDataRequest = false; } + + FreeResponse(response, nullptr); //prevents memory leak + + // "get data" request + m_getDataRequest->def->command = GET_DAT; + m_getDataRequest->def->version = VERSION; + + if (m_getDataRequest->buf == nullptr) + { + m_getDataRequest->def->bufsize = 0; + datasel_t* dataSel = new datasel_t(); + unsigned int requestSize = 0; + requestSize = append((void**)&m_getDataRequest->def, sizeof(messagedef_t), dataSel, sizeof(datasel_t)); + m_getDataRequest->def->bufsize = requestSize - sizeof(messagedef_t); + m_getDataRequest->buf = (messagedef_t*)m_getDataRequest->def + 1; + } + + datasel_t* dataSel = (datasel_t*)m_getDataRequest->buf; + dataSel->begsample = m_nTotalSample; + dataSel->endsample = lastSample - 1; + + //actual data acquisition + res = clientrequest(m_connectionID, m_getDataRequest, &response); + + if (res || !response || !response->def || response->def->version != VERSION) + { + FreeResponse(response, "Error while asking for data"); + return -1; + } + else if (response->def->command != GET_OK || response->def->bufsize == 0 || response->buf == nullptr) + { + FreeResponse(response, "Data are not available anymore"); + return -1; + } + else // data received + { + datadef_t* datadef = (datadef_t*)response->buf; + void* databuf = (datadef_t*)response->buf + 1; + if (datadef->bufsize / (wordsize_from_type(datadef->data_type) * datadef->nchans) != lastSample - m_nTotalSample) + { + FreeResponse(response, "Data received from buffer are invalid"); + return -1; + } + else // data correct + { + nDataReceived = lastSample - m_nTotalSample; + + // Delete some samples if necessary. + // Sampling rate is converted into integer in openvibe, + // so we can have up to 1 sample too many per second. + nDataToSend = nDataReceived; + + if (m_correctNonIntegerSR) + { + m_driftSinceLastCorrection += (m_diffPerSample * nDataReceived); + if (m_driftSinceLastCorrection >= 1.0) + { + // delete samples + const uint32_t diffSamples = uint32_t(m_driftSinceLastCorrection); + nDataToSend -= diffSamples; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Correction for non-integer sampling rate : " << diffSamples << " samples deleted\n"; + m_driftSinceLastCorrection -= double(diffSamples); + //oStimulationSet.appendStimulation(OVTK_GDF_Missing, CTime(m_header.getSamplingFrequency(), nDataToSend).time(), CTime(m_header.getSamplingFrequency(), diffSamples)).time(); + } + } + + // set data in m_sample + double* buffer64; + float* buffer32; + switch (m_dataType) + { + case DATATYPE_FLOAT64: + buffer64 = (double*)databuf; + for (size_t j = 0; j < m_header.getChannelCount(); j++) + { + for (uint32_t i = 0; i < nDataToSend; i++) + { + const double value = buffer64[i * m_header.getChannelCount() + j]; + /*if ( _isnan(value) || !_finite(value) || value==DBL_MAX ) + { + m_sample[j*nDataToSend + i] = FLT_MAX; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "NaN or infinite sample received.\n"; + } + else + { + //data from IHM implant are in volts, must be in uvolts in openvibe + m_sample[j*nDataToSend + i] = (float) 1000000.0f*value; + }*/ + m_sample[j * nDataToSend + i] = float(value); + } + } + break; + case DATATYPE_FLOAT32: + + buffer32 = (float*)databuf; + for (size_t j = 0; j < m_header.getChannelCount(); j++) + { + for (uint32_t i = 0; i < nDataToSend; i++) + { + const float value = buffer32[i * m_header.getChannelCount() + j]; + /*if ( _isnan(value) || !_finite(value) || value==FLT_MAX ) + { + m_sample[j*nDataToSend + i] = FLT_MAX; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "NaN or infinite sample received.\n"; + } + else + { + //data from IHM implant are in volts, must be in uvolts in openvibe + m_sample[j*nDataToSend + i] = 1000000.0f*value; + }*/ + m_sample[j * nDataToSend + i] = value; + } + } + break; + default: + FreeResponse(response, "DEV ERROR : data type not suppported"); + return -1; + }//end switch + }//end data correct + }//end data received + + FreeResponse(response, nullptr);//we copied the data from response, so now we need to release this memory to avoid memory leak + + m_nTotalSample = lastSample; + } + + return nDataToSend; // no error +} + +void CDriverFieldtrip::FreeResponse(message_t* response, const char* message) +{ + if (message != nullptr) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << message << "\n"; } + + if (response->buf) { free(response->buf); } + if (response->def) { free(response->def); } + free(response); + response = nullptr; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/ovasCDriverFieldtrip.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/ovasCDriverFieldtrip.h new file mode 100644 index 0000000..a036abb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/field-trip-protocol/src/ovasCDriverFieldtrip.h @@ -0,0 +1,93 @@ +/* This driver uses the FieldTrip buffer open source library. + * See http://www.ru.nl/fcdonders/fieldtrip for details. + */ +#pragma once + +#if defined(TARGET_HAS_PThread) + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include + +#include "fieldtrip/message.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +// for GET_CPU_TIME +#include +#include + +namespace OpenViBE +{ + namespace AcquisitionServer + { + /** + * \class CDriverFieldtrip + * \author Amelie Serpollet (CEA/LETI/CLINATEC) + * \date Mon May 23 09:48:21 2011 + * \brief The CDriverFieldtrip allows the acquisition server to acquire data from a Fieldtrip buffer. + * + * TODO: details + * + */ + class CDriverFieldtrip final : public IDriver + { + public: + + CDriverFieldtrip(IDriverContext& ctx); + ~CDriverFieldtrip() override; + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + void FreeResponse(message_t* response, const char* message); + + protected: + + bool requestHeader(); + int requestChunk(CStimulationSet& oStimulationSet); + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + SettingsHelper m_settings; + uint32_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + uint32_t m_dataType = DATATYPE_UNKNOWN; + + // Connection to Fieldtrip buffer + CString m_hostName = "localhost"; + uint32_t m_portNumber = 1979; + int m_connectionID = -1; + uint32_t m_minSamples = 1; + + // Avoid frequent memory allocation + message_t* m_waitDataRequest = nullptr; + message_t* m_getDataRequest = nullptr; + + uint32_t m_nTotalSample = 0; + uint32_t m_waitingTimeMs = 0; + + bool m_firstGetDataRequest = false; + + bool m_correctNonIntegerSR = true; // ??? + double m_realSampling = 0; + double m_diffPerSample = 0; // ??? + double m_driftSinceLastCorrection = 0; + + // count time lost for "get cpu time" : + //double m_mesureLostTime = 0; + //uint32_t m_mesureNumber = 0; + }; + } // namespace AcquisitionServer +} // namespace OpenViBE +#endif // #if defined(TARGET_HAS_PThread) diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/README b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/README new file mode 100644 index 0000000..5a24fe6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/README @@ -0,0 +1,88 @@ +The MIT License (MIT) + +Copyright (c) 2015 Thomas Stewart + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Acknowledgements: + +This driver was written by Tom Stewart under the supervision of +Dr. Tomasz M. Rutkowski in the University of Tsukuba's BCI Laboratory +http://bci-lab.info/ + +Installation: + +The driver was developed using gtec's Linux C API 1.14.02. For it build properly, +the install.sh supplied with the gtec API needs to have been run which should +have created the following files: + +/usr/lib/libgusbampapiso.so.1.14.02 +/usr/include/gAPI.h +/etc/gtec/filter_files/DSPfilter.bin +/etc/gtec/filter_files/DSPNotchfilter.bin + +To access the USB without being root, you'll need to add yourself to the +plugdev group and write a udev rule. + +To do that, first check if there is a plugdev group: + +$ groups + +If there isn't already a plugdev group, then add it using: + +$ sudo groupadd plugdev + +Now execute the following: + +$ sudo usermod -a -G plugdev + +If you're not sure what your username is, check it with: + +$ whoami + +Next create a file named /etc/udev/rules.d/10-gusbamp-usb.rules + +$ sudo touch /etc/udev/rules.d/10-gusbamp-usb.rules + +And open it with nano editor + +$ sudo nano /etc/udev/rules.d/10-gusbamp-usb.rules + +Now paste the following line into the editor: + +ATTRS{idProduct}=="0001", ATTRS{idVendor}=="153c", MODE="666", GROUP="plugdev" + +The values for idProduct and idVendor should match the ones that show up just +after you've plugged in the amplifier and executed: + +$ dmesg + +Lastly, be sure to log out and back in. + +Useage: + +The driver gives access to everything in the API with the exception of the channel +calibration and asynchronous configuration for digital outputs. + +To run multiple gUSBAmps in parallel, use multiple instances of the acquisition server +and configure each instance as Master / Slave according to gtec's documentation. When +starting the acquisition, first connect to all the devices then press play on each device +starting with the master. + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/share/interface-GTecGUSBampLinux.ui b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/share/interface-GTecGUSBampLinux.ui new file mode 100644 index 0000000..45ae58b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/share/interface-GTecGUSBampLinux.ui @@ -0,0 +1,2529 @@ + + + + + + 100 + 18 + 1 + 10 + + + 100 + 1 + 10 + + + 1 + 16 + 16 + 1 + 10 + + + -250 + 250 + 1 + 10 + + + 1 + 100 + 1 + 10 + + + -200 + 200 + 1 + 10 + + + 16 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 32 + + + 64 + + + 128 + + + 256 + + + 512 + + + 600 + + + 1200 + + + 2400 + + + 4800 + + + + + + + + + + + square + + + sawtooth + + + sine + + + drl + + + noise + + + + + + + + + + + + + none + -2 + + + autoset + -1 + + + + + + + + + + + + + + + + + + + + + 1 + 0 + none + -2 + none + -2 + + + 2 + 0 + none + -2 + none + -2 + + + 3 + 0 + none + -2 + none + -2 + + + 4 + 0 + none + -2 + none + -2 + + + 5 + 0 + none + -2 + none + -2 + + + 6 + 0 + none + -2 + none + -2 + + + 7 + 0 + none + -2 + none + -2 + + + 8 + 0 + none + -2 + none + -2 + + + 9 + 0 + none + -2 + none + -2 + + + 10 + 0 + none + -2 + none + -2 + + + 11 + 0 + none + -2 + none + -2 + + + 12 + 0 + none + -2 + none + -2 + + + 13 + 0 + none + -2 + none + -2 + + + 14 + 0 + none + -2 + none + -2 + + + 15 + 0 + none + -2 + none + -2 + + + 16 + 0 + none + -2 + none + -2 + + + + + + + + + + + + + + + + + normal + + + impedance + + + calibrate + + + counter + + + + + + + + + + + + + none + -2 + + + autoset + -1 + + + + + False + 5 + Device configuration + center + dialog + center + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + False + True + + + False + False + 1 + + + + + False + True + -1 + + + + + True + False + g.tec g.USBamp Linux driver (by BCI-Lab @ University of Tsukuba) + center + + + False + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + + + True + False + Identifier : + right + True + + + True + True + 0 + + + + + True + True + + True + False + False + True + True + adjustment2 + True + True + + + True + True + 1 + + + + + True + False + Age : + right + True + + + True + True + 2 + + + + + True + True + + True + False + False + True + True + adjustment1 + True + True + + + True + True + 3 + + + + + True + False + Gender : + right + True + + + True + True + 4 + + + + + 2 + True + False + model1 + 0 + + + + 0 + + + + + True + True + 5 + + + + + False + False + 2 + + + + + True + False + 8 + 8 + + + True + False + + + False + True + 0 + + + + + True + False + + + True + False + 6 + 2 + True + + + True + False + Device: + + + + + True + False + model_device + 1 + + + + 0 + + + + + 1 + 2 + + + + + + True + False + Number of channels : + right + True + + + 1 + 2 + + + + + True + True + + True + False + False + True + True + adjustment3 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + False + Sampling frequency : + right + True + + + 2 + 3 + + + + + True + False + model2 + 4 + + + + 0 + + + + + 1 + 2 + 2 + 3 + GTK_EXPAND + + + + + Shortcut + True + True + False + False + True + + + 1 + 2 + 5 + 6 + + + + + Trigger + True + True + False + False + True + + + 1 + 2 + 4 + 5 + + + + + Scan DIO + True + True + False + False + True + + + 5 + 6 + + + + + Slave + True + True + False + False + True + + + 4 + 5 + + + + + True + False + Mode: + right + True + + + 3 + 4 + + + + + True + False + model_mode + 0 + + + + 0 + + + + + 1 + 2 + 3 + 4 + GTK_EXPAND + + + + + True + True + 0 + + + + + True + False + + + True + False + Signal Generator: + + + True + True + 5 + 0 + + + + + True + False + 4 + 2 + + + True + False + Frequency (Hz) + + + 3 + 4 + + + + + True + False + Offset (mV) + + + 2 + 3 + + + + + True + False + Amplitude (mV) + + + 1 + 2 + + + + + True + False + Shape + + + + + True + False + model_analog_output + 2 + + + + 0 + + + + + 1 + 2 + GTK_EXPAND + 5 + + + + + True + True + + True + False + False + True + True + adjustment_analog_amplitude + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + + True + False + False + True + True + adjustment_analog_offset + True + True + + + 1 + 2 + 2 + 3 + + + + + True + True + + True + False + False + True + True + adjustment_analog_frequency + True + True + + + 1 + 2 + 3 + 4 + + + + + True + True + 1 + + + + + True + True + 12 + 1 + + + + + 171 + True + False + 5 + 3 + + + True + False + Block D + + + 4 + 5 + + + + + True + False + Block C + + + 3 + 4 + + + + + True + False + Block B + + + 2 + 3 + + + + + True + False + Block A + + + 1 + 2 + + + + + True + True + False + False + True + True + + + 1 + 2 + 4 + 5 + + + + + + True + True + False + False + True + True + + + 1 + 2 + 2 + 3 + + + + + + True + True + False + False + True + True + + + 1 + 2 + 1 + 2 + + + + + + True + True + False + False + True + True + + + 2 + 3 + 4 + 5 + + + + + + True + True + False + False + True + True + + + 2 + 3 + 3 + 4 + + + + + + True + True + False + False + True + True + + + 2 + 3 + 2 + 3 + + + + + + True + True + False + False + True + True + + + 2 + 3 + 1 + 2 + + + + + + True + False + + + + + True + False + Common +Ground + center + + + 1 + 2 + 4 + + + + + True + False + Common +Reference + center + + + 2 + 3 + 5 + + + + + True + True + False + False + True + True + + + 1 + 2 + 3 + 4 + + + + + + True + True + 2 + + + + + True + False + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + 16 + + + True + False + 4 + 3 + + + True + False + Notch + center + + + 3 + 4 + + + + + + Apply >> + 0 + True + True + True + False + + + 2 + 3 + 3 + 4 + + GTK_EXPAND + + + + + Apply >> + 0 + True + True + True + False + + + 2 + 3 + 2 + 3 + + GTK_EXPAND + + + + + Apply >> + 0 + True + True + True + False + + + 2 + 3 + 1 + 2 + + GTK_EXPAND + + + + + True + False + Bandpass + center + + + 2 + 3 + + + + + + True + False + Bipolar + center + + + 1 + 2 + + + + + + True + False + model_notch + 0 + + + + 0 + + + + + 1 + 2 + 3 + 4 + GTK_EXPAND + + + + + 150 + True + False + model_bandpass + 0 + + + + 0 + + + + + 1 + 2 + 2 + 3 + GTK_EXPAND + + + + + True + True + + True + False + False + True + True + adjustment_bipolar + True + True + + + 1 + 2 + 1 + 2 + + + + + True + False + + + GTK_FILL + + + + + True + False + + + 1 + 2 + GTK_FILL + + + + + True + False + + + 2 + 3 + GTK_FILL + + + + + True + True + 0 + + + + + True + True + automatic + automatic + + + 459 + 236 + True + True + model_channel_config + False + 0 + True + + + True + # + + + + 0 + + + + + + + True + BP + + + + 1 + + + + + + + True + Notch + + + + 2 + + + + + + + True + Bandpass + + + + 4 + + + + + + + + + True + True + 1 + + + + + True + True + 3 + + + + + True + False + + + True + False + + + True + True + 0 + + + + + Change channel names + True + True + True + False + + + True + True + 1 + + + + + True + False + + + True + True + 2 + + + + + False + True + 4 + + + + + True + False + + + False + True + 5 + + + + + True + False + + + True + False + + + True + False + Block A + + + True + True + 0 + + + + + True + False + Block B + + + True + True + 1 + + + + + True + False + Block C + + + True + True + 2 + + + + + True + False + Block D + + + True + True + 3 + + + + + True + True + 0 + + + + + True + False + + + True + False + 3 + 4 + + + True + False + 1 + center + + + + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 1 + 2 + + + + + + True + False + 3 + right + + + 2 + 3 + + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 3 + 4 + + 6 + + + + + True + False + 2 + 2 + right + + + 1 + 2 + + 5 + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 1 + 2 + 1 + 2 + + + + + + True + False + 4 + center + + + 2 + 3 + 1 + 2 + + 5 + + + + + True + False + R1 + center + + + 2 + 3 + 2 + 3 + + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 3 + 4 + 1 + 2 + + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 3 + 4 + 2 + 3 + + + + + + True + False + + + 2 + 3 + + + + + + True + False + + + 1 + 2 + 2 + 3 + + + + + + True + False + 0 + + + + + True + False + 3 + 4 + + + True + False + 5 + center + + + + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 1 + 2 + + + + + + True + False + 7 + center + + + 2 + 3 + + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 3 + 4 + + + + + + True + False + 6 + center + + + 1 + 2 + + 5 + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 1 + 2 + 1 + 2 + + + + + + True + False + 8 + center + + + 2 + 3 + 1 + 2 + + 5 + + + + + True + False + R2 + center + + + 2 + 3 + 2 + 3 + + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 3 + 4 + 1 + 2 + + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 3 + 4 + 2 + 3 + + + + + + True + False + + + 1 + 2 + 2 + 3 + + + + + + True + False + + + 2 + 3 + + + + + + True + False + 1 + + + + + True + False + 3 + 4 + + + True + False + 9 + center + + + + 5 + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 1 + 2 + + + + + + True + False + 11 + center + + + 2 + 3 + + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 3 + 4 + + + + + + True + False + 10 + center + + + 1 + 2 + + 5 + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 1 + 2 + 1 + 2 + + + + + + True + False + 12 + center + + + 2 + 3 + 1 + 2 + + 5 + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 3 + 4 + 1 + 2 + + + + + + True + False + R3 + center + + + 2 + 3 + 2 + 3 + + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 3 + 4 + 2 + 3 + + + + + + True + False + + + 1 + 2 + 2 + 3 + + + + + + True + False + + + 2 + 3 + + + + + + True + False + 2 + + + + + True + False + 3 + 4 + + + True + False + 13 + center + + + + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 1 + 2 + + + + + + True + False + 15 + center + + + 2 + 3 + + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 3 + 4 + + + + + + True + False + 14 + center + + + 1 + 2 + + 5 + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 1 + 2 + 1 + 2 + + + + + + True + False + 16 + center + + + 2 + 3 + 1 + 2 + + 5 + + + + + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 3 + 4 + 1 + 2 + + + + + + True + False + R4 + center + + + 2 + 3 + 2 + 3 + + + + + + 45 + True + True + False + + 4 + 0.5 + True + False + False + True + True + + + 3 + 4 + 2 + 3 + + + + + + True + False + + + 2 + 3 + + + + + + True + False + + + 1 + 2 + 2 + 3 + + + + + + True + False + 3 + + + + + True + True + 6 + 1 + + + + + True + False + + + True + False + + + True + True + 0 + + + + + Check Impedance + True + True + True + False + + + True + True + 1 + + + + + True + False + + + True + True + 2 + + + + + True + False + 2 + + + + + True + True + 6 + + + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + + button_apply + button_cancel + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/src/Queue.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/src/Queue.h new file mode 100644 index 0000000..c05d953 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/src/Queue.h @@ -0,0 +1,120 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyGUSBampCAPI_Linux + +#include +#include + +#ifndef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif + +template +class Queue +{ + T* buffer = nullptr; + int head = 0, tail = 0, size = 0; + +public: + Queue() { } + + Queue(T* array, const int len) + { + size = len; + buffer = array; + } + + void SetBuffer(T* array, const int len) + { + size = len; + head = tail = 0; + buffer = array; + } + + int Get(T* elements, int len) + { + // Trim the length if necessary to only as large as the number of available elements in the buffer + len = MIN(len, Avail()); + + int nonwrapped = MIN((size - tail), len); + const int wrapped = len - nonwrapped; + + // memcpy the data starting at the head all the way up to the last element *(storage - 1) + memcpy(elements, (buffer + tail), nonwrapped * sizeof(T)); + + // If there's still data to copy memcpy whatever remains, starting at the first element *(begin) until the end of data. The first step will have ensured + // that we don't crash into the tail during this process. + memcpy((elements + nonwrapped), buffer, wrapped * sizeof(T)); + + // Recalculate head + tail = (tail + nonwrapped + wrapped) % size; + + return len; + } + + // Returns the number of bytes actually placed in the array + int Put(const T* elements, int len) + { + // Trim the length if necessary to only as large as the nuber of free elements in the buffer + len = MIN(len, Free()); + + // Figure out how much to append to the end of the buffer and how much will overlap onto the start + int nonwrapped = MIN((size - head), len); + const int wrapped = len - nonwrapped; + + // memcpy the data starting at the head all the way up to the last element *(storage - 1) + memcpy((buffer + head), elements, nonwrapped * sizeof(T)); + + // If there's still data to copy memcpy whatever remains onto the beginning of the array + memcpy(buffer, (elements + nonwrapped), wrapped * sizeof(T)); + + // Re-recalculate head + head = (head + nonwrapped + wrapped) % size; + + return len; + } + + // Expand the size of queue without actually modifying any of the contents - useful for copying directly onto the queu buffer + int Pad(int len) + { + // Trim the length if necessary to only as large as the nuber of free elements in the buffer + len = MIN(len, Free()); + + // Figure out how much to append to the end of the buffer and how much will overlap onto the start + const int nonwrapped = MIN((size - head), len), wrapped = len - nonwrapped; + + // Re-recalculate head + head = (head + nonwrapped + wrapped) % size; + + return len; + } + + // Removes the oldest entry from the Queue + void Pop() { if (Avail()) tail = (tail + 1) % size; } + + // Returns the oldest element in the array (the one added before any other) + T& Tail() { return buffer[tail]; } + + // Returns the newest element in the array (the one added after every other) + T& Head() { return buffer[(head + size - 1) % size]; } + + T& operator[](int n) { return buffer[tail + n % size]; } + + void Clear() { head = tail = 0; } + + int Avail() const { return (size + head - tail) % size; } + + int Free() const { return (size - 1 - Avail()); } + + // Gets the number of free elements that can be stored contiguously + int FreeContiguous() { return head < tail ? tail - head - 1 : MIN(size - head, Free()); } + + // Gets a pointer to the next free address in the buffer + T* NextFreeAddress() { return buffer + head; } +}; + +#endif // TARGET_HAS_ThirdPartyGUSBampCAPI_Linux diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/src/ovasCConfigurationGTecGUSBampLinux.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/src/ovasCConfigurationGTecGUSBampLinux.cpp new file mode 100644 index 0000000..80aa752 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/src/ovasCConfigurationGTecGUSBampLinux.cpp @@ -0,0 +1,545 @@ +#if defined TARGET_HAS_ThirdPartyGUSBampCAPI_Linux + +#include "ovasCConfigurationGTecGUSBampLinux.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +/*_________________________________________________ + +Callbacks to specific widgets +_________________________________________________*/ + +void button_apply_bipolar_pressed_cb(GtkButton* button, void* data) +{ + CConfigurationGTecGUSBampLinux* config = static_cast(data); + config->OnButtonApplyConfigPressed(CConfigurationGTecGUSBampLinux::BipolarColumn); +} + +void button_apply_bandpass_pressed_cb(GtkButton* button, void* data) +{ + CConfigurationGTecGUSBampLinux* config = static_cast(data); + config->OnButtonApplyConfigPressed(CConfigurationGTecGUSBampLinux::BandpassColumn); +} + +void button_apply_notch_pressed_cb(GtkButton* button, void* data) +{ + CConfigurationGTecGUSBampLinux* config = static_cast(data); + config->OnButtonApplyConfigPressed(CConfigurationGTecGUSBampLinux::NotchColumn); +} + +void button_check_impedance_pressed_cb(GtkButton* button, void* data) { gtk_button_set_label(button, "Checking..."); } + +void button_check_impedance_clicked_cb(GtkButton* button, void* data) +{ + CConfigurationGTecGUSBampLinux* config = static_cast(data); + config->OnButtonCheckImpedanceClicked(); +} + +void combobox_sampling_frequency_changed_cb(GtkComboBox* pCombobox, void* data) +{ + CConfigurationGTecGUSBampLinux* config = static_cast(data); + config->OnComboboxSamplingFrequencyChanged(); +} + +void DeviceChangedCB(GtkComboBox* pCombobox, void* data) +{ + CConfigurationGTecGUSBampLinux* config = static_cast(data); + config->OnComboboxDeviceChanged(); +} + +void entry_impedance_activate_cb(GtkEntry* pEntry, void* data) +{ + // Reset the background colour and stick a question mark on the box so the impedance check function will check this channel + GdkColor color; + color.red = color.green = color.blue = 0xFFFF; + gtk_entry_set_text(pEntry, "?"); + gtk_widget_modify_base(GTK_WIDGET(pEntry), GTK_STATE_NORMAL, &color); +} + +/*_________________________________________________*/ + +// If you added more reference attribute, initialize them here +CConfigurationGTecGUSBampLinux::CConfigurationGTecGUSBampLinux(IDriverContext& ctx, const char* gtkBuilderFilename, std::string* deviceName, + gt_usbamp_config* config) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx), m_deviceName(deviceName), m_config(config) {} + +void CConfigurationGTecGUSBampLinux::UpdateFilters() +{ + GtkListStore* listStore = GTK_LIST_STORE(gtk_builder_get_object(m_builder,"model_channel_config")); + GtkTreeView* treeView = GTK_TREE_VIEW(gtk_builder_get_object(m_builder,"treeview_channel_config")); + GtkTreeModel* treeModel = gtk_tree_view_get_model(treeView); + GtkTreeIter iter; + + // If the sampling frequency changes the filters may no longer be valid, so clear them all and have the user start again + for (gboolean end = gtk_tree_model_get_iter_first(treeModel, &iter); end; end = gtk_tree_model_iter_next(treeModel, &iter)) + { + gtk_list_store_set(listStore, &iter, NotchColumn, "none", -1); + gtk_list_store_set(listStore, &iter, NotchIdColumn, GT_FILTER_NONE, -1); + + gtk_list_store_set(listStore, &iter, BandpassColumn, "none", -1); + gtk_list_store_set(listStore, &iter, BandpassIdColumn, GT_FILTER_NONE, -1); + } + + // Get pointers to the comboboxes + GtkComboBox* comboBoxDevice = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + GtkComboBox* comboBoxSampling = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")); + + // Get the device name and the sample rate from the comboboxes + char* deviceName = gtk_combo_box_get_active_text(comboBoxDevice); + gt_size sampling = (gt_size)strtol(gtk_combo_box_get_active_text(comboBoxSampling), nullptr, 10); + + // This takes a while so we'll keep the user informed via the console - might have to put this in a thread at some point though + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Opening device [" << deviceName << "] to query filters ...\n"; + + // Try opening the device + if (GT_OpenDevice(deviceName)) + { + GtkTreeIter iterBandpass, iterNotch; + + GtkListStore* listStoreBandpass = GTK_LIST_STORE(gtk_builder_get_object(m_builder,"model_bandpass")); + GtkListStore* listStoreNotch = GTK_LIST_STORE(gtk_builder_get_object(m_builder,"model_notch")); + + // Clear all the entries from the filter comboboxes + gtk_list_store_clear(listStoreBandpass); + gtk_list_store_clear(listStoreNotch); + + // Add the none and autoset configurations back in + // none + gtk_list_store_append(listStoreBandpass, &iterBandpass); + gtk_list_store_set(listStoreBandpass, &iterBandpass, 0, "none", 1, GT_FILTER_NONE, -1); + gtk_list_store_append(listStoreNotch, &iterNotch); + gtk_list_store_set(listStoreNotch, &iterNotch, 0, "none", 1, GT_FILTER_NONE, -1); + + // autoset + gtk_list_store_append(listStoreBandpass, &iterBandpass); + gtk_list_store_set(listStoreBandpass, &iterBandpass, 0, "autoset", 1, GT_FILTER_AUTOSET, -1); + gtk_list_store_append(listStoreNotch, &iterNotch); + gtk_list_store_set(listStoreNotch, &iterNotch, 0, "autoset", 1, GT_FILTER_AUTOSET, -1); + + // Set the combo boxes to show none, it's a bit tidier that way + gtk_combo_box_set_active(GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_bandpass")), 0); + gtk_combo_box_set_active(GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_notch")), 0); + + // Get the sizes of the lists + gt_size bandpassListSize = GT_GetBandpassFilterListSize(deviceName, sampling); + gt_size notchListSize = GT_GetNotchFilterListSize(deviceName, sampling); + + // Allocate them + gt_filter_specification* bandpassList = new gt_filter_specification[bandpassListSize]; + gt_filter_specification* notchList = new gt_filter_specification[notchListSize]; + + // Get the lists themselves - note the last parameter to these two should be specified in bytes + GT_GetBandpassFilterList(deviceName, sampling, bandpassList, bandpassListSize * sizeof(gt_filter_specification)); + GT_GetNotchFilterList(deviceName, sampling, notchList, notchListSize * sizeof(gt_filter_specification)); + + // Repopulate the comboboxes - for each returned filter make a description and put it in the combobox + // Bandpass + for (uint32_t i = 0; i < bandpassListSize; ++i) + { + std::stringstream ss; + ss << "HP: " << bandpassList[i].f_lower << " / LP: " << bandpassList[i].f_upper; // HP = High Pass, LP = Low Pass + gtk_list_store_append(listStoreBandpass, &iterBandpass); + gtk_list_store_set(listStoreBandpass, &iterBandpass, 0, ss.str().c_str(), 1, bandpassList[i].id, -1); + } + // Notch + for (uint32_t i = 0; i < notchListSize; ++i) + { + std::stringstream ss; + ss << "HS: " << notchList[i].f_lower << " / LS: " << notchList[i].f_upper; // HS = High Stop, LS = Low Stop + gtk_list_store_append(listStoreNotch, &iterNotch); + gtk_list_store_set(listStoreNotch, &iterNotch, 0, ss.str().c_str(), 1, notchList[i].id, -1); + } + + GT_CloseDevice(deviceName); + } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not open device\n"; } +} + +bool CConfigurationGTecGUSBampLinux::preConfigure() +{ + char** deviceList = nullptr; + size_t size = 0; + + if (!CConfigurationBuilder::preConfigure()) return false; + + // Refresh and get the list of currently connnected devices + GT_UpdateDevices(); + size = GT_GetDeviceListSize(); + deviceList = GT_GetDeviceList(); + + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder,"combobox_device")); + + for (uint32_t i = 0; i < size; ++i) { gtk_combo_box_append_text(comboBox, deviceList[i]); } + + GT_FreeDeviceList(deviceList, size); + + // Connect all the callbacks + g_signal_connect(gtk_builder_get_object(m_builder, "button_apply_bipolar"), "pressed", G_CALLBACK(button_apply_bipolar_pressed_cb), this); + g_signal_connect(gtk_builder_get_object(m_builder, "button_apply_bandpass"), "pressed", G_CALLBACK(button_apply_bandpass_pressed_cb), this); + g_signal_connect(gtk_builder_get_object(m_builder, "button_apply_notch"), "pressed", G_CALLBACK(button_apply_notch_pressed_cb), this); + g_signal_connect(gtk_builder_get_object(m_builder, "button_check_impedance"), "pressed", G_CALLBACK(button_check_impedance_pressed_cb), this); + g_signal_connect(gtk_builder_get_object(m_builder, "button_check_impedance"), "clicked", G_CALLBACK(button_check_impedance_clicked_cb), this); + g_signal_connect(gtk_builder_get_object(m_builder, "combobox_sampling_frequency"), "changed", G_CALLBACK(combobox_sampling_frequency_changed_cb), this); + g_signal_connect(gtk_builder_get_object(m_builder, "combobox_device"), "changed", G_CALLBACK(DeviceChangedCB), this); + + // Connect up all the activate methods for the text entries so the user can select them and read the associated channel impedance + for (int i = 0; i < (GT_USBAMP_NUM_ANALOG_IN + GT_USBAMP_NUM_REFERENCE); ++i) + { + std::stringstream ss; + // Compile the string corresponding to the name of the widget displaying the impedance information + ss << "entry_impedance" << i + 1; + g_signal_connect(gtk_builder_get_object(m_builder, ss.str().c_str()), "focus-in-event", G_CALLBACK(entry_impedance_activate_cb), this); + } + + // Couldn't work out how to do this in the designer, set the treeview box to be able to select multiple items at once + GtkTreeView* treeView = GTK_TREE_VIEW(gtk_builder_get_object(m_builder,"treeview_channel_config")); + GtkTreeSelection* selection = gtk_tree_view_get_selection(treeView); + gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); + + // Now apply all the configs recovered from the settings helper to the GUI - don't have to worry about the sampling rate and number of channels though since they're already taken care of + + // First look through all the device names returned from the API. If any match the one recovered from the settings manager set that as active + GtkTreeModel* treeModelName = gtk_combo_box_get_model(comboBox); + GtkTreeIter itName; + for (gboolean end = gtk_tree_model_get_iter_first(treeModelName, &itName); end; end = gtk_tree_model_iter_next(treeModelName, &itName)) + { + gchar* filterDesc; + gtk_tree_model_get(treeModelName, &itName, 0, &filterDesc, -1); + + // If the name in the combo box matches the one passed in then make that entry active + if (*m_deviceName == filterDesc) // todo: check that this works with the API + { + gtk_combo_box_set_active_iter(comboBox, &itName); + } + + // Free the string now that we're finished with it + g_free(filterDesc); + } + + // todo: when we change the devicename combo box we should refresh all the filters as per sampling frequency changed. + + // And since we might have changed to a valid device name, let's update the filter combo boxes + UpdateFilters(); + + // Fill out the analog output configs + // Shape + GtkComboBox* comboBoxShape = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_analog_out_shape")); + gtk_combo_box_set_active(comboBoxShape, m_config->ao_config->shape); + // Amplitude + GtkSpinButton* buttonAmplitude = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder,"spinbutton_analog_out_amplitude")); + gtk_spin_button_set_value(buttonAmplitude, m_config->ao_config->amplitude); + // Offset + GtkSpinButton* buttonOffset = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder,"spinbutton_analog_out_offset")); + gtk_spin_button_set_value(buttonOffset, m_config->ao_config->offset); + // Frequency + GtkSpinButton* buttonFrequency = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder,"spinbutton_analog_out_frequency")); + gtk_spin_button_set_value(buttonFrequency, m_config->ao_config->frequency); + + // Fill out the options + // Slave + GtkToggleButton* checkButtonSlave = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_slave")); + gtk_toggle_button_set_active(checkButtonSlave, m_config->slave_mode); + // Shortcut + GtkToggleButton* buttonShortcut = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_shortcut")); + gtk_toggle_button_set_active(buttonShortcut, m_config->enable_sc); + // Shortcut + GtkToggleButton* buttonDio = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_dio")); + gtk_toggle_button_set_active(buttonDio, m_config->scan_dio); + // Trigger + GtkToggleButton* buttonTrigger = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_trigger")); + gtk_toggle_button_set_active(buttonTrigger, m_config->enable_trigger_line); + // Mode + GtkComboBox* comboBoxMode = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_mode")); + gtk_combo_box_set_active(comboBoxMode, m_config->mode); + + // Set all the blocks A-D to use the common ground and reference voltages + for (uint32_t i = 0; i < GT_USBAMP_NUM_GROUND; ++i) + { + GtkToggleButton* buttonGnd = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, ("checkbutton_block_gnd" + std::to_string(i + 1)).c_str())); + GtkToggleButton* buttonRef = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, ("checkbutton_block_ref" + std::to_string(i + 1)).c_str())); + + gtk_toggle_button_set_active(buttonGnd, m_config->common_ground[i]); + gtk_toggle_button_set_active(buttonRef, m_config->common_reference[i]); + } + + // Config each channel with the info from the configs, no need to check the filters and what not since they must have been correct to have been stored alongside eachother + GtkListStore* listStore = GTK_LIST_STORE(gtk_builder_get_object(m_builder,"model_channel_config")); + int i = 0; + + GtkTreeModel* treeModelChannel = gtk_tree_view_get_model(treeView); + GtkTreeIter itChannel; + for (gboolean end = gtk_tree_model_get_iter_first(treeModelChannel, &itChannel); end; end = gtk_tree_model_iter_next(treeModelChannel, &itChannel), i++) + { + // Look through each value in the bandpass model and if there's one that has an id that matches, set it's text to the channel configs + GtkTreeModel* treeModelBandpass = GTK_TREE_MODEL(gtk_builder_get_object(m_builder,"model_bandpass")); + GtkTreeIter itBandpass; + for (gboolean end2 = gtk_tree_model_get_iter_first(treeModelBandpass, &itBandpass); end2; end2 = gtk_tree_model_iter_next(treeModelBandpass, &itBandpass)) + { + gchar* filterDesc; + gint filterID; + gtk_tree_model_get(treeModelBandpass, &itBandpass, 0, &filterDesc, 1, &filterID, -1); + + // If the id is the same as the one in the config, we've found the filter that was set last time + if (filterID == m_config->bandpass[i]) { gtk_list_store_set(listStore, &itChannel, BandpassColumn, filterDesc, BandpassIdColumn, filterID, -1); } + + // Free the string now that we're finished with it + g_free(filterDesc); + } + + // Look through each value in the notch model and if there's one that has an id that matches, set it's text to the channel configs + GtkTreeModel* treeModelNotch = GTK_TREE_MODEL(gtk_builder_get_object(m_builder,"model_notch")); + GtkTreeIter iterNotch; + for (gboolean end2 = gtk_tree_model_get_iter_first(treeModelNotch, &iterNotch); end2; end2 = gtk_tree_model_iter_next(treeModelNotch, &iterNotch)) + { + gchar* filterDesc; + gint filterID; + gtk_tree_model_get(treeModelNotch, &iterNotch, 0, &filterDesc, 1, &filterID, -1); + + // If the id is the same as the one in the config, we've found the filter that was set last time + if (filterID == m_config->notch[i]) { gtk_list_store_set(listStore, &itChannel, NotchColumn, filterDesc, NotchIdColumn, filterID, -1); } + + // Free the string now that we're finished with it + g_free(filterDesc); + } + + // And just straight out set the bipolar channel config + gtk_list_store_set(listStore, &itChannel, BipolarColumn, gint(m_config->bipolar[i] == GT_BIPOLAR_DERIVATION_NONE ? 0 : m_config->bipolar[i]), -1); + } + + return true; +} + +void CConfigurationGTecGUSBampLinux::OnButtonApplyConfigPressed(ChannelTreeViewColumn type) +{ + // Get the tree view widget + GtkTreeView* treeView = GTK_TREE_VIEW(gtk_builder_get_object(m_builder,"treeview_channel_config")); + + // Now get it's model, both as a list store so we can set the entries and it's "base class" tree model so we can iterate through it + GtkTreeModel* treeModel = gtk_tree_view_get_model(treeView); + GtkListStore* listStore = GTK_LIST_STORE(gtk_builder_get_object(m_builder,"model_channel_config")); + + // Also get the subset of paths that are selected, if any + GtkTreeSelection* selection = gtk_tree_view_get_selection(treeView); + + // Iterate through them and set the fields + GtkTreeIter iter; + for (gboolean end = gtk_tree_model_get_iter_first(treeModel, &iter); end; end = gtk_tree_model_iter_next(treeModel, &iter)) + { + // If the given row is selected + if (gtk_tree_selection_iter_is_selected(selection, &iter)) + { + // Fill in the bipolar field with the spin button contents if the bipolar apply button was pressed + if (type == BipolarColumn) + { + GtkSpinButton* button = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder,"spinbutton_bipolar")); + gtk_list_store_set(listStore, &iter, BipolarColumn, gint(gtk_spin_button_get_value(button)), -1); + } + + // Fill in the filter field with the combobox contents and fill in a hidden field id with another hidden field in the combobox model that stores the filter's id + gint filterId; + GtkTreeIter selectedComboIter; + + if (type == NotchColumn) + { + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_notch")); + + // Get the iterator for the active row in the combo box's model + gtk_combo_box_get_active_iter(comboBox, &selectedComboIter); + // Get the value of the id column of that row + gtk_tree_model_get(gtk_combo_box_get_model(comboBox), &selectedComboIter, 1, &filterId, -1); + // Put the combo box text in the tree view and the id value in the hidden column of the tree view's model + gtk_list_store_set(listStore, &iter, NotchColumn, gtk_combo_box_get_active_text(comboBox), NotchIdColumn, filterId, -1); + } + + if (type == BandpassColumn) + { + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_bandpass")); + + // Get the iterator for the active row in the combo box's model + gtk_combo_box_get_active_iter(comboBox, &selectedComboIter); + // Get the value of the id column of that row + gtk_tree_model_get(gtk_combo_box_get_model(comboBox), &selectedComboIter, 1, &filterId, -1); + // Put the combo box text in the tree view and the id value in the hidden column of the tree view's model + gtk_list_store_set(listStore, &iter, BandpassColumn, gtk_combo_box_get_active_text(comboBox), BandpassIdColumn, filterId, -1); + } + } + } +} + +// We'll make this just check the impedance of the selcected box. +void CConfigurationGTecGUSBampLinux::OnButtonCheckImpedanceClicked() +{ + int impedance; + GdkColor color; + + // Get the name of the selected device + GtkComboBox* comboBoxDevice = GTK_COMBO_BOX(gtk_builder_get_object(m_builder,"combobox_device")); + char* deviceName = gtk_combo_box_get_active_text(comboBoxDevice); + + // This takes a while so we'll keep the user informed via the console - might have to put this in a thread at some point though + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Opening device [" << deviceName << "] for impedance check ...\n"; + + // Try opening the device + if (GT_OpenDevice(deviceName)) + { + // If that worked then for each channel + for (uint32_t i = 0; i < (GT_USBAMP_NUM_ANALOG_IN + GT_USBAMP_NUM_REFERENCE); ++i) + { + // Reset the color so we don't get one impedance's color bleeding into the next + color.red = color.green = color.blue = color.pixel = 0; + + // Compile the string corresponding to the name of the widget displaying the impedance information + std::string name = "entry_impedance" + std::to_string(i + 1); + // Get the relevant text entry + GtkEntry* text = GTK_ENTRY(gtk_builder_get_object(m_builder, name.c_str())); + + if (strcmp(gtk_entry_get_text(text), "?") == 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Reading from channel " << i + 1 << "...\n"; + + // Try to get the impedance for each channel (channels 17 - 20 correspond to references A through D) + if (GT_GetImpedance(deviceName, i + 1, &impedance)) + { + // Convert the impedance into kohms + impedance /= 1000; + + // impedance is good + if (impedance < LowImpedance) { color.green = 0xFFFF; } + // impedance is moderate + else if (impedance < ModerateImpedance) { color.red = color.green = 0xFFFF; } + // impedance is high + else if (impedance < HighImpedance) { color.red = 0xFFFF; } + // impedance is so high that the channel is probably not connected + else { color.blue = 0xFFFF; } + + // If the impedance is larger than 100kohm just write NC + std::string tmp = (impedance < HighImpedance) ? std::to_string(impedance) : "NC"; + + // Set the text + gtk_entry_set_text(text, tmp.c_str()); + } + else + { + // If impedance reading fails, produce an error message and set the relevant cell to black + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to read from channel " << i + 1 << "...\n"; + color.red = color.green = color.blue = 1; + gtk_entry_set_text(text, ""); + } + + // Then get it as just a widget so we can set the background colour + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_builder, name.c_str())); + gtk_widget_modify_base(widget, GTK_STATE_NORMAL, &color); + } + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Closing device...\n"; + GT_CloseDevice(deviceName); + } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not open device\n"; } + + // Set the text back so the user knows the test is over + GtkButton* buttonCheckImpedance = GTK_BUTTON(gtk_builder_get_object(m_builder,"button_check_impedance")); + gtk_button_set_label(buttonCheckImpedance, "Check Impedance"); +} + +// Open the device, get all the possible filters given the sampling frequency and we also blank out all the preset filters since they might not be valid or the same for the new frequency +void CConfigurationGTecGUSBampLinux::OnComboboxSamplingFrequencyChanged() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Changing sampling frequency invalidates filters\n"; + UpdateFilters(); +} + +// Same again +void CConfigurationGTecGUSBampLinux::OnComboboxDeviceChanged() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Changing device invalidates filters\n"; + UpdateFilters(); +} + +bool CConfigurationGTecGUSBampLinux::postConfigure() +{ + if (m_applyConfig) + { + // Fill in all the parts of the config that differ from the default configuration we've set out in the CGTecGUSBampLinux constructor + GtkComboBox* comboBoxDevice = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + + // If there's any active text in the device combo box then set it to the + if (char* deviceName = gtk_combo_box_get_active_text(comboBoxDevice)) { *m_deviceName = deviceName; } + + // Get the sample rate and the number of channels + GtkComboBox* comboBoxSampling = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")); + m_config->sample_rate = (gt_size)strtol(gtk_combo_box_get_active_text(comboBoxSampling), nullptr, 10); + + GtkSpinButton* buttonChannel = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_number_of_channels")); + m_config->num_analog_in = gtk_spin_button_get_value(buttonChannel); + + // Fill out the analog output configs + // Shape + GtkComboBox* comboBoxShape = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_analog_out_shape")); + m_config->ao_config->shape = usbamp_analog_out_shape(gtk_combo_box_get_active(comboBoxShape)); + // Amplitude + GtkSpinButton* buttonAmplitude = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder,"spinbutton_analog_out_amplitude")); + m_config->ao_config->amplitude = gtk_spin_button_get_value(buttonAmplitude); + // Offset + GtkSpinButton* buttonOffset = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder,"spinbutton_analog_out_offset")); + m_config->ao_config->offset = gtk_spin_button_get_value(buttonOffset); + // Frequency + GtkSpinButton* buttonFrequency = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder,"spinbutton_analog_out_frequency")); + m_config->ao_config->frequency = gtk_spin_button_get_value(buttonFrequency); + + // Fill out the options + // Slave + GtkToggleButton* buttonSlave = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_slave")); + m_config->slave_mode = gtk_toggle_button_get_active(buttonSlave); + // Shortcut + GtkToggleButton* buttonShortcut = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_shortcut")); + m_config->enable_sc = gtk_toggle_button_get_active(buttonShortcut); + // Shortcut + GtkToggleButton* buttonDio = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_dio")); + m_config->scan_dio = gtk_toggle_button_get_active(buttonDio); + // Trigger + GtkToggleButton* buttonTrigger = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_trigger")); + m_config->enable_trigger_line = gtk_toggle_button_get_active(buttonTrigger); + // Mode + GtkComboBox* comboBoxMode = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_mode")); + m_config->mode = usbamp_device_mode(gtk_combo_box_get_active(comboBoxMode)); + + // Set all the blocks A-D to use the common ground and reference voltages + for (uint32_t i = 0; i < GT_USBAMP_NUM_GROUND; ++i) + { + GtkToggleButton* buttonGnd = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, ("checkbutton_block_gnd" + std::to_string(i + 1)).c_str())); + GtkToggleButton* buttonRef = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, ("checkbutton_block_ref" + std::to_string(i + 1)).c_str())); + + m_config->common_ground[i] = gtk_toggle_button_get_active(buttonGnd); + m_config->common_reference[i] = gtk_toggle_button_get_active(buttonRef); + } + + // Config each channel with the info + GtkTreeView* treeView = GTK_TREE_VIEW(gtk_builder_get_object(m_builder,"treeview_channel_config")); + GtkTreeModel* treeModel = gtk_tree_view_get_model(treeView); + gint value; + + GtkTreeIter iter; + int i = 0; + for (gboolean end = gtk_tree_model_get_iter_first(treeModel, &iter); end; end = gtk_tree_model_iter_next(treeModel, &iter), i++) + { + gtk_tree_model_get(treeModel, &iter, BipolarColumn, &value, -1); + m_config->bipolar[i] = (value == 0 ? GT_BIPOLAR_DERIVATION_NONE : value); + + gtk_tree_model_get(treeModel, &iter, NotchIdColumn, &value, -1); + m_config->notch[i] = value; + + gtk_tree_model_get(treeModel, &iter, BandpassIdColumn, &value, -1); + m_config->bandpass[i] = value; + } + } + if (!CConfigurationBuilder::postConfigure()) // normal header is filled (Subject ID, Age, Gender, channels, sampling frequency), ressources are realesed + return false; + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyGUSBampCAPI_Linux diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/src/ovasCConfigurationGTecGUSBampLinux.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/src/ovasCConfigurationGTecGUSBampLinux.h new file mode 100644 index 0000000..5b36247 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/src/ovasCConfigurationGTecGUSBampLinux.h @@ -0,0 +1,65 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyGUSBampCAPI_Linux + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationGTecGUSBampLinux + * \author Tom Stewart (University of Tsukuba) + * \date Mon Feb 9 18:59:22 2015 + * \brief The CConfigurationGTecGUSBampLinux handles the configuration dialog specific to the g.tec g.USBamp for Linux device. + * + * TODO: details + * + * \sa CDriverGTecGUSBampLinux + */ +class CConfigurationGTecGUSBampLinux final : public CConfigurationBuilder +{ +public: + // Thresholds for reporting on measured impedance, these are the same as the ones that the simulink driver uses + static const int LowImpedance = 5, ModerateImpedance = 7, HighImpedance = 100; + + enum ChannelTreeViewColumn { ChannelColumn = 0, BipolarColumn, NotchColumn, NotchIdColumn, BandpassColumn, BandpassIdColumn }; + + // you may have to add to your constructor some reference parameters + // for example, a connection ID: + CConfigurationGTecGUSBampLinux(IDriverContext& ctx, const char* gtkBuilderFilename, std::string* deviceName, gt_usbamp_config* config); + + bool preConfigure() override; + bool postConfigure() override; + + void OnButtonApplyConfigPressed(ChannelTreeViewColumn type); + void OnButtonCheckImpedanceClicked(); + void OnComboboxSamplingFrequencyChanged(); + void OnComboboxDeviceChanged(); + +protected: + IDriverContext& m_driverCtx; + +private: + /* + * Insert here all specific attributes, such as a connection ID. + * use references to directly modify the corresponding attribute of the driver + * Example: + */ + std::string* m_deviceName = nullptr; + gt_usbamp_config* m_config; + void UpdateFilters(); +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGUSBampCAPI_Linux diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/src/ovasCDriverGTecGUSBampLinux.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/src/ovasCDriverGTecGUSBampLinux.cpp new file mode 100644 index 0000000..251d131 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/src/ovasCDriverGTecGUSBampLinux.cpp @@ -0,0 +1,351 @@ +#if defined TARGET_HAS_ThirdPartyGUSBampCAPI_Linux + +#include "ovasCDriverGTecGUSBampLinux.h" +#include "ovasCConfigurationGTecGUSBampLinux.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverGTecGUSBampLinux::CDriverGTecGUSBampLinux(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_GTecGUSBampLinux", m_driverCtx.getConfigurationManager()), + m_nSamplePerSentBlock(0), m_sampleSend(nullptr), m_sampleReceive(nullptr), m_sampleBuffer(nullptr), m_currentSample(0), m_currentChannel(0) +{ + // Default values + m_header.setSamplingFrequency(512); + m_header.setChannelCount(16); + + m_config.ao_config = &m_analogOutConfig; + + // Configure some defaults so the settings are reasonable as soon as the driver loads and the user can tweak them from there + + // Configure the analog waveform to be created by the internal signal generator + m_analogOutConfig.shape = GT_ANALOGOUT_SINE; + m_analogOutConfig.frequency = 1; + m_analogOutConfig.amplitude = 0; + m_analogOutConfig.offset = 0; + + // This pretty much has to be GT_NOS_AUTOSET, don't know why, so says the documentation + m_config.number_of_scans = GT_NOS_AUTOSET; + // Disable the trigger line, digital io scan, slave mode and the shortcut + m_config.enable_trigger_line = m_config.scan_dio = m_config.slave_mode = m_config.enable_sc = GT_FALSE; + + // Set the mode to just take readings + m_config.mode = GT_MODE_NORMAL; + + // Set all the blocks A-D to use the common ground and reference voltages + for (uint32_t i = 0; i < GT_USBAMP_NUM_GROUND; ++i) + { + m_config.common_ground[i] = GT_TRUE; + m_config.common_reference[i] = GT_TRUE; + } + + // Configure each input + for (unsigned char i = 0; i < GT_USBAMP_NUM_ANALOG_IN; ++i) + { + // Should be from 1 - 16, specifies which channel to observe as input i + m_config.analog_in_channel[i] = i + 1; + // Don't use any of the filters on channel i + m_config.bandpass[i] = GT_FILTER_NONE; + // Don't use any of the notch filters on channel i + m_config.notch[i] = GT_FILTER_NONE; + // Don't use any of the other channels for bi-polar derivation + m_config.bipolar[i] = GT_BIPOLAR_DERIVATION_NONE; + } + + // Now look for any connected devices. If any exist we'll set the name to the first one found + char** devices = nullptr; + size_t nDevice = 0; + + // Refresh and get the list of currently connnected devices + GT_UpdateDevices(); + nDevice = GT_GetDeviceListSize(); + devices = GT_GetDeviceList(); + + // If any devices were found at all, set the combo box to the first one listed + if (nDevice) { m_deviceName = devices[0]; } + + GT_FreeDeviceList(devices, nDevice); + + // Now retrieve all those configs from the settings file if they are there to be found (don't need to worry about sample rate or channel number though since they're already in the header) + m_settings.add("Header", &m_header); + m_settings.add("DeviceName", static_cast(&m_deviceName)); + m_settings.add("Mode", static_cast(&m_config.mode)); + m_settings.add("EnableTrigger", static_cast(&m_config.enable_trigger_line)); + m_settings.add("ScanDIO", static_cast(&m_config.scan_dio)); + m_settings.add("SlaveMode", static_cast(&m_config.slave_mode)); + m_settings.add("EnableShortcut", static_cast(&m_config.enable_sc)); + m_settings.add("AnalogOutShape", static_cast(&m_analogOutConfig.shape)); + m_settings.add("AnalogOutFrequency", static_cast(&m_analogOutConfig.frequency)); + m_settings.add("AnalogOutAmplitude", static_cast(&m_analogOutConfig.amplitude)); + m_settings.add("AnalogOutOffset", static_cast(&m_analogOutConfig.offset)); + + // Set all the blocks A-D to use the common ground and reference voltages + for (uint32_t i = 0; i < GT_USBAMP_NUM_GROUND; ++i) + { + std::stringstream gndConfigName, configName; + gndConfigName << "CommonGround" << i; + configName << "CommonReference" << i; + m_settings.add(gndConfigName.str().c_str(), static_cast(&m_config.common_ground[i])); + m_settings.add(configName.str().c_str(), static_cast(&m_config.common_reference[i])); + } + + // Configure each input + for (uint32_t i = 0; i < GT_USBAMP_NUM_ANALOG_IN; ++i) + { + std::stringstream bandpassConfigName, notchConfigName, bipolarConfigName; + bandpassConfigName << "Bandpass" << i; + notchConfigName << "Notch" << i; + bipolarConfigName << "Bipolar" << i; + m_settings.add(bandpassConfigName.str().c_str(), static_cast(&m_config.bandpass[i])); + m_settings.add(notchConfigName.str().c_str(), static_cast(&m_config.notch[i])); + m_settings.add(bipolarConfigName.str().c_str(), static_cast(&m_config.bipolar[i])); + } + + // This restores saved settings if any, such as sampling rate + m_settings.load(); + + // Set the sampling rate that may have been changed by load + m_config.sample_rate = m_header.getSamplingFrequency(); + + // Number of channels that may have been changed by load + m_config.num_analog_in = m_header.getChannelCount(); +} + +//___________________________________________________________________// +// // + +bool CDriverGTecGUSBampLinux::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) return false; + if (!m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) return false; + + // If the scan digital inputs flag is set, the API will return one extra channel outside of the analog data requested, so we need to match that on the header + if (m_config.scan_dio == GT_TRUE) + { + m_header.setChannelCount(m_config.num_analog_in + 1); + m_header.setChannelName(m_config.num_analog_in, "Digital"); + } + + // Allocate buffers for... + + // Sending to OpenViBE + m_sampleSend = new float[m_header.getChannelCount() * nSamplePerSentBlock]; + // Receiving from the hardware, + m_sampleReceive = new float[m_header.getChannelCount() * nSamplePerSentBlock]; + // Storing the data so we pass it between the two threads - we're using the recommended buffer size put out by gtec, which is enormous + m_sampleBuffer = new float[GT_USBAMP_RECOMMENDED_BUFFER_SIZE / sizeof(float)]; + + // Set up the queue to help pass the data out of the hardware thread + m_sampleQueue.SetBuffer(m_sampleBuffer, m_header.getChannelCount() * m_header.getSamplingFrequency() / 8); + + // If any of that allocation fails then give up. Not sure what setting it all to NULL is for, but we'll go with it. + if (!m_sampleSend || !m_sampleReceive || !m_sampleBuffer) + { + delete[] m_sampleSend; + delete[] m_sampleReceive; + delete[] m_sampleBuffer; + m_sampleSend = m_sampleReceive = m_sampleBuffer = nullptr; + + return false; + } + + // Apparently this causes the API to print debug info to the console, I'm yet to see any though + GT_ShowDebugInformation(GT_TRUE); + + // Try to open the device with the configured name, let the user know how it goes + if (!GT_OpenDevice(m_deviceName.c_str())) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not open device: " << m_deviceName << "\n"; + return false; + } + + if (!GT_SetConfiguration(m_deviceName.c_str(), &m_config)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not apply configuration to device: " << m_deviceName << "\n"; + return false; + } + + GT_SetDataReadyCallBack(m_deviceName.c_str(), &OnDataReady, static_cast(this)); + + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; +} + +bool CDriverGTecGUSBampLinux::start() +{ + if (!m_driverCtx.isConnected()) return false; + if (m_driverCtx.isStarted()) return false; + + // ... + // request hardware to start + // sending data + // ... + + // Need to reset these in case the device is stopped mid-sample and then started again + m_currentChannel = m_currentSample = 0; + + GT_StartAcquisition(m_deviceName.c_str()); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Acquisition Started\n"; + + return true; +} + +// So when the gtec buffer grows larger than a send buffer, copy it all to a send buffer sized array, then copy it into the actual send buffer one by one. +bool CDriverGTecGUSBampLinux::loop() +{ + if (!m_driverCtx.isConnected()) return false; + if (!m_driverCtx.isStarted()) return true; + + const CStimulationSet stimSet; + + // while there's new data available on the queue + while (m_sampleQueue.Avail()) + { + // take it off and put it in the appropriate element in the outgoing buffer + m_sampleQueue.Get(m_sampleSend + m_currentChannel * m_nSamplePerSentBlock + m_currentSample, 1); + + // Increment the current channel + m_currentChannel++; + + // If the current channel reaches the channel count then move to the next sample + if (m_currentChannel == m_header.getChannelCount()) + { + m_currentChannel = 0; + m_currentSample++; + } + + // If the sample count reaches the number per sent block, then send it and start again + if (m_currentSample == m_nSamplePerSentBlock) + { + m_callback->setSamples(m_sampleSend); // it looks as if this copies the buffer, so we're free modify it as soon as it executes + + // When your sample buffer is fully loaded, + // it is advised to ask the acquisition server + // to correct any drift in the acquisition automatically. + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + + // ... + // receive events from hardware + // and put them the correct way in a CStimulationSet object + //... + m_callback->setStimulationSet(stimSet); + + m_currentSample = 0; + } + } + + return true; +} + +bool CDriverGTecGUSBampLinux::stop() +{ + if (!m_driverCtx.isConnected()) return false; + if (!m_driverCtx.isStarted()) return false; + + // ... + // request the hardware to stop + // sending data + // ... + GT_StopAcquisition(m_deviceName.c_str()); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Acquisition Stopped"; + + return true; +} + +bool CDriverGTecGUSBampLinux::uninitialize() +{ + if (!m_driverCtx.isConnected()) return false; + if (m_driverCtx.isStarted()) return false; + + GT_CloseDevice(m_deviceName.c_str()); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Closed Device: " << m_deviceName << "\n"; + + // ... + // uninitialize hardware here + // ... + m_sampleQueue.SetBuffer(nullptr, 0); + + delete[] m_sampleSend; + delete[] m_sampleBuffer; + delete[] m_sampleReceive; + + m_sampleSend = m_sampleReceive = m_sampleBuffer = nullptr; + + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverGTecGUSBampLinux::isConfigurable() +{ + return true; // change to false if your device is not configurable +} + +bool CDriverGTecGUSBampLinux::configure() +{ + // Change this line if you need to specify some references to your driver attribute that need configuration, e.g. the connection ID. + CConfigurationGTecGUSBampLinux config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-GTecGUSBampLinux.ui", &m_deviceName, &m_config); + + if (!config.configure(m_header)) { return false; } + + m_header.setChannelCount(m_config.num_analog_in); + m_header.setSamplingFrequency(m_config.sample_rate); + + m_settings.save(); + + return true; +} + +/*void AcquisitionServer::OnDataReady(void *param) +{ + // Like the 'this' pointer, but for a friend function + CDriverGTecGUSBampLinux *that = (CDriverGTecGUSBampLinux*)param; + + // This is pretty tricky to know in advance, the API decides how many values to spit out depnding on a few factors it seems. + // We'll allocate a reasonble buffer and call GT_GetData as many times as is necessary + while(size_t nSamplesToRead = GT_GetSamplesAvailable(that->m_deviceName.c_str())) + { + // If there are more samples than will fit in the buffer, just get as many as possible and we can get the rest next iteration + if(nSamplesToRead > CDriverGTecGUSBampLinux::ReceiveBufferSize * sizeof(float)) + nSamplesToRead = CDriverGTecGUSBampLinux::ReceiveBufferSize * sizeof(float); + + // Get the data -- TODO: rewrite this algorithm such that we can copy directly from GT_GetData into the buffer read in the loop() function - is this a bug?? Maybe, but probably not since the calibration mode was always perfect + GT_GetData(that->m_deviceName.c_str(), reinterpret_cast(that->m_sampleReceive), nSamplesToRead); + + // Put it on the sample queue + that->m_sampleQueue.Put(that->m_sampleReceive, nSamplesToRead / sizeof(float)); + } +}*/ + +void AcquisitionServer::OnDataReady(void* param) +{ + // Like the 'this' pointer, but for a friend function + CDriverGTecGUSBampLinux* that = static_cast(param); + + // This is pretty tricky to know in advance, the API decides how many values to spit out depnding on a few factors it seems. + // We'll allocate a reasonble buffer and call GT_GetData as many times as is necessary + while (size_t samplesToRead = GT_GetSamplesAvailable(that->m_deviceName.c_str())) + { + // If there are more samples than will fit in the buffer, just get as many as possible and we can get the rest next iteration + if (samplesToRead > that->m_sampleQueue.FreeContiguous() * sizeof(float)) samplesToRead = that->m_sampleQueue.FreeContiguous() * sizeof(float); + + // Get the data and put it directly onto the queue + GT_GetData(that->m_deviceName.c_str(), reinterpret_cast(that->m_sampleQueue.NextFreeAddress()), samplesToRead); + + // Pad the queue so it recognises how much data was just added to it + that->m_sampleQueue.Pad(samplesToRead / sizeof(float)); + } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyGUSBampCAPI_Linux diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/src/ovasCDriverGTecGUSBampLinux.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/src/ovasCDriverGTecGUSBampLinux.h new file mode 100644 index 0000000..6740ee5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-bcilab/src/ovasCDriverGTecGUSBampLinux.h @@ -0,0 +1,78 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyGUSBampCAPI_Linux + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include +#include "Queue.h" + +namespace OpenViBE { +namespace AcquisitionServer { +void OnDataReady(void* param); + +/** + * \class CDriverGTecGUSBampLinux + * \author Tom Stewart (University of Tsukuba) + * \date Mon Feb 9 18:59:22 2015 + * \brief The CDriverGTecGUSBampLinux allows the acquisition server to acquire data from a g.tec g.USBamp from Linux. + * + * \sa CConfigurationGTecGUSBampLinux + */ +class CDriverGTecGUSBampLinux final : public IDriver +{ + static const int ReceiveBufferSize = 8192; +public: + friend void OnDataReady(void* param); + + explicit CDriverGTecGUSBampLinux(IDriverContext& ctx); + ~CDriverGTecGUSBampLinux() override {} + const char* getName() override { return "g.tec g.USBamp Linux BCI-Lab"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + + // Replace this generic Header with any specific header you might have written + CHeader m_header; + + uint32_t m_nSamplePerSentBlock; + + float *m_sampleSend, *m_sampleReceive, *m_sampleBuffer; + Queue m_sampleQueue; +private: + + /* + * Insert here all specific attributes, such as USB port number or device ID. + */ + std::string m_deviceName; + gt_usbamp_config m_config; + gt_usbamp_analog_out_config m_analogOutConfig; + + // Keeps track of where we are with filling up the buffer + uint32_t m_currentSample, m_currentChannel; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGUSBampCAPI_Linux diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/common/src/ringbuffer.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/common/src/ringbuffer.h new file mode 100644 index 0000000..696d7b0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/common/src/ringbuffer.h @@ -0,0 +1,151 @@ +//CRingBuffer provided by g.tec +//website: http://www.gtec.at +//redistribution of this file has been offcially granted by g.tec + +#pragma once + +#include // std::min +#include +#include + +//#include + +/* + * Class representing a ring buffer with elements of type float. + */ +template +class CRingBuffer +{ +public: + + //Constructor. Creates an empty buffer with an initial capacity of zero. + CRingBuffer() : _buffer(nullptr) { } + + //Destructor. Frees the allocated buffer. + ~CRingBuffer() + { + if (_buffer != nullptr) { VirtualFree(_buffer, 0, MEM_RELEASE); } + _buffer = nullptr; + } + + /* + * Initializes the buffer with the specified capacity representing the number of elements that the buffer can contain. + * Returns false if the memory couldn't be allocated (e.g. because of not enough free disk space); true, if the call succeeded. + */ + bool Initialize(const uint32_t capacity) + { + //if the buffer has been allocated before, release this memory first + if (_buffer != nullptr) + { + VirtualFree(_buffer, 0, MEM_RELEASE); + _buffer = nullptr; + } + + if (capacity > 0) + { + //allocate memory for the buffer + _buffer = static_cast(VirtualAlloc(nullptr, capacity * sizeof(T), MEM_COMMIT, PAGE_READWRITE)); + + //check if allocation succeeded + if (_buffer == nullptr) { return false; } + _capacity = capacity; + } + + //reset the buffer positions + Reset(); + + return true; + } + + //Clears the buffer by resetting both the start and end position to zero. + void Reset() + { + _start = 0; + _end = 0; + _isEmpty = true; + } + + //Returns the buffer's capacity it has been initialized to, i.e. the number of elements the buffer can contain. + int GetCapacity() const { return _capacity; } + + //Returns the free space of the buffer, i.e. the number of new elements that can be enqueued before the buffer will overrun. + int GetFreeSize() const { return _capacity - GetSize(); } + + //Returns the number of elements that the buffer currently contains (don't confuse the size (number of ACTUALLY contained elements) with the capacity (maximum number of elements that the buffer CAN contain)!). + int GetSize() const + { + if (_isEmpty) { return 0; } + if (_start < _end) { return _end - _start; } + return _capacity - (_start - _end); + } + + /* + * Writes the specified number of elements from the specified source array into the ring buffer. If the number of elements to copy exceeds the free buffer space, only the free buffer space will be written, existing elements will NOT be overwritten. + * float* source: pointer to the first element of the source array whose elements should be stored into the ring buffer. + * uint32_t length: the number of elements from the source array that should be copied into the ring buffer. + */ + void Write(T* source, const uint32_t length) + { + //if buffer is full or no elements should be written, no elements can be written + if ((!_isEmpty && _start == _end) || length <= 0) { return; } + + //if _start <= _end, split the free buffer space into two parts + uint32_t firstPartCapacity = (_start <= _end) ? _capacity - _end : _start - _end; + const uint32_t secondPartCapacity = (_start <= _end) ? _start : 0; + + //copy first part + CopyMemory(&_buffer[_end], source, std::min(firstPartCapacity, length) * sizeof(T)); + + //if a second part exists, copy second part + if (length > firstPartCapacity) + { + CopyMemory(&_buffer[0], &source[firstPartCapacity], std::min(secondPartCapacity, length - firstPartCapacity) * sizeof(T)); + } + + //update buffer positions + _end = (_end + std::min(length, firstPartCapacity + secondPartCapacity)) % _capacity; + _isEmpty = false; + } + + /* + * Copys the specified number of elements from the ring buffer into the specified destination array. + * If there are less elements in the buffer than the to read, only available elements will be copied. + * float *destination: The array where to copy the elements from the ring buffer to. + * uint32_t length: The number of elements to copy from the ring buffer into the destination array. + */ + void Read(T* destination, const uint32_t length) + { + if (length <= 0) { return; } + + //if _start >= _end, split the read operation into two parts + int firstPartSize = (_start < _end) ? std::min(length, _end - _start) : std::min(length, _capacity - _start); + const int secondPartSize = (_start < _end) ? 0 : std::min(_end, length - firstPartSize); + + //copy first part + CopyMemory(destination, &_buffer[_start], firstPartSize * sizeof(T)); + + //if a second part exists, copy second part + if (secondPartSize > 0) { CopyMemory(&destination[firstPartSize], &_buffer[0], secondPartSize * sizeof(T)); } + + //update the buffer positions + _start = (_start + (firstPartSize + secondPartSize)) % _capacity; + + if (_start == _end) { _isEmpty = true; } + } + +protected: + //the buffer array + T* _buffer = nullptr; + + //the number of elements the buffer can contain + uint32_t _capacity = 0; + + //the position of the first contained element of the buffer in the internal array + uint32_t _start = 0; + + //the position of the first free element of the buffer in the internal array (this position - 1 equals the position of the last contained element of the buffer) + uint32_t _end = 0; + + //flag indicating if the buffer is empty. Necessary because when _start == _end it is undefined if the buffer is full or empty. + bool _isEmpty = true; +}; diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/gusbamp/share/interface-GTec-GUSBamp.ui b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/gusbamp/share/interface-GTec-GUSBamp.ui new file mode 100644 index 0000000..4f2a316 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/gusbamp/share/interface-GTec-GUSBamp.ui @@ -0,0 +1,999 @@ + + + + + + 1 + 999 + 4 + 1 + 10 + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + False + 5 + Common Ground and Reference + center + dialog + + + True + False + 2 + + + True + False + end + + + + + + + + + False + True + end + 0 + + + + + True + False + + + True + False + 3 + 2 + 5 + 5 + + + True + False + <big>Connect to Common Ground</big> + True + center + + + 2 + + + + + Block A (yellow) + True + True + False + False + True + + + 1 + 2 + + + + + Block B (red) + True + True + False + False + True + + + 1 + 2 + 1 + 2 + + + + + Block C (blue) + True + True + False + False + True + + + 2 + 3 + + + + + Block D (green) + True + True + False + False + True + + + 1 + 2 + 2 + 3 + + + + + True + True + 0 + + + + + True + False + + + False + True + 1 + + + + + True + False + 3 + 2 + 5 + 5 + + + True + False + <big>Connect to Common Reference</big> + True + center + + + 2 + + + + + Block A (yellow) + True + True + False + False + True + + + 1 + 2 + + + + + Block B (red) + True + True + False + False + True + + + 1 + 2 + 1 + 2 + + + + + Block C (blue) + True + True + False + False + True + + + 2 + 3 + + + + + Block D (green) + True + True + False + False + True + + + 1 + 2 + 2 + 3 + + + + + True + True + 2 + + + + + + + + True + True + 1 + + + + + + + False + 7 + Amplifier Filters + center + dialog + + + True + False + 2 + + + True + False + end + + + + + + + + + False + True + end + 0 + + + + + True + False + + + True + False + <big>Notch filter</big> + +Type - Order - [Low Pass; High Pass] - Frequency + True + center + + + True + True + 0 + + + + + True + False + liststore1 + + + + 0 + + + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + <big>Band Pass filter</big> + +Type - Order - [Low Cut; High Cut] - Frequency + True + center + + + True + True + 3 + + + + + True + False + liststore2 + + + + 0 + + + + + True + True + 4 + + + + + True + True + 1 + + + + + + + + + + + + + + + + + + + + + + + + + 32 + + + 64 + + + 128 + + + 256 + + + 512 + + + 600 + + + 1200 + + + 2400 + + + 4800 + + + 9600 + + + 19200 + + + 38400 + + + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + False + 5 + Device configuration + center + dialog + center + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + g.Tec gUSBamp + center + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + 8 + 8 + + + True + False + 8 + + + True + False + 10 + 2 + True + + + True + True + False + False + False + True + True + adjustment1 + True + True + + + 1 + 2 + 4 + 5 + + + + + True + False + Number of channels : + right + True + + + 4 + 5 + + + + + True + False + Master device : + right + True + + + 3 + 4 + + + + + True + False + model1 + + + + 0 + + + + + 1 + 2 + 5 + 6 + + + + + True + False + Sampling frequency : + right + True + + + 5 + 6 + + + + + True + False + model2 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + False + model3 + + + + 0 + + + + + 1 + 2 + 3 + 4 + + + + + True + True + False + False + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + True + False + False + True + True + adjustment3 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + False + Identifier : + right + True + + + + + True + False + Age : + right + True + + + 1 + 2 + + + + + True + False + Gender : + right + True + + + 2 + 3 + + + + + True + True + False + False + True + + + 1 + 2 + 6 + 7 + + + + + True + False + Event channel + + + 6 + 7 + + + + + True + False + Bipolar electrodes + + + 7 + 8 + + + + + 1-2=1,...,15-16=15 + True + True + False + False + True + + + 1 + 2 + 7 + 8 + 2 + + + + + True + False + Calibration signal + + + 8 + 9 + + + + + + True + True + False + False + True + + + 1 + 2 + 8 + 9 + 2 + + + + + + True + False + Check impedance : + + + 9 + 10 + + + + + True + True + False + False + True + + + 1 + 2 + 9 + 10 + + + + + + True + True + False + False + True + + + 1 + 2 + 10 + 11 + + + + + True + False + Show device name + + + 10 + 11 + + + + + + True + True + 0 + + + + + True + True + 0 + + + + + Auto calibrate in 4 seconds... + True + True + True + False + + + False + True + 1 + + + + + True + False + + + False + True + 2 + + + + + Connect to Common Gnd and Ref + True + True + True + False + + + True + True + 3 + + + + + Set Amplifier Filters + True + True + True + False + + + True + True + 4 + + + + + True + False + + + False + True + 5 + + + + + Change channel names... + True + True + True + False + + + False + True + 6 + + + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/gusbamp/src/CConfigurationGTecGUSBamp.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/gusbamp/src/CConfigurationGTecGUSBamp.cpp new file mode 100644 index 0000000..7853af3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/gusbamp/src/CConfigurationGTecGUSBamp.cpp @@ -0,0 +1,401 @@ +#if defined TARGET_HAS_ThirdPartyGUSBampCAPI + +#include "CConfigurationGTecGUSBamp.hpp" + +#include +#include +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +static void ApplyFiltersPressedCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonFiltersApplyPressedCB(); } +static void CalibratePressedCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonCalibratePressedCB(); } +static void CommonGndRefPressedCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonCommonGndRefPressedCB(); } +static void FiltersPressedCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonFiltersPressedCB(); } + +static gboolean idle_calibrate_cb(void* data) +{ + static_cast(data)->idleCalibrateCB(); + return FALSE; +} + +CConfigurationGTecGUSBamp::CConfigurationGTecGUSBamp(const char* gtkBuilderFilename, uint8_t& commonGndAndRefBitmap, int& notchFilterIdx, + int& bandPassFilterIdx, bool& triggerInput, const std::vector& devicesSerials, + std::string& masterDeviceIndex, bool& bipolar, bool& calibrationSignalEnabled, bool& showDeviceName) + : CConfigurationBuilder(gtkBuilderFilename), m_commonGndAndRefBitmap(commonGndAndRefBitmap), m_notchFilterIdx(notchFilterIdx), + m_bandPassFilterIdx(bandPassFilterIdx), m_triggerInput(triggerInput), m_devicesSerials(devicesSerials), m_masterDeviceIdx(masterDeviceIndex), + m_bipolarEnabled(bipolar), m_calibrationSignalEnabled(calibrationSignalEnabled), m_showDeviceName(showDeviceName) {} + +bool CConfigurationGTecGUSBamp::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + GtkCheckButton* hardwareTagging = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_EventChannel")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(hardwareTagging), m_triggerInput); + + GtkCheckButton* bipolar = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_Bipolar")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bipolar), m_bipolarEnabled); + + GtkCheckButton* showDeviceName = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_ShowDeviceName")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(showDeviceName), m_showDeviceName); + + GtkCheckButton* calibrationMode = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_CalibrationSignal")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(calibrationMode), m_calibrationSignalEnabled); + + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_master_device")); + + // Default active device is the last one + if (!m_devicesSerials.empty()) { gtk_combo_box_set_active(comboBox, m_devicesSerials.size() - 1); } + + // If a device is already set, try to use that as the combo box selection; if not found, use last (set above). + int masterIndex = int(m_devicesSerials.size()) - 1; + for (size_t i = 0; i < m_devicesSerials.size(); ++i) + { + gtk_combo_box_append_text(comboBox, m_devicesSerials[i].c_str()); + if (this->m_masterDeviceIdx == m_devicesSerials[i]) { masterIndex = i; } + } + + if (masterIndex >= 0) { gtk_combo_box_set_active(comboBox, masterIndex); } + + // Sets the channel limits depending on the number of amps + GtkSpinButton* numChannels = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_number_of_channels")); + gtk_spin_button_set_range(numChannels, 1, m_devicesSerials.size() * 16); // GTEC_NUM_CHANNELS + + const size_t count = this->m_devicesSerials.size(); + + /* + char buffer[1024]; + int count=0; + bool selected=false;*/ + + // autodetection of the connected device + /*for (uint32_t i=1; i<11; ++i) + { + ::HANDLE handle=::GT_OpenDevice(i); + if(handle) + { + ::GT_CloseDevice(&handle); + + sprintf(buffer, "USB port %i", i); + ::gtk_combo_box_append_text(comboBox, buffer); + if(m_usbIdx==i) + { + ::gtk_combo_box_set_active(comboBox, count); + selected=true; + } + count++; + } + } + */ + + //if(!selected && count!=0) { ::gtk_combo_box_set_active(comboBox, 0); } + + g_signal_connect(gtk_builder_get_object(m_builder, "button_calibrate"), "pressed", G_CALLBACK(CalibratePressedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder, "button-common-gnd-ref"), "pressed", G_CALLBACK(CommonGndRefPressedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder, "button-filters"), "pressed", G_CALLBACK(FiltersPressedCB), this); + + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(m_builder, "dialog-common-gnd-ref")); + gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_APPLY, GTK_RESPONSE_APPLY); + gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + dialog = GTK_WIDGET(gtk_builder_get_object(m_builder, "dialog-filters")); + + GtkWidget* buttonApplyFilters = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_APPLY, GTK_RESPONSE_APPLY); + g_signal_connect(buttonApplyFilters, "pressed", G_CALLBACK(ApplyFiltersPressedCB), this); + + gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + + GtkToggleButton* checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-gnd-blockA")); + gtk_toggle_button_set_active(checkBox, (m_commonGndAndRefBitmap & 1)); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-gnd-blockB")); + gtk_toggle_button_set_active(checkBox, (m_commonGndAndRefBitmap & (1 << 1))); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-gnd-blockC")); + gtk_toggle_button_set_active(checkBox, (m_commonGndAndRefBitmap & (1 << 2))); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-gnd-blockD")); + gtk_toggle_button_set_active(checkBox, (m_commonGndAndRefBitmap & (1 << 3))); + + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-ref-blockA")); + gtk_toggle_button_set_active(checkBox, (m_commonGndAndRefBitmap & (1 << 4))); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-ref-blockB")); + gtk_toggle_button_set_active(checkBox, (m_commonGndAndRefBitmap & (1 << 5))); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-ref-blockC")); + gtk_toggle_button_set_active(checkBox, (m_commonGndAndRefBitmap & (1 << 6))); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-ref-blockD")); + gtk_toggle_button_set_active(checkBox, (m_commonGndAndRefBitmap & (1 << 7))); + + + if (count == 0) + { + // deactivate the buttons + GtkWidget* button = GTK_WIDGET(gtk_builder_get_object(m_builder, "button-filters")); + gtk_widget_set_sensitive(button, false); + button = GTK_WIDGET(gtk_builder_get_object(m_builder, "button-common-gnd-ref")); + gtk_widget_set_sensitive(button, false); + } + return true; +} + +bool CConfigurationGTecGUSBamp::postConfigure() +{ + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_master_device")); + + if (m_applyConfig) + { + /* + int usbIdx=0; + const char* usbIdx=::gtk_combo_box_get_active_text(comboBox); + if(usbIdx) { if(sscanf(usbIdx, "USB port %i", &usbIdx)==1) { m_usbIdx=(uint32_t)usbIdx; } } + */ + if (this->m_devicesSerials.size() > 1) + { + char* selectedSerial = gtk_combo_box_get_active_text(comboBox); + m_masterDeviceIdx = (selectedSerial == nullptr) ? "" : selectedSerial; + } + + GtkToggleButton* checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-gnd-blockA")); + m_commonGndAndRefBitmap = (gtk_toggle_button_get_active(checkBox) ? 1 : 0); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-gnd-blockB")); + m_commonGndAndRefBitmap = m_commonGndAndRefBitmap + (gtk_toggle_button_get_active(checkBox) ? (1 << 1) : 0); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-gnd-blockC")); + m_commonGndAndRefBitmap = m_commonGndAndRefBitmap + (gtk_toggle_button_get_active(checkBox) ? (1 << 2) : 0); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-gnd-blockD")); + m_commonGndAndRefBitmap = m_commonGndAndRefBitmap + (gtk_toggle_button_get_active(checkBox) ? (1 << 3) : 0); + + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-ref-blockA")); + m_commonGndAndRefBitmap = m_commonGndAndRefBitmap + (gtk_toggle_button_get_active(checkBox) ? (1 << 4) : 0); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-ref-blockB")); + m_commonGndAndRefBitmap = m_commonGndAndRefBitmap + (gtk_toggle_button_get_active(checkBox) ? (1 << 5) : 0); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-ref-blockC")); + m_commonGndAndRefBitmap = m_commonGndAndRefBitmap + (gtk_toggle_button_get_active(checkBox) ? (1 << 6) : 0); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-ref-blockD")); + m_commonGndAndRefBitmap = m_commonGndAndRefBitmap + (gtk_toggle_button_get_active(checkBox) ? (1 << 7) : 0); + + GtkComboBox* notch = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox-notch")); + if (gtk_combo_box_get_active(notch) >= 0) + { + // Only update the filter index if the user chose something. This is needed so going to the Configuration menu doesn't + // change previous filter choices. + m_notchFilterIdx = ((gtk_combo_box_get_active(notch) == 0) ? -1 : m_comboBoxNotchFilterIdx[gtk_combo_box_get_active(notch) - 1] + ); //-1 because there is one more in the beginning + } + GtkComboBox* bandPass = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox-band-pass")); + if (gtk_combo_box_get_active(bandPass) >= 0) + { + // Only update the filter index if the user chose something -1 because there is one more in the beginning + m_bandPassFilterIdx = ((gtk_combo_box_get_active(bandPass) == 0) ? -1 : int(m_comboBoxBandPassFilterIdx[gtk_combo_box_get_active(bandPass) - 1])); + } + GtkCheckButton* hardwareTagging = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_EventChannel")); + m_triggerInput = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hardwareTagging)) ? true : false); + + GtkCheckButton* showDeviceName = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_ShowDeviceName")); + m_showDeviceName = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(showDeviceName)) ? true : false); + + GtkCheckButton* bipolar = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_Bipolar")); + m_bipolarEnabled = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bipolar)) ? true : false); + + GtkCheckButton* calibrationSignal = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_CalibrationSignal")); + m_calibrationSignalEnabled = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(calibrationSignal)) ? true : false); + } + + if (!CConfigurationBuilder::postConfigure()) { return false; } + return true; +} + +void CConfigurationGTecGUSBamp::buttonCalibratePressedCB() +{ + g_idle_add(idle_calibrate_cb, this); + + m_calibrateDialog = gtk_message_dialog_new(nullptr, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE, "Calibrating..."); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(m_calibrateDialog), "Please wait a few seconds..."); + gtk_dialog_run(GTK_DIALOG(m_calibrateDialog)); + gtk_widget_destroy(m_calibrateDialog); + + if (m_calibrationDone) + { + GtkWidget* dialog = gtk_message_dialog_new(nullptr, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Calibration finished !"); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + } + else + { + GtkWidget* dialog = gtk_message_dialog_new(nullptr, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Calibration failed !"); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + } +} + +void CConfigurationGTecGUSBamp::idleCalibrateCB() +{ + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_master_device")); + + m_calibrationDone = false; + + //calibrate all detected devices + for (uint32_t i = 0; i < this->m_devicesSerials.size(); ++i) + { + LPSTR serial = const_cast(m_devicesSerials[i].c_str()); + HANDLE handle = GT_OpenDeviceEx(serial); + if (handle) + { + m_calibrationDone = true; + + SCALE calibration; + if (!GT_Calibrate(handle, &calibration)) { std::cout << "err GT_Calibrate\n", m_calibrationDone = false; } + if (!GT_SetScale(handle, &calibration)) + { + std::cout << "err GT_SetScale\n"; + m_calibrationDone = false; + } + GT_CloseDevice(&handle); + } + } + + gtk_dialog_response(GTK_DIALOG(m_calibrateDialog), 0); +} + +void CConfigurationGTecGUSBamp::buttonCommonGndRefPressedCB() +{ + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(m_builder, "dialog-common-gnd-ref")); + gint resp = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_hide(dialog); +} + +void CConfigurationGTecGUSBamp::buttonFiltersPressedCB() +{ + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(m_builder, "dialog-filters")); + setHardwareFiltersDialog(); + gint resp = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_hide(dialog); +} + +void CConfigurationGTecGUSBamp::setHardwareFiltersDialog() +{ + m_comboBoxBandPassFilterIdx.clear(); + m_comboBoxNotchFilterIdx.clear(); + + GtkComboBox* comboBoxBandPass = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox-band-pass")); + GtkTreeModel* bandPassListStore = gtk_combo_box_get_model(comboBoxBandPass); + gtk_list_store_clear(GTK_LIST_STORE(bandPassListStore)); + + GtkComboBox* comboBoxNotch = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox-notch")); + GtkTreeModel* notchListStore = gtk_combo_box_get_model(comboBoxNotch); + gtk_list_store_clear(GTK_LIST_STORE(notchListStore)); + + // To check for available filters in the amplifier, we must connect to it. + if (!m_devicesSerials[0].empty()) + { + LPSTR serial = const_cast(m_devicesSerials[0].c_str()); + HANDLE handle = GT_OpenDeviceEx(serial); + + int nBandPassFilters, nNotchFilters; + if (!GT_GetNumberOfFilter(&nBandPassFilters)) { std::cout << "err GT_GetNumberOfFilter\n"; } + if (nBandPassFilters == 0) { std::cout << "err No band pass filters found at all!\n"; } + if (!GT_GetNumberOfNotch(&nNotchFilters)) { std::cout << "err GT_GetNumberOfNotch\n"; } + if (nNotchFilters == 0) { std::cout << "err No notch filters found at all!\n"; } + + FILT* bpFilterSpec = new FILT[nBandPassFilters]; + FILT* notchFilterSpec = new FILT[nNotchFilters]; + + if (!GT_GetFilterSpec(bpFilterSpec)) { std::cout << "err GT_GetFilterSpec\n"; } + if (!GT_GetNotchSpec(notchFilterSpec)) { std::cout << "err GT_GetNotchSpec\n"; } + + //Set BandPass filter list + + std::stringstream desc; + desc << "no band pass filter."; + GtkTreeIter it; + gtk_list_store_append(GTK_LIST_STORE(bandPassListStore), &it); + gtk_list_store_set(GTK_LIST_STORE(bandPassListStore), &it, 0, desc.str().c_str(), -1); + desc.clear(); + desc.str(""); + + gchar* sSampling = gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_sampling)); + const uint32_t sampling = (sSampling ? atoi(sSampling) : 0); + + int cbBandPassSelectedIdx = -1; + + // std::cout << "The device reports " << nBandPassFilters << " band pass filters and " << nNotchFilters << " notch filters\n"; + + if (nBandPassFilters > 0) + { + for (int i = 0; i < nBandPassFilters; ++i) + { + if (sampling == uint32_t(bpFilterSpec[i].fs)) + { + if (bpFilterSpec[i].type == 1) { desc << "Butterworth - "; } + if (bpFilterSpec[i].type == 2) { desc << "Chebyshev - "; } + desc << bpFilterSpec[i].order << " - [" << bpFilterSpec[i].fu << "; " << bpFilterSpec[i].fo << "] - " << bpFilterSpec[i].fs; + GtkTreeIter iter; + gtk_list_store_append(GTK_LIST_STORE(bandPassListStore), &iter); + gtk_list_store_set(GTK_LIST_STORE(bandPassListStore), &iter, 0, desc.str().c_str(), -1); + desc.clear(); + desc.str(""); + + m_comboBoxBandPassFilterIdx.push_back(i); + + //here a previous selection is loaded + if (cbBandPassSelectedIdx == -1 && i == m_bandPassFilterIdx) { cbBandPassSelectedIdx = int(m_comboBoxBandPassFilterIdx.size()) - 1; } + } + } + } + gtk_combo_box_set_active(comboBoxBandPass, cbBandPassSelectedIdx + 1); // +1 because -1 is for "no filter". + + + //Set Notch filter List + + desc << "no notch filter."; + gtk_list_store_append(GTK_LIST_STORE(notchListStore), &it); + gtk_list_store_set(GTK_LIST_STORE(notchListStore), &it, 0, desc.str().c_str(), -1); + desc.clear(); + desc.str(""); + + int cbNotchSelectedIndex = -1; + + if (nNotchFilters > 0) + { + for (int i = 0; i < nNotchFilters; ++i) + { + if (sampling == int(notchFilterSpec[i].fs)) + { + if (notchFilterSpec[i].type == 1) { desc << "Butterworth - "; } + if (notchFilterSpec[i].type == 2) { desc << "Chebyshev - "; } + desc << notchFilterSpec[i].order << " - [" << notchFilterSpec[i].fu << "; " << notchFilterSpec[i].fo << "] - " << notchFilterSpec[i].fs; + GtkTreeIter iter; + gtk_list_store_append(GTK_LIST_STORE(notchListStore), &iter); + gtk_list_store_set(GTK_LIST_STORE(notchListStore), &iter, 0, desc.str().c_str(), -1); + desc.clear(); + desc.str(""); + + m_comboBoxNotchFilterIdx.push_back(i); + + //here a previous selection is loaded + if (cbNotchSelectedIndex == -1 && i == m_notchFilterIdx) { cbNotchSelectedIndex = int(m_comboBoxNotchFilterIdx.size()) - 1; } + } + } + } + gtk_combo_box_set_active(comboBoxNotch, cbNotchSelectedIndex + 1); // +1 because -1 is for "no filter". + + delete bpFilterSpec; + delete notchFilterSpec; + GT_CloseDevice(&handle); + } +} + +void CConfigurationGTecGUSBamp::buttonFiltersApplyPressedCB() +{ + GtkComboBox* comboBoxBandPass = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox-band-pass")); + + //-1 because there is one more in the beginning + m_bandPassFilterIdx = (gtk_combo_box_get_active(comboBoxBandPass) == -1 || gtk_combo_box_get_active(comboBoxBandPass) == 0) ? -1 + : int(m_comboBoxBandPassFilterIdx[gtk_combo_box_get_active(comboBoxBandPass) - 1]); + + GtkComboBox* comboBoxNotch = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox-notch")); + //-1 because there is one more in the beginning + m_notchFilterIdx = (gtk_combo_box_get_active(comboBoxNotch) == -1 || gtk_combo_box_get_active(comboBoxNotch) == 0) ? -1 + : int(m_comboBoxNotchFilterIdx[gtk_combo_box_get_active(comboBoxNotch) - 1]); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyGUSBampCAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/gusbamp/src/CConfigurationGTecGUSBamp.hpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/gusbamp/src/CConfigurationGTecGUSBamp.hpp new file mode 100644 index 0000000..40dd9f5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/gusbamp/src/CConfigurationGTecGUSBamp.hpp @@ -0,0 +1,53 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyGUSBampCAPI + +#include "../ovasCConfigurationBuilder.h" + +#include +#include +#include + +namespace OpenViBE +{ + namespace AcquisitionServer + { + class CConfigurationGTecGUSBamp final : public CConfigurationBuilder + { + public: + CConfigurationGTecGUSBamp(const char* gtkBuilderFilename, uint8_t& commonGndAndRefBitmap, int& notchFilterIdx, int& bandPassFilterIdx, + bool& triggerInput, const std::vector& devicesSerials, std::string& masterDeviceIndex, bool& bipolar, + bool& calibrationSignalEnabled, bool& showDeviceName); + + bool preConfigure() override; + bool postConfigure() override; + + void buttonCalibratePressedCB(); + void idleCalibrateCB(); + + void buttonCommonGndRefPressedCB(); + void buttonFiltersPressedCB(); + void setHardwareFiltersDialog(); + void buttonFiltersApplyPressedCB(); + + protected: + uint8_t& m_commonGndAndRefBitmap; + + int& m_notchFilterIdx; + int& m_bandPassFilterIdx; + bool& m_triggerInput; + std::vector m_devicesSerials; + std::string& m_masterDeviceIdx; + std::vector m_comboBoxBandPassFilterIdx; + std::vector m_comboBoxNotchFilterIdx; + bool& m_bipolarEnabled; + bool& m_calibrationSignalEnabled; + bool& m_showDeviceName; + + GtkWidget* m_calibrateDialog = nullptr; + bool m_calibrationDone = false; + }; + } // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGUSBampCAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/gusbamp/src/CDriverGTecGUSBamp.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/gusbamp/src/CDriverGTecGUSBamp.cpp new file mode 100644 index 0000000..040c386 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/gusbamp/src/CDriverGTecGUSBamp.cpp @@ -0,0 +1,1089 @@ +#if defined TARGET_HAS_ThirdPartyGUSBampCAPI + +/* + * + * Notes: According to gtec C API V3.12.00, the output from this driver + * should be microvolts, except when giving out a calibration signal. + * + * The auto calibration should be run before actual acquisition to ensure + * that all the channels are scaled appropriately. + * + * @todo might be better if all event channels were the last channels together + * + */ + +#include "CDriverGTecGUSBamp.hpp" +#include "CConfigurationGTecGUSBamp.hpp" + +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +#if defined(TARGET_OS_Windows) +#pragma warning(disable: 4800) // disable "forcing value to bool 'true' or 'false' (performance warning)" nag coming from BOOL->bool cast on e.g. VS2010 +#endif + +const DWORD CDriverGTecGUSBamp::BUFFER_SIZE_BYTES = HEADER_SIZE + N_POINTS * sizeof(float); + +/* + This driver always reads 17 channels: 16 + 1 + 16 are EEG channels + 1 is the last channel that provides triggers from the parallel port of the GTEC + Although 17 channels are read only "m_nAcquiredChannel" + 1 (if m_pTriggerInputEnabled==true) are displayed. + If m_nAcquiredChannel=6 and m_pTriggerInputEnabled=true then the output in OpenVibe is 7 channels. If m_pTriggerInputEnabled=false then 6. + "m_nAcquiredChannel" is a user modifiable variable with default value 16 +*/ + +CDriverGTecGUSBamp::CDriverGTecGUSBamp(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_GTecGUSBamp", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(512); + m_header.setChannelCount(0); + + // Settings to be saved to .conf MUST be registered here + m_settings.add("Header", &m_header); + m_settings.add("CommonGndAndRefBitmap", &m_commonGndAndRefBitmap); + m_settings.add("NotchFilterIndex", &m_notchFilterIdx); + m_settings.add("BandPassFilterIndex", &m_bandPassFilterIdx); + m_settings.add("TriggerInputEnabled", &m_triggerInputEnabled); + m_settings.add("MasterSerial", &m_masterSerial); + m_settings.add("Bipolar", &m_bipolarEnabled); + m_settings.add("CalibrationSignal", &m_calibrationSignalEnabled); + m_settings.add("ShowDeviceName", &m_showDeviceName); + + m_settings.load(); + + m_nAcquiredChannel = m_header.getChannelCount(); +} + +//___________________________________________________________________// +// // + +bool CDriverGTecGUSBamp::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + detectDevices(); + + if (numDevices() == 0) { return false; } + + // See if we can find the selected master serial from the currently available devices + bool found = false; + for (uint32_t i = 0; i < numDevices(); ++i) + { + if (m_devices[i].serial == m_masterSerial) + { + found = true; + break; + } + } + if (!found) { m_masterSerial = ""; } + + //assign automatically the last device as master if no master has been selected from "Device properties" before that + if (numDevices() > 1 && m_masterSerial == "") { m_masterSerial = m_devices[numDevices() - 1].serial; } //serial + + // Already printed by detectDevices() ... + // m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Number of devices: " << numDevices() << "\n"; + + if (numDevices() > 1 && m_nAcquiredChannel != numDevices() * GTEC_NUM_CHANNELS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "You have selected " << m_nAcquiredChannel << " channels in a " + << numDevices() * GTEC_NUM_CHANNELS << " channel setup. If this is intentional, please ignore this warning.\n"; + } + + m_globalImpedanceIdx = 0; + m_nSamplePerSentBlock = nSamplePerSentBlock; + m_callback = &callback; + + //create the temporary data buffers (the device will write data into those) + m_validPoints = NUMBER_OF_SCANS * (GTEC_NUM_CHANNELS + 1) * int(numDevices()); + m_buffers = new BYTE**[numDevices()]; + m_overlapped = new OVERLAPPED*[numDevices()]; + m_sample = new float[N_POINTS * numDevices()]; //needed later when data is being acquired + m_bufferReceivedData = new float[m_validPoints]; + + m_ringBuffer.Initialize(BUFFER_SIZE_SECONDS * m_header.getSamplingFrequency() * (GTEC_NUM_CHANNELS + 1) * numDevices()); + + for (uint32_t i = 0; i < numDevices(); ++i) + { + //Configure each device + configureDevice(i); + } + + //Set Master and slaves + if (numDevices() > 1) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Multiamplifier mode enabled. Sync cable should be used between the amps.\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Please configure the sync cable according to the above master/slave configuration.\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Alternatively, set your master from \"Driver properties\".\n"; + setMasterDevice(m_masterSerial); + } + + else if (numDevices() == 1) //a single device must be Master + { + if (GT_SetSlave(m_devices[0].handle, false)) + { + m_masterSerial = m_devices[0].serial; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Configured as MASTER device: " << m_masterSerial << " \n"; + m_mastersCnt++; + } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_SetSlave\n"; } + } + + // Set channel units + for (size_t c = 0; c < m_header.getChannelCount(); ++c) + { + if (!m_calibrationSignalEnabled) { m_header.setChannelUnits(c, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); } + else + { + // For calibration, the outputs are before-scaling raw values from the unit + // following formula 'normal output = (raw-offset)*factor'. In normal use, + // offset and factor are obtained and set by the calibration procedure. + m_header.setChannelUnits(c, OVTK_UNIT_Unspecified, OVTK_FACTOR_Base); + } + } + + // Make the channel map that converts from global system level indexes to gtec and openvibe indexes + // This mapping is used to handle situations where the user toggles event channels on/off, changes number of channels, etc. + const uint32_t totalChannels = (GTEC_NUM_CHANNELS + 1) * numDevices(); + m_channels.clear(); + m_channels.resize(totalChannels); + for (uint32_t i = 0, signalChannels = 0, eventChannels = 0; i < totalChannels; ++i) + { + const uint32_t numChannelsPerDevice = (GTEC_NUM_CHANNELS + 1); + const uint32_t deviceIdx = i / numChannelsPerDevice; + const uint32_t channelIdx = i % numChannelsPerDevice; + + m_channels[i].gtecDeviceIdx = deviceIdx; + m_channels[i].gtecChannelIdx = channelIdx; + + if ((i + 1) % (GTEC_NUM_CHANNELS + 1) == 0) + { + // This is the digital IO or event channel + m_channels[i].idx = int(m_triggerInputEnabled ? (signalChannels + eventChannels) : -1); + m_channels[i].oldIdx = -1; + m_channels[i].isEventChannel = true; + if (m_triggerInputEnabled) { eventChannels++; } + } + else if (signalChannels < m_nAcquiredChannel) + { + // This is a normal signal channel + m_channels[i].idx = int(signalChannels + eventChannels); + m_channels[i].oldIdx = signalChannels; + m_channels[i].isEventChannel = false; + signalChannels++; + } + else + { + // Unused channel + m_channels[i].idx = -1; + m_channels[i].oldIdx = -1; + m_channels[i].isEventChannel = false; + } + //std::cout << "cm: " << i << " -> " << m_channels[i].idx << ", old=" << m_channels[i].oldIdx << ", event=" << m_channels[i].l_bIsEventChannel << "\n"; + } + + // Take into account user might (or might not) want event channels + add amp name if requested + remapChannelNames(); + + if (m_header.getSamplingFrequency() > 4800) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << + "Sampling rates >4800 may need specific steps to work properly. See gusbamp manuals provided by gtec.\n"; + } + + return true; +} + +void CDriverGTecGUSBamp::detectDevices() +{ + m_devices.clear(); + char serial[16]; + int i = 0; + while (i < 11) + { + HANDLE handle = GT_OpenDevice(i); + + if (handle) + { + GDevice device; + + device.handle = handle; + + GT_GetSerial(handle, serial, 16); + //m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Detected device with serial: " << serial << "\n"; + device.serial = serial; + + m_devices.push_back(device); + } + i++; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Number of devices: " << m_devices.size() << ". Device order:\n"; + for (size_t j = 0; j < m_devices.size(); ++j) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Device: " << j << " serial: " << m_devices[j].serial << "\n"; + } +} + +bool CDriverGTecGUSBamp::configureDevice(const uint32_t deviceNumber) +{ + HANDLE device = m_devices[deviceNumber].handle; + const std::string serial = m_devices[deviceNumber].serial; + + UCHAR channel[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; + + // The amplifier is divided in 4 blocks, A to D + // each one has its own Ref/gnd connections, + // user can specify whether or not to connect the block to the common ground and reference of the amplifier. + GND ground; + ground.GND1 = (m_commonGndAndRefBitmap & 1); + ground.GND2 = (m_commonGndAndRefBitmap & (1 << 1)); + ground.GND3 = (m_commonGndAndRefBitmap & (1 << 2)); + ground.GND4 = (m_commonGndAndRefBitmap & (1 << 3)); + + REF reference; + reference.ref1 = (m_commonGndAndRefBitmap & (1 << 4)); + reference.ref2 = (m_commonGndAndRefBitmap & (1 << 5)); + reference.ref3 = (m_commonGndAndRefBitmap & (1 << 6)); + reference.ref4 = (m_commonGndAndRefBitmap & (1 << 7)); + + uint32_t mode = M_NORMAL; + if (m_calibrationSignalEnabled) { mode = M_CALIBRATE; } + if (!GT_SetMode(device, mode)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_SetMode for mode " << mode << "\n"; } + if (!GT_SetBufferSize(device, NUMBER_OF_SCANS)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_SetBufferSize\n"; } + if (!GT_SetChannels(device, channel, sizeof(channel) / sizeof(UCHAR))) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_SetChannels\n"; + } + if (!GT_EnableTriggerLine(device, TRUE)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_EnableTriggerLine - the extra input trigger channel is disabled\n"; + } + // GT_EnableSC + + // GT_SetBipolar + CHANNEL settings; + if (this->m_bipolarEnabled) + { + //the following configurations produces 8 bipolar: 1,3,5,7,9,11,13,15 and 8 unipolar 2,4,6,8,10,12,14,16 + + settings.Channel1 = 2; + settings.Channel2 = 0; + settings.Channel3 = 4; + settings.Channel4 = 0; + settings.Channel5 = 6; + settings.Channel6 = 0; + settings.Channel7 = 8; + settings.Channel8 = 0; + settings.Channel9 = 10; + settings.Channel10 = 0; + settings.Channel11 = 12; + settings.Channel12 = 0; + settings.Channel13 = 14; + settings.Channel14 = 0; + settings.Channel15 = 16; + settings.Channel16 = 0; + } + else + { + settings.Channel1 = 0; + settings.Channel2 = 0; + settings.Channel3 = 0; + settings.Channel4 = 0; + settings.Channel5 = 0; + settings.Channel6 = 0; + settings.Channel7 = 0; + settings.Channel8 = 0; + settings.Channel9 = 0; + settings.Channel10 = 0; + settings.Channel11 = 0; + settings.Channel12 = 0; + settings.Channel13 = 0; + settings.Channel14 = 0; + settings.Channel15 = 0; + settings.Channel16 = 0; + } + if (!GT_SetBipolar(device, settings)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error on GT_SetBipolar: Couldn't set unipolar derivation for device " << serial; + } + else if (this->m_bipolarEnabled) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Bipolar configuration is active.\n"; } + + + configFiltering(device); + + if (!GT_SetSampleRate(device, m_header.getSamplingFrequency())) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_SetSampleRate\n"; + } + + if (mode == M_NORMAL) + { + if (!GT_SetReference(device, reference)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_SetReference\n"; } + if (!GT_SetGround(device, ground)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_SetGround\n"; } + } + + return true; +} + +bool CDriverGTecGUSBamp::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_reconfigurationRequired) + { + // Impedance checking or some other GT_ call has changed the device configuration, so we need to reconf + for (uint32_t i = 0; i < numDevices(); ++i) { configureDevice(i); } + m_reconfigurationRequired = false; + } + + m_totalHardwareStimulations = 0; + m_totalDriverChunksLost = 0; + m_totalDriverTimeouts = 0; + m_totalRingBufferOverruns = 0; + m_totalDataUnavailable = 0; + + { + std::lock_guard lock(m_io_mutex); + m_ringBuffer.Reset(); + } + + for (uint32_t i = 0; i < numDevices(); ++i) + { + HANDLE device = m_devices[i].handle; + GT_Start(device); + } + + m_isThreadRunning = true; + m_flagIsFirstLoop = true; + m_bufferOverrun = false; + m_currentQueueIdx = 0; + + m_threadPtr.reset(new std::thread(std::bind(&CDriverGTecGUSBamp::acquire, this))); + + return true; +} + +//This method is called by the AS and it supplies the acquired data to the AS +bool CDriverGTecGUSBamp::loop() +{ + CStimulationSet stimSet; + + if (m_driverCtx.isStarted()) + { + //bool dataAvailable = false; + { + std::unique_lock lock(m_io_mutex); + while (m_ringBuffer.GetSize() < m_validPoints) { m_itemAvailable.wait(lock); } + try + { + if (m_bufferOverrun) + { + m_ringBuffer.Reset(); + m_bufferOverrun = false; + m_totalRingBufferOverruns++; + return true; + } + + m_ringBuffer.Read(m_bufferReceivedData, m_validPoints); + } + catch (std::exception e) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error reading GTEC ring buffer! Error is:" << e.what() << "\n"; } + + m_itemAvailable.notify_one(); + } + + //Data is aligned as follows: element at position destBuffer[scanIndex * (numberOfChannelsPerDevice * numDevices()) + channelIndex] is + //sample of channel channelIndex (zero-based) of the scan with zero-based scanIndex. + //channelIndex ranges from 0..numDevices()*numChannelsPerDevices where numDevices equals the number of recorded devices + //and numChannelsPerDevice the number of channels from each of those devices. + const uint32_t totalChannels = (GTEC_NUM_CHANNELS + 1) * numDevices(); + + for (uint32_t i = 0; i < totalChannels; ++i) + { + const int channel = m_channels[i].idx; + if (channel >= 0) + { + for (uint32_t j = 0; j < NUMBER_OF_SCANS; ++j) { m_sample[channel * NUMBER_OF_SCANS + j] = m_bufferReceivedData[j * totalChannels + i]; } + } + } + if (m_triggerInputEnabled) + { + //here convert parallel port values to stimulations if you need to + } + + m_callback->setSamples(m_sample, NUMBER_OF_SCANS); + m_callback->setStimulationSet(stimSet); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + else + { + if (m_driverCtx.isImpedanceCheckRequested()) + { + // The impedance check loops over 'openvibe' channels. Look up the corresponding 'openvibe channel' from the hardware channel list. + size_t idx = 0; + for (size_t k = 0; k < m_channels.size(); ++k) + { + if (m_channels[k].idx == m_globalImpedanceIdx) + { + idx = k; + break; + } + } + + const uint32_t deviceIdx = m_channels[idx].gtecDeviceIdx; + const uint32_t channelIdx = m_channels[idx].gtecChannelIdx + 1; + const bool isEventChannel = m_channels[idx].isEventChannel; + // m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Channel " << m_globalImpedanceIdx + 1 << " -> " << deviceIdx << " : " << channelIdx << "\n"; + + if (isEventChannel) { m_driverCtx.updateImpedance(m_globalImpedanceIdx, 0); } + else + { + HANDLE device = m_devices[deviceIdx].handle; + + double impedance = DBL_MAX; + if (!GT_GetImpedance(device, channelIdx, &impedance)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Impedance check failed for channel " << m_globalImpedanceIdx + 1 + << " (amp " << deviceIdx + 1 << ", chn " << channelIdx << ")" << ". The amp may need a reset.\n"; + } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Channel " << m_globalImpedanceIdx + 1 << " - " << CString( + m_header.getChannelName(m_globalImpedanceIdx)) << " : " << impedance << "\n"; + } + + if (impedance < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Channel " << m_globalImpedanceIdx + 1 << " had negative impedance " << impedance + << ", set to a high value instead.\n"; + impedance = 999 * 1000; + } + + m_driverCtx.updateImpedance(m_globalImpedanceIdx, impedance); + } + + m_globalImpedanceIdx++; + m_globalImpedanceIdx %= m_header.getChannelCount(); + + // Mark next channel as being measured + if (m_header.getChannelCount() > 1) + { + // Do this only if there's more than 1 channel selected as otherwise AS will always show 'Measuring...' + m_driverCtx.updateImpedance(m_globalImpedanceIdx, -1); + } + m_reconfigurationRequired = true; + } + else { System::Time::sleep(20); } + } + + return true; +} + +//This function is as close to the original as possible: DoAcquisition in gUSBampSyncDemo.cpp +bool CDriverGTecGUSBamp::acquire() +{ + //we can not make these checks even if they look good + //if(!m_driverCtx.isConnected()) return false; + //if(!m_driverCtx.isStarted()) return false; + + if (m_flagIsFirstLoop) //First time do some memory initialization, etc + { + //for each device create a number of QUEUE_SIZE data buffers + for (uint32_t deviceIndex = 0; deviceIndex < numDevices(); ++deviceIndex) + { + m_buffers[deviceIndex] = new BYTE*[QUEUE_SIZE]; + m_overlapped[deviceIndex] = new OVERLAPPED[QUEUE_SIZE]; + + //for each data buffer allocate a number of BUFFER_SIZE_BYTES bytes + for (int queueIndex = 0; queueIndex < QUEUE_SIZE; ++queueIndex) + { + m_buffers[deviceIndex][queueIndex] = new BYTE[BUFFER_SIZE_BYTES]; + memset(&(m_overlapped[deviceIndex][queueIndex]), 0, sizeof(OVERLAPPED)); + + //create a windows event handle that will be signalled when new data from the device has been received for each data buffer + m_overlapped[deviceIndex][queueIndex].hEvent = CreateEvent(nullptr, false, false, nullptr); + + if (!m_overlapped[deviceIndex][queueIndex].hEvent) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not create handle!\n"; + return false; + } + } + } + + for (uint32_t deviceIndex = 0; deviceIndex < numDevices(); ++deviceIndex) + { + //devices are started in "Start" method, so this part is skipped from the original g.tec code + HANDLE hDevice = m_devices[deviceIndex].handle; + + //queue-up the first batch of transfer requests + for (int queueIndex = 0; queueIndex < QUEUE_SIZE; ++queueIndex) + { + if (!GT_GetData(hDevice, m_buffers[deviceIndex][queueIndex], BUFFER_SIZE_BYTES, &m_overlapped[deviceIndex][queueIndex])) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error on GT_GetData in the initialization phase of the loop.\n"; + return false; + } + } + } + + m_flagIsFirstLoop = false; + m_currentQueueIdx = 0; + } + + //__try + { + while (m_isThreadRunning == true) + { + try + { + //bool flagChunkLostDetected = false; + //bool flagChunkTimeOutDetected = false; + DWORD numBytesReceived = 0; + + //acquire data from the amplifier(s) + for (uint32_t deviceIndex = 0; deviceIndex < numDevices(); ++deviceIndex) + { + HANDLE device = m_devices[deviceIndex].handle; + + //wait for notification from the system telling that new data is available + if (WaitForSingleObject(m_overlapped[deviceIndex][m_currentQueueIdx].hEvent, 1000) == WAIT_TIMEOUT) + { + //std::cout << "Error on data transfer: timeout occurred." << "\n"; + m_totalDriverTimeouts++; + //flagChunkTimeOutDetected = true; + } + + //get number of received bytes... + GetOverlappedResult(device, &m_overlapped[deviceIndex][m_currentQueueIdx], &numBytesReceived, false); + + //...and check if we lost something (number of received bytes must be equal to the previously allocated buffer size) + if (numBytesReceived != BUFFER_SIZE_BYTES) + { + m_totalDriverChunksLost++; + //flagChunkLostDetected = true; + } + } + + //this line is commented on purpose + //if (flagChunkTimeOutDetected==false && flagChunkLostDetected==false) + + //store to ring buffer + { + //to store the received data into the application data buffer at once, lock it + { + std::lock_guard lock(m_io_mutex); + try + { + //if we are going to overrun on writing the received data into the buffer, set the appropriate flag; the reading thread will handle the overrun + m_bufferOverrun = (m_ringBuffer.GetFreeSize() < int(N_POINTS * numDevices())); + + //store received data from each device in the correct order (that is scan-wise, where one scan includes all channels of all devices) ignoring the header + for (size_t scanIndex = 0; scanIndex < NUMBER_OF_SCANS; ++scanIndex) + { + for (size_t deviceIndex = 0; deviceIndex < numDevices(); ++deviceIndex) + { + m_ringBuffer.Write( + (float*)(m_buffers[deviceIndex][m_currentQueueIdx] + scanIndex * (GTEC_NUM_CHANNELS + 1) * sizeof(float) + HEADER_SIZE), + (GTEC_NUM_CHANNELS + 1)); + } + } + } + catch (std::exception& e) + { + //buffer should be unclocked automatically once the scope is left + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error writing to GTEC ring buffer! Error is: " << e.what() << "\n"; + } + //buffer should be unclocked automatically once the scope is left + + m_itemAvailable.notify_one(); + } + } + + //add new GetData call to the queue replacing the currently processed one + //this gives us time to process data while we wait for a new data chunk from the amplifier + for (uint32_t deviceIndex = 0; deviceIndex < numDevices(); ++deviceIndex) + { + HANDLE hDevice = m_devices[deviceIndex].handle; + if (!GT_GetData(hDevice, m_buffers[deviceIndex][m_currentQueueIdx], BUFFER_SIZE_BYTES, + &m_overlapped[deviceIndex][m_currentQueueIdx])) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error on GT_GetData in standard loop processing.\n"; + + return false; + } + } + //increment circular queueIndex to process the next queue at the next loop repetition (on overrun start at index 0 again) + m_currentQueueIdx = (m_currentQueueIdx + 1) % QUEUE_SIZE; + } + catch (std::exception& e) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << + "General error in the thread function acquiring data from GTEC! Acquisition interrupted. Error is: " << e.what() << "\n"; + m_isThreadRunning = false; + return false; + } + } + } + //__finally + + //This code stops the amplifiers in the same thread: + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Stopping devices and cleaning up...\n"; + + //clean up allocated resources for each device + for (uint32_t i = 0; i < numDevices(); ++i) + { + HANDLE hDevice = m_devices[i].handle; + + //clean up allocated resources for each queue per device + for (int j = 0; j < QUEUE_SIZE; ++j) + { + WaitForSingleObject(m_overlapped[i][m_currentQueueIdx].hEvent, 1000); + CloseHandle(m_overlapped[i][m_currentQueueIdx].hEvent); + + //increment queue index + m_currentQueueIdx = (m_currentQueueIdx + 1) % QUEUE_SIZE; + } + + //stop device + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Sending stop command ...\n"; + if (!GT_Stop(hDevice)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Stopping device failed! Serial = " << m_devices[numDevices() - 1].serial.c_str() << "\n"; + } + + //reset data transfer + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Sending reset transfer command ...\n"; + if (!GT_ResetTransfer(hDevice)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Reset data transfer failed! Serial = " << m_devices[numDevices() - 1].serial.c_str() << "\n"; + } + + // Sometimes when the amplifier is jammed, freeing the buffer causes heap corruption if its done before stop and reset. So we free the buffers here. + for (int j = 0; j < QUEUE_SIZE; ++j) { delete [] m_buffers[i][j]; } + + delete [] m_overlapped[i]; + delete [] m_buffers[i]; + } + + m_flagIsFirstLoop = true; + m_isThreadRunning = false; + } + return true; +} + +bool CDriverGTecGUSBamp::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + //stop thread + m_isThreadRunning = false; + m_threadPtr->join(); //wait until the thread has stopped data acquisition + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Data acquisition completed.\n"; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Total number of hardware stimulations acquired: " << m_totalHardwareStimulations << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Total chunks lost: " << m_totalDriverChunksLost << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Total internal ring buffer overruns: " << m_totalRingBufferOverruns << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Total times GTEC ring data buffer was empty: " << m_totalDataUnavailable << "\n"; + + if (m_totalDriverChunksLost > 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "The driver lost " << m_totalDriverChunksLost << " chunks during the run.\n"; + } + if (m_totalDriverTimeouts > 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "The driver had " << m_totalDriverTimeouts << " timeout(s) during the run.\n"; + } + + return true; +} + +bool CDriverGTecGUSBamp::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + const int totalDevices = numDevices(); + int deviceClosed = 0; + + for (auto it = m_devices.begin(); + it != m_devices.end();) + { + if (!GT_CloseDevice(&it->handle)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unable to close device: " << it->serial.c_str() << "\n"; } + else { deviceClosed++; } + + it = m_devices.erase(it); + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Total devices closed: " << deviceClosed << " / " << totalDevices << "\n"; + + if (!m_devices.empty() || deviceClosed != totalDevices) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Some devices were not closed properly!\n"; + } + + m_devices.clear(); + + //clear memory + delete[] m_bufferReceivedData; + delete[] m_overlapped; + + if (m_sample != nullptr) + { + delete [] m_sample; + m_sample = nullptr; + } + m_callback = nullptr; + + delete[] m_buffers; + m_buffers = nullptr; + + restoreChannelNames(); + + return true; +} + +bool CDriverGTecGUSBamp::setMasterDevice(const std::string& targetMasterSerial) +{ + int targetDeviceIndex = -1;//points to the one that needs to become master + + //find master device + for (size_t i = 0; i < numDevices(); ++i) + { + if (m_devices[i].serial == targetMasterSerial) + { + targetDeviceIndex = i; + break; + } + } + + const uint32_t lastIndex = numDevices() - 1; + + if (numDevices() > 1 && targetDeviceIndex >= 0) + { + //swap the handlers and serials, sets the desired one as last and master + //start swap - put selected device as last + if (targetDeviceIndex != lastIndex) + { + std::swap(m_devices[lastIndex], m_devices[targetDeviceIndex]); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Now the last device is: " << m_devices[lastIndex].serial.c_str() << "\n"; + } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Last device was the desired one: " << m_devices[lastIndex].serial.c_str() << "\n"; } + + //set slaves and new master + m_slavesCnt = 0; + m_mastersCnt = 0; + + //configure all devices + for (uint32_t i = 0; i < numDevices(); ++i) + { + bool isSlave = (i != lastIndex); + + if (numDevices() == 1) { isSlave = false; } + + if (!GT_SetSlave(m_devices[i].handle, isSlave)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_SetSlave\n"; + } + + if (isSlave) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Configured as slave device: " << m_devices[i].serial.c_str() << "\n"; + m_slavesCnt++; + } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Configured as MASTER device: " << m_devices[i].serial.c_str() + << " (the master is always last in the acquisition sequence) \n"; + m_mastersCnt++; + m_masterSerial = m_devices[i].serial; + } + } + + verifySyncMode(); + } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Bad number of devices detected for this operation or invalid master selection!" << "\n"; + return false; + } + + return true; +} + +//Checks if devices are configured correctly when acquiring data from multiple devices +bool CDriverGTecGUSBamp::verifySyncMode() +{ + //g.tec check list + if (numDevices() > 1) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "More than 1 device detected, performing some basic sync checks.\n"; + + //Test that only one device is master + if ((m_mastersCnt + m_slavesCnt != numDevices()) || (m_mastersCnt != 1)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Problem with number of slaves/masters compared to total number of devices!\n"; + return false; + } + + //Test that the master device is the last in the sequence + const std::string serialLastDevice = m_devices[numDevices() - 1].serial; + + if (serialLastDevice != m_masterSerial) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Master device is not the last one! serial last device =" << serialLastDevice + << " and master=" << m_masterSerial << " .\n"; + return false; + } + } + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverGTecGUSBamp::configure() +{ + detectDevices(); + + std::vector serials; + for (size_t i = 0; i < numDevices(); ++i) { serials.push_back(m_devices[i].serial); } + + CConfigurationGTecGUSBamp config(Directories::getDataDir() + "/applications/acquisition-server/interface-GTec-GUSBamp.ui", //m_deviceIdx, + m_commonGndAndRefBitmap, m_notchFilterIdx, m_bandPassFilterIdx, m_triggerInputEnabled, serials, m_masterSerial, + m_bipolarEnabled, m_calibrationSignalEnabled, m_showDeviceName); + + + // The number of channels is initially the maximum with the trigger channels not counted + if (m_header.getChannelCount() == 0) + { + const uint32_t nTotalChannel = numDevices() * GTEC_NUM_CHANNELS; + m_header.setChannelCount(nTotalChannel); + } + + if (!config.configure(m_header)) { return false; } + + //get new value from header + this->m_nAcquiredChannel = m_header.getChannelCount(); + + m_settings.save(); + + //start reconfigure based on the new input: + + if (numDevices() > 1) { setMasterDevice(m_masterSerial); } + + //end reconfigure based on the new input + + return true; +} + +void CDriverGTecGUSBamp::configFiltering(HANDLE device) +{ + int nrOfFilters; + const float mySamplingRate = float(m_header.getSamplingFrequency()); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << getSerialByHandler(device) << ": Notch filter index " << m_notchFilterIdx + << ", bandpass filter index " << m_bandPassFilterIdx << "\n"; + + //Set BandPass + + // get the number of available filters + bool status = GT_GetNumberOfFilter(&nrOfFilters); + if (status == false) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << getSerialByHandler(device) + << ": Could not get the number of dsp filters!Filtering is disabled.\n"; + return; + } + + // create array of FILT structures to store the filter settings + FILT* filters = new FILT[nrOfFilters]; + + // fill array with filter settings + status = GT_GetFilterSpec(filters); + if (status == false) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << getSerialByHandler(device) + << ": Could not get the list of dsp filters! Filtering is disabled.\n"; + delete[] filters; + return; + } + + for (int i = 1; i <= GTEC_NUM_CHANNELS; ++i) //channels must be [1..16] + { + status = GT_SetBandPass(device, i, m_bandPassFilterIdx); + if (status == false) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << getSerialByHandler(device) << ": Could not set band pass filter on channel " << i << "\n"; + delete[] filters; + return; + } + } + + if (m_bandPassFilterIdx == -1) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << getSerialByHandler(device) << ": No BandPass filter applied.\n"; } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << getSerialByHandler(device) << ": Bandpass filter applied: between " + << filters[m_bandPassFilterIdx].fu << " and " << filters[m_bandPassFilterIdx].fo << ", order = " + << filters[m_bandPassFilterIdx].order << ", type = " << ((filters[m_bandPassFilterIdx].type == 1) ? "butterworth" : "chebyshev") + << ", frequency = " << mySamplingRate << "\n"; + } + delete[] filters; + + //Set Notch + + // get the number of available filters + status = GT_GetNumberOfNotch(&nrOfFilters); + if (status == false) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << getSerialByHandler(device) + << ": Could not get the number of notch filters! Filtering is disabled.\n"; + return; + } + + // create array of FILT structures to store the filter settings + filters = new FILT[nrOfFilters]; + + // fill array with filter settings + status = GT_GetNotchSpec(filters); + if (status == false) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << getSerialByHandler(device) + << ": Could not get the list of notch filters! Filtering is disabled.\n"; + delete[] filters; + return; + } + + for (int i = 1; i <= GTEC_NUM_CHANNELS; ++i) //channels must be [1..16] + { + status = GT_SetNotch(device, i, m_notchFilterIdx); + if (status == 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << getSerialByHandler(device) << ": Could not set notch filter on channel " << i << "\n"; + delete[] filters; + return; + } + } + + if (m_notchFilterIdx == -1) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << getSerialByHandler(device) << ": No Notch filter applied.\n"; } + else + { + const uint32_t frequency = uint32_t((filters[m_notchFilterIdx].fo + filters[m_notchFilterIdx].fu) / 2); + std::string country("Unknown countries"); + if (frequency == 50) { country = "Europe"; } + else if (frequency == 60) { country = "USA"; } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << getSerialByHandler(device) << ": Notch filter applied: " << frequency + << " Hz (usually used e.g. in " << country << ")\n"; + } + + delete[] filters; +} + +//Adds the amplifier ID to the channel name +void CDriverGTecGUSBamp::remapChannelNames() +{ + // Store original channel names + m_originalChannelNames.clear(); + for (size_t i = 0; i < m_nAcquiredChannel; ++i) { m_originalChannelNames.push_back(m_header.getChannelName(i)); } + + // Add the trigger channels + if (m_triggerInputEnabled) { m_header.setChannelCount(m_nAcquiredChannel + numDevices()); } + else { m_header.setChannelCount(m_nAcquiredChannel); } + + for (size_t i = 0; i < m_channels.size(); ++i) + { + if (m_channels[i].idx >= 0) + { + const uint32_t maxChannelsPerAmp = (GTEC_NUM_CHANNELS + 1); + const uint32_t idx = i / maxChannelsPerAmp; + + std::string channelName; + if (m_channels[i].isEventChannel) { channelName = "CH_Event" + std::to_string(idx); } + else { channelName = m_originalChannelNames[m_channels[i].oldIdx]; } + + if (channelName.length() == 0) + { + if (!m_showDeviceName) { channelName = "Channel "; } + + channelName += std::to_string(m_channels[i].oldIdx + 1); + } + + if (m_showDeviceName) { channelName += "_" + m_devices[idx].serial; } + + //std::cout << m_channels[i].idx << " to'" << channelName << "'" << std::endl; + + m_header.setChannelName(m_channels[i].idx, channelName.c_str()); + } + } +} + +void CDriverGTecGUSBamp::restoreChannelNames() +{ + // Restore channel count without event channels + m_header.setChannelCount(m_nAcquiredChannel); + + // Reset the original channel names + for (uint32_t i = 0; i < m_nAcquiredChannel; ++i) { m_header.setChannelName(i, m_originalChannelNames[i].c_str()); } +} + +std::string CDriverGTecGUSBamp::getSerialByHandler(const HANDLE device) +{ + if (m_devices.empty()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not find serial: no devices!\n"; + return "ERROOR"; + } + + for (size_t i = 0; i < m_devices.size(); ++i) { if (device == m_devices[i].handle) { return m_devices[i].serial; } } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not find serial for this device!\n"; + return "ERROR UNKNOWN SERIAL"; +} + +inline std::ostream& operator<<(std::ostream& out, const std::vector& var) +{ + for (size_t i = 0; i < var.size(); ++i) { out << var[i] << " "; } + return out; +} + +inline std::istream& operator>>(std::istream& in, std::vector& var) +{ + var.clear(); + std::string tmp; + while (in >> tmp) { var.push_back(tmp); } + return in; +} + +inline std::ostream& operator<<(std::ostream& out, const std::vector& var) +{ + for (size_t i = 0; i < var.size(); ++i) { out << var[i].serial << " "; } + return out; +} + +inline std::istream& operator>>(std::istream& in, std::vector& var) +{ + //std::cout << "Error not implemented operator >>!"; + return in; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyGUSBampCAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/gusbamp/src/CDriverGTecGUSBamp.hpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/gusbamp/src/CDriverGTecGUSBamp.hpp new file mode 100644 index 0000000..271bdc3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/gusbamp/src/CDriverGTecGUSBamp.hpp @@ -0,0 +1,183 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyGUSBampCAPI + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include + +#include "ringbuffer.h" + +#include +#include + +//threading +#include +#include +#include +#include // unique_ptr + +#include + +namespace OpenViBE +{ + namespace AcquisitionServer + { + /** + * \class CDriverGTecGUSBamp + * \author Anton Andreev, Gipsa-lab, VIBS team + * \date 19/07/2012 + * \brief GTEC driver + * + * This driver was rewritten to match the code provided by Guger as much as possible. There are several things + * that all must work together so that higher frequencies are supported and no hardware triggers are lost. + * + * This driver supports several buffers so that the more than one GT_GetData can be executed in the beginning (QUEUE_SIZE) + * and then calls to GT_GetData are queued. This allows data to be processed by OpenVibe while waiting for the next result of + * a previously issued GT_GetData. The extra thread is added to support this and to allow for async IO. + * + * Hardware triggers on the parallel port are supported. + * + * The driver supports several g.tec devices working with the provided async cables. There are several requirements for async + * acquisition to work properly and these are checked in verifySyncMode(). + */ +#ifndef __GDEVICE_H__ +#define __GDEVICE_H__ + struct GDevice + { + HANDLE handle; + std::string serial; + }; +#endif + + class CDriverGTecGUSBamp final : public IDriver + { + public: + + explicit CDriverGTecGUSBamp(IDriverContext& ctx); + + void release() { delete this; } + const char* getName() override { return "g.tec gUSBamp Gipsa-lab"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool CDriverGTecGUSBamp::acquire(); + + void configFiltering(HANDLE device); + + protected: + + static const int BUFFER_SIZE_SECONDS = 2; //the size of the GTEC ring buffer in seconds + static const int GTEC_NUM_CHANNELS = 16; //the number of channels without countig the trigger channel + static const int QUEUE_SIZE = + 8; //4 default //the number of GT_GetData calls that will be queued during acquisition to avoid loss of data + static const int NUMBER_OF_SCANS = + 32; //the number of scans that should be received simultaneously (depending on the _sampleRate; see C-API documentation for this value!) + + size_t numDevices() const { return m_devices.size(); } + + static const uint32_t N_POINTS = NUMBER_OF_SCANS * (GTEC_NUM_CHANNELS + 1); + int m_validPoints = 0; + static const DWORD BUFFER_SIZE_BYTES; + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + float* m_sample = nullptr; + uint32_t m_nSamplePerSentBlock = 0; + + uint32_t m_globalImpedanceIdx = 0; + + uint8_t m_commonGndAndRefBitmap = 0; + + int m_notchFilterIdx = -1; + int m_bandPassFilterIdx = -1; + + bool m_triggerInputEnabled = false; + bool m_bipolarEnabled = + false; //electrodes are substracted in sepecific sequence 1-2=1, ... 15-16=15 which results in 8 instead of 16 electrodes - used for EMG + bool m_calibrationSignalEnabled = false; + bool m_showDeviceName = false; //adds the amplifier serial number to the name of the channel + bool m_reconfigurationRequired = false; // After some gt calls, we may need reconfig + + uint32_t m_nAcquiredChannel = GTEC_NUM_CHANNELS; //number of channels specified by the user, never counts the event channels + + uint32_t m_totalHardwareStimulations = 0; //since start button clicked + uint32_t m_totalDriverChunksLost = 0; //since start button clicked + uint32_t m_totalDriverTimeouts = 0; //since start button clicked + uint32_t m_totalRingBufferOverruns = 0; + uint32_t m_totalDataUnavailable = 0; + + //contains buffer per device and then QUEUE_SIZE buffers so that several calls to GT_GetData can be supported + BYTE*** m_buffers = nullptr; + OVERLAPPED** m_overlapped = nullptr; + + bool m_flagIsFirstLoop = true; + bool m_bufferOverrun = false; + + //ring buffer provided by Guger + CRingBuffer m_ringBuffer; + + uint32_t m_currentQueueIdx = 0; + + std::unique_ptr m_threadPtr; + bool m_isThreadRunning = false; + + std::mutex m_io_mutex; + + float* m_bufferReceivedData = nullptr; + std::condition_variable m_itemAvailable; + + bool configureDevice(uint32_t deviceNumber); + + bool verifySyncMode();//Checks if devices are configured correctly when acquiring data from multiple devices + + //Selects which device to become the new master, used only when more than 1 device is available + bool setMasterDevice(const std::string& targetMasterSerial); //0 first device + void detectDevices(); + + uint32_t m_mastersCnt = 0; + uint32_t m_slavesCnt = 0; + std::string m_masterSerial = ""; + + void remapChannelNames(); // Converts channel names while appending the device name and handling event channels + void restoreChannelNames(); // Restores channel names without the device name + + std::vector m_originalChannelNames; // Channel names without the device name inserted + std::vector m_devices; // List of amplifiers + + std::string CDriverGTecGUSBamp::getSerialByHandler(HANDLE device); + + // Stores information related to each channel available in the recording system + struct SChannel + { + int idx; // Channel index in openvibe Designer, -1 is unused + int oldIdx; // Channel index in the user-settable channel name list + int gtecDeviceIdx; // Device index of the gtec amplifier this channel is in + int gtecChannelIdx; // Channel index in the device-specific numbering + bool isEventChannel; // Is this the special digital channel? + }; + + // Channel indexes are seen as a sequence [dev1chn1, dev1chn2,...,dev1chnN, dev2chn1, dev2chn2, ..., dev2chnN, ...] + // The following vector is used to map these 'system indexes' to openvibe channels + std::vector m_channels; + }; + } // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGUSBampCAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/unicorn/src/CDriverGTecUnicorn.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/unicorn/src/CDriverGTecUnicorn.cpp new file mode 100644 index 0000000..5989067 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/unicorn/src/CDriverGTecUnicorn.cpp @@ -0,0 +1,458 @@ +/** + * Software License Agreement (AGPL-3 License) + * + * \file CDriverGTecUnicorn.cpp + * \author Anton Andreev, Gipsa-lab, VIBS team + * \date 21/08/2020 + * \brief Implementation of GTEC Unicorn Black Driver + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#if defined TARGET_HAS_ThirdPartyGtecUnicron + +#include "CDriverGTecUnicorn.hpp" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "unicorn.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +#if defined(TARGET_OS_Windows) +#pragma warning(disable: 4800) // disable "forcing value to bool 'true' or 'false' (performance warning)" nag coming from BOOL->bool cast on e.g. VS2010 +#endif + +CDriverGTecUnicorn::CDriverGTecUnicorn(IDriverContext& rDriverContext) + : IDriver(rDriverContext), m_settings("AcquisitionServer_Driver_GTecGUSBamp", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(UNICORN_SAMPLING_RATE); + m_header.setChannelCount(0); + + //m_settings.load(); +} +//___________________________________________________________________// +// // + +bool CDriverGTecUnicorn::initialize( + const uint32_t sampleCountPerSentBlock, + IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) { return false; } + + detectDevices(); + + if (numDevices() == 0) { return false; } + + m_sampleCountPerSentBlock = sampleCountPerSentBlock; + m_callback = &callback; + + // Set number of channels + int errorCode = UNICORN_GetNumberOfAcquiredChannels(m_devices[kSelectedDevice].handle, &m_acquiredChannelCount); + if (errorCode != UNICORN_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unable to get channel count.\n"; + return false; + } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Number of available channels is: " << m_acquiredChannelCount << "\n"; } + + m_header.setChannelCount(m_acquiredChannelCount); //only 8 channels are EEG, but currently we provide everything + m_lengthBufferRawUnicornDevice = m_acquiredChannelCount * kFrameLength; + + /* + * Set channel names + * 17 channels from Unicorn Black on every sample: | EEG1| EEG2| EEG3| EEG4| EEG5| EEG6| EEG7| EEG8| ACCX|ACCY| ACCZ| GYRX|GYRY| GYRZ|CNT|BATLVL|VALID| + * Order might be different. This is why we need to use UNICORN_GetChannelIndex(channel name); + */ + m_header.setChannelName(getChannelIndex(m_devices[kSelectedDevice].handle, "EEG 1"), "EEG1"); + m_header.setChannelName(getChannelIndex(m_devices[kSelectedDevice].handle, "EEG 2"), "EEG2"); + m_header.setChannelName(getChannelIndex(m_devices[kSelectedDevice].handle, "EEG 3"), "EEG3"); + m_header.setChannelName(getChannelIndex(m_devices[kSelectedDevice].handle, "EEG 4"), "EEG4"); + m_header.setChannelName(getChannelIndex(m_devices[kSelectedDevice].handle, "EEG 5"), "EEG5"); + m_header.setChannelName(getChannelIndex(m_devices[kSelectedDevice].handle, "EEG 6"), "EEG6"); + m_header.setChannelName(getChannelIndex(m_devices[kSelectedDevice].handle, "EEG 7"), "EEG7"); + m_header.setChannelName(getChannelIndex(m_devices[kSelectedDevice].handle, "EEG 8"), "EEG8"); + + m_header.setChannelName(getChannelIndex(m_devices[kSelectedDevice].handle, "Accelerometer X"), "ACCX"); + m_header.setChannelName(getChannelIndex(m_devices[kSelectedDevice].handle, "Accelerometer Y"), "ACCY"); + m_header.setChannelName(getChannelIndex(m_devices[kSelectedDevice].handle, "Accelerometer Z"), "ACCZ"); + m_header.setChannelName(getChannelIndex(m_devices[kSelectedDevice].handle, "Gyroscope X"), "GYRX"); + m_header.setChannelName(getChannelIndex(m_devices[kSelectedDevice].handle, "Gyroscope Y"), "GYRY"); + m_header.setChannelName(getChannelIndex(m_devices[kSelectedDevice].handle, "Gyroscope Z"), "GYRZ"); + m_channelCounterIndex = getChannelIndex(m_devices[kSelectedDevice].handle, "Counter"); + m_header.setChannelName(m_channelCounterIndex, "Counter"); + m_header.setChannelName(getChannelIndex(m_devices[kSelectedDevice].handle, "Battery Level"), "Battery"); + m_header.setChannelName(getChannelIndex(m_devices[kSelectedDevice].handle, "Validation Indicator"), "VI"); + + // Initialize buffers + m_bufferReceivedDataFromRing = new float[m_lengthBufferRawUnicornDevice]; + m_bufferForOpenVibe = new float[m_lengthBufferRawUnicornDevice]; + + m_ringBuffer.Initialize(static_cast(kBufferSizeSeconds * m_header.getSamplingFrequency() * m_lengthBufferRawUnicornDevice)); + + // Configure each device + for (size_t i = 0; i < numDevices(); i++) { configureDevice(i); } + + return true; +} + +void CDriverGTecUnicorn::detectDevices() +{ + int errorCode = UNICORN_ERROR_SUCCESS; + + // Get number of available devices + unsigned int availableDevicesCount = 0; + errorCode = UNICORN_GetAvailableDevices(NULL, &availableDevicesCount, TRUE); + + // Get serials of available devices + UNICORN_DEVICE_SERIAL* availableDevices = new UNICORN_DEVICE_SERIAL[availableDevicesCount]; + errorCode = UNICORN_GetAvailableDevices(availableDevices, &availableDevicesCount, TRUE); + + if (errorCode != UNICORN_ERROR_SUCCESS || availableDevicesCount < 1) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "No device available. Please pair with a Unicorn device first.\n"; + } + else + { + // Create a GDevice list for all devices and print available device serials + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Available Unicorn devices:\n"; + + for (unsigned int i = 0; i < availableDevicesCount; i++) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "#" << i << ": " << availableDevices[i] << "\n"; + + GDevice device; + + UNICORN_HANDLE deviceHandle; + + int errorCode = UNICORN_OpenDevice(availableDevices[i], &deviceHandle); + if (errorCode != UNICORN_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unable to connect to device: '" << availableDevices[i] << "'\n"; + } + + device.handle = deviceHandle; + + device.serial = availableDevices[i]; + + m_devices.push_back(device); + } + } +} + +bool CDriverGTecUnicorn::configureDevice(size_t deviceNumber) +{ + int errorCode = UNICORN_ERROR_SUCCESS; + + UNICORN_HANDLE device = m_devices[deviceNumber].handle; + const std::string currentSerial = m_devices[deviceNumber].serial; + + UNICORN_AMPLIFIER_CONFIGURATION configuration; + errorCode = UNICORN_GetConfiguration(device, &configuration); + + if (errorCode != UNICORN_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unable to get configuration for: '" << currentSerial.c_str() << "'\n"; + return false; + } + + return true; +} + +bool CDriverGTecUnicorn::start() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (m_driverCtx.isStarted()) { return false; } + + m_totalHardwareStimulations = 0; + m_totalRingBufferOverruns = 0; + m_totalCounterErrors = 0; + + { + std::lock_guard lock(m_mutex); + m_ringBuffer.Reset(); + } + + for (size_t i = 0; i < numDevices(); i++) + { + UNICORN_HANDLE device = m_devices[i].handle; + UNICORN_StartAcquisition(device, kTestSignalEnabled); + } + + m_isThreadRunning = true; + m_flagIsFirstLoop = true; + m_bufferOverrun = false; + + m_thread.reset(new std::thread(std::bind(&CDriverGTecUnicorn::acquire, this))); + + return true; +} + +// This method is called by the AS and it supplies the acquired data to the AS +bool CDriverGTecUnicorn::loop() +{ + if (m_driverCtx.isStarted()) + { + { + std::unique_lock lock(m_mutex); + + while (m_ringBuffer.GetSize() < static_cast(m_lengthBufferRawUnicornDevice)) { m_itemAvailable.wait(lock); } + + try + { + if (m_bufferOverrun) + { + m_ringBuffer.Reset(); + m_bufferOverrun = false; + m_totalRingBufferOverruns++; + return true; + } + + m_ringBuffer.Read(m_bufferReceivedDataFromRing, m_lengthBufferRawUnicornDevice); + } + catch (std::exception& e) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error reading GTEC ring buffer! Error is:" << e.what() << "\n"; + } + + m_itemAvailable.notify_one(); + } + + // covert to openvibe format ch1,ch1,ch1,ch2,ch2,ch2 ... + for (size_t i = 0; i < m_acquiredChannelCount; i++) + { + for (size_t j = 0; j < kFrameLength; j++) + { + m_bufferForOpenVibe[kFrameLength * i + j] = m_bufferReceivedDataFromRing[j * m_acquiredChannelCount + i]; + } + } + + // verify counter + const size_t counterPos = kFrameLength * m_channelCounterIndex; + for (size_t i = counterPos; i < kFrameLength; i++) { if (!(m_bufferForOpenVibe[i] < m_bufferForOpenVibe[i + 1])) { m_totalCounterErrors++; } } + + // forward data + m_callback->setSamples(m_bufferForOpenVibe, kFrameLength); + CStimulationSet stimulationSet; + m_callback->setStimulationSet(stimulationSet); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + else { System::Time::sleep(20); } + + return true; +} + +// This function used by the thread +bool CDriverGTecUnicorn::acquire() +{ + if (m_flagIsFirstLoop) //First time do some memory initialization, etc + { + m_bufferRawUnicornDevice = new float[m_lengthBufferRawUnicornDevice]; + + m_flagIsFirstLoop = false; + } + + while (m_isThreadRunning == true) + { + try + { + bool flagChunkLostDetected = false; + bool flagChunkTimeOutDetected = false; + + UNICORN_HANDLE device = m_devices[kSelectedDevice].handle; + + // Get kFrameLength number of samples + if (UNICORN_GetData(device, kFrameLength, m_bufferRawUnicornDevice, m_lengthBufferRawUnicornDevice * sizeof(float)) != UNICORN_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error on GT_GetData\n"; + return false; + } + + // store to ring buffer, lock it during insertion + { + std::lock_guard lock(m_mutex); + try + { + // if we are going to overrun on writing the received data into the buffer, set the appropriate flag; the reading thread will handle the overrun + m_bufferOverrun = (m_ringBuffer.GetFreeSize() < static_cast(m_lengthBufferRawUnicornDevice)); + + m_ringBuffer.Write(m_bufferRawUnicornDevice, m_lengthBufferRawUnicornDevice); + } + catch (std::exception& e) + { + // buffer should be unclocked automatically once the scope is left + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error writing to GTEC ring buffer! Error is: " << e.what() << "\n"; + } + // buffer should be unclocked automatically once the scope is left + + m_itemAvailable.notify_one(); + } + } + catch (std::exception& e) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << + "General error in the thread function acquiring data from GTEC! Acquisition interrupted. Error is: " << e.what() << "\n"; + m_isThreadRunning = false; + return false; + } + } + + // This code stops the amplifiers in the same thread: + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Stopping devices and cleaning up...\n"; + + // clean up allocated resources for each device + for (size_t i = 0; i < numDevices(); i++) + { + UNICORN_HANDLE device = m_devices[i].handle; + + // stop device + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Sending stop command ...\n"; + if (UNICORN_StopAcquisition(device) != UNICORN_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Stopping device failed! Serial = " << m_devices[numDevices() - 1].serial.c_str() << "\n"; + } + + // clear memory + delete[] m_bufferRawUnicornDevice; + } + + m_flagIsFirstLoop = true; + m_isThreadRunning = false; + } + return true; +} + +bool CDriverGTecUnicorn::stop() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted()) { return false; } + + // stop thread + m_isThreadRunning = false; + m_thread->join(); //wait until the thread has stopped data acquisition + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Data acquisition completed.\n"; + + if (m_totalRingBufferOverruns > 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Total internal ring buffer overruns: " << m_totalRingBufferOverruns << "\n"; + } + if (m_totalCounterErrors > 0) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Total Unicorn counter errors: " << m_totalCounterErrors << "\n"; } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Total Unicorn counter errors: " << m_totalCounterErrors << "\n"; } + + return true; +} + +bool CDriverGTecUnicorn::uninitialize() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (m_driverCtx.isStarted()) { return false; } + + const size_t totalDevices = numDevices(); + size_t deviceClosed = 0; + + for (std::vector::iterator it = m_devices.begin(); it != m_devices.end();) + { + if (UNICORN_CloseDevice(&it->handle) != UNICORN_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unable to close device: " << it->serial.c_str() << "\n"; + } + else { deviceClosed++; } + + it = m_devices.erase(it); + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Total devices closed: " << deviceClosed << " / " << totalDevices << "\n"; + + if (!m_devices.empty() || deviceClosed != totalDevices) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Some devices were not closed properly!\n"; + } + + m_devices.clear(); + + // clear memory + if (m_bufferReceivedDataFromRing != nullptr) + { + delete[] m_bufferReceivedDataFromRing; + m_bufferReceivedDataFromRing = nullptr; + } + + if (m_bufferForOpenVibe != nullptr) + { + delete[] m_bufferForOpenVibe; + m_bufferForOpenVibe = nullptr; + } + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // +inline size_t CDriverGTecUnicorn::getChannelIndex(UNICORN_HANDLE device, const char* name) +{ + uint32_t* result = new uint32_t[1]; + if (UNICORN_GetChannelIndex(device, name, result) != UNICORN_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error getting channel index for channel: '" << name << "'\n"; + } + return static_cast(*result); +} + +inline std::ostream& operator<<(std::ostream& out, const std::vector& var) +{ + for (size_t i = 0; i < var.size(); i++) { out << var[i] << " "; } + + return out; +} + +inline std::istream& operator>>(std::istream& in, std::vector& var) +{ + var.clear(); + std::string tmp; + while (in >> tmp) { var.push_back(tmp); } + + return in; +} + +inline std::ostream& operator<<(std::ostream& out, const std::vector& var) +{ + for (size_t i = 0; i < var.size(); i++) { out << var[i].serial << " "; } + + return out; +} + +inline std::istream& operator>>(std::istream& in, std::vector& var) +{ + // "Error not implemented operator >>!"; + + return in; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGUSBampCAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/unicorn/src/CDriverGTecUnicorn.hpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/unicorn/src/CDriverGTecUnicorn.hpp new file mode 100644 index 0000000..c18845c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gipsa/unicorn/src/CDriverGTecUnicorn.hpp @@ -0,0 +1,144 @@ +/** + * Software License Agreement (AGPL-3 License) + * + * \file CDriverGTecUnicorn.hpp + * \author Anton Andreev, Gipsa-lab, VIBS team + * \date 21/08/2020 + * \brief GTEC Unicorn Black Driver + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#pragma once + +#if defined TARGET_HAS_ThirdPartyGtecUnicron + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include + +#include "ringbuffer.h" + +#include + +//threading +#include +#include +#include +#include // unique_ptr + +#include + +#include "unicorn.h" + +namespace OpenViBE { +namespace AcquisitionServer { + + +#ifndef __GDEVICE_H__ +#define __GDEVICE_H__ +struct GDevice +{ + UNICORN_HANDLE handle; + std::string serial; +}; +#endif + +class CDriverGTecUnicorn : public OpenViBE::AcquisitionServer::IDriver +{ +public: + CDriverGTecUnicorn(OpenViBE::AcquisitionServer::IDriverContext& rDriverContext); + + void release() { delete this; }; + const char* getName() override { return "g.tec Unicorn Gipsa-lab"; }; + + bool initialize(const uint32_t sampleCountPerSentBlock, OpenViBE::AcquisitionServer::IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return false; } + bool configure() override { return true; }; + const OpenViBE::AcquisitionServer::IHeader* getHeader() override { return &m_header; } + + bool acquire(); + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + +protected: + + static const uint64_t kBufferSizeSeconds = 2; // The size of the GTEC ring buffer in seconds + static const uint32_t kGTecNumChannels = 17; // The number of channels + + static const uint32_t kFrameLength = 8; // The number of samples acquired per Get_Data() call and the number of samples supplied to OpenVibe (per loop) + static const bool kTestSignalEnabled = FALSE; // Flag to enable or disable testsignal. + static const size_t kSelectedDevice = 0; // If several Unicorn devices are in range, the first one will be automatically selected + + SettingsHelper m_settings; + + OpenViBE::AcquisitionServer::IDriverCallback* m_callback = nullptr; + OpenViBE::AcquisitionServer::CHeader m_header; + + size_t m_sampleCountPerSentBlock = 0; + + // START declaration buffers + float* m_bufferRawUnicornDevice = nullptr; // buffer 1 : data from device to ring buffer + + float* m_bufferReceivedDataFromRing = nullptr; // buffer 2 : data from ring buffer + + float* m_bufferForOpenVibe = nullptr; // buffer 3 : data converted to OpenVibe format + // END declaration buffers + + uint32_t m_acquiredChannelCount = kGTecNumChannels; //number of channels specified by the user, never counts the event channels + + size_t m_totalHardwareStimulations = 0; //since start button clicked + size_t m_totalRingBufferOverruns = 0; + size_t m_totalCounterErrors = 0; + + bool m_flagIsFirstLoop = true; + bool m_bufferOverrun = false; + + // ring buffer provided by Guger + CRingBuffer m_ringBuffer; + + std::unique_ptr m_thread; + bool m_isThreadRunning = false; + std::mutex m_mutex; + std::condition_variable m_itemAvailable; + + // List of amplifiers + std::vector m_devices; + + uint32_t m_lengthBufferRawUnicornDevice = 0; + + size_t m_channelCounterIndex = 0; + + + bool configureDevice(size_t deviceNumber); + void detectDevices(); + size_t numDevices() const { return m_devices.size(); }; + size_t getChannelIndex(UNICORN_HANDLE hDevice, const char *name); + +}; + +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGtecUnicron diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/share/interface-GTec-GMobiLabPlus.ui b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/share/interface-GTec-GMobiLabPlus.ui new file mode 100755 index 0000000..e65d368 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/share/interface-GTec-GMobiLabPlus.ui @@ -0,0 +1,410 @@ + + + + + + 1 + 1 + 8 + 1 + 10 + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + /dev/rfcomm0 + + + /dev/rfcomm1 + + + + + + + + + + + 256 + + + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + g.Tec gMobi Lab+ + center + + + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 6 + 2 + True + + + True + True + 0 + adjustment1 + True + True + + + 1 + 2 + 4 + 5 + + + + + True + Number of channels : + right + True + + + 4 + 5 + + + + + True + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + adjustment3 + True + True + + + 1 + 2 + + + + + True + Identifier : + right + True + + + + + True + 5 + 5 + Port name : + center + True + 10 + + + 3 + 4 + + + + + True + True + + /dev/rfcomm0 + + + 1 + 2 + 3 + 4 + + + + + True + False + Use test mode : + + + 6 + 7 + + + + + True + True + False + False + True + + + 1 + 2 + 6 + 7 + + + + + + True + model3 + + + + 0 + + + + + 1 + 2 + 5 + 6 + + + + + True + Sampling frequency : + right + True + + + 5 + 6 + + + + + 0 + + + + + 0 + + + + + Change channel names... + True + True + True + + + False + 1 + + + + + 3 + + + + + True + + + False + 4 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/README b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/README new file mode 100755 index 0000000..0245d8a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/README @@ -0,0 +1,14 @@ +To use the gTec gMOBIlab+ device, it is necessary to connect it via Blutooth to the computer. +First the computer has to recognize the new peripheral (the gTec gMOBIlab+) and then the computer has to be connected to it. + +The command on linux is : + +rfcomm connect # xx:xx:xx:xx:xx:xx + +Where # has to be replaced by a port number (0 if you want to connect to /dev/rfcomm0) and xx:xx:xx:xx:xx:xx is the mac address of the gTec module. +Once the device is connected, the OpenViBE-aquisition-server file can be run. A pop up appears with a menu containing "gTec gMOBIlab+", that has to be selected. +After checking in the properties that the port name is the same as the one you are connected to (default name is /dev/rfcomm0), it is possible to try to connect. + +If the connection to the server fails, the state of the gMOBIlab+ should be checked : the diode of the gMOBIlab+ device should flash on and off. + +The frequency of the gTecMobiLab+ is 256 Hz. diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/ovasCConfigurationGTecGMobiLabPlus.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/ovasCConfigurationGTecGMobiLabPlus.cpp new file mode 100755 index 0000000..1f96468 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/ovasCConfigurationGTecGMobiLabPlus.cpp @@ -0,0 +1,46 @@ +/** + * The gMobilab driver was contributed + * by Lucie Daubigney from Supelec Metz + */ + +#include "ovasCConfigurationGTecGMobiLabPlus.h" + +#if defined TARGET_HAS_ThirdPartyGMobiLabPlusAPI + +namespace OpenViBE { +namespace AcquisitionServer { + +CConfigurationGTecGMobiLabPlus::CConfigurationGTecGMobiLabPlus(const char* gtkBuilderFilename, std::string& portName, bool& testMode) + : CConfigurationBuilder(gtkBuilderFilename), m_portName(portName), m_testMode(testMode) {} + +bool CConfigurationGTecGMobiLabPlus::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + GtkEntry* port = GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_port")); + gtk_entry_set_text(port, m_portName.c_str()); + + GtkToggleButton* testMode = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_testmode")); + gtk_toggle_button_set_active(testMode, m_testMode); + + return true; +} + + +bool CConfigurationGTecGMobiLabPlus::postConfigure() +{ + if (m_applyConfig) + { + GtkEntry* port = GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_port")); + m_portName = gtk_entry_get_text(port); + + GtkToggleButton* testMode = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_testmode")); + m_testMode = (gtk_toggle_button_get_active(testMode) > 0); + } + + return CConfigurationBuilder::postConfigure(); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyGMobiLabPlusAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/ovasCConfigurationGTecGMobiLabPlus.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/ovasCConfigurationGTecGMobiLabPlus.h new file mode 100755 index 0000000..2cd6d12 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/ovasCConfigurationGTecGMobiLabPlus.h @@ -0,0 +1,37 @@ +/** + * The gMobilab driver was contributed + * by Lucie Daubigney from Supelec Metz + */ + +#pragma once + +#include "../ovasCConfigurationBuilder.h" + +#if defined TARGET_HAS_ThirdPartyGMobiLabPlusAPI + +// #ifdef TARGET_OS_Windows +// #include +// #endif + +#include + +namespace OpenViBE { +namespace AcquisitionServer { +class CConfigurationGTecGMobiLabPlus final : public CConfigurationBuilder +{ +public: + + CConfigurationGTecGMobiLabPlus(const char* gtkBuilderFilename, std::string& portName, bool& testMode); + + bool preConfigure() override; + bool postConfigure() override; + +private: + + std::string& m_portName; + bool& m_testMode; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGMobiLabPlusAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/ovasCDriverGTecGMobiLabPlus.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/ovasCDriverGTecGMobiLabPlus.cpp new file mode 100644 index 0000000..9eaa407 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/ovasCDriverGTecGMobiLabPlus.cpp @@ -0,0 +1,432 @@ +/** + * The gMobilab Linux driver was contributed by Lucie Daubigney from Supelec Metz + * + * Windows compatibility + gusbamp coexistence added by Jussi T. Lindgren / Inria + * + */ + +#include "ovasCDriverGTecGMobiLabPlus.h" +#include "ovasCConfigurationGTecGMobiLabPlus.h" + +#if defined TARGET_HAS_ThirdPartyGMobiLabPlusAPI + +#include "ovasCDriverGTecGMobiLabPlusPrivate.h" + +#include + +#include + +#include +#include +#include +#include +#include + +#if defined(TARGET_OS_Linux) +#include +#endif + + +namespace OpenViBE { +namespace AcquisitionServer { + +static const uint32_t N_ACQUIRED_CHANNEL = 8; + +//constructor +CDriverGTecGMobiLabPlus::CDriverGTecGMobiLabPlus(IDriverContext& ctx) + : IDriver(ctx) + , m_settings("AcquisitionServer_Driver_GTecMobiLabPlus", m_driverCtx.getConfigurationManager()) + , m_library(nullptr) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGTecGMobiLabPlus::CDriverGTecGMobiLabPlus\n"; + + m_gTec = new CDriverGTecGMobiLabPlusPrivate(); + + m_header = new CHeader(); + m_header->setSamplingFrequency(256); + m_header->setChannelCount(8); + + m_gTec->m_oBuffer.pBuffer = nullptr; + m_gTec->m_oBuffer.size = 0; + m_gTec->m_oBuffer.validPoints = 0; +#if defined(TARGET_OS_Windows) + m_portName = "//./COM1"; +#else + m_portName="/dev/rfcomm0"; +#endif + + //initialisation of the analog channels of the gTec module : by default no analog exchange are allowed + m_gTec->m_analogIn.ain1 = false; + m_gTec->m_analogIn.ain2 = false; + m_gTec->m_analogIn.ain3 = false; + m_gTec->m_analogIn.ain4 = false; + m_gTec->m_analogIn.ain5 = false; + m_gTec->m_analogIn.ain6 = false; + m_gTec->m_analogIn.ain7 = false; + m_gTec->m_analogIn.ain8 = false; + + m_settings.add("Header", m_header); + m_settings.add("PortName", &m_portName); + m_settings.add("TestMode", &m_testMode); + m_settings.load(); +} + +CDriverGTecGMobiLabPlus::~CDriverGTecGMobiLabPlus() +{ + delete m_header; + delete m_gTec; +} + +void CDriverGTecGMobiLabPlus::release() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGTecGMobiLabPlus::release\n"; + delete this; +} + +const char* CDriverGTecGMobiLabPlus::getName() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGTecGMobiLabPlus::getName\n"; + return "g.tec gMOBIlab+"; +} + +//___________________________________________________________________// +// // + +/* + * configuration + */ + +bool CDriverGTecGMobiLabPlus::isConfigurable() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGTecGMobiLabPlus::isConfigurable\n"; + return true; +} + +bool CDriverGTecGMobiLabPlus::configure() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGTecGMobiLabPlus::configure\n"; + + // We use CConfigurationGTecMobilabPlus configuration which is a class that inheritate from the CConfigurationBuilder class + // The difference between these two classes is the addition of a member of class. This member allows to change the port where is connected the device. + CConfigurationGTecGMobiLabPlus config(Directories::getDataDir() + "/applications/acquisition-server/interface-GTec-GMobiLabPlus.ui", m_portName, + m_testMode); + + // We configure the Header with it... + if (!config.configure(*m_header)) { return false; } + + if (m_header->getChannelCount() > N_ACQUIRED_CHANNEL) { m_header->setChannelCount(N_ACQUIRED_CHANNEL); } + + m_settings.save(); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Port name after configuration " << m_portName << " \n"; + return true; +} + +//___________________________________________________________________// +// // + +#if defined(TARGET_OS_Linux) +#define GetProcAddress dlsym +#define FreeLibrary dlclose +#endif + +bool CDriverGTecGMobiLabPlus::registerLibraryFunctions() +{ + // Lets open the DLL +#if defined(TARGET_OS_Windows) + m_library = LoadLibrary("gMOBIlabplus.dll"); +#else + m_library = dlopen("libgmobilabplusapi.so", RTLD_LAZY); +#endif + if (!m_library) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "CDriverGTecGMobiLabPlus:: Unable to open gMOBIlabplus.dll\n"; + return false; + } + + m_gTec->m_fOpenDevice = CDriverGTecGMobiLabPlusPrivate::OV_GT_OpenDevice(GetProcAddress(m_library, "GT_OpenDevice")); + m_gTec->m_fCloseDevice = CDriverGTecGMobiLabPlusPrivate::OV_GT_CloseDevice(GetProcAddress(m_library, "GT_CloseDevice")); + m_gTec->m_fSetTestmode = CDriverGTecGMobiLabPlusPrivate::OV_GT_SetTestmode(GetProcAddress(m_library, "GT_SetTestmode")); + m_gTec->m_fStartAcquisition = CDriverGTecGMobiLabPlusPrivate::OV_GT_StartAcquisition(GetProcAddress(m_library, "GT_StartAcquisition")); + m_gTec->m_fGetData = CDriverGTecGMobiLabPlusPrivate::OV_GT_GetData(GetProcAddress(m_library, "GT_GetData")); + m_gTec->m_fInitChannels = CDriverGTecGMobiLabPlusPrivate::OV_GT_InitChannels(GetProcAddress(m_library, "GT_InitChannels")); + m_gTec->m_fStopAcquisition = CDriverGTecGMobiLabPlusPrivate::OV_GT_StopAcquisition(GetProcAddress(m_library, "GT_StopAcquisition")); + m_gTec->m_fGetLastError = CDriverGTecGMobiLabPlusPrivate::OV_GT_GetLastError(GetProcAddress(m_library, "GT_GetLastError")); + m_gTec->m_fTranslateErrorCode = CDriverGTecGMobiLabPlusPrivate::OV_GT_TranslateErrorCode(GetProcAddress(m_library, "GT_TranslateErrorCode")); + + if (!m_gTec->m_fOpenDevice || !m_gTec->m_fCloseDevice || !m_gTec->m_fSetTestmode + || !m_gTec->m_fStartAcquisition || !m_gTec->m_fGetData || !m_gTec->m_fInitChannels + || !m_gTec->m_fStopAcquisition || !m_gTec->m_fGetLastError || !m_gTec->m_fTranslateErrorCode) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "CDriverGTecGMobiLabPlus:: Unable to find all the required functions from the gMOBIlabplus.dll\n"; + return false; + } + + return true; +} + + +/* + * initialisation + */ +bool CDriverGTecGMobiLabPlus::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGTecGMobiLabPlus::initialize\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Port name after initialisation " << m_portName << "\n"; + + if (m_driverCtx.isConnected()) { return false; } + + if (!m_header->isChannelCountSet() || !m_header->isSamplingFrequencySet()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Either channel count or sampling frequency is not set\n"; + return false; + } + + if (!registerLibraryFunctions()) { return false; } + + const size_t nChannel = m_header->getChannelCount(); + + // analog exchanges allowed on the first "nChannel" channels: + for (uint32_t i = 1; i <= nChannel; ++i) { allowAnalogInputs(i); } + + // then buffer of type _BUFFER_ST built to store acquired samples. + m_gTec->m_oBuffer.pBuffer = new short int[nChannel + ];//allocate enough space for the buffer m_oBuffer.pBuffer ; only one set of mesures is acquired (channel 1 to 8) in a row + m_gTec->m_oBuffer.size = nChannel * sizeof(short int); + m_gTec->m_oBuffer.validPoints = 0; + +#if defined(TARGET_OS_Windows) + m_gTec->m_oOverlap.hEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); + m_gTec->m_oOverlap.Offset = 0; + m_gTec->m_oOverlap.OffsetHigh = 0; +#endif + + // allocates enough space for m_sample + m_sample = new float[nSamplePerSentBlock * nChannel]; + + // if there is a problem while creating the two arrays + if (!m_gTec->m_oBuffer.pBuffer || !m_sample) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Memory allocation problem\n"; + delete [] m_gTec->m_oBuffer.pBuffer; + delete [] m_sample; + m_sample = nullptr; + m_gTec->m_oBuffer.pBuffer = nullptr; + return false; + } + + // initializes hardware and get + // available header information + // from it +#if defined(TARGET_OS_Windows) + m_gTec->m_device = m_gTec->m_fOpenDevice(LPSTR(m_portName.c_str())); +#else + m_gTec->m_device = m_gTec->m_fOpenDevice(m_portName.c_str()); +#endif + if (m_gTec->m_device == nullptr) + { +#if defined(TARGET_OS_Windows) + UINT errorCode = 0; +#else + uint32_t errorCode = 0; +#endif + _ERRSTR error; + m_gTec->m_fGetLastError(&errorCode); + m_gTec->m_fTranslateErrorCode(&error, errorCode); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unable to connect to [" << m_portName << "], error code " << errorCode << ": '" << error.Error + << "'\n"; + delete [] m_gTec->m_oBuffer.pBuffer; + delete [] m_sample; + return false; + } + + // saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + return true; +} + +bool CDriverGTecGMobiLabPlus::uninitialize() +{ + bool ok = true; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGTecGMobiLabPlus::uninitialize\n"; + + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // uninitializes hardware here + if (!m_gTec->m_fCloseDevice(m_gTec->m_device)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "GT_CloseDevice() failed\n"; + ok = false; + } + + // frees memory + delete [] m_sample; + delete [] m_gTec->m_oBuffer.pBuffer; + + m_sample = nullptr; + m_gTec->m_oBuffer.pBuffer = nullptr; + m_callback = nullptr; + + // uninitialisation of the analog channels : set valus to default ones + m_gTec->m_analogIn.ain1 = false; + m_gTec->m_analogIn.ain2 = false; + m_gTec->m_analogIn.ain3 = false; + m_gTec->m_analogIn.ain4 = false; + m_gTec->m_analogIn.ain5 = false; + m_gTec->m_analogIn.ain6 = false; + m_gTec->m_analogIn.ain7 = false; + m_gTec->m_analogIn.ain8 = false; + + if (m_library) + { + FreeLibrary(m_library); + m_library = nullptr; + } + + return ok; +} + +const IHeader* CDriverGTecGMobiLabPlus::getHeader() { return m_header; } + +//___________________________________________________________________// +// // + +/* + * acquisition + */ + +bool CDriverGTecGMobiLabPlus::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGTecGMobiLabPlus::start\n"; + + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // we use none of the digital inputs/outputs + _DIO digitalInOut; + digitalInOut.dio1_enable = false; + digitalInOut.dio2_enable = false; + digitalInOut.dio3_enable = false; + digitalInOut.dio4_enable = false; + digitalInOut.dio5_enable = false; + digitalInOut.dio6_enable = false; + digitalInOut.dio7_enable = false; + digitalInOut.dio8_enable = false; + + // channel initialisation + if (!m_gTec->m_fInitChannels(m_gTec->m_device, m_gTec->m_analogIn, digitalInOut)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "GT_InitChannels failed\n"; + return false; + } + + // are we interested in test signal? + m_gTec->m_fSetTestmode(m_gTec->m_device, m_testMode); + + // requests hardware to start sending data + if (!m_gTec->m_fStartAcquisition(m_gTec->m_device)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "GT_StartAcquisition failed\n"; + return false; + } + return true; +} + +bool CDriverGTecGMobiLabPlus::loop() +{ + // m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGTecGMobiLabPlus::loop\n"; + + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return true; } + + const size_t nChannel = m_header->getChannelCount(); + + // only "l-nChannel" measures corresponding to one measure per channel are acquired in a row with the function GT_GetData() + // these measures are stored in m_oBuffer.pBuffer[] + // the acquisition is reapeted m_sampleCountPerSendBlock times to fill in the array "m_sample" + for (uint32_t i = 0; i < m_nSamplePerSentBlock; ++i) + { +#if defined(TARGET_OS_Windows) + if (!m_gTec->m_fGetData(m_gTec->m_device, &m_gTec->m_oBuffer, &m_gTec->m_oOverlap))// receive samples from hardware (one per channel) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "GT_GetData failed\n"; + return false; + } + if (WaitForSingleObject(m_gTec->m_oOverlap.hEvent, 1000) == WAIT_TIMEOUT) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Timeout in reading from the device\n"; + return false; + } +#else + if (!m_gTec->m_fGetData(m_gTec->m_device, &m_gTec->m_oBuffer))// receive samples from hardware (one per channel) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "GT_GetData failed\n"; + return false; + } +#endif + + // here the "nChannel" measures just acquired are stored in m_sample not to be deleted by the next acquisition + // m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Here are the " << nChannel << " measures of the " << i << " th sample\n" << Kernel::LogLevel_Debug; + for (uint32_t j = 0; j < nChannel; ++j) + { + // m_driverCtx.getLogManager() << (m_oBuffer.pBuffer[j]*0.5)/32768. << " "; + //operation made to modify the short int in a number between 0 and 500mV (in Volt) + m_sample[m_nSamplePerSentBlock * j + i] = float((m_gTec->m_oBuffer.pBuffer[j] * 0.5) / 32768.); + } + // m_driverCtx.getLogManager() << "\n"; + } + + // the buffer is full : it is send to the acquisition server + m_callback->setSamples(m_sample, m_nSamplePerSentBlock); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + + return true; +} + +bool CDriverGTecGMobiLabPlus::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGTecGMobiLabPlus::stop\n"; + + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + // requests the hardware to stop sending data + if (!m_gTec->m_fStopAcquisition(m_gTec->m_device)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "GT_StopAcquisition failed\n"; + return false; + } + + return true; +} + +// this function allows exchanges of data on the "index" channel +// function used to initialize the analog inputs according to the number "nChannel" +void CDriverGTecGMobiLabPlus::allowAnalogInputs(uint32_t index) +{ + switch (index) + { + case 8: m_gTec->m_analogIn.ain8 = true; + break; + case 7: m_gTec->m_analogIn.ain7 = true; + break; + case 6: m_gTec->m_analogIn.ain6 = true; + break; + case 5: m_gTec->m_analogIn.ain5 = true; + break; + case 4: m_gTec->m_analogIn.ain4 = true; + break; + case 3: m_gTec->m_analogIn.ain3 = true; + break; + case 2: m_gTec->m_analogIn.ain2 = true; + break; + case 1: m_gTec->m_analogIn.ain1 = true; + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Unexpected value " << index << " in CDriverGTecGMobiLabPlus::allowAnalogInputs\n"; + break; + } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyGMobiLabPlusAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/ovasCDriverGTecGMobiLabPlus.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/ovasCDriverGTecGMobiLabPlus.h new file mode 100755 index 0000000..403fc1b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/ovasCDriverGTecGMobiLabPlus.h @@ -0,0 +1,86 @@ +/** + * The gMobilab driver was contributed + * by Lucie Daubigney from Supelec Metz + */ + +#pragma once + +#if defined TARGET_HAS_ThirdPartyGMobiLabPlusAPI + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include +#ifdef TARGET_OS_Windows +#include +#endif + +namespace OpenViBE { +namespace AcquisitionServer { +class CDriverGTecGMobiLabPlusPrivate; // fwd declare + +/** + * \class CDriverGTecGMobiLabPlus + * \author Lucie Daubigney (Supelec Metz) + */ +class CDriverGTecGMobiLabPlus final : public IDriver +{ +public: + + explicit CDriverGTecGMobiLabPlus(IDriverContext& ctx); + ~CDriverGTecGMobiLabPlus() override; + void release(); + const char* getName() override; + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + + //configuration + bool isConfigurable() override; + bool configure() override; + //initialisation + bool initialize(const uint32_t sampleCountPerChannel, IDriverCallback& callback) override; + bool uninitialize() override; + const IHeader* getHeader() override; + + //acquisition + bool start() override; + bool stop() override; + bool loop() override; + +protected: + + SettingsHelper m_settings; + + //usefull data to communicate with OpenViBE + IHeader* m_header = nullptr; + IDriverCallback* m_callback = nullptr; + uint32_t m_nSamplePerSentBlock = 0;//number of sample you want to send in a row + float* m_sample = nullptr;//array containing the data to sent to OpenViBE once they had been recovered from the gTec module + + //params + std::string m_portName; + bool m_testMode = false; + + // Pointers do gtec-specific data and function pointers + CDriverGTecGMobiLabPlusPrivate* m_gTec = nullptr; + + // Register the function pointers from the dll. (The dll approach + // is used with gMobilab to avoid conflicts with the gUSBAmp lib) + bool registerLibraryFunctions(); + +#if defined(TARGET_OS_Windows) + HINSTANCE m_library; +#elif defined(TARGET_OS_Linux) + void* m_library = nullptr; +#endif +private: + + void allowAnalogInputs(uint32_t index); +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGMobiLabPlusAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/ovasCDriverGTecGMobiLabPlusPrivate.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/ovasCDriverGTecGMobiLabPlusPrivate.h new file mode 100755 index 0000000..cb02970 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gmobilabplus/src/ovasCDriverGTecGMobiLabPlusPrivate.h @@ -0,0 +1,85 @@ +/* + * The only purpose of this class is to hide the gtec API + * data types from the ov driver header. An approach resembling + * this is sometimes called a 'd-pointer'. + * + * Previous situation: + * + * gUsbamp ov driver header depends on gtec gUSBAmp API types + * gMobilab ov driver header depends on gtec gMobilab API types + * Acquisition Server includes both these driver headers + * + * But the gtec types are declared differently in the two gtec APIs. + * Hence we get a conflict if both headers are included by the + * same compilation unit. + * + * With this class, the gmobilab API is not exposed just by + * including ovasCDriverGtecMobiLabPlus.h to the Acquisition Server. + * + */ +#pragma once + +#if defined TARGET_HAS_ThirdPartyGMobiLabPlusAPI + +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \author Jussi T. Lindgren (Inria) + * + * The class collects all members that used to be in + * CDriverGtecMobiLabPlus header that depend on the gmobilab API. + * + */ +class CDriverGTecGMobiLabPlusPrivate +{ +public: + + //useful data to communicate with the gTec module + _BUFFER_ST m_oBuffer; + HANDLE m_device; + _AIN m_analogIn; + +#if defined(TARGET_OS_Windows) + OVERLAPPED m_oOverlap; +#endif + + // These functions are defined in the gmobilab library +#if defined(TARGET_OS_Windows) + typedef HANDLE (__stdcall *OV_GT_OpenDevice)(LPSTR lpPort); + typedef BOOL (__stdcall *OV_GT_CloseDevice)(HANDLE hDevice); + typedef BOOL (__stdcall *OV_GT_SetTestmode)(HANDLE hDevice, BOOL Testmode); + typedef BOOL (__stdcall *OV_GT_StartAcquisition)(HANDLE hDevice); + typedef BOOL (__stdcall *OV_GT_GetData)(HANDLE hDevice, _BUFFER_ST* buffer, LPOVERLAPPED lpOvl); + typedef BOOL (__stdcall *OV_GT_InitChannels)(HANDLE hDevice, _AIN analogCh, _DIO digitalCh); + typedef bool (__stdcall *OV_GT_StopAcquisition)(HANDLE hDevice); + typedef bool (__stdcall *OV_GT_GetLastError)(UINT* LastError); + typedef bool (__stdcall *OV_GT_TranslateErrorCode)(_ERRSTR* ErrorString, UINT ErrorCode); +#else + typedef HANDLE(*OV_GT_OpenDevice)(const char* lpPort); + typedef bool(*OV_GT_CloseDevice)(HANDLE hDevice); + typedef bool(*OV_GT_SetTestmode)(HANDLE hDevice, bool Testmode); + typedef bool(*OV_GT_StartAcquisition)(HANDLE hDevice); + typedef bool(*OV_GT_GetData)(HANDLE hDevice, _BUFFER_ST *buffer); + typedef bool(*OV_GT_InitChannels)(HANDLE hDevice, _AIN analogCh, _DIO digitalCh); + typedef bool(*OV_GT_StopAcquisition)(HANDLE hDevice); + typedef bool(*OV_GT_GetLastError)(uint32_t* LastError); + typedef bool(*OV_GT_TranslateErrorCode)(_ERRSTR *ErrorString, uint32_t ErrorCode); +#endif + + // Function pointers to the dll + OV_GT_OpenDevice m_fOpenDevice; + OV_GT_CloseDevice m_fCloseDevice; + OV_GT_SetTestmode m_fSetTestmode; + OV_GT_StartAcquisition m_fStartAcquisition; + OV_GT_GetData m_fGetData; + OV_GT_InitChannels m_fInitChannels; + OV_GT_StopAcquisition m_fStopAcquisition; + OV_GT_GetLastError m_fGetLastError; + OV_GT_TranslateErrorCode m_fTranslateErrorCode; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGMobiLabPlusAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gnautilus/share/interface-gNautilusInterface.ui b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gnautilus/share/interface-gNautilusInterface.ui new file mode 100644 index 0000000..3d2b3b6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gnautilus/share/interface-gNautilusInterface.ui @@ -0,0 +1,3669 @@ + + + + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 64 + 1 + 10 + + + + + + + + + + + + + + + + + + + + + False + 5 + False + True + dialog + + + True + False + 2 + + + True + False + end + + + gtk-apply + True + True + True + True + + + False + False + 0 + + + + + gtk-cancel + True + True + True + True + + + False + False + 1 + + + + + True + True + 0 + + + + + True + False + Select sensitivity and filter settings for all EEG channels + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + + + True + False + Sensitivity [mV] : + + + True + True + 0 + + + + + True + False + liststore1 + + + + 0 + + + + + True + True + 1 + + + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + True + False + + + True + False + Bandpass filter : + + + True + True + 0 + + + + + True + False + liststore2 + + + + 0 + + + + + True + True + 1 + + + + + True + True + 5 + + + + + True + False + + + False + True + 6 + + + + + True + False + + + True + False + Notch filter : + + + True + True + 0 + + + + + True + False + liststore3 + + + + 0 + + + + + True + True + 1 + + + + + True + True + 7 + + + + + True + False + + + False + True + 8 + + + + + + button_select_sensitivity_filters_apply + button_select_sensitivity_filters_cancel + + + + + + + + + + False + 5 + False + True + dialog + + + True + False + 2 + + + True + False + end + + + gtk-apply + True + True + True + True + + + False + False + 0 + + + + + gtk-cancel + True + True + True + True + + + False + False + 1 + + + + + True + True + 0 + + + + + True + False + Select acquired channels and channels for bipolar, CAR and noise reduction + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + 3 + 7 + + + True + False + Channel + + + + + True + False + Bipolar channel + + + 2 + 3 + + + + + True + False + CAR + + + 4 + 5 + + + + + True + False + Noise reduction + + + 6 + 7 + + + + + True + False + + + 1 + 2 + + + + + True + False + + + 3 + 4 + + + + + True + False + + + 5 + 6 + + + + + True + False + + + 1 + 2 + 2 + 3 + + + + + True + False + + + 3 + 4 + 2 + 3 + + + + + True + False + + + 5 + 6 + 2 + 3 + + + + + True + False + + + True + False + + + FP1 + True + True + False + True + + + True + True + 0 + + + + + FP2 + True + True + False + True + + + True + True + 1 + + + + + AF3 + True + True + False + True + + + True + True + 2 + + + + + AF4 + True + True + False + True + + + True + True + 3 + + + + + F7 + True + True + False + True + + + True + True + 4 + + + + + F3 + True + True + False + True + + + True + True + 5 + + + + + FZ + True + True + False + True + + + True + True + 6 + + + + + F4 + True + True + False + True + + + True + True + 7 + + + + + F8 + True + True + False + True + + + True + True + 8 + + + + + FC5 + True + True + False + True + + + True + True + 9 + + + + + FC1 + True + True + False + True + + + True + True + 10 + + + + + FC2 + True + True + False + True + + + True + True + 11 + + + + + FC6 + True + True + False + True + + + True + True + 12 + + + + + T7 + True + True + False + True + + + True + True + 13 + + + + + C3 + True + True + False + True + + + True + True + 14 + + + + + CZ + True + True + False + True + + + True + True + 15 + + + + + C4 + True + True + False + True + + + True + True + 16 + + + + + T8 + True + True + False + True + + + True + True + 17 + + + + + CP5 + True + True + False + True + + + True + True + 18 + + + + + CP1 + True + True + False + True + + + True + True + 19 + + + + + CP2 + True + True + False + True + + + True + True + 20 + + + + + CP6 + True + True + False + True + + + True + True + 21 + + + + + P7 + True + True + False + True + + + True + True + 22 + + + + + P3 + True + True + False + True + + + True + True + 23 + + + + + PZ + True + True + False + True + + + True + True + 24 + + + + + P4 + True + True + False + True + + + True + True + 25 + + + + + P8 + True + True + False + True + + + True + True + 26 + + + + + PO7 + True + True + False + True + + + True + True + 27 + + + + + PO3 + True + True + False + True + + + True + True + 28 + + + + + PO4 + True + True + False + True + + + True + True + 29 + + + + + PO8 + True + True + False + True + + + True + True + 30 + + + + + OZ + True + True + False + True + + + True + True + 31 + + + + + True + True + 0 + + + + + True + False + + + True + False + (Channel 1) + + + True + True + 0 + + + + + True + False + (Channel 2) + + + True + True + 1 + + + + + True + False + (Channel 3) + + + True + True + 2 + + + + + True + False + (Channel 4) + + + True + True + 3 + + + + + True + False + (Channel 5) + + + True + True + 4 + + + + + True + False + (Channel 6) + + + True + True + 5 + + + + + True + False + (Channel 7) + + + True + True + 6 + + + + + True + False + (Channel 8) + + + True + True + 7 + + + + + True + False + (Channel 9) + + + True + True + 8 + + + + + True + False + (Channel 10) + + + True + True + 9 + + + + + True + False + (Channel 11) + + + True + True + 10 + + + + + True + False + (Channel 12) + + + True + True + 11 + + + + + True + False + (Channel 13) + + + True + True + 12 + + + + + True + False + (Channel 14) + + + True + True + 13 + + + + + True + False + (Channel 15) + + + True + True + 14 + + + + + True + False + (Channel 16) + + + True + True + 15 + + + + + True + False + (Channel 17) + + + True + True + 16 + + + + + True + False + (Channel 18) + + + True + True + 17 + + + + + True + False + (Channel 19) + + + True + True + 18 + + + + + True + False + (Channel 20) + + + True + True + 19 + + + + + True + False + (Channel 21) + + + True + True + 20 + + + + + True + False + (Channel 22) + + + True + True + 21 + + + + + True + False + (Channel 23) + + + True + True + 22 + + + + + True + False + (Channel 24) + + + True + True + 23 + + + + + True + False + (Channel 25) + + + True + True + 24 + + + + + True + False + (Channel 26) + + + True + True + 25 + + + + + True + False + (Channel 27) + + + True + True + 26 + + + + + True + False + (Channel 28) + + + True + True + 27 + + + + + True + False + (Channel 29) + + + True + True + 28 + + + + + True + False + (Channel 30) + + + True + True + 29 + + + + + True + False + (Channel 31) + + + True + True + 30 + + + + + True + False + (Channel 32) + + + True + True + 31 + + + + + True + True + 1 + + + + + 2 + 3 + + + + + True + False + + + True + False + liststore4 + + + + 0 + + + + + True + True + 0 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 1 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 2 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 3 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 4 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 5 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 6 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 7 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 8 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 9 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 10 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 11 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 12 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 13 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 14 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 15 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 16 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 17 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 18 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 19 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 20 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 21 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 22 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 23 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 24 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 25 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 26 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 27 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 28 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 29 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 30 + + + + + True + False + liststore4 + + + + 0 + + + + + True + True + 31 + + + + + 2 + 3 + 2 + 3 + + + + + True + False + + + True + True + False + True + + + True + True + 0 + + + + + True + True + False + True + + + True + True + 1 + + + + + True + True + False + True + + + True + True + 2 + + + + + True + True + False + True + + + True + True + 3 + + + + + True + True + False + True + + + True + True + 4 + + + + + True + True + False + True + + + True + True + 5 + + + + + True + True + False + True + + + True + True + 6 + + + + + True + True + False + True + + + True + True + 7 + + + + + True + True + False + True + + + True + True + 8 + + + + + True + True + False + True + + + True + True + 9 + + + + + True + True + False + True + + + True + True + 10 + + + + + True + True + False + True + + + True + True + 11 + + + + + True + True + False + True + + + True + True + 12 + + + + + True + True + False + True + + + True + True + 13 + + + + + True + True + False + True + + + True + True + 14 + + + + + True + True + False + True + + + True + True + 15 + + + + + True + True + False + True + + + True + True + 16 + + + + + True + True + False + True + + + True + True + 17 + + + + + True + True + False + True + + + True + True + 18 + + + + + True + True + False + True + + + True + True + 19 + + + + + True + True + False + True + + + True + True + 20 + + + + + True + True + False + True + + + True + True + 21 + + + + + True + True + False + True + + + True + True + 22 + + + + + True + True + False + True + + + True + True + 23 + + + + + True + True + False + True + + + True + True + 24 + + + + + True + True + False + True + + + True + True + 25 + + + + + True + True + False + True + + + True + True + 26 + + + + + True + True + False + True + + + True + True + 27 + + + + + True + True + False + True + + + True + True + 28 + + + + + True + True + False + True + + + True + True + 29 + + + + + True + True + False + True + + + True + True + 30 + + + + + True + True + False + True + + + True + True + 31 + + + + + 4 + 5 + 2 + 3 + + + + + True + False + + + True + True + False + True + + + True + True + 0 + + + + + True + True + False + True + + + True + True + 1 + + + + + True + True + False + True + + + True + True + 2 + + + + + True + True + False + True + + + True + True + 3 + + + + + True + True + False + True + + + True + True + 4 + + + + + True + True + False + True + + + True + True + 5 + + + + + True + True + False + True + + + True + True + 6 + + + + + True + True + False + True + + + True + True + 7 + + + + + True + True + False + True + + + True + True + 8 + + + + + True + True + False + True + + + True + True + 9 + + + + + True + True + False + True + + + True + True + 10 + + + + + True + True + False + True + + + True + True + 11 + + + + + True + True + False + True + + + True + True + 12 + + + + + True + True + False + True + + + True + True + 13 + + + + + True + True + False + True + + + True + True + 14 + + + + + True + True + False + True + + + True + True + 15 + + + + + True + True + False + True + + + True + True + 16 + + + + + True + True + False + True + + + True + True + 17 + + + + + True + True + False + True + + + True + True + 18 + + + + + True + True + False + True + + + True + True + 19 + + + + + True + True + False + True + + + True + True + 20 + + + + + True + True + False + True + + + True + True + 21 + + + + + True + True + False + True + + + True + True + 22 + + + + + True + True + False + True + + + True + True + 23 + + + + + True + True + False + True + + + True + True + 24 + + + + + True + True + False + True + + + True + True + 25 + + + + + True + True + False + True + + + True + True + 26 + + + + + True + True + False + True + + + True + True + 27 + + + + + True + True + False + True + + + True + True + 28 + + + + + True + True + False + True + + + True + True + 29 + + + + + True + True + False + True + + + True + True + 30 + + + + + True + True + False + True + + + True + True + 31 + + + + + 6 + 7 + 2 + 3 + + + + + True + False + + + 1 + 2 + 1 + 2 + + + + + True + False + + + 3 + 4 + 1 + 2 + + + + + True + False + + + 5 + 6 + 1 + 2 + + + + + True + False + + + 1 + 2 + + + + + True + False + + + 2 + 3 + 1 + 2 + + + + + True + False + + + 4 + 5 + 1 + 2 + + + + + True + False + + + 6 + 7 + 1 + 2 + + + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + + button_channel_apply + button_channel_cancel + + + + + + + + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + + + + + + + False + 5 + False + center + dialog + + + True + False + 2 + + + True + False + g.Nautilus Configuration + + + True + True + 0 + + + + + True + False + end + + + gtk-apply + True + True + True + True + + + False + False + 0 + + + + + gtk-cancel + True + True + True + True + + + False + False + 1 + + + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + General Settings + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + True + False + 8 + 5 + + + True + False + Age : + + + 1 + 2 + + + + + True + False + Identifier : + + + + + True + False + Gender : + + + 2 + 3 + + + + + True + False + Device serial : + + + 3 + 4 + + + + + True + False + Sample rate [Hz] : + + + 4 + 5 + + + + + True + False + Input source : + + + 5 + 6 + + + + + True + False + Network channel : + + + 6 + 7 + + + + + True + False + Event channel + + + 3 + 4 + + + + + True + False + Noise reduction + + + 3 + 4 + 1 + 2 + + + + + True + False + CAR + + + 3 + 4 + 2 + 3 + + + + + True + False + Acceleration data + + + 3 + 4 + 3 + 4 + + + + + True + False + Counter + + + 3 + 4 + 4 + 5 + + + + + True + False + Link quality + + + 3 + 4 + 5 + 6 + + + + + True + False + Battery level + + + 3 + 4 + 6 + 7 + + + + + True + False + Validation indicator + + + 3 + 4 + 7 + 8 + + + + + True + True + False + True + + + 4 + 5 + + + + + True + True + False + True + + + 4 + 5 + 1 + 2 + + + + + True + True + False + True + + + 4 + 5 + 2 + 3 + + + + + True + True + False + True + + + 4 + 5 + 3 + 4 + + + + + True + True + False + True + + + 4 + 5 + 4 + 5 + + + + + True + True + False + True + + + 4 + 5 + 5 + 6 + + + + + True + True + False + True + + + 4 + 5 + 6 + 7 + + + + + True + True + False + True + + + 4 + 5 + 7 + 8 + + + + + True + True + + False + False + True + True + adjustment1 + + + 1 + 2 + + + + + True + True + + False + False + True + True + adjustment2 + + + 1 + 2 + 1 + 2 + + + + + True + False + model2 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + False + + False + False + True + True + + + 1 + 2 + 3 + 4 + + + + + True + False + model3 + + + + 0 + + + + + 1 + 2 + 5 + 6 + + + + + True + False + model4 + + + + 0 + + + + + 1 + 2 + 6 + 7 + + + + + True + False + + + 2 + 3 + + + + + True + False + + + 2 + 3 + 7 + 8 + + + + + True + False + + + 2 + 3 + 6 + 7 + + + + + True + False + + + 2 + 3 + 5 + 6 + + + + + True + False + + + 2 + 3 + 4 + 5 + + + + + True + False + + + 2 + 3 + 3 + 4 + + + + + True + False + + + 2 + 3 + 2 + 3 + + + + + True + False + + + 2 + 3 + 1 + 2 + + + + + True + False + model1 + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + False + Number of channels : + + + 7 + 8 + + + + + True + True + False + + False + False + True + True + adjustment3 + + + 1 + 2 + 7 + 8 + + + + + True + True + 5 + + + + + True + False + + + False + True + 6 + + + + + Change channel names... + False + True + True + + + True + True + 7 + + + + + True + False + Channel Settings + + + True + True + 8 + + + + + True + False + + + False + True + 9 + + + + + True + False + + + Select channels and settings for bipolar, CAR and noise reduction... + True + True + True + + + True + True + 0 + + + + + Select sensitivity and filters for EEG channels... + True + True + True + + + True + True + 1 + + + + + True + True + 10 + + + + + True + False + + + False + True + 11 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gnautilus/src/ovasCConfigurationgNautilusInterface.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gnautilus/src/ovasCConfigurationgNautilusInterface.cpp new file mode 100644 index 0000000..3bc7fdb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gnautilus/src/ovasCConfigurationgNautilusInterface.cpp @@ -0,0 +1,969 @@ +#if defined(TARGET_HAS_ThirdPartyGNEEDaccessAPI) + +#include "ovasCConfigurationgNautilusInterface.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +/*_________________________________________________ + +Insert callback to specific widget here +Example with a button that launch a calibration of the device: +*/ + +//Callback connected to a dedicated gtk button (button_select_channels_bipolar_car_noise): +static void ChannelSettingsCB(GtkButton* button, void* data) { static_cast(data)->buttonChannelSettingsPressedCB(); } + +//Callback connected to a dedicated gtk button (button_select_sensitivity_filters): +static void SensitivityFiltersCB(GtkButton* button, void* data) { static_cast(data)->buttonSensitivityFiltersPressedCB(); } + +//Callback connected to a dedicated gtk button (button_sensitivity_filters_apply): +static void SensitivityFiltersApplyCB(GtkButton* button, void* data) +{ + static_cast(data)->buttonSensitivityFiltersApplyPressedCB(); +} + +//Callback connected to a dedicated gtk button (button_channel_apply): +static void ChannelSettingsApplyCB(GtkButton* button, void* data) +{ + static_cast(data)->buttonChannelSettingsApplyPressedCB(); +} + +//Callback actually called: +void CConfigurationgNautilusInterface::buttonChannelSettingsPressedCB() +{ + // Connect to the hardware, ask for calibration, verify the return code, etc. + + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(m_builder,"dialog_select_channels_bipolar_car_noise")); + gint resp = gtk_dialog_run(GTK_DIALOG(dialog)); + + gtk_widget_hide(dialog); +} + +//Callback actually called: +void CConfigurationgNautilusInterface::buttonSensitivityFiltersPressedCB() +{ + // get bandpass and notch filters for currenty selected sampling rate and set to filter list in corresponding dialog + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(m_builder,"dialog_sensitivity_filters")); + gint resp = gtk_dialog_run(GTK_DIALOG(dialog)); + + gtk_widget_hide(dialog); +} + + +//Callback actually called: +void CConfigurationgNautilusInterface::buttonSensitivityFiltersApplyPressedCB() +{ + // get handle to sensitivity and filters dialog and close it + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(m_builder,"dialog_sensitivity_filters")); + gtk_widget_hide(dialog); +} + + +//Callback actually called: +void CConfigurationgNautilusInterface::buttonChannelSettingsApplyPressedCB() +{ + // get handle to channel settings dialog and close it + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(m_builder,"dialog_select_channels_bipolar_car_noise")); + gtk_widget_hide(dialog); + + // get number of channels selected and set range as number of channels starting at number of channels + uint16_t nChannels = 0; + char tmp[30]; + for (uint32_t i = 0; i < GDS_GNAUTILUS_CHANNELS_MAX; ++i) + { + // set electrode names as channel names in channel selection dialog + sprintf_s(&tmp[0], 30, "checkbutton_channel_%d", (i + 1)); + GtkButton* checkButton = GTK_BUTTON(gtk_builder_get_object(m_builder,tmp)); + if (checkButton) + { + if ((gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkButton))) && (gtk_widget_get_visible(GTK_WIDGET(checkButton)))) { nChannels += 1; } + } + } + + GtkSpinButton* button = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder,"spinbutton_number_of_channels")); + gtk_spin_button_set_range(button, nChannels, nChannels); + gtk_spin_button_set_value(button, nChannels); +} + +// catch combobox sampling rate changed signal and call function which handles event +static void sample_rate_changed_cb(GtkComboBox* comboBox, void* data) { static_cast(data)->comboboxSampleRateChangedCB(); } + +// Callback actually called +void CConfigurationgNautilusInterface::comboboxSampleRateChangedCB() +{ + // get hardware filters according to sampling frequency currently selected + const bool res = getFiltersForNewSamplingRate(); + if (!res) { } // error logged in getFiltersForNewSamplingRate +} + +// catch noise reduction checkbox toggled signal and call function which handles event +static void noise_reduction_changed_cb(GtkCheckButton* pCheckbutton, void* data) +{ + static_cast(data)->checkbuttonNoiseReductionChangedCB(); +} + +// Callback actually called +void CConfigurationgNautilusInterface::checkbuttonNoiseReductionChangedCB() +{ + // activate/deactivate noise reduction checkboxes in dialog_select_channels_bipolar_car_noise + GtkCheckButton* buttonNoise = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,"checkbutton_noise_reduction")); + const gboolean buttonValue = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(buttonNoise)); + char tmp[45]; + for (uint16_t i = 0; i < GDS_GNAUTILUS_CHANNELS_MAX; ++i) + { + sprintf_s(&tmp[0], 45, "checkbutton_noise_channel_%d", (i + 1)); + GtkCheckButton* buttonNoiseChannel = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,tmp)); + + if (buttonNoiseChannel) + { + if (gtk_widget_get_visible(GTK_WIDGET(buttonNoiseChannel))) { gtk_widget_set_sensitive(GTK_WIDGET(buttonNoiseChannel), buttonValue); } + } + } +} + +// catch car checkbox toggled signal and call function which handles event +static void car_changed_cb(GtkCheckButton* /*button*/, void* data) { static_cast(data)->checkbuttonCARChangedCB(); } + +// Callback actually called +void CConfigurationgNautilusInterface::checkbuttonCARChangedCB() +{ + // activate/deactivate car checkboxes in dialog_select_channels_bipolar_car_noise + GtkCheckButton* buttonCAR = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,"checkbutton_car")); + const gboolean buttonValue = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(buttonCAR)); + char tmp[45]; + for (uint16_t i = 0; i < GDS_GNAUTILUS_CHANNELS_MAX; ++i) + { + sprintf_s(&tmp[0], 45, "checkbutton_car_channel_%d", (i + 1)); + GtkCheckButton* buttonCarChannel = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,tmp)); + if (buttonCarChannel) + { + if (gtk_widget_get_visible(GTK_WIDGET(buttonCarChannel))) { gtk_widget_set_sensitive(GTK_WIDGET(buttonCarChannel), buttonValue); } + } + } +} + +// get hardware related settings from GDS +bool CConfigurationgNautilusInterface::getHardwareSettings() +{ + GtkTreeIter iter; + uint32_t i; + + // get network channel and set in dialog and set one as active in dialog + size_t supportedNwChannelsCount; + // get number of supported network channels to allocate memory to hold supported network channels + m_gdsResult = GDS_GNAUTILUS_GetSupportedNetworkChannels(m_deviceHandle, m_deviceNames, nullptr, &supportedNwChannelsCount); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + uint32_t* supportedNwChannels = new uint32_t[supportedNwChannelsCount]; + m_gdsResult = GDS_GNAUTILUS_GetSupportedNetworkChannels(m_deviceHandle, m_deviceNames, supportedNwChannels, &supportedNwChannelsCount); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + // get network channel currently used between base station and headstage + uint32_t val; + m_gdsResult = GDS_GNAUTILUS_GetNetworkChannel(m_deviceHandle, m_deviceNames, &val); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + // put network channels to combobox + GtkComboBox* comboBoxNetworkChannel = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_network_channel")); + GtkTreeModel* listStoreNetworkChannel = gtk_combo_box_get_model(comboBoxNetworkChannel); + gtk_list_store_clear(GTK_LIST_STORE(listStoreNetworkChannel)); + std::stringstream networkChannel; + if (m_comboBoxNetworkChannels.size() > 0) m_comboBoxNetworkChannels.clear(); + + // fill network channel combobox with available network channels + for (i = 0; i < supportedNwChannelsCount; ++i) + { + networkChannel << supportedNwChannels[i]; + gtk_list_store_append(GTK_LIST_STORE(listStoreNetworkChannel), &iter); + gtk_list_store_set(GTK_LIST_STORE(listStoreNetworkChannel), &iter, 0, networkChannel.str().c_str(), -1); + networkChannel.clear(); + networkChannel.str(""); + + m_comboBoxNetworkChannels.push_back(supportedNwChannels[i]); + } + + const auto it = find(m_comboBoxNetworkChannels.begin(), m_comboBoxNetworkChannels.end(), val); + const size_t nwChIndex = distance(m_comboBoxNetworkChannels.begin(), it); + gtk_combo_box_set_active(comboBoxNetworkChannel, nwChIndex); + + delete [] supportedNwChannels; + + // get supported sample rates + size_t nSampling; + + // get number of supported sample rates + m_gdsResult = GDS_GNAUTILUS_GetSupportedSamplingRates(m_deviceHandle, m_deviceNames, nullptr, &nSampling); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + uint32_t* sampling = new uint32_t[nSampling]; + // get supported sample rates + m_gdsResult = GDS_GNAUTILUS_GetSupportedSamplingRates(m_deviceHandle, m_deviceNames, sampling, &nSampling); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + // set sample rates as content of combo box in corresponding dialog + GtkComboBox* comboBoxSamplings = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")); + GtkTreeModel* listStoreSamplings = gtk_combo_box_get_model(comboBoxSamplings); + gtk_list_store_clear(GTK_LIST_STORE(listStoreSamplings)); + for (i = 0; i < nSampling; ++i) + { + std::string str = std::to_string(sampling[i]); + gtk_list_store_append(GTK_LIST_STORE(listStoreSamplings), &iter); + gtk_list_store_set(GTK_LIST_STORE(listStoreSamplings), &iter, 0, str.c_str(), -1); + } + gtk_combo_box_set_active(comboBoxSamplings, 0); + + const bool functionReturn = getFiltersForNewSamplingRate(); + if (!functionReturn) { return false; } + + size_t nSensitivities; + // get number of sensitivities + m_gdsResult = GDS_GNAUTILUS_GetSupportedSensitivities(m_deviceHandle, m_deviceNames, nullptr, &nSensitivities); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + // get sensitivities + double* sensitivities = new double[nSensitivities]; + m_gdsResult = GDS_GNAUTILUS_GetSupportedSensitivities(m_deviceHandle, m_deviceNames, sensitivities, &nSensitivities); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + // set items in dialog item combobox_select_sensitivity + GtkComboBox* comboBoxSensitivities = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_select_sensitivity")); + GtkTreeModel* listStoreSensitivities = gtk_combo_box_get_model(comboBoxSensitivities); + gtk_list_store_clear(GTK_LIST_STORE(listStoreSensitivities)); + for (i = 0; i < nSensitivities; ++i) + { + std::string str = std::to_string(sensitivities[i] / 1000); + gtk_list_store_append(GTK_LIST_STORE(listStoreSensitivities), &iter); + gtk_list_store_set(GTK_LIST_STORE(listStoreSensitivities), &iter, 0, str.c_str(), -1); + m_comboBoxSensitivityValues.push_back(sensitivities[i]); + } + gtk_combo_box_set_active(comboBoxSensitivities, 0); + + delete [] sensitivities; + + size_t nInputSources; + // first get number of supported input sources (call with third parameter set to NULL) + m_gdsResult = GDS_GNAUTILUS_GetSupportedInputSources(m_deviceHandle, m_deviceNames, nullptr, &nInputSources); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + // allocate memory to hold input sources + GDS_GNAUTILUS_INPUT_SIGNAL* inputSources = new GDS_GNAUTILUS_INPUT_SIGNAL[nInputSources]; + // now get input sources + m_gdsResult = GDS_GNAUTILUS_GetSupportedInputSources(m_deviceHandle, m_deviceNames, inputSources, &nInputSources); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + // set values to combobox_input_source (there are only three allowed at the moment, see code below) + GtkComboBox* comboBoxInputSources = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_input_source")); + GtkTreeModel* listStoreInputSources = gtk_combo_box_get_model(comboBoxInputSources); + gtk_list_store_clear(GTK_LIST_STORE(listStoreInputSources)); + for (i = 0; i < nInputSources; ++i) + { + if (inputSources[i] == 0) + { + // electrode input + m_comboBoxInputSources.push_back(inputSources[i]); + gtk_list_store_append(GTK_LIST_STORE(listStoreInputSources), &iter); + gtk_list_store_set(GTK_LIST_STORE(listStoreInputSources), &iter, 0, "Electrode", -1); + } + else if (inputSources[i] == 1) + { + // shortcut + m_comboBoxInputSources.push_back(inputSources[i]); + gtk_list_store_append(GTK_LIST_STORE(listStoreInputSources), &iter); + gtk_list_store_set(GTK_LIST_STORE(listStoreInputSources), &iter, 0, "Shortcut", -1); + } + else if (inputSources[i] == 5) + { + // test signal + m_comboBoxInputSources.push_back(inputSources[i]); + gtk_list_store_append(GTK_LIST_STORE(listStoreInputSources), &iter); + gtk_list_store_set(GTK_LIST_STORE(listStoreInputSources), &iter, 0, "Test Signal", -1); + } + } + gtk_combo_box_set_active(comboBoxInputSources, 0); + + return true; +} + +// get channel names for hardware currently connected (cannot be changed as electrode grid is fixed) +bool CConfigurationgNautilusInterface::getChannelNames() +{ + uint32_t nMountedModules; + size_t nElectrodeNames; + char tmp[30]; + std::stringstream bipolarEntry; + + // get number of mounted modules and electrode names currently available + nMountedModules = 0; + nElectrodeNames = 0; + m_gdsResult = GDS_GNAUTILUS_GetChannelNames(m_deviceHandle, m_deviceNames, &nMountedModules,NULL, &nElectrodeNames); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + // set array of electrode names according to names currently available + char (*electrodeNames)[GDS_GNAUTILUS_ELECTRODE_NAME_LENGTH_MAX] = new char[nElectrodeNames][GDS_GNAUTILUS_ELECTRODE_NAME_LENGTH_MAX]; + // get electrode names + m_gdsResult = GDS_GNAUTILUS_GetChannelNames(m_deviceHandle, m_deviceNames, &nMountedModules, electrodeNames, &nElectrodeNames); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + GtkComboBox* comboBoxBipolarChannels = GTK_COMBO_BOX(gtk_builder_get_object(m_builder,"combobox_channel_1")); + GtkTreeModel* listStoreBipolarChannels = gtk_combo_box_get_model(comboBoxBipolarChannels); + gtk_list_store_clear(GTK_LIST_STORE(listStoreBipolarChannels)); + + bipolarEntry << "none"; + GtkTreeIter it; + gtk_list_store_append(GTK_LIST_STORE(listStoreBipolarChannels), &it); + gtk_list_store_set(GTK_LIST_STORE(listStoreBipolarChannels), &it, 0, bipolarEntry.str().c_str(), -1); + for (uint16_t i = 0; i < GDS_GNAUTILUS_CHANNELS_MAX; ++i) + { + // set electrode names as channel names in channel selection dialog + sprintf_s(&tmp[0], 30, "checkbutton_channel_%d", (i + 1)); + GtkButton* buttonChannel = GTK_BUTTON(gtk_builder_get_object(m_builder,tmp)); + if ((buttonChannel) && (i < nElectrodeNames)) + { + gtk_button_set_label(buttonChannel, &electrodeNames[i][0]); + gtk_list_store_append(GTK_LIST_STORE(listStoreBipolarChannels), &it); + gtk_list_store_set(GTK_LIST_STORE(listStoreBipolarChannels), &it, 0, &electrodeNames[i][0], -1); + } + else if ((buttonChannel) && (i >= nElectrodeNames)) + { + gtk_widget_set_sensitive(GTK_WIDGET(buttonChannel), false); + gtk_button_set_label(buttonChannel, ""); + } + } + for (uint16_t i = 0; i < GDS_GNAUTILUS_CHANNELS_MAX; ++i) + { + sprintf_s(&tmp[0], 30, "combobox_channel_%d", (i + 1)); + comboBoxBipolarChannels = GTK_COMBO_BOX(gtk_builder_get_object(m_builder,tmp)); + if (comboBoxBipolarChannels) + { + gtk_combo_box_set_model(comboBoxBipolarChannels, listStoreBipolarChannels); + gtk_combo_box_set_active(comboBoxBipolarChannels, 0); + } + } + // adapt number of recorded channels in main configuration dialog according to number of actual selected channels + GtkSpinButton* buttonNChannels = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder,"spinbutton_number_of_channels")); + gtk_spin_button_set_range(buttonNChannels, nElectrodeNames, nElectrodeNames); + gtk_spin_button_set_value(buttonNChannels, nElectrodeNames); + + // set electrode names as channel names + m_channelNames.clear(); + for (size_t i = 0; i < nElectrodeNames; ++i) { m_channelNames[i] = electrodeNames[i]; } + + delete [] electrodeNames; + + return true; +} + +// get channels currenly available for g.Nautilus used +bool CConfigurationgNautilusInterface::getAvailableChannels() +{ + char tmp[30]; + + // get channels currently available on connected device + BOOL availableChannels[GDS_GNAUTILUS_CHANNELS_MAX]; + m_gdsResult = GDS_GNAUTILUS_GetAvailableChannels(m_deviceHandle, m_deviceNames, &availableChannels); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + m_availableChannels.resize(GDS_GNAUTILUS_CHANNELS_MAX); + + for (uint16_t i = 0; i < GDS_GNAUTILUS_CHANNELS_MAX; ++i) + { + sprintf_s(&tmp[0], 30, "checkbutton_channel_%d", (i + 1)); + GtkCheckButton* buttonChannel = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,tmp)); + sprintf_s(&tmp[0], 30, "label_channel_%d", (i + 1)); + GtkLabel* labelChannel = GTK_LABEL(gtk_builder_get_object(m_builder,tmp)); + sprintf_s(&tmp[0], 30, "combobox_channel_%d", (i + 1)); + GtkComboBox* comboBoxChannel = GTK_COMBO_BOX(gtk_builder_get_object(m_builder,tmp)); + sprintf_s(&tmp[0], 30, "checkbutton_car_channel_%d", (i + 1)); + GtkCheckButton* buttonCARChannel = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,tmp)); + sprintf_s(&tmp[0], 30, "checkbutton_noise_channel_%d", (i + 1)); + GtkCheckButton* buttonNoiseChannel = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,tmp)); + if (availableChannels[i] == 1) + { + if (buttonChannel) + { + gtk_widget_set_visible(GTK_WIDGET(buttonChannel), true); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttonChannel), true); + gtk_widget_set_visible(GTK_WIDGET(labelChannel), true); + gtk_widget_set_visible(GTK_WIDGET(comboBoxChannel), true); + gtk_widget_set_visible(GTK_WIDGET(buttonCARChannel), true); + gtk_widget_set_visible(GTK_WIDGET(buttonNoiseChannel), true); + } + m_availableChannels[i] = true; + } + else + { + if (buttonChannel) + { + gtk_widget_set_visible(GTK_WIDGET(buttonChannel), false); + gtk_widget_set_visible(GTK_WIDGET(labelChannel), false); + gtk_widget_set_visible(GTK_WIDGET(comboBoxChannel), false); + gtk_widget_set_visible(GTK_WIDGET(buttonCARChannel), false); + gtk_widget_set_visible(GTK_WIDGET(buttonNoiseChannel), false); + } + m_availableChannels[i] = false; + } + } + + return true; +} + +// if sampling rate changed filters in filter settings dialog have to be updated according to new sampling rate +bool CConfigurationgNautilusInterface::getFiltersForNewSamplingRate() +{ + GtkTreeIter iter; + + // get current sample rate + GtkComboBox* comboBoxSampling = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")); + const char* sSampling = gtk_combo_box_get_active_text(comboBoxSampling); + double sampling = atof(sSampling); + + size_t nBandPassFilters, nNotchFilters; + std::stringstream filterDesc; + filterDesc << "no bandpass filter"; + + // get number of bandpass filters and allocate filter array correspondingly + m_gdsResult = GDS_GNAUTILUS_GetBandpassFilters(m_deviceHandle, m_deviceNames, nullptr, &nBandPassFilters); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + GDS_FILTER_INFO* bandPassFilters = new GDS_FILTER_INFO[nBandPassFilters]; + // get bandpass filters + m_gdsResult = GDS_GNAUTILUS_GetBandpassFilters(m_deviceHandle, m_deviceNames, bandPassFilters, &nBandPassFilters); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage; + return false; + } + // get number of notch filters and allocate filter array correspondingly + m_gdsResult = GDS_GNAUTILUS_GetNotchFilters(m_deviceHandle, m_deviceNames, nullptr, &nNotchFilters); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + GDS_FILTER_INFO* notchFilters = new GDS_FILTER_INFO[nNotchFilters]; + // get notch filters + m_gdsResult = GDS_GNAUTILUS_GetNotchFilters(m_deviceHandle, m_deviceNames, notchFilters, &nNotchFilters); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + // set filters as combobox entries depending on the current sample rate selected + GtkComboBox* comboBoxBandPass = GTK_COMBO_BOX(gtk_builder_get_object(m_builder,"combobox_select_bandpass_filter")); + GtkTreeModel* listStoreBandPass = gtk_combo_box_get_model(comboBoxBandPass); + gtk_list_store_clear(GTK_LIST_STORE(listStoreBandPass)); + + GtkComboBox* comboBoxNotch = GTK_COMBO_BOX(gtk_builder_get_object(m_builder,"combobox_select_notch_filter")); + GtkTreeModel* listStoreNotch = gtk_combo_box_get_model(comboBoxNotch); + gtk_list_store_clear(GTK_LIST_STORE(listStoreNotch)); + + if (m_comboBoxBandpassFilterIdx.size() > 0) m_comboBoxBandpassFilterIdx.clear(); + if (m_comboBoxNotchFilterIdx.size() > 0) m_comboBoxNotchFilterIdx.clear(); + if (m_comboBoxSensitivityValues.size() > 0) m_comboBoxSensitivityValues.clear(); + + // fill bandpass filter combobox with available filters + gtk_list_store_append(GTK_LIST_STORE(listStoreBandPass), &iter); + gtk_list_store_set(GTK_LIST_STORE(listStoreBandPass), &iter, 0, filterDesc.str().c_str(), -1); + filterDesc.clear(); + filterDesc.str(""); + + m_comboBoxBandpassFilterIdx.push_back(-1); + for (size_t i = 0; i < nBandPassFilters; ++i) + { + if (sampling == bandPassFilters[i].SamplingRate) + { + if (bandPassFilters[i].TypeId == 1) filterDesc << "Butterworth - "; + if (bandPassFilters[i].TypeId == 2) filterDesc << "Chebyshev - "; + + filterDesc << bandPassFilters[i].Order << " - ["; + filterDesc << bandPassFilters[i].LowerCutoffFrequency << "; "; + filterDesc << bandPassFilters[i].UpperCutoffFrequency << "] - "; + filterDesc << bandPassFilters[i].SamplingRate; + gtk_list_store_append(GTK_LIST_STORE(listStoreBandPass), &iter); + gtk_list_store_set(GTK_LIST_STORE(listStoreBandPass), &iter, 0, filterDesc.str().c_str(), -1); + m_comboBoxBandpassFilterIdx.push_back(i); + } + filterDesc.clear(); + filterDesc.str(""); + } + gtk_combo_box_set_active(comboBoxBandPass, m_bandpassFilterIdx + 1); // +1 because -1 is for "no filter". + + // fill notch filter combobox with available fliters + filterDesc << "no notch filter"; + gtk_list_store_append(GTK_LIST_STORE(listStoreNotch), &iter); + gtk_list_store_set(GTK_LIST_STORE(listStoreNotch), &iter, 0, filterDesc.str().c_str(), -1); + filterDesc.clear(); + filterDesc.str(""); + + m_comboBoxNotchFilterIdx.push_back(-1); + for (size_t i = 0; i < nNotchFilters; ++i) + { + if (sampling == notchFilters[i].SamplingRate) + { + if (notchFilters[i].TypeId == 1) filterDesc << "Butterworth - "; + if (notchFilters[i].TypeId == 2) filterDesc << "Chebyshev - "; + + filterDesc << notchFilters[i].Order << " - ["; + filterDesc << notchFilters[i].LowerCutoffFrequency << "; "; + filterDesc << notchFilters[i].UpperCutoffFrequency << "] - "; + filterDesc << notchFilters[i].SamplingRate; + gtk_list_store_append(GTK_LIST_STORE(listStoreNotch), &iter); + gtk_list_store_set(GTK_LIST_STORE(listStoreNotch), &iter, 0, filterDesc.str().c_str(), -1); + m_comboBoxNotchFilterIdx.push_back(i); + } + filterDesc.clear(); + filterDesc.str(""); + } + gtk_combo_box_set_active(comboBoxNotch, m_notchFilterIdx + 1); // +1 because -1 is for "no filter". + + delete [] bandPassFilters; + delete [] notchFilters; + + return true; +} + +// If you added more reference attribute, initialize them here +CConfigurationgNautilusInterface::CConfigurationgNautilusInterface(IDriverContext& ctx, const char* gtkBuilderFilename, std::string& deviceSerial, + int& inputSource, uint32_t& networkChannel, int& bandpassFilterIdx, int& notchFilterIdx, + double& sensitivity, bool& digitalInputEnabled, bool& noiseReductionEnabled, + bool& carEnabled, bool& accelerationDataEnabled, bool& counterEnabled, + bool& linkQualityEnabled, bool& batteryLevelEnabled, bool& validationIndicatorEnabled, + std::vector& selectedChannels, std::vector& bipolarChannels, + std::vector& cars, std::vector& noiseReduction) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx), m_deviceSerial(deviceSerial), m_inputSource(inputSource), m_networkChannel(networkChannel), + m_bandpassFilterIdx(bandpassFilterIdx), m_notchFilterIdx(notchFilterIdx), m_sensitivity(sensitivity), m_digitalInputEnabled(digitalInputEnabled), + m_noiseReductionEnabled(noiseReductionEnabled), m_carEnabled(carEnabled), m_accelerationDataEnabled(accelerationDataEnabled), + m_counterEnabled(counterEnabled), m_linkQualityEnabled(linkQualityEnabled), m_batteryLevelEnabled(batteryLevelEnabled), + m_validationIndicatorEnabled(validationIndicatorEnabled), m_selectedChannels(selectedChannels), m_bipolarChannels(bipolarChannels), m_cars(cars), + m_noiseReduction(noiseReduction) { m_connectionOpen = false; } + +bool CConfigurationgNautilusInterface::preConfigure() +{ + if (! CConfigurationBuilder::preConfigure()) { return false; } + + // Connect here all callbacks + // Example: + // g_signal_connect(gtk_builder_get_object(m_builder, "button_calibrate"), "pressed", G_CALLBACK(button_calibrate_pressed_cb), this); + + // Insert here the pre-configure code. + // For example, you may want to check if a device is currently connected + // and if more than one are connected. Then you can list in a dedicated combo-box + // the device currently connected so the user can choose which one he wants to acquire from. + + bool functionReturn; + + // open connection to device if not done yet before reading filters, channel names etc. + if (!m_connectionOpen) + { + // open device handle and get connected device + functionReturn = openDevice(); + if (!functionReturn) { return false; } // error logged in openDevice; + } + + // get settings for connected hardware + functionReturn = getHardwareSettings(); + if (!functionReturn) { return false; } + // error logged in getHardwareSettings + + // get available channels + functionReturn = getAvailableChannels(); + if (!functionReturn) { return false; } // error logged in getAvailableChannels + + functionReturn = getChannelNames(); + if (!functionReturn) { return false; } // error logged in getChannelNames + + // activate checkboxes in g.Nautilus Configuration dialog + GtkCheckButton* buttonEventChannel = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_event_channel")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttonEventChannel), m_digitalInputEnabled); + + GtkCheckButton* buttonNoiseReduction = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_noise_reduction")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttonNoiseReduction), m_noiseReductionEnabled); + + GtkCheckButton* buttonCAR = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_car")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttonCAR), m_carEnabled); + + // activate/deactivate channel, noise reduction and CAR checkboxes in dialog_select_channels_bipolar_car_noise + // as well as bipolar combo boxes according to available channels + const gboolean noiseReduction = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(buttonNoiseReduction)); + const gboolean car = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(buttonCAR)); + char tmp[45]; + for (uint16_t i = 0; i < GDS_GNAUTILUS_CHANNELS_MAX; ++i) + { + sprintf_s(&tmp[0], 45, "checkbutton_channel_%d", (i + 1)); + GtkCheckButton* button = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,tmp)); + if ((button) && (m_availableChannels[i])) gtk_widget_set_sensitive(GTK_WIDGET(button), true); + else if (button) gtk_widget_set_sensitive(GTK_WIDGET(button), false); + + sprintf_s(&tmp[0], 45, "checkbutton_noise_channel_%d", (i + 1)); + button = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,tmp)); + if ((button) && (m_availableChannels[i])) gtk_widget_set_sensitive(GTK_WIDGET(button), noiseReduction); + else if (button) gtk_widget_set_sensitive(GTK_WIDGET(button), false); + + sprintf_s(&tmp[0], 45, "checkbutton_car_channel_%d", (i + 1)); + button = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,tmp)); + if ((button) && (m_availableChannels[i])) gtk_widget_set_sensitive(GTK_WIDGET(button), car); + else if (button) gtk_widget_set_sensitive(GTK_WIDGET(button), false); + + sprintf_s(&tmp[0], 45, "combobox_channel_%d", (i + 1)); + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder,tmp)); + if ((comboBox) && (m_availableChannels[i])) gtk_widget_set_sensitive(GTK_WIDGET(comboBox), true); + else if (comboBox) gtk_widget_set_sensitive(GTK_WIDGET(comboBox), false); + } + + GtkCheckButton* accelerationData = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_acceleration_data")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(accelerationData), m_accelerationDataEnabled); + + GtkCheckButton* counter = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_counter")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(counter), m_counterEnabled); + + GtkCheckButton* linkQuality = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_link_quality")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linkQuality), m_linkQualityEnabled); + + GtkCheckButton* batteryLevel = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_battery_level")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(batteryLevel), m_batteryLevelEnabled); + + GtkCheckButton* validationIndicator = GTK_CHECK_BUTTON( + gtk_builder_get_object(m_builder, "checkbutton_validation_indicator")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(validationIndicator), m_validationIndicatorEnabled); + + g_signal_connect(gtk_builder_get_object(m_builder,"button_select_channels_bipolar_car_noise"), "pressed", G_CALLBACK(ChannelSettingsCB), this); + g_signal_connect(gtk_builder_get_object(m_builder,"button_select_sensitivity_filters"), "pressed", G_CALLBACK(SensitivityFiltersCB), this); + + g_signal_connect(gtk_builder_get_object(m_builder,"button_select_sensitivity_filters_apply"), "pressed", G_CALLBACK(SensitivityFiltersApplyCB), this); + g_signal_connect(gtk_builder_get_object(m_builder,"button_channel_apply"), "pressed", G_CALLBACK(ChannelSettingsApplyCB), this); + + // set device serial in device serial text entry in g.Nautilus Configuration dialog + GtkEntry* deviceSerial = GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_device_serial")); + gtk_entry_set_text(deviceSerial, m_deviceSerial.c_str()); + gtk_entry_set_editable(deviceSerial, false); + + // deactivate buttons if no device is detected + if (gtk_entry_get_text_length(deviceSerial) < 13) + { + GtkWidget* button = GTK_WIDGET(gtk_builder_get_object(m_builder,"button_select_channels_bipolar_car_noise")); + gtk_widget_set_sensitive(button, false); + + button = GTK_WIDGET(gtk_builder_get_object(m_builder,"button_select_sensitivity_filters")); + gtk_widget_set_sensitive(button, false); + } + + // catch event when sample rate is changed to adjust available filters + g_signal_connect(gtk_builder_get_object(m_builder, "combobox_sampling_frequency"), "changed", G_CALLBACK(sample_rate_changed_cb), this); + + // catch events when car and noise reduction checkboxes are toggled in main config dialog to enable/disable corresponding checkboxes in related dialog + g_signal_connect(gtk_builder_get_object(m_builder, "checkbutton_noise_reduction"), "toggled", G_CALLBACK(noise_reduction_changed_cb), this); + g_signal_connect(gtk_builder_get_object(m_builder, "checkbutton_car"), "toggled", G_CALLBACK(car_changed_cb), this); + + return true; +} + +bool CConfigurationgNautilusInterface::postConfigure() +{ + if (m_applyConfig) + { + // If the user pressed the "apply" button, you need to save the changes made in the configuration. + // For example, you can save the connection ID of the selected device: + // m_connectionID = + GtkCheckButton* checkButton; + uint16_t i; + gboolean buttonValue = false; + gdouble nChannels = 0; + + // get serial number from configuration dialog + GtkEntry* entrySerial = GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_device_serial")); + m_deviceSerial = gtk_entry_get_text(entrySerial); + + // get selected input source from dialog + GtkComboBox* inputSources = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_input_source")); + size_t idx = gtk_combo_box_get_active(inputSources); + m_inputSource = m_comboBoxInputSources[idx]; + + // get selected channels + char tmp[45]; + m_selectedChannels.clear(); + for (i = 0; i < GDS_GNAUTILUS_CHANNELS_MAX; ++i) + { + sprintf_s(&tmp[0], 45, "checkbutton_channel_%d", (i + 1)); + checkButton = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,tmp)); + if (checkButton) + { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkButton))) + { + m_selectedChannels.push_back(i + 1); + nChannels += 1; + } + else + { + m_selectedChannels.push_back(0); + m_channelNames.erase(i); + } + } + } + + // get bipolar channels + m_bipolarChannels.clear(); + for (i = 0; i < GDS_GNAUTILUS_CHANNELS_MAX; ++i) + { + sprintf_s(&tmp[0], 45, "combobox_channel_%d", (i + 1)); + GtkComboBox* bipolarChannels = GTK_COMBO_BOX(gtk_builder_get_object(m_builder,tmp)); + if (bipolarChannels) + { + // bipolar is 0 based for the channels, -1 indicates no bipolar derivation + m_bipolarChannels.push_back(gtk_combo_box_get_active(bipolarChannels) - 1); + } + } + + // set bandpass and notch filter indices to correponding variables + GtkComboBox* bandpassFilters = GTK_COMBO_BOX(gtk_builder_get_object(m_builder,"combobox_select_bandpass_filter")); + idx = gtk_combo_box_get_active(bandpassFilters); + m_bandpassFilterIdx = m_comboBoxBandpassFilterIdx.at(idx); + + GtkComboBox* notchFilters = GTK_COMBO_BOX(gtk_builder_get_object(m_builder,"combobox_select_notch_filter")); + idx = gtk_combo_box_get_active(notchFilters); + m_notchFilterIdx = m_comboBoxNotchFilterIdx.at(idx); + + // sensitivity + GtkComboBox* sensitivities = GTK_COMBO_BOX(gtk_builder_get_object(m_builder,"combobox_select_sensitivity")); + idx = gtk_combo_box_get_active(sensitivities); + m_sensitivity = m_comboBoxSensitivityValues.at(idx); + + // digital inputs + checkButton = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,"checkbutton_event_channel")); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkButton)) == 1) { m_digitalInputEnabled = true; } + else { m_digitalInputEnabled = false; } + + // noise reduction + checkButton = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,"checkbutton_noise_reduction")); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkButton)) == 1) { m_noiseReductionEnabled = true; } + else { m_noiseReductionEnabled = false; } + + // if noise reduction is active, check for which channels noise reduction is enabled + m_noiseReduction.clear(); + for (i = 0; i < GDS_GNAUTILUS_CHANNELS_MAX; ++i) + { + sprintf_s(&tmp[0], 45, "checkbutton_noise_channel_%d", (i + 1)); + checkButton = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,tmp)); + if (checkButton) + { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkButton)) == 1) { m_noiseReduction.push_back(true); } + else { m_noiseReduction.push_back(false); } + } + } + + // CAR + checkButton = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,"checkbutton_car")); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkButton)) == 1) m_carEnabled = true; + else m_carEnabled = false; + + // if CAR is active, check for which channels CAR is enabled + m_cars.clear(); + for (i = 0; i < GDS_GNAUTILUS_CHANNELS_MAX; ++i) + { + sprintf_s(&tmp[0], 45, "checkbutton_car_channel_%d", (i + 1)); + checkButton = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,tmp)); + if (checkButton) + { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkButton)) == 1) m_cars.push_back(true); + else m_cars.push_back(false); + } + } + + // acceleration data + checkButton = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,"checkbutton_acceleration_data")); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkButton)) == 1) { m_accelerationDataEnabled = true; } + else { m_accelerationDataEnabled = false; } + + // counter + checkButton = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,"checkbutton_counter")); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkButton)) == 1) { m_counterEnabled = true; } + else { m_counterEnabled = false; } + + // link quality + checkButton = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,"checkbutton_link_quality")); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkButton)) == 1) { m_linkQualityEnabled = true; } + else { m_linkQualityEnabled = false; } + + // battery level + checkButton = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,"checkbutton_battery_level")); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkButton)) == 1) { m_batteryLevelEnabled = true; } + else { m_batteryLevelEnabled = false; } + + // validation indicator + checkButton = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder,"checkbutton_validation_indicator")); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkButton)) == 1) { m_validationIndicatorEnabled = true; } + else { m_validationIndicatorEnabled = false; } + + // network channel + GtkComboBox* comboBoxNetworkChannel = GTK_COMBO_BOX(gtk_builder_get_object(m_builder,"combobox_network_channel")); + const char* networkChannel = gtk_combo_box_get_active_text(comboBoxNetworkChannel); + m_networkChannel = uint32_t(atoi(networkChannel)); + + // set number of channels in main configuration dialog (spinbutton still remains disabled, user cannot change value there) + GtkSpinButton* buttonChannels = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_number_of_channels")); + gtk_spin_button_set_value(buttonChannels, nChannels); + gtk_spin_button_set_range(buttonChannels, nChannels, nChannels); + } + if (m_connectionOpen) + { + // close connection handle + const bool functionReturn = closeDevice(); + if (!functionReturn) + { + // error logged in closeDevice + return false; + } + } + + if (! CConfigurationBuilder::postConfigure() + ) { return false; } // normal header is filled (Subject ID, Age, Gender, channels, sampling frequency), ressources are realesed + + return true; +} + +bool CConfigurationgNautilusInterface::openDevice() +{ + GDS_ENDPOINT hostEp, localEp; + GDS_DEVICE_CONNECTION_INFO* connectedDevicesInfo; + size_t nDevices; + std::string deviceSerial; + BOOL openExclusively = true; + BOOL isCreator; + m_deviceNames = new char[1][DEVICE_NAME_LENGTH_MAX]; + + uint8_t byteIP[4]; + byteIP[0] = 1; + byteIP[1] = 0; + byteIP[2] = 0; + byteIP[3] = 127; + char tmpIP[16]; + + _snprintf_s(tmpIP, IP_ADDRESS_LENGTH_MAX, "%d.%d.%d.%d", byteIP[3], byteIP[2], byteIP[1], byteIP[0]); + + for (size_t i = 0; i < IP_ADDRESS_LENGTH_MAX; ++i) + { + hostEp.IpAddress[i] = tmpIP[i]; + localEp.IpAddress[i] = tmpIP[i]; + } + + hostEp.Port = 50223; + localEp.Port = 50224; + + // get connected device + m_gdsResult = GDS_GetConnectedDevices(hostEp, localEp, &connectedDevicesInfo, &nDevices); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + for (size_t i = 0; i < nDevices; ++i) + { + // if devices are in use they cannot be used for a new acquisition + if ((connectedDevicesInfo[i].InUse) && (i < nDevices)) continue; + // only one device can be used for data acquisition, as g.Nautilus cannot be synchronized + if ((connectedDevicesInfo[i].InUse) && (connectedDevicesInfo[i].ConnectedDevicesLength > 1)) continue; + GDS_DEVICE_INFO* deviceInfo = connectedDevicesInfo[i].ConnectedDevices; + if (deviceInfo[0].DeviceType == GDS_DEVICE_TYPE_GNAUTILUS) + { + deviceSerial = deviceInfo[0].Name; + nDevices = 1; + break; + } + } + + if (nDevices == 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "No g.Nautilus connected\n"; + return false; + } + + strncpy_s(m_deviceNames[0], deviceSerial.c_str(), DEVICE_NAME_LENGTH_MAX); + m_deviceSerial = deviceSerial; + + // connect to device + m_gdsResult = GDS_Connect(hostEp, localEp, m_deviceNames, nDevices, openExclusively, &m_deviceHandle, &isCreator); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + // free connected devices list allocated by GDS_GetConnectedDevices + m_gdsResult = GDS_FreeConnectedDevicesList(&connectedDevicesInfo, nDevices); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + m_connectionOpen = true; + + return true; +} + +bool CConfigurationgNautilusInterface::closeDevice() +{ + // disconnect device + m_gdsResult = GDS_Disconnect(&m_deviceHandle); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + m_connectionOpen = false; + delete [] m_deviceNames; + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyGNEEDaccessAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gnautilus/src/ovasCConfigurationgNautilusInterface.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gnautilus/src/ovasCConfigurationgNautilusInterface.h new file mode 100644 index 0000000..f80be35 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gnautilus/src/ovasCConfigurationgNautilusInterface.h @@ -0,0 +1,102 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyGNEEDaccessAPI) + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +#include +#include +#include + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationgNautilusInterface + * \author g.tec medical engineering GmbH (g.tec medical engineering GmbH) + * \date Wed Aug 12 16:37:18 2015 + * \brief The CConfigurationgNautilusInterface handles the configuration dialog specific to the g.NEEDaccess device. + * + * TODO: details + * + * \sa CDrivergNautilusInterface + */ +class CConfigurationgNautilusInterface final : public CConfigurationBuilder +{ +public: + + // you may have to add to your constructor some reference parameters + // for example, a connection ID: + //CConfigurationgNautilusInterface(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& rConnectionId); + CConfigurationgNautilusInterface(IDriverContext& ctx, const char* gtkBuilderFilename, std::string& deviceSerial, int& inputSource, uint32_t& networkChannel, + int& bandpassFilterIdx, int& notchFilterIdx, double& sensitivity, bool& digitalInputEnabled, bool& noiseReductionEnabled, + bool& carEnabled, bool& accelerationDataEnabled, bool& counterEnabled, bool& linkQualityEnabled, bool& batteryLevelEnabled, + bool& validationIndicatorEnabled, std::vector& selectedChannels, std::vector& bipolarChannels, + std::vector& cars, std::vector& noiseReduction); + + bool preConfigure() override; + bool postConfigure() override; + + //button callback functions + void buttonChannelSettingsPressedCB(); + void buttonChannelSettingsApplyPressedCB(); + void buttonSensitivityFiltersPressedCB(); + void buttonSensitivityFiltersApplyPressedCB(); + bool getHardwareSettings(); + bool getChannelNames(); + bool getAvailableChannels(); + bool getFiltersForNewSamplingRate(); + void comboboxSampleRateChangedCB(); + void checkbuttonNoiseReductionChangedCB(); + void checkbuttonCARChangedCB(); + +protected: + + IDriverContext& m_driverCtx; + std::string& m_deviceSerial; + int& m_inputSource; + uint32_t& m_networkChannel; + int& m_bandpassFilterIdx; + int& m_notchFilterIdx; + double& m_sensitivity; + bool& m_digitalInputEnabled; + bool& m_noiseReductionEnabled; + bool& m_carEnabled; + bool& m_accelerationDataEnabled; + bool& m_counterEnabled; + bool& m_linkQualityEnabled; + bool& m_batteryLevelEnabled; + bool& m_validationIndicatorEnabled; + std::vector& m_selectedChannels; + std::vector& m_bipolarChannels; + std::vector& m_cars; + std::vector& m_noiseReduction; + std::vector m_comboBoxBandpassFilterIdx; + std::vector m_comboBoxNotchFilterIdx; + std::vector m_comboBoxSensitivityValues; + std::vector m_comboBoxInputSources; + std::vector m_comboBoxNetworkChannels; + +private: + + /* + * Insert here all specific attributes, such as a connection ID. + * use references to directly modify the corresponding attribute of the driver + * Example: + */ + // uint32_t& m_connectionID; + bool openDevice(); + bool closeDevice(); + GDS_HANDLE m_deviceHandle; + GDS_RESULT m_gdsResult; + std::vector m_availableChannels; + char (*m_deviceNames)[DEVICE_NAME_LENGTH_MAX]; + bool m_connectionOpen = false; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGNEEDaccessAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gnautilus/src/ovasCDrivergNautilusInterface.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gnautilus/src/ovasCDrivergNautilusInterface.cpp new file mode 100644 index 0000000..245e62a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gnautilus/src/ovasCDrivergNautilusInterface.cpp @@ -0,0 +1,462 @@ +#if defined(TARGET_HAS_ThirdPartyGNEEDaccessAPI) + +#include "ovasCDrivergNautilusInterface.h" +#include "ovasCConfigurationgNautilusInterface.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +// global functions, event handles and variables +void OnDataReadyEventHandler(GDS_HANDLE handle, void* data); +HANDLE dataReadyEventHandle; + +CDrivergNautilusInterface::CDrivergNautilusInterface(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_gNautilusInterface", m_driverCtx.getConfigurationManager()), m_Device(NULL) +{ + m_header.setSamplingFrequency(250); + m_header.setChannelCount(32); + + // The following class allows saving and loading driver settings from the acquisition server .conf file + m_settings.add("Header", &m_header); + // To save your custom driver settings, register each variable to the SettingsHelper + //m_settings.add("SettingName", &variable); + m_settings.add("DeviceIndex", &m_deviceIdx); + m_settings.add("InputSource", &m_inputSource); + m_settings.add("NetworkChannel", &m_networkChannel); + m_settings.add("Sensitivity", &m_sensitivity); + m_settings.add("NotchFilterIndex", &m_notchFilterIdx); + m_settings.add("BandPassFilterIndex", &m_bandPassFilterIdx); + m_settings.add("DigitalInputEnabled", &m_digitalInputEnabled); + m_settings.add("NoiseReductionEnabled", &m_noiseReductionEnabled); + m_settings.add("CAREnabled", &m_carEnabled); + m_settings.add("AccelerationEnabled", &m_accelerationDataEnabled); + m_settings.add("CounterEnabled", &m_counterEnabled); + m_settings.add("LinqQualityEnabled", &m_linkQualityEnabled); + m_settings.add("BatteryLevelEnabled", &m_batteryLevelEnabled); + m_settings.add("ValidationIndicatorEnabled", &m_validationIndicatorEnabled); + + m_settings.load(); +} + +//___________________________________________________________________// +// // + +bool CDrivergNautilusInterface::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + if (nSamplePerSentBlock > 250) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Sample count per sent block cannot be higher than 250 samples for g.Nautilus\n"; + return false; + } + + // initialize basic GDS functions before the first GDS function itself is called + GDS_Initialize(); + + // get number of channels actually acquired + m_nAcquiredChannel = 0; + for (size_t i = 0; i < GDS_GNAUTILUS_CHANNELS_MAX; ++i) + { + if (find(m_selectedChannels.begin(), m_selectedChannels.end(), (i + 1)) != m_selectedChannels.end()) + { + m_header.setChannelUnits(m_nAcquiredChannel, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); + m_nAcquiredChannel += 1; + } + } + + m_header.setChannelCount(m_nAcquiredChannel); + + // g.Nautilus provides some extra channel, add them to the channels count + // and provide corresponding names + uint32_t nAcquiredChannel = m_nAcquiredChannel; + if (m_accelerationDataEnabled) + { + m_header.setChannelCount(nAcquiredChannel + 3); + m_header.setChannelName(nAcquiredChannel, "CH_Accel_x"); + m_header.setChannelName(nAcquiredChannel + 1, "CH_Accel_y"); + m_header.setChannelName(nAcquiredChannel + 2, "CH_Accel_z"); + m_header.setChannelUnits(nAcquiredChannel, OVTK_UNIT_Meter_Per_Second_Squared, OVTK_FACTOR_Base); + m_header.setChannelUnits(nAcquiredChannel + 1, OVTK_UNIT_Meter_Per_Second_Squared, OVTK_FACTOR_Base); + m_header.setChannelUnits(nAcquiredChannel + 2, OVTK_UNIT_Meter_Per_Second_Squared, OVTK_FACTOR_Base); + nAcquiredChannel = m_header.getChannelCount(); + } + if (m_counterEnabled) + { + m_header.setChannelCount(nAcquiredChannel + 1); + m_header.setChannelName(nAcquiredChannel, "CH_Counter"); + m_header.setChannelUnits(nAcquiredChannel,OVTK_UNIT_Dimensionless,OVTK_FACTOR_Base); + nAcquiredChannel = m_header.getChannelCount(); + } + if (m_linkQualityEnabled) + { + m_header.setChannelCount(nAcquiredChannel + 1); + m_header.setChannelName(nAcquiredChannel, "CH_LQ"); + m_header.setChannelUnits(nAcquiredChannel,OVTK_UNIT_10_2_Percent,OVTK_FACTOR_Base); + nAcquiredChannel = m_header.getChannelCount(); + } + if (m_batteryLevelEnabled) + { + m_header.setChannelCount(nAcquiredChannel + 1); + m_header.setChannelName(nAcquiredChannel, "CH_Battery"); + m_header.setChannelUnits(nAcquiredChannel,OVTK_UNIT_10_2_Percent,OVTK_FACTOR_Base); + nAcquiredChannel = m_header.getChannelCount(); + } + if (m_digitalInputEnabled) + { + m_header.setChannelCount(nAcquiredChannel + 1); + m_header.setChannelName(nAcquiredChannel, "CH_Event"); + m_header.setChannelUnits(nAcquiredChannel,OVTK_UNIT_Dimensionless,OVTK_FACTOR_Base); + nAcquiredChannel = m_header.getChannelCount(); + } + if (m_validationIndicatorEnabled) + { + m_header.setChannelCount(nAcquiredChannel + 1); + m_header.setChannelName(nAcquiredChannel, "CH_Valid"); + m_header.setChannelUnits(nAcquiredChannel,OVTK_UNIT_Dimensionless,OVTK_FACTOR_Base); + nAcquiredChannel = m_header.getChannelCount(); + } + + // initialize connection and open connection handle and get serial of connected g.Nautilus + GDS_DEVICE_CONNECTION_INFO* devicesInfo; + size_t nDevices = 0; + GDS_ENDPOINT hostEp; + GDS_ENDPOINT localEp; + uint8_t byteIP[4]; + char tempIP[16]; + + byteIP[0] = 1; + byteIP[1] = 0; + byteIP[2] = 0; + byteIP[3] = 127; + + _snprintf_s(tempIP, IP_ADDRESS_LENGTH_MAX, "%d.%d.%d.%d", byteIP[3], byteIP[2], byteIP[1], byteIP[0]); + + for (size_t i = 0; i < IP_ADDRESS_LENGTH_MAX; ++i) + { + hostEp.IpAddress[i] = tempIP[i]; + localEp.IpAddress[i] = tempIP[i]; + } + + hostEp.Port = 50223; + localEp.Port = 50224; + + bool found = false; + m_gdsResult = GDS_GetConnectedDevices(hostEp, localEp, &devicesInfo, &nDevices); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + for (size_t i = 0; i < nDevices; ++i) + { + // if devices are in use they cannot be used for a new acquisition + if ((devicesInfo[i].InUse) && (i < nDevices)) { continue; } + // only one device can be used for data acquisition, as g.Nautilus cannot be synchronized + if ((devicesInfo[i].InUse) && (devicesInfo[i].ConnectedDevicesLength > 1)) { continue; } + GDS_DEVICE_INFO* info = devicesInfo[i].ConnectedDevices; + if (info[0].DeviceType == GDS_DEVICE_TYPE_GNAUTILUS) + { + // check if device used for configuration is still available + if (!strcmp(info[0].Name, m_deviceSerial.c_str())) + { + m_nDevice = 1; + found = true; + break; + } + } + } + if (found == false) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "No g.Nautilus device found\n"; + return false; + } + + char (*names)[DEVICE_NAME_LENGTH_MAX] = new char[1][DEVICE_NAME_LENGTH_MAX]; + bool openExclusively = true; + BOOL isCreator; + + strncpy_s(names[0], m_deviceSerial.c_str(), DEVICE_NAME_LENGTH_MAX); + + // connect to device + m_gdsResult = GDS_Connect(hostEp, localEp, names, m_nDevice, openExclusively, &m_Device, &isCreator); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Connected to device : " << m_deviceSerial << "\n"; + + m_deviceCfg.SamplingRate = m_header.getSamplingFrequency(); + m_deviceCfg.NumberOfScans = nSamplePerSentBlock; + m_deviceCfg.NetworkChannel = m_networkChannel; + m_deviceCfg.AccelerationData = m_accelerationDataEnabled; + m_deviceCfg.BatteryLevel = m_batteryLevelEnabled; + m_deviceCfg.CAR = m_carEnabled; + m_deviceCfg.Counter = m_counterEnabled; + m_deviceCfg.DigitalIOs = m_digitalInputEnabled; + m_deviceCfg.LinkQualityInformation = m_linkQualityEnabled; + m_deviceCfg.NoiseReduction = m_noiseReductionEnabled; + m_deviceCfg.Slave = 0; + m_deviceCfg.ValidationIndicator = m_validationIndicatorEnabled; + m_deviceCfg.InputSignal = GDS_GNAUTILUS_INPUT_SIGNAL(m_inputSource); + + for (size_t i = 0; i < GDS_GNAUTILUS_CHANNELS_MAX; ++i) + { + if (find(m_selectedChannels.begin(), m_selectedChannels.end(), (i + 1)) != m_selectedChannels.end()) { m_deviceCfg.Channels[i].Enabled = true; } + else { m_deviceCfg.Channels[i].Enabled = false; } + m_deviceCfg.Channels[i].Sensitivity = m_sensitivity; + if (i < m_cars.size()) { m_deviceCfg.Channels[i].UsedForCar = m_cars[i]; } + else { m_deviceCfg.Channels[i].UsedForCar = false; } + if (i < m_noiseReduction.size()) { m_deviceCfg.Channels[i].UsedForNoiseReduction = m_noiseReduction[i]; } + else { m_deviceCfg.Channels[i].UsedForNoiseReduction = false; } + m_deviceCfg.Channels[i].BandpassFilterIndex = m_bandPassFilterIdx; + m_deviceCfg.Channels[i].NotchFilterIndex = m_notchFilterIdx; + if (i < m_bipolarChannels.size()) { m_deviceCfg.Channels[i].BipolarChannel = m_bipolarChannels[i]; } + else { m_deviceCfg.Channels[i].BipolarChannel = false; } + } + + // Free memory allocated for list of connected devices by GDS_GetConnectedDevices + m_gdsResult = GDS_FreeConnectedDevicesList(&devicesInfo, nDevices); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + // Builds up a buffer to store acquired samples. This buffer + // will be sent to the acquisition server later... + m_sample = new float[nAcquiredChannel * m_deviceCfg.NumberOfScans]; + if (!m_sample) + { + delete [] m_sample; + m_sample = nullptr; + return false; + } + // set up data buffer for gds getdata function + m_Buffer = new float[nAcquiredChannel * m_deviceCfg.NumberOfScans]; + if (!m_Buffer) + { + delete [] m_Buffer; + m_Buffer = nullptr; + return false; + } + m_bufferSize = nAcquiredChannel * m_deviceCfg.NumberOfScans; + + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + return true; +} + +bool CDrivergNautilusInterface::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // if no device was found return + if (m_nDevice != 1) { return false; } + + GDS_CONFIGURATION_BASE* config = new GDS_CONFIGURATION_BASE[m_nDevice]; + config[0].Configuration = &m_deviceCfg; + config[0].DeviceInfo.DeviceType = GDS_DEVICE_TYPE_GNAUTILUS; + strcpy_s(config[0].DeviceInfo.Name, m_deviceSerial.c_str()); + size_t nScan = 0; + size_t channelsPerDevice = 0; + size_t bufferSizeInSamples = 0; + + // set device configuration + m_gdsResult = GDS_SetConfiguration(m_Device, config, m_nDevice); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + // initialize data ready event and set data ready event handle + dataReadyEventHandle = nullptr; + dataReadyEventHandle = CreateEvent(nullptr, false, false, nullptr); + m_gdsResult = GDS_SetDataReadyCallback(m_Device, (GDS_Callback)OnDataReadyEventHandler, m_deviceCfg.NumberOfScans,NULL); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + // set number of scans getdata function will return + m_availableScans = m_deviceCfg.NumberOfScans; + + // ... + // request hardware to start + // sending data + // ... + // start acquisition + m_gdsResult = GDS_StartAcquisition(m_Device); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + // start data stream from server + m_gdsResult = GDS_StartStreaming(m_Device); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + m_gdsResult = GDS_GetDataInfo(m_Device, &nScan, nullptr, &channelsPerDevice, &bufferSizeInSamples); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + return true; +} + +bool CDrivergNautilusInterface::loop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return true; } + + const CStimulationSet stimSet; + + if (m_driverCtx.isStarted()) + { + const DWORD ret = WaitForSingleObject(dataReadyEventHandle, 5000); + if (ret == WAIT_TIMEOUT) + { + // if data ready event is not triggered in 5000ms add a timeout handler + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "No data received in 5 seconds\n"; + return false; + } + // when data is ready call get data function with amount of scans to return + m_gdsResult = GDS_GetData(m_Device, &m_availableScans, m_Buffer, m_bufferSize); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + // put data from receiving buffer to application buffer + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + for (size_t j = 0; j < m_nSamplePerSentBlock; ++j) { m_sample[i * m_nSamplePerSentBlock + j] = m_Buffer[j * (m_header.getChannelCount()) + i]; } + } + } + + // ... + // receive samples from hardware + // put them the correct way in the sample array + // whether the buffer is full, send it to the acquisition server + //... + m_callback->setSamples(m_sample); + + // When your sample buffer is fully loaded, + // it is advised to ask the acquisition server + // to correct any drift in the acquisition automatically. + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + + // ... + // receive events from hardware + // and put them the correct way in a CStimulationSet object + //... + m_callback->setStimulationSet(stimSet); + + return true; +} + +bool CDrivergNautilusInterface::stop() +{ + if (!m_driverCtx.isConnected()) return false; + if (!m_driverCtx.isStarted()) return false; + + // ... + // request the hardware to stop + // sending data + // ... + + + // stop streaming + m_gdsResult = GDS_StopStreaming(m_Device); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + // stop data acquisiton + m_gdsResult = GDS_StopAcquisition(m_Device); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + return true; +} + +bool CDrivergNautilusInterface::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // ... + // uninitialize hardware here + // ... + + m_gdsResult = GDS_Disconnect(&m_Device); + if (m_gdsResult.ErrorCode != GDS_ERROR_SUCCESS) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_gdsResult.ErrorMessage << "\n"; + return false; + } + + delete [] m_sample; + m_sample = nullptr; + m_callback = nullptr; + + // uninitialize basic GDS functions after last GDS function is called + GDS_Uninitialize(); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Disconnected from device : " << m_deviceSerial << "\n"; + + return true; +} + +//___________________________________________________________________// +// // +bool CDrivergNautilusInterface::isConfigurable() +{ + return true; // change to false if your device is not configurable +} + +bool CDrivergNautilusInterface::configure() +{ + // Change this line if you need to specify some references to your driver attribute that need configuration, e.g. the connection ID. + CConfigurationgNautilusInterface config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-gNautilusInterface.ui", + m_deviceSerial, m_inputSource, m_networkChannel, m_bandPassFilterIdx, m_notchFilterIdx, m_sensitivity, + m_digitalInputEnabled, m_noiseReductionEnabled, m_carEnabled, m_accelerationDataEnabled, m_counterEnabled, + m_linkQualityEnabled, m_batteryLevelEnabled, m_validationIndicatorEnabled, m_selectedChannels, m_bipolarChannels, + m_cars, m_noiseReduction); + + if (!config.configure(m_header)) { return false; } + m_settings.save(); + + return true; +} + +void OnDataReadyEventHandler(GDS_HANDLE handle, void* data) +{ + // signals data is ready on GDS acquisition buffer + if (!SetEvent(dataReadyEventHandle)) + { + // insert error handling if necessary + } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGNEEDaccessAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gnautilus/src/ovasCDrivergNautilusInterface.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gnautilus/src/ovasCDrivergNautilusInterface.h new file mode 100644 index 0000000..d388888 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gnautilus/src/ovasCDrivergNautilusInterface.h @@ -0,0 +1,98 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyGNEEDaccessAPI) + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include +#include +#include +#include +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDrivergNautilusInterface + * \author g.tec medical engineering GmbH (g.tec medical engineering GmbH) + * \date Wed Aug 12 16:37:18 2015 + * \brief The CDrivergNautilusInterface allows the acquisition server to acquire data from a g.NEEDaccess device. + * + * TODO: details + * + * \sa CConfigurationgNautilusInterface + */ +class CDrivergNautilusInterface final : public IDriver +{ +public: + + explicit CDrivergNautilusInterface(IDriverContext& ctx); + ~CDrivergNautilusInterface() override { } + const char* getName() override { return "g.tec g.Nautilus using g.NEEDaccess"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + + // Replace this generic Header with any specific header you might have written + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 4; + float* m_sample = nullptr; + uint32_t m_deviceIdx = uint32_t(-1); + uint32_t m_actualDeviceIdx = 0; + uint32_t m_bufferSize = 0; + size_t m_availableScans = 0; + float* m_Buffer = nullptr; + + int m_notchFilterIdx = -1; + int m_bandPassFilterIdx = -1; + + double m_sensitivity = 0; + int m_inputSource = 0; + uint32_t m_networkChannel = 11; + bool m_digitalInputEnabled = true; + bool m_noiseReductionEnabled = false; + bool m_carEnabled = false; + bool m_accelerationDataEnabled = true; + bool m_counterEnabled = true; + bool m_linkQualityEnabled = true; + bool m_batteryLevelEnabled = true; + bool m_validationIndicatorEnabled = true; + std::vector m_selectedChannels; + std::vector m_bipolarChannels; + std::vector m_noiseReduction; + std::vector m_cars; + uint32_t m_nAcquiredChannel = 32; + + GDS_HANDLE m_Device; + GDS_RESULT m_gdsResult; + GDS_GNAUTILUS_CONFIGURATION m_deviceCfg; + std::string m_deviceSerial; + uint32_t m_nDevice = 0; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGNEEDaccessAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gusbamp/share/interface-GTec-GUSBampLegacy.ui b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gusbamp/share/interface-GTec-GUSBampLegacy.ui new file mode 100644 index 0000000..2492472 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gusbamp/share/interface-GTec-GUSBampLegacy.ui @@ -0,0 +1,812 @@ + + + + + + 4 + 1 + 16 + 1 + 10 + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + + + + + + + 32 + + + 64 + + + 128 + + + 256 + + + 512 + + + 600 + + + 1200 + + + 2400 + + + 4800 + + + 9600 + + + 19200 + + + 38400 + + + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + g.Tec gUSBamp + center + + + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 8 + 2 + True + + + True + True + False + adjustment1 + True + True + + + 1 + 2 + 4 + 5 + + + + + True + Number of channels : + right + True + + + 4 + 5 + + + + + True + Device : + right + True + + + 3 + 4 + + + + + True + model1 + + + + 0 + + + + + 1 + 2 + 5 + 6 + + + + + True + Sampling frequency : + right + True + + + 5 + 6 + + + + + True + model2 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + model3 + + + + 0 + + + + + 1 + 2 + 3 + 4 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + True + adjustment3 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + Identifier : + right + True + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + True + False + True + + + 1 + 2 + 6 + 7 + + + + + True + Event channel : + + + 6 + 7 + + + + + True + False + Check impedance : + + + 7 + 8 + + + + + True + True + False + True + + + 1 + 2 + 7 + 8 + + + + + 0 + + + + + 0 + + + + + Auto calibrate in 4 seconds... + True + True + True + + + False + 1 + + + + + True + + + False + 2 + + + + + Connect to Common Gnd and Ref + True + True + True + + + 3 + + + + + Set Amplifier Filters + True + True + True + + + 4 + + + + + True + + + False + 5 + + + + + Change channel names... + True + True + True + + + False + 6 + + + + + 3 + + + + + True + + + False + 4 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + + + + + + + + 5 + Common Ground and Reference + center + dialog + False + + + True + vertical + 2 + + + True + vertical + + + True + 3 + 2 + 5 + 5 + + + True + <big>Connect to Common Ground</big> + True + center + + + 2 + + + + + Block A (yellow) + True + True + False + True + + + 1 + 2 + + + + + Block B (red) + True + True + False + True + + + 1 + 2 + 1 + 2 + + + + + Block C (blue) + True + True + False + True + + + 2 + 3 + + + + + Block D (green) + True + True + False + True + + + 1 + 2 + 2 + 3 + + + + + 0 + + + + + True + + + False + 1 + + + + + True + 3 + 2 + 5 + 5 + + + True + <big>Connect to Common Reference</big> + True + center + + + 2 + + + + + Block A (yellow) + True + True + False + True + + + 1 + 2 + + + + + Block B (red) + True + True + False + True + + + 1 + 2 + 1 + 2 + + + + + Block C (blue) + True + True + False + True + + + 2 + 3 + + + + + Block D (green) + True + True + False + True + + + 1 + 2 + 2 + 3 + + + + + 2 + + + + + 1 + + + + + True + end + + + + + + + + + False + end + 0 + + + + + + + 7 + Amplifier Filters + center + dialog + False + + + True + vertical + 2 + + + True + vertical + + + True + <big>Notch filter</big> + +Type - Order - [Low Pass; High Pass] - Frequency + True + center + + + 0 + + + + + True + liststore1 + + + + 0 + + + + + 1 + + + + + True + + + False + 2 + + + + + True + <big>Band Pass filter</big> + +Type - Order - [Low Cut; High Cut] - Frequency + True + center + + + 3 + + + + + True + liststore2 + + + + 0 + + + + + 4 + + + + + 1 + + + + + True + end + + + + + + + + + False + end + 0 + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gusbamp/src/ovasCConfigurationGTecGUSBampLegacy.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gusbamp/src/ovasCConfigurationGTecGUSBampLegacy.cpp new file mode 100644 index 0000000..28b7d3e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gusbamp/src/ovasCConfigurationGTecGUSBampLegacy.cpp @@ -0,0 +1,282 @@ +#if defined TARGET_HAS_ThirdPartyGUSBampCAPI + +#include "ovasCConfigurationGTecGUSBampLegacy.h" + +#include +#include +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +static void CalibratePressedCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonCalibratePressedCB(); } + +static gboolean idle_calibrate_cb(void* data) +{ + static_cast(data)->idleCalibrateCB(); + return FALSE; +} + +static void button_common_gnd_ref_pressed_cb(GtkButton* /*button*/, void* data) +{ + static_cast(data)->buttonCommonGndRefPressedCB(); +} + +static void FiltersPressedCB(GtkButton* /*button*/, void* data) { static_cast(data)->buttonFiltersPressedCB(); } + +CConfigurationGTecGUSBampLegacy::CConfigurationGTecGUSBampLegacy(const char* gtkBuilderFilename, uint32_t& usbIdx, uint8_t& commonGndAndRefBitmap, + int& notchFilterIdx, int& bandPassFilterIdx, bool& triggerInput) + : CConfigurationBuilder(gtkBuilderFilename), m_usbIdx(usbIdx), m_commonGndAndRefBitmap(commonGndAndRefBitmap), m_notchFilterIdx(notchFilterIdx), + m_bandPassFilterIdx(bandPassFilterIdx), m_triggerInput(triggerInput) {} + +bool CConfigurationGTecGUSBampLegacy::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + GtkCheckButton* hardwareTagging = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_EventChannel")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(hardwareTagging), m_triggerInput); + + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + + char buffer[1024]; + int count = 0; + bool selected = false; + + // autodetection of the connected device + for (uint32_t i = 1; i < 11; ++i) + { + HANDLE handle = GT_OpenDevice(i); + if (handle) + { + GT_CloseDevice(&handle); + + sprintf(buffer, "USB port %i", i); + gtk_combo_box_append_text(comboBox, buffer); + if (m_usbIdx == i) + { + gtk_combo_box_set_active(comboBox, count); + selected = true; + } + count++; + } + } + + g_signal_connect(gtk_builder_get_object(m_builder, "button_calibrate"), "pressed", G_CALLBACK(CalibratePressedCB), this); + + if (!selected && count != 0) { gtk_combo_box_set_active(comboBox, 0); } + + g_signal_connect(gtk_builder_get_object(m_builder, "button-common-gnd-ref"), "pressed", G_CALLBACK(button_common_gnd_ref_pressed_cb), this); + g_signal_connect(gtk_builder_get_object(m_builder, "button-filters"), "pressed", G_CALLBACK(FiltersPressedCB), this); + + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(m_builder, "dialog-common-gnd-ref")); + gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_APPLY, GTK_RESPONSE_APPLY); + gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + + dialog = GTK_WIDGET(gtk_builder_get_object(m_builder, "dialog-filters")); + gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_APPLY, GTK_RESPONSE_APPLY); + gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + + + GtkToggleButton* checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-gnd-blockA")); + gtk_toggle_button_set_active(checkBox, (m_commonGndAndRefBitmap & 1)); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-gnd-blockB")); + gtk_toggle_button_set_active(checkBox, (m_commonGndAndRefBitmap & (1 << 1))); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-gnd-blockC")); + gtk_toggle_button_set_active(checkBox, (m_commonGndAndRefBitmap & (1 << 2))); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-gnd-blockD")); + gtk_toggle_button_set_active(checkBox, (m_commonGndAndRefBitmap & (1 << 3))); + + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-ref-blockA")); + gtk_toggle_button_set_active(checkBox, (m_commonGndAndRefBitmap & (1 << 4))); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-ref-blockB")); + gtk_toggle_button_set_active(checkBox, (m_commonGndAndRefBitmap & (1 << 5))); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-ref-blockC")); + gtk_toggle_button_set_active(checkBox, (m_commonGndAndRefBitmap & (1 << 6))); + checkBox = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-ref-blockD")); + gtk_toggle_button_set_active(checkBox, (m_commonGndAndRefBitmap & (1 << 7))); + + // To check for available filters in the amplifier, we must connect to it. + if (count != 0) + { + HANDLE handle = GT_OpenDevice(count); + + int nBandPassFilters, nNotchFilters; + if (!GT_GetNumberOfFilter(&nBandPassFilters)) { std::cout << "err GT_GetNumberOfFilter\n"; } + if (!GT_GetNumberOfNotch(&nNotchFilters)) { std::cout << "err GT_GetNumberOfNotch\n"; } + + FILT* bpFilterSpec = new FILT[nBandPassFilters]; + FILT* notchFilterSpec = new FILT[nNotchFilters]; + + if (!GT_GetFilterSpec(bpFilterSpec)) { std::cout << "err GT_GetFilterSpec\n"; } + if (!GT_GetNotchSpec(notchFilterSpec)) { std::cout << "err GT_GetNotchSpec\n"; } + + GtkComboBox* comboBoxBandPass = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox-band-pass")); + GtkTreeModel* bandPassListStore = gtk_combo_box_get_model(comboBoxBandPass); + std::stringstream desc; + desc << "no band pass filter."; + GtkTreeIter lIter; + gtk_list_store_append(GTK_LIST_STORE(bandPassListStore), &lIter); + gtk_list_store_set(GTK_LIST_STORE(bandPassListStore), &lIter, 0, desc.str().c_str(), -1); + desc.clear(); + desc.str(""); + for (int i = 0; i < nBandPassFilters; ++i) + { + if (bpFilterSpec[i].type == 1) { desc << "Butterworth - "; } + if (bpFilterSpec[i].type == 2) { desc << "Chebyshev - "; } + desc << bpFilterSpec[i].order << " - [" << bpFilterSpec[i].fu << "; " << bpFilterSpec[i].fo << "] - " << bpFilterSpec[i].fs; + GtkTreeIter iter; + gtk_list_store_append(GTK_LIST_STORE(bandPassListStore), &iter); + gtk_list_store_set(GTK_LIST_STORE(bandPassListStore), &iter, 0, desc.str().c_str(), -1); + desc.clear(); + desc.str(""); + } + gtk_combo_box_set_active(comboBoxBandPass, m_bandPassFilterIdx + 1); // +1 because -1 is for "no filter". + + GtkComboBox* comboBoxNotch = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox-notch")); + GtkTreeModel* notchListStore = gtk_combo_box_get_model(comboBoxNotch); + desc << "no notch filter."; + gtk_list_store_append(GTK_LIST_STORE(notchListStore), &lIter); + gtk_list_store_set(GTK_LIST_STORE(notchListStore), &lIter, 0, desc.str().c_str(), -1); + desc.clear(); + desc.str(""); + for (int i = 0; i < nNotchFilters; ++i) + { + if (notchFilterSpec[i].type == 1) { desc << "Butterworth - "; } + if (notchFilterSpec[i].type == 2) { desc << "Chebyshev - "; } + desc << notchFilterSpec[i].order << " - [" << notchFilterSpec[i].fu << "; " << notchFilterSpec[i].fo << "] - " << notchFilterSpec[i].fs; + GtkTreeIter iter; + gtk_list_store_append(GTK_LIST_STORE(notchListStore), &iter); + gtk_list_store_set(GTK_LIST_STORE(notchListStore), &iter, 0, desc.str().c_str(), -1); + desc.clear(); + desc.str(""); + } + gtk_combo_box_set_active(comboBoxNotch, m_notchFilterIdx + 1); + + delete bpFilterSpec; + delete notchFilterSpec; + GT_CloseDevice(&handle); + } + else + { + // deactivate the buttons + GtkWidget* button = GTK_WIDGET(gtk_builder_get_object(m_builder, "button-filters")); + gtk_widget_set_sensitive(button, false); + button = GTK_WIDGET(gtk_builder_get_object(m_builder, "button-common-gnd-ref")); + gtk_widget_set_sensitive(button, false); + } + return true; +} + +bool CConfigurationGTecGUSBampLegacy::postConfigure() +{ + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + + if (m_applyConfig) + { + int iUsbIdx = 0; + const char* usbIdx = gtk_combo_box_get_active_text(comboBox); + if (usbIdx) { if (sscanf(usbIdx, "USB port %i", &iUsbIdx) == 1) { m_usbIdx = uint32_t(iUsbIdx); } } + + GtkToggleButton* button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-gnd-blockA")); + m_commonGndAndRefBitmap = (gtk_toggle_button_get_active(button) ? 1 : 0); + button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-gnd-blockB")); + m_commonGndAndRefBitmap = m_commonGndAndRefBitmap + (gtk_toggle_button_get_active(button) ? (1 << 1) : 0); + button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-gnd-blockC")); + m_commonGndAndRefBitmap = m_commonGndAndRefBitmap + (gtk_toggle_button_get_active(button) ? (1 << 2) : 0); + button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-gnd-blockD")); + m_commonGndAndRefBitmap = m_commonGndAndRefBitmap + (gtk_toggle_button_get_active(button) ? (1 << 3) : 0); + button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-ref-blockA")); + m_commonGndAndRefBitmap = m_commonGndAndRefBitmap + (gtk_toggle_button_get_active(button) ? (1 << 4) : 0); + button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-ref-blockB")); + m_commonGndAndRefBitmap = m_commonGndAndRefBitmap + (gtk_toggle_button_get_active(button) ? (1 << 5) : 0); + button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-ref-blockC")); + m_commonGndAndRefBitmap = m_commonGndAndRefBitmap + (gtk_toggle_button_get_active(button) ? (1 << 6) : 0); + button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton-ref-blockD")); + m_commonGndAndRefBitmap = m_commonGndAndRefBitmap + (gtk_toggle_button_get_active(button) ? (1 << 7) : 0); + + GtkComboBox* notch = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox-notch")); + m_notchFilterIdx = gtk_combo_box_get_active(notch) - 1; + GtkComboBox* bandPass = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox-band-pass")); + m_bandPassFilterIdx = gtk_combo_box_get_active(bandPass) - 1; + + GtkCheckButton* hardwareTagging = GTK_CHECK_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_EventChannel")); + m_triggerInput = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(hardwareTagging)) ? true : false); + } + + if (!CConfigurationBuilder::postConfigure()) { return false; } + return true; +} + +void CConfigurationGTecGUSBampLegacy::buttonCalibratePressedCB() +{ + g_idle_add(idle_calibrate_cb, this); + + m_calibrateDialog = gtk_message_dialog_new(nullptr, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE, "Calibrating..."); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(m_calibrateDialog), "Please wait a few seconds..."); + gtk_dialog_run(GTK_DIALOG(m_calibrateDialog)); + gtk_widget_destroy(m_calibrateDialog); + + if (m_calibrationDone) + { + GtkWidget* dialog = gtk_message_dialog_new(nullptr, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Calibration finished !"); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + } + else + { + GtkWidget* dialog = gtk_message_dialog_new(nullptr, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Calibration failed !"); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + } +} + +void CConfigurationGTecGUSBampLegacy::idleCalibrateCB() +{ + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + + m_calibrationDone = false; + int iUsbIdx = 0; + const char* usbIdx = gtk_combo_box_get_active_text(comboBox); + + if (usbIdx) + { + if (sscanf(usbIdx, "USB port %i", &iUsbIdx) == 1) + { + HANDLE handle = GT_OpenDevice(iUsbIdx); + if (handle) + { + m_calibrationDone = true; + + SCALE calibration; + if (!GT_Calibrate(handle, &calibration)) { std::cout << "err GT_Calibrate\n", m_calibrationDone = false; } + if (!GT_SetScale(handle, &calibration)) + { + std::cout << "err GT_SetScale\n"; + m_calibrationDone = false; + } + GT_CloseDevice(&handle); + } + } + } + + gtk_dialog_response(GTK_DIALOG(m_calibrateDialog), 0); +} + +void CConfigurationGTecGUSBampLegacy::buttonCommonGndRefPressedCB() +{ + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(m_builder, "dialog-common-gnd-ref")); + gint resp = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_hide(dialog); +} + +void CConfigurationGTecGUSBampLegacy::buttonFiltersPressedCB() +{ + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(m_builder, "dialog-filters")); + gint resp = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_hide(dialog); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyGUSBampCAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gusbamp/src/ovasCConfigurationGTecGUSBampLegacy.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gusbamp/src/ovasCConfigurationGTecGUSBampLegacy.h new file mode 100644 index 0000000..b269ad2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gusbamp/src/ovasCConfigurationGTecGUSBampLegacy.h @@ -0,0 +1,41 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyGUSBampCAPI + +#include "../ovasCConfigurationBuilder.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { +class CConfigurationGTecGUSBampLegacy final : public CConfigurationBuilder +{ +public: + CConfigurationGTecGUSBampLegacy(const char* gtkBuilderFilename, uint32_t& usbIdx, uint8_t& commonGndAndRefBitmap, int& notchFilterIdx, + int& bandPassFilterIdx, bool& triggerInput); + + bool preConfigure() override; + bool postConfigure() override; + + void buttonCalibratePressedCB(); + void idleCalibrateCB(); + + void buttonCommonGndRefPressedCB(); + void buttonFiltersPressedCB(); + +protected: + uint32_t& m_usbIdx; + uint8_t& m_commonGndAndRefBitmap; + + int& m_notchFilterIdx; + int& m_bandPassFilterIdx; + bool& m_triggerInput; + +private: + GtkWidget* m_calibrateDialog = nullptr; + bool m_calibrationDone = false; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGUSBampCAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gusbamp/src/ovasCDriverGTecGUSBampLegacy.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gusbamp/src/ovasCDriverGTecGUSBampLegacy.cpp new file mode 100644 index 0000000..9148587 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gusbamp/src/ovasCDriverGTecGUSBampLegacy.cpp @@ -0,0 +1,351 @@ +#if defined TARGET_HAS_ThirdPartyGUSBampCAPI + +#include "ovasCDriverGTecGUSBampLegacy.h" +#include "ovasCConfigurationGTecGUSBampLegacy.h" + +#include + +#include +#include + +#include +#include +#include +#include +#include + +#define GTEC_NUM_CHANNELS 16 + +namespace OpenViBE { +namespace AcquisitionServer { + +/* + This driver always reads 17 channels: 16 + 1 + 16 are EEG channels + 1 is the last channel that provides triggers from the parallel port of the GTEC + Although 17 channels are read only "m_nAcquiredChannel" + 1 (if m_pTriggerInputEnabled==true) are displayed. + If m_nAcquiredChannel=6 and m_pTriggerInputEnabled=true then the output in OpenVibe is 7 channels. If m_pTriggerInputEnabled=false then 6. + "m_nAcquiredChannel" is a user modifiable variable with default value 16 +*/ + +CDriverGTecGUSBampLegacy::CDriverGTecGUSBampLegacy(IDriverContext& ctx) + : IDriver(ctx) + , m_settings("AcquisitionServer_Driver_GTecGUSBampLegacy", m_driverCtx.getConfigurationManager()) + , m_deviceIdx(uint32_t(-1)) + , m_notchFilterIdx(-1) + , m_bandPassFilterIdx(-1) + , m_nAcquiredChannel(GTEC_NUM_CHANNELS) +{ + m_header.setSamplingFrequency(512); + m_header.setChannelCount(GTEC_NUM_CHANNELS); + + m_settings.add("Header", &m_header); + m_settings.add("DeviceIndex", &m_deviceIdx); + m_settings.add("CommonGndAndRefBitmap", &m_commonGndAndRefBitmap); + m_settings.add("NotchFilterIndex", &m_notchFilterIdx); + m_settings.add("BandPassFilterIndex", &m_bandPassFilterIdx); + m_settings.add("TriggerInputEnabled", &m_bTriggerInputEnabled); + m_settings.load(); +} + +//___________________________________________________________________// +// // +bool CDriverGTecGUSBampLegacy::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + if (m_bTriggerInputEnabled) + { + m_header.setChannelCount(m_nAcquiredChannel + 1); + m_header.setChannelName(m_nAcquiredChannel, "CH_Event"); + } + else { m_header.setChannelCount(m_nAcquiredChannel); } + + // If device has not been selected, try to find a device + uint32_t i = 0; + m_actualDeviceIdx = m_deviceIdx; + while (i < 11 && m_actualDeviceIdx == uint32_t(-1)) + { + HANDLE handle = GT_OpenDevice(i); + if (handle) + { + GT_CloseDevice(&handle); + m_actualDeviceIdx = i; + } + i++; + } + + if (m_actualDeviceIdx == uint32_t(-1)) { return false; } + + m_pEvent = ::CreateEvent(nullptr, FALSE, FALSE, nullptr); + if (!m_pEvent) { return false; } + + //allocate buffers + m_bufferSize = (GTEC_NUM_CHANNELS + 1) * nSamplePerSentBlock * sizeof(float) + HEADER_SIZE;//+1 channel for trigger + m_Buffer = new uint8_t[m_bufferSize]; + + if (m_bTriggerInputEnabled) { m_sample = new float[(m_nAcquiredChannel + 1) * nSamplePerSentBlock]; } + else { m_sample = new float[m_nAcquiredChannel * nSamplePerSentBlock]; } + + if (!m_Buffer || !m_sample) + { + delete [] m_Buffer; + delete [] m_sample; + CloseHandle(m_pEvent); + return false; + } + memset(m_Buffer, 0, m_bufferSize); + m_sampleTranspose = reinterpret_cast(m_Buffer + HEADER_SIZE); + m_pOverlapped = new OVERLAPPED; + + if (!m_pOverlapped) + { + delete [] m_Buffer; + delete [] m_sample; + CloseHandle(m_pEvent); + return false; + } + +#define m_pOverlapped ((OVERLAPPED*)m_pOverlapped) + + memset(m_pOverlapped, 0, sizeof(OVERLAPPED)); + m_pOverlapped->hEvent = m_pEvent; + + m_Device = GT_OpenDevice(m_actualDeviceIdx); + if (!m_Device) + { + delete m_pOverlapped; + delete [] m_Buffer; + delete [] m_sample; + CloseHandle(m_pEvent); + return false; + } + + m_actualImpedanceIdx = 0; + m_nSamplePerSentBlock = nSamplePerSentBlock; + m_callback = &callback; + + return true; +} + +bool CDriverGTecGUSBampLegacy::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + UCHAR channels[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; + + // The amplifier is divided in 4 blocks, A to D + // each one has its own Ref/gnd connections, + // user can specify whether or not to connect the block to the common ground and reference of the amplifier. + GND gnd; + gnd.GND1 = (m_commonGndAndRefBitmap & 1); + gnd.GND2 = (m_commonGndAndRefBitmap & (1 << 1)); + gnd.GND3 = (m_commonGndAndRefBitmap & (1 << 2)); + gnd.GND4 = (m_commonGndAndRefBitmap & (1 << 3)); + + REF ref; + ref.ref1 = (m_commonGndAndRefBitmap & (1 << 4)); + ref.ref2 = (m_commonGndAndRefBitmap & (1 << 5)); + ref.ref3 = (m_commonGndAndRefBitmap & (1 << 6)); + ref.ref4 = (m_commonGndAndRefBitmap & (1 << 7)); + + if (!GT_SetMode(m_Device, M_NORMAL)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_SetMode\n"; } + if (!GT_SetBufferSize(m_Device, m_nSamplePerSentBlock)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_SetBufferSize\n"; + } + if (!GT_SetChannels(m_Device, channels, sizeof(channels) / sizeof(UCHAR))) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_SetChannels\n"; + } + if (!GT_SetSlave(m_Device, FALSE)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_SetSlave\n"; } + if (!GT_EnableTriggerLine(m_Device, TRUE)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_EnableTriggerLine - the extra input trigger channel is disabled\n"; + } + // GT_EnableSC + // GT_SetBipolar + + for (uint32_t i = 0; i < m_nAcquiredChannel; ++i) + { + if (!GT_SetBandPass(m_Device, i + 1, m_bandPassFilterIdx)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_SetBandPass for channel " << i << "\n"; + } + if (!GT_SetNotch(m_Device, i + 1, m_notchFilterIdx)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_SetNotch for channel " << i << "\n"; + } + } + + if (!GT_SetSampleRate(m_Device, m_header.getSamplingFrequency())) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_SetSampleRate\n"; + } + + if (!GT_SetReference(m_Device, ref)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_SetReference\n"; } + if (!GT_SetGround(m_Device, gnd)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unexpected error while calling GT_SetGround\n"; } + + m_lastStimulation = STIMULATION_0; + m_totalHardwareStimulations = 0; + m_totalDriverChunksLost = 0; + + GT_Start(m_Device); + + return true; +} + +bool CDriverGTecGUSBampLegacy::loop() +{ + CStimulationSet stimSet; + + if (!m_driverCtx.isConnected()) { return false; } + if (m_driverCtx.isStarted()) + { + if (GT_GetData(m_Device, m_Buffer, m_bufferSize, m_pOverlapped)) + { + if (WaitForSingleObject(m_pOverlapped->hEvent, 1000) == WAIT_OBJECT_0) + { + DWORD nByte = 0; + + GetOverlappedResult(m_Device, m_pOverlapped, &nByte, FALSE); + + if (nByte == m_bufferSize) + { + for (uint32_t i = 0; i < m_nAcquiredChannel; ++i) + { + for (uint32_t j = 0; j < m_nSamplePerSentBlock; ++j) + { + m_sample[i * m_nSamplePerSentBlock + j] = m_sampleTranspose[j * (GTEC_NUM_CHANNELS + 1) + i]; + } + } + + if (m_bTriggerInputEnabled) + { + for (uint32_t iSample = 0; iSample < m_nSamplePerSentBlock; ++iSample) + { + const uint32_t stimCode = uint32_t( + m_sampleTranspose[iSample * (GTEC_NUM_CHANNELS + 1) + GTEC_NUM_CHANNELS]); + m_sample[m_nAcquiredChannel * m_nSamplePerSentBlock + iSample] = float(stimCode); + + //this means that the user sends 0 after each stimulatuion and in the beginning + if ((stimCode != STIMULATION_0) && (stimCode != m_lastStimulation) + ) + { + uint64_t identifier; + switch (stimCode) + { + case STIMULATION_64: identifier = OVTK_StimulationId_Label_01; + break; + case STIMULATION_128: identifier = OVTK_StimulationId_Label_02; + break; + case STIMULATION_192: identifier = OVTK_StimulationId_Label_03; + break; + default: identifier = OVTK_StimulationId_Label_07; + } + + const uint64_t time = CTime(m_header.getSamplingFrequency(), uint64_t(iSample)).time(); + stimSet.appendStimulation(identifier, time, 0); + m_totalHardwareStimulations++; + } + + m_lastStimulation = stimCode; + } + } + + m_callback->setSamples(m_sample); + m_callback->setStimulationSet(stimSet); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + else + { + m_totalDriverChunksLost++; + //m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "nByte and m_bufferSize differs : " << nByte << "/" << m_bufferSize << "(header size is " << HEADER_SIZE << ")\n"; + /*m_driverCtx.getLogManager() << Kernel::LogLevel_Warning + << "Returned data is different than expected. Total chunks lost: " << m_totalDriverChunksLost + << ", Total samples lost: " << m_nSamplePerSentBlock * m_totalDriverChunksLost + << "\n";*/ + } + } + else + { + // TIMEOUT + //m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "timeout 1\n"; + } + } + else + { + //m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "tError on GT_GetData.\n"; + } + } + else + { + if (m_driverCtx.isImpedanceCheckRequested()) + { + double impedance = 0; + GT_GetImpedance(m_Device, m_actualImpedanceIdx + 1, &impedance); + if (impedance < 0) { impedance *= -1; } + + m_driverCtx.updateImpedance(m_actualImpedanceIdx, impedance); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Channel " << m_actualImpedanceIdx << " - " + << m_header.getChannelName(m_actualImpedanceIdx) << " : " << impedance << "\n"; + + m_actualImpedanceIdx++; + m_actualImpedanceIdx %= m_header.getChannelCount(); + + m_driverCtx.updateImpedance(m_actualImpedanceIdx, -1); + } + else { System::Time::sleep(20); } + } + + return true; +} + +bool CDriverGTecGUSBampLegacy::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + //stop device + GT_Stop(m_Device); + GT_ResetTransfer(m_Device); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Total number of hardware stimulations acquired: " << m_totalHardwareStimulations << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Total chunks lost: " << m_totalDriverChunksLost << "\n"; + + return true; +} + +bool CDriverGTecGUSBampLegacy::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + GT_CloseDevice(&m_Device); + CloseHandle(m_pEvent); + delete [] m_Buffer; + delete [] m_sample; + delete m_pOverlapped; + m_Device = nullptr; + m_pEvent = nullptr; + m_Buffer = nullptr; + m_sample = nullptr; + m_callback = nullptr; + + return true; +} + +bool CDriverGTecGUSBampLegacy::configure() +{ + CConfigurationGTecGUSBampLegacy config(Directories::getDataDir() + "/applications/acquisition-server/interface-GTec-GUSBampLegacy.ui", + m_deviceIdx, m_commonGndAndRefBitmap, m_notchFilterIdx, m_bandPassFilterIdx, + m_bTriggerInputEnabled); + + if (!config.configure(m_header)) { return false; } + this->m_nAcquiredChannel = m_header.getChannelCount(); + m_settings.save(); + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyGUSBampCAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gusbamp/src/ovasCDriverGTecGUSBampLegacy.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gusbamp/src/ovasCDriverGTecGUSBampLegacy.h new file mode 100644 index 0000000..ccbf67e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/gtec-gusbamp/src/ovasCDriverGTecGUSBampLegacy.h @@ -0,0 +1,88 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyGUSBampCAPI + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverGTecGUSBampLegacy + * \author Yann Renard (Inria) + * \date unknown + * \brief GTEC driver + * + */ +class CDriverGTecGUSBampLegacy final : public IDriver +{ +public: + + explicit CDriverGTecGUSBampLegacy(IDriverContext& ctx); + void release() { delete this; } + const char* getName() override { return "g.tec gUSBamp Legacy"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsDeprecated; } + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + uint32_t m_deviceIdx = 0; + uint32_t m_actualDeviceIdx = 0; + uint32_t m_bufferSize = 0; + uint8_t* m_Buffer = nullptr; + float* m_sampleTranspose = nullptr; + float* m_sample = nullptr; + void* m_Device = nullptr; + void* m_pEvent = nullptr; + void* m_pOverlapped = nullptr; + + uint32_t m_actualImpedanceIdx = 0; + + uint8_t m_commonGndAndRefBitmap = 0; + + int m_notchFilterIdx = 0; + int m_bandPassFilterIdx = 0; + + bool m_bTriggerInputEnabled = false; + uint32_t m_lastStimulation = 0; + + // EVENT CHANNEL : contribution Anton Andreev (Gipsa-lab) - 0.14.0 + typedef enum + { + STIMULATION_0 = 0, + STIMULATION_64 = 64, + STIMULATION_128 = 128, + STIMULATION_192 = 192 + } gtec_triggers_t; + + uint32_t m_totalHardwareStimulations = 0; //since start button clicked + uint32_t m_totalDriverChunksLost = 0; //since start button clicked + uint32_t m_nAcquiredChannel = 0; //number of channels 1..16 specified bu user +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGUSBampCAPI diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/share/interface-MBTSmarting.ui b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/share/interface-MBTSmarting.ui new file mode 100755 index 0000000..f997b83 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/share/interface-MBTSmarting.ui @@ -0,0 +1,403 @@ + + + + + + 24 + 27 + 24 + 3 + 10 + + + 100 + 18 + 1 + 10 + + + 100 + 1 + 10 + + + 255 + 0 + 0 + 1 + 10 + + + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 500 + + + 250 + + + + + False + 5 + Device configuration + center + dialog + center + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + mBrainTrain configuration (24 channels) + True + center + + + True + True + 1 + + + + + True + False + + + False + True + 2 + + + + + True + False + 8 + 8 + + + True + False + 8 + + + True + False + 6 + 2 + True + + + True + False + False + False + False + True + True + adjustment1 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + False + Number of channels + True + center + + + 3 + 4 + + + + + True + False + Port number : + right + True + + + 4 + 5 + + + + + True + True + False + False + True + True + adjustment2 + True + True + + + 1 + 2 + 4 + 5 + + + + + True + False + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + False + False + True + True + adjustment2 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + False + False + True + True + adjustment3 + True + True + + + 1 + 2 + + + + + True + False + Gender : + right + True + + + 2 + 3 + + + + + True + False + Age : + right + True + + + 1 + 2 + + + + + True + False + Identifier : + right + True + + + + + True + False + model2 + + + + 0 + + + + + 1 + 2 + 5 + 6 + + + + + True + False + Sampling frequency : + right + True + + + 5 + 6 + + + + + True + True + 0 + + + + + True + True + 0 + + + + + Change channel names + True + False + False + + + False + True + 1 + + + + + True + True + 3 + + + + + True + False + + + False + True + 4 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCConfigurationMBTSmarting.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCConfigurationMBTSmarting.cpp new file mode 100755 index 0000000..601578c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCConfigurationMBTSmarting.cpp @@ -0,0 +1,77 @@ +#include "ovasCConfigurationMBTSmarting.h" + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +/*_________________________________________________ + +Insert callback to specific widget here +Example with a button that launch a calibration of the device: + +//Callback connected to a dedicated gtk button: +static void button_calibrate_pressed_cb(GtkButton* button, void* data) +{ + CConfigurationMBTSmarting* config=static_cast(data); + config->buttonCalibratePressedCB(); +} + +//Callback actually called: +void CConfigurationGTecGUSBamp::buttonCalibratePressedCB() +{ + // Connect to the hardware, ask for calibration, verify the return code, etc. +} +_________________________________________________*/ + +// If you added more reference attribute, initialize them here +CConfigurationMBTSmarting::CConfigurationMBTSmarting(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& rConnectionId) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx), m_connectionID(rConnectionId) +{ + //m_listStore = gtk_list_store_new(1, G_TYPE_STRING); +} + +CConfigurationMBTSmarting::~CConfigurationMBTSmarting() +{ + //g_object_unref(m_listStore); +} + +bool CConfigurationMBTSmarting::preConfigure() +{ + if (! CConfigurationBuilder::preConfigure()) { return false; } + + // Apply previous port number + GtkSpinButton* buttonPortNumber = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_port_number")); + gtk_spin_button_set_value(buttonPortNumber, m_connectionID); + + // Connect here all callbacks + // Example: + // g_signal_connect(gtk_builder_get_object(m_builder, "button_calibrate"), "pressed", G_CALLBACK(button_calibrate_pressed_cb), this); + + // Insert here the pre-configure code. + // For example, you may want to check if a device is currently connected + // and if more than one are connected. Then you can list in a dedicated combo-box + // the device currently connected so the user can choose which one he wants to acquire from. + + return true; +} + +bool CConfigurationMBTSmarting::postConfigure() +{ + if (m_applyConfig) + { + // If the user pressed the "apply" button, you need to save the changes made in the configuration. + // For example, you can save the connection ID of the selected device: + // m_connectionID = + GtkSpinButton* buttonPortNumber = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_port_number")); + gtk_spin_button_update(buttonPortNumber); + m_connectionID = gtk_spin_button_get_value_as_int(buttonPortNumber); + } + + // normal header is filled (Subject ID, Age, Gender, channels, sampling frequency), ressources are realesed + return CConfigurationBuilder::postConfigure(); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCConfigurationMBTSmarting.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCConfigurationMBTSmarting.h new file mode 100755 index 0000000..b85dcad --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCConfigurationMBTSmarting.h @@ -0,0 +1,46 @@ +#pragma once + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationMBTSmarting + * \author mBrainTrain dev team (mBrainTrain) + * \date Tue Oct 14 16:09:43 2014 + * \brief The CConfigurationMBTSmarting handles the configuration dialog specific to the MBTSmarting device. + * + * TODO: details + * + * \sa CDriverMBTSmarting + */ +class CConfigurationMBTSmarting final : public CConfigurationBuilder +{ +public: + + // you may have to add to your constructor some reference parameters + // for example, a connection ID: + CConfigurationMBTSmarting(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& rConnectionId); + //CConfigurationMBTSmarting(IDriverContext& ctx, const char* gtkBuilderFilename); + + bool preConfigure() override; + bool postConfigure() override; + ~CConfigurationMBTSmarting() override; + +protected: + + IDriverContext& m_driverCtx; + +private: + + /* + * Insert here all specific attributes, such as a connection ID. + * use references to directly modify the corresponding attribute of the driver + * Example: + */ + uint32_t& m_connectionID; + //::GtkListStore* m_listStore; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCDriverMBTSmarting.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCDriverMBTSmarting.cpp new file mode 100755 index 0000000..fcfd1a3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCDriverMBTSmarting.cpp @@ -0,0 +1,240 @@ +#include "ovasCDriverMBTSmarting.h" +#include "ovasCConfigurationMBTSmarting.h" + +#include + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +//___________________________________________________________________// +// // + +CDriverMBTSmarting::CDriverMBTSmarting(IDriverContext& ctx) + : IDriver(ctx) + , m_settings("AcquisitionServer_Driver_MBTSmarting", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(500); + m_header.setChannelCount(27); + + // The following class allows saving and loading driver settings from the acquisition server .conf file + m_settings.add("Header", &m_header); + // To save your custom driver settings, register each variable to the SettingsHelper + m_settings.add("ConnectionID", &m_connectionID); + m_settings.load(); +} + +//___________________________________________________________________// +// // + +bool CDriverMBTSmarting::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + // Builds up a buffer to store + // acquired samples. This buffer + // will be sent to the acquisition + // server later... + m_sample = new float[m_header.getChannelCount()]; + if (!m_sample) + { + delete [] m_sample; + m_sample = nullptr; + return false; + } + + // ... + // initialize hardware and get + // available header information + // from it + // Using for example the connection ID provided by the configuration (m_connectionID) + // ... + + m_pSmartingAmp.reset(new SmartingAmp); + + std::stringstream port_ss; +#ifdef TARGET_OS_Windows + port_ss << "COM" << m_connectionID; +#elif defined TARGET_OS_Linux + port_ss << "/dev/rfcomm" << m_connectionID; +#endif + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Attempting to Connect to Device at : " << port_ss.str() << "\n"; + + std::string port(port_ss.str()); + const bool connected = m_pSmartingAmp->connect(port); + if (connected) + { + // set sampling frequency + switch (m_header.getSamplingFrequency()) + { + case 250: m_pSmartingAmp->send_command(FREQUENCY_250); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Setting the sampling frequency at " << 250 << "\n"; + break; + case 500: m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Setting the sampling frequency at " << 500 << "\n"; + m_pSmartingAmp->send_command(FREQUENCY_500); + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Only sampling frequencies 250 and 500 are supported\n"; + return false; + } + + // Declare channel units + for (uint32_t c = 0; c < 24; ++c) + { + m_header.setChannelUnits(c, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); // signal channels + } + m_header.setChannelUnits(24, OVTK_UNIT_Degree_Per_Second, OVTK_FACTOR_Base); // gyroscope outputs + m_header.setChannelUnits(25, OVTK_UNIT_Degree_Per_Second, OVTK_FACTOR_Base); + m_header.setChannelUnits(26, OVTK_UNIT_Degree_Per_Second, OVTK_FACTOR_Base); + + m_header.setChannelName(24, "Gyro 1"); + m_header.setChannelName(25, "Gyro 2"); + m_header.setChannelName(26, "Gyro 3"); + + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; + } + + return false; +} + +bool CDriverMBTSmarting::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // ... + // request hardware to start + // sending data + // ... + + m_pSmartingAmp->send_command(ON); + m_byteArray.clear(); + + sample_number = 1; + latency = 1; + + return true; +} + +bool CDriverMBTSmarting::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted()) { return true; } + + const CStimulationSet stimSet; + + // ... + // receive samples from hardware + // put them the correct way in the sample array + // whether the buffer is full, send it to the acquisition server + //... + + unsigned char* receiveBuffer = new unsigned char[MAX_PACKAGE_SIZE]; + + const int readed = m_pSmartingAmp->read(receiveBuffer, MAX_PACKAGE_SIZE); + + for (int i = 0; i < readed; ++i) + { + if (!m_byteArray.empty()) + { + m_byteArray.push_back(receiveBuffer[i]); + if (m_byteArray.size() == 83) + { + if (m_byteArray[82] == '<') + { + if (sample_number % 5000 == 0) + { + sample_number = 1; + + if (m_driverCtx.getDriftSampleCount() < 2) + { + m_sample = m_pSmartingAmp->convert_data(m_byteArray); + m_callback->setSamples(m_sample, 1); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + } + else + { + sample_number++; + + m_sample = m_pSmartingAmp->convert_data(m_byteArray); + m_callback->setSamples(m_sample, 1); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + } + + m_byteArray.clear(); + } + } + + if (m_byteArray.empty() && receiveBuffer[i] == '>') { m_byteArray.push_back(receiveBuffer[i]); } + } + + if (latency == 300) + { + latency = 0; + m_driverCtx.setInnerLatencySampleCount(-m_driverCtx.getDriftSampleCount()); + } + else { if (latency != 0) { latency++; } } + + // ... + // receive events from hardware + // and put them the correct way in a CStimulationSet object + //... + m_callback->setStimulationSet(stimSet); + + return true; +} + +bool CDriverMBTSmarting::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + // ... + // request the hardware to stop + // sending data + // ... + m_driverCtx.setInnerLatencySampleCount(0); + m_pSmartingAmp->off(); + + return true; +} + +bool CDriverMBTSmarting::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // ... + // uninitialize hardware here + // ... + + m_pSmartingAmp->disconnect(); + + delete [] m_sample; + m_sample = nullptr; + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverMBTSmarting::configure() +{ + // Change this line if you need to specify some references to your driver attribute that need configuration, e.g. the connection ID. + CConfigurationMBTSmarting config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-MBTSmarting.ui", + m_connectionID); + + if (!config.configure(m_header)) { return false; } + m_settings.save(); + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCDriverMBTSmarting.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCDriverMBTSmarting.h new file mode 100755 index 0000000..4c6dea0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCDriverMBTSmarting.h @@ -0,0 +1,73 @@ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include "ovasCSmartingAmp.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverMBTSmarting + * \author mBrainTrain dev team (mBrainTrain) + * \date Tue Oct 14 16:09:43 2014 + * \brief The CDriverMBTSmarting allows the acquisition server to acquire data from a MBTSmarting device. + * + * TODO: details + * + * \sa CConfigurationMBTSmarting + */ +class CDriverMBTSmarting final : public IDriver +{ +public: + + explicit CDriverMBTSmarting(IDriverContext& ctx); + ~CDriverMBTSmarting() override {} + const char* getName() override { return "mBrainTrain Smarting"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } // change to false if your device is not configurable + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +#ifdef TARGET_OS_Windows + bool isFlagSet(const EDriverFlag /*flag*/) const override { return false; } +#elif defined TARGET_OS_Linux + bool isFlagSet(const EDriverFlag /*flag*/) const override { return true; } +#endif + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + + // Replace this generic Header with any specific header you might have written + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + +private: + + /* + * Insert here all specific attributes, such as USB port number or device ID. + * Example : + */ + uint32_t m_connectionID = 1; + std::shared_ptr m_pSmartingAmp; + std::vector m_byteArray; + int sample_number = 0; + int latency = 0; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCSmartingAmp.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCSmartingAmp.cpp new file mode 100644 index 0000000..c43f028 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCSmartingAmp.cpp @@ -0,0 +1,431 @@ +#include "ovasCSmartingAmp.h" + +#include +#include + +#include +#include +#include + +#define CHANNEL_SCALAR_FACTOR 2.235174445530706e-2 +#define GYRO_SCALAR_FACTOR 0.00875 + +SmartingAmp::SmartingAmp() +{ + m_port.reset(new boost::asio::serial_port(m_io)); + m_timer.reset(new boost::asio::deadline_timer(m_io)); +} + +void SmartingAmp::disconnect() +{ + if (!m_port->is_open()) { return; } + m_port->close(); +} + +void SmartingAmp::write(const unsigned char* data, const size_t& size) const +{ + boost::system::error_code code; + m_port->write_some(boost::asio::buffer(data, size), code); +} + +int SmartingAmp::read(unsigned char* data, const size_t size) const +{ + boost::system::error_code code; + return m_port->read_some(boost::asio::buffer(data, size), code); +} + +void SmartingAmp::acquire() +{ + if (m_port.get() == nullptr || !m_port->is_open()) { return; } + + m_port->async_read_some(boost::asio::buffer(m_receiveBuffer, MAX_PACKAGE_SIZE), + boost::bind(&SmartingAmp::onReceive, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); +} + +void SmartingAmp::onReceive(const boost::system::error_code& ec, const size_t bytesTransferred) +{ + std::lock_guard m(m_on_receive_lock); + if (m_port.get() == nullptr || !m_port->is_open()) { return; } + + if (ec) + { + //acquire(); + return; + } + + for (uint32_t i = 0; i < bytesTransferred; ++i) + { + if (!m_byteArray.empty()) + { + m_byteArray.push_back(m_receiveBuffer[i]); + if (m_byteArray.size() == 83) + { + if (m_byteArray[82] == '<') + { + float* sample = convert_data(m_byteArray); + m_byteArray.clear(); + m_receivedSamples++; + + m_samples_lock.lock(); + m_samplesBuffer.push(sample); + m_samples_lock.unlock(); + } + else + { + m_failedSamples++; + m_byteArray.clear(); + } + } + } + + if (m_byteArray.empty() && m_receiveBuffer[i] == '>') { m_byteArray.push_back(m_receiveBuffer[i]); } + } + acquire(); +} + +std::pair SmartingAmp::make_command(const Command command) +{ + unsigned char* cmd; + std::pair out; + switch (command) + { + case ON: cmd = new unsigned char[4]; + cmd[0] = '>'; + cmd[1] = 'O'; + cmd[2] = 'N'; + cmd[3] = '<'; + out = std::make_pair(cmd, 4); + break; + case OFF: cmd = new unsigned char[5]; + cmd[0] = '>'; + cmd[1] = 'O'; + cmd[2] = 'F'; + cmd[3] = 'F'; + cmd[4] = '<'; + out = std::make_pair(cmd, 5); + break; + case TEST: cmd = new unsigned char[6]; + cmd[0] = '>'; + cmd[1] = 'T'; + cmd[2] = 'E'; + cmd[3] = 'S'; + cmd[4] = 'T'; + cmd[5] = '<'; + out = std::make_pair(cmd, 6); + break; + case NORMAL: cmd = new unsigned char[8]; + cmd[0] = '>'; + cmd[1] = 'N'; + cmd[2] = 'O'; + cmd[3] = 'R'; + cmd[4] = 'M'; + cmd[5] = 'A'; + cmd[6] = 'L'; + cmd[7] = '<'; + out = std::make_pair(cmd, 8); + break; + case SELECT_CHANNELS: cmd = new unsigned char[8]; + cmd[0] = '>'; + cmd[1] = 'S'; + cmd[2] = 'C'; + cmd[3] = ';'; + cmd[4] = 0xFF; + cmd[5] = 0xFF; + cmd[6] = 0xFF; + cmd[7] = '<'; + out = std::make_pair(cmd, 8); + break; + case REFON: cmd = new unsigned char[7]; + cmd[0] = '>'; + cmd[1] = 'R'; + cmd[2] = 'E'; + cmd[3] = 'F'; + cmd[4] = 'O'; + cmd[5] = 'N'; + cmd[6] = '<'; + out = std::make_pair(cmd, 7); + break; + case REFOFF: cmd = new unsigned char[8]; + cmd[0] = '>'; + cmd[1] = 'R'; + cmd[2] = 'E'; + cmd[3] = 'F'; + cmd[4] = 'O'; + cmd[5] = 'F'; + cmd[6] = 'F'; + cmd[7] = '<'; + out = std::make_pair(cmd, 8); + break; + case IMPON: cmd = new unsigned char[7]; + cmd[0] = '>'; + cmd[1] = 'I'; + cmd[2] = 'M'; + cmd[3] = 'P'; + cmd[4] = 'O'; + cmd[5] = 'N'; + cmd[6] = '<'; + out = std::make_pair(cmd, 7); + break; + case IMPOFF: cmd = new unsigned char[8]; + cmd[0] = '>'; + cmd[1] = 'I'; + cmd[2] = 'M'; + cmd[3] = 'P'; + cmd[4] = 'O'; + cmd[5] = 'F'; + cmd[6] = 'F'; + cmd[7] = '<'; + out = std::make_pair(cmd, 8); + break; + case FREQUENCY_250: cmd = new unsigned char[5]; + cmd[0] = '>'; + cmd[1] = '2'; + cmd[2] = '5'; + cmd[3] = '0'; + cmd[4] = '<'; + out = std::make_pair(cmd, 5); + break; + case FREQUENCY_500: cmd = new unsigned char[5]; + cmd[0] = '>'; + cmd[1] = '5'; + cmd[2] = '0'; + cmd[3] = '0'; + cmd[4] = '<'; + out = std::make_pair(cmd, 5); + break; + case NOISE: cmd = new unsigned char[7]; + cmd[0] = '>'; + cmd[1] = 'N'; + cmd[2] = 'O'; + cmd[3] = 'I'; + cmd[4] = 'S'; + cmd[5] = 'E'; + cmd[6] = '<'; + out = std::make_pair(cmd, 7); + break; + } + + return out; +} + +CommandStatus SmartingAmp::send_command(const Command cmd) +{ + const std::pair newCmd = make_command(cmd); + write(newCmd.first, newCmd.second); + + unsigned char* response = new unsigned char[OK_RESPONSE_SIZE]; + const int readed = read(response, OK_RESPONSE_SIZE); + return command_status(response, readed); +} + +bool SmartingAmp::connect(std::string& portName) +{ + boost::system::error_code errorCode; + m_port->open(portName, errorCode); + if (errorCode) + { + std::cout << "error : port->open() failed...com_port_name = " << portName << ", e=" << errorCode.message() << std::endl; + disconnect(); + // m_port->open(portName, error_code); + return false; + } + try + { + m_port->set_option(boost::asio::serial_port_base::baud_rate(921600)); + m_port->set_option(boost::asio::serial_port_base::character_size(8)); + m_port->set_option(boost::asio::serial_port_base::stop_bits(boost::asio::serial_port_base::stop_bits::one)); + m_port->set_option(boost::asio::serial_port_base::parity(boost::asio::serial_port_base::parity::none)); + m_port->set_option(boost::asio::serial_port_base::flow_control(boost::asio::serial_port_base::flow_control::hardware)); + } + catch (const std::exception&) + { + disconnect(); + return false; + } + + // NOTE: After connection is established wait 3s and then you can start using the amp + System::Time::sleep(3000); + + // NOTE: Leaving MAX_PORT_SIZE bytes to read for the first time because we are not sure + // how many bytes are in serial port buffer + read_with_timeout(MAX_PORT_SIZE, 3000); + if (m_bytes_readed > 0) { if (m_commandReceiveBuffer[m_bytes_readed - 1] == 'g') { if (send_command(SELECT_CHANNELS) == Success) { return true; } } } + disconnect(); + return false; +} + +CommandStatus SmartingAmp::command_status(const unsigned char* response, const int readed) +{ + if (readed < 4) { return Failure; } + + char* msg = new char[5]; + msg[0] = response[readed - 4]; + msg[1] = response[readed - 3]; + msg[2] = response[readed - 2]; + msg[3] = response[readed - 1]; + msg[4] = '\0'; + + if (!strcmp(msg, ">OK<")) { return Success; } + + // TODO: Implement timeout expired method + return Failure; +} + +bool SmartingAmp::start() +{ + send_command(ON); + + m_samplesBuffer = std::queue(); + + m_failedSamples = 0; + m_receivedSamples = 0; + + // start reading + + acquire(); + + auto f = [this]() { this->m_io.run(); }; + // auto f = boost::bind(&boost::asio::io_service::run, &m_io); + + acquire_t.reset(new std::thread(f)); + + return true; +} + +float* SmartingAmp::get_sample() +{ + if (!m_samplesBuffer.empty()) + { + m_samples_lock.lock(); + float* sample = m_samplesBuffer.front(); + m_samplesBuffer.pop(); + m_samples_lock.unlock(); + return sample; + } + return nullptr; +} + +bool SmartingAmp::stop() +{ + // NOTE: Stop would rarely return SUCCESS + off(); + + try + { + // cancel all async operations + m_io.stop(); + m_io.reset(); + + // TODO: Implement proper stopping of the acquiring thread + } + catch (std::exception&) + { + // to do + } + + // NOTE: Currently, I am very unhappy with flushing + // It slows down everything and after 6 play/stops open vibe is blocked + // flush(); + + //std::cout << "Failed " << m_failedSamples << std::endl; + //std::cout << "Received " << m_receivedSamples << std::endl; + + return false; +} + +float* SmartingAmp::convert_data(std::vector in) +{ + float* converted = new float[30]; + + // channel data + for (int i = 0; i < 24; ++i) { converted[i] = get_channel_value(in[3 * i + 1], in[3 * i + 2], in[3 * i + 3]); } + + // gyroX + converted[24] = get_gyro_value(in[74], in[75]); + // gyroY + converted[25] = get_gyro_value(in[76], in[77]); + // gyroZ + converted[26] = get_gyro_value(in[78], in[79]); + + // counter + converted[27] = float(in[73]); + + // battery + converted[28] = float(in[80] & 0x7F);//add baterry data, removing highest bit, because it's used for impedance measurement + converted[29] = in[81]; //add checksum data + + return converted; +} + +float SmartingAmp::get_channel_value(const unsigned char first, const unsigned char second, const unsigned char third) +{ + const int firstByte = int(first) & 0xff; + const int secondByte = int(second) & 0xff; + const int thirdByte = int(third) & 0xff; + + int channelValue = (firstByte << 16) + (secondByte << 8) + thirdByte; + + // Checking if value is positive or negative + if (channelValue > 0x007FFFFF) { channelValue = channelValue - 0x01000000; } + + return float(channelValue) * float(CHANNEL_SCALAR_FACTOR); +} + +float SmartingAmp::get_gyro_value(const unsigned char first, const unsigned char second) +{ + const int firstByte = int(first) & 0xff; + const int secondByte = int(second) & 0xff; + + int out = (firstByte << 8) + secondByte; + + if (out > 0x00007FFF) { out = out - 0x00008000; } + else { out = out + 0x00008000; } + + return float(out) * float(GYRO_SCALAR_FACTOR); +} + +void SmartingAmp::read_with_timeout(const int size, const size_t timeout) +{ + // Asynchronously read. + if (m_port.get() == nullptr || !m_port->is_open()) { return; } + + m_bytes_readed = 0; + + m_port->async_read_some(boost::asio::buffer(m_commandReceiveBuffer, size), + boost::bind(&SmartingAmp::read_complete, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); + + + // Setup a deadline time to implement our timeout. + m_timer->expires_from_now(boost::posix_time::milliseconds(timeout)); + m_timer->async_wait(boost::bind(&SmartingAmp::timeout_expired, this, boost::asio::placeholders::error)); + + // This will block until a character is read + // or until it is cancelled. + m_io.run(); + + m_io.stop(); + // After a timeout & cancel it seems we need + // to do a reset for subsequent reads to work. + m_port->get_io_service().reset(); +} + +// Called when the timer's deadline expires. +void SmartingAmp::timeout_expired(const boost::system::error_code& /*error*/) { m_io.stop(); } + +// Called when an async read completes or has been cancelled +void SmartingAmp::read_complete(const boost::system::error_code& error, const size_t bytesTransferred) +{ + // IMPORTANT NOTE: when timer expires, and port is canceled, read complete is + // called for the last time. Its extremly important to cancel the timer even though + // it has already expired. So, here it goes + if (error) { return; } + + m_bytes_readed = bytesTransferred; + m_timer->cancel(); +} + +void SmartingAmp::off() +{ + const std::pair transformedCmd = make_command(OFF); + write(transformedCmd.first, transformedCmd.second); +} diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCSmartingAmp.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCSmartingAmp.h new file mode 100644 index 0000000..166c106 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mbt-smarting/src/ovasCSmartingAmp.h @@ -0,0 +1,88 @@ +#ifndef SMARTINGAMP_H +#define SMARTINGAMP_H + +#ifndef _WIN32_WINNT // Minimum platform is Windows 7 +#define _WIN32_WINNT 0x0601 +#endif + +#include +#include +#include + +#include +#include +#include +#include + +#include // shared_ptr + +#include +#include + +#define OK_RESPONSE_SIZE 4 +#define MAX_PACKAGE_SIZE 4096 +#define MAX_PORT_SIZE 1000000 +#define BOOST_ASIO_ENABLE_HANDLER_TRACKING + +enum Command { SELECT_CHANNELS, ON, OFF, TEST, NORMAL, REFON, REFOFF, IMPON, IMPOFF, FREQUENCY_250, FREQUENCY_500, NOISE }; + +enum CommandStatus { Success, Failure, TimeoutExpired }; + +/** + * \class SmartingAmp + * \author mBrainTrain dev team (mBrainTrain) + * \brief Communicates with a MBTSmarting device. + */ + +class SmartingAmp : boost::noncopyable +{ +public: + + SmartingAmp(); + ~SmartingAmp() {} + + bool connect(std::string& portName); + void disconnect(); + bool start(); + bool stop(); + + /* NOTE: off doesn't wait for response */ + void off(); + CommandStatus send_command(Command cmd); + CommandStatus command_status(const unsigned char* response, int readed); + void write(const unsigned char* data, const size_t& size) const; + int read(unsigned char* data, size_t size) const; + void acquire(); + void onReceive(const boost::system::error_code& ec, size_t bytesTransferred); + float* get_sample(); + float* convert_data(std::vector in); + void read_with_timeout(int size, size_t timeout); + void read_complete(const boost::system::error_code& error, size_t bytesTransferred); + void timeout_expired(const boost::system::error_code& error); + float get_channel_value(unsigned char first, unsigned char second, unsigned char third); + float get_gyro_value(unsigned char first, unsigned char second); + +private: + + std::pair make_command(Command command); + boost::asio::io_service m_io; + std::shared_ptr m_port; + unsigned char m_receiveBuffer[MAX_PACKAGE_SIZE]; + unsigned char m_commandReceiveBuffer[MAX_PORT_SIZE]; + std::queue m_samplesBuffer; + std::vector m_byteArray; + std::mutex m_on_receive_lock; + std::mutex m_read_complete_lock; + std::mutex m_samples_lock; + std::mutex m_bytes_readed_lock; + std::mutex m_timer_expired_lock; + int m_failedSamples = 0; + int m_receivedSamples = 0; + std::shared_ptr acquire_t; + std::shared_ptr m_timer; + + // read with timeout + int m_bytes_readed = 0; +}; + +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mitsarEEG202A/share/interface-Mitsar-EEG202.ui b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mitsarEEG202A/share/interface-Mitsar-EEG202.ui new file mode 100644 index 0000000..d3fd673 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mitsarEEG202A/share/interface-Mitsar-EEG202.ui @@ -0,0 +1,395 @@ + + + + + + 5 + Device configuration + center + dialog + center + False + + + True + 8 + + + True + Mitsar EEG202 + center + + + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 6 + 2 + + + True + modelGender + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + adjustment2 + 1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + adjustment1 + 1 + True + True + + + 1 + 2 + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Identifier : + right + True + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + Reference : + right + + + 5 + 6 + GTK_FILL + + + + + + True + modelRef + + + + 0 + + + + + 1 + 2 + 5 + 6 + GTK_FILL + GTK_FILL + + + + + True + Number of channels : + right + True + + + 3 + 4 + + + + + True + Sampling frequency : + right + True + + + 4 + 5 + + + + + True + False + + adjustment3 + + + 1 + 2 + 3 + 4 + + + + + True + modelSamplingFreq + off + + + 1 + 2 + 4 + 5 + + + + + 0 + + + + + 0 + + + + + Change channel names + True + False + False + True + + + 1 + + + + + Event and Bio channels + True + True + False + True + + + 2 + + + + + True + <span size="smaller" foreground="#602020">All channels are acquired +The signal is sampled at 500 Hz</span> + True + center + + + 3 + + + + + 3 + + + + + True + + + False + 4 + + + + + True + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 31 EEG + 1 Event + 1 Bio + + + 31 EEG + 1 Event + 1 Bio + 3 Synchro + + + + + + + + + + + Common (A1 et A2) + + + Left A1 - Right A2 + + + + + 1025 + 65535 + 1 + 10 + + + 100 + 1 + 10 + + + + + + + + + 500 + + + + + 33 + 33 + 1 + 10 + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mitsarEEG202A/src/ovasCConfigurationMitsarEEG202A.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mitsarEEG202A/src/ovasCConfigurationMitsarEEG202A.cpp new file mode 100644 index 0000000..0ddb689 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mitsarEEG202A/src/ovasCConfigurationMitsarEEG202A.cpp @@ -0,0 +1,50 @@ +#if defined(TARGET_HAS_ThirdPartyMitsar) +#if defined TARGET_OS_Windows + +#include "ovasCConfigurationMitsarEEG202A.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +CConfigurationMitsarEEG202A::CConfigurationMitsarEEG202A(const char* gtKbuilderXMLFileName, uint32_t& refIndex, bool& eventAndBioChannelsState) + : CConfigurationBuilder(gtKbuilderXMLFileName), m_rEventAndBioChannelsState(eventAndBioChannelsState), m_rRefIdx(refIndex) {} + +bool CConfigurationMitsarEEG202A::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + GtkComboBox* ref = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_ref")); + //::GtkComboBox* comboBox_Chan = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_channels")); + + GtkToggleButton* buttonDrift = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_driftCorrection")); + GtkToggleButton* buttonHardwareTagging = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_EventAndBioChannels")); + + gtk_combo_box_set_active(ref, 0); + //::gtk_combo_box_set_active(comboBox_Chan, 0); + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttonHardwareTagging), m_rEventAndBioChannelsState); + return true; +} + +bool CConfigurationMitsarEEG202A::postConfigure() +{ + GtkComboBox* ref = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_ref")); + //::GtkComboBox* comboBox_Chan=GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_channels")); + + GtkToggleButton* buttonDrift = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_driftCorrection")); + GtkToggleButton* buttonHardwareTagging = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_EventAndBioChannels")); + + m_rRefIdx = uint32_t(gtk_combo_box_get_active(ref)); + + m_rEventAndBioChannelsState = (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(buttonHardwareTagging)) > 0); + + if (!CConfigurationBuilder::postConfigure()) { return false; } + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mitsarEEG202A/src/ovasCConfigurationMitsarEEG202A.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mitsarEEG202A/src/ovasCConfigurationMitsarEEG202A.h new file mode 100644 index 0000000..1ac019a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mitsarEEG202A/src/ovasCConfigurationMitsarEEG202A.h @@ -0,0 +1,36 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyMitsar) +#if defined TARGET_OS_Windows + +#include "../ovasCConfigurationBuilder.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationMitsarEEG202A + * \author Gelu Ionescu (GIPSA-lab) + * \date 26 April 2012 + * \brief The CConfigurationMitsarEEG202A class handles configuration specific to the Mitsar EEG 202A amplifier. + * + * submitted by Anton Andreev (GIPSA-lab) + */ +class CConfigurationMitsarEEG202A final : public CConfigurationBuilder +{ +public: + CConfigurationMitsarEEG202A(const char* gtKbuilderXMLFileName, uint32_t& refIndex, bool& rHardwareTaggingState); + + bool preConfigure() override; + bool postConfigure() override; + bool& m_rEventAndBioChannelsState; + +protected: + uint32_t& m_rRefIdx; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mitsarEEG202A/src/ovasCDriverMitsarEEG202A.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mitsarEEG202A/src/ovasCDriverMitsarEEG202A.cpp new file mode 100644 index 0000000..0c17281 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mitsarEEG202A/src/ovasCDriverMitsarEEG202A.cpp @@ -0,0 +1,383 @@ +#if defined(TARGET_HAS_ThirdPartyMitsar) +#if defined TARGET_OS_Windows + +#include "ovasCDriverMitsarEEG202A.h" + +#include "ovasCConfigurationMitsarEEG202A.h" + +#include + +#include + +#include +#include +#include + +#include + +#include + +#define msleep(ms) Sleep(ms) // Sleep windows + +namespace OpenViBE { +namespace AcquisitionServer { + +//___________________________________________________________________// +// // + +CDriverMitsarEEG202A::CDriverMitsarEEG202A(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_MitsarEEG202A", m_driverCtx.getConfigurationManager()) +{ + m_header.setChannelCount(CHANNEL_NB); + m_header.setSamplingFrequency(SAMPLING_RATE); + + m_settings.add("Header", &m_header); + m_settings.add("RefIndex", &m_refIdx); + m_settings.add("EventAndBioChannelsState", &m_eventAndBioChannelsState); + m_settings.load(); +} + +void CDriverMitsarEEG202A::release() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMitsarEEG202A::release\n"; + delete this; +} + +const char* CDriverMitsarEEG202A::getName() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMitsarEEG202A::getName\n"; + return "Mitsar EEG 202 - A"; +} + +//___________________________________________________________________// +// // + + +#define _Mitsar_EEG202A_DLLFileName_ "MitsarDll.dll" + +typedef int ( __stdcall *MitsarDLL_initialize)(); +typedef int ( __stdcall *MitsarDLL_start)(int refType); +typedef int ( __stdcall *MitsarDLL_stop)(); +typedef int ( __stdcall *MitsarDLL_uninitialize)(); +typedef int ( __stdcall *MitsarDLL_loop)(float* sample); + +static HINSTANCE mitsarDLLInstance = nullptr; +static MitsarDLL_initialize mitsarDLLInitialize = nullptr; +static MitsarDLL_start mitsarDLLStart = nullptr; +static MitsarDLL_stop mitsarDLLStop = nullptr; +static MitsarDLL_uninitialize mitsarDLLUninitialize = nullptr; +static MitsarDLL_loop mitsarDLLLoop = nullptr; + +//___________________________________________________________________// +// // + +bool CDriverMitsarEEG202A::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMitsarEEG202A::initialize\n"; + if (m_driverCtx.isConnected()) { return false; } + + mitsarDLLInstance = ::LoadLibrary(_Mitsar_EEG202A_DLLFileName_); + + if (!mitsarDLLInstance) + { + std::cout << "INIT ERROR : Load Library" << std::endl; + return false; + } + + mitsarDLLInitialize = (MitsarDLL_initialize)GetProcAddress(mitsarDLLInstance, "MITSAR_EEG202_initialize"); + mitsarDLLStart = (MitsarDLL_start)GetProcAddress(mitsarDLLInstance, "MITSAR_EEG202_start"); + mitsarDLLStop = (MitsarDLL_stop)GetProcAddress(mitsarDLLInstance, "MITSAR_EEG202_stop"); + mitsarDLLUninitialize = (MitsarDLL_uninitialize)GetProcAddress(mitsarDLLInstance, "MITSAR_EEG202_uninitialize"); + mitsarDLLLoop = (MitsarDLL_loop)GetProcAddress(mitsarDLLInstance, "MITSAR_EEG202_loop"); + + if (!mitsarDLLInitialize || !mitsarDLLStart || !mitsarDLLStop || !mitsarDLLUninitialize || !mitsarDLLLoop) + { + std::cout << "INIT ERROR : DLL functions list" << std::endl; + std::cout << "mitsarDLLInitialize : " << mitsarDLLInitialize << std::endl; + std::cout << "mitsarDLLStart : " << mitsarDLLStart << std::endl; + std::cout << "mitsarDLLStop : " << mitsarDLLStart << std::endl; + std::cout << "mitsarDLLUninitialize : " << mitsarDLLUninitialize << std::endl; + std::cout << "mitsarDLLLoop : " << mitsarDLLLoop << std::endl; + FreeLibrary(mitsarDLLInstance); + mitsarDLLInstance = nullptr; + mitsarDLLInitialize = nullptr; + mitsarDLLStart = nullptr; + mitsarDLLStop = nullptr; + mitsarDLLUninitialize = nullptr; + mitsarDLLLoop = nullptr; + return false; + } + + const int error = mitsarDLLInitialize(); + if (error) + { + FreeLibrary(mitsarDLLInstance); + mitsarDLLInstance = nullptr; + mitsarDLLInitialize = nullptr; + mitsarDLLStart = nullptr; + mitsarDLLStop = nullptr; + mitsarDLLUninitialize = nullptr; + mitsarDLLLoop = nullptr; + std::cout << "INIT ERROR : Init DLL function" << std::endl; + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMitsarEEG202A::CDriverMitsarEEG202A\n"; + + if (this->m_eventAndBioChannelsState) m_header.setChannelCount(CHANNEL_NB); + else m_header.setChannelCount(CHANNEL_NB - 2); + + m_header.setSamplingFrequency(SAMPLING_RATE); + + //uint32_t idx = 0; + m_header.setChannelName(0, "FP1"); + m_header.setChannelName(1, "FPz"); + m_header.setChannelName(2, "FP2"); + m_header.setChannelName(3, "F7"); + m_header.setChannelName(4, "F3"); + m_header.setChannelName(5, "Fz"); + m_header.setChannelName(6, "F4"); + m_header.setChannelName(7, "F8"); + m_header.setChannelName(8, "FT7"); + m_header.setChannelName(9, "FC3"); + m_header.setChannelName(10, "FCz"); + m_header.setChannelName(11, "FC4"); + m_header.setChannelName(12, "FT8"); + m_header.setChannelName(13, "T3"); + m_header.setChannelName(14, "C3"); + m_header.setChannelName(15, "Cz"); + m_header.setChannelName(16, "C4"); + m_header.setChannelName(17, "T4"); + m_header.setChannelName(18, "TP7"); + m_header.setChannelName(19, "CP3"); + m_header.setChannelName(20, "CPz"); + m_header.setChannelName(21, "CP4"); + m_header.setChannelName(22, "TP8"); + m_header.setChannelName(23, "T5"); + m_header.setChannelName(24, "P3"); + m_header.setChannelName(25, "Pz"); + m_header.setChannelName(26, "P4"); + m_header.setChannelName(27, "T6"); + m_header.setChannelName(28, "O1"); + m_header.setChannelName(29, "Oz"); + m_header.setChannelName(30, "O2"); + + if (this->m_eventAndBioChannelsState) + { + m_header.setChannelName(31, "CH_Event"); // Event signals (0/+3v) + m_header.setChannelName(32, "Bio1"); // Biological signals (ECG, EMG, EOG...) + } + + const uint32_t stimulationChannel = 31; + + m_iSamples.resize(SAMPLES_NB * CHANNEL_NB); + m_oSamples.resize(SAMPLES_NB * CHANNEL_NB); + + m_lastStimulation = STIMULATION_0; + // memorize the stimulation channel position + m_stimulationChannel = &m_oSamples[SAMPLES_NB * stimulationChannel]; + + m_stimulationIDs.resize(SAMPLES_NB); + m_stimulationDates.resize(SAMPLES_NB); + + m_callback = &callback; + + return true; +} + +bool CDriverMitsarEEG202A::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "CDriverMitsarEEG202A::start\n"; + + + if (!m_driverCtx.isConnected()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "CDriverMitsarEEG202A::start - not connected.\n"; + return false; + } + if (m_driverCtx.isStarted()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "CDriverMitsarEEG202A::start - already started.\n"; + return false; + } + + //) Check reference type : 1->Ref=A1-Left A2-Righ else Ref=Common(A1&A2) + int Ref_type = 1; + if (m_refIdx == 1) + { + std::cout << "Ref= A1-Left A2-Right\n"; + Ref_type = 1; + } + else + { + std::cout << "Ref=Common(A1&A2) \n"; + Ref_type = 0; + } + + const int error = mitsarDLLStart(Ref_type); + printf("Dll start %s\n", error ? "WRONG" : "OK"); + + return (error ? false : true); +} + +bool CDriverMitsarEEG202A::loop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverMitsarEEG202A::loop\n"; + + if (!m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted()) { return true; } + + if (mitsarDLLLoop(&m_iSamples[0])) { return false; } + + // INPUT s1 c1 c2 c3 ....cN + // s2 c1 c2 c3 ....cN + // s3 c1 c2 c3 ....cN + // sM c1 c2 c3 ....cN + // OUTPUT c1 s1 s2 s3 ....sM + // c2 s1 s2 s3 ....sM + // c3 s1 s2 s3 ....sM + // cN s1 s2 s3 ....sM + + // transpose data from sample lines to channel lines + for (uint32_t j = 0; j < CHANNEL_NB; ++j) // channel + { + for (uint32_t i = 0; i < SAMPLES_NB; ++i) // sample + { + m_oSamples[j * SAMPLES_NB + i] = m_iSamples[CHANNEL_NB * i + j];//CHANNEL_NB + } + } + + if (m_eventAndBioChannelsState) + { + // look for stimulations + uint32_t nStimulations = 0; + float* stimChannel = m_stimulationChannel; + + for (uint32_t iSample = 0; iSample < SAMPLES_NB; iSample++, stimChannel++) + { + uint32_t stim = STIMULATION_0; + + //std::cout << *stimChannel << " " << stim << std::endl; + + // Stim192 < 0.03 <= Stim128 < 0.1 <= Stim64 < 0.16 <= Stim0 + float stimulationF = *stimChannel; + + if (stimulationF < 0.03) + { + stim = STIMULATION_192; + *stimChannel = 3.0f; + } + else if (stimulationF < 0.1) + { + stim = STIMULATION_128; + *stimChannel = 2.0f; + } + else if (stimulationF < 0.16) + { + stim = STIMULATION_64; + *stimChannel = 1.0f; + } + else { *stimChannel = 0.0f; } + + + if ((stim != STIMULATION_0) && (stim != m_lastStimulation)) + { + m_stimulationIDs[nStimulations] = stim; + m_stimulationDates[nStimulations] = iSample; + nStimulations++; + } + + m_lastStimulation = stim; + + //std::cout << *stimChannel << " " << stim << std::endl; + } + + // prepare stimulations + CStimulationSet stimSet; + stimSet.setStimulationCount(nStimulations); + + + for (uint32_t iStimulation = 0; iStimulation < nStimulations; ++iStimulation) + { + uint64_t identifier; + switch (m_stimulationIDs[iStimulation]) + { + default: + case STIMULATION_64: identifier = OVTK_StimulationId_Label_01; break; + case STIMULATION_128: identifier = OVTK_StimulationId_Label_02; break; + case STIMULATION_192: identifier = OVTK_StimulationId_Label_03; break; + } + + const uint64_t date = CTime(m_header.getSamplingFrequency(), uint64_t(m_stimulationDates[iStimulation])).time(); + + stimSet.setStimulationIdentifier(iStimulation, identifier); + stimSet.setStimulationDate(iStimulation, date); + stimSet.setStimulationDuration(iStimulation, 1); + + //std::cout << "Trigger " << std::hex << m_stimulationIDs[iStimulation] << " "; + } + + //m_callback->setStimulationSet(stimSet); + } + + // Drift correction from GUI + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + + // SEND SAMPLES & STIMULATIONS + m_callback->setSamples(&m_oSamples[0], uint32_t(SAMPLES_NB)); + + + msleep(1); // free CPU ressources + return true; +} + + +bool CDriverMitsarEEG202A::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMitsarEEG202A::stop\n"; + + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + return (mitsarDLLStop() ? false : true); +} + +bool CDriverMitsarEEG202A::uninitialize() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMitsarEEG202A::uninitialize\n"; + + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + FreeLibrary(mitsarDLLInstance); + m_callback = nullptr; + mitsarDLLInstance = nullptr; + mitsarDLLInitialize = nullptr; + mitsarDLLStart = nullptr; + mitsarDLLStop = nullptr; + mitsarDLLUninitialize = nullptr; + mitsarDLLLoop = nullptr; + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverMitsarEEG202A::isConfigurable() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMitsarEEG202A::isConfigurable\n"; + return true; +} + +bool CDriverMitsarEEG202A::configure() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMitsarEEG202A::configure\n"; + CConfigurationMitsarEEG202A config(Directories::getDataDir() + "/applications/acquisition-server/interface-Mitsar-EEG202.ui", m_refIdx, m_eventAndBioChannelsState); + if (!config.configure(m_header)) { return false; } + m_settings.save(); + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mitsarEEG202A/src/ovasCDriverMitsarEEG202A.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mitsarEEG202A/src/ovasCDriverMitsarEEG202A.h new file mode 100644 index 0000000..fdf5d29 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/mitsarEEG202A/src/ovasCDriverMitsarEEG202A.h @@ -0,0 +1,76 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyMitsar) +#if defined TARGET_OS_Windows + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverMitsarEEG202A + * \author Gelu Ionescu (GIPSA-lab) + * \date 26 April 2012 + * \brief The CDriverMitsarEEG202A allows the acquisition server to acquire data from a Mitsar EEG 202A amplifier. + * + * submitted by Anton Andreev (GIPSA-lab) + */ +class CDriverMitsarEEG202A final : public IDriver +{ + typedef enum + { + CHANNEL_NB = 33, + SAMPLING_RATE = 500, + SAMPLES_NB = 33, + STIMULATION_0 = 0, + STIMULATION_128 = 128, + STIMULATION_64 = 64, + STIMULATION_192 = (STIMULATION_128 + STIMULATION_64), //both buttons pressed + } misc_t; + +public: + + explicit CDriverMitsarEEG202A(IDriverContext& ctx);//modif new Idriver + void release(); + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + //??? virtual void processData (cf neXus) + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_refIdx = 0; + bool m_eventAndBioChannelsState = false; + + uint32_t m_lastStimulation = 0; + float* m_stimulationChannel = nullptr; + std::vector m_stimulationIDs; + std::vector m_stimulationDates; + + std::vector m_iSamples; + std::vector m_oSamples; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif +#endif diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/share/interface-OpenALAudioCapture.ui b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/share/interface-OpenALAudioCapture.ui new file mode 100644 index 0000000..e48b206 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/share/interface-OpenALAudioCapture.ui @@ -0,0 +1,319 @@ + + + + + + 18 + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 1 + 1 + 1 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 8192 + + + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + OpenAL audio capture + center + + + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 5 + 2 + True + + + True + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + adjustment1 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + + + + + True + Sampling frequency : + right + True + + + 4 + 5 + + + + + True + Number of channels : + right + True + + + 3 + 4 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Identifier : + right + True + + + + + True + model2 + 0 + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + True + adjustment3 + True + True + + + 1 + 2 + 3 + 4 + + + + + 0 + + + + + 0 + + + + + Change channel names + True + False + False + + + False + 1 + + + + + 3 + + + + + True + + + False + 4 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/src/ovasCConfigurationOpenALAudioCapture.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/src/ovasCConfigurationOpenALAudioCapture.cpp new file mode 100644 index 0000000..0219800 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/src/ovasCConfigurationOpenALAudioCapture.cpp @@ -0,0 +1,36 @@ +#include "ovasCConfigurationOpenALAudioCapture.h" + +#if defined TARGET_HAS_ThirdPartyOpenAL +namespace OpenViBE { +namespace AcquisitionServer { + +/*_________________________________________________ + +Insert callback to specific widget here +Example with a button that launch a calibration of the device: + +//Callback connected to a dedicated gtk button: +static void button_calibrate_pressed_cb(GtkButton* button, void* data) +{ + CConfigurationOpenALAudioCapture* config=static_cast(data); + config->buttonCalibratePressedCB(); +} + +//Callback actually called: +void CConfigurationGTecGUSBamp::buttonCalibratePressedCB() +{ + // Connect to the hardware, ask for calibration, verify the return code, etc. +} +_________________________________________________*/ + +// If you added more reference attribute, initialize them here +CConfigurationOpenALAudioCapture::CConfigurationOpenALAudioCapture(IDriverContext& ctx, const char* gtkBuilderFilename) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx) {} + +bool CConfigurationOpenALAudioCapture::preConfigure() { return CConfigurationBuilder::preConfigure(); } + +bool CConfigurationOpenALAudioCapture::postConfigure() { return CConfigurationBuilder::postConfigure(); } + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif //TARGET_HAS_ThirdPartyOpenAL diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/src/ovasCConfigurationOpenALAudioCapture.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/src/ovasCConfigurationOpenALAudioCapture.h new file mode 100644 index 0000000..f8594fc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/src/ovasCConfigurationOpenALAudioCapture.h @@ -0,0 +1,43 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyOpenAL +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationOpenALAudioCapture + * \author Aurelien Van Langhenhove (CIC-IT Garches) + * \date Mon May 16 16:55:49 2011 + * \erief The CConfigurationOpenALAudioCapture handles the configuration dialog specific to the OpenAL audio capture device. + * + * TODO: details + * + * \sa CDriverOpenALAudioCapture + */ +class CConfigurationOpenALAudioCapture final : public CConfigurationBuilder +{ +public: + // you may have to add to your constructor some reference parameters + // for example, a connection ID: + //CConfigurationOpenALAudioCapture(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& rConnectionId); + CConfigurationOpenALAudioCapture(IDriverContext& ctx, const char* gtkBuilderFilename); + + bool preConfigure() override; + bool postConfigure() override; + +protected: + IDriverContext& m_driverCtx; + + /* + * Insert here all specific attributes, such as a connection ID. + * use references to directly modify the corresponding attribute of the driver + * Example: + */ + // uint32_t& m_connectionID; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif //TARGET_HAS_ThirdPartyOpenAL diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/src/ovasCDriverOpenALAudioCapture.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/src/ovasCDriverOpenALAudioCapture.cpp new file mode 100644 index 0000000..73c3e77 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/src/ovasCDriverOpenALAudioCapture.cpp @@ -0,0 +1,204 @@ +#if defined TARGET_HAS_ThirdPartyOpenAL +#include "ovasCDriverOpenALAudioCapture.h" +#include "ovasCConfigurationOpenALAudioCapture.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverOpenALAudioCapture::CDriverOpenALAudioCapture(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_OpenALAudioCapture", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(8192); + m_header.setChannelCount(1); + Device = nullptr; + Context = nullptr; + CaptureDevice = nullptr; + + m_settings.add("Header", &m_header); + m_settings.load(); +} + +CDriverOpenALAudioCapture::~CDriverOpenALAudioCapture() {} + +const char* CDriverOpenALAudioCapture::getName() { return "OpenAL audio capture"; } + +//___________________________________________________________________// +// // + +bool CDriverOpenALAudioCapture::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverOpenALAudioCapture::initialize\n"; + + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + m_sample = new float[nSamplePerSentBlock]; + if (!m_sample) + { + delete [] m_sample; + m_sample = nullptr; + return false; + } + + Samples = new ALshort[nSamplePerSentBlock]; + if (!Samples) + { + delete [] Samples; + Samples = nullptr; + return false; + } + + // Open default audio device + Device = alcOpenDevice(nullptr); + if (!Device) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Default audio device opening failed.\n"; + return false; + } + + // Create an audio context + Context = alcCreateContext(Device, nullptr); + if (!Context) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Audio context creation failed.\n"; + return false; + } + + // Activate context + if (!alcMakeContextCurrent(Context)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Audio context activation failed.\n"; + return false; + } + + // Verify if audio capture is supported by the computer + if (alcIsExtensionPresent(Device, "ALC_EXT_CAPTURE") == AL_FALSE) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Default audio device does not support audio capture.\n"; + return false; + } + + // Open capture device + CaptureDevice = alcCaptureOpenDevice(nullptr, (ALCsizei)m_header.getSamplingFrequency(), AL_FORMAT_MONO16, (ALCsizei)m_header.getSamplingFrequency()); + if (!CaptureDevice) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Default capture device opening failed.\n"; + return false; + } + + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + return true; +} + +bool CDriverOpenALAudioCapture::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverOpenALAudioCapture::start\n"; + + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // ... + // request hardware to start + // sending data + // ... + alcCaptureStart(CaptureDevice); + + return true; +} + +bool CDriverOpenALAudioCapture::loop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverOpenALAudioCapture::loop\n"; + + if (!m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted()) { return true; } + + // Activate context + if (!alcMakeContextCurrent(Context)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Audio context activation failed.\n"; } + + ALCint SamplesAvailable; + + do + { + alcGetIntegerv(CaptureDevice, ALC_CAPTURE_SAMPLES, 1, &SamplesAvailable); + if ((uint32_t)SamplesAvailable >= m_nSamplePerSentBlock) + { + alcCaptureSamples(CaptureDevice, &Samples[0], (ALCsizei)m_nSamplePerSentBlock); + for (uint32_t i = 0; i < m_nSamplePerSentBlock; ++i) { m_sample[i] = (float)Samples[i]; } + m_callback->setSamples(m_sample); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + } while ((uint32_t)SamplesAvailable >= m_nSamplePerSentBlock); + + return true; +} + +bool CDriverOpenALAudioCapture::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverOpenALAudioCapture::start\n"; + + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + alcCaptureStop(CaptureDevice); + + return true; +} + +bool CDriverOpenALAudioCapture::uninitialize() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverOpenALAudioCapture::start\n"; + + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // Close capture device + alcCaptureCloseDevice(CaptureDevice); + + // Context desactivation + alcMakeContextCurrent(nullptr); + + // Context destruction + alcDestroyContext(Context); + + // Close device + alcCloseDevice(Device); + + delete [] m_sample; + m_sample = nullptr; + + delete [] Samples; + Samples = nullptr; + + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverOpenALAudioCapture::isConfigurable() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverOpenALAudioCapture::isConfigurable\n"; + + return true; +} + +bool CDriverOpenALAudioCapture::configure() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverOpenALAudioCapture::start\n"; + + // Change this line if you need to specify some references to your driver attribute that need configuration, e.g. the connection ID. + CConfigurationOpenALAudioCapture config(m_driverCtx, + Directories::getDataDir() + "/applications/acquisition-server/interface-OpenALAudioCapture.ui"); + + if (!config.configure(m_header)) { return false; } + + m_settings.save(); + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif //TARGET_HAS_ThirdPartyOpenAL diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/src/ovasCDriverOpenALAudioCapture.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/src/ovasCDriverOpenALAudioCapture.h new file mode 100644 index 0000000..55bf351 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/src/ovasCDriverOpenALAudioCapture.h @@ -0,0 +1,81 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyOpenAL + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#if defined TARGET_OS_Windows +#include +#include +#elif defined TARGET_OS_Linux + #include + #include +#else +#endif + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverOpenALAudioCapture + * \author Aurelien Van Langhenhove (CIC-IT Garches) + * \date Mon May 16 16:55:49 2011 + * \erief The CDriverOpenALAudioCapture allows the acquisition server to acquire data from a OpenAL audio capture device. + * + * TODO: details + * + * \sa CConfigurationOpenALAudioCapture + */ +class CDriverOpenALAudioCapture final : public IDriver +{ +public: + + explicit CDriverOpenALAudioCapture(IDriverContext& ctx); + ~CDriverOpenALAudioCapture() override; + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + + // Replace this generic Header with any specific header you might have written + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + ALshort* Samples = nullptr; + +private: + + /* + * Insert here all specific attributes, such as USB port number or device ID. + * Example : + */ + // uint32_t m_connectionID; + ALCdevice* Device = nullptr; + ALCcontext* Context = nullptr; + ALCdevice* CaptureDevice = nullptr; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif //TARGET_HAS_ThirdPartyOpenAL diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_configuration.png b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_configuration.png new file mode 100644 index 0000000..0741b9b Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_configuration.png differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_documentation.md b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_documentation.md new file mode 100644 index 0000000..d98f7c3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_documentation.md @@ -0,0 +1,111 @@ +![OpenViBE logo][OpenViBELogo] + +![OpenBCI logo][OpenBCILogo] + +# OpenBCI driver for OpenViBE documentation # + +(documentation stands for [OpenViBE][OpenViBE] **1.2.0-OpenBCI-RC1**) + +## Welcome ## + +Welcome in the documentation of the [OpenBCI][OpenBCI] driver for [OpenViBE][OpenViBE]. This document gives you step by step details on how to configure your system, hardware and software to get the best possible experience. For further details about OpenBCI and OpenViBE, please refer to their [respective][OpenBCI] [documentation][OpenViBE]. + +## Getting Started ## + +This section gives guidelines on how to set-up your environment configuration to get the best experience using [OpenBCI][OpenBCI] with [OpenViBE][OpenViBE] + +### Linux ### + +In order to use the [OpenBCI][OpenBCI] driver on Linux, you need to be granted read/write access to the serial port that is used to communicate with the dongle. Unfortunately, this does not come as a standard configuration on many Linux distributions and you will need to configure your setup so that the user is granted these access. On [Ubuntu][UbuntuDotCom] and its derivative, as well as on [Debian][DebianDotOrg], this can simply be achieved by adding the user to the `dialog` group with the following command : + +> sudo adduser *username* dialout + +Please note that you may need to close and reopen the session for changes to take effect. + +On [Fedora][FedoraDotOrg] and its derivative, a similar command should be used to add the user in the `dialout` group : + +> sudo usermode -a -G dialout *username* + +Again, please note that you may need to close and reopen the session for changes to take effect. + +### Windows ### + +It is necessary to walk through a litlle bit of configuration to have the best experience with [OpenBCI][OpenBCI] and [OpenViBE][OpenViBE] on Windows. Indeed, when Windows first installs a serial port, its default configuration is not optimal for realtime streaming of the data. It especially configures large buffering and latencies, causing delays in the communication which eventually lead in delays in the acquired signals. While this only delays the detection of Motor Imagery or SSVEP tasks by a few hundreds of milliseconds, this also delays the ERP (eventually leading to a misdetection) and in all cases, alters the neurophysiological validity of the acquired data by a significant fraction. Consequently, it is recommended to configure the serial ports so that they are suitable for realtime use. + +Note that this configuration is necessary each time Windows creates a new serial port. This may unfortunately happen **every time** you move the dongle on a new USB port on the computer ! + +In order to open the configuration dialog of the serial port, please follow these steps: + +- Right click on the `Computer` icon and chose `Manage` +- After the `Computer Management` tool is opened, browse the tree in the left pane to the `Device Manager` section +- After the `Device Manager` tree is opened, browse in the right pane to the `Ports (COM & LPT)` section +- Then double click your port (in my case, `USB Serial Port (COM3)` + +![The Windows Device Manager][WindowsTweaking1] + +- In the `USB Serial Port Properties` dialog, go to the `Port Settings` tab and click `Advanced` + +![The Port Settings dialog][WindowsTweaking2] + +- This opens the `Advanced Settings for your COM port` + +![The Advanced Port Settings dialog][WindowsTweaking3] + +From this window, there are three settings we need to change : + +- The `Receive` and `Transmit` settings of the `USB Transfer Sizes` section should both be changed from 4096 to **64** as this will reduce the time taken by the OS to deliver the data to either the dongle or the [OpenViBE][OpenViBE] driver +- The `Latency Timer` of the `BM Options` section should be reduced down to **1** as this will dramatically reduce the latency induced by the OS. + +After you changed the settings as shown on the following figure, please click `OK`. + +![The tweaked configuration of COM ports to have best experienece with OpenViBE and OpenBCI][WindowsTweaking4] + +It is *not necessary* to restart the computer for the changes to take effect. + +## Configuration ## + +The configuration dialog of the [OpenBCI][OpenBCI] driver comes with a number of settings that one can change or pick depending on his preference. + +![The OpenBCI configuration dialog][DriverDialog] + +The following table documents each option that is specific to the [OpenBCI][OpenBCI] device. Please refer to the [OpenViBE documentation][OpenViBEDoc] for anything generic to the [OpenViBE][OpenViBE] Acquisition Server. + +| Option | Default Value | Documentation | +| :-------------------------: | :-------------------------: | :-----------------------------------------------------------------------------------| +| **Device** | *empty* | This allows you to pick a serial port to connect on. The drodown list shows the serial ports that can currently be opened on this computer. If no port is found, the mention *No valid serial port* is shown in this list. If you cannot find your device in this list, please refer . | +| **Use Daisy Module** | *false* | This allows you to configure the daisy module. Four cases should be considered. 1/ if the daisy module is present and this option is set to **true**, then the device will turn to 16 channels samples 125 Hz. 2/ if no daisy module is present and this option is set to **false**, then the device will turn to 8 channels, 250 Hz. 3/ if the daisy module is **not present** on the board and this option is set to **true**, then the initialization of the driver will **fail**. 4/ if the daisy module is **present** on the board and this option is set to **false**, the daisy module will be disabled and the acquisition will be done as if the daisy module was not present on the board, turning the device back to 8 channels sampled at 125 Hz. | +| **Custom Command On Initialization** | *empty* | This option contains additional commands to send to the device at initialization. You must use one line per command, some command may contain multiple characters. For details about the commands, please refer to the [OpenBCI protocol documentation][OpenBCIProto]. Be advised that this will increase the delay of initialization by an order of magnitude that is a direct relation of the number and types of commands you want to add. Finally, not all the commands take the same time to be executed, if you include custom commands, you should consider adjusting the timeout values. | +| **Board Reply Reading Timeout** | 5000 | This allows to define the maximum time until reading a reply from the board after sending a command times out. Many commands end with a **\$\$\$** pattern, which can handily be captured and release the waiting loop when reading the board reply, but not all the commands have this **\$\$\$** pattern. Consequently, it is necessary to have a timeout for the other commands. The default value has been chosen to behave well even with custom commands that need a long time to reply such as **?**. If you don't use such command in your *Custom Command On Initialization*, you may reduce that delay. But be aware that if you reduce it too much, the driver may miss the **\$\$\$** pattern even though the board has sent it, resulting in unexpected behavior. | +| **Board Reply Flushing Timeout** | 500 | This option allows to flush and get rid of the streaming buffer. This is especially used when the driver asks the board to stop streaming and makes the streaming state absolutely clean when the driver needs to send a new command after stopping the streaming. You may reduce this value to make (re)connection faster, but if the buffer came not to be completely flushed, the remaining would be taken as the begining of the next command and this may result in unexpected behavior. | + +The Configuration Summary gives information on the current configuration, especially the number of channels and the sampling rate of the device. + +## Advanced Configuration ## + +In addition to the above settings, another few settings are available to the user as advanced configuration. They are not exposed in the GUI and should be directly set in the [OpenViBEConfig][OpenViBE configuration] file instead. Refere to the [Configuration Manager section][OpenViBEConfig] of the [OpenViBE documentation][OpenViBEDoc] for further details on the configuration file format, location and others. + +| Token | Default Value | Documentation | +| :-------------------------: | :-------------------------: | :-----------------------------------------------------------------------------------| +| **AcquisitionDriver OpenBCI MissingSampleDelayBeforeReset** | *1000* | This defines the size of the window to continuously monitor reception of samples from the driver. If no sample is received within that timeframe, the board is requested to stop and restart streaming. While the non-reception of samples from the board may reflect an unexpected state in the board, this strategy seems to sometimes recover and let the streaming go back to normal. The default value allows a good compromise between dealing with buffering and actual transmission delays and recovering fast when something goes wrong. If you experience such unstability in the transmision, we recommend that you first explore anything that may (in)directly affect the quality of the transmission before tweaking this setting. | +| **AcquisitionDriver OpenBCI DroppedSampleCountBeforeReset** | *5* | This defines the number of sample loss events until a recovery is attempted. It happens that the board gets in an unstable state where some sample would be missing in the stream. Stopping and restarting the streaming has proved to recover well. The default setting has been set so that a few occasional sample loss may occur (due to e.g. quality transmission) and be corrected by the drift correction process, while not waiting too long to attempt recovery when too many sample are lost. | +| **AcquisitionDriver OpenBCI DroppedSampleSafetyDelayBeforeReset** | *1000* | This defines a sefety delay where no reset should be attempted because of sample loss (see **AcquisitionDriver OpenBCI DroppedSampleCountBeforeReset**). This prevents a reset on the first sample where the driver synchronises with the streaming protocol and may miss a few samples until it is perfectly synced with the header and tail of the protocol frame. | + +[FedoraDotOrg]: http://www.fedora.org +[UbuntuDotCom]: http://www.ubuntu.com +[DebianDotOrg]: http://www.debian.org + +[OpenViBE]: http://openvibe.inria.fr +[OpenViBEDoc]: http://openvibe.inria.fr/documentation-index +[OpenViBEConfig]: http://openvibe.inria.fr/the-configuration-manager +[OpenViBELogo]: http://openvibe.inria.fr/openvibe/wp-content/themes/openvibe/images/openvibe-banner.png + +[OpenBCI]: http://docs.openbci.com +[OpenBCIProto]: http://docs.openbci.com/software/01-OpenBCI_SDK +[OpenBCILogo]: http://openbci.com/community/wp-content/uploads/2015/09/logo_wide_web_borders_BIG-copy-1024x137.png + +[WindowsTweaking1]: ServerDriver_OpenBCI_windows_tweaking_1.png +[WindowsTweaking2]: ServerDriver_OpenBCI_windows_tweaking_2.png +[WindowsTweaking3]: ServerDriver_OpenBCI_windows_tweaking_3.png +[WindowsTweaking4]: ServerDriver_OpenBCI_windows_tweaking_4.png +[DriverDialog]: ServerDriver_OpenBCI_configuration.png + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_windows_tweaking_1.png b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_windows_tweaking_1.png new file mode 100644 index 0000000..0e46801 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_windows_tweaking_1.png differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_windows_tweaking_2.png b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_windows_tweaking_2.png new file mode 100644 index 0000000..1912c21 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_windows_tweaking_2.png differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_windows_tweaking_3.png b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_windows_tweaking_3.png new file mode 100644 index 0000000..65ada08 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_windows_tweaking_3.png differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_windows_tweaking_4.png b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_windows_tweaking_4.png new file mode 100644 index 0000000..32adc87 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/doc/ServerDriver_OpenBCI_windows_tweaking_4.png differ diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/share/interface-OpenBCI.ui b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/share/interface-OpenBCI.ui new file mode 100644 index 0000000..d763cf5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/share/interface-OpenBCI.ui @@ -0,0 +1,735 @@ + + + + + + 1 + 256 + 8 + 1 + 10 + + + 100 + 18 + 1 + 10 + + + 100 + 1 + 10 + + + 1 + 30000 + 500 + 1 + 10 + + + 1 + 30000 + 5000 + 1 + 10 + + + 4 + 4096 + 250 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + False + + + True + False + 10 + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + Number of channels : + right + True + + + + + True + + False + False + True + True + adjustment1 + True + True + + + 1 + 2 + + + + + False + Sampling frequency : + right + True + + + 1 + 2 + + + + + True + + False + False + True + True + adjustment_sampling_frequency + True + True + + + 1 + 2 + 1 + 2 + + + + + + + False + 5 + Device configuration + center + dialog + center + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + + + True + False + <b><big>OpenBCI reader</big></b> + +<small>Upon initialization, board responses will appear in the console +at <b>Trace</b> level and should end by "<b>$$$</b>". + +The last 3 channels represent accelerometer values. +The sampling rate and the total number of channels are automatically +selected depending on the <b>Use Daisy Module</b> option +(8 EEG + 3 acc. at 250Hz without, 16 EEG + 3 acc. at 125Hz with). + +Use "<b>Custom Commands on Initialisation</b>" to configure the board between +reset and streaming. Refer to OpenBCI doc for more details.</small> + True + center + + + True + True + 0 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + True + end + 0 + + + + + True + False + + + False + True + 4 + 2 + + + + + True + False + 3 + 2 + + + True + False + Identifier : + right + True + + + + + True + True + + True + False + False + True + True + adjustment3 + True + True + + + 1 + 2 + + + + + True + False + Gender : + right + True + + + 1 + 2 + + + + + True + False + model1 + + + + 0 + + + + + 1 + 2 + 1 + 2 + + + + + True + False + Age : + right + True + + + 2 + 3 + + + + + True + True + + True + False + False + True + True + adjustment2 + True + True + + + 1 + 2 + 2 + 3 + + + + + True + True + 3 + + + + + True + False + + + False + True + 4 + 4 + + + + + True + False + 5 + 2 + + + True + False + 3 + Board Reply Reading Timeout (ms) + + + 3 + 4 + + + + + True + False + Use Daisy Module : + right + True + + + 1 + 2 + + + + + True + False + Device : + right + True + + + + + True + True + + True + False + False + True + True + adjustment_read_board_reply_timeout + True + True + + + 1 + 2 + 3 + 4 + + + + + True + True + False + True + + + 1 + 2 + 1 + 2 + + + + + True + False + + + + 0 + + + + + 1 + 2 + + + + + True + False + Board Reply Flushing Timeout (ms) + + + 4 + 5 + + + + + True + True + + True + False + False + True + True + adjustment_flush_board_reply_timeout + True + True + + + 1 + 2 + 4 + 5 + + + + + True + True + automatic + automatic + in + + + True + True + + + + + 1 + 2 + 2 + 3 + + + + + True + False + + + True + False + + + True + True + 0 + + + + + True + False + Custom Commands on Initialization : + + + False + False + 1 + + + + + True + False + (1 command per line) + + + False + False + 2 + + + + + True + False + + + True + True + 3 + + + + + 2 + 3 + + + + + True + True + 5 + + + + + True + False + + + False + True + 4 + 6 + + + + + True + False + 3 + 2 + + + True + False + Configuration Summary: + True + + + 3 + + + + + True + False + EEG Channels + True + right + True + + + 1 + 2 + + + + + True + False + Accelerometer Channels + True + right + True + + + 1 + 2 + 1 + 2 + + + + + True + False + Sampling Rate + True + right + True + + + 1 + 2 + 2 + 3 + + + + + True + True + 7 + + + + + True + False + + + False + True + 8 + + + + + Change channel names + True + True + True + + + False + True + 9 + + + + + True + False + + + False + True + 10 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/src/ovasCConfigurationOpenBCI.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/src/ovasCConfigurationOpenBCI.cpp new file mode 100644 index 0000000..8c20f60 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/src/ovasCConfigurationOpenBCI.cpp @@ -0,0 +1,234 @@ +/* + * OpenBCI driver for OpenViBE + * + * \author Jeremy Frey + * \author Yann Renard + * + */ +#include "ovasCConfigurationOpenBCI.h" +#include +#include + +#if defined TARGET_OS_Windows +#include +#include +#include +#include +//#define TERM_SPEED 57600 +#define TERM_SPEED CBR_115200 // OpenBCI is a bit faster than others +#elif defined TARGET_OS_Linux + #include + #include + #include + #include + #include + #include // htons and co. + #include + #define TERM_SPEED B115200 +#else +#endif + + +namespace OpenViBE { +namespace AcquisitionServer { + +#define MAXIMUM_SERIAL_TTY (32) +#define MAXIMUM_SERIAL_USB_TTY (256-MAXIMUM_SERIAL_TTY) + +uint32_t CConfigurationOpenBCI::getMaximumTtyCount() { return MAXIMUM_SERIAL_USB_TTY + MAXIMUM_SERIAL_TTY; } + +CString CConfigurationOpenBCI::getTTYFileName(const uint32_t ttyNumber) +{ + char buffer[1024]; +#if defined TARGET_OS_Windows + sprintf(buffer, "\\\\.\\COM%u", ttyNumber); +#elif defined TARGET_OS_Linux + if(ttyNumbercheckbuttonDaisyModuleCB(gtk_toggle_button_get_active(button) ? CConfigurationOpenBCI::EDaisyStatus::Active + : CConfigurationOpenBCI::EDaisyStatus::Inactive); +} + +CConfigurationOpenBCI::CConfigurationOpenBCI(const char* gtkBuilderFilename, uint32_t& usbIdx) + : CConfigurationBuilder(gtkBuilderFilename), m_usbIdx(usbIdx) { m_listStore = gtk_list_store_new(1, G_TYPE_STRING); } + +CConfigurationOpenBCI::~CConfigurationOpenBCI() { g_object_unref(m_listStore); } + +bool CConfigurationOpenBCI::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + +#if 0 + ::GtkEntry* m_entryComInit=GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_com_init")); + ::gtk_entry_set_text(m_entryComInit, m_additionalCmds.toASCIIString()); +#else + std::string additionalCmds = m_additionalCmds.toASCIIString(); + std::replace(additionalCmds.begin(), additionalCmds.end(), '\255', '\n'); + GtkTextView* textViewComInit = GTK_TEXT_VIEW(gtk_builder_get_object(m_builder, "text_view_com_init")); + GtkTextBuffer* textBufferComInit = gtk_text_view_get_buffer(textViewComInit); + gtk_text_buffer_set_text(textBufferComInit, additionalCmds.c_str(), -1); +#endif + + GtkSpinButton* buttonReadBoardReplyTimeout = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_read_board_reply_timeout")); + gtk_spin_button_set_value(buttonReadBoardReplyTimeout, m_readBoardReplyTimeout); + + GtkSpinButton* buttonFlushBoardReplyTimeout = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_flush_board_reply_timeout")); + gtk_spin_button_set_value(buttonFlushBoardReplyTimeout, m_flushBoardReplyTimeout); + + GtkToggleButton* buttonDaisyModule = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_daisy_module")); + gtk_toggle_button_set_active(buttonDaisyModule, m_daisyModule ? true : false); + + ::g_signal_connect(gtk_builder_get_object(m_builder, "checkbutton_daisy_module"), "toggled", G_CALLBACK(checkbutton_daisy_module_cb), this); + this->checkbuttonDaisyModuleCB(m_daisyModule ? EDaisyStatus::Active : EDaisyStatus::Inactive); + + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + + g_object_unref(m_listStore); + m_listStore = gtk_list_store_new(1, G_TYPE_STRING); + m_comboSlotsIndexToSerialPort.clear(); + + gtk_combo_box_set_model(comboBox, GTK_TREE_MODEL(m_listStore)); + + bool selected = false; + + m_comboSlotsIndexToSerialPort[0] = -1; + gtk_combo_box_append_text(comboBox, "Automatic"); + + for (uint32_t i = 0, j = 1; i < getMaximumTtyCount(); ++i) + { + CString filename = getTTYFileName(i); + if (isTTYFile(filename)) + { + m_comboSlotsIndexToSerialPort[j] = i; + gtk_combo_box_append_text(comboBox, filename.toASCIIString()); + if (m_usbIdx == i) + { + gtk_combo_box_set_active(comboBox, j); + selected = true; + } + j++; + } + } + + if (!selected) { gtk_combo_box_set_active(comboBox, 0); } + + return true; +} + +bool CConfigurationOpenBCI::postConfigure() +{ + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + + if (m_applyConfig) + { + const int idx = m_comboSlotsIndexToSerialPort[gtk_combo_box_get_active(comboBox)]; + if (idx >= 0) { m_usbIdx = uint32_t(idx); } + else { m_usbIdx = uint32_t(-1); } + +#if 0 + ::GtkEntry* m_entryComInit=GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_com_init")); + m_additionalCmds=::gtk_entry_get_text(m_entryComInit); +#else + GtkTextView* textViewComInit = GTK_TEXT_VIEW(gtk_builder_get_object(m_builder, "text_view_com_init")); + GtkTextBuffer* textBufferComInit = gtk_text_view_get_buffer(textViewComInit); + GtkTextIter startIt; + GtkTextIter endIt; + gtk_text_buffer_get_start_iter(textBufferComInit, &startIt); + gtk_text_buffer_get_end_iter(textBufferComInit, &endIt); + std::string additionalCmds = gtk_text_buffer_get_text(textBufferComInit, &startIt, &endIt, FALSE); + std::replace(additionalCmds.begin(), additionalCmds.end(), '\n', '\255'); + m_additionalCmds = additionalCmds.c_str(); +#endif + + GtkSpinButton* buttonReadBoardReplyTimeout = GTK_SPIN_BUTTON( + gtk_builder_get_object(m_builder, "spinbutton_read_board_reply_timeout")); + gtk_spin_button_update(GTK_SPIN_BUTTON(buttonReadBoardReplyTimeout)); + m_readBoardReplyTimeout = gtk_spin_button_get_value_as_int(buttonReadBoardReplyTimeout); + + GtkSpinButton* buttonFlushBoardReplyTimeout = GTK_SPIN_BUTTON( + gtk_builder_get_object(m_builder, "spinbutton_flush_board_reply_timeout")); + gtk_spin_button_update(GTK_SPIN_BUTTON(buttonFlushBoardReplyTimeout)); + m_flushBoardReplyTimeout = gtk_spin_button_get_value_as_int(buttonFlushBoardReplyTimeout); + + GtkToggleButton* buttonDaisyModule = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_daisy_module")); + m_daisyModule = gtk_toggle_button_get_active(buttonDaisyModule) ? true : false; + } + + if (!CConfigurationBuilder::postConfigure()) { return false; } + return true; +} + +void CConfigurationOpenBCI::checkbuttonDaisyModuleCB(const EDaisyStatus status) const +{ + const daisy_Info_t info = this->getDaisyInformation(status); + + std::string buffer = std::to_string(info.nEEGChannel) + " EEG Channels"; + gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(m_builder, "label_status_eeg_channel_count")), buffer.c_str()); + + buffer = std::to_string(info.nAccChannel) + " Accelerometer Channels"; + gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(m_builder, "label_status_acc_channel_count")), buffer.c_str()); + + buffer = std::to_string(info.sampling) + " Hz Sampling Rate"; + gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(m_builder, "label_status_sampling_rate")), buffer.c_str()); + + gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_number_of_channels")), info.nEEGChannel + info.nAccChannel); +} + +CConfigurationOpenBCI::daisy_Info_t CConfigurationOpenBCI::getDaisyInformation(const EDaisyStatus status) +{ + daisy_Info_t res; + switch (status) + { + case EDaisyStatus::Inactive: res.nEEGChannel = DEFAULT_N_EEG_CHANNEL; + res.nAccChannel = DEFAULT_N_ACC_CHANNEL; + res.sampling = DEFAULT_SAMPLING; + break; + + case EDaisyStatus::Active: res.nEEGChannel = DEFAULT_N_EEG_CHANNEL * 2; + res.nAccChannel = DEFAULT_N_ACC_CHANNEL; + res.sampling = DEFAULT_SAMPLING / 2; + break; + + default: res.nEEGChannel = 0; + res.nAccChannel = 0; + res.sampling = 0; + break; + } + + return res; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/src/ovasCConfigurationOpenBCI.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/src/ovasCConfigurationOpenBCI.h new file mode 100644 index 0000000..8764a43 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/src/ovasCConfigurationOpenBCI.h @@ -0,0 +1,68 @@ +/* + * OpenBCI driver for OpenViBE + * + * \author Jeremy Frey + * \author Yann Renard + */ +#pragma once + +#include "../ovasCConfigurationBuilder.h" + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +class CConfigurationOpenBCI final : public CConfigurationBuilder +{ +public: + + const static uint16_t DEFAULT_SAMPLING = 250; // sampling rate with no daisy module (divided by 2 with daisy module) + const static uint16_t DEFAULT_N_EEG_CHANNEL = 8; // number of EEG channels with no daisy module (multiplied by 2 with daisy module) + const static uint16_t DEFAULT_N_ACC_CHANNEL = 3; // number of Acc channels (daisy module does not have an impact) + + enum class EDaisyStatus { Active, Inactive }; + + typedef struct + { + int nEEGChannel; + int nAccChannel; + int sampling; + } daisy_Info_t; + + static uint32_t getMaximumTtyCount(); + static CString getTTYFileName(uint32_t ttyNumber); + static bool isTTYFile(const CString& filename); + + CConfigurationOpenBCI(const char* gtkBuilderFilename, uint32_t& usbIdx); + ~CConfigurationOpenBCI() override; + + bool preConfigure() override; + bool postConfigure() override; + + void setAdditionalCommands(const CString& cmds) { m_additionalCmds = cmds; } + CString getAdditionalCommands() const { return m_additionalCmds; } + void setReadBoardReplyTimeout(const uint32_t timeout) { m_readBoardReplyTimeout = timeout; } + uint32_t getReadBoardReplyTimeout() const { return m_readBoardReplyTimeout; } + void setFlushBoardReplyTimeout(const uint32_t timeout) { m_flushBoardReplyTimeout = timeout; } + uint32_t getFlushBoardReplyTimeout() const { return m_flushBoardReplyTimeout; } + void setDaisyModule(const bool module) { m_daisyModule = module; } + bool getDaisyModule() const { return m_daisyModule; } + + void checkbuttonDaisyModuleCB(EDaisyStatus status) const; + + static daisy_Info_t getDaisyInformation(EDaisyStatus status); + +protected: + + std::map m_comboSlotsIndexToSerialPort; + uint32_t& m_usbIdx; + GtkListStore* m_listStore = nullptr; + GtkEntry* m_entryComInit = nullptr; + CString m_additionalCmds; + uint32_t m_readBoardReplyTimeout = 0; + uint32_t m_flushBoardReplyTimeout = 0; + bool m_daisyModule = false; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/src/ovasCDriverOpenBCI.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/src/ovasCDriverOpenBCI.cpp new file mode 100644 index 0000000..507664b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/src/ovasCDriverOpenBCI.cpp @@ -0,0 +1,967 @@ +/* + * OpenBCI driver for OpenViBE + * + * \author Jeremy Frey + * \author Yann Renard + * + */ + +#include "ovasCDriverOpenBCI.h" +#include "ovasCConfigurationOpenBCI.h" + +#include +#include + +#include +#include +#include +#include +#include + +#if defined TARGET_OS_Windows +#include +#include +#include +#include +#include // htons and co. +//#define TERM_SPEED 57600 +#define TERM_SPEED CBR_115200 // OpenBCI is a bit faster than others +#elif defined TARGET_OS_Linux + #include + #include + #include + #include + #include + #include // htons and co. + #include + #define TERM_SPEED B115200 +#else +#endif + +namespace OpenViBE { +namespace AcquisitionServer { + +// packet number at initialization +#define UNINITIALIZED_PACKET_NUMBER -1 +#define UNDEFINED_DEVICE_IDENTIFIER uint32_t(-1) +#define READ_ERROR uint32_t(-1) +#define WRITE_ERROR uint32_t(-1) + +// start and stop bytes from OpenBCI protocl +#define SAMPLE_START_BYTE 0xA0 +#define SAMPLE_STOP_BYTE 0xC0 + +// some constants related to the sendCommand +#define ADS1299_VREF 4.5 // reference voltage for ADC in ADS1299. set by its hardware +#define ADS1299_GAIN 24.0 //assumed gain setting for ADS1299. set by its Arduino code + +// configuration tokens +#define Token_MissingSampleDelayBeforeReset "AcquisitionDriver_OpenBCI_MissingSampleDelayBeforeReset" +#define Token_DroppedSampleCountBeforeReset "AcquisitionDriver_OpenBCI_DroppedSampleCountBeforeReset" +#define Token_DroppedSampleSafetyDelayBeforeReset "AcquisitionDriver_OpenBCI_DroppedSampleSafetyDelayBeforeReset" + +//___________________________________________________________________// +// Heavily inspired by OpenEEG code. Will override channel count and sampling late upon "daisy" selection. If daisy module is attached, will concatenate EEG values and average accelerometer values every two samples. +// // + +CDriverOpenBCI::CDriverOpenBCI(IDriverContext& ctx) + : IDriver(ctx) + , m_settings("AcquisitionServer_Driver_OpenBCI", m_driverCtx.getConfigurationManager()) +{ + m_additionalCmds = ""; + m_readBoardReplyTimeout = 5000; + m_flushBoardReplyTimeout = 500; + m_driverName = "OpenBCI"; + + m_settings.add("Header", &m_header); + m_settings.add("DeviceIdentifier", &m_deviceID); + m_settings.add("ComInit", &m_additionalCmds); + m_settings.add("ReadBoardReplyTimeout", &m_readBoardReplyTimeout); + m_settings.add("FlushBoardReplyTimeout", &m_flushBoardReplyTimeout); + m_settings.add("DaisyModule", &m_daisyModule); + + m_settings.load(); + + m_missingSampleDelayBeforeReset = uint32_t(ctx.getConfigurationManager().expandAsUInteger(Token_MissingSampleDelayBeforeReset, 1000)); + m_droppedSampleCountBeforeReset = uint32_t(ctx.getConfigurationManager().expandAsUInteger(Token_DroppedSampleCountBeforeReset, 5)); + m_droppedSampleSafetyDelayBeforeReset = uint32_t(ctx.getConfigurationManager().expandAsUInteger(Token_DroppedSampleSafetyDelayBeforeReset, 1000)); + + // default parameter loaded, update channel count and frequency + this->updateDaisy(true); +} + +//___________________________________________________________________// +// // + +void CDriverOpenBCI::updateDaisy(const bool quietLogging) +{ + // change channel and sampling rate according to daisy module + const auto info = CConfigurationOpenBCI::getDaisyInformation(m_daisyModule ? CConfigurationOpenBCI::EDaisyStatus::Active + : CConfigurationOpenBCI::EDaisyStatus::Inactive); + + m_header.setSamplingFrequency(info.sampling); + m_header.setChannelCount(info.nEEGChannel + info.nAccChannel); + + if (!quietLogging) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << this->m_driverName << ": Status - " << CString(m_daisyModule ? "Daisy" : "** NO ** Daisy") << + " module option enabled, " << m_header.getChannelCount() << " channels -- " << int((m_daisyModule ? 2 : 1) * EEG_VALUE_COUNT_PER_SAMPLE) << + " EEG and " << int(ACC_VALUE_COUNT_PER_SAMPLE) << " accelerometer -- at " << m_header.getSamplingFrequency() << "Hz.\n"; + } + + // microvolt for EEG channels + for (int i = 0; i < info.nEEGChannel; ++i) { m_header.setChannelUnits(i, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); } + + // undefined for accelerometer/extra channels + for (int i = 0; i < info.nAccChannel; ++i) { m_header.setChannelUnits(info.nEEGChannel + i, OVTK_UNIT_Unspecified, OVTK_FACTOR_Base); } +} + +bool CDriverOpenBCI::initialize(const uint32_t /*nSamplePerSentBlock*/, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) { return false; } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << this->m_driverName << ": Configured 'missing sample delay before reset' to " << + m_missingSampleDelayBeforeReset << " ; this can be changed in the openvibe configuration file setting the " << CString( + Token_MissingSampleDelayBeforeReset) << " token\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << this->m_driverName << ": Configured 'dropped sample count before reset' to " << + m_droppedSampleCountBeforeReset << " ; this can be changed in the openvibe configuration file setting the " << CString( + Token_DroppedSampleSafetyDelayBeforeReset) << " token\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << this->m_driverName << ": Configured 'dropped sample safety delay before reset' to " << + m_droppedSampleSafetyDelayBeforeReset << " ; this can be changed in the openvibe configuration file setting the " << CString( + Token_DroppedSampleSafetyDelayBeforeReset) << " token\n"; + + m_nChannel = m_header.getChannelCount(); + + // Initializes buffer data structures + m_readBuffers.clear(); + m_readBuffers.resize(1024 * 16); // 16 kbytes of read buffer + m_callbackSamples.clear(); + + // change channel and sampling rate according to daisy module + this->updateDaisy(false); + + // init state + m_readState = ParserAutomaton_Default; + m_extractPosition = 0; + m_sampleNumber = -1; + m_seenPacketFooter = true; // let's say we will start with header + + if (!this->openDevice(&m_fileDesc, m_deviceID)) { return false; } + + // check board status and print response + if (!this->resetBoard(m_fileDesc, true)) + { + this->closeDevice(m_fileDesc); + return false; + } + + // prepare buffer for samples + m_sampleEEGBuffers.resize(EEG_VALUE_COUNT_PER_SAMPLE); + m_sampleEEGBuffersDaisy.resize(EEG_VALUE_COUNT_PER_SAMPLE); + m_sampleAccBuffers.resize(ACC_VALUE_COUNT_PER_SAMPLE); + m_sampleAccBuffersTemp.resize(ACC_VALUE_COUNT_PER_SAMPLE); + + // init buffer for 1 EEG value and 1 accel value + m_eegValueBuffers.resize(EEG_VALUE_BUFFER_SIZE); + m_accValueBuffers.resize(ACC_VALUE_BUFFER_SIZE); + m_sampleBuffers.resize(m_nChannel); + + m_callback = &callback; + m_lastPacketNumber = UNINITIALIZED_PACKET_NUMBER; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << CString(this->getName()) << " driver initialized.\n"; + + // init scale factor + m_unitsToMicroVolts = float(float(ADS1299_VREF * 1000000) / ((pow(2., 23) - 1) * ADS1299_GAIN)); + m_unitsToRadians = float(0.002 / pow(2., 4)); // @aj told me - this is undocumented and may have been taken from the OpenBCI plugin for processing + +#if 0 + uint32_t unitsToMicroVolts = (float) (ADS1299_VREF/(pow(2.,23)-1)/ADS1299_GAIN*1000000.); // $$$$ The notation here is ambiguous + ::printf("CHECK THIS OUT : %g %g %g\n", unitsToMicroVolts-m_unitsToMicroVolts, unitsToMicroVolts, m_unitsToMicroVolts); +#endif + + return true; +} + +bool CDriverOpenBCI::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << CString(this->getName()) << " driver started.\n"; + return true; +} + +bool CDriverOpenBCI::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + + // try to awake the board if there's something wrong + if (System::Time::getTime() - m_tick > m_missingSampleDelayBeforeReset) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "No response for " << uint32_t(m_missingSampleDelayBeforeReset) << + "ms, will try recovery now (Note this may eventually be hopeless as the board may not reply to any command either).\n"; + if (!this->resetBoard(m_fileDesc, false)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << this->m_driverName << ": Did not succeed reseting board\n"; + return false; + } + } + + // read datastream from device + const uint32_t length = this->readFromDevice(m_fileDesc, &m_readBuffers[0], m_readBuffers.size()); + if (length == READ_ERROR) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << this->m_driverName << ": Could not receive data from [" << m_ttyName << "]\n"; + return false; + } + + // pass bytes one by one to parser to extract samples + for (uint32_t i = 0; i < length; ++i) + { + // will have effect only if complete sample/packet + if (this->handleCurrentSample(this->parseByte(m_readBuffers[i]))) + { + // One full packet was processed ! + } + } + + // now deal with acquired samples + if (!m_channelBuffers.empty()) + { + if (m_driverCtx.isStarted()) + { + m_callbackSamples.resize(m_nChannel * m_channelBuffers.size()); + + for (uint32_t i = 0, k = 0; i < m_nChannel; ++i) + { + for (uint32_t j = 0; j < m_channelBuffers.size(); ++j) { m_callbackSamples[k++] = m_channelBuffers[j][i]; } + } + m_callback->setSamples(&m_callbackSamples[0], m_channelBuffers.size()); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + m_channelBuffers.clear(); + } + return true; +} + +bool CDriverOpenBCI::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << CString(this->getName()) << " driver stopped.\n"; + return true; +} + +bool CDriverOpenBCI::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + this->closeDevice(m_fileDesc); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << CString(this->getName()) << " driver closed.\n"; + + // Uninitializes data structures + m_readBuffers.clear(); + m_callbackSamples.clear(); + m_ttyName = ""; + +#if 0 + delete [] m_sample; + m_sample= nullptr; +#endif + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverOpenBCI::configure() +{ + CConfigurationOpenBCI config(Directories::getDataDir() + "/applications/acquisition-server/interface-OpenBCI.ui", m_deviceID); + + config.setAdditionalCommands(m_additionalCmds); + config.setReadBoardReplyTimeout(m_readBoardReplyTimeout); + config.setFlushBoardReplyTimeout(m_flushBoardReplyTimeout); + config.setDaisyModule(m_daisyModule); + + if (!config.configure(m_header)) { return false; } + + m_additionalCmds = config.getAdditionalCommands(); + m_readBoardReplyTimeout = config.getReadBoardReplyTimeout(); + m_flushBoardReplyTimeout = config.getFlushBoardReplyTimeout(); + m_daisyModule = config.getDaisyModule(); + m_settings.save(); + + this->updateDaisy(false); + + return true; +} + +// Convert EEG value format from int24 MSB (network order) to int host +// TODO: check on big endian architecture +int CDriverOpenBCI::interpret24bitAsInt32(const std::vector& byteBuffer) +{ + // create a big endian so that we could adapt to host architecture later on + int newInt = (byteBuffer[2] << 24) | (byteBuffer[1] << 16) | byteBuffer[0] << 8; + // depending on most significant byte, set positive or negative value + if ((newInt & 0x00008000) > 0) { newInt |= 0x000000FF; } + else { newInt &= 0xFFFFFF00; } + // convert back from big endian (network order) to host + return htonl(newInt); +} + +// Convert EEG value format from int16_t MSB (network order) to int host +int CDriverOpenBCI::interpret16bitAsInt32(const std::vector& byteBuffer) +{ + // create a big endian so that we could adapt to host architecture later on + int newInt = (byteBuffer[1] << 24) | byteBuffer[0] << 16; + // depending on most significant byte, set positive or negative value + if ((newInt & 0x00800000) > 0) { newInt |= 0x0000FFFF; } + else { newInt &= 0xFFFF0000; } + // convert back from big endian (network order) to host + return htonl(newInt); +} + +// return sample number once one is received (between 0 and 255, -1 if none) +// NB: will wait to get footer and then header in a row, may miss a packet but will prevent a bad sync with stream (thx BrainBay for the tip!) +int16_t CDriverOpenBCI::parseByte(const uint8_t actbyte) +{ + // finished to read sample or not + bool status = false; + + switch (m_readState) + { + // Default state: wait for Start byte + case ParserAutomaton_Default: + // if first byte is not the one expected, won't go further + if (actbyte == SAMPLE_STOP_BYTE) { m_seenPacketFooter = true; } + else + { + if (actbyte == SAMPLE_START_BYTE && m_seenPacketFooter) { m_readState = ParserAutomaton_StartByteReceived; } + m_seenPacketFooter = false; + } + // reset sample info + m_sampleNumber = -1; + m_extractPosition = 0; + m_sampleBufferPosition = 0; + break; + + // Start byte received, consider next byte as sample number + case ParserAutomaton_StartByteReceived: m_sampleNumber = actbyte; + m_readState = ParserAutomaton_SampleNumberReceived; + break; + + // Sample number received, next bytes hold the EEG data + /* + * Note: values are 24-bit signed, MSB first + * Bytes 3-5: Data value for EEG channel 1 + * Bytes 6-8: Data value for EEG channel 2 + * Bytes 9-11: Data value for EEG channel 3 + * Bytes 12-14: Data value for EEG channel 4 + * Bytes 15-17: Data value for EEG channel 5 + * Bytes 18-20: Data value for EEG channel 6 + * Bytes 21-23: Data value for EEG channel 6 + * Bytes 24-26: Data value for EEG channel 8 + */ + case ParserAutomaton_SampleNumberReceived: if (m_extractPosition < EEG_VALUE_COUNT_PER_SAMPLE) + { + // fill EEG buffer + if (m_sampleBufferPosition < EEG_VALUE_BUFFER_SIZE) + { + m_eegValueBuffers[m_sampleBufferPosition] = actbyte; + m_sampleBufferPosition++; + } + + // we got EEG value + if (m_sampleBufferPosition == EEG_VALUE_BUFFER_SIZE) + { + // fill EEG channel buffer, converting at the same time from 24 to 32 bits + scaling + m_sampleEEGBuffers[m_extractPosition] = float(this->interpret24bitAsInt32(m_eegValueBuffers)) * m_unitsToMicroVolts; + + // reset for next value + m_sampleBufferPosition = 0; + m_extractPosition++; + } + } + + // finished with EEG + if (m_extractPosition == EEG_VALUE_COUNT_PER_SAMPLE) + { + // next step: accelerometer + m_readState = ParserAutomaton_EEGSamplesReceived; + // re-use the same variable to know position inside accelerometer block (I know, I'm bad!). + m_extractPosition = 0; + m_nValidAccelerometer = 0; + } + break; + + // EEG Samples received, next bytes hold the Accelerometer data + /* + * Note: values are 16-bit signed, MSB first + * Bytes 27-28: Data value for accelerometer channel X + * Bytes 29-30: Data value for accelerometer channel Y + * Bytes 31-32: Data value for accelerometer channel Z + */ + case ParserAutomaton_EEGSamplesReceived: if (m_extractPosition < ACC_VALUE_COUNT_PER_SAMPLE) + { + // fill Acc buffer + if (m_sampleBufferPosition < ACC_VALUE_BUFFER_SIZE) + { + m_accValueBuffers[m_sampleBufferPosition] = actbyte; + m_sampleBufferPosition++; + } + + // we got Acc value + if (m_sampleBufferPosition == ACC_VALUE_BUFFER_SIZE) + { + // fill Acc channel buffer, converting at the same time from 16 to 32 bits + m_sampleAccBuffersTemp[m_extractPosition] = float(this->interpret16bitAsInt32(m_accValueBuffers)) * m_unitsToRadians; + if (m_sampleAccBuffersTemp[m_extractPosition] != 0) { m_nValidAccelerometer++; } + + // reset for next value + m_sampleBufferPosition = 0; + m_extractPosition++; + } + } + + // finished with acc + if (m_extractPosition == ACC_VALUE_COUNT_PER_SAMPLE) + { + // next step: footer + m_readState = ParserAutomaton_AccelerometerSamplesReceived; + + if (m_nValidAccelerometer == ACC_VALUE_COUNT_PER_SAMPLE) { m_sampleAccBuffers.swap(m_sampleAccBuffersTemp); } + } + break; + + // Accelerometer Samples received, now expect a stop byte to terminate the frame + case ParserAutomaton_AccelerometerSamplesReceived: + // expected footer: perfect, returns sample number + if (actbyte == SAMPLE_STOP_BYTE) + { + // we shall pass + status = true; + // we're ockay for next time + m_seenPacketFooter = true; + } + // if last byte is not the one expected, discard whole sample + else { } + // whatever happened, it'll be the end of this journey + m_readState = ParserAutomaton_Default; + break; + + // uh-oh, should not be there + default: if (actbyte == SAMPLE_STOP_BYTE) + { + // we're ockay for next time + m_seenPacketFooter = true; + } + m_readState = ParserAutomaton_Default; + break; + } + + // if it's a GO, returns sample number, may trigger channel push + if (status) { return m_sampleNumber; } + // by default we're not ready + return -1; +} + +//___________________________________________________________________// +// // + +// if waitForResponse, will wait response before leaving the function (until timeout is reached) +// if logResponse, the actual response is sent to log manager +// timeout: time to sleep between each character written (in ms) +bool CDriverOpenBCI::sendCommand(const FD_TYPE fileDesc, const char* cmd, const bool waitForResponse, const bool logResponse, const uint32_t timeout, + std::string& reply) +{ + const uint32_t size = strlen(cmd); + reply = ""; + + // no command: don't go further + if (size == 0) { return true; } + + // write command to the board + for (size_t i = 0; i < size; ++i) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << this->m_driverName << ": Sending sequence to OpenBCI board [" << std::string(1, cmd[i]) << "]\n"; + if (this->writeToDevice(fileDesc, &cmd[i], 1) == WRITE_ERROR) { return false; } + + // wait for response + if (waitForResponse) + { + // buffer for serial reading + std::ostringstream readStream; + + uint64_t out = timeout; + const uint64_t tStart = System::Time::getTime(); + bool finished = false; + while (System::Time::getTime() - tStart < out && !finished) + { + const uint32_t readLength = this->readFromDevice(fileDesc, &m_readBuffers[0], m_readBuffers.size(), 10); + if (readLength == READ_ERROR) { return false; } + readStream.write(reinterpret_cast(&m_readBuffers[0]), readLength); + + // early stop when the "$$$" pattern is detected + const std::string& content = readStream.str(); + const std::string earlyStop = "$$$"; + if (content.size() >= earlyStop.size()) + { + if (content.substr(content.size() - earlyStop.size(), earlyStop.size()) == earlyStop) { finished = true; } + } + } + + if (!finished) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << this->m_driverName << ": After " << out << + "ms, timed out while waiting for board response !\n"; + } + + // now log response to log manager + if (logResponse) + { + // readStream stream to std::string and then to const to please log manager + if (!readStream.str().empty()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << this->m_driverName << ": " << ( + finished ? "Board response" : "Partial board response") << " was (size=" << readStream.str().size() << ") :\n"; + m_driverCtx.getLogManager() << readStream.str() << "\n"; + } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << this->m_driverName << ": Board did not reply !\n"; } + } + + // saves reply + reply += readStream.str(); + } + else + { + // When no reply is expected, wait at least 100ms that the commands hits the device + System::Time::sleep(100); + } + } + + return true; +} + +bool CDriverOpenBCI::resetBoard(const FD_TYPE fileDescriptor, const bool regularInitialization) +{ + const uint32_t startTime = System::Time::getTime(); + std::string reply; + + // stop/reset/default board + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << this->m_driverName << ": Stopping board streaming...\n"; + if (!this->sendCommand(fileDescriptor, "s", true, false, m_flushBoardReplyTimeout, reply) + ) // the waiting serves to flush pending samples after stopping the streaming + { + m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << this->m_driverName << ": Did not succeed in stopping board !\n"; + return false; + } + + // regular initialization of the board (not for recovery) + if (regularInitialization) + { + std::string line; + + // reset 32-bit board (no effect with 8bit board) + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << this->m_driverName << ": Soft reseting of the board...\n"; + if (!this->sendCommand(fileDescriptor, "v", true, true, m_readBoardReplyTimeout, reply)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << this->m_driverName << ": Did not succeed in soft reseting board !\n"; + return false; + } + + // gets meaningful information from reply + // WARNING - The parsing here is not very robust + // The parsing here is very dependant on the current protocol definition + std::istringstream cmdReplyInputStringStream(reply); + memset(&m_deviceInfo, 0, sizeof(m_deviceInfo)); + while (std::getline(cmdReplyInputStringStream, line, '\n')) + { + if (line != "$$$") + { + sscanf(line.c_str(), "OpenBCI V%u %u channel", &m_deviceInfo.deviceVersion, &m_deviceInfo.deviceChannelCount); + sscanf(line.c_str(), "On Board %s Device ID: 0x%x", m_deviceInfo.boardChipset, &m_deviceInfo.boardId); + sscanf(line.c_str(), "On Daisy %s Device ID: 0x%x", m_deviceInfo.daisyChipset, &m_deviceInfo.daisyId); + sscanf(line.c_str(), "%[^ ] Device ID: 0x%x", m_deviceInfo.mocapChipset, &m_deviceInfo.mocapId); + } + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << this->m_driverName << ": Got board config\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << this->m_driverName << ": Version: " << m_deviceInfo.deviceVersion << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << this->m_driverName << ": Channel count: " << m_deviceInfo.deviceChannelCount << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << this->m_driverName << ": Board (devid:" << m_deviceInfo.boardId << ", devchip:" << m_deviceInfo. + boardChipset << ")\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << this->m_driverName << ": Daisy (devid:" << m_deviceInfo.daisyId << ", devchip:" << m_deviceInfo. + daisyChipset << ")\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << this->m_driverName << ": Mocap (devid:" << m_deviceInfo.mocapId << ", devchip:" << m_deviceInfo. + mocapChipset << ")\n"; + + // verifies openbci board presence + if (m_deviceInfo.deviceVersion == 0x00) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << this->m_driverName << ": The attached device does not look like an OpenBCI device\n"; + return false; + } + + // verifies daisy module presence + if (m_deviceInfo.daisyId == 0x00 && m_daisyModule) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << this->m_driverName << + ": The attached device does not match current configuration with Daisy module requested while not connected on the board\n"; + return false; + } + + // After discussin with @Aj May 2016 it has been decided to disable + // the daisy module when it was present and not requested instead of + // checking its presence + +#if 0 + // verifies daisy module absence + if(m_deviceInfo.daisyId!=0x00 && !m_daisyModule) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << this->m_driverName << ": Configured without daisy module while present on the board, please unplug\n"; + return false; + } +#else + // Disables daisy module when necessary + if (m_deviceInfo.daisyId != 0x00 && !m_daisyModule) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << this->m_driverName << ": Daisy module present but not requested, will now be disabled\n"; + if (!this->sendCommand(fileDescriptor, "c", true, true, m_readBoardReplyTimeout, reply)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << this->m_driverName << ": Did not succeed in disabling daisy module !\n"; + return false; + } + } +#endif + + // sends additional commands if necessary + std::istringstream ss(m_additionalCmds.toASCIIString()); + while (std::getline(ss, line, '\255')) + { + if (line.length() > 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << this->m_driverName << ": Additional custom commands for initialization : [" << line << "]\n"; + if (!this->sendCommand(fileDescriptor, line.c_str(), true, true, m_readBoardReplyTimeout, reply)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << this->m_driverName << ": Did not succeed sending additional command [" << line + << "] !\n"; + return false; + } + } + } + } + + // start stream + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << this->m_driverName << ": Starting stream...\n"; + if (!this->sendCommand(fileDescriptor, "b", false, false, m_readBoardReplyTimeout, reply)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << this->m_driverName << ": Did not succeed starting stream\n"; + return false; + } + + // should start streaming! + m_startTime = System::Time::getTime(); + m_tick = m_startTime; + m_lastPacketNumber = UNINITIALIZED_PACKET_NUMBER; + m_droppedSampleTimes.clear(); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << this->m_driverName << ": Status ready (initialization took " << m_tick - startTime + << "ms)\n"; + + return true; +} + +// update internal state (lastPacket, number of packet processed, etc.). +// returns true if a new sample is created +bool CDriverOpenBCI::handleCurrentSample(const int packetNumber) +{ + bool ok = false; // true if a sample is added to m_channelBuffers + // if == -1, current sample is incomplete or corrupted + if (packetNumber >= 0) + { + bool hasDroppedSamples = false; + + // check packet drop + if ((m_lastPacketNumber != UNINITIALIZED_PACKET_NUMBER) && ((m_lastPacketNumber + 1) % 256 != packetNumber)) + { + const uint32_t sampleTime = System::Time::getTime() - m_startTime; + while (!m_droppedSampleTimes.empty() && sampleTime - m_droppedSampleTimes.front() > 1000) { m_droppedSampleTimes.pop_front(); } + hasDroppedSamples = true; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << this->m_driverName << ": Packet dropped! [Last,Current]=[" << int(m_lastPacketNumber) << + "," << packetNumber << "] (that was " << uint32_t(m_droppedSampleTimes.size() + 1) << " dropped samples lately)\n"; + + if (sampleTime > m_droppedSampleSafetyDelayBeforeReset) + { + m_droppedSampleTimes.push_back(sampleTime); + if (m_droppedSampleTimes.size() > m_droppedSampleCountBeforeReset) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << this->m_driverName << + ": Too many samples dropped, will now attempt to recover with a reset of the board\n"; + if (!this->resetBoard(m_fileDesc, false)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << this->m_driverName << ": Did not succeed reseting board\n"; + return false; + } + } + } + } + + // no daisy module: push directly values + if (!m_daisyModule) + { + // concatenate EEG and Acc + // YRD NOTE: OPENBCI ACCELEROMETERS ARE SAMPLED WAY BELOW EEG (~25Hz, depends upon firmware) + // YRD NOTE: CONSEQUENTLY, THIS CODE CREATES BLOCKS OF DUPLICATES ACCELEROMETERS SAMPLES + + std::copy(m_sampleEEGBuffers.begin(), m_sampleEEGBuffers.end(), m_sampleBuffers.begin()); + std::copy(m_sampleAccBuffers.begin(), m_sampleAccBuffers.end(), m_sampleBuffers.begin() + m_sampleEEGBuffers.size()); + + // copy them to current chunk + m_channelBuffers.push_back(m_sampleBuffers); + ok = true; + } + // even: daisy, odd: first 8 channels + else + { + // on odd packet, got complete sample + if (packetNumber % 2) + { + // won't concatenate if there was packet drop + if (!hasDroppedSamples) + { + // Concatenate standard and daisy EEG values and Acc + // YRD NOTE: OPENBCI ACCELEROMETERS ARE SAMPLED WAY BELOW EEG (~25Hz, depends upon firmware) + // YRD NOTE: CONSEQUENTLY, THIS CODE CREATES BLOCKS OF DUPLICATES ACCELEROMETERS SAMPLES + + std::copy(m_sampleEEGBuffers.begin(), m_sampleEEGBuffers.end(), m_sampleBuffers.begin()); + std::copy(m_sampleEEGBuffersDaisy.begin(), m_sampleEEGBuffersDaisy.end(), m_sampleBuffers.begin() + m_sampleEEGBuffers.size()); + std::copy(m_sampleAccBuffers.begin(), m_sampleAccBuffers.end(), + m_sampleBuffers.begin() + m_sampleEEGBuffers.size() + m_sampleEEGBuffersDaisy.size()); + + // at last, add to chunk + m_channelBuffers.push_back(m_sampleBuffers); + ok = true; + } + } + // an even packet: it's Daisy, store values for later + else + { + // swap may modify origin, but it's faster + m_sampleEEGBuffersDaisy.swap(m_sampleEEGBuffers); + } + } + + m_lastPacketNumber = packetNumber; + } + + // something to read: won't have to poll before "long" + if (ok) { m_tick = System::Time::getTime(); } + + return ok; +} + +bool CDriverOpenBCI::openDevice(FD_TYPE* fileDesc, const uint32_t ttyNumber) +{ + CString ttyName; + + if (ttyNumber == UNDEFINED_DEVICE_IDENTIFIER) + { + // Tries to find an existing port to connect to + uint32_t i = 0; + bool success = false; + do + { + ttyName = CConfigurationOpenBCI::getTTYFileName(i++); + if (CConfigurationOpenBCI::isTTYFile(ttyName)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << this->m_driverName << ": Automatically picked port [" << i << ":" << ttyName << "]\n"; + success = true; + } + } while (!success && i < CConfigurationOpenBCI::getMaximumTtyCount()); + + if (!success) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << this->m_driverName << ": Port has not been configure and driver could not open any port\n"; + return false; + } + } + else { ttyName = CConfigurationOpenBCI::getTTYFileName(ttyNumber); } + +#if defined TARGET_OS_Windows + + DCB dcb = { 0 }; + *fileDesc = ::CreateFile(LPCSTR(ttyName.toASCIIString()), GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, + nullptr); + + if (*fileDesc == INVALID_HANDLE_VALUE) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << this->m_driverName << ": Could not open port [" << ttyName << "]\n"; + return false; + } + + if (!GetCommState(*fileDesc, &dcb)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << this->m_driverName << ": Could not get comm state on port [" << ttyName << "]\n"; + return false; + } + + // update DCB rate, byte size, parity, and stop bits size + dcb.DCBlength = sizeof(dcb); + dcb.BaudRate = TERM_SPEED; + dcb.ByteSize = 8; + dcb.Parity = NOPARITY; + dcb.StopBits = ONESTOPBIT; + dcb.EvtChar = '\0'; + + // update flow control settings + dcb.fDtrControl = DTR_CONTROL_ENABLE; + dcb.fRtsControl = RTS_CONTROL_ENABLE; + dcb.fOutxCtsFlow = FALSE; + dcb.fOutxDsrFlow = FALSE; + dcb.fDsrSensitivity = FALSE; + dcb.fOutX = FALSE; + dcb.fInX = FALSE; + dcb.fTXContinueOnXoff = FALSE; + dcb.XonChar = 0; + dcb.XoffChar = 0; + dcb.XonLim = 0; + dcb.XoffLim = 0; + dcb.fParity = FALSE; + + SetCommState(*fileDesc, &dcb); + SetupComm(*fileDesc, 64/*1024*/, 64/*1024*/); + EscapeCommFunction(*fileDesc, SETDTR); + SetCommMask(*fileDesc, EV_RXCHAR | EV_CTS | EV_DSR | EV_RLSD | EV_RING); + +#elif defined TARGET_OS_Linux + + struct termios terminalAttributes; + + if((*fileDesc=::open(ttyName.toASCIIString(), O_RDWR))==-1) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << this->m_driverName << ": Could not open port [" << ttyName << "]\n"; + return false; + } + + if(tcgetattr(*fileDesc, &terminalAttributes)!=0) + { + ::close(*fileDesc); + *fileDesc=-1; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << this->m_driverName << ": terminal: tcgetattr() failed - did you use the right port [" << ttyName << "] ?\n"; + return false; + } + + /* terminalAttributes.c_cflag = TERM_SPEED | CS8 | CRTSCTS | CLOCAL | CREAD; */ + terminalAttributes.c_cflag = TERM_SPEED | CS8 | CLOCAL | CREAD; + terminalAttributes.c_iflag = 0; + terminalAttributes.c_oflag = OPOST | ONLCR; + terminalAttributes.c_lflag = 0; + if(tcsetattr(*fileDesc, TCSAFLUSH, &terminalAttributes)!=0) + { + ::close(*fileDesc); + *fileDesc=-1; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << this->m_driverName << ": terminal: tcsetattr() failed - did you use the right port [" << ttyName << "] ?\n"; + return false; + } + +#else + return false; +#endif + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << this->m_driverName << ": Successfully opened port [" << ttyName << "]\n"; + m_ttyName = ttyName; + return true; +} + +void CDriverOpenBCI::closeDevice(const FD_TYPE fileDesc) +{ +#if defined TARGET_OS_Windows + CloseHandle(fileDesc); +#elif defined TARGET_OS_Linux + ::close(fileDesc); +#else +#endif +} + +uint32_t CDriverOpenBCI::writeToDevice(const FD_TYPE fileDesc, const void* buffer, const uint32_t size) +{ +#if defined TARGET_OS_Windows + DWORD length = 0; + if (FALSE == WriteFile(fileDesc, buffer, size, &length, nullptr)) { return WRITE_ERROR; } + const int count = int(length); +#elif defined TARGET_OS_Linux + const int count = ::write(fileDesc, buffer, size); + if(count < 0) { return WRITE_ERROR; } +#else + return WRITE_ERROR; +#endif + + return uint32_t(count); +} + +uint32_t CDriverOpenBCI::readFromDevice(const FD_TYPE fileDesc, void* buffer, const uint32_t size, const uint64_t timeOut) +{ +#if defined TARGET_OS_Windows + + uint32_t readLength = 0; + uint32_t readOk = 0; + struct _COMSTAT status; + DWORD state; + + if (ClearCommError(fileDesc, &state, &status)) { readLength = (status.cbInQue < size ? status.cbInQue : size); } + + if (readLength > 0) + { + if (FALSE == ReadFile(fileDesc, buffer, readLength, LPDWORD(&readOk), nullptr)) { return READ_ERROR; } + return readLength; + } + return 0; + +#elif defined TARGET_OS_Linux + + fd_set inputFileDescSet; + struct timeval val; + bool finished=false; + + val.tv_sec=0; + val.tv_usec=((timeOut>>20)*1000*1000)>>12; + + uint32_t bytesLeftToRead=size; + do + { + FD_ZERO(&inputFileDescSet); + FD_SET(fileDesc, &inputFileDescSet); + + switch(select(fileDesc + 1, &inputFileDescSet, nullptr, nullptr, &val)) + { + case -1: // error + return READ_ERROR; + + case 0: // timeout + finished = true; + break; + + default: + if(FD_ISSET(fileDesc, &inputFileDescSet)) + { + size_t readLength=::read(fileDesc, reinterpret_cast(buffer)+size-bytesLeftToRead, bytesLeftToRead); + if(readLength <= 0) { finished = true; } + else { bytesLeftToRead-=uint32_t(readLength); } + } + else { finished = true; } + break; + } + } + while(!finished && bytesLeftToRead != 0); + + return size - bytesLeftToRead; +#else + return 0; +#endif +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/src/ovasCDriverOpenBCI.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/src/ovasCDriverOpenBCI.h new file mode 100644 index 0000000..902bfc0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openbci/src/ovasCDriverOpenBCI.h @@ -0,0 +1,156 @@ +/* + * OpenBCI driver for OpenViBE + * + * \author Jeremy Frey + * \author Yann Renard + * + */ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#if defined TARGET_OS_Windows +typedef void* FD_TYPE; +#elif defined TARGET_OS_Linux + typedef int FD_TYPE; +#else +#endif + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverOpenBCI + * \author Jeremy Frey + * \author Yann Renard + */ +class CDriverOpenBCI final : public IDriver +{ +public: + + explicit CDriverOpenBCI(IDriverContext& ctx); + void release() { delete this; } + const char* getName() override { return m_driverName.toASCIIString(); } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + typedef enum + { + ParserAutomaton_Default, + ParserAutomaton_StartByteReceived, + ParserAutomaton_SampleNumberReceived, + ParserAutomaton_EEGSamplesReceived, + ParserAutomaton_AccelerometerSamplesReceived, + } EParserAutomaton; + +protected: + + int interpret24bitAsInt32(const std::vector& byteBuffer); + int interpret16bitAsInt32(const std::vector& byteBuffer); + int16_t parseByte(uint8_t actbyte); + + bool sendCommand(FD_TYPE fileDesc, const char* cmd, bool waitForResponse, bool logResponse, uint32_t timeout, std::string& reply); + bool resetBoard(FD_TYPE fileDescriptor, bool regularInitialization); + bool handleCurrentSample(int packetNumber); // will take car of samples fetch from OpenBCI board, dropping/merging packets if necessary + void updateDaisy(bool quietLogging); // update internal state regarding daisy module + + bool openDevice(FD_TYPE* fileDesc, uint32_t ttyNumber); + static void closeDevice(FD_TYPE fileDesc); + static uint32_t writeToDevice(FD_TYPE fileDesc, const void* buffer, uint32_t size); + static uint32_t readFromDevice(FD_TYPE fileDesc, void* buffer, uint32_t size, uint64_t timeOut = 0); + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + FD_TYPE m_fileDesc; + + CString m_driverName = "OpenBCI"; + CString m_ttyName; + CString m_additionalCmds; // string to send possibly upon initialisation + uint32_t m_nChannel = EEG_VALUE_BUFFER_SIZE + ACC_VALUE_BUFFER_SIZE; + uint32_t m_deviceID = uint32_t(-1); + uint32_t m_readBoardReplyTimeout = 5000; // parameter com init string + uint32_t m_flushBoardReplyTimeout = 500; // parameter com init string + bool m_daisyModule = false; // daisy module attached or not + + // OpenBCI protocol related + int16_t m_sampleNumber = 0; // returned by the board + uint32_t m_readState = 0; // position in the sample (see doc) + uint8_t m_sampleBufferPosition = 0; // position in the buffer + std::vector m_eegValueBuffers; // buffer for one EEG value (int24) + std::vector m_accValueBuffers; // buffer for one accelerometer value (int16_t) + const static uint8_t EEG_VALUE_BUFFER_SIZE = 3; // int24 == 3 bytes + const static uint8_t ACC_VALUE_BUFFER_SIZE = 2; // int16_t == 2 bytes + const static uint8_t EEG_VALUE_COUNT_PER_SAMPLE = 8; // the board send EEG values 8 by 8 (will concatenate 2 samples with daisy module) + const static uint8_t ACC_VALUE_COUNT_PER_SAMPLE = 3; // 3 accelerometer data per sample + + uint32_t m_missingSampleDelayBeforeReset = 0; // in ms - value acquired from configuration manager + uint32_t m_droppedSampleCountBeforeReset = 0; // in samples - value acquired from configuration manager + uint32_t m_droppedSampleSafetyDelayBeforeReset = 0; // in ms - value acquired from configuration manager + + std::deque m_droppedSampleTimes; + + float m_unitsToMicroVolts = 0; // convert from int to microvolt + float m_unitsToRadians = 0; // converts from int16_t to radians + uint32_t m_extractPosition = 0; // used to situate sample reading both with EEG and accelerometer data + uint32_t m_nValidAccelerometer = 0; + int m_lastPacketNumber = 0; // used to detect consecutive packets when daisy module is used + + // buffer for multibyte reading over serial connection + std::vector m_readBuffers; + // buffer to store sample coming from OpenBCI -- filled by parseByte(), passed to handleCurrentSample() + std::vector m_sampleEEGBuffers; + std::vector m_sampleEEGBuffersDaisy; + std::vector m_sampleAccBuffers; + std::vector m_sampleAccBuffersTemp; + + // buffer to store aggregated samples + std::vector> m_channelBuffers; // buffer to store channels & chunks + std::vector m_sampleBuffers; + + bool m_seenPacketFooter = false; // extra precaution to sync packets + + // mechanism to call resetBoard() if no data are received + uint32_t m_tick = 0; // last tick for polling + uint32_t m_startTime = 0; // actual time since connection + + // sample storing for device callback and serial i/o + std::vector m_callbackSamples; + +private: + + typedef struct + { + uint32_t deviceVersion; + uint32_t deviceChannelCount; + + uint32_t boardId; + uint32_t daisyId; + uint32_t mocapId; + + char boardChipset[64]; + char daisyChipset[64]; + char mocapChipset[64]; + } device_information_t; + + device_information_t m_deviceInfo; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openeeg-modulareeg/share/interface-OpenEEG-ModularEEG.ui b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openeeg-modulareeg/share/interface-OpenEEG-ModularEEG.ui new file mode 100644 index 0000000..684b44a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openeeg-modulareeg/share/interface-OpenEEG-ModularEEG.ui @@ -0,0 +1,369 @@ + + + + + + 6 + 1 + 6 + 1 + 10 + + + 18 + 100 + 1 + 10 + + + 100 + 1 + 10 + + + + + + + + + unspecified + + + female + + + male + + + unknown + + + + + + + + + + + 253 + + + 254 + + + 255 + + + 256 + + + 257 + + + 258 + + + 259 + + + + + 5 + Device configuration + center + dialog + center + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 8 + + + True + Modular-EEG Configuration (6 channels) + +<small><span color="darkred">Attention: Sampling frequency may need +some adjustment to best fit the device clock</span></small> + True + center + + + 1 + + + + + True + + + False + 2 + + + + + True + 8 + 8 + + + True + 8 + + + True + 6 + 2 + True + + + True + True + adjustment1 + True + True + + + 1 + 2 + 3 + 4 + + + + + True + Number of channels : + right + True + + + 3 + 4 + + + + + True + + + + 0 + + + + + 1 + 2 + 4 + 5 + + + + + True + Device : + right + True + + + 4 + 5 + + + + + True + model1 + + + + 0 + + + + + 1 + 2 + 2 + 3 + + + + + True + True + adjustment2 + True + True + + + 1 + 2 + 1 + 2 + + + + + True + True + adjustment3 + True + True + + + 1 + 2 + + + + + True + Gender : + right + True + + + 2 + 3 + + + + + True + Age : + right + True + + + 1 + 2 + + + + + True + Identifier : + right + True + + + + + True + model2 + + + + 0 + + + + + 1 + 2 + 5 + 6 + + + + + True + Sampling frequency : + right + True + + + 5 + 6 + + + + + 0 + + + + + 0 + + + + + Change channel names + True + False + False + + + False + 1 + + + + + 3 + + + + + True + + + False + 4 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + gtk-apply + True + False + False + True + + + False + False + 0 + + + + + gtk-cancel + True + False + False + True + + + False + False + 1 + + + + + False + end + 0 + + + + + + button_apply + button_cancel + + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openeeg-modulareeg/src/ovasCConfigurationOpenEEGModularEEG.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openeeg-modulareeg/src/ovasCConfigurationOpenEEGModularEEG.cpp new file mode 100644 index 0000000..6cdadb4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openeeg-modulareeg/src/ovasCConfigurationOpenEEGModularEEG.cpp @@ -0,0 +1,68 @@ +/* + * \author Christoph Veigl, Yann Renard + * + * \copyright AGPL3 + * + */ +#include "ovasCConfigurationOpenEEGModularEEG.h" +#include + +namespace OpenViBE { +namespace AcquisitionServer { + +CConfigurationOpenEEGModularEEG::CConfigurationOpenEEGModularEEG(const char* gtkBuilderFilename, uint32_t& usbIdx) + : CConfigurationBuilder(gtkBuilderFilename), m_usbIdx(usbIdx) { m_listStore = gtk_list_store_new(1, G_TYPE_STRING); } + +CConfigurationOpenEEGModularEEG::~CConfigurationOpenEEGModularEEG() { g_object_unref(m_listStore); } + +bool CConfigurationOpenEEGModularEEG::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + GtkComboBox* box = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + + g_object_unref(m_listStore); + m_listStore = gtk_list_store_new(1, G_TYPE_STRING); + + gtk_combo_box_set_model(box, GTK_TREE_MODEL(m_listStore)); + + bool selected = false; + + for (uint32_t i = 1; i < 17; ++i) + { + std::stringstream ss; +#if defined TARGET_OS_Windows + ss << "\\\\.\\COM" << i; +#elif defined TARGET_OS_Linux + if(i<10) { ss <<"/dev/ttyS" << i; } + else { ss << "/dev/ttyUSB%d"<< i-10; } +#endif + gtk_combo_box_append_text(box, ss.str().c_str()); + if (m_usbIdx == i) + { + gtk_combo_box_set_active(box, i - 1); + selected = true; + } + } + + if (!selected) { gtk_combo_box_set_active(box, 0); } + + return true; +} + +bool CConfigurationOpenEEGModularEEG::postConfigure() +{ + GtkComboBox* box = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + + if (m_applyConfig) + { + const int usbIndex = gtk_combo_box_get_active(box); + if (usbIndex >= 0) { m_usbIdx = uint32_t(usbIndex) + 1; } + } + + if (!CConfigurationBuilder::postConfigure()) { return false; } + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openeeg-modulareeg/src/ovasCConfigurationOpenEEGModularEEG.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openeeg-modulareeg/src/ovasCConfigurationOpenEEGModularEEG.h new file mode 100644 index 0000000..cd27205 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openeeg-modulareeg/src/ovasCConfigurationOpenEEGModularEEG.h @@ -0,0 +1,29 @@ +/* + * \author Christoph Veigl, Yann Renard + * + * \copyright AGPL3 + * + */ +#pragma once + +#include "../ovasCConfigurationBuilder.h" + +#include + +namespace OpenViBE { +namespace AcquisitionServer { +class CConfigurationOpenEEGModularEEG final : public CConfigurationBuilder +{ +public: + CConfigurationOpenEEGModularEEG(const char* gtkBuilderFilename, uint32_t& usbIdx); + ~CConfigurationOpenEEGModularEEG() override; + + bool preConfigure() override; + bool postConfigure() override; + +protected: + uint32_t& m_usbIdx; + GtkListStore* m_listStore = nullptr; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openeeg-modulareeg/src/ovasCDriverOpenEEGModularEEG.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openeeg-modulareeg/src/ovasCDriverOpenEEGModularEEG.cpp new file mode 100755 index 0000000..3dc74ac --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openeeg-modulareeg/src/ovasCDriverOpenEEGModularEEG.cpp @@ -0,0 +1,359 @@ +/* + * \author Christoph Veigl, Yann Renard + * + * \copyright AGPL3 + * + */ +#include "ovasCDriverOpenEEGModularEEG.h" +#include "ovasCConfigurationOpenEEGModularEEG.h" + +#include + +#include + +#if defined TARGET_OS_Windows +#include +#include +#include +#include +#define TERM_SPEED 57600 +#elif defined TARGET_OS_Linux + #include + #include + #include + #include + #include + #define TERM_SPEED B57600 +#else +#endif + + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverOpenEEGModularEEG::CDriverOpenEEGModularEEG(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_OpenEEG-ModularEEG", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(256); + m_header.setChannelCount(m_nChannel); + + m_settings.add("Header", &m_header); + m_settings.add("DeviceIdentifier", &m_deviceID); + m_settings.load(); +} + +//___________________________________________________________________// +// // + +bool CDriverOpenEEGModularEEG::initialize(const uint32_t /*nSamplePerSentBlock*/, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + m_readState = 0; + m_extractPos = 0; + + if (!this->initTTY(&m_fileDesc, m_deviceID != uint32_t(-1) ? m_deviceID : 1)) { return false; } + + m_sample = new float[m_header.getChannelCount()]; + if (!m_sample) + { + delete [] m_sample; + m_sample = nullptr; + return false; + } + m_channelBuffers2.resize(6); + + m_callback = &callback; + m_nChannel = m_header.getChannelCount(); + m_lastPacketNumber = 0; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << this->getName() << " driver initialized.\n"; + return true; +} + +bool CDriverOpenEEGModularEEG::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << this->getName() << " driver started.\n"; + return true; +} + +bool CDriverOpenEEGModularEEG::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + + if (this->readPacketFromTTY(m_fileDesc) < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "Could not receive data from " << m_ttyName << "\n"; + return false; + } + + if (!m_channelBuffers.empty()) + { + if (m_driverCtx.isStarted()) + { + for (size_t i = 0; i < m_channelBuffers.size(); ++i) + { + for (uint32_t j = 0; j < m_nChannel; ++j) { m_sample[j] = float(m_channelBuffers[i][j]) - 512.0F; } + m_callback->setSamples(m_sample, 1); + } + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + m_channelBuffers.clear(); + } + + return true; +} + +bool CDriverOpenEEGModularEEG::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << CString(this->getName()) << " driver stopped.\n"; + return true; +} + +bool CDriverOpenEEGModularEEG::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + this->closeTTY(m_fileDesc); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << CString(this->getName()) << " driver closed.\n"; + + delete [] m_sample; + m_sample = nullptr; + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverOpenEEGModularEEG::configure() +{ + CConfigurationOpenEEGModularEEG config(Directories::getDataDir() + "/applications/acquisition-server/interface-OpenEEG-ModularEEG.ui", m_deviceID); + if (!config.configure(m_header)) { return false; } + m_settings.save(); + return true; +} + +//___________________________________________________________________// +// // +bool CDriverOpenEEGModularEEG::parseByteP2(const uint8_t actbyte) +{ + switch (m_readState) + { + case 0: + if (actbyte == 165) { m_readState++; } + break; + + case 1: + if (actbyte == 90) { m_readState++; } + else { m_readState = 0; } + break; + + case 2: + m_readState++; + break; + + case 3: + m_packetNumber = actbyte; + m_extractPos = 0; + m_readState++; + break; + + case 4: + if (m_extractPos < 12) + { + if ((m_extractPos & 1) == 0) { if (uint32_t(m_extractPos >> 1) < m_nChannel) { m_channelBuffers2[m_extractPos >> 1] = int(actbyte) << 8; } } + else { if (uint32_t(m_extractPos >> 1) < m_nChannel) { m_channelBuffers2[m_extractPos >> 1] += actbyte; } } + m_extractPos++; + } + else + { + m_channelBuffers.push_back(m_channelBuffers2); + m_switches = actbyte; + m_readState = 0; + return true; + } + break; + + default: m_readState = 0; + break; + } + return false; +} + +bool CDriverOpenEEGModularEEG::initTTY(FD_TYPE* descriptor, const uint32_t ttyNumber) +{ + char ttyName[1024]; + +#if defined TARGET_OS_Windows + + sprintf(ttyName, "\\\\.\\COM%d", ttyNumber); + DCB dcb = { 0 }; + *descriptor = ::CreateFile(LPCSTR(ttyName), GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); + + if (*descriptor == INVALID_HANDLE_VALUE) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not open port [" << CString(ttyName) << "]\n"; + return false; + } + + if (!GetCommState(*descriptor, &dcb)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not get comm state on port [" << CString(ttyName) << "]\n"; + return false; + } + + // update DCB rate, byte size, parity, and stop bits size + dcb.DCBlength = sizeof(dcb); + dcb.BaudRate = CBR_56000; + dcb.ByteSize = 8; + dcb.Parity = NOPARITY; + dcb.StopBits = ONESTOPBIT; + dcb.EvtChar = '\0'; + + // update flow control settings + dcb.fDtrControl = DTR_CONTROL_ENABLE; + dcb.fRtsControl = RTS_CONTROL_ENABLE; + dcb.fOutxCtsFlow = FALSE; + dcb.fOutxDsrFlow = FALSE; + dcb.fDsrSensitivity = FALSE; + dcb.fOutX = FALSE; + dcb.fInX = FALSE; + dcb.fTXContinueOnXoff = FALSE; + dcb.XonChar = 0; + dcb.XoffChar = 0; + dcb.XonLim = 0; + dcb.XoffLim = 0; + dcb.fParity = FALSE; + + SetCommState(*descriptor, &dcb); + SetupComm(*descriptor, 64/*1024*/, 64/*1024*/); + EscapeCommFunction(*descriptor, SETDTR); + SetCommMask(*descriptor, EV_RXCHAR | EV_CTS | EV_DSR | EV_RLSD | EV_RING); + +#elif defined TARGET_OS_Linux + + struct termios terminalAtt; + + // open ttyS for i < 10, else open ttyUSB + if(ttyNumber<10) { ::sprintf(ttyName, "/dev/ttyS%d", ttyNumber); } + else { ::sprintf(ttyName, "/dev/ttyUSB%d", ttyNumber-10); } + + if((*descriptor=::open(ttyName, O_RDWR))==-1) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not open port [" << CString(ttyName) << "]\n"; + return false; + } + + if(tcgetattr(*descriptor, &terminalAtt)!=0) + { + ::close(*descriptor); + *descriptor=-1; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "terminal: tcgetattr() failed - did you use the right port [" << CString(ttyName) << "] ?\n"; + return false; + } + + /* terminalAtt.c_cflag = TERM_SPEED | CS8 | CRTSCTS | CLOCAL | CREAD; */ + terminalAtt.c_cflag = TERM_SPEED | CS8 | CLOCAL | CREAD; + terminalAtt.c_iflag = 0; + terminalAtt.c_oflag = OPOST | ONLCR; + terminalAtt.c_lflag = 0; + if(tcsetattr(*descriptor, TCSAFLUSH, &terminalAtt)!=0) + { + ::close(*descriptor); + *descriptor=-1; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "terminal: tcsetattr() failed - did you use the right port [" << CString(ttyName) << "] ?\n"; + return false; + } + +#else + + return false; + +#endif + + m_ttyName = ttyName; + return true; +} + +void CDriverOpenEEGModularEEG::closeTTY(const FD_TYPE fileDesc) +{ +#if defined TARGET_OS_Windows + CloseHandle(fileDesc); +#elif defined TARGET_OS_Linux + ::close(fileDesc); +#else +#endif +} + +int CDriverOpenEEGModularEEG::readPacketFromTTY(const FD_TYPE fileDesc) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Enters readPacketFromTTY\n"; + + uint8_t readBuffer[100]; + int packetsProcessed = 0; + +#if defined TARGET_OS_Windows + + uint32_t readLength = 0; + uint32_t readOk = 0; + struct _COMSTAT status; + DWORD state; + + if (ClearCommError(fileDesc, &state, &status)) { readLength = status.cbInQue; } + + for (uint32_t i = 0; i < readLength; i++) + { + ReadFile(fileDesc, readBuffer, 1, LPDWORD(&readOk), nullptr); + if (readOk == 1) { if (this->parseByteP2(readBuffer[0])) { packetsProcessed++; } } + } + +#elif defined TARGET_OS_Linux + + fd_set inputFileDescSet; + struct timeval time; + size_t readLength=0; + bool finished=false; + + time.tv_sec=0; + time.tv_usec=0; + + do + { + FD_ZERO(&inputFileDescSet); + FD_SET(fileDesc, &inputFileDescSet); + + switch(select(fileDesc+1, &inputFileDescSet, nullptr, nullptr, &time)) + { + case -1: // error or timeout + case 0: + finished=true; + break; + + default: + if(FD_ISSET(fileDesc, &inputFileDescSet)) + { + if((readLength=::read(fileDesc, readBuffer, 1)) > 0) + { + for (uint32_t i = 0; iparseByteP2(readBuffer[i])) { packetsProcessed++; } } + } + } + else { finished = true; } + break; + } + } + while(!finished); + +#else + +#endif + + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Leaves readPacketFromTTY\n"; + return packetsProcessed; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openeeg-modulareeg/src/ovasCDriverOpenEEGModularEEG.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openeeg-modulareeg/src/ovasCDriverOpenEEGModularEEG.h new file mode 100755 index 0000000..ad1ff8b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-drivers/openeeg-modulareeg/src/ovasCDriverOpenEEGModularEEG.h @@ -0,0 +1,79 @@ +/* + * \author Christoph Veigl, Yann Renard + * + * \copyright AGPL3 + */ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#if defined TARGET_OS_Windows +typedef void* FD_TYPE; +#elif defined TARGET_OS_Linux + typedef int FD_TYPE; +#else +#endif + +#include + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverOpenEEGModularEEG + * \author Christoph Veigl, Yann Renard + */ +class CDriverOpenEEGModularEEG final : public IDriver +{ +public: + + explicit CDriverOpenEEGModularEEG(IDriverContext& ctx); + void release() { delete this; } + const char* getName() override { return "OpenEEG Modular EEG P2"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + + // void logPacket(); + bool parseByteP2(uint8_t actbyte); + + bool initTTY(FD_TYPE* descriptor, uint32_t ttyNumber); + int readPacketFromTTY(FD_TYPE fileDesc); + static void closeTTY(FD_TYPE fileDesc); + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_nChannel = 6; + uint32_t m_deviceID = uint32_t(-1); + float* m_sample = nullptr; + + FD_TYPE m_fileDesc; + uint16_t m_readState = 0; + uint16_t m_extractPos = 0; + uint8_t m_packetNumber = 0; + uint8_t m_lastPacketNumber = 0; + uint16_t m_switches = 0; + + std::vector> m_channelBuffers; + std::vector m_channelBuffers2; + + CString m_ttyName; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/CMakeLists.txt new file mode 100644 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/external-stimulations/ovasCPluginExternalStimulations.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/external-stimulations/ovasCPluginExternalStimulations.cpp new file mode 100755 index 0000000..62c30d1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/external-stimulations/ovasCPluginExternalStimulations.cpp @@ -0,0 +1,220 @@ +#include "ovasCPluginExternalStimulations.h" + +#include + +#include +#include + +#include + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +namespace OpenViBE { +namespace AcquisitionServer { +namespace Plugins { + +CPluginExternalStimulations::CPluginExternalStimulations(const Kernel::IKernelContext& ctx) + : IAcquisitionServerPlugin(ctx, CString("AcquisitionServer_Plugin_ExternalStimulations")), m_ExternalStimulationsQueueName("openvibeExternalStimulations") +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Loading plugin: ExternalStimulations (deprecated)\n"; + + m_settings.add("EnableExternalStimulations", &m_IsExternalStimulationsEnabled); + m_settings.add("ExternalStimulationQueueName", &m_ExternalStimulationsQueueName); + m_settings.load(); +} + +// Hooks + + +bool CPluginExternalStimulations::startHook(const std::vector& /*selectedChannelNames*/, const size_t /*sampling*/, const size_t /*nChannel*/, const size_t /*nSamplePerSentBlock*/) +{ + if (m_IsExternalStimulationsEnabled) + { + ftime(&m_CTStartTime); + m_IsESThreadRunning = true; + m_ESthreadPtr.reset(new std::thread(std::bind(&CPluginExternalStimulations::readExternalStimulations, this))); + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "External stimulations (deprecated) activated...\n"; + } + m_ExternalStimulations.clear(); + + m_DebugExternalStimulationsSent = 0; + m_DebugCurrentReadIPCStimulations = 0; + m_DebugStimulationsLost = 0; + m_DebugStimulationsReceivedEarlier = 0; + m_DebugStimulationsReceivedLate = 0; + m_DebugStimulationsReceivedWrongSize = 0; + m_DebugStimulationsBuffered = 0; + + return true; +} + +void CPluginExternalStimulations::loopHook(std::deque>& /* vPendingBuffer */, CStimulationSet& stimulationSet, const uint64_t start, const uint64_t end, const uint64_t /* sampleTime */) +{ + if (m_IsExternalStimulationsEnabled) + { + //m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Checking for external stimulations:" << p << "\n"; + addExternalStimulations(&stimulationSet, m_kernelCtx.getLogManager(), start, end); + } +} + +void CPluginExternalStimulations::stopHook() +{ + if (m_IsExternalStimulationsEnabled) + { + m_IsESThreadRunning = false; + if (m_ESthreadPtr) { m_ESthreadPtr->join(); } + else { m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Warning: External Stims plugin stopHook() tried to join a NULL thread\n"; } + } + + //software tagging diagnosting + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << " Total external ones received through IPC: " << m_DebugCurrentReadIPCStimulations << "\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << " Sent to Designer: " << m_DebugExternalStimulationsSent << "\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << " Lost because of invalid timestamp: " << m_DebugStimulationsLost << "\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << " Stimulations that came earlier: " << m_DebugStimulationsReceivedEarlier << "\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << " Stimulations that came later: " << m_DebugStimulationsReceivedLate << "\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << " Stimulations that had wrong size: " << m_DebugStimulationsReceivedWrongSize << "\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << " Buffered: " << m_DebugStimulationsBuffered << "\n"; + //end software tagging diagnosting +} + +// Plugin specific methods + +void CPluginExternalStimulations::readExternalStimulations() +{ + using namespace boost::interprocess; + + //std::cout << "Creating External Stimulations thread" << std::endl; + //std::cout << "Queue Name : " << m_ExternalStimulationsQueueName << std::endl; + //char mq_name[255]; + //std::strcpy(mq_name, m_ExternalStimulationsQueueName.toASCIIString()); + const int chunkLength = 3; + const int pauseTime = 5; + + uint32_t priority; + size_t recvdSize; + + uint64_t chunk[chunkLength]; + + while (m_IsESThreadRunning) + { + bool success; + try + { + //Open a message queue. + message_queue mq(open_only //only open + , m_ExternalStimulationsQueueName.toASCIIString() //name + //,mq_name //name + ); + + success = mq.try_receive(&chunk, sizeof(chunk), recvdSize, priority); + } + catch (interprocess_exception& /* ex */) + { + //m_IsESThreadRunning = false; + //m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Problem with message queue in external stimulations:" << ex.what() << "\n"; + System::Time::sleep(pauseTime); + continue; + } + + if (!success) + { + System::Time::sleep(pauseTime); + continue; + } + + m_DebugCurrentReadIPCStimulations++; + + if (recvdSize != sizeof(chunk)) + { + //m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Problem with type of received data when reqding external stimulation!\n"; + m_DebugStimulationsReceivedWrongSize++; + } + else + { + //m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "received\n"; + + SExternalStimulation stim; + + stim.identifier = chunk[1]; + const uint64_t receivedTime = chunk[2]; + + //1. calculate time + const uint64_t ctStartTimeMs = (m_CTStartTime.time * 1000 + m_CTStartTime.millitm); + + const int64_t timeTest = receivedTime - ctStartTimeMs; + + if (timeTest < 0) + { + m_DebugStimulationsLost++; + //m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "AS: external stimulation time is invalid, probably stimulation is before reference point, total invalid so far: " << m_FlashesLost << "\n"; + System::Time::sleep(pauseTime); + continue; //we skip this stimulation + } + //2. Convert to OpenVibe time + const uint64_t ctEventTime = receivedTime - ctStartTimeMs; + + const double time = double(ctEventTime) / double(1000); + + const uint64_t ovTime = CTime(time).time(); + stim.timestamp = ovTime; + + //3. Store, the main thread will process it + { + //lock + std::lock_guard lock(m_es_mutex); + + m_ExternalStimulations.push_back(stim); + m_DebugStimulationsBuffered++; + m_esAvailable.notify_one(); + //unlock + } + + System::Time::sleep(pauseTime); + } + } +} + +void CPluginExternalStimulations::addExternalStimulations(CStimulationSet* ss, Kernel::ILogManager& /*logm*/, const uint64_t start, const uint64_t /*end*/) +{ + const uint64_t durationMs = 40; + { + //lock + std::lock_guard lock(m_es_mutex); + + for (auto i = m_ExternalStimulations.begin(); i != m_ExternalStimulations.end(); ++i) + { + // if time is current or any time in the future - send it (AS will buffer it) + if (i->timestamp >= start) + { + //flashes_in_this_time_chunk++; + //logm << Kernel::LogLevel_Error << "Stimulation added." << "\n"; + ss->appendStimulation(i->identifier, i->timestamp, durationMs); + } + else + { + //the stimulation is coming too late - after the current block being processed + //we correct the timestamp to the current block and we send it + m_DebugStimulationsReceivedLate++; + ss->appendStimulation(i->identifier, start, durationMs); + } + m_DebugExternalStimulationsSent++; + } + + // Since we processed all stimulations, we can clear the queue + m_ExternalStimulations.clear(); + + m_esAvailable.notify_one(); + //unlock + } +} + +bool CPluginExternalStimulations::setExternalStimulationsEnabled(const bool active) +{ + m_IsExternalStimulationsEnabled = active; + return true; +} + +} // namespace Plugins +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/external-stimulations/ovasCPluginExternalStimulations.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/external-stimulations/ovasCPluginExternalStimulations.h new file mode 100755 index 0000000..59e0206 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/external-stimulations/ovasCPluginExternalStimulations.h @@ -0,0 +1,81 @@ +#pragma once + +/** + * \brief Acquisition Server plugin adding the capability to receive stimulations from external sources + * + * \author Anton Andreev + * \author Jozef Legeny + * + * \note This plugin is deprecated. The users are recommended to use the TCP Tagging plugin instead. (11.05.2016) + * + */ + +#include +#include +#include + +#include + +#include "ovasIAcquisitionServerPlugin.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class CAcquisitionServer; + +namespace Plugins { +class CPluginExternalStimulations final : public IAcquisitionServerPlugin +{ + // Plugin interface +public: + explicit CPluginExternalStimulations(const Kernel::IKernelContext& ctx); + ~CPluginExternalStimulations() override {} + + bool startHook(const std::vector& selectedChannelNames, const size_t sampling, const size_t nChannel, const size_t nSamplePerSentBlock) override; + void stopHook() override; + void loopHook(std::deque>& vPendingBuffer, CStimulationSet& stimulationSet, const uint64_t start, const uint64_t end, + const uint64_t sampleTime) override; + void acceptNewConnectionHook() override { m_ExternalStimulations.clear(); } + + + // Plugin implementation + + + struct SExternalStimulation + { + uint64_t timestamp; + uint64_t identifier; + }; + + void addExternalStimulations(CStimulationSet* ss, Kernel::ILogManager& logm, const uint64_t start, const uint64_t end); + void readExternalStimulations(); + + //void acquireExternalStimulationsVRPN(CStimulationSet* ss, Kernel::ILogManager& logm, uint64_t start, uint64_t end); + + struct timeb m_CTStartTime; //time when the acquisition process started in local computer time + + std::vector m_ExternalStimulations; + + bool m_IsExternalStimulationsEnabled = false; + CString m_ExternalStimulationsQueueName; + + bool setExternalStimulationsEnabled(bool active); + bool isExternalStimulationsEnabled() const { return m_IsExternalStimulationsEnabled; } + + // Debugging of external stimulations + int m_DebugStimulationsLost = 0; + int m_DebugExternalStimulationsSent = 0; + int m_DebugCurrentReadIPCStimulations = 0; + int m_DebugStimulationsReceivedEarlier = 0; + int m_DebugStimulationsReceivedLate = 0; + int m_DebugStimulationsReceivedWrongSize = 0; + int m_DebugStimulationsBuffered = 0; + + //added for acquiring external stimulations + std::unique_ptr m_ESthreadPtr; + bool m_IsESThreadRunning = false; + std::mutex m_es_mutex; + std::condition_variable m_esAvailable; +}; +} // namespace Plugins +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/client-example/tcp-tagging-client.py b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/client-example/tcp-tagging-client.py new file mode 100644 index 0000000..1d1b8ce --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/client-example/tcp-tagging-client.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python + +# Example of tcp tagging client +# The tag format is the same as with Shared Memory Tagging. It comprises three blocks of 8 bytes: +# +# ---------------------------------------------------------------------- +# | padding (8 bytes) | event id (8 bytes) | timestamp (8 bytes) | +# ---------------------------------------------------------------------- +# +# The padding is only for consistency with Shared Memory Tagging and has no utility. +# The event id informs about the type of event happening. +# The timestamp is the posix time (ms since Epoch) at the moment of the event. +# It the latter is set to 0, the acquisition server issues its own timestamp upon reception of the stimulation. + +import sys +import socket +from time import time, sleep + +# host and port of tcp tagging server +HOST = '127.0.0.1' +PORT = 15361 + +# Event identifier (See stimulation codes in OpenVibe documentation) +EVENT_ID = 5+0x8100 + +# Artificial delay (ms). It may need to be increased if the time to send the tag is too long and causes tag loss. +DELAY=0 + +# transform a value into an array of byte values in little-endian order. +def to_byte(value, length): + for x in range(length): + yield value%256 + value//=256 + +# connect +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +s.connect((HOST, PORT)) + +for i in range(100): + # create the three pieces of the tag, padding, event_id and timestamp + padding=[0]*8 + event_id=list(to_byte(EVENT_ID, 8)) + + # timestamp can be either the posix time in ms, or 0 to let the acquisition server timestamp the tag itself. + timestamp=list(to_byte(int(time()*1000)+DELAY, 8)) + + # send tag and sleep + s.sendall(bytearray(padding+event_id+timestamp)) + sleep(1) + +s.close() + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/ovasCPluginTCPTagging.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/ovasCPluginTCPTagging.cpp new file mode 100755 index 0000000..08fe1e2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/ovasCPluginTCPTagging.cpp @@ -0,0 +1,163 @@ +#include "ovasCPluginTCPTagging.h" + +#include + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +// #define TCPTAGGING_DEBUG +#if defined(TCPTAGGING_DEBUG) +#include +#endif + +namespace OpenViBE { +namespace AcquisitionServer { +namespace Plugins { + +CPluginTCPTagging::CPluginTCPTagging(const Kernel::IKernelContext& ctx) + : IAcquisitionServerPlugin(ctx, "AcquisitionServer_Plugin_TCPTagging"), + m_port(15361) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Loading plugin: TCP Tagging\n"; + m_settings.add("TCP_Tagging_Port", &m_port); + m_settings.load(); +} + +bool CPluginTCPTagging::startHook(const std::vector& /*vSelectedChannelNames*/, const size_t /*sampling*/, const size_t /*nChannel*/, + const size_t /*nSamplePerSentBlock*/) +{ + // initialize tag stream + // this may throw exceptions, e.g. when the port is already in use. + try { m_scopedTagStream.reset(new CTagStream(m_port)); } + catch (std::exception& e) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Could not create tag stream for TCP Tagging [" << e.what() + << "]. Make sure the port " << m_port << " is not already reserved by another Acquisition Server.\n"; + return false; + } + + // Initialize time counters. + m_previousClockTime = System::Time::zgetTimeRaw(false); + m_previousSampleTime = 0; + m_lastTagTime = 0; + m_lastTagTimeAdjusted = 0; + m_warningPrinted = false; + + return true; +} + +void CPluginTCPTagging::stopHook() { m_scopedTagStream.reset(); } + +// n.b. With this version of tcp tagging, all the timestamps are in fixed point +void CPluginTCPTagging::loopHook(std::deque>& /*vPendingBuffer*/, + CStimulationSet& stimulationSet, uint64_t /*start*/, uint64_t /*end*/, const uint64_t sampleTime) +{ + const uint64_t clockTime = System::Time::zgetTimeRaw(false); + + Tag tag; + + // n.b. the last chunk received but not yet sent is between timestamps [previousClockTime,clockTime]. Note + // that more stims may be arriving in the loop meaning that they are newer than 'clockTime'. This is not an issue, + // they will be scheduled with future samples. + + // Collect tags from the stream until exhaustion. + while (m_scopedTagStream.get() && m_scopedTagStream->pop(tag)) + { + const uint64_t tagTime = tag.timestamp; + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "New Tag received (" << tag.flags << ", " << tag.identifier << ", " + << CTime(tagTime).toSeconds() << "s) at " + << CTime(clockTime).toSeconds() << "s\n"; + + uint64_t tagDelay = 0; + // Check that the timestamp fits the current chunk. Unfortunately we cannot send stimulations to the past. + if (tagTime < m_previousClockTime) + { + // This condition is relatively easy to achieve with high sampling rate & small block size with frequent stims (like in P300) + tag.timestamp = m_previousClockTime; + tagDelay = tag.timestamp - tagTime; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "A tag " + << tag.identifier << " is stamped before the current chunk start; it will be late" + << " (delay " << CTime(tagDelay).toSeconds() * 1000.0 << "ms)\n"; + } + if (tagTime < m_lastTagTime) + { + tag.timestamp = m_lastTagTime; + tagDelay = tag.timestamp - tagTime; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "A tag " + << tag.identifier << " is stamped before the previous tag; will delay" + << " (delay " << CTime(tagDelay).toSeconds() * 1000.0 << "ms)\n"; + } + m_lastTagTime = tagTime; + + // This simple and intuitive implementation has issues if the device lags: + // if previoussampletime does not advance evenly we get problems with tag ordering; this may also be related to the frequency this function is called + // const uint64_t tagOffsetClock = tag.timestamp - m_previousClockTime; // How far in time the marker is from the last call to this function + // uint64_t adjustedTagTime = m_previousSampleTime + tagOffsetClock; + + // This version estimates how far a sample is between [t1,t2] where the stamps t1,t2 are realtime of previous and current call, + // and uses this fraction on [previousSampleTime,currentSampleTime] to get an adjustment in terms of sample time. It is + // equivalent to interpolating between the two. To avoid implementing unsigned fixed point division, we go for doubles. + // This should give 10e-15 decimal precision which should be more than enough for EEG. + + const double elapsedClockTime = CTime(clockTime - m_previousClockTime).toSeconds(); // n.b. here we assume the clocks will not run backwards + const double elapsedSampleTime = CTime(sampleTime - m_previousSampleTime).toSeconds(); + const double tagOffsetClock = CTime(tag.timestamp - m_previousClockTime).toSeconds(); // How far in time the marker is from the last call to this + + const double scaling = elapsedSampleTime / elapsedClockTime; + const double interpolatedOffset = (elapsedClockTime > 0 ? (tagOffsetClock * scaling) : 0); + const uint64_t offsetSampleTime = CTime(interpolatedOffset).time(); + + uint64_t adjustedTagTime = m_previousSampleTime + + offsetSampleTime; // Time since the beginning of the current buffer (as approx by time of the last sample of the prev. run) + + if (adjustedTagTime < m_lastTagTimeAdjusted) + { + tagDelay = m_lastTagTimeAdjusted - adjustedTagTime; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "A tag " + << tag.identifier << " was adjusted before the previous tag; will delay" + << " (delay " << CTime(tagDelay).toSeconds() * 1000.0 << "ms)" + << " oc " << tagOffsetClock * 1000.0 << "ms\n"; + adjustedTagTime = m_lastTagTimeAdjusted; + } + m_lastTagTimeAdjusted = adjustedTagTime; + +#if defined(TCPTAGGING_DEBUG) + // If the amp and the AS computer are both behaving similarly, the scaling term should be very + // close to 1 and the diff term should be nearly zero. In that case the approach behaves + // like the simple, commented out solution above. + std::cout << "Set tag " << tag.identifier + << " at " << std::setprecision(6) << CTime(adjustedTagTime).toSeconds() + << " (pst = " << CTime(m_previousSampleTime).toSeconds() << "s," + << " pct = " << CTime(m_previousClockTime).toSeconds() << "s," + << " otag = " << CTime(tagTime).toSeconds() << "s," + << " ntag = " << CTime(tag.timestamp).toSeconds() << "s," + << " s = " << scaling << "," + << " off = " << tagOffsetClock << "s," + << " offI = " << interpolatedOffset << "s," + << " diff = " << (interpolatedOffset - tagOffsetClock)*1000.0 << "ms," + << " del = " << CTime(tagDelay).toSeconds()*1000.0 << "ms" + << ")\n"; +#endif + + if (tagDelay > 0) + { + // Indicates that the next tag after this one may not be correctly placed in time. + // The duration encodes our estimate how much the tag was delayed. This has + // the benefit that this knowledge can be inserted into file recordings and is not lost like logs potentially. + stimulationSet.appendStimulation(OVTK_GDF_Incorrect, adjustedTagTime, tagDelay); + } + + // Insert tag into the stimulation set. + stimulationSet.appendStimulation(tag.identifier, adjustedTagTime, 0); + } + + // Update time counters. Basically these counters allow to map the time a stamp was received to the time related to the sample buffers, + // as we know this function is called right after receiving samples from a device. + m_previousClockTime = clockTime; + m_previousSampleTime = sampleTime; +} + +} // namespace Plugins +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/ovasCPluginTCPTagging.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/ovasCPluginTCPTagging.h new file mode 100755 index 0000000..2a1d0af --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/ovasCPluginTCPTagging.h @@ -0,0 +1,57 @@ +#pragma once + +/** + * \brief Acquisition Server plugin adding the capability to receive stimulations from external sources + * via TCP/IP. + * + * The stimulation format is the same as with Shared Memory Tagging. It comprises three blocks of 8 bytes: + * + * ---------------------------------------------------------------------- + * | padding (8 bytes) | event id (8 bytes) | timestamp (8 bytes) | + * ---------------------------------------------------------------------- + * + * The padding is only for consistency with Shared Memory Tagging and has no utility. + * The event id informs about the type of event happening. + * The timestamp is the posix time (ms since Epoch) at the moment of the event. + * It the latter is set to 0, the acquisition server issues its own timestamp upon reception of the stimulation. + * + * Have a look at contrib/plugins/server-extensions/tcp-tagging/client-example to learn about the protocol + * to send stimulations from the client. + */ + +#include "ovasIAcquisitionServerPlugin.h" +#include "ovasCTagStream.h" + +namespace OpenViBE { +namespace AcquisitionServer { +namespace Plugins { +class CPluginTCPTagging final : public IAcquisitionServerPlugin +{ +public: + explicit CPluginTCPTagging(const Kernel::IKernelContext& ctx); + ~CPluginTCPTagging() override { } + + // Overrides virtual method startHook inherited from class IAcquisitionServerPlugin. + bool startHook(const std::vector& vSelectedChannelNames, const size_t sampling, const size_t nChannel, const size_t nSamplePerSentBlock) override; + + // Overrides virtual method stopHook inherited from class IAcquisitionServerPlugin + void stopHook() override; + + // Overrides virtual method loopHook inherited from class IAcquisitionServerPlugin. + void loopHook(std::deque>& vPendingBuffer, CStimulationSet& stimulationSet, const uint64_t start, const uint64_t end, + const uint64_t sampleTime) override; + +private: + uint64_t m_previousClockTime = 0; + uint64_t m_previousSampleTime = 0; + uint64_t m_lastTagTime = 0; + uint64_t m_lastTagTimeAdjusted = 0; + + std::unique_ptr m_scopedTagStream; + size_t m_port = 0; + + bool m_warningPrinted = false; +}; +} // namespace Plugins +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/ovasCTagStream.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/ovasCTagStream.cpp new file mode 100755 index 0000000..1d70e4c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/ovasCTagStream.cpp @@ -0,0 +1,131 @@ +#include "ovasCTagStream.h" + +#include +#include + +#include + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +namespace Plugins { + +void CTagQueue::push(const Tag& tag) +{ + std::lock_guard guard(m_mutex); + m_queue.push(tag); +} + +bool CTagQueue::pop(Tag& tag) +{ + std::lock_guard guard(m_mutex); + if (m_queue.empty()) { return false; } + tag = m_queue.front(); + m_queue.pop(); + return true; +} + +void CTagSession::start() +{ + m_errorState = 0; + startRead(); +} + +void CTagSession::startRead() +{ + // Caveat: a shared pointer is used (instead of simply using this) to ensure that this instance of TagSession is still alive when the callback is called. + async_read(m_socket, boost::asio::buffer(static_cast(&m_tag), sizeof(Tag)), boost::bind(&CTagSession::handleRead, shared_from_this(), _1)); +} + +void CTagSession::handleRead(const boost::system::error_code& error) +{ + if (!error) + { + if (m_tag.timestamp == 0 || (m_tag.flags & FLAG_AUTOSTAMP_SERVERSIDE)) + { + // Client didn't provide timestamp or asked the server to do it. Stamp current time. + m_tag.timestamp = System::Time::zgetTimeRaw(false); + } + else if (!(m_tag.flags & FLAG_FPTIME)) + { + // Client provided stamp but not in FPTIME + m_tag.timestamp = System::Time::zgetTimeRaw(false); + if (!(m_errorState & (1LL << 1))) + { + // @fixme not appropriate to print errors from a thread, but better than silent fail + std::cout << "[WARNING] TCP Tagging: Received tag(s) not in fixed point time. Not supported, will replace with server time.\n"; + m_errorState |= (1LL << 1); + } + } + + // Push tag to the queue. + m_queuePtr->push(m_tag); + + // Continue reading. + startRead(); + } +} + + +CTagServer::CTagServer(const SharedQueuePtr& queue, int port) + : m_acceptor(m_ioService), m_queuePtr(queue) +{ + boost::asio::ip::tcp::endpoint endp = boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port); + m_acceptor.open(endp.protocol()); + + // Try to make sure that the port cannot be used by multiple processes + boost::asio::socket_base::reuse_address option(false); + m_acceptor.set_option(option); + + m_acceptor.bind(endp); + m_acceptor.listen(); +} + + +void CTagServer::run() +{ + try + { + startAccept(); + m_ioService.run(); + } + catch (std::exception&) + { + // TODO: log error message (needs to be thread-safe) + } +} + +void CTagServer::startAccept() +{ + SharedSessionPtr newSession(new CTagSession(m_ioService, m_queuePtr)); + // Note: if this instance of CTagSever is destroyed then the associated io_service is destroyed as well. + // Therefore the call-back will never be called if this instance is destroyed and it is safe to use this instead of a shared pointer. + + m_acceptor.async_accept(newSession->socket(), boost::bind(&CTagServer::handleAccept, this, newSession, _1)); +} + +void CTagServer::handleAccept(SharedSessionPtr& session, const boost::system::error_code& error) +{ + if (!error) { session->start(); } + startAccept(); +} + +CTagStream::CTagStream(const int port) : m_queuePtr(new CTagQueue), m_port(port) +{ + // can throw exceptions, e.g. when the port is already in use. + m_serverPtr.reset(new CTagServer(m_queuePtr, m_port)); + m_threadPtr.reset(new std::thread(&CTagStream::startServer, this)); +} + +CTagStream::~CTagStream() +{ + // m_serverPtr and m_threadPtr cannot be null + m_serverPtr->stop(); + m_threadPtr->join(); +} + +} // namespace Plugins +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/ovasCTagStream.h b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/ovasCTagStream.h new file mode 100755 index 0000000..e4b9f21 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/ovasCTagStream.h @@ -0,0 +1,121 @@ +#pragma once + +#include +#include + +#include +#include + +// PluginTCPTagging relies on four auxilliary classes: CTagQueue, CTagSession, CTagServer and CTagStream. +// CTagQueue implements a trivial queue to store tags with exclusive locking. +// CTagServer implements a server that simply binds to a port and waits for incoming connections. +// CTagSession represents an individual connection with a client and holds a connection handle (socket) +// and a data buffer to store incoming data. +// The use of shared pointers is instrumental to ensure that instances are still alive when call-backs are +// called and avoid memory corruption. +// The CTagStream class implements a stream to allow to collect tags. Upon instantiation, it creates an instance +// of CTagServer and starts the server in an auxilliary thread. +// The exchange of data between the main tread and the auxilliary thread is performed via a lockfree queue (boost). + +namespace OpenViBE { +namespace AcquisitionServer { +namespace Plugins { + +// A Tag consists of an identifier to inform about the type of event +// and a timestamp corresponding to the time at which the event occurrs. +struct Tag +{ + Tag(): flags(0), identifier(0), timestamp(0) {} + uint64_t flags, identifier, timestamp; +}; + +// Note: duplicated in TCP Tagging module in openvibe +enum TCP_Tagging_Flags +{ + FLAG_FPTIME = (1LL << 0), // The time given is fixed point time. + FLAG_AUTOSTAMP_CLIENTSIDE = (1LL << 1), // Ignore given stamp, bake timestamp on client side before sending + FLAG_AUTOSTAMP_SERVERSIDE = (1LL << 2) // Ignore given stamp, bake timestamp on server side when receiving +}; + +class CTagSession; // forward declaration of CTagSession to define SharedSessionPtr +class CTagQueue; // forward declaration of CTagQueue to define SharedQueuePtr +class CTagServer; // forward declaration of CTagServer to define ScopedServerPtr + +typedef std::shared_ptr SharedQueuePtr; +typedef std::shared_ptr SharedSessionPtr; +typedef std::unique_ptr ScopedServerPtr; +typedef std::unique_ptr ScopedThreadPtr; + +// A trivial implementation of a queue to store Tags with exclusive locking +class CTagQueue +{ +public: + CTagQueue() { } + void push(const Tag& tag); + bool pop(Tag& tag); +private: + std::queue m_queue; + std::mutex m_mutex; +}; + +// An instance of CTagSession is associated to every client connecting to the Tagging Server. +// It contains a connection handle and data buffer. +class CTagSession : public std::enable_shared_from_this +{ +public: + CTagSession(boost::asio::io_service& ioService, const SharedQueuePtr& queue) : m_socket(ioService), m_queuePtr(queue) { } + + boost::asio::ip::tcp::socket& socket() { return m_socket; } + void start(); + void startRead(); + void handleRead(const boost::system::error_code& error); + +private: + Tag m_tag; + boost::asio::ip::tcp::socket m_socket; + SharedQueuePtr m_queuePtr; + uint64_t m_errorState = 0; +}; + +// CTagServer implements a server that binds to a port and accepts new connections. +class CTagServer +{ +public: + explicit CTagServer(const SharedQueuePtr& queue, int port = 15361); + ~CTagServer() { } + + void run(); + void stop() { m_ioService.stop(); } + +private: + void startAccept(); + void handleAccept(SharedSessionPtr& session, const boost::system::error_code& error); + + boost::asio::io_service m_ioService; + boost::asio::ip::tcp::acceptor m_acceptor; + const SharedQueuePtr& m_queuePtr; +}; + +// CTagStream allows to collect tags received via TCP. +class CTagStream +{ + // Initial memory allocation of lockfree queue. + enum { ALLOCATE = 128 }; + +public: + explicit CTagStream(int port = 15361); + ~CTagStream(); + + bool pop(Tag& tag) { return m_queuePtr->pop(tag); } + +private: + void startServer() { m_serverPtr->run(); } + + SharedQueuePtr m_queuePtr; + ScopedServerPtr m_serverPtr; + ScopedThreadPtr m_threadPtr; + int m_port = 0; +}; +} // namespace Plugins +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/test/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/test/CMakeLists.txt new file mode 100644 index 0000000..e529244 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/test/CMakeLists.txt @@ -0,0 +1,27 @@ +PROJECT(test_tagstream) + +IF(WIN32) + ADD_DEFINITIONS(-DTARGET_OS_Windows) +ENDIF(WIN32) +IF(UNIX) + ADD_DEFINITIONS(-DTARGET_OS_Linux) +ENDIF(UNIX) + +INCLUDE_DIRECTORIES(../) +ADD_EXECUTABLE(${PROJECT_NAME} test_tagstream.cpp ../ovasCTagStream.cpp) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) # Place project in folder unit-test (for some IDE) + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBEModuleSystem") # Time getter from here in the future +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyBoost_System") +INCLUDE("FindThirdPartyBoost_Thread") + +# Unfortunately we need to install the tests as any application to find .dll/.so files +# on both Windows and Linux. +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/test/DartTestfile.txt b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/test/DartTestfile.txt new file mode 100644 index 0000000..9d9424a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/test/DartTestfile.txt @@ -0,0 +1,18 @@ +# Basic Template Test for automatic run a scenario that produce a file to be compared to a reference file +# You need to set the name of the test according to name of scenario file and reference file + +# Test TagStream + +SET(TEST_NAME "TagStream") + +IF(WIN32) + SET(EXT cmd) + SET(OS_FLAGS "--no-pause") +ELSE(WIN32) + SET(EXT sh) + SET(OS_FLAGS "") +ENDIF(WIN32) + +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_tagstream.${EXT}" ${OS_FLAGS}) + + diff --git a/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/test/test_tagstream.cpp b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/test/test_tagstream.cpp new file mode 100755 index 0000000..703b014 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/contrib/plugins/server-extensions/tcp-tagging/test/test_tagstream.cpp @@ -0,0 +1,26 @@ +#include "../ovasCTagStream.h" + +#include + +int main() +{ + bool ok = false; + + OpenViBE::AcquisitionServer::Plugins::CTagStream tagStream1; + + // The construction of the second TagStream must fail because of port already in use. + try { OpenViBE::AcquisitionServer::Plugins::CTagStream tagStream2; } + catch (std::exception&) { ok = true; } // This exception is expected, don't print + + // The construction must succeed because another port is used. + try { OpenViBE::AcquisitionServer::Plugins::CTagStream tagStream3(15362); } + catch (std::exception& e) + { + // Unexpected exception + std::cout << "Exception: " << e.what() << "\n"; + ok = false; + } + + if (!ok) { return 1; } + return 0; +} diff --git a/Masterarbeit/openvibe/extras-master/debian/changelog b/Masterarbeit/openvibe/extras-master/debian/changelog new file mode 100644 index 0000000..20c44ec --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/debian/changelog @@ -0,0 +1,5 @@ +openvibe (0.16.0-1) UNRELEASED; urgency=low + + * Initial release. + + -- none Wed, 03 Apr 2013 09:05:02 +0200 diff --git a/Masterarbeit/openvibe/extras-master/debian/compat b/Masterarbeit/openvibe/extras-master/debian/compat new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/debian/compat @@ -0,0 +1 @@ +9 diff --git a/Masterarbeit/openvibe/extras-master/debian/control b/Masterarbeit/openvibe/extras-master/debian/control new file mode 100644 index 0000000..8e6105a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/debian/control @@ -0,0 +1,13 @@ +Source: openvibe +Maintainer: none +Section: misc +Priority: optional +Standards-Version: 3.9.3 +Build-Depends: debhelper (>= 9), doxygen, automake, autoconf, cmake (>= 2.8), cmake-data (>= 2.8.7), unzip, libgtk2.0-dev, libglade2-dev, gfortran, libgsl0-dev, libexpat1-dev, libreadline-dev, libzzip-dev, libtool, libxaw7-dev, libpcre3-dev, libfreeimage-dev, libglu1-mesa-dev, libalut-dev, libvorbis-dev, libncurses5-dev, python-dev, python-numpy, libeigen3-dev, libogre-dev, libcegui-mk2-dev, libois-dev, libboost-dev, libboost-thread-dev, liblua5.1-0-dev, libboost-regex-dev, libboost-filesystem-dev, libitpp-dev + +Package: openvibe +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, python2.7, python-numpy +Description: Platform for Brain-Computer Interfaces (BCI) + A modular software platform for the design, test and use of Brain-Computer + Interfaces. diff --git a/Masterarbeit/openvibe/extras-master/debian/copyright b/Masterarbeit/openvibe/extras-master/debian/copyright new file mode 100644 index 0000000..64c1e21 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/debian/copyright @@ -0,0 +1,27 @@ +Copyright 2013 OpenViBE Developers + +Author: OpenViBE Developers +Download: http://openvibe.inria.fr/ + +Files: applications/* cmake-modules/* common/* documentation/* kernel/* modules/* openvibe/* plugins/* scripts/* test/* toolkit/* +Copyright: (C) Inria +License: AGPL-3 + +Files: contrib/* +Copyright: (C) Authors +License: AGPL-3 + +License: AGPL-3 + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + . + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Affero General Public License for more details. + . + You should have received a copy of the GNU Affero General Public + License along with this program. If not, see . + diff --git a/Masterarbeit/openvibe/extras-master/debian/rules b/Masterarbeit/openvibe/extras-master/debian/rules new file mode 100644 index 0000000..84aafee --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/debian/rules @@ -0,0 +1,12 @@ +#!/usr/bin/make -f + +# Openvibe scripts with .sh extension are only for debugging/development purposes, they're not packaged +export DH_ALWAYS_EXCLUDE=.sh + +%: + dh $@ + +# In the following, we put materials to openvibe/ subdirs to avoid cluttering the base directories +override_dh_auto_configure: + dh_auto_configure -- -DCMAKE_INSTALL_DATADIR="/usr/share/" -DCMAKE_INSTALL_INCLUDEDIR="/usr/include/openvibe" + diff --git a/Masterarbeit/openvibe/extras-master/debian/source/format b/Masterarbeit/openvibe/extras-master/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/Masterarbeit/openvibe/extras-master/documentation/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/documentation/CMakeLists.txt new file mode 100644 index 0000000..f58dabc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/documentation/CMakeLists.txt @@ -0,0 +1,68 @@ +PROJECT(openvibe-documentation) +OV_ADD_THIS_TO_PROJECT_LIST() + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +# --------------------------------- + + + + +# --------------------------------- + + +if(NOT(CMAKE_BUILD_TYPE) AND CMAKE_GENERATOR MATCHES "Visual Studio*") + set(MULTI_BUILD TRUE) +endif() + +IF(NOT(${SKIP_DOCUMENTATION})) + if(MULTI_BUILD) # Replace with generator expression in CMake 3.5+ + foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU) + unset(SDK_DOC_PATH CACHE) + find_path(SDK_DOC_PATH NAMES openvibe PATHS ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}} PATH_SUFFIXES doc-tmp NO_DEFAULT_PATH) + if(SDK_DOC_PATH) + break() + endif() + endforeach() + + foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU) + unset(DESIGNER_DOC_PATH CACHE) + find_path(DESIGNER_DOC_PATH NAMES openvibe PATHS ${OPENVIBE_DESIGNER_PATH_${OUTPUTCONFIGU}} PATH_SUFFIXES doc-tmp NO_DEFAULT_PATH) + if(DESIGNER_DOC_PATH) + break() + endif() + endforeach() + else() + set(SDK_DOC_PATH ${OPENVIBE_SDK_PATH}/doc-tmp) + set(DESIGNER_DOC_PATH ${DESIGNER_SDK_PATH}/doc-tmp) + endif() + # For boxes documentation, Add sdk dependencies dox-part folder + FILE(COPY ${SDK_DOC_PATH}/ DESTINATION ${DOCUMENTATION_TEMP_DIRECTORY}) + FILE(COPY ${DESIGNER_DOC_PATH}/ DESTINATION ${DOCUMENTATION_TEMP_DIRECTORY}) + + OV_ADD_SOURCE_DIR("${DOCUMENTATION_TEMP_DIRECTORY}/openvibe") + IF(OV_SDK_SOURCE_PATH) + OV_ADD_SOURCE_DIR("${OV_SDK_SOURCE_PATH}") + ELSE() + MESSAGE(WARNING "Please set OV_SDK_SOURCE_PATH to enable sources documentation of sdk") + ENDIF() + + add_subdirectory(src) + +ENDIF() + + + +# ----------------------------- +# Install files +# ----------------------------- +#INSTALL(TARGETS ${PROJECT_NAME} +# RUNTIME DESTINATION ${DIST_BINDIR} +# LIBRARY DESTINATION ${DIST_LIBDIR} +# ARCHIVE DESTINATION ${DIST_LIBDIR}) + +#INSTALL(DIRECTORY doc/ DESTINATION ${DIST_DOCDIR}) +#INSTALL(DIRECTORY src/ DESTINATION ${DIST_INCLUDEDIR} FILES_MATCHING PATTERN "*.h" PATTERN "doc" EXCLUDE) diff --git a/Masterarbeit/openvibe/extras-master/documentation/doc/cc-by-sa.png b/Masterarbeit/openvibe/extras-master/documentation/doc/cc-by-sa.png new file mode 100644 index 0000000..924eee5 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/documentation/doc/cc-by-sa.png differ diff --git a/Masterarbeit/openvibe/extras-master/documentation/doc/doxygen.png b/Masterarbeit/openvibe/extras-master/documentation/doc/doxygen.png new file mode 100644 index 0000000..b891fd3 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/documentation/doc/doxygen.png differ diff --git a/Masterarbeit/openvibe/extras-master/documentation/doc/logo.png b/Masterarbeit/openvibe/extras-master/documentation/doc/logo.png new file mode 100644 index 0000000..bf5bb96 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/documentation/doc/logo.png differ diff --git a/Masterarbeit/openvibe/extras-master/documentation/doc/openvibe.css b/Masterarbeit/openvibe/extras-master/documentation/doc/openvibe.css new file mode 100644 index 0000000..c86652e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/documentation/doc/openvibe.css @@ -0,0 +1,40 @@ +body { +/* position:relative;*/ + max-width:11in; + margin:0 auto; + /*background:url('doc-bg.png') #fff left repeat-y;*/ +} + +#sidebar { + width:200px; + float:left; + border-left:1px solid #C4CFE5; + border-right:1px solid #C4CFE5; + padding-bottom:10px; +} + +#sidebar ul:not(.tablist), #sidebar div:not(.tabs) { + padding-left:10px; +} + +#sidebar li { + list-style:none; +} + +#sidebar b { + font-weight:bold; +} + +#search input { + border:1px solid black; + width:180px; + +} + +#content { + margin-left:200px; +} + +hr.footer { + clear:both; +} diff --git a/Masterarbeit/openvibe/extras-master/documentation/doc/search.php b/Masterarbeit/openvibe/extras-master/documentation/doc/search.php new file mode 100644 index 0000000..d8d4da7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/documentation/doc/search.php @@ -0,0 +1,35 @@ + diff --git a/Masterarbeit/openvibe/extras-master/documentation/src/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/documentation/src/CMakeLists.txt new file mode 100644 index 0000000..66a20f4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/documentation/src/CMakeLists.txt @@ -0,0 +1,159 @@ +# Author Yann Renard / INRIA +# Date 2008-10-15 +# +# this CMake script iterates over several source documentation directories in +# order to compile it with doxygen. It has the ability to configure the +# doxyfile depending on some variables and to build documentation sources from +# computer generated templates (.dox-skeleton) and hand written documentation +# parts (.dox-part) + +ADD_CUSTOM_TARGET(${PROJECT_NAME} ALL) + +# look for doxygen, if not present, no need to generate documentation +FIND_PROGRAM(doxygen_bin "doxygen" PATHS ${LIST_DEPENDENCIES_PATH}/bin NO_DEFAULT_PATH) +FIND_PROGRAM(doxygen_bin "doxygen" PATHS ${LIST_DEPENDENCIES_PATH}/bin "C:/Program Files/doxygen/bin") + +IF(doxygen_bin) + + MESSAGE(STATUS " Found doxygen...") + + # intializes the variable that will be used in the doxyfile for input + # directories + STRING(REPLACE "\\" "/" ov_doxy_input "${OV_BASE_DIR}/cmake-modules") + SET(ov_doxy_input "\\\"${ov_doxy_input}\\\"") + + # intializes the variable that will contain the list of resource files to + # copy to the target directory + SET(RESOURCE_FILES "") + + SET(DOX_PART_FILES "") + # iterates on each project we have + # + # for each project, we look at its resources and store them in a list + # for each project, we look at partial documentation files (.dox-part) and + # parse them to get |ov[a-zA-Z0-9_]*_begin| or |ov[a-zA-Z0-9_]*_end| + # tokens. This tokens will later be included in the skeleton doxumentation + # files (.dox-skeleton) + GET_PROPERTY(CURRENT_PROJECTS GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS) + + FOREACH(current_project ${CURRENT_PROJECTS}) + # MESSAGE(STATUS " [ OK ] Project ${current_project}") + + STRING(REGEX REPLACE " +$" "" current_project ${current_project}) + + # updates the doxyfile variable for input directories + IF(EXISTS "${current_project}/include") + SET(current_project_include "${current_project}/include") + SET(ov_doxy_input "${ov_doxy_input} \\\"${current_project_include}\\\"") + ENDIF(EXISTS "${current_project}/include") + + IF(EXISTS "${current_project}/src") + # MESSAGE(STATUS " [ OK ] Candidate src directory found ${current_project_src}") + SET(current_project_src "${current_project}/src") + SET(ov_doxy_input "${ov_doxy_input} \\\"${current_project_src}\\\"") + ENDIF(EXISTS "${current_project}/src") + + IF(EXISTS "${current_project}/doc") + # MESSAGE(STATUS " [ OK ] Candidate doc directory found ${current_project_doc}") + SET(current_project_doc "${current_project}/doc") + SET(ov_doxy_input "${ov_doxy_input} \\\"${current_project_doc}\\\"") + + # looks for resources and stores them in a list + FILE(GLOB_RECURSE resource_files_tmp "${current_project_doc}/*.png" "${current_project_doc}/*.svg" "${current_project_doc}/*.css" "${current_project_doc}/*.php") + SET(RESOURCE_FILES ${RESOURCE_FILES} ${resource_files_tmp}) + + # looks for partial hand written documentation + FILE(GLOB_RECURSE doxs "${current_project_doc}/*.dox-part") + SET(DOX_PART_FILES "${DOX_PART_FILES};${doxs}") + ENDIF(EXISTS "${current_project}/doc") + + IF(EXISTS "${current_project}/box-algorithm-doc") + + LIST(APPEND dir_list "." "box-algorithm-doc/dox-part") + FOREACH(file_path ${dir_list}) + SET(current_project_doc "${current_project}/${file_path}") + MESSAGE(STATUS " [ OK ] Candidate doc directory found ${current_project_doc}") + SET(ov_doxy_input "${ov_doxy_input} \\\"${current_project_doc}\\\"") + + # looks for resources and stores them in a list + FILE(GLOB_RECURSE resource_files_tmp "${current_project_doc}/*.png" "${current_project_doc}/*.svg" "${current_project_doc}/*.css" "${current_project_doc}/*.php") + SET(RESOURCE_FILES ${RESOURCE_FILES} ${resource_files_tmp}) + + # looks for partial hand written documentation + FILE(GLOB_RECURSE doxs "${current_project_doc}/*.dox-part") + SET(DOX_PART_FILES "${DOX_PART_FILES};${doxs}") + ENDFOREACH(file_path ${dir_list}) + + ENDIF(EXISTS "${current_project}/box-algorithm-doc") + + + + ENDFOREACH(current_project) + + # the final doxyfile filename is generated, platform compliantly + SET(ov_doxy_final "${CMAKE_CURRENT_BINARY_DIR}/doxyfile") + IF(WIN32) + STRING(REPLACE "/" "\\\\" ov_doxy_final ${ov_doxy_final}) + ENDIF(WIN32) + + # these two lines configure the variables used to configure the doxyfile + SET(ov_doxy_input "${ov_doxy_input} \\\"${CMAKE_CURRENT_SOURCE_DIR}\\\"") + SET(ov_doxy_input "${ov_doxy_input} \\\"${CMAKE_CURRENT_BINARY_DIR}\\\"") + SET(ov_doxy_strip_from_path ${ov_doxy_input}) + SET(ov_doxy_version ${PROJECT_VERSION}) + + # then the doxyfile is configured + + GET_PROPERTY(CURRENT_PROJECTS GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS_BUILD_DIR) + FOREACH(current_project ${CURRENT_PROJECTS}) +# MESSAGE(STATUS "DUH ${current_project}") + STRING(REGEX REPLACE " +$" "" current_project ${current_project}) + SET(current_project_src "${current_project}/src") + # updates the doxyfile variable for input directories + SET(ov_plugin_inspector_load_path "${ov_plugin_inspector_load_path}:${current_project}") + ENDFOREACH(current_project) + + # create folder to put the output from doxygen to + file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../doc") + file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../doc/html") + file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/algorithm-doc") + file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/algorithm-snapshots") + file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/box-algorithm-doc") + file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/box-algorithm-snapshots") + # then the doxyfile is configured + + CONFIGURE_FILE( + CreateDoxygen.cmake-skeleton + CreateDoxygen.cmake + @ONLY) + + CONFIGURE_FILE( + openvibe.dox-base + openvibe.dox + @ONLY) + +IF(WIN32) + ADD_CUSTOM_COMMAND( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMAND ${LIST_DEPENDENCIES_PATH}/cmake/bin/cmake.exe -P CreateDoxygen.cmake + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + ) +ELSEIF(UNIX) + ADD_CUSTOM_COMMAND( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMAND cmake -P CreateDoxygen.cmake + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + ) +ENDIF(WIN32) + +INSTALL(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../doc/" DESTINATION ${DIST_DOCDIR}) + +ELSE(doxygen_bin) + + MESSAGE(STATUS " FAILED to find doxygen...") + +ENDIF(doxygen_bin) + + diff --git a/Masterarbeit/openvibe/extras-master/documentation/src/CreateDoxygen.cmake-skeleton b/Masterarbeit/openvibe/extras-master/documentation/src/CreateDoxygen.cmake-skeleton new file mode 100644 index 0000000..c3fcfaf --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/documentation/src/CreateDoxygen.cmake-skeleton @@ -0,0 +1,197 @@ +# Author Yann Renard / INRIA +# Date 2008-10-15 +# +# this CMake script iterates over several source documentation directories in +# order to compile it with doxygen. It has the ability to configure the +# doxyfile depending on some variables and to build documentation sources from +# computer generated templates (.dox-skeleton) and hand written documentation +# parts (.dox-part) + +MESSAGE(STATUS "Launching Create Doxygen CMake script") + +SET(RESOURCE_FILES "@RESOURCE_FILES@") +SET(ov_doxy_final "@ov_doxy_final@") +SET(ov_doxy_version "@ov_doxy_version@") +SET(ov_doxy_input "@ov_doxy_input@") +SET(CURRENT_PROJECTS "@CURRENT_PROJECTS@") +SET(CMAKE_CURRENT_SOURCE_DIR "@CMAKE_CURRENT_SOURCE_DIR@") + +MESSAGE(STATUS "Running plugin inspector") + +#MESSAGE(STATUS "@CMAKE_INSTALL_FULL_BINDIR@/../lib/") +IF(UNIX) + EXECUTE_PROCESS( + COMMAND @CMAKE_INSTALL_FULL_BINDIR@/../openvibe-plugin-inspector.sh + -d "@CMAKE_CURRENT_BINARY_DIR@" -p @CMAKE_INSTALL_FULL_BINDIR@/../lib/ + -k "@CMAKE_INSTALL_FULL_BINDIR@/../lib/" + -c "@CMAKE_INSTALL_FULL_BINDIR@/../share/openvibe/kernel/openvibe.conf" + WORKING_DIRECTORY "@CMAKE_INSTALL_FULL_BINDIR@/" + ) +ELSEIF(WIN32) + EXECUTE_PROCESS( + COMMAND @CMAKE_INSTALL_FULL_BINDIR@/../openvibe-plugin-inspector.cmd + -d "@CMAKE_CURRENT_BINARY_DIR@" -p @CMAKE_INSTALL_FULL_BINDIR@ + -k "@CMAKE_INSTALL_FULL_BINDIR@" + -c "@CMAKE_INSTALL_FULL_BINDIR@/../share/openvibe/kernel/openvibe.conf" + WORKING_DIRECTORY "@CMAKE_INSTALL_FULL_BINDIR@/" + ) +ENDIF(UNIX) + +#go through all of the .dox-part files we have found previously and extract information + FOREACH(dox @DOX_PART_FILES@) + GET_FILENAME_COMPONENT(dox_filename ${dox} NAME_WE) + MESSAGE(STATUS " Documentation part found ${dox}") + + SET(dox_tag_name NOTFOUND) + + # iterates on each line of the file to look after begin/end tags + # "dox_tag_name" stores the name of the variable + # to use to configure the skeleton file. It is computed from the + # begin tag. + FILE(READ ${dox} dox_lines) + # replaces empty cariage returns with semi colons to be compliant + # with CMake lists. note the space before and after the semi + # colon, this is for CMake not to skip empty lines + STRING(REPLACE "\n" " ; " dox_lines " ${dox_lines} ") + FOREACH(dox_line ${dox_lines}) + # this regex removes the spaces we added before the loop + STRING(REGEX REPLACE "^ (.*) $" "\\1" dox_line ${dox_line}) + + # we initialize several variables that will be used in + # this loop + SET(dox_line_processed FALSE) + SET(dox_tag_begin NOTFOUND) + SET(dox_tag_end NOTFOUND) + SET(dox_tag NOTFOUND) + + # and look for a new tag in this line + STRING(REGEX MATCH "\\|[a-zA-Z0-9_]+\\|" dox_tag "${dox_line}") + IF(dox_tag) + # a tag is found, so we want to know if it is a + # OVP_DocBegin* or OVP_DocEnd* tag + STRING(REGEX MATCH "\\|OVP_DocBegin_[a-zA-Z0-9_]*\\|" dox_tag_begin "${dox_line}") + STRING(REGEX MATCH "\\|OVP_DocEnd_[a-zA-Z0-9_]*\\|" dox_tag_end "${dox_line}") + + # in case we already have something in + # dox_tag_name, it means that begin tag has + # already been processed, so either we terminate with end + # tag, either we continue with come content to add in the + # variable + IF(dox_tag_name AND dox_tag_end) + # in case we find end tag, we just terminate cleaning + # the tag and what follows. We then terminate and + # create a new CMake variable with the content of this + # begin/end tagged things. + STRING(REGEX REPLACE ".*\\|OVP_DocEnd_([a-zA-Z0-9_]*)\\|.*" "\\1" dox_tag_name_check ${dox_line}) + STRING(REGEX REPLACE "\\|OVP_DocEnd_([a-zA-Z0-9_]*)\\|.*" "" dox_line "${dox_line}") + + # MESSAGE(STATUS " - Completed tag pair |${dox_tag_name}|") + + SET(dox_tag_name_value "${dox_tag_name_value}\n${dox_line}") + SET("Doc_${dox_tag_name}_Content" ${dox_tag_name_value}) + SET(dox_tag_name NOTFOUND) + SET(dox_line_processed TRUE) + ENDIF(dox_tag_name AND dox_tag_end) + + # in case dox_tag_name is empty, it means + # that begin tag has not yet been found, so we just look at it + # or skip to next line + IF(NOT dox_tag_name AND dox_tag_begin) + # in case we find begin tag, we just start saving the + # CMake variable name, and clean the tag and what + # comes before. We then intialize the content of the + # begin/end tagged thing with what comes after begin + # tag. + STRING(REGEX REPLACE ".*\\|OVP_DocBegin_([a-zA-Z0-9_]*)\\|.*" "\\1" dox_tag_name ${dox_line}) + STRING(REGEX REPLACE ".*\\|OVP_DocBegin_([a-zA-Z0-9_]*)\\|" "" dox_line "${dox_line}") + SET(dox_tag_name_value "${dox_line}") + SET(dox_line_processed TRUE) + ENDIF(NOT dox_tag_name AND dox_tag_begin) + + # in case dox tag is not OVP_DocBegin* or OVP_DocEnd* + # just print a warning and continue + IF(NOT dox_line_processed) + MESSAGE(STATUS " - Unexpected tag ${dox_tag} in ${dox} will be ignored") + ENDIF(NOT dox_line_processed) + ENDIF(dox_tag) + + # in case this line was not processed, either because it does + # not have any tag, either because the tag was unexpected, we + # just append the whole line to the content of the current + # variable + IF(dox_tag_name AND NOT dox_line_processed) + # in case we don't find the end tag, just append this + # new line to the current content + SET(dox_tag_name_value "${dox_tag_name_value}\n${dox_line}") + ENDIF(dox_tag_name AND NOT dox_line_processed) + ENDFOREACH(dox_line) + + ENDFOREACH(dox) + + + +# install the remaining resource files + +# now we have stored all the begin/end tagged things in variable, we just +# have to configure the skeleton configuration files with those variables. +# note that the skeleton files should be prepared to receive the CMake +# variables with anywhere it is needed. +# +# in order to do so, we look after all the (.dox-skeleton) files and call +# the configure command to build the final documentation (.dox) file. +MESSAGE(STATUS "Current bin dir: @CMAKE_CURRENT_BINARY_DIR@") +FILE(GLOB_RECURSE dox_skeletons "@CMAKE_CURRENT_BINARY_DIR@/*.dox-skeleton") +FOREACH(dox_skeleton ${dox_skeletons}) + GET_FILENAME_COMPONENT(dox_skeleton_filename ${dox_skeleton} NAME_WE) + CONFIGURE_FILE( + "${dox_skeleton}" + "@CMAKE_CURRENT_BINARY_DIR@/${dox_skeleton_filename}.dox" + @ONLY) +# MESSAGE(STATUS " [ OK ] Configured skeleton ${dox_skeleton}") +ENDFOREACH(dox_skeleton) + + + + +CONFIGURE_FILE( + "@CMAKE_CURRENT_SOURCE_DIR@/doxyfile-skeleton" + ${ov_doxy_final} + @ONLY) + + +# and a post-build command is added in order to run doxygen +MESSAGE(STATUS "Running doxygen") +EXECUTE_PROCESS( + COMMAND "@doxygen_bin@" "@ov_doxy_final@" + WORKING_DIRECTORY "@CMAKE_CURRENT_BINARY_DIR@" +) + +# 'patch' the docs, this takes some time, is it worth doing it? +# original linux-build directive: +# find $target_dist/doc -name *.html -exec sed -i -e "s/\xC2\?\xA7OpenViBE\xC2\?\xA7/OpenViBE/g" "{}" \; +# \xC2\?\xA7 is the character that has been put everywhere to clearly make the distinction between the project and the software +#MESSAGE(STATUS "Patching special characters in HTML docs ...") +#FILE(GLOB_RECURSE HTML_DOCS "${CMAKE_CURRENT_BINARY_DIR}/../doc/html/*.html") +#MESSAGE(STATUS "IAMIN ${CMAKE_CURRENT_BINARY_DIR}/../doc/html/") + +#MESSAGE(STATUS "got ${HTML_DOCS}") +#FOREACH(HTML_DOC ${HTML_DOCS}) +# MESSAGE(STATUS "Processing ${HTML_DOC}") +# FILE(READ ${HTML_DOC} ORIG_FILE) +# STRING(REGEX REPLACE "[^ a-zA-Z0-9:.,]OpenViBE[^ a-zA-Z0-9:.,]" "OpenViBE" TRANSLATED_FILE ${ORIG_FILE}) +# FILE(WRITE ${HTML_DOC} ${TRANSLATED_FILE}) +#ENDFOREACH(HTML_DOC) + +FILE(GLOB_RECURSE resource_files_tmp "@CMAKE_CURRENT_BINARY_DIR@/*.png") +SET(RESOURCE_FILES ${RESOURCE_FILES} ${resource_files_tmp}) + +# hax to install all files under the doc/html folder in the script-launched installer +FILE(GLOB_RECURSE resource_files_tmp "@CMAKE_CURRENT_BINARY_DIR@/../doc/html/*.*") +SET(RESOURCE_FILES ${RESOURCE_FILES} ${resource_files_tmp}) + +IF(RESOURCE_FILES) + FILE(INSTALL FILES ${RESOURCE_FILES} DESTINATION "@CMAKE_INSTALL_FULL_DOCDIR@") +ENDIF(RESOURCE_FILES) + + + diff --git a/Masterarbeit/openvibe/extras-master/documentation/src/doxyfile-skeleton b/Masterarbeit/openvibe/extras-master/documentation/src/doxyfile-skeleton new file mode 100644 index 0000000..dbf602b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/documentation/src/doxyfile-skeleton @@ -0,0 +1,1516 @@ +# Doxyfile 1.5.8 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = Documentation + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = @CMAKE_CURRENT_BINARY_DIR@/../doc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, +# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, +# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, +# Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = @ov_doxy_strip_from_path@ + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it parses. +# With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this tag. +# The format is ext=language, where ext is a file extension, and language is one of +# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, +# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat +# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen to replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penality. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will rougly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = NO + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = YES + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = YES + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = NO + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = NO + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by +# doxygen. The layout file controls the global structure of the generated output files +# in an output format independent way. The create the layout file that represents +# doxygen's defaults, run doxygen with the -l option. You can optionally specify a +# file name after the option, if omitted DoxygenLayout.xml will be used as the name +# of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = doxygen.log + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = @ov_doxy_input@ + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = */doc/?ain?age.dox \ + */plugins/*/src/*.h \ + */drivers/*.h + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = @ov_doxy_input@ + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 1 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = I \ + C \ + T + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = @CMAKE_CURRENT_SOURCE_DIR@/header.html + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = @CMAKE_CURRENT_SOURCE_DIR@/footer.html + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER +# are set, an additional index file will be generated that can be used as input for +# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated +# HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. +# For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's +# filter section matches. +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to FRAME, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. Other possible values +# for this tag are: HIERARCHIES, which will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list; +# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which +# disables this behavior completely. For backwards compatibility with previous +# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE +# respectively. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +# the following pkgs seem to be required on Ubuntu 16.04 +# to compile some .tex macros like mathbb +EXTRA_PACKAGES = amssymb amsmath + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# By default doxygen will write a font called FreeSans.ttf to the output +# directory and reference it in all dot files that doxygen generates. This +# font does not include all possible unicode characters however, so when you need +# these (or just want a differently looking font) you can specify the font name +# using DOT_FONTNAME. You need need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = FreeSans + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Options related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/Masterarbeit/openvibe/extras-master/documentation/src/footer.html b/Masterarbeit/openvibe/extras-master/documentation/src/footer.html new file mode 100644 index 0000000..4bd69a5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/documentation/src/footer.html @@ -0,0 +1,5 @@ + + + diff --git a/Masterarbeit/openvibe/extras-master/documentation/src/header.html b/Masterarbeit/openvibe/extras-master/documentation/src/header.html new file mode 100644 index 0000000..e5fd518 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/documentation/src/header.html @@ -0,0 +1,59 @@ + + + + +Documentation: Home + + + + + + + + +
+
diff --git a/Masterarbeit/openvibe/extras-master/documentation/src/licence.dox b/Masterarbeit/openvibe/extras-master/documentation/src/licence.dox new file mode 100644 index 0000000..8b39c73 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/documentation/src/licence.dox @@ -0,0 +1,513 @@ +/** + +\page Doc_Licence Licence + +\section Doc_Licence_Title GNU LESSER GENERAL PUBLIC LICENSE +\subsection Doc_Licence_Version Version 2.1, February 1999 + +\verbatim + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] +\endverbatim + +\subsection Doc_Licence_Preamble Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + +\subsection Doc_Licence_Terms GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + +\subsection Doc_Licence_Warranty NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +\subsection Doc_Licence_End END OF TERMS AND CONDITIONS + +\subsection Doc_Licence_How How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + +\verbatim + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +\endverbatim + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + +\verbatim + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice +\endverbatim + +That's all there is to it! + +*/ diff --git a/Masterarbeit/openvibe/extras-master/documentation/src/openvibe-plugin-inspector.cmd b/Masterarbeit/openvibe/extras-master/documentation/src/openvibe-plugin-inspector.cmd new file mode 100644 index 0000000..727983e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/documentation/src/openvibe-plugin-inspector.cmd @@ -0,0 +1,27 @@ +REM @ECHO OFF +SETLOCAL EnableExtensions + +REM Get the directory location of this script, assume it contains the OpenViBE dist tree. These variables will be used by OpenViBE executables. +SET "OV_SOURCE=%1" +SET "OV_BUILD=%2" +SHIFT +SHIFT + +SET "OV_PATH_BIN=%OV_BUILD%\openvibe\" +SET "OV_PATH_LIB=%OV_BUILD%\openvibe\;%OV_BUILD%\modules\ebml\;%OV_BUILD%\modules\system\;%OV_BUILD%\modules\fs\;%OV_BUILD%\modules\xml\;%OV_BUILD%\modules\socket\;%OV_BUILD%\modules\automaton\;%OV_BUILD%\toolkit\" +SET "OV_PATH_DATA=%OV_BUILD%\share\openvibe" + +SET PATH=%OV_PATH_LIB%;%PATH% + + +SET "OV_ENVIRONMENT_FILE=%OV_SOURCE%\scripts\win32-dependencies.cmd" +IF NOT EXIST "%OV_ENVIRONMENT_FILE%" ( + ECHO Error: "%OV_ENVIRONMENT_FILE%" was not found + GOTO EndOfScript +) +CALL "%OV_ENVIRONMENT_FILE%" +@ECHO ON + +"%OV_BUILD%\applications\developer-tools\plugin-inspector\openvibe-plugin-inspector.exe" %* + +:EndOfScript \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/documentation/src/openvibe.dox-base b/Masterarbeit/openvibe/extras-master/documentation/src/openvibe.dox-base new file mode 100644 index 0000000..9fee61e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/documentation/src/openvibe.dox-base @@ -0,0 +1,41 @@ +/** + \mainpage Home + \section Doc_Preface Preface + + Welcome to the Doxygen Documentation for OpenViBE @PROJECT_VERSION@. + + This document has been automatically generated on Linux. Please note + + - The documentation lacks components and classes that are not compiled on Linux. + - Some source files do not have doxygen information and may not be represented here. + - Plugins such as boxes and drivers are not included in the class lists to better illustrate the core part of OpenViBE. + However, you can see the boxes on the Box Descriptions page. + + The tutorials and user manual, as well as build instructions for OpenViBE are located on the website : http://openvibe.inria.fr/documentation-index + + \section Doc_Boxes Box Descriptions + + This section contains the description of all of the Boxes available in the OpenViBE Designer. + + - \subpage Doc_BoxAlgorithms + + \subsection Doc_EBML Details on EBML + + OpenViBE uses EBML as a container for all data streams. If you would like to extend the formats of data OpenViBE can handle you might want to document yourself on EBML usage. + + - \subpage Doc_WhatIsEBML + - \subpage Doc_ParsingEBMLStreams + - \subpage Doc_FormatingEBMLStreams + + \subsection Doc_OngoingDocumentation Ongoing Documentation + - \subpage Doc_SoftwareArchitectureOverview (incomplete) + + */ + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/externals/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/externals/CMakeLists.txt new file mode 100644 index 0000000..b79809f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/externals/CMakeLists.txt @@ -0,0 +1,5 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("EXTERNALS") + + diff --git a/Masterarbeit/openvibe/extras-master/externals/README b/Masterarbeit/openvibe/extras-master/externals/README new file mode 100644 index 0000000..de809f0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/externals/README @@ -0,0 +1,34 @@ + +|OVERVIEW| + + This directory can be used if you have external modules designed for OpenViBE + that you want to include within your OpenViBE build but not necessarily + contribute. Contributed components should go to contrib/. + +|LAYOUT| + + Each subdirectory of the externals directory will be candidate for building + in the build scripts. It must conform to the usual OpenViBE directory layout. + + For example you create an application "app" based on OpenViBE, and this application uses + a collection of plugins "app-plugs". You might then have the following layout : + + openvibe-externals/ + + my-app/ + + doc/ + + ... + + src/ + + CMakeLists.txt + + my-app-plugs/ + + doc/ + + ... + + src/ + + CMakeLists.txt + +|BUILDING| + + Running the usual build should include the folders in external/ + automatically. If it doesn't, please delete local-tmp/ and try again. + + + vim:tw=78:ts=8:ft=help:norl: diff --git a/Masterarbeit/openvibe/extras-master/modules/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/modules/CMakeLists.txt new file mode 100644 index 0000000..7ec3934 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/CMakeLists.txt @@ -0,0 +1,4 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("MODULES") + diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/modules/geometry/CMakeLists.txt new file mode 100644 index 0000000..5ffb95b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/CMakeLists.txt @@ -0,0 +1,54 @@ +PROJECT(openvibe-module-geometry) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp include/*.hpp include/*.h) +INCLUDE_DIRECTORIES(include) + +# We use static library to allow template functions and stl object in class +ADD_LIBRARY(${PROJECT_NAME} STATIC ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER}) + +if(UNIX) + SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-fPIC") +ENDIF(UNIX) + +if(WIN32) +ADD_DEFINITIONS(/bigobj) # Definition for big obj file in debug mode with visual studio +ENDIF(WIN32) + +ADD_DEFINITIONS(-D_USE_MATH_DEFINES) # Definition for constant math as M_PI + + +# OpenViBE Third Party +INCLUDE("FindThirdPartyEigen") +INCLUDE("FindThirdPartyBoost") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY include/ DESTINATION ${DIST_INCLUDEDIR} FILES_MATCHING PATTERN "*.hpp" PATTERN "*.h") + +# --------------------------------- +# Test applications +# --------------------------------- +IF(OV_COMPILE_TESTS) +ADD_SUBDIRECTORY(test) +ENDIF() \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/3rd-party/tinyxml2.h b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/3rd-party/tinyxml2.h new file mode 100644 index 0000000..b16d92d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/3rd-party/tinyxml2.h @@ -0,0 +1,2053 @@ +/* +Original code by Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#ifndef TINYXML2_INCLUDED +#define TINYXML2_INCLUDED + +#if defined(ANDROID_NDK) || defined(__BORLANDC__) || defined(__QNXNTO__) +# include +# include +# include +# include +# include +# if defined(__PS3__) +# include +# endif +#else +# include +# include +# include +# include +# include +#endif +#include + +/* + TODO: intern strings instead of allocation. +*/ +/* + gcc: + g++ -Wall -DTINYXML2_DEBUG tinyxml2.cpp xmltest.cpp -o gccxmltest.exe + + Formatting, Artistic Style: + AStyle.exe --style=1tbs --indent-switches --break-closing-brackets --indent-preprocessor tinyxml2.cpp tinyxml2.h +*/ + +#if defined( _DEBUG ) || defined (__DEBUG__) +# ifndef TINYXML2_DEBUG +# define TINYXML2_DEBUG +# endif +#endif + +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable: 4251) +#endif + +#ifdef _WIN32 +# ifdef TINYXML2_EXPORT +# define TINYXML2_LIB __declspec(dllexport) +# elif defined(TINYXML2_IMPORT) +# define TINYXML2_LIB __declspec(dllimport) +# else +# define TINYXML2_LIB +# endif +#elif __GNUC__ >= 4 +# define TINYXML2_LIB __attribute__((visibility("default"))) +#else +# define TINYXML2_LIB +#endif + + +#if defined(TINYXML2_DEBUG) +# if defined(_MSC_VER) +# // "(void)0," is for suppressing C4127 warning in "assert(false)", "assert(true)" and the like +# define TIXMLASSERT( x ) if ( !((void)0,(x))) { __debugbreak(); } +# elif defined (ANDROID_NDK) +# include +# define TIXMLASSERT( x ) if ( !(x)) { __android_log_assert( "assert", "grinliz", "ASSERT in '%s' at %d.", __FILE__, __LINE__ ); } +# else +# include +# define TIXMLASSERT assert +# endif +#else +# define TIXMLASSERT( x ) {} +#endif + + +/* Versioning, past 1.0.14: + http://semver.org/ +*/ +static const int TIXML2_MAJOR_VERSION = 7; +static const int TIXML2_MINOR_VERSION = 0; +static const int TIXML2_PATCH_VERSION = 1; + +#define TINYXML2_MAJOR_VERSION 7 +#define TINYXML2_MINOR_VERSION 0 +#define TINYXML2_PATCH_VERSION 1 + +// A fixed element depth limit is problematic. There needs to be a +// limit to avoid a stack overflow. However, that limit varies per +// system, and the capacity of the stack. On the other hand, it's a trivial +// attack that can result from ill, malicious, or even correctly formed XML, +// so there needs to be a limit in place. +static const int TINYXML2_MAX_ELEMENT_DEPTH = 100; + +namespace tinyxml2 { +class XMLDocument; +class XMLElement; +class XMLAttribute; +class XMLComment; +class XMLText; +class XMLDeclaration; +class XMLUnknown; +class XMLPrinter; + +/* + A class that wraps strings. Normally stores the start and end + pointers into the XML file itself, and will apply normalization + and entity translation if actually read. Can also store (and memory + manage) a traditional char[] + + Isn't clear why TINYXML2_LIB is needed; but seems to fix #719 +*/ +class TINYXML2_LIB StrPair +{ +public: + enum + { + NEEDS_ENTITY_PROCESSING = 0x01, + NEEDS_NEWLINE_NORMALIZATION = 0x02, + NEEDS_WHITESPACE_COLLAPSING = 0x04, + + TEXT_ELEMENT = NEEDS_ENTITY_PROCESSING | NEEDS_NEWLINE_NORMALIZATION, + TEXT_ELEMENT_LEAVE_ENTITIES = NEEDS_NEWLINE_NORMALIZATION, + ATTRIBUTE_NAME = 0, + ATTRIBUTE_VALUE = NEEDS_ENTITY_PROCESSING | NEEDS_NEWLINE_NORMALIZATION, + ATTRIBUTE_VALUE_LEAVE_ENTITIES = NEEDS_NEWLINE_NORMALIZATION, + COMMENT = NEEDS_NEWLINE_NORMALIZATION + }; + + StrPair() {} + ~StrPair(); + + void Set(char* start, char* end, const int flags) + { + TIXMLASSERT(start); + TIXMLASSERT(end); + Reset(); + _start = start; + _end = end; + _flags = flags | NEEDS_FLUSH; + } + + const char* GetStr(); + + bool Empty() const { return _start == _end; } + + void SetInternedStr(const char* str) + { + Reset(); + _start = const_cast(str); + } + + void SetStr(const char* str, int flags = 0); + + char* ParseText(char* in, const char* endTag, int strFlags, int* curLineNumPtr); + char* ParseName(char* in); + + void TransferTo(StrPair* other); + void Reset(); + +private: + void CollapseWhitespace(); + + enum + { + NEEDS_FLUSH = 0x100, + NEEDS_DELETE = 0x200 + }; + + int _flags = 0; + char* _start = nullptr; + char* _end = nullptr; + + StrPair(const StrPair& other) = delete; // not supported + void operator=(const StrPair& other) = delete; // not supported, use TransferTo() +}; + + +/* + A dynamic array of Plain Old Data. Doesn't support constructors, etc. + Has a small initial memory pool, so that low or no usage will not + cause a call to new/delete +*/ +template +class DynArray +{ +public: + DynArray() : _mem(_pool) { } + + ~DynArray() { if (_mem != _pool) { delete[] _mem; } } + + void Clear() { _size = 0; } + + void Push(T t) + { + TIXMLASSERT(_size < INT_MAX); + EnsureCapacity(_size + 1); + _mem[_size] = t; + ++_size; + } + + T* PushArr(const int count) + { + TIXMLASSERT(count >= 0); + TIXMLASSERT(_size <= INT_MAX - count); + EnsureCapacity(_size + count); + T* ret = &_mem[_size]; + _size += count; + return ret; + } + + T Pop() + { + TIXMLASSERT(_size > 0); + --_size; + return _mem[_size]; + } + + void PopArr(const int count) + { + TIXMLASSERT(_size >= count); + _size -= count; + } + + bool Empty() const { return _size == 0; } + + T& operator[](int i) + { + TIXMLASSERT(i >= 0 && i < _size); + return _mem[i]; + } + + const T& operator[](int i) const + { + TIXMLASSERT(i >= 0 && i < _size); + return _mem[i]; + } + + const T& PeekTop() const + { + TIXMLASSERT(_size > 0); + return _mem[_size - 1]; + } + + int Size() const + { + TIXMLASSERT(_size >= 0); + return _size; + } + + int Capacity() const + { + TIXMLASSERT(_allocated >= INITIAL_SIZE); + return _allocated; + } + + void SwapRemove(int i) + { + TIXMLASSERT(i >= 0 && i < _size); + TIXMLASSERT(_size > 0); + _mem[i] = _mem[_size - 1]; + --_size; + } + + const T* Mem() const + { + TIXMLASSERT(_mem); + return _mem; + } + + T* Mem() + { + TIXMLASSERT(_mem); + return _mem; + } + +private: + DynArray(const DynArray&) = delete; // not supported + void operator=(const DynArray&) = delete; // not supported + + void EnsureCapacity(const int cap) + { + TIXMLASSERT(cap > 0); + if (cap > _allocated) + { + TIXMLASSERT(cap <= INT_MAX / 2); + const int newAllocated = cap * 2; + T* newMem = new T[newAllocated]; + TIXMLASSERT(newAllocated >= _size); + memcpy(newMem, _mem, sizeof(T) * _size); // warning: not using constructors, only works for PODs + if (_mem != _pool) { delete[] _mem; } + _mem = newMem; + _allocated = newAllocated; + } + } + + T* _mem; + T _pool[INITIAL_SIZE]; + int _allocated = INITIAL_SIZE; // objects allocated + int _size = 0; // number objects in use +}; + + +/* + Parent virtual class of a pool for fast allocation + and deallocation of objects. +*/ +class MemPool +{ +public: + MemPool() {} + virtual ~MemPool() {} + + virtual int ItemSize() const = 0; + virtual void* Alloc() = 0; + virtual void Free(void*) = 0; + virtual void SetTracked() = 0; +}; + + +/* + Template child class to create pools of the correct type. +*/ +template +class MemPoolT : public MemPool +{ +public: + MemPoolT() : _blockPtrs(), _root(nullptr) {} + ~MemPoolT() override { Clear(); } + + void Clear() + { + // Delete the blocks. + while (!_blockPtrs.Empty()) + { + Block* lastBlock = _blockPtrs.Pop(); + delete lastBlock; + } + _root = 0; + _currentAllocs = 0; + _nAllocs = 0; + _maxAllocs = 0; + _nUntracked = 0; + } + + int ItemSize() const override { return ITEM_SIZE; } + int CurrentAllocs() const { return _currentAllocs; } + + void* Alloc() override + { + if (!_root) + { + // Need a new block. + Block* block = new Block(); + _blockPtrs.Push(block); + + Item* blockItems = block->items; + for (int i = 0; i < ITEMS_PER_BLOCK - 1; ++i) { blockItems[i].next = &(blockItems[i + 1]); } + blockItems[ITEMS_PER_BLOCK - 1].next = 0; + _root = blockItems; + } + Item* const result = _root; + TIXMLASSERT(result != nullptr); + _root = _root->next; + + ++_currentAllocs; + if (_currentAllocs > _maxAllocs) { _maxAllocs = _currentAllocs; } + ++_nAllocs; + ++_nUntracked; + return result; + } + + void Free(void* mem) override + { + if (!mem) { return; } + --_currentAllocs; + Item* item = static_cast(mem); +#ifdef TINYXML2_DEBUG + memset(item, 0xfe, sizeof(*item)); +#endif + item->next = _root; + _root = item; + } + + void Trace(const char* name) + { + printf("Mempool %s watermark=%d [%dk] current=%d size=%d nAlloc=%d blocks=%d\n", + name, _maxAllocs, _maxAllocs * ITEM_SIZE / 1024, _currentAllocs, + ITEM_SIZE, _nAllocs, _blockPtrs.Size()); + } + + void SetTracked() override { --_nUntracked; } + + int Untracked() const { return _nUntracked; } + + // This number is perf sensitive. 4k seems like a good tradeoff on my machine. + // The test file is large, 170k. + // Release: VS2010 gcc(no opt) + // 1k: 4000 + // 2k: 4000 + // 4k: 3900 21000 + // 16k: 5200 + // 32k: 4300 + // 64k: 4000 21000 + // Declared public because some compilers do not accept to use ITEMS_PER_BLOCK + // in private part if ITEMS_PER_BLOCK is private + enum { ITEMS_PER_BLOCK = (4 * 1024) / ITEM_SIZE }; + +private: + MemPoolT(const MemPoolT&) = delete; // not supported + void operator=(const MemPoolT&) = delete; // not supported + + union Item + { + Item* next; + char itemData[ITEM_SIZE]; + }; + + struct Block + { + Item items[ITEMS_PER_BLOCK]; + }; + + DynArray _blockPtrs; + Item* _root = nullptr; + + int _currentAllocs = 0; + int _nAllocs = 0; + int _maxAllocs = 0; + int _nUntracked = 0; +}; + + +/** + Implements the interface to the "Visitor pattern" (see the Accept() method.) + If you call the Accept() method, it requires being passed a XMLVisitor + class to handle callbacks. For nodes that contain other nodes (Document, Element) + you will get called with a VisitEnter/VisitExit pair. Nodes that are always leafs + are simply called with Visit(). + + If you return 'true' from a Visit method, recursive parsing will continue. If you return + false, no children of this node or its siblings will be visited. + + All flavors of Visit methods have a default implementation that returns 'true' (continue + visiting). You need to only override methods that are interesting to you. + + Generally Accept() is called on the XMLDocument, although all nodes support visiting. + + You should never change the document from a callback. + + @sa XMLNode::Accept() +*/ +class TINYXML2_LIB XMLVisitor +{ +public: + virtual ~XMLVisitor() {} + + /// Visit a document. + virtual bool VisitEnter(const XMLDocument& /*doc*/) { return true; } + /// Visit a document. + virtual bool VisitExit(const XMLDocument& /*doc*/) { return true; } + + /// Visit an element. + virtual bool VisitEnter(const XMLElement& /*element*/, const XMLAttribute* /*firstAttribute*/) { return true; } + /// Visit an element. + virtual bool VisitExit(const XMLElement& /*element*/) { return true; } + + /// Visit a declaration. + virtual bool Visit(const XMLDeclaration& /*declaration*/) { return true; } + /// Visit a text node. + virtual bool Visit(const XMLText& /*text*/) { return true; } + /// Visit a comment node. + virtual bool Visit(const XMLComment& /*comment*/) { return true; } + /// Visit an unknown node. + virtual bool Visit(const XMLUnknown& /*unknown*/) { return true; } +}; + +// WARNING: must match XMLDocument::_errorNames[] +enum XMLError +{ + XML_SUCCESS = 0, + XML_NO_ATTRIBUTE, + XML_WRONG_ATTRIBUTE_TYPE, + XML_ERROR_FILE_NOT_FOUND, + XML_ERROR_FILE_COULD_NOT_BE_OPENED, + XML_ERROR_FILE_READ_ERROR, + XML_ERROR_PARSING_ELEMENT, + XML_ERROR_PARSING_ATTRIBUTE, + XML_ERROR_PARSING_TEXT, + XML_ERROR_PARSING_CDATA, + XML_ERROR_PARSING_COMMENT, + XML_ERROR_PARSING_DECLARATION, + XML_ERROR_PARSING_UNKNOWN, + XML_ERROR_EMPTY_DOCUMENT, + XML_ERROR_MISMATCHED_ELEMENT, + XML_ERROR_PARSING, + XML_CAN_NOT_CONVERT_TEXT, + XML_NO_TEXT_NODE, + XML_ELEMENT_DEPTH_EXCEEDED, + + XML_ERROR_COUNT +}; + + +/* + Utility functionality. +*/ +class TINYXML2_LIB XMLUtil +{ +public: + static const char* SkipWhiteSpace(const char* p, int* curLineNumPtr) + { + TIXMLASSERT(p); + + while (IsWhiteSpace(*p)) + { + if (curLineNumPtr && *p == '\n') { ++(*curLineNumPtr); } + ++p; + } + TIXMLASSERT(p); + return p; + } + + static char* SkipWhiteSpace(char* p, int* curLineNumPtr) { return const_cast(SkipWhiteSpace(const_cast(p), curLineNumPtr)); } + + // Anything in the high order range of UTF-8 is assumed to not be whitespace. This isn't + // correct, but simple, and usually works. + static bool IsWhiteSpace(const char p) { return !IsUTF8Continuation(p) && isspace(static_cast(p)); } + + static bool IsNameStartChar(const unsigned char ch) + { + if (ch >= 128) { return true; } // This is a heuristic guess in attempt to not implement Unicode-aware isalpha() + if (isalpha(ch)) { return true; } + return ch == ':' || ch == '_'; + } + + static bool IsNameChar(const unsigned char ch) { return IsNameStartChar(ch) || isdigit(ch) || ch == '.' || ch == '-'; } + + static bool StringEqual(const char* p, const char* q, const int nChar = INT_MAX) + { + if (p == q) { return true; } + TIXMLASSERT(p); + TIXMLASSERT(q); + TIXMLASSERT(nChar >= 0); + return strncmp(p, q, nChar) == 0; + } + + static bool IsUTF8Continuation(const char p) { return (p & 0x80) != 0; } + + static const char* ReadBOM(const char* p, bool* bom); + // p is the starting location, + // the UTF-8 value of the entity will be placed in value, and length filled in. + static const char* GetCharacterRef(const char* p, char* value, int* length); + static void ConvertUTF32ToUTF8(unsigned long input, char* output, int* length); + + // converts primitive types to strings + static void ToStr(int value, char* buffer, int size); + static void ToStr(unsigned value, char* buffer, int size); + static void ToStr(bool value, char* buffer, int size); + static void ToStr(float value, char* buffer, int size); + static void ToStr(double value, char* buffer, int size); + static void ToStr(int64_t value, char* buffer, int size); + + // converts strings to primitive types + static bool ToInt(const char* str, int* value); + static bool ToUnsigned(const char* str, unsigned* value); + static bool ToBool(const char* str, bool* value); + static bool ToFloat(const char* str, float* value); + static bool ToDouble(const char* str, double* value); + static bool ToInt64(const char* str, int64_t* value); + + // Changes what is serialized for a boolean value. + // Default to "true" and "false". Shouldn't be changed + // unless you have a special testing or compatibility need. + // Be careful: static, global, & not thread safe. + // Be sure to set static const memory as parameters. + static void SetBoolSerialization(const char* writeTrue, const char* writeFalse); + +private: + static const char* writeBoolTrue; + static const char* writeBoolFalse; +}; + + +/** XMLNode is a base class for every object that is in the + XML Document Object Model (DOM), except XMLAttributes. + Nodes have siblings, a parent, and children which can + be navigated. A node is always in a XMLDocument. + The type of a XMLNode can be queried, and it can + be cast to its more defined type. + + A XMLDocument allocates memory for all its Nodes. + When the XMLDocument gets deleted, all its Nodes + will also be deleted. + + @verbatim + A Document can contain: Element (container or leaf) + Comment (leaf) + Unknown (leaf) + Declaration( leaf ) + + An Element can contain: Element (container or leaf) + Text (leaf) + Attributes (not on tree) + Comment (leaf) + Unknown (leaf) + + @endverbatim +*/ +class TINYXML2_LIB XMLNode +{ + friend class XMLDocument; + friend class XMLElement; +public: + + /// Get the XMLDocument that owns this XMLNode. + const XMLDocument* GetDocument() const + { + TIXMLASSERT(_document); + return _document; + } + /// Get the XMLDocument that owns this XMLNode. + XMLDocument* GetDocument() + { + TIXMLASSERT(_document); + return _document; + } + + /// Safely cast to an Element, or null. + virtual XMLElement* ToElement() { return nullptr; } + /// Safely cast to Text, or null. + virtual XMLText* ToText() { return nullptr; } + /// Safely cast to a Comment, or null. + virtual XMLComment* ToComment() { return nullptr; } + /// Safely cast to a Document, or null. + virtual XMLDocument* ToDocument() { return nullptr; } + /// Safely cast to a Declaration, or null. + virtual XMLDeclaration* ToDeclaration() { return nullptr; } + /// Safely cast to an Unknown, or null. + virtual XMLUnknown* ToUnknown() { return nullptr; } + + virtual const XMLElement* ToElement() const { return nullptr; } + virtual const XMLText* ToText() const { return nullptr; } + virtual const XMLComment* ToComment() const { return nullptr; } + virtual const XMLDocument* ToDocument() const { return nullptr; } + virtual const XMLDeclaration* ToDeclaration() const { return nullptr; } + virtual const XMLUnknown* ToUnknown() const { return nullptr; } + + /** The meaning of 'value' changes for the specific type. + @verbatim + Document: empty (NULL is returned, not an empty string) + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text string + @endverbatim + */ + const char* Value() const; + + /** Set the Value of an XML node. + @sa Value() + */ + void SetValue(const char* val, bool staticMem = false); + + /// Gets the line number the node is in, if the document was parsed from a file. + int GetLineNum() const { return _parseLineNum; } + + /// Get the parent of this node on the DOM. + const XMLNode* Parent() const { return _parent; } + + XMLNode* Parent() { return _parent; } + + /// Returns true if this node has no children. + bool NoChildren() const { return !_firstChild; } + + /// Get the first child node, or null if none exists. + const XMLNode* FirstChild() const { return _firstChild; } + + XMLNode* FirstChild() { return _firstChild; } + + /** Get the first child element, or optionally the first child + element with the specified name. + */ + const XMLElement* FirstChildElement(const char* name = nullptr) const; + + XMLElement* FirstChildElement(const char* name = nullptr) { return const_cast(const_cast(this)->FirstChildElement(name)); } + + /// Get the last child node, or null if none exists. + const XMLNode* LastChild() const { return _lastChild; } + + XMLNode* LastChild() { return _lastChild; } + + /** Get the last child element or optionally the last child + element with the specified name. + */ + const XMLElement* LastChildElement(const char* name = nullptr) const; + + XMLElement* LastChildElement(const char* name = nullptr) { return const_cast(const_cast(this)->LastChildElement(name)); } + + /// Get the previous (left) sibling node of this node. + const XMLNode* PreviousSibling() const { return _prev; } + + XMLNode* PreviousSibling() { return _prev; } + + /// Get the previous (left) sibling element of this node, with an optionally supplied name. + const XMLElement* PreviousSiblingElement(const char* name = nullptr) const; + + XMLElement* PreviousSiblingElement(const char* name = nullptr) + { + return const_cast(const_cast(this)->PreviousSiblingElement(name)); + } + + /// Get the next (right) sibling node of this node. + const XMLNode* NextSibling() const { return _next; } + + XMLNode* NextSibling() { return _next; } + + /// Get the next (right) sibling element of this node, with an optionally supplied name. + const XMLElement* NextSiblingElement(const char* name = nullptr) const; + + XMLElement* NextSiblingElement(const char* name = nullptr) { return const_cast(const_cast(this)->NextSiblingElement(name)); } + + /** + Add a child node as the last (right) child. + If the child node is already part of the document, + it is moved from its old location to the new location. + Returns the addThis argument or 0 if the node does not + belong to the same document. + */ + XMLNode* InsertEndChild(XMLNode* addThis); + + XMLNode* LinkEndChild(XMLNode* addThis) { return InsertEndChild(addThis); } + /** + Add a child node as the first (left) child. + If the child node is already part of the document, + it is moved from its old location to the new location. + Returns the addThis argument or 0 if the node does not + belong to the same document. + */ + XMLNode* InsertFirstChild(XMLNode* addThis); + /** + Add a node after the specified child node. + If the child node is already part of the document, + it is moved from its old location to the new location. + Returns the addThis argument or 0 if the afterThis node + is not a child of this node, or if the node does not + belong to the same document. + */ + XMLNode* InsertAfterChild(XMLNode* afterThis, XMLNode* addThis); + + /** + Delete all the children of this node. + */ + void DeleteChildren(); + + /** + Delete a child of this node. + */ + void DeleteChild(XMLNode* node); + + /** + Make a copy of this node, but not its children. + You may pass in a Document pointer that will be + the owner of the new Node. If the 'document' is + null, then the node returned will be allocated + from the current Document. (this->GetDocument()) + + Note: if called on a XMLDocument, this will return null. + */ + virtual XMLNode* ShallowClone(XMLDocument* document) const = 0; + + /** + Make a copy of this node and all its children. + + If the 'target' is null, then the nodes will + be allocated in the current document. If 'target' + is specified, the memory will be allocated is the + specified XMLDocument. + + NOTE: This is probably not the correct tool to + copy a document, since XMLDocuments can have multiple + top level XMLNodes. You probably want to use + XMLDocument::DeepCopy() + */ + XMLNode* DeepClone(XMLDocument* target) const; + + /** + Test if 2 nodes are the same, but don't test children. + The 2 nodes do not need to be in the same Document. + + Note: if called on a XMLDocument, this will return false. + */ + virtual bool ShallowEqual(const XMLNode* compare) const = 0; + + /** Accept a hierarchical visit of the nodes in the TinyXML-2 DOM. Every node in the + XML tree will be conditionally visited and the host will be called back + via the XMLVisitor interface. + + This is essentially a SAX interface for TinyXML-2. (Note however it doesn't re-parse + the XML for the callbacks, so the performance of TinyXML-2 is unchanged by using this + interface versus any other.) + + The interface has been based on ideas from: + + - http://www.saxproject.org/ + - http://c2.com/cgi/wiki?HierarchicalVisitorPattern + + Which are both good references for "visiting". + + An example of using Accept(): + @verbatim + XMLPrinter printer; + tinyxmlDoc.Accept( &printer ); + const char* xmlcstr = printer.CStr(); + @endverbatim + */ + virtual bool Accept(XMLVisitor* visitor) const = 0; + + /** + Set user data into the XMLNode. TinyXML-2 in + no way processes or interprets user data. + It is initially 0. + */ + void SetUserData(void* userData) { _userData = userData; } + + /** + Get user data set into the XMLNode. TinyXML-2 in + no way processes or interprets user data. + It is initially 0. + */ + void* GetUserData() const { return _userData; } + +protected: + explicit XMLNode(XMLDocument* doc); + virtual ~XMLNode(); + + virtual char* ParseDeep(char* p, StrPair* parentEndTag, int* curLineNumPtr); + + XMLDocument* _document = nullptr; + XMLNode* _parent = nullptr; + mutable StrPair _value; + int _parseLineNum = 0; + + XMLNode* _firstChild = nullptr; + XMLNode* _lastChild = nullptr; + + XMLNode* _prev = nullptr; + XMLNode* _next = nullptr; + + void* _userData = nullptr; + +private: + MemPool* _memPool; + void Unlink(XMLNode* child); + static void DeleteNode(XMLNode* node); + void InsertChildPreamble(XMLNode* insertThis) const; + const XMLElement* ToElementWithName(const char* name) const; + + XMLNode(const XMLNode&) = delete; // not supported + XMLNode& operator=(const XMLNode&) = delete; // not supported +}; + + +/** XML text. + + Note that a text node can have child element nodes, for example: + @verbatim + This is bold + @endverbatim + + A text node can have 2 ways to output the next. "normal" output + and CDATA. It will default to the mode it was parsed from the XML file and + you generally want to leave it alone, but you can change the output mode with + SetCData() and query it with CData(). +*/ +class TINYXML2_LIB XMLText : public XMLNode +{ + friend class XMLDocument; +public: + bool Accept(XMLVisitor* visitor) const override; + XMLText* ToText() override { return this; } + const XMLText* ToText() const override { return this; } + + /// Declare whether this should be CDATA or standard text. + void SetCData(const bool isCData) { _isCData = isCData; } + /// Returns true if this is a CDATA text element. + bool CData() const { return _isCData; } + XMLNode* ShallowClone(XMLDocument* doc) const override; + bool ShallowEqual(const XMLNode* compare) const override; + +protected: + explicit XMLText(XMLDocument* doc) : XMLNode(doc), _isCData(false) {} + ~XMLText() override {} + + char* ParseDeep(char* p, StrPair* parentEndTag, int* curLineNumPtr) override; + +private: + bool _isCData; + + XMLText(const XMLText&) = delete; // not supported + XMLText& operator=(const XMLText&) = delete; // not supported +}; + + +/** An XML Comment. */ +class TINYXML2_LIB XMLComment : public XMLNode +{ + friend class XMLDocument; +public: + XMLComment* ToComment() override { return this; } + const XMLComment* ToComment() const override { return this; } + bool Accept(XMLVisitor* visitor) const override; + XMLNode* ShallowClone(XMLDocument* doc) const override; + bool ShallowEqual(const XMLNode* compare) const override; + +protected: + explicit XMLComment(XMLDocument* doc) : XMLNode(doc) { } + ~XMLComment() override { } + + char* ParseDeep(char* p, StrPair* parentEndTag, int* curLineNumPtr) override; + +private: + XMLComment(const XMLComment&) = delete; // not supported + XMLComment& operator=(const XMLComment&) = delete; // not supported +}; + + +/** In correct XML the declaration is the first entry in the file. + @verbatim + + @endverbatim + + TinyXML-2 will happily read or write files without a declaration, + however. + + The text of the declaration isn't interpreted. It is parsed + and written as a string. +*/ +class TINYXML2_LIB XMLDeclaration : public XMLNode +{ + friend class XMLDocument; +public: + XMLDeclaration* ToDeclaration() override { return this; } + const XMLDeclaration* ToDeclaration() const override { return this; } + bool Accept(XMLVisitor* visitor) const override; + XMLNode* ShallowClone(XMLDocument* doc) const override; + bool ShallowEqual(const XMLNode* compare) const override; + +protected: + explicit XMLDeclaration(XMLDocument* doc) : XMLNode(doc) { } + ~XMLDeclaration() override { } + + char* ParseDeep(char* p, StrPair* parentEndTag, int* curLineNumPtr) override; + +private: + XMLDeclaration(const XMLDeclaration&) = delete; // not supported + XMLDeclaration& operator=(const XMLDeclaration&) = delete; // not supported +}; + + +/** Any tag that TinyXML-2 doesn't recognize is saved as an + unknown. It is a tag of text, but should not be modified. + It will be written back to the XML, unchanged, when the file + is saved. + + DTD tags get thrown into XMLUnknowns. +*/ +class TINYXML2_LIB XMLUnknown : public XMLNode +{ + friend class XMLDocument; +public: + XMLUnknown* ToUnknown() override { return this; } + const XMLUnknown* ToUnknown() const override { return this; } + bool Accept(XMLVisitor* visitor) const override; + XMLNode* ShallowClone(XMLDocument* doc) const override; + bool ShallowEqual(const XMLNode* compare) const override; + +protected: + explicit XMLUnknown(XMLDocument* doc) : XMLNode(doc) { } + ~XMLUnknown() override { } + + char* ParseDeep(char* p, StrPair* parentEndTag, int* curLineNumPtr) override; + +private: + XMLUnknown(const XMLUnknown&) = delete; // not supported + XMLUnknown& operator=(const XMLUnknown&) = delete; // not supported +}; + + +/** An attribute is a name-value pair. Elements have an arbitrary + number of attributes, each with a unique name. + + @note The attributes are not XMLNodes. You may only query the + Next() attribute in a list. +*/ +class TINYXML2_LIB XMLAttribute +{ + friend class XMLElement; +public: + /// The name of the attribute. + const char* Name() const { return _name.GetStr(); } + + /// The value of the attribute. + const char* Value() const { return _value.GetStr(); } + + /// Gets the line number the attribute is in, if the document was parsed from a file. + int GetLineNum() const { return _parseLineNum; } + + /// The next attribute in the list. + const XMLAttribute* Next() const { return _next; } + + /** IntValue interprets the attribute as an integer, and returns the value. + If the value isn't an integer, 0 will be returned. There is no error checking; + use QueryIntValue() if you need error checking. + */ + int IntValue() const + { + int i = 0; + QueryIntValue(&i); + return i; + } + + int64_t Int64Value() const + { + int64_t i = 0; + QueryInt64Value(&i); + return i; + } + + /// Query as an unsigned integer. See IntValue() + unsigned UnsignedValue() const + { + unsigned i = 0; + QueryUnsignedValue(&i); + return i; + } + /// Query as a boolean. See IntValue() + bool BoolValue() const + { + bool b = false; + QueryBoolValue(&b); + return b; + } + /// Query as a double. See IntValue() + double DoubleValue() const + { + double d = 0; + QueryDoubleValue(&d); + return d; + } + /// Query as a float. See IntValue() + float FloatValue() const + { + float f = 0; + QueryFloatValue(&f); + return f; + } + + /** QueryIntValue interprets the attribute as an integer, and returns the value + in the provided parameter. The function will return XML_SUCCESS on success, + and XML_WRONG_ATTRIBUTE_TYPE if the conversion is not successful. + */ + XMLError QueryIntValue(int* value) const; + /// See QueryIntValue + XMLError QueryUnsignedValue(unsigned int* value) const; + /// See QueryIntValue + XMLError QueryInt64Value(int64_t* value) const; + /// See QueryIntValue + XMLError QueryBoolValue(bool* value) const; + /// See QueryIntValue + XMLError QueryDoubleValue(double* value) const; + /// See QueryIntValue + XMLError QueryFloatValue(float* value) const; + + /// Set the attribute to a string value. + void SetAttribute(const char* value) { _value.SetStr(value); } + /// Set the attribute to value. + void SetAttribute(int value); + /// Set the attribute to value. + void SetAttribute(unsigned value); + /// Set the attribute to value. + void SetAttribute(int64_t value); + /// Set the attribute to value. + void SetAttribute(bool value); + /// Set the attribute to value. + void SetAttribute(double value); + /// Set the attribute to value. + void SetAttribute(float value); + +private: + enum { BUF_SIZE = 200 }; + + XMLAttribute() {} + virtual ~XMLAttribute() {} + + XMLAttribute(const XMLAttribute&) = delete; // not supported + void operator=(const XMLAttribute&) = delete; // not supported + void SetName(const char* name) { _name.SetStr(name); } + + char* ParseDeep(char* p, bool processEntities, int* curLineNumPtr); + + mutable StrPair _name; + mutable StrPair _value; + int _parseLineNum = 0; + XMLAttribute* _next = nullptr; + MemPool* _memPool = nullptr; +}; + + +/** The element is a container class. It has a value, the element name, + and can contain other elements, text, comments, and unknowns. + Elements also contain an arbitrary number of attributes. +*/ +class TINYXML2_LIB XMLElement : public XMLNode +{ + friend class XMLDocument; +public: + /// Get the name of an element (which is the Value() of the node.) + const char* Name() const { return Value(); } + /// Set the name of the element. + void SetName(const char* str, const bool staticMem = false) { SetValue(str, staticMem); } + XMLElement* ToElement() override { return this; } + const XMLElement* ToElement() const override { return this; } + bool Accept(XMLVisitor* visitor) const override; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none + exists. For example: + + @verbatim + const char* value = ele->Attribute( "foo" ); + @endverbatim + + The 'value' parameter is normally null. However, if specified, + the attribute will only be returned if the 'name' and 'value' + match. This allow you to write code: + + @verbatim + if ( ele->Attribute( "foo", "bar" ) ) callFooIsBar(); + @endverbatim + + rather than: + @verbatim + if ( ele->Attribute( "foo" ) ) { if ( strcmp( ele->Attribute( "foo" ), "bar" ) == 0 ) callFooIsBar(); } + @endverbatim + */ + const char* Attribute(const char* name, const char* value = nullptr) const; + + /** Given an attribute name, IntAttribute() returns the value + of the attribute interpreted as an integer. The default + value will be returned if the attribute isn't present, + or if there is an error. (For a method with error + checking, see QueryIntAttribute()). + */ + int IntAttribute(const char* name, int defaultValue = 0) const; + /// See IntAttribute() + unsigned UnsignedAttribute(const char* name, unsigned defaultValue = 0) const; + /// See IntAttribute() + int64_t Int64Attribute(const char* name, int64_t defaultValue = 0) const; + /// See IntAttribute() + bool BoolAttribute(const char* name, bool defaultValue = false) const; + /// See IntAttribute() + double DoubleAttribute(const char* name, double defaultValue = 0) const; + /// See IntAttribute() + float FloatAttribute(const char* name, float defaultValue = 0) const; + + /** Given an attribute name, QueryIntAttribute() returns + XML_SUCCESS, XML_WRONG_ATTRIBUTE_TYPE if the conversion + can't be performed, or XML_NO_ATTRIBUTE if the attribute + doesn't exist. If successful, the result of the conversion + will be written to 'value'. If not successful, nothing will + be written to 'value'. This allows you to provide default + value: + + @verbatim + int value = 10; + QueryIntAttribute( "foo", &value ); // if "foo" isn't found, value will still be 10 + @endverbatim + */ + XMLError QueryIntAttribute(const char* name, int* value) const + { + const XMLAttribute* a = FindAttribute(name); + if (!a) { return XML_NO_ATTRIBUTE; } + return a->QueryIntValue(value); + } + + /// See QueryIntAttribute() + XMLError QueryUnsignedAttribute(const char* name, unsigned int* value) const + { + const XMLAttribute* a = FindAttribute(name); + if (!a) { return XML_NO_ATTRIBUTE; } + return a->QueryUnsignedValue(value); + } + + /// See QueryIntAttribute() + XMLError QueryInt64Attribute(const char* name, int64_t* value) const + { + const XMLAttribute* a = FindAttribute(name); + if (!a) { return XML_NO_ATTRIBUTE; } + return a->QueryInt64Value(value); + } + + /// See QueryIntAttribute() + XMLError QueryBoolAttribute(const char* name, bool* value) const + { + const XMLAttribute* a = FindAttribute(name); + if (!a) { return XML_NO_ATTRIBUTE; } + return a->QueryBoolValue(value); + } + /// See QueryIntAttribute() + XMLError QueryDoubleAttribute(const char* name, double* value) const + { + const XMLAttribute* a = FindAttribute(name); + if (!a) { return XML_NO_ATTRIBUTE; } + return a->QueryDoubleValue(value); + } + /// See QueryIntAttribute() + XMLError QueryFloatAttribute(const char* name, float* value) const + { + const XMLAttribute* a = FindAttribute(name); + if (!a) { return XML_NO_ATTRIBUTE; } + return a->QueryFloatValue(value); + } + + /// See QueryIntAttribute() + XMLError QueryStringAttribute(const char* name, const char** value) const + { + const XMLAttribute* a = FindAttribute(name); + if (!a) { return XML_NO_ATTRIBUTE; } + *value = a->Value(); + return XML_SUCCESS; + } + + + /** Given an attribute name, QueryAttribute() returns + XML_SUCCESS, XML_WRONG_ATTRIBUTE_TYPE if the conversion + can't be performed, or XML_NO_ATTRIBUTE if the attribute + doesn't exist. It is overloaded for the primitive types, + and is a generally more convenient replacement of + QueryIntAttribute() and related functions. + + If successful, the result of the conversion + will be written to 'value'. If not successful, nothing will + be written to 'value'. This allows you to provide default + value: + + @verbatim + int value = 10; + QueryAttribute( "foo", &value ); // if "foo" isn't found, value will still be 10 + @endverbatim + */ + XMLError QueryAttribute(const char* name, int* value) const { return QueryIntAttribute(name, value); } + XMLError QueryAttribute(const char* name, unsigned int* value) const { return QueryUnsignedAttribute(name, value); } + XMLError QueryAttribute(const char* name, int64_t* value) const { return QueryInt64Attribute(name, value); } + XMLError QueryAttribute(const char* name, bool* value) const { return QueryBoolAttribute(name, value); } + XMLError QueryAttribute(const char* name, double* value) const { return QueryDoubleAttribute(name, value); } + XMLError QueryAttribute(const char* name, float* value) const { return QueryFloatAttribute(name, value); } + + /// Sets the named attribute to value. + void SetAttribute(const char* name, const char* value) + { + XMLAttribute* a = FindOrCreateAttribute(name); + a->SetAttribute(value); + } + /// Sets the named attribute to value. + void SetAttribute(const char* name, const int value) + { + XMLAttribute* a = FindOrCreateAttribute(name); + a->SetAttribute(value); + } + /// Sets the named attribute to value. + void SetAttribute(const char* name, const unsigned value) + { + XMLAttribute* a = FindOrCreateAttribute(name); + a->SetAttribute(value); + } + + /// Sets the named attribute to value. + void SetAttribute(const char* name, const int64_t value) + { + XMLAttribute* a = FindOrCreateAttribute(name); + a->SetAttribute(value); + } + + /// Sets the named attribute to value. + void SetAttribute(const char* name, const bool value) + { + XMLAttribute* a = FindOrCreateAttribute(name); + a->SetAttribute(value); + } + /// Sets the named attribute to value. + void SetAttribute(const char* name, const double value) + { + XMLAttribute* a = FindOrCreateAttribute(name); + a->SetAttribute(value); + } + /// Sets the named attribute to value. + void SetAttribute(const char* name, const float value) + { + XMLAttribute* a = FindOrCreateAttribute(name); + a->SetAttribute(value); + } + + /** + Delete an attribute. + */ + void DeleteAttribute(const char* name); + + /// Return the first attribute in the list. + const XMLAttribute* FirstAttribute() const { return _rootAttribute; } + /// Query a specific attribute in the list. + const XMLAttribute* FindAttribute(const char* name) const; + + /** Convenience function for easy access to the text inside an element. Although easy + and concise, GetText() is limited compared to getting the XMLText child + and accessing it directly. + + If the first child of 'this' is a XMLText, the GetText() + returns the character string of the Text node, else null is returned. + + This is a convenient method for getting the text of simple contained text: + @verbatim + This is text + const char* str = fooElement->GetText(); + @endverbatim + + 'str' will be a pointer to "This is text". + + Note that this function can be misleading. If the element foo was created from + this XML: + @verbatim + This is text + @endverbatim + + then the value of str would be null. The first child node isn't a text node, it is + another element. From this XML: + @verbatim + This is text + @endverbatim + GetText() will return "This is ". + */ + const char* GetText() const; + + /** Convenience function for easy access to the text inside an element. Although easy + and concise, SetText() is limited compared to creating an XMLText child + and mutating it directly. + + If the first child of 'this' is a XMLText, SetText() sets its value to + the given string, otherwise it will create a first child that is an XMLText. + + This is a convenient method for setting the text of simple contained text: + @verbatim + This is text + fooElement->SetText( "Hullaballoo!" ); + Hullaballoo! + @endverbatim + + Note that this function can be misleading. If the element foo was created from + this XML: + @verbatim + This is text + @endverbatim + + then it will not change "This is text", but rather prefix it with a text element: + @verbatim + Hullaballoo!This is text + @endverbatim + + For this XML: + @verbatim + + @endverbatim + SetText() will generate + @verbatim + Hullaballoo! + @endverbatim + */ + void SetText(const char* inText); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText(int value); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText(unsigned value); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText(int64_t value); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText(bool value); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText(double value); + /// Convenience method for setting text inside an element. See SetText() for important limitations. + void SetText(float value); + + /** + Convenience method to query the value of a child text node. This is probably best + shown by example. Given you have a document is this form: + @verbatim + + 1 + 1.4 + + @endverbatim + + The QueryIntText() and similar functions provide a safe and easier way to get to the + "value" of x and y. + + @verbatim + int x = 0; + float y = 0; // types of x and y are contrived for example + const XMLElement* xElement = pointElement->FirstChildElement( "x" ); + const XMLElement* yElement = pointElement->FirstChildElement( "y" ); + xElement->QueryIntText( &x ); + yElement->QueryFloatText( &y ); + @endverbatim + + @returns XML_SUCCESS (0) on success, XML_CAN_NOT_CONVERT_TEXT if the text cannot be converted + to the requested type, and XML_NO_TEXT_NODE if there is no child text to query. + + */ + XMLError QueryIntText(int* val) const; + /// See QueryIntText() + XMLError QueryUnsignedText(unsigned* val) const; + /// See QueryIntText() + XMLError QueryInt64Text(int64_t* val) const; + /// See QueryIntText() + XMLError QueryBoolText(bool* val) const; + /// See QueryIntText() + XMLError QueryDoubleText(double* val) const; + /// See QueryIntText() + XMLError QueryFloatText(float* val) const; + + int IntText(int defaultValue = 0) const; + + /// See QueryIntText() + unsigned UnsignedText(unsigned defaultValue = 0) const; + /// See QueryIntText() + int64_t Int64Text(int64_t defaultValue = 0) const; + /// See QueryIntText() + bool BoolText(bool defaultValue = false) const; + /// See QueryIntText() + double DoubleText(double defaultValue = 0) const; + /// See QueryIntText() + float FloatText(float defaultValue = 0) const; + + // internal: + enum ElementClosingType + { + OPEN, // + CLOSED, // + CLOSING // + }; + + ElementClosingType ClosingType() const { return _closingType; } + XMLNode* ShallowClone(XMLDocument* doc) const override; + bool ShallowEqual(const XMLNode* compare) const override; + +protected: + char* ParseDeep(char* p, StrPair* parentEndTag, int* curLineNumPtr) override; + +private: + explicit XMLElement(XMLDocument* doc) : XMLNode(doc) { } + ~XMLElement() override; + XMLElement(const XMLElement&) = delete; // not supported + void operator=(const XMLElement&) = delete; // not supported + + XMLAttribute* FindOrCreateAttribute(const char* name); + char* ParseAttributes(char* p, int* curLineNumPtr); + static void DeleteAttribute(XMLAttribute* attribute); + XMLAttribute* CreateAttribute(); + + enum { BUF_SIZE = 200 }; + + ElementClosingType _closingType = OPEN; + // The attribute list is ordered; there is no 'lastAttribute' + // because the list needs to be scanned for dupes before adding + // a new attribute. + XMLAttribute* _rootAttribute = nullptr; +}; + + +enum Whitespace +{ + PRESERVE_WHITESPACE, + COLLAPSE_WHITESPACE +}; + + +/** A Document binds together all the functionality. + It can be saved, loaded, and printed to the screen. + All Nodes are connected and allocated to a Document. + If the Document is deleted, all its Nodes are also deleted. +*/ +class TINYXML2_LIB XMLDocument : public XMLNode +{ + friend class XMLElement; + // Gives access to SetError and Push/PopDepth, but over-access for everything else. + // Wishing C++ had "internal" scope. + friend class XMLNode; + friend class XMLText; + friend class XMLComment; + friend class XMLDeclaration; + friend class XMLUnknown; +public: + /// constructor + explicit XMLDocument(bool processEntities = true, Whitespace whitespaceMode = PRESERVE_WHITESPACE); + ~XMLDocument() override; + + XMLDocument* ToDocument() override + { + TIXMLASSERT(this == _document); + return this; + } + + const XMLDocument* ToDocument() const override + { + TIXMLASSERT(this == _document); + return this; + } + + /** + Parse an XML file from a character string. + Returns XML_SUCCESS (0) on success, or an errorID. + + You may optionally pass in the 'nBytes', which is the number of bytes which will be parsed. + If not specified, TinyXML-2 will assume 'xml' points to a null terminated string. + */ + XMLError Parse(const char* xml, size_t len = size_t(-1)); + + /** + Load an XML file from disk. + Returns XML_SUCCESS (0) on success, or + an errorID. + */ + XMLError LoadFile(const char* filename); + + /** + Load an XML file from disk. You are responsible + for providing and closing the FILE*. + + NOTE: The file should be opened as binary ("rb") + not text in order for TinyXML-2 to correctly + do newline normalization. + + Returns XML_SUCCESS (0) on success, or + an errorID. + */ + XMLError LoadFile(FILE* fp); + + /** + Save the XML file to disk. + Returns XML_SUCCESS (0) on success, or + an errorID. + */ + XMLError SaveFile(const char* filename, bool compact = false); + + /** + Save the XML file to disk. You are responsible + for providing and closing the FILE*. + + Returns XML_SUCCESS (0) on success, or + an errorID. + */ + XMLError SaveFile(FILE* fp, bool compact = false); + + bool ProcessEntities() const { return _processEntities; } + Whitespace WhitespaceMode() const { return _whitespaceMode; } + + /// Returns true if this document has a leading Byte Order Mark of UTF8. + bool HasBOM() const { return _writeBOM; } + /// Sets whether to write the BOM when writing the file. + void SetBOM(const bool useBOM) { _writeBOM = useBOM; } + + /// Return the root element of DOM. Equivalent to FirstChildElement(). To get the first node, use FirstChild(). + XMLElement* RootElement() { return FirstChildElement(); } + const XMLElement* RootElement() const { return FirstChildElement(); } + + /** Print the Document. If the Printer is not provided, it will + print to stdout. If you provide Printer, this can print to a file: + @verbatim + XMLPrinter printer( fp ); + doc.Print( &printer ); + @endverbatim + + Or you can use a printer to print to memory: + @verbatim + XMLPrinter printer; + doc.Print( &printer ); + // printer.CStr() has a const char* to the XML + @endverbatim + */ + void Print(XMLPrinter* streamer = nullptr) const; + bool Accept(XMLVisitor* visitor) const override; + + /// Create a new Element associated with this Document. The memory for the Element is managed by the Document. + XMLElement* NewElement(const char* name); + /// Create a new Comment associated with this Document. The memory for the Comment is managed by the Document. + XMLComment* NewComment(const char* str); + /// Create a new Text associated with this Document. The memory for the Text is managed by the Document. */ + XMLText* NewText(const char* str); + /** + Create a new Declaration associated with this Document. The memory for the object is managed by the Document. + + If the 'text' param is null, the standard declaration is used.: + @verbatim + + @endverbatim + */ + XMLDeclaration* NewDeclaration(const char* str = nullptr); + /// Create a new Unknown associated with this Document. The memory for the object is managed by the Document. + XMLUnknown* NewUnknown(const char* str); + /// Delete a node associated with this document. It will be unlinked from the DOM. + void DeleteNode(XMLNode* node); + + void ClearError() { SetError(XML_SUCCESS, 0, nullptr); } + + /// Return true if there was an error parsing the document. + bool Error() const { return _errorID != XML_SUCCESS; } + /// Return the errorID. + XMLError ErrorID() const { return _errorID; } + const char* ErrorName() const { return ErrorIDToName(_errorID); } + static const char* ErrorIDToName(XMLError errorID); + + /** Returns a "long form" error description. A hopefully helpful + diagnostic with location, line number, and/or additional info. + */ + const char* ErrorStr() const { return _errorStr.Empty() ? "" : _errorStr.GetStr(); } + + /// A (trivial) utility function that prints the ErrorStr() to stdout. + void PrintError() const { printf("%s\n", ErrorStr()); } + + /// Return the line where the error occurred, or zero if unknown. + int ErrorLineNum() const { return _errorLineNum; } + + /// Clear the document, resetting it to the initial state. + void Clear(); + + /** + Copies this document to a target document. + The target will be completely cleared before the copy. + If you want to copy a sub-tree, see XMLNode::DeepClone(). + + NOTE: that the 'target' must be non-null. + */ + void DeepCopy(XMLDocument* target) const; + + // internal + char* Identify(char* p, XMLNode** node); + + // internal + void MarkInUse(XMLNode* node); + XMLNode* ShallowClone(XMLDocument* /*document*/) const override { return nullptr; } + bool ShallowEqual(const XMLNode* /*compare*/) const override { return false; } + +private: + XMLDocument(const XMLDocument&) = delete; // not supported + void operator=(const XMLDocument&) = delete; // not supported + + bool _writeBOM = false; + bool _processEntities = false; + XMLError _errorID = XML_SUCCESS; + Whitespace _whitespaceMode; + mutable StrPair _errorStr; + int _errorLineNum = 0; + char* _charBuffer = nullptr; + int _parseCurLineNum = 0; + int _parsingDepth = 0; + // Memory tracking does add some overhead. + // However, the code assumes that you don't + // have a bunch of unlinked nodes around. + // Therefore it takes less memory to track + // in the document vs. a linked list in the XMLNode, + // and the performance is the same. + DynArray _unlinked; + + MemPoolT _elementPool; + MemPoolT _attributePool; + MemPoolT _textPool; + MemPoolT _commentPool; + + static const char* _errorNames[XML_ERROR_COUNT]; + + void Parse(); + + void SetError(XMLError error, int lineNum, const char* format, ...); + + // Something of an obvious security hole, once it was discovered. + // Either an ill-formed XML or an excessively deep one can overflow + // the stack. Track stack depth, and error out if needed. + class DepthTracker + { + public: + explicit DepthTracker(XMLDocument* document) + { + this->_document = document; + document->PushDepth(); + } + + ~DepthTracker() { _document->PopDepth(); } + private: + XMLDocument* _document; + }; + + void PushDepth(); + void PopDepth(); + + template + NodeType* CreateUnlinkedNode(MemPoolT& pool); +}; + +template +NodeType* XMLDocument::CreateUnlinkedNode(MemPoolT& pool) +{ + TIXMLASSERT(sizeof(NodeType) == PoolElementSize); + TIXMLASSERT(sizeof(NodeType) == pool.ItemSize()); + NodeType* returnNode = new(pool.Alloc()) NodeType(this); + TIXMLASSERT(returnNode); + returnNode->_memPool = &pool; + + _unlinked.Push(returnNode); + return returnNode; +} + +/** + A XMLHandle is a class that wraps a node pointer with null checks; this is + an incredibly useful thing. Note that XMLHandle is not part of the TinyXML-2 + DOM structure. It is a separate utility class. + + Take an example: + @verbatim + + + + + + + @endverbatim + + Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very + easy to write a *lot* of code that looks like: + + @verbatim + XMLElement* root = document.FirstChildElement( "Document" ); + if ( root ) + { + XMLElement* element = root->FirstChildElement( "Element" ); + if ( element ) + { + XMLElement* child = element->FirstChildElement( "Child" ); + if ( child ) + { + XMLElement* child2 = child->NextSiblingElement( "Child" ); + if ( child2 ) + { + // Finally do something useful. + @endverbatim + + And that doesn't even cover "else" cases. XMLHandle addresses the verbosity + of such code. A XMLHandle checks for null pointers so it is perfectly safe + and correct to use: + + @verbatim + XMLHandle docHandle( &document ); + XMLElement* child2 = docHandle.FirstChildElement( "Document" ).FirstChildElement( "Element" ).FirstChildElement().NextSiblingElement(); + if ( child2 ) + { + // do something useful + @endverbatim + + Which is MUCH more concise and useful. + + It is also safe to copy handles - internally they are nothing more than node pointers. + @verbatim + XMLHandle handleCopy = handle; + @endverbatim + + See also XMLConstHandle, which is the same as XMLHandle, but operates on const objects. +*/ +class TINYXML2_LIB XMLHandle +{ +public: + /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. + explicit XMLHandle(XMLNode* node) : _node(node) { } + /// Create a handle from a node. + explicit XMLHandle(XMLNode& node) : _node(&node) { } + /// Copy constructor + XMLHandle(const XMLHandle& ref) : _node(ref._node) { } + /// Assignment + XMLHandle& operator=(const XMLHandle& ref) + { + _node = ref._node; + return *this; + } + + /// Get the first child of this handle. + XMLHandle FirstChild() { return XMLHandle(_node ? _node->FirstChild() : nullptr); } + /// Get the first child element of this handle. + XMLHandle FirstChildElement(const char* name = nullptr) { return XMLHandle(_node ? _node->FirstChildElement(name) : nullptr); } + /// Get the last child of this handle. + XMLHandle LastChild() { return XMLHandle(_node ? _node->LastChild() : nullptr); } + /// Get the last child element of this handle. + XMLHandle LastChildElement(const char* name = nullptr) { return XMLHandle(_node ? _node->LastChildElement(name) : nullptr); } + /// Get the previous sibling of this handle. + XMLHandle PreviousSibling() { return XMLHandle(_node ? _node->PreviousSibling() : nullptr); } + /// Get the previous sibling element of this handle. + XMLHandle PreviousSiblingElement(const char* name = nullptr) { return XMLHandle(_node ? _node->PreviousSiblingElement(name) : nullptr); } + /// Get the next sibling of this handle. + XMLHandle NextSibling() { return XMLHandle(_node ? _node->NextSibling() : nullptr); } + /// Get the next sibling element of this handle. + XMLHandle NextSiblingElement(const char* name = nullptr) { return XMLHandle(_node ? _node->NextSiblingElement(name) : nullptr); } + + /// Safe cast to XMLNode. This can return null. + XMLNode* ToNode() { return _node; } + /// Safe cast to XMLElement. This can return null. + XMLElement* ToElement() { return (_node ? _node->ToElement() : nullptr); } + /// Safe cast to XMLText. This can return null. + XMLText* ToText() { return (_node ? _node->ToText() : nullptr); } + /// Safe cast to XMLUnknown. This can return null. + XMLUnknown* ToUnknown() { return (_node ? _node->ToUnknown() : nullptr); } + /// Safe cast to XMLDeclaration. This can return null. + XMLDeclaration* ToDeclaration() { return (_node ? _node->ToDeclaration() : nullptr); } + +private: + XMLNode* _node; +}; + + +/** + A variant of the XMLHandle class for working with const XMLNodes and Documents. It is the + same in all regards, except for the 'const' qualifiers. See XMLHandle for API. +*/ +class TINYXML2_LIB XMLConstHandle +{ +public: + explicit XMLConstHandle(const XMLNode* node) : _node(node) { } + explicit XMLConstHandle(const XMLNode& node) : _node(&node) { } + XMLConstHandle(const XMLConstHandle& ref) : _node(ref._node) { } + + XMLConstHandle& operator=(const XMLConstHandle& ref) + { + _node = ref._node; + return *this; + } + + XMLConstHandle FirstChild() const { return XMLConstHandle(_node ? _node->FirstChild() : nullptr); } + XMLConstHandle FirstChildElement(const char* name = nullptr) const { return XMLConstHandle(_node ? _node->FirstChildElement(name) : nullptr); } + XMLConstHandle LastChild() const { return XMLConstHandle(_node ? _node->LastChild() : nullptr); } + XMLConstHandle LastChildElement(const char* name = nullptr) const { return XMLConstHandle(_node ? _node->LastChildElement(name) : nullptr); } + XMLConstHandle PreviousSibling() const { return XMLConstHandle(_node ? _node->PreviousSibling() : nullptr); } + + XMLConstHandle PreviousSiblingElement(const char* name = nullptr) const { return XMLConstHandle(_node ? _node->PreviousSiblingElement(name) : nullptr); } + + XMLConstHandle NextSibling() const { return XMLConstHandle(_node ? _node->NextSibling() : nullptr); } + XMLConstHandle NextSiblingElement(const char* name = nullptr) const { return XMLConstHandle(_node ? _node->NextSiblingElement(name) : nullptr); } + + const XMLNode* ToNode() const { return _node; } + const XMLElement* ToElement() const { return (_node ? _node->ToElement() : nullptr); } + const XMLText* ToText() const { return (_node ? _node->ToText() : nullptr); } + const XMLUnknown* ToUnknown() const { return (_node ? _node->ToUnknown() : nullptr); } + const XMLDeclaration* ToDeclaration() const { return (_node ? _node->ToDeclaration() : nullptr); } + +private: + const XMLNode* _node; +}; + + +/** + Printing functionality. The XMLPrinter gives you more + options than the XMLDocument::Print() method. + + It can: + -# Print to memory. + -# Print to a file you provide. + -# Print XML without a XMLDocument. + + Print to Memory + + @verbatim + XMLPrinter printer; + doc.Print( &printer ); + SomeFunction( printer.CStr() ); + @endverbatim + + Print to a File + + You provide the file pointer. + @verbatim + XMLPrinter printer( fp ); + doc.Print( &printer ); + @endverbatim + + Print without a XMLDocument + + When loading, an XML parser is very useful. However, sometimes + when saving, it just gets in the way. The code is often set up + for streaming, and constructing the DOM is just overhead. + + The Printer supports the streaming case. The following code + prints out a trivially simple XML file without ever creating + an XML document. + + @verbatim + XMLPrinter printer( fp ); + printer.OpenElement( "foo" ); + printer.PushAttribute( "foo", "bar" ); + printer.CloseElement(); + @endverbatim +*/ +class TINYXML2_LIB XMLPrinter : public XMLVisitor +{ +public: + /** Construct the printer. If the FILE* is specified, + this will print to the FILE. Else it will print + to memory, and the result is available in CStr(). + If 'compact' is set to true, then output is created + with only required whitespace and newlines. + */ + explicit XMLPrinter(FILE* file = nullptr, bool compact = false, int depth = 0); + ~XMLPrinter() override {} + + /** If streaming, write the BOM and declaration. */ + void PushHeader(bool writeBOM, bool writeDec); + /** If streaming, start writing an element. + The element must be closed with CloseElement() + */ + void OpenElement(const char* name, bool compactMode = false); + /// If streaming, add an attribute to an open element. + void PushAttribute(const char* name, const char* value); + void PushAttribute(const char* name, int value); + void PushAttribute(const char* name, unsigned value); + void PushAttribute(const char* name, int64_t value); + void PushAttribute(const char* name, bool value); + void PushAttribute(const char* name, double value); + /// If streaming, close the Element. + virtual void CloseElement(bool compactMode = false); + + /// Add a text node. + void PushText(const char* text, bool cdata = false); + /// Add a text node from an integer. + void PushText(int value); + /// Add a text node from an unsigned. + void PushText(unsigned value); + /// Add a text node from an unsigned. + void PushText(int64_t value); + /// Add a text node from a bool. + void PushText(bool value); + /// Add a text node from a float. + void PushText(float value); + /// Add a text node from a double. + void PushText(double value); + + /// Add a comment + void PushComment(const char* comment); + + void PushDeclaration(const char* value); + void PushUnknown(const char* value); + bool VisitEnter(const XMLDocument& /*doc*/) override; + bool VisitExit(const XMLDocument& /*doc*/) override { return true; } + bool VisitEnter(const XMLElement& element, const XMLAttribute* attribute) override; + bool VisitExit(const XMLElement& element) override; + bool Visit(const XMLText& text) override; + bool Visit(const XMLComment& comment) override; + bool Visit(const XMLDeclaration& declaration) override; + bool Visit(const XMLUnknown& unknown) override; + + /** + If in print to memory mode, return a pointer to + the XML file in memory. + */ + const char* CStr() const { return _buffer.Mem(); } + /** + If in print to memory mode, return the size + of the XML file in memory. (Note the size returned + includes the terminating null.) + */ + int CStrSize() const { return _buffer.Size(); } + /** + If in print to memory mode, reset the buffer to the + beginning. + */ + void ClearBuffer() + { + _buffer.Clear(); + _buffer.Push(0); + _firstElement = true; + } + +protected: + virtual bool CompactMode(const XMLElement& /*element*/) { return _compactMode; } + + /** Prints out the space before an element. You may override to change + the space and tabs used. A PrintSpace() override should call Print(). + */ + virtual void PrintSpace(const int depth) { for (int i = 0; i < depth; ++i) { Write(" "); } } + void Print(const char* format, ...); + void Write(const char* data, size_t size); + void Write(const char* data) { Write(data, strlen(data)); } + void Putc(char ch); + + void SealElementIfJustOpened(); + bool _elementJustOpened = false; + DynArray _stack; + +private: + void PrintString(const char* p, bool restricted); // prints out, after detecting entities. + + bool _firstElement = true; + FILE* _fp = nullptr; + int _depth = 0; + int _textDepth = -1; + bool _processEntities = true; + bool _compactMode = false; + + enum + { + ENTITY_RANGE = 64, + BUF_SIZE = 200 + }; + + bool _entityFlag[ENTITY_RANGE]; + bool _restrictedEntityFlag[ENTITY_RANGE]; + + DynArray _buffer; + + // Prohibit cloning, intentionally not implemented + XMLPrinter(const XMLPrinter&) = delete; + XMLPrinter& operator=(const XMLPrinter&) = delete; +}; +} // namespace tinyxml2 + +#if defined(_MSC_VER) +# pragma warning(pop) +#endif + +#endif // TINYXML2_INCLUDED diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Basics.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Basics.hpp new file mode 100644 index 0000000..ba8e690 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Basics.hpp @@ -0,0 +1,223 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file Basics.hpp +/// \brief Basic functions of Eigen matrix manipulation and verification. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 26/10/2018. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include +#include +#include // Ceil +#include // Template type + +namespace Geometry { + +/// Enumeration of Standardization method for features matrix data. +enum class EStandardization +{ + None, ///< No change. + Center, ///< Standardize data by removing the mean (on each feature separately). + StandardScale ///< Standardize data by removing the mean and scaling to unit variance (on each feature separately). +}; + +//************************************************ +//******************** Matrix ******************** +//************************************************ + +/// Apply an affine transformation and return the result (The last transpose is useless if matrix is SPD). +/// \f[ +/// B = R^{-1/2} * A * {R^{-1/2}}^{\mathsf{T}} +/// \f] +/// +/// The reference matrix which transforms. +/// the matrix to transform. +/// The transformed matrix +Eigen::MatrixXd AffineTransformation(const Eigen::MatrixXd& ref, const Eigen::MatrixXd& matrix); + + +/// Standardize data row by row with selected method (destructive operation). +/// The matrix to standardize. +/// Standard method. +/// True if it succeeds, False otherwise. +bool MatrixStandardization(Eigen::MatrixXd& matrix, EStandardization standard = EStandardization::None); + +/// Standardize data row by row with selected method (non destructive operation). +/// The matrix to standardize. +/// The matrix standardized. +/// Standard method. +/// True if it succeeds, False otherwise. +bool MatrixStandardization(const Eigen::MatrixXd& in, Eigen::MatrixXd& out, EStandardization standard = EStandardization::None); + +/// Removes the mean of each row at the matrix (destructive operation).\n +/// So \f$\mu=0\f$. +/// The Matrix to center. +/// True if it succeeds, False otherwise. +bool MatrixCenter(Eigen::MatrixXd& matrix); + +/// Removes the mean of each row at the matrix (non destructive operation).\n +/// So \f$\mu=0\f$. +/// The Matrix to center. +/// The Matrix centered. +/// True if it succeeds, False otherwise. +bool MatrixCenter(const Eigen::MatrixXd& in, Eigen::MatrixXd& out); + +/// Removes the mean of each row at the matrix and divide by the variance (destructive operation with scale return).\n +/// So \f$\mu=0\f$ and \f$\sigma=1\f$. +/// The Matrix to standardize. +/// The scale vector. +/// True if it succeeds, False otherwise. +/// Adaptation of sklearn StandardScaler (License). +bool MatrixStandardScaler(Eigen::MatrixXd& matrix, Eigen::RowVectorXd& scale); + +/// Removes the mean of each row at the matrix and divide by the variance (destructive operation).\n +/// So \f$\mu=0\f$ and \f$\sigma=1\f$. +/// The Matrix to standardize. +/// True if it succeeds, False otherwise. +/// Adaptation of sklearn StandardScaler (License). +bool MatrixStandardScaler(Eigen::MatrixXd& matrix); + +/// Removes the mean of each row at the matrix and divide by the variance (non destructive operation with scale return).\n +/// So \f$\mu=0\f$ and \f$\sigma=1\f$. +/// The Matrix to standardize. +/// The Matrix standardized. +/// The scale vector. +/// True if it succeeds, False otherwise. +/// Adaptation of sklearn StandardScaler (License). +bool MatrixStandardScaler(const Eigen::MatrixXd& in, Eigen::MatrixXd& out, Eigen::RowVectorXd& scale); + +/// Removes the mean of each row at the matrix and divide by the variance (non destructive operation).\n +/// So \f$\mu=0\f$ and \f$\sigma=1\f$. +/// The Matrix to standardize. +/// The Matrix standardized. +/// True if it succeeds, False otherwise. +/// Adaptation of sklearn StandardScaler (License). +bool MatrixStandardScaler(const Eigen::MatrixXd& in, Eigen::MatrixXd& out); + +/// Give the string format of Matrix. +/// The Matrix to display. +/// The string format. +std::string MatrixPrint(const Eigen::MatrixXd& matrix); + +/// Check first the size, then if not empty matrix and then if they are almost equal. +/// First Matrix. +/// Second Matrix. +/// Precision for matrix comparison. +/// True if the two elements are equals (with a precision tolerance), False otherwise. +bool AreEquals(const Eigen::MatrixXd& matrix1, const Eigen::MatrixXd& matrix2, double precision = 1e-6); + +//************************************************************* +//******************** Index Manipulations ******************** +//************************************************************* +/// Gets the items selected by the index. +/// the original row. +/// Elements to select. +/// Row with selected elements. +Eigen::RowVectorXd GetElements(const Eigen::RowVectorXd& row, const std::vector& index); + +/// Numpy arange implementation in C++. +/// Generic numeric type parameter. +/// The start. +/// The stop. +/// (Optional) Amount to increment by. +/// vector<T> +template ::value, T>::type> +std::vector ARange(const T start, const T stop, const T step = 1) +{ + std::vector result; + result.reserve(size_t(ceil(1.0 * (stop - start) / step))); + for (T i = start; i < stop; i += step) { result.push_back(i); } + return result; +} + +/// Turn vector of vector into vector. +/// Generic type parameter. +/// vector of vector. +/// vector<T> +template +std::vector Vector2DTo1D(const std::vector>& in) +{ + std::vector result; + size_t sum = 0; + for (const auto& v : in) { sum += v.size(); } + result.reserve(sum); + for (const auto& v : in) { for (const auto& e : v) { result.push_back(e); } } + return result; +} + +/// Turn vector into vector of vector with position repartition. +/// Generic type parameter. +/// vector of vector. +/// position of element (size of position is the number of row the values are the number of element on each row). +/// vector<T> +template +std::vector> Vector1DTo2D(const std::vector& in, const std::vector& position) +{ + const size_t n = position.size(); + std::vector> result(n); + size_t idx = 0; + for (size_t i = 0; i < n; ++i) + { + const size_t nbSample = position[i]; + result[i].resize(nbSample); + for (size_t j = 0; j < nbSample; ++j) { result[i][j] = in[idx++]; } + } + return result; +} + +//*************************************************** +//******************** Validates ******************** +//*************************************************** +/// Validate if value is in [min;max]. +/// The value. +/// The minimum. +/// The maximum. +/// True if it succeeds, False otherwise. +bool InRange(const double value, const double min, const double max); + +/// Validate if the vector is not empty and the matrices are validate. +/// Vector of Matrix. +/// True if it succeeds, False otherwise. +bool AreNotEmpty(const std::vector& matrices); + +/// Validates if matrix is not empty. +/// Matrix. +/// True if it succeeds, False otherwise. +bool IsNotEmpty(const Eigen::MatrixXd& matrix); + +/// Validates if two matrix have same size. +/// Matrix A. +/// Matrix B. +/// True if it succeeds, False otherwise. +bool HaveSameSize(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b); + +/// Validate if the vector is not empty and the matrices have same size. +/// Vector of Matrix. +/// True if it succeeds, False otherwise. +bool HaveSameSize(const std::vector& matrices); + +/// Validates if matrix is square matrix and not empty. +/// Matrix. +/// True if it succeeds, False otherwise. +bool IsSquare(const Eigen::MatrixXd& matrix); + +/// Validate if the vector is not empty and the matrices are square matrix and not empty. +/// Vector of Matrix. +/// True if it succeeds, False otherwise. +bool AreSquare(const std::vector& matrices); + +//******************************************************** +//******************** CSV MANAGEMENT ******************** +//******************************************************** +/// Return the string split by the \p sep parameter. +/// The string to split. +/// the separator string which splits. +/// Vector of string part. +std::vector Split(const std::string& s, const std::string& sep); + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Classification.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Classification.hpp new file mode 100644 index 0000000..83a7b80 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Classification.hpp @@ -0,0 +1,46 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file Classification.hpp +/// \brief All functions to help Matrix Classifiers. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 26/10/2018. +/// \copyright GNU Affero General Public License v3.0. +/// \remarks +/// - LSQR inspired by sklearn LinearDiscriminantAnalysis (License). +/// - FgDA inspired by the work of Alexandre Barachant : pyRiemann (License). +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include +#include + +namespace Geometry { + +/// Compute the weight of Linear Discriminant Analysis with Least squares (LSQR) Solver. +/// The dataset (first dimension is the class, second dimension the trial as Feature Vector). +/// The weight to apply. +/// True if it succeeds, False otherwise. +/// Inspired by sklearn LinearDiscriminantAnalysis (License). +bool LSQR(const std::vector>& dataset, Eigen::MatrixXd& weight); + +/// Compute Least squares (LSQR) Weight and transform to FgDA Weight. \n +/// \f[ W_{\text{FgDA}} = W^{\mathsf{T}} \times (W \times W^{\mathsf{T}})^{-1} \times W \f] +/// +/// The dataset (first dimension is the class, second dimension is the trial as Feature Vector). +/// The Weight to apply. +/// True if it succeeds, False otherwise. +/// Method inspired by the work of Alexandre Barachant : pyRiemann (License). +bool FgDACompute(const std::vector>& dataset, Eigen::MatrixXd& weight); + +/// Apply the weight on the vector. (just a matrix product) +/// Sample to transform. +/// Transformed Sample. +/// The Weight to apply. +/// True if it succeeds, False otherwise. +/// Method inspired by the work of Alexandre Barachant : pyRiemann (License). +bool FgDAApply(const Eigen::RowVectorXd& in, Eigen::RowVectorXd& out, const Eigen::MatrixXd& weight); + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Covariance.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Covariance.hpp new file mode 100644 index 0000000..5dc4794 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Covariance.hpp @@ -0,0 +1,224 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file Covariance.hpp +/// \brief All functions to estimate the Covariance Matrix. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 26/10/2018. +/// \copyright GNU Affero General Public License v3.0. +/// \remarks +/// - List of Estimator inspired by the work of Alexandre Barachant : pyRiemann (License). +/// - Ledoit and Wolf Estimator inspired by sklearn (License). +/// - Oracle Approximating Shrinkage (OAS) Estimator Inspired by sklearn (License). +/// - Minimum Covariance Determinant (MCD) Estimator isn't implemented. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "geometry/Basics.hpp" +#include + +namespace Geometry { + +//*************************************************** +//******************** CONSTANTS ******************** +//*************************************************** +/// Enumeration of the covariance matrix estimator. Inspired by the work of Alexandre Barachant : pyRiemann. +enum class EEstimator +{ + COV, ///< The Simple Covariance Estimator. + SCM, ///< The Normalized Spatial Covariance Matrix (SCM) Estimator. + LWF, ///< The Ledoit and Wolf Estimator. + OAS, ///< The Oracle Approximating Shrinkage (OAS) Estimator. + MCD, ///< The Minimum Covariance Determinant (MCD) Estimator. + COR, ///< The Pearson Correlation Estimator. + IDE ///< The Identity Matrix. +}; + +/// Convert estimators to string. +/// The estimator. +/// std::string +inline std::string toString(const EEstimator estimator) +{ + switch (estimator) + { + case EEstimator::COV: return "Covariance"; + case EEstimator::SCM: return "Normalized Spatial Covariance Matrix (SCM)"; + case EEstimator::LWF: return "Ledoit and Wolf"; + case EEstimator::OAS: return "Oracle Approximating Shrinkage (OAS)"; + case EEstimator::MCD: return "Minimum Covariance Determinant (MCD)"; + case EEstimator::COR: return "Pearson Correlation"; + case EEstimator::IDE: return "Identity"; + } + return "Invalid"; +} + +/// Convert string to estimators. +/// The estimator. +/// +inline EEstimator StringToEstimator(const std::string& estimator) +{ + if (estimator == "Covariance") { return EEstimator::COV; } + if (estimator == "Normalized Spatial Covariance Matrix (SCM)") { return EEstimator::SCM; } + if (estimator == "Ledoit and Wolf") { return EEstimator::LWF; } + if (estimator == "Oracle Approximating Shrinkage (OAS)") { return EEstimator::OAS; } + if (estimator == "Minimum Covariance Determinant (MCD)") { return EEstimator::MCD; } + if (estimator == "Pearson Correlation") { return EEstimator::COR; } + return EEstimator::IDE; +} + +//*********************************************************** +//******************** COVARIANCES BASES ******************** +//*********************************************************** +/// Calculation of the Variance of a double dataset \f$\vec{X}\f$.\n +/// \f[ V(X) = \left(\frac{1}{n} \sum_{i=1}^{N}x_{i}^{2}\right) - \left(\frac{1}{n} \sum_{i=1}^{N}x_{i}\right)^{2} \f] +/// +/// The dataset \f$\vec{X}\f$. With \f$ N \f$ Samples. +/// The Variance. +double Variance(const Eigen::RowVectorXd& x); + +/// Calculation of the Covariance between two double dataset \f$\vec{X}, \vec{Y}\f$.\n +/// \f[ \operatorname{Cov}\left(x,y\right) = \frac{\sum_{i=1}^{N}{x_{i}y_{i}} - \left(\sum_{i=1}^{N}{x_{i}}\sum_{i=1}^{N}{y_{i}}\right)/N}{N}\f] +/// +/// The dataset \f$\vec{X}\f$. With \f$ N \f$ Samples. +/// The dataset \f$\vec{Y}\f$. With \f$ N \f$ Samples. +/// The Covariance. +double Covariance(const Eigen::RowVectorXd& x, const Eigen::RowVectorXd& y); + +/// Shrunks the Covariance Matrix \f$ M \f$ (destructive operation).\n +/// \f[ (1 - \text{shrinkage}) \times M_{\operatorname{Cov}} + \frac{\text{shrinkage} \times \operatorname{trace}(M_{Cov})}{N} \times I_N \f] +/// +/// The Covariance Matrix to shrink. +/// (Optional) The shrinkage coefficient : \f$ 0\leq \text{shrinkage} \leq 1\f$. +/// True if it succeeds, False otherwise. +bool ShrunkCovariance(Eigen::MatrixXd& cov, double shrinkage = 0.1); + +/// Shrunks the Covariance Matrix \f$ M \f$ (non destructive operation).\n +/// \f[ (1 - \text{shrinkage}) \times M_{\operatorname{Cov}} + \frac{\text{shrinkage} \times \operatorname{trace}(M_{Cov})}{N} \times I_N \f] +/// +/// The covariance matrix to shrink. +/// The shrunk covariance matrix. +/// (Optional) The shrinkage coefficient : \f$ 0\leq \text{shrinkage} \leq 1\f$. +/// True if it succeeds, False otherwise. +bool ShrunkCovariance(const Eigen::MatrixXd& in, Eigen::MatrixXd& out, double shrinkage = 0.1); + +/// Select the function to call for the covariance matrix.\n +/// - centralizing the data is useless for and .\n +/// - centralizing the data is not usual for . +/// +/// The dataset \f$\vec{X}\f$. With \f$ N \f$ Rows (features) and \f$ S \f$ columns (samples). +/// The Covariance Matrix. +/// (Optional) The selected estimator (see ). +/// (Optional) Standardize the data (see ). +/// True if it succeeds, False otherwise. +bool CovarianceMatrix(const Eigen::MatrixXd& in, Eigen::MatrixXd& out, EEstimator estimator = EEstimator::COV, + EStandardization standard = EStandardization::Center); + +//*********************************************************** +//******************** COVARIANCES TYPES ******************** +//*********************************************************** +/// Calculation of the covariance matrix.\n +/// \f[ M_{\operatorname{Cov}} = +/// \begin{pmatrix} +/// V\left(x_1\right) & \operatorname{Cov}\left(x_1,x_2\right) &\cdots & \operatorname{Cov}\left(x_1,x_N\right)\\ +/// \operatorname{Cov}\left(x_2,x_1\right) &\ddots & \ddots & \vdots \\ +/// \vdots & \ddots & \ddots & \vdots \\ +/// \operatorname{Cov}\left(x_N,x_1\right) &\cdots & \cdots & V\left(x_N\right) +/// \end{pmatrix} +/// \quad\quad \text{with } x_i \text{ the feature } i +/// \f]\n +/// With the and function. +/// +/// The dataset \f$\vec{X}\f$. With \f$ N \f$ Rows (features) and \f$ S \f$ columns (samples). +/// The Covariance Matrix. +/// True if it succeeds, False otherwise. +bool CovarianceMatrixCOV(const Eigen::MatrixXd& samples, Eigen::MatrixXd& cov); + +/// Calculation of the covariance matrix by the method : Normalized Spatial Covariance Matrix (SCM).\n +/// \f[ M_{\operatorname{Cov_{SCM}}} = \frac{XX^{\mathsf{T}}}{\operatorname{trace}{\left(XX^{\mathsf{T}}\right)}} \f] +/// +/// The dataset \f$\vec{X}\f$. With \f$ N \f$ Rows (features) and \f$ S \f$ columns (samples). +/// The Covariance Matrix. +/// True if it succeeds, False otherwise. +bool CovarianceMatrixSCM(const Eigen::MatrixXd& samples, Eigen::MatrixXd& cov); + +/// Calculation of the covariance matrix and shrinkage by the method : Ledoit and Wolf.\n +/// -# Compute the Covariance Matrix (see ) \f$ M_{\operatorname{Cov}} \f$ +/// -# Compute the Ledoit and Wolf Shrinkage +/// -# Shrunk the Matrix (see ) +/// +/// Ledoit and Wolf Shrinkage (from Sklearn LedoitWolf Estimator) +/// described in "A Well-Conditioned Estimator for Large-Dimensional Covariance Matrices", Ledoit and Wolf, Journal of Multivariate Analysis, Volume 88, Issue 2, February 2004, pages 365-411. : \n +/// \f[ +/// \begin{aligned} +/// \vec{X}^2 &= \begin{pmatrix}x_{0,0}^2 & \cdots & x_{0,S}^2 \\ \vdots & \ddots &\vdots \\ x_{N,0}^2 & \cdots & x_{N,S}^2\end{pmatrix} \quad \text{with } x_{i,j} \in \vec{X}\\ +/// M_{\mu} &= \mu\times I_N = \begin{pmatrix} \mu & 0 & \cdots & 0 \\ 0 & \ddots &\ddots & \vdots \\ \vdots & \ddots &\ddots & 0 \\ 0 & \cdots & 0 & \mu\end{pmatrix} +/// \quad \text{with } \mu = \frac{\operatorname{trace}(M_{\operatorname{Cov}})}{N}\\ +/// M_{\delta} &= M_{\operatorname{Cov}}-M_{\mu}\\ +/// M_{\delta}^2 &= M_{\delta} * M_{\delta}\\ +/// M_{\beta} &= \frac{1}{S} \times \left(\vec{X}^2 * \vec{X}^{2\mathsf{T}}\right) - M_{Cov} * M_{Cov}\\ +/// \Sigma\left( M \right) &=\text{ the sum of the elements of the matrix } M\\ +/// \end{aligned} +/// \f] +/// \f[ \text{Shrinkage}_\text{LWF} = \frac{\beta}{\delta} \quad \text{with } \delta = \frac{\Sigma\left( M_{\delta}^2 \right)}{N} \quad\text{and}\quad +/// \beta = \operatorname{min}\left(\frac{\Sigma\left( M_{\beta}^2 \right)}{N \times S},~ \delta\right)\f] +/// +/// The dataset \f$\vec{X}\f$. With \f$ N \f$ Rows (features) and \f$ S \f$ columns (samples). +/// The Covariance Matrix. +/// True if it succeeds, False otherwise. +bool CovarianceMatrixLWF(const Eigen::MatrixXd& samples, Eigen::MatrixXd& cov); + +/// Calculation of the covariance matrix and shrinkage by the method : Oracle Approximating Shrinkage (OAS).\n +/// -# Compute the Covariance Matrix (see ) \f$ M_{\operatorname{Cov}} \f$ +/// -# Compute the Oracle Approximating Shrinkage +/// -# Shrunk the Matrix (see ) +/// +/// Oracle Approximating Shrinkage (from Sklearn Oracle Approximating Shrinkage Estimator) +/// describe in "Shrinkage Algorithms for MMSE Covariance Estimation" Chen et al., IEEE Trans. on Sign. Proc., Volume 58, Issue 10, October 2010. : \n +/// \f[ +/// \begin{aligned} +/// \mu &= \frac{\operatorname{trace}(M_{\operatorname{Cov}})}{N}\\ +/// \mu \left( M \right) &=\text{ the mean of the elements of the matrix } M\\ +/// \alpha &= \mu \left( M_{\operatorname{Cov}} * M_{\operatorname{Cov}} \right)\\ +/// \text{num} &= \alpha + \mu^2\\ +/// \text{den} &= (S + 1) \times \frac{\alpha - \mu^2}{N}\\ +/// \end{aligned} +/// \f] +/// \f[ +/// \text{Shrinkage}_\text{OAS} = \begin{cases} +/// 1, & \text{if}\ \text{den} = 0 \text{ or num} > \text{den} \\ +/// \frac{\text{num}}{\text{den}}, & \text{otherwise} +/// \end{cases} +/// \f] +/// +/// The dataset \f$\vec{X}\f$. With \f$ N \f$ Rows (features) and \f$ S \f$ columns (samples). +/// The Covariance Matrix. +/// True if it succeeds, False otherwise. +bool CovarianceMatrixOAS(const Eigen::MatrixXd& samples, Eigen::MatrixXd& cov); + +/// Calculation of the covariance matrix and shrinkage by the method : Minimum Covariance Determinant (MCD). +/// The dataset \f$\vec{X}\f$. With \f$ N \f$ Rows (features) and \f$ S \f$ columns (samples). +/// The Covariance Matrix. +/// True if it succeeds, False otherwise. +/// \todo Not implemented. +bool CovarianceMatrixMCD(const Eigen::MatrixXd& samples, Eigen::MatrixXd& cov); + +/// Calculation of the covariance matrix by the method : Pearson Correlation.\n +/// \f[ +/// M_{\operatorname{Cov_{COR}}}\left(i,j\right) +/// = \frac{ M_{\operatorname{Cov}}\left(i,j\right) } { \sqrt{ M_{\operatorname{Cov}}\left(i,i\right) * M_{\operatorname{Cov}}\left(j,j\right) } } +/// \f] +/// +/// The dataset \f$\vec{X}\f$. With \f$ N \f$ Rows (features) and \f$ S \f$ columns (samples). +/// The Covariance Matrix. +/// True if it succeeds, False otherwise. +bool CovarianceMatrixCOR(const Eigen::MatrixXd& samples, Eigen::MatrixXd& cov); + +/// Return the Identity matrix \f$ I_N \f$. +/// The dataset \f$\vec{X}\f$. With \f$ N \f$ Rows (features) and \f$ S \f$ columns (samples). +/// The Covariance Matrix. +/// True if it succeeds, False otherwise. +bool CovarianceMatrixIDE(const Eigen::MatrixXd& samples, Eigen::MatrixXd& cov); + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Distance.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Distance.hpp new file mode 100644 index 0000000..34fba31 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Distance.hpp @@ -0,0 +1,87 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file Distance.hpp +/// \brief All functions to estimate the Distance between two Covariance Matrix. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 26/10/2018. +/// \copyright GNU Affero General Public License v3.0. +/// \remarks +/// - List of Metrics inspired by the work of Alexandre Barachant : pyRiemann (License). +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "geometry/Metrics.hpp" +#include + +namespace Geometry { + +/// Compute the distance between two matrix with the selected \p metric. +/// The First Covariance matrix. +/// The Second Covariance matrix. +/// (Optional) The metric (see ). +/// The Distance between A and B. +double Distance(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b, EMetric metric = EMetric::Riemann); + +/// Compute the Riemannian Distance between two covariance matrices A and B.\n +/// \f[ d_{\text{R}}(A,B) = \sqrt{\left( \sum_i \log\left(\lambda_i\right)^2 \right)} \f] +/// with : \f$\lambda_i\f$ the joint eigenvalues of \f$A\f$ and \f$B\f$. +/// +/// The First Covariance matrix. +/// The Second Covariance matrix. +/// The Riemannian Distance between A and B. +double DistanceRiemann(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b); + +/// Compute the Euclidian Distance between two covariance matrices A and B.\n +/// \f[ d_{\text{E}}(A,B) = \left\lVert B - A \right\rVert\f] +/// +/// The First Covariance matrix. +/// The Second Covariance matrix. +/// The Eclidean Distance between A and B. +double DistanceEuclidian(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b); + +/// Compute the Log Euclidian Distance between two covariance matrices A and B.\n +/// \f[ d_{\text{lE}}(A,B) = \left\lVert \log\left(B\right) - \log\left(A\right) \right\rVert\f] +/// +/// The First Covariance matrix. +/// The Second Covariance matrix. +/// The Log Eclidean Distance between A and B. +double DistanceLogEuclidian(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b); + +/// Compute the Log-det Distance between two covariance matrices A and B.\n +/// \f[ d_{\text{lD}}(A,B) = \sqrt{\log\left(\left\lvert\frac{A + B}{2}\right\rvert\right) - 0.5 \times \log\left( \left\lvert A \right\rvert \times \left\lvert B \right\rvert \right)} \f] +/// with : \f$\left\lvert A \right\rvert\f$ the determinant of \f$A\f$. +/// +/// The First Covariance matrix. +/// The Second Covariance matrix. +/// The Log-det Distance between A and B. +double DistanceLogDet(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b); + +/// Compute the Kullback Leibler Divergence between two covariance matrices A and B.\n +/// \f[ d_{\text{K}}(A,B) = 0.5 \times \left( \operatorname{trace}\left(B^{-1} ~ A\right) - N + \log\left( \frac{\left\lvert B \right\rvert }{\left\lvert A \right\rvert} \right) \right) \f] +/// with : \f$\left\lvert A \right\rvert\f$ the determinant of \f$A\f$. +/// +/// The First Covariance matrix. +/// The Second Covariance matrix. +/// The Kullback Leibler Divergence Distance between A and B. +double DistanceKullback(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b); + +/// Compute the Symetric Kullback Leibler Divergence between two covariance matrices A and B.\n +/// \f[ d_{\text{sK}}(A,B) = d_\text{K}(A, B) + d_\text{K}(B, A) \f] +/// +/// The First Covariance matrix. +/// The Second Covariance matrix. +/// The Symetric Kullback Leibler Divergence Distance between A and B. +double DistanceKullbackSym(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b); + +/// Compute the Wasserstein Distance between two covariance matrices A and B.\n +/// \f[ d_{\text{W}}(A,B) = \sqrt{ \operatorname{trace}\left(A + B - 2 \times \left(A^{1/2} ~ B ~ A^{1/2}\right)^{1/2}\right) } \f] +/// +/// The First Covariance matrix. +/// The Second Covariance matrix. +/// The Wasserstein Distance between A and B. +double DistanceWasserstein(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b); + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Featurization.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Featurization.hpp new file mode 100644 index 0000000..a14fd8f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Featurization.hpp @@ -0,0 +1,109 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file Featurization.hpp +/// \brief All functions to transform Covariance matrix to feature vector. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 26/10/2018. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include + +namespace Geometry { + +/// Compute the features vector of covariance matrix with the selected method. +/// The covariance in. +/// The Feature Vector. +/// (Optional) True to use tangent space featurization, Upper Triangle Squeeze if false. +/// The reference Matrix (usefull for Tangent Space Featurization). +/// True if it succeeds, False otherwise. +bool Featurization(const Eigen::MatrixXd& in, Eigen::RowVectorXd& out, bool tangent = true, const Eigen::MatrixXd& ref = Eigen::MatrixXd()); + +/// Compute the covariance matrix of features vector with the selected method. +/// The Feature Vector. +/// The covariance out. +/// (Optional) True to use tangent space featurization, Upper Triangle Squeeze if false. +/// The reference Matrix (usefull for Tangent Space Featurization). +/// True if it succeeds, False otherwise. +bool UnFeaturization(const Eigen::RowVectorXd& in, Eigen::MatrixXd& out, bool tangent = true, const Eigen::MatrixXd& ref = Eigen::MatrixXd()); + +/// Squeeze the upper triangle of \f$N \times N\f$ square matrix to a \f$\frac{N\left(N+1\right)}{2}\f$ Vector. +/// +/// +/// +/// +/// +/// +/// +///
Upper Triangle MatrixRow Major Upper Triangle Squeeze Diagonal Major Upper Triangle Squeeze
\f[ \begin{pmatrix} a&b&c\\d&e&f\\g&h&i \end{pmatrix} \Rightarrow \begin{pmatrix} a&b&c\\0&e&f\\0&0&i \end{pmatrix} \f]
		
\f[ \begin{pmatrix} a&b&c\\d&e&f\\g&h&i \end{pmatrix} \Rightarrow \begin{pmatrix} a&b&c&e&f&i \end{pmatrix} \f]
		
\f[\begin{pmatrix} a&b&c\\d&e&f\\g&h&i \end{pmatrix} \Rightarrow \begin{pmatrix} a&e&i&b&f&c \end{pmatrix} \f]
+///
+/// The \f$N \times N\f$ square matrix. +/// The \f$\frac{N\left(N+1\right)}{2}\f$ Vector. +/// Get the values row by row if true, diagonal by diagonal if false. +/// True if it succeeds, False otherwise. +bool SqueezeUpperTriangle(const Eigen::MatrixXd& in, Eigen::RowVectorXd& out, bool rowMajor = true); + +/// Compute the upper triangle of \f$\frac{N\left(N+1\right)}{2}\f$ Vector to a \f$N \times N\f$ square matrix. +/// +/// +/// +/// +/// +///
Row Major Method Diagonal Major Method
\f[ \begin{pmatrix} a&b&c&d&e&f \end{pmatrix} \Rightarrow \begin{pmatrix} a&b&c\\0&d&e\\0&0&f \end{pmatrix} \f]
		
\f[ \begin{pmatrix} a&b&c&d&e&f \end{pmatrix} \Rightarrow \begin{pmatrix} a&d&f\\0&b&e\\0&0&c \end{pmatrix} \f]
+///
+/// The \f$\frac{N\left(N+1\right)}{2}\f$ Vector. +/// The \f$N \times N\f$ square matrix. +/// Get the values row by row if true, diagonal by diagonal if false. +/// True if it succeeds, False otherwise. +bool UnSqueezeUpperTriangle(const Eigen::RowVectorXd& in, Eigen::MatrixXd& out, bool rowMajor = true); + +/// Project a covariance matrices (\f$M\f$) in the tangent space (\f$\mathcal{T}\f$) according to the given reference point (\f$M_\text{Ref}\f$).
+/// +/// - Compute the transformation matrix for the covariance matrix \f$M\f$ with the reference matrix \f$M_\text{Ref}\f$ and squeeze ths matrix (see ). +/// \f[ +/// \begin{aligned} +/// J &= \log{\left(M_\text{Ref}^{-1/2} \times M \times M_\text{Ref}^{-1/2}\right)}\\ +/// V_J &= \operatorname{SqueezeUpperTriangle}(J) +/// \end{aligned} +/// \f] +/// - Compute a coefficient Vector to apply to transformation vector. +/// \f[ +/// \begin{aligned} +/// M_\text{Coeffs} &= \begin{pmatrix} +/// 1 & \sqrt{2} & \cdots & \sqrt{2} \\ +/// 0 & 1 & \ddots & \sqrt{2} \\ +/// \vdots & \ddots & \ddots & \vdots\\ +/// 0 & \cdots & \cdots & 1 +/// \end{pmatrix}\\ +/// V_\text{Coeffs} &= \operatorname{SqueezeUpperTriangle}(M_\text{Coeffs})\\ +/// \end{aligned} +/// \f] +/// - Compute the element wise product of the two vectors to have the tangent space Projection \f$\zeta_M\f$ +/// \f[ \zeta_M = V_J \odot V_\text{Coeffs} \f] +///
+/// The \f$N \times N\f$ covariance matrix. +/// The \f$\frac{N\left(N+1\right)}{2}\f$ row. +/// (Optional) The \f$N \times N\f$ reference in (use the identity Matrix if empty). +/// True if it succeeds, False otherwise. +bool TangentSpace(const Eigen::MatrixXd& in, Eigen::RowVectorXd& out, const Eigen::MatrixXd& ref = Eigen::MatrixXd()); + +/// Project a Tangent space vectors in the manifold according to the given reference point.
+/// \f[ +/// \begin{aligned} +/// \text{With : } M_\text{Ts} &= \operatorname{UnSqueezeUpperTriangle}(V_\text{Ts}) \quad \text{ and } \quad \mathsf{U}_{M}\text{ the upper triangular out.}\\ +/// M_\text{Coeffs} &= \operatorname{diag}\left(M_\text{Ts}\right) + \frac{\mathsf{U}_{M_\text{Ts}} + \mathsf{U}_{M_\text{Ts}}^{\mathsf{T}}}{\sqrt{2}}\\ +/// \Rightarrow M &= M_\text{Ref}^{1/2} ~ \exp{\left(M_\text{Coeffs}\right)} ~ M_\text{Ref}^{1/2} +/// \end{aligned} +/// \f] +///
+/// The \f$\frac{N\left(N+1\right)}{2}\f$ row. +/// The \f$N \times N\f$ covariance matrix. +/// (Optional) The \f$N \times N\f$ reference out (use the identity Matrix if empty). +/// True if it succeeds, False otherwise. +bool UnTangentSpace(const Eigen::RowVectorXd& in, Eigen::MatrixXd& out, const Eigen::MatrixXd& ref = Eigen::MatrixXd()); + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Geodesic.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Geodesic.hpp new file mode 100644 index 0000000..0858e50 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Geodesic.hpp @@ -0,0 +1,72 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file Geodesic.hpp +/// \brief All functions to estimate the Geodesic position of two Covariance Matrix. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 26/10/2018. +/// \copyright GNU Affero General Public License v3.0. +/// \remarks +/// - List of Metrics inspired by the work of Alexandre Barachant : pyRiemann (License). +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "geometry/Metrics.hpp" +#include + +namespace Geometry { + +/// Compute the matrix at the position alpha on the geodesic between A and B with the selected \p metric.\n +/// - Allowed Metrics : Riemann, Euclidian, LogEuclidian, Identity +/// +/// The First Covariance matrix. +/// The Second Covariance matrix. +/// The Geodesic. +/// (Optional) The metric (see ). +/// (Optional) Position on the Geodesic : \f$ 0\leq \text{alpha} \leq 1\f$. +/// True if it succeeds, False otherwise. +bool Geodesic(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b, Eigen::MatrixXd& g, EMetric metric = EMetric::Riemann, double alpha = 0.5); + +/// Compute the matrix at the position alpha on the Riemannian geodesic between A and B. \n +/// \f[ \gamma_\text{R} = A^{1/2} ~ \left( A^{-1/2} ~ B ~ A^{-1/2} \right)^\alpha ~ A^{1/2} \f] +/// +/// The First Covariance matrix. +/// The Second Covariance matrix. +/// The Geodesic. +/// (Optional) Position on the Geodesic : \f$ 0\leq \text{alpha} \leq 1\f$. +/// True if it succeeds, False otherwise. +bool GeodesicRiemann(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b, Eigen::MatrixXd& g, double alpha = 0.5); + +/// Compute the matrix at the position alpha on the Euclidean geodesic between A and B.\n +/// \f[ \gamma_\text{E} = \left(1 - \alpha \right) \times A + \alpha \times B \f] +/// +/// The First Covariance matrix. +/// The Second Covariance matrix. +/// The Geodesic. +/// (Optional) Position on the Geodesic : \f$ 0\leq \text{alpha} \leq 1\f$. +/// True if it succeeds, False otherwise. +bool GeodesicEuclidian(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b, Eigen::MatrixXd& g, double alpha = 0.5); + +/// Compute the matrix at the position alpha on the Log Euclidean geodesic between A and B. \n +/// \f[ \gamma_\text{LogE} = \exp\left(\left(1 - \alpha \right) \times \log\left(A\right) + \alpha \times \log\left(B\right) \right)\f] +/// +/// The First Covariance matrix. +/// The Second Covariance matrix. +/// The Geodesic. +/// (Optional) Position on the Geodesic : \f$ 0\leq \text{alpha} \leq 1\f$. +/// True if it succeeds, False otherwise. +bool GeodesicLogEuclidian(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b, Eigen::MatrixXd& g, double alpha = 0.5); + +/// Compute the matrix at the position alpha on the Identity geodesic. \n +/// \f[ \gamma_\text{I} = I_N \f] +/// +/// The First Covariance matrix. +/// The Second Covariance matrix. +/// The Geodesic. +/// (Optional) Position on the Geodesic : \f$ 0\leq \text{alpha} \leq 1\f$. +/// True if it succeeds, False otherwise. +bool GeodesicIdentity(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b, Eigen::MatrixXd& g, double alpha = 0.5); + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Mean.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Mean.hpp new file mode 100644 index 0000000..9a2aaa9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Mean.hpp @@ -0,0 +1,163 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file Mean.hpp +/// \brief All functions to estimate the mean of Vector of Covariance Matrix. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 26/10/2018. +/// \copyright GNU Affero General Public License v3.0. +/// \remarks +/// - List of Metrics inspired by the work of Alexandre Barachant : pyRiemann (License). +/// - The Approximate joint diagonalization based on pham's algorithm is not implemented. +/// - The Approximate joint diagonalization based log-Euclidean (ALE) Mean doesn't work => Need to implement and check if it works next. +/// - The Wasserstein Mean Doesn't work so good (after \f$10^{-3}\f$ precision with the pyriemann library). +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "geometry/Metrics.hpp" +#include +#include + +namespace Geometry { + +/// Compute the mean of vector of covariance matrix with the selected \p metric. +/// Vector of Covariance Matrix. +/// The computed mean. +/// (Optional) The metric (see ). +/// True if it succeeds, False otherwise. +bool Mean(const std::vector& covs, Eigen::MatrixXd& mean, EMetric metric = EMetric::Riemann); + +/// Approximate Joint Diagonalization based on pham's algorithm.\n +/// \f[ C_\text{AJD} = \cdots \f] +/// +/// Vector of Covariance Matrix. +/// The computed Approximate Joint Diagonalization. +/// (Optional) The epsilon. +/// (Optional) The maximum iterator. +/// True if it succeeds, False otherwise. +/// \todo Not implemented. +bool AJDPham(const std::vector& covs, Eigen::MatrixXd& ajd, double epsilon = 0.0001, int maxIter = 15); + +/// Compute the Mean with the Riemannian Mean.\n +/// -# Compute the Classical Mean \f$ C_{\mu_\text{E}} \f$ (see ) +/// -# Update with an iterative procedure that stops after 50 iterations or when one of two criterions is under \f$ 10^{-4}\f$ +/// +/// \f[ C_{\mu_\text{R}} = C_{\mu_\text{E}} \\ \nu=1.0 \\ \tau=+\infty \f] +/// Iterative process with \f$J\f$ while \f$ \text{iteration} < 50 \f$ and \f$ 10^{-4} < \left\lVert J \right\rVert \f$ and \f$ 10^{-4} < \nu \f$ +/// \f[ \begin{aligned} +/// J &= \frac{1}{N} \sum_i \log\left(C_{\mu_\text{R}}^{-1/2} + C_i ~ C_{\mu_\text{R}}^{-1/2}\right)\\ +/// C_{\mu_\text{R}} &= C_{\mu_\text{R}}^{1/2} ~ \exp(\nu \times J) ~ C_{\mu_\text{R}}^{1/2}\\ +/// \end{aligned} +/// \f] +/// \f[ \begin{cases} +/// \text{if } \nu \times \left\lVert J \right\rVert < \tau & \nu = 0.95 \times \nu,~\tau = \nu \times \left\lVert J \right\rVert\\ +/// \text{otherwise } & \nu = 0.5 \times \nu +/// \end{cases} +/// \f] +/// +/// Vector of Covariance Matrix. +/// The mean. +/// True if it succeeds, False otherwise. +bool MeanRiemann(const std::vector& covs, Eigen::MatrixXd& mean); + +/// Compute the Euclidian Mean.\n +/// \f[ C_{\mu_\text{E}} =\frac{1}{N} \sum_i{C_i}\f] +/// +/// Vector of Covariance Matrix. +/// The mean. +/// True if it succeeds, False otherwise. +bool MeanEuclidian(const std::vector& covs, Eigen::MatrixXd& mean); + +/// Compute the Log Euclidiean Mean.\n +/// \f[ C_{\mu_\text{lE}} =\exp\left(\frac{1}{N} \sum_i{\log\left(C_i\right)}\right)\f] +/// +/// Vector of Covariance Matrix. +/// The mean. +/// True if it succeeds, False otherwise. +bool MeanLogEuclidian(const std::vector& covs, Eigen::MatrixXd& mean); + +/// Compute the Log Determinant Mean.\n +/// -# Compute the Classical Mean \f$ C_{\mu_\text{E}} \f$ (see ) +/// -# Update with an iterative procedure that stops after 50 iterations or when criterion is under \f$ 10^{-4}\f$ +/// +/// \f[ C_{\mu_\text{lD}} = C_{\mu_\text{E}}\f] +/// Iterative process with \f$J\f$ while \f$ \text{iteration} < 50 \f$ and \f$ 10^{-4} < \left\lVert J-C_\mu \right\rVert \f$ +/// \f[ \begin{aligned} +/// J &= \left(\frac{1}{N} \sum_i \left( 0.5 \times\left(C_{\mu_\text{lD}} + C_i \right)\right)^{-1} \right)^{-1}\\ +/// C_{\mu_\text{lD}} &= J +/// \end{aligned}\f] +/// +/// Vector of Covariance Matrix. +/// The mean. +/// True if it succeeds, False otherwise. +bool MeanLogDet(const std::vector& covs, Eigen::MatrixXd& mean); + +/// Compute the Kullback Mean.\n +/// The mean is the Geodesic center between the Euclidian and the Harmonic Mean.\n +/// \f[ C_{\mu_\text{K}} = \gamma \left( C_{\mu_{\text{E}}}, C_{\mu_{\text{H}}} \right) \f] +/// +/// Vector of Covariance Matrix. +/// The mean. +/// True if it succeeds, False otherwise. +bool MeanKullback(const std::vector& covs, Eigen::MatrixXd& mean); + +/// Compute the Wasserstein Mean.\n +/// -# Compute the Classical Mean \f$ C_{\mu_\text{E}} \f$ (see ) +/// -# Update with an iterative procedure that stops after 50 iterations or when criterion is under \f$ 10^{-4}\f$ +/// +/// \f[ C_{\mu_\text{W}} = C_{\mu_{\text{E}}}\f] +/// Iterative process with \f$J\f$ while \f$ \text{iteration} < 50 \f$ and \f$ 10^{-4} < \left\lVert J-J_{-1} \right\rVert \f$ +/// \f[ \begin{aligned} +/// J &= C_{\mu_\text{W}}^{1/2}\\ +/// J &= \left(\frac{1}{N} \sum_i \left( J C_i J \right)^{1/2} \right)^{1/2}\\ +/// \end{aligned}\f] +/// After the Iterative process : \f$ C_{\mu_\text{W}} = J*J \f$ +/// +/// Vector of Covariance Matrix. +/// The mean. +/// True if it succeeds, False otherwise. +/// \todo Doesn't work so good (after \f$10^{-3}\f$ precision with the pyriemann library). +bool MeanWasserstein(const std::vector& covs, Eigen::MatrixXd& mean); + +/// Compute the Approximate joint diagonalization based log-Euclidean (ALE) Mean. \n +/// -# Compute the Approximate Joint Diagonalization \f$ C_\text{AJD} \f$ (see ) +/// -# Update with an iterative procedure that stops after 50 iterations or when criterion is under \f$ 10^{-4}\f$ +/// +/// \f[ C_{\mu_\text{ALE}} = C_\text{AJD}\f] +/// Iterative process with \f$J\f$ (and \f$U = \operatorname{diag}(\operatorname{diag}(\exp(J))\f$) while \f$ \text{iteration} < 50 \f$ and \f$ 10^{-4} < d_\text{R}(I_N,U) \f$ +/// \f[ \begin{aligned} +/// J &= \frac{1}{N} \log\left(\sum_i \left( C_{\mu_\text{ALE}}^{\mathsf{T}} C_i C_{\mu_\text{ALE}} \right) \right)\\ +/// U &= \operatorname{diag}(\operatorname{diag}(\exp(J))\\ +/// C_{\mu_\text{ALE}} &= C_{\mu_\text{ALE}} * U^{-1/2}\\ +/// \end{aligned}\f] +/// After the Iterative process : +/// \f[ \begin{aligned} +/// J &= \frac{1}{N} \log\left(\sum_i \left( C_{\mu_\text{ALE}}^{\mathsf{T}} C_i C_{\mu_\text{ALE}} \right) \right)\\ +/// C_{\mu_\text{ALE}} &= \left(C_{\mu_\text{ALE}}^{-1}\right)^{\mathsf{T}} ~ \exp(J) ~ C_{\mu_\text{ALE}}^{-1} +/// \end{aligned}\f] +/// +/// Vector of Covariance Matrix. +/// The mean. +/// True if it succeeds, False otherwise. +/// \todo Doesn't work => Need to implement and check if it works next. +bool MeanALE(const std::vector& covs, Eigen::MatrixXd& mean); + +/// Compute the Harmonic Mean.\n +/// \f[ C_{\mu_\text{H}} = (\frac{1}{N} \sum_i{C_i}^{-1})^{-1} \f] +/// +/// Vector of Covariance Matrix. +/// The mean. +/// True if it succeeds, False otherwise. +bool MeanHarmonic(const std::vector& covs, Eigen::MatrixXd& mean); + +/// Give the Identity Matrix.\n +/// \f[ C_{\mu_\text{I}} = I_N \f] +/// +/// Vector of Covariance Matrix. +/// The mean. +/// True if it succeeds, False otherwise. +bool MeanIdentity(const std::vector& covs, Eigen::MatrixXd& mean); + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Median.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Median.hpp new file mode 100644 index 0000000..8348c6d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Median.hpp @@ -0,0 +1,108 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file Median.hpp +/// \brief All Median functions for array or matrix. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 29/07/2020. +/// \copyright GNU Affero General Public License v3.0. +/// \remarks This algortihms is inspired by the plugin clean_rawdata in EEGLAB (License). +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include +#include +#include "geometry/Metrics.hpp" + +namespace Geometry { + +//--------------------------------------------------------------------------- +//------------------------------ Matrix Median ------------------------------ +//--------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +/// Find the median of stl vector. +/// The type of the values (only arithmetic type). +/// the vector of values. +/// The median of vector. +template ::value, T>::type> +T Median(const std::vector& v) +{ + std::vector tmp = v; + const size_t n = tmp.size() / 2; // Where is the middle (if odd number of value the decimal part is floor by cast) + std::stable_sort(tmp.begin(), tmp.end()); // We sort all because nth_element doesn't have same behaviour in Windows and Unix + return (tmp.size() % 2 == 0) ? (tmp[n] + tmp[n - 1]) / 2 : tmp[n]; // For Even number of value we take the mean of the two middle value +} +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +/// Find the median of values of the Eigen Matrix. +/// the matrix. +/// The median of matrix. +double Median(const Eigen::MatrixXd& m); +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +/// Compute the median of vector of matrix with the Weiszfeld's algorithm.
+/// To compute this median, we start by computing the initial median of the dataset by taking each element of the matrices independently. +/// That is to say that for the element at position i, j(a_i, j) of the matrices, we computes the median of the elements a_i, j of all the matrices of the dataset. +/// We thus have an initial median for our dataset.
+/// Then, we refine our median by the iterative algorithm of Weiszfeld: +/// - We remove the median in our dataset. +/// - For each new matrices, we compute the norm. +/// - We sum the the matrices in initial dataset (divided by their own norm) and we normalize the result by the sum of inverse norms. +/// - We iterate this previous step until we have a difference between the old and new median is under an epsilon or that the number of iterations is above the limit. +///
+/// Vector of Matrix. +/// The computed median. +/// (Optional) The epsilon value to stop algorithm. +/// (Optional) The maximum iteration allowed to find best Median. +/// True if it succeeds, False otherwise. +/// it's an iterative algorithm, so we have a limit of iterations and an epsilon value to consider the calculation as satisfactory. +bool MedianEuclidian(const std::vector& matrices, Eigen::MatrixXd& median, const double epsilon = 0.0001, const size_t maxIter = 50); +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +/// Compute the median of vector of matrix with the Riemman Barycentre.
+/// - Initialize the median with the euclidian mean of matrices. +/// - Iterate until the stop criterion (iteration over maxIter or \f$\text{gain}\f$ under epsilon). +/// - Compute the tangent space projection of each matrices with median as reference. +/// - Compute the sum (\f$\mathcal{S}\f$) of euclidian distance of each tangent space projection.
+/// \f[ \delta_E=\sqrt{\sum_{i \in N}{x_i^2}} \quad \text{with } x_i \text{ the feature } i \text{ of the tangent space projection}\f] +/// - Compare with previous sum and stop if \f$\text{gain} < \varepsilon\f$.
+/// \f[ \text{gain} = \left|\frac{\mathcal{S} - \mathcal{S}_\text{prev}}{\mathcal{S}_\text{prev}}\right| \f] +/// - Compute Median of each feature \f$i\f$ of tangent space projection. +/// - Transform this tangent space projection median to riemann space with previous median as reference and update the median by this new matrix. +///
+/// Vector of Matrix. +/// The computed median. +/// (Optional) The epsilon value to stop algorithm. +/// (Optional) The maximum iteration allowed to find best Median. +/// True if it succeeds, False otherwise. +bool MedianRiemann(const std::vector& matrices, Eigen::MatrixXd& median, const double epsilon = 0.0001, const size_t maxIter = 50); +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +/// Give the identity matrix has median. +/// Vector of Matrix. +/// The computed median. +/// True if it succeeds, False otherwise. +bool MedianIdentity(const std::vector& matrices, Eigen::MatrixXd& median); +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +/// Compute the median of vector of matrix with the Weiszfeld's algorithm for Euclidian Metric and Riemman Barycentre. +/// Vector of Matrix. +/// The computed median. +/// (Optional) The epsilon value to stop algorithm. +/// (Optional) The maximum iteration allowed to find best Median. +/// (Optional) THe metric to use. +/// True if it succeeds, False otherwise. +/// it's an iterative algorithm, so we have a limit of iterations and an epsilon value to consider the calculation as satisfactory. +bool Median(const std::vector& matrices, Eigen::MatrixXd& median, + const double epsilon = 0.0001, const size_t maxIter = 50, const EMetric& metric = EMetric::Euclidian); +//------------------------------------------------------------------------------------------------- + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Metrics.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Metrics.hpp new file mode 100644 index 0000000..d23e4cb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Metrics.hpp @@ -0,0 +1,69 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file Metrics.hpp +/// \brief All Metrics. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 26/10/2018. +/// \copyright GNU Affero General Public License v3.0. +/// \remarks +/// - List of Metrics inspired by the work of Alexandre Barachant : pyRiemann (License). +/// +///------------------------------------------------------------------------------------------------- + +#pragma once +#include + +namespace Geometry { + +/// Enumeration of metrics. Inspired by the work of Alexandre Barachant : pyRiemann. +enum class EMetric +{ + Riemann, ///< The Riemannian Metric. + Euclidian, ///< The Euclidian Metric. + LogEuclidian, ///< The Log Euclidian Metric. + LogDet, ///< The Log Determinant Metric. + Kullback, ///< The Kullback Metric. + ALE, ///< The AJD-based log-Euclidean (ALE) Metric. + Harmonic, ///< The Harmonic Metric. + Wasserstein, ///< The Wasserstein Metric. + Identity ///< The Identity Metric. +}; + +/// Convert metric to string. +/// The metric. +/// std::string +inline std::string toString(const EMetric metric) +{ + switch (metric) + { + case EMetric::Riemann: return "Riemann"; + case EMetric::Euclidian: return "Euclidian"; + case EMetric::LogEuclidian: return "Log Euclidian"; + case EMetric::LogDet: return "Log Determinant"; + case EMetric::Kullback: return "Kullback"; + case EMetric::ALE: return "AJD-based log-Euclidean"; + case EMetric::Harmonic: return "Harmonic"; + case EMetric::Wasserstein: return "Wasserstein"; + case EMetric::Identity: return "Identity"; + } + return "Invalid Metric"; +} + +/// Convert string to metric. +/// The metric. +/// +inline EMetric StringToMetric(const std::string& metric) +{ + if (metric == "Riemann") { return EMetric::Riemann; } + if (metric == "Euclidian") { return EMetric::Euclidian; } + if (metric == "Log Euclidian") { return EMetric::LogEuclidian; } + if (metric == "Log Determinant") { return EMetric::LogDet; } + if (metric == "Kullback") { return EMetric::Kullback; } + if (metric == "AJD-based log-Euclidean") { return EMetric::ALE; } + if (metric == "Harmonic") { return EMetric::Harmonic; } + if (metric == "Wasserstein") { return EMetric::Wasserstein; } + return EMetric::Identity; +} + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Misc.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Misc.hpp new file mode 100644 index 0000000..40bcc83 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/Misc.hpp @@ -0,0 +1,104 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file Misc.hpp +/// \brief All misc functions. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 29/07/2020. +/// \copyright GNU Affero General Public License v3.0. +/// \remarks This algortihms is inspired by the plugin clean_rawdata in EEGLAB (License). +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include +#include +#include "geometry/Metrics.hpp" + +namespace Geometry { + +//------------------------------------------------------------------- +//------------------------------ Range ------------------------------ +//------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +/// Create a range of double value. +/// Beginning of the range. +/// End of the range. +/// Step of the range. +/// Authorize the end in range if True. +/// The range vector. +/// Use [std::iota](https://en.cppreference.com/w/cpp/algorithm/iota) function and a struct for this specific used. +std::vector doubleRange(const double begin, const double end, const double step = 1.0, const bool closed = true); +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +/// Create a range of index with double value rounded. +/// Beginning of the range. +/// End of the range. +/// Step of the range. +/// Authorize the end in range if True. +/// Remove duplicate value if True. +/// The range vector. +/// Use [std::iota](https://en.cppreference.com/w/cpp/algorithm/iota) function and a struct for this specific used. +std::vector RoundIndexRange(const double begin, const double end, const double step, const bool closed = true, const bool unique = true); +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------ +//------------------------------ Fit Distribution ------------------------------ +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------------------------- +/// Commputes histogram of dataset extended in n bins, bins are computed from \f$[0;max]\f$ (values) to \f$[0;n]\f$ (bins). +/// Input vector (all datas are positive). +/// Number of bin of the final histogram. +std::vector BinHist(const std::vector& dataset, const size_t n); +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +/// Get a Fit distribution. +/// The values. +/// The mu. +/// The sigma. +/// List of wanted \f$\beta\f$ shapes. +/// Minimum of wanted quantile (in range [0, 1]). +/// Maximum of wanted quantile (in range [0, 1]). +/// Minimum of estimated clean datas (only positive value). +/// Maximum of estimated artifact datas (only positive value). +/// Step used to select beginning of datas subset (in range [0.0001, 0.1]). +/// Step used to select size of datas subset (in range [0.0001, 0.1]). +/// True if it succeeds, False otherwise. +bool FitDistribution(const std::vector& values, double& mu, double& sigma, + const std::vector& betas = doubleRange(1.7, 3.5, 0.15), + const double minQuant = 0.022, const double maxQuant = 0.60, + const double minClean = 0.250, const double maxDropout = 0.10, + const double stepBound = 0.010, const double stepScale = 0.01); +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------- +//------------------------------ Riemannian Eigen Values ------------------------------ +//------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +/// Compute sorted eigen vector of the matrix. +/// the input matrix. +/// Sorted eigen vectors. +/// Sorted eigen values. +/// metric used for vectors. +/// Actually only euclidian method is implemented.
+/// For Riemmanian metric, we must have some optimisation algorithm.
+void sortedEigenVector(const Eigen::MatrixXd& matrix, Eigen::MatrixXd& vectors, std::vector& values, const EMetric metric = EMetric::Euclidian); +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +/// Compute the eigen vector of the input matrix. +/// input Matrix. +/// Sorted eigen vectors. +/// Sorted eigen values. +/// True if it succeeds, False otherwise. +/// This algorithm is in EEGLAB plugin and inspired by the paper "A Riemannian Newton Algorithm for Nonlinear Eigenvalue Problems", Zhi Zhao, Zheng - Jian Bai, and Xiao - Qing Jin, SIAM Journal on Matrix Analysisand Applications, 36(2), 752 - 774, 2015. +//bool RiemannianNonLinearEigenVector(const Eigen::MatrixXd& matrix, Eigen::MatrixXd& vectors, std::vector& values); +//------------------------------------------------------------------------------------------------- + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/artifacts/CASR.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/artifacts/CASR.hpp new file mode 100644 index 0000000..dd82450 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/artifacts/CASR.hpp @@ -0,0 +1,161 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CASR.hpp +/// \brief Class used to use Artifact Subspace Reconstruction Algorithm. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 27/08/2020. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- +#pragma once + +#include +#include +#include + +#include "geometry/Basics.hpp" +#include "geometry/Metrics.hpp" + +namespace Geometry { + +/// Class For Artifact Subspace Reconstruction (ASR) Algorithm. +class CASR +{ +public: + + CASR() = default; ///< Initializes a new instance of the class. + + /// Initializes a new instance of the class with specified metric. + /// Only Euclidian and Riemmann metrics are implemented If other is selected, Euclidian is used. + explicit CASR(const EMetric& metric) { setMetric(metric); } + + /// Initializes a new instance of the class with specified metric and train with the specified dataset. + /// Only Euclidian and Riemmann metrics are implemented If other is selected, Euclidian is used. + explicit CASR(const EMetric& metric, const std::vector& dataset) + { + setMetric(metric); + train(dataset); + } + + ~CASR() = default; ///< Finalizes an instance of the class. + + /// Trains the specified dataset. + /// The dataset (Vector of signal window). + /// The rejection limit. + /// True if it succeeds, False otherwise. + bool train(const std::vector& dataset, const double rejectionLimit = 5); + + /// Apply the ASR algorithm to the input signal. + /// The input signal. + /// The corrected signal. + /// True if it succeeds, False otherwise. + bool process(const Eigen::MatrixXd& in, Eigen::MatrixXd& out); + + //*************************** + //***** Getter / Setter ***** + //*************************** + + /// Set the metric to use (only Riemann and euclidian is used). + /// The metric. + /// If invalid metric is used Euclidian is selected. + void setMetric(const EMetric& metric) { m_metric = (metric == EMetric::Riemann) ? EMetric::Riemann : EMetric::Euclidian; } + + /// Sets the number of channel (dimension) to reconstruct in fraction, 0 for nothing 1 for all. + /// The maximum ratio. + /// If value isn't in [0;1], this function does nothing. + void setMaxChannel(const double max) { if (InRange(max, 0.0, 1.0)) { m_maxChannel = max; } } + + /// Sets the differents matrices : median matrix, trheshold matrix, reconstruction matrix and covariance matrix. + /// The median matrix. + /// The threshold matrix. + /// (Optional) The reconstruct matrix. + /// (Optional) The covariance matrix. + /// True if it succeeds, False otherwise. + /// All matrices must be square with same size (or empty for reconstruct and covariance matrix). + /// Trivial trigger is set to true. + bool setMatrices(const Eigen::MatrixXd& median, const Eigen::MatrixXd& threshold, + const Eigen::MatrixXd& reconstruct = Eigen::MatrixXd(), const Eigen::MatrixXd& covariance = Eigen::MatrixXd()); + + EMetric getMetric() const { return m_metric; } ///< Get the metric. + size_t getChannelNumber() const { return m_nChannel; } ///< Get the matrices number of channel. + double getMaxChannel() const { return m_maxChannel; } ///< Get the number of channel (dimension) to reconstruct in fraction. + bool getTrivial() const { return m_trivial; } ///< Get is last reconstruct was trivial (first time or if previous doesn't need reconstruct). + Eigen::MatrixXd getMedian() const { return m_median; } ///< Get the median matrix. + Eigen::MatrixXd getThresholdMatrix() const { return m_threshold; } ///< Get the threshold matrix. + + //*********************** + //***** XML Manager ***** + //*********************** + /// Saves the ASR information in an XML file. + /// Filename. + /// True if it succeeds, False otherwise. + bool saveXML(const std::string& filename) const; + + /// Loads the ASR information from an XML file. + /// Filename. + /// True if it succeeds, False otherwise. + bool loadXML(const std::string& filename); + + //***************************** + //***** Override Operator ***** + //***************************** + /// Check if object are equals (with a precision tolerance). + /// The second object. + /// Precision for matrix comparison. + /// True if the two elements are equals (with a precision tolerance), False otherwise. + bool isEqual(const CASR& obj, const double precision = 1e-6) const; + + /// Copy object value. + /// The object to copy. + void copy(const CASR& obj); + + /// Get the ASR information for output. + /// The ASR print in stringstream. + std::stringstream print() const; + + /// Override the affectation operator. + /// The second object. + /// The copied object. + CASR& operator=(const CASR& obj) + { + copy(obj); + return *this; + } + + /// Override the equal operator. + /// The second object. + /// True if the two are equals. + bool operator==(const CASR& obj) const { return isEqual(obj); } + + /// Override the not equal operator. + /// The second object. + /// True if the two are diffrents. + bool operator!=(const CASR& obj) const { return !isEqual(obj); } + + /// Override the ostream operator. + /// The ostream. + /// The object. + /// Return the modified ostream. + friend std::ostream& operator <<(std::ostream& os, const CASR& obj) + { + os << obj.print().str(); + return os; + } + +protected: + + //********************* + //***** Variables ***** + //********************* + EMetric m_metric = EMetric::Euclidian; ///< Metric Used to compute (only euclidian and Riemann are implemented + size_t m_nChannel = 0; ///< Number of channels (dimension) + double m_maxChannel = 1; ///< Maximum number of channels (dimension) to reconstruct if needed (in fraction, 0 for nothing 1 for all). + bool m_trivial = true; ///< Define if previous sample was trivial to reconstruct + Eigen::MatrixXd m_median; ///< Median computed with train dataset + Eigen::MatrixXd m_threshold; ///< Threshold matrix computed with train dataset + Eigen::MatrixXd m_r; ///< Last Reconstruction matrix + Eigen::MatrixXd m_cov; ///< Last Covariance matrix +}; + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CBias.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CBias.hpp new file mode 100644 index 0000000..0dde6cc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CBias.hpp @@ -0,0 +1,141 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBias.hpp +/// \brief Class used to add Rebias to Other Classifier. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 27/08/2019. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- +#pragma once + +#include +#include +#include "geometry/Metrics.hpp" +#include "geometry/3rd-party/tinyxml2.h" + +namespace Geometry { + +/// Class For Bias Algorithm for covariance matrices. +class CBias +{ +public: + /// Initializes a new instance of the class. + CBias() = default; + /// Finalizes an instance of the class. + ~CBias() = default; + + /// Computes the Bias matrix and reset the number of classification. + /// The dataset (first dimension is the classes, second dimension is the trials as matrix). + /// The metric. + /// True if it succeeds, False otherwise. + bool computeBias(const std::vector>& dataset, const EMetric metric = EMetric::Riemann); + + /// Computes the Bias matrix and reset the number of classification. + /// The dataset is a vector of trial as matrix. + /// The metric. + /// True if it succeeds, False otherwise. + bool computeBias(const std::vector& dataset, const EMetric metric = EMetric::Riemann); + + /// Applies the Bias on 2D vector of Matrix. + /// The input 2D vector of matrix. + /// The output 2D vector of matrix. + void applyBias(const std::vector>& in, std::vector>& out); + /// Applies the Bias on vector of Matrix. + /// The input vector of matrix. + /// The output vector of matrix. + void applyBias(const std::vector& in, std::vector& out); + /// Applies the Bias on Matrix. + /// The input matrix. + /// The output matrix. + void applyBias(const Eigen::MatrixXd& in, Eigen::MatrixXd& out); + + /// Updates the Bias. + /// The sample. + /// The metric. + void updateBias(const Eigen::MatrixXd& sample, const EMetric metric = EMetric::Riemann); + + const Eigen::MatrixXd& getBias() const { return m_bias; } ///< Get the bias matrix. + void setBias(const Eigen::MatrixXd& bias); ///< Set the bias matrix and the inverse square root of biais. + + size_t getClassificationNumber() const { return m_n; } ///< Get the Number of classification (used for update). + void setClassificationNumber(const size_t& n) { m_n = n; } ///< Set the Number of classification (used for update). + + //*********************** + //***** XML Manager ***** + //*********************** + /// Saves the Bias information in an XML file. + /// Filename. + /// True if it succeeds, False otherwise. + bool saveXML(const std::string& filename) const; + + /// Loads the Bias information from an XML file. + /// Filename. + /// True if it succeeds, False otherwise. + bool loadXML(const std::string& filename); + + /// Save informations in xml element (Bias and number of classification). + /// True if it succeeds, False otherwise. + bool saveAdditional(tinyxml2::XMLDocument& doc, tinyxml2::XMLElement* data) const; + + /// Load informations in xml element (Bias and number of classification). + /// True if it succeeds, False otherwise. + bool loadAdditional(tinyxml2::XMLElement* data); + + //***************************** + //***** Override Operator ***** + //***************************** + /// Check if object are equals (with a precision tolerance). + /// The second object. + /// Precision for matrix comparison. + /// True if the two elements are equals (with a precision tolerance), False otherwise. + bool isEqual(const CBias& obj, const double precision = 1e-6) const; + + /// Copy object value. + /// The object to copy. + void copy(const CBias& obj); + + /// Get the Classifier information for output. + /// The Classifier print in stringstream. + std::stringstream print() const; + + /// Override the affectation operator. + /// The second object. + /// The copied object. + CBias& operator=(const CBias& obj) + { + copy(obj); + return *this; + } + + /// Override the equal operator. + /// The second object. + /// True if the two are equals. + bool operator==(const CBias& obj) const { return isEqual(obj); } + + /// Override the not equal operator. + /// The second object. + /// True if the two are diffrents. + bool operator!=(const CBias& obj) const { return !isEqual(obj); } + + /// Override the ostream operator. + /// The ostream. + /// The object. + /// Return the modified ostream. + friend std::ostream& operator <<(std::ostream& os, const CBias& obj) + { + os << obj.print().str(); + return os; + } + +protected: + //********************* + //***** Variables ***** + //********************* + size_t m_n = 0; ///< Number of classification launched (used for update). + Eigen::MatrixXd m_bias; ///< Bias Matrix. + Eigen::MatrixXd m_biasIS; ///< Inverse squared root bias matrix (stored and pre-computed for application of bias). +}; + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CMatrixClassifierFgMDM.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CMatrixClassifierFgMDM.hpp new file mode 100644 index 0000000..48978d0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CMatrixClassifierFgMDM.hpp @@ -0,0 +1,117 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CMatrixClassifierFgMDM.hpp +/// \brief Class of Minimum Distance to Mean with geodesic filtering (FgMDM) Classifier. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 10/12/2018. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "geometry/classifier/CMatrixClassifierFgMDMRT.hpp" + +namespace Geometry { + +/// Class of Minimum Distance to Mean with geodesic filtering (FgMDM) Classifier. +/// +class CMatrixClassifierFgMDM final : public CMatrixClassifierFgMDMRT +{ +public: + //*********************** + //***** Constructor ***** + //*********************** + /// Initializes a new instance of the class. + CMatrixClassifierFgMDM() = default; + + /// Default Copy constructor. Initializes a new instance of the class. + /// Initial object. + CMatrixClassifierFgMDM(const CMatrixClassifierFgMDM& obj) { *this = obj; } + + /// Copy constructor with parent class. Initializes a new instance of the class. + /// Initial object. + explicit CMatrixClassifierFgMDM(const CMatrixClassifierFgMDMRT& obj) { copy(obj); } + + /// Initializes a new instance of the class and set base members. + /// The number of classes. + /// Metric to use to calculate means (see also ). + explicit CMatrixClassifierFgMDM(const size_t nbClass, const EMetric metric) : CMatrixClassifierFgMDMRT(nbClass, metric) { } + + /// Finalizes an instance of the class. + /// clear the vector of Matrix and the member. + ~CMatrixClassifierFgMDM() override; + + //*************************** + //***** Getter / Setter ***** + //*************************** + void setDataset(const std::vector>& dataset) { m_dataset = dataset; } ///< Set dataset. + const std::vector>& getDataset() const { return m_dataset; } ///< Get dataset. + + //********************** + //***** Classifier ***** + //********************** + /// Train the classifier with the dataset. + /// -# Compute the Riemann mean of all trials as reference and store this in member. + /// -# Set the good number of classes + /// -# Trasnform data to the Tangent Space with the reference + /// -# Compute the FgDA Weight (). + /// -# Apply the FgDA Weight and return to Original Manifold. + /// -# Apply the train function of MDM Classifier (see ) + /// + /// The dataset (first dimension is the classes, second dimension is the trials as covariance matrix). + /// True if it succeeds, False otherwise. + /// the dataset is saved. + bool train(const std::vector>& dataset) override; + + /// Classify the matrix and return the class id, the distance and the probability of each class.\n + /// -# Transform the sample to the Tangent Space.\n + /// -# Apply the FgDA weight.\n + /// -# Return to the original Manifold.\n + /// -# Apply the classify function of MDM Classifier (see ) + /// + /// The classifier is train with the new sample. + /// \copydetails IMatrixClassifier::classify(const Eigen::MatrixXd&, size_t&, std::vector&, std::vector&, const EAdaptations, const size_t&) + bool classify(const Eigen::MatrixXd& sample, size_t& classId, std::vector& distance, std::vector& probability, + EAdaptations adaptation = EAdaptations::None, const size_t& realClassId = std::numeric_limits::max()) override; + + + //***************************** + //***** Override Operator ***** + //***************************** + + /// Get the type of the classifier. + /// Minimum Distance to Mean with geodesic filtering (FgMDM). + std::string getType() const override { return toString(EMatrixClassifiers::FgMDM); } + + /// Override the affectation operator. + /// The second object. + /// The copied object. + CMatrixClassifierFgMDM& operator=(const CMatrixClassifierFgMDM& obj) + { + copy(obj); + return *this; + } + + /// Override the ostream operator. + /// The ostream. + /// The object. + /// Return the modified ostream. + friend std::ostream& operator <<(std::ostream& os, const CMatrixClassifierFgMDM& obj) + { + os << obj.print().str(); + return os; + } + +protected: + /// train with the actual dataset (). + bool train() { return CMatrixClassifierFgMDMRT::train(m_dataset); } + + //********************* + //***** Variables ***** + //********************* + std::vector> m_dataset; ///< Data set for train and adaptation (it can quickly rise). +}; + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CMatrixClassifierFgMDMRT.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CMatrixClassifierFgMDMRT.hpp new file mode 100644 index 0000000..b269ecd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CMatrixClassifierFgMDMRT.hpp @@ -0,0 +1,151 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CMatrixClassifierFgMDMRT.hpp +/// \brief Class of Minimum Distance to Mean with geodesic filtering (FgMDM) Classifier RT (adaptation is Real Time Assumed) +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 10/12/2018. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "geometry/classifier/CMatrixClassifierMDM.hpp" + +namespace Geometry { + +/// Class of Minimum Distance to Mean with geodesic filtering (FgMDM) Classifier RT (adaptation is Real Time Assumed). +/// +class CMatrixClassifierFgMDMRT : public CMatrixClassifierMDM +{ +public: + //*********************** + //***** Constructor ***** + //*********************** + /// Initializes a new instance of the class. + CMatrixClassifierFgMDMRT() = default; + + /// Default Copy constructor. Initializes a new instance of the class. + /// Initial object. + CMatrixClassifierFgMDMRT(const CMatrixClassifierFgMDMRT& obj) { *this = obj; } + + /// Initializes a new instance of the class and set base members. + /// The number of classes. + /// Metric to use to calculate means (see also ). + explicit CMatrixClassifierFgMDMRT(const size_t nbClass, const EMetric metric) : CMatrixClassifierMDM(nbClass, metric) { } + + /// Finalizes an instance of the class. + /// clear the vector of Matrix. + ~CMatrixClassifierFgMDMRT() override = default; + + //*************************** + //***** Getter / Setter ***** + //*************************** + const Eigen::MatrixXd& getRef() const { return m_ref; } ///< Get reference of tangent space. + void setRef(const Eigen::MatrixXd& ref) { m_ref = ref; } ///< Set reference of tangent space. + + const Eigen::MatrixXd& getWeight() const { return m_weight; } ///< Get weight matrix of geodesic filter. + void setWeight(const Eigen::MatrixXd& weight) { m_weight = weight; } ///< Set weight matrix of geodesic filter. + + //********************** + //***** Classifier ***** + //********************** + /// Train the classifier with the dataset. + /// -# Compute the Riemann mean of all trials as reference and store this in member. + /// -# Set the good number of classes + /// -# Trasnform data to the Tangent Space with the reference + /// -# Compute the FgDA Weight (). + /// -# Apply the FgDA Weight and return to Original Manifold. + /// -# Apply the train function of MDM Classifier (see ) + /// + /// The dataset (first dimension is the classes, second dimension is the trials as covariance matrix). + /// True if it succeeds, False otherwise. + bool train(const std::vector>& dataset) override; + + /// Classify the matrix and return the class id, the distance and the probability of each class.\n + /// -# Transform the sample to the Tangent Space.\n + /// -# Apply the FgDA weight.\n + /// -# Return to the original Manifold.\n + /// -# Apply the classify function of MDM Classifier (see ) + /// + /// + /// Remark : We use the MDM classification whatever the adaptation method chosen. + /// Thus the MDM part evolves but the geodesic filtering does not evolve to keep an execution online. + /// A version allowing the adaptation of the Filter will be implemented for offline execution. + /// + /// \copydetails IMatrixClassifier::classify(const Eigen::MatrixXd&, size_t&, std::vector&, std::vector&, const EAdaptations, const size_t&) + bool classify(const Eigen::MatrixXd& sample, size_t& classId, std::vector& distance, std::vector& probability, + EAdaptations adaptation = EAdaptations::None, const size_t& realClassId = std::numeric_limits::max()) override; + + + //***************************** + //***** Override Operator ***** + //***************************** + /// Check if object are equals (with a precision tolerance). + /// The second object. + /// Precision for matrix comparison. + /// True if the two elements are equals (with a precision tolerance). + bool isEqual(const CMatrixClassifierFgMDMRT& obj, double precision = 1e-6) const; + + /// Copy object value. + /// The object to copy. + void copy(const CMatrixClassifierFgMDMRT& obj); + + /// Get the type of the classifier. + /// Minimum Distance to Mean with geodesic filtering (FgMDM). + std::string getType() const override { return toString(EMatrixClassifiers::FgMDM_RT); } + + /// Override the affectation operator. + /// The second object. + /// The copied object. + CMatrixClassifierFgMDMRT& operator=(const CMatrixClassifierFgMDMRT& obj) + { + copy(obj); + return *this; + } + + /// Override the equal operator. + /// The second object. + /// True if the two are equals. + bool operator==(const CMatrixClassifierFgMDMRT& obj) const { return isEqual(obj); } + + /// Override the not equal operator. + /// The second object. + /// True if the two are diffrents. + bool operator!=(const CMatrixClassifierFgMDMRT& obj) const { return !isEqual(obj); } + + /// Override the ostream operator. + /// The ostream. + /// The object. + /// Return the modified ostream. + friend std::ostream& operator <<(std::ostream& os, const CMatrixClassifierFgMDMRT& obj) + { + os << obj.print().str(); + return os; + } + +protected: + //*********************** + //***** XML Manager ***** + //*********************** + /// Save Additionnal informations (Reference and LDA Weight). + /// True if it succeeds, False otherwise. + bool saveAdditional(tinyxml2::XMLDocument& doc, tinyxml2::XMLElement* data) const override; + + /// Load Additionnal informations (Reference and LDA Weight). + /// True if it succeeds, False otherwise. + bool loadAdditional(tinyxml2::XMLElement* data) override; + + /// Prints the Additional informations (Reference and LDA Weight). + /// Additional informations in stringstream. + std::stringstream printAdditional() const override; + + //********************* + //***** Variables ***** + //********************* + Eigen::MatrixXd m_ref; ///< Reference matrix of tanget space. + Eigen::MatrixXd m_weight; ///< Weght matrix of Filter Geodesic Discriminant Analysis. +}; + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CMatrixClassifierFgMDMRTRebias.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CMatrixClassifierFgMDMRTRebias.hpp new file mode 100644 index 0000000..532b20f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CMatrixClassifierFgMDMRTRebias.hpp @@ -0,0 +1,148 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CMatrixClassifierFgMDMRTRebias.hpp +/// \brief Class of Minimum Distance to Mean with geodesic filtering (FgMDM) Classifier RT (adaptation is Real Time Assumed) +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 10/12/2018. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "geometry/classifier/CMatrixClassifierFgMDMRT.hpp" +#include "geometry/classifier/CBias.hpp" + +namespace Geometry { + +/// Class of Minimum Distance to Mean with geodesic filtering (FgMDM) Classifier RT (adaptation is Real Time Assumed). +/// +class CMatrixClassifierFgMDMRTRebias final : public CMatrixClassifierFgMDMRT +{ +public: + //*********************** + //***** Constructor ***** + //*********************** + /// Initializes a new instance of the class. + CMatrixClassifierFgMDMRTRebias() = default; + + /// Default Copy constructor. Initializes a new instance of the class. + /// Initial object. + CMatrixClassifierFgMDMRTRebias(const CMatrixClassifierFgMDMRTRebias& obj) { *this = obj; } + + /// Initializes a new instance of the class and set base members. + /// The number of classes. + /// Metric to use to calculate means (see also ). + explicit CMatrixClassifierFgMDMRTRebias(const size_t nbClass, const EMetric metric) : CMatrixClassifierFgMDMRT(nbClass, metric) { } + + /// Finalizes an instance of the class. + /// clear the vector of Matrix. + ~CMatrixClassifierFgMDMRTRebias() override = default; + + //*************************** + //***** Getter / Setter ***** + //*************************** + const CBias& getBias() const { return m_bias; } ///< Get Rebias Method. + void setBias(const CBias& bias) { m_bias = bias; } ///< Set Rebias Method. + + //********************** + //***** Classifier ***** + //********************** + /// Train the classifier with the dataset. + /// -# Compute the Riemann mean of all trials as reference and store this in member. + /// -# Set the good number of classes + /// -# Trasnform data to the Tangent Space with the reference + /// -# Compute the FgDA Weight (). + /// -# Apply the FgDA Weight and return to Original Manifold. + /// -# Apply the train function of MDM Classifier (see ) + /// + /// The dataset (first dimension is the classes, second dimension is the trials as covariance matrix). + /// True if it succeeds, False otherwise. + bool train(const std::vector>& dataset) override; + + /// Classify the matrix and return the class id, the distance and the probability of each class.\n + /// -# Transform the sample to the Tangent Space.\n + /// -# Apply the FgDA weight.\n + /// -# Return to the original Manifold.\n + /// -# Apply the classify function of MDM Classifier (see ) + /// + /// + /// Remark : We use the MDM classification whatever the adaptation method chosen. + /// Thus the MDM part evolves but the geodesic filtering does not evolve to keep an execution online. + /// A version allowing the adaptation of the Filter will be implemented for offline execution. + /// + /// \copydetails IMatrixClassifier::classify(const Eigen::MatrixXd&, size_t&, std::vector&, std::vector&, const EAdaptations, const size_t&) + bool classify(const Eigen::MatrixXd& sample, size_t& classId, std::vector& distance, std::vector& probability, + EAdaptations adaptation = EAdaptations::None, const size_t& realClassId = std::numeric_limits::max()) override; + + //***************************** + //***** Override Operator ***** + //***************************** + + /// Check if object are equals (with a precision tolerance). + /// The second object. + /// Precision for matrix comparison. + /// True if the two elements are equals (with a precision tolerance). + bool isEqual(const CMatrixClassifierFgMDMRTRebias& obj, double precision = 1e-6) const; + + /// Copy object value. + /// The object to copy. + void copy(const CMatrixClassifierFgMDMRTRebias& obj); + + /// Get the type of the classifier. + /// Minimum Distance to Mean with geodesic filtering (FgMDM). + std::string getType() const override { return toString(EMatrixClassifiers::FgMDM_RT_Rebias); } + + /// Override the affectation operator. + /// The second object. + /// The copied object. + CMatrixClassifierFgMDMRTRebias& operator=(const CMatrixClassifierFgMDMRTRebias& obj) + { + copy(obj); + return *this; + } + + /// Override the equal operator. + /// The second object. + /// True if the two are equals. + bool operator==(const CMatrixClassifierFgMDMRTRebias& obj) const { return isEqual(obj); } + + /// Override the not equal operator. + /// The second object. + /// True if the two are diffrents. + bool operator!=(const CMatrixClassifierFgMDMRTRebias& obj) const { return !isEqual(obj); } + + /// Override the ostream operator. + /// The ostream. + /// The object. + /// Return the modified ostream. + friend std::ostream& operator <<(std::ostream& os, const CMatrixClassifierFgMDMRTRebias& obj) + { + os << obj.print().str(); + return os; + } + +protected: + //*********************** + //***** XML Manager ***** + //*********************** + /// Save Additionnal informations (Reference and LDA Weight). + /// True if it succeeds, False otherwise. + bool saveAdditional(tinyxml2::XMLDocument& doc, tinyxml2::XMLElement* data) const override; + + /// Load Additionnal informations (Reference and LDA Weight). + /// True if it succeeds, False otherwise. + bool loadAdditional(tinyxml2::XMLElement* data) override; + + /// Prints the Additional informations (Reference and LDA Weight). + /// Additional informations in stringstream. + std::stringstream printAdditional() const override; + + //********************* + //***** Variables ***** + //********************* + CBias m_bias; ///< Rebias Method. +}; + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CMatrixClassifierMDM.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CMatrixClassifierMDM.hpp new file mode 100644 index 0000000..39ce029 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CMatrixClassifierMDM.hpp @@ -0,0 +1,164 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CMatrixClassifierMDM.hpp +/// \brief Class of Minimum Distance to Mean (MDM) Classifier +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 10/12/2018. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "geometry/classifier/IMatrixClassifier.hpp" +#include "geometry/Metrics.hpp" + +namespace Geometry { + +/// Class of Minimum Distance to Mean (MDM) Classifier. +/// +class CMatrixClassifierMDM : public IMatrixClassifier +{ +public: + //*********************** + //***** Constructor ***** + //*********************** + /// Default constructor. Initializes a new instance of the class. + CMatrixClassifierMDM() { CMatrixClassifierMDM::setClassCount(m_nbClass); } + + /// Default Copy constructor. Initializes a new instance of the class. + /// Initial object. + CMatrixClassifierMDM(const CMatrixClassifierMDM& obj) { *this = obj; } + + /// Initializes a new instance of the class and set base members. + /// The number of classes. + /// Metric to use to calculate means (see also ). + explicit CMatrixClassifierMDM(size_t nbClass, EMetric metric); + + /// Finalizes an instance of the class. + /// clear the vector of Matrix. + ~CMatrixClassifierMDM() override; + + //*************************** + //***** Getter / Setter ***** + //*************************** + const std::vector& getMeans() const { return m_means; } ///< Get Means of classes. + void setMeans(const std::vector& means) { m_means = means; } ///< Set Means of classes. + + const std::vector& getTrialNumbers() const { return m_nbTrials; } ///< Get the number of trial used for train. + void setTrialNumbers(const std::vector& nbTrials) { m_nbTrials = nbTrials; } ///< Set the number of trial used for train. + + //********************** + //***** Classifier ***** + //********************** + /// Set the class count. + /// resize the vector of Matrix. + void setClassCount(size_t nbClass) override; + + /// Train the classifier with the dataset. + /// -# Set the good number of classes + /// -# Compute the mean of each class (row) with the metric () in member. + /// -# Set the number of trials for each class. + /// + /// The dataset (first dimension is the classes, second dimension is the trials as covariance matrix). + /// True if it succeeds, False otherwise. + bool train(const std::vector>& dataset) override; + + /// Classify the matrix and return the class id, the distance and the probability of each class.\n + /// - Compute the distance between the sample and each mean matrix.\n + /// - The class with the closest mean is the predicted class.\n + /// - The distances are returned.\n + /// - The probability \f$ \mathcal{P}_i \f$ to be the class \f$ i \f$ is compute as : + /// \f[ + /// \begin{aligned} + /// p_i &= \frac{d_{\text{min}}}{d_i}\\ + /// \mathcal{P}_i &= \frac{p_i}{\sum{\left(p_i\right)}} + /// \end{aligned} + /// \f] + /// + /// + /// Remark : The probability is normalized \f$ \sum{\left(\mathcal{P}_i\right)} = 1 \f$\n + /// If the classfier is adapted, launch adaptation method (expected class if supervised, predicted class if unsupervised).\n + /// With \f$ C_k \f$ the prototype (mean) of the Class \f$ k \f$, \f$ \gamma_m \f$ the Geodesic () with the metric \f$ m \f$ (), + /// \f$ S \f$ the current trial (sample) and \f$ N_k \f$ the number of trials for the class \f$ k \f$ (with the current trial). + /// \f[ + /// C_k = \gamma_m\left( C_k,S,\frac{1}{N_k}\right) + /// \f] + /// + /// \copydetails IMatrixClassifier::classify(const Eigen::MatrixXd&, size_t&, std::vector&, std::vector&, const EAdaptations, const size_t&) + bool classify(const Eigen::MatrixXd& sample, size_t& classId, std::vector& distance, std::vector& probability, + EAdaptations adaptation = EAdaptations::None, const size_t& realClassId = std::numeric_limits::max()) override; + + //***************************** + //***** Override Operator ***** + //***************************** + + /// Check if object are equals (with a precision tolerance). + /// The second object. + /// Precision for matrix comparison. + /// True if the two elements are equals (with a precision tolerance). + bool isEqual(const CMatrixClassifierMDM& obj, double precision = 1e-6) const; + + /// Copy object value. + /// The object to copy. + void copy(const CMatrixClassifierMDM& obj); + + /// Get the type of the classifier. + /// Minimum Distance to Mean. + std::string getType() const override { return toString(EMatrixClassifiers::MDM); } + + /// Override the affectation operator. + /// The second object. + /// The copied object. + CMatrixClassifierMDM& operator=(const CMatrixClassifierMDM& obj) + { + copy(obj); + return *this; + } + + /// Override the equal operator. + /// The second object. + /// True if the two are equals. + bool operator==(const CMatrixClassifierMDM& obj) const { return isEqual(obj); } + + /// Override the not equal operator. + /// The second object. + /// True if the two are diffrents. + bool operator!=(const CMatrixClassifierMDM& obj) const { return !isEqual(obj); } + + /// Override the ostream operator. + /// The ostream. + /// The object. + /// Return the modified ostream. + friend std::ostream& operator <<(std::ostream& os, const CMatrixClassifierMDM& obj) + { + os << obj.print().str(); + return os; + } + +protected: + //*********************** + //***** XML Manager ***** + //*********************** + /// Save Classes informations (Mean and number of trials of each class). + /// True if it succeeds, False otherwise. + bool saveClasses(tinyxml2::XMLDocument& doc, tinyxml2::XMLElement* data) const override; + + /// Load Classes informations (Mean and number of trials of each class). + /// True if it succeeds, False otherwise. + bool loadClasses(tinyxml2::XMLElement* data) override; + + //***************************** + //***** Override Operator ***** + //***************************** + std::stringstream printClasses() const override; + + //********************* + //***** Variables ***** + //********************* + std::vector m_means; ///< Mean Matrix of each class. + std::vector m_nbTrials; ///< Number of trials of each class. +}; + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CMatrixClassifierMDMRebias.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CMatrixClassifierMDMRebias.hpp new file mode 100644 index 0000000..66ac3ed --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/CMatrixClassifierMDMRebias.hpp @@ -0,0 +1,141 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CMatrixClassifierMDMRebias.hpp +/// \brief Class of Minimum Distance to Mean (MDM) Classifier with Rebias. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 10/12/2018. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "geometry/classifier/CMatrixClassifierMDM.hpp" +#include "geometry/Metrics.hpp" +#include "geometry/classifier/CBias.hpp" + +namespace Geometry { + +/// Class of Minimum Distance to Mean (MDM) Classifier with Rebias. +/// +class CMatrixClassifierMDMRebias final : public CMatrixClassifierMDM +{ +public: + //*********************** + //***** Constructor ***** + //*********************** + /// Default constructor. Initializes a new instance of the class. + CMatrixClassifierMDMRebias() = default; + + /// Default Copy constructor. Initializes a new instance of the class. + /// Initial object. + CMatrixClassifierMDMRebias(const CMatrixClassifierMDMRebias& obj) { *this = obj; } + + /// Initializes a new instance of the class and set base members. + /// The number of classes. + /// Metric to use to calculate means (see also ). + explicit CMatrixClassifierMDMRebias(const size_t nbClass, const EMetric metric) : CMatrixClassifierMDM(nbClass, metric) { } + + /// Finalizes an instance of the class. + ~CMatrixClassifierMDMRebias() override = default; + + //*************************** + //***** Getter / Setter ***** + //*************************** + const CBias& getBias() const { return m_bias; } ///< Get Rebias Method. + void setBias(const CBias& bias) { m_bias = bias; } ///< Set Rebias Method. + + //********************** + //***** Classifier ***** + //********************** + + /// Train the classifier with the dataset. + /// -# Compute the mean of all trials with the metric () in member as reference and store this in member. + /// -# Set the good number of classes + /// -# Apply an affine transformation on each trials with the reference : \f$ S_\text{new} = R^{-1/2} * S * {R^{-1/2}}^{\mathsf{T}} \f$ + /// -# Compute the mean of each class (row), on transformed trials, with the metric () in member. + /// -# Set the number of trials for each class. + /// + /// The dataset (first dimension is the classes, second dimension is the trials as covariance matrix). + /// True if it succeeds, False otherwise. + bool train(const std::vector>& dataset) override; + + /// Classify the matrix and return the class id, the distance and the probability of each class. + /// -# Apply an affine transformation on the trial (sample) with the reference : \f$ S_\text{new} = R^{-1/2} * S * {R^{-1/2}}^{\mathsf{T}} \f$ + /// -# Update the reference with the current sample the first time and next with the Geodesic between the reference and the current sample.\n + /// With \f$ \gamma_m \f$ the Geodesic () with the metric \f$ m \f$ () and \f$ N_c \f$ the number of classification : \f$ R = \gamma_\text{m}\left( R,S,\frac{1}{N_c} \right) \f$ + /// -# Apply the classify function of MDM Classifier (see ) + /// + /// \copydetails IMatrixClassifier::classify(const Eigen::MatrixXd&, size_t&, std::vector&, std::vector&, const EAdaptations, const size_t&) + bool classify(const Eigen::MatrixXd& sample, size_t& classId, std::vector& distance, std::vector& probability, + EAdaptations adaptation = EAdaptations::None, const size_t& realClassId = std::numeric_limits::max()) override; + + //***************************** + //***** Override Operator ***** + //***************************** + + /// Check if object are equals (with a precision tolerance). + /// The second object. + /// Precision for matrix comparison. + /// True if the two elements are equals (with a precision tolerance). + bool isEqual(const CMatrixClassifierMDMRebias& obj, double precision = 1e-6) const; + + /// Copy object value. + /// The object to copy. + void copy(const CMatrixClassifierMDMRebias& obj); + + /// Get the type of the classifier. + /// Minimum Distance to Mean REBIAS. + std::string getType() const override { return toString(EMatrixClassifiers::MDM_Rebias); } + + /// Override the affectation operator. + /// The second object. + /// The copied object. + CMatrixClassifierMDMRebias& operator=(const CMatrixClassifierMDMRebias& obj) + { + copy(obj); + return *this; + } + + /// Override the equal operator. + /// The second object. + /// True if the two are equals. + bool operator==(const CMatrixClassifierMDMRebias& obj) const { return isEqual(obj); } + + /// Override the not equal operator. + /// The second object. + /// True if the two are diffrents. + bool operator!=(const CMatrixClassifierMDMRebias& obj) const { return !isEqual(obj); } + + /// Override the ostream operator. + /// The ostream. + /// The object. + /// Return the modified ostream. + friend std::ostream& operator <<(std::ostream& os, const CMatrixClassifierMDMRebias& obj) + { + os << obj.print().str(); + return os; + } + +protected: + + /// Save Additionnal informations (reference and number of classification). + /// True if it succeeds, False otherwise. + bool saveAdditional(tinyxml2::XMLDocument& doc, tinyxml2::XMLElement* data) const override; + + /// Load Additionnal informations (reference and number of classification). + /// True if it succeeds, False otherwise. + bool loadAdditional(tinyxml2::XMLElement* data) override; + + /// Prints the Additional informations (reference and number of classification). + /// Additional informations in stringstream. + std::stringstream printAdditional() const override; + + //********************* + //***** Variables ***** + //********************* + CBias m_bias; ///< Rebias Method. +}; + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/IMatrixClassifier.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/IMatrixClassifier.hpp new file mode 100644 index 0000000..a95353f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/include/geometry/classifier/IMatrixClassifier.hpp @@ -0,0 +1,315 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file IMatrixClassifier.hpp +/// \brief Abstract class of Matrix Classifier +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 10/12/2018. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include +#include +#include +#include "geometry/Metrics.hpp" +#include "geometry/3rd-party/tinyxml2.h" + +namespace Geometry { + +///------------------------------------------------------------------------------------------------- +/// Enumeration of Adaptation Methods for classifier. +enum class EAdaptations +{ + None, ///< No Adaptation. + Supervised, ///< Supervised Adaptation. + Unsupervised ///< Unsupervised Adaptation. +}; + +/// Convert adaptations to string. +/// The type of adaptation. +/// std::string +inline std::string toString(const EAdaptations type) +{ + switch (type) + { + case EAdaptations::None: return "No"; + case EAdaptations::Supervised: return "Supervised"; + case EAdaptations::Unsupervised: return "Unsupervised"; + } + return "Invalid"; +} + +/// Convert string to adaptations. +/// The type of adaptation. +/// +inline EAdaptations StringToAdaptation(const std::string& type) +{ + if (type == "No") { return EAdaptations::None; } + if (type == "Supervised") { return EAdaptations::Supervised; } + return EAdaptations::Unsupervised; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +/// Enumeration of Matrix Classifiers. +enum class EMatrixClassifiers +{ + MDM, ///< Minimum Distance To Mean (MDM) Classifier. + MDM_Rebias, ///< Minimum Distance To Mean Rebias (MDM Rebias) Classifier. + FgMDM_RT, ///< Minimum Distance to Mean with geodesic filtering (FgMDM) (Real Time adaptation assumed). + FgMDM, ///< Minimum Distance to Mean with geodesic filtering (FgMDM). + FgMDM_RT_Rebias, ///< Minimum Distance to Mean with geodesic filtering & Rebias adaptation (FgMDM Rebias) (Real Time adaptation assumed). + FgMDM_Rebias ///< Minimum Distance to Mean with geodesic filtering & Rebias adaptation (FgMDM Rebias). +}; + + +/// Convert Matrix Classifiers to string. +/// The type of classifier. +/// std::string +inline std::string toString(const EMatrixClassifiers type) +{ + switch (type) + { + case EMatrixClassifiers::MDM: return "Minimum Distance to Mean (MDM)"; + case EMatrixClassifiers::MDM_Rebias: return "Minimum Distance to Mean Rebias (MDM Rebias)"; + case EMatrixClassifiers::FgMDM_RT: return "Minimum Distance to Mean with geodesic filtering (FgMDM) (Real Time adaptation assumed)"; + case EMatrixClassifiers::FgMDM: return "Minimum Distance to Mean with geodesic filtering (FgMDM)"; + case EMatrixClassifiers::FgMDM_RT_Rebias: return "Minimum Distance to Mean with geodesic filtering Rebias (FgMDM Rebias) (Real Time adaptation assumed)"; + case EMatrixClassifiers::FgMDM_Rebias: return "Minimum Distance to Mean with geodesic filtering Rebias (FgMDM Rebias)"; + } + return "Invalid"; +} + +/// Convert string to Matrix Classifiers. +/// The type of classifier. +/// +inline EMatrixClassifiers StringToMatrixClassifier(const std::string& type) +{ + if (type == "Minimum Distance to Mean (MDM)") { return EMatrixClassifiers::MDM; } + if (type == "Minimum Distance to Mean Rebias (MDM Rebias)") { return EMatrixClassifiers::MDM_Rebias; } + if (type == "Minimum Distance to Mean with geodesic filtering (FgMDM) (Real Time adaptation assumed)") { return EMatrixClassifiers::FgMDM_RT; } + if (type == "Minimum Distance to Mean with geodesic filtering (FgMDM)") { return EMatrixClassifiers::FgMDM; } + if (type == "Minimum Distance to Mean with geodesic filtering Rebias (FgMDM Rebias) (Real Time adaptation assumed)") + { + return EMatrixClassifiers::FgMDM_RT_Rebias; + } + return EMatrixClassifiers::FgMDM_Rebias; +} +///------------------------------------------------------------------------------------------------- + +/// Format the Eigen matrix with Full Precision. +#define MATRIX_FORMAT Eigen::IOFormat(-2, 0, " ", "\n", "", "", "", "") + +///------------------------------------------------------------------------------------------------- +/// Abstract class of Matrix Classifier. +class IMatrixClassifier +{ +public: + //**************************** + //***** Static Functions ***** + //**************************** + /// Format the Matrix for XML Saving. + /// Matrix. + /// Stringstream. + /// True if it succeeds, False otherwise. + static bool convertMatrixToXMLFormat(const Eigen::MatrixXd& in, std::stringstream& out); + + /// Fill the Matrix From XML Format. + /// Stringstream. + /// Matrix. + /// Number of rows. + /// Number of cols. + /// True if it succeeds, False otherwise. + static bool convertXMLFormatToMatrix(std::stringstream& in, Eigen::MatrixXd& out, size_t rows, size_t cols); + + /// Saves matrix. + /// Matrix Node. + /// Matrix to save. + /// True if it succeeds, False otherwise. + static bool saveMatrix(tinyxml2::XMLElement* element, const Eigen::MatrixXd& matrix); + + /// Load matrix. + /// Matrix Node. + /// Matrix to load. + /// True if it succeeds, False otherwise. + static bool loadMatrix(tinyxml2::XMLElement* element, Eigen::MatrixXd& matrix); + + //*********************** + //***** Constructor ***** + //*********************** + /// Default constructor. Initializes a new instance of the class. + IMatrixClassifier() = default; + + /// Default Copy constructor. Initializes a new instance of the class. + /// Initial object. + IMatrixClassifier(const IMatrixClassifier& obj) { *this = obj; } + + /// Initializes a new instance of the class and set members. + /// The number of classes. + /// Metric to use to calculate means (see also ). + explicit IMatrixClassifier(size_t nbClass, EMetric metric); + + /// Finalizes an instance of the class. + virtual ~IMatrixClassifier() = default; + + //********************** + //***** Classifier ***** + //********************** + virtual size_t getClassCount() const { return m_nbClass; } ///< Get the class count. + virtual void setClassCount(size_t nbClass); ///< Set the class count. + + /// Train the classifier with the dataset. + /// The dataset (first dimension is the classes, second dimension is the trials as covariance matrix). + /// True if it succeeds, False otherwise. + virtual bool train(const std::vector>& dataset) = 0; + + /// Classify the matrix and return the class id (override of same function with all argument). + /// The sample to classify. + /// The predicted class. + /// Adaptation method for the classfier . + /// The expected class id if supervised adaptation. + /// True if it succeeds, False otherwise. + /// + virtual bool classify(const Eigen::MatrixXd& sample, size_t& classId, + EAdaptations adaptation = EAdaptations::None, const size_t& realClassId = std::numeric_limits::max()); + + /// Classify the matrix and return the class id, the distance and the probability of each class. + /// The sample to classify. + /// The predicted class. + /// The distance of the sample with each class. + /// The probability of the sample with each class. + /// Adaptation method for the classfier . + /// The expected class id if supervised adaptation. + /// True if it succeeds, False otherwise. + virtual bool classify(const Eigen::MatrixXd& sample, size_t& classId, std::vector& distance, std::vector& probability, + EAdaptations adaptation = EAdaptations::None, const size_t& realClassId = std::numeric_limits::max()) = 0; + + //*********************** + //***** XML Manager ***** + //*********************** + /// Saves the classifier information in an XML file. + /// Filename. + /// True if it succeeds, False otherwise. + virtual bool saveXML(const std::string& filename) const; + + /// Loads the classifier information from an XML file. + /// Filename. + /// True if it succeeds, False otherwise. + virtual bool loadXML(const std::string& filename); + + + //***************************** + //***** Override Operator ***** + //***************************** + + /// Check if object are equals (with a precision tolerance). + /// The second object. + /// Precision for matrix comparison. + /// True if the two elements are equals (with a precision tolerance). + bool isEqual(const IMatrixClassifier& obj, double precision = 1e-6) const; + + /// Copy object value. + /// The object to copy. + void copy(const IMatrixClassifier& obj); + + /// Get the type of the classifier. + /// The type in string. + virtual std::string getType() const = 0; + + /// Get the Classifier information for output. + /// The Classifier print in stringstream. + virtual std::stringstream print() const; + + /// Override the affectation operator. + /// The second object. + /// The copied object. + IMatrixClassifier& operator=(const IMatrixClassifier& obj) + { + copy(obj); + return *this; + } + + /// Override the equal operator. + /// The second object. + /// True if the two are equals. + bool operator==(const IMatrixClassifier& obj) const { return isEqual(obj); } + + /// Override the not equal operator. + /// The second object. + /// True if the two objects are diffrents. + bool operator!=(const IMatrixClassifier& obj) const { return !isEqual(obj); } + + /// Override the ostream operator. + /// The ostream. + /// The object. + /// Return the modified ostream. + friend std::ostream& operator <<(std::ostream& os, const IMatrixClassifier& obj) + { + os << obj.print().str(); + return os; + } + +protected: + /// Prints the header informations. + /// Header informations in stringstream. + virtual std::stringstream printHeader() const; + + /// Prints the Additional informations. + /// Additional informations in stringstream. + virtual std::stringstream printAdditional() const { return std::stringstream(); } + + /// Prints the Classes informations. + /// Classes informations in stringstream. + virtual std::stringstream printClasses() const { return std::stringstream(); } + + //*********************** + //***** XML Manager ***** + //*********************** + /// Add the attribute on the first node (general informations as classifier type, number of class...). + /// + /// -# The type of the classifier : + /// -# The number of classes : + /// -# The metric to use : + /// + /// Node to modify. + /// True if it succeeds, False otherwise. + virtual bool saveHeader(tinyxml2::XMLElement* data) const; + + /// Loads the attribute on the first node (general informations as classifier type, number of class...). + /// + /// -# Check the type : + /// -# The number of classes : + /// -# The metric to use : + /// + /// Node to read. + /// True if it succeeds, False otherwise. + virtual bool loadHeader(tinyxml2::XMLElement* data); + + /// Save Additionnal informations (none at this level). + /// True. + virtual bool saveAdditional(tinyxml2::XMLDocument& /*doc*/, tinyxml2::XMLElement* /*data*/) const { return true; } + + /// Load Additionnal informations (none at this level). + /// True. + virtual bool loadAdditional(tinyxml2::XMLElement* /*data*/) { return true; } + + /// Save Classes informations (none at this level). + /// True. + virtual bool saveClasses(tinyxml2::XMLDocument& /*doc*/, tinyxml2::XMLElement* /*data*/) const { return true; } + + /// Load Classes informations (none at this level). + /// True. + virtual bool loadClasses(tinyxml2::XMLElement* /*data*/) { return true; } + + + //********************* + //***** Variables ***** + //********************* + size_t m_nbClass = 2; ///< Number of classes to classify. + EMetric m_metric = EMetric::Riemann; ///< Metric to use to calculate means and distances (see also ). +}; + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/3rd-party/tinyxml2.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/3rd-party/tinyxml2.cpp new file mode 100644 index 0000000..fa24377 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/3rd-party/tinyxml2.cpp @@ -0,0 +1,2557 @@ +/* +Original code by Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#include "geometry/3rd-party/tinyxml2.h" + +#include // yes, this one new style header, is in the Android SDK. +#if defined(ANDROID_NDK) || defined(__BORLANDC__) || defined(__QNXNTO__) +# include +# include +#else +# include +# include +#endif + +#if defined(_MSC_VER) && (_MSC_VER >= 1400 ) && (!defined WINCE) +// Microsoft Visual Studio, version 2005 and higher. Not WinCE. +/*int _snprintf_s(char *buffer, size_t sizeOfBuffer, size_t count, const char *format [, argument] ... );*/ +static int TIXML_SNPRINTF(char* buffer, const size_t size, const char* format, ...) +{ + va_list va; + va_start(va, format); + const int result = vsnprintf_s(buffer, size, _TRUNCATE, format, va); + va_end(va); + return result; +} + +static int TIXML_VSNPRINTF(char* buffer, const size_t size, const char* format, va_list va) +{ + const int result = vsnprintf_s(buffer, size, _TRUNCATE, format, va); + return result; +} + +#define TIXML_VSCPRINTF _vscprintf +#define TIXML_SSCANF sscanf_s +#elif defined _MSC_VER +// Microsoft Visual Studio 2003 and earlier or WinCE +#define TIXML_SNPRINTF _snprintf +#define TIXML_VSNPRINTF _vsnprintf +#define TIXML_SSCANF sscanf +#if (_MSC_VER < 1400 ) && (!defined WINCE) + // Microsoft Visual Studio 2003 and not WinCE. +#define TIXML_VSCPRINTF _vscprintf // VS2003's C runtime has this, but VC6 C runtime or WinCE SDK doesn't have. +#else + // Microsoft Visual Studio 2003 and earlier or WinCE. +static inline int TIXML_VSCPRINTF(const char* format, va_list va) +{ + int len = 512; + for (;;) { + len = len * 2; + char* str = new char[len](); + const int required = _vsnprintf(str, len, format, va); + delete[] str; + if (required != -1) { + TIXMLASSERT(required >= 0); + len = required; + break; + } + } + TIXMLASSERT(len >= 0); + return len; +} +#endif +#else +// GCC version 3 and higher +//#warning( "Using sn* functions." ) +#define TIXML_SNPRINTF snprintf +#define TIXML_VSNPRINTF vsnprintf +static inline int TIXML_VSCPRINTF(const char* format, va_list va) +{ + int len = vsnprintf(0, 0, format, va); + TIXMLASSERT(len >= 0); + return len; +} +#define TIXML_SSCANF sscanf +#endif + + +static const char LINE_FEED = char(0x0a); // all line endings are normalized to LF +static const char LF = LINE_FEED; +static const char CARRIAGE_RETURN = char(0x0d); // CR gets filtered out +static const char CR = CARRIAGE_RETURN; +static const char SINGLE_QUOTE = '\''; +static const char DOUBLE_QUOTE = '\"'; + +// Bunch of unicode info at: +// http://www.unicode.org/faq/utf_bom.html +// ef bb bf (Microsoft "lead bytes") - designates UTF-8 + +static const unsigned char TIXML_UTF_LEAD_0 = 0xefU; +static const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; +static const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; + +namespace tinyxml2 { +struct Entity +{ + const char* pattern; + int length; + char value; +}; + +static const int NUM_ENTITIES = 5; +static const Entity ENTITIES[NUM_ENTITIES] = { + { "quot", 4, DOUBLE_QUOTE }, + { "amp", 3, '&' }, + { "apos", 4, SINGLE_QUOTE }, + { "lt", 2, '<' }, + { "gt", 2, '>' } +}; + + +StrPair::~StrPair() { Reset(); } + + +void StrPair::TransferTo(StrPair* other) +{ + if (this == other) { return; } + // This in effect implements the assignment operator by "moving" + // ownership (as in auto_ptr). + + TIXMLASSERT(other != nullptr); + TIXMLASSERT(other->_flags == 0); + TIXMLASSERT(other->_start == nullptr); + TIXMLASSERT(other->_end == nullptr); + + other->Reset(); + + other->_flags = _flags; + other->_start = _start; + other->_end = _end; + + _flags = 0; + _start = nullptr; + _end = nullptr; +} + + +void StrPair::Reset() +{ + if (_flags & NEEDS_DELETE) { delete[] _start; } + _flags = 0; + _start = nullptr; + _end = nullptr; +} + + +void StrPair::SetStr(const char* str, const int flags) +{ + TIXMLASSERT(str); + Reset(); + const size_t len = strlen(str); + TIXMLASSERT(_start == nullptr); + _start = new char[len + 1]; + memcpy(_start, str, len + 1); + _end = _start + len; + _flags = flags | NEEDS_DELETE; +} + + +char* StrPair::ParseText(char* in, const char* endTag, const int strFlags, int* curLineNumPtr) +{ + TIXMLASSERT(in); + TIXMLASSERT(endTag && *endTag); + TIXMLASSERT(curLineNumPtr); + + char* start = in; + const char endChar = *endTag; + const size_t length = strlen(endTag); + + // Inner loop of text parsing. + while (*in) + { + if (*in == endChar && strncmp(in, endTag, length) == 0) + { + Set(start, in, strFlags); + return in + length; + } + if (*in == '\n') { ++(*curLineNumPtr); } + ++in; + TIXMLASSERT(in); + } + return nullptr; +} + + +char* StrPair::ParseName(char* in) +{ + if (!in || !(*in) || !XMLUtil::IsNameStartChar(*in)) { return nullptr; } + + char* const start = in; + ++in; + while (*in && XMLUtil::IsNameChar(*in)) { ++in; } + + Set(start, in, 0); + return in; +} + + +void StrPair::CollapseWhitespace() +{ + // Adjusting _start would cause undefined behavior on delete[] + TIXMLASSERT((_flags & NEEDS_DELETE) == 0); + // Trim leading space. + _start = XMLUtil::SkipWhiteSpace(_start, nullptr); + + if (*_start) + { + const char* p = _start; // the read pointer + char* q = _start; // the write pointer + + while (*p) + { + if (XMLUtil::IsWhiteSpace(*p)) + { + p = XMLUtil::SkipWhiteSpace(p, nullptr); + if (*p == 0) + { + break; // don't write to q; this trims the trailing space. + } + *q = ' '; + ++q; + } + *q = *p; + ++q; + ++p; + } + *q = 0; + } +} + + +const char* StrPair::GetStr() +{ + TIXMLASSERT(_start); + TIXMLASSERT(_end); + if (_flags & NEEDS_FLUSH) + { + *_end = 0; + _flags ^= NEEDS_FLUSH; + + if (_flags) + { + const char* p = _start; // the read pointer + char* q = _start; // the write pointer + + while (p < _end) + { + if ((_flags & NEEDS_NEWLINE_NORMALIZATION) && *p == CR) + { + // CR-LF pair becomes LF + // CR alone becomes LF + // LF-CR becomes LF + if (*(p + 1) == LF) { p += 2; } + else { ++p; } + *q = LF; + ++q; + } + else if ((_flags & NEEDS_NEWLINE_NORMALIZATION) && *p == LF) + { + if (*(p + 1) == CR) { p += 2; } + else { ++p; } + *q = LF; + ++q; + } + else if ((_flags & NEEDS_ENTITY_PROCESSING) && *p == '&') + { + // Entities handled by tinyXML2: + // - special entities in the entity table [in/out] + // - numeric character reference [in] + // 中 or 中 + + if (*(p + 1) == '#') + { + const int buflen = 10; + char buf[buflen] = { 0 }; + int len = 0; + char* adjusted = const_cast(XMLUtil::GetCharacterRef(p, buf, &len)); + if (adjusted == nullptr) + { + *q = *p; + ++p; + ++q; + } + else + { + TIXMLASSERT(0 <= len && len <= buflen); + TIXMLASSERT(q + len <= adjusted); + p = adjusted; + memcpy(q, buf, len); + q += len; + } + } + else + { + bool entityFound = false; + for (int i = 0; i < NUM_ENTITIES; ++i) + { + const Entity& entity = ENTITIES[i]; + if (strncmp(p + 1, entity.pattern, entity.length) == 0 + && *(p + entity.length + 1) == ';') + { + // Found an entity - convert. + *q = entity.value; + ++q; + p += entity.length + 2; + entityFound = true; + break; + } + } + if (!entityFound) + { + // fixme: treat as error? + ++p; + ++q; + } + } + } + else + { + *q = *p; + ++p; + ++q; + } + } + *q = 0; + } + // The loop below has plenty going on, and this + // is a less useful mode. Break it out. + if (_flags & NEEDS_WHITESPACE_COLLAPSING) { CollapseWhitespace(); } + _flags = (_flags & NEEDS_DELETE); + } + TIXMLASSERT(_start); + return _start; +} + + +// --------- XMLUtil ----------- // + +const char* XMLUtil::writeBoolTrue = "true"; +const char* XMLUtil::writeBoolFalse = "false"; + +void XMLUtil::SetBoolSerialization(const char* writeTrue, const char* writeFalse) +{ + static const char* defTrue = "true"; + static const char* defFalse = "false"; + + writeBoolTrue = (writeTrue) ? writeTrue : defTrue; + writeBoolFalse = (writeFalse) ? writeFalse : defFalse; +} + + +const char* XMLUtil::ReadBOM(const char* p, bool* bom) +{ + TIXMLASSERT(p); + TIXMLASSERT(bom); + *bom = false; + const unsigned char* pu = reinterpret_cast(p); + // Check for BOM: + if (*(pu + 0) == TIXML_UTF_LEAD_0 + && *(pu + 1) == TIXML_UTF_LEAD_1 + && *(pu + 2) == TIXML_UTF_LEAD_2) + { + *bom = true; + p += 3; + } + TIXMLASSERT(p); + return p; +} + + +void XMLUtil::ConvertUTF32ToUTF8(unsigned long input, char* output, int* length) +{ + const unsigned long BYTE_MASK = 0xBF; + const unsigned long BYTE_MARK = 0x80; + const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + + if (input < 0x80) { *length = 1; } + else if (input < 0x800) { *length = 2; } + else if (input < 0x10000) { *length = 3; } + else if (input < 0x200000) { *length = 4; } + else + { + *length = 0; // This code won't convert this correctly anyway. + return; + } + + output += *length; + + // Scary scary fall throughs are annotated with carefully designed comments + // to suppress compiler warnings such as -Wimplicit-fallthrough in gcc + switch (*length) + { + case 4: + --output; + *output = char((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + //fall through + case 3: + --output; + *output = char((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + //fall through + case 2: + --output; + *output = char((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + //fall through + case 1: + --output; + *output = char(input | FIRST_BYTE_MARK[*length]); + break; + default: + TIXMLASSERT(false); + } +} + + +const char* XMLUtil::GetCharacterRef(const char* p, char* value, int* length) +{ + // Presume an entity, and pull it out. + *length = 0; + + if (*(p + 1) == '#' && *(p + 2)) + { + unsigned long ucs = 0; + TIXMLASSERT(sizeof(ucs) >= 4); + ptrdiff_t delta; + unsigned mult = 1; + static const char SEMICOLON = ';'; + + if (*(p + 2) == 'x') + { + // Hexadecimal. + const char* q = p + 3; + if (!(*q)) { return nullptr; } + + q = strchr(q, SEMICOLON); + + if (!q) { return nullptr; } + TIXMLASSERT(*q == SEMICOLON); + + delta = q - p; + --q; + + while (*q != 'x') + { + unsigned int digit; + if (*q >= '0' && *q <= '9') { digit = *q - '0'; } + else if (*q >= 'a' && *q <= 'f') { digit = *q - 'a' + 10; } + else if (*q >= 'A' && *q <= 'F') { digit = *q - 'A' + 10; } + else { return nullptr; } + TIXMLASSERT(digit < 16); + TIXMLASSERT(digit == 0 || mult <= UINT_MAX / digit); + const unsigned int digitScaled = mult * digit; + TIXMLASSERT(ucs <= ULONG_MAX - digitScaled); + ucs += digitScaled; + TIXMLASSERT(mult <= UINT_MAX / 16); + mult *= 16; + --q; + } + } + else + { + // Decimal. + const char* q = p + 2; + if (!(*q)) { return nullptr; } + + q = strchr(q, SEMICOLON); + + if (!q) { return nullptr; } + TIXMLASSERT(*q == SEMICOLON); + + delta = q - p; + --q; + + while (*q != '#') + { + if (*q >= '0' && *q <= '9') + { + const unsigned int digit = *q - '0'; + TIXMLASSERT(digit < 10); + TIXMLASSERT(digit == 0 || mult <= UINT_MAX / digit); + const unsigned int digitScaled = mult * digit; + TIXMLASSERT(ucs <= ULONG_MAX - digitScaled); + ucs += digitScaled; + } + else { return nullptr; } + TIXMLASSERT(mult <= UINT_MAX / 10); + mult *= 10; + --q; + } + } + // convert the UCS to UTF-8 + ConvertUTF32ToUTF8(ucs, value, length); + return p + delta + 1; + } + return p + 1; +} + + +void XMLUtil::ToStr(const int value, char* buffer, const int size) { TIXML_SNPRINTF(buffer, size, "%d", value); } + +void XMLUtil::ToStr(const unsigned value, char* buffer, const int size) { TIXML_SNPRINTF(buffer, size, "%u", value); } + +void XMLUtil::ToStr(const bool value, char* buffer, const int size) { TIXML_SNPRINTF(buffer, size, "%s", value ? writeBoolTrue : writeBoolFalse); } + +/* + ToStr() of a number is a very tricky topic. + https://github.com/leethomason/tinyxml2/issues/106 +*/ +void XMLUtil::ToStr(const float value, char* buffer, const int size) { TIXML_SNPRINTF(buffer, size, "%.8g", value); } + + +void XMLUtil::ToStr(const double value, char* buffer, const int size) { TIXML_SNPRINTF(buffer, size, "%.17g", value); } + + +void XMLUtil::ToStr(const int64_t value, char* buffer, const int size) +{ + // horrible syntax trick to make the compiler happy about %lld + TIXML_SNPRINTF(buffer, size, "%lld", static_cast(value)); +} + + +bool XMLUtil::ToInt(const char* str, int* value) +{ + if (TIXML_SSCANF(str, "%d", value) == 1) { return true; } + return false; +} + +bool XMLUtil::ToUnsigned(const char* str, unsigned* value) +{ + if (TIXML_SSCANF(str, "%u", value) == 1) { return true; } + return false; +} + +bool XMLUtil::ToBool(const char* str, bool* value) +{ + int ival = 0; + if (ToInt(str, &ival)) + { + *value = ival != 0; + return true; + } + if (StringEqual(str, "true")) + { + *value = true; + return true; + } + if (StringEqual(str, "false")) + { + *value = false; + return true; + } + return false; +} + + +bool XMLUtil::ToFloat(const char* str, float* value) +{ + if (TIXML_SSCANF(str, "%f", value) == 1) { return true; } + return false; +} + + +bool XMLUtil::ToDouble(const char* str, double* value) +{ + if (TIXML_SSCANF(str, "%lf", value) == 1) { return true; } + return false; +} + + +bool XMLUtil::ToInt64(const char* str, int64_t* value) +{ + long long v = 0; // horrible syntax trick to make the compiler happy about %lld + if (TIXML_SSCANF(str, "%lld", &v) == 1) + { + *value = int64_t(v); + return true; + } + return false; +} + + +char* XMLDocument::Identify(char* p, XMLNode** node) +{ + TIXMLASSERT(node); + TIXMLASSERT(p); + char* const start = p; + int const startLine = _parseCurLineNum; + p = XMLUtil::SkipWhiteSpace(p, &_parseCurLineNum); + if (!*p) + { + *node = nullptr; + TIXMLASSERT(p); + return p; + } + + // These strings define the matching patterns: + static const char* xmlHeader = { "(_commentPool); + returnNode->_parseLineNum = _parseCurLineNum; + p += xmlHeaderLen; + } + else if (XMLUtil::StringEqual(p, commentHeader, commentHeaderLen)) + { + returnNode = CreateUnlinkedNode(_commentPool); + returnNode->_parseLineNum = _parseCurLineNum; + p += commentHeaderLen; + } + else if (XMLUtil::StringEqual(p, cdataHeader, cdataHeaderLen)) + { + XMLText* text = CreateUnlinkedNode(_textPool); + returnNode = text; + returnNode->_parseLineNum = _parseCurLineNum; + p += cdataHeaderLen; + text->SetCData(true); + } + else if (XMLUtil::StringEqual(p, dtdHeader, dtdHeaderLen)) + { + returnNode = CreateUnlinkedNode(_commentPool); + returnNode->_parseLineNum = _parseCurLineNum; + p += dtdHeaderLen; + } + else if (XMLUtil::StringEqual(p, elementHeader, elementHeaderLen)) + { + returnNode = CreateUnlinkedNode(_elementPool); + returnNode->_parseLineNum = _parseCurLineNum; + p += elementHeaderLen; + } + else + { + returnNode = CreateUnlinkedNode(_textPool); + returnNode->_parseLineNum = _parseCurLineNum; // Report line of first non-whitespace character + p = start; // Back it up, all the text counts. + _parseCurLineNum = startLine; + } + + TIXMLASSERT(returnNode); + TIXMLASSERT(p); + *node = returnNode; + return p; +} + + +bool XMLDocument::Accept(XMLVisitor* visitor) const +{ + TIXMLASSERT(visitor); + if (visitor->VisitEnter(*this)) { for (const XMLNode* node = FirstChild(); node; node = node->NextSibling()) { if (!node->Accept(visitor)) { break; } } } + return visitor->VisitExit(*this); +} + + +// --------- XMLNode ----------- // + +XMLNode::XMLNode(XMLDocument* doc) : _document(doc), + _memPool(nullptr) { } + + +XMLNode::~XMLNode() +{ + DeleteChildren(); + if (_parent) { _parent->Unlink(this); } +} + +const char* XMLNode::Value() const +{ + // Edge case: XMLDocuments don't have a Value. Return null. + if (this->ToDocument()) { return nullptr; } + return _value.GetStr(); +} + +void XMLNode::SetValue(const char* val, const bool staticMem) +{ + if (staticMem) { _value.SetInternedStr(val); } + else { _value.SetStr(val); } +} + +XMLNode* XMLNode::DeepClone(XMLDocument* target) const +{ + XMLNode* clone = this->ShallowClone(target); + if (!clone) { return nullptr; } + + for (const XMLNode* child = this->FirstChild(); child; child = child->NextSibling()) + { + XMLNode* childClone = child->DeepClone(target); + TIXMLASSERT(childClone); + clone->InsertEndChild(childClone); + } + return clone; +} + +void XMLNode::DeleteChildren() +{ + while (_firstChild) + { + TIXMLASSERT(_lastChild); + DeleteChild(_firstChild); + } + _firstChild = _lastChild = nullptr; +} + + +void XMLNode::Unlink(XMLNode* child) +{ + TIXMLASSERT(child); + TIXMLASSERT(child->_document == _document); + TIXMLASSERT(child->_parent == this); + if (child == _firstChild) { _firstChild = _firstChild->_next; } + if (child == _lastChild) { _lastChild = _lastChild->_prev; } + + if (child->_prev) { child->_prev->_next = child->_next; } + if (child->_next) { child->_next->_prev = child->_prev; } + child->_next = nullptr; + child->_prev = nullptr; + child->_parent = nullptr; +} + + +void XMLNode::DeleteChild(XMLNode* node) +{ + TIXMLASSERT(node); + TIXMLASSERT(node->_document == _document); + TIXMLASSERT(node->_parent == this); + Unlink(node); + TIXMLASSERT(node->_prev == nullptr); + TIXMLASSERT(node->_next == nullptr); + TIXMLASSERT(node->_parent == nullptr); + DeleteNode(node); +} + + +XMLNode* XMLNode::InsertEndChild(XMLNode* addThis) +{ + TIXMLASSERT(addThis); + if (addThis->_document != _document) + { + TIXMLASSERT(false); + return nullptr; + } + InsertChildPreamble(addThis); + + if (_lastChild) + { + TIXMLASSERT(_firstChild); + TIXMLASSERT(_lastChild->_next == nullptr); + _lastChild->_next = addThis; + addThis->_prev = _lastChild; + _lastChild = addThis; + + addThis->_next = nullptr; + } + else + { + TIXMLASSERT(_firstChild == nullptr); + _firstChild = _lastChild = addThis; + + addThis->_prev = nullptr; + addThis->_next = nullptr; + } + addThis->_parent = this; + return addThis; +} + + +XMLNode* XMLNode::InsertFirstChild(XMLNode* addThis) +{ + TIXMLASSERT(addThis); + if (addThis->_document != _document) + { + TIXMLASSERT(false); + return nullptr; + } + InsertChildPreamble(addThis); + + if (_firstChild) + { + TIXMLASSERT(_lastChild); + TIXMLASSERT(_firstChild->_prev == nullptr); + + _firstChild->_prev = addThis; + addThis->_next = _firstChild; + _firstChild = addThis; + + addThis->_prev = nullptr; + } + else + { + TIXMLASSERT(_lastChild == nullptr); + _firstChild = _lastChild = addThis; + + addThis->_prev = nullptr; + addThis->_next = nullptr; + } + addThis->_parent = this; + return addThis; +} + + +XMLNode* XMLNode::InsertAfterChild(XMLNode* afterThis, XMLNode* addThis) +{ + TIXMLASSERT(addThis); + if (addThis->_document != _document) + { + TIXMLASSERT(false); + return nullptr; + } + + TIXMLASSERT(afterThis); + + if (afterThis->_parent != this) + { + TIXMLASSERT(false); + return nullptr; + } + if (afterThis == addThis) + { + // Current state: BeforeThis -> AddThis -> OneAfterAddThis + // Now AddThis must disappear from it's location and then + // reappear between BeforeThis and OneAfterAddThis. + // So just leave it where it is. + return addThis; + } + + if (afterThis->_next == nullptr) + { + // The last node or the only node. + return InsertEndChild(addThis); + } + InsertChildPreamble(addThis); + addThis->_prev = afterThis; + addThis->_next = afterThis->_next; + afterThis->_next->_prev = addThis; + afterThis->_next = addThis; + addThis->_parent = this; + return addThis; +} + + +const XMLElement* XMLNode::FirstChildElement(const char* name) const +{ + for (const XMLNode* node = _firstChild; node; node = node->_next) + { + const XMLElement* element = node->ToElementWithName(name); + if (element) { return element; } + } + return nullptr; +} + + +const XMLElement* XMLNode::LastChildElement(const char* name) const +{ + for (const XMLNode* node = _lastChild; node; node = node->_prev) + { + const XMLElement* element = node->ToElementWithName(name); + if (element) { return element; } + } + return nullptr; +} + + +const XMLElement* XMLNode::NextSiblingElement(const char* name) const +{ + for (const XMLNode* node = _next; node; node = node->_next) + { + const XMLElement* element = node->ToElementWithName(name); + if (element) { return element; } + } + return nullptr; +} + + +const XMLElement* XMLNode::PreviousSiblingElement(const char* name) const +{ + for (const XMLNode* node = _prev; node; node = node->_prev) + { + const XMLElement* element = node->ToElementWithName(name); + if (element) { return element; } + } + return nullptr; +} + + +char* XMLNode::ParseDeep(char* p, StrPair* parentEndTag, int* curLineNumPtr) +{ + // This is a recursive method, but thinking about it "at the current level" + // it is a pretty simple flat list: + // + // + // + // With a special case: + // + // + // + // + // Where the closing element (/foo) *must* be the next thing after the opening + // element, and the names must match. BUT the tricky bit is that the closing + // element will be read by the child. + // + // 'endTag' is the end tag for this node, it is returned by a call to a child. + // 'parentEnd' is the end tag for the parent, which is filled in and returned. + + XMLDocument::DepthTracker tracker(_document); + if (_document->Error()) { return nullptr; } + + while (p && *p) + { + XMLNode* node = nullptr; + + p = _document->Identify(p, &node); + TIXMLASSERT(p); + if (node == nullptr) { break; } + + const int initialLineNum = node->_parseLineNum; + + StrPair endTag; + p = node->ParseDeep(p, &endTag, curLineNumPtr); + if (!p) + { + DeleteNode(node); + if (!_document->Error()) { _document->SetError(XML_ERROR_PARSING, initialLineNum, nullptr); } + break; + } + + XMLDeclaration* decl = node->ToDeclaration(); + if (decl) + { + // Declarations are only allowed at document level + // + // Multiple declarations are allowed but all declarations + // must occur before anything else. + // + // Optimized due to a security test case. If the first node is + // a declaration, and the last node is a declaration, then only + // declarations have so far been addded. + bool wellLocated = false; + + if (ToDocument()) + { + if (FirstChild()) { wellLocated = FirstChild() && FirstChild()->ToDeclaration() && LastChild() && LastChild()->ToDeclaration(); } + else { wellLocated = true; } + } + if (!wellLocated) + { + _document->SetError(XML_ERROR_PARSING_DECLARATION, initialLineNum, "XMLDeclaration value=%s", decl->Value()); + DeleteNode(node); + break; + } + } + + XMLElement* ele = node->ToElement(); + if (ele) + { + // We read the end tag. Return it to the parent. + if (ele->ClosingType() == XMLElement::CLOSING) + { + if (parentEndTag) { ele->_value.TransferTo(parentEndTag); } + node->_memPool->SetTracked(); // created and then immediately deleted. + DeleteNode(node); + return p; + } + + // Handle an end tag returned to this level. + // And handle a bunch of annoying errors. + bool mismatch = false; + if (endTag.Empty()) { if (ele->ClosingType() == XMLElement::OPEN) { mismatch = true; } } + else + { + if (ele->ClosingType() != XMLElement::OPEN) { mismatch = true; } + else if (!XMLUtil::StringEqual(endTag.GetStr(), ele->Name())) { mismatch = true; } + } + if (mismatch) + { + _document->SetError(XML_ERROR_MISMATCHED_ELEMENT, initialLineNum, "XMLElement name=%s", ele->Name()); + DeleteNode(node); + break; + } + } + InsertEndChild(node); + } + return nullptr; +} + +/*static*/ +void XMLNode::DeleteNode(XMLNode* node) +{ + if (node == nullptr) { return; } + TIXMLASSERT(node->_document); + if (!node->ToDocument()) { node->_document->MarkInUse(node); } + + MemPool* pool = node->_memPool; + node->~XMLNode(); + pool->Free(node); +} + +void XMLNode::InsertChildPreamble(XMLNode* insertThis) const +{ + TIXMLASSERT(insertThis); + TIXMLASSERT(insertThis->_document == _document); + + if (insertThis->_parent) { insertThis->_parent->Unlink(insertThis); } + else + { + insertThis->_document->MarkInUse(insertThis); + insertThis->_memPool->SetTracked(); + } +} + +const XMLElement* XMLNode::ToElementWithName(const char* name) const +{ + const XMLElement* element = this->ToElement(); + if (element == nullptr) { return nullptr; } + if (name == nullptr) { return element; } + if (XMLUtil::StringEqual(element->Name(), name)) { return element; } + return nullptr; +} + +// --------- XMLText ---------- // +char* XMLText::ParseDeep(char* p, StrPair* /*parentEndTag*/, int* curLineNumPtr) +{ + if (this->CData()) + { + p = _value.ParseText(p, "]]>", StrPair::NEEDS_NEWLINE_NORMALIZATION, curLineNumPtr); + if (!p) { _document->SetError(XML_ERROR_PARSING_CDATA, _parseLineNum, nullptr); } + return p; + } + int flags = _document->ProcessEntities() ? StrPair::TEXT_ELEMENT : StrPair::TEXT_ELEMENT_LEAVE_ENTITIES; + if (_document->WhitespaceMode() == COLLAPSE_WHITESPACE) { flags |= StrPair::NEEDS_WHITESPACE_COLLAPSING; } + + p = _value.ParseText(p, "<", flags, curLineNumPtr); + if (p && *p) { return p - 1; } + if (!p) { _document->SetError(XML_ERROR_PARSING_TEXT, _parseLineNum, nullptr); } + return nullptr; +} + + +XMLNode* XMLText::ShallowClone(XMLDocument* doc) const +{ + if (!doc) { doc = _document; } + XMLText* text = doc->NewText(Value()); // fixme: this will always allocate memory. Intern? + text->SetCData(this->CData()); + return text; +} + + +bool XMLText::ShallowEqual(const XMLNode* compare) const +{ + TIXMLASSERT(compare); + const XMLText* text = compare->ToText(); + return (text && XMLUtil::StringEqual(text->Value(), Value())); +} + + +bool XMLText::Accept(XMLVisitor* visitor) const +{ + TIXMLASSERT(visitor); + return visitor->Visit(*this); +} + + +// --------- XMLComment ---------- // + +char* XMLComment::ParseDeep(char* p, StrPair* /*parentEndTag*/, int* curLineNumPtr) +{ + // Comment parses as text. + p = _value.ParseText(p, "-->", StrPair::COMMENT, curLineNumPtr); + if (p == nullptr) { _document->SetError(XML_ERROR_PARSING_COMMENT, _parseLineNum, nullptr); } + return p; +} + + +XMLNode* XMLComment::ShallowClone(XMLDocument* doc) const +{ + if (!doc) { doc = _document; } + XMLComment* comment = doc->NewComment(Value()); // fixme: this will always allocate memory. Intern? + return comment; +} + + +bool XMLComment::ShallowEqual(const XMLNode* compare) const +{ + TIXMLASSERT(compare); + const XMLComment* comment = compare->ToComment(); + return (comment && XMLUtil::StringEqual(comment->Value(), Value())); +} + + +bool XMLComment::Accept(XMLVisitor* visitor) const +{ + TIXMLASSERT(visitor); + return visitor->Visit(*this); +} + + +// --------- XMLDeclaration ---------- // + +char* XMLDeclaration::ParseDeep(char* p, StrPair* /*parentEndTag*/, int* curLineNumPtr) +{ + // Declaration parses as text. + p = _value.ParseText(p, "?>", StrPair::NEEDS_NEWLINE_NORMALIZATION, curLineNumPtr); + if (p == nullptr) { _document->SetError(XML_ERROR_PARSING_DECLARATION, _parseLineNum, nullptr); } + return p; +} + + +XMLNode* XMLDeclaration::ShallowClone(XMLDocument* doc) const +{ + if (!doc) { doc = _document; } + XMLDeclaration* dec = doc->NewDeclaration(Value()); // fixme: this will always allocate memory. Intern? + return dec; +} + + +bool XMLDeclaration::ShallowEqual(const XMLNode* compare) const +{ + TIXMLASSERT(compare); + const XMLDeclaration* declaration = compare->ToDeclaration(); + return (declaration && XMLUtil::StringEqual(declaration->Value(), Value())); +} + + +bool XMLDeclaration::Accept(XMLVisitor* visitor) const +{ + TIXMLASSERT(visitor); + return visitor->Visit(*this); +} + +// --------- XMLUnknown ---------- // + +char* XMLUnknown::ParseDeep(char* p, StrPair* /*parentEndTag*/, int* curLineNumPtr) +{ + // Unknown parses as text. + p = _value.ParseText(p, ">", StrPair::NEEDS_NEWLINE_NORMALIZATION, curLineNumPtr); + if (!p) { _document->SetError(XML_ERROR_PARSING_UNKNOWN, _parseLineNum, nullptr); } + return p; +} + + +XMLNode* XMLUnknown::ShallowClone(XMLDocument* doc) const +{ + if (!doc) { doc = _document; } + XMLUnknown* text = doc->NewUnknown(Value()); // fixme: this will always allocate memory. Intern? + return text; +} + + +bool XMLUnknown::ShallowEqual(const XMLNode* compare) const +{ + TIXMLASSERT(compare); + const XMLUnknown* unknown = compare->ToUnknown(); + return (unknown && XMLUtil::StringEqual(unknown->Value(), Value())); +} + + +bool XMLUnknown::Accept(XMLVisitor* visitor) const +{ + TIXMLASSERT(visitor); + return visitor->Visit(*this); +} + +// --------- XMLAttribute ---------- // + +char* XMLAttribute::ParseDeep(char* p, const bool processEntities, int* curLineNumPtr) +{ + // Parse using the name rules: bug fix, was using ParseText before + p = _name.ParseName(p); + if (!p || !*p) { return nullptr; } + + // Skip white space before = + p = XMLUtil::SkipWhiteSpace(p, curLineNumPtr); + if (*p != '=') { return nullptr; } + + ++p; // move up to opening quote + p = XMLUtil::SkipWhiteSpace(p, curLineNumPtr); + if (*p != '\"' && *p != '\'') { return nullptr; } + + char endTag[2] = { *p, 0 }; + ++p; // move past opening quote + + p = _value.ParseText(p, endTag, processEntities ? StrPair::ATTRIBUTE_VALUE : StrPair::ATTRIBUTE_VALUE_LEAVE_ENTITIES, curLineNumPtr); + return p; +} + + +XMLError XMLAttribute::QueryIntValue(int* value) const +{ + if (XMLUtil::ToInt(Value(), value)) { return XML_SUCCESS; } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryUnsignedValue(unsigned int* value) const +{ + if (XMLUtil::ToUnsigned(Value(), value)) { return XML_SUCCESS; } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryInt64Value(int64_t* value) const +{ + if (XMLUtil::ToInt64(Value(), value)) { return XML_SUCCESS; } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryBoolValue(bool* value) const +{ + if (XMLUtil::ToBool(Value(), value)) { return XML_SUCCESS; } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryFloatValue(float* value) const +{ + if (XMLUtil::ToFloat(Value(), value)) { return XML_SUCCESS; } + return XML_WRONG_ATTRIBUTE_TYPE; +} + + +XMLError XMLAttribute::QueryDoubleValue(double* value) const +{ + if (XMLUtil::ToDouble(Value(), value)) { return XML_SUCCESS; } + return XML_WRONG_ATTRIBUTE_TYPE; +} + +void XMLAttribute::SetAttribute(const int value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + _value.SetStr(buf); +} + + +void XMLAttribute::SetAttribute(const unsigned value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + _value.SetStr(buf); +} + + +void XMLAttribute::SetAttribute(const int64_t value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + _value.SetStr(buf); +} + + +void XMLAttribute::SetAttribute(const bool value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + _value.SetStr(buf); +} + +void XMLAttribute::SetAttribute(const double value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + _value.SetStr(buf); +} + +void XMLAttribute::SetAttribute(const float value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + _value.SetStr(buf); +} + + +// --------- XMLElement ---------- // + +XMLElement::~XMLElement() +{ + while (_rootAttribute) + { + XMLAttribute* next = _rootAttribute->_next; + DeleteAttribute(_rootAttribute); + _rootAttribute = next; + } +} + + +const XMLAttribute* XMLElement::FindAttribute(const char* name) const +{ + for (XMLAttribute* a = _rootAttribute; a; a = a->_next) { if (XMLUtil::StringEqual(a->Name(), name)) { return a; } } + return nullptr; +} + + +const char* XMLElement::Attribute(const char* name, const char* value) const +{ + const XMLAttribute* a = FindAttribute(name); + if (!a) { return nullptr; } + if (!value || XMLUtil::StringEqual(a->Value(), value)) { return a->Value(); } + return nullptr; +} + +int XMLElement::IntAttribute(const char* name, const int defaultValue) const +{ + int i = defaultValue; + QueryIntAttribute(name, &i); + return i; +} + +unsigned XMLElement::UnsignedAttribute(const char* name, const unsigned defaultValue) const +{ + unsigned i = defaultValue; + QueryUnsignedAttribute(name, &i); + return i; +} + +int64_t XMLElement::Int64Attribute(const char* name, const int64_t defaultValue) const +{ + int64_t i = defaultValue; + QueryInt64Attribute(name, &i); + return i; +} + +bool XMLElement::BoolAttribute(const char* name, const bool defaultValue) const +{ + bool b = defaultValue; + QueryBoolAttribute(name, &b); + return b; +} + +double XMLElement::DoubleAttribute(const char* name, const double defaultValue) const +{ + double d = defaultValue; + QueryDoubleAttribute(name, &d); + return d; +} + +float XMLElement::FloatAttribute(const char* name, const float defaultValue) const +{ + float f = defaultValue; + QueryFloatAttribute(name, &f); + return f; +} + +const char* XMLElement::GetText() const +{ + if (FirstChild() && FirstChild()->ToText()) { return FirstChild()->Value(); } + return nullptr; +} + + +void XMLElement::SetText(const char* inText) +{ + if (FirstChild() && FirstChild()->ToText()) { FirstChild()->SetValue(inText); } + else + { + XMLText* theText = GetDocument()->NewText(inText); + InsertFirstChild(theText); + } +} + + +void XMLElement::SetText(const int value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + SetText(buf); +} + + +void XMLElement::SetText(const unsigned value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + SetText(buf); +} + + +void XMLElement::SetText(const int64_t value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + SetText(buf); +} + + +void XMLElement::SetText(const bool value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + SetText(buf); +} + + +void XMLElement::SetText(const float value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + SetText(buf); +} + + +void XMLElement::SetText(const double value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + SetText(buf); +} + + +XMLError XMLElement::QueryIntText(int* val) const +{ + if (FirstChild() && FirstChild()->ToText()) + { + const char* t = FirstChild()->Value(); + if (XMLUtil::ToInt(t, val)) { return XML_SUCCESS; } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryUnsignedText(unsigned* val) const +{ + if (FirstChild() && FirstChild()->ToText()) + { + const char* t = FirstChild()->Value(); + if (XMLUtil::ToUnsigned(t, val)) { return XML_SUCCESS; } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryInt64Text(int64_t* val) const +{ + if (FirstChild() && FirstChild()->ToText()) + { + const char* t = FirstChild()->Value(); + if (XMLUtil::ToInt64(t, val)) { return XML_SUCCESS; } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryBoolText(bool* val) const +{ + if (FirstChild() && FirstChild()->ToText()) + { + const char* t = FirstChild()->Value(); + if (XMLUtil::ToBool(t, val)) { return XML_SUCCESS; } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryDoubleText(double* val) const +{ + if (FirstChild() && FirstChild()->ToText()) + { + const char* t = FirstChild()->Value(); + if (XMLUtil::ToDouble(t, val)) { return XML_SUCCESS; } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + + +XMLError XMLElement::QueryFloatText(float* val) const +{ + if (FirstChild() && FirstChild()->ToText()) + { + const char* t = FirstChild()->Value(); + if (XMLUtil::ToFloat(t, val)) { return XML_SUCCESS; } + return XML_CAN_NOT_CONVERT_TEXT; + } + return XML_NO_TEXT_NODE; +} + +int XMLElement::IntText(const int defaultValue) const +{ + int i = defaultValue; + QueryIntText(&i); + return i; +} + +unsigned XMLElement::UnsignedText(const unsigned defaultValue) const +{ + unsigned i = defaultValue; + QueryUnsignedText(&i); + return i; +} + +int64_t XMLElement::Int64Text(const int64_t defaultValue) const +{ + int64_t i = defaultValue; + QueryInt64Text(&i); + return i; +} + +bool XMLElement::BoolText(const bool defaultValue) const +{ + bool b = defaultValue; + QueryBoolText(&b); + return b; +} + +double XMLElement::DoubleText(const double defaultValue) const +{ + double d = defaultValue; + QueryDoubleText(&d); + return d; +} + +float XMLElement::FloatText(const float defaultValue) const +{ + float f = defaultValue; + QueryFloatText(&f); + return f; +} + + +XMLAttribute* XMLElement::FindOrCreateAttribute(const char* name) +{ + XMLAttribute* last = nullptr; + XMLAttribute* attrib = _rootAttribute; + for (; attrib; last = attrib, attrib = attrib->_next) { if (XMLUtil::StringEqual(attrib->Name(), name)) { break; } } + if (!attrib) + { + attrib = CreateAttribute(); + TIXMLASSERT(attrib); + if (last) + { + TIXMLASSERT(last->_next == nullptr); + last->_next = attrib; + } + else + { + TIXMLASSERT(_rootAttribute == nullptr); + _rootAttribute = attrib; + } + attrib->SetName(name); + } + return attrib; +} + + +void XMLElement::DeleteAttribute(const char* name) +{ + XMLAttribute* prev = nullptr; + for (XMLAttribute* a = _rootAttribute; a; a = a->_next) + { + if (XMLUtil::StringEqual(name, a->Name())) + { + if (prev) { prev->_next = a->_next; } + else { _rootAttribute = a->_next; } + DeleteAttribute(a); + break; + } + prev = a; + } +} + + +char* XMLElement::ParseAttributes(char* p, int* curLineNumPtr) +{ + XMLAttribute* prevAttribute = nullptr; + + // Read the attributes. + while (p) + { + p = XMLUtil::SkipWhiteSpace(p, curLineNumPtr); + if (!(*p)) + { + _document->SetError(XML_ERROR_PARSING_ELEMENT, _parseLineNum, "XMLElement name=%s", Name()); + return nullptr; + } + + // attribute. + if (XMLUtil::IsNameStartChar(*p)) + { + XMLAttribute* attrib = CreateAttribute(); + TIXMLASSERT(attrib); + attrib->_parseLineNum = _document->_parseCurLineNum; + + const int attrLineNum = attrib->_parseLineNum; + + p = attrib->ParseDeep(p, _document->ProcessEntities(), curLineNumPtr); + if (!p || Attribute(attrib->Name())) + { + DeleteAttribute(attrib); + _document->SetError(XML_ERROR_PARSING_ATTRIBUTE, attrLineNum, "XMLElement name=%s", Name()); + return nullptr; + } + // There is a minor bug here: if the attribute in the source xml + // document is duplicated, it will not be detected and the + // attribute will be doubly added. However, tracking the 'prevAttribute' + // avoids re-scanning the attribute list. Preferring performance for + // now, may reconsider in the future. + if (prevAttribute) + { + TIXMLASSERT(prevAttribute->_next == nullptr); + prevAttribute->_next = attrib; + } + else + { + TIXMLASSERT(_rootAttribute == nullptr); + _rootAttribute = attrib; + } + prevAttribute = attrib; + } + // end of the tag + else if (*p == '>') + { + ++p; + break; + } + // end of the tag + else if (*p == '/' && *(p + 1) == '>') + { + _closingType = CLOSED; + return p + 2; // done; sealed element. + } + else + { + _document->SetError(XML_ERROR_PARSING_ELEMENT, _parseLineNum, nullptr); + return nullptr; + } + } + return p; +} + +void XMLElement::DeleteAttribute(XMLAttribute* attribute) +{ + if (attribute == nullptr) { return; } + MemPool* pool = attribute->_memPool; + attribute->~XMLAttribute(); + pool->Free(attribute); +} + +XMLAttribute* XMLElement::CreateAttribute() +{ + TIXMLASSERT(sizeof(XMLAttribute) == _document->_attributePool.ItemSize()); + XMLAttribute* attrib = new(_document->_attributePool.Alloc()) XMLAttribute(); + TIXMLASSERT(attrib); + attrib->_memPool = &_document->_attributePool; + attrib->_memPool->SetTracked(); + return attrib; +} + +// +// +// foobar +// +char* XMLElement::ParseDeep(char* p, StrPair* parentEndTag, int* curLineNumPtr) +{ + // Read the element name. + p = XMLUtil::SkipWhiteSpace(p, curLineNumPtr); + + // The closing element is the form. It is + // parsed just like a regular element then deleted from + // the DOM. + if (*p == '/') + { + _closingType = CLOSING; + ++p; + } + + p = _value.ParseName(p); + if (_value.Empty()) { return nullptr; } + + p = ParseAttributes(p, curLineNumPtr); + if (!p || !*p || _closingType != OPEN) { return p; } + + p = XMLNode::ParseDeep(p, parentEndTag, curLineNumPtr); + return p; +} + + +XMLNode* XMLElement::ShallowClone(XMLDocument* doc) const +{ + if (!doc) { doc = _document; } + XMLElement* element = doc->NewElement(Value()); // fixme: this will always allocate memory. Intern? + for (const XMLAttribute* a = FirstAttribute(); a; a = a->Next()) + { + element->SetAttribute(a->Name(), a->Value()); // fixme: this will always allocate memory. Intern? + } + return element; +} + + +bool XMLElement::ShallowEqual(const XMLNode* compare) const +{ + TIXMLASSERT(compare); + const XMLElement* other = compare->ToElement(); + if (other && XMLUtil::StringEqual(other->Name(), Name())) + { + const XMLAttribute* a = FirstAttribute(); + const XMLAttribute* b = other->FirstAttribute(); + + while (a && b) + { + if (!XMLUtil::StringEqual(a->Value(), b->Value())) { return false; } + a = a->Next(); + b = b->Next(); + } + return !(a || b); // different count + } + return false; +} + + +bool XMLElement::Accept(XMLVisitor* visitor) const +{ + TIXMLASSERT(visitor); + if (visitor->VisitEnter(*this, _rootAttribute)) + { + for (const XMLNode* node = FirstChild(); node; node = node->NextSibling()) { if (!node->Accept(visitor)) { break; } } + } + return visitor->VisitExit(*this); +} + + +// --------- XMLDocument ----------- // + +// Warning: List must match 'enum XMLError' +const char* XMLDocument::_errorNames[XML_ERROR_COUNT] = { + "XML_SUCCESS", + "XML_NO_ATTRIBUTE", + "XML_WRONG_ATTRIBUTE_TYPE", + "XML_ERROR_FILE_NOT_FOUND", + "XML_ERROR_FILE_COULD_NOT_BE_OPENED", + "XML_ERROR_FILE_READ_ERROR", + "XML_ERROR_PARSING_ELEMENT", + "XML_ERROR_PARSING_ATTRIBUTE", + "XML_ERROR_PARSING_TEXT", + "XML_ERROR_PARSING_CDATA", + "XML_ERROR_PARSING_COMMENT", + "XML_ERROR_PARSING_DECLARATION", + "XML_ERROR_PARSING_UNKNOWN", + "XML_ERROR_EMPTY_DOCUMENT", + "XML_ERROR_MISMATCHED_ELEMENT", + "XML_ERROR_PARSING", + "XML_CAN_NOT_CONVERT_TEXT", + "XML_NO_TEXT_NODE", + "XML_ELEMENT_DEPTH_EXCEEDED" +}; + + +XMLDocument::XMLDocument(bool processEntities, Whitespace whitespaceMode) : XMLNode(nullptr), _processEntities(processEntities), + _whitespaceMode(whitespaceMode) +{ + // avoid VC++ C4355 warning about 'this' in initializer list (C4355 is off by default in VS2012+) + _document = this; +} + + +XMLDocument::~XMLDocument() { Clear(); } + + +void XMLDocument::MarkInUse(XMLNode* node) +{ + TIXMLASSERT(node); + TIXMLASSERT(node->_parent == nullptr); + + for (int i = 0; i < _unlinked.Size(); ++i) + { + if (node == _unlinked[i]) + { + _unlinked.SwapRemove(i); + break; + } + } +} + +void XMLDocument::Clear() +{ + DeleteChildren(); + while (_unlinked.Size()) { DeleteNode(_unlinked[0]); } // Will remove from _unlinked as part of delete. + +#ifdef TINYXML2_DEBUG + const bool hadError = Error(); +#endif + ClearError(); + + delete[] _charBuffer; + _charBuffer = nullptr; + _parsingDepth = 0; + +#if 0 + _textPool.Trace("text"); + _elementPool.Trace("element"); + _commentPool.Trace("comment"); + _attributePool.Trace("attribute"); +#endif + +#ifdef TINYXML2_DEBUG + if (!hadError) + { + TIXMLASSERT(_elementPool.CurrentAllocs() == _elementPool.Untracked()); + TIXMLASSERT(_attributePool.CurrentAllocs() == _attributePool.Untracked()); + TIXMLASSERT(_textPool.CurrentAllocs() == _textPool.Untracked()); + TIXMLASSERT(_commentPool.CurrentAllocs() == _commentPool.Untracked()); + } +#endif +} + + +void XMLDocument::DeepCopy(XMLDocument* target) const +{ + TIXMLASSERT(target); + if (target == this) { return; } // technically success - a no-op. + + target->Clear(); + for (const XMLNode* node = this->FirstChild(); node; node = node->NextSibling()) { target->InsertEndChild(node->DeepClone(target)); } +} + +XMLElement* XMLDocument::NewElement(const char* name) +{ + XMLElement* ele = CreateUnlinkedNode(_elementPool); + ele->SetName(name); + return ele; +} + + +XMLComment* XMLDocument::NewComment(const char* str) +{ + XMLComment* comment = CreateUnlinkedNode(_commentPool); + comment->SetValue(str); + return comment; +} + + +XMLText* XMLDocument::NewText(const char* str) +{ + XMLText* text = CreateUnlinkedNode(_textPool); + text->SetValue(str); + return text; +} + + +XMLDeclaration* XMLDocument::NewDeclaration(const char* str) +{ + XMLDeclaration* dec = CreateUnlinkedNode(_commentPool); + dec->SetValue(str ? str : "xml version=\"1.0\" encoding=\"UTF-8\""); + return dec; +} + + +XMLUnknown* XMLDocument::NewUnknown(const char* str) +{ + XMLUnknown* unk = CreateUnlinkedNode(_commentPool); + unk->SetValue(str); + return unk; +} + +static FILE* callfopen(const char* filepath, const char* mode) +{ + TIXMLASSERT(filepath); + TIXMLASSERT(mode); +#if defined(_MSC_VER) && (_MSC_VER >= 1400 ) && (!defined WINCE) + FILE* fp = nullptr; + const errno_t err = fopen_s(&fp, filepath, mode); + if (err) { return nullptr; } +#else + FILE* fp = fopen(filepath, mode); +#endif + return fp; +} + +void XMLDocument::DeleteNode(XMLNode* node) +{ + TIXMLASSERT(node); + TIXMLASSERT(node->_document == this); + if (node->_parent) { node->_parent->DeleteChild(node); } + else + { + // Isn't in the tree. + // Use the parent delete. + // Also, we need to mark it tracked: we 'know' + // it was never used. + node->_memPool->SetTracked(); + // Call the static XMLNode version: + XMLNode::DeleteNode(node); + } +} + + +XMLError XMLDocument::LoadFile(const char* filename) +{ + if (!filename) + { + TIXMLASSERT(false); + SetError(XML_ERROR_FILE_COULD_NOT_BE_OPENED, 0, "filename="); + return _errorID; + } + + Clear(); + FILE* fp = callfopen(filename, "rb"); + if (!fp) + { + SetError(XML_ERROR_FILE_NOT_FOUND, 0, "filename=%s", filename); + return _errorID; + } + LoadFile(fp); + fclose(fp); + return _errorID; +} + +// This is likely overengineered template art to have a check that unsigned long value incremented +// by one still fits into size_t. If size_t type is larger than unsigned long type +// (x86_64-w64-mingw32 target) then the check is redundant and gcc and clang emit +// -Wtype-limits warning. This piece makes the compiler select code with a check when a check +// is useful and code with no check when a check is redundant depending on how size_t and unsigned long +// types sizes relate to each other. +template += sizeof(size_t))> +struct LongFitsIntoSizeTMinusOne +{ + static bool Fits(const unsigned long value) { return value < size_t(-1); } +}; + +template <> +struct LongFitsIntoSizeTMinusOne +{ + static bool Fits(unsigned long /*value*/) { return true; } +}; + +XMLError XMLDocument::LoadFile(FILE* fp) +{ + Clear(); + + fseek(fp, 0, SEEK_SET); + if (fgetc(fp) == EOF && ferror(fp) != 0) + { + SetError(XML_ERROR_FILE_READ_ERROR, 0, nullptr); + return _errorID; + } + + fseek(fp, 0, SEEK_END); + const long filelength = ftell(fp); + fseek(fp, 0, SEEK_SET); + if (filelength == -1L) + { + SetError(XML_ERROR_FILE_READ_ERROR, 0, nullptr); + return _errorID; + } + TIXMLASSERT(filelength >= 0); + + if (!LongFitsIntoSizeTMinusOne<>::Fits(filelength)) + { + // Cannot handle files which won't fit in buffer together with null terminator + SetError(XML_ERROR_FILE_READ_ERROR, 0, nullptr); + return _errorID; + } + + if (filelength == 0) + { + SetError(XML_ERROR_EMPTY_DOCUMENT, 0, nullptr); + return _errorID; + } + + const size_t size = filelength; + TIXMLASSERT(_charBuffer == nullptr); + _charBuffer = new char[size + 1]; + const size_t read = fread(_charBuffer, 1, size, fp); + if (read != size) + { + SetError(XML_ERROR_FILE_READ_ERROR, 0, nullptr); + return _errorID; + } + + _charBuffer[size] = 0; + + Parse(); + return _errorID; +} + + +XMLError XMLDocument::SaveFile(const char* filename, const bool compact) +{ + if (!filename) + { + TIXMLASSERT(false); + SetError(XML_ERROR_FILE_COULD_NOT_BE_OPENED, 0, "filename="); + return _errorID; + } + + FILE* fp = callfopen(filename, "w"); + if (!fp) + { + SetError(XML_ERROR_FILE_COULD_NOT_BE_OPENED, 0, "filename=%s", filename); + return _errorID; + } + SaveFile(fp, compact); + fclose(fp); + return _errorID; +} + + +XMLError XMLDocument::SaveFile(FILE* fp, const bool compact) +{ + // Clear any error from the last save, otherwise it will get reported + // for *this* call. + ClearError(); + XMLPrinter stream(fp, compact); + Print(&stream); + return _errorID; +} + + +XMLError XMLDocument::Parse(const char* xml, size_t len) +{ + Clear(); + + if (len == 0 || !xml || !*xml) + { + SetError(XML_ERROR_EMPTY_DOCUMENT, 0, nullptr); + return _errorID; + } + if (len == size_t(-1)) { len = strlen(xml); } + TIXMLASSERT(_charBuffer == nullptr); + _charBuffer = new char[len + 1]; + memcpy(_charBuffer, xml, len); + _charBuffer[len] = 0; + + Parse(); + if (Error()) + { + // clean up now essentially dangling memory. + // and the parse fail can put objects in the + // pools that are dead and inaccessible. + DeleteChildren(); + _elementPool.Clear(); + _attributePool.Clear(); + _textPool.Clear(); + _commentPool.Clear(); + } + return _errorID; +} + + +void XMLDocument::Print(XMLPrinter* streamer) const +{ + if (streamer) { Accept(streamer); } + else + { + XMLPrinter stdoutStreamer(stdout); + Accept(&stdoutStreamer); + } +} + + +void XMLDocument::SetError(XMLError error, const int lineNum, const char* format, ...) +{ + TIXMLASSERT(error >= 0 && error < XML_ERROR_COUNT); + _errorID = error; + _errorLineNum = lineNum; + _errorStr.Reset(); + + const size_t BUFFER_SIZE = 1000; + char* buffer = new char[BUFFER_SIZE]; + + TIXMLASSERT(sizeof(error) <= sizeof(int)); + TIXML_SNPRINTF(buffer, BUFFER_SIZE, "Error=%s ErrorID=%d (0x%x) Line number=%d", ErrorIDToName(error), int(error), int(error), lineNum); + + if (format) + { + size_t len = strlen(buffer); + TIXML_SNPRINTF(buffer + len, BUFFER_SIZE - len, ": "); + len = strlen(buffer); + + va_list va; + va_start(va, format); + TIXML_VSNPRINTF(buffer + len, BUFFER_SIZE - len, format, va); + va_end(va); + } + _errorStr.SetStr(buffer); + delete[] buffer; +} + + +/*static*/ +const char* XMLDocument::ErrorIDToName(const XMLError errorID) +{ + TIXMLASSERT(errorID >= 0 && errorID < XML_ERROR_COUNT); + const char* errorName = _errorNames[errorID]; + TIXMLASSERT(errorName && errorName[0]); + return errorName; +} + +void XMLDocument::Parse() +{ + TIXMLASSERT(NoChildren()); // Clear() must have been called previously + TIXMLASSERT(_charBuffer); + _parseCurLineNum = 1; + _parseLineNum = 1; + char* p = _charBuffer; + p = XMLUtil::SkipWhiteSpace(p, &_parseCurLineNum); + p = const_cast(XMLUtil::ReadBOM(p, &_writeBOM)); + if (!*p) + { + SetError(XML_ERROR_EMPTY_DOCUMENT, 0, nullptr); + return; + } + ParseDeep(p, nullptr, &_parseCurLineNum); +} + +void XMLDocument::PushDepth() +{ + _parsingDepth++; + if (_parsingDepth == TINYXML2_MAX_ELEMENT_DEPTH) { SetError(XML_ELEMENT_DEPTH_EXCEEDED, _parseCurLineNum, "Element nesting is too deep."); } +} + +void XMLDocument::PopDepth() +{ + TIXMLASSERT(_parsingDepth > 0); + --_parsingDepth; +} + +XMLPrinter::XMLPrinter(FILE* file, const bool compact, const int depth) : _fp(file), _depth(depth), _compactMode(compact) +{ + for (int i = 0; i < ENTITY_RANGE; ++i) + { + _entityFlag[i] = false; + _restrictedEntityFlag[i] = false; + } + for (int i = 0; i < NUM_ENTITIES; ++i) + { + const char entityValue = ENTITIES[i].value; + const unsigned char flagIndex = static_cast(entityValue); + TIXMLASSERT(flagIndex < ENTITY_RANGE); + _entityFlag[flagIndex] = true; + } + _restrictedEntityFlag[static_cast('&')] = true; + _restrictedEntityFlag[static_cast('<')] = true; + _restrictedEntityFlag[static_cast('>')] = true; // not required, but consistency is nice + _buffer.Push(0); +} + + +void XMLPrinter::Print(const char* format, ...) +{ + va_list va; + va_start(va, format); + + if (_fp) { vfprintf(_fp, format, va); } + else + { + const int len = TIXML_VSCPRINTF(format, va); + // Close out and re-start the va-args + va_end(va); + TIXMLASSERT(len >= 0); + va_start(va, format); + TIXMLASSERT(_buffer.Size() > 0 && _buffer[_buffer.Size() - 1] == 0); + char* p = _buffer.PushArr(len) - 1; // back up over the null terminator. + TIXML_VSNPRINTF(p, len + 1, format, va); + } + va_end(va); +} + + +void XMLPrinter::Write(const char* data, const size_t size) +{ + if (_fp) { fwrite(data, sizeof(char), size, _fp); } + else + { + char* p = _buffer.PushArr(int(size)) - 1; // back up over the null terminator. + memcpy(p, data, size); + p[size] = 0; + } +} + + +void XMLPrinter::Putc(const char ch) +{ + if (_fp) { fputc(ch, _fp); } + else + { + char* p = _buffer.PushArr(sizeof(char)) - 1; // back up over the null terminator. + p[0] = ch; + p[1] = 0; + } +} + + +void XMLPrinter::PrintString(const char* p, const bool restricted) +{ + // Look for runs of bytes between entities to print. + const char* q = p; + + if (_processEntities) + { + const bool* flag = restricted ? _restrictedEntityFlag : _entityFlag; + while (*q) + { + TIXMLASSERT(p <= q); + // Remember, char is sometimes signed. (How many times has that bitten me?) + if (*q > 0 && *q < ENTITY_RANGE) + { + // Check for entities. If one is found, flush + // the stream up until the entity, write the + // entity, and keep looking. + if (flag[static_cast(*q)]) + { + while (p < q) + { + const size_t delta = q - p; + const int toPrint = (INT_MAX < delta) ? INT_MAX : int(delta); + Write(p, toPrint); + p += toPrint; + } + bool entityPatternPrinted = false; + for (int i = 0; i < NUM_ENTITIES; ++i) + { + if (ENTITIES[i].value == *q) + { + Putc('&'); + Write(ENTITIES[i].pattern, ENTITIES[i].length); + Putc(';'); + entityPatternPrinted = true; + break; + } + } + if (!entityPatternPrinted) + { + // TIXMLASSERT( entityPatternPrinted ) causes gcc -Wunused-but-set-variable in release + TIXMLASSERT(false); + } + ++p; + } + } + ++q; + TIXMLASSERT(p <= q); + } + // Flush the remaining string. This will be the entire + // string if an entity wasn't found. + if (p < q) + { + const size_t delta = q - p; + const int toPrint = (INT_MAX < delta) ? INT_MAX : int(delta); + Write(p, toPrint); + } + } + else { Write(p); } +} + + +void XMLPrinter::PushHeader(const bool writeBOM, const bool writeDec) +{ + if (writeBOM) + { + static const unsigned char bom[] = { TIXML_UTF_LEAD_0, TIXML_UTF_LEAD_1, TIXML_UTF_LEAD_2, 0 }; + Write(reinterpret_cast(bom)); + } + if (writeDec) { PushDeclaration("xml version=\"1.0\""); } +} + + +void XMLPrinter::OpenElement(const char* name, const bool compactMode) +{ + SealElementIfJustOpened(); + _stack.Push(name); + + if (_textDepth < 0 && !_firstElement && !compactMode) { Putc('\n'); } + if (!compactMode) { PrintSpace(_depth); } + + Write("<"); + Write(name); + + _elementJustOpened = true; + _firstElement = false; + ++_depth; +} + + +void XMLPrinter::PushAttribute(const char* name, const char* value) +{ + TIXMLASSERT(_elementJustOpened); + Putc(' '); + Write(name); + Write("=\""); + PrintString(value, false); + Putc('\"'); +} + + +void XMLPrinter::PushAttribute(const char* name, const int value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushAttribute(name, buf); +} + + +void XMLPrinter::PushAttribute(const char* name, const unsigned value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushAttribute(name, buf); +} + + +void XMLPrinter::PushAttribute(const char* name, const int64_t value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushAttribute(name, buf); +} + + +void XMLPrinter::PushAttribute(const char* name, const bool value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushAttribute(name, buf); +} + + +void XMLPrinter::PushAttribute(const char* name, const double value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushAttribute(name, buf); +} + + +void XMLPrinter::CloseElement(const bool compactMode) +{ + --_depth; + const char* name = _stack.Pop(); + + if (_elementJustOpened) { Write("/>"); } + else + { + if (_textDepth < 0 && !compactMode) + { + Putc('\n'); + PrintSpace(_depth); + } + Write(""); + } + + if (_textDepth == _depth) { _textDepth = -1; } + if (_depth == 0 && !compactMode) { Putc('\n'); } + _elementJustOpened = false; +} + + +void XMLPrinter::SealElementIfJustOpened() +{ + if (!_elementJustOpened) { return; } + _elementJustOpened = false; + Putc('>'); +} + + +void XMLPrinter::PushText(const char* text, const bool cdata) +{ + _textDepth = _depth - 1; + + SealElementIfJustOpened(); + if (cdata) + { + Write(""); + } + else { PrintString(text, true); } +} + +void XMLPrinter::PushText(const int64_t value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushText(buf, false); +} + +void XMLPrinter::PushText(const int value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushText(buf, false); +} + + +void XMLPrinter::PushText(const unsigned value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushText(buf, false); +} + + +void XMLPrinter::PushText(const bool value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushText(buf, false); +} + + +void XMLPrinter::PushText(const float value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushText(buf, false); +} + + +void XMLPrinter::PushText(const double value) +{ + char buf[BUF_SIZE]; + XMLUtil::ToStr(value, buf, BUF_SIZE); + PushText(buf, false); +} + + +void XMLPrinter::PushComment(const char* comment) +{ + SealElementIfJustOpened(); + if (_textDepth < 0 && !_firstElement && !_compactMode) + { + Putc('\n'); + PrintSpace(_depth); + } + _firstElement = false; + + Write(""); +} + + +void XMLPrinter::PushDeclaration(const char* value) +{ + SealElementIfJustOpened(); + if (_textDepth < 0 && !_firstElement && !_compactMode) + { + Putc('\n'); + PrintSpace(_depth); + } + _firstElement = false; + + Write(""); +} + + +void XMLPrinter::PushUnknown(const char* value) +{ + SealElementIfJustOpened(); + if (_textDepth < 0 && !_firstElement && !_compactMode) + { + Putc('\n'); + PrintSpace(_depth); + } + _firstElement = false; + + Write("'); +} + + +bool XMLPrinter::VisitEnter(const XMLDocument& doc) +{ + _processEntities = doc.ProcessEntities(); + if (doc.HasBOM()) { PushHeader(true, false); } + return true; +} + + +bool XMLPrinter::VisitEnter(const XMLElement& element, const XMLAttribute* attribute) +{ + const XMLElement* parentElem = nullptr; + if (element.Parent()) { parentElem = element.Parent()->ToElement(); } + const bool compactMode = parentElem ? CompactMode(*parentElem) : _compactMode; + OpenElement(element.Name(), compactMode); + while (attribute) + { + PushAttribute(attribute->Name(), attribute->Value()); + attribute = attribute->Next(); + } + return true; +} + + +bool XMLPrinter::VisitExit(const XMLElement& element) +{ + CloseElement(CompactMode(element)); + return true; +} + + +bool XMLPrinter::Visit(const XMLText& text) +{ + PushText(text.Value(), text.CData()); + return true; +} + + +bool XMLPrinter::Visit(const XMLComment& comment) +{ + PushComment(comment.Value()); + return true; +} + +bool XMLPrinter::Visit(const XMLDeclaration& declaration) +{ + PushDeclaration(declaration.Value()); + return true; +} + + +bool XMLPrinter::Visit(const XMLUnknown& unknown) +{ + PushUnknown(unknown.Value()); + return true; +} +} // namespace tinyxml2 diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/Basics.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Basics.cpp new file mode 100644 index 0000000..525afce --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Basics.cpp @@ -0,0 +1,212 @@ +#include "geometry/Basics.hpp" +#include // SQRT of Matrix + +namespace Geometry { + +//************************************************ +//******************** Matrix ******************** +//************************************************ +//--------------------------------------------------------------------------------------------------- +Eigen::MatrixXd AffineTransformation(const Eigen::MatrixXd& ref, const Eigen::MatrixXd& matrix) +{ + const Eigen::MatrixXd isR = ref.sqrt().inverse(); // Inverse Square root of Reference matrix => isR + return isR * matrix * isR.transpose(); // Affine transformation : isR * sample * isR^T +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MatrixStandardization(Eigen::MatrixXd& matrix, const EStandardization standard) +{ + if (standard == EStandardization::Center) { return MatrixCenter(matrix); } + if (standard == EStandardization::StandardScale) { return MatrixStandardization(matrix); } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MatrixStandardization(const Eigen::MatrixXd& in, Eigen::MatrixXd& out, const EStandardization standard) +{ + out = in; + return MatrixStandardization(out, standard); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MatrixCenter(Eigen::MatrixXd& matrix) +{ + for (size_t i = 0, r = matrix.rows(), c = matrix.cols(); i < r; ++i) + { + const double mu = matrix.row(i).mean(); + for (size_t j = 0; j < c; ++j) { matrix(i, j) -= mu; } + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MatrixCenter(const Eigen::MatrixXd& in, Eigen::MatrixXd& out) +{ + out = in; + return MatrixCenter(out); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MatrixStandardScaler(Eigen::MatrixXd& matrix) +{ + Eigen::RowVectorXd dummyScale; + return MatrixStandardScaler(matrix, dummyScale); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MatrixStandardScaler(Eigen::MatrixXd& matrix, Eigen::RowVectorXd& scale) +{ + const size_t r = matrix.rows(), c = matrix.cols(); + std::vector mu(r, 0), sigma(r, 0); + scale.resize(r); + + for (size_t i = 0; i < r; ++i) + { + for (size_t j = 0; j < c; ++j) + { + const double value = matrix(i, j); + mu[i] += value; + sigma[i] += value * value; + } + + mu[i] /= double(c); + sigma[i] = sigma[i] / double(c) - mu[i] * mu[i]; + scale[i] = sigma[i] == 0 ? 1 : sqrt(sigma[i]); + + for (size_t j = 0; j < c; ++j) { matrix(i, j) = (matrix(i, j) - mu[i]) / scale[i]; } + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MatrixStandardScaler(const Eigen::MatrixXd& in, Eigen::MatrixXd& out, Eigen::RowVectorXd& scale) +{ + out = in; + return MatrixStandardScaler(out, scale); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MatrixStandardScaler(const Eigen::MatrixXd& in, Eigen::MatrixXd& out) +{ + Eigen::RowVectorXd dummyScale; + return MatrixStandardScaler(in, out, dummyScale); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +std::string MatrixPrint(const Eigen::MatrixXd& matrix) +{ + std::stringstream sstream; + sstream << matrix; + return sstream.str(); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool AreEquals(const Eigen::MatrixXd& matrix1, const Eigen::MatrixXd& matrix2, const double precision) +{ + return matrix1.size() == matrix2.size() && (matrix1.size() == 0 || matrix1.isApprox(matrix2, precision)); +} +//--------------------------------------------------------------------------------------------------- + +//************************************************ +//************************************************ +//************************************************ + +//************************************************************* +//******************** Index Manipulations ******************** +//************************************************************* +//--------------------------------------------------------------------------------------------------- +Eigen::RowVectorXd GetElements(const Eigen::RowVectorXd& row, const std::vector& index) +{ + const size_t k = index.size(); + Eigen::RowVectorXd result(k); + for (size_t i = 0; i < k; ++i) { result[i] = row[index[i]]; } + return result; +} +//--------------------------------------------------------------------------------------------------- +//************************************************************* +//************************************************************* +//************************************************************* + +//*************************************************** +//******************** Validates ******************** +//*************************************************** +//--------------------------------------------------------------------------------------------------- +bool InRange(const double value, const double min, const double max) { return (min <= value && value <= max); } +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool AreNotEmpty(const std::vector& matrices) +{ + if (matrices.empty()) { return false; } + for (const auto& m : matrices) { if (!IsNotEmpty(m)) { return false; } } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool IsNotEmpty(const Eigen::MatrixXd& matrix) { return (matrix.size() != 0); } +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool HaveSameSize(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b) { return (IsNotEmpty(a) && a.rows() == b.rows() && a.cols() == b.cols()); } +//--------------------------------------------------------------------------------------------------- + +bool IsSquare(const Eigen::MatrixXd& matrix) { return (IsNotEmpty(matrix) && matrix.rows() == matrix.cols()); } +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool AreSquare(const std::vector& matrices) +{ + if (matrices.empty()) { return false; } + for (const auto& m : matrices) { if (!IsSquare(m)) { return false; } } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool HaveSameSize(const std::vector& matrices) +{ + if (matrices.empty()) { return false; } + const size_t r = matrices[0].rows(), c = matrices[0].cols(); + for (const auto& m : matrices) { if (size_t(m.rows()) != r || size_t(m.cols()) != c) { return false; } } + return true; +} +//--------------------------------------------------------------------------------------------------- +//*************************************************** +//*************************************************** +//*************************************************** + +//******************************************************** +//******************** CSV MANAGEMENT ******************** +//******************************************************** +//--------------------------------------------------------------------------------------------------- +std::vector Split(const std::string& s, const std::string& sep) +{ + std::vector result; + std::string::size_type i = 0, j; + const std::string::size_type n = sep.size(); + + while ((j = s.find(sep, i)) != std::string::npos) + { + result.emplace_back(s, i, j - i); // Add part + i = j + n; // Update pos + } + result.emplace_back(s, i, s.size() - 1 - i); // Last without \n + return result; +} +//--------------------------------------------------------------------------------------------------- +//******************************************************** +//******************************************************** +//******************************************************** + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/Classification.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Classification.cpp new file mode 100644 index 0000000..c7633ad --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Classification.cpp @@ -0,0 +1,93 @@ +#include "geometry/Classification.hpp" +#include "geometry/Covariance.hpp" +#include "geometry/Basics.hpp" + +namespace Geometry { + +///------------------------------------------------------------------------------------------------- +bool LSQR(const std::vector>& dataset, Eigen::MatrixXd& weight) +{ + // Precomputation + if (dataset.empty()) { return false; } + const size_t nbClass = dataset.size(), nbFeatures = dataset[0][0].size(); + std::vector nbSample(nbClass); + size_t totalSample = 0; + for (size_t k = 0; k < nbClass; ++k) + { + if (dataset[k].empty()) { return false; } + nbSample[k] = dataset[k].size(); + totalSample += nbSample[k]; + } + + // Compute Class Euclidian mean + Eigen::MatrixXd mean = Eigen::MatrixXd::Zero(nbClass, nbFeatures); + for (size_t k = 0; k < nbClass; ++k) + { + for (size_t i = 0; i < nbSample[k]; ++i) { mean.row(k) += dataset[k][i]; } + mean.row(k) /= double(nbSample[k]); + } + + // Compute Class Covariance + Eigen::MatrixXd cov = Eigen::MatrixXd::Zero(nbFeatures, nbFeatures); + for (size_t k = 0; k < nbClass; ++k) + { + //Fit Data to existing covariance matrix method + Eigen::MatrixXd classData(nbFeatures, nbSample[k]); + for (size_t i = 0; i < nbSample[k]; ++i) { classData.col(i) = dataset[k][i]; } + + // Standardize Features + Eigen::RowVectorXd scale; + MatrixStandardScaler(classData, scale); + + //Compute Covariance of this class + Eigen::MatrixXd classCov; + if (!CovarianceMatrix(classData, classCov, EEstimator::LWF)) { return false; } + + // Rescale + for (size_t i = 0; i < nbFeatures; ++i) { for (size_t j = 0; j < nbFeatures; ++j) { classCov(i, j) *= scale[i] * scale[j]; } } + + //Add to cov with good weight + cov += (double(nbSample[k]) / double(totalSample)) * classCov; + } + + // linear least squares systems solver + // Chosen solver with the performance table of this page : https://eigen.tuxfamily.org/dox/group__TutorialLinearAlgebra.html + weight = cov.colPivHouseholderQr().solve(mean.transpose()).transpose(); + //weight = cov.completeOrthogonalDecomposition().solve(mean.transpose()).transpose(); + //weight = cov.bdcSvd(ComputeThinU | ComputeThinV).solve(mean.transpose()).transpose(); + + // Treat binary case as a special case + if (nbClass == 2) + { + const Eigen::MatrixXd tmp = weight.row(1) - weight.row(0); // Need to use a tmp variable otherwise sometimes error + weight = tmp; + } + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool FgDACompute(const std::vector>& dataset, Eigen::MatrixXd& weight) +{ + // Compute LSQR Weight + Eigen::MatrixXd w; + if (!LSQR(dataset, w)) { return false; } + const size_t nbClass = w.rows(); + + // Transform to FgDA Weight + const Eigen::MatrixXd wT = w.transpose(); + weight = (wT * (w * wT).colPivHouseholderQr().solve(Eigen::MatrixXd::Identity(nbClass, nbClass))) * w; + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool FgDAApply(const Eigen::RowVectorXd& in, Eigen::RowVectorXd& out, const Eigen::MatrixXd& weight) +{ + if (in.cols() != weight.rows()) { return false; } + out = in * weight; + return true; +} +///------------------------------------------------------------------------------------------------- + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/Covariance.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Covariance.cpp new file mode 100644 index 0000000..0eff803 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Covariance.cpp @@ -0,0 +1,172 @@ +# include "geometry/Covariance.hpp" +#include // std::min/max + +namespace Geometry { + +//*********************************************************** +//******************** COVARIANCES BASES ******************** +//*********************************************************** +//--------------------------------------------------------------------------------------------------- +double Variance(const Eigen::RowVectorXd& x) +{ + const size_t S = x.cols(); // Number of Samples => S + if (S == 0) { return 0; } // If false input + + const double mu = x.mean(); + return x.cwiseProduct(x).sum() / S - mu * mu; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +double Covariance(const Eigen::RowVectorXd& x, const Eigen::RowVectorXd& y) +{ + const size_t xS = x.cols(), yS = y.cols(); // Number of Samples => S + if (xS == 0 || xS != yS) { return 0; } // If false input + return (x.cwiseProduct(y).sum() - x.sum() * y.sum() / xS) / xS; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool ShrunkCovariance(Eigen::MatrixXd& cov, const double shrinkage) +{ + if (!InRange(shrinkage, 0, 1)) { return false; } // Verification + const size_t n = cov.rows(); // Number of Features => N + + const double coef = shrinkage * cov.trace() / n; // Diagonal Coefficient + cov = (1 - shrinkage) * cov; // Shrinkage + for (size_t i = 0; i < n; ++i) { cov(i, i) += coef; } // Add Diagonal Coefficient + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool ShrunkCovariance(const Eigen::MatrixXd& in, Eigen::MatrixXd& out, const double shrinkage) +{ + out = in; + return ShrunkCovariance(out, shrinkage); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CovarianceMatrix(const Eigen::MatrixXd& in, Eigen::MatrixXd& out, const EEstimator estimator, const EStandardization standard) +{ + if (!IsNotEmpty(in)) { return false; } // Verification + Eigen::MatrixXd sample; + MatrixStandardization(in, sample, standard); // Standardization + switch (estimator) // Switch Method + { + case EEstimator::COV: return CovarianceMatrixCOV(sample, out); + case EEstimator::SCM: return CovarianceMatrixSCM(sample, out); + case EEstimator::LWF: return CovarianceMatrixLWF(sample, out); + case EEstimator::OAS: return CovarianceMatrixOAS(sample, out); + case EEstimator::MCD: return CovarianceMatrixMCD(sample, out); + case EEstimator::COR: return CovarianceMatrixCOR(sample, out); + default: return CovarianceMatrixIDE(sample, out); + } +} +//--------------------------------------------------------------------------------------------------- + +//*********************************************************** +//*********************************************************** +//*********************************************************** + +//*********************************************************** +//******************** COVARIANCES TYPES ******************** +//*********************************************************** +//--------------------------------------------------------------------------------------------------- +bool CovarianceMatrixCOV(const Eigen::MatrixXd& samples, Eigen::MatrixXd& cov) +{ + const size_t n = samples.rows(); // Number of Features => N + + cov.resize(n, n); // Init size of matrix + for (size_t i = 0; i < n; ++i) + { + const Eigen::RowVectorXd ri = samples.row(i); + cov(i, i) = Variance(ri); // Diagonal Value + + for (size_t j = i + 1; j < n; ++j) + { + const Eigen::RowVectorXd rj = samples.row(j); + cov(i, j) = cov(j, i) = Covariance(ri, rj); // Symetric covariance + } + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CovarianceMatrixSCM(const Eigen::MatrixXd& samples, Eigen::MatrixXd& cov) +{ + cov = samples * samples.transpose(); // X*X^T + cov /= cov.trace(); // X*X^T / trace(X*X^T) + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CovarianceMatrixLWF(const Eigen::MatrixXd& samples, Eigen::MatrixXd& cov) +{ + const size_t n = samples.rows(), S = samples.cols(); // Number of Features & Samples => N & S + + CovarianceMatrixCOV(samples, cov); // Initial Covariance Matrix => Cov + const double mu = cov.trace() / n; + Eigen::MatrixXd mDelta = cov; // mDelta = cov - mu * I_n + for (size_t i = 0; i < n; ++i) { mDelta(i, i) -= mu; } + const Eigen::MatrixXd x2 = samples.cwiseProduct(samples), // Squared each sample => X^2 + cov2 = cov.cwiseProduct(cov); // Squared each element of Cov => Cov^2 + + const double delta = mDelta.cwiseProduct(mDelta).sum() / n, + beta = 1. / double(n * S) * (x2 * x2.transpose() / double(S) - cov2).sum(), + shrinkage = std::min(beta, delta) / delta; // Assure shrinkage <= 1 + + return ShrunkCovariance(cov, shrinkage); // Shrinkage of the matrix +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CovarianceMatrixOAS(const Eigen::MatrixXd& samples, Eigen::MatrixXd& cov) +{ + const size_t n = samples.rows(), S = samples.cols(); // Number of Features & Samples => N & S + CovarianceMatrixCOV(samples, cov); // Initial Covariance Matrix => Cov + + // Compute Shrinkage : Formula from Chen et al.'s + const double mu = cov.trace() / n, + mu2 = mu * mu, + alpha = cov.cwiseProduct(cov).mean(), + num = alpha + mu2, + den = (S + 1) * (alpha - mu2 / n), + shrinkage = (den == 0) ? 1.0 : std::min(num / den, 1.0); + + return ShrunkCovariance(cov, shrinkage); // Shrinkage of the matrix +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CovarianceMatrixMCD(const Eigen::MatrixXd& samples, Eigen::MatrixXd& cov) { return CovarianceMatrixIDE(samples, cov); } +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CovarianceMatrixCOR(const Eigen::MatrixXd& samples, Eigen::MatrixXd& cov) +{ + const size_t n = samples.rows(); // Number of Features => N + CovarianceMatrixCOV(samples, cov); // Initial Covariance Matrix => Cov + const Eigen::MatrixXd d = cov.diagonal().cwiseSqrt(); // Squared root of diagonal + + for (size_t i = 0; i < n; ++i) { for (size_t j = 0; j < n; ++j) { cov(i, j) /= d(i) * d(j); } } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CovarianceMatrixIDE(const Eigen::MatrixXd& samples, Eigen::MatrixXd& cov) +{ + cov = Eigen::MatrixXd::Identity(samples.rows(), samples.rows()); + return true; +} +//--------------------------------------------------------------------------------------------------- +//*********************************************************** +//*********************************************************** +//*********************************************************** + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/Distance.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Distance.cpp new file mode 100644 index 0000000..9bb1dc7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Distance.cpp @@ -0,0 +1,68 @@ +#include "geometry/Distance.hpp" +#include "geometry/Basics.hpp" +#include + +namespace Geometry { + +//--------------------------------------------------------------------------------------------------- +double Distance(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b, const EMetric metric) +{ + if (!HaveSameSize(a, b)) { return 0; } + switch (metric) + { + case EMetric::Riemann: return DistanceRiemann(a, b); + case EMetric::Euclidian: return DistanceEuclidian(a, b); + case EMetric::LogEuclidian: return DistanceLogEuclidian(a, b); + case EMetric::LogDet: return DistanceLogDet(a, b); + case EMetric::Kullback: return DistanceKullbackSym(a, b); + case EMetric::Wasserstein: return DistanceWasserstein(a, b); + case EMetric::Identity: + default: return 1.0; + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +double DistanceRiemann(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b) +{ + const Eigen::GeneralizedSelfAdjointEigenSolver es(a, b); + const Eigen::ArrayXd result = es.eigenvalues(); + return sqrt(result.log().square().sum()); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +double DistanceEuclidian(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b) { return (b - a).norm(); } +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +double DistanceLogEuclidian(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b) { return DistanceEuclidian(a.log(), b.log()); } +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +double DistanceLogDet(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b) +{ + return sqrt(log((0.5 * (a + b)).determinant()) - 0.5 * log(a.determinant() * b.determinant())); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +double DistanceKullback(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b) +{ + return 0.5 * ((b.inverse() * a).trace() - a.rows() + log(b.determinant() / a.determinant())); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +double DistanceKullbackSym(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b) { return DistanceKullback(a, b) + DistanceKullback(b, a); } +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +double DistanceWasserstein(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b) +{ + const Eigen::MatrixXd sB = b.sqrt(); + return sqrt((a + b - 2 * (sB * a * sB).sqrt()).trace()); +} +//--------------------------------------------------------------------------------------------------- + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/Featurization.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Featurization.cpp new file mode 100644 index 0000000..c1663d0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Featurization.cpp @@ -0,0 +1,92 @@ +#include "geometry/Featurization.hpp" +#include +#include "geometry/Basics.hpp" + +namespace Geometry { + +#ifndef M_SQRT2 +#define M_SQRT2 1.4142135623730950488016887242097 +#endif + +//--------------------------------------------------------------------------------------------------- +bool Featurization(const Eigen::MatrixXd& in, Eigen::RowVectorXd& out, const bool tangent, const Eigen::MatrixXd& ref) +{ + if (tangent) { return TangentSpace(in, out, ref); } + return SqueezeUpperTriangle(in, out, true); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool UnFeaturization(const Eigen::RowVectorXd& in, Eigen::MatrixXd& out, const bool tangent, const Eigen::MatrixXd& ref) +{ + if (tangent) { return UnTangentSpace(in, out, ref); } + return UnSqueezeUpperTriangle(in, out, true); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool SqueezeUpperTriangle(const Eigen::MatrixXd& in, Eigen::RowVectorXd& out, const bool rowMajor) +{ + if (!IsSquare(in)) { return false; } // Verification + const size_t n = in.rows(); // Number of Features => N + out.resize(n * (n + 1) / 2); // Resize + + size_t idx = 0; // Row Index => idx + // Row Major or Diagonal Method + if (rowMajor) { for (size_t i = 0; i < n; ++i) { for (size_t j = i; j < n; ++j) { out[idx++] = in(i, j); } } } + else { for (size_t i = 0; i < n; ++i) { for (size_t j = i; j < n; ++j) { out[idx++] = in(j, j - i); } } } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool UnSqueezeUpperTriangle(const Eigen::RowVectorXd& in, Eigen::MatrixXd& out, const bool rowMajor) +{ + const size_t nR = in.size(), // Size of Row => Nr + n = int((sqrt(1 + 8 * nR) - 1) / 2); // Number of Features => N + if (n == 0) { return false; } // Verification + out.setZero(n, n); // Init + + size_t idx = 0; // Row Index => idx + // Row Major or Diagonal Method + if (rowMajor) { for (size_t i = 0; i < n; ++i) { for (size_t j = i; j < n; ++j) { out(j, i) = out(i, j) = in[idx++]; } } } + else { for (size_t i = 0; i < n; ++i) { for (size_t j = i; j < n; ++j) { out(j - i, j) = out(j, j - i) = in[idx++]; } } } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool TangentSpace(const Eigen::MatrixXd& in, Eigen::RowVectorXd& out, const Eigen::MatrixXd& ref) +{ + if (!IsSquare(in)) { return false; } // Verification + const size_t n = in.rows(); // Number of Features => N + + const Eigen::MatrixXd sC = (ref.size() == 0) ? Eigen::MatrixXd::Identity(n, n) : Eigen::MatrixXd(ref.sqrt()), + isC = sC.inverse(), // Inverse Square root of ref => isC + mJ = (isC * in * isC).log(), // Transformation Matrix => mJ + mCoeffs = M_SQRT2 * Eigen::MatrixXd(Eigen::MatrixXd::Ones(n, n).triangularView()) + + Eigen::MatrixXd::Identity(n, n); + + Eigen::RowVectorXd vJ, vCoeffs; + if (!SqueezeUpperTriangle(mJ, vJ, true)) { return false; } // Get upper triangle of J => vJ + if (!SqueezeUpperTriangle(mCoeffs, vCoeffs, true)) { return false; } // ... of Coefs => vCoeffs + out = vCoeffs.cwiseProduct(vJ); // element-wise multiplication + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool UnTangentSpace(const Eigen::RowVectorXd& in, Eigen::MatrixXd& out, const Eigen::MatrixXd& ref) +{ + const size_t n = out.rows(); // Number of Features => N + if (!UnSqueezeUpperTriangle(in, out)) { return false; } + + const Eigen::MatrixXd sC = (ref.size() == 0) ? Eigen::MatrixXd::Identity(n, n) : Eigen::MatrixXd(ref.sqrt()), + coeffs = Eigen::MatrixXd(out.triangularView()) / M_SQRT2; + + out = sC * (Eigen::MatrixXd(out.diagonal().asDiagonal()) + coeffs + coeffs.transpose()).exp() * sC; + return true; +} +//--------------------------------------------------------------------------------------------------- + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/Geodesic.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Geodesic.cpp new file mode 100644 index 0000000..225587f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Geodesic.cpp @@ -0,0 +1,57 @@ +#include "geometry/Geodesic.hpp" +#include "geometry/Basics.hpp" +#include + +namespace Geometry { + +//--------------------------------------------------------------------------------------------------- +bool Geodesic(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b, Eigen::MatrixXd& g, const EMetric metric, const double alpha) +{ + if (!HaveSameSize(a, b)) { return false; } // Verification same size + if (!IsSquare(a)) { return false; } // Verification square matrix + if (!InRange(alpha, 0, 1)) { return false; } // Verification alpha in [0;1] + switch (metric) // Switch metric + { + case EMetric::Riemann: return GeodesicRiemann(a, b, g, alpha); + case EMetric::Euclidian: return GeodesicEuclidian(a, b, g, alpha); + case EMetric::LogEuclidian: return GeodesicLogEuclidian(a, b, g, alpha); + case EMetric::Identity: + default: return GeodesicIdentity(a, b, g, alpha); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool GeodesicRiemann(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b, Eigen::MatrixXd& g, const double alpha) +{ + const Eigen::MatrixXd sA = a.sqrt(), isA = sA.inverse(); + g = sA * (isA * b * isA).pow(alpha) * sA; + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool GeodesicEuclidian(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b, Eigen::MatrixXd& g, const double alpha) +{ + g = (1 - alpha) * a + alpha * b; + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool GeodesicLogEuclidian(const Eigen::MatrixXd& a, const Eigen::MatrixXd& b, Eigen::MatrixXd& g, const double alpha) +{ + g = ((1 - alpha) * a.log() + alpha * b.log()).exp(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool GeodesicIdentity(const Eigen::MatrixXd& a, const Eigen::MatrixXd& /*b*/, Eigen::MatrixXd& g, const double /*alpha*/) +{ + g = Eigen::MatrixXd::Identity(a.rows(), a.rows()); + return true; +} +//--------------------------------------------------------------------------------------------------- + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/Mean.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Mean.cpp new file mode 100644 index 0000000..ffba40b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Mean.cpp @@ -0,0 +1,227 @@ +#include "geometry/Metrics.hpp" +#include "geometry/Basics.hpp" +#include "geometry/Geodesic.hpp" +#include "geometry/Distance.hpp" +#include "geometry/Mean.hpp" +#include +#include + +namespace Geometry { + +//static const double EPSILON = 0.000000001; // 10^{-9} +static const double EPSILON = 0.0001; // 10^{-4} +static const size_t ITER_MAX = 50; + +//--------------------------------------------------------------------------------------------------- +bool Mean(const std::vector& covs, Eigen::MatrixXd& mean, const EMetric metric) +{ + if (covs.empty()) { return false; } // If no matrix in vector + if (covs.size() == 1) // If just one matrix in vector + { + mean = covs[0]; + return true; + } + if (!HaveSameSize(covs)) + { + std::cout << "Matrices haven't same size." << std::endl; + return false; + } + + // Force Square Matrix for non Euclidian and non Identity metric + if (!IsSquare(covs[0]) && (metric != EMetric::Euclidian && metric != EMetric::Identity)) + { + std::cout << "Non Square Matrix is invalid with " << toString(metric) << " metric." << std::endl; + return false; + } + + switch (metric) // Switch method + { + case EMetric::Riemann: return MeanRiemann(covs, mean); + case EMetric::Euclidian: return MeanEuclidian(covs, mean); + case EMetric::LogEuclidian: return MeanLogEuclidian(covs, mean); + case EMetric::LogDet: return MeanLogDet(covs, mean); + case EMetric::Kullback: return MeanKullback(covs, mean); + case EMetric::ALE: return MeanALE(covs, mean); + case EMetric::Harmonic: return MeanHarmonic(covs, mean); + case EMetric::Wasserstein: return MeanWasserstein(covs, mean); + case EMetric::Identity: + default: return MeanIdentity(covs, mean); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool AJDPham(const std::vector& covs, Eigen::MatrixXd& ajd, double /*epsilon*/, const int /*maxIter*/) +{ + MeanIdentity(covs, ajd); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MeanRiemann(const std::vector& covs, Eigen::MatrixXd& mean) +{ + const size_t k = covs.size(), n = covs[0].rows(); // Number of Matrix & Features => K & N + size_t i = 0; // Index of Covariance Matrix => i + double nu = 1.0, // Coefficient change => nu + tau = std::numeric_limits::max(), // Coefficient change criterion => tau + crit = std::numeric_limits::max(); // Current change => crit + if (!MeanEuclidian(covs, mean)) { return false; } // Initial Mean + + while (i < ITER_MAX && EPSILON < crit && EPSILON < nu) // Stopping criterion + { + i++; // Iteration Criterion + const Eigen::MatrixXd sC = mean.sqrt(), isC = sC.inverse(); // Square root & Inverse Square root of Mean => sC & isC + Eigen::MatrixXd mJ = Eigen::MatrixXd::Zero(n, n); // Change => J + for (const auto& cov : covs) { mJ += (isC * cov * isC).log(); } // Sum of log(isC*Ci*isC) + mJ /= double(k); // Normalization + crit = mJ.norm(); // Current change criterion + mean = sC * (nu * mJ).exp() * sC; // Update Mean => M = sC * exp(nu*J) * sC + + const double h = nu * crit; // Update Coefficient change + if (h < tau) + { + nu *= 0.95; + tau = h; + } + else { nu *= 0.5; } + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MeanEuclidian(const std::vector& covs, Eigen::MatrixXd& mean) +{ + const size_t k = covs.size(), n = covs[0].rows(); // Number of Matrix & Features => K & N + mean = Eigen::MatrixXd::Zero(n, n); // Initial Mean + for (const auto& cov : covs) { mean += cov; } // Sum of Ci + mean /= double(k); // Normalization + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MeanLogEuclidian(const std::vector& covs, Eigen::MatrixXd& mean) +{ + const size_t k = covs.size(), n = covs[0].rows(); // Number of Matrix & Features => K & N + mean = Eigen::MatrixXd::Zero(n, n); // Initial Mean + for (const auto& cov : covs) { mean += cov.log(); } // Sum of log(Ci) + mean = (mean / double(k)).exp(); // Normalization + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MeanLogDet(const std::vector& covs, Eigen::MatrixXd& mean) +{ + const size_t k = covs.size(), n = covs[0].rows(); // Number of Matrix & Features => K & N + size_t i = 0; // Index of Covariance Matrix => i + double crit = std::numeric_limits::max(); // Current change => crit + if (!MeanEuclidian(covs, mean)) { return false; } // Initial Mean + + while (i < ITER_MAX && EPSILON < crit) // Stopping criterion + { + i++; // Iteration Criterion + Eigen::MatrixXd mJ = Eigen::MatrixXd::Zero(n, n); // Change => J + + for (const auto& cov : covs) { mJ += (0.5 * (cov + mean)).inverse(); } // Sum of ((Ci+M)/2)^{-1} + mJ = (mJ / double(k)).inverse(); // Normalization + crit = (mJ - mean).norm(); // Current change criterion + mean = mJ; // Update mean + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MeanKullback(const std::vector& covs, Eigen::MatrixXd& mean) +{ + Eigen::MatrixXd m1, m2; + if (!MeanEuclidian(covs, m1)) { return false; } + if (!MeanHarmonic(covs, m2)) { return false; } + if (!GeodesicRiemann(m1, m2, mean, 0.5)) { return false; } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MeanWasserstein(const std::vector& covs, Eigen::MatrixXd& mean) +{ + const size_t k = covs.size(), n = covs[0].rows(); // Number of Matrix & Features => K & N + size_t i = 0; // Index of Covariance Matrix => i + double crit = std::numeric_limits::max(); // Current change => crit + + if (!MeanEuclidian(covs, mean)) { return false; } // Initial Mean + Eigen::MatrixXd sC = mean.sqrt(); // Square root of Mean => sC + + while (i < ITER_MAX && EPSILON < crit) // Stopping criterion + { + i++; // Iteration Criterion + Eigen::MatrixXd mJ = Eigen::MatrixXd::Zero(n, n); // Change => J + + for (const auto& cov : covs) { mJ += (sC * cov * sC).sqrt(); } // Sum of sqrt(sC*Ci*sC) + mJ /= double(k); // Normalization + + const Eigen::MatrixXd sJ = mJ.sqrt(); // Square root of change => sJ + crit = (sJ - sC).norm(); // Current change criterion + sC = sJ; // Update sC + } + mean = sC * sC; // Un-square root + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MeanALE(const std::vector& covs, Eigen::MatrixXd& mean) +{ + const size_t k = covs.size(), n = covs[0].rows(); // Number of Matrix & Features => K & N + size_t i = 0; // Index of Covariance Matrix => i + double crit = std::numeric_limits::max(); // Change criterion => crit + if (!AJDPham(covs, mean)) { return false; } // Initial Mean + Eigen::MatrixXd mJ; // Change + + while (i < ITER_MAX && EPSILON < crit) // Stopping criterion + { + i++; // Iteration Criterion + mJ = Eigen::MatrixXd::Zero(n, n); // Change => J + + for (const auto& cov : covs) { mJ += (mean.transpose() * cov * mean).log(); } // Sum of log(C^T*Ci*C) + mJ /= double(k); // Normalization + + Eigen::MatrixXd update = mJ.exp().diagonal().asDiagonal(); // Update Form => U + mean = mean * update.sqrt().inverse(); // Update Mean M = M * U^{-1/2} + + crit = DistanceRiemann(Eigen::MatrixXd::Identity(n, n), update); + } + + mJ = Eigen::MatrixXd::Zero(n, n); // Last Change => J + for (const auto& cov : covs) { mJ += (mean.transpose() * cov * mean).log(); } // Sum of log(C^T*Ci*C) + mJ /= double(k); // Normalization + + Eigen::MatrixXd mA = mean.inverse(); + mean = mA.transpose() * mJ.exp() * mA; + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MeanHarmonic(const std::vector& covs, Eigen::MatrixXd& mean) +{ + const size_t k = covs.size(), n = covs[0].rows(); // Number of Matrix & Features => K & N + mean = Eigen::MatrixXd::Zero(n, n); // Initial Mean + for (const auto& cov : covs) { mean += cov.inverse(); } // Sum of Inverse + mean = (mean / double(k)).inverse(); // Normalization and inverse + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MeanIdentity(const std::vector& covs, Eigen::MatrixXd& mean) +{ + mean = Eigen::MatrixXd::Identity(covs[0].rows(), covs[0].cols()); + return true; +} +//--------------------------------------------------------------------------------------------------- + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/Median.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Median.cpp new file mode 100644 index 0000000..f861992 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Median.cpp @@ -0,0 +1,151 @@ +#include "geometry/Median.hpp" + +#include + +#include "geometry/Basics.hpp" +#include "geometry/Featurization.hpp" +#include "geometry/Mean.hpp" + +namespace Geometry { + +//--------------------------------------------------------------------------------------------------- +double Median(const Eigen::MatrixXd& m) +{ + const std::vector v(m.data(), m.data() + m.rows() * m.cols()); + return Median(v); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool Median(const std::vector& matrices, Eigen::MatrixXd& median, const double epsilon, const size_t maxIter, const EMetric& metric) +{ + if (matrices.empty()) { return false; } // If no matrix in vector + if (matrices.size() == 1) // If just one matrix in vector + { + median = matrices[0]; + return true; + } + if (!HaveSameSize(matrices)) // If different sizes + { + std::cout << "Matrices have different sizes." << std::endl; + return false; + } + if (!IsSquare(matrices[0]) && metric == EMetric::Riemann) // If non square for Riemann metric + { + std::cout << "Non Square Matrix is invalid with " << toString(metric) << " metric." << std::endl; + return false; + } + + switch (metric) + { + case EMetric::Riemann: return MedianRiemann(matrices, median, epsilon, maxIter); + case EMetric::Euclidian: return MedianEuclidian(matrices, median, epsilon, maxIter); + case EMetric::Identity: return MedianIdentity(matrices, median); + case EMetric::LogEuclidian: + case EMetric::LogDet: + case EMetric::Kullback: + case EMetric::ALE: + case EMetric::Harmonic: + case EMetric::Wasserstein: + std::cout << toString(metric) << " metric not implemented." << std::endl; + return false; + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MedianEuclidian(const std::vector& matrices, Eigen::MatrixXd& median, const double epsilon, const size_t maxIter) +{ + if (matrices.empty() || matrices[0].size() == 0) { return false; } + const size_t n = matrices.size(); // Number of sample + + // Initial Median is the median of each channel in all matrix of dataset + median = matrices[0]; // to copy size + for (size_t i = 0; i < size_t(median.size()); ++i) + { + std::vector tmp; + tmp.reserve(n); // Reserve to optimize (a little) the pushback memory access. + for (const auto& cov : matrices) { tmp.push_back(cov.data()[i]); } // Stack value number i of all matrix + median.data()[i] = Median(tmp); + } + + size_t iter = 0; // number of iteration + double gain = epsilon; // Gain since last compute + while (iter < maxIter && gain >= epsilon) + { + Eigen::MatrixXd prev = median; // Keep old median + median.setZero(); // Reset median + double sumCoefs = 0; // Sum of Coefficient + for (const auto& cov : matrices) + { + //Eigen::MatrixXd difference = cov - prev; + //double coef = sqrt(difference.cwiseProduct(difference).sum()); + if (cov.isApprox(prev)) { continue; } // In this case, Median is exactly this current matrix so we don't consider this matrix + double coef = (cov - prev).norm(); + // Personnal hack and security + coef = 1.0 / coef; + sumCoefs += coef; // Sum for normalization + median += coef * cov; // Add to the new median + } + if (sumCoefs > 0.0) { median /= sumCoefs; } // Normalize + + gain = (median - prev).norm() / median.norm(); // It's the Frobenius norm + iter++; + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MedianRiemann(const std::vector& matrices, Eigen::MatrixXd& median, const double epsilon, const size_t maxIter) +{ + if (matrices.empty() || !IsSquare(matrices[0])) { return false; } + const size_t n = matrices.size(); // Number of sample + const size_t nf = matrices[0].rows() * (matrices[0].rows() + 1) / 2; // Number of Features in tangent space + size_t iter = 0; // number of iteration + if (!MeanEuclidian(matrices, median)) { return false; } // Initialize Median + + double gain = epsilon; // Gain since last compute + std::vector mats; + mats.reserve(n); + for (const auto& m : matrices) { mats.push_back(m); } + while (iter < maxIter) + { + // Compute Tangent space of all matrices & sum of euclidian distance of each transposed matrix + std::vector ts(n); + double sum = 0.0; + for (size_t i = 0; i < n; ++i) + { + if (!TangentSpace(mats[i], ts[i], median)) { return false; } + sum += sqrt(ts[i].cwiseAbs2().sum()); + } + if (std::abs((sum - gain) / gain) < epsilon) { break; } // std::abs call fabs to keep type + + // Arithmetic median in tangent space + std::vector> transposeTs(nf, std::vector(n)); + Eigen::RowVectorXd featureMedian(nf); + for (size_t i = 0; i < n; ++i) { for (size_t j = 0; j < nf; ++j) { transposeTs[j][i] = ts[i][j]; } } + for (size_t j = 0; j < nf; ++j) { featureMedian[j] = Median(transposeTs[j]); } + + // back to the manifold + Eigen::MatrixXd tmp; + if (!UnTangentSpace(featureMedian, tmp, median)) { return false; } + gain = sum; // Update gain + median = tmp; // Update Median + iter++; + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MedianIdentity(const std::vector& matrices, Eigen::MatrixXd& median) +{ + median = Eigen::MatrixXd::Identity(matrices[0].rows(), matrices[0].cols()); + return true; +} +//--------------------------------------------------------------------------------------------------- + + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/Misc.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Misc.cpp new file mode 100644 index 0000000..16a3417 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/Misc.cpp @@ -0,0 +1,243 @@ +#include "geometry/Misc.hpp" +#include "geometry/Featurization.hpp" + +#include +#include // std::iota + +namespace Geometry { + +///------------------------------------------------------------------------------------------------- +/// Get the sign of the specified value. +/// The value. +/// 1 if x > 0, 0 if x == 0, -1 if x < 0. +template +int sgn(T x) { return (T(0) < x) - (x < T(0)); } +///------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +/// Structure used for iota function for range of double. +struct SDoubleIota +{ + explicit SDoubleIota(const double init = 0.0, const double inc = 1.0) : v(init), inc(inc) {} + + operator double() const { return v; } // don't add explicit qualifier for iota functions (were template cast is used) + SDoubleIota& operator++() + { + v += inc; + return *this; + } + double v; + double inc; +}; + +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +/// Structure used for iota function for range of round index. +struct SRoundIndex +{ + explicit SRoundIndex(const double init = 0.0, const double inc = 1.0) : v(init), inc(inc) {} + + operator size_t() const { return size_t(std::round(v)); } // don't add explicit qualifier for iota functions (were template cast is used) + SRoundIndex& operator++() + { + v += inc; + return *this; + } + double v; + double inc; +}; + +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +std::vector doubleRange(const double begin, const double end, const double step, const bool closed) +{ + std::vector res; + if (end < begin) { return res; } + const double size = (end - begin) / step; + // check if the end is inclued in range for size, we ceil for no modulo values and add the last value to the range + res.resize(size_t(std::ceil((closed && std::trunc(size) == size) ? size + 1 : size))); + std::iota(res.begin(), res.end(), SDoubleIota(begin, step)); + + return res; +} + +//--------------------------------------------------------------------------------------------------- +std::vector RoundIndexRange(const double begin, const double end, const double step, const bool closed, const bool unique) +{ + std::vector res; + if (end < begin) { return res; } + const double size = (end - begin) / step; + // check if the end is inclued in range for size, we ceil for no modulo values and add the last value to the range + res.resize(size_t(std::ceil((closed && std::trunc(size) == size) ? size + 1 : size))); + std::iota(res.begin(), res.end(), SRoundIndex(begin, step)); + + if (unique) + { + const auto last = std::unique(res.begin(), res.end()); // Remove duplicate values (but after last, we have undefined value) + res.erase(last, res.end()); // Resize Vector (we erase after last) + } + return res; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +std::vector BinHist(const std::vector& dataset, const size_t n) +{ + std::vector res(n, 0); + const double max = *std::max_element(dataset.begin(), dataset.end()); + if (max == 0) { return res; } // if max is 0, coef can't be compute + const double coef = n / max; + for (const auto& data : dataset) + { + const size_t bin = size_t(std::floor(data * coef)); + if (bin < n) { res[bin]++; } + else if (bin == n) { res[n - 1]++; } // if this data is equal to max + } + return res; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool FitDistribution(const std::vector& values, double& mu, double& sigma, const std::vector& betas, const double minQuant, + const double maxQuant, const double minClean, const double maxDropout, const double stepBound, const double stepScale) +{ + if (values.empty() || betas.empty() || minQuant < 0 || minQuant > 1 || maxQuant < 0 || maxQuant > 1 || minClean < 0 || maxDropout < 0 + || stepBound < 0.0001 || stepBound > 0.1 || stepScale < 0.0001 || stepScale > 0.1) { return false; } + + //========== Scales ========== + const size_t nBeta = betas.size(); + // Scales is a vector for each beta as : + // scale = beta/(2*gamma(1/beta)) with gamma the function as gamma(n) = (n-1)! for all integer greater than 0 + std::vector scales; + scales.reserve(nBeta); + std::transform(betas.begin(), betas.end(), std::back_inserter(scales), [](const double beta) -> double { return beta / (2 * tgamma(1 / beta)); }); + + //========== zBounds ========== + // zBounds is a vector of lower and upper bounds for each beta as : sign(quants-1/2) * gammaincinv(sign(quants-1/2) * (2*quants-1), 1/beta)^(1/beta); + // with gammaincinv the Inverse incomplete gamma function, here quants are the quantiles limit (by default [0.022 0.6]) + std::vector> zBounds(nBeta); + const int signMin = sgn(minQuant - 0.5), signMax = sgn(maxQuant - 0.5); + const double coefMin = signMin * (2 * minQuant - 1), coefMax = signMax * (2 * maxQuant - 1); + + for (size_t i = 0; i < nBeta; ++i) + { + if (betas[i] == 0) { zBounds[i] = { 0, 0 }; } + else + { + const double beta = 1 / betas[i]; + zBounds[i] = { + signMin * pow(boost::math::gamma_p_inv(beta, coefMin), beta), + signMax * pow(boost::math::gamma_p_inv(beta, coefMax), beta) + }; + } + } + + //========== Sort Values ========== + // We sort values to access quantiles directly + const size_t n = values.size(); + std::vector newValues = values; + std::sort(newValues.begin(), newValues.end()); + + //========== Compute Index range ========== + // Width are the limit if all data is clean or artifacted. It's usefull for the for loop limit and step for each width possible + // Bounds are the range of begining value used to compute mu and sigma. It's usefull for the for loop limit and step for first index of value to take + // We create Vector for widths and bounds to precompute all round and avoid duplicate indexes in widths or bounds + std::vector widths = RoundIndexRange(n * (maxQuant - minQuant) * minClean, n * (maxQuant - minQuant), n * stepScale, true, false); + std::reverse(widths.begin(), widths.end()); + const std::vector bounds = RoundIndexRange(n * minQuant, n * (minQuant + maxDropout), n * stepBound, true, false); + const size_t maxWidth = std::max(widths.front(), widths.back()); // to prevent if widths is in descending or ascending order + const size_t nBound = bounds.size(); + + //========== Compute Grid (with index range) ========== + // Create the Biggest table of data with width in column and bound in row + std::vector> grid(nBound); + std::vector firsts(nBound); + for (size_t i = 0; i < nBound; ++i) + { + grid[i].reserve(maxWidth); + const auto first = newValues.begin() + bounds[i]; + std::copy_n(first, maxWidth, std::back_inserter(grid[i])); + firsts[i] = grid[i][0]; + for (auto& e : grid[i]) { e -= firsts[i]; } // Substract first value on all element + } + + //========== Width Loop ========== + double bestKl = std::numeric_limits::max(); + size_t bestBeta = 0, bestId = 0, bestWidth = 0; + // for each interval width... + for (const auto& w : widths) + { + const size_t nbins = size_t(std::round(3 * log2(1 + (double(w) / 2)))); + + //========== Compute Histogramm ========== + std::vector> hist(nBound); + for (size_t i = 0; i < nBound; ++i) + { + hist[i].reserve(nbins); + std::vector tmp = BinHist(std::vector(grid[i].begin(), grid[i].begin() + w), nbins); + std::transform(tmp.begin(), tmp.end(), std::back_inserter(hist[i]), [](const size_t e) -> double { return log(e + 0.01); }); + } + + //========== Beta Loop ========== + for (size_t b = 0; b < nBeta; ++b) + { + //========== Compute Probability ========== + std::vector prob(nbins); + double sumprob = 0.0; + for (size_t i = 0; i < nbins; ++i) + { + prob[i] = std::exp(-std::pow(std::abs(zBounds[b][0] + (((i + 0.5) / nbins) * (zBounds[b][1] - zBounds[b][0]))), betas[b])) * scales[b]; + sumprob += prob[i]; + } + if (sumprob != 0) { for (auto& p : prob) { p /= sumprob; } } + + //========== Compute the Kullback-Leibler divergences ========== + //kl = sum(prob * (log(prob) - hist)) + log(w)); + std::vector kl(nBound, log(w)); + for (size_t i = 0; i < nBound; ++i) { for (size_t j = 0; j < nbins; ++j) { kl[i] += prob[j] * (log(prob[j]) - hist[i][j]); } } + + // Update Parameters + auto minIt = std::min_element(kl.begin(), kl.end()); + if (*minIt < bestKl) + { + bestKl = *minIt; + bestBeta = b; + bestId = minIt - kl.begin(); + bestWidth = w - 1; + } + } + } + + double alpha = grid[bestId][bestWidth] / (zBounds[bestBeta][1] - zBounds[bestBeta][0]); + double beta = betas[bestBeta]; + + mu = firsts[bestId] - zBounds[bestBeta][0] * alpha; + sigma = sqrt(alpha * alpha * std::tgamma(3 / beta) / std::tgamma(1 / beta)); + + return true; +} +//--------------------------------------------------------------------------------------------------- +void sortedEigenVector(const Eigen::MatrixXd& matrix, Eigen::MatrixXd& vectors, std::vector& values, const EMetric /*metric*/) +{ + // Compute Eigen Vector/Values + const Eigen::EigenSolver es(matrix); + const Eigen::MatrixXd tmpVec = es.eigenvectors().real(); // It's complex by default but all imaginary part are 0 + const Eigen::MatrixXd tmpVal = es.eigenvalues().real(); // It's complex by default but all imaginary part are 0 + values = std::vector(tmpVal.data(), tmpVal.data() + tmpVal.size()); + + // Get order of eigen values. + std::vector idx(values.size()); + std::iota(idx.begin(), idx.end(), 0); + std::stable_sort(idx.begin(), idx.end(), [&values](const size_t i1, const size_t i2) { return values[i1] < values[i2]; }); + // Sort Eigen Values + std::stable_sort(values.begin(), values.end()); + + // Sort Eigen Vector + vectors = tmpVec; // copy matrix to set size easily + for (size_t i = 0; i < size_t(tmpVec.cols()); ++i) { vectors.col(i) = tmpVec.col(idx[i]); } +} +//--------------------------------------------------------------------------------------------------- + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/artifacts/CASR.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/artifacts/CASR.cpp new file mode 100644 index 0000000..ca31f37 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/artifacts/CASR.cpp @@ -0,0 +1,278 @@ +#include "geometry/artifacts/CASR.hpp" + +#include "geometry/Misc.hpp" +#include "geometry/Median.hpp" +#include "geometry/Covariance.hpp" +#include "geometry/Mean.hpp" +#include "geometry/classifier/IMatrixClassifier.hpp" + +#include +#include + +#include +#include +#include + +namespace Geometry { + +///------------------------------------------------------------------------------------------------- +bool CASR::train(const std::vector& dataset, const double rejectionLimit) +{ + if (dataset.empty() || dataset[0].size() == 0) { return false; } + const size_t n = dataset.size(); // Number of samples + m_nChannel = dataset[0].rows(); // Number of channels + + //========== Compute the covariance matrix ========== + std::vector covs(n); + //for (size_t i = 0; i < n; ++i) { if (!CovarianceMatrixLWF(dataset[i], covs[i])) { return false; } } // We assume data is centered + for (size_t i = 0; i < n; ++i) { if (!CovarianceMatrix(dataset[i], covs[i], EEstimator::LWF, EStandardization::Center)) { return false; } } + + //========== Compute Square Root of Median ========== + if (!Median(covs, m_median)) { return false; } // Geometric median independant of metric + m_median = m_median.sqrt(); + + //========== Compute Eigen vectors ========== + Eigen::MatrixXd eigVector; + std::vector eigValues; + sortedEigenVector(m_median, eigVector, eigValues, m_metric); //Actually only Euclidian metric is implemented + + //========== Compute the ponderate dataset ========== + std::vector newDataset; + newDataset.reserve(n); + for (const auto& m : dataset) { newDataset.push_back((m.transpose() * eigVector)); } // Multiply by eigen vector (we transpose to have channels in column + for (auto& m : newDataset) { m = m.cwiseProduct(m); } // Square new signal + + //========== Compute the "fit" distribution ========== + // Compute the RMS of each channel for each sample + std::vector> rms(m_nChannel, std::vector(n)); + for (size_t i = 0; i < n; ++i) { for (size_t j = 0; j < m_nChannel; ++j) { rms[j][i] = sqrt(newDataset[i].col(j).mean()); } } + + // Compute the "fit" distribution + std::vector mu(m_nChannel, 0.0), sigma(m_nChannel, 0.0); + for (size_t i = 0; i < m_nChannel; ++i) { FitDistribution(rms[i], mu[i], sigma[i]); } + + // Compute the threshold Matrix + m_threshold = Eigen::MatrixXd::Zero(m_nChannel, m_nChannel); + for (size_t i = 0; i < m_nChannel; ++i) { m_threshold(i, i) = mu[i] + rejectionLimit * sigma[i]; } + m_threshold *= eigVector.transpose(); + + // Initialize Reconstruction matrix and trivial + m_r = Eigen::MatrixXd::Identity(m_nChannel, m_nChannel); + m_trivial = true; + return true; +} + +bool CASR::process(const Eigen::MatrixXd& in, Eigen::MatrixXd& out) +{ + // Check if input data is compatible with training data and if we don't limit so much the reconstruction + out = in; + if (size_t(out.rows()) != m_nChannel) { return false; } + const size_t begin = size_t((1.0 - m_maxChannel) * double(m_nChannel)); // We define the number of channels to non reconstruct + if (begin == m_nChannel) { return true; } + if (m_r.size() == 0) { m_r = Eigen::MatrixXd::Identity(m_nChannel, m_nChannel); } + + // Compute Covariance matrix + Eigen::MatrixXd cov; + if (!CovarianceMatrix(in, cov, EEstimator::LWF, EStandardization::Center)) { return false; } + if (m_cov.size() == 0) { m_cov = cov; } // if first time + else { if (!Mean({ m_cov, cov }, m_cov, m_metric)) { return false; } } // else mean of the both + + // Compute Eigen vector & values + Eigen::MatrixXd eigVector; + std::vector eigValues; + sortedEigenVector(m_cov, eigVector, eigValues, m_metric); + + // Check if eigen values is over threshold computed during train (ponderated by eigen vector) + Eigen::MatrixXd threshold = (m_threshold * eigVector).cwiseAbs2(); + bool trivial = true; + std::vector keep(m_nChannel, true); + for (size_t i = begin; i < m_nChannel; ++i) + { + if (eigValues[i] >= threshold.col(i).sum()) + { + keep[i] = false; + trivial = false; + } + } + + // Check if All channels are clean + if (trivial) { m_r = Eigen::MatrixXd::Identity(m_nChannel, m_nChannel); } + else // if not... + { + // Compute the reconstruction matrix with bad channels + Eigen::MatrixXd tmp = eigVector.transpose() * m_median; + for (size_t i = begin; i < m_nChannel; ++i) { if (!keep[i]) { tmp.row(i).setZero(); } } + const Eigen::MatrixXd newR = m_median * tmp.completeOrthogonalDecomposition().pseudoInverse() * eigVector.transpose(); + + if (!m_trivial) + { + // Compute blend values for the samples + const size_t nSample = in.cols(); + std::vector blend(nSample); + std::iota(blend.begin(), blend.end(), 1); // Range 1 to nSample (inclued) + for (auto& b : blend) { b = (1 - cos(M_PI * (b / double(nSample)))) / 2.0; } + + // Apply reconstruction ponderate by the blend (we considere the old reconstruction matrix for the second part) + Eigen::MatrixXd t1 = newR * in; + Eigen::MatrixXd t2 = m_r * in; + for (size_t i = 0; i < nSample; ++i) { out.col(i) = (blend[i] * t1.col(i)) + ((1 - blend[i]) * t2.col(i)); } + } + m_r = newR; // Update the reconstruction matrix + } + m_trivial = trivial; + return true; +} + +///------------------------------------------------------------------------------------------------- + +bool CASR::setMatrices(const Eigen::MatrixXd& median, const Eigen::MatrixXd& threshold, const Eigen::MatrixXd& reconstruct, + const Eigen::MatrixXd& covariance) +{ + if (!IsSquare(median) || !HaveSameSize(median, threshold) + || (reconstruct.size() != 0 && !HaveSameSize(median, reconstruct)) + || (covariance.size() != 0 && !HaveSameSize(median, covariance))) + { + std::cout << "All matrices must be square with same size (or empty for reconstruct and covariance matrix" << std::endl; + return false; + } + m_nChannel = median.rows(); + m_median = median; + m_threshold = threshold; + m_r = reconstruct.size() != 0 ? reconstruct : Eigen::MatrixXd::Identity(m_nChannel, m_nChannel); + m_cov = covariance; + m_trivial = true; + return true; +} +///------------------------------------------------------------------------------------------------- + +//*********************** +//***** XML Manager ***** +//*********************** + +///------------------------------------------------------------------------------------------------- +bool CASR::saveXML(const std::string& filename) const +{ + tinyxml2::XMLDocument doc; + // Create Root + tinyxml2::XMLNode* root = doc.NewElement("ASR"); // Create root node + doc.InsertFirstChild(root); // Add root to XML + + tinyxml2::XMLElement* data = doc.NewElement("ASR-data"); // Create data node + data->SetAttribute("metric", toString(m_metric).c_str()); // Set attribute metric + data->SetAttribute("nChannel", int(m_nChannel)); // Set attribute nCHannel + data->SetAttribute("maxChannel", int(m_maxChannel)); // Set attribute nCHannel + data->SetAttribute("trivial", m_trivial); // Set attribute nCHannel + + tinyxml2::XMLElement* median = doc.NewElement("Median"); // Create Median node + if (!IMatrixClassifier::saveMatrix(median, m_median)) { return false; } // Save Median Matrix + data->InsertEndChild(median); // Add Median node to data node + + tinyxml2::XMLElement* threshold = doc.NewElement("Threshold"); // Create Median node + if (!IMatrixClassifier::saveMatrix(threshold, m_threshold)) { return false; } // Save Median Matrix + data->InsertEndChild(threshold); // Add Median node to data node + + tinyxml2::XMLElement* r = doc.NewElement("R"); // Create Median node + if (!IMatrixClassifier::saveMatrix(r, m_r)) { return false; } // Save Median Matrix + data->InsertEndChild(r); // Add Median node to data node + + tinyxml2::XMLElement* cov = doc.NewElement("Cov"); // Create Median node + if (!IMatrixClassifier::saveMatrix(cov, m_cov)) { return false; } // Save Median Matrix + data->InsertEndChild(cov); // Add Median node to data node + + root->InsertEndChild(data); // Add data to root + return doc.SaveFile(filename.c_str()) == 0; // save XML (if != 0 it means error) +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CASR::loadXML(const std::string& filename) +{ + // Load File + tinyxml2::XMLDocument xmlDoc; + if (xmlDoc.LoadFile(filename.c_str()) != 0) { return false; } // Check File Exist and Loading + + // Load Root + tinyxml2::XMLNode* root = xmlDoc.FirstChild(); // Get Root Node + if (root == nullptr) { return false; } // Check Root Node Exist + + // Load Data + tinyxml2::XMLElement* data = root->FirstChildElement("ASR-data"); // Get Data Node + if (data == nullptr) { return false; } // Check Root Node Exist + m_metric = StringToMetric(std::string(data->Attribute("metric"))); + m_nChannel = data->IntAttribute("nChannel"); + m_maxChannel = data->IntAttribute("maxChannel"); + m_trivial = data->BoolAttribute("trivial"); + + tinyxml2::XMLElement* element = data->FirstChildElement("Median"); // Get Median Node + if (element == nullptr) { return false; } // Check if Node Exist + if (!IMatrixClassifier::loadMatrix(element, m_median)) { return false; } // Load Median Matrix + + element = data->FirstChildElement("Threshold"); // Get Threshold Node + if (element == nullptr) { return false; } // Check if Node Exist + if (!IMatrixClassifier::loadMatrix(element, m_threshold)) { return false; } // Load Threshold Matrix + + element = data->FirstChildElement("R"); // Get R Node + if (element == nullptr) { return false; } // Check if Node Exist + if (!IMatrixClassifier::loadMatrix(element, m_r)) { return false; } // Load R Matrix + + element = data->FirstChildElement("Cov"); // Get Cov Node + if (element == nullptr) { return false; } // Check if Node Exist + if (!IMatrixClassifier::loadMatrix(element, m_cov)) { return false; } // Load Cov Matrix + + return true; +} +///------------------------------------------------------------------------------------------------- + +//***************************** +//***** Override Operator ***** +//***************************** + +///------------------------------------------------------------------------------------------------- +bool CASR::isEqual(const CASR& obj, const double precision) const +{ + return m_metric == obj.m_metric && m_nChannel == obj.m_nChannel + && abs(m_maxChannel - obj.m_maxChannel) < precision && m_trivial == obj.m_trivial + && AreEquals(m_median, obj.m_median, precision) && AreEquals(m_threshold, obj.m_threshold, precision) + && AreEquals(m_r, obj.m_r, precision) && AreEquals(m_cov, obj.m_cov, precision); +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +void CASR::copy(const CASR& obj) +{ + m_metric = obj.m_metric; + m_nChannel = obj.m_nChannel; + m_maxChannel = obj.m_maxChannel; + m_trivial = obj.m_trivial; + m_median = obj.m_median; + m_threshold = obj.m_threshold; + m_r = obj.m_r; + m_cov = obj.m_cov; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +std::stringstream CASR::print() const +{ + std::stringstream ss; + ss << "Metric : " << toString(m_metric) << std::endl; + if (m_nChannel == 0) { ss << "Training not done" << std::endl; } + else + { + ss << "Training done." << std::endl; + ss << size_t(m_maxChannel * double(m_nChannel)) << "/" << m_nChannel << " channels can be reconstruted." << std::endl; + ss << "Median matrix is : " << std::endl << m_median << std::endl; + ss << "Threshold matrix is : " << std::endl << m_threshold << std::endl; + if (m_cov.size() == 0) { ss << "No process launched yet." << std::endl; } + else + { + ss << "Last sample " << (m_trivial ? "was" : "wasn't") << " trivial." << std::endl; + ss << "Last Reconstruction Matrix : " << std::endl << m_r << std::endl; + ss << "Last Covariance Matrix : " << std::endl << m_cov << std::endl; + } + } + return ss; +} +///------------------------------------------------------------------------------------------------- + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CBias.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CBias.cpp new file mode 100644 index 0000000..9ef3529 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CBias.cpp @@ -0,0 +1,146 @@ +#include "geometry/classifier/CBias.hpp" +#include "geometry/classifier/IMatrixClassifier.hpp" +#include "geometry/Mean.hpp" +#include "geometry/Basics.hpp" +#include "geometry/Geodesic.hpp" +#include // SQRT of Matrix +#include + +namespace Geometry { + +///------------------------------------------------------------------------------------------------- +bool CBias::computeBias(const std::vector>& dataset, const EMetric metric) { return computeBias(Vector2DTo1D(dataset), metric); } +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CBias::computeBias(const std::vector& dataset, const EMetric metric) +{ + if (!Mean(dataset, m_bias, metric)) { return false; } // Compute Bias reference + m_biasIS = m_bias.sqrt().inverse(); // Inverse Square root of Bias matrix => isR + m_n = 0; + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +void CBias::applyBias(const std::vector>& in, std::vector>& out) +{ + const size_t n = in.size(); + out.resize(n); + for (size_t i = 0; i < n; ++i) { applyBias(in[i], out[i]); } +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +void CBias::applyBias(const std::vector& in, std::vector& out) +{ + const size_t n = in.size(); + out.resize(n); + for (size_t i = 0; i < n; ++i) { applyBias(in[i], out[i]); } +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +void CBias::applyBias(const Eigen::MatrixXd& in, Eigen::MatrixXd& out) { out = m_biasIS * in * m_biasIS.transpose(); } +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +void CBias::updateBias(const Eigen::MatrixXd& sample, const EMetric metric) +{ + m_n++; // Update number of classify + if (m_n == 1) { m_bias = sample; } // At the first pass we reinitialize the Bias + else { Geodesic(m_bias, sample, m_bias, metric, 1.0 / m_n); } + m_biasIS = m_bias.sqrt().inverse(); // Inverse Square root of Bias matrix => isR +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +void CBias::setBias(const Eigen::MatrixXd& bias) +{ + m_bias = bias; + m_biasIS = m_bias.sqrt().inverse(); +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CBias::saveXML(const std::string& filename) const +{ + tinyxml2::XMLDocument xmlDoc; + // Create Root + tinyxml2::XMLNode* root = xmlDoc.NewElement("Bias"); // Create root node + xmlDoc.InsertFirstChild(root); // Add root to XML + + tinyxml2::XMLElement* data = xmlDoc.NewElement("Bias-data"); // Create data node + if (!saveAdditional(xmlDoc, data)) { return false; } // Save Optionnal Informations + + root->InsertEndChild(data); // Add data to root + return xmlDoc.SaveFile(filename.c_str()) == 0; // save XML (if != 0 it means error) +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CBias::loadXML(const std::string& filename) +{ + // Load File + tinyxml2::XMLDocument xmlDoc; + if (xmlDoc.LoadFile(filename.c_str()) != 0) { return false; } // Check File Exist and Loading + + // Load Root + tinyxml2::XMLNode* root = xmlDoc.FirstChild(); // Get Root Node + if (root == nullptr) { return false; } // Check Root Node Exist + + // Load Data + tinyxml2::XMLElement* data = root->FirstChildElement("Bias-data"); // Get Data Node + if (!loadAdditional(data)) { return false; } // Load Optionnal Informations + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CBias::saveAdditional(tinyxml2::XMLDocument& doc, tinyxml2::XMLElement* data) const +{ + tinyxml2::XMLElement* bias = doc.NewElement("Bias"); // Create Bias node + bias->SetAttribute("n", int(m_n)); // Set attribute class number of trials + if (!IMatrixClassifier::saveMatrix(bias, m_bias)) { return false; } // Save class + data->InsertEndChild(bias); // Add class node to data node + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CBias::loadAdditional(tinyxml2::XMLElement* data) +{ + tinyxml2::XMLElement* bias = data->FirstChildElement("Bias"); // Get LDA Weight Node + m_n = bias->IntAttribute("n"); // Get the number of Trials for this class + if (!IMatrixClassifier::loadMatrix(bias, m_bias)) { return false; } // Load Reference Matrix + m_biasIS = m_bias.sqrt().inverse(); + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CBias::isEqual(const CBias& obj, const double precision) const { return AreEquals(m_bias, obj.m_bias, precision) && m_n == obj.m_n; } +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +void CBias::copy(const CBias& obj) +{ + m_bias = obj.m_bias; + m_biasIS = obj.m_biasIS; + m_n = obj.m_n; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +std::stringstream CBias::print() const +{ + std::stringstream ss; + ss << "Number of Classification : " << m_n << std::endl; + ss << "Bias Matrix : "; + if (m_bias.size() != 0) { ss << std::endl << m_bias.format(MATRIX_FORMAT) << std::endl; } + else { ss << "Not Computed" << std::endl; } + return ss; +} +///------------------------------------------------------------------------------------------------- + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CMatrixClassifierFgMDM.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CMatrixClassifierFgMDM.cpp new file mode 100644 index 0000000..ce5b7ba --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CMatrixClassifierFgMDM.cpp @@ -0,0 +1,41 @@ +#include "geometry/classifier/CMatrixClassifierFgMDM.hpp" +#include "geometry/Mean.hpp" + +namespace Geometry { + +///------------------------------------------------------------------------------------------------- +CMatrixClassifierFgMDM::~CMatrixClassifierFgMDM() +{ + for (auto& v : m_dataset) { v.clear(); } + m_dataset.clear(); +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierFgMDM::train(const std::vector>& dataset) +{ + m_dataset = dataset; + return train(); +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierFgMDM::classify(const Eigen::MatrixXd& sample, size_t& classId, std::vector& distance, + std::vector& probability, const EAdaptations adaptation, const size_t& realClassId) +{ + if (!CMatrixClassifierFgMDMRT::classify(sample, classId, distance, probability, EAdaptations::None)) { return false; } + + // Adaptation + if (adaptation == EAdaptations::None) { return true; } + // Get class id for adaptation and increase number of trials, expected if supervised, predicted if unsupervised + const size_t id = adaptation == EAdaptations::Supervised ? realClassId : classId; + if (id >= m_nbClass) { return false; } // Check id (if supervised and bad input) + m_nbTrials[id]++; // Update number of trials for the class id + m_dataset[id].push_back(sample); // Update the dataset + + // Retrain + return train(); +} +///------------------------------------------------------------------------------------------------- + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CMatrixClassifierFgMDMRT.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CMatrixClassifierFgMDMRT.cpp new file mode 100644 index 0000000..621ebcd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CMatrixClassifierFgMDMRT.cpp @@ -0,0 +1,121 @@ +#include "geometry/classifier/CMatrixClassifierFgMDMRT.hpp" +#include "geometry/Mean.hpp" +#include "geometry/Basics.hpp" +#include "geometry/Featurization.hpp" +#include "geometry/Classification.hpp" +#include + +namespace Geometry { + +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierFgMDMRT::train(const std::vector>& dataset) +{ + if (dataset.empty()) { return false; } + if (!Mean(Vector2DTo1D(dataset), m_ref, EMetric::Riemann)) { return false; } // Compute Reference matrix + + // Transform to the Tangent Space + const size_t nbClass = dataset.size(); + std::vector> tsSample(nbClass); + for (size_t k = 0; k < nbClass; ++k) + { + const size_t nbTrials = dataset[k].size(); + tsSample[k].resize(nbTrials); + for (size_t i = 0; i < nbTrials; ++i) { if (!TangentSpace(dataset[k][i], tsSample[k][i], m_ref)) { return false; } } + } + + // Compute FgDA Weight + if (!FgDACompute(tsSample, m_weight)) { return false; } + + // Convert dataset + std::vector> newDataset(nbClass); + std::vector> filtered(nbClass); + for (size_t k = 0; k < nbClass; ++k) + { + const size_t nbTrials = dataset[k].size(); + newDataset[k].resize(nbTrials); + filtered[k].resize(nbTrials); + for (size_t i = 0; i < nbTrials; ++i) + { + if (!FgDAApply(tsSample[k][i], filtered[k][i], m_weight)) { return false; } // Apply Filter + if (!UnTangentSpace(filtered[k][i], newDataset[k][i], m_ref)) { return false; } // Return to Matrix Space + } + } + + return CMatrixClassifierMDM::train(newDataset); // Train MDM +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierFgMDMRT::classify(const Eigen::MatrixXd& sample, size_t& classId, std::vector& distance, + std::vector& probability, const EAdaptations adaptation, const size_t& realClassId) +{ + Eigen::RowVectorXd tsSample, filtered; + Eigen::MatrixXd newSample; + + if (!TangentSpace(sample, tsSample, m_ref)) { return false; } // Transform to the Tangent Space + if (!FgDAApply(tsSample, filtered, m_weight)) { return false; } // Apply Filter + if (!UnTangentSpace(filtered, newSample, m_ref)) { return false; } // Return to Matrix Space + return CMatrixClassifierMDM::classify(newSample, classId, distance, probability, adaptation, realClassId); +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierFgMDMRT::isEqual(const CMatrixClassifierFgMDMRT& obj, const double precision) const +{ + if (!CMatrixClassifierMDM::isEqual(obj, precision)) { return false; } // Compare base members + if (!AreEquals(m_ref, obj.m_ref, precision)) { return false; } // Compare Reference + if (!AreEquals(m_weight, obj.m_weight, precision)) { return false; } // Compare Weight + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +void CMatrixClassifierFgMDMRT::copy(const CMatrixClassifierFgMDMRT& obj) +{ + CMatrixClassifierMDM::copy(obj); + m_ref = obj.m_ref; + m_weight = obj.m_weight; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierFgMDMRT::saveAdditional(tinyxml2::XMLDocument& doc, tinyxml2::XMLElement* data) const +{ + // Save Reference + tinyxml2::XMLElement* reference = doc.NewElement("Reference"); // Create Reference node + if (!saveMatrix(reference, m_ref)) { return false; } // Save class + data->InsertEndChild(reference); // Add class node to data node + + // Save Weight + tinyxml2::XMLElement* weight = doc.NewElement("Weight"); // Create LDA Weight node + if (!saveMatrix(weight, m_weight)) { return false; } // Save class + data->InsertEndChild(weight); // Add class node to data node + + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierFgMDMRT::loadAdditional(tinyxml2::XMLElement* data) +{ + // Load Reference + tinyxml2::XMLElement* ref = data->FirstChildElement("Reference"); // Get Reference Node + if (!loadMatrix(ref, m_ref)) { return false; } // Load Reference Matrix + + // Load Weight + tinyxml2::XMLElement* weight = data->FirstChildElement("Weight"); // Get LDA Weight Node + return loadMatrix(weight, m_weight); // Load LDA Weight Matrix +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +std::stringstream CMatrixClassifierFgMDMRT::printAdditional() const +{ + std::stringstream ss; + ss << "Reference matrix : " << std::endl << m_ref.format(MATRIX_FORMAT) << std::endl; // Reference + ss << "Weight matrix : " << std::endl << m_weight.format(MATRIX_FORMAT) << std::endl; // Print Weight + return ss; +} +///------------------------------------------------------------------------------------------------- + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CMatrixClassifierFgMDMRTRebias.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CMatrixClassifierFgMDMRTRebias.cpp new file mode 100644 index 0000000..f3c464a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CMatrixClassifierFgMDMRTRebias.cpp @@ -0,0 +1,85 @@ +#include "geometry/classifier/CMatrixClassifierFgMDMRTRebias.hpp" + +#include "geometry/Mean.hpp" +#include "geometry/Covariance.hpp" +#include // SQRT of Matrix + +namespace Geometry { + +//********************** +//***** Classifier ***** +//********************** +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierFgMDMRTRebias::train(const std::vector>& dataset) +{ + if (!m_bias.computeBias(dataset, m_metric)) { return false; } + std::vector> newDataset; + m_bias.applyBias(dataset, newDataset); + if (!CMatrixClassifierFgMDMRT::train(newDataset)) { return false; } // Train FgMDM + const Eigen::MatrixXd identity = Eigen::MatrixXd::Identity(m_ref.rows(), m_ref.cols()); // Identity matrix + if (AreEquals(m_ref, identity)) { m_ref = identity; } // Normally it's always the case with Identity matrix we simplify future operation + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierFgMDMRTRebias::classify(const Eigen::MatrixXd& sample, size_t& classId, std::vector& distance, + std::vector& probability, const EAdaptations adaptation, const size_t& realClassId) +{ + if (!IsSquare(sample)) { return false; } // Verification if it's a square matrix + Eigen::MatrixXd newSample; + m_bias.applyBias(sample, newSample); + m_bias.updateBias(sample, m_metric); + return CMatrixClassifierFgMDMRT::classify(newSample, classId, distance, probability, adaptation, realClassId); +} +///------------------------------------------------------------------------------------------------- + +//*********************** +//***** XML Manager ***** +//*********************** +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierFgMDMRTRebias::saveAdditional(tinyxml2::XMLDocument& doc, tinyxml2::XMLElement* data) const +{ + if (!CMatrixClassifierFgMDMRT::saveAdditional(doc, data)) { return false; } + if (!m_bias.saveAdditional(doc, data)) { return false; } + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierFgMDMRTRebias::loadAdditional(tinyxml2::XMLElement* data) +{ + if (!CMatrixClassifierFgMDMRT::loadAdditional(data)) { return false; } + if (!m_bias.loadAdditional(data)) { return false; } + return true; +} +///------------------------------------------------------------------------------------------------- + +//***************************** +//***** Override Operator ***** +//***************************** +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierFgMDMRTRebias::isEqual(const CMatrixClassifierFgMDMRTRebias& obj, const double precision) const +{ + return CMatrixClassifierFgMDMRT::isEqual(obj, precision) && m_bias == obj.m_bias; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +void CMatrixClassifierFgMDMRTRebias::copy(const CMatrixClassifierFgMDMRTRebias& obj) +{ + CMatrixClassifierFgMDMRT::copy(obj); + m_bias = obj.m_bias; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +std::stringstream CMatrixClassifierFgMDMRTRebias::printAdditional() const +{ + std::stringstream ss = CMatrixClassifierFgMDMRT::printAdditional(); + ss << m_bias; + return ss; +} +///------------------------------------------------------------------------------------------------- + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CMatrixClassifierMDM.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CMatrixClassifierMDM.cpp new file mode 100644 index 0000000..5305ce9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CMatrixClassifierMDM.cpp @@ -0,0 +1,177 @@ +#include "geometry/classifier/CMatrixClassifierMDM.hpp" +#include "geometry/Mean.hpp" +#include "geometry/Distance.hpp" +#include "geometry/Basics.hpp" +#include "geometry/Geodesic.hpp" +#include // SQRT of Matrix + +namespace Geometry { + +//*********************** +//***** Constructor ***** +//*********************** +///------------------------------------------------------------------------------------------------- +CMatrixClassifierMDM::CMatrixClassifierMDM(const size_t nbClass, const EMetric metric) +{ + CMatrixClassifierMDM::setClassCount(nbClass); + m_metric = metric; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +CMatrixClassifierMDM::~CMatrixClassifierMDM() +{ + m_means.clear(); + m_nbTrials.clear(); +} +///------------------------------------------------------------------------------------------------- + +//********************** +//***** Classifier ***** +//********************** +///------------------------------------------------------------------------------------------------- +void CMatrixClassifierMDM::setClassCount(const size_t nbClass) +{ + if (m_nbClass != nbClass || m_means.size() != nbClass || m_nbTrials.size() != nbClass) + { + IMatrixClassifier::setClassCount(nbClass); + m_means.resize(m_nbClass); + m_nbTrials.resize(nbClass); + } +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierMDM::train(const std::vector>& dataset) +{ + if (dataset.empty()) { return false; } + setClassCount(dataset.size()); // Change the number of classes if needed + for (size_t k = 0; k < m_nbClass; ++k) // for each class + { + if (!Mean(dataset[k], m_means[k], m_metric)) { return false; } // Compute the mean of each class + m_nbTrials[k] = dataset[k].size(); + } + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierMDM::classify(const Eigen::MatrixXd& sample, size_t& classId, std::vector& distance, + std::vector& probability, const EAdaptations adaptation, const size_t& realClassId) +{ + if (!IsSquare(sample)) { return false; } // Verification if it's a square matrix + double distMin = std::numeric_limits::max(); // Init of distance min + + // Compute Distances + distance.resize(m_nbClass); + for (size_t k = 0; k < m_nbClass; ++k) + { + distance[k] = Distance(sample, m_means[k], m_metric); + if (distMin > distance[k]) + { + classId = k; + distMin = distance[k]; + } + } + + // Compute Probabilities (personnal method) + probability.resize(m_nbClass); + double sumProbability = 0.0; + for (size_t k = 0; k < m_nbClass; ++k) + { + probability[k] = distMin / distance[k]; + sumProbability += probability[k]; + } + + for (auto& p : probability) { p /= sumProbability; } + + // Adaptation + if (adaptation == EAdaptations::None) { return true; } + // Get class id for adaptation and increase number of trials, expected if supervised, predicted if unsupervised + const size_t id = adaptation == EAdaptations::Supervised ? realClassId : classId; + if (id >= m_nbClass) { return false; } // Check id (if supervised and bad input) + m_nbTrials[id]++; // Update number of trials for the class id + return Geodesic(m_means[id], sample, m_means[id], m_metric, 1.0 / m_nbTrials[id]); +} +///------------------------------------------------------------------------------------------------- + +//*********************** +//***** XML Manager ***** +//*********************** +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierMDM::saveClasses(tinyxml2::XMLDocument& doc, tinyxml2::XMLElement* data) const +{ + for (size_t k = 0; k < m_nbClass; ++k) // for each class + { + tinyxml2::XMLElement* element = doc.NewElement("Class"); // Create class node + element->SetAttribute("class-id", int(k)); // Set attribute class id (0 to K) + element->SetAttribute("nb-trials", int(m_nbTrials[k])); // Set attribute class number of trials + if (!saveMatrix(element, m_means[k])) { return false; } // Save class Matrix Reference + data->InsertEndChild(element); // Add class node to data node + } + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierMDM::loadClasses(tinyxml2::XMLElement* data) +{ + tinyxml2::XMLElement* element = data->FirstChildElement("Class"); // Get First Class Node + for (size_t k = 0; k < m_nbClass; ++k) // for each class + { + if (element == nullptr) { return false; } // Check if Node Exist + const size_t idx = element->IntAttribute("class-id"); // Get Id (normally idx == k) + if (idx != k) { return false; } // Check Id + m_nbTrials[k] = element->IntAttribute("nb-trials"); // Get the number of Trials for this class + if (!loadMatrix(element, m_means[k])) { return false; } // Load Class Matrix + element = element->NextSiblingElement("Class"); // Next Class + } + return true; +} +///------------------------------------------------------------------------------------------------- + +//***************************** +//***** Override Operator ***** +//***************************** +///------------------------------------------------------------------------------------------------- +std::stringstream CMatrixClassifierMDM::printClasses() const +{ + std::stringstream ss; + for (size_t i = 0; i < m_nbClass; ++i) + { + ss << "Mean of class " << i << " (" << m_nbTrials[i] << " trials): "; + if (m_means[i].size() != 0) { ss << std::endl << m_means[i].format(MATRIX_FORMAT) << std::endl; } + else { ss << "Not Computed" << std::endl; } + } + return ss; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierMDM::isEqual(const CMatrixClassifierMDM& obj, const double precision) const +{ + if (!IMatrixClassifier::isEqual(obj)) { return false; } + if (m_nbClass != obj.getClassCount()) { return false; } + for (size_t i = 0; i < m_nbClass; ++i) + { + if (!AreEquals(m_means[i], obj.m_means[i], precision)) { return false; } + if (m_nbTrials[i] != obj.m_nbTrials[i]) { return false; } + } + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +void CMatrixClassifierMDM::copy(const CMatrixClassifierMDM& obj) +{ + IMatrixClassifier::copy(obj); + setClassCount(m_nbClass); + for (size_t i = 0; i < m_nbClass; ++i) + { + m_means[i] = obj.m_means[i]; + m_nbTrials[i] = obj.m_nbTrials[i]; + } +} +///------------------------------------------------------------------------------------------------- + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CMatrixClassifierMDMRebias.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CMatrixClassifierMDMRebias.cpp new file mode 100644 index 0000000..6663113 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/CMatrixClassifierMDMRebias.cpp @@ -0,0 +1,81 @@ +#include "geometry/classifier/CMatrixClassifierMDMRebias.hpp" +#include "geometry/Mean.hpp" +#include "geometry/Basics.hpp" +#include // SQRT of Matrix + +namespace Geometry { + +//********************** +//***** Classifier ***** +//********************** +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierMDMRebias::train(const std::vector>& dataset) +{ + if (!m_bias.computeBias(dataset, m_metric)) { return false; } + std::vector> newDataset; + m_bias.applyBias(dataset, newDataset); + return CMatrixClassifierMDM::train(newDataset); // Train MDM +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierMDMRebias::classify(const Eigen::MatrixXd& sample, size_t& classId, std::vector& distance, + std::vector& probability, const EAdaptations adaptation, const size_t& realClassId) +{ + if (!IsSquare(sample)) { return false; } // Verification if it's a square matrix + Eigen::MatrixXd newSample; + m_bias.applyBias(sample, newSample); + m_bias.updateBias(sample, m_metric); + return CMatrixClassifierMDM::classify(newSample, classId, distance, probability, adaptation, realClassId); +} +///------------------------------------------------------------------------------------------------- + +//*********************** +//***** XML Manager ***** +//*********************** +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierMDMRebias::saveAdditional(tinyxml2::XMLDocument& doc, tinyxml2::XMLElement* data) const +{ + if (!CMatrixClassifierMDM::saveAdditional(doc, data)) { return false; } + if (!m_bias.saveAdditional(doc, data)) { return false; } + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierMDMRebias::loadAdditional(tinyxml2::XMLElement* data) +{ + if (!CMatrixClassifierMDM::loadAdditional(data)) { return false; } + if (!m_bias.loadAdditional(data)) { return false; } + return true; +} +///------------------------------------------------------------------------------------------------- + +//***************************** +//***** Override Operator ***** +//***************************** +///------------------------------------------------------------------------------------------------- +bool CMatrixClassifierMDMRebias::isEqual(const CMatrixClassifierMDMRebias& obj, const double precision) const +{ + return CMatrixClassifierMDM::isEqual(obj, precision) && m_bias == obj.m_bias; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +void CMatrixClassifierMDMRebias::copy(const CMatrixClassifierMDMRebias& obj) +{ + CMatrixClassifierMDM::copy(obj); + m_bias = obj.m_bias; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +std::stringstream CMatrixClassifierMDMRebias::printAdditional() const +{ + std::stringstream ss = CMatrixClassifierMDM::printAdditional(); + ss << m_bias; + return ss; +} +///------------------------------------------------------------------------------------------------- + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/IMatrixClassifier.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/IMatrixClassifier.cpp new file mode 100644 index 0000000..63d3934 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/src/classifier/IMatrixClassifier.cpp @@ -0,0 +1,172 @@ +#include "geometry/classifier/IMatrixClassifier.hpp" +#include + +namespace Geometry { + +//*********************** +//***** Constructor ***** +//*********************** +///------------------------------------------------------------------------------------------------- +IMatrixClassifier::IMatrixClassifier(const size_t nbClass, const EMetric metric) +{ + IMatrixClassifier::setClassCount(nbClass); + m_metric = metric; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +void IMatrixClassifier::setClassCount(const size_t nbClass) { m_nbClass = nbClass; } +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool IMatrixClassifier::classify(const Eigen::MatrixXd& sample, size_t& classId, const EAdaptations adaptation, const size_t& realClassId) +{ + std::vector distance, probability; + return classify(sample, classId, distance, probability, adaptation, realClassId); +} +///------------------------------------------------------------------------------------------------- + +//*********************** +//***** XML Manager ***** +//*********************** +///------------------------------------------------------------------------------------------------- +bool IMatrixClassifier::saveXML(const std::string& filename) const +{ + tinyxml2::XMLDocument xmlDoc; + // Create Root + tinyxml2::XMLNode* root = xmlDoc.NewElement("Classifier"); // Create root node + xmlDoc.InsertFirstChild(root); // Add root to XML + + tinyxml2::XMLElement* data = xmlDoc.NewElement("Classifier-data"); // Create data node + if (!saveHeader(data)) { return false; } // Save Header attribute + if (!saveAdditional(xmlDoc, data)) { return false; } // Save Optionnal Informations + if (!saveClasses(xmlDoc, data)) { return false; } // Save Classes + + root->InsertEndChild(data); // Add data to root + return xmlDoc.SaveFile(filename.c_str()) == 0; // save XML (if != 0 it means error) +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool IMatrixClassifier::loadXML(const std::string& filename) +{ + // Load File + tinyxml2::XMLDocument xmlDoc; + if (xmlDoc.LoadFile(filename.c_str()) != 0) { return false; } // Check File Exist and Loading + + // Load Root + tinyxml2::XMLNode* root = xmlDoc.FirstChild(); // Get Root Node + if (root == nullptr) { return false; } // Check Root Node Exist + + // Load Data + tinyxml2::XMLElement* data = root->FirstChildElement("Classifier-data"); // Get Data Node + if (data == nullptr) { return false; } // Check Root Node Exist + if (!loadHeader(data)) { return false; } // Load Header attribute + if (!loadAdditional(data)) { return false; } // Load Optionnal Informations + if (!loadClasses(data)) { return false; } // Load Classes + + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool IMatrixClassifier::convertMatrixToXMLFormat(const Eigen::MatrixXd& in, std::stringstream& out) +{ + out << in.format(MATRIX_FORMAT); + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool IMatrixClassifier::convertXMLFormatToMatrix(std::stringstream& in, Eigen::MatrixXd& out, const size_t rows, const size_t cols) +{ + out = Eigen::MatrixXd::Identity(rows, cols); // Init With Identity Matrix (in case of) + for (size_t i = 0; i < rows; ++i) // Fill Matrix + { + for (size_t j = 0; j < cols; ++j) { in >> out(i, j); } + } + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool IMatrixClassifier::saveMatrix(tinyxml2::XMLElement* element, const Eigen::MatrixXd& matrix) +{ + element->SetAttribute("size", int(matrix.rows())); // Set Matrix size NxN + std::stringstream ss; + convertMatrixToXMLFormat(matrix, ss); + element->SetText(ss.str().c_str()); // Write Means Value + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool IMatrixClassifier::loadMatrix(tinyxml2::XMLElement* element, Eigen::MatrixXd& matrix) +{ + const size_t size = element->IntAttribute("size"); // Get number of row/col + if (size == 0) { return true; } + std::stringstream ss(element->GetText()); // String stream to parse Matrix value + convertXMLFormatToMatrix(ss, matrix, size, size); + return true; +} +///------------------------------------------------------------------------------------------------- + +//***************************** +//***** Override Operator ***** +//***************************** +///------------------------------------------------------------------------------------------------- +bool IMatrixClassifier::isEqual(const IMatrixClassifier& obj, const double /*precision*/) const +{ + return m_metric == obj.m_metric && m_nbClass == obj.getClassCount(); +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +void IMatrixClassifier::copy(const IMatrixClassifier& obj) +{ + m_metric = obj.m_metric; + setClassCount(obj.getClassCount()); +} +/// ------------------------------------------------------------------------------------------------- + +/// ------------------------------------------------------------------------------------------------- +std::stringstream IMatrixClassifier::print() const { return std::stringstream(printHeader().str() + printAdditional().str() + printClasses().str()); } +/// ------------------------------------------------------------------------------------------------- + +/// ------------------------------------------------------------------------------------------------- +std::stringstream IMatrixClassifier::printHeader() const +{ + std::stringstream ss; + ss << getType() << " Classifier" << std::endl; + ss << "Metric : " << toString(m_metric) << std::endl; + ss << "Number of Classes : " << m_nbClass << std::endl; + return ss; +} +///------------------------------------------------------------------------------------------------- + +//******************************************* +//***** XML Manager (Private Functions) ***** +//******************************************* +///------------------------------------------------------------------------------------------------- +bool IMatrixClassifier::saveHeader(tinyxml2::XMLElement* data) const +{ + data->SetAttribute("type", getType().c_str()); // Set attribute classifier type + data->SetAttribute("class-count", int(m_nbClass)); // Set attribute class count + data->SetAttribute("metric", toString(m_metric).c_str()); // Set attribute metric + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool IMatrixClassifier::loadHeader(tinyxml2::XMLElement* data) +{ + if (data == nullptr) { return false; } // Check if Node Exist + const std::string classifierType = data->Attribute("type"); // Get type + if (classifierType != getType()) { return false; } // Check Type + setClassCount(data->IntAttribute("class-count")); // Update Number of classes + m_metric = StringToMetric(data->Attribute("metric")); // Update Metric + return true; +} +///------------------------------------------------------------------------------------------------- + +} // namespace Geometry diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/test/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/modules/geometry/test/CMakeLists.txt new file mode 100644 index 0000000..680afb9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/test/CMakeLists.txt @@ -0,0 +1,50 @@ +PROJECT(test-geometry) + +FILE(GLOB_RECURSE TESTS_SRC_FILES *.cpp *.hpp) + +ADD_EXECUTABLE(${PROJECT_NAME} ${TESTS_SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) # Place project in folder unit-test (for some IDE) + +# Modify library prefixes and suffixes to comply to Windows or Linux naming +IF(WIN32) + SET(CMAKE_FIND_LIBRARY_PREFIXES "") + SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".dll") +ELSEIF(APPLE) + SET(CMAKE_FIND_LIBRARY_PREFIXES "lib") + SET(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib" ".a") +ELSE() + SET(CMAKE_FIND_LIBRARY_PREFIXES "lib") + SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a") +ENDIF() + + +FIND_PATH(PATH_GTEST ${CMAKE_FIND_LIBRARY_PREFIXES}gtest PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES gtest) +SET(GTEST_ROOT ${PATH_GTEST}/${CMAKE_FIND_LIBRARY_PREFIXES}gtest) +FIND_PACKAGE(GTest REQUIRED) + +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${GTEST_BOTH_LIBRARIES}) +INCLUDE_DIRECTORIES(${GTEST_INCLUDE_DIRS}) + +# OpenViBE Module +INCLUDE("FindModuleGeometry") + +# OpenViBE Third Party +INCLUDE("FindThirdPartyEigen") +INCLUDE("FindThirdPartyBoost") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +ADD_TEST(NAME test_Geometry COMMAND ${PROJECT_NAME}) + +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/test/init.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/test/init.hpp new file mode 100644 index 0000000..c004f97 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/test/init.hpp @@ -0,0 +1,2050 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file init.hpp +/// \brief Some constants Initialisation functions for google tests +/// \author Thibaut Monseigne (Inria). +/// \version 0.1. +/// \date 26/10/2018. +/// \copyright GNU Affero General Public License v3.0. +/// \remarks +/// - For this tests I compare the results with the pyRiemann Python library (License) or sklearn if pyRiemman just redirect the function. +/// - For the adaptation Classification tests I compare the results with the covariancetoolbox Matlab library (License). +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include +#include // SQRT of Matrix + +#include +#include +#include +#include +#include + +#include "geometry/artifacts/CASR.hpp" + +#define NB_CLASS 02 +#define NB_CHAN 03 +#define NB_SAMPLE 10 +#define NB_TRIALS1 07 +#define NB_TRIALS2 05 +#define NB_TRIALS 12 // NB_TRIALS1 + NB_TRIALS2 +#define NB_FEATURES 06 // NB_CHAN * (NB_CHAN + 1) / 2 + +//********************************************* +//********** Initialisation Datasets ********** +//********************************************* +namespace InitDataset { + +inline std::vector FirstClassDataset() +{ + std::vector result(NB_TRIALS1); + for (auto& m : result) { m.resize(NB_CHAN, NB_SAMPLE); } + + result[0] << -3, -4, -5, -4, -6, -1, -4, -1, -3, -1, + 0, -3, -3, 1, -2, 1, -2, 1, -1, -1, + 1, 0, 0, 1, 0, 1, 0, 1, 1, 1; + + result[1] << -1, -4, -5, -4, -6, -6, -3, -3, -6, -4, + -3, -1, 0, -3, 0, 0, -2, -2, -3, -3, + 0, 1, 1, 0, 0, 0, 0, 0, 1, 0; + + result[2] << -4, -2, -4, -5, -3, -1, -6, -3, -3, -4, + 0, -3, -2, -2, -3, 0, -1, -2, -1, -2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0; + + result[3] << -5, -3, -1, -1, -2, -4, -1, -6, -4, -4, + 0, 0, -2, -2, -2, 0, 0, -1, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0; + + result[4] << -2, -1, -5, -2, -6, -5, -6, -4, -6, -6, + -1, -3, -2, -3, -1, -1, 1, 0, 0, -3, + 0, 1, 1, 0, 0, 1, 1, 0, 0, 1; + + result[5] << -5, -3, -4, -1, -3, -6, -5, -3, -2, -5, + -2, -3, 1, -3, -1, -2, 0, -1, 1, -2, + 0, 0, 1, 1, 0, 1, 1, 1, 1, 0; + + result[6] << -3, -3, -1, -4, -1, -6, -2, -5, -3, -3, + -1, -3, -2, 1, 0, 0, -3, -3, -3, 1, + 0, 1, 1, 1, 0, 0, 1, 0, 0, 0; + + return result; +} + +inline std::vector SecondClassDataset() +{ + std::vector result(NB_TRIALS2); + for (auto& m : result) { m.resize(NB_CHAN, NB_SAMPLE); } + + result[0] << 0, 3, 1, 1, 2, 3, 1, 3, 3, 2, + 0, 1, 1, -1, -2, 0, -2, 1, 2, 0, + 4, 3, 3, 3, 4, 4, 4, 5, 4, 3; + + result[1] << 3, 2, 1, 2, 1, 2, 3, 3, 1, 4, + -2, -2, -1, 0, 0, -1, 3, 0, -1, 3, + 4, 4, 3, 4, 3, 5, 5, 4, 5, 4; + + result[2] << 3, 2, 3, 3, 0, 0, 0, 1, 2, 3, + 3, 2, 0, 3, 3, -2, 3, 3, -2, 2, + 5, 3, 4, 4, 5, 4, 3, 3, 5, 4; + + result[3] << 0, 3, 1, 4, 3, 1, 2, 3, 0, 0, + -2, 1, 1, 0, 2, -1, 3, -1, 2, -2, + 3, 3, 5, 4, 4, 4, 5, 4, 5, 5; + + result[4] << 1, 2, 1, 2, 2, 0, 0, 0, 0, 4, + 1, 3, 0, -2, 1, 0, 0, 2, -2, 2, + 5, 3, 5, 5, 5, 3, 4, 4, 3, 3; + + return result; +} + +inline std::vector> Dataset() +{ + std::vector> result; + result.resize(NB_CLASS); + result[0] = FirstClassDataset(); + result[1] = SecondClassDataset(); + return result; +} + +inline std::vector DatasetInOneVector() +{ + std::vector result = FirstClassDataset(), s2 = SecondClassDataset(); + result.insert(result.end(), std::make_move_iterator(s2.begin()), std::make_move_iterator(s2.end())); + return result; +} + +} // namespace InitDataset + +//***************************************************************** +//********** Initialisation Basics Reference of Datasets ********** +//***************************************************************** +namespace InitBasics { +namespace Center { + +inline std::vector FirstClassReference() +{ + std::vector result(NB_TRIALS1); + for (auto& m : result) { m.resize(NB_CHAN, NB_SAMPLE); } + + result[0] << 0.2, -0.8, -1.8, -0.8, -2.8, 2.2, -0.8, 2.2, 0.2, 2.2, + 0.9, -2.1, -2.1, 1.9, -1.1, 1.9, -1.1, 1.9, -0.1, -0.1, + 0.4, -0.6, -0.6, 0.4, -0.6, 0.4, -0.6, 0.4, 0.4, 0.4; + + result[1] << 3.2, 0.2, -0.8, 0.2, -1.8, -1.8, 1.2, 1.2, -1.8, 0.2, + -1.3, 0.7, 1.7, -1.3, 1.7, 1.7, -0.3, -0.3, -1.3, -1.3, + -0.3, 0.7, 0.7, -0.3, -0.3, -0.3, -0.3, -0.3, 0.7, -0.3; + + result[2] << -0.5, 1.5, -0.5, -1.5, 0.5, 2.5, -2.5, 0.5, 0.5, -0.5, + 1.6, -1.4, -0.4, -0.4, -1.4, 1.6, 0.6, -0.4, 0.6, -0.4, + 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, -0.9; + + result[3] << -1.9, 0.1, 2.1, 2.1, 1.1, -0.9, 2.1, -2.9, -0.9, -0.9, + 0.7, 0.7, -1.3, -1.3, -1.3, 0.7, 0.7, -0.3, 0.7, 0.7, + 0.9, -0.1, -0.1, -0.1, -0.1, -0.1, -0.1, -0.1, -0.1, -0.1; + + result[4] << 2.3, 3.3, -0.7, 2.3, -1.7, -0.7, -1.7, 0.3, -1.7, -1.7, + 0.3, -1.7, -0.7, -1.7, 0.3, 0.3, 2.3, 1.3, 1.3, -1.7, + -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5; + + result[5] << -1.3, 0.7, -0.3, 2.7, 0.7, -2.3, -1.3, 0.7, 1.7, -1.3, + -0.8, -1.8, 2.2, -1.8, 0.2, -0.8, 1.2, 0.2, 2.2, -0.8, + -0.6, -0.6, 0.4, 0.4, -0.6, 0.4, 0.4, 0.4, 0.4, -0.6; + + result[6] << 0.1, 0.1, 2.1, -0.9, 2.1, -2.9, 1.1, -1.9, 0.1, 0.1, + 0.3, -1.7, -0.7, 2.3, 1.3, 1.3, -1.7, -1.7, -1.7, 2.3, + -0.4, 0.6, 0.6, 0.6, -0.4, -0.4, 0.6, -0.4, -0.4, -0.4; + + return result; +} + +inline std::vector SecondClassReference() +{ + std::vector result(NB_TRIALS2); + for (auto& m : result) { m.resize(NB_CHAN, NB_SAMPLE); } + + result[0] << -1.9, 1.1, -0.9, -0.9, 0.1, 1.1, -0.9, 1.1, 1.1, 0.1, + 0.0, 1.0, 1.0, -1.0, -2.0, 0.0, -2.0, 1.0, 2.0, 0.0, + 0.3, -0.7, -0.7, -0.7, 0.3, 0.3, 0.3, 1.3, 0.3, -0.7; + + result[1] << 0.8, -0.2, -1.2, -0.2, -1.2, -0.2, 0.8, 0.8, -1.2, 1.8, + -1.9, -1.9, -0.9, 0.1, 0.1, -0.9, 3.1, 0.1, -0.9, 3.1, + -0.1, -0.1, -1.1, -0.1, -1.1, 0.9, 0.9, -0.1, 0.9, -0.1; + + result[2] << 1.3, 0.3, 1.3, 1.3, -1.7, -1.7, -1.7, -0.7, 0.3, 1.3, + 1.5, 0.5, -1.5, 1.5, 1.5, -3.5, 1.5, 1.5, -3.5, 0.5, + 1.0, -1.0, 0.0, 0.0, 1.0, 0.0, -1.0, -1.0, 1.0, 0.; + + result[3] << -1.7, 1.3, -0.7, 2.3, 1.3, -0.7, 0.3, 1.3, -1.7, -1.7, + -2.3, 0.7, 0.7, -0.3, 1.7, -1.3, 2.7, -1.3, 1.7, -2.3, + -1.2, -1.2, 0.8, -0.2, -0.2, -0.2, 0.8, -0.2, 0.8, 0.8; + + result[4] << -0.2, 0.8, -0.2, 0.8, 0.8, -1.2, -1.2, -1.2, -1.2, 2.8, + 0.5, 2.5, -0.5, -2.5, 0.5, -0.5, -0.5, 1.5, -2.5, 1.5, + 1.0, -1.0, 1.0, 1.0, 1.0, -1.0, 0.0, 0.0, -1.0, -1.; + + return result; +} + +inline std::vector> Reference() +{ + std::vector> result; + result.resize(2); + result[0] = FirstClassReference(); + result[1] = SecondClassReference(); + return result; +} + +} // namespace Center + +namespace StandardScaler { + +inline std::vector FirstClassReference() +{ + std::vector result(NB_TRIALS1); + for (auto& m : result) { m.resize(NB_CHAN, NB_SAMPLE); } + + result[0] << -3, -4, -5, -4, -6, -1, -4, -1, -3, -1, + 0, -3, -3, 1, -2, 1, -2, 1, -1, -1, + 1, 0, 0, 1, 0, 1, 0, 1, 1, 1; + + result[1] << -1, -4, -5, -4, -6, -6, -3, -3, -6, -4, + -3, -1, 0, -3, 0, 0, -2, -2, -3, -3, + 0, 1, 1, 0, 0, 0, 0, 0, 1, 0; + + result[2] << -4, -2, -4, -5, -3, -1, -6, -3, -3, -4, + 0, -3, -2, -2, -3, 0, -1, -2, -1, -2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0; + + result[3] << -5, -3, -1, -1, -2, -4, -1, -6, -4, -4, + 0, 0, -2, -2, -2, 0, 0, -1, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0; + + result[4] << -2, -1, -5, -2, -6, -5, -6, -4, -6, -6, + -1, -3, -2, -3, -1, -1, 1, 0, 0, -3, + 0, 1, 1, 0, 0, 1, 1, 0, 0, 1; + + result[5] << -5, -3, -4, -1, -3, -6, -5, -3, -2, -5, + -2, -3, 1, -3, -1, -2, 0, -1, 1, -2, + 0, 0, 1, 1, 0, 1, 1, 1, 1, 0; + + result[6] << -3, -3, -1, -4, -1, -6, -2, -5, -3, -3, + -1, -3, -2, 1, 0, 0, -3, -3, -3, 1, + 0, 1, 1, 1, 0, 0, 1, 0, 0, 0; + + return result; +} + +inline std::vector SecondClassReference() +{ + std::vector result(NB_TRIALS2); + for (auto& m : result) { m.resize(NB_CHAN, NB_SAMPLE); } + + result[0] << 0, 3, 1, 1, 2, 3, 1, 3, 3, 2, + 0, 1, 1, -1, -2, 0, -2, 1, 2, 0, + 4, 3, 3, 3, 4, 4, 4, 5, 4, 3; + + result[1] << 3, 2, 1, 2, 1, 2, 3, 3, 1, 4, + -2, -2, -1, 0, 0, -1, 3, 0, -1, 3, + 4, 4, 3, 4, 3, 5, 5, 4, 5, 4; + + result[2] << 3, 2, 3, 3, 0, 0, 0, 1, 2, 3, + 3, 2, 0, 3, 3, -2, 3, 3, -2, 2, + 5, 3, 4, 4, 5, 4, 3, 3, 5, 4; + + result[3] << 0, 3, 1, 4, 3, 1, 2, 3, 0, 0, + -2, 1, 1, 0, 2, -1, 3, -1, 2, -2, + 3, 3, 5, 4, 4, 4, 5, 4, 5, 5; + + result[4] << 1, 2, 1, 2, 2, 0, 0, 0, 0, 4, + 1, 3, 0, -2, 1, 0, 0, 2, -2, 2, + 5, 3, 5, 5, 5, 3, 4, 4, 3, 3; + + return result; +} + +inline std::vector> Reference() +{ + std::vector> result; + result.resize(2); + result[0] = FirstClassReference(); + result[1] = SecondClassReference(); + return result; +} + +} // namespace StandardScaler +} // namespace InitBasics + +//********************************************************************* +//********** Initialisation Covariance Reference of Datasets ********** +//********************************************************************* +namespace InitCovariance { + +//********************************* +//********* COR Reference ********* +//********************************* +namespace COR { +inline std::vector FirstClassDataset() +{ + std::vector result(NB_TRIALS1); + for (auto& m : result) { m.resize(NB_CHAN, NB_CHAN); } + + result[0] << 1.00, 0.644381009, 0.76178344, + 0.644381009, 1.00, 0.863289805, + 0.76178344, 0.863289805, 1.00; + + result[1] << 1.00, -0.533536825, -0.340914594, + -0.533536825, 1.00, 0.189177769, + -0.340914594, 0.189177769, 1.00; + + result[2] << 1.00, -0.00, 0.12253577, + -0.00, 1.00, 0.13074409, + 0.12253577, 0.13074409, 1.00; + + result[3] << 1.00, -0.503267974, -0.37254902, + -0.503267974, 1.00, 0.259259259, + -0.37254902, 0.259259259, 1.00; + + result[4] << 1.00, -0.478994453, -0.162459108, + -0.478994453, 1.00, -0.222988244, + -0.162459108, -0.222988244, 1.00; + + result[5] << 1.00, -0.0192192227, 0.164770511, + -0.0192192227, 1.00, 0.466569475, + 0.164770511, 0.466569475, 1.00; + + result[6] << 1.00, -0.134982027, 0.323733677, + -0.134982027, 1.00, -0.227429413, + 0.323733677, -0.227429413, 1.00; + + return result; +} + +inline std::vector SecondClassDataset() +{ + std::vector result(NB_TRIALS2); + for (auto& m : result) { m.resize(NB_CHAN, NB_CHAN); } + + result[0] << 1.00, 0.4543369, 0.25429847, + 0.4543369, 1.00, 0.00, + 0.25429847, 0.00, 1.00; + + result[1] << 1.00, 0.55233592, 0.26244533, + 0.55233592, 1.00, 0.17647059, + 0.26244533, 0.17647059, 1.00; + + result[2] << 1.00, 0.06024874, 0.20348923, + 0.06024874, 1.00, -0.26318068, + 0.20348923, -0.26318068, 1.00; + + result[3] << 1.00, 0.290334, -0.32046963, + 0.290334, 1.00, 0.35075632, + -0.32046963, 0.35075632, 1.00; + + result[4] << 1.00, 0.35805744, 0.00, + 0.35805744, 1.00, -0.21428571, + 0.00, -0.21428571, 1.00; + + return result; +} + +inline std::vector> Dataset() +{ + std::vector> result; + result.resize(2); + result[0] = FirstClassDataset(); + result[1] = SecondClassDataset(); + return result; +} + +} // namespace COR + +//********************************* +//********* COV Reference ********* +//********************************* +namespace COV { + +inline std::vector FirstClassDataset() +{ + std::vector result(NB_TRIALS1); + for (auto& m : result) { m.resize(NB_CHAN, NB_CHAN); } + + result[0] << 2.76, 1.62, 0.62, + 1.62, 2.29, 0.64, + 0.62, 0.64, 0.24; + + result[1] << 2.36, -1.04, -0.24, + -1.04, 1.61, 0.11, + -0.24, 0.11, 0.21; + + result[2] << 1.85, -0.00, 0.05, + -0.00, 1.04, 0.04, + 0.05, 0.04, 0.09; + + result[3] << 2.89, -0.77, -0.19, + -0.77, 0.81, 0.07, + -0.19, 0.07, 0.09; + + result[4] << 3.41, -1.19, -0.15, + -1.19, 1.81, -0.15, + -0.15, -0.15, 0.25; + + result[5] << 2.21, -0.04, 0.12, + -0.04, 1.96, 0.32, + 0.12, 0.32, 0.24; + + result[6] << 2.29, -0.33, 0.24, + -0.33, 2.61, -0.18, + 0.24, -0.18, 0.24; + + return result; +} + +inline std::vector SecondClassDataset() +{ + std::vector result(NB_TRIALS2); + for (auto& m : result) { m.resize(NB_CHAN, NB_CHAN); } + + result[0] << 1.09, 0.60, 0.17, + 0.60, 1.60, 0.00, + 0.17, 0.00, 0.41; + + result[1] << 0.96, 0.92, 0.18, + 0.92, 2.89, 0.21, + 0.18, 0.21, 0.49; + + result[2] << 1.61, 0.15, 0.20, + 0.15, 3.85, -0.40, + 0.20, -0.40, 0.60; + + result[3] << 2.01, 0.69, -0.34, + 0.69, 2.81, 0.44, + -0.34, 0.44, 0.56; + + result[4] << 1.56, 0.70, 0.00, + 0.70, 2.45, -0.30, + 0.00, -0.30, 0.80; + + return result; +} + +inline std::vector> Dataset() +{ + std::vector> result; + result.resize(2); + result[0] = FirstClassDataset(); + result[1] = SecondClassDataset(); + return result; +} + +} // namespace COV + +//********************************* +//********* LWF Reference ********* +//********************************* +namespace LWF { + +inline std::vector FirstClassReference() +{ + std::vector result(7); + for (auto& m : result) { m.resize(NB_CHAN, NB_CHAN); } + + result[0] << 2.5849288, 1.33543611, 0.511092833, + 1.33543611, 2.19748746, 0.527579698, + 0.511092833, 0.527579698, 0.507583739; + + result[1] << 1.99839975, -0.650968006, -0.150223386, + -0.650968006, 1.52895167, 0.0688523853, + -0.150223386, 0.0688523853, 0.652648582; + + result[2] << 1.21758058, -0.00, 0.013088361, + -0.00, 1.00554914, 0.0104706888, + 0.013088361, 0.0104706888, 0.756870279; + + result[3] << 2.57527815, -0.621023059, -0.153239456, + -0.621023059, 0.897709368, 0.0564566417, + -0.153239456, 0.0564566417, 0.317012482; + + result[4] << 2.87232755, -0.786745664, -0.0991696216, + -0.786745664, 1.81451826, -0.0991696216, + -0.0991696216, -0.0991696216, 0.783154191; + + result[5] << 1.64826027, -0.00963569008, 0.0289070702, + -0.00963569008, 1.5880372, 0.0770855206, + 0.0289070702, 0.0770855206, 1.17370253; + + result[6] << 1.9742694, -0.149321794, 0.108597668, + -0.149321794, 2.11906629, -0.081448251, + 0.108597668, -0.081448251, 1.04666432; + + return result; +} + +inline std::vector SecondClassReference() +{ + std::vector result(5); + for (auto& m : result) { m.resize(NB_CHAN, NB_CHAN); } + + result[0] << 1.06313148, 0.315509839, 0.0893944544, + 0.315509839, 1.33131485, 0.00, + 0.0893944544, 0.00, 0.705553667; + + result[1] << 1.18724478, 0.490413981, 0.0959505616, + 0.490413981, 2.21604802, 0.111942322, + 0.0959505616, 0.111942322, 0.936707201; + + result[2] << 1.86743369, 0.055816941, 0.074422588, + 0.055816941, 2.70096668, -0.148845176, + 0.074422588, -0.148845176, 1.49159963; + + result[3] << 1.89536719, 0.324938579, -0.160114662, + 0.324938579, 2.27210757, 0.20720721, + -0.160114662, 0.20720721, 1.21252525; + + result[4] << 1.60313579, 0.00319114656, 0.00, + 0.00319114656, 1.6071931, -0.00136763424, + 0.00, -0.00136763424, 1.59967111; + + return result; +} + +inline std::vector> Reference() +{ + std::vector> result; + result.resize(2); + result[0] = FirstClassReference(); + result[1] = SecondClassReference(); + return result; +} + +} // namespace LWF + +//********************************* +//********* MCD Reference ********* +//********************************* +namespace MCD { + +inline std::vector FirstClassReference() +{ + std::vector result(NB_TRIALS1); + for (auto& m : result) { m.resize(NB_CHAN, NB_CHAN); } + + result[0] << 2.00, 2.14285714, 0.57142857, + 2.14285714, 2.57142857, 0.71428571, + 0.57142857, 0.71428571, 0.24489796; + + result[1] << 2.85714286, -1.85714286, -0.14285714, + -1.85714286, 1.26530612, 0.18367347, + -0.14285714, 0.18367347, 0.20408163; + + result[2] << 1.55102041, -0.69387755, 0.02040816, + -0.69387755, 0.40816327, -0.02040816, + 0.02040816, -0.02040816, 0.12244898; + + result[3] << 1.63265306, -1.18367347, 0.00, + -1.18367347, 0.97959184, 0.00, + 0.00, 0.00, 0.00; + + result[4] << 0.53061224, 0.06122449, -0.04081633, + 0.06122449, 1.55102041, -0.2244898, + -0.04081633, -0.2244898, 0.24489796; + + result[5] << 1.26530612, 0.40816327, 0.08163265, + 0.40816327, 2.12244898, 0.65306122, + 0.08163265, 0.65306122, 0.24489796; + + result[6] << 1.67346939, 0.7755102, 0.24489796, + 0.7755102, 1.26530612, -0.2244898, + 0.24489796, -0.2244898, 0.24489796; + + return result; +} + +inline std::vector SecondClassReference() +{ + std::vector result(NB_TRIALS2); + for (auto& m : result) { m.resize(NB_CHAN, NB_CHAN); } + + result[0] << 0.69387755, 0.36734694, 0.06122449, + 0.36734694, 1.3877551, -0.3877551, + 0.06122449, -0.3877551, 0.24489796; + + result[1] << 0.48979592, -0.28571429, 0.14285714, + -0.28571429, 0.57142857, -0.14285714, + 0.14285714, -0.14285714, 0.57142857; + + result[2] << 1.63265306, -0.2244898, 0.24489796, + -0.2244898, 0.20408163, 0.10204082, + 0.24489796, 0.10204082, 0.69387755; + + result[3] << 1.71428571, -0.42857143, -0.42857143, + -0.42857143, 2.12244898, 0.48979592, + -0.42857143, 0.48979592, 0.24489796; + + result[4] << 0.53061224, 0.26530612, 0.48979592, + 0.26530612, 1.34693878, 0.53061224, + 0.48979592, 0.53061224, 0.69387755; + + return result; +} + +inline std::vector> Reference() +{ + std::vector> result; + result.resize(2); + result[0] = FirstClassReference(); + result[1] = SecondClassReference(); + return result; +} + +} // namespace MCD + +//********************************* +//********* OAS Reference ********* +//********************************* +namespace OAS { + +inline std::vector FirstClassReference() +{ + std::vector result(NB_TRIALS1); + for (auto& m : result) { m.resize(NB_CHAN, NB_CHAN); } + + result[0] << 2.34520102, 0.945778241, 0.361964512, + 0.945778241, 2.07080856, 0.373640786, + 0.361964512, 0.373640786, 0.87399042; + + result[1] << 1.83506857, -0.475246188, -0.109672197, + -0.475246188, 1.49234296, 0.0502664238, + -0.109672197, 0.0502664238, 0.852588472; + + result[2] << 1.18111558, -0.00, 0.0109600534, + -0.00, 1.00356272, 0.00876804276, + 0.0109600534, 0.00876804276, 0.795321701; + + result[3] << 2.22680827, -0.45607113, -0.112537032, + -0.45607113, 0.994823924, 0.0414610118, + -0.112537032, 0.0414610118, 0.568367802; + + result[4] << 2.53874679, -0.536560096, -0.0676336255, + -0.536560096, 1.81732146, -0.0676336255, + -0.0676336255, -0.0676336255, 1.11393175; + + result[5] << 1.47, -0.00, 0.00, + -0.00, 1.47, 0.00, + 0.00, 0.00, 1.47; + + result[6] << 1.73914927, -0.0147732834, 0.0107442061, + -0.0147732834, 1.75347488, -0.0080581546, + 0.0107442061, -0.0080581546, 1.64737585; + + return result; +} + +inline std::vector SecondClassReference() +{ + std::vector result(NB_TRIALS2); + for (auto& m : result) { m.resize(NB_CHAN, NB_CHAN); } + + result[0] << 1.04056757, 0.07659782, 0.02170272, + 0.07659782, 1.10567572, 0.00, + 0.02170272, 0.00, 0.95375671; + + result[1] << 1.22291898, 0.42297509, 0.08275599, + 0.42297509, 2.11024714, 0.09654866, + 0.08275599, 0.09654866, 1.00683388; + + result[2] << 1.95254699, 0.02467793, 0.03290391, + 0.02467793, 2.32107076, -0.06580782, + 0.03290391, -0.06580782, 1.78638225; + + result[3] << 1.80811047, 0.04705949, -0.02318873, + 0.04705949, 1.86267219, 0.03000895, + -0.02318873, 0.03000895, 1.70921734; + + result[4] << 1.60333333, 0.00, 0.00, + 0.00, 1.60333333, -0.00, + 0.00, -0.00, 1.60333333; + + return result; +} + +inline std::vector> Reference() +{ + std::vector> result; + result.resize(2); + result[0] = FirstClassReference(); + result[1] = SecondClassReference(); + return result; +} + +} // namespace OAS + +//********************************* +//********* SCM Reference ********* +//********************************* +namespace SCM { + +inline std::vector FirstClassReference() +{ + std::vector result(NB_TRIALS1); + for (auto& m : result) { m.resize(NB_CHAN, NB_CHAN); } + + result[0] << 0.77844311, 0.26946108, -0.07784431, + 0.26946108, 0.18562874, 0.00598802, + -0.07784431, 0.00598802, 0.03592814; + + result[1] << 0.80645161, 0.24596774, -0.06048387, + 0.24596774, 0.18145161, -0.01612903, + -0.06048387, -0.01612903, 0.01209677; + + result[2] << 0.75806452, 0.30107527, -0.16666667, + 0.30107527, 0.19354839, -0.07526882, + -0.16666667, -0.07526882, 0.0483871; + + result[3] << 0.89928058, 0.10071942, -0.03597122, + 0.10071942, 0.09352518, 0.00, + -0.03597122, 0.00, 0.00719424; + + result[4] << 0.84555985, 0.16988417, -0.08880309, + 0.16988417, 0.13513514, -0.03088803, + -0.08880309, -0.03088803, 0.01930502; + + result[5] << 0.79899497, 0.22110553, -0.10552764, + 0.22110553, 0.17085427, -0.0201005, + -0.10552764, -0.0201005, 0.03015075; + + result[6] << 0.71686747, 0.22289157, -0.06024096, + 0.22289157, 0.25903614, -0.04216867, + -0.06024096, -0.04216867, 0.02409639; + + return result; +} + +inline std::vector SecondClassReference() +{ + std::vector result(NB_TRIALS2); + for (auto& m : result) { m.resize(NB_CHAN, NB_CHAN); } + + result[0] << 0.23039216, 0.02941176, 0.35294118, + 0.02941176, 0.07843137, 0.00, + 0.35294118, 0.00, 0.69117647; + + result[1] << 0.22307692, 0.02692308, 0.35384615, + 0.02692308, 0.11153846, -0.00769231, + 0.35384615, -0.00769231, 0.66538462; + + result[2] << 0.16544118, 0.09926471, 0.25735294, + 0.09926471, 0.22426471, 0.20588235, + 0.25735294, 0.20588235, 0.61029412; + + result[3] << 0.18846154, 0.04615385, 0.26153846, + 0.04615385, 0.11153846, 0.06538462, + 0.26153846, 0.06538462, 0.70; + + result[4] << 0.13333333, 0.05777778, 0.21333333, + 0.05777778, 0.12, 0.07555556, + 0.21333333, 0.07555556, 0.74666667; + + return result; +} + +inline std::vector> Reference() +{ + std::vector> result; + result.resize(2); + result[0] = FirstClassReference(); + result[1] = SecondClassReference(); + return result; +} + +} // namespace SCM +} // namespace InitCovariance + +//**************************************************************** +//********** Initialisation Means Reference of Datasets ********** +//**************************************************************** +namespace InitMeans { +//************************************ +//********** Mean Euclidian ********** +//************************************ +namespace Euclidian { +inline Eigen::MatrixXd Reference() +{ + Eigen::MatrixXd result(NB_CHAN, NB_CHAN); + result << 1.87394645, 0.02563437, 0.0298922, + 0.02563437, 1.7732458, 0.06073032, + 0.0298922, 0.06073032, 0.93197441; + + return result; +} +} // namespace Euclidian + +//**************************************** +//********** Mean Log Euclidian ********** +//**************************************** +namespace LogEuclidian { +inline Eigen::MatrixXd Reference() +{ + Eigen::MatrixXd result(NB_CHAN, NB_CHAN); + result << 1.7137077, 0.01869396, 0.02040996, + 0.01869396, 1.60430933, 0.0512624, + 0.02040996, 0.0512624, 0.82767414; + + return result; +} +} // namespace LogEuclidian + +//********************************** +//********** Mean Riemann ********** +//********************************** +namespace Riemann { +inline Eigen::MatrixXd Reference() +{ + Eigen::MatrixXd result(NB_CHAN, NB_CHAN); + result << 1.70952664, 0.01674082, 0.02077766, + 0.01674082, 1.60344581, 0.05423902, + 0.02077766, 0.05423902, 0.8303257; + + return result; +} +} // namespace Riemann + +//****************************************** +//********** Mean Log Determinant ********** +//****************************************** +namespace LogDeterminant { +inline Eigen::MatrixXd Reference() +{ + Eigen::MatrixXd result(NB_CHAN, NB_CHAN); + result << 1.70798275, 0.01610538, 0.02003787, + 0.01610538, 1.60581809, 0.05385499, + 0.02003787, 0.05385499, 0.83577899; + + return result; +} +} // namespace LogDeterminant + +//*********************************** +//********** Mean Kullback ********** +//*********************************** +namespace Kullback { +inline Eigen::MatrixXd Reference() +{ + Eigen::MatrixXd result(NB_CHAN, NB_CHAN); + result << 1.71301511, 0.01811099, 0.02219169, + 0.01811099, 1.59879804, 0.0548546, + 0.02219169, 0.0548546, 0.81958134; + + return result; +} +} // namespace Kullback + +//************************************** +//********** Mean Wasserstein ********** +//************************************** +namespace Wasserstein { +inline Eigen::MatrixXd Reference() +{ + Eigen::MatrixXd result(NB_CHAN, NB_CHAN); + result << 1.79643838, 0.0229425, 0.02418139, + 0.0229425, 1.69012112, 0.05311422, + 0.02418139, 0.05311422, 0.87927152; + + return result; +} +} // namespace Wasserstein + +//****************************** +//********** Mean ALE ********** +//****************************** +namespace ALE { +inline Eigen::MatrixXd Reference() +{ + Eigen::MatrixXd result(NB_CHAN, NB_CHAN); + result << 1.70133202, 0.01256147, 0.01500743, + 0.01256147, 1.61096286, 0.05925685, + 0.01500743, 0.05925685, 0.83062499; + + return result; +} +} // namespace ALE + +//*********************************** +//********** Mean Harmonic ********** +//*********************************** +namespace Harmonic { +inline Eigen::MatrixXd Reference() +{ + Eigen::MatrixXd result(NB_CHAN, NB_CHAN); + result << 1.56594664, 0.01175612, 0.01576697, + 0.01175612, 1.44152542, 0.04955601, + 0.01576697, 0.04955601, 0.72075273; + + return result; +} +} // namespace Harmonic + +//*********************************** +//********** Mean Identity ********** +//*********************************** +namespace Identity { +inline Eigen::MatrixXd Reference() +{ + Eigen::MatrixXd result(NB_CHAN, NB_CHAN); + result << 1, 0, 0, + 0, 1, 0, + 0, 0, 1; + + return result; +} +} // namespace Identity +} // namespace InitMeans + +//******************************************************************* +//********** Initialisation Distance Reference of Datasets ********** +//******************************************************************* +namespace InitDistance { +//************************************ +//********** Distance Euclidian ********** +//************************************ +namespace Euclidian { +inline std::vector Reference() +{ + return std::vector{ + 2.27941886, 1.06479476, 1.02847791, 1.59375373, 1.55723736, 0.38300632, 0.50680192, 1.04235464, 1.05530485, 1.12584212, 0.7888681, 0.74648348 + }; +} +} + +//**************************************** +//********** Distance Log Euclidian ********** +//**************************************** +namespace LogEuclidian { +inline std::vector Reference() +{ + return std::vector{ + 1.32256326, 0.66407543, 0.58679669, 1.40770199, 0.74410706, 0.35240113, 0.43103276, 0.71149032, 0.67768624, 0.80611325, 0.59020555, 0.66716464 + }; +} +} + +//********************************** +//********** Distance Riemann ********** +//********************************** +namespace Riemann { +inline std::vector Reference() +{ + return std::vector{ + 1.32849591, 0.66514346, 0.58560532, 1.41024439, 0.747409, 0.34896944, 0.43236778, 0.71205324, 0.67698377, 0.80599981, 0.59091178, 0.66423683 + }; +} +} + +//****************************************** +//********** Distance Log Determinant ********** +//****************************************** +namespace LogDeterminant { +inline std::vector Reference() +{ + return std::vector{ + 0.46451334, 0.23505451, 0.20685864, 0.49230328, 0.26223382, 0.1207747, 0.15093304, 0.25002132, 0.23755315, 0.28080601, 0.20652205, 0.23046043 + }; +} +} + +//*********************************** +//********** Distance Kullback ********** +//*********************************** +namespace Kullback { +inline std::vector Reference() +{ + return std::vector{ + 0.9229355, 0.22182567, 0.17231943, 1.04684976, 0.28821354, 0.06625571, 0.09835624, 0.26108052, 0.23637438, 0.34499747, 0.18292577, 0.238331 + }; +} +} + +//************************************** +//********** Distance Wasserstein ********** +//************************************** +namespace Wasserstein { +inline std::vector Reference() +{ + return std::vector{ + 0.80006691, 0.41547827, 0.38690865, 0.70393068, 0.5282644, 0.16253726, 0.22475651, 0.42258195, 0.41676291, 0.45835023, 0.32884, 0.33947315 + }; +} +} +} // namespace InitDistance + +//******************************************************************** +//********** Initialisation Geodesics Reference of Datasets ********** +//******************************************************************** +namespace InitGeodesics { +//**************************************** +//********** Geodesic Euclidian ********** +//**************************************** +namespace Euclidian { +inline std::vector Reference() +{ + std::vector result(NB_TRIALS); + for (auto& m : result) { m.resize(NB_CHAN, NB_CHAN); } + + result[0] << 2.22943763, 0.68053524, 0.27049252, + 0.68053524, 1.98536663, 0.29415501, + 0.27049252, 0.29415501, 0.71977908; + + result[1] << 1.9361731, -0.31266682, -0.06016559, + -0.31266682, 1.65109873, 0.06479135, + -0.06016559, 0.06479135, 0.7923115; + + result[2] << 1.54576352, 0.01281718, 0.02149028, + 0.01281718, 1.38939747, 0.0356005, + 0.02149028, 0.0356005, 0.84442235; + + result[3] << 2.2246123, -0.29769435, -0.06167363, + -0.29769435, 1.33547758, 0.05859348, + -0.06167363, 0.05859348, 0.62449345; + + result[4] << 2.373137, -0.38055565, -0.03463871, + -0.38055565, 1.79388203, -0.01921965, + -0.03463871, -0.01921965, 0.8575643; + + result[5] << 1.76110336, 0.00799934, 0.02939964, + 0.00799934, 1.6806415, 0.06890792, + 0.02939964, 0.06890792, 1.05283847; + + result[6] << 1.92410792, -0.06184371, 0.06924493, + -0.06184371, 1.94615604, -0.01035897, + 0.06924493, -0.01035897, 0.98931936; + + result[7] << 1.46853897, 0.1705721, 0.05964333, + 0.1705721, 1.55228032, 0.03036516, + 0.05964333, 0.03036516, 0.81876404; + + result[8] << 1.53059562, 0.25802417, 0.06292138, + 0.25802417, 1.99464691, 0.08633632, + 0.06292138, 0.08633632, 0.93434081; + + result[9] << 1.87069007, 0.04072565, 0.05215739, + 0.04072565, 2.23710624, -0.04405743, + 0.05215739, -0.04405743, 1.21178702; + + result[10] << 1.88465682, 0.17528647, -0.06511123, + 0.17528647, 2.02267668, 0.13396876, + -0.06511123, 0.13396876, 1.07224983; + + result[11] << 1.73854112, 0.01441276, 0.0149461, + 0.01441276, 1.69021945, 0.02968134, + 0.0149461, 0.02968134, 1.26582276; + + return result; +} +} // namespace Euclidian + +//******************************************** +//********** Geodesic Log Euclidian ********** +//******************************************** +namespace LogEuclidian { +inline std::vector Reference() +{ + std::vector result(NB_TRIALS); + for (auto& m : result) { m.resize(NB_CHAN, NB_CHAN); } + + result[0] << 2.01103272, 0.58044721, 0.23030037, + 0.58044721, 1.77828904, 0.26574646, + 0.23030037, 0.26574646, 0.6023019; + + result[1] << 1.81637234, -0.31288558, -0.06584287, + -0.31288558, 1.53243541, 0.05115564, + -0.06584287, 0.05115564, 0.73216466; + + result[2] << 1.4444758, 0.00763339, 0.01637287, + 0.00763339, 1.26999275, 0.02815584, + 0.01637287, 0.02815584, 0.79133167; + + result[3] << 2.07025711, -0.31144095, -0.0706513, + -0.31144095, 1.15689355, 0.04576328, + -0.0706513, 0.04576328, 0.50801127; + + result[4] << 2.18793303, -0.32983868, -0.04048647, + -0.32983868, 1.66866414, -0.02994009, + -0.04048647, -0.02994009, 0.80134643; + + result[5] << 1.68059619, 0.00433328, 0.02441754, + 0.00433328, 1.59603546, 0.06329015, + 0.02441754, 0.06329015, 0.98561446; + + result[6] << 1.83708447, -0.05588412, 0.05925687, + -0.05588412, 1.84057265, -0.00582606, + 0.05925687, -0.00582606, 0.92893714; + + result[7] << 1.335889, 0.19615591, 0.06355339, + 0.19615591, 1.45048646, 0.02049389, + 0.06355339, 0.02049389, 0.7631058; + + result[8] << 1.40437247, 0.25649803, 0.0592415, + 0.25649803, 1.87131332, 0.07613302, + 0.0592415, 0.07613302, 0.87989762; + + result[9] << 1.78864325, 0.03549975, 0.0439749, + 0.03549975, 2.07865681, -0.02282802, + 0.0439749, -0.02282802, 1.10866339; + + result[10] << 1.79329993, 0.1583345, -0.06293884, + 0.1583345, 1.90312554, 0.12069132, + -0.06293884, 0.12069132, 0.99837833; + + result[11] << 1.65744301, 0.01070952, 0.01156087, + 0.01070952, 1.60544202, 0.0292213, + 0.01156087, 0.0292213, 1.15020022; + + return result; +} +} // namespace LogEuclidian + +//************************************** +//********** Geodesic Riemann ********** +//************************************** +namespace Riemann { +inline std::vector Reference() +{ + std::vector result(NB_TRIALS); + for (auto& m : result) { m.resize(NB_CHAN, NB_CHAN); } + + result[0] << 2.00307073, 0.5751925, 0.23695849, + 0.5751925, 1.77486363, 0.2733501, + 0.23695849, 0.2733501, 0.60804774; + + result[1] << 1.81293091, -0.3138307, -0.06654136, + -0.3138307, 1.53280236, 0.05341941, + -0.06654136, 0.05341941, 0.73374953; + + result[2] << 1.44271566, 0.00683161, 0.01652821, + 0.00683161, 1.26962877, 0.029471, + 0.01652821, 0.029471, 0.79258189; + + result[3] << 2.06594851, -0.31310631, -0.07385619, + -0.31310631, 1.15755075, 0.04790018, + -0.07385619, 0.04790018, 0.50936876; + + result[4] << 2.18427308, -0.33178678, -0.04048067, + -0.33178678, 1.66810514, -0.02812001, + -0.04048067, -0.02812001, 0.8032214; + + result[5] << 1.67854712, 0.00337028, 0.0244905, + 0.00337028, 1.59559946, 0.06467602, + 0.0244905, 0.06467602, 0.98719569; + + result[6] << 1.8346388, -0.05653261, 0.05946108, + -0.05653261, 1.83958383, -0.0043761, + 0.05946108, -0.0043761, 0.93070402; + + result[7] << 1.33364155, 0.19528644, 0.06320392, + 0.19528644, 1.45004209, 0.02219171, + 0.06320392, 0.02219171, 0.76451583; + + result[8] << 1.40188907, 0.2548021, 0.05901919, + 0.2548021, 1.8711256, 0.0781204, + 0.05901919, 0.0781204, 0.88141717; + + result[9] << 1.78638224, 0.03454505, 0.04380908, + 0.03454505, 2.07716326, -0.02075452, + 0.04380908, -0.02075452, 1.11079047; + + result[10] << 1.78975606, 0.15752572, -0.06172564, + 0.15752572, 1.90245691, 0.12203188, + -0.06172564, 0.12203188, 1.00070996; + + result[11] << 1.65542219, 0.00974451, 0.01178106, + 0.00974451, 1.60497797, 0.03095649, + 0.01178106, 0.03095649, 1.15199633; + + return result; +} +} // namespace Riemann +} // namespace InitGeodesics + +//************************************************************************ +//********** Initialisation Featurization Reference of Datasets ********** +//************************************************************************ +namespace InitFeaturization { +namespace TangentSpace { +inline std::vector Reference() +{ + std::vector result(NB_TRIALS); + for (auto& m : result) { m.resize(NB_FEATURES); } + + result[0] << 0.19923529, 0.81954961, 0.45583261, 0.06265258, 0.53984445, -0.74189243; + result[1] << 0.08020799, -0.56380364, -0.19863986, -0.12711376, -0.00487228, -0.24993702; + result[2] << -0.33927073, -0.0139971, -0.00466568, -0.46577928, -0.04826772, -0.09127522; + result[3] << 0.34039208, -0.59873603, -0.23557737, -0.70072935, 0.02089894, -0.98360691; + result[4] << 0.4605308, -0.52546299, -0.14067914, 0.04677775, -0.21048792, -0.06431401; + result[5] << -0.0365709, -0.02310847, 0.00568693, -0.0103298, 0.01443795, 0.34577556; + result[6] << 0.13870707, -0.11420977, 0.08057211, 0.27541021, -0.14045981, 0.22931806; + result[7] << -0.52065199, 0.37104578, 0.12469995, -0.21855289, -0.08508472, -0.16646769; + result[8] << -0.42665126, 0.41541091, 0.08741089, 0.28616558, 0.02832375, 0.11565408; + result[9] << 0.08700644, 0.0237524, 0.04023502, 0.51858937, -0.17189999, 0.58429274; + result[10] << 0.08116035, 0.22060811, -0.19108877, 0.32966629, 0.12395396, 0.36518821; + result[11] << -0.06409514, -0.01104878, -0.02378668, 0.00324331, -0.06638659, 0.65726463; + + return result; +} +} // namespace TangentSpace + +namespace Squeeze { +inline std::vector Reference() +{ + std::vector result(NB_TRIALS); + for (auto& m : result) { m.resize(NB_FEATURES); } + + result[0] << 2.58492880, 1.33543611, 0.511092833, 2.19748746, 0.527579698, 0.507583739; + result[1] << 1.99839975, -0.650968006, -0.150223386, 1.52895167, 0.0688523853, 0.652648582; + result[2] << 1.21758058, -0.000000000, 0.0130883610, 1.00554914, 0.0104706888, 0.756870279; + result[3] << 2.57527815, -0.621023059, -0.153239456, 0.897709368, 0.0564566417, 0.317012482; + result[4] << 2.87232755, -0.786745664, -0.0991696216, 1.81451826, -0.0991696216, 0.783154191; + result[5] << 1.64826027, -0.00963569008, 0.0289070702, 1.58803720, 0.0770855206, 1.17370253; + result[6] << 1.97426940, -0.149321794, 0.108597668, 2.11906629, -0.0814482510, 1.04666432; + result[7] << 1.06313148, 0.315509839, 0.0893944544, 1.33131485, 0.00000000, 0.705553667; + result[8] << 1.18724478, 0.490413981, 0.0959505616, 2.21604802, 0.111942322, 0.936707201; + result[9] << 1.86743369, 0.0558169410, 0.0744225880, 2.70096668, -0.148845176, 1.49159963; + result[10] << 1.89536719, 0.324938579, -0.160114662, 2.27210757, 0.207207210, 1.21252525; + result[11] << 1.60313579, 0.00319114656, 0.00000000, 1.60719310, -0.00136763424, 1.59967111; + + return result; +} +} // namespace Squeeze + +namespace SqueezeDiag { +inline std::vector Reference() +{ + std::vector result(NB_TRIALS); + for (auto& m : result) { m.resize(NB_FEATURES); } + + result[0] << 2.5849288, 2.19748746, 0.507583739, 1.33543611, 0.527579698, 0.511092833; + result[1] << 1.99839975, 1.52895167, 0.652648582, -0.650968006, 0.0688523853, -0.150223386; + result[2] << 1.21758058, 1.00554914, 0.756870279, -0.00, 0.0104706888, 0.013088361; + result[3] << 2.57527815, 0.897709368, 0.317012482, -0.621023059, 0.0564566417, -0.153239456; + result[4] << 2.87232755, 1.81451826, 0.783154191, -0.786745664, -0.0991696216, -0.0991696216; + result[5] << 1.64826027, 1.5880372, 1.17370253, -0.00963569008, 0.0770855206, 0.0289070702; + result[6] << 1.9742694, 2.11906629, 1.04666432, -0.149321794, -0.081448251, 0.108597668; + result[7] << 1.06313148, 1.33131485, 0.705553667, 0.315509839, 0.00, 0.0893944544; + result[8] << 1.18724478, 2.21604802, 0.936707201, 0.490413981, 0.111942322, 0.0959505616; + result[9] << 1.86743369, 2.70096668, 1.49159963, 0.055816941, -0.148845176, 0.074422588; + result[10] << 1.89536719, 2.27210757, 1.21252525, 0.324938579, 0.20720721, -0.160114662; + result[11] << 1.60313579, 1.6071931, 1.59967111, 0.00319114656, -0.00136763424, 0.00; + + return result; +} +} // namespace SqueezeDiag +} // namespace InitFeaturization + +//********************************************************************** +//********** Initialisation Classifiers Reference of Datasets ********** +//********************************************************************** +namespace InitClassif { +//************************** +//********** LSQR ********** +//************************** +namespace LSQR { +inline Eigen::MatrixXd Reference() +{ + Eigen::MatrixXd result(1, NB_FEATURES); + result << -5.62849964, 2.57528317, -0.41393163, 3.79788328, -1.7915752, 3.63071567; + return result; +} +} + +//********************************** +//********** FgDA Compute ********** +//********************************** +namespace FgDACompute { +inline Eigen::MatrixXd Reference() +{ + Eigen::MatrixXd result(NB_FEATURES, NB_FEATURES); + result << 0.45714834, -0.20916523, 0.03361964, -0.30846516, 0.14551225, -0.29488776, + -0.20916523, 0.09570218, -0.01538245, 0.14113622, -0.06657818, 0.13492396, + 0.03361964, -0.01538245, 0.00247246, -0.02268517, 0.01070127, -0.02168666, + -0.30846516, 0.14113622, -0.02268517, 0.20813978, -0.09818576, 0.1989783, + 0.14551225, -0.06657818, 0.01070127, -0.09818576, 0.04631716, -0.09386402, + -0.29488776, 0.13492396, -0.02168666, 0.1989783, -0.09386402, 0.19022007; + return result; +} +} // namespace FgDACompute +} // namespace InitClassif + +//***************************************************************************** +//********** Initialisation Matrix Classifiers Reference of Datasets ********** +//***************************************************************************** +namespace InitMatrixClassif { +namespace MDM { +inline Geometry::CMatrixClassifierMDM Reference() +{ + Geometry::CMatrixClassifierMDM result(NB_CLASS, Geometry::EMetric::Riemann); + std::vector means(NB_CLASS, Eigen::MatrixXd(NB_CHAN, NB_CHAN)); + + means[0] << 1.92849739, -0.1538202, 0.01072518, + -0.1538202, 1.41817199, 0.06326929, + 0.01072518, 0.06326929, 0.6661666; + + means[1] << 1.46525466, 0.258979, 0.03170221, + 0.258979, 1.94533383, 0.03574208, + 0.03170221, 0.03574208, 1.13153112; + + result.setMeans(means); + result.setTrialNumbers({ NB_TRIALS1, NB_TRIALS2 }); + return result; +} + +//The estimation method of riemann mean in matlab is different of the python and c++ method +inline Geometry::CMatrixClassifierMDM ReferenceMatlab() +{ + Geometry::CMatrixClassifierMDM result(NB_CLASS, Geometry::EMetric::Riemann); + std::vector means(NB_CLASS, Eigen::MatrixXd(NB_CHAN, NB_CHAN)); + + means[0] << 1.928499437649616, -0.153827038574370, 0.010747690754065, + -0.153827038574370, 1.418162423365369, 0.063273476393445, + 0.010747690754065, 0.063273476393445, 0.666171737852679; + + means[1] << 1.465253745853043, 0.258978164753603, 0.031701951674564, + 0.258978164753603, 1.945334998390171, 0.035741956583496, + 0.031701951674564, 0.035741956583496, 1.131530964874486; + + result.setMeans(means); + result.setTrialNumbers({ NB_TRIALS1, NB_TRIALS2 }); + return result; +} + +inline Geometry::CMatrixClassifierMDM AfterSupervised() +{ + Geometry::CMatrixClassifierMDM result(NB_CLASS, Geometry::EMetric::Riemann); + std::vector means(NB_CLASS, Eigen::MatrixXd(NB_CHAN, NB_CHAN)); + + means[0] << 1.928350313881734, -0.154041423123185, 0.010701374534393, + -0.154041423123186, 1.418273608417471, 0.063257455871936, + 0.010701374534394, 0.063257455871936, 0.666184815487807; + + means[1] << 1.465233762087830, 0.258934832669209, 0.031704171892215, + 0.258934832669209, 1.945307843854343, 0.035766052240045, + 0.031704171892215, 0.035766052240044, 1.131554685966728; + + result.setMeans(means); + result.setTrialNumbers({ 2 * NB_TRIALS1, 2 * NB_TRIALS2 }); + return result; +} + +inline Geometry::CMatrixClassifierMDM AfterUnSupervised() +{ + Geometry::CMatrixClassifierMDM result(NB_CLASS, Geometry::EMetric::Riemann); + std::vector means(NB_CLASS, Eigen::MatrixXd(NB_CHAN, NB_CHAN)); + + means[0] << 1.950943868870711, -0.167140250323899, 0.003222724880780, + -0.167140250323900, 1.360332213689968, 0.069395646598480, + 0.003222724880780, 0.069395646598480, 0.612498166151011; + + means[1] << 1.512203012203314, 0.207413861919226, 0.036590552326957, + 0.207413861919226, 1.921307138623116, 0.030422979119863, + 0.036590552326957, 0.030422979119864, 1.127225044244057; + + result.setMeans(means); + result.setTrialNumbers({ NB_TRIALS1 + 5, NB_TRIALS2 + 7 });// Find 5 & 7 times in Prediction + return result; +} + +inline std::vector Prediction() { return std::vector{ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }; } +inline std::vector PredictionSupervised() { return std::vector{ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }; } +inline std::vector PredictionUnSupervised() { return std::vector{ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }; } + +inline std::vector> PredictionDistance() +{ + std::vector> result(NB_TRIALS); + result[0] = { 1.314629453210111, 1.474855008515000 }; + result[1] = { 0.464333729201812, 1.051817099896226 }; + result[2] = { 0.601426917411240, 0.812445189801618 }; + result[3] = { 1.102877219889465, 1.849548724985433 }; + result[4] = { 0.626116626250442, 1.067153960330500 }; + result[5] = { 0.611993241506318, 0.331147184884182 }; + result[6] = { 0.635248202449675, 0.476499934085104 }; + result[7] = { 0.845377609077804, 0.747547515688392 }; + result[8] = { 0.951093615508598, 0.413321379328445 }; + result[9] = { 1.067347359524113, 0.552344271253539 }; + result[10] = { 0.856508614439436, 0.390553678952617 }; + result[11] = { 0.921536704800470, 0.459953813816839 }; + return result; +} + +inline std::vector> PredictionDistanceSupervised() +{ + std::vector> result(NB_TRIALS); + result[0] = { 1.314629453210111, 1.474855008515000 }; + result[1] = { 0.605125609448517, 1.051817099896226 }; + result[2] = { 0.632177503835419, 0.812445189801618 }; + result[3] = { 1.114890656799339, 1.849548724985433 }; + result[4] = { 0.716307916402446, 1.067153960330500 }; + result[5] = { 0.705594944810905, 0.331147184884182 }; + result[6] = { 0.684063787503923, 0.476499934085104 }; + result[7] = { 0.845432339540137, 0.747547515688392 }; + result[8] = { 0.951119668632168, 0.353451074348013 }; + result[9] = { 1.067314379382615, 0.686650119070229 }; + result[10] = { 0.856525175953122, 0.448063104241547 }; + result[11] = { 0.921512070536392, 0.511024366753348 }; + return result; +} + +inline std::vector> PredictionDistanceUnSupervised() +{ + std::vector> result(NB_TRIALS); + result[0] = { 1.314629453210111, 1.474855008515000 }; + result[1] = { 0.605125609448517, 1.051817099896226 }; + result[2] = { 0.632177503835419, 0.812445189801618 }; + result[3] = { 1.114890656799339, 1.849548724985433 }; + result[4] = { 0.716307916402446, 1.067153960330500 }; + result[5] = { 0.705594944810905, 0.331147184884182 }; + result[6] = { 0.729161284837321, 0.448637450763909 }; + result[7] = { 0.871245756539967, 0.786138798955233 }; + result[8] = { 1.017636018350342, 0.439519359143378 }; + result[9] = { 1.163460730752319, 0.623259567590992 }; + result[10] = { 0.942113031918693, 0.422541764097218 }; + result[11] = { 1.014624974936401, 0.472684060628136 }; + + return result; +} +} // namespace MDM + +namespace FgMDMRT { +inline Geometry::CMatrixClassifierFgMDMRT Reference() +{ + Geometry::CMatrixClassifierFgMDMRT result(NB_CLASS, Geometry::EMetric::Riemann); + std::vector means(NB_CLASS, Eigen::MatrixXd(NB_CHAN, NB_CHAN)); + + means[0] << 2.08042432, -0.08968098, 0.03145977, + -0.08968098, 1.41163613, 0.09127538, + 0.03145977, 0.09127538, 0.734828; + + means[1] << 1.30840283, 0.15716713, 0.00232698, + 0.15716713, 1.93455782, -0.01963492, + 0.00232698, -0.01963492, 0.98852719; + + Eigen::MatrixXd ref(NB_CHAN, NB_CHAN); + ref << 1.70952664, 0.01674082, 0.02077766, + 0.01674082, 1.60344581, 0.05423902, + 0.02077766, 0.05423902, 0.8303257; + + Eigen::MatrixXd weight = Eigen::MatrixXd(NB_FEATURES, NB_FEATURES); + weight << 0.45714834, -0.20916523, 0.03361964, -0.30846516, 0.14551225, -0.29488776, + -0.20916523, 0.09570218, -0.01538245, 0.14113622, -0.06657818, 0.13492396, + 0.03361964, -0.01538245, 0.00247246, -0.02268517, 0.01070127, -0.02168666, + -0.30846516, 0.14113622, -0.02268517, 0.20813978, -0.09818576, 0.1989783, + 0.14551225, -0.06657818, 0.01070127, -0.09818576, 0.04631716, -0.09386402, + -0.29488776, 0.13492396, -0.02168666, 0.1989783, -0.09386402, 0.19022007; + + + result.setMeans(means); + result.setRef(ref); + result.setWeight(weight); + result.setTrialNumbers({ NB_TRIALS1, NB_TRIALS2 }); + return result; +} + +inline Geometry::CMatrixClassifierFgMDMRT AfterSupervised() { return Geometry::CMatrixClassifierFgMDMRT(NB_CLASS, Geometry::EMetric::Riemann); } +inline Geometry::CMatrixClassifierFgMDMRT AfterUnSupervised() { return Geometry::CMatrixClassifierFgMDMRT(NB_CLASS, Geometry::EMetric::Riemann); } +inline std::vector Prediction() { return std::vector{ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }; } +inline std::vector PredictionSupervised() { return std::vector{ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }; } +inline std::vector PredictionUnSupervised() { return std::vector{ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }; } + +inline std::vector> PredictionDistance() +{ + std::vector> result(NB_TRIALS); + result[0] = { 0.02665352, 0.71870784 }; + result[1] = { 0.0963665, 0.78842083 }; + result[2] = { 0.27172762, 0.4203267 }; + result[3] = { 0.86848167, 1.56053599 }; + result[4] = { 0.13999143, 0.83204575 }; + result[5] = { 0.44863838, 0.24341594 }; + result[6] = { 0.41112711, 0.28092722 }; + result[7] = { 0.59496729, 0.09708703 }; + result[8] = { 0.87589215, 0.18383782 }; + result[9] = { 0.76329856, 0.07124423 }; + result[10] = { 0.59422854, 0.09782578 }; + result[11] = { 0.63188509, 0.06016924 }; + return result; +} + +inline std::vector> PredictionDistanceSupervised() { return std::vector>(NB_TRIALS, { 0, 0 }); } +inline std::vector> PredictionDistanceUnSupervised() { return std::vector>(NB_TRIALS, { 0, 0 }); } +} // namespace FgMDMRT + +namespace MDMRebias { +inline Geometry::CMatrixClassifierMDMRebias Reference() +{ + Geometry::CMatrixClassifierMDMRebias result(NB_CLASS, Geometry::EMetric::Riemann); + std::vector means(NB_CLASS, Eigen::MatrixXd(NB_CHAN, NB_CHAN)); + + means[0] << 1.129204848898484, -0.103109478655884, -0.005579207794177, + -0.103109478655884, 0.884890317836479, 0.015961516899074, + -0.005579207794177, 0.015961516899074, 0.801503003117589; + + means[1] << 0.855588028031272, 0.146119935000422, 0.004175889722330, + 0.146119935000422, 1.212891172460091, -0.030535218161296, + 0.004175889722330, -0.030535218161296, 1.364418888484737; + + Geometry::CBias bias; + bias.setClassificationNumber(0); + Eigen::MatrixXd m(NB_CHAN, NB_CHAN); + m << 1.709522177383279, 0.016735943232583, 0.020785623695383, + 0.016735943232582, 1.603446473585329, 0.054241640196169, + 0.020785623695383, 0.054241640196169, 0.830327834469631; + bias.setBias(m); + + result.setMeans(means); + result.setTrialNumbers({ NB_TRIALS1, NB_TRIALS2 }); + result.setBias(bias); + return result; +} + +inline Geometry::CMatrixClassifierMDMRebias After() +{ + Geometry::CMatrixClassifierMDMRebias result(NB_CLASS, Geometry::EMetric::Riemann); + std::vector means(NB_CLASS, Eigen::MatrixXd(NB_CHAN, NB_CHAN)); + + means[0] << 1.129204848898484, -0.103109478655884, -0.005579207794177, + -0.103109478655884, 0.884890317836479, 0.015961516899074, + -0.005579207794177, 0.015961516899074, 0.801503003117589; + + means[1] << 0.855588028031272, 0.146119935000422, 0.004175889722330, + 0.146119935000422, 1.212891172460091, -0.030535218161296, + 0.004175889722330, -0.030535218161296, 1.364418888484737; + + Geometry::CBias bias; + bias.setClassificationNumber(NB_TRIALS); + Eigen::MatrixXd m(NB_CHAN, NB_CHAN); + m << 1.705589799010000, 0.015745816879592, 0.019622109841865, + 0.015745816879592, 1.606186296382902, 0.055107313019667, + 0.019622109841864, 0.055107313019667, 0.830841812602058; + bias.setBias(m); + + result.setMeans(means); + result.setTrialNumbers({ NB_TRIALS1, NB_TRIALS2 }); + result.setBias(bias); + return result; +} + +inline Geometry::CMatrixClassifierMDMRebias AfterSupervised() +{ + Geometry::CMatrixClassifierMDMRebias result(NB_CLASS, Geometry::EMetric::Riemann); + std::vector means(NB_CLASS, Eigen::MatrixXd(NB_CHAN, NB_CHAN)); + + means[0] << 1.077801701232086, -0.135609812697659, -0.032311282008452, + -0.135609812697659, 0.947469327241560, -0.034394668642257, + -0.032311282008452, -0.034394668642258, 0.986389056463633; + + means[1] << 0.846602361879856, 0.168419115431573, 0.000436175648620, + 0.168419115431572, 1.264667771319573, -0.037722396726046, + 0.000436175648620, -0.037722396726045, 1.474562819298618; + + Geometry::CBias bias; + bias.setClassificationNumber(NB_TRIALS); + Eigen::MatrixXd m(NB_CHAN, NB_CHAN); + m << 1.705589799010000, 0.015745816879592, 0.019622109841865, + 0.015745816879592, 1.606186296382902, 0.055107313019667, + 0.019622109841864, 0.055107313019667, 0.830841812602058; + bias.setBias(m); + + result.setMeans(means); + result.setTrialNumbers({ 2 * NB_TRIALS1, 2 * NB_TRIALS2 }); + result.setBias(bias); + return result; +} + +inline Geometry::CMatrixClassifierMDMRebias AfterUnSupervised() +{ + Geometry::CMatrixClassifierMDMRebias result(NB_CLASS, Geometry::EMetric::Riemann); + std::vector means(NB_CLASS, Eigen::MatrixXd(NB_CHAN, NB_CHAN)); + + means[0] << 1.163328386007378, -0.071528982784288, 0.003415904977547, + -0.071528982784288, 0.865367469644902, 0.037539841921305, + 0.003415904977547, 0.037539841921304, 0.725209905616625; + + means[1] << 0.867551363970510, 0.027654580821275, -0.039319369201831, + 0.027654580821275, 1.192704425561919, -0.114920170106705, + -0.039319369201831, -0.114920170106704, 1.554798562413437; + + Geometry::CBias bias; + bias.setClassificationNumber(NB_TRIALS); + Eigen::MatrixXd m(NB_CHAN, NB_CHAN); + m << 1.705589799010000, 0.015745816879592, 0.019622109841865, + 0.015745816879592, 1.606186296382902, 0.055107313019667, + 0.019622109841864, 0.055107313019667, 0.830841812602058; + bias.setBias(m); + + result.setMeans(means); + result.setTrialNumbers({ NB_TRIALS1 + 2, NB_TRIALS2 + 10 });// Find 2 & 10 times in Prediction + result.setBias(bias); + return result; +} + +inline std::vector Prediction() { return std::vector{ 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1 }; } +inline std::vector PredictionSupervised() { return std::vector{ 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1 }; } +inline std::vector PredictionUnSupervised() { return std::vector{ 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1 }; } + +inline std::vector> PredictionDistance() +{ + std::vector> result(NB_TRIALS); + result[0] = { 1.314629453210112, 1.474855008515001 }; + result[1] = { 1.695656381031027, 1.841285722807642 }; + result[2] = { 0.985038237804275, 0.841748947395782 }; + result[3] = { 0.893165255444375, 1.599278236985282 }; + result[4] = { 0.999895116206910, 0.941884079636976 }; + result[5] = { 1.137476666505600, 0.465758462215674 }; + result[6] = { 1.011555978384045, 0.477398295992067 }; + result[7] = { 1.061656174626915, 0.693427342482516 }; + result[8] = { 1.170383892226384, 0.490874398142692 }; + result[9] = { 1.264605170966096, 0.711483172971687 }; + result[10] = { 0.958316311213036, 0.443514577199302 }; + result[11] = { 0.979165666917157, 0.506488669219013 }; + return result; +} + +inline std::vector> PredictionDistanceSupervised() +{ + std::vector> result(NB_TRIALS); + result[0] = { 1.314629453210112, 1.474855008515001 }; + result[1] = { 1.855966579223177, 1.841285722807642 }; + result[2] = { 0.958576739762368, 0.841748947395782 }; + result[3] = { 0.923258071960562, 1.599278236985282 }; + result[4] = { 0.972293627395511, 0.941884079636976 }; + result[5] = { 1.081434198790791, 0.465758462215674 }; + result[6] = { 0.886487914539492, 0.477398295992067 }; + result[7] = { 1.019626392142984, 0.693427342482516 }; + result[8] = { 1.065871792145533, 0.446604052630479 }; + result[9] = { 1.069057512264309, 0.803506934337151 }; + result[10] = { 0.813748223596456, 0.477967335007498 }; + result[11] = { 0.768497985059151, 0.533247406413060 }; + return result; +} + +inline std::vector> PredictionDistanceUnSupervised() +{ + std::vector> result(NB_TRIALS); + result[0] = { 1.314629453210112, 1.474855008515001 }; + result[1] = { 1.855966579223177, 1.841285722807642 }; + result[2] = { 1.077703693722418, 0.677588292749563 }; + result[3] = { 0.990907763223969, 1.416399657557998 }; + result[4] = { 1.102040763358186, 0.797780684168623 }; + result[5] = { 1.233329154201637, 0.544647072527355 }; + result[6] = { 1.103888150188716, 0.487000074621019 }; + result[7] = { 1.094214879276997, 0.921591225768512 }; + result[8] = { 1.223770999299696, 0.714324156664128 }; + result[9] = { 1.357590792239233, 0.679090817494962 }; + result[10] = { 1.028663404532504, 0.505823409893398 }; + result[11] = { 1.085189723107800, 0.367393525001945 }; + return result; +} +} // namespace MDMRebias + +namespace FgMDM { +inline Geometry::CMatrixClassifierFgMDM Reference() +{ + Geometry::CMatrixClassifierFgMDM result(NB_CLASS, Geometry::EMetric::Riemann); + std::vector means(NB_CLASS, Eigen::MatrixXd(NB_CHAN, NB_CHAN)); + + means[0] << 2.08042432, -0.08968098, 0.03145977, + -0.08968098, 1.41163613, 0.09127538, + 0.03145977, 0.09127538, 0.734828; + + means[1] << 1.30840283, 0.15716713, 0.00232698, + 0.15716713, 1.93455782, -0.01963492, + 0.00232698, -0.01963492, 0.98852719; + + Eigen::MatrixXd ref(NB_CHAN, NB_CHAN); + ref << 1.70952664, 0.01674082, 0.02077766, + 0.01674082, 1.60344581, 0.05423902, + 0.02077766, 0.05423902, 0.8303257; + + Eigen::MatrixXd weight = Eigen::MatrixXd(NB_FEATURES, NB_FEATURES); + weight << 0.45714834, -0.20916523, 0.03361964, -0.30846516, 0.14551225, -0.29488776, + -0.20916523, 0.09570218, -0.01538245, 0.14113622, -0.06657818, 0.13492396, + 0.03361964, -0.01538245, 0.00247246, -0.02268517, 0.01070127, -0.02168666, + -0.30846516, 0.14113622, -0.02268517, 0.20813978, -0.09818576, 0.1989783, + 0.14551225, -0.06657818, 0.01070127, -0.09818576, 0.04631716, -0.09386402, + -0.29488776, 0.13492396, -0.02168666, 0.1989783, -0.09386402, 0.19022007; + + result.setMeans(means); + result.setRef(ref); + result.setWeight(weight); + result.setTrialNumbers({ NB_TRIALS1, NB_TRIALS2 }); + result.setDataset(InitCovariance::LWF::Reference()); + return result; +} + +inline Geometry::CMatrixClassifierFgMDM AfterSupervised() { return Geometry::CMatrixClassifierFgMDM(NB_CLASS, Geometry::EMetric::Riemann); } + +inline Geometry::CMatrixClassifierFgMDM AfterUnSupervised() { return Geometry::CMatrixClassifierFgMDM(NB_CLASS, Geometry::EMetric::Riemann); } + +inline std::vector PredictionSupervised() { return std::vector{ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }; } +inline std::vector PredictionUnSupervised() { return std::vector{ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }; } + +inline std::vector> PredictionDistanceSupervised() { return std::vector>(NB_TRIALS, { 0, 0 }); } + +inline std::vector> PredictionDistanceUnSupervised() { return std::vector>(NB_TRIALS, { 0, 0 }); } +} // namespace FgMDM + +namespace FgMDMRTRebias { +inline Geometry::CMatrixClassifierFgMDMRTRebias Reference() +{ + Geometry::CMatrixClassifierFgMDMRTRebias result(NB_CLASS, Geometry::EMetric::Riemann); + std::vector means(NB_CLASS, Eigen::MatrixXd(NB_CHAN, NB_CHAN)); + + means[0] << 1.21749102419878, -0.065244040475294, 0.00919064364644959, + -0.0652440404752944, 0.879520180058735, 0.0383106920991925, + 0.00919064364644961, 0.0383106920991925, 0.882712321945327; + + means[1] << 0.764724285777722, 0.0858374005624361, -0.0164757238732658, + 0.0858374005624357, 1.20857271214632, -0.0743441311282506, + -0.0164757238732657, -0.0743441311282506, 1.19491180388651; + + const Eigen::MatrixXd ref = Eigen::MatrixXd::Identity(NB_CHAN, NB_CHAN); + Eigen::MatrixXd weight = Eigen::MatrixXd(NB_FEATURES, NB_FEATURES); + weight << 0.457148328143448, -0.209165242331525, 0.0336196848430174, -0.308465155960592, 0.145512230780716, -0.294887759430561, + -0.209165242331525, 0.0957021953405835, -0.0153824679964544, 0.141136224558352, -0.0665781741717288, 0.134923975140382, + 0.0336196848430174, -0.0153824679964544, 0.00247246492956471, -0.0226852001637271, 0.0107012867344819, -0.0216866888180067, + -0.308465155960592, 0.141136224558352, -0.0226852001637271, 0.208139779988291, -0.098185753285447, 0.19897830332888, + 0.145512230780716, -0.0665781741717288, 0.0107012867344819, -0.098185753285447, 0.0463171535435127, -0.0938640110069554, + -0.294887759430561, 0.134923975140382, -0.0216866888180067, 0.19897830332888, -0.0938640110069554, 0.190220078054599; + + Geometry::CBias bias; + bias.setClassificationNumber(0); + Eigen::MatrixXd m(NB_CHAN, NB_CHAN); + m << 1.70952703700155, 0.0167406580855047, 0.0207774590925802, + 0.0167406580855047, 1.60344585621418, 0.0542388460600326, + 0.0207774590925802, 0.0542388460600327, 0.830325461380695; + bias.setBias(m); + + result.setMeans(means); + result.setRef(ref); + result.setWeight(weight); + result.setTrialNumbers({ NB_TRIALS1, NB_TRIALS2 }); + result.setBias(bias); + return result; +} + +inline Geometry::CMatrixClassifierFgMDMRTRebias After() +{ + Geometry::CMatrixClassifierFgMDMRTRebias result(NB_CLASS, Geometry::EMetric::Riemann); + std::vector means(NB_CLASS, Eigen::MatrixXd(NB_CHAN, NB_CHAN)); + + means[0] << 2.08042432, -0.08968098, 0.03145977, + -0.08968098, 1.41163613, 0.09127538, + 0.03145977, 0.09127538, 0.734828; + + means[1] << 1.30840283, 0.15716713, 0.00232698, + 0.15716713, 1.93455782, -0.01963492, + 0.00232698, -0.01963492, 0.98852719; + + Eigen::MatrixXd ref(NB_CHAN, NB_CHAN); + ref << 1.70952664, 0.01674082, 0.02077766, + 0.01674082, 1.60344581, 0.05423902, + 0.02077766, 0.05423902, 0.8303257; + + Eigen::MatrixXd weight = Eigen::MatrixXd(NB_FEATURES, NB_FEATURES); + weight << 0.45714834, -0.20916523, 0.03361964, -0.30846516, 0.14551225, -0.29488776, + -0.20916523, 0.09570218, -0.01538245, 0.14113622, -0.06657818, 0.13492396, + 0.03361964, -0.01538245, 0.00247246, -0.02268517, 0.01070127, -0.02168666, + -0.30846516, 0.14113622, -0.02268517, 0.20813978, -0.09818576, 0.1989783, + 0.14551225, -0.06657818, 0.01070127, -0.09818576, 0.04631716, -0.09386402, + -0.29488776, 0.13492396, -0.02168666, 0.1989783, -0.09386402, 0.19022007; + + Geometry::CBias bias; + bias.setClassificationNumber(0); + Eigen::MatrixXd m(NB_CHAN, NB_CHAN); + m << 1.709522177383279, 0.016735943232583, 0.020785623695383, + 0.016735943232582, 1.603446473585329, 0.054241640196169, + 0.020785623695383, 0.054241640196169, 0.830327834469631; + bias.setBias(m); + + result.setMeans(means); + result.setRef(ref); + result.setWeight(weight); + result.setTrialNumbers({ NB_TRIALS1, NB_TRIALS2 }); + result.setBias(bias); + return result; +} + +inline Geometry::CMatrixClassifierFgMDMRTRebias AfterSupervised() +{ + Geometry::CMatrixClassifierFgMDMRTRebias result(NB_CLASS, Geometry::EMetric::Riemann); + const std::vector means(NB_CLASS, Eigen::MatrixXd::Zero(NB_CHAN, NB_CHAN)); + const Eigen::MatrixXd ref = Eigen::MatrixXd::Zero(NB_CHAN, NB_CHAN); + const Eigen::MatrixXd weight = Eigen::MatrixXd::Zero(NB_FEATURES, NB_FEATURES); + + Geometry::CBias bias; + bias.setClassificationNumber(0); + const Eigen::MatrixXd m = Eigen::MatrixXd::Zero(NB_CHAN, NB_CHAN); + bias.setBias(m); + + result.setMeans(means); + result.setRef(ref); + result.setWeight(weight); + result.setTrialNumbers({ NB_TRIALS1, NB_TRIALS2 }); + result.setBias(bias); + return result; +} + +inline Geometry::CMatrixClassifierFgMDMRTRebias AfterUnSupervised() +{ + Geometry::CMatrixClassifierFgMDMRTRebias result(NB_CLASS, Geometry::EMetric::Riemann); + const std::vector means(NB_CLASS, Eigen::MatrixXd::Zero(NB_CHAN, NB_CHAN)); + const Eigen::MatrixXd ref = Eigen::MatrixXd::Zero(NB_CHAN, NB_CHAN); + const Eigen::MatrixXd weight = Eigen::MatrixXd::Zero(NB_FEATURES, NB_FEATURES); + + Geometry::CBias bias; + bias.setClassificationNumber(0); + const Eigen::MatrixXd m = Eigen::MatrixXd::Zero(NB_CHAN, NB_CHAN); + bias.setBias(m); + + result.setMeans(means); + result.setRef(ref); + result.setWeight(weight); + result.setTrialNumbers({ NB_TRIALS1, NB_TRIALS2 }); + result.setBias(bias); + return result; +} + +inline std::vector Prediction() { return std::vector{ 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1 }; } +inline std::vector PredictionSupervised() { return std::vector{ 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1 }; } +inline std::vector PredictionUnSupervised() { return std::vector{ 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1 }; } + +inline std::vector> PredictionDistance() +{ + std::vector> result(NB_TRIALS); + result[0] = { 0.02665352, 0.71870784 }; + result[1] = { 0.0963665, 0.78842083 }; + result[2] = { 0.27172762, 0.4203267 }; + result[3] = { 0.86848167, 1.56053599 }; + result[4] = { 0.13999143, 0.83204575 }; + result[5] = { 0.44863838, 0.24341594 }; + result[6] = { 0.41112711, 0.28092722 }; + result[7] = { 0.59496729, 0.09708703 }; + result[8] = { 0.87589215, 0.18383782 }; + result[9] = { 0.76329856, 0.07124423 }; + result[10] = { 0.59422854, 0.09782578 }; + result[11] = { 0.63188509, 0.06016924 }; + return result; +} + +inline std::vector> PredictionDistanceSupervised() { return std::vector>(NB_TRIALS, { 0, 0 }); } +inline std::vector> PredictionDistanceUnSupervised() { return std::vector>(NB_TRIALS, { 0, 0 }); } +} // namespace FgMDMRTRebias +} // namespace InitMatrixClassif + +//********************************************************************************** +//********** Initialisation Eigen Vector and Values Reference of Datasets ********** +//********************************************************************************** + +namespace InitEigenVector { +namespace Euclidian { + +inline std::vector Vectors() +{ + std::vector res(NB_TRIALS); + for (auto& m : res) { m.resize(NB_CHAN, NB_CHAN); } + res[0] << -0.099719220313203, -0.669586208598549, -0.736009773273933, + -0.205281981382212, 0.737627797680837, -0.643245318839019, + 0.973609462371807, 0.086945622909601, -0.211009652473392; + + res[1] << 0.111965318724019, -0.566910883218780, 0.816134681220650, + 0.005003184831306, -0.820966898831894, -0.570953867807099, + 0.993699519746574, 0.068010304443119, -0.089083460557960; + + res[2] << -0.028322884385997, -0.002589190683924, -0.999595473334918, + -0.041914725312920, 0.999120210419451, -0.001400333293987, + 0.998719665382634, 0.041858108210884, -0.028406491423723; + + res[3] << 0.057976175973508, 0.314331831622869, -0.947541166730027, + -0.034357038854548, 0.949203633909741, 0.312781161922661, + 0.997726594263497, 0.014420852996801, 0.065830707866533; + + res[4] << 0.110221488627708, 0.456226738337136, -0.883010977661632, + 0.173352582988355, 0.865982087312907, 0.469067059624150, + 0.978672624229348, -0.204773503362712, 0.016361751269464; + + res[5] << -0.061397704657684, 0.089033331062346, -0.994134491818240, + -0.177429035713844, 0.979176579240238, 0.098651730613507, + 0.982216503194903, 0.182445314073361, -0.044322096343130; + + res[6] << -0.104727574488823, -0.834720521380581, 0.540623516254907, + 0.059897872088547, -0.547920220834614, -0.834383410980714, + 0.992695512259904, -0.055000752601024, 0.107380338760729; + + res[7] << -0.344452747212933, 0.756355847824317, 0.556127805813935, + 0.164894212714269, -0.534427151764618, 0.828973774054463, + 0.924208960977335, 0.377244550548736, 0.059366198551682; + + res[8] << -0.455815137256683, 0.808206330423871, 0.372874091497991, + 0.094520279409775, -0.372603305244511, 0.923164499805514, + 0.885041511697598, 0.456036516502403, 0.093446338549907; + + res[9] << -0.193758278930433, -0.979526714631217, -0.054636477464149, + 0.125183968787669, 0.030551025517024, -0.991663052048641, + 0.973029651811539, -0.198982537333385, 0.116701527547344; + + res[10] << 0.289237149384199, -0.831656691056042, -0.474013733596209, + -0.245334651412988, 0.414238018239343, -0.876480332386991, + 0.925285242631790, 0.369802666927723, -0.084221180833406; + + res[11] << -0.207072974526103, 0.859122563191672, -0.468005560475390, + 0.248087389502956, -0.416625413178840, -0.874571845112321, + 0.946347415271221, 0.297206471175398, 0.126865610395201; + + return res; +} + +inline std::vector> Values() +{ + std::vector> res(NB_TRIALS); + + res[0] = { 0.343998245316627, 1.047423892831558, 3.898577860851816 }; + res[1] = { 0.636068793285036, 1.073728055690744, 2.470203153024218 }; + res[2] = { 0.756059664962492, 1.005987809161390, 1.217952524876117 }; + res[3] = { 0.306163898067430, 0.692913309767313, 2.790922792165257 }; + res[4] = { 0.754419420371384, 1.423485809899146, 3.292094770729470 }; + res[5] = { 1.157970726170646, 1.601524036502682, 1.650505237326672 }; + res[6] = { 1.030292988524935, 1.883408477175503, 2.226298544299563 }; + res[7] = { 0.672236347320348, 0.884784932899411, 1.542978716780240 }; + res[8] = { 0.899245795614905, 1.015292513408225, 2.425461691976871 }; + res[9] = { 1.457630446872362, 1.880811100141710, 2.721558452985928 }; + res[10] = { 1.107534688634524, 1.804715500663015, 2.467749820702463 }; + res[11] = { 1.599312581194488, 1.601588266036556, 1.609099152768956 }; + + return res; +} + +} // namespace Euclidian +namespace Riemann { + +inline std::vector Vectors() +{ + std::vector res(NB_TRIALS); + for (auto& m : res) { m.resize(NB_CHAN, NB_CHAN); } + res[0] << 0.683177314172643, 0.356305060740859, 0.637428789034749, + 0.596254535002547, 0.231781884566798, -0.768607629077125, + 0.421603233963818, -0.905165101888665, 0.054100382938877; + + res[1] << -0.804528392658639, -0.036641392375157, 0.592782821757612, + 0.576875792719752, 0.189145783947360, 0.794630852779387, + 0.141238752401966, -0.981265142955638, 0.131035621264554; + + res[2] << 0.370856488267809, -0.927087072115963, 0.054543797311153, + 0.135794568403219, 0.112234325869184, 0.984359330371218, + 0.918708495825446, 0.357649293040181, -0.167516216785142; + + res[3] << -0.777574590698155, -0.470497128169579, 0.417145308357621, + 0.352002391805965, 0.224004159793369, 0.908799456732973, + 0.521029818785332, -0.853495511868367, 0.008563828412483; + + res[4] << -0.852200602468148, -0.348762320327424, -0.390024328821622, + 0.522881706515124, -0.594304304543298, -0.611062283726576, + 0.018677637558245, 0.724684232974016, -0.688827923602190; + + res[5] << -0.994896919437310, 0.004425680235693, -0.100799469485717, + 0.035551250093998, 0.950342881863922, -0.309167455446607, + -0.094425782024322, 0.311173296163130, 0.945650544040486; + + res[6] << 0.493492935585655, -0.848951899725937, -0.189064524643771, + -0.854929504871917, -0.513442400504876, 0.073975962739598, + 0.159875777485248, -0.125130225427405, 0.979174224772065; + + res[7] << 0.571527861854678, 0.121096129587873, 0.811598195243593, + 0.728493396347230, 0.380359676034618, -0.569757745296470, + 0.377694684371250, -0.916876351666721, -0.129168421651830; + + res[8] << 0.477199220498479, -0.005594736821533, 0.878777334070208, + 0.863025617423313, 0.191571748880577, -0.467425982056996, + 0.165733785411286, -0.981462665591888, -0.096246290435066; + + res[9] << -0.057676575400144, -0.942969112312847, -0.327845490855118, + -0.986930132179911, 0.004358779254142, 0.161089773849114, + 0.150473674925072, -0.332851700111830, 0.930896030116795; + + res[10] << -0.619029132884173, -0.643912841267474, 0.449643398140703, + -0.781168599478668, 0.445692815423151, -0.437188212865720, + -0.081108272261252, 0.621879543907849, 0.778901329463341; + + res[11] << -0.506535909250893, 0.426948212351236, 0.749090512961855, + -0.837796356881654, -0.038403649506972, -0.544630539081656, + 0.203761225544018, 0.903460228053582, -0.377148484406567; + + return res; +} + +inline std::vector> Values() +{ + std::vector> res(NB_TRIALS); + + res[0] = { 4.073187688916203, 2.162587306518192, 1.025374454830789 }; + res[1] = { 3.435489024573568, 2.279680027983445, 2.036513370662008 }; + res[2] = { 2.057398179893756, 2.019925692630136, 1.984777599444540 }; + res[3] = { 3.925383089438475, 3.559258065718881, 2.185452461332125 }; + res[4] = { 4.006415184752641, 2.386938299220804, 2.113758995206569 }; + res[5] = { 2.247524315394388, 2.207809023521016, 1.943690511452435 }; + res[6] = { 2.763686871540375, 2.395516400026313, 1.965812106992753 }; + res[7] = { 2.175635908551394, 2.028557415426327, 1.478675960408231 }; + res[8] = { 2.765398368473225, 1.884906422321359, 1.573787029619139 }; + res[9] = { 3.124672536007347, 2.389738038023637, 2.124981903599315 }; + res[10] = { 2.835071279823153, 2.375727383201085, 1.852703353517745 }; + res[11] = { 2.230954201427166, 2.225389092373921, 2.223355992103003 }; + + return res; +} + +} // namespace Riemann +} // namespace InitEigenVector + +//************************************************************** +//********** Initialisation ASR Reference of Datasets ********** +//************************************************************** +namespace InitASR { +namespace Euclidian { + +inline Geometry::CASR Reference() +{ + Geometry::CASR res(Geometry::EMetric::Euclidian); + Eigen::MatrixXd median(3, 3), threshold(3, 3), r(3, 3); + median << 1.32267188, 0.00105802, 0.00871490, + 0.00105802, 1.32447262, 0.01829110, + 0.00871490, 0.01829110, 1.02823244; + threshold << -0.05738723, -0.12041171, 1.96255648, + 3.44737720, -1.60950341, 0.00205466, + 1.31840128, 2.82413924, 0.21182516; + r.setIdentity(); + + res.setMatrices(median, threshold, r); + return res; +} + +} // namespace Euclidian + +namespace Riemann { + +inline Geometry::CASR Reference() +{ + Geometry::CASR res(Geometry::EMetric::Riemann); + Eigen::MatrixXd median(3, 3), threshold(3, 3), r(3, 3); + median << 1.32267188, 0.00105802, 0.00871490, + 0.00105802, 1.32447262, 0.01829110, + 0.00871490, 0.01829110, 1.02823244; + threshold << -0.05738723, -0.12041171, 1.96255648, + 3.44737720, -1.60950341, 0.00205466, + 1.31840128, 2.82413924, 0.21182516; + r.setIdentity(); + + res.setMatrices(median, threshold, r); + return res; +} + +} // namespace Riemann +} // namespace InitASR diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/test/main.cpp b/Masterarbeit/openvibe/extras-master/modules/geometry/test/main.cpp new file mode 100644 index 0000000..cfe7366 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/test/main.cpp @@ -0,0 +1,36 @@ +#include "gtest/gtest.h" + +// ReSharper disable CppUnusedIncludeDirective +#include "test_Basics.hpp" +#include "test_Covariance.hpp" +#include "test_Mean.hpp" +#include "test_Median.hpp" +#include "test_Misc.hpp" +#include "test_Distance.hpp" +#include "test_Geodesics.hpp" +#include "test_Featurization.hpp" +#include "test_Classifier.hpp" +#include "test_MatrixClassifier.hpp" +#include "test_ASR.hpp" +// ReSharper restore CppUnusedIncludeDirective + +int main(int argc, char** argv) +{ + try + { + //Code coverage tips (this functions are used only if tests failed) + const size_t dumS = 0; + const double dumD = 0; + const Eigen::MatrixXd dumM = Eigen::MatrixXd::Identity(2, 2); + const std::vector dumV = { 0, 0 }; + const Geometry::CMatrixClassifierMDM dumC; + ErrorMsg("", dumS, dumS); + ErrorMsg("", dumD, dumD); + ErrorMsg("", dumM, dumM); + ErrorMsg("", dumV, dumV); + ErrorMsg("", dumC, dumC); + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); + } + catch (std::exception&) { return 1; } +} diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/test/misc.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/test/misc.hpp new file mode 100644 index 0000000..11213e6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/test/misc.hpp @@ -0,0 +1,120 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file misc.hpp +/// \brief Some constants and functions for google tests +/// \author Thibaut Monseigne (Inria). +/// \version 0.1. +/// \date 26/10/2018. +/// \copyright GNU Affero General Public License v3.0. +/// \remarks +/// - For this test I compare the results with the pyRiemann library (License) or sklearn if pyRiemman just redirect the function. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include +#include +#include + +#include +#include + +const std::string SEP = "\n====================\n"; + +//********************************************************************************* +//********** Comparison of values with epsilon tolerance for google test ********** +//********************************************************************************* +/// Check if two doubles are almost equal. +/// The first value. +/// The second value. +/// (Optional) The epsilon tolerance. +/// True if almost equal, false if not. +inline bool isAlmostEqual(const double x, const double y, const double epsilon = 0.0001) { return std::abs(x - y) < epsilon; } + +/// Check if sum of two vectors are almost equal. +/// Generic numeric type parameter. +/// \copydetails isAlmostEqual(const double, const double, const double) +template ::value, T>::type> +bool isAlmostEqual(const std::vector& x, const std::vector& y, const double epsilon = 0.0001) +{ + double xsum = 0.0, ysum = 0.0; + for (const auto& n : x) { xsum += n; } + for (const auto& n : y) { ysum += n; } + return (x.size() == y.size() && isAlmostEqual(xsum, ysum, epsilon)); +} + +/// Check if sum of two matrix are almost equal. +/// \copydetails isAlmostEqual(const double, const double, const double) +inline bool isAlmostEqual(const Eigen::MatrixXd& x, const Eigen::MatrixXd& y, const double epsilon = 0.0001) +{ + return x.size() == y.size() && isAlmostEqual(x.cwiseAbs().sum(), y.cwiseAbs().sum(), epsilon); +} + +//***************************************************************** +//********** Error Message Standardization for googltest ********** +//***************************************************************** +/// Error message for size_t. +/// The name of the test. +/// The reference value. +/// The calculate value. +/// Error message. +inline std::string ErrorMsg(const std::string& name, const size_t ref, const size_t calc) +{ + std::stringstream ss; + ss << SEP << name << " : Reference : " << ref << ", \tCompute : " << calc << SEP; + return ss.str(); +} + +/// Error message for doubles. +/// \copydetails ErrorMsg(const std::string&, const size_t, const size_t) +inline std::string ErrorMsg(const std::string& name, const double ref, const double calc) +{ + std::stringstream ss; + ss << SEP << name << " : Reference : " << ref << ", \tCompute : " << calc << SEP; + return ss.str(); +} + +/// Error message for numeric vector. +/// Generic numeric type parameter. +/// \copydetails ErrorMsg(const std::string&, const size_t, const size_t) +template ::value, T>::type> +std::string ErrorMsg(const std::string& name, const std::vector& ref, const std::vector& calc) +{ + std::stringstream ss; + ss << SEP << name << " : " << std::endl << " Reference : \t["; + for (const T& t : ref) { ss << t << ", "; } + if (!ref.empty()) { ss.seekp(ss.str().length() - 2); } + ss << "] " << std::endl << " Compute : \t["; + for (const T& t : calc) { ss << t << ", "; } + if (!ref.empty()) { ss.seekp(ss.str().length() - 2); } + ss << "] " << SEP; + return ss.str(); +} + +/// Error message for matrix. +/// \copydetails ErrorMsg(const std::string&, const size_t, const size_t) +inline std::string ErrorMsg(const std::string& name, const Eigen::MatrixXd& ref, const Eigen::MatrixXd& calc) +{ + std::stringstream ss; + ss << SEP << name << " : " << std::endl << "********** Reference **********\n" << ref << std::endl << "********** Compute **********\n" << calc << SEP; + return ss.str(); +} + +/// Error message for matrix Classifier. +/// \copydetails ErrorMsg(const std::string&, const size_t, const size_t) +inline std::string ErrorMsg(const std::string& name, const Geometry::IMatrixClassifier& ref, const Geometry::IMatrixClassifier& calc) +{ + std::stringstream ss; + ss << SEP << name << " : " << std::endl << "********** Reference **********\n" << ref << std::endl << "********** Compute **********\n" << calc << SEP; + return ss.str(); +} + +/// Error message for ASR. +/// \copydetails ErrorMsg(const std::string&, const size_t, const size_t) +inline std::string ErrorMsg(const std::string& name, const Geometry::CASR& ref, const Geometry::CASR& calc) +{ + std::stringstream ss; + ss << SEP << name << " : " << std::endl << "********** Reference **********\n" << ref << std::endl << "********** Compute **********\n" << calc << SEP; + return ss.str(); +} diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_ASR.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_ASR.hpp new file mode 100644 index 0000000..9dd5d40 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_ASR.hpp @@ -0,0 +1,81 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file test_ASR.hpp +/// \brief Tests for Artifact Subspace Reconstruction. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 29/07/2020. +/// \copyright GNU Affero General Public License v3.0. +/// \remarks We use the EEglab Matlab plugin to compare result for validation +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "gtest/gtest.h" +#include "init.hpp" +#include "misc.hpp" + +#include +#include + +//--------------------------------------------------------------------------------------------------- +class Tests_ASR : public testing::Test +{ +protected: + std::vector m_dataset; + + void SetUp() override { m_dataset = Geometry::Vector2DTo1D(InitDataset::Dataset()); } +}; + +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_ASR, Train_Euclidian) +{ + const Geometry::CASR ref = InitASR::Euclidian::Reference(); + const Geometry::CASR calc(Geometry::EMetric::Euclidian, m_dataset); + EXPECT_TRUE(calc == ref) << ErrorMsg("Train ASR in Euclidian metric", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_ASR, Train_Riemann) +{ + std::cout << "Riemannian Eigen Value isn't implemented, so result is same as Euclidian metric." << std::endl; + const Geometry::CASR ref = InitASR::Riemann::Reference(); + const Geometry::CASR calc(Geometry::EMetric::Riemann, m_dataset); + EXPECT_TRUE(calc == ref) << ErrorMsg("Train ASR in Riemann metric", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_ASR, Process) +{ + m_dataset = InitDataset::FirstClassDataset(); + Geometry::CASR calc(Geometry::EMetric::Euclidian, m_dataset); + + std::vector testset = InitDataset::SecondClassDataset(); + std::vector result(testset.size()); + for (size_t i = 0; i < testset.size(); ++i) + { + testset[i] *= 2; + EXPECT_TRUE(calc.process(testset[i], result[i])) << "ASR Process fail for sample " + std::to_string(i) + ".\n"; + } + for (size_t i = 1; i < testset.size(); ++i) + { + EXPECT_FALSE(isAlmostEqual(result[i], testset[i])) << "the sample " + std::to_string(i) + " wasn't reconstructed.\n"; + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_ASR, Save) +{ + Geometry::CASR calc; + const Geometry::CASR ref = InitASR::Euclidian::Reference(); + EXPECT_TRUE(ref.saveXML("test_ASR_Save.xml")) << "Error during Saving : " << std::endl << ref << std::endl; + EXPECT_TRUE(calc.loadXML("test_ASR_Save.xml")) << "Error during Loading : " << std::endl << calc << std::endl; + EXPECT_TRUE(ref == calc) << ErrorMsg("ASR Save", ref, calc); +} +//--------------------------------------------------------------------------------------------------- diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Basics.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Basics.hpp new file mode 100644 index 0000000..26597c3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Basics.hpp @@ -0,0 +1,150 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file test_Basics.hpp +/// \brief Tests for Basic functions of Module. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 09/01/2019. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "gtest/gtest.h" +#include "init.hpp" +#include "misc.hpp" + +#include +#include + +//--------------------------------------------------------------------------------------------------- +class Tests_Basics : public testing::Test +{ +protected: + std::vector> m_dataSet; + + void SetUp() override { m_dataSet = InitDataset::Dataset(); } +}; + +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Basics, MatrixStandardization) +{ + std::vector> calcC, refC = InitBasics::Center::Reference(); + std::vector> calcS, refS = InitBasics::StandardScaler::Reference(); + calcC.resize(m_dataSet.size()); + calcS.resize(m_dataSet.size()); + for (size_t k = 0; k < m_dataSet.size(); ++k) + { + calcC[k].resize(m_dataSet[k].size()); + calcS[k].resize(m_dataSet[k].size()); + for (size_t i = 0; i < m_dataSet[k].size(); ++i) + { + EXPECT_TRUE(MatrixStandardization(m_dataSet[k][i], calcC[k][i], Geometry::EStandardization::Center)) << "Error During Centerization" << std::endl; + EXPECT_TRUE(MatrixStandardization(m_dataSet[k][i], calcS[k][i], Geometry::EStandardization::StandardScale)) << "Error During Standard Scaler" << std::endl; + const std::string title = "Matrix Center Sample [" + std::to_string(k) + "][" + std::to_string(i) + "]"; + EXPECT_TRUE(isAlmostEqual(refC[k][i], calcC[k][i])) << ErrorMsg(title, refC[k][i], calcC[k][i]); + EXPECT_TRUE(isAlmostEqual(refS[k][i], calcS[k][i])) << ErrorMsg(title, refS[k][i], calcS[k][i]); + } + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Basics, GetElements) +{ + Eigen::RowVectorXd ref(3); + const std::vector idx{ 0, 4, 7 }; + ref << -3, -6, -1; + const Eigen::RowVectorXd calc = Geometry::GetElements(m_dataSet[0][0].row(0), idx); // row = -3, -4, -5, -4, -6, -1, -4, -1, -3, -1 + EXPECT_TRUE(isAlmostEqual(ref, calc)) << ErrorMsg("GetElements", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Basics, ARange) +{ + const std::vector ref{ 1, 3, 5, 7, 9 }, + calc = Geometry::ARange(size_t(1), size_t(10), size_t(2)); + EXPECT_TRUE(isAlmostEqual(ref, calc)) << ErrorMsg("ARange", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Basics, Vector2DTo1D) +{ + std::vector calc = Geometry::Vector2DTo1D(m_dataSet); + bool equal = true; + size_t idx = 0; + for (auto& set : m_dataSet) { for (const auto& data : set) { if (!isAlmostEqual(data, calc[idx++])) { equal = false; } } } + EXPECT_TRUE(equal) << "Vector2DTo1D fail"; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Basics, Metrics) +{ + EXPECT_TRUE(toString(Geometry::EMetric::Riemann) == "Riemann"); + EXPECT_TRUE(toString(Geometry::EMetric::Euclidian) == "Euclidian"); + EXPECT_TRUE(toString(Geometry::EMetric::LogEuclidian) == "Log Euclidian"); + EXPECT_TRUE(toString(Geometry::EMetric::LogDet) == "Log Determinant"); + EXPECT_TRUE(toString(Geometry::EMetric::Kullback) == "Kullback"); + EXPECT_TRUE(toString(Geometry::EMetric::ALE) == "AJD-based log-Euclidean"); + EXPECT_TRUE(toString(Geometry::EMetric::Harmonic) == "Harmonic"); + EXPECT_TRUE(toString(Geometry::EMetric::Wasserstein) == "Wasserstein"); + EXPECT_TRUE(toString(Geometry::EMetric::Identity) == "Identity"); + EXPECT_TRUE(Geometry::StringToMetric("Riemann") == Geometry::EMetric::Riemann); + EXPECT_TRUE(Geometry::StringToMetric("Euclidian") == Geometry::EMetric::Euclidian); + EXPECT_TRUE(Geometry::StringToMetric("Log Euclidian") == Geometry::EMetric::LogEuclidian); + EXPECT_TRUE(Geometry::StringToMetric("Log Determinant") == Geometry::EMetric::LogDet); + EXPECT_TRUE(Geometry::StringToMetric("Kullback") == Geometry::EMetric::Kullback); + EXPECT_TRUE(Geometry::StringToMetric("AJD-based log-Euclidean") == Geometry::EMetric::ALE); + EXPECT_TRUE(Geometry::StringToMetric("Harmonic") == Geometry::EMetric::Harmonic); + EXPECT_TRUE(Geometry::StringToMetric("Wasserstein") == Geometry::EMetric::Wasserstein); + EXPECT_TRUE(Geometry::StringToMetric("Identity") == Geometry::EMetric::Identity); + EXPECT_TRUE(Geometry::StringToMetric("") == Geometry::EMetric::Identity); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Basics, Validation) +{ + const Eigen::MatrixXd m1 = Eigen::MatrixXd::Zero(2, 2), + m2 = Eigen::MatrixXd::Zero(1, 2), + m3; + std::vector v; + + EXPECT_TRUE(Geometry::InRange(1, 0, 2)); // 0 <= 1 <= 2 ? + EXPECT_FALSE(Geometry::InRange(2, 0, 1)); // 0 <= 2 <= 1 ? + + EXPECT_FALSE(Geometry::AreNotEmpty(v)); // Empty Vector + v.push_back(m3); + EXPECT_FALSE(Geometry::AreNotEmpty(v)); // Vector with one empty matix + v.push_back(m1); + EXPECT_FALSE(Geometry::AreNotEmpty(v)); // Vector With one empty matrix and one non empty matrix + v.clear(); + v.push_back(m1); + v.push_back(m2); + EXPECT_TRUE(Geometry::AreNotEmpty(v)); // Vector With two non empty matrix + + EXPECT_TRUE(Geometry::HaveSameSize(m1, m1)); // Same matrix + EXPECT_FALSE(Geometry::HaveSameSize(m3, m3)); // Same but empty + EXPECT_FALSE(Geometry::HaveSameSize(m1, m2)); // DIfferents + EXPECT_FALSE(Geometry::HaveSameSize(m1, m3)); // One empty + + EXPECT_FALSE(Geometry::HaveSameSize(v)); // Two different + EXPECT_FALSE(Geometry::AreSquare(v)); // One square + v.clear(); + v.push_back(m1); + v.push_back(m1); + EXPECT_TRUE(Geometry::HaveSameSize(v) && Geometry::AreSquare(v)); // Same matrix + + Geometry::MatrixPrint(m1); // Only to check + Geometry::MatrixPrint(m3); // Only to check + + std::vector vs = Geometry::Split("0,1,2,3.a\n", ","); + EXPECT_TRUE(vs.size() == 4 && vs[0] == "0" && vs[1] == "1" && vs[2] == "2" && vs[3] == "3.a") << vs.size() << " " << vs[0] << " " << vs[1] << " " << vs[2] << " " << vs[3] << std::endl; +} +//--------------------------------------------------------------------------------------------------- diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Classifier.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Classifier.hpp new file mode 100644 index 0000000..9384786 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Classifier.hpp @@ -0,0 +1,53 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file test_Classifier.hpp +/// \brief Tests for Classifier Functions. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 09/01/2019. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "gtest/gtest.h" +#include "misc.hpp" +#include "init.hpp" + +#include + +//--------------------------------------------------------------------------------------------------- +class Tests_Classifier : public testing::Test +{ +protected: + std::vector> m_dataSet; + + void SetUp() override + { + const std::vector tmp = InitFeaturization::TangentSpace::Reference(); + m_dataSet = Geometry::Vector1DTo2D(tmp, { NB_TRIALS1, NB_TRIALS2 }); + } +}; + +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Classifier, LSQR) +{ + const Eigen::MatrixXd ref = InitClassif::LSQR::Reference(); + Eigen::MatrixXd calc; + Geometry::LSQR(m_dataSet, calc); + EXPECT_TRUE(isAlmostEqual(ref, calc)) << ErrorMsg("LSQR", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Classifier, FgDACompute) +{ + const Eigen::MatrixXd ref = InitClassif::FgDACompute::Reference(); + Eigen::MatrixXd calc; + Geometry::FgDACompute(m_dataSet, calc); + EXPECT_TRUE(isAlmostEqual(ref, calc)) << ErrorMsg("FgDA", ref, calc); +} +//--------------------------------------------------------------------------------------------------- diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Covariance.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Covariance.hpp new file mode 100644 index 0000000..0b3f27c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Covariance.hpp @@ -0,0 +1,158 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file test_Covariance.hpp +/// \brief Tests for Covariance Matrix Functions. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 09/01/2019. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "gtest/gtest.h" +#include "misc.hpp" +#include "init.hpp" + +#include + +//--------------------------------------------------------------------------------------------------- +class Tests_Covariances : public testing::Test +{ +protected: + std::vector> m_dataSet; + + void SetUp() override { m_dataSet = InitDataset::Dataset(); } +}; + +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Covariances, Covariance_Matrix_COR) +{ + std::vector> calc, ref = InitCovariance::COR::Dataset(); + calc.resize(m_dataSet.size()); + for (size_t k = 0; k < m_dataSet.size(); ++k) + { + calc[k].resize(m_dataSet[k].size()); + for (size_t i = 0; i < m_dataSet[k].size(); ++i) + { + CovarianceMatrix(m_dataSet[k][i], calc[k][i], Geometry::EEstimator::COR, Geometry::EStandardization::None); + const std::string title = "Covariance Matrix COR Sample [" + std::to_string(k) + "][" + std::to_string(i) + "]"; + EXPECT_TRUE(isAlmostEqual(ref[k][i], calc[k][i])) << ErrorMsg(title, ref[k][i], calc[k][i]); + } + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Covariances, Covariance_Matrix_COV) +{ + std::vector> calc, ref = InitCovariance::COV::Dataset(); + calc.resize(m_dataSet.size()); + for (size_t k = 0; k < m_dataSet.size(); ++k) + { + calc[k].resize(m_dataSet[k].size()); + for (size_t i = 0; i < m_dataSet[k].size(); ++i) + { + CovarianceMatrix(m_dataSet[k][i], calc[k][i], Geometry::EEstimator::COV, Geometry::EStandardization::None); + const std::string title = "Covariance Matrix COV Sample [" + std::to_string(k) + "][" + std::to_string(i) + "]"; + EXPECT_TRUE(isAlmostEqual(ref[k][i], calc[k][i])) << ErrorMsg(title, ref[k][i], calc[k][i]); + } + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Covariances, Covariance_Matrix_LWF) +{ + std::vector> calc, ref = InitCovariance::LWF::Reference(); + calc.resize(m_dataSet.size()); + for (size_t k = 0; k < m_dataSet.size(); ++k) + { + calc[k].resize(m_dataSet[k].size()); + for (size_t i = 0; i < m_dataSet[k].size(); ++i) + { + CovarianceMatrix(m_dataSet[k][i], calc[k][i], Geometry::EEstimator::LWF, Geometry::EStandardization::Center); + const std::string title = "Covariance Matrix LWF Sample [" + std::to_string(k) + "][" + std::to_string(i) + "]"; + EXPECT_TRUE(isAlmostEqual(ref[k][i], calc[k][i])) << ErrorMsg(title, ref[k][i], calc[k][i]); + } + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Covariances, Covariance_Matrix_MCD) +{ + std::cout << "Not implemented" << std::endl; + std::vector> calc; + //std::vector> ref = InitCovariance::MCD::Reference(); + calc.resize(m_dataSet.size()); + for (size_t k = 0; k < m_dataSet.size(); ++k) + { + calc[k].resize(m_dataSet[k].size()); + for (size_t i = 0; i < m_dataSet[k].size(); ++i) + { + CovarianceMatrix(m_dataSet[k][i], calc[k][i], Geometry::EEstimator::MCD, Geometry::EStandardization::Center); + //const std::string title = "Covariance Matrix MCD Sample [" + std::to_string(k) + "][" + std::to_string(i) + "]"; + //EXPECT_TRUE(isAlmostEqual(ref[k][i], calc[k][i])) << ErrorMsg(title, ref[k][i], calc[k][i]); + } + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Covariances, Covariance_Matrix_OAS) +{ + std::vector> calc, ref = InitCovariance::OAS::Reference(); + calc.resize(m_dataSet.size()); + for (size_t k = 0; k < m_dataSet.size(); ++k) + { + calc[k].resize(m_dataSet[k].size()); + for (size_t i = 0; i < m_dataSet[k].size(); ++i) + { + CovarianceMatrix(m_dataSet[k][i], calc[k][i], Geometry::EEstimator::OAS, Geometry::EStandardization::Center); + const std::string title = "Covariance Matrix OAS Sample [" + std::to_string(k) + "][" + std::to_string(i) + "]"; + EXPECT_TRUE(isAlmostEqual(ref[k][i], calc[k][i])) << ErrorMsg(title, ref[k][i], calc[k][i]); + } + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Covariances, Covariance_Matrix_SCM) +{ + std::vector> calc, ref = InitCovariance::SCM::Reference(); + calc.resize(m_dataSet.size()); + for (size_t k = 0; k < m_dataSet.size(); ++k) + { + calc[k].resize(m_dataSet[k].size()); + for (size_t i = 0; i < m_dataSet[k].size(); ++i) + { + CovarianceMatrix(m_dataSet[k][i], calc[k][i], Geometry::EEstimator::SCM, Geometry::EStandardization::None); + const std::string title = "Covariance Matrix SCM Sample [" + std::to_string(k) + "][" + std::to_string(i) + "]"; + EXPECT_TRUE(isAlmostEqual(ref[k][i], calc[k][i])) << ErrorMsg(title, ref[k][i], calc[k][i]); + } + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Covariances, Covariance_Matrix_IDE) +{ + std::vector> calc; + const Eigen::MatrixXd ref = Eigen::MatrixXd::Identity(NB_CHAN, NB_CHAN); + calc.resize(m_dataSet.size()); + for (size_t k = 0; k < m_dataSet.size(); ++k) + { + calc[k].resize(m_dataSet[k].size()); + for (size_t i = 0; i < m_dataSet[k].size(); ++i) + { + CovarianceMatrix(m_dataSet[k][i], calc[k][i], Geometry::EEstimator::IDE, Geometry::EStandardization::None); + const std::string title = "Covariance Matrix IDE Sample [" + std::to_string(k) + "][" + std::to_string(i) + "]"; + EXPECT_TRUE(isAlmostEqual(ref, calc[k][i])) << ErrorMsg(title, ref, calc[k][i]); + } + } +} +//--------------------------------------------------------------------------------------------------- diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Distance.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Distance.hpp new file mode 100644 index 0000000..9a543a3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Distance.hpp @@ -0,0 +1,119 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file test_Distance.hpp +/// \brief Tests for Distance Functions. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 09/01/2019. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "gtest/gtest.h" +#include "misc.hpp" +#include "init.hpp" + +#include + +//--------------------------------------------------------------------------------------------------- +class Tests_Distances : public testing::Test +{ +protected: + std::vector m_dataSet; + + void SetUp() override { m_dataSet = Geometry::Vector2DTo1D(InitCovariance::LWF::Reference()); } +}; + +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Distances, Euclidian) +{ + const std::vector ref = InitDistance::Euclidian::Reference(); + const Eigen::MatrixXd mean = InitMeans::Euclidian::Reference(); + for (size_t i = 0; i < m_dataSet.size(); ++i) + { + const double calc = Distance(mean, m_dataSet[i], Geometry::EMetric::Euclidian); + EXPECT_TRUE(isAlmostEqual(ref[i], calc)) << ErrorMsg("Distance Euclidian Sample [" + std::to_string(i) + "]", ref[i], calc); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Distances, LogEuclidian) +{ + const std::vector ref = InitDistance::LogEuclidian::Reference(); + const Eigen::MatrixXd mean = InitMeans::LogEuclidian::Reference(); + for (size_t i = 0; i < m_dataSet.size(); ++i) + { + const double calc = Distance(mean, m_dataSet[i], Geometry::EMetric::LogEuclidian); + EXPECT_TRUE(isAlmostEqual(ref[i], calc)) << ErrorMsg("Distance LogEuclidian Sample [" + std::to_string(i) + "]", ref[i], calc); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Distances, Riemann) +{ + const std::vector ref = InitDistance::Riemann::Reference(); + const Eigen::MatrixXd mean = InitMeans::Riemann::Reference(); + for (size_t i = 0; i < m_dataSet.size(); ++i) + { + const double calc = Distance(mean, m_dataSet[i], Geometry::EMetric::Riemann); + EXPECT_TRUE(isAlmostEqual(ref[i], calc)) << ErrorMsg("Distance Riemann Sample [" + std::to_string(i) + "]", ref[i], calc); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Distances, LogDet) +{ + const std::vector ref = InitDistance::LogDeterminant::Reference(); + const Eigen::MatrixXd mean = InitMeans::LogDeterminant::Reference(); + for (size_t i = 0; i < m_dataSet.size(); ++i) + { + const double calc = Distance(mean, m_dataSet[i], Geometry::EMetric::LogDet); + EXPECT_TRUE(isAlmostEqual(ref[i], calc)) << ErrorMsg("Distance LogDet Sample [" + std::to_string(i) + "]", ref[i], calc); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Distances, Kullback) +{ + const std::vector ref = InitDistance::Kullback::Reference(); + const Eigen::MatrixXd mean = InitMeans::Kullback::Reference(); + for (size_t i = 0; i < m_dataSet.size(); ++i) + { + const double calc = Distance(mean, m_dataSet[i], Geometry::EMetric::Kullback); + EXPECT_TRUE(isAlmostEqual(ref[i], calc)) << ErrorMsg("Distance Kullback Sample [" + std::to_string(i) + "]", ref[i], calc); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Distances, Wasserstein) +{ + const std::vector ref = InitDistance::Wasserstein::Reference(); + const Eigen::MatrixXd mean = InitMeans::Wasserstein::Reference(); + for (size_t i = 0; i < m_dataSet.size(); ++i) + { + const double calc = Distance(mean, m_dataSet[i], Geometry::EMetric::Wasserstein); + EXPECT_TRUE(isAlmostEqual(ref[i], calc)) << ErrorMsg("Distance Wasserstein Sample [" + std::to_string(i) + "]", ref[i], calc); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Distances, Identity) +{ + const Eigen::MatrixXd mean = InitMeans::Wasserstein::Reference(); + for (size_t i = 0; i < m_dataSet.size(); ++i) + { + const double calc = Distance(mean, m_dataSet[i], Geometry::EMetric::Identity); + EXPECT_TRUE(isAlmostEqual(1, calc)) << ErrorMsg("Distance Wasserstein Sample [" + std::to_string(i) + "]", 1, calc); + } +} +//--------------------------------------------------------------------------------------------------- diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Featurization.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Featurization.hpp new file mode 100644 index 0000000..b132d2b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Featurization.hpp @@ -0,0 +1,91 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file test_Featurization.hpp +/// \brief Tests for Matrix Featurization Functions. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 09/01/2019. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "gtest/gtest.h" +#include "misc.hpp" +#include "init.hpp" + +#include + +//--------------------------------------------------------------------------------------------------- +class Tests_Featurization : public testing::Test +{ +protected: + std::vector m_dataSet; + + void SetUp() override { m_dataSet = Geometry::Vector2DTo1D(InitCovariance::LWF::Reference()); } +}; + +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Featurization, TangentSpace) +{ + const std::vector ref = InitFeaturization::TangentSpace::Reference(); + const Eigen::MatrixXd mean = InitMeans::Riemann::Reference(); + for (size_t i = 0; i < m_dataSet.size(); ++i) + { + Eigen::RowVectorXd calc; + EXPECT_TRUE(Geometry::Featurization(m_dataSet[i], calc, true, mean)) << "Error During Processing"; + EXPECT_TRUE(isAlmostEqual(ref[i], calc)) << ErrorMsg("TangentSpace Sample [" + std::to_string(i) + "]", ref[i], calc); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Featurization, UnTangentSpace) +{ + const std::vector ref = InitFeaturization::TangentSpace::Reference(); + const Eigen::MatrixXd mean = InitMeans::Riemann::Reference(); + for (size_t i = 0; i < m_dataSet.size(); ++i) + { + Eigen::MatrixXd calc; + EXPECT_TRUE(Geometry::UnFeaturization(ref[i], calc, true, mean)) << "Error During Processing"; + EXPECT_TRUE(isAlmostEqual(m_dataSet[i], calc)) << ErrorMsg("UnTangentSpace Sample [" + std::to_string(i) + "]", m_dataSet[i], calc); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Featurization, Squeeze) +{ + const std::vector ref = InitFeaturization::Squeeze::Reference(); + const std::vector refDiag = InitFeaturization::SqueezeDiag::Reference(); + const Eigen::MatrixXd mean = InitMeans::Riemann::Reference(); + for (size_t i = 0; i < m_dataSet.size(); ++i) + { + Eigen::RowVectorXd calc; + EXPECT_TRUE(Geometry::Featurization(m_dataSet[i], calc, false, mean)) << "Error During Processing"; + EXPECT_TRUE(isAlmostEqual(ref[i], calc)) << ErrorMsg("Squeeze Sample [" + std::to_string(i) + "]", ref[i], calc); + EXPECT_TRUE(Geometry::SqueezeUpperTriangle(m_dataSet[i], calc, false)) << "Error During Processing"; + EXPECT_TRUE(isAlmostEqual(refDiag[i], calc)) << ErrorMsg("Squeeze Sample [" + std::to_string(i) + "]", refDiag[i], calc); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Featurization, UnSqueeze) +{ + const std::vector ref = InitFeaturization::Squeeze::Reference(); + const std::vector refDiag = InitFeaturization::SqueezeDiag::Reference(); + const Eigen::MatrixXd mean = InitMeans::Riemann::Reference(); + for (size_t i = 0; i < m_dataSet.size(); ++i) + { + Eigen::MatrixXd calc; + EXPECT_TRUE(Geometry::UnFeaturization(ref[i], calc, false, mean)) << "Error During Processing"; + EXPECT_TRUE(isAlmostEqual(m_dataSet[i], calc)) << ErrorMsg("UnSqueeze Sample [" + std::to_string(i) + "]", m_dataSet[i], calc); + EXPECT_TRUE(Geometry::UnSqueezeUpperTriangle(refDiag[i], calc, false)) << "Error During Processing"; + EXPECT_TRUE(isAlmostEqual(m_dataSet[i], calc)) << ErrorMsg("UnSqueeze Sample [" + std::to_string(i) + "]", m_dataSet[i], calc); + } +} +//--------------------------------------------------------------------------------------------------- diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Geodesics.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Geodesics.hpp new file mode 100644 index 0000000..c2bbddd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Geodesics.hpp @@ -0,0 +1,84 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file test_Geodesics.hpp +/// \brief Tests for Geodesic Functions. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 09/01/2019. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "gtest/gtest.h" +#include "misc.hpp" +#include "init.hpp" + +#include + +//--------------------------------------------------------------------------------------------------- +class Tests_Geodesic : public testing::Test +{ +protected: + std::vector m_dataSet; + + void SetUp() override { m_dataSet = Geometry::Vector2DTo1D(InitCovariance::LWF::Reference()); } +}; + +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Geodesic, Euclidian) +{ + const std::vector ref = InitGeodesics::Euclidian::Reference(); + const Eigen::MatrixXd mean = InitMeans::Euclidian::Reference(); + for (size_t i = 0; i < m_dataSet.size(); ++i) + { + Eigen::MatrixXd calc; + Geodesic(mean, m_dataSet[i], calc, Geometry::EMetric::Euclidian, 0.5); + EXPECT_TRUE(isAlmostEqual(ref[i], calc)) << ErrorMsg("Geodesic Euclidian Sample [" + std::to_string(i) + "]", ref[i], calc); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Geodesic, LogEuclidian) +{ + const std::vector ref = InitGeodesics::LogEuclidian::Reference(); + const Eigen::MatrixXd mean = InitMeans::LogEuclidian::Reference(); + for (size_t i = 0; i < m_dataSet.size(); ++i) + { + Eigen::MatrixXd calc; + Geodesic(mean, m_dataSet[i], calc, Geometry::EMetric::LogEuclidian, 0.5); + EXPECT_TRUE(isAlmostEqual(ref[i], calc)) << ErrorMsg("Geodesic LogEuclidian Sample [" + std::to_string(i) + "]", ref[i], calc); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Geodesic, Riemann) +{ + const std::vector ref = InitGeodesics::Riemann::Reference(); + const Eigen::MatrixXd mean = InitMeans::Riemann::Reference(); + for (size_t i = 0; i < m_dataSet.size(); ++i) + { + Eigen::MatrixXd calc; + Geodesic(mean, m_dataSet[i], calc, Geometry::EMetric::Riemann, 0.5); + EXPECT_TRUE(isAlmostEqual(ref[i], calc)) << ErrorMsg("Geodesic Riemann Sample [" + std::to_string(i) + "]", ref[i], calc); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Geodesic, Identity) +{ + const Eigen::MatrixXd mean = InitMeans::Riemann::Reference(), ref = Eigen::MatrixXd::Identity(NB_CHAN, NB_CHAN); + for (size_t i = 0; i < m_dataSet.size(); ++i) + { + Eigen::MatrixXd calc; + Geodesic(mean, m_dataSet[i], calc, Geometry::EMetric::Identity, 0.5); + EXPECT_TRUE(isAlmostEqual(ref, calc)) << ErrorMsg("Geodesic Identity Sample [" + std::to_string(i) + "]", ref, calc); + } +} +//--------------------------------------------------------------------------------------------------- diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_MatrixClassifier.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_MatrixClassifier.hpp new file mode 100644 index 0000000..43566a2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_MatrixClassifier.hpp @@ -0,0 +1,296 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file test_MatrixClassifier.hpp +/// \brief Tests for Matrix Classifiers. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 09/01/2019. +/// \copyright GNU Affero General Public License v3.0. +/// \remarks +/// - For this tests I compare the results with the pyRiemann library (License) or sklearn if pyRiemman just redirect the function. +/// - For the adaptation Classification tests I compare the results with the covariancetoolbox Matlab library (License). +/// - The Matlab toolbox is older and Riemannian mean estimation is diff�rent the test are adapted to switch between the two library +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "gtest/gtest.h" +#include "misc.hpp" +#include "init.hpp" + +#include +#include +#include +#include +#include + +static const std::vector> EMPTY_DIST; + +//--------------------------------------------------------------------------------------------------- +static void TestClassify(Geometry::IMatrixClassifier& calc, const std::vector>& dataset, const std::vector& prediction, + const std::vector>& predictionDistance, const Geometry::EAdaptations& adapt) +{ + Eigen::MatrixXd result = Eigen::MatrixXd::Zero(NB_CLASS, NB_CLASS); + size_t idx = 0; + for (size_t k = 0; k < dataset.size(); ++k) + { + for (size_t i = 0; i < dataset[k].size(); ++i) + { + const std::string text = "sample [" + std::to_string(k) + "][" + std::to_string(i) + "]"; + size_t classid = 0; + std::vector distance, probability; + EXPECT_TRUE(calc.classify(dataset[k][i], classid, distance, probability, adapt, k)) << "Error during Classify " << text; + if (idx < prediction.size()) { EXPECT_TRUE(prediction[idx] == classid) << ErrorMsg("Prediction " + text, prediction[idx], classid); } + if (idx < predictionDistance.size()) + { + EXPECT_TRUE(isAlmostEqual(predictionDistance[idx], distance)) << ErrorMsg("Prediction Distance " + text, predictionDistance[idx], distance); + } + idx++; + result(k, classid)++; + } + } + std::cout << "***** Classifier : *****" << std::endl << calc << std::endl << "***** Result : *****" << std::endl << result << std::endl; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +class Tests_MatrixClassifier : public testing::Test +{ +protected: + std::vector> m_dataSet; + + void SetUp() override { m_dataSet = InitCovariance::LWF::Reference(); } +}; + +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, MDM_Train) +{ + const Geometry::CMatrixClassifierMDM ref = InitMatrixClassif::MDM::Reference(); + Geometry::CMatrixClassifierMDM calc; + EXPECT_TRUE(calc.train(m_dataSet)) << "Error during Training : " << std::endl << calc << std::endl; + EXPECT_TRUE(ref == calc) << ErrorMsg("MDM Train", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, MDM_Classifify) +{ + Geometry::CMatrixClassifierMDM calc = InitMatrixClassif::MDM::ReferenceMatlab(); + TestClassify(calc, m_dataSet, InitMatrixClassif::MDM::Prediction(), InitMatrixClassif::MDM::PredictionDistance(), Geometry::EAdaptations::None); + const Geometry::CMatrixClassifierMDM ref = InitMatrixClassif::MDM::ReferenceMatlab(); // No Change + EXPECT_TRUE(ref == calc) << ErrorMsg("MDM Classify Change without adaptation mode", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, MDM_Classifify_Adapt_Supervised) +{ + Geometry::CMatrixClassifierMDM calc = InitMatrixClassif::MDM::ReferenceMatlab(); + TestClassify(calc, m_dataSet, InitMatrixClassif::MDM::PredictionSupervised(), InitMatrixClassif::MDM::PredictionDistanceSupervised(), + Geometry::EAdaptations::Supervised); + const Geometry::CMatrixClassifierMDM ref = InitMatrixClassif::MDM::AfterSupervised(); + EXPECT_TRUE(ref == calc) << ErrorMsg("MDM Adapt Classify after Supervised adaptation", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, MDM_Classifify_Adapt_Unsupervised) +{ + Geometry::CMatrixClassifierMDM calc = InitMatrixClassif::MDM::ReferenceMatlab(); + TestClassify(calc, m_dataSet, InitMatrixClassif::MDM::PredictionUnSupervised(), InitMatrixClassif::MDM::PredictionDistanceUnSupervised(), + Geometry::EAdaptations::Unsupervised); + const Geometry::CMatrixClassifierMDM ref = InitMatrixClassif::MDM::AfterUnSupervised(); + EXPECT_TRUE(ref == calc) << ErrorMsg("MDM Adapt Classify after Unsupervised adaptation", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, MDM_Save) +{ + Geometry::CMatrixClassifierMDM calc; + const Geometry::CMatrixClassifierMDM ref = InitMatrixClassif::MDM::Reference(); + EXPECT_TRUE(ref.saveXML("test_MDM_Save.xml")) << "Error during Saving : " << std::endl << ref << std::endl; + EXPECT_TRUE(calc.loadXML("test_MDM_Save.xml")) << "Error during Loading : " << std::endl << calc << std::endl; + EXPECT_TRUE(ref == calc) << ErrorMsg("MDM Save", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, FgMDMRT_Train) +{ + const Geometry::CMatrixClassifierFgMDMRT ref = InitMatrixClassif::FgMDMRT::Reference(); + Geometry::CMatrixClassifierFgMDMRT calc; + EXPECT_TRUE(calc.train(m_dataSet)) << "Error during Training : " << std::endl << calc << std::endl; + EXPECT_TRUE(ref == calc) << ErrorMsg("FgMDM Train", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, FgMDMRT_Classifify) +{ + Geometry::CMatrixClassifierFgMDMRT calc = InitMatrixClassif::FgMDMRT::Reference(); + TestClassify(calc, m_dataSet, InitMatrixClassif::FgMDMRT::Prediction(), InitMatrixClassif::FgMDMRT::PredictionDistance(), Geometry::EAdaptations::None); + const Geometry::CMatrixClassifierFgMDMRT ref = InitMatrixClassif::FgMDMRT::Reference(); + EXPECT_TRUE(ref == calc) << ErrorMsg("FgMDM Classify Change without adaptation mode", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, FgMDMRT_Classifify_Adapt_Supervised) +{ + Geometry::CMatrixClassifierFgMDMRT calc = InitMatrixClassif::FgMDMRT::Reference(); + TestClassify(calc, m_dataSet, InitMatrixClassif::FgMDMRT::PredictionSupervised(), EMPTY_DIST, Geometry::EAdaptations::Supervised); + //const Geometry::CMatrixClassifierFgMDMRT ref = InitMatrixClassif::FgMDMRT::AfterSupervised(); + //EXPECT_TRUE(ref == calc) << ErrorMsg("FgMDM Adapt Classify after Supervised RT adaptation", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, FgMDMRT_Classifify_Adapt_Unsupervised) +{ + Geometry::CMatrixClassifierFgMDMRT calc(InitMatrixClassif::FgMDMRT::Reference()); + TestClassify(calc, m_dataSet, InitMatrixClassif::FgMDMRT::PredictionUnSupervised(), EMPTY_DIST, Geometry::EAdaptations::Unsupervised); + //const Geometry::CMatrixClassifierFgMDMRT ref = InitMatrixClassif::FgMDMRT::AfterUnSupervised(); + //EXPECT_TRUE(ref == calc) << ErrorMsg("FgMDM Adapt Classify after Unsupervised RT adaptation", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, FgMDMRT_Save) +{ + Geometry::CMatrixClassifierFgMDMRT calc; + const Geometry::CMatrixClassifierFgMDMRT ref = InitMatrixClassif::FgMDMRT::Reference(); + EXPECT_TRUE(ref.saveXML("test_FgMDM_Save.xml")) << "Error during Saving : " << std::endl << ref << std::endl; + EXPECT_TRUE(calc.loadXML("test_FgMDM_Save.xml")) << "Error during Loading : " << std::endl << calc << std::endl; + EXPECT_TRUE(ref == calc) << ErrorMsg("FgMDM Save", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, FgMDM_Classifify_Adapt_Supervised) +{ + Geometry::CMatrixClassifierFgMDM calc = InitMatrixClassif::FgMDM::Reference(); + TestClassify(calc, m_dataSet, InitMatrixClassif::FgMDM::PredictionSupervised(), EMPTY_DIST, Geometry::EAdaptations::Supervised); + //const Geometry::CMatrixClassifierFgMDM ref = InitMatrixClassif::FgMDM::AfterSupervised(); + //EXPECT_TRUE(ref == calc) << ErrorMsg("FgMDM Adapt Classify after Supervised adaptation", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, FgMDM_Classifify_Adapt_Unsupervised) +{ + Geometry::CMatrixClassifierFgMDM calc = InitMatrixClassif::FgMDM::Reference(); + TestClassify(calc, m_dataSet, InitMatrixClassif::FgMDM::PredictionUnSupervised(), EMPTY_DIST, Geometry::EAdaptations::Unsupervised); + //const Geometry::CMatrixClassifierFgMDM ref = InitMatrixClassif::FgMDM::AfterUnSupervised(); + //EXPECT_TRUE(ref == calc) << ErrorMsg("FgMDM Adapt Classify after Unsupervised adaptation", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, MDM_Rebias_Train) +{ + Geometry::CMatrixClassifierMDMRebias calc; + EXPECT_TRUE(calc.train(m_dataSet)) << "Error during Training : " << std::endl << calc << std::endl; + //const Geometry::CMatrixClassifierMDMRebias ref = InitMatrixClassif::MDMRebias::Reference(); + //EXPECT_TRUE(ref == calc) << ErrorMsg("MDM Rebias Train", ref, calc); // The mean method is different in matlab toolbox and python toolbox +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, MDM_Rebias_Classifify) +{ + Geometry::CMatrixClassifierMDMRebias calc = InitMatrixClassif::MDMRebias::Reference(); + TestClassify(calc, m_dataSet, InitMatrixClassif::MDMRebias::Prediction(), InitMatrixClassif::MDMRebias::PredictionDistance(), Geometry::EAdaptations::None); + const Geometry::CMatrixClassifierMDMRebias ref = InitMatrixClassif::MDMRebias::After(); // No Class change but Rebias yes + EXPECT_TRUE(ref == calc) << ErrorMsg("MDM Rebias Classify Change without adaptation mode", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, MDM_Rebias_Classifify_Adapt_Supervised) +{ + Geometry::CMatrixClassifierMDMRebias calc = InitMatrixClassif::MDMRebias::Reference(); + TestClassify(calc, m_dataSet, InitMatrixClassif::MDMRebias::PredictionSupervised(), InitMatrixClassif::MDMRebias::PredictionDistanceSupervised(), + Geometry::EAdaptations::Supervised); + const Geometry::CMatrixClassifierMDMRebias ref = InitMatrixClassif::MDMRebias::AfterSupervised(); + EXPECT_TRUE(ref == calc) << ErrorMsg("MDM Rebias Adapt Classify after Supervised adaptation", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, MDM_Rebias_Classifify_Adapt_Unsupervised) +{ + Geometry::CMatrixClassifierMDMRebias calc = InitMatrixClassif::MDMRebias::Reference(); + TestClassify(calc, m_dataSet, InitMatrixClassif::MDMRebias::PredictionUnSupervised(), InitMatrixClassif::MDMRebias::PredictionDistanceUnSupervised(), + Geometry::EAdaptations::Unsupervised); + const Geometry::CMatrixClassifierMDMRebias ref = InitMatrixClassif::MDMRebias::AfterUnSupervised(); + EXPECT_TRUE(ref == calc) << ErrorMsg("MDM Rebias Adapt Classify after Unsupervised adaptation", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, MDM_Rebias_Save) +{ + Geometry::CMatrixClassifierMDMRebias calc; + const Geometry::CMatrixClassifierMDMRebias ref = InitMatrixClassif::MDMRebias::Reference(); + EXPECT_TRUE(ref.saveXML("test_MDM_Rebias_Save.xml")) << "Error during Saving : " << std::endl << ref << std::endl; + EXPECT_TRUE(calc.loadXML("test_MDM_Rebias_Save.xml")) << "Error during Loading : " << std::endl << calc << std::endl; + EXPECT_TRUE(ref == calc) << ErrorMsg("MDM Rebias Save", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, FgMDM_RT_Rebias_Train) +{ + Geometry::CMatrixClassifierFgMDMRTRebias calc; + EXPECT_TRUE(calc.train(m_dataSet)) << "Error during Training : " << std::endl << calc << std::endl; + const Geometry::CMatrixClassifierFgMDMRTRebias ref = InitMatrixClassif::FgMDMRTRebias::Reference(); + EXPECT_TRUE(ref == calc) << ErrorMsg("FgMDM Rebias Train", ref, calc); // The mean method is different in matlab toolbox and python toolbox +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, FgMDM_RT_Rebias_Save) +{ + Geometry::CMatrixClassifierFgMDMRTRebias calc; + const Geometry::CMatrixClassifierFgMDMRTRebias ref = InitMatrixClassif::FgMDMRTRebias::Reference(); + EXPECT_TRUE(ref.saveXML("test_FgMDM_Rebias_Save.xml")) << "Error during Saving : " << std::endl << ref << std::endl; + EXPECT_TRUE(calc.loadXML("test_FgMDM_Rebias_Save.xml")) << "Error during Loading : " << std::endl << calc << std::endl; + EXPECT_TRUE(ref == calc) << ErrorMsg("FgMDM Rebias Save", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, FgMDM_RT_Rebias_Classifify) +{ + Geometry::CMatrixClassifierFgMDMRTRebias calc = InitMatrixClassif::FgMDMRTRebias::Reference(); + TestClassify(calc, m_dataSet, InitMatrixClassif::FgMDMRTRebias::Prediction(), EMPTY_DIST, Geometry::EAdaptations::None); + //const Geometry::CMatrixClassifierFgMDMRTRebias ref = InitMatrixClassif::FgMDMRTRebias::After(); + //EXPECT_TRUE(ref == calc) << ErrorMsg("FgMDM Rebias Classify Change without adaptation mode", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, FgMDM_RT_Rebias_Classifify_Adapt_Supervised) +{ + Geometry::CMatrixClassifierFgMDMRTRebias calc = InitMatrixClassif::FgMDMRTRebias::Reference(); + TestClassify(calc, m_dataSet, InitMatrixClassif::FgMDMRTRebias::PredictionSupervised(), EMPTY_DIST, Geometry::EAdaptations::Supervised); + //const Geometry::CMatrixClassifierFgMDMRTRebias ref = InitMatrixClassif::FgMDMRTRebias::AfterSupervised(); + //EXPECT_TRUE(ref == calc) << ErrorMsg("FgMDM Rebias Adapt Classify after Supervised adaptation", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_MatrixClassifier, FgMDM_RT_Rebias_Classifify_Adapt_Unsupervised) +{ + Geometry::CMatrixClassifierFgMDMRTRebias calc = InitMatrixClassif::FgMDMRTRebias::Reference(); + TestClassify(calc, m_dataSet, InitMatrixClassif::FgMDMRTRebias::PredictionUnSupervised(), EMPTY_DIST, Geometry::EAdaptations::Unsupervised); + //const Geometry::CMatrixClassifierFgMDMRTRebias ref = InitMatrixClassif::FgMDMRTRebias::AfterUnSupervised(); + //EXPECT_TRUE(ref == calc) << ErrorMsg("FgMDM Rebias Adapt Classify after Unsupervised adaptation", ref, calc); +} +//--------------------------------------------------------------------------------------------------- diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Mean.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Mean.hpp new file mode 100644 index 0000000..8ee5398 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Mean.hpp @@ -0,0 +1,135 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file test_Mean.hpp +/// \brief Tests for Mean Functions. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 09/01/2019. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "gtest/gtest.h" +#include "misc.hpp" +#include "init.hpp" + +#include + +//--------------------------------------------------------------------------------------------------- +class Tests_Means : public testing::Test +{ +protected: + std::vector m_dataSet; + + void SetUp() override { m_dataSet = Geometry::Vector2DTo1D(InitCovariance::LWF::Reference()); } +}; + +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Means, BadInput) +{ + std::vector bad; + Eigen::MatrixXd calc; + EXPECT_FALSE(Mean(bad, calc, Geometry::EMetric::Riemann)); + bad.emplace_back(Eigen::MatrixXd::Zero(1, 2)); + bad.emplace_back(Eigen::MatrixXd::Zero(1, 2)); + EXPECT_FALSE(Mean(bad, calc, Geometry::EMetric::Riemann)); + bad.emplace_back(Eigen::MatrixXd::Zero(2, 2)); + EXPECT_FALSE(Mean(bad, calc, Geometry::EMetric::Riemann)); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Means, Euclidian) +{ + const Eigen::MatrixXd ref = InitMeans::Euclidian::Reference(); + Eigen::MatrixXd calc; + Mean(m_dataSet, calc, Geometry::EMetric::Euclidian); + EXPECT_TRUE(isAlmostEqual(ref, calc)) << ErrorMsg("Mean Matrix Euclidian", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Means, LogEuclidian) +{ + const Eigen::MatrixXd ref = InitMeans::LogEuclidian::Reference(); + Eigen::MatrixXd calc; + Mean(m_dataSet, calc, Geometry::EMetric::LogEuclidian); + EXPECT_TRUE(isAlmostEqual(ref, calc)) << ErrorMsg("Mean Matrix LogEuclidian", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Means, Riemann) +{ + const Eigen::MatrixXd ref = InitMeans::Riemann::Reference(); + Eigen::MatrixXd calc; + Mean(m_dataSet, calc, Geometry::EMetric::Riemann); + EXPECT_TRUE(isAlmostEqual(ref, calc)) << ErrorMsg("Mean Matrix Riemann", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Means, LogDet) +{ + const Eigen::MatrixXd ref = InitMeans::LogDeterminant::Reference(); + Eigen::MatrixXd calc; + Mean(m_dataSet, calc, Geometry::EMetric::LogDet); + EXPECT_TRUE(isAlmostEqual(ref, calc)) << ErrorMsg("Mean Matrix LogDet", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Means, Kullback) +{ + const Eigen::MatrixXd ref = InitMeans::Kullback::Reference(); + Eigen::MatrixXd calc; + Mean(m_dataSet, calc, Geometry::EMetric::Kullback); + EXPECT_TRUE(isAlmostEqual(ref, calc)) << ErrorMsg("Mean Matrix Kullback", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Means, Wasserstein) +{ + std::cout << "Precision Error" << std::endl; + Eigen::MatrixXd calc; + Mean(m_dataSet, calc, Geometry::EMetric::Wasserstein); + //const Eigen::MatrixXd ref = InitMeans::Wasserstein::Reference(); + //EXPECT_TRUE(isAlmostEqual(ref, calc)) << ErrorMsg("Mean Matrix Wasserstein", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Means, ALE) +{ + std::cout << "Not implemented" << std::endl; + Eigen::MatrixXd calc; + Mean(m_dataSet, calc, Geometry::EMetric::ALE); + //const Eigen::MatrixXd ref = InitMeans::ALE::Reference(); + //EXPECT_TRUE(isAlmostEqual(ref, calc)) << ErrorMsg("Mean Matrix ALE", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Means, Harmonic) +{ + const Eigen::MatrixXd ref = InitMeans::Harmonic::Reference(); + Eigen::MatrixXd calc; + Mean(m_dataSet, calc, Geometry::EMetric::Harmonic); + EXPECT_TRUE(isAlmostEqual(ref, calc)) << ErrorMsg("Mean Matrix Harmonic", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Means, Identity) +{ + const Eigen::MatrixXd ref = InitMeans::Identity::Reference(); + Eigen::MatrixXd calc; + Mean(m_dataSet, calc, Geometry::EMetric::Identity); + EXPECT_TRUE(isAlmostEqual(ref, calc)) << ErrorMsg("Mean Matrix Identity", ref, calc); +} +//--------------------------------------------------------------------------------------------------- diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Median.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Median.hpp new file mode 100644 index 0000000..c5fd4f3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Median.hpp @@ -0,0 +1,86 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file test_Median.hpp +/// \brief Tests for Median Functions. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 29/07/2020. +/// \copyright GNU Affero General Public License v3.0. +/// \remarks We use the EEglab Matlab plugin to compare result for validation +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "gtest/gtest.h" + +#include "init.hpp" +#include "misc.hpp" + +#include +#include + +//--------------------------------------------------------------------------------------------------- +class Tests_Median : public testing::Test +{ +protected: + std::vector m_dataSet; + + void SetUp() override { m_dataSet = Geometry::Vector2DTo1D(InitCovariance::LWF::Reference()); } +}; + +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Median, Simple_Median) +{ + std::vector v{ 5, 6, 4, 3, 2, 6, 7, 9, 3 }; + double calc = Geometry::Median(v); + EXPECT_EQ(calc, 5); + + v.pop_back(); + calc = Geometry::Median(v); + EXPECT_EQ(calc, 5.5); + + Eigen::MatrixXd m(3, 3); + m << 5, 6, 4, 3, 2, 6, 7, 9, 3; + calc = Geometry::Median(m); + EXPECT_EQ(calc, 5); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Median, Euclidian) +{ + Eigen::MatrixXd calc; + Eigen::MatrixXd ref(3, 3); + ref << 1.749537973777478, 0.002960131606861, 0.020507254841909, + 0.002960131606861, 1.754563395557952, 0.043042786354499, + 0.020507254841909, 0.043042786354499, 1.057672472691352; + EXPECT_TRUE(Geometry::Median(m_dataSet, calc, 0.0001, 50, Geometry::EMetric::Euclidian)) << "Error During Median Computing"; + EXPECT_TRUE(isAlmostEqual(ref, calc)) << ErrorMsg("Euclidian Median of Dataset", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Median, Riemann) +{ + Eigen::MatrixXd calc; + Eigen::MatrixXd ref(3, 3); + ref << 1.851330747504982, 0.002002346316770, 0.022122030618131, + 0.002002346316770, 1.644242996651016, 0.033655563302757, + 0.022122030618131, 0.033655563302757, 0.851184143800763; + EXPECT_TRUE(Geometry::Median(m_dataSet, calc, 0.0001, 50, Geometry::EMetric::Riemann)) << "Error During Median Computes"; + EXPECT_TRUE(isAlmostEqual(ref, calc)) << ErrorMsg("Riemann Median of Dataset", ref, calc); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Median, Identity) +{ + const Eigen::MatrixXd ref = InitMeans::Identity::Reference(); + Eigen::MatrixXd calc; + EXPECT_TRUE(Geometry::Median(m_dataSet, calc, 0.0001, 50, Geometry::EMetric::Identity)) << "Error During Median Computes"; + EXPECT_TRUE(isAlmostEqual(ref, calc)) << ErrorMsg("Identity Median of Dataset", ref, calc); +} +//--------------------------------------------------------------------------------------------------- diff --git a/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Misc.hpp b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Misc.hpp new file mode 100644 index 0000000..c7337cd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/geometry/test/test_Misc.hpp @@ -0,0 +1,158 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file test_Misc.hpp +/// \brief Tests for Misc Functions of module. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 29/07/2020. +/// \copyright GNU Affero General Public License v3.0. +/// \remarks We use the EEglab Matlab plugin to compare result for validation +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "gtest/gtest.h" +#include "init.hpp" +#include "misc.hpp" + +#include +#include + +//--------------------------------------------------------------------------------------------------- +class Tests_Misc : public testing::Test +{ + //protected: + // std::vector m_dataSet; + // + // void SetUp() override { m_dataSet = Vector2DTo1D(InitCovariance::LWF::Reference()); } +}; + +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Misc, Double_Range) +{ + const std::vector calc1 = Geometry::doubleRange(0, 10, 2), calc2 = Geometry::doubleRange(0, 10, 2, false), + calc3 = Geometry::doubleRange(0.15, 3.05, 0.5), calc4 = Geometry::doubleRange(0.15, 3.05, 0.5, false), + ref1 = { 0, 2, 4, 6, 8, 10 }, ref2 = { 0, 2, 4, 6, 8 }, + ref3 = { 0.15, 0.65, 1.15, 1.65, 2.15, 2.65 }, ref4 = { 0.15, 0.65, 1.15, 1.65, 2.15, 2.65 }; + + EXPECT_TRUE(isAlmostEqual(ref1, calc1)) << ErrorMsg("Double closed Range with integer value", ref1, calc1); + EXPECT_TRUE(isAlmostEqual(ref2, calc2)) << ErrorMsg("Double opened Range with integer value", ref2, calc2); + EXPECT_TRUE(isAlmostEqual(ref3, calc3)) << ErrorMsg("Double closed Range with double value", ref3, calc3); + EXPECT_TRUE(isAlmostEqual(ref4, calc4)) << ErrorMsg("Double opened Range with double value", ref4, calc4); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Misc, Round_Index_Range) +{ + const std::vector calc1 = Geometry::RoundIndexRange(0, 10, 2), calc2 = Geometry::RoundIndexRange(0, 10, 2, false), + calc3 = Geometry::RoundIndexRange(0.15, 3.15, 0.2), calc4 = Geometry::RoundIndexRange(0.15, 3.05, 0.2, false, false), + ref1 = { 0, 2, 4, 6, 8, 10 }, ref2 = { 0, 2, 4, 6, 8 }, + ref3 = { 0, 1, 2, 3 }, ref4 = { 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3 }; + + EXPECT_TRUE(isAlmostEqual(ref1, calc1)) << ErrorMsg("Round Index closed Range with integer value", ref1, calc1); + EXPECT_TRUE(isAlmostEqual(ref2, calc2)) << ErrorMsg("Round Index opened Range with integer value", ref2, calc2); + EXPECT_TRUE(isAlmostEqual(ref3, calc3)) << ErrorMsg("Round Index closed Range with double value", ref3, calc3); + EXPECT_TRUE(isAlmostEqual(ref4, calc4)) << ErrorMsg("Round Index opened Range with double value", ref4, calc4); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Misc, Bin_Histogramm) +{ + //========== Create Dataset ========== + const std::vector matrices = Geometry::Vector2DTo1D(InitDataset::Dataset()); + std::vector> dataset(NB_CHAN); + // Transform Dataset to vector per channel + for (size_t i = 0; i < NB_CHAN; ++i) { dataset[i].reserve(NB_SAMPLE * matrices.size()); } + for (const auto& m : matrices) { for (size_t i = 0; i < NB_CHAN; ++i) { for (size_t j = 0; j < NB_SAMPLE; ++j) { dataset[i].push_back(m(i, j)); } } } + + // Sort and remove first (to begin by 0) + for (auto& d : dataset) + { + std::sort(d.begin(), d.end()); + const auto first = d[0]; + for (auto& e : d) { e -= first; } + } + + //========== Create Ref ========== + const std::vector> ref = + { + { 12, 10, 0, 15, 15, 0, 6, 12, 0, 11, 11, 0, 11, 14, 3 }, + { 17, 0, 26, 0, 0, 18, 0, 28, 0, 0, 15, 0, 7, 0, 9 }, + { 36, 0, 0, 34, 0, 0, 0, 0, 0, 15, 0, 0, 20, 0, 15 } + }; + + //========== Test ========== + for (size_t i = 0; i < NB_CHAN; ++i) + { + const std::vector hist = Geometry::BinHist(dataset[i], 15); + EXPECT_TRUE(isAlmostEqual(hist, ref[i])) << ErrorMsg("Bin Histogramm", hist, ref[i]); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Misc, Fit_Distribution) +{ + const std::vector matrices = Geometry::Vector2DTo1D(InitDataset::Dataset()); + std::vector> dataset(NB_CHAN); + // Transform Dataset to vector per channel + for (size_t i = 0; i < NB_CHAN; ++i) { dataset[i].reserve(NB_SAMPLE * matrices.size()); } + for (const auto& m : matrices) { for (size_t i = 0; i < NB_CHAN; ++i) { for (size_t j = 0; j < NB_SAMPLE; ++j) { dataset[i].push_back(m(i, j)); } } } + + // Begin Fit Distribution + std::vector mu(NB_CHAN), sigma(NB_CHAN); + const std::vector refMu = { -0.840258269642149, - 2.10169835819046, 0.898301641809541 }, + refSigma = { 2.76541902273525, 0.435493584265319, 0.435493584265319 }; + + for (size_t i = 0; i < NB_CHAN; ++i) + { + Geometry::FitDistribution(dataset[i], mu[i], sigma[i]); + EXPECT_TRUE(isAlmostEqual(mu[i], refMu[i])) << ErrorMsg("Fit Distribution Mu", mu[i], refMu[i]); + EXPECT_TRUE(isAlmostEqual(sigma[i], refSigma[i])) << ErrorMsg("Fit Distribution Sigma", sigma[i], refSigma[i]); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Misc, Sorted_Eigen_Vector_Euclidian) +{ + std::vector matrices = Geometry::Vector2DTo1D(InitCovariance::LWF::Reference()); + const size_t n = matrices.size(); + std::vector vectors = InitEigenVector::Euclidian::Vectors(); + std::vector> values = InitEigenVector::Euclidian::Values(); + for (size_t i = 0; i < n; ++i) + { + Eigen::MatrixXd vec; + std::vector val; + Geometry::sortedEigenVector(matrices[i], vec, val, Geometry::EMetric::Euclidian); + EXPECT_TRUE(isAlmostEqual(vectors[i], vec)) << ErrorMsg("Eigen Vector sample " + std::to_string(i) + " : ", vectors[i], vec); + EXPECT_TRUE(isAlmostEqual(values[i], val)) << ErrorMsg("Eigen Value sample " + std::to_string(i) + " : ", values[i], val); + } +} +//--------------------------------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------------------------------- +TEST_F(Tests_Misc, Sorted_Eigen_Vector_Riemann) +{ + std::cout << "Not implemented" << std::endl; + std::vector matrices = Geometry::Vector2DTo1D(InitCovariance::LWF::Reference()); + const size_t n = matrices.size(); + //std::vector vectors = InitEigenVector::Riemann::Vectors(); + //std::vector> values = InitEigenVector::Riemann::Values(); + for (size_t i = 0; i < n; ++i) + { + Eigen::MatrixXd vec; + std::vector val; + Geometry::sortedEigenVector(matrices[i], vec, val, Geometry::EMetric::Riemann); + //EXPECT_TRUE(isAlmostEqual(vectors[i], vec)) << ErrorMsg("Eigen Vector sample " + std::to_string(i) + " : ", vectors[i], vec); + //EXPECT_TRUE(isAlmostEqual(values[i], val)) << ErrorMsg("Eigen Value sample " + std::to_string(i) + " : ", values[i], val); + } +} +//--------------------------------------------------------------------------------------------------- +*/ \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/modules/labstreamlayer/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/modules/labstreamlayer/CMakeLists.txt new file mode 100644 index 0000000..120fc80 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/labstreamlayer/CMakeLists.txt @@ -0,0 +1,47 @@ +project(openvibe-module-labstreamlayer) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +SET(SRC_FILES + src/Utils.cpp + include/labstreamlayer/Utils.hpp) + +ADD_LIBRARY(${PROJECT_NAME} STATIC ${SRC_FILES}) + +TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} + PRIVATE include/labstreamlayer + PUBLIC include) + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER}) + +if(UNIX) + SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-fPIC") +ENDIF(UNIX) + + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBEModuleSystem") +# OpenViBE Third Party +INCLUDE("FindThirdPartyLSL") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY include/ DESTINATION ${DIST_INCLUDEDIR} FILES_MATCHING PATTERN "*.hpp" PATTERN "*.h") diff --git a/Masterarbeit/openvibe/extras-master/modules/labstreamlayer/include/labstreamlayer/Utils.hpp b/Masterarbeit/openvibe/extras-master/modules/labstreamlayer/include/labstreamlayer/Utils.hpp new file mode 100644 index 0000000..cda6ace --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/labstreamlayer/include/labstreamlayer/Utils.hpp @@ -0,0 +1,38 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file Utils.hpp +/// \brief Utils for LSL within OpenViBE +/// \author Thomas Prampart (INRIA). +/// \version 0.0.1. +/// \date Thu Apr 1 2021. +/// +/// \copyright (C) 2021 INRIA +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see . +///------------------------------------------------------------------------------------------------- + +#pragma once + +namespace OpenViBE { +namespace LabStreamLayer { + +/// +/// \brief Get LSL relative time for an OV time +/// \param time The time in OV time referential +/// \return The time (in seconds) in lsl clock referential +double getLSLRelativeTime(const CTime& time); + + +} // namespace LabStreamLayer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/modules/labstreamlayer/src/Utils.cpp b/Masterarbeit/openvibe/extras-master/modules/labstreamlayer/src/Utils.cpp new file mode 100644 index 0000000..25b2f11 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/labstreamlayer/src/Utils.cpp @@ -0,0 +1,54 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file Utils.cpp +/// \brief Implementation of utils for LSL within OpenViBE +/// \author Thomas Prampart (INRIA). +/// \version 0.0.1. +/// \date Thu Apr 1 2021. +/// +/// \copyright (C) 2021 INRIA +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see . +///------------------------------------------------------------------------------------------------- + +#include + +#include +#include + +#include "Utils.hpp" + +namespace OpenViBE { +namespace LabStreamLayer { + +double getLSLRelativeTime(const CTime& time) +{ + const CTime ovTimeNow(System::Time::zgetTime()); + const double lslRelativeTime = lsl::local_clock(); + + double diffToCurrent; + if (time > ovTimeNow) + { + diffToCurrent = (time - ovTimeNow).toSeconds(); + } + else + { + diffToCurrent = -(ovTimeNow - time).toSeconds(); + } + + return (lslRelativeTime + diffToCurrent); +} + +} // namespace LabStreamLayer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/modules/tcptagging/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/modules/tcptagging/CMakeLists.txt new file mode 100755 index 0000000..592cd0d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/tcptagging/CMakeLists.txt @@ -0,0 +1,40 @@ +PROJECT(openvibe-module-tcptagging) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl include/*.h) +INCLUDE_DIRECTORIES(include/tcptagging) + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER} + COMPILE_FLAGS "-DOV_Shared -DOV_Exports") + +SET(INCLUDED_OV_SDK_COMPONENTS COMMON) +INCLUDE(AddOpenViBESDKComponents) +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyBoost_System") # ASIO + + +# --------------------------------- + + + + +# --------------------------------- + + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY include/ DESTINATION ${DIST_INCLUDEDIR} FILES_MATCHING PATTERN "*.h") diff --git a/Masterarbeit/openvibe/extras-master/modules/tcptagging/include/tcptagging/CStimulusSender.h b/Masterarbeit/openvibe/extras-master/modules/tcptagging/include/tcptagging/CStimulusSender.h new file mode 100755 index 0000000..34ab98e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/tcptagging/include/tcptagging/CStimulusSender.h @@ -0,0 +1,34 @@ +#pragma once + +#include + +#include "IStimulusSender.h" + +namespace TCPTagging { +/* +* \class CStimulusSender +* \author Jussi T. Lindgren / Inria +* \brief Simple client to send stimuli to Acquisition Server's TCP Tagging +*/ +class CStimulusSender : public IStimulusSender +{ +public: + + CStimulusSender() : m_oStimulusSocket(m_ioService) { } + ~CStimulusSender() override; + + // Connect to the TCP Tagging plugin of the Acquisition Server + // If sAddress is empty string, the StimulusSender will be inactive and connect() will not print an error but returns false. + bool connect(const char* sAddress, const char* sStimulusPort) override; + + // Send a stimulation. + bool sendStimulation(uint64_t stimulation, uint64_t timestamp = 0, uint64_t flags = (Flag_Fptime | Flag_Autostamp_Clientside)) override; + +protected: + + boost::asio::io_service m_ioService; + boost::asio::ip::tcp::socket m_oStimulusSocket; + bool m_bConnectedOnce = false; + uint64_t m_lastTimestamp = 0; +}; +} // namespace TCPTagging diff --git a/Masterarbeit/openvibe/extras-master/modules/tcptagging/include/tcptagging/IStimulusSender.h b/Masterarbeit/openvibe/extras-master/modules/tcptagging/include/tcptagging/IStimulusSender.h new file mode 100755 index 0000000..2167b58 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/tcptagging/include/tcptagging/IStimulusSender.h @@ -0,0 +1,38 @@ +#pragma once +#include "defines.h" + +namespace TCPTagging { +/* +* \class IStimulusSender +* \author Jussi T. Lindgren / Inria +* \brief Interface of a simple client to send stimuli to Acquisition Server's TCP Tagging +*/ +class OV_API IStimulusSender +{ +public: + + // Connect to the TCP Tagging plugin of the Acquisition Server + // If sAddress is empty string, the StimulusSender will be inactive and connect() will not print an error but returns false. + virtual bool connect(const char* sAddress, const char* sStimulusPort) = 0; + + // Send a stimulation. + // Or flags with FLAG_FPTIME if the provided time is fixed point. + // Or flags with FLAG_AUTOSTAMP_CLIENTSIDE to set the latest timestamp before sending. Then, timestamp is ignored. + // Or flags with FLAG_AUTOSTAMP_SERVERSIDE to request these server to stamp on receiveing. Then, timestamp is ignored. + virtual bool sendStimulation(uint64_t stimulation, uint64_t timestamp = 0, uint64_t flags = (Flag_Fptime | Flag_Autostamp_Clientside)) = 0; + + // To allow derived class' destructor to be called + virtual ~IStimulusSender() = default; + + // Note: duplicated in TCP Tagging plugin in AS + enum ETCPTaggingFlags + { + Flag_Fptime = (1LL << 0), // The time given is fixed point time. + Flag_Autostamp_Clientside = (1LL << 1), // Ignore given stamp, bake timestamp on client side before sending + Flag_Autostamp_Serverside = (1LL << 2) // Ignore given stamp, bake timestamp on server side when receiving + }; +}; + +// Clients are constructed via this call. +extern OV_API IStimulusSender* CreateStimulusSender(); +} // namespace TCPTagging diff --git a/Masterarbeit/openvibe/extras-master/modules/tcptagging/include/tcptagging/defines.h b/Masterarbeit/openvibe/extras-master/modules/tcptagging/include/tcptagging/defines.h new file mode 100755 index 0000000..a980486 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/tcptagging/include/tcptagging/defines.h @@ -0,0 +1,3 @@ +#pragma once + +#include diff --git a/Masterarbeit/openvibe/extras-master/modules/tcptagging/src/CStimulusSender.cpp b/Masterarbeit/openvibe/extras-master/modules/tcptagging/src/CStimulusSender.cpp new file mode 100755 index 0000000..edab524 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/tcptagging/src/CStimulusSender.cpp @@ -0,0 +1,89 @@ +#include "CStimulusSender.h" + +#include +#include + +// @fixme Should use some logging facility instead of std::cout +namespace TCPTagging { + +CStimulusSender::~CStimulusSender() { if (m_oStimulusSocket.is_open()) { m_oStimulusSocket.close(); } } + +bool CStimulusSender::connect(const char* sAddress, const char* sStimulusPort) +{ + boost::asio::ip::tcp::resolver resolver(m_ioService); + + if (!sAddress || !sStimulusPort) + { + std::cout << "Error: Do not pass NULL pointers to CStimulusSender::connect()\n"; + return false; + } + if (sAddress[0] == 0) { return false; } // Empty string is ok, in that case Stimulus Sender is disabled + + // Stimulus port + std::cout << "Connecting to Acquisition Server's TCP Tagging [" << sAddress << " , port " << sStimulusPort << "]\n"; + try + { + boost::system::error_code error; + + const boost::asio::ip::tcp::resolver::query query = boost::asio::ip::tcp::resolver::query( + boost::asio::ip::tcp::v4(), sAddress, sStimulusPort, boost::asio::ip::resolver_query_base::numeric_service); + const auto endpointIterator = resolver.resolve(query); + m_oStimulusSocket.connect(*endpointIterator, error); + if (error) + { + std::cout << "-- Boost ASIO connection error: " << error << "\n"; + return false; + } + } + catch (boost::system::system_error& error) + { + std::cout << "-- Issue '" << error.code().message() << "' with opening connection to server\n"; + return false; + } + + m_bConnectedOnce = true; + m_lastTimestamp = 0; + + return true; +} + +bool CStimulusSender::sendStimulation(uint64_t stimulation, uint64_t timestamp, uint64_t flags /* = FPTIME|CLIENTSIDE */) +{ + if (!m_bConnectedOnce) { return false; } + + if (!m_oStimulusSocket.is_open()) + { + std::cout << "Error: Cannot send stimulation, socket is not open\n"; + return false; + } + + if (flags & Flag_Autostamp_Clientside) + { + timestamp = System::Time::zgetTimeRaw(false); + flags |= Flag_Fptime; + } + + if (timestamp < m_lastTimestamp) + { + std::cout << "Error: Stimulations must be inserted in increasing time order (now: " + << timestamp << ", prev: " << m_lastTimestamp << ", stim=" << stimulation << ")\n"; + return false; + } + m_lastTimestamp = timestamp; + + try + { + write(m_oStimulusSocket, boost::asio::buffer(static_cast(&flags), sizeof(uint64_t))); + write(m_oStimulusSocket, boost::asio::buffer(static_cast(&stimulation), sizeof(uint64_t))); + write(m_oStimulusSocket, boost::asio::buffer(static_cast(×tamp), sizeof(uint64_t))); + } + catch (boost::system::system_error& error) + { + std::cout << "Issue '" << error.code().message() << "' with writing stimulus to server\n"; + return false; + } + + return true; +} + +} // namespace TCPTagging diff --git a/Masterarbeit/openvibe/extras-master/modules/tcptagging/src/IStimulusSender.cpp b/Masterarbeit/openvibe/extras-master/modules/tcptagging/src/IStimulusSender.cpp new file mode 100755 index 0000000..d9abeb3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/modules/tcptagging/src/IStimulusSender.cpp @@ -0,0 +1,3 @@ +#include "CStimulusSender.h" + +OV_API TCPTagging::IStimulusSender* TCPTagging::CreateStimulusSender() { return new CStimulusSender(); } diff --git a/Masterarbeit/openvibe/extras-master/plugins/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/CMakeLists.txt new file mode 100644 index 0000000..63294b2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/CMakeLists.txt @@ -0,0 +1 @@ +OV_ADD_PROJECTS("PLUGINS") diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/CMakeLists.txt new file mode 100644 index 0000000..fbefac3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/CMakeLists.txt @@ -0,0 +1,2 @@ +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("PLUGINS_PROCESSING") diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/CMakeLists.txt new file mode 100644 index 0000000..8ed174e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/CMakeLists.txt @@ -0,0 +1,29 @@ +PROJECT(openvibe-plugins-acquisition) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleSocket") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/box-tutorials/network-acquisition.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/box-tutorials/network-acquisition.xml new file mode 100644 index 0000000..d759fe5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/box-tutorials/network-acquisition.xml @@ -0,0 +1,387 @@ + + 1 + openvibe + 2.0 + + + (0x000029b8, 0x00004235) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48.000000 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 352.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005c0f5a) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x000044d9, 0x0000415f) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 368.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 113 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00276b19) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + + + (0x000019c2, 0x00003e36) + + (0x000029b8, 0x00004235) + 1 + + + (0x000044d9, 0x0000415f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 67 + + + (0x358ae8b5, 0x0f8bacd1) + 337 + + + (0x3f0a3b27, 0x570913d2) + 136 + + + (0x6267b5c5, 0x676e3e42) + 353 + + + + + (0x00002352, 0x00007dcd) + + (0x000029b8, 0x00004235) + 4 + + + (0x000044d9, 0x0000415f) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 67 + + + (0x358ae8b5, 0x0f8bacd1) + 382 + + + (0x3f0a3b27, 0x570913d2) + 136 + + + (0x6267b5c5, 0x676e3e42) + 383 + + + + + (0x00005ba9, 0x00007356) + + (0x000029b8, 0x00004235) + 2 + + + (0x000044d9, 0x0000415f) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 67 + + + (0x358ae8b5, 0x0f8bacd1) + 352 + + + (0x3f0a3b27, 0x570913d2) + 136 + + + (0x6267b5c5, 0x676e3e42) + 368 + + + + + + + (0x00002398, 0x00002d9d) + The <i><b>Acquisition Client</b></i> box +receives data from the OpenViBE acquisition +server. You should have the OpenViBE +acquisition server started and acquiring to +let this scenario work correctly. In case +of connection errors, you should read a +message in the console. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + 64 + + + + + (0x00005018, 0x00007ee0) + The <i>Signal Display</i> box display the +acquired data. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + 176 + + + + + (0x00005a08, 0x00002b8c) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 512 + + + (0x7234b86b, 0x2b8651a5) + 240 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x0000228a, 0x0000253b)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0x000044d9, 0x0000415f)","childCount":0,"identifier":"(0x00005a9f, 0x00004ede)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00001786, 0x00000497)","index":0,"name":"Default tab","parentIdentifier":"(0x0000228a, 0x0000253b)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00005f28, 0x000016db)","index":0,"name":"Empty","parentIdentifier":"(0x00001786, 0x00000497)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Network acquisition example + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/tutorial-the-most-basic-openvibe-setup/ + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/doc/Doc_BoxAlgorithm_AcquisitionClient.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/doc/Doc_BoxAlgorithm_AcquisitionClient.dox-part new file mode 100644 index 0000000..f59f217 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/doc/Doc_BoxAlgorithm_AcquisitionClient.dox-part @@ -0,0 +1,61 @@ +/** + * \page BoxAlgorithm_AcquisitionClient Acquisition client +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_AcquisitionClient_Description| + Opens a socket to read experiment information, signal, stimulations and channel localization data sent across the network. + * |OVP_DocEnd_BoxAlgorithm_AcquisitionClient_Description| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_AcquisitionClient_Outputs| + * |OVP_DocEnd_BoxAlgorithm_AcquisitionClient_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_AcquisitionClient_Output1| + * |OVP_DocEnd_BoxAlgorithm_AcquisitionClient_Output1| + + * |OVP_DocBegin_BoxAlgorithm_AcquisitionClient_Output2| + * |OVP_DocEnd_BoxAlgorithm_AcquisitionClient_Output2| + + * |OVP_DocBegin_BoxAlgorithm_AcquisitionClient_Output3| + * |OVP_DocEnd_BoxAlgorithm_AcquisitionClient_Output3| + + * |OVP_DocBegin_BoxAlgorithm_AcquisitionClient_Output4| +Channel localisation flow + * |OVP_DocEnd_BoxAlgorithm_AcquisitionClient_Output4| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_AcquisitionClient_Settings| + * |OVP_DocEnd_BoxAlgorithm_AcquisitionClient_Settings| + + * |OVP_DocBegin_BoxAlgorithm_AcquisitionClient_Setting1| + EEG server hostname + * |OVP_DocEnd_BoxAlgorithm_AcquisitionClient_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_AcquisitionClient_Setting2| + EEG server port + * |OVP_DocEnd_BoxAlgorithm_AcquisitionClient_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_AcquisitionClient_Examples| + * |OVP_DocEnd_BoxAlgorithm_AcquisitionClient_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_AcquisitionClient_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_AcquisitionClient_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/src/box-algorithms/ovpCBoxAlgorithmAcquisitionClient.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/src/box-algorithms/ovpCBoxAlgorithmAcquisitionClient.cpp new file mode 100644 index 0000000..8561e89 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/src/box-algorithms/ovpCBoxAlgorithmAcquisitionClient.cpp @@ -0,0 +1,159 @@ +#include "ovpCBoxAlgorithmAcquisitionClient.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace Acquisition { + +uint64_t CBoxAlgorithmAcquisitionClient::getClockFrequency() { return 64LL << 32; } + +bool CBoxAlgorithmAcquisitionClient::initialize() +{ + m_decoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_AcquisitionDecoder)); + + m_decoder->initialize(); + + ip_acquisitionBuffer.initialize(m_decoder->getInputParameter(OVP_GD_Algorithm_AcquisitionDecoder_InputParameterId_MemoryBufferToDecode)); + op_bufferDuration.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_BufferDuration)); + op_experimentInfoBuffer.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_ExperimentInfoStream)); + op_signalBuffer.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_SignalStream)); + op_stimulationBuffer.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_StimulationStream)); + op_channelLocalisationBuffer.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_ChannelLocalisationStream)); + op_channelUnitsBuffer.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_ChannelUnitsStream)); + + m_lastStartTime = 0; + m_lastEndTime = 0; + m_connectionClient = nullptr; + + if (getStaticBoxContext().getOutputCount() < 5) + { + this->getLogManager() << Kernel::LogLevel_Error << "Code expects at least 5 box outputs. Did you update the box?\n"; + return false; + } + + return true; +} + +bool CBoxAlgorithmAcquisitionClient::uninitialize() +{ + if (m_connectionClient) + { + m_connectionClient->close(); + m_connectionClient->release(); + m_connectionClient = nullptr; + } + + op_channelUnitsBuffer.uninitialize(); + op_channelLocalisationBuffer.uninitialize(); + op_stimulationBuffer.uninitialize(); + op_signalBuffer.uninitialize(); + op_experimentInfoBuffer.uninitialize(); + op_bufferDuration.uninitialize(); + ip_acquisitionBuffer.uninitialize(); + + m_decoder->uninitialize(); + + getAlgorithmManager().releaseAlgorithm(*m_decoder); + + m_decoder = nullptr; + + return true; +} + +bool CBoxAlgorithmAcquisitionClient::processClock(Kernel::CMessageClock& /*msg*/) +{ + if (!m_connectionClient) + { + CString name = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + const size_t port = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + if (name.length() == 0) + { + this->getLogManager() << Kernel::LogLevel_Warning << + "Empty server name, please set it to a correct value or set AcquisitionServer_HostName in config files. Defaulting to \"localhost\".\n"; + name = "localhost"; + } + if (port == std::numeric_limits::max() || port == std::numeric_limits::min()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Invalid value for port : " << port << + ". Please set the port to a positive non-zero integer value.\n"; + return false; + } + + m_connectionClient = Socket::createConnectionClient(); + m_connectionClient->connect(name, port); + if (!m_connectionClient->isConnected()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Could not connect to server " << name << ":" << port << + ". Make sure the server is running and in Play state.\n"; + return false; + } + } + + if (m_connectionClient && m_connectionClient->isReadyToReceive() /* && getPlayerContext().getCurrentTime()>m_lastChunkEndTime */) + { + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + } + + return true; +} + +bool CBoxAlgorithmAcquisitionClient::process() +{ + if (!m_connectionClient || !m_connectionClient->isConnected()) { return false; } + + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + op_experimentInfoBuffer = boxContext.getOutputChunk(0); + op_signalBuffer = boxContext.getOutputChunk(1); + op_stimulationBuffer = boxContext.getOutputChunk(2); + op_channelLocalisationBuffer = boxContext.getOutputChunk(3); + op_channelUnitsBuffer = boxContext.getOutputChunk(4); + + while (m_connectionClient->isReadyToReceive()) + { + size_t size = 0; + if (!m_connectionClient->receiveBufferBlocking(&size, sizeof(size))) + { + getLogManager() << Kernel::LogLevel_Error << "Could not receive memory buffer size from the server. Is the server on 'Play'?\n"; + return false; + } + if (!ip_acquisitionBuffer->setSize(size, true)) + { + getLogManager() << Kernel::LogLevel_Error << "Could not re allocate memory buffer with size " << size << "\n"; + return false; + } + if (!m_connectionClient->receiveBufferBlocking(ip_acquisitionBuffer->getDirectPointer(), size)) + { + getLogManager() << Kernel::LogLevel_Error << "Could not receive memory buffer content of size " << size << "\n"; + return false; + } + + m_decoder->process(); + + + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_AcquisitionDecoder_OutputTriggerId_ReceivedHeader) + || m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_AcquisitionDecoder_OutputTriggerId_ReceivedBuffer) + || m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_AcquisitionDecoder_OutputTriggerId_ReceivedEnd)) + { + boxContext.markOutputAsReadyToSend(0, m_lastStartTime, m_lastEndTime); + boxContext.markOutputAsReadyToSend(1, m_lastStartTime, m_lastEndTime); + boxContext.markOutputAsReadyToSend(2, m_lastStartTime, m_lastEndTime); + if (op_channelLocalisationBuffer->getSize() > 0) { boxContext.markOutputAsReadyToSend(3, m_lastStartTime, m_lastEndTime); } + else { boxContext.setOutputChunkSize(3, 0, true); } + + if (op_channelUnitsBuffer->getSize() > 0) { boxContext.markOutputAsReadyToSend(4, m_lastStartTime, m_lastEndTime); } + else { boxContext.setOutputChunkSize(4, 0, true); } + m_lastStartTime = m_lastEndTime; + m_lastEndTime += op_bufferDuration; + // @todo ? + // const double latency=CTime(m_lastChunkEndTime).toSeconds() - CTime(this->getPlayerContext().getCurrentTime()).toSeconds(); + const double latency = double(int64_t(m_lastEndTime - this->getPlayerContext().getCurrentTime()) / (1LL << 22)) / 1024.0; + this->getLogManager() << Kernel::LogLevel_Debug << "Acquisition inner latency : " << latency << "\n"; + } + } + + return true; +} +} // namespace Acquisition +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/src/box-algorithms/ovpCBoxAlgorithmAcquisitionClient.h b/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/src/box-algorithms/ovpCBoxAlgorithmAcquisitionClient.h new file mode 100644 index 0000000..63e3762 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/src/box-algorithms/ovpCBoxAlgorithmAcquisitionClient.h @@ -0,0 +1,83 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Acquisition { +class CBoxAlgorithmAcquisitionClient final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + uint64_t getClockFrequency() override; + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_AcquisitionClient) + +protected: + + Kernel::IAlgorithmProxy* m_decoder = nullptr; + + Kernel::TParameterHandler ip_acquisitionBuffer; + Kernel::TParameterHandler op_bufferDuration; + Kernel::TParameterHandler op_experimentInfoBuffer; + Kernel::TParameterHandler op_signalBuffer; + Kernel::TParameterHandler op_stimulationBuffer; + Kernel::TParameterHandler op_channelLocalisationBuffer; + Kernel::TParameterHandler op_channelUnitsBuffer; + + Socket::IConnectionClient* m_connectionClient = nullptr; + + uint64_t m_lastStartTime = 0; + uint64_t m_lastEndTime = 0; +}; + +class CBoxAlgorithmAcquisitionClientDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Acquisition client"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("A generic network based acquisition client"); } + + CString getDetailedDescription() const override + { + return CString("This algorithm waits for EEG data from the network and distributes it into the scenario"); + } + + CString getCategory() const override { return CString("Acquisition and network IO"); } + CString getVersion() const override { return CString("1.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_AcquisitionClient; } + IPluginObject* create() override { return new CBoxAlgorithmAcquisitionClient; } + CString getStockItemName() const override { return CString("gtk-connect"); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addOutput("Experiment information", OV_TypeId_ExperimentInfo); + prototype.addOutput("Signal stream", OV_TypeId_Signal); + prototype.addOutput("Stimulations", OV_TypeId_Stimulations); + prototype.addOutput("Channel localisation", OV_TypeId_ChannelLocalisation); + prototype.addOutput("Channel units", OV_TypeId_ChannelUnits); + prototype.addSetting("Acquisition server hostname", OV_TypeId_String, "${AcquisitionServer_HostName}"); + prototype.addSetting("Acquisition server port", OV_TypeId_Integer, "1024"); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_AcquisitionClientDesc) +}; +} // namespace Acquisition +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/src/ovp_defines.h new file mode 100644 index 0000000..7dbb329 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/src/ovp_defines.h @@ -0,0 +1,12 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_AcquisitionClient OpenViBE::CIdentifier(0x35D225CB, 0x3E6E3A5F) +#define OVP_ClassId_BoxAlgorithm_AcquisitionClientDesc OpenViBE::CIdentifier(0x7D3061B9, 0x43565E8C) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/src/ovp_main.cpp new file mode 100644 index 0000000..66706b6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/acquisition/src/ovp_main.cpp @@ -0,0 +1,15 @@ +#include "ovp_defines.h" + +#include "box-algorithms/ovpCBoxAlgorithmAcquisitionClient.h" + +namespace OpenViBE { +namespace Plugins { +namespace Acquisition { + +OVP_Declare_Begin() + OVP_Declare_New(CBoxAlgorithmAcquisitionClientDesc) +OVP_Declare_End() + +} // namespace Acquisition +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/.gitignore b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/.gitignore new file mode 100644 index 0000000..3f38087 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/.gitignore @@ -0,0 +1,4 @@ +doc/html/* +Doxyfile +.vscode/ +test/scenarios-tests/*output* \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/CMakeLists.txt new file mode 100644 index 0000000..e0c91f0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/CMakeLists.txt @@ -0,0 +1,55 @@ +PROJECT(openvibe-plugins-artifact) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.hpp src/*.h src/*.inl src/*.c) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES} +) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE") + +INCLUDE_DIRECTORIES("src") + + +# OpenViBE Base +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") + +# OpenViBE Module +INCLUDE("FindModuleGeometry") +#INCLUDE("FindOpenViBEModuleSystem") +#INCLUDE("FindOpenViBEModuleXML") + +# OpenViBE Third Party +INCLUDE("FindThirdPartyEigen") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +SET(SUB_DIR_NAME artifact) + +INSTALL(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials/${SUB_DIR_NAME}) +#INSTALL(DIRECTORY bci-examples/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/bci-examples/${SUB_DIR_NAME}) + +# --------------------------------- +# Test applications +# --------------------------------- +IF(OV_COMPILE_TESTS) +#ADD_SUBDIRECTORY(test) +ENDIF() diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/box-tutorials/ASR-Processor.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/box-tutorials/ASR-Processor.xml new file mode 100644 index 0000000..53d6f64 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/box-tutorials/ASR-Processor.xml @@ -0,0 +1,1434 @@ + + 2 + OpenViBE Designer + 3.0.0-beta + + + + + + (0x00001182, 0x00005e08) + ASR Processor + (0x41727469, 0x17f1c6e2) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x6f752dd0, 0x082a321e) + Signal Reconstructed + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x330306dd, 0x74a95f98) + Filename to load model + ${Player_ScenarioDirectory}/ASR-model.xml + ${Player_ScenarioDirectory}/ASR-model.xml + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x3c89d3cf, 0x83076356) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000012d1, 0x00005e86) + Reconstructed + (0x1fe50479, 0x39040f40) + + + (0x5ba36127, 0x195feae1) + Input matrix + + + + + (0x5ba36127, 0x195feae1) + Output matrix + + + + + (0x79a9edeb, 0x245d83fc) + New channel names + Channel 1;Channel 2 + Reconstructed + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x74d8d30c, 0xfa7bdf43) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000012d1, 0x00005e87) + Original + (0x1fe50479, 0x39040f40) + + + (0x5ba36127, 0x195feae1) + Input matrix + + + + + (0x5ba36127, 0x195feae1) + Output matrix + + + + + (0x79a9edeb, 0x245d83fc) + New channel names + Channel 1;Channel 2 + Original + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 992 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x74d8d30c, 0xfa7bdf43) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000012d1, 0x00005e88) + Amplified + (0x1fe50479, 0x39040f40) + + + (0x5ba36127, 0x195feae1) + Input matrix + + + + + (0x5ba36127, 0x195feae1) + Output matrix + + + + + (0x79a9edeb, 0x245d83fc) + New channel names + Channel 1;Channel 2 + Amplified + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x74d8d30c, 0xfa7bdf43) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000026cd, 0x00007e87) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + 1.5*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000586a, 0x00001f44) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 480 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000061f4, 0x000010b6) + Signal + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + None + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 50 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 880 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000068e6, 0x00002583) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + (0x0acb4afa, 0xb81a2a87) + (0x5ba36127, 0x195feae1) + Input 3 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 816 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x11a6038b, 0x7157c284) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005e1c11) + + + + + (0x1396fde6, 0x1c64974a) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc7a) + + + (0xfba64161, 0x65304e21) + + + + + + (0x2b88852d, 0x43d7a773) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5045ebd9, 0x67325c0b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e001787) + C3;C4;FC3;FC4 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e001788) + 1 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + 1 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e001789) + 1 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + 1 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x207c9054, 0x3c841b63) + 992 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e00178a) + 1 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + 1 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x558c587f, 0x223f3b67) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a79f8) + + + + + + + (0x00000474, 0x00000eec) + + (0x000012d1, 0x00005e86) + 0 + + + (0x000068e6, 0x00002583) + (0x0acb4afa, 0xb81a2a87) + + + + (0x00000bfd, 0x00000a7c) + + (0x5194b6cb, 0x7e001787) + 0 + + + (0x558c587f, 0x223f3b67) + 0 + + + + (0x00000cf9, 0x0000346a) + + (0x000068e6, 0x00002583) + 0 + + + (0x000061f4, 0x000010b6) + 0 + + + + (0x000011b9, 0x00002347) + + (0x5194b6cb, 0x7e001789) + 0 + + + (0x000012d1, 0x00005e87) + 0 + + + + (0x000017f2, 0x00004d57) + + (0x000026cd, 0x00007e87) + 0 + + + (0x00001182, 0x00005e08) + 0 + + + + (0x00001a52, 0x000007f6) + + (0x5194b6cb, 0x7e001788) + 0 + + + (0x000012d1, 0x00005e86) + 0 + + + + (0x00002206, 0x00001e9d) + + (0x5194b6cb, 0x7e00178a) + 0 + + + (0x000012d1, 0x00005e88) + 0 + + + + (0x00002551, 0x0000620c) + + (0x2b88852d, 0x43d7a773) + 0 + + + (0x5194b6cb, 0x7e001787) + 0 + + + + (0x00002996, 0x00001419) + + (0x11a6038b, 0x7157c284) + 2 + + + (0x5045ebd9, 0x67325c0b) + 0 + + + + (0x000033bd, 0x00001de3) + + (0x000012d1, 0x00005e88) + 0 + + + (0x000068e6, 0x00002583) + 1 + + + + (0x00004034, 0x000058ef) + + (0x558c587f, 0x223f3b67) + 0 + + + (0x0000586a, 0x00001f44) + 0 + + + + (0x000043f4, 0x0000072e) + + (0x11a6038b, 0x7157c284) + 1 + + + (0x2b88852d, 0x43d7a773) + 0 + + + + (0x0000505d, 0x00004ef3) + + (0x0000586a, 0x00001f44) + 0 + + + (0x5194b6cb, 0x7e001789) + 0 + + + + (0x000056b6, 0x00007324) + + (0x00001182, 0x00005e08) + 1 + + + (0x5194b6cb, 0x7e001788) + 0 + + + + (0x00006906, 0x0000295e) + + (0x1396fde6, 0x1c64974a) + 0 + + + (0x000061f4, 0x000010b6) + 1 + + + + (0x00006d07, 0x00002bf8) + + (0x0000586a, 0x00001f44) + 0 + + + (0x000026cd, 0x00007e87) + 0 + + + + (0x00006f47, 0x00005b38) + + (0x000012d1, 0x00005e87) + 0 + + + (0x000068e6, 0x00002583) + 0 + + + + (0x00007d8d, 0x00003611) + + (0x00001182, 0x00005e08) + 0 + + + (0x1396fde6, 0x1c64974a) + 0 + + + + (0x00007f0d, 0x00000034) + + (0x000026cd, 0x00007e87) + 0 + + + (0x5194b6cb, 0x7e00178a) + 0 + + + + + + (0x000054d7, 0x00005ae2) + Input Signal + + + + + + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 752 + + + (0x7234b86b, 0x2b8651a5) + 256 + + + + + (0x000054d7, 0x00005ae3) + Signal Processing + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 752 + + + (0x7234b86b, 0x2b8651a5) + 432 + + + + + + + (0x05377d7e, 0x41751bb3) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":592,"identifier":"(0x00001f6c, 0x000012a7)","name":"Display","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1343},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003bf6, 0x000002ba)","index":0,"name":"Default tab","parentIdentifier":"(0x00001f6c, 0x000012a7)","type":2},{"boxIdentifier":"(0x000061f4, 0x000010b6)","childCount":0,"identifier":"(0x00000106, 0x00000544)","index":0,"parentIdentifier":"(0x00003bf6, 0x000002ba)","type":3}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x7b814cca, 0x271df6dd) + 475 + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Matrix Classification Training Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + bci-examples + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/box-tutorials/ASR-Trainer.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/box-tutorials/ASR-Trainer.xml new file mode 100644 index 0000000..5bf4382 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/box-tutorials/ASR-Trainer.xml @@ -0,0 +1,832 @@ + + 2 + OpenViBE Designer + 3.0.0-beta + + + + + + (0x0000586a, 0x00001f44) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 480 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006bd5, 0x0000489b) + ASR Trainer + (0x41727469, 0xc05f38ff) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x6f752dd0, 0x082a321e) + Tran-completed Flag + + + + + (0x330306dd, 0x74a95f98) + Filename to save model + ${Player_ScenarioDirectory}/ASR-model.xml + ${Player_ScenarioDirectory}/ASR-model.xml + false + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x5261636b, 0x4d455452) + Metric + Euclidian + Euclidian + false + + + (0x512a166f, 0x5c3ef83f) + Channel ratio to reconstruct + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Rejection limit + 5 + 5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0xe02de2aa, 0x821ba183) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00007f96, 0x00002d09) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x11a6038b, 0x7157c284) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005e1c11) + + + + + (0x1396fde6, 0x1c649749) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc7a) + + + (0xfba64161, 0x65304e21) + + + + + + (0x1396fde6, 0x1c64974a) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 480 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc7a) + + + (0xfba64161, 0x65304e21) + + + + + + (0x2b88852d, 0x43d7a773) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5045ebd9, 0x67325c0b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e001787) + C3;C4;FC3;FC4 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x558c587f, 0x223f3b67) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a79f8) + + + + + + + (0x00000bfd, 0x00000a7c) + + (0x5194b6cb, 0x7e001787) + 0 + + + (0x558c587f, 0x223f3b67) + 0 + + + + (0x00000d01, 0x00005533) + + (0x00006bd5, 0x0000489b) + 0 + + + (0x00007f96, 0x00002d09) + 0 + + + + (0x000023c3, 0x0000335d) + + (0x11a6038b, 0x7157c284) + 2 + + + (0x1396fde6, 0x1c649749) + 0 + + + + (0x00002551, 0x0000620c) + + (0x2b88852d, 0x43d7a773) + 0 + + + (0x5194b6cb, 0x7e001787) + 0 + + + + (0x00002996, 0x00001419) + + (0x11a6038b, 0x7157c284) + 2 + + + (0x5045ebd9, 0x67325c0b) + 0 + + + + (0x0000311a, 0x00000602) + + (0x1396fde6, 0x1c64974a) + 0 + + + (0x00006bd5, 0x0000489b) + 0 + + + + (0x00003869, 0x000048f3) + + (0x0000586a, 0x00001f44) + 0 + + + (0x00006bd5, 0x0000489b) + 1 + + + + (0x00004034, 0x000058ef) + + (0x558c587f, 0x223f3b67) + 0 + + + (0x0000586a, 0x00001f44) + 0 + + + + (0x000043f4, 0x0000072e) + + (0x11a6038b, 0x7157c284) + 1 + + + (0x2b88852d, 0x43d7a773) + 0 + + + + (0x00006db7, 0x00007acd) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x1396fde6, 0x1c64974a) + 0 + + + + + + (0x000054d7, 0x00005ae2) + Input Signal + + + + + + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 752 + + + (0x7234b86b, 0x2b8651a5) + 256 + + + + + (0x000054d7, 0x00005ae3) + Signal Processing + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 752 + + + (0x7234b86b, 0x2b8651a5) + 432 + + + + + + + (0x05377d7e, 0x41751bb3) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":592,"identifier":"(0x00001f6c, 0x000012a7)","name":"Display","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1348},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003bf6, 0x000002ba)","index":0,"name":"Default tab","parentIdentifier":"(0x00001f6c, 0x000012a7)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00002c10, 0x00007fa3)","index":0,"name":"Empty","parentIdentifier":"(0x00003bf6, 0x000002ba)","type":0}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x7b814cca, 0x271df6dd) + 475 + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Matrix Classification Training Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + bci-examples + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/box-tutorials/Artifact-Amplitude.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/box-tutorials/Artifact-Amplitude.xml new file mode 100644 index 0000000..1c3487a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/box-tutorials/Artifact-Amplitude.xml @@ -0,0 +1,457 @@ + + 2 + OpenViBE Designer + 3.0.0-beta + + + (0x00425137, 0xf2a30c29) + (0x79a9edeb, 0x245d83fc) + Test Name + Covariance-Matrix-Calculator + Artefact-Amplitude + + + + + + + (0x00000700, 0x00003fcf) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00001721, 0x00002728) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(2*x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000029af, 0x00003a24) + Artefact Amplitude + (0x41727469, 0xb68095e4) + + + (0x5ba36127, 0x195feae1) + Signal + + + + + (0x5ba36127, 0x195feae1) + Non-artefact signal + + + + + (0x512a166f, 0x5c3ef83f) + Max (mV) + 100 + 0.9 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x3dd557b8, 0xa3fba55d) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002b7b, 0x00002df8) + After + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + None + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 1.5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00002b7b, 0x00002df9) + Before + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + None + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 1.5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + + + (0x000011b7, 0x00007822) + + (0x00001721, 0x00002728) + 0 + + + (0x00002b7b, 0x00002df9) + 0 + + + + (0x0000243f, 0x000014b5) + + (0x00001721, 0x00002728) + 0 + + + (0x000029af, 0x00003a24) + 0 + + + + (0x000027fa, 0x000003f7) + + (0x00000700, 0x00003fcf) + 0 + + + (0x00001721, 0x00002728) + 0 + + + + (0x0000499a, 0x00006eed) + + (0x000029af, 0x00003a24) + 0 + + + (0x00002b7b, 0x00002df8) + 0 + + + + + + + (0x000062ac, 0x00003721) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":582,"identifier":"(0x0000041e, 0x000069b5)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":844},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004c5d, 0x000021d4)","index":0,"name":"Default tab","parentIdentifier":"(0x0000041e, 0x000069b5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":266,"identifier":"(0x000028e6, 0x00005ce6)","index":0,"maxDividerPosition":537,"name":"Vertical split","parentIdentifier":"(0x00004c5d, 0x000021d4)","type":4},{"boxIdentifier":"(0x00002b7b, 0x00002df9)","childCount":0,"identifier":"(0x00005d1e, 0x00006cf8)","index":0,"parentIdentifier":"(0x000028e6, 0x00005ce6)","type":3},{"boxIdentifier":"(0x00002b7b, 0x00002df8)","childCount":0,"identifier":"(0x000023a5, 0x0000366a)","index":1,"parentIdentifier":"(0x000028e6, 0x00005ce6)","type":3}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/doc/Doc_BoxAlgorithm_ASRProcessor.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/doc/Doc_BoxAlgorithm_ASRProcessor.dox-part new file mode 100644 index 0000000..d21ecf4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/doc/Doc_BoxAlgorithm_ASRProcessor.dox-part @@ -0,0 +1,62 @@ +/** + * \page BoxAlgorithm_ASRProcessor ASR Processor +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ASRProcessor_Description| + Artifact Subspace Reconstruction (ASR) Trainer (see \ref CASR::process). + * |OVP_DocEnd_BoxAlgorithm_ASRProcessor_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ASRProcessor_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ASRProcessor_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ASRProcessor_Input1| +The input signal on which the Artifact reconstruction is used. + * |OVP_DocEnd_BoxAlgorithm_ASRProcessor_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ASRProcessor_Outputs| + * |OVP_DocEnd_BoxAlgorithm_ASRProcessor_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_ASRProcessor_Output1| + Send \"OVTK_StimulationId_TrainCompleted\" if signal is reconstructed. + * |OVP_DocEnd_BoxAlgorithm_ASRProcessor_Output1| + + * |OVP_DocBegin_BoxAlgorithm_ASRProcessor_Output2| + The reconstructed signal if needed, the input signal otherwise. + * |OVP_DocEnd_BoxAlgorithm_ASRProcessor_Output2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ASRProcessor_Settings| + * |OVP_DocEnd_BoxAlgorithm_ASRProcessor_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ASRProcessor_Setting1| + ASR model Filename. + * |OVP_DocEnd_BoxAlgorithm_ASRProcessor_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ASRProcessor_Examples| + * |OVP_DocEnd_BoxAlgorithm_ASRProcessor_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ASRProcessor_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_ASRProcessor_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/doc/Doc_BoxAlgorithm_ASRTrainer.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/doc/Doc_BoxAlgorithm_ASRTrainer.dox-part new file mode 100644 index 0000000..a0348b2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/doc/Doc_BoxAlgorithm_ASRTrainer.dox-part @@ -0,0 +1,78 @@ +/** + * \page BoxAlgorithm_ASRTrainer ASR Trainer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ASRTrainer_Description| + Artifact Subspace Reconstruction (ASR) Trainer (see \ref CASR::train). + * |OVP_DocEnd_BoxAlgorithm_ASRTrainer_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ASRTrainer_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ASRTrainer_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ASRTrainer_Input1| +Stimulation to start the training. + * |OVP_DocEnd_BoxAlgorithm_ASRTrainer_Input1| + + * |OVP_DocBegin_BoxAlgorithm_ASRTrainer_Input1| +The input signal. + * |OVP_DocEnd_BoxAlgorithm_ASRTrainer_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ASRTrainer_Outputs| + * |OVP_DocEnd_BoxAlgorithm_ASRTrainer_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_ASRTrainer_Output1| +Send \"OVTK_StimulationId_TrainCompleted\" when training is completed. + * |OVP_DocEnd_BoxAlgorithm_ASRTrainer_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ASRTrainer_Settings| + * |OVP_DocEnd_BoxAlgorithm_ASRTrainer_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ASRTrainer_Setting1| + ASR model Filename. + * |OVP_DocEnd_BoxAlgorithm_ASRTrainer_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_ASRTrainer_Setting2| + Stimulation that starts the training. + * |OVP_DocEnd_BoxAlgorithm_ASRTrainer_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_ASRTrainer_Setting3| + The Metric to use : Riemman or Euclidian. + * |OVP_DocEnd_BoxAlgorithm_ASRTrainer_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_ASRTrainer_Setting4| + The Channel ratio to reconstruct at maximum in [0;1] 0 for no reconstruction, 1 to allow reconstruction of all channels. + * |OVP_DocEnd_BoxAlgorithm_ASRTrainer_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_ASRTrainer_Setting5| + The Rejection Limit of ASR model. + * |OVP_DocEnd_BoxAlgorithm_ASRTrainer_Setting5| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ASRTrainer_Examples| + * |OVP_DocEnd_BoxAlgorithm_ASRTrainer_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ASRTrainer_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_ASRTrainer_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/doc/Doc_BoxAlgorithm_ArtifactAmplitude.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/doc/Doc_BoxAlgorithm_ArtifactAmplitude.dox-part new file mode 100644 index 0000000..b067bbd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/doc/Doc_BoxAlgorithm_ArtifactAmplitude.dox-part @@ -0,0 +1,58 @@ +/** + * \page BoxAlgorithm_ArtifactAmplitude Artifact Amplitude +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ArtifactAmplitude_Description| + Check if one element is higher than Max setting.\nThe signal is returned if no element exceeds the defined value. + * |OVP_DocEnd_BoxAlgorithm_ArtifactAmplitude_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ArtifactAmplitude_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ArtifactAmplitude_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ArtifactAmplitude_Input1| +The input signal on which the Artifact detection is used. + * |OVP_DocEnd_BoxAlgorithm_ArtifactAmplitude_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ArtifactAmplitude_Outputs| + * |OVP_DocEnd_BoxAlgorithm_ArtifactAmplitude_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_ArtifactAmplitude_Output1| +The input signal if there were no artifacts . + * |OVP_DocEnd_BoxAlgorithm_ArtifactAmplitude_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ArtifactAmplitude_Settings| + * |OVP_DocEnd_BoxAlgorithm_ArtifactAmplitude_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ArtifactAmplitude_Setting1| + The amplitude threshold. + * |OVP_DocEnd_BoxAlgorithm_ArtifactAmplitude_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ArtifactAmplitude_Examples| + * |OVP_DocEnd_BoxAlgorithm_ArtifactAmplitude_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ArtifactAmplitude_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_ArtifactAmplitude_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmASRProcessor.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmASRProcessor.cpp new file mode 100644 index 0000000..433c446 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmASRProcessor.cpp @@ -0,0 +1,101 @@ +#include "CBoxAlgorithmASRProcessor.hpp" + +//@todo put functions in this file in sdk it's duplication of file in riemann module +#include "utils/misc.hpp" // For conversion Openvibe to Eigen + +namespace OpenViBE { +namespace Plugins { +namespace Artifact { +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmASRProcessor::initialize() +{ + //***** Codecs ***** + m_SignalDecoder.initialize(*this, 0); + m_stimulationEncoder.initialize(*this, 0); + m_signalEncoder.initialize(*this, 1); + m_signalEncoder.getInputSamplingRate().setReferenceTarget(m_SignalDecoder.getOutputSamplingRate()); // Link Sampling + m_signalEncoder.getInputMatrix().setReferenceTarget(m_SignalDecoder.getOutputMatrix()); // Link Matrix + + //***** Pointers ***** + m_iMatrix = m_SignalDecoder.getOutputMatrix(); + m_oStimulation = m_stimulationEncoder.getInputStimulationSet(); + m_oMatrix = m_signalEncoder.getInputMatrix(); + + // Settings + m_filename = CString(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)).toASCIIString(); + + OV_ERROR_UNLESS_KRF(!m_filename.empty(), "Invalid empty model filename", Kernel::ErrorType::BadSetting); + OV_ERROR_UNLESS_KRF(m_asr.loadXML(m_filename), "Loading XML Error", Kernel::ErrorType::BadFileRead); + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmASRProcessor::uninitialize() +{ + m_SignalDecoder.uninitialize(); + m_stimulationEncoder.uninitialize(); + m_signalEncoder.uninitialize(); + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmASRProcessor::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmASRProcessor::process() +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + for (size_t i = 0; i < boxCtx.getInputChunkCount(0); ++i) + { + m_SignalDecoder.decode(i); // Decode the chunk + OV_ERROR_UNLESS_KRF(m_iMatrix->getDimensionCount() == 2, "Invalid Input Signal", Kernel::ErrorType::BadInput); + const uint64_t start = boxCtx.getInputChunkStartTime(0, i), // Time Code Chunk Start + end = boxCtx.getInputChunkEndTime(0, i); // Time Code Chunk End + + if (m_SignalDecoder.isHeaderReceived()) // Header received + { + m_signalEncoder.encodeHeader(); + m_stimulationEncoder.encodeHeader(); + boxCtx.markOutputAsReadyToSend(0, start, end); + } + if (m_SignalDecoder.isBufferReceived()) // Buffer received + { + const bool prevTrivial = m_asr.getTrivial(); + Eigen::MatrixXd in, out; + MatrixConvert(*m_iMatrix, in); + OV_ERROR_UNLESS_KRF(m_asr.process(in, out), "ASR Process Error", Kernel::ErrorType::BadProcessing); + MatrixConvert(out, *m_oMatrix); + m_signalEncoder.encodeBuffer(); + + const bool newTrivial = m_asr.getTrivial(); + if (!newTrivial && !prevTrivial) // We have reconstruct signal + { + m_oStimulation->appendStimulation(OVTK_StimulationId_Artifact, start, 0); + m_stimulationEncoder.encodeBuffer(); + boxCtx.markOutputAsReadyToSend(0, start, end); + } + } + if (m_SignalDecoder.isEndReceived()) // Buffer received + { + m_signalEncoder.encodeEnd(); + m_stimulationEncoder.encodeEnd(); + boxCtx.markOutputAsReadyToSend(0, start, end); + } + boxCtx.markOutputAsReadyToSend(1, start, end); + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +} // namespace Artifact +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmASRProcessor.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmASRProcessor.hpp new file mode 100644 index 0000000..a9f51ab --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmASRProcessor.hpp @@ -0,0 +1,88 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmASRProcessor.hpp +/// \brief Classes of the box ASR Processor. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 08/12/2020. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "defines.hpp" +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Artifact { +//------------------------------------------------------------------------------------------------- +/// The class CBoxAlgorithmASRProcessor describes the box Artifact Subspace Reconstruction (ASR) Processor. +class CBoxAlgorithmASRProcessor final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, ClassId_Box_ASR_Processor) + +protected: + //***** Codecs ***** + Toolkit::TSignalDecoder m_SignalDecoder; ///< Input Signal Decoder + Toolkit::TStimulationEncoder m_stimulationEncoder; ///< Output Stimulation Encoder + Toolkit::TSignalEncoder m_signalEncoder; ///< Output Signal Encoder + + //***** Pointers ***** + CMatrix *m_iMatrix = nullptr, ///< Input Matrix Pointer + *m_oMatrix = nullptr; ///< Output Matrix Pointer + IStimulationSet* m_oStimulation = nullptr; ///< Output Stimulation Pointer + + //***** ASR ***** + std::string m_filename; ///< ASR Model Path + Geometry::CASR m_asr; ///< ASR Model +}; + +//------------------------------------------------------------------------------------------------- +/// Descriptor of the box Artifact Subspace Reconstruction (ASR) Processor. +class CBoxAlgorithmASRProcessorDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return "ASR Processor"; } + CString getAuthorName() const override { return "Thibaut Monseigne"; } + CString getAuthorCompanyName() const override { return "Inria"; } + CString getShortDescription() const override { return "Artifact Subspace Reconstruction (ASR) Processor."; } + CString getDetailedDescription() const override { return "Artifact Subspace Reconstruction (ASR) Processor."; } + CString getCategory() const override { return "Artifact"; } + CString getVersion() const override { return "0.1"; } + CString getStockItemName() const override { return "gtk-execute"; } + + CIdentifier getCreatedClass() const override { return ClassId_Box_ASR_Processor; } + IPluginObject* create() override { return new CBoxAlgorithmASRProcessor; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input Signal", OV_TypeId_Signal); + + prototype.addOutput("Signal Reconstructed",OV_TypeId_Stimulations); + prototype.addOutput("Output Signal", OV_TypeId_Signal); + + prototype.addSetting("Filename to load model", OV_TypeId_Filename, "${Player_ScenarioDirectory}/ASR-model.xml"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, ClassId_Box_ASR_Processor_Desc) +}; +} // namespace Artifact +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmASRTrainer.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmASRTrainer.cpp new file mode 100644 index 0000000..04864d0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmASRTrainer.cpp @@ -0,0 +1,182 @@ +#include "CBoxAlgorithmASRTrainer.hpp" + +//@todo put functions in this file in sdk it's duplication of file in riemann module +#include "utils/misc.hpp" // For conversion Openvibe to Eigen + +namespace OpenViBE { +namespace Plugins { +namespace Artifact { +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmASRTrainer::initialize() +{ + // Stimulations + m_stimulationDecoder.initialize(*this, 0); + m_iStimulation = m_stimulationDecoder.getOutputStimulationSet(); + + m_stimulationEncoder.initialize(*this, 0); + m_oStimulation = m_stimulationEncoder.getInputStimulationSet(); + + // Classes + m_signalEncoder.initialize(*this, 1); + m_iMatrix = m_signalEncoder.getOutputMatrix(); + + // Settings + m_filename = CString(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)).toASCIIString(); + m_stimulationName = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_metric = Geometry::EMetric(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2))); + m_ratio = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + m_rejection = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + + OV_ERROR_UNLESS_KRF(!m_filename.empty(), "Invalid empty model filename", Kernel::ErrorType::BadSetting); + OV_ERROR_UNLESS_KRF(Geometry::InRange(m_ratio, 0, 1), "Channel ratio must be in [0;1], actual : " + std::to_string(m_ratio), Kernel::ErrorType::BadSetting); + OV_ERROR_UNLESS_KRF(m_rejection >= 0, "Rejection limit must be positive, actual : " + std::to_string(m_rejection), Kernel::ErrorType::BadSetting); + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmASRTrainer::uninitialize() +{ + m_stimulationDecoder.uninitialize(); + m_signalEncoder.uninitialize(); + m_stimulationEncoder.uninitialize(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmASRTrainer::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmASRTrainer::process() +{ + if (!m_isTrain) + { + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + //***** Stimulations ***** + for (size_t i = 0; i < boxCtx.getInputChunkCount(0); ++i) + { + m_stimulationDecoder.decode(i); // Decode the chunk + const uint64_t start = boxCtx.getInputChunkStartTime(0, i), // Time Code Chunk Start + end = boxCtx.getInputChunkEndTime(0, i); // Time Code Chunk End + + if (m_stimulationDecoder.isHeaderReceived()) + { + m_stimulationEncoder.encodeHeader(); + boxCtx.markOutputAsReadyToSend(0, 0, 0); + } + if (m_stimulationDecoder.isBufferReceived()) // Buffer received + { + for (size_t j = 0; j < m_iStimulation->getStimulationCount(); ++j) + { + if (m_iStimulation->getStimulationIdentifier(j) == m_stimulationName) + { + OV_ERROR_UNLESS_KRF(train(), "Train or Save failed", Kernel::ErrorType::BadProcessing); + m_oStimulation->appendStimulation(OVTK_StimulationId_TrainCompleted, m_iStimulation->getStimulationDate(j), 0); + m_isTrain = true; + } + } + m_stimulationEncoder.encodeBuffer(); + boxCtx.markOutputAsReadyToSend(0, start, end); + } + if (m_stimulationDecoder.isEndReceived()) + { + m_stimulationEncoder.encodeEnd(); + boxCtx.markOutputAsReadyToSend(0, start, end); + } + } + + //***** Signal ***** + for (size_t i = 0; i < boxCtx.getInputChunkCount(1); ++i) + { + m_signalEncoder.decode(i); // Decode the chunk + OV_ERROR_UNLESS_KRF(m_iMatrix->getDimensionCount() == 2, "Invalid Input Signal", Kernel::ErrorType::BadInput); + + if (m_signalEncoder.isBufferReceived()) // Buffer received + { + Eigen::MatrixXd m; + MatrixConvert(*m_iMatrix, m); + m_dataset.push_back(m); + } + } + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmASRTrainer::train() +{ + Geometry::CASR asr(m_metric); + asr.setMaxChannel(m_ratio); + this->getLogManager() << Kernel::LogLevel_Info << "Train Beginning...\n"; + OV_ERROR_UNLESS_KRF(asr.train(m_dataset, m_rejection), "Train failed", Kernel::ErrorType::BadProcessing); + getLogManager() << Kernel::LogLevel_Info << "Train Finished. Save Beginning...\n"; + OV_ERROR_UNLESS_KRF(asr.saveXML(m_filename), "Save failed", Kernel::ErrorType::BadProcessing); + this->getLogManager() << Kernel::LogLevel_Info << "Save Finished.\n"; + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmASRTrainerListener::onSettingValueChanged(Kernel::IBox& box, const size_t index) +{ + if (index == 2) + { + CString tmp; + box.getSettingValue(index, tmp); + const Geometry::EMetric m = Geometry::StringToMetric(tmp.toASCIIString()); + if (m != Geometry::EMetric::Euclidian && m != Geometry::EMetric::Riemann) + { + const std::string s1 = toString(Geometry::EMetric::Euclidian), s2 = toString(Geometry::EMetric::Riemann); + getLogManager() << Kernel::LogLevel_Warning << "Metric must be " << s1 << " or " << s2 << ". Setting is set to " << s1 << "\n"; + box.setSettingValue(index, s1.c_str()); + } + } + else if (index == 3) + { + CString tmp; + box.getSettingValue(index, tmp); + + double ratio = 0.0; + std::stringstream ss(tmp.toASCIIString()); + ss >> ratio; + if (ratio < 0.0) + { + getLogManager() << Kernel::LogLevel_Warning << + "Channel ratio must be in [0;1] (0 for no reconstruction, 1 for no limit). Setting is set to 0. \n"; + box.setSettingValue(index, "0"); + } + else if (ratio > 1.0) + { + getLogManager() << Kernel::LogLevel_Warning << + "Channel ratio must be in [0;1] (0 for no reconstruction, 1 for no limit). Setting is set to 1. \n"; + box.setSettingValue(index, "1"); + } + } + else if (index == 4) + { + CString tmp; + box.getSettingValue(index, tmp); + + double rejection = 0.0; + std::stringstream ss(tmp.toASCIIString()); + ss >> rejection; + if (rejection < 0.0) + { + getLogManager() << Kernel::LogLevel_Warning << "Rejection limit must be positive. Setting is set to 0. \n"; + box.setSettingValue(index, "0"); + } + } + return true; +} +//--------------------------------------------------------------------------------------------------- +} // namespace Artifact +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmASRTrainer.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmASRTrainer.hpp new file mode 100644 index 0000000..e7c8d0c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmASRTrainer.hpp @@ -0,0 +1,117 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmASRProcessor.hpp +/// \brief Classes of the box ASR Processor. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 08/12/2020. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "defines.hpp" +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Artifact { + +//------------------------------------------------------------------------------------------------- +/// The class CBoxAlgorithmASRTrainer describes the box Artifact Subspace Reconstruction (ASR) Trainer. +class CBoxAlgorithmASRTrainer final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, ClassId_Box_ASR_Trainer) + +protected: + //***** Codecs ***** + Toolkit::TStimulationDecoder m_stimulationDecoder; ///< Input Stimulation Decoder + Toolkit::TSignalDecoder m_signalEncoder; ///< Input Signal Encoder + Toolkit::TStimulationEncoder m_stimulationEncoder; ///< Output Stimulation Encoder + + //***** Pointers ***** + CMatrix* m_iMatrix = nullptr; ///< Input Matrix pointer + IStimulationSet *m_iStimulation = nullptr, ///< Stimulation receiver + *m_oStimulation = nullptr; ///< Stimulation sender + + //***** Settings ***** + std::string m_filename; ///< Filename of ASR Model + uint64_t m_stimulationName = OVTK_StimulationId_Train; ///< Name of stimulation to check for train launch + Geometry::EMetric m_metric = Geometry::EMetric::Euclidian; ///< Metric for ASR + double m_ratio = 1.0; ///< Ratio of channel to reconstruct for ASR + double m_rejection = 5.0; ///< Rejection limit of threshold for ASR + + //***** Misc ***** + std::vector m_dataset; ///< Dataset stack + bool m_isTrain = false; ///< True if train is already done, False otherwise + + bool train(); +}; + +//------------------------------------------------------------------------------------------------- +/// Listener of the box Artifact Subspace Reconstruction (ASR) Trainer. +class CBoxAlgorithmASRTrainerListener final : public Toolkit::TBoxListener +{ +public: + bool onSettingValueChanged(Kernel::IBox& box, const size_t index) override;; + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, OV_UndefinedIdentifier) +}; + +//------------------------------------------------------------------------------------------------- +/// Descriptor of the box Artifact Subspace Reconstruction (ASR) Trainer. +class CBoxAlgorithmASRTrainerDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return "ASR Trainer"; } + CString getAuthorName() const override { return "Thibaut Monseigne"; } + CString getAuthorCompanyName() const override { return "Inria"; } + CString getShortDescription() const override { return "Artifact Subspace Reconstruction (ASR) Trainer."; } + CString getDetailedDescription() const override { return "Artifact Subspace Reconstruction (ASR) Trainer."; } + CString getCategory() const override { return "Artifact"; } + CString getVersion() const override { return "0.1"; } + CString getStockItemName() const override { return "gtk-execute"; } + + CIdentifier getCreatedClass() const override { return ClassId_Box_ASR_Trainer; } + IPluginObject* create() override { return new CBoxAlgorithmASRTrainer; } + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmASRTrainerListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Stimulations",OV_TypeId_Stimulations); + prototype.addInput("Input Signal", OV_TypeId_Signal); + + prototype.addOutput("Train-completed Flag",OV_TypeId_Stimulations); + + prototype.addSetting("Filename to save model", OV_TypeId_Filename, "${Player_ScenarioDirectory}/ASR-model.xml"); + prototype.addSetting("Train trigger", OV_TypeId_Stimulation, "OVTK_StimulationId_Train"); + prototype.addSetting("Metric", TypeId_Metric, toString(Geometry::EMetric::Euclidian).c_str()); + prototype.addSetting("Channel ratio to reconstruct", OV_TypeId_Float, "1"); + prototype.addSetting("Rejection limit", OV_TypeId_Float, "5"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, ClassId_Box_ASR_Trainer_Desc) +}; + +} // namespace Artifact +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmArtifactAmplitude.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmArtifactAmplitude.cpp new file mode 100644 index 0000000..6190b7a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmArtifactAmplitude.cpp @@ -0,0 +1,92 @@ +#include "CBoxAlgorithmArtifactAmplitude.hpp" +#include // Floor +#include + +namespace OpenViBE { +namespace Plugins { +namespace Artifact { +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmArtifactAmplitude::initialize() +{ + //***** Codecs ***** + m_decoder.initialize(*this, 0); + m_iMatrix = m_decoder.getOutputMatrix(); + + //***** Settings ***** + m_max = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + //***** Assert ***** + OV_ERROR_UNLESS_KRF(m_max > 0, "Invalid Maximum [" << m_max << "] (expected value > 0)\n", Kernel::ErrorType::BadSetting); + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmArtifactAmplitude::uninitialize() +{ + m_decoder.uninitialize(); + std::stringstream ss; + ss << m_nArtifact << " artifacts detected in " << m_nSamples << " samples ("; + ss.precision(2); + ss << std::fixed << 100.0 * double(m_nArtifact) / double(m_nSamples) << "%)" << std::endl; + this->getLogManager() << Kernel::LogLevel_Info << ss.str(); + return true; +} +//--------------------------------------------------------------------------------------------------- + + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmArtifactAmplitude::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmArtifactAmplitude::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + bool artifact = false; + m_decoder.decode(i); // Decode chunk + OV_ERROR_UNLESS_KRF(m_iMatrix->getDimensionCount() == 2, "Invalid Input Signal", Kernel::ErrorType::BadInput); + m_nSamples++; + //if (m_decoder.isHeaderReceived()) {} // Header + if (m_decoder.isBufferReceived()) // Buffer + { + const size_t size = m_iMatrix->getDimensionSize(0) * m_iMatrix->getDimensionSize(1); // get buffer size + const double* iBuffer = m_iMatrix->getBuffer(); // input buffer + for (size_t idx = 0; idx < size; ++idx) + { + if (abs(iBuffer[idx]) >= m_max) // Amplitude comparison + { + this->getLogManager() << Kernel::LogLevel_Trace << "Artifact detected in channel (" << floor(idx / m_iMatrix->getDimensionSize(1)) << ")\n"; + artifact = true; + m_nArtifact++; + break; + } + } + } + //if (m_decoder.isEndReceived()) {} // End + // We don't need output codec we copy just the input to the output if there is no amplitude artifact + if (!artifact) + { + uint64_t tStart = 0, tEnd = 0; + size_t size = 0; + const uint8_t* buffer = nullptr; + boxContext.getInputChunk(0, i, tStart, tEnd, size, buffer); + boxContext.appendOutputChunkData(0, buffer, size); + boxContext.markOutputAsReadyToSend(0, tStart, tEnd); + boxContext.markInputAsDeprecated(0, i); + } + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +} // namespace Artifact +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmArtifactAmplitude.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmArtifactAmplitude.hpp new file mode 100644 index 0000000..69233d2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/boxes/CBoxAlgorithmArtifactAmplitude.hpp @@ -0,0 +1,82 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmArtifactAmplitude.hpp +/// \brief Classes of the box Artifact Amplitude. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 12/08/2019. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- +#pragma once + +#include "defines.hpp" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Artifact { +//------------------------------------------------------------------------------------------------- +/// The class CBoxAlgorithmArtifactAmplitude describes the box Artifact Amplitude. +class CBoxAlgorithmArtifactAmplitude final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, ClassId_Box_Artifact_Amplitude) + +protected: + + Toolkit::TSignalDecoder m_decoder; ///< Input Signal decoder + CMatrix* m_iMatrix = nullptr; ///< Input Matrix pointer + + double m_max = 0; ///< Amplitude max + size_t m_nSamples = 0, ///< Sample checked + m_nArtifact = 0; ///< Artifact found +}; + +//------------------------------------------------------------------------------------------------- +/// Descriptor of the box Artifact Detector. +class CBoxAlgorithmArtifactAmplitudeDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return "Artifact Amplitude"; } + CString getAuthorName() const override { return "Thibaut Monseigne"; } + CString getAuthorCompanyName() const override { return "Inria"; } + CString getShortDescription() const override { return "Simple Artifact Detection"; } + + CString getDetailedDescription() const override + { + return "Check if one element is higher than Max setting.\nThe signal is returned if no element exceeds the defined value."; + } + + CString getCategory() const override { return "Artifact"; } + CString getVersion() const override { return "1.0"; } + CString getStockItemName() const override { return "gtk-no"; } + + CIdentifier getCreatedClass() const override { return ClassId_Box_Artifact_Amplitude; } + IPluginObject* create() override { return new CBoxAlgorithmArtifactAmplitude; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Signal",OV_TypeId_Signal); + prototype.addOutput("Non-artifact signal",OV_TypeId_Signal); + prototype.addSetting("Max (mV)",OV_TypeId_Float, "100"); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, ClassId_Box_Artifact_Amplitude_Desc) +}; +} // namespace Artifact +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/defines.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/defines.hpp new file mode 100644 index 0000000..08e21df --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/defines.hpp @@ -0,0 +1,25 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file defines.hpp +/// \brief Defines list for Setting, Shortcut Macro and const. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 08/12/2020. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define ClassId_Box_Artifact_Amplitude OpenViBE::CIdentifier(0x41727469, 0xb68095e4) +#define ClassId_Box_Artifact_Amplitude_Desc OpenViBE::CIdentifier(0x41727469, 0x83596875) +#define ClassId_Box_ASR_Processor OpenViBE::CIdentifier(0x41727469, 0x17f1c6e2) +#define ClassId_Box_ASR_Processor_Desc OpenViBE::CIdentifier(0x41727469, 0x1de22c87) +#define ClassId_Box_ASR_Trainer OpenViBE::CIdentifier(0x41727469, 0xc05f38ff) +#define ClassId_Box_ASR_Trainer_Desc OpenViBE::CIdentifier(0x41727469, 0x966737cb) + +#ifndef TypeId_Metric +#define TypeId_Metric OpenViBE::CIdentifier(0x5261636B, 0x4D455452) +#endif diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/main.cpp new file mode 100644 index 0000000..4a03c6b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/main.cpp @@ -0,0 +1,37 @@ +#include +#include "defines.hpp" + +// Boxes Includes +#include "boxes/CBoxAlgorithmArtifactAmplitude.hpp" +#include "boxes/CBoxAlgorithmASRTrainer.hpp" +#include "boxes/CBoxAlgorithmASRProcessor.hpp" + +namespace OpenViBE { +namespace Plugins { +namespace Artifact { + +template +static void setEnumeration(const Kernel::IPluginModuleContext& context, const CIdentifier& typeID, const std::string& name, const std::vector& enumeration) +{ + context.getTypeManager().registerEnumerationType(typeID, name.c_str()); + for (const auto& e : enumeration) { context.getTypeManager().registerEnumerationEntry(typeID, toString(e).c_str(), size_t(e)); } +} + +OVP_Declare_Begin() + // Register boxes + OVP_Declare_New(CBoxAlgorithmArtifactAmplitudeDesc); + OVP_Declare_New(CBoxAlgorithmASRTrainerDesc); + OVP_Declare_New(CBoxAlgorithmASRProcessorDesc); + + // Enumeration Metric + const std::vector metrics = { + Geometry::EMetric::Riemann, Geometry::EMetric::Euclidian, Geometry::EMetric::LogEuclidian, Geometry::EMetric::LogDet, + Geometry::EMetric::Kullback, Geometry::EMetric::Harmonic, Geometry::EMetric::Identity + }; + setEnumeration(context, TypeId_Metric, "Metric", metrics); + +OVP_Declare_End() + +} // namespace Artifact +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/utils/misc.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/utils/misc.cpp new file mode 100644 index 0000000..ca9b239 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/utils/misc.cpp @@ -0,0 +1,120 @@ +#include "utils/misc.hpp" + +//***************************************************** +//******************** CONVERSIONS ******************** +//***************************************************** +//--------------------------------------------------------------------------------------------------- +bool MatrixConvert(const OpenViBE::CMatrix& in, Eigen::MatrixXd& out) +{ + if (in.getDimensionCount() != 2) { return false; } + out.resize(in.getDimensionSize(0), in.getDimensionSize(1)); + + // double loop to avoid the problem of row major and column major storage + size_t idx = 0; + const double* buffer = in.getBuffer(); + for (size_t i = 0, nR = out.rows(); i < nR; ++i) { for (size_t j = 0, nC = out.cols(); j < nC; ++j) { out(i, j) = buffer[idx++]; } } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MatrixConvert(const Eigen::MatrixXd& in, OpenViBE::CMatrix& out) +{ + if (in.rows() == 0 || in.cols() == 0) { return false; } + const size_t nR = in.rows(), nC = in.cols(); + MatrixResize(out, nR, nC); + + // double loop to avoid the problem of row major and column major storage + size_t idx = 0; + double* buffer = out.getBuffer(); + for (size_t i = 0; i < nR; ++i) { for (size_t j = 0; j < nC; ++j) { buffer[idx++] = in(i, j); } } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MatrixConvert(const Eigen::RowVectorXd& in, OpenViBE::CMatrix& out) +{ + if (in.size() == 0) { return false; } + VectorResize(out, in.size()); + //one row system copy doesn't cause problem + memcpy(out.getBuffer(), in.data(), out.getBufferElementCount() * sizeof(double)); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MatrixConvert(const OpenViBE::CMatrix& in, Eigen::RowVectorXd& out) +{ + if (in.getDimensionCount() != 1) { return false; } + out.resize(in.getDimensionSize(0)); + //one row system copy doesn't cause problem + memcpy(out.data(), in.getBuffer(), in.getBufferElementCount() * sizeof(double)); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MatrixConvert(const std::vector& in, OpenViBE::CMatrix& out) +{ + if (in.empty()) { return false; } + VectorResize(out, in.size()); + //one row system copy doesn't cause problem + memcpy(out.getBuffer(), in.data(), out.getBufferElementCount() * sizeof(double)); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//*********************************************************** +//******************** MATRIX MANAGEMENT ******************** +//*********************************************************** +//--------------------------------------------------------------------------------------------------- +bool MatrixInit(OpenViBE::CMatrix& m, const size_t rows, size_t columns) +{ + if (columns < 1) { columns = rows; } + MatrixResize(m, rows, columns); + m.resetBuffer(); // Set to 0 + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MatrixResize(OpenViBE::CMatrix& m, const size_t rows, size_t columns) +{ + if (columns < 1) { columns = rows; } + if (m.getDimensionCount() != 2 || m.getDimensionSize(0) != rows || m.getDimensionSize(1) != columns) + { + m.setDimensionCount(2); + m.setDimensionSize(0, rows); + m.setDimensionSize(1, columns); + + // CHange label to have 1 to N label on row and column (Square Matrix Feature) + for (size_t i = 0; i < rows; ++i) { m.setDimensionLabel(0, i, std::to_string(i + 1).c_str()); } + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//*********************************************************** +//******************** VECTOR MANAGEMENT ******************** +//*********************************************************** +//--------------------------------------------------------------------------------------------------- +bool VectorInit(OpenViBE::CMatrix& m, const size_t n) +{ + VectorResize(m, n); + m.resetBuffer(); // Set to 0 + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool VectorResize(OpenViBE::CMatrix& m, const size_t n) +{ + if (m.getDimensionCount() != 1 || m.getDimensionSize(0) != n) + { + m.setDimensionCount(1); + m.setDimensionSize(0, n); + } + return true; +} +//--------------------------------------------------------------------------------------------------- diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/utils/misc.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/utils/misc.hpp new file mode 100644 index 0000000..89b5213 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/src/utils/misc.hpp @@ -0,0 +1,71 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file misc.hpp +/// \brief All functions to Convert OpenViBE::CMatrix and Eigen::MatrixXd, links to Eigen function, manipulate OpenVibe::CMatrix and more. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 26/10/2018. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include +#include + +//***************************************************** +//******************** Conversions ******************** +//***************************************************** +/// Convert OpenViBE Matrix to Eigen Matrix. +/// The Eigen Matrix. +/// The OpenVibe Matrix. +bool MatrixConvert(const OpenViBE::CMatrix& in, Eigen::MatrixXd& out); + +/// Convert Eigen Matrix to OpenViBE Matrix (It doesn't use Memory::copy because of Eigne store in column major by default). +/// The Eigen Matrix. +/// The OpenVibe Matrix. +bool MatrixConvert(const Eigen::MatrixXd& in, OpenViBE::CMatrix& out); + +/// Convert Eigen Row Vector to OpenViBE Matrix with one dimension. +/// The Eigen Row Vector. +/// The OpenVibe Matrix. +bool MatrixConvert(const Eigen::RowVectorXd& in, OpenViBE::CMatrix& out); + +/// Convert OpenViBE Matrix with one dimension to Eigen Row Vector. +/// The OpenVibe Matrix. +/// The Eigen Row Vector. +bool MatrixConvert(const OpenViBE::CMatrix& in, Eigen::RowVectorXd& out); + +/// Convertvector double to OpenViBE Matrix with one dimension. +/// The Vector of double. +/// The OpenVibe Matrix. +bool MatrixConvert(const std::vector& in, OpenViBE::CMatrix& out); + +//*********************************************************** +//******************** Matrix Management ******************** +//*********************************************************** +/// Initialize the matrix (do not create objects). +/// The matrix to initialize. +/// The number of rows. +/// The number of columns (if < 1 Init to a Square Matrix) . +bool MatrixInit(OpenViBE::CMatrix& m, size_t rows = 2, size_t columns = 0); + +/// Resize the matrix (do not create objects). +/// The matrix to resize. +/// The number of rows. +/// The number of columns (if < 1 resize to a Square Matrix) . +bool MatrixResize(OpenViBE::CMatrix& m, size_t rows = 2, size_t columns = 0); + +//*********************************************************** +//******************** Vector Management ******************** +//*********************************************************** +/// Initialize the vector (matrix with one dimension) (do not create objects). +/// The vector to initialize. +/// The number of elements. +bool VectorInit(OpenViBE::CMatrix& m, size_t n = 2); + +/// Resize the vector (matrix with one dimension) (do not create objects). +/// The vector to resize. +/// The number of elements. +bool VectorResize(OpenViBE::CMatrix& m, size_t n = 2); diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/DartTestfile.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/DartTestfile.txt new file mode 100644 index 0000000..d68e0eb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/DartTestfile.txt @@ -0,0 +1,42 @@ +IF(WIN32) + SET(EXT cmd) + SET(OS_FLAGS "--no-pause") +ELSE() + SET(EXT sh) + SET(OS_FLAGS "") +ENDIF() + +SET(PATH_TEST scenarios-tests) + +############ +SET(TEST_NAME Artifact-Amplitude) + +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${PATH_TEST}/${TEST_NAME}-output.csv") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" "${PATH_TEST}/${TEST_NAME}-test.xml") +ADD_TEST(compare_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "${PATH_TEST}/${TEST_NAME}-output.csv" "${PATH_TEST}/${TEST_NAME}-ref.csv" 0.0001) + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_CONFIG_SUBDIR}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL "${PATH_TEST}/${TEST_NAME}-output.csv") +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) + +############ +SET(TEST_NAME ASR-Trainer) + +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${PATH_TEST}/ASR-model-output.xml") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" "${PATH_TEST}/${TEST_NAME}-test.xml") +# No compare between xml + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_CONFIG_SUBDIR}) +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) + +############ +SET(TEST_NAME ASR-Processor) +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${PATH_TEST}/${TEST_NAME}-output.csv") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" "${PATH_TEST}/${TEST_NAME}-test.xml") +ADD_TEST(compare_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "${PATH_TEST}/${TEST_NAME}-output.csv" "${PATH_TEST}/${TEST_NAME}-ref.csv" 0.0001) + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_CONFIG_SUBDIR}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL "${PATH_TEST}/${TEST_NAME}-output.csv") +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/ASR-Processor-ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/ASR-Processor-ref.csv new file mode 100644 index 0000000..b075650 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/ASR-Processor-ref.csv @@ -0,0 +1,15361 @@ +Time:512Hz,Epoch,C3,C4,FC3,FC4,Event Id,Event Date,Event Duration +0.0000000000,0,-0.0000000000,-0.0000000000,-0.0000000000,-0.0000000000,,, +0.0019531250,0,0.0035121105,0.0001638448,0.0023179993,0.0001326109,,, +0.0039062500,0,0.0276486118,0.0031525453,0.0172372787,0.0025162167,,, +0.0058593750,0,0.1008310668,0.0162038232,0.0574323405,0.0124589095,,, +0.0078125000,0,0.2251822424,0.0396008135,0.1090077816,0.0280526676,,, +0.0097656250,0,0.3354814774,0.0447121157,0.1086231823,0.0222552727,,, +0.0117187500,0,0.3105593810,-0.0281486892,-0.0368737161,-0.0570384291,,, +0.0136718750,0,0.0271246634,-0.2438982070,-0.4073168362,-0.2641419519,,, +0.0156250000,0,-0.5958235967,-0.6433203507,-1.0437565599,-0.6311338784,,, +0.0175781250,0,-1.5765070734,-1.2264573996,-1.9428362331,-1.1541257777,,, +0.0195312500,0,-2.8620837819,-1.9488876956,-3.0533775269,-1.7896892336,,, +0.0214843750,0,-4.3321440070,-2.7272725208,-4.2759231234,-2.4592104648,,, +0.0234375000,0,-5.8155406105,-3.4531261133,-5.4732165807,-3.0612259753,,, +0.0253906250,0,-7.1142697202,-4.0139139416,-6.4889164122,-3.4911764678,,, +0.0273437500,0,-8.0272933317,-4.3110847452,-7.1671345034,-3.6591788043,,, +0.0292968750,0,-8.3732443864,-4.2676860745,-7.3704241841,-3.4989116979,,, +0.0312500000,0,-8.0152781345,-3.8342471553,-6.9978834219,-2.9748760871,,, +0.0332031250,0,-6.8838226984,-2.9964458841,-6.0003254839,-2.0899969471,,, +0.0351562500,0,-4.9873251361,-1.7771625870,-4.3859758316,-0.8852312040,,, +0.0371093750,0,-2.4099099878,-0.2349802317,-2.2171694606,0.5663331690,,, +0.0390625000,0,0.6991452634,1.5376454162,0.3969911410,2.1643383932,,, +0.0410156250,0,4.1426390241,3.4241947472,3.3115663582,3.7905793509,,, +0.0429687500,0,7.6979581467,5.3012164362,6.3613129102,5.3253432827,,, +0.0449218750,0,11.1414520037,7.0506512787,9.3794734301,6.6607178301,,, +0.0468750000,0,14.2700294016,8.5663146802,12.2152119253,7.7074194620,,, +0.0488281250,0,16.9098553168,9.7600104259,14.7370228847,8.3996724848,,, +0.0507812500,0,18.9096087849,10.5631945765,16.8191495836,8.6965773930,,, +0.0527343750,0,20.1377931850,10.9246097711,18.3341238317,8.5799981154,,, +0.0546875000,0,20.4921696367,10.8108821910,19.1618661916,8.0525799753,,, +0.0566406250,0,19.9023386712,10.2060517124,19.1981999684,7.1323552752,,, +0.0585937500,0,18.3281612611,9.1059034972,18.3635121654,5.8443811520,,, +0.0605468750,0,15.7752496446,7.5157427790,16.6233868861,4.2197326416,,, +0.0625000000,0,12.3174871636,5.4593790482,14.0079997133,2.3049083804,,, +0.0644531250,0,8.1044094447,2.9944084767,10.6158257046,0.1724410713,,, +0.0664062500,0,3.3524366926,0.2207021322,6.6059230241,-2.0770072008,,, +0.0683593750,0,-1.6740611795,-2.7237264257,2.1834500982,-4.3214535857,,, +0.0703125000,0,-6.6892963485,-5.6742608255,-2.4203670829,-6.4281572734,,, +0.0722656250,0,-11.4145739596,-8.4545263864,-6.9687916647,-8.2659600339,,, +0.0742187500,0,-15.6008703522,-10.8924966812,-11.2363051303,-9.7173889415,,, +0.0761718750,0,-19.0439144386,-12.8350688708,-15.0223295970,-10.6882362856,,, +0.0781250000,0,-21.5957702103,-14.1612506658,-18.1633189835,-11.1162750305,,, +0.0800781250,0,-23.1710654248,-14.7928028849,-20.5400904961,-10.9775476646,,, +0.0820312500,0,-23.7432107932,-14.6985991969,-22.0776406276,-10.2858151783,,, +0.0839843750,0,-23.3355507796,-13.8943860155,-22.7415621856,-9.0887732058,,, +0.0859375000,0,-22.0146870447,-12.4408765599,-22.5355722715,-7.4654699995,,, +0.0878906250,0,-19.8814580130,-10.4334596866,-21.4961065187,-5.5164422205,,, +0.0898437500,0,-17.0485364296,-7.9747702527,-19.6753437461,-3.3368112803,,, +0.0917968750,0,-13.6082132645,-5.1448007741,-17.1165705247,-0.9879335254,,, +0.0937500000,0,-9.6282340276,-2.0092338144,-13.8572771671,1.4933317685,,, +0.0957031250,0,-5.2117528572,1.3243925590,-9.9887603073,4.0389598365,,, +0.0976562500,0,-0.5771307281,4.6587220730,-5.7218524765,6.5006970978,,, +0.0996093750,0,3.9327453053,7.7188457675,-1.3807676524,8.6586879715,,, +0.1015625000,0,7.9259111757,10.2122595405,2.6694695090,10.2769051416,,, +0.1035156250,0,11.0565603509,11.8932723393,6.1011404206,11.1620422796,,, +0.1054687500,0,13.0872092818,12.6047775667,8.6737784639,11.1987383701,,, +0.1074218750,0,13.9121125116,12.2958958427,10.2559525693,10.3616726088,,, +0.1093750000,0,13.5563301886,11.0237747621,10.8276299966,8.7146516185,,, +0.1113281250,0,12.1594675288,8.9406349785,10.4688586645,6.3988847984,,, +0.1132812500,0,9.9483928365,6.2671103077,9.3386722115,3.6120733803,,, +0.1152343750,0,7.2056545062,3.2618851852,7.6498865938,0.5861810189,,, +0.1171875000,0,4.2387594862,0.1947523823,5.6440956094,-2.4329946353,,, +0.1191406250,0,1.3504050495,-2.6784365553,3.5667341910,-5.2077697370,,, +0.1210937500,0,-1.1892047808,-5.1380772752,1.6426113482,-7.5304505358,,, +0.1230468750,0,-3.1642889382,-7.0161626623,0.0557092105,-9.2402369281,,, +0.1250000000,0,-4.4285890629,-8.2055157913,-1.0642665883,-10.2352762739,,, +0.1269531250,0,-4.9128958169,-8.6641756696,-1.6476540343,-10.4796093449,,, +0.1289062500,0,-4.6236128027,-8.4113443800,-1.6821735814,-10.0004279711,,, +0.1308593750,0,-3.6349381844,-7.5161300981,-1.2046105579,-8.8767731130,,, +0.1328125000,0,-2.0772315265,-6.0867127864,-0.2907738956,-7.2274246065,,, +0.1347656250,0,-0.1204923420,-4.2579755431,0.9557338422,-5.1976831137,,, +0.1367187500,0,2.0469599499,-2.1679672072,2.4166907918,-2.9373269195,,, +0.1386718750,0,4.2431916317,0.0677076768,3.9752815371,-0.5762241563,,, +0.1406250000,0,6.3138830122,2.3550661773,5.5293314240,1.7787840005,,, +0.1425781250,0,8.1341072166,4.5874876522,6.9868869021,4.0186636359,,, +0.1445312500,0,9.5892813860,6.6125423928,8.2462271875,6.0071555668,,, +0.1464843750,0,10.5606620652,8.2364704421,9.1868413029,7.5848060144,,, +0.1484375000,0,10.9367232644,9.2658475233,9.6869987345,8.5998303993,,, +0.1503906250,0,10.6431988046,9.5595158400,9.6560583043,8.9465433385,,, +0.1523437500,0,9.6664056965,9.0644948292,9.0586215646,8.5930356607,,, +0.1542968750,0,8.0563926925,7.8258299204,7.9188351527,7.5885343213,,, +0.1562500000,0,5.9187508862,5.9764739108,6.3115833884,6.0533238149,,, +0.1582031250,0,3.4037044735,3.7151513694,4.3501517740,4.1579549144,,, +0.1601562500,0,0.6932125516,1.2781141260,2.1737233503,2.0985907467,,, +0.1621093750,0,-2.0130295288,-1.0879708985,-0.0647559849,0.0755299001,,, +0.1640625000,0,-4.5143639096,-3.1517301513,-2.2119345377,-1.7258542145,,, +0.1660156250,0,-6.6292880970,-4.7258424954,-4.1283649321,-3.1556389161,,, +0.1679687500,0,-8.2134011269,-5.6916210155,-5.6996537939,-4.1155123919,,, +0.1699218750,0,-9.1709113171,-6.0065850401,-6.8415967602,-4.5620083864,,, +0.1718750000,0,-9.4608387543,-5.6964079861,-7.5012561109,-4.4993900120,,, +0.1738281250,0,-9.0993086735,-4.8407655701,-7.6582383063,-3.9702212351,,, +0.1757812500,0,-8.1560089920,-3.5563897592,-7.3265237381,-3.0456740617,,, +0.1777343750,0,-6.7441064628,-1.9795154155,-6.5530992018,-1.8149511942,,, +0.1796875000,0,-5.0056480164,-0.2519153458,-5.4111544507,-0.3756141241,,, +0.1816406250,0,-3.0928350152,1.4920883968,-3.9889140606,1.1761348017,,, +0.1835937500,0,-1.1459233911,3.1403603979,-2.3759971538,2.7565836314,,, +0.1855468750,0,0.7299226718,4.6097907435,-0.6482437522,4.2994528950,,, +0.1875000000,0,2.4814487253,5.8434036894,1.1430596277,5.7506182656,,, +0.1894531250,0,4.0958621919,6.8062331318,2.9609526484,7.0591619716,,, +0.1914062500,0,5.5465568423,7.4663695252,4.7412085531,8.1612367594,,, +0.1933593750,0,6.7317271305,7.7584258913,6.3452071662,8.9572792244,,, +0.1953125000,0,7.4689243405,7.5727618977,7.5576739371,9.3100766530,,, +0.1972656250,0,7.5550248659,6.7919874609,8.1417276722,9.0777849545,,, +0.1992187500,0,6.8392953285,5.3398846915,7.9081185904,8.1569789411,,, +0.2011718750,0,5.2675016237,3.2113248767,6.7584646662,6.5107444749,,, +0.2031250000,0,2.8935069132,0.4818506118,4.6983740404,4.1789430857,,, +0.2050781250,0,-0.1317109340,-2.6990114390,1.8316944135,1.2736907568,,, +0.2070312500,0,-3.5828862275,-6.1266856958,-1.6546272720,-2.0359165864,,, +0.2089843750,0,-7.1870476727,-9.5639977169,-5.5104634616,-5.5426576394,,, +0.2109375000,0,-10.6520856026,-12.7638068104,-9.4463677842,-9.0213439864,,, +0.2128906250,0,-13.6947716918,-15.4917811898,-13.1588152299,-12.2494812619,,, +0.2148437500,0,-16.0635366019,-17.5447942237,-16.3538997032,-15.0240319637,,, +0.2167968750,0,-17.5570387350,-18.7645980713,-18.7707643015,-17.1743902749,,, +0.2187500000,0,-18.0403186345,-19.0500594792,-20.2040082634,-18.5740319121,,, +0.2207031250,0,-17.4531288632,-18.3657286132,-20.5186134776,-19.1479615510,,, +0.2226562500,0,-15.8064232178,-16.7440243116,-19.6541024612,-18.8740438873,,, +0.2246093750,0,-13.1711285299,-14.2796313894,-17.6205765721,-17.7798832439,,, +0.2265625000,0,-9.6635567897,-11.1111589507,-14.4886711540,-15.9320370766,,, +0.2285156250,0,-5.4357086069,-7.3965852016,-10.3815652626,-13.4198830795,,, +0.2304687500,0,-0.6851727875,-3.3096124247,-5.4844289211,-10.3557261053,,, +0.2324218750,0,4.3239268450,0.9382027458,-0.0636526578,-6.8956197158,,, +0.2343750000,0,9.2613460551,5.0890158881,5.5348619313,-3.2456562968,,, +0.2363281250,0,13.7643665107,8.8667355434,10.9191915328,0.3644458887,,, +0.2382812500,0,17.4893459636,12.0186094121,15.7017901457,3.7169311281,,, +0.2402343750,0,20.1618000292,14.3483284528,19.5487815364,6.6325137447,,, +0.2421875000,0,21.6101141927,15.7375787457,22.2147922654,8.9883396423,,, +0.2441406250,0,21.7779287007,16.1538051410,23.5591319116,10.7251010760,,, +0.2460937500,0,20.7198974067,15.6447829235,23.5477811054,11.8417225704,,, +0.2480468750,0,18.5858737091,14.3289993553,22.2460929995,12.3863216726,,, +0.2500000000,0,15.5977672672,12.3865384132,19.8061945372,12.4492562849,,, +0.2519531250,0,12.0278170780,10.0488229006,16.4553043659,12.1565126375,,, +0.2539062500,0,8.1881834518,7.5906770162,12.4899616763,11.6670078608,,, +0.2558593750,0,4.4286928234,5.3265322439,8.2716003505,11.1762492196,,, +0.2578125000,0,1.1209743335,3.5962610099,4.2079926156,10.9116830835,,, +0.2597656250,0,-1.3879186739,2.7198575605,0.7073700111,11.0983649501,,, +0.2617187500,0,-2.8442402321,2.9206141536,-1.8925775603,11.8925474394,,, +0.2636718750,0,-3.1580978081,4.2431295875,-3.4034154866,13.3065178844,,, +0.2656250000,0,-2.4528973939,6.5013913481,-3.8449833298,15.1584932038,,, +0.2675781250,0,-1.0668423036,9.2846989796,-3.4557124425,17.0756868326,,, +0.2695312500,0,0.5069158507,12.0269878277,-2.6412423333,18.5572263074,,, +0.2714843750,0,1.7259810515,14.1212155608,-1.8757368132,19.0802867237,,, +0.2734375000,0,2.1203459560,15.0463431497,-1.5870534471,18.2193998976,,, +0.2753906250,0,1.3897961670,14.4519269500,-2.0674934401,15.7267264688,,, +0.2773437500,0,-0.5687510475,12.1623675113,-3.4510390702,11.5362458410,,, +0.2792968750,0,-3.6966757330,8.1474684450,-5.7431799416,5.7334259021,,, +0.2812500000,0,-7.8103381284,2.5263787856,-8.8405801211,-1.4492629778,,, +0.2832031250,0,-12.6200390977,-4.4106649457,-12.5296188520,-9.6243714440,,, +0.2851562500,0,-17.7592642045,-12.2165748945,-16.5067443824,-18.2751868099,,, +0.2871093750,0,-22.8248121476,-20.3395470316,-20.4242849503,-26.8136657605,,, +0.2890625000,0,-27.4078301979,-28.1773618215,-23.9287383561,-34.6356997586,,, +0.2910156250,0,-31.1150227882,-35.1215668410,-26.6821267911,-41.1631832407,,, +0.2929687500,0,-33.5930249895,-40.6032168290,-28.3821875989,-45.8852029933,,, +0.2949218750,0,-34.5614459806,-44.1431437745,-28.7919658006,-48.4010352528,,, +0.2968750000,0,-33.8457155762,-45.3994024796,-27.7708943836,-48.4585058730,,, +0.2988281250,0,-31.3952722878,-44.2014372802,-25.2912828419,-45.9794777565,,, +0.3007812500,0,-27.2802092637,-40.5591477471,-21.4335512269,-41.0618966563,,, +0.3027343750,0,-21.6731580243,-34.6477453315,-16.3681907777,-33.9587116813,,, +0.3046875000,0,-14.8305987091,-26.7834067989,-10.3378502364,-25.0487463603,,, +0.3066406250,0,-7.0790117326,-17.3972603353,-3.6430004579,-14.8085358142,,, +0.3085937500,0,1.2031208684,-7.0029682299,3.3780396281,-3.7800755933,,, +0.3105468750,0,9.6145797624,3.8435933836,10.3798295590,7.4695918855,,, +0.3125000000,0,17.7663295389,14.5885045623,17.0437276182,18.3927323218,,, +0.3144531250,0,25.3121651891,24.7220947835,23.1038930833,28.4996797080,,, +0.3164062500,0,31.9678858193,33.8061803568,28.3595034214,37.3802910908,,, +0.3183593750,0,37.5150529485,41.4765045042,32.6732561044,44.7049218185,,, +0.3203125000,0,41.7939622984,47.4365555037,35.9603843060,50.2190148068,,, +0.3222656250,0,44.6997778384,51.4679269698,38.1778323502,53.7490654496,,, +0.3242187500,0,46.1871553893,53.4531289503,39.3207890627,55.2180673976,,, +0.3261718750,0,46.2745463299,53.3875284052,39.4229708147,54.6536274361,,, +0.3281250000,0,45.0414083819,51.3744540176,38.5536620236,52.1823907289,,, +0.3300781250,0,42.6146272401,47.6109965423,36.8065711173,48.0154644916,,, +0.3320312500,0,39.1467498777,42.3704271643,34.2835880923,42.4305018774,,, +0.3339843750,0,34.8028498145,35.9881541443,31.0876596741,35.7576675149,,, +0.3359375000,0,29.7607066267,28.8409767731,27.3261712273,28.3613261059,,, +0.3378906250,0,24.2079046007,21.3027017913,23.1088650223,20.6017389099,,, +0.3398437500,0,18.3340590035,13.7008903585,18.5417239574,12.7974117456,,, +0.3417968750,0,12.3255315236,6.3048189121,13.7283913474,5.2153902587,,, +0.3437500000,0,6.3577517281,-0.6712359984,8.7739454236,-1.9253835522,,, +0.3457031250,0,0.5912069527,-7.0660084072,3.7884194132,-8.4537517869,,, +0.3476562500,0,-4.8241257895,-12.7661118369,-1.1101967333,-14.2433531724,,, +0.3496093750,0,-9.7594137259,-17.7009459814,-5.8074228275,-19.2096296986,,, +0.3515625000,0,-14.1371811449,-21.8418495748,-10.2159541813,-23.3120398688,,, +0.3535156250,0,-17.9415244557,-25.1987870611,-14.2839794353,-26.5536114838,,, +0.3554687500,0,-21.1910151449,-27.8075344197,-17.9788981779,-28.9694008523,,, +0.3574218750,0,-23.9066107300,-29.7107808526,-21.2666685073,-30.6079875231,,, +0.3593750000,0,-26.0969939382,-30.9465881653,-24.1018024063,-31.5193964821,,, +0.3613281250,0,-27.7533135852,-31.5490919268,-26.4276544157,-31.7539310799,,, +0.3632812500,0,-28.8532778995,-31.5517949066,-28.1870549296,-31.3641762960,,, +0.3652343750,0,-29.3805658612,-30.9903145256,-29.3398069719,-30.4075419878,,, +0.3671875000,0,-29.3423024694,-29.9067144869,-29.8720615497,-28.9499669045,,, +0.3691406250,0,-28.7696248233,-28.3504218445,-29.7928089541,-27.0668061421,,, +0.3710937500,0,-27.7138100210,-26.3750476704,-29.1303116251,-24.8408827820,,, +0.3730468750,0,-26.2450782902,-24.0370471538,-27.9326062349,-22.3604564352,,, +0.3750000000,0,-24.4493577294,-21.3974785345,-26.2690895106,-19.7159326393,,, +0.3769531250,0,-22.4239223476,-18.5235115115,-24.2316825243,-16.9949662592,,, +0.3789062500,0,-20.2681791785,-15.4874689650,-21.9267814082,-14.2782184320,,, +0.3808593750,0,-18.0676663533,-12.3633923800,-19.4578468835,-11.6353262976,,, +0.3828125000,0,-15.8815517931,-9.2233355816,-16.9123965664,-9.1207441826,,, +0.3847656250,0,-13.7405409159,-6.1369879603,-14.3589506479,-6.7739995181,,, +0.3867187500,0,-11.6532141366,-3.1749870259,-11.8502940277,-4.6258590151,,, +0.3886718750,0,-9.6180387212,-0.4133279216,-9.4303086427,-2.7048322566,,, +0.3906250000,0,-7.6372544643,2.0658441204,-7.1404694275,-1.0385387483,,, +0.3925781250,0,-5.7273677797,4.1852709933,-5.0237418348,0.3535030770,,, +0.3945312500,0,-3.9238180318,5.8928450792,-3.1284470127,1.4716698431,,, +0.3964843750,0,-2.2772889766,7.1697625531,-1.5088322327,2.3370181580,,, +0.3984375000,0,-0.8384639373,8.0197912501,-0.2139431466,2.9792738876,,, +0.4003906250,0,0.3635995381,8.4641052285,0.7323641215,3.4338952570,,, +0.4023437500,0,1.3361148919,8.5513679664,1.3463885955,3.7527221292,,, +0.4042968750,0,2.1211532912,8.3598623356,1.6851322682,4.0050679982,,, +0.4062500000,0,2.7819753804,7.9828904248,1.8351432771,4.2632319007,,, +0.4082031250,0,3.3887227282,7.5158255447,1.8993835746,4.5923948086,,, +0.4101562500,0,4.0091332370,7.0513493316,1.9871598494,5.0509034913,,, +0.4121093750,0,4.7007788426,6.6706999375,2.2032404669,5.6851829580,,, +0.4140625000,0,5.5030407454,6.4272154198,2.6341159896,6.5135837604,,, +0.4160156250,0,6.4328880592,6.3344709852,3.3381188077,7.5134598627,,, +0.4179687500,0,7.4863519564,6.3680346938,4.3443466910,8.6230391230,,, +0.4199218750,0,8.6435486608,6.4748264247,5.6553439908,9.7534465291,,, +0.4218750000,0,9.8781152272,6.5864169085,7.2490790780,10.8042800636,,, +0.4238281250,0,11.1684242766,6.6367677303,9.0821822570,11.6799327803,,, +0.4257812500,0,12.4949755926,6.5744854679,11.0921635433,12.3009814753,,, +0.4277343750,0,13.8213782729,6.3674192241,13.1962006849,12.6115124473,,, +0.4296875000,0,15.0863780587,6.0111828179,15.2962663546,12.5895940094,,, +0.4316406250,0,16.2198828778,5.5390510711,17.2951590016,12.2567822444,,, +0.4335937500,0,17.1594996265,5.0179503029,19.1080439035,11.6740159669,,, +0.4355468750,0,17.8530291130,4.5314651713,20.6609975417,10.9251550398,,, +0.4375000000,0,18.2577867152,4.1642587475,21.8883469651,10.1021555849,,, +0.4394531250,0,18.3416472661,3.9898448760,22.7327871436,9.2936004692,,, +0.4414062500,0,18.0809012243,4.0565219886,23.1410841270,8.5697662000,,, +0.4433593750,0,17.4593280916,4.3769882120,23.0619379006,7.9699953822,,, +0.4453125000,0,16.4736980312,4.9293283168,22.4559513248,7.5023682730,,, +0.4472656250,0,15.1376296563,5.6682176718,21.3080235277,7.1543116703,,, +0.4492187500,0,13.4779378904,6.5387272496,19.6297178302,6.9050914694,,, +0.4511718750,0,11.5288273967,7.4803521944,17.4548073407,6.7293184621,,, +0.4531250000,0,9.3275261516,8.4168404345,14.8342986598,6.5885192161,,, +0.4550781250,0,6.9126289435,9.2498912324,11.8329059901,6.4258608267,,, +0.4570312500,0,4.3284409587,9.8716161565,8.5287816551,6.1757942494,,, +0.4589843750,0,1.6337627147,10.1854805024,5.0154764950,5.7794946429,,, +0.4609375000,0,-1.0929074982,10.1239101785,1.4023499346,5.1970473208,,, +0.4628906250,0,-3.7572916134,9.6588768004,-2.1888104212,4.4149533829,,, +0.4648437500,0,-6.2581642445,8.8010346395,-5.6308672924,3.4453353923,,, +0.4667968750,0,-8.4955814186,7.5902361405,-8.8004811957,2.3180619776,,, +0.4687500000,0,-10.3806367220,6.0855531283,-11.5870496887,1.0726830130,,, +0.4707031250,0,-11.8449363756,4.3569032988,-13.8982462261,-0.2474694966,,, +0.4726562500,0,-12.8429933135,2.4790899504,-15.6620834378,-1.5993532655,,, +0.4746093750,0,-13.3507067979,0.5304077396,-16.8309635404,-2.9412634683,,, +0.4765625000,0,-13.3677189127,-1.4080804767,-17.3892530516,-4.2322267492,,, +0.4785156250,0,-12.9233088489,-3.2600608569,-17.3597253599,-5.4347787672,,, +0.4804687500,0,-12.0776194581,-4.9657331976,-16.8043638762,-6.5209767661,,, +0.4824218750,0,-10.9111194717,-6.4860301886,-15.8159357855,-7.4743061977,,, +0.4843750000,0,-9.5076292148,-7.7988720046,-14.5017200569,-8.2868238336,,, +0.4863281250,0,-7.9432736166,-8.8978748793,-12.9666064318,-8.9583411775,,, +0.4882812500,0,-6.2860068460,-9.7923253553,-11.3025417425,-9.4963733267,,, +0.4902343750,0,-4.6023976309,-10.5034431519,-9.5881531102,-9.9133190485,,, +0.4921875000,0,-2.9637390313,-11.0631137446,-7.8936764146,-10.2264999787,,, +0.4941406250,0,-1.4449897780,-11.5139044666,-6.2825335585,-10.4606823889,,, +0.4960937500,0,-0.1198501856,-11.9011416871,-4.8104675467,-10.6446192017,,, +0.4980468750,0,0.9455727946,-12.2613705584,-3.5240331347,-10.8033670249,,, +0.5000000000,0,1.7021847926,-12.6157701958,-2.4563590673,-10.9530223655,,, +0.5019531250,0,2.1241053572,-12.9667193162,-1.6253227163,-11.0975478271,,, +0.5039062500,0,2.2082762155,-13.2949293556,-1.0360762394,-11.2263322298,,, +0.5058593750,0,1.9747278095,-13.5602691261,-0.6797650816,-11.3138452795,,, +0.5078125000,0,1.4678411061,-13.7081784648,-0.5294647226,-11.3220853294,,, +0.5097656250,0,0.7485402670,-13.6826410109,-0.5458845460,-11.2091539188,,, +0.5117187500,0,-0.1249835579,-13.4463411947,-0.6940013276,-10.9468223239,,, +0.5136718750,0,-1.1139987299,-12.9947168164,-0.9547018130,-10.5336089421,,, +0.5156250000,0,-2.1981339552,-12.3472555659,-1.3201863542,-9.9867212009,,, +0.5175781250,0,-3.3585529123,-11.5254947077,-1.7794012198,-9.3226293556,,, +0.5195312500,0,-4.5632563556,-10.5390364527,-2.3087555536,-8.5461461113,,, +0.5214843750,0,-5.7667374596,-9.3825164813,-2.8760980851,-7.6483341906,,, +0.5234375000,0,-6.9142919170,-8.0369066448,-3.4469314661,-6.6054044832,,, +0.5253906250,0,-7.9406495381,-6.4760424258,-3.9819856905,-5.3820034651,,, +0.5273437500,0,-8.7751138429,-4.6794821212,-4.4382476099,-3.9443237095,,, +0.5292968750,0,-9.3594555180,-2.6453303576,-4.7810649177,-2.2767386744,,, +0.5312500000,0,-9.6606439040,-0.3980888999,-4.9909657657,-0.3921209107,,, +0.5332031250,0,-9.6672069589,2.0128954543,-5.0559081935,1.6700795876,,, +0.5351562500,0,-9.3765759385,4.5265729287,-4.9586911768,3.8564439278,,, +0.5371093750,0,-8.7841735727,7.0787851223,-4.6702492214,6.1072196701,,, +0.5390625000,0,-7.8815243640,9.5966908947,-4.1535492889,8.3523879693,,, +0.5410156250,0,-6.6633612545,11.9979269526,-3.3757651091,10.5121812219,,, +0.5429687500,0,-5.1346791100,14.2032211167,-2.3183852937,12.5084658511,,, +0.5449218750,0,-3.3100542567,16.1475327313,-0.9771744207,14.2754916781,,, +0.5468750000,0,-1.2090549457,17.7823756961,0.6431879110,15.7639932029,,, +0.5488281250,0,1.1448859410,19.0746773388,2.5302056364,16.9412705377,,, +0.5507812500,0,3.7194922041,20.0052835385,4.6576023530,17.7890517355,,, +0.5527343750,0,6.4625763142,20.5666302913,6.9755089433,18.2994475192,,, +0.5546875000,0,9.2920936088,20.7613188110,9.4043264086,18.4721923242,,, +0.5566406250,0,12.0990443946,20.6039475730,11.8401703103,18.3171341977,,, +0.5585937500,0,14.7623352178,20.1216147849,14.1696642969,17.8576792347,,, +0.5605468750,0,17.1622103712,19.3452413490,16.2811424767,17.1260451006,,, +0.5625000000,0,19.1835555466,18.2947920729,18.0636287180,16.1505138938,,, +0.5644531250,0,20.7142784781,16.9710300235,19.4020201129,14.9445853523,,, +0.5664062500,0,21.6510846375,15.3610451360,20.1838676742,13.5072415083,,, +0.5683593750,0,21.9146944270,13.4541041217,20.3179319890,11.8351833278,,, +0.5703125000,0,21.4628951237,11.2572965931,19.7508935723,9.9370842811,,, +0.5722656250,0,20.2932180829,8.8011603891,18.4742249086,7.8389737195,,, +0.5742187500,0,18.4393382991,6.1368623489,16.5238050848,5.5823313823,,, +0.5761718750,0,15.9685593024,3.3341653906,13.9771877198,3.2230374926,,, +0.5781250000,0,12.9820094067,0.4793402922,10.9508473030,0.8302745847,,, +0.5800781250,0,9.6141886746,-2.3355356918,7.5961993507,-1.5207775190,,, +0.5820312500,0,6.0280757982,-5.0271517145,4.0904521636,-3.7596778528,,, +0.5839843750,0,2.4048824113,-7.5276974701,0.6213445803,-5.8281598541,,, +0.5859375000,0,-1.0699228251,-9.7856505535,-2.6293677766,-7.6839987099,,, +0.5878906250,0,-4.2244895833,-11.7666097814,-5.5013217942,-9.3021930998,,, +0.5898437500,0,-6.9215567579,-13.4515319427,-7.8719203750,-10.6722714503,,, +0.5917968750,0,-9.0730710400,-14.8321177779,-9.6689596551,-11.7942790297,,, +0.5937500000,0,-10.6388602457,-15.9089934754,-10.8702671458,-12.6773802569,,, +0.5957031250,0,-11.6165856678,-16.6911277279,-11.4929180556,-13.3380519093,,, +0.5976562500,0,-12.0403874713,-17.1917402526,-11.5862475049,-13.7945888021,,, +0.5996093750,0,-11.9864574044,-17.4238072896,-11.2325780961,-14.0622709533,,, +0.6015625000,0,-11.5661539880,-17.3975700514,-10.5435963368,-14.1514469336,,, +0.6035156250,0,-10.9086396713,-17.1212062222,-9.6506350229,-14.0687326799,,, +0.6054687500,0,-10.1493197420,-16.6059965898,-8.6965569581,-13.8216860882,,, +0.6074218750,0,-9.4170963065,-15.8666668520,-7.8212071033,-13.4184004445,,, +0.6093750000,0,-8.8139011978,-14.9147432385,-7.1379583262,-12.8606809986,,, +0.6113281250,0,-8.4044005344,-13.7624682896,-6.7202420587,-12.1471454541,,, +0.6132812500,0,-8.2207429701,-12.4375660682,-6.6027750512,-11.2868646318,,, +0.6152343750,0,-8.2648279938,-10.9841592643,-6.7822584543,-10.3014383346,,, +0.6171875000,0,-8.5038893194,-9.4469916640,-7.2138315669,-9.2130159243,,, +0.6191406250,0,-8.8705976750,-7.8616997863,-7.8129989775,-8.0385705028,,, +0.6210937500,0,-9.2688738162,-6.2543156548,-8.4651404454,-6.7916806111,,, +0.6230468750,0,-9.5800376547,-4.6382329988,-9.0371489951,-5.4798340894,,, +0.6250000000,0,-9.6788822756,-3.0153629003,-9.3958300487,-4.1042034328,,, +0.6269531250,0,-9.4674054005,-1.3880535296,-9.4384012395,-2.6696394117,,, +0.6289062500,0,-8.9061948501,0.2306777107,-9.1195329443,-1.1945466939,,, +0.6308593750,0,-8.0205545625,1.8155035581,-8.4558941072,0.2866022572,,, +0.6328125000,0,-6.8859744088,3.3273164990,-7.5126882532,1.7224512603,,, +0.6347656250,0,-5.6109607177,4.7094117690,-6.3883151038,3.0437107443,,, +0.6367187500,0,-4.3194503806,5.8930045110,-5.1978643280,4.1709255832,,, +0.6386718750,0,-3.1269503407,6.8168485351,-4.0492952506,5.0341625920,,, +0.6406250000,0,-2.1174485344,7.4492442044,-3.0203847707,5.5944391640,,, +0.6425781250,0,-1.3290947520,7.8011723228,-2.1466799697,5.8572410631,,, +0.6445312500,0,-0.7508297353,7.9245001108,-1.4210564884,5.8718329382,,, +0.6464843750,0,-0.3298694227,7.8944187327,-0.8011060165,5.7151525807,,, +0.6484375000,0,0.0163941838,7.7880612764,-0.2199428386,5.4708877752,,, +0.6503906250,0,0.3869332989,7.6713573810,0.4004769101,5.2144326334,,, +0.6523437500,0,0.8799918188,7.5928570709,1.1338994533,5.0047130458,,, +0.6542968750,0,1.5785704621,7.5813420909,2.0371162189,4.8816031851,,, +0.6562500000,0,2.5424236695,7.6469298275,3.1422928629,4.8671498422,,, +0.6582031250,0,3.7960977801,7.7833221141,4.4494731431,4.9663956263,,, +0.6601562500,0,5.3143430406,7.9717745227,5.9203627461,5.1683737165,,, +0.6621093750,0,7.0260259154,8.1879723752,7.4839109635,5.4519158546,,, +0.6640625000,0,8.8371806491,8.4072594662,9.0530839645,5.7934442296,,, +0.6660156250,0,10.6474265357,8.6035222208,10.5356469524,6.1677789874,,, +0.6679687500,0,12.3492883100,8.7432924936,11.8322186663,6.5413455111,,, +0.6699218750,0,13.8278334311,8.7831627658,12.8383490737,6.8683162582,,, +0.6718750000,0,14.9722572665,8.6750917975,13.4613376978,7.0958311525,,, +0.6738281250,0,15.6877138913,8.3729387315,13.6361950784,7.1725872568,,, +0.6757812500,0,15.8968007274,7.8349524077,13.3247036042,7.0540589913,,, +0.6777343750,0,15.5380080811,7.0256035020,12.5061559875,6.7033948920,,, +0.6796875000,0,14.5766800286,5.9218998891,11.1812001031,6.0938404058,,, +0.6816406250,0,13.0305254288,4.5276461559,9.3922670753,5.2207167665,,, +0.6835937500,0,10.9856564457,2.8871573193,7.2366306729,4.1152736455,,, +0.6855468750,0,8.5837774007,1.0809907980,4.8537984963,2.8419190985,,, +0.6875000000,0,5.9922447476,-0.7955357747,2.3977093263,1.4786651215,,, +0.6894531250,0,3.3726879432,-2.6554751015,0.0101961565,0.0945451954,,, +0.6914062500,0,0.8542656648,-4.4389877158,-2.1980291703,-1.2695274802,,, +0.6933593750,0,-1.4797257834,-6.1223969088,-4.1561810490,-2.6086684569,,, +0.6953125000,0,-3.5894324189,-7.7071141229,-5.8317807954,-3.9400884972,,, +0.6972656250,0,-5.4669901502,-9.1953757413,-7.2209941384,-5.2763997494,,, +0.6992187500,0,-7.1207352644,-10.5721041513,-8.3339976089,-6.6073754953,,, +0.7011718750,0,-8.5585290737,-11.7981367845,-9.1798637268,-7.8952033370,,, +0.7031250000,0,-9.7761514519,-12.8121101728,-9.7570282069,-9.0770467094,,, +0.7050781250,0,-10.7529115645,-13.5407530605,-10.0518629559,-10.0720173573,,, +0.7070312500,0,-11.4554453438,-13.9110972057,-10.0458778397,-10.7901710776,,, +0.7089843750,0,-11.8588668982,-13.8631941898,-9.7371121623,-11.1475102932,,, +0.7109375000,0,-11.9778420248,-13.3715827461,-9.1661318230,-11.0916716789,,, +0.7128906250,0,-11.8719037667,-12.4614281118,-8.4151617783,-10.6188012667,,, +0.7148437500,0,-11.6177459093,-11.1945031419,-7.5767001369,-9.7606016952,,, +0.7167968750,0,-11.2823266235,-9.6377907774,-6.7249830102,-8.5580663245,,, +0.7187500000,0,-10.9086821320,-7.8452800735,-5.9039800353,-7.0485372182,,, +0.7207031250,0,-10.5027559574,-5.8563548477,-5.1210011141,-5.2663365220,,, +0.7226562500,0,-10.0260997310,-3.6998605237,-4.3460105044,-3.2464637679,,, +0.7246093750,0,-9.4038275137,-1.4020603897,-3.5211133597,-1.0297962819,,, +0.7265625000,0,-8.5428486254,1.0013158751,-2.5742870780,1.3293480871,,, +0.7285156250,0,-7.3500162554,3.4557318447,-1.4308445981,3.7580261210,,, +0.7304687500,0,-5.7443101638,5.8892522383,-0.0219592085,6.1678437171,,, +0.7324218750,0,-3.6679846465,8.2230305022,1.7058446964,8.4646734899,,, +0.7343750000,0,-1.1062299507,10.3801619737,3.7749616402,10.5565246140,,, +0.7363281250,0,1.8916944639,12.2873571806,6.1585479679,12.3562533669,,, +0.7382812500,0,5.2086608635,13.8750104206,8.7733282273,13.7835470013,,, +0.7402343750,0,8.6757760071,15.0835118226,11.4890793852,14.7718806191,,, +0.7421875000,0,12.0934950349,15.8704531252,14.1445845879,15.2770525914,,, +0.7441406250,0,15.2474975733,16.2034374564,16.5600821686,15.2744984765,,, +0.7460937500,0,17.9239136909,16.0468406978,18.5502320500,14.7489793848,,, +0.7480468750,0,19.9298165830,15.3681221854,19.9413498522,13.6964492847,,, +0.7500000000,0,21.1139044530,14.1570911910,20.5878270516,12.1361468535,,, +0.7519531250,0,21.3834025037,12.4337971875,20.3889517904,10.1154396136,,, +0.7539062500,0,20.7157340243,10.2487649416,19.3059616892,7.7081426867,,, +0.7558593750,0,19.1545472369,7.6854774709,17.3639354358,5.0124832218,,, +0.7578125000,0,16.7920208412,4.8578953195,14.6367105717,2.1450020193,,, +0.7597656250,0,13.7569120930,1.9027936904,11.2346076113,-0.7676438387,,, +0.7617187500,0,10.2105279161,-1.0278647270,7.2999105332,-3.5940328116,,, +0.7636718750,0,6.3377018040,-3.7800873017,3.0001660780,-6.2050631304,,, +0.7656250000,0,2.3318504778,-6.2183869461,-1.4824320228,-8.4880937912,,, +0.7675781250,0,-1.6151219936,-8.2444557213,-5.9599192070,-10.3631659924,,, +0.7695312500,0,-5.3148527394,-9.8045181630,-10.2414448920,-11.7893436327,,, +0.7714843750,0,-8.5920003798,-10.8851647184,-14.1366902188,-12.7592123320,,, +0.7734375000,0,-11.3096047607,-11.5050529175,-17.4697321522,-13.2910585006,,, +0.7753906250,0,-13.3900551225,-11.7041931595,-20.0967371442,-13.4200610958,,, +0.7773437500,0,-14.8127862550,-11.5328054274,-21.9140230548,-13.1883157274,,, +0.7792968750,0,-15.5959322126,-11.0477558898,-22.8572679474,-12.6416515683,,, +0.7812500000,0,-15.7790239354,-10.3119614880,-22.9006573588,-11.8301302414,,, +0.7832031250,0,-15.4152144660,-9.3868484210,-22.0593744001,-10.8025947811,,, +0.7851562500,0,-14.5680134376,-8.3217948531,-20.3912911484,-9.5980000390,,, +0.7871093750,0,-13.3014216183,-7.1463951521,-17.9897017582,-8.2388986497,,, +0.7890625000,0,-11.6694190787,-5.8705310560,-14.9712534942,-6.7316678792,,, +0.7910156250,0,-9.7232176034,-4.4980691221,-11.4738353237,-5.0787822675,,, +0.7929687500,0,-7.5296489392,-3.0419245378,-7.6598334147,-3.2926825068,,, +0.7949218750,0,-5.1767313269,-1.5253928633,-3.7089048366,-1.3979923892,,, +0.7968750000,0,-2.7625038043,0.0233998796,0.1976826639,0.5726641414,,, +0.7988281250,0,-0.3874680412,1.5742607542,3.8840736819,2.5816770657,,, +0.8007812500,0,1.8373803721,3.0946843478,7.1737110675,4.5866978234,,, +0.8027343750,0,3.7909304329,4.5500515486,9.8944249670,6.5395681107,,, +0.8046875000,0,5.3689055316,5.9062776478,11.9081525169,8.3879119274,,, +0.8066406250,0,6.5124981974,7.1306050130,13.1407541874,10.0776837862,,, +0.8085937500,0,7.2107612285,8.1888389018,13.5871899568,11.5536963845,,, +0.8105468750,0,7.4808532896,9.0459705133,13.2954525523,12.7619743504,,, +0.8125000000,0,7.3522253135,9.6730036575,12.3510310172,13.6558030638,,, +0.8144531250,0,6.8687067810,10.0501722644,10.8730044983,14.1987175508,,, +0.8164062500,0,6.0933873473,10.1605102551,9.0087454378,14.3604470405,,, +0.8183593750,0,5.1015369569,9.9814234859,6.9157148049,14.1106602915,,, +0.8203125000,0,3.9701713236,9.4832304971,4.7411658733,13.4173715048,,, +0.8222656250,0,2.7762234727,8.6404298774,2.6153526936,12.2567200437,,, +0.8242187500,0,1.5980339927,7.4516240710,0.6538260316,10.6314940930,,, +0.8261718750,0,0.5084848600,5.9499868496,-1.0479550765,8.5815764874,,, +0.8281250000,0,-0.4407589121,4.1939510177,-2.4309430992,6.1763613291,,, +0.8300781250,0,-1.2322764116,2.2497538005,-3.4847962020,3.5003854755,,, +0.8320312500,0,-1.8816895335,0.1805338108,-4.2424740476,0.6455632468,,, +0.8339843750,0,-2.4244231113,-1.9584230532,-4.7611980613,-2.2934981989,,, +0.8359375000,0,-2.9020496698,-4.1219823022,-5.1042370341,-5.2257549199,,, +0.8378906250,0,-3.3543425249,-6.2722837077,-5.3305450574,-8.0658366145,,, +0.8398437500,0,-3.8138781432,-8.3704314353,-5.4880853468,-10.7307943212,,, +0.8417968750,0,-4.2984965864,-10.3675389363,-5.6074160397,-13.1372720531,,, +0.8437500000,0,-4.8049950294,-12.2016389005,-5.7002547996,-15.2035237149,,, +0.8457031250,0,-5.3082029256,-13.8015506782,-5.7630137578,-16.8546485684,,, +0.8476562500,0,-5.7606646554,-15.0916486071,-5.7778274942,-18.0252585196,,, +0.8496093750,0,-6.0947275259,-15.9956380190,-5.7135685849,-18.6605396689,,, +0.8515625000,0,-6.2387233529,-16.4429906263,-5.5346568074,-18.7212457848,,, +0.8535156250,0,-6.1425513634,-16.3780903719,-5.2135066637,-18.1909872020,,, +0.8554687500,0,-5.7904552827,-15.7677387461,-4.7363698044,-17.0803867419,,, +0.8574218750,0,-5.1924763240,-14.6067935991,-4.0999596980,-15.4287600333,,, +0.8593750000,0,-4.3673977094,-12.9251545213,-3.3044173392,-13.3065655504,,, +0.8613281250,0,-3.3321197056,-10.7904108045,-2.3493109642,-10.8141906172,,, +0.8632812500,0,-2.1039590946,-8.2994714227,-1.2358386403,-8.0724529780,,, +0.8652343750,0,-0.7125758992,-5.5664405728,0.0251092252,-5.2110556185,,, +0.8671875000,0,0.7891520516,-2.7139185117,1.4036104932,-2.3600104146,,, +0.8691406250,0,2.3253590001,0.1348981061,2.8480025348,0.3591378206,,, +0.8710937500,0,3.8106789091,2.8631841721,4.2925107865,2.8421169916,,, +0.8730468750,0,5.1680285120,5.3642386415,5.6700196134,5.0069326431,,, +0.8750000000,0,6.3364476886,7.5460608000,6.9207224277,6.7961776664,,, +0.8769531250,0,7.2663384861,9.3380446768,7.9929685773,8.1787291341,,, +0.8789062500,0,7.9144221187,10.6946352659,8.8402810317,9.1495503121,,, +0.8808593750,0,8.2467077040,11.5965035039,9.4194223487,9.7285351913,,, +0.8828125000,0,8.2472858038,12.0522159446,9.6934969359,9.9594993699,,, +0.8847656250,0,7.9298657916,12.0975348736,9.6426673925,9.9065063091,,, +0.8867187500,0,7.3459533769,11.7908523058,9.2767906970,9.6467310584,,, +0.8886718750,0,6.5798888224,11.2080939424,8.6380740017,9.2632416698,,, +0.8906250000,0,5.7303542411,10.4385490430,7.7904495037,8.8390926487,,, +0.8925781250,0,4.8873206146,9.5770584090,6.8031574090,8.4492104391,,, +0.8945312500,0,4.1149866083,8.7118439363,5.7378851994,8.1504456857,,, +0.8964843750,0,3.4496960334,7.9172254675,4.6457204006,7.9776579560,,, +0.8984375000,0,2.9083174780,7.2536835957,3.5699801806,7.9467520189,,, +0.9003906250,0,2.4950798434,6.7663388837,2.5471892656,8.0567658015,,, +0.9023437500,0,2.2093177297,6.4805109390,1.6098842486,8.2902521216,,, +0.9042968750,0,2.0586491697,6.4014509610,0.7951870481,8.6167813753,,, +0.9062500000,0,2.0626992328,6.5178178648,0.1468967798,8.9978816346,,, +0.9082031250,0,2.2377259294,6.8038328104,-0.2970517827,9.3899399680,,, +0.9101562500,0,2.5782894475,7.2195350573,-0.5187041634,9.7456814409,,, +0.9121093750,0,3.0490200431,7.7100485705,-0.5266488756,10.0151638876,,, +0.9140625000,0,3.5869016252,8.2079782742,-0.3570288597,10.1484367888,,, +0.9160156250,0,4.1118363986,8.6382935708,-0.0693663336,10.0973504631,,, +0.9179687500,0,4.5330059814,8.9132423642,0.2561005168,9.8076350254,,, +0.9199218750,0,4.7469755119,8.9214917870,0.5173482791,9.2085814030,,, +0.9218750000,0,4.6424369745,8.5314876121,0.5962867050,8.2170122194,,, +0.9238281250,0,4.1173465850,7.6083799821,0.3738944156,6.7514611565,,, +0.9257812500,0,3.1035095774,6.0383290232,-0.2473083156,4.7499602535,,, +0.9277343750,0,1.5883934103,3.7615736110,-1.3185913584,2.1943162802,,, +0.9296875000,0,-0.3835736065,0.7970425014,-2.8353216147,-0.8721429592,,, +0.9316406250,0,-2.7286183749,-2.7565735794,-4.7459241938,-4.3460100633,,, +0.9335937500,0,-5.3415964502,-6.7324286407,-6.9650638690,-8.0755716998,,, +0.9355468750,0,-8.1095988069,-10.9135078028,-9.3857505893,-11.8768541752,,, +0.9375000000,0,-10.9214218671,-15.0597429570,-11.8896245419,-15.5546227589,,, +0.9394531250,0,-13.6691371713,-18.9341249128,-14.3517250317,-18.9202317247,,, +0.9414062500,0,-16.2431267897,-22.3154313068,-16.6416474667,-21.7986994701,,, +0.9433593750,0,-18.5240325137,-25.0007550077,-18.6231107945,-24.0288944454,,, +0.9453125000,0,-20.3799499377,-26.8124395873,-20.1553266882,-25.4685796361,,, +0.9472656250,0,-21.6781799549,-27.6163384213,-21.1046753314,-26.0109195099,,, +0.9492187500,0,-22.3026151195,-27.3398795420,-21.3624118543,-25.6026700926,,, +0.9511718750,0,-22.1629791879,-25.9762595895,-20.8528189083,-24.2495738049,,, +0.9531250000,0,-21.2020613084,-23.5767422044,-19.5320848999,-22.0088089229,,, +0.9550781250,0,-19.4083163618,-20.2428308293,-17.3915584120,-18.9786413312,,, +0.9570312500,0,-16.8237604743,-16.1233216501,-14.4665644869,-15.2909450596,,, +0.9589843750,0,-13.5393758397,-11.4114496729,-10.8403669732,-11.1065727126,,, +0.9609375000,0,-9.6833353446,-6.3367643387,-6.6399030051,-6.6106868405,,, +0.9628906250,0,-5.4069519232,-1.1484289175,-2.0266973923,-2.0015739166,,, +0.9648437500,0,-0.8711584638,3.9062256605,2.8150114823,2.5257147594,,, +0.9667968750,0,3.7606680392,8.5975704872,7.6902528074,6.7900631233,,, +0.9687500000,0,8.3242820561,12.7254947690,12.4036154008,10.6300432150,,, +0.9707031250,0,12.6590058827,16.1349121253,16.7699701794,13.9137820257,,, +0.9726562500,0,16.6144877910,18.7273111677,20.6248441506,16.5486554769,,, +0.9746093750,0,20.0515144394,20.4583114215,23.8292951020,18.4817007712,,, +0.9765625000,0,22.8405368946,21.3289150624,26.2703245514,19.6953678796,,, +0.9785156250,0,24.8677541434,21.3802169952,27.8630010470,20.2056308033,,, +0.9804687500,0,26.0468255901,20.6879446825,28.5546274576,20.0587761664,,, +0.9824218750,0,26.3302544043,19.3542051070,28.3289146863,19.3249458408,,, +0.9843750000,0,25.7165742163,17.4994645244,27.2088849892,18.0909696262,,, +0.9863281250,0,24.2487638875,15.2536830429,25.2548858524,16.4512954564,,, +0.9882812500,0,22.0074324879,12.7474399761,22.5590165215,14.5001949240,,, +0.9902343750,0,19.1061873484,10.1076625535,19.2416115492,12.3309774781,,, +0.9921875000,0,15.6875320468,7.4547705670,15.4489535324,10.0362921150,,, +0.9941406250,0,11.9174929544,4.8966319450,11.3496984406,7.7032122739,,, +0.9960937500,0,7.9793696583,2.5238342670,7.1291047131,5.4092234028,,, +0.9980468750,0,4.0600600697,0.4079380074,2.9760793465,3.2217888832,,, +1.0000000000,1,-0.0000076047,-0.0000058467,0.0000005467,0.0000036359,33538,1.0000000000,0.0000000000 +1.0019531250,1,-0.0000595083,0.0000179889,-0.0000359974,0.0000444878,,, +1.0039062500,1,-0.0001887595,0.0001284830,-0.0001593128,0.0001590841,,, +1.0058593750,1,-0.0004098201,0.0003687832,-0.0004026488,0.0003679918,,, +1.0078125000,1,-0.0007154356,0.0007611842,-0.0007770902,0.0006719486,,, +1.0097656250,1,-0.0010764224,0.0013024183,-0.0012684929,0.0010505344,,, +1.0117187500,1,-0.0014442164,0.0019613069,-0.0018370551,0.0014632925,,, +1.0136718750,1,-0.0017554509,0.0026801385,-0.0024200832,0.0018531501,,, +1.0156250000,1,-0.0019377055,0.0033822056,-0.0029391328,0.0021521751,,, +1.0175781250,1,-0.0019171501,0.0039843157,-0.0033110787,0.0022898576,,, +1.0195312500,1,-0.0016281506,0.0044098671,-0.0034603526,0.0022028495,,, +1.0214843750,1,-0.0010243637,0.0046024464,-0.0033321266,0.0018458363,,, +1.0234375000,1,-0.0000956841,0.0045413286,-0.0029091230,0.0012068180,,, +1.0253906250,1,0.0011124902,0.0042502340,-0.0022251202,0.0003222485,,, +1.0273437500,1,0.0024965074,0.0037896006,-0.0013612089,-0.0007230604,,, +1.0292968750,1,0.0039105489,0.0032399901,-0.0004286488,-0.0018109176,,, +1.0312500000,1,0.0051803301,0.0026915478,0.0004434633,-0.0028016050,,, +1.0332031250,1,0.0061090239,0.0022401964,0.0011130488,-0.0035388126,,, +1.0351562500,1,0.0064908983,0.0019813257,0.0014346806,-0.0038603848,,, +1.0371093750,1,0.0061361425,0.0019986182,0.0012769187,-0.0036178029,,, +1.0390625000,1,0.0048961374,0.0023517793,0.0005405231,-0.0026962425,,, +1.0410156250,1,0.0026856941,0.0030649128,-0.0008249968,-0.0010324318,,, +1.0429687500,1,-0.0004948361,0.0041189181,-0.0028074266,0.0013685877,,, +1.0449218750,1,-0.0045400656,0.0054516107,-0.0053238533,0.0044203992,,, +1.0468750000,1,-0.0092314384,0.0069656814,-0.0082223291,0.0079517525,,, +1.0488281250,1,-0.0142447152,0.0085425361,-0.0112937137,0.0117150718,,, +1.0507812500,1,-0.0191612004,0.0100464115,-0.0142789226,0.0153950310,,, +1.0527343750,1,-0.0234744929,0.0113027094,-0.0168580307,0.0186076362,,, +1.0546875000,1,-0.0266167370,0.0120768561,-0.0186477801,0.0209125350,,, +1.0566406250,1,-0.0280297719,0.0120993736,-0.0192468706,0.0218671038,,, +1.0585937500,1,-0.0272521048,0.0111212250,-0.0183069296,0.0210987779,,, +1.0605468750,1,-0.0239656658,0.0089381704,-0.0155672539,0.0183425769,,, +1.0625000000,1,-0.0180059758,0.0053903166,-0.0108587333,0.0134478194,,, +1.0644531250,1,-0.0093829770,0.0003860821,-0.0041276154,0.0063981405,,, +1.0664062500,1,0.0016880766,-0.0060717929,0.0045352734,-0.0026612194,,, +1.0683593750,1,0.0147731244,-0.0138880078,0.0148900560,-0.0134147963,,, +1.0703125000,1,0.0292232056,-0.0228695179,0.0265461453,-0.0253782211,,, +1.0722656250,1,0.0442047332,-0.0327076356,0.0389634656,-0.0379140470,,, +1.0742187500,1,0.0587613829,-0.0429779396,0.0514780114,-0.0502732869,,, +1.0761718750,1,0.0718702501,-0.0531464469,0.0633289905,-0.0616346776,,, +1.0781250000,1,0.0824768355,-0.0625596160,0.0736669885,-0.0711256593,,, +1.0800781250,1,0.0895430685,-0.0704352870,0.0815681209,-0.0778523451,,, +1.0820312500,1,0.0921358847,-0.0759023994,0.0860957926,-0.0809689967,,, +1.0839843750,1,0.0895516906,-0.0781100769,0.0864211415,-0.0797890520,,, +1.0859375000,1,0.0814359590,-0.0763479286,0.0819485537,-0.0738957047,,, +1.0878906250,1,0.0678435659,-0.0701187214,0.0723865572,-0.0632007060,,, +1.0898437500,1,0.0492205907,-0.0591756703,0.0577638512,-0.0479415250,,, +1.0917968750,1,0.0263343474,-0.0435541787,0.0384204010,-0.0286423477,,, +1.0937500000,1,0.0001862714,-0.0236077147,0.0149940511,-0.0060646037,,, +1.0957031250,1,-0.0280778425,-0.0000335483,-0.0116003657,0.0188468369,,, +1.0976562500,1,-0.0572380212,0.0261296717,-0.0402016078,0.0450114028,,, +1.0996093750,1,-0.0860316419,0.0535265004,-0.0694306071,0.0712401782,,, +1.1015625000,1,-0.1131746936,0.0805439099,-0.0977366847,0.0962650784,,, +1.1035156250,1,-0.1374002703,0.1054199412,-0.1234821366,0.1187920356,,, +1.1054687500,1,-0.1574990042,0.1263535011,-0.1450283467,0.1375557752,,, +1.1074218750,1,-0.1723561295,0.1415952374,-0.1608085483,0.1513675685,,, +1.1093750000,1,-0.1810181066,0.1495891541,-0.1694448831,0.1591956033,,, +1.1113281250,1,-0.1828056177,0.1491716579,-0.1699209408,0.1602909423,,, +1.1132812500,1,-0.1774279723,0.1397256148,-0.1617264561,0.1543031104,,, +1.1152343750,1,-0.1650375690,0.1212462775,-0.1449215079,0.1413332542,,, +1.1171875000,1,-0.1462025856,0.0943639135,-0.1201395135,0.1219214959,,, +1.1191406250,1,-0.1218114463,0.0603377204,-0.0885438427,0.0969812485,,, +1.1210937500,1,-0.0929544572,0.0210184223,-0.0517551915,0.0677103192,,, +1.1230468750,1,-0.0608256877,-0.0211994815,-0.0117807982,0.0355130057,,, +1.1250000000,1,-0.0266311769,-0.0634882001,0.0290933616,0.0019106564,,, +1.1269531250,1,0.0085207376,-0.1028607095,0.0685211374,-0.0316009284,,, +1.1289062500,1,0.0437211481,-0.1365450125,0.1043747920,-0.0637139719,,, +1.1308593750,1,0.0783139646,-0.1622938339,0.1349627858,-0.0934224893,,, +1.1328125000,1,0.1118700818,-0.1785980899,0.1591539686,-0.1200586474,,, +1.1347656250,1,0.1440722651,-0.1848179632,0.1764127554,-0.1432484388,,, +1.1367187500,1,0.1745789607,-0.1811969518,0.1867516339,-0.1628237601,,, +1.1386718750,1,0.2029597263,-0.1687902390,0.1906591781,-0.1787610296,,, +1.1406250000,1,0.2286924561,-0.1493411512,0.1890208373,-0.1911482418,,, +1.1425781250,1,0.2511542926,-0.1250540124,0.1829716486,-0.2001217163,,, +1.1445312500,1,0.2695939652,-0.0982995412,0.1736986380,-0.2057734022,,, +1.1464843750,1,0.2831242291,-0.0713955964,0.1622991502,-0.2080906377,,, +1.1484375000,1,0.2907703393,-0.0464696950,0.1497140426,-0.2069541134,,, +1.1503906250,1,0.2915821050,-0.0253093811,0.1366795177,-0.2021754742,,, +1.1523437500,1,0.2847607414,-0.0092058972,0.1236808487,-0.1935431739,,, +1.1542968750,1,0.2697133279,0.0012023987,0.1108759807,-0.1808196509,,, +1.1562500000,1,0.2460269599,0.0061168325,0.0979667988,-0.1636769729,,, +1.1582031250,1,0.2134769623,0.0066377728,0.0841650215,-0.1416874186,,, +1.1601562500,1,0.1721145933,0.0045221994,0.0683816862,-0.1144433673,,, +1.1621093750,1,0.1223092939,0.0018350266,0.0494649536,-0.0816733956,,, +1.1640625000,1,0.0647336267,0.0007210918,0.0263379473,-0.0432895290,,, +1.1660156250,1,0.0004406344,0.0031875336,-0.0018317186,0.0005060566,,, +1.1679687500,1,-0.0690246124,0.0108526619,-0.0354270896,0.0490829453,,, +1.1699218750,1,-0.1416470930,0.0248131479,-0.0743070891,0.1013638923,,, +1.1718750000,1,-0.2150485726,0.0456201892,-0.1178356375,0.1558905046,,, +1.1738281250,1,-0.2865752273,0.0732625550,-0.1649072070,0.2108778188,,, +1.1757812500,1,-0.3533687362,0.1071797302,-0.2139845524,0.2642653489,,, +1.1777343750,1,-0.4124475773,0.1462639248,-0.2631336298,0.3137721846,,, +1.1796875000,1,-0.4608228324,0.1887309197,-0.3099899198,0.3569422647,,, +1.1816406250,1,-0.4956611791,0.2320118402,-0.3517575070,0.3912266031,,, +1.1835937500,1,-0.5144833077,0.2729171792,-0.3853948457,0.4141577994,,, +1.1855468750,1,-0.5153797045,0.3079993826,-0.4079331802,0.4235861692,,, +1.1875000000,1,-0.4972217032,0.3339232449,-0.4167979411,0.4179146611,,, +1.1894531250,1,-0.4598419746,0.3477837264,-0.4100842693,0.3963000222,,, +1.1914062500,1,-0.4041419733,0.3473464915,-0.3867534768,0.3587854705,,, +1.1933593750,1,-0.3321013270,0.3312643950,-0.3467737244,0.3063614655,,, +1.1953125000,1,-0.2467425330,0.2993305924,-0.2912653408,0.2410056822,,, +1.1972656250,1,-0.1520414170,0.2526098544,-0.2225467350,0.1656559180,,, +1.1992187500,1,-0.0526282696,0.1932674785,-0.1439025899,0.0839663507,,, +1.2011718750,1,0.0467218667,0.1242143343,-0.0591486044,-0.0001240555,,, +1.2031250000,1,0.1415714613,0.0488239617,0.0277468736,-0.0827865837,,, +1.2050781250,1,0.2281551466,-0.0292683933,0.1129283444,-0.1605780551,,, +1.2070312500,1,0.3036127727,-0.1064795763,0.1929478979,-0.2306762832,,, +1.2089843750,1,0.3661111603,-0.1797125029,0.2650898239,-0.2910710200,,, +1.2109375000,1,0.4148397449,-0.2466723916,0.3275686274,-0.3406405935,,, +1.2128906250,1,0.4498821947,-0.3058705819,0.3794783027,-0.3790666547,,, +1.2148437500,1,0.4719142033,-0.3563254105,0.4204782413,-0.4065559771,,, +1.2167968750,1,0.4817995313,-0.3971362211,0.4503568626,-0.4234620089,,, +1.2187500000,1,0.4803165600,-0.4271701415,0.4687205175,-0.4300224394,,, +1.2207031250,1,0.4680658333,-0.4449916434,0.4749107100,-0.4262793875,,, +1.2226562500,1,0.4454478000,-0.4489997401,0.4680815762,-0.4120989733,,, +1.2246093750,1,0.4127889262,-0.4377473926,0.4474539049,-0.3873363668,,, +1.2265625000,1,0.3706249992,-0.4103747352,0.4127061399,-0.3521350330,,, +1.2285156250,1,0.3198791190,-0.3669586846,0.3642689582,-0.3071342181,,, +1.2304687500,1,0.2618000446,-0.3086751632,0.3034022549,-0.2534683616,,, +1.2324218750,1,0.1977225234,-0.2377461900,0.2320625111,-0.1925928365,,, +1.2343750000,1,0.1287574477,-0.1571250702,0.1525756288,-0.1259966754,,, +1.2363281250,1,0.0555965749,-0.0700598732,0.0672802802,-0.0549616069,,, +1.2382812500,1,-0.0213303542,0.0200304352,-0.0214853287,0.0193635976,,, +1.2402343750,1,-0.1012903212,0.1091306403,-0.1108807134,0.0954764936,,, +1.2421875000,1,-0.1826825969,0.1922235400,-0.1970731157,0.1710398452,,, +1.2441406250,1,-0.2628671257,0.2634864849,-0.2752906590,0.2428158278,,, +1.2460937500,1,-0.3382873465,0.3169127481,-0.3402658076,0.3069048375,,, +1.2480468750,1,-0.4048642858,0.3473007000,-0.3870235115,0.3592590084,,, +1.2500000000,1,-0.4587929375,0.3515829517,-0.4120506752,0.3965514115,,, +1.2519531250,1,-0.4975083047,0.3297918404,-0.4143060659,0.4170676953,,, +1.2539062500,1,-0.5203676256,0.2852137856,-0.3956002236,0.4212030595,,, +1.2558593750,1,-0.5287183045,0.2239340720,-0.3603359409,0.4113933443,,, +1.2578125000,1,-0.5253458618,0.1539259612,-0.3147042054,0.3915151367,,, +1.2597656250,1,-0.5136209063,0.0838404799,-0.2655664338,0.3660084515,,, +1.2617187500,1,-0.4966364103,0.0218653388,-0.2193763732,0.3390102943,,, +1.2636718750,1,-0.4764525486,-0.0250978837,-0.1813476253,0.3136405295,,, +1.2656250000,1,-0.4535446252,-0.0520302095,-0.1548482508,0.2914810761,,, +1.2675781250,1,-0.4265551956,-0.0562999249,-0.1409792914,0.2722824800,,, +1.2695312500,1,-0.3924856326,-0.0378780719,-0.1385178975,0.2540383413,,, +1.2714843750,1,-0.3474149404,0.0008633261,-0.1443423437,0.2335187883,,, +1.2734375000,1,-0.2875248485,0.0553779140,-0.1539995331,0.2070158881,,, +1.2753906250,1,-0.2100361600,0.1190774826,-0.1621762653,0.1710057688,,, +1.2773437500,1,-0.1138154319,0.1838860293,-0.1633004372,0.1226954238,,, +1.2792968750,1,0.0004220917,0.2412467824,-0.1522613442,0.0604123485,,, +1.2812500000,1,0.1302558621,0.2831051358,-0.1249714185,-0.0162444475,,, +1.2832031250,1,0.2718729602,0.3027587226,-0.0787738379,-0.1064007155,,, +1.2851562500,1,0.4204292916,0.2954822077,-0.0126878113,-0.2079923297,,, +1.2871093750,1,0.5703638041,0.2587881655,0.0725566369,-0.3179106610,,, +1.2890625000,1,0.7154878582,0.1925993134,0.1744468293,-0.4320192599,,, +1.2910156250,1,0.8489434957,0.0994424069,0.2885476465,-0.5450770499,,, +1.2929687500,1,0.9633475038,-0.0155487762,0.4085592702,-0.6508343208,,, +1.2949218750,1,1.0511053711,-0.1447622070,0.5265284978,-0.7422759592,,, +1.2968750000,1,1.1048720353,-0.2784645706,0.6332650027,-0.8120206669,,, +1.2988281250,1,1.1184307292,-0.4057919882,0.7193310989,-0.8531603954,,, +1.3007812500,1,1.0878666200,-0.5161003389,0.7763807405,-0.8603882166,,, +1.3027343750,1,1.0124723507,-0.6001022234,0.7982527413,-0.8308924782,,, +1.3046875000,1,0.8950539056,-0.6508221350,0.7817009153,-0.7648025165,,, +1.3066406250,1,0.7416001121,-0.6641835807,0.7266282647,-0.6651144301,,, +1.3085937500,1,0.5604184484,-0.6387840001,0.6355870649,-0.5370541150,,, +1.3105468750,1,0.3610970441,-0.5754001500,0.5130366998,-0.3872557697,,, +1.3125000000,1,0.1537231827,-0.4771632741,0.3651308799,-0.2232811630,,, +1.3144531250,1,-0.0516318883,-0.3500444263,0.1998110625,-0.0533957689,,, +1.3164062500,1,-0.2454573719,-0.2024404463,0.0263195074,0.1139009928,,, +1.3183593750,1,-0.4194180464,-0.0438759921,-0.1458754704,0.2706153926,,, +1.3203125000,1,-0.5668394975,0.1160934811,-0.3079735129,0.4098612447,,, +1.3222656250,1,-0.6829591586,0.2684811375,-0.4523248779,0.5261792974,,, +1.3242187500,1,-0.7649931204,0.4052243001,-0.5726827458,0.6156715496,,, +1.3261718750,1,-0.8122026720,0.5192931314,-0.6642994330,0.6760732785,,, +1.3281250000,1,-0.8261953125,0.6048589016,-0.7241573057,0.7069975147,,, +1.3300781250,1,-0.8113370773,0.6578489312,-0.7514900938,0.7103515531,,, +1.3320312500,1,-0.7746323301,0.6764141375,-0.7480285639,0.6903738604,,, +1.3339843750,1,-0.7246686439,0.6606949100,-0.7174158643,0.6528666203,,, +1.3359375000,1,-0.6699320667,0.6120343396,-0.6640130699,0.6038664294,,, +1.3378906250,1,-0.6169803598,0.5321456207,-0.5916169840,0.5482080855,,, +1.3398437500,1,-0.5690670180,0.4225192677,-0.5025160529,0.4884514290,,, +1.3417968750,1,-0.5259562275,0.2844223646,-0.3974133014,0.4247568906,,, +1.3437500000,1,-0.4849286917,0.1197110437,-0.2763560289,0.3557653537,,, +1.3457031250,1,-0.4420788290,-0.0681136267,-0.1399399067,0.2797349215,,, +1.3476562500,1,-0.3933963922,-0.2731933044,0.0097932297,0.1954464823,,, +1.3496093750,1,-0.3358291656,-0.4868490237,0.1686227502,0.1030339235,,, +1.3515625000,1,-0.2681808034,-0.6976321785,0.3298098240,0.0045742356,,, +1.3535156250,1,-0.1915230123,-0.8924293732,0.4846249350,-0.0959136645,,, +1.3554687500,1,-0.1093166176,-1.0579539366,0.6232402113,-0.1927628863,,, +1.3574218750,1,-0.0273143169,-1.1815762231,0.7352943167,-0.2789327674,,, +1.3593750000,1,0.0470836056,-1.2518632969,0.8105001323,-0.3465773149,,, +1.3613281250,1,0.1061723300,-1.2595756153,0.8398304251,-0.3881978696,,, +1.3632812500,1,0.1436791456,-1.1986087446,0.8168316930,-0.3980462539,,, +1.3652343750,1,0.1562558131,-1.0663964431,0.7384965573,-0.3732283587,,, +1.3671875000,1,0.1441099570,-0.8643396081,0.6057961368,-0.3142360663,,, +1.3691406250,1,0.1104220258,-0.5982897149,0.4237441936,-0.2246773469,,, +1.3710937500,1,0.0599616302,-0.2785717422,0.2008389147,-0.1103528488,,, +1.3730468750,1,-0.0019887150,0.0802783934,-0.0515484634,0.0215329075,,, +1.3750000000,1,-0.0699258062,0.4600562938,-0.3196373652,0.1627042397,,, +1.3769531250,1,-0.1381390055,0.8401798677,-0.5880589695,0.3041479572,,, +1.3789062500,1,-0.2008511155,1.1994380685,-0.8410194892,0.4366479318,,, +1.3808593750,1,-0.2523707379,1.5176144511,-1.0633891065,0.5512958867,,, +1.3828125000,1,-0.2871537552,1.7770913687,-1.2417410605,0.6399362866,,, +1.3847656250,1,-0.2998000256,1.9639749981,-1.3650611466,0.6954471656,,, +1.3867187500,1,-0.2851320006,2.0680080608,-1.4247251077,0.7117709638,,, +1.3886718750,1,-0.2386907122,2.0824510802,-1.4146288964,0.6842177248,,, +1.3906250000,1,-0.1576279871,2.0051137582,-1.3322096603,0.6103237363,,, +1.3925781250,1,-0.0416484866,1.8394147372,-1.1795052872,0.4907507716,,, +1.3945312500,1,0.1062520972,1.5944824595,-0.9635236772,0.3298071896,,, +1.3964843750,1,0.2795801894,1.2847580181,-0.6960774146,0.1354869243,,, +1.3984375000,1,0.4688128005,0.9291755296,-0.3930719707,-0.0810513204,,, +1.4003906250,1,0.6621955109,0.5496569929,-0.0732243637,-0.3063986274,,, +1.4023437500,1,0.8465177469,0.1695129915,0.2432682772,-0.5258188631,,, +1.4042968750,1,1.0080508151,-0.1879228863,0.5359798342,-0.7242221704,,, +1.4062500000,1,1.1340710590,-0.5012714777,0.7861351177,-0.8876853279,,, +1.4082031250,1,1.2145996455,-0.7540048151,0.9791603482,-1.0053488849,,, +1.4101562500,1,1.2433306074,-0.9370181487,1.1066924561,-1.0706874747,,, +1.4121093750,1,1.2175495542,-1.0495600074,1.1671331109,-1.0816892225,,, +1.4140625000,1,1.1378930619,-1.0983570194,1.1649961338,-1.0404739789,,, +1.4160156250,1,1.0084965245,-1.0955946065,1.1096927600,-0.9528845656,,, +1.4179687500,1,0.8372953079,-1.0567124978,1.0142633447,-0.8281343800,,, +1.4199218750,1,0.6360969982,-0.9988117516,0.8944007151,-0.6784551315,,, +1.4218750000,1,0.4199043434,-0.9393889107,0.7673700862,-0.5183236958,,, +1.4238281250,1,0.2050859378,-0.8944384035,0.6500528665,-0.3627562433,,, +1.4257812500,1,0.0072648440,-0.8762659795,0.5566911276,-0.2253402505,,, +1.4277343750,1,-0.1598861320,-0.8922545112,0.4976091132,-0.1171149694,,, +1.4296875000,1,-0.2855313267,-0.9443452766,0.4785183913,-0.0458453466,,, +1.4316406250,1,-0.3631539842,-1.0283063687,0.4994422753,-0.0148429027,,, +1.4335937500,1,-0.3916236722,-1.1336218608,0.5542039827,-0.0222210387,,, +1.4355468750,1,-0.3747585077,-1.2451205823,0.6316370023,-0.0615988049,,, +1.4375000000,1,-0.3199987060,-1.3455006630,0.7177292976,-0.1236268150,,, +1.4394531250,1,-0.2368762408,-1.4176796669,0.7977416960,-0.1976062004,,, +1.4414062500,1,-0.1354567205,-1.4468806701,0.8581709294,-0.2730597860,,, +1.4433593750,1,-0.0253186205,-1.4223772745,0.8882747528,-0.3408566048,,, +1.4453125000,1,0.0848821953,-1.3387901345,0.8810714247,-0.3938305329,,, +1.4472656250,1,0.1877783322,-1.1965778286,0.8338013035,-0.4271494754,,, +1.4492187500,1,0.2772437916,-1.0012099501,0.7473848661,-0.4380757116,,, +1.4511718750,1,0.3477014386,-0.7616721122,0.6251914264,-0.4251247052,,, +1.4531250000,1,0.3936521790,-0.4893642775,0.4721481490,-0.3874717587,,, +1.4550781250,1,0.4094605308,-0.1967950893,0.2938262866,-0.3244795205,,, +1.4570312500,1,0.3886760264,0.1046964831,0.0947206859,-0.2346690661,,, +1.4589843750,1,0.3240424339,0.4065582956,-0.1227682213,-0.1153192282,,, +1.4609375000,1,0.2094475773,0.7024023153,-0.3571339046,0.0360673595,,, +1.4628906250,1,0.0423710432,0.9863819332,-0.6057252925,0.2197122838,,, +1.4648437500,1,-0.1746325394,1.2520250853,-0.8633955228,0.4322716994,,, +1.4667968750,1,-0.4332952588,1.4918289804,-1.1219816927,0.6663057638,,, +1.4687500000,1,-0.7200591447,1.6980600470,-1.3709854945,0.9107641082,,, +1.4707031250,1,-1.0175257792,1.8638934878,-1.5988932640,1.1522460061,,, +1.4726562500,1,-1.3060353875,1.9833551333,-1.7937928345,1.3760461599,,, +1.4746093750,1,-1.5655608687,2.0512078638,-1.9440857187,1.5673980355,,, +1.4765625000,1,-1.7785289879,2.0644812378,-2.0406213380,1.7137532361,,, +1.4785156250,1,-1.9320808722,2.0242649382,-2.0787658741,1.8067507234,,, +1.4804687500,1,-2.0177659152,1.9359850547,-2.0584501482,1.8420807741,,, +1.4824218750,1,-2.0297944493,1.8087585782,-1.9830385191,1.8181491822,,, +1.4843750000,1,-1.9645255404,1.6537371014,-1.8580703167,1.7353165833,,, +1.4863281250,1,-1.8213569763,1.4807524228,-1.6895086782,1.5956521737,,, +1.4882812500,1,-1.6036205425,1.2960446163,-1.4826755479,1.4029633204,,, +1.4902343750,1,-1.3190298388,1.1033053224,-1.2430962529,1.1633587699,,, +1.4921875000,1,-0.9799097882,0.9052773091,-0.9776052090,0.8858052085,,, +1.4941406250,1,-0.6032651312,0.7039639216,-0.6945066151,0.5822259549,,, +1.4960937500,1,-0.2103481974,0.5014004136,-0.4038829312,0.2674047637,,, +1.4980468750,1,0.1746101631,0.3013456209,-0.1181385180,-0.0414407871,,, +1.5000000000,1,0.5264102495,0.1096431064,0.1486039798,-0.3259180011,,, +1.5019531250,1,0.8211172006,-0.0666589067,0.3819842548,-0.5681804833,,, +1.5039062500,1,1.0381705818,-0.2199438416,0.5686795685,-0.7525048942,,, +1.5058593750,1,1.1629797221,-0.3434605579,0.6983849392,-0.8673945416,,, +1.5078125000,1,1.1900799599,-0.4342493589,0.7669683784,-0.9084350726,,, +1.5097656250,1,1.1250333036,-0.4952853776,0.7786119208,-0.8801100955,,, +1.5117187500,1,0.9836248223,-0.5352830457,0.7453554556,-0.7952123324,,, +1.5136718750,1,0.7884725188,-0.5669892396,0.6846150305,-0.6721375970,,, +1.5156250000,1,0.5641016515,-0.6047564623,0.6156106595,-0.5309664562,,, +1.5175781250,1,0.3329359314,-0.6619056908,0.5560407273,-0.3901086889,,, +1.5195312500,1,0.1143862914,-0.7488536112,0.5205214867,-0.2652201886,,, +1.5214843750,1,-0.0739989904,-0.8722702737,0.5205308499,-0.1697633854,,, +1.5234375000,1,-0.2159314966,-1.0346346999,0.5643770904,-0.1153002374,,, +1.5253906250,1,-0.2967186114,-1.2340100703,0.6569177441,-0.1112100741,,, +1.5273437500,1,-0.3038265974,-1.4639975406,0.7992973665,-0.1642998504,,, +1.5292968750,1,-0.2285841667,-1.7131688972,0.9878839293,-0.2775173979,,, +1.5312500000,1,-0.0693105769,-1.9643776374,1.2125387791,-0.4476774698,,, +1.5332031250,1,0.1661936352,-2.1956093203,1.4561230194,-0.6640030653,,, +1.5351562500,1,0.4602316762,-2.3818953677,1.6955350180,-0.9083282551,,, +1.5371093750,1,0.7866893993,-2.4968333911,1.9032831782,-1.1564738201,,, +1.5390625000,1,1.1144864922,-2.5153620360,2.0506677380,-1.3812629764,,, +1.5410156250,1,1.4126971494,-2.4187958853,2.1130816354,-1.5572268331,,, +1.5429687500,1,1.6551990957,-2.1985614413,2.0742954097,-1.6646663215,,, +1.5449218750,1,1.8229297208,-1.8564101464,1.9275256279,-1.6912208647,,, +1.5468750000,1,1.9045286248,-1.4038666848,1.6753522379,-1.6321610675,,, +1.5488281250,1,1.8969155318,-0.8630888454,1.3305010885,-1.4909931400,,, +1.5507812500,1,1.8054022852,-0.2672453387,0.9161290161,-1.2796291627,,, +1.5527343750,1,1.6424324283,0.3416627664,0.4639255864,-1.0169925605,,, +1.5546875000,1,1.4253097959,0.9169630568,0.0105437363,-0.7264458915,,, +1.5566406250,1,1.1736044489,1.4128593897,-0.4069792816,-0.4326531032,,, +1.5585937500,1,0.9068052767,1.7911449901,-0.7564352883,-0.1583142083,,, +1.5605468750,1,0.6430160739,2.0269052751,-1.0145883095,0.0781451328,,, +1.5625000000,1,0.3985671715,2.1112582488,-1.1690668908,0.2635238772,,, +1.5644531250,1,0.1871169632,2.0513878830,-1.2187570722,0.3904573551,,, +1.5664062500,1,0.0180522541,1.8679888270,-1.1728498871,0.4578486017,,, +1.5683593750,1,-0.1045184455,1.5905117984,-1.0482537594,0.4703481749,,, +1.5703125000,1,-0.1824728676,1.2529409726,-0.8672193947,0.4377671908,,, +1.5722656250,1,-0.2249602100,0.8917118987,-0.6565561398,0.3754165620,,, +1.5742187500,1,-0.2487767130,0.5438182365,-0.4465911444,0.3038828806,,, +1.5761718750,1,-0.2762784173,0.2440391900,-0.2685535442,0.2469292038,,, +1.5781250000,1,-0.3317768462,0.0225524090,-0.1515742868,0.2284740508,,, +1.5800781250,1,-0.4378122693,-0.0969582422,-0.1199479748,0.2696126948,,, +1.5820312500,1,-0.6116205124,-0.0995416262,-0.1902557462,0.3856811993,,, +1.5839843750,1,-0.8620415164,0.0185077724,-0.3684978937,0.5835481802,,, +1.5859375000,1,-1.1872200917,0.2472888363,-0.6476503484,0.8594767675,,, +1.5878906250,1,-1.5733188062,0.5620884107,-1.0063702816,1.1979569941,,, +1.5898437500,1,-1.9950181033,0.9254243565,-1.4104940451,1.5725556580,,, +1.5917968750,1,-2.4184157391,1.2927286798,-1.8178282492,1.9492932298,,, +1.5937500000,1,-2.8049763363,1.6186387372,-2.1837597134,2.2908789374,,, +1.5957031250,1,-3.1146054799,1.8616119222,-2.4654437211,2.5599361506,,, +1.5976562500,1,-3.3083755298,1.9878381778,-2.6254044383,2.7218172187,,, +1.5996093750,1,-3.3526682191,1.9750545161,-2.6356598280,2.7483450778,,, +1.6015625000,1,-3.2241463035,1.8151700722,-2.4814381280,2.6218123338,,, +1.6035156250,1,-2.9129078014,1.5149808009,-2.1629350014,2.3372792602,,, +1.6054687500,1,-2.4227562883,1.0948203859,-1.6945729660,1.9024158896,,, +1.6074218750,1,-1.7703648089,0.5860145908,-1.1030468189,1.3363000854,,, +1.6093750000,1,-0.9847487780,0.0281746976,-0.4253952799,0.6683826261,,, +1.6113281250,1,-0.1058603438,-0.5352425092,0.2943863122,-0.0635738027,,, +1.6132812500,1,0.8184717642,-1.0636369480,1.0108475194,-0.8172358333,,, +1.6152343750,1,1.7358730988,-1.5242854751,1.6816335901,-1.5491992611,,, +1.6171875000,1,2.5924732296,-1.8936660253,2.2695844421,-2.2173701946,,, +1.6191406250,1,3.3365881261,-2.1577163072,2.7444222808,-2.7835029931,,, +1.6210937500,1,3.9232803744,-2.3127516907,3.0852190801,-3.2164935486,,, +1.6230468750,1,4.3188244774,-2.3658306711,3.2824757179,-3.4954698433,,, +1.6250000000,1,4.5036579300,-2.3330465009,3.3382639790,-3.6113438902,,, +1.6269531250,1,4.4732296116,-2.2362442796,3.2645033438,-3.5665555044,,, +1.6289062500,1,4.2371093824,-2.0992708261,3.0802228618,-3.3735308625,,, +1.6308593750,1,3.8169011494,-1.9437906417,2.8080535998,-3.0522283808,,, +1.6328125000,1,3.2433021158,-1.7854222107,2.4705701046,-2.6271918196,,, +1.6347656250,1,2.5522172650,-1.6310823765,2.0870041638,-2.1242728854,,, +1.6367187500,1,1.7807956978,-1.4776675080,1.6707708978,-1.5676376813,,, +1.6386718750,1,0.9652039999,-1.3132657127,1.2293131026,-0.9785764270,,, +1.6406250000,1,0.1397384665,-1.1209146892,0.7661082613,-0.3758527317,,, +1.6425781250,1,-0.6645595600,-0.8822095933,0.2823751191,0.2243185452,,, +1.6445312500,1,-1.4212138878,-0.5802656362,-0.2215966444,0.8084057725,,, +1.6464843750,1,-2.1080132026,-0.2039423735,-0.7436529386,1.3642961053,,, +1.6484375000,1,-2.7061473883,0.2478769434,-1.2767137968,1.8796388416,,, +1.6503906250,1,-3.2004937413,0.7647055231,-1.8078935894,2.3416401496,,, +1.6523437500,1,-3.5802739927,1.3251763298,-2.3192299952,2.7376862567,,, +1.6542968750,1,-3.8385233487,1.8984692075,-2.7883659891,3.0553459451,,, +1.6562500000,1,-3.9707303226,2.4466465131,-3.1894626722,3.2820447763,,, +1.6582031250,1,-3.9738546512,2.9280263186,-3.4949241996,3.4052542582,,, +1.6601562500,1,-3.8457920553,3.3003615428,-3.6771850332,3.4129322579,,, +1.6621093750,1,-3.5850757578,3.5243269336,-3.7107897098,3.2941998569,,, +1.6640625000,1,-3.1915463067,3.5689363701,-3.5760931024,3.0411541126,,, +1.6660156250,1,-2.6684933389,3.4166211361,-3.2633557041,2.6515839828,,, +1.6679687500,1,-2.0255738368,3.0644140318,-2.7746997124,2.1312279530,,, +1.6699218750,1,-1.2818101968,2.5229709200,-2.1247316904,1.4955411757,,, +1.6718750000,1,-0.4683205554,1.8168266321,-1.3418343632,0.7715933657,,, +1.6738281250,1,0.3710350204,0.9846667144,-0.4686057858,-0.0014288903,,, +1.6757812500,1,1.1835139600,0.0773498087,0.4409876866,-0.7753114306,,, +1.6777343750,1,1.9152630535,-0.8462055195,1.3274271940,-1.4990664459,,, +1.6796875000,1,2.5196494501,-1.7247376844,2.1327019415,-2.1259653715,,, +1.6816406250,1,2.9633186930,-2.5006741880,2.8066281453,-2.6191247053,,, +1.6835937500,1,3.2288046160,-3.1249873383,3.3109974540,-2.9544803081,,, +1.6855468750,1,3.3137631337,-3.5611195173,3.6217400606,-3.1212604327,,, +1.6875000000,1,3.2279213758,-3.7878257389,3.7294580537,-3.1206521233,,, +1.6894531250,1,2.9891588472,-3.7993830822,3.6379357235,-2.9632222662,,, +1.6914062500,1,2.6199034591,-3.6034825079,3.3613157680,-2.6659669928,,, +1.6933593750,1,2.1448673331,-3.2193149398,2.9219527866,-2.2503096642,,, +1.6953125000,1,1.5901745004,-2.6761607219,2.3491609543,-1.7411602084,,, +1.6972656250,1,0.9828833091,-2.0107952918,1.6773770723,-1.1659416876,,, +1.6992187500,1,0.3508889797,-1.2644158551,0.9441782998,-0.5537516357,,, +1.7011718750,1,-0.2758117025,-0.4803107571,0.1893329682,0.0643750229,,, +1.7031250000,1,-0.8634206605,0.2985784061,-0.5460363163,0.6549378995,,, +1.7050781250,1,-1.3753508737,1.0323870325,-1.2215968428,1.1833378776,,, +1.7070312500,1,-1.7766662300,1.6860195316,-1.8007126042,1.6172843306,,, +1.7089843750,1,-2.0385781858,2.2290817848,-2.2522628118,1.9297977980,,, +1.7109375000,1,-2.1412648945,2.6357623130,-2.5517336611,2.1010732337,,, +1.7128906250,1,-2.0762435694,2.8866735964,-2.6833637355,2.1205363948,,, +1.7148437500,1,-1.8480738548,2.9715190716,-2.6425342292,1.9886587110,,, +1.7167968750,1,-1.4743205381,2.8907530313,-2.4368023513,1.7173498630,,, +1.7187500000,1,-0.9832987161,2.6556521968,-2.0850132624,1.3284615876,,, +1.7207031250,1,-0.4094432586,2.2867441453,-1.6143904457,0.8502827114,,, +1.7226562500,1,0.2119742836,1.8118409178,-1.0571065085,0.3134966361,,, +1.7246093750,1,0.8485874185,1.2639603808,-0.4474210323,-0.2518543430,,, +1.7265625000,1,1.4727241755,0.6778931589,0.1812293397,-0.8184344577,,, +1.7285156250,1,2.0610564026,0.0867478218,0.7982687290,-1.3622481614,,, +1.7304687500,1,2.5921752832,-0.4793869112,1.3758238261,-1.8613485808,,, +1.7324218750,1,3.0436684546,-0.9936370529,1.8876372341,-2.2939237269,,, +1.7343750000,1,3.3903266301,-1.4325392449,2.3084489606,-2.6371414633,,, +1.7363281250,1,3.6047015634,-1.7756462980,2.6139781165,-2.8674249566,,, +1.7382812500,1,3.6610202144,-2.0054680279,2.7825056251,-2.9630662936,,, +1.7402343750,1,3.5407984449,-2.1095485055,2.7985103068,-2.9085188990,,, +1.7421875000,1,3.2365663499,-2.0831846945,2.6559286328,-2.6975832169,,, +1.7441406250,1,2.7533153345,-1.9304516468,2.3594014651,-2.3346364058,,, +1.7460937500,1,2.1098166274,-1.6645243201,1.9250231421,-1.8355987344,,, +1.7480468750,1,1.3389585240,-1.3076633050,1.3804720474,-1.2281564617,,, +1.7500000000,1,0.4844315892,-0.8888960120,0.7621734142,-0.5489524364,,, +1.7519531250,1,-0.4053215077,-0.4402839608,0.1104365521,0.1614159261,,, +1.7539062500,1,-1.2824197076,0.0057430349,-0.5344289699,0.8626356921,,, +1.7558593750,1,-2.1028100820,0.4189126764,-1.1350613294,1.5175074685,,, +1.7578125000,1,-2.8284956917,0.7746815523,-1.6602252085,2.0943400193,,, +1.7597656250,1,-3.4288707463,1.0564194248,-2.0867446025,2.5683964219,,, +1.7617187500,1,-3.8805317588,1.2548216744,-2.3990533989,2.9216194271,,, +1.7636718750,1,-4.1667081985,1.3670178729,-2.5883964575,3.1420248451,,, +1.7656250000,1,-4.2776315991,1.3962996204,-2.6528104157,3.2238809416,,, +1.7675781250,1,-4.2111748377,1.3512190966,-2.5968186923,3.1679109386,,, +1.7695312500,1,-3.9734442639,1.2447000376,-2.4311148286,2.9814669794,,, +1.7714843750,1,-3.5796278775,1.0931992250,-2.1723837246,2.6788887472,,, +1.7734375000,1,-3.0536984545,0.9139949384,-1.8414654228,2.2806218999,,, +1.7753906250,1,-2.4261645151,0.7214827773,-1.4600836717,1.8107758220,,, +1.7773437500,1,-1.7316375574,0.5255260252,-1.0487966388,1.2950748995,,, +1.7792968750,1,-1.0073462488,0.3318233538,-0.6266142684,0.7599532578,,, +1.7812500000,1,-0.2919696859,0.1425922999,-0.2109472279,0.2319432111,,, +1.7832031250,1,0.3759232857,-0.0421901499,0.1822551800,-0.2630606685,,, +1.7851562500,1,0.9603647568,-0.2230649509,0.5384474644,-0.7010407412,,, +1.7871093750,1,1.4309455011,-0.4002774065,0.8451980888,-1.0616378382,,, +1.7890625000,1,1.7646259036,-0.5735908361,1.0928212871,-1.3293204855,,, +1.7910156250,1,1.9462068298,-0.7414345437,1.2740335869,-1.4934867448,,, +1.7929687500,1,1.9687915008,-0.8997768495,1.3834328876,-1.5484908429,,, +1.7949218750,1,1.8345153430,-1.0416750664,1.4175161936,-1.4940200695,,, +1.7968750000,1,1.5551347461,-1.1575413139,1.3750912631,-1.3355570261,,, +1.7988281250,1,1.1524059442,-1.2364535486,1.2582618272,-1.0849639030,,, +1.8007812500,1,0.6577915261,-1.2685233158,1.0738022185,-0.7608810985,,, +1.8027343750,1,0.1108860785,-1.2464908381,0.8335136218,-0.3880712933,,, +1.8046875000,1,-0.4434160252,-1.1656068306,0.5529771300,0.0045122148,,, +1.8066406250,1,-0.9585027446,-1.0237147345,0.2501230473,0.3861103436,,, +1.8085937500,1,-1.3903155854,-0.8226111096,-0.0556774002,0.7266842350,,, +1.8105468750,1,-1.7024086183,-0.5692817779,-0.3449249390,1.0000015633,,, +1.8125000000,1,-1.8702167315,-0.2764088278,-0.5994385407,1.1863752619,,, +1.8144531250,1,-1.8826527456,0.0376478897,-0.8030281676,1.2737406979,,, +1.8164062500,1,-1.7416971958,0.3502110665,-0.9421845149,1.2577224387,,, +1.8183593750,1,-1.4612935759,0.6368155738,-1.0072201418,1.1415288056,,, +1.8203125000,1,-1.0653459028,0.8735041482,-0.9928912233,0.9351847430,,, +1.8222656250,1,-0.5846935744,1.0391739227,-0.8986281252,0.6540906960,,, +1.8242187500,1,-0.0535151052,1.1186230166,-0.7289719335,0.3173740879,,, +1.8261718750,1,0.4942956086,1.1046392586,-0.4933943684,-0.0540186412,,, +1.8281250000,1,1.0275811455,0.9983255485,-0.2054885343,-0.4388866853,,, +1.8300781250,1,1.5183745325,0.8092264637,0.1171389843,-0.8160478789,,, +1.8320312500,1,1.9412580841,0.5549422679,0.4528466381,-1.1640052471,,, +1.8339843750,1,2.2733342613,0.2588914659,0.7773596208,-1.4614903599,,, +1.8359375000,1,2.4954888090,-0.0523523430,1.0659754443,-1.6889816007,,, +1.8378906250,1,2.5942981438,-0.3512375036,1.2957290174,-1.8305327720,,, +1.8398437500,1,2.5639363881,-0.6124287663,1.4482004531,-1.8758574380,,, +1.8417968750,1,2.4074271027,-0.8160804586,1.5121013796,-1.8219930128,,, +1.8437500000,1,2.1363788861,-0.9481124895,1.4833399006,-1.6731926456,,, +1.8457031250,1,1.7693768956,-0.9982564158,1.3631202113,-1.4393534759,,, +1.8476562500,1,1.3297257052,-0.9592073159,1.1564724508,-1.1342874992,,, +1.8496093750,1,0.8428869629,-0.8271455547,0.8715218227,-0.7741321345,,, +1.8515625000,1,0.3342401016,-0.6023161383,0.5189278165,-0.3759922219,,, +1.8535156250,1,-0.1721980146,-0.2898955143,0.1119019662,0.0427017000,,, +1.8554687500,1,-0.6542892811,0.0992695683,-0.3335389422,0.4643541436,,, +1.8574218750,1,-1.0919087976,0.5490706164,-0.7988866722,0.8713977469,,, +1.8593750000,1,-1.4666220582,1.0387587601,-1.2634005457,1.2462328254,,, +1.8613281250,1,-1.7618018516,1.5435591530,-1.7045440492,1.5714604540,,, +1.8632812500,1,-1.9644570378,2.0372116765,-2.1003471619,1.8317497767,,, +1.8652343750,1,-2.0672453158,2.4954415389,-2.4324324106,2.0160628280,,, +1.8671875000,1,-2.0683392186,2.8964705364,-2.6862824539,2.1176931733,,, +1.8691406250,1,-1.9701510919,3.2186759832,-2.8492330972,2.1328206907,,, +1.8710937500,1,-1.7788365433,3.4391362792,-2.9093487594,2.0598121968,,, +1.8730468750,1,-1.5039978782,3.5340334721,-2.8555540896,1.8991235737,,, +1.8750000000,1,-1.1576287720,3.4798446133,-2.6779499403,1.6528908148,,, +1.8769531250,1,-0.7529750212,3.2558299045,-2.3689140063,1.3247909766,,, +1.8789062500,1,-0.3038881447,2.8479240602,-1.9252921031,0.9205871348,,, +1.8808593750,1,0.1756899638,2.2527923582,-1.3507477492,0.4488027809,,, +1.8828125000,1,0.6719720758,1.4814217024,-0.6579298192,-0.0785392485,,, +1.8847656250,1,1.1708361391,0.5610548531,0.1301026761,-0.6451014243,,, +1.8867187500,1,1.6573746369,-0.4667904237,0.9809457034,-1.2304272705,,, +1.8886718750,1,2.1164496542,-1.5515210793,1.8563654880,-1.8116223206,,, +1.8906250000,1,2.5333696135,-2.6376849904,2.7152427046,-2.3648693343,,, +1.8925781250,1,2.8929595417,-3.6665049208,3.5141569162,-2.8651898820,,, +1.8945312500,1,3.1766588132,-4.5774848818,4.2072003229,-3.2848995222,,, +1.8964843750,1,3.3596935820,-5.3122044581,4.7472049283,-3.5926636111,,, +1.8984375000,1,3.4118325827,-5.8197378229,5.0894794708,-3.7553682322,,, +1.9003906250,1,3.3032723507,-6.0624473340,5.1979061320,-3.7435299555,,, +1.9023437500,1,3.0132125091,-6.0199776099,5.0510136204,-3.5380593280,,, +1.9042968750,1,2.5372728340,-5.6899212987,4.6454678110,-3.1354092016,,, +1.9062500000,1,1.8913794683,-5.0873325306,3.9973728351,-2.5500620532,,, +1.9082031250,1,1.1108073072,-4.2447483295,3.1418882482,-1.8138922987,,, +1.9101562500,1,0.2447418352,-3.2108948280,2.1301606456,-0.9721888666,,, +1.9121093750,1,-0.6505523693,-2.0480727697,1.0248440542,-0.0784098160,,, +1.9140625000,1,-1.5172521159,-0.8297609318,-0.1036993431,0.8101278248,,, +1.9160156250,1,-2.3001095107,0.3633658008,-1.1816263039,1.6360259469,,, +1.9179687500,1,-2.9495938208,1.4504980410,-2.1373749608,2.3456918803,,, +1.9199218750,1,-3.4237374487,2.3580407233,-2.9070723634,2.8924269380,,, +1.9218750000,1,-3.6894811165,3.0252332164,-3.4386424260,3.2387437321,,, +1.9238281250,1,-3.7250763836,3.4093605357,-3.6960931373,3.3592906502,,, +1.9257812500,1,-3.5231546691,3.4898875953,-3.6633991463,3.2439529595,,, +1.9277343750,1,-3.0928306939,3.2691562354,-3.3458128161,2.8994407106,,, +1.9296875000,1,-2.4602814638,2.7714437356,-2.7695089734,2.3494406738,,, +1.9316406250,1,-1.6677457252,2.0428911206,-1.9811254765,1.6339264011,,, +1.9335937500,1,-0.7709979625,1.1499963438,-1.0457655810,0.8070828208,,, +1.9355468750,1,0.1640196329,0.1746806551,-0.0424864921,-0.0661967785,,, +1.9375000000,1,1.0654068138,-0.7923631959,0.9416460876,-0.9148112198,,, +1.9394531250,1,1.8611206811,-1.6591256345,1.8186753521,-1.6672322274,,, +1.9414062500,1,2.4857125498,-2.3406752504,2.5078463381,-2.2581405873,,, +1.9433593750,1,2.8865208479,-2.7671137483,2.9431956739,-2.6345863038,,, +1.9453125000,1,3.0292136593,-2.8903133591,3.0801028196,-2.7614056959,,, +1.9472656250,1,2.9022457296,-2.6896265837,2.9007426469,-2.6256509626,,, +1.9492187500,1,2.5180538919,-2.1746965162,2.4163559850,-2.2381000098,,, +1.9511718750,1,1.9100689719,-1.3836638603,1.6648799038,-1.6307987370,,, +1.9531250000,1,1.1270862833,-0.3785308527,0.7056882463,-0.8521142222,,, +1.9550781250,1,0.2266759930,0.7605112606,-0.3867201402,0.0391176158,,, +1.9570312500,1,-0.7306703173,1.9424057730,-1.5297716860,0.9793653590,,, +1.9589843750,1,-1.6847979776,3.0742823678,-2.6398863093,1.9048675477,,, +1.9609375000,1,-2.5771913947,4.0705230217,-3.6387448406,2.7547880409,,, +1.9628906250,1,-3.3532907731,4.8603513209,-4.4590433691,3.4746811903,,, +1.9648437500,1,-3.9665812312,5.3930479025,-5.0494812182,4.0205499921,,, +1.9667968750,1,-4.3819192228,5.6402641996,-5.3775997488,4.3616620185,,, +1.9687500000,1,-4.5769429123,5.5965391275,-5.4306925990,4.4816265296,,, +1.9707031250,1,-4.5433971747,5.2788887147,-5.2160948086,4.3791810123,,, +1.9726562500,1,-4.2887495079,4.7239150715,-4.7600249050,4.0685489630,,, +1.9746093750,1,-3.8362202370,3.9822856088,-4.1041090011,3.5780711852,,, +1.9765625000,1,-3.2226865652,3.1134767517,-3.3011919933,2.9474758445,,, +1.9785156250,1,-2.4946706225,2.1815675394,-2.4110191068,2.2241260020,,, +1.9804687500,1,-1.7023673585,1.2500545342,-1.4944877168,1.4577046020,,, +1.9824218750,1,-0.8934746375,0.3760514435,-0.6074285225,0.6946118306,,, +1.9843750000,1,-0.1090813067,-0.3937771014,0.2036657169,-0.0258192237,,, +1.9863281250,1,0.6182273766,-1.0253681737,0.9037845320,-0.6731364277,,, +1.9882812500,1,1.2646297418,-1.4984160478,1.4702374784,-1.2262339148,,, +1.9902343750,1,1.8138588726,-1.8062290536,1.8920633452,-1.6725042958,,, +1.9921875000,1,2.2553754523,-1.9543124198,2.1683784313,-2.0062551144,,, +1.9941406250,1,2.5830876230,-1.9587187214,2.3068043887,-2.2274341716,,, +1.9960937500,1,2.7947261858,-1.8439676167,2.3218951646,-2.3406865727,,, +1.9980468750,1,2.8918554897,-1.6402850277,2.2333970350,-2.3546674392,,, +2.0000000000,2,2.8810003771,-1.3815006454,2.0653868870,-2.2822677768,33538:33538,1.0000000000:2.0000000000,0.0000000000:0.0000000000 +2.0019531250,2,2.7747650162,-1.1026494699,1.8452171425,-2.1407662794,,, +2.0039062500,2,2.5912906677,-0.8356629007,1.6005705296,-1.9503817469,,, +2.0058593750,2,2.3524869163,-0.6059479473,1.3565689756,-1.7322209355,,, +2.0078125000,2,2.0820589525,-0.4324906960,1.1350227639,-1.5069793197,,, +2.0097656250,2,1.8034362793,-0.3294248381,0.9545642753,-1.2939445149,,, +2.0117187500,2,1.5376059403,-0.3064476777,0.8300137988,-1.1096458147,,, +2.0136718750,2,1.3009115664,-0.3679887387,0.7709427831,-0.9661672267,,, +2.0156250000,2,1.1028974376,-0.5118401546,0.7799153299,-0.8693557398,,, +2.0175781250,2,0.9454684980,-0.7281092968,0.8514775851,-0.8179948166,,, +2.0195312500,2,0.8248807376,-0.9999152419,0.9734201932,-0.8053175206,,, +2.0214843750,2,0.7355141467,-1.3059012297,1.1299260227,-0.8221734103,,, +2.0234375000,2,0.6726833606,-1.6228717449,1.3043985302,-0.8595802658,,, +2.0253906250,2,0.6335947594,-1.9282699688,1.4814226472,-0.9099904794,,, +2.0273437500,2,0.6171107759,-2.2031177253,1.6485255259,-0.9678718987,,, +2.0292968750,2,0.6223039059,-2.4339043230,1.7967734050,-1.0292107823,,, +2.0312500000,2,0.6460271643,-2.6120274837,1.9194147635,-1.0897386189,,, +2.0332031250,2,0.6809291905,-2.7322493409,2.0100848353,-1.1432102122,,, +2.0351562500,2,0.7151320592,-2.7918683930,2.0621505084,-1.1809785439,,, +2.0371093750,2,0.7338184712,-2.7902780810,2.0690890686,-1.1929492978,,, +2.0390625000,2,0.7224470046,-2.7287530601,2.0256834644,-1.1696862064,,, +2.0410156250,2,0.6706215611,-2.6113549208,1.9301954793,-1.1052368182,,, +2.0429687500,2,0.5749000538,-2.4462696515,1.7863732550,-0.9993537850,,, +2.0449218750,2,0.4395944124,-2.2459524411,1.6038738513,-0.8580673169,,, +2.0468750000,2,0.2762836381,-2.0262355027,1.3974978239,-0.6931328635,,, +2.0488281250,2,0.1024547742,-1.8047122084,1.1856054401,-0.5207115924,,, +2.0507812500,2,-0.0621535806,-1.5975674731,0.9865990051,-0.3581191766,,, +2.0527343750,2,-0.2014421165,-1.4156531922,0.8140025807,-0.2188864342,,, +2.0546875000,2,-0.3075547456,-1.2620092101,0.6729883170,-0.1090479617,,, +2.0566406250,2,-0.3820164829,-1.1311325707,0.5594416618,-0.0261975689,,, +2.0585937500,2,-0.4341728055,-1.0094558191,0.4609061107,0.0393402816,,, +2.0605468750,2,-0.4779116489,-0.8777087235,0.3594299564,0.1017139944,,, +2.0625000000,2,-0.5279863180,-0.7148516782,0.2355745634,0.1760881421,,, +2.0644531250,2,-0.5970627427,-0.5016471203,0.0718957623,0.2757657525,,, +2.0664062500,2,-0.6935542472,-0.2232248472,-0.1445356166,0.4100932481,,, +2.0683593750,2,-0.8205094547,0.1288920920,-0.4203880193,0.5832093774,,, +2.0703125000,2,-0.9762332747,0.5558418063,-0.7557226289,0.7942291546,,, +2.0722656250,2,-1.1563060987,1.0515191933,-1.1448823924,1.0386280828,,, +2.0742187500,2,-1.3554895272,1.6025349659,-1.5772441466,1.3095179218,,, +2.0761718750,2,-1.5686960028,2.1886560579,-2.0378889812,1.5984143208,,, +2.0781250000,2,-1.7910047392,2.7850286508,-2.5090141345,1.8958063126,,, +2.0800781250,2,-2.0166360513,3.3655279297,-2.9716350845,2.1913042383,,, +2.0820312500,2,-2.2373563021,3.9054777268,-3.4066563180,2.4732459494,,, +2.0839843750,2,-2.4411203460,4.3819329640,-3.7944939851,2.7278544409,,, +2.0859375000,2,-2.6115316750,4.7719195496,-4.1137365152,2.9384374267,,, +2.0878906250,2,-2.7285973732,5.0518127352,-4.3410602601,3.0857413088,,, +2.0898437500,2,-2.7713371410,5.2000206091,-4.4540124283,3.1503705353,,, +2.0917968750,2,-2.7224823899,5.2019545232,-4.4361151706,3.1171742449,,, +2.0937500000,2,-2.5735134992,5.0540074317,-4.2814813950,2.9796094741,,, +2.0957031250,2,-2.3273313351,4.7645395078,-3.9965512860,2.7417712240,,, +2.0976562500,2,-1.9978410660,4.3529924232,-3.5993651043,2.4178844024,,, +2.0996093750,2,-1.6070217339,3.8476604794,-3.1169446483,2.0297747719,,, +2.1015625000,2,-1.1801799508,3.2814688438,-2.5806547458,1.6026293479,,, +2.1035156250,2,-0.7406520754,2.6871000930,-2.0209187362,1.1602293201,,, +2.1054687500,2,-0.3052352226,2.0932243399,-1.4629349409,0.7209492505,,, +2.1074218750,2,0.1183303679,1.5218086203,-0.9239232047,0.2954039157,,, +2.1093750000,2,0.5303508284,0.9865286821,-0.4125226793,-0.1132598225,,, +2.1113281250,2,0.9353487628,0.4926984392,0.0696870510,-0.5068000295,,, +2.1132812500,2,1.3382867031,0.0382328831,0.5260318388,-0.8890957172,,, +2.1152343750,2,1.7419179841,-0.3845479897,0.9625164229,-1.2639131148,,, +2.1171875000,2,2.1448828989,-0.7861949490,1.3853120919,-1.6329490099,,, +2.1191406250,2,2.5415260372,-1.1779145515,1.7992705304,-1.9951600044,,, +2.1210937500,2,2.9235572560,-1.5705309721,2.2079400845,-2.3476242953,,, +2.1230468750,2,3.2811760506,-1.9727692657,2.6129191168,-2.6858815895,,, +2.1250000000,2,3.6021543830,-2.3883886128,3.0116300280,-3.0026232320,,, +2.1269531250,2,3.8702821757,-2.8139528271,3.3952408869,-3.2861111358,,, +2.1289062500,2,4.0646193741,-3.2376081221,3.7475663687,-3.5193844522,,, +2.1308593750,2,4.1595604939,-3.6389302860,4.0449907568,-3.6802721111,,, +2.1328125000,2,4.1266966181,-3.9914682741,4.2588628673,-3.7432686086,,, +2.1347656250,2,3.9394227279,-4.2674602158,4.3604142444,-3.6837809923,,, +2.1367187500,2,3.5784932586,-4.4415640028,4.3254323321,-3.4827700525,,, +2.1386718750,2,3.0365907428,-4.4930360763,4.1375307652,-3.1303481852,,, +2.1406250000,2,2.3219480666,-4.4082953115,3.7912790943,-2.6288332242,,, +2.1425781250,2,1.4608970229,-4.1834754679,3.2948860531,-1.9950756746,,, +2.1445312500,2,0.4984528128,-3.8256391187,2.6712220930,-1.2611365074,,, +2.1464843750,2,-0.5039753731,-3.3535070755,1.9573635161,-0.4729101630,,, +2.1484375000,2,-1.4744214059,-2.7974038571,1.2021895840,0.3138302557,,, +2.1503906250,2,-2.3388578603,-2.1962278408,0.4609750542,1.0398918443,,, +2.1523437500,2,-3.0302055935,-1.5919836277,-0.2118072054,1.6500468719,,, +2.1542968750,2,-3.4964325952,-1.0247636391,-0.7690264266,2.0996893336,,, +2.1562500000,2,-3.7066564055,-0.5293280076,-1.1755880152,2.3597589784,,, +2.1582031250,2,-3.6538092935,-0.1323150354,-1.4113236490,2.4191961727,,, +2.1601562500,2,-3.3538234955,0.1510564501,-1.4728019100,2.2851710116,,, +2.1621093750,2,-2.8431525011,0.3204129206,-1.3745533543,1.9822180537,,, +2.1640625000,2,-2.1755315289,0.3913242868,-1.1484830231,1.5502986338,,, +2.1660156250,2,-1.4168775793,0.3917435084,-0.8395033448,1.0404991240,,, +2.1679687500,2,-0.6380149808,0.3550603970,-0.4980757244,0.5084658386,,, +2.1699218750,2,0.0927195416,0.3140877339,-0.1732995443,0.0079915574,,, +2.1718750000,2,0.7151252128,0.2979004164,0.0914366363,-0.4135369069,,, +2.1738281250,2,1.1811010522,0.3300070593,0.2612522590,-0.7182376177,,, +2.1757812500,2,1.4570827344,0.4272689144,0.3114682643,-0.8796235640,,, +2.1777343750,2,1.5251206945,0.5996001572,0.2282456072,-0.8833883342,,, +2.1796875000,2,1.3840239686,0.8494710635,0.0093839624,-0.7282787238,,, +2.1816406250,2,1.0506262697,1.1713420024,-0.3347837341,-0.4270640957,,, +2.1835937500,2,0.5593676378,1.5517397710,-0.7816027251,-0.0062215295,,, +2.1855468750,2,-0.0398768542,1.9694581784,-1.2970997043,0.4955877719,,, +2.1875000000,2,-0.6851475239,2.3960344010,-1.8376356510,1.0299036618,,, +2.1894531250,2,-1.3076990943,2.7980392390,-2.3535288546,1.5425903156,,, +2.1914062500,2,-1.8391472853,3.1406677433,-2.7942847519,1.9794993211,,, +2.1933593750,2,-2.2193993379,3.3901295678,-3.1133674949,2.2923669015,,, +2.1953125000,2,-2.4046507516,3.5156255153,-3.2727276377,2.4446534907,,, +2.1972656250,2,-2.3735736320,3.4938014247,-3.2482249517,2.4167413670,,, +2.1992187500,2,-2.1289754170,3.3140350732,-3.0337842826,2.2082649606,,, +2.2011718750,2,-1.6949202802,2.9806860759,-2.6417438748,1.8366646600,,, +2.2031250000,2,-1.1114983425,2.5121940369,-2.1001887197,1.3334206813,,, +2.2050781250,2,-0.4285683690,1.9383913007,-1.4486890644,0.7391885251,,, +2.2070312500,2,0.3004131034,1.2964277735,-0.7331486949,0.0986815989,,, +2.2089843750,2,1.0232078316,0.6267294181,-0.0012085849,-0.5435147718,,, +2.2109375000,2,1.6917592552,-0.0298226906,0.7008105938,-1.1455894370,,, +2.2128906250,2,2.2632511632,-0.6346191001,1.3301452835,-1.6698411580,,, +2.2148437500,2,2.7001951738,-1.1545124990,1.8497448908,-2.0834644856,,, +2.2167968750,2,2.9713596634,-1.5639434475,2.2300643708,-2.3596535055,,, +2.2187500000,2,3.0544293229,-1.8460212876,2.4508628597,-2.4796267906,,, +2.2207031250,2,2.9396258581,-1.9943813718,2.5039016270,-2.4354756101,,, +2.2226562500,2,2.6323398852,-2.0150795877,2.3952663715,-2.2323540634,,, +2.2246093750,2,2.1536279833,-1.9261239059,2.1452586569,-1.8886932255,,, +2.2265625000,2,1.5386933045,-1.7541355094,1.7855693012,-1.4344049126,,, +2.2285156250,2,0.8326249107,-1.5288153848,1.3539022639,-0.9067377014,,, +2.2304687500,2,0.0837269946,-1.2773093553,0.8875685221,-0.3444895048,,, +2.2324218750,2,-0.6623367345,-1.0214752374,0.4193255605,0.2165584789,,, +2.2343750000,2,-1.3650253034,-0.7780029714,-0.0235413576,0.7452796242,,, +2.2363281250,2,-1.9887524009,-0.5590486962,-0.4187302271,1.2149414542,,, +2.2382812500,2,-2.5028425294,-0.3725881798,-0.7486655831,1.6030973279,,, +2.2402343750,2,-2.8826995169,-0.2232325451,-1.0004233882,1.8921870222,,, +2.2421875000,2,-3.1104994810,-0.1137274856,-1.1650162663,2.0696571144,,, +2.2441406250,2,-3.1749185624,-0.0461389527,-1.2364984232,2.1275035340,,, +2.2460937500,2,-3.0712737486,-0.0220602105,-1.2118827708,2.0623160699,,, +2.2480468750,2,-2.8023947618,-0.0422824355,-1.0917105151,1.8759334903,,, +2.2500000000,2,-2.3797430338,-0.1057668474,-0.8811899724,1.5764184812,,, +2.2519531250,2,-1.8242084254,-0.2077314544,-0.5917965946,1.1790144443,,, +2.2539062500,2,-1.1659084660,-0.3383843306,-0.2420397678,0.7062864791,,, +2.2558593750,2,-0.4434243299,-0.4831038557,0.1429580913,0.1875560633,,, +2.2578125000,2,0.2972151965,-0.6233592740,0.5324695699,-0.3420037902,,, +2.2597656250,2,1.0056401540,-0.7388459153,0.8928157942,-0.8439511602,,, +2.2617187500,2,1.6334596132,-0.8108184497,1.1921087661,-1.2815814959,,, +2.2636718750,2,2.1406623030,-0.8242665170,1.4042548686,-1.6247204649,,, +2.2656250000,2,2.4979806554,-0.7682339229,1.5101119509,-1.8513788532,,, +2.2675781250,2,2.6859053773,-0.6364795785,1.4975551101,-1.9472218129,,, +2.2695312500,2,2.6941963428,-0.4288376985,1.3622223903,-1.9055190574,,, +2.2714843750,2,2.5230061755,-0.1515967742,1.1082422953,-1.7279600707,,, +2.2734375000,2,2.1837189002,0.1829490389,0.7482850679,-1.4250969107,,, +2.2753906250,2,1.6980948258,0.5569223937,0.3029595108,-1.0156529310,,, +2.2773437500,2,1.0960438143,0.9475377643,-0.2005031294,-0.5248527510,,, +2.2792968750,2,0.4136174753,1.3279883241,-0.7296310234,0.0171390360,,, +2.2812500000,2,-0.3074774045,1.6684420527,-1.2475850166,0.5757650373,,, +2.2832031250,2,-1.0199712760,1.9379232503,-1.7144912357,1.1125409945,,, +2.2851562500,2,-1.6726804157,2.1072938514,-2.0901361981,1.5868075238,,, +2.2871093750,2,-2.2135799864,2.1525579352,-2.3374425900,1.9585079526,,, +2.2890625000,2,-2.5941582009,2.0584724537,-2.4266662850,2.1918858900,,, +2.2910156250,2,-2.7753999768,1.8219123777,-2.3400722583,2.2602211156,,, +2.2929687500,2,-2.7330111099,1.4520587580,-2.0741302789,2.1493738705,,, +2.2949218750,2,-2.4598563697,0.9668589959,-1.6380511103,1.8586588498,,, +2.2968750000,2,-1.9670260437,0.3897641561,-1.0519761827,1.4008518621,,, +2.2988281250,2,-1.2840581674,-0.2508070322,-0.3467210406,0.8021979471,,, +2.3007812500,2,-0.4572282174,-0.9202842982,0.4360451528,0.1014718489,,, +2.3027343750,2,0.4541944446,-1.5771031523,1.2446408049,-0.6524115098,,, +2.3046875000,2,1.3836432027,-2.1748078810,2.0210014573,-1.4047247970,,, +2.3066406250,2,2.2640492302,-2.6675397973,2.7070899239,-2.1006933422,,, +2.3085937500,2,3.0335606592,-3.0160404190,3.2512832187,-2.6906099178,,, +2.3105468750,2,3.6393768669,-3.1919402452,3.6128878587,-3.1332811935,,, +2.3125000000,2,4.0406303104,-3.1807071165,3.7653841308,-3.3985286879,,, +2.3144531250,2,4.2112557027,-2.9836807661,3.6990335886,-3.4694867165,,, +2.3164062500,2,4.1429015998,-2.6177224820,3.4218435969,-3.3444339453,,, +2.3183593750,2,3.8463809064,-2.1117679222,2.9577997399,-3.0370022868,,, +2.3203125000,2,3.3501185296,-1.5024405100,2.3432415402,-2.5741857745,,, +2.3222656250,2,2.6964003029,-0.8306459147,1.6230217363,-1.9930972973,,, +2.3242187500,2,1.9369533088,-0.1386310647,0.8467033055,-1.3373904272,,, +2.3261718750,2,1.1275853556,0.5329638922,0.0643885307,-0.6530496829,,, +2.3281250000,2,0.3220105021,1.1467976110,-0.6768679618,0.0161191743,,, +2.3300781250,2,-0.4338683051,1.6701470458,-1.3361901253,0.6326191152,,, +2.3320312500,2,-1.1072149918,2.0789877572,-1.8837747133,1.1696270694,,, +2.3339843750,2,-1.6818612405,2.3628952632,-2.3057461977,1.6143839695,,, +2.3359375000,2,-2.1572759651,2.5258550565,-2.6043667980,1.9676176510,,, +2.3378906250,2,-2.5429164687,2.5825253064,-2.7932763847,2.2389301134,,, +2.3398437500,2,-2.8509920830,2.5521718523,-2.8904828310,2.4406540238,,, +2.3417968750,2,-3.0904988206,2.4528757233,-2.9120155862,2.5826431862,,, +2.3437500000,2,-3.2641939683,2.2985141845,-2.8686412427,2.6696242852,,, +2.3457031250,2,-3.3684636869,2.0983016401,-2.7654846489,2.7010229632,,, +2.3476562500,2,-3.3949747196,1.8571064633,-2.6028740297,2.6721552843,,, +2.3496093750,2,-3.3338246583,1.5766904318,-2.3783985504,2.5766239104,,, +2.3515625000,2,-3.1779557715,1.2587576721,-2.0907225760,2.4099289047,,, +2.3535156250,2,-2.9270345379,0.9083750983,-1.7434648601,2.1727808783,,, +2.3554687500,2,-2.5886558663,0.5352487788,-1.3465492882,1.8721690161,,, +2.3574218750,2,-2.1764113760,0.1525845623,-0.9146681631,1.5198185275,,, +2.3593750000,2,-1.7065780806,-0.2243518757,-0.4650283231,1.1296448948,,, +2.3613281250,2,-1.1958536651,-0.5787960483,-0.0161174181,0.7160934148,,, +2.3632812500,2,-0.6612173985,-0.8930734687,0.4127564741,0.2939249792,,, +2.3652343750,2,-0.1205626507,-1.1501105267,0.8022975434,-0.1216484137,,, +2.3671875000,2,0.4082588770,-1.3362043016,1.1355822377,-0.5161324252,,, +2.3691406250,2,0.9090604448,-1.4439238182,1.4008128531,-0.8773669636,,, +2.3710937500,2,1.3665348502,-1.4728253301,1.5916167130,-1.1950743451,,, +2.3730468750,2,1.7639296570,-1.4281986355,1.7053365185,-1.4589977736,,, +2.3750000000,2,2.0826447895,-1.3195478821,1.7418278722,-1.6583149975,,, +2.3769531250,2,2.3044913842,-1.1587653027,1.7030079211,-1.7828214999,,, +2.3789062500,2,2.4153689103,-0.9585874779,1.5931110379,-1.8251462933,,, +2.3808593750,2,2.4091296019,-0.7329959114,1.4203996033,-1.7834666135,,, +2.3828125000,2,2.2900567763,-0.4982967254,1.1988329605,-1.6634116927,,, +2.3847656250,2,2.0729601114,-0.2721658654,0.9473508153,-1.4779798580,,, +2.3867187500,2,1.7810893482,-0.0715029588,0.6874602547,-1.2457648932,,, +2.3886718750,2,1.4425318572,0.0891869752,0.4406469087,-0.9882488560,,, +2.3906250000,2,1.0861471822,0.1999937892,0.2252138255,-0.7266622967,,, +2.3925781250,2,0.7381289720,0.2576902681,0.0534536265,-0.4792836871,,, +2.3945312500,2,0.4197674839,0.2652996836,-0.0688795236,-0.2600076394,,, +2.3964843750,2,0.1466111254,0.2303495407,-0.1415981958,-0.0780911704,,, +2.3984375000,2,-0.0709481000,0.1634595794,-0.1688152250,0.0611999152,,, +2.4003906250,2,-0.2262861867,0.0766080645,-0.1571484875,0.1553396740,,, +2.4023437500,2,-0.3163013398,-0.0180068099,-0.1147890978,0.2041728927,,, +2.4042968750,2,-0.3433309584,-0.1068393735,-0.0530277005,0.2114244188,,, +2.4062500000,2,-0.3166449874,-0.1740808465,0.0125429991,0.1858858158,,, +2.4082031250,2,-0.2509721668,-0.2047435723,0.0648804027,0.1398805359,,, +2.4101562500,2,-0.1634454731,-0.1896865856,0.0903898405,0.0863339054,,, +2.4121093750,2,-0.0710611673,-0.1279645987,0.0816932816,0.0366922685,,, +2.4140625000,2,0.0111586253,-0.0265607310,0.0381973233,-0.0002216669,,, +2.4160156250,2,0.0710810034,0.1010876768,-0.0346193823,-0.0185418201,,, +2.4179687500,2,0.0992353824,0.2385612654,-0.1278659258,-0.0145938135,,, +2.4199218750,2,0.0888723347,0.3708238049,-0.2324948932,0.0138045762,,, +2.4218750000,2,0.0378363271,0.4862706376,-0.3402064845,0.0663830654,,, +2.4238281250,2,-0.0485664895,0.5755774993,-0.4416357358,0.1382129402,,, +2.4257812500,2,-0.1562930169,0.6295380590,-0.5243663734,0.2184160023,,, +2.4277343750,2,-0.2643581987,0.6383838317,-0.5731226160,0.2912496991,,, +2.4296875000,2,-0.3487398797,0.5933371513,-0.5723442648,0.3390422620,,, +2.4316406250,2,-0.3875827289,0.4899718964,-0.5105759956,0.3463219744,,, +2.4335937500,2,-0.3673977743,0.3317465270,-0.3853724536,0.3046305317,,, +2.4355468750,2,-0.2871992614,0.1307668583,-0.2053966499,0.2154442822,,, +2.4375000000,2,-0.1579757820,-0.0948645153,0.0117414221,0.0893430484,,, +2.4394531250,2,0.0006407976,-0.3246622147,0.2434011159,-0.0568809670,,, +2.4414062500,2,0.1644901506,-0.5388085727,0.4657084328,-0.2035384114,,, +2.4433593750,2,0.3095932043,-0.7205760406,0.6571263355,-0.3316364700,,, +2.4453125000,2,0.4165603157,-0.8581491712,0.8014836812,-0.4261507341,,, +2.4472656250,2,0.4734018679,-0.9460077085,0.8900839608,-0.4781375130,,, +2.4492187500,2,0.4760448250,-0.9852554658,0.9221545297,-0.4851247845,,, +2.4511718750,2,0.4271472407,-0.9823210170,0.9034291976,-0.4500863694,,, +2.4531250000,2,0.3349013824,-0.9473486543,0.8445091981,-0.3803478110,,, +2.4550781250,2,0.2118754265,-0.8933855431,0.7598609755,-0.2866353902,,, +2.4570312500,2,0.0728136696,-0.8350717380,0.6660403570,-0.1813465173,,, +2.4589843750,2,-0.0676102658,-0.7859638285,0.5788178739,-0.0765985357,,, +2.4609375000,2,-0.1954991630,-0.7563228956,0.5111822089,0.0165721163,,, +2.4628906250,2,-0.2975267892,-0.7523293225,0.4727562312,0.0881561372,,, +2.4648437500,2,-0.3613451390,-0.7752103578,0.4689449019,0.1295588763,,, +2.4667968750,2,-0.3768058934,-0.8203895670,0.4998306556,0.1345518297,,, +2.4687500000,2,-0.3377948736,-0.8779707249,0.5598906067,0.1004443850,,, +2.4707031250,2,-0.2450255980,-0.9335606093,0.6376372590,0.0298627634,,, +2.4726562500,2,-0.1088468278,-0.9690874740,0.7152476699,-0.0674627754,,, +2.4746093750,2,0.0495073930,-0.9650063889,0.7698308019,-0.1741803764,,, +2.4765625000,2,0.1983364643,-0.9026663695,0.7754337829,-0.2659528867,,, +2.4785156250,2,0.2989082252,-0.7656632624,0.7053440813,-0.3139973100,,, +2.4804687500,2,0.3136464188,-0.5420575210,0.5367683493,-0.2909869971,,, +2.4824218750,2,0.2155256306,-0.2272080522,0.2564239731,-0.1778564726,,, +2.4843750000,2,-0.0066200146,0.1752560089,-0.1368103056,0.0324464995,,, +2.4863281250,2,-0.3469913946,0.6541611055,-0.6321058806,0.3343029168,,, +2.4882812500,2,-0.7835229638,1.1911429013,-1.2072548326,0.7099334341,,, +2.4902343750,2,-1.2802482200,1.7600261747,-1.8290574442,1.1309141155,,, +2.4921875000,2,-1.7918091813,2.3269385065,-2.4550114559,1.5612840661,,, +2.4941406250,2,-2.2687506025,2.8525178754,-3.0368641939,1.9615217144,,, +2.4960937500,2,-2.6621247724,3.2951841273,-3.5247267504,2.2922151887,,, +2.4980468750,2,-2.9272192916,3.6143835165,-3.8708869787,2.5171086680,,, +2.5000000000,2,-3.0268195471,3.7739757947,-4.0336155898,2.6058197861,,, +2.5019531250,2,-2.9346796543,3.7459404003,-3.9813222656,2.5367229452,,, +2.5039062500,2,-2.6392321250,3.5145187103,-3.6971569324,2.3000403198,,, +2.5058593750,2,-2.1458185977,3.0801742889,-3.1829702414,1.8998748879,,, +2.5078125000,2,-1.4759353850,2.4616987872,-2.4607832295,1.3539213717,,, +2.5097656250,2,-0.6646281410,1.6954774855,-1.5713697297,0.6915100920,,, +2.5117187500,2,0.2419326338,0.8322824576,-0.5709242337,-0.0485480590,,, +2.5136718750,2,1.1881145955,-0.0672266034,0.4730710234,-0.8197407167,,, +2.5156250000,2,2.1109299898,-0.9377551784,1.4867478097,-1.5700270052,,, +2.5175781250,2,2.9445166881,-1.7161017746,2.3967247003,-2.2458508039,,, +2.5195312500,2,3.6268368164,-2.3484028336,3.1381726294,-2.7977288617,,, +2.5214843750,2,4.1063977422,-2.7949763334,3.6610612925,-3.1854672117,,, +2.5234375000,2,4.3478658801,-3.0320924865,3.9336367870,-3.3821569953,,, +2.5253906250,2,4.3368138536,-3.0527242654,3.9447840759,-3.3774349730,,, +2.5273437500,2,4.0832903396,-2.8674743124,3.7061038383,-3.1799697145,,, +2.5292968750,2,3.6219400270,-2.5040501486,3.2516053898,-2.8174072410,,, +2.5312500000,2,3.0059940863,-2.0032300231,2.6324220314,-2.3316836825,,, +2.5332031250,2,2.2966150708,-1.4128079110,1.9082615489,-1.7709210607,,, +2.5351562500,2,1.5531188927,-0.7828999856,1.1402370368,-1.1821225259,,, +2.5371093750,2,0.8275707396,-0.1625997827,0.3862846291,-0.6070522463,,, +2.5390625000,2,0.1628953023,0.4038838490,-0.3026426729,-0.0804741625,,, +2.5410156250,2,-0.4078415847,0.8804909113,-0.8855298894,0.3707033962,,, +2.5429687500,2,-0.8624410821,1.2405454889,-1.3327380367,0.7282064009,,, +2.5449218750,2,-1.1904050057,1.4671743111,-1.6267094310,0.9829576825,,, +2.5468750000,2,-1.3921174822,1.5534024428,-1.7618057551,1.1344899010,,, +2.5488281250,2,-1.4766774304,1.5012769106,-1.7428521752,1.1893398535,,, +2.5507812500,2,-1.4603563121,1.3208290015,-1.5837410054,1.1598705086,,, +2.5527343750,2,-1.3659753610,1.0294827940,-1.3067097402,1.0637831466,,, +2.5546875000,2,-1.2217155610,0.6511237241,-0.9411474359,0.9231981997,,, +2.5566406250,2,-1.0587005870,0.2146817800,-0.5215863124,0.7628358779,,, +2.5585937500,2,-0.9075802312,-0.2477129627,-0.0850181558,0.6074535208,,, +2.5605468750,2,-0.7946480160,-0.7033180019,0.3325393407,0.4788668326,,, +2.5625000000,2,-0.7380523132,-1.1215500953,0.6996026476,0.3930207712,,, +2.5644531250,2,-0.7449761494,-1.4765790675,0.9923148037,0.3577549617,,, +2.5664062500,2,-0.8112320406,-1.7498257629,1.1966326829,0.3722371972,,, +2.5683593750,2,-0.9233515133,-1.9312028050,1.3086526636,0.4282690943,,, +2.5703125000,2,-1.0625478393,-2.0180210755,1.3324156624,0.5131720520,,, +2.5722656250,2,-1.2098734616,-2.0128182441,1.2764251867,0.6136192213,,, +2.5742187500,2,-1.3500304834,-1.9220289617,1.1512880239,0.7184218377,,, +2.5761718750,2,-1.4720334589,-1.7554935554,0.9690790003,0.8190344107,,, +2.5781250000,2,-1.5679561937,-1.5260457107,0.7433982157,0.9087264714,,, +2.5800781250,2,-1.6315516335,-1.2493844706,0.4896913946,0.9816294127,,, +2.5820312500,2,-1.6575435675,-0.9441115897,0.2254659783,1.0322160926,,, +2.5839843750,2,-1.6416583315,-0.6303170275,-0.0309442785,1.0554500212,,, +2.5859375000,2,-1.5802739663,-0.3262612274,-0.2630528713,1.0468892574,,, +2.5878906250,2,-1.4684716932,-0.0457730002,-0.4577643142,1.0016092238,,, +2.5898437500,2,-1.2984225300,0.2022024150,-0.6052420561,0.9131193749,,, +2.5917968750,2,-1.0616290738,0.4135104516,-0.6995765243,0.7748978423,,, +2.5937500000,2,-0.7546498555,0.5885886991,-0.7404718967,0.5843455368,,, +2.5957031250,2,-0.3842314791,0.7315375616,-0.7340926563,0.3462691517,,, +2.5976562500,2,0.0314090176,0.8490068449,-0.6924781434,0.0736881762,,, +2.5996093750,2,0.4656528198,0.9487712480,-0.6312735687,-0.2144029633,,, +2.6015625000,2,0.8893150413,1.0376382751,-0.5660103691,-0.4972643043,,, +2.6035156250,2,1.2768466216,1.1199546053,-0.5087954930,-0.7568395490,,, +2.6054687500,2,1.6107546877,1.1973216733,-0.4666343284,-0.9808408077,,, +2.6074218750,2,1.8830112973,1.2684299735,-0.4408631519,-1.1637517251,,, +2.6093750000,2,2.0935864638,1.3288737797,-0.4274984721,-1.3058422582,,, +2.6113281250,2,2.2472668954,1.3723176496,-0.4192647560,-1.4108488290,,, +2.6132812500,2,2.3499610966,1.3927908316,-0.4087475617,-1.4831914185,,, +2.6152343750,2,2.4056982067,1.3855649785,-0.3901532873,-1.5258365541,,, +2.6171875000,2,2.4151882584,1.3463453833,-0.3591476469,-1.5394194320,,, +2.6191406250,2,2.3758233891,1.2713615064,-0.3129792493,-1.5222664445,,, +2.6210937500,2,2.2831522091,1.1584693273,-0.2509708766,-1.4713295591,,, +2.6230468750,2,2.1334657745,1.0078688279,-0.1743073758,-1.3839180894,,, +2.6250000000,2,1.9262113077,0.8227984362,-0.0858421257,-1.2592998159,,, +2.6269531250,2,1.6660406349,0.6096173575,0.0105078173,-1.1001015663,,, +2.6289062500,2,1.3638939046,0.3765471507,0.1111937146,-0.9131731976,,, +2.6308593750,2,1.0351187795,0.1330535849,0.2129588120,-0.7083396137,,, +2.6328125000,2,0.6953916824,-0.1096555288,0.3111174386,-0.4955141395,,, +2.6347656250,2,0.3581896460,-0.3396370618,0.3996500938,-0.2830122967,,, +2.6367187500,2,0.0349628161,-0.5464474736,0.4732109202,-0.0778582182,,, +2.6386718750,2,-0.2642374628,-0.7216181266,0.5277322181,0.1137321311,,, +2.6406250000,2,-0.5301404272,-0.8581001999,0.5601294119,0.2859637245,,, +2.6425781250,2,-0.7530364118,-0.9505687353,0.5689413075,0.4325849019,,, +2.6445312500,2,-0.9230932927,-0.9950199098,0.5538413672,0.5471223121,,, +2.6464843750,2,-1.0328868706,-0.9876781810,0.5138338571,0.6247034761,,, +2.6484375000,2,-1.0798350624,-0.9254063584,0.4468233486,0.6637034604,,, +2.6503906250,2,-1.0679241064,-0.8065674044,0.3498467188,0.6668860534,,, +2.6523437500,2,-1.0084849848,-0.6311062161,0.2189481082,0.6419605991,,, +2.6542968750,2,-0.9191238411,-0.4014673869,0.0503681627,0.6007851236,,, +2.6562500000,2,-0.8218232151,-0.1244753267,-0.1571806482,0.5579057672,,, +2.6582031250,2,-0.7410046785,0.1876988049,-0.4010425427,0.5291381101,,, +2.6601562500,2,-0.7002444224,0.5174768966,-0.6735115512,0.5292916040,,, +2.6621093750,2,-0.7174189782,0.8416443307,-0.9600655239,0.5688011759,,, +2.6640625000,2,-0.8006627536,1.1318309459,-1.2384817326,0.6509818054,,, +2.6660156250,2,-0.9469025011,1.3567478559,-1.4803283358,0.7712017202,,, +2.6679687500,2,-1.1429746525,1.4855481787,-1.6542773705,0.9179256147,,, +2.6699218750,2,-1.3690584681,1.4918305538,-1.7307156085,1.0754128472,,, +2.6718750000,2,-1.6028128885,1.3576760260,-1.6866005808,1.2269070327,,, +2.6738281250,2,-1.8220131499,1.0760551296,-1.5084145280,1.3566501046,,, +2.6757812500,2,-2.0057768583,0.6512547182,-1.1929471342,1.4507509889,,, +2.6777343750,2,-2.1356191444,0.0986662214,-0.7474864804,1.4978696753,,, +2.6796875000,2,-2.1963544326,-0.5557893675,-0.1896678273,1.4897493106,,, +2.6816406250,2,-2.1757827920,-1.2773114530,0.4540039695,1.4208204226,,, +2.6835937500,2,-2.0631995838,-2.0242403041,1.1503421946,1.2869708537,,, +2.6855468750,2,-1.8489205143,-2.7493850631,1.8607373189,1.0850764569,,, +2.6875000000,2,-1.5265042803,-3.4013993048,2.5416148142,0.8144031928,,, +2.6894531250,2,-1.0975757945,-3.9266527695,3.1445461771,0.4797930270,,, +2.6914062500,2,-0.5769817074,-4.2715542234,3.6167076700,0.0950751684,,, +2.6933593750,2,0.0067293974,-4.3873860747,3.9050940573,-0.3169137501,,, +2.6953125000,2,0.6166804265,-4.2377930957,3.9649673116,-0.7285320238,,, +2.6972656250,2,1.2134256395,-3.8046832761,3.7670168835,-1.1116825450,,, +2.6992187500,2,1.7581900505,-3.0909269303,3.3008630383,-1.4401944266,,, +2.7011718750,2,2.2158519732,-2.1221366300,2.5776568708,-1.6919620879,,, +2.7031250000,2,2.5586786851,-0.9471820096,1.6317968194,-1.8515100961,,, +2.7050781250,2,2.7696350893,0.3648079760,0.5193787709,-1.9120147913,,, +2.7070312500,2,2.8444323884,1.7301955040,-0.6862127982,-1.8762656766,,, +2.7089843750,2,2.7915254992,3.0574307372,-1.9001266422,-1.7561567022,,, +2.7109375000,2,2.6296144137,4.2543490375,-3.0333241414,-1.5704338380,,, +2.7128906250,2,2.3845986180,5.2351737171,-3.9998505356,-1.3421405765,,, +2.7148437500,2,2.0874489414,5.9259224793,-4.7224508290,-1.0968489294,,, +2.7167968750,2,1.7706178293,6.2701610477,-5.1389711795,-0.8598687454,,, +2.7187500000,2,1.4625956968,6.2360670163,-5.2105318496,-0.6521006955,,, +2.7207031250,2,1.1847976563,5.8212765261,-4.9270140913,-0.4876740680,,, +2.7226562500,2,0.9519691037,5.0532988685,-4.3074836239,-0.3743228404,,, +2.7246093750,2,0.7732751131,3.9867896091,-3.3975633879,-0.3144279473,,, +2.7265625000,2,0.6529284718,2.6983375249,-2.2646691516,-0.3058691979,,, +2.7285156250,2,0.5905450490,1.2792969075,-0.9914974444,-0.3427656423,,, +2.7304687500,2,0.5810915750,-0.1717423850,0.3307615926,-0.4159069785,,, +2.7324218750,2,0.6153684165,-1.5568957023,1.6098121834,-0.5135382278,,, +2.7343750000,2,0.6814333886,-2.7874043885,2.7604213252,-0.6227888215,,, +2.7363281250,2,0.7652656931,-3.7900946058,3.7106096695,-0.7304322689,,, +2.7382812500,2,0.8500973322,-4.5108517497,4.4047365645,-0.8225348229,,, +2.7402343750,2,0.9161931178,-4.9166379053,4.8054027989,-0.8843290504,,, +2.7421875000,2,0.9423101597,-4.9961392936,4.8946121769,-0.9011840530,,, +2.7441406250,2,0.9081362508,-4.7584344741,4.6734026321,-0.8601626211,,, +2.7460937500,2,0.7962793310,-4.2307933907,4.1605250488,-0.7512316486,,, +2.7480468750,2,0.5933466888,-3.4565018925,3.3908661285,-0.5678409527,,, +2.7500000000,2,0.2906043654,-2.4921011927,2.4132042763,-0.3071796718,,, +2.7519531250,2,-0.1150623421,-1.4037982263,1.2872653546,0.0293827148,,, +2.7539062500,2,-0.6193936641,-0.2637749715,0.0808800042,0.4352779629,,, +2.7558593750,2,-1.2091707676,0.8538505854,-1.1332736666,0.8978304152,,, +2.7578125000,2,-1.8621309358,1.8781635429,-2.2824338988,1.3984238111,,, +2.7597656250,2,-2.5480159499,2.7463110928,-3.2986365809,1.9134231116,,, +2.7617187500,2,-3.2300936792,3.4067647793,-4.1222776772,2.4153392616,,, +2.7636718750,2,-3.8671912273,3.8222438836,-4.7055203915,2.8743289204,,, +2.7656250000,2,-4.4159668691,3.9723529023,-5.0155304085,3.2598314321,,, +2.7675781250,2,-4.8335110076,3.8546769829,-5.0363958768,3.5423525802,,, +2.7695312500,2,-5.0809456304,3.4849967783,-4.7705041386,3.6959189667,,, +2.7714843750,2,-5.1275785940,2.8963207609,-4.2389426979,3.7008929085,,, +2.7734375000,2,-4.9546456840,2.1354255095,-3.4794272321,3.5464098991,,, +2.7753906250,2,-4.5585690050,1.2586766274,-2.5433893975,3.2324623535,,, +2.7773437500,2,-3.9532413200,0.3291316735,-1.4939441756,2.7713720108,,, +2.7792968750,2,-3.1695343886,-0.5870137187,-0.4023945162,2.1873107185,,, +2.7812500000,2,-2.2511748234,-1.4265348033,0.6587505845,1.5131922602,,, +2.7832031250,2,-1.2493189127,-2.1351933601,1.6230654502,0.7866663186,,, +2.7851562500,2,-0.2187691076,-2.6707777733,2.4342190483,0.0473770943,,, +2.7871093750,2,0.7848128202,-3.0049027433,3.0485241535,-0.6650334652,,, +2.7890625000,2,1.7087218864,-3.1253701535,3.4383337334,-1.3136504628,,, +2.7910156250,2,2.5071672391,-3.0367139385,3.5938021387,-1.8670192474,,, +2.7929687500,2,3.1435192845,-2.7576395086,3.5212301955,-2.3005593788,,, +2.7949218750,2,3.5910463341,-2.3180222626,3.2405274182,-2.5969190009,,, +2.7968750000,2,3.8331846192,-1.7567126727,2.7832632532,-2.7460522231,,, +2.7988281250,2,3.8641043120,-1.1189343591,2.1903879221,-2.7455117625,,, +2.8007812500,2,3.6905072279,-0.4534204586,1.5100346633,-2.6016185490,,, +2.8027343750,2,3.3342984726,0.1903057573,0.7956931291,-2.3312629582,,, +2.8046875000,2,2.8335215126,0.7654047020,0.1031527079,-1.9624680342,,, +2.8066406250,2,2.2398399851,1.2314787469,-0.5138386082,-1.5325259016,,, +2.8085937500,2,1.6132588350,1.5574988036,-1.0079360712,-1.0842292715,,, +2.8105468750,2,1.0155897483,1.7242563103,-1.3424780445,-0.6612427553,,, +2.8125000000,2,0.5042867669,1.7254856861,-1.4944040152,-0.3037835907,,, +2.8144531250,2,0.1268603704,1.5667987973,-1.4549200964,-0.0447734129,,, +2.8164062500,2,-0.0850300972,1.2649270604,-1.2305168525,0.0942631708,,, +2.8183593750,2,-0.1202219227,0.8483421245,-0.8449068891,0.1064675200,,, +2.8203125000,2,0.0118445017,0.3562991086,-0.3381502185,-0.0003207180,,, +2.8222656250,2,0.2854364564,-0.1649556120,0.2381951527,-0.2067151775,,, +2.8242187500,2,0.6638104350,-0.6669877687,0.8271818769,-0.4856310851,,, +2.8261718750,2,1.1039535771,-1.1041275010,1.3725914443,-0.8057384727,,, +2.8281250000,2,1.5611470702,-1.4382802785,1.8248875681,-1.1347689656,,, +2.8300781250,2,1.9923004880,-1.6423261232,2.1454741529,-1.4419148056,,, +2.8320312500,2,2.3573107960,-1.7018617185,2.3087857785,-1.6988051193,,, +2.8339843750,2,2.6197661966,-1.6160696447,2.3033359564,-1.8800111805,,, +2.8359375000,2,2.7487543779,-1.3976758878,2.1322101677,-1.9643043590,,, +2.8378906250,2,2.7220309956,-1.0714527750,1.8125694256,-1.9368241069,,, +2.8398437500,2,2.5290545999,-0.6713087286,1.3737666002,-1.7911119963,,, +2.8417968750,2,2.1721835330,-0.2361592152,0.8537581470,-1.5298288472,,, +2.8437500000,2,1.6658680174,0.1952006847,0.2939619365,-1.1640531146,,, +2.8457031250,2,1.0357457847,0.5882566384,-0.2650130433,-0.7125544954,,, +2.8476562500,2,0.3183477652,0.9140284437,-0.7846909594,-0.2015788179,,, +2.8496093750,2,-0.4412556632,1.1493482903,-1.2297100010,0.3367883300,,, +2.8515625000,2,-1.1952997557,1.2791746525,-1.5717556558,0.8687583786,,, +2.8535156250,2,-1.8997426845,1.2997442588,-1.7944557608,1.3634002676,,, +2.8554687500,2,-2.5181016094,1.2193839454,-1.8952683547,1.7953454367,,, +2.8574218750,2,-3.0229695615,1.0568958428,-1.8843552136,2.1458205510,,, +2.8593750000,2,-3.3961408666,0.8387250703,-1.7818867381,2.4026755713,,, +2.8613281250,2,-3.6274562420,0.5950733317,-1.6139772028,2.5594816420,,, +2.8632812500,2,-3.7138417320,0.3560125285,-1.4086842721,2.6147591992,,, +2.8652343750,2,-3.6589783667,0.1484072289,-1.1929647038,2.5716689958,,, +2.8671875000,2,-3.4719268260,-0.0071033922,-0.9893685133,2.4369843023,,, +2.8691406250,2,-3.1653302892,-0.0983464555,-0.8133399290,2.2197981034,,, +2.8710937500,2,-2.7553183325,-0.1213633394,-0.6734046283,1.9314789987,,, +2.8730468750,2,-2.2626974814,-0.0786270681,-0.5732133153,1.5865529857,,, +2.8750000000,2,-1.7137857600,0.0226476081,-0.5134094709,1.2033218476,,, +2.8769531250,2,-1.1400030626,0.1720994903,-0.4930603389,0.8035984686,,, +2.8789062500,2,-0.5753354357,0.3568684139,-0.5095604044,0.4109348373,,, +2.8808593750,2,-0.0519817823,0.5613241502,-0.5571093802,0.0475708108,,, +2.8828125000,2,0.4029656692,0.7688740472,-0.6274844242,-0.2678433490,,, +2.8847656250,2,0.7681547196,0.9656463942,-0.7134062550,-0.5206111453,,, +2.8867187500,2,1.0281721509,1.1414011655,-0.8093679688,-0.7001131780,,, +2.8886718750,2,1.1743939013,1.2875323998,-0.9094711993,-0.8004455466,,, +2.8906250000,2,1.2040371551,1.3967739060,-1.0074205881,-0.8197635946,,, +2.8925781250,2,1.1174808105,1.4648782195,-1.0989183928,-0.7583728473,,, +2.8945312500,2,0.9172145548,1.4907097234,-1.1820539034,-0.6179887968,,, +2.8964843750,2,0.6091225373,1.4744063019,-1.2551542666,-0.4026683537,,, +2.8984375000,2,0.2041624290,1.4159441821,-1.3149207141,-0.1200165341,,, +2.9003906250,2,-0.2803492805,1.3146704293,-1.3556245352,0.2178938817,,, +2.9023437500,2,-0.8196997095,1.1687600374,-1.3683011518,0.5937755297,,, +2.9042968750,2,-1.3814308887,0.9743469928,-1.3398170681,0.9848633067,,, +2.9062500000,2,-1.9262883223,0.7252036533,-1.2528324620,1.3635749356,,, +2.9082031250,2,-2.4102120349,0.4138233226,-1.0874240215,1.6989241152,,, +2.9101562500,2,-2.7871167466,0.0338073642,-0.8242050582,1.9585029482,,, +2.9121093750,2,-3.0127708995,-0.4177743228,-0.4477338230,2.1112334240,,, +2.9140625000,2,-3.0488506055,-0.9394802676,0.0514515140,2.1302232753,,, +2.9160156250,2,-2.8663817828,-1.5250538685,0.6754248012,1.9951889690,,, +2.9179687500,2,-2.4494708438,-2.1612778437,1.4157243842,1.6951043348,,, +2.9199218750,2,-1.7984950617,-2.8253481643,2.2498868477,1.2304728561,,, +2.9218750000,2,-0.9304746369,-3.4849536202,3.1414165233,0.6135832952,,, +2.9238281250,2,0.1229621138,-4.1012658535,4.0432804644,-0.1329596689,,, +2.9257812500,2,1.3178394696,-4.6328482378,4.9023721542,-0.9778688059,,, +2.9277343750,2,2.5992020746,-5.0394072177,5.6635770679,-1.8821720113,,, +2.9296875000,2,3.9019875735,-5.2849009049,6.2730763864,-2.7998501181,,, +2.9316406250,2,5.1531553031,-5.3397562983,6.6811360641,-3.6793463712,,, +2.9335937500,2,6.2762315588,-5.1827587231,6.8452553368,-4.4667725622,,, +2.9355468750,2,7.1965453755,-4.8025044527,6.7330785189,-5.1095977768,,, +2.9375000000,2,7.8451743850,-4.1974206485,6.3235362599,-5.5594167480,,, +2.9394531250,2,8.1629508681,-3.3751429579,5.6073710361,-5.7747557638,,, +2.9414062500,2,8.1065417019,-2.3532503726,4.5895738401,-5.7253519975,,, +2.9433593750,2,7.6554072756,-1.1608552247,3.2929038108,-5.3970601465,,, +2.9453125000,2,6.8169340557,0.1608724485,1.7598461214,-4.7954650706,,, +2.9472656250,2,5.6285904050,1.5590735771,0.0528544713,-3.9473926911,,, +2.9492187500,2,4.1565864634,2.9701181836,-1.7469293561,-2.8999567189,,, +2.9511718750,2,2.4905765400,4.3220762566,-3.5435929106,-1.7168081865,,, +2.9531250000,2,0.7353564836,5.5385327613,-5.2325356608,-0.4722609043,,, +2.9550781250,2,-0.9996686035,6.5434660844,-6.7082238378,0.7561584090,,, +2.9570312500,2,-2.6120323973,7.2679077288,-7.8739824160,1.8958861000,,, +2.9589843750,2,-4.0145821662,7.6568015166,-8.6510952826,2.8852619935,,, +2.9609375000,2,-5.1384304078,7.6736116986,-8.9841740246,3.6756320845,,, +2.9628906250,2,-5.9336524990,7.3030606160,-8.8440572297,4.2318492157,,, +2.9648437500,2,-6.3707730015,6.5530798387,-8.2301578504,4.5333231999,,, +2.9667968750,2,-6.4423916349,5.4553338214,-7.1714451208,4.5751595719,,, +2.9687500000,2,-6.1630052640,4.0635748379,-5.7247853267,4.3680144230,,, +2.9707031250,2,-5.5670334130,2.4508719975,-3.9716679650,3.9366791610,,, +2.9726562500,2,-4.7070089158,0.7064371300,-2.0145784699,3.3187813543,,, +2.9746093750,2,-3.6520531167,-1.0694731300,0.0284450155,2.5636749924,,, +2.9765625000,2,-2.4841888940,-2.7727225771,2.0318989335,1.7297972709,,, +2.9785156250,2,-1.2913258641,-4.3026059677,3.8719810026,0.8796845149,,, +2.9804687500,2,-0.1585430219,-5.5689666645,5.4360463105,0.0737927906,,, +2.9824218750,2,0.8393717318,-6.4986932784,6.6311010272,-0.6347911292,,, +2.9843750000,2,1.6417154287,-7.0395151505,7.3886104568,-1.2030386341,,, +2.9863281250,2,2.2023674050,-7.1612004834,7.6658261411,-1.5983304544,,, +2.9882812500,2,2.4898812240,-6.8564984966,7.4467457644,-1.7985220054,,, +2.9902343750,2,2.4890789268,-6.1424019620,6.7438073197,-1.7930701657,,, +2.9921875000,2,2.2034061725,-5.0606687395,5.5990647281,-1.5846926023,,, +2.9941406250,2,1.6559303976,-3.6767816932,4.0834435956,-1.1900632612,,, +2.9960937500,2,0.8871165350,-2.0763049552,2.2925287383,-0.6382238141,,, +2.9980468750,2,-0.0498819259,-0.3581473112,0.3386087236,0.0327727892,,, +3.0000000000,3,-1.0934098293,1.3734632653,-1.6584028779,0.7788607999,33538:33538:33538,1.0000000000:2.0000000000:3.0000000000,0.0000000000:0.0000000000:0.0000000000 +3.0019531250,3,-2.1760475106,3.0159876708,-3.5786478139,1.5519313957,,, +3.0039062500,3,-3.2273091034,4.4743403174,-5.3087547761,2.3017591501,,, +3.0058593750,3,-4.1770075921,5.6662821387,-6.7480901622,2.9784014675,,, +3.0078125000,3,-4.9591984132,6.5277011931,-7.8150642704,3.5350063067,,, +3.0097656250,3,-5.5165853345,7.0173086739,-8.4529900624,3.9309439481,,, +3.0117187500,3,-5.8053067451,7.1199269404,-8.6346606198,4.1352000478,,, +3.0136718750,3,-5.7990323278,6.8468950671,-8.3638939384,4.1292666681,,, +3.0156250000,3,-5.4906743898,6.2324851056,-7.6724809705,3.9083290864,,, +3.0175781250,3,-4.8921974455,5.3284095525,-6.6147211035,3.4811015567,,, +3.0195312500,3,-4.0338666126,4.1992186723,-5.2626758818,2.8692740057,,, +3.0214843750,3,-2.9622805669,2.9179773241,-3.7013572805,2.1061044244,,, +3.0234375000,3,-1.7372552072,1.5616778631,-2.0233346911,1.2341991527,,, +3.0253906250,3,-0.4289382055,0.2078024396,-0.3245385396,0.3034622728,,, +3.0273437500,3,0.8861413457,-1.0690494977,1.3001691973,-0.6317057736,,, +3.0292968750,3,2.1320020517,-2.2027887861,2.7644761542,-1.5173250290,,, +3.0312500000,3,3.2409624854,-3.1420809081,3.9989353012,-2.3053402892,,, +3.0332031250,3,4.1584291919,-3.8539212931,4.9558209923,-2.9570229993,,, +3.0351562500,3,4.8439688692,-4.3239179505,5.6097021833,-3.4437361486,,, +3.0371093750,3,5.2712904353,-4.5543830318,5.9555533485,-3.7469166234,,, +3.0390625000,3,5.4296317426,-4.5618079282,6.0066518726,-3.8590408734,,, +3.0410156250,3,5.3264358928,-4.3751169590,5.7936022214,-3.7855030213,,, +3.0429687500,3,4.9897932941,-4.0342330720,5.3636008000,-3.5463296358,,, +3.0449218750,3,4.4684687914,-3.5874338279,4.7778345883,-3.1761839798,,, +3.0468750000,3,3.8276756464,-3.0872728268,4.1062794278,-2.7213633168,,, +3.0488281250,3,3.1411453360,-2.5855694836,3.4205480717,-2.2341789315,,, +3.0507812500,3,2.4816233002,-2.1276495965,2.7855653506,-1.7662179003,,, +3.0527343750,3,1.9121587682,-1.7470228209,2.2519004384,-1.3621621867,,, +3.0546875000,3,1.4799184875,-1.4620919013,1.8508073548,-1.0553977431,,, +3.0566406250,3,1.2124225487,-1.2747205956,1.5917733362,-0.8653424694,,, +3.0585937500,3,1.1156680460,-1.1703437298,1.4621134242,-0.7961149884,,, +3.0605468750,3,1.1748057930,-1.1209177922,1.4300719416,-0.8370264971,,, +3.0625000000,3,1.3579608754,-1.0906948186,1.4515759950,-0.9653149951,,, +3.0644531250,3,1.6224886272,-1.0425438005,1.4782038064,-1.1506034581,,, +3.0664062500,3,1.9218520599,-0.9440629042,1.4651156507,-1.3597996806,,, +3.0683593750,3,2.2111330199,-0.7735993004,1.3785054796,-1.5610432159,,, +3.0703125000,3,2.4505456244,-0.5236577925,1.1999233318,-1.7262278886,,, +3.0722656250,3,2.6073522250,-0.1997834948,0.9257034468,-1.8323543238,,, +3.0742187500,3,2.6567157985,0.1826338461,0.5640548049,-1.8621086473,,, +3.0761718750,3,2.5820691868,0.6009675879,0.1325959063,-1.8041032128,,, +3.0781250000,3,2.3747776373,1.0279972361,-0.3443404775,-1.6526148710,,, +3.0800781250,3,2.0336411980,1.4350170810,-0.8389023108,-1.4072003464,,, +3.0820312500,3,1.5659177151,1.7942138452,-1.3217693168,-1.0733846552,,, +3.0839843750,3,0.9885849868,2.0809011106,-1.7639944831,-0.6635133621,,, +3.0859375000,3,0.3271611020,2.2771610438,-2.1409046094,-0.1958631486,,, +3.0878906250,3,-0.3864312141,2.3749079473,-2.4356964172,0.3069183627,,, +3.0898437500,3,-1.1149109540,2.3753709363,-2.6392143736,0.8185602295,,, +3.0917968750,3,-1.8181386706,2.2865393482,-2.7481371642,1.3109035779,,, +3.0937500000,3,-2.4579065724,2.1208246785,-2.7640170257,1.7572414422,,, +3.0957031250,3,-3.0015310159,1.8925695193,-2.6918361174,2.1348085988,,, +3.0976562500,3,-3.4246920885,1.6168790827,-2.5396501158,2.4267576413,,, +3.0996093750,3,-3.7155840487,1.3107509124,-2.3208489948,2.6250888206,,, +3.1015625000,3,-3.8763638599,0.9928917290,-2.0543769207,2.7316618974,,, +3.1035156250,3,-3.9196025234,0.6809718983,-1.7610498101,2.7556576192,,, +3.1054687500,3,-3.8641073145,0.3892583443,-1.4600709911,2.7106022480,,, +3.1074218750,3,-3.7323688622,0.1270977791,-1.1668360335,2.6125436345,,, +3.1093750000,3,-3.5489896626,-0.1017104357,-0.8918859710,2.4789253748,,, +3.1113281250,3,-3.3404654450,-0.2969002447,-0.6428235982,2.3284536579,,, +3.1132812500,3,-3.1351940728,-0.4582536950,-0.4277301480,2.1811540371,,, +3.1152343750,3,-2.9617349549,-0.5831576296,-0.2570730218,2.0571872849,,, +3.1171875000,3,-2.8448750812,-0.6654747669,-0.1437160280,1.9741080113,,, +3.1191406250,3,-2.8002254795,-0.6959239794,-0.1010438648,1.9430719332,,, +3.1210937500,3,-2.8300682893,-0.6643674071,-0.1395712990,1.9658878913,,, +3.1230468750,3,-2.9235957474,-0.5623471360,-0.2645323389,2.0351438096,,, +3.1250000000,3,-3.0602995245,-0.3845528085,-0.4753907345,2.1365617719,,, +3.1269531250,3,-3.2120594907,-0.1307503935,-0.7645386709,2.2504287847,,, +3.1289062500,3,-3.3430199871,0.1911771406,-1.1142986113,2.3514436566,,, +3.1308593750,3,-3.4112590003,0.5636282907,-1.4958348115,2.4098391049,,, +3.1328125000,3,-3.3751030490,0.9610160808,-1.8726126408,2.3958258748,,, +3.1347656250,3,-3.2012138206,1.3531914211,-2.2059944554,2.2853171994,,, +3.1367187500,3,-2.8700607796,1.7084477312,-2.4596912308,2.0638206235,,, +3.1386718750,3,-2.3780443420,1.9965207178,-2.6032698970,1.7279966040,,, +3.1406250000,3,-1.7367141655,2.1916056930,-2.6148664410,1.2851923544,,, +3.1425781250,3,-0.9692189254,2.2740045051,-2.4817953771,0.7510050334,,, +3.1445312500,3,-0.1057498847,2.2305228730,-2.1996651753,0.1461087548,,, +3.1464843750,3,0.8200750999,2.0544712211,-1.7713706481,-0.5062694556,,, +3.1484375000,3,1.7733387595,1.7458252790,-1.2066549574,-1.1818264913,,, +3.1503906250,3,2.7188278848,1.3119988649,-0.5225778876,-1.8558543423,,, +3.1523437500,3,3.6218500807,0.7682983085,0.2562769084,-2.5037851369,,, +3.1542968750,3,4.4491880513,0.1373170836,1.0986645701,-3.1018604821,,, +3.1562500000,3,5.1699496132,-0.5517276396,1.9675685143,-3.6277285707,,, +3.1582031250,3,5.7568344383,-1.2634358596,2.8209901173,-4.0613221826,,, +3.1601562500,3,6.1882394468,-1.9580211491,3.6142889037,-4.3863612962,,, +3.1621093750,3,6.4508938724,-2.5954190559,4.3049120225,-4.5923007527,,, +3.1640625000,3,6.5423499964,-3.1400345046,4.8576958711,-4.6762067181,,, +3.1660156250,3,6.4721390914,-3.5641370751,5.2484744076,-4.6436741158,,, +3.1679687500,3,6.2609022738,-3.8502542170,5.4661440688,-4.5083204046,,, +3.1699218750,3,5.9374482710,-3.9926407263,5.5132520492,-4.2898208524,,, +3.1718750000,3,5.5335265846,-3.9964595118,5.4037330380,-4.0102753493,,, +3.1738281250,3,5.0775006740,-3.8754020986,5.1588365336,-3.6897446436,,, +3.1757812500,3,4.5895505315,-3.6493814828,4.8035556725,-3.3428470532,,, +3.1777343750,3,4.0798419796,-3.3416169363,4.3632922253,-2.9773947235,,, +3.1796875000,3,3.5498678671,-2.9752692323,3.8609672536,-2.5952124848,,, +3.1816406250,3,2.9964090524,-2.5717015814,3.3164345360,-2.1948290352,,, +3.1835937500,3,2.4157583084,-2.1498893011,2.7470809990,-1.7743847842,,, +3.1855468750,3,1.8063054389,-1.7254402973,2.1675988278,-1.3333768128,,, +3.1875000000,3,1.1702969656,-1.3107081075,1.5905863496,-0.8738704332,,, +3.1894531250,3,0.5152800820,-0.9166776714,1.0287711359,-0.4015690891,,, +3.1914062500,3,-0.1462441291,-0.5539197043,0.4958311272,0.0743884405,,, +3.1933593750,3,-0.7991970647,-0.2312164858,0.0044023022,0.5431300121,,, +3.1953125000,3,-1.4288681590,0.0469522814,-0.4371683315,0.9941922195,,, +3.1972656250,3,-2.0240485786,0.2830753705,-0.8282567967,1.4198124694,,, +3.1992187500,3,-2.5792591654,0.4875038334,-1.1774222966,1.8165379521,,, +3.2011718750,3,-3.0936671536,0.6755583386,-1.4992987881,2.1843713041,,, +3.2031250000,3,-3.5678049811,0.8634069491,-1.8097045419,2.5243183792,,, +3.2050781250,3,-4.0013869415,1.0665048854,-2.1235316467,2.8368062134,,, +3.2070312500,3,-4.3921142230,1.2993366889,-2.4541638507,3.1208505781,,, +3.2089843750,3,-4.7340608269,1.5735319479,-2.8112146274,3.3728552356,,, +3.2109375000,3,-5.0173039381,1.8950697013,-3.1977363402,3.5862213274,,, +3.2128906250,3,-5.2299141650,2.2624960032,-3.6090589638,3.7526297833,,, +3.2148437500,3,-5.3604508366,2.6666886252,-4.0332585579,3.8637413588,,, +3.2167968750,3,-5.4007747901,3.0928622185,-4.4538671303,3.9132309969,,, +3.2187500000,3,-5.3490193141,3.5236587065,-4.8536637105,3.8989956188,,, +3.2207031250,3,-5.2095442368,3.9397107552,-5.2152025846,3.8231444976,,, +3.2226562500,3,-4.9892402312,4.3178871238,-5.5181155739,3.6893365165,,, +3.2246093750,3,-4.6935889847,4.6312333302,-5.7379839839,3.5000363770,,, +3.2265625000,3,-4.3246028725,4.8511278654,-5.8478574462,3.2551919535,,, +3.2285156250,3,-3.8803383394,4.9491367462,-5.8199147678,2.9519812675,,, +3.2304687500,3,-3.3561747453,4.8987138285,-5.6274580440,2.5857701689,,, +3.2324218750,3,-2.7483352115,4.6781701707,-5.2487302573,2.1527003446,,, +3.2343750000,3,-2.0584398786,4.2741097583,-4.6714520346,1.6530318553,,, +3.2363281250,3,-1.2971920747,3.6843611205,-3.8966276790,1.0938712632,,, +3.2382812500,3,-0.4857951395,2.9204058452,-2.9412379173,0.4903170065,,, +3.2402343750,3,0.3459345483,2.0081789862,-1.8384632656,-0.1357670616,,, +3.2421875000,3,1.1642043847,0.9862456671,-0.6346456283,-0.7590380664,,, +3.2441406250,3,1.9358434035,-0.0970485513,0.6147165737,-1.3539914198,,, +3.2460937500,3,2.6308643554,-1.1860783530,1.8480821845,-1.8968336777,,, +3.2480468750,3,3.2237164684,-2.2215495003,3.0016837080,-2.3665142656,,, +3.2500000000,3,3.6943880248,-3.1457109148,4.0148246248,-2.7457749843,,, +3.2519531250,3,4.0290636337,-3.9068547999,4.8343619694,-3.0218776268,,, +3.2539062500,3,4.2192808642,-4.4622645431,5.4172868039,-3.1862157238,,, +3.2558593750,3,4.2600628121,-4.7809637219,5.7328289731,-3.2332173616,,, +3.2578125000,3,4.1492584070,-4.8463691046,5.7647931397,-3.1600872648,,, +3.2597656250,3,3.8890952692,-4.6580858174,5.5136705594,-2.9680333298,,, +3.2617187500,3,3.4886050324,-4.2327908928,4.9981094284,-2.6640464086,,, +3.2636718750,3,2.9649227439,-3.6034566044,4.2544915169,-2.2617956829,,, +3.2656250000,3,2.3430508834,-2.8165826391,3.3341949846,-1.7813260342,,, +3.2675781250,3,1.6552656329,-1.9294548297,2.3007860854,-1.2485080178,,, +3.2695312500,3,0.9400525038,-1.0077740033,1.2274367761,-0.6941885664,,, +3.2714843750,3,0.2391378857,-0.1208940758,0.1915590098,-0.1518528178,,, +3.2734375000,3,-0.4072226143,0.6655701893,-0.7335192795,0.3461221335,,, +3.2753906250,3,-0.9649138192,1.2968624771,-1.4865849171,0.7721957975,,, +3.2773437500,3,-1.4093448378,1.7344334836,-2.0245116209,1.1064226975,,, +3.2792968750,3,-1.7267183120,1.9586920892,-2.3251699467,1.3376019002,,, +3.2812500000,3,-1.9121970987,1.9677288873,-2.3856724369,1.4619894546,,, +3.2832031250,3,-1.9662056930,1.7739529516,-2.2181490150,1.4805422110,,, +3.2851562500,3,-1.8917714583,1.4023901692,-1.8473883776,1.3969955294,,, +3.2871093750,3,-1.6935085222,0.8895290865,-1.3094407601,1.2171242209,,, +3.2890625000,3,-1.3776625351,0.2797960767,-0.6482615913,0.9485470594,,, +3.2910156250,3,-0.9537805035,-0.3789523051,0.0881305556,0.6015537750,,, +3.2929687500,3,-0.4374418039,-1.0392298207,0.8505306573,0.1906929135,,, +3.2949218750,3,0.1482945631,-1.6582019795,1.5922090334,-0.2645997309,,, +3.2968750000,3,0.7738295176,-2.2016559882,2.2729026988,-0.7410280105,,, +3.2988281250,3,1.4050669459,-2.6448347455,2.8601312101,-1.2129712601,,, +3.3007812500,3,2.0058023145,-2.9712338571,3.3286849976,-1.6540616755,,, +3.3027343750,3,2.5420058960,-3.1729378225,3.6620808617,-2.0401598549,,, +3.3046875000,3,2.9869745624,-3.2516485327,3.8549025327,-2.3529693367,,, +3.3066406250,3,3.3227927269,-3.2169914636,3.9115765455,-2.5808932052,,, +3.3085937500,3,3.5383836577,-3.0829150758,3.8424323597,-2.7174094244,,, +3.3105468750,3,3.6286722612,-2.8651701268,3.6610852482,-2.7603091549,,, +3.3125000000,3,3.5953706661,-2.5805506182,3.3839249733,-2.7121831769,,, +3.3144531250,3,3.4471081653,-2.2472601376,3.0304895363,-2.5805448077,,, +3.3164062500,3,3.1978270594,-1.8847385486,2.6228618863,-2.3767166369,,, +3.3183593750,3,2.8637562134,-1.5113279777,2.1826621284,-2.1135315937,,, +3.3203125000,3,2.4608785438,-1.1413323299,1.7276187748,-1.8032915932,,, +3.3222656250,3,2.0039623483,-0.7838670466,1.2702482152,-1.4569565476,,, +3.3242187500,3,1.5060407399,-0.4428135732,0.8176935054,-1.0837470047,,, +3.3261718750,3,0.9783735148,-0.1167731810,0.3716893908,-0.6910889615,,, +3.3281250000,3,0.4317150915,0.1999262073,-0.0701503795,-0.2855871251,,, +3.3300781250,3,-0.1224560459,0.5148160868,-0.5117533356,0.1258600606,,, +3.3320312500,3,-0.6724741476,0.8348346903,-0.9564483270,0.5361428703,,, +3.3339843750,3,-1.2081787830,1.1646393977,-1.4058490423,0.9388931522,,, +3.3359375000,3,-1.7223298559,1.5061168304,-1.8597842781,1.3293739696,,, +3.3378906250,3,-2.2117465694,1.8594949415,-2.3176460433,1.7053628169,,, +3.3398437500,3,-2.6781419450,2.2246468100,-2.7798208738,2.0678724538,,, +3.3417968750,3,-3.1272281427,2.6008914851,-3.2472524188,2.4205401315,,, +3.3437500000,3,-3.5653090438,2.9861689977,-3.7197623189,2.7672219483,,, +3.3457031250,3,-3.9943599901,3.3767032105,-4.1944325880,3.1086033320,,, +3.3476562500,3,-4.4075343929,3.7659420611,-4.6634289589,3.4390334873,,, +3.3496093750,3,-4.7876093145,4.1424402259,-5.1116220317,3.7452531605,,, +3.3515625000,3,-5.1097075123,4.4889429618,-5.5164654961,4.0081624467,,, +3.3535156250,3,-5.3463348748,4.7833130620,-5.8502052968,4.2063561733,,, +3.3554687500,3,-5.4714888000,4.9998834296,-6.0822376781,4.3190586668,,, +3.3574218750,3,-5.4628262718,5.1116654992,-6.1817417778,4.3278338084,,, +3.3593750000,3,-5.3029121264,5.0939803123,-6.1213785314,4.2178457596,,, +3.3613281250,3,-4.9801147655,4.9275847675,-5.8804188110,3.9788348920,,, +3.3632812500,3,-4.4890343526,4.6003059413,-5.4463583542,3.6056118054,,, +3.3652343750,3,-3.8309003420,4.1084809325,-4.8163397143,3.0985112860,,, +3.3671875000,3,-3.0142826896,3.4581683878,-3.9984445784,2.4640244103,,, +3.3691406250,3,-2.0561066616,2.6652004285,-3.0119930307,1.7154955416,,, +3.3710937500,3,-0.9836291318,1.7550063067,-1.8878775591,0.8744648524,,, +3.3730468750,3,0.1628402050,0.7624892629,-0.6691307431,-0.0274591441,,, +3.3750000000,3,1.3291230219,-0.2696347003,0.5904303595,-0.9482250587,,, +3.3769531250,3,2.4505951836,-1.2940622721,1.8301104998,-1.8380583370,,, +3.3789062500,3,3.4594810702,-2.2627065106,2.9877846534,-2.6448820717,,, +3.3808593750,3,4.2941010704,-3.1315222023,4.0067835550,-3.3211944421,,, +3.3828125000,3,4.9075670896,-3.8657269609,4.8429697699,-3.8306418320,,, +3.3847656250,3,5.2735539887,-4.4427880395,5.4689653660,-4.1523382521,,, +3.3867187500,3,5.3882729540,-4.8526455892,5.8748295591,-4.2822573255,,, +3.3886718750,3,5.2686507005,-5.0968058296,6.0666959948,-4.2319160484,,, +3.3906250000,3,4.9470303938,-5.1862571321,6.0634174404,-4.0245571589,,, +3.3925781250,3,4.4644218125,-5.1379281860,5.8915105136,-3.6901399312,,, +3.3945312500,3,3.8652167847,-4.9717530163,5.5810659667,-3.2613747355,,, +3.3964843750,3,3.1940261820,-4.7091227021,5.1634955137,-2.7713708845,,, +3.3984375000,3,2.4930629591,-4.3705660852,4.6687155711,-2.2515519470,,, +3.4003906250,3,1.7999152946,-3.9728920074,4.1219498525,-1.7297470035,,, +3.4023437500,3,1.1470371507,-3.5287981488,3.5432564368,-1.2297546115,,, +3.4042968750,3,0.5621983849,-3.0483894554,2.9490640911,-0.7718033183,,, +3.4062500000,3,0.0679376554,-2.5397639825,2.3525930695,-0.3722195807,,, +3.4082031250,3,-0.3199714877,-2.0089797502,1.7634419940,-0.0423709379,,, +3.4101562500,3,-0.5937555326,-1.4604877114,1.1876740644,0.2121071150,,, +3.4121093750,3,-0.7540918733,-0.8979432464,0.6284599297,0.3915047548,,, +3.4140625000,3,-0.8101410802,-0.3261268537,0.0878449020,0.5017801514,,, +3.4160156250,3,-0.7792226934,0.2466583896,-0.4309692609,0.5539543939,,, +3.4179687500,3,-0.6854683196,0.8080873648,-0.9228269983,0.5630636365,,, +3.4199218750,3,-0.5567264506,1.3429167564,-1.3808445016,0.5461671336,,, +3.4218750000,3,-0.4199322869,1.8337060153,-1.7958985430,0.5192746963,,, +3.4238281250,3,-0.2965119232,2.2615677276,-2.1561495117,0.4943249652,,, +3.4257812500,3,-0.1994756113,2.6079514556,-2.4479312919,0.4774909578,,, +3.4277343750,3,-0.1324991631,2.8563345660,-2.6570656762,0.4688259412,,, +3.4296875000,3,-0.0906973011,2.9929497677,-2.7697413755,0.4628939562,,, +3.4316406250,3,-0.0632027604,3.0074709180,-2.7738220450,0.4506019115,,, +3.4335937500,3,-0.0374318984,2.8943192635,-2.6611467943,0.4222628865,,, +3.4355468750,3,-0.0038175426,2.6547152477,-2.4306144619,0.3710968278,,, +3.4375000000,3,0.0409451853,2.2994215832,-2.0914881523,0.2958636432,,, +3.4394531250,3,0.0934825351,1.8502384658,-1.6648126631,0.2014416863,,, +3.4414062500,3,0.1459138215,1.3379491730,-1.1809376379,0.0971372714,,, +3.4433593750,3,0.1891173576,0.7980359369,-0.6747481205,-0.0060995910,,, +3.4453125000,3,0.2158095012,0.2671642293,-0.1816538555,-0.0982326791,,, +3.4472656250,3,0.2227120953,-0.2193046170,0.2652382254,-0.1719467503,,, +3.4492187500,3,0.2107478586,-0.6294324776,0.6370926580,-0.2231024411,,, +3.4511718750,3,0.1827798924,-0.9355484358,0.9095267656,-0.2493492962,,, +3.4531250000,3,0.1403414175,-1.1143341025,1.0618556594,-0.2479351981,,, +3.4550781250,3,0.0816040856,-1.1485311399,1.0781186894,-0.2146275750,,, +3.4570312500,3,0.0015478285,-1.0302730404,0.9501270137,-0.1443980029,,, +3.4589843750,3,-0.1061191902,-0.7640920284,0.6806587336,-0.0332250809,,, +3.4609375000,3,-0.2460689279,-0.3687535314,0.2858262602,0.1196309086,,, +3.4628906250,3,-0.4186127394,0.1230803186,-0.2045780556,0.3097733627,,, +3.4648437500,3,-0.6185312552,0.6687747321,-0.7503764718,0.5274463962,,, +3.4667968750,3,-0.8361648568,1.2219467210,-1.3069398057,0.7592200741,,, +3.4687500000,3,-1.0598590613,1.7374936778,-1.8303803644,0.9903921606,,, +3.4707031250,3,-1.2780205222,2.1742446720,-2.2804913154,1.2067432304,,, +3.4726562500,3,-1.4801637038,2.4969424484,-2.6228090918,1.3955247973,,, +3.4746093750,3,-1.6574679616,2.6781620467,-2.8304822736,1.5461338254,,, +3.4765625000,3,-1.8033980064,2.6993036369,-2.8853122228,1.6507084958,,, +3.4785156250,3,-1.9147149097,2.5510241775,-2.7783707609,1.7049333060,,, +3.4804687500,3,-1.9921900823,2.2341972371,-2.5110012305,1.7087656065,,, +3.4824218750,3,-2.0395269591,1.7612815433,-2.0957253079,1.6660414184,,, +3.4843750000,3,-2.0605010371,1.1568046688,-1.5559046549,1.5827361356,,, +3.4863281250,3,-2.0561038210,0.4556149094,-0.9234085008,1.4648370031,,, +3.4882812500,3,-2.0230434029,-0.3010045575,-0.2347239162,1.3167286924,,, +3.4902343750,3,-1.9543147097,-1.0688177414,0.4720338991,1.1410006932,,, +3.4921875000,3,-1.8423535778,-1.8018558807,1.1574331995,0.9403639399,,, +3.4941406250,3,-1.6834387538,-2.4538960690,1.7809567297,0.7203453661,,, +3.4960937500,3,-1.4802983786,-2.9828103942,2.3042435672,0.4902522539,,, +3.4980468750,3,-1.2414709728,-3.3554365147,2.6956042026,0.2618665424,,, +3.5000000000,3,-0.9785262052,-3.5504498289,2.9332810111,0.0470680097,,, +3.5019531250,3,-0.7022861435,-3.5605871803,3.0083639339,-0.1451100582,,, +3.5039062500,3,-0.4188646147,-3.3941298575,2.9270722682,-0.3114350803,,, +3.5058593750,3,-0.1274692357,-3.0734126690,2.7099319082,-0.4557287290,,, +3.5078125000,3,0.1786083335,-2.6316259003,2.3886213009,-0.5877079487,,, +3.5097656250,3,0.5087456263,-2.1096421034,2.0022700609,-0.7203436260,,, +3.5117187500,3,0.8710704450,-1.5516221598,1.5925222738,-0.8665210913,,, +3.5136718750,3,1.2688007596,-1.0004642080,1.1985503144,-1.0358093457,,, +3.5156250000,3,1.6976467393,-0.4954022911,0.8542529497,-1.2323370330,,, +3.5175781250,3,2.1446693516,-0.0700894966,0.5862575918,-1.4537223299,,, +3.5195312500,3,2.5890326972,0.2500417748,0.4117861321,-1.6910717577,,, +3.5214843750,3,3.0054460609,0.4491509175,0.3383485122,-1.9309418622,,, +3.5234375000,3,3.3692572293,0.5210933600,0.3649772582,-2.1586096091,,, +3.5253906250,3,3.6605763720,0.4701745085,0.4826349446,-2.3605772046,,, +3.5273437500,3,3.8660204662,0.3119074983,0.6740128072,-2.5255147867,,, +3.5292968750,3,3.9779458267,0.0718946271,0.9143555514,-2.6439145620,,, +3.5312500000,3,3.9921263932,-0.2167305290,1.1731737399,-2.7069905274,,, +3.5332031250,3,3.9060413079,-0.5161937541,1.4164013323,-2.7060448726,,, +3.5351562500,3,3.7187957837,-0.7878657419,1.6097296693,-2.6331202307,,, +3.5371093750,3,3.4317962780,-0.9965040711,1.7225072336,-2.4822815004,,, +3.5390625000,3,3.0496835817,-1.1129943699,1.7303717160,-2.2507907432,,, +3.5410156250,3,2.5818046507,-1.1159737876,1.6170268676,-1.9404237853,,, +3.5429687500,3,2.0437379228,-0.9937274033,1.3762618580,-1.5588866476,,, +3.5449218750,3,1.4579642240,-0.7456263661,1.0133459819,-1.1205836316,,, +3.5468750000,3,0.8532712599,-0.3829021951,0.5455178496,-0.6464334563,,, +3.5488281250,3,0.2624153377,0.0705487632,0.0020601745,-0.1625723175,,, +3.5507812500,3,-0.2822222910,0.5793055864,-0.5778259002,0.3026542710,,, +3.5527343750,3,-0.7539728621,1.1014940088,-1.1508169767,0.7231896926,,, +3.5546875000,3,-1.1363338078,1.5953612697,-1.6763318189,1.0795296811,,, +3.5566406250,3,-1.4251473214,2.0245079158,-2.1216305059,1.3612408373,,, +3.5585937500,3,-1.6284770858,2.3621868467,-2.4655077208,1.5678049774,,, +3.5605468750,3,-1.7647889870,2.5944206939,-2.7005214833,1.7081349639,,, +3.5625000000,3,-1.8595379013,2.7203310111,-2.8323906954,1.7984758980,,, +3.5644531250,3,-1.9404430812,2.7504640954,-2.8773234422,1.8590308664,,, +3.5664062500,3,-2.0321606959,2.7040696386,-2.8582924836,1.9099600333,,, +3.5683593750,3,-2.1508084652,2.6042174643,-2.7994156691,1.9667699401,,, +3.5703125000,3,-2.2998340282,2.4718331034,-2.7197580480,2.0362939931,,, +3.5722656250,3,-2.4695925254,2.3217379516,-2.6298096502,2.1155222390,,, +3.5742187500,3,-2.6408803098,2.1612438018,-2.5311651519,2.1935750490,,, +3.5761718750,3,-2.7904465813,1.9907915390,-2.4184696215,2.2554035931,,, +3.5781250000,3,-2.8962227674,1.8067702807,-2.2831775910,2.2857915974,,, +3.5800781250,3,-2.9405156862,1.6046263229,-2.1170414571,2.2721188353,,, +3.5820312500,3,-2.9111111275,1.3800044473,-1.9133654802,2.2053426312,,, +3.5839843750,3,-2.8016714881,1.1293129933,-1.6675826127,2.0803993623,,, +3.5859375000,3,-2.6116973305,0.8514745789,-1.3787483793,1.8965923624,,, +3.5878906250,3,-2.3454150619,0.5491660524,-1.0503266288,1.6571615608,,, +3.5898437500,3,-2.0105293995,0.2285195232,-0.6896123558,1.3684100750,,, +3.5917968750,3,-1.6184719673,-0.1011997263,-0.3075029541,1.0397991634,,, +3.5937500000,3,-1.1857781441,-0.4281211127,0.0816359261,0.6847393598,,, +3.5957031250,3,-0.7345634228,-0.7393928173,0.4612742810,0.3205491655,,, +3.5976562500,3,-0.2907131452,-1.0225745396,0.8143742306,-0.0330339078,,, +3.5996093750,3,0.1197180873,-1.2660852655,1.1246564798,-0.3563055039,,, +3.6015625000,3,0.4745737606,-1.4599392949,1.3782158508,-0.6324257733,,, +3.6035156250,3,0.7591402025,-1.5971217534,1.5655501755,-0.8500600183,,, +3.6054687500,3,0.9681443194,-1.6745061485,1.6828170223,-1.0048966265,,, +3.6074218750,3,1.1053618153,-1.6928861355,1.7317483764,-1.0994035887,,, +3.6093750000,3,1.1806580412,-1.6562418315,1.7182828977,-1.1407515414,,, +3.6113281250,3,1.2058759950,-1.5704384935,1.6504352933,-1.1378590529,,, +3.6132812500,3,1.1922088683,-1.4427998511,1.5372847137,-1.0996034699,,, +3.6152343750,3,1.1493034702,-1.2831843133,1.3896735441,-1.0345167922,,, +3.6171875000,3,1.0844001538,-1.1044402180,1.2203806939,-0.9503634560,,, +3.6191406250,3,1.0018092772,-0.9208521544,1.0426620817,-0.8534406872,,, +3.6210937500,3,0.9039194918,-0.7460816651,0.8687414149,-0.7487248324,,, +3.6230468750,3,0.7930564830,-0.5917854809,0.7090937685,-0.6407136885,,, +3.6250000000,3,0.6728109578,-0.4664562150,0.5717944912,-0.5339616887,,, +3.6269531250,3,0.5485753989,-0.3750073020,0.4623116265,-0.4332794289,,, +3.6289062500,3,0.4271646352,-0.3200081368,0.3844762750,-0.3437651088,,, +3.6308593750,3,0.3153202485,-0.3032483656,0.3414547844,-0.2702172747,,, +3.6328125000,3,0.2181850016,-0.3259052592,0.3355191250,-0.2161949291,,, +3.6347656250,3,0.1386029095,-0.3877713344,0.3672126796,-0.1833921352,,, +3.6367187500,3,0.0765757458,-0.4865361940,0.4345997268,-0.1711327531,,, +3.6386718750,3,0.0290046293,-0.6170760792,0.5325956857,-0.1760399878,,, +3.6406250000,3,-0.0087291461,-0.7712148093,0.6531457538,-0.1930042412,,, +3.6425781250,3,-0.0395298705,-0.9384345190,0.7866103617,-0.2174573507,,, +3.6445312500,3,-0.0625291713,-1.1060867230,0.9224451654,-0.2467494095,,, +3.6464843750,3,-0.0737122473,-1.2586096300,1.0483921612,-0.2795251674,,, +3.6484375000,3,-0.0677344851,-1.3779698556,1.1504190808,-0.3146505482,,, +3.6503906250,3,-0.0397844782,-1.4459326835,1.2141963709,-0.3505895988,,, +3.6523437500,3,0.0123580491,-1.4463541987,1.2265525033,-0.3846550673,,, +3.6542968750,3,0.0868064422,-1.3672237369,1.1768522506,-0.4125414479,,, +3.6562500000,3,0.1777692262,-1.2031223766,1.0591348152,-0.4290897218,,, +3.6582031250,3,0.2777557678,-0.9572888458,0.8743941445,-0.4302545995,,, +3.6601562500,3,0.3814848438,-0.6426413638,0.6323775172,-0.4159001935,,, +3.6621093750,3,0.4898989430,-0.2817508984,0.3525121891,-0.3923933405,,, +3.6640625000,3,0.6115357596,0.0952599098,0.0624369433,-0.3729533207,,, +3.6660156250,3,0.7600994852,0.4553765640,-0.2065456735,-0.3748874794,,, +3.6679687500,3,0.9492740482,0.7680143531,-0.4252504159,-0.4148983090,,, +3.6699218750,3,1.1865510113,1.0089171864,-0.5714318398,-0.5041528453,,, +3.6718750000,3,1.4682503825,1.1624801874,-0.6329604420,-0.6445122479,,, +3.6738281250,3,1.7776809328,1.2229341467,-0.6092242708,-0.8270112605,,, +3.6757812500,3,2.0864040326,1.1944802667,-0.5108551015,-1.0325554306,,, +3.6777343750,3,2.3568040065,1.0912856058,-0.3590210054,-1.2334885413,,, +3.6796875000,3,2.5457171382,0.9374363371,-0.1844542899,-1.3958677490,,, +3.6816406250,3,2.6105590525,0.7647235024,-0.0240907423,-1.4839428406,,, +3.6835937500,3,2.5166292805,0.6079692936,0.0846045759,-1.4660813157,,, +3.6855468750,3,2.2421341211,0.5002608824,0.1088132341,-1.3192874055,,, +3.6875000000,3,1.7805851138,0.4688844559,0.0243082532,-1.0318699725,,, +3.6894531250,3,1.1424746069,0.5316737832,-0.1811218991,-0.6055409847,,, +3.6914062500,3,0.3561692923,0.6946770134,-0.5055331076,-0.0566497327,,, +3.6933593750,3,-0.5333869372,0.9513201434,-0.9324600476,0.5843992199,,, +3.6953125000,3,-1.4687445904,1.2825484154,-1.4320418033,1.2757646368,,, +3.6972656250,3,-2.3860313742,1.6589199093,-1.9642715905,1.9685946177,,, +3.6992187500,3,-3.2213455883,2.0447896308,-2.4840601495,2.6122283183,,, +3.7011718750,3,-3.9164997229,2.4025459733,-2.9461601276,3.1590235594,,, +3.7031250000,3,-4.4244400033,2.6965087856,-3.3097069861,3.5689069813,,, +3.7050781250,3,-4.7134137335,2.8972630207,-3.5428147847,3.8132499860,,, +3.7070312500,3,-4.7671860261,2.9842136598,-3.6247363166,3.8757322884,,, +3.7089843750,3,-4.5818411627,2.9444138802,-3.5440892612,3.7500000256,,, +3.7109375000,3,-4.1640153367,2.7709570936,-3.2970568341,3.4381186905,,, +3.7128906250,3,-3.5327844418,2.4645306784,-2.8890987987,2.9522281722,,, +3.7148437500,3,-2.7224889443,2.0362129761,-2.3379201958,2.3171350461,,, +3.7167968750,3,-1.7833945143,1.5082407805,-1.6742275864,1.5709644931,,, +3.7187500000,3,-0.7784118751,0.9121902281,-0.9393952514,0.7625895537,,, +3.7207031250,3,0.2244041087,0.2842567115,-0.1797282366,-0.0544407182,,, +3.7226562500,3,1.1610074420,-0.3418472503,0.5616234980,-0.8297178580,,, +3.7246093750,3,1.9785522288,-0.9400006505,1.2505974149,-1.5220139938,,, +3.7265625000,3,2.6393131758,-1.4913512661,1.8628374244,-2.1017285029,,, +3.7285156250,3,3.1222637225,-1.9816348369,2.3817958777,-2.5511764977,,, +3.7304687500,3,3.4228600003,-2.3999833351,2.7976609388,-2.8641382397,,, +3.7324218750,3,3.5506409626,-2.7385911149,3.1064902777,-3.0442440696,,, +3.7343750000,3,3.5253735959,-2.9926518417,3.3092258739,-3.1025118176,,, +3.7363281250,3,3.3730981011,-3.1607827150,3.4110875586,-3.0549714285,,, +3.7382812500,3,3.1221353936,-3.2440604420,3.4198120575,-2.9198672913,,, +3.7402343750,3,2.7994729976,-3.2439162115,3.3430496361,-2.7147566572,,, +3.7421875000,3,2.4289995554,-3.1622097892,3.1880155126,-2.4553956306,,, +3.7441406250,3,2.0316739632,-3.0032075326,2.9631788435,-2.1564014377,,, +3.7460937500,3,1.6265597932,-2.7745769352,2.6793391788,-1.8321840667,,, +3.7480468750,3,1.2318504838,-2.4876000732,2.3500493844,-1.4976515923,,, +3.7500000000,3,0.8645463241,-2.1574992243,1.9918105591,-1.1680961026,,, +3.7519531250,3,0.5379690556,-1.8023665866,1.6226058868,-0.8573013714,,, +3.7539062500,3,0.2587467595,-1.4405674915,1.2590549143,-0.5748684916,,, +3.7558593750,3,0.0258176900,-1.0897445158,0.9153726660,-0.3252861463,,, +3.7578125000,3,-0.1682531960,-0.7683634073,0.6049733398,-0.1092098204,,, +3.7597656250,3,-0.3354098068,-0.4963401513,0.3414362371,0.0751697295,,, +3.7617187500,3,-0.4907455976,-0.2927764556,0.1369562008,0.2319119453,,, +3.7636718750,3,-0.6511310632,-0.1721144016,-0.0005104670,0.3675665844,,, +3.7656250000,3,-0.8328428132,-0.1398162298,-0.0702553390,0.4909305612,,, +3.7675781250,3,-1.0481234275,-0.1890191938,-0.0807713505,0.6118491557,,, +3.7695312500,3,-1.3022794881,-0.3000595898,-0.0494674267,0.7395168641,,, +3.7714843750,3,-1.5929898790,-0.4427180893,-0.0006549482,0.8813819701,,, +3.7734375000,3,-1.9114722226,-0.5804274449,0.0376514877,1.0426580306,,, +3.7753906250,3,-2.2445318532,-0.6757257128,0.0377481639,1.2260260082,,, +3.7773437500,3,-2.5774335208,-0.6946419319,-0.0248234219,1.4321658210,,, +3.7792968750,3,-2.8963159872,-0.6089463808,-0.1699946602,1.6606284486,,, +3.7812500000,3,-3.1878892460,-0.3982598230,-0.4113697904,1.9090233796,,, +3.7832031250,3,-3.4370147764,-0.0531636150,-0.7531135942,2.1705565482,,, +3.7851562500,3,-3.6252005059,0.4222772953,-1.1875370130,2.4323202871,,, +3.7871093750,3,-3.7315763240,1.0096766431,-1.6946443687,2.6756582116,,, +3.7890625000,3,-3.7356759965,1.6767791718,-2.2431638840,2.8780464359,,, +3.7910156250,3,-3.6208974269,2.3798829488,-2.7933566536,3.0159787283,,, +3.7929687500,3,-3.3775685068,3.0685313926,-3.3015919255,3.0682835030,,, +3.7949218750,3,-3.0043350104,3.6904950946,-3.7247617982,3.0184747813,,, +3.7968750000,3,-2.5072248814,4.1962228397,-4.0237155685,2.8554793378,,, +3.7988281250,3,-1.8971226672,4.5432300128,-4.1662684803,2.5733488062,,, +3.8007812500,3,-1.1874269896,4.6991533211,-4.1291513449,2.1707033675,,, +3.8027343750,3,-0.3936356367,4.6430286145,-3.8989429551,1.6508767951,,, +3.8046875000,3,0.4653003863,4.3668559936,-3.4736433294,1.0232779350,,, +3.8066406250,3,1.3659111216,3.8774536953,-2.8644165243,0.3046577254,,, +3.8085937500,3,2.2803720719,3.1960476156,-2.0951981442,-0.4810938932,,, +3.8105468750,3,3.1771730782,2.3559476191,-1.2006239401,-1.3040555764,,, +3.8125000000,3,4.0220565502,1.4005500945,-0.2241664556,-2.1294577724,,, +3.8144531250,3,4.7794237611,0.3807196969,0.7843380067,-2.9193614071,,, +3.8164062500,3,5.4142195924,-0.6498114921,1.7728858846,-3.6352556543,,, +3.8183593750,3,5.8943546577,-1.6390606159,2.6916349341,-4.2410026875,,, +3.8203125000,3,6.1931672130,-2.5394898827,3.4956711859,-4.7052147128,,, +3.8222656250,3,6.2912520661,-3.3093535002,4.1465264734,-5.0028161869,,, +3.8242187500,3,6.1785860435,-3.9142351100,4.6139153489,-5.1168590005,,, +3.8261718750,3,5.8580439011,-4.3295971196,4.8786115240,-5.0415380347,,, +3.8281250000,3,5.3476611882,-4.5426677217,4.9344905571,-4.7842171471,,, +3.8300781250,3,4.6777673126,-4.5514284651,4.7870291964,-4.3633166027,,, +3.8320312500,3,3.8848453830,-4.3626015870,4.4502422318,-3.8038183092,,, +3.8339843750,3,3.0071624848,-3.9918313195,3.9458143757,-3.1345751531,,, +3.8359375000,3,2.0820901229,-3.4642706436,3.3029472474,-2.3868255605,,, +3.8378906250,3,1.1425106415,-2.8118369922,2.5552891352,-1.5910931045,,, +3.8398437500,3,0.2137358059,-2.0685070017,1.7363978843,-0.7737858982,,, +3.8417968750,3,-0.6866490901,-1.2677976561,0.8776600471,0.0436820104,,, +3.8437500000,3,-1.5466092617,-0.4423436978,0.0084482211,0.8436428662,,, +3.8457031250,3,-2.3568802510,0.3766282295,-0.8436703142,1.6105792479,,, +3.8476562500,3,-3.1085153491,1.1591549808,-1.6522570827,2.3295263461,,, +3.8496093750,3,-3.7913524915,1.8755773242,-2.3908762015,2.9847981445,,, +3.8515625000,3,-4.3934542968,2.4975615339,-3.0338014029,3.5599484808,,, +3.8535156250,3,-4.9006855419,3.0011370739,-3.5583889209,4.0384572762,,, +3.8554687500,3,-5.2966014432,3.3684198004,-3.9464486892,4.4042096244,,, +3.8574218750,3,-5.5635575243,3.5875723164,-4.1844593784,4.6421985872,,, +3.8593750000,3,-5.6844352981,3.6529917390,-4.2641049350,4.7396925985,,, +3.8613281250,3,-5.6440922682,3.5656947678,-4.1829054708,4.6872929745,,, +3.8632812500,3,-5.4309265224,3.3333922939,-3.9446225093,4.4799639140,,, +3.8652343750,3,-5.0391287332,2.9707214179,-3.5599494230,4.1185428503,,, +3.8671875000,3,-4.4712934012,2.4989830492,-3.0468828700,3.6113166356,,, +3.8691406250,3,-3.7402335758,1.9445576105,-2.4298424001,2.9746690010,,, +3.8710937500,3,-2.8691352643,1.3369346248,-1.7381011698,2.2325515957,,, +3.8730468750,3,-1.8907621839,0.7072614045,-1.0044230271,1.4155180923,,, +3.8750000000,3,-0.8470379818,0.0866634179,-0.2636031583,0.5599221228,,, +3.8769531250,3,0.2111434857,-0.4959882102,0.4493845384,-0.2929184170,,, +3.8789062500,3,1.2253416905,-1.0154284464,1.1008060940,-1.0980553741,,, +3.8808593750,3,2.1332539329,-1.4502094422,1.6591751803,-1.8093078375,,, +3.8828125000,3,2.8745067579,-1.7833359137,2.0970801473,-2.3831253317,,, +3.8847656250,3,3.3979690544,-2.0032441832,2.3936314212,-2.7835203616,,, +3.8867187500,3,3.6696568968,-2.1043215064,2.5366686378,-2.9872243335,,, +3.8886718750,3,3.6791262565,-2.0879364570,2.5250353454,-2.9880493455,,, +3.8906250000,3,3.4421312338,-1.9639248426,2.3703716791,-2.7990394009,,, +3.8925781250,3,2.9991136893,-1.7510788997,2.0971535447,-2.4516752391,,, +3.8945312500,3,2.4099203932,-1.4765902429,1.7410298441,-1.9923683802,,, +3.8964843750,3,1.7443052032,-1.1733475498,1.3444702303,-1.4756146493,,, +3.8984375000,3,1.0699616388,-0.8737815242,0.9490679885,-0.9544833705,,, +3.9003906250,3,0.4434158161,-0.6040212113,0.5887547573,-0.4730011279,,, +3.9023437500,3,-0.0933945775,-0.3822368886,0.2876961223,-0.0634558651,,, +3.9042968750,3,-0.5128463135,-0.2190465413,0.0606937896,0.2533082371,,, +3.9062500000,3,-0.8001290482,-0.1171992449,-0.0867191993,0.4670532747,,, +3.9082031250,3,-0.9516901580,-0.0717994517,-0.1577355746,0.5771014270,,, +3.9101562500,3,-0.9741073261,-0.0723563625,-0.1623562408,0.5909685121,,, +3.9121093750,3,-0.8830657323,-0.1054521841,-0.1149994403,0.5228607011,,, +3.9140625000,3,-0.7018045525,-0.1579513901,-0.0315562325,0.3916590372,,, +3.9160156250,3,-0.4591718405,-0.2204640523,0.0738440135,0.2185711108,,, +3.9179687500,3,-0.1878064757,-0.2874192436,0.1893021912,0.0259549572,,, +3.9199218750,3,0.0779756977,-0.3532148522,0.3025214343,-0.1627719519,,, +3.9218750000,3,0.3057375457,-0.4097030803,0.3995855847,-0.3245563465,,, +3.9238281250,3,0.4696420799,-0.4472539369,0.4668874610,-0.4400201651,,, +3.9257812500,3,0.5541051455,-0.4563204576,0.4932177889,-0.4962616515,,, +3.9277343750,3,0.5557088381,-0.4288939670,0.4713692925,-0.4885280172,,, +3.9296875000,3,0.4846350751,-0.3622507218,0.4014766754,-0.4223306946,,, +3.9316406250,3,0.3642949212,-0.2624492497,0.2937448206,-0.3143479825,,, +3.9335937500,3,0.2266405876,-0.1425224492,0.1659241648,-0.1888941778,,, +3.9355468750,3,0.1046131154,-0.0176859827,0.0377361962,-0.0716192297,,, +3.9375000000,3,0.0258161135,0.0970187309,-0.0724585437,0.0152321255,,, +3.9394531250,3,0.0096372745,0.1870063445,-0.1485375125,0.0547214519,,, +3.9414062500,3,0.0671409340,0.2388553039,-0.1772073529,0.0355151441,,, +3.9433593750,3,0.2020771300,0.2421226610,-0.1492332404,-0.0481580766,,, +3.9453125000,3,0.4118747037,0.1919594164,-0.0613158713,-0.1962775159,,, +3.9472656250,3,0.6879208018,0.0902024640,0.0830967425,-0.4028468814,,, +3.9492187500,3,1.0148958063,-0.0563583592,0.2750568174,-0.6560380011,,, +3.9511718750,3,1.3698828392,-0.2374133523,0.5010706860,-0.9380975019,,, +3.9531250000,3,1.7224510264,-0.4384120345,0.7425389859,-1.2251644157,,, +3.9550781250,3,2.0363111895,-0.6400428526,0.9757139623,-1.4881409440,,, +3.9570312500,3,2.2720463025,-0.8190375914,1.1729654200,-1.6946699482,,, +3.9589843750,3,2.3902061103,-0.9494873089,1.3045399361,-1.8115075277,,, +3.9609375000,3,2.3552649439,-1.0054018137,1.3415146662,-1.8078438674,,, +3.9628906250,3,2.1409828343,-0.9647182326,1.2602325195,-1.6599800077,,, +3.9648437500,3,1.7359352903,-0.8124232142,1.0460608192,-1.3558224566,,, +3.9667968750,3,1.1475079863,-0.5419750289,0.6954344774,-0.8978586466,,, +3.9687500000,3,0.4031463944,-0.1566656509,0.2172298362,-0.3043887659,,, +3.9707031250,3,-0.4520736064,0.3290883453,-0.3667505461,0.3915758858,,, +3.9726562500,3,-1.3609954996,0.8895690761,-1.0228938543,1.1457381561,,, +3.9746093750,3,-2.2607699642,1.4882794947,-1.7076431008,1.9066951938,,, +3.9765625000,3,-3.0881560155,2.0795063306,-2.3699529593,2.6197769959,,, +3.9785156250,3,-3.7838601605,2.6126467267,-2.9557486842,3.2311860004,,, +3.9804687500,3,-4.2969381124,3.0386622740,-3.4141079984,3.6928736788,,, +3.9824218750,3,-4.5887497551,3.3156315479,-3.7026160042,3.9668430417,,, +3.9843750000,3,-4.6348300000,3.4121284773,-3.7905005874,4.0274315665,,, +3.9863281250,3,-4.4247013485,3.3092611401,-3.6602258121,3.8618632392,,, +3.9882812500,3,-3.9616850425,3.0019903763,-3.3085066313,3.4705636592,,, +3.9902343750,3,-3.2639337852,2.5000769792,-2.7473018556,2.8681201552,,, +3.9921875000,3,-2.3657294588,1.8287812880,-2.0046687012,2.0843267463,,, +3.9941406250,3,-1.3174395103,1.0279831671,-1.1240452745,1.1638690352,,, +3.9960937500,3,-0.1833427455,0.1481284093,-0.1605015853,0.1636312877,,, +3.9980468750,3,0.9623307439,-0.7553363786,0.8246271107,-0.8516135390,,, +4.0000000000,4,2.0406647199,-1.6261287289,1.7682711595,-1.8138806323,33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000 +4.0019531250,4,2.9743732998,-2.4101662625,2.6094903528,-2.6569409023,,, +4.0039062500,4,3.6941066289,-3.0581873378,3.2930130128,-3.3211257879,,, +4.0058593750,4,4.1444885294,-3.5278043743,3.7722494449,-3.7577900603,,, +4.0078125000,4,4.2907811373,-3.7866501255,4.0133276670,-3.9345267220,,, +4.0097656250,4,4.1237965389,-3.8162784162,3.9993402451,-3.8395280177,,, +4.0117187500,4,3.6595912363,-3.6133397023,3.7312221732,-3.4817785353,,, +4.0136718750,4,2.9361498049,-3.1893280571,3.2267997289,-2.8888898648,,, +4.0156250000,4,2.0109929107,-2.5729181371,2.5221282102,-2.1063629893,,, +4.0175781250,4,0.9584020708,-1.8117461090,1.6722941987,-1.1964273080,,, +4.0195312500,4,-0.1360443353,-0.9682291230,0.7468186571,-0.2332383304,,, +4.0214843750,4,-1.1819097202,-0.1118281770,-0.1780174453,0.7037013960,,, +4.0234375000,4,-2.0897941105,0.6879891157,-1.0261607807,1.5355480335,,, +4.0253906250,4,-2.7784106549,1.3698492301,-1.7298933209,2.1912110880,,, +4.0273437500,4,-3.1835502129,1.8897606459,-2.2393194578,2.6160243194,,, +4.0292968750,4,-3.2663742526,2.2259499156,-2.5281256561,2.7785349429,,, +4.0312500000,4,-3.0186856983,2.3779269920,-2.5940248217,2.6735006021,,, +4.0332031250,4,-2.4646857577,2.3634954366,-2.4567597026,2.3220066057,,, +4.0351562500,4,-1.6594670257,2.2145343271,-2.1543838354,1.7691298591,,, +4.0371093750,4,-0.6847432923,1.9720444995,-1.7383249445,1.0796206069,,, +4.0390625000,4,0.3586306456,1.6820169018,-1.2683773931,0.3318385623,,, +4.0410156250,4,1.3617850502,1.3904957777,-0.8062192120,-0.3908583615,,, +4.0429687500,4,2.2201443451,1.1373902499,-0.4076559452,-1.0098783897,,, +4.0449218750,4,2.8444124197,0.9525883636,-0.1170109840,-1.4595676596,,, +4.0468750000,4,3.1705387569,0.8549669581,0.0359352472,-1.6937696518,,, +4.0488281250,4,3.1677083237,0.8515710721,0.0384299501,-1.6910709803,,, +4.0507812500,4,2.8417175369,0.9369943197,-0.1039689633,-1.4570875587,,, +4.0527343750,4,2.2336410792,1.0939922110,-0.3681649437,-1.0234038596,,, +4.0546875000,4,1.4150212133,1.2939660708,-0.7149866671,-0.4443886909,,, +4.0566406250,4,0.4797267559,1.4974874595,-1.0914534830,0.2080787593,,, +4.0585937500,4,-0.4670543351,1.6581895793,-1.4364008139,0.8527883549,,, +4.0605468750,4,-1.3209359446,1.7304559226,-1.6894078497,1.4093396832,,, +4.0625000000,4,-1.9892516329,1.6766524939,-1.7990924927,1.8073833518,,, +4.0644531250,4,-2.3995436007,1.4716065626,-1.7286517201,1.9934164196,,, +4.0664062500,4,-2.5061891816,1.1058907871,-1.4600193518,1.9359936265,,, +4.0683593750,4,-2.2954023325,0.5880907417,-0.9968365360,1.6295699307,,, +4.0703125000,4,-1.7869206047,-0.0556045674,-0.3645209886,1.0953841227,,, +4.0722656250,4,-1.0307668014,-0.7849243412,0.3932837091,0.3782465577,,, +4.0742187500,4,-0.1005558099,-1.5516634179,1.2211537298,-0.4597018914,,, +4.0761718750,4,0.9128138872,-2.3062495231,2.0585768285,-1.3451563470,,, +4.0781250000,4,1.9062218342,-3.0010657903,2.8437619614,-2.1979725155,,, +4.0800781250,4,2.7723780575,-3.5907546795,3.5157276520,-2.9363234541,,, +4.0820312500,4,3.4129175860,-4.0334994821,4.0183385373,-3.4852693036,,, +4.0839843750,4,3.7521445173,-4.2950525355,4.3066893930,-3.7865854746,,, +4.0859375000,4,3.7471884809,-4.3540233117,4.3536707229,-3.8067231158,,, +4.0878906250,4,3.3936974610,-4.2060912839,4.1546552240,-3.5416258424,,, +4.0898437500,4,2.7259516336,-3.8654921377,3.7287323287,-3.0172264200,,, +4.0917968750,4,1.8104338249,-3.3633674281,3.1159322191,-2.2849142543,,, +4.0937500000,4,0.7351338606,-2.7437688558,2.3715913467,-1.4136312411,,, +4.0957031250,4,-0.4012377125,-2.0593416437,1.5604421922,-0.4818249216,,, +4.0976562500,4,-1.4987948299,-1.3674742062,0.7513595223,0.4296866689,,, +4.0996093750,4,-2.4662103924,-0.7252314875,0.0110771251,1.2453999914,,, +4.1015625000,4,-3.2291620681,-0.1831133048,-0.6027600384,1.9024270319,,, +4.1035156250,4,-3.7348889317,0.2205276524,-1.0471342888,2.3551940893,,, +4.1054687500,4,-3.9544483421,0.4641245631,-1.2979094240,2.5784520617,,, +4.1074218750,4,-3.8839614284,0.5455925223,-1.3522927981,2.5690408875,,, +4.1093750000,4,-3.5435350830,0.4813435540,-1.2278044350,2.3449194115,,, +4.1113281250,4,-2.9742201000,0.3030981629,-0.9590148578,1.9421561565,,, +4.1132812500,4,-2.2340861202,0.0543571726,-0.5938109935,1.4112544545,,, +4.1152343750,4,-1.3934171694,-0.2148947115,-0.1880707155,0.8123321820,,, +4.1171875000,4,-0.5294427285,-0.4550042081,0.2009652907,0.2094642377,,, +4.1191406250,4,0.2793178574,-0.6212801338,0.5196751640,-0.3344244597,,, +4.1210937500,4,0.9602531115,-0.6759381045,0.7212741003,-0.7625933928,,, +4.1230468750,4,1.4551771578,-0.5901863215,0.7694699592,-1.0303327556,,, +4.1250000000,4,1.7271830155,-0.3466651866,0.6420143412,-1.1098838667,,, +4.1269531250,4,1.7637315974,0.0590937214,0.3325754359,-0.9926613448,,, +4.1289062500,4,1.5768673625,0.6174110796,-0.1482436164,-0.6896473638,,, +4.1308593750,4,1.2009279857,1.3028893462,-0.7722354027,-0.2304369694,,, +4.1328125000,4,0.6866104898,2.0741233497,-1.4947964121,0.3402984557,,, +4.1347656250,4,0.0920373052,2.8760662868,-2.2589477363,0.9689921618,,, +4.1367187500,4,-0.5262331110,3.6456604813,-3.0019386678,1.6004063046,,, +4.1386718750,4,-1.1198793551,4.3203068714,-3.6635145855,2.1843944273,,, +4.1406250000,4,-1.6528157176,4.8458910526,-4.1931766719,2.6809703394,,, +4.1425781250,4,-2.1021310038,5.1807311689,-4.5534776837,3.0621991431,,, +4.1445312500,4,-2.4554143496,5.2965997026,-4.7201096252,3.3109430116,,, +4.1464843750,4,-2.7060436864,5.1802252052,-4.6818393188,3.4185963418,,, +4.1484375000,4,-2.8489511742,4.8347932025,-4.4405422146,3.3831026805,,, +4.1503906250,4,-2.8787657654,4.2799102983,-4.0106169300,3.2078323985,,, +4.1523437500,4,-2.7914233605,3.5510488373,-3.4188744033,2.9023940886,,, +4.1542968750,4,-2.5877576575,2.6978941684,-2.7041009350,2.4842566395,,, +4.1562500000,4,-2.2762507944,1.7795994221,-1.9140450745,1.9787215928,,, +4.1582031250,4,-1.8739805188,0.8584792063,-1.1007959097,1.4172815838,,, +4.1601562500,4,-1.4055535070,-0.0056711952,-0.3162029442,0.8350606022,,, +4.1621093750,4,-0.8992404270,-0.7622944552,0.3941652807,0.2662272838,,, +4.1640625000,4,-0.3809746680,-1.3781943997,0.9986562379,-0.2623422847,,, +4.1660156250,4,0.1305586436,-1.8414304360,1.4836378393,-0.7352396382,,, +4.1679687500,4,0.6248862737,-2.1574026338,1.8506686119,-1.1476900752,,, +4.1699218750,4,1.0973765070,-2.3419590817,2.1106502742,-1.5018547678,,, +4.1718750000,4,1.5460742463,-2.4164264392,2.2793178066,-1.8034134134,,, +4.1738281250,4,1.9693069148,-2.4041969543,2.3740963718,-2.0590852538,,, +4.1757812500,4,2.3642773234,-2.3284988882,2.4120769045,-2.2750661978,,, +4.1777343750,4,2.7261035655,-2.2117433561,2.4093089031,-2.4562696841,,, +4.1796875000,4,3.0468565990,-2.0750373000,2.3802138710,-2.6055936802,,, +4.1816406250,4,3.3158414048,-1.9378255939,2.3373419425,-2.7238004930,,, +4.1835937500,4,3.5223802696,-1.8186095312,2.2924840199,-2.8110467992,,, +4.1855468750,4,3.6587094061,-1.7333498959,2.2560302563,-2.8676944264,,, +4.1875000000,4,3.7201859868,-1.6895979819,2.2324910562,-2.8923294913,,, +4.1894531250,4,3.7045728575,-1.6826785119,2.2174849260,-2.8802862393,,, +4.1914062500,4,3.6132144459,-1.6992192293,2.2008783760,-2.8260407527,,, +4.1933593750,4,3.4524425853,-1.7247179530,2.1730497004,-2.7271833938,,, +4.1953125000,4,3.2320739366,-1.7492861573,2.1289794925,-2.5859757880,,, +4.1972656250,4,2.9622097267,-1.7687894017,2.0683408634,-2.4080445963,,, +4.1992187500,4,2.6515208513,-1.7819688323,1.9928360802,-2.2001589111,,, +4.2011718750,4,2.3075248341,-1.7866455135,1.9033105962,-1.9686826675,,, +4.2031250000,4,1.9377419369,-1.7782018846,1.7988168106,-1.7193673375,,, +4.2050781250,4,1.5509981639,-1.7507997706,1.6777622941,-1.4581250096,,, +4.2070312500,4,1.1585082123,-1.6996406652,1.5397588759,-1.1919423248,,, +4.2089843750,4,0.7741524591,-1.6229791756,1.3871186433,-0.9294309301,,, +4.2109375000,4,0.4129797854,-1.5227928037,1.2250008669,-0.6803352559,,, +4.2128906250,4,0.0882495581,-1.4029920936,1.0594119698,-0.4535637081,,, +4.2148437500,4,-0.1909127869,-1.2667023708,0.8946452236,-0.2550532557,,, +4.2167968750,4,-0.4201696520,-1.1153727379,0.7324945494,-0.0870054409,,, +4.2187500000,4,-0.5996489740,-0.9498372157,0.5731698969,0.0516755135,,, +4.2207031250,4,-0.7334656532,-0.7724203461,0.4170053037,0.1643185301,,, +4.2226562500,4,-0.8293466607,-0.5890653342,0.2661075139,0.2552303356,,, +4.2246093750,4,-0.8976467979,-0.4092400761,0.1244376394,0.3289265493,,, +4.2265625000,4,-0.9485514299,-0.2434005577,-0.0034547985,0.3894167186,,, +4.2285156250,4,-0.9886959760,-0.1003110028,-0.1135035501,0.4391411365,,, +4.2304687500,4,-1.0208272293,0.0157678858,-0.2039519176,0.4795732530,,, +4.2324218750,4,-1.0470183645,0.1086207742,-0.2786928037,0.5143536013,,, +4.2343750000,4,-1.0721524755,0.1911105266,-0.3489027230,0.5518277459,,, +4.2363281250,4,-1.1061258177,0.2823571274,-0.4314998351,0.6052136819,,, +4.2382812500,4,-1.1649714254,0.4050872739,-0.5475271393,0.6922172647,,, +4.2402343750,4,-1.2698440115,0.5841372495,-0.7209222392,0.8341938725,,, +4.2421875000,4,-1.4433945372,0.8428087750,-0.9749170405,1.0529394494,,, +4.2441406250,4,-1.7046965939,1.1976197925,-1.3266903510,1.3656075721,,, +4.2460937500,4,-2.0638048287,1.6549036746,-1.7832575044,1.7800511337,,, +4.2480468750,4,-2.5170752005,2.2094137727,-2.3391472243,2.2916824438,,, +4.2500000000,4,-3.0450336130,2.8434871833,-2.9752503107,2.8821350062,,, +4.2519531250,4,-3.6143658750,3.5275880070,-3.6597888972,3.5205991737,,, +4.2539062500,4,-4.1833510756,4.2226689665,-4.3515316214,4.1675154306,,, +4.2558593750,4,-4.7076570268,4.8827137722,-5.0032233800,4.7782841447,,, +4.2578125000,4,-5.1443390946,5.4579353906,-5.5650531396,5.3063185523,,, +4.2597656250,4,-5.4543426941,5.9002379707,-5.9895544551,5.7068278737,,, +4.2617187500,4,-5.6048857619,6.1684921984,-6.2364466521,5.9409553904,,, +4.2636718750,4,-5.5721833150,6.2306658901,-6.2751092200,5.9786119558,,, +4.2656250000,4,-5.3427913037,6.0643960530,-6.0853447912,5.7997012661,,, +4.2675781250,4,-4.9123470329,5.6579562559,-5.6576675384,5.3942300635,,, +4.2695312500,4,-4.2838435195,5.0108275949,-4.9931146301,4.7619174577,,, +4.2714843750,4,-3.4679648317,4.1339459601,-4.1033101286,3.9124686612,,, +4.2734375000,4,-2.4847455045,3.0504807007,-3.0113391055,2.8667203338,,, +4.2753906250,4,-1.3645751307,1.7959469267,-1.7521049349,1.6572185836,,, +4.2773437500,4,-0.1484827081,0.4170662604,-0.3716821470,0.3278363418,,, +4.2792968750,4,1.1119067637,-1.0292137171,1.0732531568,-1.0666637385,,, +4.2812500000,4,2.3559655979,-2.4768585070,2.5165241330,-2.4617358004,,, +4.2832031250,4,3.5185270065,-3.8542657179,3.8861423592,-3.7865607930,,, +4.2851562500,4,4.5373266041,-5.0904194459,5.1108980302,-4.9704725690,,, +4.2871093750,4,5.3623537329,-6.1216394944,6.1281153974,-5.9512102271,,, +4.2890625000,4,5.9638068710,-6.8975953938,6.8905784890,-6.6826326975,,, +4.2910156250,4,6.3339694158,-7.3854417811,7.3702793572,-7.1385862300,,, +4.2929687500,4,6.4815893579,-7.5702401295,7.5571910914,-7.3111884782,,, +4.2949218750,4,6.4233358474,-7.4528905581,7.4553976123,-7.2064099634,,, +4.2968750000,4,6.1783067294,-7.0486946764,7.0806912087,-6.8413233290,,, +4.2988281250,4,5.7672043037,-6.3864640945,6.4599855974,-6.2435588233,,, +4.3007812500,4,5.2147241768,-5.5075141324,5.6314659533,-5.4516287252,,, +4.3027343750,4,4.5531411429,-4.4655004214,4.6454816386,-4.5156001650,,, +4.3046875000,4,3.8244217128,-3.3256762510,3.5643877933,-3.4965185590,,, +4.3066406250,4,3.0791796634,-2.1611061647,2.4591184882,-2.4629326562,,, +4.3085937500,4,2.3723344922,-1.0468216858,1.4032670716,-1.4851882562,,, +4.3105468750,4,1.7558367130,-0.0536594344,0.4661555950,-0.6286430166,,, +4.3125000000,4,1.2701662783,0.7585212415,-0.2947642469,0.0536798009,,, +4.3144531250,4,0.9374836697,1.3468442650,-0.8403406798,0.5272604475,,, +4.3164062500,4,0.7584172858,1.6878919089,-1.1524750293,0.7789826562,,, +4.3183593750,4,0.7126471685,1.7779852689,-1.2341354549,0.8172277578,,, +4.3203125000,4,0.7628299016,1.6341609468,-1.1088257962,0.6705171088,,, +4.3222656250,4,0.8610867361,1.2949906776,-0.8191659963,0.3845873541,,, +4.3242187500,4,0.9558628845,0.8192631895,-0.4238782042,0.0181616223,,, +4.3261718750,4,0.9975842368,0.2818143749,0.0068844701,-0.3620746273,,, +4.3281250000,4,0.9437651978,-0.2343371061,0.3987467471,-0.6881884647,,, +4.3300781250,4,0.7631608027,-0.6486142318,0.6821079063,-0.8988705045,,, +4.3320312500,4,0.4368906327,-0.8923470445,0.7994682454,-0.9452871314,,, +4.3339843750,4,-0.0426266844,-0.9154878151,0.7101486850,-0.7942347449,,, +4.3359375000,4,-0.6718696868,-0.6928391483,0.3948981963,-0.4311391157,,, +4.3378906250,4,-1.4352684180,-0.2288695959,-0.1402479684,0.1373583748,,, +4.3398437500,4,-2.3044283340,0.4432973369,-0.8644010571,0.8837210862,,, +4.3417968750,4,-3.2379425968,1.2683082661,-1.7263030286,1.7622918775,,, +4.3437500000,4,-4.1828721174,2.1763448666,-2.6603012494,2.7131343290,,, +4.3457031250,4,-5.0790072370,3.0913328090,-3.5935962411,3.6676151549,,, +4.3476562500,4,-5.8647147123,3.9386303101,-4.4536908078,4.5550491101,,, +4.3496093750,4,-6.4821461862,4.6496206405,-5.1733854541,5.3080347958,,, +4.3515625000,4,-6.8812708251,5.1649983174,-5.6943005339,5.8668338749,,, +4.3535156250,4,-7.0234313404,5.4393317015,-5.9709786830,6.1839831417,,, +4.3554687500,4,-6.8847631720,5.4447632439,-5.9743053979,6.2279740216,,, +4.3574218750,4,-6.4591353386,5.1726461568,-5.6934970311,5.9855003589,,, +4.3593750000,4,-5.7594089573,4.6344714064,-5.1373463954,5.4628071074,,, +4.3613281250,4,-4.8159714880,3.8613578823,-4.3338462320,4.6852898420,,, +4.3632812500,4,-3.6731575092,2.9013714331,-3.3277018314,3.6948917907,,, +4.3652343750,4,-2.3848947975,1.8162615822,-2.1770897318,2.5465648884,,, +4.3671875000,4,-1.0103273353,0.6778217641,-0.9499884549,1.3045476423,,, +4.3691406250,4,0.3898662103,-0.4377299820,0.2808475028,0.0380481618,,, +4.3710937500,4,1.7560071416,-1.4568784432,1.4438518117,-1.1835569528,,, +4.3730468750,4,3.0315476305,-2.3153075103,2.4741814035,-2.2953387764,,, +4.3750000000,4,4.1650887512,-2.9621971067,3.3176744326,-3.2405567574,,, +4.3769531250,4,5.1114252552,-3.3622999197,3.9329561654,-3.9732607539,,, +4.3789062500,4,5.8321921495,-3.4988937087,4.2939352163,-4.4611716351,,, +4.3808593750,4,6.2979279064,-3.3789136954,4.3939357541,-4.6895148909,,, +4.3828125000,4,6.4915302534,-3.0350214403,4.2479305770,-4.6632109455,,, +4.3847656250,4,6.4116485369,-2.5206486830,3.8900480797,-4.4054745303,,, +4.3867187500,4,6.0753989749,-1.9009297079,3.3683426943,-3.9544641281,,, +4.3886718750,4,5.5193189703,-1.2441933521,2.7397145891,-3.3601751803,,, +4.3906250000,4,4.7958089753,-0.6154179039,2.0649436814,-2.6808879889,,, +4.3925781250,4,3.9647123865,-0.0701071907,1.4022613097,-1.9771246371,,, +4.3945312500,4,3.0841679623,0.3510272497,0.8006959433,-1.3042585234,,, +4.3964843750,4,2.2040136536,0.6237475074,0.2962979142,-0.7070510372,,, +4.3984375000,4,1.3614743887,0.7388019336,-0.0888001678,-0.2167262182,,, +4.4003906250,4,0.5793584298,0.7002282978,-0.3462755378,0.1503349027,,, +4.4023437500,4,-0.1317619917,0.5238085488,-0.4802951259,0.3918383343,,, +4.4042968750,4,-0.7685982481,0.2351762772,-0.5050199567,0.5169812308,,, +4.4062500000,4,-1.3311996717,-0.1316760998,-0.4425660704,0.5440198456,,, +4.4082031250,4,-1.8221190006,-0.5360854655,-0.3217611155,0.4990819758,,, +4.4101562500,4,-2.2476918623,-0.9339222673,-0.1764649388,0.4151329480,,, +4.4121093750,4,-2.6189820271,-1.2818398346,-0.0426917554,0.3292913044,,, +4.4140625000,4,-2.9503135982,-1.5417350360,0.0456094294,0.2778688571,,, +4.4160156250,4,-3.2553351854,-1.6848091155,0.0613370120,0.2906522369,,, +4.4179687500,4,-3.5429138611,-1.6938068283,-0.0124059462,0.3869742389,,, +4.4199218750,4,-3.8152140764,-1.5633428985,-0.1812730878,0.5745210365,,, +4.4218750000,4,-4.0678952606,-1.3003130650,-0.4395817567,0.8493843999,,, +4.4238281250,4,-4.2908471113,-0.9247722010,-0.7702583399,1.1961037751,,, +4.4257812500,4,-4.4686895559,-0.4694181899,-1.1456128332,1.5883080067,,, +4.4277343750,4,-4.5810158880,0.0229659946,-1.5292844138,1.9906032996,,, +4.4296875000,4,-4.6025678645,0.5035537480,-1.8791247306,2.3616624605,,, +4.4316406250,4,-4.5044982809,0.9231696473,-2.1515339663,2.6586339627,,, +4.4335937500,4,-4.2582998167,1.2388143091,-2.3070415175,2.8422400535,,, +4.4355468750,4,-3.8424617632,1.4183585803,-2.3152880462,2.8808372061,,, +4.4375000000,4,-3.2493566578,1.4422943235,-2.1581798163,2.7528318492,,, +4.4394531250,4,-2.4885786698,1.3039708479,-1.8313607304,2.4483270509,,, +4.4414062500,4,-1.5854774827,1.0090914794,-1.3440516549,1.9701992432,,, +4.4433593750,4,-0.5775942818,0.5742730333,-0.7175791777,1.3342333943,,, +4.4453125000,4,0.4885961961,0.0257203889,0.0162098384,0.5685841659,,, +4.4472656250,4,1.5617750903,-0.6011928830,0.8165364956,-0.2878096864,,, +4.4492187500,4,2.5920393331,-1.2627485444,1.6365575049,-1.1888816188,,, +4.4511718750,4,3.5370751872,-1.9091711509,2.4273338127,-2.0860160912,,, +4.4531250000,4,4.3646224165,-2.4880989591,3.1413084024,-2.9312051585,,, +4.4550781250,4,5.0508643488,-2.9499514561,3.7355193343,-3.6792921814,,, +4.4570312500,4,5.5781178582,-3.2552878989,4.1756189423,-4.2910429184,,, +4.4589843750,4,5.9344724733,-3.3803972881,4.4391289760,-4.7360421265,,, +4.4609375000,4,6.1147941534,-3.3184360743,4.5163280347,-4.9942433649,,, +4.4628906250,4,6.1221119275,-3.0782383413,4.4101342426,-5.0573304995,,, +4.4648437500,4,5.9692337600,-2.6821845904,4.1356989914,-4.9298690672,,, +4.4667968750,4,5.6793235230,-2.1625202612,3.7185734077,-4.6285415575,,, +4.4687500000,4,5.2839959187,-1.5571629509,3.1915724788,-4.1795611753,,, +4.4707031250,4,4.8194753402,-0.9055136827,2.5910141533,-3.6153293894,,, +4.4726562500,4,4.3216747588,-0.2433185554,1.9520876030,-2.9702781974,,, +4.4746093750,4,3.8198339886,0.4021385807,1.3039455882,-2.2761597338,,, +4.4765625000,4,3.3298174400,1.0138633611,0.6663458595,-1.5582362792,,, +4.4785156250,4,2.8511242764,1.5831632085,0.0495637596,-0.8341901387,,, +4.4804687500,4,2.3704011560,2.1055665992,-0.5423736549,-0.1165133463,,, +4.4824218750,4,1.8689152627,2.5779749063,-1.1078051502,0.5839315661,,, +4.4843750000,4,1.3292275342,2.9986050051,-1.6456077529,1.2566557186,,, +4.4863281250,4,0.7394201567,3.3681199082,-2.1550896456,1.8925925890,,, +4.4882812500,4,0.0955958351,3.6896102467,-2.6356838921,2.4846687217,,, +4.4902343750,4,-0.5977347100,3.9669753867,-3.0860752877,3.0270519610,,, +4.4921875000,4,-1.3296654871,4.2033832074,-3.5039173955,3.5147077227,,, +4.4941406250,4,-2.0852887078,4.4001985526,-3.8858286476,3.9434796500,,, +4.4960937500,4,-2.8470061127,4.5548139512,-4.2261653988,4.3090213643,,, +4.4980468750,4,-3.5954936922,4.6583897752,-4.5153935022,4.6048170648,,, +4.5000000000,4,-4.3101227692,4.6964242454,-4.7400911113,4.8213545771,,, +4.5019531250,4,-4.9682868850,4.6515490207,-4.8843721065,4.9469718203,,, +4.5039062500,4,-5.5453058530,4.5063615984,-4.9318527665,4.9697772685,,, +4.5058593750,4,-6.0159495307,4.2466525734,-4.8683558930,4.8803520622,,, +4.5078125000,4,-6.3560856796,3.8644782952,-4.6843069915,4.6739257525,,, +4.5097656250,4,-6.5435516186,3.3591313170,-4.3753071620,4.3505881661,,, +4.5117187500,4,-6.5594558275,2.7372298399,-3.9420687779,3.9145829590,,, +4.5136718750,4,-6.3910417862,2.0133675207,-3.3911961909,3.3742639776,,, +4.5156250000,4,-6.0357941777,1.2095882329,-2.7360000324,2.7424630794,,, +4.5175781250,4,-5.5053776102,0.3537985509,-1.9970385052,2.0370930062,,, +4.5195312500,4,-4.8268339590,-0.5205869501,-1.2027235781,1.2821204550,,, +4.5214843750,4,-4.0390926164,-1.3750707111,-0.3883720049,0.5073923511,,, +4.5234375000,4,-3.1863971191,-2.1689037901,0.4072841241,-0.2538316727,,, +4.5253906250,4,-2.3118209221,-2.8631435574,1.1464186965,-0.9682525107,,, +4.5273437500,4,-1.4521605351,-3.4247861193,1.7962421780,-1.6058401637,,, +4.5292968750,4,-0.6351334909,-3.8306298148,2.3325705604,-2.1431597540,,, +4.5312500000,4,0.1196150992,-4.0686759557,2.7407837422,-2.5648608689,,, +4.5332031250,4,0.7969486341,-4.1372649370,3.0142424301,-2.8624689863,,, +4.5351562500,4,1.3839335505,-4.0456248664,3.1537259097,-3.0335774584,,, +4.5371093750,4,1.8704128130,-3.8151955289,3.1685371966,-3.0830263519,,, +4.5390625000,4,2.2504970670,-3.4780196800,3.0764005411,-3.0238242103,,, +4.5410156250,4,2.5230240806,-3.0739427276,2.9020291000,-2.8768929956,,, +4.5429687500,4,2.6920535772,-2.6498989820,2.6764606145,-2.6706381897,,, +4.5449218750,4,2.7691280822,-2.2584585915,2.4364205097,-2.4395658782,,, +4.5468750000,4,2.7756793552,-1.9514986385,2.2211174669,-2.2203439336,,, +4.5488281250,4,2.7421780633,-1.7705965511,2.0662927737,-2.0459128839,,, +4.5507812500,4,2.7034533858,-1.7390743978,1.9980705598,-1.9400264060,,, +4.5527343750,4,2.6924922923,-1.8584651588,2.0288994327,-1.9139033795,,, +4.5546875000,4,2.7342088904,-2.1091724637,2.1558762091,-1.9649195615,,, +4.5566406250,4,2.8394845048,-2.4542999205,2.3609891790,-2.0769995861,,, +4.5585937500,4,3.0012392278,-2.8459214553,2.6135007307,-2.2231179327,,, +4.5605468750,4,3.1945026885,-3.2326718825,2.8744510197,-2.3697913906,,, +4.5625000000,4,3.3800744450,-3.5668630646,3.1020914199,-2.4821386759,,, +4.5644531250,4,3.5109921827,-3.8088788730,3.2566953181,-2.5278602976,,, +4.5664062500,4,3.5420022472,-3.9278040025,3.3043095258,-2.4800463449,,, +4.5683593750,4,3.4399433737,-3.9010225329,3.2204251262,-2.3202874602,,, +4.5703125000,4,3.1900881080,-3.7156874589,2.9933438993,-2.0418803700,,, +4.5722656250,4,2.7962883442,-3.3704980532,2.6253016074,-1.6509076142,,, +4.5742187500,4,2.2776901398,-2.8763962976,2.1317141864,-1.1657723556,,, +4.5761718750,4,1.6647369158,-2.2568671305,1.5401545726,-0.6170180336,,, +4.5781250000,4,0.9955229620,-1.5453596252,0.8875434111,-0.0449441969,,, +4.5800781250,4,0.3135667957,-0.7779937514,0.2145095915,0.5068828535,,, +4.5820312500,4,-0.3338387906,0.0131695474,-0.4398182413,0.9980017244,,, +4.5839843750,4,-0.8992394714,0.8011632468,-1.0401660293,1.3938874523,,, +4.5859375000,4,-1.3404439489,1.5626072412,-1.5568047351,1.6681631653,,, +4.5878906250,4,-1.6252364596,2.2783991072,-1.9685029284,1.8067018999,,, +4.5898437500,4,-1.7346723905,2.9352964629,-2.2650184783,1.8108482577,,, +4.5917968750,4,-1.6656732359,3.5263214986,-2.4478360924,1.6975310250,,, +4.5937500000,4,-1.4330000015,4.0504208960,-2.5297869916,1.4970955512,,, +4.5957031250,4,-1.0699673166,4.5097202129,-2.5328106200,1.2488989365,,, +4.5976562500,4,-0.6253180314,4.9036268169,-2.4828234015,0.9947125496,,, +4.5996093750,4,-0.1548404708,5.2247236035,-2.4039137782,0.7722461915,,, +4.6015625000,4,0.2880756051,5.4600797114,-2.3151139433,0.6111234972,,, +4.6035156250,4,0.6583132499,5.5950388855,-2.2298393293,0.5313783487,,, +4.6054687500,4,0.9215008934,5.6164572775,-2.1564545874,0.5435198972,,, +4.6074218750,4,1.0549703677,5.5153345091,-2.0991565177,0.6492139383,,, +4.6093750000,4,1.0478274098,5.2883546882,-2.0585337016,0.8416059432,,, +4.6113281250,4,0.9003573840,4.9384886080,-2.0320336354,1.1058734102,,, +4.6132812500,4,0.6224679767,4.4758053066,-2.0153356751,1.4213377336,,, +4.6152343750,4,0.2302200849,3.9178537374,-2.0043177591,1.7642574841,,, +4.6171875000,4,-0.2577751637,3.2888038876,-1.9961975329,2.1096284472,,, +4.6191406250,4,-0.8202133621,2.6179587954,-1.9890324215,2.4320304669,,, +4.6210937500,4,-1.4297622205,1.9377298408,-1.9800878660,2.7062892447,,, +4.6230468750,4,-2.0515168226,1.2810104132,-1.9648212128,2.9089433870,,, +4.6250000000,4,-2.6454018817,0.6789087773,-1.9377809105,3.0214851617,,, +4.6269531250,4,-3.1700756671,0.1591685316,-1.8943369385,3.0339256326,,, +4.6289062500,4,-3.5862365593,-0.2555626399,-1.8313491384,2.9458720864,,, +4.6308593750,4,-3.8603796082,-0.5495518358,-1.7471839929,2.7654086340,,, +4.6328125000,4,-3.9702301131,-0.7157601272,-1.6420776555,2.5073989164,,, +4.6347656250,4,-3.9094885569,-0.7595787228,-1.5169890261,2.1897432438,,, +4.6367187500,4,-3.6886996122,-0.7030826006,-1.3706570423,1.8280617759,,, +4.6386718750,4,-3.3320320077,-0.5827134081,-1.1991156680,1.4341865005,,, +4.6406250000,4,-2.8712851654,-0.4395967808,-0.9986508457,1.0194270397,,, +4.6425781250,4,-2.3400526274,-0.3104375847,-0.7684767679,0.5975105537,,, +4.6445312500,4,-1.7715403220,-0.2230193730,-0.5120124774,0.1850571212,,, +4.6464843750,4,-1.1988813376,-0.1951813216,-0.2372589534,-0.1993021752,,, +4.6484375000,4,-0.6539527041,-0.2379656533,0.0453527918,-0.5377191339,,, +4.6503906250,4,-0.1640178102,-0.3612568725,0.3274605892,-0.8180188600,,, +4.6523437500,4,0.2523279546,-0.5754215071,0.6059443291,-1.0376433074,,, +4.6542968750,4,0.5885193328,-0.8878523532,0.8830849008,-1.2042205128,,, +4.6562500000,4,0.8498190174,-1.2995719180,1.1648559540,-1.3336003474,,, +4.6582031250,4,1.0479857301,-1.8026650864,1.4572895970,-1.4459911512,,, +4.6601562500,4,1.1947636756,-2.3769798154,1.7615993311,-1.5605386925,,, +4.6621093750,4,1.2986352855,-2.9890240803,2.0712629992,-1.6907293211,,, +4.6640625000,4,1.3645884630,-3.5947349778,2.3721654379,-1.8419552275,,, +4.6660156250,4,1.3963603476,-4.1435883430,2.6445927623,-2.0105711529,,, +4.6679687500,4,1.4009194445,-4.5836132082,2.8670239760,-2.1850961066,,, +4.6699218750,4,1.3914938043,-4.8682684210,3.0210617461,-2.3502169554,,, +4.6718750000,4,1.3859915377,-4.9626292857,3.0947422409,-2.4911656385,,, +4.6738281250,4,1.4022148953,-4.8467075051,3.0829806338,-2.5959103594,,, +4.6757812500,4,1.4528972544,-4.5177992521,2.9871069636,-2.6562206690,,, +4.6777343750,4,1.5413405562,-3.9920237720,2.8142001097,-2.6686657639,,, +4.6796875000,4,1.6579039512,-3.3022713398,2.5748551686,-2.6339626263,,, +4.6816406250,4,1.7811026901,-2.4941674157,2.2813123993,-2.5552487262,,, +4.6835937500,4,1.8857307632,-1.6233080045,1.9486508364,-2.4377213709,,, +4.6855468750,4,1.9524593100,-0.7510224411,1.5959992327,-2.2884315035,,, +4.6875000000,4,1.9716706084,0.0633611126,1.2442818080,-2.1144730736,,, +4.6894531250,4,1.9420629563,0.7688347830,0.9132945173,-1.9221579115,,, +4.6914062500,4,1.8692567090,1.3245042832,0.6214110487,-1.7190014083,,, +4.6933593750,4,1.7649690752,1.6997091705,0.3860590034,-1.5156165505,,, +4.6953125000,4,1.6437659804,1.8742957916,0.2226855866,-1.3255179567,,, +4.6972656250,4,1.5184547510,1.8392164129,0.1427708353,-1.1637753851,,, +4.6992187500,4,1.3974844283,1.5984623297,0.1515514766,-1.0444281930,,, +4.7011718750,4,1.2851505144,1.1704711639,0.2465209880,-0.9771297054,,, +4.7031250000,4,1.1842343967,0.5868943622,0.4180067773,-0.9650434406,,, +4.7050781250,4,1.0997295496,-0.1083286668,0.6502736285,-1.0035985191,,, +4.7070312500,4,1.0404024502,-0.8588444634,0.9216898631,-1.0795014472,,, +4.7089843750,4,1.0166312199,-1.5998632567,1.2059910139,-1.1723262173,,, +4.7109375000,4,1.0368062458,-2.2665609749,1.4754459700,-1.2586708747,,, +4.7128906250,4,1.1043284815,-2.8003389208,1.7030908537,-1.3151019587,,, +4.7148437500,4,1.2144541393,-3.1514020738,1.8630296159,-1.3190975299,,, +4.7167968750,4,1.3502674060,-3.2819160829,1.9307190487,-1.2502644339,,, +4.7187500000,4,1.4793597676,-3.1688907681,1.8831465219,-1.0912124269,,, +4.7207031250,4,1.5551608823,-2.8041641743,1.6990273082,-0.8274868892,,, +4.7226562500,4,1.5249921810,-2.1956193565,1.3622811949,-0.4500282425,,, +4.7246093750,4,1.3407378439,-1.3705457509,0.8678266128,0.0401362949,,, +4.7265625000,4,0.9676236142,-0.3738254287,0.2238948189,0.6310882190,,, +4.7285156250,4,0.3911000746,0.7400753761,-0.5497265159,1.3039164844,,, +4.7304687500,4,-0.3791167210,1.9139647171,-1.4238365073,2.0364557742,,, +4.7324218750,4,-1.3109975007,3.0912871978,-2.3622734899,2.8056640123,,, +4.7343750000,4,-2.3572159900,4.2189472140,-3.3256448280,3.5894604580,,, +4.7363281250,4,-3.4620619290,5.2497459517,-4.2740456784,4.3661615522,,, +4.7382812500,4,-4.5646265798,6.1435714637,-5.1672233067,5.1112594535,,, +4.7402343750,4,-5.5992820568,6.8690363597,-5.9644771923,5.7955382585,,, +4.7421875000,4,-6.4974580575,7.4057154648,-6.6265017411,6.3869668351,,, +4.7441406250,4,-7.1919649909,7.7437287112,-7.1175421868,6.8534444904,,, +4.7460937500,4,-7.6209545288,7.8796101557,-7.4055046665,7.1631656265,,, +4.7480468750,4,-7.7315984715,7.8127255159,-7.4621200506,7.2846820674,,, +4.7500000000,4,-7.4871631141,7.5461107858,-7.2669774900,7.1908735012,,, +4.7519531250,4,-6.8754905567,7.0889309220,-6.8133929720,6.8655514614,,, +4.7539062500,4,-5.9127577245,6.4555316802,-6.1105345621,6.3069657791,,, +4.7558593750,4,-4.6429181606,5.6620590352,-5.1817395857,5.5266876920,,, +4.7578125000,4,-3.1361143390,4.7257534200,-4.0632179195,4.5481178655,,, +4.7597656250,4,-1.4837565792,3.6678964985,-2.8035671747,3.4070326271,,, +4.7617187500,4,0.2117449747,2.5153770265,-1.4606752056,2.1507884323,,, +4.7636718750,4,1.8494427980,1.2979491873,-0.0950749171,0.8332101046,,, +4.7656250000,4,3.3409289104,0.0449910817,1.2369095210,-0.4920918536,,, +4.7675781250,4,4.6178356949,-1.2146189969,2.4870531149,-1.7760789460,,, +4.7695312500,4,5.6348729278,-2.4504617516,3.6161138412,-2.9758803523,,, +4.7714843750,4,6.3700058300,-3.6284810324,4.5931527114,-4.0542519158,,, +4.7734375000,4,6.8231469552,-4.7102977307,5.3943828481,-4.9776646657,,, +4.7753906250,4,7.0122492700,-5.6554173409,6.0026315616,-5.7161723946,,, +4.7773437500,4,6.9662953755,-6.4271514568,6.4083351279,-6.2475563339,,, +4.7792968750,4,6.7178866106,-6.9999162807,6.6113262389,-6.5630962616,,, +4.7812500000,4,6.2993529030,-7.3633319566,6.6218414194,-6.6707078083,,, +4.7832031250,4,5.7429710672,-7.5217229528,6.4601712827,-6.5943070511,,, +4.7851562500,4,5.0818113866,-7.4901018508,6.1540154922,-6.3689208190,,, +4.7871093750,4,4.3498735161,-7.2875510065,5.7336348104,-6.0323387068,,, +4.7890625000,4,3.5831307416,-6.9319095190,5.2283628167,-5.6187036429,,, +4.7910156250,4,2.8188705648,-6.4391031227,4.6654896426,-5.1565417456,,, +4.7929687500,4,2.0899833868,-5.8249701812,4.0684252296,-4.6674149588,,, +4.7949218750,4,1.4182716111,-5.1077458169,3.4547344905,-4.1646234408,,, +4.7968750000,4,0.8125808009,-4.3103866543,2.8365662086,-3.6543362824,,, +4.7988281250,4,0.2718824427,-3.4594810952,2.2218817852,-3.1372178466,,, +4.8007812500,4,-0.2106676069,-2.5808154048,1.6146365849,-2.6088993875,,, +4.8027343750,4,-0.6457518384,-1.6964488776,1.0153086076,-2.0619985000,,, +4.8046875000,4,-1.0462265550,-0.8258574958,0.4234550014,-1.4907616133,,, +4.8066406250,4,-1.4233166356,0.0110915506,-0.1586535572,-0.8953144585,,, +4.8085937500,4,-1.7832954034,0.7931844193,-0.7243749848,-0.2825039505,,, +4.8105468750,4,-2.1271962695,1.5000414806,-1.2640949618,0.3364814619,,, +4.8125000000,4,-2.4516404795,2.1147516690,-1.7671581198,0.9486087664,,, +4.8144531250,4,-2.7500714362,2.6241008092,-2.2223794532,1.5391384551,,, +4.8164062500,4,-3.0161943889,3.0169625592,-2.6182968718,2.0905213057,,, +4.8183593750,4,-3.2483302556,3.2838692550,-2.9446521910,2.5828951940,,, +4.8203125000,4,-3.4512501347,3.4187042724,-3.1943686767,2.9965076683,,, +4.8222656250,4,-3.6346455140,3.4205570339,-3.3644139155,3.3139968516,,, +4.8242187500,4,-3.8087074325,3.2943165540,-3.4549265836,3.5215889101,,, +4.8261718750,4,-3.9771211264,3.0500984333,-3.4668887209,3.6096271255,,, +4.8281250000,4,-4.1303757501,2.7025269191,-3.3997611749,3.5728057460,,, +4.8300781250,4,-4.2446513470,2.2719032318,-3.2518732147,3.4113652582,,, +4.8320312500,4,-4.2884046310,1.7874854520,-3.0246916658,3.1343272208,,, +4.8339843750,4,-4.2316634926,1.2880786581,-2.7268829641,2.7618985729,,, +4.8359375000,4,-4.0517213141,0.8157519914,-2.3734797762,2.3230729389,,, +4.8378906250,4,-3.7364416887,0.4074081342,-1.9826286802,1.8502963047,,, +4.8398437500,4,-3.2892184847,0.0914111233,-1.5749466809,1.3756810616,,, +4.8417968750,4,-2.7331382415,-0.1115041310,-1.1745615219,0.9291712881,,, +4.8437500000,4,-2.1086031372,-0.1881214450,-0.8079133049,0.5372065746,,, +4.8457031250,4,-1.4634903665,-0.1354316809,-0.4992226315,0.2213162257,,, +4.8476562500,4,-0.8416026179,0.0364191416,-0.2651919124,-0.0036267545,,, +4.8496093750,4,-0.2757752332,0.3037152967,-0.1120247286,-0.1310689605,,, +4.8515625000,4,0.2141665258,0.6305447990,-0.0348942918,-0.1635227740,,, +4.8535156250,4,0.6212237309,0.9715894549,-0.0189655117,-0.1121361137,,, +4.8554687500,4,0.9481705185,1.2775795189,-0.0424538586,0.0046096571,,, +4.8574218750,4,1.2013264021,1.5031856230,-0.0819372747,0.1635652373,,, +4.8593750000,4,1.3858870203,1.6157796989,-0.1180863038,0.3415525814,,, +4.8613281250,4,1.5070260265,1.6015862234,-0.1385255045,0.5195366874,,, +4.8632812500,4,1.5746478837,1.4659100237,-0.1363813732,0.6829049877,,, +4.8652343750,4,1.6072868031,1.2291836093,-0.1070698553,0.8193488100,,, +4.8671875000,4,1.6329333182,0.9218388998,-0.0464096968,0.9185360477,,, +4.8691406250,4,1.6863231494,0.5778222305,0.0498889923,0.9734293777,,, +4.8710937500,4,1.8032736416,0.2289530429,0.1855702780,0.9813971803,,, +4.8730468750,4,2.0145890075,-0.0963666233,0.3617246325,0.9454626919,,, +4.8750000000,4,2.3414158636,-0.3735071168,0.5753249807,0.8743353226,,, +4.8769531250,4,2.7892185714,-0.5844730351,0.8187276938,0.7804086319,,, +4.8789062500,4,3.3394900455,-0.7187442939,1.0775061264,0.6786294713,,, +4.8808593750,4,3.9473198479,-0.7705407555,1.3289443718,0.5861322016,,, +4.8828125000,4,4.5499227687,-0.7375469565,1.5453804148,0.5197729866,,, +4.8847656250,4,5.0791088315,-0.6213462530,1.6995949277,0.4930490714,,, +4.8867187500,4,5.4717029489,-0.4269354018,1.7686943146,0.5146246688,,, +4.8886718750,4,5.6793021886,-0.1631907988,1.7381821955,0.5865010168,,, +4.8906250000,4,5.6753916259,0.1547092226,1.6060246540,0.7012934526,,, +4.8925781250,4,5.4555622371,0.5035672314,1.3835593793,0.8412929537,,, +4.8945312500,4,5.0332952011,0.8523528038,1.0939186131,0.9787761397,,, +4.8964843750,4,4.4349463099,1.1650594325,0.7692478105,1.0767883908,,, +4.8984375000,4,3.6942719120,1.4067721461,0.4455939379,1.0934905154,,, +4.9003906250,4,2.8474926299,1.5488660845,0.1571686869,0.9894841902,,, +4.9023437500,4,1.9285297693,1.5711375388,-0.0683864597,0.7349335601,,, +4.9042968750,4,0.9648759420,1.4638635430,-0.2144525266,0.3165656697,,, +4.9062500000,4,-0.0214598730,1.2300658413,-0.2776242323,-0.2570025279,,, +4.9082031250,4,-1.0090285327,0.8863378683,-0.2664624143,-0.9546877734,,, +4.9101562500,4,-1.9753985939,0.4620135572,-0.1995116228,-1.7263625623,,, +4.9121093750,4,-2.9004067256,-0.0040361086,-0.1035818845,-2.5082286928,,, +4.9140625000,4,-3.7685794129,-0.4697091525,-0.0099058615,-3.2309281424,,, +4.9160156250,4,-4.5677573512,-0.8979942285,0.0528044827,-3.8311963997,,, +4.9179687500,4,-5.2866255858,-1.2634477596,0.0649066707,-4.2628588750,,, +4.9199218750,4,-5.9128158280,-1.5536589358,0.0186103217,-4.5017418978,,, +4.9218750000,4,-6.4300611794,-1.7679815865,-0.0815939364,-4.5451917852,,, +4.9238281250,4,-6.8152012155,-1.9163458189,-0.2192213600,-4.4093551107,,, +4.9257812500,4,-7.0371517148,-2.0160124925,-0.3680766725,-4.1243359954,,, +4.9277343750,4,-7.0586979115,-2.0851002724,-0.4969970928,-3.7276752831,,, +4.9296875000,4,-6.8439302564,-2.1372972710,-0.5760294600,-3.2582562627,,, +4.9316406250,4,-6.3711913096,-2.1814110652,-0.5825593118,-2.7518120959,,, +4.9335937500,4,-5.6432986907,-2.2234202134,-0.5050488518,-2.2385997707,,, +4.9355468750,4,-4.6891978565,-2.2673354586,-0.3432792460,-1.7436607016,,, +4.9375000000,4,-3.5599978355,-2.3141035399,-0.1068164424,-1.2882434072,,, +4.9394531250,4,-2.3230049803,-2.3592726873,0.1861835568,-0.8893022028,,, +4.9414062500,4,-1.0532359002,-2.3926709468,0.5110224781,-0.5573605535,,, +4.9433593750,4,0.1786907810,-2.4037810564,0.8421684558,-0.2967023137,,, +4.9453125000,4,1.3179063329,-2.3874582532,1.1592296663,-0.1067620431,,, +4.9472656250,4,2.3275020707,-2.3412553328,1.4462040168,0.0200303506,,, +4.9492187500,4,3.1821128450,-2.2585974421,1.6863359501,0.1012157552,,, +4.9511718750,4,3.8632252426,-2.1281109685,1.8610770976,0.1622087608,,, +4.9531250000,4,4.3595974843,-1.9386340011,1.9535551311,0.2308838108,,, +4.9550781250,4,4.6659227176,-1.6824382178,1.9503825096,0.3337314889,,, +4.9570312500,4,4.7775119171,-1.3542978932,1.8402601400,0.4939336841,,, +4.9589843750,4,4.6883833811,-0.9506948504,1.6140837292,0.7285841292,,, +4.9609375000,4,4.3973726168,-0.4724358843,1.2693671047,1.0441556839,,, +4.9628906250,4,3.9158498471,0.0723094769,0.8146395259,1.4339321469,,, +4.9648437500,4,3.2703461581,0.6687756619,0.2690882375,1.8809576908,,, +4.9667968750,4,2.5025364224,1.2989701567,-0.3402246815,2.3632374041,,, +4.9687500000,4,1.6689121653,1.9426760221,-0.9793239085,2.8553565509,,, +4.9707031250,4,0.8373523675,2.5755368637,-1.6077317654,3.3278333790,,, +4.9726562500,4,0.0800861480,3.1696742109,-2.1819911536,3.7497705853,,, +4.9746093750,4,-0.5349263449,3.6971803987,-2.6611444763,4.0932347640,,, +4.9765625000,4,-0.9528380414,4.1298233200,-3.0097320814,4.3333861755,,, +4.9785156250,4,-1.1389440792,4.4355608753,-3.1983786360,4.4460549030,,, +4.9804687500,4,-1.0826666045,4.5809268624,-3.2065592379,4.4098067103,,, +4.9824218750,4,-0.7989812686,4.5409405627,-3.0282394843,4.2126997464,,, +4.9843750000,4,-0.3262417523,4.3080268564,-2.6753506629,3.8572022796,,, +4.9863281250,4,0.2811049769,3.8936912999,-2.1756342808,3.3598530014,,, +4.9882812500,4,0.9622099576,3.3244117253,-1.5670686059,2.7481426992,,, +4.9902343750,4,1.6563259507,2.6373505259,-0.8936741875,2.0583426850,,, +4.9921875000,4,2.3046545429,1.8793163356,-0.2042575076,1.3345671477,,, +4.9941406250,4,2.8513048545,1.1058607080,0.4490792985,0.6262054393,,, +4.9960937500,4,3.2453632467,0.3756155584,1.0153486654,-0.0180836984,,, +4.9980468750,4,3.4425201703,-0.2584700393,1.4503610123,-0.5579722015,,, +5.0000000000,5,3.4063230302,-0.7548314883,1.7205101492,-0.9664607771,33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +5.0019531250,5,3.1116791536,-1.0853816541,1.8049805736,-1.2311005804,,, +5.0039062500,5,2.5515708277,-1.2382398557,1.6986780327,-1.3536219269,,, +5.0058593750,5,1.7431715036,-1.2199075299,1.4143600081,-1.3483036706,,, +5.0078125000,5,0.7284873016,-1.0529278685,0.9811544669,-1.2390069287,,, +5.0097656250,5,-0.4297915438,-0.7710889301,0.4408047478,-1.0563564538,,, +5.0117187500,5,-1.6522411769,-0.4158537508,-0.1554838824,-0.8354669618,,, +5.0136718750,5,-2.8460817575,-0.0328457362,-0.7501421112,-0.6132282915,,, +5.0156250000,5,-3.9160514718,0.3336880105,-1.2861130386,-0.4237678701,,, +5.0175781250,5,-4.7844209271,0.6464937375,-1.7172641374,-0.2928432232,,, +5.0195312500,5,-5.4046204440,0.8777145185,-2.0146572995,-0.2352186170,,, +5.0214843750,5,-5.7583829830,1.0079755031,-2.1642691801,-0.2576144499,,, +5.0234375000,5,-5.8464305727,1.0247560230,-2.1612169504,-0.3647161193,,, +5.0253906250,5,-5.6825867458,0.9225645417,-2.0069387577,-0.5615740441,,, +5.0273437500,5,-5.2893873650,0.7040074122,-1.7097973647,-0.8484825566,,, +5.0292968750,5,-4.6925893894,0.3777964226,-1.2848203838,-1.2148184879,,, +5.0312500000,5,-3.9192177113,-0.0443459499,-0.7521275065,-1.6391512042,,, +5.0332031250,5,-3.0019126899,-0.5472180620,-0.1371670716,-2.0931498877,,, +5.0351562500,5,-1.9827549770,-1.1117342214,0.5292754941,-2.5455816507,,, +5.0371093750,5,-0.9131741114,-1.7159537655,1.2123719623,-2.9650700420,,, +5.0390625000,5,0.1455857980,-2.3332341013,1.8726652059,-3.3203410300,,, +5.0410156250,5,1.1232079317,-2.9298246988,2.4656290179,-3.5801518274,,, +5.0429687500,5,1.9481087254,-3.4656154354,2.9451827850,-3.7150757245,,, +5.0449218750,5,2.5611590330,-3.8980670187,3.2707206593,-3.7009936622,,, +5.0468750000,5,2.9296993831,-4.1892157457,3.4157460843,-3.5244293070,,, +5.0488281250,5,3.0554313563,-4.3111825741,3.3734013119,-3.1862220040,,, +5.0507812500,5,2.9703492191,-4.2455916417,3.1539906395,-2.6989402305,,, +5.0527343750,5,2.7232330814,-3.9827365846,2.7786191539,-2.0826454077,,, +5.0546875000,5,2.3678168849,-3.5277774303,2.2774746375,-1.3666234169,,, +5.0566406250,5,1.9561249430,-2.9082453847,1.6908186903,-0.5927341540,,, +5.0585937500,5,1.5305423462,-2.1711441029,1.0636732495,0.1896668706,,, +5.0605468750,5,1.1170122793,-1.3713527424,0.4365434724,0.9342701808,,, +5.0625000000,5,0.7288892188,-0.5637077707,-0.1570146046,1.6022035084,,, +5.0644531250,5,0.3794206382,0.1997206880,-0.6863359783,2.1604962558,,, +5.0664062500,5,0.0895395891,0.8741242321,-1.1227049834,2.5834192418,,, +5.0683593750,5,-0.1189591572,1.4274360057,-1.4447330087,2.8567774041,,, +5.0703125000,5,-0.2376676140,1.8421364492,-1.6441850849,2.9791799052,,, +5.0722656250,5,-0.2759832761,2.1132475766,-1.7260297726,2.9594905847,,, +5.0742187500,5,-0.2534589148,2.2450927393,-1.7038164899,2.8137213643,,, +5.0761718750,5,-0.1918376097,2.2484767812,-1.5950529533,2.5618896285,,, +5.0781250000,5,-0.1119099253,2.1387561977,-1.4182021489,2.2240621935,,, +5.0800781250,5,-0.0321647069,1.9358880510,-1.1916704408,1.8187296532,,, +5.0820312500,5,0.0336329888,1.6657552295,-0.9341857799,1.3651694689,,, +5.0839843750,5,0.0803784491,1.3592132747,-0.6638331260,0.8852879365,,, +5.0859375000,5,0.1147994888,1.0486913271,-0.3957184293,0.4027654694,,, +5.0878906250,5,0.1549216153,0.7653032365,-0.1409723230,-0.0579997975,,, +5.0898437500,5,0.2253781616,0.5366232946,0.0926217424,-0.4728936038,,, +5.0917968750,5,0.3500114364,0.3849293129,0.2990806868,-0.8194744486,,, +5.0937500000,5,0.5437900241,0.3264928676,0.4719110506,-1.0776796109,,, +5.0957031250,5,0.8076390476,0.3685546505,0.6039517518,-1.2319748889,,, +5.0976562500,5,1.1294015645,0.5025279289,0.6915485929,-1.2768668318,,, +5.0996093750,5,1.4880335322,0.7016555540,0.7378449996,-1.2203176603,,, +5.1015625000,5,1.8554478644,0.9285840564,0.7502505959,-1.0807971822,,, +5.1035156250,5,2.1982136527,1.1441181875,0.7369894133,-0.8828041021,,, +5.1054687500,5,2.4845952806,1.3100089192,0.7076617106,-0.6538475896,,, +5.1074218750,5,2.6933096152,1.3913341801,0.6741704469,-0.4204680568,,, +5.1093750000,5,2.8153988881,1.3612778303,0.6490360912,-0.2054639214,,, +5.1113281250,5,2.8477685915,1.2039982499,0.6425706466,-0.0284687010,,, +5.1132812500,5,2.7862311215,0.9160001995,0.6599927450,0.0943838859,,, +5.1152343750,5,2.6263728348,0.5068473287,0.7011117013,0.1516317853,,, +5.1171875000,5,2.3689950742,-0.0028056148,0.7630917019,0.1354636986,,, +5.1191406250,5,2.0184893568,-0.5805009855,0.8385175341,0.0451029849,,, +5.1210937500,5,1.5741869880,-1.1751807959,0.9067513699,-0.1023292994,,, +5.1230468750,5,1.0282185967,-1.7159841420,0.9311571773,-0.2668757983,,, +5.1250000000,5,0.3747319144,-2.1248905858,0.8690994261,-0.3951588107,,, +5.1269531250,5,-0.3787291629,-2.3337952642,0.6855662738,-0.4345156430,,, +5.1289062500,5,-1.2057069823,-2.2963119930,0.3620018958,-0.3434017258,,, +5.1308593750,5,-2.0623390205,-1.9953988002,-0.0992357875,-0.0995111774,,, +5.1328125000,5,-2.8958914537,-1.4464135899,-0.6752042379,0.2952721689,,, +5.1347656250,5,-3.6574280661,-0.6922167863,-1.3284289142,0.8158799297,,, +5.1367187500,5,-4.3107876836,0.2045216245,-2.0139731513,1.4193509777,,, +5.1386718750,5,-4.8355516602,1.1671407734,-2.6852044699,2.0538305221,,, +5.1406250000,5,-5.2270497218,2.1141204935,-3.3001891503,2.6695951883,,, +5.1425781250,5,-5.4931903485,2.9709655335,-3.8261249648,3.2252379365,,, +5.1445312500,5,-5.6482478953,3.6766470596,-4.2389272021,3.6872703488,,, +5.1464843750,5,-5.7051129846,4.1841052555,-4.5198993918,4.0276809556,,, +5.1484375000,5,-5.6670453051,4.4585431928,-4.6514374519,4.2209876203,,, +5.1503906250,5,-5.5245801495,4.4769942631,-4.6155655216,4.2433474072,,, +5.1523437500,5,-5.2623316594,4.2334624508,-4.3996052103,4.0780024492,,, +5.1542968750,5,-4.8679789443,3.7433587956,-4.0025539844,3.7212445727,,, +5.1562500000,5,-4.3349509873,3.0373963544,-3.4336540993,3.1806811889,,, +5.1582031250,5,-3.6627076184,2.1524964491,-2.7083948831,2.4709137793,,, +5.1601562500,5,-2.8589094067,1.1315492209,-1.8495389601,1.6146184571,,, +5.1621093750,5,-1.9415230388,0.0275150213,-0.8901213408,0.6458303569,,, +5.1640625000,5,-0.9395320329,-1.0971486506,0.1267948591,-0.3909507375,,, +5.1660156250,5,0.1081211643,-2.1747267117,1.1508048129,-1.4439780561,,, +5.1679687500,5,1.1578086187,-3.1375505360,2.1283842143,-2.4569015797,,, +5.1699218750,5,2.1712320616,-3.9270378071,3.0110712209,-3.3751729814,,, +5.1718750000,5,3.1233217776,-4.5038779121,3.7643910620,-4.1557866879,,, +5.1738281250,5,4.0017590726,-4.8512554619,4.3701538199,-4.7717853381,,, +5.1757812500,5,4.8001245019,-4.9716394846,4.8226389909,-5.2105795855,,, +5.1777343750,5,5.5097060105,-4.8827728436,5.1238425148,-5.4715121887,,, +5.1796875000,5,6.1153326948,-4.6133696773,5.2798541014,-5.5629810353,,, +5.1816406250,5,6.5978873914,-4.1987697862,5.2992498869,-5.4988754314,,, +5.1835937500,5,6.9394466435,-3.6785435921,5.1936179043,-5.2970292157,,, +5.1855468750,5,7.1270393897,-3.0938331583,4.9778326370,-4.9785713211,,, +5.1875000000,5,7.1552536900,-2.4802278161,4.6674830844,-4.5638811079,,, +5.1894531250,5,7.0270985046,-1.8606025639,4.2752111158,-4.0671147600,,, +5.1914062500,5,6.7526833876,-1.2480891655,3.8112789794,-3.4967086967,,, +5.1933593750,5,6.3471531592,-0.6556162559,3.2876152980,-2.8612566804,,, +5.1953125000,5,5.8245388877,-0.0979724262,2.7175831491,-2.1732376168,,, +5.1972656250,5,5.1861173572,0.4125659339,2.1111434837,-1.4501358707,,, +5.1992187500,5,4.4165675630,0.8651222012,1.4744178303,-0.7160204129,,, +5.2011718750,5,3.4962061219,1.2452177356,0.8152023898,-0.0012707548,,, +5.2031250000,5,2.4158204727,1.5359549294,0.1461293094,0.6619121987,,, +5.2050781250,5,1.1843736698,1.7244872177,-0.5164302820,1.2448530790,,, +5.2070312500,5,-0.1658231392,1.8050711456,-1.1520370697,1.7238800759,,, +5.2089843750,5,-1.5792431955,1.7784525285,-1.7364138486,2.0813595041,,, +5.2109375000,5,-2.9875507454,1.6539782337,-2.2476269316,2.3118836135,,, +5.2128906250,5,-4.3205212891,1.4506995895,-2.6714461889,2.4264317238,,, +5.2148437500,5,-5.5102416800,1.1908028007,-2.9987268130,2.4461192817,,, +5.2167968750,5,-6.4953197890,0.8941156724,-3.2222988561,2.3934587158,,, +5.2187500000,5,-7.2277980208,0.5838338942,-3.3409113060,2.2921536532,,, +5.2207031250,5,-7.6762409478,0.2942697467,-3.3637550615,2.1707115322,,, +5.2226562500,5,-7.8237194182,0.0666565746,-3.3074394758,2.0590912278,,, +5.2246093750,5,-7.6672533632,-0.0619554571,-3.1897515824,1.9803319318,,, +5.2265625000,5,-7.2197136709,-0.0651422239,-3.0268046699,1.9458151396,,, +5.2285156250,5,-6.5075136507,0.0695202590,-2.8316828817,1.9566441690,,, +5.2304687500,5,-5.5653266461,0.3376864966,-2.6137412774,2.0095047880,,, +5.2324218750,5,-4.4382515890,0.7202513348,-2.3818742043,2.1026446710,,, +5.2343750000,5,-3.1894112064,1.1885707043,-2.1487822784,2.2364366472,,, +5.2363281250,5,-1.8970082869,1.7050992128,-1.9281068430,2.4071251244,,, +5.2382812500,5,-0.6382175252,2.2190310168,-1.7248923956,2.5981169992,,, +5.2402343750,5,0.5239758999,2.6675408943,-1.5305354595,2.7767405026,,, +5.2421875000,5,1.5408438818,2.9893873728,-1.3288638758,2.9003160706,,, +5.2441406250,5,2.3716324916,3.1444937610,-1.1085920923,2.9298040925,,, +5.2460937500,5,2.9809309938,3.1239895053,-0.8718624364,2.8440281280,,, +5.2480468750,5,3.3422776523,2.9388906765,-0.6300495076,2.6409230503,,, +5.2500000000,5,3.4457768401,2.5996215027,-0.3910892595,2.3252881935,,, +5.2519531250,5,3.3044618787,2.1114456722,-0.1537878630,1.9019857190,,, +5.2539062500,5,2.9542010314,1.4862773301,0.0866354643,1.3819717845,,, +5.2558593750,5,2.4472862083,0.7514387109,0.3316422573,0.7889402811,,, +5.2578125000,5,1.8414770024,-0.0505154224,0.5758067806,0.1593006531,,, +5.2597656250,5,1.1902139166,-0.8651883762,0.8060052428,-0.4622017438,,, +5.2617187500,5,0.5431577676,-1.6330667516,1.0061023210,-1.0301312878,,, +5.2636718750,5,-0.0496162578,-2.2993115990,1.1641590102,-1.5072016373,,, +5.2656250000,5,-0.5453187719,-2.8196492136,1.2729732664,-1.8684148910,,, +5.2675781250,5,-0.9214419778,-3.1592338167,1.3247652728,-2.0990906243,,, +5.2695312500,5,-1.1760360463,-3.2916762721,1.3102966392,-2.1933417309,,, +5.2714843750,5,-1.3159730058,-3.2062407364,1.2260332126,-2.1574425610,,, +5.2734375000,5,-1.3441600240,-2.9204814548,1.0840547279,-2.0155332497,,, +5.2753906250,5,-1.2510859343,-2.4867662308,0.9182492847,-1.8140791080,,, +5.2773437500,5,-1.0169572802,-1.9827581962,0.7795498468,-1.6183864374,,, +5.2792968750,5,-0.6280528983,-1.4870136290,0.7174810192,-1.4951492949,,, +5.2812500000,5,-0.0936754667,-1.0555358062,0.7606907650,-1.4913542162,,, +5.2832031250,5,0.5518704180,-0.7162457274,0.9116721882,-1.6248257829,,, +5.2851562500,5,1.2576568029,-0.4787572794,1.1530718509,-1.8855867380,,, +5.2871093750,5,1.9651596964,-0.3436466228,1.4553574994,-2.2413422512,,, +5.2890625000,5,2.6171065256,-0.3055078966,1.7834606445,-2.6461341357,,, +5.2910156250,5,3.1649070291,-0.3535602741,2.1023840210,-3.0497772298,,, +5.2929687500,5,3.5723639743,-0.4707551736,2.3801836935,-3.4044354578,,, +5.2949218750,5,3.8165073120,-0.6311308060,2.5886163378,-3.6685865492,,, +5.2968750000,5,3.8861424737,-0.7979201748,2.7023688050,-3.8081521579,,, +5.2988281250,5,3.7793677457,-0.9277174441,2.6990718290,-3.7951355528,,, +5.3007812500,5,3.5018002638,-0.9814085364,2.5621190701,-3.6076770206,,, +5.3027343750,5,3.0654638116,-0.9331375426,2.2840532429,-3.2332102132,,, +5.3046875000,5,2.4893680932,-0.7707060700,1.8679656753,-2.6720986610,,, +5.3066406250,5,1.7989929810,-0.4874197809,1.3244272133,-1.9366888114,,, +5.3085937500,5,1.0209921881,-0.0724914366,0.6649484609,-1.0457448814,,, +5.3105468750,5,0.1826189678,0.4829276879,-0.0960600425,-0.0255658364,,, +5.3125000000,5,-0.6779864700,1.1627845119,-0.9275557357,1.0796184036,,, +5.3144531250,5,-1.5066607498,1.9152127681,-1.7763346027,2.2063498889,,, +5.3164062500,5,-2.2441818737,2.6685021102,-2.5797049974,3.2853555800,,, +5.3183593750,5,-2.8422520006,3.3516032506,-3.2801399543,4.2514005415,,, +5.3203125000,5,-3.2739105907,3.9024704169,-3.8318195023,5.0451521954,,, +5.3222656250,5,-3.5351257007,4.2708494056,-4.2033415913,5.6177853026,,, +5.3242187500,5,-3.6372853612,4.4199628819,-4.3773929713,5.9365647802,,, +5.3261718750,5,-3.5980521715,4.3275256826,-4.3482665971,5.9857218465,,, +5.3281250000,5,-3.4367858760,3.9883398809,-4.1208220299,5.7653632359,,, +5.3300781250,5,-3.1714105082,3.4138354236,-3.7086112709,5.2891475198,,, +5.3320312500,5,-2.8143062471,2.6254042451,-3.1289224758,4.5792696808,,, +5.3339843750,5,-2.3722405672,1.6499468790,-2.4003585914,3.6630471316,,, +5.3359375000,5,-1.8527315316,0.5230720897,-1.5465847990,2.5748139972,,, +5.3378906250,5,-1.2694700550,-0.7071596728,-0.6003198988,1.3590493135,,, +5.3398437500,5,-0.6438550666,-1.9833689338,0.3978225133,0.0679540053,,, +5.3417968750,5,-0.0067873558,-3.2461477875,1.4034621416,-1.2466451683,,, +5.3437500000,5,0.6046039269,-4.4375847663,2.3720511871,-2.5380390160,,, +5.3457031250,5,1.1604617961,-5.5002894204,3.2619003809,-3.7610550551,,, +5.3476562500,5,1.6490633871,-6.3787609368,4.0366688949,-4.8670364378,,, +5.3496093750,5,2.0691342105,-7.0245590800,4.6643010216,-5.8030633233,,, +5.3515625000,5,2.4096945771,-7.4000800556,5.1125206559,-6.5146553937,,, +5.3535156250,5,2.6402879625,-7.4777037940,5.3472082564,-6.9517407315,,, +5.3554687500,5,2.7187819569,-7.2369118138,5.3364204850,-7.0766274881,,, +5.3574218750,5,2.6036473833,-6.6658949984,5.0562241085,-6.8682941190,,, +5.3593750000,5,2.2641028077,-5.7680653493,4.4957640672,-6.3209919818,,, +5.3613281250,5,1.6895771914,-4.5666061360,3.6615263730,-5.4430919889,,, +5.3632812500,5,0.8952695376,-3.1039447651,2.5794270158,-4.2586350366,,, +5.3652343750,5,-0.0783157132,-1.4372283527,1.2931181141,-2.8071847417,,, +5.3671875000,5,-1.1683103002,0.3670042593,-0.1393940540,-1.1415973925,,, +5.3691406250,5,-2.2925211242,2.2333258599,-1.6468384621,0.6715556240,,, +5.3710937500,5,-3.3539316280,4.0745747130,-3.1446096559,2.5496071835,,, +5.3730468750,5,-4.2481390426,5.7945722717,-4.5388139539,4.3959647074,,, +5.3750000000,5,-4.8757746707,7.2987013411,-5.7362951255,6.1085168773,,, +5.3769531250,5,-5.1610777902,8.5072695227,-6.6582419436,7.5905920940,,, +5.3789062500,5,-5.0683195433,9.3666732988,-7.2519686024,8.7607038247,,, +5.3808593750,5,-4.6030778565,9.8518493657,-7.4933223431,9.5568028114,,, +5.3828125000,5,-3.8014335540,9.9588681814,-7.3806322046,9.9360046519,,, +5.3847656250,5,-2.7238137188,9.7001669507,-6.9320135949,9.8777871227,,, +5.3867187500,5,-1.4537434573,9.1077522619,-6.1874922472,9.3893261253,,, +5.3886718750,5,-0.0885837514,8.2312530139,-5.2047781844,8.5036093269,,, +5.3906250000,5,1.2738917972,7.1278887383,-4.0499491105,7.2738426203,,, +5.3925781250,5,2.5439542118,5.8564022711,-2.7919661084,5.7711296542,,, +5.3945312500,5,3.6474152606,4.4742900703,-1.4980037374,4.0799377652,,, +5.3964843750,5,4.5328952690,3.0312154021,-0.2261728645,2.2884146402,,, +5.3984375000,5,5.1737121166,1.5636893989,0.9794777362,0.4791096879,,, +5.4003906250,5,5.5653085078,0.0973046104,2.0887661832,-1.2759341819,,, +5.4023437500,5,5.7193457958,-1.3453985412,3.0806331678,-2.9144649098,,, +5.4042968750,5,5.6546927152,-2.7373621608,3.9370242393,-4.3816904299,,, +5.4062500000,5,5.3924226769,-4.0449396442,4.6413119936,-5.6331234576,,, +5.4082031250,5,4.9596260169,-5.2318076753,5.1824864638,-6.6407989389,,, +5.4101562500,5,4.3950601089,-6.2654412238,5.5598000267,-7.3957880465,,, +5.4121093750,5,3.7495602754,-7.1210687876,5.7832234574,-7.9046647675,,, +5.4140625000,5,3.0813101125,-7.7815175434,5.8700005579,-8.1828323571,,, +5.4160156250,5,2.4442747751,-8.2372982714,5.8395678516,-8.2494396676,,, +5.4179687500,5,1.8688654570,-8.4857063024,5.7060527762,-8.1235966738,,, +5.4199218750,5,1.3472466240,-8.5240541095,5.4698368482,-7.8189738705,,, +5.4218750000,5,0.8364717036,-8.3440425146,5.1161445179,-7.3418180461,,, +5.4238281250,5,0.2765221612,-7.9385258830,4.6253032059,-6.6988979823,,, +5.4257812500,5,-0.3853112028,-7.3165229559,3.9887273229,-5.9088986009,,, +5.4277343750,5,-1.1728078239,-6.5092308366,3.2182144755,-5.0038337475,,, +5.4296875000,5,-2.0704578137,-5.5618057197,2.3442245049,-4.0209332552,,, +5.4316406250,5,-3.0240918513,-4.5221052670,1.4100161842,-2.9959585664,,, +5.4335937500,5,-3.9502868703,-3.4342444380,0.4657549890,-1.9606830238,,, +5.4355468750,5,-4.7542285546,-2.3379339264,-0.4375304284,-0.9424658014,,, +5.4375000000,5,-5.3523035822,-1.2681201943,-1.2552902745,0.0358122588,,, +5.4394531250,5,-5.6908325892,-0.2485330430,-1.9581070913,0.9575973792,,, +5.4414062500,5,-5.7528756892,0.7157035440,-2.5368860068,1.8146650001,,, +5.4433593750,5,-5.5541086096,1.6370997883,-3.0009840152,2.6064161262,,, +5.4453125000,5,-5.1305660098,2.5330333598,-3.3686601422,3.3351897079,,, +5.4472656250,5,-4.5222697690,3.4088394804,-3.6543148243,3.9997874096,,, +5.4492187500,5,-3.7656705326,4.2512595816,-3.8632464215,4.5933633032,,, +5.4511718750,5,-2.8972180381,5.0340165201,-3.9954218427,5.1062243602,,, +5.4531250000,5,-1.9555814082,5.7258463728,-4.0493971595,5.5275585816,,, +5.4550781250,5,-0.9813589577,6.2959358246,-4.0240353804,5.8451169147,,, +5.4570312500,5,-0.0200662965,6.7149774282,-3.9199124608,6.0454608096,,, +5.4589843750,5,0.8763741945,6.9538177352,-3.7396019329,6.1149566862,,, +5.4609375000,5,1.6532451708,6.9880601906,-3.4890211035,6.0431376925,,, +5.4628906250,5,2.2585539597,6.8063268828,-3.1796761806,5.8269478017,,, +5.4648437500,5,2.6520396431,6.4103105304,-2.8256580866,5.4700337611,,, +5.4667968750,5,2.8179494338,5.8098433359,-2.4370306984,4.9793777754,,, +5.4687500000,5,2.7714346106,5.0218183187,-2.0173306773,4.3647541682,,, +5.4707031250,5,2.5537936285,4.0677303737,-1.5640258619,3.6379057413,,, +5.4726562500,5,2.2231163440,2.9684706248,-1.0690447487,2.8101815588,,, +5.4746093750,5,1.8408136317,1.7463149089,-0.5242800304,1.8946907397,,, +5.4765625000,5,1.4556980665,0.4316999599,0.0697803292,0.9111722180,,, +5.4785156250,5,1.0969772050,-0.9349704220,0.7009973210,-0.1129968597,,, +5.4804687500,5,0.7781756112,-2.3047940554,1.3477660496,-1.1444023534,,, +5.4824218750,5,0.5050054243,-3.6234805494,1.9835877268,-2.1476482149,,, +5.4843750000,5,0.2808404564,-4.8352676522,2.5811971578,-3.0895729272,,, +5.4863281250,5,0.1065210904,-5.8813772643,3.1112510356,-3.9364734232,,, +5.4882812500,5,-0.0188193242,-6.6979196801,3.5410310203,-4.6507398085,,, +5.4902343750,5,-0.0910757716,-7.2247460203,3.8412114638,-5.1967617895,,, +5.4921875000,5,-0.0978376831,-7.4205088660,3.9945722936,-5.5499258812,,, +5.4941406250,5,-0.0257757121,-7.2705348896,3.9971582950,-5.6990470877,,, +5.4960937500,5,0.1279127766,-6.7853573860,3.8530890933,-5.6417854595,,, +5.4980468750,5,0.3498584383,-5.9960487714,3.5698642183,-5.3793554357,,, +5.5000000000,5,0.6147200860,-4.9509712917,3.1593377023,-4.9199371135,,, +5.5019531250,5,0.8971348961,-3.7148461634,2.6440408666,-4.2910955084,,, +5.5039062500,5,1.1814931023,-2.3656009820,2.0602460520,-3.5450768951,,, +5.5058593750,5,1.4611917458,-0.9846917023,1.4513063839,-2.7470121227,,, +5.5078125000,5,1.7327280669,0.3545752429,0.8573643553,-1.9573870845,,, +5.5097656250,5,1.9931195881,1.5925749376,0.3102456103,-1.2222645885,,, +5.5117187500,5,2.2378633546,2.6836422508,-0.1678728835,-0.5705364534,,, +5.5136718750,5,2.4555685259,3.5970009641,-0.5667006334,-0.0128014357,,, +5.5156250000,5,2.6268073495,4.3157753769,-0.8870043879,0.4551648105,,, +5.5175781250,5,2.7322138398,4.8328224199,-1.1345975820,0.8439680064,,, +5.5195312500,5,2.7605493495,5.1514174067,-1.3174357687,1.1676868739,,, +5.5214843750,5,2.7070923299,5.2887455727,-1.4481090919,1.4468561637,,, +5.5234375000,5,2.5614830595,5.2721654793,-1.5455349813,1.7055759224,,, +5.5253906250,5,2.2934675309,5.1330581342,-1.6354456690,1.9645441156,,, +5.5273437500,5,1.8552384190,4.9048730196,-1.7483672415,2.2386810193,,, +5.5292968750,5,1.2045004921,4.6194935663,-1.9107799236,2.5355371746,,, +5.5312500000,5,0.3253495373,4.3017312532,-2.1358115868,2.8515816685,,, +5.5332031250,5,-0.7669611400,3.9670178670,-2.4208525761,3.1717264976,,, +5.5351562500,5,-2.0292950741,3.6208798259,-2.7492042562,3.4728235606,,, +5.5371093750,5,-3.3956192159,3.2596907587,-3.0927414074,3.7272778818,,, +5.5390625000,5,-4.7842179982,2.8746976391,-3.4164273794,3.9064130511,,, +5.5410156250,5,-6.1065079853,2.4580911253,-3.6844428452,3.9854222357,,, +5.5429687500,5,-7.2741266774,2.0076616219,-3.8653162057,3.9486671522,,, +5.5449218750,5,-8.2033899398,1.5283137972,-3.9345031122,3.7925616591,,, +5.5468750000,5,-8.8211354857,1.0315966717,-3.8760505732,3.5258609615,,, +5.5488281250,5,-9.0716577790,0.5335965380,-3.6834205890,3.1674796985,,, +5.5507812500,5,-8.9198486582,0.0502922053,-3.3575396718,2.7414074130,,, +5.5527343750,5,-8.3533313413,-0.4067297684,-2.9048231805,2.2723398117,,, +5.5546875000,5,-7.3885783506,-0.8301253506,-2.3389123191,1.7850361760,,, +5.5566406250,5,-6.0754735696,-1.2145417191,-1.6825840210,1.3029918043,,, +5.5585937500,5,-4.4936190070,-1.5562897877,-0.9658146927,0.8443832816,,, +5.5605468750,5,-2.7423551021,-1.8536750996,-0.2221718120,0.4202528789,,, +5.5625000000,5,-0.9283916862,-2.1070814364,0.5148116749,0.0353530051,,, +5.5644531250,5,0.8460637490,-2.3208841042,1.2160834551,-0.3125241739,,, +5.5664062500,5,2.4925966553,-2.5066729458,1.8613992543,-0.6340806407,,, +5.5683593750,5,3.9438667236,-2.6845565384,2.4417905393,-0.9475441130,,, +5.5703125000,5,5.1584989749,-2.8806086264,2.9594148156,-1.2756203568,,, +5.5722656250,5,6.1226585130,-3.1223001600,3.4257723638,-1.6430774075,,, +5.5742187500,5,6.8481164825,-3.4347950912,3.8591982082,-2.0743488798,,, +5.5761718750,5,7.3632323920,-3.8344803164,4.2780938701,-2.5861330563,,, +5.5781250000,5,7.6984562998,-4.3165551339,4.6891548348,-3.1750048974,,, +5.5800781250,5,7.8785415452,-4.8491952702,5.0817805275,-3.8128065681,,, +5.5820312500,5,7.9235759528,-5.3851942637,5.4348789412,-4.4563174249,,, +5.5839843750,5,7.8470869225,-5.8775642385,5.7244071878,-5.0572885475,,, +5.5859375000,5,7.6508909355,-6.2837909718,5.9239259714,-5.5645139347,,, +5.5878906250,5,7.3261011950,-6.5637111700,6.0046616296,-5.9263742439,,, +5.5898437500,5,6.8584473814,-6.6795619160,5.9382899239,-6.0964118857,,, +5.5917968750,5,6.2323206792,-6.5975160100,5.6994475587,-6.0369083896,,, +5.5937500000,5,5.4384362228,-6.2906731247,5.2699598613,-5.7226667938,,, +5.5957031250,5,4.4832850819,-5.7442293134,4.6450324418,-5.1474824027,,, +5.5976562500,5,3.3842831654,-4.9559790091,3.8323665639,-4.3261574991,,, +5.5996093750,5,2.1547043429,-3.9300623132,2.8440859152,-3.2893268949,,, +5.6015625000,5,0.8026571225,-2.6742421989,1.6944778651,-2.0790339465,,, +5.6035156250,5,-0.6535916053,-1.2073964030,0.4074910774,-0.7484130355,,, +5.6054687500,5,-2.1713687183,0.4280779406,-0.9741391071,0.6382445684,,, +5.6074218750,5,-3.6811226260,2.1596524424,-2.3860389090,2.0075620337,,, +5.6093750000,5,-5.0959574202,3.8910567978,-3.7486231075,3.2819858102,,, +5.6113281250,5,-6.3257742389,5.5183249191,-4.9790987284,4.3868064905,,, +5.6132812500,5,-7.2880022858,6.9446852634,-6.0019246792,5.2570983814,,, +5.6152343750,5,-7.9148281614,8.0893079145,-6.7554975718,5.8434161766,,, +5.6171875000,5,-8.1604989831,8.8930691108,-7.1973451088,6.1158734847,,, +5.6191406250,5,-8.0078410648,9.3219324512,-7.3075012744,6.0648350294,,, +5.6210937500,5,-7.4701394507,9.3663036502,-7.0882077277,5.6979700481,,, +5.6230468750,5,-6.5876726848,9.0394671772,-6.5618229310,5.0381761383,,, +5.6250000000,5,-5.4231081894,8.3784985828,-5.7703582439,4.1266272607,,, +5.6269531250,5,-4.0581441158,7.4453821804,-4.7758722233,3.0280330051,,, +5.6289062500,5,-2.5879559804,6.3243489237,-3.6577268778,1.8309224944,,, +5.6308593750,5,-1.1124917115,5.1142514856,-2.5054562074,0.6402244081,,, +5.6328125000,5,0.2734949395,3.9138531131,-1.4070680049,-0.4373996707,,, +5.6347656250,5,1.4922266487,2.8003691940,-0.4330743454,-1.3138027548,,, +5.6367187500,5,2.4926075644,1.8142123171,0.3755624600,-1.9356393206,,, +5.6386718750,5,3.2511669953,0.9610780186,1.0073305881,-2.2872767709,,, +5.6406250000,5,3.7646790131,0.2256236419,1.4709205557,-2.3831495686,,, +5.6425781250,5,4.0417901541,-0.4140586268,1.7851422701,-2.2590114676,,, +5.6445312500,5,4.1003785847,-0.9776812627,1.9736493781,-1.9674085767,,, +5.6464843750,5,3.9679147158,-1.4791537235,2.0623081447,-1.5711721011,,, +5.6484375000,5,3.6786752865,-1.9239871592,2.0747012646,-1.1294765763,,, +5.6503906250,5,3.2710622529,-2.3094602376,2.0294877403,-0.6874689607,,, +5.6523437500,5,2.7904850818,-2.6305271859,1.9442371337,-0.2792372013,,, +5.6542968750,5,2.2911887345,-2.8876541977,1.8408079790,0.0633578793,,, +5.6562500000,5,1.8268874758,-3.0891907124,1.7442059485,0.3071371266,,, +5.6582031250,5,1.4368433555,-3.2470330969,1.6761630763,0.4207178807,,, +5.6601562500,5,1.1405999993,-3.3707415522,1.6502359188,0.3800459694,,, +5.6621093750,5,0.9386054428,-3.4608325588,1.6678389950,0.1764477420,,, +5.6640625000,5,0.8110214891,-3.5038122004,1.7142821823,-0.1744847629,,, +5.6660156250,5,0.7188236999,-3.4767436604,1.7607903622,-0.6315756420,,, +5.6679687500,5,0.6138432904,-3.3564352907,1.7726599478,-1.1354471856,,, +5.6699218750,5,0.4537232073,-3.1241168987,1.7174980172,-1.6188100506,,, +5.6718750000,5,0.2112042405,-2.7694982415,1.5715169098,-2.0170360583,,, +5.6738281250,5,-0.1260173552,-2.2961625337,1.3230690974,-2.2759786407,,, +5.6757812500,5,-0.5581214317,-1.7223322902,0.9726436756,-2.3550950178,,, +5.6777343750,5,-1.0729804770,-1.0759739450,0.5311569569,-2.2290519534,,, +5.6796875000,5,-1.6467827690,-0.3877889701,0.0170786343,-1.8890286405,,, +5.6816406250,5,-2.2481733067,0.3142728924,-0.5472454077,-1.3418372442,,, +5.6835937500,5,-2.8408312054,1.0048947499,-1.1366146370,-0.6083711664,,, +5.6855468750,5,-3.3833018136,1.6578483950,-1.7217882193,0.2780519040,,, +5.6875000000,5,-3.8301713964,2.2460942921,-2.2705536599,1.2753399221,,, +5.6894531250,5,-4.1349338127,2.7430205394,-2.7493759355,2.3340591125,,, +5.6914062500,5,-4.2553040588,3.1196411431,-3.1233030337,3.3944038948,,, +5.6933593750,5,-4.1618949056,3.3425389167,-3.3575752545,4.3856501591,,, +5.6953125000,5,-3.8441648003,3.3756622237,-3.4207610059,5.2299523747,,, +5.6972656250,5,-3.3101882527,3.1846750233,-3.2873665270,5.8474503606,,, +5.6992187500,5,-2.5865630631,2.7473424424,-2.9438742106,6.1663875725,,, +5.7011718750,5,-1.7216216152,2.0676931344,-2.3981979231,6.1383368652,,, +5.7031250000,5,-0.7837622012,1.1790473312,-1.6818936903,5.7467483138,,, +5.7050781250,5,0.1503594845,0.1327237478,-0.8414227401,5.0039756561,,, +5.7070312500,5,1.0101838163,-1.0109482796,0.0706157427,3.9468915124,,, +5.7089843750,5,1.7418746129,-2.1842452722,0.9995882947,2.6353355420,,, +5.7109375000,5,2.3137829907,-3.3152727400,1.8924794273,1.1482437788,,, +5.7128906250,5,2.7135141577,-4.3328467299,2.7001287388,-0.4223423637,,, +5.7148437500,5,2.9412033791,-5.1723786397,3.3788791937,-1.9780402393,,, +5.7167968750,5,3.0064984760,-5.7850184202,3.8951821422,-3.4240965559,,, +5.7187500000,5,2.9254752691,-6.1431672154,4.2288092813,-4.6802799298,,, +5.7207031250,5,2.7150382947,-6.2379268621,4.3711372384,-5.6868345315,,, +5.7226562500,5,2.3910563563,-6.0753452337,4.3230753307,-6.4047345266,,, +5.7246093750,5,1.9716657206,-5.6749444737,4.0951251537,-6.8140080379,,, +5.7265625000,5,1.4815350400,-5.0666549438,3.7069701684,-6.9117400887,,, +5.7285156250,5,0.9552373506,-4.2861661599,3.1858408129,-6.7083848041,,, +5.7304687500,5,0.4367873909,-3.3726212282,2.5646876540,-6.2236897375,,, +5.7324218750,5,-0.0282235474,-2.3677470378,1.8792629068,-5.4852966359,,, +5.7343750000,5,-0.4028004057,-1.3127693584,1.1639663721,-4.5294830657,,, +5.7363281250,5,-0.6625820876,-0.2447809193,0.4493101978,-3.4022851689,,, +5.7382812500,5,-0.7939512890,0.8036741616,-0.2376439535,-2.1599945318,,, +5.7402343750,5,-0.7909189512,1.8030352203,-0.8720620571,-0.8671666087,,, +5.7421875000,5,-0.6525950625,2.7260556530,-1.4310448041,0.4077049891,,, +5.7441406250,5,-0.3836547630,3.5469048203,-1.8940134766,1.5960107084,,, +5.7460937500,5,-0.0017236582,4.2388292536,-2.2443157005,2.6320219928,,, +5.7480468750,5,0.4534638397,4.7757141440,-2.4734043366,3.4586039661,,, +5.7500000000,5,0.9209490894,5.1411348766,-2.5858154923,4.0361233045,,, +5.7519531250,5,1.3295901481,5.3360217952,-2.6001417708,4.3482460338,,, +5.7539062500,5,1.6119879751,5.3746029673,-2.5429578557,4.4001231412,,, +5.7558593750,5,1.7190356589,5.2707174460,-2.4376569937,4.2116310667,,, +5.7578125000,5,1.6290158449,5.0284635415,-2.2968242104,3.8112301003,,, +5.7597656250,5,1.3441810336,4.6494779850,-2.1262267690,3.2352148609,,, +5.7617187500,5,0.8814401457,4.1489665402,-1.9349239052,2.5310546305,,, +5.7636718750,5,0.2681574329,3.5609620902,-1.7387267930,1.7572310716,,, +5.7656250000,5,-0.4559148695,2.9294298581,-1.5547577039,0.9764120720,,, +5.7675781250,5,-1.2346618393,2.2982360402,-1.3946341623,0.2466482671,,, +5.7695312500,5,-1.9954189954,1.7080757780,-1.2621839650,-0.3846935838,,, +5.7714843750,5,-2.6608271878,1.1977581431,-1.1571955173,-0.8825476318,,, +5.7734375000,5,-3.1685412063,0.8041799093,-1.0813948672,-1.2222473824,,, +5.7753906250,5,-3.4817804429,0.5575917370,-1.0396048731,-1.3884871692,,, +5.7773437500,5,-3.5872801244,0.4760812545,-1.0365501718,-1.3767009246,,, +5.7792968750,5,-3.4912505805,0.5656290060,-1.0757235241,-1.1929060279,,, +5.7812500000,5,-3.2170985181,0.8224409775,-1.1599391215,-0.8522976238,,, +5.7832031250,5,-2.7998922346,1.2288805643,-1.2876325795,-0.3814806008,,, +5.7851562500,5,-2.2753556449,1.7439618788,-1.4449845584,0.1776953913,,, +5.7871093750,5,-1.6712277935,2.3006576428,-1.6025474307,0.7701154496,,, +5.7890625000,5,-1.0087870433,2.8167744853,-1.7217569595,1.3365104459,,, +5.7910156250,5,-0.3098693113,3.2112809604,-1.7656182581,1.8239771778,,, +5.7929687500,5,0.4002334549,3.4164723770,-1.7057512763,2.1920300606,,, +5.7949218750,5,1.0963484267,3.3849725641,-1.5245526905,2.4133054147,,, +5.7968750000,5,1.7588082546,3.0917149468,-1.2142661562,2.4716787287,,, +5.7988281250,5,2.3744419242,2.5307352948,-0.7750700987,2.3606652419,,, +5.8007812500,5,2.9293366936,1.7137857136,-0.2168342895,2.0854702176,,, +5.8027343750,5,3.3986464459,0.6748651513,0.4352973106,1.6677986002,,, +5.8046875000,5,3.7465043304,-0.5287549627,1.1403747460,1.1463478153,,, +5.8066406250,5,3.9383468194,-1.8246025165,1.8495173719,0.5711628470,,, +5.8085937500,5,3.9525794493,-3.1335665476,2.5139201072,-0.0028489415,,, +5.8105468750,5,3.7840825471,-4.3749062121,3.0890361008,-0.5228877870,,, +5.8125000000,5,3.4444282809,-5.4739780727,3.5394683589,-0.9483890059,,, +5.8144531250,5,2.9624270107,-6.3744625249,3.8459225272,-1.2610828445,,, +5.8164062500,5,2.3819412294,-7.0481852068,4.0095996599,-1.4699535644,,, +5.8183593750,5,1.7533323200,-7.4941004125,4.0487906400,-1.6075551266,,, +5.8203125000,5,1.1221739370,-7.7269102600,3.9888665462,-1.7172718398,,, +5.8222656250,5,0.5235644550,-7.7661816462,3.8539234020,-1.8393633348,,, +5.8242187500,5,-0.0166673364,-7.6327710521,3.6645443988,-2.0036498608,,, +5.8261718750,5,-0.4798337693,-7.3472833268,3.4372948801,-2.2263112055,,, +5.8281250000,5,-0.8535187682,-6.9274627180,3.1835504491,-2.5078806781,,, +5.8300781250,5,-1.1307123256,-6.3896576040,2.9105979645,-2.8346530923,,, +5.8320312500,5,-1.3111491794,-5.7509038113,2.6225363800,-3.1811811245,,, +5.8339843750,5,-1.4026350575,-5.0272150202,2.3194167144,-3.5121745153,,, +5.8359375000,5,-1.4160154470,-4.2380389805,2.0014948298,-3.7886053765,,, +5.8378906250,5,-1.3599265603,-3.4152683173,1.6758297599,-3.9757398097,,, +5.8398437500,5,-1.2437453520,-2.5990317900,1.3538507427,-4.0451040813,,, +5.8417968750,5,-1.0801275720,-1.8232442802,1.0440391532,-3.9732870900,,, +5.8437500000,5,-0.8804683817,-1.1092002198,0.7506933866,-3.7445810428,,, +5.8457031250,5,-0.6529814928,-0.4681441555,0.4761009791,-3.3548107125,,, +5.8476562500,5,-0.4061781913,0.0961341517,0.2208270683,-2.8124356655,,, +5.8496093750,5,-0.1501859838,0.5867275086,-0.0164172479,-2.1386666641,,, +5.8515625000,5,0.1020231816,1.0150327144,-0.2400019586,-1.3658143334,,, +5.8535156250,5,0.3305460522,1.4035439374,-0.4605755388,-0.5314419773,,, +5.8554687500,5,0.5086600501,1.7840485613,-0.6949647447,0.3271874240,,, +5.8574218750,5,0.6099541041,2.1879726386,-0.9599401765,1.1739689386,,, +5.8593750000,5,0.6168248098,2.6373826983,-1.2657558070,1.9738251111,,, +5.8613281250,5,0.5252723740,3.1430950143,-1.6141748480,2.6944717679,,, +5.8632812500,5,0.3422494302,3.7041990922,-1.9991791657,3.3077777262,,, +5.8652343750,5,0.0777064214,4.3058054283,-2.4082681953,3.7903584984,,, +5.8671875000,5,-0.2582665253,4.9194206543,-2.8236113165,4.1250909445,,, +5.8691406250,5,-0.6505039244,5.5068499547,-3.2225347301,4.3022208485,,, +5.8710937500,5,-1.0742713829,6.0246150183,-3.5781456120,4.3187137663,,, +5.8730468750,5,-1.4976195641,6.4309721689,-3.8633733358,4.1799849621,,, +5.8750000000,5,-1.8896896742,6.6966180551,-4.0587679173,3.9048628398,,, +5.8769531250,5,-2.2255966186,6.8070272232,-4.1546349356,3.5233313755,,, +5.8789062500,5,-2.4835389867,6.7521055341,-4.1440796174,3.0650220076,,, +5.8808593750,5,-2.6449314086,6.5229470479,-4.0209483071,2.5542449034,,, +5.8828125000,5,-2.7013175462,6.1243604906,-3.7883892680,2.0174789346,,, +5.8847656250,5,-2.6586994318,5.5874720547,-3.4668701148,1.4920156860,,, +5.8867187500,5,-2.5389189573,4.9751036752,-3.0973909714,1.0289917009,,, +5.8886718750,5,-2.3775784931,4.3755602594,-2.7374138721,0.6879807370,,, +5.8906250000,5,-2.2079158278,3.8712827674,-2.4397984564,0.5183488796,,, +5.8925781250,5,-2.0397527807,3.4997777573,-2.2263767529,0.5368267259,,, +5.8945312500,5,-1.8565126696,3.2446920993,-2.0820316638,0.7192408457,,, +5.8964843750,5,-1.6275924886,3.0531806397,-1.9668767421,1.0071766485,,, +5.8984375000,5,-1.3211004014,2.8550487806,-1.8303297609,1.3224461030,,, +5.9003906250,5,-0.9157147850,2.5818043344,-1.6255677076,1.5869006601,,, +5.9023437500,5,-0.4106534463,2.1845142383,-1.3223793978,1.7380939162,,, +5.9042968750,5,0.1733505303,1.6398322611,-0.9106272543,1.7329725296,,, +5.9062500000,5,0.8024658350,0.9444217381,-0.3953269987,1.5476742124,,, +5.9082031250,5,1.4402584495,0.1085310320,0.2088302162,1.1806019159,,, +5.9101562500,5,2.0546711791,-0.8469507512,0.8807900042,0.6523301962,,, +5.9121093750,5,2.6193996064,-1.8922400601,1.5950853100,-0.0005222080,,, +5.9140625000,5,3.1091632015,-2.9866832628,2.3199303773,-0.7277941811,,, +5.9160156250,5,3.4930999006,-4.0729642163,3.0123724845,-1.4628224184,,, +5.9179687500,5,3.7343318817,-5.0786150559,3.6195799118,-2.1282650810,,, +5.9199218750,5,3.7999496057,-5.9327041350,4.0917331300,-2.6563720408,,, +5.9218750000,5,3.6752423815,-6.5870642686,4.3978393939,-3.0066419945,,, +5.9238281250,5,3.3693455855,-7.0221503299,4.5298916951,-3.1652021383,,, +5.9257812500,5,2.9081820637,-7.2332211146,4.4929173868,-3.1311948799,,, +5.9277343750,5,2.3243282860,-7.2139601565,4.2929250670,-2.9025315345,,, +5.9296875000,5,1.6543745793,-6.9568942093,3.9361145828,-2.4739499996,,, +5.9316406250,5,0.9453077651,-6.4754799613,3.4433655900,-1.8585310065,,, +5.9335937500,5,0.2599996503,-5.8282300680,2.8659922061,-1.1140225698,,, +5.9355468750,5,-0.3304189064,-5.1146246904,2.2813720599,-0.3398135846,,, +5.9375000000,5,-0.7632112937,-4.4443187251,1.7708439923,0.3509073787,,, +5.9394531250,5,-0.9952428279,-3.9106623004,1.4016136952,0.8547903898,,, +5.9414062500,5,-1.0061924674,-3.5808271081,1.2199479056,1.0898630149,,, +5.9433593750,5,-0.8026718630,-3.4877735193,1.2453237192,1.0040467773,,, +5.9453125000,5,-0.4251018284,-3.6157965882,1.4604873120,0.5868766362,,, +5.9472656250,5,0.0561250410,-3.8960644860,1.8092813086,-0.1205141418,,, +5.9492187500,5,0.5631630776,-4.2283968568,2.2137296841,-1.0323017408,,, +5.9511718750,5,1.0342538914,-4.5140717393,2.5988330846,-2.0445435944,,, +5.9531250000,5,1.4285180733,-4.6728048429,2.9045278935,-3.0587501794,,, +5.9550781250,5,1.7172831805,-4.6419548705,3.0834780632,-3.9866424628,,, +5.9570312500,5,1.8759644843,-4.3723009580,3.0965093917,-4.7471121686,,, +5.9589843750,5,1.8799590043,-3.8255227716,2.9104434366,-5.2673162146,,, +5.9609375000,5,1.7051002148,-2.9722367714,2.4978496105,-5.4870174673,,, +5.9628906250,5,1.3360714849,-1.7986282326,1.8432492815,-5.3654391480,,, +5.9648437500,5,0.7793486480,-0.3243357405,0.9559895059,-4.8902826424,,, +5.9667968750,5,0.0668297410,1.3903212314,-0.1251828975,-4.0798789677,,, +5.9687500000,5,-0.7542438113,3.2597990178,-1.3430321673,-2.9746837132,,, +5.9707031250,5,-1.6312059427,5.1909075711,-2.6335209448,-1.6300136179,,, +5.9726562500,5,-2.5079475727,7.0877633701,-3.9286546629,-0.1158692704,,, +5.9746093750,5,-3.3240567616,8.8479970469,-5.1543228931,1.4815049088,,, +5.9765625000,5,-4.0145538802,10.3562146448,-6.2269542555,3.0572756835,,, +5.9785156250,5,-4.5143375444,11.4863698256,-7.0559386658,4.4888086476,,, +5.9804687500,5,-4.7702801041,12.1212389654,-7.5575114884,5.6489419146,,, +5.9824218750,5,-4.7554475418,12.1813354520,-7.6750545977,6.4317814282,,, +5.9843750000,5,-4.4781077244,11.6479771487,-7.3952859217,6.7786682498,,, +5.9863281250,5,-3.9777282147,10.5640027127,-6.7484353009,6.6862394735,,, +5.9882812500,5,-3.3049934435,9.0111376189,-5.7903742787,6.1903538561,,, +5.9902343750,5,-2.5009863657,7.0875153302,-4.5838023102,5.3434957074,,, +5.9921875000,5,-1.5951711955,4.9027392824,-3.1944999592,4.2070887538,,, +5.9941406250,5,-0.6204378564,2.5825763765,-1.6985066371,2.8584298025,,, +5.9960937500,5,0.3740595285,0.2691154274,-0.1862578930,1.3947199566,,, +5.9980468750,5,1.3253577770,-1.8885987859,1.2434730965,-0.0759764823,,, +6.0000000000,6,2.1713849163,-3.7522957341,2.4974401931,-1.4483125815,33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +6.0019531250,6,2.8652799240,-5.2145332435,3.5018621272,-2.6259954098,,, +6.0039062500,6,3.3793390518,-6.2095726775,4.2086418741,-3.5233112798,,, +6.0058593750,6,3.7007757726,-6.7088694350,4.5926153469,-4.0692610018,,, +6.0078125000,6,3.8267899425,-6.7131258716,4.6475646652,-4.2161154476,,, +6.0097656250,6,3.7606822224,-6.2571898895,4.3887706482,-3.9509973148,,, +6.0117187500,6,3.5093762293,-5.4188071537,3.8569370368,-3.3008801898,,, +6.0136718750,6,3.0833734472,-4.3074457543,3.1117924764,-2.3219199362,,, +6.0156250000,6,2.4975784553,-3.0366329595,2.2179432969,-1.0851113319,,, +6.0175781250,6,1.7745149143,-1.7075562117,1.2380993325,0.3251271769,,, +6.0195312500,6,0.9490542080,-0.4098348872,0.2350745950,1.8082781166,,, +6.0214843750,6,0.0691754059,0.7777323549,-0.7286018816,3.2556358567,,, +6.0234375000,6,-0.8027011018,1.7872942584,-1.5917425807,4.5617668317,,, +6.0253906250,6,-1.5885825916,2.5590667604,-2.2939564787,5.6336206669,,, +6.0273437500,6,-2.2099630048,3.0479155751,-2.7843316188,6.4027053590,,, +6.0292968750,6,-2.6112823373,3.2339351625,-3.0337141182,6.8323485286,,, +6.0312500000,6,-2.7646875768,3.1162872910,-3.0319710243,6.9072298144,,, +6.0332031250,6,-2.6589816217,2.6994320915,-2.7764677961,6.6155994765,,, +6.0351562500,6,-2.2963726863,1.9948372544,-2.2717431730,5.9475340762,,, +6.0371093750,6,-1.7023186082,1.0363275936,-1.5414627727,4.9128182281,,, +6.0390625000,6,-0.9350005681,-0.1071873795,-0.6392594786,3.5602989192,,, +6.0410156250,6,-0.0826951983,-1.3310471820,0.3511387321,1.9822080779,,, +6.0429687500,6,0.7509878055,-2.5074011867,1.3272863956,0.3015551876,,, +6.0449218750,6,1.4657508365,-3.5039904759,2.1841157508,-1.3467640145,,, +6.0468750000,6,1.9810872333,-4.2023978824,2.8290676830,-2.8337561647,,, +6.0488281250,6,2.2465405068,-4.5150026676,3.1947280357,-4.0526698319,,, +6.0507812500,6,2.2397847275,-4.3952193857,3.2442643754,-4.9293219267,,, +6.0527343750,6,1.9617944704,-3.8421821624,2.9729653776,-5.4279121212,,, +6.0546875000,6,1.4477094142,-2.9126664927,2.4180782477,-5.5615492527,,, +6.0566406250,6,0.7849120691,-1.7288817637,1.6682118988,-5.3980185961,,, +6.0585937500,6,0.1046905487,-0.4543611640,0.8475487469,-5.0396229263,,, +6.0605468750,6,-0.4652831718,0.7521496253,0.0769559155,-4.5866652566,,, +6.0625000000,6,-0.8482116087,1.7669512590,-0.5554864040,-4.1182880348,,, +6.0644531250,6,-1.0216467644,2.5047819966,-0.9967937189,-3.6945530667,,, +6.0664062500,6,-0.9946067477,2.9148563204,-1.2210378872,-3.3551410048,,, +6.0683593750,6,-0.8006955415,2.9881274406,-1.2323457644,-3.1066801892,,, +6.0703125000,6,-0.5091967451,2.7730464413,-1.0766603946,-2.9118884790,,, +6.0722656250,6,-0.2198447819,2.3694278219,-0.8360338115,-2.7020620609,,, +6.0742187500,6,-0.0237754687,1.8803216739,-0.5902020472,-2.4212268322,,, +6.0761718750,6,0.0385145499,1.3568891991,-0.3742590133,-2.0681235738,,, +6.0781250000,6,-0.0139025299,0.7887566852,-0.1716919401,-1.6955639935,,, +6.0800781250,6,-0.1284954420,0.1420217323,0.0560779195,-1.3712039733,,, +6.0820312500,6,-0.2586766589,-0.6016601656,0.3360149572,-1.1395160049,,, +6.0839843750,6,-0.3825656743,-1.4372433675,0.6743453876,-1.0199400601,,, +6.0859375000,6,-0.4913972985,-2.3427824777,1.0651027817,-1.0261768414,,, +6.0878906250,6,-0.5777251383,-3.2757715703,1.4916198720,-1.1655107187,,, +6.0898437500,6,-0.6392679407,-4.1645219479,1.9192002729,-1.4204436238,,, +6.0917968750,6,-0.6819831389,-4.9116431516,2.2949516280,-1.7414360154,,, +6.0937500000,6,-0.7110198662,-5.4180215723,2.5625604203,-2.0563559231,,, +6.0957031250,6,-0.7178108321,-5.6174076364,2.6841345530,-2.2881835501,,, +6.0976562500,6,-0.6766348597,-5.4973393028,2.6534511787,-2.3755987520,,, +6.0996093750,6,-0.5548623307,-5.0917962816,2.4911837396,-2.2849763073,,, +6.1015625000,6,-0.3304445144,-4.4560486808,2.2275886244,-2.0043442948,,, +6.1035156250,6,-0.0037456824,-3.6472528946,1.8887624243,-1.5317985052,,, +6.1054687500,6,0.4036119509,-2.7159802198,1.4925864127,-0.8718332941,,, +6.1074218750,6,0.8555757798,-1.7007224527,1.0481549751,-0.0361354491,,, +6.1093750000,6,1.3087085061,-0.6345821233,0.5614656619,0.9512968412,,, +6.1113281250,6,1.7236127389,0.4369150883,0.0483307852,2.0429293954,,, +6.1132812500,6,2.0761075774,1.4543905326,-0.4614652698,3.1650877009,,, +6.1152343750,6,2.3552059705,2.3631051182,-0.9356703223,4.2365028192,,, +6.1171875000,6,2.5507512747,3.1264231039,-1.3521774799,5.1913350768,,, +6.1191406250,6,2.6489217712,3.7272153154,-1.7015880974,5.9848158499,,, +6.1210937500,6,2.6337701964,4.1702302485,-1.9875198668,6.5906818006,,, +6.1230468750,6,2.4778804457,4.4879474432,-2.2326427030,7.0063798734,,, +6.1250000000,6,2.1364898406,4.7342275857,-2.4774026197,7.2527197074,,, +6.1269531250,6,1.5680615194,4.9589713883,-2.7598754389,7.3533511416,,, +6.1289062500,6,0.7657264636,5.1841263223,-3.0929241984,7.3130345719,,, +6.1308593750,6,-0.2259647801,5.3994904600,-3.4572039815,7.1161189769,,, +6.1328125000,6,-1.3171756369,5.5733787846,-3.8092913410,6.7384753758,,, +6.1347656250,6,-2.4043434094,5.6711856256,-4.1013612501,6.1641085874,,, +6.1367187500,6,-3.4106050938,5.6748508847,-4.3039337654,5.4023269162,,, +6.1386718750,6,-4.2997595519,5.5856061761,-4.4112005306,4.4879076646,,, +6.1406250000,6,-5.0550335658,5.4055469047,-4.4235986348,3.4585522679,,, +6.1425781250,6,-5.6492735587,5.1182456104,-4.3276407703,2.3339347291,,, +6.1445312500,6,-6.0325626498,4.6906819210,-4.0936027770,1.1183820064,,, +6.1464843750,6,-6.1425882636,4.0939638060,-3.6905856021,-0.1800123146,,, +6.1484375000,6,-5.9243218170,3.3154714747,-3.0993339861,-1.5374393924,,, +6.1503906250,6,-5.3448365153,2.3542828842,-2.3141925762,-2.9153001361,,, +6.1523437500,6,-4.4018946027,1.2217253931,-1.3457245159,-4.2613672874,,, +6.1542968750,6,-3.1261426635,-0.0511472594,-0.2247632231,-5.5116790635,,, +6.1562500000,6,-1.5782536225,-1.4152744447,1.0000407190,-6.5979717645,,, +6.1582031250,6,0.1512014508,-2.8090272546,2.2655883020,-7.4541032093,,, +6.1601562500,6,1.9441470922,-4.1608392560,3.4970681671,-8.0231484270,,, +6.1621093750,6,3.6680868071,-5.3948448970,4.6155473688,-8.2675558669,,, +6.1640625000,6,5.1920014440,-6.4377821608,5.5465618916,-8.1752179054,,, +6.1660156250,6,6.4017574694,-7.2278620460,6.2291655031,-7.7621349046,,, +6.1679687500,6,7.2166006925,-7.7256084101,6.6258333813,-7.0717534695,,, +6.1699218750,6,7.5979977645,-7.9175487665,6.7260635497,-6.1683953822,,, +6.1718750000,6,7.5498610745,-7.8149980516,6.5452223754,-5.1307431628,,, +6.1738281250,6,7.1134051421,-7.4483207880,6.1190473776,-4.0405555346,,, +6.1757812500,6,6.3496047532,-6.8475978107,5.4863954202,-2.9589896629,,, +6.1777343750,6,5.3177673900,-6.0244464861,4.6721216844,-1.9091750574,,, +6.1796875000,6,4.0713992423,-4.9767063074,3.6889535280,-0.8831148986,,, +6.1816406250,6,2.6695970013,-3.7091083254,2.5535167500,0.1356121744,,, +6.1835937500,6,1.1866716995,-2.2516704373,1.3007446377,1.1496895219,,, +6.1855468750,6,-0.2890477193,-0.6643209075,-0.0131128183,2.1398159341,,, +6.1875000000,6,-1.6642852454,0.9738731629,-1.3192607560,3.0735634839,,, +6.1894531250,6,-2.8496090963,2.5780736163,-2.5465891855,3.9162556817,,, +6.1914062500,6,-3.7645191240,4.0610577755,-3.6247550299,4.6312494435,,, +6.1933593750,6,-4.3431573739,5.3335670544,-4.4857941022,5.1784325102,,, +6.1953125000,6,-4.5455945283,6.3135632274,-5.0727997360,5.5215946062,,, +6.1972656250,6,-4.3695276991,6.9387293276,-5.3505161604,5.6368035720,,, +6.1992187500,6,-3.8525800797,7.1735467109,-5.3097929435,5.5134887564,,, +6.2011718750,6,-3.0643333297,7.0130050822,-4.9672219687,5.1536407458,,, +6.2031250000,6,-2.0944368457,6.4835254119,-4.3625674750,4.5738471892,,, +6.2050781250,6,-1.0435814296,5.6389390068,-3.5546557524,3.8082121518,,, +6.2070312500,6,-0.0176584141,4.5535981652,-2.6164394191,2.9089225411,,, +6.2089843750,6,0.8818809159,3.3148941011,-1.6280230085,1.9417915963,,, +6.2109375000,6,1.5729440236,2.0139799132,-0.6666042523,0.9763240963,,, +6.2128906250,6,2.0041852294,0.7359340961,0.2030366176,0.0747666236,,, +6.2148437500,6,2.1556322194,-0.4458285177,0.9322556855,-0.7131523285,,, +6.2167968750,6,2.0294923690,-1.4692086211,1.4856314710,-1.3484984143,,, +6.2187500000,6,1.6384932554,-2.2804957415,1.8357986363,-1.8000049805,,, +6.2207031250,6,1.0038366672,-2.8369210829,1.9644184913,-2.0465944571,,, +6.2226562500,6,0.1653690529,-3.1185493845,1.8719947802,-2.0851257208,,, +6.2246093750,6,-0.8109631304,-3.1389179134,1.5859530286,-1.9347046478,,, +6.2265625000,6,-1.8393395178,-2.9420647880,1.1571320801,-1.6334565558,,, +6.2285156250,6,-2.8272541316,-2.5891529225,0.6486522501,-1.2319765358,,, +6.2304687500,6,-3.6861239337,-2.1470285400,0.1264240435,-0.7871007179,,, +6.2324218750,6,-4.3380721194,-1.6823594532,-0.3465938609,-0.3555394443,,, +6.2343750000,6,-4.7201785835,-1.2562275134,-0.7152740196,0.0130094342,,, +6.2363281250,6,-4.7875243201,-0.9187914124,-0.9364721633,0.2802706703,,, +6.2382812500,6,-4.5189954010,-0.7061898832,-0.9822845543,0.4192583275,,, +6.2402343750,6,-3.9259610874,-0.6367506236,-0.8444529288,0.4136657422,,, +6.2421875000,6,-3.0553901067,-0.7064900135,-0.5378859697,0.2601597570,,, +6.2441406250,6,-1.9816673660,-0.8895322452,-0.0983193205,-0.0302668127,,, +6.2460937500,6,-0.7922151564,-1.1453647516,0.4257252502,-0.4348873238,,, +6.2480468750,6,0.4248635335,-1.4285406538,0.9817254656,-0.9225627741,,, +6.2500000000,6,1.5869960635,-1.6957745794,1.5187191058,-1.4552412223,,, +6.2519531250,6,2.6199760786,-1.9107905396,1.9908701230,-1.9894609784,,, +6.2539062500,6,3.4635522824,-2.0496961911,2.3624203401,-2.4797811023,,, +6.2558593750,6,4.0792739177,-2.1063141320,2.6137415877,-2.8854333090,,, +6.2578125000,6,4.4556872247,-2.0953336131,2.7458574922,-3.1798819069,,, +6.2597656250,6,4.6066461396,-2.0473780914,2.7779458996,-3.3545605294,,, +6.2617187500,6,4.5595800633,-1.9910259380,2.7333690015,-3.4088785047,,, +6.2636718750,6,4.3393153210,-1.9323924918,2.6226329252,-3.3364123128,,, +6.2656250000,6,3.9594579447,-1.8490297671,2.4372169579,-3.1220322975,,, +6.2675781250,6,3.4274953827,-1.7021923727,2.1581579665,-2.7497824289,,, +6.2695312500,6,2.7591546780,-1.4583642521,1.7725677297,-2.2136259584,,, +6.2714843750,6,1.9892436653,-1.1046475574,1.2857010927,-1.5252349459,,, +6.2734375000,6,1.1708287167,-0.6503679379,0.7217152091,-0.7155604585,,, +6.2753906250,6,0.3650689543,-0.1201982083,0.1165996202,0.1692351638,,, +6.2773437500,6,-0.3716540529,0.4525354076,-0.4896382545,1.0725596966,,, +6.2792968750,6,-0.9940028120,1.0257972891,-1.0549937739,1.9292658817,,, +6.2812500000,6,-1.4661988823,1.5478663996,-1.5351236657,2.6705552435,,, +6.2832031250,6,-1.7618834540,1.9669262547,-1.8896613331,3.2359858691,,, +6.2851562500,6,-1.8665002087,2.2457497300,-2.0916032710,3.5841103448,,, +6.2871093750,6,-1.7786493845,2.3692758926,-2.1319103399,3.6967531302,,, +6.2890625000,6,-1.5117790731,2.3429757259,-2.0190064969,3.5787687352,,, +6.2910156250,6,-1.0939810403,2.1867979134,-1.7750522657,3.2532272647,,, +6.2929687500,6,-0.5653096683,1.9320449221,-1.4331433185,2.7569811983,,, +6.2949218750,6,0.0206195661,1.6216129889,-1.0379138327,2.1409056581,,, +6.2968750000,6,0.5942318634,1.3056648630,-0.6433180989,1.4667420341,,, +6.2988281250,6,1.0782784210,1.0330195285,-0.3042304937,0.7970254768,,, +6.3007812500,6,1.4018902656,0.8477946650,-0.0699396355,0.1888879055,,, +6.3027343750,6,1.5089823257,0.7894259774,0.0180020930,-0.3063949907,,, +6.3046875000,6,1.3660725672,0.8833370622,-0.0663882629,-0.6495738677,,, +6.3066406250,6,0.9727995514,1.1271777036,-0.3218068312,-0.8228471729,,, +6.3085937500,6,0.3622611101,1.4929591864,-0.7208974801,-0.8270328876,,, +6.3105468750,6,-0.4101677429,1.9421106145,-1.2232431640,-0.6697723213,,, +6.3125000000,6,-1.2738829916,2.4320816990,-1.7818083197,-0.3628145866,,, +6.3144531250,6,-2.1444608210,2.9157544313,-2.3427794293,0.0723446738,,, +6.3164062500,6,-2.9297530392,3.3451933136,-2.8492389496,0.6020681250,,, +6.3183593750,6,-3.5417210897,3.6773847820,-3.2479707386,1.1827000065,,, +6.3203125000,6,-3.9119607038,3.8818419664,-3.4989731201,1.7675739245,,, +6.3222656250,6,-4.0060954677,3.9470335857,-3.5841177178,2.3153135869,,, +6.3242187500,6,-3.8266419045,3.8763276815,-3.5055052159,2.7902697271,,, +6.3261718750,6,-3.4029719880,3.6793872846,-3.2767001869,3.1578238081,,, +6.3281250000,6,-2.7767794463,3.3685264168,-2.9158748992,3.3838394561,,, +6.3300781250,6,-1.9910560574,2.9559829308,-2.4412283194,3.4388684293,,, +6.3320312500,6,-1.0870400113,2.4485425576,-1.8672351558,3.3006948307,,, +6.3339843750,6,-0.1083912284,1.8468582414,-1.2055549381,2.9549515500,,, +6.3359375000,6,0.8929518132,1.1521842902,-0.4713114467,2.3997618784,,, +6.3378906250,6,1.8566509434,0.3704124372,0.3137064568,1.6505948054,,, +6.3398437500,6,2.7207537252,-0.4883436337,1.1233516074,0.7390668223,,, +6.3417968750,6,3.4292068499,-1.4073366314,1.9285253673,-0.2908861800,,, +6.3437500000,6,3.9379672595,-2.3615082888,2.6984886214,-1.3873388514,,, +6.3457031250,6,4.2206642191,-3.3205105186,3.4046557994,-2.4954685729,,, +6.3476562500,6,4.2713714370,-4.2497268569,4.0220923025,-3.5597125306,,, +6.3496093750,6,4.1032484125,-5.1080583459,4.5277100732,-4.5234605463,,, +6.3515625000,6,3.7441529327,-5.8496731152,4.9001573913,-5.3320208911,,, +6.3535156250,6,3.2302490934,-6.4299949942,5.1217212710,-5.9382493890,,, +6.3554687500,6,2.5992909059,-6.8103667033,5.1790258260,-6.3057571159,,, +6.3574218750,6,1.8842737392,-6.9607117246,5.0624709832,-6.4098264265,,, +6.3593750000,6,1.1075017252,-6.8615760898,4.7655076530,-6.2379527222,,, +6.3613281250,6,0.2790413067,-6.5052253768,4.2848299307,-5.7902566432,,, +6.3632812500,6,-0.5964532126,-5.8976454262,3.6239940879,-5.0815128696,,, +6.3652343750,6,-1.5088043199,-5.0623944547,2.7996800016,-4.1443679888,,, +6.3671875000,6,-2.4342886664,-4.0421648823,1.8454565224,-3.0292362367,,, +6.3691406250,6,-3.3320943022,-2.8953349089,0.8108458076,-1.8003598233,,, +6.3710937500,6,-4.1441367441,-1.6906130532,-0.2416234787,-0.5325406828,,, +6.3730468750,6,-4.7991313776,-0.5022647427,-1.2403307313,0.6920295303,,, +6.3750000000,6,-5.2252371207,0.5980360527,-2.1140662194,1.7935141123,,, +6.3769531250,6,-5.3699304327,1.5538179971,-2.8073547085,2.7098525297,,, +6.3789062500,6,-5.2123046420,2.3294210124,-3.2887037385,3.4048129134,,, +6.3808593750,6,-4.7594671770,2.9036452990,-3.5452732795,3.8625173482,,, +6.3828125000,6,-4.0378139186,3.2635094555,-3.5753723021,4.0786914678,,, +6.3847656250,6,-3.0863860995,3.4036059146,-3.3853860112,4.0565582337,,, +6.3867187500,6,-1.9499943106,3.3287858305,-2.9893755092,3.8067822754,,, +6.3886718750,6,-0.6772059607,3.0615596959,-2.4139928414,3.3522752878,,, +6.3906250000,6,0.6737967517,2.6471491887,-1.7047790758,2.7337277122,,, +6.3925781250,6,2.0317973521,2.1480982584,-0.9244060008,2.0075807739,,, +6.3945312500,6,3.3159470776,1.6356070508,-0.1459066355,1.2393182357,,, +6.3964843750,6,4.4415947695,1.1811254352,0.5548086784,0.4972897821,,, +6.3984375000,6,5.3288899026,0.8423561309,1.1109425715,-0.1554187101,,, +6.4003906250,6,5.9119922768,0.6510426440,1.4760458163,-0.6685020926,,, +6.4023437500,6,6.1453073762,0.6126103190,1.6268187712,-1.0070023734,,, +6.4042968750,6,6.0105472893,0.7098088168,1.5637276768,-1.1539208095,,, +6.4062500000,6,5.5249529529,0.9033408746,1.3140098996,-1.1152410591,,, +6.4082031250,6,4.7421910403,1.1371261454,0.9290720458,-0.9195002221,,, +6.4101562500,6,3.7422181277,1.3515500452,0.4725973335,-0.6084793466,,, +6.4121093750,6,2.6180438418,1.4953216086,0.0082396362,-0.2272056865,,, +6.4140625000,6,1.4644486542,1.5310831746,-0.4078109905,0.1812282228,,, +6.4160156250,6,0.3640410572,1.4406861075,-0.7348211764,0.5803336873,,, +6.4179687500,6,-0.6253087467,1.2302098126,-0.9551330438,0.9448187570,,, +6.4199218750,6,-1.4700294699,0.9264236410,-1.0719665972,1.2586372025,,, +6.4218750000,6,-2.1517426683,0.5669669864,-1.1001568694,1.5092648764,,, +6.4238281250,6,-2.6614005826,0.1932868440,-1.0600253356,1.6868401449,,, +6.4257812500,6,-2.9957602607,-0.1550462123,-0.9730851933,1.7857617927,,, +6.4277343750,6,-3.1526036607,-0.4464030647,-0.8566589826,1.8032815306,,, +6.4296875000,6,-3.1285684771,-0.6585594458,-0.7219892393,1.7376375779,,, +6.4316406250,6,-2.9219740324,-0.7749272464,-0.5776718323,1.5892080262,,, +6.4335937500,6,-2.5387224763,-0.7802830931,-0.4350587439,1.3650495638,,, +6.4355468750,6,-1.9992374384,-0.6634944886,-0.3093749167,1.0815933892,,, +6.4375000000,6,-1.3417800805,-0.4285791797,-0.2130103329,0.7586280719,,, +6.4394531250,6,-0.6205356004,-0.0986185595,-0.1513140065,0.4131099220,,, +6.4414062500,6,0.0957370933,0.2951625405,-0.1293353907,0.0636418587,,, +6.4433593750,6,0.7274470098,0.7226401647,-0.1569864899,-0.2652008198,,, +6.4453125000,6,1.1986298566,1.1533713418,-0.2428584632,-0.5487362540,,, +6.4472656250,6,1.4539570112,1.5552031044,-0.3871468764,-0.7684011530,,, +6.4492187500,6,1.4648366715,1.8978350366,-0.5820454722,-0.9111739765,,, +6.4511718750,6,1.2271932445,2.1540490299,-0.8132902254,-0.9694988411,,, +6.4531250000,6,0.7600552040,2.2974804277,-1.0586658140,-0.9451305532,,, +6.4550781250,6,0.1052552594,2.3037340108,-1.2884249202,-0.8505451033,,, +6.4570312500,6,-0.6767387021,2.1546647780,-1.4694727438,-0.7059875180,,, +6.4589843750,6,-1.5159283924,1.8410465056,-1.5703164863,-0.5355636352,,, +6.4609375000,6,-2.3423415242,1.3639267041,-1.5654029160,-0.3636820189,,, +6.4628906250,6,-3.0917616302,0.7364190273,-1.4385665553,-0.2121694533,,, +6.4648437500,6,-3.7070167561,-0.0148787522,-1.1847508446,-0.0989008416,,, +6.4667968750,6,-4.1371859266,-0.8492354211,-0.8105079634,-0.0372373153,,, +6.4687500000,6,-4.3390382637,-1.7125521347,-0.3343436118,-0.0350237879,,, +6.4707031250,6,-4.2810029419,-2.5426815046,0.2152556907,-0.0951458540,,, +6.4726562500,6,-3.9455407496,-3.2793213639,0.8056535383,-0.2187395276,,, +6.4746093750,6,-3.3308451906,-3.8729308864,1.4054839599,-0.4065214209,,, +6.4765625000,6,-2.4565588009,-4.2876280080,1.9844984124,-0.6549183567,,, +6.4785156250,6,-1.3704566486,-4.4984783620,2.5091598278,-0.9502812003,,, +6.4804687500,6,-0.1471338897,-4.4891865520,2.9412519388,-1.2670054256,,, +6.4824218750,6,1.1220769606,-4.2538587927,3.2426203150,-1.5713294894,,, +6.4843750000,6,2.3418675328,-3.7996142561,3.3818318586,-1.8276412891,,, +6.4863281250,6,3.4267225727,-3.1484431711,3.3406497503,-2.0049002102,,, +6.4882812500,6,4.3126975647,-2.3392207379,3.1196828678,-2.0818415331,,, +6.4902343750,6,4.9610576147,-1.4273536051,2.7397204814,-2.0493101317,,, +6.4921875000,6,5.3572037868,-0.4811221321,2.2396980018,-1.9118804325,,, +6.4941406250,6,5.5108037831,0.4248737212,1.6731870230,-1.6890569729,,, +6.4960937500,6,5.4532997355,1.2216391060,1.0993697622,-1.4103388940,,, +6.4980468750,6,5.2298865899,1.8591398611,0.5701131271,-1.1048404664,,, +6.5000000000,6,4.8852974176,2.3140186261,0.1186474122,-0.7916983250,,, +6.5019531250,6,4.4435588865,2.5911855521,-0.2492105627,-0.4741324946,,, +6.5039062500,6,3.9005458453,2.7140132753,-0.5507537977,-0.1442488647,,, +6.5058593750,6,3.2450611051,2.7023761450,-0.8029242422,0.1997300191,,, +6.5078125000,6,2.4849123844,2.5599088282,-1.0037017552,0.5422818238,,, +6.5097656250,6,1.6512676601,2.2826082706,-1.1368534040,0.8570615726,,, +6.5117187500,6,0.7882335698,1.8725038475,-1.1856440806,1.1184893941,,, +6.5136718750,6,-0.0570331499,1.3438839130,-1.1408057947,1.3075123646,,, +6.5156250000,6,-0.8409303234,0.7249829273,-1.0041273535,1.4135994490,,, +6.5175781250,6,-1.5285530180,0.0562162863,-0.7893312736,1.4351755451,,, +6.5195312500,6,-2.0971775060,-0.6157220202,-0.5195139274,1.3785206137,,, +6.5214843750,6,-2.5381349345,-1.2434315295,-0.2241863305,1.2571365761,,, +6.5234375000,6,-2.8572731239,-1.7812635792,0.0621120704,1.0917882981,,, +6.5253906250,6,-3.0720834480,-2.1872823558,0.3023142216,0.9086134612,,, +6.5273437500,6,-3.2035703092,-2.4255838765,0.4616609710,0.7349793251,,, +6.5292968750,6,-3.2656372981,-2.4685749001,0.5133108540,0.5945843454,,, +6.5312500000,6,-3.2626605642,-2.3011824497,0.4420989505,0.5045667763,,, +6.5332031250,6,-3.1994372368,-1.9250775386,0.2437630255,0.4769744833,,, +6.5351562500,6,-3.0885369392,-1.3594239164,-0.0768183708,0.5199077640,,, +6.5371093750,6,-2.9461018884,-0.6402032439,-0.5035940794,0.6341888853,,, +6.5390625000,6,-2.7872074392,0.1816106206,-1.0081501775,0.8108950212,,, +6.5410156250,6,-2.6256203062,1.0456483449,-1.5534047758,1.0327814653,,, +6.5429687500,6,-2.4713326851,1.8890185925,-2.0977090556,1.2755874614,,, +6.5449218750,6,-2.3269067658,2.6517155945,-2.5976333100,1.5093153971,,, +6.5468750000,6,-2.1874659656,3.2818779894,-3.0121963360,1.7026782457,,, +6.5488281250,6,-2.0420100847,3.7397802556,-3.3066785288,1.8283422917,,, +6.5507812500,6,-1.8735717383,3.9978894424,-3.4529129791,1.8648040887,,, +6.5527343750,6,-1.6602472694,4.0391445349,-3.4283880030,1.7958268642,,, +6.5546875000,6,-1.3786472985,3.8574995728,-3.2178947202,1.6108588566,,, +6.5566406250,6,-1.0094424156,3.4600076891,-2.8171450890,1.3069453652,,, +6.5585937500,6,-0.5430218961,2.8668272912,-2.2348820060,0.8900499741,,, +6.5605468750,6,0.0170678786,2.1098532064,-1.4932491205,0.3756317037,,, +6.5625000000,6,0.6535364209,1.2324130891,-0.6281900547,-0.2105914936,,, +6.5644531250,6,1.3383551006,0.2875395855,0.3124397787,-0.8337150344,,, +6.5664062500,6,2.0383970279,-0.6668676552,1.2742863765,-1.4536631725,,, +6.5683593750,6,2.7193771008,-1.5727367909,2.2013776422,-2.0293762301,,, +6.5703125000,6,3.3472771577,-2.3755564726,3.0394367541,-2.5221672449,,, +6.5722656250,6,3.8901954935,-3.0289928836,3.7402092803,-2.8994742629,,, +6.5742187500,6,4.3194405526,-3.4985957381,4.2650234698,-3.1375371969,,, +6.5761718750,6,4.6080455162,-3.7628115673,4.5853613110,-3.2218251273,,, +6.5781250000,6,4.7301612484,-3.8131484660,4.6830301021,-3.1472528131,,, +6.5800781250,6,4.6636167289,-3.6537614439,4.5509578624,-2.9184979680,,, +6.5820312500,6,4.3936805301,-3.2997297418,4.1932814842,-2.5491150342,,, +6.5839843750,6,3.9172851752,-2.7763708817,3.6264291933,-2.0610680629,,, +6.5859375000,6,3.2473850730,-2.1203070462,2.8817632279,-1.4855640386,,, +6.5878906250,6,2.4147548226,-1.3787976641,2.0058693896,-0.8620228371,,, +6.5898437500,6,1.4657724464,-0.6057041693,1.0565600333,-0.2336824692,,, +6.5917968750,6,0.4574149252,0.1439789186,0.0967379452,0.3577981021,,, +6.5937500000,6,-0.5488231384,0.8197020052,-0.8121089966,0.8769473542,,, +6.5957031250,6,-1.4930497784,1.3805694148,-1.6160985483,1.2979618099,,, +6.5976562500,6,-2.3229418588,1.7987358404,-2.2736729971,1.6064713479,,, +6.5996093750,6,-2.9988179236,2.0602048436,-2.7579846322,1.7992564276,,, +6.6015625000,6,-3.4962617730,2.1640825854,-3.0572946236,1.8824224058,,, +6.6035156250,6,-3.8056954459,2.1213735099,-3.1740501363,1.8686255927,,, +6.6054687500,6,-3.9302162128,1.9537240580,-3.1233566714,1.7744216127,,, +6.6074218750,6,-3.8837938574,1.6921096001,-2.9316059540,1.6193847034,,, +6.6093750000,6,-3.6893885375,1.3737530059,-2.6337832404,1.4259789607,,, +6.6113281250,6,-3.3755890982,1.0361806003,-2.2679838203,1.2175025742,,, +6.6132812500,6,-2.9739459282,0.7118890221,-1.8705780006,1.0152124414,,, +6.6152343750,6,-2.5183644033,0.4270196440,-1.4751186118,0.8369519185,,, +6.6171875000,6,-2.0435514963,0.2019328766,-1.1120824430,0.6961572157,,, +6.6191406250,6,-1.5807524910,0.0503799324,-0.8061429283,0.5997567689,,, +6.6210937500,6,-1.1529214476,-0.0220364040,-0.5724656806,0.5462572541,,, +6.6230468750,6,-0.7724175646,-0.0178857409,-0.4152832909,0.5262104004,,, +6.6250000000,6,-0.4420683886,0.0531730442,-0.3289991415,0.5250478613,,, +6.6269531250,6,-0.1573280187,0.1752777730,-0.2997693099,0.5262959351,,, +6.6289062500,6,0.0921786683,0.3276029873,-0.3071318692,0.5141566844,,, +6.6308593750,6,0.3207408929,0.4860334115,-0.3262152523,0.4752369687,,, +6.6328125000,6,0.5439453140,0.6243682334,-0.3299719005,0.3987098198,,, +6.6347656250,6,0.7762494239,0.7164396090,-0.2920298004,0.2759396409,,, +6.6367187500,6,1.0289368599,0.7400322391,-0.1906928313,0.1013736014,,, +6.6386718750,6,1.3089544054,0.6796087179,-0.0114685510,-0.1263429722,,, +6.6406250000,6,1.6193208706,0.5266534365,0.2530687707,-0.4044531196,,, +6.6425781250,6,1.9605033318,0.2802023520,0.6036214713,-0.7267337488,,, +6.6445312500,6,2.3311222163,-0.0523115879,1.0337835202,-1.0840533344,,, +6.6464843750,6,2.7272341020,-0.4558660744,1.5301886860,-1.4647470553,,, +6.6484375000,6,3.1414155161,-0.9100032954,2.0735848785,-1.8547296410,,, +6.6503906250,6,3.5626105897,-1.3914146584,2.6406971255,-2.2377858588,,, +6.6523437500,6,3.9758073053,-1.8762880306,3.2061178619,-2.5962417606,,, +6.6542968750,6,4.3605854494,-2.3405264531,3.7421927445,-2.9110995219,,, +6.6562500000,6,4.6894911314,-2.7582197424,4.2172461782,-3.1616003865,,, +6.6582031250,6,4.9282622738,-3.1020119337,4.5957962917,-3.3259741992,,, +6.6601562500,6,5.0386046444,-3.3459806907,4.8417316507,-3.3836728653,,, +6.6621093750,6,4.9821806156,-3.4680472204,4.9216338479,-3.3172070627,,, +6.6640625000,6,4.7246260920,-3.4512439580,4.8073216357,-3.1132683083,,, +6.6660156250,6,4.2401158158,-3.2850520006,4.4789019601,-2.7644936137,,, +6.6679687500,6,3.5164813982,-2.9662733900,3.9277660383,-2.2713897212,,, +6.6699218750,6,2.5590310894,-2.4988542719,3.1581242448,-1.6428856178,,, +6.6718750000,6,1.3916888063,-1.8940121634,2.1876422624,-0.8959609912,,, +6.6738281250,6,0.0553795667,-1.1713548989,1.0477791303,-0.0553570159,,, +6.6757812500,6,-1.3958489608,-0.3595483395,-0.2171410042,0.8471431506,,, +6.6777343750,6,-2.8994143377,0.5043011072,-1.5521316368,1.7741404147,,, +6.6796875000,6,-4.3879764499,1.3760897782,-2.8940091980,2.6841057416,,, +6.6816406250,6,-5.7928419685,2.2072914344,-4.1746540862,3.5333150266,,, +6.6835937500,6,-7.0475203918,2.9490453188,-5.3257102560,4.2787882894,,, +6.6855468750,6,-8.0904504329,3.5569845489,-6.2837005356,4.8812927874,,, +6.6875000000,6,-8.8669099131,3.9961091753,-6.9949817076,5.3078039408,,, +6.6894531250,6,-9.3311232237,4.2446450514,-7.4200585210,5.5334085284,,, +6.6914062500,6,-9.4485234457,4.2949865463,-7.5355736722,5.5421776538,,, +6.6933593750,6,-9.1988352695,4.1524082785,-7.3347943714,5.3280540700,,, +6.6953125000,6,-8.5813972385,3.8341669279,-6.8294104134,4.8973336752,,, +6.6972656250,6,-7.6213097636,3.3685870359,-6.0516718692,4.2712676131,,, +6.6992187500,6,-6.3723976231,2.7925075260,-5.0537499942,3.4861622361,,, +6.7011718750,6,-4.9139808364,2.1480127732,-3.9037782889,2.5905360722,,, +6.7031250000,6,-3.3413940892,1.4792937393,-2.6792062261,1.6401099753,,, +6.7050781250,6,-1.7532707297,0.8288254338,-1.4580710590,0.6915549901,,, +6.7070312500,6,-0.2403729709,0.2334171599,-0.3107892894,-0.2031167904,,, +6.7089843750,6,1.1215829790,-0.2784751820,0.7052474917,-1.0000846088,,, +6.7109375000,6,2.2769691047,-0.6887967665,1.5496697722,-1.6662621397,,, +6.7128906250,6,3.1938415139,-0.9913486083,2.2021472328,-2.1815808485,,, +6.7148437500,6,3.8629594766,-1.1908049081,2.6614301517,-2.5391968348,,, +6.7167968750,6,4.2918540724,-1.2996928742,2.9404266110,-2.7431389255,,, +6.7187500000,6,4.4977769417,-1.3353882538,3.0606571290,-2.8051691733,,, +6.7207031250,6,4.5016287960,-1.3170330182,3.0469686012,-2.7414092376,,, +6.7226562500,6,4.3241736903,-1.2621072442,2.9229312502,-2.5692610951,,, +6.7246093750,6,3.9873386571,-1.1842856448,2.7095650847,-2.3067177310,,, +6.7265625000,6,3.5200526111,-1.0934114058,2.4278278195,-1.9743725599,,, +6.7285156250,6,2.9637382513,-0.9969484149,2.1021414637,-1.5978505719,,, +6.7304687500,6,2.3731343137,-0.9027216613,1.7629607771,-1.2086507983,,, +6.7324218750,6,1.8116861826,-0.8218507273,1.4472456656,-0.8426736136,,, +6.7343750000,6,1.3433580405,-0.7686454804,1.1949355014,-0.5363638647,,, +6.7363281250,6,1.0229153336,-0.7560422419,1.0410023436,-0.3210571442,,, +6.7382812500,6,0.8869813626,-0.7896410428,1.0065474696,-0.2173601472,,, +6.7402343750,6,0.9481799678,-0.8639803476,1.0929685167,-0.2314959189,,, +6.7421875000,6,1.1933364711,-0.9622717815,1.2807321171,-0.3543211441,,, +6.7441406250,6,1.5860991490,-1.0599871645,1.5334118240,-0.5632851609,,, +6.7460937500,6,2.0737069034,-1.1311447507,1.8059721758,-0.8269987014,,, +6.7480468750,6,2.5960549558,-1.1537112467,2.0533879947,-1.1107592999,,, +6.7500000000,6,3.0944819625,-1.1124840386,2.2370136880,-1.3814669228,,, +6.7519531250,6,3.5181368230,-1.0011434679,2.3292019709,-1.6113168351,,, +6.7539062500,6,3.8269402583,-0.8238044239,2.3160138122,-1.7798169236,,, +6.7558593750,6,3.9925527223,-0.5946379735,2.1973528917,-1.8743706486,,, +6.7578125000,6,3.9998502636,-0.3359198000,1.9859020149,-1.8905777536,,, +6.7597656250,6,3.8483921643,-0.0751703426,1.7052609675,-1.8320805913,,, +6.7617187500,6,3.5513197711,0.1595342627,1.3853834412,-1.7087142179,,, +6.7636718750,6,3.1315343450,0.3451152172,1.0560274761,-1.5334401266,,, +6.7656250000,6,2.6168472640,0.4668509040,0.7416156193,-1.3195338260,,, +6.7675781250,6,2.0359111567,0.5190079741,0.4588474123,-1.0786931041,,, +6.7695312500,6,1.4164500952,0.5046282642,0.2161453371,-0.8203894226,,, +6.7714843750,6,0.7847462699,0.4351991657,0.0138330168,-0.5521127525,,, +6.7734375000,6,0.1640111244,0.3295154132,-0.1554133301,-0.2794806014,,, +6.7753906250,6,-0.4278145423,0.2113140016,-0.3052789667,-0.0061335871,,, +6.7773437500,6,-0.9788299678,0.1057446079,-0.4529441160,0.2658306901,,, +6.7792968750,6,-1.4826087148,0.0352899329,-0.6152395889,0.5348906724,,, +6.7812500000,6,-1.9373915056,0.0167291524,-0.8056641969,0.7993937019,,, +6.7832031250,6,-2.3452514640,0.0597686098,-1.0328961850,1.0574201527,,, +6.7851562500,6,-2.7107418789,0.1661689513,-1.2995330086,1.3065900785,,, +6.7871093750,6,-3.0384500524,0.3295094417,-1.6008841153,1.5433058929,,, +6.7890625000,6,-3.3298057019,0.5365096397,-1.9247907068,1.7618237360,,, +6.7910156250,6,-3.5805712258,0.7685234963,-2.2519033895,1.9537176581,,, +6.7929687500,6,-3.7806953827,1.0024203516,-2.5564568537,2.1083062981,,, +6.7949218750,6,-3.9178394321,1.2127059423,-2.8097629650,2.2148563900,,, +6.7968750000,6,-3.9837708703,1.3751503434,-2.9863041821,2.2661743430,,, +6.7988281250,6,-3.9799554283,1.4700722060,-3.0691400772,2.2615904832,,, +6.8007812500,6,-3.9182017657,1.4846671668,-3.0522548583,2.2074279810,,, +6.8027343750,6,-3.8152225957,1.4142826514,-2.9392809920,2.1143925475,,, +6.8046875000,6,-3.6849703660,1.2622232206,-2.7399250306,1.9934978468,,, +6.8066406250,6,-3.5340708305,1.0387914099,-2.4670705652,1.8532342830,,, +6.8085937500,6,-3.3618980612,0.7603806142,-2.1359759542,1.6990493228,,, +6.8105468750,6,-3.1639144923,0.4481259286,-1.7644759855,1.5344624445,,, +6.8125000000,6,-2.9362760826,0.1257660907,-1.3729594406,1.3627833127,,, +6.8144531250,6,-2.6785813084,-0.1824886613,-0.9835108427,1.1880616049,,, +6.8164062500,6,-2.3926804300,-0.4540386039,-0.6174060585,1.0142142777,,, +6.8183593750,6,-2.0799064568,-0.6705495909,-0.2914571251,0.8432915211,,, +6.8203125000,6,-1.7405920179,-0.8198915257,-0.0160815889,0.6750208666,,, +6.8222656250,6,-1.3758116288,-0.8962278082,0.2038873617,0.5079513045,,, +6.8242187500,6,-0.9884478854,-0.8998009527,0.3683606812,0.3405306274,,, +6.8261718750,6,-0.5825984355,-0.8369668743,0.4821261557,0.1713250758,,, +6.8281250000,6,-0.1625145225,-0.7190076047,0.5541279415,-0.0009803145,,, +6.8300781250,6,0.2684384593,-0.5604429374,0.5963501483,-0.1777217816,,, +6.8320312500,6,0.7084939408,-0.3784572915,0.6236556523,-0.3606306304,,, +6.8339843750,6,1.1566418800,-0.1923981766,0.6530564153,-0.5515736398,,, +6.8359375000,6,1.6101131555,-0.0224512300,0.7014901498,-0.7513209248,,, +6.8378906250,6,2.0616837193,0.1117854374,0.7833874992,-0.9581787821,,, +6.8398437500,6,2.4984043495,0.1928156253,0.9087358757,-1.1672915002,,, +6.8417968750,6,2.9024808835,0.2070948745,1.0817441880,-1.3708569893,,, +6.8437500000,6,3.2535885677,0.1468281123,1.3001932094,-1.5590145222,,, +6.8457031250,6,3.5316717111,0.0113896691,1.5553830575,-1.7210842099,,, +6.8476562500,6,3.7205196048,-0.1916157877,1.8327654524,-1.8472386554,,, +6.8496093750,6,3.8124477404,-0.4460583800,2.1137563493,-1.9308031086,,, +6.8515625000,6,3.8119283529,-0.7290164430,2.3789534811,-1.9703743047,,, +6.8535156250,6,3.7345183565,-1.0143999186,2.6110262632,-1.9699069921,,, +6.8554687500,6,3.6008668464,-1.2764022305,2.7952582637,-1.9362837408,,, +6.8574218750,6,3.4296005108,-1.4918696376,2.9185616072,-1.8761055584,,, +6.8593750000,6,3.2321366953,-1.6418765612,2.9685978130,-1.7932682742,,, +6.8613281250,6,3.0105022536,-1.7124578887,2.9334707398,-1.6878357576,,, +6.8632812500,6,2.7588493516,-1.6950378946,2.8027941110,-1.5566378070,,, +6.8652343750,6,2.4680822569,-1.5871841789,2.5704333954,-1.3954891538,,, +6.8671875000,6,2.1316778354,-1.3928411612,2.2372885544,-1.2020452959,,, +6.8691406250,6,1.7512113469,-1.1214590408,1.8129274728,-0.9784324082,,, +6.8710937500,6,1.3398330417,-0.7872178512,1.3164124050,-0.7328725551,,, +6.8730468750,6,0.9211714011,-0.4088211670,0.7756480780,-0.4791363151,,, +6.8750000000,6,0.5233958976,-0.0083307135,0.2237044134,-0.2335331356,,, +6.8769531250,6,0.1716106427,0.3914067263,-0.3069265291,-0.0109495533,,, +6.8789062500,6,-0.1180944450,0.7690184569,-0.7890719465,0.1782191701,,, +6.8808593750,6,-0.3417847362,1.1058910197,-1.2034836251,0.3296642605,,, +6.8828125000,6,-0.5077696406,1.3870984986,-1.5397776521,0.4453355835,,, +6.8847656250,6,-0.6335841755,1.6015811421,-1.7953093613,0.5320974142,,, +6.8867187500,6,-0.7410265813,1.7418783016,-1.9727582098,0.5993996997,,, +6.8886718750,6,-0.8506347870,1.8048880267,-2.0784010679,0.6567731136,,, +6.8906250000,6,-0.9765316926,1.7930522321,-2.1209232725,0.7114814450,,, +6.8925781250,6,-1.1237636259,1.7142398113,-2.1100993761,0.7671660414,,, +6.8945312500,6,-1.2899180535,1.5805339891,-2.0563451083,0.8244395231,,, +6.8964843750,6,-1.4691500982,1.4066062895,-1.9709585858,0.8826159013,,, +6.8984375000,6,-1.6550935869,1.2073613802,-1.8651881073,0.9408073230,,, +6.9003906250,6,-1.8419085897,0.9955517146,-1.7484487417,0.9981188185,,, +6.9023437500,6,-2.0247120905,0.7809450188,-1.6277306471,1.0537459955,,, +6.9042968750,6,-2.1994237605,0.5709172032,-1.5080955578,1.1069536113,,, +6.9062500000,6,-2.3616732301,0.3714040234,-1.3931029009,1.1566453557,,, +6.9082031250,6,-2.5053506348,0.1878567755,-1.2850875239,1.2008004486,,, +6.9101562500,6,-2.6214587176,0.0254776563,-1.1848842849,1.2359685694,,, +6.9121093750,6,-2.6984924350,-0.1118819638,-1.0909519621,1.2572696395,,, +6.9140625000,6,-2.7252468005,-0.2228587609,-0.9995349864,1.2595098037,,, +6.9160156250,6,-2.6939914507,-0.3083512185,-0.9062823791,1.2386686582,,, +6.9179687500,6,-2.6014225923,-0.3705550354,-0.8075835428,1.1924813614,,, +6.9199218750,6,-2.4480224661,-0.4121762007,-0.7010319156,1.1203020708,,, +6.9218750000,6,-2.2371638386,-0.4359248088,-0.5855136167,1.0228403668,,, +6.9238281250,6,-1.9734377366,-0.4446244184,-0.4603670832,0.9014322689,,, +6.9257812500,6,-1.6603863702,-0.4418787882,-0.3237425648,0.7569162909,,, +6.9277343750,6,-1.2993956536,-0.4321022239,-0.1720747114,0.5891105727,,, +6.9296875000,6,-0.8906675925,-0.4196972663,-0.0012908449,0.3973817053,,, +6.9316406250,6,-0.4359906153,-0.4087156895,0.1916333627,0.1820193137,,, +6.9335937500,6,0.0570838811,-0.4027375698,0.4066939782,-0.0537448335,,, +6.9355468750,6,0.5707922168,-0.4036980000,0.6377527657,-0.3014685059,,, +6.9375000000,6,1.0754291114,-0.4109101310,0.8708286905,-0.5465682876,,, +6.9394531250,6,1.5326590719,-0.4217206596,1.0861976724,-0.7700160947,,, +6.9414062500,6,1.9022603144,-0.4327006838,1.2625441724,-0.9517581998,,, +6.9433593750,6,2.1494838675,-0.4404205112,1.3809967658,-1.0743827338,,, +6.9453125000,6,2.2517919801,-0.4420411043,1.4287130738,-1.1264609664,,, +6.9472656250,6,2.2034484349,-0.4355891293,1.4012030417,-1.1048053066,,, +6.9492187500,6,2.0165702353,-0.4197436883,1.3026031183,-1.0149591604,,, +6.9511718750,6,1.7189266228,-0.3937152313,1.1445802227,-0.8701305417,,, +6.9531250000,6,1.3487856756,-0.3574008383,0.9441742675,-0.6887315573,,, +6.9550781250,6,0.9474894649,-0.3109932657,0.7200995444,-0.4907542930,,, +6.9570312500,6,0.5525864294,-0.2544268423,0.4891363729,-0.2943877435,,, +6.9589843750,6,0.1939574226,-0.1877301657,0.2647262279,-0.1141679507,,, +6.9609375000,6,-0.1071782502,-0.1110238581,0.0565192782,0.0395230462,,, +6.9628906250,6,-0.3376073255,-0.0234942600,-0.1303150430,0.1602661203,,, +6.9648437500,6,-0.4913073494,0.0766459045,-0.2947652528,0.2452289400,,, +6.9667968750,6,-0.5691498611,0.1910176923,-0.4387618537,0.2949154792,,, +6.9687500000,6,-0.5776795750,0.3200914621,-0.5656908555,0.3124793480,,, +6.9707031250,6,-0.5256048469,0.4618685726,-0.6775561902,0.3018863682,,, +6.9726562500,6,-0.4197183185,0.6101733222,-0.7715113432,0.2657571423,,, +6.9746093750,6,-0.2634616174,0.7540953276,-0.8386775209,0.2046134546,,, +6.9765625000,6,-0.0587968890,0.8787941032,-0.8657512290,0.1178738409,,, +6.9785156250,6,0.1907538376,0.9667029721,-0.8375209426,0.0054571574,,, +6.9804687500,6,0.4775950123,0.9997325579,-0.7401038680,-0.1307699846,,, +6.9824218750,6,0.7884046849,0.9629276951,-0.5651855056,-0.2858189074,,, +6.9843750000,6,1.1041791938,0.8476154074,-0.3130108819,-0.4512861793,,, +6.9863281250,6,1.4029135207,0.6530726327,0.0072241325,-0.6164975339,,, +6.9882812500,6,1.6638685381,0.3878685864,0.3780078134,-0.7704580708,,, +6.9902343750,6,1.8710535886,0.0702923212,0.7746703342,-0.9035122598,,, +6.9921875000,6,2.0143313988,-0.2739104015,1.1680441594,-1.0081159934,,, +6.9941406250,6,2.0886480964,-0.6159186149,1.5283062278,-1.0789048568,,, +6.9960937500,6,2.0935636539,-0.9284847020,1.8292111987,-1.1129302297,,, +6.9980468750,6,2.0337041999,-1.1897913925,2.0519831815,-1.1102613219,,, +7.0000000000,7,1.9182562275,-1.3852142112,2.1867939231,-1.0738910659,33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +7.0019531250,7,1.7587294808,-1.5061482626,2.2306182764,-1.0085396429,,, +7.0039062500,7,1.5667308588,-1.5476581914,2.1839599713,-0.9193565324,,, +7.0058593750,7,1.3529957753,-1.5071536744,2.0491680014,-0.8112998147,,, +7.0078125000,7,1.1271105842,-1.3841532760,1.8300880727,-0.6889778385,,, +7.0097656250,7,0.8975791735,-1.1809173706,1.5326985876,-0.5567464480,,, +7.0117187500,7,0.6720504588,-0.9041241907,1.1668141521,-0.4189899786,,, +7.0136718750,7,0.4561095412,-0.5664383457,0.7470390565,-0.2796928291,,, +7.0156250000,7,0.2502694936,-0.1867182844,0.2916110057,-0.1409989111,,, +7.0175781250,7,0.0481087826,0.2110805093,-0.1794847772,-0.0021979386,,, +7.0195312500,7,-0.1629529937,0.6000523106,-0.6462163478,0.1401101728,,, +7.0214843750,7,-0.3996702435,0.9535681143,-1.0906939077,0.2913731022,,, +7.0234375000,7,-0.6795565158,1.2484818537,-1.4986968268,0.4577487812,,, +7.0253906250,7,-1.0155530284,1.4666594939,-1.8587355909,0.6436677734,,, +7.0273437500,7,-1.4114903667,1.5956502897,-2.1606487180,0.8496957740,,, +7.0292968750,7,-1.8604582388,1.6299484795,-2.3960708822,1.0718723800,,, +7.0312500000,7,-2.3450125885,1.5714019536,-2.5589126688,1.3018582995,,, +7.0332031250,7,-2.8383987511,1.4279524534,-2.6447029870,1.5274068839,,, +7.0351562500,7,-3.3075103450,1.2125224307,-2.6508508874,1.7336930662,,, +7.0371093750,7,-3.7175710362,0.9423891781,-2.5781460983,1.9055269071,,, +7.0390625000,7,-4.0372086899,0.6377647410,-2.4316795314,2.0296749164,,, +7.0410156250,7,-4.2424529740,0.3195447087,-2.2204958835,2.0965750072,,, +7.0429687500,7,-4.3185373433,0.0069294675,-1.9561498510,2.1009751395,,, +7.0449218750,7,-4.2590144937,-0.2845118379,-1.6504823281,2.0413129597,,, +7.0468750000,7,-4.0632516963,-0.5435609625,-1.3138310978,1.9184337085,,, +7.0488281250,7,-3.7344882472,-0.7625377595,-0.9549639888,1.7347427552,,, +7.0507812500,7,-3.2790152248,-0.9359286094,-0.5820492416,1.4939612544,,, +7.0527343750,7,-2.7053077646,-1.0596825888,-0.2029481448,1.2007813872,,, +7.0546875000,7,-2.0242201867,-1.1305807513,0.1741038555,0.8610200837,,, +7.0566406250,7,-1.2524741562,-1.1447800976,0.5375592403,0.4834479658,,, +7.0585937500,7,-0.4165104709,-1.0976398900,0.8706974900,0.0816502988,,, +7.0605468750,7,0.4479083583,-0.9865468106,1.1545535405,-0.3264947350,,, +7.0625000000,7,1.2987991090,-0.8141638632,1.3724663610,-0.7206943574,,, +7.0644531250,7,2.0909733264,-0.5894624818,1.5124699180,-1.0798464850,,, +7.0664062500,7,2.7804959786,-0.3266788727,1.5683555153,-1.3841278296,,, +7.0683593750,7,3.3311040068,-0.0431688791,1.5405396681,-1.6178975917,,, +7.0703125000,7,3.7199332888,0.2422753821,1.4370030543,-1.7722759901,,, +7.0722656250,7,3.9402927506,0.5097301890,1.2741844576,-1.8464148286,,, +7.0742187500,7,4.0005506666,0.7389369615,1.0756747357,-1.8468421588,,, +7.0761718750,7,3.9200281357,0.9119849382,0.8677958058,-1.7851759790,,, +7.0781250000,7,3.7246551300,1.0154963866,0.6755591568,-1.6757813900,,, +7.0800781250,7,3.4438568469,1.0404476980,0.5214196920,-1.5342663774,,, +7.0820312500,7,3.1074170029,0.9818776622,0.4240988812,-1.3759661579,,, +7.0839843750,7,2.7418558112,0.8402782090,0.3955624984,-1.2140048150,,, +7.0859375000,7,2.3681447867,0.6231017057,0.4384717926,-1.0579818166,,, +7.0878906250,7,2.0016763880,0.3451314571,0.5457145949,-0.9138576262,,, +7.0898437500,7,1.6538316537,0.0275128989,0.7019415757,-0.7847569466,,, +7.0917968750,7,1.3339045267,-0.3051243445,0.8871464349,-0.6721818533,,, +7.0937500000,7,1.0489518458,-0.6281538800,1.0799737017,-0.5763364033,,, +7.0957031250,7,0.8004851988,-0.9185767810,1.2578940489,-0.4947704821,,, +7.0976562500,7,0.5811883949,-1.1553428987,1.3962058413,-0.4209329349,,, +7.0996093750,7,0.3752263007,-1.3204487105,1.4694104510,-0.3445515839,,, +7.1015625000,7,0.1617241027,-1.4002817522,1.4542144735,-0.2535475834,,, +7.1035156250,7,-0.0807899769,-1.3861082815,1.3321119098,-0.1362971941,,, +7.1054687500,7,-0.3697104352,-1.2747622540,1.0922135062,0.0160029141,,, +7.1074218750,7,-0.7135737087,-1.0697720050,0.7344444487,0.2069261455,,, +7.1093750000,7,-1.1087754091,-0.7814351110,0.2709932991,0.4332847635,,, +7.1113281250,7,-1.5392903048,-0.4259393891,-0.2744900966,0.6851437597,,, +7.1132812500,7,-1.9786504201,-0.0244726558,-0.8687032513,0.9469066537,,, +7.1152343750,7,-2.3927705871,0.3981008132,-1.4713062624,1.1988582333,,, +7.1171875000,7,-2.7433104940,0.8150898643,-2.0382803022,1.4190216102,,, +7.1191406250,7,-2.9918442432,1.1994508562,-2.5252598512,1.5853433903,,, +7.1210937500,7,-3.1050858613,1.5253135768,-2.8913757366,1.6783827553,,, +7.1230468750,7,-3.0612545410,1.7705938603,-3.1047000683,1.6846940965,,, +7.1250000000,7,-2.8551091430,1.9194109819,-3.1469716776,1.5995812193,,, +7.1269531250,7,-2.4977913036,1.9628112391,-3.0143847768,1.4271827604,,, +7.1289062500,7,-2.0120944883,1.8984235177,-2.7152974379,1.1782542371,,, +7.1308593750,7,-1.4268515738,1.7292202797,-2.2666629977,0.8674228107,,, +7.1328125000,7,-0.7728851481,1.4612872454,-1.6900844725,0.5110094490,,, +7.1347656250,7,-0.0813042071,1.1025738093,-1.0096399100,0.1259688762,,, +7.1367187500,7,0.6166610569,0.6639958183,-0.2524979770,-0.2702419079,,, +7.1386718750,7,1.2884553274,0.1612840174,0.5491122165,-0.6590436949,,, +7.1406250000,7,1.8980176393,-0.3840202236,1.3562022272,-1.0196964224,,, +7.1425781250,7,2.4064614723,-0.9443771831,2.1233386155,-1.3296902985,,, +7.1445312500,7,2.7774469324,-1.4871521793,2.8020994718,-1.5674863095,,, +7.1464843750,7,2.9830269381,-1.9766920064,3.3457983098,-1.7155815164,,, +7.1484375000,7,3.0069409379,-2.3762698678,3.7128310605,-1.7622893770,,, +7.1503906250,7,2.8467428438,-2.6498699536,3.8692796363,-1.7029140210,,, +7.1523437500,7,2.5150529220,-2.7656646451,3.7926748526,-1.5406863364,,, +7.1542968750,7,2.0384613753,-2.7011665771,3.4761848469,-1.2867403727,,, +7.1562500000,7,1.4538895807,-2.4476769155,2.9309349057,-0.9587900173,,, +7.1582031250,7,0.8033150229,-2.0124292627,2.1854923421,-0.5788231250,,, +7.1601562500,7,0.1280998662,-1.4180881337,1.2827608486,-0.1703577090,,, +7.1621093750,7,-0.5355800868,-0.7000085505,0.2752169312,0.2440627997,,, +7.1640625000,7,-1.1581789606,0.0965195269,-0.7785915860,0.6439720873,,, +7.1660156250,7,-1.7147585781,0.9177562508,-1.8148759768,1.0103493875,,, +7.1679687500,7,-2.1830180564,1.7043768279,-2.7666808350,1.3251431778,,, +7.1699218750,7,-2.5439502943,2.3972071967,-3.5696499656,1.5722857915,,, +7.1718750000,7,-2.7836261145,2.9432023885,-4.1684047010,1.7392195920,,, +7.1738281250,7,-2.8946747714,3.3000965372,-4.5215482699,1.8181435352,,, +7.1757812500,7,-2.8775961035,3.4402483457,-4.6058492379,1.8071012836,,, +7.1777343750,7,-2.7414357614,3.3530173828,-4.4186055588,1.7105192135,,, +7.1796875000,7,-2.5030265183,3.0449608048,-3.9770794029,1.5386876030,,, +7.1816406250,7,-2.1846673028,2.5386781909,-3.3159214968,1.3063316384,,, +7.1835937500,7,-1.8103520880,1.8708499924,-2.4833864436,1.0305170292,,, +7.1855468750,7,-1.4016849618,1.0892656416,-1.5366304709,0.7283750791,,, +7.1875000000,7,-0.9756287971,0.2489959395,-0.5370766541,0.4155953961,,, +7.1894531250,7,-0.5443463297,-0.5920475823,0.4538195950,0.1058279364,,, +7.1914062500,7,-0.1159350861,-1.3780002560,1.3788386672,-0.1895729751,,, +7.1933593750,7,0.3037208027,-2.0595529787,2.1885229613,-0.4613119360,,, +7.1953125000,7,0.7075736002,-2.5969135812,2.8426299767,-0.7010638052,,, +7.1972656250,7,1.0837720206,-2.9614335701,3.3101719770,-0.9000948141,,, +7.1992187500,7,1.4136747204,-3.1368857424,3.5697758569,-1.0485788591,,, +7.2011718750,7,1.6729208981,-3.1196308084,3.6102523496,-1.1361353002,,, +7.2031250000,7,1.8359318850,-2.9173174936,3.4312651916,-1.1537274404,,, +7.2050781250,7,1.8827013741,-2.5481149152,3.0454800361,-1.0966475241,,, +7.2070312500,7,1.8054723729,-2.0405454868,2.4810721948,-0.9674273569,,, +7.2089843750,7,1.6126283576,-1.4317646175,1.7813862508,-0.7771686713,,, +7.2109375000,7,1.3283830257,-0.7644158314,1.0013940039,-0.5447468302,,, +7.2128906250,7,0.9892011107,-0.0833695606,0.2026459266,-0.2945221342,,, +7.2148437500,7,0.6386692425,0.5677768922,-0.5526813293,-0.0533064223,,, +7.2167968750,7,0.3214699861,1.1502058170,-1.2080132965,0.1530225840,,, +7.2187500000,7,0.0768747159,1.6321668635,-1.7173335664,0.3027838442,,, +7.2207031250,7,-0.0669911221,1.9900621472,-2.0484521634,0.3811191927,,, +7.2226562500,7,-0.0966327018,2.2091873639,-2.1851041552,0.3816187171,,, +7.2246093750,7,-0.0137182560,2.2837843680,-2.1272712052,0.3065941860,,, +7.2265625000,7,0.1670615234,2.2164861390,-1.8896349290,0.1659846335,,, +7.2285156250,7,0.4222683994,2.0185031657,-1.4995112980,-0.0247500285,,, +7.2304687500,7,0.7258980573,1.7097385960,-0.9936158907,-0.2477365970,,, +7.2324218750,7,1.0555889913,1.3167546534,-0.4126683483,-0.4861595960,,, +7.2343750000,7,1.3951291158,0.8694921589,0.2033922598,-0.7261388058,,, +7.2363281250,7,1.7322481005,0.3985425246,0.8173652078,-0.9562792442,,, +7.2382812500,7,2.0543078559,-0.0673869070,1.3955758563,-1.1662371179,,, +7.2402343750,7,2.3449199882,-0.5039227392,1.9088706515,-1.3456596103,,, +7.2421875000,7,2.5833436903,-0.8920018952,2.3331428215,-1.4840189328,,, +7.2441406250,7,2.7463948869,-1.2170369404,2.6490473317,-1.5711984008,,, +7.2460937500,7,2.8112492400,-1.4675254294,2.8415010752,-1.5983407437,,, +7.2480468750,7,2.7583227087,-1.6340713833,2.8993381398,-1.5586321308,,, +7.2500000000,7,2.5736225494,-1.7094390413,2.8154261269,-1.4478376395,,, +7.2519531250,7,2.2495982475,-1.6900947937,2.5877853499,-1.2645236776,,, +7.2539062500,7,1.7852122274,-1.5781904431,2.2213433808,-1.0103076874,,, +7.2558593750,7,1.1865212336,-1.3820964547,1.7287799861,-0.6902495624,,, +7.2578125000,7,0.4673070678,-1.1155251359,1.1300570874,-0.3130507880,,, +7.2597656250,7,-0.3505740029,-0.7967976689,0.4519175464,0.1088725357,,, +7.2617187500,7,-1.2366994141,-0.4480399047,-0.2727363368,0.5593302318,,, +7.2636718750,7,-2.1520203642,-0.0930527401,-1.0068182760,1.0186558325,,, +7.2656250000,7,-3.0504799403,0.2457259420,-1.7122934899,1.4647197260,,, +7.2675781250,7,-3.8819295838,0.5497452225,-2.3533307800,1.8743601698,,, +7.2695312500,7,-4.5946627207,0.8052617507,-2.8977569394,2.2243981309,,, +7.2714843750,7,-5.1381700365,1.0028831173,-3.3172681815,2.4925107039,,, +7.2734375000,7,-5.4681493325,1.1370936691,-3.5888044019,2.6591801740,,, +7.2753906250,7,-5.5528162367,1.2060258733,-3.6970685525,2.7104170654,,, +7.2773437500,7,-5.3775324847,1.2107276305,-3.6358783199,2.6396674429,,, +7.2792968750,7,-4.9471049796,1.1543613534,-3.4083246107,2.4486113798,,, +7.2812500000,7,-4.2868089946,1.0426615756,-3.0276930485,2.1476703250,,, +7.2832031250,7,-3.4415814013,0.8855030819,-2.5189420161,1.7560656495,,, +7.2851562500,7,-2.4718284026,0.6973883665,-1.9179666267,1.3003878174,,, +7.2871093750,7,-1.4457486053,0.4952316862,-1.2670384831,0.8113515131,,, +7.2890625000,7,-0.4305763869,0.2947042779,-0.6085257102,0.3199174127,,, +7.2910156250,7,0.5143866627,0.1075147958,0.0201241271,-0.1458622583,,, +7.2929687500,7,1.3422148340,-0.0595493616,0.5894629369,-0.5630562661,,, +7.2949218750,7,2.0201023439,-0.2038954255,1.0788586048,-0.9148868216,,, +7.2968750000,7,2.5282476586,-0.3255191291,1.4751649703,-1.1903306189,,, +7.2988281250,7,2.8574058883,-0.4264099773,1.7715280235,-1.3831837876,,, +7.3007812500,7,3.0065947715,-0.5107609327,1.9668858995,-1.4912666365,,, +7.3027343750,7,2.9815660086,-0.5837129528,2.0644037957,-1.5157092138,,, +7.3046875000,7,2.7949267054,-0.6489273927,2.0695309788,-1.4607494846,,, +7.3066406250,7,2.4674143548,-0.7070191150,1.9893463728,-1.3341477735,,, +7.3085937500,7,2.0286123168,-0.7553539307,1.8328659772,-1.1475341451,,, +7.3105468750,7,1.5166672339,-0.7891748379,1.6120692669,-0.9164916545,,, +7.3125000000,7,0.9769106973,-0.8037852753,1.3434588002,-0.6603683453,,, +7.3144531250,7,0.4583880469,-0.7961108536,1.0481073486,-0.4010996938,,, +7.3164062500,7,0.0081437678,-0.7648203818,0.7491834437,-0.1607363231,,, +7.3183593750,7,-0.3354664148,-0.7104911775,0.4690791506,0.0414351999,,, +7.3203125000,7,-0.5489767691,-0.6356458325,0.2267256522,0.1915205628,,, +7.3222656250,7,-0.6270384969,-0.5425530776,0.0338325218,0.2829054402,,, +7.3242187500,7,-0.5807683503,-0.4302626825,-0.1078295063,0.3164024718,,, +7.3261718750,7,-0.4332834946,-0.2943049417,-0.2054973841,0.2987938286,,, +7.3281250000,7,-0.2152691224,-0.1286462772,-0.2724670947,0.2410535907,,, +7.3300781250,7,0.0389959739,0.0719249948,-0.3250757750,0.1567687132,,, +7.3320312500,7,0.2954740476,0.3090615428,-0.3792271503,0.0604460585,,, +7.3339843750,7,0.5241684664,0.5784975306,-0.4467669044,-0.0343958336,,, +7.3359375000,7,0.7025529276,0.8691232956,-0.5328337802,-0.1170131972,,, +7.3378906250,7,0.8175390575,1.1629780346,-0.6343263277,-0.1806445575,,, +7.3398437500,7,0.8651392109,1.4363109423,-0.7401605231,-0.2226730897,,, +7.3417968750,7,0.8479477664,1.6631667097,-0.8348913272,-0.2433877628,,, +7.3437500000,7,0.7720994350,1.8205440363,-0.9042914187,-0.2440870685,,, +7.3457031250,7,0.6466987956,1.8919844626,-0.9384696775,-0.2264448164,,, +7.3476562500,7,0.4857773991,1.8688740325,-0.9316277612,-0.1934053813,,, +7.3496093750,7,0.3092635578,1.7508477851,-0.8813558428,-0.1498421876,,, +7.3515625000,7,0.1414127964,1.5451944646,-0.7880044111,-0.1023895198,,, +7.3535156250,7,0.0070915391,1.2648977429,-0.6537385169,-0.0586381967,,, +7.3554687500,7,-0.0734226103,0.9265977061,-0.4826465764,-0.0254840412,,, +7.3574218750,7,-0.0886626144,0.5489925955,-0.2811882041,-0.0076229809,,, +7.3593750000,7,-0.0378611893,0.1512251728,-0.0574828713,-0.0071049052,,, +7.3613281250,7,0.0689177034,-0.2480008103,0.1791750970,-0.0233116144,,, +7.3632812500,7,0.2131108768,-0.6304211997,0.4179943001,-0.0531904903,,, +7.3652343750,7,0.3724948255,-0.9786991449,0.6472883514,-0.0922573159,,, +7.3671875000,7,0.5273327010,-1.2776884180,0.8567315695,-0.1364756152,,, +7.3691406250,7,0.6664681609,-1.5157792152,1.0400989151,-0.1843530265,,, +7.3710937500,7,0.7893091858,-1.6860198588,1.1960874910,-0.2373347930,,, +7.3730468750,7,0.9009403116,-1.7863063308,1.3257074216,-0.2974411151,,, +7.3750000000,7,1.0043578080,-1.8178526874,1.4278609715,-0.3639966459,,, +7.3769531250,7,1.0952548480,-1.7831238545,1.4965039107,-0.4318694844,,, +7.3789062500,7,1.1609170637,-1.6852751919,1.5211986934,-0.4918171870,,, +7.3808593750,7,1.1822118011,-1.5283797554,1.4893236518,-0.5320182472,,, +7.3828125000,7,1.1372872466,-1.3169157055,1.3879607533,-0.5399367317,,, +7.3847656250,7,1.0060665495,-1.0559245595,1.2063536584,-0.5044087668,,, +7.3867187500,7,0.7742295172,-0.7521300007,0.9384483962,-0.4173646486,,, +7.3886718750,7,0.4358292517,-0.4137800971,0.5835029858,-0.2746391575,,, +7.3906250000,7,-0.0044983868,-0.0506895638,0.1469101465,-0.0767643845,,, +7.3925781250,7,-0.5293845532,0.3230174394,-0.3564234386,0.1696706097,,, +7.3945312500,7,-1.1082877343,0.6870282477,-0.8997468357,0.4512338976,,, +7.3964843750,7,-1.7001708562,1.0175487416,-1.4467518744,0.7484872789,,, +7.3984375000,7,-2.2594567162,1.2922970868,-1.9571172887,1.0384544919,,, +7.4003906250,7,-2.7436142757,1.4944412507,-2.3927789543,1.2981089235,,, +7.4023437500,7,-3.1183660948,1.6141681852,-2.7222756155,1.5071748269,,, +7.4042968750,7,-3.3587408699,1.6477705290,-2.9216568288,1.6491341180,,, +7.4062500000,7,-3.4487676526,1.5959264254,-2.9744175640,1.7117155363,,, +7.4082031250,7,-3.3815511644,1.4629179972,-2.8728136471,1.6879137957,,, +7.4101562500,7,-3.1587133785,1.2562652533,-2.6189943694,1.5766734754,,, +7.4121093750,7,-2.7894371110,0.9857041654,-2.2241377902,1.3825812177,,, +7.4140625000,7,-2.2904588239,0.6624863124,-1.7069771796,1.1152478405,,, +7.4160156250,7,-1.6870389205,0.3001253806,-1.0936477923,0.7891315467,,, +7.4179687500,7,-1.0139993195,-0.0847303851,-0.4179084626,0.4235376039,,, +7.4199218750,7,-0.3154633495,-0.4724760245,0.2799748298,0.0419715089,,, +7.4218750000,7,0.3579716762,-0.8408165669,0.9551641027,-0.3293412428,,, +7.4238281250,7,0.9543099005,-1.1650663559,1.5605551132,-0.6634545558,,, +7.4257812500,7,1.4264573124,-1.4200193641,2.0508930028,-0.9353907460,,, +7.4277343750,7,1.7390261760,-1.5830456089,2.3884819711,-1.1254050366,,, +7.4296875000,7,1.8738790165,-1.6365271781,2.5476819118,-1.2215745941,,, +7.4316406250,7,1.8322373404,-1.5697543484,2.5170851456,-1.2207436030,,, +7.4335937500,7,1.6331173187,-1.3813009559,2.3006036478,-1.1281805685,,, +7.4355468750,7,1.3096519614,-1.0809918498,1.9179683507,-0.9567366507,,, +7.4375000000,7,0.9045137909,-0.6905236458,1.4044992543,-0.7258952610,,, +7.4394531250,7,0.4644093701,-0.2428330827,0.8096836762,-0.4604104913,,, +7.4414062500,7,0.0343869592,0.2202197276,0.1932727720,-0.1880145016,,, +7.4433593750,7,-0.3454585375,0.6517117825,-0.3805851759,0.0632049680,,, +7.4453125000,7,-0.6400017351,1.0040778707,-0.8489362281,0.2666500255,,, +7.4472656250,7,-0.8187532126,1.2346452764,-1.1558222429,0.3987994132,,, +7.4492187500,7,-0.8583632180,1.3123717075,-1.2598837391,0.4418840068,,, +7.4511718750,7,-0.7473696407,1.2220097598,-1.1405850197,0.3868906246,,, +7.4531250000,7,-0.4890797837,0.9634001438,-0.7992591945,0.2348105897,,, +7.4550781250,7,-0.1007862752,0.5500090534,-0.2580477200,-0.0036004449,,, +7.4570312500,7,0.3874417493,0.0099783193,0.4395111579,-0.3079229541,,, +7.4589843750,7,0.9326815614,-0.6132337666,1.2291353781,-0.6485883134,,, +7.4609375000,7,1.4812383611,-1.2638026269,2.0315244225,-0.9895363382,,, +7.4628906250,7,1.9754948213,-1.8794087982,2.7622506437,-1.2930552891,,, +7.4648437500,7,2.3624303478,-2.3983251483,3.3422429874,-1.5248507317,,, +7.4667968750,7,2.5998440829,-2.7664122578,3.7060097868,-1.6575505652,,, +7.4687500000,7,2.6613022532,-2.9424062145,3.8072477991,-1.6730305876,,, +7.4707031250,7,2.5410635884,-2.9010858635,3.6231197510,-1.5645826935,,, +7.4726562500,7,2.2551749040,-2.6350310757,3.1565941817,-1.3378907657,,, +7.4746093750,7,1.8361409434,-2.1548604821,2.4347579269,-1.0093197715,,, +7.4765625000,7,1.3251258613,-1.4883525625,1.5043782757,-0.6026450456,,, +7.4785156250,7,0.7658301769,-0.6793405164,0.4276630133,-0.1461975587,,, +7.4804687500,7,0.1998542366,0.2148165838,-0.7222286134,0.3295009990,,, +7.4824218750,7,-0.3365635392,1.1283940271,-1.8667765468,0.7937907429,,, +7.4843750000,7,-0.8133387006,1.9938455718,-2.9276239997,1.2172103253,,, +7.4863281250,7,-1.2050408468,2.7483133818,-3.8318611584,1.5724773468,,, +7.4882812500,7,-1.4876782000,3.3391242241,-4.5167708678,1.8352863062,,, +7.4902343750,7,-1.6356937261,3.7272911621,-4.9329345272,1.9847852208,,, +7.4921875000,7,-1.6238099489,3.8899263802,-5.0473711689,2.0049838428,,, +7.4941406250,7,-1.4353520305,3.8229175416,-4.8490715487,1.8882576571,,, +7.4960937500,7,-1.0708452731,3.5423523246,-4.3539018893,1.6388817694,,, +7.4980468750,7,-0.5500133793,3.0820027809,-3.6029237379,1.2730824727,,, +7.5000000000,7,0.0917189066,2.4875147247,-2.6545822555,0.8157940388,,, +7.5019531250,7,0.8072097914,1.8109379210,-1.5775217175,0.2975841179,,, +7.5039062500,7,1.5402136137,1.1069220970,-0.4470105197,-0.2466728235,,, +7.5058593750,7,2.2280199630,0.4289774789,0.6582407738,-0.7789299605,,, +7.5078125000,7,2.8068308738,-0.1744016120,1.6612903144,-1.2605573519,,, +7.5097656250,7,3.2206582014,-0.6629273706,2.4934181928,-1.6562445500,,, +7.5117187500,7,3.4298237386,-1.0076655472,3.1007406034,-1.9379576642,,, +7.5136718750,7,3.4143495310,-1.1940303511,3.4493080633,-2.0874758773,,, +7.5156250000,7,3.1720789438,-1.2225998236,3.5263192842,-2.0966916563,,, +7.5175781250,7,2.7144919414,-1.1072789164,3.3380085723,-1.9664641952,,, +7.5195312500,7,2.0624042508,-0.8725770164,2.9068870446,-1.7053248439,,, +7.5214843750,7,1.2432423953,-0.5504375453,2.2689454459,-1.3284517289,,, +7.5234375000,7,0.2916978385,-0.1758579530,1.4706428129,-0.8572207593,,, +7.5253906250,7,-0.7473837715,0.2174144744,0.5665625005,-0.3193411108,,, +7.5273437500,7,-1.8174308602,0.5989006735,-0.3824630767,0.2515592608,,, +7.5292968750,7,-2.8513070525,0.9409331744,-1.3115867724,0.8175662577,,, +7.5312500000,7,-3.7750979791,1.2173872838,-2.1544411947,1.3387649339,,, +7.5332031250,7,-4.5152972238,1.4039525759,-2.8470988480,1.7762982180,,, +7.5351562500,7,-5.0093040722,1.4807620899,-3.3350760625,2.0968907359,,, +7.5371093750,7,-5.2159614178,1.4347958572,-3.5802588194,2.2773721763,,, +7.5390625000,7,-5.1215292068,1.2600402388,-3.5633866500,2.3066930416,,, +7.5410156250,7,-4.7397373987,0.9575202709,-3.2839521017,2.1858000703,,, +7.5429687500,7,-4.1082552456,0.5370991955,-2.7612868293,1.9273536319,,, +7.5449218750,7,-3.2837714005,0.0191163743,-2.0352082235,1.5551259535,,, +7.5468750000,7,-2.3357483285,-0.5664229945,-1.1628721997,1.1017398252,,, +7.5488281250,7,-1.3387230019,-1.1824084349,-0.2126638050,0.6050183559,,, +7.5507812500,7,-0.3649557340,-1.7877314103,0.7426658443,0.1040809190,,, +7.5527343750,7,0.5207261062,-2.3415381518,1.6335012656,-0.3644227099,,, +7.5546875000,7,1.2643251149,-2.8080042613,2.4002126613,-0.7694020096,,, +7.5566406250,7,1.8247105833,-3.1594008451,2.9966825721,-1.0868015021,,, +7.5585937500,7,2.1733123814,-3.3766665207,3.3901484903,-1.2993582096,,, +7.5605468750,7,2.2922446149,-3.4474525847,3.5586762766,-1.3954878700,,, +7.5625000000,7,2.1738416581,-3.3631549719,3.4890090619,-1.3687873267,,, +7.5644531250,7,1.8228983559,-3.1190761890,3.1780207725,-1.2190676006,,, +7.5664062500,7,1.2599629482,-2.7185155612,2.6367489578,-0.9539408177,,, +7.5683593750,7,0.5241800560,-2.1763566460,1.8932279562,-0.5897695295,,, +7.5703125000,7,-0.3249549720,-1.5198344951,0.9930134576,-0.1518922028,,, +7.5722656250,7,-1.2104725472,-0.7875594975,-0.0031627972,0.3267978757,,, +7.5742187500,7,-2.0504081381,-0.0261927837,-1.0270919702,0.8106735116,,, +7.5761718750,7,-2.7750610734,0.7153190820,-2.0134261326,1.2675218220,,, +7.5781250000,7,-3.3355108403,1.3905478880,-2.9042364395,1.6707085284,,, +7.5800781250,7,-3.7010979974,1.9580125820,-3.6473054781,1.9972576612,,, +7.5820312500,7,-3.8563924505,2.3839730309,-4.1967241896,2.2271826418,,, +7.5839843750,7,-3.8018921286,2.6463437156,-4.5184548118,2.3458388236,,, +7.5859375000,7,-3.5536686443,2.7368462699,-4.5949695347,2.3461238241,,, +7.5878906250,7,-3.1392524154,2.6601594836,-4.4258191561,2.2287351934,,, +7.5898437500,7,-2.5916263066,2.4315192698,-4.0261525299,2.0014530849,,, +7.5917968750,7,-1.9439118938,2.0736175936,-3.4239935384,1.6778977771,,, +7.5937500000,7,-1.2262597250,1.6134088455,-2.6561316061,1.2756358378,,, +7.5957031250,7,-0.4647019160,1.0799745136,-1.7638106326,0.8140454816,,, +7.5976562500,7,0.3191064307,0.5031040006,-0.7887555974,0.3122809705,,, +7.5996093750,7,1.1067713319,-0.0884083356,0.2297234466,-0.2119315411,,, +7.6015625000,7,1.8805623723,-0.6678180689,1.2548268485,-0.7418792154,,, +7.6035156250,7,2.6219679935,-1.2098639680,2.2504259625,-1.2608046764,,, +7.6054687500,7,3.3130278809,-1.6904454173,3.1808394759,-1.7519694993,,, +7.6074218750,7,3.9389921147,-2.0885737531,4.0137833114,-2.2001316874,,, +7.6093750000,7,4.4900672782,-2.3892150451,4.7237914346,-2.5930017531,,, +7.6113281250,7,4.9607331341,-2.5842363860,5.2925071544,-2.9211264694,,, +7.6132812500,7,5.3474572825,-2.6708759189,5.7063860041,-3.1767392948,,, +7.6152343750,7,5.6463921682,-2.6497125213,5.9552874662,-3.3532689769,,, +7.6171875000,7,5.8507551870,-2.5238727202,6.0329279873,-3.4456219681,,, +7.6191406250,7,5.9485635085,-2.2989798024,5.9375915869,-3.4504635690,,, +7.6210937500,7,5.9231529728,-1.9831384435,5.6726501605,-3.3665881219,,, +7.6230468750,7,5.7573348926,-1.5873999356,5.2475925796,-3.1957361529,,, +7.6250000000,7,5.4396950365,-1.1270164341,4.6795862478,-2.9436834432,,, +7.6269531250,7,4.9702446249,-0.6225654940,3.9944712975,-2.6209689741,,, +7.6289062500,7,4.3628844601,-0.0992319974,3.2253690711,-2.2424016134,,, +7.6308593750,7,3.6444899621,0.4154999066,2.4092931489,-1.8254991225,,, +7.6328125000,7,2.8521344430,0.8942242071,1.5839274705,-1.3889107953,,, +7.6347656250,7,2.0285658994,1.3124557869,0.7841791151,-0.9507064139,,, +7.6367187500,7,1.2152614220,1.6516511503,0.0379004025,-0.5260468696,,, +7.6386718750,7,0.4445446751,1.9005990153,-0.6376729599,-0.1248332148,,, +7.6406250000,7,-0.2655459739,2.0555720935,-1.2376061492,0.2496085240,,, +7.6425781250,7,-0.9103461520,2.1204360846,-1.7679211978,0.5996086170,,, +7.6445312500,7,-1.4928218989,2.1064873798,-2.2409429552,0.9299862573,,, +7.6464843750,7,-2.0177644836,2.0313157206,-2.6695506175,1.2444688091,,, +7.6484375000,7,-2.4880856904,1.9159386130,-3.0624733525,1.5433192234,,, +7.6503906250,7,-2.9028798281,1.7809430096,-3.4217193330,1.8226175486,,, +7.6523437500,7,-3.2577779787,1.6438442680,-3.7426857833,2.0750004424,,, +7.6542968750,7,-3.5475340487,1.5185611335,-4.0162944432,2.2912390474,,, +7.6562500000,7,-3.7689178728,1.4158748018,-4.2313985962,2.4617643701,,, +7.6582031250,7,-3.9219993609,1.3431103139,-4.3757822743,2.5774295349,,, +7.6601562500,7,-4.0104115576,1.3033058394,-4.4371743982,2.6303314930,,, +7.6621093750,7,-4.0419910904,1.2958809070,-4.4069299001,2.6159015326,,, +7.6640625000,7,-4.0284753232,1.3178728452,-4.2835547934,2.5347059849,,, +7.6660156250,7,-3.9828746537,1.3633203140,-4.0722605211,2.3921524867,,, +7.6679687500,7,-3.9154969280,1.4221082329,-3.7829321383,2.1973006652,,, +7.6699218750,7,-3.8301997682,1.4802431518,-3.4289577514,1.9618805217,,, +7.6718750000,7,-3.7229177241,1.5206070643,-3.0254813552,1.6989790563,,, +7.6738281250,7,-3.5838245837,1.5238239255,-2.5873351778,1.4217130286,,, +7.6757812500,7,-3.4015804314,1.4707301571,-2.1289711972,1.1428563153,,, +7.6777343750,7,-3.1673004143,1.3460753561,-1.6655355637,0.8748471932,,, +7.6796875000,7,-2.8777984925,1.1410997528,-1.2123869137,0.6290569297,,, +7.6816406250,7,-2.5373405365,0.8545351739,-0.7835124626,0.4146665403,,, +7.6835937500,7,-2.1562244815,0.4927800206,-0.3903755066,0.2378283957,,, +7.6855468750,7,-1.7476080380,0.0687879941,-0.0411369081,0.1012703346,,, +7.6875000000,7,-1.3252180137,-0.3997290120,0.2595700409,0.0044530437,,, +7.6894531250,7,-0.9009942341,-0.8913889354,0.5107224062,-0.0563502535,,, +7.6914062500,7,-0.4815305357,-1.3825909156,0.7161903593,-0.0886828832,,, +7.6933593750,7,-0.0656677425,-1.8503371752,0.8863586313,-0.1043583106,,, +7.6953125000,7,0.3546484254,-2.2742549295,1.0374652866,-0.1185297562,,, +7.6972656250,7,0.7909314294,-2.6367400342,1.1886054716,-0.1476330953,,, +7.6992187500,7,1.2531158178,-2.9242093284,1.3590538935,-0.2071947432,,, +7.7011718750,7,1.7433595403,-3.1306144745,1.5660923114,-0.3093795280,,, +7.7031250000,7,2.2503327545,-3.2593798831,1.8210697904,-0.4598550058,,, +7.7050781250,7,2.7466998817,-3.3212340615,2.1245592377,-0.6552193263,,, +7.7070312500,7,3.1921738667,-3.3298202676,2.4640067977,-0.8827451351,,, +7.7089843750,7,3.5419385479,-3.2971085685,2.8147691825,-1.1224860195,,, +7.7109375000,7,3.7556526251,-3.2294088133,3.1431351836,-1.3504599690,,, +7.7128906250,7,3.8027528820,-3.1259834872,3.4110314035,-1.5420825030,,, +7.7148437500,7,3.6656245546,-2.9812969834,3.5821499844,-1.6755416453,,, +7.7167968750,7,3.3421932343,-2.7875855181,3.6266841713,-1.7342174217,,, +7.7187500000,7,2.8459751815,-2.5350570082,3.5232039049,-1.7077692701,,, +7.7207031250,7,2.2039353024,-2.2122736210,3.2601716606,-1.5928656961,,, +7.7226562500,7,1.4547394651,-1.8091740354,2.8384281627,-1.3939326418,,, +7.7246093750,7,0.6476217231,-1.3214813251,2.2734774157,-1.1235043999,,, +7.7265625000,7,-0.1591898528,-0.7541341705,1.5965897287,-0.8020700297,,, +7.7285156250,7,-0.9012102751,-0.1219619854,0.8530134776,-0.4567208720,,, +7.7304687500,7,-1.5127360539,0.5522841726,0.0962144981,-0.1178435308,,, +7.7324218750,7,-1.9344610869,1.2409589575,-0.6196825363,0.1851631257,,, +7.7343750000,7,-2.1219960643,1.9143876506,-1.2464615062,0.4276206225,,, +7.7363281250,7,-2.0532960857,2.5424862123,-1.7464417864,0.5923309029,,, +7.7382812500,7,-1.7340738667,3.0956084610,-2.0955210281,0.6714407892,,, +7.7402343750,7,-1.2000763524,3.5469135846,-2.2854261933,0.6673453712,,, +7.7421875000,7,-0.5144063475,3.8764275018,-2.3251981946,0.5925553755,,, +7.7441406250,7,0.2398077341,4.0743581948,-2.2408219099,0.4684289898,,, +7.7460937500,7,0.9693832860,4.1414207103,-2.0717128825,0.3225495122,,, +7.7480468750,7,1.5828591850,4.0864896698,-1.8644479779,0.1849452452,,, +7.7500000000,7,2.0029615142,3.9244495036,-1.6658969078,0.0838845468,,, +7.7519531250,7,2.1767888843,3.6751444205,-1.5168367530,0.0418209371,,, +7.7539062500,7,2.0806518354,3.3619153198,-1.4467728331,0.0723817405,,, +7.7558593750,7,1.7193145841,3.0099431957,-1.4717181916,0.1794389790,,, +7.7578125000,7,1.1228944063,2.6448933252,-1.5941795041,0.3575584349,,, +7.7597656250,7,0.3434999035,2.2908635922,-1.8028273255,0.5924009968,,, +7.7617187500,7,-0.5494272284,1.9674871484,-2.0721681844,0.8613389816,,, +7.7636718750,7,-1.4751180638,1.6870222170,-2.3639528643,1.1351817690,,, +7.7656250000,7,-2.3475849083,1.4522773353,-2.6305366353,1.3809170770,,, +7.7675781250,7,-3.0809168774,1.2561332926,-2.8195142104,1.5648549536,,, +7.7695312500,7,-3.5933137492,1.0823934714,-2.8785934520,1.6555825902,,, +7.7714843750,7,-3.8112724912,0.9070983742,-2.7595823408,1.6262642631,,, +7.7734375000,7,-3.6765090644,0.7007585970,-2.4223005949,1.4567689748,,, +7.7753906250,7,-3.1560747786,0.4325799415,-1.8405894081,1.1367627250,,, +7.7773437500,7,-2.2520974428,0.0761066489,-1.0092980779,0.6690888455,,, +7.7792968750,7,-1.0064161419,-0.3855358795,0.0516562309,0.0712586835,,, +7.7812500000,7,0.5010153411,-0.9558700152,1.2967290622,-0.6250983806,,, +7.7832031250,7,2.1583532170,-1.6231107245,2.6559658573,-1.3756187710,,, +7.7851562500,7,3.8317564326,-2.3608405428,4.0395695780,-2.1261990917,,, +7.7871093750,7,5.3783732888,-3.1309044111,5.3470150470,-2.8184224009,,, +7.7890625000,7,6.6611807243,-3.8860260577,6.4771782977,-3.3957123595,,, +7.7910156250,7,7.5637202742,-4.5717747087,7.3368953100,-3.8086237870,,, +7.7929687500,7,8.0019481015,-5.1302964919,7.8488855815,-4.0192650245,,, +7.7949218750,7,7.9308543912,-5.5061686322,7.9587557034,-4.0045442000,,, +7.7968750000,7,7.3447201862,-5.6520672441,7.6388184313,-3.7573006104,,, +7.7988281250,7,6.2713750296,-5.5333865880,6.8886183860,-3.2854638775,,, +7.8007812500,7,4.7652237077,-5.1331048788,5.7351512944,-2.6109662579,,, +7.8027343750,7,2.9044376334,-4.4561721353,4.2335316871,-1.7691655404,,, +7.8046875000,7,0.7901288821,-3.5307127680,2.4650008981,-0.8073404378,,, +7.8066406250,7,-1.4570988888,-2.4062955191,0.5315872038,0.2183494007,,, +7.8085937500,7,-3.7032522043,-1.1512310334,-1.4506267193,1.2466341189,,, +7.8105468750,7,-5.8089280294,0.1516015235,-3.3595965629,2.2154892114,,, +7.8125000000,7,-7.6385194001,1.4112245507,-5.0761390494,3.0664890637,,, +7.8144531250,7,-9.0694081077,2.5365409384,-6.4917855671,3.7482338092,,, +7.8164062500,7,-10.0014163313,3.4447160062,-7.5160016707,4.2193029329,,, +7.8183593750,7,-10.3667148568,4.0683610966,-8.0828397217,4.4511187072,,, +7.8203125000,7,-10.1390371265,4.3607193061,-8.1564979428,4.4305296400,,, +7.8222656250,7,-9.3391816188,4.2999181092,-7.7359593069,4.1619377773,,, +7.8242187500,7,-8.0329333256,3.8919977018,-6.8570087872,3.6678872959,,, +7.8261718750,7,-6.3223387340,3.1707821468,-5.5895127229,2.9872117656,,, +7.8281250000,7,-4.3358144959,2.1952868807,-4.0314936615,2.1716668787,,, +7.8300781250,7,-2.2191691174,1.0467901779,-2.3023322229,1.2821065408,,, +7.8320312500,7,-0.1238016383,-0.1767048972,-0.5333363900,0.3834968801,,, +7.8339843750,7,1.8087288147,-1.3711805880,1.1453488566,-0.4613585853,,, +7.8359375000,7,3.4590539189,-2.4380294013,2.6167898755,-1.1972323822,,, +7.8378906250,7,4.7354422710,-3.2917062635,3.7850586953,-1.7798743766,,, +7.8398437500,7,5.5758866927,-3.8647244392,4.5799562399,-2.1779797776,,, +7.8417968750,7,5.9496444712,-4.1110341027,4.9592433363,-2.3739197519,,, +7.8437500000,7,5.8584788817,-4.0080123422,4.9098562888,-2.3641190264,,, +7.8457031250,7,5.3376517202,-3.5583768030,4.4503053082,-2.1601946872,,, +7.8476562500,7,4.4555894461,-2.7915060842,3.6320766254,-1.7895710722,,, +7.8496093750,7,3.3107664804,-1.7620821258,2.5362442893,-1.2935823653,,, +7.8515625000,7,2.0248561247,-0.5462069531,1.2658466156,-0.7233630812,,, +7.8535156250,7,0.7312075753,0.7636158865,-0.0635079264,-0.1347806670,,, +7.8554687500,7,-0.4399905057,2.0653568768,-1.3338963975,0.4168403400,,, +7.8574218750,7,-1.3758836350,3.2571809157,-2.4352958915,0.8813641739,,, +7.8593750000,7,-1.9930271861,4.2484161130,-3.2754852396,1.2179995436,,, +7.8613281250,7,-2.2468590108,4.9687175223,-3.7890405208,1.3992191935,,, +7.8632812500,7,-2.1344758843,5.3732238336,-3.9420955848,1.4127378601,,, +7.8652343750,7,-1.6894071858,5.4434237221,-3.7314732244,1.2607087737,,, +7.8671875000,7,-0.9723746283,5.1849320008,-3.1809926898,0.9577237428,,, +7.8691406250,7,-0.0611139556,4.6242953338,-2.3377245869,0.5289771101,,, +7.8710937500,7,0.9589218699,3.8066710724,-1.2687855431,0.0086122718,,, +7.8730468750,7,2.0015371266,2.7939897990,-0.0576445717,-0.5623050000,,, +7.8750000000,7,2.9848286727,1.6617570246,1.2010734260,-1.1384589112,,, +7.8769531250,7,3.8347744158,0.4934395701,2.4086869644,-1.6736496413,,, +7.8789062500,7,4.4872264268,-0.6269573048,3.4709167349,-2.1246391130,,, +7.8808593750,7,4.8889302156,-1.6216615618,4.3048958843,-2.4542148786,,, +7.8828125000,7,4.9988427456,-2.4233472959,4.8427863250,-2.6326419322,,, +7.8847656250,7,4.7913507674,-2.9785277931,5.0350300833,-2.6390774344,,, +7.8867187500,7,4.2616080311,-3.2522306393,4.8560572216,-2.4643055521,,, +7.8886718750,7,3.4295430565,-3.2317022500,4.3086387764,-2.1127974435,,, +7.8906250000,7,2.3390175757,-2.9265631070,3.4228083685,-1.6019991111,,, +7.8925781250,7,1.0533600299,-2.3673627541,2.2523984874,-0.9603934776,,, +7.8945312500,7,-0.3497356002,-1.6043298559,0.8726529164,-0.2261982148,,, +7.8964843750,7,-1.7839075557,-0.7042197893,-0.6232798914,0.5542650880,,, +7.8984375000,7,-3.1611226323,0.2553668353,-2.1304385727,1.3293406221,,, +7.9003906250,7,-4.3985701951,1.1913495091,-3.5388997168,2.0453539896,,, +7.9023437500,7,-5.4241638206,2.0197233442,-4.7412227296,2.6504591269,,, +7.9042968750,7,-6.1799376619,2.6614208868,-5.6400927861,3.0983313251,,, +7.9062500000,7,-6.6224323332,3.0501982987,-6.1555315000,3.3511538089,,, +7.9082031250,7,-6.7222205713,3.1418977452,-6.2350210966,3.3841763055,,, +7.9101562500,7,-6.4666650542,2.9217174027,-5.8647550544,3.1914318052,,, +7.9121093750,7,-5.8652641829,2.4050332924,-5.0726076339,2.7875261643,,, +7.9140625000,7,-4.9530774662,1.6331310297,-3.9219277615,2.2046063238,,, +7.9160156250,7,-3.7898840873,0.6685416648,-2.5033506381,1.4881030924,,, +7.9179687500,7,-2.4557929675,-0.4096114196,-0.9262592449,0.6922123740,,, +7.9199218750,7,-1.0446393443,-1.5123894899,0.6916149977,-0.1254012022,,, +7.9218750000,7,0.3445417500,-2.5494351311,2.2346905522,-0.9086578184,,, +7.9238281250,7,1.6169499734,-3.4366723661,3.5977597895,-1.6068212066,,, +7.9257812500,7,2.6899411771,-4.1031158896,4.6922331213,-2.1771670814,,, +7.9277343750,7,3.4993173763,-4.4977425709,5.4519626516,-2.5873591645,,, +7.9296875000,7,4.0048221528,-4.5947140637,5.8378213392,-2.8173592211,,, +7.9316406250,7,4.1928572667,-4.3952442565,5.8390445887,-2.8599314813,,, +7.9335937500,7,4.0747741893,-3.9269515942,5.4715788567,-2.7197163512,,, +7.9355468750,7,3.6827161169,-3.2404052358,4.7747498557,-2.4117804423,,, +7.9375000000,7,3.0654826218,-2.4022428171,3.8072638403,-1.9604277922,,, +7.9394531250,7,2.2840581003,-1.4872627355,2.6431429391,-1.3981690118,,, +7.9414062500,7,1.4064142825,-0.5717508628,1.3670084642,-0.7640210637,,, +7.9433593750,7,0.5032694629,0.2723937659,0.0679323762,-0.1007409494,,, +7.9453125000,7,-0.3549226684,0.9833371660,-1.1671361023,0.5482441493,,, +7.9472656250,7,-1.1012901180,1.5145325679,-2.2589407770,1.1413639032,,, +7.9492187500,7,-1.6761332833,1.8390106776,-3.1407960608,1.6411804071,,, +7.9511718750,7,-2.0300325128,1.9512163739,-3.7624776879,2.0165230039,,, +7.9531250000,7,-2.1273366274,1.8652503645,-4.0920585262,2.2440339388,,, +7.9550781250,7,-1.9507770880,1.6110504873,-4.1171494892,2.3097497561,,, +7.9570312500,7,-1.5058334557,1.2299525976,-3.8462423815,2.2108658020,,, +7.9589843750,7,-0.8225333923,0.7694310315,-3.3075053352,1.9560249654,,, +7.9609375000,7,0.0464160166,0.2781655691,-2.5448301276,1.5637690963,,, +7.9628906250,7,1.0302397917,-0.1972980272,-1.6142438814,1.0608886332,,, +7.9648437500,7,2.0461299683,-0.6153237094,-0.5811827852,0.4812016685,,, +7.9667968750,7,3.0067572391,-0.9419942520,0.4832962253,-0.1363424082,,, +7.9687500000,7,3.8293201673,-1.1529237992,1.5073851433,-0.7504517010,,, +7.9707031250,7,4.4447034776,-1.2338032346,2.4235379990,-1.3206219487,,, +7.9726562500,7,4.8040677432,-1.1804993936,3.1735014818,-1.8103510361,,, +7.9746093750,7,4.8801400395,-0.9984738069,3.7118108340,-2.1894836157,,, +7.9765625000,7,4.6643867511,-0.7009490278,4.0067930274,-2.4351972056,,, +7.9785156250,7,4.1649126480,-0.3078227484,4.0421611599,-2.5332206366,,, +7.9804687500,7,3.4059571484,0.1539874207,3.8197672114,-2.4795145206,,, +7.9824218750,7,2.4260189370,0.6528701105,3.3589411686,-2.2803029132,,, +7.9843750000,7,1.2757737578,1.1582060501,2.6926473690,-1.9507450782,,, +7.9863281250,7,0.0176199197,1.6444280758,1.8642214576,-1.5136615279,,, +7.9882812500,7,-1.2773525781,2.0921857151,0.9226447140,-0.9967410172,,, +7.9902343750,7,-2.5365666410,2.4888331908,-0.0844809662,-0.4281294526,,, +7.9921875000,7,-3.6918140667,2.8277245298,-1.1144501744,0.1659771231,,, +7.9941406250,7,-4.6816075129,3.1052652635,-2.1275170309,0.7606947086,,, +7.9960937500,7,-5.4531970910,3.3175256447,-3.0841256800,1.3313685691,,, +7.9980468750,7,-5.9658882243,3.4586032782,-3.9445461823,1.8536810493,,, +8.0000000000,8,-6.1949132233,3.5204623865,-4.6707726214,2.3049296428,33538:33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +8.0019531250,8,-6.1342855690,3.4934972689,-5.2294376891,2.6657829660,,, +8.0039062500,8,-5.7971211308,3.3681354710,-5.5940534630,2.9213574838,,, +8.0058593750,8,-5.2134354124,3.1366527214,-5.7460012927,3.0614829289,,, +8.0078125000,8,-4.4267734347,2.7941523025,-5.6755791905,3.0811551898,,, +8.0097656250,8,-3.4910431751,2.3396606384,-5.3840251298,2.9815899952,,, +8.0117187500,8,-2.4678881570,1.7779059787,-4.8851735750,2.7709124146,,, +8.0136718750,8,-1.4230621550,1.1202068522,-4.2044014357,2.4632944860,,, +8.0156250000,8,-0.4212244570,0.3839189802,-3.3756014615,2.0771168197,,, +8.0175781250,8,0.4788117236,-0.4080704472,-2.4389655610,1.6336404640,,, +8.0195312500,8,1.2271868116,-1.2274327760,-1.4393285038,1.1559626190,,, +8.0214843750,8,1.7852293029,-2.0406797654,-0.4236746141,0.6674821764,,, +8.0234375000,8,2.1278261636,-2.8103066867,0.5622060537,0.1899937355,,, +8.0253906250,8,2.2458994544,-3.4975617939,1.4779777892,-0.2584816593,,, +8.0273437500,8,2.1480889944,-4.0659882965,2.2924304978,-0.6653370133,,, +8.0292968750,8,1.8613524511,-4.4842169700,2.9840166516,-1.0231675873,,, +8.0312500000,8,1.4302693210,-4.7280996216,3.5393731180,-1.3283992213,,, +8.0332031250,8,0.9143069900,-4.7825213482,3.9529254042,-1.5806634708,,, +8.0351562500,8,0.3823682493,-4.6424068286,4.2269178616,-1.7825960772,,, +8.0371093750,8,-0.0954799869,-4.3133765757,4.3698356784,-1.9386696800,,, +8.0390625000,8,-0.4568664693,-3.8126828177,4.3946426834,-2.0538559333,,, +8.0410156250,8,-0.6537809419,-3.1684734058,4.3182178236,-2.1333994085,,, +8.0429687500,8,-0.6572985321,-2.4161449457,4.1602963646,-2.1828606418,,, +8.0449218750,8,-0.4605921011,-1.5961827308,3.9413169910,-2.2071705583,,, +8.0468750000,8,-0.0784522300,-0.7563632328,3.6808201790,-2.2091894838,,, +8.0488281250,8,0.4566387127,0.0478389016,3.3965529206,-2.1890878869,,, +8.0507812500,8,1.0999284886,0.7592054773,3.1034373755,-2.1448972205,,, +8.0527343750,8,1.8002094465,1.3266351122,2.8130294352,-2.0737415773,,, +8.0546875000,8,2.5054487304,1.7110113421,2.5339850418,-1.9733116003,,, +8.0566406250,8,3.1670074744,1.8896338831,2.2724496851,-1.8429930512,,, +8.0585937500,8,3.7414835846,1.8593110577,2.0319292411,-1.6843845810,,, +8.0605468750,8,4.1913309755,1.6373397321,1.8135986685,-1.5016733650,,, +8.0625000000,8,4.4857118437,1.2608106830,1.6157230611,-1.3011072297,,, +8.0644531250,8,4.6013580048,0.7844642327,1.4304974306,-1.0885135357,,, +8.0664062500,8,4.5244124837,0.2747760353,1.2422872597,-0.8669748320,,, +8.0683593750,8,4.2544960137,-0.2004870666,1.0314654697,-0.6372285966,,, +8.0703125000,8,3.8081890097,-0.5822432035,0.7807184959,-0.3997660293,,, +8.0722656250,8,3.2178729367,-0.8251593392,0.4783559746,-0.1559753824,,, +8.0742187500,8,2.5260106856,-0.8998206196,0.1180571819,0.0924420339,,, +8.0761718750,8,1.7784347915,-0.7952149334,-0.3011761175,0.3439875193,,, +8.0781250000,8,1.0194906699,-0.5206648409,-0.7724303810,0.5960634715,,, +8.0800781250,8,0.2890794811,-0.1050015327,-1.2781924688,0.8430481233,,, +8.0820312500,8,-0.3795738904,0.4074961918,-1.7917260967,1.0763548905,,, +8.0839843750,8,-0.9613333557,0.9631402228,-2.2818491271,1.2863184960,,, +8.0859375000,8,-1.4392754004,1.5053150038,-2.7171326366,1.4636404147,,, +8.0878906250,8,-1.8044492485,1.9814346667,-3.0692011239,1.6001722351,,, +8.0898437500,8,-2.0552770697,2.3491768935,-3.3160987067,1.6898901249,,, +8.0917968750,8,-2.1952726268,2.5781254147,-3.4435985561,1.7294310103,,, +8.0937500000,8,-2.2305285332,2.6478111615,-3.4446339945,1.7181084826,,, +8.0957031250,8,-2.1700780145,2.5482945540,-3.3205104943,1.6586001460,,, +8.0976562500,8,-2.0291952361,2.2839070375,-3.0839418101,1.5582218791,,, +8.0996093750,8,-1.8329668374,1.8754519911,-2.7603003456,1.4293423633,,, +8.1015625000,8,-1.6169965709,1.3592676295,-2.3858824030,1.2884626588,,, +8.1035156250,8,-1.4239739211,0.7843335076,-2.0046903345,1.1547145227,,, +8.1054687500,8,-1.2975433261,0.2074894932,-1.6637229632,1.0477417451,,, +8.1074218750,8,-1.2745814176,-0.3137774549,-1.4055042570,0.9842160092,,, +8.1093750000,8,-1.3769320371,-0.7303291381,-1.2594201693,0.9738830899,,, +8.1113281250,8,-1.6059309552,-1.0095029438,-1.2357912106,1.0172063390,,, +8.1132812500,8,-1.9425535122,-1.1387295699,-1.3247305246,1.1052641782,,, +8.1152343750,8,-2.3526973992,-1.1236226483,-1.4992174587,1.2213533158,,, +8.1171875000,8,-2.7946949634,-0.9839677515,-1.7205199648,1.3437440915,,, +8.1191406250,8,-3.2259333116,-0.7509693512,-1.9434477146,1.4485762228,,, +8.1210937500,8,-3.6072419614,-0.4641976134,-2.1208979605,1.5122457304,,, +8.1230468750,8,-3.9054472258,-0.1655951345,-2.2093794676,1.5139063571,,, +8.1250000000,8,-4.0945575691,0.1071209442,-2.1744120796,1.4378113117,,, +8.1269531250,8,-4.1556348048,0.3238264576,-1.9932134275,1.2745012079,,, +8.1289062500,8,-4.0758400256,0.4628217634,-1.6560599956,1.0216045764,,, +8.1308593750,8,-3.8479446232,0.5112594816,-1.1675564186,0.6846431740,,, +8.1328125000,8,-3.4712345262,0.4648811739,-0.5460684603,0.2767235371,,, +8.1347656250,8,-2.9533616430,0.3279904756,0.1773647429,-0.1821795530,,, +8.1367187500,8,-2.3124629971,0.1152991024,0.9582759802,-0.6650644399,,, +8.1386718750,8,-1.5789024063,-0.1469207442,1.7393833334,-1.1385199002,,, +8.1406250000,8,-0.7951593833,-0.4233160149,2.4558711225,-1.5657798487,,, +8.1425781250,8,-0.0126205858,-0.6743053709,3.0432668502,-1.9110752474,,, +8.1445312500,8,0.7143589448,-0.8612295346,3.4450067912,-2.1437285145,,, +8.1464843750,8,1.3358841836,-0.9513456491,3.6187724533,-2.2414585303,,, +8.1484375000,8,1.8143205903,-0.9225046852,3.5414021409,-2.1927862130,,, +8.1503906250,8,2.1307973952,-0.7671894371,3.2126383294,-1.9987877015,,, +8.1523437500,8,2.2888848086,-0.4954682378,2.6580089270,-1.6745087052,,, +8.1542968750,8,2.3149691760,-0.1346969978,1.9289991421,-1.2492110538,,, +8.1562500000,8,2.2546429974,0.2757615196,1.0981799239,-0.7641819433,,, +8.1582031250,8,2.1651862127,0.6902688843,0.2514492599,-0.2686885790,,, +8.1601562500,8,2.1062175514,1.0581462039,-0.5192346313,0.1845857449,,, +8.1621093750,8,2.1307782439,1.3248941575,-1.1236867747,0.5445415882,,, +8.1640625000,8,2.2787172441,1.4386544722,-1.4831112777,0.7669838616,,, +8.1660156250,8,2.5732218255,1.3590660803,-1.5393329085,0.8193086425,,, +8.1679687500,8,3.0190386251,1.0648759872,-1.2621048631,0.6841451929,,, +8.1699218750,8,3.6014117123,0.5590125704,-0.6536654736,0.3616323517,,, +8.1718750000,8,4.2868414306,-0.1305559188,0.2516979412,-0.1308956094,,, +8.1738281250,8,5.0260425355,-0.9540237898,1.3926619256,-0.7616051895,,, +8.1757812500,8,5.7578231418,-1.8452952812,2.6859356375,-1.4864805005,,, +8.1777343750,8,6.4127130803,-2.7291693896,4.0292223793,-2.2499001176,,, +8.1796875000,8,6.9168649453,-3.5290376547,5.3057882534,-2.9862367984,,, +8.1816406250,8,7.1975165768,-4.1731522908,6.3940852177,-3.6252219696,,, +8.1835937500,8,7.1901520073,-4.5992211377,7.1802755438,-4.0996629412,,, +8.1855468750,8,6.8470051260,-4.7591170730,7.5698188561,-4.3525341556,,, +8.1875000000,8,6.1459287814,-4.6240127813,7.4964544988,-4.3422191231,,, +8.1894531250,8,5.0966418683,-4.1876790450,6.9284403096,-4.0462776754,,, +8.1914062500,8,3.7415419524,-3.4676165032,5.8728503961,-3.4644166586,,, +8.1933593750,8,2.1510556142,-2.5055875451,4.3777556723,-2.6202274926,,, +8.1953125000,8,0.4152489597,-1.3658809066,2.5294898913,-1.5599593079,,, +8.1972656250,8,-1.3664398299,-0.1285215193,0.4435813012,-0.3477342468,,, +8.1992187500,8,-3.0957791809,1.1212170499,-1.7474719275,0.9408895164,,, +8.2011718750,8,-4.6847603472,2.3034481541,-3.9065261139,2.2254963917,,, +8.2031250000,8,-6.0614327603,3.3521080215,-5.9039500362,3.4277490105,,, +8.2050781250,8,-7.1730630577,4.2201063826,-7.6280229493,4.4777644175,,, +8.2070312500,8,-7.9869634158,4.8812943001,-8.9908012927,5.3179824328,,, +8.2089843750,8,-8.4879187153,5.3289614668,-9.9300150406,5.9049826558,,, +8.2109375000,8,-8.6735823650,5.5700126475,-10.4093841627,6.2110080756,,, +8.2128906250,8,-8.5512626733,5.6174148005,-10.4177617385,6.2248695219,,, +8.2148437500,8,-8.1373764262,5.4856430228,-9.9672411104,5.9514303146,,, +8.2167968750,8,-7.4584110606,5.1897341008,-9.0911733924,5.4103201877,,, +8.2187500000,8,-6.5524424985,4.7453718795,-7.8423234982,4.6345840015,,, +8.2207031250,8,-5.4702721196,4.1693051586,-6.2910448047,3.6693296592,,, +8.2226562500,8,-4.2736929833,3.4806763871,-4.5227998441,2.5698478095,,, +8.2246093750,8,-3.0301269731,2.7023713076,-2.6339387198,1.3985885621,,, +8.2265625000,8,-1.8065441177,1.8610370333,-0.7262137394,0.2214500077,,, +8.2285156250,8,-0.6643282051,0.9862005046,1.0987843480,-0.8959020515,,, +8.2304687500,8,0.3461987001,0.1092484849,2.7459006968,-1.8922056244,,, +8.2324218750,8,1.1910638693,-0.7392422431,4.1344201812,-2.7157528421,,, +8.2343750000,8,1.8542345021,-1.5340760541,5.2055177710,-3.3289221620,,, +8.2363281250,8,2.3346669117,-2.2582693367,5.9257529565,-3.7102840449,,, +8.2382812500,8,2.6420203527,-2.9022485859,6.2873273225,-3.8550975508,,, +8.2402343750,8,2.7922650560,-3.4610655647,6.3066908447,-3.7750484015,,, +8.2421875000,8,2.8028194059,-3.9308925099,6.0203123293,-3.4960532343,,, +8.2441406250,8,2.6897035376,-4.3057231918,5.4781649899,-3.0542176652,,, +8.2460937500,8,2.4685163685,-4.5754096065,4.7375162049,-2.4916229088,,, +8.2480468750,8,2.1570713072,-4.7252883715,3.8575411519,-1.8523633006,,, +8.2500000000,8,1.7769903471,-4.7378370028,2.8947631991,-1.1788649120,,, +8.2519531250,8,1.3546172724,-4.5975340449,1.9015005149,-0.5100080420,,, +8.2539062500,8,0.9225118071,-4.2972385833,0.9277107784,0.1183737871,,, +8.2558593750,8,0.5188015184,-3.8407701392,0.0214174714,0.6734236952,,, +8.2578125000,8,0.1814768120,-3.2409110780,-0.7748622698,1.1274866102,,, +8.2597656250,8,-0.0595393737,-2.5179558103,-1.4279600224,1.4606938988,,, +8.2617187500,8,-0.1883023070,-1.6999294176,-1.9162741795,1.6626387694,,, +8.2636718750,8,-0.2046868365,-0.8218558520,-2.2311849590,1.7333210074,,, +8.2656250000,8,-0.1213388064,0.0757677807,-2.3761276613,1.6822353432,,, +8.2675781250,8,0.0422576922,0.9484648514,-2.3630338877,1.5254618246,,, +8.2695312500,8,0.2648110438,1.7495028563,-2.2090906873,1.2829185069,,, +8.2714843750,8,0.5258124953,2.4318801065,-1.9350805626,0.9767806539,,, +8.2734375000,8,0.8066828094,2.9511421650,-1.5639055349,0.6299456083,,, +8.2753906250,8,1.0913805563,3.2695592548,-1.1187345334,0.2640156720,,, +8.2773437500,8,1.3664291268,3.3608916380,-0.6214274461,-0.1026177002,,, +8.2792968750,8,1.6206998124,3.2146160998,-0.0914034068,-0.4562710197,,, +8.2812500000,8,1.8448101070,2.8390550525,0.4540757290,-0.7881215673,,, +8.2832031250,8,2.0292877379,2.2627314401,0.9969145455,-1.0918583249,,, +8.2851562500,8,2.1630075059,1.5326751881,1.5147460826,-1.3603878476,,, +8.2871093750,8,2.2343912653,0.7101589515,1.9805743482,-1.5844678727,,, +8.2890625000,8,2.2349789050,-0.1336019670,2.3650985382,-1.7535056876,,, +8.2910156250,8,2.1629104675,-0.9226562009,2.6402985781,-1.8573800249,,, +8.2929687500,8,2.0239037543,-1.5848354494,2.7841693942,-1.8888327957,,, +8.2949218750,8,1.8290191322,-2.0597530116,2.7835913805,-1.8446948117,,, +8.2968750000,8,1.5910687944,-2.3022227145,2.6328755571,-1.7245751391,,, +8.2988281250,8,1.3217070494,-2.2839836977,2.3316345930,-1.5292803687,,, +8.3007812500,8,1.0293290136,-1.9958827624,1.8847954741,-1.2608317851,,, +8.3027343750,8,0.7179969900,-1.4487933242,1.3032445262,-0.9231797283,,, +8.3046875000,8,0.3890915012,-0.6733832634,0.6052675627,-0.5236340403,,, +8.3066406250,8,0.0451576144,0.2807397589,-0.1811420732,-0.0749193216,,, +8.3085937500,8,-0.3071248924,1.3482886216,-1.0179935063,0.4041698994,,, +8.3105468750,8,-0.6560154948,2.4538745961,-1.8597643530,0.8900598804,,, +8.3125000000,8,-0.9858696901,3.5175443243,-2.6568812200,1.3563514975,,, +8.3144531250,8,-1.2798384088,4.4602232502,-3.3591949969,1.7754873260,,, +8.3164062500,8,-1.5221055021,5.2095800028,-3.9191095530,2.1200536613,,, +8.3183593750,8,-1.6996942364,5.7050413982,-4.2950489096,2.3647105328,,, +8.3203125000,8,-1.8050718442,5.9023673951,-4.4557517642,2.4890581421,,, +8.3222656250,8,-1.8378634533,5.7786769351,-4.3839526426,2.4801074624,,, +8.3242187500,8,-1.8036884614,5.3356901677,-4.0779570097,2.3334094241,,, +8.3261718750,8,-1.7112760693,4.5989125373,-3.5513826248,2.0532546649,,, +8.3281250000,8,-1.5695242349,3.6137231088,-2.8321149694,1.6526869332,,, +8.3300781250,8,-1.3848669817,2.4404960943,-1.9608145689,1.1534237316,,, +8.3320312500,8,-1.1602244571,1.1490872484,-0.9883789974,0.5850091580,,, +8.3339843750,8,-0.8973880541,-0.1873478144,0.0277203273,-0.0171818917,,, +8.3359375000,8,-0.6020357875,-1.4976363042,1.0268824920,-0.6142342284,,, +8.3378906250,8,-0.2877377112,-2.7159029339,1.9480419801,-1.1656466386,,, +8.3398437500,8,0.0231408194,-3.7833429638,2.7324221722,-1.6314595166,,, +8.3417968750,8,0.3001798747,-4.6492338626,3.3262996339,-1.9745320904,,, +8.3437500000,8,0.5067805726,-5.2724440259,3.6839215542,-2.1628833684,,, +8.3457031250,8,0.6051130337,-5.6244367726,3.7722789346,-2.1731660948,,, +8.3476562500,8,0.5640033554,-5.6927464105,3.5771685748,-1.9949697565,,, +8.3496093750,8,0.3668899212,-5.4830178586,3.1070935626,-1.6335396377,,, +8.3515625000,8,0.0172566285,-5.0195013072,2.3937632432,-1.1100191984,,, +8.3535156250,8,-0.4599823649,-4.3446086146,1.4906508681,-0.4604245535,,, +8.3554687500,8,-1.0216285251,-3.5161636245,0.4692244759,0.2667297001,,, +8.3574218750,8,-1.6131657528,-2.6013694771,-0.5886037416,1.0152835935,,, +8.3593750000,8,-2.1780067075,-1.6696531387,-1.5998661284,1.7276181372,,, +8.3613281250,8,-2.6663414618,-0.7867172963,-2.4882662727,2.3498395808,,, +8.3632812500,8,-3.0401372494,-0.0104153485,-3.1889821488,2.8351933068,,, +8.3652343750,8,-3.2731530105,0.6117704354,-3.6511153958,3.1460796906,,, +8.3671875000,8,-3.3487964148,1.0453655181,-3.8397962137,3.2558709656,,, +8.3691406250,8,-3.2583586474,1.2723454261,-3.7391751912,3.1513895344,,, +8.3710937500,8,-2.9988561655,1.2919576380,-3.3539628625,2.8346026304,,, +8.3730468750,8,-2.5707320777,1.1176216662,-2.7078735695,2.3221705675,,, +8.3750000000,8,-1.9779851991,0.7746893068,-1.8411207696,1.6437830456,,, +8.3769531250,8,-1.2309210335,0.3005397478,-0.8078018282,0.8398225327,,, +8.3789062500,8,-0.3495471344,-0.2577123520,0.3285225942,-0.0423148599,,, +8.3808593750,8,0.6337424743,-0.8486064663,1.5002357951,-0.9523599060,,, +8.3828125000,8,1.6731681118,-1.4206924562,2.6395782686,-1.8400994477,,, +8.3847656250,8,2.7112895340,-1.9252589207,3.6818634270,-2.6577964023,,, +8.3867187500,8,3.6840512573,-2.3195525544,4.5699456416,-3.3635035823,,, +8.3886718750,8,4.5280393368,-2.5699396392,5.2581164511,-3.9237921036,,, +8.3906250000,8,5.1879244474,-2.6539735662,5.7132604196,-4.3141734795,,, +8.3925781250,8,5.6222750074,-2.5625835965,5.9152794096,-4.5189240466,,, +8.3945312500,8,5.8054114019,-2.3024365445,5.8585014724,-4.5320109432,,, +8.3964843750,8,5.7258403111,-1.8958348015,5.5523595341,-4.3579011358,,, +8.3984375000,8,5.3853012679,-1.3766075980,5.0196352695,-4.0107306259,,, +8.4003906250,8,4.7992384327,-0.7836370794,4.2926069054,-3.5119314438,,, +8.4023437500,8,3.9969470257,-0.1546772546,3.4094142420,-2.8879720738,,, +8.4042968750,8,3.0210709441,0.4780945555,2.4125384860,-2.1695640141,,, +8.4062500000,8,1.9251423187,1.0903693777,1.3479910169,-1.3912509228,,, +8.4082031250,8,0.7693847587,1.6656240628,0.2634011009,-0.5898570365,,, +8.4101562500,8,-0.3817509924,2.1932950006,-0.7941615177,0.1977094406,,, +8.4121093750,8,-1.4609335820,2.6665382527,-1.7798795769,0.9363928775,,, +8.4140625000,8,-2.4019447423,3.0797734559,-2.6531870351,1.5948772543,,, +8.4160156250,8,-3.1460751207,3.4254317514,-3.3798868170,2.1473483430,,, +8.4179687500,8,-3.6483007402,3.6906202457,-3.9328921448,2.5740310995,,, +8.4199218750,8,-3.8818997018,3.8556602173,-4.2912900397,2.8600800787,,, +8.4218750000,8,-3.8412037119,3.8962799233,-4.4400492374,2.9947588072,,, +8.4238281250,8,-3.5422975561,3.7898449472,-4.3729436624,2.9733152848,,, +8.4257812500,8,-3.0214952000,3.5231191006,-4.0973755709,2.8006499871,,, +8.4277343750,8,-2.3319931159,3.0976049615,-3.6376560257,2.4940810173,,, +8.4296875000,8,-1.5396043938,2.5319146318,-3.0359269253,2.0844759061,,, +8.4316406250,8,-0.7176460624,1.8625699670,-2.3504500584,1.6151370071,,, +8.4335937500,8,0.0598226067,1.1410665988,-1.6492454861,1.1367614895,,, +8.4355468750,8,0.7253212364,0.4262402347,-1.0003093789,0.6998028256,,, +8.4375000000,8,1.2234085471,-0.2233610094,-0.4630149573,0.3478975429,,, +8.4394531250,8,1.5135680047,-0.7545733731,-0.0823023751,0.1133639311,,, +8.4414062500,8,1.5708383178,-1.1237196388,0.1144844664,0.0146619027,,, +8.4433593750,8,1.3856783518,-1.2997703953,0.1174097108,0.0566419572,,, +8.4453125000,8,0.9653930248,-1.2671185458,-0.0675208608,0.2321191209,,, +8.4472656250,8,0.3368419388,-1.0293126331,-0.4181837898,0.5223001115,,, +8.4492187500,8,-0.4516960090,-0.6115153424,-0.8958744768,0.8968522831,,, +8.4511718750,8,-1.3311459456,-0.0592911311,-1.4470378992,1.3154144882,,, +8.4531250000,8,-2.2162189508,0.5647531202,-2.0069797851,1.7303051474,,, +8.4550781250,8,-3.0138034840,1.1856444523,-2.5050730629,2.0901085465,,, +8.4570312500,8,-3.6331171134,1.7233765365,-2.8716523796,2.3444877785,,, +8.4589843750,8,-3.9962119567,2.1019816530,-3.0453681739,2.4493492221,,, +8.4609375000,8,-4.0483030070,2.2587445402,-2.9800970991,2.3716742205,,, +8.4628906250,8,-3.7664211477,2.1535673061,-2.6522363029,2.0948886427,,, +8.4648437500,8,-3.1632992281,1.7762937639,-2.0664708984,1.6234218106,,, +8.4667968750,8,-2.2849151789,1.1487231467,-1.2563886916,0.9834123633,,, +8.4687500000,8,-1.2038534738,0.3219827442,-0.2809497494,0.2202260809,,, +8.4707031250,8,-0.0103856649,-0.6289297407,0.7811768555,-0.6056106375,,, +8.4726562500,8,1.1983806120,-1.6139146565,1.8407516729,-1.4253236134,,, +8.4746093750,8,2.3283446743,-2.5388095509,2.8091353765,-2.1706451104,,, +8.4765625000,8,3.2937287711,-3.3151724400,3.6065138962,-2.7802869136,,, +8.4785156250,8,4.0194089821,-3.8682613400,4.1670914785,-3.2040163600,,, +8.4804687500,8,4.4448947295,-4.1456751170,4.4452650956,-3.4075701487,,, +8.4824218750,8,4.5315512199,-4.1251503779,4.4221155220,-3.3776753114,,, +8.4843750000,8,4.2697752383,-3.8165676114,4.1078403563,-3.1236870537,,, +8.4863281250,8,3.6815340204,-3.2577080674,3.5389473212,-2.6752301665,,, +8.4882812500,8,2.8172780113,-2.5078979854,2.7720326018,-2.0772506195,,, +8.4902343750,8,1.7505214412,-1.6416911408,1.8761516557,-1.3837412256,,, +8.4921875000,8,0.5722575908,-0.7413394561,0.9257339039,-0.6519608811,,, +8.4941406250,8,-0.6166299088,0.1122865556,-0.0049504780,0.0615306443,,, +8.4960937500,8,-1.7152330400,0.8482863624,-0.8463989278,0.7038195209,,, +8.4980468750,8,-2.6320434796,1.4122436066,-1.5381466961,1.2285842249,,, +8.5000000000,8,-3.2927927897,1.7699765221,-2.0319784310,1.5983239428,,, +8.5019531250,8,-3.6462695524,1.9082836817,-2.2939082647,1.7856480573,,, +8.5039062500,8,-3.6672346004,1.8338108007,-2.3060315546,1.7748771963,,, +8.5058593750,8,-3.3568657972,1.5703188989,-2.0678411612,1.5636126665,,, +8.5078125000,8,-2.7410110759,1.1538070483,-1.5957727687,1.1630117325,,, +8.5097656250,8,-1.8659609837,0.6277185749,-0.9218600671,0.5974333346,,, +8.5117187500,8,-0.7933384035,0.0401918444,-0.0925753480,-0.0958675260,,, +8.5136718750,8,0.4044539436,-0.5583006478,0.8331561289,-0.8680872619,,, +8.5156250000,8,1.6490347113,-1.1183115426,1.7878450188,-1.6621068963,,, +8.5175781250,8,2.8605844195,-1.5948165759,2.7004260989,-2.4169143593,,, +8.5195312500,8,3.9605428791,-1.9498959943,3.5012198643,-3.0723698991,,, +8.5214843750,8,4.8740523106,-2.1553277318,4.1269361103,-3.5740744187,,, +8.5234375000,8,5.5349918809,-2.1951197664,4.5259348411,-3.8780721282,,, +8.5253906250,8,5.8928264726,-2.0669848307,4.6632815584,-3.9551482786,,, +8.5273437500,8,5.9178705791,-1.7821713664,4.5240648248,-3.7937123358,,, +8.5292968750,8,5.6041076451,-1.3639584718,4.1134942968,-3.3997132096,,, +8.5312500000,8,4.9713641591,-0.8468251762,3.4553238776,-2.7947061696,,, +8.5332031250,8,4.0661069110,-0.2769354268,2.5910231839,-2.0146895690,,, +8.5351562500,8,2.9578599956,0.2904622568,1.5781792522,-1.1089030014,,, +8.5371093750,8,1.7303723947,0.7995973930,0.4852944084,-0.1360002477,,, +8.5390625000,8,0.4693696196,1.2041511890,-0.6159612027,0.8417763009,,, +8.5410156250,8,-0.7487318933,1.4734044744,-1.6578435093,1.7640800868,,, +8.5429687500,8,-1.8624002296,1.5942423007,-2.5816635626,2.5770896764,,, +8.5449218750,8,-2.8254981021,1.5706851144,-3.3417220670,3.2379054614,,, +8.5468750000,8,-3.6072765929,1.4224271568,-3.9090084254,3.7188310481,,, +8.5488281250,8,-4.1924500522,1.1828652769,-4.2733823039,4.0099700321,,, +8.5507812500,8,-4.5787062850,0.8954647604,-4.4417440722,4.1178748675,,, +8.5527343750,8,-4.7722848326,0.6077665251,-4.4328722021,4.0608290944,,, +8.5546875000,8,-4.7849425130,0.3647629807,-4.2727012888,3.8642660515,,, +8.5566406250,8,-4.6336165022,0.2039740970,-3.9920926004,3.5584177830,,, +8.5585937500,8,-4.3413875947,0.1514917291,-3.6249530433,3.1762919679,,, +8.5605468750,8,-3.9381382258,0.2173249930,-3.2044902858,2.7499045079,,, +8.5625000000,8,-3.4601101475,0.3928843529,-2.7598655908,2.3070008145,,, +8.5644531250,8,-2.9475737536,0.6543484437,-2.3160220149,1.8709725481,,, +8.5664062500,8,-2.4401929441,0.9693722188,-1.8944232625,1.4617132221,,, +8.5683593750,8,-1.9710123032,1.3016140124,-1.5112025175,1.0940214975,,, +8.5703125000,8,-1.5611451661,1.6126759269,-1.1743671533,0.7752041278,,, +8.5722656250,8,-1.2172829261,1.8653512825,-0.8843387741,0.5058926825,,, +8.5742187500,8,-0.9325727258,2.0288079563,-0.6374209299,0.2834393926,,, +8.5761718750,8,-0.6894243115,2.0822885538,-0.4276268678,0.1033995749,,, +8.5781250000,8,-0.4636388992,2.0158440354,-0.2458401835,-0.0418621186,,, +8.5800781250,8,-0.2312797334,1.8298602287,-0.0798508299,-0.1639950394,,, +8.5820312500,8,0.0230091258,1.5356067984,0.0825561562,-0.2764152749,,, +8.5839843750,8,0.3014471142,1.1563113682,0.2493020152,-0.3900588813,,, +8.5859375000,8,0.5944402171,0.7251121628,0.4221410111,-0.5106931355,,, +8.5878906250,8,0.8845795420,0.2796895530,0.5979476345,-0.6392645019,,, +8.5898437500,8,1.1509878096,-0.1422513749,0.7703398226,-0.7727656495,,, +8.5917968750,8,1.3739945233,-0.5060555958,0.9304516287,-0.9043297311,,, +8.5937500000,8,1.5386931153,-0.7835746880,1.0680540537,-1.0240488427,,, +8.5957031250,8,1.6360401502,-0.9555494418,1.1730435961,-1.1207153350,,, +8.5976562500,8,1.6630003691,-1.0125397840,1.2371663836,-1.1839953767,,, +8.5996093750,8,1.6228043060,-0.9572417468,1.2567786396,-1.2076498622,,, +8.6015625000,8,1.5232925475,-0.8064384221,1.2348595171,-1.1921834327,,, +8.6035156250,8,1.3732983168,-0.5878301183,1.1797811365,-1.1442458080,,, +8.6054687500,8,1.1815991207,-0.3342926676,1.1033118635,-1.0747510889,,, +8.6074218750,8,0.9596859336,-0.0808209108,1.0203897363,-0.9982319468,,, +8.6093750000,8,0.7241735100,0.1370505891,0.9480540178,-0.9312390903,,, +8.6113281250,8,0.4975241722,0.2858311184,0.9026988561,-0.8891852143,,, +8.6132812500,8,0.3083871027,0.3368133817,0.8986607734,-0.8848016648,,, +8.6152343750,8,0.1892830039,0.2688429425,0.9477485200,-0.9279894170,,, +8.6171875000,8,0.1698068928,0.0718942397,1.0569860473,-1.0241685434,,, +8.6191406250,8,0.2685289018,-0.2502745856,1.2256237686,-1.1718814530,,, +8.6210937500,8,0.4871340570,-0.6798933842,1.4436758215,-1.3617775486,,, +8.6230468750,8,0.8079673427,-1.1853751455,1.6914942537,-1.5762928546,,, +8.6250000000,8,1.1954916758,-1.7220031833,1.9405417759,-1.7901040211,,, +8.6269531250,8,1.6017405790,-2.2367809103,2.1571768179,-1.9733608880,,, +8.6289062500,8,1.9745279319,-2.6762964947,2.3080008405,-2.0962829575,,, +8.6308593750,8,2.2661815854,-2.9931352491,2.3640156133,-2.1324756856,,, +8.6328125000,8,2.4411190601,-3.1508621759,2.3045776003,-2.0624185731,,, +8.6347656250,8,2.4801215578,-3.1284074445,2.1212895594,-1.8774972854,,, +8.6367187500,8,2.3795838803,-2.9222064884,1.8192259257,-1.5817245005,,, +8.6386718750,8,2.1482723793,-2.5460203265,1.4158891213,-1.1912166339,,, +8.6406250000,8,1.8044536359,-2.0299785184,0.9397037721,-0.7331368301,,, +8.6425781250,8,1.3726514674,-1.4184920946,0.4266547914,-0.2426293459,,, +8.6445312500,8,0.8800561636,-0.7652643282,-0.0859849963,0.2435564270,,, +8.6464843750,8,0.3550725743,-0.1265719258,-0.5653227460,0.6932123406,,, +8.6484375000,8,-0.1710465904,0.4443091571,-0.9843849243,1.0807069052,,, +8.6503906250,8,-0.6622432415,0.9017605956,-1.3213165501,1.3864596473,,, +8.6523437500,8,-1.0790277037,1.2122227410,-1.5593534130,1.5967746252,,, +8.6542968750,8,-1.3841281016,1.3573944907,-1.6878351860,1.7041353197,,, +8.6562500000,8,-1.5502001687,1.3364684193,-1.7038779554,1.7079244464,,, +8.6582031250,8,-1.5666267837,1.1672791843,-1.6144388141,1.6158686741,,, +8.6601562500,8,-1.4436300094,0.8847285633,-1.4375800085,1.4451532748,,, +8.6621093750,8,-1.2123655407,0.5363237605,-1.2018185467,1.2220126265,,, +8.6640625000,8,-0.9202894852,0.1758317984,-0.9428726183,0.9789295829,,, +8.6660156250,8,-0.6233641440,-0.1441728363,-0.6978445575,0.7491393492,,, +8.6679687500,8,-0.3775903426,-0.3792335365,-0.4989283418,0.5605699386,,, +8.6699218750,8,-0.2308589054,-0.4973978622,-0.3693197059,0.4323456562,,, +8.6718750000,8,-0.2159760849,-0.4805366093,-0.3219602874,0.3744473240,,, +8.6738281250,8,-0.3467886447,-0.3242174329,-0.3600468286,0.3889073071,,, +8.6757812500,8,-0.6181694527,-0.0378877984,-0.4782325218,0.4711884874,,, +8.6777343750,8,-1.0087685609,0.3551531611,-0.6638113433,0.6110675092,,, +8.6796875000,8,-1.4854797012,0.8197525719,-0.8976349156,0.7928131842,,, +8.6816406250,8,-2.0092648807,1.3134531792,-1.1558508470,0.9960788086,,, +8.6835937500,8,-2.5407140588,1.7912382214,-1.4130214943,1.1986369806,,, +8.6855468750,8,-3.0418881451,2.2073560213,-1.6441386781,1.3785157096,,, +8.6875000000,8,-3.4739145121,2.5163183335,-1.8244589620,1.5140730530,,, +8.6894531250,8,-3.7958057758,2.6781188913,-1.9309429942,1.5856536058,,, +8.6914062500,8,-3.9689647070,2.6666959018,-1.9467644516,1.5800356582,,, +8.6933593750,8,-3.9635501306,2.4757222946,-1.8643591051,1.4928712357,,, +8.6953125000,8,-3.7613072763,2.1198182589,-1.6848383726,1.3274280151,,, +8.6972656250,8,-3.3561764516,1.6336323807,-1.4168300209,1.0932003907,,, +8.6992187500,8,-2.7561116321,1.0688676823,-1.0762492870,0.8056042827,,, +8.7011718750,8,-1.9857777541,0.4880012717,-0.6858727847,0.4853640688,,, +8.7031250000,8,-1.0872847287,-0.0436345389,-0.2742841572,0.1575003939,,, +8.7050781250,8,-0.1170372244,-0.4659516489,0.1262926824,-0.1503672800,,, +8.7070312500,8,0.8605720660,-0.7320028404,0.4836754727,-0.4110891049,,, +8.7089843750,8,1.7804146584,-0.8133245988,0.7693403328,-0.6009978269,,, +8.7109375000,8,2.5841951472,-0.7019228864,0.9613232197,-0.7022375195,,, +8.7128906250,8,3.2280400551,-0.4114733871,1.0480295579,-0.7064393347,,, +8.7148437500,8,3.6867932534,0.0223688975,1.0315882831,-0.6185390088,,, +8.7167968750,8,3.9538707622,0.5448827984,0.9276803905,-0.4569452268,,, +8.7187500000,8,4.0397817561,1.0871324325,0.7631774111,-0.2511254867,,, +8.7207031250,8,3.9699898685,1.5715228736,0.5736556249,-0.0391621109,,, +8.7226562500,8,3.7812284404,1.9204129399,0.3994008576,0.1363544694,,, +8.7246093750,8,3.5163929516,2.0678909255,0.2791084644,0.2352194864,,, +8.7265625000,8,3.2180144916,1.9707353326,0.2432915455,0.2267225665,,, +8.7285156250,8,2.9226014473,1.6153959022,0.3099498142,0.0941253114,,, +8.7304687500,8,2.6585234376,1.0202597141,0.4834048867,-0.1641621784,,, +8.7324218750,8,2.4463624081,0.2321605573,0.7554049967,-0.5357492502,,, +8.7343750000,8,2.2990056788,-0.6822809650,1.1066904549,-0.9958959852,,, +8.7363281250,8,2.2197749897,-1.6452105223,1.5076722988,-1.5082771986,,, +8.7382812500,8,2.1987973142,-2.5736368378,1.9197328069,-2.0270057969,,, +8.7402343750,8,2.2100851164,-3.3861584545,2.2990569265,-2.5019744910,,, +8.7421875000,8,2.2128513923,-4.0100193471,2.6011505836,-2.8843679578,,, +8.7441406250,8,2.1584864354,-4.3870903685,2.7849056866,-3.1305206001,,, +8.7460937500,8,2.0000651538,-4.4808467088,2.8178468428,-3.2068537366,,, +8.7480468750,8,1.6998716363,-4.2824326181,2.6807927990,-3.0945357110,,, +8.7500000000,8,1.2339166946,-3.8108703648,2.3687303524,-2.7899095621,,, +8.7519531250,8,0.5949295564,-3.1089399105,1.8897839824,-2.3028067409,,, +8.7539062500,8,-0.2058682383,-2.2388912161,1.2652968775,-1.6566035688,,, +8.7558593750,8,-1.1390747473,-1.2769747677,0.5299104705,-0.8887174309,,, +8.7578125000,8,-2.1592103262,-0.3061935159,-0.2698354883,-0.0494812642,,, +8.7597656250,8,-3.2076480964,0.5894968128,-1.0774837704,0.7996494682,,, +8.7617187500,8,-4.2168588026,1.3307027487,-1.8302089761,1.5897571796,,, +8.7636718750,8,-5.1162318072,1.8519126043,-2.4662369391,2.2530512561,,, +8.7656250000,8,-5.8375405096,2.1122421725,-2.9339141672,2.7338945025,,, +8.7675781250,8,-6.3189973734,2.1020930007,-3.1980127191,2.9965202938,,, +8.7695312500,8,-6.5093871553,1.8437140847,-3.2421830180,3.0276202212,,, +8.7714843750,8,-6.3732428597,1.3864044556,-3.0688570725,2.8354054710,,, +8.7734375000,8,-5.8962149911,0.7984791152,-2.6977174138,2.4467918789,,, +8.7753906250,8,-5.0886914060,0.1577647481,-2.1629510694,1.9033040872,,, +8.7773437500,8,-3.9866049873,-0.4585521704,-1.5095519285,1.2562239621,,, +8.7792968750,8,-2.6515946910,-0.9824833417,-0.7900382104,0.5623366595,,, +8.7812500000,8,-1.1714501076,-1.3595924502,-0.0623824790,-0.1188520030,,, +8.7832031250,8,0.3435821049,-1.5495020807,0.6123534439,-0.7275119663,,, +8.7851562500,8,1.7721218208,-1.5262173521,1.1748204825,-1.2076657120,,, +8.7871093750,8,2.9978155507,-1.2812136057,1.5743037387,-1.5132844608,,, +8.7890625000,8,3.9247686583,-0.8268789107,1.7749763802,-1.6136794522,,, +8.7910156250,8,4.4887400770,-0.1965642661,1.7599067974,-1.4968266330,,, +8.7929687500,8,4.6632686974,0.5578509959,1.5336265042,-1.1719047880,,, +8.7949218750,8,4.4603696674,1.3695720038,1.1227167968,-0.6702954327,,, +8.7968750000,8,3.9258405191,2.1629844928,0.5722825515,-0.0420240302,,, +8.7988281250,8,3.1316562554,2.8611853407,-0.0600086655,0.6505921782,,, +8.8007812500,8,2.1678252560,3.3926854448,-0.7086035800,1.3374321166,,, +8.8027343750,8,1.1334986506,3.6981396655,-1.3044730590,1.9445802076,,, +8.8046875000,8,0.1280829041,3.7370378026,-1.7815541253,2.4012970835,,, +8.8066406250,8,-0.7559125961,3.4922379567,-2.0837598870,2.6483052451,,, +8.8085937500,8,-1.4384743015,2.9727604175,-2.1709677930,2.6450695486,,, +8.8105468750,8,-1.8570119014,2.2151041989,-2.0238837507,2.3757285318,,, +8.8125000000,8,-1.9712379323,1.2800490493,-1.6463365564,1.8515580752,,, +8.8144531250,8,-1.7676027327,0.2447624369,-1.0638239343,1.1083508575,,, +8.8164062500,8,-1.2616264254,-0.8046821393,-0.3203656446,0.2018157173,,, +8.8183593750,8,-0.4973555964,-1.7789371325,0.5248933696,-0.7968598036,,, +8.8203125000,8,0.4559471076,-2.5940349501,1.4032454341,-1.8079219590,,, +8.8222656250,8,1.5097776291,-3.1830568441,2.2441102820,-2.7523916256,,, +8.8242187500,8,2.5643281684,-3.5037000019,2.9816079832,-3.5595090964,,, +8.8261718750,8,3.5176438939,-3.5395109073,3.5590397234,-4.1710871685,,, +8.8281250000,8,4.2760310721,-3.2986297359,3.9325362011,-4.5444727284,,, +8.8300781250,8,4.7650423160,-2.8114876187,4.0738825728,-4.6542668008,,, +8.8320312500,8,4.9381595244,-2.1275126017,3.9723667231,-4.4932463275,,, +8.8339843750,8,4.7802221307,-1.3113360725,3.6356179725,-4.0730693797,,, +8.8359375000,8,4.3056445756,-0.4362401964,3.0876018042,-3.4220913290,,, +8.8378906250,8,3.5532873523,0.4256313535,2.3634732226,-2.5793996825,,, +8.8398437500,8,2.5788961783,1.2112830490,1.5048726912,-1.5899602122,,, +8.8417968750,8,1.4461258754,1.8707827216,0.5572522336,-0.5029538901,,, +8.8437500000,8,0.2188107969,2.3700488643,-0.4329307891,0.6303794139,,, +8.8457031250,8,-1.0428871081,2.6927777190,-1.4209674504,1.7597780216,,, +8.8476562500,8,-2.2820049361,2.8392231169,-2.3645602524,2.8370819742,,, +8.8496093750,8,-3.4426133881,2.8232496321,-3.2236639538,3.8166115065,,, +8.8515625000,8,-4.4701538856,2.6696461553,-3.9615202312,4.6566761334,,, +8.8535156250,8,-5.3155982487,2.4090924393,-4.5458725549,5.3204664598,,, +8.8554687500,8,-5.9405750881,2.0702888894,-4.9498208683,5.7762585432,,, +8.8574218750,8,-6.3211723699,1.6750768520,-5.1539898566,5.9998507664,,, +8.8593750000,8,-6.4505544420,1.2384833359,-5.1492312534,5.9780107425,,, +8.8613281250,8,-6.3395199812,0.7694947342,-4.9370498284,5.7090635832,,, +8.8632812500,8,-6.0134093156,0.2721748426,-4.5284437463,5.2020133817,,, +8.8652343750,8,-5.5066291565,-0.2502889819,-3.9435725615,4.4773922345,,, +8.8671875000,8,-4.8572769974,-0.7900096341,-3.2114668496,3.5680964959,,, +8.8691406250,8,-4.1025509681,-1.3309653392,-2.3680660263,2.5175690194,,, +8.8710937500,8,-3.2756012105,-1.8498173851,-1.4534332109,1.3764504498,,, +8.8730468750,8,-2.4042951299,-2.3202304446,-0.5093289694,0.1993392183,,, +8.8750000000,8,-1.5112614914,-2.7168504629,0.4225391731,-0.9577539853,,, +8.8769531250,8,-0.6155607742,-3.0158165814,1.3008922762,-2.0383656926,,, +8.8789062500,8,0.2640930302,-3.1940540803,2.0849637976,-2.9865186701,,, +8.8808593750,8,1.1061899497,-3.2313229909,2.7366834860,-3.7507218537,,, +8.8828125000,8,1.8848223896,-3.1137355630,3.2243097763,-4.2897314117,,, +8.8847656250,8,2.5709046700,-2.8356632547,3.5253853915,-4.5766660474,,, +8.8867187500,8,3.1359896733,-2.4005284278,3.6287579444,-4.6011430742,,, +8.8886718750,8,3.5569368290,-1.8209680875,3.5358746025,-4.3701472369,,, +8.8906250000,8,3.8206620742,-1.1181718445,3.2611240631,-3.9074592270,,, +8.8925781250,8,3.9277821767,-0.3218199730,2.8311033867,-3.2517258090,,, +8.8945312500,8,3.8927044647,0.5296491224,2.2825393014,-2.4533747661,,, +8.8964843750,8,3.7394777571,1.3905914496,1.6589568983,-1.5707031393,,, +8.8984375000,8,3.4952301750,2.2109035508,1.0071185205,-0.6662150492,,, +8.9003906250,8,3.1842920490,2.9382916096,0.3740205298,0.1963823070,,, +8.9023437500,8,2.8259583706,3.5215758839,-0.1959654801,0.9558601586,,, +8.9042968750,8,2.4362117126,3.9155374839,-0.6640449665,1.5582777638,,, +8.9062500000,8,2.0310129888,4.0839848517,-0.9992025058,1.9611036344,,, +8.9082031250,8,1.6285773478,4.0011183493,-1.1796375870,2.1359654118,,, +8.9101562500,8,1.2498672260,3.6546521970,-1.1942946611,2.0710806238,,, +8.9121093750,8,0.9180130727,3.0490529630,-1.0437865773,1.7725119085,,, +8.9140625000,8,0.6565315337,2.2055070083,-0.7395776263,1.2625492474,,, +8.9160156250,8,0.4858924608,1.1606478694,-0.3024961900,0.5766908146,,, +8.9179687500,8,0.4193308526,-0.0332650735,0.2378365470,-0.2382070327,,, +8.9199218750,8,0.4593366343,-1.3083404131,0.8434461001,-1.1254198281,,, +8.9218750000,8,0.5960884573,-2.5825595620,1.4696378502,-2.0211481076,,, +8.9238281250,8,0.8082098060,-3.7623272366,2.0674592510,-2.8579824964,,, +8.9257812500,8,1.0650764441,-4.7488838772,2.5871393486,-3.5694365412,,, +8.9277343750,8,1.3303037769,-5.4504859426,2.9830610187,-4.0964590150,,, +8.9296875000,8,1.5669122968,-5.7949851858,3.2186653522,-4.3934432453,,, +8.9316406250,8,1.7430750102,-5.7381034104,3.2696961896,-4.4316526417,,, +8.9335937500,8,1.8355002746,-5.2686464993,3.1264468824,-4.2017793608,,, +8.9355468750,8,1.8293968189,-4.4107745720,2.7949710795,-3.7158361237,,, +8.9375000000,8,1.7162305106,-3.2213877479,2.2955960750,-3.0055825488,,, +8.9394531250,8,1.4909892170,-1.7842389810,1.6593979027,-2.1180143845,,, +8.9414062500,8,1.1513738377,-0.2034643889,0.9253105417,-1.1113007701,,, +8.9433593750,8,0.6999813874,1.4047408519,0.1379521501,-0.0510418055,,, +8.9453125000,8,0.1471636678,2.9235878098,-0.6556080418,0.9952359061,,, +8.9472656250,8,-0.4881053555,4.2470410235,-1.4096663193,1.9639850806,,, +8.9492187500,8,-1.1787122567,5.2874956691,-2.0824580670,2.7993745253,,, +8.9511718750,8,-1.8895145062,5.9800652081,-2.6376108875,3.4554662444,,, +8.9531250000,8,-2.5785556166,6.2852334312,-3.0458300916,3.8984852089,,, +8.9550781250,8,-3.2017385057,6.1907025342,-3.2874118405,4.1094751705,,, +8.9570312500,8,-3.7191463718,5.7124652004,-3.3549266149,4.0867967320,,, +8.9589843750,8,-4.0991984859,4.8940424009,-3.2542038760,3.8466095555,,, +8.9609375000,8,-4.3201599967,3.8026068627,-3.0028018428,3.4202341025,,, +8.9628906250,8,-4.3708516556,2.5231707688,-2.6279706612,2.8509523208,,, +8.9648437500,8,-4.2510689335,1.1528243444,-2.1654610270,2.1921488161,,, +8.9667968750,8,-3.9705492970,-0.2065394528,-1.6568465301,1.5035709990,,, +8.9687500000,8,-3.5460497672,-1.4583675527,-1.1440588868,0.8438583210,,, +8.9707031250,8,-2.9987541324,-2.5209585436,-0.6644596865,0.2637817541,,, +8.9726562500,8,-2.3538253036,-3.3339404971,-0.2486169960,-0.1969960100,,, +8.9746093750,8,-1.6405172005,-3.8624984854,0.0809976046,-0.5119247325,,, +8.9765625000,8,-0.8909422928,-4.0980840041,0.3112134916,-0.6691002282,,, +8.9785156250,8,-0.1382675399,-4.0552713611,0.4384739520,-0.6713230788,,, +8.9804687500,8,0.5837750164,-3.7680408893,0.4683693256,-0.5353077309,,, +8.9824218750,8,1.2401562441,-3.2863835877,0.4142669258,-0.2898240616,,, +8.9843750000,8,1.7952770243,-2.6713548246,0.2949223438,0.0280735653,,, +8.9863281250,8,2.2172921716,-1.9890957402,0.1326233004,0.3769251199,,, +8.9882812500,8,2.4846605392,-1.3055750063,-0.0477299488,0.7139001859,,, +8.9902343750,8,2.5917479905,-0.6818812831,-0.2203087068,0.9987584369,,, +8.9921875000,8,2.5512860923,-0.1699255120,-0.3605725322,1.1978215427,,, +8.9941406250,8,2.3925437139,0.1907772464,-0.4466672357,1.2856180749,,, +8.9960937500,8,2.1556507858,0.3763918984,-0.4610931288,1.2459550771,,, +8.9980468750,8,1.8839629347,0.3824677119,-0.3934464589,1.0741119918,,, +9.0000000000,9,1.6159611665,0.2249261459,-0.2424919353,0.7779154984,33538:33538:33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +9.0019531250,9,1.3780645071,-0.0625661638,-0.0167943959,0.3768738696,,, +9.0039062500,9,1.1802884111,-0.4322657958,0.2654004387,-0.0990927952,,, +9.0058593750,9,1.0158965543,-0.8269564815,0.5774683464,-0.6116859687,,, +9.0078125000,9,0.8650876009,-1.1861194211,0.8873717510,-1.1177457217,,, +9.0097656250,9,0.7021540654,-1.4513680585,1.1615333660,-1.5732661256,,, +9.0117187500,9,0.5037922457,-1.5708510152,1.3687307870,-1.9371569111,,, +9.0136718750,9,0.2550098623,-1.5053726655,1.4834779376,-2.1748283452,,, +9.0156250000,9,-0.0482505377,-1.2353932356,1.4885843917,-2.2613610082,,, +9.0175781250,9,-0.3986488096,-0.7650642068,1.3768449430,-2.1839274669,,, +9.0195312500,9,-0.7800778867,-0.1219022430,1.1519061687,-1.9437816906,,, +9.0214843750,9,-1.1730916866,0.6471684960,0.8282422945,-1.5576304718,,, +9.0234375000,9,-1.5593551227,1.4818383350,0.4297265354,-1.0566360004,,, +9.0253906250,9,-1.9232626815,2.3136198906,-0.0133753306,-0.4822990694,,, +9.0273437500,9,-2.2513210497,3.0697736354,-0.4678742968,0.1189349350,,, +9.0292968750,9,-2.5297916023,3.6802744825,-0.9010272032,0.7013375874,,, +9.0312500000,9,-2.7424760265,4.0886783084,-1.2841447104,1.2258571233,,, +9.0332031250,9,-2.8711860717,4.2604758963,-1.5954786080,1.6643198815,,, +9.0351562500,9,-2.8990595844,4.1854948958,-1.8215683846,2.0006142348,,, +9.0371093750,9,-2.8147061387,3.8773992482,-1.9576792353,2.2303093160,,, +9.0390625000,9,-2.6155968335,3.3719482657,-2.0071117224,2.3587679482,,, +9.0410156250,9,-2.3103505914,2.7225239550,-1.9790705090,2.3973777598,,, +9.0429687500,9,-1.9192404681,1.9933953265,-1.8865899885,2.3603352339,,, +9.0449218750,9,-1.4717999555,1.2524215571,-1.7449603859,2.2629222864,,, +9.0468750000,9,-1.0018217475,0.5627936034,-1.5692039970,2.1190036272,,, +9.0488281250,9,-0.5416045070,-0.0243569580,-1.3712820287,1.9382944448,,, +9.0507812500,9,-0.1167080840,-0.4725920975,-1.1589698505,1.7259903750,,, +9.0527343750,9,0.2586275274,-0.7599334184,-0.9357152759,1.4836935681,,, +9.0546875000,9,0.5838293646,-0.8799031240,-0.7006644574,1.2100309203,,, +9.0566406250,9,0.8697765930,-0.8427120390,-0.4497587010,0.9017444501,,, +9.0585937500,9,1.1329946320,-0.6747036616,-0.1772217658,0.5544649040,,, +9.0605468750,9,1.3892673806,-0.4169843398,0.1237734065,0.1621026580,,, +9.0625000000,9,1.6487262056,-0.1222883740,0.4599679980,-0.2826809076,,, +9.0644531250,9,1.9139371344,0.1517541485,0.8355461177,-0.7852484140,,, +9.0664062500,9,2.1812944936,0.3504295302,1.2499979063,-1.3454469765,,, +9.0683593750,9,2.4447003741,0.4281388951,1.6970626899,-1.9551267035,,, +9.0703125000,9,2.6992244430,0.3540455103,2.1635228557,-2.5954419522,,, +9.0722656250,9,2.9415937812,0.1163618429,2.6284471776,-3.2356162168,,, +9.0742187500,9,3.1676375731,-0.2778886310,3.0650403870,-3.8363707534,,, +9.0761718750,9,3.3697874578,-0.8064587840,3.4442994588,-4.3560381862,,, +9.0781250000,9,3.5361116463,-1.4346819421,3.7379886536,-4.7552603417,,, +9.0800781250,9,3.6505672787,-2.1179168698,3.9210813474,-5.0005750941,,, +9.0820312500,9,3.6944004405,-2.8067914814,3.9748268001,-5.0686474880,,, +9.0839843750,9,3.6492880161,-3.4533705636,3.8896977038,-4.9498888174,,, +9.0859375000,9,3.5017365385,-4.0142697486,3.6670335227,-4.6498183054,,, +9.0878906250,9,3.2462856979,-4.4510379007,3.3186674916,-4.1877023448,,, +9.0898437500,9,2.8862131043,-4.7302203798,2.8641935359,-3.5922683353,,, +9.0917968750,9,2.4331095825,-4.8256342876,2.3277646896,-2.8969944459,,, +9.0937500000,9,1.9063179541,-4.7238189860,1.7368596114,-2.1383912234,,, +9.0957031250,9,1.3315275265,-4.4282111147,1.1216531520,-1.3554065016,,, +9.0976562500,9,0.7371739606,-3.9567909904,0.5119680218,-0.5857480718,,, +9.0996093750,9,0.1481216917,-3.3352468845,-0.0676023618,0.1398759340,,, +9.1015625000,9,-0.4200209605,-2.5917749119,-0.6011219153,0.8015074361,,, +9.1035156250,9,-0.9612051636,-1.7554475940,-1.0817796282,1.3905575526,,, +9.1054687500,9,-1.4747711877,-0.8567169388,-1.5101102200,1.9081324158,,, +9.1074218750,9,-1.9612800640,0.0714917844,-1.8911408677,2.3617439729,,, +9.1093750000,9,-2.4195241556,0.9947467928,-2.2317449404,2.7620465492,,, +9.1113281250,9,-2.8433476059,1.8800069124,-2.5383269199,3.1201166871,,, +9.1132812500,9,-3.2192180162,2.6961440641,-2.8139849990,3.4437756664,,, +9.1152343750,9,-3.5283213180,3.4128315395,-3.0568931368,3.7346655885,,, +9.1171875000,9,-3.7540239934,4.0030307101,-3.2624750848,3.9897353672,,, +9.1191406250,9,-3.8895207401,4.4473588208,-3.4270439332,4.2048942223,,, +9.1210937500,9,-3.9412010428,4.7350747040,-3.5488954608,4.3758898025,,, +9.1230468750,9,-3.9279045550,4.8629970772,-3.6274123081,4.4971935787,,, +9.1250000000,9,-3.8765125979,4.8352715397,-3.6624816793,4.5622122022,,, +9.1269531250,9,-3.8144379975,4.6626577560,-3.6541331546,4.5645330312,,, +9.1289062500,9,-3.7615611950,4.3603537961,-3.6016126765,4.4984266123,,, +9.1308593750,9,-3.7239066863,3.9457476943,-3.5021452329,4.3584512914,,, +9.1328125000,9,-3.6906726727,3.4373092018,-3.3500455635,4.1387791273,,, +9.1347656250,9,-3.6360034800,2.8548582088,-3.1369506210,3.8330901016,,, +9.1367187500,9,-3.5242394877,2.2198438103,-2.8533737856,3.4356384360,,, +9.1386718750,9,-3.3161288215,1.5533325759,-2.4904552661,2.9423965218,,, +9.1406250000,9,-2.9760675112,0.8729884782,-2.0414480979,2.3515777896,,, +9.1425781250,9,-2.4794423048,0.1936650462,-1.5040092403,1.6653554286,,, +9.1445312500,9,-1.8166511875,-0.4683168715,-0.8828157031,0.8928507255,,, +9.1464843750,9,-0.9936203713,-1.0923595632,-0.1904669678,0.0513846182,,, +9.1484375000,9,-0.0309577475,-1.6545590576,0.5532377104,-0.8343833572,,, +9.1503906250,9,1.0384571964,-2.1303430845,1.3223572686,-1.7334717689,,, +9.1523437500,9,2.1735264746,-2.4969571289,2.0865495620,-2.6102380165,,, +9.1542968750,9,3.3277516809,-2.7355526787,2.8133983547,-3.4271851984,,, +9.1562500000,9,4.4493449444,-2.8328329363,3.4698905126,-4.1471178490,,, +9.1582031250,9,5.4811469511,-2.7827409779,4.0235888492,-4.7348870437,,, +9.1601562500,9,6.3620519722,-2.5885953412,4.4452780883,-5.1609710614,,, +9.1621093750,9,7.0299695089,-2.2636919355,4.7120401469,-5.4053346502,,, +9.1640625000,9,7.4272577126,-1.8291678343,4.8087068474,-5.4583362379,,, +9.1660156250,9,7.5082346813,-1.3119963237,4.7285660090,-5.3200982362,,, +9.1679687500,9,7.2468838162,-0.7446212232,4.4746626815,-5.0007519996,,, +9.1699218750,9,6.6437089173,-0.1638638555,4.0606363250,-4.5202089560,,, +9.1718750000,9,5.7301526160,0.3917320959,3.5101684039,-3.9064311218,,, +9.1738281250,9,4.5677621769,0.8843425926,2.8557010825,-3.1937851612,,, +9.1757812500,9,3.2409313487,1.2787537837,2.1365430378,-2.4218819193,,, +9.1777343750,9,1.8456105898,1.5443781361,1.3959175823,-1.6336994583,,, +9.1796875000,9,0.4777834225,1.6565408203,0.6777600148,-0.8733501989,,, +9.1816406250,9,-0.7758076450,1.5971820847,0.0240941364,-0.1841822556,,, +9.1835937500,9,-1.8436716721,1.3570617238,-0.5275735557,0.3938249812,,, +9.1855468750,9,-2.6729339131,0.9389245844,-0.9470613635,0.8275388754,,, +9.1875000000,9,-3.2319154846,0.3586947905,-1.2140388818,1.0938814122,,, +9.1894531250,9,-3.5120160413,-0.3552877114,-1.3204623612,1.1830151341,,, +9.1914062500,9,-3.5270145136,-1.1629084084,-1.2725570855,1.1013952506,,, +9.1933593750,9,-3.3100134053,-2.0138071690,-1.0906273372,0.8721269396,,, +9.1953125000,9,-2.9104882308,-2.8517286368,-0.8066371546,0.5320196329,,, +9.1972656250,9,-2.3923267959,-3.6198989913,-0.4615974904,0.1281485398,,, +9.1992187500,9,-1.8314421343,-4.2645403240,-0.1031270974,-0.2852161044,,, +9.2011718750,9,-1.3109530994,-4.7353902730,0.2176347959,-0.6500943717,,, +9.2031250000,9,-0.9121131584,-4.9853575004,0.4500264757,-0.9087480569,,, +9.2050781250,9,-0.7012967734,-4.9743407453,0.5496675913,-1.0095344148,,, +9.2070312500,9,-0.7176830206,-4.6765869790,0.4853845784,-0.9146019170,,, +9.2089843750,9,-0.9667684888,-4.0845937886,0.2439076247,-0.6055000841,,, +9.2109375000,9,-1.4201108699,-3.2085370385,-0.1690636676,-0.0847256042,,, +9.2128906250,9,-2.0190677465,-2.0769253484,-0.7294593371,0.6243157664,,, +9.2148437500,9,-2.6819896441,-0.7390257551,-1.3960583609,1.4775395709,,, +9.2167968750,9,-3.3150062390,0.7359832250,-2.1139327175,2.4130099364,,, +9.2187500000,9,-3.8249415065,2.2638742136,-2.8205540992,3.3573029574,,, +9.2207031250,9,-4.1328898317,3.7513759984,-3.4527509886,4.2330130494,,, +9.2226562500,9,-4.1864387930,5.1038129928,-3.9535110362,4.9663547457,,, +9.2246093750,9,-3.9660434747,6.2352967497,-4.2779036842,5.4947114597,,, +9.2265625000,9,-3.4835517986,7.0771120705,-4.3965676095,5.7721740377,,, +9.2285156250,9,-2.7763679947,7.5798208260,-4.2966939979,5.7721724400,,, +9.2304687500,9,-1.9006069415,7.7124452898,-3.9819194395,5.4886350372,,, +9.2324218750,9,-0.9235469039,7.4637299897,-3.4710750675,4.9356481168,,, +9.2343750000,9,0.0839211418,6.8441689825,-2.7952486472,4.1446964943,,, +9.2363281250,9,1.0526816406,5.8873880070,-1.9950203455,3.1617241120,,, +9.2382812500,9,1.9188290127,4.6508385113,-1.1185885014,2.0450808627,,, +9.2402343750,9,2.6272005596,3.2128594400,-0.2186423183,0.8616160187,,, +9.2421875000,9,3.1345519032,1.6662375621,0.6515487900,-0.3184829362,,, +9.2441406250,9,3.4117518860,0.1118171402,1.4410401318,-1.4255840378,,, +9.2460937500,9,3.4464979081,-1.3488369647,2.1045608079,-2.3950614996,,, +9.2480468750,9,3.2473419912,-2.6233691081,2.6073292841,-3.1736700761,,, +9.2500000000,9,2.8479039136,-3.6374963120,2.9293625390,-3.7251604115,,, +9.2519531250,9,2.3076955059,-4.3402521826,3.0676730820,-4.0334251761,,, +9.2539062500,9,1.7057348499,-4.7073709399,3.0361724481,-4.1036218425,,, +9.2558593750,9,1.1282984085,-4.7424787096,2.8629272693,-3.9605038144,,, +9.2578125000,9,0.6560513551,-4.4743088482,2.5853999017,-3.6438754303,,, +9.2597656250,9,0.3536109189,-3.9524780648,2.2459875173,-3.2039684668,,, +9.2617187500,9,0.2622898550,-3.2442337965,1.8886782056,-2.6978323067,,, +9.2636718750,9,0.3966367728,-2.4295162996,1.5552932388,-2.1844129562,,, +9.2656250000,9,0.7436748865,-1.5926181076,1.2807640268,-1.7177098104,,, +9.2675781250,9,1.2633066949,-0.8128618060,1.0889148599,-1.3404340316,,, +9.2695312500,9,1.8915587439,-0.1563618648,0.9899918728,-1.0796956835,,, +9.2714843750,9,2.5488794729,0.3297655759,0.9804196089,-0.9450670267,,, +9.2734375000,9,3.1516508190,0.6192059930,1.0450405373,-0.9297492947,,, +9.2753906250,9,3.6227087153,0.7055769548,1.1605812556,-1.0137499030,,, +9.2773437500,9,3.8982075105,0.6014330895,1.2983827248,-1.1666657968,,, +9.2792968750,9,3.9310559317,0.3366552967,1.4267706572,-1.3505509507,,, +9.2812500000,9,3.6932779868,-0.0451048224,1.5145437284,-1.5245752068,,, +9.2832031250,9,3.1787051182,-0.4907644367,1.5345870093,-1.6498174816,,, +9.2851562500,9,2.4047846366,-0.9417182068,1.4657848337,-1.6918178770,,, +9.2871093750,9,1.4120851590,-1.3384638643,1.2940719030,-1.6223383694,,, +9.2890625000,9,0.2616804312,-1.6262367827,1.0137821315,-1.4219093123,,, +9.2910156250,9,-0.9691432233,-1.7599604335,0.6281712469,-1.0814507667,,, +9.2929687500,9,-2.1930702578,-1.7089835804,0.1488415172,-0.6026427993,,, +9.2949218750,9,-3.3205433037,-1.4618983803,-0.4045970447,0.0011534306,,, +9.2968750000,9,-4.2681851114,-1.0281536077,-1.0047413284,0.7038803993,,, +9.2988281250,9,-4.9674856998,-0.4356906393,-1.6174886967,1.4671594851,,, +9.3007812500,9,-5.3733365531,0.2730270153,-2.2043608074,2.2425020665,,, +9.3027343750,9,-5.4699023434,1.0460087143,-2.7259705896,2.9755564033,,, +9.3046875000,9,-5.2709815690,1.8263994897,-3.1457975312,3.6115618065,,, +9.3066406250,9,-4.8157599810,2.5549471687,-3.4332226963,4.1003240241,,, +9.3085937500,9,-4.1627612100,3.1725982194,-3.5657238543,4.4002489630,,, +9.3105468750,9,-3.3822659506,3.6260976407,-3.5305290875,4.4819181425,,, +9.3125000000,9,-2.5473791894,3.8746545283,-3.3254580734,4.3307290414,,, +9.3144531250,9,-1.7265430139,3.8945044473,-2.9588261459,3.9479237095,,, +9.3164062500,9,-0.9788280718,3.6809409641,-2.4491112323,3.3507896642,,, +9.3183593750,9,-0.3507019201,3.2479900339,-1.8247933479,2.5727879567,,, +9.3203125000,9,0.1261546852,2.6259304550,-1.1234863645,1.6624674900,,, +9.3222656250,9,0.4358994085,1.8575540152,-0.3892221846,0.6796494144,,, +9.3242187500,9,0.5787974037,0.9932928818,0.3318087117,-0.3106288277,,, +9.3261718750,9,0.5708983595,0.0852877188,0.9960188570,-1.2449484668,,, +9.3281250000,9,0.4439587751,-0.8179213375,1.5669248030,-2.0678966998,,, +9.3300781250,9,0.2456213284,-1.6738319195,2.0180631722,-2.7361143511,,, +9.3320312500,9,0.0368936880,-2.4457756550,2.3335169650,-3.2193173698,,, +9.3339843750,9,-0.1155155627,-3.1027507974,2.5069796786,-3.4999780415,,, +9.3359375000,9,-0.1502133156,-3.6198481653,2.5400637507,-3.5723943742,,, +9.3378906250,9,-0.0222108095,-3.9777969243,2.4401073920,-3.4409790431,,, +9.3398437500,9,0.2879160264,-4.1622826349,2.2187593947,-3.1192683873,,, +9.3417968750,9,0.7687038693,-4.1637124627,1.8915712074,-2.6297984354,,, +9.3437500000,9,1.3787013716,-3.9765338864,1.4773065113,-2.0028394907,,, +9.3457031250,9,2.0539365928,-3.5999076998,0.9974561504,-1.2747263136,,, +9.3476562500,9,2.7183498941,-3.0419679211,0.4768497794,-0.4875457111,,, +9.3496093750,9,3.2927071254,-2.3248269479,-0.0561138816,0.3113847672,,, +9.3515625000,9,3.7008075238,-1.4867150485,-0.5707405548,1.0717940191,,, +9.3535156250,9,3.8757376580,-0.5816451926,-1.0354520324,1.7429775778,,, +9.3554687500,9,3.7690732300,0.3231854685,-1.4184572501,2.2756990375,,, +9.3574218750,9,3.3610740460,1.1541768260,-1.6892773757,2.6254631832,,, +9.3593750000,9,2.6663283893,1.8409808108,-1.8219267472,2.7575716936,,, +9.3613281250,9,1.7320701058,2.3248077878,-1.7982324626,2.6514901025,,, +9.3632812500,9,0.6316106358,2.5649557522,-1.6105551327,2.3038489726,,, +9.3652343750,9,-0.5435448660,2.5444129269,-1.2639443020,1.7305738681,,, +9.3671875000,9,-1.6912386996,2.2709356427,-0.7760393704,0.9659046293,,, +9.3691406250,9,-2.7050608868,1.7723856413,-0.1740628908,0.0574640991,,, +9.3710937500,9,-3.4815206070,1.0929836008,0.5070476489,-0.9371366374,,, +9.3730468750,9,-3.9313717088,0.2942167485,1.2227550249,-1.9488567963,,, +9.3750000000,9,-3.9930340773,-0.5453904168,1.9177364687,-2.8968804107,,, +9.3769531250,9,-3.6429391781,-1.3364999509,2.5293917091,-3.6943362064,,, +9.3789062500,9,-2.9001189650,-1.9904441523,2.9950831688,-4.2585518120,,, +9.3808593750,9,-1.8247760204,-2.4333327343,3.2610188512,-4.5230042963,,, +9.3828125000,9,-0.5130396168,-2.6164728979,3.2894881473,-4.4465495086,,, +9.3847656250,9,0.9108710222,-2.5177755108,3.0618172469,-4.0163263572,,, +9.3867187500,9,2.3068740355,-2.1375538327,2.5788576859,-3.2467959177,,, +9.3886718750,9,3.5352595834,-1.4946648610,1.8612887676,-2.1783223810,,, +9.3906250000,9,4.4729423086,-0.6241056908,0.9486237264,-0.8742915792,,, +9.3925781250,9,5.0259926286,0.4249252884,-0.1042672124,0.5845103129,,, +9.3945312500,9,5.1372052448,1.5913203933,-1.2320160593,2.1067985317,,, +9.3964843750,9,4.7899623745,2.8059967149,-2.3636399164,3.5974367084,,, +9.3984375000,9,4.0093122474,3.9966510937,-3.4266353018,4.9628414546,,, +9.4003906250,9,2.8588556735,5.0904204096,-4.3498389759,6.1143097484,,, +9.4023437500,9,1.4335952783,6.0152886294,-5.0662037549,6.9708462926,,, +9.4042968750,9,-0.1480478900,6.7035434361,-5.5168646868,7.4637302416,,, +9.4062500000,9,-1.7520841816,7.0962614017,-5.6556751120,7.5417745544,,, +9.4082031250,9,-3.2391302876,7.1469836971,-5.4533152157,7.1758500388,,, +9.4101562500,9,-4.4775590406,6.8262546722,-4.9014567396,6.3634094339,,, +9.4121093750,9,-5.3562440660,6.1252890225,-4.0155344725,5.1313148132,,, +9.4140625000,9,-5.7937254365,5.0544647852,-2.8336071666,3.5336695229,,, +9.4160156250,9,-5.7446821151,3.6403962039,-1.4130269070,1.6470139330,,, +9.4179687500,9,-5.2054998801,1.9277162083,0.1718259464,-0.4326712335,,, +9.4199218750,9,-4.2174646725,-0.0170050617,1.8317738703,-2.5925300828,,, +9.4218750000,9,-2.8651981606,-2.1041060805,3.4672486939,-4.7079468517,,, +9.4238281250,9,-1.2697367672,-4.2229050029,4.9743553395,-6.6495882904,,, +9.4257812500,9,0.4237095826,-6.2473878761,6.2521887454,-8.2919768208,,, +9.4277343750,9,2.0622039412,-8.0467375013,7.2119051441,-9.5244478945,,, +9.4296875000,9,3.5025365576,-9.4982321538,7.7855004003,-10.2619513531,,, +9.4316406250,9,4.6263896218,-10.4984575153,7.9316911395,-10.4523352645,,, +9.4335937500,9,5.3511005922,-10.9722114923,7.6394352897,-10.0808529068,,, +9.4355468750,9,5.6347081648,-10.8793087789,6.9292849992,-9.1721694565,,, +9.4375000000,9,5.4752569401,-10.2174351330,5.8509473177,-7.7876444317,,, +9.4394531250,9,4.9056211261,-9.0208586187,4.4775324202,-6.0184087386,,, +9.4414062500,9,3.9855463097,-7.3574628098,2.8984446254,-3.9768022465,,, +9.4433593750,9,2.7932419417,-5.3242778143,1.2114151303,-1.7866854112,,, +9.4453125000,9,1.4183670202,-3.0396260921,-0.4859951703,0.4272243144,,, +9.4472656250,9,-0.0438891303,-0.6340197121,-2.1035109070,2.5484484224,,, +9.4492187500,9,-1.4983492685,1.7566909742,-3.5627743407,4.4746163881,,, +9.4511718750,9,-2.8550086511,3.9978176977,-4.8008006975,6.1218967286,,, +9.4531250000,9,-4.0339133670,5.9642988399,-5.7723644810,7.4283279316,,, +9.4550781250,9,-4.9702610839,7.5492776288,-6.4501418144,8.3544495160,,, +9.4570312500,9,-5.6204417432,8.6715663007,-6.8240349540,8.8828667700,,, +9.4589843750,9,-5.9673709669,9.2813803634,-6.9007195818,9.0180338359,,, +9.4609375000,9,-6.0206927867,9.3622839221,-6.7012813260,8.7836088230,,, +9.4628906250,9,-5.8108044852,8.9302499416,-6.2570432672,8.2175936660,,, +9.4648437500,9,-5.3812118623,8.0326504268,-5.6063725740,7.3687283231,,, +9.4667968750,9,-4.7825086426,6.7455996267,-4.7922510640,6.2935947360,,, +9.4687500000,9,-4.0672095941,5.1673767177,-3.8595550599,5.0529517575,,, +9.4707031250,9,-3.2844176592,3.4098242791,-2.8533784858,3.7091400526,,, +9.4726562500,9,-2.4744479089,1.5894983047,-1.8181185396,2.3243687411,,, +9.4746093750,9,-1.6647960759,-0.1808373071,-0.7954661371,0.9576270833,,, +9.4765625000,9,-0.8698238511,-1.7987661274,0.1776365155,-0.3383772260,,, +9.4785156250,9,-0.0947715816,-3.1768920996,1.0692960271,-1.5180766443,,, +9.4804687500,9,0.6582386778,-4.2472882867,1.8526954374,-2.5435674787,,, +9.4824218750,9,1.3853011537,-4.9646299516,2.5070640452,-3.3861168473,,, +9.4843750000,9,2.0783510496,-5.3062664465,3.0180768793,-4.0266523912,,, +9.4863281250,9,2.7252097896,-5.2713194488,3.3773397777,-4.4550327621,,, +9.4882812500,9,3.3117728693,-4.8806621957,3.5821119053,-4.6696819717,,, +9.4902343750,9,3.8261612898,-4.1760983785,3.6353535940,-4.6775536958,,, +9.4921875000,9,4.2633456169,-3.2179856399,3.5462772974,-4.4946020485,,, +9.4941406250,9,4.6261622362,-2.0816966951,3.3311009307,-4.1464641464,,, +9.4960937500,9,4.9202676411,-0.8521538793,3.0119488839,-3.6667645873,,, +9.4980468750,9,5.1466499871,0.3821859083,2.6135428321,-3.0926457339,,, +9.5000000000,9,5.2968920935,1.5336929527,2.1601342042,-2.4606610536,,, +9.5019531250,9,5.3530768398,2.5202906986,1.6741141478,-1.8046241798,,, +9.5039062500,9,5.2916527479,3.2727936460,1.1754160627,-1.1541801116,,, +9.5058593750,9,5.0891624436,3.7427193933,0.6809989508,-0.5334529525,,, +9.5078125000,9,4.7277777724,3.9081349728,0.2047307402,0.0396175820,,, +9.5097656250,9,4.1994809234,3.7767923139,-0.2424882726,0.5533782180,,, +9.5117187500,9,3.5087214868,3.3845085829,-0.6524388440,1.0019202612,,, +9.5136718750,9,2.6746063867,2.7878925656,-1.0181305857,1.3826155081,,, +9.5156250000,9,1.7314930394,2.0555237654,-1.3317304047,1.6927715419,,, +9.5175781250,9,0.7248658876,1.2609737942,-1.5840768806,1.9283916340,,, +9.5195312500,9,-0.2957341368,0.4757731123,-1.7654028734,2.0844199243,,, +9.5214843750,9,-1.2818389136,-0.2376710187,-1.8656902020,2.1545424087,,, +9.5234375000,9,-2.1885031709,-0.8301643976,-1.8755105423,2.1318064980,,, +9.5253906250,9,-2.9763670343,-1.2682866892,-1.7878367232,2.0105152195,,, +9.5273437500,9,-3.6140688689,-1.5375485550,-1.5993755173,1.7875095636,,, +9.5292968750,9,-4.0795866277,-1.6437970275,-1.3111524317,1.4627271749,,, +9.5312500000,9,-4.3595932646,-1.6116498606,-0.9291622049,1.0400754236,,, +9.5332031250,9,-4.4481477503,-1.4813619762,-0.4648096285,0.5281815132,,, +9.5351562500,9,-4.3465389177,-1.3042039424,0.0650410400,-0.0591348470,,, +9.5371093750,9,-4.0641320592,-1.1357000688,0.6381569930,-0.7022739848,,, +9.5390625000,9,-3.6189273385,-1.0277826028,1.2281632232,-1.3764217454,,, +9.5410156250,9,-3.0374334532,-1.0219025295,1.8074608913,-2.0541272543,,, +9.5429687500,9,-2.3537558494,-1.1441066528,2.3501100015,-2.7080161431,,, +9.5449218750,9,-1.6075388651,-1.4026572890,2.8332131033,-3.3120571276,,, +9.5468750000,9,-0.8409915515,-1.7888183129,3.2373961783,-3.8421747069,,, +9.5488281250,9,-0.0959933153,-2.2786630831,3.5463020684,-4.2758857323,,, +9.5507812500,9,0.5877710460,-2.8331840645,3.7440205013,-4.5894196097,,, +9.5527343750,9,1.1737144579,-3.3991000380,3.8124753494,-4.7548847112,,, +9.5546875000,9,1.6292478407,-3.9132967664,3.7322879056,-4.7418124049,,, +9.5566406250,9,1.9268969472,-4.3088730941,3.4864496023,-4.5220722747,,, +9.5585937500,9,2.0447880935,-4.5208417495,3.0634404693,-4.0740902347,,, +9.5605468750,9,1.9667894943,-4.4921393519,2.4592307061,-3.3858289893,,, +9.5625000000,9,1.6837998185,-4.1796187324,1.6795643081,-2.4581272566,,, +9.5644531250,9,1.1969715074,-3.5591278594,0.7420913022,-1.3078356338,,, +9.5664062500,9,0.5224372332,-2.6303122152,-0.3223335984,0.0299314835,,, +9.5683593750,9,-0.3041974252,-1.4210912095,-1.4687010625,1.4999417645,,, +9.5703125000,9,-1.2258602379,0.0103200050,-2.6382342040,3.0268706103,,, +9.5722656250,9,-2.1662306862,1.5773888750,-3.7618183009,4.5194106038,,, +9.5742187500,9,-3.0370463303,3.1715297186,-4.7660730183,5.8781125339,,, +9.5761718750,9,-3.7492290221,4.6731804021,-5.5807283024,7.0054781172,,, +9.5781250000,9,-4.2244798733,5.9663863730,-6.1458934539,7.8164163103,,, +9.5800781250,9,-4.4048402779,6.9524401251,-6.4172223076,8.2461880030,,, +9.5820312500,9,-4.2595598656,7.5601283257,-6.3689346794,8.2554690086,,, +9.5839843750,9,-3.7887920122,7.7526818970,-5.9963519196,7.8343276072,,, +9.5859375000,9,-3.0226877969,7.5282167328,-5.3166232689,7.0031367953,,, +9.5878906250,9,-2.0155909902,6.9129415710,-4.3659269214,5.8083850158,,, +9.5898437500,9,-0.8386224614,5.9554376929,-3.1964718053,4.3182494754,,, +9.5917968750,9,0.4265563268,4.7259870344,-1.8756869128,2.6212214749,,, +9.5937500000,9,1.6940251023,3.3138131457,-0.4836798997,0.8225245635,,, +9.5957031250,9,2.8806084756,1.8189019044,0.8933251737,-0.9646413854,,, +9.5976562500,9,3.9115809428,0.3430011294,2.1701895005,-2.6285937256,,, +9.5996093750,9,4.7242078519,-1.0187095700,3.2686349314,-4.0668487255,,, +9.6015625000,9,5.2699898650,-2.1865158529,4.1223642068,-5.1930275087,,, +9.6035156250,9,5.5160159914,-3.1024713042,4.6809670356,-5.9420263102,,, +9.6054687500,9,5.4464392303,-3.7315251301,4.9123851697,-6.2729855614,,, +9.6074218750,9,5.0655144876,-4.0610810218,4.8058351688,-6.1726918184,,, +9.6093750000,9,4.4005818107,-4.1016409086,4.3748843499,-5.6592638738,,, +9.6113281250,9,3.5018259826,-3.8859916230,3.6576103648,-4.7822072385,,, +9.6132812500,9,2.4380524313,-3.4648358926,2.7129467756,-3.6175569130,,, +9.6152343750,9,1.2893088175,-2.8995364498,1.6145897522,-2.2597522131,,, +9.6171875000,9,0.1375354702,-2.2534646378,0.4436241644,-0.8117589679,,, +9.6191406250,9,-0.9426261555,-1.5852385335,-0.7180844509,0.6237665278,,, +9.6210937500,9,-1.8907453285,-0.9469065945,-1.7920137705,1.9498447268,,, +9.6230468750,9,-2.6646478299,-0.3832938932,-2.7068272900,3.0798510596,,, +9.6250000000,9,-3.2412377517,0.0724258315,-3.4038415014,3.9441124619,,, +9.6269531250,9,-3.6133986657,0.4029104485,-3.8411102157,4.4945961521,,, +9.6289062500,9,-3.7846330717,0.6058977220,-3.9944887300,4.7054876416,,, +9.6308593750,9,-3.7644548537,0.6908531130,-3.8579910040,4.5727012443,,, +9.6328125000,9,-3.5658725256,0.6751229827,-3.4437328454,4.1130146674,,, +9.6347656250,9,-3.2053778122,0.5798357730,-2.7806277118,3.3620276383,,, +9.6367187500,9,-2.7050795617,0.4279199927,-1.9131592098,2.3726825444,,, +9.6386718750,9,-2.0948260845,0.2451040304,-0.9002843815,1.2143438144,,, +9.6406250000,9,-1.4121379900,0.0604712587,0.1875526710,-0.0303679001,,, +9.6425781250,9,-0.6999110686,-0.0958583047,1.2736893710,-1.2717292454,,, +9.6445312500,9,-0.0027011112,-0.1968498450,2.2816772904,-2.4206590808,,, +9.6464843750,9,0.6383303359,-0.2235742707,3.1424156881,-3.3974533716,,, +9.6484375000,9,1.1907859339,-0.1699192292,3.8010988831,-4.1403063684,,, +9.6503906250,9,1.6348858380,-0.0440090650,4.2218216694,-4.6107421368,,, +9.6523437500,9,1.9654645153,0.1335797457,4.3894043289,-4.7954730605,,, +9.6542968750,9,2.1910494761,0.3326831592,4.3093474691,-4.7058257429,,, +9.6562500000,9,2.3279989354,0.5188026436,4.0047711979,-4.3731285056,,, +9.6582031250,9,2.3927553979,0.6597161445,3.5108904415,-3.8411024154,,, +9.6601562500,9,2.3981302447,0.7285884508,2.8712554247,-3.1610097506,,, +9.6621093750,9,2.3535417469,0.7043934621,2.1366237956,-2.3903584754,,, +9.6640625000,9,2.2654321625,0.5738198584,1.3629814367,-1.5905283382,,, +9.6660156250,9,2.1373959157,0.3339054584,0.6075074262,-0.8221309415,,, +9.6679687500,9,1.9716230420,-0.0076360076,-0.0757208775,-0.1406114561,,, +9.6699218750,9,1.7718962877,-0.4346285645,-0.6395524129,0.4070768954,,, +9.6718750000,9,1.5463990923,-0.9251549719,-1.0478607504,0.7859832511,,, +9.6738281250,9,1.3078499539,-1.4530566286,-1.2796128901,0.9770627883,,, +9.6757812500,9,1.0706253347,-1.9879681897,-1.3311709329,0.9797678280,,, +9.6777343750,9,0.8467278817,-2.4948308297,-1.2158542650,0.8120249309,,, +9.6796875000,9,0.6420945257,-2.9347305904,-0.9613055646,0.5077589730,,, +9.6816406250,9,0.4545456442,-3.2684086679,-0.6055600006,0.1125449870,,, +9.6835937500,9,0.2745255102,-3.4604222012,-0.1929236095,-0.3213376806,,, +9.6855468750,9,0.0886187744,-3.4815866044,0.2298878275,-0.7396639496,,, +9.6875000000,9,-0.1150060841,-3.3119300421,0.6183211273,-1.0920688385,,, +9.6894531250,9,-0.3418799050,-2.9449583735,0.9344156648,-1.3378150517,,, +9.6914062500,9,-0.5902365251,-2.3893311355,1.1485038743,-1.4479230064,,, +9.6933593750,9,-0.8527231525,-1.6684955034,1.2394982967,-1.4052040729,,, +9.6953125000,9,-1.1182507275,-0.8216616178,1.1965928366,-1.2058949741,,, +9.6972656250,9,-1.3742452527,0.0971583263,1.0203291424,-0.8602848270,,, +9.6992187500,9,-1.6101637575,1.0259307775,0.7205664562,-0.3891536190,,, +9.7011718750,9,-1.8209473692,1.9042399564,0.3133775822,0.1812963675,,, +9.7031250000,9,-2.0075477005,2.6812297919,-0.1811689849,0.8229755317,,, +9.7050781250,9,-2.1739650025,3.3201737018,-0.7407539302,1.5080024202,,, +9.7070312500,9,-2.3241526785,3.8000042428,-1.3420208387,2.2097790095,,, +9.7089843750,9,-2.4606146907,4.1146026136,-1.9608034897,2.9029511305,,, +9.7109375000,9,-2.5829750018,4.2702667730,-2.5721183595,3.5628586595,,, +9.7128906250,9,-2.6859588017,4.2815267708,-3.1504507705,4.1649457942,,, +9.7148437500,9,-2.7582722231,4.1662853901,-3.6698491739,4.6839757821,,, +9.7167968750,9,-2.7829186269,3.9428849218,-4.1043150491,5.0940143867,,, +9.7187500000,9,-2.7388679368,3.6298520349,-4.4289349599,5.3697483871,,, +9.7207031250,9,-2.6047457921,3.2457508647,-4.6204491071,5.4875464885,,, +9.7226562500,9,-2.3638082185,2.8092528593,-4.6575993652,5.4265297087,,, +9.7246093750,9,-2.0073269421,2.3403077764,-4.5230469341,5.1711670301,,, +9.7265625000,9,-1.5344500322,1.8579518066,-4.2054869215,4.7130520543,,, +9.7285156250,9,-0.9500188273,1.3738093046,-3.7004679388,4.0504167575,,, +9.7304687500,9,-0.2637178686,0.8883625759,-3.0117112455,3.1887247071,,, +9.7324218750,9,0.5083521704,0.3930273625,-2.1533685292,2.1434174217,,, +9.7343750000,9,1.3414136764,-0.1252712489,-1.1512543611,0.9421352812,,, +9.7363281250,9,2.2007009617,-0.6783963593,-0.0429353629,-0.3741372965,,, +9.7382812500,9,3.0417108692,-1.2702071770,1.1222479530,-1.7500474986,,, +9.7402343750,9,3.8122913899,-1.8913511799,2.2842808891,-3.1164937188,,, +9.7421875000,9,4.4563546695,-2.5177458338,3.3761324026,-4.3946049121,,, +9.7441406250,9,4.9184198395,-3.1114297050,4.3288311439,-5.5016068197,,, +9.7460937500,9,5.1485101840,-3.6232885298,5.0764734073,-6.3569445856,,, +9.7480468750,9,5.1075790006,-3.9996399718,5.5615387731,-6.8893781895,,, +9.7500000000,9,4.7738529212,-4.1914482207,5.7407317909,-7.0451580846,,, +9.7519531250,9,4.1496078880,-4.1624678092,5.5908135195,-6.7961110020,,, +9.7539062500,9,3.2657564226,-3.8961098077,5.1138452585,-6.1466136267,,, +9.7558593750,9,2.1811988296,-3.3998152593,4.3393763281,-5.1363467477,,, +9.7578125000,9,0.9763761463,-2.7030787458,3.3212184379,-3.8358105752,,, +9.7597656250,9,-0.2574774124,-1.8509412031,2.1312960247,-2.3375391478,,, +9.7617187500,9,-1.4311071670,-0.8977013793,0.8538422674,-0.7473048649,,, +9.7636718750,9,-2.4684402905,0.0985636448,-0.4210987746,0.8250162913,,, +9.7656250000,9,-3.3127503296,1.0804236924,-1.6057419170,2.2751251925,,, +9.7675781250,9,-3.9278530783,1.9930730391,-2.6221028885,3.5122221294,,, +9.7695312500,9,-4.2971001604,2.7855009855,-3.4076093723,4.4645069792,,, +9.7714843750,9,-4.4214318418,3.4126938936,-3.9188413413,5.0828274838,,, +9.7734375000,9,-4.3158893384,3.8377662130,-4.1329482383,5.3417734467,,, +9.7753906250,9,-4.0061252538,4.0347084712,-4.0474934289,5.2393242539,,, +9.7773437500,9,-3.5275680652,3.9933840451,-3.6808482851,4.7978346080,,, +9.7792968750,9,-2.9255662221,3.7232737267,-3.0718403954,4.0642801018,,, +9.7812500000,9,-2.2531645119,3.2519631151,-2.2758257673,3.1058183379,,, +9.7832031250,9,-1.5660783225,2.6203988572,-1.3584805648,2.0021601228,,, +9.7851562500,9,-0.9158116424,1.8781542485,-0.3898585176,0.8378733873,,, +9.7871093750,9,-0.3428326757,1.0785739330,0.5609470562,-0.3047608521,,, +9.7890625000,9,0.1282524964,0.2737077183,1.4307542082,-1.3522177570,,, +9.7910156250,9,0.4913614616,-0.4896212353,2.1667974737,-2.2451956001,,, +9.7929687500,9,0.7591211713,-1.1737484625,2.7310143280,-2.9434198228,,, +9.7949218750,9,0.9593404921,-1.7551161332,3.1037270837,-3.4293574338,,, +9.7968750000,9,1.1275408229,-2.2251302437,3.2841695557,-3.7075114713,,, +9.7988281250,9,1.2975068626,-2.5838439918,3.2860902169,-3.7974444200,,, +9.8007812500,9,1.4927691814,-2.8333786781,3.1314364571,-3.7250698292,,, +9.8027343750,9,1.7208125740,-2.9767077307,2.8460491119,-3.5172258646,,, +9.8046875000,9,1.9714091963,-3.0185004342,2.4573582729,-3.1992426943,,, +9.8066406250,9,2.2198704346,-2.9644052089,1.9927892585,-2.7938363539,,, +9.8085937500,9,2.4336603857,-2.8193880077,1.4789430196,-2.3212252441,,, +9.8105468750,9,2.5798880644,-2.5869799902,0.9413045118,-1.8000930235,,, +9.8125000000,9,2.6313546238,-2.2711326159,0.4038443270,-1.2486438884,,, +9.8144531250,9,2.5694544458,-1.8801715230,-0.1115467268,-0.6852892644,,, +9.8164062500,9,2.3848786977,-1.4296702934,-0.5857765317,-0.1286221991,,, +9.8183593750,9,2.0784671736,-0.9426842773,-1.0028173912,0.4025785866,,, +9.8203125000,9,1.6622370376,-0.4480884514,-1.3489716652,0.8886800809,,, +9.8222656250,9,1.1584069978,0.0229485296,-1.6126143536,1.3096715946,,, +9.8242187500,9,0.5955467716,0.4420369776,-1.7855378127,1.6479692126,,, +9.8261718750,9,0.0045286045,0.7868496232,-1.8638662601,1.8905719511,,, +9.8281250000,9,-0.5822471647,1.0402294767,-1.8470457066,2.0280973778,,, +9.8300781250,9,-1.1288981186,1.1896750248,-1.7368588725,2.0533859957,,, +9.8320312500,9,-1.5951055945,1.2312191329,-1.5379949523,1.9624939793,,, +9.8339843750,9,-1.9387960914,1.1734932660,-1.2594194882,1.7571689361,,, +9.8359375000,9,-2.1224972560,1.0377011208,-0.9158319337,1.4474348732,,, +9.8378906250,9,-2.1213020834,0.8543111273,-0.5287219736,1.0535731335,,, +9.8398437500,9,-1.9291819450,0.6576532101,-0.1256338158,0.6057712868,,, +9.8417968750,9,-1.5607972942,0.4787266783,0.2635231554,0.1398460233,,, +9.8437500000,9,-1.0490931545,0.3391155349,0.6110326723,-0.3084724463,,, +9.8457031250,9,-0.4416263357,0.2494766976,0.8933838128,-0.7063457400,,, +9.8476562500,9,0.2035908450,0.2108236349,1.0912597502,-1.0243697112,,, +9.8496093750,9,0.8243772050,0.2156198526,1.1897914395,-1.2378334282,,, +9.8515625000,9,1.3629037871,0.2493745312,1.1795609905,-1.3290563816,,, +9.8535156250,9,1.7737055674,0.2930905482,1.0582537269,-1.2901104555,,, +9.8554687500,9,2.0276646634,0.3262502579,0.8319004232,-1.1242889598,,, +9.8574218750,9,2.1117474445,0.3311816284,0.5142980618,-0.8448008611,,, +9.8593750000,9,2.0272967479,0.2972939936,0.1258019834,-0.4726002409,,, +9.8613281250,9,1.7885292174,0.2218934703,-0.3066712866,-0.0359520372,,, +9.8632812500,9,1.4213185545,0.1082340937,-0.7498842742,0.4297064244,,, +9.8652343750,9,0.9612158617,-0.0354115365,-1.1671781189,0.8847009520,,, +9.8671875000,9,0.4495507175,-0.1949441805,-1.5232213920,1.2904479187,,, +9.8691406250,9,-0.0708893000,-0.3503811400,-1.7883872807,1.6143837052,,, +9.8710937500,9,-0.5589235075,-0.4777987257,-1.9420940508,1.8333314641,,, +9.8730468750,9,-0.9780631553,-0.5525375317,-1.9749064706,1.9355061264,,, +9.8750000000,9,-1.3003824056,-0.5532758012,-1.8890506394,1.9210619227,,, +9.8769531250,9,-1.5093989029,-0.4676784699,-1.6971878244,1.8005595624,,, +9.8789062500,9,-1.6009551074,-0.2976533314,-1.4194370019,1.5914775709,,, +9.8808593750,9,-1.5834811541,-0.0590641209,-1.0798697741,1.3150721317,,, +9.8828125000,9,-1.4787250966,0.2254401958,-0.7045498726,0.9959619203,,, +9.8847656250,9,-1.3208897349,0.5347956200,-0.3214806327,0.6633690702,,, +9.8867187500,9,-1.1513025858,0.8513274276,0.0402242378,0.3495895462,,, +9.8886718750,9,-1.0098944736,1.1558713803,0.3541034436,0.0839298949,,, +9.8906250000,9,-0.9274645080,1.4250444761,0.6004823965,-0.1131778007,,, +9.8925781250,9,-0.9205906244,1.6350063577,0.7679482290,-0.2319463441,,, +9.8945312500,9,-0.9895841876,1.7669381507,0.8532564220,-0.2726332017,,, +9.8964843750,9,-1.1207599752,1.8108572498,0.8608372333,-0.2439592232,,, +9.8984375000,9,-1.2927850119,1.7685862375,0.8009510693,-0.1595700223,,, +9.9003906250,9,-1.4841810103,1.6545523544,0.6865772061,-0.0334572197,,, +9.9023437500,9,-1.6797983352,1.4920273617,0.5302884610,0.1236301061,,, +9.9042968750,9,-1.8738926298,1.3072209830,0.3421630972,0.3057340537,,, +9.9062500000,9,-2.0667697588,1.1250746911,0.1302154787,0.5098650337,,, +9.9082031250,9,-2.2570730850,0.9663118630,-0.0963538124,0.7308869275,,, +9.9101562500,9,-2.4351674730,0.8450782917,-0.3242747435,0.9570635041,,, +9.9121093750,9,-2.5803915356,0.7682731862,-0.5367016940,1.1698020631,,, +9.9140625000,9,-2.6630093961,0.7354144276,-0.7157703011,1.3463667588,,, +9.9160156250,9,-2.6500534814,0.7377863872,-0.8448880362,1.4630466638,,, +9.9179687500,9,-2.5123013339,0.7581505675,-0.9107808702,1.4984465628,,, +9.9199218750,9,-2.2307153043,0.7720908604,-0.9053642144,1.4367988583,,, +9.9218750000,9,-1.8008034908,0.7507495626,-0.8256114373,1.2692568421,,, +9.9238281250,9,-1.2320299313,0.6649873513,-0.6705106389,0.9917326607,,, +9.9257812500,9,-0.5435771539,0.4911718698,-0.4385855188,0.6027644195,,, +9.9277343750,9,0.2386754562,0.2166765061,-0.1297748359,0.1055693961,,, +9.9296875000,9,1.0835766964,-0.1583665654,0.2501009093,-0.4878677603,,, +9.9316406250,9,1.9571662543,-0.6238786262,0.6866595666,-1.1553739963,,, +9.9335937500,9,2.8256932172,-1.1632900745,1.1577129791,-1.8665417205,,, +9.9355468750,9,3.6569590804,-1.7541080293,1.6360760176,-2.5856882734,,, +9.9375000000,9,4.4199913602,-2.3679231896,2.0925523488,-3.2745134457,,, +9.9394531250,9,5.0844580676,-2.9724299936,2.4985330336,-3.8946968598,,, +9.9414062500,9,5.6201723327,-3.5332643707,2.8284348295,-4.4103324036,,, +9.9433593750,9,5.9974717894,-4.0139916443,3.0615884576,-4.7897215287,,, +9.9453125000,9,6.1903688204,-4.3766749909,3.1829618472,-5.0068076072,,, +9.9472656250,9,6.1818161421,-4.5865923003,3.1835632547,-5.0435147959,,, +9.9492187500,9,5.9672274320,-4.6196883996,3.0610202744,-4.8923606464,,, +9.9511718750,9,5.5543439268,-4.4663378635,2.8188326812,-4.5564244377,,, +9.9531250000,9,4.9617202420,-4.1302917703,2.4648694645,-4.0474780577,,, +9.9550781250,9,4.2181185691,-3.6278157723,2.0116020452,-3.3859230306,,, +9.9570312500,9,3.3619799874,-2.9876772482,1.4772525825,-2.6017222860,,, +9.9589843750,9,2.4381540911,-2.2486584820,0.8855183156,-1.7330008056,,, +9.9609375000,9,1.4912490401,-1.4546158494,0.2640235308,-0.8223162296,,, +9.9628906250,9,0.5596979218,-0.6502728640,-0.3575852706,0.0871137461,,, +9.9648437500,9,-0.3259242436,0.1212570572,-0.9503428677,0.9546784180,,, +9.9667968750,9,-1.1422919261,0.8214250286,-1.4893813370,1.7458705554,,, +9.9687500000,9,-1.8733006241,1.4201863883,-1.9562881855,2.4351213344,,, +9.9707031250,9,-2.5092730061,1.8989381589,-2.3397881578,3.0067684219,,, +9.9726562500,9,-3.0433335621,2.2508339171,-2.6350708083,3.4537110389,,, +9.9746093750,9,-3.4673741690,2.4782502128,-2.8411292643,3.7736652668,,, +9.9765625000,9,-3.7718655998,2.5898339852,-2.9573684701,3.9655234979,,, +9.9785156250,9,-3.9502896489,2.6007583461,-2.9830284329,4.0298478166,,, +9.9804687500,9,-4.0051069669,2.5354899863,-2.9199556589,3.9731819077,,, +9.9824218750,9,-3.9503312956,2.4267782262,-2.7745071873,3.8101631604,,, +9.9843750000,9,-3.8082103895,2.3085558924,-2.5563992945,3.5604927079,,, +9.9863281250,9,-3.6034416372,2.2090959495,-2.2774970775,3.2453548051,,, +9.9882812500,9,-3.3593040702,2.1477878205,-1.9518922941,2.8860642378,,, +9.9902343750,9,-3.0959111596,2.1331678885,-1.5958752116,2.5033046830,,, +9.9921875000,9,-2.8293996153,2.1630845773,-1.2282127503,2.1172296478,,, +9.9941406250,9,-2.5715942641,2.2280892242,-0.8707612598,1.7485454303,,, +9.9960937500,9,-2.3292188353,2.3151764101,-0.5476057780,1.4182234504,,, +9.9980468750,9,-2.1028338228,2.4104802624,-0.2823482126,1.1452919900,,, +10.0000000000,10,-1.8874007954,2.5010450339,-0.0941505920,0.9436961055,33538:33538:33538:33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000:10.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +10.0019531250,10,-1.6746502376,2.5745510813,0.0069307757,0.8185338939,,, +10.0039062500,10,-1.4561718119,2.6181165478,0.0227738405,0.7639478642,,, +10.0058593750,10,-1.2265917092,2.6184501436,-0.0337507518,0.7647120502,,, +10.0078125000,10,-0.9850665459,2.5622326168,-0.1413430126,0.7989621456,,, +10.0097656250,10,-0.7341007319,2.4347639552,-0.2725881445,0.8398057348,,, +10.0117187500,10,-0.4770105028,2.2181675718,-0.3968972475,0.8571211436,,, +10.0136718750,10,-0.2155822771,1.8927348349,-0.4841060618,0.8205469865,,, +10.0156250000,10,0.0507251355,1.4424346680,-0.5077637556,0.7032631794,,, +10.0175781250,10,0.3236060119,0.8615632797,-0.4481363675,0.4861421145,,, +10.0195312500,10,0.6040421696,0.1585557730,-0.2940913131,0.1605282334,,, +10.0214843750,10,0.8908507825,-0.6445821643,-0.0422617197,-0.2723153751,,, +10.0234375000,10,1.1795684492,-1.5143484810,0.3049013758,-0.8031060851,,, +10.0253906250,10,1.4620137407,-2.4071707227,0.7391226866,-1.4147069548,,, +10.0273437500,10,1.7276427637,-3.2731858701,1.2452074968,-2.0821249649,,, +10.0292968750,10,1.9660776430,-4.0628993361,1.8008619765,-2.7741117607,,, +10.0312500000,10,2.1690976152,-4.7322031282,2.3767826502,-3.4545983481,,, +10.0332031250,10,2.3321329085,-5.2450814257,2.9376068689,-4.0843815726,,, +10.0351562500,10,2.4552770327,-5.5760359640,3.4452789282,-4.6248224931,,, +10.0371093750,10,2.5426764785,-5.7102772412,3.8626556467,-5.0409887790,,, +10.0390625000,10,2.6000276387,-5.6402352013,4.1550356893,-5.3018411450,,, +10.0410156250,10,2.6309353020,-5.3614878627,4.2913605316,-5.3797659882,,, +10.0429687500,10,2.6337525601,-4.8712593574,4.2465428019,-5.2516816882,,, +10.0449218750,10,2.6008320478,-4.1701374219,4.0039976473,-4.9014200003,,, +10.0468750000,10,2.5201215794,-3.2672134748,3.5582330643,-4.3232800880,,, +10.0488281250,10,2.3775817776,-2.1870377858,2.9174925120,-3.5261387372,,, +10.0507812500,10,2.1605185658,-0.9735709697,2.1052225854,-2.5361726644,,, +10.0527343750,10,1.8627304666,0.3105723195,1.1601007045,-1.3978456868,,, +10.0546875000,10,1.4891002171,1.5871242597,0.1348730757,-0.1733160889,,, +10.0566406250,10,1.0547351337,2.7677181216,-0.9071172369,1.0618610647,,, +10.0585937500,10,0.5785963105,3.7629548207,-1.8977134330,2.2269248880,,, +10.0605468750,10,0.0778825922,4.4931690546,-2.7701658771,3.2446127010,,, +10.0625000000,10,-0.4332997970,4.9001299432,-3.4655828494,4.0492638235,,, +10.0644531250,10,-0.9427148734,4.9567375764,-3.9394927982,4.5940716494,,, +10.0664062500,10,-1.4374926618,4.6681293674,-4.1657068937,4.8541034044,,, +10.0683593750,10,-1.9014797539,4.0648665431,-4.1364057727,4.8245230947,,, +10.0703125000,10,-2.3142638662,3.1962636349,-3.8609097461,4.5180524436,,, +10.0722656250,10,-2.6517482885,2.1274343062,-3.3648427272,3.9637927289,,, +10.0742187500,10,-2.8875708723,0.9373757978,-2.6892387480,3.2063622832,,, +10.0761718750,10,-2.9954633085,-0.2850952955,-1.8885347523,2.3038732380,,, +10.0781250000,10,-2.9530668321,-1.4466686134,-1.0274663458,1.3250609222,,, +10.0800781250,10,-2.7478343570,-2.4529756567,-0.1778028700,0.3470998024,,, +10.0820312500,10,-2.3828410793,-3.2125141746,0.5857193677,-0.5473867066,,, +10.0839843750,10,-1.8788555709,-3.6450598208,1.1912487522,-1.2765136796,,, +10.0859375000,10,-1.2728564140,-3.6912937703,1.5762983014,-1.7668579064,,, +10.0878906250,10,-0.6148360413,-3.3197134481,1.6937632828,-1.9606366633,,, +10.0898437500,10,0.0376822425,-2.5312303713,1.5170767803,-1.8221935107,,, +10.0917968750,10,0.6276753685,-1.3613133642,1.0437753485,-1.3431930861,,, +10.0937500000,10,1.1063306862,0.1200555568,0.2976370375,-0.5460963004,,, +10.0957031250,10,1.4374904033,1.8101055903,-0.6705934850,0.5146079089,,, +10.0976562500,10,1.5990147224,3.5790830462,-1.7854052718,1.7551192263,,, +10.0996093750,10,1.5823035822,5.2811951829,-2.9522829633,3.0694632557,,, +10.1015625000,10,1.3905590609,6.7680450500,-4.0653796302,4.3389934223,,, +10.1035156250,10,1.0372504055,7.9019041523,-5.0157245897,5.4422519536,,, +10.1054687500,10,0.5460822327,8.5676830509,-5.7002638862,6.2649428899,,, +10.1074218750,10,-0.0484662618,8.6829670733,-6.0313444689,6.7097495061,,, +10.1093750000,10,-0.7007033247,8.2050130160,-5.9446442894,6.7042443560,,, +10.1113281250,10,-1.3531498907,7.1338374911,-5.4043593575,6.2056929020,,, +10.1132812500,10,-1.9385708938,5.5118341830,-4.4063256359,5.2039887352,,, +10.1152343750,10,-2.3870493858,3.4208549067,-2.9797678830,3.7240121793,,, +10.1171875000,10,-2.6349905079,0.9779400102,-1.1872569806,1.8266537097,,, +10.1191406250,10,-2.6331420492,-1.6696424225,0.8777733644,-0.3925289785,,, +10.1210937500,10,-2.3545851887,-4.3515494931,3.0959921143,-2.8071556029,,, +10.1230468750,10,-1.8017270140,-6.8853137089,5.3291230556,-5.2664914019,,, +10.1250000000,10,-1.0083732663,-9.0903950866,7.4285780742,-7.6049792173,,, +10.1269531250,10,-0.0361705992,-10.8032768803,9.2455779623,-9.6543854192,,, +10.1289062500,10,1.0310875881,-11.8915592851,10.6415299534,-11.2563698234,,, +10.1308593750,10,2.0943591371,-12.2656125434,11.4974306060,-12.2740055182,,, +10.1328125000,10,3.0496538162,-11.8867981356,11.7230966899,-12.6032203359,,, +10.1347656250,10,3.8002104323,-10.7714210480,11.2666426514,-12.1839982485,,, +10.1367187500,10,4.2666428193,-8.9897977305,10.1215904975,-11.0081720476,,, +10.1386718750,10,4.3940421195,-6.6603589052,8.3295912549,-9.1218869398,,, +10.1406250000,10,4.1562635231,-3.9396479290,5.9797573495,-6.6238205058,,, +10.1425781250,10,3.5573018750,-1.0091150874,3.2046641984,-3.6594092824,,, +10.1445312500,10,2.6304051906,1.9406251439,0.1713419301,-0.4099972084,,, +10.1464843750,10,1.4358059249,4.7252326944,-2.9314534065,2.9212373718,,, +10.1484375000,10,0.0572430405,7.1774482057,-5.9060543882,6.1226823834,,, +10.1503906250,10,-1.4035760597,9.1528227863,-8.5582990021,8.9867310269,,, +10.1523437500,10,-2.8352886397,10.5338621294,-10.7111957784,11.3233864311,,, +10.1542968750,10,-4.1264769819,11.2345080722,-12.2185144828,12.9739920053,,, +10.1562500000,10,-5.1740811970,11.2048982056,-12.9756236036,13.8225154101,,, +10.1582031250,10,-5.8903929259,10.4360498618,-12.9271739035,13.8040454355,,, +10.1601562500,10,-6.2095650932,8.9633326464,-12.0711392020,12.9100547465,,, +10.1621093750,10,-6.0932421167,6.8682138172,-10.4584625533,11.1896295315,,, +10.1640625000,10,-5.5346164471,4.2778326101,-8.1898033157,8.7475899751,,, +10.1660156250,10,-4.5599960354,1.3595668803,-5.4095714022,5.7388239488,,, +10.1679687500,10,-3.2266316865,-1.6910420868,-2.2956462551,2.3570351226,,, +10.1699218750,10,-1.6173063452,-4.6649729482,0.9534034500,-1.1796160149,,, +10.1718750000,10,0.1669624459,-7.3536033899,4.1310460329,-4.6429909243,,, +10.1738281250,10,2.0152533656,-9.5648557991,7.0367636250,-7.8111066377,,, +10.1757812500,10,3.8141353035,-11.1416679699,9.4907661800,-10.4851117158,,, +10.1777343750,10,5.4527467376,-11.9758650398,11.3450738815,-12.5019605243,,, +10.1796875000,10,6.8272852965,-12.0155475046,12.4910205626,-13.7428173110,,, +10.1816406250,10,7.8460769018,-11.2686564557,12.8661687008,-14.1402807629,,, +10.1835937500,10,8.4345907730,-9.8007997970,12.4586035984,-13.6822900476,,, +10.1855468750,10,8.5414690872,-7.7265298024,11.3060469545,-12.4108222863,,, +10.1875000000,10,8.1459265812,-5.1981607254,9.4921128725,-10.4181277632,,, +10.1894531250,10,7.2634148757,-2.3941297366,7.1412689131,-7.8414600679,,, +10.1914062500,10,5.9472447453,0.4936145456,4.4104925235,-4.8541972987,,, +10.1933593750,10,4.2865952015,3.2715810887,1.4779857125,-1.6541399554,,, +10.1953125000,10,2.4008067312,5.7553395686,-1.4681490146,1.5486859212,,, +10.1972656250,10,0.4287192188,7.7820120605,-4.2414295743,4.5459107861,,, +10.1992187500,10,-1.4861792460,9.2247786760,-6.6698375144,7.1471173698,,, +10.2011718750,10,-3.2110796337,10.0040053049,-8.6081016219,9.1950111434,,, +10.2031250000,10,-4.6360675500,10.0924541160,-9.9473731334,10.5764657037,,, +10.2050781250,10,-5.6820912370,9.5158748683,-10.6223267912,11.2295507343,,, +10.2070312500,10,-6.3045530868,8.3487081577,-10.6154998386,11.1464315875,,, +10.2089843750,10,-6.4922881671,6.7051822880,-9.9576776445,10.3713604945,,, +10.2109375000,10,-6.2629695739,4.7284245649,-8.7240424495,8.9944242619,,, +10.2128906250,10,-5.6573873577,2.5783335292,-7.0268138013,7.1422237186,,, +10.2148437500,10,-4.7351180171,0.4181015667,-5.0053740799,4.9666049277,,, +10.2167968750,10,-3.5723363218,-1.5981801044,-2.8151895537,2.6331786938,,, +10.2187500000,10,-2.2593004609,-3.3351614533,-0.6160848493,0.3100505685,,, +10.2207031250,10,-0.8947219490,-4.6835374924,1.4404399525,-1.8442139391,,, +10.2226562500,10,0.4224600581,-5.5648721979,3.2238827822,-3.6926630225,,, +10.2246093750,10,1.6017227356,-5.9353168521,4.6349682776,-5.1300814966,,, +10.2265625000,10,2.5683884957,-5.7899650323,5.6114142234,-6.0897119541,,, +10.2285156250,10,3.2685985329,-5.1642917492,6.1283220946,-6.5450233637,,, +10.2304687500,10,3.6716196891,-4.1287579845,6.1937757831,-6.5061542578,,, +10.2324218750,10,3.7701234075,-2.7794690689,5.8422753450,-6.0135982047,,, +10.2343750000,10,3.5784942191,-1.2291153823,5.1287780097,-5.1319121163,,, +10.2363281250,10,3.1289264663,0.4024716282,4.1233627248,-3.9431647806,,, +10.2382812500,10,2.4657109297,1.9994776789,2.9052629517,-2.5389649714,,, +10.2402343750,10,1.6389673638,3.4600670088,1.5569793859,-1.0125864816,,, +10.2421875000,10,0.6997689168,4.7020561893,0.1596892424,0.5466620657,,, +10.2441406250,10,-0.3021740572,5.6657332560,-1.2104182950,2.0571868774,,, +10.2460937500,10,-1.3194234835,6.3155712323,-2.4854062199,3.4481328598,,, +10.2480468750,10,-2.3076281876,6.6393845775,-3.6081818055,4.6614619920,,, +10.2500000000,10,-3.2249489968,6.6448203763,-4.5343864506,5.6527163298,,, +10.2519531250,10,-4.0298211582,6.3555530993,-5.2338046811,6.3909659329,,, +10.2539062500,10,-4.6811740198,5.8071876490,-5.6906566785,6.8582319874,,, +10.2558593750,10,-5.1430919504,5.0413411437,-5.9018556906,7.0479823426,,, +10.2578125000,10,-5.3897166814,4.0996271179,-5.8733988612,6.9625995873,,, +10.2597656250,10,-5.4069190983,3.0204688649,-5.6155253940,6.6102506615,,, +10.2617187500,10,-5.1914582685,1.8388158879,-5.1377257790,6.0019774044,,, +10.2636718750,10,-4.7495146675,0.5879908926,-4.4468874054,5.1511042835,,, +10.2656250000,10,-4.0961767013,-0.6978138059,-3.5504727901,4.0757873630,,, +10.2675781250,10,-3.2564825465,-1.9833876835,-2.4615001344,2.8020696319,,, +10.2695312500,10,-2.2663447663,-3.2341070299,-1.2025402082,1.3657868523,,, +10.2714843750,10,-1.1706363182,-4.4159425258,0.1913920365,-0.1864046739,,, +10.2734375000,10,-0.0189081201,-5.4946102456,1.6725441433,-1.7979787376,,, +10.2753906250,10,1.1379835557,-6.4364960973,3.1830910526,-3.4056665607,,, +10.2773437500,10,2.2495386744,-7.2102400293,4.6578929301,-4.9424481830,,, +10.2792968750,10,3.2676006985,-7.7871720173,6.0271797974,-6.3402534086,,, +10.2812500000,10,4.1491256370,-8.1420607831,7.2218913189,-7.5345433701,,, +10.2832031250,10,4.8581343074,-8.2550589750,8.1797103136,-8.4693491164,,, +10.2851562500,10,5.3665536363,-8.1133648943,8.8475455775,-9.0996069086,,, +10.2871093750,10,5.6553439605,-7.7125869680,9.1821101875,-9.3920879983,,, +10.2890625000,10,5.7171172868,-7.0582359238,9.1527691708,-9.3278558620,,, +10.2910156250,10,5.5594984539,-6.1661486281,8.7461779162,-8.9055259760,,, +10.2929687500,10,5.2062754642,-5.0628270284,7.9693619176,-8.1430513438,,, +10.2949218750,10,4.6949582951,-3.7884437395,6.8503651113,-7.0780587838,,, +10.2968750000,10,4.0725554975,-2.3998040161,5.4380547032,-5.7672810548,,, +10.2988281250,10,3.3905720703,-0.9670366312,3.8010500272,-4.2835392326,,, +10.3007812500,10,2.6986315634,0.4354964714,2.0237043964,-2.7092249380,,, +10.3027343750,10,2.0382008461,1.7385633183,0.1987982675,-1.1280128790,,, +10.3046875000,10,1.4394399257,2.8852458924,-1.5807691597,0.3826281409,,, +10.3066406250,10,0.9214991121,3.8353073294,-3.2287380362,1.7564632098,,, +10.3085937500,10,0.4940231341,4.5659376836,-4.6694657963,2.9406990006,,, +10.3105468750,10,0.1585288462,5.0699453419,-5.8400180901,3.8965660018,,, +10.3125000000,10,-0.0903763032,5.3526979613,-6.6923755192,4.5996046043,,, +10.3144531250,10,-0.2638930821,5.4279317278,-7.1958887858,5.0394957421,,, +10.3164062500,10,-0.3780683429,5.3141960484,-7.3385313210,5.2191720701,,, +10.3183593750,10,-0.4529494606,5.0337246388,-7.1267966423,5.1538762147,,, +10.3203125000,10,-0.5110809888,4.6126455167,-6.5850291415,4.8702540885,,, +10.3222656250,10,-0.5745362110,4.0823491336,-5.7546863181,4.4053282630,,, +10.3242187500,10,-0.6623250516,3.4814338099,-4.6937143029,3.8055323965,,, +10.3261718750,10,-0.7900664823,2.8531867417,-3.4746054187,3.1243583479,,, +10.3281250000,10,-0.9695059517,2.2379377557,-2.1793009114,2.4172364287,,, +10.3300781250,10,-1.2060903129,1.6682383950,-0.8923528215,1.7360962099,,, +10.3320312500,10,-1.4965410468,1.1700028593,0.3052735708,1.1260292695,,, +10.3339843750,10,-1.8272187361,0.7633030658,1.3424022041,0.6222349915,,, +10.3359375000,10,-2.1736343953,0.4594094997,2.1639458542,0.2463596351,,, +10.3378906250,10,-2.5031570398,0.2582406688,2.7345617060,0.0051641988,,, +10.3398437500,10,-2.7813761087,0.1494677520,3.0387604408,-0.1071483670,,, +10.3417968750,10,-2.9797673215,0.1162758015,3.0789251579,-0.1046847895,,, +10.3437500000,10,-3.0812882788,0.1406395804,2.8719918937,-0.0052310943,,, +10.3457031250,10,-3.0817120086,0.2074079001,2.4459168451,0.1729846358,,, +10.3476562500,10,-2.9874152433,0.3031974703,1.8375726278,0.4113963584,,, +10.3496093750,10,-2.8119991843,0.4126684015,1.0918064038,0.6895899451,,, +10.3515625000,10,-2.5728543795,0.5184541781,0.2599032744,0.9851668797,,, +10.3535156250,10,-2.2881201564,0.6036841081,-0.6034156425,1.2750111244,,, +10.3554687500,10,-1.9756128208,0.6522477730,-1.4434701661,1.5363073654,,, +10.3574218750,10,-1.6540308288,0.6480361753,-2.2083206336,1.7474220924,,, +10.3593750000,10,-1.3443076955,0.5765597837,-2.8509093233,1.8895252196,,, +10.3613281250,10,-1.0689026802,0.4283414016,-3.3308544315,1.9482915726,,, +10.3632812500,10,-0.8485521060,0.2020284536,-3.6160064757,1.9148730910,,, +10.3652343750,10,-0.6980122948,-0.0952956098,-3.6848988479,1.7862200570,,, +10.3671875000,10,-0.6223808456,-0.4518015243,-3.5289794474,1.5641942213,,, +10.3691406250,10,-0.6149079010,-0.8546480924,-3.1527730089,1.2539285400,,, +10.3710937500,10,-0.6576245314,-1.2899131379,-2.5744320293,0.8639228022,,, +10.3730468750,10,-0.7247457554,-1.7411741844,-1.8275247588,0.4076380838,,, +10.3750000000,10,-0.7863549390,-2.1903997316,-0.9597196957,-0.0966784410,,, +10.3769531250,10,-0.8108649493,-2.6203450175,-0.0275214573,-0.6282486201,,, +10.3789062500,10,-0.7673257747,-3.0158755596,0.9094884629,-1.1657182982,,, +10.3808593750,10,-0.6291412045,-3.3625545398,1.7935501590,-1.6877135259,,, +10.3828125000,10,-0.3796861418,-3.6427536309,2.5720588059,-2.1718436747,,, +10.3847656250,10,-0.0169454246,-3.8343452860,3.1991826927,-2.5939187911,,, +10.3867187500,10,0.4468231846,-3.9166236555,3.6384016448,-2.9305728726,,, +10.3886718750,10,0.9890365823,-3.8787508229,3.8667846339,-3.1642846889,,, +10.3906250000,10,1.5809007950,-3.7229573911,3.8780781814,-3.2866174581,,, +10.3925781250,10,2.1908803282,-3.4622670383,3.6825108641,-3.2982303678,,, +10.3945312500,10,2.7866464424,-3.1168045636,3.3047206099,-3.2071157231,,, +10.3964843750,10,3.3357024126,-2.7098951575,2.7817149827,-3.0264758821,,, +10.3984375000,10,3.8062868746,-2.2634669281,2.1597972780,-2.7723140295,,, +10.4003906250,10,4.1683390872,-1.7945128745,1.4898385175,-2.4610109077,,, +10.4023437500,10,4.3943466243,-1.3139414275,0.8226081742,-2.1077216368,,, +10.4042968750,10,4.4610915795,-0.8257101571,0.2044354655,-1.7250863547,,, +10.4062500000,10,4.3524434750,-0.3259977224,-0.3266667040,-1.3221693225,,, +10.4082031250,10,4.0626235010,0.1942766629,-0.7426027995,-0.9052816211,,, +10.4101562500,10,3.5992749277,0.7438090425,-1.0247074661,-0.4806112977,,, +10.4121093750,10,2.9850854053,1.3261322720,-1.1633908399,-0.0563670481,,, +10.4140625000,10,2.2570313394,1.9368807511,-1.1581621067,0.3563929519,,, +10.4160156250,10,1.4635889864,2.5622099801,-1.0166966220,0.7435174555,,, +10.4179687500,10,0.6594456384,3.1797540827,-0.7536389142,1.0888813852,,, +10.4199218750,10,-0.1026741984,3.7627222703,-0.3906700153,1.3776061187,,, +10.4218750000,10,-0.7797137497,4.2836881664,0.0433220769,1.5990502576,,, +10.4238281250,10,-1.3420973412,4.7164122065,0.5134006388,1.7478576161,,, +10.4257812500,10,-1.7743687631,5.0373042372,0.9802419333,1.8242037144,,, +10.4277343750,10,-2.0744230978,5.2259230309,1.4017445565,1.8336320283,,, +10.4296875000,10,-2.2516052756,5.2653594003,1.7348371278,1.7864193544,,, +10.4316406250,10,-2.3232202910,5.1459675699,1.9375861387,1.6972377525,,, +10.4335937500,10,-2.3103271145,4.8699270582,1.9723547318,1.5844322154,,, +10.4355468750,10,-2.2356179344,4.4513680257,1.8099350717,1.4680479668,,, +10.4375000000,10,-2.1239353539,3.9140346350,1.4329378386,1.3679268020,,, +10.4394531250,10,-2.0019964309,3.2905350722,0.8382463216,1.3025057001,,, +10.4414062500,10,-1.8957020147,2.6209558095,0.0397734205,1.2868607508,,, +10.4433593750,10,-1.8269688390,1.9487970769,-0.9293075968,1.3300588964,,, +10.4453125000,10,-1.8104063419,1.3166549801,-2.0165017735,1.4332779499,,, +10.4472656250,10,-1.8487798300,0.7608113674,-3.1511353357,1.5878210691,,, +10.4492187500,10,-1.9292947836,0.3032614993,-4.2465312563,1.7726939805,,, +10.4511718750,10,-2.0239891400,-0.0535357625,-5.2068543488,1.9551264262,,, +10.4531250000,10,-2.0939186958,-0.3261973692,-5.9387723331,2.0950482177,,, +10.4550781250,10,-2.0955787564,-0.5470719357,-6.3628089091,2.1508011120,,, +10.4570312500,10,-1.9896140389,-0.7576417578,-6.4221696026,2.0855341895,,, +10.4589843750,10,-1.7495705698,-0.9986983776,-6.0891080811,1.8738906310,,, +10.4609375000,10,-1.3666347324,-1.3029245342,-5.3668965892,1.5057461333,,, +10.4628906250,10,-0.8492940420,-1.6929731039,-4.2867650892,0.9855258031,,, +10.4648437500,10,-0.2197658689,-2.1818609048,-2.9028166744,0.3296029828,,, +10.4667968750,10,0.4905495560,-2.7724037332,-1.2877977254,-0.4357424022,,, +10.4687500000,10,1.2447652019,-3.4551052745,0.4700486546,-1.2754215548,,, +10.4707031250,10,2.0024713034,-4.2055815266,2.2698823143,-2.1460950168,,, +10.4726562500,10,2.7220849809,-4.9842968529,4.0034385794,-2.9980290331,,, +10.4746093750,10,3.3657572195,-5.7401300809,5.5648518683,-3.7799831281,,, +10.4765625000,10,3.9034818641,-6.4158242487,6.8614796890,-4.4448666695,,, +10.4785156250,10,4.3126176530,-6.9531874749,7.8201449345,-4.9528562276,,, +10.4804687500,10,4.5749281683,-7.2972801321,8.3895663710,-5.2722789449,,, +10.4824218750,10,4.6746611538,-7.3990558266,8.5424342518,-5.3800383350,,, +10.4843750000,10,4.5982682854,-7.2171977942,8.2766955052,-5.2619968888,,, +10.4863281250,10,4.3356426916,-6.7217207263,7.6147662228,-4.9138129232,,, +10.4882812500,10,3.8837252002,-5.9001544886,6.6021458803,-4.3431859112,,, +10.4902343750,10,3.2512054397,-4.7628409042,5.3052078009,-3.5720214079,,, +10.4921875000,10,2.4604802964,-3.3449592762,3.8053364015,-2.6359763199,,, +10.4941406250,10,1.5459764174,-1.7076594760,2.1904222301,-1.5821779823,,, +10.4960937500,10,0.5509037406,0.0620728690,0.5476628204,-0.4665991554,,, +10.4980468750,10,-0.4765356993,1.8580571213,-1.0412039566,0.6499024715,,, +10.5000000000,10,-1.4867940946,3.5686401520,-2.5028384880,1.7070561062,,, +10.5019531250,10,-2.4321878044,5.0914400081,-3.7740265228,2.6505529447,,, +10.5039062500,10,-3.2697964713,6.3435013435,-4.8031242194,3.4359709448,,, +10.5058593750,10,-3.9627944344,7.2660708200,-5.5508460937,4.0306103572,,, +10.5078125000,10,-4.4808288274,7.8262377691,-5.9906098736,4.4140133363,,, +10.5097656250,10,-4.8022959096,8.0167158231,-6.1107559318,4.5786553473,,, +10.5117187500,10,-4.9175608646,7.8548421674,-5.9183521797,4.5309733397,,, +10.5136718750,10,-4.8302450864,7.3820169716,-5.4415088498,4.2918405759,,, +10.5156250000,10,-4.5562185243,6.6608628725,-4.7280699460,3.8950079668,,, +10.5175781250,10,-4.1207638587,5.7665779836,-3.8403778734,3.3825196053,,, +10.5195312500,10,-3.5556849675,4.7757161342,-2.8483905904,2.7990444169,,, +10.5214843750,10,-2.8977198401,3.7584367660,-1.8232264881,2.1876671609,,, +10.5234375000,10,-2.1865324854,2.7749524539,-0.8312670619,1.5871191663,,, +10.5253906250,10,-1.4614589327,1.8730950035,0.0707502715,1.0295588722,,, +10.5273437500,10,-0.7582635434,1.0855876756,0.8398034888,0.5385382295,,, +10.5292968750,10,-0.1065192675,0.4283635787,1.4498084865,0.1274908894,,, +10.5312500000,10,0.4728272064,-0.0987891941,1.8924177998,-0.2004867205,,, +10.5332031250,10,0.9697217002,-0.5096089003,2.1752154059,-0.4515487390,,, +10.5351562500,10,1.3853601197,-0.8281595779,2.3182780628,-0.6393072423,,, +10.5371093750,10,1.7285772492,-1.0857323021,2.3480327616,-0.7820693944,,, +10.5390625000,10,2.0096689883,-1.3163568670,2.2891680168,-0.8987471928,,, +10.5410156250,10,2.2362572308,-1.5506414253,2.1606053903,-1.0051978113,,, +10.5429687500,10,2.4124721357,-1.8107203344,1.9778370681,-1.1126357798,,, +10.5449218750,10,2.5388175423,-2.1076191802,1.7559773445,-1.2270914837,,, +10.5468750000,10,2.6122018358,-2.4403942714,1.5095877366,-1.3490302211,,, +10.5488281250,10,2.6270981289,-2.7975544329,1.2506783688,-1.4738055204,,, +10.5507812500,10,2.5773688686,-3.1609131352,0.9867543122,-1.5931117044,,, +10.5527343750,10,2.4581542534,-3.5103683257,0.7201870825,-1.6969635129,,, +10.5546875000,10,2.2674214866,-3.8277327118,0.4496058137,-1.7757541947,,, +10.5566406250,10,2.0063024559,-4.0974653441,0.1716328441,-1.8212743992,,, +10.5585937500,10,1.6781305962,-4.3038551574,-0.1185247791,-1.8260506263,,, +10.5605468750,10,1.2875290138,-4.4281111872,-0.4254507776,-1.7826086005,,, +10.5625000000,10,0.8405134341,-4.4493297319,-0.7497752423,-1.6843966460,,, +10.5644531250,10,0.3450887365,-4.3492398410,-1.0860634455,-1.5276869398,,, +10.5664062500,10,-0.1884185804,-4.1167548190,-1.4243059382,-1.3127403816,,, +10.5683593750,10,-0.7471009771,-3.7492312947,-1.7520821986,-1.0438060226,,, +10.5703125000,10,-1.3145989789,-3.2514465772,-2.0559297285,-0.7286782703,,, +10.5722656250,10,-1.8696753431,-2.6348017413,-2.3232176730,-0.3784514597,,, +10.5742187500,10,-2.3849476207,-1.9169123087,-2.5433603009,-0.0075492186,,, +10.5761718750,10,-2.8266961804,-1.1198375654,-2.7064577712,0.3667205863,,, +10.5781250000,10,-3.1577951049,-0.2675759513,-2.8015081198,0.7258519361,,, +10.5800781250,10,-3.3455406388,0.6147174183,-2.8169642286,1.0526909383,,, +10.5820312500,10,-3.3716544516,1.5005002274,-2.7434079174,1.3340273763,,, +10.5839843750,10,-3.2377657796,2.3622480157,-2.5768051781,1.5622306505,,, +10.5859375000,10,-2.9632765960,3.1717224803,-2.3208964387,1.7350075115,,, +10.5878906250,10,-2.5801523330,3.9002086337,-1.9882548015,1.8541289707,,, +10.5898437500,10,-2.1285735195,4.5200740962,-1.5995242058,1.9243836427,,, +10.5917968750,10,-1.6512870292,5.0069283502,-1.1799912651,1.9521654003,,, +10.5937500000,10,-1.1869866072,5.3402623501,-0.7553164968,1.9433681232,,, +10.5957031250,10,-0.7664822071,5.5023997160,-0.3483818436,1.9016037583,,, +10.5976562500,10,-0.4101429478,5.4787331580,0.0239934974,1.8273934658,,, +10.5996093750,10,-0.1244876290,5.2612053356,0.3548491487,1.7184905952,,, +10.6015625000,10,0.0986977632,4.8515336663,0.6494347398,1.5708267050,,, +10.6035156250,10,0.2782214104,4.2606954121,0.9236099817,1.3795067556,,, +10.6054687500,10,0.4364390545,3.5076797623,1.1970078489,1.1406902864,,, +10.6074218750,10,0.5939254721,2.6203880531,1.4849522153,0.8540385409,,, +10.6093750000,10,0.7682281120,1.6358845966,1.7941885816,0.5236646542,,, +10.6113281250,10,0.9732100976,0.5980195945,2.1209218421,0.1578450903,,, +10.6132812500,10,1.2167751166,-0.4460412061,2.4495207060,-0.2312884653,,, +10.6152343750,10,1.4995562276,-1.4495111062,2.7549508874,-0.6287299342,,, +10.6171875000,10,1.8148605136,-2.3688067493,3.0090185901,-1.0179763964,,, +10.6191406250,10,2.1482743254,-3.1633223468,3.1863292540,-1.3812500605,,, +10.6210937500,10,2.4773542129,-3.7937908229,3.2675604966,-1.6989884274,,, +10.6230468750,10,2.7723390278,-4.2239590571,3.2399190782,-1.9504694954,,, +10.6250000000,10,2.9989520582,-4.4258494609,3.0959010473,-2.1160708376,,, +10.6269531250,10,3.1242567685,-4.3841802303,2.8333919226,-2.1802005519,,, +10.6289062500,10,3.1246694070,-4.0980510264,2.4588714801,-2.1341898643,,, +10.6308593750,10,2.9939194355,-3.5817853548,1.9911103522,-1.9789202787,,, +10.6328125000,10,2.7484604239,-2.8661582569,1.4625088684,-1.7267127246,,, +10.6347656250,10,2.4261111838,-1.9995977103,0.9170803840,-1.4014439930,,, +10.6367187500,10,2.0758419470,-1.0474288667,0.4044923444,-1.0358243005,,, +10.6386718750,10,1.7453970036,-0.0874869259,-0.0271913747,-0.6668731256,,, +10.6406250000,10,1.4741947362,0.7967455148,-0.3366019002,-0.3318449169,,, +10.6425781250,10,1.2895831953,1.5253475364,-0.4937629625,-0.0640670262,,, +10.6445312500,10,1.2022344096,2.0342014095,-0.4867340990,0.1127248720,,, +10.6464843750,10,1.2026964676,2.2859107151,-0.3262799223,0.1892248512,,, +10.6484375000,10,1.2635040416,2.2745500476,-0.0440425051,0.1714023931,,, +10.6503906250,10,1.3460083445,2.0254672766,0.3129897128,0.0782867484,,, +10.6523437500,10,1.4073917422,1.5915497220,0.6878587102,-0.0612668426,,, +10.6542968750,10,1.4064894917,1.0440353861,1.0206444837,-0.2133213328,,, +10.6562500000,10,1.3092078937,0.4602575188,1.2575913724,-0.3446198823,,, +10.6582031250,10,1.0927232439,-0.0853347583,1.3582394233,-0.4266843112,,, +10.6601562500,10,0.7475662237,-0.5263217652,1.2988707194,-0.4377639471,,, +10.6621093750,10,0.2786530153,-0.8100043743,1.0747926365,-0.3647054390,,, +10.6640625000,10,-0.2936457546,-0.9042224621,0.7021747947,-0.2053090099,,, +10.6660156250,10,-0.9334716694,-0.8014582527,0.2169459351,0.0305660489,,, +10.6679687500,10,-1.5920204793,-0.5180192639,-0.3298618822,0.3222740491,,, +10.6699218750,10,-2.2133093369,-0.0895675015,-0.8790141009,0.6416690445,,, +10.6718750000,10,-2.7425738168,0.4348420758,-1.3723588981,0.9575458817,,, +10.6738281250,10,-3.1345161795,0.9981928441,-1.7628049209,1.2397745773,,, +10.6757812500,10,-3.3585458921,1.5398925148,-2.0201541947,1.4620216476,,, +10.6777343750,10,-3.4000942835,2.0005209775,-2.1309108061,1.6033155150,,, +10.6796875000,10,-3.2590855612,2.3267641021,-2.0945454207,1.6488773301,,, +10.6816406250,10,-2.9493767983,2.4755432446,-1.9203625694,1.5909485221,,, +10.6835937500,10,-2.5015100719,2.4184224494,-1.6286978422,1.4306300967,,, +10.6855468750,10,-1.9643352840,2.1453445474,-1.2543649865,1.1793519259,,, +10.6875000000,10,-1.4003332085,1.6641785668,-0.8454951520,0.8573688329,,, +10.6894531250,10,-0.8765112901,0.9977223827,-0.4564576899,0.4902234473,,, +10.6914062500,10,-0.4554792949,0.1836526667,-0.1402409393,0.1063966223,,, +10.6933593750,10,-0.1876894486,-0.7239307801,0.0572351779,-0.2639375784,,, +10.6953125000,10,-0.1046904288,-1.6587617234,0.1024967287,-0.5917855971,,, +10.6972656250,10,-0.2150532196,-2.5529297880,-0.0215779288,-0.8536895168,,, +10.6992187500,10,-0.5039831597,-3.3452715539,-0.3152090516,-1.0344176616,,, +10.7011718750,10,-0.9362426563,-3.9835570182,-0.7624664871,-1.1267830064,,, +10.7031250000,10,-1.4616924773,-4.4247142371,-1.3318177497,-1.1302556179,,, +10.7050781250,10,-2.0216886981,-4.6360564670,-1.9779675125,-1.0496424138,,, +10.7070312500,10,-2.5545453667,-4.5969135542,-2.6455206174,-0.8940312718,,, +10.7089843750,10,-3.0002403159,-4.3016374843,-3.2735311770,-0.6765601131,,, +10.7109375000,10,-3.3047651881,-3.7639284355,-3.8010004279,-0.4149729220,,, +10.7128906250,10,-3.4231591017,-3.0185665051,-4.1728388166,-0.1316084420,,, +10.7148437500,10,-3.3217854342,-2.1185610015,-4.3440717524,0.1480600978,,, +10.7167968750,10,-2.9823734550,-1.1293284052,-4.2825483181,0.3982750476,,, +10.7187500000,10,-2.4064832557,-0.1217079558,-3.9715447400,0.5963178912,,, +10.7207031250,10,-1.6152799493,0.8339894203,-3.4099558594,0.7244001028,,, +10.7226562500,10,-0.6450022801,1.6719984178,-2.6100255020,0.7698913792,,, +10.7246093750,10,0.4551954727,2.3358358642,-1.5981151089,0.7263380918,,, +10.7265625000,10,1.6219378963,2.7848510159,-0.4189213768,0.5958861821,,, +10.7285156250,10,2.7802707027,2.9987842844,0.8642990088,0.3900924933,,, +10.7304687500,10,3.8523581589,2.9778966787,2.1754874334,0.1278619870,,, +10.7324218750,10,4.7656570777,2.7413372217,3.4320132868,-0.1670183676,,, +10.7343750000,10,5.4585984216,2.3257651615,4.5508422859,-0.4676826290,,, +10.7363281250,10,5.8857721151,1.7829046984,5.4567691812,-0.7462825743,,, +10.7382812500,10,6.0200309946,1.1756188629,6.0889879564,-0.9758138417,,, +10.7402343750,10,5.8510433556,0.5726715720,6.4042984824,-1.1314676197,,, +10.7421875000,10,5.3846477947,0.0419041629,6.3807297750,-1.1927075121,,, +10.7441406250,10,4.6436557692,-0.3560637203,6.0208456621,-1.1455101172,,, +10.7460937500,10,3.6679073764,-0.5726869855,5.3512005743,-0.9838829290,,, +10.7480468750,10,2.5129872863,-0.5767885538,4.4196032349,-0.7112052085,,, +10.7500000000,10,1.2465444014,-0.3584946183,3.2911721394,-0.3406178314,,, +10.7519531250,10,-0.0572650163,0.0708237670,2.0413433211,0.1063245680,,, +10.7539062500,10,-1.3220210030,0.6797545521,0.7487065349,0.6010722054,,, +10.7558593750,10,-2.4724576993,1.4169557259,-0.5091278266,1.1088951089,,, +10.7578125000,10,-3.4396326799,2.2129563798,-1.6590138001,1.5906332480,,, +10.7597656250,10,-4.1663041008,2.9857472933,-2.6364426212,2.0057985774,,, +10.7617187500,10,-4.6112145821,3.6490130866,-3.3889056209,2.3163442909,,, +10.7636718750,10,-4.7539462373,4.1219321852,-3.8790600011,2.4910738289,,, +10.7656250000,10,-4.5984322873,4.3395390100,-4.0885555670,2.5098919280,,, +10.7675781250,10,-4.1709260334,4.2605440538,-4.0205496386,2.3658874826,,, +10.7695312500,10,-3.5135569537,3.8709593180,-3.6987693595,2.0649915412,,, +10.7714843750,10,-2.6776133254,3.1856489006,-3.1635997872,1.6249403721,,, +10.7734375000,10,-1.7186737986,2.2476280843,-2.4678092303,1.0738881338,,, +10.7753906250,10,-0.6942551976,1.1222858011,-1.6737881097,0.4477202091,,, +10.7773437500,10,0.3372751344,-0.1114383347,-0.8504721262,-0.2133859675,,, +10.7792968750,10,1.3176318033,-1.3684387361,-0.0674372278,-0.8676445287,,, +10.7812500000,10,2.1879876763,-2.5642487388,0.6120479684,-1.4736706234,,, +10.7832031250,10,2.8891104871,-3.6235767820,1.1365358792,-1.9932966315,,, +10.7851562500,10,3.3667076516,-4.4866164861,1.4705289287,-2.3947646336,,, +10.7871093750,10,3.5794939459,-5.1088516366,1.5970469292,-2.6542426501,,, +10.7890625000,10,3.5052938855,-5.4585727227,1.5184317840,-2.7562026987,,, +10.7910156250,10,3.1450151227,-5.5179050238,1.2556342411,-2.6946711075,,, +10.7929687500,10,2.5252039980,-5.2866564142,0.8462379376,-2.4751839229,,, +10.7949218750,10,1.6978884913,-4.7861345459,0.3421587428,-2.1160997685,,, +10.7968750000,10,0.7367547780,-4.0604482238,-0.1935771208,-1.6482113233,,, +10.7988281250,10,-0.2691968217,-3.1723108810,-0.6927188158,-1.1119418230,,, +10.8007812500,10,-1.2233881690,-2.1943957918,-1.0887772609,-0.5527545472,,, +10.8027343750,10,-2.0312011881,-1.2010721547,-1.3227754507,-0.0163201076,,, +10.8046875000,10,-2.6113236272,-0.2624552199,-1.3494147965,0.4558837409,,, +10.8066406250,10,-2.9064509021,0.5599924903,-1.1444358366,0.8302565361,,, +10.8085937500,10,-2.8892935200,1.2167598646,-0.7091546073,1.0833767749,,, +10.8105468750,10,-2.5624060284,1.6734607645,-0.0698457946,1.2029954098,,, +10.8125000000,10,-1.9543705369,1.9139899952,0.7254586548,1.1883011959,,, +10.8144531250,10,-1.1148795789,1.9421362374,1.6113105579,1.0494682128,,, +10.8164062500,10,-0.1098537538,1.7814162880,2.5110940891,0.8066802124,,, +10.8183593750,10,0.9822918746,1.4731222562,3.3435547646,0.4888536766,,, +10.8203125000,10,2.0730264242,1.0709457179,4.0276419135,0.1314412743,,, +10.8222656250,10,3.0665285766,0.6326597909,4.4874506368,-0.2269188619,,, +10.8242187500,10,3.8658859441,0.2126450712,4.6593698807,-0.5481278655,,, +10.8261718750,10,4.3824939469,-0.1424297191,4.4994790071,-0.7978912486,,, +10.8281250000,10,4.5457253749,-0.3957919738,3.9889744235,-0.9483354883,,, +10.8300781250,10,4.3138231722,-0.5228579004,3.1386249341,-0.9810076038,,, +10.8320312500,10,3.6855076422,-0.5151433818,1.9915657915,-0.8907851749,,, +10.8339843750,10,2.7040788994,-0.3843466385,0.6215156983,-0.6884426076,,, +10.8359375000,10,1.4505340427,-0.1631476736,-0.8736747889,-0.3997085642,,, +10.8378906250,10,0.0319901666,0.0996132093,-2.3816477797,-0.0612587542,,, +10.8398437500,10,-1.4301344548,0.3497949054,-3.7868090194,0.2854677732,,, +10.8417968750,10,-2.8123854791,0.5411262413,-4.9806728124,0.6013668971,,, +10.8437500000,10,-4.0014966646,0.6439958275,-5.8701450149,0.8552202293,,, +10.8457031250,10,-4.9046313538,0.6479421921,-6.3848678212,1.0265139444,,, +10.8476562500,10,-5.4564800425,0.5604411667,-6.4840474792,1.1061624614,,, +10.8496093750,10,-5.6231485851,0.4033723896,-6.1613594548,1.0957137945,,, +10.8515625000,10,-5.4022739451,0.2086361025,-5.4461719628,1.0055733652,,, +10.8535156250,10,-4.8195269462,0.0144244432,-4.4004532630,0.8528804791,,, +10.8554687500,10,-3.9241682395,-0.1387726804,-3.1121048758,0.6592894464,,, +10.8574218750,10,-2.7858449600,-0.2128115614,-1.6860024143,0.4489828688,,, +10.8593750000,10,-1.4911356370,-0.1761433728,-0.2336679837,0.2469216767,,, +10.8613281250,10,-0.1369900104,-0.0079385857,1.1380891895,0.0765377774,,, +10.8632812500,10,1.1778869824,0.2985000266,2.3378932594,-0.0427929482,,, +10.8652343750,10,2.3590245116,0.7353315860,3.2955328046,-0.0968536032,,, +10.8671875000,10,3.3194621058,1.2812440902,3.9624136216,-0.0768468240,,, +10.8691406250,10,3.9856200404,1.9010506715,4.3119628872,0.0191968516,,, +10.8710937500,10,4.3063009586,2.5466757735,4.3401889106,0.1848009401,,, +10.8730468750,10,4.2606909760,3.1616170630,4.0637587766,0.4047581345,,, +10.8750000000,10,3.8638316381,3.6858999718,3.5186072640,0.6556179963,,, +10.8769531250,10,3.1672698123,4.0621823982,2.7605844258,0.9078208560,,, +10.8789062500,10,2.2505419831,4.2444609667,1.8626753390,1.1306801494,,, +10.8808593750,10,1.2067267771,4.2044821474,0.9063605915,1.2975108987,,, +10.8828125000,10,0.1312130105,3.9326961414,-0.0272719969,1.3879840998,,, +10.8847656250,10,-0.8843651467,3.4365839009,-0.8632831471,1.3885352573,,, +10.8867187500,10,-1.7572706075,2.7382551562,-1.5381025935,1.2923490418,,, +10.8886718750,10,-2.4195690088,1.8707936011,-2.0052403040,1.0990213308,,, +10.8906250000,10,-2.8236118659,0.8743356293,-2.2398317906,0.8140682009,,, +10.8925781250,10,-2.9454815855,-0.2059004875,-2.2407225781,0.4488086784,,, +10.8945312500,10,-2.7858607106,-1.3194485183,-2.0292433425,0.0206398476,,, +10.8964843750,10,-2.3698017916,-2.4108786497,-1.6456645284,-0.4469347778,,, +10.8984375000,10,-1.7462558988,-3.4229896542,-1.1454216931,-0.9253421304,,, +10.9003906250,10,-0.9842466580,-4.3020110391,-0.5936002663,-1.3833513216,,, +10.9023437500,10,-0.1637756409,-5.0020012164,-0.0552925756,-1.7901354057,,, +10.9042968750,10,0.6328389332,-5.4868137420,0.4139534477,-2.1173436338,,, +10.9062500000,10,1.3249229118,-5.7303387067,0.7718314371,-2.3398342768,,, +10.9082031250,10,1.8381021061,-5.7179303674,0.9896176560,-2.4372163380,,, +10.9101562500,10,2.1138220780,-5.4501592035,1.0543450743,-2.3972350003,,, +10.9121093750,10,2.1193989340,-4.9461268803,0.9714163764,-2.2190895636,,, +10.9140625000,10,1.8538853481,-4.2435609664,0.7641584259,-1.9148262382,,, +10.9160156250,10,1.3489750545,-3.3951205790,0.4705397101,-1.5084129570,,, +10.9179687500,10,0.6650732371,-2.4624550785,0.1383719964,-1.0329894689,,, +10.9199218750,10,-0.1172378506,-1.5106806580,-0.1807622684,-0.5272923706,,, +10.9218750000,10,-0.9088676158,-0.6032816184,-0.4385119342,-0.0315884861,,, +10.9238281250,10,-1.6241242141,0.2047606172,-0.5961883607,0.4171069277,,, +10.9257812500,10,-2.1899498635,0.8740649456,-0.6285055810,0.7894568550,,, +10.9277343750,10,-2.5516616739,1.3836530140,-0.5244408250,1.0660684558,,, +10.9296875000,10,-2.6764466081,1.7288221229,-0.2879600684,1.2374561108,,, +10.9316406250,10,-2.5554055987,1.9178567931,0.0596784135,1.3031262096,,, +10.9335937500,10,-2.2032867786,1.9698982242,0.4791925713,1.2706605582,,, +10.9355468750,10,-1.6553753526,1.9130952025,0.9182888934,1.1546719374,,, +10.9375000000,10,-0.9621612962,1.7823949917,1.3210326717,0.9754517540,,, +10.9394531250,10,-0.1825234460,1.6170629035,1.6372193575,0.7571928031,,, +10.9414062500,10,0.6231297207,1.4571248255,1.8304535566,0.5257231950,,, +10.9433593750,10,1.3975015232,1.3378313650,1.8832675845,0.3058165451,,, +10.9453125000,10,2.0878323076,1.2830059259,1.7956071235,0.1183454019,,, +10.9472656250,10,2.6464252323,1.3003706341,1.5790998375,-0.0219602198,,, +10.9492187500,10,3.0339889629,1.3808267995,1.2536162371,-0.1078072736,,, +10.9511718750,10,3.2255389440,1.5004007368,0.8463150365,-0.1400763020,,, +10.9531250000,10,3.2154243900,1.6234373605,0.3901737733,-0.1279406963,,, +10.9550781250,10,3.0191759193,1.7067735103,-0.0782357115,-0.0879492357,,, +10.9570312500,10,2.6698953674,1.7050598573,-0.5228002389,-0.0415609900,,, +10.9589843750,10,2.2093405204,1.5777696343,-0.9141816244,-0.0110034900,,, +10.9609375000,10,1.6790634351,1.2971255330,-1.2341974401,-0.0146613429,,, +10.9628906250,10,1.1151032788,0.8550971718,-1.4754299113,-0.0632643907,,, +10.9648437500,10,0.5452069009,0.2679296960,-1.6391072035,-0.1574278711,,, +10.9667968750,10,-0.0119213424,-0.4235785441,-1.7342875058,-0.2873135008,,, +10.9687500000,10,-0.5447666522,-1.1587543903,-1.7767891791,-0.4346859857,,, +10.9707031250,10,-1.0448052838,-1.8645799850,-1.7860598125,-0.5763973826,,, +10.9726562500,10,-1.5014993491,-2.4638251786,-1.7808343204,-0.6881836982,,, +10.9746093750,10,-1.8992340907,-2.8842924994,-1.7745600854,-0.7483941133,,, +10.9765625000,10,-2.2182533494,-3.0693234444,-1.7724357021,-0.7413723243,,, +10.9785156250,10,-2.4381790349,-2.9863876221,-1.7722384204,-0.6598312523,,, +10.9804687500,10,-2.5410722140,-2.6311329149,-1.7669499700,-0.5058200280,,, +10.9824218750,10,-2.5136798557,-2.0270948076,-1.7455158401,-0.2901520895,,, +10.9843750000,10,-2.3497673394,-1.2218082678,-1.6925674709,-0.0304200522,,, +10.9863281250,10,-2.0523546582,-0.2809051360,-1.5907924526,0.2514935444,,, +10.9882812500,10,-1.6353985386,0.7178510396,-1.4257261332,0.5316079203,,, +10.9902343750,10,-1.1235399301,1.6910870528,-1.1890807994,0.7859018370,,, +10.9921875000,10,-0.5484964995,2.5578576857,-0.8795961892,0.9923366839,,, +10.9941406250,10,0.0562281396,3.2471288406,-0.5030018428,1.1323550180,,, +10.9960937500,10,0.6583026088,3.7021010771,-0.0718377333,1.1917823569,,, +10.9980468750,10,1.2258002458,3.8821581879,0.3944695118,1.1617123519,,, +11.0000000000,11,1.7256571824,3.7650317876,0.8703645032,1.0397223525,33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000:10.0000000000:11.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +11.0019531250,11,2.1240588894,3.3497203106,1.3276953458,0.8311239246,,, +11.0039062500,11,2.3888012887,2.6586035722,1.7403048507,0.5495402594,,, +11.0058593750,11,2.4932092149,1.7375575169,2.0863625313,0.2162229351,,, +11.0078125000,11,2.4211311314,0.6537566960,2.3492514739,-0.1418443013,,, +11.0097656250,11,2.1716702423,-0.5089323317,2.5191671316,-0.4946046110,,, +11.0117187500,11,1.7623751118,-1.6568219327,2.5944308931,-0.8120782159,,, +11.0136718750,11,1.2299501207,-2.6955846662,2.5813529891,-1.0678930153,,, +11.0156250000,11,0.6268268064,-3.5408413269,2.4929015842,-1.2424579687,,, +11.0175781250,11,0.0130909710,-4.1272063708,2.3456410684,-1.3246256463,,, +11.0195312500,11,-0.5528713203,-4.4138891993,2.1553575823,-1.3119006608,,, +11.0214843750,11,-1.0210116994,-4.3870053535,1.9347939321,-1.2099134782,,, +11.0234375000,11,-1.3535167445,-4.0589600126,1.6951106215,-1.0311697513,,, +11.0253906250,11,-1.5277565572,-3.4658851599,1.4478404296,-0.7932686267,,, +11.0273437500,11,-1.5379429187,-2.6641568018,1.2048000110,-0.5172449421,,, +11.0292968750,11,-1.3942504571,-1.7250695535,0.9773901819,-0.2258788860,,, +11.0312500000,11,-1.1196837588,-0.7264791084,0.7767357916,0.0586403159,,, +11.0332031250,11,-0.7455198641,0.2564650993,0.6140232717,0.3170642718,,, +11.0351562500,11,-0.3064340893,1.1581758435,0.5002791411,0.5344345085,,, +11.0371093750,11,0.1624131201,1.9266469751,0.4447893627,0.7007449733,,, +11.0390625000,11,0.6256094234,2.5257513790,0.4517473360,0.8114616000,,, +11.0410156250,11,1.0469167859,2.9364761490,0.5171066388,0.8678566589,,, +11.0429687500,11,1.3893414120,3.1576749689,0.6274214220,0.8771715994,,, +11.0449218750,11,1.6167114446,3.2067866806,0.7599844247,0.8525162670,,, +11.0468750000,11,1.6977176770,3.1190168476,0.8845976092,0.8117565431,,, +11.0488281250,11,1.6116931424,2.9419577047,0.9684928985,0.7745732146,,, +11.0507812500,11,1.3535702630,2.7262576119,0.9818085555,0.7583111170,,, +11.0527343750,11,0.9358007621,2.5169469380,0.8991544788,0.7744708398,,, +11.0546875000,11,0.3867728449,2.3471878683,0.6985302557,0.8267018187,,, +11.0566406250,11,-0.2530922274,2.2327767860,0.3620456547,0.9097631626,,, +11.0585937500,11,-0.9359108143,2.1694800517,-0.1204992265,1.0099096511,,, +11.0605468750,11,-1.6109238817,2.1370761660,-0.7462807324,1.1078814535,,, +11.0625000000,11,-2.2292520005,2.1074578765,-1.4945845601,1.1833921962,,, +11.0644531250,11,-2.7484897431,2.0516113720,-2.3263474343,1.2188257795,,, +11.0664062500,11,-3.1361399515,1.9442016040,-3.1886399306,1.2013913626,,, +11.0683593750,11,-3.3713391998,1.7652682169,-4.0206095946,1.1236951928,,, +11.0703125000,11,-3.4452569239,1.4992247209,-4.7600410215,0.9829506851,,, +11.0722656250,11,-3.3604125790,1.1346388808,-5.3509282448,0.7801247251,,, +11.0742187500,11,-3.1288277722,0.6665288597,-5.7488916549,0.5198952799,,, +11.0761718750,11,-2.7694196075,0.0989985396,-5.9222633287,0.2109010554,,, +11.0781250000,11,-2.3057337812,-0.5530588249,-5.8518199306,-0.1341583658,,, +11.0800781250,11,-1.7645387296,-1.2634571494,-5.5311515545,-0.4987076934,,, +11.0820312500,11,-1.1736495258,-1.9959161062,-4.9651086601,-0.8631355963,,, +11.0839843750,11,-0.5582364748,-2.7068258089,-4.1671795346,-1.2064867382,,, +11.0859375000,11,0.0612838638,-3.3504590167,-3.1610726316,-1.5090142599,,, +11.0878906250,11,0.6670746733,-3.8867412791,-1.9858033886,-1.7549280432,,, +11.0898437500,11,1.2388904178,-4.2881864849,-0.6989359601,-1.9340087286,,, +11.0917968750,11,1.7512473586,-4.5433808625,0.6240810077,-2.0421517362,,, +11.0937500000,11,2.1770951501,-4.6570807291,1.8956428714,-2.0818186038,,, +11.0957031250,11,2.4952170314,-4.6464983700,3.0268287276,-2.0615708983,,, +11.0976562500,11,2.6942098205,-4.5336257789,3.9382150080,-1.9933218917,,, +11.0996093750,11,2.7714818511,-4.3367525722,4.5668547680,-1.8883917464,,, +11.1015625000,11,2.7311604053,-4.0661375884,4.8720471779,-1.7549150198,,, +11.1035156250,11,2.5829093092,-3.7252084479,4.8411588054,-1.5974941971,,, +11.1054687500,11,2.3409937423,-3.3139630080,4.4921361651,-1.4179977894,,, +11.1074218750,11,2.0236579503,-2.8316253413,3.8717818610,-1.2165187458,,, +11.1093750000,11,1.6533882459,-2.2785667266,3.0518328292,-0.9924779979,,, +11.1113281250,11,1.2565574100,-1.6583261993,2.1221309290,-0.7458731651,,, +11.1132812500,11,0.8610645429,-0.9801293954,1.1802841503,-0.4785218987,,, +11.1152343750,11,0.4946545366,-0.2614033896,0.3220457782,-0.1954143049,,, +11.1171875000,11,0.1853992575,0.4716140291,-0.3652915022,0.0943541808,,, +11.1191406250,11,-0.0400626184,1.1859573141,-0.8102455293,0.3781293401,,, +11.1210937500,11,-0.1633654835,1.8451928208,-0.9664728990,0.6417705589,,, +11.1230468750,11,-0.1820235276,2.4132879655,-0.8196236263,0.8723671713,,, +11.1250000000,11,-0.1116639392,2.8600102079,-0.3886920325,1.0606913967,,, +11.1269531250,11,0.0184713336,3.1670871778,0.2775112206,1.2027081679,,, +11.1289062500,11,0.1734630380,3.3317894621,1.1071977617,1.2995640704,,, +11.1308593750,11,0.3208846899,3.3650690761,2.0141335516,1.3556322738,,, +11.1328125000,11,0.4373066318,3.2853086179,2.9062301315,1.3753331176,,, +11.1347656250,11,0.5110744755,3.1124133978,3.6929553570,1.3608960789,,, +11.1367187500,11,0.5411479639,2.8660726187,4.2918648138,1.3125716006,,, +11.1386718750,11,0.5338581452,2.5674508010,4.6347234067,1.2306099045,,, +11.1406250000,11,0.4977621773,2.2412234516,4.6716137922,1.1176821436,,, +11.1425781250,11,0.4361069394,1.9155985184,4.3721231442,0.9809058069,,, +11.1445312500,11,0.3416281242,1.6196775382,3.7263093864,0.8322803384,,, +11.1464843750,11,0.2001690535,1.3797074343,2.7483030364,0.6867146368,,, +11.1484375000,11,-0.0000206216,1.2154458463,1.4803312095,0.5586766818,,, +11.1503906250,11,-0.2619699675,1.1364594870,-0.0076593863,0.4591610430,,, +11.1523437500,11,-0.5781061749,1.1392954762,-1.6236200686,0.3936237541,,, +11.1542968750,11,-0.9300618763,1.2066775162,-3.2611955357,0.3608801481,,, +11.1562500000,11,-1.2903177293,1.3085579245,-4.8074521738,0.3531470770,,, +11.1582031250,11,-1.6262691550,1.4055627055,-6.1512295121,0.3575548726,,, +11.1601562500,11,-1.9053235593,1.4558130346,-7.1924288247,0.3591318079,,, +11.1621093750,11,-2.0996840901,1.4237671532,-7.8497434213,0.3446233960,,, +11.1640625000,11,-2.1910091852,1.2875654473,-8.0662341065,0.3059356044,,, +11.1660156250,11,-2.1744374945,1.0415949386,-7.8153978132,0.2416219439,,, +11.1679687500,11,-2.0595369546,0.6942778765,-7.1070447468,0.1558385260,,, +11.1699218750,11,-1.8665378124,0.2648050278,-5.9879969533,0.0561500400,,, +11.1718750000,11,-1.6197372456,-0.2188746342,-4.5368890778,-0.0484157644,,, +11.1738281250,11,-1.3440129752,-0.7227360359,-2.8592926137,-0.1488078569,,, +11.1757812500,11,-1.0667941018,-1.2115624562,-1.0844146094,-0.2369391191,,, +11.1777343750,11,-0.8178392182,-1.6531223612,0.6446391513,-0.3063748564,,, +11.1796875000,11,-0.6213845595,-2.0187095233,2.1895565194,-0.3528382441,,, +11.1816406250,11,-0.4861520055,-2.2824555406,3.4370841888,-0.3747092586,,, +11.1835937500,11,-0.4001053259,-2.4234314237,4.3141295070,-0.3738227994,,, +11.1855468750,11,-0.3330475033,-2.4302596291,4.7936222757,-0.3559934371,,, +11.1875000000,11,-0.2461772389,-2.3044624823,4.8902120383,-0.3301681781,,, +11.1894531250,11,-0.1020559271,-2.0601781836,4.6514177198,-0.3065430205,,, +11.1914062500,11,0.1302752745,-1.7224052022,4.1493363462,-0.2953766421,,, +11.1933593750,11,0.4739695418,-1.3267028951,3.4729101025,-0.3073191970,,, +11.1953125000,11,0.9446987366,-0.9179018976,2.7208711817,-0.3537550356,,, +11.1972656250,11,1.5502538112,-0.5437180018,1.9946439135,-0.4450263476,,, +11.1992187500,11,2.2864731051,-0.2454604266,1.3885114553,-0.5867879555,,, +11.2011718750,11,3.1304163709,-0.0519928797,0.9781501134,-0.7769352169,,, +11.2031250000,11,4.0349042515,0.0212323946,0.8115492156,-1.0045301312,,, +11.2050781250,11,4.9281187352,-0.0282197299,0.9034126804,-1.2502570088,,, +11.2070312500,11,5.7197408154,-0.1889587922,1.2328276189,-1.4879022795,,, +11.2089843750,11,6.3112077902,-0.4354952681,1.7452179823,-1.6867806887,,, +11.2109375000,11,6.6064245322,-0.7304475836,2.3579738359,-1.8149060830,,, +11.2128906250,11,6.5227282157,-1.0292733757,2.9690127332,-1.8429281828,,, +11.2148437500,11,6.0026989853,-1.2869867964,3.4695897655,-1.7486629425,,, +11.2167968750,11,5.0236941125,-1.4649250121,3.7594401791,-1.5208277070,,, +11.2187500000,11,3.6019723059,-1.5342968102,3.7591358321,-1.1603701326,,, +11.2207031250,11,1.7922912050,-1.4757638715,3.4186118136,-0.6794235485,,, +11.2226562500,11,-0.3155616917,-1.2778533038,2.7234348070,-0.0991930655,,, +11.2246093750,11,-2.6037603412,-0.9365026143,1.6966363346,0.5522666550,,, +11.2265625000,11,-4.9360004159,-0.4558001635,0.3942252306,1.2419115871,,, +11.2285156250,11,-7.1659548898,0.1509052188,-1.1009727212,1.9329509098,,, +11.2304687500,11,-9.1437301888,0.8600660534,-2.6838036435,2.5857580284,,, +11.2324218750,11,-10.7248952196,1.6364748182,-4.2349147162,3.1589552557,,, +11.2343750000,11,-11.7838377142,2.4312631847,-5.6348908928,3.6109370752,,, +11.2363281250,11,-12.2264114017,3.1820545081,-6.7771818402,3.9021684481,,, +11.2382812500,11,-11.9984977195,3.8182875580,-7.5758524905,3.9988640015,,, +11.2402343750,11,-11.0914081924,4.2714661025,-7.9710205272,3.8779270631,,, +11.2421875000,11,-9.5442790615,4.4859824415,-7.9327904577,3.5314341891,,, +11.2441406250,11,-7.4424600893,4.4266720831,-7.4628533426,2.9689910765,,, +11.2460937500,11,-4.9112992752,4.0831410347,-6.5942048754,2.2177603300,,, +11.2480468750,11,-2.1051752924,3.4705015270,-5.3879008128,1.3200862097,,, +11.2500000000,11,0.8064391662,2.6258108137,-3.9261949649,0.3289962442,,, +11.2519531250,11,3.6522854784,1.6029422159,-2.3051308606,-0.6967045339,,, +11.2539062500,11,6.2707628240,0.4678067740,-0.6283874494,-1.6968687911,,, +11.2558593750,11,8.5208828394,-0.7069312293,0.9998715969,-2.6144610205,,, +11.2578125000,11,10.2918247399,-1.8477455534,2.4837577287,-3.3997011322,,, +11.2597656250,11,11.5083967979,-2.8866889827,3.7433459599,-4.0133126015,,, +11.2617187500,11,12.1323140008,-3.7676078679,4.7202087939,-4.4286696992,,, +11.2636718750,11,12.1607333411,-4.4492884276,5.3809220437,-4.6322175775,,, +11.2656250000,11,11.6224141623,-4.9052852039,5.7167678386,-4.6223632495,,, +11.2675781250,11,10.5724130631,-5.1235351332,5.7395761820,-4.4082731460,,, +11.2695312500,11,9.0874456614,-5.1061518621,5.4770487034,-4.0090209645,,, +11.2714843750,11,7.2627859426,-4.8672139471,4.9695457758,-3.4522941065,,, +11.2734375000,11,5.2086676578,-4.4289910201,4.2673633014,-2.7722904566,,, +11.2753906250,11,3.0433856591,-3.8194587405,3.4272031203,-2.0072039062,,, +11.2773437500,11,0.8837179940,-3.0721804763,2.5078221735,-1.1969065743,,, +11.2792968750,11,-1.1643141794,-2.2261974459,1.5657568195,-0.3806887012,,, +11.2812500000,11,-3.0128616630,-1.3237741019,0.6519605089,0.4054463291,,, +11.2832031250,11,-4.5970044911,-0.4074126194,-0.1905357213,1.1311373578,,, +11.2851562500,11,-5.8756308353,0.4822342341,-0.9282796594,1.7726062183,,, +11.2871093750,11,-6.8286483636,1.3082527482,-1.5382868226,2.3124674049,,, +11.2890625000,11,-7.4524334731,2.0395665208,-2.0080757566,2.7390995465,,, +11.2910156250,11,-7.7557156104,2.6519643748,-2.3356288669,3.0456945115,,, +11.2929687500,11,-7.7571181422,3.1272379023,-2.5295939054,3.2290691528,,, +11.2949218750,11,-7.4834108437,3.4525511038,-2.6075953380,3.2890397570,,, +11.2968750000,11,-6.9664193890,3.6220708025,-2.5908088946,3.2287515013,,, +11.2988281250,11,-6.2399761572,3.6383497226,-2.4987015372,3.0550129264,,, +11.3007812500,11,-5.3411019645,3.5108726770,-2.3489699402,2.7783297800,,, +11.3027343750,11,-4.3146878793,3.2536646008,-2.1599908097,2.4134049914,,, +11.3046875000,11,-3.2156996719,2.8841447665,-1.9508439056,1.9796413336,,, +11.3066406250,11,-2.1054327947,2.4232619871,-1.7388200607,1.5005403603,,, +11.3085937500,11,-1.0436470571,1.8959408388,-1.5359600822,1.0019405240,,, +11.3105468750,11,-0.0808713606,1.3305843443,-1.3469097572,0.5096789712,,, +11.3125000000,11,0.7460946530,0.7579363786,-1.1700186510,0.0475723025,,, +11.3144531250,11,1.4158585883,0.2099028943,-0.9991259161,-0.3638558144,,, +11.3164062500,11,1.9226741820,-0.2819271855,-0.8230727502,-0.7081084463,,, +11.3183593750,11,2.2749761428,-0.6878786779,-0.6249548888,-0.9729544938,,, +11.3203125000,11,2.4919506177,-0.9827034458,-0.3835371443,-1.1506172906,,, +11.3222656250,11,2.5987339712,-1.1493464928,-0.0762791746,-1.2381499942,,, +11.3242187500,11,2.6212357425,-1.1814584045,0.3160713801,-1.2373518500,,, +11.3261718750,11,2.5810177608,-1.0835294416,0.8026407541,-1.1540225557,,, +11.3281250000,11,2.4893174126,-0.8702988592,1.3749902868,-0.9967441270,,, +11.3300781250,11,2.3435478692,-0.5655880970,2.0039110694,-0.7757837092,,, +11.3320312500,11,2.1319637914,-0.1999934154,2.6432444334,-0.5033879838,,, +11.3339843750,11,1.8432173715,0.1908846922,3.2367782765,-0.1954912455,,, +11.3359375000,11,1.4732984052,0.5670851069,3.7248226737,0.1269642727,,, +11.3378906250,11,1.0281314858,0.8864478203,4.0514132585,0.4388039194,,, +11.3398437500,11,0.5232950493,1.1092874534,4.1714084277,0.7133625337,,, +11.3417968750,11,-0.0170408043,1.2034407472,4.0562207736,0.9255415756,,, +11.3437500000,11,-0.5603810099,1.1493723065,3.6984328283,1.0545536003,,, +11.3457031250,11,-1.0670219473,0.9460049960,3.1133380449,1.0869219461,,, +11.3476562500,11,-1.4940792118,0.6131217638,2.3356565993,1.0185464830,,, +11.3496093750,11,-1.8009419949,0.1856881768,1.4139338253,0.8537502536,,, +11.3515625000,11,-1.9537271865,-0.2962080570,0.4050877432,0.6022402081,,, +11.3535156250,11,-1.9287088295,-0.7947792597,-0.6311651845,0.2767469012,,, +11.3554687500,11,-1.7152559598,-1.2784191308,-1.6372978842,-0.1080159432,,, +11.3574218750,11,-1.3178647713,-1.7238469807,-2.5611400216,-0.5357746116,,, +11.3593750000,11,-0.7570971734,-2.1154526496,-3.3576956938,-0.9882137997,,, +11.3613281250,11,-0.0690634574,-2.4417368408,-3.9892762477,-1.4436589558,,, +11.3632812500,11,0.6971454403,-2.6918578269,-4.4242155391,-1.8763702938,,, +11.3652343750,11,1.4836254182,-2.8539919418,-4.6373868019,-2.2573614198,,, +11.3671875000,11,2.2285516241,-2.9154655597,-4.6134889833,-2.5565653253,,, +11.3691406250,11,2.8713414431,-2.8645532789,-4.3504332203,-2.7458786500,,, +11.3710937500,11,3.3579249497,-2.6926691390,-3.8614397295,-2.8023540862,,, +11.3730468750,11,3.6461344011,-2.3968546798,-3.1759323721,-2.7114520328,,, +11.3750000000,11,3.7107382018,-1.9840123413,-2.3377896386,-2.4705331151,,, +11.3769531250,11,3.5473242194,-1.4744892386,-1.3991487793,-2.0911081761,,, +11.3789062500,11,3.1743228034,-0.9003622581,-0.4118692055,-1.5979812535,,, +11.3808593750,11,2.6314456868,-0.2983586905,0.5785458580,-1.0252277634,,, +11.3828125000,11,1.9737677216,0.2983856338,1.5353161199,-0.4105328662,,, +11.3847656250,11,1.2648883555,0.8651701593,2.4312786003,0.2093388914,,, +11.3867187500,11,0.5722023049,1.3843560428,3.2488411229,0.7997023560,,, +11.3886718750,11,-0.0378568280,1.8402354066,3.9777404499,1.3272917876,,, +11.3906250000,11,-0.5063566801,2.2163430675,4.6108302132,1.7610299837,,, +11.3925781250,11,-0.7877706668,2.4963470080,5.1397064781,2.0740950447,,, +11.3945312500,11,-0.8530235165,2.6647327992,5.5525705757,2.2452250391,,, +11.3964843750,11,-0.6906216547,2.7074630426,5.8351561457,2.2597698290,,, +11.3984375000,11,-0.3082315505,2.6161574311,5.9722263230,2.1124424290,,, +11.4003906250,11,0.2657677870,2.3939877750,5.9487699898,1.8107149251,,, +11.4023437500,11,0.9837627806,2.0576810793,5.7528781740,1.3757270408,,, +11.4042968750,11,1.7837845560,1.6353851121,5.3793836105,0.8403390599,,, +11.4062500000,11,2.5954945002,1.1635602457,4.8318653181,0.2461484899,,, +11.4082031250,11,3.3452502505,0.6829696980,4.1223820801,-0.3598902191,,, +11.4101562500,11,3.9597805503,0.2335901903,3.2683293469,-0.9293795953,,, +11.4121093750,11,4.3706907809,-0.1497831778,2.2879845728,-1.4168675156,,, +11.4140625000,11,4.5221733779,-0.4416404441,1.1996365776,-1.7849572924,,, +11.4160156250,11,4.3796697728,-0.6312039787,0.0254502195,-2.0096894116,,, +11.4179687500,11,3.9343059742,-0.7258842807,-1.2042416641,-2.0834248146,,, +11.4199218750,11,3.2006763418,-0.7475213274,-2.4496280314,-2.0125608056,,, +11.4218750000,11,2.2096900988,-0.7234825068,-3.6642273018,-1.8116886466,,, +11.4238281250,11,1.0012483549,-0.6791287810,-4.8008631110,-1.4985879229,,, +11.4257812500,11,-0.3790242698,-0.6336675576,-5.8170831823,-1.0920013057,,, +11.4277343750,11,-1.8798414120,-0.5979014778,-6.6774393044,-0.6109127731,,, +11.4296875000,11,-3.4445107089,-0.5740238493,-7.3540992977,-0.0743922106,,, +11.4316406250,11,-5.0126490286,-0.5579713746,-7.8283967916,0.4978405393,,, +11.4335937500,11,-6.5222417823,-0.5427729388,-8.0924305360,1.0845442468,,, +11.4355468750,11,-7.9103763527,-0.5214475702,-8.1477453898,1.6622442689,,, +11.4375000000,11,-9.1131804928,-0.4884189461,-8.0020426643,2.2051685936,,, +11.4394531250,11,-10.0681386452,-0.4385076337,-7.6676263832,2.6868827675,,, +11.4414062500,11,-10.7203892480,-0.3651049965,-7.1618062192,3.0835742325,,, +11.4433593750,11,-11.0305626409,-0.2605615228,-6.5070796879,3.3771123179,,, +11.4453125000,11,-10.9806049735,-0.1195325715,-5.7309900759,3.5561920883,,, +11.4472656250,11,-10.5757960200,0.0573776200,-4.8655956322,3.6159740908,,, +11.4492187500,11,-9.8432776358,0.2628425596,-3.9449562862,3.5578467994,,, +11.4511718750,11,-8.8284637818,0.4852009311,-3.0013096527,3.3897541839,,, +11.4531250000,11,-7.5899986752,0.7115844574,-2.0627971241,3.1258263641,,, +11.4550781250,11,-6.1934475181,0.9288533922,-1.1534572372,2.7840598850,,, +11.4570312500,11,-4.7050154796,1.1221432944,-0.2940146359,2.3828219092,,, +11.4589843750,11,-3.1867432056,1.2744157424,0.4978373887,1.9385125829,,, +11.4609375000,11,-1.6932870646,1.3694452271,1.2087189697,1.4656192381,,, +11.4628906250,11,-0.2703823362,1.3963958124,1.8316637809,0.9782581135,,, +11.4648437500,11,1.0448735980,1.3529500783,2.3656627716,0.4914558810,,, +11.4667968750,11,2.2235560476,1.2460981803,2.8122111107,0.0210571730,,, +11.4687500000,11,3.2462425634,1.0908776769,3.1734196882,-0.4177325677,,, +11.4707031250,11,4.1058196441,0.9073020614,3.4538275187,-0.8126000945,,, +11.4726562500,11,4.8092980312,0.7152584188,3.6623508905,-1.1567923069,,, +11.4746093750,11,5.3761544140,0.5281889724,3.8111415445,-1.4512988329,,, +11.4765625000,11,5.8335428406,0.3496408008,3.9130471736,-1.7046427492,,, +11.4785156250,11,6.2108884073,0.1758649521,3.9805817984,-1.9295153417,,, +11.4804687500,11,6.5340191161,0.0020883587,4.0250554550,-2.1376188137,,, +11.4824218750,11,6.8187406442,-0.1718777497,4.0546086936,-2.3347734252,,, +11.4843750000,11,7.0677679543,-0.3386402128,4.0737261228,-2.5183205907,,, +11.4863281250,11,7.2724650292,-0.4833644388,4.0837306207,-2.6777201961,,, +11.4882812500,11,7.4157410494,-0.5879418479,4.0813316043,-2.7977268286,,, +11.4902343750,11,7.4750281978,-0.6382240933,4.0566573689,-2.8631544216,,, +11.4921875000,11,7.4267084782,-0.6295853562,3.9935983617,-2.8632925689,,, +11.4941406250,11,7.2515198499,-0.5682934437,3.8734661866,-2.7943730344,,, +11.4960937500,11,6.9405207630,-0.4714054872,3.6819266101,-2.6610320322,,, +11.4980468750,11,6.4990902870,-0.3648197637,3.4148359494,-2.4763336204,,, +11.5000000000,11,5.9433411828,-0.2761931443,3.0771285632,-2.2574710706,,, +11.5019531250,11,5.2911592067,-0.2260841785,2.6783986829,-2.0188194915,,, +11.5039062500,11,4.5578325427,-0.2239977910,2.2326844394,-1.7683057851,,, +11.5058593750,11,3.7589270118,-0.2700277591,1.7608206059,-1.5089875799,,, +11.5078125000,11,2.9148496163,-0.3581613355,1.2907350237,-1.2425237117,,, +11.5097656250,11,2.0530403729,-0.4787694427,0.8550856835,-0.9716861213,,, +11.5117187500,11,1.2069314481,-0.6206881155,0.4864913491,-0.7016051078,,, +11.5136718750,11,0.4119881404,-0.7733789913,0.2114519340,-0.4399270691,,, +11.5156250000,11,-0.2989911145,-0.9281521015,0.0457184767,-0.1960000466,,, +11.5175781250,11,-0.8987874301,-1.0780161850,-0.0069312749,0.0203112038,,, +11.5195312500,11,-1.3679119257,-1.2177552300,0.0464043194,0.1998318320,,, +11.5214843750,11,-1.6981767970,-1.3448697057,0.1889492176,0.3356322992,,, +11.5234375000,11,-1.8960363328,-1.4591639409,0.3954389033,0.4250715248,,, +11.5253906250,11,-1.9827438791,-1.5599566811,0.6336097512,0.4714472563,,, +11.5273437500,11,-1.9916112650,-1.6433269161,0.8657938424,0.4843094694,,, +11.5292968750,11,-1.9637998426,-1.7016991236,1.0517962882,0.4783110826,,, +11.5312500000,11,-1.9427491342,-1.7258975846,1.1530574647,0.4705795639,,, +11.5332031250,11,-1.9677479982,-1.7085122763,1.1365260326,0.4770297290,,, +11.5351562500,11,-2.0673930127,-1.6469556602,0.9792272359,0.5087698930,,, +11.5371093750,11,-2.2543763213,-1.5451227473,0.6732404140,0.5696683792,,, +11.5390625000,11,-2.5253261344,-1.4133873575,0.2262448484,0.6561646837,,, +11.5410156250,11,-2.8657872401,-1.2669534110,-0.3422472964,0.7594983247,,, +11.5429687500,11,-3.2542819116,-1.1226258661,-1.0023855744,0.8686990343,,, +11.5449218750,11,-3.6631480712,-0.9940718323,-1.7128793604,0.9732541948,,, +11.5468750000,11,-4.0594884179,-0.8873315296,-2.4229946035,1.0651541259,,, +11.5488281250,11,-4.4079502649,-0.7999855273,-3.0791441215,1.1392856381,,, +11.5507812500,11,-4.6763098229,-0.7234760230,-3.6345521885,1.1931824504,,, +11.5527343750,11,-4.8428424485,-0.6450993731,-4.0591513663,1.2277956107,,, +11.5546875000,11,-4.8994637026,-0.5509835279,-4.3434847245,1.2469543804,,, +11.5566406250,11,-4.8491794380,-0.4320574699,-4.4951853838,1.2541569893,,, +11.5585937500,11,-4.7037406959,-0.2885848908,-4.5347523201,1.2502624472,,, +11.5605468750,11,-4.4828734312,-0.1289413745,-4.4928690783,1.2342469266,,, +11.5625000000,11,-4.2111877712,0.0358827651,-4.4049693436,1.2052720123,,, +11.5644531250,11,-3.9126787227,0.1988209404,-4.3036890238,1.1644552768,,, +11.5664062500,11,-3.6055444613,0.3617318441,-4.2133076991,1.1157214890,,, +11.5683593750,11,-3.2978622071,0.5365692648,-4.1457623297,1.0650160064,,, +11.5703125000,11,-2.9842169884,0.7424517859,-4.0976531291,1.0179079260,,, +11.5722656250,11,-2.6460403613,1.0005996367,-4.0518825556,0.9771576545,,, +11.5742187500,11,-2.2581678296,1.3289583566,-3.9848175286,0.9421649116,,, +11.5761718750,11,-1.7979478444,1.7370208460,-3.8729822319,0.9098930744,,, +11.5781250000,11,-1.2499121846,2.2208933454,-3.6947591029,0.8747320356,,, +11.5800781250,11,-0.6053673217,2.7589766548,-3.4299776541,0.8265606042,,, +11.5820312500,11,0.1377438217,3.3102864701,-3.0607821828,0.7498609877,,, +11.5839843750,11,0.9728504205,3.8202615857,-2.5723908702,0.6272700881,,, +11.5859375000,11,1.8835795044,4.2348904475,-1.9530682637,0.4465836104,,, +11.5878906250,11,2.8441186847,4.5138363107,-1.1963535757,0.2059647392,,, +11.5898437500,11,3.8197631865,4.6344074041,-0.3059421479,-0.0857390546,,, +11.5917968750,11,4.7690620091,4.5896396981,0.7007343025,-0.4119341837,,, +11.5937500000,11,5.6487025990,4.3861763478,1.7925832056,-0.7519113668,,, +11.5957031250,11,6.4185019812,4.0419587486,2.9281397050,-1.0838770162,,, +11.5976562500,11,7.0437342231,3.5829199589,4.0601616110,-1.3867624127,,, +11.5996093750,11,7.4948665003,3.0404215424,5.1391741258,-1.6405671703,,, +11.6015625000,11,7.7470410896,2.4496514553,6.1167523959,-1.8261558329,,, +11.6035156250,11,7.7811725445,1.8470539852,6.9498103313,-1.9260780256,,, +11.6054687500,11,7.5856148286,1.2672324211,7.6030033010,-1.9262865785,,, +11.6074218750,11,7.1574849474,0.7405821836,8.0480861348,-1.8179939628,,, +11.6093750000,11,6.5044399208,0.2905246248,8.2634517033,-1.5999758100,,, +11.6113281250,11,5.6459631397,-0.0703144670,8.2343210005,-1.2809926502,,, +11.6132812500,11,4.6125874372,-0.3440633656,7.9518184472,-0.8813927987,,, +11.6152343750,11,3.4432720901,-0.5500772853,7.4126976830,-0.4328866367,,, +11.6171875000,11,2.1818509009,-0.7228730346,6.6217810679,0.0248635078,,, +11.6191406250,11,0.8737567626,-0.9038746285,5.5950828258,0.4505240204,,, +11.6210937500,11,-0.4365443385,-1.1299518204,4.3614263794,0.8081744828,,, +11.6230468750,11,-1.7077694332,-1.4234643108,2.9635400696,1.0734649108,,, +11.6250000000,11,-2.9023511896,-1.7869653282,1.4589636088,1.2367272202,,, +11.6269531250,11,-3.9841646435,-2.2037129596,-0.0808325971,1.3014507992,,, +11.6289062500,11,-4.9165545269,-2.6422007223,-1.5734391734,1.2804914192,,, +11.6308593750,11,-5.6639900202,-3.0630399419,-2.9313026671,1.1924690040,,, +11.6328125000,11,-6.1953957340,-3.4294617983,-4.0714587796,1.0565005977,,, +11.6347656250,11,-6.4872548701,-3.7185183058,-4.9269896714,0.8860618395,,, +11.6367187500,11,-6.5280300848,-3.9245208921,-5.4565895201,0.6875016423,,, +11.6386718750,11,-6.3228969517,-4.0518532332,-5.6499539188,0.4645323931,,, +11.6406250000,11,-5.8956979419,-4.1040929901,-5.5276272325,0.2242479412,,, +11.6425781250,11,-5.2874189002,-4.0788726912,-5.1360065481,-0.0201448433,,, +11.6445312500,11,-4.5524531593,-3.9700385436,-4.5408114935,-0.2507304883,,, +11.6464843750,11,-3.7542612538,-3.7707303255,-3.8212414981,-0.4472057186,,, +11.6484375000,11,-2.9601516095,-3.4753261291,-3.0635940919,-0.5891196923,,, +11.6503906250,11,-2.2342688296,-3.0836439723,-2.3534972992,-0.6599385592,,, +11.6523437500,11,-1.6307465577,-2.6062201239,-1.7687580433,-0.6516991510,,, +11.6542968750,11,-1.1891424655,-2.0655243944,-1.3738468449,-0.5669009824,,, +11.6562500000,11,-0.9315624806,-1.4907639303,-1.2141004703,-0.4164732278,,, +11.6582031250,11,-0.8610405292,-0.9095964097,-1.3098175066,-0.2156414223,,, +11.6601562500,11,-0.9614705766,-0.3446984964,-1.6533735816,0.0181114661,,, +11.6621093750,11,-1.1984237393,0.1821809566,-2.2094025946,0.2634444798,,, +11.6640625000,11,-1.5211903095,0.6470331863,-2.9167564976,0.4943276557,,, +11.6660156250,11,-1.8671195615,1.0270561652,-3.6937140425,0.6829462265,,, +11.6679687500,11,-2.1673723406,1.3056793539,-4.4461086632,0.8035265628,,, +11.6699218750,11,-2.3536091653,1.4743363748,-5.0760165059,0.8350959094,,, +11.6718750000,11,-2.3664323251,1.5326263103,-5.4915843480,0.7642561784,,, +11.6738281250,11,-2.1633283542,1.4880761350,-5.6177553004,0.5872644469,,, +11.6757812500,11,-1.7222681051,1.3547574294,-5.4033751035,0.3098786871,,, +11.6777343750,11,-1.0416843499,1.1519777285,-4.8232449772,-0.0536986124,,, +11.6796875000,11,-0.1403844315,0.9030293823,-3.8792164097,-0.4816899881,,, +11.6816406250,11,0.9419715193,0.6322358433,-2.6012811830,-0.9461234768,,, +11.6835937500,11,2.1463878629,0.3624664034,-1.0451066887,-1.4143168550,,, +11.6855468750,11,3.3997572921,0.1157769743,0.7139453308,-1.8502209503,,, +11.6875000000,11,4.6219112462,-0.0852261427,2.5863084391,-2.2166752327,,, +11.6894531250,11,5.7328267859,-0.2188325181,4.4723620597,-2.4794920335,,, +11.6914062500,11,6.6605391254,-0.2689245119,6.2671718328,-2.6133945469,,, +11.6933593750,11,7.3480581590,-0.2305975726,7.8658644591,-2.6076058248,,, +11.6953125000,11,7.7577392653,-0.1129642901,9.1706514998,-2.4681248099,,, +11.6972656250,11,7.8745273207,0.0638432978,10.1010591844,-2.2157941076,,, +11.6992187500,11,7.7072411773,0.2766598035,10.6036108597,-1.8809383883,,, +11.7011718750,11,7.2859128358,0.5070511117,10.6567912769,-1.4967763360,,, +11.7031250000,11,6.6560530710,0.7441106349,10.2720243311,-1.0942043947,,, +11.7050781250,11,5.8714816198,0.9834389457,9.4912929025,-0.6983333398,,, +11.7070312500,11,4.9875003664,1.2265692295,8.3812816549,-0.3259260419,,, +11.7089843750,11,4.0562522236,1.4811896520,7.0262161452,0.0158406008,,, +11.7109375000,11,3.1238635271,1.7583417913,5.5202515170,0.3279494155,,, +11.7128906250,11,2.2277189448,2.0645737497,3.9580628411,0.6151663354,,, +11.7148437500,11,1.3947287126,2.3936602418,2.4258711991,0.8808905807,,, +11.7167968750,11,0.6419731334,2.7252569198,0.9963351898,1.1246991774,,, +11.7187500000,11,-0.0224810221,3.0313325069,-0.2741143241,1.3440266174,,, +11.7207031250,11,-0.5998730478,3.2837964462,-1.3470924811,1.5373201638,,, +11.7226562500,11,-1.1004311230,3.4580217265,-2.2027690255,1.7052376350,,, +11.7246093750,11,-1.5421138831,3.5342178918,-2.8400936858,1.8503609056,,, +11.7265625000,11,-1.9479629386,3.5001197597,-3.2764423552,1.9768870077,,, +11.7285156250,11,-2.3412097492,3.3531201655,-3.5443287813,2.0894571311,,, +11.7304687500,11,-2.7400236916,3.0987765702,-3.6855747284,2.1907064539,,, +11.7324218750,11,-3.1537796724,2.7462456059,-3.7458073091,2.2782217421,,, +11.7343750000,11,-3.5803939164,2.3039607113,-3.7693691782,2.3421842350,,, +11.7363281250,11,-4.0048414953,1.7788576715,-3.7925667931,2.3658994517,,, +11.7382812500,11,-4.4006956106,1.1787841595,-3.8374307815,2.3296287626,,, +11.7402343750,11,-4.7349500511,0.5155934719,-3.9098271097,2.2156666483,,, +11.7421875000,11,-4.9736270584,-0.1916211288,-4.0007707997,2.0131481293,,, +11.7441406250,11,-5.0871629459,-0.9133096540,-4.0891831828,1.7223856787,,, +11.7460937500,11,-5.0565177914,-1.6083241861,-4.1475661822,1.3579341428,,, +11.7480468750,11,-4.8773857416,-2.2278543428,-4.1491078898,0.9475834981,,, +11.7500000000,11,-4.5583452936,-2.7247391144,-4.0712643661,0.5257671003,,, +11.7519531250,11,-4.1152045996,-3.0638611291,-3.8960542665,0.1248326704,,, +11.7539062500,11,-3.5674152957,-3.2295810492,-3.6118065439,-0.2314016126,,, +11.7558593750,11,-2.9375336295,-3.2294810455,-3.2166406517,-0.5308965115,,, +11.7578125000,11,-2.2509537566,-3.0939596005,-2.7202621381,-0.7740161830,,, +11.7597656250,11,-1.5352571996,-2.8701574465,-2.1431530622,-0.9708804954,,, +11.7617187500,11,-0.8202210656,-2.6111415743,-1.5141965259,-1.1354904024,,, +11.7636718750,11,-0.1378215683,-2.3650187511,-0.8675693551,-1.2796031246,,, +11.7656250000,11,0.4790731462,-2.1672567831,-0.2400616786,-1.4091577446,,, +11.7675781250,11,0.9988568587,-2.0367993497,0.3310889286,-1.5232147766,,, +11.7695312500,11,1.3936357808,-1.9762309074,0.8117839897,-1.6145668306,,, +11.7714843750,11,1.6426716043,-1.9742154041,1.1756200926,-1.6717737145,,, +11.7734375000,11,1.7364526663,-2.0081476547,1.4059805674,-1.6824550518,,, +11.7753906250,11,1.6792641318,-2.0484298318,1.4957281221,-1.6371633647,,, +11.7773437500,11,1.4879903346,-2.0650606321,1.4467502541,-1.5319888391,,, +11.7792968750,11,1.1873124231,-2.0326311681,1.2692692923,-1.3680442322,,, +11.7812500000,11,0.8057600270,-1.9310419562,0.9819469515,-1.1491710420,,, +11.7832031250,11,0.3757501507,-1.7441590970,0.6134854799,-0.8808611526,,, +11.7851562500,11,-0.0658832164,-1.4594923380,0.2026267562,-0.5704465935,,, +11.7871093750,11,-0.4807955912,-1.0713268843,-0.2054136409,-0.2276593606,,, +11.7890625000,11,-0.8345945164,-0.5869354789,-0.5658963465,0.1340466104,,, +11.7910156250,11,-1.1018933407,-0.0305601045,-0.8433101741,0.4964158363,,, +11.7929687500,11,-1.2683881818,0.5577773779,-1.0169931766,0.8367114694,,, +11.7949218750,11,-1.3294253700,1.1264067914,-1.0809218615,1.1288073283,,, +11.7968750000,11,-1.2868890303,1.6183495017,-1.0401625094,1.3451777673,,, +11.7988281250,11,-1.1468132582,1.9799152516,-0.9069045273,1.4605580462,,, +11.8007812500,11,-0.9194549150,2.1687339810,-0.6981154873,1.4565029309,,, +11.8027343750,11,-0.6209063622,2.1587326849,-0.4349951491,1.3250004900,,, +11.8046875000,11,-0.2729580888,1.9429438356,-0.1417774299,1.0700937540,,, +11.8066406250,11,0.0998094800,1.5360037955,0.1576494714,0.7081785174,,, +11.8085937500,11,0.4742313606,0.9751839717,0.4447869270,0.2672354486,,, +11.8105468750,11,0.8324994366,0.3173114581,0.7106378620,-0.2160505919,,, +11.8125000000,11,1.1633351476,-0.3680761593,0.9542987296,-0.7008027082,,, +11.8144531250,11,1.4603404941,-1.0076870724,1.1768220372,-1.1469986617,,, +11.8164062500,11,1.7211538230,-1.5346982962,1.3775749338,-1.5209450853,,, +11.8183593750,11,1.9475115453,-1.8971336289,1.5551381550,-1.7991158070,,, +11.8203125000,11,2.1434387504,-2.0614511905,1.7086852327,-1.9682230011,,, +11.8222656250,11,2.3127720246,-2.0127025954,1.8388280821,-2.0233413607,,, +11.8242187500,11,2.4583953695,-1.7530415602,1.9485644364,-1.9664173195,,, +11.8261718750,11,2.5820707460,-1.2990892229,2.0423980998,-1.8051793838,,, +11.8281250000,11,2.6840036685,-0.6795811757,2.1241649293,-1.5523623598,,, +11.8300781250,11,2.7632044379,0.0655493347,2.1968061967,-1.2255807061,,, +11.8320312500,11,2.8175633447,0.8856198950,2.2624704001,-0.8471284898,,, +11.8339843750,11,2.8420433596,1.7218803455,2.3195201414,-0.4423197088,,, +11.8359375000,11,2.8270633950,2.5138158167,2.3590321184,-0.0363722163,,, +11.8378906250,11,2.7596713228,3.2066844376,2.3650820114,0.3484872743,,, +11.8398437500,11,2.6267927546,3.7561401667,2.3187518957,0.6941890045,,, +11.8417968750,11,2.4184607584,4.1290114887,2.2036677386,0.9866212104,,, +11.8437500000,11,2.1302055650,4.3040753297,2.0110094548,1.2158700945,,, +11.8457031250,11,1.7647868714,4.2753755418,1.7417660933,1.3773208508,,, +11.8476562500,11,1.3331678341,4.0551732569,1.4058782300,1.4721579712,,, +11.8496093750,11,0.8543594163,3.6719814703,1.0205801310,1.5060152275,,, +11.8515625000,11,0.3539379025,3.1624255024,0.6088948348,1.4855931113,,, +11.8535156250,11,-0.1384465634,2.5612818121,0.1970366000,1.4147606672,,, +11.8554687500,11,-0.5915244565,1.8963509381,-0.1883682306,1.2929382978,,, +11.8574218750,11,-0.9747097498,1.1899788591,-0.5212180013,1.1171996615,,, +11.8593750000,11,-1.2619475984,0.4632136627,-0.7769974901,0.8867294778,,, +11.8613281250,11,-1.4373473341,-0.2618565418,-0.9364127160,0.6068748681,,, +11.8632812500,11,-1.4995434176,-0.9620359645,-0.9889285103,0.2912258479,,, +11.8652343750,11,-1.4626229363,-1.6132687986,-0.9339381960,-0.0381686163,,, +11.8671875000,11,-1.3545797431,-2.1917516225,-0.7817990364,-0.3527624828,,, +11.8691406250,11,-1.2135098054,-2.6767110574,-0.5545541083,-0.6218425035,,, +11.8710937500,11,-1.0807519160,-3.0520651169,-0.2834741924,-0.8175126749,,, +11.8730468750,11,-0.9931658356,-3.3050960917,-0.0053292776,-0.9184341334,,, +11.8750000000,11,-0.9783064635,-3.4241435680,0.2392495715,-0.9116724438,,, +11.8769531250,11,-1.0530347320,-3.3995962049,0.4073012141,-0.7937389887,,, +11.8789062500,11,-1.2233159330,-3.2304437081,0.4582147314,-0.5725150582,,, +11.8808593750,11,-1.4843728621,-2.9297940463,0.3601102219,-0.2678615273,,, +11.8828125000,11,-1.8217894667,-2.5210623864,0.0947967188,0.0926058343,,, +11.8847656250,11,-2.2127756482,-2.0287869541,-0.3390134659,0.4799572205,,, +11.8867187500,11,-2.6269259827,-1.4743211773,-0.9243790279,0.8670439440,,, +11.8886718750,11,-3.0275421033,-0.8790586637,-1.6275082944,1.2274523414,,, +11.8906250000,11,-3.3741450184,-0.2695135094,-2.4010573092,1.5337915837,,, +11.8925781250,11,-3.6260348024,0.3214231602,-3.1891408101,1.7580624398,,, +11.8945312500,11,-3.7465527959,0.8571379598,-3.9340390073,1.8739128393,,, +11.8964843750,11,-3.7068483483,1.3009074164,-4.5820088097,1.8592926821,,, +11.8984375000,11,-3.4884317079,1.6193270891,-5.0863352753,1.6990276386,,, +11.9003906250,11,-3.0851711066,1.7863317655,-5.4089616322,1.3877467186,,, +11.9023437500,11,-2.5048392672,1.7880557385,-5.5214361488,0.9331235349,,, +11.9042968750,11,-1.7689284959,1.6270824505,-5.4042294171,0.3580911337,,, +11.9062500000,11,-0.9109633715,1.3235550847,-5.0464523975,-0.2996986190,,, +11.9082031250,11,0.0241927144,0.9130576280,-4.4495911957,-0.9905822992,,, +11.9101562500,11,0.9801676920,0.4433837757,-3.6334302167,-1.6562453323,,, +11.9121093750,11,1.8912683726,-0.0299615122,-2.6391490692,-2.2345389992,,, +11.9140625000,11,2.6883834617,-0.4495457015,-1.5270006585,-2.6659078207,,, +11.9160156250,11,3.3078972907,-0.7632216989,-0.3677952975,-2.9007373156,,, +11.9179687500,11,3.7016431471,-0.9351124215,0.7682419163,-2.9084871252,,, +11.9199218750,11,3.8441327718,-0.9555884273,1.8184936486,-2.6856729504,,, +11.9218750000,11,3.7348215324,-0.8410847961,2.7308319272,-2.2565465078,,, +11.9238281250,11,3.3961137004,-0.6248752895,3.4666110780,-1.6661583819,,, +11.9257812500,11,2.8689252292,-0.3465364437,4.0032374837,-0.9711062796,,, +11.9277343750,11,2.2082827329,-0.0439788206,4.3349644787,-0.2321303919,,, +11.9296875000,11,1.4795676399,0.2509409385,4.4724775077,0.4906663963,,, +11.9316406250,11,0.7529497922,0.5122828653,4.4395991302,1.1407594775,,, +11.9335937500,11,0.0955169542,0.7171430909,4.2666961540,1.6674176821,,, +11.9355468750,11,-0.4356718445,0.8442099956,3.9851674880,2.0283100948,,, +11.9375000000,11,-0.7979129213,0.8753681673,3.6257105354,2.1929289393,,, +11.9394531250,11,-0.9660188777,0.7996910373,3.2179677685,2.1467960116,,, +11.9414062500,11,-0.9345297445,0.6178665552,2.7899669810,1.8951272289,,, +11.9433593750,11,-0.7175969918,0.3432614581,2.3682009657,1.4633317270,,, +11.9453125000,11,-0.3470954515,-0.0004626512,1.9771267156,0.8943109643,,, +11.9472656250,11,0.1302623093,-0.3811925321,1.6367758170,0.2446761563,,, +11.9492187500,11,0.6577563129,-0.7596462579,1.3604353033,-0.4201725056,,, +11.9511718750,11,1.1748623373,-1.0933573670,1.1536310326,-1.0329048066,,, +11.9531250000,11,1.6230966656,-1.3429574782,1.0134787054,-1.5318880656,,, +11.9550781250,11,1.9518224769,-1.4780449593,0.9290216232,-1.8682718704,,, +11.9570312500,11,2.1245499921,-1.4811225278,0.8841870782,-2.0116377149,,, +11.9589843750,11,2.1237039687,-1.3476029787,0.8621602420,-1.9521160559,,, +11.9609375000,11,1.9513513214,-1.0822142665,0.8484289941,-1.6981743508,,, +11.9628906250,11,1.6259624680,-0.6971135902,0.8320875766,-1.2728917090,,, +11.9648437500,11,1.1771881736,-0.2138740734,0.8055607071,-0.7111992985,,, +11.9667968750,11,0.6413653476,0.3350407419,0.7626713012,-0.0579361263,,, +11.9687500000,11,0.0597115089,0.9077829182,0.6970864736,0.6337199414,,, +11.9707031250,11,-0.5227653710,1.4556386906,0.6015927516,1.3040679244,,, +11.9726562500,11,-1.0607379096,1.9259991847,0.4663050776,1.8903342970,,, +11.9746093750,11,-1.5134491940,2.2676644696,0.2773684326,2.3324917421,,, +11.9765625000,11,-1.8490964567,2.4378157524,0.0187056611,2.5805288762,,, +11.9785156250,11,-2.0484704693,2.4070095196,-0.3242597451,2.6008377074,,, +11.9804687500,11,-2.1067020545,2.1622691232,-0.7600346834,2.3805393906,,, +11.9824218750,11,-2.0324988169,1.7110583694,-1.2860226604,1.9305472841,,, +11.9843750000,11,-1.8462338689,1.0842158153,-1.8855233713,1.2866023668,,, +11.9863281250,11,-1.5766063196,0.3344070880,-2.5281453987,0.5059133626,,, +11.9882812500,11,-1.2552730849,-0.4688202652,-3.1720099221,-0.3399771304,,, +11.9902343750,11,-0.9123715620,-1.2449583287,-3.7675442399,-1.1726771962,,, +11.9921875000,11,-0.5746070559,-1.9105279814,-4.2629562427,-1.9141139601,,, +11.9941406250,11,-0.2638850849,-2.3906923776,-4.6092236399,-2.4949425805,,, +11.9960937500,11,0.0041519042,-2.6316290343,-4.7640078479,-2.8630529661,,, +11.9980468750,11,0.2212526802,-2.6096573529,-4.6947883517,-2.9899637118,,, +12.0000000000,12,0.3869006882,-2.3337704147,-4.3809816285,-2.8730356141,33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000:10.0000000000:11.0000000000:12.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +12.0019531250,12,0.5060721993,-1.8391427997,-3.8167390345,-2.5315055610,,, +12.0039062500,12,0.5847968249,-1.1772869149,-3.0151772849,-1.9996867254,,, +12.0058593750,12,0.6257835466,-0.4106996868,-2.0122970312,-1.3223586236,,, +12.0078125000,12,0.6259280315,0.3904819240,-0.8677648853,-0.5515173485,,, +12.0097656250,12,0.5779030733,1.1534770481,0.3396663144,0.2564268938,,, +12.0117187500,12,0.4749986994,1.8072159967,1.5196639355,1.0416879514,,, +12.0136718750,12,0.3145281324,2.2872800989,2.5777239167,1.7434592860,,, +12.0156250000,12,0.0975532333,2.5441700287,3.4240226345,2.3071098815,,, +12.0175781250,12,-0.1724629964,2.5509493555,3.9837634089,2.6923472741,,, +12.0195312500,12,-0.4891193123,2.3063491585,4.2059056250,2.8772051491,,, +12.0214843750,12,-0.8415803484,1.8339397628,4.0688846428,2.8583871250,,, +12.0234375000,12,-1.2144565289,1.1781569932,3.5834919314,2.6501382667,,, +12.0253906250,12,-1.5886556503,0.3991227001,2.7924292109,2.2821507672,,, +12.0273437500,12,-1.9418713572,-0.4317737400,1.7656226206,1.7961964623,,, +12.0292968750,12,-2.2488858532,-1.2376661202,0.5922890573,1.2408834047,,, +12.0312500000,12,-2.4826497394,-1.9451932002,-0.6279186947,0.6651059330,,, +12.0332031250,12,-2.6167721437,-2.4934543476,-1.7937780483,0.1125504196,,, +12.0351562500,12,-2.6279236020,-2.8390863254,-2.8098268283,-0.3814345745,,, +12.0371093750,12,-2.4964752568,-2.9579285750,-3.5907651269,-0.7916223337,,, +12.0390625000,12,-2.2075106111,-2.8454928099,-4.0662565814,-1.1039528961,,, +12.0410156250,12,-1.7546362214,-2.5154978128,-4.1888787690,-1.3145757066,,, +12.0429687500,12,-1.1448097464,-1.9950795747,-3.9411564179,-1.4261923825,,, +12.0449218750,12,-0.4007592488,-1.3201714790,-3.3374619009,-1.4445898298,,, +12.0468750000,12,0.4402962086,-0.5353119423,-2.4217986823,-1.3787564659,,, +12.0488281250,12,1.3303686470,0.3047828206,-1.2630456273,-1.2428485674,,, +12.0507812500,12,2.2146673679,1.1368108481,0.0511542282,-1.0563283397,,, +12.0527343750,12,3.0351367888,1.8940344873,1.4199031543,-0.8422220342,,, +12.0546875000,12,3.7355034898,2.5135606621,2.7357533902,-0.6250535633,,, +12.0566406250,12,4.2680645371,2.9440223302,3.8949081450,-0.4287348644,,, +12.0585937500,12,4.5982437947,3.1511435725,4.8069135933,-0.2740291358,,, +12.0605468750,12,4.7053043360,3.1208156056,5.4009516805,-0.1755195459,,, +12.0625000000,12,4.5822583018,2.8608033888,5.6321209713,-0.1386716482,,, +12.0644531250,12,4.2364279170,2.4007165675,5.4884457651,-0.1580024232,,, +12.0664062500,12,3.6892193435,1.7894043070,4.9933369666,-0.2174238408,,, +12.0683593750,12,2.9744423789,1.0895849780,4.2004358500,-0.2933566466,,, +12.0703125000,12,2.1359152343,0.3699951822,3.1840975753,-0.3599552128,,, +12.0722656250,12,1.2239339161,-0.3036391928,2.0285246414,-0.3945045205,,, +12.0742187500,12,0.2901619877,-0.8773057182,0.8165241203,-0.3815989173,,, +12.0761718750,12,-0.6164524535,-1.3147080307,-0.3776336131,-0.3154019316,,, +12.0781250000,12,-1.4516703429,-1.5969676560,-1.4889935591,-0.1982651309,,, +12.0800781250,12,-2.1781424659,-1.7186400113,-2.4612227914,-0.0369109260,,, +12.0820312500,12,-2.7668573967,-1.6878649211,-3.2466467394,0.1585670448,,, +12.0839843750,12,-3.1959073831,-1.5292545280,-3.8053185410,0.3726902974,,, +12.0859375000,12,-3.4493623739,-1.2813015779,-4.1052059033,0.5850014822,,, +12.0878906250,12,-3.5187109186,-0.9882790170,-4.1256587727,0.7740100281,,, +12.0898437500,12,-3.4048629506,-0.6931436352,-3.8618808073,0.9207245023,,, +12.0917968750,12,-3.1183777986,-0.4341443879,-3.3279714748,1.0095094987,,, +12.0937500000,12,-2.6782633113,-0.2431235392,-2.5580741443,1.0276660248,,, +12.0957031250,12,-2.1109237800,-0.1439635243,-1.6049658752,0.9658756028,,, +12.0976562500,12,-1.4495528995,-0.1510144206,-0.5359910287,0.8198381827,,, +12.0996093750,12,-0.7334532147,-0.2669859313,0.5717860031,0.5923669144,,, +12.1015625000,12,-0.0072546156,-0.4805541533,1.6371476857,0.2957769242,,, +12.1035156250,12,0.6808407097,-0.7648161685,2.5827869379,-0.0460582152,,, +12.1054687500,12,1.2827289974,-1.0781024949,3.3431851802,-0.3982879972,,, +12.1074218750,12,1.7554208634,-1.3687155614,3.8685626724,-0.7198572536,,, +12.1093750000,12,2.0666508759,-1.5823827668,4.1268987965,-0.9706638197,,, +12.1113281250,12,2.1995252259,-1.6694835283,4.1059072938,-1.1179007645,,, +12.1132812500,12,2.1535448456,-1.5927362804,3.8126709735,-1.1406971243,,, +12.1152343750,12,1.9426778011,-1.3377414507,3.2708373365,-1.0347525350,,, +12.1171875000,12,1.5937514439,-0.9211434970,2.5183636771,-0.8158464291,,, +12.1191406250,12,1.1440564492,-0.3864632091,1.6059168280,-0.5165141670,,, +12.1210937500,12,0.6359667139,0.2102935517,0.5941627556,-0.1758895814,,, +12.1230468750,12,0.1121702561,0.8135026309,-0.4489316114,0.1692403908,,, +12.1250000000,12,-0.3855211002,1.3758316406,-1.4500015173,0.4885574174,,, +12.1269531250,12,-0.8174334035,1.8623011706,-2.3347769613,0.7596627902,,, +12.1289062500,12,-1.1508513465,2.2481296203,-3.0371882728,0.9676361560,,, +12.1308593750,12,-1.3652659503,2.5136243517,-3.5089053293,1.1033405132,,, +12.1328125000,12,-1.4537352510,2.6427991173,-3.7250213857,1.1619256313,,, +12.1347656250,12,-1.4212482323,2.6254519974,-3.6861879099,1.1419463991,,, +12.1367187500,12,-1.2823358230,2.4600915322,-3.4174898449,1.0453817875,,, +12.1386718750,12,-1.0585195881,2.1572562099,-2.9641192016,0.8787499756,,, +12.1406250000,12,-0.7760608978,1.7417775451,-2.3855806082,0.6543995698,,, +12.1425781250,12,-0.4635524806,1.2519952539,-1.7482538213,0.3907327023,,, +12.1445312500,12,-0.1485448950,0.7362353882,-1.1162402781,0.1109404541,,, +12.1464843750,12,0.1456891748,0.2482988224,-0.5443150561,-0.1593177737,,, +12.1484375000,12,0.4015754923,-0.1584350374,-0.0752440211,-0.3949675174,,, +12.1503906250,12,0.6071636236,-0.4396513995,0.2610680481,-0.5753784563,,, +12.1523437500,12,0.7561012135,-0.5688177377,0.4485250950,-0.6882496718,,, +12.1542968750,12,0.8488478438,-0.5417085140,0.4860117436,-0.7322939803,,, +12.1562500000,12,0.8948566446,-0.3765470880,0.3894088422,-0.7182390774,,, +12.1582031250,12,0.9128607179,-0.1114726085,0.1923025183,-0.6675628676,,, +12.1601562500,12,0.9266796685,0.2009791964,-0.0587352190,-0.6082384800,,, +12.1621093750,12,0.9583258822,0.5032500851,-0.3126379896,-0.5678495885,,, +12.1640625000,12,1.0227830862,0.7440450807,-0.5201814999,-0.5663333153,,, +12.1660156250,12,1.1258154165,0.8877643726,-0.6377840620,-0.6110463712,,, +12.1679687500,12,1.2625243437,0.9197643590,-0.6334053997,-0.6950751120,,, +12.1699218750,12,1.4160982915,0.8451200206,-0.4941310899,-0.7993655030,,, +12.1718750000,12,1.5589076175,0.6802191863,-0.2294971083,-0.8986616417,,, +12.1738281250,12,1.6573019865,0.4424117635,0.1314825900,-0.9690732903,,, +12.1757812500,12,1.6796531787,0.1435113868,0.5470110413,-0.9949777739,,, +12.1777343750,12,1.6041127123,-0.2109314083,0.9707612473,-0.9724366413,,, +12.1796875000,12,1.4215735377,-0.6167287688,1.3591457451,-0.9066905484,,, +12.1816406250,12,1.1346325204,-1.0634772513,1.6762625028,-0.8061745127,,, +12.1835937500,12,0.7560010199,-1.5294364227,1.8973840480,-0.6777908094,,, +12.1855468750,12,0.3065161010,-1.9818704714,2.0100349780,-0.5252880556,,, +12.1875000000,12,-0.1876265346,-2.3822313665,2.0122503917,-0.3502727078,,, +12.1894531250,12,-0.6972033356,-2.6943005790,1.9106285545,-0.1549947336,,, +12.1914062500,12,-1.1916370942,-2.8930880774,1.7186561828,0.0541304255,,, +12.1933593750,12,-1.6406421279,-2.9711354700,1.4538438317,0.2638450321,,, +12.1953125000,12,-2.0154859531,-2.9396983043,1.1355804659,0.4537557692,,, +12.1972656250,12,-2.2899211464,-2.8251173807,0.7854212614,0.5988524306,,, +12.1992187500,12,-2.4417544902,-2.6611193556,0.4274234945,0.6744307781,,, +12.2011718750,12,-2.4548583646,-2.4786194453,0.0873884324,0.6621620146,,, +12.2031250000,12,-2.3215846051,-2.2979205529,-0.2086302396,0.5550776064,,, +12.2050781250,12,-2.0463386637,-2.1257808902,-0.4382316622,0.3603315316,,, +12.2070312500,12,-1.6492161086,-1.9554904177,-0.5888894134,0.0998543179,,, +12.2089843750,12,-1.1671369863,-1.7700436238,-0.6622562749,-0.1916766496,,, +12.2109375000,12,-0.6507566124,-1.5481424294,-0.6731662703,-0.4716187193,,, +12.2128906250,12,-0.1577279080,-1.2690165175,-0.6452078638,-0.6951854895,,, +12.2148437500,12,0.2552461625,-0.9142263074,-0.6061413390,-0.8206937263,,, +12.2167968750,12,0.5400416621,-0.4702000671,-0.5831749854,-0.8148804746,,, +12.2187500000,12,0.6637089541,0.0659376164,-0.5982130850,-0.6589982560,,, +12.2207031250,12,0.6115605035,0.6830108848,-0.6649716030,-0.3517636808,,, +12.2226562500,12,0.3853287780,1.3605369470,-0.7880504379,0.0944927683,,, +12.2246093750,12,-0.0007990704,2.0760147223,-0.9631616351,0.6600700630,,, +12.2265625000,12,-0.5233974530,2.8072148363,-1.1793353034,1.3206476824,,, +12.2285156250,12,-1.1516983526,3.5301379657,-1.4221977078,2.0467220706,,, +12.2304687500,12,-1.8481902064,4.2162415974,-1.6756157384,2.8022657975,,, +12.2324218750,12,-2.5690228724,4.8311583484,-1.9225076885,3.5442019031,,, +12.2343750000,12,-3.2653688719,5.3355191563,-2.1468246282,4.2231951520,,, +12.2363281250,12,-3.8853186578,5.6864259781,-2.3350284892,4.7852967366,,, +12.2382812500,12,-4.3760965656,5.8399143577,-2.4752089619,5.1750300582,,, +12.2402343750,12,-4.6872097407,5.7571524304,-2.5548285309,5.3413156585,,, +12.2421875000,12,-4.7741653123,5.4133836923,-2.5578334667,5.2452406952,,, +12.2441406250,12,-4.6018686131,4.8050235533,-2.4619323855,4.8666426977,,, +12.2460937500,12,-4.1479218219,3.9521040751,-2.2396453907,4.2072685859,,, +12.2480468750,12,-3.4064942386,2.8958801896,-1.8652197206,3.2902759901,,, +12.2500000000,12,-2.3928274599,1.6938145034,-1.3244146732,2.1581021652,,, +12.2519531250,12,-1.1466408212,0.4150245682,-0.6231127553,0.8701321299,,, +12.2539062500,12,0.2691928356,-0.8642553138,0.2081864648,-0.5017872579,,, +12.2558593750,12,1.7755931928,-2.0673758510,1.1165528230,-1.8808529832,,, +12.2578125000,12,3.2858728173,-3.1251731956,2.0349179625,-3.1926532520,,, +12.2597656250,12,4.7128764051,-3.9822273108,2.8922303582,-4.3700889067,,, +12.2617187500,12,5.9748730486,-4.5993309531,3.6224196258,-5.3559976324,,, +12.2636718750,12,7.0004532916,-4.9526108229,4.1717912225,-6.1039942077,,, +12.2656250000,12,7.7323306748,-5.0323973373,4.5037762285,-6.5792179998,,, +12.2675781250,12,8.1302027340,-4.8429044235,4.5998865401,-6.7599482624,,, +12.2695312500,12,8.1726948425,-4.4026745055,4.4591056032,-6.6393860442,,, +12.2714843750,12,7.8588259693,-3.7471287154,4.0977194299,-6.2279137725,,, +12.2734375000,12,7.2087706259,-2.9304555668,3.5474600889,-5.5550742113,,, +12.2753906250,12,6.2632998552,-2.0231027746,2.8516124078,-4.6692337831,,, +12.2773437500,12,5.0825989655,-1.1068225125,2.0623021638,-3.6353215607,,, +12.2792968750,12,3.7435987297,-0.2686750647,1.2383196039,-2.5308221070,,, +12.2812500000,12,2.3338314402,0.4076056485,0.4408448988,-1.4386648587,,, +12.2832031250,12,0.9432284218,0.8524579506,-0.2714964937,-0.4378503319,,, +12.2851562500,12,-0.3436431094,1.0214947446,-0.8470369604,0.4057878071,,, +12.2871093750,12,-1.4537679190,0.9040525517,-1.2457959670,1.0464422600,,, +12.2890625000,12,-2.3296137483,0.5254962358,-1.4436784676,1.4608937283,,, +12.2910156250,12,-2.9316899822,-0.0585275342,-1.4347658952,1.6470419747,,, +12.2929687500,12,-3.2409240669,-0.7730969367,-1.2321212957,1.6204197562,,, +12.2949218750,12,-3.2603169466,-1.5356781533,-0.8675659534,1.4102357538,,, +12.2968750000,12,-3.0151212221,-2.2658403031,-0.3893614436,1.0558908256,,, +12.2988281250,12,-2.5514742901,-2.8922488855,0.1425739439,0.6043708122,,, +12.3007812500,12,-1.9330417896,-3.3561265581,0.6630895541,0.1082774590,,, +12.3027343750,12,-1.2348598759,-3.6114403568,1.1097229996,-0.3762909663,,, +12.3046875000,12,-0.5350455003,-3.6234771866,1.4306458798,-0.7927314299,,, +12.3066406250,12,0.0930815954,-3.3671023736,1.5897881290,-1.0873741880,,, +12.3085937500,12,0.5868181722,-2.8259080962,1.5689811130,-1.2127222668,,, +12.3105468750,12,0.8983030480,-1.9925733345,1.3685784746,-1.1305188974,,, +12.3125000000,12,0.9973259482,-0.8701124204,1.0060098516,-0.8147978779,,, +12.3144531250,12,0.8722667499,0.5216259383,0.5119746100,-0.2566045850,,, +12.3164062500,12,0.5291954094,2.1308672298,-0.0741804667,0.5285993320,,, +12.3183593750,12,-0.0109376257,3.8632465893,-0.7095121137,1.4967925435,,, +12.3203125000,12,-0.7152364692,5.5909680790,-1.3519798769,2.5802866390,,, +12.3222656250,12,-1.5386224570,7.1736610453,-1.9610974048,3.6966035412,,, +12.3242187500,12,-2.4220675877,8.4754791570,-2.4951987553,4.7555689416,,, +12.3261718750,12,-3.2948737462,9.3780258225,-2.9110871466,5.6667876571,,, +12.3281250000,12,-4.0811636918,9.7923365630,-3.1681830339,6.3483931481,,, +12.3300781250,12,-4.7059870761,9.6680198453,-3.2334150164,6.7339829938,,, +12.3320312500,12,-5.1005292523,8.9978218529,-3.0856560086,6.7769691992,,, +12.3339843750,12,-5.2086117222,7.8164559373,-2.7207513521,6.4531621126,,, +12.3359375000,12,-4.9934355635,6.1933451663,-2.1548537874,5.7614158906,,, +12.3378906250,12,-4.4427659507,4.2229939392,-1.4242267071,4.7232296565,,, +12.3398437500,12,-3.5721100863,2.0181810813,-0.5824487770,3.3829392480,,, +12.3417968750,12,-2.4250625341,-0.2937734936,0.3047867061,1.8079055261,,, +12.3437500000,12,-1.0708535990,-2.5762861769,1.1666628486,0.0865267620,,, +12.3457031250,12,0.3998856756,-4.6925717003,1.9338005958,-1.6767976278,,, +12.3476562500,12,1.8814428653,-6.5156491151,2.5433703380,-3.3690414739,,, +12.3496093750,12,3.2618406321,-7.9376639937,2.9428799469,-4.8778483226,,, +12.3515625000,12,4.4333074206,-8.8792381320,3.0929633013,-6.1023441111,,, +12.3535156250,12,5.3030375403,-9.2966080006,2.9699051802,-6.9632612449,,, +12.3554687500,12,5.8016849749,-9.1834355076,2.5680954890,-7.4091215474,,, +12.3574218750,12,5.8880883455,-8.5682027036,1.9018724200,-7.4179707109,,, +12.3593750000,12,5.5520624488,-7.5102601104,1.0057636268,-6.9976239929,,, +12.3613281250,12,4.8153652481,-6.0956967057,-0.0676752799,-6.1852122605,,, +12.3632812500,12,3.7284036154,-4.4325635007,-1.2515739936,-5.0437770662,,, +12.3652343750,12,2.3642448852,-2.6447239402,-2.4685732675,-3.6563491562,,, +12.3671875000,12,0.8136143448,-0.8631914119,-3.6348037984,-2.1197654353,,, +12.3691406250,12,-0.8197213777,0.7849771848,-4.6645931856,-0.5379921729,,, +12.3710937500,12,-2.4246556692,2.1873808906,-5.4756662617,0.9850019169,,, +12.3730468750,12,-3.8887394711,3.2531701303,-5.9954345716,2.3506527335,,, +12.3750000000,12,-5.1057477105,3.9159975789,-6.1699358068,3.4698891882,,, +12.3769531250,12,-5.9864483268,4.1362989313,-5.9732028274,4.2691109753,,, +12.3789062500,12,-6.4694132247,3.9062448922,-5.4114232710,4.6988300452,,, +12.3808593750,12,-6.5266774042,3.2563152686,-4.5199868182,4.7413350224,,, +12.3828125000,12,-6.1632498304,2.2575059386,-3.3570615284,4.4130570764,,, +12.3847656250,12,-5.4146819811,1.0154413962,-1.9988253318,3.7616166214,,, +12.3867187500,12,-4.3451651301,-0.3419217539,-0.5372245082,2.8598575506,,, +12.3886718750,12,-3.0430832606,-1.6799519944,0.9245560521,1.7973970635,,, +12.3906250000,12,-1.6127014311,-2.8720331756,2.2809910123,0.6711329822,,, +12.3925781250,12,-0.1656303123,-3.8091062249,3.4329524427,-0.4222874280,,, +12.3945312500,12,1.1871699112,-4.4057938426,4.2943045677,-1.3928049441,,, +12.3964843750,12,2.3461806316,-4.6073063916,4.8004317848,-2.1650613621,,, +12.3984375000,12,3.2360016110,-4.3950310321,4.9196995404,-2.6864545216,,, +12.4003906250,12,3.8139263418,-3.7856533524,4.6617083633,-2.9304658176,,, +12.4023437500,12,4.0710772357,-2.8245873794,4.0769212883,-2.8947998166,,, +12.4042968750,12,4.0286407737,-1.5782307951,3.2492669967,-2.5976016018,,, +12.4062500000,12,3.7329031266,-0.1272926343,2.2857373249,-2.0741597701,,, +12.4082031250,12,3.2502063996,1.4373655132,1.3044492122,-1.3750622054,,, +12.4101562500,12,2.6614747992,3.0165168622,0.4225250620,-0.5650930820,,, +12.4121093750,12,2.0550260786,4.5062037188,-0.2553680588,0.2800797718,,, +12.4140625000,12,1.5168511713,5.8049247648,-0.6483839029,1.0805853019,,, +12.4160156250,12,1.1207452233,6.8207917903,-0.7083930152,1.7598692058,,, +12.4179687500,12,0.9211783432,7.4780164167,-0.4236652757,2.2514449313,,, +12.4199218750,12,0.9481224813,7.7256449082,0.1809343322,2.5061082934,,, +12.4218750000,12,1.2022933447,7.5472208419,1.0459074676,2.4998161619,,, +12.4238281250,12,1.6530558674,6.9667280828,2.0833521846,2.2393298123,,, +12.4257812500,12,2.2421927799,6.0468321455,3.1878711004,1.7618308837,,, +12.4277343750,12,2.8929581006,4.8769028302,4.2485467576,1.1269170011,,, +12.4296875000,12,3.5213792195,3.5555332659,5.1591802409,0.4043092158,,, +12.4316406250,12,4.0469838651,2.1777731721,5.8270023670,-0.3365091737,,, +12.4335937500,12,4.4012209384,0.8299731971,6.1797259328,-1.0323743746,,, +12.4355468750,12,4.5341036991,-0.4138230354,6.1712167472,-1.6310135466,,, +12.4375000000,12,4.4194729564,-1.4978705356,5.7863407237,-2.0958049347,,, +12.4394531250,12,4.0563908987,-2.3892970861,5.0419381712,-2.4082578475,,, +12.4414062500,12,3.4654848470,-3.0768029212,3.9829570423,-2.5658762467,,, +12.4433593750,12,2.6828342013,-3.5643389098,2.6780616974,-2.5764318133,,, +12.4453125000,12,1.7541540778,-3.8630061093,1.2147807972,-2.4519356162,,, +12.4472656250,12,0.7305954966,-3.9843871963,-0.3087539814,-2.2053786087,,, +12.4492187500,12,-0.3336592023,-3.9391851947,-1.7924395235,-1.8510064259,,, +12.4511718750,12,-1.3834497876,-3.7432100158,-3.1404178947,-1.4070472728,,, +12.4531250000,12,-2.3663781563,-3.4246476438,-4.2683842995,-0.8979971617,,, +12.4550781250,12,-3.2379904167,-3.0240965662,-5.1130506201,-0.3536104778,,, +12.4570312500,12,-3.9658775151,-2.5888529655,-5.6393653074,0.1942167880,,, +12.4589843750,12,-4.5317149310,-2.1670820357,-5.8433405170,0.7143914240,,, +12.4609375000,12,-4.9322377654,-1.8021087899,-5.7512711381,1.1798384448,,, +12.4628906250,12,-5.1790668375,-1.5259102368,-5.4153455354,1.5712248614,,, +12.4648437500,12,-5.2957532711,-1.3538646089,-4.9060393531,1.8790284171,,, +12.4667968750,12,-5.3112770219,-1.2834299251,-4.3025727349,2.1020425277,,, +12.4687500000,12,-5.2523117488,-1.2969100165,-3.6826427898,2.2436419378,,, +12.4707031250,12,-5.1377596310,-1.3663667275,-3.1134797856,2.3084785382,,, +12.4726562500,12,-4.9767105496,-1.4588098530,-2.6464463890,2.3005157180,,, +12.4746093750,12,-4.7689715049,-1.5404875959,-2.3146522474,2.2224446808,,, +12.4765625000,12,-4.5071553224,-1.5801409738,-2.1312906166,2.0764813800,,, +12.4785156250,12,-4.1799138757,-1.5510383994,-2.0891946176,1.8661320669,,, +12.4804687500,12,-3.7761657562,-1.4312236624,-2.1636732031,1.5984199904,,, +12.4824218750,12,-3.2897010215,-1.2043042663,-2.3175587012,1.2855418634,,, +12.4843750000,12,-2.7232002468,-0.8629173180,-2.5060272033,0.9451336205,,, +12.4863281250,12,-2.0901007369,-0.4109833242,-2.6809873699,0.5995279759,,, +12.4882812500,12,-1.4125866811,0.1371259085,-2.7954037106,0.2733551576,,, +12.4902343750,12,-0.7166779092,0.7564557646,-2.8068261342,-0.0111073454,,, +12.4921875000,12,-0.0283526634,1.4114813767,-2.6806865106,-0.2377179085,,, +12.4941406250,12,0.6280442145,2.0595490860,-2.3942864519,-0.3975262265,,, +12.4960937500,12,1.2314989565,2.6548134880,-1.9393294217,-0.4893130481,,, +12.4980468750,12,1.7657207970,3.1511807748,-1.3219288002,-0.5195338176,,, +12.5000000000,12,2.2183827656,3.5067915964,-0.5624384534,-0.5000709762,,, +12.5019531250,12,2.5800064910,3.6903650810,0.3051214646,-0.4449653639,,, +12.5039062500,12,2.8442025229,3.6867544920,1.2363109724,-0.3676891454,,, +12.5058593750,12,3.0078804288,3.4993228843,2.1805197850,-0.2792584495,,, +12.5078125000,12,3.0707542467,3.1495526655,3.0834502784,-0.1873262650,,, +12.5097656250,12,3.0356604197,2.6744988330,3.8889940037,-0.0968306071,,, +12.5117187500,12,2.9100362384,2.1205802570,4.5421493120,-0.0125201018,,, +12.5136718750,12,2.7069444499,1.5349533760,4.9926884986,0.0582367037,,, +12.5156250000,12,2.4448249035,0.9593750766,5.2002290971,0.1049229437,,, +12.5175781250,12,2.1469777449,0.4280116839,5.1410415682,0.1154728681,,, +12.5195312500,12,1.8409387998,-0.0333047026,4.8131365949,0.0779901057,,, +12.5214843750,12,1.5563161959,-0.4072708280,4.2371471965,-0.0173978001,,, +12.5234375000,12,1.3214395696,-0.6841525790,3.4557876709,-0.1758315904,,, +12.5253906250,12,1.1596755586,-0.8598257818,2.5323127001,-0.3947414716,,, +12.5273437500,12,1.0849521801,-0.9343533368,1.5440376368,-0.6619152614,,, +12.5292968750,12,1.0988647817,-0.9127137444,0.5724952332,-0.9564631627,,, +12.5312500000,12,1.1927937532,-0.8070381646,-0.3039494679,-1.2533090956,,, +12.5332031250,12,1.3532180160,-0.6395947633,-1.0153198477,-1.5296736580,,, +12.5351562500,12,1.5653474420,-0.4457059648,-1.5064034110,-1.7705883555,,, +12.5371093750,12,1.8123441314,-0.2720967514,-1.7433327632,-1.9696022674,,, +12.5390625000,12,2.0714630013,-0.1675634486,-1.7180559737,-2.1239898399,,, +12.5410156250,12,2.3126758684,-0.1704855939,-1.4481732272,-2.2294418654,,, +12.5429687500,12,2.5031451747,-0.2992390708,-0.9700906071,-2.2782126486,,, +12.5449218750,12,2.6135447991,-0.5484426337,-0.3296400328,-2.2599260034,,, +12.5468750000,12,2.6222710837,-0.8937699289,0.4232344376,-2.1648705361,,, +12.5488281250,12,2.5184601001,-1.3029072004,1.2363245781,-1.9894144488,,, +12.5507812500,12,2.3047564946,-1.7440316642,2.0582068094,-1.7399941996,,, +12.5527343750,12,1.9982952067,-2.1882525464,2.8415730687,-1.4336457568,,, +12.5546875000,12,1.6278546647,-2.6093882016,3.5429396104,-1.0958489929,,, +12.5566406250,12,1.2280039023,-2.9846801236,4.1209547216,-0.7568671408,,, +12.5585937500,12,0.8332299801,-3.2963042998,4.5381200719,-0.4473478966,,, +12.5605468750,12,0.4731274317,-3.5309919288,4.7648970834,-0.1933858642,,, +12.5625000000,12,0.1684087184,-3.6780443188,4.7823008108,-0.0121249241,,, +12.5644531250,12,-0.0717384962,-3.7278262775,4.5819572881,0.0907001416,,, +12.5664062500,12,-0.2501071136,-3.6702891476,4.1652739567,0.1213081495,,, +12.5683593750,12,-0.3797991636,-3.4925186868,3.5435512652,0.0974124824,,, +12.5703125000,12,-0.4816436133,-3.1768931663,2.7386206564,0.0470030259,,, +12.5722656250,12,-0.5809157995,-2.7053623983,1.7822057487,0.0042161799,,, +12.5742187500,12,-0.7024401503,-2.0725767342,0.7143354027,0.0008732097,,, +12.5761718750,12,-0.8655663491,-1.2980005982,-0.4176043038,0.0585213750,,, +12.5781250000,12,-1.0826927213,-0.4248197818,-1.5606250435,0.1872413299,,, +12.5800781250,12,-1.3621756554,0.4917089402,-2.6614239674,0.3901284395,,, +12.5820312500,12,-1.7119635262,1.3958653123,-3.6733426537,0.6677863108,,, +12.5839843750,12,-2.1404048866,2.2399649024,-4.5605003344,1.0205153855,,, +12.5859375000,12,-2.6544406437,2.9913983847,-5.2988769673,1.4489791556,,, +12.5878906250,12,-3.2562278387,3.6351121302,-5.8764796831,1.9525002091,,, +12.5898437500,12,-3.9383753097,4.1687343759,-6.2921901975,2.5243161452,,, +12.5917968750,12,-4.6804391240,4.5951171980,-6.5543478468,3.1470413415,,, +12.5937500000,12,-5.4491117773,4.9173334228,-6.6810468764,3.7912312899,,, +12.5957031250,12,-6.1995442955,5.1358913612,-6.6982762358,4.4161140765,,, +12.5976562500,12,-6.8754882600,5.2476019545,-6.6320701360,4.9716016543,,, +12.5996093750,12,-7.4113537740,5.2465403809,-6.4995217109,5.4026465779,,, +12.6015625000,12,-7.7395226039,5.1261623278,-6.3052146602,5.6563063260,,, +12.6035156250,12,-7.8007606612,4.8816855696,-6.0423392351,5.6898309558,,, +12.6054687500,12,-7.5531323304,4.5132383148,-5.6953955873,5.4774002981,,, +12.6074218750,12,-6.9773864154,4.0288628011,-5.2446042084,5.0137380124,,, +12.6093750000,12,-6.0787165536,3.4451168660,-4.6714822471,4.3139709459,,, +12.6113281250,12,-4.8853397280,2.7857011487,-3.9635657488,3.4107240032,,, +12.6132812500,12,-3.4456206973,2.0793357851,-3.1185971815,2.3500619897,,, +12.6152343750,12,-1.8254482378,1.3564890066,-2.1490023677,1.1872526675,,, +12.6171875000,12,-0.1056350008,0.6462991485,-1.0844998220,-0.0168154089,,, +12.6191406250,12,1.6222167380,-0.0249519607,0.0295503829,-1.1986813779,,, +12.6210937500,12,3.2626751255,-0.6358167494,1.1376198784,-2.2965421119,,, +12.6230468750,12,4.7255691653,-1.1727767714,2.1819316294,-3.2557232802,,, +12.6250000000,12,5.9340843282,-1.6314634887,3.1104836604,-4.0327834093,,, +12.6269531250,12,6.8295680677,-2.0143130730,3.8812863188,-4.5971142819,,, +12.6289062500,12,7.3751033819,-2.3270087191,4.4635031474,-4.9321422091,,, +12.6308593750,12,7.5603291192,-2.5769467502,4.8402286707,-5.0376519115,,, +12.6328125000,12,7.4048294869,-2.7739421506,5.0118451158,-4.9315389626,,, +12.6347656250,12,6.9564101436,-2.9306450126,4.9957154970,-4.6486603667,,, +12.6367187500,12,6.2851856224,-3.0610874930,4.8233698414,-4.2367537101,,, +12.6386718750,12,5.4762626268,-3.1785526153,4.5378538831,-3.7511315589,,, +12.6406250000,12,4.6216137672,-3.2933887253,4.1904517970,-3.2489465321,,, +12.6425781250,12,3.8110987962,-3.4102803350,3.8362286592,-2.7829918003,,, +12.6445312500,12,3.1241515623,-3.5262677198,3.5297601439,-2.3961810991,,, +12.6464843750,12,2.6232804671,-3.6304543707,3.3207708598,-2.1178943822,,, +12.6484375000,12,2.3489107032,-3.7054042238,3.2483476059,-1.9621857932,,, +12.6503906250,12,2.3151202018,-3.7310571067,3.3342959789,-1.9275875026,,, +12.6523437500,12,2.5069717274,-3.6899854528,3.5767773783,-1.9983445103,,, +12.6542968750,12,2.8811087290,-3.5710948633,3.9459100366,-2.1470393357,,, +12.6562500000,12,3.3708413560,-3.3713319906,4.3854358885,-2.3383576646,,, +12.6582031250,12,3.8949404660,-3.0958422678,4.8227723229,-2.5329495604,,, +12.6601562500,12,4.3677145184,-2.7556825807,5.1828584778,-2.6905339218,,, +12.6621093750,12,4.7083579491,-2.3636826769,5.3994608013,-2.7726164889,,, +12.6640625000,12,4.8484346569,-1.9308232646,5.4223558649,-2.7451058492,,, +12.6660156250,12,4.7360787873,-1.4644641413,5.2203176103,-2.5801604248,,, +12.6679687500,12,4.3373740341,-0.9681443979,4.7800504609,-2.2574425590,,, +12.6699218750,12,3.6384789078,-0.4429247663,4.1043771053,-1.7665317496,,, +12.6718750000,12,2.6500009583,0.1089919116,3.2122733879,-1.1111538335,,, +12.6738281250,12,1.4103606199,0.6805061615,2.1389973298,-0.3126753090,,, +12.6757812500,12,-0.0156889522,1.2593907105,0.9338074581,0.5903358520,,, +12.6777343750,12,-1.5441713581,1.8305973178,-0.3451139484,1.5466851340,,, +12.6796875000,12,-3.0821509101,2.3786074113,-1.6372174068,2.4990842099,,, +12.6816406250,12,-4.5372838597,2.8893317631,-2.8847311909,3.3903915352,,, +12.6835937500,12,-5.8247008764,3.3500707919,-4.0338730809,4.1683768302,,, +12.6855468750,12,-6.8722745212,3.7479562491,-5.0344356137,4.7893265984,,, +12.6875000000,12,-7.6259277005,4.0702068327,-5.8431739058,5.2211912416,,, +12.6894531250,12,-8.0546302070,4.3061415399,-6.4306845641,5.4460479258,,, +12.6914062500,12,-8.1529954794,4.4487372972,-6.7857938546,5.4612840952,,, +12.6933593750,12,-7.9404732881,4.4951038764,-6.9157282659,5.2790411558,,, +12.6953125000,12,-7.4579091527,4.4453600740,-6.8445945462,4.9237170630,,, +12.6972656250,12,-6.7626569733,4.3008316816,-6.6102118368,4.4286693801,,, +12.6992187500,12,-5.9231555499,4.0636550802,-6.2583661957,3.8335855649,,, +12.7011718750,12,-5.0129612250,3.7379530403,-5.8354671983,3.1822854436,,, +12.7031250000,12,-4.1036084804,3.3319064113,-5.3809764933,2.5199354114,,, +12.7050781250,12,-3.2568111058,2.8593327371,-4.9215472017,1.8891605550,,, +12.7070312500,12,-2.5187363696,2.3385155454,-4.4698252084,1.3257376272,,, +12.7089843750,12,-1.9179131411,1.7884261156,-4.0275657161,0.8552188125,,, +12.7109375000,12,-1.4650176777,1.2251788492,-3.5895129312,0.4908755011,,, +12.7128906250,12,-1.1535162689,0.6607919522,-3.1473836707,0.2328769092,,, +12.7148437500,12,-0.9611561696,0.1038994330,-2.6939383783,0.0685698404,,, +12.7167968750,12,-0.8522399778,-0.4386597547,-2.2250919373,-0.0259576329,,, +12.7187500000,12,-0.7822154648,-0.9597908447,-1.7402579434,-0.0820439568,,, +12.7207031250,12,-0.7043387368,-1.4504752847,-1.2418280351,-0.1329449699,,, +12.7226562500,12,-0.5751768714,-1.8998535896,-0.7326175872,-0.2090836529,,, +12.7246093750,12,-0.3580861312,-2.2969229472,-0.2121322625,-0.3349092150,,, +12.7265625000,12,-0.0268910632,-2.6319713223,0.3240680414,-0.5263543151,,, +12.7285156250,12,0.4298535817,-2.8972167029,0.8807188233,-0.7887728629,,, +12.7304687500,12,1.0067275575,-3.0886795607,1.4593701364,-1.1167135260,,, +12.7324218750,12,1.6831517162,-3.2095055977,2.0573441230,-1.4962719632,,, +12.7343750000,12,2.4272597486,-3.2708126963,2.6667514669,-1.9084372320,,, +12.7363281250,12,3.1997822813,-3.2881791106,3.2735195309,-2.3313919713,,, +12.7382812500,12,3.9572762174,-3.2772056766,3.8580417816,-2.7416850243,,, +12.7402343750,12,4.6539724778,-3.2507420253,4.3958488078,-3.1147603050,,, +12.7421875000,12,5.2429916169,-3.2168246240,4.8580870095,-3.4252215580,,, +12.7441406250,12,5.6795513169,-3.1762963602,5.2150822794,-3.6477033512,,, +12.7460937500,12,5.9256630172,-3.1211734179,5.4415082336,-3.7586283444,,, +12.7480468750,12,5.9533904393,-3.0358179672,5.5176495156,-3.7386067911,,, +12.7500000000,12,5.7465739216,-2.9007672011,5.4280287286,-3.5750292358,,, +12.7519531250,12,5.3022531386,-2.6968936230,5.1623515038,-3.2638939675,,, +12.7539062500,12,4.6319368096,-2.4089034678,4.7182399172,-2.8108745925,,, +12.7558593750,12,3.7633791942,-2.0287965421,4.1042532940,-2.2326730321,,, +12.7578125000,12,2.7419848855,-1.5583650158,3.3432633458,-1.5577696434,,, +12.7597656250,12,1.6284863434,-1.0087010114,2.4731351462,-0.8243824138,,, +12.7617187500,12,0.4923802480,-0.3970274478,1.5427566442,-0.0758492551,,, +12.7636718750,12,-0.5966565316,0.2567586650,0.6060452241,0.6450276364,,, +12.7656250000,12,-1.5776901306,0.9317818500,-0.2841102033,1.3014831767,,, +12.7675781250,12,-2.4047672049,1.6060306105,-1.0811560840,1.8660907133,,, +12.7695312500,12,-3.0482905773,2.2562258975,-1.7480926359,2.3209822293,,, +12.7714843750,12,-3.4939620783,2.8587808247,-2.2595042699,2.6567753819,,, +12.7734375000,12,-3.7418371825,3.3907149429,-2.6040816269,2.8714187041,,, +12.7753906250,12,-3.8044076744,3.8295708135,-2.7856443138,2.9684528767,,, +12.7773437500,12,-3.7026612362,4.1528813208,-2.8201877976,2.9546732408,,, +12.7792968750,12,-3.4622050398,4.3386077800,-2.7317438695,2.8383709972,,, +12.7812500000,12,-3.1121896024,4.3681791623,-2.5509637883,2.6295608092,,, +12.7832031250,12,-2.6864334900,4.2321121863,-2.3143226641,2.3422699109,,, +12.7851562500,12,-2.2230971812,3.9353290677,-2.0596440187,1.9966114131,,, +12.7871093750,12,-1.7614100492,3.4985125138,-1.8199285441,1.6181965011,,, +12.7890625000,12,-1.3373770576,2.9545002306,-1.6202396336,1.2348883862,,, +12.7910156250,12,-0.9788326638,2.3412068095,-1.4767092606,0.8717537975,,, +12.7929687500,12,-0.7002952791,1.6937337713,-1.3960089179,0.5455875436,,, +12.7949218750,12,-0.5015431083,1.0399687019,-1.3767648619,0.2625246722,,, +12.7968750000,12,-0.3710760096,0.4013329624,-1.4113871294,0.0203461852,,, +12.7988281250,12,-0.2908722306,-0.2055338457,-1.4865671281,-0.1876953492,,, +12.8007812500,12,-0.2393554482,-0.7691510396,-1.5836837329,-0.3707962936,,, +12.8027343750,12,-0.1916706791,-1.2822014181,-1.6778295247,-0.5398799363,,, +12.8046875000,12,-0.1193842548,-1.7371823116,-1.7353623745,-0.7062254141,,, +12.8066406250,12,0.0067568890,-2.1232123903,-1.7156651226,-0.8791532458,,, +12.8085937500,12,0.2113232477,-2.4265062270,-1.5787928785,-1.0639621788,,, +12.8105468750,12,0.5095821001,-2.6321901613,-1.2934310116,-1.2609066031,,, +12.8125000000,12,0.9051289516,-2.7265875289,-0.8426269488,-1.4653962519,,, +12.8144531250,12,1.3889641488,-2.7008591073,-0.2288976883,-1.6693895890,,, +12.8164062500,12,1.9401470581,-2.5548955229,0.5230940728,-1.8633832058,,, +12.8183593750,12,2.5282486478,-2.2989648865,1.3695252934,-2.0378259231,,, +12.8203125000,12,3.1163077422,-1.9528320667,2.2541319789,-2.1834245127,,, +12.8222656250,12,3.6630206939,-1.5432482831,3.1150230166,-2.2905104062,,, +12.8242187500,12,4.1244522856,-1.0995244250,3.8910636488,-2.3477688118,,, +12.8261718750,12,4.4564113756,-0.6487399212,4.5267988329,-2.3417703947,,, +12.8281250000,12,4.6183027564,-0.2137513700,4.9747710276,-2.2588536590,,, +12.8300781250,12,4.5779909547,0.1856950498,5.1979162497,-2.0883929567,,, +12.8320312500,12,4.3158533365,0.5307871507,5.1732267648,-1.8253603602,,, +12.8339843750,12,3.8267551601,0.8022870664,4.8932201806,-1.4717142062,,, +12.8359375000,12,3.1211086242,0.9809181023,4.3652478756,-1.0372916225,,, +12.8378906250,12,2.2269460423,1.0493228567,3.6132007860,-0.5405429082,,, +12.8398437500,12,1.1915095438,0.9957051391,2.6804428905,-0.0082595048,,, +12.8417968750,12,0.0787587231,0.8186859954,1.6280094043,0.5267975148,,, +12.8437500000,12,-1.0372907432,0.5307882789,0.5277712946,1.0298388210,,, +12.8457031250,12,-2.0815006305,0.1594935885,-0.5459522829,1.4688147904,,, +12.8476562500,12,-2.9871788750,-0.2533716426,-1.5244562631,1.8194115650,,, +12.8496093750,12,-3.7026287680,-0.6557662648,-2.3499700124,2.0677754766,,, +12.8515625000,12,-4.1926208017,-0.9943237184,-2.9776682751,2.2093339775,,, +12.8535156250,12,-4.4378412190,-1.2245579994,-3.3781511469,2.2457475715,,, +12.8554687500,12,-4.4352332013,-1.3186899217,-3.5413392014,2.1826669271,,, +12.8574218750,12,-4.1983256249,-1.2695690941,-3.4771637580,2.0290709170,,, +12.8593750000,12,-3.7569602512,-1.0891726804,-3.2125284391,1.7981650225,,, +12.8613281250,12,-3.1576129004,-0.8019080337,-2.7893002957,1.5094782253,,, +12.8632812500,12,-2.4625234098,-0.4368468868,-2.2622847255,1.1902584437,,, +12.8652343750,12,-1.7449996172,-0.0221143545,-1.6933995378,0.8745100694,,, +12.8671875000,12,-1.0824924621,0.4190343413,-1.1452356544,0.6001672945,,, +12.8691406250,12,-0.5489368999,0.8691070466,-0.6772201170,0.4044609012,,, +12.8710937500,12,-0.2059674256,1.3119907519,-0.3420284548,0.3173546158,,, +12.8730468750,12,-0.0951912467,1.7270214693,-0.1813335167,0.3556598934,,, +12.8750000000,12,-0.2341252177,2.0868827161,-0.2222424534,0.5204832023,,, +12.8769531250,12,-0.6148768809,2.3590731587,-0.4737913133,0.7974068461,,, +12.8789062500,12,-1.2041472059,2.5091287677,-0.9234616350,1.1579860966,,, +12.8808593750,12,-1.9454663473,2.5064311416,-1.5361129117,1.5628032853,,, +12.8828125000,12,-2.7643567216,2.3326267350,-2.2561655722,1.9663884358,,, +12.8847656250,12,-3.5753392800,1.9892111974,-3.0115785090,2.3228961309,,, +12.8867187500,12,-4.2894977766,1.4990946683,-3.7196815872,2.5905844951,,, +12.8886718750,12,-4.8211070931,0.9007245647,-4.2949329069,2.7337086792,,, +12.8906250000,12,-5.0924791458,0.2399400518,-4.6567556531,2.7226493165,,, +12.8925781250,12,-5.0392965099,-0.4350938931,-4.7386938397,2.5346808261,,, +12.8945312500,12,-4.6179335322,-1.0764515315,-4.4995875858,2.1562124672,,, +12.8964843750,12,-3.8115836603,-1.6397130532,-3.9296958902,1.5852719644,,, +12.8984375000,12,-2.6326693932,-2.0879860501,-3.0473346185,0.8334301693,,, +12.9003906250,12,-1.1227385760,-2.3943834969,-1.8922331732,-0.0730548447,,, +12.9023437500,12,0.6487225955,-2.5421778392,-0.5214275516,-1.0931124532,,, +12.9042968750,12,2.5862803094,-2.5236353338,0.9933978318,-2.1714610529,,, +12.9062500000,12,4.5722697634,-2.3388907482,2.5687262296,-3.2404823224,,, +12.9082031250,12,6.4741554769,-1.9961514169,4.1120308642,-4.2250857468,,, +12.9101562500,12,8.1559488038,-1.5138200000,5.5260157583,-5.0506266307,,, +12.9121093750,12,9.4915890317,-0.9228617265,6.7157292154,-5.6516245414,,, +12.9140625000,12,10.3775443655,-0.2663709882,7.5969071820,-5.9790681334,,, +12.9160156250,12,10.7426775703,0.4042963317,8.1029763232,-6.0053724474,,, +12.9179687500,12,10.5543742149,1.0346735313,8.1903762945,-5.7267236291,,, +12.9199218750,12,9.8203414494,1.5718282058,7.8428405180,-5.1625300339,,, +12.9218750000,12,8.5860795672,1.9685436936,7.0742641557,-4.3520589571,,, +12.9238281250,12,6.9291632042,2.1882631013,5.9291921486,-3.3491301204,,, +12.9257812500,12,4.9518665601,2.2114988797,4.4800706178,-2.2161083812,,, +12.9277343750,12,2.7739490063,2.0409183984,2.8217280366,-1.0189537471,,, +12.9296875000,12,0.5271970534,1.6992082349,1.0651569687,0.1749244288,,, +12.9316406250,12,-1.6493038105,1.2191196569,-0.6689710637,1.2967967722,,, +12.9335937500,12,-3.6159668171,0.6341756515,-2.2592434063,2.2778300457,,, +12.9355468750,12,-5.2422093968,-0.0233988855,-3.5946130618,3.0531153232,,, +12.9375000000,12,-6.4168698069,-0.7202662506,-4.5833935309,3.5677122083,,, +12.9394531250,12,-7.0580757107,-1.4204585824,-5.1580947249,3.7831495297,,, +12.9414062500,12,-7.1217646106,-2.0863726003,-5.2782959920,3.6829491152,,, +12.9433593750,12,-6.6072782087,-2.6805308734,-4.9328969924,3.2759687972,,, +12.9453125000,12,-5.5594002764,-3.1660489685,-4.1417252577,2.5974632606,,, +12.9472656250,12,-4.0676468668,-3.5061466482,-2.9570164942,1.7082806607,,, +12.9492187500,12,-2.2610418994,-3.6655684662,-1.4633526360,0.6907049229,,, +12.9511718750,12,-0.2963908945,-3.6153765896,0.2259417562,-0.3603149664,,, +12.9531250000,12,1.6567875636,-3.3387383040,1.9751118899,-1.3479532096,,, +12.9550781250,12,3.4304493750,-2.8354042216,3.6339975197,-2.1829736988,,, +12.9570312500,12,4.8704722754,-2.1238860349,5.0489586468,-2.7907618338,,, +12.9589843750,12,5.8476644436,-1.2403922652,6.0772226079,-3.1158570190,,, +12.9609375000,12,6.2671396966,-0.2357841521,6.6024682906,-3.1246067129,,, +12.9628906250,12,6.0755278197,0.8284505463,6.5490338405,-2.8063672808,,, +12.9648437500,12,5.2650180020,1.8864079045,5.8918804887,-2.1729951258,,, +12.9667968750,12,3.8734756164,2.8752324773,4.6588269378,-1.2570810358,,, +12.9687500000,12,1.9812963752,3.7412337032,2.9255596164,-0.1097576237,,, +12.9707031250,12,-0.2935666141,4.4427944101,0.8073597915,1.2014912549,,, +12.9726562500,12,-2.8016989166,4.9492914936,-1.5511173834,2.5946863759,,, +12.9746093750,12,-5.3698303343,5.2385959123,-3.9880382185,3.9756128005,,, +12.9765625000,12,-7.8113446733,5.2970725580,-6.3364073771,5.2427537606,,, +12.9785156250,12,-9.9410003836,5.1222108281,-8.4351734157,6.2960841248,,, +12.9804687500,12,-11.5926275741,4.7251412096,-10.1414531411,7.0478097001,,, +12.9824218750,12,-12.6355400372,4.1311048117,-11.3424947765,7.4318472720,,, +12.9843750000,12,-12.9855598096,3.3775309277,-11.9628555525,7.4100154562,,, +12.9863281250,12,-12.6098258535,2.5103402114,-11.9665807099,6.9744734834,,, +12.9882812500,12,-11.5267780511,1.5791898578,-11.3571732813,6.1468907062,,, +12.9902343750,12,-9.8020024217,0.6320082342,-10.1753440482,4.9749256451,,, +12.9921875000,12,-7.5410702811,-0.2903758677,-8.4948187190,3.5269386085,,, +12.9941406250,12,-4.8816431968,-1.1575766150,-6.4181266930,1.8865095962,,, +12.9960937500,12,-1.9840683264,-1.9493193717,-4.0705178907,0.1469229670,,, +12.9980468750,12,0.9808720433,-2.6522734045,-1.5902450470,-1.5950987440,,, +13.0000000000,13,3.8436141447,-3.2563828943,0.8808992568,-3.2451626409,33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000:10.0000000000:11.0000000000:12.0000000000:13.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +13.0019531250,13,6.4440458575,-3.7514787293,3.2044797669,-4.7151302055,,, +13.0039062500,13,8.6387625262,-4.1241043644,5.2531449117,-5.9261534285,,, +13.0058593750,13,10.3103175287,-4.3570799276,6.9209475826,-6.8129927054,,, +13.0078125000,13,11.3771660585,-4.4341352133,8.1326188831,-7.3300228944,,, +13.0097656250,13,11.7997537787,-4.3462758764,8.8475601770,-7.4559441946,,, +13.0117187500,13,11.5805849324,-4.0944984879,9.0583032722,-7.1946875241,,, +13.0136718750,13,10.7609897762,-3.6891117162,8.7865376262,-6.5738414166,,, +13.0156250000,13,9.4174892172,-3.1495440090,8.0795565311,-5.6427559055,,, +13.0175781250,13,7.6576339991,-2.5043414476,7.0077655072,-4.4700205820,,, +13.0195312500,13,5.6141135037,-1.7890878839,5.6622396837,-3.1392645819,,, +13.0214843750,13,3.4362553493,-1.0432217875,4.1507803480,-1.7431711948,,, +13.0234375000,13,1.2780772829,-0.3068677375,2.5909917302,-0.3756375702,,, +13.0253906250,13,-0.7162622838,0.3826200750,1.1000399472,0.8772519468,,, +13.0273437500,13,-2.4255107992,0.9940590416,-0.2163593468,1.9449186341,,, +13.0292968750,13,-3.7589310707,1.5051260893,-1.2719189792,2.7765129513,,, +13.0312500000,13,-4.6589662976,1.9025959091,-2.0049877679,3.3416724239,,, +13.0332031250,13,-5.1017468762,2.1787730144,-2.3838498846,3.6289696452,,, +13.0351562500,13,-5.0956033272,2.3273439818,-2.4098846794,3.6432891399,,, +13.0371093750,13,-4.6763138639,2.3426733532,-2.1140753231,3.4029896571,,, +13.0390625000,13,-3.9011289055,2.2226885867,-1.5490324144,2.9378760883,,, +13.0410156250,13,-2.8446898364,1.9737559001,-0.7820509472,2.2886841084,,, +13.0429687500,13,-1.5959083228,1.6144465088,0.1100413875,1.5066484232,,, +13.0449218750,13,-0.2533288425,1.1752228525,1.0461440841,0.6512455666,,, +13.0468750000,13,1.0808866508,0.6947505859,1.9457571804,-0.2137796370,,, +13.0488281250,13,2.3072860547,0.2149861826,2.7329315296,-1.0250584576,,, +13.0507812500,13,3.3359433977,-0.2236070031,3.3411037248,-1.7243657739,,, +13.0527343750,13,4.0935711245,-0.5859129697,3.7186880722,-2.2632583287,,, +13.0546875000,13,4.5297429551,-0.8452861243,3.8330337844,-2.6073153034,,, +13.0566406250,13,4.6213767534,-0.9860759443,3.6730013897,-2.7393020905,,, +13.0585937500,13,4.3737192601,-1.0041936865,3.2500200541,-2.6597370955,,, +13.0605468750,13,3.8160197810,-0.9046615459,2.5943963779,-2.3841143365,,, +13.0625000000,13,2.9942658366,-0.6978855567,1.7486476607,-1.9384319060,,, +13.0644531250,13,1.9653919847,-0.3971400676,0.7643112281,-1.3551843496,,, +13.0664062500,13,0.7942674328,-0.0170473462,-0.2977625549,-0.6707606842,,, +13.0683593750,13,-0.4475554615,0.4265908817,-1.3686995001,0.0752125052,,, +13.0703125000,13,-1.6830580925,0.9130867440,-2.3761797583,0.8390312833,,, +13.0722656250,13,-2.8333266224,1.4121297035,-3.2514798830,1.5730671094,,, +13.0742187500,13,-3.8238803325,1.8844704069,-3.9377622950,2.2286172173,,, +13.0761718750,13,-4.5911287642,2.2879902666,-4.3965562834,2.7602138735,,, +13.0781250000,13,-5.0871531129,2.5845635462,-4.6098529278,3.1298767326,,, +13.0800781250,13,-5.2833617189,2.7447469993,-4.5789945153,3.3109236333,,, +13.0820312500,13,-5.1728747739,2.7500456006,-4.3224652108,3.2906743315,,, +13.0839843750,13,-4.7706887714,2.5944105485,-3.8726432201,3.0716048644,,, +13.0859375000,13,-4.1126695261,2.2858552168,-3.2723661595,2.6716833018,,, +13.0878906250,13,-3.2544720048,1.8469405720,-2.5730984682,2.1240629828,,, +13.0898437500,13,-2.2685908583,1.3120697405,-1.8333291376,1.4747764867,,, +13.0917968750,13,-1.2377536057,0.7213924234,-1.1147875851,0.7776528236,,, +13.0937500000,13,-0.2451929895,0.1142937096,-0.4768612279,0.0872779133,,, +13.0957031250,13,0.6356307065,-0.4751213747,0.0295562179,-0.5479654253,,, +13.0976562500,13,1.3474799686,-1.0204118628,0.3679296636,-1.0896918211,,, +13.0996093750,13,1.8504476302,-1.5025260605,0.5205719300,-1.5091938476,,, +13.1015625000,13,2.1219013092,-1.9081135971,0.4912481577,-1.7864757414,,, +13.1035156250,13,2.1582665914,-2.2294859104,0.3054121378,-1.9115162105,,, +13.1054687500,13,1.9760325798,-2.4652730721,0.0067285054,-1.8859653376,,, +13.1074218750,13,1.6099873173,-2.6189440856,-0.3493545136,-1.7231241163,,, +13.1093750000,13,1.1109071445,-2.6958200977,-0.7011369134,-1.4470458593,,, +13.1113281250,13,0.5434089363,-2.7006698824,-0.9844832940,-1.0914420222,,, +13.1132812500,13,-0.0187807429,-2.6370735521,-1.1388310709,-0.6974826431,,, +13.1152343750,13,-0.5008824387,-2.5092468756,-1.1162631098,-0.3102604187,,, +13.1171875000,13,-0.8354271233,-2.3250658344,-0.8888967979,0.0251831433,,, +13.1191406250,13,-0.9689649015,-2.0967140327,-0.4519289210,0.2680370956,,, +13.1210937500,13,-0.8682414904,-1.8380279217,0.1760520156,0.3867036627,,, +13.1230468750,13,-0.5256038976,-1.5617396876,0.9553911456,0.3638513744,,, +13.1250000000,13,0.0382437365,-1.2780264876,1.8302936298,0.1998904392,,, +13.1269531250,13,0.7742124282,-0.9928092546,2.7335208220,-0.0856176486,,, +13.1289062500,13,1.6083990682,-0.7062212309,3.5906563934,-0.4553767484,,, +13.1308593750,13,2.4509221452,-0.4139150139,4.3262246182,-0.8597162002,,, +13.1328125000,13,3.2077263534,-0.1116609709,4.8704062645,-1.2445442884,,, +13.1347656250,13,3.7918629909,0.1996197267,5.1648817894,-1.5591707959,,, +13.1367187500,13,4.1336223562,0.5108408307,5.1700241950,-1.7626060869,,, +13.1386718750,13,4.1885446061,0.8038650823,4.8722298128,-1.8278990202,,, +13.1406250000,13,3.9398348309,1.0534511103,4.2847298020,-1.7434171890,,, +13.1425781250,13,3.3940174418,1.2333949979,3.4413377688,-1.5101147187,,, +13.1445312500,13,2.5749824413,1.3243848779,2.3907180169,-1.1372111283,,, +13.1464843750,13,1.5214182405,1.3193569134,1.1935296427,-0.6401131311,,, +13.1484375000,13,0.2861406974,1.2254759828,-0.0815818642,-0.0405678024,,, +13.1503906250,13,-1.0654957866,1.0633370390,-1.3634601487,0.6330730346,,, +13.1523437500,13,-2.4586188258,0.8640508496,-2.5837808561,1.3463500718,,, +13.1542968750,13,-3.8131562996,0.6646289464,-3.6826612296,2.0598307350,,, +13.1562500000,13,-5.0482430173,0.5007263956,-4.6128676100,2.7302373163,,, +13.1582031250,13,-6.0862285601,0.3988419850,-5.3403024605,3.3120955641,,, +13.1601562500,13,-6.8580338904,0.3732460698,-5.8425656091,3.7615989924,,, +13.1621093750,13,-7.3100246640,0.4282370280,-6.1077801248,4.0423707375,,, +13.1640625000,13,-7.4092831818,0.5612552107,-6.1326218779,4.1303459919,,, +13.1660156250,13,-7.1454938591,0.7638650920,-5.9200780366,4.0158574491,,, +13.1679687500,13,-6.5313792514,1.0213669499,-5.4800957301,3.7037401207,,, +13.1699218750,13,-5.6026861691,1.3139288050,-4.8327067258,3.2127534419,,, +13.1718750000,13,-4.4155728319,1.6197449347,-4.0100328955,2.5736528516,,, +13.1738281250,13,-3.0398128457,1.9149481102,-3.0552291432,1.8243766145,,, +13.1757812500,13,-1.5495508408,2.1682224076,-2.0182080622,1.0033695551,,, +13.1777343750,13,-0.0159534115,2.3382798760,-0.9498994666,0.1451218629,,, +13.1796875000,13,1.4956715139,2.3804360695,0.1018034701,-0.7199734542,,, +13.1816406250,13,2.9260359833,2.2580394267,1.0941362345,-1.5634943662,,, +13.1835937500,13,4.2212337498,1.9522690180,1.9917220757,-2.3565252100,,, +13.1855468750,13,5.3318442765,1.4676645921,2.7680929566,-3.0678547035,,, +13.1875000000,13,6.2135456068,0.8326458371,3.4044409143,-3.6647034107,,, +13.1894531250,13,6.8302261096,0.0956778909,3.8878360905,-4.1160642829,,, +13.1914062500,13,7.1579714281,-0.6811687719,4.2114269076,-4.3965957751,,, +13.1933593750,13,7.1881649320,-1.4310562579,4.3748493146,-4.4901485573,,, +13.1953125000,13,6.9291066010,-2.0931411000,4.3834254758,-4.3927427424,,, +13.1972656250,13,6.4060865906,-2.6219201487,4.2478070165,-4.1140669692,,, +13.1992187500,13,5.6596263936,-2.9919394135,3.9846028003,-3.6766916266,,, +13.2011718750,13,4.7417497909,-3.1971137807,3.6165078473,-3.1131365289,,, +13.2031250000,13,3.7114800744,-3.2460689186,3.1718904021,-2.4619102275,,, +13.2050781250,13,2.6310296681,-3.1562174903,2.6843717126,-1.7638943440,,, +13.2070312500,13,1.5626398829,-2.9489348610,2.1906895909,-1.0597850078,,, +13.2089843750,13,0.5651709911,-2.6468932933,1.7258506801,-0.3883042182,,, +13.2109375000,13,-0.3099933666,-2.2733043063,1.3179175334,0.2157235302,,, +13.2128906250,13,-1.0230971481,-1.8519052197,0.9845966481,0.7236401685,,, +13.2148437500,13,-1.5488222338,-1.4062388250,0.7320241250,1.1148499590,,, +13.2167968750,13,-1.8770274520,-0.9579947013,0.5561125376,1.3779163555,,, +13.2187500000,13,-2.0122606764,-0.5257346015,0.4454540431,1.5110450680,,, +13.2207031250,13,-1.9731938681,-0.1242616370,0.3838503276,1.5223167117,,, +13.2226562500,13,-1.7913647293,0.2357658019,0.3532689594,1.4294691295,,, +13.2246093750,13,-1.5081704548,0.5479089855,0.3378702967,1.2585981307,,, +13.2265625000,13,-1.1710132018,0.8109668306,0.3259486196,1.0418821783,,, +13.2285156250,13,-0.8295094330,1.0305607631,0.3081578779,0.8145722906,,, +13.2304687500,13,-0.5311833321,1.2179867252,0.2750940823,0.6110848913,,, +13.2324218750,13,-0.3169380783,1.3861491875,0.2162783793,0.4608802580,,, +13.2343750000,13,-0.2181308399,1.5461693816,0.1189209580,0.3855870223,,, +13.2363281250,13,-0.2554678501,1.7058560898,-0.0332037371,0.3977474427,,, +13.2382812500,13,-0.4378331372,1.8676881106,-0.2577381501,0.5001686486,,, +13.2402343750,13,-0.7605187928,2.0257678183,-0.5687524967,0.6853890378,,, +13.2421875000,13,-1.2042646661,2.1648172709,-0.9714671516,0.9360873824,,, +13.2441406250,13,-1.7372915789,2.2642688997,-1.4590742945,1.2278663392,,, +13.2460937500,13,-2.3210200304,2.3061596712,-2.0135792614,1.5342880712,,, +13.2480468750,13,-2.9154534852,2.2798318360,-2.6085846753,1.8307812211,,, +13.2500000000,13,-3.4803969271,2.1798129476,-3.2103514725,2.0949932163,,, +13.2519531250,13,-3.9752672966,2.0033036555,-3.7797379471,2.3058581593,,, +13.2539062500,13,-4.3610131420,1.7513332495,-4.2779401770,2.4438234603,,, +13.2558593750,13,-4.6024780113,1.4289831833,-4.6710664478,2.4915673069,,, +13.2578125000,13,-4.6694661691,1.0432337518,-4.9298814255,2.4345820052,,, +13.2597656250,13,-4.5383621419,0.6025188134,-5.0287590576,2.2625540341,,, +13.2617187500,13,-4.1961808542,0.1194398083,-4.9473723596,1.9722630429,,, +13.2636718750,13,-3.6458553999,-0.3860933274,-4.6739242175,1.5710510057,,, +13.2656250000,13,-2.9097320534,-0.8862303682,-4.2081884366,1.0787057882,,, +13.2675781250,13,-2.0288847896,-1.3479214561,-3.5635793357,0.5261305753,,, +13.2695312500,13,-1.0579390291,-1.7387099660,-2.7669674844,-0.0490858479,,, +13.2714843750,13,-0.0588313572,-2.0328274830,-1.8567911837,-0.6075161116,,, +13.2734375000,13,0.9034678865,-2.2134926426,-0.8816847364,-1.1109701460,,, +13.2753906250,13,1.7666573768,-2.2727163514,0.1024123738,-1.5259484480,,, +13.2773437500,13,2.4804952810,-2.2123977685,1.0397080191,-1.8288824203,,, +13.2792968750,13,3.0139227891,-2.0453091155,1.8822196301,-2.0096535141,,, +13.2812500000,13,3.3558346066,-1.7939072380,2.5927045387,-2.0713025920,,, +13.2832031250,13,3.5129146837,-1.4882899250,3.1455359492,-2.0279888682,,, +13.2851562500,13,3.5067992686,-1.1627369576,3.5279527389,-1.9022333667,,, +13.2871093750,13,3.3696287065,-0.8489872363,3.7397355430,-1.7209713412,,, +13.2890625000,13,3.1389493491,-0.5696075409,3.7910182973,-1.5115829492,,, +13.2910156250,13,2.8538048599,-0.3363916380,3.6995156036,-1.2995432679,,, +13.2929687500,13,2.5516076404,-0.1527993410,3.4870442900,-1.1072712434,,, +13.2949218750,13,2.2644940211,-0.0168329853,3.1756222932,-0.9527231993,,, +13.2968750000,13,2.0159344584,0.0763607479,2.7852869817,-0.8477535122,,, +13.2988281250,13,1.8192311123,0.1322802818,2.3348791796,-0.7971461498,,, +13.3007812500,13,1.6772535002,0.1574470352,1.8439014526,-0.7979854076,,, +13.3027343750,13,1.5821284705,0.1627545423,1.3335820696,-0.8388161640,,, +13.3046875000,13,1.5162018606,0.1646130148,0.8281414436,-0.8999524543,,, +13.3066406250,13,1.4558821825,0.1798752485,0.3565608235,-0.9564539074,,, +13.3085937500,13,1.3762547758,0.2193848548,-0.0482280718,-0.9823193451,,, +13.3105468750,13,1.2537442806,0.2860877703,-0.3543786142,-0.9536483500,,, +13.3125000000,13,1.0680945630,0.3761491805,-0.5379904146,-0.8513766398,,, +13.3144531250,13,0.8059391418,0.4798963986,-0.5888008023,-0.6649151890,,, +13.3164062500,13,0.4651622248,0.5825751553,-0.5120449657,-0.3955350398,,, +13.3183593750,13,0.0565663521,0.6659581743,-0.3260974980,-0.0568229396,,, +13.3203125000,13,-0.3992812008,0.7120803068,-0.0593602792,0.3286819753,,, +13.3222656250,13,-0.8763828063,0.7082719908,0.2532748581,0.7338803155,,, +13.3242187500,13,-1.3439678485,0.6495184686,0.5774460680,1.1292819782,,, +13.3261718750,13,-1.7651112775,0.5368837451,0.8870650261,1.4834365121,,, +13.3281250000,13,-2.0979774728,0.3753817065,1.1672887975,1.7641833101,,, +13.3300781250,13,-2.3005089152,0.1732291187,1.4128179437,1.9415294665,,, +13.3320312500,13,-2.3365173228,-0.0585835832,1.6241264736,1.9911231079,,, +13.3339843750,13,-2.1816061785,-0.3069758666,1.8028445855,1.8974023058,,, +13.3359375000,13,-1.8274813492,-0.5577817719,1.9488365519,1.6559244781,,, +13.3378906250,13,-1.2833644477,-0.7975725801,2.0613817245,1.2744147733,,, +13.3398437500,13,-0.5752537982,-1.0160668891,2.1418593385,0.7725492393,,, +13.3417968750,13,0.2555509275,-1.2075573786,2.1942529469,0.1808756923,,, +13.3437500000,13,1.1549948640,-1.3694959787,2.2242197349,-0.4610379117,,, +13.3457031250,13,2.0602502337,-1.4983352544,2.2379775268,-1.1072577344,,, +13.3476562500,13,2.9041128701,-1.5859540536,2.2396168438,-1.7088343657,,, +13.3496093750,13,3.6199717978,-1.6204153890,2.2275114292,-2.2181636302,,, +13.3515625000,13,4.1483581331,-1.5904664260,2.1931502086,-2.5942830102,,, +13.3535156250,13,4.4440472575,-1.4899825299,2.1219849432,-2.8080684965,,, +13.3554687500,13,4.4816192102,-1.3203842381,1.9937380710,-2.8462170389,,, +13.3574218750,13,4.2573115226,-1.0904738736,1.7835091301,-2.7122207510,,, +13.3593750000,13,3.7862360359,-0.8131555525,1.4654484960,-2.4232980873,,, +13.3613281250,13,3.0975372215,-0.5006436303,1.0177483241,-2.0055011055,,, +13.3632812500,13,2.2300747575,-0.1605803076,0.4277667037,-1.4892929321,,, +13.3652343750,13,1.2277526760,0.2063279561,-0.3041275513,-0.9053342236,,, +13.3671875000,13,0.1341430890,0.6062047872,-1.1645738285,-0.2808091777,,, +13.3691406250,13,-1.0107588134,1.0480216025,-2.1306428059,0.3617360966,,, +13.3710937500,13,-2.1699006517,1.5373443162,-3.1731002108,1.0027057185,,, +13.3730468750,13,-3.3067384788,2.0710025695,-4.2583065145,1.6229128737,,, +13.3750000000,13,-4.3834747961,2.6343172951,-5.3494667296,2.2019123254,,, +13.3769531250,13,-5.3601847891,3.2014559104,-6.4061900925,2.7175724518,,, +13.3789062500,13,-6.1946860295,3.7384013475,-7.3823739993,3.1467084849,,, +13.3808593750,13,-6.8438782770,4.2063742439,-8.2256348537,3.4664699257,,, +13.3828125000,13,-7.2667956359,4.5648433518,-8.8792546877,3.6563868341,,, +13.3847656250,13,-7.4291368272,4.7757408130,-9.2846899205,3.7014058304,,, +13.3867187500,13,-7.3088429297,4.8081035640,-9.3861375684,3.5952383427,,, +13.3886718750,13,-6.9017096904,4.6403314911,-9.1393922232,3.3426483067,,, +13.3906250000,13,-6.2258066220,4.2607261188,-8.5218067525,2.9605218532,,, +13.3925781250,13,-5.3218203412,3.6680151814,-7.5385678520,2.4768292197,,, +13.3945312500,13,-4.2460870983,2.8711563054,-6.2231739649,1.9256150159,,, +13.3964843750,13,-3.0593330390,1.8885265756,-4.6327739708,1.3399716818,,, +13.3984375000,13,-1.8197621119,0.7485334421,-2.8422784731,0.7483572385,,, +13.4003906250,13,-0.5834451395,-0.5079073373,-0.9404349616,0.1757223566,,, +13.4023437500,13,0.5940531933,-1.8252095679,0.9745437510,-0.3544303303,,, +13.4042968750,13,1.6589073424,-3.1332891197,2.8025615816,-0.8194966288,,, +13.4062500000,13,2.5610912230,-4.3508603441,4.4494880470,-1.1979506271,,, +13.4082031250,13,3.2565181749,-5.3920811878,5.8322946451,-1.4703124840,,, +13.4101562500,13,3.7113346137,-6.1757727980,6.8837059153,-1.6218228232,,, +13.4121093750,13,3.9081134845,-6.6354816281,7.5581129316,-1.6461684757,,, +13.4140625000,13,3.8509847625,-6.7287461914,7.8360686605,-1.5486150870,,, +13.4160156250,13,3.5677725326,-6.4443304385,7.7252045992,-1.3475835481,,, +13.4179687500,13,3.1089511756,-5.8052835245,7.2589506711,-1.0741974986,,, +13.4199218750,13,2.5432462854,-4.8655500006,6.4946564387,-0.7692533972,,, +13.4218750000,13,1.9502556171,-3.7014411389,5.5112099502,-0.4779288322,,, +13.4238281250,13,1.4123459482,-2.4022289113,4.4060079642,-0.2440974273,,, +13.4257812500,13,1.0068676911,-1.0618108804,3.2889903944,-0.1055603684,,, +13.4277343750,13,0.7972832222,0.2293438584,2.2707191116,-0.0897594163,,, +13.4296875000,13,0.8248627566,1.3909284047,1.4481165058,-0.2104511090,,, +13.4316406250,13,1.1048375397,2.3561127249,0.8944954295,-0.4668469647,,, +13.4335937500,13,1.6267963602,3.0721461702,0.6538872590,-0.8450207480,,, +13.4355468750,13,2.3569359442,3.5003178784,0.7374889552,-1.3202383399,,, +13.4375000000,13,3.2410072018,3.6167256154,1.1239031504,-1.8590256041,,, +13.4394531250,13,4.2065489309,3.4147169465,1.7624840328,-2.4201012805,,, +13.4414062500,13,5.1644141043,2.9087301107,2.5762980036,-2.9548430897,,, +13.4433593750,13,6.0132413596,2.1379172581,3.4669996564,-3.4094195963,,, +13.4453125000,13,6.6498135231,1.1666768480,4.3253682548,-3.7300178576,,, +13.4472656250,13,6.9824578059,0.0800552026,5.0435824355,-3.8700145111,,, +13.4492187500,13,6.9418055315,-1.0246032991,5.5245175593,-3.7959898227,,, +13.4511718750,13,6.4877601063,-2.0473449929,5.6898041399,-3.4913682414,,, +13.4531250000,13,5.6144702995,-2.8957120561,5.4879169831,-2.9586611249,,, +13.4550781250,13,4.3519670797,-3.4936217441,4.8993834142,-2.2198944812,,, +13.4570312500,13,2.7633855096,-3.7867786266,3.9384505491,-1.3145348034,,, +13.4589843750,13,0.9396594132,-3.7446211060,2.6528050171,-0.2958961923,,, +13.4609375000,13,-1.0075862252,-3.3604562093,1.1202975943,0.7732339614,,, +13.4628906250,13,-2.9552367225,-2.6511110014,-0.5581846436,1.8257112449,,, +13.4648437500,13,-4.7788753497,-1.6560275522,-2.2681286809,2.7953848772,,, +13.4667968750,13,-6.3631427431,-0.4343164816,-3.8925816808,3.6222820269,,, +13.4687500000,13,-7.6124816609,0.9406727598,-5.3252396245,4.2577837501,,, +13.4707031250,13,-8.4603042752,2.3866943187,-6.4825432401,4.6688778862,,, +13.4726562500,13,-8.8731275252,3.8155104024,-7.3103744189,4.8398646884,,, +13.4746093750,13,-8.8497688340,5.1353909124,-7.7848982756,4.7717587361,,, +13.4765625000,13,-8.4185784577,6.2568749329,-7.9110860275,4.4808634006,,, +13.4785156250,13,-7.6336896127,7.1013830554,-7.7202836312,3.9968850698,,, +13.4804687500,13,-6.5687495893,7.6079521516,-7.2646169631,3.3598201316,,, +13.4824218750,13,-5.3084318452,7.7359776541,-6.6077869769,2.6158476687,,, +13.4843750000,13,-3.9417308569,7.4687192592,-5.8160069190,1.8143605488,,, +13.4863281250,13,-2.5580432627,6.8184599626,-4.9520334112,1.0063180833,,, +13.4882812500,13,-1.2412355853,5.8250532520,-4.0708447890,0.2407984242,,, +13.4902343750,13,-0.0612549622,4.5469752688,-3.2161088728,-0.4403631579,,, +13.4921875000,13,0.9310245451,3.0540324478,-2.4194337947,-1.0061462640,,, +13.4941406250,13,1.7044002791,1.4238801035,-1.7026645862,-1.4372482425,,, +13.4960937500,13,2.2469971190,-0.2621427570,-1.0806367601,-1.7264057330,,, +13.4980468750,13,2.5663346278,-1.9242114678,-0.5617508191,-1.8786149590,,, +13.5000000000,13,2.6877899033,-3.4875446544,-0.1467926430,-1.9099391693,,, +13.5019531250,13,2.6501765634,-4.8837844988,0.1712190560,-1.8445260463,,, +13.5039062500,13,2.4994823089,-6.0522400978,0.4054728093,-1.7106868804,,, +13.5058593750,13,2.2819723522,-6.9423965245,0.5729988884,-1.5366938494,,, +13.5078125000,13,2.0381305519,-7.5168889454,0.6917468479,-1.3472032386,,, +13.5097656250,13,1.7996730396,-7.7541087610,0.7782755999,-1.1615970718,,, +13.5117187500,13,1.5898158480,-7.6505815536,0.8470192368,-0.9942161473,,, +13.5136718750,13,1.4244711636,-7.2224837364,0.9097412347,-0.8551476460,,, +13.5156250000,13,1.3130594106,-6.5054880743,0.9742868785,-0.7508429044,,, +13.5175781250,13,1.2595766098,-5.5529181588,1.0443027106,-0.6847555036,,, +13.5195312500,13,1.2632422290,-4.4318397206,1.1205835886,-0.6574542365,,, +13.5214843750,13,1.3169515231,-3.2168724566,1.2023157759,-0.6653086180,,, +13.5234375000,13,1.4051292425,-1.9829906935,1.2880632201,-0.6988544873,,, +13.5253906250,13,1.5038868033,-0.7992938943,1.3770450476,-0.7426966532,,, +13.5273437500,13,1.5832218204,0.2754978800,1.4690119751,-0.7770319687,,, +13.5292968750,13,1.6109265516,1.1961043898,1.5627589083,-0.7805260138,,, +13.5312500000,13,1.5588523845,1.9318035168,1.6561891150,-0.7344768540,,, +13.5332031250,13,1.4086302163,2.4659015550,1.7475679987,-0.6264225252,,, +13.5351562500,13,1.1530626573,2.7953614366,1.8346531497,-0.4512662923,,, +13.5371093750,13,0.7948450944,2.9306231956,1.9127032073,-0.2108544376,,, +13.5390625000,13,0.3460677753,2.8946524564,1.9748214215,0.0863260147,,, +13.5410156250,13,-0.1714529351,2.7215654722,2.0143138334,0.4252832836,,, +13.5429687500,13,-0.7266229016,2.4550595321,2.0272440325,0.7852205756,,, +13.5449218750,13,-1.2819051656,2.1457051441,2.0142851685,1.1416657714,,, +13.5468750000,13,-1.7984830338,1.8456098084,1.9807881148,1.4698640964,,, +13.5488281250,13,-2.2406570069,1.6008889201,1.9352432193,1.7474903454,,, +13.5507812500,13,-2.5771069779,1.4449442954,1.8878005709,1.9553568107,,, +13.5527343750,13,-2.7809162504,1.3945310253,1.8484748012,2.0772533879,,, +13.5546875000,13,-2.8312530002,1.4486014685,1.8235217155,2.1005715162,,, +13.5566406250,13,-2.7161984160,1.5898399095,1.8124870740,2.0177424822,,, +13.5585937500,13,-2.4348312581,1.7887745356,1.8090948724,1.8277119210,,, +13.5605468750,13,-1.9982895423,2.0092130125,1.8040877059,1.5369878778,,, +13.5625000000,13,-1.4292922086,2.2124586781,1.7881788242,1.1597079486,,, +13.5644531250,13,-0.7596307507,2.3597363938,1.7554832688,0.7164942466,,, +13.5664062500,13,-0.0276071963,2.4156639240,1.7048195306,0.2329152031,,, +13.5683593750,13,0.7235193083,2.3531340342,1.6369828862,-0.2620737886,,, +13.5703125000,13,1.4477546158,2.1563882138,1.5518532504,-0.7381310050,,, +13.5722656250,13,2.0996330677,1.8216204789,1.4486351756,-1.1656742138,,, +13.5742187500,13,2.6380916231,1.3566347840,1.3267886793,-1.5182977438,,, +13.5761718750,13,3.0312762552,0.7798513269,1.1848905551,-1.7760862953,,, +13.5781250000,13,3.2606552729,0.1191084372,1.0187560044,-1.9285559191,,, +13.5800781250,13,3.3217467985,-0.5890120253,0.8204388061,-1.9752444120,,, +13.5820312500,13,3.2216931155,-1.3006317735,0.5785105010,-1.9240198818,,, +13.5839843750,13,2.9769542006,-1.9684599494,0.2811014693,-1.7889713232,,, +13.5859375000,13,2.6120651487,-2.5469849100,-0.0794053605,-1.5887127788,,, +13.5878906250,13,2.1561017409,-2.9967665082,-0.5049246042,-1.3437520547,,, +13.5898437500,13,1.6367770490,-3.2876879913,-0.9938896062,-1.0729333357,,, +13.5917968750,13,1.0774177256,-3.4023858692,-1.5422834212,-0.7915250446,,, +13.5937500000,13,0.4985338506,-3.3392985441,-2.1416412522,-0.5117550829,,, +13.5957031250,13,-0.0795375141,-3.1131405405,-2.7758625036,-0.2439156944,,, +13.5976562500,13,-0.6353046851,-2.7526954521,-3.4182992228,0.0031788062,,, +13.5996093750,13,-1.1459613674,-2.2977487191,-4.0306276795,0.2221158830,,, +13.6015625000,13,-1.5883869916,-1.7950775593,-4.5653582234,0.4069741416,,, +13.6035156250,13,-1.9422792160,-1.2921326746,-4.9717321739,0.5541905068,,, +13.6054687500,13,-2.1943907489,-0.8303541571,-5.2025482360,0.6639561642,,, +13.6074218750,13,-2.3406498082,-0.4412676427,-5.2206650152,0.7404191625,,, +13.6093750000,13,-2.3852823200,-0.1444432875,-5.0046508158,0.7901785896,,, +13.6113281250,13,-2.3382391968,0.0538346773,-4.5517865782,0.8200951785,,, +13.6132812500,13,-2.2122491013,0.1595534811,-3.8788660152,0.8353105605,,, +13.6152343750,13,-2.0202399843,0.1873324977,-3.0219062847,0.8378565782,,, +13.6171875000,13,-1.7727964734,0.1560314451,-2.0323991518,0.8258770407,,, +13.6191406250,13,-1.4768287185,0.0855970598,-0.9706244355,0.7939726174,,, +13.6210937500,13,-1.1376856552,-0.0040603739,0.0988676261,0.7352791607,,, +13.6230468750,13,-0.7634201916,-0.0933453162,1.1096182989,0.6445272489,,, +13.6250000000,13,-0.3679367287,-0.1634035390,1.9981279866,0.5207398832,,, +13.6269531250,13,0.0277911114,-0.1958676861,2.7103692123,0.3688864425,,, +13.6289062500,13,0.3964905062,-0.1725434482,3.2058314021,0.1998917100,,, +13.6308593750,13,0.7081623111,-0.0780396529,3.4593621888,0.0286962840,,, +13.6328125000,13,0.9344156152,0.0953956993,3.4613763491,-0.1282463137,,, +13.6347656250,13,1.0507402213,0.3454150179,3.2159029647,-0.2545528527,,, +13.6367187500,13,1.0386376183,0.6602624668,2.7400089491,-0.3353630021,,, +13.6386718750,13,0.8896995930,1.0201108264,2.0668418844,-0.3595475391,,, +13.6406250000,13,0.6084261835,1.3988063015,1.2469734643,-0.3213786538,,, +13.6425781250,13,0.2106873540,1.7674187159,0.3433164935,-0.2204630485,,, +13.6445312500,13,-0.2799219478,2.0992428996,-0.5769044747,-0.0608607933,,, +13.6464843750,13,-0.8343383767,2.3743248669,-1.4482589402,0.1492201439,,, +13.6484375000,13,-1.4186387980,2.5824078616,-2.2116814538,0.3970182937,,, +13.6503906250,13,-1.9944399409,2.7235954058,-2.8189132777,0.6648425646,,, +13.6523437500,13,-2.5201150096,2.8053852438,-3.2359159007,0.9305869186,,, +13.6542968750,13,-2.9525463871,2.8360767901,-3.4440498889,1.1691665506,,, +13.6562500000,13,-3.2481470534,2.8178457345,-3.4384691232,1.3539365628,,, +13.6582031250,13,-3.3639095811,2.7440094406,-3.2244585412,1.4580977307,,, +13.6601562500,13,-3.2613553441,2.6019341782,-2.8144966580,1.4573582703,,, +13.6621093750,13,-2.9143330138,2.3791393094,-2.2284377933,1.3342786539,,, +13.6640625000,13,-2.3178131685,2.0688512381,-1.4952892849,1.0829869259,,, +13.6660156250,13,-1.4929161183,1.6727618815,-0.6527491530,0.7120092960,,, +13.6679687500,13,-0.4858470621,1.2014007640,0.2559075852,0.2438745805,,, +13.6699218750,13,0.6376819169,0.6727989061,1.1847270866,-0.2879062396,,, +13.6718750000,13,1.8001099296,0.1095380506,2.0870900405,-0.8430889579,,, +13.6738281250,13,2.9197868596,-0.4643332318,2.9180355983,-1.3789466254,,, +13.6757812500,13,3.9177453144,-1.0255227468,3.6369021550,-1.8539374263,,, +13.6777343750,13,4.7237461297,-1.5531159360,4.2097366502,-2.2309916755,,, +13.6796875000,13,5.2817227785,-2.0289342083,4.6110621144,-2.4805972661,,, +13.6816406250,13,5.5543726569,-2.4372206861,4.8252853903,-2.5834483823,,, +13.6835937500,13,5.5266167535,-2.7654920893,4.8487577840,-2.5322076903,,, +13.6855468750,13,5.2071719161,-3.0055455677,4.6914940203,-2.3321262005,,, +13.6875000000,13,4.6277767810,-3.1528843147,4.3757032152,-2.0007453897,,, +13.6894531250,13,3.8405593838,-3.2058279707,3.9317229229,-1.5668064025,,, +13.6914062500,13,2.9136749043,-3.1661558778,3.3947201269,-1.0678738489,,, +13.6933593750,13,1.9244017787,-3.0405777467,2.8017534605,-0.5462921708,,, +13.6953125000,13,0.9505649302,-2.8405363276,2.1874440851,-0.0444506929,,, +13.6972656250,13,0.0636901089,-2.5805771132,1.5811619262,0.3989304146,,, +13.6992187500,13,-0.6746564970,-2.2783145742,1.0082550740,0.7511893663,,, +13.7011718750,13,-1.2158446485,-1.9546748756,0.4919093180,0.9877655336,,, +13.7031250000,13,-1.5283479326,-1.6304636957,0.0522896544,1.0942436260,,, +13.7050781250,13,-1.6015506716,-1.3209295559,-0.2955461589,1.0678021801,,, +13.7070312500,13,-1.4468806222,-1.0334025861,-0.5430843165,0.9174139277,,, +13.7089843750,13,-1.0958796564,-0.7697019150,-0.6891044019,0.6627675080,,, +13.7109375000,13,-0.5959410340,-0.5304746198,-0.7391714006,0.3321527696,,, +13.7128906250,13,-0.0044453592,-0.3173575043,-0.7037048367,-0.0406496505,,, +13.7148437500,13,0.6162412246,-0.1312983921,-0.5972860329,-0.4195016493,,, +13.7167968750,13,1.2007416451,0.0305280739,-0.4410962214,-0.7677544071,,, +13.7187500000,13,1.6822789574,0.1750697786,-0.2650546093,-1.0495536294,,, +13.7207031250,13,1.9974529109,0.3106750700,-0.1058849260,-1.2322012628,,, +13.7226562500,13,2.0932815310,0.4447258300,-0.0018926816,-1.2894814427,,, +13.7246093750,13,1.9334963802,0.5834416666,0.0133091111,-1.2046306399,,, +13.7265625000,13,1.5022818564,0.7328601110,-0.0845636492,-0.9720941420,,, +13.7285156250,13,0.8055332592,0.8993372121,-0.3096413899,-0.5981880742,,, +13.7304687500,13,-0.1293297056,1.0889636606,-0.6668671135,-0.1009902607,,, +13.7324218750,13,-1.2546476113,1.3063150226,-1.1521140596,0.4905984112,,, +13.7343750000,13,-2.5054920185,1.5524595377,-1.7527107075,1.1388551009,,, +13.7363281250,13,-3.8045385515,1.8223701756,-2.4485639396,1.8003764404,,, +13.7382812500,13,-5.0680716402,2.1032593568,-3.2114860396,2.4299674446,,, +13.7402343750,13,-6.2120218452,2.3750098275,-4.0036722873,2.9843745687,,, +13.7421875000,13,-7.1568357503,2.6121030680,-4.7775990430,3.4249702536,,, +13.7441406250,13,-7.8306855601,2.7858221581,-5.4769122623,3.7192825213,,, +13.7460937500,13,-8.1724528250,2.8666793479,-6.0388741908,3.8421653775,,, +13.7480468750,13,-8.1359451357,2.8277366026,-6.3995677177,3.7772776926,,, +13.7500000000,13,-7.6942781604,2.6482529323,-6.5001137185,3.5184980318,,, +13.7519531250,13,-6.8427543535,2.3166171779,-6.2922713841,3.0705829446,,, +13.7539062500,13,-5.6012855067,1.8328088746,-5.7450363280,2.4494912842,,, +13.7558593750,13,-4.0170136574,1.2102249750,-4.8524127838,1.6827750387,,, +13.7578125000,13,-2.1645779505,0.4759969319,-3.6385073955,0.8090588378,,, +13.7597656250,13,-0.1437763308,-0.3295737318,-2.1589608711,-0.1235055785,,, +13.7617187500,13,1.9247843576,-1.1549501403,-0.4993744405,-1.0594571944,,, +13.7636718750,13,3.9089612416,-1.9425019617,1.2322691584,-1.9400582743,,, +13.7656250000,13,5.6783401909,-2.6346103108,2.9182145559,-2.7089637755,,, +13.7675781250,13,7.1165065116,-3.1774669793,4.4430190526,-3.3176072064,,, +13.7695312500,13,8.1309779065,-3.5238829209,5.7035557773,-3.7295370898,,, +13.7714843750,13,8.6612426398,-3.6372303142,6.6177361562,-3.9236250495,,, +13.7734375000,13,8.6837527716,-3.4959264168,7.1307250941,-3.8956690082,,, +13.7753906250,13,8.2133467938,-3.0971371153,7.2176364838,-3.6583513415,,, +13.7773437500,13,7.3018370239,-2.4589876435,6.8845632394,-3.2398941283,,, +13.7792968750,13,6.0335136311,-1.6206599783,6.1691151433,-2.6812443739,,, +13.7812500000,13,4.5172094426,-0.6399999874,5.1384487462,-2.0318519468,,, +13.7832031250,13,2.8763320600,0.4113714703,3.8835871619,-1.3450088606,,, +13.7851562500,13,1.2384200112,1.4550885735,2.5106348082,-0.6735751618,,, +13.7871093750,13,-0.2750018735,2.4134581323,1.1297638976,-0.0662146227,,, +13.7890625000,13,-1.5571135606,3.2148177982,-0.1553151703,0.4358204941,,, +13.7910156250,13,-2.5217017426,3.7965524929,-1.2541147246,0.8009623609,,, +13.7929687500,13,-3.1068118610,4.1077576489,-2.0929842419,1.0086381753,,, +13.7949218750,13,-3.2782498323,4.1127776141,-2.6190093566,1.0503281765,,, +13.7968750000,13,-3.0329695636,3.7951290718,-2.8042881123,0.9304503120,,, +13.7988281250,13,-2.4005419377,3.1612039526,-2.6476183671,0.6664070199,,, +13.8007812500,13,-1.4429166681,2.2433933983,-2.1741206781,0.2879254868,,, +13.8027343750,13,-0.2525838722,1.1010991438,-1.4346036465,-0.1642056494,,, +13.8046875000,13,1.0545735188,-0.1834748646,-0.5013455647,-0.6413743596,,, +13.8066406250,13,2.3516456836,-1.5145202883,0.5404280154,-1.0922318368,,, +13.8085937500,13,3.5112217223,-2.7913341739,1.5987658411,-1.4669473184,,, +13.8105468750,13,4.4130876136,-3.9146073322,2.5782997826,-1.7204060685,,, +13.8125000000,13,4.9544203552,-4.7937360900,3.3868421050,-1.8163341899,,, +13.8144531250,13,5.0618359094,-5.3559792236,3.9448943510,-1.7318902126,,, +13.8164062500,13,4.7007846500,-5.5547087066,4.1933457687,-1.4609871365,,, +13.8183593750,13,3.8798860599,-5.3740265991,4.0980425625,-1.0155075463,,, +13.8203125000,13,2.6489706923,-4.8291028466,3.6518159209,-0.4237652871,,, +13.8222656250,13,1.0908307183,-3.9633733382,2.8746775624,0.2739978548,,, +13.8242187500,13,-0.6906326774,-2.8434915341,1.8122190065,1.0316403651,,, +13.8261718750,13,-2.5815251131,-1.5528803107,0.5314954806,1.8022206618,,, +13.8281250000,13,-4.4662186217,-0.1846142399,-0.8847510081,2.5411469426,,, +13.8300781250,13,-6.2331941758,1.1662001231,-2.3436454500,3.2078372940,,, +13.8320312500,13,-7.7786984148,2.4097901113,-3.7474829868,3.7661414510,,, +13.8339843750,13,-9.0095190111,3.4679611674,-5.0001729885,4.1842923531,,, +13.8359375000,13,-9.8474191614,4.2789705045,-6.0148851892,4.4359010305,,, +13.8378906250,13,-10.2352725204,4.8008437865,-6.7211673479,4.5022169152,,, +13.8398437500,13,-10.1429364072,5.0132909581,-7.0706750051,4.3745824219,,, +13.8417968750,13,-9.5712617119,4.9181343841,-7.0411421062,4.0562117945,,, +13.8437500000,13,-8.5525680989,4.5375548646,-6.6363392239,3.5626561486,,, +13.8457031250,13,-7.1476385104,3.9111680496,-5.8822590450,2.9208087198,,, +13.8476562500,13,-5.4421239942,3.0939866479,-4.8248725513,2.1672961746,,, +13.8496093750,13,-3.5426303314,2.1542332931,-3.5311011130,1.3464336729,,, +13.8515625000,13,-1.5684421764,1.1677733067,-2.0868383268,0.5065272760,,, +13.8535156250,13,0.3607878683,0.2093141281,-0.5893278272,-0.3050473040,,, +13.8554687500,13,2.1358933223,-0.6558879909,0.8616097943,-1.0458648322,,, +13.8574218750,13,3.6664395874,-1.3776389950,2.1721303214,-1.6814064328,,, +13.8593750000,13,4.8877410030,-1.9239070368,3.2632343319,-2.1876752724,,, +13.8613281250,13,5.7648146208,-2.2813593909,4.0768121215,-2.5527297342,,, +13.8632812500,13,6.2918723534,-2.4534263014,4.5784124693,-2.7763797791,,, +13.8652343750,13,6.4881621398,-2.4571785978,4.7591621025,-2.8680900913,,, +13.8671875000,13,6.3915396320,-2.3202142076,4.6354223297,-2.8438114122,,, +13.8691406250,13,6.0523906703,-2.0775312037,4.2448729387,-2.7233575109,,, +13.8710937500,13,5.5299724193,-1.7677578994,3.6414622529,-2.5293933894,,, +13.8730468750,13,4.8900419088,-1.4289468458,2.8897165580,-2.2873058234,,, +13.8750000000,13,4.2016408732,-1.0954436586,2.0574468738,-2.0245634004,,, +13.8769531250,13,3.5324027234,-0.7959585278,1.2093102562,-1.7689607441,,, +13.8789062500,13,2.9430793321,-0.5512770177,0.4035028186,-1.5462131628,,, +13.8808593750,13,2.4821774416,-0.3720069183,-0.3100179648,-1.3774843562,,, +13.8828125000,13,2.1808203945,-0.2575818810,-0.8915397280,-1.2768541968,,, +13.8847656250,13,2.0482879754,-0.1960351740,-1.3132168833,-1.2490095708,,, +13.8867187500,13,2.0697339075,-0.1647991922,-1.5602915391,-1.2879606970,,, +13.8886718750,13,2.2078628035,-0.1346688151,-1.6321993956,-1.3774421977,,, +13.8906250000,13,2.4099065751,-0.0777277727,-1.5408890823,-1.4933755809,,, +13.8925781250,13,2.6179092008,0.0242818343,-1.3061899244,-1.6078459904,,, +13.8945312500,13,2.7781639009,0.1758838485,-0.9524059064,-1.6934208317,,, +13.8964843750,13,2.8486743033,0.3682617258,-0.5058333076,-1.7271903768,,, +13.8984375000,13,2.8030958773,0.5820484712,0.0077901655,-1.6932256538,,, +13.9003906250,13,2.6281271428,0.7923157530,0.5618270094,-1.5820657682,,, +13.9023437500,13,2.3176408103,0.9745332688,1.1244029994,-1.3887929233,,, +13.9042968750,13,1.8700849845,1.1084105991,1.6580288573,-1.1122624273,,, +13.9062500000,13,1.2890764707,1.1790829398,2.1232669524,-0.7553322680,,, +13.9082031250,13,0.5833969133,1.1781299947,2.4814810086,-0.3248058464,,, +13.9101562500,13,-0.2330461373,1.1051424027,2.6969359575,0.1684879063,,, +13.9121093750,13,-1.1392517655,0.9676855219,2.7410207561,0.7089392484,,, +13.9140625000,13,-2.1044811401,0.7785330303,2.5970051416,1.2755499995,,, +13.9160156250,13,-3.0862878244,0.5513340429,2.2632463984,1.8418592675,,, +13.9179687500,13,-4.0299805349,0.2968778498,1.7552360143,2.3764783330,,, +13.9199218750,13,-4.8717339198,0.0220018778,1.1054872104,2.8450323531,,, +13.9218750000,13,-5.5457021416,-0.2682926321,0.3602148455,3.2135125646,,, +13.9238281250,13,-5.9927735666,-0.5667147227,-0.4251075523,3.4520890178,,, +13.9257812500,13,-6.1686133373,-0.8601662680,-1.1893846915,3.5386874174,,, +13.9277343750,13,-6.0499054129,-1.1289651105,-1.8704027183,3.4619651300,,, +13.9296875000,13,-5.6391056414,-1.3484372956,-2.4125756871,3.2236025793,,, +13.9316406250,13,-4.9658630212,-1.4928700463,-2.7748455649,2.8391377528,,, +13.9335937500,13,-4.0825794026,-1.5419989793,-2.9343154653,2.3363308226,,, +13.9355468750,13,-3.0566554742,-1.4865246837,-2.8875286222,1.7517012522,,, +13.9375000000,13,-1.9623759209,-1.3297052719,-2.6506682642,1.1262497428,,, +13.9394531250,13,-0.8731911486,-1.0861875053,-2.2568093642,0.5011513894,,, +13.9414062500,13,0.1435754542,-0.7791780523,-1.7514643481,-0.0853457627,,, +13.9433593750,13,1.0301364573,-0.4362987805,-1.1865648985,-0.6000773152,,, +13.9453125000,13,1.7412839344,-0.0854398001,-0.6129414524,-1.0167978743,,, +13.9472656250,13,2.2447730757,0.2490448914,-0.0759883105,-1.3167298439,,, +13.9492187500,13,2.5202215957,0.5498603656,0.3854106762,-1.4885035387,,, +13.9511718750,13,2.5613877062,0.8080594951,0.7418143784,-1.5294386696,,, +13.9531250000,13,2.3809988151,1.0207688840,0.9770959994,-1.4475267261,,, +13.9550781250,13,2.0134260686,1.1872827645,1.0888860798,-1.2621793153,,, +13.9570312500,13,1.5131433880,1.3060914909,1.0867839259,-1.0029573740,,, +13.9589843750,13,0.9496869557,1.3736934479,0.9918020400,-0.7065587448,,, +13.9609375000,13,0.3999660087,1.3853517987,0.8355461458,-0.4127013328,,, +13.9628906250,13,-0.0616139378,1.3375208567,0.6560743632,-0.1593652882,,, +13.9648437500,13,-0.3736330277,1.2303974738,0.4914853043,0.0220894547,,, +13.9667968750,13,-0.4961311363,1.0690136208,0.3736670332,0.1109581458,,, +13.9687500000,13,-0.4153923042,0.8628587679,0.3234313189,0.0995393731,,, +13.9707031250,13,-0.1449300906,0.6251577280,0.3484831663,-0.0063527328,,, +13.9726562500,13,0.2777780800,0.3723831102,0.4445085941,-0.1890499742,,, +13.9746093750,13,0.7989024928,0.1233656245,0.5969169222,-0.4230018934,,, +13.9765625000,13,1.3571566456,-0.1024011823,0.7818659365,-0.6793734549,,, +13.9785156250,13,1.8907734354,-0.2866904237,0.9683423464,-0.9294296886,,, +13.9804687500,13,2.3421434963,-0.4145490627,1.1220061173,-1.1464450504,,, +13.9824218750,13,2.6595730048,-0.4763495000,1.2084150937,-1.3060363601,,, +13.9843750000,13,2.7964672387,-0.4685473903,1.1943388187,-1.3854486527,,, +13.9863281250,13,2.7120557535,-0.3925444489,1.0499829137,-1.3639881597,,, +13.9882812500,13,2.3764667664,-0.2534838049,0.7543321032,-1.2256570922,,, +13.9902343750,13,1.7779687472,-0.0604833262,0.3012459696,-0.9626763059,,, +13.9921875000,13,0.9289618053,0.1726276524,-0.2973183521,-0.5784477140,,, +13.9941406250,13,-0.1318066169,0.4275203012,-1.0128809698,-0.0889674193,,, +13.9960937500,13,-1.3409567418,0.6821082638,-1.8049707238,0.4776262598,,, +13.9980468750,13,-2.6141504540,0.9113346582,-2.6241199401,1.0827210566,,, +14.0000000000,14,-3.8523399725,1.0895482885,-3.4135373317,1.6801534765,33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000:10.0000000000:11.0000000000:12.0000000000:13.0000000000:14.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +14.0019531250,14,-4.9523467544,1.1946754495,-4.1137886670,2.2209770120,,, +14.0039062500,14,-5.8194628543,1.2116685868,-4.6700946005,2.6593031033,,, +14.0058593750,14,-6.3784079357,1.1341797297,-5.0380143997,2.9576799368,,, +14.0078125000,14,-6.5810592276,0.9649906036,-5.1862022263,3.0911271252,,, +14.0097656250,14,-6.4094511130,0.7145593318,-5.0969483399,3.0490464474,,, +14.0117187500,14,-5.8729042396,0.3978639152,-4.7647817563,2.8343125476,,, +14.0136718750,14,-5.0021064274,0.0315600248,-4.1953548137,2.4605702758,,, +14.0156250000,14,-3.8448406755,-0.3676742388,-3.4068936831,1.9500267050,,, +14.0175781250,14,-2.4637362329,-0.7843337305,-2.4315092245,1.3323067476,,, +14.0195312500,14,-0.9332697955,-1.2050607698,-1.3129150305,0.6431407409,,, +14.0214843750,14,0.6650750202,-1.6189285962,-0.1017028631,-0.0779127798,,, +14.0234375000,14,2.2486619619,-2.0163769485,1.1499724743,-0.7905198811,,, +14.0253906250,14,3.7386694041,-2.3865071832,2.3926782908,-1.4565204343,,, +14.0273437500,14,5.0630231961,-2.7138503287,3.5799060244,-2.0421671864,,, +14.0292968750,14,6.1591742155,-2.9772874334,4.6657202979,-2.5200781937,,, +14.0312500000,14,6.9788391108,-3.1534004627,5.6056032361,-2.8711958985,,, +14.0332031250,14,7.4929495823,-3.2223363132,6.3600192104,-3.0861669026,,, +14.0351562500,14,7.6931869705,-3.1713502137,6.8958949488,-3.1654066254,,, +14.0371093750,14,7.5895189048,-2.9950357929,7.1865635591,-3.1176675428,,, +14.0390625000,14,7.2062201149,-2.6951838536,7.2130746570,-2.9577206836,,, +14.0410156250,14,6.5780202142,-2.2813562251,6.9660998637,-2.7039298337,,, +14.0429687500,14,5.7458243673,-1.7709723050,6.4467865901,-2.3757663704,,, +14.0449218750,14,4.7519128655,-1.1882181517,5.6671537965,-1.9912979845,,, +14.0468750000,14,3.6366866501,-0.5616646146,4.6509797448,-1.5657571807,,, +14.0488281250,14,2.4387567510,0.0790399643,3.4349891988,-1.1121404950,,, +14.0507812500,14,1.1971383038,0.7062617132,2.0697094826,-0.6429758560,,, +14.0527343750,14,-0.0471988434,1.2959272359,0.6187196423,-0.1715653212,,, +14.0546875000,14,-1.2504044993,1.8264576306,-0.8441519697,0.2874604648,,, +14.0566406250,14,-2.3635642481,2.2758672294,-2.2378005339,0.7172286688,,, +14.0585937500,14,-3.3315447730,2.6202722029,-3.4772450343,1.0979957963,,, +14.0605468750,14,-4.0979965367,2.8361348807,-4.4814090969,1.4089224298,,, +14.0625000000,14,-4.6152872729,2.9051221943,-5.1847481477,1.6318194850,,, +14.0644531250,14,-4.8522596594,2.8190001011,-5.5457027403,1.7539194698,,, +14.0664062500,14,-4.7974302505,2.5831860158,-5.5488195043,1.7688367125,,, +14.0683593750,14,-4.4603767305,2.2183012234,-5.2041513998,1.6770983310,,, +14.0703125000,14,-3.8717846507,1.7587686821,-4.5463007050,1.4865166695,,, +14.0722656250,14,-3.0809273193,1.2487597633,-3.6320775419,1.2117432252,,, +14.0742187500,14,-2.1513717729,0.7374336283,-2.5369342381,0.8730657491,,, +14.0761718750,14,-1.1565210027,0.2743782987,-1.3511896402,0.4950965333,,, +14.0781250000,14,-0.1751335684,-0.0952564949,-0.1744731244,0.1056382838,,, +14.0800781250,14,0.7139435206,-0.3351803639,0.8929967254,-0.2657480309,,, +14.0820312500,14,1.4382641421,-0.4209830449,1.7608576982,-0.5900070699,,, +14.0839843750,14,1.9392778358,-0.3428648803,2.3593261851,-0.8414582957,,, +14.0859375000,14,2.1789576594,-0.1079024113,2.6479050140,-1.0004309168,,, +14.0878906250,14,2.1426006079,0.2607600813,2.6178526257,-1.0548203883,,, +14.0898437500,14,1.8377539365,0.7280398867,2.2884095657,-1.0005790557,,, +14.0917968750,14,1.2925058592,1.2514063264,1.7016160108,-0.8420169737,,, +14.0937500000,14,0.5541416746,1.7840207804,0.9172409040,-0.5920209089,,, +14.0957031250,14,-0.3140600170,2.2773570903,0.0061209584,-0.2712338370,,, +14.0976562500,14,-1.2386185933,2.6836156734,-0.9567549649,0.0942265403,,, +14.0996093750,14,-2.1429232462,2.9576443937,-1.8971479776,0.4759810831,,, +14.1015625000,14,-2.9547563421,3.0597259292,-2.7454050256,0.8467383554,,, +14.1035156250,14,-3.6133456365,2.9603007171,-3.4404681926,1.1829728424,,, +14.1054687500,14,-4.0737921740,2.6448846410,-3.9327778530,1.4661734312,,, +14.1074218750,14,-4.3077218096,2.1167255858,-4.1854939775,1.6825674120,,, +14.1093750000,14,-4.3019678887,1.3966929719,-4.1760518211,1.8223006993,,, +14.1113281250,14,-4.0574933285,0.5214842028,-3.8986381940,1.8790326680,,, +14.1132812500,14,-3.5887967314,-0.4588622448,-3.3659027521,1.8499853743,,, +14.1152343750,14,-2.9230509929,-1.4844779798,-2.6087111961,1.7361832520,,, +14.1171875000,14,-2.0984324875,-2.4907516559,-1.6731087549,1.5427484613,,, +14.1191406250,14,-1.1617019901,-3.4139025951,-0.6152205153,1.2790120271,,, +14.1210937500,14,-0.1656399469,-4.1958963457,0.5032678414,0.9583781716,,, +14.1230468750,14,0.8333917769,-4.7889983131,1.6187707748,0.5981340264,,, +14.1250000000,14,1.7782091194,-5.1591247257,2.6699775306,0.2188673487,,, +14.1269531250,14,2.6139607042,-5.2863669332,3.6009500175,-0.1569606950,,, +14.1289062500,14,3.2913661790,-5.1642423818,4.3617984932,-0.5068645284,,, +14.1308593750,14,3.7701389428,-4.7997886670,4.9096542774,-0.8100851462,,, +14.1328125000,14,4.0223553355,-4.2134112243,5.2114742028,-1.0492695321,,, +14.1347656250,14,4.0350567209,-3.4374308043,5.2466156054,-1.2120166866,,, +14.1367187500,14,3.8122680248,-2.5141739536,5.0089226344,-1.2922289967,,, +14.1386718750,14,3.3772915770,-1.4944047309,4.5096906830,-1.2915126075,,, +14.1406250000,14,2.7740102700,-0.4356279368,3.7796154088,-1.2201322138,,, +14.1425781250,14,2.0638023957,0.6007540203,2.8673919491,-1.0959969436,,, +14.1445312500,14,1.3176043163,1.5532024255,1.8364200224,-0.9413234133,,, +14.1464843750,14,0.6066531133,2.3641186937,0.7605768867,-0.7787288297,,, +14.1484375000,14,-0.0057127171,2.9845234707,-0.2826919147,-0.6281623663,,, +14.1503906250,14,-0.4709918814,3.3789153259,-1.2215139788,-0.5046505134,,, +14.1523437500,14,-0.7598611218,3.5288679785,-1.9978100929,-0.4171231980,,, +14.1542968750,14,-0.8622538527,3.4345400413,-2.5721281364,-0.3689330579,,, +14.1562500000,14,-0.7839343038,3.1141183225,-2.9236456385,-0.3596144041,,, +14.1582031250,14,-0.5421277913,2.6015002724,-3.0463029631,-0.3866255603,,, +14.1601562500,14,-0.1624565543,1.9430323947,-2.9457316840,-0.4462176891,,, +14.1621093750,14,0.3222983390,1.1945083358,-2.6396293451,-0.5334858731,,, +14.1640625000,14,0.8723549929,0.4185788202,-2.1582353023,-0.6419080993,,, +14.1660156250,14,1.4403198486,-0.3186844682,-1.5429399797,-0.7622169262,,, +14.1679687500,14,1.9706425484,-0.9529337565,-0.8456518384,-0.8809557218,,, +14.1699218750,14,2.4022498278,-1.4280676073,-0.1278013057,-0.9803927269,,, +14.1718750000,14,2.6763162818,-1.7029768911,0.5450687745,-1.0409468667,,, +14.1738281250,14,2.7460869883,-1.7567045987,1.1114597959,-1.0449385970,,, +14.1757812500,14,2.5843164190,-1.5910719288,1.5206924497,-0.9796569382,,, +14.1777343750,14,2.1873612886,-1.2312504049,1.7382751158,-0.8391564581,,, +14.1796875000,14,1.5763532991,-0.7237183109,1.7506187100,-0.6251321299,,, +14.1816406250,14,0.7946276041,-0.1303007674,1.5671970050,-0.3467742726,,, +14.1835937500,14,-0.0976979095,0.4799828977,1.2197011934,-0.0197151520,,, +14.1855468750,14,-1.0291156432,1.0379269348,0.7598667039,0.3351772763,,, +14.1875000000,14,-1.9230403337,1.4801672187,0.2531452473,0.6935595063,,, +14.1894531250,14,-2.7073514146,1.7562800036,-0.2347070210,1.0306621769,,, +14.1914062500,14,-3.3236924624,1.8357451658,-0.6509410720,1.3242673992,,, +14.1933593750,14,-3.7317426087,1.7112148900,-0.9607221501,1.5560772427,,, +14.1953125000,14,-3.9081547502,1.3961303607,-1.1452592104,1.7117112501,,, +14.1972656250,14,-3.8434223730,0.9186164960,-1.1986614237,1.7804885410,,, +14.1992187500,14,-3.5414835360,0.3167014833,-1.1267031964,1.7563016591,,, +14.2011718750,14,-3.0229952120,-0.3628446540,-0.9471995940,1.6395529808,,, +14.2031250000,14,-2.3276851276,-1.0648803936,-0.6887358961,1.4384431284,,, +14.2050781250,14,-1.5132267989,-1.7278484071,-0.3874302466,1.1688169808,,, +14.2070312500,14,-0.6520198775,-2.2875193098,-0.0853048608,0.8533082554,,, +14.2089843750,14,0.1741534821,-2.6827486984,0.1701889617,0.5198638481,,, +14.2109375000,14,0.8822466480,-2.8624969491,0.3298398943,0.1991830508,,, +14.2128906250,14,1.3972453442,-2.7924134211,0.3496833001,-0.0785088158,,, +14.2148437500,14,1.6610751610,-2.4598992205,0.1977490992,-0.2868054692,,, +14.2167968750,14,1.6404402031,-1.8765673345,-0.1408657073,-0.4064975375,,, +14.2187500000,14,1.3318104022,-1.0769471842,-0.6601155550,-0.4283764088,,, +14.2207031250,14,0.7622179034,-0.1142410319,-1.3309201208,-0.3545954278,,, +14.2226562500,14,-0.0130446002,0.9445278206,-2.1014570693,-0.1985749276,,, +14.2246093750,14,-0.9156273514,2.0233194019,-2.8994934774,0.0165935633,,, +14.2265625000,14,-1.8535353176,3.0430150065,-3.6377151472,0.2616166829,,, +14.2285156250,14,-2.7330620164,3.9287763183,-4.2236467752,0.5054168047,,, +14.2304687500,14,-3.4694037852,4.6172473222,-4.5727722864,0.7188949878,,, +14.2324218750,14,-3.9935944253,5.0615294848,-4.6208010610,0.8773275020,,, +14.2343750000,14,-4.2557814948,5.2331710480,-4.3324296718,0.9616560702,,, +14.2363281250,14,-4.2269379096,5.1223251025,-3.7059162610,0.9594869363,,, +14.2382812500,14,-3.9003314052,4.7377794063,-2.7729171197,0.8659583811,,, +14.2402343750,14,-3.2921393290,4.1067102714,-1.5945688707,0.6841117304,,, +14.2421875000,14,-2.4412487479,3.2725404452,-0.2558911937,0.4252079240,,, +14.2441406250,14,-1.4084837531,2.2906192654,1.1416417517,0.1092147772,,, +14.2460937500,14,-0.2732124886,1.2229335994,2.4903866947,-0.2358842187,,, +14.2480468750,14,0.8749229674,0.1330162120,3.6883270481,-0.5773598394,,, +14.2500000000,14,1.9477073775,-0.9184526668,4.6499564332,-0.8829007184,,, +14.2519531250,14,2.8690846545,-1.8775714760,5.3143606438,-1.1253459890,,, +14.2539062500,14,3.5817531792,-2.7009738277,5.6482675501,-1.2852505725,,, +14.2558593750,14,4.0505913947,-3.3593070821,5.6444774418,-1.3517508345,,, +14.2578125000,14,4.2654965981,-3.8396386584,5.3204975381,-1.3233385135,,, +14.2597656250,14,4.2425639285,-4.1453097392,4.7188576980,-1.2084888149,,, +14.2617187500,14,4.0205173609,-4.2925606780,3.9047102200,-1.0246865005,,, +14.2636718750,14,3.6534936367,-4.3059929843,2.9594322940,-0.7958032674,,, +14.2656250000,14,3.2045174841,-4.2159068579,1.9737704480,-0.5492785362,,, +14.2675781250,14,2.7401268505,-4.0565261795,1.0412348085,-0.3136016180,,, +14.2695312500,14,2.3231697538,-3.8617489123,0.2492112115,-0.1154345967,,, +14.2714843750,14,2.0046707398,-3.6594173923,-0.3317201578,0.0233839737,,, +14.2734375000,14,1.8178614669,-3.4675708377,-0.6572326308,0.0882500523,,, +14.2753906250,14,1.7745837313,-3.2929537353,-0.7158625904,0.0735782608,,, +14.2773437500,14,1.8647793602,-3.1307030556,-0.5302617549,-0.0168297299,,, +14.2792968750,14,2.0609950344,-2.9660320542,-0.1503113005,-0.1717743824,,, +14.2812500000,14,2.3259674478,-2.7783623051,0.3583883694,-0.3757818161,,, +14.2832031250,14,2.6188448421,-2.5458186516,0.9244769578,-0.6114111973,,, +14.2851562500,14,2.8980647946,-2.2481548199,1.4781274389,-0.8602427380,,, +14.2871093750,14,3.1217858859,-1.8684166045,1.9561944968,-1.1029448570,,, +14.2890625000,14,3.2485189819,-1.3944396167,2.3049931409,-1.3193941386,,, +14.2910156250,14,3.2406308299,-0.8209721132,2.4827892265,-1.4900234242,,, +14.2929687500,14,3.0704733173,-0.1522662451,2.4632034240,-1.5983391637,,, +14.2949218750,14,2.7260742007,0.5960717877,2.2373950103,-1.6332871783,,, +14.2968750000,14,2.2138256156,1.3965758137,1.8142080696,-1.5903853370,,, +14.2988281250,14,1.5575286438,2.2111445861,1.2193689452,-1.4715694280,,, +14.3007812500,14,0.7936880418,2.9952229562,0.4927727204,-1.2839851545,,, +14.3027343750,14,-0.0357860139,3.7042017626,-0.3167979391,-1.0379927734,,, +14.3046875000,14,-0.8898667177,4.2985947586,-1.1564161056,-0.7453540253,,, +14.3066406250,14,-1.7319877282,4.7466600953,-1.9725798258,-0.4180666873,,, +14.3085937500,14,-2.5329284153,5.0265609097,-2.7171287607,-0.0671745898,,, +14.3105468750,14,-3.2726794365,5.1285099792,-3.3533186251,0.2979819460,,, +14.3125000000,14,-3.9386255812,5.0547361763,-3.8571992080,0.6690224877,,, +14.3144531250,14,-4.5210930199,4.8168436629,-4.2165815135,1.0371468510,,, +14.3164062500,14,-5.0095642132,4.4321900804,-4.4301506938,1.3924437405,,, +14.3183593750,14,-5.3912172227,3.9208780788,-4.5048073152,1.7239377168,,, +14.3203125000,14,-5.6519183132,3.3047617579,-4.4516653823,2.0199824100,,, +14.3222656250,14,-5.7789955614,2.6083828559,-4.2836594844,2.2690127413,,, +14.3242187500,14,-5.7649630099,1.8598565713,-4.0151998092,2.4609255608,,, +14.3261718750,14,-5.6110764563,1.0908809703,-3.6625539689,2.5886753058,,, +14.3281250000,14,-5.3287192559,0.3361200964,-3.2445757696,2.6490920958,,, +14.3300781250,14,-4.9375383116,-0.3689260514,-2.7828279208,2.6426605511,,, +14.3320312500,14,-4.4621721665,-0.9912317672,-2.3001160235,2.5728733591,,, +14.3339843750,14,-3.9301799270,-1.5021763660,-1.8196532627,2.4457616150,,, +14.3359375000,14,-3.3711979078,-1.8776235120,-1.3661722848,2.2696455510,,, +14.3378906250,14,-2.8150289637,-2.0993502448,-0.9650950319,2.0546383854,,, +14.3398437500,14,-2.2873935998,-2.1591730596,-0.6374381061,1.8114492408,,, +14.3417968750,14,-1.8050341295,-2.0622713426,-0.3939339490,1.5495657168,,, +14.3437500000,14,-1.3731239006,-1.8270760679,-0.2313346862,1.2756767776,,, +14.3457031250,14,-0.9862805588,-1.4829202098,-0.1309740286,0.9932639907,,, +14.3476562500,14,-0.6317727794,-1.0668174797,-0.0610359742,0.7033479209,,, +14.3496093750,14,-0.2936158567,-0.6193047100,0.0155936423,0.4060598111,,, +14.3515625000,14,0.0437780223,-0.1801149052,0.1321577939,0.1021284438,,, +14.3535156250,14,0.3958049346,0.2141221810,0.3144792997,-0.2074157941,,, +14.3554687500,14,0.7810457296,0.5302994448,0.5820066270,-0.5228847405,,, +14.3574218750,14,1.2216015922,0.7401286251,0.9478843392,-0.8463904131,,, +14.3593750000,14,1.7374788641,0.8230686126,1.4162162271,-1.1799286340,,, +14.3613281250,14,2.3379945160,0.7691933511,1.9779560112,-1.5220152158,,, +14.3632812500,14,3.0150841542,0.5806649380,2.6088980124,-1.8650293416,,, +14.3652343750,14,3.7417562596,0.2718137781,3.2720734420,-2.1950645886,,, +14.3671875000,14,4.4751958436,-0.1317888532,3.9220103606,-2.4938151610,,, +14.3691406250,14,5.1622946495,-0.5957857101,4.5082299086,-2.7408493486,,, +14.3710937500,14,5.7467349537,-1.0816296438,4.9797688652,-2.9159066600,,, +14.3730468750,14,6.1770307054,-1.5519057311,5.2914430526,-3.0015761424,,, +14.3750000000,14,6.4137723623,-1.9740080341,5.4084013613,-2.9858649560,,, +14.3769531250,14,6.4343784806,-2.3218994105,5.3081990069,-2.8639223998,,, +14.3789062500,14,6.2343237547,-2.5771973703,4.9832994719,-2.6385917059,,, +14.3808593750,14,5.8248311475,-2.7298388261,4.4435633772,-2.3196413192,,, +14.3828125000,14,5.2286984696,-2.7776658580,3.7158879106,-1.9221318801,,, +14.3847656250,14,4.4760413533,-2.7248465969,2.8410418547,-1.4647253957,,, +14.3867187500,14,3.6008854975,-2.5796490384,1.8692544704,-0.9683527696,,, +14.3886718750,14,2.6399317993,-2.3523220407,0.8554506927,-0.4555589645,,, +14.3906250000,14,1.6340655370,-2.0542874205,-0.1445436680,0.0494315108,,, +14.3925781250,14,0.6304823226,-1.6988101957,-1.0760982392,0.5206313476,,, +14.3945312500,14,-0.3174418406,-1.3017539897,-1.8879364806,0.9311460312,,, +14.3964843750,14,-1.1532141441,-0.8820317478,-2.5356615825,1.2553509575,,, +14.3984375000,14,-1.8220862368,-0.4621285675,-2.9850496646,1.4717577017,,, +14.4003906250,14,-2.2772952802,-0.0674549749,-3.2143166529,1.5658161681,,, +14.4023437500,14,-2.4882453222,0.2767309907,-3.2166872781,1.5326666312,,, +14.4042968750,14,-2.4487929453,0.5496992708,-3.0024004102,1.3792686558,,, +14.4062500000,14,-2.1813409090,0.7387398148,-2.5981650248,1.1245735744,,, +14.4082031250,14,-1.7352653764,0.8412651868,-2.0456831022,0.7977732728,,, +14.4101562500,14,-1.1810367557,0.8653758217,-1.4003404237,0.4355036280,,, +14.4121093750,14,-0.6001937827,0.8267518321,-0.7270240245,0.0781481528,,, +14.4140625000,14,-0.0724531602,0.7428952157,-0.0926212303,-0.2347346991,,, +14.4160156250,14,0.3356053739,0.6301915896,0.4413639034,-0.4693453567,,, +14.4179687500,14,0.5763762072,0.5049864423,0.8242851146,-0.6015123661,,, +14.4199218750,14,0.6206987867,0.3854116371,1.0191493411,-0.6178273249,,, +14.4218750000,14,0.4534903404,0.2924106218,1.0029753761,-0.5144722286,,, +14.4238281250,14,0.0699775786,0.2492104383,0.7675116392,-0.2958152335,,, +14.4257812500,14,-0.5252516120,0.2786618216,0.3209122165,0.0264035680,,, +14.4277343750,14,-1.3175175871,0.3999079623,-0.3128863152,0.4340049834,,, +14.4296875000,14,-2.2807394151,0.6257172502,-1.0976071837,0.9035919591,,, +14.4316406250,14,-3.3749025636,0.9601637576,-1.9872532309,1.4071086827,,, +14.4335937500,14,-4.5431291708,1.3969003779,-2.9271823738,1.9117379434,,, +14.4355468750,14,-5.7117974915,1.9187426536,-3.8564621017,2.3808027556,,, +14.4375000000,14,-6.7949066313,2.4977670598,-4.7113773661,2.7763521909,,, +14.4394531250,14,-7.7005299665,3.0952866532,-5.4281062253,3.0623688231,,, +14.4414062500,14,-8.3379998010,3.6632156769,-5.9454945479,3.2077809929,,, +14.4433593750,14,-8.6261129400,4.1482486910,-6.2094375074,3.1891722416,,, +14.4453125000,14,-8.5030918892,4.4981993848,-6.1782306900,2.9934159131,,, +14.4472656250,14,-7.9372679832,4.6684635261,-5.8279851477,2.6204023977,,, +14.4492187500,14,-6.9339576340,4.6266893377,-5.1573427987,2.0848932360,,, +14.4511718750,14,-5.5351407308,4.3554305514,-4.1893274523,1.4158443165,,, +14.4531250000,14,-3.8135850070,3.8538213955,-2.9691368625,0.6529908620,,, +14.4550781250,14,-1.8647061130,3.1386252225,-1.5604895303,-0.1575910176,,, +14.4570312500,14,0.2019480832,2.2438702115,-0.0423140590,-0.9674287241,,, +14.4589843750,14,2.2707473778,1.2182691075,1.4963957113,-1.7290362966,,, +14.4609375000,14,4.2273983395,0.1209019298,2.9640319686,-2.3989686728,,, +14.4628906250,14,5.9659482503,-0.9838578245,4.2737570502,-2.9403629961,,, +14.4648437500,14,7.3952343464,-2.0321824474,5.3503969459,-3.3248527894,,, +14.4667968750,14,8.4440459389,-2.9668447394,6.1369526250,-3.5338768420,,, +14.4687500000,14,9.0645989615,-3.7416434223,6.5989861278,-3.5594713500,,, +14.4707031250,14,9.2351910266,-4.3237406655,6.7264795838,-3.4049109071,,, +14.4726562500,14,8.9624962692,-4.6948294999,6.5343701425,-3.0853020495,,, +14.4746093750,14,8.2818721897,-4.8507533535,6.0608434845,-2.6273525449,,, +14.4765625000,14,7.2554310490,-4.8001339274,5.3627492002,-2.0677475325,,, +14.4785156250,14,5.9699281954,-4.5648022773,4.5111659517,-1.4506567086,,, +14.4804687500,14,4.5324814077,-4.1803858172,3.5873831264,-0.8245630612,,, +14.4824218750,14,3.0605069470,-3.6924038946,2.6758035232,-0.2380858116,,, +14.4843750000,14,1.6693898074,-3.1501090171,1.8555556260,0.2643635020,,, +14.4863281250,14,0.4627029629,-2.6027641174,1.1943267419,0.6463309661,,, +14.4882812500,14,-0.4763336479,-2.0967648873,0.7422482378,0.8830202085,,, +14.4902343750,14,-1.0929719310,-1.6709473861,0.5251870508,0.9643273123,,, +14.4921875000,14,-1.3660386433,-1.3512563234,0.5411373225,0.8955220901,,, +14.4941406250,14,-1.3089584104,-1.1470006722,0.7604880465,0.6958575935,,, +14.4960937500,14,-0.9669648436,-1.0506396273,1.1290749817,0.3964878894,,, +14.4980468750,14,-0.4108959205,-1.0412987560,1.5744320311,0.0378057250,,, +14.5000000000,14,0.2701959482,-1.0891614802,2.0142769806,-0.3340619231,,, +14.5019531250,14,0.9760092554,-1.1586395369,2.3655349036,-0.6714550111,,, +14.5039062500,14,1.6028440188,-1.2108579317,2.5534971145,-0.9301215813,,, +14.5058593750,14,2.0528135999,-1.2062658635,2.5198803668,-1.0742144043,,, +14.5078125000,14,2.2429294064,-1.1081868991,2.2280277232,-1.0797364426,,, +14.5097656250,14,2.1134119318,-0.8875806645,1.6655002826,-0.9360844337,,, +14.5117187500,14,1.6348114801,-0.5276005482,0.8447466562,-0.6464849099,,, +14.5136718750,14,0.8125280523,-0.0263500022,-0.1990710958,-0.2272720903,,, +14.5156250000,14,-0.3129257486,0.6027290280,-1.4131254744,0.2943030051,,, +14.5175781250,14,-1.6705825404,1.3323788061,-2.7325810944,0.8831883746,,, +14.5195312500,14,-3.1668666659,2.1240722471,-4.0852023461,1.4996924730,,, +14.5214843750,14,-4.6943528332,2.9315991787,-5.3956194075,2.1022976240,,, +14.5234375000,14,-6.1406910249,3.7056219393,-6.5894986727,2.6500574473,,, +14.5253906250,14,-7.3972718347,4.3979838317,-7.5963591312,3.1044215500,,, +14.5273437500,14,-8.3675071418,4.9652756387,-8.3522607643,3.4310892031,,, +14.5292968750,14,-8.9743846404,5.3715180691,-8.8040470690,3.6025962644,,, +14.5312500000,14,-9.1655050271,5.5889216112,-8.9129367747,3.6008116204,,, +14.5332031250,14,-8.9142118907,5.5968898011,-8.6562154888,3.4184255521,,, +14.5351562500,14,-8.2180776734,5.3814352673,-8.0289157441,3.0595838528,,, +14.5371093750,14,-7.0982026413,4.9366430061,-7.0453004304,2.5396878243,,, +14.5390625000,14,-5.6002282029,4.2672337647,-5.7382279033,1.8841073787,,, +14.5410156250,14,-3.7935205839,3.3902661034,-4.1570940260,1.1261038489,,, +14.5429687500,14,-1.7674671518,2.3356434016,-2.3662149383,0.3047249386,,, +14.5449218750,14,0.3722603369,1.1458615871,-0.4431384336,-0.5370291456,,, +14.5468750000,14,2.5073689271,-0.1249555091,1.5240721354,-1.3541990660,,, +14.5488281250,14,4.5126606943,-1.4126026007,3.4395475727,-2.1020754080,,, +14.5507812500,14,6.2642663501,-2.6455334378,5.2021833636,-2.7382671822,,, +14.5527343750,14,7.6499651813,-3.7495073075,6.7101714162,-3.2250763498,,, +14.5546875000,14,8.5808243664,-4.6534170110,7.8685999140,-3.5328616565,,, +14.5566406250,14,9.0021948262,-5.2959190567,8.5995598146,-3.6438864485,,, +14.5585937500,14,8.9007191915,-5.6325431526,8.8531232044,-3.5552896637,,, +14.5605468750,14,8.3038885672,-5.6405418287,8.6146467096,-3.2796507455,,, +14.5625000000,14,7.2728658835,-5.3199253616,7.9050942295,-2.8426723745,,, +14.5644531250,14,5.8957804192,-4.6936074185,6.7790049870,-2.2805028347,,, +14.5664062500,14,4.2847640578,-3.8079895858,5.3236448477,-1.6384109373,,, +14.5683593750,14,2.5681916913,-2.7300493396,3.6527410741,-0.9675137301,,, +14.5703125000,14,0.8750008756,-1.5396273259,1.8926358659,-0.3184178601,,, +14.5722656250,14,-0.6774489653,-0.3216214135,0.1700493617,0.2634961536,,, +14.5742187500,14,-1.9867290898,0.8391391780,-1.3950442914,0.7396863990,,, +14.5761718750,14,-2.9671789132,1.8621076377,-2.6961384232,1.0800553967,,, +14.5781250000,14,-3.5543548534,2.6759471948,-3.6469810540,1.2647867575,,, +14.5800781250,14,-3.7101892098,3.2240656295,-4.1860106610,1.2847535634,,, +14.5820312500,14,-3.4270068045,3.4693283775,-4.2788150092,1.1410773572,,, +14.5839843750,14,-2.7296834538,3.3962646467,-3.9198145052,0.8452237327,,, +14.5859375000,14,-1.6766834722,3.0114128307,-3.1341810328,0.4199390146,,, +14.5878906250,14,-0.3602940697,2.3438433030,-1.9805555250,-0.0996734325,,, +14.5898437500,14,1.0972917599,1.4451558107,-0.5515473840,-0.6667729535,,, +14.5917968750,14,2.5550475540,0.3864418968,1.0321801653,-1.2265886153,,, +14.5937500000,14,3.8689014834,-0.7478882777,2.6331134606,-1.7222907069,,, +14.5957031250,14,4.9078332614,-1.8676897445,4.1093295684,-2.1007674756,,, +14.5976562500,14,5.5677783508,-2.8851501926,5.3271366606,-2.3177350078,,, +14.5996093750,14,5.7815185786,-3.7225141850,6.1738070715,-2.3422422018,,, +14.6015625000,14,5.5228559847,-4.3177206843,6.5676271038,-2.1597066587,,, +14.6035156250,14,4.8043681580,-4.6267948598,6.4626736313,-1.7726545711,,, +14.6054687500,14,3.6702038697,-4.6236322764,5.8492264677,-1.1996848338,,, +14.6074218750,14,2.1881707078,-4.2991480817,4.7521520722,-0.4735859459,,, +14.6093750000,14,0.4449963660,-3.6614794521,3.2283888331,0.3610908642,,, +14.6113281250,14,-1.4554355132,-2.7371539416,1.3640998266,1.2506374169,,, +14.6132812500,14,-3.3944433474,-1.5720381744,-0.7286165876,2.1349959768,,, +14.6152343750,14,-5.2443694263,-0.2307991206,-2.9171197480,2.9515823911,,, +14.6171875000,14,-6.8772610830,1.2061636483,-5.0567859657,3.6400250769,,, +14.6191406250,14,-8.1744300141,2.6480699802,-7.0016858784,4.1469632069,,, +14.6210937500,14,-9.0369335475,4.0004220773,-8.6164767977,4.4309971785,,, +14.6230468750,14,-9.3981468697,5.1729376073,-9.7892825433,4.4679038544,,, +14.6250000000,14,-9.2354135477,6.0880171435,-10.4428805332,4.2543642378,,, +14.6269531250,14,-8.5742539329,6.6877168069,-10.5409188733,3.8082745690,,, +14.6289062500,14,-7.4839459981,6.9384835783,-10.0898080705,3.1662757540,,, +14.6308593750,14,-6.0680544584,6.8328340351,-9.1369865877,2.3800158982,,, +14.6328125000,14,-4.4514139350,6.3864318721,-7.7641461010,1.5114846433,,, +14.6347656250,14,-2.7655312592,5.6331843421,-6.0776316246,0.6276381778,,, +14.6367187500,14,-1.1363828520,4.6228456659,-4.1999999964,-0.2052427486,,, +14.6386718750,14,0.3240916297,3.4202176729,-2.2623325580,-0.9270733398,,, +14.6406250000,14,1.5246276440,2.1024778349,-0.3955524615,-1.4887234738,,, +14.6425781250,14,2.4006549967,0.7539498814,1.2790382280,-1.8556384953,,, +14.6445312500,14,2.9186144205,-0.5406095523,2.6597031674,-2.0106400036,,, +14.6464843750,14,3.0771836529,-1.7028355715,3.6737374300,-1.9559518030,,, +14.6484375000,14,2.9058659316,-2.6666905782,4.2843537997,-1.7137545890,,, +14.6503906250,14,2.4624639293,-3.3836867197,4.4942501401,-1.3249030070,,, +14.6523437500,14,1.8295768516,-3.8273412186,4.3453522441,-0.8455512689,,, +14.6542968750,14,1.1086025552,-3.9957716763,3.9130109417,-0.3409629215,,, +14.6562500000,14,0.4108465154,-3.9119192520,3.2955666637,0.1227154057,,, +14.6582031250,14,-0.1533598252,-3.6210212745,2.6029693830,0.4859012747,,, +14.6601562500,14,-0.4866819641,-3.1846014973,1.9458219578,0.7007118613,,, +14.6621093750,14,-0.5163199779,-2.6722449640,1.4241295435,0.7348567315,,, +14.6640625000,14,-0.2030041179,-2.1537707849,1.1170934649,0.5747646840,,, +14.6660156250,14,0.4532614700,-1.6921764793,1.0757977178,0.2267585423,,, +14.6679687500,14,1.4108559935,-1.3365845109,1.3181189442,-0.2838125009,,, +14.6699218750,14,2.5895664703,-1.1172048227,1.8264097848,-0.9147326271,,, +14.6718750000,14,3.8798630381,-1.0446433121,2.5503037430,-1.6105170609,,, +14.6738281250,14,5.1547698072,-1.1115972278,3.4129515852,-2.3070794412,,, +14.6757812500,14,6.2820257216,-1.2941271821,4.3176841900,-2.9369493550,,, +14.6777343750,14,7.1379810893,-1.5534510846,5.1566684807,-3.4357665259,,, +14.6796875000,14,7.6217114894,-1.8403896232,5.8230997485,-3.7495966293,,, +14.6816406250,14,7.6651555718,-2.1020153799,6.2238964046,-3.8406703782,,, +14.6835937500,14,7.2374043411,-2.2879510835,6.2890269927,-3.6902420081,,, +14.6855468750,14,6.3440679047,-2.3546562403,5.9768147377,-3.2993657954,,, +14.6875000000,14,5.0243268679,-2.2681316113,5.2763956644,-2.6884687657,,, +14.6894531250,14,3.3480866231,-2.0060469459,4.2078802179,-1.8956762439,,, +14.6914062500,14,1.4137631382,-1.5599370097,2.8211131697,-0.9741411389,,, +14.6933593750,14,-0.6548156307,-0.9374934892,1.1935107952,0.0114728872,,, +14.6953125000,14,-2.7147687377,-0.1641347818,-0.5746375227,0.9902592190,,, +14.6972656250,14,-4.6148394987,0.7173382562,-2.3681228262,1.8918821653,,, +14.6992187500,14,-6.2099055196,1.6497336581,-4.0667716837,2.6533750791,,, +14.7011718750,14,-7.3775085311,2.5666147184,-5.5563724460,3.2252721645,,, +14.7031250000,14,-8.0321607785,3.3983099067,-6.7386272915,3.5760920099,,, +14.7050781250,14,-8.1333921548,4.0778850595,-7.5373512468,3.6933166435,,, +14.7070312500,14,-7.6873753805,4.5470995096,-7.9014384896,3.5812929244,,, +14.7089843750,14,-6.7438247832,4.7622725354,-7.8075641188,3.2586502006,,, +14.7109375000,14,-5.3891101218,4.6985562803,-7.2628731770,2.7566270523,,, +14.7128906250,14,-3.7372075510,4.3519049574,-6.3062188553,2.1178277141,,, +14.7148437500,14,-1.9199140804,3.7401091702,-5.0073260476,1.3940664396,,, +14.7167968750,14,-0.0752951842,2.9026091124,-3.4622711868,0.6421543389,,, +14.7187500000,14,1.6650056521,1.8973062687,-1.7848932850,-0.0813708068,,, +14.7207031250,14,3.1852569122,0.7952689239,-0.0972565690,-0.7244427781,,, +14.7226562500,14,4.3901931984,-0.3248939179,1.4794752491,-1.2427182195,,, +14.7246093750,14,5.2077514536,-1.3834172352,2.8353987455,-1.6031935284,,, +14.7265625000,14,5.5924896494,-2.3061201805,3.8819506465,-1.7874943916,,, +14.7285156250,14,5.5288079385,-3.0295220753,4.5578439556,-1.7930821719,,, +14.7304687500,14,5.0326355971,-3.5047316541,4.8314764147,-1.6324199189,,, +14.7324218750,14,4.1517827276,-3.7017431451,4.7028019546,-1.3312910880,,, +14.7343750000,14,2.9646588149,-3.6131471597,4.2033842585,-0.9259367265,,, +14.7363281250,14,1.5753497769,-3.2551828966,3.3921041140,-0.4583722067,,, +14.7382812500,14,0.1041174504,-2.6660501792,2.3482972063,0.0286032756,,, +14.7402343750,14,-1.3246570368,-1.9024653558,1.1650568523,0.4950057265,,, +14.7421875000,14,-2.5944399163,-1.0344464915,-0.0575321146,0.9058881959,,, +14.7441406250,14,-3.6073923209,-0.1384363847,-1.2199316193,1.2327979572,,, +14.7460937500,14,-4.2941313281,0.7098587893,-2.2310585652,1.4551880080,,, +14.7480468750,14,-4.6214700831,1.4422515429,-3.0162946555,1.5620902858,,, +14.7500000000,14,-4.5952030927,2.0045681781,-3.5243793776,1.5529027750,,, +14.7519531250,14,-4.2557757259,2.3614420139,-3.7307816216,1.4362550145,,, +14.7539062500,14,-3.6684312782,2.4977194648,-3.6370349391,1.2278808202,,, +14.7558593750,14,-2.9116740058,2.4172410405,-3.2677885312,0.9485955907,,, +14.7578125000,14,-2.0669260972,2.1404743376,-2.6665312746,0.6221566441,,, +14.7597656250,14,-1.2095353808,1.7005699325,-1.8892135086,0.2726339987,,, +14.7617187500,14,-0.4011052711,1.1382018693,-0.9966141600,-0.0782753343,,, +14.7636718750,14,0.3139142761,0.4976507344,-0.0488051526,-0.4129298076,,, +14.7656250000,14,0.9059442938,-0.1752080799,0.8970337639,-0.7178519984,,, +14.7675781250,14,1.3557130852,-0.8340367564,1.7865590957,-0.9825142143,,, +14.7695312500,14,1.6517861462,-1.4330333900,2.5677586766,-1.1978609016,,, +14.7714843750,14,1.7926460225,-1.9299291830,3.1936511347,-1.3562157800,,, +14.7734375000,14,1.7912932116,-2.2917119420,3.6284623445,-1.4522844992,,, +14.7753906250,14,1.6760361233,-2.4988162117,3.8514350613,-1.4832774361,,, +14.7773437500,14,1.4852139386,-2.5448196113,3.8562757169,-1.4486031327,,, +14.7792968750,14,1.2602697069,-2.4341010045,3.6503409925,-1.3509465453,,, +14.7812500000,14,1.0393847554,-2.1792088203,3.2537812804,-1.1976143069,,, +14.7832031250,14,0.8505729014,-1.7976747664,2.6960628662,-1.0000236966,,, +14.7851562500,14,0.7066915663,-1.3101138455,2.0120383427,-0.7718554718,,, +14.7871093750,14,0.6056220732,-0.7405094136,1.2398014230,-0.5271517769,,, +14.7890625000,14,0.5337714688,-0.1162501620,0.4181633876,-0.2782043349,,, +14.7910156250,14,0.4698354668,0.5328427034,-0.4162806168,-0.0337700926,,, +14.7929687500,14,0.3893087213,1.1753355804,-1.2295469349,0.2005556553,,, +14.7949218750,14,0.2707448961,1.7795074985,-1.9893113854,0.4203710999,,, +14.7968750000,14,0.1018107389,2.3155780287,-2.6657724428,0.6215376382,,, +14.7988281250,14,-0.1177389416,2.7574222719,-3.2332782275,0.8004335835,,, +14.8007812500,14,-0.3761980316,3.0832713206,-3.6705622368,0.9537669629,,, +14.8027343750,14,-0.6517714303,3.2761936007,-3.9604609261,1.0781024462,,, +14.8046875000,14,-0.9169975446,3.3248860954,-4.0907117813,1.1700824242,,, +14.8066406250,14,-1.1453210125,3.2247032432,-4.0553767215,1.2269242285,,, +14.8085937500,14,-1.3152656084,2.9781918627,-3.8552800916,1.2463893645,,, +14.8105468750,14,-1.4093340288,2.5943546775,-3.4966087365,1.2261581697,,, +14.8125000000,14,-1.4102540225,2.0870764693,-2.9883079003,1.1628024352,,, +14.8144531250,14,-1.2988930956,1.4739296124,-2.3403786953,1.0512628217,,, +14.8164062500,14,-1.0555240665,0.7757129210,-1.5644592696,0.8858077791,,, +14.8183593750,14,-0.6636660344,0.0163131056,-0.6755751135,0.6617269660,,, +14.8203125000,14,-0.1151619068,-0.7769533521,0.3061899011,0.3764609700,,, +14.8222656250,14,0.5852340724,-1.5727132487,1.3544576321,0.0300733210,,, +14.8242187500,14,1.4170585682,-2.3363259486,2.4363897129,-0.3740895055,,, +14.8261718750,14,2.3426922650,-3.0322988974,3.5130258210,-0.8278593351,,, +14.8281250000,14,3.3068972571,-3.6260674022,4.5388424929,-1.3164639608,,, +14.8300781250,14,4.2392843080,-4.0851993876,5.4621576475,-1.8179420045,,, +14.8320312500,14,5.0614056385,-4.3823034201,6.2291681477,-2.3045067980,,, +14.8339843750,14,5.6969678079,-4.4989617066,6.7903677246,-2.7452302734,,, +14.8359375000,14,6.0830070700,-4.4282308394,7.1059647943,-3.1088268693,,, +14.8378906250,14,6.1800668807,-4.1754765545,7.1498534000,-3.3663805784,,, +14.8398437500,14,5.9760636437,-3.7577798472,6.9117598668,-3.4937228125,,, +14.8417968750,14,5.4798476131,-3.2011803333,6.3954315488,-3.4721830783,,, +14.8437500000,14,4.7106558703,-2.5369059535,5.6150196250,-3.2886229754,,, +14.8457031250,14,3.6931401785,-1.7983964698,4.5942348514,-2.9373491590,,, +14.8476562500,14,2.4586525876,-1.0186110385,3.3673858182,-2.4234023536,,, +14.8496093750,14,1.0481350490,-0.2276231478,1.9789981886,-1.7641066394,,, +14.8515625000,14,-0.4847510321,0.5473673705,0.4828657082,-0.9879584448,,, +14.8535156250,14,-2.0710302232,1.2796353553,-1.0581715639,-0.1322037121,,, +14.8554687500,14,-3.6280767692,1.9420084621,-2.5747796842,0.7604898527,,, +14.8574218750,14,-5.0669580097,2.5092637724,-3.9973376226,1.6459176188,,, +14.8593750000,14,-6.3022660811,2.9611297801,-5.2622224320,2.4816107316,,, +14.8613281250,14,-7.2619319147,3.2842215590,-6.3165857048,3.2294568780,,, +14.8632812500,14,-7.8957430786,3.4736924003,-7.1222014268,3.8576687973,,, +14.8652343750,14,-8.1796915590,3.5339216404,-7.6569391678,4.3413714843,,, +14.8671875000,14,-8.1147601396,3.4769447782,-7.9133960154,4.6625513358,,, +14.8691406250,14,-7.7230428754,3.3204369937,-7.8976270194,4.8106890741,,, +14.8710937500,14,-7.0447257128,3.0872201393,-7.6295828112,4.7838139211,,, +14.8730468750,14,-6.1359986906,2.8042796557,-7.1425336210,4.5888878866,,, +14.8750000000,14,-5.0655885097,2.4996032283,-6.4796484911,4.2412492852,,, +14.8769531250,14,-3.9087769351,2.1981874134,-5.6895078196,3.7638932051,,, +14.8789062500,14,-2.7400617408,1.9184413799,-4.8217020002,3.1866316341,,, +14.8808593750,14,-1.6265448691,1.6702060793,-3.9227148695,2.5440975415,,, +14.8828125000,14,-0.6238406451,1.4556992942,-3.0333710096,1.8726266788,,, +14.8847656250,14,0.2250794286,1.2719965138,-2.1877238771,1.2070481871,,, +14.8867187500,14,0.8896243306,1.1125040730,-1.4119177143,0.5781796922,,, +14.8886718750,14,1.3516088749,0.9674747349,-0.7232328465,0.0113573759,,, +14.8906250000,14,1.6061582155,0.8248347049,-0.1296473490,-0.4746993255,,, +14.8925781250,14,1.6638856273,0.6712666795,0.3705940022,-0.8691397468,,, +14.8945312500,14,1.5534478371,0.4933644469,0.7883429534,-1.1691171365,,, +14.8964843750,14,1.3210984898,0.2792267347,1.1407146443,-1.3782044602,,, +14.8984375000,14,1.0253116395,0.0200764354,1.4475744379,-1.5045278440,,, +14.9003906250,14,0.7285932386,-0.2884303927,1.7284361527,-1.5593280875,,, +14.9023437500,14,0.4887288274,-0.6442036025,1.9981192440,-1.5548730490,,, +14.9042968750,14,0.3502619780,-1.0360916993,2.2615573224,-1.5020066508,,, +14.9062500000,14,0.3386873882,-1.4432786328,2.5122190725,-1.4095527242,,, +14.9082031250,14,0.4596906633,-1.8383279523,2.7359141893,-1.2858270001,,, +14.9101562500,14,0.7018433258,-2.1921806757,2.9164981686,-1.1401446877,,, +14.9121093750,14,1.0404849652,-2.4787416803,3.0406819139,-0.9836180713,,, +14.9140625000,14,1.4428097676,-2.6775362776,3.1011606134,-0.8297402475,,, +14.9160156250,14,1.8731751144,-2.7737596791,3.0966435753,-0.6938960704,,, +14.9179687500,14,2.2958774128,-2.7574836903,3.0293343683,-0.5910628784,,, +14.9199218750,14,2.6760348630,-2.6248254543,2.9034785166,-0.5330622739,,, +14.9218750000,14,2.9820775893,-2.3802085593,2.7263521083,-0.5273160526,,, +14.9238281250,14,3.1897304241,-2.0368362949,2.5095462361,-0.5773818752,,, +14.9257812500,14,3.2845262350,-1.6158011077,2.2692774105,-0.6837998676,,, +14.9277343750,14,3.2616849530,-1.1452132803,2.0256176589,-0.8440055357,,, +14.9296875000,14,3.1249538310,-0.6584919471,1.8003431210,-1.0515905641,,, +14.9316406250,14,2.8869198162,-0.1913337413,1.6142229429,-1.2959919556,,, +14.9335937500,14,2.5701507558,0.2220662156,1.4845597969,-1.5630490010,,, +14.9355468750,14,2.2054301737,0.5530987463,1.4224382947,-1.8358272520,,, +14.9375000000,14,1.8271866240,0.7815280087,1.4309057894,-2.0956058479,,, +14.9394531250,14,1.4701048308,0.8952303414,1.5064994926,-2.3236855407,,, +14.9414062500,14,1.1662586041,0.8881074447,1.6424396662,-2.5033428216,,, +14.9433593750,14,0.9398149273,0.7587757904,1.8301888280,-2.6209648764,,, +14.9453125000,14,0.8016587521,0.5109214331,2.0594072973,-2.6669561191,,, +14.9472656250,14,0.7471716935,0.1547451149,2.3172025957,-2.6365239248,,, +14.9492187500,14,0.7572782058,-0.2916284950,2.5872556511,-2.5299320147,,, +14.9511718750,14,0.8027139205,-0.8019996613,2.8502495474,-2.3526845863,,, +14.9531250000,14,0.8504906908,-1.3435487723,3.0852014101,-2.1149852651,,, +14.9550781250,14,0.8698027404,-1.8787334251,3.2694630128,-1.8293455382,,, +14.9570312500,14,0.8363978844,-2.3667569578,3.3779097922,-1.5078274493,,, +14.9589843750,14,0.7359263648,-2.7660538243,3.3845117601,-1.1611132715,,, +14.9609375000,14,0.5653906788,-3.0388616985,3.2668515645,-0.7991666822,,, +14.9628906250,14,0.3312491278,-3.1557903380,3.0101382257,-0.4317213366,,, +14.9648437500,14,0.0446809282,-3.0984238801,2.6082931902,-0.0676355444,,, +14.9667968750,14,-0.2828247806,-2.8606191832,2.0635250531,0.2862744394,,, +14.9687500000,14,-0.6408466610,-2.4489631869,1.3856798760,0.6262237125,,, +14.9707031250,14,-1.0189912259,-1.8818109392,0.5908973506,0.9522000377,,, +14.9726562500,14,-1.4049593640,-1.1872035531,-0.2996404893,1.2676755561,,, +14.9746093750,14,-1.7821516984,-0.4000545430,-1.2604644836,1.5781421677,,, +14.9765625000,14,-2.1279739597,0.4413029577,-2.2634246136,1.8899335969,,, +14.9785156250,14,-2.4148954233,1.2977946085,-3.2789240135,2.2090216598,,, +14.9804687500,14,-2.6150401591,2.1307703528,-4.2752364953,2.5386348151,,, +14.9824218750,14,-2.7065066349,2.9035613411,-5.2185940216,2.8771713811,,, +14.9843750000,14,-2.6780477760,3.5841944523,-6.0752307076,3.2174337345,,, +14.9863281250,14,-2.5306855695,4.1476387733,-6.8130738158,3.5462579138,,, +14.9882812500,14,-2.2778039256,4.5773827924,-7.4033263423,3.8448229162,,, +14.9902343750,14,-1.9442255871,4.8667026332,-7.8229585616,4.0903955800,,, +14.9921875000,14,-1.5624214077,5.0178275581,-8.0561112378,4.2591364802,,, +14.9941406250,14,-1.1664460138,5.0385685341,-8.0936695005,4.3294621507,,, +14.9960937500,14,-0.7872872218,4.9393066661,-7.9330692699,4.2851730946,,, +14.9980468750,14,-0.4508031327,4.7318772447,-7.5788331856,4.1173458039,,, +15.0000000000,15,-0.1770474947,4.4292428908,-7.0426791027,3.8247315081,33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000:10.0000000000:11.0000000000:12.0000000000:13.0000000000:14.0000000000:15.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +15.0019531250,15,0.0194250661,4.0458509595,-6.3432721019,3.4133737604,,, +15.0039062500,15,0.1281644008,3.5983489415,-5.5060758959,2.8956443804,,, +15.0058593750,15,0.1418261119,3.1048608017,-4.5617257853,2.2887398433,,, +15.0078125000,15,0.0577113094,2.5821604103,-3.5421070540,1.6130172415,,, +15.0097656250,15,-0.1187975215,2.0428959798,-2.4767713579,0.8908956588,,, +15.0117187500,15,-0.3719590255,1.4950538390,-1.3919082191,0.1464473549,,, +15.0136718750,15,-0.6757488530,0.9432639740,-0.3106776529,-0.5954436269,,, +15.0156250000,15,-0.9952162247,0.3907180968,0.7462844533,-1.3104337616,,, +15.0175781250,15,-1.2884892239,-0.1595122029,1.7606541171,-1.9759083804,,, +15.0195312500,15,-1.5105129560,-0.7046042612,2.7170426232,-2.5719743149,,, +15.0214843750,15,-1.6204281616,-1.2419792181,3.6021838939,-3.0814066772,,, +15.0234375000,15,-1.5909674911,-1.7677973288,4.4017771273,-3.4886003415,,, +15.0253906250,15,-1.4152763782,-2.2759534503,5.0990336707,-3.7796801951,,, +15.0273437500,15,-1.1088836287,-2.7588196906,5.6763854500,-3.9439623301,,, +15.0292968750,15,-0.7066769336,-3.2077432010,6.1174484828,-3.9752929509,,, +15.0312500000,15,-0.2558097050,-3.6122882368,6.4081588784,-3.8731182603,,, +15.0332031250,15,0.1929961289,-3.9599440936,6.5381741829,-3.6432856723,,, +15.0351562500,15,0.5935823190,-4.2370521434,6.5025310674,-3.2981277973,,, +15.0371093750,15,0.9111198636,-4.4299005296,6.3029293847,-2.8561173606,,, +15.0390625000,15,1.1268306807,-4.5264416450,5.9493041596,-2.3415010819,,, +15.0410156250,15,1.2388706882,-4.5191155093,5.4611676314,-1.7831488429,,, +15.0429687500,15,1.2584993707,-4.4063411258,4.8660186830,-1.2119032342,,, +15.0449218750,15,1.2043891305,-4.1916434926,4.1954812982,-0.6577639477,,, +15.0468750000,15,1.0981086726,-3.8825784236,3.4825771356,-0.1484118117,,, +15.0488281250,15,0.9607165025,-3.4901094009,2.7598263719,0.2918925304,,, +15.0507812500,15,0.8110891024,-3.0279806016,2.0569319508,0.6441224316,,, +15.0527343750,15,0.6670449194,-2.5125117289,1.3994053441,0.8959878401,,, +15.0546875000,15,0.5468509925,-1.9621403949,0.8081757522,1.0421820771,,, +15.0566406250,15,0.4686469515,-1.3960978889,0.2991405234,1.0837054780,,, +15.0585937500,15,0.4487683501,-0.8333099954,-0.1169037770,1.0268479446,,, +15.0605468750,15,0.5003938227,-0.2916796026,-0.4343876944,0.8825739075,,, +15.0625000000,15,0.6329146279,0.2127255688,-0.6536927325,0.6665412147,,, +15.0644531250,15,0.8516926011,0.6657645345,-0.7805841311,0.3983903052,,, +15.0664062500,15,1.1558376129,1.0555355994,-0.8247482161,0.0996042235,,, +15.0683593750,15,1.5337701417,1.3745576463,-0.8004512931,-0.2082302995,,, +15.0703125000,15,1.9616317271,1.6214671182,-0.7278851084,-0.5036172889,,, +15.0722656250,15,2.4067804933,1.8003421340,-0.6321681327,-0.7651879823,,, +15.0742187500,15,2.8325550194,1.9198234639,-0.5414421288,-0.9723880177,,, +15.0761718750,15,3.2018382666,1.9928916022,-0.4855044164,-1.1063131342,,, +15.0781250000,15,3.4797919302,2.0355792570,-0.4930436461,-1.1513102449,,, +15.0800781250,15,3.6354730433,2.0647601946,-0.5872878017,-1.0977814752,,, +15.0820312500,15,3.6422150174,2.0967642649,-0.7831231864,-0.9443368322,,, +15.0839843750,15,3.4784771066,2.1458513544,-1.0857504416,-0.6980096163,,, +15.0859375000,15,3.1304313561,2.2208166300,-1.4881543544,-0.3738596577,,, +15.0878906250,15,2.5950404720,2.3222057671,-1.9690765082,0.0054805737,,, +15.0898437500,15,1.8822935262,2.4427269336,-2.4951029115,0.4119177758,,, +15.0917968750,15,1.0168134400,2.5689521803,-3.0253662010,0.8156998607,,, +15.0937500000,15,0.0379531381,2.6828603103,-3.5163267270,1.1891839062,,, +15.0957031250,15,-1.0033682267,2.7645579033,-3.9274080614,1.5100948882,,, +15.0976562500,15,-2.0495738296,2.7956319575,-4.2263727416,1.7638118053,,, +15.0996093750,15,-3.0409628312,2.7609548603,-4.3914245508,1.9435595900,,, +15.1015625000,15,-3.9213038748,2.6491960445,-4.4108463174,2.0490456408,,, +15.1035156250,15,-4.6443883971,2.4535909857,-4.2823197806,2.0845500715,,, +15.1054687500,15,-5.1783450510,2.1726726520,-4.0113430321,2.0563686629,,, +15.1074218750,15,-5.5073593861,1.8100463966,-3.6090398901,1.9708900623,,, +15.1093750000,15,-5.6326520778,1.3739689190,-3.0922017770,1.8355966829,,, +15.1113281250,15,-5.5712269923,0.8772873313,-2.4849608350,1.6616089995,,, +15.1132812500,15,-5.3498328609,0.3366524736,-1.8174037135,1.4637716845,,, +15.1152343750,15,-4.9964207380,-0.2290868507,-1.1204844183,1.2578122645,,, +15.1171875000,15,-4.5336476595,-0.8001334747,-0.4214068413,1.0574204217,,, +15.1191406250,15,-3.9763789065,-1.3568106569,0.2585249742,0.8726062360,,, +15.1210937500,15,-3.3330135330,-1.8808735134,0.9043097588,0.7089213043,,, +15.1230468750,15,-2.6094900273,-2.3561394261,1.5063808829,0.5671263654,,, +15.1250000000,15,-1.8141578017,-2.7685497477,2.0592493052,0.4431200397,,, +15.1269531250,15,-0.9617001224,-3.1063740330,2.5598734200,0.3287832468,,, +15.1289062500,15,-0.0746770679,-3.3598092145,3.0052006874,0.2142288737,,, +15.1308593750,15,0.8179683998,-3.5205548374,3.3907293233,0.0898598239,,, +15.1328125000,15,1.6845687230,-3.5829579202,3.7119091473,-0.0533080665,,, +15.1347656250,15,2.4942356353,-3.5454532046,3.9656549666,-0.2236427975,,, +15.1367187500,15,3.2189204023,-3.4107953560,4.1495875736,-0.4274974065,,, +15.1386718750,15,3.8351135828,-3.1860622779,4.2612590541,-0.6677543146,,, +15.1406250000,15,4.3253402100,-2.8822077340,4.2980916389,-0.9435592999,,, +15.1425781250,15,4.6778857748,-2.5114954621,4.2554773602,-1.2500007754,,, +15.1445312500,15,4.8850125067,-2.0843710440,4.1241057489,-1.5772986708,,, +15.1464843750,15,4.9415718450,-1.6091296941,3.8905360540,-1.9107007663,,, +15.1484375000,15,4.8455727809,-1.0939382845,3.5414586195,-2.2316763075,,, +15.1503906250,15,4.6007055560,-0.5487969739,3.0690300519,-2.5201817029,,, +15.1523437500,15,4.2180175171,0.0130157585,2.4750884730,-2.7574690393,,, +15.1542968750,15,3.7149485759,0.5746903929,1.7724143255,-2.9281364756,,, +15.1562500000,15,3.1137533403,1.1174913039,0.9826985077,-3.0202258057,,, +15.1582031250,15,2.4403822763,1.6224966632,0.1339508508,-3.0246828287,,, +15.1601562500,15,1.7227446826,2.0715851580,-0.7407750202,-2.9362356021,,, +15.1621093750,15,0.9883572108,2.4492069370,-1.6054011415,-2.7545543757,,, +15.1640625000,15,0.2615496791,2.7449272225,-2.4248303738,-2.4837874063,,, +15.1660156250,15,-0.4394329929,2.9541511571,-3.1677886440,-2.1315350251,,, +15.1679687500,15,-1.1031212723,3.0759386470,-3.8059902479,-1.7088556976,,, +15.1699218750,15,-1.7226558093,3.1104477125,-4.3123227544,-1.2306284668,,, +15.1718750000,15,-2.2935624157,3.0585943751,-4.6619771318,-0.7148506129,,, +15.1738281250,15,-2.8120273935,2.9232912949,-4.8359973740,-0.1807979233,,, +15.1757812500,15,-3.2719566021,2.7104725988,-4.8240485339,0.3529835218,,, +15.1777343750,15,-3.6625611550,2.4293119492,-4.6254999079,0.8701956046,,, +15.1796875000,15,-3.9687589658,2.0914866547,-4.2496499877,1.3577825062,,, +15.1816406250,15,-4.1723969883,1.7092606790,-3.7147913401,1.8066246214,,, +15.1835937500,15,-4.2535273662,1.2928452088,-3.0459141494,2.2118605651,,, +15.1855468750,15,-4.1943854703,0.8484928712,-2.2720593967,2.5718164108,,, +15.1875000000,15,-3.9845717636,0.3787738979,-1.4239473323,2.8854230940,,, +15.1894531250,15,-3.6233237515,-0.1149851673,-0.5326165322,3.1505877004,,, +15.1914062500,15,-3.1199328620,-0.6297951172,0.3698563969,3.3647426588,,, +15.1933593750,15,-2.4945274038,-1.1594101154,1.2489815283,3.5253736602,,, +15.1953125000,15,-1.7769091529,-1.6938903734,2.0686469888,3.6292227294,,, +15.1972656250,15,-1.0017909149,-2.2191535113,2.7942332016,3.6714008260,,, +15.1992187500,15,-0.2037437648,-2.7166368284,3.3960774528,3.6453193316,,, +15.2011718750,15,0.5846184337,-3.1634840439,3.8514312515,3.5435260937,,, +15.2031250000,15,1.3322335982,-3.5338258021,4.1448500495,3.3592115081,,, +15.2050781250,15,2.0093893611,-3.8021377224,4.2686352509,3.0876284270,,, +15.2070312500,15,2.5873780272,-3.9466301789,4.2230582303,2.7273721088,,, +15.2089843750,15,3.0383938566,-3.9498844621,4.0150963881,2.2818709837,,, +15.2109375000,15,3.3378447502,-3.7991346350,3.6570057094,1.7605481791,,, +15.2128906250,15,3.4686564141,-3.4895517126,3.1667513983,1.1790222209,,, +15.2148437500,15,3.4260715239,-3.0283281012,2.5699397166,0.5581227494,,, +15.2167968750,15,3.2216809438,-2.4356948053,1.9007240501,-0.0783696133,,, +15.2187500000,15,2.8841316029,-1.7429786350,1.1998061381,-0.7068929267,,, +15.2207031250,15,2.4556223438,-0.9893440845,0.5099800101,-1.3068729022,,, +15.2226562500,15,1.9859364426,-0.2176491410,-0.1289435567,-1.8618023775,,, +15.2246093750,15,1.5249407176,0.5299761306,-0.6843343159,-2.3590214299,,, +15.2265625000,15,1.1138526845,1.2165453325,-1.1346099306,-2.7891871221,,, +15.2285156250,15,0.7779240912,1.8149523457,-1.4733296691,-3.1453569566,,, +15.2304687500,15,0.5235531475,2.3116642332,-1.7114409076,-3.4215719424,,, +15.2324218750,15,0.3398909470,2.7071347428,-1.8756065193,-3.6117257669,,, +15.2343750000,15,0.2040059979,3.0131139318,-2.0032915019,-3.7092434232,,, +15.2363281250,15,0.0881547786,3.2487370632,-2.1364831664,-3.7075130168,,, +15.2382812500,15,-0.0339874577,3.4358255785,-2.3142899856,-3.6016816405,,, +15.2402343750,15,-0.1839218422,3.5936104618,-2.5646377824,-3.3914874631,,, +15.2421875000,15,-0.3768472318,3.7348502851,-2.8981976074,-3.0825439382,,, +15.2441406250,15,-0.6206550254,3.8640535291,-3.3065923484,-2.6856270661,,, +15.2460937500,15,-0.9148066630,3.9765534266,-3.7630966575,-2.2164585726,,, +15.2480468750,15,-1.2495408933,4.0587718658,-4.2250444570,-1.6957678722,,, +15.2500000000,15,-1.6054741354,4.0907104753,-4.6387877027,-1.1477745138,,, +15.2519531250,15,-1.9535882703,4.0492003211,-4.9456419588,-0.5985748091,,, +15.2539062500,15,-2.2572285217,3.9107047901,-5.0872815046,-0.0757271889,,, +15.2558593750,15,-2.4768711402,3.6552808802,-5.0120658516,0.3932997874,,, +15.2578125000,15,-2.5752037438,3.2709735556,-4.6816559290,0.7844681127,,, +15.2597656250,15,-2.5202931640,2.7553838251,-4.0746081279,1.0795493815,,, +15.2617187500,15,-2.2878565928,2.1158088678,-3.1881690745,1.2670703791,,, +15.2636718750,15,-1.8648505109,1.3706898905,-2.0411004003,1.3434828888,,, +15.2656250000,15,-1.2555833270,0.5498017806,-0.6753202604,1.3140594392,,, +15.2675781250,15,-0.4886172093,-0.3087903132,0.8459442930,1.1928281464,,, +15.2695312500,15,0.3812164743,-1.1625754272,2.4421817806,1.0024038037,,, +15.2714843750,15,1.2788639804,-1.9681123800,4.0203620546,0.7733040750,,, +15.2734375000,15,2.1199196211,-2.6853944903,5.4812038159,0.5412080063,,, +15.2753906250,15,2.8223767129,-3.2827197772,6.7283975922,0.3422750817,,, +15.2773437500,15,3.3168326456,-3.7409839083,7.6792720664,0.2080608884,,, +15.2792968750,15,3.5534832955,-4.0571245429,8.2739747051,0.1607471337,,, +15.2812500000,15,3.5062562912,-4.2446091909,8.4817843574,0.2095541703,,, +15.2832031250,15,3.1750004231,-4.3287982746,8.3033956520,0.3502208601,,, +15.2851562500,15,2.5853926047,-4.3408205530,7.7690912267,0.5670068530,,, +15.2871093750,15,1.7857202032,-4.3142640241,6.9342331718,0.8350682318,,, +15.2890625000,15,0.8407683400,-4.2816735585,5.8726094287,1.1235623548,,, +15.2910156250,15,-0.1753379413,-4.2682804305,4.6681909482,1.3997748219,,, +15.2929687500,15,-1.1858953986,-4.2871345990,3.4068892672,1.6326047113,,, +15.2949218750,15,-2.1180978511,-4.3380937643,2.1687241292,1.7951571755,,, +15.2968750000,15,-2.9082784570,-4.4089593088,1.0208221820,1.8669088714,,, +15.2988281250,15,-3.5048478458,-4.4781869482,0.0130477836,1.8346192562,,, +15.3007812500,15,-3.8711267534,-4.5185496681,-0.8239037383,1.6926743445,,, +15.3027343750,15,-3.9899274322,-4.4998703517,-1.4795143137,1.4447148415,,, +15.3046875000,15,-3.8675263020,-4.3908255062,-1.9630517918,1.1054000410,,, +15.3066406250,15,-3.5333255898,-4.1611709843,-2.3007759431,0.7001449616,,, +15.3085937500,15,-3.0346112925,-3.7839630427,-2.5314886802,0.2633954164,,, +15.3105468750,15,-2.4293289773,-3.2371908419,-2.7011315916,-0.1641066527,,, +15.3125000000,15,-1.7786937646,-2.5061111037,-2.8558436012,-0.5400312432,,, +15.3144531250,15,-1.1389770780,-1.5866715830,-3.0342457546,-0.8260315552,,, +15.3164062500,15,-0.5531048440,-0.4889254790,-3.2610943633,-0.9922701246,,, +15.3183593750,15,-0.0449193613,0.7604403715,-3.5430832344,-1.0210340275,,, +15.3203125000,15,0.3812842823,2.1177688545,-3.8674933627,-0.9096701234,,, +15.3222656250,15,0.7358820582,3.5249714833,-4.2049506737,-0.6721943415,,, +15.3242187500,15,1.0365144445,4.9138911164,-4.5152768331,-0.3387283368,,, +15.3261718750,15,1.3017060510,6.2116635556,-4.7535980459,0.0480448438,,, +15.3281250000,15,1.5472044859,7.3471334408,-4.8759914613,0.4392575636,,, +15.3300781250,15,1.7843399989,8.2575555394,-4.8455329238,0.7872601783,,, +15.3320312500,15,2.0186815940,8.8934903803,-4.6376653815,1.0508007896,,, +15.3339843750,15,2.2486121860,9.2210535413,-4.2433184451,1.1969240074,,, +15.3359375000,15,2.4657346354,9.2231594508,-3.6695748514,1.2029579697,,, +15.3378906250,15,2.6580286276,8.9004409939,-2.9377325251,1.0600867346,,, +15.3398437500,15,2.8134018875,8.2707005605,-2.0798030496,0.7752314698,,, +15.3417968750,15,2.9207723457,7.3674007076,-1.1362791824,0.3697567856,,, +15.3437500000,15,2.9685553396,6.2378464219,-0.1554457563,-0.1234232918,,, +15.3457031250,15,2.9429922371,4.9395147048,0.8088402094,-0.6636958360,,, +15.3476562500,15,2.8285718777,3.5350538478,1.7017562712,-1.2069145525,,, +15.3496093750,15,2.6108525339,2.0883581485,2.4727248692,-1.7089519729,,, +15.3515625000,15,2.2800439137,0.6610819582,3.0803488363,-2.1292319417,,, +15.3535156250,15,1.8327292630,-0.6910708964,3.4956026932,-2.4343352065,,, +15.3554687500,15,1.2720666053,-1.9206851661,3.7021822486,-2.6008839349,,, +15.3574218750,15,0.6107522769,-2.9907273787,3.6974522318,-2.6184111132,,, +15.3593750000,15,-0.1235835078,-3.8775829549,3.4958254568,-2.4919462363,,, +15.3613281250,15,-0.8871052320,-4.5720690363,3.1297645454,-2.2414542099,,, +15.3632812500,15,-1.6242198104,-5.0780053734,2.6464319916,-1.8979678403,,, +15.3652343750,15,-2.2747413577,-5.4106177029,2.1027876372,-1.4995056244,,, +15.3671875000,15,-2.7829825770,-5.5931779863,1.5590791709,-1.0868887307,,, +15.3691406250,15,-3.1060328807,-5.6504261651,1.0709111847,-0.6979924469,,, +15.3710937500,15,-3.2180575088,-5.6025655149,0.6827738506,-0.3628564544,,, +15.3730468750,15,-3.1120793594,-5.4640393817,0.4240029637,-0.1020162564,,, +15.3750000000,15,-2.7994854158,-5.2454704532,0.3070632312,0.0741669044,,, +15.3769531250,15,-2.3061360123,-4.9548105370,0.3283021525,0.1665012972,,, +15.3789062500,15,-1.6682105528,-4.5983040723,0.4698558469,0.1855352211,,, +15.3808593750,15,-0.9303423031,-4.1828945128,0.7015700553,0.1471041364,,, +15.3828125000,15,-0.1443280064,-3.7180004203,0.9834772805,0.0682615164,,, +15.3847656250,15,0.6330718028,-3.2152713674,1.2694926933,-0.0347910297,,, +15.3867187500,15,1.3432732011,-2.6874224379,1.5121241094,-0.1474307974,,, +15.3886718750,15,1.9298138677,-2.1463962293,1.6667510078,-0.2558213800,,, +15.3906250000,15,2.3421989172,-1.6010259478,1.6939283498,-0.3453326766,,, +15.3925781250,15,2.5390499986,-1.0557405216,1.5607304795,-0.3999191363,,, +15.3945312500,15,2.4919575734,-0.5112619276,1.2437004935,-0.4025166262,,, +15.3964843750,15,2.1911229574,0.0331031244,0.7341766686,-0.3360790040,,, +15.3984375000,15,1.6509353883,0.5764887624,0.0446121879,-0.1859859281,,, +15.4003906250,15,0.9126729281,1.1141065798,-0.7869477739,0.0562266700,,, +15.4023437500,15,0.0420002828,1.6367510296,-1.6981800224,0.3899736716,,, +15.4042968750,15,-0.8808579485,2.1316839708,-2.6115727610,0.8051910103,,, +15.4062500000,15,-1.7766828659,2.5828201925,-3.4478928397,1.2829772424,,, +15.4082031250,15,-2.5807746017,2.9705042502,-4.1373631925,1.7962149262,,, +15.4101562500,15,-3.2467108877,3.2738011446,-4.6244535476,2.3116921166,,, +15.4121093750,15,-3.7419150620,3.4750989457,-4.8681877349,2.7937466725,,, +15.4140625000,15,-4.0432518673,3.5634970541,-4.8428336467,3.2072315206,,, +15.4160156250,15,-4.1362380546,3.5358380085,-4.5405253271,3.5195814158,,, +15.4179687500,15,-4.0161719829,3.3963875631,-3.9738985265,3.7027530281,,, +15.4199218750,15,-3.6903524768,3.1556751537,-3.1770780538,3.7347784725,,, +15.4218750000,15,-3.1798645061,2.8294836572,-2.2038137769,3.6016900723,,, +15.4238281250,15,-2.5183258365,2.4377851766,-1.1224194509,3.2995233367,,, +15.4257812500,15,-1.7487271578,2.0021708399,-0.0090321645,2.8343823256,,, +15.4277343750,15,-0.9199906074,1.5442052323,1.0599780934,2.2222351808,,, +15.4296875000,15,-0.0815705252,1.0879930742,2.0163068781,1.4909251909,,, +15.4316406250,15,0.7231614618,0.6640015635,2.8064066347,0.6819018978,,, +15.4335937500,15,1.4616909988,0.3090786104,3.3949939795,-0.1511525140,,, +15.4355468750,15,2.1142696736,0.0614529575,3.7658858667,-0.9466010796,,, +15.4375000000,15,2.6715649342,-0.0479906594,3.9192471812,-1.6421430199,,, +15.4394531250,15,3.1281377254,-0.0048359435,3.8659466326,-2.1845269321,,, +15.4414062500,15,3.4776737884,0.1852020908,3.6241338407,-2.5369347729,,, +15.4433593750,15,3.7144844554,0.5001965204,3.2205673740,-2.6801464250,,, +15.4453125000,15,3.8365161448,0.9071462929,2.6927522801,-2.6106892743,,, +15.4472656250,15,3.8443530743,1.3633606579,2.0879241119,-2.3401858120,,, +15.4492187500,15,3.7384673218,1.8178891258,1.4587394738,-1.8949458780,,, +15.4511718750,15,3.5178561674,2.2161532595,0.8567816557,-1.3142738471,,, +15.4531250000,15,3.1810795937,2.5058698207,0.3268153753,-0.6472473584,,, +15.4550781250,15,2.7309500604,2.6430462271,-0.0949357101,0.0526965497,,, +15.4570312500,15,2.1804494141,2.5962427164,-0.3802504599,0.7328449700,,, +15.4589843750,15,1.5557751166,2.3460410554,-0.5095417211,1.3418887754,,, +15.4609375000,15,0.8961040842,1.8828950424,-0.4733617332,1.8290336989,,, +15.4628906250,15,0.2512525071,1.2096163695,-0.2731561711,2.1472324526,,, +15.4648437500,15,-0.3225984704,0.3460154388,0.0788527408,2.2585305518,,, +15.4667968750,15,-0.7694154625,-0.6705750623,0.5598736838,2.1374215614,,, +15.4687500000,15,-1.0412709731,-1.7877201356,1.1364361308,1.7740536656,,, +15.4707031250,15,-1.1057925402,-2.9408477785,1.7641593067,1.1775822624,,, +15.4726562500,15,-0.9515925927,-4.0590966255,2.3883638943,0.3755547068,,, +15.4746093750,15,-0.5908239164,-5.0729736588,2.9465156537,-0.5901772402,,, +15.4765625000,15,-0.0588478520,-5.9195010460,3.3720292431,-1.6669662114,,, +15.4785156250,15,0.5891940893,-6.5455812748,3.6001708323,-2.7941941065,,, +15.4804687500,15,1.2855514882,-6.9118943155,3.5774210140,-3.9068528383,,, +15.4824218750,15,1.9570283827,-6.9963778118,3.2699461186,-4.9391160167,,, +15.4843750000,15,2.5280076451,-6.7963172992,2.6668355599,-5.8272118079,,, +15.4863281250,15,2.9235266068,-6.3287187905,1.7813394268,-6.5124696349,,, +15.4882812500,15,3.0770175509,-5.6282416340,0.6523783022,-6.9451460615,,, +15.4902343750,15,2.9397807557,-4.7437874376,-0.6563428472,-7.0883417012,,, +15.4921875000,15,2.4878099310,-3.7348722460,-2.0610556113,-6.9206936428,,, +15.4941406250,15,1.7235136807,-2.6654870679,-3.4672508312,-6.4364808222,,, +15.4960937500,15,0.6728228157,-1.5963309970,-4.7825140732,-5.6447644569,,, +15.4980468750,15,-0.6169922517,-0.5815887047,-5.9255958615,-4.5713684411,,, +15.5000000000,15,-2.0773003953,0.3298410278,-6.8281215846,-3.2619577880,,, +15.5019531250,15,-3.6209097166,1.0952510300,-7.4350016319,-1.7805066993,,, +15.5039062500,15,-5.1480612264,1.6836730131,-7.7068281034,-0.2021020809,,, +15.5058593750,15,-6.5527250578,2.0828455602,-7.6219170284,1.3959854918,,, +15.5078125000,15,-7.7298389210,2.3032438243,-7.1778378103,2.9409916015,,, +15.5097656250,15,-8.5838861491,2.3772004775,-6.3931507176,4.3682287290,,, +15.5117187500,15,-9.0369143996,2.3532096066,-5.3073477979,5.6223086466,,, +15.5136718750,15,-9.0341066706,2.2872604226,-3.9772073330,6.6569910006,,, +15.5156250000,15,-8.5476493154,2.2345306547,-2.4722628993,7.4356000670,,, +15.5175781250,15,-7.5821510655,2.2417562829,-0.8734099637,7.9321048503,,, +15.5195312500,15,-6.1814090457,2.3389792238,0.7267288832,8.1308904695,,, +15.5214843750,15,-4.4303153010,2.5341789717,2.2271362868,8.0261228082,,, +15.5234375000,15,-2.4472438785,2.8141751775,3.5281268246,7.6227702524,,, +15.5253906250,15,-0.3703011635,3.1483392841,4.5440471894,6.9376857089,,, +15.5273437500,15,1.6565367670,3.4922966886,5.2129503503,5.9990446505,,, +15.5292968750,15,3.4959837978,3.7943163914,5.5013478807,4.8463267354,,, +15.5312500000,15,5.0277629308,4.0037351007,5.4051305446,3.5312997128,,, +15.5332031250,15,6.1545276974,4.0767728462,4.9463655938,2.1163186613,,, +15.5351562500,15,6.8067382289,3.9806849491,4.1681470920,0.6702382313,,, +15.5371093750,15,6.9496111391,3.6993292842,3.1310549279,-0.7341312546,,, +15.5390625000,15,6.5880251451,3.2380846241,1.9100359912,-2.0216379827,,, +15.5410156250,15,5.7665885647,2.6259955040,0.5900410636,-3.1176990188,,, +15.5429687500,15,4.5660758573,1.9152726448,-0.7388544094,-3.9520572208,,, +15.5449218750,15,3.0960872957,1.1763461970,-1.9872230674,-4.4642277449,,, +15.5468750000,15,1.4842418506,0.4882076539,-3.0729438111,-4.6110858327,,, +15.5488281250,15,-0.1355455872,-0.0709669040,-3.9270458151,-4.3723293516,,, +15.5507812500,15,-1.6339977312,-0.4310506692,-4.4984352703,-3.7525397185,,, +15.5527343750,15,-2.8960337751,-0.5394654299,-4.7577598323,-2.7850653986,,, +15.5546875000,15,-3.8268230690,-0.3719351342,-4.6978826506,-1.5368809306,,, +15.5566406250,15,-4.3528660484,0.0623850974,-4.3294229860,-0.1071448832,,, +15.5585937500,15,-4.4225026028,0.7214678731,-3.6757016932,1.3804936157,,, +15.5605468750,15,-4.0113695837,1.5321856113,-2.7717552638,2.7872177434,,, +15.5625000000,15,-3.1306383534,2.3940986924,-1.6660132368,3.9702545078,,, +15.5644531250,15,-1.8324944240,3.1872605291,-0.4207989949,4.7964070772,,, +15.5664062500,15,-0.2113134708,3.7827069422,0.8893012158,5.1548229432,,, +15.5683593750,15,1.6005914037,4.0563063850,2.1806202548,4.9683996113,,, +15.5703125000,15,3.4464450070,3.9076164769,3.3671679776,4.2056009947,,, +15.5722656250,15,5.1667690055,3.2786556950,4.3722111124,2.8899024047,,, +15.5742187500,15,6.6202897959,2.1638232152,5.1396758549,1.1012267923,,, +15.5761718750,15,7.6967799906,0.6088630071,5.6395567043,-1.0317170912,,, +15.5781250000,15,8.3226275082,-1.2963231750,5.8673008395,-3.3447222279,,, +15.5800781250,15,8.4631960107,-3.4263734033,5.8410963571,-5.6528692791,,, +15.5820312500,15,8.1245927284,-5.6287119338,5.5996174840,-7.7640157036,,, +15.5839843750,15,7.3531645120,-7.7332784687,5.1983615465,-9.4923262017,,, +15.5859375000,15,6.2281025379,-9.5676407386,4.7013913685,-10.6753057762,,, +15.5878906250,15,4.8465389648,-10.9757468943,4.1687328530,-11.1923903716,,, +15.5898437500,15,3.3077124049,-11.8341666227,3.6443862005,-10.9788566742,,, +15.5917968750,15,1.7025802202,-12.0637217773,3.1502326194,-10.0327136106,,, +15.5937500000,15,0.1093738477,-11.6364220166,2.6864110322,-8.4153957155,,, +15.5957031250,15,-1.4058612636,-10.5754167931,2.2368707959,-6.2451103180,,, +15.5976562500,15,-2.7866943033,-8.9499844450,1.7779665394,-3.6837361992,,, +15.5996093750,15,-3.9863022410,-6.8707332212,1.2863455750,-0.9218855539,,, +15.6015625000,15,-4.9693610702,-4.4838367632,0.7443158321,1.8357428449,,, +15.6035156250,15,-5.7145309925,-1.9619424614,0.1414638186,4.3843123594,,, +15.6054687500,15,-6.2174531390,0.5071010132,-0.5264276335,6.5321069970,,, +15.6074218750,15,-6.4892903543,2.7360928405,-1.2552374583,8.1165357601,,, +15.6093750000,15,-6.5495262612,4.5605648320,-2.0269845276,9.0235750410,,, +15.6113281250,15,-6.4205501430,5.8598651035,-2.8089106852,9.2029560729,,, +15.6132812500,15,-6.1275054762,6.5696777010,-3.5596279400,8.6724773062,,, +15.6152343750,15,-5.6980720487,6.6866518725,-4.2359744316,7.5140890193,,, +15.6171875000,15,-5.1582006925,6.2668393890,-4.7955372387,5.8654373180,,, +15.6191406250,15,-4.5279286181,5.4158024693,-5.1975474810,3.9049876721,,, +15.6210937500,15,-3.8223477633,4.2724221602,-5.4067554680,1.8315852041,,, +15.6230468750,15,-3.0546875516,2.9936155358,-5.3984373922,-0.1551468734,,, +15.6250000000,15,-2.2374798759,1.7410522583,-5.1611339834,-1.8716936676,,, +15.6269531250,15,-1.3839354040,0.6653524422,-4.6983319624,-3.1675450969,,, +15.6289062500,15,-0.5104443395,-0.1090703655,-4.0301220387,-3.9388827660,,, +15.6308593750,15,0.3618436512,-0.4924153615,-3.1937426178,-4.1342403699,,, +15.6328125000,15,1.2066433820,-0.4347956207,-2.2424416640,-3.7556994684,,, +15.6347656250,15,1.9940402802,0.0686593910,-1.2418278935,-2.8582676237,,, +15.6367187500,15,2.6948829684,0.9782713921,-0.2628933863,-1.5426266535,,, +15.6386718750,15,3.2860554443,2.2163568110,0.6272321603,0.0588615108,,, +15.6406250000,15,3.7542847886,3.6739956434,1.3745830648,1.7957112160,,, +15.6425781250,15,4.0971202141,5.2172019884,1.9447511517,3.5095965507,,, +15.6445312500,15,4.3188362570,6.6962608177,2.3234824375,5.0451987097,,, +15.6464843750,15,4.4232154012,7.9597460578,2.5127807714,6.2640857380,,, +15.6484375000,15,4.4102343570,8.8707276495,2.5270334227,7.0582053414,,, +15.6503906250,15,4.2783613686,9.3202325426,2.3902185197,7.3576432355,,, +15.6523437500,15,4.0287457732,9.2358297034,2.1335049748,7.1326544147,,, +15.6542968750,15,3.6697054840,8.5881299966,1.7946936272,6.3950258155,,, +15.6562500000,15,3.2200717195,7.3954430720,1.4185840507,5.1995850141,,, +15.6582031250,15,2.7087797470,5.7220746902,1.0547702959,3.6405098501,,, +15.6601562500,15,2.1695947141,3.6694529398,0.7513135480,1.8405800607,,, +15.6621093750,15,1.6326503164,1.3650443960,0.5456833211,-0.0621206374,,, +15.6640625000,15,1.1171343606,-1.0482455654,0.4567399842,-1.9272304996,,, +15.6660156250,15,0.6285005619,-3.4238549844,0.4813163011,-3.6255564586,,, +15.6679687500,15,0.1615749404,-5.6222411526,0.5972670418,-5.0494833081,,, +15.6699218750,15,-0.2924794774,-7.5169491556,0.7710467662,-6.1167065353,,, +15.6718750000,15,-0.7423323021,-9.0019983576,0.9629823809,-6.7740502638,,, +15.6738281250,15,-1.1977335591,-10.0044291010,1.1282091550,-7.0058932164,,, +15.6757812500,15,-1.6693610080,-10.4926110149,1.2193105755,-6.8375226525,,, +15.6777343750,15,-2.1651053472,-10.4749841023,1.1927136733,-6.3281004829,,, +15.6796875000,15,-2.6875748555,-9.9957231787,1.0141248996,-5.5610211582,,, +15.6816406250,15,-3.2349003725,-9.1293797897,0.6607987160,-4.6347845771,,, +15.6835937500,15,-3.8021729146,-7.9718641102,0.1233854188,-3.6512910855,,, +15.6855468750,15,-4.3813038353,-6.6313653035,-0.5904380380,-2.7043188875,,, +15.6875000000,15,-4.9577381277,-5.2199124993,-1.4505685865,-1.8701217812,,, +15.6894531250,15,-5.5039444857,-3.8394856098,-2.3996900412,-1.1967970571,,, +15.6914062500,15,-5.9765487443,-2.5671145786,-3.3557481992,-0.6969349999,,, +15.6933593750,15,-6.3218902065,-1.4520240575,-4.2233418907,-0.3531859530,,, +15.6953125000,15,-6.4837442657,-0.5231254280,-4.9061648544,-0.1329108895,,, +15.6972656250,15,-6.4099655471,0.2059905550,-5.3177840208,0.0005790096,,, +15.6992187500,15,-6.0608189727,0.7358188359,-5.3928566964,0.0824119403,,, +15.7011718750,15,-5.4158680098,1.0781673222,-5.0949315403,0.1419021903,,, +15.7031250000,15,-4.4769822006,1.2534431701,-4.4194550316,0.1998612305,,, +15.7050781250,15,-3.2710312312,1.2887645237,-3.3959684163,0.2677238384,,, +15.7070312500,15,-1.8512650986,1.2151169209,-2.0882509516,0.3474352737,,, +15.7089843750,15,-0.2916563136,1.0669846266,-0.5877733055,0.4342790830,,, +15.7109375000,15,1.3230991668,0.8841224226,0.9968425309,0.5214771943,,, +15.7128906250,15,2.9012404595,0.7068464839,2.5457812163,0.5996697566,,, +15.7148437500,15,4.3426558012,0.5662277937,3.9307865356,0.6528943420,,, +15.7167968750,15,5.5460337577,0.4809037639,5.0259091511,0.6607619322,,, +15.7187500000,15,6.4246015161,0.4608423259,5.7261552329,0.6064574196,,, +15.7207031250,15,6.9179860832,0.5095501645,5.9623272456,0.4822709284,,, +15.7226562500,15,6.9961426601,0.6242190852,5.7072062294,0.2913738174,,, +15.7246093750,15,6.6599970087,0.7975574876,4.9768336106,0.0488526825,,, +15.7265625000,15,5.9407036663,1.0205480483,3.8286804230,-0.2185838350,,, +15.7285156250,15,4.8963086267,1.2855639063,2.3547913166,-0.4746884617,,, +15.7304687500,15,3.6078661289,1.5917895255,0.6718909014,-0.6750394915,,, +15.7324218750,15,2.1775485213,1.9495655041,-1.0863538677,-0.7686069253,,, +15.7343750000,15,0.7256992412,2.3762625906,-2.7754595433,-0.7049367819,,, +15.7363281250,15,-0.6155884172,2.8859025434,-4.2479767460,-0.4460083247,,, +15.7382812500,15,-1.7108094609,3.4817105019,-5.3630747943,0.0246339956,,, +15.7402343750,15,-2.4331897835,4.1522342235,-5.9985960206,0.6972106161,,, +15.7421875000,15,-2.6825307869,4.8678375951,-6.0659648573,1.5341973306,,, +15.7441406250,15,-2.4028656805,5.5803925100,-5.5234422019,2.4739369561,,, +15.7460937500,15,-1.5936343641,6.2271170661,-4.3839251539,3.4378448842,,, +15.7480468750,15,-0.3133271753,6.7359622584,-2.7170950806,4.3377229601,,, +15.7500000000,15,1.3255083033,7.0339510442,-0.6442814737,5.0853393173,,, +15.7519531250,15,3.1697750460,7.0582674913,1.6747718155,5.6046007379,,, +15.7539062500,15,5.0437203140,6.7658914184,4.0593192811,5.8416650376,,, +15.7558593750,15,6.7672768703,6.1414929741,6.3247511124,5.7722971185,,, +15.7578125000,15,8.1717015786,5.2011377340,8.2969514875,5.4047597655,,, +15.7597656250,15,9.1120658912,3.9861630830,9.8243009829,4.7730809141,,, +15.7617187500,15,9.4801956703,2.5536367954,10.7900557949,3.9262999801,,, +15.7636718750,15,9.2161004505,0.9730871075,11.1228101404,2.9235090351,,, +15.7656250000,15,8.3114081432,-0.6752122301,10.7998300903,1.8313984452,,, +15.7675781250,15,6.8067232321,-2.3061729021,9.8450434265,0.7185168049,,, +15.7695312500,15,4.7883577912,-3.8358558970,8.3257446714,-0.3507333252,,, +15.7714843750,15,2.3830709205,-5.1855371184,6.3470445205,-1.3201017785,,, +15.7734375000,15,-0.2505961840,-6.2861879778,4.0442625000,-2.1443620136,,, +15.7753906250,15,-2.9318147102,-7.0818646044,1.5762649003,-2.7891436121,,, +15.7773437500,15,-5.4694800594,-7.5312357053,-0.8831195104,-3.2284550482,,, +15.7792968750,15,-7.6805294695,-7.6106952540,-3.1608908833,-3.4452415973,,, +15.7812500000,15,-9.4103489135,-7.3181209027,-5.1041698291,-3.4344177548,,, +15.7832031250,15,-10.5474078819,-6.6734179951,-6.5946414407,-3.2036996992,,, +15.7851562500,15,-11.0316697274,-5.7193417529,-7.5567583886,-2.7747123780,,, +15.7871093750,15,-10.8609890680,-4.5250127001,-7.9636750351,-2.1865890482,,, +15.7890625000,15,-10.0937787067,-3.1840880655,-7.8403978621,-1.4951603188,,, +15.7910156250,15,-8.8429390113,-1.8035153067,-7.2600613789,-0.7644730806,,, +15.7929687500,15,-7.2619847044,-0.4899285003,-6.3338342714,-0.0573892590,,, +15.7949218750,15,-5.5283273226,0.6602570331,-5.1990373589,0.5689759098,,, +15.7968750000,15,-3.8260330943,1.5665838199,-4.0074699153,1.0630865133,,, +15.7988281250,15,-2.3260781428,2.1683397924,-2.9104135338,1.3781411749,,, +15.8007812500,15,-1.1654621125,2.4292854644,-2.0398659082,1.4751523838,,, +15.8027343750,15,-0.4325213838,2.3437634039,-1.4931644125,1.3302307372,,, +15.8046875000,15,-0.1612473538,1.9402899743,-1.3246801811,0.9413369324,,, +15.8066406250,15,-0.3323429334,1.2772121492,-1.5427588775,0.3290012408,,, +15.8085937500,15,-0.8791349728,0.4321293241,-2.1113442338,-0.4686986398,,, +15.8105468750,15,-1.6980871187,-0.5093212840,-2.9579153164,-1.4037260246,,, +15.8125000000,15,-2.6643823554,-1.4658696867,-3.9870963800,-2.4278752611,,, +15.8144531250,15,-3.6458758068,-2.3707081558,-5.0914753723,-3.4992175175,,, +15.8164062500,15,-4.5074407275,-3.1701339887,-6.1528322725,-4.5771681604,,, +15.8183593750,15,-5.1116444370,-3.8160769225,-7.0404150940,-5.6125516263,,, +15.8203125000,15,-5.3277365346,-4.2664490798,-7.6177378644,-6.5464246272,,, +15.8222656250,15,-5.0500821167,-4.4917432743,-7.7603189677,-7.3173597145,,, +15.8242187500,15,-4.2166552675,-4.4776561506,-7.3759510969,-7.8675209915,,, +15.8261718750,15,-2.8198783810,-4.2240720464,-6.4183311569,-8.1459195615,,, +15.8281250000,15,-0.9086898397,-3.7443898761,-4.8918512905,-8.1115431254,,, +15.8300781250,15,1.4163985566,-3.0628131370,-2.8500965040,-7.7347913482,,, +15.8320312500,15,4.0116310138,-2.2104702519,-0.3922773322,-6.9987892002,,, +15.8339843750,15,6.6994932983,-1.2252259162,2.3406864232,-5.9049374531,,, +15.8359375000,15,9.2826532086,-0.1517649251,5.1747193534,-4.4781946386,,, +15.8378906250,15,11.5636881177,0.9622503746,7.9187548344,-2.7663030287,,, +15.8398437500,15,13.3642908584,2.0692464550,10.3833094631,-0.8368472132,,, +15.8417968750,15,14.5391598969,3.1222259012,12.3954734257,1.2246985719,,, +15.8437500000,15,14.9863246266,4.0765030740,13.8108492746,3.3187632244,,, +15.8457031250,15,14.6545470033,4.8920379948,14.5238732118,5.3376690463,,, +15.8476562500,15,13.5464685031,5.5347359562,14.4755773369,7.1725821173,,, +15.8496093750,15,11.7195104351,5.9789565879,13.6595742114,8.7223600150,,, +15.8515625000,15,9.2844068603,6.2093870498,12.1252970826,9.9013443847,,, +15.8535156250,15,6.3981668727,6.2190487610,9.9756278182,10.6429930346,,, +15.8554687500,15,3.2537976706,6.0091662451,7.3610621090,10.9049299468,,, +15.8574218750,15,0.0694732720,5.5945203952,4.4718825056,10.6776588083,,, +15.8593750000,15,-2.9266143049,5.0061736132,1.5244935460,9.9884659722,,, +15.8613281250,15,-5.5169223682,4.2871838956,-1.2581619455,8.8973579913,,, +15.8632812500,15,-7.5152104682,3.4875594231,-3.6667074096,7.4914728432,,, +15.8652343750,15,-8.7831206189,2.6617991057,-5.5228952309,5.8804370694,,, +15.8671875000,15,-9.2415461829,1.8673474760,-6.6938797185,4.1906079453,,, +15.8691406250,15,-8.8755547617,1.1639996790,-7.1020554484,2.5582510344,,, +15.8710937500,15,-7.7344911475,0.6117596289,-6.7315099765,1.1198610191,,, +15.8730468750,15,-5.9306746782,0.2623374459,-5.6334183362,-0.0040834921,,, +15.8750000000,15,-3.6357079404,0.1469185816,-3.9285695533,-0.7283995845,,, +15.8769531250,15,-1.0695815498,0.2681418034,-1.8011765672,-1.0162523988,,, +15.8789062500,15,1.5181098638,0.5974294415,0.5178035515,-0.8835710264,,, +15.8808593750,15,3.8703605778,1.0752088211,2.7733255302,-0.3975562977,,, +15.8828125000,15,5.7452633246,1.6164520381,4.7105159713,0.3315546049,,, +15.8847656250,15,6.9365548710,2.1199634258,6.0978225504,1.1634460796,,, +15.8867187500,15,7.2910046269,2.4765922200,6.7485728871,1.9414580827,,, +15.8886718750,15,6.7261006319,2.5814172931,6.5431668599,2.5108835743,,, +15.8906250000,15,5.2458098325,2.3520979137,5.4474370488,2.7413532265,,, +15.8925781250,15,2.9426891484,1.7413562219,3.5162683153,2.5416234459,,, +15.8945312500,15,-0.0144165812,0.7390621242,0.8837782365,1.8643975126,,, +15.8964843750,15,-3.3965128855,-0.6275466963,-2.2498063676,0.7095898275,,, +15.8984375000,15,-6.9336358865,-2.2944156496,-5.6350899565,-0.8742543609,,, +15.9003906250,15,-10.3385899819,-4.1649247524,-8.9961201614,-2.7937483029,,, +15.9023437500,15,-13.3299777271,-6.1149259387,-12.0534133365,-4.9165905301,,, +15.9042968750,15,-15.6547627678,-7.9999103296,-14.5469441680,-7.0801676664,,, +15.9062500000,15,-17.1124371416,-9.6684570147,-16.2605399124,-9.1063077620,,, +15.9082031250,15,-17.5747110865,-10.9776601665,-17.0425948839,-10.8187806947,,, +15.9101562500,15,-16.9935902139,-11.8034068944,-16.8169921845,-12.0572975903,,, +15.9121093750,15,-15.3984957219,-12.0471535949,-15.5839345836,-12.6885885567,,, +15.9140625000,15,-12.8885761687,-11.6456325111,-13.4153396404,-12.6195169368,,, +15.9160156250,15,-9.6233679986,-10.5819207338,-10.4478304352,-11.8106059120,,, +15.9179687500,15,-5.8105914274,-8.8916850618,-6.8724788974,-10.2841491223,,, +15.9199218750,15,-1.6903518752,-6.6639222338,-2.9200795091,-8.1256747915,,, +15.9218750000,15,2.4833236893,-4.0362114638,1.1579184930,-5.4779433844,,, +15.9238281250,15,6.4585341878,-1.1837430931,5.1072905568,-2.5273842632,,, +15.9257812500,15,9.9938502797,1.6947146059,8.6807889974,0.5118886835,,, +15.9277343750,15,12.8660113160,4.3922188345,11.6464885373,3.4146405308,,, +15.9296875000,15,14.8871021669,6.7119196494,13.8059109918,5.9646163691,,, +15.9316406250,15,15.9276073058,8.4877570180,15.0179901880,7.9771992038,,, +15.9335937500,15,15.9349261660,9.6027150216,15.2177173836,9.3185494619,,, +15.9355468750,15,14.9400935824,9.9976892032,14.4228704961,9.9147936787,,, +15.9375000000,15,13.0510065116,9.6701295164,12.7275997229,9.7508953658,,, +15.9394531250,15,10.4374083663,8.6681831764,10.2880686851,8.8650241930,,, +15.9414062500,15,7.3157292853,7.0858373753,7.3084055058,7.3443824022,,, +15.9433593750,15,3.9364083121,5.0603691493,4.0291786415,5.3234593485,,, +15.9453125000,15,0.5676772426,2.7657481495,0.7117983528,2.9775327546,,, +15.9472656250,15,-2.5283971232,0.3959803971,-2.3849772621,0.5057020633,,, +15.9492187500,15,-5.1205956447,-1.8552770836,-5.0291548523,-1.8897002030,,, +15.9511718750,15,-7.0258836068,-3.8105890955,-7.0326433244,-4.0193551699,,, +15.9531250000,15,-8.1203525679,-5.3220089586,-8.2622091124,-5.7206195360,,, +15.9550781250,15,-8.3463031331,-6.2833937615,-8.6466550460,-6.8701898480,,, +15.9570312500,15,-7.7145532260,-6.6380048254,-8.1802402875,-7.3930180128,,, +15.9589843750,15,-6.3027300973,-6.3815289936,-6.9230609613,-7.2676004256,,, +15.9609375000,15,-4.2517211289,-5.5627111620,-4.9993216776,-6.5285200666,,, +15.9628906250,15,-1.7583495070,-4.2784019264,-2.5912268366,-5.2626087744,,, +15.9648437500,15,0.9407825494,-2.6600763390,0.0763137713,-3.5959060032,,, +15.9667968750,15,3.5932348893,-0.8570310553,2.7588912106,-1.6769007313,,, +15.9687500000,15,5.9549325469,0.9776665063,5.2154940223,0.3368662974,,, +15.9707031250,15,7.8111936072,2.7006745456,7.2277874747,2.2910620199,,, +15.9726562500,15,8.9924345129,4.1917354004,8.6154289085,4.0480086920,,, +15.9746093750,15,9.3816777522,5.3608460249,9.2450416556,5.4957338148,,, +15.9765625000,15,8.9206401520,6.1498587851,9.0381456583,6.5518196398,,, +15.9785156250,15,7.6202802393,6.5332346627,7.9839016879,7.1669262018,,, +15.9804687500,15,5.5670445907,6.5172401042,6.1483293917,7.3274638660,,, +15.9824218750,15,2.9166352722,6.1377442054,3.6705518727,7.0559137475,,, +15.9843750000,15,-0.1204901715,5.4583745932,0.7497919245,6.4101555380,,, +15.9863281250,15,-3.2953598474,4.5661727312,-2.3697206443,5.4798598543,,, +15.9882812500,15,-6.3384699688,3.5628085244,-5.4163964397,4.3774958729,,, +15.9902343750,15,-8.9813079966,2.5548158728,-8.1140138216,3.2265521300,,, +15.9921875000,15,-10.9797163138,1.6439280459,-10.2070217389,2.1489913477,,, +15.9941406250,15,-12.1361422480,0.9161210166,-11.4843729438,1.2518505970,,, +15.9960937500,15,-12.3176026493,0.4329439303,-11.7990896933,0.6162476247,,, +15.9980468750,15,-11.4683211973,0.2263865907,-11.0825723405,0.2900161318,,, +16.0000000000,16,-10.5103123735,1.0846606492,-8.4482339901,-0.5408584952,33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000:10.0000000000:11.0000000000:12.0000000000:13.0000000000:14.0000000000:15.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +16.0019531250,16,-8.0854485064,1.6567648654,-5.5010230975,-0.5527299656,,, +16.0039062500,16,-4.9074154457,2.3323850597,-1.8974119646,-0.2986187678,,, +16.0058593750,16,-1.2015209201,2.9979516599,2.0913591608,0.1450214790,,, +16.0078125000,16,2.7627415172,3.5395590732,6.1614009174,0.6818247719,,, +16.0097656250,16,6.6917583107,3.8565942295,9.9995344844,1.2076210927,,, +16.0117187500,16,10.2899201032,3.8720752382,13.3052639569,1.6213916581,,, +16.0136718750,16,13.2844491983,3.5384483125,15.8140115743,1.8350071943,,, +16.0156250000,16,15.4515530492,2.8410920306,17.3217248861,1.7833023508,,, +16.0175781250,16,16.6336327760,1.7969552381,17.7007894726,1.4288279328,,, +16.0195312500,16,16.7393416862,0.4446862678,16.8993933250,0.7566182051,,, +16.0214843750,16,15.7369851549,-1.1660139872,14.9336823895,-0.2320883927,,, +16.0234375000,16,13.6578809993,-2.9741466558,11.8874646509,-1.5157607852,,, +16.0253906250,16,10.6069629383,-4.8996124097,7.9187304149,-3.0421584361,,, +16.0273437500,16,6.7649883517,-6.8404989975,3.2604797984,-4.7240871701,,, +16.0292968750,16,2.3771268226,-8.6788630543,-1.7913100827,-6.4450603294,,, +16.0312500000,16,-2.2656176247,-10.2902177775,-6.8995651134,-8.0702177080,,, +16.0332031250,16,-6.8476119385,-11.5543128297,-11.7126759982,-9.4592212809,,, +16.0351562500,16,-11.0516673655,-12.3660269172,-15.8931433526,-10.4793090757,,, +16.0371093750,16,-14.5806595445,-12.6421423104,-19.1437839950,-11.0144963142,,, +16.0390625000,16,-17.1776825496,-12.3250056875,-21.2289419058,-10.9721963801,,, +16.0410156250,16,-18.6493486176,-11.3895114951,-21.9943152257,-10.2936826927,,, +16.0429687500,16,-18.8876029203,-9.8504179518,-21.3833738637,-8.9654204460,,, +16.0449218750,16,-17.8809361560,-7.7635560139,-19.4426725633,-7.0241180279,,, +16.0468750000,16,-15.7156197853,-5.2236510068,-16.3158514366,-4.5566957716,,, +16.0488281250,16,-12.5691810503,-2.3592523979,-12.2299446403,-1.6953827716,,, +16.0507812500,16,-8.6941340781,0.6788251762,-7.4751512250,1.3947128853,,, +16.0527343750,16,-4.3937533244,3.7300914153,-2.3807852804,4.5300487264,,, +16.0546875000,16,0.0066484433,6.6328116572,2.7106006406,7.5204640148,,, +16.0566406250,16,4.1884855065,9.2323444070,7.4689106709,10.1821549560,,, +16.0585937500,16,7.8593059976,11.3866572845,11.5945772184,12.3489909942,,, +16.0605468750,16,10.7623136718,12.9638781655,14.8275602672,13.8765513676,,, +16.0625000000,16,12.6888706687,13.8441439938,16.9581659239,14.6471957207,,, +16.0644531250,16,13.4986814745,13.9367790825,17.8456316224,14.5840587121,,, +16.0664062500,16,13.1382361023,13.2027142628,17.4371331004,13.6669064214,,, +16.0683593750,16,11.6494622611,11.6695011460,15.7776412619,11.9411239178,,, +16.0703125000,16,9.1680057269,9.4357671134,13.0075605256,9.5178739353,,, +16.0722656250,16,5.9126735383,6.6632454168,9.3506281939,6.5647818081,,, +16.0742187500,16,2.1674338727,3.5578493952,5.0952253176,3.2884936342,,, +16.0761718750,16,-1.7407999582,0.3490014742,0.5716304076,-0.0843691445,,, +16.0781250000,16,-5.4669099368,-2.7284076416,-3.8726400707,-3.3244025101,,, +16.0800781250,16,-8.6763916450,-5.4539741573,-7.8988330823,-6.2175238859,,, +16.0820312500,16,-11.0758217483,-7.6417833938,-11.2027479140,-8.5820926552,,, +16.0839843750,16,-12.4398820965,-9.1542161107,-13.5379188669,-10.2807964045,,, +16.0859375000,16,-12.6332624482,-9.9110538887,-14.7356069201,-11.2297167947,,, +16.0878906250,16,-11.6242130901,-9.8942689632,-14.7187618388,-11.4046299681,,, +16.0898437500,16,-9.4854091764,-9.1443512754,-13.5059902048,-10.8391835515,,, +16.0917968750,16,-6.3842466242,-7.7520053987,-11.2069735661,-9.6169801145,,, +16.0937500000,16,-2.5661671941,-5.8512695572,-8.0116938397,-7.8633997391,,, +16.0957031250,16,1.6694536175,-3.6098268522,-4.1724272906,-5.7350033104,,, +16.0976562500,16,5.9980049886,-1.2133940410,0.0194458248,-3.4049764765,,, +16.0996093750,16,10.0938629081,1.1480587408,4.2544846875,-1.0513438277,,, +16.1015625000,16,13.6470767190,3.2888241145,8.2215878351,1.1502994166,,, +16.1035156250,16,16.3816048623,5.0392419904,11.6273604756,3.0376171009,,, +16.1054687500,16,18.0784904565,6.2632110694,14.2207381800,4.4765674315,,, +16.1074218750,16,18.5943400879,6.8726777451,15.8133427727,5.3723769972,,, +16.1093750000,16,17.8714850753,6.8352578407,16.2913649133,5.6760750106,,, +16.1113281250,16,15.9432277184,6.1763090717,15.6221068909,5.3893973488,,, +16.1132812500,16,12.9329469674,4.9749909552,13.8559165586,4.5649173587,,, +16.1152343750,16,9.0459021831,3.3555511739,11.1230615572,3.3003706795,,, +16.1171875000,16,4.5541207682,1.4742554515,7.6238578682,1.7281266586,,, +16.1191406250,16,-0.2267023337,-0.4993063040,3.6106464778,-0.0008848985,,, +16.1210937500,16,-4.9656222518,-2.4014833952,-0.6346448366,-1.7347629611,,, +16.1230468750,16,-9.3427937593,-4.0860485426,-4.8213246474,-3.3320376769,,, +16.1250000000,16,-13.0711987561,-5.4289117689,-8.6674734773,-4.6667592756,,, +16.1269531250,16,-15.9187266608,-6.3350301379,-11.9186263396,-5.6352306620,,, +16.1289062500,16,-17.7298604789,-6.7484353850,-14.3693636803,-6.1657142577,,, +16.1308593750,16,-18.4377318952,-6.6573879856,-15.8809595563,-6.2236797468,,, +16.1328125000,16,-18.0625291611,-6.0921064502,-16.3887946520,-5.8102607760,,, +16.1347656250,16,-16.7001829923,-5.1182142032,-15.9006642784,-4.9574819660,,, +16.1367187500,16,-14.5066654914,-3.8276646147,-14.4904376450,-3.7224752705,,, +16.1386718750,16,-11.6818738268,-2.3290773380,-12.2894204101,-2.1826208793,,, +16.1406250000,16,-8.4532386625,-0.7383605677,-9.4742030085,-0.4321604992,,, +16.1425781250,16,-5.0562883855,0.8332641434,-6.2499405503,1.4234425459,,, +16.1445312500,16,-1.7139187666,2.2932972563,-2.8321597943,3.2775150428,,, +16.1464843750,16,1.3787239456,3.5762048506,0.5683322732,5.0317538397,,, +16.1484375000,16,4.0617699607,4.6403421664,3.7563826366,6.6000641001,,, +16.1503906250,16,6.2163105507,5.4592089477,6.5616970347,7.9092828190,,, +16.1523437500,16,7.7702411385,6.0160598140,8.8468956132,8.9014365550,,, +16.1542968750,16,8.6983336322,6.3021836841,10.5108896659,9.5353754363,,, +16.1562500000,16,9.0170565187,6.3164830163,11.4887981250,9.7859449680,,, +16.1582031250,16,8.7807554736,6.0660187765,11.7542333554,9.6422003282,,, +16.1601562500,16,8.0762341129,5.5641873677,11.3222382583,9.1040849258,,, +16.1621093750,16,7.0114328974,4.8272821730,10.2479757873,8.1802053469,,, +16.1640625000,16,5.7020434062,3.8749731209,8.6209339835,6.8905520143,,, +16.1660156250,16,4.2592620475,2.7343180661,6.5564712858,5.2712492711,,, +16.1679687500,16,2.7811645140,1.4447026621,4.1881706694,3.3787963059,,, +16.1699218750,16,1.3507557088,0.0626400985,1.6622921645,1.2936086049,,, +16.1718750000,16,0.0376519341,-1.3384195552,-0.8695254649,-0.8819283507,,, +16.1738281250,16,-1.1009514906,-2.6753705111,-3.2597469130,-3.0324666714,,, +16.1757812500,16,-2.0189923728,-3.8639071816,-5.3724164957,-5.0388849947,,, +16.1777343750,16,-2.6809789241,-4.8265075913,-7.0899560998,-6.7862528410,,, +16.1796875000,16,-3.0647432879,-5.5028907254,-8.3215605044,-8.1749370777,,, +16.1816406250,16,-3.1633353531,-5.8574051185,-9.0081031390,-9.1303962265,,, +16.1835937500,16,-2.9826866276,-5.8772984276,-9.1211503013,-9.6055765189,,, +16.1855468750,16,-2.5411744924,-5.5692951749,-8.6629499289,-9.5822092640,,, +16.1875000000,16,-1.8754709276,-4.9622604798,-7.6714098738,-9.0764541302,,, +16.1894531250,16,-1.0445675430,-4.1095383693,-6.2226243652,-8.1406446923,,, +16.1914062500,16,-0.1252332796,-3.0847658468,-4.4248920876,-6.8568239568,,, +16.1933593750,16,0.7961339508,-1.9761053593,-2.4090286541,-5.3299763504,,, +16.1953125000,16,1.6319356891,-0.8822927230,-0.3189880717,-3.6835681419,,, +16.1972656250,16,2.3036325595,0.0930707385,1.6985717695,-2.0525979874,,, +16.1992187500,16,2.7514469873,0.8517088600,3.5059449760,-0.5725176792,,, +16.2011718750,16,2.9417771478,1.3152681396,4.9874526881,0.6362842997,,, +16.2031250000,16,2.8724696459,1.4406337368,6.0623775620,1.4862361151,,, +16.2050781250,16,2.5714419001,1.2277387101,6.6913321952,1.9337747361,,, +16.2070312500,16,2.0868287179,0.7167057405,6.8737069040,1.9797003282,,, +16.2089843750,16,1.4755617228,-0.0194435479,6.6412886040,1.6649588308,,, +16.2109375000,16,0.7965459355,-0.8819065826,6.0523726396,1.0665820886,,, +16.2128906250,16,0.1071974911,-1.7558425237,5.1858060142,0.2902226017,,, +16.2148437500,16,-0.5399243355,-2.5246972835,4.1325667099,-0.5440160089,,, +16.2167968750,16,-1.1006434799,-3.0851125792,2.9851252305,-1.3188678711,,, +16.2187500000,16,-1.5419909142,-3.3589129936,1.8280423127,-1.9350730930,,, +16.2207031250,16,-1.8429157021,-3.3010115189,0.7337975513,-2.3205684860,,, +16.2226562500,16,-1.9918478968,-2.9008630968,-0.2354606468,-2.4309117184,,, +16.2246093750,16,-1.9837234901,-2.1778224516,-1.0246661581,-2.2443746185,,, +16.2265625000,16,-1.8198110853,-1.1750121151,-1.5858188611,-1.7592854808,,, +16.2285156250,16,-1.5087359642,0.0461396605,-1.8806306177,-0.9941784914,,, +16.2304687500,16,-1.0652198477,1.4114026811,-1.8827568645,0.0138557572,,, +16.2324218750,16,-0.5088750178,2.8379097437,-1.5811511606,1.2107927772,,, +16.2343750000,16,0.1333939361,4.2358059998,-0.9873991765,2.5239846686,,, +16.2363281250,16,0.8249879686,5.5097460040,-0.1428668287,3.8620603815,,, +16.2382812500,16,1.5218441500,6.5635523191,0.8810084348,5.1215327561,,, +16.2402343750,16,2.1787413902,7.3101369175,1.9906889883,6.1990050504,,, +16.2421875000,16,2.7567830073,7.6859195430,3.0833328047,7.0062087508,,, +16.2441406250,16,3.2274219317,7.6622287725,4.0578301779,7.4822671454,,, +16.2460937500,16,3.5688815743,7.2443034252,4.8193586625,7.5952405805,,, +16.2480468750,16,3.7589074352,6.4611619520,5.2814013896,7.3350181058,,, +16.2500000000,16,3.7735202368,5.3597570870,5.3728820968,6.7096736391,,, +16.2519531250,16,3.5939702016,4.0069751958,5.0504326445,5.7493272942,,, +16.2539062500,16,3.2149656601,2.4906795140,4.3081062064,4.5098165064,,, +16.2558593750,16,2.6495059956,0.9144456228,3.1793727289,3.0708530535,,, +16.2578125000,16,1.9314494845,-0.6114288931,1.7339477614,1.5301535548,,, +16.2597656250,16,1.1155415786,-1.9805165500,0.0728067436,-0.0052913759,,, +16.2617187500,16,0.2710177111,-3.1023911849,-1.6807597900,-1.4311464970,,, +16.2636718750,16,-0.5315352058,-3.9131357548,-3.3959711954,-2.6577090672,,, +16.2656250000,16,-1.2342277541,-4.3802180571,-4.9513414466,-3.6177326834,,, +16.2675781250,16,-1.8001199657,-4.5008038852,-6.2468322682,-4.2686424470,,, +16.2695312500,16,-2.2124014935,-4.2936582349,-7.2074483413,-4.5878999515,,, +16.2714843750,16,-2.4681690520,-3.7893005797,-7.7815345616,-4.5655245679,,, +16.2734375000,16,-2.5750405120,-3.0276955250,-7.9414449733,-4.2040231506,,, +16.2753906250,16,-2.5514198626,-2.0632306930,-7.6872463427,-3.5254383438,,, +16.2773437500,16,-2.4225529764,-0.9658095047,-7.0459967692,-2.5736827766,,, +16.2792968750,16,-2.2124853770,0.1854940731,-6.0654043891,-1.4099776342,,, +16.2812500000,16,-1.9417936570,1.3091763078,-4.8098461451,-0.1094386204,,, +16.2832031250,16,-1.6315289804,2.3264531181,-3.3602908850,1.2410455354,,, +16.2851562500,16,-1.3052645786,3.1675039218,-1.8116630116,2.5483567651,,, +16.2871093750,16,-0.9888296901,3.7767506642,-0.2664278369,3.7199432104,,, +16.2890625000,16,-0.7103848495,4.1162906976,1.1723547769,4.6696713739,,, +16.2910156250,16,-0.4981177589,4.1699128365,2.4083866432,5.3249530948,,, +16.2929687500,16,-0.3746437880,3.9454969483,3.3608162579,5.6342281122,,, +16.2949218750,16,-0.3522973142,3.4725597090,3.9719515867,5.5709578726,,, +16.2968750000,16,-0.4306076843,2.7975995767,4.2121687219,5.1344031754,,, +16.2988281250,16,-0.5941775805,1.9794449626,4.0828854421,4.3495790699,,, +16.3007812500,16,-0.8139162852,1.0817801378,3.6155059210,3.2644886305,,, +16.3027343750,16,-1.0542274860,0.1634349399,2.8646059597,1.9434356811,,, +16.3046875000,16,-1.2814969987,-0.7275900208,1.9002819143,0.4606333094,,, +16.3066406250,16,-1.4692706761,-1.5540747024,0.8037601966,-1.1032503263,,, +16.3085937500,16,-1.6009730354,-2.2873122803,-0.3367804926,-2.6639395804,,, +16.3105468750,16,-1.6725736298,-2.9075976036,-1.4348558538,-4.1386335379,,, +16.3125000000,16,-1.6946863760,-3.4082502349,-2.4173020903,-5.4535462884,,, +16.3144531250,16,-1.6902803839,-3.7986834786,-3.2315776457,-6.5517657916,,, +16.3164062500,16,-1.6869928015,-4.1021521652,-3.8459589081,-7.3977883068,,, +16.3183593750,16,-1.7106874257,-4.3492226492,-4.2488587896,-7.9770921884,,, +16.3203125000,16,-1.7841735179,-4.5710262196,-4.4495411224,-8.2931677898,,, +16.3222656250,16,-1.9258854492,-4.7933025433,-4.4748138508,-8.3635870222,,, +16.3242187500,16,-2.1462136425,-5.0319932849,-4.3616664469,-8.2156995104,,, +16.3261718750,16,-2.4436381220,-5.2924722015,-4.1485672017,-7.8833858089,,, +16.3281250000,16,-2.8004379852,-5.5689182781,-3.8652242897,-7.4030479365,,, +16.3300781250,16,-3.1792899837,-5.8400082562,-3.5245911914,-6.8065566650,,, +16.3320312500,16,-3.5233686801,-6.0654008851,-3.1206394530,-6.1143464821,,, +16.3339843750,16,-3.7587756046,-6.1877549025,-2.6293279552,-5.3328088225,,, +16.3359375000,16,-3.7995729720,-6.1400432974,-2.0126910175,-4.4566048794,,, +16.3378906250,16,-3.5610695011,-5.8589317478,-1.2310711971,-3.4767239565,,, +16.3398437500,16,-2.9809379503,-5.3028183118,-0.2615742511,-2.3935759542,,, +16.3417968750,16,-2.0359051545,-4.4636204271,0.8892721738,-1.2261466324,,, +16.3437500000,16,-0.7465851411,-3.3642556048,2.1843017996,-0.0093449907,,, +16.3457031250,16,0.8241241269,-2.0499320620,3.5597365249,1.2144029667,,, +16.3476562500,16,2.5759074796,-0.5827948010,4.9314282984,2.4004252068,,, +16.3496093750,16,4.3810429482,0.9617217135,6.2042460747,3.5041671707,,, +16.3515625000,16,6.0976487420,2.4995571543,7.2818583250,4.4826043640,,, +16.3535156250,16,7.5848534446,3.9440369674,8.0769909853,5.2959437261,,, +16.3554687500,16,8.7209114882,5.2153420324,8.5242106528,5.9135712417,,, +16.3574218750,16,9.4205905537,6.2516699926,8.5910939127,6.3230926974,,, +16.3593750000,16,9.6440277036,7.0145478208,8.2813939362,6.5331254984,,, +16.3613281250,16,9.3934689972,7.4858917403,7.6283602302,6.5656781198,,, +16.3632812500,16,8.7037889523,7.6637910285,6.6837095514,6.4463074795,,, +16.3652343750,16,7.6343536538,7.5612921501,5.5104631908,6.1995976322,,, +16.3671875000,16,6.2627541084,7.2053610086,4.1801579238,5.8478174750,,, +16.3691406250,16,4.6795037189,6.6357236489,2.7697248390,5.4108932888,,, +16.3710937500,16,2.9849533510,5.9043103857,1.3577212566,4.9094063384,,, +16.3730468750,16,1.2866920344,5.0723902522,0.0214453237,4.3677251819,,, +16.3750000000,16,-0.3061595393,4.2055519096,-1.1666199547,3.8133989714,,, +16.3769531250,16,-1.6918621714,3.3691373804,-2.1444900392,3.2743583318,,, +16.3789062500,16,-2.7849563450,2.6230751263,-2.8666095297,2.7757329177,,, +16.3808593750,16,-3.5238947077,2.0142708894,-3.3082560734,2.3352809390,,, +16.3828125000,16,-3.8796203787,1.5676705753,-3.4699592474,1.9576846421,,, +16.3847656250,16,-3.8638363201,1.2799430388,-3.3814169900,1.6308150663,,, +16.3867187500,16,-3.5308708227,1.1201644119,-3.0997245332,1.3276001589,,, +16.3886718750,16,-2.9701005720,1.0382287846,-2.6996318854,1.0143989055,,, +16.3906250000,16,-2.2905710767,0.9778675137,-2.2592188788,0.6625146074,,, +16.3925781250,16,-1.6030060079,0.8881250619,-1.8466059163,0.2562734373,,, +16.3945312500,16,-1.0074774607,0.7260110737,-1.5141572444,-0.2080764319,,, +16.3964843750,16,-0.5883972765,0.4522110501,-1.3010539119,-0.7295892863,,, +16.3984375000,16,-0.4114063595,0.0302532199,-1.2375033136,-1.3068642798,,, +16.4003906250,16,-0.5204842263,-0.5684852799,-1.3458113520,-1.9378164696,,, +16.4023437500,16,-0.9337777296,-1.3579398191,-1.6369137083,-2.6181308162,,, +16.4042968750,16,-1.6351773342,-2.3276431744,-2.1018069791,-3.3364604478,,, +16.4062500000,16,-2.5673244987,-3.4334675189,-2.7029752767,-4.0677004991,,, +16.4082031250,16,-3.6360475809,-4.5996668042,-3.3748851498,-4.7725505663,,, +16.4101562500,16,-4.7257931642,-5.7318982752,-4.0355479861,-5.4044741251,,, +16.4121093750,16,-5.7156701365,-6.7300969087,-4.6005859477,-5.9165829448,,, +16.4140625000,16,-6.4895922196,-7.4976507237,-4.9923443496,-6.2654047819,,, +16.4160156250,16,-6.9435302716,-7.9501160275,-5.1462141943,-6.4142088378,,, +16.4179687500,16,-6.9947720574,-8.0245165688,-5.0179284851,-6.3375689049,,, +16.4199218750,16,-6.5927200528,-7.6882863753,-4.5899280417,-6.0262514456,,, +16.4218750000,16,-5.7267154150,-6.9447634747,-3.8736658697,-5.4896945977,,, +16.4238281250,16,-4.4280777781,-5.8321614059,-2.9076289904,-4.7544877902,,, +16.4257812500,16,-2.7670504924,-4.4172174402,-1.7518227586,-3.8600298020,,, +16.4277343750,16,-0.8460686493,-2.7853082914,-0.4792930965,-2.8514079027,,, +16.4296875000,16,1.2098705851,-1.0282849201,0.8328706936,-1.7698207632,,, +16.4316406250,16,3.2651044038,0.7647571396,2.1103799812,-0.6462618843,,, +16.4335937500,16,5.1850836861,2.5084563024,3.2856539189,0.4956835307,,, +16.4355468750,16,6.8454291642,4.1173879050,4.2989065528,1.6315290573,,, +16.4375000000,16,8.1406764330,5.5075538423,5.0993943317,2.7320334005,,, +16.4394531250,16,8.9945313294,6.6057961343,5.6494961727,3.7662089871,,, +16.4414062500,16,9.3666129961,7.3599562585,5.9286093144,4.7055487907,,, +16.4433593750,16,9.2525597585,7.7446215681,5.9339985764,5.5269745163,,, +16.4453125000,16,8.6791674048,7.7613775011,5.6794930278,6.2132596409,,, +16.4472656250,16,7.6946595132,7.4328990957,5.1916889897,6.7475727236,,, +16.4492187500,16,6.3573894554,6.7946657959,4.5037681165,7.1060340855,,, +16.4511718750,16,4.7322331072,5.8921224366,3.6522526283,7.2586356842,,, +16.4531250000,16,2.8961921827,4.7833879508,2.6796560989,7.1789590241,,, +16.4550781250,16,0.9439492784,3.5394826293,1.6376633175,6.8532608281,,, +16.4570312500,16,-1.0119557391,2.2402832062,0.5867042504,6.2855186771,,, +16.4589843750,16,-2.8462562729,0.9688530970,-0.4072375176,5.4987882120,,, +16.4609375000,16,-4.4324152187,-0.1969304386,-1.2784840298,4.5303419808,,, +16.4628906250,16,-5.6572708409,-1.1923736362,-1.9685304815,3.4247230234,,, +16.4648437500,16,-6.4321045782,-1.9678881604,-2.4299071696,2.2322654250,,, +16.4667968750,16,-6.6999268121,-2.4885893717,-2.6277410183,1.0097614663,,, +16.4687500000,16,-6.4426335530,-2.7369229176,-2.5432130413,-0.1828376736,,, +16.4707031250,16,-5.6859601124,-2.7150120843,-2.1787489509,-1.2872567610,,, +16.4726562500,16,-4.4994573364,-2.4457996571,-1.5621716540,-2.2519230535,,, +16.4746093750,16,-2.9937546439,-1.9772021783,-0.7500071418,-3.0398641086,,, +16.4765625000,16,-1.3133277128,-1.3850687506,0.1719605163,-3.6358596217,,, +16.4785156250,16,0.3810263936,-0.7661539582,1.0976641114,-4.0464877595,,, +16.4804687500,16,1.9351693837,-0.2222781743,1.9188372612,-4.2936191244,,, +16.4824218750,16,3.2172381548,0.1550523017,2.5409955964,-4.4070871438,,, +16.4843750000,16,4.1230759076,0.2939075763,2.8911150623,-4.4209877572,,, +16.4863281250,16,4.5794573860,0.1477766602,2.9220623180,-4.3723839801,,, +16.4882812500,16,4.5482770434,-0.2982741385,2.6165677636,-4.2983784321,,, +16.4902343750,16,4.0276664318,-1.0237595364,1.9867825019,-4.2313086067,,, +16.4921875000,16,3.0504473667,-1.9756541677,1.0695914260,-4.1949123028,,, +16.4941406250,16,1.6844696301,-3.0758956149,-0.0767447284,-4.2021377599,,, +16.4960937500,16,0.0347399853,-4.2274251324,-1.3726312663,-4.2526052617,,, +16.4980468750,16,-1.7584036533,-5.3198366424,-2.7183879351,-4.3311566729,,, +16.5000000000,16,-3.5306395819,-6.2405411973,-4.0018429918,-4.4115933544,,, +16.5019531250,16,-5.1126391434,-6.8884262295,-5.1113054401,-4.4628159674,,, +16.5039062500,16,-6.3492105338,-7.1828527152,-5.9485185013,-4.4517967222,,, +16.5058593750,16,-7.1155627273,-7.0696857312,-6.4386295901,-4.3455648956,,, +16.5078125000,16,-7.3327600934,-6.5280947982,-6.5385727753,-4.1161290730,,, +16.5097656250,16,-6.9803317060,-5.5746381851,-6.2443684593,-3.7460765969,,, +16.5117187500,16,-6.0987282731,-4.2608860524,-5.5925963606,-3.2308737121,,, +16.5136718750,16,-4.7780841131,-2.6659373321,-4.6511299045,-2.5766306859,,, +16.5156250000,16,-3.1379269206,-0.8863496381,-3.5021856935,-1.7947426900,,, +16.5175781250,16,-1.3079741641,0.9721297656,-2.2280288970,-0.8986456227,,, +16.5195312500,16,0.5816890906,2.7971084528,-0.9065157165,0.0927490548,,, +16.5214843750,16,2.4035003047,4.4720192608,0.3878757000,1.1497699130,,, +16.5234375000,16,4.0368452192,5.8852321496,1.5857242447,2.2321447958,,, +16.5253906250,16,5.3750806475,6.9408331627,2.6269659075,3.2927657405,,, +16.5273437500,16,6.3318244245,7.5663137853,3.4640929512,4.2816159757,,, +16.5292968750,16,6.8488881019,7.7220126603,4.0657383586,5.1526398815,,, +16.5312500000,16,6.9065298623,7.4128284151,4.4217109496,5.8730354919,,, +16.5332031250,16,6.5268295309,6.6914464520,4.5434889915,6.4263236405,,, +16.5351562500,16,5.7661827850,5.6476224151,4.4569307435,6.8063456374,,, +16.5371093750,16,4.7070266448,4.3931226922,4.1948315334,7.0111112865,,, +16.5390625000,16,3.4531335442,3.0497641110,3.7945040951,7.0409554829,,, +16.5410156250,16,2.1215096278,1.7376370116,3.2961290534,6.8971672152,,, +16.5429687500,16,0.8299253156,0.5648058472,2.7399921175,6.5826074656,,, +16.5449218750,16,-0.3152913634,-0.3776762332,2.1648743636,6.1067180506,,, +16.5468750000,16,-1.2303665228,-1.0198133406,1.6066805381,5.4887586236,,, +16.5488281250,16,-1.8635642609,-1.3193836312,1.0948065243,4.7552846627,,, +16.5507812500,16,-2.2000842090,-1.2681071179,0.6471104063,3.9361524860,,, +16.5527343750,16,-2.2604675138,-0.8941887665,0.2677891252,3.0621476631,,, +16.5546875000,16,-2.0908925623,-0.2578313530,-0.0474381091,2.1649653337,,, +16.5566406250,16,-1.7459145639,0.5624450580,-0.3002751950,1.2809347250,,, +16.5585937500,16,-1.2743640589,1.4827674312,-0.4829376891,0.4523963821,,, +16.5605468750,16,-0.7204681637,2.4137923929,-0.5832984823,-0.2825027370,,, +16.5625000000,16,-0.1332395969,3.2552839884,-0.5955203731,-0.9038650099,,, +16.5644531250,16,0.4327593203,3.9019812028,-0.5237859499,-1.4120006915,,, +16.5664062500,16,0.9255645998,4.2598571105,-0.3784489312,-1.8190837813,,, +16.5683593750,16,1.3015982563,4.2616902936,-0.1730269450,-2.1418146782,,, +16.5703125000,16,1.5276291326,3.8778776822,0.0754821100,-2.3967260866,,, +16.5722656250,16,1.5841032779,3.1212550740,0.3470336448,-2.5965915846,,, +16.5742187500,16,1.4682950340,2.0431082702,0.6199112757,-2.7506090403,,, +16.5761718750,16,1.1928628381,0.7221783921,0.8697103995,-2.8679244542,,, +16.5781250000,16,0.7817441185,-0.7473963804,1.0677431077,-2.9599269025,,, +16.5800781250,16,0.2665896691,-2.2667864909,1.1830817757,-3.0406953949,,, +16.5820312500,16,-0.3162335533,-3.7407911494,1.1874096912,-3.1264008058,,, +16.5839843750,16,-0.9269920102,-5.0807745503,1.0601947893,-3.2306349862,,, +16.5859375000,16,-1.5248766604,-6.2060427884,0.7918183659,-3.3578558887,,, +16.5878906250,16,-2.0759737027,-7.0503404191,0.3820785466,-3.5020205022,,, +16.5898437500,16,-2.5604092462,-7.5684042684,-0.1622690965,-3.6482024862,,, +16.5917968750,16,-2.9702704231,-7.7362641837,-0.8253840822,-3.7718186471,,, +16.5937500000,16,-3.3039302298,-7.5509716776,-1.5789040986,-3.8399722750,,, +16.5957031250,16,-3.5632923122,-7.0329901885,-2.3821251322,-3.8187055177,,, +16.5976562500,16,-3.7512287090,-6.2256815580,-3.1847026260,-3.6814556975,,, +16.5996093750,16,-3.8693135587,-5.1921915203,-3.9319209082,-3.4165888715,,, +16.6015625000,16,-3.9173755916,-4.0119510981,-4.5715245414,-3.0328034593,,, +16.6035156250,16,-3.8908695448,-2.7719717908,-5.0562886649,-2.5563755399,,, +16.6054687500,16,-3.7780491114,-1.5557004770,-5.3441473094,-2.0228346620,,, +16.6074218750,16,-3.5635681942,-0.4389971227,-5.4026673904,-1.4726703198,,, +16.6093750000,16,-3.2346179485,0.5097621184,-5.2145385609,-0.9496351671,,, +16.6113281250,16,-2.7825565125,1.2342282715,-4.7780078582,-0.4953728631,,, +16.6132812500,16,-2.2025884922,1.6979019645,-4.1044446384,-0.1422440447,,, +16.6152343750,16,-1.4954499053,1.8898635204,-3.2172495575,0.0921005960,,, +16.6171875000,16,-0.6686511538,1.8270851426,-2.1518067910,0.2083124086,,, +16.6191406250,16,0.2631774324,1.5516824975,-0.9551658213,0.2247565991,,, +16.6210937500,16,1.2743007199,1.1220171144,0.3134701601,0.1700932931,,, +16.6230468750,16,2.3225764573,0.6034480116,1.5832793151,0.0747480417,,, +16.6250000000,16,3.3502244893,0.0635292726,2.7775373313,-0.0320530459,,, +16.6269531250,16,4.2892577569,-0.4323632998,3.8221280025,-0.1229728722,,, +16.6289062500,16,5.0679323164,-0.8264686988,4.6526590355,-0.1739426651,,, +16.6308593750,16,5.6211305631,-1.0703221409,5.2216091312,-0.1630672975,,, +16.6328125000,16,5.9035786263,-1.1232365809,5.5057049735,-0.0684102587,,, +16.6347656250,16,5.8986076293,-0.9543570178,5.5096687737,0.1300026928,,, +16.6367187500,16,5.6198932475,-0.5513347122,5.2642705439,0.4435218404,,, +16.6386718750,16,5.1080253790,0.0704743713,4.8198844530,0.8682443454,,, +16.6406250000,16,4.4227094213,0.8666069507,4.2383576452,1.3826416418,,, +16.6425781250,16,3.6324532383,1.7705413147,3.5851251742,1.9497315526,,, +16.6445312500,16,2.8046463267,2.7037069137,2.9212046651,2.5215096113,,, +16.6464843750,16,1.9972060861,3.5839338391,2.2960239181,3.0437442386,,, +16.6484375000,16,1.2524660791,4.3330071191,1.7431926592,3.4618978790,,, +16.6503906250,16,0.5939134477,4.8851756864,1.2776589252,3.7289813484,,, +16.6523437500,16,0.0267504298,5.1943882414,0.8940724874,3.8131117545,,, +16.6542968750,16,-0.4557677110,5.2390813651,0.5715494227,3.7035643040,,, +16.6562500000,16,-0.8628338896,5.0258521847,0.2838009603,3.4151651073,,, +16.6582031250,16,-1.2011786673,4.5894763749,0.0055932045,2.9876733854,,, +16.6601562500,16,-1.4771449814,3.9860251018,-0.2864608244,2.4780694340,,, +16.6621093750,16,-1.6990300008,3.2832663412,-0.6122810380,1.9507574043,,, +16.6640625000,16,-1.8746724015,2.5546831732,-0.9833161408,1.4715812144,,, +16.6660156250,16,-2.0090871557,1.8753854808,-1.3987192602,1.1036028287,,, +16.6679687500,16,-2.1067058894,1.3158066174,-1.8455964647,0.9006899559,,, +16.6699218750,16,-2.1738328303,0.9346428963,-2.3007668672,0.9008502901,,, +16.6718750000,16,-2.2174193012,0.7725590969,-2.7326492183,1.1212629035,,, +16.6738281250,16,-2.2409596352,0.8472390923,-3.1033426595,1.5550867979,,, +16.6757812500,16,-2.2391971021,1.1522880275,-3.3701180188,2.1713528690,,, +16.6777343750,16,-2.1973158476,1.6571182207,-3.4901062251,2.9156313522,,, +16.6796875000,16,-2.0987227249,2.3022119826,-3.4312260080,3.7082638824,,, +16.6816406250,16,-1.9344200685,2.9965071875,-3.1821203145,4.4461344490,,, +16.6835937500,16,-1.7057514084,3.6284042186,-2.7541143192,5.0157785410,,, +16.6855468750,16,-1.4222832527,4.0860566356,-2.1783090059,5.3131541854,,, +16.6875000000,16,-1.0989333602,4.2745822046,-1.5008280388,5.2598187450,,, +16.6894531250,16,-0.7518735569,4.1273074246,-0.7743276345,4.8129848511,,, +16.6914062500,16,-0.3940581562,3.6120275412,-0.0482635664,3.9702050130,,, +16.6933593750,16,-0.0335582369,2.7321731680,0.6369346468,2.7684223579,,, +16.6953125000,16,0.3256461002,1.5268836020,1.2517714840,1.2809014521,,, +16.6972656250,16,0.6819950323,0.0709766336,1.7767948406,-0.3864411029,,, +16.6992187500,16,1.0324007121,-1.5324501903,2.1986201616,-2.1058386189,,, +16.7011718750,16,1.3664130813,-3.1684074571,2.5052917671,-3.7469823352,,, +16.7031250000,16,1.6650127562,-4.7243312538,2.6863298967,-5.1923791760,,, +16.7050781250,16,1.9071362667,-6.0957470325,2.7388744894,-6.3417723075,,, +16.7070312500,16,2.0760918578,-7.1906204417,2.6731700021,-7.1158359142,,, +16.7089843750,16,2.1607705520,-7.9369850521,2.5121310958,-7.4651864282,,, +16.7109375000,16,2.1557309258,-8.2901324806,2.2869487638,-7.3780000502,,, +16.7128906250,16,2.0616101983,-8.2390481219,2.0311355640,-6.8831848222,,, +16.7148437500,16,1.8846639849,-7.8113097692,1.7746725370,-6.0495082567,,, +16.7167968750,16,1.6357131383,-7.0711752352,1.5394755512,-4.9783396213,,, +16.7187500000,16,1.3272502152,-6.1117658458,1.3354846253,-3.7921487260,,, +16.7207031250,16,0.9698644270,-5.0463787956,1.1590847249,-2.6235343815,,, +16.7226562500,16,0.5715017324,-3.9989493000,0.9958032619,-1.6048599046,,, +16.7246093750,16,0.1379902582,-3.0929345845,0.8237739437,-0.8573465789,,, +16.7265625000,16,-0.3274225147,-2.4393675550,0.6160758053,-0.4799945880,,, +16.7285156250,16,-0.8218554075,-2.1222094947,0.3462560869,-0.5371879146,,, +16.7304687500,16,-1.3348757189,-2.1800254383,-0.0007869159,-1.0438022902,,, +16.7324218750,16,-1.8409914248,-2.5922171915,-0.4191326146,-1.9548629814,,, +16.7343750000,16,-2.3024463888,-3.2821297375,-0.8836586212,-3.1709024989,,, +16.7363281250,16,-2.6803245165,-4.1347320002,-1.3623152280,-4.5556898572,,, +16.7382812500,16,-2.9422436626,-5.0146121188,-1.8259151312,-5.9531574766,,, +16.7402343750,16,-3.0634659121,-5.7790289160,-2.2495383940,-7.2007564988,,, +16.7421875000,16,-3.0277134688,-6.2897412390,-2.6112990917,-8.1429420335,,, +16.7441406250,16,-2.8319151933,-6.4262286932,-2.8943271387,-8.6452532128,,, +16.7460937500,16,-2.4915151183,-6.0996236166,-3.0900942920,-8.6081517970,,, +16.7480468750,16,-2.0377327412,-5.2609314952,-3.1953758242,-7.9760919486,,, +16.7500000000,16,-1.5058550318,-3.8987196072,-3.2034902823,-6.7369604405,,, +16.7519531250,16,-0.9268396726,-2.0352669697,-3.1026112258,-4.9189674571,,, +16.7539062500,16,-0.3300105990,0.2692891586,-2.8853140330,-2.5941342205,,, +16.7558593750,16,0.2510220624,2.9113564171,-2.5579957131,0.1182137648,,, +16.7578125000,16,0.7789312732,5.7446920516,-2.1422704260,3.0572157912,,, +16.7597656250,16,1.2190847286,8.5872106871,-1.6708812819,6.0333957656,,, +16.7617187500,16,1.5456256828,11.2356050369,-1.1821334790,8.8451804260,,, +16.7636718750,16,1.7444545287,13.4882868170,-0.7142544751,11.2981137382,,, +16.7656250000,16,1.8134025894,15.1689217912,-0.3004033321,13.2229892016,,, +16.7675781250,16,1.7599879088,16.1434187385,0.0349595925,14.4893845940,,, +16.7695312500,16,1.5992151767,16.3310687078,0.2787407671,15.0160888032,,, +16.7714843750,16,1.3527861621,15.7117709626,0.4301924576,14.7789979896,,, +16.7734375000,16,1.0471290199,14.3273024363,0.4989473390,13.8126348523,,, +16.7753906250,16,0.7103948693,12.2765489354,0.5024628714,12.2046976159,,, +16.7773437500,16,0.3716517599,9.7065215073,0.4647704398,10.0868418747,,, +16.7792968750,16,0.0602552014,6.7973788081,0.4141172263,7.6218485867,,, +16.7812500000,16,-0.1988450761,3.7422582139,0.3780760201,4.9868341903,,, +16.7832031250,16,-0.3907103742,0.7293463016,0.3784731441,2.3562800273,,, +16.7851562500,16,-0.5126903944,-2.0714089161,0.4275598609,-0.1125755659,,, +16.7871093750,16,-0.5755728135,-4.5223076396,0.5248037710,-2.2930379636,,, +16.7890625000,16,-0.6024893009,-6.5296897594,0.6572347869,-4.0970192733,,, +16.7910156250,16,-0.6208997675,-8.0436500729,0.8064096752,-5.4726035042,,, +16.7929687500,16,-0.6525586839,-9.0492126910,0.9561063753,-6.3977740495,,, +16.7949218750,16,-0.7102104360,-9.5601268369,1.0932342686,-6.8786143066,,, +16.7968750000,16,-0.7984808077,-9.6146195560,1.2048769820,-6.9473838191,,, +16.7988281250,16,-0.9123585888,-9.2688286391,1.2779940328,-6.6561083464,,, +16.8007812500,16,-1.0359200322,-8.5912554164,1.3012714856,-6.0708928108,,, +16.8027343750,16,-1.1443316782,-7.6578842225,1.2676972286,-5.2674012210,,, +16.8046875000,16,-1.2072921577,-6.5444297911,1.1783766864,-4.3234842498,,, +16.8066406250,16,-1.1966506247,-5.3224069195,1.0427628481,-3.3143762673,,, +16.8085937500,16,-1.0971124189,-4.0628194195,0.8733374194,-2.3138441039,,, +16.8105468750,16,-0.9096840564,-2.8359804652,0.6821667108,-1.3918368473,,, +16.8125000000,16,-0.6465498044,-1.7021910485,0.4823457343,-0.6048994095,,, +16.8144531250,16,-0.3259120380,-0.7041278214,0.2891099104,0.0111940539,,, +16.8164062500,16,0.0299765386,0.1321607859,0.1168591822,0.4408629361,,, +16.8183593750,16,0.3949739842,0.7917577512,-0.0266846968,0.6832587865,,, +16.8203125000,16,0.7391297249,1.2663671193,-0.1440001448,0.7461989037,,, +16.8222656250,16,1.0315758297,1.5553212430,-0.2448217073,0.6445056787,,, +16.8242187500,16,1.2471187097,1.6718066251,-0.3386800861,0.4044897645,,, +16.8261718750,16,1.3727898273,1.6454595870,-0.4280863355,0.0670598479,,, +16.8281250000,16,1.4105235549,1.5174104781,-0.5057069403,-0.3162679493,,, +16.8300781250,16,1.3769026761,1.3349867433,-0.5551238272,-0.6894371086,,, +16.8320312500,16,1.3029190820,1.1490078241,-0.5523211404,-0.9957906999,,, +16.8339843750,16,1.2326125631,1.0089277955,-0.4676399714,-1.1832065420,,, +16.8359375000,16,1.2158707488,0.9552602770,-0.2722541773,-1.2120403035,,, +16.8378906250,16,1.2956455621,1.0133989960,0.0505440198,-1.0622886414,,, +16.8398437500,16,1.4959664508,1.1897631929,0.4963783094,-0.7381928317,,, +16.8417968750,16,1.8162497363,1.4700419175,1.0389731358,-0.2699742838,,, +16.8437500000,16,2.2344169161,1.8231424235,1.6371861119,0.2908938711,,, +16.8457031250,16,2.7144247482,2.2103254629,2.2445920089,0.8828421703,,, +16.8476562500,16,3.2100876181,2.5923844256,2.8150543394,1.4451181896,,, +16.8496093750,16,3.6671900297,2.9332846895,3.3046333974,1.9255175875,,, +16.8515625000,16,4.0308319252,3.2048565851,3.6757152652,2.2872804923,,, +16.8535156250,16,4.2539727056,3.3914658068,3.9022576604,2.5141153510,,, +16.8554687500,16,4.2994400545,3.4884730779,3.9690422156,2.6094412178,,, +16.8574218750,16,4.1397153252,3.4954689316,3.8671958749,2.5910837999,,, +16.8593750000,16,3.7607396921,3.4109775521,3.5937378861,2.4848888941,,, +16.8613281250,16,3.1647662703,3.2310346762,3.1532189400,2.3175729680,,, +16.8632812500,16,2.3691755766,2.9522782729,2.5576597243,2.1122895976,,, +16.8652343750,16,1.4055506639,2.5782961368,1.8276559887,1.8901105701,,, +16.8671875000,16,0.3186230971,2.1232453082,0.9948757796,1.6718270970,,, +16.8691406250,16,-0.8373617557,1.6109515907,0.1019492844,1.4761486807,,, +16.8710937500,16,-2.0035086710,1.0717214506,-0.8018827141,1.3163520955,,, +16.8730468750,16,-3.1219866550,0.5353673348,-1.6681269624,1.1946915138,,, +16.8750000000,16,-4.1403304585,0.0227361968,-2.4550832825,1.0975198029,,, +16.8769531250,16,-5.0106546860,-0.4563406703,-3.1289815723,0.9990935171,,, +16.8789062500,16,-5.6897178511,-0.8999070597,-3.6649234059,0.8701997222,,, +16.8808593750,16,-6.1464831417,-1.3136451155,-4.0519580291,0.6811262536,,, +16.8828125000,16,-6.3688559175,-1.7119895202,-4.2953612451,0.4020855543,,, +16.8847656250,16,-6.3608426324,-2.1143293866,-4.4107333976,0.0088400504,,, +16.8867187500,16,-6.1363000419,-2.5388541043,-4.4160530599,-0.5108723038,,, +16.8886718750,16,-5.7167971956,-2.9992888714,-4.3275981525,-1.1563381908,,, +16.8906250000,16,-5.1315441478,-3.5029195601,-4.1590258047,-1.9144303205,,, +16.8925781250,16,-4.4154289635,-4.0476221741,-3.9214195122,-2.7576669113,,, +16.8945312500,16,-3.6052077458,-4.6201541115,-3.6228708275,-3.6430763652,,, +16.8964843750,16,-2.7360379149,-5.1957052618,-3.2679769262,-4.5139358749,,, +16.8984375000,16,-1.8393887347,-5.7374195512,-2.8583391844,-5.3033502837,,, +16.9003906250,16,-0.9427038084,-6.1999315498,-2.3943699958,-5.9422115177,,, +16.9023437500,16,-0.0724159719,-6.5384395161,-1.8800675640,-6.3719799210,,, +16.9042968750,16,0.7418290915,-6.7163036822,-1.3288472510,-6.5545559414,,, +16.9062500000,16,1.4674632426,-6.7064480591,-0.7631799252,-6.4736217561,,, +16.9082031250,16,2.0726932934,-6.4910848086,-0.2086730407,-6.1318995749,,, +16.9101562500,16,2.5277408161,-6.0646733354,0.3082013968,-5.5505737472,,, +16.9121093750,16,2.8039954035,-5.4383795568,0.7572726805,-4.7704859671,,, +16.9140625000,16,2.8754176354,-4.6421306385,1.1037059025,-3.8509971357,,, +16.9160156250,16,2.7237028052,-3.7215715904,1.3120487885,-2.8634156444,,, +16.9179687500,16,2.3464604151,-2.7292346686,1.3537347822,-1.8790276006,,, +16.9199218750,16,1.7658507813,-1.7145655475,1.2164015568,-0.9572082900,,, +16.9218750000,16,1.0332819845,-0.7186054689,0.9122848402,-0.1393783647,,, +16.9238281250,16,0.2258939483,0.2269433591,0.4802180617,0.5520411326,,, +16.9257812500,16,-0.5670087712,1.0988273098,-0.0227238971,1.1119269932,,, +16.9277343750,16,-1.2618893689,1.8813529967,-0.5343350538,1.5489442291,,, +16.9296875000,16,-1.7920125989,2.5686207902,-0.9946860019,1.8839473160,,, +16.9316406250,16,-2.1087281005,3.1685573417,-1.3475470781,2.1505653523,,, +16.9335937500,16,-2.1815071741,3.7019316704,-1.5439996075,2.3916323059,,, +16.9355468750,16,-2.0009958072,4.1957761102,-1.5499812184,2.6505457952,,, +16.9375000000,16,-1.5793264047,4.6768636543,-1.3511642034,2.9639146075,,, +16.9394531250,16,-0.9455859504,5.1656315280,-0.9521160986,3.3568059750,,, +16.9414062500,16,-0.1428752970,5.6685959727,-0.3746420911,3.8373925539,,, +16.9433593750,16,0.7700278803,6.1727585832,0.3407859226,4.3922872681,,, +16.9453125000,16,1.7181547354,6.6464143044,1.1343854878,4.9866572438,,, +16.9472656250,16,2.6168990435,7.0465326851,1.9337196406,5.5703702067,,, +16.9492187500,16,3.3836363967,7.3296678559,2.6661414766,6.0877324566,,, +16.9511718750,16,3.9478898071,7.4609399673,3.2685629696,6.4866687544,,, +16.9531250000,16,4.2572644899,7.4159529553,3.6915525069,6.7239801228,,, +16.9550781250,16,4.2830089466,7.1796114703,3.9034920783,6.7685488384,,, +16.9570312500,16,4.0273478967,6.7492392646,3.8967684109,6.6061105579,,, +16.9589843750,16,3.5237256033,6.1354407366,3.6866383537,6.2396401109,,, +16.9609375000,16,2.8253867508,5.3539901281,3.2996406487,5.6806379394,,, +16.9628906250,16,1.9938362772,4.4196610726,2.7642307247,4.9418491400,,, +16.9648437500,16,1.0934094951,3.3500041780,2.1102616421,4.0395041084,,, +16.9667968750,16,0.1861715020,2.1726215749,1.3711788105,2.9995893884,,, +16.9687500000,16,-0.6728579996,0.9303908459,0.5860430686,1.8625857485,,, +16.9707031250,16,-1.4360171678,-0.3171170894,-0.1981757457,0.6848457718,,, +16.9726562500,16,-2.0619915749,-1.4998028495,-0.9277019287,-0.4671429029,,, +16.9746093750,16,-2.5185048506,-2.5500679082,-1.5493935509,-1.5290931703,,, +16.9765625000,16,-2.7858448679,-3.4127962359,-2.0199869138,-2.4481124378,,, +16.9785156250,16,-2.8558298952,-4.0467420117,-2.3101723855,-3.1838360380,,, +16.9804687500,16,-2.7291623875,-4.4251447771,-2.4045136814,-3.7089968086,,, +16.9824218750,16,-2.4158719664,-4.5401303653,-2.3017489715,-4.0132212823,,, +16.9843750000,16,-1.9354789007,-4.4038151780,-2.0136419059,-4.1040165663,,, +16.9863281250,16,-1.3141509690,-4.0442289653,-1.5603811439,-4.0032538371,,, +16.9882812500,16,-0.5813994736,-3.5015361896,-0.9655445064,-3.7431216396,,, +16.9902343750,16,0.2326052524,-2.8245201450,-0.2532808789,-3.3616255538,,, +16.9921875000,16,1.0975284884,-2.0662241262,0.5506409492,-2.8978585329,,, +16.9941406250,16,1.9803273659,-1.2817562805,1.4149375099,-2.3905469946,,, +16.9960937500,16,2.8452991324,-0.5273329309,2.3021160638,-1.8783968387,,, +16.9980468750,16,3.6599890052,0.1426644647,3.1732262018,-1.3979542047,,, +17.0000000000,17,4.4002304287,0.6788289374,3.9920199622,-0.9810914428,,, +17.0019531250,17,5.0467609871,1.0383069640,4.7233060385,-0.6554637562,,, +17.0039062500,17,5.5767587229,1.1877559844,5.3286437052,-0.4444484238,,, +17.0058593750,17,5.9605080945,1.1088176793,5.7667774384,-0.3636075240,,, +17.0078125000,17,6.1649224795,0.8018856537,5.9998705012,-0.4180302661,,, +17.0097656250,17,6.1570249798,0.2854111575,5.9991475020,-0.6035377954,,, +17.0117187500,17,5.9051914652,-0.4071793571,5.7461752675,-0.9088898490,,, +17.0136718750,17,5.3816530569,-1.2315648080,5.2322335969,-1.3176906375,,, +17.0156250000,17,4.5671912227,-2.1379657464,4.4580497028,-1.8105321023,,, +17.0175781250,17,3.4563846968,-3.0758781737,3.4337548253,-2.3653164338,,, +17.0195312500,17,2.0632724102,-3.9960899084,2.1799878409,-2.9551379601,,, +17.0214843750,17,0.4266472174,-4.8516659062,0.7307732653,-3.5467706506,,, +17.0234375000,17,-1.3889726280,-5.5999614194,-0.8647109696,-4.1018634263,,, +17.0253906250,17,-3.2996924991,-6.2058440435,-2.5444911785,-4.5812849852,,, +17.0273437500,17,-5.2129177529,-6.6451500858,-4.2388297596,-4.9514443181,,, +17.0292968750,17,-7.0349561565,-6.9037673032,-5.8737095790,-5.1867630218,,, +17.0312500000,17,-8.6728607358,-6.9681703701,-7.3717795411,-5.2635988154,,, +17.0332031250,17,-10.0377263182,-6.8164992594,-8.6549423695,-5.1536394112,,, +17.0351562500,17,-11.0553989652,-6.4249132945,-9.6522044461,-4.8299432763,,, +17.0371093750,17,-11.6778064510,-5.7848804350,-10.3101112471,-4.2821096094,,, +17.0390625000,17,-11.8845285356,-4.9126447095,-10.5984161838,-3.5237358294,,, +17.0410156250,17,-11.6754670582,-3.8441075202,-10.5076266740,-2.5865344682,,, +17.0429687500,17,-11.0641405849,-2.6238249279,-10.0440759999,-1.5103424660,,, +17.0449218750,17,-10.0772850366,-1.2980935077,-9.2291306554,-0.3380747837,,, +17.0468750000,17,-8.7584945099,0.0854377034,-8.1012922357,0.8836096490,,, +17.0488281250,17,-7.1702995712,1.4766295117,-6.7162943342,2.1035509396,,, +17.0507812500,17,-5.3904433427,2.8253842297,-5.1430005058,3.2700242261,,, +17.0527343750,17,-3.5029384344,4.0870282446,-3.4558771628,4.3377576303,,, +17.0546875000,17,-1.5900277287,5.2254660506,-1.7286554092,5.2722208876,,, +17.0566406250,17,0.2708465391,6.2117492626,-0.0333848520,6.0484974890,,, +17.0585937500,17,2.0082217885,7.0203976945,1.5585271477,6.6475143646,,, +17.0605468750,17,3.5587578873,7.6261031895,2.9786693239,7.0528144511,,, +17.0625000000,17,4.8693624504,8.0034072007,4.1667609686,7.2497972680,,, +17.0644531250,17,5.8996955193,8.1312780990,5.0755596560,7.2285505926,,, +17.0664062500,17,6.6246174304,7.9987703814,5.6741059532,6.9875592555,,, +17.0683593750,17,7.0342912056,7.6069533028,5.9490766378,6.5350161261,,, +17.0703125000,17,7.1341362650,6.9700490048,5.9060047665,5.8899107679,,, +17.0722656250,17,6.9483508880,6.1190960479,5.5723811545,5.0849123050,,, +17.0742187500,17,6.5255610137,5.1043453267,5.0020173841,4.1678831350,,, +17.0761718750,17,5.9423303241,3.9935136360,4.2771828350,3.1997340076,,, +17.0781250000,17,5.2982498264,2.8659636635,3.5019390470,2.2486158900,,, +17.0800781250,17,4.6972544627,1.8008696281,2.7832115664,1.3789637276,,, +17.0820312500,17,4.2234221249,0.8626963430,2.2087275523,0.6383954161,,, +17.0839843750,17,3.9272325816,0.0942823159,1.8348541958,0.0519435767,,, +17.0859375000,17,3.8236693721,-0.4810240530,1.6849479209,-0.3745366643,,, +17.0878906250,17,3.8942219901,-0.8560399741,1.7516602460,-0.6492999580,,, +17.0898437500,17,4.0930425315,-1.0362960250,2.0021135086,-0.7898923337,,, +17.0917968750,17,4.3580959445,-1.0350935332,2.3862640894,-0.8170244110,,, +17.0937500000,17,4.6213811848,-0.8730458575,2.8447513616,-0.7517223933,,, +17.0957031250,17,4.8160492489,-0.5822557731,3.3142571735,-0.6174828559,,, +17.0976562500,17,4.8827325913,-0.2070150847,3.7313534459,-0.4421459178,,, +17.0996093750,17,4.7734780203,0.1988297969,4.0343117213,-0.2584909461,,, +17.1015625000,17,4.4515215792,0.5732738926,4.1633195522,-0.1058200611,,, +17.1035156250,17,3.8914052188,0.8493317619,4.0635428364,-0.0295042349,,, +17.1054687500,17,3.0837673440,0.9630232360,3.6937197927,-0.0756718928,,, +17.1074218750,17,2.0413430541,0.8627216417,3.0364113168,-0.2839380055,,, +17.1093750000,17,0.8017766404,0.5175698665,2.1054714775,-0.6801649282,,, +17.1113281250,17,-0.5731268980,-0.0753429829,0.9491123357,-1.2693343381,,, +17.1132812500,17,-2.0038011613,-0.8893379210,-0.3544682924,-2.0320527456,,, +17.1152343750,17,-3.4039195409,-1.8729776216,-1.7085521253,-2.9258996981,,, +17.1171875000,17,-4.6884911896,-2.9553029577,-3.0094785592,-3.8880144310,,, +17.1191406250,17,-5.7778321152,-4.0511489918,-4.1551766916,-4.8402960696,,, +17.1210937500,17,-6.6023370930,-5.0702275148,-5.0534279148,-5.7002544136,,, +17.1230468750,17,-7.1088066462,-5.9272099360,-5.6314092239,-6.3930031481,,, +17.1250000000,17,-7.2676834032,-6.5502210139,-5.8459109081,-6.8598963838,,, +17.1269531250,17,-7.0796487425,-6.8877183094,-5.6902003799,-7.0636276214,,, +17.1289062500,17,-6.5759252567,-6.9102012829,-5.1920476040,-6.9875719749,,, +17.1308593750,17,-5.8119058276,-6.6067874434,-4.4060076549,-6.6301534110,,, +17.1328125000,17,-4.8625301045,-5.9847975364,-3.4089955782,-6.0027760916,,, +17.1347656250,17,-3.8210662389,-5.0747121032,-2.2989439262,-5.1335838701,,, +17.1367187500,17,-2.7923158005,-3.9315314424,-1.1885388796,-4.0676630421,,, +17.1386718750,17,-1.8783929282,-2.6287098208,-0.1930333895,-2.8605503837,,, +17.1406250000,17,-1.1655042622,-1.2514333648,0.5821661340,-1.5727658030,,, +17.1425781250,17,-0.7155882324,0.1087678342,1.0518081313,-0.2675346316,,, +17.1445312500,17,-0.5602122181,1.3620658359,1.1602754176,0.9925255231,,, +17.1464843750,17,-0.6958148350,2.4298306051,0.8908736618,2.1496477602,,, +17.1484375000,17,-1.0817287235,3.2530478337,0.2731812717,3.1550307578,,, +17.1503906250,17,-1.6410833781,3.8012975218,-0.6147499515,3.9750412781,,, +17.1523437500,17,-2.2640401470,4.0817017218,-1.6504849456,4.5992123308,,, +17.1542968750,17,-2.8165602731,4.1409776240,-2.6782858130,5.0446697767,,, +17.1562500000,17,-3.1579821772,4.0537897755,-3.5291321516,5.3515747990,,, +17.1582031250,17,-3.1628111642,3.9002175541,-4.0464091500,5.5696864747,,, +17.1601562500,17,-2.7405947869,3.7429412036,-4.1095148566,5.7418234577,,, +17.1621093750,17,-1.8519966634,3.6143700483,-3.6505996427,5.8925790185,,, +17.1640625000,17,-0.5161563274,3.5192646702,-2.6614883815,6.0281215465,,, +17.1660156250,17,1.1935926806,3.4467488457,-1.1905043310,6.1427086323,,, +17.1679687500,17,3.1586698621,3.3785732971,0.6651143485,6.2218289339,,, +17.1699218750,17,5.2239704846,3.2906282581,2.7667229181,6.2405398429,,, +17.1718750000,17,7.2087464082,3.1531906397,4.9427659979,6.1621609343,,, +17.1738281250,17,8.9204423700,2.9313815616,6.9995317085,5.9385766979,,, +17.1757812500,17,10.1716960318,2.5858861453,8.7351700663,5.5128912002,,, +17.1777343750,17,10.8021826312,2.0775014271,9.9592948690,4.8281929377,,, +17.1796875000,17,10.7014052128,1.3761143405,10.5163714076,3.8410668828,,, +17.1816406250,17,9.8247938830,0.4693126138,10.3062642401,2.5328350645,,, +17.1835937500,17,8.2014135201,-0.6313510519,9.2984240517,0.9162161388,,, +17.1855468750,17,5.9346172391,-1.8856883287,7.5393500252,-0.9612903528,,, +17.1875000000,17,3.1940727104,-3.2252271485,5.1510930685,-3.0188303427,,, +17.1894531250,17,0.1988541505,-4.5600440709,2.3195250139,-5.1475271628,,, +17.1914062500,17,-2.8050694800,-5.7866049457,-0.7249758354,-7.2156710703,,, +17.1933593750,17,-5.5682364835,-6.7947471450,-3.7299124252,-9.0754159564,,, +17.1953125000,17,-7.8586491091,-7.4775649251,-6.4430573513,-10.5752438682,,, +17.1972656250,17,-9.4803226780,-7.7434291137,-8.6348571825,-11.5759231078,,, +17.1992187500,17,-10.2918012983,-7.5277998303,-10.1218475904,-11.9666428390,,, +17.2011718750,17,-10.2244124325,-6.8064493701,-10.7883385911,-11.6821332934,,, +17.2031250000,17,-9.2930345307,-5.6060697043,-10.5985707748,-10.7164383535,,, +17.2050781250,17,-7.5931241109,-4.0037641004,-9.5949370044,-9.1251150311,,, +17.2070312500,17,-5.2875264255,-2.1167967893,-7.8869663649,-7.0170083977,,, +17.2089843750,17,-2.5892725739,-0.0895068249,-5.6376060022,-4.5422527805,,, +17.2109375000,17,0.2573925241,1.9205406087,-3.0495206195,-1.8786750784,,, +17.2128906250,17,2.9973452646,3.7569493845,-0.3506450017,0.7830034959,,, +17.2148437500,17,5.3870574261,5.2796267389,2.2236993177,3.2549188412,,, +17.2167968750,17,7.2183601780,6.3794074509,4.4512713143,5.3680569917,,, +17.2187500000,17,8.3375590631,6.9859863426,6.1410397449,6.9842547258,,, +17.2207031250,17,8.6554328745,7.0673553005,7.1472599395,8.0026163886,,, +17.2226562500,17,8.1509580320,6.6282521706,7.3814202640,8.3653811667,,, +17.2246093750,17,6.8720102159,5.7106557690,6.8218039832,8.0650838728,,, +17.2265625000,17,4.9314605998,4.3921642515,5.5182373038,7.1486177838,,, +17.2285156250,17,2.4977801053,2.7830445981,3.5905042557,5.7163792677,,, +17.2304687500,17,-0.2178006432,1.0239285164,1.2195584073,3.9176674469,,, +17.2324218750,17,-2.9780318134,-0.7213563279,-1.3691294215,1.9400699278,,, +17.2343750000,17,-5.5418385351,-2.2826004974,-3.9284493090,-0.0100300735,,, +17.2363281250,17,-7.6877213951,-3.5053752958,-6.2140778840,-1.7315256255,,, +17.2382812500,17,-9.2326002084,-4.2708543035,-8.0069395915,-3.0497375211,,, +17.2402343750,17,-10.0455696495,-4.5093505667,-9.1325891324,-3.8325253766,,, +17.2421875000,17,-10.0575327049,-4.2056120863,-9.4751154259,-4.0012510977,,, +17.2441406250,17,-9.2663419391,-3.3957012999,-8.9844373283,-3.5352730786,,, +17.2460937500,17,-7.7373255832,-2.1601953481,-7.6796087103,-2.4716141446,,, +17.2480468750,17,-5.5991479971,-0.6168588472,-5.6491385506,-0.9016582262,,, +17.2500000000,17,-3.0333195524,1.0910719581,-3.0450847675,1.0376536049,,, +17.2519531250,17,-0.2557133550,2.8116926406,-0.0686881583,3.1783903370,,, +17.2539062500,17,2.5060562391,4.3981086393,3.0487318622,5.3351269305,,, +17.2558593750,17,5.0336934622,5.7153096574,6.0649241041,7.3140834813,,, +17.2578125000,17,7.1379694543,6.6476901492,8.7466905882,8.9249207229,,, +17.2597656250,17,8.6757690178,7.1102247155,10.8900552372,9.9988828554,,, +17.2617187500,17,9.5569639448,7.0551733502,12.3339956133,10.4058839179,,, +17.2636718750,17,9.7422439650,6.4716142568,12.9674188527,10.0661633413,,, +17.2656250000,17,9.2415465998,5.3852919622,12.7371546228,8.9600507524,,, +17.2675781250,17,8.1137697152,3.8607030888,11.6571095079,7.1343579149,,, +17.2695312500,17,6.4617857791,2.0000041644,9.8100535102,4.6998051913,,, +17.2714843750,17,4.4227948957,-0.0629065062,7.3393635043,1.8212845215,,, +17.2734375000,17,2.1577872554,-2.1721102462,4.4361243481,-1.2946536968,,, +17.2753906250,17,-0.1588296694,-4.1630111952,1.3243787539,-4.4155936592,,, +17.2773437500,17,-2.3495996731,-5.8769484927,-1.7563393081,-7.3021581380,,, +17.2792968750,17,-4.2444592937,-7.1750161599,-4.5695068011,-9.7279245541,,, +17.2812500000,17,-5.6936588478,-7.9509946846,-6.9001657006,-11.5000390408,,, +17.2832031250,17,-6.5844298945,-8.1410656508,-8.5752545936,-12.4785626045,,, +17.2851562500,17,-6.8560019803,-7.7293408451,-9.4825842174,-12.5906856525,,, +17.2871093750,17,-6.5068865081,-6.7521626681,-9.5813523186,-11.8389850811,,, +17.2890625000,17,-5.5940680880,-5.2987187920,-8.9025380842,-10.3029084480,,, +17.2910156250,17,-4.2253031105,-3.5012909114,-7.5424280315,-8.1301544959,,, +17.2929687500,17,-2.5456847952,-1.5176439147,-5.6514873375,-5.5192248580,,, +17.2949218750,17,-0.7209508558,0.4854470561,-3.4192688340,-2.6994634040,,, +17.2968750000,17,1.0800803806,2.3446016764,-1.0568353332,0.0881117214,,, +17.2988281250,17,2.7014198995,3.9109482485,1.2213644903,2.6097728367,,, +17.3007812500,17,4.0128248755,5.0618377219,3.2161301629,4.6585271436,,, +17.3027343750,17,4.9202808035,5.7119458927,4.7618370215,6.0729962932,,, +17.3046875000,17,5.3722927555,5.8206737284,5.7404708264,6.7523701561,,, +17.3066406250,17,5.3582780584,5.3929438266,6.0884270697,6.6631661198,,, +17.3085937500,17,4.9005621730,4.4738765880,5.7968050180,5.8371259674,,, +17.3105468750,17,4.0472302036,3.1428264673,4.9084809435,4.3653951082,,, +17.3125000000,17,2.8697253235,1.5093586858,3.5149464072,2.3924440536,,, +17.3144531250,17,1.4619867179,-0.2927803540,1.7518715371,0.1070460976,,, +17.3164062500,17,-0.0632661701,-2.1145086718,-0.2111093133,-2.2714587800,,, +17.3183593750,17,-1.5811375686,-3.8006907044,-2.1871716412,-4.5108767295,,, +17.3203125000,17,-2.9619580891,-5.2019944762,-3.9902426916,-6.3878870641,,, +17.3222656250,17,-4.0811493123,-6.1902451200,-5.4512256850,-7.7108224744,,, +17.3242187500,17,-4.8337381163,-6.6722543202,-6.4341501970,-8.3379650463,,, +17.3261718750,17,-5.1503139164,-6.6001519731,-6.8511398732,-8.1906692829,,, +17.3281250000,17,-5.0083634122,-5.9788761584,-6.6717869203,-7.2621821711,,, +17.3300781250,17,-4.4340863981,-4.8652719187,-5.9233028736,-5.6174173297,,, +17.3320312500,17,-3.4953921596,-3.3568196502,-4.6829037806,-3.3823602075,,, +17.3339843750,17,-2.2926441940,-1.5798788517,-3.0689350657,-0.7314314899,,, +17.3359375000,17,-0.9492913917,0.3178717016,-1.2325971539,2.1240183740,,, +17.3378906250,17,0.4015067444,2.1779669396,0.6546014508,4.9530175034,,, +17.3398437500,17,1.6329376182,3.8466951103,2.4189323633,7.5287163608,,, +17.3417968750,17,2.6374970200,5.1901071179,3.9040348247,9.6507914269,,, +17.3437500000,17,3.3357646061,6.1065872902,4.9879119339,11.1627144440,,, +17.3457031250,17,3.6813535307,6.5359501212,5.5933078387,11.9626801139,,, +17.3476562500,17,3.6609305636,6.4635509306,5.6904276172,12.0078713291,,, +17.3496093750,17,3.2925235019,5.9231354486,5.2961326641,11.3167345061,,, +17.3515625000,17,2.6245412902,4.9959851115,4.4706624473,9.9682366042,,, +17.3535156250,17,1.7325345715,3.7968064162,3.3092463120,8.0903101554,,, +17.3554687500,17,0.7139477338,2.4531908120,1.9314786449,5.8422277924,,, +17.3574218750,17,-0.3176530706,1.0944678175,0.4723857105,3.4026502126,,, +17.3593750000,17,-1.2421959316,-0.1524952720,-0.9275064099,0.9607811476,,, +17.3613281250,17,-1.9476552969,-1.1721744335,-2.1356722623,-1.2983700744,,, +17.3632812500,17,-2.3450970415,-1.8736855254,-3.0418454876,-3.2121981111,,, +17.3652343750,17,-2.3805448011,-2.2020191488,-3.5694244457,-4.6548276088,,, +17.3671875000,17,-2.0439386280,-2.1459247321,-3.6833789685,-5.5480550695,,, +17.3691406250,17,-1.3734265389,-1.7399651023,-3.3940649822,-5.8691062220,,, +17.3710937500,17,-0.4498747692,-1.0559683525,-2.7539740161,-5.6489693575,,, +17.3730468750,17,0.6159502673,-0.1902892130,-1.8485043658,-4.9634620811,,, +17.3750000000,17,1.6963392739,0.7438018867,-0.7860923120,-3.9252826787,,, +17.3769531250,17,2.6606393892,1.6238076859,0.3119630811,-2.6740303692,,, +17.3789062500,17,3.3917837055,2.3313244757,1.3238999012,-1.3604649551,,, +17.3808593750,17,3.7997283538,2.7644026045,2.1400682550,-0.1319182655,,, +17.3828125000,17,3.8287966139,2.8454488232,2.6737715956,0.8777366527,,, +17.3847656250,17,3.4606353613,2.5288726199,2.8702455070,1.5574561464,,, +17.3867187500,17,2.7119453244,1.8071543196,2.7114053168,1.8269498419,,, +17.3886718750,17,1.6263217626,0.7102613288,2.2131514282,1.6396678492,,, +17.3906250000,17,0.2656599295,-0.6987438410,1.4180005653,0.9841160711,,, +17.3925781250,17,-1.2928545372,-2.3279744550,0.3900205976,-0.1133014592,,, +17.3945312500,17,-2.9565889646,-4.0642614404,-0.7880431276,-1.5880963149,,, +17.3964843750,17,-4.6209718894,-5.7840579550,-2.0217723632,-3.3420851998,,, +17.3984375000,17,-6.1762782870,-7.3618904578,-3.2145661481,-5.2483190150,,, +17.4003906250,17,-7.5129202731,-8.6766631032,-4.2725036042,-7.1566732551,,, +17.4023437500,17,-8.5278310088,-9.6213113015,-5.1074824966,-8.9056228580,,, +17.4042968750,17,-9.1366924151,-10.1156544013,-5.6458896793,-10.3408213040,,, +17.4062500000,17,-9.2877285020,-10.1166662989,-5.8397242199,-11.3333201808,,, +17.4082031250,17,-8.9694574128,-9.6220595007,-5.6727372978,-11.7909870865,,, +17.4101562500,17,-8.2103305898,-8.6664874952,-5.1604545560,-11.6622285621,,, +17.4121093750,17,-7.0715746033,-7.3113004069,-4.3453592586,-10.9334360331,,, +17.4140625000,17,-5.6361488631,-5.6339400130,-3.2884383161,-9.6244907475,,, +17.4160156250,17,-3.9987741364,-3.7252041088,-2.0620074247,-7.7888737168,,, +17.4179687500,17,-2.2577099652,-1.6898245685,-0.7455172785,-5.5156366641,,, +17.4199218750,17,-0.5048784548,0.3605830675,0.5811200709,-2.9240092576,,, +17.4218750000,17,1.1837115899,2.3201235689,1.8474051672,-0.1515950476,,, +17.4238281250,17,2.7527911670,4.0996438454,2.9997105160,2.6577498827,,, +17.4257812500,17,4.1679929072,5.6351590650,4.0043901345,5.3658163433,,, +17.4277343750,17,5.4126024485,6.8931942447,4.8474784450,7.8512606469,,, +17.4296875000,17,6.4817425189,7.8721123156,5.5304430564,10.0177581328,,, +17.4316406250,17,7.3763660777,8.5988498873,6.0627936518,11.7975388848,,, +17.4335937500,17,8.0993891775,9.1194679906,6.4554435307,13.1497370520,,, +17.4355468750,17,8.6545573647,9.4859672000,6.7181223401,14.0564762392,,, +17.4375000000,17,9.0467151318,9.7455582329,6.8599647682,14.5205558267,,, +17.4394531250,17,9.2818329988,9.9331339436,6.8899193238,14.5627281976,,, +17.4414062500,17,9.3665317370,10.0643172199,6.8151347480,14.2153147167,,, +17.4433593750,17,9.3072246954,10.1327047929,6.6382782629,13.5164747571,,, +17.4453125000,17,9.1083495496,10.1148060964,6.3559733309,12.5096583090,,, +17.4472656250,17,8.7693383533,9.9768657326,5.9594468625,11.2437233499,,, +17.4492187500,17,8.2830414497,9.6789757926,5.4379781010,9.7703966274,,, +17.4511718750,17,7.6392086253,9.1797556973,4.7848307425,8.1424922030,,, +17.4531250000,17,6.8304189619,8.4422092202,4.0014192000,6.4123188568,,, +17.4550781250,17,5.8554490835,7.4374588456,3.0966002977,4.6270733170,,, +17.4570312500,17,4.7213289907,6.1476396748,2.0851491450,2.8246760641,,, +17.4589843750,17,3.4465570606,4.5704151676,0.9885347242,1.0342997794,,, +17.4609375000,17,2.0620978479,2.7223070840,-0.1656059845,-0.7207853064,,, +17.4628906250,17,0.6082552039,0.6400122247,-1.3461846231,-2.4201644884,,, +17.4648437500,17,-0.8694168306,-1.6168898430,-2.5201153922,-4.0418179830,,, +17.4667968750,17,-2.3256239184,-3.9646064074,-3.6536945520,-5.5587135606,,, +17.4687500000,17,-3.7227954950,-6.2994711942,-4.7159004639,-6.9386011466,,, +17.4707031250,17,-5.0340983646,-8.5045627085,-5.6804666583,-8.1431194605,,, +17.4726562500,17,-6.2400610297,-10.4574841370,-6.5258967964,-9.1271695015,,, +17.4746093750,17,-7.3253223799,-12.0430313271,-7.2364905450,-9.8454872205,,, +17.4765625000,17,-8.2774487762,-13.1677029718,-7.8033488437,-10.2637220259,,, +17.4785156250,17,-9.0846391888,-13.7695637560,-8.2224258076,-10.3651330782,,, +17.4804687500,17,-9.7331936614,-13.8236741214,-8.4913736030,-10.1526502832,,, +17.4824218750,17,-10.2073109137,-13.3447748278,-8.6079288966,-9.6492921757,,, +17.4843750000,17,-10.4908942851,-12.3845203862,-8.5699948888,-8.8953582172,,, +17.4863281250,17,-10.5710599621,-11.0238733342,-8.3775048050,-7.9436733720,,, +17.4882812500,17,-10.4430565195,-9.3663845813,-8.0358052645,-6.8575607866,,, +17.4902343750,17,-10.1131885956,-7.5315632598,-7.5579853838,-5.7090856928,,, +17.4921875000,17,-9.5962076075,-5.6425801992,-6.9626883535,-4.5715149005,,, +17.4941406250,17,-8.9082494346,-3.8116581134,-6.2668800328,-3.5088581068,,, +17.4960937500,17,-8.0601371526,-2.1314160270,-5.4787514749,-2.5694916108,,, +17.4980468750,17,-7.0556782133,-0.6733518125,-4.5974908934,-1.7851764556,,, +17.5000000000,17,-5.8961285244,0.5095078123,-3.6202167209,-1.1741617571,,, +17.5019531250,17,-4.5884107083,1.3792433823,-2.5506021707,-0.7458115048,,, +17.5039062500,17,-3.1529256389,1.9138440448,-1.4045832905,-0.5015489599,,, +17.5058593750,17,-1.6269849242,2.1126253950,-0.2108467541,-0.4313524966,,, +17.5078125000,17,-0.0623584083,2.0010503205,0.9944473148,-0.5108380408,,, +17.5097656250,17,1.4818640747,1.6328799587,2.1760094823,-0.7006639901,,, +17.5117187500,17,2.9477164760,1.0892513036,3.3053486952,-0.9472489362,,, +17.5136718750,17,4.2841842873,0.4717042725,4.3609338101,-1.1861402630,,, +17.5156250000,17,5.4493204845,-0.1096471182,5.3247234935,-1.3482882286,,, +17.5175781250,17,6.4106303415,-0.5483975250,6.1788794153,-1.3677120781,,, +17.5195312500,17,7.1462401872,-0.7538503769,6.9042085430,-1.1903662504,,, +17.5214843750,17,7.6477199108,-0.6618808757,7.4807667194,-0.7827929015,,, +17.5234375000,17,7.9239459348,-0.2398753012,7.8917682898,-0.1355551324,,, +17.5253906250,17,8.0042465111,0.5155879383,8.1302319217,0.7401294927,,, +17.5273437500,17,7.9367675800,1.5815216620,8.2032349120,1.8159911608,,, +17.5292968750,17,7.7796709776,2.9083532886,8.1295788059,3.0472876847,,, +17.5312500000,17,7.5893203531,4.4228402743,7.9336755385,4.3758586001,,, +17.5332031250,17,7.4101292731,6.0353316578,7.6397204182,5.7357591961,,, +17.5351562500,17,7.2664120614,7.6446716762,7.2660913428,7.0549548134,,, +17.5371093750,17,7.1593828514,9.1413332879,6.8219053805,8.2555307941,,, +17.5390625000,17,7.0739886907,10.4150877286,6.3108487132,9.2601119469,,, +17.5410156250,17,6.9901003111,11.3647724975,5.7401172368,10.0013289193,,, +17.5429687500,17,6.8875954615,11.9042044692,5.1248761675,10.4261431541,,, +17.5449218750,17,6.7438778641,11.9659819959,4.4843830396,10.4956513826,,, +17.5468750000,17,6.5283229661,11.5053596246,3.8338571224,10.1838616793,,, +17.5488281250,17,6.1985812805,10.5040886005,3.1778818722,9.4770284282,,, +17.5507812500,17,5.7051476884,8.9788511015,2.5105694567,8.3788367745,,, +17.5527343750,17,5.0037155583,6.9921869044,1.8213880864,6.9210091039,,, +17.5546875000,17,4.0664977588,4.6521690118,1.1002942810,5.1682216492,,, +17.5566406250,17,2.8891719427,2.0994944694,0.3407240929,3.2137315427,,, +17.5585937500,17,1.4951426861,-0.5062863742,-0.4581946017,1.1713278274,,, +17.5605468750,17,-0.0660024803,-3.0002717601,-1.2922530615,-0.8363383809,,, +17.5625000000,17,-1.7280863874,-5.2283425458,-2.1565182639,-2.6929225687,,, +17.5644531250,17,-3.4203874037,-7.0611452223,-3.0490197192,-4.3009025441,,, +17.5664062500,17,-5.0762724808,-8.4041662344,-3.9692914378,-5.5891877057,,, +17.5683593750,17,-6.6369678480,-9.2048891568,-4.9126091047,-6.5168187646,,, +17.5703125000,17,-8.0496641938,-9.4527197973,-5.8630982675,-7.0705607084,,, +17.5722656250,17,-9.2631730044,-9.1714556466,-6.7893309508,-7.2577750524,,, +17.5742187500,17,-10.2281811407,-8.4132798266,-7.6459405409,-7.1021557592,,, +17.5761718750,17,-10.9009725791,-7.2569975384,-8.3791681413,-6.6437067852,,, +17.5781250000,17,-11.2441313004,-5.8038494312,-8.9312209334,-5.9365659543,,, +17.5800781250,17,-11.2266261185,-4.1702512682,-9.2441000303,-5.0443169005,,, +17.5820312500,17,-10.8284113916,-2.4810881080,-9.2656874207,-4.0368364889,,, +17.5839843750,17,-10.0461784352,-0.8617422882,-8.9567893798,-2.9868066931,,, +17.5859375000,17,-8.8969084799,0.5713954452,-8.2975505307,-1.9650818524,,, +17.5878906250,17,-7.4216395582,1.7190701153,-7.2930076579,-1.0381552888,,, +17.5898437500,17,-5.6890115362,2.5082156560,-5.9767369368,-0.2644677025,,, +17.5917968750,17,-3.7938937019,2.9015328928,-4.4108938188,0.3137284707,,, +17.5937500000,17,-1.8497604702,2.8987890106,-2.6812891369,0.6750619730,,, +17.5957031250,17,0.0222521975,2.5288952562,-0.8890575799,0.8154749808,,, +17.5976562500,17,1.7060366121,1.8431409042,0.8582483336,0.7441622444,,, +17.5996093750,17,3.1038149644,0.9123437423,2.4558198679,0.4831444355,,, +17.6015625000,17,4.1451713677,-0.1788524757,3.8101532991,0.0654522456,,, +17.6035156250,17,4.7892156178,-1.3413077936,4.8449350148,-0.4692175954,,, +17.6054687500,17,5.0236998932,-2.4886520945,5.5050270416,-1.0776295272,,, +17.6074218750,17,4.8641853960,-3.5410350302,5.7606180578,-1.7145045077,,, +17.6093750000,17,4.3532897922,-4.4274070123,5.6114865791,-2.3330986140,,, +17.6113281250,17,3.5587778765,-5.0874479287,5.0889222075,-2.8848789936,,, +17.6132812500,17,2.5674644585,-5.4755069706,4.2519000607,-3.3223626436,,, +17.6152343750,17,1.4756729353,-5.5662745182,3.1780757748,-3.6064028122,,, +17.6171875000,17,0.3822285042,-5.3573328401,1.9550867777,-3.7110094010,,, +17.6191406250,17,-0.6155864529,-4.8690992838,0.6747084821,-3.6241462302,,, +17.6210937500,17,-1.4292255017,-4.1453776069,-0.5727236919,-3.3496700072,,, +17.6230468750,17,-1.9887718687,-3.2498322529,-1.7039740608,-2.9077469444,,, +17.6250000000,17,-2.2491504110,-2.2559409887,-2.6466637124,-2.3294398271,,, +17.6269531250,17,-2.1931250903,-1.2379790231,-3.3427192824,-1.6509958505,,, +17.6289062500,17,-1.8337204418,-0.2652431512,-3.7523695679,-0.9108669662,,, +17.6308593750,17,-1.2120402460,0.6063828718,-3.8558131068,-0.1443497510,,, +17.6328125000,17,-0.3892042583,1.3432107614,-3.6530755496,0.6227668917,,, +17.6347656250,17,0.5621729610,1.9352789051,-3.1642367863,1.3748934874,,, +17.6367187500,17,1.5644759556,2.3921847951,-2.4281012139,2.1031482923,,, +17.6386718750,17,2.5411586958,2.7380460428,-1.4983553473,2.8022459521,,, +17.6406250000,17,3.4221440351,3.0045491053,-0.4395704122,3.4666858800,,, +17.6425781250,17,4.1480245799,3.2234804105,0.6770222565,4.0868768663,,, +17.6445312500,17,4.6746276244,3.4245843718,1.7801212440,4.6504892687,,, +17.6464843750,17,4.9758532762,3.6365257492,2.8052612895,5.1473831471,,, +17.6484375000,17,5.0412658793,3.8840953014,3.6987308011,5.5710653541,,, +17.6503906250,17,4.8721733579,4.1830996647,4.4200476073,5.9169958562,,, +17.6523437500,17,4.4801222477,4.5362698036,4.9438973362,6.1800807439,,, +17.6542968750,17,3.8858872861,4.9292692899,5.2596521774,6.3498736675,,, +17.6562500000,17,3.1194659850,5.3291984645,5.3700088441,6.4070327434,,, +17.6582031250,17,2.2221008909,5.6882289767,5.2898259808,6.3256247911,,, +17.6601562500,17,1.2450798016,5.9480804155,5.0419564891,6.0769539787,,, +17.6621093750,17,0.2430412790,6.0434419071,4.6510040389,5.6315848760,,, +17.6640625000,17,-0.7319985730,5.9097859925,4.1407239328,4.9646110591,,, +17.6660156250,17,-1.6323144755,5.4963535457,3.5360713636,4.0654382853,,, +17.6679687500,17,-2.4157012489,4.7773331917,2.8658454532,2.9451320634,,, +17.6699218750,17,-3.0488890840,3.7571403619,2.1627930520,1.6372476037,,, +17.6718750000,17,-3.5104667698,2.4710261118,1.4607656219,0.1942786246,,, +17.6738281250,17,-3.7910209562,0.9825567302,0.7905096893,-1.3175039096,,, +17.6757812500,17,-3.8904529683,-0.6206941403,0.1768568440,-2.8223341695,,, +17.6777343750,17,-3.8118878582,-2.2323376792,-0.3602379221,-4.2368634107,,, +17.6796875000,17,-3.5557262204,-3.7358183418,-0.8029180148,-5.4737143718,,, +17.6816406250,17,-3.1217262170,-5.0202574155,-1.1369699236,-6.4526781686,,, +17.6835937500,17,-2.5175857690,-5.9986892726,-1.3573660010,-7.1154301563,,, +17.6855468750,17,-1.7640685274,-6.6176092275,-1.4707030954,-7.4326459896,,, +17.6875000000,17,-0.8944888678,-6.8566541495,-1.4925856829,-7.4026010526,,, +17.6894531250,17,0.0484471524,-6.7241904389,-1.4430771692,-7.0472984433,,, +17.6914062500,17,1.0184053522,-6.2504674518,-1.3423142763,-6.4074402424,,, +17.6933593750,17,1.9706434057,-5.4833945917,-1.2090645261,-5.5390371461,,, +17.6953125000,17,2.8633679007,-4.4907248886,-1.0627280541,-4.5135048820,,, +17.6972656250,17,3.6599031643,-3.3580776691,-0.9235501242,-3.4130060508,,, +17.6992187500,17,4.3345262181,-2.1755786529,-0.8084813054,-2.3171894751,,, +17.7011718750,17,4.8765668636,-1.0245100153,-0.7262973512,-1.2917080169,,, +17.7031250000,17,5.2885076205,0.0257690166,-0.6757424032,-0.3861458332,,, +17.7050781250,17,5.5785258964,0.9155124250,-0.6486288214,0.3628539920,,, +17.7070312500,17,5.7513099202,1.5949508245,-0.6356603876,0.9291655541,,, +17.7089843750,17,5.8030158253,2.0292707247,-0.6293862345,1.2975825421,,, +17.7109375000,17,5.7222920576,2.2059397256,-0.6237490429,1.4671804435,,, +17.7128906250,17,5.4946180063,2.1393292328,-0.6140930901,1.4543122191,,, +17.7148437500,17,5.1066977658,1.8688044617,-0.5985553873,1.2911216112,,, +17.7167968750,17,4.5481630524,1.4531149426,-0.5802679904,1.0218314019,,, +17.7187500000,17,3.8111667505,0.9645098877,-0.5695303307,0.7003870832,,, +17.7207031250,17,2.8914426323,0.4795572094,-0.5834327426,0.3859908707,,, +17.7226562500,17,1.7907795315,0.0655888946,-0.6433390427,0.1332043196,,, +17.7246093750,17,0.5191679422,-0.2302240402,-0.7718861079,-0.0185013645,,, +17.7265625000,17,-0.9031234365,-0.3850307988,-0.9883191523,-0.0505093498,,, +17.7285156250,17,-2.4443995803,-0.4006911767,-1.3027760511,0.0334939631,,, +17.7304687500,17,-4.0610343310,-0.3002015192,-1.7116654125,0.2109521517,,, +17.7324218750,17,-5.6964041963,-0.1195514493,-2.1952417195,0.4486791584,,, +17.7343750000,17,-7.2814781261,0.0989675537,-2.7182424912,0.7098811522,,, +17.7363281250,17,-8.7384228720,0.3099291943,-3.2330749918,0.9568661776,,, +17.7382812500,17,-9.9870229377,0.4681647573,-3.6863008306,1.1526329842,,, +17.7402343750,17,-10.9544700772,0.5323980818,-4.0290644624,1.2633213245,,, +17.7421875000,17,-11.5844010675,0.4699088039,-4.2250819304,1.2633844109,,, +17.7441406250,17,-11.8395507082,0.2643726098,-4.2505460242,1.1442735528,,, +17.7460937500,17,-11.7010567340,-0.0777958969,-4.0910821712,0.9206332257,,, +17.7480468750,17,-11.1722491438,-0.5273776501,-3.7433193828,0.6286492656,,, +17.7500000000,17,-10.2852566275,-1.0349693162,-3.2191713956,0.3203602027,,, +17.7519531250,17,-9.0994656724,-1.5340423179,-2.5450197184,0.0582332395,,, +17.7539062500,17,-7.6911058613,-1.9512291352,-1.7566252479,-0.0941800064,,, +17.7558593750,17,-6.1442479683,-2.2238821986,-0.8972031158,-0.0868314469,,, +17.7578125000,17,-4.5446415895,-2.3116471086,-0.0173038049,0.1060768666,,, +17.7597656250,17,-2.9719041759,-2.1978410917,0.8291752309,0.4834930046,,, +17.7617187500,17,-1.4916303128,-1.8888079682,1.5922008252,1.0185754349,,, +17.7636718750,17,-0.1503846283,-1.4123159962,2.2321917045,1.6628947902,,, +17.7656250000,17,1.0240866802,-0.8127286211,2.7215127005,2.3536765786,,, +17.7675781250,17,2.0170464010,-0.1473071600,3.0404353712,3.0183225282,,, +17.7695312500,17,2.8218134439,0.5160184225,3.1747758787,3.5763255526,,, +17.7714843750,17,3.4413343936,1.1051398144,3.1198052923,3.9458469616,,, +17.7734375000,17,3.8933991923,1.5539262850,2.8865878242,4.0552427553,,, +17.7753906250,17,4.2136579278,1.8106371432,2.5055875327,3.8530300711,,, +17.7773437500,17,4.4551306145,1.8441720212,2.0264927801,3.3146619281,,, +17.7792968750,17,4.6859607456,1.6500124235,1.5153665407,2.4487668961,,, +17.7812500000,17,4.9822035825,1.2535640250,1.0473883230,1.3012720061,,, +17.7832031250,17,5.4111240048,0.7077877799,0.6938188880,-0.0472204378,,, +17.7851562500,17,6.0120836161,0.0856112167,0.5092761917,-1.4912319703,,, +17.7871093750,17,6.7867293528,-0.5297672020,0.5257550494,-2.9130378581,,, +17.7890625000,17,7.6993421006,-1.0527768579,0.7510972125,-4.1935180620,,, +17.7910156250,17,8.6831020772,-1.4001471993,1.1687849221,-5.2196987729,,, +17.7929687500,17,9.6508855643,-1.4974399906,1.7413237359,-5.8926879019,,, +17.7949218750,17,10.5072710253,-1.2923831310,2.4166278709,-6.1404081386,,, +17.7968750000,17,11.1582342428,-0.7679105352,3.1326648880,-5.9301950787,,, +17.7988281250,17,11.5203061073,0.0550654559,3.8208706563,-5.2724245700,,, +17.8007812500,17,11.5297060245,1.1216031734,4.4121225664,-4.2169871900,,, +17.8027343750,17,11.1474334042,2.3470904344,4.8442555976,-2.8483483237,,, +17.8046875000,17,10.3612736137,3.6258816989,5.0691831331,-1.2771332089,,, +17.8066406250,17,9.1876455690,4.8445406768,5.0589172348,0.3718328107,,, +17.8085937500,17,7.6692107862,5.8920061708,4.8073096196,1.9690421717,,, +17.8105468750,17,5.8685484253,6.6675878693,4.3281310981,3.3885680337,,, +17.8125000000,17,3.8657341825,7.0923735300,3.6550448043,4.5201364969,,, +17.8144531250,17,1.7581752578,7.1194847748,2.8424651975,5.2807445509,,, +17.8164062500,17,-0.3452256525,6.7376119229,1.9609526998,5.6204536656,,, +17.8183593750,17,-2.3343980351,5.9698926284,1.0867716281,5.5247239378,,, +17.8203125000,17,-4.1083098035,4.8687740217,0.2905605482,5.0142726061,,, +17.8222656250,17,-5.5843117656,3.5070732038,-0.3715143842,4.1409633639,,, +17.8242187500,17,-6.7054933550,1.9711673555,-0.8635269939,2.9827388333,,, +17.8261718750,17,-7.4454380232,0.3569398879,-1.1733307996,1.6386957395,,, +17.8281250000,17,-7.8112629966,-1.2383222709,-1.3141641415,0.2200494988,,, +17.8300781250,17,-7.8432371688,-2.7260729273,-1.3227494457,-1.1617882138,,, +17.8320312500,17,-7.6090456528,-4.0312957030,-1.2533324323,-2.4039200371,,, +17.8339843750,17,-7.1956129263,-5.0948782004,-1.1707212262,-3.4184060492,,, +17.8359375000,17,-6.7012160274,-5.8783454385,-1.1444427157,-4.1397724534,,, +17.8378906250,17,-6.2243859535,-6.3659518663,-1.2408339420,-4.5292227391,,, +17.8398437500,17,-5.8491122500,-6.5616558553,-1.5119820386,-4.5733399997,,, +17.8417968750,17,-5.6341477843,-6.4868124941,-1.9870830169,-4.2832582195,,, +17.8437500000,17,-5.6091589754,-6.1784028169,-2.6690638887,-3.6943665991,,, +17.8457031250,17,-5.7743203048,-5.6839760382,-3.5348801508,-2.8624214836,,, +17.8476562500,17,-6.1053341196,-5.0588400751,-4.5405349407,-1.8608874498,,, +17.8496093750,17,-6.5631788340,-4.3673917224,-5.6293448709,-0.7805775938,,, +17.8515625000,17,-7.0987043851,-3.6780125237,-6.7363144992,0.2780519349,,, +17.8535156250,17,-7.6490346428,-3.0492589736,-7.7868962799,1.2201225539,,, +17.8554687500,17,-8.1334919216,-2.5183132886,-8.6958819606,1.9686809982,,, +17.8574218750,17,-8.4551682769,-2.0980173531,-9.3717077086,2.4703059560,,, +17.8593750000,17,-8.5113034183,-1.7824525844,-9.7287413814,2.6948117340,,, +17.8613281250,17,-8.2114804129,-1.5581654535,-9.7040754064,2.6301318901,,, +17.8632812500,17,-7.4935799312,-1.4110436273,-9.2680817032,2.2792228817,,, +17.8652343750,17,-6.3297624467,-1.3227843454,-8.4234378600,1.6641519452,,, +17.8671875000,17,-4.7277097865,-1.2660208795,-7.1998917220,0.8305029542,,, +17.8691406250,17,-2.7334024510,-1.2074998891,-5.6515527724,-0.1559120633,,, +17.8710937500,17,-0.4317375371,-1.1147358745,-3.8541449766,-1.2166005902,,, +17.8730468750,17,2.0597815595,-0.9591555535,-1.8989296559,-2.2661683178,,, +17.8750000000,17,4.6019735998,-0.7183491018,0.1143975290,-3.2179850494,,, +17.8769531250,17,7.0467538320,-0.3799510970,2.0844871573,-3.9915176871,,, +17.8789062500,17,9.2515358015,0.0559426011,3.9172632495,-4.5189405754,,, +17.8808593750,17,11.0917979511,0.5757423052,5.5352701153,-4.7512082874,,, +17.8828125000,17,12.4679010640,1.1517225918,6.8819899176,-4.6636535260,,, +17.8847656250,17,13.3089877861,1.7456613982,7.9220796987,-4.2567579365,,, +17.8867187500,17,13.5771968746,2.3166314738,8.6414107025,-3.5518522809,,, +17.8886718750,17,13.2694281410,2.8272874663,9.0456499455,-2.5871369568,,, +17.8906250000,17,12.4159259407,3.2489348293,9.1565576131,-1.4143734110,,, +17.8925781250,17,11.0782159620,3.5681942374,9.0081753781,-0.0932094358,,, +17.8945312500,17,9.3454190595,3.7905287868,8.6434713066,1.3141406800,,, +17.8964843750,17,7.3288062574,3.9360769941,8.1118529600,2.7447403448,,, +17.8984375000,17,5.1585934498,4.0326993816,7.4693500027,4.1367548798,,, +17.9003906250,17,2.9817333385,4.1116572065,6.7804395310,5.4335705191,,, +17.9023437500,17,0.9526553923,4.2040394848,6.1160367368,6.5869677317,,, +17.9042968750,17,-0.7840654616,4.3361105542,5.5445420070,7.5580872466,,, +17.9062500000,17,-2.1126958988,4.5236849696,5.1187721870,8.3165079057,,, +17.9082031250,17,-2.9640769653,4.7647344596,4.8624454028,8.8356579875,,, +17.9101562500,17,-3.3267447365,5.0350692487,4.7616031493,9.0886193096,,, +17.9121093750,17,-3.2439315194,5.2923502810,4.7673845555,9.0511859297,,, +17.9140625000,17,-2.8016241331,5.4814747582,4.8075667685,8.7071200240,,, +17.9160156250,17,-2.1170536917,5.5358947138,4.7986418049,8.0483571744,,, +17.9179687500,17,-1.3263006994,5.3826219087,4.6561428604,7.0752847089,,, +17.9199218750,17,-0.5697073178,4.9529441648,4.3035848215,5.7999185477,,, +17.9218750000,17,0.0201080386,4.1911027085,3.6787554140,4.2459112075,,, +17.9238281250,17,0.3289414618,3.0627218311,2.7396769855,2.4477319886,,, +17.9257812500,17,0.2749179172,1.5686296288,1.4729760893,0.4562546569,,, +17.9277343750,17,-0.1801415000,-0.2443670759,-0.1004443738,-1.6555129126,,, +17.9296875000,17,-1.0289105679,-2.2856104266,-1.9278337751,-3.7958237355,,, +17.9316406250,17,-2.2219521385,-4.4304117014,-3.9311353125,-5.8619749187,,, +17.9335937500,17,-3.6716674209,-6.5308917017,-6.0130670722,-7.7467478782,,, +17.9355468750,17,-5.2588781370,-8.4296362432,-8.0642100355,-9.3465634236,,, +17.9375000000,17,-6.8425183922,-9.9753866132,-9.9717854653,-10.5709566312,,, +17.9394531250,17,-8.2718707950,-11.0377840422,-11.6290302747,-11.3499574470,,, +17.9414062500,17,-9.4020336134,-11.5222102940,-12.9446254380,-11.6413125180,,, +17.9433593750,17,-10.1095109739,-11.3819282223,-13.8499874304,-11.4371714393,,, +17.9453125000,17,-10.3043600381,-10.6224442331,-14.3029201169,-10.7654477358,,, +17.9472656250,17,-9.9399171786,-9.3009335288,-14.2887925105,-9.6868085263,,, +17.9492187500,17,-9.0188756873,-7.5218779161,-13.8185444948,-8.2895341634,,, +17.9511718750,17,-7.5909768495,-5.4232190325,-12.9224200540,-6.6789849364,,, +17.9531250000,17,-5.7440212901,-3.1569304471,-11.6433854292,-4.9637378184,,, +17.9550781250,17,-3.5945734561,-0.8757141460,-10.0348214491,-3.2467801673,,, +17.9570312500,17,-1.2783558862,1.2737600016,-8.1608346326,-1.6218311334,,, +17.9589843750,17,1.0629628234,3.1589138606,-6.0941692180,-0.1682265661,,, +17.9609375000,17,3.2947993210,4.6705372283,-3.9117635755,1.0547072486,,, +17.9628906250,17,5.2974333319,5.7287281750,-1.6919241517,2.0092532543,,, +17.9648437500,17,6.9712352166,6.2875543682,0.4871509198,2.6793783603,,, +17.9667968750,17,8.2411296844,6.3392240673,2.5494349852,3.0707348272,,, +17.9687500000,17,9.0576943433,5.9134546776,4.4235169545,3.2075240329,,, +17.9707031250,17,9.3986950763,5.0746040134,6.0479840629,3.1296592429,,, +17.9726562500,17,9.2751899544,3.9203506075,7.3807397544,2.8937475357,,, +17.9746093750,17,8.7337904596,2.5751968387,8.4041772818,2.5706353684,,, +17.9765625000,17,7.8484674957,1.1750511902,9.1211086383,2.2351700978,,, +17.9785156250,17,6.7093758301,-0.1498272019,9.5479831643,1.9545495500,,, +17.9804687500,17,5.4143753173,-1.2889327917,9.7105379222,1.7790242446,,, +17.9824218750,17,4.0612474383,-2.1622268473,9.6409822420,1.7351192735,,, +17.9843750000,17,2.7406172562,-2.7245815931,9.3760905482,1.8247785381,,, +17.9863281250,17,1.5286841192,-2.9645621470,8.9543732232,2.0298012026,,, +17.9882812500,17,0.4780293062,-2.9017025875,8.4117169881,2.3159108965,,, +17.9902343750,17,-0.3875239290,-2.5810868426,7.7798474940,2.6371773717,,, +17.9921875000,17,-1.0684589310,-2.0621400664,7.0886453803,2.9452940210,,, +17.9941406250,17,-1.5807480796,-1.4062526104,6.3674588513,3.2002540744,,, +17.9960937500,17,-1.9488591252,-0.6702322389,5.6437427750,3.3761511595,,, +17.9980468750,17,-2.2001570396,0.0953105923,4.9409871448,3.4625162858,,, +18.0000000000,18,-2.3607632241,0.8455245084,4.2756882837,3.4618571343,,, +18.0019531250,18,-2.4543178246,1.5390269273,3.6539841790,3.3830465660,,, +18.0039062500,18,-2.5016663063,2.1384800157,3.0710040257,3.2372666564,,, +18.0058593750,18,-2.5200866663,2.6167823300,2.5125054219,3.0404658601,,, +18.0078125000,18,-2.5228674983,2.9621807416,1.9576304690,2.8151079321,,, +18.0097656250,18,-2.5183111387,3.1795792337,1.3843199195,2.5879642468,,, +18.0117187500,18,-2.5081159763,3.2919144011,0.7751619792,2.3885711337,,, +18.0136718750,18,-2.4877170018,3.3384250665,0.1193425275,2.2471321593,,, +18.0156250000,18,-2.4487977218,3.3642388418,-0.5883979795,2.1874408100,,, +18.0175781250,18,-2.3798388951,3.4071794961,-1.3477305183,2.2190320908,,, +18.0195312500,18,-2.2627199663,3.4912322418,-2.1495451138,2.3353798074,,, +18.0214843750,18,-2.0706714288,3.6255800065,-2.9717299238,2.5163236640,,, +18.0234375000,18,-1.7730133839,3.8040631487,-3.7785798683,2.7298563268,,, +18.0253906250,18,-1.3444750169,4.0052146517,-4.5251106226,2.9335974695,,, +18.0273437500,18,-0.7732920683,4.1946957450,-5.1628425750,3.0780714365,,, +18.0292968750,18,-0.0665577728,4.3297184063,-5.6462151305,3.1113557239,,, +18.0312500000,18,0.7460676572,4.3645910823,-5.9414293615,2.9842467733,,, +18.0332031250,18,1.6135692066,4.2575959105,-6.0334427688,2.6568708613,,, +18.0351562500,18,2.4728141651,3.9790867362,-5.9249846186,2.1068321849,,, +18.0371093750,18,3.2607426453,3.5187572140,-5.6303181867,1.3363203547,,, +18.0390625000,18,3.9216651890,2.8870253785,-5.1715098390,0.3735861754,,, +18.0410156250,18,4.4080940448,2.1063991717,-4.5797354315,-0.7344627347,,, +18.0429687500,18,4.6797120922,1.1983258091,-3.8975332565,-1.9340552212,,, +18.0449218750,18,4.7049847137,0.1772852165,-3.1769555563,-3.1714697335,,, +18.0468750000,18,4.4649733249,-0.9446447677,-2.4730479232,-4.3926526680,,, +18.0488281250,18,3.9553070444,-2.1498908667,-1.8369375887,-5.5412936831,,, +18.0507812500,18,3.1848896062,-3.4102167325,-1.3118187762,-6.5601479225,,, +18.0527343750,18,2.1743846068,-4.6860385218,-0.9309684133,-7.3958174231,,, +18.0546875000,18,0.9570500731,-5.9303300247,-0.7158015035,-8.0049634011,,, +18.0566406250,18,-0.4184107224,-7.0928889280,-0.6724076368,-8.3577856468,,, +18.0585937500,18,-1.8848198495,-8.1208762343,-0.7868800516,-8.4365506188,,, +18.0605468750,18,-3.3566413977,-8.9602351279,-1.0232999175,-8.2343787071,,, +18.0625000000,18,-4.7367868906,-9.5626399402,-1.3279108848,-7.7587080819,,, +18.0644531250,18,-5.9290975520,-9.8932345147,-1.6381053100,-7.0351642035,,, +18.0664062500,18,-6.8508725349,-9.9342393260,-1.8915405018,-6.1074809374,,, +18.0683593750,18,-7.4410849413,-9.6848202557,-2.0321803429,-5.0341614852,,, +18.0703125000,18,-7.6632883716,-9.1571957107,-2.0138617437,-3.8820906814,,, +18.0722656250,18,-7.5042009811,-8.3698134332,-1.8032386761,-2.7177436019,,, +18.0742187500,18,-6.9706602882,-7.3430990207,-1.3818544200,-1.6001057948,,, +18.0761718750,18,-6.0879748061,-6.1021711795,-0.7476759152,-0.5781194691,,, +18.0781250000,18,-4.9003344026,-4.6832274692,0.0815590654,0.3085663143,,, +18.0800781250,18,-3.4713917864,-3.1382669556,1.0644399302,1.0270752627,,, +18.0820312500,18,-1.8821224785,-1.5355347003,2.1368187263,1.5496586710,,, +18.0839843750,18,-0.2239394556,0.0474589199,3.2196160233,1.8577112254,,, +18.0859375000,18,1.4104059109,1.5362167922,4.2290750063,1.9495447099,,, +18.0878906250,18,2.9320836781,2.8674278654,5.0843318702,1.8426751424,,, +18.0898437500,18,4.2567417170,3.9901566117,5.7120787300,1.5684039685,,, +18.0917968750,18,5.3071855530,4.8672371729,6.0522441110,1.1668414249,,, +18.0937500000,18,6.0223641431,5.4801336129,6.0671538552,0.6867636598,,, +18.0957031250,18,6.3681532062,5.8320536494,5.7504245319,0.1854990946,,, +18.0976562500,18,6.3432345791,5.9462321346,5.1290251107,-0.2747894198,,, +18.0996093750,18,5.9767951663,5.8601744222,4.2562254342,-0.6336956377,,, +18.1015625000,18,5.3201014106,5.6171919334,3.1998447230,-0.8405929115,,, +18.1035156250,18,4.4386580322,5.2606576644,2.0334274179,-0.8594942962,,, +18.1054687500,18,3.4082287865,4.8351484259,0.8330836107,-0.6670761090,,, +18.1074218750,18,2.3111486007,4.3900007322,-0.3237600920,-0.2481359178,,, +18.1093750000,18,1.2310731289,3.9801108453,-1.3604002803,0.4065022922,,, +18.1113281250,18,0.2484323533,3.6638339591,-2.2043263134,1.2998760968,,, +18.1132812500,18,-0.5633506860,3.4975946043,-2.7928104542,2.4268400088,,, +18.1152343750,18,-1.1420727950,3.5264458899,-3.0783945124,3.7693008637,,, +18.1171875000,18,-1.4401111563,3.7736309834,-3.0316900456,5.2902862966,,, +18.1191406250,18,-1.4264222390,4.2334089199,-2.6432502159,6.9296601372,,, +18.1210937500,18,-1.0903961292,4.8673417038,-1.9274865342,8.6019377529,,, +18.1230468750,18,-0.4485389353,5.6034056221,-0.9271189863,10.1962814938,,, +18.1250000000,18,0.4517645897,6.3415003004,0.2872800340,11.5827383518,,, +18.1269531250,18,1.5329093979,6.9658231664,1.6229881535,12.6260057533,,, +18.1289062500,18,2.6866907511,7.3585358781,2.9704681386,13.2007105127,,, +18.1308593750,18,3.7760137088,7.4120224363,4.2079003542,13.2041120353,,, +18.1328125000,18,4.6464722042,7.0392752091,5.2087870913,12.5661590650,,, +18.1347656250,18,5.1452818357,6.1817880685,5.8526543942,11.2569181073,,, +18.1367187500,18,5.1411857583,4.8177257377,6.0369400866,9.2930117991,,, +18.1386718750,18,4.5431358306,2.9702641267,5.6890622518,6.7421855319,,, +18.1406250000,18,3.3152336393,0.7087321360,4.7770918859,3.7199807346,,, +18.1425781250,18,1.4847154648,-1.8596644344,3.3170195460,0.3782861220,,, +18.1445312500,18,-0.8553552880,-4.5984759342,1.3766396418,-3.1052989400,,, +18.1464843750,18,-3.5465550400,-7.3452891681,-0.9230110730,-6.5333947476,,, +18.1484375000,18,-6.3743225993,-9.9163038121,-3.4119378811,-9.6967536898,,, +18.1503906250,18,-9.0910845410,-12.1190296684,-5.8864205273,-12.3889416224,,, +18.1523437500,18,-11.4470725653,-13.7710985821,-8.1334347260,-14.4255798706,,, +18.1542968750,18,-13.2187690808,-14.7211483997,-9.9562058604,-15.6656735641,,, +18.1562500000,18,-14.2309621678,-14.8692007191,-11.1950154653,-16.0309426565,,, +18.1582031250,18,-14.3714834690,-14.1823715448,-11.7418329029,-15.5168252699,,, +18.1601562500,18,-13.5983906859,-12.7020137904,-11.5492398565,-14.1940604048,,, +18.1621093750,18,-11.9414991643,-10.5405301611,-10.6336439179,-12.2022062705,,, +18.1640625000,18,-9.5001348849,-7.8671704289,-9.0720943182,-9.7330561522,,, +18.1660156250,18,-6.4372715937,-4.8862735044,-6.9939593842,-7.0059359839,,, +18.1679687500,18,-2.9694609790,-1.8166462187,-4.5701184181,-4.2447565131,,, +18.1699218750,18,0.6492053550,1.1243574468,-1.9992290285,-1.6615245404,,, +18.1718750000,18,4.1520907115,3.7380647492,0.5124595694,0.5601349073,,, +18.1738281250,18,7.2905952779,5.8635012364,2.7754616196,2.2823008604,,, +18.1757812500,18,9.8591735269,7.3886305731,4.6354530790,3.4210375111,,, +18.1777343750,18,11.7110607925,8.2523236538,5.9825459482,3.9446353204,,, +18.1796875000,18,12.7690961248,8.4445946198,6.7571649470,3.8704158157,,, +18.1816406250,18,13.0297786090,8.0059354130,6.9528000000,3.2613105332,,, +18.1835937500,18,12.5573550028,7.0231162146,6.6132227987,2.2200387300,,, +18.1855468750,18,11.4718006526,5.6218761746,5.8268311441,0.8820599514,,, +18.1875000000,18,9.9325040281,3.9545090009,4.7183331201,-0.5952457615,,, +18.1894531250,18,8.1161736379,2.1826498849,3.4344443162,-2.0484463913,,, +18.1914062500,18,6.1943035791,0.4634298917,2.1259397842,-3.3216247002,,, +18.1933593750,18,4.3171968534,-1.0590317205,0.9315773134,-4.2752252937,,, +18.1953125000,18,2.6040158120,-2.2648690638,-0.0345014274,-4.7967678826,,, +18.1972656250,18,1.1373117909,-3.0712262413,-0.6911139807,-4.8115744695,,, +18.1992187500,18,-0.0369782655,-3.4369303297,-0.9932937573,-4.2864468606,,, +18.2011718750,18,-0.9066842717,-3.3605780717,-0.9329159444,-3.2299589152,,, +18.2031250000,18,-1.4903591231,-2.8772986432,-0.5372948683,-1.6923804626,,, +18.2050781250,18,-1.8314898897,-2.0513338306,0.1371606113,0.2404947192,,, +18.2070312500,18,-1.9901156603,-0.9668566962,1.0141184704,2.4573837054,,, +18.2089843750,18,-2.0363368905,0.2765099716,2.0042834195,4.8275854381,,, +18.2109375000,18,-2.0444269031,1.5688454255,3.0115512049,7.2066479224,,, +18.2128906250,18,-2.0815286774,2.8022568702,3.9428692256,9.4481054445,,, +18.2148437500,18,-2.1925408871,3.8843089859,4.7201677899,11.4174460659,,, +18.2167968750,18,-2.3907224218,4.7450216707,5.2876094974,13.0020128890,,, +18.2187500000,18,-2.6583775154,5.3381170439,5.6117006172,14.1159312332,,, +18.2207031250,18,-2.9541494070,5.6392668579,5.6783263096,14.7006144918,,, +18.2226562500,18,-3.2228562129,5.6433806225,5.4911568405,14.7228027054,,, +18.2246093750,18,-3.4047790073,5.3647781385,5.0719367459,14.1751747825,,, +18.2265625000,18,-3.4434556325,4.8397524204,4.4593803859,13.0799272537,,, +18.2285156250,18,-3.2937351723,4.1257257632,3.7043888197,11.4896162738,,, +18.2304687500,18,-2.9300820513,3.2957335478,2.8628018054,9.4831856711,,, +18.2324218750,18,-2.3525813650,2.4296903710,1.9880085013,7.1589382580,,, +18.2343750000,18,-1.5887841683,1.6023796604,1.1256425886,4.6249385481,,, +18.2363281250,18,-0.6917310333,0.8725505873,0.3099350434,1.9888988226,,, +18.2382812500,18,0.2640205614,0.2779564268,-0.4412560249,-0.6489936904,,, +18.2402343750,18,1.1874075166,-0.1660381172,-1.1315011560,-3.2003265245,,, +18.2421875000,18,1.9781871629,-0.4672122845,-1.7851467489,-5.5911003704,,, +18.2441406250,18,2.5382241484,-0.6542271231,-2.4392078330,-7.7613685960,,, +18.2460937500,18,2.7850528025,-0.7699097242,-3.1328490799,-9.6621366364,,, +18.2480468750,18,2.6644490419,-0.8628710777,-3.8978291566,-11.2529216111,,, +18.2500000000,18,2.1614332438,-0.9782532381,-4.7482861616,-12.4997299865,,, +18.2519531250,18,1.3076011711,-1.1472070404,-5.6720312072,-13.3716989037,,, +18.2539062500,18,0.1801833956,-1.3794630494,-6.6288314285,-13.8394168484,,, +18.2558593750,18,-1.1074196328,-1.6649115893,-7.5558038961,-13.8787997292,,, +18.2578125000,18,-2.4199159726,-1.9840527395,-8.3767451157,-13.4799051081,,, +18.2597656250,18,-3.6154258671,-2.3193834345,-9.0123040500,-12.6559330603,,, +18.2617187500,18,-4.5599169293,-2.6604332194,-9.3883615959,-11.4479713300,,, +18.2636718750,18,-5.1422988150,-3.0026131461,-9.4441959785,-9.9236007455,,, +18.2656250000,18,-5.2903343066,-3.3437549131,-9.1426540523,-8.1697336147,,, +18.2675781250,18,-4.9822330251,-3.6816013640,-8.4781777036,-6.2838323358,,, +18.2695312500,18,-4.2496122852,-4.0134425009,-7.4781144479,-4.3676142757,,, +18.2714843750,18,-3.1722607961,-4.3375392491,-6.1988330376,-2.5227058501,,, +18.2734375000,18,-1.8667925168,-4.6552756140,-4.7191809058,-0.8460254567,,, +18.2753906250,18,-0.4707829761,-4.9707756860,-3.1312347540,0.5774515958,,, +18.2773437500,18,0.8762112014,-5.2864585664,-1.5287473830,1.6850529264,,, +18.2792968750,18,2.0508667175,-5.5994758194,0.0039320884,2.4445643832,,, +18.2812500000,18,2.9576746459,-5.9031346017,1.3989926162,2.8545275418,,, +18.2832031250,18,3.5324327435,-6.1890135634,2.6073652759,2.9397220394,,, +18.2851562500,18,3.7421916455,-6.4442785181,3.5985676327,2.7486769986,,, +18.2871093750,18,3.5855954811,-6.6472936672,4.3606971302,2.3516003552,,, +18.2890625000,18,3.0932426602,-6.7663826740,4.9003198389,1.8336907221,,, +18.2910156250,18,2.3256636435,-6.7597342495,5.2405242550,1.2869315415,,, +18.2929687500,18,1.3670100855,-6.5760751344,5.4159257382,0.8037226478,,, +18.2949218750,18,0.3155616337,-6.1609215464,5.4661000608,0.4691105645,,, +18.2968750000,18,-0.7253342881,-5.4673140409,5.4304677850,0.3513018428,,, +18.2988281250,18,-1.6551494613,-4.4648517919,5.3449715473,0.4942064128,,, +18.3007812500,18,-2.3864699989,-3.1474124791,5.2378897130,0.9113079567,,, +18.3027343750,18,-2.8577701976,-1.5414802361,5.1242503989,1.5802554957,,, +18.3046875000,18,-3.0409511205,0.2918034919,5.0032688750,2.4445907400,,, +18.3066406250,18,-2.9390633704,2.2661272991,4.8619908405,3.4257351299,,, +18.3085937500,18,-2.5802301900,4.2838302913,4.6815511317,4.4372813054,,, +18.3105468750,18,-2.0132187843,6.2464755465,4.4413683528,5.3949498972,,, +18.3125000000,18,-1.3018541662,8.0642946401,4.1222412733,6.2250591495,,, +18.3144531250,18,-0.5164421137,9.6644943795,3.7108417918,6.8723561219,,, +18.3164062500,18,0.2742362478,10.9925186510,3.2037616994,7.3029229406,,, +18.3183593750,18,1.0082974331,12.0077180830,2.6076469832,7.5028108152,,, +18.3203125000,18,1.6333092646,12.6786893397,1.9348964856,7.4738845370,,, +18.3222656250,18,2.1070135964,12.9803651246,1.1989238657,7.2268564187,,, +18.3242187500,18,2.4009017624,12.8980298356,0.4144744531,6.7779920026,,, +18.3261718750,18,2.5066810898,12.4373262383,-0.3976771579,6.1520222913,,, +18.3281250000,18,2.4384009507,11.6287391402,-1.2076115615,5.3829198975,,, +18.3300781250,18,2.2283361751,10.5233844239,-1.9773572735,4.5096548678,,, +18.3320312500,18,1.9218118088,9.1871903453,-2.6645547716,3.5728948380,,, +18.3339843750,18,1.5748067061,7.6971594028,-3.2252588292,2.6153832763,,, +18.3359375000,18,1.2535991949,6.1386288983,-3.6136702594,1.6835874738,,, +18.3378906250,18,1.0312291082,4.5998995077,-3.7837432209,0.8264948966,,, +18.3398437500,18,0.9768153853,3.1608036583,-3.6982769075,0.0885026231,,, +18.3417968750,18,1.1415850354,1.8785023263,-3.3405437040,-0.5014974206,,, +18.3437500000,18,1.5488162888,0.7789284711,-2.7203248730,-0.9380412360,,, +18.3457031250,18,2.1898773014,-0.1414440322,-1.8733195957,-1.2385881312,,, +18.3476562500,18,3.0229769575,-0.9075005484,-0.8568922864,-1.4367080817,,, +18.3496093750,18,3.9732795177,-1.5579241115,0.2557128158,-1.5752029951,,, +18.3515625000,18,4.9391383258,-2.1380863103,1.3822550860,-1.6998779257,,, +18.3535156250,18,5.8070257517,-2.6908235186,2.4398274933,-1.8520380043,,, +18.3554687500,18,6.4693818873,-3.2488022973,3.3536085904,-2.0623866831,,, +18.3574218750,18,6.8382906307,-3.8321689829,4.0632558965,-2.3484649470,,, +18.3593750000,18,6.8528115353,-4.4503194334,4.5249985488,-2.7146179026,,, +18.3613281250,18,6.4807649699,-5.1060793462,4.7104326044,-3.1551157367,,, +18.3632812500,18,5.7190403687,-5.7977445587,4.6064774210,-3.6579728006,,, +18.3652343750,18,4.5964125394,-6.5139077782,4.2194584494,-4.2032774830,,, +18.3671875000,18,3.1732703910,-7.2275962820,3.5779854922,-4.7597294926,,, +18.3691406250,18,1.5319573080,-7.8997926694,2.7290765555,-5.2884333747,,, +18.3710937500,18,-0.2364173998,-8.4883572417,1.7308826815,-5.7510140379,,, +18.3730468750,18,-2.0418096221,-8.9539425307,0.6456821333,-6.1147685919,,, +18.3750000000,18,-3.8011451209,-9.2635797398,-0.4665843011,-6.3554455703,,, +18.3769531250,18,-5.4392601613,-9.3926893520,-1.5517333532,-6.4581251581,,, +18.3789062500,18,-6.8858624144,-9.3227125971,-2.5609978806,-6.4141963413,,, +18.3808593750,18,-8.0748756909,-9.0380001231,-3.4511105739,-6.2179016109,,, +18.3828125000,18,-8.9503446202,-8.5286551518,-4.1875305840,-5.8670309939,,, +18.3847656250,18,-9.4755068891,-7.7970947459,-4.7488647177,-5.3656859463,,, +18.3867187500,18,-9.6399393876,-6.8617122289,-5.1295204577,-4.7259725880,,, +18.3886718750,18,-9.4631680902,-5.7559552462,-5.3398244993,-3.9687468168,,, +18.3906250000,18,-8.9921354137,-4.5225182489,-5.4026095121,-3.1214806727,,, +18.3925781250,18,-8.2903695345,-3.2036456176,-5.3449102988,-2.2118675976,,, +18.3945312500,18,-7.4244553034,-1.8339598850,-5.1886016953,-1.2623756084,,, +18.3964843750,18,-6.4554521636,-0.4405553081,-4.9466640883,-0.2904059391,,, +18.3984375000,18,-5.4354889204,0.9530529216,-4.6256575784,0.6888655948,,, +18.4003906250,18,-4.4063440232,2.3238281075,-4.2298335867,1.6606955927,,, +18.4023437500,18,-3.4001860546,3.6465125329,-3.7651177066,2.6087413703,,, +18.4042968750,18,-2.4421434846,4.8913156982,-3.2426030430,3.5125594113,,, +18.4062500000,18,-1.5518961911,6.0243844576,-2.6790084772,4.3474170349,,, +18.4082031250,18,-0.7439599339,7.0098133741,-2.0937541603,5.0861974602,,, +18.4101562500,18,-0.0271852259,7.8111266721,-1.5051163538,5.7013328800,,, +18.4121093750,18,0.5974819132,8.3940984640,-0.9268081088,6.1670065040,,, +18.4140625000,18,1.1401494233,8.7320492372,-0.3648059534,6.4622709856,,, +18.4160156250,18,1.6232173660,8.8107094304,0.1844045274,6.5738242050,,, +18.4179687500,18,2.0772696624,8.6291716460,0.7300126876,6.4968002181,,, +18.4199218750,18,2.5298040668,8.1958400578,1.2763213701,6.2328573701,,, +18.4218750000,18,2.9928907363,7.5224108497,1.8131294117,5.7867625521,,, +18.4238281250,18,3.4601479041,6.6234367847,2.3158742858,5.1662940657,,, +18.4257812500,18,3.9134030073,5.5244116931,2.7546343066,4.3881242448,,, +18.4277343750,18,4.3297303979,4.2694168529,3.1039537848,3.4837818578,,, +18.4296875000,18,4.6835069698,2.9197359450,3.3473008187,2.4992630016,,, +18.4316406250,18,4.9465143982,1.5459608723,3.4763657462,1.4892079360,,, +18.4335937500,18,5.0903718538,0.2188494678,3.4891849211,0.5090390493,,, +18.4355468750,18,5.0916445098,-0.9981949634,3.3896813455,-0.3917028237,,, +18.4375000000,18,4.9381639235,-2.0523858909,3.1888392222,-1.1717155521,,, +18.4394531250,18,4.6336789794,-2.9021700094,2.9051742559,-1.7979824317,,, +18.4414062500,18,4.1968127540,-3.5202511553,2.5618053738,-2.2483946994,,, +18.4433593750,18,3.6554706195,-3.8985966785,2.1821377838,-2.5156817371,,, +18.4453125000,18,3.0419853599,-4.0495918756,1.7877188978,-2.6073896876,,, +18.4472656250,18,2.3890755276,-4.0022550182,1.3969821787,-2.5429565983,,, +18.4492187500,18,1.7246872415,-3.7975783293,1.0233395369,-2.3526629402,,, +18.4511718750,18,1.0689098956,-3.4834020075,0.6749068813,-2.0768675882,,, +18.4531250000,18,0.4343391923,-3.1076546082,0.3555035397,-1.7616731855,,, +18.4550781250,18,-0.1728143668,-2.7130004095,0.0643341818,-1.4529911800,,, +18.4570312500,18,-0.7494383683,-2.3345665741,-0.2032765705,-1.1915402071,,, +18.4589843750,18,-1.2875476936,-1.9973601521,-0.4504128910,-1.0072241453,,, +18.4609375000,18,-1.7676775138,-1.7137767124,-0.6721024532,-0.9148782735,,, +18.4628906250,18,-2.1618187848,-1.4864244106,-0.8554381500,-0.9169552064,,, +18.4648437500,18,-2.4424628088,-1.3136400030,-0.9850474564,-1.0097025948,,, +18.4667968750,18,-2.5893853632,-1.1911326972,-1.0466769940,-1.1852365289,,, +18.4687500000,18,-2.5933635558,-1.1114751575,-1.0284254821,-1.4313867867,,, +18.4707031250,18,-2.4571726885,-1.0633363953,-0.9218269130,-1.7321374137,,, +18.4726562500,18,-2.1925955119,-1.0291235029,-0.7220759289,-2.0664973405,,, +18.4746093750,18,-1.8171895202,-0.9849811585,-0.4289375754,-2.4079449700,,, +18.4765625000,18,-1.3536129996,-0.9062044788,-0.0495939948,-2.7277042536,,, +18.4785156250,18,-0.8284833985,-0.7745017953,0.3992904517,-2.9993194260,,, +18.4804687500,18,-0.2706823917,-0.5842821905,0.8912977419,-3.2022253065,,, +18.4824218750,18,0.2871341941,-0.3475466730,1.3900201707,-3.3249235843,,, +18.4843750000,18,0.8059098521,-0.0944647398,1.8496070470,-3.3659892722,,, +18.4863281250,18,1.2418523926,0.1334082181,2.2184695997,-3.3305300538,,, +18.4882812500,18,1.5513431975,0.2939614645,2.4456289120,-3.2246213913,,, +18.4902343750,18,1.6961979762,0.3543812050,2.4882836161,-3.0508767616,,, +18.4921875000,18,1.6504956787,0.2994044511,2.3202992996,-2.8052146504,,, +18.4941406250,18,1.4084565964,0.1361655410,1.9393592879,-2.4763117714,,, +18.4960937500,18,0.9896514728,-0.1070595417,1.3693213777,-2.0495560138,,, +18.4980468750,18,0.4392598205,-0.3852600524,0.6569382869,-1.5123334961,,, +18.5000000000,18,-0.1760550708,-0.6411749113,-0.1343800944,-0.8570174084,,, +18.5019531250,18,-0.7747677974,-0.8117316473,-0.9302750027,-0.0827923631,,, +18.5039062500,18,-1.2688928884,-0.8366570742,-1.6507626147,0.8031480800,,, +18.5058593750,18,-1.5749572823,-0.6670879231,-2.2186379552,1.7858169134,,, +18.5078125000,18,-1.6278224553,-0.2742371776,-2.5715748180,2.8414002710,,, +18.5097656250,18,-1.3944838622,0.3438872820,-2.6726280027,3.9346500902,,, +18.5117187500,18,-0.8816280416,1.1619373926,-2.5137199407,5.0193126204,,, +18.5136718750,18,-0.1334399331,2.1306499546,-2.1129185636,6.0416751101,,, +18.5156250000,18,0.7768292873,3.1798147814,-1.5100402265,6.9436236356,,, +18.5175781250,18,1.7580305612,4.2240101612,-0.7619780969,7.6672398460,,, +18.5195312500,18,2.7151458047,5.1736237535,0.0644343846,8.1631670087,,, +18.5214843750,18,3.5596028289,5.9437722903,0.8989347926,8.3961888552,,, +18.5234375000,18,4.2088004706,6.4572872341,1.6681035256,8.3438702754,,, +18.5253906250,18,4.5855486971,6.6509023931,2.2966168443,7.9968543948,,, +18.5273437500,18,4.6278054043,6.4877297697,2.7176339144,7.3652377459,,, +18.5292968750,18,4.2996264015,5.9650170680,2.8843966157,6.4818531918,,, +18.5312500000,18,3.5957239920,5.1130873884,2.7754514552,5.3984367103,,, +18.5332031250,18,2.5426463137,3.9915330204,2.3954020618,4.1803924939,,, +18.5351562500,18,1.1978920940,2.6841331737,1.7730846188,2.9024034980,,, +18.5371093750,18,-0.3529818097,1.2916019487,0.9582260898,1.6441836385,,, +18.5390625000,18,-2.0016499038,-0.0784959146,0.0161792310,0.4847175468,,, +18.5410156250,18,-3.6283452841,-1.3278267188,-0.9820043246,-0.5094755916,,, +18.5429687500,18,-5.1178084078,-2.3835217413,-1.9710883615,-1.2977454189,,, +18.5449218750,18,-6.3709153147,-3.2016348960,-2.8963337307,-1.8675519007,,, +18.5468750000,18,-7.3091095175,-3.7601010332,-3.7109406392,-2.2262077279,,, +18.5488281250,18,-7.8770602563,-4.0538897261,-4.3735507558,-2.3944967291,,, +18.5507812500,18,-8.0450147486,-4.0938536706,-4.8484641133,-2.4047953775,,, +18.5527343750,18,-7.8089190532,-3.9051199866,-5.1074997939,-2.2995288080,,, +18.5546875000,18,-7.1893457838,-3.5260766845,-5.1333639138,-2.1298943128,,, +18.5566406250,18,-6.2284985653,-3.0063584812,-4.9215861029,-1.9529491619,,, +18.5585937500,18,-4.9826986508,-2.4007753755,-4.4781678313,-1.8242733265,,, +18.5605468750,18,-3.5143090123,-1.7650499262,-3.8167611121,-1.7915550372,,, +18.5625000000,18,-1.8902727290,-1.1581619413,-2.9604629735,-1.8941238624,,, +18.5644531250,18,-0.1861137956,-0.6439821100,-1.9462777434,-2.1636144574,,, +18.5664062500,18,1.5123867749,-0.2857799182,-0.8261785866,-2.6213346745,,, +18.5683593750,18,3.1129967095,-0.1374523597,0.3372109432,-3.2745114736,,, +18.5703125000,18,4.5244522506,-0.2347032806,1.4776509111,-4.1116002170,,, +18.5722656250,18,5.6668729499,-0.5841734416,2.5328902722,-5.0946925486,,, +18.5742187500,18,6.4817394776,-1.1553625350,3.4499259544,-6.1551265481,,, +18.5761718750,18,6.9353153739,-1.8846419979,4.1845575217,-7.2007783454,,, +18.5781250000,18,7.0176556740,-2.6875029084,4.6991092785,-8.1301550635,,, +18.5800781250,18,6.7425086793,-3.4699768612,4.9643218858,-8.8438930351,,, +18.5820312500,18,6.1466551532,-4.1396380713,4.9644634432,-9.2541701042,,, +18.5839843750,18,5.2879437719,-4.6161934706,4.7035182851,-9.2929833869,,, +18.5859375000,18,4.2428349868,-4.8388562495,4.2104037543,-8.9171938910,,, +18.5878906250,18,3.0995254200,-4.7723496539,3.5383260751,-8.1129477353,,, +18.5898437500,18,1.9456761437,-4.4112703979,2.7571377849,-6.9002640478,,, +18.5917968750,18,0.8569086092,-3.7786679323,1.9420886796,-5.3330713095,,, +18.5937500000,18,-0.1094887582,-2.9206883643,1.1623389451,-3.4941398417,,, +18.5957031250,18,-0.9166247860,-1.9021108787,0.4723706275,-1.4881825059,,, +18.5976562500,18,-1.5473717651,-0.8006404912,-0.0922170578,0.5676101488,,, +18.5996093750,18,-2.0003942178,0.3029959999,-0.5145886879,2.5558884967,,, +18.6015625000,18,-2.2843314930,1.3340934863,-0.7935624425,4.3685936438,,, +18.6035156250,18,-2.4144477517,2.2279536588,-0.9407403515,5.9110603668,,, +18.6054687500,18,-2.4125672363,2.9328844890,-0.9786108263,7.1060974760,,, +18.6074218750,18,-2.3084252187,3.4142899563,-0.9380457536,7.8991939943,,, +18.6093750000,18,-2.1405803215,3.6554655186,-0.8553414907,8.2601660212,,, +18.6113281250,18,-1.9527350803,3.6554200244,-0.7677457570,8.1830858652,,, +18.6132812500,18,-1.7839357795,3.4298829549,-0.7057467466,7.6900648820,,, +18.6152343750,18,-1.6590353216,3.0148577692,-0.6858038569,6.8358136376,,, +18.6171875000,18,-1.5853590307,2.4656089644,-0.7091506991,5.7059427992,,, +18.6191406250,18,-1.5542692338,1.8493393694,-0.7661590778,4.4082290402,,, +18.6210937500,18,-1.5461445753,1.2343166020,-0.8423877607,3.0590867655,,, +18.6230468750,18,-1.5383996092,0.6786023121,-0.9239891304,1.7686376314,,, +18.6250000000,18,-1.5109031521,0.2249828002,-0.9994230039,0.6315719284,,, +18.6269531250,18,-1.4464675867,-0.0955482998,-1.0572468766,-0.2745608242,,, +18.6289062500,18,-1.3330396318,-0.2603461617,-1.0855726752,-0.8917520405,,, +18.6308593750,18,-1.1685122849,-0.2576049371,-1.0749362128,-1.1872742579,,, +18.6328125000,18,-0.9605333388,-0.0897153447,-1.0198931286,-1.1561700116,,, +18.6347656250,18,-0.7203390458,0.2272543892,-0.9176883204,-0.8187725921,,, +18.6367187500,18,-0.4575928542,0.6662305112,-0.7671175309,-0.2173420160,,, +18.6386718750,18,-0.1781612472,1.1918948333,-0.5685336142,0.5874803396,,, +18.6406250000,18,0.1169842693,1.7618198690,-0.3245326991,1.5201451992,,, +18.6425781250,18,0.4286753792,2.3247286070,-0.0435619132,2.4916015814,,, +18.6445312500,18,0.7523043511,2.8211441189,0.2549020312,3.4023941028,,, +18.6464843750,18,1.0722622841,3.1899961621,0.5386442455,4.1509561667,,, +18.6484375000,18,1.3600749818,3.3745818018,0.7650668599,4.6422427177,,, +18.6503906250,18,1.5761364729,3.3257473383,0.8860350103,4.7953416946,,, +18.6523437500,18,1.6752990365,3.0080513603,0.8542296757,4.5535847981,,, +18.6542968750,18,1.6149195948,2.4074462273,0.6301034846,3.8937883817,,, +18.6562500000,18,1.3664445013,1.5364411067,0.1913959367,2.8308952309,,, +18.6582031250,18,0.9304444834,0.4389168097,-0.4547562983,1.4206874738,,, +18.6601562500,18,0.3443436049,-0.8082270123,-1.2658151458,-0.2409684796,,, +18.6621093750,18,-0.3263538077,-2.1041726611,-2.1710874771,-2.0285662040,,, +18.6640625000,18,-1.0045837621,-3.3404635800,-3.0860843055,-3.8044152033,,, +18.6660156250,18,-1.6145234468,-4.4145512711,-3.9248713777,-5.4345951533,,, +18.6679687500,18,-2.0916843076,-5.2388795866,-4.6085691093,-6.8015005131,,, +18.6699218750,18,-2.3905532662,-5.7465007886,-5.0696582848,-7.8127320829,,, +18.6718750000,18,-2.4850071422,-5.8914470795,-5.2526414228,-8.4033408233,,, +18.6738281250,18,-2.3639847283,-5.6466988945,-5.1154099555,-8.5339544473,,, +18.6757812500,18,-2.0295749413,-5.0060016113,-4.6342148166,-8.1915327440,,, +18.6777343750,18,-1.4985240566,-3.9897240218,-3.8107594594,-7.3935156503,,, +18.6796875000,18,-0.8025862288,-2.6483913080,-2.6767126726,-6.1896091275,,, +18.6816406250,18,0.0143411691,-1.0599057594,-1.2917292792,-4.6577558086,,, +18.6835937500,18,0.8994479134,0.6767322895,0.2628851241,-2.8969206741,,, +18.6855468750,18,1.7936398877,2.4477379113,1.8916020415,-1.0195505498,,, +18.6875000000,18,2.6360033395,4.1311514489,3.4943660787,0.8561869509,,, +18.6894531250,18,3.3693318383,5.6051784214,4.9773873788,2.6145754760,,, +18.6914062500,18,3.9434503978,6.7586755507,6.2596152269,4.1510750714,,, +18.6933593750,18,4.3162260345,7.5017306734,7.2736565822,5.3803828475,,, +18.6953125000,18,4.4546166761,7.7728984243,7.9650207443,6.2410207585,,, +18.6972656250,18,4.3401141162,7.5447052844,8.2956456762,6.6981310941,,, +18.6992187500,18,3.9802590838,6.8306579638,8.2544586109,6.7480766798,,, +18.7011718750,18,3.4156578460,5.6868177842,7.8657244433,6.4198296673,,, +18.7031250000,18,2.7115082026,4.2009582339,7.1840570311,5.7673654099,,, +18.7050781250,18,1.9397736840,2.4780085857,6.2798104575,4.8590459008,,, +18.7070312500,18,1.1655502401,0.6322359963,5.2266405871,3.7716684242,,, +18.7089843750,18,0.4419397826,-1.2162731240,4.0956911022,2.5879585670,,, +18.7109375000,18,-0.1907658436,-2.9464860254,2.9523316324,1.3939907410,,, +18.7128906250,18,-0.7047502522,-4.4433221170,1.8527207450,0.2757874263,,, +18.7148437500,18,-1.0838965532,-5.6059106712,0.8416300576,-0.6857452787,,, +18.7167968750,18,-1.3239329747,-6.3569272363,-0.0484792540,-1.4220791904,,, +18.7187500000,18,-1.4318916038,-6.6511342207,-0.7977902802,-1.8843544221,,, +18.7207031250,18,-1.4226910501,-6.4813622717,-1.3985539973,-2.0490192506,,, +18.7226562500,18,-1.3154392193,-5.8814398568,-1.8542053022,-1.9217298200,,, +18.7246093750,18,-1.1311188134,-4.9233396707,-2.1776636091,-1.5368921157,,, +18.7265625000,18,-0.8922998818,-3.7073713481,-2.3886736472,-0.9517913758,,, +18.7285156250,18,-0.6268529938,-2.3510559906,-2.5127938304,-0.2404723620,,, +18.7304687500,18,-0.3717541544,-0.9801074893,-2.5815097075,0.5102095299,,, +18.7324218750,18,-0.1699832348,0.2824072834,-2.6290817544,1.2070668613,,, +18.7343750000,18,-0.0619995789,1.3293058923,-2.6867851322,1.7611764915,,, +18.7363281250,18,-0.0790525526,2.0799527487,-2.7799235387,2.0983596323,,, +18.7382812500,18,-0.2403829358,2.4867138930,-2.9282563292,2.1674132574,,, +18.7402343750,18,-0.5526443570,2.5371063308,-3.1470611640,1.9449127393,,, +18.7421875000,18,-1.0114767049,2.2502312735,-3.4480917483,1.4335422481,,, +18.7441406250,18,-1.6024162459,1.6712443114,-3.8382526863,0.6567826721,,, +18.7460937500,18,-2.2982523151,0.8685477667,-4.3143887863,-0.3433319795,,, +18.7480468750,18,-3.0583952215,-0.0709677338,-4.8594704182,-1.5081005102,,, +18.7500000000,18,-3.8341138366,-1.0529892350,-5.4437912191,-2.7692433275,,, +18.7519531250,18,-4.5726959426,-1.9866475381,-6.0266641315,-4.0555433303,,, +18.7539062500,18,-5.2170003443,-2.7906274445,-6.5565571153,-5.2937669401,,, +18.7558593750,18,-5.7054013151,-3.3977219995,-6.9724739042,-6.4089348598,,, +18.7578125000,18,-5.9734447998,-3.7572526060,-7.2064153715,-7.3267505348,,, +18.7597656250,18,-5.9559243961,-3.8345169689,-7.1862962101,-7.9764703407,,, +18.7617187500,18,-5.5925100040,-3.6135029611,-6.8421471775,-8.2964485226,,, +18.7636718750,18,-4.8382932195,-3.1033099587,-6.1162549883,-8.2427738654,,, +18.7656250000,18,-3.6737347924,-2.3393253159,-4.9728174446,-7.7956988274,,, +18.7675781250,18,-2.1093035546,-1.3770188804,-3.4036293963,-6.9616666621,,, +18.7695312500,18,-0.1872477077,-0.2838024468,-1.4312844540,-5.7726608551,,, +18.7714843750,18,2.0165545786,0.8696282396,0.8874340981,-4.2824668200,,, +18.7734375000,18,4.3917947842,2.0172337700,3.4576421628,-2.5608851258,,, +18.7753906250,18,6.7954814084,3.0995340623,6.1444075105,-0.6907943779,,, +18.7773437500,18,9.0609172942,4.0613351918,8.7791858198,1.2335062650,,, +18.7792968750,18,11.0184862876,4.8544720415,11.1792343273,3.1147417574,,, +18.7812500000,18,12.5185712380,5.4452273945,13.1720341834,4.8657572939,,, +18.7832031250,18,13.4406955356,5.8167394442,14.6100169585,6.4159490816,,, +18.7851562500,18,13.6900438307,5.9633850400,15.3735989433,7.7085173202,,, +18.7871093750,18,13.1961650336,5.8835142429,15.3741923197,8.6958026862,,, +18.7890625000,18,11.9208412427,5.5776207995,14.5636563851,9.3391532634,,, +18.7910156250,18,9.8705755130,5.0531112785,12.9450948777,9.6147326956,,, +18.7929687500,18,7.1059368598,4.3293347126,10.5781702828,9.5200545305,,, +18.7949218750,18,3.7423487375,3.4363968854,7.5768608460,9.0745926842,,, +18.7968750000,18,-0.0555326433,2.4106872685,4.1018813862,8.3158680145,,, +18.7988281250,18,-4.0807788356,1.2933789809,0.3499049901,7.2957700639,,, +18.8007812500,18,-8.0943406777,0.1294065112,-3.4607836820,6.0757911619,,, +18.8027343750,18,-11.8426017628,-1.0382863396,-7.1076219967,4.7187207083,,, +18.8046875000,18,-15.0799447775,-2.1757399891,-10.3809417642,3.2799981161,,, +18.8066406250,18,-17.5895309864,-3.2594320109,-13.0977734467,1.8036226951,,, +18.8085937500,18,-19.1981586430,-4.2719463860,-15.1106423736,0.3237942388,,, +18.8105468750,18,-19.7858608625,-5.1952393332,-16.3120042796,-1.1295392633,,, +18.8125000000,18,-19.2922401097,-6.0035625529,-16.6372482112,-2.5237166930,,, +18.8144531250,18,-17.7206313634,-6.6597813958,-16.0683669942,-3.8187149791,,, +18.8164062500,18,-15.1401881569,-7.1186455682,-14.6368595482,-4.9679007122,,, +18.8183593750,18,-11.6831921796,-7.3332345656,-12.4225168579,-5.9214285616,,, +18.8203125000,18,-7.5356470697,-7.2596865675,-9.5473091731,-6.6284265750,,, +18.8222656250,18,-2.9257110797,-6.8639158794,-6.1686416965,-7.0417150216,,, +18.8242187500,18,1.8869521880,-6.1313560690,-2.4740401566,-7.1270885570,,, +18.8261718750,18,6.6246132454,-5.0713097694,1.3270240038,-6.8700654984,,, +18.8281250000,18,11.0083511645,-3.7156021415,5.0153484856,-6.2776372524,,, +18.8300781250,18,14.7758132724,-2.1184189515,8.3755694396,-5.3786433842,,, +18.8320312500,18,17.7006577793,-0.3531657924,11.2114094338,-4.2205734960,,, +18.8339843750,18,19.6123975979,1.4980110315,13.3616988006,-2.8616666130,,, +18.8359375000,18,20.4116358757,3.3538493388,14.7128493465,-1.3646331062,,, +18.8378906250,18,20.0790956759,5.1380606140,15.2062163137,0.2056112444,,, +18.8398437500,18,18.6775962056,6.7809032236,14.8407560084,1.7825819471,,, +18.8417968750,18,16.3434173902,8.2171457665,13.6700814565,3.2964558930,,, +18.8437500000,18,13.2689912666,9.3817059738,11.7950026444,4.6715023167,,, +18.8457031250,18,9.6837263065,10.2105384880,9.3543647136,5.8282569717,,, +18.8476562500,18,5.8354838423,10.6476052783,6.5157295225,6.6906284196,,, +18.8496093750,18,1.9721305493,10.6527029211,3.4661374392,7.1943824667,,, +18.8515625000,18,-1.6766458910,10.2103847417,0.4008749344,7.2974690443,,, +18.8535156250,18,-4.9153947549,9.3398401188,-2.4913694945,6.9912941475,,, +18.8554687500,18,-7.5941173470,8.0954096608,-5.0444464875,6.3036897740,,, +18.8574218750,18,-9.6139579906,6.5533666100,-7.1277225847,5.2897343135,,, +18.8593750000,18,-10.9274726229,4.7984266433,-8.6532731443,4.0207255194,,, +18.8613281250,18,-11.5350514930,2.9173491426,-9.5782114600,2.5762786161,,, +18.8632812500,18,-11.4817904113,0.9917802047,-9.9058096153,1.0342648763,,, +18.8652343750,18,-10.8536645553,-0.9097787397,-9.6840330648,-0.5382246006,,, +18.8671875000,18,-9.7679641986,-2.7339242882,-8.9971463724,-2.0859686550,,, +18.8691406250,18,-8.3605380213,-4.4405580053,-7.9527890489,-3.5629220682,,, +18.8710937500,18,-6.7744930419,-6.0008013765,-6.6702120330,-4.9301038565,,, +18.8730468750,18,-5.1489488795,-7.3925386054,-5.2706200496,-6.1514410562,,, +18.8750000000,18,-3.6070108609,-8.5955554732,-3.8677095926,-7.1891992104,,, +18.8769531250,18,-2.2460489448,-9.5905878598,-2.5591122064,-8.0042243230,,, +18.8789062500,18,-1.1319416925,-10.3609719235,-1.4209445706,-8.5606984735,,, +18.8808593750,18,-0.2963173916,-10.8933443740,-0.5042237347,-8.8313506139,,, +18.8828125000,18,0.2629906451,-11.1765968991,0.1682864830,-8.8000315139,,, +18.8847656250,18,0.5774502897,-11.1997910052,0.6026794851,-8.4607426598,,, +18.8867187500,18,0.6999843358,-10.9507144843,0.8308478209,-7.8161265991,,, +18.8886718750,18,0.6945282129,-10.4178104279,0.9046029393,-6.8796960587,,, +18.8906250000,18,0.6258687409,-9.5938725417,0.8881631754,-5.6790747960,,, +18.8925781250,18,0.5540718679,-8.4764741928,0.8507874783,-4.2538720064,,, +18.8945312500,18,0.5324444973,-7.0677660171,0.8596874281,-2.6510305469,,, +18.8964843750,18,0.6054717983,-5.3807768824,0.9724128928,-0.9249183506,,, +18.8984375000,18,0.8067094272,-3.4497321035,1.2295807624,0.8595453444,,, +18.9003906250,18,1.1552598753,-1.3369388826,1.6481184078,2.6253912118,,, +18.9023437500,18,1.6476973242,0.8658349677,2.2144579815,4.2835413869,,, +18.9042968750,18,2.2501216784,3.0424892723,2.8815082600,5.7361867064,,, +18.9062500000,18,2.8990900358,5.0643967329,3.5740389281,6.8863980061,,, +18.9082031250,18,3.5112695686,6.8047783989,4.2005149157,7.6500244689,,, +18.9101562500,18,3.9965337132,8.1530607118,4.6675634156,7.9658231027,,, +18.9121093750,18,4.2730558021,9.0287016275,4.8959615820,7.8047054123,,, +18.9140625000,18,4.2809004460,9.3904574228,4.8335973784,7.1764486586,,, +18.9160156250,18,3.9874543470,9.2381049086,4.4588717568,6.1299624217,,, +18.9179687500,18,3.3873369678,8.6108034127,3.7776688685,4.7490563569,,, +18.9199218750,18,2.5042183874,7.5848689324,2.8217363132,3.1465247542,,, +18.9218750000,18,1.3926671159,6.2670674008,1.6481549231,1.4543853220,,, +18.9238281250,18,0.1349124782,4.7835619894,0.3360421193,-0.1888060370,,, +18.9257812500,18,-1.1683324623,3.2694480473,-1.0206817823,-1.6489312586,,, +18.9277343750,18,-2.4107155364,1.8583407678,-2.3226625956,-2.8055629638,,, +18.9296875000,18,-3.4905262931,0.6705457548,-3.4715442355,-3.5603746572,,, +18.9316406250,18,-4.3145615505,-0.1950252397,-4.3721801846,-3.8416390534,,, +18.9335937500,18,-4.8005036464,-0.6641009404,-4.9365350989,-3.6061444201,,, +18.9355468750,18,-4.8840822603,-0.6933153516,-5.0936802899,-2.8451142980,,, +18.9375000000,18,-4.5304240025,-0.2798188326,-4.8032666899,-1.5928205768,,, +18.9394531250,18,-3.7434063569,0.5358281079,-4.0654744420,0.0711045285,,, +18.9414062500,18,-2.5679011189,1.6748707008,-2.9223484566,2.0273238423,,, +18.9433593750,18,-1.0859665992,3.0252948775,-1.4525601883,4.1243158466,,, +18.9453125000,18,0.5888692152,4.4460228975,0.2353002587,6.1870184474,,, +18.9472656250,18,2.3183511578,5.7770559259,2.0103914742,8.0304560284,,, +18.9492187500,18,3.9496577969,6.8561250282,3.7310524051,9.4775254201,,, +18.9511718750,18,5.3297878003,7.5378178809,5.2588915625,10.3773795104,,, +18.9531250000,18,6.3215039332,7.7117973223,6.4702551210,10.6215535675,,, +18.9550781250,18,6.8176806769,7.3147226014,7.2632306318,10.1542173243,,, +18.9570312500,18,6.7522408136,6.3327338234,7.5626580393,8.9751376443,,, +18.9589843750,18,6.1061193170,4.7989794454,7.3234606289,7.1375326283,,, +18.9609375000,18,4.9077535042,2.7896623171,6.5317546141,4.7422175643,,, +18.9628906250,18,3.2291880205,0.4162565570,5.2057842797,1.9279330856,,, +18.9648437500,18,1.1781250876,-2.1861864781,3.3964369943,-1.1412649114,,, +18.9667968750,18,-1.1129999583,-4.8702962553,1.1854783489,-4.2890259385,,, +18.9687500000,18,-3.4980393449,-7.4849187438,-1.3170821025,-7.3378647799,,, +18.9707031250,18,-5.8269295862,-9.8816370650,-3.9757874274,-10.1177786892,,, +18.9726562500,18,-7.9530545644,-11.9202281707,-6.6339129685,-12.4731126637,,, +18.9746093750,18,-9.7375022638,-13.4757295610,-9.1198528387,-14.2707948895,,, +18.9765625000,18,-11.0534394535,-14.4485428340,-11.2576017604,-15.4108722607,,, +18.9785156250,18,-11.7921975947,-14.7729988411,-12.8808302295,-15.8342626072,,, +18.9804687500,18,-11.8691233552,-14.4208541143,-13.8462889505,-15.5249131649,,, +18.9824218750,18,-11.2302595728,-13.4027210639,-14.0455311118,-14.5094925038,,, +18.9843750000,18,-9.8610875705,-11.7688453182,-13.4165156907,-12.8550845191,,, +18.9863281250,18,-7.7935727183,-9.6059856201,-11.9527286448,-10.6622833927,,, +18.9882812500,18,-5.1092460833,-7.0302624873,-9.7065093246,-8.0560090369,,, +18.9902343750,18,-1.9393573666,-4.1783258398,-6.7874224047,-5.1776337335,,, +18.9921875000,18,1.5399830106,-1.1961503001,-3.3575990908,-2.1762168159,,, +18.9941406250,18,5.1198232163,1.7730373120,0.3769289300,0.8020683870,,, +18.9960937500,18,8.5747877791,4.5958534956,4.1800521933,3.6214639190,,, +18.9980468750,18,11.6808208932,7.1504336407,7.8027185868,6.1595697151,,, +19.0000000000,19,13.1151946201,8.9223205211,12.3475883069,8.4865214832,33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538,19.0000000000:1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000:10.0000000000:11.0000000000:12.0000000000:13.0000000000:14.0000000000:15.0000000000:19.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +19.0019531250,19,15.3386591850,10.6829583733,14.4419482715,10.1739705931,,, +19.0039062500,19,16.7094807128,11.8834945522,15.7336623428,11.3297174864,,, +19.0058593750,19,17.1381687789,12.4744424205,16.1385406680,11.9072981219,,, +19.0078125000,19,16.6014897181,12.4377359752,15.6347062571,11.8894192492,,, +19.0097656250,19,15.1375767358,11.7867117474,14.2580062470,11.2881133384,,, +19.0117187500,19,12.8364899256,10.5633894773,12.0931432129,10.1423469555,,, +19.0136718750,19,9.8365766307,8.8398645467,9.2702686843,8.5195493250,,, +19.0156250000,19,6.3210440573,6.7180777208,5.9617686969,6.5155057046,,, +19.0175781250,19,2.5070858445,4.3222473838,2.3720289821,4.2471535688,,, +19.0195312500,19,-1.3672721774,1.7905097277,-1.2749450018,1.8446635811,,, +19.0214843750,19,-5.0567032682,-0.7330403349,-4.7482614853,-0.5560656406,,, +19.0234375000,19,-8.3263851897,-3.1103285744,-7.8269046001,-2.8247943655,,, +19.0253906250,19,-10.9714336461,-5.2203076412,-10.3180207826,-4.8472955218,,, +19.0273437500,19,-12.8346153378,-6.9647763738,-12.0735707014,-6.5305694870,,, +19.0292968750,19,-13.8198045117,-8.2715871747,-13.0029761685,-7.8055903825,,, +19.0312500000,19,-13.8959280083,-9.0943862599,-13.0768243312,-8.6269092424,,, +19.0332031250,19,-13.0935188852,-9.4100387532,-12.3236274576,-8.9701986308,,, +19.0351562500,19,-11.5008049577,-9.2194968317,-10.8261667394,-8.8332731368,,, +19.0371093750,19,-9.2573452599,-8.5502263030,-8.7155452499,-8.2387635888,,, +19.0390625000,19,-6.5400571496,-7.4540518465,-6.1580807197,-7.2324660046,,, +19.0410156250,19,-3.5459157830,-6.0015265278,-3.3390571141,-5.8783184919,,, +19.0429687500,19,-0.4785566216,-4.2769987280,-0.4501329493,-4.2539298451,,, +19.0449218750,19,2.4627001492,-2.3734000217,2.3209889354,-2.4457315951,,, +19.0468750000,19,5.0949576085,-0.3850672187,4.8019690954,-0.5421915827,,, +19.0488281250,19,7.2617540616,1.5975823297,6.8452716218,1.3711958094,,, +19.0507812500,19,8.8398109133,3.4903356230,8.3345385252,3.2139973520,,, +19.0527343750,19,9.7471986259,5.2192874991,9.1923061268,4.9147061482,,, +19.0546875000,19,9.9504643287,6.7248857613,9.3867387258,6.4145761862,,, +19.0566406250,19,9.4641930921,7.9604513136,8.9312259628,7.6661699853,,, +19.0585937500,19,8.3473437270,8.8906620152,7.8809432325,8.6319732066,,, +19.0605468750,19,6.7019911746,9.4953958126,6.3316891047,9.2882945901,,, +19.0625000000,19,4.6687977468,9.7715332111,4.4156489716,9.6272401566,,, +19.0644531250,19,2.4134034371,9.7273516735,2.2886087235,9.6515827190,,, +19.0664062500,19,0.1070105906,9.3753647242,0.1117025725,9.3682651770,,, +19.0683593750,19,-2.0924388799,8.7280671313,-1.9662827995,8.7847845359,,, +19.0703125000,19,-4.0542771546,7.7959537647,-3.8220837031,7.9076837424,,, +19.0722656250,19,-5.6817277786,6.5904386240,-5.3641832356,6.7456854165,,, +19.0742187500,19,-6.9107170484,5.1330518014,-6.5317071041,5.3188197528,,, +19.0761718750,19,-7.7055168359,3.4634303389,-7.2903683183,3.6662119306,,, +19.0781250000,19,-8.0574754863,1.6389679886,-7.6313459109,1.8456124080,,, +19.0800781250,19,-7.9867775355,-0.2719204418,-7.5730221401,-0.0733579626,,, +19.0820312500,19,-7.5424103931,-2.1976737743,-7.1610140178,-2.0171385407,,, +19.0839843750,19,-6.7966275142,-4.0684286742,-6.4629912940,-3.9132759824,,, +19.0859375000,19,-5.8334891826,-5.8162759852,-5.5578959186,-5.6910566716,,, +19.0878906250,19,-4.7379418759,-7.3763321472,-4.5256522204,-7.2829180475,,, +19.0898437500,19,-3.5910294448,-8.6921271188,-3.4426293224,-8.6299500846,,, +19.0917968750,19,-2.4659566666,-9.7186449680,-2.3779036634,-9.6850234928,,, +19.0937500000,19,-1.4223949948,-10.4203284812,-1.3878760765,-10.4109570631,,, +19.0957031250,19,-0.5041657891,-10.7706526412,-0.5140633097,-10.7801370176,,, +19.0976562500,19,0.2627447033,-10.7537140975,0.2187872784,-10.7761503421,,, +19.0996093750,19,0.8765549356,-10.3621541762,0.8086802909,-10.3919320700,,, +19.1015625000,19,1.3624238752,-9.5943145512,1.2789405513,-9.6270222723,,, +19.1035156250,19,1.7649465628,-8.4575576361,1.6711807036,-8.4906047162,,, +19.1054687500,19,2.1363726475,-6.9747209822,2.0342597399,-7.0075177021,,, +19.1074218750,19,2.5267770123,-5.1872905855,2.4150603257,-5.2210724502,,, +19.1093750000,19,2.9753416136,-3.1568120732,2.8502789320,-3.1941841086,,, +19.1113281250,19,3.5020318929,-0.9660842923,3.3585512955,-1.0103374098,,, +19.1132812500,19,4.1035398699,1.2844452078,3.9365671521,1.2300709781,,, +19.1152343750,19,4.7554425586,3.4849599804,4.5610414738,3.4178636430,,, +19.1171875000,19,5.4171618647,5.5231680529,5.1933562641,5.4417753091,,, +19.1191406250,19,6.0370607133,7.2895105806,5.7843580645,7.1934892062,,, +19.1210937500,19,6.5562727229,8.6828115660,6.2779781829,8.5731710796,,, +19.1230468750,19,6.9100876895,9.6146974889,6.6125814025,9.4938861035,,, +19.1250000000,19,7.0317889125,10.0158108900,6.7246694469,9.8877787029,,, +19.1269531250,19,6.8629892807,9.8470125984,6.5587292824,9.7170529380,,, +19.1289062500,19,6.3625692035,9.1069517909,6.0757552994,8.9813607146,,, +19.1308593750,19,5.5082272325,7.8301269611,5.2547881883,7.7159024801,,, +19.1328125000,19,4.2978727662,6.0831069366,4.0942643299,5.9876512667,,, +19.1347656250,19,2.7560951925,3.9632431711,2.6180928276,3.8938441200,,, +19.1367187500,19,0.9403742123,1.5954160137,0.8814528479,1.5584792603,,, +19.1386718750,19,-1.0590488125,-0.8747881674,-1.0293856178,-0.8745558363,,, +19.1406250000,19,-3.1259961637,-3.2905067164,-3.0035548871,-3.2507535775,,, +19.1425781250,19,-5.1285529120,-5.4964598466,-4.9152919278,-5.4176068777,,, +19.1445312500,19,-6.9302070995,-7.3520920151,-6.6345586656,-7.2375163006,,, +19.1464843750,19,-8.4028546356,-8.7401086999,-8.0393896218,-8.5960084306,,, +19.1484375000,19,-9.4411193611,-9.5734307560,-9.0293826438,-9.4082279331,,, +19.1503906250,19,-9.9715628504,-9.8021372789,-9.5343192318,-9.6255184914,,, +19.1523437500,19,-9.9526692364,-9.4131706407,-9.5141805793,-9.2351621921,,, +19.1542968750,19,-9.3722608113,-8.4243359433,-8.9569081158,-8.2546823187,,, +19.1562500000,19,-8.2503419612,-6.8830430185,-7.8813366812,-6.7307739572,,, +19.1582031250,19,-6.6442548221,-4.8681836198,-6.3421926033,-4.7411690481,,, +19.1601562500,19,-4.6483609168,-2.4870846727,-4.4297973985,-2.3916079114,,, +19.1621093750,19,-2.3866787382,0.1315350503,-2.2630746391,0.1910234574,,, +19.1640625000,19,-0.0023034461,2.8445174345,0.0205622799,2.8654588659,,, +19.1660156250,19,2.3519575491,5.5009548145,2.2743050840,5.4827331066,,, +19.1679687500,19,4.5209229726,7.9496746188,4.3491600762,7.8937463557,,, +19.1699218750,19,6.3562802955,10.0481075728,6.1028910054,9.9580840360,,, +19.1718750000,19,7.7304037442,11.6730817967,7.4132524423,11.5545932980,,, +19.1738281250,19,8.5506075964,12.7308880106,8.1916153700,12.5911983107,,, +19.1757812500,19,8.7684323090,13.1623492173,8.3918252810,13.0097882629,,, +19.1777343750,19,8.3841395880,12.9440085314,8.0144249836,12.7872479076,,, +19.1796875000,19,7.4476543690,12.0879323087,7.1074298871,11.9351086893,,, +19.1816406250,19,6.0540462760,10.6388364974,5.7619309002,10.4966692267,,, +19.1835937500,19,4.3323556160,8.6685525259,4.1014714103,8.5417181438,,, +19.1855468750,19,2.4305776695,6.2709024598,2.2678155990,6.1617993503,,, +19.1875000000,19,0.5010729735,3.5578579508,0.4070748853,3.4666993098,,, +19.1894531250,19,-1.3117634486,0.6545307378,-1.3420228109,0.5797120255,,, +19.1914062500,19,-2.8826772034,-2.3070660284,-2.8587416467,-2.3683236060,,, +19.1933593750,19,-4.1172842318,-5.1937433110,-4.0515471627,-5.2445413055,,, +19.1953125000,19,-4.9610652637,-7.8771310699,-4.8668643739,-7.9200575116,,, +19.1972656250,19,-5.3989064742,-10.2391429581,-5.2889608949,-10.2757866792,,, +19.1992187500,19,-5.4459347539,-12.1744549086,-5.3315326184,-12.2054465467,,, +19.2011718750,19,-5.1381090361,-13.5930410589,-5.0288795931,-13.6184329582,,, +19.2031250000,19,-4.5272388966,-14.4278564094,-4.4310518346,-14.4474761349,,, +19.2050781250,19,-3.6764008557,-14.6435294516,-3.5992397999,-14.6571521907,,, +19.2070312500,19,-2.6523313946,-14.2376757305,-2.5983331080,-14.2451391718,,, +19.2089843750,19,-1.5189721917,-13.2369658128,-1.4906480092,-13.2382880509,,, +19.2109375000,19,-0.3363214002,-11.6952156257,-0.3347111129,-11.6906074501,,, +19.2128906250,19,0.8373000722,-9.6929765904,0.8126858093,-9.6826961971,,, +19.2148437500,19,1.9437119721,-7.3348119406,1.8950827135,-7.3189267093,,, +19.2167968750,19,2.9269133866,-4.7432852833,2.8582860841,-4.7214910833,,, +19.2187500000,19,3.7396431137,-2.0489720030,3.6565088539,-2.0206779865,,, +19.2207031250,19,4.3506861300,0.6205705828,4.2591972863,0.6558496708,,, +19.2226562500,19,4.7456920462,3.1459883602,4.6517858267,3.1881898831,,, +19.2246093750,19,4.9208108015,5.4167480131,4.8298160554,5.4651462200,,, +19.2265625000,19,4.8764898672,7.3349405505,4.7934096522,7.3885701745,,, +19.2285156250,19,4.6168441393,8.8219127492,4.5469805646,8.8803393047,,, +19.2304687500,19,4.1534515523,9.8228612352,4.1028248392,9.8868413584,,, +19.2324218750,19,3.5077841901,10.3101625622,3.4831804527,10.3819730757,,, +19.2343750000,19,2.7079653255,10.2861760294,2.7168620675,10.3697071339,,, +19.2363281250,19,1.7842422949,9.7832420012,1.8346191950,9.8838261330,,, +19.2382812500,19,0.7705385741,8.8628640531,0.8701405948,8.9865588613,,, +19.2402343750,19,-0.2887302743,7.6162788020,-0.1339491709,7.7684703617,,, +19.2421875000,19,-1.3349639629,6.1597795411,-1.1227378319,6.3435349050,,, +19.2441406250,19,-2.3018520009,4.6197946370,-2.0348055928,4.8347847105,,, +19.2460937500,19,-3.1284866094,3.1160548983,-2.8141399863,3.3583913529,,, +19.2480468750,19,-3.7690449573,1.7509192987,-3.4190753029,2.0135098922,,, +19.2500000000,19,-4.1964666259,0.6033562146,-3.8256757640,0.8764717741,,, +19.2519531250,19,-4.4037264471,-0.2729247794,-4.0287534223,-0.0008439661,,, +19.2539062500,19,-4.4025350674,-0.8472751241,-4.0404827076,-0.5886813920,,, +19.2558593750,19,-4.2183859443,-1.1107060226,-3.8856188147,-0.8780411843,,, +19.2578125000,19,-3.8852397369,-1.0771065826,-3.5964126279,-0.8819846449,,, +19.2597656250,19,-3.4429173551,-0.7840617386,-3.2102461696,-0.6366351129,,, +19.2617187500,19,-2.9362023336,-0.2912780700,-2.7689524759,-0.1998153822,,, +19.2636718750,19,-2.4127991617,0.3245956923,-2.3168903898,0.3540626751,,, +19.2656250000,19,-1.9194179755,0.9787979820,-1.8970877125,0.9428767182,,, +19.2675781250,19,-1.4989170350,1.5869543601,-1.5483206223,1.4854435254,,, +19.2695312500,19,-1.1891166851,2.0700124251,-1.3038049547,1.9066200995,,, +19.2714843750,19,-1.0188896213,2.3585202835,-1.1875853544,2.1413741640,,, +19.2734375000,19,-1.0013176241,2.3982909410,-1.2086190022,2.1396460672,,, +19.2753906250,19,-1.1303603246,2.1536437255,-1.3584819101,1.8685605857,,, +19.2773437500,19,-1.3832425800,1.6075874236,-1.6143456052,1.3118943446,,, +19.2792968750,19,-1.7244160518,0.7630465474,-1.9430279441,0.4710819249,,, +19.2812500000,19,-2.1094325588,-0.3556091935,-2.3045527020,-0.6330329396,,, +19.2832031250,19,-2.4897142097,-1.7042280856,-2.6561595692,-1.9611776067,,, +19.2851562500,19,-2.8175783661,-3.2215897459,-2.9562103167,-3.4572971410,,, +19.2871093750,19,-3.0503256013,-4.8298659871,-3.1671357129,-5.0478967420,,, +19.2890625000,19,-3.1523119141,-6.4353653536,-3.2566755116,-6.6419416987,,, +19.2910156250,19,-3.0946618305,-7.9324517418,-3.1972944423,-8.1344394850,,, +19.2929687500,19,-2.8542842724,-9.2093733576,-2.9655589239,-9.4126265464,,, +19.2949218750,19,-2.4148717964,-10.1569110351,-2.5437753130,-10.3653372923,,, +19.2968750000,19,-1.7703424319,-10.6817791563,-1.9237359281,-10.8968338271,,, +19.2988281250,19,-0.9272002826,-10.7188717294,-1.1092165562,-10.9392668703,,, +19.3007812500,19,0.0960653521,-10.2354752527,-0.1157551256,-10.4572822832,,, +19.3027343750,19,1.2691945983,-9.2310028961,1.0293259709,-9.4480084391,,, +19.3046875000,19,2.5475299824,-7.7396272262,2.2845914263,-7.9434444720,,, +19.3066406250,19,3.8691741912,-5.8348058932,3.5920515178,-6.0146358311,,, +19.3085937500,19,5.1572958386,-3.6268493425,4.8793208460,-3.7693344500,,, +19.3105468750,19,6.3296994337,-1.2489182641,6.0683516955,-1.3386228777,,, +19.3125000000,19,7.3111099074,1.1620105683,7.0865581637,1.1412217430,,, +19.3144531250,19,8.0418809201,3.4787107017,7.8746789734,3.5416327416,,, +19.3164062500,19,8.4804507134,5.5878247215,8.3890825951,5.7457815086,,, +19.3183593750,19,8.6018387568,7.3893602611,8.6004113866,7.6481882247,,, +19.3203125000,19,8.3968830756,8.7978779891,8.4928587747,9.1559293419,,, +19.3222656250,19,7.8743837215,9.7468436090,8.0665625430,10.1933256788,,, +19.3242187500,19,7.0643091541,10.1945905148,7.3416350520,10.7088986542,,, +19.3261718750,19,6.0169286794,10.1293465447,6.3586668844,10.6818628924,,, +19.3281250000,19,4.7948374568,9.5702468618,5.1724429569,10.1247380241,,, +19.3300781250,19,3.4629574130,8.5644331562,3.8434336899,9.0817682369,,, +19.3320312500,19,2.0827984504,7.1839527252,2.4326953820,7.6263453276,,, +19.3339843750,19,0.7107620734,5.5233488089,0.9998452419,5.8581921541,,, +19.3359375000,19,-0.6020099872,3.6944858487,-0.3978917604,3.8973135201,,, +19.3378906250,19,-1.8085422373,1.8183525977,-1.7054585682,1.8748899843,,, +19.3398437500,19,-2.8635429689,0.0178669516,-2.8683719815,-0.0748061930,,, +19.3417968750,19,-3.7226322296,-1.5893830218,-3.8327402598,-1.8225043479,,, +19.3437500000,19,-4.3460698205,-2.9021124121,-4.5496094389,-3.2556934983,,, +19.3457031250,19,-4.7037977701,-3.8451931103,-4.9806845736,-4.2893677716,,, +19.3476562500,19,-4.7804521170,-4.3736594333,-5.1038426539,-4.8707313513,,, +19.3496093750,19,-4.5823388566,-4.4746988547,-4.9200549117,-4.9813444699,,, +19.3515625000,19,-4.1401353152,-4.1674622810,-4.4562813721,-4.6372277828,,, +19.3535156250,19,-3.5011342290,-3.4962841242,-3.7588458424,-3.8830808214,,, +19.3554687500,19,-2.7186847094,-2.5226432055,-2.8839851149,-2.7851313451,,, +19.3574218750,19,-1.8494140168,-1.3243047074,-1.8950512640,-1.4301725927,,, +19.3593750000,19,-0.9566497389,0.0028912575,-0.8650040251,0.0735563505,,, +19.3613281250,19,-0.1102015951,1.3503591117,0.1248447625,1.6028351552,,, +19.3632812500,19,0.6199304850,2.6073609368,0.9920646777,3.0312705725,,, +19.3652343750,19,1.1703582174,3.6702488201,1.6609897543,4.2399222368,,, +19.3671875000,19,1.4903633710,4.4502038378,2.0699507720,5.1265040966,,, +19.3691406250,19,1.5484031440,4.8799017458,2.1789249386,5.6134943015,,, +19.3710937500,19,1.3376606876,4.9189625510,1.9760439430,5.6547967002,,, +19.3730468750,19,0.8792244340,4.5596944103,1.4811881764,5.2420335816,,, +19.3750000000,19,0.2212043119,3.8300024525,0.7449913237,4.4073069214,,, +19.3769531250,19,-0.5665078846,2.7891454099,-0.1567944066,3.2183670373,,, +19.3789062500,19,-1.3986952994,1.5196438482,-1.1305683143,1.7694404132,,, +19.3808593750,19,-2.1819130387,0.1195490738,-2.0731463545,0.1720117680,,, +19.3828125000,19,-2.8266719850,-1.3070989365,-2.8848259452,-1.4560463077,,, +19.3847656250,19,-3.2639981058,-2.6629313729,-3.4862728426,-3.0039910204,,, +19.3867187500,19,-3.4576733872,-3.8691885686,-3.8309562783,-4.3807291681,,, +19.3886718750,19,-3.4068274461,-4.8727749392,-3.9080960787,-5.5223378052,,, +19.3906250000,19,-3.1403084008,-5.6451909887,-3.7376858661,-6.3915367729,,, +19.3925781250,19,-2.7071342253,-6.1736475682,-3.3620185627,-6.9696842457,,, +19.3945312500,19,-2.1686779339,-6.4532181820,-2.8389732621,-7.2498926941,,, +19.3964843750,19,-1.5949618569,-6.4882299237,-2.2387884191,-7.2388299799,,, +19.3984375000,19,-1.0603186279,-6.2979930727,-1.6394489346,-6.9620206855,,, +19.4003906250,19,-0.6324700599,-5.9169453922,-1.1151058676,-6.4629436861,,, +19.4023437500,19,-0.3584054808,-5.3884922106,-0.7212989356,-5.7957323480,,, +19.4042968750,19,-0.2568943656,-4.7581418897,-0.4869438724,-5.0175127480,,, +19.4062500000,19,-0.3199368676,-4.0680136101,-0.4152244105,-4.1823474297,,, +19.4082031250,19,-0.5187433335,-3.3535127982,-0.4885761181,-3.3370066368,,, +19.4101562500,19,-0.8118296969,-2.6439161740,-0.6751585619,-2.5200290836,,, +19.4121093750,19,-1.1515107943,-1.9619360198,-0.9338757959,-1.7598767045,,, +19.4140625000,19,-1.4854776606,-1.3180096270,-1.2156038158,-1.0688884251,,, +19.4160156250,19,-1.7580298843,-0.7070090726,-1.4649522482,-0.4406019919,,, +19.4179687500,19,-1.9157266207,-0.1126748466,-1.6266029335,0.1448931559,,, +19.4199218750,19,-1.9146820724,0.4856405526,-1.6532539218,0.7132854914,,, +19.4218750000,19,-1.7267068137,1.1061324991,-1.5121733829,1.2885660997,,, +19.4238281250,19,-1.3453350541,1.7561442676,-1.1912115499,1.8844624232,,, +19.4257812500,19,-0.7894717494,2.4271156554,-0.7024594892,2.4992633891,,, +19.4277343750,19,-0.1002587011,3.0966825601,-0.0795822756,3.1175050564,,, +19.4296875000,19,0.6669222221,3.7338567506,0.6297149562,3.7148880080,,, +19.4316406250,19,1.4505111779,4.3046539562,1.3714472652,4.2638205270,,, +19.4335937500,19,2.1903698511,4.7787386473,2.0920232490,4.7392846796,,, +19.4355468750,19,2.8358376871,5.1348932148,2.7447993795,5.1229125804,,, +19.4375000000,19,3.3531282817,5.3641170166,3.2964942047,5.4052378631,,, +19.4394531250,19,3.7301051682,5.4715259726,3.7317731043,5.5875306215,,, +19.4414062500,19,3.9754085249,5.4732583481,4.0525957873,5.6789158102,,, +19.4433593750,19,4.1104412134,5.3854064420,4.2710717529,5.6860067010,,, +19.4453125000,19,4.1592248842,5.2137739138,4.4008307091,5.6040031431,,, +19.4472656250,19,4.1423805542,4.9535115581,4.4524257029,5.4176966441,,, +19.4492187500,19,4.0758530763,4.5961482816,4.4331714677,5.1096804604,,, +19.4511718750,19,3.9724469608,4.1391168164,4.3495575357,4.6708827170,,, +19.4531250000,19,3.8441496362,3.5938109534,4.2098814972,4.1090363021,,, +19.4550781250,19,3.7028594213,2.9858024842,4.0247969416,3.4487227485,,, +19.4570312500,19,3.5587046232,2.3481379481,3.8054778925,2.7244474301,,, +19.4589843750,19,3.4171255012,1.7169246978,3.5605643897,1.9759881356,,, +19.4609375000,19,3.2763587313,1.1290718083,3.2932735957,1.2456534309,,, +19.4628906250,19,3.1258323685,0.6138159912,2.9995589123,0.5694986640,,, +19.4648437500,19,2.9464602132,0.1832567274,2.6683184797,-0.0322303460,,, +19.4667968750,19,2.7145219270,-0.1656003545,2.2844839359,-0.5538004515,,, +19.4687500000,19,2.4058632457,-0.4428280283,1.8323052769,-0.9968437156,,, +19.4707031250,19,1.9962489278,-0.6644685079,1.2960359677,-1.3688758793,,, +19.4726562500,19,1.4616269008,-0.8553883572,0.6607365650,-1.6855582605,,, +19.4746093750,19,0.7834202611,-1.0472951903,-0.0832749013,-1.9694738207,,, +19.4765625000,19,-0.0433469951,-1.2729186307,-0.9339420342,-2.2458559869,,, +19.4785156250,19,-1.0040650257,-1.5608292446,-1.8729926203,-2.5388698828,,, +19.4804687500,19,-2.0631004276,-1.9313443780,-2.8655074436,-2.8685701129,,, +19.4824218750,19,-3.1682337407,-2.3947028769,-3.8642607402,-3.2491003550,,, +19.4843750000,19,-4.2596378411,-2.9524105803,-4.8175721674,-3.6890784992,,, +19.4863281250,19,-5.2782128774,-3.5974394425,-5.6762688799,-4.1905461729,,, +19.4882812500,19,-6.1704440362,-4.3111538091,-6.3969200445,-4.7442660618,,, +19.4902343750,19,-6.8902495281,-5.0603009740,-6.9418621023,-5.3247764695,,, +19.4921875000,19,-7.3974081384,-5.7953342905,-7.2768104949,-5.8877755280,,, +19.4941406250,19,-7.6545015912,-6.4506244117,-7.3684699914,-6.3709685476,,, +19.4960937500,19,-7.6277367449,-6.9506597270,-7.1864346117,-6.7014717114,,, +19.4980468750,19,-7.2936898050,-7.2238260644,-6.7105184465,-6.8104424481,,, +19.5000000000,19,-6.6494054895,-7.2179909705,-5.9406823313,-6.6487885611,,, +19.5019531250,19,-5.7200530695,-6.9093640031,-4.9039094907,-6.1954127541,,, +19.5039062500,19,-4.5572007938,-6.3008131787,-3.6519073848,-5.4548529523,,, +19.5058593750,19,-3.2286451075,-5.4144945628,-2.2511829536,-4.4498733652,,, +19.5078125000,19,-1.8087147509,-4.2882200672,-0.7740625824,-3.2183238465,,, +19.5097656250,19,-0.3734782391,-2.9767215176,0.7053726649,-1.8150584432,,, +19.5117187500,19,1.0017054663,-1.5492381835,2.1128617270,-0.3104029007,,, +19.5136718750,19,2.2443399785,-0.0822141093,3.3753871905,1.2164232057,,, +19.5156250000,19,3.2879782277,1.3456964692,4.4245425621,2.6825963140,,, +19.5175781250,19,4.0789001480,2.6571764118,5.2037221107,4.0059938985,,, +19.5195312500,19,4.5852419150,3.7843411666,5.6771550842,5.1134629554,,, +19.5214843750,19,4.8015193003,4.6777278087,5.8345866256,5.9501233806,,, +19.5234375000,19,4.7431758164,5.3075023627,5.6869753353,6.4816694448,,, +19.5253906250,19,4.4370424909,5.6589662252,5.2580344726,6.6907701016,,, +19.5273437500,19,3.9167191909,5.7313280182,4.5801240292,6.5762612617,,, +19.5292968750,19,3.2217648386,5.5396779154,3.6941906641,6.1559167857,,, +19.5312500000,19,2.3962399766,5.1145858128,2.6491109992,5.4668772015,,, +19.5332031250,19,1.4877221775,4.4989322682,1.5005142815,4.5622387141,,, +19.5351562500,19,0.5483093611,3.7433024105,0.3107133850,3.5053025490,,, +19.5371093750,19,-0.3638310682,2.9014057775,-0.8509055631,2.3637706557,,, +19.5390625000,19,-1.1846659496,2.0284025727,-1.9092398584,1.2068070448,,, +19.5410156250,19,-1.8513673515,1.1783357485,-2.7915998603,0.1011058117,,, +19.5429687500,19,-2.3179719496,0.3950882588,-3.4437433147,-0.8990296763,,, +19.5449218750,19,-2.5662050458,-0.2934318785,-3.8406410780,-1.7577617375,,, +19.5468750000,19,-2.5996785306,-0.8676683182,-3.9810989707,-2.4503768894,,, +19.5488281250,19,-2.4331104774,-1.3075191423,-3.8776472573,-2.9547913179,,, +19.5507812500,19,-2.0908145433,-1.5946369580,-3.5549769754,-3.2537516607,,, +19.5527343750,19,-1.6089887223,-1.7184825513,-3.0513818313,-3.3400404534,,, +19.5546875000,19,-1.0332156302,-1.6790277485,-2.4154436087,-3.2182217678,,, +19.5566406250,19,-0.4124867006,-1.4882610484,-1.7000510005,-2.9059696304,,, +19.5585937500,19,0.2087854996,-1.1683233354,-0.9552259078,-2.4328567811,,, +19.5605468750,19,0.7999745123,-0.7442532879,-0.2196369464,-1.8336084033,,, +19.5625000000,19,1.3486752019,-0.2398769851,0.4842516655,-1.1434045801,,, +19.5644531250,19,1.8574002221,0.3185364964,1.1482792035,-0.4001098358,,, +19.5664062500,19,2.3383196796,0.9001923628,1.7744681477,0.3547296260,,, +19.5683593750,19,2.8093987455,1.4742446651,2.3717135768,1.0808559261,,, +19.5703125000,19,3.2880310689,2.0137959307,2.9504056628,1.7441986816,,, +19.5722656250,19,3.7821857660,2.4957792039,3.5150150082,2.3180685879,,, +19.5742187500,19,4.2852541332,2.9002046573,4.0594695251,2.7828325487,,, +19.5761718750,19,4.7760945343,3.2106268234,4.5664573194,3.1255755839,,, +19.5781250000,19,5.2196935391,3.4142746665,5.0069074817,3.3389650222,,, +19.5800781250,19,5.5680093371,3.5013180589,5.3396772147,3.4192810289,,, +19.5820312500,19,5.7660466341,3.4651318756,5.5166159969,3.3657561356,,, +19.5839843750,19,5.7619462697,3.3028410277,5.4920528866,3.1807568797,,, +19.5859375000,19,5.5142151075,3.0141160253,5.2297921675,2.8685307926,,, +19.5878906250,19,4.9954450070,2.5999188651,4.7068813355,2.4341103736,,, +19.5898437500,19,4.1954188630,2.0627520299,3.9173309512,1.8843204171,,, +19.5917968750,19,3.1232956940,1.4082852122,2.8753212398,1.2305831605,,, +19.5937500000,19,1.8069829108,0.6476153389,1.6154248191,0.4920903402,,, +19.5957031250,19,0.2909478883,-0.2016297164,0.1906981942,-0.3028497134,,, +19.5976562500,19,-1.3633249089,-1.1141489575,-1.3278361658,-1.1167179340,,, +19.5996093750,19,-3.0772316609,-2.0546185869,-2.8536716526,-1.9032448249,,, +19.6015625000,19,-4.7626516168,-2.9794540963,-4.2953647277,-2.6126050125,,, +19.6035156250,19,-6.3331571145,-3.8454150637,-5.5693612133,-3.2021226388,,, +19.6054687500,19,-7.7085720317,-4.6161257705,-6.6047201649,-3.6431158326,,, +19.6074218750,19,-8.8142065040,-5.2594553932,-7.3420289915,-3.9179018493,,, +19.6093750000,19,-9.5839541233,-5.7428600673,-7.7358041905,-4.0144601115,,, +19.6113281250,19,-9.9684231092,-6.0347780557,-7.7609383904,-3.9262272924,,, +19.6132812500,19,-9.9428615052,-6.1105595707,-7.4181625244,-3.6555803316,,, +19.6152343750,19,-9.5106270576,-5.9584029186,-6.7351788380,-3.2173352876,,, +19.6171875000,19,-8.6992907589,-5.5811669588,-5.7612492632,-2.6387990752,,, +19.6191406250,19,-7.5523883552,-4.9924164264,-4.5582817884,-1.9548448968,,, +19.6210937500,19,-6.1246771611,-4.2122708378,-3.1954816841,-1.2029564154,,, +19.6230468750,19,-4.4829019002,-3.2692386885,-1.7487456549,-0.4235919255,,, +19.6250000000,19,-2.7059865683,-2.2040187170,-0.2987532694,0.3382911596,,, +19.6269531250,19,-0.8809592439,-1.0685629231,1.0753582341,1.0367446984,,, +19.6289062500,19,0.9013053446,0.0774352606,2.3018818316,1.6302480234,,, +19.6308593750,19,2.5492843483,1.1707965252,3.3194394689,2.0857369062,,, +19.6328125000,19,3.9772372360,2.1524391420,4.0804804018,2.3831902592,,, +19.6347656250,19,5.1131753181,2.9744512327,4.5550307414,2.5183446743,,, +19.6367187500,19,5.9048926373,3.6034998487,4.7326822778,2.5018764705,,, +19.6386718750,19,6.3263705322,4.0250280228,4.6250584034,2.3594965549,,, +19.6406250000,19,6.3811904440,4.2455351953,4.2657930385,2.1305892247,,, +19.6425781250,19,6.0970637549,4.2861604198,3.7033051450,1.8597112711,,, +19.6445312500,19,5.5191371921,4.1738246993,2.9936158035,1.5869910189,,, +19.6464843750,19,4.7091283321,3.9382115865,2.1991113503,1.3446708026,,, +19.6484375000,19,3.7426180594,3.6101150283,1.3858241116,1.1553602283,,, +19.6503906250,19,2.7001080719,3.2165843399,0.6154299689,1.0279395558,,, +19.6523437500,19,1.6586788717,2.7780824547,-0.0615695065,0.9561350147,,, +19.6542968750,19,0.6884161148,2.3106301539,-0.6077523550,0.9223847581,,, +19.6562500000,19,-0.1493228177,1.8272642591,-0.9983237045,0.9016344296,,, +19.6582031250,19,-0.8042364773,1.3367581002,-1.2204745417,0.8632257290,,, +19.6601562500,19,-1.2392455159,0.8446267646,-1.2724288692,0.7752433780,,, +19.6621093750,19,-1.4335502354,0.3551902639,-1.1637863457,0.6094568079,,, +19.6640625000,19,-1.3866109701,-0.1295599376,-0.9173478986,0.3424212181,,, +19.6660156250,19,-1.1190743415,-0.6096818557,-0.5686644500,-0.0427660032,,, +19.6679687500,19,-0.6717428818,-1.0839427844,-0.1642214073,-0.5522307049,,, +19.6699218750,19,-0.1049222716,-1.5496332839,0.2399819272,-1.1802784585,,, +19.6718750000,19,0.5061550452,-2.0040027319,0.5835074629,-1.9101587248,,, +19.6738281250,19,1.0803324782,-2.4416291652,0.8093919901,-2.7123595340,,, +19.6757812500,19,1.5388742091,-2.8512075952,0.8697248288,-3.5441681326,,, +19.6777343750,19,1.8126021291,-3.2163388698,0.7300136763,-4.3532806882,,, +19.6796875000,19,1.8503469038,-3.5172726359,0.3750818167,-5.0820950228,,, +19.6816406250,19,1.6270010634,-3.7316022707,-0.1861733699,-5.6717723805,,, +19.6835937500,19,1.1478625864,-3.8356735653,-0.9195627448,-6.0669364251,,, +19.6855468750,19,0.4499980606,-3.8055025855,-1.7660710254,-6.2185506382,,, +19.6875000000,19,-0.4003846630,-3.6178507593,-2.6456579266,-6.0863520956,,, +19.6894531250,19,-1.3185489289,-3.2556772484,-3.4686487405,-5.6454675198,,, +19.6914062500,19,-2.2158175442,-2.7142951783,-4.1499511368,-4.8925934996,,, +19.6933593750,19,-3.0080972970,-1.9998729426,-4.6166925990,-3.8437684498,,, +19.6953125000,19,-3.6170422134,-1.1236028301,-4.8092472380,-2.5284108484,,, +19.6972656250,19,-3.9724169037,-0.1030354408,-4.6830799178,-0.9901576539,,, +19.6992187500,19,-4.0181485293,1.0309544583,-4.2124094791,0.7085857638,,, +19.7011718750,19,-3.7156357493,2.2336016468,-3.3904758865,2.4893011758,,, +19.7031250000,19,-3.0451248456,3.4511457179,-2.2286118038,4.2647396674,,, +19.7050781250,19,-2.0114065841,4.6230835147,-0.7599830307,5.9431532672,,, +19.7070312500,19,-0.6507863222,5.6847219906,0.9555806940,7.4329919412,,, +19.7089843750,19,0.9674236580,6.5734660844,2.8323493369,8.6516275214,,, +19.7109375000,19,2.7456976288,7.2355035053,4.7652457530,9.5341118598,,, +19.7128906250,19,4.5671828069,7.6324993733,6.6391428893,10.0405893954,,, +19.7148437500,19,6.3055775572,7.7473666871,8.3376197243,10.1611392827,,, +19.7167968750,19,7.8344021252,7.5844674490,9.7501048728,9.9139201046,,, +19.7187500000,19,9.0375039522,7.1653992194,10.7798571614,9.3384884360,,, +19.7207031250,19,9.8203735339,6.5251545257,11.3527168771,8.4894694916,,, +19.7226562500,19,10.1175138807,5.7072801773,11.4225513305,7.4298117511,,, +19.7246093750,19,9.8934561115,4.7555563469,10.9716482935,6.2217920402,,, +19.7265625000,19,9.1415301753,3.7073124342,10.0093920390,4.9201734447,,, +19.7285156250,19,7.8847459838,2.5929823328,8.5726899412,3.5712863961,,, +19.7304687500,19,6.1782012999,1.4395028571,6.7278226170,2.2158938679,,, +19.7324218750,19,4.1112090991,0.2755044364,4.5717726985,0.8935835673,,, +19.7343750000,19,1.8052347505,-0.8652342968,2.2288071145,-0.3553044818,,, +19.7363281250,19,-0.5968195969,-1.9476432691,-0.1615197441,-1.4952438491,,, +19.7382812500,19,-2.9462118601,-2.9422760786,-2.4603738322,-2.5033419152,,, +19.7402343750,19,-5.1025184416,-3.8279586050,-4.5430270038,-3.3715498685,,, +19.7421875000,19,-6.9457997518,-4.5926366343,-6.3090246817,-4.1056744690,,, +19.7441406250,19,-8.3858119190,-5.2340781793,-7.6882710401,-4.7229301845,,, +19.7460937500,19,-9.3660619693,-5.7572661173,-8.6415476137,-5.2455803626,,, +19.7480468750,19,-9.8651012481,-6.1709283763,-9.1589035549,-5.6943265133,,, +19.7500000000,19,-9.8983764742,-6.4864565378,-9.2597124200,-6.0853173647,,, +19.7519531250,19,-9.5176947763,-6.7162341844,-8.9916736143,-6.4279501386,,, +19.7539062500,19,-8.8038720763,-6.8700278824,-8.4243105495,-6.7219705934,,, +19.7558593750,19,-7.8552899728,-6.9529362651,-7.6396440685,-6.9574031745,,, +19.7578125000,19,-6.7760569815,-6.9655086425,-6.7242526969,-7.1185903433,,, +19.7597656250,19,-5.6638871872,-6.9041377585,-5.7619411406,-7.1894711518,,, +19.7617187500,19,-4.6011411059,-6.7629568058,-4.8274351754,-7.1581285114,,, +19.7636718750,19,-3.6526867760,-6.5368550643,-3.9836171127,-7.0190728487,,, +19.7656250000,19,-2.8678009126,-6.2229821051,-3.2816743645,-6.7728937025,,, +19.7675781250,19,-2.2819079395,-5.8232088728,-2.7614686419,-6.4272839262,,, +19.7695312500,19,-1.9164746952,-5.3485130443,-2.4498898205,-5.9997562648,,, +19.7714843750,19,-1.7760517812,-4.8180898101,-2.3561039593,-5.5147148345,,, +19.7734375000,19,-1.8445631446,-4.2513992185,-2.4669623619,-4.9944160411,,, +19.7753906250,19,-2.0859636059,-3.6619424054,-2.7483445826,-4.4534923580,,, +19.7773437500,19,-2.4488997779,-3.0561087222,-3.1513918656,-3.8996406969,,, +19.7792968750,19,-2.8698823273,-2.4320896411,-3.6169647807,-3.3340230018,,, +19.7812500000,19,-3.2750754293,-1.7800357142,-4.0771567733,-2.7511726271,,, +19.7832031250,19,-3.5852746235,-1.0880540426,-4.4580407479,-2.1427155698,,, +19.7851562500,19,-3.7238730955,-0.3485458091,-4.6851042103,-1.5011888384,,, +19.7871093750,19,-3.6265287598,0.4401769521,-4.6914812198,-0.8203655369,,, +19.7890625000,19,-3.2528839370,1.2717582726,-4.4289521570,-0.0969343140,,, +19.7910156250,19,-2.5933734555,2.1303248409,-3.8749586193,0.6676090346,,, +19.7929687500,19,-1.6638363472,2.9971785357,-3.0290669380,1.4718061852,,, +19.7949218750,19,-0.4959063769,3.8589187969,-1.9060145958,2.3197555465,,, +19.7968750000,19,0.8645735171,4.7046980176,-0.5362826994,3.2160505290,,, +19.7988281250,19,2.3541229298,5.5175752218,1.0286188527,4.1549865057,,, +19.8007812500,19,3.8943451609,6.2722574542,2.7163905883,5.1156641725,,, +19.8027343750,19,5.4012460869,6.9374905620,4.4408889355,6.0620578930,,, +19.8046875000,19,6.7929816558,7.4762400689,6.1095472898,6.9430553385,,, +19.8066406250,19,7.9932973582,7.8461441262,7.6286098506,7.6949632362,,, +19.8085937500,19,8.9347009072,8.0031487881,8.9087796865,8.2479409339,,, +19.8105468750,19,9.5646185873,7.9071416278,9.8739975523,8.5346818080,,, +19.8125000000,19,9.8527251590,7.5313034045,10.4710955532,8.5025316519,,, +19.8144531250,19,9.7944509382,6.8737805860,10.6744884009,8.1265873967,,, +19.8164062500,19,9.4090575081,5.9640497510,10.4849186269,7.4167595142,,, +19.8183593750,19,8.7371205073,4.8630123775,9.9282097191,6.4191834725,,, +19.8203125000,19,7.8401907385,3.6608762481,9.0561757169,5.2154469409,,, +19.8222656250,19,6.7970528791,2.4686154211,7.9435236845,3.9146208450,,, +19.8242187500,19,5.6923720950,1.3986734228,6.6777102856,2.6349050617,,, +19.8261718750,19,4.6030847075,0.5441462479,5.3470662999,1.4842574209,,, +19.8281250000,19,3.5904276941,-0.0318371218,4.0329916110,0.5496989489,,, +19.8300781250,19,2.6992697672,-0.2969377987,2.8075620943,-0.1054113346,,, +19.8320312500,19,1.9613173829,-0.2465042618,1.7343711747,-0.4407540557,,, +19.8339843750,19,1.3981838887,0.1002489974,0.8685410203,-0.4384661052,,, +19.8359375000,19,1.0213851897,0.7022874339,0.2528090815,-0.1053514825,,, +19.8378906250,19,0.8302512503,1.4969856797,-0.0883894109,0.5231150410,,, +19.8398437500,19,0.8114754264,2.4023622054,-0.1522206444,1.3819108652,,, +19.8417968750,19,0.9397259325,3.3224709880,0.0419848953,2.3806112962,,, +19.8437500000,19,1.1768324886,4.1531215110,0.4525306559,3.4097733413,,, +19.8457031250,19,1.4715178323,4.7881045052,1.0165203184,4.3487400007,,, +19.8476562500,19,1.7615182004,5.1280938485,1.6533982083,5.0761796922,,, +19.8496093750,19,1.9767890033,5.0906833790,2.2696135794,5.4818368300,,, +19.8515625000,19,2.0441813996,4.6200918021,2.7649200158,5.4781692242,,, +19.8535156250,19,1.8956717866,3.6974401830,3.0420645364,5.0124800060,,, +19.8554687500,19,1.4799881850,2.3492392541,3.0198170972,4.0772851327,,, +19.8574218750,19,0.7741384466,0.6487284999,2.6463643991,2.7140095999,,, +19.8593750000,19,-0.2104310757,-1.2913213225,1.9076357940,1.0082985963,,, +19.8613281250,19,-1.4291913629,-3.3316308389,0.8281924848,-0.9206388385,,, +19.8632812500,19,-2.8103893285,-5.3227547732,-0.5322151015,-2.9339555013,,, +19.8652343750,19,-4.2627914024,-7.1197401026,-2.0844156978,-4.8859341912,,, +19.8671875000,19,-5.6858454133,-8.5914753337,-3.7195226221,-6.6331514839,,, +19.8691406250,19,-6.9822790739,-9.6309319989,-5.3228057180,-8.0464903246,,, +19.8710937500,19,-8.0704196443,-10.1691505371,-6.7882751138,-9.0279827991,,, +19.8730468750,19,-8.8919147094,-10.1824385857,-8.0293850198,-9.5214994969,,, +19.8750000000,19,-9.4131843869,-9.6887419913,-8.9842734966,-9.5132790099,,, +19.8769531250,19,-9.6250604122,-8.7442437249,-9.6188082731,-9.0322208916,,, +19.8789062500,19,-9.5446992103,-7.4438384085,-9.9303615981,-8.1524452620,,, +19.8808593750,19,-9.2163672030,-5.9157458338,-9.9495856941,-6.9889891692,,, +19.8828125000,19,-8.7061776573,-4.3080860292,-9.7356189323,-5.6847020349,,, +19.8847656250,19,-8.0905092436,-2.7737578849,-9.3636323715,-4.3938022807,,, +19.8867187500,19,-7.4408692712,-1.4539280198,-8.9078120598,-3.2628413174,,, +19.8886718750,19,-6.8115320982,-0.4619604543,-8.4269272276,-2.4119793725,,, +19.8906250000,19,-6.2363609049,0.1241364489,-7.9587503874,-1.9246988178,,, +19.8925781250,19,-5.7316939633,0.2625841066,-7.5206960342,-1.8445542627,,, +19.8945312500,19,-5.2982514723,-0.0505140040,-7.1110230073,-2.1727976528,,, +19.8964843750,19,-4.9238268220,-0.7812534021,-6.7129139546,-2.8700465480,,, +19.8984375000,19,-4.5904138184,-1.8617909043,-6.3041137979,-3.8630934054,,, +19.9003906250,19,-4.2807188392,-3.1935603166,-5.8656875247,-5.0507594262,,, +19.9023437500,19,-3.9781611122,-4.6514424850,-5.3834432439,-6.3096305318,,, +19.9042968750,19,-3.6627752319,-6.0930156028,-4.8443063213,-7.5037425664,,, +19.9062500000,19,-3.3085340207,-7.3696923322,-4.2335950627,-8.4956335879,,, +19.9082031250,19,-2.8838473045,-8.3372654475,-3.5356617654,-9.1570964647,,, +19.9101562500,19,-2.3542316925,-8.8681872226,-2.7360484309,-9.3810153420,,, +19.9121093750,19,-1.6863523102,-8.8643839309,-1.8233985380,-9.0920146493,,, +19.9140625000,19,-0.8527521863,-8.2665034245,-0.7911869105,-8.2525989508,,, +19.9160156250,19,0.1644831769,-7.0591757971,0.3615893837,-6.8652905834,,, +19.9179687500,19,1.3729612697,-5.2728386193,1.6320327911,-4.9718806976,,, +19.9199218750,19,2.7706848067,-2.9814424703,3.0154100731,-2.6496219737,,, +19.9218750000,19,4.3431747038,-0.2988347312,4.5026678256,-0.0072504507,,, +19.9238281250,19,6.0570590160,2.6250263245,6.0733243518,2.8178782288,,, +19.9257812500,19,7.8567696927,5.6134940213,7.6904909642,5.6673278365,,, +19.9277343750,19,9.6658391195,8.4791347992,9.3008086166,8.3760933553,,, +19.9296875000,19,11.3912990614,11.0403391342,10.8384195777,10.7889270104,,, +19.9316406250,19,12.9338242376,13.1367824913,12.2339587447,12.7748766611,,, +19.9335937500,19,14.2012165619,14.6434591490,13.4249975000,14.2384240235,,, +19.9355468750,19,15.1170077737,15.4788897222,14.3609632179,15.1239409436,,, +19.9375000000,19,15.6240550527,15.6069927200,15.0033601089,15.4139859872,,, +19.9394531250,19,15.6904848721,15.0402959912,15.3281809935,15.1288383175,,, +19.9414062500,19,15.3169664828,13.8466976937,15.3299886364,14.3300010724,,, +19.9433593750,19,14.5360081333,12.1500453488,15.0203201896,13.1197910691,,, +19.9453125000,19,13.4027026432,10.1174751687,14.4209323230,11.6311052642,,, +19.9472656250,19,11.9844482855,7.9380044778,13.5585009489,10.0110839865,,, +19.9492187500,19,10.3525764127,5.8008284345,12.4617622622,8.4051122313,,, +19.9511718750,19,8.5773095227,3.8788769929,11.1605392906,6.9446154017,,, +19.9531250000,19,6.7271284679,2.3168862552,9.6871854793,5.7373336523,,, +19.9550781250,19,4.8670357968,1.2175909672,8.0764150796,4.8551247078,,, +19.9570312500,19,3.0526949089,0.6270689956,6.3614940054,4.3213314291,,, +19.9589843750,19,1.3261029768,0.5300754281,4.5716052907,4.1078259717,,, +19.9609375000,19,-0.2845310654,0.8568112245,2.7325154544,4.1426594597,,, +19.9628906250,19,-1.7644347943,1.4922453789,0.8675069455,4.3200612135,,, +19.9648437500,19,-3.1128281905,2.2868514559,-1.0025990492,4.5118307774,,, +19.9667968750,19,-4.3421700592,3.0727533570,-2.8593183044,4.5828776375,,, +19.9687500000,19,-5.4754224659,3.6820186090,-4.6864335255,4.4067498817,,, +19.9707031250,19,-6.5419979739,3.9622389117,-6.4695130503,3.8774881272,,, +19.9726562500,19,-7.5710996658,3.7912338488,-8.1924762153,2.9210480528,,, +19.9746093750,19,-8.5827006570,3.0920076577,-9.8317473639,1.5070968134,,, +19.9765625000,19,-9.5812713599,1.8422752992,-11.3536592568,-0.3452634436,,, +19.9785156250,19,-10.5546427579,0.0761503510,-12.7174387773,-2.5702661634,,, +19.9804687500,19,-11.4759755864,-2.1184610627,-13.8808213152,-5.0621251647,,, +19.9824218750,19,-12.3087535636,-4.6081441775,-14.8061936583,-7.6847391855,,, +19.9843750000,19,-13.0122592560,-7.2285477760,-15.4641050897,-10.2843246180,,, +19.9863281250,19,-13.5432390382,-9.7976629752,-15.8321368847,-12.6997402181,,, +19.9882812500,19,-13.8576989309,-12.1269090603,-15.8944595254,-14.7712216682,,, +19.9902343750,19,-13.9179637080,-14.0370123008,-15.6459845027,-16.3533412317,,, +19.9921875000,19,-13.6998333490,-15.3754244504,-15.0955682038,-17.3283755044,,, +19.9941406250,19,-13.1925884856,-16.0270896399,-14.2623954529,-17.6131624624,,, +19.9960937500,19,-12.3936447206,-15.9210557222,-13.1684921711,-17.1632559624,,, +19.9980468750,19,-11.3043784682,-15.0374224421,-11.8342122799,-15.9794163269,,, +20.0000000000,20,-9.9313594850,-13.4123311617,-10.2802254398,-14.1134763791,33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538,20.0000000000:1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000:10.0000000000:11.0000000000:12.0000000000:13.0000000000:14.0000000000:15.0000000000:19.0000000000:20.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +20.0019531250,20,-8.2943197793,-11.1413132236,-8.5353500466,-11.6717705192,,, +20.0039062500,20,-6.4345630454,-8.3797334669,-6.6429862158,-8.8136530196,,, +20.0058593750,20,-4.4147373111,-5.3310841525,-4.6591962470,-5.7378974099,,, +20.0078125000,20,-2.3108291969,-2.2217141329,-2.6453067698,-2.6577766265,,, +20.0097656250,20,-0.2041378669,0.7248890570,-0.6617889137,0.2228901637,,, +20.0117187500,20,1.8238016997,3.3062244407,1.2347868511,2.7258527841,,, +20.0136718750,20,3.6958101998,5.3561267694,2.9936277672,4.7110009829,,, +20.0156250000,20,5.3441860287,6.7587287374,4.5715950093,6.0869783057,,, +20.0175781250,20,6.7162381721,7.4571003436,5.9359722516,6.8169897526,,, +20.0195312500,20,7.7805931884,7.4578969213,7.0684629729,6.9211203011,,, +20.0214843750,20,8.5310564519,6.8320661418,7.9676406264,6.4756111546,,, +20.0234375000,20,8.9834216564,5.7055821668,8.6463143155,5.6040793235,,, +20.0253906250,20,9.1673039478,4.2406995838,9.1246276656,4.4598598951,,, +20.0273437500,20,9.1188774773,2.6156437582,9.4229985480,3.2056435380,,, +20.0292968750,20,8.8761258971,1.0066282583,9.5574997889,1.9954396680,,, +20.0312500000,20,8.4761752115,-0.4266246620,9.5388759745,0.9618068964,,, +20.0332031250,20,7.9549680174,-1.5508250678,9.3752258818,0.2091468304,,, +20.0351562500,20,7.3465539494,-2.2688899643,9.0745659700,-0.1925568738,,, +20.0371093750,20,6.6811330179,-2.5298489389,8.6455419740,-0.2148247207,,, +20.0390625000,20,5.9874680079,-2.3280808438,8.1007637260,0.1311560886,,, +20.0410156250,20,5.2988356601,-1.6924650680,7.4618137794,0.8045545876,,, +20.0429687500,20,4.6517432868,-0.6817820908,6.7576329281,1.7391160915,,, +20.0449218750,20,4.0762860521,0.6127931383,6.0166249362,2.8423021010,,, +20.0468750000,20,3.5889964533,2.0724925208,5.2613379536,4.0019123675,,, +20.0488281250,20,3.1922834039,3.5631686272,4.5086621207,5.0991562170,,, +20.0507812500,20,2.8776024740,4.9465822359,3.7730953067,6.0201728145,,, +20.0527343750,20,2.6312804571,6.0924250193,3.0707674034,6.6662941816,,, +20.0546875000,20,2.4392624572,6.8919899353,2.4199315359,6.9632547810,,, +20.0566406250,20,2.2858700846,7.2676563993,1.8351958379,6.8657422616,,, +20.0585937500,20,2.1504299029,7.1783725100,1.3207046560,6.3590494606,,, +20.0605468750,20,2.0084444439,6.6245026163,0.8686430516,5.4610646881,,, +20.0625000000,20,1.8345398975,5.6474600339,0.4612578627,4.2209735036,,, +20.0644531250,20,1.6030516784,4.3215801775,0.0726400534,2.7124231461,,, +20.0664062500,20,1.2881703947,2.7438916080,-0.3293200345,1.0252328248,,, +20.0683593750,20,0.8640207455,1.0229002866,-0.7803753754,-0.7431587907,,, +20.0703125000,20,0.3064380831,-0.7335044776,-1.3150708331,-2.4964313112,,, +20.0722656250,20,-0.3987056119,-2.4237375731,-1.9569180113,-4.1432303447,,, +20.0742187500,20,-1.2442399957,-3.9507401748,-2.7072696712,-5.5952255074,,, +20.0761718750,20,-2.1962368774,-5.2209580538,-3.5400234315,-6.7661149896,,, +20.0781250000,20,-3.1970600803,-6.1480579460,-4.4050680970,-7.5758720288,,, +20.0800781250,20,-4.1739415397,-6.6594897941,-5.2377889739,-7.9585793284,,, +20.0820312500,20,-5.0471772077,-6.7034819843,-5.9675117221,-7.8699447681,,, +20.0839843750,20,-5.7350141244,-6.2546137913,-6.5209219556,-7.2914281505,,, +20.0859375000,20,-6.1599210192,-5.3176564964,-6.8258873013,-6.2315976116,,, +20.0878906250,20,-6.2604732581,-3.9304378055,-6.8217610315,-4.7276037269,,, +20.0898437500,20,-6.0051963449,-2.1657960085,-6.4728745010,-2.8471344738,,, +20.0917968750,20,-5.4019591910,-0.1324115231,-5.7777064778,-0.6892607636,,, +20.0937500000,20,-4.4996652104,2.0277792501,-4.7709583055,1.6176950041,,, +20.0957031250,20,-3.3813493463,4.1498921240,-3.5189762415,3.9241582758,,, +20.0976562500,20,-2.1499968183,6.0643528365,-2.1091840251,6.0740740841,,, +20.0996093750,20,-0.9116258968,7.6182939442,-0.6366977661,7.9229935416,,, +20.1015625000,20,0.2377900108,8.6922670269,0.8057966648,9.3519826748,,, +20.1035156250,20,1.2173410505,9.2053672632,2.1312376988,10.2709135215,,, +20.1054687500,20,1.9621110543,9.1131198726,3.2587564251,10.6159736275,,, +20.1074218750,20,2.4269572584,8.4082345014,4.1183283236,10.3514773730,,, +20.1093750000,20,2.5923580931,7.1237134681,4.6590515729,9.4757960262,,, +20.1113281250,20,2.4667577539,5.3320149505,4.8553610587,8.0248017609,,, +20.1132812500,20,2.0820976298,3.1384216448,4.7064626556,6.0693464673,,, +20.1152343750,20,1.4831645800,0.6694582293,4.2291921846,3.7071749376,,, +20.1171875000,20,0.7170634770,-1.9392483746,3.4510305211,1.0543168118,,, +20.1191406250,20,-0.1700928936,-4.5491786763,2.4093327018,-1.7584672563,,, +20.1210937500,20,-1.1303809774,-7.0202411847,1.1546107873,-4.5864117969,,, +20.1230468750,20,-2.1117402981,-9.2146337458,-0.2478143356,-7.2752956542,,, +20.1250000000,20,-3.0592459385,-11.0046575173,-1.7196385714,-9.6699247474,,, +20.1269531250,20,-3.9186120983,-12.2802143859,-3.1736617661,-11.6223907859,,, +20.1289062500,20,-4.6397880629,-12.9564851033,-4.5189743933,-13.0016125598,,, +20.1308593750,20,-5.1799055494,-12.9836356026,-5.6666566741,-13.7061625672,,, +20.1328125000,20,-5.5052968015,-12.3527101787,-6.5351852751,-13.6739351240,,, +20.1347656250,20,-5.5892715973,-11.0915695915,-7.0522329232,-12.8823968436,,, +20.1367187500,20,-5.4056617130,-9.2564062565,-7.1528327675,-11.3449337831,,, +20.1386718750,20,-4.9284205224,-6.9291053060,-6.7837973852,-9.1134487490,,, +20.1406250000,20,-4.1411434387,-4.2193646971,-5.9176532382,-6.2855618995,,, +20.1425781250,20,-3.0454789424,-1.2627683515,-4.5636165383,-3.0057009698,,, +20.1445312500,20,-1.6621842840,1.7874652783,-2.7682801594,0.5435568283,,, +20.1464843750,20,-0.0293202307,4.7719055666,-0.6111264440,4.1559270804,,, +20.1484375000,20,1.7982743389,7.5360069446,1.7999776128,7.6169152464,,, +20.1503906250,20,3.7477741890,9.9379008914,4.3325278309,10.7170138529,,, +20.1523437500,20,5.7280292085,11.8539231294,6.8347645505,13.2634834158,,, +20.1542968750,20,7.6330985024,13.1845044529,9.1447678177,15.0924294373,,, +20.1562500000,20,9.3487363871,13.8590659034,11.1010903400,16.0784168351,,, +20.1582031250,20,10.7596117973,13.8383578017,12.5525904367,16.1398649307,,, +20.1601562500,20,11.7576730434,13.1162535958,13.3687448065,15.2431996395,,, +20.1621093750,20,12.2512270429,11.7210989035,13.4507237142,13.4066301334,,, +20.1640625000,20,12.1721248244,9.7146179663,12.7410749621,10.7019696241,,, +20.1660156250,20,11.4812562860,7.1910070182,11.2311927608,7.2560261126,,, +20.1679687500,20,10.1743449359,4.2771276266,8.9661159901,3.2498653553,,, +20.1699218750,20,8.2861761907,1.1268608679,6.0447346199,-1.0911318386,,, +20.1718750000,20,5.8911092100,-2.0911662463,2.6153443738,-5.5149881184,,, +20.1738281250,20,3.1012830667,-5.2046426935,-1.1319031209,-9.7605652212,,, +20.1757812500,20,0.0624752140,-8.0472008594,-4.9760588261,-13.5748887563,,, +20.1777343750,20,-3.0538748535,-10.4698296666,-8.6799815239,-16.7320550772,,, +20.1796875000,20,-6.0620598242,-12.3499207254,-12.0071917574,-19.0485776630,,, +20.1816406250,20,-8.7758712481,-13.5960223842,-14.7395041365,-20.3927478578,,, +20.1835937500,20,-11.0235629073,-14.1525104353,-16.6932862001,-20.6911400985,,, +20.1855468750,20,-12.6630738743,-14.0045617173,-17.7344424428,-19.9337538715,,, +20.1875000000,20,-13.5964515472,-13.1795707535,-17.7925629606,-18.1755228561,,, +20.1894531250,20,-13.7802223761,-11.7434506031,-16.8693976027,-15.5308080466,,, +20.1914062500,20,-13.2279910967,-9.7919312959,-15.0367187499,-12.1595612991,,, +20.1933593750,20,-12.0048131840,-7.4373746131,-12.4252442359,-8.2479880210,,, +20.1953125000,20,-10.2166611875,-4.7960188438,-9.2095226541,-3.9904576428,,, +20.1972656250,20,-7.9990365186,-1.9819618831,-5.5923271228,0.4214454215,,, +20.1992187500,20,-5.5056993966,0.8933072151,-1.7900310151,4.8033526326,,, +20.2011718750,20,-2.8963554541,3.7205737522,1.9813973455,8.9799496916,,, +20.2031250000,20,-0.3240102644,6.3926163744,5.5202150373,12.7863125932,,, +20.2050781250,20,2.0754537345,8.8056021357,8.6511136570,16.0715336711,,, +20.2070312500,20,4.1895696593,10.8646166264,11.2337121356,18.7068424554,,, +20.2089843750,20,5.9317243573,12.4900053134,13.1671604292,20.5944008920,,, +20.2109375000,20,7.2421637291,13.6204115874,14.3924653096,21.6718212306,,, +20.2128906250,20,8.0897678686,14.2147722387,14.8937337243,21.9136370104,,, +20.2148437500,20,8.4743362189,14.2559829878,14.6980693006,21.3324397221,,, +20.2167968750,20,8.4261773976,13.7525985832,13.8721764507,19.9773186886,,, +20.2187500000,20,7.9991391967,12.7350803675,12.5130839961,17.9273914033,,, +20.2207031250,20,7.2582146026,11.2502155662,10.7334831844,15.2833958763,,, +20.2226562500,20,6.2688534708,9.3567046364,8.6475809881,12.1592035192,,, +20.2246093750,20,5.0929267672,7.1209104374,6.3634241965,8.6734726527,,, +20.2265625000,20,3.7896538848,4.6160240151,3.9814018327,4.9461906952,,, +20.2285156250,20,2.4177900870,1.9267676097,1.5952134776,1.1021270041,,, +20.2304687500,20,1.0367166597,-0.8472283989,-0.7071992769,-2.7259185146,,, +20.2324218750,20,-0.2939329585,-3.5944910947,-2.8436893734,-6.3998361115,,, +20.2343750000,20,-1.5149566868,-6.1985924590,-4.7388521961,-9.7834308353,,, +20.2363281250,20,-2.5685510658,-8.5461025639,-6.3259419493,-12.7514726086,,, +20.2382812500,20,-3.4010350437,-10.5347619708,-7.5502724607,-15.1987165533,,, +20.2402343750,20,-3.9673957556,-12.0805000686,-8.3734050587,-17.0466834695,,, +20.2421875000,20,-4.2354330101,-13.1222276901,-8.7757528980,-18.2469043766,,, +20.2441406250,20,-4.1877247858,-13.6229520274,-8.7563500071,-18.7796972384,,, +20.2460937500,20,-3.8222006854,-13.5659230283,-8.3310974422,-18.6477726765,,, +20.2480468750,20,-3.1537531555,-12.9508029551,-7.5315090501,-17.8693028045,,, +20.2500000000,20,-2.2176939845,-11.7975393607,-6.4050178868,-16.4784670366,,, +20.2519531250,20,-1.0717430501,-10.1541416501,-5.0153902959,-14.5315996717,,, +20.2539062500,20,0.2079146016,-8.0972380646,-3.4394968181,-12.1084249500,,, +20.2558593750,20,1.5354704437,-5.7248121148,-1.7602193650,-9.3064355315,,, +20.2578125000,20,2.8233185308,-3.1492596930,-0.0608925822,-6.2361855943,,, +20.2597656250,20,3.9870235089,-0.4932377517,1.5767776050,-3.0201390520,,, +20.2617187500,20,4.9498431290,2.1146139802,3.0751185917,0.2094364206,,, +20.2636718750,20,5.6462270037,4.5437986127,4.3638350618,3.3145363628,,, +20.2656250000,20,6.0226113529,6.6659845025,5.3814969019,6.1562370061,,, +20.2675781250,20,6.0362883670,8.3626408632,6.0745934613,8.6025389263,,, +20.2695312500,20,5.6548126461,9.5352260698,6.3970919571,10.5387546186,,, +20.2714843750,20,4.8596009307,10.1140610608,6.3145736342,11.8771045394,,, +20.2734375000,20,3.6539005683,10.0667783481,5.8121697323,12.5653805375,,, +20.2753906250,20,2.0699419875,9.4056824941,4.9010182215,12.5937707749,,, +20.2773437500,20,0.1721431203,8.1903823009,3.6212224908,11.9973212334,,, +20.2792968750,20,-1.9420270155,6.5256184472,2.0432076187,10.8543135939,,, +20.2812500000,20,-4.1447771699,4.5529416858,0.2663537256,9.2793182600,,, +20.2832031250,20,-6.2899739577,2.4319862734,-1.5898633023,7.4074685506,,, +20.2851562500,20,-8.2328265435,0.3167777813,-3.4014549519,5.3746136222,,, +20.2871093750,20,-9.8459018446,-1.6595527863,-5.0533598491,3.3043497452,,, +20.2890625000,20,-11.0255704260,-3.3891886880,-6.4452534882,1.3041050165,,, +20.2910156250,20,-11.6937258526,-4.7910109549,-7.4932200239,-0.5362438416,,, +20.2929687500,20,-11.7995733381,-5.8114466434,-8.1319969466,-2.1457677689,,, +20.2949218750,20,-11.3224913748,-6.4238965445,-8.3190364455,-3.4732927949,,, +20.2968750000,20,-10.2755096602,-6.6288175907,-8.0392252406,-4.4889270405,,, +20.2988281250,20,-8.7073879213,-6.4529323728,-7.3080851873,-5.1845428322,,, +20.3007812500,20,-6.7010981106,-5.9431071003,-6.1722586671,-5.5697683588,,, +20.3027343750,20,-4.3683959414,-5.1567752609,-4.7073031852,-5.6657366835,,, +20.3046875000,20,-1.8428560875,-4.1554775009,-3.0135531377,-5.5014945024,,, +20.3066406250,20,0.7264463686,-3.0035705257,-1.2108902716,-5.1137278489,,, +20.3085937500,20,3.1825439551,-1.7672621591,0.5685835383,-4.5459012540,,, +20.3105468750,20,5.3724561497,-0.5095005736,2.1917411077,-3.8435607732,,, +20.3125000000,20,7.1629205900,0.7179048621,3.5391001787,-3.0471665909,,, +20.3144531250,20,8.4561453623,1.8798692034,4.5199172626,-2.1867923398,,, +20.3164062500,20,9.1996692893,2.9566609680,5.0828343585,-1.2823937259,,, +20.3183593750,20,9.3873277904,3.9370352127,5.2186498634,-0.3487203482,,, +20.3203125000,20,9.0549676724,4.8133775113,4.9568611221,0.6005923869,,, +20.3222656250,20,8.2746461849,5.5808505047,4.3595643147,1.5516868190,,, +20.3242187500,20,7.1457684135,6.2347024153,3.5131676814,2.4881752431,,, +20.3261718750,20,5.7826677801,6.7652784734,2.5179489689,3.3879606725,,, +20.3281250000,20,4.3034109108,7.1569487448,1.4786889483,4.2238652341,,, +20.3300781250,20,2.8230428714,7.3920062965,0.4984050602,4.9679081823,,, +20.3320312500,20,1.4482532201,7.4554442706,-0.3276302327,5.5952657526,,, +20.3339843750,20,0.2698230822,7.3380641334,-0.9203392129,6.0862259501,,, +20.3359375000,20,-0.6456425276,7.0367195559,-1.2253503588,6.4259588889,,, +20.3378906250,20,-1.2600042575,6.5525021025,-1.2166735791,6.6032562589,,, +20.3398437500,20,-1.5615707358,5.8908100981,-0.8945529510,6.6107964379,,, +20.3417968750,20,-1.5591114460,5.0639069180,-0.2807291833,6.4465089438,,, +20.3437500000,20,-1.2767569947,4.0909664710,0.5858171728,6.1128329009,,, +20.3457031250,20,-0.7530711874,2.9945658320,1.6506982753,5.6142028674,,, +20.3476562500,20,-0.0428004756,1.7981023827,2.8437934054,4.9559621967,,, +20.3496093750,20,0.7826314486,0.5251490725,4.0798157889,4.1448616305,,, +20.3515625000,20,1.6382016223,-0.8002260507,5.2619991801,3.1901242056,,, +20.3535156250,20,2.4327435932,-2.1509145794,6.2892215949,2.1058328433,,, +20.3554687500,20,3.0802544340,-3.4939604992,7.0667426458,0.9134192054,,, +20.3574218750,20,3.5125918954,-4.7914511043,7.5194565474,-0.3583042487,,, +20.3593750000,20,3.6887543774,-6.0032360893,7.6021948023,-1.6745293108,,, +20.3613281250,20,3.5956535344,-7.0878411971,7.3007829701,-2.9950435955,,, +20.3632812500,20,3.2415840813,-8.0034864715,6.6257596306,-4.2751503171,,, +20.3652343750,20,2.6503928680,-8.7112601687,5.6072954176,-5.4681914700,,, +20.3671875000,20,1.8609966919,-9.1787057110,4.2952045563,-6.5286306987,,, +20.3691406250,20,0.9277133125,-9.3847839796,2.7597336764,-7.4165383260,,, +20.3710937500,20,-0.0843060076,-9.3271248315,1.0877712779,-8.1041544195,,, +20.3730468750,20,-1.1074471436,-9.0256545781,-0.6258882140,-8.5801489295,,, +20.3750000000,20,-2.0797714793,-8.5194225911,-2.2891924928,-8.8493745859,,, +20.3769531250,20,-2.9519232685,-7.8619459876,-3.8231277237,-8.9320563153,,, +20.3789062500,20,-3.6938255654,-7.1176634640,-5.1712716291,-8.8635093813,,, +20.3808593750,20,-4.2991554916,-6.3557252718,-6.3064944235,-8.6904323658,,, +20.3828125000,20,-4.7831459698,-5.6398643789,-7.2300754446,-8.4620966174,,, +20.3847656250,20,-5.1738117235,-5.0181371579,-7.9626796811,-8.2195326572,,, +20.3867187500,20,-5.5012795310,-4.5159763561,-8.5323823009,-7.9868485892,,, +20.3886718750,20,-5.7890571917,-4.1339894693,-8.9643426833,-7.7670551886,,, +20.3906250000,20,-6.0488228503,-3.8512153746,-9.2739076284,-7.5433706125,,, +20.3925781250,20,-6.2783264410,-3.6313362810,-9.4637239301,-7.2845553258,,, +20.3945312500,20,-6.4612894505,-3.4269740069,-9.5244910630,-6.9501617794,,, +20.3964843750,20,-6.5687134722,-3.1817810421,-9.4374901492,-6.4940022406,,, +20.3984375000,20,-6.5609859770,-2.8338980754,-9.1769464798,-5.8679598797,,, +20.4003906250,20,-6.3911345312,-2.3223695084,-8.7127246709,-5.0279142257,,, +20.4023437500,20,-6.0107104416,-1.5969664048,-8.0150510951,-3.9425033747,,, +20.4042968750,20,-5.3779351988,-0.6297616185,-7.0609194117,-2.6030732952,,, +20.4062500000,20,-4.4657602034,0.5776121641,-5.8404993914,-1.0293803926,,, +20.4082031250,20,-3.2683587793,1.9939288187,-4.3623043636,0.7316572725,,, +20.4101562500,20,-1.8051223795,3.5616625069,-2.6554916374,2.6110240151,,, +20.4121093750,20,-0.1204769249,5.2017155276,-0.7680760864,4.5241163635,,, +20.4140625000,20,1.7206551520,6.8215825794,1.2375322598,6.3789877615,,, +20.4160156250,20,3.6390519697,8.3257595168,3.2890019229,8.0850953153,,, +20.4179687500,20,5.5468044760,9.6253563593,5.3076567750,9.5608913331,,, +20.4199218750,20,7.3534365316,10.6474009597,7.2127567471,10.7413304984,,, +20.4218750000,20,8.9737139817,11.3434131654,8.9279279692,11.5851873205,,, +20.4238281250,20,10.3339381579,11.6924597978,10.3869331651,12.0777162970,,, +20.4257812500,20,11.3728730248,11.6975631044,11.5342318542,12.2266616929,,, +20.4277343750,20,12.0391684137,11.3809108879,12.3216658608,12.0565702054,,, +20.4296875000,20,12.2902520253,10.7812989171,12.7071987060,11.6060242243,,, +20.4316406250,20,12.0950111309,9.9526191320,12.6583390273,10.9269962220,,, +20.4335937500,20,11.4387271449,8.9613228849,12.1577452790,10.0831485399,,, +20.4355468750,20,10.3264443906,7.8800793600,11.2071180107,9.1441050075,,, +20.4375000000,20,8.7842120630,6.7779321804,9.8293302422,8.1765431885,,, +20.4394531250,20,6.8614838517,5.7125758633,8.0712964374,7.2369898077,,, +20.4414062500,20,4.6337967055,4.7273207103,6.0057980065,6.3678974185,,, +20.4433593750,20,2.2005953305,3.8492499204,3.7281384424,5.5944568335,,, +20.4453125000,20,-0.3233034267,3.0866758778,1.3476580366,4.9218795665,,, +20.4472656250,20,-2.8186454857,2.4287392978,-1.0221299469,4.3358927704,,, +20.4492187500,20,-5.1710723693,1.8490420995,-3.2718878465,3.8072396589,,, +20.4511718750,20,-7.2774705616,1.3116351963,-5.3023241981,3.2980728781,,, +20.4531250000,20,-9.0488638526,0.7779382684,-7.0271833917,2.7687431335,,, +20.4550781250,20,-10.4115440273,0.2134982986,-8.3749360081,2.1839652710,,, +20.4570312500,20,-11.3100650918,-0.4079568143,-9.2920846508,1.5164880067,,, +20.4589843750,20,-11.7123038409,-1.1033101551,-9.7480234434,0.7484093707,,, +20.4609375000,20,-11.6133048566,-1.8787038902,-9.7387571636,-0.1274149815,,, +20.4628906250,20,-11.0372343692,-2.7280900824,-9.2886903363,-1.1057767675,,, +20.4648437500,20,-10.0380671503,-3.6342036106,-8.4505776439,-2.1693036304,,, +20.4667968750,20,-8.6963552275,-4.5709856804,-7.3015382833,-3.2899937448,,, +20.4687500000,20,-7.1113158615,-5.5053459123,-5.9350940259,-4.4307406334,,, +20.4707031250,20,-5.3923886132,-6.3996267988,-4.4532424278,-5.5481709660,,, +20.4726562500,20,-3.6518436397,-7.2153761797,-2.9598632146,-6.5971333842,,, +20.4746093750,20,-1.9953140711,-7.9159104265,-1.5522637220,-7.5341556165,,, +20.4765625000,20,-0.5109017834,-8.4676911168,-0.3113665484,-8.3197492195,,, +20.4785156250,20,0.7374444816,-8.8421044328,0.7040525136,-8.9209817759,,, +20.4804687500,20,1.7109570020,-9.0176080536,1.4579812341,-9.3140649901,,, +20.4824218750,20,2.3956193444,-8.9833607347,1.9368745261,-9.4878770038,,, +20.4843750000,20,2.8026294163,-8.7431998564,2.1508372822,-9.4471743813,,, +20.4863281250,20,2.9673509955,-8.3153488906,2.1336948635,-9.2111061401,,, +20.4882812500,20,2.9431223320,-7.7278265593,1.9379765519,-8.8074619083,,, +20.4902343750,20,2.7915035636,-7.0136546045,1.6261586736,-8.2669965949,,, +20.4921875000,20,2.5739706826,-6.2068181409,1.2629138196,-7.6189569771,,, +20.4941406250,20,2.3463451364,-5.3376181556,0.9093133387,-6.8867828004,,, +20.4960937500,20,2.1548855265,-4.4289835698,0.6178283642,-6.0856753189,,, +20.4980468750,20,2.0339526925,-3.4966170019,0.4285738036,-5.2243485043,,, +20.5000000000,20,2.0050441068,-2.5520224100,0.3673804616,-4.3091489955,,, +20.5019531250,20,2.0768262566,-1.6062556480,0.4454730429,-3.3482173474,,, +20.5039062500,20,2.2457143342,-0.6742189099,0.6599236215,-2.3559355205,,, +20.5058593750,20,2.4971422591,0.2231032438,0.9948098885,-1.3552697665,,, +20.5078125000,20,2.8090383991,1.0615360311,1.4245445472,-0.3749346442,,, +20.5097656250,20,3.1571320372,1.8184536072,1.9192610472,0.5555926465,,, +20.5117187500,20,3.5192495180,2.4751627164,2.4498002209,1.4093285908,,, +20.5136718750,20,3.8769935214,3.0177347046,2.9902339013,2.1635828248,,, +20.5156250000,20,4.2150997455,3.4373712719,3.5175175618,2.8006347301,,, +20.5175781250,20,4.5200488759,3.7292891173,4.0101583672,3.3066390178,,, +20.5195312500,20,4.7800074915,3.8904361479,4.4483646204,3.6695521696,,, +20.5214843750,20,4.9847691517,3.9190789907,4.8141462298,3.8788897690,,, +20.5234375000,20,5.1223799961,3.8174754732,5.0883061562,3.9287380600,,, +20.5253906250,20,5.1754115001,3.5944780261,5.2476073763,3.8212645913,,, +20.5273437500,20,5.1217135053,3.2660498410,5.2663556020,3.5681620606,,, +20.5292968750,20,4.9369045433,2.8544761292,5.1191853840,3.1902359103,,, +20.5312500000,20,4.5957027210,2.3866972852,4.7823990822,2.7157657293,,, +20.5332031250,20,4.0747209639,1.8927371806,4.2365899416,2.1787998051,,, +20.5351562500,20,3.3577272288,1.4050454806,3.4714230166,1.6180927907,,, +20.5371093750,20,2.4407497122,0.9575128029,2.4899712652,1.0753933984,,, +20.5390625000,20,1.3350391281,0.5833587919,1.3108953797,0.5925312910,,, +20.5410156250,20,0.0682645382,0.3120370882,-0.0308265853,0.2078167319,,, +20.5429687500,20,-1.3152458804,0.1653843187,-1.4839858740,-0.0481928120,,, +20.5449218750,20,-2.7563122523,0.1553585688,-2.9834740195,-0.1555870635,,, +20.5468750000,20,-4.1852455886,0.2852362286,-4.4550696588,-0.1044855819,,, +20.5488281250,20,-5.5264349008,0.5511250437,-5.8198215188,0.1066006674,,, +20.5507812500,20,-6.7028518184,0.9403138272,-6.9976974595,0.4699340913,,, +20.5527343750,20,-7.6431157977,1.4288363390,-7.9140620372,0.9665720403,,, +20.5546875000,20,-8.2906565588,1.9821094477,-8.5092914559,1.5663030210,,, +20.5566406250,20,-8.6113024716,2.5579657376,-8.7473276731,2.2294733712,,, +20.5585937500,20,-8.5965157989,3.1104796019,-8.6196131517,2.9100060888,,, +20.5605468750,20,-8.2609517372,3.5952833787,-8.1432349006,3.5601782942,,, +20.5625000000,20,-7.6367094299,3.9746753393,-7.3557319996,4.1352968230,,, +20.5644531250,20,-6.7704247249,4.2188463689,-6.3120171110,4.5951907636,,, +20.5664062500,20,-5.7245925370,4.3045967084,-5.0845423979,4.9041516382,,, +20.5683593750,20,-4.5767994818,4.2157979755,-3.7610867715,5.0329958864,,, +20.5703125000,20,-3.4128849064,3.9459126787,-2.4368040942,4.9629779597,,, +20.5722656250,20,-2.3175684305,3.5011631982,-1.2043432918,4.6897552037,,, +20.5742187500,20,-1.3665614754,2.9035520565,-0.1460720580,4.2264918523,,, +20.5761718750,20,-0.6202531844,2.1910498022,0.6721001790,3.6040445687,,, +20.5781250000,20,-0.1181387417,1.4131306480,1.2066385408,2.8669670807,,, +20.5800781250,20,0.1255706537,0.6241330994,1.4412424672,2.0674309720,,, +20.5820312500,20,0.1240287383,-0.1230534996,1.3890691791,1.2590636346,,, +20.5839843750,20,-0.0835126434,-0.7831342546,1.0913984114,0.4906478088,,, +20.5859375000,20,-0.4367999924,-1.3232705355,0.6124624535,-0.1989790539,,, +20.5878906250,20,-0.8624733242,-1.7249427913,0.0314783263,-0.7830656326,,, +20.5898437500,20,-1.2820949708,-1.9845337675,-0.5654439271,-1.2477894097,,, +20.5917968750,20,-1.6184790679,-2.1137104486,-1.0918373439,-1.5930135586,,, +20.5937500000,20,-1.8012300508,-2.1368269947,-1.4670413487,-1.8304785809,,, +20.5957031250,20,-1.7728318920,-2.0851047458,-1.6232201730,-1.9790888384,,, +20.5976562500,20,-1.4939565918,-1.9918394747,-1.5116450973,-2.0612639231,,, +20.5996093750,20,-0.9456936590,-1.8901642319,-1.1060031308,-2.1019099118,,, +20.6015625000,20,-0.1290723534,-1.8110382517,-0.4030403367,-2.1276021470,,, +20.6035156250,20,0.9359514837,-1.7811663834,0.5778494373,-2.1651193157,,, +20.6054687500,20,2.2112273853,-1.8214728577,1.7957851321,-2.2394183853,,, +20.6074218750,20,3.6415443880,-1.9445283299,3.1907552209,-2.3696787990,,, +20.6093750000,20,5.1564860972,-2.1517414222,4.6867500151,-2.5650331089,,, +20.6113281250,20,6.6732129287,-2.4333484431,6.1953925666,-2.8235651374,,, +20.6132812500,20,8.1013746510,-2.7700109896,7.6211895399,-3.1334381034,,, +20.6152343750,20,9.3506865936,-3.1335880332,8.8692002850,-3.4733987941,,, +20.6171875000,20,10.3396612463,-3.4886244209,9.8539513223,-3.8138806892,,, +20.6191406250,20,11.0030038080,-3.7956674919,10.5069118990,-4.1200938597,,, +20.6210937500,20,11.2961967022,-4.0147613702,10.7808040481,-4.3557454212,,, +20.6230468750,20,11.1977986180,-4.1095741627,10.6517338673,-4.4873341994,,, +20.6250000000,20,10.7098208664,-4.0532472324,10.1199879852,-4.4895844039,,, +20.6269531250,20,9.8558363607,-3.8329983899,9.2088813473,-4.3493268311,,, +20.6289062500,20,8.6779609563,-3.4512067864,7.9623271851,-4.0660218778,,, +20.6308593750,20,7.2337554195,-2.9244989346,6.4419685941,-3.6506602081,,, +20.6328125000,20,5.5918594428,-2.2810588326,4.7225432075,-3.1234450366,,, +20.6347656250,20,3.8258539292,-1.5553039252,2.8850412336,-2.5093315451,,, +20.6367187500,20,2.0087154582,-0.7821830777,1.0103649673,-1.8332694708,,, +20.6386718750,20,0.2099599455,0.0061124007,-0.8242232119,-1.1177092436,,, +20.6406250000,20,-1.5056619197,0.7812896736,-2.5471062139,-0.3822444980,,, +20.6425781250,20,-3.0805850927,1.5188358239,-4.0953086344,0.3555869137,,, +20.6445312500,20,-4.4680615777,2.1966774089,-5.4183087391,1.0786743239,,, +20.6464843750,20,-5.6343770839,2.7938785607,-6.4803754179,1.7688419836,,, +20.6484375000,20,-6.5590433615,3.2907084134,-7.2611567958,2.4064817007,,, +20.6503906250,20,-7.2350294133,3.6693994977,-7.7562123169,2.9709854879,,, +20.6523437500,20,-7.6694056450,3.9154523618,-7.9776580277,3.4420470398,,, +20.6542968750,20,-7.8824670903,4.0205347620,-7.9532143309,3.8026890424,,, +20.6562500000,20,-7.9043229058,3.9851534347,-7.7225554892,4.0422971417,,, +20.6582031250,20,-7.7701207566,3.8180961300,-7.3318861154,4.1568717327,,, +20.6601562500,20,-7.5155549071,3.5340074635,-6.8285398449,4.1476760135,,, +20.6621093750,20,-7.1735748429,3.1514054520,-6.2568455782,4.0202280590,,, +20.6640625000,20,-6.7724230174,2.6902471483,-5.6555436752,3.7825671213,,, +20.6660156250,20,-6.3341178050,2.1697058380,-5.0558977326,3.4434497286,,, +20.6679687500,20,-5.8732201508,1.6085591742,-4.4801393743,3.0131189179,,, +20.6699218750,20,-5.3972560418,1.0270331081,-3.9412744781,2.5058266011,,, +20.6718750000,20,-4.9094064888,0.4476750107,-3.4450703490,1.9414213901,,, +20.6738281250,20,-4.4124367937,-0.1050257913,-2.9936934568,1.3451972331,,, +20.6757812500,20,-3.9115983248,-0.6063654533,-2.5886666227,0.7460268150,,, +20.6777343750,20,-3.4147986860,-1.0341915887,-2.2312496444,0.1733383977,,, +20.6796875000,20,-2.9307651460,-1.3704564802,-1.9211010469,-0.3449542643,,, +20.6816406250,20,-2.4667431884,-1.6008569245,-1.6547923799,-0.7829283866,,, +20.6835937500,20,-2.0266767255,-1.7154855018,-1.4249464016,-1.1183149695,,, +20.6855468750,20,-1.6105737501,-1.7112506401,-1.2204782743,-1.3358824050,,, +20.6875000000,20,-1.2152576568,-1.5927038074,-1.0279610292,-1.4289586030,,, +20.6894531250,20,-0.8356768589,-1.3705396245,-0.8333240468,-1.3983718590,,, +20.6914062500,20,-0.4659382428,-1.0604082285,-0.6232201821,-1.2516402752,,, +20.6933593750,20,-0.1005774229,-0.6821466811,-0.3866954361,-1.0026606510,,, +20.6953125000,20,0.2640198592,-0.2576061675,-0.1171075037,-0.6700903233,,, +20.6972656250,20,0.6298403432,0.1919109450,0.1876789850,-0.2752125865,,, +20.6992187500,20,0.9993680492,0.6455636769,0.5274185629,0.1580229353,,, +20.7011718750,20,1.3776832546,1.0798934322,0.9021748545,0.6005843206,,, +20.7031250000,20,1.7732912060,1.4662462856,1.3141369042,1.0168519413,,, +20.7050781250,20,2.1976429546,1.7719534663,1.7680536972,1.3667955226,,, +20.7070312500,20,2.6632750554,1.9646759059,2.2699101507,1.6109020014,,, +20.7089843750,20,3.1802241287,2.0166704054,2.8237129630,1.7148073690,,, +20.7109375000,20,3.7516889734,1.9075407522,3.4276135870,1.6524820256,,, +20.7128906250,20,4.3713470278,1.6272215439,4.0715956263,1.4095895048,,, +20.7148437500,20,5.0226452044,1.1794715661,4.7369223501,0.9871689946,,, +20.7167968750,20,5.6785043829,0.5832388541,5.3959461276,0.4031231067,,, +20.7187500000,20,6.3022414550,-0.1289304369,6.0129324914,-0.3094725033,,, +20.7207031250,20,6.8518636234,-0.9140475145,6.5477554156,-1.1061123784,,, +20.7226562500,20,7.2872354444,-1.7230842666,6.9622663204,-1.9360196528,,, +20.7246093750,20,7.5766779665,-2.5062628758,7.2264974731,-2.7477731942,,, +20.7265625000,20,7.6988976209,-3.2168995484,7.3207208622,-3.4930037182,,, +20.7285156250,20,7.6398208647,-3.8125458757,7.2326307780,-4.1272352344,,, +20.7304687500,20,7.3893721793,-4.2555613923,6.9543902486,-4.6102403497,,, +20.7324218750,20,6.9418248424,-4.5149100573,6.4830443127,-4.9077783814,,, +20.7343750000,20,6.2971219019,-4.5680448858,5.8217464922,-4.9935730253,,, +20.7363281250,20,5.4605227916,-4.4020252151,4.9792258272,-4.8506446805,,, +20.7382812500,20,4.4426011561,-4.0146531242,3.9694280953,-4.4728478684,,, +20.7402343750,20,3.2611055713,-3.4153321326,2.8127931564,-3.8663359426,,, +20.7421875000,20,1.9424474381,-2.6248832767,1.5371829753,-3.0499560283,,, +20.7441406250,20,0.5209003947,-1.6751070697,0.1768564987,-2.0550706685,,, +20.7460937500,20,-0.9640332140,-0.6081391877,-1.2299967352,-0.9247829736,,, +20.7480468750,20,-2.4702545172,0.5256428246,-2.6435290223,0.2885112718,,, +20.7500000000,20,-3.9539164032,1.6706391377,-4.0227681569,1.5264958134,,, +20.7519531250,20,-5.3690189955,2.7687876689,-5.3250463481,2.7279097686,,, +20.7539062500,20,-6.6678018816,3.7627855931,-6.5063564622,3.8318300777,,, +20.7558593750,20,-7.8024162502,4.5998751795,-7.5230050471,4.7814782378,,, +20.7578125000,20,-8.7271515988,5.2346596670,-8.3337158758,5.5271501503,,, +20.7597656250,20,-9.4011955049,5.6311426575,-8.9021957538,6.0284284857,,, +20.7617187500,20,-9.7914078536,5.7649693220,-9.1997722081,6.2565361826,,, +20.7636718750,20,-9.8737738139,5.6248714646,-9.2067765066,6.1958420962,,, +20.7656250000,20,-9.6339300374,5.2128997045,-8.9129567161,5.8442092853,,, +20.7675781250,20,-9.0682120323,4.5446989615,-8.3182701845,5.2135306722,,, +20.7695312500,20,-8.1854648091,3.6498760607,-7.4342409901,4.3305579820,,, +20.7714843750,20,-7.0096182340,2.5717106590,-6.2859784753,3.2371647341,,, +20.7734375000,20,-5.5827270768,1.3664507139,-4.9148373154,1.9899871098,,, +20.7753906250,20,-3.9662368043,0.1019388247,-3.3796505322,0.6590481858,,, +20.7773437500,20,-2.2383582590,-1.1456567347,-1.7543145794,-0.6757142373,,, +20.7792968750,20,-0.4883337080,-2.2971759144,-0.1223985927,-1.9300840897,,, +20.7812500000,20,1.1902461011,-3.2769459797,1.4290500184,-3.0224990758,,, +20.7832031250,20,2.7060753504,-4.0196305595,2.8155889562,-3.8814254485,,, +20.7851562500,20,3.9765864722,-4.4762872213,3.9613639390,-4.4518517787,,, +20.7871093750,20,4.9336954140,-4.6179852550,4.8044808492,-4.6992292823,,, +20.7890625000,20,5.5286998207,-4.4370394427,5.3016556492,-4.6108875052,,, +20.7910156250,20,5.7366619256,-3.9474349193,5.4324777414,-4.1965040457,,, +20.7929687500,20,5.5590896351,-3.1841041198,5.2018872052,-3.4875434681,,, +20.7949218750,20,5.0238322283,-2.1999677917,4.6396569040,-2.5347263712,,, +20.7968750000,20,4.1835161714,-1.0621182854,3.7984457375,-1.4046289978,,, +20.7988281250,20,3.1133090023,0.1517458103,2.7514557224,-0.1762492929,,, +20.8007812500,20,1.9064788918,1.3578873079,1.5881306114,1.0636615231,,, +20.8027343750,20,0.6670640993,2.4723923602,0.4071111060,2.2266743192,,, +20.8046875000,20,-0.4987875423,3.4168378377,-0.6919822995,3.2287060251,,, +20.8066406250,20,-1.4913732250,4.1234059240,-1.6164480651,3.9957206213,,, +20.8085937500,20,-2.2252211750,4.5398187910,-2.2874970733,4.4694147478,,, +20.8105468750,20,-2.6354750545,4.6333315392,-2.6459292461,4.6118901573,,, +20.8125000000,20,-2.6829128778,4.3932917118,-2.6566920337,4.4086380837,,, +20.8144531250,20,-2.3574013344,3.8323330879,-2.3121511495,3.8698756516,,, +20.8164062500,20,-1.6779179459,2.9849025668,-1.6321798266,3.0289877852,,, +20.8183593750,20,-0.6883426505,1.9024703190,-0.6601599561,1.9375527178,,, +20.8203125000,20,0.5481525203,0.6481029323,0.5424420559,0.6597783347,,, +20.8222656250,20,1.9533234301,-0.7073643174,1.9001768733,-0.7314025847,,, +20.8242187500,20,3.4374754500,-2.0887086085,3.3271094511,-2.1578057988,,, +20.8261718750,20,4.9040230703,-3.4199781604,4.7312022682,-3.5397868981,,, +20.8281250000,20,6.2544138037,-4.6273659730,6.0189834105,-4.7993196929,,, +20.8300781250,20,7.3930095408,-5.6419147539,7.1000764615,-5.8630098722,,, +20.8320312500,20,8.2332827198,-6.4037017864,7.8929763209,-6.6666514210,,, +20.8339843750,20,8.7052426142,-6.8666675950,8.3320449301,-7.1604193210,,, +20.8359375000,20,8.7614315726,-7.0019705003,8.3731720362,-7.3125002627,,, +20.8378906250,20,8.3802297972,-6.7994921403,7.9968883387,-7.1107555406,,, +20.8398437500,20,7.5669093103,-6.2679782608,7.2093058361,-6.5629675896,,, +20.8417968750,20,6.3520040298,-5.4337930568,6.0404352353,-5.6956756172,,, +20.8437500000,20,4.7873210385,-4.3385766471,4.5402740668,-4.5518109197,,, +20.8457031250,20,2.9412966639,-3.0361597064,2.7743802050,-3.1874417235,,, +20.8476562500,20,0.8947963054,-1.5888451520,0.8199294334,-1.6678251112,,, +20.8496093750,20,-1.2625530644,-0.0637398969,-1.2377240371,-0.0635304000,,, +20.8515625000,20,-3.4362067360,1.4704012785,-3.3086509100,1.5529306927,,, +20.8535156250,20,-5.5310393065,2.9462828165,-5.3024227395,3.1104370563,,, +20.8554687500,20,-7.4558620353,4.3013782008,-7.1323627874,4.5427985064,,, +20.8574218750,20,-9.1285662934,5.4811147321,-8.7203765374,5.7922079296,,, +20.8593750000,20,-10.4811841724,6.4412717723,-10.0017500055,6.8118459349,,, +20.8613281250,20,-11.4626488294,7.1490492906,-10.9278737734,7.5669438556,,, +20.8632812500,20,-12.0391994796,7.5831363017,-11.4667618360,8.0347216037,,, +20.8652343750,20,-12.1935361052,7.7330447150,-11.6022798871,8.2036533418,,, +20.8671875000,20,-11.9230522392,7.5977607307,-11.3323897137,8.0721304236,,, +20.8691406250,20,-11.2385982748,7.1849085824,-10.6678992953,7.6476577493,,, +20.8710937500,20,-10.1650489038,6.5112743357,-9.6329840300,6.9474224345,,, +20.8730468750,20,-8.7422624466,5.6035824702,-8.2661126027,5.9990958131,,, +20.8750000000,20,-7.0245179559,4.4982529679,-6.6195278828,4.8405528543,,, +20.8769531250,20,-5.0783280395,3.2400345391,-4.7571597684,3.5184284752,,, +20.8789062500,20,-2.9795164094,1.8800592347,-2.7518147364,2.0860912946,,, +20.8808593750,20,-0.8100472174,0.4737202873,-0.6821243633,0.6014358477,,, +20.8828125000,20,1.3454723342,-0.9217978886,1.3708329386,-0.8756700296,,, +20.8847656250,20,3.4033515884,-2.2502332681,3.3270021181,-2.2861504179,,, +20.8867187500,20,5.2840151706,-3.4585896841,5.1104790578,-3.5741005129,,, +20.8886718750,20,6.9154378152,-4.4993586548,6.6528265989,-4.6890903290,,, +20.8906250000,20,8.2372220048,-5.3331248770,7.8969699053,-5.5889122168,,, +20.8925781250,20,9.2037572968,-5.9305208178,8.8001697352,-6.2416941550,,, +20.8945312500,20,9.7854746646,-6.2727672620,9.3351266964,-6.6265847579,,, +20.8964843750,20,9.9693590674,-6.3518922948,9.4903865848,-6.7340819524,,, +20.8984375000,20,9.7589928237,-6.1710285074,9.2703340471,-6.5663875083,,, +20.9003906250,20,9.1741734599,-5.7444091936,8.6947724544,-6.1374533947,,, +20.9023437500,20,8.2518750072,-5.0979248418,7.7997688934,-5.4736519476,,, +20.9042968750,20,7.0480307482,-4.2700702522,6.6393002646,-4.6148459776,,, +20.9062500000,20,5.6361732387,-3.3108245944,5.2839316612,-3.6132443707,,, +20.9082031250,20,4.1017751169,-2.2778059698,3.8154245113,-2.5293426400,,, +20.9101562500,20,2.5355582999,-1.2319698181,2.3203885059,-1.4273411647,,, +20.9121093750,20,1.0275463559,-0.2337882748,0.8846378942,-0.3710759722,,, +20.9140625000,20,-0.3390690731,0.6610203293,-0.4126672389,0.5804697226,,, +20.9160156250,20,-1.4944709579,1.4061378811,-1.5052945330,1.3780194176,,, +20.9179687500,20,-2.3885585177,1.9688628989,-2.3460051804,1.9864345763,,, +20.9199218750,20,-2.9958358378,2.3331227368,-2.9111974552,2.3879259121,,, +20.9218750000,20,-3.3169773525,2.5003420557,-3.2023512092,2.5830318563,,, +20.9238281250,20,-3.3765773494,2.4879647313,-3.2438135978,2.5891330464,,, +20.9257812500,20,-3.2186973734,2.3266175619,-3.0784756887,2.4375381420,,, +20.9277343750,20,-2.9015603550,2.0566589883,-2.7626379549,2.1699195300,,, +20.9296875000,20,-2.4905769762,1.7235004150,-2.3592901077,1.8334533045,,, +20.9316406250,20,-2.0499632025,1.3719189956,-1.9300639769,1.4748794955,,, +20.9335937500,20,-1.6361986929,1.0415886970,-1.5289880096,1.1357978581,,, +20.9355468750,20,-1.2942768142,0.7644633688,-1.1989497834,0.8498685074,,, +20.9375000000,20,-1.0541775912,0.5622649592,-0.9683800376,0.6401156367,,, +20.9394531250,20,-0.9273925081,0.4440039893,-0.8479752354,0.5162771969,,, +20.9414062500,20,-0.9059250767,0.4052326444,-0.8297712612,0.4739902914,,, +20.9433593750,20,-0.9646346934,0.4295853134,-0.8893944305,0.4964003278,,, +20.9453125000,20,-1.0664554264,0.4922419644,-0.9910530884,0.5578007562,,, +20.9472656250,20,-1.1697873505,0.5648789242,-1.0946166003,0.6288242663,,, +20.9492187500,20,-1.2360831546,0.6207941092,-1.1628923380,0.6818035457,,, +20.9511718750,20,-1.2350328114,0.6384333491,-1.1666075146,0.6944494687,,, +20.9531250000,20,-1.1473252674,0.6033170983,-1.0870709569,0.6518505412,,, +20.9550781250,20,-0.9670175075,0.5097265090,-0.9184489942,0.5482299520,,, +20.9570312500,20,-0.7029153590,0.3617155977,-0.6690785196,0.3880142411,,, +20.9589843750,20,-0.3765774852,0.1718876740,-0.3595436174,0.1845589558,,, +20.9609375000,20,-0.0175118920,-0.0416419922,-0.0180744157,-0.0430424751,,, +20.9628906250,20,0.3419071274,-0.2584823201,0.3243193622,-0.2733607457,,, +20.9648437500,20,0.6699029281,-0.4582304882,0.6371751198,-0.4849971196,,, +20.9667968750,20,0.9362400549,-0.6211488795,0.8915002734,-0.6572707113,,, +20.9687500000,20,1.1124733180,-0.7283885099,1.0600261199,-0.7704339912,,, +20.9707031250,20,1.1745411108,-0.7637434931,1.1196906006,-0.8075131639,,, +20.9726562500,20,1.1074900512,-0.7168203767,1.0561484822,-0.7576479561,,, +20.9746093750,20,0.9093370128,-0.5856693980,0.8674554918,-0.6188655342,,, +20.9765625000,20,0.5920366003,-0.3775263751,0.5649900109,-0.3988604592,,, +20.9785156250,20,0.1799441046,-0.1078797658,0.1719829317,-0.1140106204,,, +20.9804687500,20,-0.2930049147,0.2013564664,-0.2791796369,0.2125454909,,, +20.9824218750,20,-0.7861208351,0.5237092588,-0.7496584695,0.5528722100,,, +20.9843750000,20,-1.2539884666,0.8295042569,-1.1961001082,0.8756649566,,, +20.9863281250,20,-1.6493457404,1.0877866980,-1.5733866261,1.1482729869,,, +20.9882812500,20,-1.9280077805,1.2695812430,-1.8393375338,1.3401349889,,, +20.9902343750,20,-2.0543284840,1.3514972455,-1.9599246546,1.4265795389,,, +20.9921875000,20,-2.0070315820,1.3195729808,-1.9148389167,1.3928786300,,, +20.9941406250,20,-1.7850541642,1.1731244582,-1.7030673949,1.2383079859,,, +20.9960937500,20,-1.4098300060,0.9262488684,-1.3450711314,0.9777346859,,, +20.9980468750,20,-0.9219972060,0.6056587746,-0.8796409242,0.6393344674,,, +21.0000000000,21,-0.3741444805,0.2458028195,-0.3569863152,0.2594546099,33538,21.0000000000,0.0000000000 +21.0019531250,21,0.1778753508,-0.1166866678,0.1695878200,-0.1232630110,,, +21.0039062500,21,0.6823319960,-0.4477633373,0.6507430839,-0.4729157930,,, +21.0058593750,21,1.0970285780,-0.7196680964,1.0462469445,-0.7602242239,,, +21.0078125000,21,1.3933434821,-0.9135986993,1.3288242119,-0.9653416330,,, +21.0097656250,21,1.5580795458,-1.0209321452,1.4859162033,-1.0791401119,,, +21.0117187500,21,1.5924701877,-1.0425723961,1.5187282313,-1.1025215101,,, +21.0136718750,21,1.5090247828,-0.9868724446,1.4392169451,-1.0442270646,,, +21.0156250000,21,1.3278732691,-0.8672210639,1.2666013917,-0.9182967016,,, +21.0175781250,21,1.0737878519,-0.7000687325,1.0245216182,-0.7419951467,,, +21.0195312500,21,0.7735133562,-0.5031529487,0.7384916884,-0.5339504323,,, +21.0214843750,21,0.4533302812,-0.2938757559,0.4335725321,-0.3124534286,,, +21.0234375000,21,0.1381447046,-0.0886904941,0.1335016923,-0.0948191803,,, +21.0253906250,21,-0.1480933368,0.0966247212,-0.1389050239,0.1023236375,,, +21.0273437500,21,-0.3833258752,0.2475732731,-0.3626405602,0.2636774944,,, +21.0292968750,21,-0.5506297944,0.3530626071,-0.5215932608,0.3775207153,,, +21.0312500000,21,-0.6414632348,0.4075350030,-0.6076334182,0.4379574056,,, +21.0332031250,21,-0.6570305995,0.4118715314,-0.6219020601,0.4458671207,,, +21.0351562500,21,-0.6073080376,0.3727679952,-0.5738758448,0.4082367307,,, +21.0371093750,21,-0.5074976506,0.3004205633,-0.4779943979,0.3357090804,,, +21.0390625000,21,-0.3733063347,0.2054375991,-0.3491777157,0.2393161164,,, +21.0410156250,21,-0.2178950991,0.0968541307,-0.1999441740,0.1283731009,,, +21.0429687500,21,-0.0510901900,-0.0183813466,-0.0396871671,0.0099346325,,, +21.0449218750,21,0.1211229196,-0.1357703263,0.1257917006,-0.1115710022,,, +21.0468750000,21,0.2966508600,-0.2533539138,0.2943387871,-0.2344047309,,, +21.0488281250,21,0.4751840009,-0.3703851963,0.4654632457,-0.3580832034,,, +21.0507812500,21,0.6560073197,-0.4859343977,0.6382839505,-0.4818826192,,, +21.0527343750,21,0.8378925774,-0.5988388158,0.8114621474,-0.6047747480,,, +21.0546875000,21,1.0188305803,-0.7075372602,0.9829726275,-0.7252468218,,, +21.0566406250,21,1.1946654895,-0.8091976884,1.1488143449,-0.8403670008,,, +21.0585937500,21,1.3587221321,-0.8995138019,1.3026511026,-0.9455461710,,, +21.0605468750,21,1.5028939644,-0.9734619153,1.4368191285,-1.0353123507,,, +21.0625000000,21,1.6197312618,-1.0267130806,1.5442751722,-1.1047774047,,, +21.0644531250,21,1.7053574662,-1.0575679077,1.6213602530,-1.1516679110,,, +21.0664062500,21,1.7609167368,-1.0678586935,1.6692067334,-1.1773053246,,, +21.0683593750,21,1.7903440398,-1.0613744514,1.6916655506,-1.1850071204,,, +21.0703125000,21,1.7968175447,-1.0414243630,1.6919831737,-1.1775765729,,, +21.0722656250,21,1.7810618518,-1.0096596820,1.6712270524,-1.1560963048,,, +21.0742187500,21,1.7405615459,-0.9655233198,1.6275278888,-1.1193665512,,, +21.0761718750,21,1.6686622649,-0.9056273395,1.5551492077,-1.0632651773,,, +21.0781250000,21,1.5551592472,-0.8240974407,1.4449321322,-0.9811332065,,, +21.0800781250,21,1.3890695463,-0.7143568759,1.2868077587,-0.8656762855,,, +21.0820312500,21,1.1624116202,-0.5716087110,1.0732879348,-0.7115825200,,, +21.0839843750,21,0.8732529389,-0.3948680229,0.8023199418,-0.5176488192,,, +21.0859375000,21,0.5264381288,-0.1874356600,0.4780085105,-0.2872836755,,, +21.0878906250,21,0.1320699530,0.0441806268,0.1092556493,-0.0274159777,,, +21.0898437500,21,-0.2967309151,0.2918510335,-0.2922337384,0.2531107767,,, +21.0917968750,21,-0.7460157397,0.5473192911,-0.7138696997,0.5450813288,,, +21.0937500000,21,-1.2031438733,0.8035605214,-1.1441003801,0.8403652423,,, +21.0957031250,21,-1.6582550235,1.0556371103,-1.5738066762,1.1328829721,,, +21.0976562500,21,-2.1043438331,1.3006244862,-1.9964237532,1.4185982932,,, +21.0996093750,21,-2.5361927741,1.5367905877,-2.4069826524,1.6947213152,,, +21.1015625000,21,-2.9488003033,1.7624545003,-2.8006531068,1.9585666236,,, +21.1035156250,21,-3.3351974582,1.9744719622,-3.1706587011,2.2060007721,,, +21.1054687500,21,-3.6835702987,2.1663187716,-3.5054979394,2.4294344895,,, +21.1074218750,21,-3.9752532444,2.3267893022,-3.7869974211,2.6164397001,,, +21.1093750000,21,-4.1856925259,2.4406238833,-3.9911741366,2.7504139908,,, +21.1113281250,21,-4.2882917312,2.4910033859,-4.0918342421,2.8132296144,,, +21.1132812500,21,-4.2598262239,2.4631241699,-4.0657933796,2.7889960833,,, +21.1152343750,21,-4.0860295919,2.3479388514,-3.8984433256,2.6679706397,,, +21.1171875000,21,-3.7645769940,2.1441564877,-3.5868689172,2.4486499312,,, +21.1191406250,21,-3.3042989355,1.8577308733,-3.1392703312,2.1372298537,,, +21.1210937500,21,-2.7230489464,1.5004955473,-2.5730185209,1.7461461532,,, +21.1230468750,21,-2.0454790890,1.0886744437,-1.9125507225,1.2925188780,,, +21.1250000000,21,-1.2998297156,0.6405231531,-1.1862078016,0.7958035977,,, +21.1269531250,21,-0.5147388318,0.1739407678,-0.4229992467,0.2754341852,,, +21.1289062500,21,0.2817601552,-0.2942045733,0.3485731459,-0.2498835949,,, +21.1308593750,21,1.0610767111,-0.7471105913,1.0996656929,-0.7612733081,,, +21.1328125000,21,1.7924480911,-1.1668022862,1.7998163460,-1.2384869712,,, +21.1347656250,21,2.4425339469,-1.5337720932,2.4167090893,-1.6595814719,,, +21.1367187500,21,2.9773839346,-1.8282380193,2.9180649225,-2.0022656539,,, +21.1386718750,21,3.3665609287,-2.0328344718,3.2755150193,-2.2467476329,,, +21.1406250000,21,3.5875642754,-2.1354098755,3.4686651512,-2.3787439103,,, +21.1425781250,21,3.6291391661,-2.1309375687,3.4879907952,-2.3916388503,,, +21.1445312500,21,3.4935281689,-2.0226373877,3.3367634459,-2.2878656542,,, +21.1464843750,21,3.1972624571,-1.8221520002,3.0317521112,-2.0792852570,,, +21.1484375000,21,2.7694418528,-1.5481976382,2.6016455784,-1.7858878658,,, +21.1503906250,21,2.2482053610,-1.2242420554,2.0837693845,-1.4333465776,,, +21.1523437500,21,1.6771485563,-0.8763327498,1.5207338217,-1.0506243694,,, +21.1542968750,21,1.1019410824,-0.5311286257,0.9572172932,-0.6677540919,,, +21.1562500000,21,0.5670595207,-0.2140294876,0.4367600307,-0.3137076271,,, +21.1582031250,21,0.1130921783,0.0522748486,-0.0009806807,-0.0146814342,,, +21.1601562500,21,-0.2259090628,0.2491059550,-0.3229361601,0.2075273603,,, +21.1621093750,21,-0.4249983240,0.3628948643,-0.5052318931,0.3370157919,,, +21.1640625000,21,-0.4696485127,0.3855100054,-0.5345760989,0.3644257393,,, +21.1660156250,21,-0.3565909597,0.3146321751,-0.4090945795,0.2874392499,,, +21.1679687500,21,-0.0955984672,0.1551169203,-0.1398764751,0.1121029951,,, +21.1699218750,21,0.2892052379,-0.0797762861,0.2480743255,-0.1460913840,,, +21.1718750000,21,0.7606866123,-0.3688118905,0.7174440086,-0.4629224451,,, +21.1738281250,21,1.2722263976,-0.6846093852,1.2222069661,-0.8076493955,,, +21.1757812500,21,1.7717665591,-0.9959032076,1.7115838185,-1.1456233999,,, +21.1777343750,21,2.2065555100,-1.2704711276,2.1345901956,-1.4414829654,,, +21.1796875000,21,2.5290670517,-1.4789597357,2.4456792892,-1.6632226641,,, +21.1816406250,21,2.7024612762,-1.5983260765,2.6098707678,-1.7859021973,,, +21.1835937500,21,2.7040534655,-1.6139825056,2.6059140715,-1.7939799288,,, +21.1855468750,21,2.5270119404,-1.5209183675,2.4278379421,-1.6824892583,,, +21.1875000000,21,2.1800883284,-1.3234669624,2.0847486596,-1.4568242116,,, +21.1894531250,21,1.6849766934,-1.0334261203,1.5984522393,-1.1308413847,,, +21.1914062500,21,1.0725405314,-0.6676359030,1.0000332904,-0.7242767270,,, +21.1933593750,21,0.3791523949,-0.2459423647,0.3263555406,-0.2603894172,,, +21.1953125000,21,-0.3561283186,0.2100656818,-0.3829928624,0.2357115490,,, +21.1972656250,21,-1.0926429839,0.6770988617,-1.0872620499,0.7375026583,,, +21.1992187500,21,-1.7887401476,1.1299819244,-1.7455803083,1.2171899106,,, +21.2011718750,21,-2.4046374785,1.5431316138,-2.3200201302,1.6475005573,,, +21.2031250000,21,-2.9068004300,1.8932372248,-2.7798940377,2.0046211878,,, +21.2050781250,21,-3.2708037126,2.1611273333,-3.1043339440,2.2701691759,,, +21.2070312500,21,-3.4829427090,2.3330758249,-3.2835071356,2.4324221987,,, +21.2089843750,21,-3.5417854792,2.4023939516,-3.3196688497,2.4876628434,,, +21.2109375000,21,-3.4579206708,2.3699057138,-3.2263424290,2.4403047602,,, +21.2128906250,21,-3.2517346466,2.2430683848,-3.0255700628,2.3016243741,,, +21.2148437500,21,-2.9516629921,2.0354250487,-2.7458563971,2.0888354202,,, +21.2167968750,21,-2.5923502431,1.7658767721,-2.4203334981,1.8240471634,,, +21.2187500000,21,-2.2105520049,1.4563535681,-2.0828887333,1.5316047329,,, +21.2207031250,21,-1.8399786964,1.1288843881,-1.7633910583,1.2347452599,,, +21.2226562500,21,-1.5074276497,0.8034381282,-1.4843694082,0.9531136251,,, +21.2246093750,21,-1.2303893874,0.4963290096,-1.2591626814,0.7011033253,,, +21.2265625000,21,-1.0158721088,0.2191268685,-1.0910610827,0.4868938509,,, +21.2285156250,21,-0.8609519482,-0.0213600968,-0.9739400917,0.3126500203,,, +21.2304687500,21,-0.7551103153,-0.2220582934,-0.8945485989,0.1758939471,,, +21.2324218750,21,-0.6841094400,-0.3817318727,-0.8362913841,0.0718731602,,, +21.2343750000,21,-0.6338015170,-0.4992154325,-0.7831066097,-0.0041567520,,, +21.2363281250,21,-0.5904794665,-0.5743408289,-0.7202220869,-0.0572455051,,, +21.2382812500,21,-0.5378763533,-0.6113709799,-0.6316842569,-0.0955296746,,, +21.2402343750,21,-0.4552241310,-0.6209144205,-0.4987202093,-0.1318830083,,, +21.2421875000,21,-0.3187141120,-0.6185278488,-0.3012620461,-0.1826896703,,, +21.2441406250,21,-0.1059893181,-0.6215073651,-0.0222773246,-0.2646094617,,, +21.2460937500,21,0.1975193441,-0.6450730647,0.3464491657,-0.3903679171,,, +21.2480468750,21,0.5934453996,-0.6989259488,0.8000173653,-0.5651767707,,, +21.2500000000,21,1.0686469090,-0.7851163860,1.3194634347,-0.7850274195,,, +21.2519531250,21,1.5962508204,-0.8976294154,1.8736246833,-1.0368944271,,, +21.2539062500,21,2.1394665976,-1.0241738799,2.4234503543,-1.3010383794,,, +21.2558593750,21,2.6572594140,-1.1493873082,2.9276367046,-1.5546810785,,, +21.2578125000,21,3.1097240447,-1.2577880516,3.3476232793,-1.7754393387,,, +21.2597656250,21,3.4630515521,-1.3366126275,3.6520377021,-1.9445478537,,, +21.2617187500,21,3.6940175583,-1.3785616062,3.8205300763,-2.0498562175,,, +21.2636718750,21,3.7920423578,-1.3828074294,3.8452954275,-2.0870764152,,, +21.2656250000,21,3.7584769343,-1.3539274360,3.7304108116,-2.0589967595,,, +21.2675781250,21,3.6042169819,-1.2999392632,3.4900848535,-1.9736463692,,, +21.2695312500,21,3.3461972789,-1.2301096987,3.1456994367,-1.8419310401,,, +21.2714843750,21,3.0038508132,-1.1528429304,2.7223144698,-1.6752863043,,, +21.2734375000,21,2.5966723495,-1.0738385655,2.2459271334,-1.4838675960,,, +21.2753906250,21,2.1431725665,-0.9948993198,1.7417896198,-1.2755692052,,, +21.2773437500,21,1.6611911429,-0.9142738853,1.2337299799,-1.0562906704,,, +21.2792968750,21,1.1684422598,-0.8282507268,0.7436686835,-0.8308980090,,, +21.2812500000,21,0.6817834942,-0.7321914960,0.2901091179,-0.6034410047,,, +21.2832031250,21,0.2160033402,-0.6206714411,-0.1134700879,-0.3767633111,,, +21.2851562500,21,-0.2166463815,-0.4879031516,-0.4589133308,-0.1525378745,,, +21.2871093750,21,-0.6076444451,-0.3279358932,-0.7438042477,0.0690666820,,, +21.2890625000,21,-0.9548982224,-0.1339055001,-0.9730553266,0.2907359516,,, +21.2910156250,21,-1.2645180224,0.1021389880,-1.1597138198,0.5187371344,,, +21.2929687500,21,-1.5499173494,0.3877852535,-1.3235939934,0.7618692912,,, +21.2949218750,21,-1.8288517251,0.7280226035,-1.4883425267,1.0292729811,,, +21.2968750000,21,-2.1189976811,1.1227108694,-1.6772313190,1.3275561593,,, +21.2988281250,21,-2.4326899587,1.5640347638,-1.9080371611,1.6575990383,,, +21.3007812500,21,-2.7727201323,2.0352505062,-2.1889047918,2.0123823546,,, +21.3027343750,21,-3.1303495495,2.5111613273,-2.5163668206,2.3764807800,,, +21.3046875000,21,-3.4851120949,2.9593431416,-2.8748993060,2.7265833018,,, +21.3066406250,21,-3.8070378747,3.3426323854,-3.2384063290,3.0335201200,,, +21.3085937500,21,-4.0616162831,3.6238232717,-3.5740446138,3.2663767291,,, +21.3105468750,21,-4.2149336790,3.7708221082,-3.8463055731,3.3968959556,,, +21.3125000000,21,-4.2375172954,3.7606290567,-4.0203825604,3.4028372105,,, +21.3144531250,21,-4.1084875728,3.5826760941,-4.0665540732,3.2711488883,,, +21.3164062500,21,-3.8194876930,3.2407455575,-3.9649033477,3.0003761970,,, +21.3183593750,21,-3.3751876451,2.7517184937,-3.7070857912,2.6002596237,,, +21.3203125000,21,-2.7903889983,2.1421856269,-3.2950740088,2.0890353812,,, +21.3222656250,21,-2.0872259380,1.4451505792,-2.7399137356,1.4908156149,,, +21.3242187500,21,-1.2937549443,0.6968613591,-2.0611712355,0.8335359434,,, +21.3261718750,21,-0.4424073763,-0.0667450183,-1.2854677836,0.1466506428,,, +21.3281250000,21,0.4322755436,-0.8131153662,-0.4440105604,-0.5412088429,,, +21.3300781250,21,1.2952731947,-1.5144857422,0.4292747587,-1.2035282777,,, +21.3320312500,21,2.1094968821,-2.1465752434,1.2966693352,-1.8146932285,,, +21.3339843750,21,2.8316185802,-2.6854504504,2.1130263896,-2.3469220460,,, +21.3359375000,21,3.4121177345,-3.1066579565,2.8255990293,-2.7698582198,,, +21.3378906250,21,3.8033221035,-3.3890320289,3.3812478000,-3.0553986412,,, +21.3398437500,21,3.9702640057,-3.5202855971,3.7366268436,-3.1844376285,,, +21.3417968750,21,3.8987122571,-3.5006059166,3.8659320008,-3.1515952825,,, +21.3437500000,21,3.5992651955,-3.3435113543,3.7653421395,-2.9671589780,,, +21.3457031250,21,3.1069785714,-3.0740747107,3.4541005527,-2.6561026087,,, +21.3476562500,21,2.4762243324,-2.7244414927,2.9715805970,-2.2540305060,,, +21.3496093750,21,1.7726485325,-2.3282353260,2.3713169572,-1.8015004244,,, +21.3515625000,21,1.0647881797,-1.9159377041,1.7142006076,-1.3386864333,,, +21.3535156250,21,0.4169783147,-1.5120873795,1.0624275888,-0.9013983823,,, +21.3554687500,21,-0.1160747804,-1.1345147152,0.4743921227,-0.5186988296,,, +21.3574218750,21,-0.4930000507,-0.7950716311,0.0003888541,-0.2118716644,,, +21.3593750000,21,-0.6872539373,-0.5007461183,-0.3204046793,0.0056150703,,, +21.3613281250,21,-0.6869549064,-0.2548557046,-0.4619077754,0.1275024864,,, +21.3632812500,21,-0.4941997253,-0.0586112567,-0.4124473978,0.1537589414,,, +21.3652343750,21,-0.1237783291,0.0872971745,-0.1746166979,0.0893494060,,, +21.3671875000,21,0.3984983934,0.1821800652,0.2359749023,-0.0566330714,,, +21.3691406250,21,1.0368071248,0.2262849324,0.7916151942,-0.2708864556,,, +21.3710937500,21,1.7459834080,0.2223134220,1.4533560489,-0.5354162430,,, +21.3730468750,21,2.4733414707,0.1770693225,2.1727541798,-0.8274101918,,, +21.3750000000,21,3.1622707348,0.1033011792,2.8944373079,-1.1196617746,,, +21.3769531250,21,3.7570521728,0.0201720206,3.5597864896,-1.3821120170,,, +21.3789062500,21,4.2071549505,-0.0491711580,4.1112338130,-1.5846272656,,, +21.3808593750,21,4.4696563712,-0.0814683043,4.4953601804,-1.6997911581,,, +21.3828125000,21,4.5114869257,-0.0571649812,4.6656199136,-1.7056021313,,, +21.3847656250,21,4.3131930137,0.0358337505,4.5868348003,-1.5887065308,,, +21.3867187500,21,3.8722270390,0.2000337976,4.2400286691,-1.3466796710,,, +21.3886718750,21,3.2035067442,0.4293334099,3.6252042602,-0.9877917285,,, +21.3906250000,21,2.3375125502,0.7115060490,2.7621133918,-0.5291375114,,, +21.3925781250,21,1.3163891932,1.0301899201,1.6887824889,0.0057387188,,, +21.3945312500,21,0.1883108088,1.3666744658,0.4568723176,0.5897881380,,, +21.3964843750,21,-0.9976828793,1.7016866500,-0.8740940868,1.1952537362,,, +21.3984375000,21,-2.1945513772,2.0160131488,-2.2410459749,1.7950610775,,, +21.4003906250,21,-3.3588444671,2.2901943858,-3.5811166937,2.3632968121,,, +21.4023437500,21,-4.4517870714,2.5051809281,-4.8355162452,2.8759774540,,, +21.4042968750,21,-5.4392422536,2.6442442869,-5.9519311864,3.3120052297,,, +21.4062500000,21,-6.2910723265,2.6946202363,-6.8854942048,3.6537562442,,, +21.4082031250,21,-6.9814835511,2.6485872072,-7.6001229010,3.8877484228,,, +21.4101562500,21,-7.4903177005,2.5046627450,-8.0700003302,4.0057041819,,, +21.4121093750,21,-7.8037618157,2.2686843022,-8.2799852627,4.0053324665,,, +21.4140625000,21,-7.9146303321,1.9544397566,-8.2261595657,3.8907427945,,, +21.4160156250,21,-7.8229169719,1.5835075719,-7.9170758401,3.6725825418,,, +21.4179687500,21,-7.5353138640,1.1835537127,-7.3732278017,3.3670286381,,, +21.4199218750,21,-7.0630709734,0.7848497803,-6.6240818907,2.9932865211,,, +21.4218750000,21,-6.4197146658,0.4155026504,-5.7049499074,2.5704111465,,, +21.4238281250,21,-5.6198694630,0.0965616320,-4.6546450387,2.1144728495,,, +21.4257812500,21,-4.6796079501,-0.1612012759,-3.5137040702,1.6370869731,,, +21.4277343750,21,-3.6184498478,-0.3575277919,-2.3236530121,1.1459944266,,, +21.4296875000,21,-2.4617897717,-0.5003699848,-1.1266396287,0.6470339189,,, +21.4316406250,21,-1.2418849255,-0.6027552197,0.0362587393,0.1459859687,,, +21.4335937500,21,0.0029641400,-0.6798650128,1.1277054573,-0.3503430451,,, +21.4355468750,21,1.2304699505,-0.7467257434,2.1162282569,-0.8337625488,,, +21.4375000000,21,2.3972272664,-0.8173553610,2.9775341729,-1.2953205100,,, +21.4394531250,21,3.4615001431,-0.9050300587,3.6948210470,-1.7264240217,,, +21.4414062500,21,4.3855660232,-1.0215690446,4.2579987057,-2.1193076035,,, +21.4433593750,21,5.1385935110,-1.1749727111,4.6633516825,-2.4668977957,,, +21.4453125000,21,5.6999090894,-1.3671494023,4.9142074162,-2.7628752056,,, +21.4472656250,21,6.0609983642,-1.5930687839,5.0211512170,-3.0019740637,,, +21.4492187500,21,6.2255118346,-1.8408063790,5.0015688943,-3.1799973979,,, +21.4511718750,21,6.2071822864,-2.0913850927,4.8787090382,-3.2929869807,,, +21.4531250000,21,6.0254730686,-2.3187637726,4.6784283192,-3.3356236213,,, +21.4550781250,21,5.7008474414,-2.4920006772,4.4236993180,-3.3005127965,,, +21.4570312500,21,5.2532044201,-2.5806144761,4.1310567869,-3.1801759066,,, +21.4589843750,21,4.7034901604,-2.5609185774,3.8107967920,-2.9706998209,,, +21.4609375000,21,4.0746968263,-2.4202671854,3.4678116543,-2.6741657279,,, +21.4628906250,21,3.3910253464,-2.1586576449,3.1016191871,-2.2991310589,,, +21.4648437500,21,2.6772464098,-1.7882757416,2.7077327545,-1.8602049716,,, +21.4667968750,21,1.9588630791,-1.3309369875,2.2808383448,-1.3769157413,,, +21.4687500000,21,1.2620485679,-0.8147203007,1.8180551769,-0.8721078749,,, +21.4707031250,21,0.6128229288,-0.2719518124,1.3215930594,-0.3707157194,,, +21.4726562500,21,0.0353842500,0.2620558821,0.8003956844,0.1014118130,,, +21.4746093750,21,-0.4499002332,0.7517467163,0.2700631867,0.5195548506,,, +21.4765625000,21,-0.8278177904,1.1652924394,-0.2484094665,0.8625395680,,, +21.4785156250,21,-1.0883994646,1.4770029019,-0.7299752158,1.1139618558,,, +21.4804687500,21,-1.2259720598,1.6672340495,-1.1467627926,1.2618273458,,, +21.4824218750,21,-1.2387060997,1.7224391801,-1.4704118481,1.2984546586,,, +21.4843750000,21,-1.1301825992,1.6370450816,-1.6761621383,1.2220070292,,, +21.4863281250,21,-0.9119616615,1.4161412844,-1.7470944128,1.0387747044,,, +21.4882812500,21,-0.6046949452,1.0774120177,-1.6768872115,0.7645498736,,, +21.4902343750,21,-0.2362501452,0.6502872115,-1.4702735856,0.4235572916,,, +21.4921875000,21,0.1619831248,0.1724676333,-1.1415239836,0.0454352048,,, +21.4941406250,21,0.5581989758,-0.3134205718,-0.7126933626,-0.3375161681,,, +21.4960937500,21,0.9225907702,-0.7629247226,-0.2122193152,-0.6927160910,,, +21.4980468750,21,1.2299145227,-1.1342621143,0.3268360860,-0.9904206624,,, +21.5000000000,21,1.4618985172,-1.3932882591,0.8691514943,-1.2070241312,,, +21.5019531250,21,1.6089909014,-1.5174161825,1.3797271338,-1.3276201016,,, +21.5039062500,21,1.6708748705,-1.4986054609,1.8263121293,-1.3476727490,,, +21.5058593750,21,1.6552502908,-1.3446940195,2.1819037918,-1.2732721066,,, +21.5078125000,21,1.5753220310,-1.0774081957,2.4270710433,-1.1193174515,,, +21.5097656250,21,1.4471180034,-0.7275890141,2.5515180135,-0.9062774008,,, +21.5117187500,21,1.2870543173,-0.3298022609,2.5546673048,-0.6567227032,,, +21.5136718750,21,1.1090499414,0.0820204121,2.4440408497,-0.3921646118,,, +21.5156250000,21,0.9214767081,0.4771423272,2.2312810723,-0.1306694919,,, +21.5175781250,21,0.7259245920,0.8290902737,1.9288142751,0.1141500339,,, +21.5195312500,21,0.5178651059,1.1164021806,1.5483002486,0.3332881562,,, +21.5214843750,21,0.2872000804,1.3240932264,1.0986472485,0.5228950215,,, +21.5234375000,21,0.0193666716,1.4449995200,0.5844371189,0.6845631657,,, +21.5253906250,21,-0.3013093020,1.4791723083,0.0078515620,0.8238167894,,, +21.5273437500,21,-0.6882269233,1.4324288860,-0.6276885520,0.9481526636,,, +21.5292968750,21,-1.1518105483,1.3167885244,-1.3161345722,1.0669816520,,, +21.5312500000,21,-1.6998612346,1.1515502180,-2.0488542249,1.1922762224,,, +21.5332031250,21,-2.3357672789,0.9613559072,-2.8133316044,1.3369777354,,, +21.5351562500,21,-3.0551229616,0.7719009221,-3.5917177829,1.5116985218,,, +21.5371093750,21,-3.8439914855,0.6067698231,-4.3615928335,1.7225871612,,, +21.5390625000,21,-4.6794308747,0.4858613419,-5.0980817039,1.9707858282,,, +21.5410156250,21,-5.5304912458,0.4243925590,-5.7759095137,2.2523339577,,, +21.5429687500,21,-6.3586521922,0.4317111576,-6.3706984423,2.5577687300,,, +21.5449218750,21,-7.1179330946,0.5084295682,-6.8585675060,2.8707685174,,, +21.5468750000,21,-7.7564447925,0.6436982124,-7.2152833460,3.1673654106,,, +21.5488281250,21,-8.2207510334,0.8170398699,-7.4168963196,3.4183857721,,, +21.5507812500,21,-8.4615186944,1.0039433752,-7.4409428482,3.5941774174,,, +21.5527343750,21,-8.4386592811,1.1811005867,-7.2676639319,3.6689834813,,, +21.5546875000,21,-8.1254814187,1.3300825748,-6.8822888519,3.6242266951,,, +21.5566406250,21,-7.5103690911,1.4390970043,-6.2768859112,3.4499822294,,, +21.5585937500,21,-6.5953898181,1.5023678425,-5.4503804143,3.1441841099,,, +21.5605468750,21,-5.3943292491,1.5182575315,-4.4094858856,2.7110343957,,, +21.5625000000,21,-3.9318456060,1.4867141221,-3.1713707057,2.1595085020,,, +21.5644531250,21,-2.2436000862,1.4064955370,-1.7645152177,1.5020676376,,, +21.5664062500,21,-0.3773461751,1.2743429353,-0.2268909380,0.7546114919,,, +21.5683593750,21,1.6059891065,1.0870037112,1.3960930372,-0.0621939081,,, +21.5703125000,21,3.6325716916,0.8445650080,3.0531705333,-0.9214208685,,, +21.5722656250,21,5.6176504436,0.5532696019,4.6888217694,-1.7892441385,,, +21.5742187500,21,7.4692697208,0.2263501517,6.2437909974,-2.6258558111,,, +21.5761718750,21,9.0938400214,-0.1177611190,7.6546546049,-3.3882924391,,, +21.5781250000,21,10.4036809387,-0.4589847501,8.8557557614,-4.0348495298,,, +21.5800781250,21,11.3253757649,-0.7789620198,9.7840641044,-4.5297389216,,, +21.5820312500,21,11.8070913863,-1.0634239382,10.3839992268,-4.8468950686,,, +21.5839843750,21,11.8238754656,-1.3043942862,10.6121917525,-4.9729854261,,, +21.5859375000,21,11.3800500843,-1.5016940008,10.4433978944,-4.9090758392,,, +21.5878906250,21,10.5080692817,-1.6622030180,9.8752495699,-4.6699425360,,, +21.5898437500,21,9.2645794549,-1.7976134986,8.9296073249,-4.2816118892,,, +21.5917968750,21,7.7248876863,-1.9221452747,7.6516361445,-3.7782844205,,, +21.5937500000,21,5.9765053440,-2.0496213877,6.1072876545,-3.1985977674,,, +21.5957031250,21,4.1129382241,-2.1898009906,4.3785345697,-2.5815815874,,, +21.5976562500,21,2.2290541834,-2.3461671403,2.5576469104,-1.9638595725,,, +21.5996093750,21,0.4172429828,-2.5158330092,0.7413945231,-1.3781571827,,, +21.6015625000,21,-1.2373146225,-2.6897124389,-0.9762905003,-0.8515994862,,, +21.6035156250,21,-2.6622373748,-2.8527471361,-2.5126967457,-0.4037175583,,, +21.6054687500,21,-3.8033367832,-2.9858908288,-3.8028637287,-0.0454064112,,, +21.6074218750,21,-4.6287636458,-3.0694113592,-4.8029171209,0.2209872599,,, +21.6093750000,21,-5.1305130615,-3.0845850300,-5.4905692615,0.4013798319,,, +21.6113281250,21,-5.3219905517,-3.0129963758,-5.8627656587,0.5093919890,,, +21.6132812500,21,-5.2325855309,-2.8361935643,-5.9313370381,0.5645313944,,, +21.6152343750,21,-4.9026952822,-2.5377439510,-5.7197292330,0.5893890188,,, +21.6171875000,21,-4.3807627981,-2.1072400595,-5.2619491859,0.6066361653,,, +21.6191406250,21,-3.7200099250,-1.5447504788,-4.6011229569,0.6356929530,,, +21.6210937500,21,-2.9731721980,-0.8639078406,-3.7864963056,0.6893288891,,, +21.6230468750,21,-2.1869597352,-0.0923994624,-2.8700204147,0.7714195788,,, +21.6250000000,21,-1.3987337360,0.7301809430,-1.9027158291,0.8767598365,,, +21.6269531250,21,-0.6364132499,1.5563154584,-0.9318876363,0.9929173022,,, +21.6289062500,21,0.0787713668,2.3356270049,-0.0010980953,1.1036572538,,, +21.6308593750,21,0.7285886468,3.0205400969,0.8490501723,1.1929981490,,, +21.6328125000,21,1.2953856069,3.5718426800,1.5823224013,1.2487365583,,, +21.6347656250,21,1.7611669362,3.9629851975,2.1691115846,1.2648181005,,, +21.6367187500,21,2.1073731067,4.1814149765,2.5877190927,1.2420412807,,, +21.6386718750,21,2.3151016683,4.2272829409,2.8248996066,1.1873439396,,, +21.6406250000,21,2.3656371683,4.1119816690,2.8747330129,1.1129258643,,, +21.6425781250,21,2.2414806258,3.8559815521,2.7357439127,1.0348832455,,, +21.6445312500,21,1.9284078612,3.4845795065,2.4093084066,0.9704494653,,, +21.6464843750,21,1.4182919423,3.0235943935,1.9008130047,0.9348979146,,, +21.6484375000,21,0.7115102787,2.4965008590,1.2217513458,0.9392735806,,, +21.6503906250,21,-0.1815728297,1.9231479661,0.3916231252,0.9892214197,,, +21.6523437500,21,-1.2392169664,1.3210668461,-0.5602430131,1.0851029715,,, +21.6542968750,21,-2.4264993778,0.7087901625,-1.5937958769,1.2229551672,,, +21.6562500000,21,-3.6936837355,0.1082186196,-2.6589164914,1.3950735502,,, +21.6582031250,21,-4.9756534411,-0.4561734027,-3.6968553211,1.5894518140,,, +21.6601562500,21,-6.1932115277,-0.9607066220,-4.6425757921,1.7886461527,,, +21.6621093750,21,-7.2567147477,-1.3863047942,-5.4290684872,1.9692798137,,, +21.6640625000,21,-8.0722950680,-1.7210727632,-5.9932353822,2.1030786680,,, +21.6660156250,21,-8.5508987655,-1.9612383623,-6.2822055122,2.1596972481,,, +21.6679687500,21,-8.6192693910,-2.1107771774,-6.2594698631,2.1108631399,,, +21.6699218750,21,-8.2301441453,-2.1794099724,-5.9092516595,1.9350035689,,, +21.6718750000,21,-7.3688394746,-2.1790138736,-5.2373009435,1.6213117154,,, +21.6738281250,21,-6.0553907041,-2.1199992334,-4.2688902779,1.1722199187,,, +21.6757812500,21,-4.3428737812,-2.0093265583,-3.0458079040,0.6037188754,,, +21.6777343750,21,-2.3129150464,-1.8512868099,-1.6229766343,-0.0566565822,,, +21.6796875000,21,-0.0698307947,-1.6503887734,-0.0660314721,-0.7733286080,,, +21.6816406250,21,2.2659810140,-1.4137194045,1.5494033256,-1.5061582759,,, +21.6835937500,21,4.5662355266,-1.1513025481,3.1397313540,-2.2135363853,,, +21.6855468750,21,6.7044709147,-0.8744008788,4.6192632491,-2.8550713097,,, +21.6875000000,21,8.5656573627,-0.5920805723,5.9080041574,-3.3934291274,,, +21.6894531250,21,10.0538854047,-0.3079962996,6.9384595717,-3.7955882608,,, +21.6914062500,21,11.0970589494,-0.0195073155,7.6606623816,-4.0341400020,,, +21.6933593750,21,11.6495002613,0.2812590153,8.0450937951,-4.0887635984,,, +21.6953125000,21,11.6940774327,0.6055455352,8.0830789444,-3.9478799768,,, +21.6972656250,21,11.2439606165,0.9643150664,7.7858411050,-3.6110194338,,, +21.6992187500,21,10.3427766154,1.3620284799,7.1832306896,-3.0918651842,,, +21.7011718750,21,9.0606336584,1.7916614142,6.3198441398,-2.4192033808,,, +21.7031250000,21,7.4853452509,2.2347540291,5.2479651466,-1.6336987487,,, +21.7050781250,21,5.7135125063,2.6636036687,4.0225272747,-0.7836156408,,, +21.7070312500,21,3.8447706918,3.0427728570,2.7005650166,0.0779456558,,, +21.7089843750,21,1.9766011102,3.3326909871,1.3411387653,0.8966191466,,, +21.7109375000,21,0.1980020370,3.4961044189,0.0032518521,1.6221537337,,, +21.7128906250,21,-1.4165610277,3.5041528022,-1.2574296900,2.2135321913,,, +21.7148437500,21,-2.8117286164,3.3402031091,-2.3925986741,2.6424960966,,, +21.7167968750,21,-3.9533429142,3.0002373711,-3.3649535548,2.8945248924,,, +21.7187500000,21,-4.8277166451,2.4897816201,-4.1498306031,2.9671153579,,, +21.7207031250,21,-5.4392511624,1.8212394301,-4.7354525137,2.8676550336,,, +21.7226562500,21,-5.8072484555,1.0141725619,-5.1226427515,2.6124303411,,, +21.7246093750,21,-5.9619245154,0.0962673352,-5.3226383030,2.2256565304,,, +21.7265625000,21,-5.9403709082,-0.8963894417,-5.3534576627,1.7381333808,,, +21.7285156250,21,-5.7833141305,-1.9186003325,-5.2374484445,1.1864102227,,, +21.7304687500,21,-5.5322183526,-2.9160351696,-4.9991635510,0.6117442116,,, +21.7324218750,21,-5.2258503447,-3.8277152991,-4.6614200836,0.0576291220,,, +21.7343750000,21,-4.8966985237,-4.5896101790,-4.2418555636,-0.4332571381,,, +21.7363281250,21,-4.5685312025,-5.1389050887,-3.7528221092,-0.8219771699,,, +21.7382812500,21,-4.2551819470,-5.4218274359,-3.2029352534,-1.0775230932,,, +21.7402343750,21,-3.9600931141,-5.4050784104,-2.5982059519,-1.1824891869,,, +21.7421875000,21,-3.6768830930,-5.0853606854,-1.9435176494,-1.1374575004,,, +21.7441406250,21,-3.3907968101,-4.4915129114,-1.2448318922,-0.9614845623,,, +21.7460937500,21,-3.0812225140,-3.6782817532,-0.5112736053,-0.6881695867,,, +21.7480468750,21,-2.7257897970,-2.7149660803,0.2436668892,-0.3587002299,,, +21.7500000000,21,-2.3050309344,-1.6754366218,1.0022733331,-0.0153872198,,, +21.7519531250,21,-1.8068340961,-0.6342057347,1.7428705835,0.3017983005,,, +21.7539062500,21,-1.2305714390,0.3355945705,2.4389269208,0.5576673886,,, +21.7558593750,21,-0.5890441441,1.1686008758,3.0590572662,0.7255863665,,, +21.7578125000,21,0.0934006986,1.8155060116,3.5703947665,0.7907708775,,, +21.7597656250,21,0.7851707591,2.2473973005,3.9434151821,0.7507972885,,, +21.7617187500,21,1.4516798457,2.4556003524,4.1544216572,0.6139934605,,, +21.7636718750,21,2.0586634268,2.4498113371,4.1857908885,0.3973652402,,, +21.7656250000,21,2.5747193144,2.2558187181,4.0267715086,0.1245886287,,, +21.7675781250,21,2.9738673722,1.9119513030,3.6751510301,-0.1766337003,,, +21.7695312500,21,3.2391035363,1.4647308635,3.1392348633,-0.4779543973,,, +21.7714843750,21,3.3659159050,0.9656019901,2.4410368089,-0.7532470358,,, +21.7734375000,21,3.3634264999,0.4681167664,1.6187211941,-0.9804053475,,, +21.7753906250,21,3.2523358936,0.0243562172,0.7241682644,-1.1423133244,,, +21.7773437500,21,3.0608475494,-0.3198248956,-0.1834397711,-1.2276138041,,, +21.7792968750,21,2.8208304210,-0.5316013900,-1.0435231292,-1.2325593242,,, +21.7812500000,21,2.5652104868,-0.5969508115,-1.7990153744,-1.1628118817,,, +21.7832031250,21,2.3253090501,-0.5210640381,-2.4020819129,-1.0326184105,,, +21.7851562500,21,2.1274066354,-0.3254134959,-2.8188723908,-0.8621128429,,, +21.7871093750,21,1.9894601309,-0.0442965587,-3.0311677785,-0.6744659707,,, +21.7890625000,21,1.9189738786,0.2794863609,-3.0359336948,-0.4930545665,,, +21.7910156250,21,1.9120063223,0.5993199460,-2.8437642982,-0.3388695725,,, +21.7929687500,21,1.9527940517,0.8702777693,-2.4764612620,-0.2277601462,,, +21.7949218750,21,2.0150580382,1.0558991889,-1.9646477391,-0.1676528102,,, +21.7968750000,21,2.0661069218,1.1330139373,-1.3456791401,-0.1576930567,,, +21.7988281250,21,2.0718468556,1.0929300141,-0.6617611898,-0.1894607236,,, +21.8007812500,21,2.0006017368,0.9410989053,0.0409473100,-0.2484884305,,, +21.8027343750,21,1.8264440539,0.6960200169,0.7130968176,-0.3159736157,,, +21.8046875000,21,1.5331699492,0.3866196722,1.3054873814,-0.3714932622,,, +21.8066406250,21,1.1176654076,0.0489626855,1.7746132322,-0.3958603406,,, +21.8085937500,21,0.5904832255,-0.2758378050,2.0873330860,-0.3724072633,,, +21.8105468750,21,-0.0257679685,-0.5426681808,2.2244486545,-0.2869799637,,, +21.8125000000,21,-0.6984099494,-0.7047435634,2.1840923583,-0.1284167304,,, +21.8144531250,21,-1.3877007833,-0.7178503239,1.9826284126,0.1104437986,,, +21.8164062500,21,-2.0512107102,-0.5450608420,1.6514376676,0.4320698129,,, +21.8183593750,21,-2.6478660245,-0.1630396053,1.2314217501,0.8326918458,,, +21.8203125000,21,-3.1406768523,0.4281786460,0.7669882690,1.2986251450,,, +21.8222656250,21,-3.4978950896,1.1960948218,0.3006969391,1.8023614547,,, +21.8242187500,21,-3.6927577572,2.0741045203,-0.1296361420,2.3017301386,,, +21.8261718750,21,-3.7035820941,2.9690674484,-0.4915015215,2.7436002212,,, +21.8281250000,21,-3.5161267193,3.7753621072,-0.7583900488,3.0715150770,,, +21.8300781250,21,-3.1282014993,4.3901993142,-0.9115125357,3.2347401830,,, +21.8320312500,21,-2.5546669589,4.7255490678,-0.9411989059,3.1958048132,,, +21.8339843750,21,-1.8299406490,4.7171861288,-0.8476966508,2.9357655485,,, +21.8359375000,21,-1.0056636260,4.3324251725,-0.6419337025,2.4571355543,,, +21.8378906250,21,-0.1437430886,3.5746445556,-0.3449327414,1.7836171572,,, +21.8398437500,21,0.6924520141,2.4832625910,0.0151286893,0.9569523551,,, +21.8417968750,21,1.4455316549,1.1293712109,0.4060995726,0.0321499925,,, +21.8437500000,21,2.0688388940,-0.3928623696,0.7941814620,-0.9283757861,,, +21.8457031250,21,2.5288899043,-1.9763576773,1.1468839895,-1.8606191003,,, +21.8476562500,21,2.8054951312,-3.5094156202,1.4354215071,-2.7030699958,,, +21.8496093750,21,2.8903551346,-4.8822975902,1.6352412680,-3.3994088188,,, +21.8515625000,21,2.7864611471,-5.9943296596,1.7274958602,-3.9017509506,,, +21.8535156250,21,2.5081110107,-6.7626723690,1.7014015130,-4.1749257217,,, +21.8554687500,21,2.0788339945,-7.1307451761,1.5534479534,-4.1998065493,,, +21.8574218750,21,1.5279644936,-7.0732980751,1.2845997900,-3.9745158477,,, +21.8593750000,21,0.8901020787,-6.5977700338,0.9004542583,-3.5148931440,,, +21.8613281250,21,0.2078273980,-5.7423775732,0.4141523840,-2.8545672916,,, +21.8632812500,21,-0.4674334429,-4.5714891278,-0.1514687789,-2.0430553368,,, +21.8652343750,21,-1.0797846900,-3.1703121072,-0.7636238943,-1.1416609975,,, +21.8671875000,21,-1.5765898401,-1.6390354362,-1.3821385252,-0.2178909685,,, +21.8691406250,21,-1.9166733292,-0.0845093461,-1.9655041576,0.6615367820,,, +21.8710937500,21,-2.0774108821,1.3879261536,-2.4771380525,1.4372250144,,, +21.8730468750,21,-2.0585542216,2.6781141655,-2.8880031056,2.0602534447,,, +21.8750000000,21,-1.8810610576,3.6939147565,-3.1762456256,2.4931310578,,, +21.8769531250,21,-1.5816859917,4.3585956963,-3.3262093091,2.7114531055,,, +21.8789062500,21,-1.2065833411,4.6203560226,-3.3289440372,2.7062643237,,, +21.8808593750,21,-0.8074736500,4.4608697274,-3.1866563309,2.4869075058,,, +21.8828125000,21,-0.4391469658,3.9019923957,-2.9182493688,2.0834696947,,, +21.8847656250,21,-0.1538158036,3.0066343758,-2.5589734628,1.5452152137,,, +21.8867187500,21,0.0064826509,1.8717226284,-2.1542901389,0.9344245122,,, +21.8886718750,21,0.0134088879,0.6174089940,-1.7535722891,0.3198479205,,, +21.8906250000,21,-0.1488865067,-0.6246682693,-1.4044686708,-0.2286272430,,, +21.8925781250,21,-0.4845121390,-1.7252466912,-1.1460933097,-0.6465138536,,, +21.8945312500,21,-0.9842868555,-2.5711411679,-1.0030829336,-0.8819778384,,, +21.8964843750,21,-1.6243553779,-3.0748429986,-0.9826652139,-0.9010053587,,, +21.8984375000,21,-2.3656634420,-3.1816864662,-1.0736058210,-0.6910645493,,, +21.9003906250,21,-3.1540948546,-2.8758539047,-1.2470551986,-0.2639451632,,, +21.9023437500,21,-3.9224618494,-2.1819450816,-1.4599080839,0.3442332247,,, +21.9042968750,21,-4.5946122597,-1.1617787071,-1.6585225959,1.0760651138,,, +21.9062500000,21,-5.0917122491,0.0910772226,-1.7824459091,1.8577637975,,, +21.9082031250,21,-5.3412345369,1.4601190510,-1.7710303438,2.6066741866,,, +21.9101562500,21,-5.2869404259,2.8190186578,-1.5725249564,3.2412473521,,, +21.9121093750,21,-4.8968833632,4.0447957253,-1.1519357782,3.6903311130,,, +21.9140625000,21,-4.1674887160,5.0276307386,-0.4960775845,3.8994178475,,, +21.9160156250,21,-3.1228495132,5.6785582285,0.3843702197,3.8341440206,,, +21.9179687500,21,-1.8103490680,5.9359342349,1.4562412897,3.4818570267,,, +21.9199218750,21,-0.2951026443,5.7698360311,2.6670676174,2.8517416100,,, +21.9218750000,21,1.3456700302,5.1835175451,3.9480003982,1.9735034836,,, +21.9238281250,21,3.0288658617,4.2109013189,5.2181829994,0.8939081584,,, +21.9257812500,21,4.6721700803,2.9110166770,6.3926659614,-0.3283662893,,, +21.9277343750,21,6.1990088485,1.3625163272,7.3907801105,-1.6272416508,,, +21.9296875000,21,7.5402304890,-0.3403565016,8.1419677602,-2.9318649040,,, +21.9316406250,21,8.6348786833,-2.0918194502,8.5910490029,-4.1689152197,,, +21.9335937500,21,9.4326231793,-3.7804439577,8.7026767854,-5.2663702087,,, +21.9355468750,21,9.8964850425,-5.2971574568,8.4618750506,-6.1583362080,,, +21.9375000000,21,10.0043987624,-6.5436665631,7.8727843877,-6.7896469709,,, +21.9394531250,21,9.7505242202,-7.4392826113,6.9584663855,-7.1196183071,,, +21.9414062500,21,9.1463623519,-7.9264310695,5.7590123542,-7.1250726657,,, +21.9433593750,21,8.2206253548,-7.9759263864,4.3268893583,-6.8027722312,,, +21.9453125000,21,7.0179476176,-7.5899998386,2.7232505390,-6.1703739414,,, +21.9472656250,21,5.5964353435,-6.8008852279,1.0159999762,-5.2648569306,,, +21.9492187500,21,4.0235114825,-5.6663384840,-0.7228848937,-4.1388594983,,, +21.9511718750,21,2.3713909464,-4.2637574458,-2.4200354681,-2.8562101539,,, +21.9531250000,21,0.7140794618,-2.6830960422,-4.0019032873,-1.4874329207,,, +21.9550781250,21,-0.8750891841,-1.0188594142,-5.3966652869,-0.1049873913,,, +21.9570312500,21,-2.3275719546,0.6367467006,-6.5383080303,1.2215469105,,, +21.9589843750,21,-3.5845055545,2.1967109155,-7.3713991422,2.4286553787,,, +21.9609375000,21,-4.5993481570,3.5802376029,-7.8558948300,3.4603798491,,, +21.9628906250,21,-5.3388185041,4.7162550666,-7.9725670886,4.2704232442,,, +21.9648437500,21,-5.7852566219,5.5489787127,-7.7269843106,4.8257243869,,, +21.9667968750,21,-5.9392632841,6.0432259683,-7.1489791621,5.1099436378,,, +21.9687500000,21,-5.8195200305,6.1883038583,-6.2887275149,5.1252192668,,, +21.9707031250,21,-5.4606808593,5.9994469382,-5.2115993147,4.8920455150,,, +21.9726562500,21,-4.9110837417,5.5167905998,-3.9913837935,4.4478726825,,, +21.9746093750,21,-4.2295540973,4.8015740919,-2.7034383188,3.8440491832,,, +21.9765625000,21,-3.4807137656,3.9280018255,-1.4210165422,3.1401889253,,, +21.9785156250,21,-2.7294069347,2.9724661027,-0.2136588533,2.3969848198,,, +21.9804687500,21,-2.0345717179,2.0056878631,0.8556681483,1.6702190566,,, +21.9824218750,21,-1.4430382161,1.0895838610,1.7344454665,1.0070160448,,, +21.9843750000,21,-0.9848572760,0.2753388327,2.3840844736,0.4432204571,,, +21.9863281250,21,-0.6719796595,-0.3985838235,2.7826979732,0.0019317804,,, +21.9882812500,21,-0.5007013980,-0.9064532673,2.9258052175,-0.3056533001,,, +21.9902343750,21,-0.4564544783,-1.2349932736,2.8246213735,-0.4784000574,,, +21.9921875000,21,-0.5189756347,-1.3855405106,2.5038612422,-0.5244320358,,, +21.9941406250,21,-0.6664117193,-1.3744472219,1.9995324795,-0.4598522562,,, +21.9960937500,21,-0.8774103667,-1.2280996755,1.3559854678,-0.3055591728,,, +21.9980468750,21,-1.1308959184,-0.9774168456,0.6235081451,-0.0846318793,,, +22.0000000000,22,-1.4045761141,-0.6556001273,-0.1430357480,0.1782543245,33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000:10.0000000000:11.0000000000:12.0000000000:13.0000000000:14.0000000000:15.0000000000:19.0000000000:20.0000000000:21.0000000000:22.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +22.0019531250,22,-1.6743189340,-0.2966144052,-0.8873716708,0.4573877943,,, +22.0039062500,22,-1.9154907096,0.0665936391,-1.5569438842,0.7274264372,,, +22.0058593750,22,-2.1050996122,0.4032168550,-2.1061439036,0.9647413569,,, +22.0078125000,22,-2.2232696990,0.6863605008,-2.4972415254,1.1488045409,,, +22.0097656250,22,-2.2540640427,0.8957628507,-2.7016263833,1.2638105108,,, +22.0117187500,22,-2.1867744044,1.0190721033,-2.7015784492,1.2997719622,,, +22.0136718750,22,-2.0177746767,1.0508869582,-2.4919849170,1.2527320168,,, +22.0156250000,22,-1.7512898152,0.9912036833,-2.0821496631,1.1243105521,,, +22.0175781250,22,-1.3981622254,0.8441074495,-1.4965996978,0.9206508622,,, +22.0195312500,22,-0.9739244400,0.6160512829,-0.7740758535,0.6508966194,,, +22.0214843750,22,-0.4976929009,0.3128018678,0.0341243393,0.3253033430,,, +22.0234375000,22,0.0081984692,-0.0634632835,0.8667342913,-0.0463310119,,, +22.0253906250,22,0.5187735412,-0.5131315770,1.6585737797,-0.4544627519,,, +22.0273437500,22,1.0079401766,-1.0343800441,2.3493838776,-0.8881617903,,, +22.0292968750,22,1.4506254423,-1.6184758304,2.8910314747,-1.3336972055,,, +22.0312500000,22,1.8243770665,-2.2474378409,3.2513602937,-1.7740265361,,, +22.0332031250,22,2.1106586112,-2.8947165248,3.4158037945,-2.1896025181,,, +22.0351562500,22,2.2970514860,-3.5270047443,3.3868619643,-2.5600132569,,, +22.0371093750,22,2.3797201091,-4.1053075167,3.1819930170,-2.8653338793,,, +22.0390625000,22,2.3643749777,-4.5874097324,2.8307599457,-3.0876154034,,, +22.0410156250,22,2.2654989318,-4.9324449706,2.3700971915,-3.2127509808,,, +22.0429687500,22,2.1046501165,-5.1052017547,1.8377320671,-3.2318639509,,, +22.0449218750,22,1.9082662808,-5.0793885594,1.2669682796,-3.1420378424,,, +22.0468750000,22,1.7044493302,-4.8394801369,0.6848999540,-2.9460529441,,, +22.0488281250,22,1.5174000162,-4.3811601671,0.1123777865,-2.6506440095,,, +22.0507812500,22,1.3606806116,-3.7124700659,-0.4359506453,-2.2646865790,,, +22.0527343750,22,1.2341323782,-2.8556479005,-0.9503858229,-1.7990170584,,, +22.0546875000,22,1.1263981845,-1.8462978104,-1.4234538954,-1.2669544429,,, +22.0566406250,22,1.0197846675,-0.7294514948,-1.8476270878,-0.6841376999,,, +22.0585937500,22,0.8953961107,0.4438739093,-2.2136523749,-0.0686907067,,, +22.0605468750,22,0.7389778332,1.6184765767,-2.5090700017,0.5575720011,,, +22.0625000000,22,0.5460627761,2.7370377800,-2.7183225677,1.1683345746,,, +22.0644531250,22,0.3240262602,3.7425476629,-2.8246210012,1.7332530823,,, +22.0664062500,22,0.0906193500,4.5807335659,-2.8125193831,2.2196779256,,, +22.0683593750,22,-0.1298608764,5.2038295608,-2.6711475113,2.5958644489,,, +22.0703125000,22,-0.3105067826,5.5756618477,-2.3962599835,2.8348392226,,, +22.0722656250,22,-0.4243276332,5.6769521899,-1.9890964601,2.9178306445,,, +22.0742187500,22,-0.4469398585,5.5102178384,-1.4552241097,2.8375621258,,, +22.0761718750,22,-0.3612982329,5.1018843226,-0.8069562753,2.6009701227,,, +22.0781250000,22,-0.1628752109,4.4995761279,-0.0668977497,2.2297697696,,, +22.0800781250,22,0.1384744000,3.7667550261,0.7314294185,1.7585330369,,, +22.0820312500,22,0.5217902554,2.9770103188,1.5460688700,1.2307445429,,, +22.0839843750,22,0.9609908815,2.2068268002,2.3311890852,0.6931392056,,, +22.0859375000,22,1.4287850556,1.5265101895,3.0427731431,0.1898654327,,, +22.0878906250,22,1.8965491640,0.9915210512,3.6424735946,-0.2417051238,,, +22.0898437500,22,2.3328496231,0.6357105128,4.0988912872,-0.5737338905,,, +22.0917968750,22,2.7038418338,0.4675898203,4.3898615050,-0.7898823333,,, +22.0937500000,22,2.9766646344,0.4719058990,4.5063261798,-0.8857978405,,, +22.0957031250,22,3.1248420611,0.6165437875,4.4537523138,-0.8677057612,,, +22.0976562500,22,3.1321776862,0.8589892908,4.2493489828,-0.7506265186,,, +22.0996093750,22,2.9926539888,1.1474962080,3.9174872138,-0.5577141979,,, +22.1015625000,22,2.7090114374,1.4212243895,3.4855171334,-0.3196314579,,, +22.1035156250,22,2.2932337642,1.6147049419,2.9808403006,-0.0725292749,,, +22.1054687500,22,1.7672727930,1.6655614082,2.4302875030,0.1454245320,,, +22.1074218750,22,1.1613735451,1.5235115487,1.8606407723,0.2989645836,,, +22.1093750000,22,0.5107939025,1.1586089714,1.2974138047,0.3608716672,,, +22.1113281250,22,-0.1480896631,0.5663339049,0.7621722978,0.3158347489,,, +22.1132812500,22,-0.7833861150,-0.2288506435,0.2697803035,0.1641797862,,, +22.1152343750,22,-1.3736758951,-1.1717324188,-0.1747151006,-0.0751221182,,, +22.1171875000,22,-1.9099552827,-2.1831094654,-0.5776463308,-0.3670045750,,, +22.1191406250,22,-2.3929904424,-3.1749815355,-0.9546245523,-0.6685911724,,, +22.1210937500,22,-2.8296497455,-4.0635146997,-1.3270334953,-0.9367864943,,, +22.1230468750,22,-3.2290449857,-4.7752895574,-1.7182609467,-1.1327014976,,, +22.1250000000,22,-3.5975631192,-5.2511035618,-2.1477836508,-1.2253228694,,, +22.1269531250,22,-3.9346458803,-5.4497409366,-2.6247734503,-1.1949088371,,, +22.1289062500,22,-4.2317455459,-5.3523084764,-3.1447892752,-1.0354903430,,, +22.1308593750,22,-4.4745106989,-4.9662062590,-3.6894762278,-0.7560092363,,, +22.1328125000,22,-4.6464863447,-4.3247086336,-4.2282502439,-0.3787760466,,, +22.1347656250,22,-4.7322897621,-3.4809849177,-4.7222826233,0.0645958266,,, +22.1367187500,22,-4.7194639062,-2.5009320748,-5.1297165007,0.5373741198,,, +22.1386718750,22,-4.5999918437,-1.4589742819,-5.4105415155,1.0003366116,,, +22.1406250000,22,-4.3721573085,-0.4351863769,-5.5314280155,1.4138834641,,, +22.1425781250,22,-4.0411303975,0.4902450114,-5.4700629664,1.7409699672,,, +22.1445312500,22,-3.6170235435,1.2440434413,-5.2171591906,1.9498208047,,, +22.1464843750,22,-3.1122363282,1.7654990559,-4.7761868084,2.0157008877,,, +22.1484375000,22,-2.5400637200,2.0119488963,-4.1620124464,1.9230340096,,, +22.1503906250,22,-1.9144431365,1.9642652031,-3.3987540727,1.6679193675,,, +22.1523437500,22,-1.2502656685,1.6297549863,-2.5171521287,1.2595968728,,, +22.1542968750,22,-0.5644405380,1.0421023265,-1.5529980642,0.7207717778,,, +22.1562500000,22,0.1225208492,0.2590767947,-0.5478230521,0.0870794332,,, +22.1582031250,22,0.7862453470,-0.6426775498,0.4505372457,-0.5953259317,,, +22.1601562500,22,1.4008271048,-1.5752491217,1.3906076057,-1.2742955769,,, +22.1621093750,22,1.9424372540,-2.4477689495,2.2218307080,-1.8970270038,,, +22.1640625000,22,2.3926173313,-3.1749397480,2.8990480484,-2.4153947736,,, +22.1660156250,22,2.7408660334,-3.6848590766,3.3879703789,-2.7907000168,,, +22.1679687500,22,2.9855345656,-3.9238654263,3.6704733426,-2.9963803221,,, +22.1699218750,22,3.1316953060,-3.8575342097,3.7457530877,-3.0177361162,,, +22.1718750000,22,3.1871460472,-3.4689945276,3.6275417310,-2.8496549711,,, +22.1738281250,22,3.1600454080,-2.7572861002,3.3412277022,-2.4949356831,,, +22.1757812500,22,3.0596434686,-1.7401588225,2.9216364335,-1.9658605566,,, +22.1777343750,22,2.8974806465,-0.4610111710,2.4094564118,-1.2879088900,,, +22.1796875000,22,2.6867035258,1.0084762553,1.8466643572,-0.5007184038,,, +22.1816406250,22,2.4409185827,2.5747040598,1.2731240255,0.3454266427,,, +22.1835937500,22,2.1742668401,4.1321715469,0.7249480492,1.1944036791,,, +22.1855468750,22,1.9016613288,5.5718743887,0.2339431839,1.9882074662,,, +22.1875000000,22,1.6377535717,6.7890832544,-0.1732049093,2.6710626301,,, +22.1894531250,22,1.3948546960,7.6921824662,-0.4764567468,3.1944250324,,, +22.1914062500,22,1.1811202348,8.2107984476,-0.6625486628,3.5215298786,,, +22.1933593750,22,0.9997099357,8.3019829788,-0.7239347328,3.6306417643,,, +22.1953125000,22,0.8485221346,7.9549885005,-0.6599632164,3.5174466216,,, +22.1972656250,22,0.7205417739,7.1937115493,-0.4794830558,3.1961182850,,, +22.1992187500,22,0.6054592635,6.0757999080,-0.2009597374,2.6982984222,,, +22.2011718750,22,0.4921288701,4.6892069419,0.1495194583,2.0705263147,,, +22.2031250000,22,0.3702485119,3.1451182152,0.5393887396,1.3702185662,,, +22.2050781250,22,0.2312160077,1.5637045712,0.9306558880,0.6585087239,,, +22.2070312500,22,0.0699849695,0.0559482262,1.2840743389,-0.0091834556,,, +22.2089843750,22,-0.1127969086,-1.2876847463,1.5658492130,-0.5894218879,,, +22.2109375000,22,-0.3111128533,-2.3991319929,1.7532210673,-1.0515937499,,, +22.2128906250,22,-0.5159191208,-3.2325927627,1.8371232848,-1.3770141089,,, +22.2148437500,22,-0.7168751731,-3.7654958479,1.8215937096,-1.5587460742,,, +22.2167968750,22,-0.9023286810,-3.9984872213,1.7208347241,-1.6015560735,,, +22.2187500000,22,-1.0580369138,-3.9537688710,1.5563487600,-1.5215397403,,, +22.2207031250,22,-1.1661041644,-3.6716948066,1.3545941534,-1.3448455911,,, +22.2226562500,22,-1.2054348487,-3.2059338541,1.1440039185,-1.1051620004,,, +22.2246093750,22,-1.1539556705,-2.6190496698,0.9519692860,-0.8407658036,,, +22.2265625000,22,-0.9926118965,-1.9787918621,0.8025002573,-0.5912761781,,, +22.2285156250,22,-0.7103805457,-1.3535342404,0.7140269688,-0.3936314094,,, +22.2304687500,22,-0.3082383331,-0.8068239930,0.6977023068,-0.2780211720,,, +22.2324218750,22,0.1992580454,-0.3917574087,0.7567910006,-0.2646112648,,, +22.2343750000,22,0.7848731782,-0.1453464747,0.8864008794,-0.3611686367,,, +22.2363281250,22,1.4116902561,-0.0845821059,1.0733210587,-0.5622621011,,, +22.2382812500,22,2.0355290895,-0.2067077722,1.2955432394,-0.8502680495,,, +22.2402343750,22,2.6052169651,-0.4929099834,1.5205402666,-1.1972226598,,, +22.2421875000,22,3.0656800549,-0.9115779119,1.7053899497,-1.5675108119,,, +22.2441406250,22,3.3671001560,-1.4203332629,1.8029312217,-1.9222296533,,, +22.2460937500,22,3.4745372198,-1.9697357728,1.7716782855,-2.2245623323,,, +22.2480468750,22,3.3721706592,-2.5079873543,1.5834007291,-2.4436527834,,, +22.2500000000,22,3.0621137429,-2.9833091243,1.2258191505,-2.5553464283,,, +22.2519531250,22,2.5600900873,-3.3461510696,0.7022057876,-2.5416741514,,, +22.2539062500,22,1.8902359352,-3.5549194133,0.0296068019,-2.3916778054,,, +22.2558593750,22,1.0814683801,-3.5816898967,-0.7639137354,-2.1027854617,,, +22.2578125000,22,0.1666630738,-3.4136870457,-1.6420606817,-1.6811897157,,, +22.2597656250,22,-0.8165321283,-3.0520635103,-2.5626202060,-1.1415417831,,, +22.2617187500,22,-1.8249204784,-2.5096774151,-3.4798940321,-0.5061554036,,, +22.2636718750,22,-2.8096987803,-1.8100631168,-4.3466379889,0.1954759723,,, +22.2656250000,22,-3.7177661407,-0.9892311027,-5.1144823890,0.9262986528,,, +22.2675781250,22,-4.4950014742,-0.0951498942,-5.7347454367,1.6431528953,,, +22.2695312500,22,-5.0909068766,0.8180793467,-6.1618204269,2.3012862938,,, +22.2714843750,22,-5.4638360387,1.6957075620,-6.3578128019,2.8589320042,,, +22.2734375000,22,-5.5865066060,2.4855666015,-6.2969834042,3.2809154921,,, +22.2753906250,22,-5.4499984753,3.1432023563,-5.9700517327,3.5426144422,,, +22.2773437500,22,-5.0640423370,3.6373942467,-5.3866508449,3.6327243494,,, +22.2792968750,22,-4.4541521103,3.9512256162,-4.5740059834,3.5527091034,,, +22.2812500000,22,-3.6577071286,4.0794357122,-3.5734132968,3.3140732037,,, +22.2832031250,22,-2.7200545751,4.0254733755,-2.4370506902,2.9355016536,,, +22.2851562500,22,-1.6912559277,3.8001127836,-1.2250197562,2.4409818642,,, +22.2871093750,22,-0.6244047815,3.4215583153,-0.0017074079,1.8592072560,,, +22.2890625000,22,0.4246825277,2.9156858880,1.1684056518,1.2235485373,,, +22.2910156250,22,1.3984136044,2.3154091387,2.2255243220,0.5713704942,,, +22.2929687500,22,2.2407044509,1.6589135445,3.1198352934,-0.0580565577,,, +22.2949218750,22,2.9016476843,0.9873730943,3.8157485934,-0.6263971629,,, +22.2968750000,22,3.3416373349,0.3425058817,4.2936006646,-1.0989531945,,, +22.2988281250,22,3.5350288561,-0.2364649180,4.5491237810,-1.4474673409,,, +22.3007812500,22,3.4739096758,-0.7158499042,4.5914514092,-1.6529628614,,, +22.3027343750,22,3.1706318370,-1.0702307033,4.4405729035,-1.7079809901,,, +22.3046875000,22,2.6574246387,-1.2855416579,4.1254925358,-1.6179049188,,, +22.3066406250,22,1.9829811344,-1.3613292972,3.6829048511,-1.4007712890,,, +22.3085937500,22,1.2069766039,-1.3104203077,3.1550909101,-1.0850708520,,, +22.3105468750,22,0.3936653083,-1.1566854276,2.5867751564,-0.7062872458,,, +22.3125000000,22,-0.3945538893,-0.9324273260,2.0215476492,-0.3032375052,,, +22.3144531250,22,-1.1029231310,-0.6747732078,1.4982240379,0.0858211504,,, +22.3164062500,22,-1.6884386230,-0.4202348064,1.0474799015,0.4273313822,,, +22.3183593750,22,-2.1212901875,-0.1994424784,0.6895575167,0.6954917457,,, +22.3203125000,22,-2.3842090271,-0.0340639871,0.4333096196,0.8734876700,,, +22.3222656250,22,-2.4711382746,0.0646804017,0.2760649785,0.9537046164,,, +22.3242187500,22,-2.3853537823,0.0954309829,0.2050627038,0.9367407440,,, +22.3261718750,22,-2.1378220269,0.0628330991,0.2008166125,0.8289453011,,, +22.3281250000,22,-1.7478078114,-0.0260669129,0.2398443300,0.6409218813,,, +22.3300781250,22,-1.2442111146,-0.1611390356,0.2961056547,0.3883486385,,, +22.3320312500,22,-0.6641307719,-0.3262295866,0.3436335765,0.0928293902,,, +22.3339843750,22,-0.0497129878,-0.4980868102,0.3593662543,-0.2187823844,,, +22.3359375000,22,0.5543804467,-0.6490384713,0.3238460643,-0.5165977808,,, +22.3378906250,22,1.1045946484,-0.7522237623,0.2222959916,-0.7715306989,,, +22.3398437500,22,1.5641360456,-0.7859183593,0.0479322545,-0.9594801905,,, +22.3417968750,22,1.9073840503,-0.7360312963,-0.1963530076,-1.0641733732,,, +22.3437500000,22,2.1212271686,-0.5985285050,-0.4999362286,-1.0788056691,,, +22.3457031250,22,2.2054986247,-0.3812707705,-0.8462724513,-1.0070710485,,, +22.3476562500,22,2.1732331887,-0.1034412720,-1.2130603712,-0.8629937224,,, +22.3496093750,22,2.0493824677,0.2071653776,-1.5728685776,-0.6691657177,,, +22.3515625000,22,1.8683479011,0.5170187515,-1.8939146379,-0.4544596803,,, +22.3535156250,22,1.6699090491,0.7887997730,-2.1407883402,-0.2515744400,,, +22.3554687500,22,1.4923386950,0.9846734043,-2.2779078115,-0.0928791058,,, +22.3574218750,22,1.3656237679,1.0727665471,-2.2758166243,-0.0047694111,,, +22.3593750000,22,1.3083526953,1.0336383206,-2.1167912719,-0.0034182158,,, +22.3613281250,22,1.3275152735,0.8631823677,-1.7981519516,-0.0933258117,,, +22.3632812500,22,1.4193503391,0.5721002811,-1.3333224168,-0.2678944299,,, +22.3652343750,22,1.5702536067,0.1829106639,-0.7503478845,-0.5111944930,,, +22.3671875000,22,1.7570663684,-0.2740624319,-0.0891441789,-0.7999786247,,, +22.3691406250,22,1.9476837719,-0.7630507751,0.6012779414,-1.1050344284,,, +22.3710937500,22,2.1034553680,-1.2436077097,1.2667236123,-1.3924658858,,, +22.3730468750,22,2.1831029896,-1.6730785192,1.8531974253,-1.6263591754,,, +22.3750000000,22,2.1472272342,-2.0110284245,2.3118337124,-1.7725915022,,, +22.3769531250,22,1.9632316022,-2.2225446619,2.6024346061,-1.8022596558,,, +22.3789062500,22,1.6103841081,-2.2802677471,2.6967334447,-1.6945618541,,, +22.3808593750,22,1.0840531561,-2.1674149135,2.5815845354,-1.4398384162,,, +22.3828125000,22,0.3983636256,-1.8816375220,2.2608398206,-1.0424054955,,, +22.3847656250,22,-0.4134993378,-1.4377350183,1.7557119049,-0.5219541216,,, +22.3867187500,22,-1.3024844313,-0.8683995900,1.1035292973,0.0873124738,,, +22.3886718750,22,-2.2097024108,-0.2226447965,0.3539264316,0.7397210437,,, +22.3906250000,22,-3.0724391159,0.4398613185,-0.4363517587,1.3831031773,,, +22.3925781250,22,-3.8285880298,1.0593728383,-1.2076211775,1.9654800641,,, +22.3945312500,22,-4.4212984285,1.5882117012,-1.9020757212,2.4425642807,,, +22.3964843750,22,-4.8054091619,1.9983908632,-2.4718090162,2.7838116156,,, +22.3984375000,22,-4.9529878993,2.2804022731,-2.8859639942,2.9739705224,,, +22.4003906250,22,-4.8548292478,2.4359295478,-3.1319929752,3.0102290201,,, +22.4023437500,22,-4.5185278748,2.4721423135,-3.2126673255,2.8988002945,,, +22.4042968750,22,-3.9653050495,2.4002016353,-3.1419289334,2.6530125112,,, +22.4062500000,22,-3.2275198770,2.2347869456,-2.9406266591,2.2921375207,,, +22.4082031250,22,-2.3477745543,1.9933530895,-2.6333576444,1.8407031124,,, +22.4101562500,22,-1.3780144828,1.6957399724,-2.2462977389,1.3279706234,,, +22.4121093750,22,-0.3766617799,1.3629516178,-1.8045786115,0.7862663192,,, +22.4140625000,22,0.5956288928,1.0146011564,-1.3300584808,0.2481561843,,, +22.4160156250,22,1.4800237809,0.6667725715,-0.8413073141,-0.2561104780,,, +22.4179687500,22,2.2229337416,0.3302178003,-0.3549290705,-0.7007621979,,, +22.4199218750,22,2.7792092145,0.0070502282,0.1136880278,-1.0672899991,,, +22.4218750000,22,3.1157425632,-0.3117729697,0.5504089090,-1.3470231541,,, +22.4238281250,22,3.2159887975,-0.6440487522,0.9434538620,-1.5417586963,,, +22.4257812500,22,3.0844489751,-1.0099356890,1.2861887117,-1.6625157377,,, +22.4277343750,22,2.7474462202,-1.4244953537,1.5788564623,-1.7263655633,,, +22.4296875000,22,2.2473735594,-1.8909688460,1.8259074975,-1.7510853933,,, +22.4316406250,22,1.6336368858,-2.3972225604,2.0314443873,-1.7500155569,,, +22.4335937500,22,0.9563017785,-2.9156003157,2.1971464302,-1.7295487353,,, +22.4355468750,22,0.2639764089,-3.4043212687,2.3226356488,-1.6889712140,,, +22.4375000000,22,-0.3964141501,-3.8112929821,2.4065693347,-1.6221613002,,, +22.4394531250,22,-0.9801445627,-4.0812209029,2.4474328994,-1.5207191178,,, +22.4414062500,22,-1.4474083140,-4.1627786292,2.4426366395,-1.3762695341,,, +22.4433593750,22,-1.7684992444,-4.0139150217,2.3863952889,-1.1809247735,,, +22.4453125000,22,-1.9280440645,-3.6078477485,2.2697102713,-0.9284153791,,, +22.4472656250,22,-1.9258154926,-2.9390837423,2.0831158461,-0.6165465584,,, +22.4492187500,22,-1.7758685252,-2.0244693195,1.8185365368,-0.2479834458,,, +22.4511718750,22,-1.5049905869,-0.8998424002,1.4697255919,0.1707425374,,, +22.4531250000,22,-1.1496132952,0.3824257217,1.0343839723,0.6292094568,,, +22.4550781250,22,-0.7516896604,1.7546445191,0.5173751881,1.1120952021,,, +22.4570312500,22,-0.3536639208,3.1370790276,-0.0673627807,1.5987663627,,, +22.4589843750,22,0.0073663313,4.4443435449,-0.6965226540,2.0639911882,,, +22.4609375000,22,0.3040456535,5.5943264379,-1.3395096746,2.4803752657,,, +22.4628906250,22,0.5206489032,6.5175273163,-1.9627667487,2.8219468046,,, +22.4648437500,22,0.6534772930,7.1623246092,-2.5334069834,3.0664159770,,, +22.4667968750,22,0.7095432613,7.4956523402,-3.0211268616,3.1959654294,,, +22.4687500000,22,0.7029413267,7.5041286891,-3.4003519824,3.1991645156,,, +22.4707031250,22,0.6500582012,7.1963108275,-3.6525172224,3.0738716193,,, +22.4726562500,22,0.5658707657,6.6021884697,-3.7665317444,2.8284336306,,, +22.4746093750,22,0.4631550507,5.7699641973,-3.7378363547,2.4804860588,,, +22.4765625000,22,0.3542739424,4.7615949128,-3.5675654737,2.0541623718,,, +22.4785156250,22,0.2534148514,3.6457628600,-3.2612730718,1.5759297996,,, +22.4804687500,22,0.1777392540,2.4883684595,-2.8267749611,1.0697085971,,, +22.4824218750,22,0.1473019544,1.3436725908,-2.2726018792,0.5527866448,,, +22.4843750000,22,0.1840529050,0.2488587939,-1.6077890427,0.0336890679,,, +22.4863281250,22,0.3095549802,-0.7770337386,-0.8425412960,-0.4874115801,,, +22.4882812500,22,0.5407067105,-1.7308676359,0.0099335836,-1.0159564087,,, +22.4902343750,22,0.8843244520,-2.6225955235,0.9310543402,-1.5595395765,,, +22.4921875000,22,1.3328996149,-3.4724171493,1.8959647397,-2.1248852219,,, +22.4941406250,22,1.8628600805,-4.3049196928,2.8737384482,-2.7144069572,,, +22.4960937500,22,2.4356505589,-5.1398849937,3.8270872724,-3.3223419642,,, +22.4980468750,22,3.0022954011,-5.9842197687,4.7130809475,-3.9327934098,,, +22.5000000000,22,3.5103608344,-6.8281860208,5.4864619059,-4.5207241145,,, +22.5019531250,22,3.9097901025,-7.6450194817,6.1033861090,-5.0540864795,,, +22.5039062500,22,4.1564186525,-8.3927696281,6.5239363628,-5.4960749433,,, +22.5058593750,22,4.2157764732,-9.0184393601,6.7150454173,-5.8085596179,,, +22.5078125000,22,4.0676706436,-9.4629411967,6.6540896689,-5.9562046686,,, +22.5097656250,22,3.7080437968,-9.6660220823,6.3310579555,-5.9094907307,,, +22.5117187500,22,3.1471475747,-9.5729739865,5.7496969171,-5.6470954991,,, +22.5136718750,22,2.4067911249,-9.1422247828,4.9288231945,-5.1583070412,,, +22.5156250000,22,1.5181770731,-8.3505846032,3.9021794799,-4.4445915786,,, +22.5175781250,22,0.5206466175,-7.1968442962,2.7164620769,-3.5207721858,,, +22.5195312500,22,-0.5387845326,-5.7056558967,1.4290810768,-2.4166565547,,, +22.5214843750,22,-1.6064743469,-3.9293870362,0.1049034639,-1.1774981924,,, +22.5234375000,22,-2.6247026235,-1.9450657582,-1.1890971149,0.1384035567,,, +22.5253906250,22,-3.5353164610,0.1525594812,-2.3895638709,1.4643376242,,, +22.5273437500,22,-4.2840620835,2.2599438422,-3.4412759099,2.7310158983,,, +22.5292968750,22,-4.8261172353,4.2750474914,-4.3011732769,3.8735325494,,, +22.5312500000,22,-5.1327758322,6.1065565618,-4.9419674457,4.8382934577,,, +22.5332031250,22,-5.1968549850,7.6785519355,-5.3537417428,5.5873469887,,, +22.5351562500,22,-5.0339556519,8.9323270835,-5.5432368683,6.0997498482,,, +22.5371093750,22,-4.6791153716,9.8297444564,-5.5319210532,6.3717943237,,, +22.5390625000,22,-4.1806689045,10.3570863929,-5.3532691055,6.4163364011,,, +22.5410156250,22,-3.5934724620,10.5259856256,-5.0493890247,6.2605179653,,, +22.5429687500,22,-2.9727287661,10.3712385388,-4.6672394749,5.9422921875,,, +22.5449218750,22,-2.3687560471,9.9459318608,-4.2541393187,5.5060914330,,, +22.5468750000,22,-1.8229838440,9.3134156599,-3.8525107425,4.9975409199,,, +22.5488281250,22,-1.3660823261,8.5375410908,-3.4951535022,4.4582376050,,, +22.5507812500,22,-1.0182235972,7.6749606476,-3.2025213871,3.9223349082,,, +22.5527343750,22,-0.7898820530,6.7718434469,-2.9822322474,3.4153612576,,, +22.5546875000,22,-0.6827228161,5.8641614841,-2.8309578586,2.9546919536,,, +22.5566406250,22,-0.6910914039,4.9791789001,-2.7381320364,2.5507977797,,, +22.5585937500,22,-0.8027899161,4.1353506125,-2.6884479141,2.2074802368,,, +22.5605468750,22,-0.9982151580,3.3398759046,-2.6617297585,1.9203858682,,, +22.5625000000,22,-1.2501392138,2.5857766410,-2.6328315900,1.6755657890,,, +22.5644531250,22,-1.5255301662,1.8507148414,-2.5729461635,1.4496571819,,, +22.5664062500,22,-1.7871894783,1.0995599450,-2.4509077108,1.2117181870,,, +22.5683593750,22,-1.9946991866,0.2902129578,-2.2347101544,0.9262765243,,, +22.5703125000,22,-2.1074349363,-0.6198726973,-1.8948978291,0.5575223815,,, +22.5722656250,22,-2.0896203306,-1.6665933986,-1.4091326183,0.0745897314,,, +22.5742187500,22,-1.9142359326,-2.8706217675,-0.7658929960,-0.5429457340,,, +22.5761718750,22,-1.5645256966,-4.2291191237,0.0333343654,-1.3006730059,,, +22.5781250000,22,-1.0346557580,-5.7112088438,0.9732284304,-2.1870158807,,, +22.5800781250,22,-0.3312086668,-7.2582410357,2.0245076960,-3.1727533150,,, +22.5820312500,22,0.5256862870,-8.7870470241,3.1441701333,-4.2120533194,,, +22.5839843750,22,1.5041955385,-10.1964381846,4.2777421602,-5.2461876089,,, +22.5859375000,22,2.5644419980,-11.3781563360,5.3643826839,-6.2099979171,,, +22.5878906250,22,3.6608488930,-12.2293626753,6.3425440510,-7.0385124272,,, +22.5898437500,22,4.7430371505,-12.6627856961,7.1539672209,-7.6719034102,,, +22.5917968750,22,5.7567937209,-12.6144526998,7.7467208727,-8.0593699482,,, +22.5937500000,22,6.6459312828,-12.0496480487,8.0786703167,-8.1625638809,,, +22.5957031250,22,7.3556676348,-10.9662354774,8.1211541421,-7.9584296413,,, +22.5976562500,22,7.8377179247,-9.3958416549,7.8623718351,-7.4417800810,,, +22.5996093750,22,8.0557994936,-7.4038159755,7.3099357023,-6.6275024960,,, +22.6015625000,22,7.9894895186,-5.0861584556,6.4910527700,-5.5507351937,,, +22.6035156250,22,7.6357006402,-2.5622190260,5.4497651308,-4.2641704169,,, +22.6054687500,22,7.0089161622,0.0336477061,4.2433105405,-2.8343879479,,, +22.6074218750,22,6.1407198662,2.5594401243,2.9389407480,-1.3383519203,,, +22.6093750000,22,5.0768171425,4.8744376426,1.6092361264,0.1418263210,,, +22.6113281250,22,3.8703331535,6.8504157178,0.3246120130,1.5266784556,,, +22.6132812500,22,2.5735495479,8.3828726618,-0.8549658569,2.7478127916,,, +22.6152343750,22,1.2319378961,9.4013224787,-1.8861670081,3.7549937362,,, +22.6171875000,22,-0.1173477802,9.8769997847,-2.7447569324,4.5202333776,,, +22.6191406250,22,-1.4430624986,9.8248258049,-3.4243084713,5.0376807114,,, +22.6210937500,22,-2.7156786005,9.2999855607,-3.9325963922,5.3203361001,,, +22.6230468750,22,-3.9045048686,8.3914611886,-4.2875305923,5.3959275234,,, +22.6250000000,22,-4.9778524093,7.2117987547,-4.5129146281,5.3023458116,,, +22.6269531250,22,-5.9049405359,5.8836567767,-4.6338769186,5.0823546195,,, +22.6289062500,22,-6.6580726602,4.5279821214,-4.6735671323,4.7791519325,,, +22.6308593750,22,-7.2148502262,3.2557737314,-4.6517356729,4.4335684371,,, +22.6328125000,22,-7.5599020223,2.1609381947,-4.5837059284,4.0815648448,,, +22.6347656250,22,-7.6857366927,1.3141169853,-4.4796882853,3.7518071976,,, +22.6367187500,22,-7.5929307987,0.7593139995,-4.3452467374,3.4642266857,,, +22.6386718750,22,-7.2891426295,0.5123270638,-4.1815408899,3.2289145540,,, +22.6406250000,22,-6.7866650800,0.5597323536,-3.9845439246,3.0446734890,,, +22.6425781250,22,-6.1003017216,0.8599061145,-3.7453172049,2.8986165147,,, +22.6445312500,22,-5.2470854223,1.3471177823,-3.4520613561,2.7679062507,,, +22.6464843750,22,-4.2472294147,1.9377153107,-3.0923565787,2.6229542442,,, +22.6484375000,22,-3.1253345597,2.5381226221,-2.6554821163,2.4315471902,,, +22.6503906250,22,-1.9109453989,3.0545867345,-2.1349294258,2.1634896071,,, +22.6523437500,22,-0.6379493645,3.4014741686,-1.5295336256,1.7941148225,,, +22.6542968750,22,0.6561828359,3.5056185984,-0.8432687302,1.3059462783,,, +22.6562500000,22,1.9301065474,3.3101435997,-0.0861612278,0.6905391536,,, +22.6582031250,22,3.1374731970,2.7808693733,0.7229016482,-0.0481866376,,, +22.6601562500,22,4.2270168196,1.9131768289,1.5537762339,-0.8909209781,,, +22.6621093750,22,5.1462033553,0.7362962597,2.3655978403,-1.8025730104,,, +22.6640625000,22,5.8478888415,-0.6870910147,3.1108591955,-2.7352308337,,, +22.6660156250,22,6.2966665248,-2.2663870302,3.7415827378,-3.6332930507,,, +22.6679687500,22,6.4721978878,-3.8915267922,4.2149404059,-4.4386553023,,, +22.6699218750,22,6.3694660523,-5.4429367799,4.4970991377,-5.0953010288,,, +22.6718750000,22,5.9979351609,-6.8030698697,4.5664721597,-5.5541451104,,, +22.6738281250,22,5.3809217011,-7.8678863280,4.4168070878,-5.7779353337,,, +22.6757812500,22,4.5544684200,-8.5565721537,4.0586454165,-5.7451584500,,, +22.6777343750,22,3.5653190511,-8.8195162203,3.5187271930,-5.4527960641,,, +22.6796875000,22,2.4687803103,-8.6435574985,2.8383090001,-4.9178023521,,, +22.6816406250,22,1.3264678776,-8.0526407393,2.0703094313,-4.1764672312,,, +22.6835937500,22,0.2030852701,-7.1040858998,1.2747401883,-3.2814119364,,, +22.6855468750,22,-0.8381414315,-5.8824572311,0.5132195830,-2.2969438968,,, +22.6875000000,22,-1.7408897140,-4.4923264866,-0.1564067630,-1.2935432989,,, +22.6894531250,22,-2.4606219193,-3.0499828928,-0.6848459825,-0.3420948538,,, +22.6914062500,22,-2.9674841042,-1.6742682027,-1.0347518322,0.4914526169,,, +22.6933593750,22,-3.2469131952,-0.4763395224,-1.1825394753,1.1509553001,,, +22.6953125000,22,-3.2990433280,0.4518734059,-1.1199354803,1.5950164801,,, +22.6972656250,22,-3.1383269072,1.0478432782,-0.8557646838,1.8013867383,,, +22.6992187500,22,-2.7927738838,1.2841346519,-0.4163623320,1.7691895085,,, +22.7011718750,22,-2.3015259283,1.1707142920,0.1557859522,1.5189350115,,, +22.7031250000,22,-1.7120544702,0.7554929098,0.8038113152,1.0915796388,,, +22.7050781250,22,-1.0784842659,0.1208029480,1.4593737172,0.5462547444,,, +22.7070312500,22,-0.4601312456,-0.6257201397,2.0479407261,-0.0443897919,,, +22.7089843750,22,0.0809044610,-1.3633176338,2.4948628671,-0.6006074516,,, +22.7109375000,22,0.4834229561,-1.9711401460,2.7312771195,-1.0429075393,,, +22.7128906250,22,0.6925228190,-2.3410720675,2.7008319989,-1.3000277750,,, +22.7148437500,22,0.6672817378,-2.3876094303,2.3669893797,-1.3165417498,,, +22.7167968750,22,0.3901571333,-2.0538857288,1.7197811428,-1.0594791444,,, +22.7187500000,22,-0.1258658357,-1.3167681341,0.7804281363,-0.5236072514,,, +22.7207031250,22,-0.8375838946,-0.1910084920,-0.3992907941,0.2668135088,,, +22.7226562500,22,-1.6786236641,1.2708972166,-1.7432859177,1.2610025822,,, +22.7246093750,22,-2.5677819017,2.9828794403,-3.1589832139,2.3869817688,,, +22.7265625000,22,-3.4168172770,4.8318823719,-4.5448201983,3.5577608905,,, +22.7285156250,22,-4.1385971725,6.6880296276,-5.7986451521,4.6792714220,,, +22.7304687500,22,-4.6546490032,8.4174148699,-6.8262965215,5.6592212626,,, +22.7324218750,22,-4.9016800231,9.8930827776,-7.5487012134,6.4147162080,,, +22.7343750000,22,-4.8377156197,11.0032285604,-7.9079066143,6.8784822761,,, +22.7363281250,22,-4.4460124312,11.6589865169,-7.8717405962,7.0039678656,,, +22.7382812500,22,-3.7344259511,11.8007810479,-7.4348409097,6.7679077617,,, +22.7402343750,22,-2.7313896682,11.4012126451,-6.6159715148,6.1699371570,,, +22.7421875000,22,-1.4807263937,10.4664794091,-5.4541628974,5.2310621003,,, +22.7441406250,22,-0.0364749627,9.0378471001,-4.0051066514,3.9921478420,,, +22.7460937500,22,1.5403190311,7.1898000686,-2.3376152863,2.5117611528,,, +22.7480468750,22,3.1814127510,5.0220048793,-0.5302901115,0.8627041476,,, +22.7500000000,22,4.8097593364,2.6486879939,1.3311110342,-0.8720064789,,, +22.7519531250,22,6.3396307837,0.1908068416,3.1559182939,-2.6026583198,,, +22.7539062500,22,7.6793154985,-2.2284884779,4.8510476004,-4.2359968390,,, +22.7558593750,22,8.7366656165,-4.4879146026,6.3247212431,-5.6793794329,,, +22.7578125000,22,9.4286363214,-6.4746325340,7.4933766190,-6.8477309607,,, +22.7597656250,22,9.6932517012,-8.0938134705,8.2913715032,-7.6728405748,,, +22.7617187500,22,9.4987659874,-9.2765415682,8.6784560552,-8.1107451190,,, +22.7636718750,22,8.8468780382,-9.9819788728,8.6416275181,-8.1440740192,,, +22.7656250000,22,7.7715175813,-10.1963534056,8.1937474826,-7.7811109202,,, +22.7675781250,22,6.3344916566,-9.9318436397,7.3709144690,-7.0534641492,,, +22.7695312500,22,4.6175906463,-9.2248278301,6.2278221663,-6.0119448629,,, +22.7714843750,22,2.7128206005,-8.1336521797,4.8320951586,-4.7214247504,,, +22.7734375000,22,0.7139523165,-6.7357548374,3.2593034817,-3.2559576642,,, +22.7753906250,22,-1.2892431849,-5.1225980131,1.5885432155,-1.6940765688,,, +22.7773437500,22,-3.2140744566,-3.3932446385,-0.1011294260,-0.1146365250,,, +22.7792968750,22,-4.9856462357,-1.6484882371,-1.7327443472,1.4060937567,,, +22.7812500000,22,-6.5370528371,0.0144580365,-3.2331776915,2.7968633751,,, +22.7832031250,22,-7.8108587143,1.5070249084,-4.5359563349,3.9942955434,,, +22.7851562500,22,-8.7611542563,2.7533466832,-5.5841026924,4.9455440109,,, +22.7871093750,22,-9.3554926990,3.6931610124,-6.3323418011,5.6103932859,,, +22.7890625000,22,-9.5772370509,4.2845625174,-6.7496850998,5.9634642525,,, +22.7910156250,22,-9.4270327287,4.5061864473,-6.8215840948,5.9957889807,,, +22.7929687500,22,-8.9222873693,4.3573639443,-6.5502191274,5.7146438698,,, +22.7949218750,22,-8.0968284685,3.8577864298,-5.9549464854,5.1432353153,,, +22.7968750000,22,-7.0013475084,3.0483238616,-5.0739419244,4.3212183613,,, +22.7988281250,22,-5.7012449490,1.9893537155,-3.9630981119,3.3030258803,,, +22.8007812500,22,-4.2706534565,0.7543977002,-2.6904236503,2.1525265210,,, +22.8027343750,22,-2.7854012399,-0.5762335589,-1.3297170178,0.9372353288,,, +22.8046875000,22,-1.3166723050,-1.9185811493,0.0442465243,-0.2757715169,,, +22.8066406250,22,0.0744940806,-3.1866141319,1.3597595862,-1.4228946304,,, +22.8085937500,22,1.3400722324,-4.2940076712,2.5509230430,-2.4460123778,,, +22.8105468750,22,2.4440095408,-5.1588406824,3.5593005276,-3.2940860748,,, +22.8125000000,22,3.3602018785,-5.7129001124,4.3370882886,-3.9263450069,,, +22.8144531250,22,4.0719082504,-5.9105104228,4.8510888121,-4.3158680314,,, +22.8164062500,22,4.5710350446,-5.7318850533,5.0840329712,-4.4507231224,,, +22.8183593750,22,4.8573973179,-5.1838915910,5.0344937621,-4.3339748926,,, +22.8203125000,22,4.9402469155,-4.3010143309,4.7184059903,-3.9847406138,,, +22.8222656250,22,4.8411107599,-3.1437740700,4.1706278563,-3.4386910916,,, +22.8242187500,22,4.5950099045,-1.7934250838,3.4440838844,-2.7462398911,,, +22.8261718750,22,4.2488214946,-0.3449766615,2.6064296039,-1.9687889311,,, +22.8281250000,22,3.8565836107,1.1012772241,1.7339538492,-1.1730290085,,, +22.8300781250,22,3.4722813094,2.4503875427,0.9025248295,-0.4232391393,,, +22.8320312500,22,3.1424964459,3.6232440050,0.1781235804,0.2264024353,,, +22.8339843750,22,2.9009618273,4.5635371132,-0.3900631771,0.7371546145,,, +22.8359375000,22,2.7646730647,5.2407934493,-0.7740284366,1.0886739836,,, +22.8378906250,22,2.7314256959,5.6507825562,-0.9694599039,1.2802190717,,, +22.8398437500,22,2.7810566840,5.8130683557,-0.9946103437,1.3290324666,,, +22.8417968750,22,2.8817158352,5.7657479220,-0.8845194671,1.2653595234,,, +22.8437500000,22,2.9976732064,5.5585382586,-0.6833283069,1.1261000327,,, +22.8457031250,22,3.0944506641,5.2447589308,-0.4376014702,0.9491302382,,, +22.8476562500,22,3.1411123166,4.8743318983,-0.1916247719,0.7692896787,,, +22.8496093750,22,3.1107845444,4.4901914445,0.0149829788,0.6166151168,,, +22.8515625000,22,2.9800773868,4.1259905890,0.1485956175,0.5156144219,,, +22.8535156250,22,2.7287636599,3.8032354784,0.1832477092,0.4841821251,,, +22.8554687500,22,2.3406668343,3.5297277237,0.1022021946,0.5325579169,,, +22.8574218750,22,1.8060665806,3.2986317321,-0.1000455757,0.6618989184,,, +22.8593750000,22,1.1250376579,3.0866907339,-0.4149092239,0.8620785269,,, +22.8613281250,22,0.3098450596,2.8559427101,-0.8189980154,1.1114036065,,, +22.8632812500,22,-0.6145851011,2.5624284099,-1.2776304802,1.3801836610,,, +22.8652343750,22,-1.6115896273,2.1672302814,-1.7502035164,1.6359039297,,, +22.8671875000,22,-2.6347374135,1.6436311760,-2.1945502259,1.8471614184,,, +22.8691406250,22,-3.6308592181,0.9800823272,-2.5701818383,1.9862391756,,, +22.8710937500,22,-4.5442344092,0.1813319817,-2.8414672081,2.0313814990,,, +22.8730468750,22,-5.3221221227,-0.7323537992,-2.9808806947,1.9688205427,,, +22.8750000000,22,-5.9208611253,-1.7274575661,-2.9721024993,1.7944027794,,, +22.8769531250,22,-6.3103523957,-2.7593520043,-2.8122737954,1.5145763476,,, +22.8789062500,22,-6.4759654075,-3.7760801701,-2.5119296864,1.1455662089,,, +22.8808593750,22,-6.4196784736,-4.7243520961,-2.0934239025,0.7112659577,,, +22.8828125000,22,-6.1606935708,-5.5536566448,-1.5897130607,0.2417255153,,, +22.8847656250,22,-5.7327721184,-6.2173696069,-1.0421791980,-0.2284640680,,, +22.8867187500,22,-5.1787287058,-6.6737288785,-0.4965385215,-0.6629459480,,, +22.8886718750,22,-4.5455741807,-6.8883246903,0.0015384516,-1.0267495959,,, +22.8906250000,22,-3.8807864374,-6.8381947636,0.4107311279,-1.2896543581,,, +22.8925781250,22,-3.2285394404,-6.5159533627,0.6983871179,-1.4295863476,,, +22.8945312500,22,-2.6260531941,-5.9315898491,0.8437444681,-1.4349566703,,, +22.8964843750,22,-2.1000303525,-5.1116374401,0.8398988964,-1.3058290700,,, +22.8984375000,22,-1.6633235867,-4.0975850803,0.6952553490,-1.0546651549,,, +22.9003906250,22,-1.3132106982,-2.9449372869,0.4342630902,-0.7066598243,,, +22.9023437500,22,-1.0318702375,-1.7215508999,0.0964687137,-0.2988178844,,, +22.9042968750,22,-0.7883805749,-0.5037087828,-0.2663718049,0.1226017047,,, +22.9062500000,22,-0.5423095346,0.6292656628,-0.5948178262,0.5059551157,,, +22.9082031250,22,-0.2492428305,1.6018701928,-0.8281425868,0.7995540866,,, +22.9101562500,22,0.1329422639,2.3514280310,-0.9121712322,0.9582510598,,, +22.9121093750,22,0.6382274120,2.8370546745,-0.8068970407,0.9498232445,,, +22.9140625000,22,1.2866836085,3.0454532862,-0.4927437527,0.7599512244,,, +22.9160156250,22,2.0791199726,2.9922732104,0.0252882410,0.3951019163,,, +22.9179687500,22,2.9942752519,2.7189449565,0.7170073630,-0.1176343579,,, +22.9199218750,22,3.9905771974,2.2860200741,1.5308393470,-0.7341801036,,, +22.9218750000,22,5.0115059019,1.7655181895,2.4003996506,-1.3990854362,,, +22.9238281250,22,5.9910453933,1.2338022324,3.2509763018,-2.0509502900,,, +22.9257812500,22,6.8581035698,0.7644907962,4.0054509499,-2.6273826143,,, +22.9277343750,22,7.5415958668,0.4218289591,4.5905145801,-3.0700424810,,, +22.9296875000,22,7.9762819575,0.2553133660,4.9428258165,-3.3294696226,,, +22.9316406250,22,8.1079360078,0.2944965328,5.0146437727,-3.3695473477,,, +22.9335937500,22,7.8978173894,0.5442875731,4.7787615309,-3.1714523533,,, +22.9355468750,22,7.3267899314,0.9836600075,4.2317038813,-2.7359861311,,, +22.9375000000,22,6.3984482861,1.5685528117,3.3944702579,-2.0836725713,,, +22.9394531250,22,5.1412306745,2.2370213577,2.3116601166,-1.2534506604,,, +22.9414062500,22,3.6091555714,2.9160499519,1.0489857290,-0.3000599328,,, +22.9433593750,22,1.8792276118,3.5301445053,-0.3121190838,0.7107761175,,, +22.9453125000,22,0.0455014525,4.0096984338,-1.6819024393,1.7085105638,,, +22.9472656250,22,-1.7881367110,4.2972621558,-2.9695806639,2.6235847869,,, +22.9492187500,22,-3.5165187057,4.3517891662,-4.0905883717,3.3929442554,,, +22.9511718750,22,-5.0434020880,4.1507068325,-4.9739486068,3.9653343670,,, +22.9531250000,22,-6.2907438625,3.6897902984,-5.5681098385,4.3052487505,,, +22.9550781250,22,-7.2046310807,2.9829227655,-5.8446265830,4.3953870674,,, +22.9570312500,22,-7.7576204023,2.0630864337,-5.8001092995,4.2380931388,,, +22.9589843750,22,-7.9477565185,0.9820588051,-5.4555098355,3.8548017252,,, +22.9609375000,22,-7.7945335990,-0.1934812936,-4.8519049246,3.2826194247,,, +22.9628906250,22,-7.3324361967,-1.3879099992,-4.0438418738,2.5689723718,,, +22.9648437500,22,-6.6040233519,-2.5233028280,-3.0920801330,1.7657604505,,, +22.9667968750,22,-5.6551697166,-3.5267828920,-2.0573698668,0.9241405222,,, +22.9687500000,22,-4.5332501583,-4.3370375625,-0.9964403330,0.0909395291,,, +22.9707031250,22,-3.2874691531,-4.9093023292,0.0399877139,-0.6933459120,,, +22.9726562500,22,-1.9700772186,-5.2203407946,1.0086196766,-1.3961650550,,, +22.9746093750,22,-0.6366058583,-5.2725990905,1.8752595178,-1.9945972840,,, +22.9765625000,22,0.6563153520,-5.0944288719,2.6162947786,-2.4763893334,,, +22.9785156250,22,1.8553822593,-4.7357485527,3.2196084953,-2.8399983428,,, +22.9804687500,22,2.9159566461,-4.2599982454,3.6844573261,-3.0934374282,,, +22.9824218750,22,3.8065886451,-3.7327656634,4.0193897817,-3.2513362805,,, +22.9843750000,22,4.5110900474,-3.2102599999,4.2385549783,-3.3308789385,,, +22.9863281250,22,5.0275763885,-2.7323275131,4.3580665506,-3.3483866196,,, +22.9882812500,22,5.3656918905,-2.3201306450,4.3932376256,-3.3171220248,,, +22.9902343750,22,5.5436163594,-1.9755577219,4.3564255870,-3.2457435697,,, +22.9921875000,22,5.5843701302,-1.6824793938,4.2552339812,-3.1372503100,,, +22.9941406250,22,5.5103538024,-1.4112760879,4.0910196178,-2.9885709440,,, +22.9960937500,22,5.3378583528,-1.1249402653,3.8580674815,-2.7908170078,,, +22.9980468750,22,5.0747442522,-0.7848528322,3.5446299960,-2.5307649033,,, +23.0000000000,23,4.7219206200,-0.3563478875,3.1362521792,-2.1939076133,33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000:10.0000000000:11.0000000000:12.0000000000:13.0000000000:14.0000000000:15.0000000000:19.0000000000:20.0000000000:21.0000000000:22.0000000000:23.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +23.0019531250,23,4.2761429003,0.1856952151,2.6200092098,-1.7680191703,,, +23.0039062500,23,3.7320016997,0.8507274814,1.9884412944,-1.2466311290,,, +23.0058593750,23,3.0842820222,1.6275428262,1.2431660240,-0.6322360984,,, +23.0078125000,23,2.3314266777,2.4834761143,0.3974011133,0.0618551856,,, +23.0097656250,23,1.4779818362,3.3673455421,-0.5237803694,0.8117036440,,, +23.0117187500,23,0.5355899890,4.2142470926,-1.4849145070,1.5843558441,,, +23.0136718750,23,-0.4759926772,4.9522671793,-2.4424220687,2.3402783529,,, +23.0156250000,23,-1.5284181456,5.5116982791,-3.3482998137,3.0371134875,,, +23.0175781250,23,-2.5861557202,5.8340452757,-4.1549049173,3.6341711303,,, +23.0195312500,23,-3.6084770349,5.8767784165,-4.8182571242,4.0953443598,,, +23.0214843750,23,-4.5501184513,5.6157256501,-5.2994777990,4.3904450230,,, +23.0234375000,23,-5.3617622234,5.0489889199,-5.5667640920,4.4971302902,,, +23.0253906250,23,-5.9928194961,4.1998838751,-5.5983872899,4.4034122364,,, +23.0273437500,23,-6.3972228968,3.1158681010,-5.3858571905,4.1097384595,,, +23.0292968750,23,-6.5410188395,1.8652672282,-4.9372779832,3.6308916605,,, +23.0312500000,23,-6.4092158733,0.5328950345,-4.2797704269,2.9970721848,,, +23.0332031250,23,-6.0090746055,-0.7861935383,-3.4588568713,2.2526151928,,, +23.0351562500,23,-5.3691311417,-1.9940486685,-2.5346864913,1.4523772378,,, +23.0371093750,23,-4.5358679924,-2.9976013784,-1.5765903550,0.6569195052,,, +23.0390625000,23,-3.5696831218,-3.7176151954,-0.6566912028,-0.0731276438,,, +23.0410156250,23,-2.5400005478,-4.0979995731,0.1571689876,-0.6832483808,,, +23.0429687500,23,-1.5191061839,-4.1127652148,0.8082796467,-1.1307686671,,, +23.0449218750,23,-0.5752796834,-3.7695978461,1.2569031615,-1.3894187192,,, +23.0468750000,23,0.2330890599,-3.1103912703,1.4841899267,-1.4521457564,,, +23.0488281250,23,0.8617669725,-2.2079135600,1.4934191947,-1.3315367284,,, +23.0507812500,23,1.2848174119,-1.1580812296,1.3092896402,-1.0582541395,,, +23.0527343750,23,1.4982407796,-0.0690187034,0.9755199386,-0.6778504105,,, +23.0546875000,23,1.5208239667,0.9510272408,0.5502035487,-0.2458667480,,, +23.0566406250,23,1.3918499961,1.8052619646,0.0994339028,0.1782465404,,, +23.0585937500,23,1.1660944877,2.4187324948,-0.3102491986,0.5379003195,,, +23.0605468750,23,0.9066077352,2.7462159502,-0.6197383319,0.7860048346,,, +23.0625000000,23,0.6774249594,2.7755017748,-0.7833189466,0.8896163727,,, +23.0644531250,23,0.5376978557,2.5253747150,-0.7714927710,0.8316173277,,, +23.0664062500,23,0.5360560768,2.0398472282,-0.5720829910,0.6106163408,,, +23.0683593750,23,0.7042942227,1.3817592460,-0.1915042287,0.2408509987,,, +23.0703125000,23,1.0525608459,0.6275997809,0.3443853958,-0.2480347413,,, +23.0722656250,23,1.5681215678,-0.1385002424,0.9920371204,-0.8131287615,,, +23.0742187500,23,2.2165051970,-0.8341408417,1.6949248093,-1.4028697442,,, +23.0761718750,23,2.9436560778,-1.3892725237,2.3894392973,-1.9626299993,,, +23.0781250000,23,3.6798286994,-1.7538339358,3.0105846370,-2.4397772791,,, +23.0800781250,23,4.3466121391,-1.9016309722,3.4980176633,-2.7884791062,,, +23.0820312500,23,4.8668576994,-1.8314462171,3.8027396866,-2.9745463280,,, +23.0839843750,23,5.1745967295,-1.5657440158,3.8927530650,-2.9792218186,,, +23.0859375000,23,5.2226667799,-1.1481515210,3.7567423759,-2.8014496812,,, +23.0878906250,23,4.9876990686,-0.6396533066,3.4055787550,-2.4583898288,,, +23.0898437500,23,4.4713170861,-0.1119947558,2.8703017397,-1.9829911852,,, +23.0917968750,23,3.6974718800,0.3609001834,2.1968483334,-1.4189798110,,, +23.0937500000,23,2.7079423575,0.7115296537,1.4396240565,-0.8150346196,,, +23.0957031250,23,1.5567579073,0.8863206976,0.6548593160,-0.2189781772,,, +23.0976562500,23,0.3045323824,0.8509180402,-0.1051186783,0.3271307272,,, +23.0996093750,23,-0.9847944291,0.5932990458,-0.7951271096,0.7899614450,,, +23.1015625000,23,-2.2448639523,0.1256029417,-1.3784023130,1.1462083231,,, +23.1035156250,23,-3.4078664326,-0.5167170993,-1.8269391152,1.3825196889,,, +23.1054687500,23,-4.4068493450,-1.2800734535,-2.1209313825,1.4939725851,,, +23.1074218750,23,-5.1791809411,-2.0997919824,-2.2481059265,1.4822778373,,, +23.1093750000,23,-5.6707788153,-2.9049781180,-2.2043605221,1.3554159980,,, +23.1113281250,23,-5.8412498209,-3.6221926671,-1.9954511058,1.1282338238,,, +23.1132812500,23,-5.6700165805,-4.1821569442,-1.6380967305,0.8220247051,,, +23.1152343750,23,-5.1624917084,-4.5281587805,-1.1604427245,0.4633135658,,, +23.1171875000,23,-4.3534029746,-4.6215346066,-0.6018919358,0.0827975842,,, +23.1191406250,23,-3.3037721543,-4.4444742114,-0.0099404970,-0.2871120154,,, +23.1210937500,23,-2.0923824353,-4.0017391967,0.5661037208,-0.6165230012,,, +23.1230468750,23,-0.8063682006,-3.3201930568,1.0810986260,-0.8816162990,,, +23.1250000000,23,0.4671003651,-2.4462991521,1.4985035801,-1.0668140578,,, +23.1269531250,23,1.6488061354,-1.4423289682,1.7939881302,-1.1663326796,,, +23.1289062500,23,2.6738028847,-0.3800001411,1.9568425370,-1.1839465693,,, +23.1308593750,23,3.4935544496,0.6675688657,1.9880161498,-1.1302271143,,, +23.1328125000,23,4.0746152822,1.6323091653,1.8965228658,-1.0191548960,,, +23.1347656250,23,4.3962670118,2.4564594024,1.6955647841,-0.8649747760,,, +23.1367187500,23,4.4481009198,3.0985115305,1.3983834569,-0.6786538928,,, +23.1386718750,23,4.2290480832,3.5377606236,1.0156905375,-0.4654870031,,, +23.1406250000,23,3.7489457323,3.7752879577,0.5561337604,-0.2254772994,,, +23.1425781250,23,3.0306804861,3.8320248144,0.0283141808,0.0446765171,,, +23.1445312500,23,2.1115017823,3.7438415119,-0.5563832356,0.3487356200,,, +23.1464843750,23,1.0440654805,3.5540523551,-1.1800657948,0.6870087699,,, +23.1484375000,23,-0.1045037179,3.3069879663,-1.8165520571,1.0534566833,,, +23.1503906250,23,-1.2582476647,3.0443272469,-2.4339526934,1.4357536844,,, +23.1523437500,23,-2.3404080501,2.8013541364,-2.9986471687,1.8164652763,,, +23.1542968750,23,-3.2791147642,2.6030426867,-3.4772442808,2.1737388845,,, +23.1562500000,23,-4.0109577003,2.4630133134,-3.8379944653,2.4829081756,,, +23.1582031250,23,-4.4850146120,2.3842799526,-4.0532071177,2.7191414883,,, +23.1601562500,23,-4.6669512950,2.3592682557,-4.1015041169,2.8596694942,,, +23.1621093750,23,-4.5421060871,2.3704222674,-3.9696588275,2.8858635785,,, +23.1640625000,23,-4.1173149490,2.3927371357,-3.6545013413,2.7855629814,,, +23.1660156250,23,-3.4217364122,2.3970178330,-3.1647374008,2.5549813860,,, +23.1679687500,23,-2.5069324470,2.3527911496,-2.5222854092,2.1999627731,,, +23.1699218750,23,-1.4443457748,2.2311635250,-1.7617628423,1.7363270754,,, +23.1718750000,23,-0.3189974134,2.0083347397,-0.9276634447,1.1891331546,,, +23.1738281250,23,0.7778316269,1.6693986414,-0.0711530325,0.5914492808,,, +23.1757812500,23,1.7548395478,1.2111214247,0.7525927835,-0.0172450749,,, +23.1777343750,23,2.5279452785,0.6427010142,1.4883829090,-0.5941878301,,, +23.1796875000,23,3.0302786062,-0.0157778231,2.0876129601,-1.0988064647,,, +23.1816406250,23,3.2218728534,-0.7355555879,2.5149136214,-1.4984204498,,, +23.1835937500,23,3.0946374176,-1.4801956296,2.7514291530,-1.7712025724,,, +23.1855468750,23,2.6720111298,-2.2072146105,2.7950560870,-1.9070546933,,, +23.1875000000,23,2.0048770342,-2.8722315920,2.6592704689,-1.9081355147,,, +23.1894531250,23,1.1648116534,-3.4334242606,2.3705497027,-1.7881796697,,, +23.1914062500,23,0.2358983946,-3.8550390839,1.9649304163,-1.5701995455,,, +23.1933593750,23,-0.6938460340,-4.1107100685,1.4844588450,-1.2836510900,,, +23.1953125000,23,-1.5404941518,-4.1849548501,0.9731577330,-0.9611082451,,, +23.1972656250,23,-2.2308822671,-4.0723648950,0.4728342578,-0.6345427326,,, +23.1992187500,23,-2.7080179230,-3.7777100793,0.0200574812,-0.3325797007,,, +23.2011718750,23,-2.9347011123,-3.3176104968,-0.3551603143,-0.0793338620,,, +23.2031250000,23,-2.8945873599,-2.7206602685,-0.6298773360,0.1061323037,,, +23.2050781250,23,-2.5912737260,-2.0251801620,-0.7886994389,0.2102751223,,, +23.2070312500,23,-2.0462663047,-1.2766467846,-0.8238343464,0.2250053033,,, +23.2089843750,23,-1.2964120608,-0.5253404381,-0.7347075245,0.1473048818,,, +23.2109375000,23,-0.3910797691,0.1758418315,-0.5271878526,-0.0211266604,,, +23.2128906250,23,0.6107360144,0.7729105178,-0.2122804174,-0.2742877243,,, +23.2148437500,23,1.6427126454,1.2146081718,0.1939151255,-0.6009000672,,, +23.2167968750,23,2.6336704842,1.4606045729,0.6683500801,-0.9817751659,,, +23.2187500000,23,3.5122931517,1.4884725577,1.1805418852,-1.3894315100,,, +23.2207031250,23,4.2143428781,1.2952880384,1.6954227276,-1.7918470211,,, +23.2226562500,23,4.6909449597,0.8977074014,2.1778828408,-2.1568598036,,, +23.2246093750,23,4.9155733241,0.3326447424,2.5969583964,-2.4548053648,,, +23.2265625000,23,4.8868966158,-0.3444698945,2.9283878307,-2.6604903983,,, +23.2285156250,23,4.6265656032,-1.0645899674,3.1549221062,-2.7548847703,,, +23.2304687500,23,4.1733940019,-1.7513450571,3.2650268689,-2.7257679674,,, +23.2324218750,23,3.5761408951,-2.3283687818,3.2514550565,-2.5678190442,,, +23.2343750000,23,2.8869484480,-2.7267994272,3.1105813044,-2.2827082870,,, +23.2363281250,23,2.1565364923,-2.8910057786,2.8425054892,-1.8786265383,,, +23.2382812500,23,1.4310206551,-2.7832079733,2.4519947110,-1.3696607665,,, +23.2402343750,23,0.7497667682,-2.3887633980,1.9501426298,-0.7761970550,,, +23.2421875000,23,0.1438902430,-1.7202653551,1.3556249953,-0.1254783006,,, +23.2441406250,23,-0.3646079000,-0.8178360458,0.6947608699,0.5492682461,,, +23.2460937500,23,-0.7630905993,0.2537630838,0.0006234999,1.2108597068,,, +23.2480468750,23,-1.0483209036,1.4102735339,-0.6888733214,1.8208241559,,, +23.2500000000,23,-1.2267296173,2.5551896660,-1.3341279352,2.3428399230,,, +23.2519531250,23,-1.3149840937,3.5884668626,-1.8980617590,2.7466246145,,, +23.2539062500,23,-1.3404370591,4.4169964937,-2.3512727474,3.0122030586,,, +23.2558593750,23,-1.3399840749,4.9665542567,-2.6767417864,3.1342260522,,, +23.2578125000,23,-1.3551708282,5.1909704158,-2.8710463998,3.1233698279,,, +23.2597656250,23,-1.4248927379,5.0736451333,-2.9417549841,3.0020762334,,, +23.2617187500,23,-1.5801988834,4.6232044903,-2.9044717915,2.7975610932,,, +23.2636718750,23,-1.8409959170,3.8700228856,-2.7806529056,2.5370642170,,, +23.2656250000,23,-2.2115501460,2.8655373849,-2.5943903609,2.2457121573,,, +23.2675781250,23,-2.6766900641,1.6810578829,-2.3687417008,1.9453506801,,, +23.2695312500,23,-3.2021449483,0.4044197718,-2.1236815616,1.6543089989,,, +23.2714843750,23,-3.7391924574,-0.8657763780,-1.8761281479,1.3874687518,,, +23.2734375000,23,-4.2320418726,-2.0289021127,-1.6410656017,1.1553776184,,, +23.2753906250,23,-4.6254448950,-2.9920205427,-1.4321994286,0.9632799642,,, +23.2773437500,23,-4.8705730612,-3.6779014436,-1.2613487645,0.8113128007,,, +23.2792968750,23,-4.9290640300,-4.0315590704,-1.1370663213,0.6948791088,,, +23.2812500000,23,-4.7756795499,-4.0253857552,-1.0633215669,0.6045930528,,, +23.2832031250,23,-4.3998780334,-3.6615604675,-1.0387437987,0.5268439496,,, +23.2851562500,23,-3.8062709301,-2.9717897395,-1.0561709262,0.4452143951,,, +23.2871093750,23,-3.0139879758,-2.0151162339,-1.1023806559,0.3422133536,,, +23.2890625000,23,-2.0557813110,-0.8734001453,-1.1589597398,0.2015135820,,, +23.2910156250,23,-0.9771199834,0.3556434030,-1.2046917653,0.0106296161,,, +23.2929687500,23,0.1654963945,1.5661508121,-1.2184505031,-0.2373029146,,, +23.2949218750,23,1.3072826097,2.6516295087,-1.1819489297,-0.5430744323,,, +23.2968750000,23,2.3795254753,3.5137478397,-1.0818988368,-0.9009410110,,, +23.2988281250,23,3.3167433169,4.0719925602,-0.9102349545,-1.2982959626,,, +23.3007812500,23,4.0651369754,4.2715578881,-0.6627295198,-1.7166243995,,, +23.3027343750,23,4.5879876163,4.0886403795,-0.3389636530,-2.1329737887,,, +23.3046875000,23,4.8659406906,3.5318798281,0.0553236113,-2.5219372317,,, +23.3066406250,23,4.8944010500,2.6389771647,0.5057264300,-2.8590165300,,, +23.3085937500,23,4.6813380044,1.4723825754,0.9884416261,-3.1231077833,,, +23.3105468750,23,4.2463463769,0.1159534439,1.4718239085,-3.2966209574,,, +23.3125000000,23,3.6197493484,-1.3306848391,1.9198398002,-3.3654632216,,, +23.3144531250,23,2.8416125364,-2.7596164371,2.2964127575,-3.3195784737,,, +23.3164062500,23,1.9611236708,-4.0613435335,2.5698193238,-3.1531143213,,, +23.3183593750,23,1.0355189519,-5.1325500016,2.7170050890,-2.8651742353,,, +23.3203125000,23,0.1279811466,-5.8860245768,2.7276727603,-2.4617241048,,, +23.3222656250,23,-0.6955141188,-6.2594576635,2.6069456147,-1.9569143872,,, +23.3242187500,23,-1.3709218781,-6.2211060768,2.3752892383,-1.3728885353,,, +23.3261718750,23,-1.8421720779,-5.7728947349,2.0656881581,-0.7389606496,,, +23.3281250000,23,-2.0674612139,-4.9492505496,1.7185419795,-0.0892084829,,, +23.3300781250,23,-2.0259955244,-3.8103330272,1.3742726551,0.5430919811,,, +23.3320312500,23,-1.7246852342,-2.4333876356,1.0651101219,1.1317675495,,, +23.3339843750,23,-1.2009054339,-0.9053136264,0.8095910101,1.6614388480,,, +23.3359375000,23,-0.5187826338,0.6839774328,0.6115733215,2.1281823810,,, +23.3378906250,23,0.2392703820,2.2464340724,0.4628348395,2.5371379302,,, +23.3398437500,23,0.9840741167,3.6983105135,0.3483187884,2.8973171426,,, +23.3417968750,23,1.6326788442,4.9628696615,0.2524469088,3.2162049266,,, +23.3437500000,23,2.1185864181,5.9749435944,0.1630394833,3.4965732322,,, +23.3457031250,23,2.3959262055,6.6851765423,0.0711222030,3.7352086222,,, +23.3476562500,23,2.4397044215,7.0612166234,-0.0302924767,3.9221970637,,, +23.3496093750,23,2.2458372125,7.0860299338,-0.1450373067,4.0407270307,,, +23.3515625000,23,1.8306039366,6.7562529618,-0.2718249492,4.0686970570,,, +23.3535156250,23,1.2278196932,6.0830949244,-0.4044942691,3.9828411036,,, +23.3554687500,23,0.4848731743,5.0957184121,-0.5340364118,3.7644246681,,, +23.3574218750,23,-0.3409048128,3.8446935363,-0.6507989966,3.4043670464,,, +23.3593750000,23,-1.1853874879,2.4021846914,-0.7459548573,2.9054625819,,, +23.3613281250,23,-1.9806349309,0.8578268831,-0.8118092565,2.2816225614,,, +23.3632812500,23,-2.6595091175,-0.6879485404,-0.8425401349,1.5560644626,,, +23.3652343750,23,-3.1627486038,-2.1325763324,-0.8364793387,0.7586031544,,, +23.3671875000,23,-3.4457797055,-3.3814483210,-0.7977665405,-0.0779923997,,, +23.3691406250,23,-3.4830154681,-4.3559635021,-0.7359372982,-0.9200741981,,, +23.3710937500,23,-3.2703548558,-4.9983392418,-0.6647150341,-1.7331903698,,, +23.3730468750,23,-2.8266837156,-5.2760078537,-0.6009484852,-2.4831903566,,, +23.3750000000,23,-2.1934330518,-5.1851832149,-0.5633886275,-3.1387337585,,, +23.3769531250,23,-1.4305677615,-4.7501490380,-0.5704997644,-3.6727654671,,, +23.3789062500,23,-0.6087824107,-4.0189756795,-0.6367067672,-4.0631615871,,, +23.3808593750,23,0.1996926449,-3.0588786567,-0.7683650806,-4.2944020623,,, +23.3828125000,23,0.9284092775,-1.9518442250,-0.9619135750,-4.3599982820,,, +23.3847656250,23,1.5207570259,-0.7903217850,-1.2048948855,-4.2646278444,,, +23.3867187500,23,1.9318510524,0.3272158603,-1.4785194795,-4.0254284656,,, +23.3886718750,23,2.1311406872,1.3035438008,-1.7596479616,-3.6706217460,,, +23.3906250000,23,2.1071460788,2.0531246566,-2.0207257511,-3.2349887256,,, +23.3925781250,23,1.8705978688,2.5094251370,-2.2295988552,-2.7562926693,,, +23.3945312500,23,1.4515693773,2.6270027240,-2.3529167451,-2.2740369754,,, +23.3964843750,23,0.8930024758,2.3846180264,-2.3621798797,-1.8261215485,,, +23.3984375000,23,0.2463382206,1.7897457018,-2.2374287570,-1.4436770912,,, +23.4003906250,23,-0.4303633741,0.8787723664,-1.9674220243,-1.1487400276,,, +23.4023437500,23,-1.0750957499,-0.2856952217,-1.5495250635,-0.9534304578,,, +23.4042968750,23,-1.6266129114,-1.6167551416,-0.9909288398,-0.8575464075,,, +23.4062500000,23,-2.0303922274,-3.0076714314,-0.3099405765,-0.8471983461,,, +23.4082031250,23,-2.2442873596,-4.3415107499,0.4641293888,-0.8971522327,,, +23.4101562500,23,-2.2424900778,-5.5024274303,1.2926071701,-0.9749464739,,, +23.4121093750,23,-2.0173697788,-6.3856567515,2.1304112780,-1.0446729047,,, +23.4140625000,23,-1.5795966872,-6.9061570002,2.9298997757,-1.0704070056,,, +23.4160156250,23,-0.9573914335,-7.0047204339,3.6441857853,-1.0189095426,,, +23.4179687500,23,-0.1948629758,-6.6512603650,4.2295769461,-0.8618047652,,, +23.4199218750,23,0.6514629579,-5.8476140058,4.6484534857,-0.5789768113,,, +23.4218750000,23,1.5181748885,-4.6293249433,4.8729771240,-0.1624538190,,, +23.4238281250,23,2.3417876249,-3.0633813742,4.8886681379,0.3819513031,,, +23.4257812500,23,3.0653153513,-1.2426895008,4.6968404250,1.0350600296,,, +23.4277343750,23,3.6433055679,0.7212709192,4.3150627394,1.7659162406,,, +23.4296875000,23,4.0450274405,2.7088839103,3.7751078573,2.5354950295,,, +23.4316406250,23,4.2552934947,4.6035124947,3.1185597489,3.3010055572,,, +23.4335937500,23,4.2726979324,6.2991889847,2.3913018465,4.0185719774,,, +23.4355468750,23,4.1067106191,7.7065581671,1.6384204110,4.6461536412,,, +23.4375000000,23,3.7749474880,8.7589648987,0.9001031831,5.1476842794,,, +23.4394531250,23,3.3012029647,9.4165352268,0.2091278416,5.4963299057,,, +23.4414062500,23,2.7145717728,9.6679209933,-0.4095190348,5.6768305484,,, +23.4433593750,23,2.0482966334,9.5307515905,-0.9385523784,5.6875130702,,, +23.4453125000,23,1.3364204289,9.0482574175,-1.3696084233,5.5395456622,,, +23.4472656250,23,0.6100623001,8.2805467094,-1.7037192984,5.2523162882,,, +23.4492187500,23,-0.1026276086,7.2948424735,-1.9479679370,4.8481351190,,, +23.4511718750,23,-0.7738262372,6.1584780103,-2.1101563721,4.3488961703,,, +23.4531250000,23,-1.3758144677,4.9341176580,-2.1963208020,3.7742799738,,, +23.4550781250,23,-1.8844650325,3.6772425684,-2.2124477782,3.1413946978,,, +23.4570312500,23,-2.2834606882,2.4356733397,-2.1674659283,2.4656985578,,, +23.4589843750,23,-2.5668709075,1.2474427871,-2.0744328729,1.7605717137,,, +23.4609375000,23,-2.7393739205,0.1372297759,-1.9496737215,1.0351695962,,, +23.4628906250,23,-2.8140373023,-0.8830488138,-1.8111344569,0.2943710077,,, +23.4648437500,23,-2.8085544161,-1.8097698129,-1.6762732524,-0.4587538319,,, +23.4667968750,23,-2.7416225403,-2.6444146376,-1.5596353167,-1.2211576436,,, +23.4687500000,23,-2.6304414879,-3.3910891408,-1.4710544732,-1.9881457509,,, +23.4707031250,23,-2.4893671150,-4.0517808480,-1.4151672594,-2.7497149911,,, +23.4726562500,23,-2.3302685762,-4.6229024128,-1.3924752190,-3.4880504391,,, +23.4746093750,23,-2.1646983528,-5.0970762790,-1.4016939776,-4.1796371576,,, +23.4765625000,23,-2.0050154391,-5.4655166823,-1.4413899692,-4.7983522647,,, +23.4785156250,23,-1.8622055453,-5.7171914796,-1.5090866513,-5.3162029039,,, +23.4804687500,23,-1.7431840369,-5.8390085813,-1.5995691630,-5.7046886497,,, +23.4824218750,23,-1.6510155357,-5.8196746810,-1.7050853108,-5.9386266277,,, +23.4843750000,23,-1.5866336891,-5.6553547516,-1.8163661999,-6.0009528755,,, +23.4863281250,23,-1.5488411156,-5.3550216690,-1.9219751563,-5.8871965210,,, +23.4882812500,23,-1.5334863346,-4.9423931752,-2.0074591073,-5.6073346582,,, +23.4902343750,23,-1.5346419693,-4.4524464098,-2.0571900524,-5.1832449948,,, +23.4921875000,23,-1.5472011348,-3.9252630190,-2.0580933398,-4.6441804969,,, +23.4941406250,23,-1.5682475855,-3.4007026584,-2.0023362603,-4.0232528894,,, +23.4960937500,23,-1.5959313164,-2.9133145558,-1.8873562829,-3.3538184806,,, +23.4980468750,23,-1.6270161715,-2.4871236528,-1.7141444681,-2.6651330798,,, +23.5000000000,23,-1.6546317484,-2.1329859520,-1.4854130786,-1.9801556298,,, +23.5019531250,23,-1.6656763099,-1.8487365108,-1.2034682706,-1.3161840981,,, +23.5039062500,23,-1.6381299994,-1.6205702836,-0.8678327441,-0.6865048225,,, +23.5058593750,23,-1.5415079490,-1.4269449986,-0.4747641270,-0.1030792094,,, +23.5078125000,23,-1.3418874100,-1.2444575191,-0.0196943970,0.4207425431,,, +23.5097656250,23,-1.0083379279,-1.0512799104,0.4995323574,0.8706568036,,, +23.5117187500,23,-0.5181225719,-0.8276115661,1.0803900741,1.2345288702,,, +23.5136718750,23,0.1384613613,-0.5564318283,1.7136187553,1.5050477453,,, +23.5156250000,23,0.9536192295,-0.2243442873,2.3812153071,1.6818715277,,, +23.5175781250,23,1.8999884541,0.1782063439,3.0558579894,1.7732613322,,, +23.5195312500,23,2.9314406214,0.6544796833,3.7022357369,1.7943643456,,, +23.5214843750,23,3.9866826478,1.1973801117,4.2802328690,1.7628033118,,, +23.5234375000,23,4.9962173057,1.7888545965,4.7501094809,1.6960884730,,, +23.5253906250,23,5.8904263563,2.4032222645,5.0778213617,1.6117136746,,, +23.5273437500,23,6.6055050752,3.0109559521,5.2381860930,1.5275933985,,, +23.5292968750,23,7.0879415629,3.5818551058,5.2168382985,1.4621435495,,, +23.5312500000,23,7.2989535450,4.0877542196,5.0121373477,1.4338915278,,, +23.5332031250,23,7.2181492132,4.5042889115,4.6360321656,1.4597641372,,, +23.5351562500,23,6.8457474406,4.8119157388,4.1133336598,1.5523669705,,, +23.5371093750,23,6.2011591857,4.9958409541,3.4780675605,1.7169427277,,, +23.5390625000,23,5.3173843169,5.0444859047,2.7669337923,1.9483572747,,, +23.5410156250,23,4.2373862138,4.9496109997,2.0155063349,2.2308233414,,, +23.5429687500,23,3.0155154649,4.7106526652,1.2598002354,2.5424696525,,, +23.5449218750,23,1.7174577094,4.3384711195,0.5371854408,2.8603257164,,, +23.5468750000,23,0.4139089172,3.8526663233,-0.1177405513,3.1602142623,,, +23.5488281250,23,-0.8280643111,3.2760902362,-0.6789288146,3.4146124029,,, +23.5507812500,23,-1.9509831853,2.6336073677,-1.1318712034,3.5950005166,,, +23.5527343750,23,-2.9103083751,1.9539626436,-1.4736431468,3.6778727484,,, +23.5546875000,23,-3.6766280474,1.2705379009,-1.7115727982,3.6499705826,,, +23.5566406250,23,-4.2364034994,0.6208504211,-1.8613376360,3.5111999487,,, +23.5585937500,23,-4.5916206693,0.0432989015,-1.9452656600,3.2731695157,,, +23.5605468750,23,-4.7593088495,-0.4302760238,-1.9911694179,2.9527036560,,, +23.5625000000,23,-4.7695432681,-0.7806020612,-2.0301892824,2.5661646623,,, +23.5644531250,23,-4.6601483584,-1.0015121055,-2.0921430374,2.1283275050,,, +23.5664062500,23,-4.4702526291,-1.0995654727,-2.2000904624,1.6517464788,,, +23.5683593750,23,-4.2363769499,-1.0947819707,-2.3674160726,1.1449143878,,, +23.5703125000,23,-3.9909347803,-1.0181817460,-2.5977183957,0.6129715590,,, +23.5722656250,23,-3.7604379973,-0.9056985838,-2.8849804841,0.0612872445,,, +23.5742187500,23,-3.5625395708,-0.7920564597,-3.2129324730,-0.5013300135,,, +23.5761718750,23,-3.4034025698,-0.7055114761,-3.5550666045,-1.0607233597,,, +23.5781250000,23,-3.2773763948,-0.6642801547,-3.8770291772,-1.5973565269,,, +23.5800781250,23,-3.1691838145,-0.6760183045,-4.1411182737,-2.0889092198,,, +23.5820312500,23,-3.0565894265,-0.7381668102,-4.3106500793,-2.5129594499,,, +23.5839843750,23,-2.9134708698,-0.8395401645,-4.3536405225,-2.8495047464,,, +23.5859375000,23,-2.7151297078,-0.9667945365,-4.2471965543,-3.0864512275,,, +23.5878906250,23,-2.4441143038,-1.1116670989,-3.9816650600,-3.2249115653,,, +23.5898437500,23,-2.0934277380,-1.2718761530,-3.5624318641,-3.2784169313,,, +23.5917968750,23,-1.6672708239,-1.4473049906,-3.0093900233,-3.2674943208,,, +23.5937500000,23,-1.1808325726,-1.6369002811,-2.3551796534,-3.2145502259,,, +23.5957031250,23,-0.6593751331,-1.8376301320,-1.6426714463,-3.1407041212,,, +23.5976562500,23,-0.1358922675,-2.0451023302,-0.9213193052,-3.0645914328,,, +23.5996093750,23,0.3526634887,-2.2556955765,-0.2423633417,-3.0029712440,,, +23.6015625000,23,0.7703852828,-2.4672700147,0.3469142662,-2.9702327890,,, +23.6035156250,23,1.0887476309,-2.6760176029,0.8097830027,-2.9746255595,,, +23.6054687500,23,1.2922052426,-2.8730954855,1.1255781885,-3.0147548633,,, +23.6074218750,23,1.3804194951,-3.0455118710,1.2918838153,-3.0804149176,,, +23.6093750000,23,1.3674710920,-3.1800861178,1.3237501043,-3.1565602772,,, +23.6113281250,23,1.2791496675,-3.2665866413,1.2508317801,-3.2267537174,,, +23.6132812500,23,1.1482886833,-3.2981945302,1.1123863675,-3.2742869271,,, +23.6152343750,23,1.0102426452,-3.2684314251,0.9521239168,-3.2801551674,,, +23.6171875000,23,0.9012968673,-3.1652457927,0.8156203080,-3.2185462744,,, +23.6191406250,23,0.8571330153,-2.9692848159,0.7478505249,-3.0564081699,,, +23.6210937500,23,0.9081625055,-2.6616206577,0.7878728900,-2.7622031937,,, +23.6230468750,23,1.0752264933,-2.2345316741,0.9637554074,-2.3178471535,,, +23.6250000000,23,1.3671918924,-1.6985176032,1.2894277150,-1.7267728743,,, +23.6269531250,23,1.7785748537,-1.0848947478,1.7620676675,-1.0169336298,,, +23.6289062500,23,2.2901636455,-0.4416384074,2.3625787714,-0.2368262271,,, +23.6308593750,23,2.8739361833,0.1768046634,3.0601524628,0.5544158735,,, +23.6328125000,23,3.4967200272,0.7187336306,3.8160138292,1.2964791818,,, +23.6347656250,23,4.1204538953,1.1421693835,4.5843543938,1.9356985427,,, +23.6367187500,23,4.7032094301,1.4230161854,5.3138885504,2.4339235737,,, +23.6386718750,23,5.2031387264,1.5614656759,5.9521162211,2.7754885137,,, +23.6406250000,23,5.5834950957,1.5821461702,6.4509435575,2.9683799913,,, +23.6425781250,23,5.8159515525,1.5286500153,6.7709743267,3.0402158936,,, +23.6445312500,23,5.8804211275,1.4536181696,6.8826570492,3.0300989519,,, +23.6464843750,23,5.7627327762,1.4068539457,6.7654686348,2.9786433791,,, +23.6484375000,23,5.4539314455,1.4279758230,6.4081537336,2.9218543143,,, +23.6503906250,23,4.9526937929,1.5459001937,5.8111322216,2.8907163600,,, +23.6523437500,23,4.2675356451,1.7795160705,4.9882638229,2.9113921460,,, +23.6542968750,23,3.4160432011,2.1361639188,3.9654870852,3.0029005213,,, +23.6562500000,23,2.4239573615,2.6109283578,2.7788821475,3.1750383405,,, +23.6582031250,23,1.3265704910,3.1876280248,1.4748034839,3.4277844779,,, +23.6601562500,23,0.1703657291,3.8390333601,0.1105351890,3.7503117748,,, +23.6621093750,23,-0.9873429254,4.5262974086,-1.2468102587,4.1194375869,,, +23.6640625000,23,-2.0833365308,5.1983097421,-2.5256965022,4.4981244141,,, +23.6660156250,23,-3.0601961518,5.7914381801,-3.6617093056,4.8348768459,,, +23.6679687500,23,-3.8781329159,6.2335190424,-4.6090674928,5.0675691631,,, +23.6699218750,23,-4.5170513982,6.4550799182,-5.3430280720,5.1340706437,,, +23.6718750000,23,-4.9716107109,6.4026054693,-5.8555674013,4.9848722083,,, +23.6738281250,23,-5.2475621107,6.0469569097,-6.1519471125,4.5913406248,,, +23.6757812500,23,-5.3586153635,5.3884289763,-6.2476711169,3.9507810822,,, +23.6777343750,23,-5.3207631742,4.4615253859,-6.1630032058,3.0912061104,,, +23.6796875000,23,-5.1474838920,3.3348899758,-5.9179909980,2.0717268833,,, +23.6816406250,23,-4.8487563585,2.1022753372,-5.5306647516,0.9746758985,,, +23.6835937500,23,-4.4318779328,0.8683369985,-5.0168053323,-0.1071999568,,, +23.6855468750,23,-3.9046850645,-0.2671329897,-4.3921066486,-1.0852024211,,, +23.6875000000,23,-3.2830082847,-1.2251123922,-3.6785114105,-1.8894046017,,, +23.6894531250,23,-2.5975005927,-1.9573710339,-2.9102040050,-2.4778584345,,, +23.6914062500,23,-1.8944427896,-2.4470619006,-2.1341653816,-2.8368948190,,, +23.6933593750,23,-1.2312613063,-2.7048627100,-1.4058537769,-2.9772847683,,, +23.6953125000,23,-0.6680349892,-2.7636947358,-0.7813368186,-2.9293978418,,, +23.6972656250,23,-0.2559218267,-2.6719595090,-0.3069155770,-2.7374855231,,, +23.6992187500,23,-0.0269379885,-2.4881919744,-0.0101837605,-2.4555459765,,, +23.7011718750,23,0.0121107214,-2.2756706578,0.1050368945,-2.1429822110,,, +23.7031250000,23,-0.1177502908,-2.0926273246,0.0604951170,-1.8558072516,,, +23.7050781250,23,-0.3703299486,-1.9832116706,-0.0994592829,-1.6381745580,,, +23.7070312500,23,-0.6842420473,-1.9769559478,-0.3171844966,-1.5214541381,,, +23.7089843750,23,-0.9961668691,-2.0935680821,-0.5338534145,-1.5281236060,,, +23.7109375000,23,-1.2507588941,-2.3444053775,-0.6985798003,-1.6726839866,,, +23.7128906250,23,-1.4048164957,-2.7281855826,-0.7723979015,-1.9573404809,,, +23.7148437500,23,-1.4274580388,-3.2245237053,-0.7285335496,-2.3657023900,,, +23.7167968750,23,-1.2994059383,-3.7900540107,-0.5517624415,-2.8589864724,,, +23.7187500000,23,-1.0153029669,-4.3623111421,-0.2405059443,-3.3797009410,,, +23.7207031250,23,-0.5886284790,-4.8715360517,0.1888266589,-3.8628781149,,, +23.7226562500,23,-0.0527545080,-5.2526898656,0.7013396587,-4.2473533454,,, +23.7246093750,23,0.5443118704,-5.4532766242,1.2491765482,-4.4829526501,,, +23.7265625000,23,1.1473407548,-5.4395783289,1.7790159463,-4.5362389405,,, +23.7285156250,23,1.7003810705,-5.2012513599,2.2385338601,-4.3948310170,,, +23.7304687500,23,2.1527371501,-4.7513456022,2.5821079690,-4.0674956903,,, +23.7324218750,23,2.4645203742,-4.1232936228,2.7758847894,-3.5815211117,,, +23.7343750000,23,2.6098131840,-3.3681000729,2.8004427350,-2.9804234598,,, +23.7363281250,23,2.5774718062,-2.5498098078,2.6510822944,-2.3200671070,,, +23.7382812500,23,2.3716249593,-1.7375045843,2.3377079079,-1.6614802359,,, +23.7402343750,23,2.0116350805,-0.9970540257,1.8842059441,-1.0634074146,,, +23.7421875000,23,1.5312074816,-0.3839586942,1.3270615896,-0.5758705665,,, +23.7441406250,23,0.9773210124,0.0634157251,0.7138697052,-0.2340330938,,, +23.7460937500,23,0.4074333329,0.3273810582,0.1004839893,-0.0548791136,,, +23.7480468750,23,-0.1164261413,0.4103547984,-0.4543804915,-0.0373970712,,, +23.7500000000,23,-0.5351843734,0.3341144336,-0.8958397796,-0.1625879073,,, +23.7519531250,23,-0.8000377319,0.1391100562,-1.1792652865,-0.3933358163,,, +23.7539062500,23,-0.8792368644,-0.1195120584,-1.2761861238,-0.6775353756,,, +23.7558593750,23,-0.7646222782,-0.3791826633,-1.1800354102,-0.9546093653,,, +23.7578125000,23,-0.4759115156,-0.5786035706,-0.9100653209,-1.1638780739,,, +23.7597656250,23,-0.0589718127,-0.6660371453,-0.5098800508,-1.2530664816,,, +23.7617187500,23,0.4233128535,-0.6044453561,-0.0389999549,-1.1838962101,,, +23.7636718750,23,0.9042845140,-0.3730775686,0.4395793719,-0.9340861319,,, +23.7656250000,23,1.3239592427,0.0312884042,0.8692111242,-0.4989081175,,, +23.7675781250,23,1.6333394704,0.5929653025,1.2035273621,0.1071436158,,, +23.7695312500,23,1.7951947987,1.2785476764,1.4069331214,0.8512010617,,, +23.7714843750,23,1.7840067882,2.0399367432,1.4543682596,1.6847915981,,, +23.7734375000,23,1.5881487256,2.8183321830,1.3333700681,2.5477605377,,, +23.7753906250,23,1.2158775926,3.5521820509,1.0498091498,3.3761315239,,, +23.7773437500,23,0.6987935931,4.1876126872,0.6311667820,4.1124120659,,, +23.7792968750,23,0.0876781079,4.6847301077,0.1226653465,4.7120496028,,, +23.7812500000,23,-0.5530431215,5.0192711691,-0.4177232913,5.1455241421,,, +23.7832031250,23,-1.1481228615,5.1832350101,-0.9216645606,5.3994118482,,, +23.7851562500,23,-1.6187194072,5.1821946475,-1.3170909757,5.4741471085,,, +23.7871093750,23,-1.8962634126,5.0281082982,-1.5411096628,5.3774647436,,, +23.7890625000,23,-1.9341302105,4.7346392246,-1.5508311909,5.1202913392,,, +23.7910156250,23,-1.7119634958,4.3185794496,-1.3273806156,4.7183659932,,, +23.7929687500,23,-1.2355325374,3.8038499342,-0.8758647697,4.1960849776,,, +23.7949218750,23,-0.5358271125,3.2257231412,-0.2247276968,3.5904076966,,, +23.7968750000,23,0.3313161645,2.6330268391,0.5743641189,2.9527305795,,, +23.7988281250,23,1.2875748986,2.0848009276,1.4485720931,2.3452665408,,, +23.8007812500,23,2.2402249571,1.6420294088,2.3115012251,1.8325871605,,, +23.8027343750,23,3.0948145917,1.3586576311,3.0752895115,1.4725179965,,, +23.8046875000,23,3.7672907909,1.2736431378,3.6621582253,1.3080478267,,, +23.8066406250,23,4.1922033798,1.4032233752,4.0121592665,1.3594242663,,, +23.8085937500,23,4.3274157602,1.7355339581,4.0875632502,1.6185988040,,, +23.8105468750,23,4.1564673022,2.2310128704,3.8750055723,2.0494581064,,, +23.8125000000,23,3.6879383757,2.8270753755,3.3847953762,2.5923733629,,, +23.8144531250,23,2.9525069663,3.4448878446,2.6479672877,3.1707966060,,, +23.8164062500,23,1.9995504721,3.9979262117,1.7127821014,3.6994864914,,, +23.8183593750,23,0.8922566566,4.3985467240,0.6399279829,4.0909350261,,, +23.8203125000,23,-0.2984503712,4.5614094123,-0.5030844561,4.2590998334,,, +23.8222656250,23,-1.4972417164,4.4097884444,-1.6448128151,4.1261020788,,, +23.8242187500,23,-2.6249531880,3.8872138016,-2.7103250072,3.6339521051,,, +23.8261718750,23,-3.6018580137,2.9685586310,-3.6243702742,2.7555627296,,, +23.8281250000,23,-4.3563776944,1.6657987448,-4.3197316012,1.5005385197,,, +23.8300781250,23,-4.8348338650,0.0308282178,-4.7465602569,-0.0819370642,,, +23.8320312500,23,-5.0072245902,-1.8442890835,-4.8779002810,-1.9027948186,,, +23.8339843750,23,-4.8690834322,-3.8350886220,-4.7113413141,-3.8406305122,,, +23.8359375000,23,-4.4407858210,-5.7988351433,-4.2681669938,-5.7555290700,,, +23.8378906250,23,-3.7643741296,-7.5879662830,-3.5902189918,-7.5023455522,,, +23.8398437500,23,-2.8987880659,-9.0633472900,-2.7352393490,-8.9438182943,,, +23.8417968750,23,-1.9158353606,-10.1091937299,-1.7728717744,-9.9652711619,,, +23.8437500000,23,-0.8977390388,-10.6466436781,-0.7822303148,-10.4880340352,,, +23.8457031250,23,0.0669422195,-10.6440073960,0.1520345587,-10.4796420118,,, +23.8476562500,23,0.8918618918,-10.1216036378,0.9479141502,-9.9587283157,,, +23.8496093750,23,1.5048679848,-9.1466762789,1.5373744905,-8.9902474041,,, +23.8515625000,23,1.8595501115,-7.8197588794,1.8771623584,-7.6723263465,,, +23.8535156250,23,1.9399966767,-6.2617491609,1.9531931543,-6.1236579891,,, +23.8554687500,23,1.7574233567,-4.6046899824,1.7772713689,-4.4743646099,,, +23.8574218750,23,1.3456510190,-2.9803045484,1.3826851535,-2.8546483355,,, +23.8593750000,23,0.7583612866,-1.5067794329,0.8214718406,-1.3817528764,,, +23.8613281250,23,0.0642695536,-0.2795964458,0.1597443491,-0.1508660129,,, +23.8632812500,23,-0.6611248489,0.6334404538,-0.5302011176,0.7699076525,,, +23.8652343750,23,-1.3451022147,1.1941237591,-1.1789775678,1.3416200489,,, +23.8671875000,23,-1.9257348737,1.3927631068,-1.7276676009,1.5536174923,,, +23.8691406250,23,-2.3558509774,1.2476280711,-2.1315622570,1.4230928617,,, +23.8710937500,23,-2.6039327370,0.8067774896,-2.3610747852,0.9968440328,,, +23.8730468750,23,-2.6557162863,0.1475065667,-2.4033515732,0.3506341299,,, +23.8750000000,23,-2.5157393036,-0.6289126970,-2.2637938856,-0.4160821159,,, +23.8769531250,23,-2.2039543772,-1.4033881771,-1.9628217156,-1.1863225256,,, +23.8789062500,23,-1.7496796247,-2.0479565483,-1.5299851263,-1.8344088434,,, +23.8808593750,23,-1.1892685292,-2.4421701641,-1.0014887720,-2.2419773948,,, +23.8828125000,23,-0.5655871783,-2.4904277815,-0.4194439689,-2.3149102548,,, +23.8847656250,23,0.0744503178,-2.1326078220,0.1706368499,-1.9937492234,,, +23.8867187500,23,0.6824242032,-1.3508959982,0.7224073489,-1.2603394972,,, +23.8886718750,23,1.2109266404,-0.1745334297,1.1912449661,-0.1423849362,,, +23.8906250000,23,1.6181753656,1.3216810247,1.5387084513,1.2880559906,,, +23.8925781250,23,1.8731463210,3.0252803554,1.7373396039,2.9222328036,,, +23.8945312500,23,1.9589437970,4.7976726644,1.7736851098,4.6258965289,,, +23.8964843750,23,1.8749872622,6.4895992602,1.6501098476,6.2543011570,,, +23.8984375000,23,1.6389253962,7.9590007218,1.3862977126,7.6695372909,,, +23.9003906250,23,1.2873181872,9.0851992867,1.0196388582,8.7542957597,,, +23.9023437500,23,0.8739153025,9.7772097452,0.6034293026,9.4199558721,,, +23.9042968750,23,0.4656544735,9.9797593042,0.2029326127,9.6124712875,,, +23.9062500000,23,0.1347306978,9.6754105359,-0.1122544810,9.3144962149,,, +23.9082031250,23,-0.0547949585,8.8802428967,-0.2809763721,8.5412611974,,, +23.9101562500,23,-0.0602052462,7.6409148181,-0.2631695371,7.3377560050,,, +23.9121093750,23,0.1342782787,6.0373607277,-0.0452896906,5.7813696694,,, +23.9140625000,23,0.5188522574,4.1820192247,0.3610436352,3.9811842615,,, +23.9160156250,23,1.0625098439,2.2104733452,0.9234666632,2.0689189892,,, +23.9179687500,23,1.7197620332,0.2693920545,1.5955503949,0.1871894595,,, +23.9199218750,23,2.4376642633,-1.4953112242,2.3237311428,-1.5220728125,,, +23.9218750000,23,3.1597672126,-2.9531588900,3.0513275208,-2.9319597212,,, +23.9238281250,23,3.8296498703,-4.0042837519,3.7221715611,-3.9453960917,,, +23.9257812500,23,4.3979840232,-4.5891584083,4.2875541450,-4.5046463742,,, +23.9277343750,23,4.8294492715,-4.6926731021,4.7129527249,-4.5952923182,,, +23.9296875000,23,5.1051496730,-4.3430405887,4.9803588133,-4.2451456626,,, +23.9316406250,23,5.2201338260,-3.6057789483,5.0858123566,-3.5183573660,,, +23.9335937500,23,5.1753576369,-2.5777654192,5.0315977667,-2.5095735543,,, +23.9355468750,23,4.9687098091,-1.3813142023,4.8175442948,-1.3381051260,,, +23.9375000000,23,4.5934789449,-0.1525882431,4.4393801101,-0.1366132623,,, +23.9394531250,23,4.0432373670,0.9729280663,3.8931971179,0.9630335284,,, +23.9414062500,23,3.3160756211,1.8714517271,3.1793392011,1.8404786056,,, +23.9433593750,23,2.4173244284,2.4401101775,2.3048501798,2.3958141403,,, +23.9453125000,23,1.3630651261,2.6061348797,1.2866695403,2.5584867192,,, +23.9472656250,23,0.1815337898,2.3310464790,0.1528879952,2.2913354250,,, +23.9492187500,23,-1.0894666804,1.6102473543,-1.0597596666,1.5901698777,,, +23.9511718750,23,-2.4044782806,0.4748261408,-2.3077953397,0.4854907406,,, +23.9531250000,23,-3.7110393282,-1.0075318177,-3.5416667206,-0.9566577190,,, +23.9550781250,23,-4.9549411758,-2.7400393295,-4.7106908668,-2.6419865189,,, +23.9570312500,23,-6.0899929623,-4.6087719142,-5.7722554047,-4.4595953932,,, +23.9589843750,23,-7.0839941016,-6.4920256597,-6.6974167585,-6.2910800193,,, +23.9609375000,23,-7.9152378213,-8.2659121275,-7.4674428349,-8.0159872718,,, +23.9628906250,23,-8.5637786181,-9.8069206852,-8.0653545806,-9.5143120233,,, +23.9648437500,23,-9.0060738470,-10.9962771286,-8.4706713805,-10.6707186400,,, +23.9667968750,23,-9.2161838549,-11.7318081259,-8.6603314673,-11.3860418799,,, +23.9687500000,23,-9.1710634615,-11.9416330232,-8.6135194402,-11.5905589599,,, +23.9707031250,23,-8.8565337262,-11.5894172328,-8.3173046769,-11.2490648838,,, +23.9726562500,23,-8.2713199427,-10.6720985505,-7.7705616264,-10.3586459735,,, +23.9746093750,23,-7.4282902582,-9.2169419485,-6.9852157481,-8.9458162582,,, +23.9765625000,23,-6.3528054833,-7.2781925163,-5.9847198680,-7.0632733782,,, +23.9785156250,23,-5.0786811930,-4.9313574738,-4.8002750853,-4.7843546970,,, +23.9804687500,23,-3.6443680429,-2.2682710960,-3.4672470830,-2.1982531957,,, +23.9824218750,23,-2.0899096647,0.6063354349,-2.0223032663,0.5933061313,,, +23.9843750000,23,-0.4539163767,3.5795172957,-0.5005868249,3.4806088890,,, +23.9863281250,23,1.2247709671,6.5312863526,1.0626579193,6.3470880635,,, +23.9882812500,23,2.9001194147,9.3304079991,2.6254570468,9.0652471801,,, +23.9902343750,23,4.5159821982,11.8364722517,4.1362562442,11.4986767305,,, +23.9921875000,23,6.0099344247,13.9124430284,5.5373899046,13.5142474589,,, +23.9941406250,23,7.3180919707,15.4386803600,6.7694727917,14.9957369124,,, +23.9960937500,23,8.3800697062,16.3250938606,7.7759602759,15.8556406492,,, +23.9980468750,23,9.1454491749,16.5219623272,8.5091855167,16.0456844369,,, +24.0000000000,24,9.5789080687,16.0244232787,8.9352452695,15.5612164510,33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000:10.0000000000:11.0000000000:12.0000000000:13.0000000000:14.0000000000:15.0000000000:19.0000000000:20.0000000000:21.0000000000:22.0000000000:23.0000000000:24.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +24.0019531250,24,9.6614855870,14.8685039301,9.0352696329,14.4373220968,,, +24.0039062500,24,9.3910606634,13.1255249976,8.8059498735,12.7433411856,,, +24.0058593750,24,8.7844806665,10.8981831929,8.2616775245,10.5790823492,,, +24.0078125000,24,7.8783554838,8.3146268082,7.4354139370,8.0690620035,,, +24.0097656250,24,6.7266063164,5.5205534541,6.3764712751,5.3548263248,,, +24.0117187500,24,5.3953664854,2.6701960760,5.1457644909,2.5861971945,,, +24.0136718750,24,3.9549182440,-0.0860775608,3.8082705509,-0.0907687902,,, +24.0156250000,24,2.4700468388,-2.6150577321,2.4239800945,-2.5466859410,,, +24.0175781250,24,0.9941747645,-4.8085927520,1.0423918379,-4.6765090856,,, +24.0195312500,24,-0.4299439613,-6.5866434431,-0.2967648723,-6.4025042475,,, +24.0214843750,24,-1.7663714451,-7.8991823455,-1.5597882539,-7.6761018364,,, +24.0234375000,24,-2.9821059084,-8.7258025645,-2.7152763448,-8.4775232436,,, +24.0253906250,24,-4.0436198291,-9.0741879409,-3.7308219569,-8.8142996753,,, +24.0273437500,24,-4.9160498031,-8.9811708776,-4.5722139838,-8.7223018110,,, +24.0292968750,24,-5.5677601120,-8.5127748085,-5.2078291102,-8.2657727182,,, +24.0312500000,24,-5.9775242525,-7.7579304769,-5.6156558578,-7.5312060301,,, +24.0332031250,24,-6.1375046947,-6.8170232086,-5.7863662022,-6.6162066201,,, +24.0351562500,24,-6.0501144962,-5.7887234930,-5.7205288367,-5.6166934238,,, +24.0371093750,24,-5.7257786991,-4.7599265914,-5.4266332943,-4.6171231988,,, +24.0390625000,24,-5.1889605391,-3.8044637716,-4.9269133424,-3.6892269324,,, +24.0410156250,24,-4.4879018890,-2.9881188777,-4.2666333683,-2.8968693708,,, +24.0429687500,24,-3.6953628410,-2.3688927012,-3.5147956168,-2.2963048034,,, +24.0449218750,24,-2.8956362472,-1.9870323968,-2.7518186007,-1.9265075367,,, +24.0468750000,24,-2.1650524464,-1.8523366594,-2.0509980739,-1.7968657298,,, +24.0488281250,24,-1.5566516946,-1.9385605027,-1.4638533540,-1.8817696885,,, +24.0507812500,24,-1.0960939571,-2.1871632961,-1.0161238582,-2.1242630771,,, +24.0527343750,24,-0.7874978952,-2.5183748800,-0.7131926644,-2.4467905453,,, +24.0546875000,24,-0.6203382828,-2.8448702594,-0.5464823779,-2.7644792467,,, +24.0566406250,24,-0.5706277674,-3.0808064771,-0.4944318791,-2.9939218273,,, +24.0585937500,24,-0.5993441471,-3.1464477646,-0.5209001948,-3.0576754396,,, +24.0605468750,24,-0.6557532065,-2.9762653568,-0.5782206588,-2.8921297644,,, +24.0625000000,24,-0.6865897850,-2.5305976653,-0.6158304217,-2.4588255892,,, +24.0644531250,24,-0.6448965885,-1.8033141441,-0.5886415615,-1.7518889524,,, +24.0664062500,24,-0.4943994808,-0.8231545986,-0.4612283859,-0.7993249076,,, +24.0683593750,24,-0.2102478976,0.3499172406,-0.2086047496,0.3405289829,,, +24.0703125000,24,0.2207514018,1.6329604765,0.1834043758,1.5870202470,,, +24.0722656250,24,0.7975267598,2.9293498461,0.7154877165,2.8462200507,,, +24.0742187500,24,1.5014230142,4.1362479270,1.3715204284,4.0181930343,,, +24.0761718750,24,2.2967299023,5.1535356266,2.1189136874,5.0056777772,,, +24.0781250000,24,3.1341932962,5.8942353848,2.9118086991,5.7242128748,,, +24.0800781250,24,3.9543803605,6.2915856395,3.6941896411,6.1090077929,,, +24.0820312500,24,4.6935363516,6.3045347445,4.4054230061,6.1202727387,,, +24.0839843750,24,5.2935131795,5.9248688783,4.9896870373,5.7501296165,,, +24.0859375000,24,5.7105029768,5.1808216395,5.4043135614,5.0261048880,,, +24.0878906250,24,5.9176251088,4.1325868079,5.6223577364,4.0067624677,,, +24.0898437500,24,5.9033324824,2.8644237314,5.6312044540,2.7740318494,,, +24.0917968750,24,5.6729564283,1.4807951436,5.4341239782,1.4294506562,,, +24.0937500000,24,5.2553624642,0.1060458254,5.0566839958,0.0938402188,,, +24.0957031250,24,4.7058352665,-1.1204496151,4.5496129123,-1.0974164688,,, +24.0976562500,24,4.0961376495,-2.0605163491,3.9795204316,-2.0101336172,,, +24.0996093750,24,3.4928141469,-2.6047105183,3.4085047092,-2.5380463128,,, +24.1015625000,24,2.9362158153,-2.6988638995,2.8744364394,-2.6285759795,,, +24.1035156250,24,2.4349337439,-2.3515380116,2.3857343836,-2.2900654147,,, +24.1054687500,24,1.9757214041,-1.6215253145,1.9306938335,-1.5796456984,,, +24.1074218750,24,1.5351627201,-0.6018619743,1.4884330495,-0.5877154629,,, +24.1093750000,24,1.0849295815,0.5912204171,1.0337571450,0.5727899397,,, +24.1113281250,24,0.5940973445,1.8273111672,0.5392262500,1.7751590715,,, +24.1132812500,24,0.0335740948,2.9712262499,-0.0207487786,2.8880396974,,, +24.1152343750,24,-0.6170173810,3.8959911145,-0.6635137813,3.7880465315,,, +24.1171875000,24,-1.3643947706,4.4995426762,-1.3937099892,4.3759871421,,, +24.1191406250,24,-2.2007863967,4.7176413683,-2.2027062276,4.5894107110,,, +24.1210937500,24,-3.1039492868,4.5281728574,-3.0686936584,4.4067885849,,, +24.1230468750,24,-4.0382774504,3.9486622171,-3.9577087021,3.8450990742,,, +24.1250000000,24,-4.9596118520,3.0299248932,-4.8281500188,2.9536636873,,, +24.1269531250,24,-5.8219553793,1.8469893251,-5.6370803266,1.8053348645,,, +24.1289062500,24,-6.5834660819,0.4887964500,-6.3458115126,0.4864938040,,, +24.1308593750,24,-7.2097649237,-0.9488331587,-6.9229630645,-0.9097800468,,, +24.1328125000,24,-7.6737237222,-2.3661471186,-7.3442053956,-2.2865748653,,, +24.1347656250,24,-7.9542154784,-3.6634233108,-7.5909861839,-3.5469998374,,, +24.1367187500,24,-8.0359755283,-4.7477726711,-7.6502750319,-4.6007975546,,, +24.1386718750,24,-7.9098232489,-5.5409242044,-7.5146374621,-5.3719102378,,, +24.1406250000,24,-7.5723827208,-5.9873870394,-7.1818196986,-5.8064130141,,, +24.1425781250,24,-7.0256693806,-6.0610158794,-6.6542328567,-5.8788953136,,, +24.1445312500,24,-6.2786215516,-5.7684972889,-5.9403642374,-5.5958459166,,, +24.1464843750,24,-5.3509326857,-5.1501844336,-5.0584506725,-4.9964568023,,, +24.1484375000,24,-4.2725477638,-4.2730406019,-4.0361196584,-4.1457647307,,, +24.1503906250,24,-3.0762672657,-3.2142446281,-2.9035634488,-3.1187289654,,, +24.1523437500,24,-1.7926034740,-2.0486207101,-1.6888129598,-1.9880226218,,, +24.1542968750,24,-0.4516918090,-0.8469260679,-0.4196083118,-0.8223651808,,, +24.1562500000,24,0.9117353700,0.3233316934,0.8718280421,0.3126915036,,, +24.1582031250,24,2.2536655862,1.3990968672,2.1442616713,1.3559395342,,, +24.1601562500,24,3.5202779803,2.3225214094,3.3469239589,2.2512501587,,, +24.1621093750,24,4.6539280658,3.0419398056,4.4252553395,2.9485108152,,, +24.1640625000,24,5.6012179627,3.5155280421,5.3286078572,3.4071672990,,, +24.1660156250,24,6.3171201982,3.7155858694,6.0141376792,3.6003783250,,, +24.1679687500,24,6.7652727265,3.6300419389,6.4470618307,3.5164774581,,, +24.1699218750,24,6.9207131214,3.2641073092,6.6032601657,3.1605750418,,, +24.1718750000,24,6.7773477072,2.6442700695,6.4763931042,2.5584273027,,, +24.1738281250,24,6.3536273107,1.8189934319,6.0833522649,1.7571047037,,, +24.1757812500,24,5.6922045140,0.8546817400,5.4640027634,0.8210716670,,, +24.1777343750,24,4.8561346548,-0.1687660404,4.6776060082,-0.1721286428,,, +24.1796875000,24,3.9232855137,-1.1642622637,3.7975516862,-1.1379934414,,, +24.1816406250,24,2.9795571392,-2.0469518355,2.9050005401,-1.9942047345,,, +24.1835937500,24,2.1121138923,-2.7421564356,2.0825125222,-2.6683380712,,, +24.1855468750,24,1.4005138985,-3.1919277325,1.4056260801,-3.1042157573,,, +24.1875000000,24,0.9037975621,-3.3640944378,0.9305925764,-3.2706766547,,, +24.1894531250,24,0.6495374838,-3.2583752480,0.6839460796,-3.1674977043,,, +24.1914062500,24,0.6330109399,-2.9017507051,0.6616238890,-2.8208942472,,, +24.1933593750,24,0.8248161839,-2.3388148074,0.8361246597,-2.2741560531,,, +24.1953125000,24,1.1780080923,-1.6260223042,1.1632738632,-1.5820685294,,, +24.1972656250,24,1.6305884288,-0.8281355690,1.5845570539,-0.8074638510,,, +24.1992187500,24,2.1074871100,-0.0135678970,2.0289431748,-0.0166989948,,, +24.2011718750,24,2.5285447370,0.7513431472,2.4204654305,0.7258958596,,, +24.2031250000,24,2.8228886987,1.4099225240,2.6919231447,1.3653658150,,, +24.2050781250,24,2.9395886696,1.9207476720,2.7950380071,1.8615453384,,, +24.2070312500,24,2.8457521804,2.2553313915,2.6986624167,2.1868094459,,, +24.2089843750,24,2.5196007314,2.3936395574,2.3821950739,2.3217292816,,, +24.2109375000,24,1.9509215995,2.3267668749,1.8359674407,2.2576711787,,, +24.2128906250,24,1.1469484412,2.0633498563,1.0667885575,2.0030181446,,, +24.2148437500,24,0.1347746237,1.6323605328,0.1002174072,1.5858800105,,, +24.2167968750,24,-1.0407110338,1.0824161211,-1.0214120968,1.0534254315,,, +24.2187500000,24,-2.3198673877,0.4785755184,-2.2418629609,0.4687735516,,, +24.2207031250,24,-3.6317227624,-0.1048289153,-3.4941596713,-0.0959659026,,, +24.2226562500,24,-4.8997003076,-0.5945937568,-4.7059115483,-0.5697909468,,, +24.2246093750,24,-6.0512530379,-0.9305391922,-5.8083724664,-0.8943488524,,, +24.2265625000,24,-7.0279412405,-1.0761918273,-6.7459480815,-1.0342990115,,, +24.2285156250,24,-7.7892935546,-1.0235354332,-7.4798261044,-0.9819217241,,, +24.2304687500,24,-8.3093759655,-0.7896570542,-7.9847335490,-0.7538639945,,, +24.2324218750,24,-8.5699725925,-0.4076367188,-8.2425367245,-0.3822980038,,, +24.2343750000,24,-8.5538815362,0.0836618494,-8.2359721643,0.0949879694,,, +24.2363281250,24,-8.2420824323,0.6468288942,-7.9460510804,0.6416171860,,, +24.2382812500,24,-7.6185479096,1.2477113733,-7.3567239342,1.2243835178,,, +24.2402343750,24,-6.6799111961,1.8522348948,-6.4641295796,1.8101788932,,, +24.2421875000,24,-5.4402396461,2.4242854266,-5.2811522924,2.3639425872,,, +24.2441406250,24,-3.9270682699,2.9294866298,-3.8336721249,2.8523245304,,, +24.2460937500,24,-2.1765334621,3.3398417221,-2.1559648277,3.2481869939,,, +24.2480468750,24,-0.2355910966,3.6319154904,-0.2928043992,3.5288414231,,, +24.2500000000,24,1.8311453383,3.7815111484,1.6940505296,3.6708873192,,, +24.2519531250,24,3.9383021924,3.7631332185,3.7228795509,3.6496950609,,, +24.2539062500,24,5.9830950652,3.5543705470,5.6951450000,3.4436584733,,, +24.2558593750,24,7.8523253733,3.1410884460,7.5021327020,3.0392275820,,, +24.2578125000,24,9.4326437568,2.5240125446,9.0347122246,2.4372881159,,, +24.2597656250,24,10.6231319429,1.7239406209,10.1953539387,1.6582043321,,, +24.2617187500,24,11.3446369427,0.7781126856,10.9071805865,0.7382774530,,, +24.2636718750,24,11.5433469464,-0.2703130617,11.1176012406,-0.2804838460,,, +24.2656250000,24,11.1929805773,-1.3792062312,10.8005455673,-1.3571142858,,, +24.2675781250,24,10.2995021079,-2.5059165146,9.9609752473,-2.4501952608,,, +24.2695312500,24,8.9053061539,-3.6019036087,8.6388149526,-3.5126442164,,, +24.2714843750,24,7.0859613389,-4.6118213873,6.9058009619,-4.4908197179,,, +24.2734375000,24,4.9386125642,-5.4805665310,4.8544447778,-5.3313504872,,, +24.2753906250,24,2.5703869055,-6.1627185781,2.5870440153,-5.9902872334,,, +24.2773437500,24,0.0946042464,-6.6262096565,0.2121017879,-6.4366609010,,, +24.2792968750,24,-2.3677628943,-6.8502126091,-2.1543059914,-6.6504327014,,, +24.2812500000,24,-4.6897909461,-6.8232825629,-4.3902022576,-6.6206856190,,, +24.2832031250,24,-6.7458929291,-6.5430141836,-6.3747306055,-6.3452798616,,, +24.2851562500,24,-8.4214588836,-6.0157726834,-7.9974409355,-5.8305765772,,, +24.2871093750,24,-9.6228208178,-5.2582848070,-9.1678536181,-5.0929679170,,, +24.2890625000,24,-10.2851457340,-4.2996867075,-9.8230206777,-4.1608540882,,, +24.2910156250,24,-10.3767129906,-3.1799087221,-9.9316731935,-3.0730679042,,, +24.2929687500,24,-9.9017549629,-1.9464003017,-9.4970160763,-1.8756894850,,, +24.2949218750,24,-8.9019941793,-0.6520836141,-8.5582455483,-0.6200565374,,, +24.2968750000,24,-7.4546222498,0.6473915598,-7.1886539368,0.6398985402,,, +24.2988281250,24,-5.6670422227,1.8967079750,-5.4906243778,1.8506125908,,, +24.3007812500,24,-3.6689059072,3.0417419082,-3.5879810079,2.9597155957,,, +24.3027343750,24,-1.6010877062,4.0305847518,-1.6153927021,3.9170061257,,, +24.3046875000,24,0.3959290278,4.8170539628,0.2927431798,4.6778438004,,, +24.3066406250,24,2.1910409591,5.3633609776,2.0109056602,5.2057268619,,, +24.3085937500,24,3.6701169750,5.6415009206,3.4297337892,5.4736304258,,, +24.3105468750,24,4.7454270751,5.6388380631,4.4650014799,5.4694169689,,, +24.3125000000,24,5.3647990774,5.3662325868,5.0662834700,5.2037150935,,, +24.3144531250,24,5.5143246221,4.8595263041,5.2195327996,4.7113577870,,, +24.3164062500,24,5.2143500009,4.1737051382,4.9433279525,4.0457183963,,, +24.3183593750,24,4.5139080796,3.3759426474,4.2836399174,3.2719624745,,, +24.3203125000,24,3.4851938203,2.5384213859,3.3086455204,2.4600841448,,, +24.3222656250,24,2.2181132179,1.7309405746,2.1036156005,1.6777352122,,, +24.3242187500,24,0.8168126688,1.0162541594,0.7676597929,0.9857033143,,, +24.3261718750,24,-0.6027389132,0.4470515191,-0.5885452714,0.4349839809,,, +24.3281250000,24,-1.9181736800,0.0605263934,-1.8478769595,0.0615151418,,, +24.3300781250,24,-3.0116485749,-0.1290876750,-2.8971453052,-0.1210548805,,, +24.3320312500,24,-3.7843429859,-0.1348222517,-3.6409707099,-0.1255257950,,, +24.3339843750,24,-4.1681339604,0.0066929668,-4.0130915034,0.0124332988,,, +24.3359375000,24,-4.1288883398,0.2461309370,-3.9797344003,0.2448744854,,, +24.3378906250,24,-3.6633680730,0.5327343772,-3.5368431301,0.5225074902,,, +24.3398437500,24,-2.7957916361,0.8198835112,-2.7068710548,0.8001007540,,, +24.3417968750,24,-1.5753805271,1.0661940617,-1.5364397375,1.0375434282,,, +24.3437500000,24,-0.0732642484,1.2370239473,-0.0933874541,1.2013032790,,, +24.3457031250,24,1.6204794464,1.3066585650,1.5360394448,1.2665435757,,, +24.3476562500,24,3.3988954357,1.2580863692,3.2491839058,1.2169013302,,, +24.3496093750,24,5.1413771468,1.0819034196,4.9301037826,1.0434182607,,, +24.3515625000,24,6.7200924781,0.7775288129,6.4557356996,0.7457112515,,, +24.3535156250,24,8.0092128537,0.3547976246,7.7047508463,0.3335055822,,, +24.3554687500,24,8.8962671310,-0.1649191534,8.5684654472,-0.1722938844,,, +24.3574218750,24,9.2950840051,-0.7457184748,8.9632459633,-0.7367118906,,, +24.3593750000,24,9.1567956747,-1.3358723238,8.8410793385,-1.3094628735,,, +24.3613281250,24,8.4741038616,-1.8744563959,8.1938033781,-1.8313926329,,, +24.3632812500,24,7.2785700891,-2.3035402257,7.0507244413,-2.2463094054,,, +24.3652343750,24,5.6350461603,-2.5789543203,5.4734557121,-2.5114287507,,, +24.3671875000,24,3.6365792325,-2.6764651433,3.5511274644,-2.6033601217,,, +24.3691406250,24,1.4011903777,-2.5912394166,1.3972765852,-2.5175806108,,, +24.3710937500,24,-0.9310102575,-2.3312557464,-0.8530525070,-2.2620331803,,, +24.3730468750,24,-3.2062824283,-1.9134771338,-3.0515228583,-1.8533983177,,, +24.3750000000,24,-5.2720857566,-1.3661423606,-5.0507405529,-1.3192979163,,, +24.3769531250,24,-6.9895571990,-0.7277112178,-6.7162877184,-0.6972541181,,, +24.3789062500,24,-8.2415465084,-0.0409535237,-7.9345693781,-0.0289401801,,, +24.3808593750,24,-8.9432805204,0.6480752526,-8.6231007261,0.6408277778,,, +24.3828125000,24,-9.0543092085,1.2868613779,-8.7419504550,1.2610261850,,, +24.3847656250,24,-8.5839329083,1.8178870536,-8.2989938398,1.7758422361,,, +24.3867187500,24,-7.5888543822,2.1853668604,-7.3477783008,2.1312092759,,, +24.3886718750,24,-6.1656538916,2.3437327673,-5.9804372205,2.2830323497,,, +24.3906250000,24,-4.4409922868,2.2651715779,-4.3183987165,2.2044905974,,, +24.3925781250,24,-2.5640195096,1.9404316498,-2.5050922628,1.8868088094,,, +24.3945312500,24,-0.7008221207,1.3719566363,-0.7004750188,1.3325838177,,, +24.3964843750,24,0.9763526700,0.5696452763,0.9294226220,0.5516538018,,, +24.3984375000,24,2.3089538790,-0.4441195124,2.2315220315,-0.4340462828,,, +24.4003906250,24,3.1740323679,-1.6274342764,3.0866565041,-1.5836834814,,, +24.4023437500,24,3.4976761939,-2.9180113785,3.4224912995,-2.8367061676,,, +24.4042968750,24,3.2577249828,-4.2382004586,3.2162312262,-4.1177215992,,, +24.4062500000,24,2.4803262141,-5.5038892063,2.4914717812,-5.3451304430,,, +24.4082031250,24,1.2350269393,-6.6335074640,1.3136423961,-6.4398591452,,, +24.4101562500,24,-0.3686523469,-7.5512167729,-0.2132319486,-7.3284501884,,, +24.4121093750,24,-2.1867059854,-8.1889228763,-1.9517767271,-7.9450072274,,, +24.4140625000,24,-4.0535600303,-8.4954255842,-3.7435327286,-8.2400580634,,, +24.4160156250,24,-5.7985651240,-8.4455232710,-5.4246648713,-8.1893688191,,, +24.4179687500,24,-7.2600988476,-8.0392946461,-6.8395537079,-7.7932277251,,, +24.4199218750,24,-8.2975561723,-7.2963761839,-7.8524477648,-7.0708751904,,, +24.4218750000,24,-8.8018485146,-6.2522302202,-8.3576428106,-6.0568683299,,, +24.4238281250,24,-8.7028979802,-4.9547826149,-8.2867611742,-4.7978083722,,, +24.4257812500,24,-7.9744068843,-3.4607391398,-7.6134137583,-3.3487600726,,, +24.4277343750,24,-6.6374952693,-1.8358092801,-6.3566986823,-1.7734648575,,, +24.4296875000,24,-4.7619332757,-0.1570385185,-4.5823442822,-0.1466030890,,, +24.4316406250,24,-2.4619449991,1.4904695897,-2.3987306103,1.4493815443,,, +24.4335937500,24,0.1140057945,3.0239373095,0.0527498887,2.9343459343,,, +24.4355468750,24,2.7968391595,4.3742817609,2.6105955599,4.2414627906,,, +24.4375000000,24,5.4086740795,5.4914336190,5.1044712910,5.3223663481,,, +24.4394531250,24,7.7716727464,6.3428110186,7.3637528107,6.1456595178,,, +24.4414062500,24,9.7206520226,6.9122802783,9.2296895567,6.6958893390,,, +24.4433593750,24,11.1220154716,7.2038302877,10.5735649878,6.9770892850,,, +24.4453125000,24,11.8910361207,7.2440835410,11.3132909260,7.0151949078,,, +24.4472656250,24,11.9991416579,7.0782459999,11.4204992018,6.8541050551,,, +24.4492187500,24,11.4712154128,6.7633343819,10.9180709483,6.5491135029,,, +24.4511718750,24,10.3785180266,6.3637462172,9.8734047598,6.1626192702,,, +24.4531250000,24,8.8295366315,5.9468042983,8.3896897257,5.7598146285,,, +24.4550781250,24,6.9581645497,5.5761294065,6.5946491069,5.4022691455,,, +24.4570312500,24,4.9112463893,5.3062629259,4.6286493334,5.1427273562,,, +24.4589843750,24,2.8362921092,5.1776651975,2.6329646260,5.0202708846,,, +24.4609375000,24,0.8680587711,5.2081276356,0.7370193440,5.0520024634,,, +24.4628906250,24,-0.8817716475,5.3867798114,-0.9514373644,5.2272444278,,, +24.4648437500,24,-2.3264443487,5.6782716160,-2.3481936765,5.5115996911,,, +24.4667968750,24,-3.4019928978,6.0304293875,-3.3906603329,5.8543782659,,, +24.4687500000,24,-4.0678603104,6.3787095002,-4.0385530299,6.1929193199,,, +24.4707031250,24,-4.3097678969,6.6519606889,-4.2767644913,6.4581850122,,, +24.4726562500,24,-4.1435666352,6.7792340728,-4.1192029762,6.5813712847,,, +24.4746093750,24,-3.6186592841,6.6938930306,-3.6121664109,6.4978980496,,, +24.4765625000,24,-2.8151272178,6.3410809994,-2.8317185062,6.1546495857,,, +24.4785156250,24,-1.8318126124,5.6910457886,-1.8724669413,5.5228858918,,, +24.4804687500,24,-0.7711569396,4.7479530690,-0.8331323574,4.6067738697,,, +24.4824218750,24,0.2726191743,3.5485785811,0.1948578271,3.4421034797,,, +24.4843750000,24,1.2209570586,2.1557726784,1.1346586477,2.0899379180,,, +24.4863281250,24,2.0131634858,0.6473403932,1.9263409887,0.6258230228,,, +24.4882812500,24,2.6022407303,-0.9005256684,2.5231920164,-0.8762794147,,, +24.4902343750,24,2.9510264515,-2.4248020238,2.8882190004,-2.3551972545,,, +24.4921875000,24,3.0351001625,-3.8752131425,2.9969409189,-3.7621414361,,, +24.4941406250,24,2.8470799277,-5.2116628159,2.8414778161,-5.0582178403,,, +24.4960937500,24,2.3952848339,-6.4072717344,2.4293215369,-6.2173711960,,, +24.4980468750,24,1.6988012700,-7.4525861206,1.7786658041,-7.2304609012,,, +24.5000000000,24,0.7858159977,-8.3556341320,0.9168028826,-8.1053126047,,, +24.5019531250,24,-0.3014670065,-9.1353718743,-0.1152661006,-8.8603650042,,, +24.5039062500,24,-1.5000115264,-9.8097670049,-1.2564958518,-9.5131178644,,, +24.5058593750,24,-2.7255830009,-10.3871543293,-2.4256098339,-10.0717476982,,, +24.5078125000,24,-3.8813763282,-10.8674029992,-3.5293868161,-10.5362311437,,, +24.5097656250,24,-4.8700889196,-11.2461608417,-4.4742063679,-10.9024494404,,, +24.5117187500,24,-5.6051138058,-11.5145768900,-5.1768337628,-11.1619082501,,, +24.5136718750,24,-6.0218755414,-11.6585460587,-5.5753517776,-11.3009941812,,, +24.5156250000,24,-6.0862691690,-11.6588275910,-5.6372860311,-11.3010819815,,, +24.5175781250,24,-5.7944102842,-11.4864370514,-5.3594535109,-11.1340667957,,, +24.5195312500,24,-5.1676785463,-11.0993498248,-4.7632534499,-10.7591733972,,, +24.5214843750,24,-4.2506606331,-10.4507190753,-3.8925290327,-10.1309294159,,, +24.5234375000,24,-3.1097951724,-9.5019032105,-2.8120121206,-9.2118013757,,, +24.5253906250,24,-1.8285159823,-8.2310320416,-1.6024809010,-7.9805066554,,, +24.5273437500,24,-0.5017303157,-6.6404419662,-0.3552983861,-6.4392285093,,, +24.5292968750,24,0.7696110629,-4.7628387316,0.8329365840,-4.6195963370,,, +24.5312500000,24,1.8872469340,-2.6590817019,1.8687582906,-2.5805436277,,, +24.5332031250,24,2.7659983774,-0.4091367742,2.6716697284,-0.3995429645,,, +24.5351562500,24,3.3418304620,1.8973590861,3.1817254362,1.8365373721,,, +24.5371093750,24,3.5766605293,4.1696924656,3.3639969520,4.0397640036,,, +24.5390625000,24,3.4590793099,6.3223197651,3.2091470273,6.1271952425,,, +24.5410156250,24,3.0015585489,8.2766225404,2.7307065684,8.0225860519,,, +24.5429687500,24,2.2389144355,9.9627132111,1.9635599192,9.6581404548,,, +24.5449218750,24,1.2302659233,11.3256247385,0.9657111121,10.9805113412,,, +24.5468750000,24,0.0591199933,12.3308001713,-0.1817405319,11.9561227164,,, +24.5488281250,24,-1.1730329112,12.9641812617,-1.3807708091,12.5712607673,,, +24.5507812500,24,-2.3562886927,13.2307505408,-2.5256196128,12.8306681934,,, +24.5527343750,24,-3.3817604290,13.1528014685,-3.5118408898,12.7558746123,,, +24.5546875000,24,-4.1520056148,12.7642447318,-4.2462354959,12.3796845012,,, +24.5566406250,24,-4.5903271452,12.1050386328,-4.6557016396,11.7407846162,,, +24.5585937500,24,-4.6456671755,11.2223851663,-4.6919719118,10.8849072971,,, +24.5605468750,24,-4.2953341430,10.1738925004,-4.3343017115,9.8678980973,,, +24.5625000000,24,-3.5478805875,9.0241557762,-3.5921753133,8.7524021462,,, +24.5644531250,24,-2.4438387753,7.8354142877,-2.5058335700,7.5988057778,,, +24.5664062500,24,-1.0529436195,6.6572248225,-1.1433989238,6.4552218752,,, +24.5683593750,24,0.5305765204,5.5180873906,0.4038230234,5.3493671536,,, +24.5703125000,24,2.1956661779,4.4236886492,2.0287618176,4.2868532749,,, +24.5722656250,24,3.8248098919,3.3625183595,3.6184584238,3.2566237911,,, +24.5742187500,24,5.3015217244,2.3112164135,5.0611751515,2.2361322490,,, +24.5761718750,24,6.5149933300,1.2384259361,6.2507978377,1.1950742727,,, +24.5781250000,24,7.3684600023,0.1137601237,7.0947191950,0.1040735639,,, +24.5800781250,24,7.7908943697,-1.0816265017,7.5248955742,-1.0550801361,,, +24.5820312500,24,7.7458009230,-2.3523410572,7.5062646378,-2.2868243137,,, +24.5839843750,24,7.2352396192,-3.6917133658,7.0406783368,-3.5846976926,,, +24.5859375000,24,6.2998275248,-5.0830164595,6.1669283947,-4.9325232531,,, +24.5878906250,24,5.0147276941,-6.4986069481,4.9568663478,-6.3035713815,,, +24.5898437500,24,3.4832182265,-7.8978370428,3.5091688291,-7.6585304750,,, +24.5917968750,24,1.8279842947,-9.2250337605,1.9409108134,-8.9435411067,,, +24.5937500000,24,0.1771399615,-10.4136712675,0.3741836283,-10.0942292754,,, +24.5957031250,24,-1.3522929313,-11.3956672468,-1.0796360993,-11.0447042786,,, +24.5976562500,24,-2.6650342530,-12.1067881321,-2.3300381183,-11.7327895011,,, +24.5996093750,24,-3.6923265755,-12.4902987762,-3.3119121881,-12.1035562844,,, +24.6015625000,24,-4.3967059263,-12.5051001018,-3.9899839057,-12.1172077033,,, +24.6035156250,24,-4.7746320508,-12.1322323076,-4.3612205593,-11.7553793642,,, +24.6054687500,24,-4.8532194647,-11.3755712467,-4.4516685055,-11.0218163051,,, +24.6074218750,24,-4.6830447506,-10.2616196383,-4.3095289156,-9.9421755747,,, +24.6093750000,24,-4.3287694786,-8.8380200830,-3.9961545225,-8.5625915333,,, +24.6113281250,24,-3.8597507109,-7.1680092224,-3.5771139537,-6.9443072046,,, +24.6132812500,24,-3.3429386086,-5.3247148286,-3.1154621760,-5.1581518038,,, +24.6152343750,24,-2.8365182084,-3.3870839022,-2.6656958635,-3.2805986930,,, +24.6171875000,24,-2.3857093181,-1.4351477214,-2.2698005675,-1.3891792144,,, +24.6191406250,24,-2.0248450051,0.4527145805,-1.9593062784,0.4401712238,,, +24.6210937500,24,-1.7814174631,2.1991355250,-1.7591717446,2.1324956306,,, +24.6230468750,24,-1.6739377144,3.7305972170,-1.6857787221,3.6165641229,,, +24.6250000000,24,-1.7042831003,4.9864475662,-1.7397384890,4.8336056993,,, +24.6269531250,24,-1.8529253143,5.9258511246,-1.9014325412,5.7440401904,,, +24.6289062500,24,-2.0824844570,6.5279704903,-2.1344399184,6.3276559783,,, +24.6308593750,24,-2.3461198088,6.7912390658,-2.3936054722,6.5829107145,,, +24.6328125000,24,-2.5948487273,6.7354079835,-2.6321304629,6.5289194012,,, +24.6347656250,24,-2.7826460889,6.4026697155,-2.8065073532,6.2065457548,,, +24.6367187500,24,-2.8694273524,5.8551023940,-2.8793436403,5.6759264457,,, +24.6386718750,24,-2.8215517482,5.1691534563,-2.8197385429,5.0111246681,,, +24.6406250000,24,-2.6133590559,4.4263400821,-2.6045803517,4.2911189038,,, +24.6425781250,24,-2.2317968301,3.7004761378,-2.2227515842,3.5874287986,,, +24.6445312500,24,-1.6783058310,3.0488672574,-1.6767710212,2.9555849595,,, +24.6464843750,24,-0.9645657647,2.5126534734,-0.9787021702,2.4354586608,,, +24.6484375000,24,-0.1074606378,2.1213232447,-0.1453924444,2.0556329807,,, +24.6503906250,24,0.8717876383,1.8957222981,0.8023022650,1.8363182100,,, +24.6523437500,24,1.9442310743,1.8471303887,1.8362724758,1.7884600864,,, +24.6542968750,24,3.0676896497,1.9710081691,2.9159754982,1.9076851941,,, +24.6562500000,24,4.1832366720,2.2412693104,3.9851637264,2.1687541948,,, +24.6582031250,24,5.2189224462,2.6143836362,4.9753907412,2.5295356597,,, +24.6601562500,24,6.1014449476,3.0404145768,5.8170348853,2.9416928276,,, +24.6621093750,24,6.7703905539,3.4707351649,6.4528639703,3.3581500030,,, +24.6640625000,24,7.1886383289,3.8602226617,6.8480138454,3.7352118955,,, +24.6660156250,24,7.3436080771,4.1655733678,6.9912241793,4.0309303100,,, +24.6679687500,24,7.2405298446,4.3417242160,6.8884264916,4.2016421692,,, +24.6699218750,24,6.8972181962,4.3430388533,6.5576871895,4.2031226349,,, +24.6718750000,24,6.3453587639,4.1327089383,6.0302604256,3.9996927602,,, +24.6738281250,24,5.6330097680,3.6946671374,5.3527610245,3.5757590613,,, +24.6757812500,24,4.8207015673,3.0403048142,4.5832733054,2.9423233164,,, +24.6777343750,24,3.9698745787,2.2077391179,3.7802273858,2.1362787748,,, +24.6796875000,24,3.1295871848,1.2548582279,2.9897325718,1.2136797201,,, +24.6816406250,24,2.3282106722,0.2478184992,2.2378052123,0.2386019613,,, +24.6835937500,24,1.5743907760,-0.7485855417,1.5314859959,-0.7261877211,,, +24.6855468750,24,0.8669261132,-1.6730778008,0.8683984101,-1.6213273767,,, +24.6875000000,24,0.2060288861,-2.4680554644,0.2475991078,-2.3910170275,,, +24.6894531250,24,-0.4026187515,-3.0843987474,-0.3264186925,-2.9876802767,,, +24.6914062500,24,-0.9512634141,-3.4875548860,-0.8468775891,-3.3778552156,,, +24.6933593750,24,-1.4345179918,-3.6602311004,-1.3089364452,-3.5447995155,,, +24.6953125000,24,-1.8512522108,-3.6030060566,-1.7114988461,-3.4890807332,,, +24.6972656250,24,-2.2047277965,-3.3341098833,-2.0573471807,-3.2283623152,,, +24.6992187500,24,-2.5010727714,-2.8867898853,-2.3517249756,-2.7948519675,,, +24.7011718750,24,-2.7459223973,-2.3038812922,-2.5992090005,-2.2300439014,,, +24.7031250000,24,-2.9426264868,-1.6327793688,-2.8020824140,-1.5798491666,,, +24.7050781250,24,-3.0957040227,-0.9251293299,-2.9636686322,-0.8942929188,,, +24.7070312500,24,-3.2164352228,-0.2399621353,-3.0936554332,-0.2305482399,,, +24.7089843750,24,-3.3241416928,0.3570030871,-3.2093418923,0.3477406175,,, +24.7109375000,24,-3.4423669496,0.8011945240,-3.3321154998,0.7780456874,,, +24.7128906250,24,-3.5947361154,1.0386981729,-3.4836539780,1.0081645327,,, +24.7148437500,24,-3.8037779303,1.0313619869,-3.6848929414,1.0011627837,,, +24.7167968750,24,-4.0894546594,0.7590965681,-3.9546562562,0.7376008720,,, +24.7187500000,24,-4.4631692661,0.2233619235,-4.3039533424,0.2189068252,,, +24.7207031250,24,-4.9213411793,-0.5509341623,-4.7298291461,-0.5307897116,,, +24.7226562500,24,-5.4441174757,-1.5185334299,-5.2140611549,-1.4676590514,,, +24.7246093750,24,-5.9959739660,-2.6180112974,-5.7236551173,-2.5322244224,,, +24.7265625000,24,-6.5246330966,-3.7747860712,-6.2097426823,-3.6522776585,,, +24.7285156250,24,-6.9618345869,-4.9064456359,-6.6082172349,-4.7480381142,,, +24.7304687500,24,-7.2287834358,-5.9295504738,-6.8448458034,-5.7387384662,,, +24.7324218750,24,-7.2454275964,-6.7652293429,-6.8440942555,-6.5480387730,,, +24.7343750000,24,-6.9421281606,-7.3459638415,-6.5402333436,-7.1105904624,,, +24.7363281250,24,-6.2697769266,-7.6221215203,-5.8869539980,-7.3783574804,,, +24.7382812500,24,-5.2056436299,-7.5639331690,-4.8629601819,-7.3225274573,,, +24.7402343750,24,-3.7588129142,-7.1637015031,-3.4771618814,-6.9356471992,,, +24.7421875000,24,-1.9754386251,-6.4410135899,-1.7736317568,-6.2366671986,,, +24.7441406250,24,0.0642017618,-5.4419183708,0.1712163915,-5.2701459591,,, +24.7460937500,24,2.2571687937,-4.2305344022,2.2595009843,-4.0981281174,,, +24.7480468750,24,4.4885384899,-2.8829065611,4.3820356212,-2.7942003369,,, +24.7500000000,24,6.6382661970,-1.4837638560,6.4248764446,-1.4403547954,,, +24.7519531250,24,8.5882637397,-0.1187863859,8.2759845818,-0.1195039531,,, +24.7539062500,24,10.2313057875,1.1372065733,9.8335685069,1.0959533324,,, +24.7558593750,24,11.4794263778,2.2289934942,11.0139968444,2.1525877323,,, +24.7578125000,24,12.2700039903,3.1242350712,11.7575939992,3.0191162664,,, +24.7597656250,24,12.5692683294,3.8134801872,12.0320179345,3.6864055947,,, +24.7617187500,24,12.3723431641,4.3068705455,11.8323674504,4.1642802918,,, +24.7636718750,24,11.7016785432,4.6298907687,11.1797571917,4.4774078182,,, +24.7656250000,24,10.6074115372,4.8216091656,10.1217004721,4.6635945295,,, +24.7675781250,24,9.1668910742,4.9310033916,8.7317255006,4.7702277904,,, +24.7695312500,24,7.4777671779,5.0072093899,7.1029144035,4.8448373298,,, +24.7714843750,24,5.6449678267,5.0884410387,5.3355807726,4.9243728496,,, +24.7734375000,24,3.7663002150,5.1952558903,3.5235344824,5.0286909377,,, +24.7753906250,24,1.9224833312,5.3301903149,1.7444870261,5.1602073036,,, +24.7773437500,24,0.1762119931,5.4843000438,0.0590180716,5.3102308092,,, +24.7792968750,24,-1.4236422379,5.6446100583,-1.4855277763,5.4661751528,,, +24.7812500000,24,-2.8425823408,5.7928800390,-2.8555471696,5.6103637230,,, +24.7832031250,24,-4.0662743755,5.8985691495,-4.0366124752,5.7132204985,,, +24.7851562500,24,-5.1021927009,5.9173396644,-5.0350263940,5.7318221875,,, +24.7871093750,24,-5.9725295343,5.7971197726,-5.8711135103,5.6157653574,,, +24.7890625000,24,-6.7035093024,5.4868412660,-6.5691024391,5.3156215970,,, +24.7910156250,24,-7.3178825702,4.9458719827,-7.1500853793,4.7920665707,,, +24.7929687500,24,-7.8305364162,4.1533208061,-7.6279776797,4.0248867774,,, +24.7949218750,24,-8.2448594416,3.1150495572,-8.0061582364,3.0197660990,,, +24.7968750000,24,-8.5521424405,1.8675544661,-8.2769712473,1.8120426123,,, +24.7988281250,24,-8.7352434401,0.4769847180,-8.4252379167,0.4657589517,,, +24.8007812500,24,-8.7734174881,-0.9697929530,-8.4327291820,-0.9349876328,,, +24.8027343750,24,-8.6468941045,-2.3788614915,-8.2822992437,-2.2992761556,,, +24.8046875000,24,-8.3434094695,-3.6625900580,-7.9639086470,-3.5422711605,,, +24.8066406250,24,-7.8652807534,-4.7523782105,-7.4811813513,-4.5975577294,,, +24.8085937500,24,-7.2292152774,-5.6064809940,-6.8510618622,-5.4247167943,,, +24.8105468750,24,-6.4569974474,-6.2070451241,-6.0949024217,-6.0064589094,,, +24.8125000000,24,-5.5674610764,-6.5528321624,-5.2308760427,-6.3415819183,,, +24.8144531250,24,-4.5767169401,-6.6572857350,-4.2742345178,-6.4430989886,,, +24.8164062500,24,-3.5006021161,-6.5480628991,-3.2396773055,-6.3377832820,,, +24.8183593750,24,-2.3546728756,-6.2614114216,-2.1414584837,-6.0607240385,,, +24.8203125000,24,-1.1544037628,-5.8351042521,-0.9937218092,-5.6484860594,,, +24.8222656250,24,0.0845865355,-5.3038696503,0.1891888921,-5.1346855262,,, +24.8242187500,24,1.3474806837,-4.6958378291,1.3935683795,-4.5465505833,,, +24.8261718750,24,2.6200477698,-4.0306472065,2.6061043030,-3.9030881999,,, +24.8281250000,24,3.8865804541,-3.3209793180,3.8119207861,-3.2165695339,,, +24.8300781250,24,5.1277469455,-2.5746283562,4.9925508439,-2.4945327655,,, +24.8320312500,24,6.3181460784,-1.7956994480,6.1236050901,-1.7409423106,,, +24.8339843750,24,7.4219619228,-0.9888817770,7.1706719975,-0.9603238480,,, +24.8359375000,24,8.3909050118,-0.1641469156,8.0874298845,-0.1623117830,,, +24.8378906250,24,9.1720121936,0.6666556374,8.8230923592,0.6416433055,,, +24.8398437500,24,9.7218762997,1.4975098973,9.3359608592,1.4457339057,,, +24.8417968750,24,10.0154979851,2.3287969252,9.6019413542,2.2503374737,,, +24.8437500000,24,10.0468581072,3.1606857787,9.6152303069,3.0556185090,,, +24.8457031250,24,9.8263850613,3.9853439190,9.3860332981,3.8539893311,,, +24.8476562500,24,9.3778885755,4.7803689053,8.9377449022,4.6237535332,,, +24.8496093750,24,8.7363017170,5.5085378365,8.3047786972,5.3288648944,,, +24.8515625000,24,7.9460347184,6.1263548084,7.5308075201,5.9272024687,,, +24.8535156250,24,7.0550047588,6.5919339942,6.6628510511,6.3782038900,,, +24.8554687500,24,6.1044039849,6.8663196850,5.7413908927,6.6441470311,,, +24.8574218750,24,5.1224321991,6.9151947344,4.7942973885,6.6918059458,,, +24.8593750000,24,4.1254302058,6.7140019329,3.8378169793,6.4974074923,,, +24.8613281250,24,3.1227839046,6.2524527441,2.8812048903,6.0509933621,,, +24.8632812500,24,2.1224065482,5.5384765372,1.9319262128,5.3602402337,,, +24.8652343750,24,1.1337288445,4.6003274141,0.9984934465,4.4524974432,,, +24.8671875000,24,0.1648548348,3.4809263819,0.0878413708,3.3693110150,,, +24.8691406250,24,-0.7842765227,2.2271503987,-0.8010432363,2.1560581933,,, +24.8710937500,24,-1.7259366564,0.8839908158,-1.6809000025,0.8562945074,,, +24.8730468750,24,-2.6818436905,-0.5050485261,-2.5735403970,-0.4878619398,,, +24.8750000000,24,-3.6746148321,-1.8949841652,-3.5016729938,-1.8328616278,,, +24.8769531250,24,-4.7167682158,-3.2339553723,-4.4784173331,-3.1285031054,,, +24.8789062500,24,-5.8027454765,-4.4600746480,-5.4996822783,-4.3148874576,,, +24.8808593750,24,-6.9077864961,-5.5077061498,-6.5429537179,-5.3284957533,,, +24.8828125000,24,-7.9915833395,-6.3191544012,-7.5705762529,-6.1135012513,,, +24.8847656250,24,-9.0025800836,-6.8527102768,-8.5337313913,-6.6295552635,,, +24.8867187500,24,-9.8817985264,-7.0864771888,-9.3760450304,-6.8554886659,,, +24.8886718750,24,-10.5684163346,-7.0213431713,-10.0389007798,-6.7921860598,,, +24.8906250000,24,-11.0082302055,-6.6818898422,-10.4695750631,-6.4634620364,,, +24.8925781250,24,-11.1615980495,-6.1126817712,-10.6289647213,-5.9124664551,,, +24.8945312500,24,-11.0068987982,-5.3710140611,-10.4950684781,-5.1946634444,,, +24.8964843750,24,-10.5397297100,-4.5182709672,-10.0623901369,-4.3694677737,,, +24.8984375000,24,-9.7704353526,-3.6109678193,-9.3397410020,-3.4915754996,,, +24.9003906250,24,-8.7221192776,-2.6947682149,-8.3484466557,-2.6051743229,,, +24.9023437500,24,-7.4303286203,-1.8050088829,-7.1220325678,-1.7444520473,,, +24.9042968750,24,-5.9436576805,-0.9710579804,-5.7067167075,-0.9378149281,,, +24.9062500000,24,-4.3236213587,-0.2194475953,-4.1612236764,-0.2109197579,,, +24.9082031250,24,-2.6411116262,0.4265183200,-2.5533787051,0.4137042481,,, +24.9101562500,24,-0.9674294696,0.9512463457,-0.9515588922,0.9209905895,,, +24.9121093750,24,0.6337082282,1.3507793434,0.5829276014,1.3071321702,,, +24.9140625000,24,2.1060224134,1.6303535789,1.9957505104,1.5772168712,,, +24.9160156250,24,3.3978296073,1.7993283210,3.2369227055,1.7403210628,,, +24.9179687500,24,4.4630527609,1.8693444058,4.2618118039,1.8077270310,,, +24.9199218750,24,5.2631719992,1.8532017780,5.0330426621,1.7918359870,,, +24.9218750000,24,5.7695615177,1.7628566236,5.5227899630,1.7042288972,,, +24.9238281250,24,5.9716615202,1.6121292375,5.7205963677,1.5582846143,,, +24.9257812500,24,5.8879041384,1.4228515216,5.6437736654,1.3751260526,,, +24.9277343750,24,5.5677867884,1.2239715866,5.3394187829,1.1827529594,,, +24.9296875000,24,5.0837412547,1.0442988633,4.8767283629,1.0090232232,,, +24.9316406250,24,4.5215680672,0.9090876042,4.3378524583,0.8783495834,,, +24.9335937500,24,3.9717674535,0.8395094022,3.8095528934,0.8111920704,,, +24.9355468750,24,3.5189703713,0.8488755477,3.3730976128,0.8204054739,,, +24.9375000000,24,3.2313171181,0.9380740647,3.0941206035,0.9068267833,,, +24.9394531250,24,3.1540384394,1.0945624134,3.0164580429,1.0583024700,,, +24.9414062500,24,3.3085552702,1.2953533013,3.1612197684,1.2525785094,,, +24.9433593750,24,3.6945312642,1.5125785076,3.5286528774,1.4626844011,,, +24.9453125000,24,4.2918230244,1.7190055540,4.0999076863,1.6622715185,,, +24.9472656250,24,5.0624765894,1.8916868277,4.8388864869,1.8291439751,,, +24.9492187500,24,5.9536010779,2.0142349613,5.6949655706,1.9474596817,,, +24.9511718750,24,6.8995163852,2.0782853497,6.6050344657,2.0091449479,,, +24.9531250000,24,7.8205375188,2.0815469748,7.4923645270,2.0120083575,,, +24.9550781250,24,8.6201240966,2.0209749598,8.2640023766,1.9531340595,,, +24.9570312500,24,9.1889005493,1.8878210014,8.8147447744,1.8240903393,,, +24.9589843750,24,9.4205232817,1.6714263168,9.0423487946,1.6145953827,,, +24.9609375000,24,9.2317629496,1.3675079874,8.8667111385,1.3205303592,,, +24.9628906250,24,8.5754798912,0.9829452613,8.2422717870,0.9485674524,,, +24.9648437500,24,7.4441706057,0.5355718306,7.1614352900,0.5159677390,,, +24.9667968750,24,5.8683649430,0.0506412538,5.6530989574,0.0471610363,,, +24.9687500000,24,3.9128667182,-0.4438427720,3.7791264856,-0.4307721249,,, +24.9707031250,24,1.6717563102,-0.9187441475,1.6295661975,-0.8896644723,,, +24.9726562500,24,-0.7388451600,-1.3422208650,-0.6843528645,-1.2987368655,,, +24.9746093750,24,-3.1920557744,-1.6804596914,-3.0410740364,-1.6253057451,,, +24.9765625000,24,-5.5633701011,-1.9017939368,-5.3212863118,-1.8387640862,,, +24.9785156250,24,-7.7402256687,-1.9801831966,-7.4170702487,-1.9139460089,,, +24.9804687500,24,-9.6264917840,-1.8979501056,-9.2361668113,-1.8337739331,,, +24.9824218750,24,-11.1453106634,-1.6500459249,-10.7046273178,-1.5933858059,,, +24.9843750000,24,-12.2427556179,-1.2487975248,-11.7702407411,-1.2047279465,,, +24.9863281250,24,-12.8917977948,-0.7272443273,-12.4062872133,-0.6997831950,,, +24.9882812500,24,-13.0944795555,-0.1394262184,-12.6136261652,-0.1308488663,,, +24.9902343750,24,-12.8791723632,0.4463265058,-12.4181919268,0.4359561679,,, +24.9921875000,24,-12.2921314685,0.9617220927,-11.8631505751,0.9345559352,,, +24.9941406250,24,-11.3886259336,1.3517966421,-11.0006263130,1.3117755289,,, +24.9960937500,24,-10.2297859627,1.5797342235,-9.8887627674,1.5320048327,,, +24.9980468750,24,-8.8843861982,1.6257126279,-8.5934175375,1.5760819977,,, +25.0000000000,25,-7.4305649573,1.4836838425,-7.1897762838,1.4381427938,33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000:10.0000000000:11.0000000000:12.0000000000:13.0000000000:14.0000000000:15.0000000000:19.0000000000:20.0000000000:21.0000000000:22.0000000000:23.0000000000:24.0000000000:25.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +25.0019531250,25,-5.9530458299,1.1586671351,-5.7596114654,1.1230150908,,, +25.0039062500,25,-4.5337671475,0.6681312529,-4.3822449920,0.6476082433,,, +25.0058593750,25,-3.2402741380,0.0441870978,-3.1234231150,0.0430091854,,, +25.0078125000,25,-2.1184690207,-0.6702756048,-2.0282526741,-0.6492599559,,, +25.0097656250,25,-1.1901222245,-1.4284577501,-1.1186633805,-1.3838924086,,, +25.0117187500,25,-0.4536737848,-2.1835396487,-0.3941009996,-2.1155611463,,, +25.0136718750,25,0.1115776629,-2.8911743163,0.1644879007,-2.8013301807,,, +25.0156250000,25,0.5414300668,-3.5104731671,0.5907805207,-3.4016049248,,, +25.0175781250,25,0.8852196320,-4.0004895607,0.9315063617,-3.8767254600,,, +25.0195312500,25,1.2020497305,-4.3173411523,1.2427564356,-4.1841779929,,, +25.0214843750,25,1.5533293832,-4.4176230587,1.5828654897,-4.2818936517,,, +25.0234375000,25,1.9955965699,-4.2647391307,2.0056287094,-4.1343711027,,, +25.0253906250,25,2.5736826534,-3.8345055671,2.5538307709,-3.7180970892,,, +25.0273437500,25,3.3134954743,-3.1204353863,3.2523969598,-3.0266637822,,, +25.0292968750,25,4.2170528904,-2.1383622348,4.1036960089,-2.0752518252,,, +25.0312500000,25,5.2614220868,-0.9283823832,5.0865505597,-0.9025200177,,, +25.0332031250,25,6.4014178500,0.4469190160,6.1587913422,0.4310971783,,, +25.0351562500,25,7.5749864979,1.9068864101,7.2623414361,1.8476460479,,, +25.0371093750,25,8.7097004792,3.3593557111,8.3293247476,3.2579811348,,, +25.0390625000,25,9.7297871587,4.7089971080,9.2886518576,4.5698149085,,, +25.0410156250,25,10.5638172235,5.8655944587,10.0732452887,5.6957095843,,, +25.0429687500,25,11.1523886695,6.7524022310,10.6272669992,6.5611556236,,, +25.0449218750,25,11.4533395971,7.3142772800,10.9109780987,7.1124452684,,, +25.0468750000,25,11.4420785276,7.5207867990,10.9010047136,7.3196962278,,, +25.0488281250,25,11.1077726231,7.3626163830,10.5867587508,7.1734049437,,, +25.0507812500,25,10.4484227136,6.8469915808,9.9658135973,6.6800559118,,, +25.0527343750,25,9.4678658892,5.9960898454,9.0410803132,5.8606309028,,, +25.0546875000,25,8.1766462908,4.8465584345,7.8216886728,4.7501882869,,, +25.0566406250,25,6.5969863058,3.4501328900,6.3277909615,3.3984988324,,, +25.0585937500,25,4.7696402378,1.8764613095,4.5971249720,1.8728023208,,, +25.0605468750,25,2.7576572483,0.2123489846,2.6886622676,0.2570863878,,, +25.0625000000,25,0.6441872873,-1.4467723220,0.6806665369,-1.3561711100,,, +25.0644531250,25,-1.4737302784,-3.0071334042,-1.3350921584,-2.8759738198,,, +25.0664062500,25,-3.4935361807,-4.3843490933,-3.2612621078,-4.2203037644,,, +25.0683593750,25,-5.3168297207,-5.5114064757,-5.0040916023,-5.3238778925,,, +25.0703125000,25,-6.8581539043,-6.3456487158,-6.4817688796,-6.1449306920,,, +25.0722656250,25,-8.0510678692,-6.8694718566,-7.6302769022,-6.6659135203,,, +25.0742187500,25,-8.8527980594,-7.0865406658,-8.4079677681,-6.8898547123,,, +25.0761718750,25,-9.2485675496,-7.0174577696,-8.7998310263,-6.8361809038,,, +25.0781250000,25,-9.2521810694,-6.6919068904,-8.8182268730,-6.5331281140,,, +25.0800781250,25,-8.9015857139,-6.1383442891,-8.4988458240,-6.0078063002,,, +25.0820312500,25,-8.2544310777,-5.3811667640,-7.8965327216,-5.2835242377,,, +25.0839843750,25,-7.3862457962,-4.4476125880,-7.0834276027,-4.3865242708,,, +25.0859375000,25,-6.3884643737,-3.3761165484,-6.1469101129,-3.3540909074,,, +25.0878906250,25,-5.3632451270,-2.2201970479,-5.1845221612,-2.2383049135,,, +25.0898437500,25,-4.4135179406,-1.0455521943,-4.2944069433,-1.1031880400,,, +25.0917968750,25,-3.6294182682,0.0792457475,-3.5623554699,-0.0155934045,,, +25.0937500000,25,-3.0751197587,1.0929322587,-3.0492305466,0.9647878121,,, +25.0957031250,25,-2.7804603267,1.9480929020,-2.7829650677,1.7918547318,,, +25.0976562500,25,-2.7399261276,2.6144617892,-2.7576366405,2.4363094690,,, +25.0996093750,25,-2.9176612031,3.0793489818,-2.9383116257,2.8860592522,,, +25.1015625000,25,-3.2545906105,3.3446216648,-3.2678584739,3.1432789880,,, +25.1035156250,25,-3.6748931098,3.4229110751,-3.6731344298,3.2207015840,,, +25.1054687500,25,-4.0919982569,3.3358930314,-4.0707744975,3.1398879945,,, +25.1074218750,25,-4.4161328449,3.1126098669,-4.3744753752,2.9295347634,,, +25.1093750000,25,-4.5633040142,2.7867345692,-4.5036289547,2.6227762389,,, +25.1113281250,25,-4.4635374903,2.3955254264,-4.3912625369,2.2561362511,,, +25.1132812500,25,-4.0684260131,1.9794321198,-3.9913251903,1.8691130037,,, +25.1152343750,25,-3.3578781421,1.5796486424,-3.2851526585,1.5017902820,,, +25.1171875000,25,-2.3419580032,1.2367872488,-2.2832250169,1.1935340845,,, +25.1191406250,25,-1.0559544404,0.9919048095,-1.0204801561,0.9839213003,,, +25.1210937500,25,0.4457645875,0.8835901304,0.4495967928,0.9098202180,,, +25.1230468750,25,2.0916417833,0.9386183847,2.0569284936,0.9962679888,,, +25.1250000000,25,3.7918388450,1.1613823897,3.7139955958,1.2462271395,,, +25.1269531250,25,5.4387874255,1.5266902701,5.3165584433,1.6336829885,,, +25.1289062500,25,6.9132125306,1.9785592200,6.7495825757,2.1026206624,,, +25.1308593750,25,8.0962696278,2.4369787497,7.8989155474,2.5737471850,,, +25.1328125000,25,8.8842259359,2.8103505702,8.6652916298,2.9566947126,,, +25.1347656250,25,9.2010455786,3.0078823037,8.9762987349,3.1621509802,,, +25.1367187500,25,9.0074841890,2.9501712252,8.7949974239,3.1122064380,,, +25.1386718750,25,8.3087836127,2.5813063080,8.1271355203,2.7521335732,,, +25.1406250000,25,7.1608435262,1.8818051641,7.0268552513,2.0629393879,,, +25.1425781250,25,5.6698059425,0.8752129569,5.5961654957,1.0677589741,,, +25.1445312500,25,3.9806875704,-0.3766611419,3.9740977324,-0.1727395892,,, +25.1464843750,25,2.2567820876,-1.7874912278,2.3171651959,-1.5736248653,,, +25.1484375000,25,0.6570869994,-3.2614290628,0.7778920699,-3.0402549524,,, +25.1503906250,25,-0.6818306047,-4.7025269804,-0.5125989524,-4.4775926654,,, +25.1523437500,25,-1.6583323627,-6.0182936878,-1.4567334340,-5.7939099386,,, +25.1542968750,25,-2.2125137206,-7.1212964333,-1.9971649574,-6.9025699090,,, +25.1562500000,25,-2.3269500036,-7.9313549888,-2.1175931565,-7.7243610975,,, +25.1582031250,25,-2.0245155339,-8.3795012796,-1.8407082648,-8.1915116070,,, +25.1601562500,25,-1.3665915535,-8.4152797150,-1.2263675772,-8.2548250439,,, +25.1621093750,25,-0.4489794212,-8.0155365731,-0.3674454902,-7.8921302885,,, +25.1640625000,25,0.6090199771,-7.1879527023,0.6208095386,-7.1116188732,,, +25.1660156250,25,1.6795166745,-5.9680871689,1.6151054874,-5.9489386875,,, +25.1679687500,25,2.6372437817,-4.4169966316,2.4949061629,-4.4648161231,,, +25.1699218750,25,3.3657857513,-2.6202838031,3.1485351762,-2.7439510005,,, +25.1718750000,25,3.7638011841,-0.6821029426,3.4792563902,-0.8889132405,,, +25.1738281250,25,3.7539829626,1.2859531808,3.4139391821,0.9909859681,,, +25.1757812500,25,3.2941738309,3.1770276174,2.9137754051,2.7918455743,,, +25.1777343750,25,2.3877590342,4.9013693592,1.9842132105,4.4273953178,,, +25.1796875000,25,1.0877164021,6.3954628109,0.6787144839,5.8378879715,,, +25.1816406250,25,-0.5091701699,7.6225964827,-0.9069018989,6.9905458591,,, +25.1835937500,25,-2.2754082395,8.5672244577,-2.6471227075,7.8738718168,,, +25.1855468750,25,-4.0675070624,9.2296166915,-4.4010425099,8.4921213778,,, +25.1875000000,25,-5.7389307594,9.6210650397,-6.0250287094,8.8602480665,,, +25.1894531250,25,-7.1522128134,9.7575789348,-7.3845535677,8.9973797896,,, +25.1914062500,25,-8.1912191323,9.6549566233,-8.3661805056,8.9216478638,,, +25.1933593750,25,-8.7723521119,9.3271121974,-8.8885381248,8.6482468807,,, +25.1953125000,25,-8.8523816406,8.7859326598,-8.9099738430,8.1891223938,,, +25.1972656250,25,-8.4296074045,8.0440008957,-8.4297556018,7.5555577433,,, +25.1992187500,25,-7.5381091780,7.1204469542,-7.4826384916,6.7638483876,,, +25.2011718750,25,-6.2407745909,6.0429540026,-6.1321305960,5.8373261148,,, +25.2031250000,25,-4.6250067870,4.8427916381,-4.4661209428,4.8017551020,,, +25.2050781250,25,-2.7975895075,3.5498385064,-2.5916306141,3.6808136148,,, +25.2070312500,25,-0.8752554052,2.1915066359,-0.6254718413,2.4953987224,,, +25.2089843750,25,1.0268917072,0.7928413038,1.3171664339,1.2641145165,,, +25.2109375000,25,2.8050986216,-0.6219793248,3.1323454186,0.0051544084,,, +25.2128906250,25,4.3711088807,-2.0272486542,4.7316067451,-1.2609663986,,, +25.2148437500,25,5.6505652172,-3.3965477580,6.0406452903,-2.5119178090,,, +25.2167968750,25,6.5833853200,-4.7031875166,6.9997033660,-3.7239465630,,, +25.2187500000,25,7.1322581565,-5.9143363775,7.5715167234,-4.8663624998,,, +25.2207031250,25,7.2931815536,-6.9853607700,7.7512211693,-5.8962413538,,, +25.2226562500,25,7.0982509756,-7.8635027436,7.5690465265,-6.7620675433,,, +25.2246093750,25,6.6078302446,-8.5000622562,7.0829625313,-7.4155948862,,, +25.2265625000,25,5.8967641615,-8.8646300667,6.3655765590,-7.8257682580,,, +25.2285156250,25,5.0439448134,-8.9529677276,5.4941218878,-7.9865196767,,, +25.2304687500,25,4.1291579563,-8.7840309520,4.5473265352,-7.9139401701,,, +25.2324218750,25,3.2299001222,-8.3925104622,3.6022624651,-7.6389791534,,, +25.2343750000,25,2.4115837069,-7.8250296736,2.7248497471,-7.2037599907,,, +25.2363281250,25,1.7163892610,-7.1376132499,1.9589417776,-6.6593322569,,, +25.2382812500,25,1.1603053860,-6.3878861406,1.3231541353,-6.0583769424,,, +25.2402343750,25,0.7385383474,-5.6246263342,0.8157842057,-5.4452260662,,, +25.2421875000,25,0.4326432142,-4.8816601005,0.4215759029,-4.8499319776,,, +25.2441406250,25,0.2169102714,-4.1760345309,0.1178863969,-4.2864215842,,, +25.2460937500,25,0.0634043088,-3.5094999358,-0.1204092567,-3.7538940865,,, +25.2480468750,25,-0.0566744613,-2.8752345147,-0.3194386382,-3.2432692952,,, +25.2500000000,25,-0.1733646751,-2.2646950091,-0.5065167910,-2.7437526564,,, +25.2519531250,25,-0.3165885807,-1.6681814567,-0.7089362348,-2.2435335973,,, +25.2539062500,25,-0.5151706871,-1.0743064409,-0.9532534143,-1.7295908260,,, +25.2558593750,25,-0.7976671536,-0.4743023164,-1.2661156267,-1.1920194428,,, +25.2578125000,25,-1.1907653646,0.1342508663,-1.6726490302,-0.6276342875,,, +25.2597656250,25,-1.7133536039,0.7494936373,-2.1908351491,-0.0380280401,,, +25.2617187500,25,-2.3705517714,1.3687417182,-2.8259055467,0.5736701325,,, +25.2636718750,25,-3.1505222448,1.9894251662,-3.5673148597,1.2036727920,,, +25.2656250000,25,-4.0227157340,2.6091437764,-4.3870263088,1.8476320226,,, +25.2675781250,25,-4.9387211310,3.2241156171,-5.2402247579,2.4992506869,,, +25.2695312500,25,-5.8383282113,3.8253242234,-6.0709866921,3.1466868935,,, +25.2714843750,25,-6.6578833476,4.3974396992,-6.8201990662,3.7716538709,,, +25.2734375000,25,-7.3363311349,4.9225404450,-7.4312708086,4.3532660792,,, +25.2753906250,25,-7.8193534206,5.3832204896,-7.8539417001,4.8713772978,,, +25.2773437500,25,-8.0637375403,5.7623476699,-8.0482900750,5.3066179425,,, +25.2792968750,25,-8.0401425417,6.0434713284,-7.9873315317,5.6408873115,,, +25.2812500000,25,-7.7322021605,6.2137944815,-7.6561941251,5.8602515559,,, +25.2832031250,25,-7.1355432968,6.2659047676,-7.0511402354,5.9567110502,,, +25.2851562500,25,-6.2606995303,6.1961639780,-6.1823446224,5.9266301682,,, +25.2871093750,25,-5.1385842950,6.0006953703,-5.0792308443,5.7666382478,,, +25.2890625000,25,-3.8240633231,5.6700379137,-3.7938827134,5.4683449544,,, +25.2910156250,25,-2.3918730163,5.1883036265,-2.3971097935,5.0175129090,,, +25.2929687500,25,-0.9238466408,4.5420785949,-0.9664991950,4.4024214269,,, +25.2949218750,25,0.5034471612,3.7312006481,0.4250610814,3.6239882812,,, +25.2968750000,25,1.8240994209,2.7721592646,1.7145219327,2.6990793593,,, +25.2988281250,25,2.9856352988,1.6971154508,2.8515450427,1.6598284443,,, +25.3007812500,25,3.9508891944,0.5505331712,3.8005324053,0.5506160322,,, +25.3027343750,25,4.6969129013,-0.6185144242,4.5397408636,-0.5793399658,,, +25.3046875000,25,5.2155683433,-1.7617427866,5.0618164027,-1.6813981795,,, +25.3066406250,25,5.5177795352,-2.8306939589,5.3777390342,-2.7067401546,,, +25.3085937500,25,5.6344472148,-3.7771652439,5.5177794155,-3.6066807932,,, +25.3105468750,25,5.6117252760,-4.5568387764,5.5270888720,-4.3360829597,,, +25.3125000000,25,5.5046904537,-5.1304152348,5.4593208434,-4.8549046421,,, +25.3144531250,25,5.3701981777,-5.4644030528,5.3692791985,-5.1296807681,,, +25.3164062500,25,5.2599540640,-5.5348671633,5.3062069044,-5.1373218742,,, +25.3183593750,25,5.2169126431,-5.3305157863,5.3106285250,-4.8677412904,,, +25.3203125000,25,5.2726944698,-4.8541022071,5.4120488868,-4.3249846107,,, +25.3222656250,25,5.4424521883,-4.1238528373,5.6239700988,-3.5287173089,,, +25.3242187500,25,5.7211623857,-3.1720213541,5.9400858764,-2.5131367721,,, +25.3261718750,25,6.0853493553,-2.0409428256,6.3356555374,-1.3234607309,,, +25.3281250000,25,6.4963830444,-0.7836185553,6.7707948210,-0.0163341510,,, +25.3300781250,25,6.9021192072,0.5323530477,7.1925994784,1.3370553305,,, +25.3320312500,25,7.2399525306,1.8264263515,7.5385188645,2.6532506242,,, +25.3339843750,25,7.4438247152,3.0135392954,7.7432308631,3.8451018559,,, +25.3359375000,25,7.4535216582,4.0147760238,7.7475777599,4.8323591633,,, +25.3378906250,25,7.2235327581,4.7680665802,7.5069504972,5.5521133849,,, +25.3398437500,25,6.7285885793,5.2352771531,6.9964962309,5.9656735466,,, +25.3417968750,25,5.9635772938,5.4009780198,6.2111996064,6.0575757440,,, +25.3437500000,25,4.9400596213,5.2663898729,5.1628010443,5.8299558994,,, +25.3457031250,25,3.6836707977,4.8462547500,3.8774275970,5.2996258738,,, +25.3476562500,25,2.2327548159,4.1685980257,2.3943744203,4.4979723679,,, +25.3496093750,25,0.6364930620,3.2741750360,0.7643594593,3.4704827012,,, +25.3515625000,25,-1.0481995569,2.2167904128,-0.9537112266,2.2766956396,,, +25.3535156250,25,-2.7605974948,1.0641670790,-2.6970692026,0.9902577085,,, +25.3554687500,25,-4.4385944465,-0.1038101020,-4.4019004477,-0.3035201468,,, +25.3574218750,25,-6.0182716223,-1.1988212100,-6.0031627976,-1.5117001257,,, +25.3593750000,25,-7.4344801186,-2.1289841060,-7.4353609783,-2.5388669780,,, +25.3613281250,25,-8.6268020154,-2.8083486323,-8.6386085689,-3.2970371638,,, +25.3632812500,25,-9.5478119023,-3.1703005041,-9.5668455391,-3.7193698846,,, +25.3652343750,25,-10.1682088014,-3.1792067808,-10.1927142451,-3.7716467632,,, +25.3671875000,25,-10.4794352251,-2.8387963847,-10.5096491324,-3.4599710472,,, +25.3691406250,25,-10.4954869333,-2.1968459872,-10.5331332505,-2.8347181686,,, +25.3710937500,25,-10.2519275329,-1.3422901455,-10.2993584250,-1.9870947602,,, +25.3730468750,25,-9.8015754091,-0.3949739737,-9.8606699057,-1.0383683097,,, +25.3750000000,25,-9.2084515763,0.5070370877,-9.2794377489,-0.1268139726,,, +25.3769531250,25,-8.5384495963,1.2231506626,-8.6191377803,0.6078008684,,, +25.3789062500,25,-7.8462983905,1.6308886915,-7.9322271568,1.0441279425,,, +25.3808593750,25,-7.1666258832,1.6435295983,-7.2519506042,1.0961815218,,, +25.3828125000,25,-6.5145980543,1.2170691735,-6.5930441142,0.7201104691,,, +25.3847656250,25,-5.8892840751,0.3505735047,-5.9549390336,-0.0854182893,,, +25.3867187500,25,-5.2735128442,-0.9142330255,-5.3218475822,-1.2799573193,,, +25.3886718750,25,-4.6333489047,-2.4944054917,-4.6627366361,-2.7834002815,,, +25.3906250000,25,-3.9227821028,-4.2710920059,-3.9361027231,-4.4816529681,,, +25.3925781250,25,-3.0960682664,-6.1005947902,-3.1016223334,-6.2373269055,,, +25.3945312500,25,-2.1221208719,-7.8288786397,-2.1334999156,-7.9034610669,,, +25.3964843750,25,-0.9922286124,-9.3048184379,-1.0271462716,-9.3356132410,,, +25.3984375000,25,0.2794908089,-10.3907166400,0.2013562924,-10.4008942263,,, +25.4003906250,25,1.6590691749,-10.9716940115,1.5187347553,-10.9863845176,,, +25.4023437500,25,3.0964777384,-10.9654081911,2.8781158189,-11.0088384628,,, +25.4042968750,25,4.5283657663,-10.3321452522,4.2214141505,-10.4250327079,,, +25.4062500000,25,5.8803938576,-9.0847841432,5.4816446621,-9.2415329571,,, +25.4082031250,25,7.0707835854,-7.2957966129,6.5865426839,-7.5213156558,,, +25.4101562500,25,8.0165225531,-5.0933795648,7.4641428655,-5.3804640911,,, +25.4121093750,25,8.6431059884,-2.6438327345,8.0508472080,-2.9725338371,,, +25.4140625000,25,8.8951061749,-0.1298287570,8.3000023309,-0.4692600762,,, +25.4160156250,25,8.7442969443,2.2676753771,8.1886168866,1.9558242712,,, +25.4179687500,25,8.1954171042,4.3868138095,7.7223884375,4.1438912402,,, +25.4199218750,25,7.2898872542,6.1029304930,6.9390845848,5.9685132858,,, +25.4218750000,25,6.1044430027,7.3405980711,5.9074998062,7.3479631769,,, +25.4238281250,25,4.7413545122,8.0746863129,4.7188221898,8.2473534490,,, +25.4257812500,25,3.3128588568,8.3246237048,3.4724475452,8.6740266790,,, +25.4277343750,25,1.9257642947,8.1462653692,2.2618388789,8.6703980266,,, +25.4296875000,25,0.6696657985,7.6223484363,1.1640287553,8.3056527534,,, +25.4316406250,25,-0.3895510128,6.8540043020,0.2343975733,7.6687822516,,, +25.4335937500,25,-1.2115902618,5.9525956395,-0.4941105219,6.8619562363,,, +25.4355468750,25,-1.7810278828,5.0291529031,-1.0096133859,5.9910357864,,, +25.4375000000,25,-2.1028047244,4.1859834739,-1.3170042677,5.1572002171,,, +25.4394531250,25,-2.1936843174,3.5136812508,-1.4303167735,4.4531750501,,, +25.4414062500,25,-2.0749523542,3.0871182189,-1.3662166380,3.9585483173,,, +25.4433593750,25,-1.7699017520,2.9570499848,-1.1419041590,3.7310046806,,, +25.4453125000,25,-1.3033392621,3.1423440493,-0.7750587618,3.7980307701,,, +25.4472656250,25,-0.7009687772,3.6254791922,-0.2838523217,4.1515928149,,, +25.4492187500,25,0.0098698990,4.3511213553,0.3117040773,4.7458139882,,, +25.4511718750,25,0.7983211261,5.2310393594,0.9872544465,5.5008377021,,, +25.4531250000,25,1.6286290843,6.1551419774,1.7121325487,6.3128456390,,, +25.4550781250,25,2.4586746172,7.0016885734,2.4479333690,7.0641377094,,, +25.4570312500,25,3.2391610270,7.6462269476,3.1481228345,7.6325483196,,, +25.4589843750,25,3.9170226871,7.9752094282,3.7612725590,7.9048798814,,, +25.4609375000,25,4.4427784945,7.9020600043,4.2377269948,7.7922545140,,, +25.4628906250,25,4.7770656581,7.3787284196,4.5358075402,7.2414600646,,, +25.4648437500,25,4.8947710076,6.4011670282,4.6262411039,6.2410395160,,, +25.4667968750,25,4.7875639222,5.0087865465,4.4955300319,4.8221028853,,, +25.4687500000,25,4.4630047883,3.2774417131,4.1462818745,3.0530852207,,, +25.4707031250,25,3.9402321172,1.3095124582,3.5939552310,1.0311924308,,, +25.4726562500,25,3.2463285275,-0.7743453385,2.8636762087,-1.1253357761,,, +25.4746093750,25,2.4144613176,-2.8435877753,1.9884583297,-3.2855286895,,, +25.4765625000,25,1.4809975116,-4.7699585080,1.0063078791,-5.3179241018,,, +25.4785156250,25,0.4818009512,-6.4403056459,-0.0438115270,-7.1039537654,,, +25.4804687500,25,-0.5499716281,-7.7668459497,-1.1247288861,-8.5490174633,,, +25.4824218750,25,-1.5846536623,-8.6966825943,-2.2019842154,-9.5921380065,,, +25.4843750000,25,-2.5954208166,-9.2176653287,-3.2431879770,-10.2117230121,,, +25.4863281250,25,-3.5554048221,-9.3550695329,-4.2159206340,-10.4232280420,,, +25.4882812500,25,-4.4341243548,-9.1622077557,-5.0855008069,-10.2715717996,,, +25.4902343750,25,-5.1964104515,-8.7110954673,-5.8148124675,-9.8231293865,,, +25.4921875000,25,-5.8056900101,-8.0841579548,-6.3675865743,-9.1577165238,,, +25.4941406250,25,-6.2306341902,-7.3668893104,-6.7142788014,-8.3606121673,,, +25.4960937500,25,-6.4516138040,-6.6418429411,-6.8376105939,-7.5156836416,,, +25.4980468750,25,-6.4634194875,-5.9818553831,-6.7349148289,-6.6983104127,,, +25.5000000000,25,-6.2741318117,-5.4412905659,-6.4172258324,-5.9669773408,,, +25.5019531250,25,-5.9029164386,-5.0486576106,-5.9074740103,-5.3564232169,,, +25.5039062500,25,-5.3780506457,-4.8037055523,-5.2388211176,-4.8751026089,,, +25.5058593750,25,-4.7344479539,-4.6786018970,-4.4523169662,-4.5064019721,,, +25.5078125000,25,-4.0110915785,-4.6233093274,-3.5939536285,-4.2132634157,,, +25.5097656250,25,-3.2490055313,-4.5746687499,-2.7116909010,-3.9456872447,,, +25.5117187500,25,-2.4885651769,-4.4647863114,-1.8520298541,-3.6478042486,,, +25.5136718750,25,-1.7663150321,-4.2270419346,-1.0566507480,-3.2633666562,,, +25.5156250000,25,-1.1135394913,-3.8030203215,-0.3608060515,-2.7422577904,,, +25.5175781250,25,-0.5556633631,-3.1497386092,0.2077053505,-2.0469839506,,, +25.5195312500,25,-0.1092438170,-2.2440724718,0.6320349296,-1.1561571861,,, +25.5214843750,25,0.2214949543,-1.0868419849,0.9101447038,-0.0677467886,,, +25.5234375000,25,0.4440726962,0.2920714855,1.0543681759,1.1960519939,,, +25.5253906250,25,0.5748525746,1.8330438623,1.0882522316,2.5876065156,,, +25.5273437500,25,0.6372445239,3.4525691978,1.0439438612,4.0383624796,,, +25.5292968750,25,0.6597887287,5.0521030679,0.9590896187,5.4657677716,,, +25.5312500000,25,0.6731767656,6.5290666052,0.8728347287,6.7824973163,,, +25.5332031250,25,0.7061155300,7.7878632401,0.8211639110,7.9063356648,,, +25.5351562500,25,0.7797755487,8.7461956480,0.8312617737,8.7659515309,,, +25.5371093750,25,0.9039451905,9.3390635437,0.9176141259,9.3045318086,,, +25.5390625000,25,1.0766359738,9.5244528413,1.0812580949,9.4848603618,,, +25.5410156250,25,1.2852892177,9.2873356974,1.3105170482,9.2926561337,,, +25.5429687500,25,1.5104223102,8.6392844723,1.5843994917,8.7360495602,,, +25.5449218750,25,1.7323754098,7.6174817312,1.8792057137,7.8448084869,,, +25.5468750000,25,1.9366320086,6.2843794871,2.1738409515,6.6703116043,,, +25.5488281250,25,2.1133023286,4.7232632111,2.4499775434,5.2821081389,,, +25.5507812500,25,2.2525682954,3.0298162197,2.6887083515,3.7610425829,,, +25.5527343750,25,2.3413579905,1.3049359610,2.8681536247,2.1932946748,,, +25.5546875000,25,2.3629906969,-0.3518264332,2.9638082374,0.6648872164,,, +25.5566406250,25,2.2985292627,-1.8507062224,2.9505583242,-0.7456102026,,, +25.5585937500,25,2.1306482944,-3.1182994651,2.8064299855,-1.9735068117,,, +25.5605468750,25,1.8511151675,-4.0991155560,2.5191307526,-2.9704125746,,, +25.5625000000,25,1.4689296814,-4.7541315571,2.0937752236,-3.7028972600,,, +25.5644531250,25,1.0147416824,-5.0582078703,1.5577860307,-4.1489588231,,, +25.5664062500,25,0.5396382898,-4.9986672763,0.9600392923,-4.2961695242,,, +25.5683593750,25,0.1078171340,-4.5786157366,0.3636642281,-4.1452189671,,, +25.5703125000,25,-0.2156404305,-3.8226715108,-0.1655014362,-3.7153385457,,, +25.5722656250,25,-0.3780387405,-2.7793415243,-0.5711039386,-3.0459122294,,, +25.5742187500,25,-0.3493056175,-1.5197674720,-0.8157634110,-2.1947924211,,, +25.5761718750,25,-0.1264732388,-0.1345101292,-0.8853038675,-1.2350415234,,, +25.5781250000,25,0.2684761171,1.2736760030,-0.7871023979,-0.2483925626,,, +25.5800781250,25,0.7953593299,2.6015313742,-0.5449134087,0.6844375954,,, +25.5820312500,25,1.4040040392,3.7568840146,-0.1926889425,1.4927683065,,, +25.5839843750,25,2.0422753880,4.6673058344,0.2317069106,2.1224831691,,, +25.5859375000,25,2.6623564313,5.2853258680,0.6916856048,2.5399856060,,, +25.5878906250,25,3.2234232317,5.5879370196,1.1546730544,2.7319658530,,, +25.5898437500,25,3.6906816802,5.5712606964,1.5920686452,2.7014005746,,, +25.5917968750,25,4.0326973021,5.2453878426,1.9769482325,2.4628288984,,, +25.5937500000,25,4.2194360617,4.6317540720,2.2814480876,2.0386884357,,, +25.5957031250,25,4.2227103056,3.7629066413,2.4764047406,1.4579471599,,, +25.5976562500,25,4.0196808373,2.6853626104,2.5344290528,0.7585231718,,, +25.5996093750,25,3.5971514721,1.4624745682,2.4342806664,-0.0095047403,,, +25.6015625000,25,2.9535632737,0.1708962330,2.1634493640,-0.7864131199,,, +25.6035156250,25,2.1010252431,-1.1077836427,1.7205273787,-1.5104672485,,, +25.6054687500,25,1.0696815245,-2.2938253747,1.1193641771,-2.1246434229,,, +25.6074218750,25,-0.0902481265,-3.3154720982,0.3911220338,-2.5825247398,,, +25.6093750000,25,-1.3128315035,-4.1165594508,-0.4194712505,-2.8551873063,,, +25.6113281250,25,-2.5260034000,-4.6623149135,-1.2625774179,-2.9358953083,,, +25.6132812500,25,-3.6635645414,-4.9423240139,-2.0933271693,-2.8410083675,,, +25.6152343750,25,-4.6752010246,-4.9722017142,-2.8791868247,-2.6084316703,,, +25.6171875000,25,-5.5295887319,-4.7915444353,-3.6006916984,-2.2923698367,,, +25.6191406250,25,-6.2101685258,-4.4558926804,-4.2459363101,-1.9532785555,,, +25.6210937500,25,-6.7076712685,-4.0264918508,-4.8025906185,-1.6465595770,,, +25.6230468750,25,-7.0133360372,-3.5622147564,-5.2511964787,-1.4142786163,,, +25.6250000000,25,-7.1156454253,-3.1142375605,-5.5631971560,-1.2815755210,,, +25.6269531250,25,-7.0026351009,-2.7243955618,-5.7055809728,-1.2585567492,,, +25.6289062500,25,-6.6676714170,-2.4264718839,-5.6488771822,-1.3451337967,,, +25.6308593750,25,-6.1128746681,-2.2441725733,-5.3725335181,-1.5320660061,,, +25.6328125000,25,-5.3485667383,-2.1841002469,-4.8665164377,-1.7971076975,,, +25.6347656250,25,-4.3933570463,-2.2326175028,-4.1329223748,-2.1041277835,,, +25.6367187500,25,-3.2776685474,-2.3620239858,-3.1896417389,-2.4096297723,,, +25.6386718750,25,-2.0468885036,-2.5392808081,-2.0734242492,-2.6714358535,,, +25.6406250000,25,-0.7589622197,-2.7301572464,-0.8381241045,-2.8535656881,,, +25.6425781250,25,0.5222698491,-2.9003664131,0.4514547033,-2.9276674567,,, +25.6445312500,25,1.7330616519,-3.0163392049,1.7257512725,-2.8731064931,,, +25.6464843750,25,2.8144745836,-3.0448929015,2.9156305302,-2.6756595493,,, +25.6484375000,25,3.7169701479,-2.9533400523,3.9577417252,-2.3262227466,,, +25.6503906250,25,4.4041133585,-2.7114896847,4.7993547253,-1.8209111812,,, +25.6523437500,25,4.8546358018,-2.2939248541,5.4016137385,-1.1614510123,,, +25.6542968750,25,5.0617042813,-1.6838980604,5.7403237520,-0.3568715518,,, +25.6562500000,25,5.0296302431,-0.8795148328,5.8046118333,0.5730109072,,, +25.6582031250,25,4.7717267422,0.1028765662,5.5961466256,1.5960866056,,, +25.6601562500,25,4.3107570820,1.2290365989,5.1299209143,2.6688151966,,, +25.6621093750,25,3.6793684732,2.4466898963,4.4348239971,3.7363172689,,, +25.6640625000,25,2.9195409179,3.6865715992,3.5529959288,4.7332393480,,, +25.6660156250,25,2.0814358432,4.8678821581,2.5377053094,5.5876596280,,, +25.6679687500,25,1.2203806373,5.9045342199,1.4494529049,6.2257825576,,, +25.6699218750,25,0.3919754985,6.7111451444,0.3512409298,6.5777642365,,, +25.6718750000,25,-0.3523244571,7.2137949701,-0.6957775281,6.5881220354,,, +25.6738281250,25,-0.9684567701,7.3637141167,-1.6363876808,6.2277901961,,, +25.6757812500,25,-1.4225546158,7.1463069818,-2.4248652116,5.5017388542,,, +25.6777343750,25,-1.6924169713,6.5846144244,-3.0264171588,4.4523216915,,, +25.6796875000,25,-1.7676736132,5.7391200067,-3.4169995212,3.1595651724,,, +25.6816406250,25,-1.6508769135,4.7008901011,-3.5843143362,1.7344692426,,, +25.6835937500,25,-1.3587123062,3.5779660101,-3.5295250882,0.3047916464,,, +25.6855468750,25,-0.9197831237,2.4811778993,-3.2663089825,-1.0006126598,,, +25.6875000000,25,-0.3709639872,1.5100886032,-2.8186542469,-2.0674824559,,, +25.6894531250,25,0.2417159042,0.7360770029,-2.2223451148,-2.8137323561,,, +25.6914062500,25,0.8591578065,0.1889657501,-1.5288192688,-3.2027869708,,, +25.6933593750,25,1.4101464286,-0.1444297395,-0.8045942369,-3.2454898756,,, +25.6953125000,25,1.8200397744,-0.3112703751,-0.1236333407,-2.9921658329,,, +25.6972656250,25,2.0235463919,-0.3775714313,0.4441732468,-2.5187132256,,, +25.6992187500,25,1.9764769343,-0.4114069611,0.8438694671,-1.9105854074,,, +25.7011718750,25,1.6622004300,-0.4726009871,1.0419950224,-1.2520661592,,, +25.7031250000,25,1.0926238529,-0.6104969856,1.0284103032,-0.6227866338,,, +25.7050781250,25,0.3071817638,-0.8615212810,0.8161404975,-0.0941558053,,, +25.7070312500,25,-0.6290760346,-1.2442152413,0.4408800393,0.2774518313,,, +25.7089843750,25,-1.6304820661,-1.7569438079,-0.0413803081,0.4564133259,,, +25.7109375000,25,-2.5993320300,-2.3783008022,-0.5602321396,0.4307967218,,, +25.7128906250,25,-3.4358172863,-3.0671739332,-1.0392614592,0.2138415258,,, +25.7148437500,25,-4.0478996096,-3.7646181097,-1.4050906233,-0.1573306747,,, +25.7167968750,25,-4.3601997651,-4.3995354850,-1.5951577219,-0.6262910778,,, +25.7187500000,25,-4.3203139823,-4.8957361236,-1.5628901107,-1.1230214036,,, +25.7207031250,25,-3.9031157733,-5.1803018168,-1.2814001387,-1.5715564916,,, +25.7226562500,25,-3.1139183580,-5.1941792608,-0.7466042642,-1.9005571893,,, +25.7246093750,25,-1.9889712740,-4.9010402220,0.0214932489,-2.0531997798,,, +25.7265625000,25,-0.5937105924,-4.2923206770,0.9788044749,-1.9945391344,,, +25.7285156250,25,0.9789000008,-3.3909108306,2.0569628872,-1.7177050151,,, +25.7304687500,25,2.6124438256,-2.2514626345,3.1661560122,-1.2457291157,,, +25.7324218750,25,4.1779166254,-0.9529879411,4.2051536335,-0.6247581233,,, +25.7343750000,25,5.5479287821,0.4125303397,5.0744955570,0.0866196403,,, +25.7363281250,25,6.6067734610,1.7480906885,5.6849119977,0.8234838110,,, +25.7382812500,25,7.2561739277,2.9564474129,5.9610325286,1.5167199070,,, +25.7402343750,25,7.4214091270,3.9463258893,5.8457903351,2.0970575103,,, +25.7421875000,25,7.0584190235,4.6394066739,5.3063227816,2.5006740293,,, +25.7441406250,25,6.1599408815,4.9764375533,4.3390620292,2.6741062764,,, +25.7460937500,25,4.7600746242,4.9240500835,2.9734593733,2.5800466240,,, +25.7480468750,25,2.9357503717,4.4805647404,1.2737396942,2.2035662709,,, +25.7500000000,25,0.8027098088,3.6774764724,-0.6633632145,1.5558430766,,, +25.7519531250,25,-1.4937635706,2.5776099121,-2.7155297237,0.6751214960,,, +25.7539062500,25,-3.7900651025,1.2718882391,-4.7436297740,-0.3736790835,,, +25.7558593750,25,-5.9150524746,-0.1261121318,-6.5998311855,-1.5011749423,,, +25.7578125000,25,-7.7019418533,-1.4895097243,-8.1371169834,-2.6000684287,,, +25.7597656250,25,-9.0030714827,-2.6912038478,-9.2230073714,-3.5574912518,,, +25.7617187500,25,-9.7044430693,-3.6178372383,-9.7541827700,-4.2698151315,,, +25.7636718750,25,-9.7337362346,-4.1793337607,-9.6645006730,-4.6525663761,,, +25.7656250000,25,-9.0607702363,-4.3125612757,-8.9252776077,-4.6438020609,,, +25.7675781250,25,-7.6986259589,-3.9868551202,-7.5463667242,-4.2095536272,,, +25.7695312500,25,-5.7108179432,-3.2152478477,-5.5830422236,-3.3549290994,,, +25.7714843750,25,-3.2166282675,-2.0604469994,-3.1409397258,-2.1297763960,,, +25.7734375000,25,-0.3847756706,-0.6265248360,-0.3700424456,-0.6205520380,,, +25.7753906250,25,2.5824014058,0.9564552838,2.5496220448,1.0636560665,,, +25.7773437500,25,5.4659673673,2.5454396711,5.4223135814,2.8011557476,,, +25.7792968750,25,8.0463870302,3.9959848935,8.0491954324,4.4652383729,,, +25.7812500000,25,10.1207365783,5.1747402881,10.2422600500,5.9328540430,,, +25.7832031250,25,11.5208151480,5.9708319383,11.8396857724,7.0930322222,,, +25.7851562500,25,12.1301028797,6.3059298275,12.7205180253,7.8546218535,,, +25.7871093750,25,11.8971424091,6.1424029555,12.8169330712,8.1535871471,,, +25.7890625000,25,10.8411394224,5.4852917636,12.1214536379,7.9576509856,,, +25.7910156250,25,9.0468395213,4.3774253009,10.6860550697,7.2672580127,,, +25.7929687500,25,6.6508673221,2.8919737044,8.6130897835,6.1139626390,,, +25.7949218750,25,3.8255934151,1.1248819778,6.0426791760,4.5570053835,,, +25.7968750000,25,0.7657249485,-0.8123099250,3.1421041236,2.6794027329,,, +25.7988281250,25,-2.3229410959,-2.7986752761,0.0971389162,0.5848187383,,, +25.8007812500,25,-5.2373061577,-4.7107251736,-2.8997571000,-1.6072050966,,, +25.8027343750,25,-7.7935953933,-6.4311895472,-5.6654353588,-3.7700795335,,, +25.8046875000,25,-9.8404301001,-7.8556245209,-8.0397250197,-5.7783908725,,, +25.8066406250,25,-11.2647531871,-8.8940333740,-9.8924701175,-7.5114949342,,, +25.8085937500,25,-11.9945637980,-9.4730485539,-11.1277955944,-8.8580553451,,, +25.8105468750,25,-12.0015054710,-9.5411980158,-11.6889887159,-9.7247008623,,, +25.8125000000,25,-11.3017831826,-9.0724441635,-11.5619628965,-10.0432386876,,, +25.8144531250,25,-9.9547853320,-8.0684292677,-10.7753889751,-9.7749470576,,, +25.8164062500,25,-8.0586242446,-6.5606380868,-9.3974097773,-8.9140965787,,, +25.8183593750,25,-5.7408571854,-4.6072331948,-7.5293620893,-7.4885485049,,, +25.8203125000,25,-3.1483041211,-2.2874259016,-5.2992618307,-5.5588311718,,, +25.8222656250,25,-0.4404956687,0.2979768822,-2.8565994907,-3.2201807225,,, +25.8242187500,25,2.2176281436,3.0242196114,-0.3642505352,-0.6032256278,,, +25.8261718750,25,4.6677066533,5.7469678200,2.0148069968,2.1329763044,,, +25.8281250000,25,6.7697372463,8.3106896584,4.1309732456,4.8124174826,,, +25.8300781250,25,8.4088437468,10.5563058898,5.8566854764,7.2528378165,,, +25.8320312500,25,9.4982883300,12.3302013525,7.0904697020,9.2762804786,,, +25.8339843750,25,9.9820956647,13.4966870563,7.7600639033,10.7222304723,,, +25.8359375000,25,9.8382416226,13.9514144029,7.8268065340,11.4627349074,,, +25.8378906250,25,9.0806072309,13.6326112035,7.2894894708,11.4163076191,,, +25.8398437500,25,7.7589367732,12.5291550973,6.1861951287,10.5585636199,,, +25.8417968750,25,5.9568327138,10.6843425191,4.5937015336,8.9278170684,,, +25.8437500000,25,3.7868687525,8.1945472511,2.6229498084,6.6239438475,,, +25.8457031250,25,1.3838133841,5.2050863390,0.4113086724,3.8024805206,,, +25.8476562500,25,-1.1032903945,1.9029771292,-1.8868246333,0.6648437539,,, +25.8496093750,25,-3.5216107987,-1.4974098281,-4.1116688702,-2.5581379638,,, +25.8515625000,25,-5.7257636579,-4.7732027818,-6.1102877037,-5.6269265019,,, +25.8535156250,25,-7.5877230238,-7.7115102843,-7.7476241580,-8.3137113676,,, +25.8554687500,25,-9.0075798932,-10.1293484094,-8.9182445862,-10.4241225972,,, +25.8574218750,25,-9.9223624886,-11.8917858785,-9.5560379609,-11.8169088231,,, +25.8593750000,25,-10.3062097873,-12.9193055210,-9.6353934515,-12.4126233695,,, +25.8613281250,25,-10.1650601843,-13.1874319551,-9.1665909339,-12.1939104143,,, +25.8632812500,25,-9.5326625652,-12.7263931418,-8.1918101218,-11.2048982104,,, +25.8652343750,25,-8.4670145127,-11.6178265485,-6.7810043622,-9.5469079729,,, +25.8671875000,25,-7.0457232744,-9.9858346649,-5.0263860933,-7.3680936188,,, +25.8691406250,25,-5.3617345910,-7.9866492270,-3.0370983312,-4.8514788743,,, +25.8710937500,25,-3.5192601048,-5.7979248469,-0.9337662844,-2.2021857459,,, +25.8730468750,25,-1.6289428040,-3.6059244660,1.1580817364,0.3679888859,,, +25.8750000000,25,0.1989990700,-1.5910220833,3.1164934800,2.6576088325,,, +25.8769531250,25,1.8656569682,0.0894511274,4.8350374121,4.4947008454,,, +25.8789062500,25,3.2964699390,1.3198119557,6.2364367939,5.7567578934,,, +25.8808593750,25,4.4493849566,2.0379764268,7.2808212027,6.3831523912,,, +25.8828125000,25,5.3138211934,2.2361500367,7.9639546072,6.3746803577,,, +25.8847656250,25,5.9029332534,1.9539448473,8.3082292167,5.7844498057,,, +25.8867187500,25,6.2444992029,1.2678587449,8.3523633561,4.7052192797,,, +25.8886718750,25,6.3746574720,0.2799053334,8.1441321334,3.2563603812,,, +25.8906250000,25,6.3351414448,-0.8915066483,7.7367491532,1.5734865516,,, +25.8925781250,25,6.1718984587,-2.1178313360,7.1869224691,-0.1985959527,,, +25.8945312500,25,5.9327077648,-3.2667415947,6.5523111639,-1.9125211213,,, +25.8964843750,25,5.6628755018,-4.2106996643,5.8870608864,-3.4272970815,,, +25.8984375000,25,5.4008394756,-4.8345872834,5.2364584401,-4.6174623555,,, +25.9003906250,25,5.1758612270,-5.0401140875,4.6334516117,-5.3792582414,,, +25.9023437500,25,5.0080116197,-4.7503373762,4.0987097909,-5.6349570399,,, +25.9042968750,25,4.9085443046,-3.9164352061,3.6420652617,-5.3379442433,,, +25.9062500000,25,4.8774373039,-2.5257032006,3.2612287163,-4.4790400546,,, +25.9082031250,25,4.8982165343,-0.6092221941,2.9383425969,-3.0918801821,,, +25.9101562500,25,4.9355656194,1.7555337258,2.6397238692,-1.2525607970,,, +25.9121093750,25,4.9402043063,4.4521704431,2.3216752842,0.9293732181,,, +25.9140625000,25,4.8586671682,7.3400179475,1.9396105309,3.3250227868,,, +25.9160156250,25,4.6424959279,10.2680787605,1.4562638931,5.7990316892,,, +25.9179687500,25,4.2546503402,13.0845821430,0.8474246880,8.2184234621,,, +25.9199218750,25,3.6741252477,15.6436780760,0.1059610785,10.4586292900,,, +25.9218750000,25,2.9000253603,17.8116620379,-0.7548168179,12.4088477472,,, +25.9238281250,25,1.9554833767,19.4740848476,-1.6983870959,13.9776329141,,, +25.9257812500,25,0.8899538456,20.5436257382,-2.6643064567,15.0984927071,,, +25.9277343750,25,-0.2235097726,20.9652184853,-3.5721948926,15.7329157733,,, +25.9296875000,25,-1.2974914846,20.7153847533,-4.3315424589,15.8682678556,,, +25.9316406250,25,-2.2438643372,19.7980413771,-4.8557174957,15.5122359434,,, +25.9335937500,25,-2.9884907589,18.2401413755,-5.0771637122,14.6868357028,,, +25.9355468750,25,-3.4828663956,16.0885747295,-4.9594036948,13.4240596837,,, +25.9375000000,25,-3.7100359264,13.4086452171,-4.5026768621,11.7643795719,,, +25.9394531250,25,-3.6851450728,10.2831787530,-3.7439225554,9.7566516716,,, +25.9414062500,25,-3.4521976816,6.8105964710,-2.7534073026,7.4566311903,,, +25.9433593750,25,-3.0788566524,3.1007385116,-1.6293636041,4.9234590142,,, +25.9453125000,25,-2.6496273723,-0.7303352474,-0.4899286912,2.2168154962,,, +25.9472656250,25,-2.2568300192,-4.5649660920,0.5385847552,-0.6031071549,,, +25.9492187500,25,-1.9900678053,-8.2884070732,1.3356429266,-3.4743821133,,, +25.9511718750,25,-1.9250787259,-11.7925531006,1.8003053285,-6.3324071119,,, +25.9531250000,25,-2.1145714332,-14.9792268879,1.8618297312,-9.1104283774,,, +25.9550781250,25,-2.5855607950,-17.7664563922,1.4831576252,-11.7443345840,,, +25.9570312500,25,-3.3418018428,-20.0951793533,0.6589359990,-14.1787425534,,, +25.9589843750,25,-4.3637914278,-21.9281298611,-0.5843086945,-16.3656499140,,, +25.9609375000,25,-5.6044477741,-23.2418680379,-2.1837774692,-18.2562143862,,, +25.9628906250,25,-6.9856816178,-24.0214810000,-4.0369895229,-19.7953481165,,, +25.9648437500,25,-8.3995056031,-24.2614343532,-6.0034022906,-20.9233638024,,, +25.9667968750,25,-9.7156932784,-23.9698155753,-7.9138835357,-21.5832718713,,, +25.9687500000,25,-10.7971263137,-23.1735562834,-9.5892166480,-21.7314997420,,, +25.9707031250,25,-11.5181816704,-21.9210890874,-10.8620717536,-21.3469146544,,, +25.9726562500,25,-11.7799049341,-20.2801592592,-11.5956122207,-20.4346569096,,, +25.9746093750,25,-11.5209131978,-18.3331978439,-11.6976213830,-19.0269887075,,, +25.9765625000,25,-10.7233133187,-16.1703994326,-11.1295186422,-17.1813705786,,, +25.9785156250,25,-9.4116270817,-13.8779364039,-9.9081777861,-14.9729953051,,, +25.9804687500,25,-7.6476620591,-11.5260498950,-8.1025611609,-12.4852966096,,, +25.9824218750,25,-5.5264300098,-9.1649153772,-5.8291966726,-9.8049794160,,, +25.9843750000,25,-3.1727143219,-6.8271603914,-3.2462587380,-7.0206731759,,, +25.9863281250,25,-0.7331737575,-4.5307289764,-0.5419605116,-4.2198557188,,, +25.9882812500,25,1.6381383608,-2.2806685441,2.0843607527,-1.4832306246,,, +25.9902343750,25,3.7956418534,-0.0722868650,4.4426178560,1.1197502788,,, +25.9921875000,25,5.6141125350,2.1042661105,6.3677971402,3.5328799945,,, +25.9941406250,25,6.9975010562,4.2599821361,7.7325181606,5.7152482684,,, +25.9960937500,25,7.8857816681,6.4034958556,8.4577936010,7.6439126483,,, +25.9980468750,25,8.2579348002,8.5374993389,8.5190492787,9.3149620588,,, +26.0000000000,26,8.1310526104,10.6551975655,7.9462335278,10.7414265305,33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000:10.0000000000:11.0000000000:12.0000000000:13.0000000000:14.0000000000:15.0000000000:19.0000000000:20.0000000000:21.0000000000:22.0000000000:23.0000000000:24.0000000000:25.0000000000:26.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +26.0019531250,26,7.5571965446,12.7363507075,6.8195820548,11.9476179647,,, +26.0039062500,26,6.6190419487,14.7445304511,5.2624498419,12.9620812824,,, +26.0058593750,26,5.4257466765,16.6282396496,3.4332142994,13.8126851333,,, +26.0078125000,26,4.1070794614,18.3226132619,1.5151825482,14.5217993128,,, +26.0097656250,26,2.8025943727,19.7503247815,-0.2990302782,15.0995274131,,, +26.0117187500,26,1.6500797224,20.8300824767,-1.8253478744,15.5421777899,,, +26.0136718750,26,0.7770724770,21.4933506443,-2.9029358987,15.8391297869,,, +26.0156250000,26,0.2905330843,21.6961857986,-3.4076581856,15.9792349405,,, +26.0175781250,26,0.2638708874,21.4217705475,-3.2651707606,15.9522553668,,, +26.0195312500,26,0.7297312748,20.6819291625,-2.4575085946,15.7507726529,,, +26.0214843750,26,1.6800941394,19.5173879299,-1.0215594535,15.3725201170,,, +26.0234375000,26,3.0670893338,17.9901062073,0.9550933069,14.8177428409,,, +26.0253906250,26,4.8042488399,16.1719173921,3.3397527459,14.0843895088,,, +26.0273437500,26,6.7726122778,14.1369398296,5.9648740596,13.1670863458,,, +26.0292968750,26,8.8303359530,11.9561855117,8.6419638906,12.0586886459,,, +26.0312500000,26,10.8215206995,9.6923717882,11.1749149820,10.7522841260,,, +26.0332031250,26,12.5843973735,7.3977055246,13.3718667932,9.2448641316,,, +26.0351562500,26,13.9603870724,5.1135951698,15.0563268106,7.5406141957,,, +26.0371093750,26,14.8040583363,2.8695785885,16.0776584436,5.6512861629,,, +26.0390625000,26,14.9958931574,0.6851731541,16.3228356923,3.5974051423,,, +26.0410156250,26,14.4573277460,-1.4241861529,15.7291981599,1.4118074730,,, +26.0429687500,26,13.1616378121,-3.4440643683,14.2926846701,-0.8604311121,,, +26.0449218750,26,11.1378895855,-5.3624174540,12.0689529915,-3.1671834985,,, +26.0468750000,26,8.4713748429,-7.1690624708,9.1706170461,-5.4533351202,,, +26.0488281250,26,5.3005990933,-8.8521650773,5.7613345973,-7.6617201997,,, +26.0507812500,26,1.8071187381,-10.3966653559,2.0438966692,-9.7347809689,,, +26.0527343750,26,-1.8010969700,-11.7865539391,-1.7567545566,-11.6184205057,,, +26.0546875000,26,-5.3088346096,-13.0100298128,-5.4120007051,-13.2673585663,,, +26.0566406250,26,-8.5134755972,-14.0641024969,-8.7084412585,-14.6496238598,,, +26.0585937500,26,-11.2420839901,-14.9521945524,-11.4649362863,-15.7452806238,,, +26.0605468750,26,-13.3608195106,-15.6749315518,-13.5433169009,-16.5398717306,,, +26.0625000000,26,-14.7786384832,-16.2235581888,-14.8531281728,-17.0196781129,,, +26.0644531250,26,-15.4505557739,-16.5803084442,-15.3545165177,-17.1717363586,,, +26.0664062500,26,-15.3810138575,-16.7221963048,-15.0610197650,-16.9869293445,,, +26.0683593750,26,-14.6264724145,-16.6279443305,-14.0419209700,-16.4666025622,,, +26.0703125000,26,-13.2955282079,-16.2867974798,-12.4216247059,-15.6301450394,,, +26.0722656250,26,-11.5420997024,-15.7016057894,-10.3715705465,-14.5157306371,,, +26.0742187500,26,-9.5500284750,-14.8848883995,-8.0931400912,-13.1729925747,,, +26.0761718750,26,-7.5124995961,-13.8540783439,-5.7946694173,-11.6535290107,,, +26.0781250000,26,-5.6094451897,-12.6253303732,-3.6670387822,-10.0007229537,,, +26.0800781250,26,-3.9859148524,-11.2044189825,-1.8625896549,-8.2401619514,,, +26.0820312500,26,-2.7376086854,-9.5837407944,-0.4824570409,-6.3783286255,,, +26.0839843750,26,-1.9070794605,-7.7500240395,0.4260699407,-4.4115975377,,, +26.0859375000,26,-1.4864106295,-5.6938597145,0.8659673380,-2.3370847493,,, +26.0878906250,26,-1.4209037027,-3.4142281082,0.8859354256,-0.1585775921,,, +26.0898437500,26,-1.6130833365,-0.9200049281,0.5767375331,2.1121978912,,, +26.0917968750,26,-1.9314719593,1.7672475674,0.0642902613,4.4549077304,,, +26.0937500000,26,-2.2293802624,4.6056627668,-0.5064434729,6.8357013884,,, +26.0957031250,26,-2.3700094797,7.5228278082,-0.9942180470,9.1988088034,,, +26.0976562500,26,-2.2461660589,10.4129013121,-1.2804615916,11.4634708759,,, +26.0996093750,26,-1.7892564553,13.1466707184,-1.2790625597,13.5320939823,,, +26.1015625000,26,-0.9717139229,15.5873515784,-0.9402680528,15.3035260700,,, +26.1035156250,26,0.1931092379,17.6036184894,-0.2526294041,16.6829606739,,, +26.1054687500,26,1.6543725765,19.0810973945,0.7576677329,17.5895494660,,, +26.1074218750,26,3.3312581503,19.9343324304,2.0316223647,17.9648596688,,, +26.1093750000,26,5.1207609696,20.1143754053,3.4836123468,17.7786097067,,, +26.1113281250,26,6.9033685716,19.6102747248,5.0065867456,17.0298364589,,, +26.1132812500,26,8.5487368059,18.4476829886,6.4777361019,15.7458995231,,, +26.1152343750,26,9.9215391094,16.6836961378,7.7648079261,13.9784536759,,, +26.1171875000,26,10.8874271791,14.3979744959,8.7329658242,11.7963819881,,, +26.1191406250,26,11.3235046088,11.6867887168,9.2554671636,9.2809079774,,, +26.1210937500,26,11.1347621197,8.6621848371,9.2290293788,6.5243216426,,, +26.1230468750,26,10.2702473058,5.4502635276,8.5889181120,3.6278032528,,, +26.1250000000,26,8.7332848590,2.1858717206,7.3192039526,0.6969246609,,, +26.1269531250,26,6.5847487192,-0.9950621576,5.4571743744,-2.1640477323,,, +26.1289062500,26,3.9393598349,-3.9660943375,3.0917857468,-4.8597234146,,, +26.1308593750,26,0.9559103930,-6.6209127528,0.3566288755,-7.3108230672,,, +26.1328125000,26,-2.1767148458,-8.8786707691,-2.5815233329,-9.4567902058,,, +26.1347656250,26,-5.2570554159,-10.6845973052,-5.5378805839,-11.2542421658,,, +26.1367187500,26,-8.0902325617,-12.0086259966,-8.3265556042,-12.6737341645,,, +26.1386718750,26,-10.5037984056,-12.8406737590,-10.7753657789,-13.6946771674,,, +26.1406250000,26,-12.3576298712,-13.1839405754,-12.7362361756,-14.3001015335,,, +26.1425781250,26,-13.5504789737,-13.0522643625,-14.0929950321,-14.4762158980,,, +26.1445312500,26,-14.0249192741,-12.4712526265,-14.7680072328,-14.2161958070,,, +26.1464843750,26,-13.7684736115,-11.4781946970,-14.7252197642,-13.5228487348,,, +26.1484375000,26,-12.8102416162,-10.1224604315,-13.9681469096,-12.4106700807,,, +26.1503906250,26,-11.2158416796,-8.4688682162,-12.5354127704,-10.9096453191,,, +26.1523437500,26,-9.0824903600,-6.5980670545,-10.4970502871,-9.0670207403,,, +26.1542968750,26,-6.5338342656,-4.6002399267,-7.9522045394,-6.9448514406,,, +26.1562500000,26,-3.7143804944,-2.5683043300,-5.0267888649,-4.6175425996,,, +26.1582031250,26,-0.7825235670,-0.5937686306,-1.8690893516,-2.1709823680,,, +26.1601562500,26,2.0985663306,1.2373659333,1.3572083887,0.2990658922,,, +26.1621093750,26,4.7700319735,2.8469417115,4.4813489457,2.6887986581,,, +26.1640625000,26,7.0870298785,4.1655317916,7.3363243249,4.8894657674,,, +26.1660156250,26,8.9306536657,5.1365717011,9.7726389848,6.7948126319,,, +26.1679687500,26,10.2159014724,5.7202343169,11.6685535850,8.3086090533,,, +26.1699218750,26,10.8919875740,5.8926335757,12.9334489428,9.3481658858,,, +26.1718750000,26,10.9420900524,5.6469364191,13.5106708996,9.8497576766,,, +26.1738281250,26,10.3862047022,4.9999471906,13.3829968287,9.7789561877,,, +26.1757812500,26,9.2822518146,3.9971206718,12.5765045828,9.1395094936,,, +26.1777343750,26,7.7224973937,2.7119951756,11.1601429075,7.9769634949,,, +26.1796875000,26,5.8268986639,1.2424755926,9.2415423395,6.3780340820,,, +26.1816406250,26,3.7362654197,-0.2946675344,6.9608272433,4.4656835909,,, +26.1835937500,26,1.6073374266,-1.7711747747,4.4845726542,2.3900087881,,, +26.1855468750,26,-0.3930249464,-3.0567129625,1.9981866355,0.3161079683,,, +26.1875000000,26,-2.1004244545,-4.0310655751,-0.3081676088,-1.5908114535,,, +26.1894531250,26,-3.3708579770,-4.5974472040,-2.2589156838,-3.1817106786,,, +26.1914062500,26,-4.0966837093,-4.6924824656,-3.7109532293,-4.3373064604,,, +26.1933593750,26,-4.2180284928,-4.2910449420,-4.5668513553,-4.9761375874,,, +26.1953125000,26,-3.7302600733,-3.4079958901,-4.7834533875,-5.0583871361,,, +26.1972656250,26,-2.6858745556,-2.0971104786,-4.3750397912,-4.5867998677,,, +26.1992187500,26,-1.1887785735,-0.4450438709,-3.4098985076,-3.6036260661,,, +26.2011718750,26,0.6174819276,1.4376670330,-2.0015065038,-2.1851364494,,, +26.2031250000,26,2.5633315132,3.4239337929,-0.2975178573,-0.4371099316,,, +26.2050781250,26,4.4668153963,5.3768013098,1.5318876101,1.5099141332,,, +26.2070312500,26,6.1482003998,7.1587551462,3.3068243399,3.5083414488,,, +26.2089843750,26,7.4450536366,8.6418993303,4.8520095769,5.4035130950,,, +26.2109375000,26,8.2267411520,9.7179236042,6.0125218311,7.0462413170,,, +26.2128906250,26,8.4078842087,10.3096424832,6.6700572023,8.3089357870,,, +26.2148437500,26,7.9561587640,10.3787334153,6.7545216289,9.0989902495,,, +26.2167968750,26,6.8894250520,9.9226927439,6.2455869090,9.3617373072,,, +26.2187500000,26,5.2672323421,8.9660089752,5.1679756868,9.0764481670,,, +26.2207031250,26,3.1855820476,7.5541507958,3.5883177477,8.2529821028,,, +26.2226562500,26,0.7755948409,5.7525511583,1.6139056094,6.9308317707,,, +26.2246093750,26,-1.7985239170,3.6495173385,-0.6107960518,5.1798629363,,, +26.2265625000,26,-4.3458297454,1.3586915085,-2.9114916245,3.1010053164,,, +26.2285156250,26,-6.6625810373,-0.9865546929,-5.0966947281,0.8216946682,,, +26.2304687500,26,-8.5547932750,-3.2484328326,-6.9774911454,-1.5167994359,,, +26.2324218750,26,-9.8631330049,-5.3006368258,-8.3908640548,-3.7745318975,,, +26.2343750000,26,-10.4812849314,-7.0376803338,-9.2187892755,-5.8243352061,,, +26.2363281250,26,-10.3654002566,-8.3813752184,-9.3988951920,-7.5605061662,,, +26.2382812500,26,-9.5365737932,-9.2867556835,-8.9274639359,-8.9055202778,,, +26.2402343750,26,-8.0769520529,-9.7432908610,-7.8566594629,-9.8125191493,,, +26.2421875000,26,-6.1200204320,-9.7717482060,-6.2874778158,-10.2652799729,,, +26.2441406250,26,-3.8367791810,-9.4203361534,-4.3593165961,-10.2782259297,,, +26.2460937500,26,-1.4190190487,-8.7592327327,-2.2362946990,-9.8941602840,,, +26.2480468750,26,0.9392584919,-7.8724363392,-0.0910601837,-9.1783099610,,, +26.2500000000,26,3.0601208606,-6.8488936855,1.9118150273,-8.2107110187,,, +26.2519531250,26,4.7970096517,-5.7737331133,3.6305738938,-7.0774138727,,, +26.2539062500,26,6.0447903090,-4.7197824698,4.9570059594,-5.8606032834,,, +26.2558593750,26,6.7431992537,-3.7419966907,5.8214536924,-4.6307823377,,, +26.2578125000,26,6.8752610078,-2.8761212177,6.1931687928,-3.4429195990,,, +26.2597656250,26,6.4646334230,-2.1389017669,6.0795304301,-2.3342719914,,, +26.2617187500,26,5.5730453245,-1.5284207472,5.5249958634,-1.3227934817,,, +26.2636718750,26,4.2960416650,-1.0249488688,4.6074408088,-0.4073931069,,, +26.2656250000,26,2.7565709467,-0.5916146106,3.4310537066,0.4300942517,,, +26.2675781250,26,1.0958382662,-0.1775321043,2.1161672467,1.2198981753,,, +26.2695312500,26,-0.5403129951,0.2718545797,0.7856944491,1.9933605714,,, +26.2714843750,26,-2.0183906359,0.7995238531,-0.4504417573,2.7687607562,,, +26.2734375000,26,-3.2331622589,1.4242590366,-1.5088995535,3.5410078333,,, +26.2753906250,26,-4.1172182425,2.1355471310,-2.3396441182,4.2798422847,,, +26.2773437500,26,-4.6412194141,2.8980249875,-2.9237662623,4.9374640092,,, +26.2792968750,26,-4.8085395673,3.6630953887,-3.2673248714,5.4613847590,,, +26.2812500000,26,-4.6506191731,4.3798928764,-3.3971850471,5.8049074982,,, +26.2832031250,26,-4.2232486926,5.0017002768,-3.3580342137,5.9327589249,,, +26.2851562500,26,-3.6015744380,5.4895620441,-3.2081857256,5.8239668209,,, +26.2871093750,26,-2.8748814556,5.8114454405,-3.0145666703,5.4711923482,,, +26.2890625000,26,-2.1402315507,5.9378921541,-2.8459131254,4.8775185930,,, +26.2910156250,26,-1.4922577967,5.8431483493,-2.7634481696,4.0569902736,,, +26.2929687500,26,-1.0125208166,5.5134429589,-2.8129878184,3.0396428556,,, +26.2949218750,26,-0.7638148535,4.9539072680,-3.0221869197,1.8746050564,,, +26.2968750000,26,-0.7879768189,4.1906503793,-3.4007900700,0.6288833350,,, +26.2988281250,26,-1.1030741181,3.2705233728,-3.9400938624,-0.6158067948,,, +26.3007812500,26,-1.7002154651,2.2579749822,-4.6116899946,-1.7685189034,,, +26.3027343750,26,-2.5422527698,1.2272343166,-5.3674407598,-2.7383760730,,, +26.3046875000,26,-3.5643652219,0.2530217226,-6.1410087665,-3.4450230301,,, +26.3066406250,26,-4.6771865211,-0.5974941114,-6.8519907209,-3.8281161714,,, +26.3085937500,26,-5.7756717237,-1.2735010534,-7.4151505307,-3.8570833622,,, +26.3105468750,26,-6.7518334940,-1.7482485607,-7.7517566951,-3.5376796747,,, +26.3125000000,26,-7.5044778738,-2.0196002399,-7.7964079932,-2.9092774524,,, +26.3144531250,26,-7.9448791244,-2.1042888241,-7.4996469992,-2.0355042446,,, +26.3164062500,26,-8.0017389737,-2.0315249053,-6.8304321692,-0.9949640096,,, +26.3183593750,26,-7.6257329999,-1.8368921786,-5.7785769982,0.1273575629,,, +26.3203125000,26,-6.7928888138,-1.5559578466,-4.3560911969,1.2490463375,,, +26.3222656250,26,-5.5073952235,-1.2209161136,-2.5978624981,2.2963706210,,, +26.3242187500,26,-3.8040049999,-0.8612575619,-0.5619339895,3.2063733172,,, +26.3261718750,26,-1.7481005069,-0.5039960479,1.6719059520,3.9286598869,,, +26.3281250000,26,0.5682578374,-0.1733570816,4.0066323120,4.4267409640,,, +26.3300781250,26,3.0326909332,0.1070551376,6.3344750569,4.6764688008,,, +26.3320312500,26,5.5202912988,0.3147430905,8.5437995427,4.6657595716,,, +26.3339843750,26,7.9033657209,0.4347355118,10.5263301512,4.3981576271,,, +26.3359375000,26,10.0601503050,0.4637019741,12.1838604384,3.8947194535,,, +26.3378906250,26,11.8801135792,0.4076494898,13.4333380923,3.1916759701,,, +26.3398437500,26,13.2686862719,0.2791145443,14.2109655807,2.3370310044,,, +26.3417968750,26,14.1537077763,0.0961865976,14.4764337525,1.3870173935,,, +26.3437500000,26,14.4929447905,-0.1187703273,14.2179410298,0.4019252641,,, +26.3457031250,26,14.2817954213,-0.3404086118,13.4578838618,-0.5574430018,,, +26.3476562500,26,13.5578875233,-0.5433996249,12.2560101784,-1.4343806275,,, +26.3496093750,26,12.3979961167,-0.7095098436,10.7052928206,-2.1847811452,,, +26.3515625000,26,10.9084972680,-0.8329430184,8.9215891175,-2.7840123171,,, +26.3535156250,26,9.2138080049,-0.9179535090,7.0320792108,-3.2252632256,,, +26.3554687500,26,7.4434879065,-0.9732984352,5.1630814237,-3.5138956161,,, +26.3574218750,26,5.7188669478,-1.0086564215,3.4274489201,-3.6636805579,,, +26.3593750000,26,4.1429576158,-1.0307764958,1.9155110219,-3.6922114538,,, +26.3613281250,26,2.7944003632,-1.0395209873,0.6906783116,-3.6151074383,,, +26.3632812500,26,1.7237705566,-1.0283615180,-0.2122615280,-3.4440173067,,, +26.3652343750,26,0.9532498121,-0.9876698435,-0.7859022918,-3.1877392207,,, +26.3671875000,26,0.4798369596,-0.9063595334,-1.0462786081,-2.8526594630,,, +26.3691406250,26,0.2783379495,-0.7744478186,-1.0295463511,-2.4447206443,,, +26.3710937500,26,0.3020701724,-0.5873696793,-0.7908792701,-1.9732093512,,, +26.3730468750,26,0.4836952788,-0.3466343099,-0.4031765562,-1.4508422264,,, +26.3750000000,26,0.7396226248,-0.0578805446,0.0479111020,-0.8909098005,,, +26.3769531250,26,0.9788808596,0.2685902037,0.4732931864,-0.3067447132,,, +26.3789062500,26,1.1142384359,0.6174803040,0.7908239991,0.2876600814,,, +26.3808593750,26,1.0727292163,0.9714489354,0.9335808043,0.8783299912,,, +26.3828125000,26,0.8028556093,1.3140271974,0.8545597816,1.4514174816,,, +26.3847656250,26,0.2775276213,1.6313368270,0.5277150322,1.9926529576,,, +26.3867187500,26,-0.5047977781,1.9134556635,-0.0521687006,2.4871964862,,, +26.3886718750,26,-1.5197756683,2.1520706768,-0.8692043434,2.9173291056,,, +26.3906250000,26,-2.7196189894,2.3349573064,-1.8875658792,3.2585100727,,, +26.3925781250,26,-4.0385583379,2.4446505000,-3.0551578295,3.4799873832,,, +26.3945312500,26,-5.4001387599,2.4620323496,-4.3088756719,3.5504820053,,, +26.3964843750,26,-6.7258460365,2.3686496944,-5.5807938065,3.4430678277,,, +26.3984375000,26,-7.9434604001,2.1480693280,-6.8044828300,3.1385909045,,, +26.4003906250,26,-8.9932520428,1.7899838104,-7.9205239633,2.6302064748,,, +26.4023437500,26,-9.8313656899,1.2936568264,-8.8799466530,1.9265146595,,, +26.4042968750,26,-10.4303564148,0.6663901473,-9.6445102356,1.0503647590,,, +26.4062500000,26,-10.7784940456,-0.0791981965,-10.1864400860,0.0357072272,,, +26.4082031250,26,-10.8802825766,-0.9248214385,-10.4911721630,-1.0749051606,,, +26.4101562500,26,-10.7575940951,-1.8458285830,-10.5610400982,-2.2329971092,,, +26.4121093750,26,-10.4477772683,-2.8113259813,-10.4153180621,-3.3867072670,,, +26.4140625000,26,-9.9979286781,-3.7827158499,-10.0866294093,-4.4817835971,,, +26.4160156250,26,-9.4590739914,-4.7132373358,-9.6165836518,-5.4627152066,,, +26.4179687500,26,-8.8817148153,-5.5508527537,-9.0511105929,-6.2751194067,,, +26.4199218750,26,-8.3102605876,-6.2410651525,-8.4344509681,-6.8676364706,,, +26.4218750000,26,-7.7762273605,-6.7291161469,-7.8025563435,-7.1939017939,,, +26.4238281250,26,-7.2932369378,-6.9640731940,-7.1781507680,-7.2163051883,,, +26.4257812500,26,-6.8552864917,-6.9028194699,-6.5684427011,-6.9090351340,,, +26.4277343750,26,-6.4379572445,-6.5127242920,-5.9650896860,-6.2591005060,,, +26.4296875000,26,-6.0030886521,-5.7768644396,-5.3467926829,-5.2690697412,,, +26.4316406250,26,-5.5062959643,-4.7013165196,-4.6843569025,-3.9616357477,,, +26.4335937500,26,-4.9044145916,-3.3189957296,-3.9461981748,-2.3814784019,,, +26.4355468750,26,-4.1618532175,-1.6894224592,-3.1033357574,-0.5938015062,,, +26.4375000000,26,-3.2562187799,0.1039585403,-2.1344801465,1.3185759400,,, +26.4394531250,26,-2.1809135238,1.9610049743,-1.0301718022,3.2602908924,,, +26.4414062500,26,-0.9429291349,3.7762998612,0.2062932757,5.1310353533,,, +26.4433593750,26,0.4415711033,5.4498531107,1.5610185573,6.8336647447,,, +26.4453125000,26,1.9506155454,6.8938775525,3.0122753717,8.2804070354,,, +26.4472656250,26,3.5574072376,8.0352333747,4.5314771311,9.3953205642,,, +26.4492187500,26,5.2283728291,8.8154056121,6.0816184914,10.1145601002,,, +26.4511718750,26,6.9203944643,9.1924896876,7.6157641053,10.3896222694,,, +26.4531250000,26,8.5811386960,9.1465374028,9.0787652898,10.1943038505,,, +26.4550781250,26,10.1521252263,8.6833314951,10.4111549375,9.5296433400,,, +26.4570312500,26,11.5720059834,7.8335551254,11.5530688512,8.4241327850,,, +26.4589843750,26,12.7812925413,6.6502817287,12.4493481462,6.9320391890,,, +26.4609375000,26,13.7287093791,5.2054085613,13.0559224977,5.1303608592,,, +26.4628906250,26,14.3755453223,3.5826423736,13.3444132911,3.1125138292,,, +26.4648437500,26,14.6977798334,1.8701314544,13.3042028933,0.9811313055,,, +26.4667968750,26,14.6883116305,0.1567619601,12.9433426908,-1.1570588613,,, +26.4687500000,26,14.3586231858,-1.4708482187,12.2883457828,-3.1964079358,,, +26.4707031250,26,13.7382213925,-2.9332063480,11.3824941970,-5.0386825977,,, +26.4726562500,26,12.8706199976,-4.1620324690,10.2816620600,-6.5977183074,,, +26.4746093750,26,11.8059324455,-5.1027077184,9.0471876860,-7.8020930181,,, +26.4765625000,26,10.5931370515,-5.7166833972,7.7380558332,-8.5981884642,,, +26.4785156250,26,9.2750649631,-5.9827090576,6.4049533802,-8.9528969217,,, +26.4804687500,26,7.8863838481,-5.8963614467,5.0871127871,-8.8546228444,,, +26.4824218750,26,6.4538425575,-5.4710893288,3.8120008123,-8.3148920954,,, +26.4843750000,26,4.9985056704,-4.7407444787,2.5971550706,-7.3711352328,,, +26.4863281250,26,3.5384457919,-3.7595288155,1.4524068472,-6.0869498051,,, +26.4882812500,26,2.0893266172,-2.5989907457,0.3807816716,-4.5485619333,,, +26.4902343750,26,0.6624884333,-1.3444553571,-0.6218439418,-2.8593785325,,, +26.4921875000,26,-0.7369555582,-0.0898927927,-1.5664198457,-1.1322768954,,, +26.4941406250,26,-2.1097809310,1.0702025514,-2.4684351550,0.5208041351,,, +26.4960937500,26,-3.4608861232,2.0495185372,-3.3448130144,1.9991491629,,, +26.4980468750,26,-4.7971307362,2.7777359245,-4.2111927010,3.2216984052,,, +26.5000000000,26,-6.1234376674,3.2076153069,-5.0788341998,4.1332549634,,, +26.5019531250,26,-7.4373386047,3.3186125006,-5.9510599151,4.7061262897,,, +26.5039062500,26,-8.7246227629,3.1162815641,-6.8207393526,4.9376919026,,, +26.5058593750,26,-9.9568290636,2.6314731613,-7.6689242655,4.8485247761,,, +26.5078125000,26,-11.0905319465,1.9188765607,-8.4643573599,4.4808213816,,, +26.5097656250,26,-12.0708926514,1.0501491461,-9.1661431317,3.8924491106,,, +26.5117187500,26,-12.8395357795,0.1037638719,-9.7301962426,3.1480596881,,, +26.5136718750,26,-13.3415867979,-0.8420075087,-10.1150269067,2.3131126017,,, +26.5156250000,26,-13.5296410995,-1.7132371209,-10.2841126194,1.4513367222,,, +26.5175781250,26,-13.3676020648,-2.4449913162,-10.2075757731,0.6223847250,,, +26.5195312500,26,-12.8345991165,-2.9856880264,-9.8651284898,-0.1215912179,,, +26.5214843750,26,-11.9265696009,-3.3003687348,-9.2487054855,-0.7405040203,,, +26.5234375000,26,-10.6562051712,-3.3739104552,-8.3635527491,-1.2108400879,,, +26.5253906250,26,-9.0528461145,-3.2119981188,-7.2280448423,-1.5264950193,,, +26.5273437500,26,-7.1617371467,-2.8376464183,-5.8726644017,-1.6949044300,,, +26.5292968750,26,-5.0429126874,-2.2871330274,-4.3387892907,-1.7328136408,,, +26.5312500000,26,-2.7709495018,-1.6086858500,-2.6778578727,-1.6643164934,,, +26.5332031250,26,-0.4347383496,-0.8604925450,-0.9506905665,-1.5184039948,,, +26.5351562500,26,1.8644292656,-0.1052780242,0.7738019253,-1.3242790128,,, +26.5371093750,26,4.0172265993,0.5969290620,2.4213134514,-1.1059911075,,, +26.5390625000,26,5.9136754506,1.1965933685,3.9168545816,-0.8775072978,,, +26.5410156250,26,7.4525507996,1.6603236558,5.1910032158,-0.6403162165,,, +26.5429687500,26,8.5502480067,1.9704524853,6.1860669196,-0.3865227833,,, +26.5449218750,26,9.1487257708,2.1213654926,6.8611078884,-0.1054606613,,, +26.5468750000,26,9.2230671100,2.1186120452,7.1951841175,0.2108078049,,, +26.5488281250,26,8.7868318138,1.9794865173,7.1887221918,0.5637836506,,, +26.5507812500,26,7.8931812195,1.7306352885,6.8642547240,0.9459144171,,, +26.5527343750,26,6.6313876020,1.4043513260,6.2661953633,1.3407078159,,, +26.5546875000,26,5.1186523205,1.0361722454,5.4574756875,1.7256255637,,, +26.5566406250,26,3.4879680171,0.6616094885,4.5130465899,2.0747621275,,, +26.5585937500,26,1.8752347264,0.3122970537,3.5125481470,2.3607680525,,, +26.5605468750,26,0.4089453830,0.0148213340,2.5339780713,2.5577707605,,, +26.5625000000,26,-0.7978482433,-0.2094235532,1.6485645834,2.6442371269,,, +26.5644531250,26,-1.6554254202,-0.3457163640,0.9156784882,2.6044245974,,, +26.5664062500,26,-2.1051574058,-0.3871883947,0.3774032585,2.4295626347,,, +26.5683593750,26,-2.1258676848,-0.3360988839,0.0540349768,2.1183789251,,, +26.5703125000,26,-1.7379561518,-0.2067329065,-0.0584537006,1.6757063069,,, +26.5722656250,26,-1.0032645694,-0.0268785013,0.0118926464,1.1110312739,,, +26.5742187500,26,-0.0192350062,0.1649839196,0.2165658338,0.4387680876,,, +26.5761718750,26,1.0905237650,0.3251914747,0.4917820907,-0.3208519845,,, +26.5781250000,26,2.1877290204,0.4121500121,0.7643673224,-1.1405839237,,, +26.5800781250,26,3.1341611505,0.3954620884,0.9597427380,-1.9841162635,,, +26.5820312500,26,3.8083795637,0.2629375707,1.0118811885,-2.8059010197,,, +26.5839843750,26,4.1198129448,0.0214396159,0.8722358289,-3.5554119740,,, +26.5859375000,26,4.0170074631,-0.3065225003,0.5152217360,-4.1832356250,,, +26.5878906250,26,3.4899501967,-0.6877515687,-0.0598731629,-4.6463139943,,, +26.5898437500,26,2.5674460911,-1.0847520030,-0.8299023773,-4.9125534061,,, +26.5917968750,26,1.3108251450,-1.4612665855,-1.7513075150,-4.9633994591,,, +26.5937500000,26,-0.1934313311,-1.7842927397,-2.7647014539,-4.7930478486,,, +26.5957031250,26,-1.8403588300,-2.0246891519,-3.7993345715,-4.4068710023,,, +26.5976562500,26,-3.5131383930,-2.1586179591,-4.7778040994,-3.8209726683,,, +26.5996093750,26,-5.0899555315,-2.1685960724,-5.6213953696,-3.0617743398,,, +26.6015625000,26,-6.4505788336,-2.0440282483,-6.2555190254,-2.1654624646,,, +26.6035156250,26,-7.4833537218,-1.7823094117,-6.6150122217,-1.1774124104,,, +26.6054687500,26,-8.0934283073,-1.3896235852,-6.6494767407,-0.1500255497,,, +26.6074218750,26,-8.2115696278,-0.8808349687,-6.3283407147,0.8612708962,,, +26.6093750000,26,-7.8018147266,-0.2792475112,-5.6447276518,1.8021553008,,, +26.6113281250,26,-6.8664712337,0.3846235337,-4.6176564408,2.6234733222,,, +26.6132812500,26,-5.4482216811,1.0764150489,-3.2926771345,3.2860612591,,, +26.6152343750,26,-3.6290595938,1.7615754066,-1.7402747653,3.7649469165,,, +26.6171875000,26,-1.5246241658,2.4070749283,-0.0505628007,4.0507943434,,, +26.6191406250,26,0.7263708904,2.9818906348,1.6754780046,4.1487654462,,, +26.6210937500,26,2.9750725451,3.4583109350,3.3350684544,4.0760548157,,, +26.6230468750,26,5.0756849602,3.8143223109,4.8313249086,3.8586757576,,, +26.6250000000,26,6.8994042948,4.0363874609,6.0814574080,3.5284246619,,, +26.6269531250,26,8.3478587626,4.1217040433,7.0253286055,3.1203378873,,, +26.6289062500,26,9.3613327804,4.0768371598,7.6308190528,2.6686024806,,, +26.6308593750,26,9.9188944768,3.9117836100,7.8940819955,2.2008662868,,, +26.6328125000,26,10.0324339940,3.6348631341,7.8354495062,1.7350018254,,, +26.6347656250,26,9.7382369386,3.2522340412,7.4927449717,1.2801776730,,, +26.6367187500,26,9.0880878961,2.7695237150,6.9142184367,0.8400840743,,, +26.6386718750,26,8.1413340186,2.1940479250,6.1526125915,0.4169979009,,, +26.6406250000,26,6.9597401353,1.5385662982,5.2605928768,0.0159983525,,, +26.6425781250,26,5.6052947782,0.8244047003,4.2875892699,-0.3529512504,,, +26.6445312500,26,4.1392482811,0.0814925228,3.2780864872,-0.6757008653,,, +26.6464843750,26,2.6208599130,-0.6537929905,2.2705918719,-0.9357920243,,, +26.6484375000,26,1.1051420249,-1.3430652048,1.2967214150,-1.1174910229,,, +26.6503906250,26,-0.3597971600,-1.9523435406,0.3810286400,-1.2096341415,,, +26.6523437500,26,-1.7343910088,-2.4561021226,-0.4585157954,-1.2075370641,,, +26.6542968750,26,-2.9886510425,-2.8376307545,-1.2108583458,-1.1127686869,,, +26.6562500000,26,-4.1034617819,-3.0896496493,-1.8729237339,-0.9337000871,,, +26.6582031250,26,-5.0703721745,-3.2155614889,-2.4492723512,-0.6867131054,,, +26.6601562500,26,-5.8884513803,-3.2277438611,-2.9496146124,-0.3951356959,,, +26.6621093750,26,-6.5592257784,-3.1431440059,-3.3850039970,-0.0860013366,,, +26.6640625000,26,-7.0811217343,-2.9798607063,-3.7631505042,0.2126761255,,, +26.6660156250,26,-7.4454521515,-2.7557289550,-4.0845201890,0.4734231913,,, +26.6679687500,26,-7.6363053599,-2.4885418682,-4.3414640305,0.6699847288,,, +26.6699218750,26,-7.6342977597,-2.1982125586,-4.5199678864,0.7771966023,,, +26.6718750000,26,-7.4220512577,-1.9081365854,-4.6027459817,0.7719359144,,, +26.6738281250,26,-6.9896423337,-1.6429746708,-4.5733821036,0.6364780245,,, +26.6757812500,26,-6.3391063602,-1.4251546794,-4.4203908163,0.3622753623,,, +26.6777343750,26,-5.4870303881,-1.2722899026,-4.1397238621,-0.0474608546,,, +26.6796875000,26,-4.4642755468,-1.1944584238,-3.7356102821,-0.5762231775,,, +26.6816406250,26,-3.3130588360,-1.1918610082,-3.2202578780,-1.1945453054,,, +26.6835937500,26,-2.0830348368,-1.2547811039,-2.6128593566,-1.8628728381,,, +26.6855468750,26,-0.8281155393,-1.3657889521,-1.9385880381,-2.5358404012,,, +26.6875000000,26,0.3953268922,-1.5034016224,-1.2280015449,-3.1669966745,,, +26.6894531250,26,1.5297782743,-1.6453170122,-0.5164723058,-3.7127117957,,, +26.6914062500,26,2.5190754720,-1.7687612481,0.1571093051,-4.1337643616,,, +26.6933593750,26,3.3131243373,-1.8499053268,0.7534142069,-4.3964507446,,, +26.6953125000,26,3.8734819964,-1.8661129654,1.2373521109,-4.4756823302,,, +26.6972656250,26,4.1756412579,-1.7990816727,1.5809794117,-4.3574455973,,, +26.6992187500,26,4.2071289231,-1.6344984584,1.7627376294,-4.0373617850,,, +26.7011718750,26,3.9667227506,-1.3598792606,1.7671390165,-3.5180325786,,, +26.7031250000,26,3.4674536147,-0.9655149333,1.5882580971,-2.8092680470,,, +26.7050781250,26,2.7399511850,-0.4481815572,1.2340305342,-1.9305865357,,, +26.7070312500,26,1.8336214466,0.1860217297,0.7279661095,-0.9134067687,,, +26.7089843750,26,0.8155157959,0.9202052093,0.1086094649,0.1980805809,,, +26.7109375000,26,-0.2337224652,1.7261154853,-0.5725413978,1.3482635091,,, +26.7128906250,26,-1.2269047213,2.5661101304,-1.2551266454,2.4748987992,,, +26.7148437500,26,-2.0790224896,3.3972848221,-1.8756681792,3.5159904894,,, +26.7167968750,26,-2.7162288924,4.1743355917,-2.3736433663,4.4153065502,,, +26.7187500000,26,-3.0838094918,4.8506077624,-2.6972458531,5.1253957825,,, +26.7207031250,26,-3.1513077200,5.3801337679,-2.8084016364,5.6095090517,,, +26.7226562500,26,-2.9136463434,5.7211020703,-2.6858674657,5.8429301218,,, +26.7246093750,26,-2.3894063552,5.8388357446,-2.3259135961,5.8135035697,,, +26.7265625000,26,-1.6176339172,5.7088845127,-1.7416773930,5.5222019344,,, +26.7285156250,26,-0.6530718528,5.3214825424,-0.9620724813,4.9839233206,,, +26.7304687500,26,0.4396924814,4.6845929179,-0.0296089547,4.2269198019,,, +26.7324218750,26,1.5920666295,3.8230956587,1.0035313559,3.2902285300,,, +26.7343750000,26,2.7364271028,2.7764927958,2.0799404639,2.2210352167,,, +26.7363281250,26,3.8087224337,1.5974153106,3.1400348687,1.0737580450,,, +26.7382812500,26,4.7487552398,0.3501014707,4.1236036691,-0.0901107153,,, +26.7402343750,26,5.5002755855,-0.8926786795,4.9709032602,-1.2039807072,,, +26.7421875000,26,6.0123218141,-2.0558351287,5.6246249587,-2.2016230253,,, +26.7441406250,26,6.2428413685,-3.0712106741,6.0346075566,-3.0250869401,,, +26.7460937500,26,6.1643470696,-3.8856478175,6.1645843736,-3.6313391969,,, +26.7480468750,26,5.7689603767,-4.4640578117,5.9973397947,-3.9949922025,,, +26.7500000000,26,5.0707812941,-4.7890737282,5.5367852711,-4.1082170312,,, +26.7519531250,26,4.1053095823,-4.8596392144,4.8076753013,-3.9791249066,,, +26.7539062500,26,2.9260309219,-4.6885733111,3.8530793223,-3.6286097628,,, +26.7558593750,26,1.5988886077,-4.3004473962,2.7301009923,-3.0871945615,,, +26.7578125000,26,0.1961055405,-3.7301061129,1.5046863940,-2.3928239270,,, +26.7597656250,26,-1.2093978719,-3.0194116063,0.2458036376,-1.5881441577,,, +26.7617187500,26,-2.5478538437,-2.2129882717,-0.9796708275,-0.7177810024,,, +26.7636718750,26,-3.7542960930,-1.3562173924,-2.1096547210,0.1724659533,,, +26.7656250000,26,-4.7694234795,-0.4948539131,-3.0879781853,1.0357260219,,, +26.7675781250,26,-5.5417118725,0.3259761802,-3.8661121875,1.8254494820,,, +26.7695312500,26,-6.0313803692,1.0627859085,-4.4059773690,2.4975476018,,, +26.7714843750,26,-6.2146995829,1.6745357687,-4.6827356816,3.0126517786,,, +26.7734375000,26,-6.0860643130,2.1247956395,-4.6863279845,3.3387529444,,, +26.7753906250,26,-5.6575301713,2.3844331266,-4.4214106344,3.4534834539,,, +26.7773437500,26,-4.9580747170,2.4332466094,-3.9068644624,3.3455178627,,, +26.7792968750,26,-4.0323985766,2.2626524351,-3.1757052692,3.0161640121,,, +26.7812500000,26,-2.9371231969,1.8803363017,-2.2742900234,2.4810659028,,, +26.7832031250,26,-1.7352154477,1.3123064625,-1.2593962807,1.7697638332,,, +26.7851562500,26,-0.4903848311,0.6005045792,-0.1933852224,0.9227877949,,, +26.7871093750,26,0.7380377448,-0.2002933375,0.8607047362,-0.0114126229,,, +26.7890625000,26,1.8980320487,-1.0256908104,1.8426327929,-0.9789691000,,, +26.7910156250,26,2.9444795034,-1.8068599887,2.6970575179,-1.9231746930,,, +26.7929687500,26,3.8374547207,-2.4758986129,3.3748600158,-2.7867769351,,, +26.7949218750,26,4.5414385306,-2.9702037980,3.8344653179,-3.5142529914,,, +26.7968750000,26,5.0257673040,-3.2376739027,4.0441061543,-4.0551872956,,, +26.7988281250,26,5.2666900409,-3.2417702143,3.9849935012,-4.3681639295,,, +26.8007812500,26,5.2514840190,-2.9641423424,3.6544908382,-4.4242540326,,, +26.8027343750,26,4.9831408186,-2.4061917087,3.0685432206,-4.2107731759,,, +26.8046875000,26,4.4828693635,-1.5909565030,2.2624270023,-3.7349275055,,, +26.8066406250,26,3.7891574376,-0.5634858832,1.2888615143,-3.0252478418,,, +26.8085937500,26,2.9543638646,0.6116977150,0.2138136162,-2.1300232455,,, +26.8105468750,26,2.0396465484,1.8553080098,-0.8890486143,-1.1132921161,,, +26.8125000000,26,1.1073663160,3.0796297823,-1.9454160874,-0.0482551887,,, +26.8144531250,26,0.2116957344,4.1959675363,-2.8883624158,0.9912324025,,, +26.8164062500,26,-0.6081806221,5.1208182587,-3.6640979564,1.9376846704,,, +26.8183593750,26,-1.3292589588,5.7799215909,-4.2336885294,2.7334967932,,, +26.8203125000,26,-1.9416787003,6.1134000592,-4.5729597717,3.3332252462,,, +26.8222656250,26,-2.4440551954,6.0828748869,-4.6724253696,3.7061984773,,, +26.8242187500,26,-2.8391477814,5.6772809739,-4.5370156954,3.8383623520,,, +26.8261718750,26,-3.1306680283,4.9156757702,-4.1851846601,3.7329009980,,, +26.8281250000,26,-3.3209537879,3.8465962002,-3.6469038991,3.4094162136,,, +26.8300781250,26,-3.4098942499,2.5436390730,-2.9609030662,2.9013206944,,, +26.8320312500,26,-3.3957998436,1.0989577134,-2.1724376077,2.2524911388,,, +26.8339843750,26,-3.2776196469,-0.3846879916,-1.3311196780,1.5137302442,,, +26.8359375000,26,-3.0575890548,-1.8043284735,-0.4874932083,0.7385061218,,, +26.8378906250,26,-2.7440271496,-3.0669606930,0.3104424562,-0.0208951398,,, +26.8398437500,26,-2.3535724252,-4.0957831750,1.0191070084,-0.7155013593,,, +26.8417968750,26,-1.9115212862,-4.8338277135,1.6007815481,-1.3015149384,,, +26.8437500000,26,-1.4494851404,-5.2471815440,2.0260485580,-1.7433877723,,, +26.8457031250,26,-1.0012957176,-5.3266130575,2.2763469409,-2.0169103651,,, +26.8476562500,26,-0.5987883872,-5.0870062258,2.3456832666,-2.1111012500,,, +26.8496093750,26,-0.2676898920,-4.5659850402,2.2419645081,-2.0295757989,,, +26.8515625000,26,-0.0237289430,-3.8215040720,1.9877476093,-1.7912479880,,, +26.8535156250,26,0.1288778200,-2.9268518638,1.6186200860,-1.4285109559,,, +26.8554687500,26,0.1941552720,-1.9640423781,1.1782245792,-0.9825189701,,, +26.8574218750,26,0.1780593897,-1.0174163957,0.7115800691,-0.4974266616,,, +26.8593750000,26,0.0843761478,-0.1664141920,0.2592767708,-0.0150665009,,, +26.8613281250,26,-0.0847987647,0.5228423798,-0.1462037747,0.4292583944,,, +26.8632812500,26,-0.3255598271,1.0046371936,-0.4819003920,0.8090251533,,, +26.8652343750,26,-0.6277879567,1.2578212979,-0.7340371785,1.1067260746,,, +26.8671875000,26,-0.9718246170,1.2865733760,-0.8966604843,1.3128132713,,, +26.8691406250,26,-1.3276492507,1.1168876393,-0.9693911083,1.4237264770,,, +26.8710937500,26,-1.6566853022,0.7899047509,-0.9548047724,1.4397137356,,, +26.8730468750,26,-1.9158234872,0.3554014315,-0.8569801321,1.3637827620,,, +26.8750000000,26,-2.0632761395,-0.1331992441,-0.6819325661,1.2020280056,,, +26.8769531250,26,-2.0650306786,-0.6234136066,-0.4387577828,0.9642083649,,, +26.8789062500,26,-1.9000350659,-1.0672335068,-0.1405917964,0.6643092127,,, +26.8808593750,26,-1.5628058108,-1.4217557619,0.1944682021,0.3215181420,,, +26.8828125000,26,-1.0631540125,-1.6487991033,0.5433841571,-0.0396590787,,, +26.8847656250,26,-0.4239102635,-1.7166704441,0.8800858587,-0.3914722085,,, +26.8867187500,26,0.3224567439,-1.6028866490,1.1782884853,-0.7061128252,,, +26.8886718750,26,1.1375188168,-1.2958300149,1.4139339442,-0.9585107041,,, +26.8906250000,26,1.9794256686,-0.7961181460,1.5669583135,-1.1284215274,,, +26.8925781250,26,2.8040959220,-0.1177908406,1.6224126129,-1.2016763101,,, +26.8945312500,26,3.5662558307,0.7115769250,1.5711578391,-1.1706368225,,, +26.8964843750,26,4.2210666981,1.6514957092,1.4105582829,-1.0344868393,,, +26.8984375000,26,4.7263291774,2.6500488615,1.1449618838,-0.7994274139,,, +26.9003906250,26,5.0452400805,3.6467260435,0.7857195562,-0.4785217978,,, +26.9023437500,26,5.1501813778,4.5752292761,0.3517261586,-0.0920341467,,, +26.9042968750,26,5.0271543185,5.3659649071,-0.1295279201,0.3318151681,,, +26.9062500000,26,4.6791609177,5.9512005846,-0.6227130459,0.7579606604,,, +26.9082031250,26,4.1273631471,6.2733615546,-1.0880929829,1.1482047672,,, +26.9101562500,26,3.4096081869,6.2920159434,-1.4857105716,1.4654304925,,, +26.9121093750,26,2.5762330115,5.9871585170,-1.7792251161,1.6771174093,,, +26.9140625000,26,1.6839234891,5.3603092269,-1.9397416869,1.7585714321,,, +26.9160156250,26,0.7898233545,4.4333030679,-1.9483498158,1.6949017614,,, +26.9179687500,26,-0.0520179035,3.2441049014,-1.7958495664,1.4805861233,,, +26.9199218750,26,-0.7930142940,1.8429538217,-1.4819420498,1.1187527111,,, +26.9218750000,26,-1.3931665615,0.2915025221,-1.0163877139,0.6221964009,,, +26.9238281250,26,-1.8231277028,-1.3385304686,-0.4195152952,0.0135296912,,, +26.9257812500,26,-2.0634947023,-2.9706999084,0.2806978311,-0.6778948051,,, +26.9277343750,26,-2.1034501883,-4.5306304130,1.0527084063,-1.4199818539,,, +26.9296875000,26,-1.9409451118,-5.9504477882,1.8635237595,-2.1800230122,,, +26.9316406250,26,-1.5846108898,-7.1700862566,2.6782932902,-2.9245796328,,, +26.9335937500,26,-1.0563780926,-8.1369038153,3.4586860025,-3.6182152276,,, +26.9355468750,26,-0.3929558454,-8.8064813168,4.1625162701,-4.2232547167,,, +26.9375000000,26,0.3545997263,-9.1458728291,4.7456247842,-4.7015713575,,, +26.9394531250,26,1.1227978344,-9.1363615395,5.1643015773,-5.0167676139,,, +26.9414062500,26,1.8399031022,-8.7737015994,5.3776864373,-5.1360724986,,, +26.9433593750,26,2.4334297454,-8.0680084781,5.3517607544,-5.0334843741,,, +26.9453125000,26,2.8391459782,-7.0440568365,5.0643228136,-4.6937903181,,, +26.9472656250,26,3.0085006415,-5.7403977159,4.5085033426,-4.1153419984,,, +26.9492187500,26,2.9129834236,-4.2077635637,3.6942846598,-3.3111541730,,, +26.9511718750,26,2.5455222124,-2.5073177673,2.6483857207,-2.3086198214,,, +26.9531250000,26,1.9200810468,-0.7077156221,1.4126244396,-1.1478275150,,, +26.9550781250,26,1.0703898206,1.1177025231,0.0418758459,0.1204232878,,, +26.9570312500,26,0.0470462841,2.8912217338,-1.3976410958,1.4360214747,,, +26.9589843750,26,-1.0878765328,4.5312430817,-2.8315356056,2.7320728632,,, +26.9609375000,26,-2.2670367118,5.9574024127,-4.1831558801,3.9400861111,,, +26.9628906250,26,-3.4223310935,7.0986585480,-5.3800578856,4.9959190928,,, +26.9648437500,26,-4.4875717561,7.8999589957,-6.3587883819,5.8442262441,,, +26.9667968750,26,-5.4006204291,8.3264702320,-7.0681723581,6.4414511021,,, +26.9687500000,26,-6.1062469320,8.3657346628,-7.4719563348,6.7580945400,,, +26.9707031250,26,-6.5604367791,8.0284510514,-7.5515385237,6.7809214296,,, +26.9726562500,26,-6.7348524027,7.3491070242,-7.3087008936,6.5151648200,,, +26.9746093750,26,-6.6191619474,6.3847324319,-6.7662501832,5.9848892414,,, +26.9765625000,26,-6.2212213819,5.2090263011,-5.9651893260,5.2301396221,,, +26.9785156250,26,-5.5673051006,3.9042215827,-4.9607815802,4.3029881708,,, +26.9804687500,26,-4.7027836728,2.5549644381,-3.8198575068,3.2647770024,,, +26.9824218750,26,-3.6901214385,1.2437152075,-2.6174298653,2.1829832522,,, +26.9843750000,26,-2.6017779499,0.0456344665,-1.4302930943,1.1256693171,,, +26.9863281250,26,-1.5099874351,-0.9755224737,-0.3294373871,0.1551120645,,, +26.9882812500,26,-0.4775657954,-1.7692295226,0.6258403652,-0.6769979781,,, +26.9902343750,26,0.4474819826,-2.2997971651,1.3916617413,-1.3326373080,,, +26.9921875000,26,1.2329370046,-2.5489812115,1.9414045535,-1.7891527767,,, +26.9941406250,26,1.8597436525,-2.5182354169,2.2654172336,-2.0392614374,,, +26.9960937500,26,2.3180184816,-2.2293472999,2.3691844211,-2.0896670885,,, +26.9980468750,26,2.6045157335,-1.7229929330,2.2712392268,-1.9592606800,,, +27.0000000000,27,2.7226073242,-1.0552046436,2.0014180685,-1.6773206042,33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000:10.0000000000:11.0000000000:12.0000000000:13.0000000000:14.0000000000:15.0000000000:19.0000000000:20.0000000000:21.0000000000:22.0000000000:23.0000000000:24.0000000000:25.0000000000:26.0000000000:27.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +27.0019531250,27,2.6835736054,-0.2933769484,1.5995320333,-1.2821023264,,, +27.0039062500,27,2.5077042635,0.4865197258,1.1145297216,-0.8199655000,,, +27.0058593750,27,2.2241781420,1.2033993681,0.6027290810,-0.3435764757,,, +27.0078125000,27,1.8693795119,1.7780672004,0.1234061200,0.0922896428,,, +27.0097656250,27,1.4844976689,2.1417452589,-0.2667637135,0.4360051013,,, +27.0117187500,27,1.1131827468,2.2424850631,-0.5181782966,0.6432709590,,, +27.0136718750,27,0.7987940656,2.0498529866,-0.5921397852,0.6806116647,,, +27.0156250000,27,0.5806718994,1.5578266639,-0.4643212844,0.5283928600,,, +27.0175781250,27,0.4900607895,0.7847078485,-0.1269320831,0.1825026788,,, +27.0195312500,27,0.5466070762,-0.2275356274,0.4097122402,-0.3444948766,,, +27.0214843750,27,0.7558894881,-1.4135457483,1.1159868963,-1.0224550612,,, +27.0234375000,27,1.1086783959,-2.6880047308,1.9442669880,-1.8050479589,,, +27.0253906250,27,1.5824830130,-3.9532774289,2.8335809932,-2.6342159904,,, +27.0273437500,27,2.1448901408,-5.1086055314,3.7160110392,-3.4461601820,,, +27.0292968750,27,2.7571228378,-6.0594190653,4.5232725073,-4.1774763508,,, +27.0312500000,27,3.3759986511,-6.7263276943,5.1922686656,-4.7704530309,,, +27.0332031250,27,3.9541399070,-7.0519686082,5.6686286270,-5.1765629859,,, +27.0351562500,27,4.4405256547,-7.0052946345,5.9091518842,-5.3588260815,,, +27.0371093750,27,4.7834122266,-6.5847756979,5.8849941308,-5.2946330635,,, +27.0390625000,27,4.9355960237,-5.8187843092,5.5847155906,-4.9781596345,,, +27.0410156250,27,4.8607282264,-4.7609309473,5.0153752265,-4.4207152965,,, +27.0429687500,27,4.5393238471,-3.4838129013,4.2026670508,-3.6501736484,,, +27.0449218750,27,3.9729575099,-2.0743066256,3.1908469903,-2.7104013836,,, +27.0468750000,27,3.1855738528,-0.6280375093,2.0406850327,-1.6590580101,,, +27.0488281250,27,2.2219782885,0.7578416824,0.8250421627,-0.5633640464,,, +27.0507812500,27,1.1438894104,1.9913494010,-0.3766148154,0.5049001676,,, +27.0527343750,27,0.0234251820,2.9922133331,-1.4850122716,1.4753980603,,, +27.0546875000,27,-1.0654660896,3.6992677634,-2.4294171312,2.2865320575,,, +27.0566406250,27,-2.0551837734,4.0769178056,-3.1553100553,2.8921058315,,, +27.0585937500,27,-2.8900115306,4.1187760320,-3.6292153843,3.2654625459,,, +27.0605468750,27,-3.5291398901,3.8482374682,-3.8406384266,3.4010379984,,, +27.0625000000,27,-3.9480321388,3.3161836710,-3.8016692346,3.3137868063,,, +27.0644531250,27,-4.1386716430,2.5960510413,-3.5446606278,3.0368274025,,, +27.0664062500,27,-4.1095338813,1.7770561556,-3.1188326736,2.6180575060,,, +27.0683593750,27,-3.8850341001,0.9561279535,-2.5859424272,2.1159089736,,, +27.0703125000,27,-3.5029950855,0.2282423784,-2.0140755934,1.5934773797,,, +27.0722656250,27,-3.0107504076,-0.3237276931,-1.4704499814,1.1118395577,,, +27.0742187500,27,-2.4620038755,-0.6366554231,-1.0158802379,0.7249386397,,, +27.0761718750,27,-1.9141692570,-0.6716684407,-0.7010696436,0.4762301704,,, +27.0781250000,27,-1.4243297869,-0.4171968185,-0.5628808350,0.3954732446,,, +27.0800781250,27,-1.0437629427,0.1103553032,-0.6210154130,0.4960972625,,, +27.0820312500,27,-0.8129060867,0.8695474525,-0.8767405179,0.7745454597,,, +27.0839843750,27,-0.7578544760,1.7986829304,-1.3133707697,1.2111785005,,, +27.0859375000,27,-0.8874938894,2.8213746413,-1.8974886599,1.7718353384,,, +27.0878906250,27,-1.1908182244,3.8524305049,-2.5804259568,2.4096301905,,, +27.0898437500,27,-1.6360023863,4.8028404072,-3.3002497001,3.0670430630,,, +27.0917968750,27,-2.1728879956,5.5854042011,-3.9859273351,3.6797637522,,, +27.0937500000,27,-2.7391016385,6.1226935322,-4.5646417229,4.1832184773,,, +27.0957031250,27,-3.2686477882,6.3545814974,-4.9702414042,4.5199189022,,, +27.0976562500,27,-3.7010154504,6.2428905307,-5.1505324134,4.6455927736,,, +27.0996093750,27,-3.9886403333,5.7745808593,-5.0729515839,4.5338916657,,, +27.1015625000,27,-4.1004044558,4.9639689054,-4.7276037885,4.1789441694,,, +27.1035156250,27,-4.0204941136,3.8521672775,-4.1263811177,3.5945778631,,, +27.1054687500,27,-3.7452304841,2.5040183528,-3.2997179829,2.8114497425,,, +27.1074218750,27,-3.2807538149,1.0034964778,-2.2930376412,1.8737818068,,, +27.1093750000,27,-2.6416480163,-0.5539180493,-1.1621855615,0.8349977425,,, +27.1113281250,27,-1.8497642887,-2.0711000987,0.0321573148,-0.2476571488,,, +27.1132812500,27,-0.9334255953,-3.4574545419,1.2290146279,-1.3174944158,,, +27.1152343750,27,0.0731561369,-4.6351366061,2.3705642822,-2.3216978063,,, +27.1171875000,27,1.1307650030,-5.5451759820,3.4057096275,-3.2147131658,,, +27.1191406250,27,2.1963943572,-6.1518616359,4.2929578575,-3.9609138814,,, +27.1210937500,27,3.2245495041,-6.4433106034,5.0014278218,-4.5354182820,,, +27.1230468750,27,4.1695164025,-6.4292349464,5.5109723967,-4.9239308504,,, +27.1250000000,27,4.9903757650,-6.1373841534,5.8131306945,-5.1230824063,,, +27.1269531250,27,5.6575815168,-5.6093506704,5.9126155733,-5.1411099284,,, +27.1289062500,27,6.1568609096,-4.8972338142,5.8277742810,-4.9978343833,,, +27.1308593750,27,6.4879751983,-4.0615978854,5.5888951277,-4.7231226949,,, +27.1328125000,27,6.6596749528,-3.1684926874,5.2339605212,-4.3532953746,,, +27.1347656250,27,6.6841876611,-2.2848031278,4.8032975032,-3.9265186728,,, +27.1367187500,27,6.5735734884,-1.4736647441,4.3352779139,-3.4790156443,,, +27.1386718750,27,6.3379013114,-0.7900602243,3.8631016831,-3.0421312824,,, +27.1406250000,27,5.9846346826,-0.2761006241,3.4120784673,-2.6397524215,,, +27.1425781250,27,5.5195245813,0.0424292687,2.9983646619,-2.2869868088,,, +27.1445312500,27,4.9488243586,0.1575633205,2.6294091337,-1.9903661343,,, +27.1464843750,27,4.2813762472,0.0805489329,2.3043772931,-1.7480439420,,, +27.1484375000,27,3.5299394002,-0.1571106415,2.0143391610,-1.5498491025,,, +27.1503906250,27,2.7123363529,-0.5062782511,1.7442116817,-1.3790641966,,, +27.1523437500,27,1.8516940426,-0.9066912378,1.4761760676,-1.2157312200,,, +27.1542968750,27,0.9742636733,-1.2944936162,1.1922947508,-1.0394421841,,, +27.1562500000,27,0.1053368724,-1.6096855855,0.8760461347,-0.8312920231,,, +27.1582031250,27,-0.7345590424,-1.8023723582,0.5134028202,-0.5753598416,,, +27.1601562500,27,-1.5315542036,-1.8361826475,0.0935252949,-0.2595972067,,, +27.1621093750,27,-2.2782392673,-1.6905729404,-0.3899611537,0.1229603441,,, +27.1640625000,27,-2.9721056468,-1.3634461003,-0.9367821583,0.5722600092,,, +27.1660156250,27,-3.6130391488,-0.8710000492,-1.5387099139,1.0802670477,,, +27.1679687500,27,-4.1998354411,-0.2431114255,-2.1799794258,1.6317881474,,, +27.1699218750,27,-4.7265759237,0.4818416207,-2.8379115683,2.2055125530,,, +27.1718750000,27,-5.1809354545,1.2595834195,-3.4832929957,2.7745948652,,, +27.1738281250,27,-5.5459805574,2.0423531595,-4.0825759043,3.3085965576,,, +27.1757812500,27,-5.8051338839,2.7831592065,-4.6027561792,3.7776433384,,, +27.1777343750,27,-5.9481780302,3.4401486304,-5.0168909288,4.1570621615,,, +27.1796875000,27,-5.9752277058,3.9798728914,-5.3079480544,4.4306244410,,, +27.1816406250,27,-5.8965764387,4.3790345651,-5.4696238048,4.5913238625,,, +27.1835937500,27,-5.7288058486,4.6240186016,-5.5039842876,4.6395124382,,, +27.1855468750,27,-5.4895699930,4.7097333897,-5.4180236081,4.5801520386,,, +27.1875000000,27,-5.1933739131,4.6397890932,-5.2214397923,4.4211412712,,, +27.1894531250,27,-4.8492896302,4.4266946447,-4.9254807879,4.1724610367,,, +27.1914062500,27,-4.4608501737,4.0903162890,-4.5421018402,3.8453771944,,, +27.1933593750,27,-4.0275788106,3.6558005270,-4.0837482837,3.4520621360,,, +27.1953125000,27,-3.5469306467,3.1516155540,-3.5634289819,3.0054422972,,, +27.1972656250,27,-3.0161548329,2.6067707083,-2.9943333189,2.5186059059,,, +27.1992187500,27,-2.4340717070,2.0487832155,-2.3897801380,2.0045419955,,, +27.2011718750,27,-1.8021404655,1.5041206557,-1.7640302753,1.4768000430,,, +27.2031250000,27,-1.1241255761,0.9987101700,-1.1323609220,0.9496014014,,, +27.2050781250,27,-0.4047021921,0.5563136362,-0.5094726773,0.4364650929,,, +27.2070312500,27,0.3518140847,0.1960612986,0.0924652706,-0.0515240902,,, +27.2089843750,27,1.1418427346,-0.0700653568,0.6653119995,-0.5070928887,,, +27.2109375000,27,1.9616761502,-0.2403198448,1.2060671661,-0.9279146771,,, +27.2128906250,27,2.8046349750,-0.3255273143,1.7165062813,-1.3165594647,,, +27.2148437500,27,3.6566350513,-0.3486983121,2.2005429514,-1.6784662582,,, +27.2167968750,27,4.4928018593,-0.3418663104,2.6607467406,-2.0190011513,,, +27.2187500000,27,5.2778176355,-0.3408823963,3.0958777254,-2.3410648770,,, +27.2207031250,27,5.9700316638,-0.3787280556,3.4997393766,-2.6435371369,,, +27.2226562500,27,6.5269112515,-0.4801444351,3.8614366843,-2.9209231312,,, +27.2246093750,27,6.9110729308,-0.6610622327,4.1684072131,-3.1655769187,,, +27.2265625000,27,7.0973953457,-0.9299681736,4.4110512958,-3.3713031256,,, +27.2285156250,27,7.0783782728,-1.2863960921,4.5849313504,-3.5348277378,,, +27.2304687500,27,6.8645166171,-1.7191798412,4.6900930756,-3.6550955312,,, +27.2324218750,27,6.4801674959,-2.2072200553,4.7291750984,-3.7319346281,,, +27.2343750000,27,5.9571739075,-2.7203242142,4.7043037058,-3.7638418459,,, +27.2363281250,27,5.3284053187,-3.2205466216,4.6141887041,-3.7459848366,,, +27.2382812500,27,4.6228378060,-3.6661625522,4.4534233323,-3.6701154355,,, +27.2402343750,27,3.8630251417,-4.0162362944,4.2134187564,-3.5257504594,,, +27.2421875000,27,3.0652687853,-4.2341000149,3.8842779796,-3.3019329363,,, +27.2441406250,27,2.2423562185,-4.2908663040,3.4581148366,-2.9900625743,,, +27.2460937500,27,1.4073439128,-4.1686368604,2.9328090870,-2.5869967423,,, +27.2480468750,27,0.5756670540,-3.8625967054,2.3142757904,-2.0969101378,,, +27.2500000000,27,-0.2354164186,-3.3830417619,1.6172266538,-1.5320218406,,, +27.2519531250,27,-1.0087467755,-2.7568392449,0.8648815075,-0.9124878435,,, +27.2539062500,27,-1.7294690421,-2.0258834846,0.0869730032,-0.2647259745,,, +27.2558593750,27,-2.3872309401,-1.2426565803,-0.6837444758,0.3816451005,,, +27.2578125000,27,-2.9778945928,-0.4647334042,-1.4152737425,0.9971639629,,, +27.2597656250,27,-3.5038549503,0.2520264436,-2.0800647984,1.5559388014,,, +27.2617187500,27,-3.9720681283,0.8610466417,-2.6578287146,2.0384827640,,, +27.2636718750,27,-4.3899352211,1.3296737523,-3.1356535725,2.4322535792,,, +27.2656250000,27,-4.7607716854,1.6399377800,-3.5058912983,2.7301507089,,, +27.2675781250,27,-5.0810147097,1.7884493776,-3.7645684648,2.9293057921,,, +27.2695312500,27,-5.3395994836,1.7857376580,-3.9107163875,3.0304905510,,, +27.2714843750,27,-5.5186683569,1.6532905022,-3.9452511821,3.0369687169,,, +27.2734375000,27,-5.5960386421,1.4198204416,-3.8704285710,2.9536986932,,, +27.2753906250,27,-5.5498666512,1.1187151482,-3.6911386996,2.7880003806,,, +27.2773437500,27,-5.3638674945,0.7856709762,-3.4166094738,2.5505333505,,, +27.2792968750,27,-5.0312092430,0.4559716712,-3.0611833987,2.2555664956,,, +27.2812500000,27,-4.5559595159,0.1624227404,-2.6440625842,1.9205691376,,, +27.2832031250,27,-3.9515496860,-0.0664397282,-2.1875282760,1.5647202284,,, +27.2851562500,27,-3.2378790573,-0.2082480485,-1.7143418262,1.2068143930,,, +27.2871093750,27,-2.4394580039,-0.2476764125,-1.2462510791,0.8640894830,,, +27.2890625000,27,-1.5841236327,-0.1771165157,-0.8029077576,0.5513929052,,, +27.2910156250,27,-0.7008309016,0.0013722303,-0.3995941386,0.2793721620,,, +27.2929687500,27,0.1822281860,0.2749948379,-0.0455893327,0.0532234481,,, +27.2949218750,27,1.0376842151,0.6208791986,0.2555375190,-0.1270029503,,, +27.2968750000,27,1.8385522838,1.0058204084,0.5058192634,-0.2663429502,,, +27.2988281250,27,2.5585663019,1.3875342616,0.7124307963,-0.3744505243,,, +27.3007812500,27,3.1729239102,1.7222497909,0.8841663875,-0.4622607364,,, +27.3027343750,27,3.6598008853,1.9748503643,1.0270189035,-0.5377497270,,, +27.3046875000,27,4.0032864394,2.1248794923,1.1426995656,-0.6042550450,,, +27.3066406250,27,4.1961848673,2.1686307749,1.2291122098,-0.6606212203,,, +27.3085937500,27,4.2403045283,2.1191408752,1.2804990095,-0.7013388221,,, +27.3105468750,27,4.1445234520,2.0027205571,1.2881376394,-0.7174398342,,, +27.3125000000,27,3.9227816317,1.8527935479,1.2424102101,-0.6986390837,,, +27.3144531250,27,3.5925990190,1.7042022231,1.1349391788,-0.6354516850,,, +27.3164062500,27,3.1733118990,1.5880390332,0.9603000533,-0.5209372976,,, +27.3183593750,27,2.6842228157,1.5263314071,0.7177662705,-0.3524752869,,, +27.3203125000,27,2.1440365389,1.5289543151,0.4126193984,-0.1329933908,,, +27.3222656250,27,1.5722842417,1.5936393193,0.0569673673,0.1284816817,,, +27.3242187500,27,0.9912917648,1.7064655065,-0.3293791259,0.4162869315,,, +27.3261718750,27,0.4264436620,1.8423541852,-0.7189968860,0.7082701691,,, +27.3281250000,27,-0.0952402532,1.9675639234,-1.0789504812,0.9775563885,,, +27.3300781250,27,-0.5468592585,2.0440188802,-1.3740512538,1.1953068252,,, +27.3320312500,27,-0.9041179263,2.0343205186,-1.5708949484,1.3340897259,,, +27.3339843750,27,-1.1491792165,1.9069757361,-1.6427899704,1.3718981301,,, +27.3359375000,27,-1.2743826567,1.6406040426,-1.5740803601,1.2956234080,,, +27.3378906250,27,-1.2840828221,1.2264206993,-1.3625079284,1.1029514704,,, +27.3398437500,27,-1.1945754800,0.6695671977,-1.0198932969,0.8029408751,,, +27.3417968750,27,-1.0322680754,-0.0109126985,-0.5711122756,0.4152558659,,, +27.3437500000,27,-0.8290293872,-0.7842717682,-0.0503164144,-0.0327447452,,, +27.3457031250,27,-0.6154977282,-1.6116801179,0.5047714180,-0.5103888395,,, +27.3476562500,27,-0.4161217496,-2.4494534770,1.0573727191,-0.9871940934,,, +27.3496093750,27,-0.2478257881,-3.2521122403,1.5740111886,-1.4348550741,,, +27.3515625000,27,-0.1212732674,-3.9763026469,2.0258479921,-1.8286022637,,, +27.3535156250,27,-0.0435469068,-4.5839872875,2.3888348695,-2.1476442470,,, +27.3554687500,27,-0.0209846190,-5.0437279584,2.6427824689,-2.3746393433,,, +27.3574218750,27,-0.0608703032,-5.3315859267,2.7708851189,-2.4954362543,,, +27.3593750000,27,-0.1708479331,-5.4317130089,2.7603779575,-2.4995747101,,, +27.3613281250,27,-0.3554447278,-5.3360403719,2.6043609286,-2.3815128594,,, +27.3632812500,27,-0.6112737254,-5.0451465916,2.3049988544,-2.1429335241,,, +27.3652343750,27,-0.9241810668,-4.5702650370,1.8762182275,-1.7948117472,,, +27.3671875000,27,-1.2698123536,-3.9334936580,1.3435042617,-1.3572803521,,, +27.3691406250,27,-1.6159004139,-3.1668174738,0.7420889628,-0.8582539466,,, +27.3710937500,27,-1.9251020241,-2.3113648159,0.1149566555,-0.3319386916,,, +27.3730468750,27,-2.1593620299,-1.4145583294,-0.4911373571,0.1842512465,,, +27.3750000000,27,-2.2851504970,-0.5246417194,-1.0315524702,0.6543400264,,, +27.3769531250,27,-2.2771481415,0.3137430809,-1.4682163863,1.0473193755,,, +27.3789062500,27,-2.1199265880,1.0613074834,-1.7715123094,1.3386360846,,, +27.3808593750,27,-1.8086571221,1.6852294552,-1.9212675065,1.5110005290,,, +27.3828125000,27,-1.3486749949,2.1604019940,-1.9071629142,1.5548028290,,, +27.3847656250,27,-0.7536523625,2.4700319388,-1.7280129286,1.4676649968,,, +27.3867187500,27,-0.0438059114,2.6063438200,-1.3911354920,1.2540423483,,, +27.3886718750,27,0.7550834416,2.5714744740,-0.9122940144,0.9252294422,,, +27.3906250000,27,1.6126670019,2.3767982281,-0.3147903832,0.4986307618,,, +27.3925781250,27,2.4948071474,2.0414374583,0.3717514311,-0.0032627955,,, +27.3945312500,27,3.3632915147,1.5923246017,1.1111592482,-0.5527595194,,, +27.3964843750,27,4.1753841627,1.0646991577,1.8601591636,-1.1165873792,,, +27.3984375000,27,4.8844288740,0.5008962892,2.5693413775,-1.6567203426,,, +27.4003906250,27,5.4414998862,-0.0518562992,3.1852640291,-2.1320713843,,, +27.4023437500,27,5.7986150053,-0.5444697422,3.6539099953,-2.5011724108,,, +27.4042968750,27,5.9138359541,-0.9306077152,3.9260954609,-2.7263107826,,, +27.4062500000,27,5.7561630775,-1.1706910979,3.9624546810,-2.7772835116,,, +27.4082031250,27,5.3087081899,-1.2335785675,3.7362006549,-2.6333879594,,, +27.4101562500,27,4.5710929550,-1.0980964083,3.2353635707,-2.2850352159,,, +27.4121093750,27,3.5610220604,-0.7557913744,2.4652168612,-1.7356006014,,, +27.4140625000,27,2.3137893129,-0.2132867095,1.4493131334,-1.0022690288,,, +27.4160156250,27,0.8800045665,0.5067429930,0.2287636239,-0.1155359127,,, +27.4179687500,27,-0.6775575824,1.3661432686,-1.1398248244,0.8823451485,,, +27.4199218750,27,-2.2877257236,2.3142480366,-2.5880800300,1.9402415371,,, +27.4218750000,27,-3.8748619412,3.2919193291,-4.0402956407,3.0015503190,,, +27.4238281250,27,-5.3625038452,4.2342539582,-5.4169967718,4.0068623001,,, +27.4257812500,27,-6.6768755475,5.0737479360,-6.6386798618,4.8967829345,,, +27.4277343750,27,-7.7508059019,5.7462654424,-7.6313155901,5.6161891544,,, +27.4296875000,27,-8.5285126596,6.1975086026,-8.3326608894,6.1190183648,,, +27.4316406250,27,-8.9707636833,6.3876304112,-8.6978168991,6.3723220515,,, +27.4335937500,27,-9.0587779881,6.2943277216,-8.7032353310,6.3591319528,,, +27.4355468750,27,-8.7954522379,5.9140915708,-8.3481619046,6.0794576573,,, +27.4375000000,27,-8.2039313464,5.2611854136,-7.6532974672,5.5492238350,,, +27.4394531250,27,-7.3246917389,4.3657525013,-6.6581157698,4.7982401639,,, +27.4414062500,27,-6.2119112170,3.2717082313,-5.4176403790,3.8678060214,,, +27.4433593750,27,-4.9288355975,2.0332007651,-3.9978481840,2.8072850316,,, +27.4453125000,27,-3.5424843356,0.7098410518,-2.4700050085,1.6698760731,,, +27.4472656250,27,-2.1190559047,-0.6370971153,-0.9059253770,0.5091066840,,, +27.4492187500,27,-0.7206271475,-1.9468820933,0.6251477328,-0.6234461917,,, +27.4511718750,27,0.5973738307,-3.1615544540,2.0592247528,-1.6801501582,,, +27.4531250000,27,1.7886512639,-4.2289645277,3.3406774559,-2.6196515917,,, +27.4550781250,27,2.8187736892,-5.1058667833,4.4255480982,-3.4093077311,,, +27.4570312500,27,3.6675527758,-5.7608443068,5.2845780959,-4.0273888357,,, +27.4589843750,27,4.3296305389,-6.1771066530,5.9051198854,-4.4645362424,,, +27.4609375000,27,4.8127620222,-6.3541630129,6.2910793154,-4.7238336167,,, +27.4628906250,27,5.1352701154,-6.3074715731,6.4612639753,-4.8196462499,,, +27.4648437500,27,5.3235855438,-6.0659148415,6.4465879403,-4.7755113629,,, +27.4667968750,27,5.4091495232,-5.6673287327,6.2858301091,-4.6209103726,,, +27.4687500000,27,5.4249175132,-5.1536713280,6.0209551289,-4.3877314863,,, +27.4707031250,27,5.4024818159,-4.5677614473,5.6936523822,-4.1076833896,,, +27.4726562500,27,5.3692361967,-3.9508428752,5.3423435656,-3.8101063763,,, +27.4746093750,27,5.3446324804,-3.3391688926,4.9981095118,-3.5190042673,,, +27.4765625000,27,5.3362533699,-2.7603901324,4.6803928887,-3.2499251583,,, +27.4785156250,27,5.3369937383,-2.2312025305,4.3940366230,-3.0078397925,,, +27.4804687500,27,5.3247205395,-1.7564720926,4.1285856205,-2.7866336253,,, +27.4824218750,27,5.2661931139,-1.3308308483,3.8614536187,-2.5713313279,,, +27.4843750000,27,5.1243442935,-0.9427120899,3.5644178043,-2.3426888366,,, +27.4863281250,27,4.8651887138,-0.5778695057,3.2096258146,-2.0813968188,,, +27.4882812500,27,4.4629420173,-0.2211564948,2.7736065332,-1.7708082712,,, +27.4902343750,27,3.9043813754,0.1408452144,2.2413021639,-1.3997600445,,, +27.4921875000,27,3.1919918761,0.5152259908,1.6104562931,-0.9658338017,,, +27.4941406250,27,2.3442078255,0.8995584087,0.8935061720,-0.4768886637,,, +27.4960937500,27,1.3927081608,1.2828070648,0.1154847328,0.0503702784,,, +27.4980468750,27,0.3785162838,1.6484933993,-0.6900297140,0.5932855834,,, +27.5000000000,27,-0.6517403776,1.9778482318,-1.4848738982,1.1260648080,,, +27.5019531250,27,-1.6491711432,2.2527457230,-2.2299035057,1.6223486085,,, +27.5039062500,27,-2.5655917850,2.4578202377,-2.8879267498,2.0572721761,,, +27.5058593750,27,-3.3560569898,2.5810314590,-3.4255283971,2.4086603702,,, +27.5078125000,27,-3.9811470384,2.6137407592,-3.8144786261,2.6579109081,,, +27.5097656250,27,-4.4094768530,2.5514676705,-4.0336478496,2.7912674390,,, +27.5117187500,27,-4.6209120687,2.3951224592,-4.0716057136,2.8015698350,,, +27.5136718750,27,-4.6107592241,2.1525624767,-3.9299788181,2.6905134457,,, +27.5156250000,27,-4.3941442273,1.8400721079,-3.6268857034,2.4709375616,,, +27.5175781250,27,-4.0081540798,1.4823677637,-3.1982363437,2.1676073067,,, +27.5195312500,27,-3.5096065366,1.1108203089,-2.6954370096,1.8155703565,,, +27.5214843750,27,-2.9686562009,0.7607363631,-2.1800703083,1.4565612889,,, +27.5234375000,27,-2.4593450594,0.4673120893,-1.7159911233,1.1336991843,,, +27.5253906250,27,-2.0488020724,0.2602078234,-1.3598319439,0.8850851752,,, +27.5273437500,27,-1.7885111684,0.1593625976,-1.1534273065,0.7387256408,,, +27.5292968750,27,-1.7098949540,0.1740140395,-1.1206112773,0.7104732914,,, +27.5312500000,27,-1.8234574199,0.3036189420,-1.2672205631,0.8041151327,,, +27.5332031250,27,-2.1197945587,0.5391144886,-1.5824132326,1.0122963879,,, +27.5351562500,27,-2.5711540089,0.8641267877,-2.0402753300,1.3176349557,,, +27.5371093750,27,-3.1333388384,1.2557394664,-2.6013768881,1.6937786941,,, +27.5390625000,27,-3.7490287073,1.6852706337,-3.2151832413,2.1069893764,,, +27.5410156250,27,-4.3528314214,2.1199047802,-3.8239837021,2.5187422403,,, +27.5429687500,27,-4.8767338462,2.5246328653,-4.3672379671,2.8886038059,,, +27.5449218750,27,-5.2554222046,2.8641501998,-4.7858376579,3.1770269714,,, +27.5468750000,27,-5.4320438916,3.1056003412,-5.0271198274,3.3486700640,,, +27.5488281250,27,-5.3636684621,3.2218347278,-5.0499922053,3.3758292611,,, +27.5507812500,27,-5.0253531207,3.1938947820,-4.8287898165,3.2410090527,,, +27.5527343750,27,-4.4133560501,3.0130828487,-4.3563938055,2.9389932610,,, +27.5546875000,27,-3.5479010594,2.6830185541,-3.6470686787,2.4787479228,,, +27.5566406250,27,-2.4735792842,2.2197974129,-2.7368046309,1.8836279678,,, +27.5585937500,27,-1.2553762176,1.6494050268,-1.6794748407,1.1887798754,,, +27.5605468750,27,0.0284403862,1.0049711338,-0.5410007324,0.4373325217,,, +27.5625000000,27,1.2943956536,0.3251295029,0.6064479133,-0.3232733482,,, +27.5644531250,27,2.4632800863,-0.3493138940,1.6920532630,-1.0462043267,,, +27.5664062500,27,3.4711172482,-0.9815436950,2.6564582095,-1.6919305141,,, +27.5683593750,27,4.2783118607,-1.5442856776,3.4604417371,-2.2339787754,,, +27.5703125000,27,4.8735527540,-2.0222909066,4.0886974068,-2.6614271971,,, +27.5722656250,27,5.2719434876,-2.4123559665,4.5487311853,-2.9782165005,,, +27.5742187500,27,5.5085903710,-2.7211436832,4.8657636391,-3.1998497886,,, +27.5761718750,27,5.6296561541,-2.9612410410,5.0750806531,-3.3484195441,,, +27.5781250000,27,5.6832872886,-3.1472907054,5.2143238234,-3.4476442538,,, +27.5800781250,27,5.7118645359,-3.2930481154,5.3170929073,-3.5188021471,,, +27.5820312500,27,5.7462038426,-3.4092841691,5.4082073558,-3.5777436297,,, +27.5839843750,27,5.8028361541,-3.5032068298,5.5017025710,-3.6336762982,,, +27.5859375000,27,5.8846869392,-3.5790064584,5.6015377426,-3.6896612658,,, +27.5878906250,27,5.9832863472,-3.6380078125,5.7030198407,-3.7434841472,,, +27.5898437500,27,6.0806183292,-3.6786970900,5.7939438525,-3.7883350162,,, +27.5917968750,27,6.1503814597,-3.6974031394,5.8557534244,-3.8135533438,,, +27.5937500000,27,6.1592824237,-3.6886024049,5.8645184672,-3.8052114791,,, +27.5957031250,27,6.0690208446,-3.6440939157,5.7917026679,-3.7464473920,,, +27.5976562500,27,5.8391465931,-3.5519697869,5.6053508275,-3.6180191534,,, +27.5996093750,27,5.4304107002,-3.3962359563,5.2719462261,-3.3993195043,,, +27.6015625000,27,4.8087295834,-3.1574970407,4.7592444511,-3.0700746997,,, +27.6035156250,27,3.9506281280,-2.8154935994,4.0410603559,-2.6133801950,,, +27.6054687500,27,2.8498157145,-2.3535743555,3.1038537629,-2.0199755024,,, +27.6074218750,27,1.5228956236,-1.7637499447,1.9531311996,-1.2924461907,,, +27.6093750000,27,0.0124529564,-1.0508663734,0.6177494137,-0.4480998706,,, +27.6113281250,27,-1.6139485084,-0.2348106086,-0.8494115951,0.4804677051,,, +27.6132812500,27,-3.2701695625,0.6504665784,-2.3759121864,1.4480982150,,, +27.6152343750,27,-4.8615161228,1.5608271489,-3.8781164725,2.4023128268,,, +27.6171875000,27,-6.2934230626,2.4460543005,-5.2688911774,3.2881561920,,, +27.6191406250,27,-7.4771403467,3.2530998052,-6.4629712591,4.0516025470,,, +27.6210937500,27,-8.3355516881,3.9302803217,-7.3829439135,4.6434225742,,, +27.6230468750,27,-8.8101270521,4.4326318539,-7.9666020562,5.0239421611,,, +27.6250000000,27,-8.8665129677,4.7265862380,-8.1730930541,5.1670064194,,, +27.6269531250,27,-8.4973053319,4.7932362372,-7.9865481925,5.0623165615,,, +27.6289062500,27,-7.7219930609,4.6296482475,-7.4168658218,4.7159124759,,, +27.6308593750,27,-6.5844684339,4.2474997333,-6.4974551787,4.1486519537,,, +27.6328125000,27,-5.1499872047,3.6708615001,-5.2821261008,3.3941512628,,, +27.6347656250,27,-3.5027320210,2.9350750344,-3.8429561646,2.4974295745,,, +27.6367187500,27,-1.7419648517,2.0852098163,-2.2670363398,1.5128840329,,, +27.6386718750,27,0.0242798991,1.1729639786,-0.6508044657,0.5007303441,,, +27.6406250000,27,1.6858641706,0.2537593842,0.9057311763,-0.4766028946,,, +27.6425781250,27,3.1367706209,-0.6152748827,2.3039858460,-1.3575407739,,, +27.6445312500,27,4.2825793567,-1.3782227533,3.4530993562,-2.0852437534,,, +27.6464843750,27,5.0491458668,-1.9848428848,4.2778937685,-2.6125454648,,, +27.6484375000,27,5.3893108562,-2.3946683394,4.7254353165,-2.9060156324,,, +27.6503906250,27,5.2854640840,-2.5795504554,4.7681465223,-2.9478905264,,, +27.6523437500,27,4.7488288070,-2.5251680881,4.4042863154,-2.7364152325,,, +27.6542968750,27,3.8165703764,-2.2315370303,3.6564979794,-2.2850035395,,, +27.6562500000,27,2.5474161610,-1.7127652748,2.5689894260,-1.6205639165,,, +27.6582031250,27,1.0169572376,-0.9968002702,1.2045017408,-0.7817196172,,, +27.6601562500,27,-0.6867075681,-0.1245218757,-0.3588884854,0.1831287395,,, +27.6621093750,27,-2.4662624308,0.8519217486,-2.0307399626,1.2176923260,,, +27.6640625000,27,-4.2168835825,1.8701643457,-3.7098837179,2.2588665707,,, +27.6660156250,27,-5.8278854347,2.8586213575,-5.2860015326,3.2377512816,,, +27.6679687500,27,-7.1866532990,3.7396468094,-6.6438863439,4.0823719895,,, +27.6699218750,27,-8.1860266326,4.4354235926,-7.6714477064,4.7227474732,,, +27.6718750000,27,-8.7341072813,4.8753815446,-8.2701328805,5.0974291017,,, +27.6738281250,27,-8.7640462616,5.0038510145,-8.3654945589,5.1601105387,,, +27.6757812500,27,-8.2422355859,4.7868347214,-7.9162789904,4.8852864554,,, +27.6777343750,27,-7.1737009036,4.2164457793,-6.9204388571,4.2719305624,,, +27.6796875000,27,-5.6036637744,3.3125239159,-5.4171278068,3.3446444173,,, +27.6816406250,27,-3.6158347295,2.1222322268,-3.4854751222,2.1528266109,,, +27.6835937500,27,-1.3274987544,0.7172214048,-1.2399388339,0.7677096325,,, +27.6855468750,27,1.1193219106,-0.8123928242,1.1786477076,-0.7233012700,,, +27.6875000000,27,3.5690698349,-2.3655702422,3.6144071677,-2.2237309395,,, +27.6894531250,27,5.8642098278,-3.8379505632,5.9080381557,-3.6352598012,,, +27.6914062500,27,7.8571049675,-5.1302562632,7.9091324116,-4.8653645647,,, +27.6933593750,27,9.4215445282,-6.1567321311,9.4883344190,-5.8348181614,,, +27.6953125000,27,10.4618990815,-6.8511535917,10.5466343327,-6.4833166337,,, +27.6972656250,27,10.9189093516,-7.1701608584,11.0210107436,-6.7728067339,,, +27.6992187500,27,10.7722044750,-7.0948837518,10.8870324885,-6.6889646164,,, +27.7011718750,27,10.0399666404,-6.6306676454,10.1585680329,-6.2408917301,,, +27.7031250000,27,8.7768761304,-5.8054607469,8.8856331095,-5.4596597879,,, +27.7050781250,27,7.0712365133,-4.6681914722,7.1517063599,-4.3965807810,,, +27.7070312500,27,5.0403522733,-3.2866708028,5.0696569789,-3.1206904616,,, +27.7089843750,27,2.8229331107,-1.7438961751,2.7748594936,-1.7145530129,,, +27.7109375000,27,0.5690458434,-0.1329715447,0.4159439825,-0.2686594765,,, +27.7128906250,27,-1.5714343089,1.4489178861,-1.8559688706,1.1250656526,,, +27.7148437500,27,-3.4606221073,2.9070629123,-3.8985232065,2.3800450627,,, +27.7167968750,27,-4.9824904897,4.1553130444,-5.5879190713,3.4209449952,,, +27.7187500000,27,-6.0500098416,5.1212778804,-6.8264983461,4.1882443015,,, +27.7207031250,27,-6.6100279135,5.7508308122,-7.5485201354,4.6417212799,,, +27.7226562500,27,-6.6455680853,6.0115057919,-7.7236741639,4.7625855066,,, +27.7246093750,27,-6.1755967167,5.8944943632,-7.3581856001,4.5541562961,,, +27.7265625000,27,-5.2533900295,5.4156549931,-6.4944552951,4.0416544216,,, +27.7285156250,27,-3.9633027082,4.6151739062,-5.2088873184,3.2709002613,,, +27.7304687500,27,-2.4139658710,3.5544957196,-3.6058412267,2.3046784081,,, +27.7324218750,27,-0.7282014682,2.3107141861,-1.8079990320,1.2169483275,,, +27.7343750000,27,0.9665252681,0.9706515163,0.0531299872,0.0871260056,,, +27.7363281250,27,2.5451033698,-0.3743842801,1.8447062550,-1.0044760888,,, +27.7382812500,27,3.8912817501,-1.6342100408,3.4399710518,-1.9811868225,,, +27.7402343750,27,4.9049077807,-2.7259140844,4.7264579821,-2.7749652786,,, +27.7421875000,27,5.5087116273,-3.5795139870,5.6136583987,-3.3310060205,,, +27.7441406250,27,5.6543395926,-4.1429459611,6.0398337242,-3.6117983788,,, +27.7460937500,27,5.3273550269,-4.3861347392,5.9776355510,-3.6004525574,,, +27.7480468750,27,4.5490913580,-4.3028464959,5.4364297983,-3.3020392414,,, +27.7500000000,27,3.3741867952,-3.9100210838,4.4604032551,-2.7424223968,,, +27.7519531250,27,1.8848227154,-3.2454558700,3.1236047085,-1.9653005580,,, +27.7539062500,27,0.1829513112,-2.3639859296,1.5228103491,-1.0279604210,,, +27.7558593750,27,-1.6182235434,-1.3323351590,-0.2308909440,0.0037503045,,, +27.7578125000,27,-3.4020377811,-0.2240268520,-2.0200424791,1.0601551876,,, +27.7597656250,27,-5.0548387264,0.8847844683,-3.7274021621,2.0716383218,,, +27.7617187500,27,-6.4713778941,1.9191013132,-5.2416206332,2.9720087826,,, +27.7636718750,27,-7.5593869411,2.8089530195,-6.4624510082,3.7016217628,,, +27.7656250000,27,-8.2439373574,3.4933645422,-7.3058865140,4.2104615236,,, +27.7675781250,27,-8.4718362483,3.9242067367,-7.7092576865,4.4611814106,,, +27.7695312500,27,-8.2151693234,4.0693307409,-7.6353711046,4.4315557449,,, +27.7714843750,27,-7.4736763863,3.9148704417,-7.0754215549,4.1161895102,,, +27.7734375000,27,-6.2766894846,3.4670869046,-6.0513583835,3.5278894517,,, +27.7753906250,27,-4.6841609560,2.7532175851,-4.6170845650,2.6983193439,,, +27.7773437500,27,-2.7846519750,1.8200627998,-2.8563834320,1.6767032017,,, +27.7792968750,27,-0.6894967432,0.7303569430,-0.8770935839,0.5263402913,,, +27.7812500000,27,1.4747882177,-0.4414735092,1.1962105463,-0.6797073153,,, +27.7832031250,27,3.5742335968,-1.6135358907,3.2296280655,-1.8629567957,,, +27.7851562500,27,5.4757579578,-2.7014583332,5.0881920153,-2.9443541532,,, +27.7871093750,27,7.0561349225,-3.6242132371,6.6450438603,-3.8496594836,,, +27.7890625000,27,8.2109047912,-4.3102638909,7.7907842540,-4.5149277620,,, +27.7910156250,27,8.8627375658,-4.7036945583,8.4424773665,-4.8917872875,,, +27.7929687500,27,8.9680912658,-4.7694623378,8.5510592400,-4.9517768063,,, +27.7949218750,27,8.5213260269,-4.4970106245,8.1061644070,-4.6891482743,,, +27.7968750000,27,7.5564086507,-3.9021498520,7.1383946412,-4.1221471535,,, +27.7988281250,27,6.1458860201,-3.0268587552,5.7186108858,-3.2925280347,,, +27.8007812500,27,4.3967158389,-1.9366390893,3.9537598561,-2.2630251099,,, +27.8027343750,27,2.4430100078,-0.7156107607,1.9793710277,-1.1128824211,,, +27.8046875000,27,0.4358954829,0.5402246515,-0.0509000544,0.0683040426,,, +27.8066406250,27,-1.4687801253,1.7310416118,-1.9779172427,1.1879783879,,, +27.8085937500,27,-3.1238660323,2.7619465787,-3.6508672717,2.1586531218,,, +27.8105468750,27,-4.4039304578,3.5513968083,-4.9406326393,2.9056470657,,, +27.8125000000,27,-5.2162329322,4.0382595580,-5.7510621535,3.3735696672,,, +27.8144531250,27,-5.5089990387,4.1872197223,-6.0275449257,3.5312228480,,, +27.8164062500,27,-5.2760900632,3.9920221355,-5.7619966921,3.3744133135,,, +27.8183593750,27,-4.5570835923,3.4758270992,-4.9931900155,2.9260624679,,, +27.8203125000,27,-3.4333549907,2.6889222300,-3.8029378108,2.2339210074,,, +27.8222656250,27,-2.0209454600,1.7042969753,-2.3089296363,1.3663603942,,, +27.8242187500,27,-0.4604368232,0.6112531108,-0.6544668494,0.4063832278,,, +27.8261718750,27,1.0961442854,-0.4928723784,1.0048482825,-0.5561041965,,, +27.8281250000,27,2.5010315831,-1.5125594757,2.5170622077,-1.4335002899,,, +27.8300781250,27,3.6264880147,-2.3639556136,3.7498886390,-2.1497100004,,, +27.8320312500,27,4.3770595597,-2.9825586129,4.6032032311,-2.6472791406,,, +27.8339843750,27,4.6969277719,-3.3279761902,5.0166651988,-2.8917033273,,, +27.8359375000,27,4.5724676589,-3.3859419169,4.9726282989,-2.8730323697,,, +27.8378906250,27,4.0296436079,-3.1672933904,4.4939144935,-2.6045432043,,, +27.8398437500,27,3.1268368548,-2.7040121417,3.6368821471,-2.1187257899,,, +27.8417968750,27,1.9457455343,-2.0437881695,2.4823590709,-1.4620479461,,, +27.8437500000,27,0.5826053814,-1.2446165714,1.1267874777,-0.6898512732,,, +27.8457031250,27,-0.8601364719,-0.3696314628,-0.3262113128,0.1384949026,,, +27.8476562500,27,-2.2819129685,0.5180207433,-1.7741107887,0.9643341869,,, +27.8496093750,27,-3.5907376560,1.3595689902,-3.1224275784,1.7336957751,,, +27.8515625000,27,-4.7076744943,2.1036408391,-4.2894260572,2.3999726387,,, +27.8535156250,27,-5.5700665968,2.7084834187,-5.2095488344,2.9258619463,,, +27.8554687500,27,-6.1342195249,3.1438034320,-5.8362712253,3.2849689032,,, +27.8574218750,27,-6.3769417267,3.3918170826,-6.1437486979,3.4627132507,,, +27.8593750000,27,-6.2958336826,3.4474749548,-6.1271638182,3.4564911599,,, +27.8613281250,27,-5.9085135317,3.3180845350,-5.8020246674,3.2752465524,,, +27.8632812500,27,-5.2497578785,3.0217609516,-5.2014139101,2.9378877444,,, +27.8652343750,27,-4.3662564203,2.5844735807,-4.3708516747,2.4703596722,,, +27.8671875000,27,-3.3116312115,2.0371454107,-3.3633529461,1.9028313408,,, +27.8691406250,27,-2.1435972217,1.4138091674,-2.2364941942,1.2680169247,,, +27.8710937500,27,-0.9218251859,0.7500144051,-1.0500790434,0.5998324080,,, +27.8730468750,27,0.2942272225,0.0812453614,0.1362144200,-0.0679497289,,, +27.8750000000,27,1.4465688442,-0.5579852248,1.2641917967,-0.7024715929,,, +27.8769531250,27,2.4793115719,-1.1346380037,2.2778595026,-1.2721960887,,, +27.8789062500,27,3.3398527284,-1.6179838033,3.1246957539,-1.7476263951,,, +27.8808593750,27,3.9812663307,-1.9810245912,3.7580546831,-2.1026546304,,, +27.8828125000,27,4.3663637713,-2.2026747822,4.1411080561,-2.3167600802,,, +27.8847656250,27,4.4730603614,-2.2706020681,4.2520304306,-2.3778964511,,, +27.8867187500,27,4.2988319018,-2.1835680947,4.0882995114,-2.2848770096,,, +27.8886718750,27,3.8621152097,-1.9520354730,3.6679809952,-2.0480623880,,, +27.8906250000,27,3.2010181938,-1.5972806130,3.0283750910,-1.6885696848,,, +27.8925781250,27,2.3701734357,-1.1496178068,2.2229268805,-1.2365196495,,, +27.8945312500,27,1.4355279047,-0.6456180226,1.3161954068,-0.7282082854,,, +27.8964843750,27,0.4684318553,-0.1249009084,0.3781088436,-0.2028819166,,, +27.8984375000,27,-0.4589724910,0.3724754942,-0.5205842238,0.2998198331,,, +27.9003906250,27,-1.2780600077,0.8085041959,-1.3125989191,0.7422706139,,, +27.9023437500,27,-1.9293013169,1.1503777622,-1.9396216942,1.0919374293,,, +27.9042968750,27,-2.3675935213,1.3734299443,-2.3575396205,1.3242906497,,, +27.9062500000,27,-2.5657351004,1.4630244824,-2.5398392840,1.4246824974,,, +27.9082031250,27,-2.5164755177,1.4156656167,-2.4796167895,1.3894467698,,, +27.9101562500,27,-2.2326488474,1.2390339253,-2.1897011614,1.2259425071,,, +27.9121093750,27,-1.7441245560,0.9502270289,-1.6996342013,0.9508426543,,, +27.9140625000,27,-1.0925930115,0.5728005323,-1.0505214793,0.5872404447,,, +27.9160156250,27,-0.3268834677,0.1341450183,-0.2904264279,0.1620677614,,, +27.9179687500,27,0.4996395882,-0.3359505798,0.5281769978,-0.2953323268,,, +27.9199218750,27,1.3301240255,-0.8058721851,1.3494246349,-0.7537795562,,, +27.9218750000,27,2.1063754812,-1.2433576678,2.1161600429,-1.1814272727,,, +27.9238281250,27,2.7747172986,-1.6187111474,2.7756716796,-1.5489531758,,, +27.9257812500,27,3.2932629700,-1.9087925593,3.2868175515,-1.8335153974,,, +27.9277343750,27,3.6360234884,-2.0992650772,3.6240514579,-2.0209790529,,, +27.9296875000,27,3.7938713409,-2.1851215840,3.7783756406,-2.1064307202,,, +27.9316406250,27,3.7739374332,-2.1703713358,3.7567710997,-2.0938475951,,, +27.9335937500,27,3.5962853539,-2.0662466412,3.5789682251,-1.9942915685,,, +27.9355468750,27,3.2880689074,-1.8880263012,3.2717478589,-1.8227354503,,, +27.9375000000,27,2.8783723757,-1.6522084986,2.8638923332,-1.5952539922,,, +27.9394531250,27,2.3952325358,-1.3748311438,2.3832410147,-1.3273847900,,, +27.9414062500,27,1.8637376627,-1.0703488499,1.8547781599,-1.0330633336,,, +27.9433593750,27,1.3054758225,-0.7512612805,1.3000479637,-0.7242978403,,, +27.9453125000,27,0.7403223004,-0.4290518034,0.7388779237,-0.4121270533,,, +27.9472656250,27,0.1885922941,-0.1153390507,0.1914691421,-0.1077803360,,, +27.9492187500,27,-0.3288292840,0.1780729681,-0.3214895678,0.1772598706,,, +27.9511718750,27,-0.7918617563,0.4399541794,-0.7801720585,0.4320067836,,, +27.9531250000,27,-1.1831051148,0.6606718280,-1.1674516511,0.6469856468,,, +27.9550781250,27,-1.4900888945,0.8334145383,-1.4711018225,0.8154501213,,, +27.9570312500,27,-1.7072783260,0.9552716183,-1.6857527178,0.9344614172,,, +27.9589843750,27,-1.8371151929,1.0277643767,-1.8138904931,1.0054352654,,, +27.9609375000,27,-1.8902159088,1.0569166785,-1.8660310636,1.0342318922,,, +27.9628906250,27,-1.8846254117,1.0528297060,-1.8599809364,1.0307424711,,, +27.9648437500,27,-1.8430346504,1.0281580996,-1.8181115538,1.0073776854,,, +27.9667968750,27,-1.7881076720,0.9955560536,-1.7627825357,0.9765338571,,, +27.9687500000,27,-1.7379442751,0.9651911339,-1.7118920633,0.9481316920,,, +27.9707031250,27,-1.7029737666,0.9430257710,-1.6758191954,0.9279261518,,, +27.9726562500,27,-1.6848282364,0.9301742770,-1.6563012148,0.9168870969,,, +27.9746093750,27,-1.6778654445,0.9237181192,-1.6479132260,0.9120197866,,, +27.9765625000,27,-1.6722660243,0.9183954232,-1.6410993587,0.9080433353,,, +27.9785156250,27,-1.6571795872,0.9083248210,-1.6252575017,0.8990977771,,, +27.9804687500,27,-1.6243136329,0.8889759469,-1.5922615633,0.8806921455,,, +27.9824218750,27,-1.5711407351,0.8589346235,-1.5396123781,0.8514464124,,, +27.9843750000,27,-1.5014312738,0.8202059294,-1.4709680383,0.8133838656,,, +27.9863281250,27,-1.4234576384,0.7772421043,-1.3943907326,0.7709610715,,, +27.9882812500,27,-1.3475860689,0.7356340420,-1.3199919727,0.7297658370,,, +27.9902343750,27,-1.2836961491,0.7007076532,-1.2574079391,0.6951218178,,, +27.9921875000,27,-1.2389107076,0.6762893698,-1.2135784187,0.6708613542,,, +27.9941406250,27,-1.2164429384,0.6640818189,-1.1916201979,0.6587034960,,, +27.9960937500,27,-1.2154252918,0.6635747178,-1.1906617979,0.6581633023,,, +27.9980468750,27,-1.2313887787,0.6723083181,-1.2063139517,0.6668122120,,, +28.0000000000,28,-1.2577183961,0.6867702666,-1.2321096852,0.6811541858,33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000:10.0000000000:11.0000000000:12.0000000000:13.0000000000:14.0000000000:15.0000000000:19.0000000000:20.0000000000:21.0000000000:22.0000000000:23.0000000000:24.0000000000:25.0000000000:26.0000000000:27.0000000000:28.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +28.0019531250,28,-1.2880005378,0.7034359808,-1.2617788483,0.6976806767,,, +28.0039062500,28,-1.3171573258,0.7193344803,-1.2903420633,0.7134485239,,, +28.0058593750,28,-1.3406756920,0.7318155356,-1.3133735575,0.7258324895,,, +28.0078125000,28,-1.3532132282,0.7378144201,-1.3256360329,0.7317955759,,, +28.0097656250,28,-1.3467502911,0.7328650803,-1.3192709260,0.7269098992,,, +28.0117187500,28,-1.3083675354,0.7099009647,-1.2816215127,0.7041671278,,, +28.0136718750,28,-1.2199170944,0.6590776903,-1.1949107846,0.6538026438,,, +28.0156250000,28,-1.0614629209,0.5696424829,-1.0396114737,0.5651499269,,, +28.0175781250,28,-0.8163383293,0.4326771817,-0.7994001527,0.4293614640,,, +28.0195312500,28,-0.4747537021,0.2430402072,-0.4646908290,0.2413352781,,, +28.0214843750,28,-0.0353834843,0.0002036426,-0.0341889642,0.0005455821,,, +28.0234375000,28,0.4948029268,-0.2918610077,0.4852746511,-0.2890702708,,, +28.0253906250,28,1.1021906629,-0.6256011658,1.0803601539,-0.6200224306,,, +28.0273437500,28,1.7683267866,-0.9908824404,1.7329894477,-0.9822595277,,, +28.0292968750,28,2.4706401673,-1.3753793258,2.4210512802,-1.3635563491,,, +28.0312500000,28,3.1826956331,-1.7647011975,3.1186498075,-1.7496391888,,, +28.0332031250,28,3.8747208363,-2.1426649010,3.7966202602,-2.1244566334,,, +28.0351562500,28,4.5139558262,-2.4914663842,4.4228708186,-2.4703503025,,, +28.0371093750,28,5.0650933850,-2.7918965313,4.9628132728,-2.7682695203,,, +28.0390625000,28,5.4917521781,-3.0241081691,5.3808051994,-2.9985328021,,, +28.0410156250,28,5.7594228835,-3.1691659602,5.6430346970,-3.1423660496,,, +28.0429687500,28,5.8400088762,-3.2114785312,5.7219676516,-3.1843153054,,, +28.0449218750,28,5.7164548992,-3.1413459138,5.6008830067,-3.1147724439,,, +28.0468750000,28,5.3843033353,-2.9558919710,5.2753997110,-2.9308979829,,, +28.0488281250,28,4.8502386176,-2.6583650334,4.7520533239,-2.6359254174,,, +28.0507812500,28,4.1313295313,-2.2578215557,4.0475563924,-2.2388453407,,, +28.0527343750,28,3.2556381727,-1.7695503859,3.1893976364,-1.7548240316,,, +28.0546875000,28,2.2611104873,-1.2145019894,2.2147562061,-1.2046363003,,, +28.0566406250,28,1.1916584558,-0.6171269805,1.1666630844,-0.6125221005,,, +28.0585937500,28,0.0925107310,-0.0028036650,0.0894453619,-0.0036360260,,, +28.0605468750,28,-0.9933961438,0.6042087107,-0.9748112037,0.5979809356,,, +28.0625000000,28,-2.0277597115,1.1821842717,-1.9885600908,1.1708013095,,, +28.0644531250,28,-2.9780824796,1.7126605254,-2.9199435155,1.6965331988,,, +28.0664062500,28,-3.8183183491,2.1808063773,-3.7434262801,2.1604846856,,, +28.0683593750,28,-4.5295693314,2.5758332534,-4.4404793234,2.5519706253,,, +28.0703125000,28,-5.0995229292,2.8907101111,-4.9990292438,2.8640293719,,, +28.0722656250,28,-5.5200854419,3.1208344400,-5.4111387455,3.0921055267,,, +28.0742187500,28,-5.7855136288,3.2630215070,-5.6711764245,3.2330475260,,, +28.0761718750,28,-5.8922704663,3.3154889263,-5.7756770764,3.2850911291,,, +28.0781250000,28,-5.8394469389,3.2780636326,-5.7237544470,3.2480649151,,, +28.0800781250,28,-5.6292559346,3.1523976787,-5.5175838995,3.1236050215,,, +28.0820312500,28,-5.2673638365,2.9422162749,-5.1627291030,2.9153996492,,, +28.0839843750,28,-4.7622421276,2.6530300787,-4.6675085261,2.6289024467,,, +28.0859375000,28,-4.1242723127,2.2915446184,-4.0421160218,2.2707486516,,, +28.0878906250,28,-3.3654907559,1.8653635960,-3.2983670187,1.8484635522,,, +28.0898437500,28,-2.4988576201,1.3825161889,-2.4489804756,1.3699950506,,, +28.0917968750,28,-1.5372570749,0.8509140349,-1.5065993766,0.8431752648,,, +28.0937500000,28,-0.4943530789,0.2788729823,-0.4846306949,0.2762366219,,, +28.0957031250,28,0.6130915585,-0.3235848216,0.6004812109,-0.3208984121,,, +28.0976562500,28,1.7632147966,-0.9436965320,1.7272956836,-0.9355914745,,, +28.0996093750,28,2.9265633298,-1.5646895796,2.8669357921,-1.5512295430,,, +28.1015625000,28,4.0626630250,-2.1639800908,3.9797289661,-2.1454390508,,, +28.1035156250,28,5.1189501294,-2.7127629784,5.0141633462,-2.6896776948,,, +28.1054687500,28,6.0344989801,-3.1783854605,5.9105484381,-3.1515817267,,, +28.1074218750,28,6.7463396261,-3.5280687497,6.6072123350,-3.4986499275,,, +28.1093750000,28,7.1963000533,-3.7326817001,7.0472076036,-3.7019824366,,, +28.1113281250,28,7.3387980811,-3.7708889583,7.1859447238,-3.7403923420,,, +28.1132812500,28,7.1474817922,-3.6325384973,6.9976943764,-3.6037650194,,, +28.1152343750,28,6.6171613424,-3.3193795575,6.4774733060,-3.2937734635,,, +28.1171875000,28,5.7626706013,-2.8442014346,5.6399239731,-2.8230271809,,, +28.1191406250,28,4.6186009585,-2.2304254314,4.5190483206,-2.2146705087,,, +28.1210937500,28,3.2387984458,-1.5112452072,3.1677015288,-1.5015390624,,, +28.1230468750,28,1.6925332528,-0.7268399186,1.6538218028,-0.7234089338,,, +28.1250000000,28,0.0583349360,0.0793859222,0.0543796893,0.0767229786,,, +28.1269531250,28,-1.5819794930,0.8642297432,-1.5504783373,0.8560320843,,, +28.1289062500,28,-3.1485697264,1.5877076946,-3.0825925076,1.5748522384,,, +28.1308593750,28,-4.5681130581,2.2154379016,-4.4702379827,2.1990377476,,, +28.1328125000,28,-5.7773596081,2.7201020787,-5.6515977768,2.7014184742,,, +28.1347656250,28,-6.7262444227,3.0825936335,-6.5777998469,3.0629452083,,, +28.1367187500,28,-7.3810661899,3.2932344979,-7.2160205291,3.2739021665,,, +28.1386718750,28,-7.7270639358,3.3524729830,-7.5519934044,3.3346083261,,, +28.1406250000,28,-7.7693948136,3.2706617909,-7.5909500285,3.2552082792,,, +28.1425781250,28,-7.5317311914,3.0668376465,-7.3562348094,3.0544692216,,, +28.1445312500,28,-7.0519780824,2.7662486277,-6.8851051859,2.7573327173,,, +28.1464843750,28,-6.3762878093,2.3971616159,-6.2228676557,2.3917507170,,, +28.1484375000,28,-5.5536475103,1.9879920148,-5.4175750492,1.9858413108,,, +28.1503906250,28,-4.6318149245,1.5646502778,-4.5160319067,1.5652685963,,, +28.1523437500,28,-3.6546165408,1.1480644333,-3.5611206461,1.1508069146,,, +28.1542968750,28,-2.6614571444,0.7534002621,-2.5913075206,0.7575780183,,, +28.1562500000,28,-1.6879874657,0.3911805643,-1.6413156234,0.3961472415,,, +28.1582031250,28,-0.7647850193,0.0680024481,-0.7408674855,0.0732102907,,, +28.1601562500,28,0.0851640654,-0.2135691508,0.0877520595,-0.2085324459,,, +28.1621093750,28,0.8463525796,-0.4540675937,0.8295642470,-0.4494650476,,, +28.1640625000,28,1.5092024326,-0.6557493421,1.4753642397,-0.6517028676,,, +28.1660156250,28,2.0708938302,-0.8227131797,2.0225259980,-0.8192154166,,, +28.1679687500,28,2.5369542861,-0.9616129948,2.4765566293,-0.9585336404,,, +28.1699218750,28,2.9204340144,-1.0815633883,2.8502974451,-1.0786498243,,, +28.1718750000,28,3.2395584000,-1.1935216697,3.1616396341,-1.1903944081,,, +28.1738281250,28,3.5149087610,-1.3086700659,3.4307585276,-1.3048359736,,, +28.1757812500,28,3.7661942065,-1.4356686115,3.6769237963,-1.4305790722,,, +28.1777343750,28,4.0096675378,-1.5786775753,3.9159513420,-1.5718171392,,, +28.1796875000,28,4.2556150218,-1.7365539017,4.1577560337,-1.7275288622,,, +28.1816406250,28,4.5046336023,-1.9018308935,4.4027265319,-1.8904532978,,, +28.1835937500,28,4.7448851095,-2.0602185441,4.6390573682,-2.0465808583,,, +28.1855468750,28,4.9534241895,-2.1923035834,4.8440745914,-2.1768210030,,, +28.1875000000,28,5.1008604974,-2.2766636095,4.9888207695,-2.2600748452,,, +28.1894531250,28,5.1565928920,-2.2929584496,5.0431929333,-2.2762897567,,, +28.1914062500,28,5.0938759227,-2.2251952746,4.9809233759,-2.2096806231,,, +28.1933593750,28,4.8942721542,-2.0647207204,4.7839603888,-2.0516791424,,, +28.1953125000,28,4.5499186785,-1.8114461979,4.4446915366,-1.8021441742,,, +28.1972656250,28,4.0642822740,-1.4737657029,3.9666728586,-1.4692864111,,, +28.1992187500,28,3.4527032856,-1.0682571992,3.3651483761,-1.0693805504,,, +28.2011718750,28,2.7414521141,-0.6183189430,2.6661045012,-0.6254284203,,, +28.2031250000,28,1.9646926614,-0.1511813864,1.9032593216,-0.1642240516,,, +28.2050781250,28,1.1604065475,0.3055637746,1.1140343778,0.2870592158,,, +28.2070312500,28,0.3654924772,0.7269766900,0.3347400269,0.7038424181,,, +28.2089843750,28,-0.3888805207,1.0930086686,-0.4039746707,1.0663587282,,, +28.2109375000,28,-1.0792663375,1.3895934368,-1.0790777600,1.3607308013,,, +28.2128906250,28,-1.6892796247,1.6086403635,-1.6745149051,1.5789570457,,, +28.2148437500,28,-2.2085212998,1.7475627789,-2.1801591865,1.7184424384,,, +28.2167968750,28,-2.6325764688,1.8088998535,-2.5918000628,1.7816297154,,, +28.2187500000,28,-2.9637282847,1.7999818337,-2.9118257336,1.7756787532,,, +28.2207031250,28,-3.2107252704,1.7324810282,-3.1489874268,1.7120266757,,, +28.2226562500,28,-3.3863893052,1.6218151661,-3.3160718876,1.6057862201,,, +28.2246093750,28,-3.5033070612,1.4855524785,-3.4256948599,1.4741574200,,, +28.2265625000,28,-3.5690517247,1.3402646797,-3.4856002075,1.3333265044,,, +28.2285156250,28,-3.5829066062,1.1981226017,-3.4954041764,1.1951280365,,, +28.2304687500,28,-3.5357106850,1.0648795695,-3.4463935892,1.0650836468,,, +28.2324218750,28,-3.4136000651,0.9400096488,-3.3251464442,0.9425692822,,, +28.2343750000,28,-3.2043294658,0.8191023989,-3.1197056368,0.8231978900,,, +28.2363281250,28,-2.9028826473,0.6973446388,-2.8250936734,0.7022521145,,, +28.2382812500,28,-2.5144762333,0.5720396325,-2.4462827052,0.5771581357,,, +28.2402343750,28,-2.0554615949,0.4434275064,-1.9990886739,0.4482894834,,, +28.2421875000,28,-1.5525394731,0.3145369472,-1.5094089842,0.3188147427,,, +28.2441406250,28,-1.0402597408,0.1905272353,-1.0107885558,0.1940357156,,, +28.2460937500,28,-0.5572059400,0.0778622111,-0.5407093187,0.0805518171,,, +28.2480468750,28,-0.1411203358,-0.0161494270,-0.1358640603,-0.0142273033,,, +28.2500000000,28,0.1766488952,-0.0840694106,0.1732324087,-0.0828223520,,, +28.2519531250,28,0.3760792718,-0.1202599284,0.3670631885,-0.1196000607,,, +28.2539062500,28,0.4510446420,-0.1228600492,0.4396475834,-0.1227138492,,, +28.2558593750,28,0.4088768215,-0.0940852983,0.3981262710,-0.0943892742,,, +28.2578125000,28,0.2685291889,-0.0397446743,0.2609740798,-0.0404374175,,, +28.2597656250,28,0.0589385321,0.0307415451,0.0564172719,0.0297429836,,, +28.2617187500,28,-0.1835756527,0.1050077880,-0.1800980301,0.1038355741,,, +28.2636718750,28,-0.4199113448,0.1695135020,-0.4104003541,0.1683653075,,, +28.2656250000,28,-0.6128526624,0.2107483223,-0.5981396861,0.2099074303,,, +28.2675781250,28,-0.7302588116,0.2160039460,-0.7118924128,0.2158625026,,, +28.2695312500,28,-0.7477173873,0.1746737259,-0.7277622383,0.1757394769,,, +28.2714843750,28,-0.6513253807,0.0791115793,-0.6320935204,0.0820109174,,, +28.2734375000,28,-0.4402101278,-0.0747244144,-0.4239277167,-0.0692435194,,, +28.2753906250,28,-0.1285402058,-0.2854651951,-0.1169969651,-0.2765674920,,, +28.2773437500,28,0.2545291198,-0.5446376138,0.2602829013,-0.5314856670,,, +28.2792968750,28,0.6689741831,-0.8366574745,0.6687942681,-0.8185318789,,, +28.2812500000,28,1.0703319767,-1.1397173661,1.0649589030,-1.1161639308,,, +28.2832031250,28,1.4152568133,-1.4272644801,1.4061513020,-1.3982437915,,, +28.2851562500,28,1.6662278543,-1.6707836611,1.6553253179,-1.6367785336,,, +28.2871093750,28,1.7960707632,-1.8433762460,1.7854824955,-1.8054319451,,, +28.2890625000,28,1.7915853387,-1.9235156356,1.7832808342,-1.8831998685,,, +28.2910156250,28,1.6559046179,-1.8989717654,1.6514212923,-1.8582390526,,, +28.2929687500,28,1.4090966936,-1.7694642960,1.4093014288,-1.7304465421,,, +28.2949218750,28,1.0862458243,-1.5463450718,1.0911528589,-1.5111329462,,, +28.2968750000,28,0.7334869985,-1.2502804216,0.7421460837,-1.2207371774,,, +28.2988281250,28,0.4025559071,-0.9085089636,0.4130471361,-0.8861186722,,, +28.3007812500,28,0.1436747605,-0.5513403171,0.1532433005,-0.5371010435,,, +28.3027343750,28,-0.0014904069,-0.2084935423,0.0038327357,-0.2028622561,,, +28.3046875000,28,-0.0043084022,0.0930050276,-0.0067651327,0.0901394375,,, +28.3066406250,28,0.1486045142,0.3306503631,0.1349999813,0.3199559957,,, +28.3085937500,28,0.4543901950,0.4896053009,0.4267626569,0.4722110793,,, +28.3105468750,28,0.8941041764,0.5642416802,0.8503498248,0.5415929071,,, +28.3125000000,28,1.4333813783,0.5559177728,1.3724811369,0.5296866805,,, +28.3144531250,28,2.0238067524,0.4701385176,1.9461679201,0.4422026151,,, +28.3164062500,28,2.6067400136,0.3155431810,2.5144394405,0.2879623163,,, +28.3183593750,28,3.1198278844,0.1037446770,3.0166482701,0.0786942986,,, +28.3203125000,28,3.5047170971,-0.1500622800,3.3959182701,-0.1704309341,,, +28.3222656250,28,3.7144863401,-0.4253349837,3.6062908668,-0.4391376418,,, +28.3242187500,28,3.7189518035,-0.6954015555,3.6178400356,-0.7013222425,,, +28.3261718750,28,3.5063720274,-0.9297381670,3.4183835789,-0.9272752681,,, +28.3281250000,28,3.0816633664,-1.0979314186,3.0118619916,-1.0875151591,,, +28.3300781250,28,2.4625534379,-1.1733784026,2.4147148004,-1.1563526407,,, +28.3320312500,28,1.6760284571,-1.1367571663,1.6525352653,-1.1152341773,,, +28.3339843750,28,0.7563587922,-0.9782002738,0.7582182756,-0.9548369034,,, +28.3359375000,28,-0.2566084258,-0.6968323929,-0.2297030897,-0.6746055021,,, +28.3378906250,28,-1.3203099416,-0.2998449463,-1.2698497917,-0.2818320087,,, +28.3398437500,28,-2.3928408033,0.1974720782,-2.3212614198,0.2083377466,,, +28.3417968750,28,-3.4351024825,0.7730164875,-3.3455090572,0.7741688402,,, +28.3437500000,28,-4.4105585068,1.4007123462,-4.3065337690,1.3900923790,,, +28.3457031250,28,-5.2835682417,2.0522191794,-5.1690790105,2.0283540481,,, +28.3476562500,28,-6.0189420029,2.6967973217,-5.8982564358,2.6588802949,,, +28.3496093750,28,-6.5838049688,3.3007658310,-6.4613359826,3.2487642108,,, +28.3515625000,28,-6.9507321271,3.8280489713,-6.8307955131,3.7628165796,,, +28.3535156250,28,-7.1013046356,4.2430133835,-6.9878396772,4.1663433552,,, +28.3554687500,28,-7.0292989676,4.5153708458,-6.9256188235,4.4299253456,,, +28.3574218750,28,-6.7414702085,4.6243228696,-6.6500992047,4.5334449635,,, +28.3593750000,28,-6.2546723395,4.5598097463,-6.1773100239,4.4672772969,,, +28.3613281250,28,-5.5916529152,4.3225772682,-5.5292754042,4.2323249356,,, +28.3632812500,28,-4.7784620109,3.9242250065,-4.7315084186,3.8400459042,,, +28.3652343750,28,-3.8434310551,3.3856567223,-3.8119820879,3.3109410381,,, +28.3671875000,28,-2.8166813184,2.7345526117,-2.8005867463,2.6720956965,,, +28.3691406250,28,-1.7294436446,2.0037211596,-1.7284279419,1.9555744944,,, +28.3710937500,28,-0.6128674288,1.2293202972,-0.6266261553,1.1966861575,,, +28.3730468750,28,0.5025505641,0.4482948361,0.4743045534,0.4314919744,,, +28.3750000000,28,1.5865526467,-0.3034650027,1.5441053273,-0.3049792069,,, +28.3769531250,28,2.6096331995,-0.9926614272,2.5533104580,-0.9802268784,,, +28.3789062500,28,3.5450137166,-1.5915909978,3.4752406353,-1.5672044743,,, +28.3808593750,28,4.3706947243,-2.0813062381,4.2880754667,-2.0473995651,,, +28.3828125000,28,5.0708735931,-2.4530315987,4.9762655678,-2.4122151024,,, +28.3847656250,28,5.6361965959,-2.7091307073,5.5308040054,-2.6639075196,,, +28.3867187500,28,6.0628254587,-2.8633890740,5.9483313937,-2.8158530612,,, +28.3886718750,28,6.3512886384,-2.9381094203,6.2299465087,-2.8897199563,,, +28.3906250000,28,6.5058886909,-2.9600434194,6.3805236636,-2.9115154933,,, +28.3925781250,28,6.5347117346,-2.9582549861,6.4086650449,-2.9095114102,,, +28.3945312500,28,6.4487862134,-2.9620179294,6.3258300432,-2.9121976062,,, +28.3964843750,28,6.2596096409,-2.9970590259,6.1438389015,-2.9446212999,,, +28.3984375000,28,5.9771323473,-3.0820040116,5.8728237534,-3.0249269229,,, +28.4003906250,28,5.6090731475,-3.2264482680,5.5205130537,-3.1624811262,,, +28.4023437500,28,5.1602708942,-3.4302727721,5.0915841477,-3.3572066788,,, +28.4042968750,28,4.6324524990,-3.6841055024,4.5874501135,-3.6000303107,,, +28.4062500000,28,4.0255681946,-3.9706727354,4.0075888719,-3.8742027791,,, +28.4082031250,28,3.3404968381,-4.2660262634,3.3521963173,-4.1565059275,,, +28.4101562500,28,2.5817483133,-4.5413430347,2.6248525691,-4.4190143930,,, +28.4121093750,28,1.7589344855,-4.7664174082,1.8340417763,-4.6324915285,,, +28.4140625000,28,0.8872406401,-4.9124449436,0.9936849354,-4.7690916559,,, +28.4160156250,28,-0.0129009988,-4.9518487357,0.1228195536,-4.8021887265,,, +28.4179687500,28,-0.9174494368,-4.8581082009,-0.7559915232,-4.7062004001,,, +28.4199218750,28,-1.8015369742,-4.6086457031,-1.6192765390,-4.4593723007,,, +28.4218750000,28,-2.6422114271,-4.1884833823,-2.4452117771,-4.0473096975,,, +28.4238281250,28,-3.4193663255,-3.5916674997,-3.2144837382,-3.4643536048,,, +28.4257812500,28,-4.1147276334,-2.8206676358,-3.9093234844,-2.7130030263,,, +28.4277343750,28,-4.7114277218,-1.8847977164,-4.5131365937,-1.8023852784,,, +28.4296875000,28,-5.1952488483,-0.7995884409,-5.0117247423,-0.7476401612,,, +28.4316406250,28,-5.5560652266,0.4104197769,-5.3946061200,0.4273799169,,, +28.4335937500,28,-5.7893226064,1.7077543444,-5.6563410276,1.6863150866,,, +28.4355468750,28,-5.8982721597,3.0424239906,-5.7987070630,2.9807117527,,, +28.4375000000,28,-5.8956125556,4.3567440143,-5.8324222098,4.2547104513,,, +28.4394531250,28,-5.8021155161,5.5906406596,-5.7759586505,5.4501817750,,, +28.4414062500,28,-5.6418097063,6.6864153655,-5.6510069875,6.5113205142,,, +28.4433593750,28,-5.4356996785,7.5929728032,-5.4765060375,7.3887126105,,, +28.4453125000,28,-5.1962900047,8.2686361765,-5.2634137459,8.0420370107,,, +28.4472656250,28,-4.9245041220,8.6835572823,-5.0117873386,8.4423871395,,, +28.4492187500,28,-4.6094005404,8.8221539472,-4.7105751753,8.5746328550,,, +28.4511718750,28,-4.2300951103,8.6836503412,-4.3394945448,8.4379537878,,, +28.4531250000,28,-3.7598544237,8.2809224665,-3.8729672886,8.0447397504,,, +28.4550781250,28,-3.1725396910,7.6394149824,-3.2863361538,7.4195705741,,, +28.4570312500,28,-2.4505673376,6.7953124599,-2.5635316133,6.5974788946,,, +28.4589843750,28,-1.5913631692,5.7928721192,-1.7032563750,5.6213914409,,, +28.4609375000,28,-0.6085807491,4.6834279941,-0.7201417931,4.5411647281,,, +28.4628906250,28,0.4716160589,3.5250630532,0.3588615374,3.4132450678,,, +28.4648437500,28,1.6162422179,2.3790809161,1.5000936574,2.2972186407,,, +28.4667968750,28,2.7911815750,1.3037729809,2.6688722099,1.2497423397,,, +28.4687500000,28,3.9648431316,0.3485885267,3.8331983105,0.3188769551,,, +28.4707031250,28,5.1084405420,-0.4512313302,4.9641775696,-0.4611125107,,, +28.4726562500,28,6.1938269786,-1.0799742235,6.0340710804,-1.0748997431,,, +28.4746093750,28,7.1906807471,-1.5439238347,7.0136383389,-1.5284711336,,, +28.4765625000,28,8.0645777119,-1.8690236916,7.8702061774,-1.8468492565,,, +28.4785156250,28,8.7769820966,-2.0952172506,8.5675042863,-2.0686053216,,, +28.4804687500,28,9.2878356153,-2.2682642789,9.0679487157,-2.2379389118,,, +28.4824218750,28,9.5608387547,-2.4302936982,9.3374995203,-2.3955462737,,, +28.4843750000,28,9.5681685740,-2.6145824610,9.3500894920,-2.5735814758,,, +28.4863281250,28,9.2909221281,-2.8470699984,9.0880967031,-2.7971250157,,, +28.4882812500,28,8.7184424056,-3.1481801626,8.5417423295,-3.0859453218,,, +28.4902343750,28,7.8501870405,-3.5297519759,7.7108170355,-3.4515326974,,, +28.4921875000,28,6.6964032962,-3.9908463295,6.6052180478,-3.8930400232,,, +28.4941406250,28,5.2756709319,-4.5165974696,5.2425339811,-4.3961607980,,, +28.4960937500,28,3.6142761338,-5.0792393552,3.6474657222,-4.9341220696,,, +28.4980468750,28,1.7492662610,-5.6404526688,1.8548536625,-5.4699714112,,, +28.5000000000,28,-0.2688093890,-6.1546791728,-0.0875716793,-5.9597984723,,, +28.5019531250,28,-2.3752033864,-6.5718627878,-2.1184370729,-6.3553919205,,, +28.5039062500,28,-4.4920291844,-6.8405596830,-4.1636653481,-6.6072462267,,, +28.5058593750,28,-6.5328939524,-6.9140243600,-6.1407959971,-6.6704363093,,, +28.5078125000,28,-8.4103082869,-6.7577451190,-7.9659577871,-6.5118847721,,, +28.5097656250,28,-10.0418282489,-6.3544984175,-9.5596817953,-6.1152311291,,, +28.5117187500,28,-11.3549873398,-5.7064351725,-10.8516246639,-5.4828315375,,, +28.5136718750,28,-12.2934516215,-4.8351698159,-11.7865348883,-4.6358204934,,, +28.5156250000,28,-12.8218330867,-3.7787156872,-12.3290075670,-3.6111249624,,, +28.5175781250,28,-12.9251253126,-2.5861442002,-12.4630884159,-2.4562956908,,, +28.5195312500,28,-12.6050192585,-1.3134262282,-12.1888187041,-1.2254952817,,, +28.5214843750,28,-11.8783344146,-0.0201369645,-11.5208075380,0.0236853678,,, +28.5234375000,28,-10.7771751882,1.2352648597,-10.4885182313,1.2347966973,,, +28.5253906250,28,-9.3468961035,2.4002829054,-9.1344333086,2.3572126243,,, +28.5273437500,28,-7.6424878329,3.4315119260,-7.5106391707,3.3491443199,,, +28.5292968750,28,-5.7263044994,4.2965752161,-5.6766780075,4.1795054603,,, +28.5312500000,28,-3.6667602156,4.9747143694,-3.6983018502,4.8284758588,,, +28.5332031250,28,-1.5368065408,5.4556144706,-1.6459640802,5.2863559670,,, +28.5351562500,28,0.5878723306,5.7386326355,0.4069516177,5.5528111805,,, +28.5371093750,28,2.6319120061,5.8335933097,2.3870682656,5.6376288639,,, +28.5390625000,28,4.5250780708,5.7609982826,4.2256747402,5.5609033484,,, +28.5410156250,28,6.2068233975,5.5511962217,5.8631698801,5.3522156805,,, +28.5429687500,28,7.6284661953,5.2435101094,7.2512002532,5.0497816286,,, +28.5449218750,28,8.7532986410,4.8830277955,8.3528572556,4.6973452572,,, +28.5468750000,28,9.5569682524,4.5138760693,9.1432396169,4.3376689076,,, +28.5488281250,28,10.0292987915,4.1727445542,9.6114063382,4.0062618054,,, +28.5507812500,28,10.1753437413,3.8848510899,9.7615163278,3.7274756308,,, +28.5527343750,28,10.0139960217,3.6612617596,9.6115589352,3.5119198719,,, +28.5546875000,28,9.5759209092,3.4984140901,9.1913649807,3.3560116946,,, +28.5566406250,28,8.9026622279,3.3813331410,8.5416502003,3.2450953677,,, +28.5585937500,28,8.0458338649,3.2891086763,7.7130761464,3.1587485105,,, +28.5605468750,28,7.0640448132,3.2002701109,6.7631140339,3.0759950620,,, +28.5625000000,28,6.0176115310,3.0960758723,5.7508202982,2.9785051685,,, +28.5644531250,28,4.9633799681,2.9597209225,4.7318347141,2.8498435982,,, +28.5664062500,28,3.9516841275,2.7733092172,3.7555154779,2.6725485477,,, +28.5683593750,28,3.0253619806,2.5178386900,2.8639841059,2.4281190541,,, +28.5703125000,28,2.2175421310,2.1764406356,2.0898835753,2.1001541132,,, +28.5722656250,28,1.5470645787,1.7368708350,1.4518613158,1.6767734713,,, +28.5742187500,28,1.0163403244,1.1935534061,0.9524312608,1.1525978506,,, +28.5761718750,28,0.6138958186,0.5508438246,0.5803471218,0.5318952544,,, +28.5781250000,28,0.3179204026,-0.1759966574,0.3140150118,-0.1704894927,,, +28.5800781250,28,0.0987735383,-0.9639713645,0.1240162286,-0.9322115964,,, +28.5820312500,28,-0.0788559775,-1.7857974603,-0.0246991747,-1.7267712102,,, +28.5839843750,28,-0.2539881230,-2.6127974918,-0.1708258123,-2.5263173352,,, +28.5859375000,28,-0.4663793603,-3.4191696411,-0.3536951190,-3.3057867456,,, +28.5878906250,28,-0.7510412605,-4.1855578054,-0.6078513582,-4.0463704585,,, +28.5898437500,28,-1.1325931319,-4.8998228630,-0.9575464624,-4.7362719256,,, +28.5917968750,28,-1.6225112426,-5.5557275416,-1.4141063887,-5.3694392740,,, +28.5937500000,28,-2.2180021388,-6.1494268294,-1.9749375733,-5.9421712446,,, +28.5957031250,28,-2.9025233777,-6.6752087343,-2.6241546566,-6.4489947533,,, +28.5976562500,28,-3.6515228082,-7.1249412278,-3.3381671695,-6.8821153193,,, +28.5996093750,28,-4.4406965100,-7.4908956052,-4.0936139168,-7.2341279374,,, +28.6015625000,28,-5.2491189993,-7.7660958705,-4.8703917312,-7.4983479952,,, +28.6035156250,28,-6.0560268762,-7.9408681480,-5.6486334195,-7.6654819931,,, +28.6054687500,28,-6.8359824724,-8.0001559095,-6.4040903775,-7.7210418790,,, +28.6074218750,28,-7.5562728241,-7.9242170565,-7.1055864847,-7.6460238011,,, +28.6093750000,28,-8.1771170119,-7.6914683028,-7.7151356763,-7.4196564901,,, +28.6113281250,28,-8.6534990513,-7.2819097973,-8.1896206272,-7.0227068715,,, +28.6132812500,28,-8.9382754637,-6.6802134525,-8.4837187407,-6.4404577015,,, +28.6152343750,28,-8.9871349074,-5.8783426007,-8.5546402297,-5.6652285801,,, +28.6171875000,28,-8.7655570201,-4.8789648764,-8.3687847102,-4.6996606503,,, +28.6191406250,28,-8.2553423573,-3.6987543504,-7.9079852334,-3.5598961448,,, +28.6210937500,28,-7.4566008812,-2.3672889062,-7.1714720156,-2.2745096476,,, +28.6230468750,28,-6.3857157863,-0.9218567400,-6.1740484480,-0.8794934460,,, +28.6250000000,28,-5.0742750824,0.5952007912,-4.9451330315,0.5843064296,,, +28.6269531250,28,-3.5702241518,2.1350348870,-3.5298376549,2.0697838886,,, +28.6289062500,28,-1.9372010406,3.6427637598,-1.9883375497,3.5240277233,,, +28.6308593750,28,-0.2494411402,5.0622669806,-0.3910652246,4.8929443849,,, +28.6328125000,28,1.4161135584,6.3424710284,1.1887667795,6.1273175698,,, +28.6347656250,28,2.9878208210,7.4432574173,2.6827669158,7.1885034992,,, +28.6367187500,28,4.4047002738,8.3373517770,4.0325163155,8.0502471945,,, +28.6386718750,28,5.6166172445,9.0058499593,5.1898792076,8.6943588638,,, +28.6406250000,28,6.5810716472,9.4346211692,6.1139908463,9.1072441910,,, +28.6425781250,28,7.2623818251,9.6176766708,6.7703662806,9.2831621398,,, +28.6445312500,28,7.6361625107,9.5617821098,7.1351138952,9.2286755474,,, +28.6464843750,28,7.6965473968,9.2867063399,7.2019433580,8.9628809759,,, +28.6484375000,28,7.4611281849,8.8224100117,6.9870466241,8.5146860201,,, +28.6503906250,28,6.9693583913,8.2038120834,6.5277035406,7.9177570751,,, +28.6523437500,28,6.2752335696,7.4647045075,5.8753534943,7.2046527522,,, +28.6542968750,28,5.4405791272,6.6356431227,5.0891394887,6.4047979386,,, +28.6562500000,28,4.5318864484,5.7446858858,4.2328142473,5.5452033291,,, +28.6582031250,28,3.6160882290,4.8148104598,3.3707138244,4.6479775896,,, +28.6601562500,28,2.7533487675,3.8600459957,2.5608692551,3.7266005886,,, +28.6621093750,28,1.9914315946,2.8877562626,1.8494674786,2.7881362503,,, +28.6640625000,28,1.3634214988,1.9052455841,1.2684416409,1.8396156715,,, +28.6660156250,28,0.8867835189,0.9233040873,0.8344500543,0.8914603514,,, +28.6679687500,28,0.5639783734,-0.0432793948,0.5494567918,-0.0420263669,,, +28.6699218750,28,0.3854899624,-0.9754273538,0.4036622967,-0.9423858666,,, +28.6718750000,28,0.3338282013,-1.8518366495,0.3794517829,-1.7890043181,,, +28.6738281250,28,0.3863704587,-2.6537073657,0.4542952013,-2.5636854386,,, +28.6757812500,28,0.5153505122,-3.3681378051,0.6008369989,-3.2539305366,,, +28.6777343750,28,0.6854790277,-3.9891305885,0.7846140324,-3.8539080807,,, +28.6796875000,28,0.8532597179,-4.5174498149,0.9633867129,-4.3643153544,,, +28.6816406250,28,0.9715035662,-4.9587918748,1.0914704476,-4.7906163462,,, +28.6835937500,28,0.9979104191,-5.3208288274,1.1279858929,-5.1401938604,,, +28.6855468750,28,0.9043497886,-5.6107745936,1.0458049077,-5.4200060325,,, +28.6875000000,28,0.6842336979,-5.8323607657,0.8386257558,-5.6336697723,,, +28.6894531250,28,0.3554547440,-5.9820301999,0.5237162157,-5.7777842680,,, +28.6914062500,28,-0.0438401940,-6.0495818603,0.1378279801,-5.8425472990,,, +28.6933593750,28,-0.4668130037,-6.0258399952,-0.2738086988,-5.8191496752,,, +28.6953125000,28,-0.8719284030,-5.9105363676,-0.6708468797,-5.7073744834,,, +28.6972656250,28,-1.2324637313,-5.7138752359,-1.0270169628,-5.5171007311,,, +28.6992187500,28,-1.5380364536,-5.4516620120,-1.3317573012,-5.2635991121,,, +28.7011718750,28,-1.7896625097,-5.1360667652,-1.5856896703,-4.9586185124,,, +28.7031250000,28,-1.9936536100,-4.7677721155,-1.7949254620,-4.6028108367,,, +28.7050781250,28,-2.1581543877,-4.3356714284,-1.9677110939,-4.1854444047,,, +28.7070312500,28,-2.2899670688,-3.8212259980,-2.1112126134,-3.6886147060,,, +28.7089843750,28,-2.3893371381,-3.2025090667,-2.2263272260,-3.0911526005,,, +28.7109375000,28,-2.4469107797,-2.4612385496,-2.3045148262,-2.3754152819,,, +28.7128906250,28,-2.4471690989,-1.5940061047,-2.3307972876,-1.5381237336,,, +28.7148437500,28,-2.3756314421,-0.6192114099,-2.2905495156,-0.5970512205,,, +28.7167968750,28,-2.2242099127,0.4250611368,-2.1747661528,0.4110311441,,, +28.7187500000,28,-1.9923639039,1.4880734683,-1.9813944792,1.4371436710,,, +28.7207031250,28,-1.6855559500,2.5152955711,-1.7141000960,2.4286523771,,, +28.7226562500,28,-1.3135365151,3.4572443652,-1.3808662690,3.3378001649,,, +28.7246093750,28,-0.8892591326,4.2738636094,-0.9930721450,4.1259331642,,, +28.7265625000,28,-0.4283518956,4.9330437798,-0.5649352401,4.7620705212,,, +28.7285156250,28,0.0504937482,5.4074232749,-0.1137934718,5.2198159510,,, +28.7304687500,28,0.5247683594,5.6732557426,0.3391951257,5.4762640962,,, +28.7324218750,28,0.9675833785,5.7110321587,0.7684878427,5.5126005697,,, +28.7343750000,28,1.3470503883,5.5065981412,1.1435197035,5.3151797902,,, +28.7363281250,28,1.6268537928,5.0535228242,1.4291879914,4.8778102498,,, +28.7382812500,28,1.7697748726,4.3573423737,1.5891489621,4.2058482349,,, +28.7402343750,28,1.7439678020,3.4411835396,1.5917479136,3.3216227898,,, +28.7421875000,28,1.5299726225,2.3509793682,1.4166780311,2.2694670054,,, +28.7441406250,28,1.1258551588,1.1553816026,1.0599791639,1.1156319143,,, +28.7460937500,28,0.5495859152,-0.0626998957,0.5366067132,-0.0598785682,,, +28.7480468750,28,-0.1614105525,-1.2182828088,-0.1196364349,-1.1750657498,,, +28.7500000000,28,-0.9546361867,-2.2348588607,-0.8600375583,-2.1561111394,,, +28.7519531250,28,-1.7697274879,-3.0533833141,-1.6277076417,-2.9460485172,,, +28.7539062500,28,-2.5451688438,-3.6381260069,-2.3639291720,-3.5104075539,,, +28.7558593750,28,-3.2233249390,-3.9757548820,-3.0130753427,-3.8363275576,,, +28.7578125000,28,-3.7541248748,-4.0709876367,-3.5263231595,-3.9283605771,,, +28.7597656250,28,-4.0970653670,-3.9438067312,-3.8636853447,-3.8057837991,,, +28.7617187500,28,-4.2216102927,-3.6256053218,-3.9945159196,-3.4988808682,,, +28.7636718750,28,-4.1074408689,-3.1525024133,-3.8979569712,-3.0424924592,,, +28.7656250000,28,-3.7464739299,-2.5606219588,-3.5650452326,-2.4714626595,,, +28.7675781250,28,-3.1464657159,-1.8848494546,-3.0022548684,-1.8194413901,,, +28.7695312500,28,-2.3325141022,-1.1576811047,-2.2329943072,-1.1177761903,,, +28.7714843750,28,-1.3440856744,-0.4078932267,-1.2947571340,-0.3942296039,,, +28.7734375000,28,-0.2309655508,0.3394241816,-0.2351836498,0.3269880767,,, +28.7753906250,28,0.9483173790,1.0621303666,0.8894921821,1.0245070594,,, +28.7773437500,28,2.1272352012,1.7395288535,2.0152121486,1.6783453416,,, +28.7792968750,28,3.2352966214,2.3513054802,3.0740499666,2.2688846787,,, +28.7812500000,28,4.2070477615,2.8812057596,4.0028514539,2.7804207399,,, +28.7832031250,28,4.9914749891,3.3225526349,4.7522098616,3.2064893841,,, +28.7851562500,28,5.5556277463,3.6770503775,5.2900258639,3.5487149339,,, +28.7871093750,28,5.8835590015,3.9492779157,5.6006461640,3.8114991108,,, +28.7890625000,28,5.9756886979,4.1459043440,5.6842692810,4.0012654013,,, +28.7910156250,28,5.8479650356,4.2765528224,5.5561043128,4.1272933039,,, +28.7929687500,28,5.5275585560,4.3486580059,5.2423416085,4.1967574483,,, +28.7949218750,28,5.0476021840,4.3621563716,4.7752007425,4.2096050972,,, +28.7968750000,28,4.4438159995,4.3109217074,4.1896047016,4.1599400220,,, +28.7988281250,28,3.7510354960,4.1858634413,3.5197088531,4.0390094470,,, +28.8007812500,28,2.9992149533,3.9763726080,2.7949696511,3.8365963855,,, +28.8027343750,28,2.2115868547,3.6725878771,2.0382847786,3.5432035860,,, +28.8046875000,28,1.4057358492,3.2673855012,1.2669762016,3.1519726347,,, +28.8066406250,28,0.5957137458,2.7565860289,0.4948404456,2.6588839368,,, +28.8085937500,28,-0.2056839794,2.1399196638,-0.2656671780,2.0636886667,,, +28.8105468750,28,-0.9846130876,1.4226602403,-1.0012409197,1.3714857713,,, +28.8125000000,28,-1.7252804265,0.6144998225,-1.6968145572,0.5916372108,,, +28.8144531250,28,-2.4104178368,-0.2721878496,-2.3359689519,-0.2639069457,,, +28.8164062500,28,-3.0216907167,-1.2206098182,-2.9013828700,-1.1789332975,,, +28.8183593750,28,-3.5408337371,-2.2068715989,-3.3760203640,-2.1303797577,,, +28.8203125000,28,-3.9525667164,-3.1992277901,-3.7459905506,-3.0876159295,,, +28.8222656250,28,-4.2470024698,-4.1579202181,-4.0028954221,-4.0122900595,,, +28.8242187500,28,-4.4190980988,-5.0360048656,-4.1432714641,-4.8591272618,,, +28.8261718750,28,-4.4666035906,-5.7834669987,-4.1664681452,-5.5798968177,,, +28.8281250000,28,-4.3880715676,-6.3523941753,-4.0725528794,-6.1283988665,,, +28.8300781250,28,-4.1804848268,-6.6998727990,-3.8599138953,-6.4632551080,,, +28.8320312500,28,-3.8390932646,-6.7923099232,-3.5249680113,-6.5520750522,,, +28.8339843750,28,-3.3627852222,-6.6135617185,-3.0671344640,-6.3792969811,,, +28.8359375000,28,-2.7610017335,-6.1691745875,-2.4954294926,-5.9502822470,,, +28.8378906250,28,-2.0554839406,-5.4822531392,-1.8302932812,-5.2873324039,,, +28.8398437500,28,-1.2772573725,-4.5878658259,-1.1008287341,-4.4242924476,,, +28.8417968750,28,-0.4633755540,-3.5306382746,-0.3417077555,-3.4042271577,,, +28.8437500000,28,0.3443872699,-2.3629617592,0.4080453824,-2.2776922966,,, +28.8457031250,28,1.0998049598,-1.1428179703,1.1052485256,-1.1006370091,,, +28.8476562500,28,1.7556668723,0.0692066207,1.7058426784,0.0684781117,,, +28.8496093750,28,2.2726141148,1.2152213330,2.1733246443,1.1738002156,,, +28.8515625000,28,2.6271654928,2.2446389692,2.4864129890,2.1665349384,,, +28.8535156250,28,2.8123120267,3.1145794704,2.6396143820,3.0053368587,,, +28.8554687500,28,2.8327763805,3.7890775021,2.6386364529,3.6555411101,,, +28.8574218750,28,2.7000144887,4.2403216762,2.4954866541,4.0903526808,,, +28.8593750000,28,2.4289788740,4.4498862281,2.2252849946,4.2920298777,,, +28.8613281250,28,2.0385217413,4.4102299714,1.8466095202,4.2533292521,,, +28.8632812500,28,1.5550609884,4.1292261964,1.3849224231,3.9818757874,,, +28.8652343750,28,1.0138217249,3.6338513265,0.8736632812,3.5037192907,,, +28.8671875000,28,0.4556265856,2.9685864190,0.3511752949,2.8617890921,,, +28.8691406250,28,-0.0766001992,2.1906636292,-0.1425492064,2.1113072143,,, +28.8710937500,28,-0.5406578139,1.3635526037,-0.5684157986,1.3135060096,,, +28.8730468750,28,-0.8980716040,0.5503084206,-0.8909434326,0.5292124554,,, +28.8750000000,28,-1.1159457087,-0.1884061757,-1.0800057322,-0.1830605391,,, +28.8769531250,28,-1.1702963489,-0.7947623794,-1.1140606248,-0.7675440457,,, +28.8789062500,28,-1.0543618148,-1.2211419019,-0.9880071205,-1.1783335888,,, +28.8808593750,28,-0.7860473573,-1.4403848560,-0.7201112475,-1.3892760204,,, +28.8828125000,28,-0.4062837603,-1.4490476985,-0.3503078905,-1.3971076831,,, +28.8847656250,28,0.0298402309,-1.2662839716,0.0683928103,-1.2203641428,,, +28.8867187500,28,0.4627753546,-0.9334228845,0.4793286111,-0.8989607975,,, +28.8886718750,28,0.8372358345,-0.5094742832,0.8305349030,-0.4898481240,,, +28.8906250000,28,1.1089104477,-0.0612276818,1.0809678633,-0.0574593619,,, +28.8925781250,28,1.2462926800,0.3445724646,1.2020426380,0.3338340391,,, +28.8945312500,28,1.2289380468,0.6452764210,1.1758120928,0.6236235475,,, +28.8964843750,28,1.0471423120,0.7874908063,0.9944933347,0.7604378284,,, +28.8984375000,28,0.7039587387,0.7328895899,0.6622498414,0.7073456643,,, +28.9003906250,28,0.2161778374,0.4624321194,0.1960134519,0.4460220602,,, +28.9023437500,28,-0.3868108369,-0.0190331303,-0.3757667001,-0.0188170597,,, +28.9042968750,28,-1.0635800457,-0.6792573933,-1.0137801072,-0.6560325554,,, +28.9062500000,28,-1.7596023071,-1.4608698185,-1.6667504242,-1.4102567376,,, +28.9082031250,28,-2.4076929584,-2.2888157125,-2.2716352927,-2.2090625225,,, +28.9101562500,28,-2.9345633818,-3.0816480644,-2.7596517668,-2.9738542367,,, +28.9121093750,28,-3.2744025567,-3.7671582362,-3.0690058038,-3.6349498161,,, +28.9140625000,28,-3.3824687040,-4.2942825073,-3.1577475901,-4.1430742346,,, +28.9160156250,28,-3.2410882960,-4.6322749437,-3.0096351763,-4.4685713320,,, +28.9179687500,28,-2.8595827642,-4.7645340510,-2.6342557946,-4.5954552645,,, +28.9199218750,28,-2.2728831857,-4.6882412103,-2.0656893811,-4.5210606088,,, +28.9218750000,28,-1.5381998906,-4.4161854284,-1.3592110414,-4.2577962410,,, +28.9238281250,28,-0.7277473917,-3.9735577456,-0.5843114424,-3.8300457652,,, +28.9257812500,28,0.0810176016,-3.3915982429,0.1846049405,-3.2680311236,,, +28.9277343750,28,0.8161070744,-2.7011645189,0.8784426937,-2.6015988865,,, +28.9296875000,28,1.4212971368,-1.9266930429,1.4432464238,-1.8543855159,,, +28.9316406250,28,1.8610133338,-1.0847575250,1.8449103079,-1.0424202853,,, +28.9335937500,28,2.1163546284,-0.1900061067,2.0654943680,-0.1798517128,,, +28.9355468750,28,2.1773848980,0.7378632670,2.0959407796,0.7143198986,,, +28.9375000000,28,2.0395145693,1.6733915936,1.9325750438,1.6155519919,,, +28.9394531250,28,1.7065697754,2.5911936616,1.5799109079,2.4993870340,,, +28.9414062500,28,1.1978951712,3.4738771697,1.0573156503,3.3490942654,,, +28.9433593750,28,0.5537685321,4.3155068671,0.4041714810,4.1590162157,,, +28.9453125000,28,-0.1646840084,5.1171673240,-0.3200682550,4.9302933652,,, +28.9472656250,28,-0.8806968747,5.8794351247,-1.0407131209,5.6636029435,,, +28.9492187500,28,-1.5112568235,6.5981033355,-1.6768419738,6.3550247478,,, +28.9511718750,28,-1.9789840598,7.2620833260,-2.1528001414,6.9940006996,,, +28.9531250000,28,-2.2232588114,7.8505130454,-2.4089376901,7.5605306853,,, +28.9550781250,28,-2.2076693903,8.3327904947,-2.4088592519,8.0251925023,,, +28.9570312500,28,-1.9230198493,8.6735096569,-2.1425056595,8.3538923156,,, +28.9589843750,28,-1.3889111122,8.8345675396,-1.6277589594,8.5098916245,,, +28.9609375000,28,-0.6556035700,8.7720694672,-0.9121588165,8.4508218781,,, +28.9628906250,28,0.1988589443,8.4385502508,-0.0701732424,8.1308286892,,, +28.9648437500,28,1.0810480893,7.7948737826,0.8084962049,7.5120566826,,, +28.9667968750,28,1.8996808366,6.8233451617,1.6355649165,6.5773110639,,, +28.9687500000,28,2.5793495133,5.5353973500,2.3372873686,5.3374858167,,, +28.9707031250,28,3.0672368664,3.9726720768,2.8609586486,3.8326160971,,, +28.9726562500,28,3.3343742759,2.2009244304,3.1763296029,2.1260075970,,, +28.9746093750,28,3.3733142823,0.3002483055,3.2736473584,0.2948153812,,, +28.9765625000,28,3.1961629207,-1.6413066193,3.1619400491,-1.5761089375,,, +28.9785156250,28,2.8354931899,-3.5300338278,2.8699779048,-3.3964303643,,, +28.9804687500,28,2.3446690514,-5.2706975983,2.4467178183,-5.0743065477,,, +28.9824218750,28,1.7936687365,-6.7745731158,1.9574899784,-6.5241407803,,, +28.9843750000,28,1.2599453049,-7.9689204519,1.4753993591,-7.6757247025,,, +28.9863281250,28,0.8164192981,-8.8053399216,1.0699010161,-8.4823080586,,, +28.9882812500,28,0.5219048697,-9.2630311599,0.7975843326,-8.9237544396,,, +28.9902343750,28,0.4168644077,-9.3462791175,0.6979626123,-9.0041261508,,, +28.9921875000,28,0.5201338132,-9.0825257978,0.7902256369,-8.7498318792,,, +28.9941406250,28,0.8239224007,-8.5235049557,1.0684087656,-8.2107282983,,, +28.9960937500,28,1.2913335819,-7.7440388951,1.4989422655,-7.4589650254,,, +28.9980468750,28,1.8597818426,-6.8350793566,2.0237592033,-6.5822742031,,, +29.0000000000,29,2.4497115712,-5.8917266317,2.5684062364,-5.6724123528,33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538:33538,1.0000000000:2.0000000000:3.0000000000:4.0000000000:5.0000000000:6.0000000000:7.0000000000:8.0000000000:9.0000000000:10.0000000000:11.0000000000:12.0000000000:13.0000000000:14.0000000000:15.0000000000:19.0000000000:20.0000000000:21.0000000000:22.0000000000:23.0000000000:24.0000000000:25.0000000000:26.0000000000:27.0000000000:28.0000000000:29.0000000000,0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000:0.0000000000 +29.0019531250,29,2.9779130568,-4.9978079098,3.0545212239,-4.8102808706,,, +29.0039062500,29,3.3720529006,-4.2126336107,3.4135608287,-4.0531428003,,, +29.0058593750,29,3.5806007756,-3.5658873960,3.5963018241,-3.4296824459,,, +29.0078125000,29,3.5770420663,-3.0586588492,3.5769733562,-2.9409933398,,, +29.0097656250,29,3.3592604104,-2.6673469611,3.3527781052,-2.5643401180,,, +29.0117187500,29,2.9436942531,-2.3516573693,2.9384552823,-2.2608732287,,, +29.0136718750,29,2.3584551230,-2.0641454315,2.3598814515,-1.9848347168,,, +29.0156250000,29,1.6393652767,-1.7573235375,1.6504364202,-1.6904124216,,, +29.0175781250,29,0.8259921664,-1.3905782249,0.8473600576,-1.3384109424,,, +29.0195312500,29,-0.0436987190,-0.9371095170,-0.0132348845,-0.9029463098,,, +29.0214843750,29,-0.9352704333,-0.3841517838,-0.8982309785,-0.3716619920,,, +29.0234375000,29,-1.8143153666,0.2745451512,-1.7743357101,0.2615210551,,, +29.0253906250,29,-2.6432419070,1.0432580851,-2.6050962170,1.0007858012,,, +29.0273437500,29,-3.3830919859,1.9193047792,-3.3525124512,1.8436125858,,, +29.0292968750,29,-3.9983177750,2.8857337782,-3.9814576804,2.7737280573,,, +29.0312500000,29,-4.4614168377,3.9086599553,-4.4641064656,3.7585303483,,, +29.0332031250,29,-4.7566306440,4.9379672293,-4.7835562913,4.7497599698,,, +29.0351562500,29,-4.8820005132,5.9110941900,-4.9359468819,5.6871437242,,, +29.0371093750,29,-4.8499535049,6.7604662936,-4.9312626708,6.5055544396,,, +29.0390625000,29,-4.6874208492,7.4197638758,-4.7936438169,7.1410498635,,, +29.0410156250,29,-4.4337253619,7.8282235709,-4.5594644032,7.5350205017,,, +29.0429687500,29,-4.1335045154,7.9391000859,-4.2707091563,7.6423540367,,, +29.0449218750,29,-3.8274485773,7.7298705953,-3.9662781334,7.4412823254,,, +29.0468750000,29,-3.5474152869,7.2053147758,-3.6773281381,6.9363570731,,, +29.0488281250,29,-3.3166474614,6.3942421734,-3.4273819522,6.1552964829,,, +29.0507812500,29,-3.1509712651,5.3444377478,-3.2333363488,5.1441135355,,, +29.0527343750,29,-3.0601212745,4.1151357851,-3.1065164138,3.9598626677,,, +29.0546875000,29,-3.0483783205,2.7693696982,-3.0530573191,2.6632679537,,, +29.0566406250,29,-3.1121449162,1.3706105998,-3.0714398082,1.3154883980,,, +29.0585937500,29,-3.2367962856,-0.0190584260,-3.1493687842,-0.0236360166,,, +29.0605468750,29,-3.3962021937,-1.3420772434,-3.2632103581,-1.2986040757,,, +29.0625000000,29,-3.5529981258,-2.5463163788,-3.3782277391,-2.4591284514,,, +29.0644531250,29,-3.6586422410,-3.5839979091,-3.4486706662,-3.4590962026,,, +29.0664062500,29,-3.6573157575,-4.4138711474,-3.4215036235,-4.2586714931,,, +29.0683593750,29,-3.4938787601,-5.0049942064,-3.2440305186,-4.8279521388,,, +29.0703125000,29,-3.1202286138,-5.3375982563,-2.8700557032,-5.1478127165,,, +29.0722656250,29,-2.4986374017,-5.4032218941,-2.2631277443,-5.2100394820,,, +29.0742187500,29,-1.6064761646,-5.2057508543,-1.4011044226,-5.0183397878,,, +29.0761718750,29,-0.4438637191,-4.7609502276,-0.2836105645,-4.5879037054,,, +29.0781250000,29,0.9596097165,-4.0956706797,1.0613945844,-3.9446499539,,, +29.0800781250,29,2.5432384538,-3.2488284449,2.5760485282,-3.1261725925,,, +29.0820312500,29,4.2189114146,-2.2717732284,4.1762078819,-2.1820893248,,, +29.0839843750,29,5.8770933715,-1.2276167974,5.7572483499,-1.1733848059,,, +29.0859375000,29,7.3954253055,-0.1899783096,7.2023950439,-0.1711878272,,, +29.0878906250,29,8.6537663456,0.7642333667,8.3971352355,0.7502071687,,, +29.0898437500,29,9.5508995238,1.5675438190,9.2450785217,1.5256267168,,, +29.0917968750,29,10.0130138951,2.1692144039,9.6759832405,2.1060667376,,, +29.0937500000,29,9.9949924023,2.5347304541,9.6470252665,2.4582013548,,, +29.0957031250,29,9.4812424126,2.6456706375,9.1436098579,2.5642582043,,, +29.0976562500,29,8.4862941126,2.5015386887,8.1798965526,2.4237841469,,, +29.0996093750,29,7.0535499386,2.1199699668,6.7975754476,2.0538421511,,, +29.1015625000,29,5.2541632987,1.5372434424,5.0647598218,1.4895026791,,, +29.1035156250,29,3.1869603920,0.8105498664,3.0758392044,0.7860288716,,, +29.1054687500,29,0.9759506341,0.0160328345,0.9491174264,0.0169849785,,, +29.1074218750,29,-1.2373975218,-0.7610848776,-1.1803969844,-0.7352896103,,, +29.1093750000,29,-3.3051651450,-1.4384017756,-3.1713333603,-1.3911644397,,, +29.1113281250,29,-5.0845691481,-1.9444679840,-4.8869806420,-1.8815702988,,, +29.1132812500,29,-6.4495921378,-2.2240779740,-6.2064393256,-2.1531173586,,, +29.1152343750,29,-7.3022548432,-2.2424024525,-7.0354613168,-2.1720941095,,, +29.1171875000,29,-7.5825251777,-1.9880166737,-7.3159971032,-1.9274006802,,, +29.1191406250,29,-7.2751842354,-1.4757090160,-7.0327885368,-1.4332655519,,, +29.1210937500,29,-6.4114820407,-0.7475328335,-6.2149464337,-0.7302613692,,, +29.1230468750,29,-5.0659252042,0.1310333127,-4.9329432209,0.1184002097,,, +29.1250000000,29,-3.3513296076,1.0764101245,-3.2939634724,1.0320069744,,, +29.1269531250,29,-1.4117574244,1.9902234378,-1.4351334978,1.9155428541,,, +29.1289062500,29,0.5903784138,2.7658760446,0.4888224627,2.6660405275,,, +29.1308593750,29,2.4903134474,3.2999093319,2.3207971600,3.1835540411,,, +29.1328125000,29,4.1330400776,3.5017447383,3.9127797023,3.3805641857,,, +29.1347656250,29,5.3821964097,3.3018748277,5.1342504415,3.1898849639,,, +29.1367187500,29,6.1313084431,2.6635629831,5.8827569225,2.5759544960,,, +29.1386718750,29,6.3167356884,1.5952983835,6.0961237832,1.5468563202,,, +29.1406250000,29,5.9261465639,0.1567378814,5.7605149198,0.1600579116,,, +29.1425781250,29,4.9992551542,-1.5443108957,4.9112435256,-1.4804952550,,, +29.1445312500,29,3.6223151848,-3.3636054692,3.6277771044,-3.2356775707,,, +29.1464843750,29,1.9186071677,-5.1394566267,2.0250684850,-4.9494948550,,, +29.1484375000,29,0.0371092720,-6.7120307377,0.2431289613,-6.4677016321,,, +29.1503906250,29,-1.8589541196,-7.9370631228,-1.5636904801,-7.6510332191,,, +29.1523437500,29,-3.6055465148,-8.6978456891,-3.2394000439,-8.3867779006,,, +29.1542968750,29,-5.0547526613,-8.9187413593,-4.6424289050,-8.6018255429,,, +29.1562500000,29,-6.0908759288,-8.5744508699,-5.6610004044,-8.2716217730,,, +29.1582031250,29,-6.6400416606,-7.6901802333,-6.2224698075,-7.4203439886,,, +29.1601562500,29,-6.6717260737,-6.3332972899,-6.2950689270,-6.1128638090,,, +29.1621093750,29,-6.1959565928,-4.6001072444,-5.8855897012,-4.4419993990,,, +29.1640625000,29,-5.2614201076,-2.6047188986,-5.0378859584,-2.5177835775,,, +29.1660156250,29,-3.9529839133,-0.4726018135,-3.8306590015,-0.4612512072,,, +29.1679687500,29,-2.3832811283,1.6667830657,-2.3694977790,1.6026750993,,, +29.1699218750,29,-0.6787481483,3.6909265876,-0.7736323379,3.5557512839,,, +29.1718750000,29,1.0348061997,5.4937149593,0.8378141568,5.2955336743,,, +29.1738281250,29,2.6434571811,6.9904231124,2.3566221213,6.7402076147,,, +29.1757812500,29,4.0520402959,8.1215120887,3.6920478565,7.8322570557,,, +29.1777343750,29,5.1866128554,8.8553869732,4.7731336808,8.5411259853,,, +29.1796875000,29,5.9945504771,9.1865268369,5.5488596414,8.8614166149,,, +29.1816406250,29,6.4457712150,9.1322510771,5.9894336414,8.8097750718,,, +29.1835937500,29,6.5359909556,8.7333604935,6.0894380976,8.4255138638,,, +29.1855468750,29,6.2886841367,8.0546438075,5.8697212342,7.7711027225,,, +29.1875000000,29,5.7523209836,7.1800412053,5.3748577822,6.9275037154,,, +29.1894531250,29,4.9931599014,6.2040553416,4.6664014060,5.9858837071,,, +29.1914062500,29,4.0859836163,5.2208251746,3.8142086970,5.0370715710,,, +29.1933593750,29,3.1049065438,4.3110747855,2.8878973117,4.1589676061,,, +29.1953125000,29,2.1147773060,3.5311642337,1.9488184080,3.4059794459,,, +29.1972656250,29,1.1623617276,2.9077056599,1.0416454138,2.8038208746,,, +29.1992187500,29,0.2702563622,2.4371158003,0.1884677927,2.3490718297,,, +29.2011718750,29,-0.5600398741,2.0913966532,-0.6083986393,2.0147534836,,, +29.2031250000,29,-1.3366535172,1.8301922284,-1.3556232881,1.7619634430,,, +29.2050781250,29,-2.0670506296,1.6114243279,-2.0591826253,1.5501398716,,, +29.2070312500,29,-2.7551429489,1.3940308951,-2.7216298026,1.3397044115,,, +29.2089843750,29,-3.4028603628,1.1349513778,-3.3435322786,1.0891545996,,, +29.2109375000,29,-4.0113939414,0.7856599253,-3.9245754029,0.7517209385,,, +29.2128906250,29,-4.5806846918,0.2937402189,-4.4631136163,0.2768851891,,, +29.2148437500,29,-5.1070766290,-0.3867770707,-4.9542029385,-0.3796537787,,, +29.2167968750,29,-5.5811581950,-1.2811463525,-5.3879353273,-1.2422261231,,, +29.2187500000,29,-5.9889836475,-2.3850213942,-5.7508950018,-2.3066285330,,, +29.2207031250,29,-6.3144074983,-3.6616584752,-6.0285112769,-3.5374311921,,, +29.2226562500,29,-6.5383347260,-5.0415378001,-6.2043387481,-4.8676111479,,, +29.2246093750,29,-6.6380312992,-6.4293071985,-6.2591741001,-6.2052428527,,, +29.2265625000,29,-6.5909596131,-7.7219249752,-6.1742336112,-7.4509884814,,, +29.2285156250,29,-6.3797635609,-8.8279061266,-5.9354162727,-8.5166536046,,, +29.2304687500,29,-5.9941158015,-9.6770591888,-5.5348054727,-9.3345741095,,, +29.2324218750,29,-5.4315031378,-10.2227736621,-4.9713644841,-9.8598222250,,, +29.2343750000,29,-4.6990716953,-10.4416273801,-4.2527435025,-10.0698309076,,, +29.2363281250,29,-3.8144366690,-10.3295858933,-3.3961828348,-9.9607321515,,, +29.2382812500,29,-2.8059205789,-9.8969977754,-2.4288964186,-9.5425338977,,, +29.2402343750,29,-1.7148691133,-9.1671287813,-1.3903677127,-8.8377102553,,, +29.2421875000,29,-0.5965097178,-8.1749020598,-0.3332223180,-7.8799883369,,, +29.2441406250,29,0.4849679802,-6.9625203872,0.6814227160,-6.7101224720,,, +29.2460937500,29,1.4644113549,-5.5762337908,1.5916378344,-5.3727685162,,, +29.2480468750,29,2.2838982314,-4.0643189096,2.3425847936,-3.9145260167,,, +29.2500000000,29,2.9013378292,-2.4724557745,2.8947375477,-2.3794716006,,, +29.2519531250,29,3.2969461148,-0.8405615445,3.2300803862,-0.8060994482,,, +29.2539062500,29,3.4739918281,0.7938474248,3.3529329842,0.7694386166,,, +29.2558593750,29,3.4548074170,2.3906937557,3.2862204196,2.3085450814,,, +29.2578125000,29,3.2749468205,3.9058515449,3.0658372794,3.7687351629,,, +29.2597656250,29,2.9768047384,5.2906978556,2.7344574814,5.1031961582,,, +29.2617187500,29,2.6053151204,6.4934119958,2.3373131301,6.2620341738,,, +29.2636718750,29,2.2085329748,7.4665106943,1.9225332226,7.1995376597,,, +29.2656250000,29,1.8403006110,8.1770372842,1.5434294368,7.8840018728,,, +29.2675781250,29,1.5593451057,8.6110940961,1.2574835744,8.3020967226,,, +29.2695312500,29,1.4234706562,8.7711194326,1.1207854340,8.4562353827,,, +29.2714843750,29,1.4810663656,8.6695360432,1.1799705084,8.3584422796,,, +29.2734375000,29,1.7628786936,8.3234623496,1.4643835385,8.0252459530,,, +29.2753906250,29,2.2776384964,7.7554770491,1.9818077612,7.4784116374,,, +29.2773437500,29,3.0122681860,6.9987756914,2.7185148256,6.7499130034,,, +29.2792968750,29,3.9329637407,6.0987989432,3.6402709574,5.8835040767,,, +29.2812500000,29,4.9854811165,5.1096097508,4.6927267711,4.9312285124,,, +29.2832031250,29,6.0980254353,4.0900563390,5.8043423246,3.9497252503,,, +29.2851562500,29,7.1884614660,3.1011623031,6.8934740959,2.9977216937,,, +29.2871093750,29,8.1719935238,2.2019783037,7.8759628151,2.1320440808,,, +29.2890625000,29,8.9667534074,1.4435231515,8.6707439893,1.4017832597,,, +29.2910156250,29,9.4997996018,0.8627474538,9.2058561616,0.8424822573,,, +29.2929687500,29,9.7140254551,0.4770909250,9.4253135697,0.4708967349,,, +29.2949218750,29,9.5726741457,0.2813857722,9.2935822618,0.2820138901,,, +29.2968750000,29,9.0608292458,0.2497349366,8.7969687659,0.2508633911,,, +29.2988281250,29,8.1851702214,0.3395863632,7.9432576369,0.3364433415,,, +29.3007812500,29,6.9713743156,0.4943858163,6.7591046979,0.4842735084,,, +29.3027343750,29,5.4604433110,0.6481714716,5.2863285583,0.6308194237,,, +29.3046875000,29,3.7072517721,0.7348266108,3.5802233350,0.7124096510,,, +29.3066406250,29,1.7798116906,0.6968675611,1.7085823321,0.6737061790,,, +29.3085937500,29,-0.2443035868,0.4894834624,-0.2518966537,0.4715947624,,, +29.3105468750,29,-2.2832840625,0.0822307617,-2.2208345982,0.0768128047,,, +29.3125000000,29,-4.2562328206,-0.5391558650,-4.1192269647,-0.5243099905,,, +29.3144531250,29,-6.0876160608,-1.3711783065,-5.8738120100,-1.3283274948,,, +29.3164062500,29,-7.7094596794,-2.3915965614,-7.4192311988,-2.3137353501,,, +29.3183593750,29,-9.0625533284,-3.5593468460,-8.6991985065,-3.4408923137,,, +29.3203125000,29,-10.1004411699,-4.8151858446,-9.6703551854,-4.6526444342,,, +29.3222656250,29,-10.7944150506,-6.0823264612,-10.3070982442,-5.8749419490,,, +29.3242187500,29,-11.1346481746,-7.2688664486,-10.6026067561,-7.0191806469,,, +29.3261718750,29,-11.1283970086,-8.2756275294,-10.5668614917,-7.9897565708,,, +29.3281250000,29,-10.7979728325,-9.0078381366,-10.2243289849,-8.6953264923,,, +29.3300781250,29,-10.1772479565,-9.3850451115,-9.6102758196,-9.0583599875,,, +29.3320312500,29,-9.3067953157,-9.3487678902,-8.7658232834,-9.0225141986,,, +29.3339843750,29,-8.2301990540,-8.8696600760,-7.7341553738,-8.5595353235,,, +29.3359375000,29,-6.9917844820,-7.9511468296,-6.5582100049,-7.6727641860,,, +29.3378906250,29,-5.6359368635,-6.6284749908,-5.2800483341,-6.3962208252,,, +29.3398437500,29,-4.2101365457,-4.9676686571,-3.9438362429,-4.7936014704,,, +29.3417968750,29,-2.7704125200,-3.0648181528,-2.6011645556,-2.9575991349,,, +29.3437500000,29,-1.3831003692,-1.0407099794,-1.3129156122,-1.0047285095,,, +29.3457031250,29,-0.1188631538,0.9708275805,-0.1437983622,0.9359158092,,, +29.3476562500,29,0.9587811953,2.8387409259,0.8483309071,2.7379193675,,, +29.3496093750,29,1.8035823528,4.4509552575,1.6218258920,4.2931805818,,, +29.3515625000,29,2.3891914163,5.7232253196,2.1535502517,5.5204468745,,, +29.3535156250,29,2.7065404920,6.5982287092,2.4363602012,6.3644383421,,, +29.3554687500,29,2.7627129562,7.0454114953,2.4780131828,6.7956982820,,, +29.3574218750,29,2.5807611679,7.0670983810,2.3008147211,6.8164849418,,, +29.3593750000,29,2.1965193143,6.7015419235,1.9384371640,6.4637094848,,, +29.3613281250,29,1.6533432612,6.0168496210,1.4309909436,5.8030766360,,, +29.3632812500,29,0.9977250197,5.1005244624,0.8210719570,4.9189963748,,, +29.3652343750,29,0.2776251318,4.0487054897,0.1524556536,3.9042083866,,, +29.3671875000,29,-0.4572328819,2.9551581728,-0.5292978647,2.8491665242,,, +29.3691406250,29,-1.1562431307,1.9012528058,-1.1774097204,1.8323744651,,, +29.3710937500,29,-1.7711830247,0.9488528728,-1.7468490282,0.9135249497,,, +29.3730468750,29,-2.2600997249,0.1361460114,-2.1979876180,0.1294758653,,, +29.3750000000,29,-2.5901213786,-0.5226880143,-2.4993214509,-0.5060727980,,, +29.3769531250,29,-2.7385831066,-1.0322639494,-2.6287154866,-0.9975531745,,, +29.3789062500,29,-2.6921563812,-1.4073177411,-2.5728090548,-1.3591654612,,, +29.3808593750,29,-2.4446595030,-1.6647243263,-2.3251199139,-1.6071788700,,, +29.3828125000,29,-1.9959463558,-1.8180996808,-1.8851201213,-1.7547252516,,, +29.3847656250,29,-1.3535296118,-1.8756487311,-1.2598727322,-1.8097247870,,, +29.3867187500,29,-0.5348120124,-1.8406635084,-0.4661822582,-1.7753676980,,, +29.3886718750,29,0.4341692390,-1.7121263245,0.4706428612,-1.6506944560,,, +29.3906250000,29,1.5224638228,-1.4862109793,1.5204468807,-1.4320401469,,, +29.3925781250,29,2.6938433510,-1.1626999547,2.6480574835,-1.1192227374,,, +29.3945312500,29,3.9032537319,-0.7521608918,3.8100484136,-0.7224661461,,, +29.3964843750,29,5.0982578446,-0.2747999691,4.9561069250,-0.2612934175,,, +29.3984375000,29,6.2241946487,0.2460890240,6.0338535329,0.2417944273,,, +29.4003906250,29,7.2269306024,0.7870705733,6.9914280705,0.7641612391,,, +29.4023437500,29,8.0557987208,1.3247231601,7.7803374998,1.2831879428,,, +29.4042968750,29,8.6684496507,1.8371286156,8.3601207944,1.7777120447,,, +29.4062500000,29,9.0321791920,2.3047759832,8.6996103852,2.2288998439,,, +29.4082031250,29,9.1224014286,2.7105242888,8.7754503338,2.6202090863,,, +29.4101562500,29,8.9245549890,3.0411036980,8.5739027316,2.9388377133,,, +29.4121093750,29,8.4385442093,3.2879418923,8.0951332521,3.1765235618,,, +29.4140625000,29,7.6816508329,3.4467373864,7.3560476729,3.3291344108,,, +29.4160156250,29,6.6877708443,3.5178859906,6.3895377534,3.3970782608,,, +29.4179687500,29,5.5003599859,3.5036661043,5.2377144759,3.3825836883,,, +29.4199218750,29,4.1624023092,3.4014179776,3.9423668830,3.2831149282,,, +29.4218750000,29,2.7123834988,3.2018478358,2.5411027276,3.0897336377,,, +29.4238281250,29,1.1880451306,2.8956612205,1.0708033468,2.7934988187,,, +29.4257812500,29,-0.3688552444,2.4804779918,-0.4279531942,2.3921391161,,, +29.4277343750,29,-1.9114580164,1.9629105740,-1.9098966121,1.8920580460,,, +29.4296875000,29,-3.3886879310,1.3586444805,-3.3259261117,1.3084113146,,, +29.4316406250,29,-4.7458910147,0.6915720143,-4.6237032041,0.6642711264,,, +29.4335937500,29,-5.9267595567,-0.0107287944,-5.7493911252,-0.0137352720,,, +29.4355468750,29,-6.8770982377,-0.7223715903,-6.6511566926,-0.7006141786,,, +29.4375000000,29,-7.5486984817,-1.4202943536,-7.2828969103,-1.3741000731,,, +29.4394531250,29,-7.9048067017,-2.0847131215,-7.6095306055,-2.0150961926,,, +29.4414062500,29,-7.9281650934,-2.7028116666,-7.6146942067,-2.6112375314,,, +29.4433593750,29,-7.6269804364,-3.2708093216,-7.3064727598,-3.1588882413,,, +29.4453125000,29,-7.0345618041,-3.7910806241,-6.7171279052,-3.6603627109,,, +29.4472656250,29,-6.2031734421,-4.2671307661,-5.8972740627,-4.1190751984,,, +29.4492187500,29,-5.1956507027,-4.6986920170,-4.9078813829,-4.5348049738,,, +29.4511718750,29,-4.0780800728,-5.0785619394,-3.8132624270,-4.9006422123,,, +29.4531250000,29,-2.9141575840,-5.3933636431,-2.6755774617,-5.2037179627,,, +29.4550781250,29,-1.7605567854,-5.6263774361,-1.5502618071,-5.4279329071,,, +29.4570312500,29,-0.6643616686,-5.7590226035,-0.4834947926,-5.5553854516,,, +29.4589843750,29,0.3353324356,-5.7730753884,0.4863086912,-5.5685122243,,, +29.4609375000,29,1.2026059446,-5.6555009196,1.3239641815,-5.4547515699,,, +29.4628906250,29,1.9016149524,-5.4013829816,1.9945917681,-5.2093714091,,, +29.4648437500,29,2.3990319704,-5.0125199126,2.4659430844,-4.8341140201,,, +29.4667968750,29,2.6695341944,-4.4966201429,2.7137001773,-4.3364179513,,, +29.4687500000,29,2.6999496764,-3.8688395931,2.7255371529,-3.7308998402,,, +29.4707031250,29,2.4921615291,-3.1512366202,2.5039188528,-3.0388282210,,, +29.4726562500,29,2.0650863879,-2.3708420050,2.0679632465,-2.2862617904,,, +29.4746093750,29,1.4551634859,-1.5579476183,1.4538657324,-1.5023992191,,, +29.4765625000,29,0.7163212184,-0.7409929846,0.7147227426,-0.7146472357,,, +29.4785156250,29,-0.0833638935,0.0584811804,-0.0828493348,0.0562455668,,, +29.4804687500,29,-0.8723278430,0.8234334988,-0.8689855428,0.7938694454,,, +29.4824218750,29,-1.5892067553,1.5351948273,-1.5836746250,1.4802374312,,, +29.4843750000,29,-2.1903917134,2.1718689374,-2.1840389833,2.0942399032,,, +29.4863281250,29,-2.6479213345,2.7130083309,-2.6424186933,2.6161567319,,, +29.4882812500,29,-2.9426601948,3.1468872009,-2.9399561321,3.0346767821,,, +29.4902343750,29,-3.0599312082,3.4744973909,-3.0624695140,3.3507551431,,, +29.4921875000,29,-2.9897474538,3.7070095880,-3.0006058873,3.5751644438,,, +29.4941406250,29,-2.7297930732,3.8602100959,-2.7525763698,3.7231273862,,, +29.4960937500,29,-2.2897371274,3.9512064702,-2.3282460886,3.8111376490,,, +29.4980468750,29,-1.6953439003,3.9972266852,-1.7530838737,3.8558007196,,, +29.5000000000,29,-0.9888550244,4.0142637802,-1.0684931357,3.8725270134,,, +29.5019531250,29,-0.2228220853,4.0173687078,-0.3258392508,3.8758170574,,, +29.5039062500,29,0.5502723377,4.0232274186,0.4235418965,3.8817513294,,, +29.5058593750,29,1.2875506084,4.0507767910,1.1375704526,3.9085872819,,, +29.5078125000,29,1.9618798764,4.1181869440,1.7894550909,3.9738492108,,, +29.5097656250,29,2.5627632340,4.2380338996,2.3686860532,4.0896702343,,, +29.5117187500,29,3.0911127777,4.4119223778,2.8761125016,4.2576018772,,, +29.5136718750,29,3.5533844580,4.6287223091,3.3183031983,4.4669101845,,, +29.5156250000,29,3.9609433188,4.8693988091,3.7067979209,4.6992349888,,, +29.5175781250,29,4.3298782515,5.1108200145,4.0578231222,4.9322633595,,, +29.5195312500,29,4.6731334752,5.3215455902,4.3847796786,5.1356640448,,, +29.5214843750,29,4.9886766722,5.4576476697,4.6868892966,5.2670525022,,, +29.5234375000,29,5.2544268266,5.4678992249,4.9441388482,5.2769960175,,, +29.5253906250,29,5.4318683250,5.3032931743,5.1205264500,5.1181996922,,, +29.5273437500,29,5.4733961618,4.9235116743,5.1710064647,4.7517507271,,, +29.5292968750,29,5.3317684418,4.3022529451,5.0505071567,4.1522606583,,, +29.5312500000,29,4.9697671609,3.4321659907,4.7231600893,3.3126290505,,, +29.5332031250,29,4.3653420223,2.3243543644,4.1672986983,2.2435658725,,, +29.5351562500,29,3.5122964630,1.0038172105,3.3762463887,0.9691927592,,, +29.5371093750,29,2.4208353831,-0.4918597281,2.3588823541,-0.4742200452,,, +29.5390625000,29,1.1186994944,-2.1107396467,1.1406927521,-2.0365511027,,, +29.5410156250,29,-0.3485317660,-3.7860685836,-0.2359486933,-3.6533781295,,, +29.5429687500,29,-1.9167044943,-5.4362798625,-1.7110681789,-5.2459823559,,, +29.5449218750,29,-3.5032399384,-6.9670587665,-3.2071820211,-6.7233411001,,, +29.5468750000,29,-5.0126456435,-8.2806987185,-4.6343858958,-7.9911570526,,, +29.5488281250,29,-6.3458400650,-9.2894123654,-5.8990329791,-8.9647044509,,, +29.5507812500,29,-7.4094545169,-9.9262523404,-6.9124545788,-9.5793687934,,, +29.5527343750,29,-8.1263401546,-10.1544626754,-7.6008902626,-9.7996723050,,, +29.5546875000,29,-8.4457088193,-9.9735359350,-7.9151510937,-9.6251203294,,, +29.5566406250,29,-8.3464326894,-9.4151788770,-7.8339246114,-9.0863087183,,, +29.5585937500,29,-7.8339837652,-8.5311389572,-7.3611349225,-8.2331760883,,, +29.5605468750,29,-6.9387256247,-7.3832000307,-6.5245536136,-7.1253490517,,, +29.5625000000,29,-5.7186356257,-6.0404176448,-5.3785083273,-5.8294737030,,, +29.5644531250,29,-4.2616290509,-4.5801139678,-4.0061051970,-4.4201750587,,, +29.5664062500,29,-2.6806206611,-3.0861096441,-2.5144903493,-2.9783497748,,, +29.5683593750,29,-1.0995152828,-1.6408130589,-1.0214893651,-1.5835309385,,, +29.5703125000,29,0.3641923413,-0.3151232287,0.3609785201,-0.3041431064,,, +29.5722656250,29,1.6125445908,0.8366772515,1.5394792337,0.8074266326,,, +29.5742187500,29,2.5737034476,1.7762204855,2.4454573621,1.7141513965,,, +29.5761718750,29,3.2052088509,2.4805054187,3.0384052822,2.3938354129,,, +29.5781250000,29,3.4956789800,2.9436178957,3.3074628029,2.8407734558,,, +29.5800781250,29,3.4635006122,3.1771151141,3.2701372196,3.0661213603,,, +29.5820312500,29,3.1532273864,3.2092771780,2.9688338186,3.0971733101,,, +29.5839843750,29,2.6313527592,3.0846297263,2.4667739403,2.9769008486,,, +29.5859375000,29,1.9787784355,2.8582074114,1.8408520992,2.7584164982,,, +29.5878906250,29,1.2788171463,2.5830749223,1.1703466981,2.4929304277,,, +29.5898437500,29,0.6067987925,2.3010682921,0.5270985841,2.2208150386,,, +29.5917968750,29,0.0254671720,2.0416284184,-0.0289159297,1.9704793503,,, +29.5937500000,29,-0.4171599601,1.8229524497,-0.4516871166,1.7594805022,,, +29.5957031250,29,-0.6901038488,1.6534929237,-0.7114499495,1.5959711035,,, +29.5976562500,29,-0.7803383090,1.5355705382,-0.7956622303,1.4821866172,,, +29.5996093750,29,-0.6924381482,1.4676551679,-0.7087223945,1.4166474321,,, +29.6015625000,29,-0.4478155077,1.4444235456,-0.4712300405,1.3942150234,,, +29.6035156250,29,-0.0809921422,1.4601950058,-0.1164654869,1.4094081018,,, +29.6054687500,29,0.3674015737,1.5145119759,0.3162433829,1.4617883808,,, +29.6074218750,29,0.8571687022,1.6129143034,0.7878353291,1.5567074588,,, +29.6093750000,29,1.3533066754,1.7638677336,1.2642053202,1.7023416756,,, +29.6113281250,29,1.8292602978,1.9753792503,1.7194414541,1.9064245902,,, +29.6132812500,29,2.2673923610,2.2494029042,2.1364251761,2.1708469519,,, +29.6152343750,29,2.6573625753,2.5758133915,2.5054172927,2.4858395643,,, +29.6171875000,29,2.9947290478,2.9317790057,2.8227184729,2.8293675792,,, +29.6191406250,29,3.2788135938,3.2845241193,3.0885292344,3.1697966737,,, +29.6210937500,29,3.5086946654,3.5927881384,3.3030320759,3.4673015778,,, +29.6230468750,29,3.6807581274,3.8100108295,3.4639373077,3.6769408948,,, +29.6250000000,29,3.7907536146,3.8919665188,3.5682751519,3.7560255489,,, +29.6269531250,29,3.8371883196,3.8043736737,3.6154837263,3.6714634505,,, +29.6289062500,29,3.8212432170,3.5263796686,3.6072385602,3.4031235222,,, +29.6308593750,29,3.7434747915,3.0510275556,3.5442494278,2.9442873602,,, +29.6328125000,29,3.6006626226,2.3848209033,3.4232221533,2.3012304124,,, +29.6347656250,29,3.3846498958,1.5474779596,3.2357447731,1.4929856125,,, +29.6367187500,29,3.0840355624,0.5731373188,2.9698962373,0.5525075353,,, +29.6386718750,29,2.6889704249,-0.4873871008,2.6148318468,-0.4711513415,,, +29.6406250000,29,2.1963260868,-1.5667349788,2.1657904471,-1.5129658497,,, +29.6425781250,29,1.6109484950,-2.5867410671,1.6254561030,-2.4974805559,,, +29.6445312500,29,0.9424568837,-3.4696179056,1.0011479449,-3.3496039149,,, +29.6464843750,29,0.2011147222,-4.1514134390,0.3011695306,-4.0075985167,,, +29.6484375000,29,-0.6037264171,-4.5921314661,-0.4664388105,-4.4328509023,,, +29.6503906250,29,-1.4606830714,-4.7773532426,-1.2910123358,-4.6114386644,,, +29.6523437500,29,-2.3500440291,-4.7131399254,-2.1533033728,-4.5492123150,,, +29.6542968750,29,-3.2396859833,-4.4210084596,-3.0216607929,-4.2669473911,,, +29.6562500000,29,-4.0878796089,-3.9358045652,-3.8548022684,-3.7982911533,,, +29.6582031250,29,-4.8514771343,-3.3049413324,-4.6097580001,-3.1890257146,,, +29.6601562500,29,-5.4943681641,-2.5871207868,-5.2500861183,-2.4958315765,,, +29.6621093750,29,-5.9912891026,-1.8474134118,-5.7496844118,-1.7815363139,,, +29.6640625000,29,-6.3251926931,-1.1473705455,-6.0904971502,-1.1055698479,,, +29.6660156250,29,-6.4818660648,-0.5352601499,-6.2575558577,-0.5145394806,,, +29.6679687500,29,-6.4474597953,-0.0414780921,-6.2367040390,-0.0378002277,,, +29.6699218750,29,-6.2116572892,0.3206383318,-6.0176409127,0.3117615192,,, +29.6718750000,29,-5.7750083893,0.5485140507,-5.6008540289,0.5316527017,,, +29.6738281250,29,-5.1557524438,0.6408525113,-5.0039767474,0.6206210310,,, +29.6757812500,29,-4.3921343433,0.5926847104,-4.2639009202,0.5738767494,,, +29.6777343750,29,-3.5394649138,0.3986453246,-3.4340144214,0.3862550797,,, +29.6796875000,29,-2.6627362542,0.0598635452,-2.5772304558,0.0588667248,,, +29.6816406250,29,-1.8263983972,-0.4102719983,-1.7562426380,-0.3953398702,,, +29.6835937500,29,-1.0850142434,-0.9836397676,-1.0245469805,-0.9491939126,,, +29.6855468750,29,-0.4787108639,-1.6198107024,-0.4219803434,-1.5636456872,,, +29.6875000000,29,-0.0331938896,-2.2717253490,0.0254087072,-2.1932478417,,, +29.6894531250,29,0.2394165849,-2.8903847029,0.3046688494,-2.7906843044,,, +29.6914062500,29,0.3410339877,-3.4277845376,0.4164520351,-3.3096040012,,, +29.6933593750,29,0.2882268389,-3.8403837915,0.3757006150,-3.7079703664,,, +29.6953125000,29,0.1114930774,-4.0922082256,0.2110218988,-3.9510582184,,, +29.6972656250,29,-0.1472637626,-4.1554366144,-0.0377400090,-4.0120192566,,, +29.6992187500,29,-0.4388414837,-4.0109131078,-0.3234651305,-3.8723754748,,, +29.7011718750,29,-0.7114021928,-3.6512321393,-0.5961912395,-3.5249960292,,, +29.7031250000,29,-0.9140537447,-3.0834980634,-0.8065095751,-2.9767605107,,, +29.7050781250,29,-0.9984152617,-2.3274638765,-0.9071269238,-2.2467615206,,, +29.7070312500,29,-0.9191436078,-1.4097604541,-0.8535205162,-1.3607328476,,, +29.7089843750,29,-0.6362553766,-0.3595434047,-0.6062929747,-0.3468452706,,, +29.7109375000,29,-0.1211304856,0.7904866984,-0.1369522193,0.7633114420,,, +29.7128906250,29,0.6356273837,1.9987527689,0.5646213943,1.9295848091,,, +29.7148437500,29,1.6186374297,3.2108451865,1.4849048189,3.0994430142,,, +29.7167968750,29,2.7870514603,4.3624455197,2.5859929868,4.2107987599,,, +29.7187500000,29,4.0764255634,5.3862133228,3.8072383224,5.1986586005,,, +29.7207031250,29,5.4005734332,6.2166129244,5.0669244489,5.9997833487,,, +29.7226562500,29,6.6572623600,6.7953581979,6.2676402906,6.5579432056,,, +29.7246093750,29,7.7409509068,7.0803841829,7.3083748434,6.8325745191,,, +29.7265625000,29,8.5579343831,7.0529880293,8.0989851245,6.8056673346,,, +29.7285156250,29,9.0385948689,6.7202106709,8.5719820402,6.4840586261,,, +29.7304687500,29,9.1454783142,6.1141908530,8.6903557688,5.8988039406,,, +29.7324218750,29,8.8769502711,5.2879717892,8.4512136252,5.1011258338,,, +29.7343750000,29,8.2657177795,4.3089968445,7.8845110810,4.1561334797,,, +29.7363281250,29,7.3714817860,3.2537195518,7.0460801125,3.1376215940,,, +29.7382812500,29,6.2700046166,2.2027057716,6.0071797455,2.1233467961,,, +29.7402343750,29,5.0435311657,1.2344797281,4.8453870924,1.1890904285,,, +29.7421875000,29,3.7742158409,0.4193193137,3.6383957723,0.4026707014,,, +29.7441406250,29,2.5385604995,-0.1869319964,2.4587912197,-0.1820297486,,, +29.7460937500,29,1.4009314381,-0.5511826275,1.3679882224,-0.5330920466,,, +29.7480468750,29,0.4074085073,-0.6700591349,0.4104560060,-0.6472846505,,, +29.7500000000,29,-0.4155695454,-0.5678135464,-0.3876439004,-0.5480419853,,, +29.7519531250,29,-1.0582475676,-0.2871262992,-1.0158262769,-0.2765850921,,, +29.7539062500,29,-1.5270283171,0.1175386645,-1.4789380081,0.1144948902,,, +29.7558593750,29,-1.8473449271,0.5823314702,-1.7999934042,0.5635540130,,, +29.7578125000,29,-2.0633172006,1.0375653444,-2.0199285412,1.0033228692,,, +29.7597656250,29,-2.2312826249,1.4146401404,-2.1915175312,1.3675888361,,, +29.7617187500,29,-2.4108003972,1.6554134248,-2.3709063092,1.6002403163,,, +29.7636718750,29,-2.6562020636,1.7215764214,-2.6096749224,1.6643160038,,, +29.7656250000,29,-3.0093454507,1.5990393286,-2.9479403706,1.5462353956,,, +29.7675781250,29,-3.4944908915,1.2950185398,-3.4093319717,1.2529826738,,, +29.7695312500,29,-4.1139285193,0.8332430853,-3.9966472821,0.8074745177,,, +29.7714843750,29,-4.8422875090,0.2517958560,-4.6862994805,0.2464712412,,, +29.7734375000,29,-5.6243744089,-0.4005350287,-5.4261397618,-0.3829486782,,, +29.7753906250,29,-6.3814843243,-1.0712363015,-6.1413875345,-1.0301256912,,, +29.7773437500,29,-7.0230564482,-1.7095588601,-6.7457622422,-1.6461128317,,, +29.7792968750,29,-7.4615582954,-2.2714083601,-7.1557495737,-2.1883886621,,, +29.7812500000,29,-7.6294817228,-2.7261832277,-7.3068601078,-2.6274491423,,, +29.7832031250,29,-7.4904270339,-3.0594161131,-7.1642762385,-2.9493505566,,, +29.7851562500,29,-7.0402993489,-3.2697366009,-6.7240814499,-3.1527749650,,, +29.7871093750,29,-6.3049637761,-3.3678901615,-6.0110169150,-3.2480839670,,, +29.7890625000,29,-5.3371914830,-3.3772793661,-5.0755158832,-3.2578432028,,, +29.7910156250,29,-4.2103507391,-3.3306878535,-3.9876858348,-3.2136627224,,, +29.7929687500,29,-3.0107583608,-3.2666252513,-2.8300055506,-3.1526723415,,, +29.7949218750,29,-1.8304170336,-3.2265768848,-1.6903733266,-3.1148706469,,, +29.7968750000,29,-0.7575562361,-3.2474875548,-0.6531490155,-3.1358728514,,, +29.7988281250,29,0.1325426168,-3.3527340299,0.2094923816,-3.2381989001,,, +29.8007812500,29,0.7808002021,-3.5502706448,0.8406600460,-3.4294849466,,, +29.8027343750,29,1.1450367635,-3.8346969472,1.1994713845,-3.7044808902,,, +29.8046875000,29,1.2045893468,-4.1868378370,1.2655030263,-4.0446485244,,, +29.8066406250,29,0.9663597747,-4.5743406789,1.0446486215,-4.4187431125,,, +29.8085937500,29,0.4680631524,-4.9551353690,0.5723405538,-4.7861580770,,, +29.8105468750,29,-0.2199344642,-5.2796291412,-0.0846226760,-5.0990467302,,, +29.8125000000,29,-0.9963960307,-5.4934523463,-0.8297313800,-5.3049733928,,, +29.8144531250,29,-1.7411277123,-5.5450171783,-1.5480948949,-5.3542050401,,, +29.8164062500,29,-2.3340761194,-5.3936083526,-2.1246987641,-5.2075108979,,, +29.8183593750,29,-2.6718883941,-5.0130717640,-2.4603161593,-4.8397120978,,, +29.8203125000,29,-2.6795628809,-4.3947274744,-2.4826937701,-4.2424857531,,, +29.8222656250,29,-2.3186825287,-3.5509692418,-2.1544189020,-3.4278346764,,, +29.8242187500,29,-1.5902403854,-2.5136321727,-1.4756877721,-2.4265081350,,, +29.8261718750,29,-0.5311699433,-1.3270419038,-0.4811198858,-1.2812907285,,, +29.8281250000,29,0.7928866342,-0.0424340045,0.7670955133,-0.0416177212,,, +29.8300781250,29,2.2957096607,1.2844182760,2.1869990672,1.2387099888,,, +29.8320312500,29,3.8770785889,2.5933000734,3.6832135853,2.5016135378,,, +29.8339843750,29,5.4284383574,3.8185042571,5.1524440903,3.6837167930,,, +29.8359375000,29,6.8426205609,4.8930906886,6.4927668837,4.7204522513,,, +29.8378906250,29,8.0274023920,5.7611836411,7.6164324105,5.5579275302,,, +29.8398437500,29,8.9141799037,6.3888982573,8.4579812074,6.1634717440,,, +29.8417968750,29,9.4574987320,6.7661018291,8.9737481834,6.5273370746,,, +29.8437500000,29,9.6312268784,6.9024829639,9.1382598325,6.6589052282,,, +29.8457031250,29,9.4278448037,6.8235812161,8.9436437205,6.5828530293,,, +29.8476562500,29,8.8617233063,6.5680683545,8.4028599544,6.3365234860,,, +29.8496093750,29,7.9727563120,6.1846072181,7.5532852286,5.9668884041,,, +29.8515625000,29,6.8252427754,5.7251698239,6.4557920188,5.5240949042,,, +29.8535156250,29,5.4995462632,5.2347075834,5.1869383095,5.0514945579,,, +29.8554687500,29,4.0795811852,4.7425268420,3.8270851225,4.5773233591,,, +29.8574218750,29,2.6426482534,4.2600477691,2.4506307544,4.1125455708,,, +29.8593750000,29,1.2559689322,3.7845792843,1.1225724077,3.6545029106,,, +29.8613281250,29,-0.0205168135,3.3076955529,-0.0989918844,3.1950031476,,, +29.8632812500,29,-1.1290928760,2.8267477400,-1.1582531245,2.7314352433,,, +29.8652343750,29,-2.0133774605,2.3525507941,-2.0010154531,2.2741936413,,, +29.8671875000,29,-2.6254172458,1.9063775145,-2.5814758319,1.8437813163,,, +29.8691406250,29,-2.9368787715,1.5102262334,-2.8728003015,1.4614192878,,, +29.8710937500,29,-2.9478361768,1.1780011776,-2.8754003018,1.1405356046,,, +29.8730468750,29,-2.6904776770,0.9090798985,-2.6203581062,0.8805555251,,, +29.8750000000,29,-2.2274239583,0.6850083749,-2.1677228887,0.6637079372,,, +29.8769531250,29,-1.6440808832,0.4730690085,-1.5992090265,0.4584651384,,, +29.8789062500,29,-1.0372418725,0.2350753349,-1.0073970286,0.2280278834,,, +29.8808593750,29,-0.5053232800,-0.0653513237,-0.4864756653,-0.0626545212,,, +29.8828125000,29,-0.1399369507,-0.4563855273,-0.1242547857,-0.4407133133,,, +29.8847656250,29,-0.0150552133,-0.9507889448,0.0081276676,-0.9184068490,,, +29.8867187500,29,-0.1772964748,-1.5443517022,-0.1344493173,-1.4916240431,,, +29.8886718750,29,-0.6404955454,-2.2187967210,-0.5657772082,-2.1426950980,,, +29.8906250000,29,-1.3820281176,-2.9412814328,-1.2647808296,-2.8399138947,,, +29.8925781250,29,-2.3441592050,-3.6654381181,-2.1767968967,-3.5385420191,,, +29.8945312500,29,-3.4452120777,-4.3400024499,-3.2241565517,-4.1891336304,,, +29.8964843750,29,-4.5938298002,-4.9174932030,-4.3197532736,-4.7459067898,,, +29.8984375000,29,-5.6983769707,-5.3582439132,-5.3760274722,-5.1706293051,,, +29.9003906250,29,-6.6734584217,-5.6339228485,-6.3111786187,-5.4360129060,,, +29.9023437500,29,-7.4453962523,-5.7294696974,-7.0544088316,-5.5275789179,,, +29.9042968750,29,-7.9550046199,-5.6403035257,-7.5486688888,-5.4409585334,,, +29.9062500000,29,-8.1596401585,-5.3686228557,-7.7527260025,-5.1783166907,,, +29.9082031250,29,-8.0353259623,-4.9211374080,-7.6432684416,-4.7461587826,,, +29.9101562500,29,-7.5763439902,-4.3067218602,-7.2145670214,-4.1530643958,,, +29.9121093750,29,-6.7939353376,-3.5371359061,-6.4772022709,-3.4103839279,,, +29.9140625000,29,-5.7160449037,-2.6321732303,-5.4576952847,-2.5372125760,,, +29.9160156250,29,-4.3850440853,-1.6219384845,-4.1962542298,-1.5625919817,,, +29.9179687500,29,-2.8538216673,-0.5428090820,-2.7430948549,-0.5216130153,,, +29.9199218750,29,-1.1844849169,0.5672081883,-1.1572960373,0.5490685549,,, +29.9218750000,29,0.5518777547,1.6707768962,0.4933751256,1.6134534610,,, +29.9238281250,29,2.2781312666,2.7323836434,2.1352700322,2.6373096657,,, +29.9257812500,29,3.9152921973,3.7168250985,3.6929488059,3.5867068007,,, +29.9277343750,29,5.3861200668,4.5858567691,5.0927276280,4.4247753379,,, +29.9296875000,29,6.6189101579,5.2980394681,6.2663448022,5.1115545156,,, +29.9316406250,29,7.5512964154,5.8122308490,7.1545502064,5.6073614186,,, +29.9335937500,29,8.1339517046,6.0919004031,7.7105761732,5.8769556459,,, +29.9355468750,29,8.3352289582,6.1102266673,7.9044984953,5.8944587052,,, +29.9375000000,29,8.1452370219,5.8543746475,7.7270709641,5.6474820411,,, +29.9394531250,29,7.5765191783,5.3253343857,7.1903842400,5.1369703607,,, +29.9414062500,29,6.6616590351,4.5361925790,6.3255946661,4.3755342624,,, +29.9433593750,29,5.4505781022,3.5152063681,5.1802418958,3.3904221990,,, +29.9453125000,29,4.0092440705,2.3117644438,3.8168606714,2.2292803330,,, +29.9472656250,29,2.4187777257,0.9977105538,2.3120872834,0.9614320020,,, +29.9492187500,29,0.7720663751,-0.3392549925,0.7535454129,-0.3284932328,,, +29.9511718750,29,-0.8340101861,-1.6086997620,-0.7673506354,-1.5532304934,,, +29.9531250000,29,-2.3087483119,-2.7317351661,-2.1648779132,-2.6366605733,,, +29.9550781250,29,-3.5751901238,-3.6483499974,-3.3661411381,-3.5208869035,,, +29.9570312500,29,-4.5728019402,-4.3166257554,-4.3136776230,-4.1654748885,,, +29.9589843750,29,-5.2585498002,-4.7118022311,-4.9665178771,-4.5465481564,,, +29.9609375000,29,-5.6098031267,-4.8293710583,-5.3029163737,-4.6597741420,,, +29.9628906250,29,-5.6272466936,-4.6872061054,-5.3231130735,-4.5224192151,,, +29.9648437500,29,-5.3333032331,-4.3221655302,-5.0478904294,-4.1700676914,,, +29.9667968750,29,-4.7655998430,-3.7832256413,-4.5124264652,-3.6499953618,,, +29.9687500000,29,-3.9700861059,-3.1249348371,-3.7598039933,-3.0148525814,,, +29.9707031250,29,-2.9969767272,-2.4023080486,-2.8372132227,-2.3177361281,,, +29.9726562500,29,-1.8988519537,-1.6680553324,-1.7941828498,-1.6095137904,,, +29.9746093750,29,-0.7296454275,-0.9715765836,-0.6816263937,-0.9378542128,,, +29.9765625000,29,0.4561819549,-0.3556343789,0.4488770873,-0.3440135348,,, +29.9785156250,29,1.6036989361,0.1486590400,1.5450197486,0.1420073550,,, +29.9804687500,29,2.6565549264,0.5226797330,2.5528289407,0.5022733020,,, +29.9824218750,29,3.5578831130,0.7578249587,3.4175974745,0.7285306684,,, +29.9843750000,29,4.2554686723,0.8548133884,4.0888905111,0.8215261330,,, +29.9863281250,29,4.7084694826,0.8236223272,4.5270364541,0.7909392946,,, +29.9882812500,29,4.8909070226,0.6812636487,4.7065500870,0.6532305982,,, +29.9902343750,29,4.7920419652,0.4489072494,4.6165629709,0.4288620531,,, +29.9921875000,29,4.4172468710,0.1493328999,4.2617261009,0.1398347015,,, +29.9941406250,29,3.7903805389,-0.1958734146,3.6645685893,-0.1930222470,,, +29.9960937500,29,2.9562144963,-0.5673461758,2.8678648193,-0.5510456836,,, +29.9980468750,29,1.9796273140,-0.9464505330,1.9338213554,-0.9162985798,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/ASR-Processor-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/ASR-Processor-test.xml new file mode 100644 index 0000000..1f3bec9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/ASR-Processor-test.xml @@ -0,0 +1,797 @@ + + 2 + OpenViBE Designer + 3.0.0-beta + + + (0x00425137, 0xf2a30c29) + (0x79a9edeb, 0x245d83fc) + Test Name + Covariance-Matrix-Calculator + ASR-Processor + + + + + + + (0x00000e25, 0x00003c5e) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 30 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x207c9054, 0x3c841b63) + 944 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001182, 0x00005e08) + ASR Processor + (0x41727469, 0x17f1c6e2) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x6f752dd0, 0x082a321e) + Signal Reconstructed + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x330306dd, 0x74a95f98) + Filename to load model + ${Player_ScenarioDirectory}/ASR-model.xml + ${Player_ScenarioDirectory}/ASR-model-ref.xml + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x3c89d3cf, 0x83076356) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000026cd, 0x00007e87) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + 1.5*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 480 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000586a, 0x00001f44) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007dde, 0x00001445) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x5ba36127, 0x195feae1) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/$var{Test Name}-output.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 608 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x11a6038b, 0x7157c284) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005e1c11) + + + + + (0x2b88852d, 0x43d7a773) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5045ebd9, 0x67325c0b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 608 + + + (0x207c9054, 0x3c841b63) + 944 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e001787) + C3;C4;FC3;FC4 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x558c587f, 0x223f3b67) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a79f8) + + + + + + + (0x00000bfd, 0x00000a7c) + + (0x5194b6cb, 0x7e001787) + 0 + + + (0x558c587f, 0x223f3b67) + 0 + + + + (0x000017f2, 0x00004d57) + + (0x000026cd, 0x00007e87) + 0 + + + (0x00001182, 0x00005e08) + 0 + + + + (0x00002551, 0x0000620c) + + (0x2b88852d, 0x43d7a773) + 0 + + + (0x5194b6cb, 0x7e001787) + 0 + + + + (0x00004034, 0x000058ef) + + (0x558c587f, 0x223f3b67) + 0 + + + (0x0000586a, 0x00001f44) + 0 + + + + (0x000043f4, 0x0000072e) + + (0x11a6038b, 0x7157c284) + 1 + + + (0x2b88852d, 0x43d7a773) + 0 + + + + (0x000052e6, 0x00006ead) + + (0x00000e25, 0x00003c5e) + 0 + + + (0x5045ebd9, 0x67325c0b) + 0 + + + + (0x000060a3, 0x00005f0d) + + (0x00001182, 0x00005e08) + 0 + + + (0x00007dde, 0x00001445) + 1 + + + + (0x00006a9f, 0x00004bba) + + (0x00001182, 0x00005e08) + 1 + + + (0x00007dde, 0x00001445) + 0 + + + + (0x00006d07, 0x00002bf8) + + (0x0000586a, 0x00001f44) + 0 + + + (0x000026cd, 0x00007e87) + 0 + + + + + + (0x000054d7, 0x00005ae2) + Input Signal + + + + + + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 816 + + + (0x7234b86b, 0x2b8651a5) + 208 + + + + + (0x000054d7, 0x00005ae3) + Signal Processing + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 816 + + + (0x7234b86b, 0x2b8651a5) + 384 + + + + + + + (0x000062ac, 0x00003721) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000041e, 0x000069b5)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004c5d, 0x000021d4)","index":0,"name":"Default tab","parentIdentifier":"(0x0000041e, 0x000069b5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000420e, 0x000074bb)","index":0,"name":"Empty","parentIdentifier":"(0x00004c5d, 0x000021d4)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/ASR-Trainer-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/ASR-Trainer-test.xml new file mode 100644 index 0000000..5cbdf90 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/ASR-Trainer-test.xml @@ -0,0 +1,801 @@ + + 2 + OpenViBE Designer + 3.0.0-beta + + + (0x00425137, 0xf2a30c29) + (0x79a9edeb, 0x245d83fc) + Test Name + Covariance-Matrix-Calculator + ASR-Trainer + + + + + + + (0x000015a8, 0x000079e9) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01165f9f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000586a, 0x00001f44) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006bd5, 0x0000489b) + ASR Trainer + (0x41727469, 0xc05f38ff) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x6f752dd0, 0x082a321e) + Tran-completed Flag + + + + + (0x330306dd, 0x74a95f98) + Filename to save model + ${Player_ScenarioDirectory}/ASR-model.xml + ${Player_ScenarioDirectory}/ASR-model-output.xml + false + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x5261636b, 0x4d455452) + Metric + Euclidian + Euclidian + false + + + (0x512a166f, 0x5c3ef83f) + Channel ratio to reconstruct + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Rejection limit + 5 + 5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0xe02de2aa, 0x821ba183) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x11a6038b, 0x7157c284) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005e1c11) + + + + + (0x1396fde6, 0x1c649749) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc7a) + + + (0xfba64161, 0x65304e21) + + + + + + (0x1396fde6, 0x1c64974a) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc7a) + + + (0xfba64161, 0x65304e21) + + + + + + (0x2b88852d, 0x43d7a773) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5045ebd9, 0x67325c0b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e001787) + C3;C4;FC3;FC4 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x558c587f, 0x223f3b67) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a79f8) + + + + + + + (0x00000bfd, 0x00000a7c) + + (0x5194b6cb, 0x7e001787) + 0 + + + (0x558c587f, 0x223f3b67) + 0 + + + + (0x00002161, 0x00005718) + + (0x00006bd5, 0x0000489b) + 0 + + + (0x000015a8, 0x000079e9) + 0 + + + + (0x000023c3, 0x0000335d) + + (0x11a6038b, 0x7157c284) + 2 + + + (0x1396fde6, 0x1c649749) + 0 + + + + (0x00002551, 0x0000620c) + + (0x2b88852d, 0x43d7a773) + 0 + + + (0x5194b6cb, 0x7e001787) + 0 + + + + (0x00002996, 0x00001419) + + (0x11a6038b, 0x7157c284) + 2 + + + (0x5045ebd9, 0x67325c0b) + 0 + + + + (0x0000311a, 0x00000602) + + (0x1396fde6, 0x1c64974a) + 0 + + + (0x00006bd5, 0x0000489b) + 0 + + + + (0x00003869, 0x000048f3) + + (0x0000586a, 0x00001f44) + 0 + + + (0x00006bd5, 0x0000489b) + 1 + + + + (0x00004034, 0x000058ef) + + (0x558c587f, 0x223f3b67) + 0 + + + (0x0000586a, 0x00001f44) + 0 + + + + (0x000043f4, 0x0000072e) + + (0x11a6038b, 0x7157c284) + 1 + + + (0x2b88852d, 0x43d7a773) + 0 + + + + (0x00006db7, 0x00007acd) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x1396fde6, 0x1c64974a) + 0 + + + + + + (0x000054d7, 0x00005ae2) + Input Signal + + + + + + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 736 + + + (0x7234b86b, 0x2b8651a5) + 176 + + + + + (0x000054d7, 0x00005ae3) + Signal Processing + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 736 + + + (0x7234b86b, 0x2b8651a5) + 352 + + + + + + + (0x000062ac, 0x00003721) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000041e, 0x000069b5)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004c5d, 0x000021d4)","index":0,"name":"Default tab","parentIdentifier":"(0x0000041e, 0x000069b5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000420e, 0x000074bb)","index":0,"name":"Empty","parentIdentifier":"(0x00004c5d, 0x000021d4)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/ASR-model-ref.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/ASR-model-ref.xml new file mode 100644 index 0000000..171c05d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/ASR-model-ref.xml @@ -0,0 +1,17 @@ + + + 3.64776520261426 1.29023655895292 2.32623534894098 0.971947765103693 + 1.29023655895292 3.58502947106046 0.935080263836635 2.28024769881738 + 2.32623534894098 0.935080263836635 3.41566493769342 1.15232554661866 +0.971947765103693 2.28024769881738 1.15232554661866 3.46016343202863 + -0.708243887391283 0.667512895061541 0.72870499429868 -0.667988195409754 + -1.14363606301638 -1.24139284292518 1.21015772890246 1.29220172963208 + 3.42229744240393 -3.44412809610297 3.34928062316736 -3.41650295481661 + -5.86740559674539 -5.72285798578988 -5.52079337731776 -5.52039255373496 + 1 0 0 0 +0 1 0 0 +0 0 1 0 +0 0 0 1 + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/Artifact-Amplitude-input.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/Artifact-Amplitude-input.csv new file mode 100644 index 0000000..a7d1a9b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/Artifact-Amplitude-input.csv @@ -0,0 +1,161 @@ +Time:32Hz,Epoch,sinusOsc 1,sinusOsc 2,sinusOsc 3,sinusOsc 4,Event Id,Event Date,Event Duration +0.0000000000,0,0.0000000000,0.0000000000,0.0000000000,0.0000000000,,, +0.0312500000,0,1.3687341120,0.0834505686,1.3965074831,2.3460347303,,, +0.0625000000,0,0.0834505686,3.3460347303,1.6342771847,0.0223674799,,, +0.0937500000,0,1.3965074831,1.6342771847,0.8587778323,0.2862985568,,, +0.1250000000,0,2.3460347303,0.0223674799,0.2862985568,1.2564364343,,, +0.1562500000,0,0.6652579106,1.0605198516,0.7209285523,0.3100244990,,, +0.1875000000,0,1.6342771847,0.2862985568,1.5912609145,0.5189549878,,, +0.2187500000,0,2.0374036140,-0.8460419110,1.6531536145,-1.3302670931,,, +0.2500000000,1,0.0223674799,1.2564364343,0.5189549878,-2.2082337379,,, +0.2812500000,1,0.8587778323,1.5912609145,-0.8135359478,0.7847811254,,, +0.3125000000,1,1.0605198516,0.3100244990,-1.0731867792,-0.2119004478,,, +0.3437500000,1,-0.8527917255,1.3612667999,-0.1597583084,-1.8827722525,,, +0.3750000000,1,0.2862985568,0.5189549878,0.7847811254,0.9814084992,,, +0.4062500000,1,0.6745718556,-2.0249997390,0.7541775274,1.5472144212,,, +0.4375000000,1,-0.8460419110,-1.3302670931,0.0634287720,0.7819705904,,, +0.4687500000,1,0.7209285523,-1.0731867792,-0.0655390377,0.9506913659,,, +0.5000000000,2,1.2564364343,-2.2082337379,0.9814084992,-0.5852777802,,, +0.5312500000,2,-0.0631007468,-0.2987362122,2.4069561396,0.2823791178,,, +0.5625000000,2,1.5912609145,0.7847811254,2.8779488994,0.9030515780,,, +0.5937500000,2,1.8564555014,-0.8355661309,2.0520274556,-2.4793752101,,, +0.6250000000,2,0.3100244990,-0.2119004478,0.9506913659,-1.7310810939,,, +0.6562500000,2,1.6531536145,0.0634287720,0.7412410587,0.9701626979,,, +0.6875000000,2,1.3612667999,-1.8827722525,1.3761889031,-0.4108610506,,, +0.7187500000,2,-3.5404879020,-0.8086493471,1.7027679072,-0.2124145663,,, +0.7500000000,3,0.5189549878,0.9814084992,0.9030515780,0.8068531766,,, +0.7812500000,3,-0.1244988728,0.2724851298,-0.4594717137,0.6869181620,,, +0.8125000000,3,-2.0249997390,1.5472144212,-1.0439874057,2.0694974039,,, +0.8437500000,3,-0.8135359478,2.8779488994,-0.2805237468,0.3641695321,,, +0.8750000000,3,-1.3302670931,0.7819705904,0.9701626979,-1.8389984936,,, +0.9062500000,3,-2.7774418870,0.2993489279,1.4263392704,0.6679934029,,, +0.9375000000,3,-1.0731867792,0.9506913659,0.8667484914,0.1385386313,,, +0.9687500000,3,-1.2560591950,-0.8668315473,0.3301381800,-2.4206456881,,, +1.0000000000,4,-2.2082337379,-0.5852777802,0.8068531766,-0.7723189861,,, +1.0312500000,4,-0.1597583084,1.3761889031,1.9907896528,0.0983659614,,, +1.0625000000,4,-0.2987362122,0.2823791178,2.5877673403,5.4087503374,,, +1.0937500000,4,-1.1495363031,-0.0385524690,1.8235323387,1.3163956500,,, +1.1250000000,4,0.7847811254,0.9030515780,0.3641695321,-0.3034584827,,, +1.1562500000,4,0.2599756842,-1.2879184845,-0.4451458738,0.7048895721,,, +1.1875000000,4,-0.8355661309,-2.4793752101,-0.1234290101,2.5309068373,,, +1.2187500000,4,0.7541775274,-1.0439874057,0.4456384107,-0.8266210987,,, +1.2500000000,5,-0.2119004478,-1.7310810939,0.1385386313,-1.7466375845,,, +1.2812500000,5,-1.4354651966,-1.5706412435,-1.0080375931,0.2727140524,,, +1.3125000000,5,0.0634287720,0.9701626979,-1.7974455953,-0.8262613606,,, +1.3437500000,5,-0.9654362809,0.5424888696,-1.2808655550,-0.9489926046,,, +1.3750000000,5,-1.8827722525,-0.4108610506,0.0983659614,-0.5547380276,,, +1.4062500000,5,-0.0655390377,0.8667484914,0.9871376509,-0.6953344902,,, +1.4375000000,5,-0.8086493471,-0.2124145663,0.6661389185,1.9635447878,,, +1.4687500000,5,-1.1988821934,-1.3394010772,-0.1688100058,1.5699068231,,, +1.5000000000,6,0.9814084992,0.8068531766,-0.3034584827,-1.0425910551,,, +1.5312500000,6,0.4099144509,1.1952068865,0.4983557018,1.1445444315,,, +1.5625000000,6,0.2724851298,0.6869181620,1.1867185475,1.5013198216,,, +1.5937500000,6,2.4069561396,2.5877673403,0.6771519036,-1.2419463750,,, +1.6250000000,6,1.5472144212,2.0694974039,-0.8266210987,-1.0463628150,,, +1.6562500000,6,1.1997027388,-0.1839871598,-2.0168971580,-1.1194784628,,, +1.6875000000,6,2.8779488994,0.3641695321,-1.9643056971,-0.7420012388,,, +1.7187500000,6,1.4563051832,-0.2026887361,-1.1487345134,0.7176546469,,, +1.7500000000,7,0.7819705904,-1.8389984936,-0.8262613606,-1.0909272040,,, +1.7812500000,7,2.0520274556,-0.1234290101,-1.4955637468,-0.3859075051,,, +1.8125000000,7,0.2993489279,0.6679934029,-2.2938779901,2.8650857800,,, +1.8437500000,7,-0.3417921204,-0.7611641008,-2.0424755980,0.8737882447,,, +1.8750000000,7,0.9506913659,0.1385386313,-0.6953344902,-0.6117828212,,, +1.9062500000,7,-0.6688572272,0.0043701116,0.5394431118,0.7816769419,,, +1.9375000000,7,-0.8668315473,-2.4206456881,0.5615308290,-0.1516857685,,, +1.9687500000,7,0.7412410587,-1.7974455953,-0.3822991487,-0.4131300313,,, +2.0000000000,8,-0.5852777802,-0.7723189861,-1.0425910551,-0.9497739372,,, +2.0312500000,8,-0.3568127661,-1.6840958410,-0.6769683658,-2.3559666125,,, +2.0625000000,8,1.3761889031,0.0983659614,0.0737680120,0.4128262271,,, +2.0937500000,8,0.0324007523,1.8606501325,-0.0164610272,1.3211814381,,, +2.1250000000,8,0.2823791178,0.4087503374,-1.2419463750,-1.2291006398,,, +2.1562500000,8,1.7027679072,0.6661389185,-2.5427995283,0.6576534641,,, +2.1875000000,8,-0.0385524690,1.3163956500,-2.6920820881,2.2084155704,,, +2.2187500000,8,-0.0554208172,-0.6897861214,-1.6940570431,0.5039915002,,, +2.2500000000,9,0.9030515780,-0.3034584827,-0.7420012388,0.3243588722,,, +2.2812500000,9,-1.1992994843,1.5710854567,-0.7922659696,-0.7607044707,,, +2.3125000000,9,-1.2879184845,0.7048895721,-1.4509880084,-0.9995277474,,, +2.3437500000,9,-0.4594717137,1.1867185475,-3.4927627539,0.6782850799,,, +2.3750000000,9,-2.4793752101,2.5309068373,-0.3859075051,-1.5904395907,,, +2.4062500000,9,-2.1726756896,0.3807813663,1.0007956907,-2.2268648350,,, +2.4375000000,9,-1.0439874057,-0.8266210987,1.3630557893,1.3784805497,,, +2.4687500000,9,-2.6298261328,-0.1052226362,0.4624831701,0.9541473858,,, +2.5000000000,10,-1.7310810939,-1.7466375845,-0.6117828212,-0.1603763521,,, +2.5312500000,10,-0.2805237468,-1.9643056971,-0.7284838207,1.0964841466,,, +2.5625000000,10,-1.5706412435,0.2727140524,-0.0203749932,0.6291119609,,, +2.5937500000,10,-0.3846152674,-0.2942868426,0.3347196668,1.0644429647,,, +2.6250000000,10,0.9701626979,-0.8262613606,-0.4131300313,0.4825889334,,, +2.6562500000,10,-0.4783392019,0.5368167826,-1.6227881216,-2.4009484456,,, +2.6875000000,10,0.5424888696,-0.9489926046,-1.9662756714,-0.6742923707,,, +2.7187500000,10,1.4263392704,-2.2938779901,-0.9734886565,0.8125103403,,, +2.7500000000,11,-0.4108610506,-0.5547380276,0.4128262271,-1.8494334914,,, +2.7812500000,11,0.3635555387,-0.5968321736,0.9308023856,-0.8971534422,,, +2.8125000000,11,0.8667484914,-0.6953344902,0.4463823054,1.1069949952,,, +2.8437500000,11,-1.1002432968,1.9100213158,0.0426636172,0.7912462530,,, +2.8750000000,11,-0.2124145663,1.9635447878,0.6576534641,1.4702474315,,, +2.9062500000,11,0.3301381800,0.5615308290,1.9028072080,0.2464688260,,, +2.9375000000,11,-1.3394010772,1.5699068231,2.4783674333,-0.4482837744,,, +2.9687500000,11,0.0041022005,0.7251494037,1.6998640384,1.7383508457,,, +3.0000000000,12,0.8068531766,-1.0425910551,0.3243588722,-0.4315280454,,, +3.0312500000,12,-0.4912335635,0.5893078056,-0.3080250331,-2.7643803080,,, +3.0625000000,12,1.1952068865,1.1445444315,0.1958671810,-0.1897743319,,, +3.0937500000,12,1.9907896528,0.0737680120,0.8883208288,0.0114502696,,, +3.1250000000,12,0.6869181620,1.5013198216,0.6782850799,-0.7741952885,,, +3.1562500000,12,2.2564956184,1.3168811607,-0.3157015938,0.2792427283,,, +3.1875000000,12,2.5877673403,-1.2419463750,-0.8753223314,-0.0063782440,,, +3.2187500000,12,0.8953186036,-1.0211462797,-0.1299899339,1.5184145208,,, +3.2500000000,13,2.0694974039,-1.0463628150,1.3784805497,2.2274498842,,, +3.2812500000,13,1.8235323387,-2.6920820881,2.2848351796,-1.0708097558,,, +3.3125000000,13,-0.1839871598,-1.1194784628,1.9524956297,-0.4579413455,,, +3.3437500000,13,0.8200513727,0.4282048889,1.1561678807,1.3246878224,,, +3.3750000000,13,0.3641695321,-0.7420012388,1.0964841466,-1.3229268867,,, +3.4062500000,13,-1.4990336855,0.0949124460,1.9292948033,-1.7358532045,,, +3.4375000000,13,-0.2026887361,0.7176546469,2.5655088240,-0.5956776917,,, +3.4687500000,13,-0.4451458738,-3.4509880084,1.9820311065,-0.5174254152,,, +3.5000000000,14,-1.8389984936,-1.0909272040,0.4825889334,1.1467688435,,, +3.5312500000,14,-0.0912575086,0.4355042258,-0.5981556844,0.3428316999,,, +3.5625000000,14,-0.1234290101,-0.3859075051,-0.4068856788,-0.6407408097,,, +3.5937500000,14,-1.2117474109,0.8702078730,0.4843950700,2.4003691243,,, +3.6250000000,14,0.6679934029,2.8650857800,0.8125103403,1.5387091828,,, +3.6562500000,14,0.4456384107,1.3630557893,0.1532086532,-1.4887291762,,, +3.6875000000,14,-0.7611641008,0.8737882447,-0.5766315153,-0.2453985203,,, +3.7187500000,14,0.8470458326,1.5190458612,-0.2412622290,-0.2134703607,,, +3.7500000000,15,3.1385386313,-0.6117828212,1.1069949952,-1.0133258960,,, +3.7812500000,15,-1.3353997060,-1.0513076674,2.2186267603,-0.5325571084,,, +3.8125000000,15,0.0043701116,0.7816769419,2.0590285388,-1.6244991150,,, +3.8437500000,15,-1.0080375931,-0.0203749932,0.9761195490,0.0997748588,,, +3.8750000000,15,-2.4206456881,-0.1516857685,0.2464688260,2.4269124897,,, +3.9062500000,15,-0.9395340306,1.3451047636,0.5465998956,-0.2036214940,,, +3.9375000000,15,-1.7974455953,-0.4131300313,1.1687187342,-0.1745101669,,, +3.9687500000,15,-2.7180780314,-1.9703264255,0.9097323660,2.1418587490,,, +4.0000000000,16,-0.7723189861,-0.9497739372,-0.4315280454,0.3403443506,,, +4.0312500000,16,-1.2808655550,-1.9662756714,-1.7403637988,-0.7055335942,,, +4.0625000000,16,-1.6840958410,-2.3559666125,-1.8417807445,-0.8776538362,,, +4.0937500000,16,0.5621986200,0.2326467119,-0.8451463680,-1.5934803325,,, +4.1250000000,16,0.0983659614,0.4128262271,0.0114502696,0.3268928833,,, +4.1562500000,16,-0.2036004516,-0.2453224994,-0.1722950538,-0.2224224967,,, +4.1875000000,16,1.8606501325,1.3211814381,-0.9238158916,-1.9913265080,,, +4.2187500000,16,0.9871376509,0.4463823054,-1.0182130516,1.2816197960,,, +4.2500000000,17,0.4087503374,-1.2291006398,-0.0063782440,2.2316009870,,, +4.2812500000,17,2.0306267967,0.3530693071,1.1785364181,-0.1218676333,,, +4.3125000000,17,0.6661389185,0.6576534641,1.2700366680,0.5685098797,,, +4.3437500000,17,-0.0986454486,0.0272639229,0.1363600204,0.5013551605,,, +4.3750000000,17,1.3163956500,2.2084155704,-1.0708097558,-0.0630998880,,, +4.4062500000,17,-0.1688100058,2.4783674333,-1.2623176879,0.2050039337,,, +4.4375000000,17,-0.6897861214,0.5039915002,-0.6561812935,-2.1904913958,,, +4.4687500000,17,0.9355137218,0.9639543981,-0.4500766717,-1.6627065276,,, +4.5000000000,18,-0.3034584827,0.3243588722,-1.3229268867,1.3608217321,,, +4.5312500000,18,-0.3386875992,-1.9062872569,-2.5598552254,-0.4934669717,,, +4.5625000000,18,1.5710854567,-0.7607044707,-2.8525797785,-0.9834341811,,, +4.5937500000,18,0.4983557018,0.1958671810,-1.8324179939,1.6467899274,,, +4.6250000000,18,0.7048895721,-0.9995277474,-0.5174254152,1.2563684948,,, +4.6562500000,18,2.5225353348,0.1897809985,-0.1405557019,0.9485678810,,, +4.6875000000,18,1.1867185475,0.6782850799,-0.7450991679,0.3616207236,,, +4.7187500000,18,1.1942482732,-1.6946984350,-1.2063198145,-3.3141503457,,, +4.7500000000,19,2.5309068373,-1.5904395907,-0.6407408097,0.4598607025,,, +4.7812500000,19,0.6771519036,-0.8753223314,0.4848661573,0.1463891898,,, +4.8125000000,19,0.3807813663,-2.2268648350,0.8733864765,-2.8719383531,,, +4.8437500000,19,1.2989304814,-0.8191135751,-0.0657413107,-0.7095830712,,, +4.8750000000,19,-0.8266210987,1.3784805497,-1.4887291762,1.1618134295,,, +4.9062500000,19,-1.0543215730,0.4731135773,-2.0684361890,-0.1603183729,,, +4.9375000000,19,-0.1052226362,0.9541473858,-1.5028247523,0.6044175730,,, +4.9687500000,19,-2.0168971580,1.9524956297,-0.7998792476,0.6622647617,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/Artifact-Amplitude-ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/Artifact-Amplitude-ref.csv new file mode 100644 index 0000000..e0cec0b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/Artifact-Amplitude-ref.csv @@ -0,0 +1,105 @@ +Time:32Hz,Epoch,sinusOsc 1,sinusOsc 2,sinusOsc 3,sinusOsc 4,Event Id,Event Date,Event Duration +0.2500000000,0,0.0223674799,1.2564364343,0.5189549878,-2.2082337379,,, +0.2812500000,0,0.8587778323,1.5912609145,-0.8135359478,0.7847811254,,, +0.3125000000,0,1.0605198516,0.3100244990,-1.0731867792,-0.2119004478,,, +0.3437500000,0,-0.8527917255,1.3612667999,-0.1597583084,-1.8827722525,,, +0.3750000000,0,0.2862985568,0.5189549878,0.7847811254,0.9814084992,,, +0.4062500000,0,0.6745718556,-2.0249997390,0.7541775274,1.5472144212,,, +0.4375000000,0,-0.8460419110,-1.3302670931,0.0634287720,0.7819705904,,, +0.4687500000,0,0.7209285523,-1.0731867792,-0.0655390377,0.9506913659,,, +0.7500000000,1,0.5189549878,0.9814084992,0.9030515780,0.8068531766,,, +0.7812500000,1,-0.1244988728,0.2724851298,-0.4594717137,0.6869181620,,, +0.8125000000,1,-2.0249997390,1.5472144212,-1.0439874057,2.0694974039,,, +0.8437500000,1,-0.8135359478,2.8779488994,-0.2805237468,0.3641695321,,, +0.8750000000,1,-1.3302670931,0.7819705904,0.9701626979,-1.8389984936,,, +0.9062500000,1,-2.7774418870,0.2993489279,1.4263392704,0.6679934029,,, +0.9375000000,1,-1.0731867792,0.9506913659,0.8667484914,0.1385386313,,, +0.9687500000,1,-1.2560591950,-0.8668315473,0.3301381800,-2.4206456881,,, +1.2500000000,2,-0.2119004478,-1.7310810939,0.1385386313,-1.7466375845,,, +1.2812500000,2,-1.4354651966,-1.5706412435,-1.0080375931,0.2727140524,,, +1.3125000000,2,0.0634287720,0.9701626979,-1.7974455953,-0.8262613606,,, +1.3437500000,2,-0.9654362809,0.5424888696,-1.2808655550,-0.9489926046,,, +1.3750000000,2,-1.8827722525,-0.4108610506,0.0983659614,-0.5547380276,,, +1.4062500000,2,-0.0655390377,0.8667484914,0.9871376509,-0.6953344902,,, +1.4375000000,2,-0.8086493471,-0.2124145663,0.6661389185,1.9635447878,,, +1.4687500000,2,-1.1988821934,-1.3394010772,-0.1688100058,1.5699068231,,, +1.5000000000,3,0.9814084992,0.8068531766,-0.3034584827,-1.0425910551,,, +1.5312500000,3,0.4099144509,1.1952068865,0.4983557018,1.1445444315,,, +1.5625000000,3,0.2724851298,0.6869181620,1.1867185475,1.5013198216,,, +1.5937500000,3,2.4069561396,2.5877673403,0.6771519036,-1.2419463750,,, +1.6250000000,3,1.5472144212,2.0694974039,-0.8266210987,-1.0463628150,,, +1.6562500000,3,1.1997027388,-0.1839871598,-2.0168971580,-1.1194784628,,, +1.6875000000,3,2.8779488994,0.3641695321,-1.9643056971,-0.7420012388,,, +1.7187500000,3,1.4563051832,-0.2026887361,-1.1487345134,0.7176546469,,, +1.7500000000,4,0.7819705904,-1.8389984936,-0.8262613606,-1.0909272040,,, +1.7812500000,4,2.0520274556,-0.1234290101,-1.4955637468,-0.3859075051,,, +1.8125000000,4,0.2993489279,0.6679934029,-2.2938779901,2.8650857800,,, +1.8437500000,4,-0.3417921204,-0.7611641008,-2.0424755980,0.8737882447,,, +1.8750000000,4,0.9506913659,0.1385386313,-0.6953344902,-0.6117828212,,, +1.9062500000,4,-0.6688572272,0.0043701116,0.5394431118,0.7816769419,,, +1.9375000000,4,-0.8668315473,-2.4206456881,0.5615308290,-0.1516857685,,, +1.9687500000,4,0.7412410587,-1.7974455953,-0.3822991487,-0.4131300313,,, +2.0000000000,5,-0.5852777802,-0.7723189861,-1.0425910551,-0.9497739372,,, +2.0312500000,5,-0.3568127661,-1.6840958410,-0.6769683658,-2.3559666125,,, +2.0625000000,5,1.3761889031,0.0983659614,0.0737680120,0.4128262271,,, +2.0937500000,5,0.0324007523,1.8606501325,-0.0164610272,1.3211814381,,, +2.1250000000,5,0.2823791178,0.4087503374,-1.2419463750,-1.2291006398,,, +2.1562500000,5,1.7027679072,0.6661389185,-2.5427995283,0.6576534641,,, +2.1875000000,5,-0.0385524690,1.3163956500,-2.6920820881,2.2084155704,,, +2.2187500000,5,-0.0554208172,-0.6897861214,-1.6940570431,0.5039915002,,, +2.5000000000,6,-1.7310810939,-1.7466375845,-0.6117828212,-0.1603763521,,, +2.5312500000,6,-0.2805237468,-1.9643056971,-0.7284838207,1.0964841466,,, +2.5625000000,6,-1.5706412435,0.2727140524,-0.0203749932,0.6291119609,,, +2.5937500000,6,-0.3846152674,-0.2942868426,0.3347196668,1.0644429647,,, +2.6250000000,6,0.9701626979,-0.8262613606,-0.4131300313,0.4825889334,,, +2.6562500000,6,-0.4783392019,0.5368167826,-1.6227881216,-2.4009484456,,, +2.6875000000,6,0.5424888696,-0.9489926046,-1.9662756714,-0.6742923707,,, +2.7187500000,6,1.4263392704,-2.2938779901,-0.9734886565,0.8125103403,,, +2.7500000000,7,-0.4108610506,-0.5547380276,0.4128262271,-1.8494334914,,, +2.7812500000,7,0.3635555387,-0.5968321736,0.9308023856,-0.8971534422,,, +2.8125000000,7,0.8667484914,-0.6953344902,0.4463823054,1.1069949952,,, +2.8437500000,7,-1.1002432968,1.9100213158,0.0426636172,0.7912462530,,, +2.8750000000,7,-0.2124145663,1.9635447878,0.6576534641,1.4702474315,,, +2.9062500000,7,0.3301381800,0.5615308290,1.9028072080,0.2464688260,,, +2.9375000000,7,-1.3394010772,1.5699068231,2.4783674333,-0.4482837744,,, +2.9687500000,7,0.0041022005,0.7251494037,1.6998640384,1.7383508457,,, +3.0000000000,8,0.8068531766,-1.0425910551,0.3243588722,-0.4315280454,,, +3.0312500000,8,-0.4912335635,0.5893078056,-0.3080250331,-2.7643803080,,, +3.0625000000,8,1.1952068865,1.1445444315,0.1958671810,-0.1897743319,,, +3.0937500000,8,1.9907896528,0.0737680120,0.8883208288,0.0114502696,,, +3.1250000000,8,0.6869181620,1.5013198216,0.6782850799,-0.7741952885,,, +3.1562500000,8,2.2564956184,1.3168811607,-0.3157015938,0.2792427283,,, +3.1875000000,8,2.5877673403,-1.2419463750,-0.8753223314,-0.0063782440,,, +3.2187500000,8,0.8953186036,-1.0211462797,-0.1299899339,1.5184145208,,, +3.5000000000,9,-1.8389984936,-1.0909272040,0.4825889334,1.1467688435,,, +3.5312500000,9,-0.0912575086,0.4355042258,-0.5981556844,0.3428316999,,, +3.5625000000,9,-0.1234290101,-0.3859075051,-0.4068856788,-0.6407408097,,, +3.5937500000,9,-1.2117474109,0.8702078730,0.4843950700,2.4003691243,,, +3.6250000000,9,0.6679934029,2.8650857800,0.8125103403,1.5387091828,,, +3.6562500000,9,0.4456384107,1.3630557893,0.1532086532,-1.4887291762,,, +3.6875000000,9,-0.7611641008,0.8737882447,-0.5766315153,-0.2453985203,,, +3.7187500000,9,0.8470458326,1.5190458612,-0.2412622290,-0.2134703607,,, +4.0000000000,10,-0.7723189861,-0.9497739372,-0.4315280454,0.3403443506,,, +4.0312500000,10,-1.2808655550,-1.9662756714,-1.7403637988,-0.7055335942,,, +4.0625000000,10,-1.6840958410,-2.3559666125,-1.8417807445,-0.8776538362,,, +4.0937500000,10,0.5621986200,0.2326467119,-0.8451463680,-1.5934803325,,, +4.1250000000,10,0.0983659614,0.4128262271,0.0114502696,0.3268928833,,, +4.1562500000,10,-0.2036004516,-0.2453224994,-0.1722950538,-0.2224224967,,, +4.1875000000,10,1.8606501325,1.3211814381,-0.9238158916,-1.9913265080,,, +4.2187500000,10,0.9871376509,0.4463823054,-1.0182130516,1.2816197960,,, +4.2500000000,11,0.4087503374,-1.2291006398,-0.0063782440,2.2316009870,,, +4.2812500000,11,2.0306267967,0.3530693071,1.1785364181,-0.1218676333,,, +4.3125000000,11,0.6661389185,0.6576534641,1.2700366680,0.5685098797,,, +4.3437500000,11,-0.0986454486,0.0272639229,0.1363600204,0.5013551605,,, +4.3750000000,11,1.3163956500,2.2084155704,-1.0708097558,-0.0630998880,,, +4.4062500000,11,-0.1688100058,2.4783674333,-1.2623176879,0.2050039337,,, +4.4375000000,11,-0.6897861214,0.5039915002,-0.6561812935,-2.1904913958,,, +4.4687500000,11,0.9355137218,0.9639543981,-0.4500766717,-1.6627065276,,, +4.7500000000,12,2.5309068373,-1.5904395907,-0.6407408097,0.4598607025,,, +4.7812500000,12,0.6771519036,-0.8753223314,0.4848661573,0.1463891898,,, +4.8125000000,12,0.3807813663,-2.2268648350,0.8733864765,-2.8719383531,,, +4.8437500000,12,1.2989304814,-0.8191135751,-0.0657413107,-0.7095830712,,, +4.8750000000,12,-0.8266210987,1.3784805497,-1.4887291762,1.1618134295,,, +4.9062500000,12,-1.0543215730,0.4731135773,-2.0684361890,-0.1603183729,,, +4.9375000000,12,-0.1052226362,0.9541473858,-1.5028247523,0.6044175730,,, +4.9687500000,12,-2.0168971580,1.9524956297,-0.7998792476,0.6622647617,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/Artifact-Amplitude-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/Artifact-Amplitude-test.xml new file mode 100644 index 0000000..d218c3c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/artifact/test/scenarios-tests/Artifact-Amplitude-test.xml @@ -0,0 +1,369 @@ + + 2 + OpenViBE Designer + 3.0.0-beta + + + (0x00425137, 0xf2a30c29) + (0x79a9edeb, 0x245d83fc) + Test Name + Covariance-Matrix-Calculator + Artifact-Amplitude + + + + + + + (0x000015a8, 0x000079e9) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01165f9f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000029af, 0x00003a23) + Artefact Amplitude + (0x41727469, 0xb68095e4) + + + (0x5ba36127, 0x195feae1) + Signal + + + + + (0x5ba36127, 0x195feae1) + Non-artefact signal + + + + + (0x512a166f, 0x5c3ef83f) + Max (mV) + 100 + 3 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x3dd557b8, 0xa3fba55d) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000484f, 0x00003eff) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00004c39, 0x0000096b) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x5ba36127, 0x195feae1) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/$var{Test Name}-output.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00005b5f, 0x000050b0) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017178bd) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000492, 0x00005d6b) + + (0x000029af, 0x00003a23) + 0 + + + (0x00004c39, 0x0000096b) + 0 + + + + (0x00001a66, 0x00001ca2) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x000015a8, 0x000079e9) + 0 + + + + (0x0000702c, 0x00002b90) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00005b5f, 0x000050b0) + 0 + + + + (0x00007556, 0x000015f0) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000029af, 0x00003a23) + 0 + + + + + + + (0x000062ac, 0x00003721) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000041e, 0x000069b5)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004c5d, 0x000021d4)","index":0,"name":"Default tab","parentIdentifier":"(0x0000041e, 0x000069b5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000420e, 0x000074bb)","index":0,"name":"Empty","parentIdentifier":"(0x00004c5d, 0x000021d4)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/CMakeLists.txt new file mode 100755 index 0000000..85ab2e0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/CMakeLists.txt @@ -0,0 +1,39 @@ +PROJECT(openvibe-plugins-classification) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES} + "../../../contrib/packages/libSVM/svm.cpp" + "../../../contrib/packages/libSVM/svm.h") +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleXML") +INCLUDE("FindThirdPartyEigen") + +# --------------------------------- +# Test applications +# --------------------------------- +IF(OV_COMPILE_TESTS) + ADD_SUBDIRECTORY(test) +ENDIF(OV_COMPILE_TESTS) + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-0-training.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-0-training.xml new file mode 100644 index 0000000..e53b109 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-0-training.xml @@ -0,0 +1,1521 @@ + + 2 + OpenViBE Designer + 2.1.0 + + + + + + (0x000001b3, 0x00001dd9) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0140dd3a) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000019ca, 0x00002a82) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x012f7f49) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003577, 0x00001a8d) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 20 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Train + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 192 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0107fa9f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004173, 0x000028f8) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + (x+1)*10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 146 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017edc7f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000049ab, 0x00001b71) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 0.95;0;0;0; 0;1;0;0; 0;0;0.95;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01620685) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005062, 0x000009d6) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Path_UserData}/classification-training-tutorial-model.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + true + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + 0 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 383 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02edbb58) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000054b6, 0x00003d05) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 492 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x013b6cb8) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005607, 0x00006ea5) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x011ab8e2) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005ad9, 0x00001e9a) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 64 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x010257c6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x00005aec, 0x00002f62) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0; 0;0.95;0;0; 0;0;0.95;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 239 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x014bbe4a) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005af8, 0x000040b0) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + (0x5ba36127, 0x195feae1) + Input 3 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 479 + + + (0x207c9054, 0x3c841b63) + 656 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0040af17) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005cfa, 0x0000014c) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x013a2df6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005e83, 0x00002801) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 544 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00201ccf) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00005e9c, 0x00002191) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01256795) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007ed4, 0x000021e0) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x012e0e30) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007f24, 0x00000510) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 0.95;0;0;0; 0;0.95;0;0; 0;0;1;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 479 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01a16618) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000004ff, 0x000042bf) + + (0x00007ed4, 0x000021e0) + 0 + + + (0x00005af8, 0x000040b0) + 1 + + + + (0x00001073, 0x00001b2f) + + (0x00005af8, 0x000040b0) + 0 + + + (0x00005e83, 0x00002801) + 0 + + + + (0x00001143, 0x000051f2) + + (0x000019ca, 0x00002a82) + 0 + + + (0x00005e9c, 0x00002191) + 0 + + + + (0x00002239, 0x00002157) + + (0x00004173, 0x000028f8) + 0 + + + (0x00007f24, 0x00000510) + 0 + + + + (0x0000253c, 0x000007cd) + + (0x00005062, 0x000009d6) + 0 + + + (0x00005607, 0x00006ea5) + 0 + + + + (0x0000273b, 0x00000178) + + (0x000001b3, 0x00001dd9) + 0 + + + (0x00005062, 0x000009d6) + 3 + + + + (0x000027ec, 0x0000135b) + + (0x000049ab, 0x00001b71) + 0 + + + (0x00007ed4, 0x000021e0) + 0 + + + + (0x00003694, 0x00005707) + + (0x00004173, 0x000028f8) + 0 + + + (0x00005aec, 0x00002f62) + 0 + + + + (0x00003c2d, 0x00002d75) + + (0x000054b6, 0x00003d05) + 0 + + + (0x000001b3, 0x00001dd9) + 0 + + + + (0x000042ca, 0x000075d8) + + (0x00004173, 0x000028f8) + 0 + + + (0x000049ab, 0x00001b71) + 0 + + + + (0x000046df, 0x00001885) + + (0x00003577, 0x00001a8d) + 0 + + + (0x00005062, 0x000009d6) + 0 + + + + (0x00005629, 0x00007bae) + + (0x000019ca, 0x00002a82) + 0 + + + (0x00005af8, 0x000040b0) + 0 + + + + (0x00005666, 0x00003b1b) + + (0x000054b6, 0x00003d05) + 0 + + + (0x00005af8, 0x000040b0) + 2 + + + + (0x00005c2d, 0x00006b3b) + + (0x00007f24, 0x00000510) + 0 + + + (0x000054b6, 0x00003d05) + 0 + + + + (0x000064ed, 0x000069e4) + + (0x00005e9c, 0x00002191) + 0 + + + (0x00005062, 0x000009d6) + 1 + + + + (0x000067a1, 0x0000014b) + + (0x00007ed4, 0x000021e0) + 0 + + + (0x00005cfa, 0x0000014c) + 0 + + + + (0x00006a54, 0x000050d8) + + (0x00005aec, 0x00002f62) + 0 + + + (0x000019ca, 0x00002a82) + 0 + + + + (0x00006c65, 0x00004be9) + + (0x00005cfa, 0x0000014c) + 0 + + + (0x00005062, 0x000009d6) + 2 + + + + (0x00007092, 0x000022d5) + + (0x00005ad9, 0x00001e9a) + 0 + + + (0x00004173, 0x000028f8) + 0 + + + + + + (0x0000019a, 0x000047dc) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 368.000000 + + + (0x7234b86b, 0x2b8651a5) + -16.000000 + + + + + (0x00000509, 0x00005a61) + <b>Signal Display</b> can be used to view the data. +Note that the data the classifier gets has 4 +dimensions, whereas for display purposes the +signals are catenated in a way that channels 0-3 are +the data for the first stream, 4-7 for the second one +and so on. + + + (0x473d9a43, 0x97fc0a97) + 896.000000 + + + (0x7234b86b, 0x2b8651a5) + 512.000000 + + + + + (0x00000853, 0x000052d8) + Applying 4x4 matrix multiplication three times by <b>Spatial +Filter</b> is used to generate data for 3 classes. For each +class i, dimension i is the most prominent. Others are +damped, except dimension 4, which is considered pure noise. + +<b>Signal average</b> boxes turn each chunk of signal into one +example to classify. It increases the stability of the features. + +The role of the classifier training is to discover the +decision rule that can tell the 3 streams apart. Note +that if the coefficients 0.95 in the spatial filters are set to 0, +a good classification rule is really simple: class = i iff x(i)>0 +(and ignore dimension 4). However, with 0.95, a perfect +classification is not possible as there is overlap in the classes. + +You can change the matrixes and explore how it affects +the obtained cross-validation accuracies while changing +the classifiers and the multiclass strategies. + + + (0x473d9a43, 0x97fc0a97) + 864.000000 + + + (0x7234b86b, 0x2b8651a5) + 288.000000 + + + + + (0x00006c3f, 0x000058d1) + 4 channel noise x from Uniform Random (0,1) +generator is amplified to range (x+1)*10. + + + (0x473d9a43, 0x97fc0a97) + 656.000000 + + + (0x7234b86b, 0x2b8651a5) + 112.000000 + + + + + (0x00007e15, 0x00005a2d) + <b>Timeout</b> box controls how much training data is used. + +After training, the <b>Classifier trainer</b> saves the classifier +in a file which could then in principle be loaded by a +<b>classifier processor</b> box to classify future data. + +Finally, the scenario stops after the classifier has been saved. + + + (0x473d9a43, 0x97fc0a97) + 720.000000 + + + (0x7234b86b, 0x2b8651a5) + 656.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00005e83, 0x00002801)","childCount":0,"identifier":"(0x00001b61, 0x00000023)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000226f, 0x000024a5)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":475},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000030d3, 0x00006f49)","index":0,"name":"Default tab","parentIdentifier":"(0x0000226f, 0x000024a5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00005b4b, 0x00004dca)","index":0,"name":"Empty","parentIdentifier":"(0x000030d3, 0x00006f49)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Classification training example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-1-testing.lua b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-1-testing.lua new file mode 100644 index 0000000..f60ce32 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-1-testing.lua @@ -0,0 +1,30 @@ + +sent = false + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + sent = false; +end + +function uninitialize(box) +end + +function process(box) + + while box:keep_processing() and sent == false do + + current_time = box:get_current_time() + 1 + + box:send_stimulation(1, OVTK_StimulationId_Label_01, current_time, 0) + box:send_stimulation(1, OVTK_StimulationId_Label_02, current_time+10, 0) + box:send_stimulation(1, OVTK_StimulationId_Label_03, current_time+20, 0) + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, current_time+30, 0) + + sent = true + + box:sleep() + + end + +end + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-1-testing.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-1-testing.xml new file mode 100644 index 0000000..f456ce3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-1-testing.xml @@ -0,0 +1,1685 @@ + + 2 + OpenViBE Designer + 2.1.0 + + + + + + (0x000001b3, 0x00001dd9) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 582 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001b7409) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000a83, 0x00006fd7) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 880 + + + (0x207c9054, 0x3c841b63) + 160 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b16ab9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000d0c, 0x00002cda) + Confusion Matrix + (0x1ab625da, 0x3b2502ce) + + + (0x6f752dd0, 0x082a321e) + Targets + + + (0x6f752dd0, 0x082a321e) + Classification results + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Percentages + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Sums + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 + OVTK_GDF_Artifact_EOG_Large + OVTK_StimulationId_Label_03 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 784 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0x05cf579a, 0x80d8b480) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00de8e03) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001838, 0x00000241) + Matrix Display + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 848 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006eaeb9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000019ca, 0x00002a82) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 454 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002b6629) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004173, 0x000028f8) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + (x+1)*10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0044b986) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000049ab, 0x00001b71) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 0.95;0;0;0; 0;1;0;0; 0;0;0.95;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 326 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001ba8c1) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000054b6, 0x00003d05) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 454 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001eadd9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005ad9, 0x00001e9a) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 64 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004ea17f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x00005aec, 0x00002f62) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0; 0;0.95;0;0; 0;0;0.95;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 326 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002e76f6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005cfa, 0x0000014c) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 582 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001b5c9d) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005dbd, 0x00001d0e) + Streamed matrix multiplexer + (0x7a12298b, 0x785f4d42) + + + (0x17341935, 0x152ff448) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + (0x17341935, 0x152ff448) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Multiplexed streamed matrix + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x4badfdff, 0xc35004a3) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005e9c, 0x00002191) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 582 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002b71e5) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006747, 0x00003cbe) + Stimulation Filter + (0x02f96101, 0x5e647cb8) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x6f752dd0, 0x082a321e) + Modified Stimulations + + + + + (0x09e59e57, 0x8d4a553a) + Default action + Reject + Reject + false + + + (0x512a166f, 0x5c3ef83f) + Time range begin + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time range end + 0 + 0 + false + + + (0x09e59e57, 0x8d4a553a) + Action to perform + Select + Select + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range begin + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range end + OVTK_StimulationId_Label_0F + OVTK_StimulationId_Label_0F + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x4e7b798a, 0x183beafb) + (0x47859b3f, 0x1dfdf5cd) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00f98130) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000677f, 0x00007d9c) + Lua Stimulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/classification-1-testing.lua + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 182 + + + (0x207c9054, 0x3c841b63) + 224 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01108500) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007474, 0x00002f72) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Path_UserData}/classification-training-tutorial-model.xml + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00007b60, 0x00005390) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x5ba36127, 0x195feae1) + Output + + + (0x5ba36127, 0x195feae1) + Output(1) + + + (0x5ba36127, 0x195feae1) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 246 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00f115e0) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00007ed4, 0x000021e0) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 454 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a83ea) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007f24, 0x00000510) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 0.95;0;0;0; 0;0.95;0;0; 0;0;1;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 326 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001ad00b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000bcd, 0x00005e08) + + (0x0000677f, 0x00007d9c) + 0 + + + (0x00006747, 0x00003cbe) + 0 + + + + (0x00001143, 0x000051f2) + + (0x000019ca, 0x00002a82) + 0 + + + (0x00005e9c, 0x00002191) + 0 + + + + (0x000015b1, 0x000074a9) + + (0x00007b60, 0x00005390) + 2 + + + (0x00007f24, 0x00000510) + 0 + + + + (0x000027ec, 0x0000135b) + + (0x000049ab, 0x00001b71) + 0 + + + (0x00007ed4, 0x000021e0) + 0 + + + + (0x000033e0, 0x00003da8) + + (0x00007b60, 0x00005390) + 1 + + + (0x000049ab, 0x00001b71) + 0 + + + + (0x000034c6, 0x000011d9) + + (0x00007b60, 0x00005390) + 0 + + + (0x00005aec, 0x00002f62) + 0 + + + + (0x00003c2d, 0x00002d75) + + (0x000054b6, 0x00003d05) + 0 + + + (0x000001b3, 0x00001dd9) + 0 + + + + (0x0000426f, 0x00006d4a) + + (0x00000d0c, 0x00002cda) + 0 + + + (0x00001838, 0x00000241) + 0 + + + + (0x00005214, 0x00003c09) + + (0x00007474, 0x00002f72) + 0 + + + (0x00000d0c, 0x00002cda) + 1 + + + + (0x00005233, 0x00007df9) + + (0x0000677f, 0x00007d9c) + 0 + + + (0x00007b60, 0x00005390) + 0 + + + + (0x00005a12, 0x00003caf) + + (0x0000677f, 0x00007d9c) + 0 + + + (0x00000a83, 0x00006fd7) + 0 + + + + (0x00005b4b, 0x00004609) + + (0x00004173, 0x000028f8) + 0 + + + (0x00007b60, 0x00005390) + 1 + + + + (0x00005c2d, 0x00006b3b) + + (0x00007f24, 0x00000510) + 0 + + + (0x000054b6, 0x00003d05) + 0 + + + + (0x000067a1, 0x0000014b) + + (0x00007ed4, 0x000021e0) + 0 + + + (0x00005cfa, 0x0000014c) + 0 + + + + (0x00006a54, 0x000050d8) + + (0x00005aec, 0x00002f62) + 0 + + + (0x000019ca, 0x00002a82) + 0 + + + + (0x0000703d, 0x00006064) + + (0x00005cfa, 0x0000014c) + 0 + + + (0x00005dbd, 0x00001d0e) + 1 + + + + (0x00007056, 0x00006a05) + + (0x00005dbd, 0x00001d0e) + 0 + + + (0x00007474, 0x00002f72) + 0 + + + + (0x00007092, 0x000022d5) + + (0x00005ad9, 0x00001e9a) + 0 + + + (0x00004173, 0x000028f8) + 0 + + + + (0x00007663, 0x00005363) + + (0x000001b3, 0x00001dd9) + 0 + + + (0x00005dbd, 0x00001d0e) + 2 + + + + (0x0000787b, 0x00006564) + + (0x00006747, 0x00003cbe) + 0 + + + (0x00000d0c, 0x00002cda) + 0 + + + + (0x00007b85, 0x0000418f) + + (0x00005e9c, 0x00002191) + 0 + + + (0x00005dbd, 0x00001d0e) + 0 + + + + + + (0x0000019a, 0x000047dc) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 368.000000 + + + (0x7234b86b, 0x2b8651a5) + -16.000000 + + + + + (0x000050ff, 0x000054cc) + The <b>lua stimulator</b> generates a timeline +specifying 10 seconds of data from each class. +The stimuli control stream switch, which routes +the uniform random data to class-specific +transformations. + + + (0x473d9a43, 0x97fc0a97) + 784.000000 + + + (0x7234b86b, 0x2b8651a5) + 304.000000 + + + + + (0x00005918, 0x00002cab) + The classification accuracy is measured +by the <b>Confusion Matrix</b> box. + +When the classification is good, +the accuracies on the diagonal +are the highest. + +The 'No Target available' warning is normal, +it means that in the scenario, the confusion +matrix gets some predictions from the classifier +before it has received the corresponding target +from the lua chain. + + + (0x473d9a43, 0x97fc0a97) + 752.000000 + + + (0x7234b86b, 0x2b8651a5) + 800.000000 + + + + + (0x00006c3f, 0x000058d1) + This is a test scenario corresponding to +<b>classification-0-training.xml</b> + +Please run the training scenario first. + +Fresh data is drawn from the same distribution +that was used in the training and is sent +to the classifier. + +Note that since the data is freshly sampled, +it was never used in training. Hence, the accuracy +estimate should be unbiased in this scenario. + + + (0x473d9a43, 0x97fc0a97) + 784.000000 + + + (0x7234b86b, 0x2b8651a5) + 128.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000226f, 0x000024a5)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":475},{"boxIdentifier":"(0x00001838, 0x00000241)","childCount":0,"identifier":"(0x00004ca4, 0x000029f2)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000030d3, 0x00006f49)","index":0,"name":"Default tab","parentIdentifier":"(0x0000226f, 0x000024a5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00005b4b, 0x00004dca)","index":0,"name":"Empty","parentIdentifier":"(0x000030d3, 0x00006f49)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Classification testing example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-2-incremental.cfg b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-2-incremental.cfg new file mode 100644 index 0000000..bd645df --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-2-incremental.cfg @@ -0,0 +1,28 @@ + + Native + Linear Discrimimant Analysis (LDA) + + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_03 + + + + 0 1 2 + + + 1.420580e+002 1.407747e+002 1.515542e+002 1.064545e+002 + -3949.05 + + + 1.396979e+002 1.432478e+002 1.514010e+002 1.063725e+002 + -3947.23 + + + 1.396863e+002 1.410456e+002 1.539364e+002 1.070348e+002 + -3961.82 + + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-2-incremental.lua b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-2-incremental.lua new file mode 100644 index 0000000..409d92e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-2-incremental.lua @@ -0,0 +1,39 @@ + +sent = false + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + sent = false; +end + +function uninitialize(box) +end + +function process(box) + + while box:keep_processing() and sent == false do + + current_time = box:get_current_time() + 1 + + box:send_stimulation(1, OVTK_StimulationId_Label_01, current_time, 0) + box:send_stimulation(1, OVTK_StimulationId_Label_02, current_time+4, 0) + box:send_stimulation(1, OVTK_StimulationId_Label_03, current_time+8, 0) + box:send_stimulation(1, OVTK_StimulationId_Label_02, current_time+12, 0) + box:send_stimulation(1, OVTK_StimulationId_Label_01, current_time+16, 0) + box:send_stimulation(1, OVTK_StimulationId_Label_03, current_time+20, 0) + box:send_stimulation(1, OVTK_StimulationId_Label_01, current_time+24, 0) + box:send_stimulation(1, OVTK_StimulationId_Label_02, current_time+28, 0) + box:send_stimulation(1, OVTK_StimulationId_Label_03, current_time+32, 0) + box:send_stimulation(1, OVTK_StimulationId_Label_03, current_time+36, 0) + box:send_stimulation(1, OVTK_StimulationId_Label_02, current_time+40, 0) + box:send_stimulation(1, OVTK_StimulationId_Label_01, current_time+44, 0) + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, current_time+48, 0) + + sent = true + + box:sleep() + + end + +end + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-2-incremental.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-2-incremental.xml new file mode 100644 index 0000000..6ac5cd9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/box-tutorials/classification-2-incremental.xml @@ -0,0 +1,1979 @@ + + 2 + OpenViBE Designer + 2.1.0 + + + + + + (0x000001b3, 0x00001dd9) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 582 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00302844) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000a83, 0x00006fd7) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 880 + + + (0x207c9054, 0x3c841b63) + 160 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00ec2443) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000d0c, 0x00002cda) + Confusion Matrix + (0x1ab625da, 0x3b2502ce) + + + (0x6f752dd0, 0x082a321e) + Targets + + + (0x6f752dd0, 0x082a321e) + Classification results + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Percentages + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Sums + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 + OVTK_GDF_Artifact_EOG_Large + OVTK_StimulationId_Label_03 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 784 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0x05cf579a, 0x80d8b480) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x029ebee3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001838, 0x00000241) + Matrix Display + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 848 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bcabb6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000019ca, 0x00002a82) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 454 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002bfe51) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001f59, 0x00002c7a) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 2.0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Train + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005ac723) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x0000382f, 0x00002565) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/classification-2-incremental.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x008705e9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004173, 0x000028f8) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + (x+1)*10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004da571) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000049ab, 0x00001b71) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 0.95;0;0;0; 0;1;0;0; 0;0;0.95;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 326 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0046eb98) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000053c9, 0x000018f6) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/classification-2-incremental.cfg + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 5 + 0 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 656 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x007af194) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000054b6, 0x00003d05) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 454 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0034e495) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005ad9, 0x00001e9a) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 64 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003f0135) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x00005aec, 0x00002f62) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0; 0;0.95;0;0; 0;0;0.95;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 326 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00321433) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005cfa, 0x0000014c) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0045112b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005dbd, 0x00001d0e) + Streamed matrix multiplexer + (0x7a12298b, 0x785f4d42) + + + (0x17341935, 0x152ff448) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + (0x17341935, 0x152ff448) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Multiplexed streamed matrix + + + + + (0x1fa7a38f, 0x54edbe0b) + 656 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x4badfdff, 0xc35004a3) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00350d8d) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005e9c, 0x00002191) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 582 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002bac54) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006747, 0x00003cbe) + Stimulation Filter + (0x02f96101, 0x5e647cb8) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x6f752dd0, 0x082a321e) + Modified Stimulations + + + + + (0x09e59e57, 0x8d4a553a) + Default action + Reject + Reject + false + + + (0x512a166f, 0x5c3ef83f) + Time range begin + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time range end + 0 + 0 + false + + + (0x09e59e57, 0x8d4a553a) + Action to perform + Select + Select + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range begin + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range end + OVTK_StimulationId_Label_0F + OVTK_StimulationId_Label_0F + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x4e7b798a, 0x183beafb) + (0x47859b3f, 0x1dfdf5cd) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x013dbee9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000677f, 0x00007d9c) + Lua Stimulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/classification-2-incremental.lua + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 182 + + + (0x207c9054, 0x3c841b63) + 224 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00f550ca) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007b60, 0x00005390) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x5ba36127, 0x195feae1) + Output + + + (0x5ba36127, 0x195feae1) + Output(1) + + + (0x5ba36127, 0x195feae1) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 246 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x010f9a10) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00007ed4, 0x000021e0) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 454 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004ea14d) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007f24, 0x00000510) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 0.95;0;0;0; 0;0.95;0;0; 0;0;1;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 326 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002bac56) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000009a1, 0x0000507c) + + (0x00001f59, 0x00002c7a) + 0 + + + (0x000053c9, 0x000018f6) + 0 + + + + (0x00000bcd, 0x00005e08) + + (0x0000677f, 0x00007d9c) + 0 + + + (0x00006747, 0x00003cbe) + 0 + + + + (0x00001143, 0x000051f2) + + (0x000019ca, 0x00002a82) + 0 + + + (0x00005e9c, 0x00002191) + 0 + + + + (0x00001383, 0x000076af) + + (0x000001b3, 0x00001dd9) + 0 + + + (0x000053c9, 0x000018f6) + 3 + + + + (0x000015b1, 0x000074a9) + + (0x00007b60, 0x00005390) + 2 + + + (0x00007f24, 0x00000510) + 0 + + + + (0x000027ec, 0x0000135b) + + (0x000049ab, 0x00001b71) + 0 + + + (0x00007ed4, 0x000021e0) + 0 + + + + (0x000033e0, 0x00003da8) + + (0x00007b60, 0x00005390) + 1 + + + (0x000049ab, 0x00001b71) + 0 + + + + (0x000034c6, 0x000011d9) + + (0x00007b60, 0x00005390) + 0 + + + (0x00005aec, 0x00002f62) + 0 + + + + (0x00003c2d, 0x00002d75) + + (0x000054b6, 0x00003d05) + 0 + + + (0x000001b3, 0x00001dd9) + 0 + + + + (0x0000426f, 0x00006d4a) + + (0x00000d0c, 0x00002cda) + 0 + + + (0x00001838, 0x00000241) + 0 + + + + (0x00004aba, 0x00005544) + + (0x00005e9c, 0x00002191) + 0 + + + (0x000053c9, 0x000018f6) + 1 + + + + (0x00005233, 0x00007df9) + + (0x0000677f, 0x00007d9c) + 0 + + + (0x00007b60, 0x00005390) + 0 + + + + (0x00005a12, 0x00003caf) + + (0x0000677f, 0x00007d9c) + 0 + + + (0x00000a83, 0x00006fd7) + 0 + + + + (0x00005b4b, 0x00004609) + + (0x00004173, 0x000028f8) + 0 + + + (0x00007b60, 0x00005390) + 1 + + + + (0x00005c2d, 0x00006b3b) + + (0x00007f24, 0x00000510) + 0 + + + (0x000054b6, 0x00003d05) + 0 + + + + (0x000067a1, 0x0000014b) + + (0x00007ed4, 0x000021e0) + 0 + + + (0x00005cfa, 0x0000014c) + 0 + + + + (0x00006a54, 0x000050d8) + + (0x00005aec, 0x00002f62) + 0 + + + (0x000019ca, 0x00002a82) + 0 + + + + (0x00006d39, 0x000070cf) + + (0x00005dbd, 0x00001d0e) + 0 + + + (0x0000382f, 0x00002565) + 0 + + + + (0x0000703d, 0x00006064) + + (0x00005cfa, 0x0000014c) + 0 + + + (0x00005dbd, 0x00001d0e) + 1 + + + + (0x00007092, 0x000022d5) + + (0x00005ad9, 0x00001e9a) + 0 + + + (0x00004173, 0x000028f8) + 0 + + + + (0x0000748a, 0x00007a4c) + + (0x00005cfa, 0x0000014c) + 0 + + + (0x000053c9, 0x000018f6) + 2 + + + + (0x00007663, 0x00005363) + + (0x000001b3, 0x00001dd9) + 0 + + + (0x00005dbd, 0x00001d0e) + 2 + + + + (0x0000787b, 0x00006564) + + (0x00006747, 0x00003cbe) + 0 + + + (0x00000d0c, 0x00002cda) + 0 + + + + (0x00007881, 0x00007f08) + + (0x0000382f, 0x00002565) + 0 + + + (0x00000d0c, 0x00002cda) + 1 + + + + (0x00007b85, 0x0000418f) + + (0x00005e9c, 0x00002191) + 0 + + + (0x00005dbd, 0x00001d0e) + 0 + + + + (0x00007df8, 0x000073d0) + + (0x000053c9, 0x000018f6) + 0 + + + (0x0000382f, 0x00002565) + 1 + + + + + + (0x0000019a, 0x000047dc) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 368.000000 + + + (0x7234b86b, 0x2b8651a5) + -16.000000 + + + + + (0x000024f4, 0x0000386b) + The Clock Stimulator tells the +Classifier Trainer to estimate a +new classifier every 2s with all +the so-far accumulted data. + + + (0x473d9a43, 0x97fc0a97) + 928.000000 + + + (0x7234b86b, 0x2b8651a5) + 560.000000 + + + + + (0x000050ff, 0x000054cc) + The <b>lua stimulator</b> generates a timeline +specifying 4 seconds of data from each class, +the sources alternating during 48 sec. + +The stimuli in the timeline control stream switch, +which routes the uniform random data to class-specific +transformations. + + + (0x473d9a43, 0x97fc0a97) + 784.000000 + + + (0x7234b86b, 0x2b8651a5) + 304.000000 + + + + + (0x00005918, 0x00002cab) + The classification accuracy is measured +by the <b>Confusion Matrix</b> box. + +When the classification is good, +the accuracies on the diagonal +are the highest. + +The 'No Target available' warning is normal, +it means that in the scenario, the confusion +matrix gets some predictions from the classifier +before it has received the corresponding target +from the lua chain. + + + (0x473d9a43, 0x97fc0a97) + 752.000000 + + + (0x7234b86b, 0x2b8651a5) + 800.000000 + + + + + (0x00006c3f, 0x000058d1) + This is a test scenario illustrating +basic incremental online learning. + +Data is classified with the learned model, +and the model is repeatedly updated during +the session. + +Note that the classifier in principle +shouldn't be used with the data that +has been used for its estimation +(overfitting). Here when the 'reload model' +is received by the processor, the previous +classifier has - verify - already processed +all the features received so far. + + + (0x473d9a43, 0x97fc0a97) + 784.000000 + + + (0x7234b86b, 0x2b8651a5) + 112.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000226f, 0x000024a5)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":475},{"boxIdentifier":"(0x00001838, 0x00000241)","childCount":0,"identifier":"(0x00004ca4, 0x000029f2)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000030d3, 0x00006f49)","index":0,"name":"Default tab","parentIdentifier":"(0x0000226f, 0x000024a5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00005b4b, 0x00004dca)","index":0,"name":"Empty","parentIdentifier":"(0x000030d3, 0x00006f49)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Classification testing example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/doc/Doc_BoxAlgorithm_OutlierRemoval.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/doc/Doc_BoxAlgorithm_OutlierRemoval.dox-part new file mode 100644 index 0000000..e75025f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/doc/Doc_BoxAlgorithm_OutlierRemoval.dox-part @@ -0,0 +1,88 @@ +/** + * \page BoxAlgorithm_OutlierRemoval Outlier Removal +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_OutlierRemoval_Description| +The outlier removal box discards extremal feature vectors. The user can specify the desired quantile limits [min,max]. +The algorithm loops through the feature dimensions and computes range r(j)=[quantile(min),quantile(max)] for each dimension j. +If each feature j of example i is inside r(j), the example i is kept. Otherwise it is discarded. The box is intended to +be sent all the vectors of interest before being given the stimulation to start the removal. + * |OVP_DocEnd_BoxAlgorithm_OutlierRemoval_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_OutlierRemoval_Inputs| + * |OVP_DocEnd_BoxAlgorithm_OutlierRemoval_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_OutlierRemoval_Input1| + The stimulation to start the removal. + * |OVP_DocEnd_BoxAlgorithm_OutlierRemoval_Input1| + + * |OVP_DocBegin_BoxAlgorithm_OutlierRemoval_Input2| + The feature vectors to prune. + * |OVP_DocEnd_BoxAlgorithm_OutlierRemoval_Input2| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_OutlierRemoval_Outputs| + * |OVP_DocEnd_BoxAlgorithm_OutlierRemoval_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_OutlierRemoval_Output1| +The stimulation to announce that the removal is complete. + * |OVP_DocEnd_BoxAlgorithm_OutlierRemoval_Output1| + + * |OVP_DocBegin_BoxAlgorithm_OutlierRemoval_Output2| +The kept feature vectors. + * |OVP_DocEnd_BoxAlgorithm_OutlierRemoval_Output2| + +______________________________________________________ +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_OutlierRemoval_Settings| + * |OVP_DocEnd_BoxAlgorithm_OutlierRemoval_Settings| + + * |OVP_DocBegin_BoxAlgorithm_OutlierRemoval_Setting1| +Lower quantile threshold. In [0,1]. + * |OVP_DocEnd_BoxAlgorithm_OutlierRemoval_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_OutlierRemoval_Setting2| +Upper quantile threshold. In [0,1]. + * |OVP_DocEnd_BoxAlgorithm_OutlierRemoval_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_OutlierRemoval_Setting3| +Stimulation to start the removal at and to pass out after. + * |OVP_DocEnd_BoxAlgorithm_OutlierRemoval_Setting3| + +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_OutlierRemoval_Examples| +Choice [0.02,0.95] truncates at 2% of the lowest feature values and at 95% of the highest feature values, per dimension. + +If the quantile range is specified as [0,1], the box will pass out the original vector set. + * |OVP_DocEnd_BoxAlgorithm_OutlierRemoval_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_OutlierRemoval_Miscellaneous| +The box can be attempted to remove artifacts when training classifiers that are sensitive to extremal values, for example LDA. In band-power based Motor Imagery, eye blinks can cause really strong band powers, which can then bias the classifier training. With proper control of the upper quantile of this box, such examples can be pruned from the training set. + +An intuitive way to think about the filtering made by the box is to imagine a hypercube (rectangle) in the data space. The boundaries of the cube correspond to the estimated quantiles. Each feature vector that is fully inside the cube is kept. + +It may be difficult to choose meaningful quantile limits without looking at the feature values. The latter can be attempted with Signal Display. It is also possible to have outliers that are not in any way extremal. Such outliers can be wrongly placed in the feature space or have a wrong associated class label. This box cannot catch such problems. + * |OVP_DocEnd_BoxAlgorithm_OutlierRemoval_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierMLP.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierMLP.cpp new file mode 100644 index 0000000..6afbdf6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierMLP.cpp @@ -0,0 +1,476 @@ +#if defined TARGET_HAS_ThirdPartyEIGEN + +#include "ovpCAlgorithmClassifierMLP.h" +#include "../ovp_defines.h" + +#include +#include +#include +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + +//Need to be reachable from outside +const char* const MLP_EVALUATION_FUNCTION_NAME = "Evaluation function"; + +static const char* const MLP_TYPE_NODE_NAME = "MLP"; +static const char* const MLP_NEURON_CONFIG_NODE_NAME = "Neuron-configuration"; +static const char* const MLP_INPUT_NEURON_COUNT_NODE_NAME = "Input-neuron-count"; +static const char* const MLP_HIDDEN_NEURON_COUNT_NODE_NAME = "Hidden-neuron-count"; +static const char* const MLP_MAX_NODE_NAME = "Maximum"; +static const char* const MLP_MIN_NODE_NAME = "Minimum"; +static const char* const MLP_INPUT_BIAS_NODE_NAME = "Input-bias"; +static const char* const MLP_INPUT_WEIGHT_NODE_NAME = "Input-weight"; +static const char* const MLP_HIDDEN_BIAS_NODE_NAME = "Hidden-bias"; +static const char* const MLP_HIDDEN_WEIGHT_NODE_NAME = "Hidden-weight"; +static const char* const MLP_CLASS_LABEL_NODE_NAME = "Class-label"; + +int MLPClassificationCompare(CMatrix& first, CMatrix& second) +{ + //We first need to find the best classification of each. + double* buffer = first.getBuffer(); + const double maxFirst = *(std::max_element(buffer, buffer + first.getBufferElementCount())); + + buffer = second.getBuffer(); + const double maxSecond = *(std::max_element(buffer, buffer + second.getBufferElementCount())); + + //Then we just compared them + if (OVFloatEqual(maxFirst, maxSecond)) { return 0; } + if (maxFirst > maxSecond) { return -1; } + return 1; +} + +#define MLP_DEBUG 0 +#if MLP_DEBUG +void dumpMatrix(Kernel::ILogManager& rMgr, const MatrixXd& mat, const CString& desc) +{ + rMgr << Kernel::LogLevel_Info << desc << "\n"; + for (int i = 0; i < mat.rows(); ++i) { + rMgr << Kernel::LogLevel_Info << "Row " << i << ": "; + for (int j = 0; j < mat.cols(); ++j) { + rMgr << mat(i, j) << " "; + } + rMgr << "\n"; + } +} +#else +void dumpMatrix(Kernel::ILogManager& /*rMgr*/, const Eigen::MatrixXd& /*mat*/, const CString& /*desc*/) { } +#endif + + +bool CAlgorithmClassifierMLP::initialize() +{ + Kernel::TParameterHandler iHidden(this->getInputParameter(OVP_Algorithm_ClassifierMLP_InputParameterId_HiddenNeuronCount)); + iHidden = 3; + + Kernel::TParameterHandler config(this->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Config)); + config = nullptr; + + Kernel::TParameterHandler iAlpha(this->getInputParameter(OVP_Algorithm_ClassifierMLP_InputParameterId_Alpha)); + iAlpha = 0.01; + Kernel::TParameterHandler iEpsilon(this->getInputParameter(OVP_Algorithm_ClassifierMLP_InputParameterId_Epsilon)); + iEpsilon = 0.000001; + return true; +} + +bool CAlgorithmClassifierMLP::uninitialize() { return true; } + +bool CAlgorithmClassifierMLP::train(const Toolkit::IFeatureVectorSet& dataset) +{ + m_labels.clear(); + + this->initializeExtraParameterMechanism(); + size_t hiddenNeuronCount = size_t(this->getInt64Parameter(OVP_Algorithm_ClassifierMLP_InputParameterId_HiddenNeuronCount)); + double alpha = this->getDoubleParameter(OVP_Algorithm_ClassifierMLP_InputParameterId_Alpha); + double epsilon = this->getDoubleParameter(OVP_Algorithm_ClassifierMLP_InputParameterId_Epsilon); + this->uninitializeExtraParameterMechanism(); + + if (hiddenNeuronCount < 1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Invalid amount of neuron in the hidden layer. Fallback to default value (3)\n"; + hiddenNeuronCount = 3; + } + if (alpha <= 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Invalid value for learning coefficient (" << alpha << "). Fallback to default value (0.01)\n"; + alpha = 0.01; + } + if (epsilon <= 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Invalid value for stop learning condition (" << epsilon << "). Fallback to default value (0.000001)\n"; + epsilon = 0.000001; + } + + std::map classCount; + std::map targetList; + //We need to compute the min and the max of data in order to normalize and center them + for (size_t i = 0; i < dataset.getFeatureVectorCount(); ++i) { classCount[dataset[i].getLabel()]++; } + size_t validationElementCount = 0; + + //We generate the list of class + for (auto iter = classCount.begin(); iter != classCount.end(); ++iter) + { + //We keep 20% percent of the training set for the validation for each class + validationElementCount += size_t(iter->second * 0.2); + m_labels.push_back(iter->first); + iter->second = size_t(iter->second * 0.2); + } + + const size_t nbClass = m_labels.size(); + const size_t nFeature = dataset.getFeatureVector(0).getSize(); + + //Generate the target vector for each class. To save time and memory, we compute only one vector per class + //Vector tagret looks like following [0 0 1 0] for class 3 (if 4 classes) + for (size_t i = 0; i < nbClass; ++i) + { + Eigen::VectorXd oTarget = Eigen::VectorXd::Zero(nbClass); + //class 1 is at index 0 + oTarget[size_t(m_labels[i])] = 1.; + targetList[m_labels[i]] = oTarget; + } + + //We store each normalize vector we get for training. This not optimal in memory but avoid a lot of computation later + //List of the class of the feature vectors store in the same order are they are in validation/training set(to be able to get the target) + std::vector oTrainingSet; + std::vector oValidationSet; + Eigen::MatrixXd oTrainingDataMatrix(nFeature, dataset.getFeatureVectorCount() - validationElementCount); + Eigen::MatrixXd oValidationDataMatrix(nFeature, validationElementCount); + + //We don't need to make a shuffle it has already be made by the trainer box + //We store 20% of the feature vectors for validation + int validationIndex = 0, trainingIndex = 0; + for (size_t i = 0; i < dataset.getFeatureVectorCount(); ++i) + { + const Eigen::Map oFeatureVec(const_cast(dataset.getFeatureVector(i).getBuffer()), nFeature); + Eigen::VectorXd oData = oFeatureVec; + if (classCount[dataset.getFeatureVector(i).getLabel()] > 0) + { + oValidationDataMatrix.col(validationIndex++) = oData; + oValidationSet.push_back(dataset.getFeatureVector(i).getLabel()); + --classCount[dataset.getFeatureVector(i).getLabel()]; + } + else + { + oTrainingDataMatrix.col(trainingIndex++) = oData; + oTrainingSet.push_back(dataset.getFeatureVector(i).getLabel()); + } + } + + //We now get the min and the max of the training set for normalization + m_max = oTrainingDataMatrix.maxCoeff(); + m_min = oTrainingDataMatrix.minCoeff(); + //Normalization of the data. We need to do it to avoid saturation of tanh. + for (size_t i = 0; i < size_t(oTrainingDataMatrix.cols()); ++i) + { + for (size_t j = 0; j < size_t(oTrainingDataMatrix.rows()); ++j) + { + oTrainingDataMatrix(j, i) = 2 * (oTrainingDataMatrix(j, i) - m_min) / (m_max - m_min) - 1; + } + } + for (size_t i = 0; i < size_t(oValidationDataMatrix.cols()); ++i) + { + for (size_t j = 0; j < size_t(oValidationDataMatrix.rows()); ++j) + { + oValidationDataMatrix(j, i) = 2 * (oValidationDataMatrix(j, i) - m_min) / (m_max - m_min) - 1; + } + } + + const double featureCount = double(oTrainingSet.size()); + const double boundValue = 1. / (nFeature + 1); + double previousError = std::numeric_limits::max(); + double cumulativeError = 0; + + //Let's generate randomly weights and biases + //We restrain the weight between -1/(fan-in) and 1/(fan-in) to avoid saturation in the worst case + m_inputWeight = Eigen::MatrixXd::Random(hiddenNeuronCount, nFeature) * boundValue; + m_inputBias = Eigen::VectorXd::Random(hiddenNeuronCount) * boundValue; + + m_hiddenWeight = Eigen::MatrixXd::Random(nbClass, hiddenNeuronCount) * boundValue; + m_hiddenBias = Eigen::VectorXd::Random(nbClass) * boundValue; + + Eigen::MatrixXd oDeltaInputWeight = Eigen::MatrixXd::Zero(hiddenNeuronCount, nFeature); + Eigen::VectorXd oDeltaInputBias = Eigen::VectorXd::Zero(hiddenNeuronCount); + Eigen::MatrixXd oDeltaHiddenWeight = Eigen::MatrixXd::Zero(nbClass, hiddenNeuronCount); + Eigen::VectorXd oDeltaHiddenBias = Eigen::VectorXd::Zero(nbClass); + + Eigen::MatrixXd oY1, oA2; + //A1 is the value compute in hidden neuron before applying tanh + //Y1 is the output vector of hidden layer + //A2 is the value compute by output neuron before applying transfer function + //Y2 is the value of output after the transfer function (softmax) + while (true) + { + oDeltaInputWeight.setZero(); + oDeltaInputBias.setZero(); + oDeltaHiddenWeight.setZero(); + oDeltaHiddenBias.setZero(); + //The first cast of tanh has to been explicit for windows compilation + oY1.noalias() = ((m_inputWeight * oTrainingDataMatrix).colwise() + m_inputBias).unaryExpr( + std::ptr_fun(static_cast(tanh))); + oA2.noalias() = (m_hiddenWeight * oY1).colwise() + m_hiddenBias; + for (size_t i = 0; i < featureCount; ++i) + { + const Eigen::VectorXd& oTarget = targetList[oTrainingSet[i]]; + const Eigen::VectorXd& oData = oTrainingDataMatrix.col(i); + + //Now we compute all deltas of output layer + Eigen::VectorXd oOutputDelta = oA2.col(i) - oTarget; + for (size_t j = 0; j < nbClass; ++j) + { + for (size_t k = 0; k < hiddenNeuronCount; ++k) { oDeltaHiddenWeight(j, k) -= oOutputDelta[j] * oY1.col(i)[k]; } + } + oDeltaHiddenBias.noalias() -= oOutputDelta; + + //Now we take care of the hidden layer + Eigen::VectorXd oHiddenDelta = Eigen::VectorXd::Zero(hiddenNeuronCount); + for (size_t j = 0; j < hiddenNeuronCount; ++j) + { + for (size_t k = 0; k < nbClass; ++k) { oHiddenDelta[j] += oOutputDelta[k] * m_hiddenWeight(k, j); } + oHiddenDelta[j] *= (1 - pow(oY1.col(i)[j], 2)); + } + + for (size_t j = 0; j < hiddenNeuronCount; ++j) { for (size_t k = 0; k < nFeature; ++k) { oDeltaInputWeight(j, k) -= oHiddenDelta[j] * oData[k]; } } + oDeltaInputBias.noalias() -= oHiddenDelta; + } + //We finish the loop, let's apply deltas + m_hiddenWeight.noalias() += oDeltaHiddenWeight / featureCount * alpha; + m_hiddenBias.noalias() += oDeltaHiddenBias / featureCount * alpha; + m_inputWeight.noalias() += oDeltaInputWeight / featureCount * alpha; + m_inputBias.noalias() += oDeltaInputBias / featureCount * alpha; + + dumpMatrix(this->getLogManager(), m_hiddenWeight, "m_hiddenWeight"); + dumpMatrix(this->getLogManager(), m_hiddenBias, "m_hiddenBias"); + dumpMatrix(this->getLogManager(), m_inputWeight, "m_inputWeight"); + dumpMatrix(this->getLogManager(), m_inputBias, "m_inputBias"); + + //Now we compute the cumulative error in the validation set + cumulativeError = 0; + //We don't compute Y2 because we train on the identity + oA2.noalias() = (m_hiddenWeight * ((m_inputWeight * oValidationDataMatrix).colwise() + m_inputBias).unaryExpr(std::ptr_fun(tanh))). + colwise() + m_hiddenBias; + for (size_t i = 0; i < oValidationSet.size(); ++i) + { + const Eigen::VectorXd& oTarget = targetList[oValidationSet[i]]; + const Eigen::VectorXd& oIdentityResult = oA2.col(i); + + //Now we need to compute the error + for (size_t j = 0; j < nbClass; ++j) { cumulativeError += 0.5 * pow(oIdentityResult[j] - oTarget[j], 2); } + } + cumulativeError /= oValidationSet.size(); + //If the delta of error is under Epsilon we consider that the training is over + if (previousError - cumulativeError < epsilon) { break; } + previousError = cumulativeError; + } + dumpMatrix(this->getLogManager(), m_hiddenWeight, "oHiddenWeight"); + dumpMatrix(this->getLogManager(), m_hiddenBias, "oHiddenBias"); + dumpMatrix(this->getLogManager(), m_inputWeight, "oInputWeight"); + dumpMatrix(this->getLogManager(), m_inputBias, "oInputBias"); + return true; +} + +bool CAlgorithmClassifierMLP::classify(const Toolkit::IFeatureVector& sample, double& classLabel, Toolkit::IVector& distance, Toolkit::IVector& probability) +{ + if (sample.getSize() != size_t(m_inputWeight.cols())) + { + this->getLogManager() << Kernel::LogLevel_Error << "Classifier expected " << size_t(m_inputWeight.cols()) << " features, got " << sample.getSize() << "\n"; + return false; + } + + const Eigen::Map oFeatureVec(const_cast(sample.getBuffer()), sample.getSize()); + Eigen::VectorXd oData = oFeatureVec; + //we normalize and center data on 0 to avoid saturation + for (size_t j = 0; j < sample.getSize(); ++j) { oData[j] = 2 * (oData[j] - m_min) / (m_max - m_min) - 1; } + + const size_t classCount = m_labels.size(); + + Eigen::VectorXd oA2 = m_hiddenBias + (m_hiddenWeight * (m_inputBias + (m_inputWeight * oData)).unaryExpr(std::ptr_fun(tanh))); + + //The final transfer function is the softmax + Eigen::VectorXd oY2 = oA2.unaryExpr(std::ptr_fun(exp)); + oY2 /= oY2.sum(); + + distance.setSize(classCount); + probability.setSize(classCount); + + //We use A2 as the classification values output, and the Y2 as the probability + double max = oY2[0]; + size_t classFound = 0; + distance[0] = oA2[0]; + probability[0] = oY2[0]; + for (size_t i = 1; i < classCount; ++i) + { + if (oY2[i] > max) + { + max = oY2[i]; + classFound = i; + } + distance[i] = oA2[i]; + probability[i] = oY2[i]; + } + + classLabel = m_labels[classFound]; + + return true; +} + +XML::IXMLNode* CAlgorithmClassifierMLP::saveConfig() +{ + XML::IXMLNode* rootNode = XML::createNode(MLP_TYPE_NODE_NAME); + + std::stringstream classes; + for (int i = 0; i < m_hiddenBias.size(); ++i) { classes << m_labels[i] << " "; } + XML::IXMLNode* classLabelNode = XML::createNode(MLP_CLASS_LABEL_NODE_NAME); + classLabelNode->setPCData(classes.str().c_str()); + rootNode->addChild(classLabelNode); + + XML::IXMLNode* configuration = XML::createNode(MLP_NEURON_CONFIG_NODE_NAME); + + //The input and output neuron count are not mandatory but they facilitate a lot the loading process + XML::IXMLNode* tempNode = XML::createNode(MLP_INPUT_NEURON_COUNT_NODE_NAME); + dumpData(tempNode, int64_t(m_inputWeight.cols())); + configuration->addChild(tempNode); + + tempNode = XML::createNode(MLP_HIDDEN_NEURON_COUNT_NODE_NAME); + dumpData(tempNode, int64_t(m_inputWeight.rows())); + configuration->addChild(tempNode); + rootNode->addChild(configuration); + + tempNode = XML::createNode(MLP_MIN_NODE_NAME); + dumpData(tempNode, m_min); + rootNode->addChild(tempNode); + + tempNode = XML::createNode(MLP_MAX_NODE_NAME); + dumpData(tempNode, m_max); + rootNode->addChild(tempNode); + + tempNode = XML::createNode(MLP_INPUT_WEIGHT_NODE_NAME); + dumpData(tempNode, m_inputWeight); + rootNode->addChild(tempNode); + + tempNode = XML::createNode(MLP_INPUT_BIAS_NODE_NAME); + dumpData(tempNode, m_inputBias); + rootNode->addChild(tempNode); + + tempNode = XML::createNode(MLP_HIDDEN_BIAS_NODE_NAME); + dumpData(tempNode, m_hiddenBias); + rootNode->addChild(tempNode); + + tempNode = XML::createNode(MLP_HIDDEN_WEIGHT_NODE_NAME); + dumpData(tempNode, m_hiddenWeight); + rootNode->addChild(tempNode); + + return rootNode; +} + +bool CAlgorithmClassifierMLP::loadConfig(XML::IXMLNode* configNode) +{ + m_labels.clear(); + std::stringstream data(configNode->getChildByName(MLP_CLASS_LABEL_NODE_NAME)->getPCData()); + double temp; + while (data >> temp) { m_labels.push_back(temp); } + + int64_t featureSize, hiddenNeuronCount; + XML::IXMLNode* neuronConfigNode = configNode->getChildByName(MLP_NEURON_CONFIG_NODE_NAME); + + loadData(neuronConfigNode->getChildByName(MLP_HIDDEN_NEURON_COUNT_NODE_NAME), hiddenNeuronCount); + loadData(neuronConfigNode->getChildByName(MLP_INPUT_NEURON_COUNT_NODE_NAME), featureSize); + + loadData(configNode->getChildByName(MLP_MAX_NODE_NAME), m_max); + loadData(configNode->getChildByName(MLP_MIN_NODE_NAME), m_min); + + loadData(configNode->getChildByName(MLP_INPUT_WEIGHT_NODE_NAME), m_inputWeight, hiddenNeuronCount, featureSize); + loadData(configNode->getChildByName(MLP_INPUT_BIAS_NODE_NAME), m_inputBias); + loadData(configNode->getChildByName(MLP_HIDDEN_WEIGHT_NODE_NAME), m_hiddenWeight, m_labels.size(), hiddenNeuronCount); + loadData(configNode->getChildByName(MLP_HIDDEN_BIAS_NODE_NAME), m_hiddenBias); + + return true; +} + +void CAlgorithmClassifierMLP::dumpData(XML::IXMLNode* node, Eigen::MatrixXd& matrix) +{ + std::stringstream data; + + data << std::scientific; + for (size_t i = 0; i < size_t(matrix.rows()); ++i) { for (size_t j = 0; j < size_t(matrix.cols()); ++j) { data << " " << matrix(i, j); } } + + node->setPCData(data.str().c_str()); +} + +void CAlgorithmClassifierMLP::dumpData(XML::IXMLNode* node, Eigen::VectorXd& vector) +{ + std::stringstream data; + + data << std::scientific; + for (size_t i = 0; i < size_t(vector.size()); ++i) { data << " " << vector[i]; } + + node->setPCData(data.str().c_str()); +} + +void CAlgorithmClassifierMLP::dumpData(XML::IXMLNode* node, const int64_t value) +{ + std::stringstream data; + data << value; + node->setPCData(data.str().c_str()); +} + +void CAlgorithmClassifierMLP::dumpData(XML::IXMLNode* node, const double value) +{ + std::stringstream data; + data << std::scientific; + data << value; + node->setPCData(data.str().c_str()); +} + +void CAlgorithmClassifierMLP::loadData(XML::IXMLNode* node, Eigen::MatrixXd& matrix, const size_t nRow, const size_t nCol) +{ + matrix = Eigen::MatrixXd(nRow, nCol); + std::stringstream data(node->getPCData()); + + std::vector coefs; + double value; + while (data >> value) { coefs.push_back(value); } + + size_t index = 0; + for (size_t i = 0; i < nRow; ++i) + { + for (size_t j = 0; j < nCol; ++j) + { + matrix(int(i), int(j)) = coefs[index]; + ++index; + } + } +} + +void CAlgorithmClassifierMLP::loadData(XML::IXMLNode* node, Eigen::VectorXd& vector) +{ + std::stringstream data(node->getPCData()); + std::vector coefs; + double value; + while (data >> value) { coefs.push_back(value); } + vector = Eigen::VectorXd(coefs.size()); + + for (size_t i = 0; i < coefs.size(); ++i) { vector[i] = coefs[i]; } +} + +void CAlgorithmClassifierMLP::loadData(XML::IXMLNode* node, int64_t& value) +{ + std::stringstream data(node->getPCData()); + data >> value; +} + +void CAlgorithmClassifierMLP::loadData(XML::IXMLNode* node, double& value) +{ + std::stringstream data(node->getPCData()); + data >> value; +} + +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyEIGEN diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierMLP.h b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierMLP.h new file mode 100644 index 0000000..0265b16 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierMLP.h @@ -0,0 +1,102 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyEIGEN + +#include +#include + +#define OVP_ClassId_Algorithm_ClassifierMLP CIdentifier(0xF3FAB4BE, 0xDC401260) +#define OVP_ClassId_Algorithm_ClassifierMLP_DecisionAvailable CIdentifier(0xF3FAB4BE, 0xDC401261) +#define OVP_ClassId_Algorithm_ClassifierMLPDesc CIdentifier(0xF3FAB4BE, 0xDC401262) + +#define OVP_Algorithm_ClassifierMLP_InputParameterId_HiddenNeuronCount CIdentifier(0xF3FAB4BE, 0xDC401263) +#define OVP_Algorithm_ClassifierMLP_InputParameterId_Epsilon CIdentifier(0xF3FAB4BE, 0xDC401264) +#define OVP_Algorithm_ClassifierMLP_InputParameterId_Alpha CIdentifier(0xF3FAB4BE, 0xDC401265) + +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { +int MLPClassificationCompare(CMatrix& first, CMatrix& second); + +class CAlgorithmClassifierMLP final : public Toolkit::CAlgorithmClassifier +{ +public: + + bool initialize() override; + bool uninitialize() override; + + bool train(const Toolkit::IFeatureVectorSet& dataset) override; + bool classify(const Toolkit::IFeatureVector& sample, double& classLabel, + Toolkit::IVector& distance, Toolkit::IVector& probability) override; + + XML::IXMLNode* saveConfig() override; + bool loadConfig(XML::IXMLNode* configNode) override; + + size_t getNProbabilities() override { return m_labels.size(); } + size_t getNDistances() override { return m_labels.size(); } + + _IsDerivedFromClass_Final_(CAlgorithmClassifier, OVP_ClassId_Algorithm_ClassifierMLP) + +private: + //Helpers for load or sotre data in XMLNode + static void dumpData(XML::IXMLNode* node, Eigen::MatrixXd& matrix); + static void dumpData(XML::IXMLNode* node, Eigen::VectorXd& vector); + static void dumpData(XML::IXMLNode* node, int64_t value); + static void dumpData(XML::IXMLNode* node, double value); + + static void loadData(XML::IXMLNode* node, Eigen::MatrixXd& matrix, size_t nRow, size_t nCol); + static void loadData(XML::IXMLNode* node, Eigen::VectorXd& vector); + static void loadData(XML::IXMLNode* node, int64_t& value); + static void loadData(XML::IXMLNode* node, double& value); + + std::vector m_labels; + + Eigen::MatrixXd m_inputWeight; + Eigen::VectorXd m_inputBias; + + Eigen::MatrixXd m_hiddenWeight; + Eigen::VectorXd m_hiddenBias; + + double m_min = 0; + double m_max = 0; +}; + +class CAlgorithmClassifierMLPDesc final : public Toolkit::CAlgorithmClassifierDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("MLP Classifier"); } + CString getAuthorName() const override { return CString("Guillaume Serrière"); } + CString getAuthorCompanyName() const override { return CString("Inria / Loria"); } + CString getShortDescription() const override { return CString("Multi-layer perceptron algorithm"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString(""); } + CString getVersion() const override { return CString("0.1"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_ClassifierMLP; } + IPluginObject* create() override { return new CAlgorithmClassifierMLP; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CAlgorithmClassifierDesc::getAlgorithmPrototype(prototype); + + prototype.addInputParameter(OVP_Algorithm_ClassifierMLP_InputParameterId_HiddenNeuronCount, "Number of neurons in hidden layer", + Kernel::ParameterType_Integer); + prototype.addInputParameter(OVP_Algorithm_ClassifierMLP_InputParameterId_Epsilon, "Learning stop condition", Kernel::ParameterType_Float); + prototype.addInputParameter(OVP_Algorithm_ClassifierMLP_InputParameterId_Alpha, "Learning coefficient", Kernel::ParameterType_Float); + return true; + } + + _IsDerivedFromClass_Final_(CAlgorithmClassifierDesc, OVP_ClassId_Algorithm_ClassifierMLPDesc) +}; +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyEIGEN diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierSVM.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierSVM.cpp new file mode 100644 index 0000000..7e6838b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierSVM.cpp @@ -0,0 +1,757 @@ +#include "../ovp_defines.h" + +#include "ovpCAlgorithmClassifierSVM.h" + +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + +static const char* const TYPE_NODE_NAME = "SVM"; +static const char* const PARAM_NODE_NAME = "Param"; +static const char* const SVM_TYPE_NODE_NAME = "svm_type"; +static const char* const KERNEL_TYPE_NODE_NAME = "kernel_type"; +static const char* const DEGREE_NODE_NAME = "degree"; +static const char* const GAMMA_NODE_NAME = "gamma"; +static const char* const COEF0_NODE_NAME = "coef0"; +static const char* const MODEL_NODE_NAME = "Model"; +static const char* const NR_CLASS_NODE_NAME = "nr_class"; +static const char* const TOTAL_SV_NODE_NAME = "total_sv"; +static const char* const RHO_NODE_NAME = "rho"; +static const char* const LABEL_NODE_NAME = "label"; +static const char* const PROB_A_NODE_NAME = "probA"; +static const char* const PROB_B_NODE_NAME = "probB"; +static const char* const NR_SV_NODE_NAME = "nr_sv"; +static const char* const SVS_NODE_NAME = "SVs"; +static const char* const SV_NODE_NAME = "SV"; +static const char* const COEF_NODE_NAME = "coef"; +static const char* const VALUE_NODE_NAME = "value"; + +int SVMClassificationCompare(CMatrix& first, CMatrix& second) +{ + if (OVFloatEqual(std::fabs(first[0]), std::fabs(second[0]))) { return 0; } + if (std::fabs(first[0]) > std::fabs(second[0])) { return -1; } + return 1; +} + +bool CAlgorithmClassifierSVM::initialize() +{ + Kernel::TParameterHandler iSVMType(this->getInputParameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMType)); + Kernel::TParameterHandler iSVMKernelType(this->getInputParameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMKernelType)); + Kernel::TParameterHandler iDegree(this->getInputParameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMDegree)); + Kernel::TParameterHandler iGamma(this->getInputParameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMGamma)); + Kernel::TParameterHandler iCoef0(this->getInputParameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMCoef0)); + Kernel::TParameterHandler iCost(this->getInputParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMCost)); + Kernel::TParameterHandler iNu(this->getInputParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMNu)); + Kernel::TParameterHandler iEpsilon(this->getInputParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMEpsilon)); + Kernel::TParameterHandler iCacheSize(this->getInputParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMCacheSize)); + Kernel::TParameterHandler iEpsilonTolerance(this->getInputParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMTolerance)); + Kernel::TParameterHandler iShrinking(this->getInputParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMShrinking)); + //TParameterHandler < bool > iProbabilityEstimate(this->getInputParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMProbabilityEstimate)); + Kernel::TParameterHandler ip_weight(this->getInputParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMweight)); + Kernel::TParameterHandler ip_weightLabel(this->getInputParameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMWeightLabel)); + + iSVMType = C_SVC; + iSVMKernelType = LINEAR; + iDegree = 3; + iGamma = 0; + iCoef0 = 0; + iCost = 1; + iNu = 0.5; + iEpsilon = 0.1; + iCacheSize = 100; + iEpsilonTolerance = 0.001; + iShrinking = true; + //iProbabilityEstimate=true; + *ip_weight = ""; + *ip_weightLabel = ""; + + Kernel::TParameterHandler config(this->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Config)); + config = nullptr; + m_prob.y = nullptr; + m_prob.x = nullptr; + + m_param.weight = nullptr; + m_param.weight_label = nullptr; + + m_model = nullptr; + m_modelWasTrained = false; + + return CAlgorithmClassifier::initialize(); +} + +bool CAlgorithmClassifierSVM::uninitialize() +{ + if (m_prob.x != nullptr && m_prob.y != nullptr) + { + for (size_t i = 0; i < size_t(m_prob.l); ++i) { delete[] m_prob.x[i]; } + delete[] m_prob.y; + delete[] m_prob.x; + m_prob.y = nullptr; + m_prob.x = nullptr; + } + + if (m_param.weight != nullptr) + { + delete[] m_param.weight; + m_param.weight = nullptr; + } + + if (m_param.weight_label != nullptr) + { + delete[] m_param.weight_label; + m_param.weight_label = nullptr; + } + + deleteModel(m_model, !m_modelWasTrained); + m_model = nullptr; + m_modelWasTrained = false; + + return CAlgorithmClassifier::uninitialize(); +} + +void CAlgorithmClassifierSVM::deleteModel(svm_model* model, const bool freeSupportVectors) +{ + if (model != nullptr) + { + delete[] model->rho; + delete[] model->probA; + delete[] model->probB; + delete[] model->label; + delete[] model->nSV; + + for (size_t i = 0; i < size_t(model->nr_class - 1); ++i) { delete[] model->sv_coef[i]; } + delete[] model->sv_coef; + + // We need the following depending on how the model was allocated. If we got it from svm_train, + // the support vectors are pointers to the problem structure which is freed elsewhere. + // If we loaded the model from disk, we allocated the vectors separately. + if (freeSupportVectors) { for (size_t i = 0; i < size_t(model->l); ++i) { delete[] model->SV[i]; } } + delete[] model->SV; + + delete model; + model = nullptr; + } +} + +void CAlgorithmClassifierSVM::setParameter() +{ + this->initializeExtraParameterMechanism(); + + m_param.svm_type = int(this->getEnumerationParameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMType, OVP_TypeId_SVMType)); + m_param.kernel_type = int(this->getEnumerationParameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMKernelType, OVP_TypeId_SVMKernelType)); + m_param.degree = int(this->getInt64Parameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMDegree)); + m_param.gamma = this->getDoubleParameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMGamma); + m_param.coef0 = this->getDoubleParameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMCoef0); + m_param.C = this->getDoubleParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMCost); + m_param.nu = this->getDoubleParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMNu); + m_param.p = this->getDoubleParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMEpsilon); + m_param.cache_size = this->getDoubleParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMCacheSize); + m_param.eps = this->getDoubleParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMTolerance); + m_param.shrinking = int(this->getBooleanParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMShrinking)); + // m_param.probability = this->getBooleanParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMShrinking); + m_param.probability = 1; + const CString paramWeight = *this->getCStringParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMweight); + const CString paramWeightLabel = *this->getCStringParameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMWeightLabel); + + this->uninitializeExtraParameterMechanism(); + + std::vector weights; + std::stringstream ssWeight(paramWeight.toASCIIString()); + double value; + while (ssWeight >> value) { weights.push_back(value); } + + m_param.nr_weight = weights.size(); + double* weight = new double[weights.size()]; + for (uint32_t i = 0; i < weights.size(); ++i) { weight[i] = weights[i]; } + m_param.weight = weight;//nullptr; + + std::vector labels; + std::stringstream ssLabel(paramWeightLabel.toASCIIString()); + int64_t iValue; + while (ssLabel >> iValue) { labels.push_back(iValue); } + + //the number of weight label need to be equal to the number of weight + while (labels.size() < weights.size()) { labels.push_back(labels.size() + 1); } + + int* label = new int[weights.size()]; + for (size_t i = 0; i < weights.size(); ++i) { label[i] = int(labels[i]); } + m_param.weight_label = label;//nullptr; +} + +bool CAlgorithmClassifierSVM::train(const Toolkit::IFeatureVectorSet& dataset) +{ + if (m_prob.x != nullptr && m_prob.y != nullptr) + { + for (size_t i = 0; i < size_t(m_prob.l); ++i) { delete[] m_prob.x[i]; } + delete[] m_prob.y; + delete[] m_prob.x; + m_prob.y = nullptr; + m_prob.x = nullptr; + } + // default Param values + //std::cout<<"param config"<setParameter(); + this->getLogManager() << Kernel::LogLevel_Trace << paramToString(&m_param); + + //configure m_prob + //std::cout<<"prob config"< 0 ? m_nFeatures : 1.0); } + + if (m_param.kernel_type == PRECOMPUTED) + { + for (size_t i = 0; i < size_t(m_prob.l); ++i) + { + if (m_prob.x[i][0].index != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Wrong input format: first column must be 0:sample_serial_number\n"; + return false; + } + if (m_prob.x[i][0].value <= 0 || m_prob.x[i][0].value > m_nFeatures) + { + this->getLogManager() << Kernel::LogLevel_Error << "Wrong input format: sample_serial_number out of range\n"; + return false; + } + } + } + + this->getLogManager() << Kernel::LogLevel_Trace << problemToString(&m_prob); + + //make a model + //std::cout<<"svm_train"<getLogManager() << Kernel::LogLevel_Error << "the training with SVM had failed\n"; + return false; + } + + m_modelWasTrained = true; + + //std::cout<<"log model"<getLogManager() << Kernel::LogLevel_Trace << modelToString(); + + return true; +} + +bool CAlgorithmClassifierSVM::classify(const Toolkit::IFeatureVector& sample, double& classLabel, Toolkit::IVector& distance, Toolkit::IVector& probability) +{ + //std::cout<<"classify"<getLogManager() << Kernel::LogLevel_Error << "Classification is impossible with a model equalling nullptr\n"; + return false; + } + if (m_model->nr_class == 0 || m_model->rho == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "The model wasn't loaded correctly\n"; + return false; + } + if (m_nFeatures != sample.getSize()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Classifier expected " << m_nFeatures << " features, got " << sample.getSize() << "\n"; + return false; + } + if (m_model->param.gamma == 0 && + (m_model->param.kernel_type == POLY || m_model->param.kernel_type == RBF || m_model->param.kernel_type == SIGMOID)) + { + m_model->param.gamma = 1.0 / (m_nFeatures > 0 ? m_nFeatures : 1.0); + this->getLogManager() << Kernel::LogLevel_Warning << "The SVM model had gamma=0. Setting it to [" << m_model->param.gamma << "].\n"; + } + + //std::cout<<"create X"<nr_class]; + for (size_t i = 0; i < size_t(m_model->nr_class); ++i) { probEstimates[i] = 0; } + + classLabel = svm_predict_probability(m_model, x, probEstimates); + + //std::cout<param.svm_type == C_SVC || m_model->param.svm_type == NU_SVC) + { + probability.setSize(m_model->nr_class); + this->getLogManager() << Kernel::LogLevel_Trace << "Label predict: " << classLabel << "\n"; + + for (size_t i = 0; i < size_t(m_model->nr_class); ++i) + { + this->getLogManager() << Kernel::LogLevel_Trace << "index:" << i << " label:" << m_model->label[i] << " probability:" << probEstimates[i] << "\n"; + probability[(m_model->label[i])] = probEstimates[i]; + } + } + else { probability.setSize(0); } + + //The hyperplane distance is disabled for SVM + distance.setSize(0); + + //std::cout<<";"< coefs; + std::vector values; + + //std::cout<<"model save: rho"<rho[0]; + + for (size_t i = 1; i < size_t(m_model->nr_class * (m_model->nr_class - 1) / 2); ++i) { ssRho << " " << m_model->rho[i]; } + + //std::cout<<"model save: sv_coef and SV"<l); ++i) + { + std::stringstream ssCoef; + std::stringstream ssValue; + + ssCoef << m_model->sv_coef[0][i]; + for (int j = 1; j < m_model->nr_class - 1; ++j) { ssCoef << " " << m_model->sv_coef[j][i]; } + + const svm_node* p = m_model->SV[i]; + + if (m_model->param.kernel_type == PRECOMPUTED) { ssValue << "0:" << double(p->value); } + else + { + if (p->index != -1) + { + ssValue << p->index << ":" << p->value; + p++; + } + while (p->index != -1) + { + ssValue << " " << p->index << ":" << p->value; + p++; + } + } + coefs.emplace_back(ssCoef.str().c_str()); + values.emplace_back(ssValue.str().c_str()); + } + + XML::IXMLNode* svmNode = XML::createNode(TYPE_NODE_NAME); + + //Param node + XML::IXMLNode* paramNode = XML::createNode(PARAM_NODE_NAME); + XML::IXMLNode* tempNode = XML::createNode(SVM_TYPE_NODE_NAME); + tempNode->setPCData(get_svm_type(m_model->param.svm_type)); + paramNode->addChild(tempNode); + + tempNode = XML::createNode(KERNEL_TYPE_NODE_NAME); + tempNode->setPCData(get_kernel_type(m_model->param.kernel_type)); + paramNode->addChild(tempNode); + + if (m_model->param.kernel_type == POLY) + { + std::stringstream ss; + ss << m_model->param.degree; + + tempNode = XML::createNode(DEGREE_NODE_NAME); + tempNode->setPCData(ss.str().c_str()); + paramNode->addChild(tempNode); + } + if (m_model->param.kernel_type == POLY || m_model->param.kernel_type == RBF || m_model->param.kernel_type == SIGMOID) + { + std::stringstream ss; + ss << m_model->param.gamma; + + tempNode = XML::createNode(GAMMA_NODE_NAME); + tempNode->setPCData(ss.str().c_str()); + paramNode->addChild(tempNode); + } + if (m_model->param.kernel_type == POLY || m_model->param.kernel_type == SIGMOID) + { + std::stringstream ss; + ss << m_model->param.coef0; + + tempNode = XML::createNode(COEF0_NODE_NAME); + tempNode->setPCData(ss.str().c_str()); + paramNode->addChild(tempNode); + } + svmNode->addChild(paramNode); + //End param node + + //Model Node + XML::IXMLNode* modelNode = XML::createNode(MODEL_NODE_NAME); + { + tempNode = XML::createNode(NR_CLASS_NODE_NAME); + std::stringstream ssNrClass; + ssNrClass << m_model->nr_class; + tempNode->setPCData(ssNrClass.str().c_str()); + modelNode->addChild(tempNode); + + tempNode = XML::createNode(TOTAL_SV_NODE_NAME); + std::stringstream ssTotalSv; + ssTotalSv << m_model->l; + tempNode->setPCData(ssTotalSv.str().c_str()); + modelNode->addChild(tempNode); + + tempNode = XML::createNode(RHO_NODE_NAME); + tempNode->setPCData(ssRho.str().c_str()); + modelNode->addChild(tempNode); + + if (m_model->label != nullptr) + { + std::stringstream ss; + ss << m_model->label[0]; + for (size_t i = 1; i < size_t(m_model->nr_class); ++i) { ss << " " << m_model->label[i]; } + + tempNode = XML::createNode(LABEL_NODE_NAME); + tempNode->setPCData(ss.str().c_str()); + modelNode->addChild(tempNode); + } + if (m_model->probA != nullptr) + { + std::stringstream ss; + ss << std::scientific << m_model->probA[0]; + for (size_t i = 1; i < size_t(m_model->nr_class * (m_model->nr_class - 1) / 2); ++i) { ss << " " << m_model->probA[i]; } + + tempNode = XML::createNode(PROB_A_NODE_NAME); + tempNode->setPCData(ss.str().c_str()); + modelNode->addChild(tempNode); + } + if (m_model->probB != nullptr) + { + std::stringstream ss; + ss << std::scientific << m_model->probB[0]; + for (size_t i = 1; i < size_t(m_model->nr_class * (m_model->nr_class - 1) / 2); ++i) { ss << " " << m_model->probB[i]; } + + tempNode = XML::createNode(PROB_B_NODE_NAME); + tempNode->setPCData(ss.str().c_str()); + modelNode->addChild(tempNode); + } + if (m_model->nSV != nullptr) + { + std::stringstream ss; + ss << m_model->nSV[0]; + for (size_t i = 1; i < size_t(m_model->nr_class); ++i) { ss << " " << m_model->nSV[i]; } + + tempNode = XML::createNode(NR_SV_NODE_NAME); + tempNode->setPCData(ss.str().c_str()); + modelNode->addChild(tempNode); + } + + XML::IXMLNode* svsNode = XML::createNode(SVS_NODE_NAME); + { + for (size_t i = 0; i < size_t(m_model->l); ++i) + { + XML::IXMLNode* svNode = XML::createNode(SV_NODE_NAME); + { + tempNode = XML::createNode(COEF_NODE_NAME); + tempNode->setPCData(coefs[i]); + svNode->addChild(tempNode); + + tempNode = XML::createNode(VALUE_NODE_NAME); + tempNode->setPCData(values[i]); + svNode->addChild(tempNode); + } + svsNode->addChild(svNode); + } + } + modelNode->addChild(svsNode); + } + svmNode->addChild(modelNode); + return svmNode; +} + +bool CAlgorithmClassifierSVM::loadConfig(XML::IXMLNode* configNode) +{ + if (m_model != nullptr) + { + //std::cout<<"delete m_model load config"<rho = nullptr; + m_model->probA = nullptr; + m_model->probB = nullptr; + m_model->label = nullptr; + m_model->nSV = nullptr; + m_indexSV = -1; + + loadParamNodeConfiguration(configNode->getChildByName(PARAM_NODE_NAME)); + loadModelNodeConfiguration(configNode->getChildByName(MODEL_NODE_NAME)); + + this->getLogManager() << Kernel::LogLevel_Trace << modelToString(); + return true; +} + +void CAlgorithmClassifierSVM::loadParamNodeConfiguration(XML::IXMLNode* paramNode) +{ + //svm_type + XML::IXMLNode* tempNode = paramNode->getChildByName(SVM_TYPE_NODE_NAME); + for (size_t i = 0; get_svm_type(i) != nullptr; ++i) { if (strcmp(get_svm_type(i), tempNode->getPCData()) == 0) { m_model->param.svm_type = i; } } + if (get_svm_type(m_model->param.svm_type) == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "load configuration error: bad value for the parameter svm_type\n"; + } + + //kernel_type + tempNode = paramNode->getChildByName(KERNEL_TYPE_NODE_NAME); + for (size_t i = 0; get_kernel_type(i) != nullptr; ++i) { if (strcmp(get_kernel_type(i), tempNode->getPCData()) == 0) { m_model->param.kernel_type = i; } } + if (get_kernel_type(m_model->param.kernel_type) == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "load configuration error: bad value for the parameter kernel_type\n"; + } + + //Following parameters aren't required + + //degree + tempNode = paramNode->getChildByName(DEGREE_NODE_NAME); + if (tempNode != nullptr) + { + std::stringstream ss(tempNode->getPCData()); + ss >> m_model->param.degree; + } + + //gamma + tempNode = paramNode->getChildByName(GAMMA_NODE_NAME); + if (tempNode != nullptr) + { + std::stringstream ss(tempNode->getPCData()); + ss >> m_model->param.gamma; + } + + //coef0 + tempNode = paramNode->getChildByName(COEF0_NODE_NAME); + if (tempNode != nullptr) + { + std::stringstream ss(tempNode->getPCData()); + ss >> m_model->param.coef0; + } +} + +void CAlgorithmClassifierSVM::loadModelNodeConfiguration(XML::IXMLNode* modelNode) +{ + //nr_class + XML::IXMLNode* tempNode = modelNode->getChildByName(NR_CLASS_NODE_NAME); + std::stringstream ssNrClass(tempNode->getPCData()); + ssNrClass >> m_model->nr_class; + //total_sv + tempNode = modelNode->getChildByName(TOTAL_SV_NODE_NAME); + std::stringstream ssTotalSv(tempNode->getPCData()); + ssTotalSv >> m_model->l; + //rho + tempNode = modelNode->getChildByName(RHO_NODE_NAME); + std::stringstream ssRho(tempNode->getPCData()); + m_model->rho = new double[m_model->nr_class * (m_model->nr_class - 1) / 2]; + for (size_t i = 0; i < size_t(m_model->nr_class * (m_model->nr_class - 1) / 2); ++i) { ssRho >> m_model->rho[i]; } + + //label + tempNode = modelNode->getChildByName(LABEL_NODE_NAME); + if (tempNode != nullptr) + { + std::stringstream ss(tempNode->getPCData()); + m_model->label = new int[m_model->nr_class]; + for (size_t i = 0; i < size_t(m_model->nr_class); ++i) { ss >> m_model->label[i]; } + } + //probA + tempNode = modelNode->getChildByName(PROB_A_NODE_NAME); + if (tempNode != nullptr) + { + std::stringstream ss(tempNode->getPCData()); + m_model->probA = new double[m_model->nr_class * (m_model->nr_class - 1) / 2]; + for (size_t i = 0; i < size_t(m_model->nr_class * (m_model->nr_class - 1) / 2); ++i) { ss >> m_model->probA[i]; } + } + //probB + tempNode = modelNode->getChildByName(PROB_B_NODE_NAME); + if (tempNode != nullptr) + { + std::stringstream ss(tempNode->getPCData()); + m_model->probB = new double[m_model->nr_class * (m_model->nr_class - 1) / 2]; + for (size_t i = 0; i < size_t(m_model->nr_class * (m_model->nr_class - 1) / 2); ++i) { ss >> m_model->probB[i]; } + } + //nr_sv + tempNode = modelNode->getChildByName(NR_SV_NODE_NAME); + if (tempNode != nullptr) + { + std::stringstream ss(tempNode->getPCData()); + m_model->nSV = new int[m_model->nr_class]; + for (size_t i = 0; i < size_t(m_model->nr_class); ++i) { ss >> m_model->nSV[i]; } + } + + loadModelSVsNodeConfiguration(modelNode->getChildByName(SVS_NODE_NAME)); +} + +void CAlgorithmClassifierSVM::loadModelSVsNodeConfiguration(XML::IXMLNode* svsNodeParam) +{ + //Reserve all memory space required + m_model->sv_coef = new double*[m_model->nr_class - 1]; + for (size_t i = 0; i < size_t(m_model->nr_class - 1); ++i) { m_model->sv_coef[i] = new double[m_model->l]; } + m_model->SV = new svm_node*[m_model->l]; + + //Now fill SV + for (size_t i = 0; i < svsNodeParam->getChildCount(); ++i) + { + XML::IXMLNode* tempNode = svsNodeParam->getChild(i); + std::stringstream coefData(tempNode->getChildByName(COEF_NODE_NAME)->getPCData()); + for (int j = 0; j < m_model->nr_class - 1; ++j) { coefData >> m_model->sv_coef[j][i]; } + + std::stringstream ss(tempNode->getChildByName(VALUE_NODE_NAME)->getPCData()); + std::vector svmIdx; + std::vector svmValue; + char separateChar; + while (!ss.eof()) + { + int index; + double value; + ss >> index; + ss >> separateChar; + ss >> value; + svmIdx.push_back(index); + svmValue.push_back(value); + } + + m_nFeatures = svmIdx.size(); + m_model->SV[i] = new svm_node[svmIdx.size() + 1]; + for (size_t j = 0; j < svmIdx.size(); ++j) + { + m_model->SV[i][j].index = svmIdx[j]; + m_model->SV[i][j].value = svmValue[j]; + } + m_model->SV[i][svmIdx.size()].index = -1; + } +} + +CString CAlgorithmClassifierSVM::paramToString(svm_parameter* param) +{ + if (param == nullptr) { return std::string("Param: nullptr\n").c_str(); } + + std::stringstream ss; + ss << "Param:\n"; + ss << "\tsvm_type: " << get_svm_type(param->svm_type) << "\n"; + ss << "\tkernel_type: " << get_kernel_type(param->kernel_type) << "\n"; + ss << "\tdegree: " << param->degree << "\n"; + ss << "\tgamma: " << param->gamma << "\n"; + ss << "\tcoef0: " << param->coef0 << "\n"; + ss << "\tnu: " << param->nu << "\n"; + ss << "\tcache_size: " << param->cache_size << "\n"; + ss << "\tC: " << param->C << "\n"; + ss << "\teps: " << param->eps << "\n"; + ss << "\tp: " << param->p << "\n"; + ss << "\tshrinking: " << param->shrinking << "\n"; + ss << "\tprobability: " << param->probability << "\n"; + ss << "\tnr weight: " << param->nr_weight << "\n"; + std::stringstream label; + for (size_t i = 0; i < size_t(param->nr_weight); ++i) { label << param->weight_label[i] << ";"; } + ss << "\tweight label: " << label.str() << "\n"; + std::stringstream weight; + for (size_t i = 0; i < size_t(param->nr_weight); ++i) { weight << param->weight[i] << ";"; } + ss << "\tweight: " << weight.str() << "\n"; + return ss.str().c_str(); +} + + +CString CAlgorithmClassifierSVM::modelToString() const +{ + if (m_model == nullptr) { return std::string("Model: nullptr\n").c_str(); } + + std::stringstream ss; + ss << paramToString(&m_model->param); + ss << "Model:" << "\n"; + ss << "\tnr_class: " << m_model->nr_class << "\n"; + ss << "\ttotal_sv: " << m_model->l << "\n"; + ss << "\trho: "; + if (m_model->rho != nullptr) + { + ss << m_model->rho[0]; + for (size_t i = 1; i < size_t(m_model->nr_class * (m_model->nr_class - 1) / 2); ++i) { ss << " " << m_model->rho[i]; } + } + ss << "\n"; + ss << "\tlabel: "; + if (m_model->label != nullptr) + { + ss << m_model->label[0]; + for (size_t i = 1; i < size_t(m_model->nr_class); ++i) { ss << " " << m_model->label[i]; } + } + ss << "\n"; + ss << "\tprobA: "; + if (m_model->probA != nullptr) + { + ss << m_model->probA[0]; + for (size_t i = 1; i < size_t(m_model->nr_class * (m_model->nr_class - 1) / 2); ++i) { ss << " " << m_model->probA[i]; } + } + ss << "\n"; + ss << "\tprobB: "; + if (m_model->probB != nullptr) + { + ss << m_model->probB[0]; + for (size_t i = 1; i < size_t(m_model->nr_class * (m_model->nr_class - 1) / 2); ++i) { ss << " " << m_model->probB[i]; } + } + ss << "\n"; + ss << "\tnr_sv: "; + if (m_model->nSV != nullptr) + { + ss << m_model->nSV[0]; + for (size_t i = 1; i < size_t(m_model->nr_class); ++i) { ss << " " << m_model->nSV[i]; } + } + ss << "\n"; + + return ss.str().c_str(); +} + +CString CAlgorithmClassifierSVM::problemToString(svm_problem* prob) const +{ + if (prob == nullptr) { return std::string("Problem: nullptr\n").c_str(); } + std::stringstream ss; + ss << "Problem\ttotal sv: " << prob->l << "\n\tnb features: " << m_nFeatures << "\n"; + return ss.str().c_str(); +} +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierSVM.h b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierSVM.h new file mode 100644 index 0000000..9690f8e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierSVM.h @@ -0,0 +1,131 @@ +#pragma once + +#include +#include + +#include + +#include +#include "../../../../../contrib/packages/libSVM/svm.h" + +#define OVP_ClassId_Algorithm_ClassifierSVM CIdentifier(0x50486EC2, 0x6F2417FC) +#define OVP_ClassId_Algorithm_ClassifierSVM_DecisionAvailable CIdentifier(0x21A61E69, 0xD522CE01) +#define OVP_ClassId_Algorithm_ClassifierSVMDesc CIdentifier(0x272B056E, 0x0C6502AC) + +#define OVP_Algorithm_ClassifierSVM_InputParameterId_SVMType CIdentifier(0x0C347BBA, 0x180577F9) +#define OVP_Algorithm_ClassifierSVM_InputParameterId_SVMKernelType CIdentifier(0x1952129C, 0x6BEF38D7) +#define OVP_Algorithm_ClassifierSVM_InputParameterId_SVMDegree CIdentifier(0x0E284608, 0x7323390E) +#define OVP_Algorithm_ClassifierSVM_InputParameterId_SVMGamma CIdentifier(0x5D4A358F, 0x29043846) +#define OVP_Algorithm_ClassifierSVM_InputParameterId_SVMCoef0 CIdentifier(0x724D5EC5, 0x13E56658) +#define OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMCost CIdentifier(0x353662E8, 0x041D7610) +#define OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMNu CIdentifier(0x62334FC3, 0x49594D32) +#define OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMEpsilon CIdentifier(0x09896FD2, 0x523775BA) +#define OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMCacheSize CIdentifier(0x4BCE65A7, 0x6A103468) +#define OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMTolerance CIdentifier(0x2658168C, 0x0914687C) +#define OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMShrinking CIdentifier(0x63F5286A, 0x6A9D18BF) +#define OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMProbabilityEstimate CIdentifier(0x05DC16EA, 0x5DBD51C2) +#define OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMweight CIdentifier(0x0BA132BE, 0x17DD3B8F) +#define OVP_Algorithm_ClassifierSVM_InputParameterId_SVMWeightLabel CIdentifier(0x22C27048, 0x5CC6214A) + +#define OVP_TypeId_SVMType CIdentifier(0x2AF426D1, 0x72FB7BAC) +#define OVP_TypeId_SVMKernelType CIdentifier(0x54BB0016, 0x6AA27496) + +namespace OpenViBE { +namespace Plugins { +namespace Classification { +int SVMClassificationCompare(CMatrix& first, CMatrix& second); + + +class CAlgorithmClassifierSVM final : public Toolkit::CAlgorithmClassifier +{ +public: + + CAlgorithmClassifierSVM() { } + + bool initialize() override; + bool uninitialize() override; + + bool train(const Toolkit::IFeatureVectorSet& dataset) override; + bool classify(const Toolkit::IFeatureVector& sample, double& classLabel, Toolkit::IVector& distance, Toolkit::IVector& probability) override; + + XML::IXMLNode* saveConfig() override; + bool loadConfig(XML::IXMLNode* configNode) override; + static CString paramToString(svm_parameter* param); + CString modelToString() const; + CString problemToString(svm_problem* prob) const; + + size_t getNProbabilities() override { return 1; } + size_t getNDistances() override { return 0; } + + _IsDerivedFromClass_Final_(CAlgorithmClassifier, OVP_ClassId_Algorithm_ClassifierSVM) + +protected: + + std::vector m_class; + struct svm_parameter m_param; + + //struct svm_parameter *m_param; // set by parse_command_line + struct svm_problem m_prob; // set by read_problem + struct svm_model* m_model = nullptr; + + bool m_modelWasTrained = false; // true if from svm_train(), false if loaded + + int m_indexSV = 0; + size_t m_nFeatures = 0; + CMemoryBuffer m_config; + //todo a modifier en fonction de svn_save_model + //vector m_coefficients; + +private: + void loadParamNodeConfiguration(XML::IXMLNode* paramNode); + void loadModelNodeConfiguration(XML::IXMLNode* modelNode); + void loadModelSVsNodeConfiguration(XML::IXMLNode* svsNodeParam); + + void setParameter(); + + static void deleteModel(svm_model* model, bool freeSupportVectors); +}; + +class CAlgorithmClassifierSVMDesc : public Toolkit::CAlgorithmClassifierDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("SVM classifier"); } + CString getAuthorName() const override { return CString("Laurent Bougrain / Baptiste Payan"); } + CString getAuthorCompanyName() const override { return CString("UHP_Nancy1/LORIA INRIA/LORIA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString(""); } + CString getVersion() const override { return CString("1.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_ClassifierSVM; } + IPluginObject* create() override { return new CAlgorithmClassifierSVM; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CAlgorithmClassifierDesc::getAlgorithmPrototype(prototype); + prototype.addInputParameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMType, "SVM type", Kernel::ParameterType_Enumeration,OVP_TypeId_SVMType); + prototype.addInputParameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMKernelType, "Kernel type", Kernel::ParameterType_Enumeration, + OVP_TypeId_SVMKernelType); + prototype.addInputParameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMDegree, "Degree", Kernel::ParameterType_Integer); + prototype.addInputParameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMGamma, "Gamma", Kernel::ParameterType_Float); + prototype.addInputParameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMCoef0, "Coef 0", Kernel::ParameterType_Float); + prototype.addInputParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMCost, "Cost", Kernel::ParameterType_Float); + prototype.addInputParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMNu, "Nu", Kernel::ParameterType_Float); + prototype.addInputParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMEpsilon, "Epsilon", Kernel::ParameterType_Float); + prototype.addInputParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMCacheSize, "Cache size", Kernel::ParameterType_Float); + prototype.addInputParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMTolerance, "Epsilon tolerance", Kernel::ParameterType_Float); + prototype.addInputParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMShrinking, "Shrinking", Kernel::ParameterType_Boolean); + //prototype.addInputParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMProbabilityEstimate,"Probability estimate",Kernel::ParameterType_Boolean); + prototype.addInputParameter(OVP_ALgorithm_ClassifierSVM_InputParameterId_SVMweight, "Weight", Kernel::ParameterType_String); + prototype.addInputParameter(OVP_Algorithm_ClassifierSVM_InputParameterId_SVMWeightLabel, "Weight Label", Kernel::ParameterType_String); + return true; + } + + _IsDerivedFromClass_Final_(CAlgorithmClassifierDesc, OVP_ClassId_Algorithm_ClassifierSVMDesc) +}; +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmOutlierRemoval.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmOutlierRemoval.cpp new file mode 100644 index 0000000..5391600 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmOutlierRemoval.cpp @@ -0,0 +1,204 @@ +#include "ovpCBoxAlgorithmOutlierRemoval.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + + +static bool PairLess(const std::pair a, const std::pair b) { return a.first < b.first; } + +bool CBoxAlgorithmOutlierRemoval::initialize() +{ + m_stimDecoder.initialize(*this, 0); + m_sampleDecoder.initialize(*this, 1); + + m_stimEncoder.initialize(*this, 0); + m_sampleEncoder.initialize(*this, 1); + + // get the quantile parameters + m_lowerQuantile = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_upperQuantile = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_trigger = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + + m_lowerQuantile = std::min(std::max(m_lowerQuantile, 0.0), 1.0); + m_upperQuantile = std::min(std::max(m_upperQuantile, 0.0), 1.0); + + m_triggerTime = -1LL; + + return true; +} + +bool CBoxAlgorithmOutlierRemoval::uninitialize() +{ + m_sampleEncoder.uninitialize(); + m_stimEncoder.uninitialize(); + + m_sampleDecoder.uninitialize(); + m_stimDecoder.uninitialize(); + + for (auto& data : m_datasets) + { + delete data.sampleMatrix; + data.sampleMatrix = nullptr; + } + m_datasets.clear(); + + return true; +} + +bool CBoxAlgorithmOutlierRemoval::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + + +bool CBoxAlgorithmOutlierRemoval::pruneSet(std::vector& pruned) +{ + if (m_datasets.empty()) { return true; } + + const size_t nSample = m_datasets.size(), + nFeatures = m_datasets[0].sampleMatrix->getDimensionSize(0), + lowerIdx = size_t(m_lowerQuantile * nSample), + upperIdx = size_t(m_upperQuantile * nSample); + + this->getLogManager() << Kernel::LogLevel_Trace << "Examined dataset is [" << nSample << "x" << nFeatures << "].\n"; + + std::vector keptIdxs; + keptIdxs.resize(nSample); + for (size_t i = 0; i < nSample; ++i) { keptIdxs[i] = i; } + + std::vector> featureValues; + featureValues.resize(nSample); + + for (size_t f = 0; f < nFeatures; ++f) + { + for (size_t i = 0; i < nSample; ++i) { featureValues[i] = std::pair(m_datasets[i].sampleMatrix->getBuffer()[f], i); } + + std::sort(featureValues.begin(), featureValues.end(), PairLess); + + std::vector newIdxs; + newIdxs.resize(upperIdx - lowerIdx); + for (size_t j = lowerIdx, cnt = 0; j < upperIdx; j++, cnt++) { newIdxs[cnt] = featureValues[j].second; } + + this->getLogManager() << Kernel::LogLevel_Trace << "For feature " << (f + 1) << ", the retained range is [" << featureValues[lowerIdx].first + << ", " << featureValues[upperIdx - 1].first << "]\n"; + + std::sort(newIdxs.begin(), newIdxs.end()); + + std::vector intersections; + std::set_intersection(newIdxs.begin(), newIdxs.end(), keptIdxs.begin(), keptIdxs.end(), std::back_inserter(intersections)); + + keptIdxs = intersections; + + this->getLogManager() << Kernel::LogLevel_Debug << "After analyzing feat " << f << ", kept " << keptIdxs.size() << " examples.\n"; + } + + this->getLogManager() << Kernel::LogLevel_Trace << "Kept " << keptIdxs.size() << " examples in total (" + << (100.0 * keptIdxs.size() / double(m_datasets.size())) << "% of " << m_datasets.size() << ")\n"; + + pruned.clear(); + for (size_t idx : keptIdxs) { pruned.push_back(m_datasets[idx]); } + + return true; +} + +bool CBoxAlgorithmOutlierRemoval::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + // Stimulations + for (uint32_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_stimDecoder.decode(i); + if (m_stimDecoder.isHeaderReceived()) + { + m_stimEncoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + if (m_stimDecoder.isBufferReceived()) + { + const IStimulationSet* stimSet = m_stimDecoder.getOutputStimulationSet(); + for (uint32_t s = 0; s < stimSet->getStimulationCount(); ++s) + { + if (stimSet->getStimulationIdentifier(s) == m_trigger) + { + std::vector pruned; + if (!pruneSet(pruned)) { return false; } + + // encode + for (auto& feature : pruned) + { + m_sampleEncoder.getInputMatrix()->copy(*feature.sampleMatrix); + m_sampleEncoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(1, feature.startTime, feature.endTime); + } + + const uint64_t halfSecondHack = CTime(0.5).time(); + m_triggerTime = stimSet->getStimulationDate(s) + halfSecondHack; + } + } + + m_stimEncoder.getInputStimulationSet()->clear(); + + if (m_triggerTime >= boxContext.getInputChunkStartTime(0, i) && m_triggerTime < boxContext.getInputChunkEndTime(0, i)) + { + m_stimEncoder.getInputStimulationSet()->appendStimulation(m_trigger, m_triggerTime, 0); + m_triggerTime = -1LL; + } + + m_stimEncoder.encodeBuffer(); + + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + if (m_stimDecoder.isEndReceived()) + { + m_stimEncoder.encodeEnd(); + + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + + // Feature vectors + + for (uint32_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + m_sampleDecoder.decode(i); + if (m_sampleDecoder.isHeaderReceived()) + { + m_sampleEncoder.getInputMatrix()->copyDescription(*m_sampleDecoder.getOutputMatrix()); + m_sampleEncoder.encodeHeader(); + + boxContext.markOutputAsReadyToSend(1, boxContext.getInputChunkStartTime(1, i), boxContext.getInputChunkEndTime(1, i)); + } + + // pad feature to set + if (m_sampleDecoder.isBufferReceived()) + { + const CMatrix* pFeatureVectorMatrix = m_sampleDecoder.getOutputMatrix(); + + feature_vector_t tmp; + tmp.sampleMatrix = new CMatrix(); + tmp.startTime = boxContext.getInputChunkStartTime(1, i); + tmp.endTime = boxContext.getInputChunkEndTime(1, i); + + tmp.sampleMatrix->copy(*pFeatureVectorMatrix); + m_datasets.push_back(tmp); + } + + if (m_sampleDecoder.isEndReceived()) + { + m_sampleEncoder.encodeEnd(); + + boxContext.markOutputAsReadyToSend(1, boxContext.getInputChunkStartTime(1, i), boxContext.getInputChunkEndTime(1, i)); + } + } + + return true; +} +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmOutlierRemoval.h b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmOutlierRemoval.h new file mode 100644 index 0000000..cf5d2a9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmOutlierRemoval.h @@ -0,0 +1,90 @@ +#pragma once + +#include +#include + +#include +#include + +#define OVP_ClassId_BoxAlgorithm_OutlierRemovalDesc OpenViBE::CIdentifier(0x11DA1C24, 0x4C7A74C0) +#define OVP_ClassId_BoxAlgorithm_OutlierRemoval OpenViBE::CIdentifier(0x09E41B92, 0x4291B612) + +namespace OpenViBE { +namespace Plugins { +namespace Classification { +class CBoxAlgorithmOutlierRemoval final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_OutlierRemoval) + +protected: + + typedef struct + { + CMatrix* sampleMatrix; + uint64_t startTime; + uint64_t endTime; + } feature_vector_t; + + bool pruneSet(std::vector& pruned); + + Toolkit::TFeatureVectorDecoder m_sampleDecoder; + Toolkit::TStimulationDecoder m_stimDecoder; + + Toolkit::TFeatureVectorEncoder m_sampleEncoder; + Toolkit::TStimulationEncoder m_stimEncoder; + + std::vector m_datasets; + + double m_lowerQuantile = 0; + double m_upperQuantile = 0; + uint64_t m_trigger = 0; + uint64_t m_triggerTime = 0; +}; + +class CBoxAlgorithmOutlierRemovalDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Outlier removal"); } + CString getAuthorName() const override { return CString("Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Discards feature vectors with extremal values"); } + CString getDetailedDescription() const override { return CString("Simple outlier removal based on quantile estimation"); } + CString getCategory() const override { return CString("Classification"); } + CString getVersion() const override { return CString("1.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_OutlierRemoval; } + IPluginObject* create() override { return new CBoxAlgorithmOutlierRemoval; } + CString getStockItemName() const override { return "gtk-cut"; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input stimulations", OV_TypeId_Stimulations); + prototype.addInput("Input features", OV_TypeId_FeatureVector); + + prototype.addOutput("Output stimulations", OV_TypeId_Stimulations); + prototype.addOutput("Output features", OV_TypeId_FeatureVector); + + prototype.addSetting("Lower quantile", OV_TypeId_Float, "0.01"); + prototype.addSetting("Upper quantile", OV_TypeId_Float, "0.99"); + prototype.addSetting("Start trigger", OV_TypeId_Stimulation, "OVTK_StimulationId_Train"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_OutlierRemovalDesc) +}; +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/ovp_defines.h new file mode 100755 index 0000000..142d2c1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/ovp_defines.h @@ -0,0 +1,32 @@ +#pragma once + +#define OVP_Classification_BoxTrainerFormatVersion 4 +#define OVP_Classification_BoxTrainerFormatVersionRequired 4 + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + + +#define OVP_TypeId_ClassificationPairwiseStrategy OpenViBE::CIdentifier(0x0DD51C74, 0x3C4E74C9) +#define OVP_TypeId_OneVsOne_DecisionAlgorithms OpenViBE::CIdentifier(0xDEC1510, 0xDEC1510) + + +extern const char* const FORMAT_VERSION_ATTRIBUTE_NAME; +extern const char* const IDENTIFIER_ATTRIBUTE_NAME; + +extern const char* const STRATEGY_NODE_NAME; +extern const char* const ALGORITHM_NODE_NAME; +extern const char* const STIMULATIONS_NODE_NAME; +extern const char* const REJECTED_CLASS_NODE_NAME; +extern const char* const CLASS_STIMULATION_NODE_NAME; + +extern const char* const CLASSIFICATION_BOX_ROOT; +extern const char* const CLASSIFIER_ROOT; + +extern const char* const PAIRWISE_STRATEGY_ENUMERATION_NAME; + +extern const char* const MLP_EVALUATION_FUNCTION_NAME; +extern const char* const MLP_TRANSFERT_FUNCTION_NAME; + +bool OVFloatEqual(double first, double second); diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/ovp_main.cpp new file mode 100755 index 0000000..4b6d853 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/src/ovp_main.cpp @@ -0,0 +1,75 @@ +#include + +#include "ovp_defines.h" +#include "toolkit/algorithms/classification/ovtkCAlgorithmPairingStrategy.h" //For comparision mecanism + +#include "algorithms/ovpCAlgorithmClassifierSVM.h" + +#include "box-algorithms/ovpCBoxAlgorithmOutlierRemoval.h" + +#if defined TARGET_HAS_ThirdPartyEIGEN +#include "algorithms/ovpCAlgorithmClassifierMLP.h" +#endif // TARGET_HAS_ThirdPartyEIGEN + +#include + +const char* const PAIRWISE_STRATEGY_ENUMERATION_NAME = "Pairwise Decision Strategy"; + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + +OVP_Declare_Begin() + // SVM related + context.getTypeManager().registerEnumerationEntry(OVTK_TypeId_ClassificationAlgorithm, "Support Vector Machine (SVM)", + OVP_ClassId_Algorithm_ClassifierSVM.id()); + Toolkit::registerClassificationComparisonFunction(OVP_ClassId_Algorithm_ClassifierSVM, SVMClassificationCompare); + OVP_Declare_New(CAlgorithmClassifierSVMDesc); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_SVMType, "SVM Type"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SVMType, "C-SVC", C_SVC); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SVMType, "Nu-SVC", NU_SVC); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_SVMKernelType, "SVM Kernel Type"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SVMKernelType, "Linear", LINEAR); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SVMKernelType, "Polinomial", POLY); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SVMKernelType, "Radial basis function", RBF); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SVMKernelType, "Sigmoid", SIGMOID); + + + context.getTypeManager().registerEnumerationType(OVP_TypeId_ClassificationPairwiseStrategy, PAIRWISE_STRATEGY_ENUMERATION_NAME); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_ClassificationPairwiseStrategy, "Support Vector Machine (SVM)", + OVP_ClassId_Algorithm_ClassifierSVM.id()); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_OneVsOne_DecisionAlgorithms, "One vs One Decision Algorithms"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_OneVsOne_DecisionAlgorithms, "SVM Kernel Type", OVP_TypeId_SVMType.id()); + +#if defined TARGET_HAS_ThirdPartyEIGEN + //MLP section + OVP_Declare_New(CAlgorithmClassifierMLPDesc); + context.getTypeManager().registerEnumerationEntry(OVTK_TypeId_ClassificationAlgorithm, "Multi-layer Perceptron", + OVP_ClassId_Algorithm_ClassifierMLP.id()); + Toolkit::registerClassificationComparisonFunction(OVP_ClassId_Algorithm_ClassifierMLP, MLPClassificationCompare); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_ClassificationPairwiseStrategy, "Multi-layer Perceptron", + OVP_ClassId_Algorithm_ClassifierMLP.id()); + + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_OneVsOne_DecisionAlgorithms, "Multi-layer Perceptron", + OVP_ClassId_Algorithm_ClassifierMLP.id()); + +#endif // TARGET_HAS_ThirdPartyEIGEN + + // Register boxes + OVP_Declare_New(CBoxAlgorithmOutlierRemovalDesc); + +OVP_Declare_End() + +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE + + +bool OVFloatEqual(const double first, const double second) +{ + const double epsilon = 0.000001; + return epsilon > fabs(first - second); +} diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/CMakeLists.txt new file mode 100644 index 0000000..96d5717 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/CMakeLists.txt @@ -0,0 +1,27 @@ +PROJECT(test_accuracy) + +IF(WIN32) + ADD_DEFINITIONS(-DTARGET_OS_Windows) +ENDIF(WIN32) +IF(UNIX) + ADD_DEFINITIONS(-DTARGET_OS_Linux) +ENDIF(UNIX) +ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE) +ADD_DEFINITIONS(-DTARGET_ARCHITECTURE_i386) + +INCLUDE_DIRECTORIES(../src) +ADD_EXECUTABLE(${PROJECT_NAME} test_accuracy.cpp) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) # Place project in folder unit-test (for some IDE) + +#INCLUDE("FindOpenViBE") + +# Unfortunately we need to install the tests as any application to find .dll/.so files +# on both Windows and Linux. +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +#Install the signal file required for testing +INSTALL(DIRECTORY ../../../../applications/demos/ssvep-demo/signals DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/DartTestfile.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/DartTestfile.txt new file mode 100644 index 0000000..04fb506 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/DartTestfile.txt @@ -0,0 +1,66 @@ +#blabla + +# @FIXME there is a problem of using the global log, this will cause interference if any tests are run in parallel + +IF(WIN32) + SET(EXT cmd) + SET(OS_FLAGS "--no-pause") +ELSE() + SET(EXT sh) + SET(OS_FLAGS "") +ENDIF() + +# Misc classifier tests + +SET(TEST_SCENARIOS LDA-Native-Test LDA-OneVsOne-HT-Test LDA-OneVsOne-PKPD-Test LDA-OneVsOne-Voting-Test LDA-OneVsAll-Test sLDA-Native-Test sLDA-OneVsOne-HT-Test sLDA-OneVsOne-PKPD-Test sLDA-OneVsOne-Voting-Test sLDA-OneVsAll-Test SVM-Native-Test SVM-OneVsOne-Voting-Test SVM-OneVsOne-HT-Test SVM-OneVsOne-PKPD-Test SVM-OneVsAll-Test MLP-Native-Test MLP-OneVsOne-Voting-Test MLP-OneVsOne-HT-Test MLP-OneVsOne-PKPD-Test MLP-OneVsAll-Test) + +FOREACH(TEST_NAME ${TEST_SCENARIOS}) + + SET(SCENARIO_TO_TEST "${TEST_NAME}.xml") + + ADD_TEST(clean_Classification_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" ${OV_LOGFILE} classifiers/multiclass.xml) + ADD_TEST(run_Classification_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--invisible" "--no-session-management" --define Plugin_Classification_RandomizeKFoldTestData true "--play-fast" ${SCENARIO_TO_TEST}) + ADD_TEST(compare_Classification_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_accuracy.${EXT}" "${OS_FLAGS}" "${OV_LOGFILE}") + ADD_TEST(run_Classification_${TEST_NAME}_ProcessorBox "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--invisible" "--no-session-management" --define Plugin_Classification_RandomizeKFoldTestData true "--play-fast" "ProcessorBox-Test.xml") + + # It would be better to clean last, but we can't do this as it will delete the + # output we wish to include, and we can't prevent clean from running if a prev. test fails + # We need the clean to be sure that the comparator stage is not getting data from a previous run. + SET_TESTS_PROPERTIES(run_Classification_${TEST_NAME} PROPERTIES DEPENDS clean_Classification_${TEST_NAME}) + SET_TESTS_PROPERTIES(run_Classification_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) + + SET_TESTS_PROPERTIES(compare_Classification_${TEST_NAME} PROPERTIES DEPENDS run_Classification_${TEST_NAME}) + SET_TESTS_PROPERTIES(compare_Classification_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) + + SET_TESTS_PROPERTIES(run_Classification_${TEST_NAME}_ProcessorBox PROPERTIES DEPENDS run_Classification_${TEST_NAME}) + SET_TESTS_PROPERTIES(run_Classification_${TEST_NAME}_ProcessorBox PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) + +ENDFOREACH(TEST_NAME) + +# Shrinkage LDA tests. These are in a different block as they use different data (and miss ProcessorBox part) + +SET(TEST_SCENARIOS shrinkage_lda shrinkage_lda_rot) +SET(TEST_THRESHOLD 80) + +FOREACH(TEST_NAME ${TEST_SCENARIOS}) + + SET(SCENARIO_TO_TEST "shrinkageLDA/${TEST_NAME}.xml") + + ADD_TEST(clean_Classification_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" ${OV_LOGFILE}) + ADD_TEST(run_Classification_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--invisible" "--no-session-management" --define Plugin_Classification_RandomizeKFoldTestData true "--play-fast" ${SCENARIO_TO_TEST}) + ADD_TEST(compare_Classification_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_accuracy.${EXT}" "${OS_FLAGS}" "${OV_LOGFILE}" "${TEST_THRESHOLD}") + + # It would be better to clean last, but we can't do this as it will delete the + # output we wish to include, and we can't prevent clean from running if a prev. test fails + # We need the clean to be sure that the comparator stage is not getting data from a previous run. + SET_TESTS_PROPERTIES(run_Classification_${TEST_NAME} PROPERTIES DEPENDS clean_Classification_${TEST_NAME}) + SET_TESTS_PROPERTIES(run_Classification_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) + + SET_TESTS_PROPERTIES(compare_Classification_${TEST_NAME} PROPERTIES DEPENDS run_Classification_${TEST_NAME}) + SET_TESTS_PROPERTIES(compare_Classification_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) + + SET_TESTS_PROPERTIES(run_Classification_${TEST_NAME}_ProcessorBox PROPERTIES DEPENDS run_Classification_${TEST_NAME}) + SET_TESTS_PROPERTIES(run_Classification_${TEST_NAME}_ProcessorBox PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) + +ENDFOREACH(TEST_NAME) + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/LDA-Native-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/LDA-Native-Test.xml new file mode 100644 index 0000000..627b4f4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/LDA-Native-Test.xml @@ -0,0 +1,2309 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x56fbfd1a, 0x2c474c9e) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800.000000 + + + (0x207c9054, 0x3c841b63) + 752.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x082a348e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x04425bf5, 0x3335d8a7) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x56fbfd1a, 0x2c474c9e) + 3 + + + + (0x06905dfd, 0x0a12e4a2) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x55200f87, 0x00b3c658) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x56fbfd1a, 0x2c474c9e) + 2 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x72ae14cf, 0x7201ea84) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 1 + + + + (0x731aa1b4, 0x14c8e6c0) + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/LDA-OneVsAll-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/LDA-OneVsAll-Test.xml new file mode 100644 index 0000000..2e54185 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/LDA-OneVsAll-Test.xml @@ -0,0 +1,2309 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x56fbfd1a, 0x2c474c9e) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsAll + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800.000000 + + + (0x207c9054, 0x3c841b63) + 752.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x082a348e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x04425bf5, 0x3335d8a7) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x56fbfd1a, 0x2c474c9e) + 3 + + + + (0x06905dfd, 0x0a12e4a2) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x55200f87, 0x00b3c658) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x56fbfd1a, 0x2c474c9e) + 2 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x72ae14cf, 0x7201ea84) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 1 + + + + (0x731aa1b4, 0x14c8e6c0) + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/LDA-OneVsOne-HT-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/LDA-OneVsOne-HT-Test.xml new file mode 100644 index 0000000..14e4dde --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/LDA-OneVsOne-HT-Test.xml @@ -0,0 +1,2309 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x56fbfd1a, 0x2c474c9e) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800.000000 + + + (0x207c9054, 0x3c841b63) + 752.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x082a348e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x04425bf5, 0x3335d8a7) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x56fbfd1a, 0x2c474c9e) + 3 + + + + (0x06905dfd, 0x0a12e4a2) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x55200f87, 0x00b3c658) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x56fbfd1a, 0x2c474c9e) + 2 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x72ae14cf, 0x7201ea84) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 1 + + + + (0x731aa1b4, 0x14c8e6c0) + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/LDA-OneVsOne-PKPD-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/LDA-OneVsOne-PKPD-Test.xml new file mode 100644 index 0000000..5a1a124 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/LDA-OneVsOne-PKPD-Test.xml @@ -0,0 +1,2316 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x56fbfd1a, 0x2c474c9e) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsOne + false + + + (0x79146976, 0xd7f01a25) + Pairwise Decision Strategy + PKPD + PKPD + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800.000000 + + + (0x207c9054, 0x3c841b63) + 752.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x082a348e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x04425bf5, 0x3335d8a7) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x56fbfd1a, 0x2c474c9e) + 3 + + + + (0x06905dfd, 0x0a12e4a2) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x55200f87, 0x00b3c658) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x56fbfd1a, 0x2c474c9e) + 2 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x72ae14cf, 0x7201ea84) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 1 + + + + (0x731aa1b4, 0x14c8e6c0) + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/LDA-OneVsOne-Voting-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/LDA-OneVsOne-Voting-Test.xml new file mode 100644 index 0000000..2d133ad --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/LDA-OneVsOne-Voting-Test.xml @@ -0,0 +1,2316 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x56fbfd1a, 0x2c474c9e) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsOne + false + + + (0x79146976, 0xd7f01a25) + Pairwise Decision Strategy + PKPD + Voting + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800.000000 + + + (0x207c9054, 0x3c841b63) + 752.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x082a348e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x04425bf5, 0x3335d8a7) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x56fbfd1a, 0x2c474c9e) + 3 + + + + (0x06905dfd, 0x0a12e4a2) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x55200f87, 0x00b3c658) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x56fbfd1a, 0x2c474c9e) + 2 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x72ae14cf, 0x7201ea84) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 1 + + + + (0x731aa1b4, 0x14c8e6c0) + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/MLP-Native-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/MLP-Native-Test.xml new file mode 100644 index 0000000..068b90c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/MLP-Native-Test.xml @@ -0,0 +1,2309 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x56fbfd1a, 0x2c474c9e) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Multi-layer Perceptron + false + + + (0x007deef9, 0x2f3e95c6) + Number of neurons in hidden layer + 3 + 3 + false + + + (0x512a166f, 0x5c3ef83f) + Learning stop condition + 0.000001 + 0.000001 + false + + + (0x512a166f, 0x5c3ef83f) + Learning coefficient + 0.010000 + 0.010000 + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800.000000 + + + (0x207c9054, 0x3c841b63) + 752.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x082a348e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x04425bf5, 0x3335d8a7) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x56fbfd1a, 0x2c474c9e) + 3 + + + + (0x06905dfd, 0x0a12e4a2) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x55200f87, 0x00b3c658) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x56fbfd1a, 0x2c474c9e) + 2 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x72ae14cf, 0x7201ea84) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 1 + + + + (0x731aa1b4, 0x14c8e6c0) + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/MLP-OneVsAll-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/MLP-OneVsAll-Test.xml new file mode 100644 index 0000000..aadd1d2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/MLP-OneVsAll-Test.xml @@ -0,0 +1,2309 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x56fbfd1a, 0x2c474c9e) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsAll + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Multi-layer Perceptron + false + + + (0x007deef9, 0x2f3e95c6) + Number of neurons in hidden layer + 3 + 3 + false + + + (0x512a166f, 0x5c3ef83f) + Learning stop condition + 0.000001 + 0.000001 + false + + + (0x512a166f, 0x5c3ef83f) + Learning coefficient + 0.010000 + 0.010000 + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800.000000 + + + (0x207c9054, 0x3c841b63) + 752.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x082a348e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x04425bf5, 0x3335d8a7) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x56fbfd1a, 0x2c474c9e) + 3 + + + + (0x06905dfd, 0x0a12e4a2) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x55200f87, 0x00b3c658) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x56fbfd1a, 0x2c474c9e) + 2 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x72ae14cf, 0x7201ea84) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 1 + + + + (0x731aa1b4, 0x14c8e6c0) + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/MLP-OneVsOne-HT-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/MLP-OneVsOne-HT-Test.xml new file mode 100644 index 0000000..4dcf321 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/MLP-OneVsOne-HT-Test.xml @@ -0,0 +1,2308 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x6cc6b8a7, 0x009107fb) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsOne + false + + + (0x79146976, 0xd7f01a25) + Pairwise Decision Strategy + PKPD + HT + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Multi-layer Perceptron + false + + + (0x007deef9, 0x2f3e95c6) + Number of neurons in hidden layer + 3 + 3 + false + + + (0x512a166f, 0x5c3ef83f) + Learning stop condition + 0.000001 + 0.000001 + false + + + (0x512a166f, 0x5c3ef83f) + Learning coefficient + 0.010000 + 0.010000 + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b6efc47, 0x124752a0) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x6cc6b8a7, 0x009107fb) + 1 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x41d9829b, 0x337dd17a) + + (0x6cc6b8a7, 0x009107fb) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6df2fe24, 0x30612cfa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6cc6b8a7, 0x009107fb) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x7235ba99, 0x1acc9f60) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x6cc6b8a7, 0x009107fb) + 2 + + + + (0x748cf7b0, 0x1007a9de) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x6cc6b8a7, 0x009107fb) + 3 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/MLP-OneVsOne-PKPD-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/MLP-OneVsOne-PKPD-Test.xml new file mode 100644 index 0000000..2076196 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/MLP-OneVsOne-PKPD-Test.xml @@ -0,0 +1,2308 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x6cc6b8a7, 0x009107fb) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsOne + false + + + (0x79146976, 0xd7f01a25) + Pairwise Decision Strategy + PKPD + PKPD + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Multi-layer Perceptron + false + + + (0x007deef9, 0x2f3e95c6) + Number of neurons in hidden layer + 3 + 3 + false + + + (0x512a166f, 0x5c3ef83f) + Learning stop condition + 0.000001 + 0.000001 + false + + + (0x512a166f, 0x5c3ef83f) + Learning coefficient + 0.010000 + 0.010000 + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b6efc47, 0x124752a0) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x6cc6b8a7, 0x009107fb) + 1 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x41d9829b, 0x337dd17a) + + (0x6cc6b8a7, 0x009107fb) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6df2fe24, 0x30612cfa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6cc6b8a7, 0x009107fb) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x7235ba99, 0x1acc9f60) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x6cc6b8a7, 0x009107fb) + 2 + + + + (0x748cf7b0, 0x1007a9de) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x6cc6b8a7, 0x009107fb) + 3 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/MLP-OneVsOne-Voting-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/MLP-OneVsOne-Voting-Test.xml new file mode 100644 index 0000000..2ddee62 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/MLP-OneVsOne-Voting-Test.xml @@ -0,0 +1,2308 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x6cc6b8a7, 0x009107fb) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsOne + false + + + (0x79146976, 0xd7f01a25) + Pairwise Decision Strategy + PKPD + Voting + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Multi-layer Perceptron + false + + + (0x007deef9, 0x2f3e95c6) + Number of neurons in hidden layer + 3 + 3 + false + + + (0x512a166f, 0x5c3ef83f) + Learning stop condition + 0.000001 + 0.000001 + false + + + (0x512a166f, 0x5c3ef83f) + Learning coefficient + 0.010000 + 0.010000 + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b6efc47, 0x124752a0) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x6cc6b8a7, 0x009107fb) + 1 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x41d9829b, 0x337dd17a) + + (0x6cc6b8a7, 0x009107fb) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6df2fe24, 0x30612cfa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6cc6b8a7, 0x009107fb) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x7235ba99, 0x1acc9f60) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x6cc6b8a7, 0x009107fb) + 2 + + + + (0x748cf7b0, 0x1007a9de) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x6cc6b8a7, 0x009107fb) + 3 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/ProcessorBox-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/ProcessorBox-Test.xml new file mode 100644 index 0000000..dc8b61f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/ProcessorBox-Test.xml @@ -0,0 +1,1972 @@ + + 1 + openvibe + 2.0 + + + + + + (0x00002a98, 0x00002419) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 576.000000 + + + (0x207c9054, 0x3c841b63) + 824.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0395189b, 0x591ac716) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -416.000000 + + + (0x207c9054, 0x3c841b63) + 848.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01fc5cdc) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336.000000 + + + (0x207c9054, 0x3c841b63) + 1024.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002d8c2b) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x207c9054, 0x3c841b63) + 1024.000000 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002fb5d3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x207c9054, 0x3c841b63) + 576.000000 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002f2f96) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336.000000 + + + (0x207c9054, 0x3c841b63) + 576.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00306e59) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00e9c456) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336.000000 + + + (0x207c9054, 0x3c841b63) + 816.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002dadb9) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192.000000 + + + (0x207c9054, 0x3c841b63) + 576.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003009b5) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192.000000 + + + (0x207c9054, 0x3c841b63) + 1024.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002f0e0c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x207c9054, 0x3c841b63) + 816.000000 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002e33f4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x586cf9e7, 0x6d237ab1) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.0 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x586cf9e7, 0x6d237ab2) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.0 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x586cf9e7, 0x6d237ab3) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.0 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32.000000 + + + (0x207c9054, 0x3c841b63) + 576.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a686e8) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48.000000 + + + (0x207c9054, 0x3c841b63) + 1040.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00aada32) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -224.000000 + + + (0x207c9054, 0x3c841b63) + 1040.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05f87eff) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x69694af8, 0x660910b0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x69694af8, 0x660910b1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x69694af8, 0x660910b2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192.000000 + + + (0x207c9054, 0x3c841b63) + 816.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002e5580) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 464.000000 + + + (0x207c9054, 0x3c841b63) + 816.000000 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00358b00) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a1be2c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000d40, 0x0000227e) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x00002a98, 0x00002419) + 0 + + + + (0x0320c11e, 0x1b68eecf) + + (0x586cf9e7, 0x6d237ab2) + 0 + + + (0x69694af8, 0x660910b1) + 0 + + + + (0x061244ea, 0x18e7b34d) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x0395189b, 0x591ac716) + 0 + + + + (0x0db12c02, 0x46276680) + + (0x6292a294, 0x629905c2) + 0 + + + (0x586cf9e7, 0x6d237ab2) + 1 + + + + (0x0feb30d8, 0x3efd0678) + + (0x0395189b, 0x591ac716) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x16651ad1, 0x74ed4cb2) + + (0x69694af8, 0x660910b0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x20b59fd3, 0x365a5fb2) + + (0x69694af8, 0x660910b1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x261a3eee, 0x77861569) + + (0x0395189b, 0x591ac716) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x3208e3be, 0x063695ef) + + (0x6292a294, 0x629905c2) + 0 + + + (0x586cf9e7, 0x6d237ab1) + 1 + + + + (0x32459cc7, 0x2e6c8a61) + + (0x0395189b, 0x591ac716) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3d9c7414, 0x1797bc39) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x586cf9e7, 0x6d237ab2) + 0 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x43d3068e, 0x3b38c150) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x586cf9e7, 0x6d237ab3) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x5637cb92, 0x12e6bda8) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x586cf9e7, 0x6d237ab1) + 0 + + + + (0x58d2a1bf, 0x1938cd14) + + (0x0395189b, 0x591ac716) + 1 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x5f021a55, 0x6e32cb97) + + (0x586cf9e7, 0x6d237ab3) + 0 + + + (0x69694af8, 0x660910b2) + 0 + + + + (0x6730ee40, 0x5b6e36b3) + + (0x69694af8, 0x660910b2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x6e622b80, 0x7182a0fb) + + (0x586cf9e7, 0x6d237ab1) + 0 + + + (0x69694af8, 0x660910b0) + 0 + + + + (0x71fe4dc1, 0x79b7a49b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x586cf9e7, 0x6d237ab3) + 1 + + + + (0x72027a61, 0x386ab7ec) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x0395189b, 0x591ac716) + 1 + + + + (0x76bcfde0, 0x58320fe3) + + (0x0395189b, 0x591ac716) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + + + + (0x24661fda, 0x52bd6c31) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/SVM-Native-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/SVM-Native-Test.xml new file mode 100644 index 0000000..03c7b99 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/SVM-Native-Test.xml @@ -0,0 +1,2371 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x6cc6b8a7, 0x009107fb) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Support Vector Machine (SVM) + false + + + (0x512a166f, 0x5c3ef83f) + Epsilon + 0.100000 + 0.100000 + false + + + (0x79a9edeb, 0x245d83fc) + Weight + + + false + + + (0x2af426d1, 0x72fb7bac) + SVM type + C-SVC + C-SVC + false + + + (0x007deef9, 0x2f3e95c6) + Degree + 3 + 1 + false + + + (0x54bb0016, 0x6aa27496) + Kernel type + Linear + Linear + false + + + (0x79a9edeb, 0x245d83fc) + Weight Label + + + false + + + (0x512a166f, 0x5c3ef83f) + Epsilon tolerance + 0.001000 + 0.001000 + false + + + (0x512a166f, 0x5c3ef83f) + Cost + 1.000000 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Cache size + 100.000000 + 100.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Gamma + 0.000000 + 0.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Nu + 0.500000 + 0.500000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinking + true + true + false + + + (0x512a166f, 0x5c3ef83f) + Coef 0 + 0.000000 + 0.000000 + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b6efc47, 0x124752a0) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x6cc6b8a7, 0x009107fb) + 1 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x41d9829b, 0x337dd17a) + + (0x6cc6b8a7, 0x009107fb) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6df2fe24, 0x30612cfa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6cc6b8a7, 0x009107fb) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x7235ba99, 0x1acc9f60) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x6cc6b8a7, 0x009107fb) + 2 + + + + (0x748cf7b0, 0x1007a9de) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x6cc6b8a7, 0x009107fb) + 3 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/SVM-OneVsAll-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/SVM-OneVsAll-Test.xml new file mode 100644 index 0000000..6fe40ae --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/SVM-OneVsAll-Test.xml @@ -0,0 +1,2371 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x6cc6b8a7, 0x009107fb) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsAll + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Support Vector Machine (SVM) + false + + + (0x512a166f, 0x5c3ef83f) + Epsilon + 0.100000 + 0.100000 + false + + + (0x79a9edeb, 0x245d83fc) + Weight + + + false + + + (0x2af426d1, 0x72fb7bac) + SVM type + C-SVC + C-SVC + false + + + (0x007deef9, 0x2f3e95c6) + Degree + 3 + 1 + false + + + (0x54bb0016, 0x6aa27496) + Kernel type + Linear + Linear + false + + + (0x79a9edeb, 0x245d83fc) + Weight Label + + + false + + + (0x512a166f, 0x5c3ef83f) + Epsilon tolerance + 0.001000 + 0.001000 + false + + + (0x512a166f, 0x5c3ef83f) + Cost + 1.000000 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Cache size + 100.000000 + 100.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Gamma + 0.000000 + 0.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Nu + 0.500000 + 0.500000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinking + true + true + false + + + (0x512a166f, 0x5c3ef83f) + Coef 0 + 0.000000 + 0.000000 + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b6efc47, 0x124752a0) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x6cc6b8a7, 0x009107fb) + 1 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x41d9829b, 0x337dd17a) + + (0x6cc6b8a7, 0x009107fb) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6df2fe24, 0x30612cfa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6cc6b8a7, 0x009107fb) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x7235ba99, 0x1acc9f60) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x6cc6b8a7, 0x009107fb) + 2 + + + + (0x748cf7b0, 0x1007a9de) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x6cc6b8a7, 0x009107fb) + 3 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/SVM-OneVsOne-HT-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/SVM-OneVsOne-HT-Test.xml new file mode 100644 index 0000000..450472f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/SVM-OneVsOne-HT-Test.xml @@ -0,0 +1,2378 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x6cc6b8a7, 0x009107fb) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsOne + false + + + (0x79146976, 0xd7f01a25) + Pairwise Decision Strategy + PKPD + HT + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Support Vector Machine (SVM) + false + + + (0x512a166f, 0x5c3ef83f) + Epsilon + 0.100000 + 0.100000 + false + + + (0x79a9edeb, 0x245d83fc) + Weight + + + false + + + (0x2af426d1, 0x72fb7bac) + SVM type + C-SVC + C-SVC + false + + + (0x007deef9, 0x2f3e95c6) + Degree + 3 + 1 + false + + + (0x54bb0016, 0x6aa27496) + Kernel type + Linear + Linear + false + + + (0x79a9edeb, 0x245d83fc) + Weight Label + + + false + + + (0x512a166f, 0x5c3ef83f) + Epsilon tolerance + 0.001000 + 0.001000 + false + + + (0x512a166f, 0x5c3ef83f) + Cost + 1.000000 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Cache size + 100.000000 + 100.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Gamma + 0.000000 + 0.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Nu + 0.500000 + 0.500000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinking + true + true + false + + + (0x512a166f, 0x5c3ef83f) + Coef 0 + 0.000000 + 0.000000 + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b6efc47, 0x124752a0) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x6cc6b8a7, 0x009107fb) + 1 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x41d9829b, 0x337dd17a) + + (0x6cc6b8a7, 0x009107fb) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6df2fe24, 0x30612cfa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6cc6b8a7, 0x009107fb) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x7235ba99, 0x1acc9f60) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x6cc6b8a7, 0x009107fb) + 2 + + + + (0x748cf7b0, 0x1007a9de) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x6cc6b8a7, 0x009107fb) + 3 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/SVM-OneVsOne-PKPD-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/SVM-OneVsOne-PKPD-Test.xml new file mode 100644 index 0000000..00a7757 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/SVM-OneVsOne-PKPD-Test.xml @@ -0,0 +1,2378 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x6cc6b8a7, 0x009107fb) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsOne + false + + + (0x79146976, 0xd7f01a25) + Pairwise Decision Strategy + PKPD + PKPD + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Support Vector Machine (SVM) + false + + + (0x512a166f, 0x5c3ef83f) + Epsilon + 0.100000 + 0.100000 + false + + + (0x79a9edeb, 0x245d83fc) + Weight + + + false + + + (0x2af426d1, 0x72fb7bac) + SVM type + C-SVC + C-SVC + false + + + (0x007deef9, 0x2f3e95c6) + Degree + 3 + 1 + false + + + (0x54bb0016, 0x6aa27496) + Kernel type + Linear + Linear + false + + + (0x79a9edeb, 0x245d83fc) + Weight Label + + + false + + + (0x512a166f, 0x5c3ef83f) + Epsilon tolerance + 0.001000 + 0.001000 + false + + + (0x512a166f, 0x5c3ef83f) + Cost + 1.000000 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Cache size + 100.000000 + 100.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Gamma + 0.000000 + 0.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Nu + 0.500000 + 0.500000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinking + true + true + false + + + (0x512a166f, 0x5c3ef83f) + Coef 0 + 0.000000 + 0.000000 + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b6efc47, 0x124752a0) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x6cc6b8a7, 0x009107fb) + 1 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x41d9829b, 0x337dd17a) + + (0x6cc6b8a7, 0x009107fb) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6df2fe24, 0x30612cfa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6cc6b8a7, 0x009107fb) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x7235ba99, 0x1acc9f60) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x6cc6b8a7, 0x009107fb) + 2 + + + + (0x748cf7b0, 0x1007a9de) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x6cc6b8a7, 0x009107fb) + 3 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/SVM-OneVsOne-Voting-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/SVM-OneVsOne-Voting-Test.xml new file mode 100644 index 0000000..f9e343c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/SVM-OneVsOne-Voting-Test.xml @@ -0,0 +1,2378 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x6cc6b8a7, 0x009107fb) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsOne + false + + + (0x79146976, 0xd7f01a25) + Pairwise Decision Strategy + PKPD + Voting + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Support Vector Machine (SVM) + false + + + (0x512a166f, 0x5c3ef83f) + Epsilon + 0.100000 + 0.100000 + false + + + (0x79a9edeb, 0x245d83fc) + Weight + + + false + + + (0x2af426d1, 0x72fb7bac) + SVM type + C-SVC + C-SVC + false + + + (0x007deef9, 0x2f3e95c6) + Degree + 3 + 1 + false + + + (0x54bb0016, 0x6aa27496) + Kernel type + Linear + Linear + false + + + (0x79a9edeb, 0x245d83fc) + Weight Label + + + false + + + (0x512a166f, 0x5c3ef83f) + Epsilon tolerance + 0.001000 + 0.001000 + false + + + (0x512a166f, 0x5c3ef83f) + Cost + 1.000000 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Cache size + 100.000000 + 100.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Gamma + 0.000000 + 0.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Nu + 0.500000 + 0.500000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinking + true + true + false + + + (0x512a166f, 0x5c3ef83f) + Coef 0 + 0.000000 + 0.000000 + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 3 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b6efc47, 0x124752a0) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x6cc6b8a7, 0x009107fb) + 1 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x41d9829b, 0x337dd17a) + + (0x6cc6b8a7, 0x009107fb) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6df2fe24, 0x30612cfa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6cc6b8a7, 0x009107fb) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x7235ba99, 0x1acc9f60) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x6cc6b8a7, 0x009107fb) + 2 + + + + (0x748cf7b0, 0x1007a9de) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x6cc6b8a7, 0x009107fb) + 3 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/classifiers/csp-1.cfg b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/classifiers/csp-1.cfg new file mode 100644 index 0000000..817cb88 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/classifiers/csp-1.cfg @@ -0,0 +1,5 @@ + + 3.710409e-01 6.657479e-01 -1.042486e-01 7.402487e-02 -4.998371e-01 -3.910547e-01 -4.640642e-01 3.905098e-01 -3.351870e-01 -1.548908e-01 6.889251e-01 -1.455582e-01 + 2 + 6 + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/classifiers/csp-2.cfg b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/classifiers/csp-2.cfg new file mode 100644 index 0000000..06f8edf --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/classifiers/csp-2.cfg @@ -0,0 +1,5 @@ + + 3.650117e-01 2.806841e-01 4.808358e-01 1.014923e-02 -7.237455e-01 -1.812988e-01 -3.742728e-01 5.225129e-01 -2.793061e-01 3.121540e-01 5.283969e-01 -3.636546e-01 + 2 + 6 + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/classifiers/csp-3.cfg b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/classifiers/csp-3.cfg new file mode 100644 index 0000000..74534e9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/classifiers/csp-3.cfg @@ -0,0 +1,5 @@ + + -5.343845e-01 1.369963e-02 3.678158e-01 -6.578927e-01 3.275904e-01 1.970249e-01 4.196543e-01 -5.389358e-01 3.383975e-01 5.559860e-02 -5.922296e-01 2.551440e-01 + 2 + 6 + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/configuration/stimulation-based-epoching.cfg b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/configuration/stimulation-based-epoching.cfg new file mode 100644 index 0000000..e3c3c02 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/configuration/stimulation-based-epoching.cfg @@ -0,0 +1,5 @@ + + 7 + 1 + OVTK_StimulationId_Target + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/configuration/temporal-filter-freq-1.cfg b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/configuration/temporal-filter-freq-1.cfg new file mode 100644 index 0000000..1387fee --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/configuration/temporal-filter-freq-1.cfg @@ -0,0 +1,8 @@ + +Butterworth +Band pass +4 +19.75 +20.25 +0.500000 + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/configuration/temporal-filter-freq-2.cfg b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/configuration/temporal-filter-freq-2.cfg new file mode 100644 index 0000000..964b9bd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/configuration/temporal-filter-freq-2.cfg @@ -0,0 +1,8 @@ + +Butterworth +Band pass +4 +14.75 +15.25 +0.500000 + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/configuration/temporal-filter-freq-3.cfg b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/configuration/temporal-filter-freq-3.cfg new file mode 100644 index 0000000..f1f947b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/configuration/temporal-filter-freq-3.cfg @@ -0,0 +1,8 @@ + +Butterworth +Band pass +4 +11.75 +12.25 +0.500000 + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/configuration/time-based-epoching.cfg b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/configuration/time-based-epoching.cfg new file mode 100644 index 0000000..14dcabc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/configuration/time-based-epoching.cfg @@ -0,0 +1,4 @@ + +0.5 +0.1 + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/sLDA-Native-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/sLDA-Native-Test.xml new file mode 100644 index 0000000..a0ffa60 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/sLDA-Native-Test.xml @@ -0,0 +1,2309 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x56fbfd1a, 0x2c474c9e) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + true + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800.000000 + + + (0x207c9054, 0x3c841b63) + 752.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x082a348e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x04425bf5, 0x3335d8a7) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x56fbfd1a, 0x2c474c9e) + 3 + + + + (0x06905dfd, 0x0a12e4a2) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x55200f87, 0x00b3c658) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x56fbfd1a, 0x2c474c9e) + 2 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x72ae14cf, 0x7201ea84) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 1 + + + + (0x731aa1b4, 0x14c8e6c0) + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/sLDA-OneVsAll-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/sLDA-OneVsAll-Test.xml new file mode 100644 index 0000000..22bc80a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/sLDA-OneVsAll-Test.xml @@ -0,0 +1,2309 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x56fbfd1a, 0x2c474c9e) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsAll + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + true + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800.000000 + + + (0x207c9054, 0x3c841b63) + 752.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x082a348e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x04425bf5, 0x3335d8a7) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x56fbfd1a, 0x2c474c9e) + 3 + + + + (0x06905dfd, 0x0a12e4a2) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x55200f87, 0x00b3c658) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x56fbfd1a, 0x2c474c9e) + 2 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x72ae14cf, 0x7201ea84) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 1 + + + + (0x731aa1b4, 0x14c8e6c0) + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/sLDA-OneVsOne-HT-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/sLDA-OneVsOne-HT-Test.xml new file mode 100644 index 0000000..a0ffa60 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/sLDA-OneVsOne-HT-Test.xml @@ -0,0 +1,2309 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x56fbfd1a, 0x2c474c9e) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + true + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800.000000 + + + (0x207c9054, 0x3c841b63) + 752.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x082a348e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x04425bf5, 0x3335d8a7) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x56fbfd1a, 0x2c474c9e) + 3 + + + + (0x06905dfd, 0x0a12e4a2) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x55200f87, 0x00b3c658) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x56fbfd1a, 0x2c474c9e) + 2 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x72ae14cf, 0x7201ea84) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 1 + + + + (0x731aa1b4, 0x14c8e6c0) + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/sLDA-OneVsOne-PKPD-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/sLDA-OneVsOne-PKPD-Test.xml new file mode 100644 index 0000000..0d60449 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/sLDA-OneVsOne-PKPD-Test.xml @@ -0,0 +1,2316 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x56fbfd1a, 0x2c474c9e) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsOne + false + + + (0x79146976, 0xd7f01a25) + Pairwise Decision Strategy + PKPD + PKPD + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + true + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800.000000 + + + (0x207c9054, 0x3c841b63) + 752.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x082a348e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x04425bf5, 0x3335d8a7) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x56fbfd1a, 0x2c474c9e) + 3 + + + + (0x06905dfd, 0x0a12e4a2) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x55200f87, 0x00b3c658) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x56fbfd1a, 0x2c474c9e) + 2 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x72ae14cf, 0x7201ea84) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 1 + + + + (0x731aa1b4, 0x14c8e6c0) + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/sLDA-OneVsOne-Voting-Test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/sLDA-OneVsOne-Voting-Test.xml new file mode 100644 index 0000000..4e66602 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/sLDA-OneVsOne-Voting-Test.xml @@ -0,0 +1,2316 @@ + + 1 + openvibe + 2.0 + + + + + + (0x03dba115, 0x4c1f8a3a) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + (0x013df452, 0xa3a8879a) + Output stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0605dd92) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x08ab469c, 0x10c9257e) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x17341935, 0x152ff448) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0e30ed60, 0x478cbcea) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1465e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x1300340f, 0x7c5de533) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c9d9cd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x219be4a9, 0x6e609516) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00acd187) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2655c041, 0x15f4a40c) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40d) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2655c041, 0x15f4a40e) + SBE + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 6.00 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 1.00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x27849ab5, 0x2467a8be) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b22076) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 864 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0504c48f) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x348c88da, 0x652055d3) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3a95d3c2, 0x6a571226) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bc8c12) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x415522f9, 0x54a34c1d) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a83b22) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x4b0bfe3e, 0x2c3a7e5c) + Sg Avg + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b24205) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f0) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f1) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4f494c33, 0x2f8af0f2) + TBE + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/time-based-epoching.cfg + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x50eef0f8, 0x07c4a998) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x56fbfd1a, 0x2c474c9e) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${__volatile_ScenarioDir}/classifiers/multiclass.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsOne + false + + + (0x79146976, 0xd7f01a25) + Pairwise Decision Strategy + PKPD + Voting + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + true + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800.000000 + + + (0x207c9054, 0x3c841b63) + 752.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x082a348e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5b1d76cb, 0x6835d27c) + Frequency 1 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 19.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-1.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02babeb3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x617e3b04, 0x389397c3) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 11.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-3.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02bf65dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6292a294, 0x629905c2) + Target Separator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${__volatile_ScenarioDir}/scripts/classifier-training-target-separator.lua + false + + + (0x79a9edeb, 0x245d83fc) + Targets + + 0 1 2 3 + false + + + (0x79a9edeb, 0x245d83fc) + Non Targets + + 4 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Target + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0ea3ceab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x68c7947c, 0x0be24bfd) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x17341935, 0x152ff448) + Matrix + + + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + Output + + + (0x17341935, 0x152ff448) + New output + + + (0x17341935, 0x152ff448) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05ab8e92) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6a466752, 0x377577fa) + DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b1897c) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d82340) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x77b12090, 0x54b29ceb) + Frequency 2 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 14.75 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 15.25 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0x8d21ff41, 0xdf6afe7e) + ${__volatile_ScenarioDir}/configuration/temporal-filter-freq-2.cfg + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02a4db23) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x002085f0, 0x093d76aa) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x6292a294, 0x629905c2) + 0 + + + + (0x04329ceb, 0x2cf6df50) + + (0x4f494c33, 0x2f8af0f0) + 0 + + + (0x3a95d3c2, 0x6a571226) + 0 + + + + (0x04425bf5, 0x3335d8a7) + + (0x68c7947c, 0x0be24bfd) + 3 + + + (0x56fbfd1a, 0x2c474c9e) + 3 + + + + (0x06905dfd, 0x0a12e4a2) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + + (0x093ee378, 0x0cc15dc1) + + (0x08ab469c, 0x10c9257e) + 1 + + + (0x68c7947c, 0x0be24bfd) + 1 + + + + (0x0a82bc9b, 0x3c86bcb2) + + (0x03dba115, 0x4c1f8a3a) + 2 + + + (0x50eef0f8, 0x07c4a998) + 1 + + + + (0x0be130d9, 0x31dafc5b) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40e) + 1 + + + + (0x0c87fc45, 0x0d5aebd7) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40c) + 1 + + + + (0x0fde6938, 0x073faacc) + + (0x4f494c33, 0x2f8af0f2) + 0 + + + (0x415522f9, 0x54a34c1d) + 0 + + + + (0x108f620a, 0x42852322) + + (0x415522f9, 0x54a34c1d) + 0 + + + (0x1300340f, 0x7c5de533) + 0 + + + + (0x1118727e, 0x6f863744) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x617e3b04, 0x389397c3) + 0 + + + + (0x193c114b, 0x342ed15a) + + (0x77b12090, 0x54b29ceb) + 0 + + + (0x2655c041, 0x15f4a40d) + 0 + + + + (0x1c461535, 0x7875bdfc) + + (0x08ab469c, 0x10c9257e) + 0 + + + (0x68c7947c, 0x0be24bfd) + 0 + + + + (0x1cb1dca9, 0x2a29b454) + + (0x50eef0f8, 0x07c4a998) + 1 + + + (0x08ab469c, 0x10c9257e) + 0 + + + + (0x325f4e16, 0x625e47f2) + + (0x5b1d76cb, 0x6835d27c) + 0 + + + (0x2655c041, 0x15f4a40c) + 0 + + + + (0x3462baac, 0x38e87e3d) + + (0x219be4a9, 0x6e609516) + 0 + + + (0x27849ab5, 0x2467a8be) + 0 + + + + (0x36027112, 0x64a902ec) + + (0x27849ab5, 0x2467a8be) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x387c2225, 0x40ad5a27) + + (0x2655c041, 0x15f4a40d) + 0 + + + (0x4f494c33, 0x2f8af0f1) + 0 + + + + (0x3b7312f4, 0x77397f87) + + (0x6a466752, 0x377577fa) + 0 + + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + + (0x3ca3abc4, 0x0a806458) + + (0x4b0bfe3e, 0x2c3a7e5c) + 0 + + + (0x348c88da, 0x652055d3) + 0 + + + + (0x3e008c71, 0x0cd9cd75) + + (0x4f494c33, 0x2f8af0f1) + 0 + + + (0x6a466752, 0x377577fa) + 0 + + + + (0x3f26a677, 0x2c5938b4) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x5b1d76cb, 0x6835d27c) + 0 + + + + (0x40d7538e, 0x517635f8) + + (0x6292a294, 0x629905c2) + 0 + + + (0x2655c041, 0x15f4a40d) + 1 + + + + (0x42167938, 0x4902a522) + + (0x0e30ed60, 0x478cbcea) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x4aa9c16f, 0x348ddb0e) + + (0x2655c041, 0x15f4a40c) + 0 + + + (0x4f494c33, 0x2f8af0f0) + 0 + + + + (0x4cf017e6, 0x6f427a81) + + (0x3a95d3c2, 0x6a571226) + 0 + + + (0x219be4a9, 0x6e609516) + 0 + + + + (0x54945c07, 0x687a21d8) + + (0x617e3b04, 0x389397c3) + 0 + + + (0x2655c041, 0x15f4a40e) + 0 + + + + (0x55200f87, 0x00b3c658) + + (0x68c7947c, 0x0be24bfd) + 2 + + + (0x56fbfd1a, 0x2c474c9e) + 2 + + + + (0x584f1915, 0x72e8000a) + + (0x2655c041, 0x15f4a40e) + 0 + + + (0x4f494c33, 0x2f8af0f2) + 0 + + + + (0x5d5f0c4c, 0x0e749b92) + + (0x1300340f, 0x7c5de533) + 0 + + + (0x0e30ed60, 0x478cbcea) + 0 + + + + (0x6e39519e, 0x1cc44306) + + (0x50eef0f8, 0x07c4a998) + 0 + + + (0x77b12090, 0x54b29ceb) + 0 + + + + (0x72ae14cf, 0x7201ea84) + + (0x68c7947c, 0x0be24bfd) + 1 + + + (0x56fbfd1a, 0x2c474c9e) + 1 + + + + (0x731aa1b4, 0x14c8e6c0) + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x7a1da790, 0x4294f3e2) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x08ab469c, 0x10c9257e) + 1 + + + + (0x7ab00c9e, 0x145c672c) + + (0x348c88da, 0x652055d3) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x7b7335e3, 0x11d94d61) + + (0x03dba115, 0x4c1f8a3a) + 1 + + + (0x50eef0f8, 0x07c4a998) + 0 + + + + + + + (0x1376b5d2, 0x2efa2549) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/scripts/classifier-training-target-separator.lua b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/scripts/classifier-training-target-separator.lua new file mode 100644 index 0000000..8800995 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/scripts/classifier-training-target-separator.lua @@ -0,0 +1,62 @@ + +targets = {} +non_targets = {} +sent_stimulation = 0 + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + -- read the parameters of the box + + s_targets = box:get_setting(2) + + for t in s_targets:gmatch("%d+") do + targets[t + 0] = true + end + + s_non_targets = box:get_setting(3) + + for t in s_non_targets:gmatch("%d+") do + non_targets[t + 0] = true + end + + sent_stimulation = _G[box:get_setting(4)] + +end + +function uninitialize(box) +end + +function process(box) + + finished = false + + while box:keep_processing() and not finished do + + time = box:get_current_time() + + while box:get_stimulation_count(1) > 0 do + + s_code, s_date, s_duration = box:get_stimulation(1, 1) + box:remove_stimulation(1, 1) + + if s_code >= OVTK_StimulationId_Label_00 and s_code <= OVTK_StimulationId_Label_1F then + + received_stimulation = s_code - OVTK_StimulationId_Label_00 + + if targets[received_stimulation] ~= nil then + box:send_stimulation(1, sent_stimulation, time) + elseif non_targets[received_stimulation] ~= nil then + box:send_stimulation(2, sent_stimulation, time) + end + + elseif s_code == OVTK_StimulationId_ExperimentStop then + finished = true + end + end + + box:sleep() + + end + +end diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/README.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/README.txt new file mode 100644 index 0000000..473ac89 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/README.txt @@ -0,0 +1,9 @@ + +Some (toy) materials to test the shrinkage LDA. + +The data were created by createData.R + +Running the example scenarios in Designer should illustrate how the shrinkage LDA behaves better in a situations where there's too few training examples for accurate covariance estimation. + +Todo: proper automatic tests, e.g. verify that accuracy in some real-data scenario stays above a threshold. + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/class1.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/class1.csv new file mode 100644 index 0000000..f8d18a1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/class1.csv @@ -0,0 +1,30 @@ +Time:1x50,End Time,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,Event Id,Event Date,Event Duration +0.1,0.2,-1.77233830755434,-0.236827251592077,1.46919909228546,1.77215815513424,-0.506267686281275,-1.51953712478023,1.21926844675747,-0.591336201883905,0.810793892940092,-0.0478351524521654,-1.07795341398774,1.04901825661264,0.290957678674044,1.13979936881618,0.173211780905492,-0.784805991192958,0.687022984726741,1.27668771671656,-0.477600037966964,1.07180555201423,0.662293452335553,0.72269911407146,-1.02250250717064,-0.528905944325278,3.59972319160266,-0.698655925414516,-0.870816336958357,-1.86830514291458,0.102628294986787,0.730214877977463,1.58392297876495,-0.184792411750226,-0.521677930225734,0.632881884596409,-0.758686850714144,-0.282183317841164,2.01338729793665,0.259570955722691,0.236797786923556,0.0063118555176279,0.341959434312799,0.830818003713969,-0.21410802873012,0.0890005001856433,1.09341162189432,0.346395457608115,-0.139910909240344,-1.67861512918353,-0.43165719962675,1.79020262175456,,, +0.2,0.3,-1.84606867265548,0.391990239663702,0.264997941836784,-1.34722509967576,-1.44756131640788,-1.47073158350782,-0.172875064506289,-0.508381528023055,0.667066261460272,-0.486728966589707,1.35935857182339,0.294102062812508,1.26240447360024,-0.706411886980103,-1.98153732109541,-0.666274660672812,-0.324676533580154,-1.34944985149662,0.642290035316992,-0.0658277874749391,-0.668311724925967,0.377983358583464,-0.0650165799849114,-0.808947051287604,0.378791095274704,-0.438853903495148,0.128720306499055,-0.676193785278865,-0.859260575094699,-0.448409101403276,1.10791246770839,-0.370116295343959,0.962442327287394,1.78727943629502,-0.585974434161261,1.37340523472128,0.478725873282862,-0.285222490010332,-0.344132711407871,-1.39615102264855,-0.041689311831386,0.747850847366967,1.9166268887971,-1.0226763945532,-0.192783789854472,-0.531362953553267,1.05865794858109,-0.505532040344319,0.0629551176360539,-1.15992871917437,,, +0.3,0.4,-2.49332533548487,1.64409749416937,0.285645369721553,-1.14532555306981,-0.367842010009751,0.889564732867821,0.902042445399143,-0.479509583638291,-0.403361444997069,1.02694383797405,-0.848993411267516,-0.975248366803951,-0.268861969752326,1.02713379098879,-1.45754459594992,1.74028420775379,0.98372459913046,0.692933224611794,0.321110966455445,-0.0436112465411973,0.526018910770931,-0.241847911053705,-0.595516014524317,-0.331585203599734,-0.760752181009177,0.206508150525299,-0.394642384347293,0.407995613700545,1.44231841313081,1.49540198041276,0.0215532601393211,-0.775072535037915,1.16103481714688,1.64769834294968,-0.287162546801277,-0.818966182436235,0.70835625526849,-0.669831237747049,-0.434648073958831,-1.01585838221087,-0.395541781732566,0.289189332438686,1.3341684522212,0.0134047395380486,0.773604766122364,0.701127516516158,0.841741052522346,-1.83128613295486,-0.0246511108994746,0.294720307354779,,, +0.4,0.5,-2.52499988807365,0.527501220434984,0.97156939662727,-0.637213490174128,-0.354994075323081,-0.745014144258316,-1.21842947507402,-0.331920661880045,-1.19124415803104,0.975903495573172,-0.249597671810458,-0.00939059557927655,0.844201228502543,1.30277300274817,-1.87865915519727,1.25389747263313,-1.5652198477258,1.04897773099458,0.902064536138848,-1.94163561677897,-1.25107351174543,1.1575206731627,0.547764946794999,0.191380498627734,-0.503248172544535,0.855745482972341,0.442492152610449,1.88240828455809,-1.01801218822784,-0.570930259426521,-0.80063210672233,0.105326611459969,-0.352559624804854,0.123826916309908,0.656982714082648,-1.83943913691478,-0.230713358494733,0.619725768853545,-2.23195126444731,-0.0342518400322894,2.16643862640049,-0.790097359634875,0.73936477715902,0.979025947077225,1.02883817581993,0.191311766158682,3.5125755903309,-0.172830577468843,1.13638386199638,0.449415434248763,,, +0.5,0.6,-2.4371996996854,-0.199762163143325,-1.66412064115944,1.32209383657703,1.78564808467757,-2.4841632180253,-0.0413739866403881,-1.84399075960103,-1.0630168927679,0.747782305764574,-0.59877556126373,1.00517471083475,-0.95820773957635,0.879504473737644,0.446123315813148,-1.96198514565717,-0.0108819510492637,-0.487353380475919,-0.207961619182551,0.0131011081827504,0.828421906272808,-1.20032945601014,0.225538212304263,1.28470060387135,-0.290121102088802,0.412876421212137,-0.763403474395873,0.0401559259511038,-0.314976740657898,0.124394805554818,-1.33184767770709,1.76659175055496,0.213153581937775,-0.124365036113027,0.337072558576539,2.55224327581814,-0.0241814435233937,-0.139778764718498,1.35388309283917,0.487634179934281,-0.709676528019773,-0.681813968533813,-2.29986097092805,-1.46971925217763,-0.725585249890308,0.329178548531522,-0.44558196076003,1.77560311952576,0.49967867998446,-0.530980731671024,,, +0.6,0.7,-1.93849912979167,0.861397778707997,-1.2452326372904,-0.0607259633500062,0.935059706269999,-0.157345974529202,1.36919107938006,-0.259620642461268,0.801260702566358,-1.0722632775712,-0.631842607777485,0.405810093906153,-0.328198810307636,-0.812771037789669,-0.792895889997469,-0.0679581527852328,0.771611375578924,1.35400923122275,2.89965611507454,-1.73827174484685,0.00346343909790884,0.796031396687008,1.87566288659025,1.01633163119628,2.29403948090692,0.629757373786624,0.792443385689405,0.895193616699357,-0.673182057230165,-0.26435621334367,-1.06300665789059,-0.292767792806413,1.33312025105921,-0.872720812321334,0.819544696704868,1.28201785161169,0.393992181070491,-0.77442908477424,-2.44049053359049,0.858494129344435,-0.25023526774339,-0.0618877341108,-0.988740291550961,-0.0739872230807312,-0.552534738897729,-1.62200295119109,-0.0880826904503559,-0.664695381005107,0.355978324679464,0.927432000495081,,, +0.7,0.8,-3.34684672140526,-1.26497793354093,-1.16666704428218,-0.780385840997041,0.0470739145971587,-0.605642340825465,0.945587408381604,-1.18126075190584,2.20328717668555,-0.531089179504808,0.201762811766242,-0.584209829626112,0.989899029221811,-0.212533541879578,1.44148304883411,0.00429125290958928,-0.21688568091344,0.909911885569311,-0.533485924810609,-0.220018565796853,-1.33429944720633,1.93287125392024,0.981381645673963,-0.466938397358383,0.170148127053635,-0.27938724823399,-0.778711059848325,-0.32886669555033,-1.06135570930341,1.13476644789916,0.733578755479842,-0.542526637610404,-0.224990428177821,-0.267924453922976,-1.08670312862221,-0.119159342356234,-0.142084166616695,-0.814458646531745,-0.235567135467998,-1.2732800223355,0.285530058673434,-0.483299969473905,0.855165375924984,-0.602204571777015,0.583407634150875,-0.411289622327927,-0.12665450861076,-2.03830175110953,-0.112053964894063,-0.827535602476982,,, +0.8,0.9,-3.55989888905074,-0.634059705872217,-0.558120631489627,-0.0418754010266019,1.28680024265942,1.21221922245683,-0.611048728676769,0.957834760817381,-0.844482328959705,0.766673075055981,-0.030934714413184,0.0362884816349346,0.983046328277927,-1.11364782712676,-0.510890038959101,-0.791997369952067,0.0593454735299368,1.06352039878449,0.140439522991638,-1.59429902500644,0.434101232678913,1.38726371611854,1.23211248454009,-1.90705039732404,-1.61529765128843,-1.67728770168705,-0.173536259867967,1.1394470025958,-0.94668039917753,-0.159478059315696,1.18481106763709,0.509593145230726,0.223848028545494,-0.888110063272082,2.18764575481975,1.96946486165186,2.09662648828097,1.7941254408658,1.19925480288416,-0.618560083251035,0.212357198789346,0.0641730637906699,0.292256698626024,-0.370664045570373,0.135009399239684,-2.27491997321184,0.143495396810159,0.262601199604499,0.201438823482189,-0.35520204591383,,, +0.9,1.0,-4.44774030679586,-1.11275749388428,0.507366692631453,0.468550525914631,0.843409924450063,0.414280505855425,0.367914640879673,-0.0577851382478128,-1.22726870960233,-1.09819710691446,-0.464505901680104,1.84871519571589,0.265276441889633,-1.31158079172016,0.712224135204576,0.100510353152504,-0.643517623763363,-0.951878314639593,0.350363706301863,-0.976652062169023,0.475285596160765,-0.79133848742369,-0.0150662484609962,-0.801567753668075,1.40360526910113,-0.585922680523054,-0.354246667522073,1.05968312635924,-0.478696160094725,-1.18762712568568,0.13032251587019,-1.31338117331829,-1.37683533578805,-0.415242723427493,0.287002767287016,0.519446561615298,0.507784977222456,-1.21775283862233,0.596969584534787,-1.09103745197065,-0.188026141054213,-0.539574607790159,-0.0267049724022197,0.985234967105008,-0.0121637953667821,-0.289343790077273,0.327801788546679,0.699013959334725,1.0507772042841,1.06381547894067,,, +1.0,1.1,-3.09909090168284,-0.359659659892329,-0.12749543385773,0.0622887876624331,-0.860619457274199,0.432094735622488,-0.609981669720907,0.0639099707864614,0.71775040542059,-2.24915557008654,-0.165856156539402,-0.950303021513061,0.0656750471171471,0.758981750209037,0.948229456853139,0.122742557170879,-1.30170649111395,-0.117717471446721,2.31892773448122,0.496869451937333,0.0631715517104231,-1.04088228315997,0.348651895145636,0.277377856805705,-0.527340753898461,-0.96188662382932,-0.736239266993153,-1.63835364530386,-0.0719209782666559,0.970770321960414,0.274203363515058,-0.284515346876542,-1.24310305588837,-0.815182204543421,1.29841206516442,2.25762754300289,-1.33797487751071,-2.39232726554899,0.0602891581081039,-0.632722864132576,-0.381380674267328,1.08467301597097,0.343659227147748,0.896896049042744,-1.46506091422012,-0.41763537978796,0.191286527582262,-0.468464363834216,-1.09892741923733,-0.391740225452495,,, +1.1,1.2,-3.23802049326389,1.74596554721976,-0.499540280575761,-0.843266359194183,0.573232774026051,-0.713900576181787,-1.01901854468152,0.145538742231609,1.36825506560525,0.249028977435512,-2.46295229308899,1.66652457591327,-0.198615690717076,-0.263385204486557,-1.10521035548769,-0.734121299064804,-0.0229783754545948,0.0506840308453182,0.0113112445149267,-0.232951781013076,0.8133440309898,0.788243285045267,-0.356270965183636,1.292547804447,0.0646992755668471,-1.18031609339379,-0.980296876246065,0.256282517705126,0.803914801562479,-0.751495033745804,0.981149907729045,-0.218071038366991,0.665941831057366,-1.29621525136853,-1.1315337185554,0.67324249885459,0.331420850707798,0.853789310822153,-0.387209285971316,-0.0617473807402586,-1.93892715623836,-1.79489758161487,-0.47320101114311,-0.96654353623563,-1.2562143127768,-0.0014335058494865,-0.670128660468449,1.98605312333715,0.155033281607601,0.44551846807408,,, +1.2,1.3,-0.971273433953891,-0.868345934416637,0.525360395096701,-0.232597422322256,-1.49601379893642,-2.52908668132291,0.291107229457754,0.216753524716416,-0.961402923979911,0.232884908650992,1.33497405956156,0.185974162869079,1.0819664783459,-0.683211977341269,-0.0934249609722174,-1.94210519332242,0.876783253159539,-1.27882840637407,2.03294200453347,0.286838582976075,1.42283712316724,-0.323100316805324,0.201814501530754,-0.898363784626655,-0.522562418589968,1.41867825157879,-0.974730135201073,-1.11760089937304,0.824620917859167,-0.423862364857514,-0.619400480877842,-0.529399534279475,0.991986600554311,0.583331428519991,-0.211006241723627,0.821435708131965,0.138342791590999,-0.403542777463114,1.06464765714606,-0.789060097014565,-0.102395197252538,-0.552297480477896,0.259669506929517,1.00031484962009,1.25326497422323,-0.741706107221702,0.716317949428723,0.638207825629194,1.28595639165337,0.0879702349290783,,, +1.3,1.4,-2.86248692076582,0.347890538416066,-1.27278549801312,-0.291262617102902,2.36838805394921,0.464807495400011,1.08687090634751,1.7832729004785,0.727591185856305,1.00011602975499,-0.197069897467726,-1.59253654229969,-1.64298561684632,1.49831743106751,-0.597772192484045,0.534515335680498,0.0147234393366317,0.205012890150111,-0.559613169455437,-1.27252520194646,-0.105259587819075,0.49919375150749,-0.0593172762281228,-1.2613346568111,-0.706536925074285,0.589008747567681,-1.82492862669336,1.02376845413314,-1.23239646747825,0.543736988061945,-1.00654350266696,-2.77981804434358,0.152840164690063,-0.569119801165209,-1.4765816373035,-0.836364979594367,0.947475048136282,-0.124377979840782,-0.56598077703248,0.640581016214566,1.05668713246614,1.17188350874907,-0.455197255050525,-1.08127895925572,-1.39520562119579,1.71350013442997,0.169194774895656,-1.74996304423433,-0.559784363697703,-2.41031769108155,,, +1.4,1.5,-1.61101017216006,-0.933884563317575,1.77639273280316,-1.22203590775144,0.173117535987142,0.130395618992478,-0.229938731031663,-0.828432541105236,-0.65746443653727,-0.296129659235114,0.162498175403568,1.29392008320793,1.29282600686564,-0.896980042419235,0.507126153194601,0.203043147539653,0.0262655034896133,-0.726980024285828,-0.471118173096727,0.578424279342402,-0.494577652134584,0.585113326390058,0.266905931745185,1.06619468640444,-0.226461756216445,0.153805224449896,0.884667797835743,-0.73145034358127,0.883383448678899,-0.245424268895577,1.21322261487307,-0.612067222292678,1.13627205183641,0.663131024262672,-0.189002307247342,1.53096473041284,-0.240151295433385,1.63123088303574,0.823185628496508,0.563026841296833,1.7121295131197,1.74225139594617,0.273741789403298,-1.21564752302175,-0.394465389843137,0.27139832154876,0.0079851620072709,0.673908463250784,0.581259050717442,0.239130338326016,,, +1.5,1.6,-1.47427082496119,0.880755954362544,0.742140486863105,-0.679923565750302,2.23474813364379,0.0831968758265776,0.921053927597004,-0.336904428023005,0.231647401537525,2.24282268035046,-0.201960134649665,1.05175879662423,0.934015462626019,-0.277109705767538,-0.92559175175182,-0.688993962906492,1.34672176799686,0.101930814133559,-0.875125700863262,-1.1427133721363,-0.0724775204102265,0.265296514759947,-0.112800263354246,0.34020759264344,-1.73072177388175,1.63516677283923,0.432011635283091,2.96879223508065,-0.230962539625279,0.318801361467567,-0.442616565484198,0.418444835558832,-0.657491006481548,-0.745899492310761,0.336188254349959,0.15854548301566,0.326894288956611,-0.251516391189098,-0.313611323506182,0.508390499905596,-0.352375131081077,-0.166613664863456,-0.435997664997284,-0.963397485442238,-0.395454331546453,-2.35273763662371,0.107904851761832,-0.760076049292479,0.516168120330722,1.2123522342855,,, +1.6,1.7,-2.09878977951197,0.639592539001515,0.160859420829667,-0.68061632337174,-1.73228975812342,0.664737146144949,-0.644974944394484,-0.811542394703354,-1.37945183248634,1.75860825213751,0.916485573328238,0.81897185806978,-0.693589826320362,0.681099395272082,-0.289784693839316,2.14907331402146,2.84667680062198,-0.714098980306512,1.64022490599201,-0.274462053774466,-0.172631276449679,-2.62301402007093,-0.665881807160798,0.610794240026294,-0.766810027481317,-1.19704396547744,-0.964983796291884,-0.192824843413811,0.098091768309394,1.00785659850046,0.463936909180991,-1.17757024503215,0.0443283083305587,1.28602855352551,-0.377532722965945,0.247163046230049,-0.383194459654412,0.404788347682512,-2.13005637167212,-2.18846271817293,2.02469036169784,0.338833981163382,-0.193979627063926,-0.142272817736529,-0.0790912393453113,0.710852443746004,2.08857309582745,-2.55286755746463,-0.421403230578765,0.467182390084249,,, +1.7,1.8,1.00925391275254,1.37474656008589,-0.0090970278399998,-0.346412275426031,0.960628573252543,1.07715536792327,-2.00475436597727,-1.56685475297392,0.527744554627656,0.350121171283212,-1.20761742136517,-0.640978005425133,0.976684464214235,0.136880206616241,0.419116030133855,-1.23663547845226,0.494175779354801,-1.60180256913862,1.00282279389971,-1.09222642056937,-0.676949249802419,-0.856909319000302,0.584890561606453,0.320699369767227,0.420736666081711,0.145759861726765,-0.696584372073265,2.59648777138279,0.80272534126436,0.91425151103223,1.75310992646248,0.0157181701985221,1.14176165460167,0.057867979669775,0.907452340987986,0.541366292230641,-1.20531301851502,0.523890687372466,-0.690749190269591,0.86128754855452,0.937471982293557,-0.76863066919468,0.390041647440194,0.377747647050882,-0.0925261167039724,-1.45200143918822,0.0588267317099769,1.00687365185681,1.30765171155742,-0.669801305308203,,, +1.8,1.9,-1.449594453978,1.17139932899863,0.0750821226143516,0.402334066842221,-0.434053740121578,1.46229623677783,-0.40822810695267,-0.200212655188883,-1.41941880026543,-0.0947556282723024,0.878117342976929,-1.67925230891458,0.964932430177351,0.105044968428406,-0.163666571018362,0.315634284221749,0.595423854338757,-0.558239445944123,0.748599974931374,-0.143875921205212,-0.298259487797806,1.61886661049491,1.69376135816157,-0.081411744009167,-0.589388792134599,0.326106176383826,-1.84071182220167,-0.544133226268706,-1.00339762061913,-1.77315717289631,-2.09299090118694,-0.0907615334930632,0.105712304395261,-2.43334806412051,2.08155204494469,0.486160023717119,0.822201198399303,-0.718711825930808,0.688447292167804,1.16279100339109,-1.48346426111682,-0.483079916972782,0.900034333224391,-0.458946285539368,-0.570485909385145,0.064255910039447,-0.746295416149551,1.40704506258393,-0.0337277371081988,-0.376358937143787,,, +1.9,2.0,-1.85125066455972,0.66028943384553,0.0139229187456611,0.0104477116502975,-0.717761311325679,-0.077370000264326,0.141068435366493,-1.14732631185047,0.547388940976638,-1.69487405911705,0.875876393720465,0.65637835416811,-1.16189641270829,-1.45244309288448,-1.07714046115485,-1.8495144551776,-1.27563561931607,-1.7835008631496,2.26131600509309,-0.215594069788061,0.660982537636236,0.507831783381489,0.0756562183288402,0.0303060196596953,-0.251522354647413,1.9035082759663,0.679440511558685,-0.120825055617998,1.57153193878004,-0.674754137724121,-0.685970198592187,0.48160460978278,-0.675817358494143,-0.757187469307967,1.64516172371811,0.0328976045088034,-1.85362372620806,0.157436894672794,0.50208354031508,0.241095341962767,-0.118239094477677,1.18842861973302,-0.126251241771557,-1.38899127317018,0.408141933895154,-0.404688150439642,-1.0048437133398,0.748231276199803,0.837737301889623,-0.560698942261964,,, +2.0,2.1,-1.60601535923233,0.669143816704662,0.143810896251667,-0.815482700549905,1.45004996217576,1.48594020039215,-0.0267442432670983,0.549738822168395,0.136195893534055,1.76053186383306,-0.250904539200862,0.414756564478482,-0.437014625251531,-1.21508289877814,0.729413806183881,0.646634130867828,2.12882757172237,-1.20727255876545,-0.290014674271168,0.625562846141297,-0.142092235155255,1.13604222523948,-0.472366514145488,-0.536686593371494,-0.765157580097147,-0.354361814801958,0.392700341865491,-1.13375277944537,-0.57922946388263,-1.17090850044028,-0.403554130111788,1.98681181743454,1.83226342549388,0.330101205662862,0.918958964478383,-0.230415239782638,-1.05825458415651,0.440372530007424,-1.81209642037741,0.621457180575732,-0.522960148313009,-0.473494045615778,-0.150850398309924,-1.87121101604963,-0.194111875340998,-1.08040209110534,-1.99421926943775,-1.06970982913185,0.38256984977095,-0.499435538752386,,, +2.1,2.2,-1.37691918932328,-1.88854092758226,-1.01045232254161,-2.46073542709708,2.96314659086332,-1.40812220494217,0.700873530768047,-0.569588091543524,0.910217643518832,-0.00505673948620012,-0.860408038052145,0.0699061321527326,-1.0887764238652,0.89234390981033,-1.844415455218,-0.0949612097519673,0.429075075031871,-0.0861284502880812,0.718162675940565,-1.65893736229242,-0.0504488664062409,-0.293958967283765,0.729135489869696,0.121905982046074,-1.11866670633372,0.719576754670144,0.131709051338085,-0.515902505202922,-0.0788055596524318,0.89294545648814,-1.41054922202298,-0.397909765898704,0.985505790375688,-1.22365632525866,-2.50174502444724,0.557537529414053,0.638935746143102,1.39907915785192,0.766138588211053,-1.39238254210462,-1.08607601020725,0.779388358390366,-2.17603247266285,-0.480889968851674,-2.38613179112004,-1.83628807369454,-0.961519057282883,1.68374338449346,2.1145273233512,-0.597602227196933,,, +2.2,2.3,-0.38485346976322,1.71441742542603,0.862630467549317,-0.38033261179794,-0.489618746025318,0.0591983154344916,-0.596753298343392,0.72371617762678,0.307130803493028,0.229723466533615,1.36217923270807,-0.0976142284614124,-0.516148530800558,0.180752605358601,-0.826935513982694,0.364143346070747,2.55486560475664,0.453046914065365,0.701704298729262,-0.235450982734894,-1.0940257936463,-0.500459110672278,0.728549142164805,1.55433138279028,0.432181919838667,0.225275871831435,-0.560135650986184,-0.231570867766364,-0.885142044952308,-0.558604971294484,-1.82459833477448,0.152679415051044,-0.125541765002843,-1.44085634510553,0.87827690281758,1.03732438955034,-1.05131048011142,-0.273626319864078,0.398383142429682,1.24853761129889,-0.23406343149014,0.730678604180361,0.225644042490417,1.15011530488428,0.306140418894449,-0.764800139388062,-0.924377070043919,-0.906311349980566,0.154097326038458,2.04525910094737,,, +2.3,2.4,-1.28953743425881,0.593602699110775,2.28235083814812,1.89089006844817,1.41913375564524,-0.0376542089295913,0.959291492150015,0.800192364266494,-0.495746741284409,-0.98359094713131,0.199432824975916,-0.697445523136789,-0.0798953477697274,-0.612534884940749,0.443031050594771,-0.845466308111129,0.304773223207354,1.20220052501968,-1.41724461142755,-0.535825571756851,-0.139249120602771,0.743431046015611,0.291707162253733,0.407436706748691,-2.45042392696164,0.66568793227417,1.98724448888319,-0.242180462441927,-1.29080554014862,-1.7644259703506,-0.226250118490315,-0.286473135967021,0.87066607626009,-0.0454371001278132,-0.717027434930964,-2.35620436046941,-1.28761888215381,1.43827166511107,0.854679947898158,0.242906490252199,-0.252577293411509,-1.2014577983329,0.342176439541731,0.581907722507583,-0.309393537463487,0.247393152243891,-2.28076596723148,-2.33534043885578,-0.211655718745541,1.54353757434573,,, +2.4,2.5,-0.653467900262419,-0.4963479578044,1.34873552106367,0.140149504864691,0.497634043092993,0.982318308333538,-0.826889515884245,0.617397236813882,-0.910038168697828,-0.107244212651211,-0.119806078457305,0.598141199247828,0.147492056696988,-0.276606629015641,0.535388471247822,-2.06786965619509,0.925946856266965,1.40859693946566,-0.806256213703648,0.697914132932985,1.98377488724377,1.3529800010859,0.851109881666436,-0.187952626360489,-0.823303448246129,0.570003128501322,-0.272345848190497,-0.218644079368752,0.296511558256157,0.945466889273468,-1.41315823448521,0.787752559162959,0.0868721808757943,0.25469902919241,0.850835715705959,0.692932459340385,1.32808310265405,2.16679915504799,0.820491555238031,0.354603164292584,0.917115025480176,1.25492386535447,-0.40484396218625,0.441931463949241,-1.25163888923188,-1.02571105855879,1.2985824606236,-1.06012379597561,0.505781873560172,1.31644108760808,,, +2.5,2.6,-1.54163213914593,0.485718053589599,-1.52127302211832,-0.186093807125215,1.2385646382438,1.68353722385926,-1.34629358758577,2.39226430970994,-1.46624078818285,-1.38239862125204,0.838861770549575,-0.778476350568663,0.594631532225217,0.940078976781259,-0.502948166867935,-1.07483152075934,0.224941156270868,0.787674340996857,-1.879681953764,-0.0952589756004587,1.64347220367494,-1.29972845714763,-0.675189839885044,1.71339294384532,-1.6327536941499,-0.639897645620297,1.75141899880403,0.587444804993354,1.39107000629944,0.146981604351645,0.625188076694792,0.212038108387411,0.792899026779549,-0.698394053222702,1.74301239955783,0.692738384625026,-0.216369491109795,0.489231855098492,-0.573088134753217,-0.233511723120165,-1.50575411603236,0.130816691092331,0.538649062428657,-2.06428227766601,-0.513328244956785,-0.652124424972041,0.725442646365652,-2.19521189057892,0.767383981948306,0.518928362028896,,, +2.6,2.7,-0.404164810533275,0.102274692088978,-1.08449618505089,2.09120909855889,-1.11917775235596,1.45097833771738,0.472911649999107,-0.828369240740054,0.785002577610665,0.414678613589617,0.199880405625152,-0.459821332878392,-0.909044084453528,-0.20578644825676,-0.341583188023587,0.782588866071394,-1.00847019061368,-0.691400981543019,-0.936096623208734,1.76530172830329,-0.501773287936934,-0.59919079156968,-0.065960895964635,0.956384308331524,0.671657382647727,1.68458953985207,0.0578286678859909,1.51891459959947,-0.544925308287521,-0.997252253975146,-0.89037363257251,1.36046314798829,-1.2793402221833,0.968538961419931,0.339608576710708,0.521992311995813,-0.257562532745493,-1.53988194336016,0.0644864952819011,-1.05527339556824,-0.565676268382917,1.20003602131403,-1.89571329172304,-1.98168191343,-0.593378676096049,1.27445879451447,0.862152277941382,0.0328038178449537,-1.43096570122999,-1.36017771437072,,, +2.7,2.8,-3.56797705751825,1.09881194979225,-1.16831493597144,0.520983425027833,1.66749976766568,-0.0712834678280598,-0.638360247864907,-1.08051765792604,0.410719825157519,0.557510193799553,-0.511652979040744,0.995594990713032,0.816075238131488,0.88144246148645,-1.01680198833235,0.346174298538861,1.96905166966619,-0.735663903508833,2.32584847448696,-0.645145416990287,-0.84755524555166,-0.0284009610648053,1.21701891050411,1.88489226576535,-0.921828385172571,0.885798458807903,2.63083698314068,0.302745787563594,-1.42894475273606,-1.15584495989824,-0.100107869379229,-0.575279817044032,-0.314382673734126,-0.846617862679996,1.53277218248083,-0.66636411626898,-1.33864745977004,-0.72607207779172,-1.2987258124462,0.991971138905104,0.234719066783197,-1.42403749517274,-0.280562003087986,-0.240745897998986,-0.201106126547365,-0.0904003897201168,0.826545621980961,-1.2922743016258,-0.837884142081378,0.64380255904924,,, +2.8,2.9,-0.988262968181082,0.418037719544605,1.04568410951798,-0.318713751270629,0.0188084459047177,0.96559234262152,0.334954418508725,-0.898917032840481,-0.638666684250415,0.180112703828211,2.00537827140566,1.390614788546,-0.943091895589548,0.933749406472778,0.448753970569277,1.34981987477594,0.951964997738819,-2.3005656213913,2.46873873656557,-0.70411151718615,-1.17081741958248,-1.30309836890683,0.497336105348077,2.19835328570869,0.276001894721499,1.190950526532,-0.763423017036248,-1.2560434290105,1.79284551512437,-0.312315924182818,-0.740192502628443,-0.847316266032773,-0.582484908106787,-0.319241508047501,-0.181283696126251,0.850896972462388,2.38909196491941,0.409117949690621,-0.881198976461458,-0.90303180161685,-0.334475351110278,0.586634767430369,-0.874811521187844,0.621486109769527,0.584669008122476,-0.744766894881111,-0.864900302918206,1.34009908917876,-1.02186219137494,0.392832361133756,,, +2.9,3.0,-1.61005461936525,-1.1498200138669,0.121323143019759,-1.55103143054491,-1.00079445648052,1.67717800323898,0.262355004435243,0.475624933029085,-0.0267365775761464,1.64952299721817,0.965516586287597,-1.18419488848939,2.25378360734499,-0.922028013165381,-0.64637684456314,-0.990505334606425,-0.124163448381048,-1.69486189330993,0.271925005428862,1.22873770978493,0.305907426366617,0.875467367403968,0.588791614961203,0.427098588933039,-1.15696099332683,-0.346455014574285,-0.830310509840663,0.754478112837592,1.07622127929693,-0.52791318770056,1.36584478582221,0.0698614444643175,0.107833627896301,0.187859731925132,1.3713634192136,-2.16969187615497,-0.0230684927188355,0.524184182040186,0.860954882028488,-0.683571728503834,0.712840566573534,0.314542576183367,0.644421820807391,-1.15144187414628,-1.68359919846919,0.304745480696108,1.15615485096293,-1.24076669807937,-0.451694284250098,-0.785002603819057,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/class1rot.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/class1rot.csv new file mode 100644 index 0000000..e9d9686 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/class1rot.csv @@ -0,0 +1,30 @@ +Time:1x50,End Time,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,Event Id,Event Date,Event Duration +0.1,0.2,-2.8105715330572,1.97044458445776,-2.25117345900302,-2.77675325596564,-4.22282858289576,-0.728730107287751,-0.131732851290365,3.23812046801923,1.87194312096294,0.0509042820995466,-2.90935563390039,3.43795625693612,-1.32743202763949,3.8467147199148,-1.82018863917555,-1.36195423261369,0.593938250540402,-2.54952409351015,-0.175868239114684,0.50401883279692,-0.716112709508492,-4.10682380182668,0.0882455175640278,1.570217526566,1.6746016187139,2.13928318875744,0.132878113953894,4.41237860071733,2.3168155047397,-2.21781976501155,-2.44112900600351,-0.104452294200763,-0.773750302848905,1.65799007451332,-4.54910403234098,-3.18987869603497,-0.643838919963144,6.03278566607531,3.81082112670311,1.52019407424606,-1.66503431554912,-4.67716077003471,-0.307195357516731,-2.79758638051557,1.35403525166371,1.41842144044514,1.59365203345603,-3.91180899655509,2.61716637984177,2.7363702888213,,, +0.2,0.3,2.25856479866076,-3.49853226072837,-0.204747634265671,-3.123651935946,1.32269874452053,-0.045246441431997,0.826989491779179,3.57231405076905,0.157685681320851,-0.785867067767291,3.98778104233212,0.47721614309732,-0.273763205878514,0.824947712507762,-0.727107039939137,0.509710542052856,0.432551955289065,1.53328644287134,-2.2172295385466,-1.14765359725631,0.185969502641448,-2.39861199956817,1.38897527789934,2.06245070219219,1.80779257171327,-1.93473494853549,-1.98187339671248,-4.30650653667619,2.45822371424924,-1.3921074151963,0.0372807168892847,0.246795943961955,-1.29489560034757,-2.98251767778177,1.0344437952679,4.48603532474317,-1.72960192058539,0.461554531572219,0.721970839888233,-1.02068312273811,0.963181417175223,-3.79292757071271,0.761099359957011,-1.55491887600319,-0.452570408436559,-0.146906581768742,-1.93106207104724,-0.457600143698669,1.07622796765881,-0.554860828645116,,, +0.3,0.4,3.98271705203809,-2.19811608631682,-2.1272346934832,-4.15505507189997,-1.06351972345606,0.156350653104381,3.10390611504748,3.4577709548516,1.36596164016536,-0.876084740407852,2.03353697983148,1.6203122010471,-2.20077388312022,1.81588733006304,-1.1236658015585,1.74698940603952,1.41380534324175,-1.03472179830907,-5.01422644462888,-2.34951517958835,3.66846562862928,-1.64138661588594,-0.389487814237493,-0.77351281712287,-2.13397549783302,-2.21313548827122,1.89385059590299,-2.62307428860125,2.33581002613165,-0.683017994176775,2.30054191521104,-0.993874634899022,-1.23055222002998,-4.84295369928031,1.50317829886755,0.797955787551626,-2.91779452963703,2.18382394900967,-0.211129040842678,-2.20480379998498,1.05807079707262,0.442964608661533,-0.894842081976626,-1.68766394511601,0.636103400816211,2.05854951816596,1.19045045798009,-2.11288470560948,-3.0233443960854,-2.23276966075083,,, +0.4,0.5,-1.17123394261144,1.56266409361991,-5.75684621310878,-3.27311883849878,-1.49936701447769,1.67428766519967,-0.751928437348566,-1.59207698422662,-0.913676313905993,-5.80665618290006,-1.31335302117651,-6.08103845207449,0.883650223159432,-1.44746163612749,-0.984476573506612,1.90935067132634,0.547599462132903,-1.35089088234226,-1.18914071103552,-1.23626613899387,0.540308505900391,-1.5652666538784,3.10367078122746,1.27949840246372,-0.725315728611452,4.41371403560844,-0.0941457384539908,-5.60478407683596,0.266378731150281,1.8900311024272,-0.941983647969998,2.26301522311613,1.2668601814492,0.533375859527004,0.713642842458907,2.84239664303946,2.0904637170955,2.99967287920232,-0.061431830618343,-2.49172764650727,-0.44792560342362,-1.50500892753702,3.29497898594663,1.33328104708473,1.38389613749,-2.36872695837441,1.95739718108967,0.112831906968402,0.0875822236921859,-1.26059900856129,,, +0.5,0.6,-0.691247835099285,0.35996239578975,3.72856536111607,1.3095821399835,-0.192335263199433,-1.74440017537381,-5.2325370637816,-4.5354085867458,-0.289846498200247,2.75928482075316,-3.81463586270434,0.238113238131077,-2.94192509811481,-1.14056121237894,2.4696485347111,-3.55346297492856,-2.77505338982254,0.377538094414719,2.04356990495184,-0.476353207374357,2.06180654461382,0.785941061962911,4.16103196784365,0.649447629480342,4.55573479309417,-0.70719113064945,-1.16211165037149,2.14789207417241,-4.26600318248493,-3.08023629234495,-1.72775893942949,1.0349789891197,2.25218453237596,0.568962494959985,0.204608890163155,-3.8260925894879,4.2583197972008,-2.03384851730742,-0.7835817765404,-0.947556618147915,-1.76778945090148,0.12159982825841,-2.75734737864209,3.17774885950749,2.41334219641258,-6.06417185221909,-1.8454115223381,1.65243260991619,1.13925836274113,3.11635886675106,,, +0.6,0.7,-0.75469594624195,0.277343480909411,-3.1636484573233,0.269002296814459,1.23823363844859,0.0930367535985796,-3.9845686942331,0.99730312897028,0.174687065123597,-1.38723558312686,-3.15866226239419,-0.111147547774084,-0.646508789590673,3.26908929138036,-2.10374571303398,-0.129499535867985,0.00920667326941993,1.8441735131152,-1.16913550437466,1.48330673764097,2.54663374176198,2.57550509917293,2.49665653618342,-2.02027283311533,2.68460899674504,1.77754912007238,2.1977518373163,-0.756515811157936,-0.752451827155607,0.778742298490477,-5.00762792946691,0.236043923049721,4.27956735453061,-2.41057475241384,-0.768662997319675,-2.04401085234801,2.75855960423778,-0.340242190891457,1.82678981424863,2.20565473039744,-2.96994068191173,-3.62966732095131,-2.76300680262596,-0.815348420401293,0.996291282202418,-5.08422721374475,2.75835523156865,-2.59055871406729,1.54681587683948,-0.6755499067224,,, +0.7,0.8,0.65651046080783,-0.426811813020632,-1.27303253891505,-3.00885024186743,-1.1946822047483,2.029884867178,-1.78260059201804,1.31070297837884,0.858616942720236,1.27851484579747,-0.088707743833295,-0.0913789344242943,1.15074849398106,2.79518758083919,-3.41755619582524,0.912217609339767,1.52089973412281,1.48236340692864,-1.98030834507565,-1.49778400009765,4.09357289038769,0.503035444580094,-1.08678696370095,-0.900368815495746,-0.66528273447498,-1.02244076034782,-0.684245024852757,1.35853819221209,1.28055291730888,0.17381734572867,-5.72824052807078,-1.51247653309703,2.51443335786332,-1.67631850267937,0.304470774157041,0.291468141091596,0.159318948794085,1.46952680188977,-0.430479543495719,-1.43442327098508,-2.53171639182582,-1.50103059883364,2.80143890875172,-1.23149564747545,-0.200945108374293,-1.47865850182882,3.40999800364323,-0.189847162108051,1.31516281465757,1.86243645208503,,, +0.8,0.9,1.46460867610958,-1.49477111598966,-1.97071051223149,3.34503243843136,0.216045380474084,-1.38054836097643,-1.18926155021276,1.58280716598142,-3.2522551983989,-1.33570609580013,-0.199585777875705,1.30739319220861,1.22307437656635,1.28456382308241,-0.725947804108099,3.31571671019217,-1.22737032728076,-0.868881508621964,-1.2422592721294,-3.28637889860691,2.14064522726149,1.57975502572686,2.15190758666344,4.82350344346956,1.82477255827722,-2.57428674502732,1.61505914955868,0.312213335313871,-1.49465280461993,3.34818297213971,-4.75605714075815,-0.0404034610890573,4.0977040381511,-3.51520295138231,1.79291040966315,3.20783033440413,0.15782207398605,1.61426471927668,-2.24059831228095,-0.496650417379842,-3.0925896828248,-2.66799338104973,1.13571372821778,-0.950916872411329,-2.95087780744659,-2.17630449777817,0.70079437125197,0.534384220843388,3.35852849234982,-0.608448198074922,,, +0.9,1.0,1.54648622091098,0.610416710732742,-0.655157807669775,-1.8563415221732,1.20697381422682,2.4480340290493,-0.907959644908824,0.129307677878469,-0.485060975837386,2.1272760657214,-0.206233760269315,-2.88013869657892,-3.59465500044503,3.63597265491814,2.55951651783495,2.52421128422679,-1.06147013867897,-0.116388265092203,-1.90813701607482,-2.67647157136635,1.58848760158363,-1.99741579574876,3.10060717795274,3.75032660151804,2.1853235444508,2.88227131411482,-1.77009490361947,0.955234614316146,-2.1212687388531,-0.144629256010725,-2.99577734771928,-0.941715199200326,4.86893875570262,-2.29249542879953,0.387089555877114,-0.152259516980132,-2.34828961030103,0.447723687352788,-1.47945473788336,-1.16806190686824,-3.10152625351283,1.35588786835852,-0.0672166407663362,1.14045322745097,0.949832763087217,0.134050690965881,1.13113588581846,3.26950687798222,1.46910013398604,2.88185352313814,,, +1.0,1.1,0.412548674966722,-1.75352041257501,-1.21841087637463,-0.00210429161672981,2.29633195111569,2.20448449548543,0.580557159447253,0.678191658712035,0.730977484381622,0.685330294197169,1.27484902309455,0.353892132669408,-3.70642431577221,3.86252449424315,1.05600212010077,1.01293777656738,1.76203544350132,-0.628319406461999,1.02450800039242,-3.22326390613028,5.85097588704723,0.537030130000432,0.837903044217678,-1.39299644137185,-1.69305324354949,-0.221998000343763,-3.72463422965969,0.630340258140646,-3.44505148366852,-3.77203469072097,-5.58125415389162,-3.45229159846523,0.29308788400517,-2.86879803398118,4.50973229119948,-0.905414610529336,-3.43044863553659,-0.699749644515564,-4.29491049577396,-0.9266611339983,-0.443119083279365,-0.196604547740539,1.76413028876312,3.80476887958539,-2.34947666703353,-0.621479397013964,0.462227210772041,2.70108740966535,-0.724827507896309,2.39883673765848,,, +1.1,1.2,1.7158474115172,-1.11407359505675,-0.867814052370603,-0.185779264871818,-4.48822812275538,-2.56596517645758,-5.63320279778413,-0.338065796354731,1.58715856491674,-0.919645420360434,1.83921061064595,0.341252980343316,-2.02140258523139,0.265722874969387,1.87576029732289,1.35709498003436,-0.474780548059455,0.0639095616887276,-2.14450483371912,-1.11734898176555,3.16152385534152,-2.20181856663677,0.244723112338881,2.37250829851378,-0.835498556833158,0.109746453938632,-2.69948485904786,2.52241582576951,-4.10300368587047,-1.7082843774407,-2.43644996269643,-2.53281845444085,1.92051391993592,-0.0765474035060689,1.60287818999326,-0.484901720024071,3.75083238626015,1.14727072767643,-0.0301685611034201,-1.66854303056552,-5.52581959182569,-3.03478842787926,-1.44016366655733,0.898863931163821,0.150936913411882,-2.84415766058223,1.41309641807674,-2.19249169987643,-0.62988660432605,4.5278577326279,,, +1.2,1.3,2.83869893875188,-4.10907238130391,2.09574727390126,0.606857359697584,3.49239284220778,3.30456550602594,0.546672902910804,-1.44254872491866,1.24184645982262,1.44693360483477,0.599338208233538,1.57645377635247,-2.50143646969459,-0.243935769825188,-0.223406358455314,0.216377460237278,-2.03156658039766,1.66365679078492,-0.770769965581541,1.78289590722595,-2.30484790168524,-4.08385133217365,1.71014075191883,1.97464009882288,2.46124729571871,2.77208305150849,1.07295296288269,-2.04231410601069,2.62795861579049,-1.78239075603147,1.87633825065428,0.529538705968275,0.453620570662779,-2.40147617168371,-2.71752861171083,0.200625727951212,-2.17597746621015,0.516259286356495,1.19966048702541,1.57952390309727,-0.27102194928997,-0.931738839560132,-2.14619202807606,-0.707153693060139,1.84677933563161,0.760001180227281,-1.9830791581216,0.702052828271839,0.238177144117116,-0.622493459299261,,, +1.3,1.4,0.555751358439945,-2.38202472767864,-2.5374263593009,-0.668202304854171,0.460100676574187,-0.468381646864945,-3.14175970014952,2.59508399671427,-2.1636104727435,3.2015653434026,0.996379591348406,1.29034980481803,-1.01449313948565,4.13101071641878,0.746477773437528,2.67476274247404,1.64519247767868,0.368970054327677,-4.07664230697739,-1.83764605017084,9.18832855645467,5.16014230624288,1.45248686878921,-0.776861944410294,1.32987372892995,0.439452988986878,1.02452951447159,5.22593777208589,-0.304641461822068,-0.986507095790607,0.0981512605340924,-1.35029669565622,0.0099829983298233,-1.47368672538286,4.25421420892833,1.05443042597449,-1.65613790933755,2.98531820395854,-1.61579611561761,-1.61584959582512,-3.05915206957465,0.171499849562224,3.18424620169122,1.67412084797257,0.493112633827945,-2.53382502823378,3.36003748293486,1.68616378568491,-4.62782463244664,-5.06452631747941,,, +1.4,1.5,0.725609180412714,2.15340088045979,0.312438496055849,-2.79541909155967,0.266136430579753,-0.296658418348459,1.25094970669959,1.98841534699095,-0.20356849893254,-1.01301516249052,0.14658543837751,1.55728052430123,2.14359139714842,-0.924509335865053,2.57332163112923,0.841364857115575,1.74952560279345,-0.798187414539234,-1.58230032535238,1.12690198287515,-4.48092799955653,-1.56496320500463,1.04759575280675,3.93739240958469,2.48962138973262,-0.322621445521173,-1.11320984336191,-3.43070160902344,0.647523942010786,-3.43098882142036,-0.184620378606986,1.83250535956895,0.946799389445305,-1.22878351100888,-1.55605224522125,0.891889919197199,-1.60547887211236,1.11724886038631,-0.990609385659061,-1.6435084128692,0.536852399226953,1.11404523700155,0.987738670119397,0.759006399041441,-1.73816815681788,0.92951475199042,-0.105823241600692,0.274242055837412,1.22289414504949,-0.653786799794155,,, +1.5,1.6,0.651725771835592,2.79369621485552,-1.37687441806266,-0.407487663410837,1.62489500501172,1.2203757596244,-1.84909310478014,-1.24107264872941,-0.880668115945116,-2.94584540053303,-0.0799874045010337,1.6562651670194,2.22229929432724,-0.0454283749717774,0.4360705392719,0.438710836310926,0.548796483100254,-0.209581665775903,-2.67667297251137,-1.68993432209153,0.449957629732672,-1.5715535560288,2.8493908122811,0.38551226507793,1.3392989543818,-3.4408083716611,2.25423993707932,-3.31090080586337,-2.47061164324379,2.22703096525324,-2.17637284653793,3.60066284954513,1.78645711931948,0.0592741235546194,-1.06488789593085,1.29491418427606,4.26288588784497,1.62340178464192,-2.67013193416794,2.7416015538228,-0.170232652373118,0.0338503654648348,1.23148477084599,-1.42045160925335,-1.64494945478888,-1.3710753937353,1.26227327101454,2.37569192804425,-0.241378082718342,-0.94141566584387,,, +1.6,1.7,7.39921973166246,-0.695323549222931,-1.29022376196738,-2.46132709002258,2.60794080383602,4.16004576975047,2.61058144706203,-0.305688389239895,1.37970040402818,-1.93487009859452,5.51417622490348,2.00519019723876,-0.118353364826195,-0.0453841153231959,0.007609924278713,5.44662603392165,0.543699734132417,2.28939840621075,-2.07516963857466,-4.84259659482211,1.59314698493873,-3.44267186897438,3.28670840577811,2.72752969322703,1.20215577661964,1.28109449622157,-0.153558241469811,-2.25831181023467,-0.401765452800865,-2.40258042778156,-2.34908665568599,-0.0227078048695048,2.03449114924152,-4.32010175839527,3.96501438479819,2.54423985445574,-1.64189946684155,2.0845653373771,-5.50125722921213,-2.6875591289533,-0.163407238610649,-1.4322659342638,-1.81300446632046,0.766094802683155,-2.84656208836804,-2.8301943914545,0.81803966540716,1.63212174935272,0.642463660458146,-1.31059906341514,,, +1.7,1.8,2.40588037434168,1.33039783843917,-0.676884441898234,3.9034250403503,0.026080009366245,-1.41498941047684,-1.52539331129802,-0.136692793413889,1.78515476396359,-0.272110467927108,-1.03913869112042,-3.95328513920296,3.54706744419001,-3.07232325418042,1.03550145860662,-1.30510608569039,0.0831224719320189,0.230952532086129,0.61680831948405,-0.468731010887522,-1.13055337796658,-1.73055994221095,-3.63352006608614,-0.663598602388298,-1.24460303435534,-1.51121672205882,-1.52637907376702,-1.02550969078375,-2.73998732974856,-3.02420915791703,-0.489561390404151,1.03685012920996,1.87847392838446,0.142937530346172,1.58136094353528,0.389288448399853,2.10611093909263,0.998352265479031,-1.1842648634099,-0.399779712744055,0.755589774348053,-3.18101225183453,-1.19040645637607,2.88257675019185,-2.24674176658863,-1.70109418681355,0.469551110969173,-1.86120280800877,0.200420492491152,-0.170969679382766,,, +1.8,1.9,-3.20274463724113,0.773874222718237,1.64614599552711,0.721835333507736,3.93709924623571,-2.00023478310303,-1.95375661600176,-1.40683949305642,-1.49533716890984,1.33742901373974,1.68128149808239,-1.48225142349032,-2.82335564183784,0.33677294148062,-0.0705610715199127,-0.654777732293916,-0.588031998074302,1.40917242926869,0.192535954883576,-1.9426264972193,1.54892554113787,1.28606653159581,-1.36745206825355,-2.4752302749925,1.48071387511901,2.49142625711704,-1.24276734358494,2.09266549042474,-0.315042987645562,0.210091625977274,1.81097950695311,0.66454498571702,-0.342790813760022,-2.71740630384103,3.33146589076221,1.06768335060535,-2.86953251056654,-3.82573821243968,-1.90898599885506,0.423860982618232,1.68913491433077,2.43051491805584,2.79440401778651,3.22274031254474,-3.59971157971169,-0.886168034310385,-1.70783582660157,-0.495986090369399,-1.91792586186559,-2.94314750152996,,, +1.9,2.0,-2.17482790458379,0.974048986992111,2.50720655506521,0.310344029426504,3.029771535603,2.32155605830909,0.48961003088954,-0.530501467196968,-2.08815679535763,-0.350817701462446,-3.31879706220302,-0.150101146644014,-1.36761020237915,0.329564642269529,0.151859484582866,-0.731743935703456,1.165150611636,-0.126659476331722,-1.58210143912405,2.40029974000982,-0.419009236387041,0.0205680067575303,1.57698784982093,-1.55636961438757,0.84089664128493,-0.293581864211237,-3.63053421071102,-4.04858738998121,-1.12185579908497,-0.407284882949091,1.02837701828957,0.743307386021124,-1.64124938614129,-2.08445761807348,-0.341657317246554,-1.5775959407046,-3.82624192764141,-3.40074062736046,-0.69097617117135,-1.5099611868015,3.11317230406707,0.944927613389534,-0.369232833938974,-0.267999119835704,-1.75306554143873,-1.34422869796015,-1.65184063468003,0.818604975237236,0.481712426628555,-0.39126962740233,,, +2.0,2.1,1.28588026785764,0.242055191722788,1.83495626173443,-1.22584325351487,-1.86138484726045,-0.334380034388681,0.8602625790677,0.731133600188683,-1.81742354075479,-0.670131845522926,0.565289104407008,2.68240079386625,1.49619270042143,-0.499753614504373,-0.00593603689844963,0.873817777556575,1.1799683982929,0.0149184268034789,-2.74589133068304,0.0552461621863612,-0.364950444572966,1.02773865740661,0.248011258589835,4.58260468125937,-0.372391779435783,-2.46818518706614,-0.321481964868768,0.501854875773063,-0.637713909521712,1.88655870462753,-1.2345376271931,2.37026253643203,0.308162625012256,-1.50321242593588,3.10209565387954,0.84510820105889,-0.0227992859728542,-2.21521586711323,-2.45789968289505,1.13422839398902,-0.358324633085681,1.46115530424515,-1.45661915719781,1.06386101731876,-3.75119702585009,-2.77901860024965,2.57606428491255,-1.85322048316374,0.935566536866204,-4.16964723600851,,, +2.1,2.2,-1.45595302791712,-3.57203754805573,-0.815506112758829,0.86142150987229,-0.988717272063613,-0.222193792429366,-3.246909231049,2.27503038255254,-0.800514907940624,0.549338669325995,-1.05066184625963,2.2746754238737,0.363543280947518,1.40414308206969,1.69945377853004,4.50774994874455,1.20223959405357,1.85909907336244,-3.24469307180972,0.855690588091828,4.21134125625123,3.07879848931523,5.32896722938934,1.21308307493136,3.30547180724902,-0.645243835491161,-1.25337919163304,0.656934943302804,-4.52429465197901,-3.91428393500123,-1.7765716293542,1.20932991970504,-0.916065734657072,0.387133798593019,0.300669078071486,-2.4194646539746,3.36804299408804,-2.70507039359375,-1.36113004172581,-2.6446624915564,-1.1197854645974,-1.15097220537407,-5.33015585932497,-1.29985921367422,0.911327331646307,-0.748876375591805,1.56240555543428,2.16907844970491,-0.879581760650955,-0.210638601845813,,, +2.2,2.3,-0.695316721718133,2.50580067026623,0.342352306956665,2.33122928942166,1.60760484543937,1.02138008510811,0.730546441424613,-2.53420597397529,-1.32657870349675,-1.13265789579094,1.96618304860504,0.872422646185038,0.940954498758207,2.24378699479052,0.900437254658936,-1.85703510573607,1.63183714350095,1.62167299551082,-2.42860493973049,-0.143964202917475,-1.52340629061167,-0.776991798845568,1.59619942360886,-1.63246865731022,1.75258907821379,0.704937339267046,0.719425792854076,0.664391979753537,-3.55102105869637,1.26364997650117,-1.12794438600857,2.53082753575905,0.965734661711472,2.68712386519609,1.9077439192026,0.281828211637222,1.10630018764366,-0.8920498543118,-3.57624944910106,4.38946217311561,1.45722022222272,-0.059683808577177,-0.0477368750044317,0.549688270212891,-3.38423461405594,-2.05080706578523,1.46925421347341,0.454535362381171,0.318459970864058,-1.6960031613442,,, +2.3,2.4,-1.48218346248402,3.46125195708384,-0.492540950627984,0.544057939822881,0.441588335565786,3.0614104944499,2.68628311500204,-0.0609205366504261,-1.34816730109857,0.586755785487694,-2.12285001733083,-1.29086600230877,2.19676698440496,1.73215488305539,-2.01960009109088,-0.147653140741244,3.32641159068301,-2.63336963803951,-4.06356464775544,3.96559046760408,-1.09689674487257,3.33222137623058,1.96872332977963,-2.7590273516545,3.91011613437886,0.86488570904271,2.96669860814855,1.69518563572462,-4.50462178108515,1.83214299806079,-2.58671989049746,0.926054162472394,0.290080416872772,0.432157453004865,1.77388988736588,-1.42785426872192,0.39562249550647,2.93836505217524,-0.212929193357425,3.45185149013537,-1.6509881585105,2.38247652421273,5.33752639489644,2.4995348870182,1.86459611915521,-0.278614333324306,-0.346787033955834,1.31568306109716,-1.81117567687268,-2.25646538895242,,, +2.4,2.5,0.121196347609945,-0.108058453229338,-1.3666297709267,1.3892607096631,1.34190009763646,1.12502341813738,-0.296618515251649,0.27879411233236,-0.816439153232276,-1.96949993946581,-2.42747831788924,4.7028315044458,-1.46991728421293,-0.427530429842848,0.0334335738897268,0.690259265012689,-1.17855121711516,-1.80953763674345,2.66940357202808,0.248849540737759,-0.436439838991066,-0.164186270492,1.86888985765844,2.23653385611028,4.49797980722596,0.12562140059158,1.84491658206054,-0.800392272296285,-1.97833407142157,-0.549403080053561,-1.02855491676895,1.36142389318909,0.66518185389273,-0.592651963070647,0.516351315343134,-2.30678657498335,0.563760065966653,0.74199760084777,-0.384324496484074,3.58348600543669,-0.460634439449161,-0.476830571512249,2.4166886084528,-1.78011883548886,-2.39448292644583,-1.7111715521367,1.14180574890064,0.908482436809666,-2.01868172029746,-3.16647407435079,,, +2.5,2.6,2.87546766905874,-1.30621499151423,-1.34661732751893,-1.36477619357409,-1.14264820521448,-2.76989640927341,1.75272335939491,-1.42290480691446,3.44702211675669,1.63575852594528,-0.219423869291532,2.95260236961516,-1.52950658409964,1.49781395101231,-0.236524245808489,-0.130862990057083,3.51966699095968,-0.760070063174663,-0.834352893691635,-2.4472013266978,3.01089708386508,3.07663634302213,0.752187570783965,2.13915330505701,1.66827897714483,-4.248919790756,3.49420800023391,-2.87734173773384,-1.94597630889998,3.14981680240701,0.329600611802459,-1.36025568469886,3.3539302366922,-1.83370150017945,4.12060945090974,2.03738381934561,-0.629698384798938,-0.874529807846123,-0.282191544097119,2.49092623890012,3.05137031056639,-1.86297566587833,2.23949538329493,1.61619728021969,-1.41911081102793,-2.81122776182811,-0.666640273773287,2.11188821571898,-1.72807196192256,0.534916148176379,,, +2.6,2.7,-2.58291541319657,2.05575680453866,3.64848138591017,-3.73352121598204,2.2721524226842,-1.67855353426209,-2.13432596021327,-1.45831823264329,0.267296279878805,3.24220577672824,-0.876541076455338,-1.06872394889996,-2.54121051975109,-1.04476560014838,1.26399824950922,-4.32479028809923,-0.423320959939235,2.4181007249442,0.4129004490422,-2.85007271867082,2.52086714873968,2.66432472631436,2.54842559392743,-2.40185417451743,0.739285109692632,-2.56275345143781,-3.29173741829593,-1.22457811421248,0.0585742373572882,-1.1726843274996,2.19035019714661,2.08526827075641,-1.60798078443537,-0.584378392553168,0.697340757464979,-3.1631673300676,1.35766554627518,-4.40113543117786,-1.39745361783941,-3.28078913191396,0.382828683839479,4.45045035917699,1.09593532158843,0.399900943441046,2.35216869758084,-2.33962412450393,-2.92480688421603,1.60065194914302,0.93781145842988,0.753682873805719,,, +2.7,2.8,0.932683340169992,1.47837502134545,-2.56389985042069,-0.440880535582118,0.475992112863668,2.21235932891905,-1.90444022064287,-3.21361622547755,0.482668890801513,-2.45602656825286,-0.505301555242597,-3.49049163558378,1.92799486795625,0.997938162955951,0.0599281719905099,-1.34507967471535,3.82189376781025,0.331007670209716,-2.15741572597535,-1.75784318568333,2.81608741183253,0.630516851311377,0.831992923949784,-0.188173170589422,2.26677323326173,2.27376676907206,-0.460479070446479,0.169525480609984,-4.21932639654056,0.751329606664413,-6.80415308223362,2.23935803109211,-0.018765074753383,-3.26038991970702,2.66257612320678,0.854879371150657,3.80768716172088,-0.569740539684696,-2.05031634316988,1.14116335233794,-0.0624477988921045,-1.66043953096112,2.11647821477234,6.31731006084865,0.282713522222256,-3.88822044598149,-1.06386227797414,-1.07341330181575,1.24947512857584,-2.01099874124951,,, +2.8,2.9,-0.190764871534067,-0.832683595775219,4.48165218241009,-0.691791576828947,1.18005190384955,2.70038942918774,0.607385090498741,1.07954507259054,-3.16675865840481,0.243219872351482,3.31759476703298,2.98499171203703,-1.59474356678471,1.98261676185004,1.33239950083889,2.09045293925977,0.165482827752169,3.27115733639514,-1.75444622984331,-2.88058232695821,-1.8091418529978,-4.04848130509037,1.75778297768681,-1.5540361341628,0.283874786720228,3.14614180738661,-1.35698609171216,-0.232826073905957,-1.59728751176671,-4.13432866851944,2.69735945545562,2.10283068399961,1.56835473170226,-3.09600323401495,0.373272038971625,-0.368765506251781,-3.61270397621319,0.398525474873015,-3.1488522568666,-4.15482879074718,1.48371969785945,1.25791651679408,-3.31853535809201,1.88390872396579,-6.66250342209356,1.1141688428176,-1.98675173049563,0.0550567031742593,1.17527707100265,-0.408929415222566,,, +2.9,3.0,2.07584718231275,1.22002900362819,-0.793861217166859,-4.33305743455819,1.80364355654205,1.2054011245442,0.617079862963498,0.702664451418367,2.46513448392998,0.373017728171608,2.36993975046339,2.32330921888993,1.44658011375259,-3.68352563077178,0.0455222200288473,2.00322824264919,1.84810694421118,0.608164656295271,-0.966256589288504,-2.80295614627345,0.826259418959985,1.2844076291427,-1.85315405559947,1.02958262198594,-0.82285382584283,-1.32888373681357,-3.03466250664774,-2.2169339817719,4.88651727184018,0.00293327338421558,-0.615234856142122,1.82602515752514,-0.986413208404311,-3.98866340832859,2.09078820555829,2.01987007944622,-4.36533631131179,-0.772240437726864,-2.73586097516928,-3.38593133263736,2.42187603572045,0.435091844412334,4.01268645130089,0.413454620799435,-3.23150779238356,-0.121342130699243,-2.67511289867455,0.146342750015175,-1.26366106590203,-3.25548100559938,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/class2.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/class2.csv new file mode 100644 index 0000000..b2aa8c6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/class2.csv @@ -0,0 +1,30 @@ +Time:1x50,End Time,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,Event Id,Event Date,Event Duration +0.1,0.2,2.41756423308863,-1.70401239595644,0.791729847451285,0.645613889707579,1.11917441900686,-0.177752798768,-0.502323231129607,2.27946077930473,-0.620097027979108,0.237200592861211,0.0614235140029632,-1.17348720105883,-0.357925117766627,-1.63796061515849,0.917322979592683,-0.37833171872684,-0.946119121861523,-0.0503651450477355,-0.409013192293217,-2.04614769290604,-0.399654044524648,-1.14109064360204,0.989314861039603,0.495639145844508,-1.13685436997172,-0.626825600799964,2.50922453214131,1.53860969964381,-0.725461590878397,-1.28921524286806,-1.25706071230653,-3.03884011510721,1.47410400452375,0.0819561326981504,-0.0726196267672344,-1.50559081777541,1.74664432671996,-0.794270918369097,0.047953240677887,1.73699254493474,-2.62826713575325,1.01534561048104,-0.803431439823553,-0.71471177906596,1.18060299534523,-0.794322346919578,0.786606149688323,2.21317519625281,0.285011727658921,-0.850868910204617,,, +0.2,0.3,1.80188889404418,0.315552223608854,-0.262557343411401,1.50045825269355,1.09064026780364,-0.121730539970911,0.43812652908932,-0.523034229650523,-2.24084439581267,0.830347937150517,1.13562332595139,0.500494429219252,2.7482349340849,-2.04509150717098,0.747749245376466,0.909745017984892,-0.11757130812107,0.34959788740953,-1.23615166703237,-0.962361521724509,-0.316579482791706,-2.15681891438129,0.217396498323689,1.14963077925616,0.45710847937624,-0.8491784768972,-0.199441196263061,-0.463154271272553,-0.780671078974483,0.927772277443112,2.22085753515201,0.173035255914104,0.0466857464951015,-2.23192589786752,0.156802490410574,-1.24385666850783,0.994065197710682,-1.1310557055715,1.19025094222507,0.837362802103179,0.074635180422496,-1.9382936377041,-1.73623206073621,0.350917204209175,0.581364553631124,-2.11549024802639,0.075091310820531,-1.59987906951638,0.0804263264426524,-0.903175045614212,,, +0.3,0.4,0.134053583211802,0.0736801397485045,1.35381433181395,0.222143313225455,-0.75615540652887,0.585896104848566,-1.25487765942792,0.0618414485259265,1.12136347313419,1.15103586902857,-2.47540474891527,-0.0267486987367018,2.38995759188258,1.22420774775832,0.350169519590248,0.614336199725246,0.164327360348982,0.706118648266181,0.017764527876496,-2.45963606734507,0.408266243351976,0.499192662808535,-0.154965880654383,0.407760603757424,-1.12462097112783,0.733355721866381,0.0825686379798897,-0.0172780002074716,-1.05483478155031,0.961605145031084,0.504011431147704,-0.23031362553634,0.715156030740589,0.491340264675297,0.870910633389063,-1.38576760545291,1.38532666311733,0.600341172100502,-0.569899583962448,-1.37604736692897,-0.576111195613606,0.486881201184612,-1.78599173287689,0.973587613719928,-2.79205436913732,0.824791999063363,2.69283120653806,0.0885622445383038,-0.55454569217847,0.0419115553038687,,, +0.4,0.5,3.90115375281321,-0.576843586677304,-1.22322026530138,2.2393112250765,0.453301595875585,-0.947102724052319,-0.00634279476540103,1.02464991682588,-0.280551482291064,0.528251543160952,1.09696987922838,0.441769695436964,1.3606920172692,-0.143379233801836,-0.220345613536676,0.858622330768882,1.1254595004879,-1.40443570509893,-0.833433599180464,-0.386850253103523,-1.09025758540741,-0.0511331048601226,-1.700690045554,0.850097256319639,0.956316330592468,-1.10214629428405,0.656517748854216,-0.0273847042090798,0.680440019977418,-0.329551663768347,-1.69547266144089,-0.217295520359744,-0.361747049327876,-0.806967833979068,-0.144567005025595,0.515712914667356,1.23407811678742,0.00121636506162939,0.514447404322184,-0.640932521250631,-1.00452312124515,0.687568802825433,0.51765138915709,0.107761745506942,0.508235191756896,-0.210951431667897,-1.33803212964343,0.336138128677005,-0.52523247628906,0.508716885104579,,, +0.5,0.6,2.26390217116451,-1.11463592272539,1.92580963388041,-0.459159911520928,0.885822481928998,0.278584038590067,-0.846951437744313,-0.506883849690481,0.883766555166351,0.950918475131371,-0.241239682802772,-0.41734585303162,0.221022811563535,0.271093819366761,0.493949741422186,0.00328354898697439,-1.39527802298993,0.164774504765728,1.2418703063445,0.519520494733933,-1.28749439877126,0.36102828532919,-0.566770014589174,-0.328233925354516,0.660468829346089,-0.0548298205374033,-0.447993806816061,-1.46872800617216,0.466328029312081,-1.00473991515938,1.45687239177829,1.08409591929311,-0.420261551755275,-1.29127008779562,1.30273374540705,-0.103175281479033,-0.600428434711648,-0.775686160702368,-0.967953544940887,0.465842846859284,2.06030085775973,-1.69420952713817,1.91444788712457,2.19963525743073,-0.447592829097785,0.125523618774679,-2.68795734330282,0.312151306862779,-0.129740420682068,1.01856191637845,,, +0.6,0.7,1.28681920398356,-1.73554129729895,-0.197041094065271,1.23260541291538,0.25942640448246,-0.247257463789772,-0.429863925040663,-0.879770176316215,-1.59061156135753,1.57407287022937,0.950144580297151,-1.13013947143077,0.316832232415441,0.0350104505182429,-0.198904683103634,1.2080507210976,-0.633695774000356,1.17785905881309,2.99481707872686,0.348473904965908,0.887456350739495,-0.0280041788075179,-1.70696967612494,-0.215893371515469,-0.634744466860558,0.668115688647831,-0.0875239839984323,-0.390153017637281,1.7813682669371,1.26933780643966,0.179719027234534,0.576675269856259,0.162452560452856,1.97061540006131,0.709455669205445,1.71279592251747,0.757308119186768,-0.415474760353766,-0.0711510430153657,-0.909962183354922,1.3518334698559,0.176589282814468,-1.05789139292939,-1.60417030737624,2.24555069710889,0.3147718036389,0.511316053526405,-0.092583472608371,0.215447449060973,0.276938935894284,,, +0.7,0.8,1.7143878588671,0.318553319550764,0.7105413822878,1.53929387721496,1.17219403804553,0.914321111147704,0.445074348035177,0.864040919966386,-1.30955461943129,-0.38192639010032,-1.63356859757793,-0.0578335431210713,-0.705976590644803,1.48879996667957,0.906412378740496,1.00635243733724,-0.860068560811214,0.25157523868098,-0.700285646636355,1.63742514597695,-1.44597174367909,-0.334068790556961,0.369935570208775,-2.06508288737651,1.34297495735268,0.509447063069645,0.170816044092557,0.226714523719044,0.745181779363815,-0.969225705128717,-0.177438715283015,0.822982782642091,1.0371944602826,0.577685327764532,1.70813554580091,2.39356091163575,-0.346884726302522,-1.42225821911172,0.500597355279659,0.524234693802535,0.729733076217236,0.47456515128138,-0.660405774073152,0.267060538646901,0.000426531833439704,0.715069562151028,-0.868863424039719,1.48823661679146,-2.31786866819867,-1.45294959225448,,, +0.8,0.9,0.697057441008775,0.698790009807599,0.867820323427383,0.0811664846339576,-1.4472231601051,0.997767154622138,0.76618207296053,0.878651658684913,1.71080398924943,0.929524691395211,-1.44876807504741,0.839031972695844,-1.48805829633174,-0.50845406468288,-0.304523720289152,0.351577492189797,-0.791474627573446,-0.0731064149233324,0.0118503183356555,-0.94940960665759,0.222997198912361,-1.7254389034402,1.36115001780592,1.41274470145576,-2.00017992853741,-0.404570800129302,0.0410800836576833,0.794815690704137,0.93598122103314,-0.0391567604442919,-1.97149287295885,0.101864284607686,-0.550151672011335,-1.36443082486966,-0.225199678538552,-0.439947140031294,-0.435924408967588,-0.692718679506362,0.805440351782625,-0.169890876199317,1.38782563973323,2.92735443147801,0.524445171344603,1.66054859338096,0.402666015005784,0.424174309807325,-0.66521968800587,0.01738015871613,0.361867157614173,-1.37457037615209,,, +0.9,1.0,3.52897644396081,0.422128745354343,1.25248286681702,-0.950703924432279,2.51811470021927,0.187631658327211,0.0294973585186574,1.69556178117789,0.405807897438738,-1.64177540546277,0.275407803221126,-0.11671417338093,0.0581305705766578,0.274108570345926,0.791124732212224,0.172462582908223,-1.14215257394054,0.423134416176203,1.32629897532172,-0.23939890190641,0.011552509015188,0.393634403403334,1.61597385031162,1.25862095079157,1.27679363991336,-0.261622116935512,-0.475755662418219,0.236200319452776,-0.31328170702761,1.02359375302955,-0.221950005364121,-1.34862373561157,0.110497607966458,1.5354393778831,2.10234202132854,0.344538220593261,1.60485808855624,-1.97233422609305,-0.766832367234666,0.480155254082462,-0.324478218471555,-0.376564743260814,1.8236538168715,0.0511160324888412,-0.844828893457091,-0.34538568446893,0.314551576353477,-1.10815772973927,-1.11731920702865,0.46420549167493,,, +1.0,1.1,2.2349303919686,0.574218989497726,-1.27507776210747,-0.691893048210729,1.23889754707696,1.09136200313909,0.903178957417063,-0.0383450493306883,-1.87599757865119,0.507501274578597,-0.443368706120003,-0.378281077195736,0.490810167526783,-0.771969296893111,0.831225714056053,0.547306569799624,-1.34018685039238,-0.334519169731117,0.506179096791726,1.09903254737982,-1.64437042216723,-1.41065404332665,-0.551204541436527,-1.66049829709579,1.11959912640833,0.70196278086534,0.114890097276731,0.495064598951083,-0.849710879875456,-1.39290937328785,-2.20914476764139,-0.414585999149955,-0.0685079983959239,0.201207480854693,0.368934977351352,-0.560360686563783,1.22607205658501,0.41929577282257,0.393460393461204,-0.961312552821879,1.25172263455976,-0.81826950295172,-1.04633627939148,-0.746109258253462,0.352254610503885,-0.867627639226765,-2.6375353545019,1.46592226213751,1.01698508619519,0.107564981881061,,, +1.1,1.2,1.90905608282086,0.16215602902349,-0.35655805663903,-0.523178514593638,0.964899194189744,1.6222753959523,0.219085663684405,1.15426264371121,-1.24502181738719,-0.866076969231395,0.505721545064514,0.715912175667961,-0.987807527481338,0.286521572827326,-0.652235567554811,1.54688229235656,1.52479834913992,0.261306722767349,-0.287643387358626,0.588966783068548,-1.01860474742667,-0.272490554703533,-2.54293342449673,0.663603748421948,-1.90793856071731,0.892296010475099,1.2677764947497,0.102244295534873,-0.192134963445369,1.68534811369718,1.17723504139249,-0.761940422354176,0.0761991779137232,2.16735803291766,0.4448566545144,1.03485896087065,0.227702285072451,-0.563369979998674,-2.04111698127948,-0.143561213814264,1.2523436946126,1.48262069225916,-0.496833366155436,-2.67088622136062,0.213467760508286,0.656874752811013,-0.163930500814305,0.503368907434312,-1.15649235180276,-0.326602268574231,,, +1.2,1.3,1.82817174278505,-0.915740723481944,-1.03397774676955,-0.0393381784441342,-0.786463555009029,-0.491849260938815,1.11102671071298,0.628932722019228,0.200299617640272,1.28377449540738,-0.253027772897481,0.255562390948539,-1.28031501733204,-1.19585660531198,0.586857023188176,-0.400961177593881,-1.17244918888821,-1.0213245830234,-1.27155342814585,-0.792598648327314,-0.493647891138553,-1.06161347607627,0.179951616570891,-1.51078529195779,-0.760922980284442,0.394460954386319,-1.15724508546002,-0.293104407076505,0.434954857926243,1.15827516527076,-2.0390862403136,-0.866199826749087,0.342186941946617,-1.35222657540178,-0.337872950381222,0.90850056534597,-0.617078219759492,-0.02729832872889,0.00600052372204561,-0.770688409385996,-0.822658332586892,-0.785053794646164,-0.326984528190858,-0.191059445623554,-0.169054704183838,0.649927127346464,-0.323827478609514,-0.214716977074725,-0.682253620558535,1.22397511430413,,, +1.3,1.4,2.32236853223443,0.427806931249306,0.0402703488023772,0.113862885576774,0.0754927902472402,2.70406468195407,1.04096994307005,0.64771066009713,-1.85695063630025,1.69570239206156,0.491082605773716,-0.123025225831437,-0.0354374776650886,1.92113962370778,-1.2590573313434,0.00875643793143263,0.376386004283907,0.174125611303642,2.15149411768753,1.65926366577081,-0.487098654381922,-1.7100674664531,0.764500072760924,-0.567933253038316,0.987495990460228,0.00949996883680931,-1.25855902616332,0.809357345422902,-1.62511020616499,0.42269146211559,-0.070708576022989,-0.487328175670994,0.164900621002674,-0.683617816803271,-1.04542000052847,0.724483495811625,-0.228120180148957,-0.115000975380967,0.826195913275038,0.442365448092266,0.135587213557908,-0.109488943016988,0.0309216082549297,-0.698165360098408,0.612867470522679,1.19806990644916,1.38542920455704,-0.379494251426188,-0.731897155098474,-1.35668649190231,,, +1.4,1.5,1.45439547273008,-0.929810951541978,-0.591944576136757,-0.411474639985248,0.289652928461575,-0.253764704019275,2.03654647389044,-0.936592370293857,1.62902125089821,-1.01506182826729,-0.158378237807025,-0.299168462814882,0.508691096423908,-1.41615001234424,0.331446304693132,0.960927520369855,-0.0188706880668929,0.832655068862004,-0.650859111020964,0.679972642521691,0.393631169376017,1.61308504239881,1.3498864827501,0.817367048913504,-1.07304883617417,-0.747468195211896,-0.365260632211411,0.485667789172747,-1.7150830945153,0.587471134281994,-0.859472136779999,1.85745130601475,1.16221951542599,0.427722140784601,0.263307588505152,-0.217164070073997,1.33534523533395,-0.600663931025257,-0.15425051251824,1.61929892116195,-1.84832764639647,-0.675788199193317,-0.803409264963564,-0.437313747732349,-0.765909210679953,-1.30827477420875,2.14311433473649,1.31143432968157,-1.4266078787346,1.65668499033972,,, +1.5,1.6,0.595521266870661,0.670827444340013,0.822349032920016,1.48671063767886,-0.20591879343225,0.583029392512904,-0.484613644765427,-0.614161729978392,-0.679100407713575,1.76315303217649,-1.17014896754858,-0.86726463730375,-1.33529480977493,-1.21221300830339,2.58447799745804,-0.248351350386802,-1.98327524911415,0.568963822015204,1.49249573377712,-0.72091582182537,1.81381156530344,-3.01314816868743,0.152853800008917,0.117622027015652,0.278507598597378,-0.0184210704865948,0.183121169493893,-0.575401221633333,0.427227245715667,0.49782259523041,0.0121123765173689,0.0605642365961841,-0.714177967040767,0.634344450459318,-1.87727132746797,0.0952605631767785,0.231143650290242,-0.641723073845394,1.23774853664246,-0.65590732710293,-0.0412916456639285,0.679248067992509,-0.38198476499436,0.526950080954531,1.89759407362439,-2.31203317081741,-1.42377201016702,-0.689755443820253,-0.18622422267855,0.965931525511026,,, +1.6,1.7,1.89979409534188,0.114201731029458,2.11093333569011,0.462634950869365,0.802017284993703,0.45514125342449,-0.741147770239103,0.301082308780641,1.09083469426141,0.679739573634555,-1.30511622720764,-1.12831998478253,-0.709779255952854,0.786495319085328,-1.32696869643567,0.279463547951855,-0.253466304734537,0.252930796714509,1.05907750468596,-0.298027494330392,0.183088883093571,0.779773656314397,-0.158195417336922,1.79688605194308,-1.3838126103276,0.308120164886491,0.606905014035848,0.085984830734963,0.356346802002905,-1.22769019162751,0.373144957964786,-1.87713470192505,-0.171542630218531,0.10405010428406,-0.134565397882384,-1.40524107297725,-0.489312450251409,-0.422137504979368,-0.505231646825649,0.588717173734515,1.05117859910455,0.907752266022308,0.962844639182917,-0.946294028300419,-0.98306249307748,-1.38635130884037,-1.62446697801481,-1.25639807547798,-0.900244784331326,-0.313335627738682,,, +1.7,1.8,0.326093856462409,0.0718318053141033,-0.780989120529917,0.637204898155618,-0.910877969410234,-0.639233538433986,0.0774259505879961,-0.113492051110571,-1.89804390654581,1.56708966843491,0.202586104969294,-1.30215934609719,0.447191335524953,0.00263359948905052,-0.183162806239416,-1.69534204409441,-0.0999978083298749,-0.551192660276627,-0.361905518259104,-0.670312262837318,-1.87386246016378,0.316208011441323,-0.00256785804749727,0.178342041493682,-1.40822528162159,1.04326994172408,-0.292480406483948,-1.47127673416754,-0.0599809240520088,-0.214670559294986,-0.032534147093615,-0.825317796231491,0.717711471846127,-0.202824366243721,0.208381005095076,0.456347108459851,0.164122164540019,-0.377421649056397,-0.453920115194515,0.0955023622260769,-1.79249664781062,-0.583047306936519,-0.270493627569649,-2.04017251810275,0.388453344865416,1.6092844666269,-1.06114066894118,1.26616548498011,0.595967473989876,-0.491718736512471,,, +1.8,1.9,2.49850607542732,-0.0260826570912244,0.0700077723592852,0.32604773433282,-0.337215828267252,-1.47078362042724,-1.27195080354675,0.12978088784109,-3.03846808346853,-0.971348447288014,0.274289225628083,0.162120486399879,-1.66513885211497,-0.305161314181406,0.629718567018265,0.57872289230021,1.18813766954819,-0.503338569277094,0.81626217765867,-0.584970486977983,-1.34298310710332,0.111566420141956,-0.948592939426938,-2.62770679654794,0.335001574178879,-0.467151181788328,0.345335492044936,-1.06596135937543,-1.15411840762396,0.759080521827426,0.188628959777562,1.80321198870907,1.40570504545831,0.50475428027401,0.261269132151034,-1.18302501013173,0.819429246309387,0.135359951198624,-1.68396068163217,1.06503229465112,0.967037280889348,1.42663508424886,0.405490271188921,0.81881808633476,-0.738100260180903,-0.470512553560968,1.90696635564439,0.240714186472695,-0.616643676792083,0.0183787390087662,,, +1.9,2.0,2.06665141514131,0.589269784283709,0.410861099476856,0.239607023122536,-0.428429902516973,-1.32387867673835,-0.436342217523423,-1.31177357968924,-0.57166336986993,0.766187042598625,1.85715937580771,-0.0646796789020885,-0.131612570633307,0.156344942430573,-0.292498182364307,-0.605901957216522,1.80288902912815,0.107614436799477,1.01545574953744,0.235458117756115,-0.560286444234255,1.40477760148376,-0.178458068629514,-0.306794936438191,-0.626652381817584,-0.762817604120119,-1.58336895381413,-0.267099064013039,-1.23405298471095,1.17914343200233,0.337035821835839,-0.0152210799009971,1.22133229367176,2.01715392601076,0.134127095325089,0.0573181658213635,-0.555011540914146,1.30874794052678,-0.280379176326033,1.48128495901716,-1.87613965794929,-0.0844195837827267,-0.0865570974259608,-0.498074760737799,0.249241068349945,-0.634249582641167,-0.912077870193607,1.52322784942974,0.34946589163777,0.60884773848211,,, +2.0,2.1,1.25072038831056,0.884511094884224,-2.53005978943368,-0.594147504273335,-1.22455094600989,0.8088980792455,-1.1559076709631,-0.313456180075642,-2.33992485126947,0.414859193544999,-1.18566295764187,0.28667090137156,0.0021803291889954,-1.19398936831679,0.927042879338312,0.886711571360871,1.13422062049977,-0.106101059019173,0.200656552743109,-0.265776897059496,-0.380337268430462,-0.366182542407946,0.34614171816554,1.08098970984179,-0.811909505752476,-1.24261374129163,-1.48559581576313,0.115605019107189,-0.186868208961315,-0.310212300747893,-0.647715518796204,2.07188521487881,-1.76171640025885,0.596309901468307,1.32136522112511,0.866199375352612,-0.792865310935251,-1.47466956895915,-1.97470970595862,0.481210882834296,0.701222093740299,-0.50039714712929,-1.12549432940301,1.30696947198215,0.0692254628482164,0.766280297070935,1.33796279501695,0.898354220407461,-1.2698773801033,-0.956425880143152,,, +2.1,2.2,3.24233817634079,0.611332941669357,0.553565138294653,0.740912626542948,0.160484851636472,0.966306683799727,0.0157197654763288,-0.418906835967379,-0.993467023338004,0.952855403270322,-0.0507862328568682,-1.16062067771541,-0.955485158439478,-0.271225065632924,-0.180715228496015,0.298769684325482,-0.113150877809225,0.674209250471744,-0.115937280452863,0.713839866310203,-0.157143374717018,-0.803984616852196,1.03618721076386,-1.22666095182436,0.304425016446541,0.535110611330054,1.13853902418258,0.999367974696372,1.48896681303053,1.42882431838821,-0.191451670763673,1.06738547316907,-1.27084041318144,-0.330614109159349,-0.318905931995561,-0.0639034589228693,-0.350445049432439,0.162081666508749,0.701550573521023,-0.269222796283582,-0.945463021692602,-0.240843103522553,-0.592389210337589,-0.32454427810745,1.02319337504888,-0.266539115563354,0.743055660073062,-0.777314120810054,-1.13555364579478,1.77335238095689,,, +2.2,2.3,1.78052390402475,0.665637714587631,-0.648997178120195,0.954128799797641,1.41385204828449,-0.502812403466289,0.968310287502695,0.91101467821115,-0.572199674137244,0.912254039997721,-1.09754904538959,0.147228911090131,0.0383776154710461,0.320546273692963,1.12977707295365,1.06134531673029,0.602512235233535,-0.297055970641868,-0.336964274729707,-1.86103603615554,0.503710255101245,1.32202116631243,-1.32992339608002,1.46537132363442,0.685250787399239,0.17004623788851,-0.042790270206702,0.944091774113867,-0.336345967584359,-1.11582812548653,-3.20376697872025,0.358617024868947,0.466359430505646,0.63021584154174,1.58981213564031,-0.598604346535196,-0.194186670167715,0.160252896078136,0.755976391028381,0.526185943444232,0.351952584397874,2.10812258597098,1.17952247562452,0.181872981618181,1.19487790332494,0.196802219270225,-0.795725040107823,-0.0813670628146194,-0.161018343450083,0.235357092559411,,, +2.3,2.4,1.66110887942948,-0.669171282639242,0.238791082981945,0.0576994998190187,-0.97045739524025,-0.625648713558978,-0.392040947398715,0.47912679319728,-1.15954530463293,-0.444723564393173,1.51017154458763,-0.884904326863893,0.0505720293967651,-0.303309636250349,-1.82967782137182,0.387245958771402,-2.13812872160708,0.072839052284346,0.0921060823917312,-0.0911599285979533,0.898380471999799,-0.526249926112628,1.19558698015037,0.969765680705507,-0.192868137727943,-1.51635603693505,-1.92422846979144,1.89635828012013,0.624560518950448,-0.246221011762433,-1.54400325325503,-0.137298773758103,0.421647397408932,0.492821551830173,1.3870877899599,-0.590327781524724,1.27611725199891,-1.59339914985378,-0.282554109608869,-0.655996567521023,0.713209895985469,-0.52303567728746,-0.0924481354977824,1.12424704252145,-1.63045814634044,0.258267356486971,-0.554897666380704,0.16136328446575,-0.124360476328799,-0.549251050056783,,, +2.4,2.5,4.2144129802884,1.15898984987893,-0.0844153450190744,-0.415923956983743,-0.177865843083346,0.805532603528472,0.660962307500386,0.769279245139492,0.30274257091051,2.2384881947132,-0.204404715593324,-0.907373757346249,0.0815032706101724,0.549679069629391,0.0153941242673955,0.0316799229228484,-1.31237420042331,-0.848387326916689,0.12566078951003,0.294025729524649,-1.78368059321223,1.53834255027231,-0.32417845149616,0.573747951412659,0.0563033506143221,-0.45843759977199,-0.0659690318608789,-0.762778707863747,0.0465531117516997,0.843511199293728,0.998400993784405,0.12534453477303,0.665143050267884,-2.01125189725731,0.0165900260888228,0.230619309995715,-0.097760200327044,-0.8739763196608,-0.498505472658232,-0.78016319216843,0.0541555843231652,-0.487035806332951,0.325982358570861,-0.529373162591848,1.05252157316922,1.37956010954273,1.81126597562892,1.63851281677777,1.3415173869553,-0.395835128133719,,, +2.5,2.6,1.64945509303401,-0.943806283002299,0.518442408130331,-1.86758987159609,0.563419517709897,1.98880849454813,0.167822442506707,0.939696795995567,0.957763670018228,0.960397965214072,0.674303186177436,0.646109771358858,-1.45706939809679,-1.09270022459707,1.12414813658601,-0.0548237364380222,0.342970589673467,-1.18525568151988,-0.675482305011838,1.62729267632758,-0.291640531599325,-0.47840349262149,0.457483054641541,0.870577313214227,-0.721224674333584,-0.211421172433712,0.106876393679008,-0.719604590553536,1.28437850162297,0.589983443821127,-0.502935041331622,0.288891110097736,-1.09949782151984,0.285138781326583,0.23221497065685,0.0244430722130607,-0.369613395128652,1.48523871641508,-0.401019247232261,-0.201210463412771,-0.799169232524,0.441214035498657,0.150811602503801,-0.689976172263641,1.27124947577614,1.07938635876632,0.74629311413399,-0.629628032288343,0.623020619345286,-0.554008269580513,,, +2.6,2.7,2.74267095821661,0.105328987636752,-0.396652597752965,-1.17520661147774,-0.0920467556319642,0.499021818079761,1.17621837900761,-0.0511456831345421,0.234026363651286,2.08275367409868,-1.6625168393052,0.0304967639095206,1.10773653213436,-0.212429385610628,-0.149985303022734,-1.07752592911075,-0.380523025075435,0.770899987294562,-0.0539998960961163,-0.110282138852179,0.864326522573728,-0.174194827211763,-0.291475882506444,-0.0162377291336753,-1.17835573282497,0.951712346336096,0.391718062267479,-1.73933567256628,0.144549816691083,0.0745948834215085,-1.32807861476269,-0.256265565244772,-0.176818563119596,-0.37585623353079,-0.00496330052164495,0.591117464132105,0.107386092347437,0.256027134157681,0.133555757775967,1.96139700569588,-2.37082732509051,0.275216717079046,-0.487104342274867,1.35625023660206,0.526932865956488,0.538355956868382,-0.883022071885734,-1.27433359665672,1.70343797719687,0.344580833665085,,, +2.7,2.8,1.10599819482375,0.237686255846713,0.389575810089312,-0.42357314693201,-1.5697127920899,-1.18130344829903,-0.474537353410163,0.21754092125466,0.756115468071972,2.41509704931181,-1.63628828754697,1.3024635233633,-1.52399652503083,0.061368969725903,-2.1890136434063,-1.70507987925561,0.00331165686672664,0.0741319526982085,0.721220937977569,0.0265753026951838,-0.638723152733768,-1.31123192949694,1.31303801156959,0.192062225960722,-1.18094929526039,0.262928271104671,-0.139079336118455,-1.80673965081279,-0.581312905582967,0.132667092003635,-0.305509290511996,0.0422474468859502,-0.0622162430143679,-0.0818912919901172,0.0795471459755263,-1.53503922671932,-1.09568190861783,-0.478083259453381,1.07430885815161,-0.926219815267994,-0.979514541691635,2.82062839696617,-1.80974199682299,-0.727729198249089,-1.04255250763512,-1.08426631652103,-1.39661976827106,0.363835609024638,-2.08799866608004,-0.0703183201969761,,, +2.8,2.9,3.23628638516357,-0.524234451568147,0.357667308557918,0.226220896928561,0.228399918268658,-1.39852263854515,-2.85926196102661,0.287948519947749,0.234972759232946,-0.15751905583906,-0.126263813909429,0.393895889734945,-1.59995691732761,0.821950331886864,0.942984216497974,-1.34939928982119,-0.317975140563889,-1.88453080321454,1.61781787045376,-3.19935100536208,-0.72779542665994,1.40163022950578,-0.881671115674016,-2.5937032724123,-1.6294249814381,1.97735867406683,-0.28841888620391,0.138567992185448,-0.208531413485633,2.35174016965935,-0.212575934186355,1.20033459199205,-0.809834121624679,-0.814571086128561,-0.804256508506296,0.486135360016604,-1.38226305141847,0.488812788692303,2.07070275715958,-0.127237250550859,0.214354832595851,0.65845721303472,2.01756523803506,0.357082435071566,2.2600868489938,0.699568890561675,0.346368826321668,-0.0750746044920143,-1.53383571481332,0.223863784801219,,, +2.9,3.0,0.379596496393281,-0.445807282790103,-0.181181655990299,-2.1290714394348,1.0047830962631,-0.862784781268212,0.339212363564143,0.504844509995135,0.130668088226239,0.255920303674645,-0.0797566577461414,-0.650352862835467,0.530666970519608,1.54024666448574,0.0580229399848478,-1.05283397579991,1.51267922226895,-0.712964510711093,-1.70352662244298,1.22623513633027,-0.927269105123236,0.615835182518445,2.20892273231957,-0.0726308362325351,-0.266315624357186,-1.02098821580133,0.199836806404051,0.664043859159181,0.997514218296064,-0.52791373286299,-1.2072954979183,-0.31849279568277,-0.381189684390601,-0.949856501813098,-0.340319634467726,-0.231545343146002,0.231219459130344,0.876616515272772,1.42976090587133,-0.0339603499085388,-2.20355494273046,-0.131839907176857,-0.0559721527756556,0.56882218677041,1.27168044162329,2.5792700875897,0.355753148367243,-0.193920486746723,-0.995100829461892,0.573162251370111,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/class2rot.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/class2rot.csv new file mode 100644 index 0000000..0dc0d1e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/class2rot.csv @@ -0,0 +1,30 @@ +Time:1x50,End Time,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,V 1:,Event Id,Event Date,Event Duration +0.1,0.2,-1.41232437907546,-4.38221566333654,-0.589097699064319,0.217372153255027,1.27685520628543,-0.756778481698309,-0.543962016747266,-0.187181516773856,-1.58507038797054,3.13563802128473,1.91172848200559,-3.86922895374677,4.12192248984278,1.45303296714151,-0.656269348110641,2.37407036184574,2.58975534728869,-2.40859466417441,-0.617070760407336,-0.304654607987442,0.984240355760732,6.97482380197961,-1.11771787282909,-0.86525116147396,-3.23825575513482,-0.538260960885557,5.49599735857233,-0.164809703737508,-1.27860257610813,4.01751415924776,4.74927678631869,1.88634276049864,2.12067929110647,0.399126112513965,-3.10239276974533,1.0629811449084,-2.60833706563185,0.284012867924059,5.49759259653058,6.58112241867482,-0.192683715345061,4.44602723389523,-3.07100252473818,-1.6052712435052,4.00766074970893,5.78511623305967,0.634161961205727,3.12744389732379,1.42603298182921,-3.16319555524887,,, +0.2,0.3,1.23025167728829,2.55042197348026,-0.996797522796963,3.11806930521677,0.399136455645935,0.56095615427698,4.59284506207901,-1.84567236703288,1.8816965753032,0.750729173641131,-0.829389368162276,-0.487405081904131,4.91804790857892,-2.1543740276208,0.26684094368407,2.67856896870312,0.691289502023455,0.987665148165264,3.78934998772079,-3.34374902882119,-5.44868781295565,-2.02522881313808,1.46967805316524,-0.404231945768228,1.36218718246369,2.32809332192605,3.46211643962893,-0.0935594029982055,2.55546097585287,1.8285128290357,-3.33242202454528,-0.81647528277583,4.78109928979897,1.31043910420667,-4.26628298568948,4.28910480462471,0.530555688570553,-0.474160971125616,0.53544116203418,3.56379070526742,0.0519593475829907,-3.03383843699085,-0.345415155244719,1.34779086652161,-0.593473775123416,-2.14076326226118,-1.00822931767497,-3.22067324001478,1.29926372514046,3.04170584248838,,, +0.3,0.4,-1.27952659735789,-0.678694034794376,-7.82905738068359,-0.453899386644462,-0.753031099492228,0.979661086218665,-0.145265745943201,3.3305149026421,1.40553600310107,-2.71025217679511,1.91691429643109,-1.66337966276611,0.491278647558013,-0.217054613705415,1.30642053034477,4.42155452174562,-1.20798772143527,-3.99764898858139,1.16793671123473,-4.00477404985,2.85824304874785,0.0389253585144361,-0.561022996231375,0.953884500494647,-0.581119570114544,3.66788193041374,0.937030386226416,-1.85477673926392,-3.50829167417705,-2.29384068911566,-3.01630266121275,3.70404305303742,-2.99212185026577,-0.805293998539477,-0.197505568250145,-4.06364555944777,2.20829484109197,2.21595280420013,1.46393840866214,0.463084322420088,-0.0925093216843882,-2.03260255466236,1.18708012237896,1.21157092378972,0.362154361384203,1.39296797924311,-1.04406256191426,-1.62062237565984,0.351120592419513,-1.00927590927613,,, +0.4,0.5,-2.09063898202145,-0.885281257588577,2.95731628011309,1.00726807670656,1.18387334367457,-2.55830621315147,0.328466116650074,2.70320901698313,1.97284271456488,0.81107860874752,2.09099386575403,0.3555519090344,2.37598172887946,0.66818278902417,-0.190371511963837,-3.343388865518,1.21793902737849,0.0984098117557504,1.11595575053085,1.36701904711547,-2.28258562180032,-0.560253392047431,-1.59159179981677,0.56780414999771,1.33190662675105,0.639266075327812,3.70709664830959,-0.507385000728346,0.475155225763881,3.10663479560096,2.25207747584878,3.4745549102939,-1.44545077904603,5.65483928695995,-2.25683275445989,1.68259107985316,0.661591836783155,-0.457201675623602,2.05726753879515,3.16098266017121,2.04449928381376,-2.19163282650609,-3.50026559979492,-1.53775220398596,-3.73802650641534,1.62864227404371,-3.78922329429375,-1.82410237974745,2.288643534796,3.24115982383583,,, +0.5,0.6,-2.98522799710803,4.36673455162735,-0.913239491117599,3.37091298095012,-2.85566029410916,-0.240479200085136,-0.0912376280480195,1.91082754809618,-2.21321531259226,-2.05032531808526,-0.40695956382635,-1.27738678943432,1.73181147069958,-1.33457987938084,0.641156726971704,-2.34938281658383,-1.35937565189658,-0.115081669604994,0.442052347494917,4.82608960749163,-4.77444037931449,-2.00083972335266,-1.99839808817676,-1.97880121135913,-4.0278099493376,0.45826619586843,-2.86175180125398,3.003887735408,2.08768815172436,-0.175604692890707,-3.89226036160365,-1.66556725296722,-1.75134329758897,2.15598722351507,0.408689902307966,-0.595924197768275,0.638198078041635,2.36876727660785,-1.55762956391767,-1.06095325198528,1.50573831504874,-2.04130812607458,0.660258593931511,3.4896733702911,-3.32855687979512,1.24703499718318,1.19952647235344,-3.10247346356164,1.24474651415173,1.67934846815462,,, +0.6,0.7,-1.15658088905979,-2.23235830634288,1.50436241827814,0.0526692213027273,2.0198785602985,0.10578780244313,0.189999063495495,1.47025665787305,1.38649214334925,-1.93419764299863,-0.918027002619115,2.59694632721724,0.30028812139129,-2.53964587566085,0.0370193604133886,-1.33547475687044,-2.98158175293884,-0.31318076115017,-1.16007483686783,2.93468359379349,-0.937165509062934,0.0895422263395593,3.12715890376222,2.0152844514168,-1.77056204656165,-2.23384358328873,1.91737015795644,-4.69067255566191,5.71707274836576,-0.622744985301739,0.92941364429288,1.01513193551207,-2.17831879408022,-1.45710660800518,-5.98274644022098,-1.79283910736022,-1.0662345980025,1.22595128536558,2.42167427418027,-1.48194213486215,2.18829385078776,0.198953449834362,-4.72694901068695,-1.29902767589321,0.804746364108259,-0.686429215723727,-0.83291212587698,-1.24093394299829,3.27279310614253,1.7478608376101,,, +0.7,0.8,-1.25358500769904,1.35794652211513,2.56427712370512,0.331694030331151,-0.610145896441222,-5.06185443991055,1.62811621493617,0.166683579229065,-0.991576105509301,2.49436818212971,-5.05822778553097,-1.19484897136277,-1.80096731156371,1.00965637987569,1.48637877798285,-3.25243735341964,0.7602695903532,-1.55570913957909,0.803710614119578,2.20270892356598,0.271082479820789,2.67826597331098,-0.167156401034695,-1.0189606868846,0.698173219597948,-0.553865581931714,-2.07028897360437,1.66540144781335,1.33019904765178,-2.86659170314343,2.55644987075593,0.332285698926189,-1.08163157358189,-0.0664648801325007,1.26660556815642,-2.28412146640259,0.109061078243492,-0.764479323044105,-2.00358010348985,-1.86275645195572,-1.82398665296699,4.24123772073239,0.53850492318425,1.22178375019037,0.138526415183611,-0.0864866024316983,-1.80822412833675,0.846863936662275,-0.25957287145996,-0.755333141671768,,, +0.8,0.9,0.0400239009034142,0.31877160410125,0.772324632442131,2.04794057956307,1.66442407777497,2.43184966430293,1.11512625379363,1.84801178709294,-3.41957677452621,0.893293180458025,0.977108503724518,-0.634949907966531,1.20658952859773,2.15951702360555,0.257475150245731,0.549636118504802,-0.408784522780224,-1.45843672790158,-1.32949286448782,-2.23800289360708,0.390721576507646,1.89140133442457,-1.10736057581823,-3.657168147283,-2.76062421568351,0.0597087776668026,0.577691945950767,0.232170836044584,-3.77523472579614,2.986557137518,1.07605846302119,0.114010759463974,0.856826264183817,1.97154579006937,2.30060876816591,-1.94551170510611,-0.943304530791566,0.867919966889015,-2.68715114322971,0.0147172973718559,-0.615790646620068,2.20137399584509,-0.952862526341853,-0.691051938273551,-0.708546423768488,4.56359712401853,1.03046342125096,-1.08013320119103,0.567239139230345,-0.650774391296837,,, +0.9,1.0,-1.46503679137344,-1.49213241036758,-0.99320737892599,1.6244749375569,1.35225824287811,-0.657725478908601,-0.0450954076330051,2.48378605775998,0.945999913983723,1.94296108399823,1.63625088609024,1.99593756618544,-0.0320278617168418,1.77802523558196,-0.0604864808228987,-0.274496590416412,-0.0198818245146311,-1.36886516477305,1.61964372472403,0.732472141160006,2.39337757792445,3.72602731849955,-2.57768731426988,-3.68714735730894,-2.36053394479404,-0.65158842351975,2.59757289348601,-0.298075334143069,2.7152734126952,1.41470919393573,1.03091218814005,0.620929744990655,-1.05007917964554,-1.58464385779122,1.16235950298532,-1.28801628865518,-1.26706415660331,1.99656577214933,2.79492268601702,3.69527352720757,1.80217382050355,1.29722077369995,2.27910850195407,0.142482417103059,-3.75204527653695,1.03229407502558,0.877277456867889,-1.69995155354368,-2.67786462947105,-3.329591798966,,, +1.0,1.1,-3.31763380566697,2.39203616550534,3.45822524468127,0.707536878709489,-0.196790989720546,-1.65136648162632,1.38420796359217,-0.870229631454724,-2.77591770862265,1.78954903070472,-3.52388381888171,-2.25825414194062,-2.41385824035081,-2.92887971112554,4.22629706785009,-1.34162907002301,-4.17892038006087,2.97083755394025,1.27393531600851,3.5629509726942,-3.95979478720083,3.5736487779145,1.04052703866236,-1.13032019431616,2.42975870536696,1.96710725632097,0.484374050055673,0.269765192726298,3.14043085744899,0.59092120740701,3.24016804205636,2.01896113901305,-3.63252419365971,-0.870377620904804,1.73695765871405,1.22568720810474,-2.2857952346332,-0.951517315251112,-0.815608303222192,-3.71122564975411,0.566161527775791,4.43986756329715,-3.38023306933696,1.72497791801079,-1.39959140291067,-0.701878951276849,-0.788386244254526,0.187838240305984,1.36323750776444,-0.0517027805738488,,, +1.1,1.2,0.00294251269778084,-0.228599613389657,-1.23427211548751,-0.191181971944222,1.6041558310856,1.66836823762611,3.69995309783192,-0.234482805840524,-0.214455559533649,-1.78743324878138,3.09245627785752,6.08583811847784,-0.23650277847394,-0.327005658625549,2.17109141838304,0.794061650181908,-0.0282302573042368,1.39100521799944,0.689400652808229,0.302108937613976,0.571736577620463,1.09787785309722,0.218553665007896,2.34796958033908,-1.96620903664443,-5.55043155867659,1.34141348171962,-5.19920537673989,1.71439165968605,-2.51206533605387,2.08304646886491,0.597952651756358,-0.709847636643395,-2.98602762315499,-0.226510993485331,1.09401815694868,-0.925219523831217,0.671545098856139,-0.728688357271658,-2.02528701480992,4.0031863413811,3.61672973367981,-1.18455320924896,-0.813437963326547,-1.35048175492362,-0.690953206301008,-2.00039504385881,3.10102214061032,0.0429218250142522,-1.21434706883531,,, +1.2,1.3,1.84958201367322,-1.00481108086674,3.08780803669978,0.0296988303804707,2.44759575996005,0.0034027154071001,-1.21495711483478,-0.71193003205416,-1.51482916652321,2.09989741763963,1.25281538022842,0.460287897859289,-1.38930725666937,0.726731324074365,1.02715302835589,1.55977542589838,-1.1048958969477,3.2925250939511,-0.646936882463826,1.26900162104335,0.953368239365401,0.677720370299007,1.07970244577731,-2.09388671690298,0.650490771778257,0.434918917674436,2.13235507969008,1.00174064320083,0.449892677398025,1.14304722864807,-0.684002851445322,-2.58437391853044,0.753222622753823,1.10885193485282,-0.494308828491774,-0.0360895391041974,-0.33304224917097,-0.0927606892121839,-1.24300315438234,0.91411708803711,-0.936753693307299,3.42198952136922,-1.15082992450971,-4.34234945597692,0.178846293671331,1.6160852052275,2.21631527901358,3.80187567688086,-2.36968240231566,1.81203633517944,,, +1.3,1.4,0.56660644776425,-0.0271230021080172,4.43310066549021,1.09613235217935,2.99186990209512,-1.08631811992788,-0.772793861352253,-1.47260513142128,1.00778854071732,2.5280581478466,0.657603420306527,0.632076978992156,-1.46284144459844,0.996180032441916,1.07079743515669,-0.536993699243975,-2.57159938279999,3.36399733584398,-1.74013840754709,-0.766955737425094,1.61145659399616,3.29766522554713,1.26923475994324,-3.1825762310479,2.63224093595566,0.722463029887448,-3.17371485850347,1.81159309517182,3.14169342900623,-2.42622980860964,2.6328555123511,-0.752313157323256,-2.69469059643352,-1.27495427353956,0.247655278036003,0.0445661153797095,-1.44591633219888,-1.05610612775835,-1.25503523033866,-1.45633172667776,2.71201689412899,1.64600107063596,0.746398736023923,-0.735808163797691,0.725745262556987,-0.318530018656508,-0.154649782968684,0.267183053799668,-0.951154510576489,-4.24360665935723,,, +1.4,1.5,-3.3185886967884,-0.76691156951287,-1.76762226282636,-2.3313814360203,0.990354081415756,-0.499567621999231,-2.45781909589062,-3.01774207261569,-0.869335061361338,-1.77929549105591,1.11348984399329,1.5920059460526,0.491991214618287,-1.56178947748258,-2.7409203420492,-0.840128318821629,-1.03051552746483,2.03683225856635,4.09431992205192,-1.54990142639776,1.26818146608216,3.18665778106475,-1.27504415799283,-1.43719056147623,-0.776689365041736,-3.02207982719896,1.5314427842767,-0.323042625317928,1.47042429871633,2.16345164447118,-1.04753391793687,-0.712379856494644,2.36767700396589,0.119191902385424,-4.41287148750215,-1.46406521693758,3.3836865734087,-2.15517623199179,2.89935581135562,3.19400039911001,-2.31514106835062,2.782825000743,1.12838641260009,-3.7994169520939,3.37034689638179,0.605619706707026,1.22351285318196,0.296780812019547,-2.01200487292807,-1.42337275915205,,, +1.5,1.6,1.51121177930002,-0.468153149892247,4.79621881641431,2.15282049256067,1.36000831895153,1.76461888875732,1.03222347694678,0.646095282626219,-0.802694752287815,-0.151848120127994,-1.29763769415122,-1.19582116862269,0.292078938845926,1.12052845666294,1.05980354314239,-0.222680486647928,-2.94026152325142,-2.34589941743966,-1.38620632144066,-1.06825962413843,-3.02020634017001,-1.47364362486126,1.39833701738049,-2.06651370098612,-3.21539722748519,-0.0802052408204153,3.2664377116934,2.33387514345511,-1.48837266028941,-0.0929710542565618,-0.553619747879515,-0.389516447679783,-1.69644208037309,-0.255359141833334,-1.41719160078737,-2.09144249761817,-1.42546166259595,3.34341916424844,1.55316101221632,2.16297385671399,-1.73176061173602,1.78400745223146,-3.94654132491128,0.357944442986356,1.20550737036747,3.66213203292596,3.91998029002927,-0.804156105341732,1.99727326786523,3.19329695523194,,, +1.6,1.7,-2.77318492310507,1.30127588425824,-1.17671067832355,0.382990853975427,2.12076124111223,1.06910861031852,-1.24187293035933,2.52580927376997,1.25057970086451,-1.41421797803869,1.64960160736037,1.76526785000459,3.99433902973274,0.209237703287374,-0.437649523412842,-0.242346770775713,4.23972254017372,-3.41066656430198,-1.88746153755346,1.38626872395904,0.837088538977375,2.35358453055453,-0.876969294180495,-2.75773199738558,-4.36612766651864,-1.25701670648561,0.548810492648368,0.432597609701371,-1.07663558048454,-1.12579545156523,-0.823239311271533,2.43783245482838,-4.51670104679146,0.411440190589157,2.64663542886705,-1.5002300985206,1.4862225806374,3.37428364348244,-0.161900927454004,1.39604422571105,0.994496861275975,-0.363648150051651,1.50597340197581,1.51854811620162,-0.98293570356039,2.39090297130017,0.635835880055919,-1.65326330162276,-1.36407235177857,-2.05144541966198,,, +1.7,1.8,-1.37956416751984,-0.0195674146216682,2.23265516009393,-0.258705713944022,1.33373683263979,-1.62855452122211,-1.18985493483261,-0.648076731558928,0.706670861441087,1.80753065725883,1.69538928333015,-0.367144522208532,-1.32969006729146,-1.85443872184972,0.865544584170506,-0.106527270263076,-1.5583859920028,1.71799187438944,-0.39205601098304,1.14305287469714,-0.398503758068568,0.763849087010321,-0.688670318523366,-1.45466384955709,0.12563329896557,0.00470472496464156,0.830340963919348,-0.610215658805861,1.28603825559476,-2.68401980688577,0.962085063837756,-0.302804796370285,-0.420205078685492,-1.67591717320937,-0.416010842491834,0.513847546434064,-2.02218374671912,0.156465691490543,1.95252284987379,-1.07024115411877,3.75328579537804,2.24672478343153,-0.930914149121089,0.761001433620736,0.948064206672273,0.406374258701911,-3.74709839139581,0.530462182954344,0.888379711482461,0.630065677054879,,, +1.8,1.9,1.54694877841666,-0.847823334702446,-3.76968708744548,2.3448506546552,1.14606108268797,0.374643319372579,5.86764477191342,-2.09939703937804,-1.28750530969492,-5.3037918545851,-2.45380047334452,-0.260076791256238,1.07683129920361,-1.76978186721982,-2.12839619509946,3.84227782428045,0.961646084423603,-2.00217523089889,5.67096521048264,1.26045695149155,-1.36717343148684,-0.684436710914471,1.25315244337001,2.40677908375336,1.37950772243836,1.81136985471315,0.559169652967571,-1.69873047103125,2.42842137130187,-0.852701958637376,1.1645637132616,-0.0929904937968398,0.0802355538008128,0.213487033080293,-0.377925229261292,3.25272997333102,-2.8379898305251,-0.425302037842293,1.36067842014039,0.758598554561745,2.2909675487736,-1.68123838102379,-0.800688843608186,-2.44557914020732,-1.58435638274633,-2.59658895981263,-1.65759052294503,0.473730310219512,-1.24085571535322,-3.71010952766359,,, +1.9,2.0,-1.22082506564589,-0.497338882505742,1.32074608444538,2.50204940754068,1.22355108646505,-0.223747709466705,-1.29903826236884,-0.776214386781921,-0.869292634200802,-1.39368761174202,1.57072616553869,1.76632079215019,1.96488421257976,-3.13788402021873,-1.48732326794496,0.107737385980569,-0.452735194797825,-1.0235245022967,1.91664445196357,0.869088262800819,-2.25438754359147,-0.926588812084567,-1.30534895407157,-0.231066756337278,-1.47134681589392,-2.25875973891762,0.269798180715215,-1.64807635996559,0.370329611762003,-1.94914930701637,2.59870428865079,1.872881204141,-1.21291157388318,0.868256004274856,-1.75976752568427,-0.152740673861283,1.15850450707281,-0.081505341478509,2.19947862016223,2.69132682922351,1.95669473360073,-0.261615218703724,-2.80603507444815,-2.1625902053865,-0.776019717215764,-0.137477839722539,-1.21880508824945,-1.1310034827153,0.639458777494653,-2.33763961409578,,, +2.0,2.1,2.97682103159632,0.6637140745606,-0.171246714518869,1.78118161753372,1.42971089741128,1.21322144784784,-0.337156035891973,-6.37217212692342,-0.107169166200335,-3.52650997379181,2.6613610585236,-0.531735158719905,-0.575845429664075,-5.81999952036502,2.06616840611659,0.563273770293763,-5.0739196537086,1.91628468806411,7.6178727717803,-4.48273533469124,-0.05973725159027,-0.929764351705911,-2.28640224137518,4.06146544705906,-3.25356792421827,1.39491986299245,-1.44270701561409,-0.263905053942344,-0.508713086352647,0.173478094095145,-2.41613816466446,-2.01634345926973,3.7917836534071,0.188440363711339,4.24927579304243,1.62435822095484,1.83068308249619,-4.01401607018206,-2.31755014196848,-2.25456581351344,-0.135258920097315,2.12853169751258,-1.21382552024341,2.41486231616609,-1.85747887951972,-4.6636570064605,-2.21071529052012,-0.533756910476013,-0.0186583034918115,0.910351723421371,,, +2.1,2.2,0.588846073485853,1.19602205999125,2.70810712036,0.831386412814,1.83093545202126,-2.14027537177742,1.96010700949098,-0.886830278659494,1.64721049327601,-2.36176100099554,-2.09165930665075,-0.830893661036872,2.35583540764596,-2.27782133924736,-1.87093956597154,-0.0242347183995278,1.02665760994215,0.392422113169452,-0.666206933154701,1.63775677668632,-0.749262976184406,0.0111246674287723,0.532988161523799,-3.56658105263342,0.476882709052065,-2.21183032290678,0.600723809698169,-0.77938109579893,0.902018212241312,1.35125935098703,1.44957541690666,-0.242690523237852,-3.06710692364147,1.13879802976562,-3.49146152278356,0.0927441390592058,0.524061483991716,-1.92698854877169,-0.491911217126778,1.65744121338439,1.86609313043487,3.13129690099302,-0.0517538683188628,-4.14443518707577,-0.793033613594441,2.22087669233407,-0.326310749094584,2.00759981178538,-1.28032083035844,0.15948486849958,,, +2.2,2.3,-3.38568356387666,2.03477565940673,1.26998567426876,-0.611960142198271,0.854631568568371,-0.664076332375726,0.178130196776701,0.803290032145864,-0.758903309013727,0.0835379883108125,-1.3483867877042,-0.635201153363848,0.898468982416352,2.80131320329932,0.572447911995825,-3.92727992847732,-1.03632340695166,-4.73067469695904,-0.71716919925457,0.894201156962548,-1.08745999142748,2.85569279102193,-2.29551544369771,1.80870797768336,-1.20248105884086,1.94046425522815,5.83472310467492,-1.17217761141632,-0.209134870713454,4.46056834982749,3.21039521462341,6.95145666192604,-2.1999983832633,4.18409136049878,0.759472200547565,-3.15556210903395,-0.149957644994364,1.44555265724796,3.41767152095492,2.72717917495781,1.81743146992586,2.04645242113262,-1.90939006755421,-0.283607025409339,-1.95904975974213,0.0393427114585407,1.26777581206735,-3.32550464822513,0.989870077761044,-2.4501294195438,,, +2.3,2.4,-0.488198592624695,-1.09254712691361,-1.32228710895179,-0.606907075002112,2.85388559859612,0.218202616488629,-1.63897896152918,0.575150041859665,0.332533518879666,2.36028157651246,0.755716148145986,0.533852075219828,-0.900812477131349,-3.97730550017679,-0.339745321692641,-0.252976691270395,-0.466849449636295,0.815110684326396,3.62693898633812,-1.29983249663371,1.5706496761355,2.67446195442727,0.755777803867609,-3.88319565260341,-1.54793753100892,-0.181372925213423,-0.673153867750792,-2.01996503825753,3.26148068480058,1.76798432580635,2.92194843483694,-0.144258970086289,2.21646972211498,-0.28735536300575,3.13649910605972,0.342111101114112,-0.0576749910988138,-2.19579095362317,-1.03773792885122,-1.73266640580466,-0.208102014787992,0.140591231512377,-0.652950085011339,-0.182458132134831,-0.448539290312923,-1.11077781538217,-3.25661036951738,0.298742657140007,-2.90603968139518,1.23778277137667,,, +2.4,2.5,-2.15616386953233,-1.33290795915105,-0.557059335774373,0.339951114852152,-0.563733461702318,-2.28853971255126,0.516912138214922,3.11239609193249,2.89459048370558,-0.58382756269164,2.37843875782424,-1.9465415396898,0.178480224102955,-0.337222683261412,-0.536147078286055,0.236404204634036,-2.94015374783926,3.43308769757597,0.0783730745712926,1.02452363082663,-1.63833401862295,-0.37754522690096,-3.71427363184686,-1.56768211139015,-1.58126090995035,0.35700991362944,0.00835129455646182,-1.70804837241887,2.83189624931246,-0.562202174380604,1.69740319747029,0.371537977973951,-1.64109915453121,2.75301861553217,-3.75624723825591,0.935106025763558,-0.376050115589752,0.741772993495607,2.31980584994586,-0.48179954023363,2.12401167834398,0.95643758423328,-1.08008990753712,-1.13661064540939,-0.924179562618883,1.82165472441751,0.735168431591556,-2.4869834321712,-0.410542732285207,-0.551625773999562,,, +2.5,2.6,1.37881296061145,-1.12914415664187,4.7758841055428,-0.136501855561357,-2.04927775420084,0.211728298887886,1.08877077520669,0.220850415254667,-2.07719035779118,2.25985244843422,3.35775657756306,2.64376084838762,1.35848609459951,-0.686816499907193,0.815818841707736,1.93315278514834,-0.213793653630425,2.27270157783792,-1.10086098246545,-0.366636677079596,-0.62742633956824,1.48066716399762,-0.997929740806428,2.18373137555264,-2.0157409963734,-2.13233486433797,-0.774990201258137,0.336727407015108,-0.526170993671044,1.97193608205678,2.79633738099436,-0.93930201152594,0.0493858891360088,0.704588765216077,0.518427483018597,0.184342880606744,-3.04653018271994,-1.93001848923548,-1.60902344388626,-0.0337993154813671,2.24483484094204,4.76376353373781,-0.602664215487312,-1.96549789560035,-4.0013876150368,2.37504570758208,2.6638596332302,0.541782527135,0.0380511191766738,-4.16424548251387,,, +2.6,2.7,-1.3329959701647,-1.18883802893281,0.560686680689653,2.12838566891993,-1.72826297660466,-1.47573712641656,-0.529400742178531,1.95199596166756,-2.61264403010361,0.058008696847583,0.509044040721609,1.2069432724943,-0.483995828831695,-0.847697450869864,3.10816193376628,-0.846540966624373,-3.6337988961162,-1.2394880741945,0.995963402213537,1.41958397060607,-2.91162001343447,1.22533412259867,-1.35171621449816,0.783412916721203,-1.46120423404449,1.03426698606251,3.93281118222532,0.987472874345992,-0.241856742234803,2.23337929619378,0.362529607431243,-2.13529227782332,-3.43959686240657,2.29826097570196,-1.3296066070049,-0.881038673309384,0.34133576670169,0.0287484638451527,3.94802608286607,4.06767664745933,3.56051485207831,0.47455853601654,-2.45320593567447,-0.800554127545072,2.45513137004464,5.39687720939536,1.34001090508905,-4.96858725220808,-0.894968766925007,-3.16570419725118,,, +2.7,2.8,-1.88031953510677,1.08273742502546,0.289096226186868,0.145442968351952,0.840005415092104,1.62217493278532,0.439479269304948,-1.70091727510146,-1.63862280728423,-1.62022878351422,-0.835354535882028,3.50367835226417,2.26631918545743,-0.445512550837549,1.41280140659686,2.53506482093936,2.798295795401,-1.83915296130029,-0.484995151124497,-2.60304021792617,0.557821899682088,1.81434082934347,1.60635932454516,-1.91409589083802,-2.62086186932772,-0.969964225780648,-3.7339674125233,0.354753396626877,-1.49512297512331,-2.63656250448595,-2.5903194092648,3.10438709079862,-6.2840082271021,0.0955553256654889,2.07253177710775,-3.83953381431878,1.75738799012675,-0.801417604398757,-1.2199005804177,0.542999021690137,2.25563232832019,1.77447944089314,-2.91550509519634,-3.77081899323202,-0.21100977834489,2.43657671269048,-1.77221947025634,-0.0110825738723026,1.87794630096308,0.214687098906287,,, +2.8,2.9,0.887297082996313,-2.98320378743449,2.9928511278737,6.78204774526589,3.32840930827169,3.40549253368447,1.65617552414324,-2.41635347548855,-1.7436179599396,-3.72273092079473,-0.231783232475308,-1.29429084285747,4.28436105903319,1.84107283325842,-0.280869343591292,-0.228307163277049,-0.657884021974231,-2.75724758408696,-2.67989886086249,2.84935665597603,1.92378770822667,-1.91987729012316,-1.7331414962177,-0.232113221169467,-1.8427199560257,0.0705790707590537,-0.949689569467352,-0.253576192866496,-1.95468846615996,1.08025449994452,0.429449652157862,2.14334880861348,-5.56355396724729,4.03173406805506,-2.79465914024831,-0.870818234610577,-0.671051903499333,0.944317732177208,1.05030006790658,0.677226234574206,5.48815639900187,0.305304178613231,2.24419422180127,-4.36391219394466,-3.83695718903544,1.90663421245902,0.112376343535206,2.84732141005798,-0.573021738179849,-0.0149907763591499,,, +2.9,3.0,0.998064176968434,-1.14973366903289,1.83976122422861,-2.85683916955725,-2.85966339505963,-2.94074424162789,-1.27050108286986,-2.60104662006269,0.696816132825509,2.80529156470863,0.516780865160611,-0.583761148071988,2.75198431550269,-0.56886907769016,-1.34360919908592,-0.629229295679807,3.16683411945325,1.57823058453391,-2.35940632365108,-0.241013836344989,3.48188419823192,3.21613458019436,-3.71401529146625,0.255398147149734,2.46816949123091,0.12021953833055,-2.1728488261266,4.61660248893364,-1.13519660356753,1.69130597349401,2.54997349492956,0.470184758609311,-1.29553526038967,2.08648663420679,1.59280173455874,0.533450391850695,-0.368246157075794,-2.41228341183792,-1.03706268207785,0.149123758242417,1.02350465346359,3.78710781674726,1.89465489141229,-1.4585107455624,-1.94916767105757,2.59893995597665,-1.52616094249858,1.76309349603794,-2.24243015050549,-3.06566699250248,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/classifier-training-flipswitch.lua b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/classifier-training-flipswitch.lua new file mode 100644 index 0000000..7c2bde7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/classifier-training-flipswitch.lua @@ -0,0 +1,43 @@ + +flip_count = 0 +switched_flip_count = 0 +flips = {} + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + flip_count = box:get_input_count() + + for i = 1, flip_count do + flips[i] = false + end +end + +function uninitialize(box) +end + +function process(box) + + while box:keep_processing() and switched_flip_count < flip_count do + + for i = 1, flip_count do + if box:get_stimulation_count(i) > 0 then + + box:remove_stimulation(i, 1) + + if not flips[i] then + switched_flip_count = switched_flip_count + 1 + flips[i] = true + + -- io.write("Flip ", i, " of ", flip_count, " switched\n") + + end + + end + end + + box:sleep() + end + + box:send_stimulation(1, OVTK_StimulationId_Label_00, box:get_current_time()) +end diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/createData.R b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/createData.R new file mode 100644 index 0000000..a01be0a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/createData.R @@ -0,0 +1,42 @@ + +# Creates some toy test data + +# note that for openvibe .csv you need to manually add the freq value as the last item of the two first lines. +# its not done by this script. + +nExamples<-30; +nDim<-50; + +# Gaussian data +a<-matrix(data=rnorm(nExamples*nDim),nrow=nExamples); +b<-matrix(data=rnorm(nExamples*nDim),nrow=nExamples); + +# slightly overlapping classes, dimension 1 is the only one that matters +a[,1]<-a[,1]-2; +b[,1]<-b[,1]+2; + +# transform the data a little with a full rank matrix +tol<-0.1;go<-TRUE; +while(go) { + r<-matrix(runif(nDim*nDim)-0.5,nrow=nDim); + if(min(svd(r)$d)>tol) { + go<-FALSE; + } +} + +# add the time column required by openvibe csv reader +aPad<-cbind(matrix(data=seq(1,nExamples),ncol=1),a); +bPad<-cbind(matrix(data=seq(1,nExamples),ncol=1),b); + +write.table(aPad,file="class1.csv",row.names=FALSE,sep=","); +write.table(bPad,file="class2.csv",row.names=FALSE,sep=","); + +a<-a%*%r; +b<-b%*%r; + +aPad<-cbind(matrix(data=seq(1,nExamples),ncol=1),a); +bPad<-cbind(matrix(data=seq(1,nExamples),ncol=1),b); + +write.table(aPad,file="class1rot.csv",row.names=FALSE,sep=","); +write.table(bPad,file="class2rot.csv",row.names=FALSE,sep=","); + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/shrinkage_lda.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/shrinkage_lda.xml new file mode 100644 index 0000000..6a39bd7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/shrinkage_lda.xml @@ -0,0 +1,1032 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00000b25, 0x0000761b) + LDA + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_TrainCompleted + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/alg2.cfg + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 544 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0042c801) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000267d, 0x0000641e) + EBML stream spy 2 + (0x0ed76695, 0x01a69cc3) + + + (0x434f6587, 0x2efd2b7e) + Spied EBML stream 1 + + + + + (0x330306dd, 0x74a95f98) + EBML nodes description + ${Path_Data}/plugins/tools/config-ebml-stream-spy.txt + ${Path_Data}/plugins/tools/config-ebml-stream-spy.txt + false + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Warning + false + + + (0x2cdb2f0b, 0x12f231ea) + Expand binray blocks + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of values in expanded blocks + 4 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x23ce0a10, 0xc2eabb47) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00020816) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002bd8, 0x00003d85) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 672 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00e29f9c) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000037a9, 0x00003831) + Shrinkage LDA + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/alg1.cfg + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + true + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 480 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00451330) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003e59, 0x00005a5c) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x544a003e, 0x6dcba5f6) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/class1.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00003e59, 0x00005a5d) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x544a003e, 0x6dcba5f6) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/class2.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x0000462c, 0x00005b2f) + EBML stream spy 1 + (0x0ed76695, 0x01a69cc3) + + + (0x434f6587, 0x2efd2b7e) + Spied EBML stream 1 + + + + + (0x330306dd, 0x74a95f98) + EBML nodes description + ${Path_Data}/plugins/tools/config-ebml-stream-spy.txt + ${Path_Data}/plugins/tools/config-ebml-stream-spy.txt + false + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Warning + false + + + (0x2cdb2f0b, 0x12f231ea) + Expand binray blocks + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of values in expanded blocks + 4 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x23ce0a10, 0xc2eabb47) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000181e1) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004898, 0x0000252c) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002d7b67) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004dd3, 0x00000d20) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Train + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0039799f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005815, 0x00002519) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002c9082) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007e01, 0x000060bf) + Wait for all + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input(1) + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/classifier-training-flipswitch.lua + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 608 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01921035) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00000144, 0x00001d44) + + (0x00003e59, 0x00005a5c) + 0 + + + (0x00004dd3, 0x00000d20) + 0 + + + + (0x00001495, 0x00005100) + + (0x000037a9, 0x00003831) + 0 + + + (0x00007e01, 0x000060bf) + 0 + + + + (0x000022c7, 0x00005fc3) + + (0x00000b25, 0x0000761b) + 0 + + + (0x00007e01, 0x000060bf) + 1 + + + + (0x0000234a, 0x00003d2f) + + (0x00003e59, 0x00005a5c) + 0 + + + (0x00004898, 0x0000252c) + 0 + + + + (0x00002571, 0x000033ba) + + (0x00004898, 0x0000252c) + 0 + + + (0x000037a9, 0x00003831) + 1 + + + + (0x00002d2a, 0x00002869) + + (0x00005815, 0x00002519) + 0 + + + (0x000037a9, 0x00003831) + 2 + + + + (0x00002d5a, 0x00004a07) + + (0x00003e59, 0x00005a5c) + 0 + + + (0x0000462c, 0x00005b2f) + 0 + + + + (0x000040b5, 0x00003ea5) + + (0x00007e01, 0x000060bf) + 0 + + + (0x00002bd8, 0x00003d85) + 0 + + + + (0x000042ab, 0x000047db) + + (0x00004dd3, 0x00000d20) + 0 + + + (0x000037a9, 0x00003831) + 0 + + + + (0x00004cea, 0x00000673) + + (0x00004898, 0x0000252c) + 0 + + + (0x0000267d, 0x0000641e) + 0 + + + + (0x00004da0, 0x00003510) + + (0x00004898, 0x0000252c) + 0 + + + (0x00000b25, 0x0000761b) + 1 + + + + (0x00004e00, 0x00001fdf) + + (0x00005815, 0x00002519) + 0 + + + (0x00000b25, 0x0000761b) + 2 + + + + (0x00006340, 0x00005429) + + (0x00003e59, 0x00005a5d) + 0 + + + (0x00005815, 0x00002519) + 0 + + + + (0x7db092d7, 0x1ef537ae) + + (0x000037a9, 0x00003831) + 0 + + + (0x00000b25, 0x0000761b) + 0 + + + + + + + (0x47ca0362, 0x4c19d914) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 107 + + + (0x790d75b8, 0x3bb90c33) + Yann Renard / Fabien Lotte + + + (0x7b814cca, 0x271df6dd) + 66 + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Classifier Training + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Motor Imagery + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/shrinkage_lda_rot.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/shrinkage_lda_rot.xml new file mode 100644 index 0000000..aac9be3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/shrinkageLDA/shrinkage_lda_rot.xml @@ -0,0 +1,1032 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00000b25, 0x0000761b) + LDA + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_TrainCompleted + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/alg2.cfg + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 608 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0049667c) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000267d, 0x0000641e) + EBML stream spy 2 + (0x0ed76695, 0x01a69cc3) + + + (0x434f6587, 0x2efd2b7e) + Spied EBML stream 1 + + + + + (0x330306dd, 0x74a95f98) + EBML nodes description + ${Path_Data}/plugins/tools/config-ebml-stream-spy.txt + ${Path_Data}/plugins/tools/config-ebml-stream-spy.txt + false + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Warning + false + + + (0x2cdb2f0b, 0x12f231ea) + Expand binray blocks + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of values in expanded blocks + 4 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 480 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x4e7b798a, 0x183beafb) + (0x23ce0a10, 0xc2eabb47) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0001e68b) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002bd8, 0x00003d85) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 752 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00f062d4) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000037a9, 0x00003831) + Shrinkage LDA + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/alg1.cfg + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + true + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 544 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0052e731) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003e59, 0x00005a5c) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x544a003e, 0x6dcba5f6) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/class1rot.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00003e59, 0x00005a5d) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x544a003e, 0x6dcba5f6) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/class2rot.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x0000462c, 0x00005b2f) + EBML stream spy 1 + (0x0ed76695, 0x01a69cc3) + + + (0x434f6587, 0x2efd2b7e) + Spied EBML stream 1 + + + + + (0x330306dd, 0x74a95f98) + EBML nodes description + ${Path_Data}/plugins/tools/config-ebml-stream-spy.txt + ${Path_Data}/plugins/tools/config-ebml-stream-spy.txt + false + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Warning + false + + + (0x2cdb2f0b, 0x12f231ea) + Expand binray blocks + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of values in expanded blocks + 4 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x4e7b798a, 0x183beafb) + (0x23ce0a10, 0xc2eabb47) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0001c4fc) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004898, 0x0000252c) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002ce464) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004dd3, 0x00000d20) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 3 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Train + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003cafb8) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005815, 0x00002519) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002b40f2) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007e01, 0x000060bf) + Wait for all + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input(1) + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/classifier-training-flipswitch.lua + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 688 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01769a98) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00001495, 0x00005100) + + (0x000037a9, 0x00003831) + 0 + + + (0x00007e01, 0x000060bf) + 0 + + + + (0x000022c7, 0x00005fc3) + + (0x00000b25, 0x0000761b) + 0 + + + (0x00007e01, 0x000060bf) + 1 + + + + (0x00002571, 0x000033ba) + + (0x00004898, 0x0000252c) + 0 + + + (0x000037a9, 0x00003831) + 1 + + + + (0x00002d2a, 0x00002869) + + (0x00005815, 0x00002519) + 0 + + + (0x000037a9, 0x00003831) + 2 + + + + (0x00003062, 0x0000186d) + + (0x00003e59, 0x00005a5d) + 0 + + + (0x00005815, 0x00002519) + 0 + + + + (0x000040b5, 0x00003ea5) + + (0x00007e01, 0x000060bf) + 0 + + + (0x00002bd8, 0x00003d85) + 0 + + + + (0x00004282, 0x000047b4) + + (0x00003e59, 0x00005a5c) + 0 + + + (0x00004dd3, 0x00000d20) + 0 + + + + (0x000042ab, 0x000047db) + + (0x00004dd3, 0x00000d20) + 0 + + + (0x000037a9, 0x00003831) + 0 + + + + (0x00004cea, 0x00000673) + + (0x00004898, 0x0000252c) + 0 + + + (0x0000267d, 0x0000641e) + 0 + + + + (0x00004da0, 0x00003510) + + (0x00004898, 0x0000252c) + 0 + + + (0x00000b25, 0x0000761b) + 1 + + + + (0x00004e00, 0x00001fdf) + + (0x00005815, 0x00002519) + 0 + + + (0x00000b25, 0x0000761b) + 2 + + + + (0x00005f91, 0x00001708) + + (0x00003e59, 0x00005a5c) + 0 + + + (0x0000462c, 0x00005b2f) + 0 + + + + (0x00006e92, 0x00006cc8) + + (0x00003e59, 0x00005a5c) + 0 + + + (0x00004898, 0x0000252c) + 0 + + + + (0x6c6aff83, 0x0b0821f1) + + (0x000037a9, 0x00003831) + 0 + + + (0x00000b25, 0x0000761b) + 0 + + + + + + + (0x6dc3ea0e, 0x0bc0924b) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 107 + + + (0x790d75b8, 0x3bb90c33) + Yann Renard / Fabien Lotte + + + (0x7b814cca, 0x271df6dd) + 66 + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Classifier Training + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Motor Imagery + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/test_accuracy.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/test_accuracy.cpp new file mode 100644 index 0000000..da67c45 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/classification/test/test_accuracy.cpp @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#include +#include +#include + +double threshold = 72; + +int main(int argc, char** argv) +{ + if (argc != 2 && argc != 3) + { + std::cout << "Usage: test_accuracy \n"; + return 3; + } + if (argc == 3) { threshold = atof(argv[2]); } + + std::ifstream file(argv[1], std::ios::in); + + if (file.good() && !file.bad() && file.is_open()) // ... + { + std::string line; + while (getline(file, line)) + { + size_t pos; + if ((pos = line.find("Cross-validation")) != std::string::npos) + { + std::string cutline = line.substr(pos); + pos = cutline.find("is") + 3;//We need to cut the coloration + cutline = cutline.substr(pos); + + pos = cutline.find('%'); + + cutline = cutline.substr(0, pos); + std::stringstream ss(cutline); + + double percentage; + ss >> percentage; + + if (percentage < threshold) + { + std::cout << "Accuracy too low ( " << percentage << " % )" << std::endl; + return 1; + } + std::cout << "Test ok ( " << percentage << " % )" << std::endl; + return 0; + } + } + std::cout << "Error: EOF of log file reached without finding the cross-validation accuracy string.\n"; + return 4; + } + std::cout << "Error: Problem opening [" << argv[1] << "]\n"; + std::cerr << "Error: Code is " << strerror(errno) << "\n"; + return 5; + //return 2; // shouldn't happen +} diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/CMakeLists.txt new file mode 100644 index 0000000..f01302a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/CMakeLists.txt @@ -0,0 +1,35 @@ +PROJECT(openvibe-plugins-data-generation) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindOpenViBEModuleXML") + +# --------------------------------- + + + + +# --------------------------------- + + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/doc/Doc_BoxAlgorithm_NoiseGenerator.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/doc/Doc_BoxAlgorithm_NoiseGenerator.dox-part new file mode 100644 index 0000000..442d951 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/doc/Doc_BoxAlgorithm_NoiseGenerator.dox-part @@ -0,0 +1,58 @@ +/** + * \page BoxAlgorithm_NoiseGenerator Noise generator +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_NoiseGenerator_Description| + * The Noise Generator outputs random signals with a configurable number of channels. The sampling frequency and epoch size can be configured as well. The data is sampled from a pseudorandom distribution. + * |OVP_DocEnd_BoxAlgorithm_NoiseGenerator_Description| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_NoiseGenerator_Outputs| + * |OVP_DocEnd_BoxAlgorithm_NoiseGenerator_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_NoiseGenerator_Output1| + * Random signal generated. + * |OVP_DocEnd_BoxAlgorithm_NoiseGenerator_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_NoiseGenerator_Settings| + * |OVP_DocEnd_BoxAlgorithm_NoiseGenerator_Settings| + + * |OVP_DocBegin_BoxAlgorithm_NoiseGenerator_Setting1| + * Number of channels generated. + * |OVP_DocEnd_BoxAlgorithm_NoiseGenerator_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_NoiseGenerator_Setting2| + * Sampling frequency of generated signals. + * |OVP_DocEnd_BoxAlgorithm_NoiseGenerator_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_NoiseGenerator_Setting3| + * Number of samples per epoch + * |OVP_DocEnd_BoxAlgorithm_NoiseGenerator_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_NoiseGenerator_Setting4| + * Noise type (used distribution) + * |OVP_DocEnd_BoxAlgorithm_NoiseGenerator_Setting4| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_NoiseGenerator_Miscellaneous| + * Uniform noise is drawn from the range \f$ ( 0,1 ( \f$. Gaussian noise has parameters + * mean = 0, variance = 1.0. You can effectively change these parameters by using + * the Simple DSP box on the resulting stream. For example, the mean and variance of + * the resulting \f$ x \f$ from the Gaussian generator can be changed + * by a formula like \f$ x*\sqrt{v} + m \f$ for new variance and mean, respectively. + * |OVP_DocEnd_BoxAlgorithm_NoiseGenerator_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/doc/Doc_BoxAlgorithm_SinusOscillator.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/doc/Doc_BoxAlgorithm_SinusOscillator.dox-part new file mode 100644 index 0000000..d71e7c6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/doc/Doc_BoxAlgorithm_SinusOscillator.dox-part @@ -0,0 +1,69 @@ +/** + * \page BoxAlgorithm_SinusOscillator Sinus oscillator +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SinusOscillator_Description| + The Sinus Oscillator generates sinusoidal signals on a configurable number of channels, and allows for configuring the sampling frequency and epoch size settings. + * |OVP_DocEnd_BoxAlgorithm_SinusOscillator_Description| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SinusOscillator_Outputs| + * |OVP_DocEnd_BoxAlgorithm_SinusOscillator_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_SinusOscillator_Output1| + Sinusoidal signal generated. + * |OVP_DocEnd_BoxAlgorithm_SinusOscillator_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SinusOscillator_Settings| + * |OVP_DocEnd_BoxAlgorithm_SinusOscillator_Settings| + + * |OVP_DocBegin_BoxAlgorithm_SinusOscillator_Setting1| +Number of channels for which to generated sinusoidal signals. + * |OVP_DocEnd_BoxAlgorithm_SinusOscillator_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_SinusOscillator_Setting2| + Sampling frequency of generated signals. + * |OVP_DocEnd_BoxAlgorithm_SinusOscillator_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_SinusOscillator_Setting3| + Number of samples per epoch + * |OVP_DocEnd_BoxAlgorithm_SinusOscillator_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SinusOscillator_Examples| +Practical example : + + Let's create a simple signal processing scenario using the Signal Generator box and a display plugin to watch the generated signals. First, we add a Signal Generator box by drag and dropping it from the Samples category. A double click on it will display its configurable settings. Let's generate signals for 4 channels at a rate of 512 samples per second (sampling frequency) and send them down the processing line in blocks of 32 samples (epoch sample count). This means there will be 512/32 = 16 data blocks emitted by this box every second. + + Now we want to visualize the generated signals. Let's add a Signal Display box. We can set its Time Scale(i.e. the time span that will be displayed) by double clicking on it. + + Finally, we forward signals from the Signal Oscillator to the Signal Display box by linking the output of the former to the first input of the latter. + + The scenario may be launched by clicking the 'Play' button in the Player toolbar. Random combinations of sinusoidal signals should be displayed in a Signal Display window, along with default channel names. Press the Player 'Stop' button to go back to scenario edition mode. + +\image html sinussignalgenerator_scenario.png "A simple sinus oscillator scenario." + +\image html sinussignalgenerator_online.png "Visualizing sinus oscillator signals." + * |OVP_DocEnd_BoxAlgorithm_SinusOscillator_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SinusOscillator_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_SinusOscillator_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/doc/sinussignalgenerator_online.png b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/doc/sinussignalgenerator_online.png new file mode 100644 index 0000000..f77cce1 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/doc/sinussignalgenerator_online.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/doc/sinussignalgenerator_scenario.png b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/doc/sinussignalgenerator_scenario.png new file mode 100644 index 0000000..222ba5f Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/doc/sinussignalgenerator_scenario.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmChannelUnitsGenerator.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmChannelUnitsGenerator.cpp new file mode 100644 index 0000000..2eb6c63 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmChannelUnitsGenerator.cpp @@ -0,0 +1,66 @@ +/* + * Generates a channel units stream with user-specified unit and factor + */ +#include "ovpCBoxAlgorithmChannelUnitsGenerator.h" + +namespace OpenViBE { +namespace Plugins { +namespace DataGeneration { + +bool CChannelUnitsGenerator::initialize() +{ + m_headerSent = false; + + m_nChannel = size_t(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0))); + m_unit = size_t(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1))); + m_factor = size_t(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2))); + + m_encoder.initialize(*this, 0); + + return true; +} + +bool CChannelUnitsGenerator::uninitialize() +{ + m_encoder.uninitialize(); + return true; +} + +bool CChannelUnitsGenerator::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CChannelUnitsGenerator::process() +{ + Kernel::IBoxIO* boxContext = getBoxAlgorithmContext()->getDynamicBoxContext(); + + if (!m_headerSent) + { + CMatrix* units = m_encoder.getInputMatrix(); + units->resize(m_nChannel, 2); + units->setDimensionLabel(1, 0, "Unit"); + units->setDimensionLabel(1, 1, "Factor"); + + for (size_t i = 0; i < m_nChannel; ++i) + { + units->getBuffer()[i * 2 + 0] = double(m_unit); + units->getBuffer()[i * 2 + 1] = double(m_factor); + units->setDimensionLabel(0, i, ("Channel " + std::to_string(i + 1)).c_str()); + } + + m_encoder.encodeHeader(); + boxContext->markOutputAsReadyToSend(0, 0, 0); + m_encoder.encodeBuffer(); + + boxContext->markOutputAsReadyToSend(0, 0, 0); + + m_headerSent = true; + } + + return true; +} +} // namespace DataGeneration +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmChannelUnitsGenerator.h b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmChannelUnitsGenerator.h new file mode 100644 index 0000000..797aed4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmChannelUnitsGenerator.h @@ -0,0 +1,70 @@ +#pragma once + +#include "../ovp_defines.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace DataGeneration { +class CChannelUnitsGenerator final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + uint64_t getClockFrequency() override { return 1LL << 32; } + bool initialize() override; + bool uninitialize() override; + + bool processClock(Kernel::CMessageClock& /*msg*/) override; + bool process() override; + + _IsDerivedFromClass_Final_(IBoxAlgorithm, OVP_ClassId_ChannelUnitsGenerator) + +protected: + bool m_headerSent = false; + size_t m_nChannel = 0; + size_t m_unit = 0; + size_t m_factor = 0; + + Toolkit::TChannelUnitsEncoder m_encoder; +}; + +class CChannelUnitsGeneratorDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("Channel units generator"); } + CString getAuthorName() const override { return CString("Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Generates channel units"); } + + CString getDetailedDescription() const override + { + return CString( + "This box can generate a channel unit stream if specific measurement units are needed. The box is mainly provided for completeness."); + } + + CString getCategory() const override { return CString("Data generation"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-execute"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_ChannelUnitsGenerator; } + IPluginObject* create() override { return new CChannelUnitsGenerator(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("Number of channels", OV_TypeId_Integer, "4"); + prototype.addSetting("Unit", OV_TypeId_MeasurementUnit, "V"); + prototype.addSetting("Factor", OV_TypeId_Factor, "1e-06"); + + prototype.addOutput("Channel units", OV_TypeId_ChannelUnits); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_ChannelUnitsGeneratorDesc) +}; +} // namespace DataGeneration +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmNoiseGenerator.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmNoiseGenerator.cpp new file mode 100644 index 0000000..6727231 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmNoiseGenerator.cpp @@ -0,0 +1,111 @@ +#include "ovpCBoxAlgorithmNoiseGenerator.h" + +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace DataGeneration { + +CNoiseGenerator::CNoiseGenerator() +{ + // Use the OV random seed (if specified) to get dictate the sequence here + std::random_device device; + m_engine = std::default_random_engine(device()); +} + +bool CNoiseGenerator::initialize() +{ + m_encoder.initialize(*this, 0); + + m_nChannel = size_t(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0))); + m_sampling = size_t(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1))); + m_nGeneratedEpochSample = size_t(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2))); + m_noiseType = size_t(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3))); + + m_headerSent = false; + + if (m_nChannel == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Channel count is 0. At least 1 channel is required. Check box settings.\n"; + return false; + } + + if (m_sampling == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Sampling rate of 0 is not supported. Check box settings.\n"; + return false; + } + + if (m_nGeneratedEpochSample == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Epoch sample count is 0. An epoch must have at least 1 sample. Check box settings.\n"; + return false; + } + + // Set parameters of the encoder + + m_encoder.getInputSamplingRate() = m_sampling; + + CMatrix* sample = m_encoder.getInputMatrix(); + sample->resize(m_nChannel, m_nGeneratedEpochSample); + for (size_t i = 0; i < m_nChannel; ++i) { sample->setDimensionLabel(0, i, ("Noise " + std::to_string(i + 1)).c_str()); } + + return true; +} + +bool CNoiseGenerator::uninitialize() +{ + m_encoder.uninitialize(); + return true; +} + +bool CNoiseGenerator::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CNoiseGenerator::process() +{ + Kernel::IBoxIO* boxContext = getBoxAlgorithmContext()->getDynamicBoxContext(); + + // Send header? + if (!m_headerSent) + { + m_encoder.encodeHeader(); + boxContext->markOutputAsReadyToSend(0, 0, 0); + m_headerSent = true; + } + else + { + // Send buffer + double* sample = m_encoder.getInputMatrix()->getBuffer(); + const size_t n = m_encoder.getInputMatrix()->getBufferElementCount(); + if (m_noiseType == OVP_TypeId_NoiseType_Uniform) { for (size_t i = 0; i < n; ++i) { sample[i] = double(m_uniformDistrib(m_engine)); } } + else { for (size_t i = 0; i < n; ++i) { sample[i] = double(m_normalDistrib(m_engine)); } } + + const size_t prevNSamples = m_nSentSample; + m_nSentSample = prevNSamples + m_nGeneratedEpochSample; + + const uint64_t start = CTime(m_sampling, prevNSamples).time(); + const uint64_t end = CTime(m_sampling, m_nSentSample).time(); + + m_encoder.encodeBuffer(); + + boxContext->markOutputAsReadyToSend(0, start, end); + } + + return true; +} + +uint64_t CNoiseGenerator::getClockFrequency() +{ + // Intentional parameter swap to get the frequency + return CTime(m_nGeneratedEpochSample, m_sampling).time(); +} +} // namespace DataGeneration +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmNoiseGenerator.h b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmNoiseGenerator.h new file mode 100644 index 0000000..4e178cf --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmNoiseGenerator.h @@ -0,0 +1,77 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace DataGeneration { +class CNoiseGenerator final : public Toolkit::TBoxAlgorithm +{ +public: + + CNoiseGenerator(); + + void release() override { delete this; } + + uint64_t getClockFrequency() override; + bool initialize() override; + bool uninitialize() override; + + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_NoiseGenerator) + +protected: + + + Toolkit::TSignalEncoder m_encoder; + + bool m_headerSent = false; + size_t m_nChannel = 0; + size_t m_sampling = 0; + size_t m_nGeneratedEpochSample = 0; + size_t m_nSentSample = 0; + size_t m_noiseType = 0; + + std::default_random_engine m_engine; + std::normal_distribution<> m_normalDistrib{ 0.0, 1.0 }; // Mean=0, Var=1 + std::uniform_real_distribution<> m_uniformDistrib{ 0.0, 1.0 }; // Min=0, Max=1 +}; + +class CNoiseGeneratorDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("Noise generator"); } + CString getAuthorName() const override { return CString("Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Simple random noise generator"); } + CString getDetailedDescription() const override { return CString("Generates uniform or Gaussian random data"); } + CString getCategory() const override { return CString("Data generation"); } + CString getVersion() const override { return CString("1.1"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_NoiseGenerator; } + IPluginObject* create() override { return new CNoiseGenerator(); } + CString getStockItemName() const override { return CString("gtk-execute"); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addOutput("Generated signal", OV_TypeId_Signal); + + prototype.addSetting("Channel count", OV_TypeId_Integer, "4"); + prototype.addSetting("Sampling frequency", OV_TypeId_Integer, "512"); + prototype.addSetting("Generated epoch sample count", OV_TypeId_Integer, "32"); + prototype.addSetting("Noise type", OVP_TypeId_NoiseType, std::to_string(OVP_TypeId_NoiseType_Uniform).c_str()); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_NoiseGeneratorDesc) +}; +} // namespace DataGeneration +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCSinusSignalGenerator.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCSinusSignalGenerator.cpp new file mode 100644 index 0000000..85321e8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCSinusSignalGenerator.cpp @@ -0,0 +1,107 @@ +#include "ovpCSinusSignalGenerator.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace DataGeneration { + +bool CSinusSignalGenerator::initialize() +{ + m_encoder.initialize(*this, 0); + + // Parses box settings to try connecting to server + m_nChannel = size_t(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0))); + m_sampling = size_t(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1))); + m_nGeneratedEpochSample = size_t(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2))); + m_headerSent = false; + + if (m_nChannel == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Channel count is 0. At least 1 channel required. Check box settings.\n"; + return false; + } + + if (m_sampling == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Sampling rate of 0 is not supported. Check box settings.\n"; + return false; + } + + if (m_nGeneratedEpochSample == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Epoch sample count is 0. An epoch must have at least 1 sample. Check box settings.\n"; + return false; + } + + return true; +} + +bool CSinusSignalGenerator::uninitialize() +{ + m_encoder.uninitialize(); + return true; +} + +bool CSinusSignalGenerator::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CSinusSignalGenerator::process() +{ + Kernel::IBoxIO* boxContext = getBoxAlgorithmContext()->getDynamicBoxContext(); + + if (!m_headerSent) + { + m_encoder.getInputSamplingRate() = m_sampling; + + CMatrix* matrix = m_encoder.getInputMatrix(); + matrix->resize(m_nChannel, m_nGeneratedEpochSample); + + for (size_t i = 0; i < m_nChannel; ++i) + { + // Convention: channel shown as users go as 1,2,... + matrix->setDimensionLabel(0, i, ("sinusOsc " + std::to_string(i + 1)).c_str()); + } + + m_encoder.encodeHeader(); + + m_headerSent = true; + + const uint64_t time = CTime(m_sampling, m_nSentSample).time(); + boxContext->markOutputAsReadyToSend(0, time, time); + } + else + { + double* buffer = m_encoder.getInputMatrix()->getBuffer(); + + const size_t nSentSample = m_nSentSample; + for (size_t i = 0; i < m_nChannel; ++i) + { + for (size_t j = 0; j < m_nGeneratedEpochSample; ++j) + { + buffer[i * m_nGeneratedEpochSample + j] = sin(((j + m_nSentSample) * (i + 1) * 12.3) / m_sampling) + + sin(((j + m_nSentSample) * (i + 1) * 4.5) / m_sampling) + + sin(((j + m_nSentSample) * (i + 1) * 67.8) / m_sampling); + } + } + + m_encoder.encodeBuffer(); + + m_nSentSample += m_nGeneratedEpochSample; + + const uint64_t start = CTime(m_sampling, nSentSample).time(); + const uint64_t end = CTime(m_sampling, m_nSentSample).time(); + + boxContext->markOutputAsReadyToSend(0, start, end); + } + + return true; +} + +} // namespace DataGeneration +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCSinusSignalGenerator.h b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCSinusSignalGenerator.h new file mode 100644 index 0000000..5354c1a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/box-algorithms/ovpCSinusSignalGenerator.h @@ -0,0 +1,69 @@ +#pragma once + +#include "../ovp_defines.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace DataGeneration { +class CSinusSignalGenerator final : public Toolkit::TBoxAlgorithm +{ +public: + + CSinusSignalGenerator() {} + void release() override { delete this; } + + uint64_t getClockFrequency() override { return CTime(m_nGeneratedEpochSample, m_sampling).time(); } // Intentional parameter swap to get the frequency + bool initialize() override; + bool uninitialize() override; + + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_SinusSignalGenerator) + +protected: + + Toolkit::TSignalEncoder m_encoder; + + bool m_headerSent = false; + size_t m_nChannel = 0; + size_t m_sampling = 0; + size_t m_nGeneratedEpochSample = 0; + size_t m_nSentSample = 0; +}; + +class CSinusSignalGeneratorDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("Sinus oscillator"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Simple sinus signal generator"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Data generation"); } + CString getVersion() const override { return CString("1.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_SinusSignalGenerator; } + IPluginObject* create() override { return new CSinusSignalGenerator(); } + CString getStockItemName() const override { return CString("gtk-execute"); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addOutput("Generated signal", OV_TypeId_Signal); + + prototype.addSetting("Channel count", OV_TypeId_Integer, "4"); + prototype.addSetting("Sampling frequency", OV_TypeId_Integer, "512"); + prototype.addSetting("Generated epoch sample count", OV_TypeId_Integer, "32"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_SinusSignalGeneratorDesc) +}; +} // namespace DataGeneration +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/ovp_defines.h new file mode 100644 index 0000000..0b4a443 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/ovp_defines.h @@ -0,0 +1,23 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_SinusSignalGenerator OpenViBE::CIdentifier(0x7E33BDB8, 0x68194A4A) +#define OVP_ClassId_SinusSignalGeneratorDesc OpenViBE::CIdentifier(0x2633AFA2, 0x6974E32F) +#define OVP_ClassId_TimeSignalGenerator OpenViBE::CIdentifier(0x28A5E7FF, 0x530095DE) +#define OVP_ClassId_TimeSignalGeneratorDesc OpenViBE::CIdentifier(0x57AD8655, 0x1966B4DC) +#define OVP_ClassId_NoiseGenerator OpenViBE::CIdentifier(0x0E3929F1, 0x15AF76B9) +#define OVP_ClassId_NoiseGeneratorDesc OpenViBE::CIdentifier(0x7237458A, 0x1F312C4A) +#define OVP_ClassId_ChannelUnitsGenerator OpenViBE::CIdentifier(0x42B09186, 0x582C8422) +#define OVP_ClassId_ChannelUnitsGeneratorDesc OpenViBE::CIdentifier(0x4901A752, 0xD8578577) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + + +#define OVP_TypeId_NoiseType OpenViBE::CIdentifier(0x2E85E95E, 0x8A1A8365) +#define OVP_TypeId_NoiseType_Uniform 1 +#define OVP_TypeId_NoiseType_Gaussian 2 diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/ovp_main.cpp new file mode 100755 index 0000000..e69414f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/src/ovp_main.cpp @@ -0,0 +1,25 @@ +#include "ovp_defines.h" + +#include "box-algorithms/ovpCBoxAlgorithmNoiseGenerator.h" +#include "box-algorithms/ovpCSinusSignalGenerator.h" +#include "box-algorithms/ovpCBoxAlgorithmChannelUnitsGenerator.h" + +namespace OpenViBE { +namespace Plugins { +namespace DataGeneration { + +OVP_Declare_Begin() + OVP_Declare_New(CNoiseGeneratorDesc); + context.getTypeManager().registerEnumerationType(OVP_TypeId_NoiseType, "Noise type"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_NoiseType, "Uniform", OVP_TypeId_NoiseType_Uniform); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_NoiseType, "Gaussian", OVP_TypeId_NoiseType_Gaussian); + + OVP_Declare_New(CSinusSignalGeneratorDesc); + OVP_Declare_New(CChannelUnitsGeneratorDesc); + + +OVP_Declare_End() + +} // namespace DataGeneration +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/test/DartTestfile.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/test/DartTestfile.txt new file mode 100644 index 0000000..2a4281c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/test/DartTestfile.txt @@ -0,0 +1,24 @@ +# Basic Template Test for automatic run a scenario that produce a file to be compared to a reference file +# You need to set the name of the test according to name of scenario file and reference file +SET(TEST_NAME SinusOscillator) +SET(SCENARIO_TO_TEST "${TEST_NAME}.xml") + +IF(WIN32) + SET(EXT cmd) + SET(OS_FLAGS "--no-pause") +ELSE() + SET(EXT sh) + SET(OS_FLAGS "") +ENDIF() + +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${TEST_NAME}.csv") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--invisible" "--play" ${SCENARIO_TO_TEST}) +ADD_TEST(compare_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "${TEST_NAME}.csv" "${TEST_NAME}.ref.csv" 0.001) + + +## add some properties that help to debug +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) + +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL "${TEST_NAME}.csv") +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/test/SinusOscillator.ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/test/SinusOscillator.ref.csv new file mode 100644 index 0000000..bb0c2d1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/test/SinusOscillator.ref.csv @@ -0,0 +1,33 @@ +Time (s);Channel 0;Sampling Rate +0.000000;0.000000;32 +0.031250;1.368734; +0.062500;0.083451; +0.093750;1.396507; +0.125000;2.346035; +0.156250;0.665258; +0.187500;1.634277; +0.218750;2.037404; +0.250000;0.022367; +0.281250;0.858778; +0.312500;1.060520; +0.343750;-0.852792; +0.375000;0.286299; +0.406250;0.674572; +0.437500;-0.846042; +0.468750;0.720929; +0.500000;1.256436; +0.531250;-0.063101; +0.562500;1.591261; +0.593750;1.856456; +0.625000;0.310024; +0.656250;1.653154; +0.687500;1.361267; +0.718750;-0.540488; +0.750000;0.518955; +0.781250;-0.124499; +0.812500;-2.025000; +0.843750;-0.813536; +0.875000;-1.330267; +0.906250;-2.777442; +0.937500;-1.073187; +0.968750;-1.256059; diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/test/SinusOscillator.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/test/SinusOscillator.xml new file mode 100644 index 0000000..9b71512 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/data-generation/test/SinusOscillator.xml @@ -0,0 +1,351 @@ + + 1 + openvibe + 2.0 + + + (0x009a83cc, 0x6d4983ad) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 1.0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x1fa963f5, 0x1a638cd4) + 27 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xad100179, 0xa3c984ab) + 129 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x34167481, 0x00bd5f19) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x1fa963f5, 0x1a638cd4) + 27 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x448f2232, 0x5013f18b) + Sinus oscillator + (0x7e33bdb8, 0x68194a4a) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 1 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 32 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x1fa963f5, 0x1a638cd4) + 27 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xad100179, 0xa3c984ab) + 119 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x4f2ecd7a, 0x0d717b09) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x5ba36127, 0x195feae1) + Streamed matrix + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + SinusOscillator.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x1fa963f5, 0x1a638cd4) + 42 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x17d96bc0, 0x2dace6ba) + + (0x448f2232, 0x5013f18b) + 0 + + + (0x4f2ecd7a, 0x0d717b09) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 132 + + + (0x358ae8b5, 0x0f8bacd1) + 240 + + + (0x3f0a3b27, 0x570913d2) + 166 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x2c1ae6b9, 0x7658f20c) + + (0x009a83cc, 0x6d4983ad) + 0 + + + (0x34167481, 0x00bd5f19) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 132 + + + (0x358ae8b5, 0x0f8bacd1) + 432 + + + (0x3f0a3b27, 0x570913d2) + 158 + + + (0x6267b5c5, 0x676e3e42) + 432 + + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x08ca2fb9, 0x39407d4e)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x068798dd, 0x7b740a24)","index":0,"name":"Default tab","parentIdentifier":"(0x08ca2fb9, 0x39407d4e)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x24c82442, 0x11487bbf)","index":0,"name":"Empty","parentIdentifier":"(0x068798dd, 0x7b740a24)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Guillermo Andrade B. + + + (0x8c1fc55b, 0x7b433dc2) + 0.0.1 + + + (0x9f5c4075, 0x4a0d3666) + Simple Scenario for Automatic Test + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Tests + + + (0xf8034a49, 0x8b3f37cc) + INRIA + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/CMakeLists.txt new file mode 100644 index 0000000..5d8df9f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/CMakeLists.txt @@ -0,0 +1,26 @@ +PROJECT(openvibe-plugins-dll-bridge) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/box-algorithms/fortran-example/README.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/box-algorithms/fortran-example/README.txt new file mode 100644 index 0000000..5197533 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/box-algorithms/fortran-example/README.txt @@ -0,0 +1,27 @@ + +Example how to use a Fortran component to do signal processing + +On Windows, + +- Compile the Fortran code with a 32(!) bit fortran compiler. +The Intel Fortran compiler has been observed to work. e.g. + +> where ifort +C:\Program Files (x86)\Intel\Composer XE 2013 SP1\bin\ia32\ifort + +> ifort /static /dll fortranbox_dll.f90 + +The resulting .dll file can be specified to the DLL Bridge box. +Remember to set the full path correctly. + +Using the /static flag allows you to distribute your built dll +to other computers more easily. + + +On Linux, + +# gfortran -shared fortranbox_dll.f90 -o fortranbox_dll.so + +Then specify the .so file to the DLL Bridge box. + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/box-algorithms/fortran-example/fortranbox_dll.f90 b/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/box-algorithms/fortran-example/fortranbox_dll.f90 new file mode 100644 index 0000000..1d19319 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/box-algorithms/fortran-example/fortranbox_dll.f90 @@ -0,0 +1,125 @@ + +! +! This code illustrates passing a matrix in from OpenViBE, making modifications, +! and sending another matrix back. Care must be taken that the difference in C/Fortran +! row/column major order of the matrix storage is taken into account. +! +! This example adds the channel number to the channel data (so each channel will have noticable and different effect). +! It also adds one channel with a constant pattern, to illustrate how to change the channel count. The +! change of dimensions must be specified in the box_process_header() function. +! + +Module box + +! Matrix dimensions in and out +INTEGER g_rowsIn,g_colsIn, g_rowsOut,g_colsOut +! Sampling rates in and out +INTEGER g_samplingRateIn, g_samplingRateOut + +CONTAINS + +! this routine is run once at the beginning of playback. it can be used to precompute/load things needed later. +! set errorCode to 0 on success, a non-zero code otherwise. +subroutine box_init(inputParamsLength, inputParams, errorCode) bind(C) + !DEC$ ATTRIBUTES DLLEXPORT :: box_init + use,intrinsic:: iso_c_binding + implicit none + INTEGER(C_INT32_T), intent(in) :: inputParamsLength; + CHARACTER(KIND=C_CHAR), dimension(inputParamsLength), intent(in) :: inputParams + INTEGER(C_INT32_T), intent(out) :: errorCode; + + ! in this example, the routine does nothing much + + write(*,*) "box_init() in Fortran" + write(*,*) " Received params: ", inputParams + + errorCode = 0 +end subroutine box_init + +! this routine is run when OpenViBE receives a stream header. The purpose of this +! function is to return the sizes of the output matrices, and change in the +! sampling rate if any. If sampling rate is 0, the input of process() +! will be just a matrix without a known sampling frequency. +! +! set errorCode to 0 on success, a non-zero code otherwise. +subroutine box_process_header(rowsIn,colsIn,samplingRateIn,rowsOut,colsOut,samplingRateOut,errorCode) bind(C) + !DEC$ ATTRIBUTES DLLEXPORT :: box_process_header + use iso_c_binding + INTEGER(C_INT32_T), intent(in) :: rowsIn, colsIn, samplingRateIn + INTEGER(C_INT32_T), intent(out) :: rowsOut, colsOut, samplingRateOut + INTEGER(C_INT32_T), intent(out) :: errorCode; + + g_rowsIn = rowsIn + g_colsIn = colsIn + g_samplingRateIn = samplingRateIn + +! Here rowOut=rowIn+1 since we want to add a channel in this example + g_rowsOut = rowsIn + 1 + g_colsOut = colsIn + g_samplingRateOut = samplingRateIn + + write(*,*) " Process header: Dims", g_rowsIn, g_colsIn, "->", g_rowsOut, g_colsOut + write(*,*) " Freq", g_SamplingRateIn, "->", g_samplingRateOut + + rowsOut = g_rowsOut + colsOut = g_colsOut + + samplingRateOut = g_samplingRateOut + + errorCode = 0; +end subroutine box_process_header + +! this routine is runs once for each matrix chunk of data. +! set errorCode to 0 on success, a non-zero code otherwise. +subroutine box_process(matIn,matOut,errorCode) bind(C) + !DEC$ ATTRIBUTES DLLEXPORT :: box_process + use iso_c_binding + REAL(C_DOUBLE), intent(in) :: matIn(g_rowsIn*g_colsIn) + REAL(C_DOUBLE), intent(out) :: matOut(g_rowsOut*g_colsOut) + INTEGER(C_INT32_T), intent(out) :: errorCode + REAL, DIMENSION(1:g_rowsIn,1:g_colsIn) :: A; + REAL, DIMENSION(1:g_rowsOut,1:g_colsOut) :: B; + ! write(*,*) "box_process() in Fortran" , rows, " ", cols + + ! matrix from C/C++ is in row-major order, reshape + A = reshape(matIn, (/ g_rowsIn, g_colsIn /), ORDER = (/ 2, 1 /) ) + + ! Add +nChannel to each channel + do i=1,g_rowsIn + do j=1,g_colsIn + B(i,j) = A(i,j) + i; + end do + end do + + ! the new channel just has a simple pattern + do j=1,g_colsOut + B(g_rowsOut,j) = j; + end do + + ! print the matrix + !WRITE(*,*) + !DO I = LBOUND(B,1), UBOUND(B,1) + ! WRITE(*,*) (B(I,J), J = LBOUND(B,2), UBOUND(B,2)) + !END DO + + matOut = reshape( TRANSPOSE(B), (/ g_rowsOut * g_colsOut /) ) + + errorCode = 0 +end subroutine box_process + +! this routine is run once at the end of playback. it can be used to deallocate resources (memory, files, ...). +! set errorCode to 0 on success, a non-zero code otherwise. +subroutine box_uninit(errorCode) bind(C) + !DEC$ ATTRIBUTES DLLEXPORT :: box_uninit + use iso_c_binding + INTEGER(C_INT32_T), intent(out) :: errorCode + + ! in this example, the routine does nothing much + + write(*,*) "box_uninit() in Fortran" + + errorCode = 0 +end subroutine box_uninit + +end module box + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/box-algorithms/ovpCBoxAlgorithmDLLBridge.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/box-algorithms/ovpCBoxAlgorithmDLLBridge.cpp new file mode 100644 index 0000000..ff8172d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/box-algorithms/ovpCBoxAlgorithmDLLBridge.cpp @@ -0,0 +1,294 @@ +#include "ovpCBoxAlgorithmDLLBridge.h" + +#include + +#if defined(TARGET_OS_Windows) +#include +#elif defined(TARGET_OS_Linux) +#include +#endif + + +namespace OpenViBE { +namespace Plugins { +namespace DLLBridge { + +// #define DLLBRIDGE_DEBUG +#if defined(DLLBRIDGE_DEBUG) +static void dumpMatrix(Kernel::ILogManager& mgr, const CMatrix& mat, const CString& desc) +{ + mgr << Kernel::LogLevel_Info << desc << "\n"; + for (size_t i = 0; i < mat.getDimensionSize(0); i++) + { + mgr << Kernel::LogLevel_Info << "Row " << i << ": "; + for (size_t j = 0; j < mat.getDimensionSize(1); j++) { mgr << mat.getBuffer()[i * mat.getDimensionSize(1) + j] << " "; } + mgr << "\n"; + } +} +#endif + +#if defined(TARGET_OS_Windows) +#define OPEN_FUNC(file, library) \ +std::string tmp = file.toASCIIString();\ +std::replace(tmp.begin(), tmp.end(), '/', '\\');\ +file = tmp.c_str();\ +library = LoadLibrary(file.toASCIIString()); + +#define PROC_FUNC GetProcAddress +#define ERR_FUNC GetLastError +#define CLOSE_FUNC FreeLibrary +#else +#define OPEN_FUNC(file, library) library = dlopen(file.toASCIIString(), RTLD_LAZY); +#define PROC_FUNC dlsym +#define ERR_FUNC dlerror +#define CLOSE_FUNC dlclose +#endif + +// This function is called once when user presses play in Designer +bool CDLLBridge::initialize() +{ + this->getLogManager() << Kernel::LogLevel_Debug << "Initializing\n"; + + m_encoder = nullptr; + m_decoder = nullptr; + m_library = nullptr; + m_initialize = nullptr; + m_processHeader = nullptr; + m_process = nullptr; + m_uninitialize = nullptr; + + m_dllFile = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_parameters = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + if (m_dllFile == CString("")) + { + this->getLogManager() << Kernel::LogLevel_Error << "Need a DLL file\n"; + return false; + } + + OPEN_FUNC(m_dllFile, m_library) + if (!m_library) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to load " << m_dllFile << ", error code " << int64_t(ERR_FUNC()) << "\n"; + return false; + } + + m_initialize = INITFUNC(PROC_FUNC(m_library, "box_init")); + if (!m_initialize) + { + this->getLogManager() << Kernel::LogLevel_Error << "Unable to find box_init() in the DLL\n"; + return false; + } + + m_process = PROCESSFUNC(PROC_FUNC(m_library, "box_process")); + if (!m_process) + { + this->getLogManager() << Kernel::LogLevel_Error << "Unable to find box_process() in the DLL\n"; + return false; + } + + m_processHeader = PROCESSHEADERFUNC(PROC_FUNC(m_library, "box_process_header")); + if (!m_processHeader) + { + this->getLogManager() << Kernel::LogLevel_Error << "Unable to find box_process_header() in the DLL\n"; + return false; + } + + m_uninitialize = UNINITFUNC(PROC_FUNC(m_library, "box_uninit")); + if (!m_uninitialize) + { + this->getLogManager() << Kernel::LogLevel_Error << "Unable to find box_uninit() in the DLL\n"; + return false; + } + + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + boxContext.getInputType(0, m_inputTypeID); + if (m_inputTypeID == OV_TypeId_StreamedMatrix) + { + Toolkit::TStreamedMatrixDecoder* decoder = new Toolkit::TStreamedMatrixDecoder; + Toolkit::TStreamedMatrixEncoder* encoder = new Toolkit::TStreamedMatrixEncoder; + + decoder->initialize(*this, 0); + encoder->initialize(*this, 0); + + m_decoder = decoder; + m_encoder = encoder; + } + else if (m_inputTypeID == OV_TypeId_Signal) + { + Toolkit::TSignalDecoder* decoder = new Toolkit::TSignalDecoder; + Toolkit::TSignalEncoder* encoder = new Toolkit::TSignalEncoder; + + decoder->initialize(*this, 0); + encoder->initialize(*this, 0); + + m_decoder = decoder; + m_encoder = encoder; + } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Unknown input type " << m_inputTypeID << ". This should never happen.\n"; + return false; + } + + this->getLogManager() << Kernel::LogLevel_Trace << "DLL box_init() : Calling\n"; + + // Do some initialization in DLL + int length = m_parameters.length(); + int code = 0; + m_initialize(&length, m_parameters.toASCIIString(), &code); + if (code) + { + this->getLogManager() << Kernel::LogLevel_Error << "DLL box_init() : Returned error code " << code << "\n"; + return false; + } + this->getLogManager() << Kernel::LogLevel_Trace << "DLL box_init() : Return ok\n"; + return true; +} + +// This function is called once when user presses Stop in Designer +bool CDLLBridge::uninitialize() +{ + this->getLogManager() << Kernel::LogLevel_Debug << "Uninitializing\n"; + + if (m_uninitialize) + { + this->getLogManager() << Kernel::LogLevel_Trace << "DLL box_uninit() : Calling\n"; + + // Do some uninitialization in DLL + int code = 0; + m_uninitialize(&code); + + if (code) + { + this->getLogManager() << Kernel::LogLevel_Error << "DLL box_uninit() : Returned error code " << code << "\n"; + return false; + } + this->getLogManager() << Kernel::LogLevel_Trace << "DLL box_uninit() : Return ok\n"; + } + + if (m_encoder) + { + m_encoder->uninitialize(); + delete m_encoder; + m_encoder = nullptr; + } + if (m_decoder) + { + m_decoder->uninitialize(); + delete m_decoder; + m_decoder = nullptr; + } + + if (m_library) + { + CLOSE_FUNC(m_library); + m_library = nullptr; + } + + return true; +} + +bool CDLLBridge::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +// This function is called for every signal chunk (matrix of N samples [channels x samples]). +bool CDLLBridge::process() +{ + this->getLogManager() << Kernel::LogLevel_Debug << "Process chunk\n"; + + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (uint32_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + // m_decoder/m_encoder should point to StreamedMatrix*coder or Signal*Coder by construction, + // the latter appears to be static castable to the former, in practice. + // n.b. dynamic cast does not work here runtime (this does, for the moment). I do not hazard + // an explanation here. Anybody wanting to find out the reasons be prepared to digest the + // codec template inheritance relationships in toolkit for a while. + Toolkit::TStreamedMatrixDecoder* decoder = dynamic_cast*>(m_decoder); + Toolkit::TStreamedMatrixEncoder* encoder = dynamic_cast*>(m_encoder); + + decoder->decode(i); + + if (decoder->isHeaderReceived()) + { + if (decoder->getOutputMatrix()->getDimensionCount() != 2) + { + this->getLogManager() << Kernel::LogLevel_Error << "Only 2 dimensional matrices supported\n"; + return false; + } + + int iSampling = 0; + + if (m_inputTypeID == OV_TypeId_Signal) + { + Toolkit::TSignalDecoder* signalDecoder = dynamic_cast*>(m_decoder); + iSampling = int(signalDecoder->getOutputSamplingRate()); + } + + int iNRows = decoder->getOutputMatrix()->getDimensionSize(0); + int iNCols = decoder->getOutputMatrix()->getDimensionSize(1); + + this->getLogManager() << Kernel::LogLevel_Trace << "DLL box_process_header() : Calling\n"; + + int code = 0, oNRows = 0, oNCols = 0, oSampling = 0; + m_processHeader(&iNRows, &iNCols, &iSampling, &oNRows, &oNCols, &oSampling, &code); + if (code) + { + this->getLogManager() << Kernel::LogLevel_Error << "DLL box_process_header() : Returned error code " << code << "\n"; + return false; + } + this->getLogManager() << Kernel::LogLevel_Trace << "DLL box_process_header() : Return ok\n"; + this->getLogManager() << Kernel::LogLevel_Trace << "The function declared" << " rowsOut=" << oNRows << " colsOut=" << oNCols << " sRateOut=" << oSampling << "\n"; + + encoder->getInputMatrix()->resize(oNRows, oNCols); + + if (m_inputTypeID == OV_TypeId_Signal) + { + Toolkit::TSignalEncoder* signalEncoder = dynamic_cast*>(m_encoder); + + signalEncoder->getInputSamplingRate() = oSampling; + } + + encoder->encodeHeader(); + + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + if (decoder->isBufferReceived()) + { + double* input = decoder->getOutputMatrix()->getBuffer(); + double* output = encoder->getInputMatrix()->getBuffer(); + + this->getLogManager() << Kernel::LogLevel_Trace << "DLL box_process() : Calling\n"; + + // Process the sample chunk in DLL + int errorCode = 0; + m_process(input, output, &errorCode); + if (errorCode) + { + this->getLogManager() << Kernel::LogLevel_Error << "DLL box_process() : Returned error code " << errorCode << "\n"; + return false; + } + this->getLogManager() << Kernel::LogLevel_Trace << "DLL box_process() : Return ok\n"; + + encoder->encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + if (decoder->isEndReceived()) + { + encoder->encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + + return true; +} + +} // namespace DLLBridge +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/box-algorithms/ovpCBoxAlgorithmDLLBridge.h b/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/box-algorithms/ovpCBoxAlgorithmDLLBridge.h new file mode 100644 index 0000000..7bc97c0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/box-algorithms/ovpCBoxAlgorithmDLLBridge.h @@ -0,0 +1,129 @@ +#pragma once + +#include "../ovp_defines.h" + +#include +#include + +#include +#include + +#if defined(TARGET_OS_Windows) +#include +#endif + +namespace OpenViBE { +namespace Plugins { +namespace DLLBridge { +class CDLLBridge final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_DLLBridge) + +private: + + Toolkit::TDecoder* m_decoder = nullptr; + Toolkit::TEncoder* m_encoder = nullptr; + + CIdentifier m_inputTypeID = CIdentifier::undefined(); + CString m_dllFile; + CString m_parameters; + + // These functions are expected from the DLL library + // @note the inputs are non-const on purpose to ensure maximum compatibility with non-C++ dlls + typedef void (* INITFUNC)(int* paramsLength, const char* params, int* errorCode); + typedef void (* UNINITFUNC)(int* errorCode); + typedef void (* PROCESSHEADERFUNC)(int* rowsIn, int* colsIn, int* samplingRateIn, int* rowsOut, int* colsOut, int* samplingRateOut, + int* errorCode); + typedef void (* PROCESSFUNC)(double* matIn, double* matOut, int* errorCode); + + INITFUNC m_initialize = nullptr; + UNINITFUNC m_uninitialize = nullptr; + PROCESSHEADERFUNC m_processHeader = nullptr; + PROCESSFUNC m_process = nullptr; + +#if defined(TARGET_OS_Windows) + HINSTANCE m_library = nullptr; +#elif defined(TARGET_OS_Linux) + void* m_library = nullptr; +#endif +}; + +class CDLLBridgeListener final : public Toolkit::TBoxListener +{ +public: + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(index, typeID); + box.setOutputType(0, typeID); + return true; + } + + bool onOutputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getOutputType(index, typeID); + box.setInputType(0, typeID); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +/** +* Plugin's description +*/ +class CDLLBridgeDesc final : public IBoxAlgorithmDesc +{ +public: + CString getName() const override { return CString("DLL Bridge"); } + CString getAuthorName() const override { return CString("Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Process a signal or matrix stream with a DLL"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Scripting"); } + CString getVersion() const override { return CString("0.2"); } + CString getStockItemName() const override { return CString("gtk-convert"); } + void release() override { } + CIdentifier getCreatedClass() const override { return OVP_ClassId_DLLBridge; } + IPluginObject* create() override { return new CDLLBridge(); } + IBoxListener* createBoxListener() const override { return new CDLLBridgeListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("DLL file", OV_TypeId_Filename, ""); + prototype.addSetting("Parameters", OV_TypeId_String, ""); + + prototype.addInput("Input",OV_TypeId_Signal); + prototype.addOutput("Output",OV_TypeId_Signal); + + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addOutputSupport(OV_TypeId_StreamedMatrix); + prototype.addOutputSupport(OV_TypeId_Signal); + + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_DLLBridgeDesc) +}; +} // namespace DLLBridge +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/ovp_defines.h new file mode 100755 index 0000000..cbf7ace --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/ovp_defines.h @@ -0,0 +1,10 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_DLLBridge OpenViBE::CIdentifier(0x6F837408, 0x35BA0312) +#define OVP_ClassId_DLLBridgeDesc OpenViBE::CIdentifier(0x2BB7368F, 0x207D6485) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/ovp_main.cpp new file mode 100755 index 0000000..9868fb3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/dll-bridge/src/ovp_main.cpp @@ -0,0 +1,18 @@ +#include "ovp_defines.h" + +#include "box-algorithms/ovpCBoxAlgorithmDLLBridge.h" + +namespace OpenViBE { +namespace Plugins { +namespace DLLBridge { + +OVP_Declare_Begin() + context.getTypeManager().registerEnumerationEntry(OV_TypeId_BoxAlgorithmFlag, OV_AttributeId_Box_FlagIsUnstable.toString(), + OV_AttributeId_Box_FlagIsUnstable.id()); + + OVP_Declare_New(CDLLBridgeDesc); +OVP_Declare_End() + +} // namespace DLLBridge +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/CMakeLists.txt new file mode 100755 index 0000000..5c1bc6c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/CMakeLists.txt @@ -0,0 +1,39 @@ +PROJECT(openvibe-plugins-evaluation) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleXML") +INCLUDE("FindThirdPartyGTK") +INCLUDE("FindOpenViBEVisualizationToolkit") + +# --------------------------------- +# Test applications +# --------------------------------- +IF(OV_COMPILE_TESTS) + ADD_SUBDIRECTORY(test) +ENDIF(OV_COMPILE_TESTS) + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/plugins/evaluation) + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/doc/Doc_BoxAlgorithm_ClassifierAccuracyMeasure.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/doc/Doc_BoxAlgorithm_ClassifierAccuracyMeasure.dox-part new file mode 100644 index 0000000..2bcd3eb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/doc/Doc_BoxAlgorithm_ClassifierAccuracyMeasure.dox-part @@ -0,0 +1,55 @@ +/** + * \page BoxAlgorithm_ClassifierAccuracyMeasure Classifier accuracy measure +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClassifierAccuracyMeasure_Description| + The real-time classifier accuracies are displayed on vertical progress bars. The accuracy is computed given the results from classifiers, compared to the targets received. + * |OVP_DocEnd_BoxAlgorithm_ClassifierAccuracyMeasure_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClassifierAccuracyMeasure_Inputs| + This box must have at least 2 inputs: one for the targets, and another one for a classifier processor results. User can add more classifier inputs at will. + * |OVP_DocEnd_BoxAlgorithm_ClassifierAccuracyMeasure_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ClassifierAccuracyMeasure_Input1| + The targets the classifier aims at, using stimulation labels. + * |OVP_DocEnd_BoxAlgorithm_ClassifierAccuracyMeasure_Input1| + + * |OVP_DocBegin_BoxAlgorithm_ClassifierAccuracyMeasure_Input2| + The classifier results coming from a classifier processor, using stimulation labels. + * |OVP_DocEnd_BoxAlgorithm_ClassifierAccuracyMeasure_Input2| +__________________________________________________________________ + +Online visualization settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClassifierAccuracyMeasure_OnlineVisualizationSettings| + Online settings : + + Setting1 : Reset scores + + Setting2 : Show accuracies as percentages + + * |OVP_DocEnd_BoxAlgorithm_ClassifierAccuracyMeasure_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClassifierAccuracyMeasure_Examples| + * |OVP_DocEnd_BoxAlgorithm_ClassifierAccuracyMeasure_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClassifierAccuracyMeasure_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_ClassifierAccuracyMeasure_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/doc/Doc_BoxAlgorithm_ConfusionMatrix.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/doc/Doc_BoxAlgorithm_ConfusionMatrix.dox-part new file mode 100644 index 0000000..35b6b80 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/doc/Doc_BoxAlgorithm_ConfusionMatrix.dox-part @@ -0,0 +1,79 @@ +/** + * \page BoxAlgorithm_ConfusionMatrix Confusion Matrix +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ConfusionMatrix_Description| + The Confusion Matrix box performs real-time computation of the confusion matrix of a given classifier. + Confusion matrix can be used to measure the performance of a classifier. + The confusion matrix output can be filled with either percentages or values. Optional colum and row can be added to + give the sums of each row and column. + The confusion matrix output can be displayed usig a \ref BoxAlgorithm_MatrixDisplay. + * |OVP_DocEnd_BoxAlgorithm_ConfusionMatrix_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ConfusionMatrix_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ConfusionMatrix_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ConfusionMatrix_Input1| + The stimulations that comes from the instruction flow, i.e. the targets that the classifier aims at. + * |OVP_DocEnd_BoxAlgorithm_ConfusionMatrix_Input1| + + * |OVP_DocBegin_BoxAlgorithm_ConfusionMatrix_Input2| + The classification results coming from a classifier. These stimulations will be compared to teh target to perform the computation. + * |OVP_DocEnd_BoxAlgorithm_ConfusionMatrix_Input2| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ConfusionMatrix_Outputs| + * |OVP_DocEnd_BoxAlgorithm_ConfusionMatrix_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_ConfusionMatrix_Output1| + The Confusion matrix. + * |OVP_DocEnd_BoxAlgorithm_ConfusionMatrix_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ConfusionMatrix_Settings| + More box settings can be added for a multi class classifier. The default configuration uses 2 classes. + * |OVP_DocEnd_BoxAlgorithm_ConfusionMatrix_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ConfusionMatrix_Setting1| + Tells the box to put percentages or values in the matrix. + * |OVP_DocEnd_BoxAlgorithm_ConfusionMatrix_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_ConfusionMatrix_Setting2| + If checked, this option adds one row and one column that gives the sums of each row and column in the matrix. + * |OVP_DocEnd_BoxAlgorithm_ConfusionMatrix_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_ConfusionMatrix_Setting3| + The stimulation label for the first class. + * |OVP_DocEnd_BoxAlgorithm_ConfusionMatrix_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_ConfusionMatrix_Setting4| + The stimulation label for the second class. + * |OVP_DocEnd_BoxAlgorithm_ConfusionMatrix_Setting4| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ConfusionMatrix_Examples| + * |OVP_DocEnd_BoxAlgorithm_ConfusionMatrix_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ConfusionMatrix_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_ConfusionMatrix_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/doc/Doc_BoxAlgorithm_KappaCoefficient.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/doc/Doc_BoxAlgorithm_KappaCoefficient.dox-part new file mode 100644 index 0000000..dc35548 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/doc/Doc_BoxAlgorithm_KappaCoefficient.dox-part @@ -0,0 +1,70 @@ +/** + * \page BoxAlgorithm_KappaCoef Kappa Coefficient +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_KappaCoef_Description| + * This box computes the Cohen kappa coefficient that allows to compare the accordance of two classifiers (https://en.wikipedia.org/wiki/Cohen%27s_kappa), + * The box compares the results of the classifier (second input) to the 100% match classifier (first input). + * + * The result is streamed on the first output, and is displayed in real time in a standalone visualization. + * |OVP_DocEnd_BoxAlgorithm_KappaCoef_Description| + * + * +_______________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_KappaCoef_Inputs| + * |OVP_DocEnd_BoxAlgorithm_KappaCoef_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_KappaCoef_Input1| + * The first input receives the expected stimulation. + * |OVP_DocEnd_BoxAlgorithm_KappaCoef_Input1| + + * |OVP_DocBegin_BoxAlgorithm_KappaCoef_Input2| + * This input receives the stimualtions found by the classifier. + * |OVP_DocEnd_BoxAlgorithm_KappaCoef_Input2| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_KappaCoef_Outputs| + * |OVP_DocEnd_BoxAlgorithm_KappaCoef_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_KappaCoef_Output1| + * This output contains the current value of the Kappa coefficient. + * |OVP_DocEnd_BoxAlgorithm_KappaCoef_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_KappaCoef_Settings| + * Each setting except the first one corresponds to the stimulation code of a class. A stimulation must be unique. + * |OVP_DocEnd_BoxAlgorithm_KappaCoef_Settings| + + * |OVP_DocBegin_BoxAlgorithm_KappaCoef_Setting1| + * This setting indicates the amount of classes handled by the box. This setting will change the amount of setting. + * |OVP_DocEnd_BoxAlgorithm_KappaCoef_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_KappaCoef_Setting2| + * This setting indicates the stimulation corresponding to the first class. + * |OVP_DocEnd_BoxAlgorithm_KappaCoef_Setting2| + * + * * |OVP_DocBegin_BoxAlgorithm_KappaCoef_Setting3| + * This setting indicates the stimulation corresponding to the second class. + * |OVP_DocEnd_BoxAlgorithm_KappaCoef_Setting3| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_KappaCoef_Miscellaneous| + * All stimulations can be send to the box. They will be filtered. + * |OVP_DocEnd_BoxAlgorithm_KappaCoef_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/doc/Doc_BoxAlgorithm_ROCCurve.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/doc/Doc_BoxAlgorithm_ROCCurve.dox-part new file mode 100644 index 0000000..d941a6d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/doc/Doc_BoxAlgorithm_ROCCurve.dox-part @@ -0,0 +1,65 @@ +/** + * \page BoxAlgorithm_ROCCurve ROC Curve +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ROCCurve_Description| + * This box computes the ROC (Receiver Operating Characteristic) curve for a classifier (https://fr.wikipedia.org/wiki/Receiver_Operating_Characteristic). One curve will be computes + * by class. This box is designed to work with the probability output of the \ref Doc_BoxAlgorithm_ClassifierProcessor. + * + * The box will compute the curve when it receives the computation trigger on the first input. + * + * The result is displayed when computed in a standalone visualization. + * |OVP_DocEnd_BoxAlgorithm_ROCCurve_Description| + * + * +_______________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ROCCurve_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ROCCurve_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ROCCurve_Input1| +The first input receives the expected stimulations stream. + * |OVP_DocEnd_BoxAlgorithm_ROCCurve_Input1| + + * |OVP_DocBegin_BoxAlgorithm_ROCCurve_Input2| +This input receives the probability output stream of the processor box. + * |OVP_DocEnd_BoxAlgorithm_ROCCurve_Input2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ROCCurve_Settings| + * Each setting after the second one corresponds to the stimulation code of a class. A stimulation must be unique. + * |OVP_DocEnd_BoxAlgorithm_ROCCurve_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ROCCurve_Setting1| + * Stimulation trigger for the computation. + * |OVP_DocEnd_BoxAlgorithm_ROCCurve_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_ROCCurve_Setting2| + * This setting indicates the amount of classes handled by the box. This setting will change the amount of setting. + * |OVP_DocEnd_BoxAlgorithm_ROCCurve_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_ROCCurve_Setting3| + * This setting indicates the stimulation corresponding to the first class. + * |OVP_DocEnd_BoxAlgorithm_ROCCurve_Setting3| + * + * * |OVP_DocBegin_BoxAlgorithm_ROCCurve_Setting4| + * This setting indicates the stimulation corresponding to the second class. + * |OVP_DocEnd_BoxAlgorithm_ROCCurve_Setting4| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ROCCurve_Miscellaneous| + * All stimulations can be send to the box. They will be filtered. + * |OVP_DocEnd_BoxAlgorithm_ROCCurve_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/doc/Doc_BoxAlgorithm_StatisticGenerator.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/doc/Doc_BoxAlgorithm_StatisticGenerator.dox-part new file mode 100644 index 0000000..ccd5a93 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/doc/Doc_BoxAlgorithm_StatisticGenerator.dox-part @@ -0,0 +1,93 @@ +/** + * \page BoxAlgorithm_GeneralStatisticsGenerator General Statistic Generator +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GeneralStatisticsGenerator_Description| + * The box analyses a the two input stream (stimulations and signal). + * + * The box will provide for each channel of the signal the min, the max value and the mean. + * The box will provide a list of stimulations and provide for them the amount of time they appeared. + * + * |OVP_DocEnd_BoxAlgorithm_GeneralStatisticsGenerator_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GeneralStatisticsGenerator_Inputs| + * |OVP_DocEnd_BoxAlgorithm_GeneralStatisticsGenerator_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_GeneralStatisticsGenerator_Input1| + * The signal stream to analyse. + * |OVP_DocEnd_BoxAlgorithm_GeneralStatisticsGenerator_Input1| + * + * |OVP_DocBegin_BoxAlgorithm_GeneralStatisticsGenerator_Input2| + * The stimulation stream to analyse. + * |OVP_DocEnd_BoxAlgorithm_GeneralStatisticsGenerator_Input2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GeneralStatisticsGenerator_Settings| + * |OVP_DocEnd_BoxAlgorithm_GeneralStatisticsGenerator_Settings| + + * |OVP_DocBegin_BoxAlgorithm_GeneralStatisticsGenerator_Setting1| + * Path to the file where the results will be wrote. + * |OVP_DocEnd_BoxAlgorithm_GeneralStatisticsGenerator_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GeneralStatisticsGenerator_Examples| + * The resulting file should look like this : +\verbatim + + + + (0x00000000, 0x00008100) + + 500 + + + + + sinusOsc 1 + 2.99595 + -2.99582 + 0.00374409 + + + sinusOsc 2 + 2.99555 + -2.99594 + 0.00215169 + + + sinusOsc 3 + 2.99594 + -2.99592 + 0.000474523 + + + sinusOsc 4 + 2.99591 + -2.99594 + 0.00127219 + + + +\endverbatim + * |OVP_DocEnd_BoxAlgorithm_GeneralStatisticsGenerator_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + * |OVP_DocBegin_BoxAlgorithm_KappaCoef_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_KappaCoef_Miscellaneous| +* +*/ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/share/openvibe-simple-visualization-ClassifierAccuracyMeasure.ui b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/share/openvibe-simple-visualization-ClassifierAccuracyMeasure.ui new file mode 100644 index 0000000..865209f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/share/openvibe-simple-visualization-ClassifierAccuracyMeasure.ui @@ -0,0 +1,111 @@ + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 8 + 8 + 8 + True + + + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Classifier Accuracy Measure + dialog + + + True + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + reset + gtk-refresh + + + False + True + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + percentages + gtk-justify-center + True + + + False + True + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + scores + gtk-justify-center + + + False + True + + + + + + + + + True + True + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + 0 + 0 + 0.20000000298023224 + bottom-to-top + + + False + True + + + + + True + Classifier + + + True + True + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/algorithms/ovpCAlgorithmConfusionMatrix.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/algorithms/ovpCAlgorithmConfusionMatrix.cpp new file mode 100644 index 0000000..013199c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/algorithms/ovpCAlgorithmConfusionMatrix.cpp @@ -0,0 +1,218 @@ +#include "ovpCAlgorithmConfusionMatrix.h" + +namespace OpenViBE { +namespace Plugins { +namespace Evaluation { + +#ifdef DEBUG +static void dumpMatrix(Kernel::ILogManager& mng, const CMatrix& mat, const CString& desc) +{ + mng << Kernel::LogLevel_Info << desc << "\n"; + for (size_t i = 0; i < mat.getDimensionSize(0); i++) + { + mng << Kernel::LogLevel_Info << "Row " << i << ": "; + for (size_t j = 0; j < mat.getDimensionSize(1); j++) { mng << mat.getBuffer()[i * mat.getDimensionSize(1) + j] << " "; } + mng << "\n"; + } +} +#endif + +bool CAlgorithmConfusionMatrix::initialize() +{ + ip_targetStimSet.initialize(getInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_TargetStimulationSet)); + ip_classifierStimSet.initialize(getInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_ClassifierStimulationSet)); + ip_classesCodes.initialize(getInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_ClassCodes)); + ip_usePercentages.initialize(getInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_Percentage)); + ip_useSums.initialize(getInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_Sums)); + op_confusionMatrix.initialize(getOutputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_OutputParameterId_ConfusionMatrix)); + + return true; +} + +bool CAlgorithmConfusionMatrix::uninitialize() +{ +#ifdef DEBUG + dumpMatrix(this->getLogManager(), m_confusionMatrix, "Confusion matrix"); +#endif + + ip_targetStimSet.uninitialize(); + ip_classifierStimSet.uninitialize(); + ip_classesCodes.uninitialize(); + ip_usePercentages.uninitialize(); + ip_useSums.uninitialize(); + op_confusionMatrix.uninitialize(); + + return true; +} + +bool CAlgorithmConfusionMatrix::process() +{ + const size_t nClass = size_t(ip_classesCodes->getStimulationCount()); + + if (this->isInputTriggerActive(OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_ResetTarget)) + { + for (size_t i = 0; i < ip_classesCodes->getStimulationCount(); ++i) + { + this->getLogManager() << Kernel::LogLevel_Trace << "class code " << i << ": " << ip_classesCodes->getStimulationIdentifier(i) << "\n"; + } + + m_nClassificationAttemptPerClass.clear(); + for (size_t i = 0; i < ip_classesCodes->getStimulationCount(); ++i) + { + m_nClassificationAttemptPerClass.insert(std::make_pair(ip_classesCodes->getStimulationIdentifier(i), 0)); + } + + if (ip_useSums) { op_confusionMatrix->resize(nClass + 1, nClass + 1); } + else { op_confusionMatrix->resize(nClass, nClass); } + + for (size_t i = 0; i < nClass; ++i) + { + const char* name = this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, + ip_classesCodes->getStimulationIdentifier(i)).toASCIIString(); + op_confusionMatrix->setDimensionLabel(0, i, (std::string("Target Class\n") + name)); + op_confusionMatrix->setDimensionLabel(1, i, (std::string("Result Class\n") + name)); + } + + if (ip_useSums) + { + op_confusionMatrix->setDimensionLabel(0, nClass, "Sums"); + op_confusionMatrix->setDimensionLabel(1, nClass, "Sums"); + } + + m_confusionMatrix.resize(nClass, nClass); + + // initialization + for (size_t i = 0; i < op_confusionMatrix->getDimensionSize(0); ++i) + { + for (size_t j = 0; j < op_confusionMatrix->getDimensionSize(1); ++j) + { + op_confusionMatrix->getBuffer()[i * op_confusionMatrix->getDimensionSize(1) + j] = 0.0; + if (i < m_confusionMatrix.getDimensionSize(0) && j < m_confusionMatrix.getDimensionSize(1)) + { + m_confusionMatrix.getBuffer()[i * m_confusionMatrix.getDimensionSize(1) + j] = 0.0; + } + } + } + } + + if (this->isInputTriggerActive(OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_ResetClassifier)) { } + + if (this->isInputTriggerActive(OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_FeedTarget)) + { + for (size_t s = 0; s < ip_targetStimSet->getStimulationCount(); ++s) + { + uint64_t id = ip_targetStimSet->getStimulationIdentifier(s); + if (isClass(id)) + { + uint64_t date = ip_targetStimSet->getStimulationDate(s); + m_targetsTimeLines.insert(std::pair(date, id)); + getLogManager() << Kernel::LogLevel_Trace << "Current target is " << m_targetsTimeLines.rbegin()->second << "\n"; + } + else { getLogManager() << Kernel::LogLevel_Trace << "The target received is not a valid class: " << id << "\n"; } + } + } + + if (this->isInputTriggerActive(OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_FeedClassifier)) + { + for (size_t s = 0; s < ip_classifierStimSet->getStimulationCount(); ++s) + { + //We need to locate the stimulation on the timeline + uint64_t id = ip_classifierStimSet->getStimulationIdentifier(s); + if (!isClass(id))//If we don't have + { + getLogManager() << Kernel::LogLevel_Trace << "The result received is not a valid class: " << id << "\n"; + continue; + } + uint64_t targeted = 0; + const uint64_t date = ip_classifierStimSet->getStimulationDate(s); + + bool found = false; + for (auto it = m_targetsTimeLines.begin(); it != m_targetsTimeLines.end() && !found; ++it) + { + auto nextTarget = it; + ++nextTarget; + if ((nextTarget == m_targetsTimeLines.end() || date < nextTarget->first) && date > it->first) + { + targeted = it->second; + found = true; + } + } + if (found) + { + this->getLogManager() << Kernel::LogLevel_Trace << "Result received : " << id << ". Corresponding target : " << targeted << ".\n"; + + if (!op_confusionMatrix->getBuffer()) + { + this->getLogManager() << Kernel::LogLevel_Error << "The confusion matrix buffer has not yet been initialized\n"; + return false; + } + + // now we found the target, let's update the confusion matrix + // we need to update the whole line vector for the targeted class + const size_t nOldAttempt = m_nClassificationAttemptPerClass[targeted]; + m_nClassificationAttemptPerClass[targeted]++; // the confusion matrix can treat this result + + size_t i = getClassIndex(targeted);// the good line index + const size_t resultIdx = getClassIndex(id); + for (size_t j = 0; j < nClass; ++j) + { + double newValue = 0.0; + const double oldValue = op_confusionMatrix->getBuffer()[i * op_confusionMatrix->getDimensionSize(0) + j]; + if (j == resultIdx) + { + newValue = (oldValue * nOldAttempt + 1) / (m_nClassificationAttemptPerClass[targeted]); + m_confusionMatrix.getBuffer()[i * nClass + j]++; + } + else { newValue = (oldValue * nOldAttempt) / (m_nClassificationAttemptPerClass[targeted]); } + if (ip_usePercentages) { op_confusionMatrix->getBuffer()[i * op_confusionMatrix->getDimensionSize(0) + j] = newValue; } + else // the count value + { + op_confusionMatrix->getBuffer()[i * op_confusionMatrix->getDimensionSize(0) + j] = m_confusionMatrix.getBuffer()[i * nClass + j]; + } + } + + //we compute the sums if needed + if (ip_useSums) + { + const size_t size = op_confusionMatrix->getDimensionSize(0); + double total = 0.0; + for (i = 0; i < nClass; ++i) + { + double sumRow = 0.0; + double sumCol = 0.0; + for (size_t j = 0; j < nClass; ++j) + { + sumRow += op_confusionMatrix->getBuffer()[i * size + j]; + sumCol += op_confusionMatrix->getBuffer()[j * size + i]; + } + op_confusionMatrix->getBuffer()[i * size + size - 1] = sumRow; + op_confusionMatrix->getBuffer()[(size - 1) * size + i] = sumCol; + total += sumRow; + } + op_confusionMatrix->getBuffer()[(size - 1) * size + size - 1] = + total; // the lower-right entry, i.e. the last in the buffer + } + } + else { getLogManager() << Kernel::LogLevel_Warning << " No target available.\n"; } + } + this->activateOutputTrigger(OVP_Algorithm_ConfusionMatrixAlgorithm_OutputTriggerId_ConfusionPerformed, true); + } + + return true; +} + +bool CAlgorithmConfusionMatrix::isClass(const uint64_t id) const +{ + for (size_t i = 0; i < ip_classesCodes->getStimulationCount(); ++i) { if (ip_classesCodes->getStimulationIdentifier(i) == id) { return true; } } + return false; +} + +size_t CAlgorithmConfusionMatrix::getClassIndex(const uint64_t id) const +{ + for (size_t i = 0; i < ip_classesCodes->getStimulationCount(); ++i) { if (ip_classesCodes->getStimulationIdentifier(i) == id) { return i; } } + return -1; +} + +} // namespace Evaluation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/algorithms/ovpCAlgorithmConfusionMatrix.h b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/algorithms/ovpCAlgorithmConfusionMatrix.h new file mode 100644 index 0000000..b2c86bc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/algorithms/ovpCAlgorithmConfusionMatrix.h @@ -0,0 +1,96 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Evaluation { +class CAlgorithmConfusionMatrix final : virtual public Toolkit::TAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_ConfusionMatrix) + +protected: + + Kernel::TParameterHandler ip_usePercentages; + Kernel::TParameterHandler ip_useSums; + + // input TARGET + Kernel::TParameterHandler ip_targetStimSet; + // deduced timeline: + std::map m_targetsTimeLines; + + // input CLASSIFIER + Kernel::TParameterHandler ip_classifierStimSet; + + //CONFUSION MATRIX computing + Kernel::TParameterHandler ip_classesCodes; + Kernel::TParameterHandler op_confusionMatrix; + + CMatrix m_confusionMatrix; // the values, not percentage + std::map m_nClassificationAttemptPerClass; + +private: + + bool isClass(const uint64_t id) const; + size_t getClassIndex(const uint64_t id) const; +}; + +class CAlgorithmConfusionMatrixDesc final : virtual public IAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Confusion Matrix Algorithm"); } + CString getAuthorName() const override { return CString("Laurent Bonnet"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + + CString getShortDescription() const override { return CString("Make a confusion matrix out of classification results coming from one classifier."); } + + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Classification"); } + CString getVersion() const override { return CString("1.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_ConfusionMatrix; } + IPluginObject* create() override { return new CAlgorithmConfusionMatrix; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_TargetStimulationSet, "Targets", + Kernel::ParameterType_StimulationSet); + prototype.addInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_ClassifierStimulationSet, "Classification results", + Kernel::ParameterType_StimulationSet); + prototype.addInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_ClassCodes, "Class codes", Kernel::ParameterType_StimulationSet); + prototype.addInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_Percentage, "Percentage", Kernel::ParameterType_Boolean); + prototype.addInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_Sums, "Sums", Kernel::ParameterType_Boolean); + + prototype.addOutputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_OutputParameterId_ConfusionMatrix, "Confusion matrix", + Kernel::ParameterType_Matrix); + + prototype.addInputTrigger(OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_ResetTarget, "Reset Target"); + prototype.addInputTrigger(OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_ResetClassifier, "Reset Classifier"); + prototype.addInputTrigger(OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_FeedTarget, "Feed Target"); + prototype.addInputTrigger(OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_FeedClassifier, "Feed Classifier"); + + prototype.addOutputTrigger(OVP_Algorithm_ConfusionMatrixAlgorithm_OutputTriggerId_ConfusionPerformed, "Confusion computing performed"); + + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_ConfusionMatrixDesc) +}; +} // namespace Evaluation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmClassifierAccuracyMeasure.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmClassifierAccuracyMeasure.cpp new file mode 100644 index 0000000..44cadcc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmClassifierAccuracyMeasure.cpp @@ -0,0 +1,275 @@ +#if defined(TARGET_HAS_ThirdPartyGTK) + +#include "ovpCBoxAlgorithmClassifierAccuracyMeasure.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Evaluation { + +static void reset_scores_button_cb(GtkToolButton* /*button*/, gpointer data) +{ + for (auto& progress : static_cast(data)->m_ProgressBar) + { + progress.score = 0; + progress.nStimulation = 0; + } +} + +static void show_percentages_toggle_button_cb(GtkToggleToolButton* button, gpointer data) +{ + static_cast(data)->m_ShowPercentages = (gtk_toggle_tool_button_get_active(button) ? true : false); +} + +static void show_scores_toggle_button_cb(GtkToggleToolButton* button, gpointer data) +{ + static_cast(data)->m_ShowScores = (gtk_toggle_tool_button_get_active(button) ? true : false); +} + +bool CBoxAlgorithmClassifierAccuracyMeasure::initialize() +{ + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + m_ProgressBar.resize(getStaticBoxContext().getInputCount() - 1); //-1 because the first input is the target + + //classifier decoders + for (size_t i = 1; i < nInput; ++i) + { + m_classifierStimDecoders.push_back(new Toolkit::TStimulationDecoder()); + m_classifierStimDecoders.back()->initialize(*this, i); + } + + m_targetStimDecoder.initialize(*this, 0); + + //widgets + m_mainWidgetInterface = gtk_builder_new(); + gtk_builder_add_from_file(m_mainWidgetInterface, + Directories::getDataDir() + "/plugins/evaluation/openvibe-simple-visualization-ClassifierAccuracyMeasure.ui", nullptr); + + m_toolbarWidgetInterface = gtk_builder_new(); + gtk_builder_add_from_file(m_toolbarWidgetInterface, + Directories::getDataDir() + "/plugins/evaluation/openvibe-simple-visualization-ClassifierAccuracyMeasure.ui", nullptr); + + gtk_builder_connect_signals(m_mainWidgetInterface, nullptr); + gtk_builder_connect_signals(m_toolbarWidgetInterface, nullptr); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_toolbarWidgetInterface, "reset-score-button")), "clicked", G_CALLBACK(reset_scores_button_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_toolbarWidgetInterface, "show-percentages-toggle-button")), "toggled", + G_CALLBACK(show_percentages_toggle_button_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_toolbarWidgetInterface, "show-scores-toggle-button")), "toggled", + G_CALLBACK(show_scores_toggle_button_cb), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_toolbarWidgetInterface, "classifier-accuracy-measure-toolbar")), "delete_event", + G_CALLBACK(gtk_widget_hide), nullptr); + + m_mainWidget = GTK_WIDGET(gtk_builder_get_object(m_mainWidgetInterface, "classifier-accuracy-measure-table")); + m_toolbarWidget = GTK_WIDGET(gtk_builder_get_object(m_toolbarWidgetInterface, "classifier-accuracy-measure-toolbar")); + + m_visualizationCtx = dynamic_cast(this->createPluginObject(OVP_ClassId_Plugin_VisualizationCtx)); + m_visualizationCtx->setWidget(*this, m_mainWidget); + m_visualizationCtx->setToolbar(*this, m_toolbarWidget); + + m_ShowPercentages = (gtk_toggle_tool_button_get_active( + GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_toolbarWidgetInterface, "show-percentages-toggle-button"))) ? true : false); + m_ShowScores = (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_toolbarWidgetInterface, "show-scores-toggle-button"))) + ? true : false); + + return true; +} + +bool CBoxAlgorithmClassifierAccuracyMeasure::uninitialize() +{ + const size_t nInput = this->getStaticBoxContext().getInputCount(); + //decoders + for (size_t i = 0; i < nInput - 1; ++i) + { + m_classifierStimDecoders[i]->uninitialize(); + delete m_classifierStimDecoders[i]; + } + m_classifierStimDecoders.clear(); + + m_targetStimDecoder.uninitialize(); + + //widgets + g_object_unref(m_toolbarWidgetInterface); + m_toolbarWidgetInterface = nullptr; + + g_object_unref(m_mainWidgetInterface); + m_mainWidgetInterface = nullptr; + + if (m_visualizationCtx) + { + this->releasePluginObject(m_visualizationCtx); + m_visualizationCtx = nullptr; + } + + return true; +} + +bool CBoxAlgorithmClassifierAccuracyMeasure::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} + +bool CBoxAlgorithmClassifierAccuracyMeasure::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const Kernel::IBox& staticBoxContext = this->getStaticBoxContext(); + const size_t nInput = staticBoxContext.getInputCount(); + + //input chunk 0 = targets + // we iterate over the "target" chunks and update the timeline + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_targetStimDecoder.decode(i); + + if (m_targetStimDecoder.isHeaderReceived()) + { + //header received + //adding the progress bars to the window + GtkTable* table = GTK_TABLE(gtk_builder_get_object(m_mainWidgetInterface, "classifier-accuracy-measure-table")); + gtk_table_resize(table, 1, guint(nInput - 1)); + + //@TODO i variable redefine replace alll i in the loop ( it's logical but must be verified + for (guint j = 0; j < nInput - 1; ++j) + { + GtkBuilder* builderBar = gtk_builder_new(); + gtk_builder_add_from_file( + builderBar, Directories::getDataDir() + "/plugins/evaluation/openvibe-simple-visualization-ClassifierAccuracyMeasure.ui", nullptr); + + GtkBuilder* builderLabel = gtk_builder_new(); + gtk_builder_add_from_file( + builderLabel, Directories::getDataDir() + "/plugins/evaluation/openvibe-simple-visualization-ClassifierAccuracyMeasure.ui", nullptr); + + GtkWidget* bar = GTK_WIDGET(gtk_builder_get_object(builderBar, "progress-bar-classifier-accuracy")); + GtkWidget* label = GTK_WIDGET(gtk_builder_get_object(builderLabel, "label-classifier-name")); + + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(bar)), bar); + gtk_table_attach(table, bar, j, j + 1, 0, 6, GtkAttachOptions(GTK_EXPAND | GTK_FILL), GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(label)), label); + gtk_table_attach(table, label, j, j + 1, 6, 7, GtkAttachOptions(GTK_EXPAND | GTK_FILL), GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0); + + g_object_unref(builderBar); + g_object_unref(builderLabel); + + progress_bar_t progressBar; + progressBar.progressBar = GTK_PROGRESS_BAR(bar); + progressBar.score = 0; + progressBar.nStimulation = 0; + progressBar.labelClassifier = GTK_LABEL(label); + + gtk_progress_bar_set_fraction(progressBar.progressBar, 0); + CString inputName; + staticBoxContext.getInputName(j + 1, inputName); + gtk_progress_bar_set_text(progressBar.progressBar, inputName.toASCIIString()); + gtk_label_set_text(progressBar.labelClassifier, inputName.toASCIIString()); + m_ProgressBar[j] = (progressBar); + } + + m_currentProcessingTimeLimit = 0; + } + + if (m_targetStimDecoder.isBufferReceived()) + { + //buffer received + //A new target comes, let's update the timeline with it + const IStimulationSet* dstStimSet = m_targetStimDecoder.getOutputStimulationSet(); + for (size_t s = 0; s < dstStimSet->getStimulationCount(); ++s) + { + const uint64_t id = dstStimSet->getStimulationIdentifier(s); + const uint64_t date = dstStimSet->getStimulationDate(s); + m_targetsTimeLines.insert(std::pair(date, id)); + getLogManager() << Kernel::LogLevel_Trace << "New target inserted (" << id << "," << CTime(date) << ")\n"; + } + + //we updtae the time limit for processing classifier stim + const uint64_t chunkEndTime = boxContext.getInputChunkEndTime(0, i); + m_currentProcessingTimeLimit = MAX(chunkEndTime, m_currentProcessingTimeLimit); + } + + if (m_targetStimDecoder.isEndReceived()) { } + + boxContext.markInputAsDeprecated(0, i); + } + + //input index 1-n = n classifier results + for (size_t ip = 1; ip < staticBoxContext.getInputCount(); ++ip) + { + for (size_t i = 0; i < boxContext.getInputChunkCount(ip); ++i) + { + // lets get the chunck end time + const uint64_t chunkEndTime = boxContext.getInputChunkEndTime(ip, i); + // if the incoming chunk is in the timeline + if (chunkEndTime <= m_currentProcessingTimeLimit) + { + if (!m_targetsTimeLines.empty()) + { + // we can process it + m_classifierStimDecoders[ip - 1]->decode(i); + + if (m_classifierStimDecoders[ip - 1]->isHeaderReceived()) { } //header received + if (m_classifierStimDecoders[ip - 1]->isBufferReceived()) + { + //buffer received + const IStimulationSet* stimSet = m_classifierStimDecoders[ip - 1]->getOutputStimulationSet(); + for (size_t s = 0; s < stimSet->getStimulationCount(); ++s) + { + //We need to locate the stimulation on the timeline + uint64_t id = stimSet->getStimulationIdentifier(s); + const uint64_t date = stimSet->getStimulationDate(s); + + getLogManager() << Kernel::LogLevel_Trace << "New Classifier state received (" << id << "," << CTime(date) << ") from Classifier " + << ip << "\n"; + + auto it = m_targetsTimeLines.begin(); + bool cont = true; + while (it != m_targetsTimeLines.end() && cont) + { + auto nextTarget = it; + ++nextTarget; + if ((nextTarget == m_targetsTimeLines.end() || date < nextTarget->first) + && date > it->first) + { + if (id == it->second) + { + //+1 for this classifier ! + m_ProgressBar[ip - 1].score++; + } + m_ProgressBar[ip - 1].nStimulation++; + cont = false; + } + ++it; + } + + //auto it = m_targetsTimeLines.lower_bound(l_stimulationFromClassifierDate); + } + + std::stringstream ss; + ss << std::fixed; + ss << std::setprecision(2); + if (m_ShowScores) { ss << "score : " << m_ProgressBar[ip - 1].score << "/" << m_ProgressBar[ip - 1].nStimulation << "\n"; } + double percent = 0.0; + if (m_ProgressBar[ip - 1].nStimulation != 0) { percent = m_ProgressBar[ip - 1].score * 1. / m_ProgressBar[ip - 1].nStimulation; } + if (m_ShowPercentages) { ss << percent * 100 << "%\n"; } + + gtk_progress_bar_set_fraction(m_ProgressBar[ip - 1].progressBar, percent); + gtk_progress_bar_set_text(m_ProgressBar[ip - 1].progressBar, ss.str().c_str()); + } + + if (m_targetStimDecoder.isEndReceived()) { } + } + + boxContext.markInputAsDeprecated(ip, i); + } + } + } + return true; +} + +#endif +} // namespace Evaluation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmClassifierAccuracyMeasure.h b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmClassifierAccuracyMeasure.h new file mode 100644 index 0000000..30f6a4d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmClassifierAccuracyMeasure.h @@ -0,0 +1,129 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyGTK) + +#include "../ovp_defines.h" +#include +#include +#include +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Evaluation { +class CBoxAlgorithmClassifierAccuracyMeasure final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_ClassifierAccuracyMeasure) + +protected: + + //codecs + // for the TARGET + Toolkit::TStimulationDecoder m_targetStimDecoder; + // For the CLASSIFIERS + std::vector*> m_classifierStimDecoders; + + + // deduced timeline: + std::map m_targetsTimeLines; + uint64_t m_currentProcessingTimeLimit = 0; + + + // Outputs: visualization in a gtk window + GtkBuilder* m_mainWidgetInterface = nullptr; + GtkBuilder* m_toolbarWidgetInterface = nullptr; + GtkWidget* m_mainWidget = nullptr; + GtkWidget* m_toolbarWidget = nullptr; + +public: + typedef struct + { + GtkLabel* labelClassifier; + GtkProgressBar* progressBar; + size_t score; + size_t nStimulation; + } progress_bar_t; + + std::vector m_ProgressBar; + bool m_ShowPercentages = false; + bool m_ShowScores = false; + +private: + VisualizationToolkit::IVisualizationContext* m_visualizationCtx = nullptr; +}; + +class CBoxAlgorithmClassifierAccuracyMeasureListener final : public Toolkit::TBoxListener +{ +public: + bool onInputNameChanged(Kernel::IBox& box, const size_t index) override + { + if (index == 0) { box.setInputName(0, "Targets"); } // forced + return true; + } + + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + box.setInputType(index, OV_TypeId_Stimulations); // all inputs must be stimulations + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmClassifierAccuracyMeasureDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Classifier Accuracy Measure"); } + CString getAuthorName() const override { return CString("Laurent Bonnet"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + + CString getShortDescription() const override { return CString("Displays real-time classifier accuracies as vertical progress bars"); } + + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Evaluation/Classification"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-sort-ascending"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ClassifierAccuracyMeasure; } + IPluginObject* create() override { return new CBoxAlgorithmClassifierAccuracyMeasure; } + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmClassifierAccuracyMeasureListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool hasFunctionality(const EPluginFunctionality functionality) const override { return functionality == EPluginFunctionality::Visualization; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Targets", OV_TypeId_Stimulations); + prototype.addInput("Classifier 1", OV_TypeId_Stimulations); + + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + + prototype.addInputSupport(OV_TypeId_Stimulations); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ClassifierAccuracyMeasureDesc) +}; +} // namespace Evaluation +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGTK diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmConfusionMatrix.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmConfusionMatrix.cpp new file mode 100644 index 0000000..a2f9401 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmConfusionMatrix.cpp @@ -0,0 +1,160 @@ +#include "ovpCBoxAlgorithmConfusionMatrix.h" + +#include "../algorithms/ovpCAlgorithmConfusionMatrix.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Evaluation { + +bool CBoxAlgorithmConfusionMatrix::initialize() +{ + //Initialize input/output + m_targetStimDecoder.initialize(*this, 0); + m_classifierStimDecoder.initialize(*this, 1); + + m_encoder.initialize(*this, 0); + + //CONFUSION MATRIX ALGORITHM + m_algorithm = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_ConfusionMatrix)); + m_algorithm->initialize(); + + Kernel::TParameterHandler percentHandler(m_algorithm->getInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_Percentage)); + percentHandler = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + Kernel::TParameterHandler sumsHandler(m_algorithm->getInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_Sums)); + if (!bool(percentHandler)) { sumsHandler = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); } + else + { + this->getLogManager() << Kernel::LogLevel_Debug << "Asking for percentage. The value of the setting \"Sums\" will be ignored.\n"; + sumsHandler = false; + } + + + const size_t nClass = getBoxAlgorithmContext()->getStaticBoxContext()->getSettingCount() - FIRST_CLASS_SETTING_INDEX; + std::vector classCodes; + classCodes.resize(nClass); + for (size_t i = 0; i < nClass; ++i) + { + // classes are settings from 2 to n + classCodes[i] = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i + FIRST_CLASS_SETTING_INDEX)); + } + // verification... + for (size_t i = 0; i < nClass; ++i) + { + for (size_t j = i + 1; j < nClass; ++j) + { + if (classCodes[i] == classCodes[j]) + { + const CString classValue = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i + FIRST_CLASS_SETTING_INDEX); + getLogManager() << Kernel::LogLevel_Error << "You must use unique classes to compute a confusion matrix. Class " << i + 1 << " and " << j + 1 << + " are the same (" << classValue << ").\n"; + return false; + } + } + } + + Kernel::TParameterHandler classesCodesHandler(m_algorithm->getInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_ClassCodes)); + for (size_t i = 0; i < classCodes.size(); ++i) { classesCodesHandler->appendStimulation(classCodes[i], 0, 0); } + + //Link all input/output + Kernel::TParameterHandler classifierStimSetHandler( + m_algorithm->getInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_ClassifierStimulationSet)); + classifierStimSetHandler.setReferenceTarget(m_classifierStimDecoder.getOutputStimulationSet()); + + Kernel::TParameterHandler targetStimSetHandler( + m_algorithm->getInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_TargetStimulationSet)); + targetStimSetHandler.setReferenceTarget(m_targetStimDecoder.getOutputStimulationSet()); + + Kernel::TParameterHandler matrixHandler(m_algorithm->getOutputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_OutputParameterId_ConfusionMatrix)); + m_encoder.getInputMatrix().setReferenceTarget(matrixHandler); + + return true; +} + +bool CBoxAlgorithmConfusionMatrix::uninitialize() +{ + m_algorithm->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_algorithm); + + m_encoder.uninitialize(); + m_targetStimDecoder.uninitialize(); + m_classifierStimDecoder.uninitialize(); + + return true; +} + +bool CBoxAlgorithmConfusionMatrix::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmConfusionMatrix::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + //Input 0: Targets + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_targetStimDecoder.decode(i); + + if (m_targetStimDecoder.isHeaderReceived()) + { + m_algorithm->process(OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_ResetTarget); + + m_encoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + m_currentProcessingTimeLimit = 0; + } + + if (m_targetStimDecoder.isBufferReceived()) + { + uint64_t chunkEndTime = boxContext.getInputChunkEndTime(0, i); + m_currentProcessingTimeLimit = (chunkEndTime > m_currentProcessingTimeLimit ? chunkEndTime : m_currentProcessingTimeLimit); + m_algorithm->process(OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_FeedTarget); + } + + if (m_targetStimDecoder.isEndReceived()) + { + m_encoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + + //Input 1: Classifier results + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + const uint64_t tEnd = boxContext.getInputChunkEndTime(1, i); + if (tEnd <= m_currentProcessingTimeLimit) + { + m_classifierStimDecoder.decode(i); + + if (m_classifierStimDecoder.isHeaderReceived()) { m_algorithm->process(OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_ResetClassifier); } + + if (m_classifierStimDecoder.isBufferReceived()) + { + m_algorithm->process(OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_FeedClassifier); + if (m_algorithm->isOutputTriggerActive(OVP_Algorithm_ConfusionMatrixAlgorithm_OutputTriggerId_ConfusionPerformed)) + { + m_encoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(1, i), boxContext.getInputChunkEndTime(1, i)); + } + } + + if (m_classifierStimDecoder.isEndReceived()) + { + m_encoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(1, i), boxContext.getInputChunkEndTime(1, i)); + } + + boxContext.markInputAsDeprecated(1, i); + } + } + + return true; +} +} // namespace Evaluation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmConfusionMatrix.h b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmConfusionMatrix.h new file mode 100644 index 0000000..7edcb47 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmConfusionMatrix.h @@ -0,0 +1,108 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Evaluation { +class CBoxAlgorithmConfusionMatrix final : virtual public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_ConfusionMatrix) + +protected: + + Toolkit::TStimulationDecoder m_targetStimDecoder; + Toolkit::TStimulationDecoder m_classifierStimDecoder; + + Toolkit::TStreamedMatrixEncoder m_encoder; + + Kernel::IAlgorithmProxy* m_algorithm = nullptr; + + uint64_t m_currentProcessingTimeLimit = 0; +}; + +class CBoxAlgorithmConfusionMatrixListener final : public Toolkit::TBoxListener +{ +public: + + bool onSettingAdded(Kernel::IBox& box, const size_t index) override + { + std::stringstream value; + value << "OVTK_StimulationId_Label_" << std::setfill('0') << std::setw(2) << index - 2; + box.setSettingName(index, ("Class " + std::to_string(index - 1)).c_str()); + box.setSettingType(index, OV_TypeId_Stimulation); + box.setSettingValue(index, value.str().c_str()); + return true; + } + + bool onSettingRemoved(Kernel::IBox& box, const size_t /*index*/) override + { + const size_t nSetting = box.getSettingCount(); + const size_t nClass = nSetting - FIRST_CLASS_SETTING_INDEX; + + for (size_t i = 0; i < nClass; ++i) { box.setSettingName(FIRST_CLASS_SETTING_INDEX + i, ("Class " + std::to_string(i + 1)).c_str()); } + + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmConfusionMatrixDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Confusion Matrix"); } + CString getAuthorName() const override { return CString("Laurent Bonnet"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + + CString getShortDescription() const override { return CString("Make a confusion matrix out of classification results coming from one classifier."); } + + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Evaluation/Classification"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-execute"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ConfusionMatrix; } + IPluginObject* create() override { return new CBoxAlgorithmConfusionMatrix; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Targets", OV_TypeId_Stimulations); + prototype.addInput("Classification results", OV_TypeId_Stimulations); + prototype.addOutput("Confusion Matrix", OV_TypeId_StreamedMatrix); + + prototype.addSetting("Percentages", OV_TypeId_Boolean, "true"); + prototype.addSetting("Sums", OV_TypeId_Boolean, "false"); + + prototype.addSetting("Class 1", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00"); + prototype.addSetting("Class 2", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_01"); + + prototype.addFlag(Kernel::BoxFlag_CanAddSetting); + + return true; + } + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmConfusionMatrixListener; } + virtual void releaseBoxListener(IBoxListener* listener) { delete listener; } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ConfusionMatrixDesc) +}; +} // namespace Evaluation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmKappaCoefficient.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmKappaCoefficient.cpp new file mode 100644 index 0000000..f629b51 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmKappaCoefficient.cpp @@ -0,0 +1,220 @@ +#if defined(TARGET_HAS_ThirdPartyGTK) + +#include "ovpCBoxAlgorithmKappaCoefficient.h" +#include "../algorithms/ovpCAlgorithmConfusionMatrix.h" + +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Evaluation { + +static const size_t CLASS_LABEL_OFFSET = 1; + +bool CBoxAlgorithmKappaCoef::initialize() +{ + //Initialize input/output + m_targetStimDecoder.initialize(*this, 0); + m_classifierStimDecoder.initialize(*this, 1); + + m_encoder.initialize(*this, 0); + + //Confusion matrix algorithm + m_algorithm = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_ConfusionMatrix)); + m_algorithm->initialize(); + + Kernel::TParameterHandler percentHandler(m_algorithm->getInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_Percentage)); + percentHandler = false; + + Kernel::TParameterHandler sumsHandler(m_algorithm->getInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_Sums)); + sumsHandler = true; + + m_amountClass = getBoxAlgorithmContext()->getStaticBoxContext()->getSettingCount() - CLASS_LABEL_OFFSET; + std::vector classCodes; + classCodes.resize(m_amountClass); + for (size_t i = 0; i < m_amountClass; ++i) + { + // classes are settings from 2 to n + classCodes[i] = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i + CLASS_LABEL_OFFSET)); + } + + // Let's check that each identifier is unique + for (size_t i = 0; i < m_amountClass; ++i) + { + for (size_t j = i + 1; j < m_amountClass; ++j) + { + if (classCodes[i] == classCodes[j]) + { + const CString value = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i + CLASS_LABEL_OFFSET); + getLogManager() << Kernel::LogLevel_Error << "You must use unique classes to compute a Kappa coefficient. Class " << i + 1 << " and " << j + 1 + << " are the same (" << value.toASCIIString() << ").\n"; + return false; + } + } + } + + Kernel::TParameterHandler classesCodesHandler( + m_algorithm->getInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_ClassCodes)); + for (size_t i = 0; i < classCodes.size(); ++i) { classesCodesHandler->appendStimulation(classCodes[i], 0, 0); } + + //Link all input/output + Kernel::TParameterHandler classifierStimSetHandler( + m_algorithm->getInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_ClassifierStimulationSet)); + classifierStimSetHandler.setReferenceTarget(m_classifierStimDecoder.getOutputStimulationSet()); + + Kernel::TParameterHandler targetStimSetHandler( + m_algorithm->getInputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_TargetStimulationSet)); + targetStimSetHandler.setReferenceTarget(m_targetStimDecoder.getOutputStimulationSet()); + + op_confusionMatrix.initialize(m_algorithm->getOutputParameter(OVP_Algorithm_ConfusionMatrixAlgorithm_OutputParameterId_ConfusionMatrix)); + + GtkTable* table = GTK_TABLE(gtk_table_new(2, 1, false)); + + m_kappaLabel = gtk_label_new("x"); + gtk_table_attach(table, m_kappaLabel, 0, 1, 0, 5, GtkAttachOptions(GTK_EXPAND | GTK_FILL), GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0); + + + m_visualizationCtx = dynamic_cast(this->createPluginObject(OVP_ClassId_Plugin_VisualizationCtx)); + m_visualizationCtx->setWidget(*this, GTK_WIDGET(table)); + + PangoContext* ctx = gtk_widget_get_pango_context(GTK_WIDGET(m_kappaLabel)); + PangoFontDescription* fontDesc = pango_context_get_font_description(ctx); + pango_font_description_set_size(fontDesc, 40 * PANGO_SCALE); + gtk_widget_modify_font(m_kappaLabel, fontDesc); + + return true; +} + +bool CBoxAlgorithmKappaCoef::uninitialize() +{ + //Log for the automatic test + this->getLogManager() << Kernel::LogLevel_Info << "Final value of Kappa " << m_kappaCoef << "\n"; + m_algorithm->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_algorithm); + + m_encoder.uninitialize(); + m_targetStimDecoder.uninitialize(); + m_classifierStimDecoder.uninitialize(); + + if (m_visualizationCtx) + { + this->releasePluginObject(m_visualizationCtx); + m_visualizationCtx = nullptr; + } + + return true; +} + + +bool CBoxAlgorithmKappaCoef::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmKappaCoef::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + //Input 0: Targets + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_targetStimDecoder.decode(i); + + if (m_targetStimDecoder.isHeaderReceived()) + { + m_algorithm->process(OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_ResetTarget); + + m_encoder.getInputMatrix()->resize(1); + m_encoder.getInputMatrix()->setDimensionLabel(0, 0, "Kappa"); + + m_encoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + m_currentProcessingTimeLimit = 0; + } + + if (m_targetStimDecoder.isBufferReceived()) + { + uint64_t end = boxContext.getInputChunkEndTime(0, i); + m_currentProcessingTimeLimit = (end > m_currentProcessingTimeLimit ? end : m_currentProcessingTimeLimit); + m_algorithm->process(OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_FeedTarget); + } + + if (m_targetStimDecoder.isEndReceived()) + { + m_encoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + + //Input 1: Classifier results + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + const uint64_t end = boxContext.getInputChunkEndTime(1, i); + if (end <= m_currentProcessingTimeLimit) + { + m_classifierStimDecoder.decode(i); + + if (m_classifierStimDecoder.isHeaderReceived()) { m_algorithm->process(OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_ResetClassifier); } + + if (m_classifierStimDecoder.isBufferReceived()) + { + m_algorithm->process(OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_FeedClassifier); + if (m_algorithm->isOutputTriggerActive(OVP_Algorithm_ConfusionMatrixAlgorithm_OutputTriggerId_ConfusionPerformed)) + { + //The confusion matrix has changed so we need to update the kappa coefficient + double* matrix = op_confusionMatrix->getBuffer(); + //First we need the amount of sample that have been classified + const size_t total = size_t(matrix[(m_amountClass + 1) * (m_amountClass + 1) - 1]); + + //Now we gonna compute the two sum we need to compute the kappa coefficient + //It's more easy to use a double loop + double observed = 0; + double expected = 0; + + for (size_t j = 0; j < m_amountClass; ++j) + { + //We need to take the column sum in account + observed += matrix[j * (m_amountClass + 1) + j]; + expected += (matrix[(m_amountClass + 1) * j + m_amountClass] * matrix[(m_amountClass + 1) * m_amountClass + j]); + } + observed /= total; + expected /= (total * total); + + m_kappaCoef = (observed - expected) / (1 - expected); + + updateKappaValue(); + m_encoder.getInputMatrix()->getBuffer()[0] = m_kappaCoef; + m_encoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(1, i), boxContext.getInputChunkEndTime(1, i)); + } + } + + if (m_classifierStimDecoder.isEndReceived()) + { + m_encoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(1, i), boxContext.getInputChunkEndTime(1, i)); + } + + boxContext.markInputAsDeprecated(1, i); + } + } + + return true; +} + +void CBoxAlgorithmKappaCoef::updateKappaValue() const +{ + std::stringstream ss; + ss << std::fixed << std::setprecision(2) << m_kappaCoef; + gtk_label_set(GTK_LABEL(m_kappaLabel), ss.str().c_str()); +} + + +#endif +} // namespace Evaluation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmKappaCoefficient.h b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmKappaCoefficient.h new file mode 100644 index 0000000..d0913bb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmKappaCoefficient.h @@ -0,0 +1,165 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyGTK) + +//You may have to change this path to match your folder organisation +#include "../ovp_defines.h" + +#include +#include + +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Evaluation { +/** + * \class CBoxAlgorithmKappaCoef + * \author Serrière Guillaume (Inria) + * \date Tue May 5 12:45:13 2015 + * \brief The class CBoxAlgorithmKappaCoef describes the box Kappa coefficient. + * + */ +class CBoxAlgorithmKappaCoef final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_KappaCoef) + +protected: + void updateKappaValue() const; + + Toolkit::TStimulationDecoder m_targetStimDecoder; + Toolkit::TStimulationDecoder m_classifierStimDecoder; + + Toolkit::TStreamedMatrixEncoder m_encoder; + + Kernel::TParameterHandler op_confusionMatrix; + + Kernel::IAlgorithmProxy* m_algorithm = nullptr; + + size_t m_amountClass = 0; + uint64_t m_currentProcessingTimeLimit = 0; + double m_kappaCoef = 0; + + GtkWidget* m_kappaLabel = nullptr; +private: + VisualizationToolkit::IVisualizationContext* m_visualizationCtx = nullptr; +}; + + +// The box listener can be used to call specific callbacks whenever the box structure changes : input added, name changed, etc. +// Please uncomment below the callbacks you want to use. +class CBoxAlgorithmKappaCoefListener final : public Toolkit::TBoxListener +{ +public: + + bool onSettingValueChanged(Kernel::IBox& box, const size_t index) override + { + if (index == 0) + { + CString nClass; + box.getSettingValue(index, nClass); + + if (nClass.length() == 0) { return true; } + + size_t nSetting; + std::stringstream ss(nClass.toASCIIString()); + ss >> nSetting; + + //First of all we prevent for the value to goes under 1. + if (nSetting < 1) + { + box.setSettingValue(index, "1"); + nSetting = 1; + } + size_t nCurrent = box.getSettingCount() - 1; + //We have two choice 1/We need to add class, 2/We need to remove some + if (nCurrent < nSetting) + { + while (nCurrent < nSetting) + { + box.addSetting(("Stimulation of class " + std::to_string(nCurrent + 1)).c_str(), OVTK_TypeId_Stimulation, ""); + ++nCurrent; + } + } + else + { + while (nCurrent > nSetting) + { + box.removeSetting(box.getSettingCount() - 1); + --nCurrent; + } + } + } + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +/** + * \class CBoxAlgorithmKappaCoefDesc + * \author Serrière Guillaume (Inria) + * \date Tue May 5 12:45:13 2015 + * \brief Descriptor of the box Kappa coefficient. + * + */ +class CBoxAlgorithmKappaCoefDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Kappa coefficient"); } + CString getAuthorName() const override { return CString("Serrière Guillaume"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Compute the kappa coefficient for the classifier."); } + CString getDetailedDescription() const override { return CString("The box computes kappa coefficient for a classifier."); } + CString getCategory() const override { return CString("Evaluation/Classification"); } + CString getVersion() const override { return CString("0.1"); } + CString getStockItemName() const override { return CString("gtk-yes"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_KappaCoef; } + IPluginObject* create() override { return new CBoxAlgorithmKappaCoef; } + + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmKappaCoefListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool hasFunctionality(const EPluginFunctionality functionality) const override { return functionality == EPluginFunctionality::Visualization; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Expected stimulations", OV_TypeId_Stimulations); + prototype.addInput("Found stimulations", OV_TypeId_Stimulations); + + prototype.addOutput("Confusion Matrix", OV_TypeId_StreamedMatrix); + + prototype.addSetting("Number of classes", OV_TypeId_Integer, "2"); + prototype.addSetting("Stimulation of class 1", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_01"); + prototype.addSetting("Stimulation of class 2", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_02"); + + prototype.addFlag(Kernel::BoxFlag_CanModifySetting); + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_KappaCoefDesc) +}; +} // namespace Evaluation +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGTK diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmROCCurve.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmROCCurve.cpp new file mode 100644 index 0000000..1b46dad --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmROCCurve.cpp @@ -0,0 +1,200 @@ +#if defined(TARGET_HAS_ThirdPartyGTK) + +#include "ovpCBoxAlgorithmROCCurve.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Evaluation { + +static bool compareCTimelineStimulationPair(const CTimestampLabelPair& rElt1, const CTimestampLabelPair& rElt2) { return rElt1.first < rElt2.first; } + +static bool compareValueAndStimulationTimelinePair(const CTimestampLabelPair& rElt1, const CTimestampValuesPair& rElt2) { return rElt1.first < rElt2.first; } + +static bool compareRocValuePair(const CRocPairValue& rElt1, const CRocPairValue& rElt2) { return rElt1.second > rElt2.second; } + +static bool isPositive(const CRocPairValue& rElt1) { return rElt1.first; } + +bool CBoxAlgorithmROCCurve::initialize() +{ + m_expectedDecoder.initialize(*this, 0); + m_classificationDecoder.initialize(*this, 1); + + m_computationTrigger = CIdentifier(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)); + + m_widget = GTK_WIDGET(gtk_notebook_new()); + + for (size_t i = 2; i < this->getStaticBoxContext().getSettingCount(); ++i) + { + CIdentifier classLabel(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i)); + CString className = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i); + + m_classStimSet.insert(classLabel); + + m_drawerList.push_back(new CROCCurveDraw(GTK_NOTEBOOK(m_widget), i - 1, className)); + } + + m_visualizationCtx = dynamic_cast(this->createPluginObject(OVP_ClassId_Plugin_VisualizationCtx)); + m_visualizationCtx->setWidget(*this, m_widget); + + return true; +} + +bool CBoxAlgorithmROCCurve::uninitialize() +{ + m_expectedDecoder.uninitialize(); + m_classificationDecoder.uninitialize(); + + for (size_t i = 0; i < m_drawerList.size(); ++i) { delete m_drawerList[i]; } + + //The m_valueTimeline vector contains each dynamically instantiate values that need to be free'd + for (size_t i = 0; i < m_valueTimeline.size(); ++i) { delete m_valueTimeline[i].second; } + + if (m_visualizationCtx) + { + this->releasePluginObject(m_visualizationCtx); + m_visualizationCtx = nullptr; + } + + return true; +} + + +bool CBoxAlgorithmROCCurve::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + + +bool CBoxAlgorithmROCCurve::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + //First let's deal with the expected. + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_expectedDecoder.decode(i); + + if (m_expectedDecoder.isHeaderReceived()) { m_stimTimeline.clear(); } + + if (m_expectedDecoder.isBufferReceived()) + { + IStimulationSet* stimSet = m_expectedDecoder.getOutputStimulationSet(); + for (size_t k = 0; k < stimSet->getStimulationCount(); ++k) + { + CIdentifier id = stimSet->getStimulationIdentifier(k); + if (m_classStimSet.find(id) != m_classStimSet.end()) { m_stimTimeline.push_back(CTimestampLabelPair(stimSet->getStimulationDate(k), id.id())); } + //We need to check if we receive the computation trigger + if (id == m_computationTrigger) { computeROCCurves(); } + } + } + } + + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + m_classificationDecoder.decode(i); + if (m_classificationDecoder.isHeaderReceived()) { m_valueTimeline.clear(); } + if (m_classificationDecoder.isBufferReceived()) + { + CMatrix* matrixValue = m_classificationDecoder.getOutputMatrix(); + //The matrix is suppose to have only one dimension + double* arrayValue; + + if (matrixValue->getBufferElementCount() == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Received zero-sized buffer\n"; + return false; + } + if (matrixValue->getBufferElementCount() > 1) + { + arrayValue = new double[matrixValue->getBufferElementCount()]; + for (size_t k = 0; k < matrixValue->getBufferElementCount(); ++k) { arrayValue[k] = matrixValue->getBuffer()[k]; } + } + else + { + arrayValue = new double[2]; + arrayValue[0] = matrixValue->getBuffer()[0]; + arrayValue[1] = 1 - matrixValue->getBuffer()[0]; + } + + uint64_t timestamp = boxContext.getInputChunkEndTime(1, i); //the time in stimulation correspond to the end of the chunck (cf processorbox code) + m_valueTimeline.push_back(CTimestampValuesPair(timestamp, arrayValue)); + } + } + return true; +} + +bool CBoxAlgorithmROCCurve::computeROCCurves() +{ + //Now we assiociate all values to the corresponding label + std::sort(m_stimTimeline.begin(), m_stimTimeline.end(), compareCTimelineStimulationPair);//ensure the timeline is ok + + for (auto& val : m_valueTimeline) + { + auto bound = std::lower_bound(m_stimTimeline.begin(), m_stimTimeline.end(), val, compareValueAndStimulationTimelinePair); + if (bound != m_stimTimeline.begin()) + { + --bound; + m_labelValueList.push_back(CLabelValuesPair(bound->second, val.second)); + } + else + { + //Impossible to find the corresponding stimulation + this->getLogManager() << Kernel::LogLevel_Warning << "A result of classification cannot be connected to a class. The result will be discarded.\n"; + } + } + + //We cannot use the set because we need the correct order + for (size_t i = 2; i < this->getStaticBoxContext().getSettingCount(); ++i) + { + CIdentifier classLabel(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i)); + computeOneROCCurve(classLabel, i - 2); + } + //Now we ask to the current page to draw itself + const gint currPage = gtk_notebook_current_page(GTK_NOTEBOOK(m_widget)); + if (currPage < 0) + { + this->getLogManager() << Kernel::LogLevel_Trace << + "No page is selected. The designer is probably in no visualization mode. Skipping the drawing phase\n"; + } + else { m_drawerList[currPage]->forceRedraw(); } + return true; +} + +bool CBoxAlgorithmROCCurve::computeOneROCCurve(const CIdentifier& classID, const size_t classIdx) +{ + std::vector values; + for (const auto& v : m_labelValueList) + { + CRocPairValue value; + value.first = v.first == classID.id(); + value.second = v.second[classIdx]; + values.push_back(value); + } + std::sort(values.begin(), values.end(), compareRocValuePair); + + size_t nTruePositive = 0; + size_t nFalsePositive = 0; + + const size_t nPositive = std::count_if(values.begin(), values.end(), isPositive); + const size_t nNegative = values.size() - nPositive; + + std::vector& coordinateVector = m_drawerList[classIdx]->getCoordinateVector(); + + for (const auto& value : values) + { + value.first ? ++nTruePositive : ++nFalsePositive; + coordinateVector.push_back(CCoordinate(double(nFalsePositive) / nNegative, double(nTruePositive) / nPositive)); + } + m_drawerList[classIdx]->generateCurve(); + + return true; +} + +#endif +} // namespace Evaluation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmROCCurve.h b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmROCCurve.h new file mode 100644 index 0000000..bf272c2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmROCCurve.h @@ -0,0 +1,181 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyGTK) + +#include "../ovp_defines.h" + +#include +#include + +#include "ovpCROCCurveDraw.h" + +#include + +#include +#include +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Evaluation { +typedef std::pair CTimestampLabelPair; +typedef std::pair CTimestampValuesPair; +typedef std::pair CLabelValuesPair; + +typedef std::pair CRocPairValue; + +/** + * \class CBoxAlgorithmROCCurve + * \author Serrière Guillaume (Inria) + * \date Thu May 28 11:49:24 2015 + * \brief The class CBoxAlgorithmROCCurve describes the box ROC curve. + * The roc curve is a graphical plot that represents the performance of a classifier. This curve is created by plotting the true positive + * rate against the false positive rate at various threshold settings. + * + */ +class CBoxAlgorithmROCCurve final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + + bool process() override; + + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_ROCCurve) + +private: + bool computeROCCurves(); + bool computeOneROCCurve(const CIdentifier& classID, const size_t classIdx); + + // Input decoder: + Toolkit::TStimulationDecoder m_expectedDecoder; + Toolkit::TStreamedMatrixDecoder m_classificationDecoder; + + std::set m_classStimSet; + CIdentifier m_computationTrigger = CIdentifier::undefined(); + + std::vector m_stimTimeline; + std::vector m_valueTimeline; + + std::vector m_labelValueList; + + //Display section + GtkWidget* m_widget = nullptr; + std::vector m_drawerList; + + VisualizationToolkit::IVisualizationContext* m_visualizationCtx = nullptr; +}; + +// The box listener can be used to call specific callbacks whenever the box structure changes : input added, name changed, etc. +// Please uncomment below the callbacks you want to use. +class CBoxAlgorithmROCCurveListener final : public Toolkit::TBoxListener +{ +public: + + bool onSettingValueChanged(Kernel::IBox& box, const size_t index) override + { + if (index == 1) + { + CString nClass; + box.getSettingValue(index, nClass); + //Could happen if we rewritte a number + if (nClass.length() == 0) { return true; } + + size_t nSetting; + std::stringstream ss(nClass.toASCIIString()); + ss >> nSetting; + + //First of all we prevent for the value to goes under 1. + if (nSetting < 1) + { + box.setSettingValue(index, "1"); + nSetting = 1; + } + + size_t nCurrent = box.getSettingCount() - 2; + //We have two choice 1/We need to add class, 2/We need to remove some + if (nCurrent < nSetting) + { + while (nCurrent < nSetting) + { + box.addSetting(("Class " + std::to_string(nCurrent + 1) + " identifier").c_str(), OVTK_TypeId_Stimulation, ""); + ++nCurrent; + } + } + else + { + while (nCurrent > nSetting) + { + box.removeSetting(box.getSettingCount() - 1); + --nCurrent; + } + } + } + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + + +/** + * \class CBoxAlgorithmROCCurveDesc + * \author Serrière Guillaume (Inria) + * \date Thu May 28 11:49:24 2015 + * \brief Descriptor of the box ROC curve. + * + */ +class CBoxAlgorithmROCCurveDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("ROC curve"); } + CString getAuthorName() const override { return CString("Serrière Guillaume"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Compute the ROC curve for each class."); } + CString getDetailedDescription() const override { return CString("The box computes the ROC curve for each class."); } + CString getCategory() const override { return CString("Evaluation/Classification"); } + CString getVersion() const override { return CString("0.1"); } + CString getStockItemName() const override { return CString("gtk-yes"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ROCCurve; } + IPluginObject* create() override { return new CBoxAlgorithmROCCurve; } + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmROCCurveListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool hasFunctionality(const EPluginFunctionality functionality) const override { return functionality == EPluginFunctionality::Visualization; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Expected labels", OV_TypeId_Stimulations); + prototype.addInput("Probability values", OV_TypeId_StreamedMatrix); + + prototype.addSetting("Computation trigger", OV_TypeId_Stimulation, "OVTK_StimulationId_ExperimentStop"); + prototype.addSetting("Number of classes", OV_TypeId_Integer, "2"); + prototype.addSetting("Class 1 identifier", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_01"); + prototype.addSetting("Class 2 identifier", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_02"); + + prototype.addFlag(Kernel::BoxFlag_CanModifySetting); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ROCCurveDesc) +}; +} // namespace Evaluation +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGTK diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmStatisticGenerator.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmStatisticGenerator.cpp new file mode 100644 index 0000000..fbcf18a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmStatisticGenerator.cpp @@ -0,0 +1,179 @@ +#include "ovpCBoxAlgorithmStatisticGenerator.h" + +#include + +#include +#include +#include +#include + +namespace { +const char* const STATISTIC_ROOT_NODE_NAME = "Statistic"; +const char* const STIMULATION_LIST_NODE_NAME = "Stimulations-list"; +const char* const STIMULATION_NODE_NAME = "Stimulation"; +const char* const IDENTIFIER_CODE_NODE_NAME = "Identifier"; +const char* const IDENTIFIER_LABEL_NODE_NAME = "Label"; +const char* const AMOUNT_NODE_NAME = "Count"; + +const char* const CHANNEL_LIST_NODE_NAME = "Channel-list"; +const char* const CHANNEL_NODE_NAME = "Channel"; +const char* const CHANNEL_LABEL_NODE_NAME = "Name"; +const char* const CHANNEL_MIN_NODE_NAME = "Minimum"; +const char* const CHANNEL_MAX_NODE_NAME = "Maximum"; +const char* const CHANNEL_MEAN_NODE_NAME = "Mean"; +} // namespace + + +namespace OpenViBE { +namespace Plugins { +namespace Evaluation { + +bool CBoxAlgorithmStatisticGenerator::initialize() +{ + m_signalDecoder.initialize(*this, 0); + m_stimDecoder.initialize(*this, 1); + + m_stimulations.clear(); + m_hasBeenStreamed = false; + m_filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + if (m_filename == CString("")) + { + this->getLogManager() << Kernel::LogLevel_Error << "The filename is empty\n"; + return false; + } + return true; +} + +bool CBoxAlgorithmStatisticGenerator::uninitialize() +{ + bool res = true; + + m_signalDecoder.uninitialize(); + m_stimDecoder.uninitialize(); + + if (m_hasBeenStreamed) + { + XML::IXMLNode* rootNode = XML::createNode(STATISTIC_ROOT_NODE_NAME); + XML::IXMLNode* stimNode = XML::createNode(STIMULATION_LIST_NODE_NAME); + for (const auto& s : m_stimulations) + { + XML::IXMLNode* node = XML::createNode(STIMULATION_NODE_NAME); + XML::IXMLNode* idNode = XML::createNode(IDENTIFIER_CODE_NODE_NAME); + XML::IXMLNode* labelNode = XML::createNode(IDENTIFIER_LABEL_NODE_NAME); + XML::IXMLNode* amountNode = XML::createNode(AMOUNT_NODE_NAME); + + CIdentifier id = s.first; + std::stringstream ss; + ss << std::fixed << std::setprecision(10) << m_stimulations[id]; + + idNode->setPCData(id.str().c_str()); + labelNode->setPCData(this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, id.id()).toASCIIString()); + amountNode->setPCData(ss.str().c_str()); + + node->addChild(idNode); + node->addChild(labelNode); + node->addChild(amountNode); + stimNode->addChild(node); + } + rootNode->addChild(stimNode); + + + XML::IXMLNode* channelsNode = XML::createNode(CHANNEL_LIST_NODE_NAME); + for (size_t i = 0; i < m_signalInfos.size(); ++i) + { + signal_info_t& signalInfo = m_signalInfos[i]; + XML::IXMLNode* node = XML::createNode(CHANNEL_NODE_NAME); + XML::IXMLNode* nodeName = XML::createNode(CHANNEL_LABEL_NODE_NAME); + + nodeName->setPCData(signalInfo.name.toASCIIString()); + node->addChild(nodeName); + node->addChild(getDoubleNode(CHANNEL_MAX_NODE_NAME, signalInfo.max)); + node->addChild(getDoubleNode(CHANNEL_MIN_NODE_NAME, signalInfo.min)); + node->addChild(getDoubleNode(CHANNEL_MEAN_NODE_NAME, signalInfo.sum / signalInfo.nSample)); + + channelsNode->addChild(node); + } + rootNode->addChild(channelsNode); + + XML::IXMLHandler* handler = XML::createXMLHandler(); + if (!handler->writeXMLInFile(*rootNode, m_filename.toASCIIString())) { res = false; } + + handler->release(); + rootNode->release(); + } + return res; +} + + +bool CBoxAlgorithmStatisticGenerator::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + + +bool CBoxAlgorithmStatisticGenerator::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_signalDecoder.decode(i); + if (m_signalDecoder.isHeaderReceived()) + { + const size_t mountChannel = m_signalDecoder.getOutputMatrix()->getDimensionSize(0); + m_hasBeenStreamed = true; + for (size_t j = 0; j < mountChannel; ++j) + { + signal_info_t info = { + m_signalDecoder.getOutputMatrix()->getDimensionLabel(0, j), std::numeric_limits::max(), -std::numeric_limits::max(), 0, 0 + }; + m_signalInfos.push_back(info); + } + } + if (m_signalDecoder.isBufferReceived()) + { + const size_t nSample = m_signalDecoder.getOutputMatrix()->getDimensionSize(1); + double* buffer = m_signalDecoder.getOutputMatrix()->getBuffer(); + for (size_t j = 0; j < m_signalInfos.size(); ++j) + { + signal_info_t& info = m_signalInfos[j]; + for (size_t k = 0; k < nSample; ++k) + { + const double sample = buffer[j * nSample + k]; + info.sum += sample; + + if (sample < info.min) { info.min = sample; } + if (sample > info.max) { info.max = sample; } + } + info.nSample += nSample; + } + } + } + + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + m_stimDecoder.decode(i); + if (m_stimDecoder.isHeaderReceived()) { m_hasBeenStreamed = true; } + if (m_stimDecoder.isBufferReceived()) + { + IStimulationSet& stimSet = *(m_stimDecoder.getOutputStimulationSet()); + for (size_t j = 0; j < stimSet.getStimulationCount(); ++j) { m_stimulations[stimSet.getStimulationIdentifier(j)]++; } + } + } + + return true; +} + +XML::IXMLNode* CBoxAlgorithmStatisticGenerator::getDoubleNode(const char* const nodeName, const double value) +{ + XML::IXMLNode* tmp = XML::createNode(nodeName); + std::stringstream ss; + ss << std::fixed << std::setprecision(10) << value; + tmp->setPCData(ss.str().c_str()); + return tmp; +} +} // namespace Evaluation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmStatisticGenerator.h b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmStatisticGenerator.h new file mode 100644 index 0000000..f94a779 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCBoxAlgorithmStatisticGenerator.h @@ -0,0 +1,102 @@ +#pragma once + +#include "../ovp_defines.h" + +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Evaluation { +typedef struct +{ + CString name; + double min; + double max; + double sum; + size_t nSample; +} signal_info_t; + +/** + * \class CBoxAlgorithmStatisticGenerator + * \author Serrière Guillaume (Inria) + * \date Thu Apr 30 15:24:39 2015 + * \brief The class CBoxAlgorithmStatisticGenerator describes the box Statistic generator. + * + */ +class CBoxAlgorithmStatisticGenerator final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_StatisticGenerator) + +private: + static XML::IXMLNode* getDoubleNode(const char* nodeName, double value); + + // Input decoder: + Toolkit::TSignalDecoder m_signalDecoder; + Toolkit::TStimulationDecoder m_stimDecoder; + + CString m_filename; + std::map m_stimulations; + std::vector m_signalInfos; + + bool m_hasBeenStreamed = false; +}; + + +/** + * \class CBoxAlgorithmStatisticGeneratorDesc + * \author Serrière Guillaume (Inria) + * \date Thu Apr 30 15:24:39 2015 + * \brief Descriptor of the box Statistic generator. + * + */ +class CBoxAlgorithmStatisticGeneratorDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("General statistics generator"); } + CString getAuthorName() const override { return CString("Serrière Guillaume"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Generate statistics on signal."); } + + CString getDetailedDescription() const override { return CString("Generate some general purpose statistics on signal and store them in a file."); } + + CString getCategory() const override { return CString("Evaluation"); } + CString getVersion() const override { return CString("0.1"); } + CString getStockItemName() const override { return CString("gtk-yes"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_StatisticGenerator; } + IPluginObject* create() override { return new CBoxAlgorithmStatisticGenerator; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Signal",OV_TypeId_Signal); + prototype.addInput("Stimulations",OV_TypeId_Stimulations); + + prototype.addSetting("Filename for saving",OV_TypeId_Filename, "${Path_UserData}/statistics-dump.xml"); + + prototype.addFlag(Kernel::BoxFlag_CanModifySetting); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_StatisticGeneratorDesc) +}; +} // namespace Evaluation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCROCCurveDraw.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCROCCurveDraw.cpp new file mode 100644 index 0000000..6f496c5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCROCCurveDraw.cpp @@ -0,0 +1,203 @@ +#if defined(TARGET_HAS_ThirdPartyGTK) + +#include "ovpCROCCurveDraw.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Evaluation { + +static void size_allocate_cb(GtkWidget* /*widget*/, GdkRectangle* rectangle, gpointer data) { static_cast(data)->resizeEvent(rectangle); } +static void area_expose_cb(GtkWidget* /*widget*/, GdkEventExpose* /*event*/, gpointer data) { static_cast(data)->exposeEnvent(); } + +CROCCurveDraw::CROCCurveDraw(GtkNotebook* notebook, const size_t classIndex, CString& className) +{ + m_margin = 50; + m_classIdx = classIndex; + m_hasBeenInit = false; + m_hasBeenExposed = false; + m_drawableArea = gtk_drawing_area_new(); + gtk_widget_set_size_request(m_drawableArea, 700, 600); + + g_signal_connect(G_OBJECT(m_drawableArea), "expose_event", G_CALLBACK(area_expose_cb), this); + g_signal_connect(G_OBJECT(m_drawableArea), "size-allocate", G_CALLBACK(size_allocate_cb), this); + + GtkWidget* label = gtk_label_new(className.toASCIIString()); + gtk_notebook_append_page(notebook, m_drawableArea, label); + + + //get left ruler widget's font description + PangoContext* ctx = gtk_widget_get_pango_context(m_drawableArea); + PangoFontDescription* fontDesc = pango_context_get_font_description(ctx); + + //adapt the allocated height per label to the font's height (plus 4 pixel to add some spacing) + if (pango_font_description_get_size_is_absolute(fontDesc)) { m_pixelsPerLeftRulerLabel = pango_font_description_get_size(fontDesc) + 4; } + else { m_pixelsPerLeftRulerLabel = pango_font_description_get_size(fontDesc) / PANGO_SCALE + 4; } +} + +void CROCCurveDraw::generateCurve() +{ + GtkAllocation allocation; + gtk_widget_get_allocation(m_drawableArea, &allocation); + + const size_t width = allocation.width - 2 * m_margin; + const size_t height = allocation.height - 2 * m_margin; + + m_pointList.clear(); + for (size_t i = 0; i < m_coordinateList.size(); ++i) + { + GdkPoint point; + point.x = gint(m_coordinateList[i].first * width + m_margin); + point.y = gint((allocation.height - m_margin) - m_coordinateList[i].second * height); + m_pointList.push_back(point); + } + m_hasBeenInit = true; +} + +void CROCCurveDraw::exposeEnvent() +{ + m_hasBeenExposed = true; + redraw(); +} + +void CROCCurveDraw::resizeEvent(GdkRectangle* /*rectangle*/) +{ + GtkAllocation alloc; + gtk_widget_get_allocation(m_drawableArea, &alloc); + + if (!m_hasBeenInit) { return; } + + generateCurve(); + redraw(); +} + +void CROCCurveDraw::redraw() +{ + if (!m_hasBeenInit || !m_hasBeenExposed) { return; } + + GtkAllocation allocation; + gtk_widget_get_allocation(m_drawableArea, &allocation); + + gdk_draw_rectangle(m_drawableArea->window, GTK_WIDGET(m_drawableArea)->style->white_gc, TRUE, 0, 0, allocation.width, allocation.height); + + + GdkColor lineColor = { 0, 35000, 35000, 35000 }; + GdkGC* gc = gdk_gc_new((m_drawableArea)->window); + gdk_gc_set_rgb_fg_color(gc, &lineColor); + + + //Left ruler + gdk_draw_line((m_drawableArea)->window, gc, gint(m_margin), gint(m_margin), gint(m_margin), gint(allocation.height - m_margin)); + drawLeftMark(m_margin, m_margin, "1"); + drawLeftMark(m_margin, allocation.height / 2, "0.5"); + drawLeftMark(m_margin, allocation.height - m_margin, "0"); + + //*** Black magic section to rotate the text of the left ruler. The solution comes from the internet (gtk doc), it works so + // don't touch it unless you are sure of what you are doing + PangoContext* context = gtk_widget_get_pango_context(m_drawableArea); + GdkScreen* screen = gdk_drawable_get_screen(m_drawableArea->window); + PangoRenderer* renderer = gdk_pango_renderer_get_default(screen); + gdk_pango_renderer_set_drawable(GDK_PANGO_RENDERER(renderer), m_drawableArea->window); + GdkGC* rotationGc = gdk_gc_new(m_drawableArea->window); + gdk_pango_renderer_set_gc(GDK_PANGO_RENDERER(renderer), rotationGc); + int width, height; + PangoMatrix matrix = PANGO_MATRIX_INIT; + pango_matrix_translate(&matrix, 0, double(allocation.height + 100) / 2); + PangoLayout* layout = pango_layout_new(context); + pango_layout_set_text(layout, "True Positive Rate", -1); + PangoFontDescription* desc = pango_context_get_font_description(context); + pango_layout_set_font_description(layout, desc); + GdkColor color = { 0, 0, 0, 0 }; + gdk_pango_renderer_set_override_color(GDK_PANGO_RENDERER(renderer), PANGO_RENDER_PART_FOREGROUND, &color); + + pango_matrix_rotate(&matrix, 90); + pango_context_set_matrix(context, &matrix); + pango_layout_context_changed(layout); + pango_layout_get_size(layout, &width, &height); + pango_renderer_draw_layout(renderer, layout, 15, (allocation.height + height) / 2); + + gdk_pango_renderer_set_override_color(GDK_PANGO_RENDERER(renderer), PANGO_RENDER_PART_FOREGROUND, nullptr); + gdk_pango_renderer_set_drawable(GDK_PANGO_RENDERER(renderer), nullptr); + gdk_pango_renderer_set_gc(GDK_PANGO_RENDERER(renderer), nullptr); + + pango_matrix_rotate(&matrix, -90); + pango_context_set_matrix(context, &matrix); + pango_layout_context_changed(layout); + + g_object_unref(layout); + g_object_unref(context); + g_object_unref(rotationGc); + //** End of black magic section + + //Bottom ruler + gdk_draw_line((m_drawableArea)->window, gc, gint(m_margin), gint(allocation.height - m_margin), gint(allocation.width - m_margin), + gint(allocation.height - m_margin)); + drawBottomMark(m_margin, allocation.height - m_margin, "0"); + drawBottomMark(allocation.width / 2, allocation.height - m_margin, "0.5"); + drawBottomMark(allocation.width - m_margin, allocation.height - m_margin, "1"); + + int textW; + int textH; + PangoLayout* text = gtk_widget_create_pango_layout(m_drawableArea, "False positive rate"); + pango_layout_set_justify(text, PANGO_ALIGN_CENTER); + pango_layout_get_pixel_size(text, &textW, &textH); + gdk_draw_layout(m_drawableArea->window, GTK_WIDGET(m_drawableArea)->style->black_gc, allocation.width / 2 - textW / 2, allocation.height - 15, text); + g_object_unref(text); + + + if (m_pointList.empty()) + { + gdk_draw_lines((m_drawableArea)->window, GTK_WIDGET(m_drawableArea)->style->black_gc, &(m_pointList[0]), gint(m_pointList.size())); + } + + gdk_gc_set_line_attributes(gc, 1, GDK_LINE_ON_OFF_DASH, GDK_CAP_BUTT, GDK_JOIN_BEVEL); + gdk_draw_line((m_drawableArea)->window, gc, gint(m_margin), gint(allocation.height - m_margin), gint(allocation.width - m_margin), gint(m_margin)); + + g_object_unref(gc); +} + +void CROCCurveDraw::drawLeftMark(const size_t w, const size_t h, const char* label) const +{ + gint textW; + gint textH; + PangoLayout* text = gtk_widget_create_pango_layout(m_drawableArea, label); + pango_layout_set_width(text, 28); + pango_layout_set_justify(text, PANGO_ALIGN_LEFT); + + pango_layout_get_pixel_size(text, &textW, &textH); + + gdk_draw_layout(m_drawableArea->window, GTK_WIDGET(m_drawableArea)->style->black_gc, gint(w - 20) - (textW / 2), gint(h) - (textH / 2), text); + + GdkColor lineColor = { 0, 35000, 35000, 35000 }; + GdkGC* gc = gdk_gc_new((m_drawableArea)->window); + gdk_gc_set_rgb_fg_color(gc, &lineColor); + gdk_draw_line(m_drawableArea->window, gc, w - 5, h, w, h); + + g_object_unref(gc); +} + +void CROCCurveDraw::drawBottomMark(const size_t w, const size_t h, const char* label) const +{ + int textW; + int textH; + PangoLayout* text = gtk_widget_create_pango_layout(m_drawableArea, label); + pango_layout_set_width(text, 28); + pango_layout_set_justify(text, PANGO_ALIGN_LEFT); + + pango_layout_get_pixel_size(text, &textW, &textH); + + gdk_draw_layout(m_drawableArea->window, GTK_WIDGET(m_drawableArea)->style->black_gc, gint(w) - (textW / 2), gint(h + 14), text); + + GdkColor lineColor = { 0, 35000, 35000, 35000 }; + GdkGC* gc = gdk_gc_new((m_drawableArea)->window); + gdk_gc_set_rgb_fg_color(gc, &lineColor); + gdk_draw_line(m_drawableArea->window, gc, gint(w), gint(h + 5), gint(w), gint(h)); + + g_object_unref(gc); +} + +} // namespace Evaluation +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyGTK diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCROCCurveDraw.h b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCROCCurveDraw.h new file mode 100644 index 0000000..4157c06 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/box-algorithms/ovpCROCCurveDraw.h @@ -0,0 +1,56 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyGTK) + +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Evaluation { +typedef std::pair CCoordinate; + +//The aim of the class is to handle the graphical part of a RocCurve +class CROCCurveDraw final +{ +public: + CROCCurveDraw(GtkNotebook* notebook, size_t classIndex, CString& className); + ~CROCCurveDraw() { } + std::vector& getCoordinateVector() { return m_coordinateList; } + + void generateCurve(); + + //Callbak functions, should not be called + void resizeEvent(GdkRectangle* rectangle); + void exposeEnvent(); + + //This function is called when the cruve should be redraw for an external reason + void forceRedraw() { redraw(); } + +private: + size_t m_margin = 0; + size_t m_classIdx = 0; + std::vector m_pointList; + std::vector m_coordinateList; + size_t m_pixelsPerLeftRulerLabel = 0; + + GtkWidget* m_drawableArea = nullptr; + bool m_hasBeenInit = false; + + //For a mytical reason, gtk says that the DrawableArea is not a DrawableArea unless it's been exposed at least once... + // So we need to if the DrawableArea as been exposed + bool m_hasBeenExposed = false; + + void redraw(); + void drawLeftMark(size_t w, size_t h, const char* label) const; + void drawBottomMark(size_t w, size_t h, const char* label) const; +}; +} // namespace Evaluation +} // namespace Plugins +} // namespace OpenViBE + + +#endif // TARGET_HAS_ThirdPartyGTK diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/ovp_defines.h new file mode 100644 index 0000000..b68b6d9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/ovp_defines.h @@ -0,0 +1,40 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_ClassifierAccuracyMeasure OpenViBE::CIdentifier(0x48395CE7, 0x17D62550) +#define OVP_ClassId_BoxAlgorithm_ClassifierAccuracyMeasureDesc OpenViBE::CIdentifier(0x067F38CC, 0x084A6ED3) +#define OVP_ClassId_Algorithm_ConfusionMatrix OpenViBE::CIdentifier(0x699F416B, 0x3BAE4324) +#define OVP_ClassId_Algorithm_ConfusionMatrixDesc OpenViBE::CIdentifier(0x4CDD225D, 0x6C9A59DB) +#define OVP_ClassId_BoxAlgorithm_ConfusionMatrix OpenViBE::CIdentifier(0x1AB625DA, 0x3B2502CE) +#define OVP_ClassId_BoxAlgorithm_ConfusionMatrixDesc OpenViBE::CIdentifier(0x52237A64, 0x63555613) +#define OVP_ClassId_BoxAlgorithm_KappaCoef OpenViBE::CIdentifier(0x160D8F1B, 0xD864C5BB) +#define OVP_ClassId_BoxAlgorithm_KappaCoefDesc OpenViBE::CIdentifier(0xD8BA2199, 0xD252BECB) +#define OVP_ClassId_BoxAlgorithm_ROCCurve OpenViBE::CIdentifier(0x06FE5B1B, 0xDE066FEC) +#define OVP_ClassId_BoxAlgorithm_ROCCurveDesc OpenViBE::CIdentifier(0xCB5DFCEA, 0xAF41EAB2) +#define OVP_ClassId_BoxAlgorithm_StatisticGenerator OpenViBE::CIdentifier(0x83EDA40B, 0x425FBFFE) +#define OVP_ClassId_BoxAlgorithm_StatisticGeneratorDesc OpenViBE::CIdentifier(0x35A0CB63, 0x78882C28) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#define OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_Sums OpenViBE::CIdentifier(0x75502E8E, 0x05D838EE) +#define OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_Percentage OpenViBE::CIdentifier(0x7E504E8E, 0x058858EE) +#define OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_TargetStimulationSet OpenViBE::CIdentifier(0x7E504E8F, 0x058858EF) +#define OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_ClassifierStimulationSet OpenViBE::CIdentifier(0x45220B61, 0x13FD7491) +#define OVP_Algorithm_ConfusionMatrixAlgorithm_InputParameterId_ClassCodes OpenViBE::CIdentifier(0x67780C91, 0x2A556C51) +#define OVP_Algorithm_ConfusionMatrixAlgorithm_OutputParameterId_ConfusionMatrix OpenViBE::CIdentifier(0x67780C91, 0x2A556C51) + +#define OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_ResetTarget OpenViBE::CIdentifier(0x4D390BDA, 0x6A180667) +#define OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_ResetClassifier OpenViBE::CIdentifier(0x3C132C38, 0x557D2503) +#define OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_FeedTarget OpenViBE::CIdentifier(0x6B1E76B3, 0x06741B21) +#define OVP_Algorithm_ConfusionMatrixAlgorithm_InputTriggerId_FeedClassifier OpenViBE::CIdentifier(0x3EFC64B8, 0x5ACC3125) +#define OVP_Algorithm_ConfusionMatrixAlgorithm_OutputTriggerId_ConfusionPerformed OpenViBE::CIdentifier(0x790C2277, 0x3D041A63) + + +#define FIRST_CLASS_SETTING_INDEX 2 + +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/ovp_main.cpp new file mode 100755 index 0000000..f9e6074 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/src/ovp_main.cpp @@ -0,0 +1,35 @@ +#include "ovp_defines.h" + +#include "box-algorithms/ovpCBoxAlgorithmStatisticGenerator.h" +#include "box-algorithms/ovpCBoxAlgorithmKappaCoefficient.h" +#include "box-algorithms/ovpCBoxAlgorithmConfusionMatrix.h" +#include "box-algorithms/ovpCBoxAlgorithmROCCurve.h" +#include "box-algorithms/ovpCBoxAlgorithmClassifierAccuracyMeasure.h" + +#include "algorithms/ovpCAlgorithmConfusionMatrix.h" + +namespace OpenViBE { +namespace Plugins { +namespace Evaluation { + +OVP_Declare_Begin() + context.getTypeManager().registerEnumerationEntry(OV_TypeId_BoxAlgorithmFlag, OV_AttributeId_Box_FlagIsUnstable.toString(), + OV_AttributeId_Box_FlagIsUnstable.id()); + + OVP_Declare_New(CBoxAlgorithmStatisticGeneratorDesc); + +#if defined(TARGET_HAS_ThirdPartyGTK) + OVP_Declare_New(CBoxAlgorithmKappaCoefDesc); + OVP_Declare_New(CBoxAlgorithmROCCurveDesc); +#endif + + OVP_Declare_New(CAlgorithmConfusionMatrixDesc); + OVP_Declare_New(CBoxAlgorithmConfusionMatrixDesc); +#if defined(TARGET_HAS_ThirdPartyGTK) + OVP_Declare_New(CBoxAlgorithmClassifierAccuracyMeasureDesc); +#endif +OVP_Declare_End() + +} // namespace Evaluation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/CMakeLists.txt new file mode 100644 index 0000000..b8098c5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/CMakeLists.txt @@ -0,0 +1,25 @@ +PROJECT(test_evaluation) + +IF(WIN32) + ADD_DEFINITIONS(-DTARGET_OS_Windows) +ENDIF(WIN32) +IF(UNIX) + ADD_DEFINITIONS(-DTARGET_OS_Linux) +ENDIF(UNIX) +ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE) +ADD_DEFINITIONS(-DTARGET_ARCHITECTURE_i386) + +INCLUDE_DIRECTORIES(../src) +ADD_EXECUTABLE(${PROJECT_NAME} test_kappa.cpp) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) # Place project in folder unit-test (for some IDE) + +#INCLUDE("FindOpenViBE") + +# Unfortunately we need to install the tests as any application to find .dll/.so files +# on both Windows and Linux. +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/DartTestfile.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/DartTestfile.txt new file mode 100644 index 0000000..6c2df71 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/DartTestfile.txt @@ -0,0 +1,48 @@ +#blabla + +# @FIXME there is a problem of using the global log, this will cause interference if any tests are run in parallel + +IF(WIN32) + SET(EXT cmd) + SET(OS_FLAGS "--no-pause") +ELSE(WIN32) + SET(EXT sh) + SET(OS_FLAGS "") +ENDIF(WIN32) + +ADD_TEST(clean_Evaluation_kappa "${CMAKE_COMMAND}" "-E" "remove" "-f" ${OV_LOGFILE}) +ADD_TEST(run_Evaluation_kappa "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--invisible" "--no-session-management" --define Plugin_Classification_RandomizeKFoldTestData true "--play-fast" Test-kappa.xml) +#ADD_TEST(compare_Evaluation_kappa "$ENV{OV_BINARY_PATH}/test_evaluation.${EXT}" "${OS_FLAGS}" "${OV_LOGFILE}") + +# It would be better to clean last, but we can't do this as it will delete the +# output we wish to include, and we can't prevent clean from running if a prev. test fails +# We need the clean to be sure that the comparator stage is not getting data from a previous run. +SET_TESTS_PROPERTIES(run_Evaluation_kappa PROPERTIES DEPENDS clean_Evaluation_kappa) +SET_TESTS_PROPERTIES(run_Evaluation_kappa PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) + +#SET_TESTS_PROPERTIES(compare_Evaluation_kappa PROPERTIES DEPENDS run_Evaluation_kappa) +#SET_TESTS_PROPERTIES(compare_Evaluation_kappa PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) + + +ADD_TEST(run_Evaluation_statistic_generator "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--invisible" "--no-session-management" --define Plugin_Classification_RandomizeKFoldTestData true "--play-fast" Test-StatisticGenerator.xml) +ADD_TEST(compare_Evaluation_statistic_generator "git" "diff" "--no-index" "--ignore-space-change" "stat.xml" "data/Statistic_comparison.xml") +ADD_TEST(clean_Evaluation_statistic_generator "${CMAKE_COMMAND}" "-E" "remove" "-f" stat.xml) + + +SET_TESTS_PROPERTIES(compare_Evaluation_statistic_generator PROPERTIES DEPENDS run_Evaluation_statistic_generator) +SET_TESTS_PROPERTIES(compare_Evaluation_statistic_generator PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) + +### Do not enable the commented out sikuli tests unless you +### or your lab commits to keep them passing in the long term. +#FIND_PROGRAM(SIKULI NAMES sikuli-ide) +#IF(SIKULI) +# IF(UNIX) +# ADD_TEST(sikuli_clean_Evaluation_ROC "${CMAKE_COMMAND}" "-E" "remove" "-f" ${OV_LOGFILE} screenshot.png) +# ADD_TEST(sikuli_run_Evaluation_ROC "${SIKULI}" -t testROCCurve.UNIX.sikuli) +# +# SET_TESTS_PROPERTIES(sikuli_run_Evaluation_ROC PROPERTIES DEPENDS sikuli_clean_Evaluation_ROC) +# SET_TESTS_PROPERTIES(sikuli_run_Evaluation_ROC PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) +# SET_TESTS_PROPERTIES(sikuli_run_Evaluation_ROC PROPERTIES ATTACHED_FILES_ON_FAIL ${CTEST_SOURCE_DIRECTORY}/plugins/processing/evaluation/test/screenshot.png) +# ENDIF(UNIX) +#ENDIF(SIKULI) + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/Test-StatisticGenerator.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/Test-StatisticGenerator.xml new file mode 100644 index 0000000..c45fa34 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/Test-StatisticGenerator.xml @@ -0,0 +1,451 @@ + + 1 + openvibe + 2.0 + + + (0x29c00b5a, 0x38e642d5) + General statistics generator + (0x83eda40b, 0x425fbffe) + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename for saving + + ${__volatile_ScenarioDir}/stat.xml + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 512.000000 + + + (0x4e7b798a, 0x183beafb) + (0xf6674389, 0x42f4fe25) + + + (0xad100179, 0xa3c984ab) + 190 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002abac0) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xf191c1c8, 0xa0123976) + + + + + + (0x2b584b95, 0x7008d0de) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 800.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0012be4a) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2b907080, 0x224d7576) + Sinus oscillator + (0x7e33bdb8, 0x68194a4a) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 432.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xad100179, 0xa3c984ab) + 109 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002cf528) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x592038f7, 0x3646c9fe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 0.2 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 126.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 608.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xad100179, 0xa3c984ab) + 114 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0020b3d0) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x625d022b, 0x4c72dfaa) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 100 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 800.000000 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 62 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0011d368) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x0ff86487, 0x6c18ccc2) + + (0x592038f7, 0x3646c9fe) + 0 + + + (0x29c00b5a, 0x38e642d5) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 144 + + + (0x358ae8b5, 0x0f8bacd1) + 608 + + + (0x3f0a3b27, 0x570913d2) + 214 + + + (0x6267b5c5, 0x676e3e42) + 519 + + + + + (0x6299b60b, 0x63373c3e) + + (0x625d022b, 0x4c72dfaa) + 0 + + + (0x2b584b95, 0x7008d0de) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 183 + + + (0x358ae8b5, 0x0f8bacd1) + 800 + + + (0x3f0a3b27, 0x570913d2) + 240 + + + (0x6267b5c5, 0x676e3e42) + 800 + + + + + (0x7ed28c93, 0x1209a735) + + (0x2b907080, 0x224d7576) + 0 + + + (0x29c00b5a, 0x38e642d5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 146 + + + (0x358ae8b5, 0x0f8bacd1) + 432 + + + (0x3f0a3b27, 0x570913d2) + 214 + + + (0x6267b5c5, 0x676e3e42) + 504 + + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x1586c3d8, 0x35a029ef)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x4cfffb67, 0x1d6c7d8c)","index":0,"name":"Default tab","parentIdentifier":"(0x1586c3d8, 0x35a029ef)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x3e00f59d, 0x6e47aad3)","index":0,"name":"Empty","parentIdentifier":"(0x4cfffb67, 0x1d6c7d8c)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/Test-kappa.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/Test-kappa.xml new file mode 100644 index 0000000..c865153 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/Test-kappa.xml @@ -0,0 +1,434 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00001d5f, 0x00007a11) + Expected + (0x336a3d9a, 0x753f1ba4) + + + (0x544a003e, 0x6dcba5f6) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/data/Expected_stimulation.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00001d5f, 0x00007a12) + Found + (0x336a3d9a, 0x753f1ba4) + + + (0x544a003e, 0x6dcba5f6) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/data/Found_stimulation.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 560 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x0000555d, 0x00004472) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x107f1920, 0x151fda5f) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006cdafc) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2cc3b99b, 0x2d88ee53) + Kappa coefficient + (0x160d8f1b, 0xd864c5bb) + + + (0x6f752dd0, 0x082a321e) + Expected stimulations + + + (0x6f752dd0, 0x082a321e) + Found stimulations + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x007deef9, 0x2f3e95c6) + Amount of class + 2 + 3 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation of class 1 + OVTK_StimulationId_Number_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation of class 2 + OVTK_StimulationId_Number_00 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation of class 3 + OVTK_StimulationId_Number_00 + OVTK_StimulationId_Label_02 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0x08859f27, 0x4f7b5879) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017d49da) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xf191c1c8, 0xa0123976) + + + + + + (0x5bdbea30, 0x7c64f6a8) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02337a82) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00001201, 0x00006cc6) + + (0x00001d5f, 0x00007a12) + 1 + + + (0x0000555d, 0x00004472) + 0 + + + + (0x00004a37, 0x00005687) + + (0x00001d5f, 0x00007a12) + 1 + + + (0x2cc3b99b, 0x2d88ee53) + 1 + + + + (0x00004cd4, 0x00001a75) + + (0x00001d5f, 0x00007a11) + 0 + + + (0x5bdbea30, 0x7c64f6a8) + 0 + + + + (0x00005a6a, 0x000006b5) + + (0x00001d5f, 0x00007a11) + 1 + + + (0x2cc3b99b, 0x2d88ee53) + 0 + + + + (0x49781978, 0x10193d32) + + (0x5bdbea30, 0x7c64f6a8) + 0 + + + (0x107f1920, 0x151fda5f) + 0 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x2cc3b99b, 0x2d88ee53)","childCount":0,"identifier":"(0x086c5aaa, 0x55baf27b)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x2f9f0580, 0x412699f4)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x010246fe, 0x0eacec10)","index":0,"name":"Default tab","parentIdentifier":"(0x2f9f0580, 0x412699f4)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x1fbe5a88, 0x65840069)","index":0,"name":"Empty","parentIdentifier":"(0x010246fe, 0x0eacec10)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/Test_ROCCurve.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/Test_ROCCurve.xml new file mode 100644 index 0000000..ac2698b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/Test_ROCCurve.xml @@ -0,0 +1,1510 @@ + + 1 + openvibe + 2.0 + + + (0x00000043, 0x00007650) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 16.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 640.000000 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xad100179, 0xa3c984ab) + 147 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000fba89) + + + + + (0x00000483, 0x00002eb9) + Switch director + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/motor-imagery-bci-epoch-selector.lua + false + + + (0x512a166f, 0x5c3ef83f) + offset + 0.5 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + duration + 4.0 + 4.0 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -288.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 768.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00ff540a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000079c, 0x00005479) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 640.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 82 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000de4c1) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000bf3, 0x0000467d) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/motor-imagery-bci-config-classifier.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 640.000000 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xad100179, 0xa3c984ab) + 138 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001124, 0x00007915) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x5ba36127, 0x195feae1) + Output + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_GDF_Correct + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_GDF_Incorrect + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 688.000000 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 102 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006a6e36) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001988, 0x0000550e) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -352.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 640.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 153 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005186da) + + + + + (0x00002a91, 0x00000f38) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -288.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 496.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000eae1c) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000368c, 0x0000054c) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 640.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 82 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000de4c4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000043ad, 0x00005e02) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -176.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 528.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 59 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000e6afc) + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000545c, 0x00005cb8) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 640.000000 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000e1713) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006732, 0x00007630) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 30 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 640.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0036a833) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007377, 0x00000002) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 144.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 640.000000 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 95 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000dc335) + + + + + (0x0000752b, 0x0000680c) + CSP Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -64.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 640.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + ${Player_ScenarioDirectory}/csp-spatial-filter.cfg + + + (0xad100179, 0xa3c984ab) + 122 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x3607806b, 0x24db4df2) + ROC curve + (0x06fe5b1b, 0xde066fec) + + + (0x6f752dd0, 0x082a321e) + Expected label + + + (0x544a003e, 0x6dcba5f6) + Classification values + + + + + (0x2c132d6e, 0x44ab0d97) + Computation trigger + OVTK_StimulationId_Number_00 + OVTK_StimulationId_Train + false + + + (0x007deef9, 0x2f3e95c6) + Amount of class + 2 + 2 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 identifier + OVTK_StimulationId_Number_00 + OVTK_GDF_Left + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 identifier + OVTK_StimulationId_Number_00 + OVTK_GDF_Right + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 544.000000 + + + (0x4e7b798a, 0x183beafb) + (0x3ee354a6, 0xd56cd385) + + + (0xad100179, 0xa3c984ab) + 76 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000ef134) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xf191c1c8, 0xa0123976) + + + + + + + + (0x000002ee, 0x00005db9) + + (0x00001988, 0x0000550e) + 1 + + + (0x00006732, 0x00007630) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -329 + + + (0x358ae8b5, 0x0f8bacd1) + 640 + + + (0x3f0a3b27, 0x570913d2) + -240 + + + (0x6267b5c5, 0x676e3e42) + 640 + + + + + (0x000003fb, 0x000047fe) + + (0x00007377, 0x00000002) + 0 + + + (0x0000368c, 0x0000054c) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 162 + + + (0x358ae8b5, 0x0f8bacd1) + 640 + + + (0x3f0a3b27, 0x570913d2) + 187 + + + (0x6267b5c5, 0x676e3e42) + 640 + + + + + (0x00000948, 0x00000383) + + (0x0000079c, 0x00005479) + 0 + + + (0x00007377, 0x00000002) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 103 + + + (0x358ae8b5, 0x0f8bacd1) + 640 + + + (0x3f0a3b27, 0x570913d2) + 128 + + + (0x6267b5c5, 0x676e3e42) + 640 + + + + + (0x0000211e, 0x00003d11) + + (0x00000bf3, 0x0000467d) + 2 + + + (0x3607806b, 0x24db4df2) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 370 + + + (0x358ae8b5, 0x0f8bacd1) + 655 + + + (0x3f0a3b27, 0x570913d2) + 422 + + + (0x6267b5c5, 0x676e3e42) + 551 + + + + + (0x00002eee, 0x00004d50) + + (0x00001988, 0x0000550e) + 2 + + + (0x00002a91, 0x00000f38) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -329 + + + (0x358ae8b5, 0x0f8bacd1) + 655 + + + (0x3f0a3b27, 0x570913d2) + -304 + + + (0x6267b5c5, 0x676e3e42) + 496 + + + + + (0x00003301, 0x00003b8f) + + (0x00000483, 0x00002eb9) + 0 + + + (0x00001124, 0x00007915) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -260 + + + (0x358ae8b5, 0x0f8bacd1) + 768 + + + (0x3f0a3b27, 0x570913d2) + -181 + + + (0x6267b5c5, 0x676e3e42) + 680 + + + + + (0x000036ad, 0x000016e4) + + (0x00000043, 0x00007650) + 0 + + + (0x0000079c, 0x00005479) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 39 + + + (0x358ae8b5, 0x0f8bacd1) + 640 + + + (0x3f0a3b27, 0x570913d2) + 59 + + + (0x6267b5c5, 0x676e3e42) + 640 + + + + + (0x000037c4, 0x00007eba) + + (0x0000545c, 0x00005cb8) + 0 + + + (0x00000bf3, 0x0000467d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 295 + + + (0x358ae8b5, 0x0f8bacd1) + 640 + + + (0x3f0a3b27, 0x570913d2) + 336 + + + (0x6267b5c5, 0x676e3e42) + 632 + + + + + (0x000037ca, 0x0000376b) + + (0x00001988, 0x0000550e) + 2 + + + (0x00000483, 0x00002eb9) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -329 + + + (0x358ae8b5, 0x0f8bacd1) + 655 + + + (0x3f0a3b27, 0x570913d2) + -314 + + + (0x6267b5c5, 0x676e3e42) + 768 + + + + + (0x000045ce, 0x00001ae9) + + (0x00001988, 0x0000550e) + 2 + + + (0x000043ad, 0x00005e02) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -329 + + + (0x358ae8b5, 0x0f8bacd1) + 655 + + + (0x3f0a3b27, 0x570913d2) + -197 + + + (0x6267b5c5, 0x676e3e42) + 535 + + + + + (0x00004b17, 0x00005ab2) + + (0x00006732, 0x00007630) + 0 + + + (0x00001124, 0x00007915) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + -206 + + + (0x358ae8b5, 0x0f8bacd1) + 640 + + + (0x3f0a3b27, 0x570913d2) + -181 + + + (0x6267b5c5, 0x676e3e42) + 695 + + + + + (0x00005216, 0x00006ee2) + + (0x00001124, 0x00007915) + 0 + + + (0x0000752b, 0x0000680c) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -137 + + + (0x358ae8b5, 0x0f8bacd1) + 680 + + + (0x3f0a3b27, 0x570913d2) + -90 + + + (0x6267b5c5, 0x676e3e42) + 640 + + + + + (0x00005eeb, 0x000075fc) + + (0x0000752b, 0x0000680c) + 0 + + + (0x00000043, 0x00007650) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -36 + + + (0x358ae8b5, 0x0f8bacd1) + 640 + + + (0x3f0a3b27, 0x570913d2) + -5 + + + (0x6267b5c5, 0x676e3e42) + 640 + + + + + (0x000079d9, 0x00005bbe) + + (0x0000368c, 0x0000054c) + 0 + + + (0x0000545c, 0x00005cb8) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 231 + + + (0x358ae8b5, 0x0f8bacd1) + 640 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 640 + + + + + (0x4b6c6719, 0x2b522a33) + + (0x00001988, 0x0000550e) + 2 + + + (0x3607806b, 0x24db4df2) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + -329 + + + (0x358ae8b5, 0x0f8bacd1) + 655 + + + (0x3f0a3b27, 0x570913d2) + 422 + + + (0x6267b5c5, 0x676e3e42) + 536 + + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x35752c8d, 0x23a76f07)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0x3607806b, 0x24db4df2)","childCount":0,"identifier":"(0x4fd3dc02, 0x28abea30)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x24243cdd, 0x2fcac0ca)","index":0,"name":"Default tab","parentIdentifier":"(0x35752c8d, 0x23a76f07)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x425a339c, 0x23d28b15)","index":0,"name":"Empty","parentIdentifier":"(0x24243cdd, 0x2fcac0ca)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/csp-spatial-filter.cfg b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/csp-spatial-filter.cfg new file mode 100644 index 0000000..4a7787f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/csp-spatial-filter.cfg @@ -0,0 +1,5 @@ + + 2.693394e-001 -2.082757e-001 2.391615e-001 2.344401e-001 3.927157e-001 2.381559e-001 1.105450e-001 5.748063e-001 3.098411e-001 2.888676e-001 1.972432e-001 -2.803966e-001 8.610541e-002 -2.669093e-001 -2.873429e-001 -3.080204e-001 -2.313958e-001 -3.049153e-001 -3.205304e-001 -4.424281e-001 -2.981316e-001 -3.624890e-001 -2.713850e-002 -7.049823e-001 -1.550608e-002 -1.321822e-001 1.119925e-001 1.023369e-002 5.826165e-002 -2.615791e-001 -2.637424e-001 -3.941850e-001 4.185020e-001 1.442614e-001 3.069018e-001 3.027673e-001 3.956899e-001 2.814762e-001 2.776705e-001 3.540791e-001 2.828738e-001 3.027926e-001 3.106658e-001 2.946954e-001 8.165735e-001 3.035239e-001 1.979707e-001 2.325919e-001 1.767888e-001 -1.389007e-001 -2.142701e-001 6.029197e-002 1.522051e-001 1.241781e-001 9.543869e-002 2.155692e-001 2.680507e-001 3.076862e-001 3.604533e-001 3.075757e-001 2.513993e-001 2.252315e-001 3.295531e-001 2.891706e-001 4.002560e-001 3.100291e-001 + 6 + 11 + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/data/Expected_stimulation.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/data/Expected_stimulation.csv new file mode 100644 index 0000000..130a689 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/data/Expected_stimulation.csv @@ -0,0 +1,81 @@ +Time:1x1,End Time,Noise 1:,Event Id,Event Date,Event Duration +0.2705078125,0.3398437500,0.0,33026,0.2705078125,0.0 +0.3398437500,0.5419921875,0.0,33024,0.3398437500,0.0 +0.5419921875,0.6796875000,0.0,33026,0.5419921875,0.0 +0.6796875000,0.7099609375,0.0,33024,0.6796875000,0.0 +0.7099609375,0.8125000000,0.0,33025,0.7099609375,0.0 +0.8125000000,1.0195312500,0.0,33026,0.8125000000,0.0 +1.0195312500,1.0839843750,0.0,33024,1.0195312500,0.0 +1.0839843750,1.3544921875,0.0,33026,1.0839843750,0.0 +1.3544921875,1.3593750000,0.0,33026,1.3544921875,0.0 +1.3593750000,1.4199218750,0.0,33024,1.3593750000,0.0 +1.4199218750,1.6259765625,0.0,33025,1.4199218750,0.0 +1.6259765625,1.6992187500,0.0,33026,1.6259765625,0.0 +1.6992187500,1.8964843750,0.0,33024,1.6992187500,0.0 +1.8964843750,2.0390625000,0.0,33026,1.8964843750,0.0 +2.0390625000,2.1298828125,0.0,33024,2.0390625000,0.0 +2.1298828125,2.1679687500,0.0,33025,2.1298828125,0.0 +2.1679687500,2.3798828125,0.0,33026,2.1679687500,0.0 +2.3798828125,2.4384765625,0.0,33024,2.3798828125,0.0 +2.4384765625,2.7099609375,0.0,33026,2.4384765625,0.0 +2.7099609375,2.7197265625,0.0,33026,2.7099609375,0.0 +2.7197265625,2.8398437500,0.0,33024,2.7197265625,0.0 +2.8398437500,2.9804687500,0.0,33025,2.8398437500,0.0 +2.9804687500,3.0595703125,0.0,33026,2.9804687500,0.0 +3.0595703125,3.2519531250,0.0,33024,3.0595703125,0.0 +3.2519531250,3.3994140625,0.0,33026,3.2519531250,0.0 +3.3994140625,3.5224609375,0.0,33024,3.3994140625,0.0 +3.5224609375,3.5498046875,0.0,33026,3.5224609375,0.0 +3.5498046875,3.7392578125,0.0,33025,3.5498046875,0.0 +3.7392578125,3.7939453125,0.0,33024,3.7392578125,0.0 +3.7939453125,4.0644531250,0.0,33026,3.7939453125,0.0 +4.0644531250,4.0791015625,0.0,33026,4.0644531250,0.0 +4.0791015625,4.2597656250,0.0,33024,4.0791015625,0.0 +4.2597656250,4.3359375000,0.0,33025,4.2597656250,0.0 +4.3359375000,4.4199218750,0.0,33026,4.3359375000,0.0 +4.4199218750,4.6064453125,0.0,33024,4.4199218750,0.0 +4.6064453125,4.7597656250,0.0,33026,4.6064453125,0.0 +4.7597656250,4.8779296875,0.0,33024,4.7597656250,0.0 +4.8779296875,4.9697265625,0.0,33026,4.8779296875,0.0 +4.9697265625,5.0996093750,0.0,33025,4.9697265625,0.0 +5.0996093750,5.1484375000,0.0,33024,5.0996093750,0.0 +5.1484375000,5.4199218750,0.0,33026,5.1484375000,0.0 +5.4199218750,5.4394531250,0.0,33026,5.4199218750,0.0 +5.4394531250,5.6796875000,0.0,33024,5.4394531250,0.0 +5.6796875000,5.6904296875,0.0,33025,5.6796875000,0.0 +5.6904296875,5.7792968750,0.0,33026,5.6904296875,0.0 +5.7792968750,5.9619140625,0.0,33024,5.7792968750,0.0 +5.9619140625,6.1191406250,0.0,33026,5.9619140625,0.0 +6.1191406250,6.2324218750,0.0,33024,6.1191406250,0.0 +6.2324218750,6.3896484375,0.0,33026,6.2324218750,0.0 +6.3896484375,6.4599609375,0.0,33025,6.3896484375,0.0 +6.4599609375,6.5039062500,0.0,33024,6.4599609375,0.0 +6.5039062500,6.7744140625,0.0,33026,6.5039062500,0.0 +6.7744140625,6.7998046875,0.0,33026,6.7744140625,0.0 +6.7998046875,7.0458984375,0.0,33024,6.7998046875,0.0 +7.0458984375,7.0996093750,0.0,33026,7.0458984375,0.0 +7.0996093750,7.1396484375,0.0,33025,7.0996093750,0.0 +7.1396484375,7.3164062500,0.0,33024,7.1396484375,0.0 +7.3164062500,7.4794921875,0.0,33026,7.3164062500,0.0 +7.4794921875,7.5878906250,0.0,33024,7.4794921875,0.0 +7.5878906250,7.8095703125,0.0,33026,7.5878906250,0.0 +7.8095703125,7.8193359375,0.0,33025,7.8095703125,0.0 +7.8193359375,7.8583984375,0.0,33024,7.8193359375,0.0 +7.8583984375,8.1298828125,0.0,33026,7.8583984375,0.0 +8.1298828125,8.1591796875,0.0,33026,8.1298828125,0.0 +8.1591796875,8.4003906250,0.0,33024,8.1591796875,0.0 +8.4003906250,8.4990234375,0.0,33026,8.4003906250,0.0 +8.4990234375,8.5195312500,0.0,33024,8.4990234375,0.0 +8.5195312500,8.6718750000,0.0,33025,8.5195312500,0.0 +8.6718750000,8.8398437500,0.0,33026,8.6718750000,0.0 +8.8398437500,8.9423828125,0.0,33024,8.8398437500,0.0 +8.9423828125,9.1796875000,0.0,33026,8.9423828125,0.0 +9.1796875000,9.2138671875,0.0,33024,9.1796875000,0.0 +9.2138671875,9.2294921875,0.0,33026,9.2138671875,0.0 +9.2294921875,9.4843750000,0.0,33025,9.2294921875,0.0 +9.4843750000,9.5195312500,0.0,33026,9.4843750000,0.0 +9.5195312500,9.7558593750,0.0,33024,9.5195312500,0.0 +9.7558593750,9.8593750000,0.0,33026,9.7558593750,0.0 +9.8593750000,9.9394531250,0.0,33024,9.8593750000,0.0 +9.9394531250,10.026367188,0.0,33025,9.9394531250,0.0 +10.026367188,10.106445313,0.0,33026,10.026367188,0.0 diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/data/Found_stimulation.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/data/Found_stimulation.csv new file mode 100644 index 0000000..e1d0f5d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/data/Found_stimulation.csv @@ -0,0 +1,81 @@ +Time:1x1,End Time,Noise 1:,Event Id,Event Date,Event Duration +0.2715078125,0.3408437500,0.0,33026,0.2715078125,0.0 +0.3408437500,0.5429921875,0.0,33025,0.3408437500,0.0 +0.5429921875,0.6806875000,0.0,33026,0.5429921875,0.0 +0.6806875000,0.7109609375,0.0,33025,0.6806875000,0.0 +0.7109609375,0.8135000000,0.0,33025,0.7109609375,0.0 +0.8135000000,1.0295312500,0.0,33026,0.8135000000,0.0 +1.0295312500,1.0939843750,0.0,33024,1.0295312500,0.0 +1.0939843750,1.3569921875,0.0,33026,1.0939843750,0.0 +1.3569921875,1.3693750000,0.0,33026,1.3569921875,0.0 +1.3693750000,1.4299218750,0.0,33026,1.3693750000,0.0 +1.4299218750,1.6359765625,0.0,33025,1.4299218750,0.0 +1.6359765625,1.7092187500,0.0,33026,1.6359765625,0.0 +1.7092187500,1.9064843750,0.0,33024,1.7092187500,0.0 +1.9064843750,2.0490625000,0.0,33026,1.9064843750,0.0 +2.0490625000,2.1398828125,0.0,33024,2.0490625000,0.0 +2.1398828125,2.1779687500,0.0,33024,2.1398828125,0.0 +2.1779687500,2.3898828125,0.0,33026,2.1779687500,0.0 +2.3898828125,2.4484765625,0.0,33024,2.3898828125,0.0 +2.4484765625,2.7159609375,0.0,33026,2.4484765625,0.0 +2.7159609375,2.7297265625,0.0,33026,2.7159609375,0.0 +2.7297265625,2.8498437500,0.0,33024,2.7297265625,0.0 +2.8498437500,2.9904687500,0.0,33026,2.8498437500,0.0 +2.9904687500,3.0695703125,0.0,33026,2.9904687500,0.0 +3.0695703125,3.2619531250,0.0,33024,3.0695703125,0.0 +3.2619531250,3.4094140625,0.0,33024,3.2619531250,0.0 +3.4094140625,3.5324609375,0.0,33024,3.4094140625,0.0 +3.5324609375,3.5598046875,0.0,33024,3.5324609375,0.0 +3.5598046875,3.7492578125,0.0,33025,3.5598046875,0.0 +3.7492578125,3.8039453125,0.0,33024,3.7492578125,0.0 +3.8039453125,4.0744531250,0.0,33025,3.8039453125,0.0 +4.0744531250,4.0891015625,0.0,33026,4.0744531250,0.0 +4.0891015625,4.2697656250,0.0,33024,4.0891015625,0.0 +4.2697656250,4.3459375000,0.0,33025,4.2697656250,0.0 +4.3459375000,4.4299218750,0.0,33026,4.3459375000,0.0 +4.4299218750,4.6164453125,0.0,33024,4.4299218750,0.0 +4.6164453125,4.7697656250,0.0,33026,4.6164453125,0.0 +4.7697656250,4.8879296875,0.0,33024,4.7697656250,0.0 +4.8879296875,4.9797265625,0.0,33026,4.8879296875,0.0 +4.9797265625,5.1096093750,0.0,33025,4.9797265625,0.0 +5.1096093750,5.1584375000,0.0,33024,5.1096093750,0.0 +5.1584375000,5.4299218750,0.0,33026,5.1584375000,0.0 +5.4299218750,5.4494531250,0.0,33026,5.4299218750,0.0 +5.4494531250,5.6896875000,0.0,33024,5.4494531250,0.0 +5.6896875000,5.7004296875,0.0,33025,5.6896875000,0.0 +5.7004296875,5.7892968750,0.0,33026,5.7004296875,0.0 +5.7892968750,5.9719140625,0.0,33024,5.7892968750,0.0 +5.9719140625,6.1291406250,0.0,33026,5.9719140625,0.0 +6.1291406250,6.2424218750,0.0,33024,6.1291406250,0.0 +6.2424218750,6.3996484375,0.0,33026,6.2424218750,0.0 +6.3996484375,6.4699609375,0.0,33025,6.3996484375,0.0 +6.4699609375,6.5139062500,0.0,33024,6.4699609375,0.0 +6.5139062500,6.7844140625,0.0,33026,6.5139062500,0.0 +6.7844140625,6.8098046875,0.0,33026,6.7844140625,0.0 +6.8098046875,7.0558984375,0.0,33024,6.8098046875,0.0 +7.0558984375,7.1096093750,0.0,33026,7.0558984375,0.0 +7.1096093750,7.1496484375,0.0,33025,7.1096093750,0.0 +7.1496484375,7.3264062500,0.0,33024,7.1496484375,0.0 +7.3264062500,7.4894921875,0.0,33026,7.3264062500,0.0 +7.4894921875,7.5978906250,0.0,33024,7.4894921875,0.0 +7.5978906250,7.8155703125,0.0,33026,7.5978906250,0.0 +7.8155703125,7.8293359375,0.0,33025,7.8155703125,0.0 +7.8293359375,7.8683984375,0.0,33024,7.8293359375,0.0 +7.8683984375,8.1398828125,0.0,33026,7.8683984375,0.0 +8.1398828125,8.1691796875,0.0,33026,8.1398828125,0.0 +8.1691796875,8.4103906250,0.0,33024,8.1691796875,0.0 +8.4103906250,8.5090234375,0.0,33026,8.4103906250,0.0 +8.5090234375,8.5295312500,0.0,33024,8.5090234375,0.0 +8.5295312500,8.6818750000,0.0,33025,8.5295312500,0.0 +8.6818750000,8.8498437500,0.0,33026,8.6818750000,0.0 +8.8498437500,8.9523828125,0.0,33024,8.8498437500,0.0 +8.9523828125,9.1896875000,0.0,33026,8.9523828125,0.0 +9.1896875000,9.2238671875,0.0,33024,9.1896875000,0.0 +9.2238671875,9.2394921875,0.0,33026,9.2238671875,0.0 +9.2394921875,9.4943750000,0.0,33025,9.2394921875,0.0 +9.4943750000,9.5295312500,0.0,33026,9.4943750000,0.0 +9.5295312500,9.7658593750,0.0,33024,9.5295312500,0.0 +9.7658593750,9.8693750000,0.0,33026,9.7658593750,0.0 +9.8693750000,9.9494531250,0.0,33024,9.8693750000,0.0 +9.9494531250,10.126367188,0.0,33025,9.9494531250,0.0 +10.126367188,10.206445313,0.0,33026,100126367188,0.0 diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/data/Statistic_comparison.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/data/Statistic_comparison.xml new file mode 100644 index 0000000..9aad9ad --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/data/Statistic_comparison.xml @@ -0,0 +1,35 @@ + + + + (0x00000000, 0x00008100) + + 500 + + + + + sinusOsc 1 + 2.9959498935 + -2.9958162250 + 0.0037440891 + + + sinusOsc 2 + 2.9955453841 + -2.9959417073 + 0.0021516936 + + + sinusOsc 3 + 2.9959425273 + -2.9959158246 + 0.0004745227 + + + sinusOsc 4 + 2.9959140852 + -2.9959417073 + 0.0012721927 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/motor-imagery-bci-config-classifier.cfg b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/motor-imagery-bci-config-classifier.cfg new file mode 100644 index 0000000..6d6a748 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/motor-imagery-bci-config-classifier.cfg @@ -0,0 +1,16 @@ + + Native + Linear Discrimimant Analysis (LDA) + + OVTK_GDF_Left + OVTK_GDF_Right + + + + 1 2 + -1.390939e+01 -3.837006e+01 -3.951661e+00 1.267055e+02 8.129262e+00 1.130540e+02 + 1.04657 + 1.15779 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/motor-imagery-bci-epoch-selector.lua b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/motor-imagery-bci-epoch-selector.lua new file mode 100644 index 0000000..3959368 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/motor-imagery-bci-epoch-selector.lua @@ -0,0 +1,50 @@ + +g_offset = nil +g_duration = nil + +-- this function is called when the box is initialized +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + g_offset = box:get_setting(2) + g_duration = box:get_setting(3) +end + +-- this function is called when the box is uninitialized +function uninitialize(box) + +end + +function wait_until(box, time) + while box:get_current_time() < time do + box:sleep() + end +end + + +function wait_for(box, duration) + wait_until(box, box:get_current_time() + duration) +end + + + +function process(box) + -- loops on every received stimulation for a given input + while box:keep_processing() do + for stimulation = 1, box:get_stimulation_count(1) do + + -- gets the received stimulation + identifier, date, duration = box:get_stimulation(1, 1) + -- discards it + box:remove_stimulation(1, 1) + + -- delay the OVTK_GDF_Left and Right + if identifier == OVTK_GDF_Left or identifier == OVTK_GDF_Right then + box:send_stimulation(1, OVTK_GDF_Correct, date+g_offset, 0) + box:send_stimulation(1, OVTK_GDF_Incorrect, date+g_offset+g_duration, 0) + end + end + box:sleep() + end +end diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/testROCCurve.UNIX.sikuli/ROCCurveResult.png b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/testROCCurve.UNIX.sikuli/ROCCurveResult.png new file mode 100644 index 0000000..a61295f Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/testROCCurve.UNIX.sikuli/ROCCurveResult.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/testROCCurve.UNIX.sikuli/testROCCurve.UNIX.py b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/testROCCurve.UNIX.sikuli/testROCCurve.UNIX.py new file mode 100644 index 0000000..c0fb92d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/testROCCurve.UNIX.sikuli/testROCCurve.UNIX.py @@ -0,0 +1,29 @@ +def setUp(self): + import os + import shutil + ov_binany_path=os.environ['OV_BINARY_PATH'] + self.terminal = App.open("xterm -e " + ov_binany_path +"/openvibe-designer.sh --no-session-management --play-fast Test_ROCCurve.xml") + while not self.terminal.window(): + wait(1) + + #def takepicture: + + #dir = os.path.dirname(getBundlePath()) # the folder, where your script is stored + #img = capture(SCREEN) # snapshots the screen + #shutil.move(img, os.path.join(dir, "shot.png")) + +def testROCCurve(self): + import os + import shutil + try: + wait("ROCCurveResult.png",60) + assert(exists("ROCCurveResult.png")) + except (FindFailed, AssertionError): + print "Unable to find the required png" + dir = os.path.dirname(getBundlePath()) # the folder, where your script is stored + img = capture(SCREEN) # snapshots the screen + shutil.move(img, os.path.join(dir, "screenshot.png")) + raise + +def tearDown(self): + self.terminal.close() diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/test_kappa.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/test_kappa.cpp new file mode 100644 index 0000000..8f1d7fd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/evaluation/test/test_kappa.cpp @@ -0,0 +1,46 @@ +#include +#include +#include +#include + +int main(int argc, char** argv) +{ + if (argc != 2) + { + std::cout << "Usage: test_evaluation \n"; + return 3; + } + + std::ifstream file(argv[1], std::ios::in); + + if (file.good() && !file.bad() && file.is_open()) // ... + { + std::string line; + while (getline(file, line)) + { + if (line.find("Final value of Kappa") != std::string::npos) + { + std::cout << "Found kappa line " << line << std::endl; + + const size_t pos = line.rfind(' '); + const std::string cutline = line.substr(pos); + + std::stringstream kappa(cutline); + + double coefficient; + kappa >> coefficient; + + if (coefficient != 0.840677) + { + std::cout << "Wrong Kappa coefficient. Found " << coefficient << " instead of 0.840677" << std::endl; + return 1; + } + std::cout << "Test ok" << std::endl; + return 0; + } + } + } + std::cout << "Error: Problem opening [" << argv[1] << "]\n"; + + return 2; +} diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/examples/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/CMakeLists.txt new file mode 100755 index 0000000..7e0d780 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/CMakeLists.txt @@ -0,0 +1,33 @@ +PROJECT(openvibe-plugins-examples) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleXML") +INCLUDE("FindThirdPartyGTK") +INCLUDE("FindOpenViBEVisualizationToolkit") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) +INSTALL(DIRECTORY metaboxes DESTINATION ${DIST_DATADIR}/openvibe/) + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/examples/box-tutorials/modifiable-temporal-filter.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/box-tutorials/modifiable-temporal-filter.xml new file mode 100644 index 0000000..415c54c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/box-tutorials/modifiable-temporal-filter.xml @@ -0,0 +1,423 @@ + + 1 + openvibe + 2.0 + + + (0x00003edf, 0x00007efb) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192.000000 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 384.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 113 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00005115, 0x00004c40) + Modifiable Temporal filter + (0xbf49d042, 0x9d79fe52) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + true + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + true + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + true + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 29 + true + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 40 + true + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + true + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 202 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0041dd1f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006b9e, 0x000045d8) + Sinus oscillator + (0x7e33bdb8, 0x68194a4a) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xad100179, 0xa3c984ab) + 121 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00666ed2) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + + + (0x00003c25, 0x00000d89) + + (0x00005115, 0x00004c40) + 0 + + + (0x00003edf, 0x00007efb) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 137 + + + (0x358ae8b5, 0x0f8bacd1) + 384 + + + (0x3f0a3b27, 0x570913d2) + 168 + + + (0x6267b5c5, 0x676e3e42) + 369 + + + + + (0x00004886, 0x00003416) + + (0x00006b9e, 0x000045d8) + 0 + + + (0x00005115, 0x00004c40) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 67 + + + (0x358ae8b5, 0x0f8bacd1) + 384 + + + (0x3f0a3b27, 0x570913d2) + 88 + + + (0x6267b5c5, 0x676e3e42) + 384 + + + + + + + (0x00000d5b, 0x000076b6) + The modifiable temporal filter box is a duplicate +of the original temporal filter box with all settings +marked as modifiables. +It means that during run, a widget will appear where + you can modify the value of these settings. As +you do that, you will notice that the signal will + change accordingly. + + + (0x473d9a43, 0x97fc0a97) + 112 + + + (0x7234b86b, 0x2b8651a5) + 112 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00003edf, 0x00007efb)","childCount":0,"identifier":"(0x00002ce4, 0x00000c63)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"height":320,"identifier":"(0x00003820, 0x000008c9)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00005d8b, 0x000029a4)","index":0,"name":"Default tab","parentIdentifier":"(0x00003820, 0x000008c9)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00002efb, 0x00003d85)","index":1,"name":"config","parentIdentifier":"(0x00003820, 0x000008c9)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000063e7, 0x000031ad)","index":0,"name":"Empty","parentIdentifier":"(0x00005d8b, 0x000029a4)","type":0},{"boxIdentifier":"(0x00005115, 0x00004c40)","childCount":0,"identifier":"(0x000020c4, 0x000038b5)","index":0,"parentIdentifier":"(0x00002efb, 0x00003d85)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Loic Mahe + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Modifiable Temporal filter example + + + (0xf36a1567, 0xd13c53da) + http://openvibe.inria.fr/modifiable-box-settings/ + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/examples/metaboxes/SignalCleanup.mxb b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/metaboxes/SignalCleanup.mxb new file mode 100644 index 0000000..ee61336 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/metaboxes/SignalCleanup.mxb @@ -0,0 +1,310 @@ + + 1 + Designer + 2.0.0 + + + (0x007deef9, 0x2f3e95c6) + LowCutFrequency + 1 + 1 + + + (0x007deef9, 0x2f3e95c6) + HighCutFrequency + 100 + 100 + + + (0x007deef9, 0x2f3e95c6) + NotchLowFrequency + 48 + 48 + + + (0x007deef9, 0x2f3e95c6) + NotchHighFrequency + 52 + 52 + + + + + (0x5ba36127, 0x195feae1) + Input Signal + (0x0d17e04a, 0x1c8eee27) + 0 + + + + + (0x5ba36127, 0x195feae1) + Filtered Signal + (0x7ebeb131, 0x19f98c70) + 0 + + + + + (0x0d17e04a, 0x1c8eee27) + Notch Filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter Method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter Type + Band Pass + Band Stop + false + + + (0x007deef9, 0x2f3e95c6) + Filter Order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low Cut-off Frequency (Hz) + 1 + $var{NotchLowFrequency} + false + + + (0x512a166f, 0x5c3ef83f) + High Cut-off Frequency (Hz) + 40 + $var{NotchHighFrequency} + false + + + (0x512a166f, 0x5c3ef83f) + Band Pass Ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7ebeb131, 0x19f98c70) + Band Pass + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter Method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter Type + Band Pass + Band Pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter Order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low Cut-off Frequency (Hz) + 1 + $var{LowCutFrequency} + false + + + (0x512a166f, 0x5c3ef83f) + High Cut-off Frequency (Hz) + 40 + $var{HighCutFrequency} + false + + + (0x512a166f, 0x5c3ef83f) + Band Pass Ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x47f3989a, 0x16eca6a5) + + (0x0d17e04a, 0x1c8eee27) + 0 + + + (0x7ebeb131, 0x19f98c70) + 0 + + + + + + (0x1785e47c, 0x56b8227f) + This is an <u>example of metabox</u> used in the metabox +tutorial at <i>http://openvibe.inria.fr/designer-tutorial-5-metaboxes#Creating+metaboxes</i> + + + (0x473d9a43, 0x97fc0a97) + 320 + + + (0x7234b86b, 0x2b8651a5) + 96 + + + + + + + (0x260f2f8f, 0x2018a17e) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x2493e905, 0x578f4d26)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x3e591476, 0x11ecc87e)","index":0,"name":"Default tab","parentIdentifier":"(0x2493e905, 0x578f4d26)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x1b569e6e, 0x77c50f4a)","index":0,"name":"Empty","parentIdentifier":"(0x3e591476, 0x11ecc87e)","type":0}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x198dd621, 0xab7f153f) + (0x40c92d63, 0xac62524f) + + + (0x20c6d158, 0xfe90aadd) + (0xc5ff4187, 0xffc5f432) + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x7a3a1558, 0xf12c63c2) + Please open the metabox .mxb in Designer to see how it works + + + (0x84009d7c, 0x3c4e763b) + Combines a bandstop and a bandpass filter + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Signal Cleanup + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Examples/Metabox + + + (0xf8034a49, 0x8b3f37cc) + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCBoxAlgorithmClock.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCBoxAlgorithmClock.cpp new file mode 100644 index 0000000..8f1f1e7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCBoxAlgorithmClock.cpp @@ -0,0 +1,39 @@ +#include "ovpCBoxAlgorithmClock.h" + +namespace OpenViBE { +namespace Plugins { +namespace Examples { + +uint64_t CBoxAlgorithmClock::getClockFrequency() +{ + getLogManager() << m_logLevel << "Clock frequency requested at time " << CTime(getPlayerContext().getCurrentTime()) << "\n"; + return m_clockFrequency << 32; +} + +bool CBoxAlgorithmClock::initialize() +{ + m_clockFrequency = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + const CString value = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_logLevel = Kernel::ELogLevel(getBoxAlgorithmContext()->getPlayerContext()->getTypeManager().getEnumerationEntryValueFromName(OV_TypeId_LogLevel, value)); + + getLogManager() << m_logLevel << "Clock frequency tuned to " << m_clockFrequency << "\n"; + + return true; +} + +bool CBoxAlgorithmClock::processClock(Kernel::CMessageClock& /*msg*/) +{ + getLogManager() << m_logLevel << "Received clock message at time " << CTime(getPlayerContext().getCurrentTime()) << "\n"; + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmClock::process() +{ + getLogManager() << m_logLevel << "Process function activated at " << getPlayerContext().getCurrentTime() << "\n"; + return true; +} +} // namespace Examples +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCBoxAlgorithmClock.h b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCBoxAlgorithmClock.h new file mode 100644 index 0000000..eee8b75 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCBoxAlgorithmClock.h @@ -0,0 +1,60 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Examples { +class CBoxAlgorithmClock final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + uint64_t getClockFrequency() override; + bool initialize() override; + bool uninitialize() override { return true; } + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_Clock) + +protected: + + uint64_t m_clockFrequency = 0; + Kernel::ELogLevel m_logLevel = Kernel::LogLevel_None; +}; + +class CBoxAlgorithmClockDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Clock"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Simply prints clock activation times"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Examples/Basic"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-info"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_Clock; } + IPluginObject* create() override { return new CBoxAlgorithmClock; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("Clock frequency (Hz)", OV_TypeId_Integer, "60"); + prototype.addSetting("Log level to use", OV_TypeId_LogLevel, "Information"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ClockDesc) +}; +} // namespace Examples +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCBoxAlgorithmNothing.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCBoxAlgorithmNothing.cpp new file mode 100644 index 0000000..ba0c165 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCBoxAlgorithmNothing.cpp @@ -0,0 +1,12 @@ +#include "ovpCBoxAlgorithmNothing.h" + +namespace OpenViBE { +namespace Plugins { +namespace Examples { + +bool CBoxAlgorithmNothing::initialize() { return true; } +bool CBoxAlgorithmNothing::uninitialize() { return true; } +bool CBoxAlgorithmNothing::process() { return true; } +} // namespace Examples +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCBoxAlgorithmNothing.h b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCBoxAlgorithmNothing.h new file mode 100644 index 0000000..29b0b0b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCBoxAlgorithmNothing.h @@ -0,0 +1,50 @@ +#pragma once + +#include +#include + +#define OVP_ClassId_BoxAlgorithm_Nothing OpenViBE::CIdentifier(0x273960C0, 0x485C407C) +#define OVP_ClassId_BoxAlgorithm_NothingDesc OpenViBE::CIdentifier(0x7A6167D9, 0x79070E22) + + +namespace OpenViBE { +namespace Plugins { +namespace Examples { +class CBoxAlgorithmNothing final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_Nothing) +}; + +class CBoxAlgorithmNothingDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Nothing"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("This box does nothing"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Examples/Basic"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-about"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_Nothing; } + IPluginObject* create() override { return new CBoxAlgorithmNothing; } + + bool getBoxPrototype(Kernel::IBoxProto& /*prototype*/) const override { return true; } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_NothingDesc) +}; +} // namespace Examples +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCHelloWorld.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCHelloWorld.cpp new file mode 100644 index 0000000..3b9a13c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCHelloWorld.cpp @@ -0,0 +1,23 @@ +/* + * Prints user-specified greeting to the log with given frequency + */ +#include "ovpCHelloWorld.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Examples { + + +uint64_t CHelloWorld::getClockFrequency() { return CTime(double(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0))).time(); } + +bool CHelloWorld::processClock(Kernel::CMessageClock& /*msg*/) +{ + const CString myGreeting = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + getLogManager() << Kernel::LogLevel_Info << ": " << myGreeting << "\n"; + return true; +} +} // namespace Examples +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCHelloWorld.h b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCHelloWorld.h new file mode 100644 index 0000000..a229922 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCHelloWorld.h @@ -0,0 +1,65 @@ +#pragma once + +#include "../ovp_defines.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace Examples { +class CHelloWorld final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + uint64_t getClockFrequency() override; + bool processClock(Kernel::CMessageClock& /*msg*/) override; + bool process() override { return true; } + + _IsDerivedFromClass_Final_(IBoxAlgorithm, OVP_ClassId_HelloWorld) +}; + +class CHelloWorldListener final : public Toolkit::TBoxListener +{ +public: + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CHelloWorldDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("HelloWorld"); } + CString getAuthorName() const override { return CString(""); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + + CString getShortDescription() const override { return CString("Prints \"Hello World!\" to the log with a user-specified frequency"); } + + CString getDetailedDescription() const override + { + return CString("Using several copies of this friendly box (with different names) can be used to e.g. examine box execution order"); + } + + CString getCategory() const override { return CString("Examples/Basic"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-copy"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_HelloWorld; } + IPluginObject* create() override { return new CHelloWorld(); } + IBoxListener* createBoxListener() const override { return new CHelloWorldListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("Frequency (Hz)", OV_TypeId_Float, "1.0"); + prototype.addSetting("My greeting", OV_TypeId_String, "Hello World!"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_HelloWorldDesc) +}; +} // namespace Examples +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCHelloWorldWithInput.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCHelloWorldWithInput.cpp new file mode 100644 index 0000000..e3fc4b6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCHelloWorldWithInput.cpp @@ -0,0 +1,43 @@ +/* + * Prints user-specified greeting to the log every time process() is called. Passes the signal through. + */ +#include "ovpCHelloWorldWithInput.h" + +namespace OpenViBE { +namespace Plugins { +namespace Examples { + +bool CHelloWorldWithInput::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CHelloWorldWithInput::process() +{ + Kernel::IBoxIO* boxContext = getBoxAlgorithmContext()->getDynamicBoxContext(); + const size_t nInput = getBoxAlgorithmContext()->getStaticBoxContext()->getInputCount(); + uint64_t start = 0; + uint64_t end = 0; + size_t chunkSize = 0; + const uint8_t* buffer = nullptr; + + for (size_t i = 0; i < nInput; ++i) + { + for (size_t j = 0; j < boxContext->getInputChunkCount(i); ++j) + { + boxContext->getInputChunk(i, j, start, end, chunkSize, buffer); + boxContext->appendOutputChunkData(i, buffer, chunkSize); + boxContext->markOutputAsReadyToSend(i, start, end); + boxContext->markInputAsDeprecated(i, j); + } + } + + const CString myGreeting = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + getLogManager() << Kernel::LogLevel_Info << ": " << myGreeting << "\n"; + + return true; +} +} // namespace Examples +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCHelloWorldWithInput.h b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCHelloWorldWithInput.h new file mode 100644 index 0000000..3975cfc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCHelloWorldWithInput.h @@ -0,0 +1,95 @@ +#pragma once + +#include "../ovp_defines.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace Examples { +class CHelloWorldWithInput final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(IBoxAlgorithm, OVP_ClassId_HelloWorldWithInput) +}; + +class CHelloWorldWithInputListener final : public Toolkit::TBoxListener +{ +public: + + // The purposes of the following functions is to make the output correspond to the input + + bool onInputNameChanged(Kernel::IBox& box, const size_t index) override + { + CString inputName; + box.getInputName(index, inputName); + box.setOutputName(index, CString("Copy of '") + inputName + CString("'")); + return true; + } + + bool onInputAdded(Kernel::IBox& box, const size_t /*index*/) override + { + // Duplicate input as new output + box.addOutput("Temporary name", OV_TypeId_EBMLStream); + return true; + } + + bool onInputRemoved(Kernel::IBox& box, const size_t index) override + { + box.removeOutput(index); + return true; + } + + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + // Keep input and output types identical + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(index, typeID); + box.setOutputType(index, typeID); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CHelloWorldWithInputDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("HelloWorldWithInput"); } + CString getAuthorName() const override { return CString(""); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + + CString getShortDescription() const override { return CString("Duplicates input to output and prints a message to the log for each input block"); } + + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Examples/Basic"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-copy"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_HelloWorldWithInput; } + IPluginObject* create() override { return new CHelloWorldWithInput(); } + IBoxListener* createBoxListener() const override { return new CHelloWorldWithInputListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("Message", OV_TypeId_String, "Hello!"); // setting 0 + + prototype.addInput("Input 0", OV_TypeId_Signal); + prototype.addOutput("Copy of 'Input 0'", OV_TypeId_Signal); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_HelloWorldWithInputDesc) +}; +} // namespace Examples +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCLog.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCLog.cpp new file mode 100644 index 0000000..ccb24d5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCLog.cpp @@ -0,0 +1,46 @@ +#include "ovpCLog.h" + +namespace OpenViBE { +namespace Plugins { +namespace Examples { + +bool CLog::initialize() +{ + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Info << "initialize\n"; + return true; +} + +bool CLog::uninitialize() +{ + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Info << "uninitialize\n"; + return true; +} + +bool CLog::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Info << "processClock\n"; + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CLog::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Info << "processInput\n"; + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CLog::process() +{ + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Info << "process\n"; + + Kernel::IBoxIO* boxContext = getBoxAlgorithmContext()->getDynamicBoxContext(); + const size_t nInput = getBoxAlgorithmContext()->getStaticBoxContext()->getInputCount(); + + for (size_t i = 0; i < nInput; ++i) { for (size_t j = 0; j < boxContext->getInputChunkCount(i); ++j) { boxContext->markInputAsDeprecated(i, j); } } + + return true; +} +} // namespace Examples +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCLog.h b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCLog.h new file mode 100644 index 0000000..81aab0d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/box-algorithms/ovpCLog.h @@ -0,0 +1,241 @@ +#pragma once + +#include "../ovp_defines.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Examples { +class CLog final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + uint64_t getClockFrequency() override { return 1LL << 32; } + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(IBoxAlgorithm, OVP_ClassId_Log) +}; + +class CLogListener final : public Toolkit::TBoxListener +{ +public: + + CLogListener() {} + + bool initialize() override + { + this->getLogManager() << m_logLevel << "initialize\n"; + return true; + } + + bool uninitialize() override + { + this->getLogManager() << m_logLevel << "uninitialize\n"; + return true; + } + + bool onInitialized(Kernel::IBox& /*box*/) override + { + this->getLogManager() << m_logLevel << "onInitialized\n"; + return true; + } + + bool onNameChanged(Kernel::IBox& /*box*/) override + { + this->getLogManager() << m_logLevel << "onNameChanged\n"; + return true; + } + + bool onIdentifierChanged(Kernel::IBox& /*box*/) override + { + this->getLogManager() << m_logLevel << "onIdentifierChanged\n"; + return true; + } + + bool onAlgorithmClassIdentifierChanged(Kernel::IBox& /*box*/) override + { + this->getLogManager() << m_logLevel << "onAlgorithmClassIdentifierChanged\n"; + return true; + } + + bool onProcessingUnitChangedon(Kernel::IBox& /*box*/) const + { + this->getLogManager() << m_logLevel << "onProcessingUnitChangedon\n"; + return true; + } + + bool onInputConnected(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onInputConnected\n"; + return true; + } + + bool onInputDisconnected(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onInputDisconnected\n"; + return true; + } + + bool onInputAdded(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onInputAdded\n"; + return true; + } + + bool onInputRemoved(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onInputRemoved\n"; + return true; + } + + bool onInputTypeChanged(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onInputTypeChanged\n"; + return true; + } + + bool onInputNameChanged(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onInputNameChanged\n"; + return true; + } + + bool onOutputConnected(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onOutputConnected\n"; + return true; + } + + bool onOutputDisconnected(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onOutputDisconnected\n"; + return true; + } + + bool onOutputAdded(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onOutputAdded\n"; + return true; + } + + bool onOutputRemoved(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onOutputRemoved\n"; + return true; + } + + bool onOutputTypeChanged(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onOutputTypeChanged\n"; + return true; + } + + bool onOutputNameChanged(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onOutputNameChanged\n"; + return true; + } + + bool onSettingAdded(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onSettingAdded\n"; + return true; + } + + bool onSettingRemoved(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onSettingRemoved\n"; + return true; + } + + bool onSettingTypeChanged(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onSettingTypeChanged\n"; + return true; + } + + bool onSettingNameChanged(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onSettingNameChanged\n"; + return true; + } + + bool onSettingDefaultValueChanged(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onSettingDefaultValueChanged\n"; + return true; + } + + bool onSettingValueChanged(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + this->getLogManager() << m_logLevel << "onSettingValueChanged\n"; + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) + +protected: + + Kernel::ELogLevel m_logLevel = Kernel::LogLevel_Info; +}; + +class CLogDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("Log"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Logs stuffs (init, uninit, input, clock, process)"); } + + CString getDetailedDescription() const override + { + return CString( + "This sample box shows how stuffs could be logged in the log manager. Note that the different inputs, outputs and parameters have no effect, they only exist to test the logging when there are modifications."); + } + + CString getCategory() const override { return CString("Examples/Basic"); } + CString getVersion() const override { return CString("1.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Log; } + IPluginObject* create() override { return new CLog(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + // Adds box inputs + prototype.addInput("Input stream", OV_TypeId_Signal); + + // Adds box outputs + prototype.addOutput("Output stream", OV_TypeId_Signal); + + // Adds box settings + prototype.addSetting("Integer setting", OV_TypeId_Integer, "0"); + prototype.addSetting("String setting", OV_TypeId_String, ""); + + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + prototype.addFlag(Kernel::BoxFlag_CanAddOutput); + prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + prototype.addFlag(Kernel::BoxFlag_CanAddSetting); + prototype.addFlag(Kernel::BoxFlag_CanModifySetting); + + return true; + } + + CString getStockItemName() const override { return CString("gtk-edit"); } + + IBoxListener* createBoxListener() const override { return new CLogListener; } + virtual void releaseBoxListener(IBoxListener* listener) { delete listener; } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_LogDesc) +}; +} // namespace Examples +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/ovp_defines.h new file mode 100755 index 0000000..3df54de --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/ovp_defines.h @@ -0,0 +1,21 @@ +#pragma once + + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_Clock OpenViBE::CIdentifier(0x14CB4CFC, 0x6D064CB3) +#define OVP_ClassId_BoxAlgorithm_ClockDesc OpenViBE::CIdentifier(0x754C233D, 0x37DF04A3) +#define OVP_ClassId_Log OpenViBE::CIdentifier(0x00BE3E25, 0x274F2075) +#define OVP_ClassId_LogDesc OpenViBE::CIdentifier(0x00780136, 0x57633D46) +#define OVP_ClassId_HelloWorldDesc OpenViBE::CIdentifier(0x62B739D3, 0x040A3F74) +#define OVP_ClassId_HelloWorldWithInputDesc OpenViBE::CIdentifier(0x6E067319, 0x775675F0) +#define OVP_ClassId_HelloWorld OpenViBE::CIdentifier(0x189445E8, 0x57C55950) +#define OVP_ClassId_HelloWorldWithInput OpenViBE::CIdentifier(0x657D5545, 0x1CE92FB8) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/ovp_main.cpp new file mode 100755 index 0000000..56cd0e4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/examples/src/ovp_main.cpp @@ -0,0 +1,29 @@ +#include "ovp_defines.h" + +#include "box-algorithms/ovpCHelloWorld.h" +#include "box-algorithms/ovpCHelloWorldWithInput.h" + +#include "box-algorithms/ovpCLog.h" +#include "box-algorithms/ovpCBoxAlgorithmNothing.h" +#include "box-algorithms/ovpCBoxAlgorithmClock.h" + +namespace OpenViBE { +namespace Plugins { +namespace Examples { + +OVP_Declare_Begin() + context.getTypeManager().registerEnumerationEntry(OV_TypeId_BoxAlgorithmFlag, OV_AttributeId_Box_FlagIsUnstable.toString(), + OV_AttributeId_Box_FlagIsUnstable.id()); + + OVP_Declare_New(CHelloWorldDesc); + OVP_Declare_New(CHelloWorldWithInputDesc); + + OVP_Declare_New(CLogDesc); + OVP_Declare_New(CBoxAlgorithmNothingDesc); + OVP_Declare_New(CBoxAlgorithmClockDesc); + +OVP_Declare_End() + +} // namespace Examples +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/.gitignore b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/.gitignore new file mode 100644 index 0000000..3f38087 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/.gitignore @@ -0,0 +1,4 @@ +doc/html/* +Doxyfile +.vscode/ +test/scenarios-tests/*output* \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/CMakeLists.txt new file mode 100644 index 0000000..4fadfd8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/CMakeLists.txt @@ -0,0 +1,53 @@ +PROJECT(openvibe-plugins-features-selection) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.hpp src/*.h src/*.inl src/*.c) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE") + +INCLUDE_DIRECTORIES("src") + +# OpenViBE Base +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") + +# OpenViBE Module +#INCLUDE("FindOpenViBEModuleSystem") +#INCLUDE("FindOpenViBEModuleXML") + +# OpenViBE Third Party +#INCLUDE("FindThirdPartyEigen") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +SET(SUB_DIR_NAME features-selection) + +INSTALL(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials/${SUB_DIR_NAME}) +INSTALL(DIRECTORY bci-examples/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/bci-examples/filter-bank-CSP) + +# --------------------------------- +# Test applications +# --------------------------------- +IF(OV_COMPILE_TESTS) +#ADD_SUBDIRECTORY(test) +ENDIF() diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/0-monitoring.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/0-monitoring.xml new file mode 100644 index 0000000..5dec45f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/0-monitoring.xml @@ -0,0 +1,1867 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x000f55d4, 0x831a706d) + (0x79a9edeb, 0x245d83fc) + Scripts Path + ${Player_ScenarioDirectory}/scripts + ${Player_ScenarioDirectory}/scripts + + + (0x0003cf48, 0xe596f5a1) + (0x512a166f, 0x5c3ef83f) + EMG Low Cut Frequency + 50 + 50 + + + (0x005ac506, 0xc78c66dd) + (0x512a166f, 0x5c3ef83f) + EMG High Cut Frequency + 150 + 150 + + + (0x005e0867, 0xd05c7291) + (0x5261636b, 0x41646170) + Alpha Low Cut Frequency + No + 8 + + + (0x00300a9c, 0xd5da1acd) + (0x512a166f, 0x5c3ef83f) + Alpha High Cut Frequency + 12 + 12 + + + (0x00130408, 0x7ec80cb9) + (0x512a166f, 0x5c3ef83f) + Low Cut Frequency + 1 + 1 + + + (0x0048dfbb, 0x51c49775) + (0x512a166f, 0x5c3ef83f) + High Cut Frequency + 40 + 40 + + + + + + + (0x0000101b, 0x000003dc) + 1:16 + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000101b, 0x000003dd) + 17:30 + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00001fff, 0x000065fc) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0073c491) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00002847, 0x00000a62) + Channel Rename + (0x1fe50479, 0x39040f40) + + + (0x5ba36127, 0x195feae1) + Input matrix + + + + + (0x5ba36127, 0x195feae1) + Output matrix + + + + + (0x79a9edeb, 0x245d83fc) + New channel names + Channel 1;Channel 2 + Channel 1;Channel 2 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x74d8d30c, 0xfa7bdf43) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/channel-list.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000041c0, 0x00000cd1) + Raw signals + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003879ed) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00005aef, 0x00007c34) + Alpha signal + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00005aef, 0x00007c35) + EMG signal + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000065a7, 0x00000785) + EMGg;EMGd + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + EMGg;EMGd + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001cf918) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000065a7, 0x00000787) + P3;Pz;P4 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + P3;Pz;P4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001cf918) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000065a7, 0x00000788) + !EventChannel1;EventChannel2 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + EventChannel1;EventChannel2 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Reject + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001cf918) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006d9b, 0x00001d22) + 1:16 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + 1:16 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006d9b, 0x00001d23) + 17:32 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + 17:32 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006f35, 0x00001cd0) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006f35, 0x00001cd2) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x000c8e02, 0x798027c1) + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x005a78b4, 0x7e1832fd) + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000078ac, 0x00005edf) + General Filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + $var{Low Cut Frequency} + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + $var{High Cut Frequency} + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00492488) + + + + + (0x000078ac, 0x00005ee1) + Alpha Filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + $var{Alpha Low Cut Frequency} + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + $var{Alpha High Cut Frequency} + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00492488) + + + + + (0x000078ac, 0x00005ee2) + EMG Filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + $var{EMG Low Cut Frequency} + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + $var{EMG High Cut Frequency} + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00492488) + + + + + + + (0x0000038b, 0x00000040) + + (0x00002847, 0x00000a62) + 0 + + + (0x000065a7, 0x00000787) + 0 + + + + (0x00000e8d, 0x000050d3) + + (0x000078ac, 0x00005ee1) + 0 + + + (0x00005aef, 0x00007c34) + 0 + + + + (0x00001083, 0x000029da) + + (0x00001fff, 0x000065fc) + 1 + + + (0x00006f35, 0x00001cd2) + 0 + + + + (0x00001455, 0x0000557c) + + (0x00006f35, 0x00001cd0) + 0 + + + (0x00006d9b, 0x00001d23) + 0 + + + + (0x000018e8, 0x0000541f) + + (0x00001fff, 0x000065fc) + 1 + + + (0x00002847, 0x00000a62) + 0 + + + + (0x00001a36, 0x00005ad3) + + (0x00001fff, 0x000065fc) + 2 + + + (0x00006f35, 0x00001cd2) + (0x000c8e02, 0x798027c1) + + + + (0x00001c0d, 0x00006cae) + + (0x00006f35, 0x00001cd2) + (0x005a78b4, 0x7e1832fd) + + + (0x000041c0, 0x00000cd1) + 1 + + + + (0x00001c17, 0x000076f2) + + (0x000078ac, 0x00005edf) + 0 + + + (0x00006f35, 0x00001cd0) + 0 + + + + (0x000034fe, 0x000013a5) + + (0x00006f35, 0x00001cd0) + 0 + + + (0x00006d9b, 0x00001d22) + 0 + + + + (0x00003781, 0x00005bd6) + + (0x000078ac, 0x00005ee2) + 0 + + + (0x00005aef, 0x00007c35) + 0 + + + + (0x000043a4, 0x0000304b) + + (0x000065a7, 0x00000787) + 0 + + + (0x000078ac, 0x00005ee1) + 0 + + + + (0x000043b3, 0x00006d1a) + + (0x000065a7, 0x00000785) + 0 + + + (0x000078ac, 0x00005ee2) + 0 + + + + (0x00004c30, 0x0000176c) + + (0x00006d9b, 0x00001d23) + 0 + + + (0x0000101b, 0x000003dd) + 0 + + + + (0x000052ab, 0x00005981) + + (0x00002847, 0x00000a62) + 0 + + + (0x000065a7, 0x00000788) + 0 + + + + (0x000057d0, 0x00001887) + + (0x000065a7, 0x00000788) + 0 + + + (0x000078ac, 0x00005edf) + 0 + + + + (0x0000589e, 0x00006517) + + (0x00006f35, 0x00001cd2) + 0 + + + (0x000041c0, 0x00000cd1) + 0 + + + + (0x00005986, 0x00004946) + + (0x00006d9b, 0x00001d22) + 0 + + + (0x0000101b, 0x000003dc) + 0 + + + + (0x00007871, 0x00003bec) + + (0x00002847, 0x00000a62) + 0 + + + (0x000065a7, 0x00000785) + 0 + + + + + + (0x0000494c, 0x00003563) + This Scenario is set for a g.tec cap with 2 amplifier g.USBamp + + + (0x473d9a43, 0x97fc0a97) + 1408 + + + (0x7234b86b, 0x2b8651a5) + 48 + + + + + (0x00006a47, 0x0000309a) + <b>OVERVIEW</b> +Change Settings on Scenario Configuration tab : +Scripts path = folder to the scripts and config files (normally don't need to change that if you keep the hierarchy) +EMG Low/High Cut Frequency = Frequency for the temporal filter on EMG Monitoring +Alpha Low/High Cut Frequency = Frequency for the temporal filter on Alpha Monitoring +Low/High Cut Frequency = Frequency for the temporal filter on classical Monitoring + +You can enable/disable displays (last line) with right click on it and select enable/disable option. + + + (0x473d9a43, 0x97fc0a97) + 1408 + + + (0x7234b86b, 0x2b8651a5) + 160 + + + + + (0x00006a47, 0x0000309b) + <b>PRESENTATION</b> +Les options sont modifiables dans l'onglet Scenario Configuration : +Scripts path = dossier des scripts et des fichiers de configuration (normalement, il n'est pas nécessaire de changer cela si vous conservez la hiérarchie) +EMG Low/High Cut Frequency =Fréquence du filtre temporel pour le monitoring EMG +Alpha Low/High Cut Frequency = Fréquence du filtre temporel pour le monitoring Alpha +Low/High Cut Frequency = Fréquence du filtre temporel pour le monitoring classique + +Vous pouvez activer/désactiver les displays (dernière ligne) en faisant un clic droit dessus et en sélectionnant l'option enable/disable. + + + (0x473d9a43, 0x97fc0a97) + 1408 + + + (0x7234b86b, 0x2b8651a5) + 320 + + + + + (0x00007d4e, 0x000054a5) + Displays + + + (0x473d9a43, 0x97fc0a97) + 368 + + + (0x7234b86b, 0x2b8651a5) + 416 + + + + + (0x00007d4e, 0x000054a6) + Filters + + + (0x473d9a43, 0x97fc0a97) + 368 + + + (0x7234b86b, 0x2b8651a5) + 208 + + + + + (0x00007d4e, 0x000054a7) + Channel Selection + + + (0x473d9a43, 0x97fc0a97) + 368 + + + (0x7234b86b, 0x2b8651a5) + 144 + + + + + + + (0x0000753c, 0x00007c57) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":768,"identifier":"(0x00002be2, 0x00001105)","name":"Monitoring","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1039},{"boxIdentifier":"(0x000041c0, 0x00000cd1)","childCount":0,"identifier":"(0x00002d71, 0x000052f7)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007509, 0x00001cac)","index":0,"name":"Default tab","parentIdentifier":"(0x00002be2, 0x00001105)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":634,"identifier":"(0x000030b4, 0x00007dc6)","index":0,"maxDividerPosition":1019,"name":"Horizontal split","parentIdentifier":"(0x00007509, 0x00001cac)","type":5},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":307,"identifier":"(0x000005b4, 0x000013be)","index":0,"maxDividerPosition":618,"name":"Horizontal split","parentIdentifier":"(0x000030b4, 0x00007dc6)","type":5},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":351,"identifier":"(0x00005659, 0x00007673)","index":1,"maxDividerPosition":707,"name":"Vertical split","parentIdentifier":"(0x000030b4, 0x00007dc6)","type":4},{"boxIdentifier":"(0x0000101b, 0x000003dc)","childCount":0,"identifier":"(0x00003b54, 0x000034d8)","index":0,"parentIdentifier":"(0x000005b4, 0x000013be)","type":3},{"boxIdentifier":"(0x0000101b, 0x000003dd)","childCount":0,"identifier":"(0x00006c1f, 0x00000220)","index":1,"parentIdentifier":"(0x000005b4, 0x000013be)","type":3},{"boxIdentifier":"(0x00005aef, 0x00007c34)","childCount":0,"identifier":"(0x00002439, 0x00001756)","index":0,"parentIdentifier":"(0x00005659, 0x00007673)","type":3},{"boxIdentifier":"(0x00005aef, 0x00007c35)","childCount":0,"identifier":"(0x000016fc, 0x00003d66)","index":1,"parentIdentifier":"(0x00005659, 0x00007673)","type":3}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x4c90d4ad, 0x7a2554ec) + 1 + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x7b814cca, 0x271df6dd) + 1 + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/1-baseline.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/1-baseline.xml new file mode 100644 index 0000000..7b8ead0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/1-baseline.xml @@ -0,0 +1,1023 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x000f55d4, 0x831a706d) + (0x79a9edeb, 0x245d83fc) + Scripts Path + ${Player_ScenarioDirectory}/scripts + ${Player_ScenarioDirectory}/scripts + + + (0x005ac506, 0xc78c66dd) + (0x79a9edeb, 0x245d83fc) + Images Path + ${Player_ScenarioDirectory}/img + ${Player_ScenarioDirectory}/img + + + (0x005e0867, 0xd05c7291) + (0x79a9edeb, 0x245d83fc) + Signals Path + ${Player_ScenarioDirectory}/signals + ${Player_ScenarioDirectory}/signals + + + (0x0003cf48, 0xe596f5a1) + (0x007deef9, 0x2f3e95c6) + Baseline Duration (s) + 180 + 180 + + + (0x0037a7ea, 0xd0b8579d) + (0x79a9edeb, 0x245d83fc) + XP Name + XP + XP + + + (0x00300a9c, 0xd5da1acd) + (0x79a9edeb, 0x245d83fc) + Subject ID + C1 + C1 + + + (0x00130408, 0x7ec80cb9) + (0x007deef9, 0x2f3e95c6) + Session + 1 + 1 + + + (0x0048dfbb, 0x51c49775) + (0x79a9edeb, 0x245d83fc) + Eyes (OE, CE) + OE + OE + + + (0x8fe7ee6a, 0x20b11628) + (0x79a9edeb, 0x245d83fc) + File Prefix + $var{XP Name}_$var{Subject ID}_S$var{Session}_R$var{Run} + $var{XP Name}_$var{Subject ID}_S$var{Session}__$var{Eyes (OE, CE)} + + + + + + + (0x00000dc7, 0x0000385f) + Display cue image + (0x005789a4, 0x3ab78a36) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x6f752dd0, 0x082a321e) + Stimulations (deprecated) + + + + + (0x2cdb2f0b, 0x12f231ea) + Display images in full screen + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Scale images to fit + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Clear screen Stimulation + OVTK_StimulationId_VisualStimulationStop + OVTK_StimulationId_BaselineStop + false + + + (0x330306dd, 0x74a95f98) + Cue Image 1 + ${Path_Data}/plugins/simple-visualisation/p300-magic-card/01.png + $var{Images Path}/Cross.png + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 1 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_BaselineStart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x18869d2c, 0x1a544d63) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000f21, 0x00006f70) + Sound Player + (0x7ac2396f, 0x7ee52efe) + + + (0x6f752dd0, 0x082a321e) + Input triggers + + + + + (0x6f752dd0, 0x082a321e) + Resync triggers + + + + + (0x2c132d6e, 0x44ab0d97) + PLAY trigger + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Beep + false + + + (0x2c132d6e, 0x44ab0d97) + STOP trigger + OVTK_StimulationId_Label_01 + OVTK_StimulationId_BaselineStop + false + + + (0x330306dd, 0x74a95f98) + File to play + ${Path_Data}/plugins/stimulation/ov_beep.wav + ${Path_Data}/plugins/stimulation/ov_beep.wav + false + + + (0x2cdb2f0b, 0x12f231ea) + Loop + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x4e7b798a, 0x183beafb) + (0xd327e20a, 0xaae6b1f8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005adaef) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000141c, 0x00003c42) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000141c, 0x00003c43) + Identity + (0x5dffe431, 0x35215c50) + + + (0x403488e7, 0x565d70b6) + Input stream + + + + + (0x403488e7, 0x565d70b6) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001881, 0x0000648e) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Signals Path}/$var{File Prefix}_baseline-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + true + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004f9ed7) + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002847, 0x00000a62) + Channel Rename + (0x1fe50479, 0x39040f40) + + + (0x5ba36127, 0x195feae1) + Input matrix + + + + + (0x5ba36127, 0x195feae1) + Output matrix + + + + + (0x79a9edeb, 0x245d83fc) + New channel names + Channel 1;Channel 2 + Channel 1;Channel 2 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x74d8d30c, 0xfa7bdf43) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/channel-list.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004390, 0x000055c5) + GDF file writer + (0x1e7b2155, 0x107289ce) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x6f752dd0, 0x082a321e) + Stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].gdf + $var{Signals Path}/$var{File Prefix}_baseline-[$core{date}-$core{time}].gdf + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0xd41e3037, 0xcc12644a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c660e3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000465a, 0x00004dbf) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -224 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0069f3f7) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x000065a7, 0x00000785) + !EventChannel1;EventChannel2 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + EventChannel1;EventChannel2 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Reject + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0033f7b6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007a62, 0x00007a92) + Lua Stimulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + $var{Scripts Path}/scenario-baseline.lua + false + + + (0x007deef9, 0x2f3e95c6) + baseline duration + 180 + $var{Baseline Duration (s)} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -176 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x24757b65, 0x29027b6f) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002de35c) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000001db, 0x000058a8) + + (0x0000141c, 0x00003c42) + 0 + + + (0x00004390, 0x000055c5) + 2 + + + + (0x00000930, 0x0000322c) + + (0x00007a62, 0x00007a92) + 0 + + + (0x00000dc7, 0x0000385f) + 0 + + + + (0x000011be, 0x000045cc) + + (0x000065a7, 0x00000785) + 0 + + + (0x00004390, 0x000055c5) + 1 + + + + (0x0000228f, 0x00002361) + + (0x00007a62, 0x00007a92) + 0 + + + (0x00000f21, 0x00006f70) + 0 + + + + (0x00002cc1, 0x000049ec) + + (0x00007a62, 0x00007a92) + 0 + + + (0x0000141c, 0x00003c42) + 0 + + + + (0x00003ccb, 0x00003283) + + (0x0000141c, 0x00003c42) + 0 + + + (0x00001881, 0x0000648e) + 2 + + + + (0x00004b1e, 0x000034b6) + + (0x0000465a, 0x00004dbf) + 0 + + + (0x0000141c, 0x00003c43) + 0 + + + + (0x00006343, 0x000043d4) + + (0x00002847, 0x00000a62) + 0 + + + (0x000065a7, 0x00000785) + 0 + + + + (0x0000654e, 0x00003cc0) + + (0x0000465a, 0x00004dbf) + 1 + + + (0x00002847, 0x00000a62) + 0 + + + + (0x00006e4a, 0x00000844) + + (0x000065a7, 0x00000785) + 0 + + + (0x00001881, 0x0000648e) + 1 + + + + (0x00007818, 0x0000649d) + + (0x0000141c, 0x00003c43) + 0 + + + (0x00004390, 0x000055c5) + 0 + + + + (0x00007854, 0x0000729e) + + (0x0000141c, 0x00003c43) + 0 + + + (0x00001881, 0x0000648e) + 0 + + + + (0x00007dd6, 0x000019dc) + + (0x00007a62, 0x00007a92) + 0 + + + (0x24757b65, 0x29027b6f) + 0 + + + + + + (0x0000494c, 0x00003563) + This Scenario is set for a g.tec cap with 2 amplifier g.USBamp + + + (0x473d9a43, 0x97fc0a97) + 1440 + + + (0x7234b86b, 0x2b8651a5) + -208 + + + + + (0x00006a47, 0x0000309a) + <b>OVERVIEW</b> +Change Settings on Scenario Configuration tab : +Scripts/Images/Signals path = folder to the different files (normally don't need to change that if you keep the hierarchy) +Obvious settings = obvious.... +Eyes (OE, CE) = indicate if the baseline is Opened Eyes (OE) or Closed Eyes (CE) + +File Format for saved signals : {XP Name}_{Subject ID}_S{Session}_{OE/CE}_baseline-[{date}-{time}] + + + (0x473d9a43, 0x97fc0a97) + 1456 + + + (0x7234b86b, 0x2b8651a5) + -112 + + + + + (0x00006a47, 0x0000309b) + <b>PRESENTATION</b> +Les options sont modifiables dnas l'onglet Scenario Configuration : +Scripts/Images/Signals path = dossier des différents fichiers (normalement, il n'est pas nécessaire de changer cela si vous conservez la hiérarchie) +Paramètres évidents = évidents..... +Eyes(OE,CE) = Indique si la baseline s'effectue yeux ouvert (OE) ou yeux fermés (CE) + +Format de fichier pour les signaux enregistrés : {XP Name}_{Subject ID}_S{Session}_{OE/CE}_baseline-[{date}-{time}] + + + (0x473d9a43, 0x97fc0a97) + 1440 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + + + (0x00000b60, 0x000035d0) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00000dc7, 0x0000385f)","childCount":0,"identifier":"(0x00004a0b, 0x0000261c)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3}] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/2-acquisition.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/2-acquisition.xml new file mode 100644 index 0000000..5f6014d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/2-acquisition.xml @@ -0,0 +1,1159 @@ + + 2 + OpenViBE Designer + 3.0.0 + + + (0x000f55d4, 0x831a706d) + (0x79a9edeb, 0x245d83fc) + Scripts Path + ${Player_ScenarioDirectory}/scripts + ${Player_ScenarioDirectory}/scripts + + + (0x005e0867, 0xd05c7291) + (0x79a9edeb, 0x245d83fc) + Signals Path + ${Player_ScenarioDirectory}/signals + ${Player_ScenarioDirectory}/signals + + + (0x0003cf48, 0xe596f5a1) + (0x330306dd, 0x74a95f98) + Sham File + ${Player_ScenarioDirectory}/sham.ov + ${Player_ScenarioDirectory}/sham.ov + + + (0x00518793, 0xc89db4d9) + (0x79a9edeb, 0x245d83fc) + XP Name + XP + XP + + + (0x00300a9c, 0xd5da1acd) + (0x79a9edeb, 0x245d83fc) + Subject ID + C1 + C1 + + + (0x00130408, 0x7ec80cb9) + (0x007deef9, 0x2f3e95c6) + Session + 1 + 1 + + + (0x00090dc3, 0xaec30fa1) + (0x007deef9, 0x2f3e95c6) + Run + 1 + 1 + + + (0x78123719, 0x708d19c3) + (0x79a9edeb, 0x245d83fc) + File Prefix + $var{XP Name}_$var{Subject ID}_S$var{Session}_R$var{Run} + $var{XP Name}_$var{Subject ID}_S$var{Session}_R$var{Run} + + + + + + + (0x00000f21, 0x00006f70) + Sound Player + (0x7ac2396f, 0x7ee52efe) + + + (0x6f752dd0, 0x082a321e) + Input triggers + + + + + (0x6f752dd0, 0x082a321e) + Resync triggers + + + + + (0x2c132d6e, 0x44ab0d97) + PLAY trigger + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Beep + false + + + (0x2c132d6e, 0x44ab0d97) + STOP trigger + OVTK_StimulationId_Label_01 + OVTK_StimulationId_BaselineStop + false + + + (0x330306dd, 0x74a95f98) + File to play + ${Path_Data}/plugins/stimulation/ov_beep.wav + ${Path_Data}/plugins/stimulation/ov_beep.wav + false + + + (0x2cdb2f0b, 0x12f231ea) + Loop + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0xd327e20a, 0xaae6b1f8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005adaef) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000141c, 0x00003c42) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000141c, 0x00003c43) + Identity + (0x5dffe431, 0x35215c50) + + + (0x403488e7, 0x565d70b6) + Input stream + + + + + (0x403488e7, 0x565d70b6) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001881, 0x0000648e) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Signals Path}/$var{File Prefix}_acquisition-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + true + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004f9ed7) + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001e72, 0x00002686) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x544a003e, 0x6dcba5f6) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Sham File} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00023df8) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00002847, 0x00000a63) + Channel Rename + (0x1fe50479, 0x39040f40) + + + (0x5ba36127, 0x195feae1) + Input matrix + + + + + (0x5ba36127, 0x195feae1) + Output matrix + + + + + (0x79a9edeb, 0x245d83fc) + New channel names + Channel 1;Channel 2 + Channel 1;Channel 2 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x74d8d30c, 0xfa7bdf43) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/channel-list.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002a20, 0x00000cc4) + Graz Motor Imagery BCI Stimulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + $var{Scripts Path}/mi-bci-graz-stimulator.lua + false + + + (0x007deef9, 0x2f3e95c6) + Number of Trials for Each Class + 20 + 20 + false + + + (0x2c132d6e, 0x44ab0d97) + First Class + OVTK_GDF_Left + OVTK_GDF_Left + false + + + (0x2c132d6e, 0x44ab0d97) + Second Class + OVTK_GDF_Right + OVTK_GDF_Right + false + + + (0x512a166f, 0x5c3ef83f) + Baseline Duration (in sec) + 20 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Wait For Beep Duration (in sec) + 2 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + Wait For Cue Duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Display Cue Duration (in sec) + 1.250 + 1.250 + false + + + (0x512a166f, 0x5c3ef83f) + Feedback Duration (in sec) + 3.750 + 3.750 + false + + + (0x512a166f, 0x5c3ef83f) + End of Trial Minimum Duration (in sec) + 1.500 + 1.500 + false + + + (0x512a166f, 0x5c3ef83f) + End of Trial Maximum Duration (in sec) + 3.500 + 3.500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005810d7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004390, 0x000055c5) + GDF file writer + (0x1e7b2155, 0x107289ce) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x6f752dd0, 0x082a321e) + Stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].gdf + $var{Signals Path}/$var{File Prefix}_acquisition-[$core{date}-$core{time}].gdf + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0xd41e3037, 0xcc12644a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c660e3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000465a, 0x00004dbf) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0069f3f7) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00004b91, 0x00002aea) + Graz visualization + (0x00dd290d, 0x5f142820) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Show feedback + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive feedback only + false + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x602ceb3f, 0xd3bc74aa) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000065a7, 0x00000786) + !EventChannel1;EventChannel2 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + EventChannel1;EventChannel2 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Reject + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0033f7b6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x24757b65, 0x29027b6f) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 928 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002de35c) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000001db, 0x000058a8) + + (0x0000141c, 0x00003c42) + 0 + + + (0x00004390, 0x000055c5) + 2 + + + + (0x00000ca7, 0x00002b71) + + (0x00002a20, 0x00000cc4) + 0 + + + (0x0000141c, 0x00003c42) + 0 + + + + (0x000011be, 0x000045cc) + + (0x000065a7, 0x00000786) + 0 + + + (0x00004390, 0x000055c5) + 1 + + + + (0x0000254c, 0x000012c8) + + (0x00001e72, 0x00002686) + 0 + + + (0x00004b91, 0x00002aea) + 1 + + + + (0x00002e60, 0x00004221) + + (0x00002a20, 0x00000cc4) + 0 + + + (0x00004b91, 0x00002aea) + 0 + + + + (0x00002fc5, 0x00000fea) + + (0x00002a20, 0x00000cc4) + 0 + + + (0x24757b65, 0x29027b6f) + 0 + + + + (0x00003ccb, 0x00003283) + + (0x0000141c, 0x00003c42) + 0 + + + (0x00001881, 0x0000648e) + 2 + + + + (0x00004b1e, 0x000034b6) + + (0x0000465a, 0x00004dbf) + 0 + + + (0x0000141c, 0x00003c43) + 0 + + + + (0x000053ec, 0x000057b2) + + (0x00002a20, 0x00000cc4) + 0 + + + (0x00000f21, 0x00006f70) + 0 + + + + (0x00006343, 0x000043d4) + + (0x00002847, 0x00000a63) + 0 + + + (0x000065a7, 0x00000786) + 0 + + + + (0x0000654e, 0x00003cc0) + + (0x0000465a, 0x00004dbf) + 1 + + + (0x00002847, 0x00000a63) + 0 + + + + (0x00006e4a, 0x00000844) + + (0x000065a7, 0x00000786) + 0 + + + (0x00001881, 0x0000648e) + 1 + + + + (0x00007818, 0x0000649d) + + (0x0000141c, 0x00003c43) + 0 + + + (0x00004390, 0x000055c5) + 0 + + + + (0x00007854, 0x0000729e) + + (0x0000141c, 0x00003c43) + 0 + + + (0x00001881, 0x0000648e) + 0 + + + + + + (0x0000494c, 0x00003563) + This Scenario is set for a g.tec cap with 2 amplifier g.USBamp + + + (0x473d9a43, 0x97fc0a97) + 1456 + + + (0x7234b86b, 0x2b8651a5) + -192 + + + + + (0x00006a47, 0x0000309a) + <b>OVERVIEW</b> +Change Settings on Scenario Configuration tab : +Scripts/Images/Signals path = folder to the different files (normally don't need to change that if you keep the hierarchy) +Sham File = link to the file for the sham feedback +Obvious settings = obvious.... + +File Format for saved signals : {XP Name}_{Subject ID}_S{Session}_R{Run}_acquisition-[{date}-{time}] + + + (0x473d9a43, 0x97fc0a97) + 1456 + + + (0x7234b86b, 0x2b8651a5) + -96 + + + + + (0x00006a47, 0x0000309b) + <b>PRESENTATION</b> +Les options sont modifiables dnas l'onglet Scenario Configuration : +Scripts/Images/Signals path = dossier des différents fichiers (normalement, il n'est pas nécessaire de changer cela si vous conservez la hiérarchie) +Sham File = Lien vers le fichier pour le faux feedback +Paramètres évidents = évidents..... + +Format de fichier pour les signaux enregistrés : {XP Name}_{Subject ID}_S{Session}_R{Run}_acquisition-[{date}-{time}] + + + (0x473d9a43, 0x97fc0a97) + 1440 + + + (0x7234b86b, 0x2b8651a5) + 48 + + + + + + + (0x00000815, 0x00002736) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00004b91, 0x00002aea)","childCount":0,"identifier":"(0x00000afd, 0x00002371)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3}] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/3-file-concatenation.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/3-file-concatenation.xml new file mode 100644 index 0000000..0ea4796 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/3-file-concatenation.xml @@ -0,0 +1,646 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x00069d80, 0x160bdf2d) + (0x79a9edeb, 0x245d83fc) + Signals Path + ${Player_ScenarioDirectory}/signals + ${Player_ScenarioDirectory}/signals + + + (0x002dd66e, 0x429f5d95) + (0x330306dd, 0x74a95f98) + EEG File 1 + ${Player_ScenarioDirectory}/File1.ov + ${Player_ScenarioDirectory}/File1.ov + + + (0x007b6f73, 0x6bb30a11) + (0x330306dd, 0x74a95f98) + EEG File 2 + ${Player_ScenarioDirectory}/File2.ov + ${Player_ScenarioDirectory}/File2.ov + + + (0x007c80c6, 0xd9f61cbd) + (0x79a9edeb, 0x245d83fc) + XP Name + XP + XP + + + (0x0076cf2d, 0xfce0f3b9) + (0x79a9edeb, 0x245d83fc) + Subject ID + C1 + C1 + + + (0x00737048, 0xa4e81409) + (0x007deef9, 0x2f3e95c6) + Session + 1 + 1 + + + (0x17e1da90, 0x931d45d2) + (0x79a9edeb, 0x245d83fc) + File Prefix + $var{XP Name}_$var{Subject ID}_S$var{Session} + $var{XP Name}_$var{Subject ID}_S$var{Session} + + + + + + + (0x00000661, 0x0000493c) + Stimulation Filter + (0x02f96101, 0x5e647cb8) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x6f752dd0, 0x082a321e) + Modified Stimulations + + + + + (0x09e59e57, 0x8d4a553a) + Default action + Reject + Select + false + + + (0x512a166f, 0x5c3ef83f) + Time range begin + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time range end + 0 + 0 + false + + + (0x09e59e57, 0x8d4a553a) + Action to perform + Select + Reject + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range begin + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Train + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range end + OVTK_StimulationId_Label_0F + OVTK_StimulationId_Train + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -64 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0x47859b3f, 0x1dfdf5cd) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000660a7) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001881, 0x0000648e) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Signals Path}/$var{File Prefix}_acquisition_concatfile-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + true + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004f9ed7) + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001fa8, 0x00006669) + Signal Concatenation + (0x372f3a9d, 0x49e20cd2) + + + (0x5ba36127, 0x195feae1) + Input signal 1 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 1 + + + (0x5ba36127, 0x195feae1) + Input signal 2 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 2 + + + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + Status + + + + + (0x007deef9, 0x2f3e95c6) + Time out before assuming end-of-file (in sec) + 5 + 5 + false + + + (0x2c132d6e, 0x44ab0d97) + End-of-file stimulation for input 1 + OVTK_StimulationId_ExperimentStop + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + End-of-file stimulation for input 2 + OVTK_StimulationId_ExperimentStop + OVTK_StimulationId_ExperimentStop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0x2071186d, 0x08fedd4a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000eec27) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 4 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002c92, 0x00005978) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 512 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000673cb) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005836, 0x00007f57) + EEG Data File 2 reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{EEG File 2} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00171804) + + + + + (0x0000694c, 0x00005014) + EEG data file 1 reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{EEG File 1} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001757c3) + + + + + + + (0x00000d20, 0x000000b6) + + (0x00000661, 0x0000493c) + 0 + + + (0x00001fa8, 0x00006669) + 1 + + + + (0x0000183b, 0x00001437) + + (0x00001fa8, 0x00006669) + 2 + + + (0x00002c92, 0x00005978) + 0 + + + + (0x00001d3a, 0x00001319) + + (0x00001fa8, 0x00006669) + 0 + + + (0x00001881, 0x0000648e) + 1 + + + + (0x00001f3e, 0x00002128) + + (0x0000694c, 0x00005014) + 1 + + + (0x00001fa8, 0x00006669) + 0 + + + + (0x00003d79, 0x00000790) + + (0x0000694c, 0x00005014) + 2 + + + (0x00000661, 0x0000493c) + 0 + + + + (0x00004377, 0x00004a5d) + + (0x00001fa8, 0x00006669) + 1 + + + (0x00001881, 0x0000648e) + 2 + + + + (0x00005d5c, 0x00003c88) + + (0x00005836, 0x00007f57) + 2 + + + (0x00001fa8, 0x00006669) + 3 + + + + (0x00006601, 0x0000605f) + + (0x00005836, 0x00007f57) + 1 + + + (0x00001fa8, 0x00006669) + 2 + + + + + + (0x0000494c, 0x00003563) + This Scenario is set for a g.tec cap with 2 amplifier g.USBamp + + + (0x473d9a43, 0x97fc0a97) + 1072 + + + (0x7234b86b, 0x2b8651a5) + -144 + + + + + (0x00006a47, 0x0000309a) + <b>OVERVIEW</b> +Change Settings on Scenario Configuration tab : +Scripts path = folder to the scripts and config files (normally don't need to change that that if you keep the hierarchy) +EEG File 1/2 = link to the file to concatenate +Obvious settings = obvious.... + +File Format for saved signals : {XP Name}_{Subject ID}_S{Session}__acquisition_concatfile-[{date}-{time}] + + + (0x473d9a43, 0x97fc0a97) + 1056 + + + (0x7234b86b, 0x2b8651a5) + -48 + + + + + (0x00006a47, 0x0000309b) + <b>PRESENTATION</b> +Les options sont modifiables dnas l'onglet Scenario Configuration : +Scripts path = dossier des scripts et des fichiers de configuration (normalement, il n'est pas nécessaire de changer cela si vous conservez la hiérarchie) +EEG File 1/2 = Lien vers les fichiers à concaténer +Paramètres évidents = évidents..... + +Format de fichier pour les signaux enregistrés : {XP Name}_{Subject ID}_S{Session}__acquisition_concatfile-[{date}-{time}] + + + (0x473d9a43, 0x97fc0a97) + 1056 + + + (0x7234b86b, 0x2b8651a5) + 96 + + + + + + + (0x00005b71, 0x00002711) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/4-train-CSP.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/4-train-CSP.xml new file mode 100644 index 0000000..5fad177 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/4-train-CSP.xml @@ -0,0 +1,2253 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x003874e6, 0x80815878) + (0x79a9edeb, 0x245d83fc) + Scripts Path + ${Player_ScenarioDirectory}/scripts + ${Player_ScenarioDirectory}/scripts + + + (0x00528432, 0x6820e824) + (0x330306dd, 0x74a95f98) + Training EEG File + ${Player_ScenarioDirectory}/signals/training.ov + ${Player_ScenarioDirectory}/signals/training.ov + + + (0x3f182df9, 0x22c4c9c0) + (0x79a9edeb, 0x245d83fc) + XP Name + XP + XP + + + (0xe14caa24, 0xdc225d56) + (0x79a9edeb, 0x245d83fc) + Subject ID + C1 + C1 + + + (0x61bf58c5, 0x162b5621) + (0x007deef9, 0x2f3e95c6) + Session + 1 + 1 + + + (0xf52b5245, 0x1cff173c) + (0x79a9edeb, 0x245d83fc) + File Suffix + $var{XP Name}_$var{Subject ID}_S$var{Session} + $var{XP Name}_$var{Subject ID}_S$var{Session} + + + (0x6baa1bbc, 0x80852e64) + (0x512a166f, 0x5c3ef83f) + Epoch Duration + 4 + 4 + + + (0xb7d4e27f, 0x5a0d2f94) + (0x512a166f, 0x5c3ef83f) + Epoch Offset + 0.5 + 0.5 + + + (0x77d47dd5, 0x3736b2a0) + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_GDF_Left + OVTK_GDF_Left + + + (0xbf018158, 0x66397f0e) + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_GDF_Right + OVTK_GDF_Right + + + (0x22f7947b, 0xb56feede) + (0x007deef9, 0x2f3e95c6) + Filter Dimension + 4 + 4 + + + + + + + (0x00001832, 0x00003bd0) + Stimulation Validator + (0x393d15e9, 0x5b6f63b9) + + + (0x6f752dd0, 0x082a321e) + Input + + + + + (0x6f752dd0, 0x082a321e) + Output + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to count + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0x007deef9, 0x2f3e95c6) + Number for validation + 2 + 9 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x25910892, 0x4228395c) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002ea1, 0x00000937) + Stimulation multiplexer + (0x07db4efa, 0x472b0938) + + + (0x6f752dd0, 0x082a321e) + Input stimulations 1 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 2 + + + + + (0x6f752dd0, 0x082a321e) + Multiplexed stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + -272 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x4e7b798a, 0x183beafb) + (0xe7af82cd, 0x14edb4d4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003f1d, 0x00004f1f) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0xd1dad070, 0x54230aee) + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0xadfbffe2, 0x4fc0e0b5) + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -192 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004b94, 0x0000096b) + 4-8 + (0xfe420cb6, 0x5f2ba4c3) + + + (0xe02590b0, 0x52f82985) + (0x5ba36127, 0x195feae1) + Input Signal + + + (0x9493bcb8, 0xd8d4848f) + (0x6f752dd0, 0x082a321e) + Input Stimulations + + + + + (0xd3d905f7, 0x2b88c1ac) + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x53e968eb, 0x121c769a) + (0x512a166f, 0x5c3ef83f) + Low Cut Frequency + 5 + 4 + false + + + (0x8cad39ce, 0xdbca80d0) + (0x512a166f, 0x5c3ef83f) + High Cut Frequency + 35 + 8 + false + + + (0x454af4a9, 0x3e55e77a) + (0x512a166f, 0x5c3ef83f) + Epoch Duration + 4 + $var{Epoch Duration} + false + + + (0xbb21ad6d, 0xda6c49a5) + (0x512a166f, 0x5c3ef83f) + Epoch Offset + 0.5 + $var{Epoch Offset} + false + + + (0xc956238b, 0xf31b7a91) + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_GDF_Left + $var{Class 1} + false + + + (0xe28ee4db, 0xb8abaac1) + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_GDF_Right + $var{Class 2} + false + + + (0x5b25c57b, 0xbcf2329e) + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x4c8b6ef1, 0xf834b8a0) + (0x330306dd, 0x74a95f98) + Spatial Filter Configuration + ${Player_ScenarioDirectory}/scripts/csp-spatial-filter.xml + $var{Scripts Path}/fbcsp-spatial-filter-4_8-$var{File Suffix}.xml + false + + + (0x2ad32f66, 0xd86a0623) + (0x007deef9, 0x2f3e95c6) + Filter Dimension + 6 + $var{Filter Dimension} + false + + + + + (0x198dd621, 0xab7f153f) + (0x18bc5b7e, 0xe8b6d7da) + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 272 + + + (0x4e7b798a, 0x183beafb) + (0x05a13f95, 0xdfdc0e8f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004b94, 0x0000096c) + 8-12 + (0xfe420cb6, 0x5f2ba4c3) + + + (0xe02590b0, 0x52f82985) + (0x5ba36127, 0x195feae1) + Input Signal + + + (0x9493bcb8, 0xd8d4848f) + (0x6f752dd0, 0x082a321e) + Input Stimulations + + + + + (0xd3d905f7, 0x2b88c1ac) + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x53e968eb, 0x121c769a) + (0x512a166f, 0x5c3ef83f) + Low Cut Frequency + 5 + 8 + false + + + (0x8cad39ce, 0xdbca80d0) + (0x512a166f, 0x5c3ef83f) + High Cut Frequency + 35 + 12 + false + + + (0x454af4a9, 0x3e55e77a) + (0x512a166f, 0x5c3ef83f) + Epoch Duration + 4 + $var{Epoch Duration} + false + + + (0xbb21ad6d, 0xda6c49a5) + (0x512a166f, 0x5c3ef83f) + Epoch Offset + 0.5 + $var{Epoch Offset} + false + + + (0xc956238b, 0xf31b7a91) + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_GDF_Left + $var{Class 1} + false + + + (0xe28ee4db, 0xb8abaac1) + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_GDF_Right + $var{Class 2} + false + + + (0x5b25c57b, 0xbcf2329e) + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x4c8b6ef1, 0xf834b8a0) + (0x330306dd, 0x74a95f98) + Spatial Filter Configuration + ${Player_ScenarioDirectory}/scripts/csp-spatial-filter.xml + $var{Scripts Path}/fbcsp-spatial-filter-8_12-$var{File Suffix}.xml + false + + + (0x2ad32f66, 0xd86a0623) + (0x007deef9, 0x2f3e95c6) + Filter Dimension + 6 + $var{Filter Dimension} + false + + + + + (0x198dd621, 0xab7f153f) + (0x18bc5b7e, 0xe8b6d7da) + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0x05a13f95, 0xdfdc0e8f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004b94, 0x0000096d) + 12-16 + (0xfe420cb6, 0x5f2ba4c3) + + + (0xe02590b0, 0x52f82985) + (0x5ba36127, 0x195feae1) + Input Signal + + + (0x9493bcb8, 0xd8d4848f) + (0x6f752dd0, 0x082a321e) + Input Stimulations + + + + + (0xd3d905f7, 0x2b88c1ac) + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x53e968eb, 0x121c769a) + (0x512a166f, 0x5c3ef83f) + Low Cut Frequency + 5 + 12 + false + + + (0x8cad39ce, 0xdbca80d0) + (0x512a166f, 0x5c3ef83f) + High Cut Frequency + 35 + 16 + false + + + (0x454af4a9, 0x3e55e77a) + (0x512a166f, 0x5c3ef83f) + Epoch Duration + 4 + $var{Epoch Duration} + false + + + (0xbb21ad6d, 0xda6c49a5) + (0x512a166f, 0x5c3ef83f) + Epoch Offset + 0.5 + $var{Epoch Offset} + false + + + (0xc956238b, 0xf31b7a91) + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_GDF_Left + $var{Class 1} + false + + + (0xe28ee4db, 0xb8abaac1) + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_GDF_Right + $var{Class 2} + false + + + (0x5b25c57b, 0xbcf2329e) + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x4c8b6ef1, 0xf834b8a0) + (0x330306dd, 0x74a95f98) + Spatial Filter Configuration + ${Player_ScenarioDirectory}/scripts/csp-spatial-filter.xml + $var{Scripts Path}/fbcsp-spatial-filter-12_16-$var{File Suffix}.xml + false + + + (0x2ad32f66, 0xd86a0623) + (0x007deef9, 0x2f3e95c6) + Filter Dimension + 6 + $var{Filter Dimension} + false + + + + + (0x198dd621, 0xab7f153f) + (0x18bc5b7e, 0xe8b6d7da) + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x4e7b798a, 0x183beafb) + (0x05a13f95, 0xdfdc0e8f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004b94, 0x0000096e) + 16-20 + (0xfe420cb6, 0x5f2ba4c3) + + + (0xe02590b0, 0x52f82985) + (0x5ba36127, 0x195feae1) + Input Signal + + + (0x9493bcb8, 0xd8d4848f) + (0x6f752dd0, 0x082a321e) + Input Stimulations + + + + + (0xd3d905f7, 0x2b88c1ac) + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x53e968eb, 0x121c769a) + (0x512a166f, 0x5c3ef83f) + Low Cut Frequency + 5 + 16 + false + + + (0x8cad39ce, 0xdbca80d0) + (0x512a166f, 0x5c3ef83f) + High Cut Frequency + 35 + 20 + false + + + (0x454af4a9, 0x3e55e77a) + (0x512a166f, 0x5c3ef83f) + Epoch Duration + 4 + $var{Epoch Duration} + false + + + (0xbb21ad6d, 0xda6c49a5) + (0x512a166f, 0x5c3ef83f) + Epoch Offset + 0.5 + $var{Epoch Offset} + false + + + (0xc956238b, 0xf31b7a91) + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_GDF_Left + $var{Class 1} + false + + + (0xe28ee4db, 0xb8abaac1) + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_GDF_Right + $var{Class 2} + false + + + (0x5b25c57b, 0xbcf2329e) + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x4c8b6ef1, 0xf834b8a0) + (0x330306dd, 0x74a95f98) + Spatial Filter Configuration + ${Player_ScenarioDirectory}/scripts/csp-spatial-filter.xml + $var{Scripts Path}/fbcsp-spatial-filter-16_20-$var{File Suffix}.xml + false + + + (0x2ad32f66, 0xd86a0623) + (0x007deef9, 0x2f3e95c6) + Filter Dimension + 6 + $var{Filter Dimension} + false + + + + + (0x198dd621, 0xab7f153f) + (0x18bc5b7e, 0xe8b6d7da) + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x4e7b798a, 0x183beafb) + (0x05a13f95, 0xdfdc0e8f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004b94, 0x0000096f) + 20-24 + (0xfe420cb6, 0x5f2ba4c3) + + + (0xe02590b0, 0x52f82985) + (0x5ba36127, 0x195feae1) + Input Signal + + + (0x9493bcb8, 0xd8d4848f) + (0x6f752dd0, 0x082a321e) + Input Stimulations + + + + + (0xd3d905f7, 0x2b88c1ac) + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x53e968eb, 0x121c769a) + (0x512a166f, 0x5c3ef83f) + Low Cut Frequency + 5 + 20 + false + + + (0x8cad39ce, 0xdbca80d0) + (0x512a166f, 0x5c3ef83f) + High Cut Frequency + 35 + 24 + false + + + (0x454af4a9, 0x3e55e77a) + (0x512a166f, 0x5c3ef83f) + Epoch Duration + 4 + $var{Epoch Duration} + false + + + (0xbb21ad6d, 0xda6c49a5) + (0x512a166f, 0x5c3ef83f) + Epoch Offset + 0.5 + $var{Epoch Offset} + false + + + (0xc956238b, 0xf31b7a91) + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_GDF_Left + $var{Class 1} + false + + + (0xe28ee4db, 0xb8abaac1) + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_GDF_Right + $var{Class 2} + false + + + (0x5b25c57b, 0xbcf2329e) + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x4c8b6ef1, 0xf834b8a0) + (0x330306dd, 0x74a95f98) + Spatial Filter Configuration + ${Player_ScenarioDirectory}/scripts/csp-spatial-filter.xml + $var{Scripts Path}/fbcsp-spatial-filter-20_24-$var{File Suffix}.xml + false + + + (0x2ad32f66, 0xd86a0623) + (0x007deef9, 0x2f3e95c6) + Filter Dimension + 6 + $var{Filter Dimension} + false + + + + + (0x198dd621, 0xab7f153f) + (0x18bc5b7e, 0xe8b6d7da) + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x05a13f95, 0xdfdc0e8f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004b94, 0x00000970) + 24-28 + (0xfe420cb6, 0x5f2ba4c3) + + + (0xe02590b0, 0x52f82985) + (0x5ba36127, 0x195feae1) + Input Signal + + + (0x9493bcb8, 0xd8d4848f) + (0x6f752dd0, 0x082a321e) + Input Stimulations + + + + + (0xd3d905f7, 0x2b88c1ac) + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x53e968eb, 0x121c769a) + (0x512a166f, 0x5c3ef83f) + Low Cut Frequency + 5 + 24 + false + + + (0x8cad39ce, 0xdbca80d0) + (0x512a166f, 0x5c3ef83f) + High Cut Frequency + 35 + 28 + false + + + (0x454af4a9, 0x3e55e77a) + (0x512a166f, 0x5c3ef83f) + Epoch Duration + 4 + $var{Epoch Duration} + false + + + (0xbb21ad6d, 0xda6c49a5) + (0x512a166f, 0x5c3ef83f) + Epoch Offset + 0.5 + $var{Epoch Offset} + false + + + (0xc956238b, 0xf31b7a91) + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_GDF_Left + $var{Class 1} + false + + + (0xe28ee4db, 0xb8abaac1) + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_GDF_Right + $var{Class 2} + false + + + (0x5b25c57b, 0xbcf2329e) + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x4c8b6ef1, 0xf834b8a0) + (0x330306dd, 0x74a95f98) + Spatial Filter Configuration + ${Player_ScenarioDirectory}/scripts/csp-spatial-filter.xml + $var{Scripts Path}/fbcsp-spatial-filter-24_28-$var{File Suffix}.xml + false + + + (0x2ad32f66, 0xd86a0623) + (0x007deef9, 0x2f3e95c6) + Filter Dimension + 6 + $var{Filter Dimension} + false + + + + + (0x198dd621, 0xab7f153f) + (0x18bc5b7e, 0xe8b6d7da) + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 1152 + + + (0x4e7b798a, 0x183beafb) + (0x05a13f95, 0xdfdc0e8f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004b94, 0x00000971) + 28-32 + (0xfe420cb6, 0x5f2ba4c3) + + + (0xe02590b0, 0x52f82985) + (0x5ba36127, 0x195feae1) + Input Signal + + + (0x9493bcb8, 0xd8d4848f) + (0x6f752dd0, 0x082a321e) + Input Stimulations + + + + + (0xd3d905f7, 0x2b88c1ac) + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x53e968eb, 0x121c769a) + (0x512a166f, 0x5c3ef83f) + Low Cut Frequency + 5 + 28 + false + + + (0x8cad39ce, 0xdbca80d0) + (0x512a166f, 0x5c3ef83f) + High Cut Frequency + 35 + 32 + false + + + (0x454af4a9, 0x3e55e77a) + (0x512a166f, 0x5c3ef83f) + Epoch Duration + 4 + $var{Epoch Duration} + false + + + (0xbb21ad6d, 0xda6c49a5) + (0x512a166f, 0x5c3ef83f) + Epoch Offset + 0.5 + $var{Epoch Offset} + false + + + (0xc956238b, 0xf31b7a91) + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_GDF_Left + $var{Class 1} + false + + + (0xe28ee4db, 0xb8abaac1) + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_GDF_Right + $var{Class 2} + false + + + (0x5b25c57b, 0xbcf2329e) + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x4c8b6ef1, 0xf834b8a0) + (0x330306dd, 0x74a95f98) + Spatial Filter Configuration + ${Player_ScenarioDirectory}/scripts/csp-spatial-filter.xml + $var{Scripts Path}/fbcsp-spatial-filter-28_32-$var{File Suffix}.xml + false + + + (0x2ad32f66, 0xd86a0623) + (0x007deef9, 0x2f3e95c6) + Filter Dimension + 6 + $var{Filter Dimension} + false + + + + + (0x198dd621, 0xab7f153f) + (0x18bc5b7e, 0xe8b6d7da) + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 1328 + + + (0x4e7b798a, 0x183beafb) + (0x05a13f95, 0xdfdc0e8f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004b94, 0x00000972) + 32-36 + (0xfe420cb6, 0x5f2ba4c3) + + + (0xe02590b0, 0x52f82985) + (0x5ba36127, 0x195feae1) + Input Signal + + + (0x9493bcb8, 0xd8d4848f) + (0x6f752dd0, 0x082a321e) + Input Stimulations + + + + + (0xd3d905f7, 0x2b88c1ac) + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x53e968eb, 0x121c769a) + (0x512a166f, 0x5c3ef83f) + Low Cut Frequency + 5 + 32 + false + + + (0x8cad39ce, 0xdbca80d0) + (0x512a166f, 0x5c3ef83f) + High Cut Frequency + 35 + 36 + false + + + (0x454af4a9, 0x3e55e77a) + (0x512a166f, 0x5c3ef83f) + Epoch Duration + 4 + $var{Epoch Duration} + false + + + (0xbb21ad6d, 0xda6c49a5) + (0x512a166f, 0x5c3ef83f) + Epoch Offset + 0.5 + $var{Epoch Offset} + false + + + (0xc956238b, 0xf31b7a91) + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_GDF_Left + $var{Class 1} + false + + + (0xe28ee4db, 0xb8abaac1) + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_GDF_Right + $var{Class 2} + false + + + (0x5b25c57b, 0xbcf2329e) + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_StimulationId_Train + $var{Class 2} + false + + + (0x4c8b6ef1, 0xf834b8a0) + (0x330306dd, 0x74a95f98) + Spatial Filter Configuration + ${Player_ScenarioDirectory}/scripts/csp-spatial-filter.xml + $var{Scripts Path}/fbcsp-spatial-filter-32_36-$var{File Suffix}.xml + false + + + (0x2ad32f66, 0xd86a0623) + (0x007deef9, 0x2f3e95c6) + Filter Dimension + 6 + $var{Filter Dimension} + false + + + + + (0x198dd621, 0xab7f153f) + (0x18bc5b7e, 0xe8b6d7da) + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 1504 + + + (0x4e7b798a, 0x183beafb) + (0x05a13f95, 0xdfdc0e8f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004b94, 0x00000973) + 36-40 + (0xfe420cb6, 0x5f2ba4c3) + + + (0xe02590b0, 0x52f82985) + (0x5ba36127, 0x195feae1) + Input Signal + + + (0x9493bcb8, 0xd8d4848f) + (0x6f752dd0, 0x082a321e) + Input Stimulations + + + + + (0xd3d905f7, 0x2b88c1ac) + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x53e968eb, 0x121c769a) + (0x512a166f, 0x5c3ef83f) + Low Cut Frequency + 5 + 36 + false + + + (0x8cad39ce, 0xdbca80d0) + (0x512a166f, 0x5c3ef83f) + High Cut Frequency + 35 + 40 + false + + + (0x454af4a9, 0x3e55e77a) + (0x512a166f, 0x5c3ef83f) + Epoch Duration + 4 + $var{Epoch Duration} + false + + + (0xbb21ad6d, 0xda6c49a5) + (0x512a166f, 0x5c3ef83f) + Epoch Offset + 0.5 + $var{Epoch Offset} + false + + + (0xc956238b, 0xf31b7a91) + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_GDF_Left + $var{Class 1} + false + + + (0xe28ee4db, 0xb8abaac1) + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_GDF_Right + $var{Class 2} + false + + + (0x5b25c57b, 0xbcf2329e) + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x4c8b6ef1, 0xf834b8a0) + (0x330306dd, 0x74a95f98) + Spatial Filter Configuration + ${Player_ScenarioDirectory}/scripts/csp-spatial-filter.xml + $var{Scripts Path}/fbcsp-spatial-filter-36_40-$var{File Suffix}.xml + false + + + (0x2ad32f66, 0xd86a0623) + (0x007deef9, 0x2f3e95c6) + Filter Dimension + 6 + $var{Filter Dimension} + false + + + + + (0x198dd621, 0xab7f153f) + (0x18bc5b7e, 0xe8b6d7da) + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 1680 + + + (0x4e7b798a, 0x183beafb) + (0x05a13f95, 0xdfdc0e8f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000055dc, 0x0000109e) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Training EEG File} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004a76ae) + + + + + (0x00005658, 0x0000687f) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 10 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Train + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x207c9054, 0x3c841b63) + 1184 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000631e, 0x000035e1) + Stimulation multiplexer + (0x07db4efa, 0x472b0938) + + + (0x6f752dd0, 0x082a321e) + Input stimulations 1 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 2 + + + (0xf97fb558, 0xcb8cb2f0) + (0x6f752dd0, 0x082a321e) + Input stimulations 3 + + + (0x0cb774a4, 0x34a91423) + (0x6f752dd0, 0x082a321e) + Input stimulations 4 + + + (0x3a5ac3e0, 0x3e122451) + (0x6f752dd0, 0x082a321e) + Input stimulations 5 + + + (0x446938d4, 0xef0d4ea9) + (0x6f752dd0, 0x082a321e) + Input stimulations 6 + + + (0x0650cfc1, 0x1c7185b7) + (0x6f752dd0, 0x082a321e) + Input stimulations 7 + + + (0x34412e99, 0x64ea9b76) + (0x6f752dd0, 0x082a321e) + Input stimulations 8 + + + (0xd482e0b5, 0xef964582) + (0x6f752dd0, 0x082a321e) + Input stimulations 9 + + + + + (0x6f752dd0, 0x082a321e) + Multiplexed stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0xe7af82cd, 0x14edb4d4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000065a7, 0x00000786) + !EOG1;EOG2;EOG3;EMGg;EMGd + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + EOG1;EOG2;EOG3;EMGg;EMGd + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Reject + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -272 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00128288) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000743e, 0x000010d2) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0006cd1c) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000000ac, 0x00005ac1) + + (0x00003f1d, 0x00004f1f) + (0xadfbffe2, 0x4fc0e0b5) + + + (0x00004b94, 0x0000096e) + (0x9493bcb8, 0xd8d4848f) + + + + (0x000009c0, 0x00002e9b) + + (0x00004b94, 0x0000096f) + (0xd3d905f7, 0x2b88c1ac) + + + (0x0000631e, 0x000035e1) + (0x3a5ac3e0, 0x3e122451) + + + + (0x00000bf8, 0x000069d5) + + (0x00003f1d, 0x00004f1f) + (0xadfbffe2, 0x4fc0e0b5) + + + (0x00004b94, 0x00000970) + (0x9493bcb8, 0xd8d4848f) + + + + (0x0000136c, 0x00006bc6) + + (0x00003f1d, 0x00004f1f) + (0xadfbffe2, 0x4fc0e0b5) + + + (0x00004b94, 0x0000096c) + (0x9493bcb8, 0xd8d4848f) + + + + (0x000013ea, 0x00005c61) + + (0x0000631e, 0x000035e1) + 0 + + + (0x00001832, 0x00003bd0) + 0 + + + + (0x00001a0f, 0x00004ea2) + + (0x00002ea1, 0x00000937) + 0 + + + (0x00003f1d, 0x00004f1f) + (0xd1dad070, 0x54230aee) + + + + (0x00001efb, 0x00005b45) + + (0x00003f1d, 0x00004f1f) + 0 + + + (0x00004b94, 0x0000096b) + (0xe02590b0, 0x52f82985) + + + + (0x0000229a, 0x00002fda) + + (0x00003f1d, 0x00004f1f) + (0xadfbffe2, 0x4fc0e0b5) + + + (0x00004b94, 0x0000096b) + (0x9493bcb8, 0xd8d4848f) + + + + (0x00002304, 0x0000724c) + + (0x00003f1d, 0x00004f1f) + 0 + + + (0x00004b94, 0x0000096d) + (0xe02590b0, 0x52f82985) + + + + (0x000023aa, 0x00003549) + + (0x00003f1d, 0x00004f1f) + 0 + + + (0x00004b94, 0x0000096f) + (0xe02590b0, 0x52f82985) + + + + (0x00002c0d, 0x000014fc) + + (0x00003f1d, 0x00004f1f) + 0 + + + (0x00004b94, 0x00000972) + (0xe02590b0, 0x52f82985) + + + + (0x00002fd9, 0x0000088a) + + (0x00003f1d, 0x00004f1f) + (0xadfbffe2, 0x4fc0e0b5) + + + (0x00004b94, 0x00000973) + (0x9493bcb8, 0xd8d4848f) + + + + (0x0000327a, 0x00001665) + + (0x00004b94, 0x00000972) + (0xd3d905f7, 0x2b88c1ac) + + + (0x0000631e, 0x000035e1) + (0x34412e99, 0x64ea9b76) + + + + (0x000033c3, 0x00000e68) + + (0x00004b94, 0x00000970) + (0xd3d905f7, 0x2b88c1ac) + + + (0x0000631e, 0x000035e1) + (0x446938d4, 0xef0d4ea9) + + + + (0x00004263, 0x00001735) + + (0x00003f1d, 0x00004f1f) + (0xadfbffe2, 0x4fc0e0b5) + + + (0x00004b94, 0x0000096d) + (0x9493bcb8, 0xd8d4848f) + + + + (0x00004360, 0x00000512) + + (0x000055dc, 0x0000109e) + 1 + + + (0x00005658, 0x0000687f) + 0 + + + + (0x000043bd, 0x00006dbc) + + (0x00005658, 0x0000687f) + 0 + + + (0x00002ea1, 0x00000937) + 1 + + + + (0x0000485d, 0x000008a7) + + (0x00003f1d, 0x00004f1f) + (0xadfbffe2, 0x4fc0e0b5) + + + (0x00004b94, 0x0000096f) + (0x9493bcb8, 0xd8d4848f) + + + + (0x00004bb4, 0x00007782) + + (0x00004b94, 0x0000096d) + (0xd3d905f7, 0x2b88c1ac) + + + (0x0000631e, 0x000035e1) + (0xf97fb558, 0xcb8cb2f0) + + + + (0x00004f04, 0x00001a9b) + + (0x00003f1d, 0x00004f1f) + 0 + + + (0x00004b94, 0x0000096e) + (0xe02590b0, 0x52f82985) + + + + (0x0000505a, 0x00007fda) + + (0x000065a7, 0x00000786) + 0 + + + (0x00003f1d, 0x00004f1f) + 0 + + + + (0x0000528a, 0x00006d00) + + (0x00004b94, 0x00000971) + (0xd3d905f7, 0x2b88c1ac) + + + (0x0000631e, 0x000035e1) + (0x0650cfc1, 0x1c7185b7) + + + + (0x000054c7, 0x00005d06) + + (0x00004b94, 0x0000096e) + (0xd3d905f7, 0x2b88c1ac) + + + (0x0000631e, 0x000035e1) + (0x0cb774a4, 0x34a91423) + + + + (0x00005c10, 0x000038fa) + + (0x00003f1d, 0x00004f1f) + (0xadfbffe2, 0x4fc0e0b5) + + + (0x00004b94, 0x00000972) + (0x9493bcb8, 0xd8d4848f) + + + + (0x00005e82, 0x00006248) + + (0x00003f1d, 0x00004f1f) + 0 + + + (0x00004b94, 0x00000970) + (0xe02590b0, 0x52f82985) + + + + (0x00006431, 0x00007567) + + (0x00004b94, 0x0000096c) + (0xd3d905f7, 0x2b88c1ac) + + + (0x0000631e, 0x000035e1) + 1 + + + + (0x000064d1, 0x00000301) + + (0x00003f1d, 0x00004f1f) + 0 + + + (0x00004b94, 0x00000973) + (0xe02590b0, 0x52f82985) + + + + (0x00006760, 0x00004cc1) + + (0x00003f1d, 0x00004f1f) + 0 + + + (0x00004b94, 0x0000096c) + (0xe02590b0, 0x52f82985) + + + + (0x00006894, 0x000022df) + + (0x00004b94, 0x00000973) + (0xd3d905f7, 0x2b88c1ac) + + + (0x0000631e, 0x000035e1) + (0xd482e0b5, 0xef964582) + + + + (0x00006a21, 0x00004a24) + + (0x00003f1d, 0x00004f1f) + 0 + + + (0x00004b94, 0x00000971) + (0xe02590b0, 0x52f82985) + + + + (0x00006c69, 0x00003ad2) + + (0x000055dc, 0x0000109e) + 1 + + + (0x000065a7, 0x00000786) + 0 + + + + (0x00006e7b, 0x000049d6) + + (0x000055dc, 0x0000109e) + 2 + + + (0x00002ea1, 0x00000937) + 0 + + + + (0x000073a0, 0x00000162) + + (0x00004b94, 0x0000096b) + (0xd3d905f7, 0x2b88c1ac) + + + (0x0000631e, 0x000035e1) + 0 + + + + (0x00007ead, 0x00006af9) + + (0x00001832, 0x00003bd0) + 0 + + + (0x0000743e, 0x000010d2) + 0 + + + + (0x00007f97, 0x000012ac) + + (0x00003f1d, 0x00004f1f) + (0xadfbffe2, 0x4fc0e0b5) + + + (0x00004b94, 0x00000971) + (0x9493bcb8, 0xd8d4848f) + + + + + + (0x0000494c, 0x00003564) + This Scenario is set for a g.tec cap with 2 amplifier g.USBamp + + + (0x473d9a43, 0x97fc0a97) + 1504 + + + (0x7234b86b, 0x2b8651a5) + 128 + + + + + (0x00006a47, 0x0000309c) + <b>OVERVIEW</b> +Change Settings on Scenario Configuration tab : +Scripts path = folder to the scripts and config files (normally don't need to change that that if you keep the hierarchy) +Training EEG File = link to the file for training (previous concatenate file) + + + (0x473d9a43, 0x97fc0a97) + 1488 + + + (0x7234b86b, 0x2b8651a5) + 208 + + + + + (0x00006a47, 0x0000309d) + <b>PRESENTATION</b> +Les options sont modifiables dnas l'onglet Scenario Configuration : +Scripts path = dossier des scripts et des fichiers de configuration (normalement, il n'est pas nécessaire de changer cela si vous conservez la hiérarchie) +Training EEG File = lien vers le fichier d'entrainement (le fichier concaténé précédemment) + + + (0x473d9a43, 0x97fc0a97) + 1488 + + + (0x7234b86b, 0x2b8651a5) + 304 + + + + + (0x00007b10, 0x000005f7) + Add Timeout If no train stimulation comes + + + (0x473d9a43, 0x97fc0a97) + 1360 + + + (0x7234b86b, 0x2b8651a5) + -336 + + + + + + + (0x000030a2, 0x00002768) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x4c90d4ad, 0x7a2554ec) + 400 + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x7b814cca, 0x271df6dd) + 400 + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/5-train-mRMR.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/5-train-mRMR.xml new file mode 100644 index 0000000..e37fb3b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/5-train-mRMR.xml @@ -0,0 +1,3598 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x003874e6, 0x80815878) + (0x79a9edeb, 0x245d83fc) + Scripts Path + ${Player_ScenarioDirectory}/scripts + ${Player_ScenarioDirectory}/scripts + + + (0x00528432, 0x6820e824) + (0x330306dd, 0x74a95f98) + Training EEG File + ${Player_ScenarioDirectory}/signals/training.ov + ${Player_ScenarioDirectory}/signals/training.ov + + + (0x3f182df9, 0x22c4c9c0) + (0x79a9edeb, 0x245d83fc) + XP Name + XP + XP + + + (0xe14caa24, 0xdc225d56) + (0x79a9edeb, 0x245d83fc) + Subject ID + C1 + C1 + + + (0x61bf58c5, 0x162b5621) + (0x007deef9, 0x2f3e95c6) + Session + 1 + 1 + + + (0xf52b5245, 0x1cff173c) + (0x79a9edeb, 0x245d83fc) + File Suffix + $var{XP Name}_$var{Subject ID}_S$var{Session} + $var{XP Name}_$var{Subject ID}_S$var{Session} + + + (0x6327c3e6, 0x2fb9a2b2) + (0x512a166f, 0x5c3ef83f) + Trial Duration + 4 + 4 + + + (0x0a52a1c7, 0x604cc807) + (0x512a166f, 0x5c3ef83f) + Trial Offset + 0.5 + 0.5 + + + (0x6baa1bbc, 0x80852e64) + (0x512a166f, 0x5c3ef83f) + Epoch Duration + 4 + 1 + + + (0xb7d4e27f, 0x5a0d2f94) + (0x512a166f, 0x5c3ef83f) + Epoch Offset + 0.5 + 0.062500 + + + (0x77d47dd5, 0x3736b2a0) + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_GDF_Left + OVTK_GDF_Left + + + (0xbf018158, 0x66397f0e) + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_GDF_Right + OVTK_GDF_Right + + + (0xf2b0890f, 0x0ff17863) + (0x007deef9, 0x2f3e95c6) + Number of Features to select + 4 + 4 + + + + + + + (0x00001449, 0x00001173) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001449, 0x00001174) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000016ca, 0x00003754) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002baa, 0x0000677c) + Features Selection Trainer + (0xee36249f, 0x22a32e6e) + + + (0x6f752dd0, 0x082a321e) + Train-Start Flag + + + (0x17341935, 0x152ff448) + Class 1 + + + (0x17341935, 0x152ff448) + Class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-Completed Flag + + + + + (0xa88b3667, 0x0871638c) + Log Level + Information + Information + false + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save Feature Selection + ${Player_ScenarioDirectory}/my-classifier.xml + $var{Scripts Path}/features-selected-$var{File Suffix}.xml + false + + + (0x5261636b, 0x46534d45) + Method + mRMR (minimum Redundancy Maximum Relevance) + mRMR (minimum Redundancy Maximum Relevance) + false + + + (0x007deef9, 0x2f3e95c6) + Number of features to select + 2 + $var{Number of Features to select} + false + + + (0x2cdb2f0b, 0x12f231ea) + Discretisation + true + true + false + + + (0x512a166f, 0x5c3ef83f) + Threshold + 0.0 + 0.0 + false + + + (0x5261636b, 0x6d524d52) + mRMR Method + MID + MID + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0xd7b82a3a, 0x7e084998) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 8 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002ea1, 0x00000937) + Stimulation multiplexer + (0x07db4efa, 0x472b0938) + + + (0x6f752dd0, 0x082a321e) + Input stimulations 1 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 2 + + + + + (0x6f752dd0, 0x082a321e) + Multiplexed stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + -272 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0xe7af82cd, 0x14edb4d4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000055dc, 0x0000109e) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Training EEG File} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004a76ae) + + + + + (0x00005658, 0x0000687f) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 10 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Train + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006266, 0x00000e24) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + (0xf031835f, 0xfd499f54) + (0x5ba36127, 0x195feae1) + Input 3 + + + (0xd872563e, 0xc482f033) + (0x5ba36127, 0x195feae1) + Input 4 + + + (0xc48b247a, 0xbd3518e7) + (0x5ba36127, 0x195feae1) + Input 5 + + + (0x5f7bcc3c, 0xe39a6eb0) + (0x5ba36127, 0x195feae1) + Input 6 + + + (0xb830b8b1, 0xa74de4f5) + (0x5ba36127, 0x195feae1) + Input 7 + + + (0xfa16eb48, 0x996f530e) + (0x5ba36127, 0x195feae1) + Input 8 + + + (0xeb82c0f0, 0x3795f13e) + (0x5ba36127, 0x195feae1) + Input 9 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000065a7, 0x00000786) + !EOG1;EOG2;EOG3;EMGg;EMGd + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + EOG1;EOG2;EOG3;EMGg;EMGd + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Reject + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -272 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00128288) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007442, 0x00001fd0) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007442, 0x00001fd1) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00c4af19, 0x360e4025) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004da903) + + + + + (0x00c4af19, 0x360e4026) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004da903) + + + + + (0x024f66fc, 0x20e58fa8) + Trials C1 + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + $var{Trial Duration} + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + $var{Trial Offset} + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + $var{Class 1} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x038cae1a, 0x03e0da64) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-4_8-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da65) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-8_12-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da66) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-12_16-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da67) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-16_20-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da68) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-20_24-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da69) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 1072 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-24_28-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da6a) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-28_32-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da6b) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-32_36-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da6c) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 1360 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-36_40-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x14e0f923, 0x0df1c5d6) + log(1+x) + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x14e0f923, 0x0df1c5d7) + log(1+x) + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3840709a, 0x3442f13a) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + $var{Epoch Duration} + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + $var{Epoch Offset} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006bdf4b) + + + + + (0x3840709a, 0x3442f13b) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + $var{Epoch Duration} + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + $var{Epoch Offset} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006bdf4b) + + + + + (0x38f7f16e, 0x716e5783) + 4-8 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5784) + 8-12 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5785) + 12-16 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 12 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 16 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5786) + 16-20 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 16 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5787) + 20-24 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5788) + 24-28 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 24 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 28 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 1072 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5789) + 28-32 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 28 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 32 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e578a) + 32-36 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 32 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 36 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e578b) + 36-40 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 36 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 40 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 1360 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4bfa765b, 0x56988125) + Trials C2 + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + $var{Trial Duration} + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + $var{Trial Offset} + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + $var{Class 2} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x602bbc4d, 0x5f35c1a9) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x602bbc4d, 0x5f35c1aa) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000000ed, 0x00007091) + + (0x00001449, 0x00001174) + 0 + + + (0x024f66fc, 0x20e58fa8) + 1 + + + + (0x00000904, 0x0000009a) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e578b) + 0 + + + + (0x000009c7, 0x0000050c) + + (0x00002ea1, 0x00000937) + 0 + + + (0x00001449, 0x00001174) + 0 + + + + (0x00000d4c, 0x00004008) + + (0x038cae1a, 0x03e0da6a) + 0 + + + (0x00006266, 0x00000e24) + (0xb830b8b1, 0xa74de4f5) + + + + (0x0000203b, 0x000026a7) + + (0x038cae1a, 0x03e0da66) + 0 + + + (0x00006266, 0x00000e24) + (0xf031835f, 0xfd499f54) + + + + (0x00002514, 0x00006f70) + + (0x00001449, 0x00001174) + 0 + + + (0x4bfa765b, 0x56988125) + 1 + + + + (0x00002543, 0x0000104a) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5789) + 0 + + + + (0x00002baf, 0x000020aa) + + (0x00001449, 0x00001174) + 0 + + + (0x00001449, 0x00001173) + 0 + + + + (0x00002e4f, 0x00000908) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e578a) + 0 + + + + (0x00003305, 0x000054bf) + + (0x00007442, 0x00001fd0) + 0 + + + (0x00002baa, 0x0000677c) + 1 + + + + (0x000033a2, 0x000005ce) + + (0x4bfa765b, 0x56988125) + 0 + + + (0x3840709a, 0x3442f13b) + 0 + + + + (0x00003e8e, 0x000039f0) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5786) + 0 + + + + (0x00004053, 0x00002a55) + + (0x038cae1a, 0x03e0da67) + 0 + + + (0x00006266, 0x00000e24) + (0xd872563e, 0xc482f033) + + + + (0x00004360, 0x00000512) + + (0x000055dc, 0x0000109e) + 1 + + + (0x00005658, 0x0000687f) + 0 + + + + (0x000043bd, 0x00006dbc) + + (0x00005658, 0x0000687f) + 0 + + + (0x00002ea1, 0x00000937) + 1 + + + + (0x00004403, 0x000073dc) + + (0x00007442, 0x00001fd1) + 0 + + + (0x00002baa, 0x0000677c) + 2 + + + + (0x000045bc, 0x00001b41) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5787) + 0 + + + + (0x000046d8, 0x00004027) + + (0x38f7f16e, 0x716e5783) + 0 + + + (0x038cae1a, 0x03e0da64) + 0 + + + + (0x000046d8, 0x00004028) + + (0x38f7f16e, 0x716e5784) + 0 + + + (0x038cae1a, 0x03e0da65) + 0 + + + + (0x000046d8, 0x00004029) + + (0x38f7f16e, 0x716e5785) + 0 + + + (0x038cae1a, 0x03e0da66) + 0 + + + + (0x000046d8, 0x0000402a) + + (0x38f7f16e, 0x716e5786) + 0 + + + (0x038cae1a, 0x03e0da67) + 0 + + + + (0x000046d8, 0x0000402b) + + (0x38f7f16e, 0x716e5787) + 0 + + + (0x038cae1a, 0x03e0da68) + 0 + + + + (0x000046d8, 0x0000402c) + + (0x38f7f16e, 0x716e5788) + 0 + + + (0x038cae1a, 0x03e0da69) + 0 + + + + (0x000046d8, 0x0000402d) + + (0x38f7f16e, 0x716e5789) + 0 + + + (0x038cae1a, 0x03e0da6a) + 0 + + + + (0x000046d8, 0x0000402e) + + (0x38f7f16e, 0x716e578a) + 0 + + + (0x038cae1a, 0x03e0da6b) + 0 + + + + (0x000046d8, 0x0000402f) + + (0x38f7f16e, 0x716e578b) + 0 + + + (0x038cae1a, 0x03e0da6c) + 0 + + + + (0x00004ad8, 0x00000d0b) + + (0x038cae1a, 0x03e0da6b) + 0 + + + (0x00006266, 0x00000e24) + (0xfa16eb48, 0x996f530e) + + + + (0x00004baf, 0x00005141) + + (0x024f66fc, 0x20e58fa8) + 0 + + + (0x3840709a, 0x3442f13a) + 0 + + + + (0x00004fe5, 0x000074aa) + + (0x14e0f923, 0x0df1c5d6) + 0 + + + (0x00007442, 0x00001fd0) + 0 + + + + (0x00004fe5, 0x000074ab) + + (0x14e0f923, 0x0df1c5d7) + 0 + + + (0x00007442, 0x00001fd1) + 0 + + + + (0x000057c9, 0x00007f2b) + + (0x038cae1a, 0x03e0da69) + 0 + + + (0x00006266, 0x00000e24) + (0x5f7bcc3c, 0xe39a6eb0) + + + + (0x0000588a, 0x000057f4) + + (0x00002baa, 0x0000677c) + 0 + + + (0x000016ca, 0x00003754) + 0 + + + + (0x00005d45, 0x000009ac) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5784) + 0 + + + + (0x00005f4c, 0x00001389) + + (0x00006266, 0x00000e24) + 0 + + + (0x4bfa765b, 0x56988125) + 0 + + + + (0x00006048, 0x00007415) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5788) + 0 + + + + (0x00006ada, 0x00007a88) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5783) + 0 + + + + (0x00006ae7, 0x00000cf9) + + (0x00006266, 0x00000e24) + 0 + + + (0x024f66fc, 0x20e58fa8) + 0 + + + + (0x00006c69, 0x00003ad2) + + (0x000055dc, 0x0000109e) + 1 + + + (0x000065a7, 0x00000786) + 0 + + + + (0x00006d9d, 0x00000a90) + + (0x038cae1a, 0x03e0da65) + 0 + + + (0x00006266, 0x00000e24) + 1 + + + + (0x00006e7b, 0x000049d6) + + (0x000055dc, 0x0000109e) + 2 + + + (0x00002ea1, 0x00000937) + 0 + + + + (0x00007019, 0x000013ff) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5785) + 0 + + + + (0x0000759a, 0x00004a1f) + + (0x038cae1a, 0x03e0da64) + 0 + + + (0x00006266, 0x00000e24) + 0 + + + + (0x000079fc, 0x000022e3) + + (0x038cae1a, 0x03e0da68) + 0 + + + (0x00006266, 0x00000e24) + (0xc48b247a, 0xbd3518e7) + + + + (0x00007d21, 0x00003cd3) + + (0x00001449, 0x00001173) + 0 + + + (0x00002baa, 0x0000677c) + 0 + + + + (0x00007e8b, 0x00000170) + + (0x038cae1a, 0x03e0da6c) + 0 + + + (0x00006266, 0x00000e24) + (0xeb82c0f0, 0x3795f13e) + + + + (0x1ffeda13, 0x64e650ab) + + (0x00c4af19, 0x360e4025) + 0 + + + (0x14e0f923, 0x0df1c5d6) + 0 + + + + (0x1ffeda13, 0x64e650ac) + + (0x00c4af19, 0x360e4026) + 0 + + + (0x14e0f923, 0x0df1c5d7) + 0 + + + + (0x25ef8382, 0x4e0eb6d4) + + (0x602bbc4d, 0x5f35c1a9) + 0 + + + (0x00c4af19, 0x360e4025) + 0 + + + + (0x25ef8382, 0x4e0eb6d5) + + (0x602bbc4d, 0x5f35c1aa) + 0 + + + (0x00c4af19, 0x360e4026) + 0 + + + + (0x6de2fa86, 0x52bb1938) + + (0x3840709a, 0x3442f13a) + 0 + + + (0x602bbc4d, 0x5f35c1a9) + 0 + + + + (0x6de2fa86, 0x52bb1939) + + (0x3840709a, 0x3442f13b) + 0 + + + (0x602bbc4d, 0x5f35c1aa) + 0 + + + + + + (0x0000494c, 0x00003564) + This Scenario is set for a g.tec cap with 2 amplifier g.USBamp + + + (0x473d9a43, 0x97fc0a97) + 1536 + + + (0x7234b86b, 0x2b8651a5) + 144 + + + + + (0x00006a47, 0x0000309c) + <b>OVERVIEW</b> +Change Settings on Scenario Configuration tab : +Scripts path = folder to the scripts and config files (normally don't need to change that that if you keep the hierarchy) +Training EEG File = link to the file for training (previous concatenate file) +File Suffix = Suffix for script files + + + (0x473d9a43, 0x97fc0a97) + 1520 + + + (0x7234b86b, 0x2b8651a5) + 224 + + + + + (0x00006a47, 0x0000309d) + <b>PRESENTATION</b> +Les options sont modifiables dnas l'onglet Scenario Configuration : +Scripts path = dossier des scripts et des fichiers de configuration (normalement, il n'est pas nécessaire de changer cela si vous conservez la hiérarchie) +Training EEG File = lien vers le fichier d'entrainement (le fichier concaténé précédemment) +File Suffix = suffixe pour les fichiers de config + + + (0x473d9a43, 0x97fc0a97) + 1520 + + + (0x7234b86b, 0x2b8651a5) + 336 + + + + + (0x00007b10, 0x000005f7) + Add Timeout If no train stimulation comes + + + (0x473d9a43, 0x97fc0a97) + 560 + + + (0x7234b86b, 0x2b8651a5) + -384 + + + + + + + (0x000030a2, 0x00002768) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x4c90d4ad, 0x7a2554ec) + 400 + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x7b814cca, 0x271df6dd) + 400 + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/6-train-classifier.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/6-train-classifier.xml new file mode 100644 index 0000000..c838ce1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/6-train-classifier.xml @@ -0,0 +1,3706 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x003874e6, 0x80815878) + (0x79a9edeb, 0x245d83fc) + Scripts Path + ${Player_ScenarioDirectory}/scripts + ${Player_ScenarioDirectory}/scripts + + + (0x00528432, 0x6820e824) + (0x330306dd, 0x74a95f98) + Training EEG File + ${Player_ScenarioDirectory}/signals/training.ov + ${Player_ScenarioDirectory}/signals/training.ov + + + (0x3f182df9, 0x22c4c9c0) + (0x79a9edeb, 0x245d83fc) + XP Name + XP + XP + + + (0xe14caa24, 0xdc225d56) + (0x79a9edeb, 0x245d83fc) + Subject ID + C1 + C1 + + + (0x61bf58c5, 0x162b5621) + (0x007deef9, 0x2f3e95c6) + Session + 1 + 1 + + + (0xf52b5245, 0x1cff173c) + (0x79a9edeb, 0x245d83fc) + File Suffix + $var{XP Name}_$var{Subject ID}_S$var{Session} + $var{XP Name}_$var{Subject ID}_S$var{Session} + + + (0x6327c3e6, 0x2fb9a2b2) + (0x512a166f, 0x5c3ef83f) + Trial Duration + 4 + 4 + + + (0x0a52a1c7, 0x604cc807) + (0x512a166f, 0x5c3ef83f) + Trial Offset + 0.5 + 0.5 + + + (0x6baa1bbc, 0x80852e64) + (0x512a166f, 0x5c3ef83f) + Epoch Duration + 4 + 1 + + + (0xb7d4e27f, 0x5a0d2f94) + (0x512a166f, 0x5c3ef83f) + Epoch Offset + 0.5 + 0.062500 + + + (0x77d47dd5, 0x3736b2a0) + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_GDF_Left + OVTK_GDF_Left + + + (0xbf018158, 0x66397f0e) + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_GDF_Right + OVTK_GDF_Right + + + + + + + (0x00001449, 0x00001173) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001449, 0x00001174) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002ea1, 0x00000937) + Stimulation multiplexer + (0x07db4efa, 0x472b0938) + + + (0x6f752dd0, 0x082a321e) + Input stimulations 1 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 2 + + + + + (0x6f752dd0, 0x082a321e) + Multiplexed stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + -272 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0xe7af82cd, 0x14edb4d4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000040a1, 0x00002f8d) + Features Selector + (0xee36249f, 0x22a32e7e) + + + (0x17341935, 0x152ff448) + Input + + + + + (0x17341935, 0x152ff448) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Features List + : + : + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x72567519, 0xdbac3ad5) + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/features-selected-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000040a1, 0x00002f8e) + Features Selector + (0xee36249f, 0x22a32e7e) + + + (0x17341935, 0x152ff448) + Input + + + + + (0x17341935, 0x152ff448) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Features List + : + : + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x4e7b798a, 0x183beafb) + (0x72567519, 0xdbac3ad5) + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/features-selected-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000055dc, 0x0000109e) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Training EEG File} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -384 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004a76ae) + + + + + (0x00005658, 0x0000687f) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 10 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Train + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006266, 0x00000e24) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + (0xf031835f, 0xfd499f54) + (0x5ba36127, 0x195feae1) + Input 3 + + + (0xd872563e, 0xc482f033) + (0x5ba36127, 0x195feae1) + Input 4 + + + (0xc48b247a, 0xbd3518e7) + (0x5ba36127, 0x195feae1) + Input 5 + + + (0x5f7bcc3c, 0xe39a6eb0) + (0x5ba36127, 0x195feae1) + Input 6 + + + (0xb830b8b1, 0xa74de4f5) + (0x5ba36127, 0x195feae1) + Input 7 + + + (0xfa16eb48, 0x996f530e) + (0x5ba36127, 0x195feae1) + Input 8 + + + (0xeb82c0f0, 0x3795f13e) + (0x5ba36127, 0x195feae1) + Input 9 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000065a7, 0x00000786) + !EOG1;EOG2;EOG3;EMGg;EMGd + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + EOG1;EOG2;EOG3;EMGg;EMGd + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Reject + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -272 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00128288) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007442, 0x00001fd0) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 544 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007442, 0x00001fd1) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 544 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00c4af19, 0x360e4025) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004da903) + + + + + (0x00c4af19, 0x360e4026) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004da903) + + + + + (0x024f66fc, 0x20e58fa8) + Trials C1 + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + $var{Trial Duration} + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + $var{Trial Offset} + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + $var{Class 1} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x038cae1a, 0x03e0da64) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-4_8-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da65) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-8_12-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da66) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-12_16-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da67) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-16_20-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da68) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-20_24-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da69) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 1072 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-24_28-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da6a) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-28_32-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da6b) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-32_36-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da6c) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 1360 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-36_40-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0a5a6a4a, 0x1d92a778) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + $var{Scripts Path}/classifier.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + $var{Class 1} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + $var{Class 2} + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 656 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x14e0f923, 0x0df1c5d6) + log(1+x) + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x14e0f923, 0x0df1c5d7) + log(1+x) + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x24757b65, 0x29027b6f) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x3840709a, 0x3442f13a) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + $var{Epoch Duration} + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + $var{Epoch Offset} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006bdf4b) + + + + + (0x3840709a, 0x3442f13b) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + $var{Epoch Duration} + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + $var{Epoch Offset} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006bdf4b) + + + + + (0x38f7f16e, 0x716e5783) + 4-8 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5784) + 8-12 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5785) + 12-16 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 12 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 16 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5786) + 16-20 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 16 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5787) + 20-24 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5788) + 24-28 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 24 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 28 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 1072 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5789) + 28-32 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 28 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 32 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e578a) + 32-36 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 32 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 36 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e578b) + 36-40 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 36 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 40 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 1360 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4bfa765b, 0x56988125) + Trials C2 + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + $var{Trial Duration} + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + $var{Trial Offset} + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + $var{Class 2} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x602bbc4d, 0x5f35c1a9) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x602bbc4d, 0x5f35c1aa) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000000ed, 0x00007091) + + (0x00001449, 0x00001174) + 0 + + + (0x024f66fc, 0x20e58fa8) + 1 + + + + (0x00000904, 0x0000009a) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e578b) + 0 + + + + (0x000009c7, 0x0000050c) + + (0x00002ea1, 0x00000937) + 0 + + + (0x00001449, 0x00001174) + 0 + + + + (0x00000d4c, 0x00004008) + + (0x038cae1a, 0x03e0da6a) + 0 + + + (0x00006266, 0x00000e24) + (0xb830b8b1, 0xa74de4f5) + + + + (0x00001d35, 0x00007c7e) + + (0x00001449, 0x00001173) + 0 + + + (0x0a5a6a4a, 0x1d92a778) + 0 + + + + (0x0000203b, 0x000026a7) + + (0x038cae1a, 0x03e0da66) + 0 + + + (0x00006266, 0x00000e24) + (0xf031835f, 0xfd499f54) + + + + (0x00002514, 0x00006f70) + + (0x00001449, 0x00001174) + 0 + + + (0x4bfa765b, 0x56988125) + 1 + + + + (0x00002541, 0x00001634) + + (0x00007442, 0x00001fd0) + 0 + + + (0x000040a1, 0x00002f8d) + 0 + + + + (0x00002543, 0x0000104a) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5789) + 0 + + + + (0x00002baf, 0x000020aa) + + (0x00001449, 0x00001174) + 0 + + + (0x00001449, 0x00001173) + 0 + + + + (0x00002c8c, 0x00004051) + + (0x00007442, 0x00001fd1) + 0 + + + (0x000040a1, 0x00002f8e) + 0 + + + + (0x00002e4f, 0x00000908) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e578a) + 0 + + + + (0x000033a2, 0x000005ce) + + (0x4bfa765b, 0x56988125) + 0 + + + (0x3840709a, 0x3442f13b) + 0 + + + + (0x00003a48, 0x000000fd) + + (0x000040a1, 0x00002f8e) + 0 + + + (0x0a5a6a4a, 0x1d92a778) + 2 + + + + (0x00003b2a, 0x00005e0e) + + (0x000040a1, 0x00002f8d) + 0 + + + (0x0a5a6a4a, 0x1d92a778) + 1 + + + + (0x00003e8e, 0x000039f0) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5786) + 0 + + + + (0x00004053, 0x00002a55) + + (0x038cae1a, 0x03e0da67) + 0 + + + (0x00006266, 0x00000e24) + (0xd872563e, 0xc482f033) + + + + (0x00004360, 0x00000512) + + (0x000055dc, 0x0000109e) + 1 + + + (0x00005658, 0x0000687f) + 0 + + + + (0x000043bd, 0x00006dbc) + + (0x00005658, 0x0000687f) + 0 + + + (0x00002ea1, 0x00000937) + 1 + + + + (0x000045bc, 0x00001b41) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5787) + 0 + + + + (0x000046d8, 0x00004027) + + (0x38f7f16e, 0x716e5783) + 0 + + + (0x038cae1a, 0x03e0da64) + 0 + + + + (0x000046d8, 0x00004028) + + (0x38f7f16e, 0x716e5784) + 0 + + + (0x038cae1a, 0x03e0da65) + 0 + + + + (0x000046d8, 0x00004029) + + (0x38f7f16e, 0x716e5785) + 0 + + + (0x038cae1a, 0x03e0da66) + 0 + + + + (0x000046d8, 0x0000402a) + + (0x38f7f16e, 0x716e5786) + 0 + + + (0x038cae1a, 0x03e0da67) + 0 + + + + (0x000046d8, 0x0000402b) + + (0x38f7f16e, 0x716e5787) + 0 + + + (0x038cae1a, 0x03e0da68) + 0 + + + + (0x000046d8, 0x0000402c) + + (0x38f7f16e, 0x716e5788) + 0 + + + (0x038cae1a, 0x03e0da69) + 0 + + + + (0x000046d8, 0x0000402d) + + (0x38f7f16e, 0x716e5789) + 0 + + + (0x038cae1a, 0x03e0da6a) + 0 + + + + (0x000046d8, 0x0000402e) + + (0x38f7f16e, 0x716e578a) + 0 + + + (0x038cae1a, 0x03e0da6b) + 0 + + + + (0x000046d8, 0x0000402f) + + (0x38f7f16e, 0x716e578b) + 0 + + + (0x038cae1a, 0x03e0da6c) + 0 + + + + (0x00004ad8, 0x00000d0b) + + (0x038cae1a, 0x03e0da6b) + 0 + + + (0x00006266, 0x00000e24) + (0xfa16eb48, 0x996f530e) + + + + (0x00004baf, 0x00005141) + + (0x024f66fc, 0x20e58fa8) + 0 + + + (0x3840709a, 0x3442f13a) + 0 + + + + (0x00004fe5, 0x000074aa) + + (0x14e0f923, 0x0df1c5d6) + 0 + + + (0x00007442, 0x00001fd0) + 0 + + + + (0x00004fe5, 0x000074ab) + + (0x14e0f923, 0x0df1c5d7) + 0 + + + (0x00007442, 0x00001fd1) + 0 + + + + (0x000057c9, 0x00007f2b) + + (0x038cae1a, 0x03e0da69) + 0 + + + (0x00006266, 0x00000e24) + (0x5f7bcc3c, 0xe39a6eb0) + + + + (0x00005d45, 0x000009ac) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5784) + 0 + + + + (0x00005f4c, 0x00001389) + + (0x00006266, 0x00000e24) + 0 + + + (0x4bfa765b, 0x56988125) + 0 + + + + (0x00006048, 0x00007415) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5788) + 0 + + + + (0x00006ada, 0x00007a88) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5783) + 0 + + + + (0x00006ae7, 0x00000cf9) + + (0x00006266, 0x00000e24) + 0 + + + (0x024f66fc, 0x20e58fa8) + 0 + + + + (0x00006c69, 0x00003ad2) + + (0x000055dc, 0x0000109e) + 1 + + + (0x000065a7, 0x00000786) + 0 + + + + (0x00006d9d, 0x00000a90) + + (0x038cae1a, 0x03e0da65) + 0 + + + (0x00006266, 0x00000e24) + 1 + + + + (0x00006e7b, 0x000049d6) + + (0x000055dc, 0x0000109e) + 2 + + + (0x00002ea1, 0x00000937) + 0 + + + + (0x00007019, 0x000013ff) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5785) + 0 + + + + (0x0000759a, 0x00004a1f) + + (0x038cae1a, 0x03e0da64) + 0 + + + (0x00006266, 0x00000e24) + 0 + + + + (0x000079fc, 0x000022e3) + + (0x038cae1a, 0x03e0da68) + 0 + + + (0x00006266, 0x00000e24) + (0xc48b247a, 0xbd3518e7) + + + + (0x00007e8b, 0x00000170) + + (0x038cae1a, 0x03e0da6c) + 0 + + + (0x00006266, 0x00000e24) + (0xeb82c0f0, 0x3795f13e) + + + + (0x1ffeda13, 0x64e650ab) + + (0x00c4af19, 0x360e4025) + 0 + + + (0x14e0f923, 0x0df1c5d6) + 0 + + + + (0x1ffeda13, 0x64e650ac) + + (0x00c4af19, 0x360e4026) + 0 + + + (0x14e0f923, 0x0df1c5d7) + 0 + + + + (0x25ef8382, 0x4e0eb6d4) + + (0x602bbc4d, 0x5f35c1a9) + 0 + + + (0x00c4af19, 0x360e4025) + 0 + + + + (0x25ef8382, 0x4e0eb6d5) + + (0x602bbc4d, 0x5f35c1aa) + 0 + + + (0x00c4af19, 0x360e4026) + 0 + + + + (0x6de2fa86, 0x52bb1938) + + (0x3840709a, 0x3442f13a) + 0 + + + (0x602bbc4d, 0x5f35c1a9) + 0 + + + + (0x6de2fa86, 0x52bb1939) + + (0x3840709a, 0x3442f13b) + 0 + + + (0x602bbc4d, 0x5f35c1aa) + 0 + + + + (0x75fc2227, 0x282c4631) + + (0x0a5a6a4a, 0x1d92a778) + 0 + + + (0x24757b65, 0x29027b6f) + 0 + + + + + + (0x0000494c, 0x00003563) + This Scenario is set for a g.tec cap with 2 amplifier g.USBamp + + + (0x473d9a43, 0x97fc0a97) + 1568 + + + (0x7234b86b, 0x2b8651a5) + 64 + + + + + (0x00006a47, 0x0000309a) + <b>OVERVIEW</b> +Change Settings on Scenario Configuration tab : +Scripts path = folder to the scripts and config files (normally don't need to change that that if you keep the hierarchy) +Training EEG File = link to the file for training (previous concatenate file) +File Suffix = Suffix for script files + + + (0x473d9a43, 0x97fc0a97) + 1552 + + + (0x7234b86b, 0x2b8651a5) + 144 + + + + + (0x00006a47, 0x0000309b) + <b>PRESENTATION</b> +Les options sont modifiables dnas l'onglet Scenario Configuration : +Scripts path = dossier des scripts et des fichiers de configuration (normalement, il n'est pas nécessaire de changer cela si vous conservez la hiérarchie) +Training EEG File = lien vers le fichier d'entrainement (le fichier concaténé précédemment) +File Suffix = suffixe pour les fichiers de config + + + (0x473d9a43, 0x97fc0a97) + 1552 + + + (0x7234b86b, 0x2b8651a5) + 256 + + + + + (0x00007b10, 0x000005f7) + Add Timeout If no train stimulation comes + + + (0x473d9a43, 0x97fc0a97) + 560 + + + (0x7234b86b, 0x2b8651a5) + -384 + + + + + + + (0x000030a2, 0x00002768) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 400 + + + (0x7b814cca, 0x271df6dd) + 400 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/7-online.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/7-online.xml new file mode 100644 index 0000000..688de5d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/7-online.xml @@ -0,0 +1,3768 @@ + + 2 + OpenViBE Designer + 3.0.0 + + + (0x003874e6, 0x80815878) + (0x79a9edeb, 0x245d83fc) + Scripts Path + ${Player_ScenarioDirectory}/scripts + ${Player_ScenarioDirectory}/scripts + + + (0x00528432, 0x6820e824) + (0x79a9edeb, 0x245d83fc) + Signals Path + ${Player_ScenarioDirectory}/signals + ${Player_ScenarioDirectory}/signals + + + (0x3f182df9, 0x22c4c9c0) + (0x79a9edeb, 0x245d83fc) + XP Name + XP + XP + + + (0xe14caa24, 0xdc225d56) + (0x79a9edeb, 0x245d83fc) + Subject ID + C1 + C1 + + + (0x61bf58c5, 0x162b5621) + (0x007deef9, 0x2f3e95c6) + Session + 1 + 1 + + + (0x79b2ce5c, 0xc8b8683e) + (0x007deef9, 0x2f3e95c6) + Run + 1 + 1 + + + (0xf52b5245, 0x1cff173c) + (0x79a9edeb, 0x245d83fc) + File Suffix + $var{XP Name}_$var{Subject ID}_S$var{Session} + $var{XP Name}_$var{Subject ID}_S$var{Session} + + + (0xf4af759e, 0x556343c3) + (0x79a9edeb, 0x245d83fc) + File Prefix + $var{XP Name}_$var{Subject ID}_S$var{Session}_R$var{Run} + $var{XP Name}_$var{Subject ID}_S$var{Session}_R$var{Run} + + + (0x6baa1bbc, 0x80852e64) + (0x512a166f, 0x5c3ef83f) + Epoch Duration + 4 + 1 + + + (0xb7d4e27f, 0x5a0d2f94) + (0x512a166f, 0x5c3ef83f) + Epoch Offset + 0.5 + 0.062500 + + + + + + + (0x00000410, 0x0000196a) + Feature ov + (0x09c92218, 0x7c1216f8) + + + (0x17341935, 0x152ff448) + Input Signal + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].ov + $var{Signals Path}/$var{File Prefix}_online_features-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000f21, 0x00006f70) + Sound Player + (0x7ac2396f, 0x7ee52efe) + + + (0x6f752dd0, 0x082a321e) + Input triggers + + + + + (0x6f752dd0, 0x082a321e) + Resync triggers + + + + + (0x2c132d6e, 0x44ab0d97) + PLAY trigger + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Beep + false + + + (0x2c132d6e, 0x44ab0d97) + STOP trigger + OVTK_StimulationId_Label_01 + OVTK_StimulationId_BaselineStop + false + + + (0x330306dd, 0x74a95f98) + File to play + ${Path_Data}/plugins/stimulation/ov_beep.wav + ${Path_Data}/plugins/stimulation/ov_beep.wav + false + + + (0x2cdb2f0b, 0x12f231ea) + Loop + False + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 1088 + + + (0x4e7b798a, 0x183beafb) + (0xd327e20a, 0xaae6b1f8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005adaef) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000141c, 0x00003c43) + Identity + (0x5dffe431, 0x35215c50) + + + (0x403488e7, 0x565d70b6) + Input stream + + + + + (0x403488e7, 0x565d70b6) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -368 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001881, 0x0000648e) + Raw OV + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Signals Path}/$var{File Prefix}_raw-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + true + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x207c9054, 0x3c841b63) + 656 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004f9ed7) + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002847, 0x00000a63) + Channel Rename + (0x1fe50479, 0x39040f40) + + + (0x5ba36127, 0x195feae1) + Input matrix + + + + + (0x5ba36127, 0x195feae1) + Output matrix + + + + + (0x79a9edeb, 0x245d83fc) + New channel names + Channel 1;Channel 2 + Channel 1;Channel 2 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -432 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x74d8d30c, 0xfa7bdf43) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/channel-list.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002a20, 0x00000cc4) + Graz Motor Imagery BCI Stimulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + $var{Scripts Path}/mi-bci-graz-stimulator.lua + false + + + (0x007deef9, 0x2f3e95c6) + Number of Trials for Each Class + 20 + 20 + false + + + (0x2c132d6e, 0x44ab0d97) + First Class + OVTK_GDF_Left + OVTK_GDF_Left + false + + + (0x2c132d6e, 0x44ab0d97) + Second Class + OVTK_GDF_Right + OVTK_GDF_Right + false + + + (0x512a166f, 0x5c3ef83f) + Baseline Duration (in sec) + 20 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Wait For Beep Duration (in sec) + 2 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + Wait For Cue Duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Display Cue Duration (in sec) + 1.250 + 1.250 + false + + + (0x512a166f, 0x5c3ef83f) + Feedback Duration (in sec) + 3.750 + 3.750 + false + + + (0x512a166f, 0x5c3ef83f) + End of Trial Minimum Duration (in sec) + 1.500 + 1.500 + false + + + (0x512a166f, 0x5c3ef83f) + End of Trial Maximum Duration (in sec) + 3.500 + 3.500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 1152 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005810d7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x000040a1, 0x00002f8d) + Features Selector + (0xee36249f, 0x22a32e7e) + + + (0x17341935, 0x152ff448) + Input + + + + + (0x17341935, 0x152ff448) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Features List + : + : + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x72567519, 0xdbac3ad5) + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/features-selected-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004390, 0x000055c5) + Raw GDF + (0x1e7b2155, 0x107289ce) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x6f752dd0, 0x082a321e) + Stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].gdf + $var{Signals Path}/$var{File Prefix}_raw-[$core{date}-$core{time}].gdf + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -256 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x4e7b798a, 0x183beafb) + (0xd41e3037, 0xcc12644a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c660e3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000465a, 0x00004dbf) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -496 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0069f3f7) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00004b91, 0x00002aea) + Graz visualization + (0x00dd290d, 0x5f142820) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Show feedback + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive feedback only + false + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x602ceb3f, 0xd3bc74aa) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00005511, 0x00002f0c) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x6f752dd0, 0x082a321e) + Classifier Result + + + (0x544a003e, 0x6dcba5f6) + Distance + + + (0x544a003e, 0x6dcba5f6) + Probability + + + (0x6f752dd0, 0x082a321e) + Input stream 4 + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].ov + $var{Signals Path}/$var{File Prefix}_online_classifier_result-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006266, 0x00000e24) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + (0xf031835f, 0xfd499f54) + (0x5ba36127, 0x195feae1) + Input 3 + + + (0xd872563e, 0xc482f033) + (0x5ba36127, 0x195feae1) + Input 4 + + + (0xc48b247a, 0xbd3518e7) + (0x5ba36127, 0x195feae1) + Input 5 + + + (0x5f7bcc3c, 0xe39a6eb0) + (0x5ba36127, 0x195feae1) + Input 6 + + + (0xb830b8b1, 0xa74de4f5) + (0x5ba36127, 0x195feae1) + Input 7 + + + (0xfa16eb48, 0x996f530e) + (0x5ba36127, 0x195feae1) + Input 8 + + + (0xeb82c0f0, 0x3795f13e) + (0x5ba36127, 0x195feae1) + Input 9 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000065a7, 0x00000786) + !EOG1;EOG2;EOG3;EMGg;EMGd + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + EOG1;EOG2;EOG3;EMGg;EMGd + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Reject + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -272 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00128288) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000065a7, 0x00000787) + !EventChannel1;EventChannel2 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + EventChannel1;EventChannel2 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Reject + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -352 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0033f7b6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007442, 0x00001fd0) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007b42, 0x00006959) + Create ShamFB + (0x09c92218, 0x7c1216f8) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Signals Path}/$var{XP Name}_sham-[$core{date}-$core{time}].ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00085ede) + + + (0xfba64161, 0x65304e21) + + + + + + (0x00c4af19, 0x360e4025) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004da903) + + + + + (0x038cae1a, 0x03e0da64) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-4_8-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da65) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-8_12-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da66) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-12_16-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da67) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-16_20-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da68) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-20_24-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da69) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 1072 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-24_28-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da6a) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-28_32-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da6b) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-32_36-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da6c) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 1360 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-36_40-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x14e0f923, 0x0df1c5d6) + log(1+x) + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x24757b65, 0x29027b70) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 1184 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002de35c) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x3840709a, 0x3442f13a) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + $var{Epoch Duration} + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + $var{Epoch Offset} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006bdf4b) + + + + + (0x38f7f16e, 0x716e5783) + 4-8 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5784) + 8-12 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5785) + 12-16 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 12 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 16 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5786) + 16-20 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 16 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5787) + 20-24 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5788) + 24-28 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 24 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 28 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 1072 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5789) + 28-32 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 28 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 32 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e578a) + 32-36 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 32 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 36 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e578b) + 36-40 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 36 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 40 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 1360 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5e704572, 0x05e86e99) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + $var{Scripts Path}/classifier.xml + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x602bbc4d, 0x5f35c1a9) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00000904, 0x0000009a) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e578b) + 0 + + + + (0x00000c70, 0x0000597e) + + (0x00006266, 0x00000e24) + 0 + + + (0x3840709a, 0x3442f13a) + 0 + + + + (0x00000d4c, 0x00004008) + + (0x038cae1a, 0x03e0da6a) + 0 + + + (0x00006266, 0x00000e24) + (0xb830b8b1, 0xa74de4f5) + + + + (0x000011be, 0x000045cc) + + (0x000065a7, 0x00000787) + 0 + + + (0x00004390, 0x000055c5) + 1 + + + + (0x000012ce, 0x00007d5c) + + (0x000040a1, 0x00002f8d) + 0 + + + (0x5e704572, 0x05e86e99) + 0 + + + + (0x00001f90, 0x0000448e) + + (0x000065a7, 0x00000787) + 0 + + + (0x000065a7, 0x00000786) + 0 + + + + (0x0000203b, 0x000026a7) + + (0x038cae1a, 0x03e0da66) + 0 + + + (0x00006266, 0x00000e24) + (0xf031835f, 0xfd499f54) + + + + (0x00002541, 0x00001634) + + (0x00007442, 0x00001fd0) + 0 + + + (0x000040a1, 0x00002f8d) + 0 + + + + (0x00002543, 0x0000104a) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5789) + 0 + + + + (0x00002e4f, 0x00000908) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e578a) + 0 + + + + (0x00002e60, 0x00004221) + + (0x00002a20, 0x00000cc4) + 0 + + + (0x00004b91, 0x00002aea) + 0 + + + + (0x00002fc5, 0x00000fea) + + (0x00002a20, 0x00000cc4) + 0 + + + (0x24757b65, 0x29027b70) + 0 + + + + (0x000033c9, 0x00000120) + + (0x5e704572, 0x05e86e99) + 1 + + + (0x00005511, 0x00002f0c) + 1 + + + + (0x00003e8e, 0x000039f0) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5786) + 0 + + + + (0x00004053, 0x00002a55) + + (0x038cae1a, 0x03e0da67) + 0 + + + (0x00006266, 0x00000e24) + (0xd872563e, 0xc482f033) + + + + (0x000045bc, 0x00001b41) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5787) + 0 + + + + (0x000046d8, 0x00004027) + + (0x38f7f16e, 0x716e5783) + 0 + + + (0x038cae1a, 0x03e0da64) + 0 + + + + (0x000046d8, 0x00004028) + + (0x38f7f16e, 0x716e5784) + 0 + + + (0x038cae1a, 0x03e0da65) + 0 + + + + (0x000046d8, 0x00004029) + + (0x38f7f16e, 0x716e5785) + 0 + + + (0x038cae1a, 0x03e0da66) + 0 + + + + (0x000046d8, 0x0000402a) + + (0x38f7f16e, 0x716e5786) + 0 + + + (0x038cae1a, 0x03e0da67) + 0 + + + + (0x000046d8, 0x0000402b) + + (0x38f7f16e, 0x716e5787) + 0 + + + (0x038cae1a, 0x03e0da68) + 0 + + + + (0x000046d8, 0x0000402c) + + (0x38f7f16e, 0x716e5788) + 0 + + + (0x038cae1a, 0x03e0da69) + 0 + + + + (0x000046d8, 0x0000402d) + + (0x38f7f16e, 0x716e5789) + 0 + + + (0x038cae1a, 0x03e0da6a) + 0 + + + + (0x000046d8, 0x0000402e) + + (0x38f7f16e, 0x716e578a) + 0 + + + (0x038cae1a, 0x03e0da6b) + 0 + + + + (0x000046d8, 0x0000402f) + + (0x38f7f16e, 0x716e578b) + 0 + + + (0x038cae1a, 0x03e0da6c) + 0 + + + + (0x00004ad8, 0x00000d0b) + + (0x038cae1a, 0x03e0da6b) + 0 + + + (0x00006266, 0x00000e24) + (0xfa16eb48, 0x996f530e) + + + + (0x00004b1e, 0x000034b6) + + (0x0000465a, 0x00004dbf) + 0 + + + (0x0000141c, 0x00003c43) + 0 + + + + (0x00004fe5, 0x000074aa) + + (0x14e0f923, 0x0df1c5d6) + 0 + + + (0x00007442, 0x00001fd0) + 0 + + + + (0x000053ec, 0x000057b2) + + (0x00002a20, 0x00000cc4) + 0 + + + (0x00000f21, 0x00006f70) + 0 + + + + (0x000057c9, 0x00007f2b) + + (0x038cae1a, 0x03e0da69) + 0 + + + (0x00006266, 0x00000e24) + (0x5f7bcc3c, 0xe39a6eb0) + + + + (0x00005a27, 0x00001fad) + + (0x000040a1, 0x00002f8d) + 0 + + + (0x00000410, 0x0000196a) + 0 + + + + (0x00005d45, 0x000009ac) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5784) + 0 + + + + (0x00006048, 0x00007415) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5788) + 0 + + + + (0x00006343, 0x000043d4) + + (0x00002847, 0x00000a63) + 0 + + + (0x000065a7, 0x00000787) + 0 + + + + (0x000063b7, 0x00000ebd) + + (0x5e704572, 0x05e86e99) + 1 + + + (0x00004b91, 0x00002aea) + 1 + + + + (0x0000654e, 0x00003cc0) + + (0x0000465a, 0x00004dbf) + 1 + + + (0x00002847, 0x00000a63) + 0 + + + + (0x000065fc, 0x0000668f) + + (0x5e704572, 0x05e86e99) + 1 + + + (0x00007b42, 0x00006959) + 0 + + + + (0x00006ada, 0x00007a88) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5783) + 0 + + + + (0x00006d9d, 0x00000a90) + + (0x038cae1a, 0x03e0da65) + 0 + + + (0x00006266, 0x00000e24) + 1 + + + + (0x00006e4a, 0x00000844) + + (0x000065a7, 0x00000787) + 0 + + + (0x00001881, 0x0000648e) + 1 + + + + (0x00007019, 0x000013ff) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5785) + 0 + + + + (0x0000711e, 0x00003245) + + (0x5e704572, 0x05e86e99) + 0 + + + (0x00005511, 0x00002f0c) + 0 + + + + (0x00007161, 0x0000702d) + + (0x5e704572, 0x05e86e99) + 2 + + + (0x00005511, 0x00002f0c) + 2 + + + + (0x0000759a, 0x00004a1f) + + (0x038cae1a, 0x03e0da64) + 0 + + + (0x00006266, 0x00000e24) + 0 + + + + (0x00007818, 0x0000649d) + + (0x0000141c, 0x00003c43) + 0 + + + (0x00004390, 0x000055c5) + 0 + + + + (0x00007854, 0x0000729e) + + (0x0000141c, 0x00003c43) + 0 + + + (0x00001881, 0x0000648e) + 0 + + + + (0x000079fc, 0x000022e3) + + (0x038cae1a, 0x03e0da68) + 0 + + + (0x00006266, 0x00000e24) + (0xc48b247a, 0xbd3518e7) + + + + (0x00007d81, 0x00002749) + + (0x00002a20, 0x00000cc4) + 0 + + + (0x00005511, 0x00002f0c) + 3 + + + + (0x00007e8b, 0x00000170) + + (0x038cae1a, 0x03e0da6c) + 0 + + + (0x00006266, 0x00000e24) + (0xeb82c0f0, 0x3795f13e) + + + + (0x1ffeda13, 0x64e650ab) + + (0x00c4af19, 0x360e4025) + 0 + + + (0x14e0f923, 0x0df1c5d6) + 0 + + + + (0x25ef8382, 0x4e0eb6d4) + + (0x602bbc4d, 0x5f35c1a9) + 0 + + + (0x00c4af19, 0x360e4025) + 0 + + + + (0x6de2fa86, 0x52bb1938) + + (0x3840709a, 0x3442f13a) + 0 + + + (0x602bbc4d, 0x5f35c1a9) + 0 + + + + + + (0x0000494c, 0x00003563) + This Scenario is set for a g.tec cap with 2 amplifier g.USBamp + + + (0x473d9a43, 0x97fc0a97) + 1552 + + + (0x7234b86b, 0x2b8651a5) + 16 + + + + + (0x00006a47, 0x0000309c) + <b>OVERVIEW</b> +Change Settings on Scenario Configuration tab : +Scripts/Signals path = folder to the different files (normally don't need to change that if you keep the hierarchy) +File Suffix = Suffix for script files +File Prefix = Prefix for signals files +Obvious settings = obvious.... + +File Format for saved signals : +{File Prefix}_online-[{date}-{time}] +{File Prefix}_online_features-[{date}-{time}] +{File Prefix}_online_classifier_result-[{date}-{time}] +{File Prefix}_sham-[date}-{time}] (you can enable/disable this save with disable/enable the box) + + + (0x473d9a43, 0x97fc0a97) + 1552 + + + (0x7234b86b, 0x2b8651a5) + 160 + + + + + (0x00006a47, 0x0000309d) + <b>PRESENTATION</b> +Les options sont modifiables dnas l'onglet Scenario Configuration : +Scripts/Signals path = dossier des différents fichiers (normalement, il n'est pas nécessaire de changer cela si vous conservez la hiérarchie) +File Suffix = Suffixe des fichiers de config +File Prefix = Préfixe des fichiers de signaux +Paramètres évidents = évidents..... + +Format de fichier pour les signaux enregistrés : +{File Prefix}_online-[{date}-{time}] +{File Prefix}_online_features-[{date}-{time}] +{File Prefix}_online_classifier_result-[{date}-{time}] +{File Prefix}_sham-[date}-{time}] (vous pouvez activer/désactiver l'enregistrement en activant/désactivant la boite) + + + (0x473d9a43, 0x97fc0a97) + 1552 + + + (0x7234b86b, 0x2b8651a5) + 384 + + + + + + + (0x000030a2, 0x00002768) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00004b91, 0x00002aea)","childCount":0,"identifier":"(0x000074cb, 0x000011f0)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3}] + + + + + (0x4c90d4ad, 0x7a2554ec) + 400 + + + (0x7b814cca, 0x271df6dd) + 400 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/8-replay.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/8-replay.xml new file mode 100644 index 0000000..f6c170d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/8-replay.xml @@ -0,0 +1,3054 @@ + + 2 + OpenViBE Designer + 3.0.0 + + + (0x003874e6, 0x80815878) + (0x79a9edeb, 0x245d83fc) + Scripts Path + ${Player_ScenarioDirectory}/scripts + ${Player_ScenarioDirectory}/scripts + + + (0x00528432, 0x6820e824) + (0x330306dd, 0x74a95f98) + File to Replay + ${Player_ScenarioDirectory}/signals/File.ov + ${Player_ScenarioDirectory}/signals/File.ov + + + (0xf52b5245, 0x1cff173c) + (0x79a9edeb, 0x245d83fc) + File Suffix + $var{XP Name}_$var{Subject ID}_S$var{Session} + XP_C1_S1 + + + (0x6baa1bbc, 0x80852e64) + (0x512a166f, 0x5c3ef83f) + Epoch Duration + 4 + 1 + + + (0xb7d4e27f, 0x5a0d2f94) + (0x512a166f, 0x5c3ef83f) + Epoch Offset + 0.5 + 0.062500 + + + + + + + (0x0000053d, 0x00004adb) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -288 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000053d, 0x00004adc) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 544 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000f21, 0x00006f71) + Sound Player + (0x7ac2396f, 0x7ee52efe) + + + (0x6f752dd0, 0x082a321e) + Input triggers + + + + + (0x6f752dd0, 0x082a321e) + Resync triggers + + + + + (0x2c132d6e, 0x44ab0d97) + PLAY trigger + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Beep + false + + + (0x2c132d6e, 0x44ab0d97) + STOP trigger + OVTK_StimulationId_Label_01 + OVTK_StimulationId_BaselineStop + false + + + (0x330306dd, 0x74a95f98) + File to play + ${Path_Data}/plugins/stimulation/ov_beep.wav + ${Path_Data}/plugins/stimulation/ov_beep.wav + false + + + (0x2cdb2f0b, 0x12f231ea) + Loop + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -208 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0xd327e20a, 0xaae6b1f8) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005adaef) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000040a1, 0x00002f8d) + Features Selector + (0xee36249f, 0x22a32e7e) + + + (0x17341935, 0x152ff448) + Input + + + + + (0x17341935, 0x152ff448) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Features List + : + : + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x72567519, 0xdbac3ad5) + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/features-selected-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004b91, 0x00002aea) + Graz visualization + (0x00dd290d, 0x5f142820) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Show feedback + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive feedback only + false + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x602ceb3f, 0xd3bc74aa) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000055dc, 0x0000109e) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{File to Replay} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -368 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004a76ae) + + + + + (0x00006266, 0x00000e24) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + (0xf031835f, 0xfd499f54) + (0x5ba36127, 0x195feae1) + Input 3 + + + (0xd872563e, 0xc482f033) + (0x5ba36127, 0x195feae1) + Input 4 + + + (0xc48b247a, 0xbd3518e7) + (0x5ba36127, 0x195feae1) + Input 5 + + + (0x5f7bcc3c, 0xe39a6eb0) + (0x5ba36127, 0x195feae1) + Input 6 + + + (0xb830b8b1, 0xa74de4f5) + (0x5ba36127, 0x195feae1) + Input 7 + + + (0xfa16eb48, 0x996f530e) + (0x5ba36127, 0x195feae1) + Input 8 + + + (0xeb82c0f0, 0x3795f13e) + (0x5ba36127, 0x195feae1) + Input 9 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000065a7, 0x00000786) + !EOG1;EOG2;EOG3;EMGg;EMGd + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + EOG1;EOG2;EOG3;EMGg;EMGd + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Reject + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -272 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00128288) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000743e, 0x000010d3) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -208 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0033e470) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007442, 0x00001fd0) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00c4af19, 0x360e4025) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004da903) + + + + + (0x038cae1a, 0x03e0da64) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-4_8-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da65) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-8_12-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da66) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-12_16-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da67) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-16_20-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da68) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-20_24-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da69) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 1072 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-24_28-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da6a) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-28_32-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da6b) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-32_36-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x038cae1a, 0x03e0da6c) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + -1.025592e-001 -7.992702e-002 -3.380574e-002 -9.564073e-002 1.014601e-001 -1.039170e-001 8.733368e-002 -3.739840e-002 -2.037134e-001 7.071647e-001 3.741635e-001 -3.580719e-001 1.442817e-001 3.411863e-003 -1.213417e-001 -3.119889e-001 1.115873e-001 1.359580e-001 -1.116613e-001 -3.135968e-001 -1.250939e-001 -1.378700e-002 -2.625042e-001 -1.009421e-001 -2.279613e-001 6.689580e-001 -3.348420e-002 9.899176e-002 -4.863345e-002 4.481541e-001 -2.025669e-001 -9.318723e-002 5.258966e-002 2.090623e-004 -1.451749e-001 -3.856019e-001 -4.710458e-002 9.675494e-002 1.549741e-001 -7.944412e-002 -7.903602e-002 7.455923e-001 -3.815222e-001 2.166322e-001 7.102007e-002 -1.493399e-001 -5.719637e-002 -1.732339e-002 4.253947e-002 -1.286825e-001 -1.415511e-001 1.086118e-001 3.485295e-002 -2.764141e-001 8.364691e-001 -3.726375e-001 4.963272e-002 9.167431e-003 -1.381837e-002 -1.012741e-002 -1.700471e-002 -1.616294e-001 6.193112e-002 -2.344197e-002 -3.390554e-001 2.998192e-001 1.635785e-002 3.717487e-001 -8.495080e-002 8.709944e-002 -4.562827e-001 4.325673e-001 -3.228420e-001 7.993942e-003 -1.115950e-001 -1.922763e-001 2.762776e-001 2.720282e-002 1.158864e-001 -4.858494e-002 -3.275103e-001 2.691000e-001 8.273217e-002 1.568368e-001 6.632540e-002 -6.147631e-002 -4.658877e-001 5.034320e-001 -1.359116e-001 5.664146e-002 -2.065083e-001 3.221159e-001 -2.724882e-001 7.822386e-002 -2.063637e-001 1.384452e-001 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 6 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 16 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 1360 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0x8d21ff41, 0xdf6afe7e) + $var{Scripts Path}/fbcsp-spatial-filter-36_40-$var{File Suffix}.xml + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x14e0f923, 0x0df1c5d6) + log(1+x) + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(1+x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x3840709a, 0x3442f13a) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + $var{Epoch Duration} + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + $var{Epoch Offset} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006bdf4b) + + + + + (0x38f7f16e, 0x716e5783) + 4-8 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5784) + 8-12 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 12 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5785) + 12-16 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 12 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 16 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5786) + 16-20 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 16 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5787) + 20-24 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5788) + 24-28 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 24 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 28 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 1072 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e5789) + 28-32 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 28 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 32 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e578a) + 32-36 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 32 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 36 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x38f7f16e, 0x716e578b) + 36-40 + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 36 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 40 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 1360 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5e704572, 0x05e86e99) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + $var{Scripts Path}/classifier.xml + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x602bbc4d, 0x5f35c1a9) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x0000086e, 0x00005af4) + + (0x0000053d, 0x00004adc) + 0 + + + (0x00004b91, 0x00002aea) + 0 + + + + (0x00000904, 0x0000009a) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e578b) + 0 + + + + (0x00000a5d, 0x00004ae2) + + (0x0000053d, 0x00004adb) + 0 + + + (0x0000053d, 0x00004adc) + 0 + + + + (0x00000c70, 0x0000597e) + + (0x00006266, 0x00000e24) + 0 + + + (0x3840709a, 0x3442f13a) + 0 + + + + (0x00000d4c, 0x00004008) + + (0x038cae1a, 0x03e0da6a) + 0 + + + (0x00006266, 0x00000e24) + (0xb830b8b1, 0xa74de4f5) + + + + (0x000012ce, 0x00007d5c) + + (0x000040a1, 0x00002f8d) + 0 + + + (0x5e704572, 0x05e86e99) + 0 + + + + (0x0000203b, 0x000026a7) + + (0x038cae1a, 0x03e0da66) + 0 + + + (0x00006266, 0x00000e24) + (0xf031835f, 0xfd499f54) + + + + (0x00002541, 0x00001634) + + (0x00007442, 0x00001fd0) + 0 + + + (0x000040a1, 0x00002f8d) + 0 + + + + (0x00002543, 0x0000104a) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5789) + 0 + + + + (0x00002958, 0x00002d50) + + (0x000055dc, 0x0000109e) + 2 + + + (0x0000053d, 0x00004adb) + 0 + + + + (0x00002e4f, 0x00000908) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e578a) + 0 + + + + (0x000030c7, 0x0000440b) + + (0x0000053d, 0x00004adb) + 0 + + + (0x0000743e, 0x000010d3) + 0 + + + + (0x0000343f, 0x000072aa) + + (0x000055dc, 0x0000109e) + 1 + + + (0x000065a7, 0x00000786) + 0 + + + + (0x00003e8e, 0x000039f0) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5786) + 0 + + + + (0x00004053, 0x00002a55) + + (0x038cae1a, 0x03e0da67) + 0 + + + (0x00006266, 0x00000e24) + (0xd872563e, 0xc482f033) + + + + (0x000045bc, 0x00001b41) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5787) + 0 + + + + (0x000046d8, 0x00004027) + + (0x38f7f16e, 0x716e5783) + 0 + + + (0x038cae1a, 0x03e0da64) + 0 + + + + (0x000046d8, 0x00004028) + + (0x38f7f16e, 0x716e5784) + 0 + + + (0x038cae1a, 0x03e0da65) + 0 + + + + (0x000046d8, 0x00004029) + + (0x38f7f16e, 0x716e5785) + 0 + + + (0x038cae1a, 0x03e0da66) + 0 + + + + (0x000046d8, 0x0000402a) + + (0x38f7f16e, 0x716e5786) + 0 + + + (0x038cae1a, 0x03e0da67) + 0 + + + + (0x000046d8, 0x0000402b) + + (0x38f7f16e, 0x716e5787) + 0 + + + (0x038cae1a, 0x03e0da68) + 0 + + + + (0x000046d8, 0x0000402c) + + (0x38f7f16e, 0x716e5788) + 0 + + + (0x038cae1a, 0x03e0da69) + 0 + + + + (0x000046d8, 0x0000402d) + + (0x38f7f16e, 0x716e5789) + 0 + + + (0x038cae1a, 0x03e0da6a) + 0 + + + + (0x000046d8, 0x0000402e) + + (0x38f7f16e, 0x716e578a) + 0 + + + (0x038cae1a, 0x03e0da6b) + 0 + + + + (0x000046d8, 0x0000402f) + + (0x38f7f16e, 0x716e578b) + 0 + + + (0x038cae1a, 0x03e0da6c) + 0 + + + + (0x00004ad8, 0x00000d0b) + + (0x038cae1a, 0x03e0da6b) + 0 + + + (0x00006266, 0x00000e24) + (0xfa16eb48, 0x996f530e) + + + + (0x00004fe5, 0x000074aa) + + (0x14e0f923, 0x0df1c5d6) + 0 + + + (0x00007442, 0x00001fd0) + 0 + + + + (0x00005005, 0x00004c9a) + + (0x0000053d, 0x00004adb) + 0 + + + (0x00000f21, 0x00006f71) + 0 + + + + (0x000057c9, 0x00007f2b) + + (0x038cae1a, 0x03e0da69) + 0 + + + (0x00006266, 0x00000e24) + (0x5f7bcc3c, 0xe39a6eb0) + + + + (0x00005d45, 0x000009ac) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5784) + 0 + + + + (0x00006048, 0x00007415) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5788) + 0 + + + + (0x000063b7, 0x00000ebd) + + (0x5e704572, 0x05e86e99) + 1 + + + (0x00004b91, 0x00002aea) + 1 + + + + (0x00006ada, 0x00007a88) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5783) + 0 + + + + (0x00006d9d, 0x00000a90) + + (0x038cae1a, 0x03e0da65) + 0 + + + (0x00006266, 0x00000e24) + 1 + + + + (0x00007019, 0x000013ff) + + (0x000065a7, 0x00000786) + 0 + + + (0x38f7f16e, 0x716e5785) + 0 + + + + (0x0000759a, 0x00004a1f) + + (0x038cae1a, 0x03e0da64) + 0 + + + (0x00006266, 0x00000e24) + 0 + + + + (0x000079fc, 0x000022e3) + + (0x038cae1a, 0x03e0da68) + 0 + + + (0x00006266, 0x00000e24) + (0xc48b247a, 0xbd3518e7) + + + + (0x00007e8b, 0x00000170) + + (0x038cae1a, 0x03e0da6c) + 0 + + + (0x00006266, 0x00000e24) + (0xeb82c0f0, 0x3795f13e) + + + + (0x1ffeda13, 0x64e650ab) + + (0x00c4af19, 0x360e4025) + 0 + + + (0x14e0f923, 0x0df1c5d6) + 0 + + + + (0x25ef8382, 0x4e0eb6d4) + + (0x602bbc4d, 0x5f35c1a9) + 0 + + + (0x00c4af19, 0x360e4025) + 0 + + + + (0x6de2fa86, 0x52bb1938) + + (0x3840709a, 0x3442f13a) + 0 + + + (0x602bbc4d, 0x5f35c1a9) + 0 + + + + + + (0x0000494c, 0x00003563) + This Scenario is set for a g.tec cap with 2 amplifier g.USBamp + + + (0x473d9a43, 0x97fc0a97) + 1456 + + + (0x7234b86b, 0x2b8651a5) + 128 + + + + + (0x00006a47, 0x0000309c) + <b>OVERVIEW</b> +Change Settings on Scenario Configuration tab : +Scripts path = folder to the scripts and config files (normally don't need to change that that if you keep the hierarchy) +File to replay = link to the file for replay ({XP Name}_{Subject ID}_S{Session}_R{Run}_online-[{date}-{time}] files) +File Suffix = Suffix for script files + + + (0x473d9a43, 0x97fc0a97) + 1440 + + + (0x7234b86b, 0x2b8651a5) + 224 + + + + + (0x00006a47, 0x0000309d) + <b>PRESENTATION</b> +Les options sont modifiables dans l'onglet Scenario Configuration : +Scripts path = dossier des scripts et des fichiers de configuration (normalement, il n'est pas nécessaire de changer cela si vous conservez la hiérarchie) +File to replay = lien vers le fichier à rejouer (fichiers {XP Name}_{Subject ID}_S{Session}_R{Run}_online-[{date}-{time}]) +File Suffix = suffixe pour les fichiers de config + + + (0x473d9a43, 0x97fc0a97) + 1456 + + + (0x7234b86b, 0x2b8651a5) + 352 + + + + + + + (0x000030a2, 0x00002768) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00004b91, 0x00002aea)","childCount":0,"identifier":"(0x000074cb, 0x000011f0)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3}] + + + + + (0x4c90d4ad, 0x7a2554ec) + 400 + + + (0x7b814cca, 0x271df6dd) + 400 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/img/Cross.png b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/img/Cross.png new file mode 100644 index 0000000..224a193 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/img/Cross.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/channel-list.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/channel-list.xml new file mode 100644 index 0000000..63e9406 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/channel-list.xml @@ -0,0 +1,4 @@ + + Fz;FCz;Cz;CPz;Pz;C1;C3;C5;C2;C4;C6;EOG1;EOG2;EOG3;EMGg;EMGd;EventChannel2; + F4;FC2;FC4;FC6;CP2;CP4;CP6;P4;F3;FC1;FC3;FC5;CP1;CP3;CP5;P3;EventChannel1 + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/classifier.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/classifier.xml new file mode 100644 index 0000000..a385466 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/classifier.xml @@ -0,0 +1,23 @@ + + Native + Linear Discrimimant Analysis (LDA) + + OVTK_GDF_Left + OVTK_GDF_Right + + + + 0 1 + + + 1.122419e+001 1.402728e+000 7.402276e+001 4.533984e+000 + -4.99595 + + + 7.847074e+000 5.648976e+000 4.272895e+001 8.610974e+000 + -3.71443 + + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-12_16-XP_C1_S1.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-12_16-XP_C1_S1.xml new file mode 100644 index 0000000..c7d3764 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-12_16-XP_C1_S1.xml @@ -0,0 +1,6 @@ + + 1.715772e-001 -2.291919e-001 2.774970e-001 -1.061744e-002 2.240297e-002 2.644725e-001 -5.117951e-002 1.926034e-001 -2.150231e-001 -4.435833e-001 4.865556e-002 -5.276697e-004 3.752418e-001 -9.823282e-002 9.227359e-002 2.573437e-002 2.815771e-001 -4.796797e-002 -5.528297e-002 5.543258e-002 -2.759391e-001 -7.162544e-002 -1.135426e-001 -3.181351e-001 1.344281e-001 -1.208814e-001 9.988614e-002 9.830087e-002 -4.919398e-001 -1.997282e-002 1.369912e-001 1.312117e-003 -9.083082e-002 1.067697e-001 -4.402338e-002 4.007184e-002 -7.801719e-002 -3.030583e-003 -1.830922e-001 4.942633e-001 -4.120216e-002 1.183719e-001 -2.872575e-001 -1.154390e-002 -1.422149e-001 2.260056e-001 -1.221331e-001 3.440329e-001 -1.609985e-001 1.698824e-001 1.667312e-001 -1.517698e-001 -1.131512e-001 2.647222e-002 1.118075e-001 6.206207e-003 9.882838e-002 -2.755666e-002 1.945892e-001 -2.981932e-001 -3.681639e-001 2.031698e-001 -7.966545e-002 3.159508e-001 -8.304870e-002 -1.325213e-001 -2.486992e-001 1.020107e-002 5.591241e-002 -2.395856e-001 -2.381177e-001 -5.888614e-002 2.270962e-001 1.116078e-001 3.875004e-001 1.037994e-001 -1.144425e-002 -1.600198e-001 2.157356e-001 1.654755e-001 -1.882163e-001 -1.650306e-001 3.015094e-002 2.755893e-001 2.855984e-002 -8.659574e-002 -3.899043e-001 9.450951e-002 -2.615674e-002 -8.091567e-002 -9.850057e-002 8.335227e-002 4.193744e-002 -4.784618e-002 8.595419e-002 -3.536181e-002 2.101623e-001 2.884731e-002 -2.345240e-001 1.614895e-001 -5.596329e-002 7.499799e-002 2.054848e-001 8.057146e-003 -5.148820e-001 3.901260e-001 -2.486800e-001 1.838387e-001 + 4 + 27 + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-16_20-XP_C1_S1.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-16_20-XP_C1_S1.xml new file mode 100644 index 0000000..fa3b43e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-16_20-XP_C1_S1.xml @@ -0,0 +1,6 @@ + + -1.259517e-001 2.010806e-001 -4.791106e-003 -1.326768e-002 5.194956e-002 2.368850e-001 -3.639400e-001 5.459953e-002 -2.778437e-001 5.759425e-001 -1.203257e-001 -6.617685e-002 -2.909759e-001 3.252801e-001 -1.452903e-001 -6.336518e-003 -1.275346e-001 -1.236840e-003 -4.765382e-003 6.948595e-003 -9.492253e-003 1.906966e-001 -7.736665e-002 -1.893221e-001 1.091942e-001 5.116545e-002 2.657779e-002 -5.907284e-002 4.347148e-002 6.137922e-002 5.425836e-002 -1.602261e-001 -3.111976e-001 3.971778e-002 8.131662e-002 1.651330e-001 -4.702871e-001 -3.984871e-002 4.543805e-003 -1.237402e-001 6.337210e-001 -1.907082e-001 3.138906e-002 -1.050105e-001 1.105517e-001 7.226177e-002 1.273482e-001 3.261482e-002 -7.672975e-002 -1.053375e-001 6.069964e-002 2.333095e-001 7.031792e-002 -1.645873e-001 -8.139508e-002 9.925348e-002 3.285371e-002 -1.328991e-001 4.178714e-002 -1.685904e-001 9.235131e-002 -6.668050e-002 6.981334e-004 3.948492e-002 5.579366e-002 4.189754e-002 8.780587e-002 -7.609025e-003 -5.842266e-002 9.650743e-002 -1.441406e-001 -3.705814e-002 -1.119816e-001 -1.349965e-002 -3.571421e-001 2.285310e-001 8.865378e-003 6.520331e-001 -4.209897e-001 2.560429e-001 -1.097755e-001 7.116420e-002 -1.062484e-001 1.189581e-001 -5.397360e-003 1.642586e-001 -1.365997e-001 8.296745e-002 -2.359106e-002 5.492830e-001 -6.416229e-002 8.260784e-002 2.612605e-002 -4.565891e-001 1.920180e-001 -2.739850e-002 -2.761127e-001 -3.378566e-001 4.653667e-002 5.336148e-002 -5.954101e-003 1.626611e-001 6.645168e-002 -4.053274e-002 -2.535007e-001 2.272593e-002 -1.206022e-001 2.228918e-001 + 4 + 27 + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-20_24-XP_C1_S1.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-20_24-XP_C1_S1.xml new file mode 100644 index 0000000..30564d1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-20_24-XP_C1_S1.xml @@ -0,0 +1,6 @@ + + -1.038980e-001 7.518746e-004 1.763444e-001 -7.884067e-002 6.216413e-002 -2.413536e-001 1.139401e-001 -3.565677e-002 -2.292543e-001 6.964212e-002 -8.042871e-002 -1.147777e-001 -2.518226e-001 6.603845e-001 -1.806380e-001 1.325969e-001 1.442291e-001 -6.594190e-003 -2.021973e-001 -2.338536e-003 3.235898e-001 -1.625403e-001 2.836493e-002 8.805184e-003 -8.485602e-002 1.840582e-001 -1.179516e-001 -3.265552e-002 1.820037e-002 -3.556919e-001 3.217331e-001 -1.405164e-005 1.248024e-001 -1.089761e-001 3.635348e-002 3.107797e-002 4.071547e-001 -4.968710e-002 -1.905899e-002 2.644749e-001 -3.989279e-001 4.148418e-002 -2.202332e-001 1.844307e-001 -1.091464e-001 -4.919501e-002 5.770321e-002 1.149917e-001 -3.565920e-001 1.154291e-001 -1.828108e-001 7.702425e-002 1.987198e-001 -8.178717e-002 -4.424306e-004 -2.698723e-001 2.581978e-001 1.342054e-001 -4.759055e-001 2.280384e-002 -1.662789e-001 1.749317e-001 -3.958793e-001 1.474860e-001 2.369051e-002 2.898734e-002 2.842659e-001 -8.829193e-002 -4.595868e-003 3.699537e-001 -3.345582e-001 4.747968e-002 1.408001e-001 -1.718274e-002 8.628574e-002 -7.110090e-002 3.430489e-002 2.826111e-002 3.113248e-002 -3.437025e-002 3.069444e-002 -2.514572e-001 2.404846e-001 2.136934e-001 -2.663008e-001 3.522840e-001 -3.385658e-001 1.409999e-001 -1.031191e-001 -1.976747e-001 1.345840e-001 1.269586e-002 3.135183e-002 7.665877e-002 -1.590580e-002 -8.899556e-003 1.249681e-001 -3.064521e-001 1.008705e-001 -1.653324e-002 -8.502553e-002 1.828387e-001 3.902926e-003 7.835281e-002 -4.088082e-001 3.044135e-001 -4.454701e-002 -1.060925e-003 + 4 + 27 + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-24_28-XP_C1_S1.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-24_28-XP_C1_S1.xml new file mode 100644 index 0000000..8f978f4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-24_28-XP_C1_S1.xml @@ -0,0 +1,6 @@ + + 1.054944e-001 2.529141e-001 -1.961902e-001 1.234111e-001 -2.183774e-002 5.023824e-002 6.245501e-002 9.811941e-003 -1.833688e-001 2.064154e-001 8.879401e-003 5.735955e-002 3.269895e-001 -4.177246e-001 5.602020e-002 2.531075e-001 -2.479438e-001 1.242835e-002 4.392075e-002 7.382720e-002 -4.902304e-001 -3.920456e-002 1.592686e-002 2.860624e-002 -1.461803e-001 -2.129275e-001 2.394097e-001 -2.400479e-001 2.352621e-001 1.032479e-001 -4.436633e-003 -9.488404e-002 7.788147e-002 -3.331888e-001 -1.961982e-003 -2.086608e-001 1.293132e-001 4.073178e-002 1.564578e-001 -9.525116e-002 -4.488903e-001 1.174530e-001 2.571870e-001 3.225286e-002 8.687009e-002 -2.080385e-001 1.326361e-002 2.482847e-001 5.286300e-002 -2.781952e-002 -2.879779e-001 -3.277527e-002 4.125944e-001 4.302172e-002 -2.661206e-001 -2.644088e-001 1.670963e-001 3.144791e-003 2.144087e-001 1.839001e-001 -1.510396e-002 6.932634e-002 8.945059e-002 -1.311102e-001 1.972366e-001 2.588092e-002 2.384177e-001 1.009258e-001 -1.108545e-002 -4.285852e-003 -4.986009e-001 1.395485e-001 6.860623e-002 2.863940e-001 -1.789192e-001 1.871124e-001 -1.720453e-001 -3.999174e-001 -3.118724e-002 -2.386626e-002 4.092164e-002 -9.200701e-002 -2.920707e-001 3.004002e-001 -1.080632e-001 -1.285763e-001 -2.247713e-001 -3.001484e-001 2.282678e-002 -2.539776e-002 -4.283183e-001 1.316737e-001 3.387353e-002 2.931892e-001 1.388757e-001 -5.824244e-002 2.199933e-001 -2.230668e-001 7.077331e-003 2.103411e-001 -1.282308e-001 2.113108e-001 3.026620e-001 9.747186e-002 -1.091028e-001 6.190206e-002 -4.722008e-002 1.131684e-001 + 4 + 27 + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-28_32-XP_C1_S1.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-28_32-XP_C1_S1.xml new file mode 100644 index 0000000..6464a59 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-28_32-XP_C1_S1.xml @@ -0,0 +1,6 @@ + + 6.896112e-002 5.838406e-002 -1.913882e-001 1.790403e-001 -3.905723e-001 9.086674e-002 -2.351039e-001 3.794074e-002 1.077713e-001 1.920391e-001 1.376548e-003 1.309270e-002 2.060020e-001 -5.016154e-001 1.202305e-001 2.541567e-003 6.328610e-002 7.893040e-002 -5.732313e-002 9.470776e-002 -2.431296e-001 -2.578788e-001 7.497000e-002 -1.652617e-001 2.597322e-001 2.795242e-001 1.477148e-001 1.724260e-001 -8.059806e-002 -9.513466e-002 1.739882e-001 -7.061376e-002 1.103639e-001 -2.113236e-001 1.167676e-001 1.643074e-001 6.077241e-001 -1.484461e-001 -5.569855e-003 -1.090541e-001 -1.966304e-001 -3.288890e-002 -4.443513e-001 1.288446e-001 -4.302977e-002 1.009600e-001 3.636558e-002 -2.047350e-001 -6.113033e-002 9.086515e-002 2.412797e-001 -1.946634e-001 -1.053600e-002 -3.761087e-002 1.959706e-001 2.279109e-001 1.875874e-001 -4.813676e-001 4.928611e-002 -1.945116e-001 -1.947912e-003 -3.105301e-002 4.314814e-002 1.633441e-001 -1.052840e-001 -4.823687e-003 -4.878863e-001 1.469434e-002 1.382662e-002 3.480332e-001 -1.407920e-001 1.493043e-001 -1.525695e-001 -5.416574e-002 -6.460541e-002 2.209824e-001 -1.021370e-001 1.582586e-001 1.846506e-001 -6.090992e-002 -8.764653e-002 4.690930e-002 8.293692e-002 1.262028e-001 3.179204e-002 -2.016820e-001 1.713412e-001 4.563330e-001 -1.795923e-001 -3.791368e-001 -3.057287e-002 2.540025e-002 -2.685127e-002 1.187121e-001 -5.765953e-002 1.205900e-002 3.532004e-001 3.859228e-001 -1.574373e-001 -2.511466e-001 -2.146186e-002 -1.888072e-001 -1.516446e-001 -1.621920e-003 -2.351221e-001 -1.374926e-001 5.674146e-002 4.226740e-002 + 4 + 27 + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-32_36-XP_C1_S1.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-32_36-XP_C1_S1.xml new file mode 100644 index 0000000..60e1aa0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-32_36-XP_C1_S1.xml @@ -0,0 +1,6 @@ + + -6.569512e-002 8.840984e-002 7.442431e-002 1.778970e-001 -1.130028e-001 -1.283245e-001 4.163818e-001 -5.687053e-002 -1.153659e-002 5.679567e-002 -1.596727e-001 7.931860e-002 -4.074984e-002 1.268025e-001 -8.399033e-002 -2.739739e-001 3.102945e-001 1.647312e-001 -3.234673e-001 2.704625e-001 -2.025470e-001 -4.791169e-001 6.198940e-002 8.906157e-002 -5.278913e-002 -6.712890e-002 1.378025e-001 1.204764e-001 5.153538e-003 -1.921449e-001 -1.450251e-001 5.214459e-002 3.112692e-001 1.313356e-001 4.950090e-002 -9.987589e-002 4.632301e-001 -4.733374e-002 -5.151643e-002 -9.787782e-002 -2.645069e-001 3.623273e-002 -4.419284e-002 2.274820e-001 -2.537538e-001 4.977951e-002 1.883132e-002 3.964252e-001 -3.378241e-001 1.800214e-002 1.076006e-001 -2.758126e-001 -1.055411e-001 -8.108799e-002 1.207703e-002 -1.275504e-001 3.112598e-001 -2.339002e-002 3.540776e-001 -3.111795e-002 2.620257e-001 1.088762e-002 -5.786667e-002 2.385998e-001 3.193196e-002 2.100173e-002 -7.898719e-002 -8.047986e-002 4.994036e-003 1.826301e-001 -3.273935e-001 2.056090e-001 -4.457713e-001 -1.981543e-002 2.460481e-002 -2.805939e-002 2.755595e-002 -3.978654e-001 -1.639201e-001 2.041518e-001 -7.512158e-002 5.138631e-002 -1.361320e-001 5.390001e-002 2.071250e-001 7.677609e-002 -3.863950e-002 2.796452e-001 -1.281536e-001 9.091772e-003 -8.889405e-002 -6.739059e-003 2.151550e-002 2.579544e-002 -5.359017e-002 -1.370087e-003 1.586381e-001 1.671752e-001 -1.060785e-001 -9.021208e-002 8.995639e-003 8.760518e-002 -1.803449e-001 5.163915e-002 -7.389571e-001 2.631745e-001 -1.524579e-001 2.548806e-001 + 4 + 27 + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-36_40-XP_C1_S1.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-36_40-XP_C1_S1.xml new file mode 100644 index 0000000..91adbee --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-36_40-XP_C1_S1.xml @@ -0,0 +1,6 @@ + + -3.420995e-002 5.527976e-002 6.790313e-002 -6.983109e-002 1.763798e-001 1.678535e-001 9.020466e-002 -6.783026e-002 -1.297101e-001 5.898939e-001 -9.207082e-002 -5.166649e-002 -1.733241e-001 -8.646539e-002 8.846908e-003 -4.823829e-001 3.189985e-001 1.457662e-002 -1.678863e-001 -2.358113e-002 -7.909512e-002 1.853926e-001 -5.357691e-002 -2.163103e-001 1.742222e-001 1.905100e-002 -1.277156e-001 3.366682e-002 8.325547e-002 1.418083e-001 2.824455e-003 -4.231404e-002 -1.065799e-002 -2.261358e-001 1.316035e-001 -2.590980e-001 -2.731268e-001 -3.939414e-002 -1.429762e-001 1.665875e-001 6.091575e-001 -1.554584e-001 2.860505e-001 -1.440080e-001 3.485623e-002 -4.640484e-002 1.638508e-002 -2.479406e-001 -1.210764e-001 1.348601e-001 2.022191e-001 -2.520456e-001 9.336748e-002 3.290093e-002 -6.288483e-002 -7.633671e-002 1.149018e-002 -1.877500e-001 -9.409787e-002 -2.129992e-001 3.002492e-001 -1.161556e-001 1.192311e-001 9.434965e-003 1.358911e-002 1.011017e-001 -4.289191e-002 -8.058395e-003 -2.094871e-002 -3.033184e-001 1.551692e-002 -2.288657e-002 2.307743e-001 -3.907300e-002 2.829116e-001 -2.290867e-001 2.524998e-002 6.386252e-001 -2.268291e-001 5.258891e-002 -1.647727e-001 3.071036e-001 -7.422364e-002 5.184729e-001 -3.789078e-001 5.244924e-002 -1.501338e-001 7.943601e-002 2.787841e-002 -1.032658e-001 1.715144e-001 4.046972e-002 -2.981790e-002 -3.286241e-001 1.195130e-002 2.305130e-002 3.137973e-001 -3.192142e-001 6.477050e-002 -1.405417e-001 -2.237181e-002 5.699374e-002 -1.518414e-001 2.462649e-002 1.093709e-001 -1.863507e-001 7.338830e-002 1.842771e-002 + 4 + 27 + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-4_8-XP_C1_S1.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-4_8-XP_C1_S1.xml new file mode 100644 index 0000000..f3a3bc2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-4_8-XP_C1_S1.xml @@ -0,0 +1,6 @@ + + -3.827143e-002 2.870288e-001 -2.770489e-002 -1.779416e-001 1.475039e-002 2.076059e-002 -1.307874e-002 -7.226940e-002 -1.774841e-002 3.195848e-001 -5.325655e-002 2.456097e-001 -1.325061e-001 -6.433336e-001 2.234989e-001 3.106214e-001 -3.312283e-001 1.215142e-002 3.582046e-002 -1.067747e-001 -9.710760e-003 7.525389e-002 6.952962e-002 -7.449448e-003 2.476882e-002 -9.640527e-003 1.719437e-002 4.495197e-004 -1.927235e-001 -3.072457e-001 1.365932e-001 -1.013682e-002 7.124347e-002 1.059915e-001 4.544661e-002 1.607895e-001 -4.833831e-001 5.673839e-003 -1.078964e-001 2.943568e-001 -8.598069e-003 1.817776e-001 -1.620105e-001 4.124448e-001 -1.337263e-001 7.280499e-003 -1.831846e-002 3.313731e-001 -3.197685e-001 5.525115e-002 -3.665450e-002 1.860502e-002 -8.908690e-002 3.169028e-002 6.288504e-002 2.290560e-001 3.150809e-002 -8.714655e-002 8.263897e-002 -2.732188e-001 3.295268e-002 -6.439668e-002 -6.898272e-002 2.451023e-002 -1.750754e-001 -1.067124e-001 -1.788377e-001 1.585061e-001 6.410196e-002 1.622609e-001 -1.521524e-001 1.895446e-001 -3.749672e-002 -7.270977e-003 1.327815e-001 -4.343652e-001 1.662755e-001 1.893942e-001 4.672761e-001 5.079415e-002 -4.025578e-001 3.655307e-001 -3.099382e-001 3.772861e-001 -3.436688e-001 1.745903e-001 3.843756e-001 7.814846e-002 -5.702241e-002 -3.465690e-002 -9.251470e-002 1.186289e-001 -1.182049e-001 4.590770e-002 5.673576e-002 -5.488026e-002 -1.296365e-001 6.875037e-002 -1.229174e-001 1.002301e-001 6.571013e-004 -4.183533e-001 -1.121234e-001 1.666691e-001 4.015809e-002 -5.889229e-002 -2.208519e-002 -9.229284e-002 + 4 + 27 + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-8_12-XP_C1_S1.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-8_12-XP_C1_S1.xml new file mode 100644 index 0000000..3c0106f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/fbcsp-spatial-filter-8_12-XP_C1_S1.xml @@ -0,0 +1,6 @@ + + 1.199483e-001 -3.403686e-001 2.988684e-001 -1.640757e-001 4.565856e-002 -2.936950e-001 -1.543861e-001 1.806009e-002 -9.658483e-002 -1.630183e-001 2.146793e-001 -5.229731e-002 3.931183e-001 2.388333e-002 -2.386025e-001 9.090241e-002 -9.502322e-002 4.967983e-002 -1.400008e-002 -2.046021e-001 7.746046e-002 4.954081e-001 -1.397272e-001 9.060025e-002 -2.498276e-002 5.088924e-002 7.234343e-003 -1.866368e-001 -1.920886e-001 -2.241053e-001 3.776548e-001 -1.395275e-001 1.079689e-001 -1.173868e-002 4.895020e-002 -5.156917e-001 -1.452638e-001 -3.894700e-002 -1.000138e-002 5.767350e-001 1.194858e-001 -2.683949e-002 1.173054e-001 -1.435366e-002 7.119313e-002 9.585040e-003 7.371025e-002 1.019215e-001 3.385993e-002 -7.061900e-002 3.437932e-002 -1.474120e-001 -4.436800e-003 3.837629e-002 7.575168e-002 -7.422725e-002 -2.142687e-001 -1.625570e-001 1.475486e-001 3.877461e-001 1.910804e-001 -9.437792e-002 1.178830e-001 1.522105e-001 -1.225161e-001 1.264046e-001 -1.053151e-001 -1.932098e-001 5.714481e-002 -2.730000e-002 8.576421e-002 1.421483e-001 -1.800491e-001 -1.590703e-001 2.553620e-001 -2.171987e-001 1.640030e-001 -1.096738e-001 -5.228987e-001 4.326568e-002 2.578889e-001 4.548264e-002 -1.478705e-001 1.258163e-001 2.381192e-001 -9.764365e-002 2.874216e-001 -1.972927e-001 1.324574e-001 -3.221660e-001 -1.466983e-002 -2.117736e-001 -1.962622e-001 2.599352e-001 6.367147e-002 8.653492e-002 2.150161e-001 -1.276579e-002 3.652581e-001 -2.524469e-001 1.479568e-001 -1.673769e-001 -6.264181e-002 -1.057694e-001 -3.475107e-001 1.921232e-001 -1.247931e-001 8.145640e-002 + 4 + 27 + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/features-selected-XP_C1_S1.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/features-selected-XP_C1_S1.xml new file mode 100644 index 0000000..c56cd09 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/features-selected-XP_C1_S1.xml @@ -0,0 +1,3 @@ + + 2;8;34;13 + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/mi-bci-graz-stimulator.lua b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/mi-bci-graz-stimulator.lua new file mode 100644 index 0000000..64fcd8b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/mi-bci-graz-stimulator.lua @@ -0,0 +1,96 @@ + +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + number_of_trials = box:get_setting(2) + first_class = _G[box:get_setting(3)] + second_class = _G[box:get_setting(4)] + baseline_duration = box:get_setting(5) + wait_for_beep_duration = box:get_setting(6) + wait_for_cue_duration = box:get_setting(7) + display_cue_duration = box:get_setting(8) + feedback_duration = box:get_setting(9) + end_of_trial_min_duration = box:get_setting(10) + end_of_trial_max_duration = box:get_setting(11) + + -- initializes random seed + math.randomseed(os.time()) + + -- fill the sequence table with predifined order + sequence = {} + for i = 1, number_of_trials do + table.insert(sequence, 1, first_class) + table.insert(sequence, 1, second_class) + end + + -- randomize the sequence + for i = 1, number_of_trials do + a = math.random(1, number_of_trials*2) + b = math.random(1, number_of_trials*2) + swap = sequence[a] + sequence[a] = sequence[b] + sequence[b] = swap + end + +end + +function process(box) + + local t=0 + + -- manages baseline + + box:send_stimulation(1, OVTK_StimulationId_ExperimentStart, t, 0) + t = t + 5 + + -- box:send_stimulation(1, OVTK_StimulationId_BaselineStart, t, 0) + -- box:send_stimulation(1, OVTK_StimulationId_Beep, t, 0) + -- t = t + baseline_duration + + -- box:send_stimulation(1, OVTK_StimulationId_BaselineStop, t, 0) + -- box:send_stimulation(1, OVTK_StimulationId_Beep, t, 0) + -- t = t + 5 + + -- manages trials + + for i = 1, number_of_trials*2 do + + -- first display cross on screen + + box:send_stimulation(1, OVTK_GDF_Start_Of_Trial, t, 0) + box:send_stimulation(1, OVTK_GDF_Cross_On_Screen, t, 0) + t = t + wait_for_beep_duration + + -- warn the user the cue is going to appear + + box:send_stimulation(1, OVTK_StimulationId_Beep, t, 0) + t = t + wait_for_cue_duration + + -- display cue + + box:send_stimulation(1, sequence[i], t, 0) + t = t + display_cue_duration + + -- provide feedback + + box:send_stimulation(1, OVTK_GDF_Feedback_Continuous, t, 0) + t = t + feedback_duration + + -- ends trial + + box:send_stimulation(1, OVTK_GDF_End_Of_Trial, t, 0) + t = t + math.random(end_of_trial_min_duration, end_of_trial_max_duration) + + end + + -- send end for completeness + box:send_stimulation(1, OVTK_GDF_End_Of_Session, t, 0) + t = t + 5 + + box:send_stimulation(1, OVTK_StimulationId_Train, t, 0) + t = t + 5 + -- used to cause the acquisition scenario to stop + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, t, 0) + +end diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/scenario-baseline.lua b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/scenario-baseline.lua new file mode 100644 index 0000000..d1bb6d6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/scripts/scenario-baseline.lua @@ -0,0 +1,31 @@ + +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + baseline_duration = box:get_setting(2) + +end + +function process(box) + + local t=0 + + -- manages baseline + + box:send_stimulation(1, OVTK_StimulationId_ExperimentStart, t, 0) + t = t + 5 + + box:send_stimulation(1, OVTK_StimulationId_BaselineStart, t, 0) + box:send_stimulation(1, OVTK_GDF_Cross_On_Screen, t, 0) + box:send_stimulation(1, OVTK_StimulationId_Beep, t, 0) + t = t + baseline_duration + + box:send_stimulation(1, OVTK_StimulationId_BaselineStop, t, 0) + box:send_stimulation(1, OVTK_StimulationId_Beep, t, 0) + t = t + 2 + + -- used to cause the acquisition scenario to stop + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, t, 0) + +end diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/sham.ov b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/sham.ov new file mode 100644 index 0000000..cec88e0 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/sham.ov differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/signals/README.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/signals/README.txt new file mode 100644 index 0000000..8eaa204 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/bci-examples/signals/README.txt @@ -0,0 +1,3 @@ + +The scenario will record its signals here. + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/box-tutorials/features-selection-trainer.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/box-tutorials/features-selection-trainer.xml new file mode 100644 index 0000000..4ff280c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/box-tutorials/features-selection-trainer.xml @@ -0,0 +1,2086 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x000014de, 0x00002e9d) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + 1 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 272 + + + (0x4e7b798a, 0x183beafb) + (0x88a4a7f6, 0x4180bdb0) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x000014de, 0x00002e9e) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + 1 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0x88a4a7f6, 0x4180bdb0) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x000014de, 0x00002e9f) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + 1 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x88a4a7f6, 0x4180bdb0) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x000014de, 0x00002ea0) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + 1 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0x88a4a7f6, 0x4180bdb0) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x000014de, 0x00002ea1) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + 1 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0x88a4a7f6, 0x4180bdb0) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x000014de, 0x00002ea2) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + 1 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0x88a4a7f6, 0x4180bdb0) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x000014de, 0x00002ea3) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + 1 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 944 + + + (0x4e7b798a, 0x183beafb) + (0x88a4a7f6, 0x4180bdb0) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x000014de, 0x00002ea4) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + 1 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x4e7b798a, 0x183beafb) + (0x88a4a7f6, 0x4180bdb0) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x000016ca, 0x00003754) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002130, 0x00002c30) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 2 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Train + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00002baa, 0x0000677c) + Features Selection Trainer + (0xee36249f, 0x22a32e6e) + + + (0x6f752dd0, 0x082a321e) + Train-Start Flag + + + (0x17341935, 0x152ff448) + Class 1 + + + (0x17341935, 0x152ff448) + Class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-Completed Flag + + + + + (0xa88b3667, 0x0871638c) + Log Level + Information + Information + false + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save Feature Selection + ${Player_ScenarioDirectory}/my-classifier.xml + ${Player_ScenarioDirectory}/features-selected.xml + false + + + (0x5261636b, 0x46534d45) + Method + mRMR (minimum Redundancy Maximum Relevance) + mRMR (minimum Redundancy Maximum Relevance) + false + + + (0x007deef9, 0x2f3e95c6) + Number of features to select + 2 + 2 + false + + + (0x2cdb2f0b, 0x12f231ea) + Discretisation + true + true + false + + + (0x512a166f, 0x5c3ef83f) + Threshold + 0.0 + 0.0 + false + + + (0x5261636b, 0x6d524d52) + mRMR Method + MID + MID + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x4e7b798a, 0x183beafb) + (0xd7b82a3a, 0x7e084998) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 8 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003153, 0x000015d1) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x1467a560, 0x62fd7899) + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0xb8c8835e, 0x1e2c7cd9) + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + (0x984c9b43, 0xcec2766d) + (0x544a003e, 0x6dcba5f6) + Input stream 4 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003153, 0x000015d2) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x1467a560, 0x62fd7899) + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0xb8c8835e, 0x1e2c7cd9) + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + (0x984c9b43, 0xcec2766d) + (0x544a003e, 0x6dcba5f6) + Input stream 4 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000333e, 0x00004ae3) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000520b, 0x000068f6) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 272 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000520b, 0x000068f7) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000520b, 0x000068f8) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000520b, 0x000068f9) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000520b, 0x000068fa) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000520b, 0x000068fb) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000520b, 0x000068fc) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 944 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000520b, 0x000068fd) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000069d0, 0x00007ac3) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 272 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000069d0, 0x00007ac4) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000069d0, 0x00007ac5) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000069d0, 0x00007ac6) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000069d0, 0x00007ac7) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000069d0, 0x00007ac8) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000069d0, 0x00007ac9) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 944 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000069d0, 0x00007aca) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000023ca, 0x000015c9) + + (0x000014de, 0x00002e9d) + 0 + + + (0x0000520b, 0x000068f6) + 0 + + + + (0x000023ca, 0x000015ca) + + (0x000014de, 0x00002e9e) + 0 + + + (0x0000520b, 0x000068f7) + 0 + + + + (0x000023ca, 0x000015cb) + + (0x000014de, 0x00002e9f) + 0 + + + (0x0000520b, 0x000068f8) + 0 + + + + (0x000023ca, 0x000015cc) + + (0x000014de, 0x00002ea0) + 0 + + + (0x0000520b, 0x000068f9) + 0 + + + + (0x000023ca, 0x000015cd) + + (0x000014de, 0x00002ea1) + 0 + + + (0x0000520b, 0x000068fa) + 0 + + + + (0x000023ca, 0x000015ce) + + (0x000014de, 0x00002ea2) + 0 + + + (0x0000520b, 0x000068fb) + 0 + + + + (0x000023ca, 0x000015cf) + + (0x000014de, 0x00002ea3) + 0 + + + (0x0000520b, 0x000068fc) + 0 + + + + (0x000023ca, 0x000015d0) + + (0x000014de, 0x00002ea4) + 0 + + + (0x0000520b, 0x000068fd) + 0 + + + + (0x00002ad9, 0x000012a4) + + (0x00002130, 0x00002c30) + 0 + + + (0x00002baa, 0x0000677c) + 0 + + + + (0x00002eae, 0x00003da1) + + (0x000069d0, 0x00007ac6) + 0 + + + (0x00003153, 0x000015d1) + (0x984c9b43, 0xcec2766d) + + + + (0x00002eae, 0x00003da2) + + (0x000069d0, 0x00007aca) + 0 + + + (0x00003153, 0x000015d2) + (0x984c9b43, 0xcec2766d) + + + + (0x00003751, 0x000064ff) + + (0x00002baa, 0x0000677c) + 0 + + + (0x0000333e, 0x00004ae3) + 0 + + + + (0x00003921, 0x000061e9) + + (0x00003153, 0x000015d1) + 0 + + + (0x00002baa, 0x0000677c) + 1 + + + + (0x0000588a, 0x000057f4) + + (0x00002baa, 0x0000677c) + 0 + + + (0x000016ca, 0x00003754) + 0 + + + + (0x00005e1b, 0x00005452) + + (0x000069d0, 0x00007ac4) + 0 + + + (0x00003153, 0x000015d1) + (0x1467a560, 0x62fd7899) + + + + (0x00005e1b, 0x00005453) + + (0x000069d0, 0x00007ac8) + 0 + + + (0x00003153, 0x000015d2) + (0x1467a560, 0x62fd7899) + + + + (0x00006ccd, 0x00003257) + + (0x000069d0, 0x00007ac3) + 0 + + + (0x00003153, 0x000015d1) + 0 + + + + (0x00006ccd, 0x00003258) + + (0x000069d0, 0x00007ac7) + 0 + + + (0x00003153, 0x000015d2) + 0 + + + + (0x0000711f, 0x00006c22) + + (0x00003153, 0x000015d2) + 0 + + + (0x00002baa, 0x0000677c) + 2 + + + + (0x000075c1, 0x0000468d) + + (0x0000520b, 0x000068f6) + 0 + + + (0x000069d0, 0x00007ac3) + 0 + + + + (0x000075c1, 0x0000468e) + + (0x0000520b, 0x000068f7) + 0 + + + (0x000069d0, 0x00007ac4) + 0 + + + + (0x000075c1, 0x0000468f) + + (0x0000520b, 0x000068f8) + 0 + + + (0x000069d0, 0x00007ac5) + 0 + + + + (0x000075c1, 0x00004690) + + (0x0000520b, 0x000068f9) + 0 + + + (0x000069d0, 0x00007ac6) + 0 + + + + (0x000075c1, 0x00004691) + + (0x0000520b, 0x000068fa) + 0 + + + (0x000069d0, 0x00007ac7) + 0 + + + + (0x000075c1, 0x00004692) + + (0x0000520b, 0x000068fb) + 0 + + + (0x000069d0, 0x00007ac8) + 0 + + + + (0x000075c1, 0x00004693) + + (0x0000520b, 0x000068fc) + 0 + + + (0x000069d0, 0x00007ac9) + 0 + + + + (0x000075c1, 0x00004694) + + (0x0000520b, 0x000068fd) + 0 + + + (0x000069d0, 0x00007aca) + 0 + + + + (0x000077fd, 0x00003014) + + (0x000069d0, 0x00007ac5) + 0 + + + (0x00003153, 0x000015d1) + (0xb8c8835e, 0x1e2c7cd9) + + + + (0x000077fd, 0x00003015) + + (0x000069d0, 0x00007ac9) + 0 + + + (0x00003153, 0x000015d2) + (0xb8c8835e, 0x1e2c7cd9) + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"height":320,"identifier":"(0x00003820, 0x000008c9)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00005d8b, 0x000029a4)","index":0,"name":"Default tab","parentIdentifier":"(0x00003820, 0x000008c9)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00002efb, 0x00003d85)","index":1,"name":"config","parentIdentifier":"(0x00003820, 0x000008c9)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000063e7, 0x000031ad)","index":0,"name":"Empty","parentIdentifier":"(0x00005d8b, 0x000029a4)","type":0},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00003d1b, 0x000063a7)","index":0,"name":"Empty","parentIdentifier":"(0x00002efb, 0x00003d85)","type":0}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Features Selection Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/box-tutorials/features-selector.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/box-tutorials/features-selector.xml new file mode 100644 index 0000000..0e1d7c2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/box-tutorials/features-selector.xml @@ -0,0 +1,441 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x000014de, 0x00002ea2) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + 1 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x4e7b798a, 0x183beafb) + (0x88a4a7f6, 0x4180bdb0) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x00003153, 0x000015d2) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004b6f, 0x00006626) + Features Selector + (0xee36249f, 0x22a32e7e) + + + (0x17341935, 0x152ff448) + Input + + + + + (0x17341935, 0x152ff448) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Features List + : + :;2:;:2;3; + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x4e7b798a, 0x183beafb) + (0x72567519, 0xdbac3ad5) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000520b, 0x000068fb) + + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000057a8, 0x00007dab) + Matrix Display + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000069d0, 0x00007ac8) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000023ca, 0x000015ce) + + (0x000014de, 0x00002ea2) + 0 + + + (0x0000520b, 0x000068fb) + 0 + + + + (0x0000443d, 0x00003bfc) + + (0x00004b6f, 0x00006626) + 0 + + + (0x000057a8, 0x00007dab) + 0 + + + + (0x000051db, 0x00003cdb) + + (0x000069d0, 0x00007ac8) + 0 + + + (0x00003153, 0x000015d2) + 0 + + + + (0x00006e2c, 0x00001a06) + + (0x00003153, 0x000015d2) + 0 + + + (0x00004b6f, 0x00006626) + 0 + + + + (0x000075c1, 0x00004692) + + (0x0000520b, 0x000068fb) + 0 + + + (0x000069d0, 0x00007ac8) + 0 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"height":320,"identifier":"(0x00003820, 0x000008c9)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0x000057a8, 0x00007dab)","childCount":0,"identifier":"(0x00006e31, 0x000046e8)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00005d8b, 0x000029a4)","index":0,"name":"Default tab","parentIdentifier":"(0x00003820, 0x000008c9)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00002efb, 0x00003d85)","index":1,"name":"config","parentIdentifier":"(0x00003820, 0x000008c9)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000063e7, 0x000031ad)","index":0,"name":"Empty","parentIdentifier":"(0x00005d8b, 0x000029a4)","type":0},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00003d1b, 0x000063a7)","index":0,"name":"Empty","parentIdentifier":"(0x00002efb, 0x00003d85)","type":0}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Features Selection Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/doc/Doc_BoxAlgorithm_FeaturesSelectionTrainer.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/doc/Doc_BoxAlgorithm_FeaturesSelectionTrainer.dox-part new file mode 100644 index 0000000..a775fbe --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/doc/Doc_BoxAlgorithm_FeaturesSelectionTrainer.dox-part @@ -0,0 +1,95 @@ +/** + * \page BoxAlgorithm_FeaturesSelectionTrainer Features Selection Trainer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Description| + * This box stack all feature vector received in input and launch the selection method when a stimulation is received. Actual method is mRMR (minimum Redundancy Maximum Relevance). + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Inputs| + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Input1| + * Stimulation to start the training. + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Input1| + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Input2| + * Input for Class 1. + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Input2| + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Input3| + * Input for Class 2. + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Input3| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Outputs| + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Output1| + * Send \"OVTK_StimulationId_TrainCompleted\" when train is completed. + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Settings| + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Settings| + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Setting1| + * Log Level (None to see nothing). + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Setting2| + * Stimulation that starts the computation. + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Setting3| + * Filename to save a configuration file for Features Selector Box. + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Setting4| + * Method to use (actually only mRMR is possible) + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Setting5| + * Final Number of Features + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Setting6| + * Apply Discretization of samples or not for compute. + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Setting7| + * Threshold for compute. + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Setting7| + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Setting8| + * mRMR method (MID or MIQ). + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Setting8| + +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Examples| + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelectionTrainer_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelectionTrainer_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/doc/Doc_BoxAlgorithm_FeaturesSelector.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/doc/Doc_BoxAlgorithm_FeaturesSelector.dox-part new file mode 100644 index 0000000..c7b6e02 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/doc/Doc_BoxAlgorithm_FeaturesSelector.dox-part @@ -0,0 +1,63 @@ +/** + * \page BoxAlgorithm_FeaturesSelector Features Selector +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelector_Description| + * This box allows to restrict outgoing signal data to a subset of incoming data based on a list of features. It's possible to define multiple times the same Feature. + * Features are identified by their index. + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelector_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelector_Inputs| + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelector_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelector_Input1| + * The input feature vector which features should be selected. + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelector_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelector_Outputs| + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelector_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelector_Output1| + * The output feature vector with selected features. + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelector_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelector_Settings| + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelector_Settings| + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelector_Setting1| + * A semi colon separated list of channel identifiers. You must use the index of the channel. Also, ranges can be selected specifying first channel identifier, + * followed by a colon, followed by the second channel identifier. + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelector_Setting1| + +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelector_Examples| + * Suppose you want to select the first 8 features, The 2 first features, the 2 last features, and the 10 feature. + * You would then use the following string : [1:8;:2;2:;10]. + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelector_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeaturesSelector_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_FeaturesSelector_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/algorithm/CMRMR.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/algorithm/CMRMR.cpp new file mode 100644 index 0000000..3094f05 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/algorithm/CMRMR.cpp @@ -0,0 +1,334 @@ +#include "CMRMR.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include + +///-------------------- Public Functions -------------------- +///------------------------------------------------------------------------------------------------- +void CMRMR::reset() +{ + m_nFeatures = 0; + m_nSamples = 0; + //if (!m_classes.empty()) { for (auto& c : m_classes) { c.second.clear(); } } // useless + //if (!m_datas.empty()) { for (auto& d : m_datas) { d.clear(); } } // useless + //if (!m_discretized.empty()) { for (auto& d : m_discretized) { d.clear(); } } // useless + m_classes.clear(); + m_datas.clear(); + m_discretized.clear(); +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +std::string CMRMR::print() const +{ + std::stringstream ss; + ss << "Datas contain " << m_nFeatures << " Features, with " << m_nSamples << " samples, for " << m_classes.size() << " Classes ("; + size_t i = 0; + for (auto& it : m_classes) + { + if (i != 0) { ss << ", "; } + ss << "Class " << i++ << " : " << "id(" << it.first << "), " << it.second.size() << " samples"; + } + ss << ")." << std::endl; + ss << "Datas are " << (m_discretized.empty() ? "not " : "") << "z-scored and discretize." << std::endl; + return ss.str(); +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMRMR::readCSV(const std::string& filename) +{ + reset(); + std::ifstream file; + file.open(filename); + if (!file.is_open()) + { + std::cerr << "File cannot be opened." << std::endl; + return false; + } + + std::string header; + if (!getline(file, header)) + { + std::cerr << "Header can not be read." << std::endl; + return false; + } + + m_nFeatures = std::count(header.begin(), header.end(), ','); + m_nSamples = 0; + + std::string line; + while (getline(file, line)) + { + if (std::count(line.begin(), line.end(), ',') != m_nFeatures) + { + std::cerr << "not same number of features : " << std::count(line.begin(), line.end(), ',') << "expected : " << m_nFeatures << std::endl; + return false; + } + std::vector sample; + sample.reserve(m_nFeatures); + int classId; + double value; + char sep; + std::stringstream ss(line); + ss >> classId; + while (ss >> sep >> value) { sample.push_back(value); } + if (sample.size() != m_nFeatures) + { + std::cerr << "not found good number of features : " << sample.size() << "expected : " << m_nFeatures << std::endl; + return false; + } + m_datas.push_back(std::move(sample)); + + // Update class list + auto it = m_classes.find(classId); + if (it == m_classes.end()) + { + m_classes.emplace(classId, std::vector()); + it = m_classes.find(classId); + } + it->second.push_back(m_nSamples++); + } + + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMRMR::setDatas(const std::vector>& datas, const std::vector& classes) +{ + reset(); + return addDatas(datas, classes); +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMRMR::addDatas(const std::vector>& datas, const std::vector& classes) +{ + const size_t n = datas.size(); + if (n != classes.size()) + { + std::cerr << "not same number of sample between datas and classes : " << n << " VS " << classes.size() << std::endl; + return false; + } + for (size_t i = 0; i < n; ++i) { if (!addSample(datas[i], classes[i])) { return false; } } + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CMRMR::addSample(const std::vector& sample, const int classId) +{ + if (m_nSamples == 0) { m_nFeatures = sample.size(); } + else if (m_nFeatures != sample.size()) + { + std::cerr << "not same number of features between sample and previous samples : " << sample.size() << " VS " << m_nFeatures << std::endl; + return false; + } + + // Update datas + m_datas.push_back(sample); + + // Update class list + auto it = m_classes.find(classId); + if (it == m_classes.end()) + { + m_classes.emplace(classId, std::vector()); + it = m_classes.find(classId); + } + it->second.push_back(m_nSamples++); + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +std::vector CMRMR::process(const double threshold, const size_t nFeatures, const EMRMRMethod method) +{ + if (m_nSamples == 0 || m_nFeatures == 0) { return std::vector(); } + m_discretized.reserve(m_nSamples); + for (auto&& v : m_datas) { m_discretized.emplace_back(std::begin(v), std::end(v)); } + + if (threshold != std::numeric_limits::infinity()) + { + m_discretized.resize(m_nSamples); + for (auto& d : m_discretized) { d.resize(m_nFeatures); } + zScore(); // Compute zScore + discretize(threshold); // Compute discretization + } + return mRMR(nFeatures, method); // Apply mRMR Algorithm +} +///------------------------------------------------------------------------------------------------- + +///-------------------- Private Functions -------------------- +///------------------------------------------------------------------------------------------------- +std::vector CMRMR::class2IdxVector(size_t& n) const +{ + std::vector res; + res.resize(m_nSamples); // Features from all samples + int min = std::numeric_limits::max(); + int max = std::numeric_limits::min(); + + for (const auto& m : m_classes) + { + const int tmp = m.first; + if (min > tmp) { min = tmp; } + if (max < tmp) { max = tmp; } + for (const auto& sampleIdx : m.second) { res[sampleIdx] = tmp; } + } + for (auto& v : res) { v -= min; } // transform to 0 to n Indexes + n = size_t(max - min + 1); + return res; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +std::vector CMRMR::discret2IdxVector(const size_t feature, size_t& n) const +{ + std::vector res; + res.reserve(m_nSamples); // Features from all samples + int min = m_discretized[0][feature]; + int max = m_discretized[0][feature]; + for (const auto& d : m_discretized) + { + const int tmp = int(round(d[feature])); + res.push_back(tmp); + if (min > tmp) { min = tmp; } + if (max < tmp) { max = tmp; } + } + for (auto& id : res) { id -= min; } // transform to 0 to n Indexes + n = size_t(max - min + 1); + return res; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +void CMRMR::zScore() +{ + // We z-score by feature (so column by column) + for (size_t j = 0; j < m_nFeatures; ++j) + { + double sum = 0.0; + for (const auto& d : m_datas) { sum += d[j]; } + const double mean = sum / double(m_nSamples); + sum = 0.0; + for (const auto& d : m_datas) + { + const double tmp = d[j] - mean; + sum += tmp * tmp; + } + const double std = (m_nSamples == 1) ? 0 : sqrt(sum / double(m_nSamples - 1)); //m_nSamples - 1 is an unbiased version for Gaussian + for (size_t i = 0; i < m_nSamples; ++i) { m_discretized[i][j] = (m_datas[i][j] - mean) / std; } + } +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +void CMRMR::discretize(const double threshold) +{ + for (auto& sample : m_discretized) + { + for (auto& feature : sample) + { + if (feature > threshold) { feature = 1; } + else if (feature < -threshold) { feature = -1; } + else { feature = 0; } + } + } +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +double CMRMR::mutualInfo(const size_t feature1, const size_t feature2) const +{ + if ((feature1 != size_t(-1) && feature1 >= m_nFeatures) || (feature2 != size_t(-1) && feature2 >= m_nFeatures)) { return -1; } + + // Copy Datas in int vector of size n_sample + size_t nstate1, nstate2; + std::vector v1 = (feature1 != size_t(-1)) ? discret2IdxVector(feature1, nstate1) : class2IdxVector(nstate1); + std::vector v2 = (feature2 != size_t(-1)) ? discret2IdxVector(feature2, nstate2) : class2IdxVector(nstate2); + + // Joint Probabilities + std::vector> jointProba(nstate1, std::vector(nstate2, 0.0)); + for (size_t i = 0; i < m_nSamples; ++i) { jointProba[v1[i]][v2[i]]++; } + for (auto& row : jointProba) { for (auto& cell : row) { cell /= m_nSamples; } } + + // Mutual Information + std::vector proba1(nstate1, 0.0), proba2(nstate2, 0.0); + for (size_t i = 0; i < nstate1; ++i) + { + for (size_t j = 0; j < nstate2; ++j) + { + proba1[i] += jointProba[i][j]; + proba2[j] += jointProba[i][j]; + } + } + + double res = 0.0; + for (size_t i = 0; i < nstate1; ++i) + { + for (size_t j = 0; j < nstate2; ++j) + { + if (jointProba[i][j] != 0 && proba1[i] != 0 && proba2[j] != 0) { res += jointProba[i][j] * log(jointProba[i][j] / proba1[i] / proba2[j]); } + } + } + res /= log(2); + return res; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +std::vector CMRMR::mRMR(const size_t nFeatures, const EMRMRMethod method) const +{ + if (nFeatures == 0) { return std::vector(); } + const size_t n = ((nFeatures < m_nFeatures) ? nFeatures : m_nFeatures); + std::vector res(n); + + // Initialize selection + std::vector mutualInfos; + std::vector mask(m_nFeatures, true); + mutualInfos.reserve(m_nFeatures); + for (size_t i = 0; i < m_nFeatures; ++i) { mutualInfos.push_back(mutualInfo(size_t(-1), i)); } // Compute Mutual infos with classId + //const double entropy = mutualInfo(size_t(-1), size_t(-1)); // the entropy of target classification variable + + // Sort in Descending Order + std::vector indexes(m_nFeatures); + iota(indexes.begin(), indexes.end(), 0); + stable_sort(indexes.begin(), indexes.end(), [&mutualInfos](const size_t i1, const size_t i2) { return mutualInfos[i1] > mutualInfos[i2]; }); + //stable_sort(mutualInfos.begin(), mutualInfos.end(), greater()); // Useless + + + //mRMR selection + res[0] = indexes[0]; // We have the first Feature + mask[indexes[0]] = false; // After selection, no longer consider this feature + for (size_t i = 1; i < n; ++i) //the first one, res[0] has been determined already + { + double score = std::numeric_limits::min(); + for (const auto& id : indexes) + { + if (!mask[id]) { continue; } // We skeep this Id + const double relevance = mutualInfos[id]; + double redundancy = 0; + for (size_t j = 0; j < i; ++j) { redundancy += mutualInfo(res[j], id); } + redundancy /= double(i); + + // If more methods, a switch is preferable + const double tmp = (method == EMRMRMethod::MID) ? relevance - redundancy : relevance / (redundancy + 0.0001); + if (score < tmp) //update the best feature found and the score + { + score = tmp; + res[i] = id; + } + } + // Remove from the id list the final selection with the mask, we can remove index from indexes vector instead of use mask + // (a test can be make to find wich method of mask and vector modification is faster) + mask[res[i]] = false; + } + return res; +} +///------------------------------------------------------------------------------------------------- diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/algorithm/CMRMR.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/algorithm/CMRMR.hpp new file mode 100644 index 0000000..ea4412b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/algorithm/CMRMR.hpp @@ -0,0 +1,148 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CMRMR.hpp +/// \brief mRMR (minimum Redundancy Maximum Relevance) Feature Selection Class. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 03/02/2020. +/// \copyright GNU Affero General Public License v3.0. +/// \remarks +/// - This Algorithm is the same principle as Hanchuan Peng et al. (License). The difference is in the implementation in C++. +/// - Paper : Feature selection based on mutual information: criteria of max-dependency, max-relevance, and min-redundancy, here \n +/// Hanchuan Peng, Fuhui Long, and Chris Ding, IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 27, No. 8, pp.1226-1238, 2005. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include +#include +#include +#include + +enum class EMRMRMethod { MID, MIQ }; + +inline std::string toString(const EMRMRMethod& e) +{ + switch (e) + { + case EMRMRMethod::MIQ: return "MIQ"; + case EMRMRMethod::MID: return "MID"; + default: return "MID"; + } +} + +class CMRMR +{ +public: + /// Initializes a new instance of the class. + CMRMR() = default; + + /// Finalizes an instance of the class. + ~CMRMR() { reset(); } + + /// Reset all member of this object. + void reset(); + + /// Prints some informations. + //// the string with some informations. + std::string print() const; + + /// Reads the CSV file (with example format in http://home.penglab.com/proj/mRMR/ website). + /// The filename. + /// True if Succes, False if Fail. + bool readCSV(const std::string& filename); + + /// Reset previous datas and set this datas. + /// The datas. + /// The classes of each sample. + /// True if success, False if fail (not same number of sample on two parameters or not same feature on each datas). + bool setDatas(const std::vector>& datas, const std::vector& classes); + + /// add this datas to actual. + /// The datas. + /// The classes of each sample. + /// True if success, False if fail (not same number of sample on two parameters or not same number of feature on each datas). + bool addDatas(const std::vector>& datas, const std::vector& classes); + + /// add this sample to datas. + /// The sample. + /// The classes of this sample. + /// True if success, False if fail (not same number feature than previous datas). + bool addSample(const std::vector& sample, const int classId); + + /// Gets the datas. + /// datas (std::vector>) + std::vector> getDatas() const { return m_datas; } + + /// Gets the discretized datas. + /// discretized datas (std::vector>) + std::vector> getDiscretized() const { return m_discretized; } + /// Gets the classes list with for each classes the Ids of sample concerned. + /// classes (std::map>) + std::map> getClasses() const { return m_classes; } + size_t getSampleCount() const { return m_nSamples; } + size_t getFeaturesCount() const { return m_nFeatures; } + + /// Apply the mRMR algorithm after compute zscore and discretisation. + /// The threshold for discretization (if infinity we only use z-score). + /// The number of features to keep. Default 500 is the original theorical max of the method (not needed but a wink to the origin). + /// Method Used for mRMR. + /// + std::vector process(const double threshold = std::numeric_limits::infinity(), const size_t nFeatures = 500, + const EMRMRMethod method = EMRMRMethod::MID); + + /// Override the ostream operator. + /// The ostream. + /// The object. + /// Return the modified ostream. + friend std::ostream& operator <<(std::ostream& os, const CMRMR& obj) { return (os << obj.print()); } + +private: + size_t m_nFeatures = 0; // Number of Features + size_t m_nSamples = 0; // Number of Samples + std::map> m_classes; // Datas in the format class -> vector id sample + std::vector> m_datas; // Datas in the format sample -> features + std::vector> m_discretized; // Datas in the format sample -> features discretized (z-score or z-score + discretization) + + + std::vector class2IdxVector(size_t& n) const; + std::vector discret2IdxVector(const size_t feature, size_t& n) const; + + /// Compute the z-score. + /// z-score is compute for each feature separatly.\n + /// -# Compute Mean of feature \f$ \mu = \frac{1}{n}\sum_{i=1}^{n}(x_{i}) \f$ \n + /// -# Compute The Unbiased estimation of standard deviation \f$ \sigma = \sqrt{\frac{\sum_{i=1}^{n}(x_{i} - \mu)^{2}}{n - 1}} \f$\n + /// -# Compute The z-score \f$ z_i = \frac{x_{i} - \mu}{\sigma} \f$ + void zScore(); + + /// Discretizes the datas with the specified threshold (value became in set \f$ \{-1,0,1\} \f$). + /// The threshold for discretization. + void discretize(const double threshold); + + /// Mutuals the information. + /// The mutual Information is the a measure of the mutual dependence between the two features.\n + /// -# We get the value of the feature (with z-score the value is in set \f$ \{-1,0,1\} \f$ and became in set \f$ \{0,1,2\} \f$ for the next step.\n + /// -# We make a matrix with the probability of each value sample by sample.\n + /// with \f$ s_i \f$ the sample \f$ i \f$, \f$ v^1_i \f$ the value of the first feature for \f$ s_i \f$ and \f$ v^2_i \f$ the value of the second feature for \f$ s_i \f$\n + /// \f$ m \f$ is the count of the common values of each sample (\f$\text{count}\left(s_i\left(v^1_i,v^2_i\right)\right)\text{, for each } i \in n\f$ \n + /// -# We commpute the mutal information.\n + /// With \f$ n_1 \f$ the number of state for feature 1, \f$ n_2 \f$ the number of state for feature 2. \f$ p \f$ the probability.\n + /// \f[ mi = \sum_{i\in n_1, j \in n_2}{p_{i,j} * \log\left(\frac{p_{i,j}}{p_{i} \times p_{j}}\right)} \f] + /// The feature number 1 (default (-1) is for use the classification target instead of feature). + /// The feature number 2 (default (-1) is for use the classification target instead of feature). + /// the mutal information. + double mutualInfo(const size_t feature1 = size_t(-1), const size_t feature2 = size_t(-1)) const; + + /// mRMR (minimum Redundancy Maximum Relevance Feature Selection) algorithm. + /// We use the method describe in the paper.\n + /// -# We Compute the relevance of each feature with the mutal info with the classification target.\n + /// -# We sort all in descending value and take the first feature.\n + /// -# We loop on all nexted features and compute for each the redundancy of the feature with previous selected features.\n + /// The feature with the best score, the score is compute with two method ()\n + /// \f[ \text{MID} = \text{relevance} - \text{redundancy}\text{, }\quad\text{MIQ} = \frac{\text{relevance}}{\text{redundancy} + 10^{-3}}\f] + /// The number of features to keep. Default 500 is the original theorical max of the method (not needed but a wink to the origin). + /// Method Used for mRMR. + /// The selected indexes. + std::vector mRMR(const size_t nFeatures = 500, const EMRMRMethod method = EMRMRMethod::MID) const; +}; diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/boxes/CBoxAlgorithmFeaturesSelection.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/boxes/CBoxAlgorithmFeaturesSelection.cpp new file mode 100644 index 0000000..988069d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/boxes/CBoxAlgorithmFeaturesSelection.cpp @@ -0,0 +1,174 @@ +#include "CBoxAlgorithmFeaturesSelection.hpp" +#include + +namespace OpenViBE { +namespace Plugins { +namespace FeaturesSelection { + +///------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmFeaturesSelection::initialize() +{ + // Stimulations + m_stimDecoder.initialize(*this, 0); + m_iStim = m_stimDecoder.getOutputStimulationSet(); + m_stimEncoder.initialize(*this, 0); + m_oStim = m_stimEncoder.getInputStimulationSet(); + + // Classes + //m_featureDecoders.initialize(*this, 1); + const Kernel::IBox& boxCtx = this->getStaticBoxContext(); + m_nbClass = boxCtx.getInputCount() - 1; + m_featuresDecoders.resize(m_nbClass); + m_iFeatures.resize(m_nbClass); + for (size_t k = 0; k < m_nbClass; ++k) + { + m_featuresDecoders[k].initialize(*this, k + 1); + m_iFeatures[k] = m_featuresDecoders[k].getOutputMatrix(); + } + + auto& ctx = *this->getBoxAlgorithmContext(); + size_t idx = 0; + m_logLevel = Kernel::ELogLevel(uint64_t(FSettingValueAutoCast(ctx, idx++))); + m_stimName = FSettingValueAutoCast(ctx, idx++); + m_filename = CString(FSettingValueAutoCast(ctx, idx++)).toASCIIString(); + m_method = EFeatureSelection(uint64_t(FSettingValueAutoCast(ctx, idx++))); + m_nFinalFeatures = uint64_t(FSettingValueAutoCast(ctx, idx++)); + m_doDiscretization = FSettingValueAutoCast(ctx, idx++); + m_threshold = FSettingValueAutoCast(ctx, idx++); + m_mRMRMethod = EMRMRMethod(uint64_t(FSettingValueAutoCast(ctx, idx))); + m_selector.reset(); + + if (m_logLevel != Kernel::LogLevel_None) + { + getLogManager() << m_logLevel << "Trainer Initialized : \n\t" << m_nbClass << " Classes, Features Selection method is " + << toString(m_method) << " with " << m_nFinalFeatures << " Features to select,"; + if (m_doDiscretization) { getLogManager() << " with discretization (threshold = " << m_threshold << ")."; } + else { getLogManager() << " without discretization."; } + getLogManager() << "\n\tMethod used for mRMR is " << toString(m_mRMRMethod) << ".\n\t"; + if (m_filename.empty()) { getLogManager() << "Config not saved.\n"; } + else { getLogManager() << "Config saved in file\'" << m_filename << "\'.\n"; } + } + + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmFeaturesSelection::uninitialize() +{ + m_stimDecoder.uninitialize(); + m_stimEncoder.uninitialize(); + for (auto& codec : m_featuresDecoders) { codec.uninitialize(); } + m_featuresDecoders.clear(); + m_iFeatures.clear(); + + if (m_logLevel != Kernel::LogLevel_None) { getLogManager() << m_logLevel << "Trainer Uninitialized, selector infos : \n" << m_selector.print(); } + + m_selector.reset(); + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmFeaturesSelection::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmFeaturesSelection::process() +{ + if (m_isTrain) { return true; } // If train is made don't do process + + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + + //***** Stimulations (input 0) ***** + for (size_t i = 0; i < boxCtx.getInputChunkCount(0); ++i) + { + m_stimDecoder.decode(i); // Decode the chunk + const uint64_t start = boxCtx.getInputChunkStartTime(0, i), end = boxCtx.getInputChunkEndTime(0, i); // Time Code + + if (m_stimDecoder.isHeaderReceived()) // Header received + { + m_stimEncoder.encodeHeader(); + boxCtx.markOutputAsReadyToSend(0, 0, 0); + } + if (m_stimDecoder.isBufferReceived()) // Buffer received + { + for (size_t j = 0; j < m_iStim->getStimulationCount(); ++j) + { + if (m_iStim->getStimulationIdentifier(j) == m_stimName) + { + // Process + getLogManager() << m_logLevel << "Train Flag Received, selector infos : \n" << m_selector.print(); + m_result = m_selector.process((m_doDiscretization ? m_threshold : std::numeric_limits::infinity()), m_nFinalFeatures, m_mRMRMethod); + getLogManager() << m_logLevel << "Features selected :"; + for (const auto& r : m_result) { getLogManager() << " " << r; } + getLogManager() << "\n"; + + // Save File + if (!m_filename.empty()) { OV_ERROR_UNLESS_KRF(writeConfig(), "Error During File writing.", Kernel::ErrorType::BadFileWrite); } + + // Send Stimulation + const uint64_t stim = this->getTypeManager().getEnumerationEntryValueFromName(OV_TypeId_Stimulation, "OVTK_StimulationId_TrainCompleted"); + m_oStim->appendStimulation(stim, m_iStim->getStimulationDate(j), 0); + m_isTrain = true; + } + } + m_stimEncoder.encodeBuffer(); + boxCtx.markOutputAsReadyToSend(0, start, end); + } + if (m_stimDecoder.isEndReceived()) // End received + { + m_stimEncoder.encodeEnd(); + boxCtx.markOutputAsReadyToSend(0, start, end); + } + } + + + //***** Features (Input 1 to N) ***** + for (size_t k = 0; k < m_nbClass; ++k) + { + for (size_t i = 0; i < boxCtx.getInputChunkCount(k + 1); ++i) + { + m_featuresDecoders[k].decode(i); // Decode the chunk + OV_ERROR_UNLESS_KRF(m_iFeatures[k]->getDimensionCount() == 1, "Invalid Input Signal.", Kernel::ErrorType::BadInput); + + if (m_featuresDecoders[k].isBufferReceived()) // Buffer received + { + const size_t n = m_iFeatures[k]->getBufferElementCount(); + double* buffer = m_iFeatures[k]->getBuffer(); + //const std::vector sample(buffer, buffer + n); + m_selector.addSample(std::vector(buffer, buffer + n), int(k)); + //getLogManager() << m_logLevel << " Sample received for class " << k << "\n"; + } + } + } + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmFeaturesSelection::writeConfig() +{ + std::ofstream file; + file.open(m_filename); + OV_ERROR_UNLESS_KRF(file.is_open(), "File can't be opened.", Kernel::ErrorType::BadFileWrite); + + std::string sep; + file << "\n\t"; + for (const auto& r : m_result) + { + file << sep << r; + sep = ";"; + } + file << "\n"; + file.close(); + return true; +} +///------------------------------------------------------------------------------------------------- +} // namespace FeaturesSelection +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/boxes/CBoxAlgorithmFeaturesSelection.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/boxes/CBoxAlgorithmFeaturesSelection.hpp new file mode 100644 index 0000000..fd7e76e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/boxes/CBoxAlgorithmFeaturesSelection.hpp @@ -0,0 +1,133 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmFeaturesSelection.hpp +/// \brief Classes of the Box Features Selection Trainer. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 12/02/2020. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- +#pragma once + +#include "ovp_defines.h" + +#include +#include + +#include "algorithm/CMRMR.hpp" +#include + +#define OV_AttributeId_Box_FlagIsUnstable CIdentifier(0x666FFFFF, 0x666FFFFF) + +namespace OpenViBE { +namespace Plugins { +namespace FeaturesSelection { +/// The class CBoxAlgorithmFeaturesSelection describes the box Features Selection Trainer. +class CBoxAlgorithmFeaturesSelection final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_FeaturesSelection) + +protected: + //***** Codecs ***** + Toolkit::TStimulationDecoder m_stimDecoder; + Toolkit::TStimulationEncoder m_stimEncoder; + std::vector> m_featuresDecoders; + std::vector m_iFeatures; // Input Matrix pointer + IStimulationSet *m_iStim = nullptr, *m_oStim = nullptr; // Stimulation receiver/sender + + //***** Settings ***** + Kernel::ELogLevel m_logLevel = Kernel::LogLevel_Info; // Log Level + uint64_t m_stimName = OVTK_StimulationId_Train; // Name of stimulation to check for train lunch + std::string m_filename; + EFeatureSelection m_method = EFeatureSelection::MRMR; + + size_t m_nbClass = 2; // Number of input classes + bool m_isTrain = false; + + // mRMR Settings + CMRMR m_selector; + bool m_doDiscretization = true; // Check if we make Discretization + double m_threshold = 0.0; // Threshold for Discretisation + size_t m_nFinalFeatures = size_t(-1); // Number of Features in output + EMRMRMethod m_mRMRMethod = EMRMRMethod::MID; // mRMR Method + std::vector m_result; // mRMR Result + + bool writeConfig(); +}; + + +/// Listener of the box Features Selection Trainer. +class CBoxAlgorithmFeaturesSelectionListener final : public Toolkit::TBoxListener +{ +public: + + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + box.setInputType(index, OV_TypeId_FeatureVector); + box.setInputName(index, ("Class " + std::to_string(index)).c_str()); + return true; + } + + bool onInputRemoved(Kernel::IBox& box, const size_t index) override { return true; } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +/// Descriptor of the box Features Selection Trainer. +class CBoxAlgorithmFeaturesSelectionDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Features Selection Trainer"); } + CString getAuthorName() const override { return CString("Thibaut Monseigne"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Apply a Features Selection Algorithm"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Features Selection"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-execute"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_FeaturesSelection; } + IPluginObject* create() override { return new CBoxAlgorithmFeaturesSelection; } + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmFeaturesSelectionListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Train-Start Flag",OV_TypeId_Stimulations); + prototype.addInput("Class 1",OV_TypeId_FeatureVector); + prototype.addInput("Class 2",OV_TypeId_FeatureVector); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + + prototype.addOutput("Train-Completed Flag",OV_TypeId_Stimulations); + + prototype.addSetting("Log Level", OV_TypeId_LogLevel, "Information"); + prototype.addSetting("Train trigger", OV_TypeId_Stimulation, "OVTK_StimulationId_Train"); + prototype.addSetting("Filename to save Feature Selection", OV_TypeId_Filename, "${Player_ScenarioDirectory}/features-selected.xml"); + prototype.addSetting("Method", OVP_TypeId_Features_Selection_Method, toString(EFeatureSelection::MRMR).c_str()); + prototype.addSetting("Number of features to select", OV_TypeId_Integer, "2"); + prototype.addSetting("Discretisation", OV_TypeId_Boolean, "true"); + prototype.addSetting("Threshold", OV_TypeId_Float, "0.0"); + prototype.addSetting("mRMR Method", OVP_TypeId_mRMR_Method, "MID"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_FeaturesSelectionDesc) +}; +} // namespace FeaturesSelection +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/boxes/CBoxAlgorithmFeaturesSelector.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/boxes/CBoxAlgorithmFeaturesSelector.cpp new file mode 100644 index 0000000..2a7b776 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/boxes/CBoxAlgorithmFeaturesSelector.cpp @@ -0,0 +1,116 @@ +#include "CBoxAlgorithmFeaturesSelector.hpp" + +namespace OpenViBE { +namespace Plugins { +namespace FeaturesSelection { + +///------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmFeaturesSelector::initialize() +{ + m_decoder.initialize(*this, 0); + m_iMatrix = m_decoder.getOutputMatrix(); + m_encoder.initialize(*this, 0); + m_oMatrix = m_encoder.getInputMatrix(); + m_lookup.clear(); + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmFeaturesSelector::uninitialize() +{ + m_decoder.uninitialize(); + m_encoder.uninitialize(); + m_lookup.clear(); + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmFeaturesSelector::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmFeaturesSelector::process() +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxCtx.getInputChunkCount(0); ++i) + { + m_decoder.decode(i); // Decode the chunk + if (m_decoder.isHeaderReceived()) // Header Received + { + // Parse Setting + const std::string setting = CString(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)).toASCIIString(); + OV_ERROR_UNLESS_KRF(parseSetting(setting), "Parsing has failed", Kernel::ErrorType::BadSetting); + OV_ERROR_UNLESS_KRF(!m_lookup.empty(), "No channel selected", Kernel::ErrorType::BadConfig); + getLogManager() << Kernel::LogLevel_Debug << "Features selected :"; + for (const auto& r : m_lookup) { getLogManager() << " " << r; } + getLogManager() << "\n"; + + // Initialize Output Matrix + m_oMatrix->resize(m_lookup.size()); + m_oMatrix->resetBuffer(); + for (size_t j = 0; j < m_lookup.size(); ++j) { m_oMatrix->setDimensionLabel(0, j, m_iMatrix->getDimensionLabel(0, m_lookup[j])); } + m_encoder.encodeHeader(); + } + if (m_decoder.isBufferReceived()) // Buffer Received + { + const double* iBuffer = m_iMatrix->getBuffer(); + double* oBuffer = m_oMatrix->getBuffer(); + for (size_t j = 0; j < m_lookup.size(); ++j) { memcpy(oBuffer + j, iBuffer + m_lookup[j], sizeof(double)); } + m_encoder.encodeBuffer(); + } + if (m_decoder.isEndReceived()) { m_encoder.encodeEnd(); } // End Received + + boxCtx.markOutputAsReadyToSend(0, boxCtx.getInputChunkStartTime(0, i), boxCtx.getInputChunkEndTime(0, i)); + } + return true; +} + +bool CBoxAlgorithmFeaturesSelector::parseSetting(const std::string& setting) +{ + OV_ERROR_UNLESS_KRF(!setting.empty(), "Empty Setting is forbidden", Kernel::ErrorType::BadSetting); + std::stringstream ss(setting); + std::string token; + std::vector list; + while (std::getline(ss, token, OV_Value_EnumeratedStringSeparator)) { list.push_back(token); } + // Define Min Max + const size_t startIdx = 0, endIdx = m_iMatrix->getDimensionSize(0); // never update in case of duplication or changing order + size_t idx1, idx2; + char sep; + // For each token + for (const auto& tmp : list) + { + ss.clear(); + ss.str(tmp); + // Check if it's range + const std::size_t pos = tmp.find(OV_Value_RangeStringSeparator); + if (pos != std::string::npos) + { + if (tmp[0] == OV_Value_RangeStringSeparator) { idx1 = startIdx; } + else { ss >> idx1; } + ss >> sep; + if (tmp[tmp.length() - 1] == OV_Value_RangeStringSeparator) { idx2 = endIdx; } + else { ss >> idx2; } + OV_ERROR_UNLESS_KRF((idx1 < idx2 && idx2 <= endIdx), "Invalid Range String.", Kernel::ErrorType::BadSetting); + for (size_t i = idx1; i < idx2; ++i) { m_lookup.push_back(i); } + } + else + { + ss >> idx1; + OV_ERROR_UNLESS_KRF(idx1 <= endIdx, "Invalid Index.", Kernel::ErrorType::BadSetting); + m_lookup.push_back(idx1); + } + } + + return true; +} +///------------------------------------------------------------------------------------------------- +} // namespace FeaturesSelection +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/boxes/CBoxAlgorithmFeaturesSelector.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/boxes/CBoxAlgorithmFeaturesSelector.hpp new file mode 100644 index 0000000..d345d9b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/boxes/CBoxAlgorithmFeaturesSelector.hpp @@ -0,0 +1,84 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmFeaturesSelector.hpp +/// \brief Classes of the Box Features Selector. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 12/02/2020. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- +#pragma once + +#include "ovp_defines.h" + +#include +#include + +#include "algorithm/CMRMR.hpp" +#include + +namespace OpenViBE { +namespace Plugins { +namespace FeaturesSelection { +/// The class CBoxAlgorithmFeaturesSelector describes the box Features Selector. +class CBoxAlgorithmFeaturesSelector final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_FeaturesSelector) + +protected: + //***** Codecs ***** + Toolkit::TFeatureVectorDecoder m_decoder; + Toolkit::TFeatureVectorEncoder m_encoder; + CMatrix *m_iMatrix = nullptr, *m_oMatrix = nullptr; + + //***** Settings ***** + std::vector m_lookup; + + /// Parse the setting. + /// Setting to parse. + /// True if Setting is correctly parsed. + bool parseSetting(const std::string& setting); +}; + +/// Descriptor of the box Features Selector. +class CBoxAlgorithmFeaturesSelectorDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Features Selector"); } + CString getAuthorName() const override { return CString("Thibaut Monseigne"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Select a subset of features vector."); } + CString getDetailedDescription() const override { return CString("Select Features with index starting from 0."); } + CString getCategory() const override { return CString("Features Selection"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-sort-ascending"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_FeaturesSelector; } + IPluginObject* create() override { return new CBoxAlgorithmFeaturesSelector; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input", OV_TypeId_FeatureVector); + prototype.addOutput("Output", OV_TypeId_FeatureVector); + prototype.addSetting("Features List", OV_TypeId_String, ":"); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_FeaturesSelectorDesc) +}; +} // namespace FeaturesSelection +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/ovp_defines.h new file mode 100644 index 0000000..d7cc139 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/ovp_defines.h @@ -0,0 +1,30 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovp_defines.h +/// \brief Defines list for Setting, Shortcut Macro and const. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 12/02/2020. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once +#include + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_FeaturesSelection OpenViBE::CIdentifier(0xee36249f, 0x22a32e6e) +#define OVP_ClassId_BoxAlgorithm_FeaturesSelectionDesc OpenViBE::CIdentifier(0xee36249f, 0x22a32e6f) +#define OVP_ClassId_BoxAlgorithm_FeaturesSelector OpenViBE::CIdentifier(0xee36249f, 0x22a32e7e) +#define OVP_ClassId_BoxAlgorithm_FeaturesSelectorDesc OpenViBE::CIdentifier(0xee36249f, 0x22a32e7f) + +// Types Lists +//--------------------------------------------------------------------------------------------------- +#define OVP_TypeId_Features_Selection_Method OpenViBE::CIdentifier(0x5261636B, 0x46534D45) +#define OVP_TypeId_mRMR_Method OpenViBE::CIdentifier(0x5261636B, 0x6D524D52) + +enum class EFeatureSelection { MRMR }; + +//inline std::string toString(const EFeatureSelection& e) { switch (e) { default: return "mRMR (minimum Redundancy Maximum Relevance)"; } } +inline std::string toString(const EFeatureSelection& /*e*/) { return "mRMR (minimum Redundancy Maximum Relevance)"; } diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/ovp_main.cpp new file mode 100644 index 0000000..0acf5a6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/src/ovp_main.cpp @@ -0,0 +1,30 @@ +#include +#include "ovp_defines.h" + +// Boxes Includes +#include "boxes/CBoxAlgorithmFeaturesSelection.hpp" +#include "boxes/CBoxAlgorithmFeaturesSelector.hpp" + +namespace OpenViBE { +namespace Plugins { +namespace FeaturesSelection { + +OVP_Declare_Begin() + // Register boxes + OVP_Declare_New(CBoxAlgorithmFeaturesSelectionDesc); + OVP_Declare_New(CBoxAlgorithmFeaturesSelectorDesc); + + // Enumeration Feature Selection Method + context.getTypeManager().registerEnumerationType(OVP_TypeId_Features_Selection_Method, "Features Selection Method"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Features_Selection_Method, toString(EFeatureSelection::MRMR).c_str(), + size_t(EFeatureSelection::MRMR)); + + // Enumeration mRMR Method + context.getTypeManager().registerEnumerationType(OVP_TypeId_mRMR_Method, "mRMR Method"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_mRMR_Method, "MID", size_t(EMRMRMethod::MID)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_mRMR_Method, "MIQ", size_t(EMRMRMethod::MIQ)); + +OVP_Declare_End() +} // namespace FeaturesSelection +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/DartTestfile.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/DartTestfile.txt new file mode 100644 index 0000000..c775ed6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/DartTestfile.txt @@ -0,0 +1,33 @@ +IF(WIN32) + SET(EXT cmd) + SET(OS_FLAGS "--no-pause") +ELSE() + SET(EXT sh) + SET(OS_FLAGS "") +ENDIF() + +SET(PATH_TEST scenarios-tests) + +############ +SET(TEST_NAME Features-Selector) + +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${PATH_TEST}/${TEST_NAME}-output.csv") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" "${PATH_TEST}/${TEST_NAME}-test.xml") +ADD_TEST(compare_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "${PATH_TEST}/${TEST_NAME}-output.csv" "${PATH_TEST}/${TEST_NAME}-ref.csv" 0.0001) + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_CONFIG_SUBDIR}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL "${PATH_TEST}/${TEST_NAME}-output.csv") +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) + +############ +SET(TEST_NAME Features-Selection) + +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${PATH_TEST}/${TEST_NAME}-output.xml") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" "${PATH_TEST}/${TEST_NAME}-test.xml") +ADD_TEST(compare_${TEST_NAME} "$ENV{OV_BINARY_PATH}/xml-configuration-comparison.${EXT}" ${OS_FLAGS} "${PATH_TEST}/${TEST_NAME}-output.xml" "${PATH_TEST}/${TEST_NAME}-ref.xml" true) + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_CONFIG_SUBDIR}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL "${PATH_TEST}/${TEST_NAME}-output.xml") +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input1.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input1.csv new file mode 100644 index 0000000..6ef3b14 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input1.csv @@ -0,0 +1,7 @@ +Time:325,End Time,Feature 1,Feature 2,Feature 3,Feature 4,Feature 5,Feature 6,Feature 7,Feature 8,Feature 9,Feature 1,Feature 11,Feature 12,Feature 13,Feature 14,Feature 15,Feature 16,Feature 17,Feature 18,Feature 19,Feature 2,Feature 21,Feature 22,Feature 23,Feature 24,Feature 25,Feature 26,Feature 27,Feature 28,Feature 29,Feature 3,Feature 31,Feature 32,Feature 33,Feature 34,Feature 35,Feature 36,Feature 37,Feature 38,Feature 39,Feature 4,Feature 41,Feature 42,Feature 43,Feature 44,Feature 45,Feature 46,Feature 47,Feature 48,Feature 49,Feature 5,Feature 51,Feature 52,Feature 53,Feature 54,Feature 55,Feature 56,Feature 57,Feature 58,Feature 59,Feature 6,Feature 61,Feature 62,Feature 63,Feature 64,Feature 65,Feature 66,Feature 67,Feature 68,Feature 69,Feature 7,Feature 71,Feature 72,Feature 73,Feature 74,Feature 75,Feature 76,Feature 77,Feature 78,Feature 79,Feature 8,Feature 81,Feature 82,Feature 83,Feature 84,Feature 85,Feature 86,Feature 87,Feature 88,Feature 89,Feature 9,Feature 91,Feature 92,Feature 93,Feature 94,Feature 95,Feature 96,Feature 97,Feature 98,Feature 99,Feature 1,Feature 101,Feature 102,Feature 103,Feature 104,Feature 105,Feature 106,Feature 107,Feature 108,Feature 109,Feature 11,Feature 111,Feature 112,Feature 113,Feature 114,Feature 115,Feature 116,Feature 117,Feature 118,Feature 119,Feature 12,Feature 121,Feature 122,Feature 123,Feature 124,Feature 125,Feature 126,Feature 127,Feature 128,Feature 129,Feature 13,Feature 131,Feature 132,Feature 133,Feature 134,Feature 135,Feature 136,Feature 137,Feature 138,Feature 139,Feature 14,Feature 141,Feature 142,Feature 143,Feature 144,Feature 145,Feature 146,Feature 147,Feature 148,Feature 149,Feature 15,Feature 151,Feature 152,Feature 153,Feature 154,Feature 155,Feature 156,Feature 157,Feature 158,Feature 159,Feature 16,Feature 161,Feature 162,Feature 163,Feature 164,Feature 165,Feature 166,Feature 167,Feature 168,Feature 169,Feature 17,Feature 171,Feature 172,Feature 173,Feature 174,Feature 175,Feature 176,Feature 177,Feature 178,Feature 179,Feature 18,Feature 181,Feature 182,Feature 183,Feature 184,Feature 185,Feature 186,Feature 187,Feature 188,Feature 189,Feature 19,Feature 191,Feature 192,Feature 193,Feature 194,Feature 195,Feature 196,Feature 197,Feature 198,Feature 199,Feature 2,Feature 201,Feature 202,Feature 203,Feature 204,Feature 205,Feature 206,Feature 207,Feature 208,Feature 209,Feature 21,Feature 211,Feature 212,Feature 213,Feature 214,Feature 215,Feature 216,Feature 217,Feature 218,Feature 219,Feature 22,Feature 221,Feature 222,Feature 223,Feature 224,Feature 225,Feature 226,Feature 227,Feature 228,Feature 229,Feature 23,Feature 231,Feature 232,Feature 233,Feature 234,Feature 235,Feature 236,Feature 237,Feature 238,Feature 239,Feature 24,Feature 241,Feature 242,Feature 243,Feature 244,Feature 245,Feature 246,Feature 247,Feature 248,Feature 249,Feature 25,Feature 251,Feature 252,Feature 253,Feature 254,Feature 255,Feature 256,Feature 257,Feature 258,Feature 259,Feature 26,Feature 261,Feature 262,Feature 263,Feature 264,Feature 265,Feature 266,Feature 267,Feature 268,Feature 269,Feature 27,Feature 271,Feature 272,Feature 273,Feature 274,Feature 275,Feature 276,Feature 277,Feature 278,Feature 279,Feature 28,Feature 281,Feature 282,Feature 283,Feature 284,Feature 285,Feature 286,Feature 287,Feature 288,Feature 289,Feature 29,Feature 291,Feature 292,Feature 293,Feature 294,Feature 295,Feature 296,Feature 297,Feature 298,Feature 299,Feature 3,Feature 301,Feature 302,Feature 303,Feature 304,Feature 305,Feature 306,Feature 307,Feature 308,Feature 309,Feature 31,Feature 311,Feature 312,Feature 313,Feature 314,Feature 315,Feature 316,Feature 317,Feature 318,Feature 319,Feature 32,Feature 321,Feature 322,Feature 323,Feature 324,Feature 325,Event Id,Event Date,Event Duration +0.000000,0.062500,-2, 0, 2, 2, 2,-2,-2, 0, 2,-2, 0, 0,-2,-2, 0, 0, 0, 0,-2, 2,-2, 2, 2, 0, 0,-2, 0, 0, 0, 2,-2, 0,-2, 0,-2, 0,-2, 0, 2,-2, 0, 0, 0, 0, 0, 2,-2,-2,-2,-2,-2,-2,-2, 0, 0, 0,-2,-2, 0,-2,-2,-2,-2,-2, 0, 0,-2,-2, 2, 0, 0,-2, 0, 0,-2, 0,-2,-2, 0, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 2,-2, 2, 0, 0, 2,-2,-2, 0,-2, 2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0, 0, 0,-2,-2,-2,-2, 0, 0,-2,-2, 0,-2,-2,-2,-2, 2,-2,-2,-2,-2, 0, 0, 2, 2, 2, 0, 2, 2, 2, 0, 0, 0, 2, 2, 0, 2, 0, 2, 0,-2, 2, 0, 0, 0, 2, 0, 0, 2,-2, 0, 2, 0, 2, 2, 2, 0, 0, 0, 2, 0, 0,-2, 2, 2,-2, 2, 0, 0,-2, 2, 2, 0, 2, 2, 2,-2, 2, 2,-2, 2, 0,-2,-2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 0, 2,-2, 0, 0,-2, 2, 2, 2, 2, 2, 2, 2, 0, 2,-2,-2, 2, 0, 2, 2,-2, 2, 2,-2, 0, 2, 2,-2, 2,-2, 0,-2, 0,-2, 2,-2, 0, 2, 2,-2, 2, 0, 2, 2,-2, 0, 0, 0, 2, 2, 2, 0, 2,-2,-2,-2, 2, 0, 0,-2, 0, 0, 2,-2, 0, 2, 2, 0,-2,-2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0,-2,-2, 0,-2, 2, 0, 2, 0, 2, 0,-2, 2,-2, 2, 2, 2,-2, 0, 2, 2, 0,-2, 0, 2, 2, 2,,, +0.062500,0.125000, 0, 0, 0,-2,-2,-2,-2, 2, 0, 2, 2, 0,-2,-2, 2, 2, 0, 0,-2, 2,-2,-2, 2,-2, 2,-2, 0, 0,-2, 2, 0, 0,-2,-2,-2, 2,-2, 0, 0, 0,-2, 0, 0, 2, 2, 0,-2, 0,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2, 0, 0,-2, 0, 2,-2, 0,-2,-2, 0, 2, 2,-2,-2, 2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0, 2, 0, 0,-2,-2,-2,-2,-2,-2, 0,-2, 0, 0,-2,-2,-2,-2,-2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0,-2, 0, 2, 0, 0, 2, 2, 0, 2, 0,-2, 2, 0, 0, 2, 0, 2, 2, 2,-2, 2, 2, 0, 0, 2, 2, 2, 0, 0,-2, 0,-2, 0, 2, 0,-2, 2, 0, 2, 0, 2,-2, 0, 0, 2, 2,-2,-2, 0, 2, 2, 0,-2,-2, 2, 2, 0, 0, 0,-2,-2, 2, 0, 0, 0,-2, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2,-2, 2, 0, 0, 2, 0, 2,-2, 0, 2, 2,-2,-2, 2, 2, 2, 0, 0, 0, 2, 0,-2, 2, 2, 2, 2,-2, 0, 2, 2, 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, 0,-2,-2, 0, 2, 2, 0, 0, 2, 0,-2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2,-2, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2,-2, 2, 0, 2, 2, 2, 0,-2, 0, 2, 2, 2,,, +0.125000,0.187500, 0, 0, 0, 0, 0,-2,-2, 0, 2, 2, 0, 0,-2,-2, 0, 0, 2, 0,-2, 2,-2,-2, 0,-2, 0,-2, 0, 0,-2, 2,-2,-2,-2,-2,-2, 0,-2, 0, 0,-2,-2, 0, 0, 0, 0, 2,-2,-2,-2,-2, 0,-2,-2, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2, 0,-2,-2, 0,-2, 0, 0, 0,-2, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2, 0, 2, 0, 0,-2,-2, 0,-2, 0,-2,-2, 2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2, 0,-2,-2,-2, 0,-2,-2, 0,-2, 0,-2,-2,-2, 0,-2,-2, 0, 0, 0,-2, 2, 2, 2, 2, 2, 2, 2,-2, 0, 0, 0, 0, 0, 2, 0, 2, 0,-2, 2,-2, 0, 0, 2, 2, 2, 2,-2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0,-2, 0, 0, 2, 0,-2, 2, 0, 2, 0, 2,-2, 0, 0, 2, 0,-2, 0, 0, 2, 2, 0,-2, 0, 2, 2, 0, 0, 0,-2, 0, 2, 0, 2, 2,-2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2, 0, 2, 0,-2, 0,-2, 2, 0, 2, 0, 2, 2, 2,-2, 0, 2, 2, 2, 0, 0, 0, 2, 0,-2, 2, 0, 2, 2,-2, 0, 2, 2, 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, 0,-2,-2, 0, 2, 2, 0, 0, 2, 0,-2,-2,-2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2,-2, 0, 2, 2, 2, 0, 0, 2, 2, 0, 0,-2, 2, 2, 2, 0, 2, 2,-2, 2, 0, 0, 2, 2, 0,-2, 0, 2, 2, 2,,, +0.187500,0.250000, 0,-2,-2,-2,-2,-2,-2, 2, 0, 0, 2, 0,-2,-2,-2,-2, 0,-2,-2, 0,-2,-2, 0,-2, 0,-2, 0, 0,-2, 2,-2,-2,-2, 0,-2, 2,-2, 0, 0,-2,-2,-2, 0, 0, 0, 0, 0, 0,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2, 2,-2, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2, 0, 0, 0, 0,-2,-2, 0,-2, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 2, 2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2, 0, 0,-2,-2, 0, 0,-2,-2, 0,-2, 0, 2, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0,-2, 0, 2, 2, 2, 0,-2,-2,-2, 0, 0, 2, 0, 0, 2,-2,-2, 2, 0, 0, 2, 2, 2,-2, 2,-2, 0,-2, 0, 2, 0,-2, 2,-2, 2, 0, 2, 0, 2, 0, 2,-2,-2,-2,-2,-2, 2, 0,-2, 0, 2, 2,-2, 0, 0, 0, 0, 0, 2, 0, 0,-2, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 2,-2,-2, 2, 0, 2, 0, 0, 2, 2,-2, 0, 2,-2, 2,-2,-2,-2, 0, 0,-2, 2,-2, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 2, 2, 0,-2,-2, 0, 2, 2, 0,-2, 2, 0,-2,-2,-2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0,-2,-2, 2, 0, 2,-2, 2, 0,-2, 2, 0, 0, 2, 2, 0,-2,-2, 2, 2, 2,,, +0.250000,0.312500, 0, 0,-2,-2,-2,-2,-2, 0, 0, 2, 0, 0,-2,-2, 0,-2, 0,-2,-2, 0,-2,-2, 0, 0, 2,-2, 0, 0,-2, 2,-2,-2,-2,-2,-2, 2,-2,-2, 0,-2,-2, 0, 2, 0, 0, 0, 0, 0,-2, 0,-2,-2,-2, 0,-2, 0, 0, 0,-2,-2,-2, 0,-2, 0,-2, 0, 0,-2, 0, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2,-2, 0,-2, 0,-2,-2, 0, 2, 0,-2,-2, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0, 0,-2,-2, 0,-2,-2, 2, 2, 2, 2, 2, 2, 2,-2, 0, 0, 0, 0, 0, 2, 2, 2, 0,-2,-2, 0,-2, 0, 0, 0,-2, 2, 0,-2, 2, 0, 0, 2, 2, 2,-2, 0, 0,-2,-2,-2, 2, 2,-2, 2,-2, 2,-2, 2, 0, 0,-2, 2, 0,-2,-2,-2, 0, 2, 0,-2, 0, 0, 2, 0, 0,-2,-2,-2, 0, 0, 0, 2,-2,-2, 0, 2,-2, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0,-2,-2, 2, 0, 2, 0, 0, 2, 2,-2, 0, 2,-2, 2,-2,-2,-2,-2,-2,-2, 2,-2, 0, 2,-2, 0, 2, 2, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 0,-2,-2, 0, 2, 0, 0,-2, 2, 0,-2,-2, 0, 0, 2, 2, 2, 2,-2, 2, 0, 2, 0, 2,-2, 0, 2, 0, 2, 0, 0, 2, 0, 2, 0,-2, 0, 2, 2, 0, 2, 2,-2, 2, 0, 2, 2,-2, 0,-2, 0, 2, 2, 2,,, +0.312500,0.375000, 0, 0,-2,-2,-2, 0,-2, 2, 2, 0, 2, 2, 0, 0, 0, 0, 2, 0,-2, 2, 2,-2, 2, 2, 0, 0, 2, 2,-2, 2, 0, 0, 2,-2,-2, 2,-2, 2,-2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 0, 2,-2,-2,-2,-2,-2,-2, 0,-2,-2, 0, 0, 0,-2,-2,-2,-2,-2,-2, 0, 0,-2, 2,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 2, 2,-2,-2, 2, 0, 2, 0,-2,-2,-2, 2,-2,-2, 2,-2,-2,-2, 2,-2,-2,-2, 2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2,-2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2,-2, 0, 2, 2, 0, 2, 2, 2, 2, 0,-2, 2,-2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,-2, 0, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 0, 2, 0, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 2, 0, 2, 2, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 2, 0, 0, 2, 2, 0, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 2,-2, 0, 2, 2,-2, 0, 2, 0, 2, 0,-2, 0, 2,-2,-2, 2, 0, 2, 2, 0, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 2,-2, 0, 2, 2, 2, 0, 2, 2,-2, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 2,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input2.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input2.csv new file mode 100644 index 0000000..35d149e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input2.csv @@ -0,0 +1,6 @@ +Time:325,End Time,Feature 1,Feature 2,Feature 3,Feature 4,Feature 5,Feature 6,Feature 7,Feature 8,Feature 9,Feature 1,Feature 11,Feature 12,Feature 13,Feature 14,Feature 15,Feature 16,Feature 17,Feature 18,Feature 19,Feature 2,Feature 21,Feature 22,Feature 23,Feature 24,Feature 25,Feature 26,Feature 27,Feature 28,Feature 29,Feature 3,Feature 31,Feature 32,Feature 33,Feature 34,Feature 35,Feature 36,Feature 37,Feature 38,Feature 39,Feature 4,Feature 41,Feature 42,Feature 43,Feature 44,Feature 45,Feature 46,Feature 47,Feature 48,Feature 49,Feature 5,Feature 51,Feature 52,Feature 53,Feature 54,Feature 55,Feature 56,Feature 57,Feature 58,Feature 59,Feature 6,Feature 61,Feature 62,Feature 63,Feature 64,Feature 65,Feature 66,Feature 67,Feature 68,Feature 69,Feature 7,Feature 71,Feature 72,Feature 73,Feature 74,Feature 75,Feature 76,Feature 77,Feature 78,Feature 79,Feature 8,Feature 81,Feature 82,Feature 83,Feature 84,Feature 85,Feature 86,Feature 87,Feature 88,Feature 89,Feature 9,Feature 91,Feature 92,Feature 93,Feature 94,Feature 95,Feature 96,Feature 97,Feature 98,Feature 99,Feature 1,Feature 101,Feature 102,Feature 103,Feature 104,Feature 105,Feature 106,Feature 107,Feature 108,Feature 109,Feature 11,Feature 111,Feature 112,Feature 113,Feature 114,Feature 115,Feature 116,Feature 117,Feature 118,Feature 119,Feature 12,Feature 121,Feature 122,Feature 123,Feature 124,Feature 125,Feature 126,Feature 127,Feature 128,Feature 129,Feature 13,Feature 131,Feature 132,Feature 133,Feature 134,Feature 135,Feature 136,Feature 137,Feature 138,Feature 139,Feature 14,Feature 141,Feature 142,Feature 143,Feature 144,Feature 145,Feature 146,Feature 147,Feature 148,Feature 149,Feature 15,Feature 151,Feature 152,Feature 153,Feature 154,Feature 155,Feature 156,Feature 157,Feature 158,Feature 159,Feature 16,Feature 161,Feature 162,Feature 163,Feature 164,Feature 165,Feature 166,Feature 167,Feature 168,Feature 169,Feature 17,Feature 171,Feature 172,Feature 173,Feature 174,Feature 175,Feature 176,Feature 177,Feature 178,Feature 179,Feature 18,Feature 181,Feature 182,Feature 183,Feature 184,Feature 185,Feature 186,Feature 187,Feature 188,Feature 189,Feature 19,Feature 191,Feature 192,Feature 193,Feature 194,Feature 195,Feature 196,Feature 197,Feature 198,Feature 199,Feature 2,Feature 201,Feature 202,Feature 203,Feature 204,Feature 205,Feature 206,Feature 207,Feature 208,Feature 209,Feature 21,Feature 211,Feature 212,Feature 213,Feature 214,Feature 215,Feature 216,Feature 217,Feature 218,Feature 219,Feature 22,Feature 221,Feature 222,Feature 223,Feature 224,Feature 225,Feature 226,Feature 227,Feature 228,Feature 229,Feature 23,Feature 231,Feature 232,Feature 233,Feature 234,Feature 235,Feature 236,Feature 237,Feature 238,Feature 239,Feature 24,Feature 241,Feature 242,Feature 243,Feature 244,Feature 245,Feature 246,Feature 247,Feature 248,Feature 249,Feature 25,Feature 251,Feature 252,Feature 253,Feature 254,Feature 255,Feature 256,Feature 257,Feature 258,Feature 259,Feature 26,Feature 261,Feature 262,Feature 263,Feature 264,Feature 265,Feature 266,Feature 267,Feature 268,Feature 269,Feature 27,Feature 271,Feature 272,Feature 273,Feature 274,Feature 275,Feature 276,Feature 277,Feature 278,Feature 279,Feature 28,Feature 281,Feature 282,Feature 283,Feature 284,Feature 285,Feature 286,Feature 287,Feature 288,Feature 289,Feature 29,Feature 291,Feature 292,Feature 293,Feature 294,Feature 295,Feature 296,Feature 297,Feature 298,Feature 299,Feature 3,Feature 301,Feature 302,Feature 303,Feature 304,Feature 305,Feature 306,Feature 307,Feature 308,Feature 309,Feature 31,Feature 311,Feature 312,Feature 313,Feature 314,Feature 315,Feature 316,Feature 317,Feature 318,Feature 319,Feature 32,Feature 321,Feature 322,Feature 323,Feature 324,Feature 325,Event Id,Event Date,Event Duration +0.000000,0.062500, 2,-2, 0,-2, 2, 2, 0,-2, 2, 0, 0,-2, 0,-2, 0, 0,-2,-2,-2,-2, 0,-2,-2,-2, 2,-2,-2, 2,-2, 0,-2, 2, 0, 2,-2,-2, 0,-2,-2, 0, 2,-2, 2, 0, 0,-2,-2, 0, 0, 2, 0,-2, 2, 2,-2,-2,-2,-2, 0,-2,-2,-2, 0, 0,-2, 0, 2, 0,-2, 0,-2, 2, 0, 0, 2,-2, 2, 2, 2, 2,-2,-2,-2,-2, 2, 2, 2, 2, 2, 2, 2,-2, 2, 0,-2, 2,-2, 0, 0,-2,-2, 0,-2, 0,-2, 2, 2,-2, 2, 2, 2,-2, 0, 2, 2,-2, 2,-2, 2, 0, 2, 2, 2,-2,-2,-2,-2, 2, 2, 2, 0,-2, 0, 0, 2, 2, 0,-2, 2,-2, 2, 2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0, 2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2, 0, 0,-2, 0, 2, 0,-2,-2, 0,-2, 0, 0, 2,-2,-2, 0,-2,-2,-2, 0,-2, 0,-2, 0, 0,-2, 0,-2, 0,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2, 2,-2, 2,-2, 0,-2,-2, 2,-2, 2,-2, 0,-2, 2,-2,-2,-2,-2, 0,-2, 0,-2,-2,-2,-2, 2,-2, 0,-2,-2,-2,-2, 2, 0, 0, 0,-2, 2,-2,-2,-2, 2,-2,-2,-2,-2,-2,-2, 2,-2, 2,-2, 0,-2, 2,-2, 0, 0, 2, 0,-2,-2,-2, 2,-2, 0,-2, 0, 2, 2,-2, 2,-2, 0, 0,-2,-2,-2,-2,-2,-2, 0, 0, 0,-2, 0, 0, 0,-2, 0, 2,-2,-2,-2,-2, 0,-2,-2,-2,,, +0.062500,0.125000, 0, 0, 0, 0,-2, 2, 2,-2, 2,-2, 0,-2, 0,-2, 0, 0,-2,-2,-2,-2, 2,-2,-2,-2, 2, 0,-2, 0, 0,-2,-2, 2, 2, 2, 0,-2, 0, 0, 0, 0, 0,-2, 2, 0, 0, 0,-2, 0, 0, 0, 0, 0, 0, 0,-2, 0,-2,-2,-2, 0, 0,-2, 0, 2,-2,-2, 2, 0,-2, 0,-2, 0, 0,-2, 2,-2, 2, 0,-2, 2,-2, 0,-2, 0, 0, 0, 2, 2, 2, 0, 2,-2, 2, 0,-2, 2, 0,-2, 2, 0,-2, 2, 0, 0,-2, 2, 2,-2,-2, 2, 2,-2, 2, 2, 2,-2, 2, 0, 2, 2, 2, 2, 2,-2,-2,-2,-2, 2, 2, 2, 2,-2,-2,-2, 0, 2,-2,-2, 2,-2, 2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 2, 0,-2,-2,-2,-2,-2,-2, 0, 0,-2, 0,-2,-2,-2, 0,-2,-2, 2, 2,-2,-2, 0, 0, 2,-2, 0,-2,-2,-2,-2,-2,-2, 0,-2, 2,-2,-2, 0,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2, 2,-2,-2, 0,-2, 0, 0,-2,-2, 0,-2, 2,-2, 2,-2,-2,-2,-2, 2,-2, 2,-2,-2,-2, 2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 2,-2,-2,-2,-2,-2, 0,-2, 2,-2, 2,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0, 2,-2, 2,-2,-2, 0, 0, 2, 0,-2, 2,-2, 0,-2,-2, 2, 0, 0, 0,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2, 2,-2,-2, 0,-2, 2, 2,-2,-2,,, +0.125000,0.187500, 0,-2, 0,-2, 2, 0, 2,-2, 2,-2, 2,-2, 0,-2,-2,-2, 0,-2,-2,-2, 2, 0,-2,-2, 2, 0,-2, 2,-2, 0,-2, 0, 2, 2, 0,-2, 2,-2, 2, 0, 2,-2, 2, 0,-2, 0,-2, 0, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2, 2, 0,-2, 0,-2, 0, 2, 2, 2,-2, 0, 0, 0,-2,-2,-2,-2,-2, 0, 2, 2, 2, 2, 2, 0,-2, 2,-2, 0, 2, 0,-2,-2, 2,-2, 2,-2,-2,-2, 2, 2,-2, 0, 2, 2,-2, 2, 2, 0,-2, 2, 0, 2, 0, 2, 2, 2,-2,-2,-2,-2, 2, 2, 2,-2,-2,-2,-2, 0,-2,-2,-2, 0, 0, 2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2, 0, 2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 2,-2,-2, 2, 0, 0,-2, 0, 0, 2,-2, 2,-2, 2,-2,-2,-2, 0, 2,-2, 2,-2,-2,-2,-2,-2, 0, 0,-2,-2, 0, 0, 0,-2, 2,-2,-2,-2,-2, 2, 2,-2,-2, 0,-2, 2,-2, 2, 0, 0,-2,-2, 2,-2, 2, 0,-2,-2, 0, 0,-2,-2,-2, 0,-2,-2, 0,-2,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2, 0,-2, 2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0, 0,-2, 2,-2,-2, 0,-2,-2, 0,-2, 2, 0,-2,-2,-2, 2,-2,-2,-2,-2, 0, 0,-2, 2,-2, 0, 0,-2, 2,-2,-2,-2,-2,-2, 0,-2,-2, 0,-2, 0, 0, 2, 0,-2,-2, 2, 0, 2, 2,-2,-2,,, +0.187500,0.250000, 0, 2, 0, 0, 0, 0,-2, 2, 2,-2, 0,-2, 2,-2, 0, 2, 2, 2,-2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,-2, 0, 0,-2,-2, 0, 0,-2, 0, 2,-2, 2, 0, 2, 0, 0, 2,-2, 0,-2, 0, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2, 0, 0, 0,-2, 2,-2, 0, 0, 0, 2, 2, 0,-2,-2, 0,-2, 0, 0, 0,-2, 0, 0, 0, 0,-2, 0, 0, 2,-2, 0,-2,-2, 0, 0,-2, 0, 0, 0,-2, 0, 0,-2, 0,-2,-2, 2, 0, 0, 2,-2,-2, 2, 0, 0, 0, 0,-2, 0, 0,-2,-2, 2,-2,-2, 0, 0,-2, 2, 0,-2,-2, 0, 0,-2, 0, 0, 0, 0, 0,-2, 2, 0,-2, 0, 2, 0, 0,-2, 0, 0, 2, 2,-2,-2, 2, 2,-2, 2, 0, 0,-2, 0, 2, 2,-2,-2, 2, 2,-2, 0, 2, 0, 2,-2, 2, 2, 0, 0, 0,-2, 2, 0, 2, 2, 0, 0, 0, 2, 0,-2, 0, 2, 2, 0, 0, 2, 0, 2, 2,-2,-2, 0, 0, 0,-2, 0,-2, 0, 0,-2, 0, 0, 0, 0,-2, 0, 2, 0, 2, 0, 2, 0, 0, 2, 2, 2, 0, 2,-2, 2,-2,-2, 0,-2, 0,-2,-2, 0, 0,-2,-2, 0, 0, 0, 2, 0, 2,-2, 2, 0, 2,-2, 2, 2, 2, 2, 0, 0, 2, 0, 2, 0, 2, 0, 2,-2, 2,-2, 2, 0, 0, 0, 2, 0,-2, 0, 0,-2, 0,-2, 0, 2, 2,-2, 2, 2, 2,-2, 2, 2, 0, 0, 0, 0, 2,-2, 0, 0,-2, 0, 2,-2, 0,-2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 2, 0,-2, 0, 0, 2, 2, 2,,, +0.250000,0.312500, 0, 0, 0, 0, 0, 2, 2, 0, 2, 0, 0, 0, 2,-2, 0, 0, 0, 0,-2, 0, 0, 0, 0,-2, 2, 0, 0, 0, 0,-2,-2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2,-2, 0, 2, 0,-2,-2,-2, 0, 2, 0,-2, 2,-2,-2,-2, 0,-2, 0, 0,-2,-2, 0, 2, 0, 0, 2, 0,-2, 0,-2, 0, 2, 2, 2,-2, 0, 2, 0, 2,-2, 2, 0,-2, 2, 0, 2, 0, 0, 2, 0,-2, 2,-2, 0, 2, 0,-2, 0,-2, 0, 0, 0, 0,-2, 2, 2, 0, 0, 2, 0, 0, 0, 2, 2, 0, 2, 0, 2, 0, 0, 2, 0,-2, 0,-2,-2, 2, 2, 2,-2, 2,-2, 0, 2, 0,-2,-2, 2,-2, 0, 2,-2, 0, 0,-2, 0, 0,-2,-2,-2,-2, 0, 2, 0, 2,-2, 0, 0,-2,-2,-2, 0, 0, 0, 0, 2,-2, 0,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2, 0, 0, 0, 0, 0, 2, 0, 0, 0,-2, 0,-2, 0,-2, 0,-2,-2,-2, 0, 2,-2, 2,-2, 0, 0, 0, 0, 0, 0,-2,-2, 0,-2, 0,-2, 0,-2,-2,-2,-2, 0, 0,-2,-2, 0, 0, 0, 0, 0, 0, 0,-2,-2, 0,-2, 2, 0, 0, 0, 0, 0,-2, 0,-2, 0, 0,-2, 0, 0, 0,-2, 0,-2,-2, 0,-2, 0, 0, 0, 0,-2, 2, 0, 0,-2, 0, 0, 2,-2,-2,-2, 0,-2, 0, 0, 0, 0,-2,-2,-2,-2,-2, 0, 0, 2, 0,-2, 0, 0, 2, 0, 2,-2, 0, 0,-2, 0, 2,-2, 0, 2,-2, 2,-2,-2,-2,-2, 0, 0, 0,-2, 0,-2, 0,-2, 0, 2, 0, 0,-2,-2, 0, 0, 0, 0,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input3.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input3.csv new file mode 100644 index 0000000..d9034d9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input3.csv @@ -0,0 +1,6 @@ +Time:325,End Time,Feature 1,Feature 2,Feature 3,Feature 4,Feature 5,Feature 6,Feature 7,Feature 8,Feature 9,Feature 1,Feature 11,Feature 12,Feature 13,Feature 14,Feature 15,Feature 16,Feature 17,Feature 18,Feature 19,Feature 2,Feature 21,Feature 22,Feature 23,Feature 24,Feature 25,Feature 26,Feature 27,Feature 28,Feature 29,Feature 3,Feature 31,Feature 32,Feature 33,Feature 34,Feature 35,Feature 36,Feature 37,Feature 38,Feature 39,Feature 4,Feature 41,Feature 42,Feature 43,Feature 44,Feature 45,Feature 46,Feature 47,Feature 48,Feature 49,Feature 5,Feature 51,Feature 52,Feature 53,Feature 54,Feature 55,Feature 56,Feature 57,Feature 58,Feature 59,Feature 6,Feature 61,Feature 62,Feature 63,Feature 64,Feature 65,Feature 66,Feature 67,Feature 68,Feature 69,Feature 7,Feature 71,Feature 72,Feature 73,Feature 74,Feature 75,Feature 76,Feature 77,Feature 78,Feature 79,Feature 8,Feature 81,Feature 82,Feature 83,Feature 84,Feature 85,Feature 86,Feature 87,Feature 88,Feature 89,Feature 9,Feature 91,Feature 92,Feature 93,Feature 94,Feature 95,Feature 96,Feature 97,Feature 98,Feature 99,Feature 1,Feature 101,Feature 102,Feature 103,Feature 104,Feature 105,Feature 106,Feature 107,Feature 108,Feature 109,Feature 11,Feature 111,Feature 112,Feature 113,Feature 114,Feature 115,Feature 116,Feature 117,Feature 118,Feature 119,Feature 12,Feature 121,Feature 122,Feature 123,Feature 124,Feature 125,Feature 126,Feature 127,Feature 128,Feature 129,Feature 13,Feature 131,Feature 132,Feature 133,Feature 134,Feature 135,Feature 136,Feature 137,Feature 138,Feature 139,Feature 14,Feature 141,Feature 142,Feature 143,Feature 144,Feature 145,Feature 146,Feature 147,Feature 148,Feature 149,Feature 15,Feature 151,Feature 152,Feature 153,Feature 154,Feature 155,Feature 156,Feature 157,Feature 158,Feature 159,Feature 16,Feature 161,Feature 162,Feature 163,Feature 164,Feature 165,Feature 166,Feature 167,Feature 168,Feature 169,Feature 17,Feature 171,Feature 172,Feature 173,Feature 174,Feature 175,Feature 176,Feature 177,Feature 178,Feature 179,Feature 18,Feature 181,Feature 182,Feature 183,Feature 184,Feature 185,Feature 186,Feature 187,Feature 188,Feature 189,Feature 19,Feature 191,Feature 192,Feature 193,Feature 194,Feature 195,Feature 196,Feature 197,Feature 198,Feature 199,Feature 2,Feature 201,Feature 202,Feature 203,Feature 204,Feature 205,Feature 206,Feature 207,Feature 208,Feature 209,Feature 21,Feature 211,Feature 212,Feature 213,Feature 214,Feature 215,Feature 216,Feature 217,Feature 218,Feature 219,Feature 22,Feature 221,Feature 222,Feature 223,Feature 224,Feature 225,Feature 226,Feature 227,Feature 228,Feature 229,Feature 23,Feature 231,Feature 232,Feature 233,Feature 234,Feature 235,Feature 236,Feature 237,Feature 238,Feature 239,Feature 24,Feature 241,Feature 242,Feature 243,Feature 244,Feature 245,Feature 246,Feature 247,Feature 248,Feature 249,Feature 25,Feature 251,Feature 252,Feature 253,Feature 254,Feature 255,Feature 256,Feature 257,Feature 258,Feature 259,Feature 26,Feature 261,Feature 262,Feature 263,Feature 264,Feature 265,Feature 266,Feature 267,Feature 268,Feature 269,Feature 27,Feature 271,Feature 272,Feature 273,Feature 274,Feature 275,Feature 276,Feature 277,Feature 278,Feature 279,Feature 28,Feature 281,Feature 282,Feature 283,Feature 284,Feature 285,Feature 286,Feature 287,Feature 288,Feature 289,Feature 29,Feature 291,Feature 292,Feature 293,Feature 294,Feature 295,Feature 296,Feature 297,Feature 298,Feature 299,Feature 3,Feature 301,Feature 302,Feature 303,Feature 304,Feature 305,Feature 306,Feature 307,Feature 308,Feature 309,Feature 31,Feature 311,Feature 312,Feature 313,Feature 314,Feature 315,Feature 316,Feature 317,Feature 318,Feature 319,Feature 32,Feature 321,Feature 322,Feature 323,Feature 324,Feature 325,Event Id,Event Date,Event Duration +0.000000,0.062500, 0, 2, 2, 2, 2, 0,-2, 0, 0, 0, 0,-2, 0, 0,-2,-2, 0, 0, 2, 0, 0, 2, 2, 0, 0, 2, 0,-2, 0,-2, 0, 0,-2,-2, 0, 0, 2, 0, 0, 2,-2, 0,-2, 0, 0, 0, 2, 0,-2, 0, 0,-2, 0,-2, 2, 2, 2, 0, 2, 0, 2, 2,-2, 0, 0, 0,-2,-2, 0, 0,-2, 2, 0,-2, 0,-2, 0, 2, 0, 2, 0, 0, 0,-2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2, 2, 2, 0, 2, 0, 0,-2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2,-2, 2, 2, 2, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,-2, 0, 0, 0, 0,-2, 0,-2, 0,-2, 0, 0, 0, 0,-2, 0, 0,-2, 0, 0, 0, 0, 0,-2,-2, 0,-2,-2, 0, 0, 0, 0,-2, 0, 0, 0, 0, 2,-2, 2, 0, 0, 0, 0, 2, 0, 0,-2,-2,-2, 0, 0, 2, 0, 2, 0, 0, 0,-2, 0, 0,-2, 0, 0,-2, 0, 0, 0, 0, 0,-2, 0, 0,-2,-2, 0, 0,-2, 0,-2,-2, 0, 0, 0, 0,-2, 0, 0, 0, 0,-2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0,-2,-2, 0, 0, 0, 2,-2, 0,-2, 2, 0, 0, 2, 0, 0, 2, 0, 0,-2, 0, 0,-2, 0, 2, 0, 2, 2, 2, 0, 2, 0, 2, 2, 2, 0, 2, 0, 2, 2, 0, 2, 2,-2,-2, 0, 2, 0, 2,-2,-2, 0, 0, 0, 2, 0, 0, 2,-2, 0, 0, 0, 2, 2,,, +0.062500,0.125000,-2,-2,-2,-2,-2,-2,-2,-2,-2, 2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2, 0, 0,-2,-2,-2,-2,-2, 0, 2,-2, 0,-2,-2,-2, 2, 2,-2,-2, 2,-2, 0,-2, 2,-2, 2, 2, 2, 0, 0, 0,-2, 0,-2, 0, 0, 2,-2,-2,-2, 2,-2, 0, 0, 0, 0, 2, 2,-2, 0, 2,-2, 2, 2, 2, 2, 0,-2,-2, 0, 2,-2, 0, 2,-2, 0, 2,-2, 0,-2, 2,-2,-2, 0, 0, 0, 0, 2, 0, 0, 2, 0, 2, 0, 0, 2, 0, 0,-2,-2, 2, 2, 2,-2, 0, 0, 0,-2,-2, 0, 0,-2,-2, 2,-2,-2,-2,-2, 0, 0, 0,-2,-2, 0,-2,-2,-2,-2, 2, 0, 0, 2,-2,-2,-2, 0,-2, 0, 0, 0,-2, 0,-2,-2, 0, 0, 0, 0,-2,-2, 2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2, 0, 0,-2, 0, 0,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0, 2,-2,-2, 0,-2, 0, 0,-2, 2,-2, 0,-2,-2, 0,-2, 0,-2, 0,-2, 0, 0,-2, 0,-2,-2,-2,-2, 2, 2,-2,-2, 0, 2,-2, 0, 0, 2, 0, 2,-2, 2, 2,-2,-2, 2, 0, 0, 0,-2, 2, 2, 2, 2,-2,-2,-2, 0, 0,-2, 2, 0, 2,-2, 2,-2, 0,-2, 0,-2, 0,-2,-2,-2,-2,-2, 2,-2, 0, 0,-2,-2, 0, 0, 2, 0,-2, 2,-2, 0, 0, 0,-2, 0, 2, 2,-2, 0, 0,-2, 2,-2, 2, 0,-2, 2,-2,-2, 0, 0, 2, 2, 0,-2, 0, 0,,, +0.125000,0.187500,-2, 0,-2,-2,-2,-2,-2, 0,-2, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0, 2, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0, 0,-2, 2,-2,-2, 0,-2,-2, 0,-2, 0, 0, 0,-2,-2,-2,-2,-2, 2, 0, 0, 2, 2, 0, 0, 0, 2, 0, 2, 0, 2, 0, 2, 2, 0, 2,-2, 2, 2, 2, 0,-2,-2, 2,-2, 2, 2, 2, 2, 2, 2,-2, 2, 2,-2, 2, 2, 2, 0, 0,-2,-2, 2, 2, 0,-2, 2, 0,-2, 2, 2, 2, 0, 2, 2,-2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 2, 2, 2,-2,-2,-2, 2, 2, 2, 2,-2, 0, 0, 2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2, 2, 0,-2, 2, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2,-2, 0, 0,-2,-2, 0,-2, 2,-2,-2, 0, 0,-2, 0, 0, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0, 0, 0, 0, 0,-2,-2, 0, 0, 0, 0,-2, 2,-2,-2,-2,-2,-2, 0,-2,-2, 2,-2,-2,-2,-2, 0,-2,-2,-2, 0, 0,-2,-2, 2, 0, 0, 0,-2, 0,-2,-2,-2,-2, 2,-2, 0,-2, 0,-2, 0,-2,-2,-2, 0, 2, 0,-2, 0, 0, 2,-2, 0,-2, 0,-2, 0,-2, 0,-2,-2, 0,-2, 2, 2,-2,-2, 0,-2,-2, 2,-2, 0, 0, 0, 2, 0, 2, 0, 0,-2, 0, 0, 2,-2, 2, 0,-2, 2,-2,-2,-2, 0, 2, 0,-2,-2, 0, 0, 2,-2, 2,-2, 0,,, +0.187500,0.250000,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2, 0, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0, 0,-2, 2, 2,-2, 0,-2, 2, 2, 0,-2,-2,-2, 0, 0, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 0,-2, 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2,-2, 2, 2, 0, 2, 2, 2,-2,-2,-2, 2, 0,-2, 0, 2, 0, 2,-2, 0,-2, 0, 0,-2, 2, 2, 2,-2, 0, 0, 0, 2, 2,-2, 2, 2, 0, 0, 0, 0, 2, 2, 0, 2, 0, 0, 0, 0,-2,-2, 0, 0, 0, 0,-2, 2, 0, 0, 2, 2, 0, 0,-2,-2, 0,-2, 0, 2, 0, 0, 0, 2, 0, 2, 0, 0,-2, 2, 2,-2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0,-2, 0, 0,-2, 2,-2,-2, 2, 0,-2, 0, 2, 0,-2,-2, 2, 2, 2, 0, 0, 2, 2, 0,-2, 0, 0, 0, 0, 0, 0,-2, 2, 0,-2, 0, 0, 2,-2,-2, 2,-2, 2, 2, 0,-2,-2,-2, 2,-2, 2,-2, 2, 2, 0,-2, 0, 0,-2, 0,-2,-2, 0,-2, 2,-2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0,-2, 0,-2,-2,-2, 2,-2, 2,-2,-2, 0, 0, 2, 0, 2,-2,-2,,, +0.250000,0.312500, 0, 0, 0,-2, 0,-2,-2, 0, 0, 2, 0, 0,-2, 0,-2,-2, 0, 0, 0, 0, 0, 2, 0,-2, 0,-2, 0, 0, 0,-2, 2,-2, 0,-2, 2, 0, 2,-2, 0, 0,-2, 0,-2,-2, 0,-2,-2,-2,-2, 0,-2,-2, 0, 0, 0, 0,-2, 2, 0,-2, 0, 2, 0, 2, 0, 0,-2, 0, 0, 2, 0, 2, 0, 0, 2, 0, 2, 0, 0, 0,-2, 2, 2, 0, 0, 0, 0, 2, 2, 2,-2, 0, 2,-2, 2, 2, 2, 0, 0,-2, 2, 2,-2, 0, 0, 2, 0, 0, 2, 2, 2, 0, 2, 2,-2, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 2, 2, 0, 0, 0, 2, 0, 0,-2, 0, 0, 0, 0, 2, 0, 0,-2, 2, 2, 0, 0, 0, 0, 0, 0,-2, 0,-2,-2, 0, 0,-2, 0, 0, 2, 2, 0,-2, 0, 0, 0, 0, 0, 0,-2, 0, 0, 0, 0,-2, 0, 0,-2, 0, 0,-2,-2,-2, 0, 0, 0, 0,-2, 2,-2,-2, 0,-2, 0, 2, 0, 0, 0,-2,-2, 2, 0,-2,-2,-2, 0, 0, 2, 0,-2,-2, 0, 0, 0,-2, 0, 0, 0,-2,-2, 2, 0, 0,-2,-2,-2,-2, 2, 0, 0,-2,-2, 0, 0, 2, 2,-2, 0, 2,-2,-2, 0, 2, 0, 2, 2,-2, 0, 0,-2,-2, 2, 0, 0, 0, 0, 0, 0, 2, 2,-2, 0, 0, 0, 0,-2, 0, 2, 0, 0, 0, 0, 2,-2, 0, 0, 0, 2, 0, 0,-2, 2, 2,-2, 2, 2, 0, 0, 2, 0, 2, 0, 0, 2, 0, 2, 2, 2, 0, 2, 2, 2,-2, 2, 0, 0, 2,-2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 2,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input4.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input4.csv new file mode 100644 index 0000000..5a62b41 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input4.csv @@ -0,0 +1,17 @@ +Time:325,End Time,Feature 1,Feature 2,Feature 3,Feature 4,Feature 5,Feature 6,Feature 7,Feature 8,Feature 9,Feature 1,Feature 11,Feature 12,Feature 13,Feature 14,Feature 15,Feature 16,Feature 17,Feature 18,Feature 19,Feature 2,Feature 21,Feature 22,Feature 23,Feature 24,Feature 25,Feature 26,Feature 27,Feature 28,Feature 29,Feature 3,Feature 31,Feature 32,Feature 33,Feature 34,Feature 35,Feature 36,Feature 37,Feature 38,Feature 39,Feature 4,Feature 41,Feature 42,Feature 43,Feature 44,Feature 45,Feature 46,Feature 47,Feature 48,Feature 49,Feature 5,Feature 51,Feature 52,Feature 53,Feature 54,Feature 55,Feature 56,Feature 57,Feature 58,Feature 59,Feature 6,Feature 61,Feature 62,Feature 63,Feature 64,Feature 65,Feature 66,Feature 67,Feature 68,Feature 69,Feature 7,Feature 71,Feature 72,Feature 73,Feature 74,Feature 75,Feature 76,Feature 77,Feature 78,Feature 79,Feature 8,Feature 81,Feature 82,Feature 83,Feature 84,Feature 85,Feature 86,Feature 87,Feature 88,Feature 89,Feature 9,Feature 91,Feature 92,Feature 93,Feature 94,Feature 95,Feature 96,Feature 97,Feature 98,Feature 99,Feature 1,Feature 101,Feature 102,Feature 103,Feature 104,Feature 105,Feature 106,Feature 107,Feature 108,Feature 109,Feature 11,Feature 111,Feature 112,Feature 113,Feature 114,Feature 115,Feature 116,Feature 117,Feature 118,Feature 119,Feature 12,Feature 121,Feature 122,Feature 123,Feature 124,Feature 125,Feature 126,Feature 127,Feature 128,Feature 129,Feature 13,Feature 131,Feature 132,Feature 133,Feature 134,Feature 135,Feature 136,Feature 137,Feature 138,Feature 139,Feature 14,Feature 141,Feature 142,Feature 143,Feature 144,Feature 145,Feature 146,Feature 147,Feature 148,Feature 149,Feature 15,Feature 151,Feature 152,Feature 153,Feature 154,Feature 155,Feature 156,Feature 157,Feature 158,Feature 159,Feature 16,Feature 161,Feature 162,Feature 163,Feature 164,Feature 165,Feature 166,Feature 167,Feature 168,Feature 169,Feature 17,Feature 171,Feature 172,Feature 173,Feature 174,Feature 175,Feature 176,Feature 177,Feature 178,Feature 179,Feature 18,Feature 181,Feature 182,Feature 183,Feature 184,Feature 185,Feature 186,Feature 187,Feature 188,Feature 189,Feature 19,Feature 191,Feature 192,Feature 193,Feature 194,Feature 195,Feature 196,Feature 197,Feature 198,Feature 199,Feature 2,Feature 201,Feature 202,Feature 203,Feature 204,Feature 205,Feature 206,Feature 207,Feature 208,Feature 209,Feature 21,Feature 211,Feature 212,Feature 213,Feature 214,Feature 215,Feature 216,Feature 217,Feature 218,Feature 219,Feature 22,Feature 221,Feature 222,Feature 223,Feature 224,Feature 225,Feature 226,Feature 227,Feature 228,Feature 229,Feature 23,Feature 231,Feature 232,Feature 233,Feature 234,Feature 235,Feature 236,Feature 237,Feature 238,Feature 239,Feature 24,Feature 241,Feature 242,Feature 243,Feature 244,Feature 245,Feature 246,Feature 247,Feature 248,Feature 249,Feature 25,Feature 251,Feature 252,Feature 253,Feature 254,Feature 255,Feature 256,Feature 257,Feature 258,Feature 259,Feature 26,Feature 261,Feature 262,Feature 263,Feature 264,Feature 265,Feature 266,Feature 267,Feature 268,Feature 269,Feature 27,Feature 271,Feature 272,Feature 273,Feature 274,Feature 275,Feature 276,Feature 277,Feature 278,Feature 279,Feature 28,Feature 281,Feature 282,Feature 283,Feature 284,Feature 285,Feature 286,Feature 287,Feature 288,Feature 289,Feature 29,Feature 291,Feature 292,Feature 293,Feature 294,Feature 295,Feature 296,Feature 297,Feature 298,Feature 299,Feature 3,Feature 301,Feature 302,Feature 303,Feature 304,Feature 305,Feature 306,Feature 307,Feature 308,Feature 309,Feature 31,Feature 311,Feature 312,Feature 313,Feature 314,Feature 315,Feature 316,Feature 317,Feature 318,Feature 319,Feature 32,Feature 321,Feature 322,Feature 323,Feature 324,Feature 325,Event Id,Event Date,Event Duration +0.000000,0.062500, 0, 0,-2, 2,-2, 0,-2,-2,-2, 0,-2, 0, 2,-2, 2, 2, 0,-2, 2,-2,-2,-2,-2, 0,-2, 0, 0, 0, 2,-2, 0, 2, 0,-2, 0,-2,-2, 0,-2, 0,-2,-2, 2,-2, 0,-2, 2, 0,-2,-2, 0,-2, 0, 0, 2, 2, 2,-2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 0,-2,-2, 2, 0,-2, 0, 0, 0, 2, 2, 2, 0, 2, 2, 0, 2, 0, 2, 0, 0, 0,-2, 2, 2, 0,-2, 0, 2,-2,-2, 0, 2, 2, 2,-2, 0, 0, 2, 2,-2, 2, 0,-2,-2, 0, 2, 2, 0, 0, 0,-2, 0, 0, 0, 0,-2, 0, 2, 2, 0,-2, 0,-2, 0, 2, 0, 0, 0, 2,-2, 0,-2, 0, 0, 2,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2, 0,-2, 0,-2, 0,-2, 0,-2,-2, 0, 0,-2,-2, 0,-2,-2,-2, 0,-2,-2, 0,-2,-2,-2,-2, 0,-2, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2, 0, 2,-2,-2,-2, 0, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0, 0, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2, 0,-2, 2,-2, 0,-2, 0,-2, 0, 0, 0, 0,-2, 0, 2, 2,-2, 0, 2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 2,-2,-2,-2, 0,-2, 0, 0,-2, 0,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,,, +0.062500,0.125000, 2,-2, 0, 2,-2, 0, 0,-2, 0,-2,-2,-2, 2, 0, 2, 2,-2,-2, 2,-2,-2,-2,-2,-2,-2, 0,-2,-2, 2,-2, 0, 2, 0, 0,-2,-2,-2, 0,-2, 0, 2,-2, 2, 0, 0, 0, 2, 0,-2,-2,-2,-2, 0, 0, 0, 2, 2,-2, 2, 0, 2, 0, 2,-2,-2,-2, 2,-2,-2, 0, 2, 0,-2, 0, 0,-2, 2, 2, 2, 0, 2, 2, 0, 2, 0, 0, 0, 0, 2,-2, 2, 0, 0, 0, 0, 2,-2,-2, 0, 2, 2, 2, 0, 2,-2, 2, 0,-2, 2, 0,-2,-2, 0, 2, 2,-2, 2,-2, 0, 2, 2, 2, 2, 0,-2, 2, 2, 2, 0, 2,-2, 0, 0,-2, 0, 0, 0,-2, 2,-2, 0, 2, 0,-2, 0,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0, 0,-2, 0,-2,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2, 0,-2,-2, 0,-2,-2,-2,-2,-2, 0,-2, 0,-2, 0,-2, 0, 0,-2,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2, 2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2, 0,-2, 0,-2, 0, 0,-2, 0, 0, 2, 0, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,,, +0.125000,0.187500,-2,-2, 0, 0,-2, 2,-2,-2, 0, 0, 0,-2, 2, 2, 2, 0, 0,-2, 2, 0,-2, 2, 0,-2, 0,-2, 2, 0, 2,-2, 0, 2,-2,-2,-2,-2, 0, 2,-2, 0,-2, 0, 0,-2,-2, 0, 2,-2, 0,-2,-2,-2, 0, 0, 2, 2, 2, 0, 0, 0, 2, 0, 2,-2,-2, 0,-2, 0, 2, 0, 0,-2, 0, 0, 0, 0,-2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 0,-2,-2,-2,-2, 0,-2,-2,-2,-2, 0, 2,-2,-2, 2, 2, 2, 0, 2, 0, 0,-2, 0, 2,-2,-2,-2,-2, 2, 0,-2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0,-2, 0, 0,-2,-2, 2, 2, 0, 0, 0, 0,-2,-2,-2,-2,-2,-2, 0, 0,-2, 0, 0,-2, 0,-2,-2, 0, 2,-2,-2,-2,-2, 2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2, 0, 0,-2,-2,-2, 0, 0,-2,-2, 0, 0,-2,-2, 0,-2,-2,-2,-2, 0,-2,-2,-2,-2, 2, 0,-2, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2, 2, 0,-2, 0,-2, 0,-2,-2,-2, 0,-2, 0, 0,-2,-2, 0,-2, 0, 0, 0, 0,-2, 0, 0,-2, 0, 2, 0, 0, 0,-2, 0, 0, 0,-2,-2,-2, 0,-2, 2,-2, 2,-2,-2,-2, 0, 2, 2, 0, 2, 2, 0,-2, 0, 2,-2, 0,-2,-2, 0,-2, 0,-2,-2, 0, 0,-2,-2,-2, 0, 0,-2,-2,-2,-2, 0, 0,-2,-2, 0, 0, 0,-2, 2, 0, 0,-2, 2,-2, 0,-2,-2, 0, 0,-2,-2, 2, 0,-2, 0,-2,-2,-2,-2,-2, 2,,, +0.187500,0.250000, 0, 0, 0, 0,-2,-2, 0,-2,-2, 0,-2, 0, 0, 0,-2,-2,-2,-2, 2,-2, 0, 2,-2,-2,-2, 2,-2,-2, 0,-2, 2,-2,-2, 0, 0,-2,-2, 0,-2, 2, 0,-2,-2,-2, 2,-2, 2,-2, 0, 0, 0,-2, 0,-2, 2, 2,-2, 2, 0,-2, 0, 2, 0, 0,-2, 0, 2, 0,-2, 2, 2, 2,-2, 0, 0, 0, 2, 0,-2, 0, 0, 0, 2, 0, 0, 2, 0, 2, 0, 0, 2, 2, 2,-2, 2,-2,-2, 2,-2, 0, 2, 2, 2, 2, 2, 2,-2,-2, 2, 2, 2, 2, 2, 2, 0,-2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2,-2, 0, 2,-2, 2, 0,-2,-2, 2, 2, 0, 0, 2, 0, 0, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2, 0, 0, 0,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2, 0, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0, 0,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2,-2, 0, 0, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0,-2, 0, 0,-2,-2, 0,-2, 0,-2, 0,-2, 0,-2, 0, 0, 2, 0,-2, 0,-2, 0,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2, 0,-2, 0,-2,-2, 0,-2, 0,-2,-2, 0, 0, 0, 0,-2, 0, 0, 0, 0, 0,-2,-2, 0, 0,-2,-2, 0, 0, 0,-2, 0,-2, 0,-2, 0,-2, 0, 0, 0, 0,-2,-2,-2,-2, 0,-2, 0,-2,,, +0.250000,0.312500,-2,-2, 2, 0, 0, 0, 0,-2,-2,-2,-2, 0, 0, 2,-2,-2,-2, 0, 2,-2,-2, 2, 0,-2,-2,-2,-2, 0, 0,-2, 2, 0,-2, 0, 0,-2, 0,-2, 2, 0, 0,-2,-2,-2,-2,-2, 2,-2,-2, 0,-2, 0,-2, 0, 2, 2, 2, 0, 2, 0, 2, 0, 2,-2,-2, 2, 0, 0, 0, 0, 2, 2, 2,-2, 2, 0, 0, 0, 2, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0,-2, 0, 0, 2, 0, 0, 2, 0, 0, 0, 2, 2, 0,-2, 2, 2, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 2, 2, 0, 2, 0, 0, 2, 2,-2, 0, 0, 0, 2,-2, 0,-2, 0, 0, 0, 0, 2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2, 0,-2,-2, 0, 0,-2, 0, 0, 0,-2,-2,-2,-2, 0, 0, 0,-2, 0,-2,-2, 0,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2,-2, 0, 0,-2, 0, 0,-2, 0,-2, 0, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2, 2,-2, 0,-2, 0, 0,-2, 2,-2, 0,-2, 0,-2,-2,-2, 0, 0, 0,-2,-2, 0,-2, 0, 0,-2,-2,-2,-2, 0, 0,-2,-2,-2, 0,-2, 0, 0, 0, 0,-2,-2, 0,-2, 2,-2,-2, 0, 0, 0,-2,-2,-2, 0, 0,-2, 0, 0,-2,-2,-2, 0, 2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2, 0,-2,-2,-2,-2,-2, 0, 0,-2,-2, 2, 0, 0, 0,-2, 2,-2, 0, 0, 0,-2, 0,-2, 0,-2, 0,-2,-2, 0,-2, 2, 0, 0, 0,-2,-2, 2, 2,-2, 2,-2, 2,-2,-2,,, +0.312500,0.375000,-2,-2, 2, 2, 0, 2, 2,-2, 0,-2,-2,-2, 2, 0,-2,-2,-2, 0, 2,-2,-2, 2,-2, 2,-2, 0,-2,-2, 2,-2, 0,-2, 0, 2, 0,-2, 2, 0, 0, 2, 0,-2,-2,-2, 0, 2, 0, 0, 0,-2,-2, 0,-2,-2, 2, 2, 2, 0, 0,-2, 0, 0, 0,-2,-2,-2, 2, 0, 0,-2, 0, 2, 0,-2, 2,-2, 2, 0, 0, 2, 0,-2, 0, 0, 2, 2, 2, 0, 2, 2, 0,-2, 0, 0, 0, 2,-2, 0, 0, 2, 0, 2, 2, 2, 0, 0, 2, 0, 0, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2,-2, 2, 0,-2, 2,-2,-2,-2, 2, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2, 2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0, 0, 0,-2,-2,-2, 0, 0,-2,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2,-2, 0,-2, 2, 0, 0,-2, 0, 0,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2,-2,-2, 2,-2,-2,-2,-2,-2, 0,-2, 0, 0,-2,-2,-2,-2, 0,-2, 0,-2, 0,-2, 0,-2, 0,-2,-2,-2,-2,-2, 0, 0, 0,-2,-2, 0, 0, 0,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2, 0, 0,-2, 0, 0,-2, 0, 0, 0, 0, 0,-2,,, +0.375000,0.437500,-2,-2, 0, 0, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 2,-2, 0, 0,-2,-2,-2, 2,-2,-2, 2, 0, 0, 0,-2, 0, 0,-2, 0, 0, 0, 0,-2,-2, 0,-2, 0, 0, 2, 0,-2,-2,-2, 0, 0,-2, 2, 2, 0, 2, 0, 0, 0, 2, 2,-2,-2,-2,-2, 0, 0,-2, 2, 0, 0, 2, 2,-2, 2, 2,-2, 2, 2,-2, 0, 2, 0, 0, 2, 0, 2, 2, 2,-2, 2,-2, 0, 2,-2, 0,-2, 2, 2, 2, 0, 0, 0, 2, 2,-2, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 2, 0, 0,-2, 2, 0,-2, 2,-2, 0, 0, 0, 0, 0, 2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2, 0, 0,-2,-2,-2, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2, 0, 0, 0,-2, 0, 0,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2, 2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2,,, +0.437500,0.500000,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2, 0, 0,-2, 0, 2,-2,-2, 0,-2,-2, 0, 2,-2,-2, 0, 0, 0,-2, 0,-2,-2,-2, 0,-2,-2, 2,-2,-2, 0,-2, 2, 0, 0, 0, 0,-2,-2,-2, 2,-2, 0, 0, 2, 0, 0, 0, 2, 0, 2, 0,-2, 0, 2, 0, 0,-2, 2, 0,-2, 0, 2,-2, 2, 2,-2, 2, 2,-2, 0, 2, 2, 2, 2, 0, 2, 2, 2,-2, 2,-2, 0, 2,-2, 2,-2, 2, 2, 2, 0, 0, 2, 2, 2,-2,-2, 2, 2,-2, 2,-2, 2,-2, 0, 2, 2, 2,-2, 2, 2, 2, 0, 2,-2, 2, 0, 2,-2, 2, 0,-2, 2,-2, 2,-2, 2, 0,-2, 2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2, 2,-2,-2,-2, 2,-2,-2, 0,-2, 0,-2, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,,, +0.500000,0.562500,-2, 2, 0, 0,-2, 0, 0,-2,-2,-2,-2,-2, 0, 0, 2, 2,-2,-2, 2,-2,-2,-2,-2,-2,-2, 2, 0,-2, 2, 0, 2, 0,-2, 0,-2,-2,-2, 2,-2, 0,-2,-2,-2,-2, 0,-2, 2,-2,-2,-2,-2,-2, 0, 0, 2, 2, 2, 0, 2, 0, 2, 0, 0, 0,-2,-2, 2,-2, 0,-2, 2, 0,-2,-2, 0, 0, 2, 2, 0, 2, 2,-2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,-2, 0, 2, 0, 2,-2, 0, 2, 0, 2, 2, 2, 0, 2,-2, 0, 0, 0,-2, 0, 0, 2,-2, 0,-2, 0, 2, 2, 0, 0, 2, 2, 2,-2, 2, 0, 2,-2, 2, 2,-2, 2, 2,-2, 0,-2, 0,-2, 2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2, 2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2, 0,-2, 0, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2, 2,-2, 0,-2,-2,-2, 2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2, 0,-2,-2, 0,-2, 0, 0,-2, 0, 0,-2,-2, 2,-2,-2,-2, 0,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2, 2,-2,-2, 0, 0,-2,-2, 0,-2, 0,-2,-2, 0,-2,-2, 0,-2,-2, 2, 0,-2,-2,-2,-2,,, +0.562500,0.625000, 0, 0, 0, 2, 0, 0, 2, 0,-2, 0, 0, 0, 0,-2, 0, 0,-2, 0, 2, 0,-2, 2, 0,-2,-2, 0,-2,-2, 0,-2, 0, 0,-2, 2, 2, 0, 0, 0, 0, 2, 0,-2,-2, 0, 2, 0, 0,-2, 0,-2, 0, 0, 0,-2, 2, 2, 2, 0, 0, 0, 2,-2, 2, 0,-2, 0, 2,-2, 0, 0, 2, 2, 0, 0, 2,-2, 0, 2, 0, 2, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 0,-2, 2,-2, 0, 2, 0, 0,-2, 2, 0, 2, 2, 0, 0, 0, 2,-2,-2, 2, 2, 0, 2, 0, 0, 0, 2, 2, 2, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 0,-2, 2, 0, 0, 2,-2, 0,-2, 0, 2,-2, 2, 2, 0, 0,-2, 0, 0, 0,-2,-2, 0,-2,-2, 0,-2,-2,-2, 0,-2, 0, 0,-2, 0, 0,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2, 0, 0,-2, 0, 0, 0,-2,-2,-2, 0,-2, 0,-2, 0, 0,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2, 0, 0,-2, 0, 0, 0,-2, 0, 0, 0,-2, 0,-2, 0,-2, 0, 0, 0,-2, 0, 0, 0,-2,-2, 0, 0, 0,-2,-2, 0, 0,-2,-2,-2, 0, 0, 0, 2, 0, 0,-2,-2,-2, 0,-2, 0, 0,-2, 0,-2,-2,-2, 0,-2, 0, 0, 0, 0,-2,-2, 2, 0,-2, 0, 0,-2, 0, 0, 0, 0, 0, 0, 0,-2, 0, 0, 0,-2, 0, 0,-2, 0, 0,-2,-2,-2,-2, 0, 0,-2, 0, 0, 0, 2,-2,-2, 2, 0,-2, 0, 0, 0, 2, 0,,, +0.625000,0.687500,-2,-2, 0, 2, 0,-2, 2, 0,-2, 0,-2,-2,-2,-2,-2, 0,-2, 0, 2,-2, 0, 0,-2, 0,-2, 2,-2,-2, 2,-2, 2, 2,-2, 0, 0,-2, 0, 2, 0, 2, 0,-2, 0,-2, 2,-2, 2,-2,-2, 0,-2,-2, 0,-2, 2, 2, 2, 0, 0, 0, 2, 0, 2, 0,-2,-2, 2,-2, 0, 0, 2, 2,-2, 2, 2,-2, 0, 2,-2, 2, 0,-2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2,-2, 0, 2, 0, 0,-2, 2, 0, 2, 2, 2, 0, 0, 2,-2,-2, 2, 2,-2, 2, 2, 2,-2, 2, 2, 0, 0, 2, 0, 2, 2, 2, 2, 0, 0, 2, 0,-2, 2, 0, 0, 2, 0,-2, 0, 2, 0,-2, 2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2, 0,-2,-2, 0,-2,-2, 0,-2,-2, 0, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2, 0,-2,-2,-2,-2, 0,-2,-2, 0,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2, 0,-2,-2,-2, 0, 0, 2, 0, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0, 0,-2,-2,-2, 2, 0,-2,-2,-2,-2,-2,-2, 0, 0, 0, 0,-2,-2, 0, 0, 0,-2, 0,-2,-2,-2,-2, 0, 0,-2,-2, 0, 0, 0,-2,-2, 0, 0,-2,-2, 0, 0, 0, 0,-2, 0, 0,-2,,, +0.687500,0.750000,-2,-2, 2, 0, 0,-2,-2,-2,-2, 2,-2,-2, 0,-2, 0, 2, 0,-2, 2,-2, 0,-2,-2, 0,-2, 0,-2,-2, 2,-2, 2, 2,-2,-2,-2,-2,-2, 0, 0, 0,-2,-2, 0,-2, 0, 0, 2,-2,-2,-2,-2,-2,-2,-2, 2, 2, 2,-2, 2, 0, 2,-2, 2,-2,-2,-2, 2, 2, 0,-2, 2, 0,-2, 2,-2,-2, 0, 0,-2, 2, 2, 2,-2, 2,-2, 0, 2, 2, 0, 0, 2, 2, 2,-2, 0, 2, 0,-2,-2, 2, 2, 2, 0, 2,-2, 0, 2,-2, 2, 0, 0,-2, 0, 2, 2, 0, 2, 0, 0, 2, 2, 2, 2, 2, 0, 2,-2, 2, 2, 2,-2, 0, 0,-2, 2, 2,-2,-2, 2,-2,-2, 2, 0,-2,-2,-2,-2,-2,-2, 0, 0,-2, 0,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2, 0, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2, 0, 0, 0,-2,-2,-2,-2,-2,-2, 0,-2,-2, 2,-2,-2,-2,-2,-2,-2,-2, 0, 0, 0,-2, 0,-2,-2, 2,-2,-2, 2,-2,-2, 0,-2,-2, 2,-2,-2, 0, 0,-2,-2,-2,-2, 0, 0,-2, 0, 0,-2,-2, 0, 0,-2, 0,-2,-2, 0, 2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2,-2, 2,-2,-2, 0,-2, 2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2, 0,-2,-2, 2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,,, +0.750000,0.812500, 0,-2,-2, 0, 0, 2, 2,-2,-2,-2,-2,-2, 0, 2, 0,-2,-2,-2, 0,-2,-2, 2,-2,-2,-2,-2,-2,-2, 0,-2, 0, 2,-2, 2, 0,-2, 0, 2,-2, 0,-2, 0,-2,-2, 0, 2, 2, 0,-2,-2,-2, 2, 0,-2, 2, 2, 2,-2, 2, 0,-2, 0,-2,-2,-2,-2, 2, 2, 0, 2,-2, 2,-2,-2, 0, 0, 2, 0, 2, 0, 2,-2, 0,-2, 2, 0, 2, 0, 0, 0, 0,-2, 0, 0,-2, 2,-2, 2, 0, 0,-2, 2, 2, 0, 2, 2,-2,-2, 0,-2, 2,-2, 0, 2, 0,-2, 2, 0, 2, 0, 2, 0, 0,-2, 2, 2, 0, 2, 2, 2,-2, 0, 2, 0, 2, 0, 2, 2, 2, 2,-2, 2, 2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2,-2, 0,-2,-2,-2, 2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2, 0, 0,-2,-2, 0, 0, 0,-2,-2, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2, 2,-2,-2, 0, 0,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2, 0,-2, 0,-2,-2,-2, 2,-2,-2,-2,-2,-2, 0, 0, 0,-2, 0,-2, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2, 2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2, 2,-2,-2,-2,-2,-2,,, +0.812500,0.875000, 2,-2, 0,-2,-2,-2,-2,-2, 0, 0,-2,-2, 0, 0, 0, 0,-2,-2, 2,-2,-2, 2, 0,-2,-2, 0,-2,-2, 2, 0, 0, 0,-2,-2, 0,-2, 0,-2,-2, 0,-2,-2,-2, 0, 2, 0, 2, 0,-2, 0, 0,-2, 0, 0, 2, 2, 2, 0, 2, 0, 0, 0, 2, 0,-2, 0, 2, 0, 0,-2, 2, 0,-2,-2, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 2, 0, 0, 0,-2, 0, 2, 0, 0, 0, 0,-2, 2, 0, 0, 2, 0, 0, 2, 2, 2, 2,-2, 2, 0, 0,-2, 0, 2, 0,-2, 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 2, 0, 0, 2,-2, 2, 2, 2, 2, 0, 2,-2, 0, 0, 0, 0, 2,-2, 0, 0, 0, 0,-2,-2,-2, 0, 0,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2, 0,-2, 0, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2, 0, 0,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2,-2, 0, 0, 0,-2, 0,-2,-2,-2, 0, 0,-2, 0,-2,-2, 0, 0, 0,-2,-2,-2,-2,-2, 0,-2, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0, 0, 0,-2, 0, 0,-2,-2, 2, 0, 0, 0,-2, 0,-2, 2,-2, 0, 0, 0,-2,-2,-2,-2,-2,-2, 0,-2,-2, 0,-2,-2,-2, 0, 0,-2, 2, 0,-2, 0, 0, 0, 0,-2, 0,-2, 0, 0, 0, 0, 0, 2,-2, 0, 0,-2, 0,-2, 0, 0,,, +0.875000,0.937500, 0,-2, 0, 0,-2, 2,-2,-2,-2,-2,-2,-2, 0,-2, 0, 0,-2,-2, 2,-2,-2, 2,-2,-2,-2, 0,-2,-2, 2,-2, 0, 2,-2,-2, 0,-2, 0,-2,-2, 0, 0, 0,-2, 0, 0, 0, 2, 0, 0,-2, 0, 0, 0, 0, 2, 2, 2, 0, 2, 0, 2,-2, 2,-2,-2,-2, 2, 0, 0,-2, 2,-2,-2, 0, 0,-2, 2, 2, 2, 2, 2,-2, 2, 2, 2, 0, 2, 0, 0, 0, 2,-2, 0, 0, 0, 2,-2, 2,-2, 0, 2, 2, 0, 2, 2, 2, 2,-2, 2, 0, 0,-2, 0, 0, 0,-2, 0, 0, 2, 2, 2, 0, 2, 2, 0, 2, 0, 2, 0, 2,-2, 2, 2,-2, 2, 0, 2,-2, 2, 0, 0, 0, 2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2, 0,-2,-2,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2, 0,-2, 2,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2, 2,-2,-2, 0,-2,-2,-2,-2, 2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2, 2,-2,-2, 0, 2, 0,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,,, +0.937500,1.000000,-2, 0,-2, 0, 0,-2,-2, 0,-2, 0,-2, 0,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2, 0,-2, 0,-2,-2, 0,-2,-2,-2,-2, 0,-2, 0, 0, 0,-2, 0,-2,-2,-2,-2, 2, 0,-2,-2, 0,-2, 2, 0, 0, 0, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 0, 2, 2, 0, 0, 2, 0,-2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 2, 0, 2,-2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0,-2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2,-2, 2, 2, 0, 0, 2, 2, 0, 2, 2,-2, 0, 0, 2,-2,-2, 0, 0, 0,-2, 0, 0, 0, 2,-2, 0, 0, 0,-2,-2, 0, 0, 0, 0,-2, 2,-2, 0, 0, 0, 2, 0,-2,-2, 0, 0, 2, 0,-2, 0, 2,-2, 0, 0,-2, 0, 0,-2, 0, 2,-2,-2,-2, 0, 0, 0, 0, 2, 0,-2, 0,-2,-2, 0, 0, 0, 2,-2,-2, 0, 0,-2,-2, 0, 0,-2,-2, 0, 0, 0,-2,-2,-2,-2,-2, 2, 0,-2,-2, 0,-2,-2, 0, 0,-2, 0, 0,-2,-2, 0,-2,-2,-2, 2, 2, 0,-2,-2, 2, 2,-2, 0, 2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0,-2, 0,-2, 0,-2, 2, 2, 0, 0,-2, 0, 0,-2, 0, 0,-2, 2,-2, 0, 0,-2, 0, 0, 0, 0, 0,-2, 2, 0, 0, 0, 0,-2, 0, 0, 0, 0, 0, 0, 0, 2, 0,-2, 0,-2,-2, 0, 2,-2,-2,-2,-2,-2,-2, 0, 0, 0,-2,-2,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input5.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input5.csv new file mode 100644 index 0000000..b707ed6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input5.csv @@ -0,0 +1,8 @@ +Time:325,End Time,Feature 1,Feature 2,Feature 3,Feature 4,Feature 5,Feature 6,Feature 7,Feature 8,Feature 9,Feature 1,Feature 11,Feature 12,Feature 13,Feature 14,Feature 15,Feature 16,Feature 17,Feature 18,Feature 19,Feature 2,Feature 21,Feature 22,Feature 23,Feature 24,Feature 25,Feature 26,Feature 27,Feature 28,Feature 29,Feature 3,Feature 31,Feature 32,Feature 33,Feature 34,Feature 35,Feature 36,Feature 37,Feature 38,Feature 39,Feature 4,Feature 41,Feature 42,Feature 43,Feature 44,Feature 45,Feature 46,Feature 47,Feature 48,Feature 49,Feature 5,Feature 51,Feature 52,Feature 53,Feature 54,Feature 55,Feature 56,Feature 57,Feature 58,Feature 59,Feature 6,Feature 61,Feature 62,Feature 63,Feature 64,Feature 65,Feature 66,Feature 67,Feature 68,Feature 69,Feature 7,Feature 71,Feature 72,Feature 73,Feature 74,Feature 75,Feature 76,Feature 77,Feature 78,Feature 79,Feature 8,Feature 81,Feature 82,Feature 83,Feature 84,Feature 85,Feature 86,Feature 87,Feature 88,Feature 89,Feature 9,Feature 91,Feature 92,Feature 93,Feature 94,Feature 95,Feature 96,Feature 97,Feature 98,Feature 99,Feature 1,Feature 101,Feature 102,Feature 103,Feature 104,Feature 105,Feature 106,Feature 107,Feature 108,Feature 109,Feature 11,Feature 111,Feature 112,Feature 113,Feature 114,Feature 115,Feature 116,Feature 117,Feature 118,Feature 119,Feature 12,Feature 121,Feature 122,Feature 123,Feature 124,Feature 125,Feature 126,Feature 127,Feature 128,Feature 129,Feature 13,Feature 131,Feature 132,Feature 133,Feature 134,Feature 135,Feature 136,Feature 137,Feature 138,Feature 139,Feature 14,Feature 141,Feature 142,Feature 143,Feature 144,Feature 145,Feature 146,Feature 147,Feature 148,Feature 149,Feature 15,Feature 151,Feature 152,Feature 153,Feature 154,Feature 155,Feature 156,Feature 157,Feature 158,Feature 159,Feature 16,Feature 161,Feature 162,Feature 163,Feature 164,Feature 165,Feature 166,Feature 167,Feature 168,Feature 169,Feature 17,Feature 171,Feature 172,Feature 173,Feature 174,Feature 175,Feature 176,Feature 177,Feature 178,Feature 179,Feature 18,Feature 181,Feature 182,Feature 183,Feature 184,Feature 185,Feature 186,Feature 187,Feature 188,Feature 189,Feature 19,Feature 191,Feature 192,Feature 193,Feature 194,Feature 195,Feature 196,Feature 197,Feature 198,Feature 199,Feature 2,Feature 201,Feature 202,Feature 203,Feature 204,Feature 205,Feature 206,Feature 207,Feature 208,Feature 209,Feature 21,Feature 211,Feature 212,Feature 213,Feature 214,Feature 215,Feature 216,Feature 217,Feature 218,Feature 219,Feature 22,Feature 221,Feature 222,Feature 223,Feature 224,Feature 225,Feature 226,Feature 227,Feature 228,Feature 229,Feature 23,Feature 231,Feature 232,Feature 233,Feature 234,Feature 235,Feature 236,Feature 237,Feature 238,Feature 239,Feature 24,Feature 241,Feature 242,Feature 243,Feature 244,Feature 245,Feature 246,Feature 247,Feature 248,Feature 249,Feature 25,Feature 251,Feature 252,Feature 253,Feature 254,Feature 255,Feature 256,Feature 257,Feature 258,Feature 259,Feature 26,Feature 261,Feature 262,Feature 263,Feature 264,Feature 265,Feature 266,Feature 267,Feature 268,Feature 269,Feature 27,Feature 271,Feature 272,Feature 273,Feature 274,Feature 275,Feature 276,Feature 277,Feature 278,Feature 279,Feature 28,Feature 281,Feature 282,Feature 283,Feature 284,Feature 285,Feature 286,Feature 287,Feature 288,Feature 289,Feature 29,Feature 291,Feature 292,Feature 293,Feature 294,Feature 295,Feature 296,Feature 297,Feature 298,Feature 299,Feature 3,Feature 301,Feature 302,Feature 303,Feature 304,Feature 305,Feature 306,Feature 307,Feature 308,Feature 309,Feature 31,Feature 311,Feature 312,Feature 313,Feature 314,Feature 315,Feature 316,Feature 317,Feature 318,Feature 319,Feature 32,Feature 321,Feature 322,Feature 323,Feature 324,Feature 325,Event Id,Event Date,Event Duration +0.000000,0.062500, 2, 2, 0, 0, 0, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, 2, 2, 0, 2, 0, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2,-2,-2,-2,-2, 0, 0,-2,-2, 0, 0, 0, 0,-2, 2, 0,-2, 0, 2, 0, 0, 0, 2, 2, 0, 2, 0, 0, 0,-2, 0, 2, 0, 0, 2, 0, 2,-2, 2, 0, 2,-2, 0,-2,-2, 2, 2, 0, 0, 0,-2,-2, 2, 2, 2,-2, 0, 0, 2, 2, 2,-2, 2, 2, 0, 0,-2, 2, 0, 0,-2,-2,-2,-2, 0, 2, 0, 2, 0, 2, 0,-2, 0, 2, 2,-2, 2,-2, 2,-2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 0, 0, 0, 2, 2, 0, 2, 0, 2, 2, 2,-2, 0, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 0, 2, 0, 0, 0, 0, 2, 0, 0,-2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2,-2, 2, 2, 0, 0, 2, 0, 2, 0, 2, 2, 0, 0, 2, 0, 0, 2,-2, 2, 2, 2, 0,-2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0,-2, 0, 2, 2, 2, 0, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 2,-2, 0, 0, 2, 2, 2, 0,-2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 2, 2,-2, 2,-2, 0, 2, 0, 2, 0, 0, 0, 2,-2, 2, 2, 2, 2, 0, 2, 0, 0, 0,,, +0.062500,0.125000, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2,-2, 2, 0, 0, 2, 2, 2, 0, 0, 2,-2, 0, 2, 2, 0, 2, 0,-2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0,-2, 0, 0, 2, 2, 0, 0,-2, 0,-2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 0, 2, 2,-2, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,-2, 2, 2, 0, 0, 0, 0,-2,-2,-2, 2,-2, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0,-2, 0,-2,-2,-2,-2, 0,-2, 0, 0, 2, 0, 0,-2, 0, 2, 2, 2, 2, 0, 0, 0,-2, 2, 2,-2,-2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 0, 2, 2, 0, 2,-2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 2, 2,-2, 2, 2, 2, 2, 2,-2,-2, 2, 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2,-2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2,-2,-2, 0, 0, 2, 2,-2, 2, 0, 2,-2, 0, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 0, 0,-2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 0,-2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 2, 2, 0, 2,-2, 0,-2, 2, 0, 0, 2, 2, 0,-2, 0,-2, 2, 0, 2, 2, 2,-2, 0, 0,-2,-2, 0, 0, 0, 0,-2,,, +0.125000,0.187500, 2, 0, 0, 0, 0, 2, 2, 0, 2,-2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 2,-2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,-2,-2,-2,-2,-2, 0, 2, 0, 0, 0, 0, 0,-2, 0,-2, 0, 0,-2,-2, 2,-2, 2,-2,-2, 2,-2, 2, 2,-2, 0,-2,-2,-2,-2,-2,-2, 2, 2,-2, 2, 0,-2, 0,-2, 2, 0, 0,-2,-2,-2, 0,-2,-2, 2,-2,-2,-2, 2,-2,-2, 0, 2,-2, 0, 0,-2,-2,-2,-2,-2, 0,-2, 2,-2,-2,-2, 2,-2, 0, 0,-2,-2,-2, 2, 0, 2, 0,-2, 0, 2, 2,-2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2,-2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 0, 0, 2, 0, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 2, 0, 0, 2, 2, 0, 2, 2, 2, 0,-2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2,-2, 2, 2,-2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 0, 0, 2, 0,,, +0.187500,0.250000, 2, 2,-2, 0,-2,-2, 0, 2,-2, 2, 2, 2,-2, 0, 0,-2, 0, 0,-2, 0, 2, 0, 0, 0, 2, 0, 2, 0, 0, 2,-2, 0, 2, 2,-2, 2, 0,-2,-2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,-2,-2,-2,-2, 0, 2, 0,-2, 0, 0, 0, 0,-2, 0,-2, 0,-2, 0,-2, 0,-2, 2, 0,-2, 2,-2,-2, 0, 0,-2,-2, 0,-2, 0, 0, 0,-2, 0,-2, 2,-2, 0, 0, 0, 2, 0,-2,-2,-2,-2, 0, 0, 2, 2,-2, 0, 0, 0,-2, 0,-2, 0,-2, 2, 0, 0, 0, 0, 0, 0,-2,-2,-2,-2, 0, 0, 2,-2, 0, 0, 0, 2, 2, 0,-2,-2, 0,-2,-2, 2, 2, 0, 2, 0, 2, 0, 2, 0, 2, 2, 0, 2, 0,-2, 0, 0, 2, 2, 0,-2, 0,-2, 2, 0, 2, 2, 2, 2, 0, 2, 0, 0, 2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0,-2, 0, 0,-2, 0, 2, 0, 0, 2,-2, 0,-2, 0,-2, 0, 2, 2, 0, 0, 0,-2, 0, 0, 2, 2, 2, 0, 0, 2,-2, 2, 2, 0, 0, 0, 0,-2,-2, 0, 0, 0, 0, 2, 2,-2, 2, 2, 0, 0, 2, 0, 2, 2, 0, 2, 0, 2, 2,-2, 2,-2,-2, 2, 2, 0,-2, 0,-2, 2, 0, 0, 2, 0, 2,-2, 0, 2, 0, 0, 0,-2, 0, 0, 2,-2,-2, 2, 0, 2, 0, 0, 2, 2, 0, 0,-2, 0, 2, 0,-2,-2, 0, 0, 2, 0, 0, 2, 2,-2, 0, 0, 2, 0, 0, 2, 0, 2, 0, 0,-2, 0, 0, 2,-2, 2, 0, 0, 2, 0, 2, 0, 0, 0,-2, 2,-2, 0, 2,,, +0.250000,0.312500, 0, 0,-2,-2,-2, 0,-2, 0, 2,-2, 2,-2, 2, 2, 0, 0, 0, 0, 0, 2, 2,-2, 0, 2,-2, 0, 2,-2,-2, 2,-2, 0, 2,-2,-2, 2, 0, 0,-2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 0, 0,-2, 2,-2,-2,-2, 0, 0,-2, 0, 0,-2, 0,-2, 0, 0,-2, 2, 0, 0,-2,-2, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2, 2,-2,-2, 2, 0,-2,-2, 0, 2, 0, 2,-2,-2,-2, 0,-2, 0, 2,-2,-2,-2, 0,-2,-2, 2, 2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 2,-2,-2,-2, 2,-2, 2,-2,-2, 0, 0, 0,-2,-2, 0,-2, 0, 2, 2,-2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 2, 2, 0, 2, 0, 0, 2, 0, 2, 2, 2,-2, 0, 2, 2, 2,-2, 2, 2,-2, 2, 2, 2, 2, 0,-2, 2, 2,-2, 0, 2, 2, 2, 2, 2, 2, 0,-2, 2, 2, 0, 0, 2, 2, 2, 0, 2, 2, 0,-2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2,-2, 2,-2,-2,-2, 0, 2,-2, 0,-2,-2, 2, 2,-2,-2, 0, 0,-2, 2, 2, 2, 2, 2,-2,-2, 0, 2, 0, 2, 0, 2, 0, 2,-2, 0,-2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 0,-2,-2, 2, 0, 2,-2,-2,-2, 0,-2, 0, 2, 0,-2, 2,-2,-2, 2,-2,-2, 0, 2, 0,-2, 2,-2, 0, 2,-2,-2, 2,-2, 2,-2,-2, 2,-2, 0,-2, 0,-2,,, +0.312500,0.375000, 0,-2,-2,-2, 0, 0,-2, 0, 0,-2, 2,-2, 0, 2, 0,-2, 0,-2, 2, 0, 2,-2, 0, 2, 0, 0, 2,-2,-2, 2,-2, 0, 2,-2,-2, 2,-2, 2,-2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,-2, 2, 2,-2,-2, 2, 0, 0,-2, 0,-2, 0,-2, 0,-2,-2, 0, 2,-2, 0,-2, 0,-2,-2, 2, 0, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 2,-2,-2, 2, 0,-2, 0, 0, 2, 2, 0,-2,-2, 0, 0,-2, 2, 0,-2,-2,-2,-2, 0,-2, 2, 0,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0, 2,-2,-2,-2, 2,-2, 0,-2,-2, 2, 2, 0,-2,-2, 2,-2,-2, 0, 0, 0, 0, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 0, 0, 2, 2, 0, 0, 0,-2,-2, 0, 2, 2,-2, 0, 2, 2, 0, 2, 0, 0, 2, 0, 2, 0, 2,-2, 0, 0,-2, 0,-2, 2, 2,-2,-2, 2, 2, 2, 2, 0, 2, 0, 0, 0,-2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 0, 0, 2, 2, 2, 0, 2, 2,-2, 0, 0, 2, 0,-2, 0, 0, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 0,-2, 2, 0,-2,-2, 2, 0,-2,-2,-2,-2, 0, 2,-2, 0, 0, 0, 0, 0, 2, 0, 2, 2, 0, 0, 0, 2, 0, 2,-2, 2, 0, 0,-2, 2,-2, 2, 0, 0,-2, 0, 2, 2,-2, 2,-2, 0, 0, 0, 0, 0,-2,-2,-2, 2,-2, 0, 2, 0,-2, 2,-2,-2, 2,-2,-2, 0, 0, 2,-2, 2,-2, 0, 2, 0,-2, 0,-2, 2,-2,-2, 2, 0,-2,-2, 0,-2,,, +0.375000,0.437500, 2, 2,-2, 0,-2,-2, 2, 0,-2, 2, 2, 2,-2, 0, 0,-2, 0, 0,-2, 0, 2, 0, 0, 0, 2, 0, 2, 0, 0, 2,-2, 0, 2, 2,-2, 2, 0,-2,-2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2,-2,-2,-2,-2,-2, 2,-2,-2, 0, 0, 0, 0,-2, 0,-2, 0,-2, 0,-2, 0,-2, 2, 0,-2, 2,-2,-2, 0, 0,-2,-2, 0, 0, 0, 0,-2,-2, 0, 0, 2,-2, 0, 0, 0, 2, 0,-2,-2,-2,-2, 0, 0, 2, 2,-2,-2,-2, 0,-2,-2,-2, 2,-2, 2, 0, 0, 0, 0, 0,-2,-2,-2,-2, 0, 0, 0, 2,-2, 0, 0, 0, 2, 2, 0,-2,-2, 0,-2,-2, 2, 2, 0, 2, 0, 2, 0, 2, 0, 0, 2, 0, 2, 0,-2, 0, 0, 2, 2, 0,-2, 2,-2, 2, 2, 0, 2, 2, 2, 0, 2, 0, 0, 2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0,-2, 0, 0, 0, 2, 2, 0, 0, 2,-2, 0,-2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 2,-2, 2, 2, 0, 0, 2, 0,-2,-2, 0, 0, 0, 0, 2, 2,-2, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2,-2, 2, 0,-2, 2, 2, 0,-2, 2,-2, 2, 0, 0, 2, 0, 2,-2, 0, 2, 0, 0, 0,-2, 0, 2, 2,-2,-2, 2, 0, 2, 0, 0, 2, 2, 0, 0,-2, 0, 2, 2, 0,-2, 0, 0, 2, 0, 0, 2, 2,-2, 0, 0, 2, 0, 0, 2, 0, 2, 0, 0,-2, 0, 0, 2,-2, 2, 0, 0, 2,-2, 2, 0, 0, 0,-2, 2,-2, 0, 2,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input6.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input6.csv new file mode 100644 index 0000000..084b833 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input6.csv @@ -0,0 +1,14 @@ +Time:325,End Time,Feature 1,Feature 2,Feature 3,Feature 4,Feature 5,Feature 6,Feature 7,Feature 8,Feature 9,Feature 1,Feature 11,Feature 12,Feature 13,Feature 14,Feature 15,Feature 16,Feature 17,Feature 18,Feature 19,Feature 2,Feature 21,Feature 22,Feature 23,Feature 24,Feature 25,Feature 26,Feature 27,Feature 28,Feature 29,Feature 3,Feature 31,Feature 32,Feature 33,Feature 34,Feature 35,Feature 36,Feature 37,Feature 38,Feature 39,Feature 4,Feature 41,Feature 42,Feature 43,Feature 44,Feature 45,Feature 46,Feature 47,Feature 48,Feature 49,Feature 5,Feature 51,Feature 52,Feature 53,Feature 54,Feature 55,Feature 56,Feature 57,Feature 58,Feature 59,Feature 6,Feature 61,Feature 62,Feature 63,Feature 64,Feature 65,Feature 66,Feature 67,Feature 68,Feature 69,Feature 7,Feature 71,Feature 72,Feature 73,Feature 74,Feature 75,Feature 76,Feature 77,Feature 78,Feature 79,Feature 8,Feature 81,Feature 82,Feature 83,Feature 84,Feature 85,Feature 86,Feature 87,Feature 88,Feature 89,Feature 9,Feature 91,Feature 92,Feature 93,Feature 94,Feature 95,Feature 96,Feature 97,Feature 98,Feature 99,Feature 1,Feature 101,Feature 102,Feature 103,Feature 104,Feature 105,Feature 106,Feature 107,Feature 108,Feature 109,Feature 11,Feature 111,Feature 112,Feature 113,Feature 114,Feature 115,Feature 116,Feature 117,Feature 118,Feature 119,Feature 12,Feature 121,Feature 122,Feature 123,Feature 124,Feature 125,Feature 126,Feature 127,Feature 128,Feature 129,Feature 13,Feature 131,Feature 132,Feature 133,Feature 134,Feature 135,Feature 136,Feature 137,Feature 138,Feature 139,Feature 14,Feature 141,Feature 142,Feature 143,Feature 144,Feature 145,Feature 146,Feature 147,Feature 148,Feature 149,Feature 15,Feature 151,Feature 152,Feature 153,Feature 154,Feature 155,Feature 156,Feature 157,Feature 158,Feature 159,Feature 16,Feature 161,Feature 162,Feature 163,Feature 164,Feature 165,Feature 166,Feature 167,Feature 168,Feature 169,Feature 17,Feature 171,Feature 172,Feature 173,Feature 174,Feature 175,Feature 176,Feature 177,Feature 178,Feature 179,Feature 18,Feature 181,Feature 182,Feature 183,Feature 184,Feature 185,Feature 186,Feature 187,Feature 188,Feature 189,Feature 19,Feature 191,Feature 192,Feature 193,Feature 194,Feature 195,Feature 196,Feature 197,Feature 198,Feature 199,Feature 2,Feature 201,Feature 202,Feature 203,Feature 204,Feature 205,Feature 206,Feature 207,Feature 208,Feature 209,Feature 21,Feature 211,Feature 212,Feature 213,Feature 214,Feature 215,Feature 216,Feature 217,Feature 218,Feature 219,Feature 22,Feature 221,Feature 222,Feature 223,Feature 224,Feature 225,Feature 226,Feature 227,Feature 228,Feature 229,Feature 23,Feature 231,Feature 232,Feature 233,Feature 234,Feature 235,Feature 236,Feature 237,Feature 238,Feature 239,Feature 24,Feature 241,Feature 242,Feature 243,Feature 244,Feature 245,Feature 246,Feature 247,Feature 248,Feature 249,Feature 25,Feature 251,Feature 252,Feature 253,Feature 254,Feature 255,Feature 256,Feature 257,Feature 258,Feature 259,Feature 26,Feature 261,Feature 262,Feature 263,Feature 264,Feature 265,Feature 266,Feature 267,Feature 268,Feature 269,Feature 27,Feature 271,Feature 272,Feature 273,Feature 274,Feature 275,Feature 276,Feature 277,Feature 278,Feature 279,Feature 28,Feature 281,Feature 282,Feature 283,Feature 284,Feature 285,Feature 286,Feature 287,Feature 288,Feature 289,Feature 29,Feature 291,Feature 292,Feature 293,Feature 294,Feature 295,Feature 296,Feature 297,Feature 298,Feature 299,Feature 3,Feature 301,Feature 302,Feature 303,Feature 304,Feature 305,Feature 306,Feature 307,Feature 308,Feature 309,Feature 31,Feature 311,Feature 312,Feature 313,Feature 314,Feature 315,Feature 316,Feature 317,Feature 318,Feature 319,Feature 32,Feature 321,Feature 322,Feature 323,Feature 324,Feature 325,Event Id,Event Date,Event Duration +0.000000,0.062500, 0,-2, 0, 0, 0, 0, 0,-2,-2,-2,-2, 0, 0, 2, 0, 0, 0, 0, 2,-2,-2,-2,-2,-2,-2, 0, 0,-2, 2,-2, 2, 0, 0,-2, 0,-2,-2, 2,-2, 0, 2, 0, 0,-2,-2, 0, 2, 0,-2,-2,-2, 0,-2, 0,-2,-2,-2,-2, 2,-2,-2,-2, 0, 0,-2, 2,-2, 2, 0,-2,-2,-2, 0, 0, 0, 0, 0, 2, 0, 2, 2,-2, 2, 0,-2,-2, 0,-2, 0, 2,-2, 2, 0,-2,-2, 2,-2,-2, 0, 2,-2, 0, 0,-2, 0, 0, 2, 2, 2, 0,-2, 0, 0, 0, 2, 2,-2,-2, 0, 2, 0, 0, 2, 0, 2,-2,-2, 2, 2, 2,-2, 0, 2, 2, 2,-2, 2, 0, 0, 2,-2, 0, 2,-2,-2, 0,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2, 2,-2,-2,-2, 0,-2, 0, 0, 0,-2, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0, 0,-2,-2, 0,-2,-2, 0,-2, 0,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2, 0, 0, 0, 0,-2, 2, 0,-2, 0,-2, 2, 0, 0, 0, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2, 2, 0,-2, 2,-2,-2, 0, 2, 0,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0, 0, 0,-2,-2,-2,-2,-2,-2, 0, 0, 0,-2, 0,-2,-2,-2, 0,-2, 0, 0,-2, 0, 2, 2, 0,-2, 0,-2, 0, 0, 0,-2,-2, 0, 0,-2, 0, 2,-2,-2, 0, 0, 0,,, +0.062500,0.125000, 0,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2, 2, 2, 0, 0, 0,-2,-2,-2, 0, 0, 0, 0,-2, 2, 2, 0,-2, 0, 2, 0,-2, 2,-2, 2,-2,-2, 0, 0, 2, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2,-2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 2,-2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2,-2, 2, 0, 2, 2, 0, 0, 0, 2, 0, 2, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 0, 0, 2, 0, 0,-2, 0, 2, 2, 0, 0, 0, 2, 2,-2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 0, 2,-2, 0, 2,-2,-2, 2, 2, 2,-2, 2, 0,-2, 2, 2, 0, 2, 0,-2,-2, 2, 2,-2,-2, 0, 2, 0, 0, 0, 0, 2, 0,-2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 0,-2,-2, 2, 0,-2,-2, 0, 2, 0,-2, 2, 2, 0, 0,-2, 2, 0, 0,-2, 2, 2, 2,-2, 2,-2, 0, 0, 2,-2,-2,-2, 2,-2, 0,-2, 2, 2,-2, 0, 0,-2, 0, 2, 0,-2, 0, 0,-2,-2, 2, 0,-2, 2,-2,-2, 0, 0, 2, 2,-2, 0,-2, 2, 2,-2, 0, 2, 2,-2, 2,-2,-2,-2,-2,-2, 2, 0,-2, 2,-2, 0,-2,-2, 2, 0, 0, 2, 2, 0,-2, 0, 2,-2,-2, 2, 2, 0, 0, 0, 2,-2, 2,-2,-2,-2, 2, 0,-2, 2, 2,-2,-2,-2, 2,-2,-2, 2, 0, 0, 2, 2, 2, 0,-2,-2, 2,-2,-2, 2,-2,-2,-2,-2,-2,-2,-2, 0, 2,-2,-2,,, +0.125000,0.187500, 2,-2, 0, 0, 0,-2,-2,-2, 0, 0, 0, 0,-2, 0,-2, 0, 2, 0, 0, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0,-2,-2, 0,-2, 0, 2, 0, 0,-2, 0, 0, 0, 0,-2,-2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 2, 2, 0, 2, 0, 0, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 2,-2, 0,-2, 0, 0, 0, 0, 2, 0, 2, 2, 0, 0, 0, 2, 0,-2, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 2, 2, 2, 0, 2, 0, 2, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2,-2, 0, 2, 2, 2, 0, 0, 2,-2, 2, 2, 0, 0, 2, 0, 0, 2, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0,-2, 2, 0, 2, 0, 2, 0, 2, 0, 2,-2,-2, 2, 0, 2, 2, 2, 0, 0, 0, 2, 0, 0, 0,-2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 2, 2, 0,-2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0,-2, 2, 0, 0, 0, 0,-2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 2, 2, 2,,, +0.187500,0.250000, 0,-2, 0, 0,-2,-2, 0, 0, 0, 0, 0, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0, 0, 0, 2, 0,-2, 0, 0, 0, 0, 0, 0, 0,-2, 0, 2, 2,-2,-2,-2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 2, 0, 2,-2, 2, 2, 2, 0, 2, 2, 2, 0, 0, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2,-2, 0, 0, 2, 2, 2, 0, 0, 0, 2, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 0, 0, 2,-2, 2, 0, 2, 2, 0, 2, 0, 0,-2, 0, 2, 0, 2,-2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 2,-2, 0, 2, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0,-2, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 2,-2,-2, 2, 2, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 2, 2, 2,-2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 2, 0, 0,-2, 0, 0,-2, 2, 0, 0, 0, 0, 0, 0,-2, 0, 2, 0, 0,,, +0.250000,0.312500, 0,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2, 2,-2,-2, 0, 0,-2, 0,-2, 0, 0, 0, 0, 0,-2, 0, 2,-2,-2,-2, 0,-2, 0, 0,-2, 0,-2,-2,-2, 0,-2, 0,-2,-2, 0, 0,-2, 0,-2,-2, 0,-2,-2, 0,-2,-2,-2,-2, 0,-2, 2,-2,-2, 0,-2, 0, 0, 0, 2,-2, 0, 0, 0, 0, 2,-2, 0, 0,-2,-2, 2, 2,-2, 2, 0, 2, 0, 2, 0,-2,-2,-2, 2, 2, 2, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2,-2,-2,-2, 2, 0,-2,-2,-2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 0, 2, 2,-2, 0, 0, 0, 0, 0, 0,-2,-2,-2, 2,-2, 0, 2, 2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 2, 2,-2,-2,-2, 0,-2,-2,-2, 2, 0,-2, 0,-2,-2,-2,-2,-2, 0, 0,-2, 0,-2,-2, 2,-2,-2, 0, 2,-2,-2,-2, 0,-2,-2, 0,-2,-2,-2,-2, 0, 0, 0, 0, 0, 2, 0, 0,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 2, 2,-2,-2,-2,-2,-2, 0,-2,-2, 2,-2, 0,-2,-2, 0,-2, 0, 0, 0,-2,-2,-2,-2, 2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2, 0,-2, 0, 0,-2,-2,-2,-2,-2, 2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 2,-2, 2, 0,-2, 2,-2,-2, 0,-2,-2, 2,-2, 2,-2,-2, 2, 2,-2, 0,-2,-2,-2,-2, 2,-2,-2, 0, 2, 2, 2,-2, 2,-2,-2,,, +0.312500,0.375000, 0, 2, 0, 0,-2,-2, 2, 0, 0,-2, 2, 0,-2,-2, 2, 2, 0, 2, 0, 0, 2, 0, 0, 0,-2,-2, 0, 0,-2, 0, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 0, 2, 2, 0,-2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 2, 0, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 0, 2, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 2, 0, 2,-2, 2, 2, 2, 2,-2, 0, 0, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 2, 0, 0, 2, 2,-2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 0, 2, 0, 2, 0, 2, 2,-2, 2, 0, 0, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 2, 0,-2, 0, 2, 2, 2, 2, 0, 0, 2, 0, 2, 0, 2,-2, 0, 2, 0, 2, 2,-2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0,-2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 0, 0, 0, 2, 0, 0, 2, 0, 2, 0, 0, 0, 2, 2,,, +0.375000,0.437500,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2,-2, 2,-2,-2,-2,-2,-2,-2, 0, 0,-2, 2, 0, 0, 0, 0, 0,-2,-2, 0,-2, 0,-2,-2,-2,-2, 2, 2,-2,-2, 2,-2, 2, 2, 0, 2, 2, 0,-2, 2, 2, 2, 2, 2, 0, 2,-2, 2, 2, 2, 2, 2, 0, 0, 2, 0, 2, 2, 2,-2, 2, 0, 2, 2,-2, 0, 2, 0, 0, 2, 2, 2, 2,-2, 2, 0, 2, 0, 2, 0, 2, 2, 0, 2, 0, 2,-2, 0, 0, 2, 2, 0, 0, 2, 2, 2, 0,-2, 0, 0, 0, 0, 2,-2, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 0, 0, 0,-2,-2,-2,-2,-2, 2,-2, 2, 2,-2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 0,-2, 2, 2,-2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2,-2, 2,-2, 0, 0, 2,-2, 2, 2,-2, 2, 0,-2, 0,-2, 2,-2,-2,-2, 0, 0, 0, 2, 0,-2, 2, 0, 0, 0, 2,-2,-2,-2,-2, 2, 0, 2, 0, 2, 2, 2, 0, 2, 0, 2, 2, 2,-2,-2, 0,-2, 0, 2, 2, 0, 0,-2,-2, 0, 2, 2, 2, 0, 0, 2, 0, 2, 0, 2,-2, 2, 0,-2,-2, 2,-2, 0,-2,-2, 2,-2, 2,-2,-2, 0,-2, 2, 2,-2, 0, 2,-2, 0,-2, 2,-2, 0,-2, 2, 2, 0, 2, 2, 0,-2, 2, 0,-2, 0,-2,-2, 2, 0, 0, 2,-2,-2, 0,-2, 2, 0,-2, 2, 2,-2, 2,-2, 0, 0,-2, 0,-2,-2, 0, 0,-2,-2, 0, 0,-2, 2,-2,-2,,, +0.437500,0.500000,-2, 0,-2,-2,-2,-2, 2, 0, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 2,-2,-2,-2,-2,-2,-2, 0,-2,-2, 0, 2, 0, 0, 0, 2, 0,-2,-2,-2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2,-2, 2, 0, 2, 2, 2, 0, 2, 2, 0, 2, 0, 2, 2, 0, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 2, 2, 2,-2, 2, 2,-2, 0, 0, 2, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 0, 0,-2, 2, 2,-2, 2, 2, 2, 0, 0, 0, 0, 2, 0,-2, 2, 2, 2, 2, 2, 0,-2, 2, 2, 0, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, 0,-2, 0, 0, 0, 0, 0, 2, 2, 0, 0, 2, 0, 0, 2, 0, 2, 2, 2, 0, 0, 2, 0, 0,-2, 0, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0,-2, 0,-2,-2, 2, 0,-2, 2, 0,-2,-2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2,-2, 2, 0,-2,-2, 2, 0, 2, 0,-2, 2, 0, 0, 2, 0,-2,-2, 0, 2,-2, 0, 2, 0,-2,-2, 2, 0, 2,-2, 0, 2, 0, 0, 0, 0, 0, 0, 0,-2,-2, 0, 0, 2, 0, 0, 0,-2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 2,-2,-2, 0,-2,-2, 2, 0,-2,-2, 2, 0, 0, 0, 0, 2,-2,-2,,, +0.500000,0.562500,-2, 0,-2,-2,-2, 0,-2,-2,-2, 0, 0, 2, 2,-2,-2,-2,-2,-2, 0,-2,-2, 2, 0,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0, 2, 2,-2,-2, 0,-2,-2,-2,-2,-2,-2, 2,-2, 0,-2,-2,-2, 0, 2,-2, 0, 0,-2, 0,-2, 2,-2, 2, 2, 0,-2, 2, 0,-2, 2, 0, 2, 0, 0,-2, 0,-2, 2,-2, 0, 2, 0, 2, 2, 0,-2, 0, 2, 2, 2, 2, 2, 2, 0,-2,-2, 0,-2,-2, 0, 2,-2,-2, 2, 0, 2, 0, 0, 2,-2,-2, 0,-2, 2, 0, 2, 0, 2, 2,-2,-2, 0, 2, 0, 2, 0,-2, 2, 2, 2,-2, 0,-2, 2,-2, 2, 2,-2,-2,-2, 2, 0,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2, 0, 0, 0, 2, 2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2, 2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2, 2, 0,-2,-2, 2, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2, 0, 2, 2,-2, 0, 0, 0, 0, 0, 2, 2, 0,-2,-2, 0,-2,-2,-2,-2,-2, 0,-2,-2, 2,-2,-2,-2,-2, 2, 0,-2,-2, 2, 2,-2,-2, 0, 2,-2, 2,-2, 0, 0,-2,-2, 2, 2,-2, 0,-2, 0,-2, 2, 2,-2,-2, 0,-2, 0,-2,-2, 2,-2,-2, 2,-2,-2,-2, 0,-2, 2,-2,-2, 0,-2, 0, 0,-2, 0, 0, 2,-2,-2,-2, 2,-2, 0, 2,-2, 0,-2, 0,-2, 0, 2, 2,-2, 2,-2,-2, 2,-2, 0, 0,-2, 2,-2,-2,-2,-2,-2, 2,-2, 2, 0, 2,,, +0.562500,0.625000,-2,-2, 0, 0, 0, 0, 0,-2,-2, 0,-2, 0, 0, 0,-2, 0,-2, 0,-2, 0,-2, 2, 0, 2, 0,-2, 0,-2, 0,-2, 0, 0,-2, 0, 2, 0, 0, 0, 0, 0,-2, 0,-2, 2,-2,-2, 0, 2, 0,-2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 0, 0, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 0, 0, 2, 0, 2, 0, 2, 0, 0, 2, 0, 0, 0,-2, 2, 2,-2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 2, 2, 2, 0,-2, 0, 0, 0, 0, 0, 2, 0, 0,-2, 0, 0, 2, 2, 0, 0, 0, 2,-2, 2, 0,-2, 0, 2, 2,-2,-2, 0,-2, 2, 0,-2, 0, 0, 2, 0,-2, 2, 0,-2, 0,-2, 0, 2, 2, 0,-2,-2, 0, 0, 0,-2, 2, 0, 0, 0, 0,-2, 0, 0, 0,-2, 0, 2, 0, 2,-2, 2, 2, 0, 2,-2, 0, 2, 2,-2, 2, 0, 2, 2, 0, 0, 2, 0, 2, 0, 2, 0,-2, 2,-2, 2, 0, 2, 0,-2, 2, 0, 0, 0,-2,-2, 0, 0, 2, 2, 0, 0, 0, 0,-2, 2, 0, 2, 2,-2, 0,-2, 0,-2, 0,-2, 0, 2, 0, 2, 2, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 2, 0, 0, 2, 0,-2, 0,-2,-2, 0,-2,-2,-2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0, 2, 0, 0, 0,-2, 2,-2, 2,-2, 0, 2, 2, 0, 0, 0, 0,-2, 2, 0, 2, 0, 0,-2, 2, 0, 0,-2, 0, 0, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0,,, +0.625000,0.687500,-2,-2,-2, 0, 2, 0, 0, 2, 0,-2, 0, 0, 0, 2, 2, 2, 0, 2,-2,-2, 0,-2,-2, 0, 0, 0, 2,-2,-2,-2, 2, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 2, 2, 2, 2,-2, 0, 2, 2,-2, 2, 2, 2, 2, 0, 0, 2, 2,-2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2,-2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2,-2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 0, 2, 2, 2, 0,-2, 0, 2, 0, 0, 2, 2, 2, 2, 2,-2, 0, 2, 2, 2, 0, 0, 2,-2, 2, 2, 0, 0, 2, 0, 2, 2, 0, 2,-2, 2, 2, 2, 0, 2, 2, 2,-2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2, 0, 0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 0, 2,-2, 2,-2, 0, 2, 0, 2, 0, 0, 0, 0, 2,-2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 0, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 2, 2, 0,-2, 2, 0, 2, 2, 0, 2,-2, 2, 2, 2, 0, 0, 2, 0,-2, 2, 0, 0, 2, 2, 2, 0,-2,-2, 0, 0, 0, 0, 0, 2,-2, 0, 2, 2,-2,-2, 0, 2, 0, 0,-2, 0, 2, 2,-2, 2, 2, 2, 0, 2, 2, 0, 2,-2, 0, 2, 2, 2,-2,-2, 0, 0, 0,-2, 2,-2, 0, 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 2, 0,-2, 2,-2, 2, 0, 2,-2,-2, 0, 2,-2,-2,-2,-2,-2,,, +0.687500,0.750000, 0, 0, 0, 2, 0,-2, 0, 0, 2, 0, 0, 0,-2, 0, 2, 2, 0, 2, 0, 0,-2,-2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0,-2,-2, 2,-2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 0, 2, 0, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 0,-2, 0, 2, 0,-2, 2, 2, 0, 2, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 2, 2,-2, 0, 2, 0,-2, 2, 2, 0, 2, 0, 0, 0, 0,-2, 0, 2,-2, 2,-2,-2, 0, 2, 2, 2, 0, 0, 2, 2, 2, 0, 2, 2, 0, 2, 0, 2,-2, 0, 0, 0, 2, 2, 2, 2,-2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2,-2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 2, 0, 2, 2, 2, 0, 2, 2, 0, 0, 0, 2, 2, 0, 2, 2,-2, 0, 2, 2, 2, 0, 2, 0, 2, 2, 0,-2, 0,-2, 2, 0, 0, 2,-2, 0, 2, 0, 0, 0,-2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2,-2,-2, 0, 2, 0, 0, 0, 2, 2,,, +0.750000,0.812500,-2, 2, 2, 0, 2,-2,-2, 0,-2, 2, 2, 2,-2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0,-2, 2, 2, 2, 0,-2, 0, 0, 0,-2,-2,-2, 0, 0, 0,-2, 0, 0, 0,-2,-2,-2,-2,-2, 0, 2, 0,-2,-2, 2,-2,-2, 0, 2, 0, 2, 0, 2, 0, 0, 0, 2,-2, 2, 2, 2,-2, 2, 2, 2, 2, 2, 0, 0, 2, 0, 0, 2, 0,-2, 0, 0, 0, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 0, 0,-2, 0, 2,-2, 0, 0, 2, 2,-2, 2, 2, 0, 0, 2, 0,-2, 0, 2, 0, 2, 0, 2, 2, 2, 0,-2, 0, 2, 2, 2, 2, 0, 0,-2, 2, 2,-2, 2, 2, 0, 0,-2, 0, 2,-2, 0, 0,-2, 0, 0, 0,-2,-2,-2, 0, 0,-2, 0, 0,-2,-2, 0,-2, 0, 2,-2, 0, 0, 0,-2, 0, 0, 0, 2, 0,-2, 0, 0,-2,-2, 0, 0,-2, 2, 0,-2, 0,-2, 2, 0,-2,-2, 2, 0,-2,-2,-2, 2, 0, 2, 0,-2, 0, 0,-2, 2, 0, 2, 0, 0, 2, 2, 2,-2,-2,-2, 0, 2,-2, 2, 0, 0,-2,-2, 0,-2, 0, 0, 0, 0, 0,-2, 0, 0,-2, 2,-2,-2, 2, 2,-2,-2, 2, 2, 0,-2, 2, 2, 2, 2, 0,-2, 2, 0,-2, 0, 0,-2, 0,-2,-2,-2, 0, 0, 0,-2, 0,-2, 0, 0,-2, 2, 0, 0, 2,-2,-2, 0,-2,-2, 0,-2, 0, 0,-2, 0,-2, 0, 0, 0,-2,-2, 2,-2, 2, 2, 0, 2,-2, 2, 2, 2,-2, 2, 0, 2,-2, 2, 0,-2, 2, 0, 0, 2, 0,-2, 2,-2,-2, 2, 0, 2, 0, 2,-2, 0,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input7.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input7.csv new file mode 100644 index 0000000..363c35b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-input7.csv @@ -0,0 +1,22 @@ +Time:325,End Time,Feature 1,Feature 2,Feature 3,Feature 4,Feature 5,Feature 6,Feature 7,Feature 8,Feature 9,Feature 1,Feature 11,Feature 12,Feature 13,Feature 14,Feature 15,Feature 16,Feature 17,Feature 18,Feature 19,Feature 2,Feature 21,Feature 22,Feature 23,Feature 24,Feature 25,Feature 26,Feature 27,Feature 28,Feature 29,Feature 3,Feature 31,Feature 32,Feature 33,Feature 34,Feature 35,Feature 36,Feature 37,Feature 38,Feature 39,Feature 4,Feature 41,Feature 42,Feature 43,Feature 44,Feature 45,Feature 46,Feature 47,Feature 48,Feature 49,Feature 5,Feature 51,Feature 52,Feature 53,Feature 54,Feature 55,Feature 56,Feature 57,Feature 58,Feature 59,Feature 6,Feature 61,Feature 62,Feature 63,Feature 64,Feature 65,Feature 66,Feature 67,Feature 68,Feature 69,Feature 7,Feature 71,Feature 72,Feature 73,Feature 74,Feature 75,Feature 76,Feature 77,Feature 78,Feature 79,Feature 8,Feature 81,Feature 82,Feature 83,Feature 84,Feature 85,Feature 86,Feature 87,Feature 88,Feature 89,Feature 9,Feature 91,Feature 92,Feature 93,Feature 94,Feature 95,Feature 96,Feature 97,Feature 98,Feature 99,Feature 1,Feature 101,Feature 102,Feature 103,Feature 104,Feature 105,Feature 106,Feature 107,Feature 108,Feature 109,Feature 11,Feature 111,Feature 112,Feature 113,Feature 114,Feature 115,Feature 116,Feature 117,Feature 118,Feature 119,Feature 12,Feature 121,Feature 122,Feature 123,Feature 124,Feature 125,Feature 126,Feature 127,Feature 128,Feature 129,Feature 13,Feature 131,Feature 132,Feature 133,Feature 134,Feature 135,Feature 136,Feature 137,Feature 138,Feature 139,Feature 14,Feature 141,Feature 142,Feature 143,Feature 144,Feature 145,Feature 146,Feature 147,Feature 148,Feature 149,Feature 15,Feature 151,Feature 152,Feature 153,Feature 154,Feature 155,Feature 156,Feature 157,Feature 158,Feature 159,Feature 16,Feature 161,Feature 162,Feature 163,Feature 164,Feature 165,Feature 166,Feature 167,Feature 168,Feature 169,Feature 17,Feature 171,Feature 172,Feature 173,Feature 174,Feature 175,Feature 176,Feature 177,Feature 178,Feature 179,Feature 18,Feature 181,Feature 182,Feature 183,Feature 184,Feature 185,Feature 186,Feature 187,Feature 188,Feature 189,Feature 19,Feature 191,Feature 192,Feature 193,Feature 194,Feature 195,Feature 196,Feature 197,Feature 198,Feature 199,Feature 2,Feature 201,Feature 202,Feature 203,Feature 204,Feature 205,Feature 206,Feature 207,Feature 208,Feature 209,Feature 21,Feature 211,Feature 212,Feature 213,Feature 214,Feature 215,Feature 216,Feature 217,Feature 218,Feature 219,Feature 22,Feature 221,Feature 222,Feature 223,Feature 224,Feature 225,Feature 226,Feature 227,Feature 228,Feature 229,Feature 23,Feature 231,Feature 232,Feature 233,Feature 234,Feature 235,Feature 236,Feature 237,Feature 238,Feature 239,Feature 24,Feature 241,Feature 242,Feature 243,Feature 244,Feature 245,Feature 246,Feature 247,Feature 248,Feature 249,Feature 25,Feature 251,Feature 252,Feature 253,Feature 254,Feature 255,Feature 256,Feature 257,Feature 258,Feature 259,Feature 26,Feature 261,Feature 262,Feature 263,Feature 264,Feature 265,Feature 266,Feature 267,Feature 268,Feature 269,Feature 27,Feature 271,Feature 272,Feature 273,Feature 274,Feature 275,Feature 276,Feature 277,Feature 278,Feature 279,Feature 28,Feature 281,Feature 282,Feature 283,Feature 284,Feature 285,Feature 286,Feature 287,Feature 288,Feature 289,Feature 29,Feature 291,Feature 292,Feature 293,Feature 294,Feature 295,Feature 296,Feature 297,Feature 298,Feature 299,Feature 3,Feature 301,Feature 302,Feature 303,Feature 304,Feature 305,Feature 306,Feature 307,Feature 308,Feature 309,Feature 31,Feature 311,Feature 312,Feature 313,Feature 314,Feature 315,Feature 316,Feature 317,Feature 318,Feature 319,Feature 32,Feature 321,Feature 322,Feature 323,Feature 324,Feature 325,Event Id,Event Date,Event Duration +0.000000,0.062500, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2,-2, 0, 2, 0, 2, 2,-2,-2, 0, 0, 0, 0,-2, 0, 0,-2,-2, 0,-2,-2,-2,-2, 0, 0, 0,-2,-2, 0,-2, 0,-2, 0, 0, 0,-2,-2, 0, 0,-2,-2, 0, 0,-2, 0,-2,-2, 0, 0,-2, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0, 0,-2,-2, 0, 0,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2, 0, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0, 0,-2,-2, 0, 0,-2, 2,-2, 0, 0, 0, 0, 0,-2,-2,-2, 0, 0,-2, 2, 2, 2, 0, 2,-2,-2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2,-2, 2, 0,-2, 2, 2, 2, 2, 2, 0,-2,-2, 0, 0, 2, 2, 0, 2, 0, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 2,-2, 0, 0, 0, 0, 2,-2, 0, 2, 2,-2, 0, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 2, 0, 0,-2, 0, 2,-2, 0, 2, 2, 2, 0, 2, 0, 2, 2, 0, 0, 0, 2,-2, 2, 2, 2, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 2, 2, 0, 2,-2, 2, 2, 0, 2, 0, 0, 0, 0, 0,-2, 2, 2, 0, 0,-2, 0, 2, 2, 0, 2, 0, 0, 0, 2, 0,-2, 0, 2, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2,-2, 0, 0, 0, 2, 2,,, +0.062500,0.125000, 2, 2, 2, 0, 0, 2, 0, 0, 2, 0, 2, 0,-2, 2, 2, 0, 2, 2, 0, 2,-2, 0, 0, 2, 2, 2, 0, 2, 2, 2,-2, 0, 0, 0, 0, 0, 2, 0,-2,-2, 2, 2, 2,-2,-2,-2, 2, 2, 2, 0, 2, 0,-2,-2,-2, 0, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2,-2,-2,-2, 2,-2, 0, 0,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0, 0,-2, 2,-2,-2,-2, 0,-2,-2,-2,-2,-2, 0,-2,-2,-2, 2, 0,-2, 2,-2,-2, 0,-2,-2, 0,-2,-2,-2, 0, 0, 0, 0,-2,-2,-2,-2,-2, 0, 0, 0, 0,-2,-2,-2,-2, 0, 0,-2, 0,-2,-2, 0, 0, 0, 2, 0, 2, 0,-2, 2, 2, 2, 2, 2,-2, 2, 2, 0, 0, 2, 0, 2, 0,-2, 0, 2, 0, 0, 2, 0, 0, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2,-2, 2, 2, 0,-2,-2, 2, 2,-2,-2, 2, 2, 0, 0, 2, 2, 2,-2, 0, 0, 2, 0, 2, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 2, 2, 0, 2, 0, 2, 0, 0, 0, 0, 2, 2, 0, 0,-2,-2,-2, 0, 2, 0, 0,-2, 2, 0, 2,-2, 0, 2, 2, 2,-2, 0,-2, 0,-2,-2, 2,-2, 2, 0, 2, 2,-2, 2,-2, 2, 0, 2,-2, 0, 0, 2,-2, 2,-2,-2, 2, 2, 2,-2,-2,-2,-2, 0, 0, 2,-2, 0,-2,-2,-2,-2, 2, 2, 0, 0, 0,-2, 0, 0, 0, 2, 2, 0, 2, 0, 0,-2, 0,-2,-2, 2, 0, 2, 0, 0, 2,-2,-2,-2,,, +0.125000,0.187500, 0, 2, 2, 0, 2, 0, 0, 2, 0, 2, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 2, 2, 0, 2, 2, 0, 2,-2, 2, 2,-2, 2, 0, 0, 0, 0, 2,-2, 0, 0, 0, 0,-2, 0, 0, 0, 2, 0, 0, 2, 0,-2, 0, 0,-2,-2, 0, 0,-2,-2, 0, 0, 2, 0, 0, 0, 2,-2, 0, 0, 0, 2, 0,-2, 0,-2,-2,-2, 0, 0, 0, 0, 2, 0,-2, 2, 0, 0,-2, 2, 0, 0,-2, 2, 0, 0,-2, 0, 0,-2, 0, 0, 0, 0, 0, 2,-2,-2, 0,-2, 0, 0,-2,-2, 2, 0, 0, 0, 0, 0, 2,-2, 0, 0, 0, 0, 2, 0,-2,-2, 0, 0,-2,-2,-2, 2,-2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0,-2, 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2,-2, 0,-2, 0, 2, 0, 2, 0,-2, 2, 0, 2, 2,-2, 0, 0, 2,-2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 2, 2, 2, 0, 2, 2, 0, 0, 0, 2, 2, 0, 0,-2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 2,-2, 2, 2, 2, 0, 2, 2, 0,-2, 2, 2, 2, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0,-2, 0, 2, 0, 0, 2,-2, 0, 0, 2,-2, 2, 0, 2, 2, 0, 0, 2, 0, 2, 0, 2, 2, 0, 0, 0, 2, 2, 0, 2, 0, 2,-2,-2, 2, 0, 2, 0,-2, 2, 0,,, +0.187500,0.250000, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2,-2, 2, 2, 0, 0, 2, 0, 0, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 0, 2, 0, 0, 2, 0, 0, 2,-2,-2, 0, 0,-2,-2, 0, 2,-2, 2, 2,-2, 0,-2,-2,-2,-2,-2, 0,-2, 0, 0, 0, 0, 0, 0,-2, 0,-2, 2,-2,-2, 0, 0, 2,-2,-2,-2,-2,-2, 0,-2, 0, 0,-2,-2,-2,-2, 0, 0,-2, 0,-2,-2, 0, 0, 0, 0,-2,-2, 0,-2,-2,-2, 0,-2,-2,-2, 0, 2,-2, 0,-2,-2,-2,-2, 0,-2, 0,-2, 0,-2,-2,-2, 0,-2, 0, 0,-2,-2,-2,-2, 0,-2, 0,-2, 0,-2, 0,-2,-2, 0,-2, 0, 0,-2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2,-2, 2, 2, 2, 2, 2, 2, 0,-2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 0,-2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2,-2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 2, 2, 0, 0, 0, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0,-2, 2, 2, 2, 0, 0, 2, 0, 0,-2, 0, 2, 0, 2, 2, 2, 0, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 0,-2, 2, 0, 2, 2,-2, 2, 2, 2,-2, 2, 2, 0, 2, 0, 0, 2, 0, 2, 2, 2,-2, 0, 0, 0, 0, 2, 2, 0, 2, 2, 2, 0, 2,-2, 0, 2, 2, 0, 2, 0, 2, 0, 2, 2,,, +0.250000,0.312500, 0, 2, 0, 2, 2, 0, 2, 2,-2, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 0, 2, 2, 0, 0, 0, 2, 2,-2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2,-2, 0, 0, 0,-2,-2, 2,-2, 0,-2, 0,-2, 0,-2, 2, 0,-2, 0, 2,-2, 0, 0, 2,-2, 0, 0, 0, 0,-2, 2, 0, 0,-2,-2, 0,-2, 2,-2, 0,-2, 2,-2,-2, 2, 0,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2, 0,-2, 0,-2, 0,-2, 0,-2, 0, 0,-2,-2,-2,-2,-2,-2, 0,-2,-2, 0, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2, 0, 0, 0,-2,-2,-2, 0, 0, 0, 0,-2, 2,-2, 0,-2, 0, 0,-2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 2,-2, 0, 0, 0, 2, 2, 2, 0, 2, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 2, 0, 0, 0, 2, 2, 2, 0, 2, 0, 0, 2, 2, 2,-2, 0, 0, 2, 2, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 2, 0, 2, 0, 0, 2, 2, 2,-2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 2, 2, 0, 2, 0, 0, 2, 2, 0, 2, 2, 2, 0, 2,-2, 2, 2, 0, 2, 0, 0, 2, 2,-2, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 2, 0, 0, 2, 0, 2, 2, 0, 2, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 0, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 2, 2, 0,,, +0.312500,0.375000, 0, 2, 0, 2, 2,-2, 0, 2, 0, 2, 2, 2,-2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 2, 0, 2, 0, 2, 2, 0, 0, 2, 0, 0, 2,-2, 2, 0,-2,-2, 0, 0, 0, 0, 2,-2, 0, 2, 0,-2,-2,-2,-2, 0, 2, 0,-2, 0, 0, 0, 2, 0,-2, 0, 0,-2,-2, 2, 0, 0, 0,-2,-2,-2, 0, 0, 0,-2, 2,-2, 2, 2, 0, 0, 0, 2,-2, 0,-2, 0, 2, 0, 0, 0, 0, 2,-2, 0, 0, 0,-2,-2, 0,-2,-2, 0, 0, 0, 0, 0,-2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0,-2,-2, 0,-2,-2,-2, 0, 0,-2, 0, 0,-2, 0,-2, 2,-2, 0, 2, 2, 0, 2, 0, 0,-2, 0, 0, 0, 0, 2, 2,-2, 2, 0, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 2,-2, 0, 2,-2, 0, 2,-2, 2, 2, 0,-2, 0, 2, 2, 2, 2, 2,-2, 0, 2, 0, 0, 2,-2, 2, 0,-2, 2,-2, 2, 0, 2, 0, 0, 2, 2, 2, 0,-2, 2, 0, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2,-2,-2, 2, 2, 0, 2, 2, 0, 0,-2, 0, 0, 0, 0, 0, 0, 2, 2, 2,-2, 2, 0, 0, 0, 0, 2, 0, 0,-2,-2, 0, 0, 0, 2, 2, 0, 0,-2,-2, 0, 2,-2, 0, 2, 2,-2, 0,-2, 0, 2,-2,-2, 0, 2,-2,-2, 2, 0, 0, 2, 2,-2,-2,-2, 0,-2, 0, 2, 0, 2, 0,-2, 2, 0,-2,-2, 2, 0,-2, 2,-2, 2, 2, 0, 0, 0,-2, 0,,, +0.375000,0.437500, 0, 2, 0, 2, 2,-2, 0, 2, 0, 0, 0, 2,-2, 0, 2, 2, 2, 2, 0, 2, 2, 0, 2, 0, 0, 0, 0, 2, 0, 2, 0, 2, 2, 0, 0, 2, 0,-2, 2,-2, 2, 0,-2,-2,-2, 0, 0, 0, 2,-2, 0, 2, 0,-2,-2,-2,-2, 0, 0, 0,-2, 0,-2, 0, 0, 0, 0, 0, 2,-2,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2, 0,-2, 2,-2, 2, 2, 0,-2,-2, 0,-2,-2,-2, 0, 0, 0,-2, 0, 0, 0,-2, 0, 2, 0,-2,-2,-2, 0,-2,-2, 0, 0,-2, 0, 0, 0, 0, 2, 0, 0,-2,-2,-2,-2, 0,-2, 0, 0,-2,-2,-2, 0, 0, 0,-2, 0,-2,-2,-2, 0,-2, 0, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2,-2, 0,-2, 2, 0, 2, 0, 0, 2, 0, 2, 0,-2, 2, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0,-2, 2, 0,-2,-2, 2,-2, 0, 0, 0, 2, 2, 0, 0, 0, 2, 2, 2,-2, 2, 0,-2, 0, 0, 0, 0,-2, 0,-2,-2, 0,-2, 0, 0, 2, 0,-2, 2, 2, 2, 0,-2, 0, 0, 2, 0,-2,-2,-2, 0, 2, 0, 2, 2, 2, 2,-2, 2, 0,-2, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2,-2, 2, 0, 2, 0, 2, 0, 0, 0,-2, 0, 0, 0,-2, 0, 0, 0, 0, 0, 2,-2, 0,-2,-2, 0, 2, 0, 0, 0, 2,-2, 0,-2, 0, 2, 0, 0, 0, 0, 0,-2, 0, 0,-2, 2, 0, 2, 0, 0, 0,-2,-2, 2, 0, 2, 0, 0, 2, 0, 0,-2, 0, 2, 0, 2, 0, 0, 0, 0,-2, 0, 0, 0,,, +0.437500,0.500000, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2, 0, 2, 0, 2, 0, 0, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 0,-2, 0, 0, 2, 0, 0, 0, 2, 0, 2, 2, 0, 0, 0, 2, 2, 2,-2, 0, 0,-2,-2, 0, 0, 0, 0, 2,-2, 0, 0, 0,-2, 2, 0, 0, 2, 0, 2, 2, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2,-2, 0, 2,-2, 0, 2, 2,-2, 0, 0, 0, 2, 0, 0,-2, 2, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0,-2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 0, 0,-2, 2, 0, 0, 0, 0, 0,-2, 2, 0, 0, 0, 2,-2,-2,-2, 2, 0, 0, 2, 2, 0, 2, 2, 2, 0, 2, 0, 2, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 2, 0, 0, 2, 0, 2, 2, 0, 2, 0, 0, 2, 0, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 2, 0,-2, 0, 2, 0, 2, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2,-2, 2, 0, 0,-2, 0, 2,-2, 2, 2, 2,-2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 2,-2, 0, 0, 0, 0, 2, 0, 2, 0, 0, 2, 2, 2, 0, 0, 2, 0, 2, 2, 0, 2,-2, 2, 2, 0, 0, 2,,, +0.500000,0.562500, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2,-2, 2, 2, 0, 2, 2, 0, 2, 0, 2, 2, 0,-2, 2, 0, 0, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2,-2, 0, 0, 0, 2,-2, 2, 0,-2,-2,-2,-2, 2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2,-2,-2, 2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2, 2,-2,-2, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2, 2, 2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2,-2, 2, 0, 0, 2,-2, 2, 0, 0, 2, 0, 0, 0, 0, 2, 2, 0, 2, 0, 2,-2, 2, 2, 2, 2, 0, 2, 0,-2, 2, 2, 2, 0, 2, 2, 2, 2,-2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2,-2,-2, 2, 0, 2, 0, 0, 0,-2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 0,-2, 0, 2, 2,-2,-2, 0, 2, 2, 2, 0, 2, 2,-2, 2, 2, 0,-2,-2, 2,-2, 2, 0, 0, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0,-2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 0, 0,-2, 0, 2, 0,-2,-2,-2,-2, 0,-2,-2, 2,-2,-2, 2, 2, 2, 2, 2,-2,-2, 0,-2, 2, 2, 2, 2, 0, 2,-2, 2, 2,-2, 0, 2, 2, 2,-2,-2, 0, 2,,, +0.562500,0.625000, 0, 2, 0, 2, 2, 2, 2, 0, 2, 0, 2,-2, 2, 2, 2, 2, 2, 0, 0, 2,-2, 0, 2, 2,-2,-2, 2, 0,-2, 0, 2, 2, 0, 2, 2, 0, 2, 0, 2, 0, 0,-2, 2, 0, 0, 0,-2,-2, 2, 0,-2, 2, 0, 0, 2, 0,-2,-2, 2, 2,-2,-2, 0,-2, 2, 0, 0,-2,-2, 0, 0, 0, 0,-2, 2, 0, 2, 0,-2, 0,-2,-2, 0, 0, 2, 0, 2, 0, 2, 2,-2, 0, 0, 0,-2, 0, 0,-2,-2, 2, 0, 2, 2, 0,-2, 2, 0, 0,-2, 0, 2, 0, 2, 2,-2, 0, 2,-2, 0, 2, 2, 2, 2, 2, 2, 0,-2, 0, 2, 2, 0, 0, 0,-2,-2, 0,-2, 2, 2, 0,-2, 2,-2, 0,-2, 2, 0, 0, 2, 2, 2, 0, 2,-2, 0,-2, 2, 0, 2, 0,-2, 2, 0, 2,-2, 0, 0, 0, 0,-2,-2, 0, 2,-2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 2,-2, 0, 0, 2, 0, 2, 2, 0, 0, 0, 2,-2, 2,-2, 2, 2, 0, 2, 0, 2, 0, 2, 0, 2, 2,-2,-2,-2, 0, 0, 2, 2, 2, 2, 2, 0,-2, 0, 2, 2, 2, 0, 2, 0, 2, 0, 0,-2,-2,-2, 0, 0, 2, 0, 0, 0, 2,-2, 0, 0, 0, 0,-2, 2,-2, 2,-2, 2, 2, 2,-2,-2, 0, 2, 2, 2, 2, 2, 0, 0,-2, 0, 0, 2, 2, 0,-2, 2, 2,-2,-2, 0, 2, 0, 0, 0, 0,-2, 0, 2,-2, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0,-2, 2,-2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 2, 0, 2, 0,-2, 0, 0, 2,-2, 2, 0, 2,-2,-2, 0, 0, 2,,, +0.625000,0.687500, 2, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2,-2, 0, 0, 2, 0, 0, 0, 2, 2, 0, 0,-2, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0,-2, 0, 0, 0,-2, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0,-2,-2, 0, 0, 0, 0, 2, 0,-2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2,-2, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 2, 0,-2, 0,-2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 2,-2, 2, 2, 0, 2, 2, 0, 2, 0, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 2, 2, 0, 0, 0,-2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 0,-2, 2, 2, 2, 2, 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 2, 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 0, 2, 2, 0, 2, 2, 0, 0, 2, 0, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 2,,, +0.687500,0.750000, 2, 0, 2, 2, 0, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 2, 0, 0, 0, 0, 2, 0, 2, 2, 0, 2, 0, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0,-2, 2, 0, 2, 0, 0,-2, 2, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0,-2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 2,-2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2,-2, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 2, 2, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 2, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 2,-2, 2, 0, 2, 2, 2, 0, 2, 0, 2, 0, 2, 0, 0, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 2, 0, 2, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 0, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 0, 0, 2, 2, 0, 2, 0, 0, 2, 2, 0, 0, 2, 2, 2, 0, 2, 0, 0, 2, 0, 2, 2, 2, 2, 0, 2,-2, 2, 2, 0,-2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 0, 0, 2, 0, 2,-2,-2, 2, 2, 2, 0, 0, 2, 2, 2,,, +0.750000,0.812500, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 0, 2, 2, 2, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2, 0, 2, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0,-2, 0,-2,-2,-2,-2, 0, 0, 0,-2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0, 0, 2,-2, 0, 0,-2, 0, 0, 0, 0, 0, 0,-2, 0, 0, 0,-2, 0, 0, 0, 0, 0,-2,-2, 0, 0, 0, 0, 0, 0, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 0, 2, 0, 0,-2, 0, 2, 2, 2, 0,-2, 0, 2, 2, 0, 0, 2, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 0,-2, 2, 0,-2, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 2, 0, 0, 2, 2, 0, 0, 2, 0, 2, 0, 2, 0, 0, 2, 0, 2, 2, 2, 0, 2, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2,-2, 2, 2, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0,-2, 0, 0, 2, 2, 2, 0, 0, 0, 2, 2,-2, 2, 2, 0, 2, 2,-2, 0, 0,,, +0.812500,0.875000, 0, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0,-2, 2, 0, 2, 0, 0, 2, 0, 0, 0, 2, 0,-2, 2, 0,-2,-2, 0, 0, 2,-2, 0,-2,-2,-2, 0, 0, 0,-2, 0, 0, 0, 0, 0,-2,-2, 0, 0,-2, 0, 0, 2, 0, 0, 0,-2, 0, 0,-2,-2, 0, 0, 0, 0, 0, 0,-2, 0, 0, 0, 0,-2, 0, 0,-2,-2, 0,-2,-2, 0,-2,-2, 0,-2, 0,-2,-2, 0, 0, 0, 0, 0,-2, 0, 0, 0, 2, 0, 0, 0, 0, 0,-2, 0,-2, 0, 0, 0,-2, 0, 0, 0,-2, 0,-2, 0,-2, 0,-2, 2,-2, 2, 0, 2, 2, 2, 0, 0, 2, 2, 2, 0, 2, 0, 2, 2, 2, 0,-2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 2,-2,-2, 0,-2, 0, 2, 2,-2, 0, 2, 0, 2, 2, 2, 2, 2,-2, 0, 2, 2, 2, 0, 0, 2, 0, 2, 0, 2, 0, 2,-2, 2, 2, 2, 0, 2, 0, 2, 2,-2,-2, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 0,-2, 2, 0,-2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 2, 0,-2, 2, 2, 2,-2, 2, 2, 2,-2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 0, 2,-2, 0, 0, 2, 0, 2, 0, 2, 0, 2,-2, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2,-2, 2, 2, 0, 2, 0, 2, 2, 2, 0, 2,-2, 2, 2, 2, 0,-2,-2, 0, 2, 2,-2, 0, 2,-2, 2, 0,,, +0.875000,0.937500, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2,-2, 2, 2,-2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2,-2,-2, 2, 0, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0,-2,-2,-2,-2, 0, 0, 2,-2, 0, 0,-2,-2, 2,-2, 2, 0, 0, 0, 2, 0,-2, 0,-2,-2,-2,-2, 0, 2, 0,-2,-2,-2, 0,-2, 0, 0, 0, 0, 2, 2,-2,-2, 0,-2,-2, 0, 0, 0, 0, 0,-2,-2, 0, 0, 0, 0,-2, 0, 0, 0, 0,-2,-2, 0,-2, 0,-2, 0,-2,-2,-2, 0,-2,-2,-2, 0,-2,-2, 0, 0,-2,-2,-2, 0, 0, 0, 0,-2, 0, 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2,-2, 2, 2,-2, 0, 2, 2, 0, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2,-2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 0, 0, 0,-2, 0, 0, 0, 2, 0, 0, 2, 2, 2,-2, 2, 2, 2, 2, 2, 2, 0, 2,-2, 0, 0,-2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 2, 2, 0, 2, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0,-2, 0, 2, 0, 0, 2, 0,-2,-2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2, 2, 0, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2,-2, 2, 2, 0, 2,-2, 0, 2, 2,,, +0.937500,1.000000, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2,-2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2,-2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2,-2, 2, 0, 0, 2, 0, 0, 0, 0,-2,-2,-2,-2,-2, 0, 2,-2,-2,-2,-2, 2, 0,-2,-2, 0, 0, 0,-2,-2,-2,-2,-2,-2,-2, 0, 0, 0, 0,-2, 0,-2,-2,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0,-2,-2, 0,-2,-2,-2, 0, 0,-2, 0, 0,-2,-2,-2, 0, 0, 0, 0,-2,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2, 0,-2, 0, 0,-2,-2,-2, 2,-2,-2,-2,-2,-2,-2,-2, 0, 2, 2, 0, 2, 0, 2, 2,-2, 0, 2, 2, 2, 2, 2,-2, 2, 2,-2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2,-2, 2, 0,-2, 0, 0, 2, 0, 0, 0, 2, 0, 2, 2, 2, 2,-2, 2, 2, 0, 2, 2, 2,-2, 2, 0, 0, 0, 2, 0,-2, 2, 2, 2, 0,-2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 0, 2, 0, 2,-2, 2, 0, 2,-2, 2, 2, 0, 2,-2, 0, 0, 2,-2, 2, 2, 2,-2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 0, 2, 0, 0, 2,-2,-2, 2, 2,-2, 0, 0, 0, 2, 2, 2, 0, 2, 2, 2, 2,-2, 0, 2, 2, 0, 2,-2, 2, 0, 2, 0, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0, 0,,, +1.000000,1.062500, 2, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 2,-2, 2, 0, 2, 2, 2,-2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 0, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 0, 0,-2, 0, 0, 0, 0, 0,-2, 0,-2,-2, 0,-2,-2, 0,-2, 0, 0, 0,-2, 0, 2, 2, 0,-2, 0, 2, 0, 0, 0, 0,-2, 0,-2,-2,-2, 0,-2, 0, 0,-2,-2, 0,-2, 2, 0, 0, 0, 0,-2, 0, 0,-2, 0,-2, 0, 0,-2, 0, 0, 0,-2, 0, 0, 0, 0,-2, 0,-2, 0, 0, 0,-2,-2, 0,-2, 0, 0,-2, 0, 2, 0,-2, 0,-2,-2,-2, 0,-2,-2, 2, 0,-2,-2, 0,-2, 0, 0, 0,-2, 0,-2,-2, 2, 0, 2, 2, 0, 2, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 0, 0, 2, 0, 2, 2,-2, 0, 0, 2, 0, 2, 2, 0, 0, 2, 0, 0,-2, 2, 0, 2, 0, 2, 0, 0, 2, 2, 2, 2, 0, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2,-2, 0, 0, 2, 0, 0, 2,-2, 0,-2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0,-2, 0, 2, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 2, 2, 0, 2, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 0, 2, 0, 2, 2, 0, 0, 2, 0, 2, 0, 2, 0, 0, 2, 2,-2, 0, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 2, 2,-2, 2, 0, 2, 2, 0,,, +1.062500,1.125000, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 0, 2, 2, 0, 0, 0, 2, 2, 0, 2, 2, 2, 0, 2,-2,-2, 2, 0, 0,-2, 0,-2, 0, 2, 0, 2, 0, 2,-2, 0, 0, 0, 0,-2, 0, 0, 0, 0, 0, 2, 0,-2,-2, 0, 2,-2,-2, 2, 2,-2,-2,-2,-2, 0,-2, 0, 0, 2, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0, 0,-2,-2,-2, 0, 0, 0,-2,-2, 0,-2,-2,-2, 0,-2, 0, 0, 0,-2, 0,-2, 0,-2, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2, 0,-2, 0, 0, 0,-2, 2, 0, 0,-2, 0,-2, 2, 0,-2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, 0, 2, 0, 2, 2, 2, 0,-2, 0, 2, 2, 0, 2, 2, 0, 0, 0, 2, 0, 2, 0,-2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 2, 0, 2, 2, 0, 0, 0, 2, 0, 2, 0, 2, 2, 0, 2, 2, 2, 2, 0,-2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 0, 2, 0, 2, 2, 0, 2, 2, 0, 0, 0, 2, 2, 0,-2, 2, 0, 2, 2, 2, 2,-2, 0, 2, 0, 2, 0,-2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 0, 0, 2, 2,-2, 0, 2, 0, 2,-2, 0, 0, 2, 0, 2,-2, 2, 2, 2, 0, 2, 0, 2, 2, 0, 2,-2, 2,-2, 2, 0, 2, 0, 2, 0, 0, 0,-2, 0, 0, 0, 2, 0, 0, 2,-2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 2, 0, 2, 0, 2, 2, 2, 2, 2,-2, 2, 2, 2, 0,-2, 2, 0, 2, 0, 2,,, +1.125000,1.187500, 2, 0, 0, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 2, 2, 2, 2, 0,-2, 2, 2, 2, 0, 2, 0, 2,-2, 2, 0, 2, 0, 0, 2, 2,-2,-2, 2, 0, 2, 0, 0, 0, 2,-2, 0,-2, 0,-2, 2, 2, 0, 0, 0,-2,-2,-2,-2, 0, 0,-2, 0,-2,-2, 0, 2, 0, 0, 2, 0, 2, 0, 2, 0, 2, 2,-2, 0,-2,-2, 0,-2, 0, 2, 0, 2, 2, 2, 2, 0, 2,-2, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 2,-2, 0, 0, 0, 2, 0, 2, 2, 2, 0, 2, 0,-2, 0, 2, 2, 2, 2, 0, 2, 2, 0,-2, 0, 0, 2, 0, 2, 0, 0, 0, 0, 2,-2,-2, 2,-2,-2, 0, 0, 0, 0,-2, 0, 0, 0,-2, 0, 0, 0,-2, 0,-2,-2, 0, 0, 2, 0,-2, 0, 0, 0, 0, 0, 0,-2, 0, 0, 0, 2, 2,-2,-2, 2, 0,-2,-2, 0, 0, 0, 2, 0, 2, 0, 2,-2, 0, 0, 2, 0, 2,-2, 2,-2, 2,-2, 2, 2, 2, 0, 2, 0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 2, 0, 0,-2, 0, 2, 2, 0, 2, 0,-2, 0, 2, 0, 2, 2, 0, 0, 0,-2,-2, 0, 0, 0, 2,-2, 0, 0, 0, 2, 0,-2, 0, 2, 2,-2, 0, 0, 2, 0, 2, 0,-2, 0, 0, 2, 0, 2, 0, 2,-2, 0,-2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0,-2, 0, 2, 0, 0, 2,-2, 0, 0, 0, 0,-2,-2, 0,-2, 0, 0, 0, 2, 0,-2, 2, 2, 0, 0, 0, 2,-2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0,-2, 2,-2, 2, 2, 2,-2, 0,,, +1.187500,1.250000, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0,-2, 0, 0, 2, 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 0, 0, 2, 0, 2, 2, 0, 2, 2, 0, 2,-2,-2,-2, 0, 0,-2,-2, 2, 0, 0,-2, 0, 0,-2, 0,-2, 0, 0, 0, 0,-2, 0, 0, 0,-2, 0,-2,-2, 0,-2, 0, 0,-2,-2,-2,-2,-2,-2,-2,-2,-2, 0, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2,-2, 0,-2,-2, 0, 0,-2,-2,-2, 0, 0, 0,-2,-2, 0,-2,-2,-2,-2,-2,-2,-2, 0,-2, 2,-2, 0,-2, 0,-2,-2, 0, 0, 0, 0,-2,-2,-2, 0, 0, 0, 0, 2, 0, 0, 0,-2,-2, 0,-2, 0, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 0,-2, 2, 0, 0, 2, 2, 2,-2, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0,-2, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2, 0,-2, 2, 0, 0,-2, 0, 0,-2, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0,-2, 2, 0, 0,-2, 0, 0,-2, 2, 0, 2, 0, 2, 0, 2, 0, 0, 0, 2, 2,-2, 2, 2, 2, 2, 0,-2, 2, 0, 0, 2, 2, 2, 0, 0, 2, 2, 0,-2, 0, 0, 0, 2, 0, 2, 2, 2,-2,-2, 0, 2, 0,-2, 0,-2, 2, 2, 2, 0, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 0,-2,-2, 2, 0, 0,-2, 2, 2, 2, 2, 0,-2,-2, 0, 2, 2, 0, 2, 2, 2, 2, 0, 2,-2, 0, 0, 2, 0, 2, 0, 0, 2, 2, 0, 2, 2, 2, 0,-2, 0, 2, 0, 0, 2, 0,,, +1.250000,1.312500, 2, 2, 2, 2, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,-2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 0, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2,-2, 0, 0, 0, 0,-2, 2, 0,-2,-2, 0, 0, 0, 2,-2,-2,-2, 0, 0,-2,-2, 0, 0, 0, 0, 0,-2,-2,-2, 0, 0, 0, 0, 0, 0, 2,-2, 0,-2,-2,-2,-2, 0, 0, 0,-2, 0, 0, 0, 0,-2, 0,-2, 0,-2, 2, 0, 0,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2,-2,-2,-2, 0,-2, 0, 0, 0,-2, 0, 0, 0, 0,-2,-2,-2,-2, 0,-2,-2, 2, 0,-2, 0, 2,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,-2,-2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2,-2, 2, 2,-2, 2, 0, 2, 0, 0, 2,-2, 0, 2, 2, 0, 2, 0, 2, 0, 0, 0, 2, 0, 2, 0,-2, 2, 0, 2, 2, 2, 0, 2, 0, 0, 2, 0, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,-2, 0, 0, 0, 2, 2, 0, 2, 0,-2, 0, 0, 0, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 0, 0, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2,-2,-2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 0, 2, 2,-2, 2, 0, 0, 2, 0,-2, 2, 0, 0, 0, 0, 2, 2, 2, 2,-2, 0, 0, 0,-2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 2, 0,-2, 0,-2, 0, 2, 2,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-ref.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-ref.xml new file mode 100644 index 0000000..87fdadb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-ref.xml @@ -0,0 +1,3 @@ + + 230;98;242;22;181;171;82;6;248;10 + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-test.xml new file mode 100644 index 0000000..b00bc24 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selection-test.xml @@ -0,0 +1,769 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x8bde916d, 0x217d8861) + (0x79a9edeb, 0x245d83fc) + Test Name + Features-Selector + Features-Selection + + + + + + + (0x000016ca, 0x00003755) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002baa, 0x0000677c) + Features Selection Trainer + (0xee36249f, 0x22a32e6e) + + + (0x6f752dd0, 0x082a321e) + Train-Start Flag + + + (0x17341935, 0x152ff448) + Class 1 + + + (0x17341935, 0x152ff448) + Class 2 + + + (0x9b4d7792, 0xe233d1eb) + (0x17341935, 0x152ff448) + Class 3 + + + (0xa106c578, 0x9d3f194b) + (0x17341935, 0x152ff448) + Class 4 + + + (0x5a6d1f5b, 0x8c08315a) + (0x17341935, 0x152ff448) + Class 5 + + + (0x0c21d457, 0x9b8354ed) + (0x17341935, 0x152ff448) + Class 6 + + + (0xe4df1610, 0x6e4002dc) + (0x17341935, 0x152ff448) + Class 7 + + + + + (0x6f752dd0, 0x082a321e) + Train-Completed Flag + + + + + (0xa88b3667, 0x0871638c) + Log Level + Information + Information + false + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save Feature Selection + ${Player_ScenarioDirectory}/my-classifier.xml + ${Player_ScenarioDirectory}/$var{Test Name}-output.xml + false + + + (0x5261636b, 0x46534d45) + Method + mRMR (minimum Redundancy Maximum Relevance) + mRMR (minimum Redundancy Maximum Relevance) + false + + + (0x007deef9, 0x2f3e95c6) + Number of features to select + 2 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Discretisation + true + true + false + + + (0x512a166f, 0x5c3ef83f) + Threshold + 0.0 + 0.0 + false + + + (0x5261636b, 0x6d524d52) + mRMR Method + MID + MID + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0xd7b82a3a, 0x7e084998) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 8 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003bdb, 0x0000603d) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 2 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Train + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000484f, 0x00003eff) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x17341935, 0x152ff448) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input1.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x0000484f, 0x00003f00) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x17341935, 0x152ff448) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input2.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x0000484f, 0x00003f01) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x17341935, 0x152ff448) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input3.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x0000484f, 0x00003f02) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x17341935, 0x152ff448) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input4.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x0000484f, 0x00003f03) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x17341935, 0x152ff448) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input5.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x0000484f, 0x00003f04) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x17341935, 0x152ff448) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input6.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x0000484f, 0x00003f05) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x17341935, 0x152ff448) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input7.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 928 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + + + (0x0000076a, 0x00007db0) + + (0x0000484f, 0x00003f05) + 0 + + + (0x00002baa, 0x0000677c) + (0xe4df1610, 0x6e4002dc) + + + + (0x00001d78, 0x00003eac) + + (0x0000484f, 0x00003f00) + 0 + + + (0x00002baa, 0x0000677c) + 2 + + + + (0x00002559, 0x000072f9) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00002baa, 0x0000677c) + 1 + + + + (0x00002e0c, 0x00007b05) + + (0x0000484f, 0x00003f01) + 0 + + + (0x00002baa, 0x0000677c) + (0x9b4d7792, 0xe233d1eb) + + + + (0x00003973, 0x00003278) + + (0x0000484f, 0x00003f02) + 0 + + + (0x00002baa, 0x0000677c) + (0xa106c578, 0x9d3f194b) + + + + (0x000045a7, 0x00004b2f) + + (0x0000484f, 0x00003f04) + 0 + + + (0x00002baa, 0x0000677c) + (0x0c21d457, 0x9b8354ed) + + + + (0x0000647f, 0x00005675) + + (0x00003bdb, 0x0000603d) + 0 + + + (0x00002baa, 0x0000677c) + 0 + + + + (0x00007465, 0x00001b9f) + + (0x00002baa, 0x0000677c) + 0 + + + (0x000016ca, 0x00003755) + 0 + + + + (0x00007709, 0x00006d85) + + (0x0000484f, 0x00003f03) + 0 + + + (0x00002baa, 0x0000677c) + (0x5a6d1f5b, 0x8c08315a) + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"height":320,"identifier":"(0x00003820, 0x000008c9)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00005d8b, 0x000029a4)","index":0,"name":"Default tab","parentIdentifier":"(0x00003820, 0x000008c9)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00002efb, 0x00003d85)","index":1,"name":"config","parentIdentifier":"(0x00003820, 0x000008c9)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000063e7, 0x000031ad)","index":0,"name":"Empty","parentIdentifier":"(0x00005d8b, 0x000029a4)","type":0},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00003d1b, 0x000063a7)","index":0,"name":"Empty","parentIdentifier":"(0x00002efb, 0x00003d85)","type":0}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Features Selection Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selector-input.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selector-input.csv new file mode 100644 index 0000000..fcc4c5e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selector-input.csv @@ -0,0 +1,17 @@ +Time:4,End Time,Feature 1,Feature 2,Feature 3,Feature 4,Event Id,Event Date,Event Duration +0.0000000000,0.0625000000,0.3965383489,0.3701554404,0.3514008624,0.3604023530,,, +0.0625000000,0.1250000000,0.3159530509,0.3469925070,0.3407269669,0.3104842961,,, +0.1250000000,0.1875000000,0.4091857477,0.3386997141,0.4244449376,0.3961381366,,, +0.1875000000,0.2500000000,0.3897686688,0.4028522689,0.2781331881,0.2893506006,,, +0.2500000000,0.3125000000,0.3028424755,0.2885165321,0.3597203409,0.3343018349,,, +0.3125000000,0.3750000000,0.3752107638,0.4737126652,0.3659766872,0.2710328777,,, +0.3750000000,0.4375000000,0.3627599021,0.3404655446,0.3970969993,0.3066993956,,, +0.4375000000,0.5000000000,0.2504476917,0.2510675797,0.3358548798,0.3424101286,,, +0.5000000000,0.5625000000,0.3607014566,0.3152450615,0.3259869212,0.3206394478,,, +0.5625000000,0.6250000000,0.3353893328,0.3096160755,0.3586253965,0.3529876219,,, +0.6250000000,0.6875000000,0.2957161763,0.2676691353,0.4422169917,0.4235462858,,, +0.6875000000,0.7500000000,0.3049466276,0.3109745909,0.2807179382,0.2052937887,,, +0.7500000000,0.8125000000,0.3535213964,0.3148222862,0.2874563588,0.4031604793,,, +0.8125000000,0.8750000000,0.3217516606,0.2825300467,0.2962858234,0.2872298099,,, +0.8750000000,0.9375000000,0.3023488322,0.3155970121,0.3094789860,0.2326523503,,, +0.9375000000,1.0000000000,0.3567112415,0.4195039714,0.3463518115,0.3117806365,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selector-ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selector-ref.csv new file mode 100644 index 0000000..c5f8db1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selector-ref.csv @@ -0,0 +1,17 @@ +Time:9,End Time,Feature 1,Feature 2,Feature 3,Feature 4,Feature 3,Feature 4,Feature 1,Feature 2,Feature 4,Event Id,Event Date,Event Duration +0.0000000000,0.0625000000,0.3965383489,0.3701554404,0.3514008624,0.3604023530,0.3514008624,0.3604023530,0.3965383489,0.3701554404,0.3604023530,,, +0.0625000000,0.1250000000,0.3159530509,0.3469925070,0.3407269669,0.3104842961,0.3407269669,0.3104842961,0.3159530509,0.3469925070,0.3104842961,,, +0.1250000000,0.1875000000,0.4091857477,0.3386997141,0.4244449376,0.3961381366,0.4244449376,0.3961381366,0.4091857477,0.3386997141,0.3961381366,,, +0.1875000000,0.2500000000,0.3897686688,0.4028522689,0.2781331881,0.2893506006,0.2781331881,0.2893506006,0.3897686688,0.4028522689,0.2893506006,,, +0.2500000000,0.3125000000,0.3028424755,0.2885165321,0.3597203409,0.3343018349,0.3597203409,0.3343018349,0.3028424755,0.2885165321,0.3343018349,,, +0.3125000000,0.3750000000,0.3752107638,0.4737126652,0.3659766872,0.2710328777,0.3659766872,0.2710328777,0.3752107638,0.4737126652,0.2710328777,,, +0.3750000000,0.4375000000,0.3627599021,0.3404655446,0.3970969993,0.3066993956,0.3970969993,0.3066993956,0.3627599021,0.3404655446,0.3066993956,,, +0.4375000000,0.5000000000,0.2504476917,0.2510675797,0.3358548798,0.3424101286,0.3358548798,0.3424101286,0.2504476917,0.2510675797,0.3424101286,,, +0.5000000000,0.5625000000,0.3607014566,0.3152450615,0.3259869212,0.3206394478,0.3259869212,0.3206394478,0.3607014566,0.3152450615,0.3206394478,,, +0.5625000000,0.6250000000,0.3353893328,0.3096160755,0.3586253965,0.3529876219,0.3586253965,0.3529876219,0.3353893328,0.3096160755,0.3529876219,,, +0.6250000000,0.6875000000,0.2957161763,0.2676691353,0.4422169917,0.4235462858,0.4422169917,0.4235462858,0.2957161763,0.2676691353,0.4235462858,,, +0.6875000000,0.7500000000,0.3049466276,0.3109745909,0.2807179382,0.2052937887,0.2807179382,0.2052937887,0.3049466276,0.3109745909,0.2052937887,,, +0.7500000000,0.8125000000,0.3535213964,0.3148222862,0.2874563588,0.4031604793,0.2874563588,0.4031604793,0.3535213964,0.3148222862,0.4031604793,,, +0.8125000000,0.8750000000,0.3217516606,0.2825300467,0.2962858234,0.2872298099,0.2962858234,0.2872298099,0.3217516606,0.2825300467,0.2872298099,,, +0.8750000000,0.9375000000,0.3023488322,0.3155970121,0.3094789860,0.2326523503,0.3094789860,0.2326523503,0.3023488322,0.3155970121,0.2326523503,,, +0.9375000000,1.0000000000,0.3567112415,0.4195039714,0.3463518115,0.3117806365,0.3463518115,0.3117806365,0.3567112415,0.4195039714,0.3117806365,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selector-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selector-test.xml new file mode 100644 index 0000000..3da33e9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/features-selection/test/scenarios-tests/Features-Selector-test.xml @@ -0,0 +1,403 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x8bde916d, 0x217d8861) + (0x79a9edeb, 0x245d83fc) + Test Name + Features-Selector + Features-Selector + + + + + + + (0x000016ca, 0x00003754) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000484f, 0x00003eff) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x17341935, 0x152ff448) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00004b6f, 0x00006626) + Features Selector + (0xee36249f, 0x22a32e7e) + + + (0x17341935, 0x152ff448) + Input + + + + + (0x17341935, 0x152ff448) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Features List + : + :;2:;:2;3; + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x72567519, 0xdbac3ad5) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004c39, 0x0000096b) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x17341935, 0x152ff448) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/$var{Test Name}-output.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00005b5f, 0x000050b0) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017178bd) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x0000037d, 0x000025a0) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x000016ca, 0x00003754) + 0 + + + + (0x00000c6b, 0x0000741b) + + (0x00004b6f, 0x00006626) + 0 + + + (0x00004c39, 0x0000096b) + 0 + + + + (0x00002a40, 0x000075c3) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00004b6f, 0x00006626) + 0 + + + + (0x00002b92, 0x00000de6) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00005b5f, 0x000050b0) + 0 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"height":320,"identifier":"(0x00003820, 0x000008c9)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00005d8b, 0x000029a4)","index":0,"name":"Default tab","parentIdentifier":"(0x00003820, 0x000008c9)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00002efb, 0x00003d85)","index":1,"name":"config","parentIdentifier":"(0x00003820, 0x000008c9)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000063e7, 0x000031ad)","index":0,"name":"Empty","parentIdentifier":"(0x00005d8b, 0x000029a4)","type":0},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00003d1b, 0x000063a7)","index":0,"name":"Empty","parentIdentifier":"(0x00002efb, 0x00003d85)","type":0}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Features Selection Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/CMakeLists.txt new file mode 100644 index 0000000..0982396 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/CMakeLists.txt @@ -0,0 +1,49 @@ +PROJECT(openvibe-plugins-file-io) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.c src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE") + +INCLUDE_DIRECTORIES("src") + +# OpenViBE Base +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") + +# OpenViBE Module +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindOpenViBEModuleXML") +INCLUDE("FindOpenViBEModuleFS") + +# OpenViBE Third Party +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyBoost_Regex") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + + +INSTALL(DIRECTORY signals DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) +INSTALL(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) +INSTALL(DIRECTORY electrode_sets DESTINATION ${DIST_DATADIR}/openvibe/) + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/box-tutorials/gdf-reader.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/box-tutorials/gdf-reader.xml new file mode 100644 index 0000000..80cb441 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/box-tutorials/gdf-reader.xml @@ -0,0 +1,329 @@ + + 1 + openvibe + 2.0 + + + (0x00003095, 0x0000083c) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208.000000 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 352.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 113 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00007cac, 0x00005021) + GDF file reader + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/real-hand-movements.gdf + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xad100179, 0xa3c984ab) + 123 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a753ca) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + + + (0x00001b96, 0x0000671e) + + (0x00007cac, 0x00005021) + 1 + + + (0x00003095, 0x0000083c) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 131 + + + (0x358ae8b5, 0x0f8bacd1) + 368 + + + (0x3f0a3b27, 0x570913d2) + 184 + + + (0x6267b5c5, 0x676e3e42) + 337 + + + + + (0x00004818, 0x00007e41) + + (0x00007cac, 0x00005021) + 2 + + + (0x00003095, 0x0000083c) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 131 + + + (0x358ae8b5, 0x0f8bacd1) + 383 + + + (0x3f0a3b27, 0x570913d2) + 184 + + + (0x6267b5c5, 0x676e3e42) + 352 + + + + + + + (0x00003f6d, 0x000051fc) + The <i>Signal Display</i> box displays +the content of the file. + + + (0x473d9a43, 0x97fc0a97) + 608 + + + (0x7234b86b, 0x2b8651a5) + 224 + + + + + (0x00004f81, 0x00006854) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 512 + + + (0x7234b86b, 0x2b8651a5) + 304 + + + + + (0x0000609f, 0x00006abc) + The <i><b>GDF File Reader</b></i> box +reads a <i>GDF</i> file from disk and sends +its content to the following box. +The <i>GDF</i> file format is a general +data format for biomedical data. + + + (0x473d9a43, 0x97fc0a97) + 608 + + + (0x7234b86b, 0x2b8651a5) + 128 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00003095, 0x0000083c)","childCount":0,"identifier":"(0x00000dd5, 0x00002bd9)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00006b68, 0x000051e7)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004775, 0x00005b97)","index":0,"name":"Default tab","parentIdentifier":"(0x00006b68, 0x000051e7)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00007276, 0x00006df8)","index":0,"name":"Empty","parentIdentifier":"(0x00004775, 0x00005b97)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/box-tutorials/generic-stream-reader.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/box-tutorials/generic-stream-reader.xml new file mode 100644 index 0000000..0662239 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/box-tutorials/generic-stream-reader.xml @@ -0,0 +1,284 @@ + + 1 + OpenVIBE + 0.2.99 + + + + + + (0x00003308, 0x00003644) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x012ff9b9) + + + + + (0x000066fb, 0x00004b22) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208.000000 + + + (0x207c9054, 0x3c841b63) + 352.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + + + (0x00001a63, 0x0000448e) + + (0x00003308, 0x00003644) + 2 + + + (0x000066fb, 0x00004b22) + 1 + + + + (0x0000484b, 0x00006f3b) + + (0x00003308, 0x00003644) + 1 + + + (0x000066fb, 0x00004b22) + 0 + + + + + + (0x00003620, 0x000059a1) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 512 + + + (0x7234b86b, 0x2b8651a5) + 272 + + + + + (0x00005c3b, 0x00000b17) + The <i>Signal Display</i> box displays +the content of the file. + + + (0x473d9a43, 0x97fc0a97) + 608 + + + (0x7234b86b, 0x2b8651a5) + 192 + + + + + (0x00005efd, 0x00002640) + The <i><b>Generic Stream Reader</b></i> box +reads an <i>OpenViBE</i> file from disk and sends +its content to the following box. +The <i>OpenViBE</i> file format can store any +stream of the OpenViBE platform into a file. + + + (0x473d9a43, 0x97fc0a97) + 608 + + + (0x7234b86b, 0x2b8651a5) + 96 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x000066fb, 0x00004b22)","childCount":0,"identifier":"(0x000036a0, 0x000071be)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00007d0d, 0x00005168)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004865, 0x00005a3e)","index":0,"name":"Default tab","parentIdentifier":"(0x00007d0d, 0x00005168)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00004291, 0x000027f2)","index":0,"name":"Empty","parentIdentifier":"(0x00004865, 0x00005a3e)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Stream reading example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/box-tutorials/signal-concatenation.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/box-tutorials/signal-concatenation.xml new file mode 100644 index 0000000..4332649 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/box-tutorials/signal-concatenation.xml @@ -0,0 +1,686 @@ + + 1 + openvibe + 2.0 + + + (0x000014d0, 0x00006e53) + GDF file writer + (0x1e7b2155, 0x107289ce) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x6f752dd0, 0x082a321e) + Stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].gdf + ${Path_UserData}/spaceship-freetime-doubled.gdf + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 224.000000 + + + (0x4e7b798a, 0x183beafb) + (0xd41e3037, 0xcc12644a) + + + (0xad100179, 0xa3c984ab) + 102 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002eba2a) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00002e3b, 0x000031a4) + Signal Concatenation + (0x372f3a9d, 0x49e20cd2) + + + (0x5ba36127, 0x195feae1) + Input signal 1 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 1 + + + (0x5ba36127, 0x195feae1) + Input signal 2 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 2 + + + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6f752dd0, 0x082a321e) + Status + + + + + (0x007deef9, 0x2f3e95c6) + Time out before assuming end-of-file (in sec) + 5 + 5 + false + + + (0x2c132d6e, 0x44ab0d97) + End-of-file stimulation for input 1 + OVTK_StimulationId_ExperimentStop + OVTK_StimulationId_ExperimentStop + false + + + (0x2c132d6e, 0x44ab0d97) + End-of-file stimulation for input 2 + OVTK_StimulationId_ExperimentStop + OVTK_StimulationId_ExperimentStop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 320.000000 + + + (0x4e7b798a, 0x183beafb) + (0x2071186d, 0x08fedd4a) + + + (0xad100179, 0xa3c984ab) + 148 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a5ce58) + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 4 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003a1f, 0x00000d0f) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 320.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002c907c) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004fce, 0x0000401d) + GDF file reader + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/spaceship-freetime.gdf + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 176.000000 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xad100179, 0xa3c984ab) + 106 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01087006) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00005d50, 0x000030ca) + GDF file reader + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/spaceship-freetime.gdf + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 352.000000 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xad100179, 0xa3c984ab) + 106 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000dc339) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + + + (0x00000efd, 0x00000c31) + + (0x00002e3b, 0x000031a4) + 0 + + + (0x000014d0, 0x00006e53) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 231 + + + (0x358ae8b5, 0x0f8bacd1) + 305 + + + (0x3f0a3b27, 0x570913d2) + 304 + + + (0x6267b5c5, 0x676e3e42) + 224 + + + + + (0x0000157b, 0x00006c4b) + + (0x00004fce, 0x0000401d) + 0 + + + (0x000014d0, 0x00006e53) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 98 + + + (0x358ae8b5, 0x0f8bacd1) + 161 + + + (0x3f0a3b27, 0x570913d2) + 304 + + + (0x6267b5c5, 0x676e3e42) + 209 + + + + + (0x000024b5, 0x00003f90) + + (0x00002e3b, 0x000031a4) + 1 + + + (0x000014d0, 0x00006e53) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 231 + + + (0x358ae8b5, 0x0f8bacd1) + 320 + + + (0x3f0a3b27, 0x570913d2) + 304 + + + (0x6267b5c5, 0x676e3e42) + 239 + + + + + (0x000026b8, 0x00007cdc) + + (0x00004fce, 0x0000401d) + 1 + + + (0x00002e3b, 0x000031a4) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 98 + + + (0x358ae8b5, 0x0f8bacd1) + 176 + + + (0x3f0a3b27, 0x570913d2) + 187 + + + (0x6267b5c5, 0x676e3e42) + 297 + + + + + (0x00002b7e, 0x00005e63) + + (0x00005d50, 0x000030ca) + 1 + + + (0x00002e3b, 0x000031a4) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 98 + + + (0x358ae8b5, 0x0f8bacd1) + 352 + + + (0x3f0a3b27, 0x570913d2) + 187 + + + (0x6267b5c5, 0x676e3e42) + 327 + + + + + (0x00002fd3, 0x00001a24) + + (0x00005d50, 0x000030ca) + 2 + + + (0x00002e3b, 0x000031a4) + 3 + + + + (0x1b32c44c, 0x1905e0e9) + 98 + + + (0x358ae8b5, 0x0f8bacd1) + 367 + + + (0x3f0a3b27, 0x570913d2) + 187 + + + (0x6267b5c5, 0x676e3e42) + 342 + + + + + (0x0000537f, 0x00002c3d) + + (0x00004fce, 0x0000401d) + 2 + + + (0x00002e3b, 0x000031a4) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 98 + + + (0x358ae8b5, 0x0f8bacd1) + 191 + + + (0x3f0a3b27, 0x570913d2) + 187 + + + (0x6267b5c5, 0x676e3e42) + 312 + + + + + (0x00007d07, 0x000012ca) + + (0x00002e3b, 0x000031a4) + 2 + + + (0x00003a1f, 0x00000d0f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 231 + + + (0x358ae8b5, 0x0f8bacd1) + 335 + + + (0x3f0a3b27, 0x570913d2) + 352 + + + (0x6267b5c5, 0x676e3e42) + 320 + + + + + + + (0x00001273, 0x000001e4) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 688.000000 + + + (0x7234b86b, 0x2b8651a5) + 336.000000 + + + + + (0x00002bb5, 0x00003539) + This scenario illustrates the <b>Signal Concatenation</b> box. + +This box reads two or more streams, inserting the streams one +after another (from left to right, considering the input connectors). +Hence, the output stream will have the summed length of the +original signals. + +Note that the catenated streams must have the same +characteristics, such as sampling rate and number of channels. + +The <i>GDF file writer</i> box writes the resulting file under +$APPDATA/openvibe/ on Windows and $HOME/.config/openvibe/ on Linux, +as the setting token ${UserData} will be expanded to this path. + +Finally, <i>Player Controller</i> stops the scenario playback +after <i>Signal Concatenation</i> is finished. + + + (0x473d9a43, 0x97fc0a97) + 673.000000 + + + (0x7234b86b, 0x2b8651a5) + 175.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00002968, 0x000001df)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00000bb7, 0x00002c66)","index":0,"name":"Default tab","parentIdentifier":"(0x00002968, 0x000001df)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000067e2, 0x00001447)","index":0,"name":"Empty","parentIdentifier":"(0x00000bb7, 0x00002c66)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_BCI2000FileReader.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_BCI2000FileReader.dox-part new file mode 100644 index 0000000..2028d93 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_BCI2000FileReader.dox-part @@ -0,0 +1,56 @@ +/** + * \page BoxAlgorithm_BCI2000FileReader BCI2000 File Reader +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BCI2000FileReader_Description| + + * Loads signals from BCI2000 .dat files. + + * |OVP_DocEnd_BoxAlgorithm_BCI2000FileReader_Description| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BCI2000FileReader_Outputs| + * |OVP_DocEnd_BoxAlgorithm_BCI2000FileReader_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_BCI2000FileReader_Output1| + * The signals for the different channels. If the file header contains channel names, they are used in the stream, otherwise "channel #" is used. + * |OVP_DocEnd_BoxAlgorithm_BCI2000FileReader_Output1| + + * |OVP_DocBegin_BoxAlgorithm_BCI2000FileReader_Output2| + * The different state variables. + * |OVP_DocEnd_BoxAlgorithm_BCI2000FileReader_Output2| + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BCI2000FileReader_Settings| + * |OVP_DocEnd_BoxAlgorithm_BCI2000FileReader_Settings| + + * |OVP_DocBegin_BoxAlgorithm_BCI2000FileReader_Setting1| + * The file name should be a BCI2000 .dat file. + * |OVP_DocEnd_BoxAlgorithm_BCI2000FileReader_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_BCI2000FileReader_Setting2| + * The number of sample per block sent by the box. + * |OVP_DocEnd_BoxAlgorithm_BCI2000FileReader_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BCI2000FileReader_Examples| + * |OVP_DocEnd_BoxAlgorithm_BCI2000FileReader_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BCI2000FileReader_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_BCI2000FileReader_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_BCICompetitionIIIbReader.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_BCICompetitionIIIbReader.dox-part new file mode 100644 index 0000000..c2beee9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_BCICompetitionIIIbReader.dox-part @@ -0,0 +1,125 @@ +/** + * \page BoxAlgorithm_BCICompetitionIIIbReader BCI competition IIIb reader +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Description| + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Description| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Outputs| + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Output1| + * This input contains the signal samples from the trials. + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Output1| + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Output2| + * This input contains information about the stimulations that occurred during the trials. + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Output2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Settings| + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Settings| + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Setting1| + * Name of the signal file from the dataset ("*_s.txt"). + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Setting2| + * Name of the trigger file from the dataset ("*_HDR_TRIG.txt"). + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Setting3| + * Name of the label file from the dataset ("*_HDR_Classlabel.txt"). + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Setting4| + * Name of the artifact file from the dataset ("*_HDR_ArtifactSelection.txt"). + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Setting5| + * Name of the true labels file from the dataset ("true_labels_*.txt"). + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Setting6| + * Number of samples to send per sample buffer. + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Setting7| + * Whether the plugin is used in offline mode or not. + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Setting7| + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Setting8| + * Keep the training set trials or not. + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Setting8| + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Setting9| + * Keep the test set trials or not. + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Setting9| + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Setting10| + * Keep the trials containing artifacts or not. + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Setting10| + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Setting11| + * The length of a trial in seconds. + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Setting11| + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Setting12| + * The time when the CUE is displayed in a trial. + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Setting12| + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Setting13| + * The time when the feedback starts in a trial. + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Setting13| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Examples| + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BCICompetitionIIIbReader_Miscellaneous| + * + * The stimulations sent are the following : + * - Trial start + * - Time : 0 + * - Id : 0x300 + * + * - Display cross + * - Time : 0 + * - Id : 0x312 + * + * - CUE + * - Time : parameter(CUE display start) + * - Id : 0x300 + class index (0x301 for first class, 0x302 for the second class, ...) + * + * - Feedback start + * - Time : parameter(Feedback start) + * - Id : 0x30D + * + * - Trial end + * - Time : parameter(Trial length) + * - Id : 0x320 + * + * - End of session + * - Time : when the end of the input file has been reached + * - Id : 0x3FF + * + * See the \ref Doc_Stimulations page for more details about §OpenViBE§ stimulations. + * |OVP_DocEnd_BoxAlgorithm_BCICompetitionIIIbReader_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_BrainVisionFormatFileWriter.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_BrainVisionFormatFileWriter.dox-part new file mode 100644 index 0000000..c6a558c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_BrainVisionFormatFileWriter.dox-part @@ -0,0 +1,72 @@ +/** + * \page BoxAlgorithm_BrainVisionFormatFileWriter BrainVision format file writer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BrainVisionFormatFileWriter_Description| + * This box writes signal and stimulation data under BrainVision format files. + * The files generated by this box are readable with BrainVision Analyzer + * software suite. + * |OVP_DocEnd_BoxAlgorithm_BrainVisionFormatFileWriter_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BrainVisionFormatFileWriter_Inputs| + * |OVP_DocEnd_BoxAlgorithm_BrainVisionFormatFileWriter_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_BrainVisionFormatFileWriter_Input1| + * Input EEG signal to be written. + * |OVP_DocEnd_BoxAlgorithm_BrainVisionFormatFileWriter_Input1| + + * |OVP_DocBegin_BoxAlgorithm_BrainVisionFormatFileWriter_Input2| + * Input Stimulations to be written. + * |OVP_DocEnd_BoxAlgorithm_BrainVisionFormatFileWriter_Input2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BrainVisionFormatFileWriter_Settings| + * |OVP_DocEnd_BoxAlgorithm_BrainVisionFormatFileWriter_Settings| + + * |OVP_DocBegin_BoxAlgorithm_BrainVisionFormatFileWriter_Setting1| + * Path of the header file to write, the header is a .vhdr file, if the extension is missing, + * it will be automatically added. + * Header will be written to this file. A .eeg file with signal + * will be created in the same folder. A .vmrk file will be also written and it will contain + * the markers. + * |OVP_DocEnd_BoxAlgorithm_BrainVisionFormatFileWriter_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_BrainVisionFormatFileWriter_Setting2| + * Path to the dictionary containing Marker to Stimulation correspondences. Its format is described in the BrainVision Format File Reader \ref Doc_BoxAlgorithm_BrainVisionFormatFileReader_Miscellaneous section. + * |OVP_DocEnd_BoxAlgorithm_BrainVisionFormatFileWriter_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_BrainVisionFormatFileWriter_Setting3| + * Whether to write unknown stimulations into the marker stream as well. If set to false, + * stimulations that do not appear in the dictionary will be ignored. + * |OVP_DocEnd_BoxAlgorithm_BrainVisionFormatFileWriter_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_BrainVisionFormatFileWriter_Setting4| + * Whether to use $b as placeholder for EEG and Marker files inside the header. If this is set + * to true, the resulting file will be compatible with more software, however renaming the files + * will be more complex. + * |OVP_DocEnd_BoxAlgorithm_BrainVisionFormatFileWriter_Setting4| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BrainVisionFormatFileWriter_Examples| + * |OVP_DocEnd_BoxAlgorithm_BrainVisionFormatFileWriter_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BrainVisionFormatFileWriter_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_BrainVisionFormatFileWriter_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_BrainampFileReader.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_BrainampFileReader.dox-part new file mode 100644 index 0000000..61681f7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_BrainampFileReader.dox-part @@ -0,0 +1,76 @@ +/** + * \page BoxAlgorithm_BrainampFileReader Brainamp file reader +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BrainampFileReader_Description| + * Loads experiment information, signal and stimulations data from Brainamp files. + * |OVP_DocEnd_BoxAlgorithm_BrainampFileReader_Description| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BrainampFileReader_Outputs| + * |OVP_DocEnd_BoxAlgorithm_BrainampFileReader_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_BrainampFileReader_Output1| + * This stream contains information about the experiment and subject. + * |OVP_DocEnd_BoxAlgorithm_BrainampFileReader_Output1| + + * |OVP_DocBegin_BoxAlgorithm_BrainampFileReader_Output2| + * Contains the signal information for the different channels (read from the GDF file). + * |OVP_DocEnd_BoxAlgorithm_BrainampFileReader_Output2| + + * |OVP_DocBegin_BoxAlgorithm_BrainampFileReader_Output3| + * Contains information about the stimulations that occurred during the experiment. + * |OVP_DocEnd_BoxAlgorithm_BrainampFileReader_Output3| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BrainampFileReader_Settings| + * |OVP_DocEnd_BoxAlgorithm_BrainampFileReader_Settings| + + * |OVP_DocBegin_BoxAlgorithm_BrainampFileReader_Setting1| + * This setting contains the name of the brainamp header file. The other files are deduced + * from the header content (signal content and markers). + * |OVP_DocEnd_BoxAlgorithm_BrainampFileReader_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_BrainampFileReader_Setting2| + * This setting sets the size of epochs to be generated by this box, in seconds. + * |OVP_DocEnd_BoxAlgorithm_BrainampFileReader_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_BrainampFileReader_Setting3| + * Should stimuli in the file to be converted to OpenViBE stimuli? For + * legacy reasons, the default is true. With false, the stimuli will + * be delivered without any conversion. + * |OVP_DocEnd_BoxAlgorithm_BrainampFileReader_Setting3| + +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BrainampFileReader_Examples| + * |OVP_DocEnd_BoxAlgorithm_BrainampFileReader_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_BrainampFileReader_Miscellaneous| + * Experiment information is stored in a header file which the user needs to specify + * when setting up the box. When started, the box then works up the names of two additional + * files : a data file and a marker file. Signal data is retrieved from the data file, + * stimulations from the marker file. + * + * The stimulation makers are transformed in §OpenViBE§ format with the + * \c OVTK_StimulationId_Label base. See the \ref Doc_Stimulations page + * for more details about §OpenViBE§ stimulations. + * |OVP_DocEnd_BoxAlgorithm_BrainampFileReader_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_CSVFileReader.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_CSVFileReader.dox-part new file mode 100644 index 0000000..7a2dc02 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_CSVFileReader.dox-part @@ -0,0 +1,131 @@ +/** + * \page BoxAlgorithm_CSVFileReader CSV File Reader +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Description| +This box allows to read some of the OpenViBE streams from a text file that is +easy to read both by machines and humans. CSV files are text files +with different values separated by a special character such as a colon, a semicolon +or a tabulation. This basic syntax makes them very easy to parse. The purpose of this +box is to quickly import some data from other softwares. + +@b NOTE For files carrying signal, the file format the box accepts is NOT the usual +N times M matrix. There must be a few extra items: the first column must be the time +of each sample, and the first line of data must have one more column than the other lines. +This last column should be the sampling rate. See below for details. + + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Outputs| + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Output1| +This output is used to import data from a CSV File to an OpenViBE stream. The type of +this output can be modified by the user and the format of the file will be adapted +depending on this type. Supported outputs are : Signal, Spectrum, Stimulations, +Feature Vector and Streamed Matrix. + +Format specific to some of these stream types is detailed in section +\ref Doc_BoxAlgorithm_CSVFileReader_Miscellaneous. + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Settings| + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Settings| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Setting1| +This setting contains the file where to load the data. + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Setting2| +This setting contains the special character to use as a separation for the different +fields. Typical examples are colon, semi colon and tabulations. + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Setting3| +This option mainly makes sense for an output signal type, but can also be used +for matrices. Sometimes, the time of the first sample in the data isn't equal +0 or the file appears to contain such timing that it is difficult to parse a +continuous chunk sequence from it. Many OpenViBE boxes expect continuous +chunking, starting at time 0, with no time between the signal chunks. This +setting interpretes the file as essentially being dense, with consecutive +chunks, the first chunk (sample) at time 0. The samples are sent according +to the timing dictated by the sampling rate specified at the end of the +second line of the csv file, with the first column ignored. + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Setting4| +Number of samples per channel in a streamed matrix. + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Setting4| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Examples| + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Miscellaneous| +If the boxes obtaining signal from the CSV File Reader behave curiously, +you may want to try enabling the "don't use the file time" setting. Also, +if the time is not monotonically increasing from sample to another +in the file (this can result from e.g. epoching), the result may not +be read back as expected. For such signals, it is best to use the +.ov file format and not CSV. + +Here are some typical inputs that you will find in the input +file depending on the type of the input connector. + +For the Signal stream, you will have something like this : +\verbatim +Time (s), Channel 1, Channel 2, ..., Channel n, Sampling Rate +Time of measure 1, Measure 1 of channel 1, Measure 1 of channel 2, ..., Measure 1 of channel n, Value of the sampling rate +Time of measure 2, Measure 2 of channel 1, Measure 2 of channel 2, ..., Measure 2 of channel n +... +Time of measure t, Measure t of channel 1, Measure t of channel 2, ..., Measure t of channel n +\endverbatim + +For the Spectrum stream, you will have something like this : +\verbatim +Time (s), Channel 1, Channel 2, ..., Channel n, Min frequency band, Max frequency band +Time of measure 1, Freq band 1 of m. 1 of chan 1, Freq band 1 of m. 1 of chan 2, ..., Freq band 1 of m. 1 of chan n, Value Min Frequency Band of band 1, Value Max Frequency Band of band 1 +Time of measure 1, Freq band 2 of m. 1 of chan 1, Freq band 2 of m. 1 of chan 2, ..., Freq band 2 of m. 1 of chan n, Value Min Frequency Band of band 2, Value Max Frequency Band of band 2 +... +Time of measure 1, Freq band f of m. 1 of chan 1, Freq band f of m. 1 of chan 2, ..., Freq band f of m. 1 of chan n, Value Min Frequency Band of band f, Value Max Frequency Band of band f +Time of measure 2, Freq band 1 of m. 2 of chan 1, Freq band 1 of m. 2 of chan 2, ..., Freq band 1 of m. 2 of chan n +Time of measure 2, Freq band 2 of m. 2 of chan 1, Freq band 2 of m. 2 of chan 2, ..., Freq band 2 of m. 2 of chan n +... +Time of measure 2, Freq band f of m. 2 of chan 1, Freq band f of m. 2 of chan 2, ..., Freq band f of m. 2 of chan n +... +... +... +Time of measure t, Freq band 1 of m. t of chan 1, Freq band 1 of m. t of chan 2, ..., Freq band 1 of m. t of chan n +Time of measure t, Freq band 2 of m. t of chan 1, Freq band 2 of m. t of chan 2, ..., Freq band 2 of m. t of chan n +... +Time of measure t, Freq band f of m. t of chan 1, Freq band f of m. t of chan 2, ..., Freq band f of m. t of chan n +\endverbatim + +For the Stimulation stream, you will have something like this : +\verbatim +Time (s), Identifier, Duration +Time of stim 1, Identifier of stim 1, Duration of stim 1 +Time of stim 2, Identifier of stim 2, Duration of stim 2 +... +Time of stim n, Identifier of stim n, Duration of stim n +\endverbatim + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_CSVFileWriter.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_CSVFileWriter.dox-part new file mode 100644 index 0000000..93f6480 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_CSVFileWriter.dox-part @@ -0,0 +1,126 @@ +/** + * \page BoxAlgorithm_CSVFileWriter CSV File Writer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Description| +This box allows to output some of the OpenViBE streams in a text file that is +easy to read by the machine and easy to read by the human. CSV files are text files +with different values separated by a special character such as a colon, a semicolon +or a tabulation. This basic syntax makes them very easy to read for both machine and +human. The purpose of this box is to quicly export some data to other softwares. + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Inputs| + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Input1| +This is input is used to know what data to dump in the considered file. The type of +this input can be modified by the user and the format of the output will be adapted +depending on this type. Supported inputs are : Signal, Spectrum, Streamed Matrix, +Feature Vector, and Stimulations. +Format specific to each of these stream types is detailed in section +\ref Doc_BoxAlgorithm_CSVFileWriter_Miscellaneous. + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Settings| + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Settings| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Setting1| +This setting contains the file where to store the data. + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Setting2| +This setting contains the special character to use as a separation for the different +fields. Typical examples are colon, semi colon and tabulations. + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Setting3| +This allows you to set std::precision, i.e. how many digits are used to represent each input value in the output. + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Examples| + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Miscellaneous| +In this section, we detail the typical outputs that you will find in the output +file depending on the type of the input connector. + +For the Signal stream, you will have something like this : +\verbatim +Time (s), Channel 1, Channel 2, ..., Channel n, Sampling Rate +Time of measure 1, Measure 1 of channel 1, Measure 1 of channel 2, ..., Measure 1 of channel n, Value of the sampling rate +Time of measure 2, Measure 2 of channel 1, Measure 2 of channel 2, ..., Measure 2 of channel n, +... +Time of measure t, Measure t of channel 1, Measure t of channel 2, ..., Measure t of channel n, +\endverbatim + +For the Streamed Matrix stream, you will have something like this : +\verbatim +Time (s), Column 1, Column 2, ..., Column n +Time of matrix 1, slot [1,1] of 1, slot[1,2] of 1, ..., slot[1,n] of 1 +Time of matrix 1, slot [2,1] of 1, slot[2,2] of 1, ..., slot[2,n] of 1 +... +Time of matrix 1, slot [m,1] of 1, slot[m,2] of 1, ..., slot[m,n] of 1 +... +Time of matrix 2, slot [1,1] of 2, slot[1,2] of 2, ..., slot[1,n] of 2 +... +\endverbatim + +For the Feature Vector stream, you will have something like this : +\verbatim +Time (s), Feature 1, Feature 2, ..., Feature n +Time of vector 1, feature 1, feature 2, ..., feature n +Time of vector 2, feature 1, feature 2, ..., feature n +... +Time of vector k, feature 1, feature 2, ..., feature n +\endverbatim + +For the Spectrum stream, you will have something like this : +\verbatim +Time (s), Channel 1, Channel 2, ..., Channel n, Min frequency band, Max frequency band +Time of measure 1, Freq band 1 of m. 1 of chan 1, Freq band 1 of m. 1 of chan 2, ..., Freq band 1 of m. 1 of chan n, Value Min Frequency Band of band 1, Value Max Frequency Band of band 1 +Time of measure 1, Freq band 2 of m. 1 of chan 1, Freq band 2 of m. 1 of chan 2, ..., Freq band 2 of m. 1 of chan n, Value Min Frequency Band of band 2, Value Max Frequency Band of band 2 +... +Time of measure 1, Freq band f of m. 1 of chan 1, Freq band f of m. 1 of chan 2, ..., Freq band f of m. 1 of chan n, Value Min Frequency Band of band f, Value Max Frequency Band of band f +Time of measure 2, Freq band 1 of m. 2 of chan 1, Freq band 1 of m. 2 of chan 2, ..., Freq band 1 of m. 2 of chan n +Time of measure 2, Freq band 2 of m. 2 of chan 1, Freq band 2 of m. 2 of chan 2, ..., Freq band 2 of m. 2 of chan n +... +Time of measure 2, Freq band f of m. 2 of chan 1, Freq band f of m. 2 of chan 2, ..., Freq band f of m. 2 of chan n +... +... +... +Time of measure t, Freq band 1 of m. t of chan 1, Freq band 1 of m. t of chan 2, ..., Freq band 1 of m. t of chan n +Time of measure t, Freq band 2 of m. t of chan 1, Freq band 2 of m. t of chan 2, ..., Freq band 2 of m. t of chan n +... +Time of measure t, Freq band f of m. t of chan 1, Freq band f of m. t of chan 2, ..., Freq band f of m. t of chan n +\endverbatim + +For the Stimulation stream, you will have something like this : +\verbatim +Time (s), Identifier, Duration +Time of stim 1, Identifier of stim 1, Duration of stim 1 +Time of stim 2, Identifier of stim 2, Duration of stim 2 +... +Time of stim n, Identifier of stim n, Duration of stim n +\endverbatim + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_GDFFileReader.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_GDFFileReader.dox-part new file mode 100644 index 0000000..b9cbf89 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_GDFFileReader.dox-part @@ -0,0 +1,86 @@ +/** + * \page BoxAlgorithm_GDFFileReader GDF file reader +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GDFFileReader_Description| + The box attempts to be compliant with the version 2.51 of the GDF file specification (doc v10) by Alois Schlgl, + as available at the arxiv. + * |OVP_DocEnd_BoxAlgorithm_GDFFileReader_Description| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GDFFileReader_Outputs| + * |OVP_DocEnd_BoxAlgorithm_GDFFileReader_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_GDFFileReader_Output1| + * This stream contains information about the experiment and subject. + * |OVP_DocEnd_BoxAlgorithm_GDFFileReader_Output1| + + * |OVP_DocBegin_BoxAlgorithm_GDFFileReader_Output2| + * Contains the signal information for the different channels (read from the GDF file). + * |OVP_DocEnd_BoxAlgorithm_GDFFileReader_Output2| + + * |OVP_DocBegin_BoxAlgorithm_GDFFileReader_Output3| + * Contains information about the stimulations that occurred during the experiment. + * |OVP_DocEnd_BoxAlgorithm_GDFFileReader_Output3| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GDFFileReader_Settings| + * |OVP_DocEnd_BoxAlgorithm_GDFFileReader_Settings| + + * |OVP_DocBegin_BoxAlgorithm_GDFFileReader_Setting1| + * Name of the GDF file to read. + * |OVP_DocEnd_BoxAlgorithm_GDFFileReader_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_GDFFileReader_Setting2| + * Number of samples per channel in a streamed matrix. + * |OVP_DocEnd_BoxAlgorithm_GDFFileReader_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GDFFileReader_Examples| + * If your GDF file is located in your /tmp directory, you can configure the plugin as follows : + * + * Filename : + * +\code +/tmp/myGDFFile.gdf +\endcode + * + * Samples per buffer : + * +\code +32 +\endcode + * + * Several example GDF files can be found in the share/openvibe/scenarios/signals/ folder. + * + * Practical example : + * + * Let's add a GDF file reader box to an empty scenario. One should also locate a GDF file and enter its path in the 'Filename' setting of the box. A second setting + * allows to specify the number of samples to be sent per data block. + * + * This box has 3 output connectors, corresponding to experiment information, stimulations + * and signals. One can connect the last two to the two input connectors of a Signal Display box to visualize the signals and/or stimulations stored in the GDF file. + * + * |OVP_DocEnd_BoxAlgorithm_GDFFileReader_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GDFFileReader_Miscellaneous| + * The experiment information output isn't operational yet. + * |OVP_DocEnd_BoxAlgorithm_GDFFileReader_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_GDFFileWriter.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_GDFFileWriter.dox-part new file mode 100644 index 0000000..5c62c2c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_GDFFileWriter.dox-part @@ -0,0 +1,66 @@ +/** + * \page BoxAlgorithm_GDFFileWriter GDF file writer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GDFFileWriter_Description| + Writes incoming experiment information, signal and stimulations data to a file according to the GDF file format. One simply has to connect this box to an output to save the desired streams to a file. For now, only GDF1 files are supported. + + * |OVP_DocEnd_BoxAlgorithm_GDFFileWriter_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GDFFileWriter_Inputs| + * |OVP_DocEnd_BoxAlgorithm_GDFFileWriter_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_GDFFileWriter_Input1| + This stream contains information about the experiment and subject. + * |OVP_DocEnd_BoxAlgorithm_GDFFileWriter_Input1| + + * |OVP_DocBegin_BoxAlgorithm_GDFFileWriter_Input2| + Contains the signal information for the different channels. + * |OVP_DocEnd_BoxAlgorithm_GDFFileWriter_Input2| + + * |OVP_DocBegin_BoxAlgorithm_GDFFileWriter_Input3| + Contains information about the stimulations that occurred during the experiment. + * |OVP_DocEnd_BoxAlgorithm_GDFFileWriter_Input3| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GDFFileWriter_Settings| + * |OVP_DocEnd_BoxAlgorithm_GDFFileWriter_Settings| + + * |OVP_DocBegin_BoxAlgorithm_GDFFileWriter_Setting1| + Name of the GDF file to be written. + * |OVP_DocEnd_BoxAlgorithm_GDFFileWriter_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GDFFileWriter_Examples| + If you want to write the GDF file in your /tmp directory, you can configure the plugin like that : + + Filename : + \code + /tmp/myGDFFile.gdf +\endcode + * |OVP_DocEnd_BoxAlgorithm_GDFFileWriter_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GDFFileWriter_Miscellaneous| + The only output format is GDF1. + +The experiment information such as the subject name and sex may not be parsed correctly by other programs. + * |OVP_DocEnd_BoxAlgorithm_GDFFileWriter_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_SignalConcatenation.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_SignalConcatenation.dox-part new file mode 100644 index 0000000..cf61d26 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_SignalConcatenation.dox-part @@ -0,0 +1,96 @@ +/** + * \page BoxAlgorithm_SignalConcatenation Signal Stream Concatenation +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalConcatenation_Description| + The input streams must share the same characteristics : sampling frequency, number of channels, sample count per block. + User can specify a time-out value beyond which a stream is considered as finished if no samples are received. + If user wants a specific part of a given stream, he can specify a stimulation used as end-of-stream trigger. + + The status stimulation output deliver the stimulation OVTK_StimulationId_EndOfFile when the concatenation is finished. You can connect this output to a \subpage BoxAlgorithm_PlayerController to script your concatenation easily. + * |OVP_DocEnd_BoxAlgorithm_SignalConcatenation_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalConcatenation_Inputs| + The box has a pair of input (signal, stimulation) per source. + * |OVP_DocEnd_BoxAlgorithm_SignalConcatenation_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_SignalConcatenation_Input1| + Signal stream from source #1. + * |OVP_DocEnd_BoxAlgorithm_SignalConcatenation_Input1| + + * |OVP_DocBegin_BoxAlgorithm_SignalConcatenation_Input2| + Stimulation stream from source #1. + * |OVP_DocEnd_BoxAlgorithm_SignalConcatenation_Input2| + + * |OVP_DocBegin_BoxAlgorithm_SignalConcatenation_Input3| + Signal stream from source #2. + * |OVP_DocEnd_BoxAlgorithm_SignalConcatenation_Input3| + + * |OVP_DocBegin_BoxAlgorithm_SignalConcatenation_Input4| + Stimulation stream from source #2. + * |OVP_DocEnd_BoxAlgorithm_SignalConcatenation_Input4| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalConcatenation_Outputs| + * |OVP_DocEnd_BoxAlgorithm_SignalConcatenation_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_SignalConcatenation_Output1| + Concatenated signal stream. + * |OVP_DocEnd_BoxAlgorithm_SignalConcatenation_Output1| + + * |OVP_DocBegin_BoxAlgorithm_SignalConcatenation_Output2| + Concatenated stimulation stream. + * |OVP_DocEnd_BoxAlgorithm_SignalConcatenation_Output2| + + * |OVP_DocBegin_BoxAlgorithm_SignalConcatenation_Output3| + Status stimulation stream (sends OVTK_StimulationId_EndOfFile on success). + * |OVP_DocEnd_BoxAlgorithm_SignalConcatenation_Output3| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalConcatenation_Settings| + A stimulation setting is added for each input pair. + * |OVP_DocEnd_BoxAlgorithm_SignalConcatenation_Settings| + + * |OVP_DocBegin_BoxAlgorithm_SignalConcatenation_Setting1| + If no samples are received beyond this time-out value, a stream is considered as finished. + * |OVP_DocEnd_BoxAlgorithm_SignalConcatenation_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_SignalConcatenation_Setting2| + Stimulation that triggers the end-of-stream for source #1. + * |OVP_DocEnd_BoxAlgorithm_SignalConcatenation_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_SignalConcatenation_Setting3| + Stimulation that triggers the end-of-stream for source #2. + * |OVP_DocEnd_BoxAlgorithm_SignalConcatenation_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalConcatenation_Examples| + This box is mainly designed to concatenate multiple signal files. + For example, you have 10 sessions of training and you want to train a classifier on the whole set of data. + You can use the Signal Stream Concatenation to produce one EEG file containing the 10 sessions, + and then feed a \ref Doc_BoxAlgorithm_ClassifierTrainer box with it. + * |OVP_DocEnd_BoxAlgorithm_SignalConcatenation_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalConcatenation_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_SignalConcatenation_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/electrode_sets/electrode_set_standard_cartesian.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/electrode_sets/electrode_set_standard_cartesian.txt new file mode 100644 index 0000000..eb4553e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/electrode_sets/electrode_set_standard_cartesian.txt @@ -0,0 +1,244 @@ +[ + [ "O1" "O2" "T5" "P7" "P3" "Pz" "P4" "T6" "P8" "T3" "T7" "C3" "Cz" "C4" "T4" "T8" "F7" "F3" "Fz" "F4" "F8" "Fp1" "Fp2" "P5" "P1" "P2" "P6" "C5" "C1" "C2" "C6" "F5" "F1" "F2" "F6" "M1" "M2" "Oz" "POz" "CPz" "FCz" "FFz" "Fpz" "FC1" "FC2" "CP1" "CP2" "FC3" "FC4" "CP3" "CP4" "FT3" "FT4" "TP3" "TP4" "P'1" "P'2" "Nz" "I1" "Iz" "I2" "FF3" "TP5" "OT5" "IT1" "IT2" "IP1" "IPz" "IP2" "M'1" "M'2" "TP7" "TP8" "Nez" "F3z" "F4z" "AF3" "AF4" "FC5" "FC6" ] + ["x" "y" "z" ] +] +[ + [-0.309017 -0.951057 4.48966e-011 ] +] +[ + [0.309017 -0.951057 4.48966e-011 ] +] +[ + [-0.809017 -0.587785 4.48966e-011 ] +] +[ + [-0.809017 -0.587785 4.48966e-011 ] +] +[ + [-0.651157 -0.609342 0.452435 ] +] +[ + [-9.52401e-011 -0.707107 0.707107 ] +] +[ + [0.651157 -0.609342 0.452435 ] +] +[ + [0.809017 -0.587785 4.48966e-011 ] +] +[ + [0.809017 -0.587785 4.48966e-011 ] +] +[ + [-1 8.97932e-011 4.48966e-011 ] +] +[ + [-1 8.97932e-011 4.48966e-011 ] +] +[ + [-0.707107 6.34934e-011 0.707107 ] +] +[ + [0 0 1 ] +] +[ + [0.707107 0 0.707107 ] +] +[ + [1 0 4.48966e-011 ] +] +[ + [1 0 4.48966e-011 ] +] +[ + [-0.809017 0.587785 4.48966e-011 ] +] +[ + [-0.651157 0.609342 0.452435 ] +] +[ + [3.17467e-011 0.707107 0.707107 ] +] +[ + [0.651157 0.609342 0.452435 ] +] +[ + [0.809017 0.587785 4.48966e-011 ] +] +[ + [-0.309017 0.951057 4.48966e-011 ] +] +[ + [0.309017 0.951057 4.48966e-011 ] +] +[ + [-0.752459 -0.615881 0.233445 ] +] +[ + [-0.347712 -0.703541 0.619779 ] +] +[ + [0.347712 -0.703541 0.619779 ] +] +[ + [0.752459 -0.615881 0.233445 ] +] +[ + [-0.92388 8.29581e-011 0.382683 ] +] +[ + [-0.382683 3.43624e-011 0.92388 ] +] +[ + [0.382683 0 0.92388 ] +] +[ + [0.92388 0 0.382683 ] +] +[ + [-0.752459 0.615881 0.233445 ] +] +[ + [-0.347712 0.703541 0.619779 ] +] +[ + [0.347712 0.703541 0.619779 ] +] +[ + [0.752459 0.615881 0.233445 ] +] +[ + [-0.704166 -0.504133 -0.5 ] +] +[ + [0.704166 -0.504133 -0.5 ] +] +[ + [-1.3469e-010 -1 4.48966e-011 ] +] +[ + [-1.24437e-010 -0.92388 0.382683 ] +] +[ + [-5.15435e-011 -0.382683 0.92388 ] +] +[ + [1.71812e-011 0.382683 0.92388 ] +] +[ + [4.1479e-011 0.92388 0.382683 ] +] +[ + [4.48966e-011 1 4.48966e-011 ] +] +[ + [-0.381509 0.35701 0.85264 ] +] +[ + [0.381509 0.35701 0.85264 ] +] +[ + [-0.381509 -0.35701 0.85264 ] +] +[ + [0.381509 -0.35701 0.85264 ] +] +[ + [-0.719739 0.323464 0.614285 ] +] +[ + [0.719739 0.323464 0.614285 ] +] +[ + [-0.719739 -0.323464 0.614285 ] +] +[ + [0.719739 -0.323464 0.614285 ] +] +[ + [-0.908423 0.336036 0.24869 ] +] +[ + [0.908423 0.336036 0.24869 ] +] +[ + [-0.908423 -0.336036 0.24869 ] +] +[ + [0.908423 -0.336036 0.24869 ] +] +[ + [-0.378421 -0.691201 0.615661 ] +] +[ + [0.378421 -0.691201 0.615661 ] +] +[ + [4.1479e-011 0.92388 -0.382683 ] +] +[ + [-0.504133 -0.704166 -0.5 ] +] +[ + [-1.24437e-010 -0.92388 -0.382683 ] +] +[ + [0.504133 -0.704166 -0.5 ] +] +[ + [-0.391219 0.38311 0.836764 ] +] +[ + [-0.854997 -0.331631 0.398749 ] +] +[ + [-0.46117 -0.860079 0.218143 ] +] +[ + [-0.46117 -0.860079 -0.218143 ] +] +[ + [0.46117 -0.860079 -0.218143 ] +] +[ + [-0.390388 -0.919697 0.0418757 ] +] +[ + [-1.32125e-010 -0.980955 0.194234 ] +] +[ + [0.390388 -0.919697 0.0418757 ] +] +[ + [-0.887454 -0.376702 -0.265556 ] +] +[ + [0.887454 -0.376702 -0.265556 ] +] +[ + [-0.951057 -0.309017 4.48966e-011 ] +] +[ + [0.951057 -0.309017 4.48966e-011 ] +] +[ + [3.96045e-011 0.882127 -0.471012 ] +] +[ + [-0.349374 0.823073 0.447759 ] +] +[ + [0.349374 0.823073 0.447759 ] +] +[ + [-0.37559 0.88485 0.27564 ] +] +[ + [0.37559 0.88485 0.27564 ] +] +[ + [-0.87203 0.33729 0.35467 ] +] +[ + [0.87203 0.33729 0.35467 ] +] \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/electrode_sets/electrode_set_standard_spherical.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/electrode_sets/electrode_set_standard_spherical.txt new file mode 100644 index 0000000..233055a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/electrode_sets/electrode_set_standard_spherical.txt @@ -0,0 +1,232 @@ +[ + [ "O1" "O2" "T5" "P7" "P3" "Pz" "P4" "T6" "P8" "T3" "T7" "C3" "Cz" "C4" "T4" "T8" "F7" "F3" "Fz" "F4" "F8" "Fp1" "Fp2" "P5" "P1" "P2" "P6" "C5" "C1" "C2" "C6" "F5" "F1" "F2" "F6" "M1" "M2" "Oz" "POz" "CPz" "FCz" "FFz" "Fpz" "FC1" "FC2" "CP1" "CP2" "FC3" "FC4" "CP3" "CP4" "FT3" "FT4" "TP3" "TP4" "P'1" "P'2" "Nz" "I1" "Iz" "I2" "FF3" "TP5" "OT5" "IT1" "IT2" "IP1" "IPz" "IP2" "M'1" "M'2" "TP7" "TP8" "Nez" "F3z" "F4z" ] + ["theta" "phi" ] +] +[ + [90 252 ] +] +[ + [90 288 ] +] +[ + [90 216 ] +] +[ + [63.1 223.1 ] +] +[ + [63.1 223.1 ] +] +[ + [45 270 ] +] +[ + [63.1 316.9 ] +] +[ + [90 324 ] +] +[ + [90 324 ] +] +[ + [90 180 ] +] +[ + [90 180 ] +] +[ + [45 180 ] +] +[ + [0 0 ] +] +[ + [45 0 ] +] +[ + [90 0 ] +] +[ + [90 0 ] +] +[ + [90 144 ] +] +[ + [63.1 136.9 ] +] +[ + [45 90 ] +] +[ + [63.1 43.1 ] +] +[ + [90 36 ] +] +[ + [90 108 ] +] +[ + [90 72 ] +] +[ + [76.5 219.3 ] +] +[ + [51.7 243.7 ] +] +[ + [51.7 296.3 ] +] +[ + [76.5 320.7 ] +] +[ + [67.5 180 ] +] +[ + [22.5 180 ] +] +[ + [22.5 0 ] +] +[ + [67.5 0 ] +] +[ + [76.5 140.7 ] +] +[ + [51.7 116.3 ] +] +[ + [51.7 63.7 ] +] +[ + [76.5 39.3 ] +] +[ + [120 215.6 ] +] +[ + [120 324.4 ] +] +[ + [90 270 ] +] +[ + [67.5 270 ] +] +[ + [22.5 270 ] +] +[ + [22.5 90 ] +] +[ + [67.5 90 ] +] +[ + [90 90 ] +] +[ + [31.5 136.9 ] +] +[ + [31.5 43.1 ] +] +[ + [31.5 223.1 ] +] +[ + [31.5 316.9 ] +] +[ + [52.1 155.8 ] +] +[ + [52.1 24.2 ] +] +[ + [52.1 204.2 ] +] +[ + [52.1 335.8 ] +] +[ + [75.6 159.7 ] +] +[ + [75.6 20.3 ] +] +[ + [75.6 200.3 ] +] +[ + [75.6 339.7 ] +] +[ + [52 241.3 ] +] +[ + [52 298.7 ] +] +[ + [112.5 90 ] +] +[ + [120 234.4 ] +] +[ + [112.5 270 ] +] +[ + [120 305.6 ] +] +[ + [33.2 135.6 ] +] +[ + [66.5 201.2 ] +] +[ + [77.4 241.8 ] +] +[ + [102.6 241.8 ] +] +[ + [102.6 298.2 ] +] +[ + [87.6 247 ] +] +[ + [78.8 270 ] +] +[ + [87.6 293 ] +] +[ + [105.4 203 ] +] +[ + [105.4 337 ] +] +[ + [90 198 ] +] +[ + [90 342 ] +] +[ + [118.1 90 ] +] +[ + [63.4 113 ] +] +[ + [63.4 67 ] +] diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/signals/bci-motor-imagery.ov b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/signals/bci-motor-imagery.ov new file mode 100644 index 0000000..be8311a Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/signals/bci-motor-imagery.ov differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/signals/real-hand-movements.gdf b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/signals/real-hand-movements.gdf new file mode 100644 index 0000000..ad004fb Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/signals/real-hand-movements.gdf differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/algorithms/brainamp/ovpCAlgorithmBrainampFileReader.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/algorithms/brainamp/ovpCAlgorithmBrainampFileReader.cpp new file mode 100644 index 0000000..8d3f14b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/algorithms/brainamp/ovpCAlgorithmBrainampFileReader.cpp @@ -0,0 +1,440 @@ +#include "ovpCAlgorithmBrainampFileReader.h" + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +// +bool CAlgorithmBrainampFileReader::initialize() +{ + ip_filename.initialize(getInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_Filename)); + ip_epochDuration.initialize(getInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_EpochDuration)); + ip_seekTime.initialize(getInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_SeekTime)); + ip_convertStimuli.initialize(getInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_ConvertStimuli)); + + op_startTime.initialize(getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_CurrentStartTime)); + op_endTime.initialize(getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_CurrentEndTime)); + op_sampling.initialize(getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_Sampling)); + op_signalMatrix.initialize(getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_SignalMatrix)); + op_stimulations.initialize(getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_Stimulations)); + + // Default value + ip_convertStimuli = true; + + m_buffer = nullptr; + + return true; +} + +bool CAlgorithmBrainampFileReader::uninitialize() +{ + if (m_dataFile.is_open()) { m_dataFile.close(); } + + op_stimulations.uninitialize(); + op_signalMatrix.uninitialize(); + op_sampling.uninitialize(); + op_endTime.uninitialize(); + op_startTime.uninitialize(); + + ip_convertStimuli.uninitialize(); + ip_seekTime.uninitialize(); + ip_epochDuration.uninitialize(); + ip_filename.uninitialize(); + + delete [] m_buffer; + m_buffer = nullptr; + + return true; +} + +bool CAlgorithmBrainampFileReader::process() +{ + if (this->isInputTriggerActive(OVP_Algorithm_BrainampFileReader_InputTriggerId_Open)) + { + std::string markerFilename; + std::string dataFilename; + + m_binaryFormat = EBinaryFormat::Integer16; + m_nChannel = 0; + m_startSampleIdx = 0; + m_endSampleIdx = 0; + m_sampleCountPerBuffer = 0; + m_channelScales.clear(); + delete [] m_buffer; + m_buffer = nullptr; + m_endianness = EEndianness::LittleEndian; + + m_headerFile.open(ip_filename->toASCIIString(), std::ios::binary); + if (!m_headerFile.good()) + { + getLogManager() << Kernel::LogLevel_Error << "Could not open file [" << *ip_filename << "]\n"; + return false; + } + getLogManager() << Kernel::LogLevel_Trace << "Opening " << *ip_filename << " succeeded\n"; + + op_signalMatrix->setDimensionCount(2); + + size_t channelIdx = 0; + EStatus status = EStatus::Nothing; + do + { + std::string what; + std::getline(m_headerFile, what, '\n'); + getLogManager() << Kernel::LogLevel_Debug << what << "\n"; + + // optionally removes ending carriage return for windows / linux compatibility + if (what.length() != 0) { if (what[what.length() - 1] == '\r') { what.erase(what.length() - 1, 1); } } + + if (what.length() != 0) + { + std::string::size_type equalPos; + if (what[0] == ';') // comments + { } + else if (what.length() > 2 && what[0] == '[') // section start + { + std::string name; + name.assign(what, 1, what.length() - 2); + if (name == "Common Infos") + { + getLogManager() << Kernel::LogLevel_Trace << "Found section " << what << "\n"; + status = EStatus::CommonInfos; + } + else if (name == "Binary Infos") + { + getLogManager() << Kernel::LogLevel_Trace << "Found section " << what << "\n"; + status = EStatus::BinrayInfos; + } + else if (name == "Channel Infos") + { + getLogManager() << Kernel::LogLevel_Trace << "Found section " << what << "\n"; + status = EStatus::ChannelInfos; + } + else if (name == "Comment") + { + getLogManager() << Kernel::LogLevel_Trace << "Found section " << what << "\n"; + status = EStatus::Comment; + } + else + { + getLogManager() << Kernel::LogLevel_Warning << "{" << what << + "} looked like a new section in the header file but is not know of this parser. Therefore anything after this line will be skipped until a new section is found\n"; + status = EStatus::Nothing; + } + } + else if ((equalPos = what.find('=')) != std::string::npos && status != EStatus::Comment) // Option value + { + std::string name; + std::string value; + name.assign(what, 0, equalPos); + value.assign(what, equalPos + 1, what.length() - equalPos - 1); + + getLogManager() << Kernel::LogLevel_Trace << "| Found option " << name << " with value " << CString( + value.c_str()) << "\n"; + + switch (status) + { + case EStatus::CommonInfos: + if (name == "DataFormat") + { + if (value != "BINARY") { getLogManager() << Kernel::LogLevel_ImportantWarning << "Only binary data is supported\n"; } + } + else if (name == "DataOrientation") + { + if (value != "MULTIPLEXED") { getLogManager() << Kernel::LogLevel_ImportantWarning << "Only multiplexed data is supported\n"; } + } + else if (name == "DataType") + { + if (value != "TIMEDOMAIN") { getLogManager() << Kernel::LogLevel_ImportantWarning << "Only time domain data is supported\n"; } + } + else if (name == "Codepage") + { + if (value != "ANSI") + { + getLogManager() << Kernel::LogLevel_Warning << "Header specifies code page as " << value + << " but it will be forced back to " << CString("ANSI") << "\n"; + } + } + else if (name == "DataFile") { dataFilename = value; } + else if (name == "MarkerFile") { markerFilename = value; } + else if (name == "NumberOfChannels") + { + m_nChannel = atoi(value.c_str()); + m_channelScales.clear(); + m_channelScales.resize(m_nChannel, 1); + op_signalMatrix->setDimensionSize(0, m_nChannel); + } + else if (name == "SamplingInterval") + { + double samplingInterval = atof(value.c_str()); + + op_sampling = uint64_t(0.5 + 1000000.0 / samplingInterval); // +0.5 for rounding + + m_sampleCountPerBuffer = int64_t(ip_epochDuration * op_sampling); // $$$ Casted in (int64_t) because of Ubuntu 7.10 crash ! + op_signalMatrix->setDimensionSize(1, uint32_t(m_sampleCountPerBuffer)); + + // TODO warn if approximated sampling rate + getLogManager() << Kernel::LogLevel_Trace << "| -> Calculated sampling frequency " << op_sampling << "Hz\n"; + } + else { getLogManager() << Kernel::LogLevel_Warning << "Skipped option " << name << " with value " << value << "\n"; } + break; + + case EStatus::BinrayInfos: + if (name == "BinaryFormat") + { + if (value == "INT_16") { m_binaryFormat = EBinaryFormat::Integer16; } + else if (value == "UINT_16") { m_binaryFormat = EBinaryFormat::UnsignedInteger16; } + else if (value == "FLOAT_32" || value == "IEEE_FLOAT_32") { m_binaryFormat = EBinaryFormat::Float32; } + else + { + m_binaryFormat = EBinaryFormat::Integer16; + getLogManager() << Kernel::LogLevel_ImportantWarning << "Unsupported binary format option value \"" + << value << "\"... Switched back to 16 bits integer (default)\n"; + } + } + else if (name == "UseBigEndianOrder") + { + if (value == "YES") { m_endianness = EEndianness::BigEndian; } + else if (value == "NO") { m_endianness = EEndianness::LittleEndian; } + else + { + m_endianness = EEndianness::LittleEndian; + getLogManager() << Kernel::LogLevel_ImportantWarning << "Unsupported use big endian order option value \"" + << value << "\"... Switched back to little endian (default)\n"; + } + } + else { getLogManager() << Kernel::LogLevel_Warning << "Skipped option " << name << " with value " << value << "\n"; } + break; + + case EStatus::ChannelInfos: + { + std::stringstream ss(value); + std::string channelName, referenceChannelName, resolutionInUnit, unitName; + + std::getline(ss, channelName, ','); + std::getline(ss, referenceChannelName, ','); + std::getline(ss, resolutionInUnit, ','); + std::getline(ss, unitName, ','); + + op_signalMatrix->setDimensionLabel(0, channelIdx, channelName.c_str()); + m_channelScales[channelIdx] = atof(resolutionInUnit.c_str()); + channelIdx++; + } + break; + default: break; + } + } + } + } while (m_headerFile.good()); + + // Changing file location + std::string fullPath = ip_filename->toASCIIString(); + std::string path; + std::string::size_type slashPos = fullPath.rfind('/'); + if (slashPos != std::string::npos) + { + path.assign(fullPath, 0, slashPos + 1); + markerFilename = path + markerFilename; + dataFilename = path + dataFilename; + } + + // Opens data file + m_dataFile.open(dataFilename.c_str(), std::ios::binary); + if (!m_dataFile.good()) { getLogManager() << Kernel::LogLevel_Error << "Could not open file [" << dataFilename << "]\n"; } + else { getLogManager() << Kernel::LogLevel_Trace << "Opening " << dataFilename << " succeeded\n"; } + + // Opens marker file + m_markerFile.open(markerFilename.c_str(), std::ios::binary); + if (!m_markerFile.good()) { getLogManager() << Kernel::LogLevel_Error << "Could not open file [" << markerFilename << "]\n"; } + else + { + getLogManager() << Kernel::LogLevel_Trace << "Opening " << markerFilename << " succeeded\n"; + + status = EStatus::Nothing; + do + { + std::string what; + std::getline(m_markerFile, what, '\n'); + getLogManager() << Kernel::LogLevel_Debug << what << "\n"; + + // optionally removes ending carriage return for windows / linux compatibility + if (what.length() != 0) { if (what[what.length() - 1] == '\r') { what.erase(what.length() - 1, 1); } } + + if (what.length() != 0) + { + std::string::size_type equalPos; + if (what[0] == ';') // comments + { } + else if (what.length() > 2 && what[0] == '[') // section start + { + std::string name; + name.assign(what, 1, what.length() - 2); + if (name == "Common Infos") + { + getLogManager() << Kernel::LogLevel_Trace << "Found section " << what << "\n"; + status = EStatus::CommonInfos; + } + else if (name == "Marker Infos") + { + getLogManager() << Kernel::LogLevel_Trace << "Found section " << what << "\n"; + status = EStatus::MarkerInfos; + } + else + { + getLogManager() << Kernel::LogLevel_Warning << "{" << what << + "} looked like a new section in the marker file but is not know of this parser. Therefore anything after this line will be skipped until a new section is found\n"; + status = EStatus::Nothing; + } + } + else if ((equalPos = what.find('=')) != std::string::npos && status != EStatus::Comment) // Option value + { + std::string name, value; + name.assign(what, 0, equalPos); + value.assign(what, equalPos + 1, what.length() - equalPos - 1); + + getLogManager() << Kernel::LogLevel_Trace << "| Found option " << name << " with value " << value << "\n"; + + switch (status) + { + case EStatus::CommonInfos: + break; + + case EStatus::MarkerInfos: + { + std::stringstream ss(value); + std::string type, desc, pos, duration, idx, date; + + std::getline(ss, type, ','); + std::getline(ss, desc, ','); + std::getline(ss, pos, ','); + std::getline(ss, duration, ','); + std::getline(ss, idx, ','); + std::getline(ss, date, ','); + + getLogManager() << Kernel::LogLevel_Trace << "| -> Found marker " << type << "," << desc << "," << pos << "," << duration << "," + << idx << "," << date << "\n"; + + if (type == "Stimulus" && desc.length() > 0) + { + if (idx != "0") + { + getLogManager() << Kernel::LogLevel_Warning << "Marker [" << type << ":" << desc << + "] is not marked on channel 0 and OpenViBE only supports global scope stimulations. Therefore this marker will be considered as global\n"; + } + + uint64_t id; + if (desc[0] == 'S') { id = atoi(desc.substr(1, std::string::npos).c_str()); } + else { id = atoi(desc.c_str()); } + + if (ip_convertStimuli) + { + getLogManager() << Kernel::LogLevel_Trace << "Pre-conversion stimulation is " << desc << + " at sample index [" << pos << "]\n"; + id = OVTK_StimulationId_Label(id); + } + + stimulation_t stim; + stim.id = id; + stim.startIdx = atoi(pos.c_str()); + stim.duration = atoi(duration.c_str()); + stim.name = desc; + m_stimulations.push_back(stim); + + getLogManager() << Kernel::LogLevel_Trace << "Found stimulation " << stim.id << " at sample index [" << stim.startIdx << ":" + << stim.duration << "]\n"; + } + else + { + getLogManager() << Kernel::LogLevel_Warning << "Marker [" << type << ":" << desc << + "] is not supported. Therefore it will be ignored\n"; + } + } + break; + default: break; + } + } + } + } while (m_markerFile.good()); + } + } + + if (this->isInputTriggerActive(OVP_Algorithm_BrainampFileReader_InputTriggerId_Seek)) + { + getLogManager() << Kernel::LogLevel_ImportantWarning << "This has not been implemented yet\n"; + } + + if (this->isInputTriggerActive(OVP_Algorithm_BrainampFileReader_InputTriggerId_Next)) + { + double* buffer = op_signalMatrix->getBuffer(); + +#define DO_IT_WITH_TYPE(T) \ + { \ + if (!m_buffer) { m_buffer = new uint8_t[op_signalMatrix->getBufferElementCount() * sizeof(T)]; } \ + uint8_t* fileBuffer = m_buffer; \ + T tValue; \ + m_dataFile.read((char*)fileBuffer, op_signalMatrix->getBufferElementCount() * sizeof(T)); \ + if (m_dataFile.eof()) { memset(fileBuffer, 0, op_signalMatrix->getBufferElementCount() * sizeof(T)); } \ + bool (*fiileToHost)(const uint8_t*, T*); \ + if (m_endianness == EEndianness::LittleEndian) { fiileToHost = System::Memory::littleEndianToHost; } \ + else { fiileToHost = System::Memory::bigEndianToHost; } \ + for (uint32_t j = 0; j < m_sampleCountPerBuffer; ++j) \ + { \ + for (uint32_t i = 0; i < m_nChannel; i++, fileBuffer += sizeof(T)) \ + { \ + (*fiileToHost)(fileBuffer, &tValue); \ + buffer[i * m_sampleCountPerBuffer + j] = m_channelScales[i] * tValue; \ + } \ + } \ + } + + if (m_binaryFormat == EBinaryFormat::Integer16) { DO_IT_WITH_TYPE(int16_t); } + if (m_binaryFormat == EBinaryFormat::UnsignedInteger16) { DO_IT_WITH_TYPE(uint16_t); } + if (m_binaryFormat == EBinaryFormat::Float32) { DO_IT_WITH_TYPE(float); } + + m_startSampleIdx = m_endSampleIdx; + m_endSampleIdx += m_sampleCountPerBuffer; + + op_startTime = CTime(op_sampling, m_startSampleIdx).time(); + op_endTime = CTime(op_sampling, m_endSampleIdx).time(); + + // find stimulations in this range + uint64_t nStim = 0; + for (const auto& s : m_stimulations) { if (m_startSampleIdx <= s.startIdx && s.startIdx < m_endSampleIdx) { nStim++; } } + + op_stimulations->setStimulationCount(nStim); + nStim = 0; + for (const auto& s : m_stimulations) + { + if (m_startSampleIdx <= s.startIdx && s.startIdx < m_endSampleIdx) + { + uint64_t date = CTime(op_sampling, s.startIdx).time(); + uint64_t duration = CTime(op_sampling, s.duration).time(); + + op_stimulations->setStimulationIdentifier(nStim, s.id); + op_stimulations->setStimulationDate(nStim, date); + op_stimulations->setStimulationDuration(nStim, duration); + nStim++; + } + } + + this->activateOutputTrigger(OVP_Algorithm_BrainampFileReader_OutputTriggerId_DataProduced, true); + } + + if (this->isInputTriggerActive(OVP_Algorithm_BrainampFileReader_InputTriggerId_Close)) + { + delete [] m_buffer; + m_buffer = nullptr; + + m_markerFile.close(); + m_dataFile.close(); + m_headerFile.close(); + } + + return true; +} +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/algorithms/brainamp/ovpCAlgorithmBrainampFileReader.h b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/algorithms/brainamp/ovpCAlgorithmBrainampFileReader.h new file mode 100644 index 0000000..f871300 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/algorithms/brainamp/ovpCAlgorithmBrainampFileReader.h @@ -0,0 +1,111 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +class CAlgorithmBrainampFileReader final : public Toolkit::TAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_BrainampFileReader) + +protected: + + enum class EStatus { Nothing, CommonInfos, BinrayInfos, ChannelInfos, MarkerInfos, Comment }; + + enum class EBinaryFormat { Integer16, UnsignedInteger16, Float32 }; + + enum class EEndianness { LittleEndian, BigEndian }; + + typedef struct + { + uint64_t id; + uint64_t startIdx; + uint64_t duration; + std::string name; + } stimulation_t; + + Kernel::TParameterHandler ip_filename; + Kernel::TParameterHandler ip_epochDuration; + Kernel::TParameterHandler ip_seekTime; + Kernel::TParameterHandler ip_convertStimuli; + + Kernel::TParameterHandler op_startTime; + Kernel::TParameterHandler op_endTime; + Kernel::TParameterHandler op_sampling; + Kernel::TParameterHandler op_signalMatrix; + Kernel::TParameterHandler op_stimulations; + + CString m_filename; + + EBinaryFormat m_binaryFormat = EBinaryFormat::Integer16; + EEndianness m_endianness = EEndianness::LittleEndian; + uint32_t m_nChannel = 0; + uint64_t m_startSampleIdx = 0; + uint64_t m_endSampleIdx = 0; + uint64_t m_sampleCountPerBuffer = 0; + + uint8_t* m_buffer = nullptr; + std::vector m_channelScales; + std::vector m_stimulations; + + std::ifstream m_headerFile; + std::ifstream m_dataFile; + std::ifstream m_markerFile; +}; + +class CAlgorithmBrainampFileReaderDesc final : public IAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Brainamp file reader"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Reads input having the BrainAmp file format"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("File reading and writing/Brainamp"); } + CString getVersion() const override { return CString("1.1"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_BrainampFileReader; } + IPluginObject* create() override { return new CAlgorithmBrainampFileReader; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_Filename, "Filename", Kernel::ParameterType_String); + prototype.addInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_EpochDuration, "Epoch duration", Kernel::ParameterType_Float); + prototype.addInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_SeekTime, "Seek time", Kernel::ParameterType_Integer); + prototype.addInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_ConvertStimuli, "Convert stimuli", Kernel::ParameterType_Boolean); + prototype.addOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_CurrentStartTime, "Current start time", Kernel::ParameterType_Integer); + prototype.addOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_CurrentEndTime, "Current end time", Kernel::ParameterType_Integer); + prototype.addOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_Sampling, "Sampling rate", Kernel::ParameterType_Integer); + prototype.addOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_SignalMatrix, "Signal samples", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_Stimulations, "Stimulations", Kernel::ParameterType_StimulationSet); + prototype.addInputTrigger(OVP_Algorithm_BrainampFileReader_InputTriggerId_Open, "Open"); + prototype.addInputTrigger(OVP_Algorithm_BrainampFileReader_InputTriggerId_Seek, "Seek"); + prototype.addInputTrigger(OVP_Algorithm_BrainampFileReader_InputTriggerId_Next, "Next"); + prototype.addInputTrigger(OVP_Algorithm_BrainampFileReader_InputTriggerId_Close, "Close"); + prototype.addOutputTrigger(OVP_Algorithm_BrainampFileReader_OutputTriggerId_Error, "Error"); + prototype.addOutputTrigger(OVP_Algorithm_BrainampFileReader_OutputTriggerId_DataProduced, "Data produced"); + + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_BrainampFileReaderDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBCI2000ReaderHelper.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBCI2000ReaderHelper.cpp new file mode 100644 index 0000000..9a9a1b0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBCI2000ReaderHelper.cpp @@ -0,0 +1,256 @@ +#include +#include +#include +#include +#include +#include + +#include "ovpCBCI2000ReaderHelper.h" + +namespace BCI2000 { + +void CBCI2000ReaderHelper::printInfo(std::ostream& os) const +{ + if (m_good) + { + os << "version: " << m_bci2000Version << std::endl; + os << "header length: " << m_headerLength << std::endl; + os << "source channels: " << m_nSrcChannel << std::endl; + os << "state vector length: " << m_stateVectorLength << std::endl; + os << "data format: " << m_dataFormat << std::endl; + os << "samples: " << m_nSamples << std::endl; + os << "samples left: " << m_samplesLeft << std::endl; + os << "sample size: " << m_sampleSize << std::endl; + os << "rate: " << getRate() << std::endl; + } + else { os << "bad file (unreadable or bad header)" << std::endl; } +} + +bool CBCI2000ReaderHelper::parseMeta(OpenViBE::CString& meta) +{ + static const boost::regex RE_META("BCI2000V= ([0-9.]+) HeaderLen= ([0-9]+) SourceCh= ([0-9]+) StateVectorLen(gth)?= ([0-9]+) DataFormat= ([a-z0-9]+)\r?$", + boost::regex::perl | boost::regex::icase); + static const boost::regex RE_OLD_META("HeaderLen= +([0-9]+) SourceCh= +([0-9]+) StatevectorLen= +([0-9]+)\r$", boost::regex::perl | boost::regex::icase); + + boost::smatch match; + + if (regex_match(std::string(meta), match, RE_META)) + { + m_bci2000Version = float(atof(match.str(1).c_str())); + m_headerLength = int(atoi(match.str(2).c_str())); + m_nSrcChannel = int(atoi(match.str(3).c_str())); + // 4 is dropped (could be used for len/length syntax check) + m_stateVectorLength = int(atoi(match.str(5).c_str())); + m_dataFormat = match.str(6).c_str(); + } + else + { + if (regex_match(std::string(meta), match, RE_OLD_META)) + { + m_bci2000Version = 1.0; + m_headerLength = int(atoi(match.str(1).c_str())); + m_nSrcChannel = int(atoi(match.str(2).c_str())); + m_stateVectorLength = int(atoi(match.str(3).c_str())); + m_dataFormat = "int16_t"; + } + else + { + std::cerr << " *** bci2000helper error: cannot parse meta information header" << std::endl; + return false; + } + } + return true; +} + + +bool CBCI2000ReaderHelper::parseHeader(std::istream& is) +{ + static const boost::regex REGEXP_SECTION("\\[ *(.*[^ ]) *\\].*"); + static const boost::regex REGEXP_PARAMETER("([^ ]+ [^ ]+ [^ ]+)= (.*)$"); // (section) (type) (name)= (value) + static const boost::regex REGEXP_FIELD("([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+)$"); // Name Length Value ByteLocation BitLocation + std::string section = "NONAME"; + std::string line; + boost::smatch match; + std::getline(is, line); + while (line.length() > 2) + { + // is it a section name ? + if (regex_match(line, match, REGEXP_SECTION)) { section = match[1]; } + else // not section, parse if interesting + { + if (section == "Parameter Definition") + { + if (regex_match(line, match, REGEXP_PARAMETER)) + { + m_parameters[match[1].str().c_str()] = match[2].str().c_str(); + //std::cout << "parameter added : \n\t\t" << match[1].str() << " \n\t\t" << match[2].str() << "\n"; + } + else + { + // should never happen: malformed file + std::cerr << " *** bci2000helper error: cannot parse Parameters" << std::endl; + return false; + } + } + if (section == "State Vector Definition") + { + if (regex_match(line, match, REGEXP_FIELD)) + { + const int length = atoi(match.str(2).c_str()); + const int value = atoi(match.str(3).c_str()); + const int bytePos = atoi(match.str(4).c_str()); + const int bitPos = atoi(match.str(5).c_str()); + m_bitfield.addField(bytePos, bitPos, length, match.str(1).c_str(), value); + } + else + { + // should never happen: malformed file + std::cerr << " *** bci2000helper error: cannot parse Parameters" << std::endl; + return false; + } + } + } + std::getline(is, line); + } + return true; +} + +float CBCI2000ReaderHelper::getRate() const +{ + // Warning: the SamplingRate field is not clearly defined + // in the BCI2000 doc; it could be an int, or a float; + // it should be in Section Source, but Source:Garbage:Stuff is possible + // in some case, there is a pending "Hz" after the numbers + // Conclusion: we should not fix this until it's clear... + + OpenViBE::CString key = "Source int SamplingRate"; + if (m_parameters.count(key) == 1) + { + std::istringstream is(m_parameters.find(key)->second.toASCIIString()); + float rate; + is >> rate; + return rate; + } + key = "Source:Signal%20Properties:DataIOFilter int SamplingRate"; + if (m_parameters.count(key) == 1) + { + std::istringstream is(m_parameters.find(key)->second.toASCIIString()); + float rate; + is >> rate; + return rate; + } + return -1.0; // not found :-( +} + +OpenViBE::CString CBCI2000ReaderHelper::getChannelName(const size_t index) const +{ + // To be checked on the different version of format. + + const OpenViBE::CString key = "Source:Signal%20Properties:DataIOFilter list ChannelNames"; + if (m_parameters.count(key) == 1) + { + std::istringstream is(static_cast(m_parameters.find(key)->second)); + std::string token; + for (size_t i = 0; i <= index + 1; ++i) //+1 because the channel count is in the parameter on first position (parameter:list) + { + token.clear(); + is >> token; + } + return token.c_str(); + } + + return ("Channel " + std::to_string(index + 1)).c_str(); +} + + +CBCI2000ReaderHelper::CBCI2000ReaderHelper(const char* filename) +{ + m_file.open(filename, std::ios::binary); + if (!m_file.good()) + { + m_good = false; + return; + } + + std::stringbuf buffer; + m_file.get(buffer); + OpenViBE::CString meta = buffer.str().c_str(); + + m_file.seekg(0, std::ios::end); + const int fileSize = int(m_file.tellg()); + m_file.seekg(0, std::ios::beg); + + m_good = parseMeta(meta); + if (!m_good) { return; } + + std::map sizesOfMap; + sizesOfMap["float"] = 4; + sizesOfMap["int"] = 4; + sizesOfMap["int16_t"] = 2; + m_nSamples = (fileSize - m_headerLength) / (sizesOfMap[m_dataFormat] * m_nSrcChannel + m_stateVectorLength); + m_sampleSize = sizesOfMap[m_dataFormat] * m_nSrcChannel + m_stateVectorLength; + m_samplesLeft = m_nSamples; + m_good = parseHeader(m_file); +} + + +std::vector CBCI2000ReaderHelper::readSample() +{ + std::vector samples; + if (m_samplesLeft < 1) + { + return samples; // nothing to read, empty vector returned + } + char* data = new char[m_sampleSize]; + m_file.read(data, m_sampleSize); + float* dataAsFloat = reinterpret_cast(data); + for (int i = 0; i < m_nSrcChannel; ++i) { samples.push_back(dataAsFloat[i]); } + delete[] data; + m_samplesLeft--; + return samples; +} + +template +int CBCI2000ReaderHelper::readSamplesInternal(TTo* samples, uint32_t* states, int n) +{ + if (n > m_samplesLeft) { n = m_samplesLeft; } + if (n < 1) { return 0; } + char* data = new char[m_sampleSize * n]; + m_file.read(data, m_sampleSize * n); + for (int i = 0; i < n; ++i) + { + if (samples != nullptr) + { + for (int j = 0; j < m_nSrcChannel; ++j) + { + TFrom sample = *reinterpret_cast(data + i * m_sampleSize + j * sizeof(TFrom)); + samples[i * m_nSrcChannel + j] = sample; + // check endianess ? + } + } + if (states != nullptr) + { + unsigned char* state = reinterpret_cast(data) + i * m_sampleSize + m_nSrcChannel * sizeof(TFrom); + m_bitfield.getFields(state, states + i * m_bitfield.size()); + } + //std::copy(l_pData+i*m_i32SampleSize,l_pData+i*m_i32SampleSize+m_nSrcChannel*sizeof(T),samples+i*m_nSrcChannel); + } + delete[] data; + m_samplesLeft -= n; + return n; +} + +int CBCI2000ReaderHelper::readSamples(double* samples, uint32_t* states, const int n) +{ + if (m_dataFormat == OpenViBE::CString("float")) { return readSamplesInternal(samples, states, n); } +#if defined(BOOST_LITTLE_ENDIAN) + if (m_dataFormat == OpenViBE::CString("int")) { return readSamplesInternal(samples, states, n); } + if (m_dataFormat == OpenViBE::CString("int16_t")) { return readSamplesInternal(samples, states, n); } +#else + std::cerr << "*** bci2000helper error: read_samples from int16_t or int is not implemented yet on bigendian machines" << std::endl; + exit(EXIT_FAILURE); +#endif + return -1; // should never happen... TODO: error checking +} + +} // namespace BCI2000 diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBCI2000ReaderHelper.h b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBCI2000ReaderHelper.h new file mode 100644 index 0000000..86f7110 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBCI2000ReaderHelper.h @@ -0,0 +1,70 @@ +#pragma once +#include +#include +#include +#include + +#include "ovpCBitfield.h" + +namespace BCI2000 { +/** +* \class CBCI2000ReaderHelper +* \author Olivier Rochel (INRIA) +* \brief BCI2000 file format parser and utilities. Uses the m_oBitfield utility class. +**/ +class CBCI2000ReaderHelper +{ +protected: + std::ifstream m_file; + + float m_bci2000Version = 0; // file version. + int m_headerLength = 0; // header size (inc. meta) + int m_nSrcChannel = 0; // number of channels + int m_stateVectorLength = 0; // size of state field + OpenViBE::CString m_dataFormat; // data format (float, int16_t...) + + std::vector m_channelNames; + + int m_nSamples = 0; + int m_sampleSize = 0; + int m_samplesLeft = 0; + + bool m_good = false; // m_bGood is true if file open, header looks m_bGood (may + // still be truncated or broken in a silly way) + + std::map m_parameters; + // state vector + CBitfield m_bitfield; + // helpers + bool parseMeta(OpenViBE::CString& meta); + bool parseHeader(std::istream& is); + +private: + template + int readSamplesInternal(TTo* samples, uint32_t* states, int n); + +public: + /** + * Constructor from a BCI2000 file. + * \param filename BCI2000 file name. + **/ + explicit CBCI2000ReaderHelper(const char* filename); + ~CBCI2000ReaderHelper() { if (m_file) { m_file.close(); } } + + void printInfo(std::ostream& os) const; + float getRate() const; + OpenViBE::CString getChannelName(size_t index) const; + + std::vector readSample(); + int readSamples(double* samples, uint32_t* states, int n); + + // getters + int getNbSamples() const { return m_nSamples; } + int getSampleSize() const { return m_sampleSize; } + int getChannels() const { return m_nSrcChannel; } + int getSamplesLeft() const { return m_samplesLeft; } + bool isGood() const { return m_good; } + size_t getStateVectorSize() const { return m_bitfield.size(); } + const OpenViBE::CString& getStateName(const int i) const { return m_bitfield.getFieldName(i); } +}; +} // namespace BCI2000 diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBitfield.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBitfield.cpp new file mode 100644 index 0000000..0a28b48 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBitfield.cpp @@ -0,0 +1,41 @@ +#include "ovpCBitfield.h" + +namespace BCI2000 { + +uint32_t* CBitfield::getFields(unsigned char* data) +{ + const size_t nFields = m_fields.size(); + uint32_t* fields = new uint32_t[nFields]; + getFields(data, fields); + return fields; +} + +void CBitfield::getFields(unsigned char* data, uint32_t* fields) +{ + const size_t nFields = m_fields.size(); + for (uint32_t i = 0; i < nFields; ++i) + { + const int space = (m_fields[i].m_Length - 1 + m_fields[i].m_BitPos) / 8 + 1; + unsigned char* p = data + m_fields[i].m_BytePos; + uint32_t field = (*p) >> m_fields[i].m_BitPos; + + for (uint32_t j = 1; j < uint32_t(space); ++j) + { + p++; + field += uint32_t(*p) << (j * 8 - m_fields[i].m_BitPos); + } + + field &= 0xFFFFFFFF >> (32 - m_fields[i].m_Length); + fields[i] = field; + } +} + +bool CBitfield::addField(const int bytePosition, const int bitPosition, const int length, const OpenViBE::CString& name, const int value) +{ + if (length > 32) { return false; } // doc says len is 32 bits max + if (bitPosition > 7) { return false; } + m_fields.push_back(CField(bytePosition, bitPosition, length, name, value)); + return true; +} + +} // namespace BCI2000 diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBitfield.h b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBitfield.h new file mode 100644 index 0000000..d5c0662 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBitfield.h @@ -0,0 +1,43 @@ +#pragma once + +#include + +#include + +namespace BCI2000 { +class CBitfield +{ +protected: + class CField + { + public: + int m_BytePos = 0; // starting byte + int m_BitPos = 0; // starting bit within starting byte + int m_Length = 0; // field length (in bits) + OpenViBE::CString m_Name; + int m_InitialValue = 0; // initial value. Not updated when reading files + CField(const int bytePos, const int bitPos, const int length, const OpenViBE::CString& name, const int initialValue) + : m_BytePos(bytePos), m_BitPos(bitPos), m_Length(length), m_Name(name), m_InitialValue(initialValue) {} + }; + + std::vector m_fields; +public: + // extract values from compressed data; returned array of size this->size() to + // be deleted[] by the user. + uint32_t* getFields(unsigned char* data); + + // extract values from compressed data + // extractedFields must be allocated and of size this->size() + void getFields(unsigned char* data, uint32_t* fields); + + // add a new field. Returns false when invalid paramaters entered, true otherwise. + bool addField(const int bytePosition, const int bitPosition, const int length, const OpenViBE::CString& name, const int value); + + // returns the number of m_fields in the structure + // (not to be confused with the actual memory footprint) + uint32_t size() const { return m_fields.size(); } + + const OpenViBE::CString& getFieldName(const size_t index) const { return m_fields[index].m_Name; } + int getInitialValue(const size_t index) const { return m_fields[index].m_InitialValue; } +}; +} // namespace BCI2000 diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBoxAlgorithmBCI2000Reader.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBoxAlgorithmBCI2000Reader.cpp new file mode 100644 index 0000000..80d91d4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBoxAlgorithmBCI2000Reader.cpp @@ -0,0 +1,155 @@ +#include "ovpCBoxAlgorithmBCI2000Reader.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +bool CBoxAlgorithmBCI2000Reader::initialize() +{ + const CString filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_helper = new BCI2000::CBCI2000ReaderHelper(filename); + if (!m_helper->isGood()) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Could not open file [" << filename << "]\n"; + m_helper = nullptr; + return false; + } + std::stringstream ss; + m_helper->printInfo(ss); + this->getLogManager() << Kernel::LogLevel_Trace << "Metadata from [" << filename << "] :\n" << ss.str() << "\n"; + + m_headerSent = false; + m_nChannel = m_helper->getChannels(); + m_nSamplePerBuffer = size_t(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1))); + m_samplesSent = 0; + + if (m_nSamplePerBuffer == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "SampleCountPerBuffer is 0, this will not work\n"; + return false; + } + + m_buffer.resize(m_nChannel * m_nSamplePerBuffer); + m_states.resize(m_helper->getStateVectorSize() * m_nSamplePerBuffer); + m_rate = size_t(m_helper->getRate()); + if (int(m_rate) == -1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Sampling rate could not be extracted from the file.\n"; + return false; + } + if (m_rate == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Sampling rate of 0 is not supported.\n"; + return false; + } + + m_signalEncoder.initialize(*this, 0); + m_oSignalMatrix = m_signalEncoder.getInputMatrix(); + m_oSignalMatrix->resize(m_nChannel, m_nSamplePerBuffer); + for (size_t i = 0; i < m_nChannel; ++i) { m_oSignalMatrix->setDimensionLabel(0, i, m_helper->getChannelName(i)); } + + m_stateEncoder.initialize(*this, 1); + m_oStateMatrix = m_stateEncoder.getInputMatrix(); + m_oStateMatrix->resize(m_helper->getStateVectorSize(), m_nSamplePerBuffer); + for (size_t i = 0; i < m_helper->getStateVectorSize(); ++i) { m_oStateMatrix->setDimensionLabel(0, i, m_helper->getStateName(i)); } + m_signalEncoder.getInputSamplingRate() = m_rate; + m_stateEncoder.getInputSamplingRate() = m_rate; + for (size_t i = 0; i < m_helper->getStateVectorSize(); ++i) + { + this->getLogManager() << Kernel::LogLevel_Trace << "BCI2000 state var " << i << " is : " << m_helper->getStateName(i) << "\n"; + } + return true; +} + +bool CBoxAlgorithmBCI2000Reader::uninitialize() +{ + delete m_helper; + m_buffer.clear(); + m_states.clear(); + m_signalEncoder.uninitialize(); + m_stateEncoder.uninitialize(); + + return true; +} + +bool CBoxAlgorithmBCI2000Reader::processClock(Kernel::CMessageClock& /*msg*/) +{ + if (m_helper->getSamplesLeft() > 0) + { + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; + } + + return false; +} + +uint64_t CBoxAlgorithmBCI2000Reader::getClockFrequency() +{ + // Intentional parameter swap to get the frequency + return CTime(m_nSamplePerBuffer, m_rate).time(); +} + +void CBoxAlgorithmBCI2000Reader::sendHeader() +{ + m_signalEncoder.encodeHeader(); + m_stateEncoder.encodeHeader(); + m_headerSent = true; + getDynamicBoxContext().markOutputAsReadyToSend(0, 0, 0); + getDynamicBoxContext().markOutputAsReadyToSend(1, 0, 0); +} + +bool CBoxAlgorithmBCI2000Reader::process() +{ + if (!m_headerSent) { sendHeader(); } + + //prepare data + const int nRead = m_helper->readSamples(m_buffer.data(), m_states.data(), m_nSamplePerBuffer); + if (nRead > 0) + { + // padding. TODO: is it necessary ? or even dangerous ? + for (uint32_t i = nRead; i < m_nSamplePerBuffer; ++i) { for (uint32_t j = 0; j < m_nChannel; ++j) { m_buffer[i * m_nChannel + j] = 0.0; } } + // transpose (yeah, I know... ugly) + for (uint32_t i = 0; i < m_nSamplePerBuffer; ++i) + { + for (uint32_t j = 0; j < m_nChannel; ++j) { m_oSignalMatrix->getBuffer()[j * m_nSamplePerBuffer + i] = m_buffer[i * m_nChannel + j]; } + } + m_signalEncoder.encodeBuffer(); + const uint64_t start = CTime(m_rate, m_samplesSent).time(); + const uint64_t end = CTime(m_rate, m_samplesSent + m_nSamplePerBuffer).time(); + m_samplesSent += nRead; + if (m_helper->getSamplesLeft() == 0) { m_signalEncoder.encodeEnd(); } + + getDynamicBoxContext().markOutputAsReadyToSend(0, start, end); + + // padding. TODO: is it necessary ? or even dangerous ? + for (size_t i = nRead; i < m_nSamplePerBuffer; ++i) + { + for (size_t j = 0; j < m_helper->getStateVectorSize(); ++j) { m_states[i * m_helper->getStateVectorSize() + j] = 0; } + } + // transpose (yeah, I know... ugly) + for (size_t i = 0; i < m_nSamplePerBuffer; ++i) + { + for (size_t j = 0; j < m_helper->getStateVectorSize(); ++j) + { + m_oStateMatrix->getBuffer()[j * m_nSamplePerBuffer + i] = m_states[i * m_helper->getStateVectorSize() + j]; + } + } + m_stateEncoder.encodeBuffer(); + + if (m_helper->getSamplesLeft() == 0) { m_signalEncoder.encodeEnd(); } + + getDynamicBoxContext().markOutputAsReadyToSend(1, start, end); + } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "An error occurred while trying to get new samples from file. The file may be corrupted.\n"; + return false; + } + return true; +} +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBoxAlgorithmBCI2000Reader.h b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBoxAlgorithmBCI2000Reader.h new file mode 100644 index 0000000..220ab90 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/bci2000reader/ovpCBoxAlgorithmBCI2000Reader.h @@ -0,0 +1,103 @@ +#pragma once + +#include "ovpCBCI2000ReaderHelper.h" +#include "../../ovp_defines.h" + +#include +#include + +#define OVP_ClassId_BoxAlgorithm_BCI2000Reader OpenViBE::CIdentifier(0xFF78DAF4, 0xC41544B8) +#define OVP_ClassId_BoxAlgorithm_BCI2000ReaderDesc OpenViBE::CIdentifier(0xFF53D107, 0xC31144B8) + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +/** + * \class CBoxAlgorithmBCI2000Reader + * \author Olivier Rochel (INRIA) + * \date Tue Jun 21 11:11:04 2011 + * \brief The class CBoxAlgorithmBCI2000Reader describes the box BCI2000 Reader. + * + */ +class CBoxAlgorithmBCI2000Reader final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processClock(Kernel::CMessageClock& msg) override; + uint64_t getClockFrequency() override; + + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_BCI2000Reader) + +protected: + + bool m_headerSent = false; + + Toolkit::TSignalEncoder m_signalEncoder; + Toolkit::TSignalEncoder m_stateEncoder; + + // These 2 were from the time the matrices were built, not given by the encoders. + // They could be removed, but for now make the code a bit easier to read - that's + // why they're still there. + CMatrix* m_oSignalMatrix = nullptr; + CMatrix* m_oStateMatrix = nullptr; + + size_t m_rate = 0; + size_t m_nChannel = 0; + size_t m_nSamplePerBuffer = 0; + std::vector m_buffer; // temporary buffer as we'll have to transpose data for signal_out + std::vector m_states; // state variables, to be converted too; + uint64_t m_samplesSent = 0; + BCI2000::CBCI2000ReaderHelper* m_helper = nullptr; + // helpers + void sendHeader(); +}; + +/** + * \class CBoxAlgorithmBCI2000ReaderDesc + * \author Olivier Rochel (INRIA) + * \date Tue Jun 21 11:11:04 2011 + * \brief Descriptor of the box BCI2000 Reader. + * + */ +class CBoxAlgorithmBCI2000ReaderDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("BCI2000 File Reader"); } + CString getAuthorName() const override { return CString("Olivier Rochel"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Reads BCI2000 .dat files."); } + + CString getDetailedDescription() const override { return CString("The box reads EEG/States signals from a BCI2000 file (.dat)"); } + + CString getCategory() const override { return CString("File reading and writing/BCI2000"); } + CString getVersion() const override { return CString("1.3"); } + CString getStockItemName() const override { return CString("gtk-open"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_BCI2000Reader; } + IPluginObject* create() override { return new CBoxAlgorithmBCI2000Reader; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addOutput("Signal",OV_TypeId_Signal); + prototype.addOutput("State",OV_TypeId_Signal); + prototype.addSetting("File name",OV_TypeId_Filename, ""); + prototype.addSetting("Samples per buffer",OV_TypeId_Integer, "16"); + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); // meuh non ! + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_BCI2000ReaderDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/brainamp/ovpCBoxAlgorithmBrainampFileReader.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/brainamp/ovpCBoxAlgorithmBrainampFileReader.cpp new file mode 100644 index 0000000..ed5088e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/brainamp/ovpCBoxAlgorithmBrainampFileReader.cpp @@ -0,0 +1,163 @@ +#include "ovpCBoxAlgorithmBrainampFileReader.h" + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +uint64_t CBoxAlgorithmBrainampFileReader::getClockFrequency() +{ + // Brainamp file reader parameters + Kernel::TParameterHandler ip_filename(m_reader->getInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_Filename)); + Kernel::TParameterHandler ip_epochDuration(m_reader->getInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_EpochDuration)); + Kernel::TParameterHandler ip_seekTime(m_reader->getInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_SeekTime)); + Kernel::TParameterHandler op_startTime(m_reader->getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_CurrentStartTime)); + Kernel::TParameterHandler op_endTime(m_reader->getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_CurrentEndTime)); + Kernel::TParameterHandler op_sampling(m_reader->getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_Sampling)); + Kernel::TParameterHandler op_signalMatrix(m_reader->getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_SignalMatrix)); + Kernel::TParameterHandler op_stimulations(m_reader->getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_Stimulations)); + + return uint64_t((1LL << 32) / ip_epochDuration); +} + +bool CBoxAlgorithmBrainampFileReader::initialize() +{ + // Creates algorithms + m_reader = &getAlgorithmManager(). + getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_BrainampFileReader)); + m_experimentInfoEncoder = &getAlgorithmManager().getAlgorithm( + getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_ExperimentInfoEncoder)); + m_signalEncoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + m_stimEncoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationEncoder)); + + m_reader->initialize(); + m_experimentInfoEncoder->initialize(); + m_signalEncoder->initialize(); + m_stimEncoder->initialize(); + + // Brainamp file reader parameters + Kernel::TParameterHandler ip_filename(m_reader->getInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_Filename)); + Kernel::TParameterHandler ip_epochDuration(m_reader->getInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_EpochDuration)); + Kernel::TParameterHandler ip_seekTime(m_reader->getInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_SeekTime)); + Kernel::TParameterHandler ip_convertStimuli(m_reader->getInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_ConvertStimuli)); + Kernel::TParameterHandler op_startTime(m_reader->getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_CurrentStartTime)); + Kernel::TParameterHandler op_endTime(m_reader->getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_CurrentEndTime)); + Kernel::TParameterHandler op_sampling(m_reader->getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_Sampling)); + Kernel::TParameterHandler op_signalMatrix(m_reader->getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_SignalMatrix)); + Kernel::TParameterHandler op_stimulations(m_reader->getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_Stimulations)); + + // Signal stream encoder parameters + Kernel::TParameterHandler ip_sampling(m_signalEncoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)); + Kernel::TParameterHandler ip_signalMatrix(m_signalEncoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Matrix)); + + // Stimulation stream encoder parameters + Kernel::TParameterHandler ip_stimulations( + m_stimEncoder->getInputParameter(OVP_GD_Algorithm_StimulationEncoder_InputParameterId_StimulationSet)); + + // Connect parameters together + ip_sampling.setReferenceTarget(op_sampling); + ip_signalMatrix.setReferenceTarget(op_signalMatrix); + ip_stimulations.setReferenceTarget(op_stimulations); + + // Configures settings according to box + *ip_filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + ip_epochDuration = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + ip_convertStimuli = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + + m_headerSent = false; + + return true; +} + +bool CBoxAlgorithmBrainampFileReader::uninitialize() +{ + m_reader->process(OVP_Algorithm_BrainampFileReader_InputTriggerId_Close); + + m_reader->uninitialize(); + m_stimEncoder->uninitialize(); + m_signalEncoder->uninitialize(); + m_experimentInfoEncoder->uninitialize(); + + getAlgorithmManager().releaseAlgorithm(*m_reader); + getAlgorithmManager().releaseAlgorithm(*m_stimEncoder); + getAlgorithmManager().releaseAlgorithm(*m_signalEncoder); + getAlgorithmManager().releaseAlgorithm(*m_experimentInfoEncoder); + + return true; +} + +bool CBoxAlgorithmBrainampFileReader::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmBrainampFileReader::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + // Brainamp file reader parameters + Kernel::TParameterHandler ip_filename(m_reader->getInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_Filename)); + Kernel::TParameterHandler ip_epochDuration(m_reader->getInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_EpochDuration)); + Kernel::TParameterHandler ip_seekTime(m_reader->getInputParameter(OVP_Algorithm_BrainampFileReader_InputParameterId_SeekTime)); + Kernel::TParameterHandler op_startTime(m_reader->getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_CurrentStartTime)); + Kernel::TParameterHandler op_endTime(m_reader->getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_CurrentEndTime)); + Kernel::TParameterHandler op_sampling(m_reader->getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_Sampling)); + Kernel::TParameterHandler op_signalMatrix(m_reader->getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_SignalMatrix)); + Kernel::TParameterHandler op_stimulations(m_reader->getOutputParameter(OVP_Algorithm_BrainampFileReader_OutputParameterId_Stimulations)); + + // Signal stream encoder parameters + Kernel::TParameterHandler + op_signalBuffer(m_signalEncoder->getOutputParameter(OVP_GD_Algorithm_SignalEncoder_OutputParameterId_EncodedMemoryBuffer)); + + // Stimulation stream encoder parameters + Kernel::TParameterHandler op_stimulationBuffer( + m_stimEncoder->getOutputParameter(OVP_GD_Algorithm_StimulationEncoder_OutputParameterId_EncodedMemoryBuffer)); + + // Experiment information + Kernel::TParameterHandler op_experimentInfoBuffer( + m_experimentInfoEncoder->getOutputParameter(OVP_GD_Algorithm_ExperimentInfoEncoder_OutputParameterId_EncodedMemoryBuffer)); + + // Connects parameters to memory buffer + op_experimentInfoBuffer = boxContext.getOutputChunk(0); + op_signalBuffer = boxContext.getOutputChunk(1); + op_stimulationBuffer = boxContext.getOutputChunk(2); + + if (!m_headerSent) + { + // Opens file + if (!m_reader->process(OVP_Algorithm_BrainampFileReader_InputTriggerId_Open)) { return false; } + + // Produces header + m_experimentInfoEncoder->process(OVP_GD_Algorithm_ExperimentInfoEncoder_InputTriggerId_EncodeHeader); + m_stimEncoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeHeader); + m_signalEncoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeHeader); + + // Sends header + boxContext.markOutputAsReadyToSend(0, 0, 0); + boxContext.markOutputAsReadyToSend(1, 0, 0); + boxContext.markOutputAsReadyToSend(2, 0, 0); + + // Turn flag off + m_headerSent = true; + } + + if (!m_reader->process(OVP_Algorithm_BrainampFileReader_InputTriggerId_Next)) { return false; } + + if (m_reader->isOutputTriggerActive(OVP_Algorithm_BrainampFileReader_OutputTriggerId_DataProduced)) + { + // Produces buffer + m_experimentInfoEncoder->process(OVP_GD_Algorithm_ExperimentInfoEncoder_InputTriggerId_EncodeBuffer); + m_stimEncoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeBuffer); + m_signalEncoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeBuffer); + + // Sends buffer + boxContext.markOutputAsReadyToSend(0, op_startTime, op_endTime); + boxContext.markOutputAsReadyToSend(1, op_startTime, op_endTime); + boxContext.markOutputAsReadyToSend(2, op_startTime, op_endTime); + } + + return true; +} +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/brainamp/ovpCBoxAlgorithmBrainampFileReader.h b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/brainamp/ovpCBoxAlgorithmBrainampFileReader.h new file mode 100644 index 0000000..c3686c9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/brainamp/ovpCBoxAlgorithmBrainampFileReader.h @@ -0,0 +1,71 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +class CBoxAlgorithmBrainampFileReader final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + uint64_t getClockFrequency() override; + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_BrainampFileReader) + +protected: + + Kernel::IAlgorithmProxy* m_reader = nullptr; + Kernel::IAlgorithmProxy* m_experimentInfoEncoder = nullptr; + Kernel::IAlgorithmProxy* m_signalEncoder = nullptr; + Kernel::IAlgorithmProxy* m_stimEncoder = nullptr; + + bool m_headerSent = false; +}; + +class CBoxAlgorithmBrainampFileReaderDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("BrainVision Format file reader"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Reads input having the BrainAmp file format"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("File reading and writing/BrainVision Format"); } + CString getVersion() const override { return CString("1.1"); } + CString getStockItemName() const override { return CString("gtk-open"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_BrainampFileReader; } + IPluginObject* create() override { return new CBoxAlgorithmBrainampFileReader; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + // Adds box outputs + prototype.addOutput("Experiment information", OV_TypeId_ExperimentInfo); + prototype.addOutput("EEG stream", OV_TypeId_Signal); + prototype.addOutput("Stimulations", OV_TypeId_Stimulations); + + // Adds settings + prototype.addSetting("Filename (header)", OV_TypeId_Filename, ""); + prototype.addSetting("Epoch size (in sec)", OV_TypeId_Float, "0.0625"); + prototype.addSetting("Convert stimuli to OpenViBE labels", OV_TypeId_Boolean, "true"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_BrainampFileReaderDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/brainamp/ovpCBoxAlgorithmBrainampFileWriter.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/brainamp/ovpCBoxAlgorithmBrainampFileWriter.cpp new file mode 100644 index 0000000..c83392b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/brainamp/ovpCBoxAlgorithmBrainampFileWriter.cpp @@ -0,0 +1,310 @@ +#include "ovpCBoxAlgorithmBrainampFileWriter.h" +#include + +#include +#include +#include +#include +#include + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS +#include +#define _strcmpi strcasecmp +#endif + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +bool CBoxAlgorithmBrainampFileWriter::initialize() +{ + // Creates algorithms + m_signalDecoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalDecoder)); + m_stimulationDecoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + + m_signalDecoder->initialize(); + m_stimulationDecoder->initialize(); + + // Signal stream encoder parameters + op_sampling.initialize(m_signalDecoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + + + // Connect parameters together + ip_signalBuffer.initialize(m_signalDecoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_InputParameterId_MemoryBufferToDecode)); + ip_stimulationsBuffer.initialize(m_stimulationDecoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + op_matrix.initialize(m_signalDecoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + op_stimSet.initialize(m_stimulationDecoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + + // Configures settings according to box + m_filePath = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_dictionaryFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_transformStimulations = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + m_shouldWriteFullFilenames = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + + // Markers inside the output file are numbered, we need to keep trace of how many of them we have already written + m_markersWritten = 0; + m_wasMarkerHeaderWritten = false; + + // Create header, EEG and marker files + char parentPath[1024]; + + // Add the extension if it wasn't done +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + if((m_filePath.length() < 5) || (strcasecmp(m_filePath.toASCIIString() + m_filePath.length() - 5, ".vhdr") != 0)) +#else + if ((m_filePath.length() < 5) || (_strcmpi(m_filePath.toASCIIString() + m_filePath.length() - 5, ".vhdr") != 0)) +#endif + { + m_filePath = m_filePath + ".vhdr"; + } + if (!FS::Files::getParentPath(m_filePath.toASCIIString(), parentPath)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Cannot access " << m_filePath << "\n"; + return false; + } + + if (!FS::Files::directoryExists(parentPath) && !FS::Files::createParentPath(m_filePath)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Directory [" << parentPath << "] cannot be created\n"; + return false; + } + + // Create header file + char filenameWithoutExtension[1024]; + FS::Files::getFilenameWithoutExtension(m_filePath.toASCIIString(), filenameWithoutExtension); + + FS::Files::openOFStream(m_headerFStream, m_filePath.toASCIIString()); + if (m_headerFStream.fail()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Cannot open " << m_filePath << " : " << strerror(errno) << "\n"; + return false; + } + + // Create EEG file + std::string eegFilePath = std::string(parentPath) + "/" + std::string(filenameWithoutExtension) + ".eeg"; + FS::Files::openOFStream(m_eegFStream, eegFilePath.c_str(), std::ios::out | std::ios::binary); + if (m_eegFStream.fail()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Cannot open " << eegFilePath << " : " << strerror(errno) << "\n"; + return false; + } + + // Create Markers file + std::string markerFilePath = std::string(parentPath) + "/" + std::string(filenameWithoutExtension) + ".vmrk"; + FS::Files::openOFStream(m_markerFStream, markerFilePath.c_str()); + if (m_markerFStream.fail()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Cannot open " << markerFilePath << " : " << strerror(errno) << "\n"; + return false; + } + + // Opens Marker to OpenViBE Stimulation dictionary file + if (m_dictionaryFilename != CString("")) + { + std::ifstream ifs; + FS::Files::openIFStream(ifs, m_dictionaryFilename.toASCIIString()); + if (!ifs.good()) { getLogManager() << Kernel::LogLevel_Error << "Could not open dictionary file [" << m_dictionaryFilename << "]\n"; } + else + { + getLogManager() << Kernel::LogLevel_Trace << "Opening " << m_dictionaryFilename << " succeeded\n"; + + // read the values from the dictionar, they are specified in format + // , , + // Stimulations can be either written as decimal numbers, or as strings + do + { + std::string line; + std::getline(ifs, line, '\n'); + + // optionally removes ending carriage return for windows / linux compatibility + if (line.length() != 0) { if (line[line.length() - 1] == '\r') { line.erase(line.length() - 1, 1); } } + + if (line.length() != 0) + { + if (line[0] == ';') // comments + { } + else + { + std::string type, name, stimulationID; + std::stringstream ss(line); + + std::getline(ss, type, ','); + std::getline(ss, name, ','); + std::getline(ss, stimulationID); + + uint64_t id = this->getTypeManager().getEnumerationEntryValueFromName(OVTK_TypeId_Stimulation, stimulationID.c_str()); + m_stimulationToMarkers[id] = type + "," + name; + } + } + } while (ifs.good()); + } + } + + return true; +} + +bool CBoxAlgorithmBrainampFileWriter::uninitialize() +{ + m_stimulationDecoder->uninitialize(); + m_signalDecoder->uninitialize(); + + this->getAlgorithmManager().releaseAlgorithm(*m_stimulationDecoder); + this->getAlgorithmManager().releaseAlgorithm(*m_signalDecoder); + + if (m_eegFStream.is_open()) { m_eegFStream.close(); } + + if (m_markerFStream.is_open()) { m_markerFStream.close(); } + + return true; +} + +bool CBoxAlgorithmBrainampFileWriter::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmBrainampFileWriter::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + // Signal + for (size_t i = 0; i < boxContext.getInputChunkCount(0); i++) + { + ip_signalBuffer = boxContext.getInputChunk(0, i); + m_signalDecoder->process(); + if (m_signalDecoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedHeader)) + { + // BrainAmp format uses sampling interval (between two samples) in microseconds + const size_t samplingInterval = 1000000 / size_t(op_sampling); + const size_t nChannels = op_matrix->getDimensionSize(0); + + if (m_headerFStream.is_open()) + { + std::string auxFilename = "$b"; + if (m_shouldWriteFullFilenames) + { + char filenameWithoutExtension[1024]; + FS::Files::getFilenameWithoutExtension(m_filePath.toASCIIString(), filenameWithoutExtension); + auxFilename = filenameWithoutExtension; + } + + m_headerFStream << "Brain Vision Data Exchange Header File Version 1.0" << std::endl; + m_headerFStream << "[Common Infos]" << std::endl; + m_headerFStream << "DataFile=" << auxFilename << ".eeg" << std::endl; + m_headerFStream << "MarkerFile=" << auxFilename << ".vmrk" << std::endl; + m_headerFStream << "DataFormat=BINARY" << std::endl; + m_headerFStream << "DataOrientation=MULTIPLEXED" << std::endl; + m_headerFStream << "NumberOfChannels=" << nChannels << std::endl; + m_headerFStream << "SamplingInterval=" << samplingInterval << std::endl; + m_headerFStream << "[Binary Infos]" << std::endl; + m_headerFStream << "BinaryFormat=IEEE_FLOAT_32" << std::endl; // TODO_JL extend this to more formats + m_headerFStream << "[Channel Infos]" << std::endl; + + for (size_t c = 0; c < nChannels; c++) + { + // OpenViBE format does not specify any units + m_headerFStream << "Ch" << (c + 1) << "=" << op_matrix->getDimensionLabel(0, c) << ",,1" << std::endl; + } + m_headerFStream.close(); + } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Cannot open " << m_filePath << "\n"; + return false; + } + } + + if (m_signalDecoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedBuffer)) + { + if (m_eegFStream.good()) + { + for (uint32_t j = 0; j < op_matrix->getDimensionSize(1); ++j) + { + for (uint32_t c = 0; c < op_matrix->getDimensionSize(0); c++) + { + float value = float(op_matrix->getBuffer()[c * op_matrix->getDimensionSize(1) + j]); + m_eegFStream.write(reinterpret_cast(&value), sizeof(float)); + } + } + } + } + + boxContext.markInputAsDeprecated(0, i); + } + + // Stimulations + for (uint32_t i = 0; i < boxContext.getInputChunkCount(1); i++) + { + ip_stimulationsBuffer = boxContext.getInputChunk(1, i); + + m_stimulationDecoder->process(); + + // Handle Header + if (!m_wasMarkerHeaderWritten && m_stimulationDecoder->isOutputTriggerActive( + OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) + { + std::string auxFilename = "$b"; + if (m_shouldWriteFullFilenames) + { + char filenameWithoutExtension[1024]; + FS::Files::getFilenameWithoutExtension(m_filePath.toASCIIString(), filenameWithoutExtension); + auxFilename = filenameWithoutExtension; + } + + m_markerFStream << "Brain Vision Data Exchange Marker File, Version 1.0" << std::endl; + m_markerFStream << "[Common Infos]" << std::endl; + m_markerFStream << "DataFile=" << auxFilename << ".eeg" << std::endl; + m_markerFStream << "[Marker Infos]" << std::endl; + m_wasMarkerHeaderWritten = true; + } + + if (m_stimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + for (uint32_t j = 0; j < op_stimSet->getStimulationCount(); j++) + { + const uint64_t id = op_stimSet->getStimulationIdentifier(j); + const uint64_t date = op_stimSet->getStimulationDate(j); + const uint64_t duration = op_stimSet->getStimulationDuration(j); + + std::string writtenMarker; + bool writeStimulation = false; + + if (m_stimulationToMarkers.count(id)) + { + writtenMarker = m_stimulationToMarkers[id]; + writeStimulation = true; + } + else if (m_transformStimulations) + { + std::string str = this->getTypeManager().getEnumerationEntryNameFromValue(OVTK_TypeId_Stimulation, id).toASCIIString(); + writtenMarker = "Stimulus," + (str.empty() ? std::to_string(id) : str); + writeStimulation = true; + } + + if (writeStimulation && m_markerFStream.good()) + { + m_markersWritten++; + m_markerFStream << "Mk" << m_markersWritten << "=" << writtenMarker << ","; + + // Calclulate the index of the sample to which the marker is attached + const uint64_t sampleIdx = CTime(date).toSampleCount(op_sampling); + m_markerFStream << sampleIdx << ","; + + // Minimal duration of markers inside BrainAmp format seems to be 1 sample + const uint64_t durationInSamples = CTime(duration).toSampleCount(op_sampling) + 1; + m_markerFStream << durationInSamples << ","; + + // 0 means that the stimulation is attached to all channels + m_markerFStream << "0" << std::endl; + } + } + } + + boxContext.markInputAsDeprecated(1, i); + } + return true; +} +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/brainamp/ovpCBoxAlgorithmBrainampFileWriter.h b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/brainamp/ovpCBoxAlgorithmBrainampFileWriter.h new file mode 100644 index 0000000..a01845b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/brainamp/ovpCBoxAlgorithmBrainampFileWriter.h @@ -0,0 +1,92 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +class CBoxAlgorithmBrainampFileWriter final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_BrainampFileWriter) + +protected: + + Kernel::IAlgorithmProxy* m_signalDecoder = nullptr; + Kernel::IAlgorithmProxy* m_stimulationDecoder = nullptr; + + Kernel::TParameterHandler ip_signalBuffer; + Kernel::TParameterHandler ip_stimulationsBuffer; + Kernel::TParameterHandler op_matrix; + Kernel::TParameterHandler op_stimSet; + Kernel::TParameterHandler op_sampling; + + CString m_filePath; + CString m_dictionaryFilename; + bool m_transformStimulations = false; + bool m_shouldWriteFullFilenames = false; + +private: + std::ofstream m_headerFStream; + std::ofstream m_eegFStream; + std::ofstream m_markerFStream; + + std::map m_stimulationToMarkers; + + uint64_t m_markersWritten = 0; + bool m_wasMarkerHeaderWritten = false; +}; + +class CBoxAlgorithmBrainampFileWriterDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("BrainVision Format File Writer"); } + CString getAuthorName() const override { return CString("Jozef Legeny"); } + CString getAuthorCompanyName() const override { return CString("Mensia Technologies"); } + CString getShortDescription() const override { return CString("Writes its input into a BrainVision format file"); } + + CString getDetailedDescription() const override { return CString("This box allows to write the input signal under BrainVision file format."); } + + CString getCategory() const override { return CString("File reading and writing/BrainVision Format"); } + CString getVersion() const override { return CString("1.1"); } + CString getStockItemName() const override { return CString("gtk-save"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_BrainampFileWriter; } + IPluginObject* create() override { return new CBoxAlgorithmBrainampFileWriter; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + // Adds box outputs + prototype.addInput("EEG stream", OV_TypeId_Signal); + prototype.addInput("Stimulations", OV_TypeId_Stimulations); + + // Adds settings + prototype.addSetting("Filename (header in vhdr format)", OV_TypeId_Filename, "record-[$core{date}-$core{time}].vhdr"); + prototype.addSetting("Marker to OV Stimulation dictionary", OV_TypeId_Filename, ""); + prototype.addSetting("Convert OpenViBE Stimulations to markers", OV_TypeId_Boolean, "true"); + prototype.addSetting("Use full data and marker file names in header", OV_TypeId_Boolean, "false"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_BrainampFileWriterDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCBCICompetitionIIIbReader.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCBCICompetitionIIIbReader.cpp new file mode 100644 index 0000000..0befdb7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCBCICompetitionIIIbReader.cpp @@ -0,0 +1,336 @@ +#include "ovpCBCICompetitionIIIbReader.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +#define BCICompetitionIIIbReader_UndefinedClass 0xFFFFFFFFFFLL + +bool CBCICompetitionIIIbReader::initialize() +{ + m_signalEncoder.initialize(*this, 0); + m_stimEncoder.initialize(*this, 1); + + // Parses box settings to find filename + const CString file = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + //opens the file + if (file) { m_file.open(file); } + if (!m_file.good()) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Could not open file [" << file << "]\n"; + return false; + } + + m_file.seekg(0, std::ios::end); + m_fileSize = size_t(m_file.tellg()); + m_file.seekg(0, std::ios::beg); + + m_trialLength = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 10); + m_cueDisplayStart = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 11); + m_feedbackStart = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 12); + + readTriggers(); + readLabels(); + readArtifacts(); + readTrueLabels(); + + // Gets the size of output buffers + m_samplesPerBuffer = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5); + + //Offline/Online + const bool offline = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 6); + if (!offline) + { + //computes clock frequency + if (m_samplesPerBuffer <= m_sampling) + { + if (m_sampling % m_samplesPerBuffer != 0) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Warning << + "The sampling rate isn't a multiple of the buffer size\n" << + "Please consider adjusting the BCI Competition IIIb reader settings to correct this!\n"; + } + + if (m_samplesPerBuffer == 0) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error << + "SamplesPerBuffer is 0, this will not work\n"; + return false; + } + + // Intentional parameter swap to get the frequency + m_clockFrequency = CTime(m_samplesPerBuffer, m_sampling).time(); + } + } + + //Test/Training + m_keepTrainingSamples = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 7); + m_keepTestSamples = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 8); + m_keepArtifactSamples = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 9); + + writeSignalInformation(); + + m_signalEncoder.encodeHeader(); + m_stimEncoder.encodeHeader(); + + getBoxAlgorithmContext()->getDynamicBoxContext()->markOutputAsReadyToSend(0, 0, 0); + getBoxAlgorithmContext()->getDynamicBoxContext()->markOutputAsReadyToSend(1, 0, 0); + + m_buffer = m_signalEncoder.getInputMatrix(); + + return true; +} + +bool CBCICompetitionIIIbReader::uninitialize() +{ + m_stimEncoder.uninitialize(); + m_signalEncoder.uninitialize(); + if (m_file) { m_file.close(); } + return true; +} + +bool CBCICompetitionIIIbReader::processClock(Kernel::CMessageClock& /*msg*/) +{ + if (!m_endOfFile) { getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); } + return true; +} + +bool CBCICompetitionIIIbReader::process() +{ + if (m_errorOccurred) { return false; } + + Kernel::IBoxIO* boxIO = getBoxAlgorithmContext()->getDynamicBoxContext(); + + //reading signal + //reset vector + double* buffer = m_buffer->getBuffer(); + for (uint32_t i = 0; i < m_buffer->getBufferElementCount(); ++i) { buffer[i] = 0; } + + std::istringstream ss; + std::string line; + double sample; + + uint32_t count = 0; + for (; count < m_samplesPerBuffer && !m_endOfFile; ++count) + { + if (!getline(m_file, line)) { m_endOfFile = true; } + + ss.clear(); + ss.str(line); + + ss >> sample; + if (std::isnan(sample)) { buffer[count] = (count != 0) ? buffer[count - 1] : 0.0; } + else { buffer[count] = sample; } + + ss >> sample; + if (std::isnan(sample)) { buffer[count + m_samplesPerBuffer] = (count != 0) ? buffer[count + m_samplesPerBuffer - 1] : 0.0; } + else { buffer[count + m_samplesPerBuffer] = sample; } + } + + m_nSentSample += count; + + //A signal matrix is ready to be output + m_signalEncoder.encodeBuffer(); + + const uint64_t start = CTime(m_sampling, uint64_t(m_nSentSample - count)).time(); + const uint64_t end = CTime(m_sampling, uint64_t(m_nSentSample)).time(); + + boxIO->markOutputAsReadyToSend(0, start, end); + ////// + + //Stimulations + std::vector> events; + bool changed = true; + + while (changed) + { + changed = false; + + const bool keepCurrentTrial = + ((m_artifacts[m_currentTrial] && m_keepArtifactSamples) || !m_artifacts[m_currentTrial]) && + ((m_classLabels[m_currentTrial] == BCICompetitionIIIbReader_UndefinedClass && m_keepTestSamples) || + (m_classLabels[m_currentTrial] != BCICompetitionIIIbReader_UndefinedClass && m_keepTrainingSamples)); + + if (m_triggerTimes[m_currentTrial] > (m_nSentSample - count) && + m_triggerTimes[m_currentTrial] <= m_nSentSample + ) + { + if (keepCurrentTrial) + { + //start of trial + events.push_back(std::pair(0x300, m_triggerTimes[m_currentTrial])); + //display cross + events.push_back(std::pair(0x312, m_triggerTimes[m_currentTrial])); + } + } + + //send CUE stimulation + if (m_cueDisplayStarts[m_currentTrial] > (m_nSentSample - count) && + m_cueDisplayStarts[m_currentTrial] <= m_nSentSample + ) + { + if (keepCurrentTrial) + { + if (m_classLabels[m_currentTrial] != BCICompetitionIIIbReader_UndefinedClass) + { + //send class label + events.push_back(std::pair(0x300 + m_classLabels[m_currentTrial], m_cueDisplayStarts[m_currentTrial])); + } + else + { + //send true label + events.push_back(std::pair(0x300 + m_trueLabels[m_currentTrial], m_cueDisplayStarts[m_currentTrial])); + } + } + } + + //send feedback start stimulation + if (m_feedbackStarts[m_currentTrial] > (m_nSentSample - count) && m_feedbackStarts[m_currentTrial] <= m_nSentSample) + { + if (keepCurrentTrial) { events.push_back(std::pair(0x30D, m_feedbackStarts[m_currentTrial])); } + } + + //send end of trial stimulation + if (m_endOfTrials[m_currentTrial] > (m_nSentSample - count) && m_endOfTrials[m_currentTrial] <= m_nSentSample + ) + { + if (keepCurrentTrial) { events.push_back(std::pair(0x320, m_endOfTrials[m_currentTrial])); } + m_currentTrial++; + changed = true; + } + } + + if (!events.empty() || m_endOfFile) + { + IStimulationSet* stimSet = m_stimEncoder.getInputStimulationSet(); + + stimSet->setStimulationCount(events.size() + ((m_endOfFile) ? 1 : 0)); + + + for (size_t j = 0; j < events.size(); ++j) + { + //compute date + const uint64_t date = CTime(m_sampling, events[j].second).time(); + stimSet->insertStimulation(j, events[j].first, date, 0); + } + + //add the ending stim + if (m_endOfFile) + { + //compute date + const uint64_t date = CTime(m_sampling, m_nSentSample).time(); + stimSet->insertStimulation(events.size(), 0x3FF, date, 0); + } + + m_stimEncoder.encodeBuffer(); + + boxIO->markOutputAsReadyToSend(1, start, end); + } + + return true; +} + +void CBCICompetitionIIIbReader::writeSignalInformation() +{ + m_signalEncoder.getInputSamplingRate() = 125; + m_signalEncoder.getInputMatrix()->resize(2, m_samplesPerBuffer); + m_signalEncoder.getInputMatrix()->setDimensionLabel(0, 0, "+C3a-C3p"); + m_signalEncoder.getInputMatrix()->setDimensionLabel(0, 1, "+C4a-C4p"); +} + + +void CBCICompetitionIIIbReader::readTriggers() +{ + const CString str = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + std::ifstream file; + if (str) { file.open(str); } + + std::string line; + std::istringstream ss; + uint64_t value; + while (getline(file, line)) + { + ss.clear(); + ss.str(line); + ss >> value; + + m_triggerTimes.push_back(value); + m_cueDisplayStarts.push_back(value + uint64_t(floor(m_sampling * m_cueDisplayStart))); + m_feedbackStarts.push_back(value + uint64_t(floor(m_sampling * m_feedbackStart))); + m_endOfTrials.push_back(value + uint64_t(floor(m_sampling * m_trialLength))); + } + file.close(); +} + +void CBCICompetitionIIIbReader::readLabels() +{ + const CString str = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + + std::ifstream file; + if (str) { file.open(str); } + + std::string line; + std::istringstream ss; + uint64_t value; + while (getline(file, line)) + { + if (line.compare(0, 3, "NaN", 0, 3) == 0) { m_classLabels.push_back(BCICompetitionIIIbReader_UndefinedClass); } + else + { + ss.clear(); + ss.str(line); + ss >> value; + m_classLabels.push_back(value); + } + } + file.close(); +} + +void CBCICompetitionIIIbReader::readArtifacts() +{ + const CString str = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + + std::ifstream file; + if (str) { file.open(str); } + + std::string line; + std::istringstream ss; + uint64_t value; + while (getline(file, line)) + { + ss.clear(); + ss.str(line); + ss >> value; + m_artifacts.push_back(value == 1); + } + file.close(); +} + +void CBCICompetitionIIIbReader::readTrueLabels() +{ + const CString str = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + + std::ifstream file; + if (str) { file.open(str); } + + std::string line; + std::istringstream ss; + uint64_t value; + while (getline(file, line)) + { + ss.clear(); + ss.str(line); + ss >> value; + m_trueLabels.push_back(value); + } + file.close(); +} + +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCBCICompetitionIIIbReader.h b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCBCICompetitionIIIbReader.h new file mode 100644 index 0000000..ef3c8b8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCBCICompetitionIIIbReader.h @@ -0,0 +1,127 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +class CBCICompetitionIIIbReader final : public Toolkit::TBoxAlgorithm +{ +public: + + CBCICompetitionIIIbReader() { } //TODO + + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool process() override; + bool processClock(Kernel::CMessageClock& msg) override; + + uint64_t getClockFrequency() override { return m_clockFrequency; } + + _IsDerivedFromClass_Final_(IBoxAlgorithm, OVP_ClassId_BCICompetitionIIIbReader) + +protected: + void writeSignalInformation(); + void readTriggers(); + void readLabels(); + void readArtifacts(); + void readTrueLabels(); + + bool m_errorOccurred = false; //true if an error has occurred while reading the GDF file + + //The filename and handle + std::ifstream m_file; + size_t m_fileSize = 0; + + Toolkit::TSignalEncoder m_signalEncoder; + Toolkit::TStimulationEncoder m_stimEncoder; + + uint64_t m_clockFrequency = 100LL << 32; + + std::vector m_triggerTimes; + std::vector m_endOfTrials; + std::vector m_cueDisplayStarts; + std::vector m_feedbackStarts; + std::vector m_classLabels; + std::vector m_artifacts; + std::vector m_trueLabels; + + size_t m_samplesPerBuffer = 0; + size_t m_sampling = 125; + size_t m_nSentSample = 0; + + CMatrix* m_buffer = nullptr; + bool m_endOfFile = false; + + size_t m_currentTrial = 0; + + bool m_keepTrainingSamples = false; + bool m_keepTestSamples = false; + bool m_keepArtifactSamples = false; + + double m_trialLength = 0; + double m_cueDisplayStart = 0; + double m_feedbackStart = 0; +}; + + +class CBCICompetitionIIIbReaderDesc final : public IBoxAlgorithmDesc +{ +public: + CString getName() const override { return CString("BCI competition IIIb reader"); } + CString getAuthorName() const override { return CString("Bruno Renier"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Reads ASCII version of BCI competition IIIb datasets."); } + + CString getDetailedDescription() const override + { + return CString("Reads signal samples, stimulations and class labels from the BCI competition IIIb ASCII datasets."); + } + + CString getCategory() const override { return CString("File reading and writing/BCI Competition"); } + CString getVersion() const override { return CString("0.7"); } + CString getStockItemName() const override { return CString("gtk-open"); } + + void release() override { } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BCICompetitionIIIbReader; } + IPluginObject* create() override { return new CBCICompetitionIIIbReader(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + // Adds box outputs + prototype.addOutput("Signal", OV_TypeId_Signal); + prototype.addOutput("Stimulations", OV_TypeId_Stimulations); + + // Adds settings + prototype.addSetting("Signal file", OV_TypeId_Filename, ""); + prototype.addSetting("Triggers file", OV_TypeId_Filename, ""); + prototype.addSetting("Labels file", OV_TypeId_Filename, ""); + prototype.addSetting("Artifact file", OV_TypeId_Filename, ""); + prototype.addSetting("True labels file", OV_TypeId_Filename, ""); + + prototype.addSetting("Samples per buffer", OV_TypeId_Integer, "32"); + + prototype.addSetting("Offline", OV_TypeId_Boolean, "false"); + prototype.addSetting("Train?", OV_TypeId_Boolean, "true"); + prototype.addSetting("Test?", OV_TypeId_Boolean, "false"); + prototype.addSetting("Keep artifacts?", OV_TypeId_Boolean, "false"); + + prototype.addSetting("Trial length", OV_TypeId_Float, "8.0"); + prototype.addSetting("CUE display Start", OV_TypeId_Float, "3.0"); + prototype.addSetting("Feedback start", OV_TypeId_Float, "4.0"); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BCICompetitionIIIbReaderDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmSignalConcatenation.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmSignalConcatenation.cpp new file mode 100755 index 0000000..5f60f0b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmSignalConcatenation.cpp @@ -0,0 +1,525 @@ +#include "ovpCBoxAlgorithmSignalConcatenation.h" + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + + +bool CBoxAlgorithmSignalConcatenation::initialize() +{ + m_signalChunkBuffers.resize(this->getStaticBoxContext().getInputCount() >> 1); + m_stimulationChunkBuffers.resize(this->getStaticBoxContext().getInputCount() >> 1); + + m_timeOut = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_timeOut = m_timeOut << 32; + this->getLogManager() << Kernel::LogLevel_Info << "Timeout set to " << CTime(m_timeOut) << ".\n"; + for (uint32_t i = 0; i < this->getStaticBoxContext().getInputCount(); i += 2) + { + m_eofStimulations.push_back(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), (i >> 2) + 1)); + m_eofReached.push_back(false); + m_fileEndTimes.push_back(0); + } + + for (uint32_t i = 0; i < this->getStaticBoxContext().getInputCount(); i += 2) + { + auto* signalDecoder = new Toolkit::TSignalDecoder(*this, i); + auto* stimDecoder = new Toolkit::TStimulationDecoder(*this, i + 1); + + m_signalDecoders.push_back(signalDecoder); + m_stimulationDecoders.push_back(stimDecoder); + auto* stimSet = new CStimulationSet(); + m_stimulationSets.push_back(stimSet); + } + + m_stimulationEncoder.initialize(*this, 1); + m_stimulationEncoder.getInputStimulationSet().setReferenceTarget(m_stimulationDecoders[0]->getOutputStimulationSet()); + + m_signalEncoder.initialize(*this, 0); + + m_triggerEncoder.initialize(*this, 2); + m_triggerEncoder.getInputStimulationSet().setReferenceTarget(m_stimulationDecoders[0]->getOutputStimulationSet()); + + m_headerReceivedCount = 0; + m_endReceivedCount = 0; + + m_headerSent = false; + m_endSent = false; + m_stimHeaderSent = false; + m_finished = false; + m_resynchroDone = false; + m_statsPrinted = false; + + m_state.m_CurrentFileIdx = 0; + m_state.m_CurrentChunkIdx = 0; + m_state.m_CurrentStimulationIdx = 0; + + m_triggerDate = 0; + m_lastChunkStartTime = 0; + m_lastChunkEndTime = 0; + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmSignalConcatenation::uninitialize() +{ + m_stimulationEncoder.uninitialize(); + m_signalEncoder.uninitialize(); + m_triggerEncoder.uninitialize(); + + for (uint32_t i = 0; i < m_signalDecoders.size(); ++i) + { + m_signalDecoders[i]->uninitialize(); + m_stimulationDecoders[i]->uninitialize(); + delete m_signalDecoders[i]; + delete m_stimulationDecoders[i]; + } + + for (auto& signalChunkBuffer : m_signalChunkBuffers) { for (auto& signalChunk : signalChunkBuffer) { delete signalChunk.m_Buffer; } } + + for (auto& stimulationChunkBuffer : m_stimulationChunkBuffers) + { + for (auto& stimulationChunk : stimulationChunkBuffer) { delete stimulationChunk.m_StimulationSet; } + } + + for (auto& stimulationSet : m_stimulationSets) { delete stimulationSet; } + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmSignalConcatenation::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmSignalConcatenation::processClock(Kernel::CMessageClock& /*msg*/) +{ + if (!m_headerSent || m_finished) { return true; } + + const uint64_t currentTime = this->getPlayerContext().getCurrentTime(); + + for (uint32_t i = 0; i < m_fileEndTimes.size(); ++i) + { + if (!m_eofReached[i] && currentTime > m_fileEndTimes[i] + m_timeOut) + { + m_eofReached[i] = true; + this->getLogManager() << Kernel::LogLevel_Info << "File #" << i + 1 << "/" << (this->getStaticBoxContext().getInputCount() / 2) << + " has timed out (effective end time: " << CTime(m_fileEndTimes[i]) << ").\n"; + } + } + + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmSignalConcatenation::process() +{ + const Kernel::IBox& staticBoxContext = this->getStaticBoxContext(); + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + + //SIGNAL INPUTS + for (uint32_t i = 0; i < staticBoxContext.getInputCount(); i += 2) + { + const uint32_t idx = i >> 1; + + for (uint32_t j = 0; j < boxCtx.getInputChunkCount(i); ++j) + { + m_signalDecoders[idx]->decode(j, true); + + if (m_signalDecoders[idx]->isHeaderReceived()) + { + // Not received all headers we expect? Decode and test ... + if (m_headerReceivedCount < staticBoxContext.getInputCount() / 2) + { + const uint64_t samplingFrequency = m_signalDecoders[idx]->getOutputSamplingRate(); + const uint32_t nChannel = m_signalDecoders[idx]->getOutputMatrix()->getDimensionSize(0); + const uint32_t sampleCountPerBuffer = m_signalDecoders[idx]->getOutputMatrix()->getDimensionSize(1); + + // Note that the stream may be decoded in any order, hence e.g. stream 2 header may be received before stream 1 ... + if (m_headerReceivedCount == 0) + { + this->getLogManager() << Kernel::LogLevel_Info << "Common sampling rate is " << samplingFrequency << ", channel count is " << nChannel + << " and sample count per buffer is " << sampleCountPerBuffer << ".\n"; + + // Set the encoder to follow the parameters of this first received input + m_signalEncoder.getInputSamplingRate().setReferenceTarget(m_signalDecoders[idx]->getOutputSamplingRate()); + m_signalEncoder.getInputMatrix().setReferenceTarget(m_signalDecoders[idx]->getOutputMatrix()); + + m_signalEncoder.encodeHeader(); + boxCtx.markOutputAsReadyToSend(0, boxCtx.getInputChunkStartTime(i, j), boxCtx.getInputChunkEndTime(i, j)); + m_headerSent = true; + } + else + { + if (m_signalEncoder.getInputSamplingRate() != samplingFrequency) + { + this->getLogManager() << Kernel::LogLevel_Error << "File #" + << idx + 1 << "/" << (staticBoxContext.getInputCount() / 2) + << " has a different sampling rate (" << samplingFrequency + << "Hz) than other file(s) (" << m_signalEncoder.getInputSamplingRate() << "Hz).\n"; + return false; + } + if (m_signalEncoder.getInputMatrix()->getDimensionSize(0) != nChannel) + { + this->getLogManager() << Kernel::LogLevel_Error << "File #" + << idx + 1 << "/" << (staticBoxContext.getInputCount() / 2) + << " has a different channel count (" << nChannel + << ") than other file(s) (" << m_signalEncoder.getInputMatrix()->getDimensionSize(0) << ").\n"; + return false; + } + if (m_signalEncoder.getInputMatrix()->getDimensionSize(1) != sampleCountPerBuffer) + { + this->getLogManager() << Kernel::LogLevel_Error << "File #" + << idx + 1 << "/" << (staticBoxContext.getInputCount() / 2) + << " has a different sample count per buffer (" << sampleCountPerBuffer + << ") than other file(s) (" << m_signalEncoder.getInputMatrix()->getDimensionSize(1) << ").\n"; + return false; + } + } + + m_headerReceivedCount++; + } + } + + if (m_signalDecoders[idx]->isBufferReceived() && !m_eofReached[idx]) + { + IMemoryBuffer* buffer = new CMemoryBuffer(); + buffer->setSize(boxCtx.getInputChunk(i, j)->getSize(), true); + memcpy(buffer->getDirectPointer(), boxCtx.getInputChunk(i, j)->getDirectPointer(), buffer->getSize()); + SChunk val; + val.m_Buffer = buffer; + val.m_StartTime = boxCtx.getInputChunkStartTime(i, j); + val.m_EndTime = boxCtx.getInputChunkEndTime(i, j); + m_signalChunkBuffers[idx].push_back(val); + + if (boxCtx.getInputChunkEndTime(i, j) < m_fileEndTimes[idx]) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Oops, added extra chunk " << CTime(boxCtx.getInputChunkStartTime(i, j)) + << " to " << CTime(boxCtx.getInputChunkEndTime(i, j)) << "\n"; + } + + m_fileEndTimes[idx] = boxCtx.getInputChunkEndTime(i, j); + } + + if (m_signalDecoders[idx]->isEndReceived()) + { + // we assume the signal chunks must be continuous, so the end time is the end of the last buffer, don't set here + //just discard it (automatic by decoder) + } + } + } + + //STIMULATION INPUTS + for (uint32_t i = 1; i < staticBoxContext.getInputCount(); i += 2) + { + const uint32_t idx = i >> 1; + + for (uint32_t j = 0; j < boxCtx.getInputChunkCount(i); ++j) + { + m_stimulationDecoders[idx]->decode(j, true); + if (m_stimulationDecoders[idx]->isHeaderReceived() && !m_stimHeaderSent) + { + m_stimulationEncoder.encodeHeader(); + boxCtx.markOutputAsReadyToSend(1, boxCtx.getInputChunkStartTime(i, j), boxCtx.getInputChunkEndTime(i, j)); + m_triggerEncoder.encodeHeader(); + boxCtx.markOutputAsReadyToSend(2, boxCtx.getInputChunkStartTime(i, j), boxCtx.getInputChunkEndTime(i, j)); + m_stimHeaderSent = true; + } + if (m_stimulationDecoders[idx]->isBufferReceived() && !m_eofReached[idx]) + { + const IStimulationSet* stimSet = m_stimulationDecoders[idx]->getOutputStimulationSet(); + + SStimulationChunk val; + val.m_StartTime = boxCtx.getInputChunkStartTime(i, j); + val.m_EndTime = boxCtx.getInputChunkEndTime(i, j); + + if (stimSet->getStimulationCount() > 0) { val.m_StimulationSet = new CStimulationSet(); } + else { val.m_StimulationSet = nullptr; } + + m_stimulationChunkBuffers[idx]. + push_back(val); // we store even if empty to be able to retain the chunking structure of the stimulation input stream + + for (size_t stim = 0; stim < stimSet->getStimulationCount(); ++stim) + { + val.m_StimulationSet->appendStimulation(stimSet->getStimulationIdentifier(stim), stimSet->getStimulationDate(stim), + stimSet->getStimulationDuration(stim)); + + this->getLogManager() << Kernel::LogLevel_Trace << "Input " << i << ": Discovered stim " << stimSet->getStimulationIdentifier(stim) + << " at date [" << CTime(stimSet->getStimulationDate(stim)) << "] in chunk [" << CTime(val.m_StartTime) + << ", " << CTime(val.m_EndTime) << "]\n"; + + if (stimSet->getStimulationIdentifier(stim) == m_eofStimulations[idx]) + { + m_eofReached[idx] = true; + m_fileEndTimes[idx] = val.m_EndTime; + this->getLogManager() << Kernel::LogLevel_Info << "File #" << idx + 1 << "/" << (staticBoxContext.getInputCount() / 2) << + " is finished (end time: " << CTime(m_fileEndTimes[idx]) << "). Later signal chunks will be discarded.\n"; + + break; + } + } + } + if (m_stimulationDecoders[idx]->isEndReceived() && !m_endSent) { m_endReceivedCount++; } + if (m_endReceivedCount == staticBoxContext.getInputCount() / 2 - 1) { m_endSent = true; } + } + } + + bool shouldConcatenate = true; + for (auto&& eof : m_eofReached) { shouldConcatenate &= eof; } + + if (shouldConcatenate && !m_statsPrinted) + { + for (uint32_t i = 0; i < m_stimulationChunkBuffers.size(); ++i) + { + if (!m_signalChunkBuffers[i].empty()) + { + this->getLogManager() << Kernel::LogLevel_Trace << "File " << i + << " has 1st signal chunk at " << CTime(m_signalChunkBuffers[i][0].m_StartTime) + << " last at [" << CTime(m_signalChunkBuffers[i].back().m_EndTime) + << ", " << CTime(m_signalChunkBuffers[i].back().m_EndTime) << "].\n"; + } + if (!m_stimulationChunkBuffers[i].empty()) + { + this->getLogManager() << Kernel::LogLevel_Trace << "File " << i + << " has 1st stim chunk at " << CTime(m_stimulationChunkBuffers[i][0].m_StartTime) + << " last at [" << CTime(m_stimulationChunkBuffers[i].back().m_EndTime) + << ", " << CTime(m_stimulationChunkBuffers[i].back().m_EndTime) + << "].\n"; + } + this->getLogManager() << Kernel::LogLevel_Trace << "File " << i << " EOF is at " << CTime(m_fileEndTimes[i]) << "\n"; + } + m_statsPrinted = true; + } + + if (shouldConcatenate && !m_finished) + { + if (!this->concate()) { return true; } + m_stimulationEncoder.encodeEnd(); + boxCtx.markOutputAsReadyToSend(1, m_lastChunkEndTime, m_lastChunkEndTime); + m_triggerEncoder.encodeEnd(); + boxCtx.markOutputAsReadyToSend(2, m_lastChunkEndTime, m_lastChunkEndTime); + m_signalEncoder.encodeEnd(); + boxCtx.markOutputAsReadyToSend(0, m_lastChunkEndTime, m_lastChunkEndTime); + + m_triggerEncoder.getInputStimulationSet()->appendStimulation(OVTK_StimulationId_EndOfFile, this->getPlayerContext().getCurrentTime(), 0); + m_triggerEncoder.encodeBuffer(); + boxCtx.markOutputAsReadyToSend(2, this->getPlayerContext().getCurrentTime(), this->getPlayerContext().getCurrentTime()); + m_finished = true; + } + + return true; +} + + +bool CBoxAlgorithmSignalConcatenation::concate() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + if (!m_resynchroDone) + { + this->getLogManager() << Kernel::LogLevel_Info << "Concatenation in progress...\n"; + this->getLogManager() << Kernel::LogLevel_Trace << "Resynchronizing Chunks ...\n"; + + // note: m_stimulationSets and m_signalChunkBuffers should have the same size (== number of files) + + uint64_t offset = m_fileEndTimes[0]; + + for (uint32_t i = 1; i < m_stimulationChunkBuffers.size(); ++i) + { + for (auto& stimulationChunkBuffer : m_stimulationChunkBuffers[i]) + { + IStimulationSet* stimSet = stimulationChunkBuffer.m_StimulationSet; + if (stimSet) + { + for (size_t k = 0; k < stimSet->getStimulationCount(); ++k) + { + const uint64_t synchronizedDate = stimSet->getStimulationDate(k) + offset; + stimSet->setStimulationDate(k, synchronizedDate); + //this->getLogManager() << Kernel::LogLevel_Info << "Resynchronizing stim ["<getLogManager() << Kernel::LogLevel_Trace << "Resynchronization finished.\n"; + m_resynchroDone = true; + } + + // When we get here, resynchro has been done + + // note that the iterators are references on purpose... + + for (uint32_t& i = m_state.m_CurrentFileIdx; i < m_signalChunkBuffers.size(); ++i) + { + const std::vector& chunkVector = m_signalChunkBuffers[i]; + const std::vector& stimulusChunkVector = m_stimulationChunkBuffers[i]; + + // Send a signal chunk + uint32_t& chunk = m_state.m_CurrentChunkIdx; + if (chunk < chunkVector.size()) + { + // we write the signal memory buffer + const IMemoryBuffer* iBuffer = chunkVector[chunk].m_Buffer; + IMemoryBuffer* oBuffer = boxContext.getOutputChunk(0); + oBuffer->setSize(iBuffer->getSize(), true); + memcpy(oBuffer->getDirectPointer(), iBuffer->getDirectPointer(), iBuffer->getSize()); + boxContext.markOutputAsReadyToSend(0, chunkVector[chunk].m_StartTime, chunkVector[chunk].m_EndTime); + + /* + if(CTime(chunkVector[chunk].m_StartTime).toSeconds()>236) + + { + this->getLogManager() << Kernel::LogLevel_Info << "Adding signalchunk " << i << "," << chunk << " [" + << CTime(chunkVector[chunk].m_StartTime) << ", " << CTime(chunkVector[chunk].m_EndTime) << "\n"; + } + */ + + const uint64_t signalChunkEnd = chunkVector[chunk].m_EndTime; + + // Write stimulations up to this point + for (uint32_t& k = m_state.m_CurrentStimulationIdx; k < stimulusChunkVector.size() && stimulusChunkVector[k].m_EndTime <= signalChunkEnd; ++k) + { + const SStimulationChunk& stimChunk = stimulusChunkVector[k]; + const IStimulationSet* bufferedStimSet = stimChunk.m_StimulationSet; + + IStimulationSet* stimSet = m_stimulationEncoder.getInputStimulationSet(); + stimSet->clear(); + + if (bufferedStimSet) + { + for (size_t s = 0; s < bufferedStimSet->getStimulationCount(); ++s) + { + stimSet->appendStimulation(bufferedStimSet->getStimulationIdentifier(s), bufferedStimSet->getStimulationDate(s), + bufferedStimSet->getStimulationDuration(s)); + + this->getLogManager() << Kernel::LogLevel_Trace << "Adding stimulation " << bufferedStimSet->getStimulationIdentifier(s) + << " at date [" << CTime(stimSet->getStimulationDate(s)) + << "] to chunk [" << CTime(stimChunk.m_StartTime) + << ", " << CTime(stimChunk.m_EndTime) + << "]\n"; + } + } + + // encode the stim memory buffer even if it is empty + m_stimulationEncoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(1, stimChunk.m_StartTime, stimChunk.m_EndTime); + /* + if(CTime(stimChunk.m_StartTime).toSeconds()>238 && + CTime(stimChunk.m_StartTime).toSeconds()<242) + + { + this->getLogManager() << Kernel::LogLevel_Info << "Adding stimchunk " << i << "," << k << " [" + << CTime(stimChunk.m_StartTime) + << ", " << CTime(stimChunk.m_EndTime) + << "\n"; + } + */ + } + + // Let the kernel send blocks up to now, prevent freezing up sending everything at once + chunk++; + return false; + } + + // For now we don't support stimuli that don't correspond to signal data, these ones are after the last signal chunk + for (uint32_t& k = m_state.m_CurrentStimulationIdx; k < stimulusChunkVector.size(); ++k) + { + const SStimulationChunk& stimChunk = stimulusChunkVector[k]; + const IStimulationSet* bufferedStimSet = stimChunk.m_StimulationSet; + + if (i == m_signalChunkBuffers.size() - 1) + { + // last file, let pass + + IStimulationSet* stimSet = m_stimulationEncoder.getInputStimulationSet(); + stimSet->clear(); + + if (bufferedStimSet) + { + for (size_t s = 0; s < bufferedStimSet->getStimulationCount(); ++s) + { + stimSet->appendStimulation(bufferedStimSet->getStimulationIdentifier(s), bufferedStimSet->getStimulationDate(s), + bufferedStimSet->getStimulationDuration(s)); + + this->getLogManager() << Kernel::LogLevel_Warning << "Stimulation " << bufferedStimSet->getStimulationIdentifier(s) + << " at date [" << CTime(stimSet->getStimulationDate(s)) + << "] in chunk [" << CTime(stimChunk.m_StartTime) + << ", " << CTime(stimChunk.m_EndTime) + << "] is after signal ended, but last file, so adding.\n"; + } + } + + // encode the stim memory buffer even if it is empty + m_stimulationEncoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(1, stimChunk.m_StartTime, stimChunk.m_EndTime); + } + else + { + if (bufferedStimSet) + { + for (size_t s = 0; s < bufferedStimSet->getStimulationCount(); ++s) + { + if (!chunkVector.empty()) + { + this->getLogManager() << Kernel::LogLevel_Warning + << "Stimulation " << bufferedStimSet->getStimulationIdentifier(s) + << "'s chunk at [" << CTime(stimChunk.m_StartTime) + << ", " << CTime(stimChunk.m_EndTime) + << "] is after the last signal chunk end time " << CTime(chunkVector.back().m_EndTime) + << ", discarded.\n"; + } + } + } + } + } + + + // Finished with the file + + // if(stimChunk.m_EndTime < chunkVector[m_CurrentChunkIdx].m_EndTime) + // { + // There is no corresponding signal anymore, skip the rest of the stimulations from this file + //this->getLogManager() << Kernel::LogLevel_Info << "Stimulus time " << CTime(stimulusChunkVector[j].m_EndTime) + // << " exceeds the last signal buffer end time " << CTime(chunkVector[chunkVector.size()-1].m_EndTime) + // << "\n"; + //break; + //} + m_state.m_CurrentChunkIdx = 0; + m_state.m_CurrentStimulationIdx = 0; + + this->getLogManager() << Kernel::LogLevel_Info << "File #" << i + 1 << " Finished.\n"; + } + + //We search for the last file with data. + for (uint32_t lastFile = m_signalChunkBuffers.size(); lastFile > 0; lastFile--) + { + const uint32_t lastChunkOfLastFile = m_signalChunkBuffers[lastFile - 1].size(); + if (lastChunkOfLastFile != 0) + { + m_lastChunkEndTime = m_signalChunkBuffers[lastFile - 1][lastChunkOfLastFile - 1].m_EndTime; + break; + } + } + + this->getLogManager() << Kernel::LogLevel_Info << "Concatenation finished !\n"; + + + return true; +} +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmSignalConcatenation.h b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmSignalConcatenation.h new file mode 100644 index 0000000..b552ceb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmSignalConcatenation.h @@ -0,0 +1,212 @@ +#pragma once + +#include +#include + +#include +#include +// The unique identifiers for the box and its descriptor. +// Identifier are randomly chosen by the skeleton-generator. +#define OVP_ClassId_BoxAlgorithm_SignalConcatenation OpenViBE::CIdentifier(0x372F3A9D, 0x49E20CD2) +#define OVP_ClassId_BoxAlgorithm_SignalConcatenationDesc OpenViBE::CIdentifier(0x372F3A9D, 0x49E20CD2) + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +/** + * \class CBoxAlgorithmSignalConcatenation + * \author Laurent Bonnet (INRIA) + * \date Tue Jun 28 09:52:48 2011 + * \brief The class CBoxAlgorithmSignalConcatenation describes the box Signal Concatenation. + * + */ +class CBoxAlgorithmSignalConcatenation final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processClock(Kernel::CMessageClock& msg) override; + uint64_t getClockFrequency() override { return 8LL << 32; } + + bool processInput(const size_t index) override; + + + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_SignalConcatenation) + +protected: + bool concate(); + bool m_finished = false; + bool m_resynchroDone = false; + uint64_t m_timeOut = 0; + + bool m_headerSent = false; + uint32_t m_headerReceivedCount = 0; + uint32_t m_endReceivedCount = 0; + bool m_stimHeaderSent = false; + bool m_endSent = false; + bool m_statsPrinted = false; + + std::vector m_eofStimulations; + std::vector m_eofReached; + + struct SChunk + { + IMemoryBuffer* m_Buffer; + uint64_t m_StartTime; + uint64_t m_EndTime; + }; + + struct SStimulationChunk + { + IStimulationSet* m_StimulationSet; + uint64_t m_StartTime; + uint64_t m_EndTime; + }; + + uint64_t m_stimChunkLength = 0; + + // File end times + std::vector m_fileEndTimes; + + // The signal buffers, one per file + std::vector> m_signalChunkBuffers; + + std::vector> m_stimulationChunkBuffers; + + // The stimulations are stored in one stimulation set per file. The chunk are reconstructed. + std::vector m_stimulationSets; + + //The decoders, (1 signal/1 stim) per file + std::vector*> m_stimulationDecoders; + std::vector*> m_signalDecoders; + + // the encoders : signal, stim and trigger encoder. + Toolkit::TSignalEncoder m_signalEncoder; + Toolkit::TStimulationEncoder m_stimulationEncoder; + Toolkit::TStimulationEncoder m_triggerEncoder; + + uint64_t m_triggerDate = 0; + uint64_t m_lastChunkStartTime = 0; + uint64_t m_lastChunkEndTime = 0; + + struct SConcatenationState + { + SConcatenationState() : m_CurrentFileIdx(0), m_CurrentChunkIdx(0), m_CurrentStimulationIdx(0) { } + uint32_t m_CurrentFileIdx; + uint32_t m_CurrentChunkIdx; + uint32_t m_CurrentStimulationIdx; + }; + + SConcatenationState m_state; +}; + + +// The box listener can be used to call specific callbacks whenever the box structure changes : input added, name changed, etc. +// Please uncomment below the callbacks you want to use. +class CBoxAlgorithmSignalConcatenationListener final : public Toolkit::TBoxListener +{ +public: + + bool check(Kernel::IBox& box) const + { + for (uint32_t i = 0; i < box.getInputCount() >> 1; ++i) + { + box.setInputName(i * 2, ("Input signal " + std::to_string(i + 1)).c_str()); + box.setInputType(i * 2, OV_TypeId_Signal); + + box.setInputName(i * 2 + 1, ("Input stimulations " + std::to_string(i + 1)).c_str()); + box.setInputType(i * 2 + 1, OV_TypeId_Stimulations); + + box.setSettingName(i + 1, ("End-of-file stimulation for input " + std::to_string(i + 1)).c_str()); + } + + return true; + } + + bool onInputRemoved(Kernel::IBox& box, const size_t index) override + { + if (index & 1) { box.removeInput(index - 1); } // odd index + else { box.removeInput(index); } // even index + box.removeSetting(index >> 1); + return this->check(box); + } + + bool onInputAdded(Kernel::IBox& box, const size_t /*index*/) override + { + box.addInput("", OV_TypeId_Stimulations); + box.addSetting("",OV_TypeId_Stimulation, "OVTK_StimulationId_ExperimentStop"); + return this->check(box); + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + + +/** + * \class CBoxAlgorithmSignalConcatenationDesc + * \author Laurent Bonnet (INRIA) + * \date Tue Jun 28 09:52:48 2011 + * \brief Descriptor of the box Signal Concatenation. + * + */ +class CBoxAlgorithmSignalConcatenationDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Signal Concatenation"); } + CString getAuthorName() const override { return CString("Laurent Bonnet"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Concatenates multiple signal streams"); } + + CString getDetailedDescription() const override + { + return CString( + "The signal stream concatenation box reads multiple streams in parallel, and produces a single stream that is the concatenation of all inputs."); + } + + CString getCategory() const override { return CString("File reading and writing"); } + CString getVersion() const override { return CString("2.0"); } + CString getStockItemName() const override { return CString("gtk-add"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_SignalConcatenation; } + IPluginObject* create() override { return new CBoxAlgorithmSignalConcatenation; } + + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmSignalConcatenationListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal 1",OV_TypeId_Signal); + prototype.addInput("Input stimulations 1",OV_TypeId_Stimulations); + prototype.addInput("Input signal 2",OV_TypeId_Signal); + prototype.addInput("Input stimulations 2",OV_TypeId_Stimulations); + + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + + prototype.addOutput("Signal",OV_TypeId_Signal); + prototype.addOutput("Stimulations",OV_TypeId_Stimulations); + + prototype.addOutput("Status",OV_TypeId_Stimulations); + + prototype.addSetting("Time out before assuming end-of-file (in sec)",OV_TypeId_Integer, "5"); + prototype.addSetting("End-of-file stimulation for input 1",OV_TypeId_Stimulation, "OVTK_StimulationId_ExperimentStop"); + prototype.addSetting("End-of-file stimulation for input 2",OV_TypeId_Stimulation, "OVTK_StimulationId_ExperimentStop"); + + //prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_SignalConcatenationDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCGDFFileReader.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCGDFFileReader.cpp new file mode 100644 index 0000000..2ada169 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCGDFFileReader.cpp @@ -0,0 +1,824 @@ +#include "ovpCGDFFileReader.h" + +// @fixme memory leaks on errors + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +// template<> double FileIO::CGDFFileReader::GDFTypeToFloat64(float val, uint32_t channel) { std::cout << "specialized 1\n"; return val; } +// template<> double FileIO::CGDFFileReader::GDFTypeToFloat64(double val, uint32_t channel) { std::cout << "specialized 2\n"; return val; } + +// #define DEBUG_FILE_POSITIONS 1 + +//Plugin Methods +bool CGDFFileReader::initialize() +{ + m_filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_samplesPerBuffer = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_translateByMinimum = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + + if (m_samplesPerBuffer == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << + "SamplesPerBuffer is 0, this will not work\n"; + return false; + } + + m_xpInfoEncoder = new Toolkit::TExperimentInfoEncoder; + m_xpInfoEncoder->initialize(*this, GDFReader_ExperimentInfoOutput); + m_signalEncoder = new Toolkit::TSignalEncoder; + m_signalEncoder->initialize(*this, GDFReader_SignalOutput); + m_stimulationEncoder = new Toolkit::TStimulationEncoder; + m_stimulationEncoder->initialize(*this, GDFReader_StimulationOutput); + + + //allocate the structure used to store the experiment information + m_xpInfoHeader = new CExperimentInfoHeader; + + //opens the gdf file + if (m_filename != CString("")) + { + m_file.open(m_filename.toASCIIString(), std::ios::binary); + if (!m_file.good()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Could not open file [" << m_filename << "]\n"; + return false; + } + } + + m_file.seekg(0, std::ios::end); + m_fileSize = size_t(m_file.tellg()); + m_file.seekg(0, std::ios::beg); + + m_header3Length = 0; + + // const char *filename = m_sFileName.toASCIIString(); + // this->getLogManager() << Kernel::LogLevel_Trace << "Opening [" << filename << "]\n"; + + //reads the gdf headers and sends the corresponding buffers + const bool res = readFileHeader(); + +#ifdef DEBUG_FILE_POSITIONS + this->getLogManager() << Kernel::LogLevel_Info << "After all headers, file is at " << m_file.tellg() << "\n"; +#endif + + return res; +} + +bool CGDFFileReader::uninitialize() +{ + if (m_signalEncoder) + { + m_signalEncoder->uninitialize(); + delete m_signalEncoder; + } + if (m_xpInfoEncoder) + { + m_xpInfoEncoder->uninitialize(); + delete m_xpInfoEncoder; + } + if (m_stimulationEncoder) + { + m_stimulationEncoder->uninitialize(); + delete m_stimulationEncoder; + } + + + //desallocate all of the remaining buffers + delete[] m_channelDataSize; //can be done before? + delete[] m_channelType; //can be done before? + delete[] m_channelScale; + delete[] m_channelTranslate; + delete[] m_dataRecordBuffer; //can be done before?? + delete[] m_channelDataInDataRecord; + delete[] m_matrixBuffer; //can be done before? + delete[] m_eventsPositionBuffer; + delete[] m_eventsTypeBuffer; + //Close the GDF file + if (m_file) { m_file.close(); } + + return true; +} + +bool CGDFFileReader::processClock(Kernel::CMessageClock& msg) +{ + if (m_signalDesc.m_Sampling == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Sampling rate is 0 - not supported.\n"; + return false; + } + + const uint64_t time = CTime(m_signalDesc.m_Sampling, m_nSentSample + m_signalDesc.m_NSample).time(); + if (msg.getTime() > time) { getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); } + return true; +} + +void CGDFFileReader::gdfBufferToDoubleBuffer(double* out, void* in, const uint64_t size, const uint32_t channel) +{ + switch (m_channelType[channel]) + { + case GDF::ChannelType_int8_t: + gdfTypeBufferToDoubleBuffer(out, reinterpret_cast(in), size, channel); + break; + + case GDF::ChannelType_uint8_t: + gdfTypeBufferToDoubleBuffer(out, reinterpret_cast(in), size, channel); + break; + + case GDF::ChannelType_int16_t: + gdfTypeBufferToDoubleBuffer(out, reinterpret_cast(in), size, channel); + break; + + case GDF::ChannelType_uint16_t: + gdfTypeBufferToDoubleBuffer(out, reinterpret_cast(in), size, channel); + break; + + case GDF::ChannelType_int32_t: + gdfTypeBufferToDoubleBuffer(out, reinterpret_cast(in), size, channel); + break; + + case GDF::ChannelType_uint32_t: + gdfTypeBufferToDoubleBuffer(out, reinterpret_cast(in), size, channel); + break; + + case GDF::ChannelType_int64_t: + gdfTypeBufferToDoubleBuffer(out, reinterpret_cast(in), size, channel); + break; + + case GDF::ChannelType_uint64_t: + gdfTypeBufferToDoubleBuffer(out, reinterpret_cast(in), size, channel); + break; + + case GDF::ChannelType_float: + gdfTypeBufferToDoubleBuffer(out, reinterpret_cast(in), size, channel); + break; + + case GDF::ChannelType_double: + gdfTypeBufferToDoubleBuffer(out, reinterpret_cast(in), size, channel); + break; + + case GDF::ChannelType_float128: + { + //Not handled + this->getLogManager() << Kernel::LogLevel_Warning << "This data type is currently not handled : float128.\n"; + m_errorOccurred = true; + } + break; + + case GDF::ChannelType_int24: + { + uint8_t* p = reinterpret_cast(in); + + for (uint64_t i = 0; i < (size * 3); i += 3) { out[i] = gdfTypeToDouble(p[i] + (p[i + 1] << 8) + (p[i + 2] << 16), channel); } + } + break; + + case GDF::ChannelType_uint24: + { + int8_t* p = reinterpret_cast(in); + + for (uint64_t i = 0; i < (size * 3); i += 3) { out[i] = gdfTypeToDouble(p[i] + (p[i + 1] << 8) + (p[i + 2] << 16), channel); } + } + break; + + default: + //not handled + this->getLogManager() << Kernel::LogLevel_Warning << "Invalid GDF data type!\n"; + m_errorOccurred = true; + break; + } +} + +bool CGDFFileReader::readFileHeader() +{ + Kernel::IBoxIO& boxIO = this->getDynamicBoxContext(); + + if (!m_xpInfoSent) + { + this->getLogManager() << Kernel::LogLevel_Trace << "Reading experiment information\n"; + + //First reads the file type + char type[3]; + char version[6]; // field has size 5, we add +1 for terminating NULL + m_file.read(type, 3); + + //if not a gdf file + if (strncmp(type, "GDF", 3) != 0) + { + //Handle error + this->getLogManager() << Kernel::LogLevel_Warning << "This is not a valid GDF File!\n"; + m_errorOccurred = true; + return false; + } + + m_file.read(version, 5); + version[5] = 0; // The version is not NULL-terminated in the file, we terminate with NULL manually for atof. + m_fileVersion = float(atof(&version[1])); + + this->getLogManager() << Kernel::LogLevel_Debug << "File version parsed as " << m_fileVersion << "\n"; + + if (m_file.bad()) + { + //Handle error + this->getLogManager() << Kernel::LogLevel_Warning << "Error while reading file.\n"; + m_errorOccurred = true; + return false; + } + + if (m_fileVersion < 3) + { + GDF::CFixedGDFHeader* header; + + if (m_fileVersion > 2.12) { header = new GDF::CFixedGDF251Header; } + else if (m_fileVersion > 1.90) { header = new GDF::CFixedGDF2Header; } + else { header = new GDF::CFixedGDF1Header; } + + if (!header->read(m_file)) + { + this->getLogManager() << Kernel::LogLevel_Error << + "Failure to parse fixed header\n"; + m_errorOccurred = true; + delete header; + return false; + } + + // kludge: header should be 256 bytes long, make sure the file position is there now. + if (m_fileVersion > 1.90) { m_file.seekg(256, std::ios_base::beg); } + + m_xpInfoHeader->m_ExperimentID = header->getExperimentID(); + m_xpInfoHeader->m_ExperimentDate = header->getExperimentDate(); + m_xpInfoHeader->m_SubjectID = header->getSubjectID(); + m_xpInfoHeader->m_SubjectName = header->getSubjectName(); + m_xpInfoHeader->m_SubjectAge = header->getSubjectAge(); + m_xpInfoHeader->m_SubjectSex = header->getSubjectSex(); + + m_xpInfoHeader->m_LaboratoryID = header->getLaboratoryID(); + m_xpInfoHeader->m_LaboratoryName = header->getLaboratoryName(); + m_xpInfoHeader->m_TechnicianID = header->getTechnicianID(); + m_xpInfoHeader->m_TechnicianName = header->getTechnicianName(); + + //Experiment header ready to send now + m_xpInfoHeader->m_ReadyToSend = true; + + m_durationDataRecord = header->getDataRecordDuration(); + m_nDataRecords = header->getNDataRecords(); + + //this information is related to the signal + m_nChannels = uint16_t(header->getChannelCount()); + m_signalDesc.m_NChannel = m_nChannels; + + //Send the header + writeExperimentInfo(); + + boxIO.markOutputAsReadyToSend(GDFReader_ExperimentInfoOutput, 0, 0); + m_xpInfoSent = true; + + + //not needed anymore + delete header; + delete m_xpInfoHeader; + m_xpInfoHeader = nullptr; + } + else + { + //Not a known GDF File version + this->getLogManager() << Kernel::LogLevel_Error << "GDF file version " << m_fileVersion << " is not supported.\n"; + //Error handling + m_errorOccurred = true; + return false; + } + }//END of ExperimentHeader + + if (!m_signalDescSent) + { + this->getLogManager() << Kernel::LogLevel_Trace << "Reading signal description\n"; + +#ifdef DEBUG_FILE_POSITIONS + this->getLogManager() << Kernel::LogLevel_Info << "Before variable header, file is at " << m_file.tellg() << "\n"; +#endif + + //reads the whole variable header + char* headerBuffer = new char[m_nChannels * 256]; + m_file.read(headerBuffer, m_nChannels * 256); + +#ifdef DEBUG_FILE_POSITIONS + this->getLogManager() << Kernel::LogLevel_Info << "After variable header, file is at " << m_file.tellg() << "\n"; +#endif + + if (m_file.bad()) + { + //Handle error + this->getLogManager() << Kernel::LogLevel_Error << "Read error.\n"; + m_errorOccurred = true; + return false; + } + + m_signalDesc.m_ChannelNames.resize(m_nChannels); + + //channel's signal gain/translation + m_channelScale = new double[m_nChannels]; + m_channelTranslate = new double[m_nChannels]; + + double* physicalMin = reinterpret_cast(headerBuffer + (104 * m_nChannels)); + double* physicalMax = reinterpret_cast(headerBuffer + (112 * m_nChannels)); + int64_t* digitalMin = reinterpret_cast(headerBuffer + (120 * m_nChannels)); // v1? + int64_t* digitalMax = reinterpret_cast(headerBuffer + (128 * m_nChannels)); + double* digitalMinD = reinterpret_cast(headerBuffer + (120 * m_nChannels)); // v2+ + double* digitalMaxD = reinterpret_cast(headerBuffer + (128 * m_nChannels)); + + for (uint16_t i = 0; i < m_nChannels; ++i) + { + if (m_fileVersion > 1.90) { m_channelScale[i] = (physicalMax[i] - physicalMin[i]) / (digitalMaxD[i] - digitalMinD[i]); } + else { m_channelScale[i] = (physicalMax[i] - physicalMin[i]) / (digitalMax[i] - digitalMin[i]); } + + if (m_translateByMinimum) { m_channelTranslate[i] = physicalMin[i]; } + else { m_channelTranslate[i] = (physicalMax[i] + physicalMin[i]) / 2.0; } + this->getLogManager() << Kernel::LogLevel_Debug << "Channel " << i << " physMin " << physicalMin[i] << " physMax " << physicalMax[i] + << " digMin " << digitalMin[i] << " digMax " << digitalMax[i] + << " digMinF " << digitalMinD[i] << " digMaxF " << digitalMaxD[i] + << " scale " << m_channelScale[i] << " trans " << m_channelTranslate[i] << "\n"; + } + + //Check if all the channels have the same sampling rate + uint32_t* nSamplesPerRecordArray = reinterpret_cast(headerBuffer + (216 * m_nChannels)); + + m_nSamplesPerRecord = nSamplesPerRecordArray[0]; + + for (uint16_t i = 1; i < m_nChannels; ++i) + { + //If all the channels don't have the same sampling rate + if (m_nSamplesPerRecord != nSamplesPerRecordArray[i]) + { + if (m_fileVersion > 1.90) + { + this->getLogManager() << Kernel::LogLevel_Error << + "Interpreted GDF file to have channels with varying sampling rates, which is not supported.\n"; + this->getLogManager() << Kernel::LogLevel_Error << "This can be a misinterpretation of the newer GDF subformats. File claims to follow GDF " + << m_fileVersion << ".\n"; + } + else { this->getLogManager() << Kernel::LogLevel_Error << "Can't handle GDF files with channels having different sampling rates!\n"; } + m_errorOccurred = true; + return false; + } + } + + //type of the channels' data + m_channelType = new uint32_t[m_nChannels]; + memcpy(m_channelType, headerBuffer + (220 * m_nChannels), m_nChannels * 4); + + m_channelDataSize = new uint16_t[m_nChannels]; + + this->getLogManager() << Kernel::LogLevel_Debug << "Found " << m_nChannels << " channels...\n"; + for (uint16_t i = 0; i < m_nChannels; ++i) + { + //Find the data size for each channel + //TODO use enum to specify each type's name + m_channelDataSize[i] = GDF::GDFDataSize(m_channelType[i]); + + //Here, we can compute the size of a data record, based on the type of each channel + m_dataRecordSize += m_nSamplesPerRecord * m_channelDataSize[i]; + + //reads the channels names + m_signalDesc.m_ChannelNames[i].assign(headerBuffer + (16 * i), 16); + + this->getLogManager() << Kernel::LogLevel_Debug << " * Channel " << uint32_t(i + 1) << " : " << CString( + m_signalDesc.m_ChannelNames[i].c_str()) << "\n"; + } + + //This parameter is defined by the user of the plugin + m_signalDesc.m_NSample = uint32_t(m_samplesPerBuffer); + + //needs to be computed based on the duration of a data record and the number of samples in one of those data records + m_signalDesc.m_Sampling = uint32_t(0.5 + (m_nSamplesPerRecord / m_durationDataRecord)); + + if (m_signalDesc.m_Sampling == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Sampling rate is 0 - not supported\n"; + m_errorOccurred = true; + return false; + } + + this->getLogManager() << Kernel::LogLevel_Debug << "Samples in file : " << m_nDataRecords * m_nSamplesPerRecord << " samples\n"; + this->getLogManager() << Kernel::LogLevel_Debug << "Sample count per buffer : " << m_samplesPerBuffer << "\n"; + this->getLogManager() << Kernel::LogLevel_Debug << "Sampling rate : " << m_signalDesc.m_Sampling << "\n"; + + //computes clock frequency + if (m_samplesPerBuffer <= m_signalDesc.m_Sampling) + { + if (m_signalDesc.m_Sampling % m_samplesPerBuffer != 0) + { + this->getLogManager() << Kernel::LogLevel_Warning << "The sampling rate isn't a multiple of the buffer size\n"; + this->getLogManager() << Kernel::LogLevel_Warning << "Please consider adjusting the GDFReader settings to correct this!\n"; + this->getLogManager() << Kernel::LogLevel_Warning << "Sampling rate was " << m_signalDesc.m_Sampling << "\n"; + this->getLogManager() << Kernel::LogLevel_Warning << "Buffer size was " << m_samplesPerBuffer << "\n"; + } + + // Intentional parameter swap to get the frequency + m_clockFrequency = CTime(m_samplesPerBuffer, m_signalDesc.m_Sampling).time(); + } + + // We may need to skip header3 with its tags and take its size into account + if (m_fileVersion >= 2.10) + { +#ifdef DEBUG_FILE_POSITIONS + this->getLogManager() << Kernel::LogLevel_Info << "Before header3, file is at " << m_file.tellg() << "\n"; +#endif + + m_header3Length = 0; + + while (true) + { + char buffer[4]; + m_file.read((char*)&buffer, 4); // Curious Cast + if (m_file.bad() || m_file.eof()) { break; } + m_header3Length += 4; + + uint32_t tag = buffer[0]; + uint32_t length = (uint32_t(buffer[1]) << 0) + (uint32_t(buffer[2]) << 8) + (uint32_t(buffer[3]) << 16); // src is uint24 + + this->getLogManager() << Kernel::LogLevel_Info << "Found tag " << tag << " at pos " << int64_t(m_file.tellg() - std::streamoff(4)) + << " [length " << length << "], skipping content.\n"; + + if (tag == 0) { break; } + m_file.seekg(std::streamoff(length), std::ios_base::cur); + m_header3Length += length; + } + // Skip possible padding + const uint64_t paddingRequired = (256 - m_header3Length) % 256; + m_header3Length += paddingRequired; + m_file.seekg(paddingRequired, std::ios::cur); + + if (m_file.eof() || m_file.tellg() <= 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "File ended by trying to skip the header.\n"; + return false; + } + +#ifdef DEBUG_FILE_POSITIONS + this->getLogManager() << Kernel::LogLevel_Info << "After header3, file is at " << m_file.tellg() << ". Header length: " << m_header3Length << ", padding was " << paddingRequired << "\n"; +#endif + } + + //Send the data to the output + writeSignalInformation(); + boxIO.markOutputAsReadyToSend(GDFReader_SignalOutput, 0, 0); + + delete[] headerBuffer; + + m_signalDescSent = true; + }//END of SignalHeader + + return true; +} + +void CGDFFileReader::writeExperimentInfo() const +{ + // Here we have to declare some variables in the same scope as the encoding call, because otherwise they might be freed before the + // encoder gets to process the data. The point of these is just to convert from std::string to CString as needed by the encoder. + CString date(m_xpInfoHeader->m_ExperimentDate.c_str()); + CString name(m_xpInfoHeader->m_SubjectName.c_str()); + CString labName(m_xpInfoHeader->m_LaboratoryName.c_str()); + CString techName(m_xpInfoHeader->m_TechnicianName.c_str()); + + if (m_xpInfoHeader->m_ExperimentID != NO_VALUE_I) { m_xpInfoEncoder->getInputExperimentID() = m_xpInfoHeader->m_ExperimentID; } + if (m_xpInfoHeader->m_ExperimentDate != NO_VALUE_S) { m_xpInfoEncoder->getInputExperimentDate() = &date; } + if (m_xpInfoHeader->m_SubjectID != NO_VALUE_I) { m_xpInfoEncoder->getInputSubjectID() = m_xpInfoHeader->m_SubjectID; } + if (m_xpInfoHeader->m_SubjectName != NO_VALUE_S) { m_xpInfoEncoder->getInputSubjectName() = &name; } + if (m_xpInfoHeader->m_SubjectAge != NO_VALUE_I) { m_xpInfoEncoder->getInputSubjectAge() = m_xpInfoHeader->m_SubjectAge; } + if (m_xpInfoHeader->m_SubjectSex != NO_VALUE_I) { m_xpInfoEncoder->getInputSubjectGender() = m_xpInfoHeader->m_SubjectSex; } + if (m_xpInfoHeader->m_LaboratoryID != NO_VALUE_I) { m_xpInfoEncoder->getInputLaboratoryID() = m_xpInfoHeader->m_LaboratoryID; } + if (m_xpInfoHeader->m_LaboratoryName != NO_VALUE_S) { m_xpInfoEncoder->getInputLaboratoryName() = &labName; } + if (m_xpInfoHeader->m_TechnicianID != NO_VALUE_I) { m_xpInfoEncoder->getInputTechnicianID() = m_xpInfoHeader->m_TechnicianID; } + if (m_xpInfoHeader->m_TechnicianName != NO_VALUE_S) { m_xpInfoEncoder->getInputTechnicianName() = &techName; } + + m_xpInfoEncoder->encodeHeader(); +} + +void CGDFFileReader::writeSignalInformation() +{ + m_signalEncoder->getInputSamplingRate() = m_signalDesc.m_Sampling; + + CMatrix* iMatrix = m_signalEncoder->getInputMatrix(); + iMatrix->resize(m_signalDesc.m_NChannel, m_signalDesc.m_NSample); + + for (uint32_t i = 0; i < m_signalDesc.m_NChannel; ++i) { iMatrix->setDimensionLabel(0, i, m_signalDesc.m_ChannelNames[i].c_str()); } + + m_signalEncoder->encodeHeader(); +} + +void CGDFFileReader::writeEvents() +{ + IStimulationSet* stimSet = m_stimulationEncoder->getInputStimulationSet(); + stimSet->clear(); + + for (size_t i = 0; i < m_events.size(); ++i) + { + //compute date + const uint64_t date = CTime(m_signalDesc.m_Sampling, m_events[i].m_Position).time(); + stimSet->appendStimulation(m_events[i].m_Type, date, 0); + } + + m_stimulationEncoder->encodeBuffer(); +} + +bool CGDFFileReader::process() +{ + //Don't do anything if an error as occurred while reading the input file + //for instance, if the file has channels with different sampling rates + if (m_errorOccurred) + { + this->getLogManager() << Kernel::LogLevel_Error << "Some error occurred, aborting."; + return false; + } + + uint64_t start = 0; + uint64_t end = 0; + + Kernel::IBoxIO& boxIO = this->getDynamicBoxContext(); + + // Process Matrices + if (m_signalDescSent && !m_matricesSent) + { + //If the matrix buffer is not allocated yet + //"first time" + if (!m_matrixBuffer) + { + //output matrix buffer + m_matrixBufferSize = m_signalDesc.m_NSample * m_signalDesc.m_NChannel; + m_matrixBuffer = new double[size_t(m_matrixBufferSize)]; + + //We also have to read the first data record + m_dataRecordBuffer = new uint8_t[size_t(m_dataRecordSize)]; + m_file.read(reinterpret_cast(m_dataRecordBuffer), std::streamsize(m_dataRecordSize)); + + if (m_file.bad()) + { + //Handle error + this->getLogManager() << Kernel::LogLevel_Error << + "Read error\n"; + m_errorOccurred = true; + return false; + } + + //initialize subpointers + m_channelDataInDataRecord = new uint8_t*[m_nChannels]; + + m_channelDataInDataRecord[0] = m_dataRecordBuffer; + for (int i = 1; i < m_nChannels; ++i) + { + m_channelDataInDataRecord[i] = m_channelDataInDataRecord[i - 1] + m_channelDataSize[i - 1] * m_nSamplesPerRecord; + } + } + + uint32_t nSample = 0; + bool readyToSend = false; + + while (!readyToSend) + { + //there is the same number of samples + const uint64_t samplesRemainingInDataRecord = m_nSamplesPerRecord - m_currentSampleInDataRecord; + + //If there is enough data in the current data record to read a matrix buffer + if ((m_samplesPerBuffer - nSample) <= samplesRemainingInDataRecord) + { + for (int i = 0; i < m_nChannels; ++i) + { + //reads m_samplesPerBuffer samples and converts/writes them in output buffer + gdfBufferToDoubleBuffer(m_matrixBuffer + (i * m_samplesPerBuffer) + nSample, + m_channelDataInDataRecord[i] + (m_currentSampleInDataRecord * m_channelDataSize[i]), + m_samplesPerBuffer - nSample, i); + } + + m_currentSampleInDataRecord += uint32_t(m_samplesPerBuffer - nSample); + + //Prepares for the next matrix + nSample = 0; + + //We can send the matrix + readyToSend = true; + } + //Not enough data in the current data record. Read the remaining samples, then load a new data record and read the rest + else + { + //copy what is remaining in the current buffer + for (int i = 0; i < m_nChannels; ++i) + { + gdfBufferToDoubleBuffer(m_matrixBuffer + (i * m_samplesPerBuffer) + nSample, + m_channelDataInDataRecord[i] + (m_currentSampleInDataRecord * m_channelDataSize[i]), + samplesRemainingInDataRecord, i); + } + + //Updates the index in the output matrix + nSample += uint32_t(samplesRemainingInDataRecord); + + //reads the next data record if there is one + if (m_currentDataRecord < m_nDataRecords - 1) + { + //reads a data record + m_file.read(reinterpret_cast(m_dataRecordBuffer), std::streamsize(m_dataRecordSize)); + + if (m_file.bad()) + { + //Handle error + this->getLogManager() << Kernel::LogLevel_Error << + "Read error\n"; + m_errorOccurred = true; + return false; + } + + m_currentSampleInDataRecord = 0; + m_currentDataRecord++; + } + //if there are no more data records + else + { + //we can (for instance) pad the rest of the matrix with 0s + for (int i = 0; i < m_nChannels; ++i) + { + memset(m_matrixBuffer + (((i * m_samplesPerBuffer) + nSample)), 0, size_t(m_samplesPerBuffer - nSample) * sizeof(double)); + } + + //We can send the matrix + readyToSend = true; + //No more data after that + m_matricesSent = true; + } + } + + //Check if we have finished the current data record + if (m_currentSampleInDataRecord == m_nSamplesPerRecord) + { + m_currentSampleInDataRecord = 0; + m_currentDataRecord++; + + //if there are no more data records + if (m_currentDataRecord >= m_nDataRecords - 1) + { + //We don't have to read data records anymore + m_matricesSent = true; + } + else + { + //reads a data record + m_file.read(reinterpret_cast(m_dataRecordBuffer), std::streamsize(m_dataRecordSize)); + + if (m_file.bad()) + { + //Handle error + this->getLogManager() << Kernel::LogLevel_Error << + "Read error\n"; + m_errorOccurred = true; + return false; + } + } + } + } + + m_nSentSample += m_signalDesc.m_NSample; + + // this->getLogManager() << Kernel::LogLevel_Trace << "Sent " << m_nSentSample << " samples\n"; + + //A signal matrix is ready to be output + + start = CTime(m_signalDesc.m_Sampling, uint64_t(m_nSentSample - m_signalDesc.m_NSample)).time(); + end = CTime(m_signalDesc.m_Sampling, uint64_t(m_nSentSample)).time(); + + CMatrix* iMatrix = m_signalEncoder->getInputMatrix(); + double* buffer = iMatrix->getBuffer(); + for (uint32_t i = 0; i < iMatrix->getBufferElementCount(); ++i) { buffer[i] = *(m_matrixBuffer + i); } + m_signalEncoder->encodeBuffer(); + boxIO.markOutputAsReadyToSend(GDFReader_SignalOutput, start, end); + } + + //Events + if (m_signalDescSent && !m_eventsSent) + { + //reads the events table header if it hasn't been done already + if (!m_eventsPositionBuffer) + { + const std::streamoff backupPos = m_file.tellg(); + const std::streamoff eventDataPos = std::streamoff((256 * (m_nChannels + 1)) + m_header3Length + (m_nDataRecords * m_dataRecordSize)); + + //checks if there are event information + if (size_t(eventDataPos) + 1 < m_fileSize) + { + m_file.seekg(eventDataPos); + + //reads the event table mode + m_file >> m_eventTableMode; + } + //no event information + else + { + m_file.seekg(backupPos); + + m_eventsSent = true; + return true; + } + + uint32_t eventTableHeaderMain[7]; + uint8_t* eventTableHeader = reinterpret_cast(eventTableHeaderMain); + memset(eventTableHeaderMain, 0, sizeof(eventTableHeaderMain)); + m_file.read(reinterpret_cast(eventTableHeader), 7); + + if (m_fileVersion > 1.90) { m_nEvents = *(reinterpret_cast(eventTableHeader + 0)); } + else { m_nEvents = *(reinterpret_cast(eventTableHeader + 3)); } + + this->getLogManager() << Kernel::LogLevel_Trace << "The file has " << m_nEvents << " events\n"; + + m_eventsPositionBuffer = new uint32_t[m_nEvents * 4]; + m_eventsTypeBuffer = new uint16_t[m_nEvents * 2]; + + //we have to read all the events' position and type + m_file.read(reinterpret_cast(m_eventsPositionBuffer), m_nEvents * 4); + m_file.read(reinterpret_cast(m_eventsTypeBuffer), m_nEvents * 2); + + m_file.seekg(backupPos); + + // Sanity check the events & shift -1 sample + for (uint32_t i = 0; i < m_nEvents; ++i) + { + // GDF Spec v2.51, #33: sample indexing starts from 1, hence here we compensate with -1 as in OV the first sample is in index 0 + if (m_eventsPositionBuffer[i] > 0) { m_eventsPositionBuffer[i]--; } + + if (m_eventsPositionBuffer[i] >= (m_nDataRecords * m_nSamplesPerRecord)) + { + this->getLogManager() << Kernel::LogLevel_Warning << "File has stimulation " << m_eventsTypeBuffer[i] << " at sample count " + << m_eventsPositionBuffer[i] << " but the file has only " << (m_nDataRecords * m_nSamplesPerRecord) + << " samples of signal. Stimulation will be dropped.\n"; + // Note that with the current design of this box its not possible to keep producing stimulation chunks after the signal has ended, and + // it'd be an openvibe stream convention violation to append the stimulation at t to any chunk where t \notin [chunkStart,chunkEnd]. + // Hence drop. + } + } + + m_stimulationEncoder->encodeHeader(); + boxIO.markOutputAsReadyToSend(GDFReader_StimulationOutput, 0, 0); + } + + GDF::CGDFEvent event; + //todo check inclusive/exclusive conditions + while ((m_currentEvent != m_nEvents) + && m_eventsPositionBuffer[m_currentEvent] >= m_nSentSample - m_signalDesc.m_NSample + && m_eventsPositionBuffer[m_currentEvent] < m_nSentSample) // In current chunk range + { + //reads an event + event.m_Position = m_eventsPositionBuffer[m_currentEvent]; + event.m_Type = m_eventsTypeBuffer[m_currentEvent]; + + //adds it to the list of events + m_events.push_back(event); + + // If input already has an EOF marker, we don't add our own + if (event.m_Type == OVTK_StimulationId_EndOfFile) { m_appendEOF = false; } + + m_currentEvent++; + } + + //if we just read the last event + if (m_currentEvent == m_nEvents) + { + m_eventsSent = true; + delete[] m_eventsPositionBuffer; + m_eventsPositionBuffer = nullptr; + delete[] m_eventsTypeBuffer; + m_eventsTypeBuffer = nullptr; + } + } + + // Send out stims. Logic: + // If we haven't yet sent out all matrices, or we have a pending EOF stim, send a stim chunk + // If we have sent out all matrices and we have a pending EOF, append it + if (!m_matricesSent || m_appendEOF) + { + if (m_matricesSent && m_appendEOF) + { + //creates an end of file event + GDF::CGDFEvent event; + event.m_Position = uint32_t(m_nDataRecords * m_nSamplesPerRecord); + event.m_Type = OVTK_StimulationId_EndOfFile; + + //adds it to the list of events + m_events.push_back(event); + + m_appendEOF = false; + } + + // In OpenViBE, we should always send a stimulus chunk even if it was empty + writeEvents(); + m_events.clear(); + + boxIO.markOutputAsReadyToSend(GDFReader_StimulationOutput, start, end); + } + + return true; +} + +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCGDFFileReader.h b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCGDFFileReader.h new file mode 100644 index 0000000..e6d5b32 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCGDFFileReader.h @@ -0,0 +1,214 @@ +#pragma once + +#include "../ovp_defines.h" +#include "../ovp_gdf_helpers.h" + +#include +#include + +#include +#include +#include + +#define GDFReader_ExperimentInfoOutput 0 +#define GDFReader_SignalOutput 1 +#define GDFReader_StimulationOutput 2 + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +/// The GDF reader plugin main class. +/// +class CGDFFileReader final : public Toolkit::TBoxAlgorithm +{ +public: + //Helper structures + class CExperimentInfoHeader + { + public: + uint64_t m_ExperimentID = 0; + std::string m_ExperimentDate; + + uint64_t m_SubjectID = 0; + std::string m_SubjectName; + uint64_t m_SubjectAge = 0; + uint64_t m_SubjectSex = 0; + + uint64_t m_LaboratoryID = 0; + std::string m_LaboratoryName; + uint64_t m_TechnicianID = 0; + std::string m_TechnicianName; + + bool m_ReadyToSend = false; + }; + + // Used to store information about the signal stream + class CSignalDescription + { + public: + CSignalDescription() = default; + ~CSignalDescription() = default; + + size_t m_Version = 1; + size_t m_Sampling = 0; + size_t m_NChannel = 0; + size_t m_NSample = 0; + std::vector m_ChannelNames; + size_t m_CurrentChannel = 0; + + bool m_ReadyToSend = false; + }; + + CGDFFileReader() { } + + void release() override {} + bool initialize() override; + bool uninitialize() override; + + uint64_t getClockFrequency() override { return m_clockFrequency; } + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + _IsDerivedFromClass_Final_(IBoxAlgorithm, OVP_ClassId_GDFFileReader) + +protected: + + bool m_errorOccurred = false; // true if an error has occurred while reading the GDF file + + //The GDF filename and handle + CString m_filename; + std::ifstream m_file; + size_t m_fileSize = 0; + uint64_t m_header3Length = 0; + + float m_fileVersion = -1; + + Toolkit::TSignalEncoder* m_signalEncoder = nullptr; + Toolkit::TExperimentInfoEncoder* m_xpInfoEncoder = nullptr; + Toolkit::TStimulationEncoder* m_stimulationEncoder = nullptr; + + + //Stream information + uint64_t m_samplesPerBuffer = 0; //user defined + + //input + uint64_t m_nDataRecords = 0; + double m_durationDataRecord = 0; + uint16_t m_nChannels = 0; + + uint32_t m_nSamplesPerRecord = 0; // We only handle the files where it is the same for all the channels + + //info about channel's data type in data record + uint32_t* m_channelType = nullptr; + uint16_t* m_channelDataSize = nullptr; + double* m_channelScale = nullptr; + double* m_channelTranslate = nullptr; + + //Size of a data record + uint64_t m_dataRecordSize = 0; + + //The current data record's data + uint8_t* m_dataRecordBuffer = nullptr; + + //pointers to each channel's information in the current data record + uint8_t** m_channelDataInDataRecord = nullptr; + + //Output Stream matrix + double* m_matrixBuffer = nullptr; + uint64_t m_matrixBufferSize = 0; + bool m_matricesSent = false; + + //Total number of samples sent up to now (used to compute start/end time) + uint32_t m_nSentSample = 0; + + //indexes of current data record, channel, and sample + uint64_t m_currentDataRecord = 0; + uint32_t m_currentSampleInDataRecord = 0; + + //Events variables + uint8_t m_eventTableMode = 0; // mode of the event table + uint32_t m_nEvents = 0; // number of events in the event table + uint32_t* m_eventsPositionBuffer = nullptr; // pointer on the array of event's positions + uint16_t* m_eventsTypeBuffer = nullptr; // pointer on the array of event's types + + std::vector m_events; //current stimulation block + + uint32_t m_currentEvent = 0; // current event in event table + bool m_eventsSent = false; // true if all the events have been sent + bool m_appendEOF = true; // true if the file does contains a recognized EOF marker, then we add our own + + uint64_t m_stimulationPerBuffer = 32; //user defined + + //helper structures + CExperimentInfoHeader* m_xpInfoHeader = nullptr; + bool m_xpInfoSent = false; + + CSignalDescription m_signalDesc; + bool m_signalDescSent = false; + + uint64_t m_clockFrequency = 0; + + bool m_translateByMinimum = false; + + bool readFileHeader(); + void writeExperimentInfo() const; + void writeSignalInformation(); + void writeEvents(); + + template + double gdfTypeToDouble(T val, const uint32_t channel) { return m_channelScale[channel] * double(val) + m_channelTranslate[channel]; } + + template + void gdfTypeBufferToDoubleBuffer(double* out, T* in, const uint64_t size, const uint32_t channel) + { + for (uint64_t i = 0; i < size; ++i) { out[i] = gdfTypeToDouble(in[i], channel); } + } + + void gdfBufferToDoubleBuffer(double* out, void* in, const uint64_t size, const uint32_t channel); +}; + +// template<> double CGDFFileReader::gdfTypeToDouble(float val, uint32_t channel); +// template<> double CGDFFileReader::gdfTypeToDouble(double val, uint32_t channel); + +/** +* Description of the GDF Reader plugin +*/ +class CGDFFileReaderDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("GDF file reader"); } + CString getAuthorName() const override { return CString("Bruno Renier, Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("GDF file reader"); } + CString getDetailedDescription() const override { return CString("Reads .GDF format files"); } + CString getCategory() const override { return CString("File reading and writing/GDF"); } + CString getVersion() const override { return CString("0.9.1"); } + CString getStockItemName() const override { return CString("gtk-open"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_GDFFileReader; } + IPluginObject* create() override { return new CGDFFileReader(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + // Adds box outputs + prototype.addOutput("Experiment information", OV_TypeId_ExperimentInfo); + prototype.addOutput("EEG stream", OV_TypeId_Signal); + prototype.addOutput("Stimulations", OV_TypeId_Stimulations); + + // Adds settings + prototype.addSetting("Filename", OV_TypeId_Filename, ""); + prototype.addSetting("Samples per buffer", OV_TypeId_Integer, "32"); + prototype.addSetting("Subtract physical minimum", OV_TypeId_Boolean, "false"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_GDFFileReaderDesc) +}; + +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCGDFFileWriter.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCGDFFileWriter.cpp new file mode 100644 index 0000000..46ceb7b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCGDFFileWriter.cpp @@ -0,0 +1,436 @@ +#include "ovpCGDFFileWriter.h" + +#include + +#include +#include +#include +#include +#include // std::min, etc on VS2013 + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +void CGDFFileWriter::setChannelCount(const size_t n) +{ + m_fixedHeader.m_NSignals = n; + m_fixedHeader.m_NBytesInHeaderRecord = (n + 1) * 256; + + m_variableHeader.setChannelCount(n); + m_samples.resize(n); + m_nSamples.resize(n); +} + +void CGDFFileWriter::setChannelName(const size_t index, const char* name) +{ + const uint32_t size = sizeof(m_variableHeader[index].m_Label); + + // initialize label with spaces + memset(m_variableHeader[index].m_Label, ' ', size); + + // copy at most size-1 characters, leaving room for 1 space. Note that the label is not NULL terminated. + const uint32_t len = std::min(strlen(name), size - 1); + memcpy(m_variableHeader[index].m_Label, name, len); + + m_variableHeader[index].m_ChannelType = 17; //double + m_variableHeader[index].m_NSamplesInEachRecord = 1; + m_variableHeader[index].m_PhysicalMin = +DBL_MAX; //starting value(to compare later) + m_variableHeader[index].m_PhysicalMax = -DBL_MAX; //starting value(to compare later) + m_variableHeader[index].m_DigitalMin = 0x8000000000000000LL; + m_variableHeader[index].m_DigitalMax = 0x7fffffffffffffffLL; + + memcpy(m_variableHeader[index].m_PhysicalDimension, "uV", sizeof("uV")); +} + +void CGDFFileWriter::setSampleCountPerBuffer(const size_t n) +{ + m_samplesPerChannel = n; + + //save the fixed header + if (m_fixedHeader.save(m_file)) + { + //save the variable header + if (!m_variableHeader.save(m_file)) { m_error = true; } + } + else { m_error = true; } + + if (m_error) { this->getLogManager() << Kernel::LogLevel_Warning << "Error while writing to the output file!\n"; } +} + +void CGDFFileWriter::setSamplingRate(const size_t sampling) +{ + m_sampling = sampling; + + m_fixedHeader.m_DurationDataRecordNum = 1; + m_fixedHeader.m_DurationDataRecordDen = m_sampling; +} + +void CGDFFileWriter::setSampleBuffer(const double* buffer) +{ + //for each channel + for (size_t j = 0; j < m_fixedHeader.m_NSignals; ++j) + { + for (size_t i = 0; i < m_samplesPerChannel; ++i) + { + //gets a sample value + const double sample = buffer[j * m_samplesPerChannel + i]; + //actualize channel's digital min/max + if (fabs(sample) > m_variableHeader[j].m_PhysicalMax) + { + m_variableHeader[j].m_PhysicalMax = fabs(sample + (1 / m_precision)); + m_variableHeader[j].m_PhysicalMin = -m_variableHeader[j].m_PhysicalMax; + m_variableHeader[j].m_DigitalMax = int64_t(1 + (ceil(fabs(sample) * m_precision))); + m_variableHeader[j].m_DigitalMin = -m_variableHeader[j].m_DigitalMax; + } + + //copy its current sample + m_samples[j].push_back(sample * m_precision); + } + + //updates the sample count + m_nSamples[j] += m_samplesPerChannel; + } + + // this->getLogManager() << Kernel::LogLevel_Info << "Received up to " << m_nSamples[0] << " samples\n"; + + //save in the file + saveMatrixData(); + + //updates the fixed header + m_fixedHeader.m_NDataRecords = m_nSamples[0]; + //updates the variable header + if (m_fixedHeader.update(m_file)) { if (!m_variableHeader.update(m_file)) { m_error = true; } } + else { m_error = true; } + + if (m_error) { this->getLogManager() << Kernel::LogLevel_Warning << "Error while writing to the output file!\n"; } +} + +/* +* Experiment callback +* +*/ +void CGDFFileWriter::setExperimentInfo() +{ + uint64_t value = m_xpInfoDecoder->getOutputExperimentID(); + sprintf(m_fixedHeader.m_RecordingID, "0x%08X", value); + m_fixedHeader.m_RecordingID[10] = ' '; + + value = m_xpInfoDecoder->getOutputSubjectID(); + sprintf(m_fixedHeader.m_PatientID, "0x%08X ", value); + m_fixedHeader.m_PatientID[11] = ' '; + + + m_xpInfoDecoder->getOutputSubjectAge(); + // TODO using the experiment date, compute the birthdate? + + value = m_xpInfoDecoder->getOutputSubjectGender(); + switch (value) + { + case OVTK_Value_Sex_Female: + m_fixedHeader.m_PatientID[17] = 'F'; + break; + + case OVTK_Value_Sex_Male: + m_fixedHeader.m_PatientID[17] = 'M'; + break; + + case OVTK_Value_Sex_Unknown: + case OVTK_Value_Sex_NotSpecified: + default: + m_fixedHeader.m_PatientID[17] = 'X'; + break; + } + m_fixedHeader.m_PatientID[18] = ' '; + + + value = m_xpInfoDecoder->getOutputLaboratoryID(); + m_fixedHeader.m_LaboratoryID = value; + + + value = m_xpInfoDecoder->getOutputTechnicianID(); + m_fixedHeader.m_TechnicianID = value; + + CString* subjectName = m_xpInfoDecoder->getOutputSubjectName(); + std::string formattedSubjectName((*subjectName).toASCIIString()); + formattedSubjectName.replace(formattedSubjectName.begin(), formattedSubjectName.end(), ' ', '_'); + sprintf(m_fixedHeader.m_PatientID + 31, "%s", formattedSubjectName.c_str()); + + if (!m_fixedHeader.save(m_file)) + { + m_error = true; + + this->getLogManager() << Kernel::LogLevel_Warning << "Error while writing to the output file!\n"; + } +} + +void CGDFFileWriter::setStimulation(const uint64_t identifier, const uint64_t date) { m_events.push_back(std::pair(identifier, date)); } + + +bool CGDFFileWriter::initialize() +{ + m_signalDecoder = new Toolkit::TSignalDecoder; + m_xpInfoDecoder = new Toolkit::TExperimentInfoDecoder; + m_stimulationDecoder = new Toolkit::TStimulationDecoder; + + m_signalDecoder->initialize(*this, 1); + m_xpInfoDecoder->initialize(*this, 0); + m_stimulationDecoder->initialize(*this, 2); + + // Parses box settings to find filename + m_filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + m_precision = 1000.0; + + return true; +} + +bool CGDFFileWriter::uninitialize() +{ + // See that no event is outside the signal by padding the signal with zeroes if necessary + padByEvents(); + + //If the file is not open, that mean that the box is muted. If the file is not open because of a bug, it should have already been notify + if (m_file.is_open()) + { + //update the fixed header + if (!m_nSamples.empty()) + { + m_fixedHeader.m_NDataRecords = m_nSamples[0]; + this->getLogManager() << Kernel::LogLevel_Trace << "Saving " << m_nSamples[0] << " data records\n"; + } + + if (m_fixedHeader.update(m_file)) + { + //To save the Physical/Digital max/min values + if (!m_variableHeader.update(m_file)) { m_error = true; } + } + else { m_error = true; } + + //write events + if (!m_events.empty()) + { + this->getLogManager() << Kernel::LogLevel_Trace << "Saving " << m_events.size() << " events\n"; + saveEvents(); + } + + if (m_error) { this->getLogManager() << Kernel::LogLevel_Warning << "Error while writing to the output file!\n"; } + + m_file.close(); + } + + if (m_signalDecoder) + { + m_signalDecoder->uninitialize(); + delete m_signalDecoder; + } + if (m_xpInfoDecoder) + { + m_xpInfoDecoder->uninitialize(); + delete m_xpInfoDecoder; + } + if (m_stimulationDecoder) + { + m_stimulationDecoder->uninitialize(); + delete m_stimulationDecoder; + } + + return true; +} + +bool CGDFFileWriter::processInput(const size_t /*index*/) +{ + if (m_error) { return false; } + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +void CGDFFileWriter::saveMatrixData() +{ + if (!m_file.is_open()) + { + m_file.open(m_filename, std::ios::binary | std::ios::trunc); + + if (!m_file.good()) + { + m_error = true; + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Could not open file [" << m_filename << "]\n"; + return; + } + } + + size_t j; + m_file.seekp(0, std::ios::end); + + //to "convert" (if needed) the double in little endian format + uint8_t littleEndianBuffer[8]; + + for (size_t i = 0; i < m_samples[0].size(); ++i) + { + for (j = 0; j < m_samples.size(); ++j) + { + const double v = m_samples[j][i]; + System::Memory::hostToLittleEndian(v, littleEndianBuffer); + m_file.write(reinterpret_cast(littleEndianBuffer), sizeof(littleEndianBuffer)); + } + } + for (j = 0; j < m_samples.size(); ++j) { m_samples[j].clear(); } +} + +void CGDFFileWriter::padByEvents() +{ + if (!m_file.is_open()) + { + m_file.open(m_filename, std::ios::binary | std::ios::trunc); + + if (!m_file.good()) + { + m_error = true; + + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Could not open file [" << m_filename << "]\n"; + return; + } + } + + uint32_t maxPos = 0; + for (const auto& e : m_events) + { + // GDF Spec v2.51, #33: sample indexing starts from 1, hence +1 + const uint32_t pos = uint32_t(CTime(e.second).toSampleCount(m_sampling) + 1); + if (pos > m_nSamples[0] + 1) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Stimulation " << uint16_t(e.first & 0xFFFF) << " will be written at " << pos + << " (after last sample at " << m_nSamples[0] + 1 << "), padding the signal\n"; + maxPos = std::max(pos, maxPos); + } + } + if (maxPos > 0) + { + const CMatrix* oMatrix = m_signalDecoder->getOutputMatrix(); + CMatrix zeros; + zeros.copyDescription(*oMatrix); + while (maxPos >= m_nSamples[0] + 1) { setSampleBuffer(zeros.getBuffer()); } + } +} + +void CGDFFileWriter::saveEvents() +{ + if (!m_file.is_open()) + { + m_file.open(m_filename, std::ios::binary | std::ios::trunc); + + if (!m_file.good()) + { + m_error = true; + + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Could not open file [" << m_filename << "]\n"; + return; + } + } + + m_file.seekp(0, std::ios::end); + + //event mode + m_file.put(1); + + //sample rate associated with event positions + m_file.put(0); + m_file.put(0); + m_file.put(0); + + //number of events + uint8_t littleEndianBuffer[sizeof(size_t)]; // needs to be the size of the type returned by m_events.size() + System::Memory::hostToLittleEndian(m_events.size(), littleEndianBuffer); + m_file.write(reinterpret_cast(littleEndianBuffer), sizeof(size_t)); + + // write event positions + for (const auto& e : m_events) + { + // GDF Spec v2.51, #33: sample indexing starts from 1, hence +1 + const uint32_t pos = uint32_t(CTime(e.second).toSampleCount(m_sampling) + 1); + + System::Memory::hostToLittleEndian(pos, littleEndianBuffer); + m_file.write(reinterpret_cast(littleEndianBuffer), sizeof(uint32_t)); + } + + // write event types + for (const auto& e : m_events) + { + //Force to use only 16bits stimulations IDs + const uint16_t type = uint16_t(e.first & 0xFFFF); + + System::Memory::hostToLittleEndian(type, littleEndianBuffer); + m_file.write(reinterpret_cast(littleEndianBuffer), sizeof(uint16_t)); + } +} + +bool CGDFFileWriter::process() +{ + if (!m_file.is_open()) + { + m_file.open(m_filename, std::ios::binary | std::ios::trunc); + + if (!m_file.good()) + { + m_error = true; + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Could not open file [" << m_filename << "]\n"; + return false; + } + } + + Kernel::IBoxIO& boxIO = this->getDynamicBoxContext(); + + //Experiment information + for (size_t i = 0; i < boxIO.getInputChunkCount(0); ++i) + { + m_xpInfoDecoder->decode(i); + if (m_xpInfoDecoder->isHeaderReceived()) { setExperimentInfo(); } + boxIO.markInputAsDeprecated(0, i); + } + + + //Signal + for (size_t i = 0; i < boxIO.getInputChunkCount(1); ++i) + { + m_signalDecoder->decode(i); + if (m_signalDecoder->isHeaderReceived()) + { + CMatrix* oMatrix = m_signalDecoder->getOutputMatrix(); + const size_t nChannel = oMatrix->getDimensionSize(0); + setChannelCount(nChannel); + for (size_t c = 0; c < nChannel; ++c) { setChannelName(c, oMatrix->getDimensionLabel(0, c)); } + setSamplingRate(size_t(m_signalDecoder->getOutputSamplingRate())); + setSampleCountPerBuffer(oMatrix->getDimensionSize(1)); + } + if (m_signalDecoder->isBufferReceived()) + { + CMatrix* oMatrix = m_signalDecoder->getOutputMatrix(); + double* buffer = oMatrix->getBuffer(); + setSampleBuffer(buffer); + } + boxIO.markInputAsDeprecated(1, i); + } + + //Stimulations + for (uint32_t i = 0; i < boxIO.getInputChunkCount(2); ++i) + { + m_stimulationDecoder->decode(i); + + if (m_stimulationDecoder->isBufferReceived()) + { + IStimulationSet* stimulationSet = m_stimulationDecoder->getOutputStimulationSet(); + for (size_t j = 0; j < stimulationSet->getStimulationCount(); ++j) + { + setStimulation(stimulationSet->getStimulationIdentifier(j), stimulationSet->getStimulationDate(j)); + } + } + + boxIO.markInputAsDeprecated(2, i); + } + + return true; +} + +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCGDFFileWriter.h b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCGDFFileWriter.h new file mode 100644 index 0000000..e49c07f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/box-algorithms/ovpCGDFFileWriter.h @@ -0,0 +1,113 @@ +#pragma once + +#include "../ovp_defines.h" +#include "../ovp_gdf_helpers.h" + +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +/** +* The plugin's main class +* +*/ +class CGDFFileWriter final : public Toolkit::TBoxAlgorithm +{ +public: + + CGDFFileWriter() { } + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(IBoxAlgorithm, OVP_ClassId_GDFFileWriter) + +protected: + void setChannelCount(size_t n); + void setChannelName(size_t index, const char* name); + void setSampleCountPerBuffer(size_t n); + void setSamplingRate(size_t sampling); + void setSampleBuffer(const double* buffer); + + void setExperimentInfo(); + + void setStimulation(const uint64_t identifier, const uint64_t date); + + void saveMatrixData(); + void saveEvents(); + void padByEvents(); + + std::ofstream m_file; + CString m_filename; + + Toolkit::TSignalDecoder* m_signalDecoder = nullptr; + Toolkit::TExperimentInfoDecoder* m_xpInfoDecoder = nullptr; + Toolkit::TStimulationDecoder* m_stimulationDecoder = nullptr; + + //GDF structures + GDF::CFixedGDF1Header m_fixedHeader; + GDF::CVariableGDF1Header m_variableHeader; + + std::vector> m_samples; + std::vector m_nSamples; + + + size_t m_samplesPerChannel = 0; + size_t m_sampling = 0; + + std::vector> m_events; + + bool m_error = false; + double m_precision = 0; // because of GDF writing problem (no scaling) +}; + +/** +* Plugin's description +*/ +class CGDFFileWriterDesc final : public IBoxAlgorithmDesc +{ +public: + CString getName() const override { return CString("GDF file writer"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("This algorithm records on disk what comes from a specific output"); } + CString getDetailedDescription() const override + { + return CString("This algorithm dumps on disk a stream from a specific output in the standard GDF file format"); + } + CString getCategory() const override { return CString("File reading and writing/GDF"); } + CString getVersion() const override { return CString("0.6"); } + CString getStockItemName() const override { return CString("gtk-save"); } + + void release() override { } + CIdentifier getCreatedClass() const override { return OVP_ClassId_GDFFileWriter; } + IPluginObject* create() override { return new CGDFFileWriter(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + // Adds box inputs //swap order of the first two + prototype.addInput("Experiment information", OV_TypeId_ExperimentInfo); + prototype.addInput("Signal", OV_TypeId_Signal); + prototype.addInput("Stimulation", OV_TypeId_Stimulations); + + // Adds box settings + prototype.addSetting("Filename", OV_TypeId_Filename, "record-[$core{date}-$core{time}].gdf"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_GDFFileWriterDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/ovp_defines.h new file mode 100644 index 0000000..1356b86 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/ovp_defines.h @@ -0,0 +1,95 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_GDFFileReader OpenViBE::CIdentifier(0x3EEB1264, 0x4EDFBD9A) +#define OVP_ClassId_GDFFileReaderDesc OpenViBE::CIdentifier(0x2E2543C1, 0x47E3739E) +#define OVP_ClassId_GDFFileWriter OpenViBE::CIdentifier(0x1E7B2155, 0x107289CE) +#define OVP_ClassId_GDFFileWriterDesc OpenViBE::CIdentifier(0x375BF8EC, 0x023ACEEB) +#define OVP_ClassId_GenericStreamReader OpenViBE::CIdentifier(0x0B1D880D, 0x02A17229) +#define OVP_ClassId_GenericStreamReaderDesc OpenViBE::CIdentifier(0x1E8AAB1A, 0x085D72F6) +#define OVP_ClassId_GenericStreamWriter OpenViBE::CIdentifier(0x78EA86B0, 0x2933E255) +#define OVP_ClassId_GenericStreamWriterDesc OpenViBE::CIdentifier(0x02817C77, 0x77FE3D6A) +#define OVP_ClassId_BCICompetitionIIIbReader OpenViBE::CIdentifier(0x0085B814, 0x6E45DA7E) +#define OVP_ClassId_BCICompetitionIIIbReaderDesc OpenViBE::CIdentifier(0x00CC1B39, 0x206A17AE) +#define OVP_ClassId_BoxAlgorithm_CSVFileWriter OpenViBE::CIdentifier(0x2C9312F1, 0x2D6613E5) +#define OVP_ClassId_BoxAlgorithm_CSVFileWriterDesc OpenViBE::CIdentifier(0x65075FF7, 0x2B555E97) +#define OVP_ClassId_BoxAlgorithm_CSVFileReader OpenViBE::CIdentifier(0x641D0717, 0x02884107) +#define OVP_ClassId_BoxAlgorithm_CSVFileReaderDesc OpenViBE::CIdentifier(0x193F22E9, 0x26A67233) + +// Brainamp File +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_Algorithm_BrainampFileReader OpenViBE::CIdentifier(0x2533718F, 0x07AB3AF5) +#define OVP_ClassId_Algorithm_BrainampFileReaderDesc OpenViBE::CIdentifier(0x2C5B2D6C, 0x242253CF) + +#define OVP_ClassId_BoxAlgorithm_BrainampFileReader OpenViBE::CIdentifier(0x61894B28, 0x185E57D2) +#define OVP_ClassId_BoxAlgorithm_BrainampFileReaderDesc OpenViBE::CIdentifier(0x77C650B0, 0x41386F47) + +#define OVP_Algorithm_BrainampFileReader_InputParameterId_Filename OpenViBE::CIdentifier(0x000C486C, 0x477C80B9) +#define OVP_Algorithm_BrainampFileReader_InputParameterId_EpochDuration OpenViBE::CIdentifier(0x002AEE72, 0x288D489E) +#define OVP_Algorithm_BrainampFileReader_InputParameterId_SeekTime OpenViBE::CIdentifier(0x00627156, 0x55790CAE) +#define OVP_Algorithm_BrainampFileReader_InputParameterId_ConvertStimuli OpenViBE::CIdentifier(0x537445DC, 0x6C792A96) +#define OVP_Algorithm_BrainampFileReader_InputParameterId_MarkerDictionaryFilename OpenViBE::CIdentifier(0x1F044ABB, 0x5AACf062) + +#define OVP_Algorithm_BrainampFileReader_OutputParameterId_CurrentStartTime OpenViBE::CIdentifier(0x003CE019, 0x3DADE050) +#define OVP_Algorithm_BrainampFileReader_OutputParameterId_CurrentEndTime OpenViBE::CIdentifier(0x3B87DE16, 0xB8EFB2FB) +#define OVP_Algorithm_BrainampFileReader_OutputParameterId_Sampling OpenViBE::CIdentifier(0x00D3CABB, 0x339326C2) +#define OVP_Algorithm_BrainampFileReader_OutputParameterId_SignalMatrix OpenViBE::CIdentifier(0x0073A91A, 0x6D1D3D26) +#define OVP_Algorithm_BrainampFileReader_OutputParameterId_Stimulations OpenViBE::CIdentifier(0x008F7C49, 0x6ED710A9) + +#define OVP_Algorithm_BrainampFileReader_InputTriggerId_Open OpenViBE::CIdentifier(0x00BCF286, 0x6F5FA2F4) +#define OVP_Algorithm_BrainampFileReader_InputTriggerId_Seek OpenViBE::CIdentifier(0x00C3ACAB, 0x4E3DE014) +#define OVP_Algorithm_BrainampFileReader_InputTriggerId_Next OpenViBE::CIdentifier(0x003CD062, 0x739F973E) +#define OVP_Algorithm_BrainampFileReader_InputTriggerId_Close OpenViBE::CIdentifier(0x003462EA, 0x031FB8FA) + +#define OVP_Algorithm_BrainampFileReader_OutputTriggerId_Error OpenViBE::CIdentifier(0x00B1E3DF, 0x3ABC6C5A) +#define OVP_Algorithm_BrainampFileReader_OutputTriggerId_DataProduced OpenViBE::CIdentifier(0x00E7D5F9, 0x1471AFF2) + +#define OVP_ClassId_BoxAlgorithm_BrainampFileWriter OpenViBE::CIdentifier(0xABACC29F, 0xD5A0E5A8) +#define OVP_ClassId_BoxAlgorithm_BrainampFileWriterDesc OpenViBE::CIdentifier(0x6347C864, 0x8483E2DF) + +// OV Matrix File Reader +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_Algorithm_OVMatrixFileReader OpenViBE::CIdentifier(0x10661A33, 0x0B0F44A7) +#define OVP_ClassId_Algorithm_OVMatrixFileReaderDesc OpenViBE::CIdentifier(0x0E873B5E, 0x0A287FCB) + +#define OVP_Algorithm_OVMatrixFileReader_InputParameterId_Filename OpenViBE::CIdentifier(0x28F87B29, 0x0B09737E) + +#define OVP_Algorithm_OVMatrixFileReader_OutputParameterId_Matrix OpenViBE::CIdentifier(0x2F9521E0, 0x027D789F) + +#define OVP_Algorithm_OVMatrixFileReader_InputTriggerId_Open OpenViBE::CIdentifier(0x2F996376, 0x2A942485) +#define OVP_Algorithm_OVMatrixFileReader_InputTriggerId_Load OpenViBE::CIdentifier(0x22841807, 0x102D681C) +#define OVP_Algorithm_OVMatrixFileReader_InputTriggerId_Close OpenViBE::CIdentifier(0x7FDE77DA, 0x384A0B3D) + +#define OVP_Algorithm_OVMatrixFileReader_OutputTriggerId_Error OpenViBE::CIdentifier(0x6D4F2F4B, 0x05EC6CB9) +#define OVP_Algorithm_OVMatrixFileReader_OutputTriggerId_DataProduced OpenViBE::CIdentifier(0x76F46051, 0x003B6FE8) + +#define OVP_ClassId_Algorithm_OVMatrixFileWriter OpenViBE::CIdentifier(0x739158FC, 0x1E8240CC) +#define OVP_ClassId_Algorithm_OVMatrixFileWriterDesc OpenViBE::CIdentifier(0x44CF6DD0, 0x329D47F9) + +#define OVP_Algorithm_OVMatrixFileWriter_InputParameterId_Filename OpenViBE::CIdentifier(0x330D2D0B, 0x175271E6) +#define OVP_Algorithm_OVMatrixFileWriter_InputParameterId_Matrix OpenViBE::CIdentifier(0x6F6402EE, 0x493044F3) + +// ElectrodeLocalisationFileReader +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_ElectrodeLocalisationFileReader OpenViBE::CIdentifier(0x40704155, 0x19C50E8F) +#define OVP_ClassId_BoxAlgorithm_ElectrodeLocalisationFileReaderDesc OpenViBE::CIdentifier(0x4796613F, 0x653A48D5) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) + +#define OVP_NodeId_OpenViBEStream_Header EBML::CIdentifier(0xF59505AB, 0x3684C8D8) +#define OVP_NodeId_OpenViBEStream_Header_Compression EBML::CIdentifier(0x40358769, 0x166380D1) +#define OVP_NodeId_OpenViBEStream_Header_StreamType EBML::CIdentifier(0x732EC1D1, 0xFE904087) +#define OVP_NodeId_OpenViBEStream_Header_ChannelType OVP_NodeId_OpenViBEStream_Header_StreamType // deprecated old name +#define OVP_NodeId_OpenViBEStream_Buffer EBML::CIdentifier(0x2E60AD18, 0x87A29BDF) +#define OVP_NodeId_OpenViBEStream_Buffer_StreamIndex EBML::CIdentifier(0x30A56D8A, 0xB9C12238) +#define OVP_NodeId_OpenViBEStream_Buffer_ChannelIndex OVP_NodeId_OpenViBEStream_Buffer_StreamIndex // deprecated old name +#define OVP_NodeId_OpenViBEStream_Buffer_StartTime EBML::CIdentifier(0x093E6A0A, 0xC5A9467B) +#define OVP_NodeId_OpenViBEStream_Buffer_EndTime EBML::CIdentifier(0x8B5CCCD9, 0xC5024F29) +#define OVP_NodeId_OpenViBEStream_Buffer_Content EBML::CIdentifier(0x8D4B0BE8, 0x7051265C) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/ovp_gdf_helpers.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/ovp_gdf_helpers.cpp new file mode 100644 index 0000000..0ddaaf1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/ovp_gdf_helpers.cpp @@ -0,0 +1,489 @@ +#include "ovp_gdf_helpers.h" +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +GDF::CFixedGDF1Header::CFixedGDF1Header() +{ + memset(m_PatientID, ' ', sizeof(m_PatientID)); + memset(m_RecordingID, ' ', sizeof(m_RecordingID)); + memset(m_StartDateAndTimeOfRecording, ' ', sizeof(m_StartDateAndTimeOfRecording)); + memset(m_ReservedSerialNumber, ' ', sizeof(m_ReservedSerialNumber)); + + //set version number + memcpy(m_VersionID, "GDF 1.25", 8); + + //subjectId unknown by default + m_PatientID[0] = 'X'; + //sex unknown by default + m_PatientID[17] = 'X'; +} + +bool GDF::CFixedGDF1Header::read(std::ifstream& file) +{ + uint8_t buffer[72]; + + file.read(m_PatientID, sizeof(m_PatientID)); + file.read(m_RecordingID, sizeof(m_RecordingID)); + file.read(m_StartDateAndTimeOfRecording, sizeof(m_StartDateAndTimeOfRecording)); + + file.read(reinterpret_cast(buffer), 72); + + System::Memory::littleEndianToHost(buffer, reinterpret_cast(&m_NBytesInHeaderRecord)); + System::Memory::littleEndianToHost(buffer + 8, &m_EquipmentProviderID); + System::Memory::littleEndianToHost(buffer + 16, &m_LaboratoryID); + System::Memory::littleEndianToHost(buffer + 24, &m_TechnicianID); + + System::Memory::littleEndianToHost(buffer + 52, reinterpret_cast(&m_NDataRecords)); + System::Memory::littleEndianToHost(buffer + 60, &m_DurationDataRecordNum); + System::Memory::littleEndianToHost(buffer + 64, &m_DurationDataRecordDen); + System::Memory::littleEndianToHost(buffer + 68, &m_NSignals); + + return !file.bad(); +} + +bool GDF::CFixedGDF1Header::save(std::ofstream& file) +{ + if (file.is_open()) + { + uint8_t buffer[sizeof(uint64_t)]; + + file.seekp(0, std::ios::beg); + + file.write(m_VersionID, sizeof(m_VersionID)); + file.write(m_PatientID, sizeof(m_PatientID)); + file.write(m_RecordingID, sizeof(m_RecordingID)); + file.write(m_StartDateAndTimeOfRecording, sizeof(m_StartDateAndTimeOfRecording)); + + System::Memory::hostToLittleEndian(uint64_t(m_NBytesInHeaderRecord), buffer); + file.write(reinterpret_cast(buffer), sizeof(int64_t)); + + System::Memory::hostToLittleEndian(uint64_t(m_EquipmentProviderID), buffer); + file.write(reinterpret_cast(buffer), sizeof(uint64_t)); + + System::Memory::hostToLittleEndian(uint64_t(m_LaboratoryID), buffer); + file.write(reinterpret_cast(buffer), sizeof(uint64_t)); + + System::Memory::hostToLittleEndian(uint64_t(m_TechnicianID), buffer); + file.write(reinterpret_cast(buffer), sizeof(uint64_t)); + + file.write(m_ReservedSerialNumber, sizeof(m_ReservedSerialNumber)); + + System::Memory::hostToLittleEndian(uint64_t(m_NDataRecords), buffer); + file.write(reinterpret_cast(buffer), sizeof(int64_t)); + + System::Memory::hostToLittleEndian(m_DurationDataRecordNum, buffer); + file.write(reinterpret_cast(buffer), sizeof(uint32_t)); + + System::Memory::hostToLittleEndian(m_DurationDataRecordDen, buffer); + file.write(reinterpret_cast(buffer), sizeof(uint32_t)); + + System::Memory::hostToLittleEndian(m_NSignals, buffer); + file.write(reinterpret_cast(buffer), sizeof(uint32_t)); + + if (file.bad()) + { + //cout<<"Error while writing to the output file"<(buffer), sizeof(int64_t)); + + file.seekp(std::streamsize(backupPos), std::ios::beg); + + + if (file.bad()) + { + //cout<<"Error while writing to the output file"<(&m_LaboratoryID); + bool blank = true; + for (int i = 0; i < 8 && blank; ++i) { if (temp[i] != 0x20) { blank = false; } } + + if (blank) { return NO_VALUE_I; } + return m_LaboratoryID; +} + +uint64_t GDF::CFixedGDF1Header::getTechnicianID() +{ + uint8_t* temp = reinterpret_cast(&m_TechnicianID); + bool blank = true; + for (int i = 0; i < 8 && blank; ++i) { if (temp[i] != 0x20) { blank = false; } } + + if (blank) { return NO_VALUE_I; } + return m_TechnicianID; +} + +GDF::CFixedGDF2Header::CFixedGDF2Header() +{ + memset(&m_VersionID, 0, sizeof(m_VersionID)); + memset(&m_PatientID, 0, sizeof(m_PatientID)); + memset(&m_Reserved, 0, sizeof(m_Reserved)); + memset(&m_RecordingID, 0, sizeof(m_RecordingID)); + memset(&m_RecordingLocation, 0, sizeof(m_RecordingLocation)); + memset(&m_StartDateAndTimeOfRecording, 0, sizeof(m_StartDateAndTimeOfRecording)); + memset(&m_Birthday, 0, sizeof(m_Birthday)); + memset(&m_Reserved2, 0, sizeof(m_Reserved2)); + memset(&m_IPAdress, 0, sizeof(m_IPAdress)); + memset(&m_HeadSize, 0, sizeof(m_HeadSize)); + memset(&m_PositionReferenceElectrode, 0, sizeof(m_PositionReferenceElectrode)); + memset(&m_GroundElectrode, 0, sizeof(m_GroundElectrode)); +} + +bool GDF::CFixedGDF2Header::read(std::ifstream& oFile) +{ + uint8_t buffer[104]; + + oFile.read(m_PatientID, 66); + + oFile.read(reinterpret_cast(buffer), 14); + m_HealthInformation = buffer[10]; + m_Weight = buffer[11]; + m_Height = buffer[12]; + m_SubjectInfo = buffer[13]; + + oFile.read(m_RecordingID, 64); + + oFile.read(reinterpret_cast(buffer), 102); + + for (int i = 0; i < 4; ++i) { System::Memory::littleEndianToHost(buffer + i * sizeof(uint32_t), &m_RecordingLocation[i]); } + + System::Memory::littleEndianToHost(buffer + 16, &m_StartDateAndTimeOfRecording[0]); + System::Memory::littleEndianToHost(buffer + 20, &m_StartDateAndTimeOfRecording[1]); + + System::Memory::littleEndianToHost(buffer + 24, &m_Birthday[0]); + System::Memory::littleEndianToHost(buffer + 28, &m_Birthday[1]); + + System::Memory::littleEndianToHost(buffer + 32, &m_NBlocksInHeader); + + // +34 patient classification 6 bytes + + System::Memory::littleEndianToHost(buffer + 40, &m_EquipmentProviderID); + + for (int i = 0; i < 6; ++i) { m_IPAdress[i] = buffer[48 + i]; } + + for (int i = 0; i < 3; ++i) + { + System::Memory::littleEndianToHost(buffer + 54 + i * sizeof(uint16_t), &m_HeadSize[i]); + System::Memory::littleEndianToHost(buffer + 60 + i * sizeof(float), &m_PositionReferenceElectrode[i]); + System::Memory::littleEndianToHost(buffer + 72 + i * sizeof(float), &m_GroundElectrode[i]); + } + + System::Memory::littleEndianToHost(buffer + 84, reinterpret_cast(&m_NDataRecords)); + System::Memory::littleEndianToHost(buffer + 92, &m_DurationRecordNum); + System::Memory::littleEndianToHost(buffer + 96, &m_DurationDataRecordDen); + System::Memory::littleEndianToHost(buffer + 100, &m_NSignals); + + return !oFile.bad(); +} + +bool GDF::CFixedGDF2Header::save(std::ofstream& /*file*/) +{ + return false; + //TODO complete + /* + uint8_t buffer[sizeof(uint64_t)]; + file.seekp(0,std::ios::beg); + file<(m_startDateAndTimeOfRecording)); + //time_t startDateAndTimeOfRecordingInSeconds = ((tempDate/2^32) - 719529) * (3600*24); + //tm * startDateAndTimeOfRecording = gmtime(&startDateAndTimeOfRecordingInSeconds); + + //TODO check how date is coded in openvibe Date not good? + //(l_sStartDateAndTimeOfRecording->mon+1)<<8 + (l_sStartDateAndTimeOfRecording->day) + + return NO_VALUE_S; +} + + +//VARIABLE HEADER +GDF::CVariableGDF1Header::CVariableGDF1HeaderPerChannel::CVariableGDF1HeaderPerChannel() +{ + memset(m_Label, ' ', sizeof(m_Label)); + memset(m_TranducerType, ' ', sizeof(m_TranducerType)); + memset(m_PhysicalDimension, ' ', sizeof(m_PhysicalDimension)); + memset(m_PreFiltering, ' ', sizeof(m_PreFiltering)); + memset(m_Reserved, ' ', sizeof(m_Reserved)); +} + +bool GDF::CVariableGDF1Header::update(std::ofstream& file) +{ + if (file.is_open()) + { + uint8_t buffer[sizeof(uint64_t)]; + const uint64_t backupPos = file.tellp(); + + const uint32_t nChannel = m_VariableHeaders.size(); + + file.seekp(0x100 + 104 * nChannel, std::ios::beg); + + for (const auto& i : m_VariableHeaders) + { + System::Memory::hostToLittleEndian(i.m_PhysicalMin, buffer); + file.write(reinterpret_cast(buffer), sizeof(double)); + } + for (const auto& i : m_VariableHeaders) + { + System::Memory::hostToLittleEndian(i.m_PhysicalMax, buffer); + file.write(reinterpret_cast(buffer), sizeof(double)); + } + + for (const auto& i : m_VariableHeaders) + { + System::Memory::hostToLittleEndian(uint64_t(i.m_DigitalMin), buffer); + file.write(reinterpret_cast(buffer), sizeof(int64_t)); + } + + for (const auto& i : m_VariableHeaders) + { + System::Memory::hostToLittleEndian(uint64_t(i.m_DigitalMax), buffer); + file.write(reinterpret_cast(buffer), sizeof(int64_t)); + } + + file.seekp(std::streamsize(backupPos), std::ios::beg); + + if (file.bad()) + { + //cout<<"Error while writing to the output file"<(buffer), sizeof(double)); + } + + for (const auto& i : m_VariableHeaders) + { + System::Memory::hostToLittleEndian(i.m_PhysicalMax, buffer); + file.write(reinterpret_cast(buffer), sizeof(double)); + } + + for (const auto& i : m_VariableHeaders) + { + System::Memory::hostToLittleEndian(uint64_t(i.m_DigitalMin), buffer); + file.write(reinterpret_cast(buffer), sizeof(int64_t)); + } + + for (const auto& i : m_VariableHeaders) + { + System::Memory::hostToLittleEndian(uint64_t(i.m_DigitalMax), buffer); + file.write(reinterpret_cast(buffer), sizeof(int64_t)); + } + + for (const auto& i : m_VariableHeaders) { file.write(i.m_PreFiltering, sizeof(i.m_PreFiltering)); } + + for (const auto& i : m_VariableHeaders) + { + System::Memory::hostToLittleEndian(i.m_NSamplesInEachRecord, buffer); + file.write(reinterpret_cast(buffer), sizeof(uint32_t)); + } + + for (const auto& i : m_VariableHeaders) + { + System::Memory::hostToLittleEndian(i.m_ChannelType, buffer); + file.write(reinterpret_cast(buffer), sizeof(uint32_t)); + } + + for (const auto& i : m_VariableHeaders) { file.write(i.m_Reserved, sizeof(i.m_Reserved)); } + + if (file.bad()) + { + //cout<<"Error while writing to the output file"<(buffer), 256); + + strncpy(m_Header1.versionID, (char*)&buffer[0], 8); + strncpy(m_Header1.patientID, (char*)&buffer[8], 66); + + m_Header1.healthInfo = buffer[84]; + m_Header1.weight = buffer[85]; + m_Header1.height = buffer[86]; + m_Header1.subjectInfo = buffer[87]; + + strncpy(m_Header1.recordingID, (char*)&buffer[88], 64); + + for (int i = 0; i < 4; ++i) { System::Memory::littleEndianToHost(buffer + 152 + i * sizeof(uint32_t), &m_Header1.recordingLocation[i]); } + + System::Memory::littleEndianToHost(buffer + 168, &m_Header1.startDateAndTimeOfRecording[0]); + System::Memory::littleEndianToHost(buffer + 172, &m_Header1.startDateAndTimeOfRecording[1]); + + System::Memory::littleEndianToHost(buffer + 176, &m_Header1.birthday[0]); + System::Memory::littleEndianToHost(buffer + 180, &m_Header1.birthday[1]); + + System::Memory::littleEndianToHost(buffer + 184, &m_Header1.headerLength); + + // +34 patient classification 6 bytes + + System::Memory::littleEndianToHost(buffer + 192, &m_Header1.equipmentProviderID); + + for (int i = 0; i < 6; ++i) { m_Header1.reserved1[i] = buffer[200 + i]; } + + for (int i = 0; i < 3; ++i) + { + System::Memory::littleEndianToHost(buffer + 206 + i * sizeof(uint16_t), &m_Header1.headSize[i]); + System::Memory::littleEndianToHost(buffer + 212 + i * sizeof(float), &m_Header1.positionReferenceElectrode[i]); + System::Memory::littleEndianToHost(buffer + 224 + i * sizeof(float), &m_Header1.groundElectrode[i]); + } + + System::Memory::littleEndianToHost(buffer + 236, reinterpret_cast(&m_Header1.nDataRecords)); + System::Memory::littleEndianToHost(buffer + 244, &m_Header1.duration); + System::Memory::littleEndianToHost(buffer + 252, &m_Header1.nSignals); + + System::Memory::littleEndianToHost(buffer + 254, &m_Header1.reserved2); + + if (oFile.bad()) { return false; } + return true; +} + +bool GDF::CFixedGDF251Header::save(std::ofstream& /*file*/) +{ + return false; + //TODO complete + /* + uint8_t tempBuffer[sizeof(uint64_t)]; + file.seekp(0,std::ios::beg); + file << m_VersionId << m_PatientId; + */ +} + +std::string GDF::CFixedGDF251Header::getSubjectName() +{ + // extracts the PID and Patient name from the m_sPatientId + char* token = strtok(m_Header1.patientID, " "); + if (token) { token = strtok(nullptr, " "); } //The PId is not a numerical value in GDF, it is useless for us + if (token) { return token; } + return NO_VALUE_S; +} + +std::string GDF::CFixedGDF251Header::getExperimentDate() +{ + //computes the experiment date + //uint64_t tempDate= *(reinterpret_cast(m_startDateAndTimeOfRecording)); + + //time_t startDateAndTimeOfRecordingInSeconds = ((tempDate/2^32) - 719529) * (3600*24); + //tm * startDateAndTimeOfRecording = gmtime(&startDateAndTimeOfRecordingInSeconds); + + //TODO check how date is coded in openvibe Date not good? + //(startDateAndTimeOfRecording->mon+1)<<8 + (startDateAndTimeOfRecording->day) + + return NO_VALUE_S; +} +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/ovp_gdf_helpers.h b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/ovp_gdf_helpers.h new file mode 100644 index 0000000..6538c86 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/ovp_gdf_helpers.h @@ -0,0 +1,346 @@ +#pragma once + +#include + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +#define NO_VALUE_I 0xffffffff +#define NO_VALUE_S "_unspecified_" + +/** + * Useful classes for GDF file format handling +*/ +class GDF +{ +public: + + class CFixedGDFHeader + { + public: + virtual ~CFixedGDFHeader() {} + + virtual bool read(std::ifstream& file) = 0; + + virtual bool save(std::ofstream& file) = 0; + virtual bool update(std::ofstream& file) = 0; + + virtual uint64_t getSubjectID() { return NO_VALUE_I; } + virtual std::string getSubjectName() { return NO_VALUE_S; } + virtual uint64_t getSubjectSex() { return NO_VALUE_I; } + virtual uint64_t getSubjectAge() { return NO_VALUE_I; } + virtual uint64_t getExperimentID() { return NO_VALUE_I; } + virtual std::string getExperimentDate() { return NO_VALUE_S; } + virtual uint64_t getLaboratoryID() { return NO_VALUE_I; } + virtual uint64_t getTechnicianID() { return NO_VALUE_I; } + virtual std::string getLaboratoryName() { return NO_VALUE_S; } + virtual std::string getTechnicianName() { return NO_VALUE_S; } + + virtual double getDataRecordDuration() = 0; + virtual uint64_t getNDataRecords() = 0; + virtual size_t getChannelCount() = 0; + }; + + /** + * An helper class to manipulate GDF1 fixed-size headers + */ + class CFixedGDF1Header final : public CFixedGDFHeader + { + public: + CFixedGDF1Header(); + ~CFixedGDF1Header() override {} + + /** + * Reads a GDF1 fixed Header from a file + * \param file The input file. + * \return true if the operation was successful + */ + bool read(std::ifstream& file) override; + + /** + * Saves a GDF1 fixed Header in a file + * \param file The output file. + * \return true if the operation was successful + */ + bool save(std::ofstream& file) override; + + /** + * Updates the number of data records field in + * a GDF1 fixed Header in a file + * \param file The output file. + * \return true if the operation was successful + */ + bool update(std::ofstream& file) override; + + std::string getSubjectName() override; + uint64_t getLaboratoryID() override; + uint64_t getTechnicianID() override; + + double getDataRecordDuration() override { return double(m_DurationDataRecordNum) / double(m_DurationDataRecordDen); } + uint64_t getNDataRecords() override { return m_NDataRecords; } + size_t getChannelCount() override { return m_NSignals; } + + char m_VersionID[8]; + char m_PatientID[80]; + char m_RecordingID[80]; + char m_StartDateAndTimeOfRecording[16]; + int64_t m_NBytesInHeaderRecord = 0; + uint64_t m_EquipmentProviderID = 0; + uint64_t m_LaboratoryID = 0; + uint64_t m_TechnicianID = 0; + char m_ReservedSerialNumber[20]; + int64_t m_NDataRecords = 0; + uint32_t m_DurationDataRecordNum = 0; + uint32_t m_DurationDataRecordDen = 0; + uint32_t m_NSignals = 0; + }; + + /** + * An helper class to manipulate GDF2 fixed-size headers + */ + class CFixedGDF2Header final : public CFixedGDFHeader + { + public: + + CFixedGDF2Header(); + ~CFixedGDF2Header() override {} + + /** + * Reads a GDF2 fixed Header from a file + * \param oFile The input file. + * \return true if the operation was successful + */ + bool read(std::ifstream& oFile) override; + + /** + * Saves a GDF2 fixed Header in a file + * \param file The output file. + * \return true if the operation was successful + */ + bool save(std::ofstream& file) override; + + /** + * Updates the number of data records field in + * a GDF2 fixed Header in a file + * \param file The output file. + * \return true if the operation was successful + */ + bool update(std::ofstream& file) override { return true; } + + std::string getExperimentDate() override; + std::string getSubjectName() override; + uint64_t getSubjectSex() override { return m_SubjectInfo & 0x03; } + + uint64_t getSubjectAge() override { return uint64_t(std::floor(double((m_StartDateAndTimeOfRecording[1] - m_Birthday[1]) / 365.242189813))); } + + double getDataRecordDuration() override { return double(m_DurationRecordNum) / double(m_DurationDataRecordDen); } + uint64_t getNDataRecords() override { return m_NDataRecords; } + size_t getChannelCount() override { return m_NSignals; } + + char m_VersionID[8]; + char m_PatientID[66]; + + uint8_t m_Reserved[10]; + uint8_t m_HealthInformation = 0; //smoking... + uint8_t m_Weight = 0; + uint8_t m_Height = 0; + uint8_t m_SubjectInfo = 0;//gender... + + char m_RecordingID[64]; + uint32_t m_RecordingLocation[4]; + uint32_t m_StartDateAndTimeOfRecording[2]; + uint32_t m_Birthday[2]; + uint16_t m_NBlocksInHeader = 0; + uint8_t m_Reserved2[6]; + uint64_t m_EquipmentProviderID = 0; + uint8_t m_IPAdress[6]; + uint16_t m_HeadSize[3]; + float m_PositionReferenceElectrode[3]; + float m_GroundElectrode[3]; + int64_t m_NDataRecords = 0; + uint32_t m_DurationRecordNum = 0; + uint32_t m_DurationDataRecordDen = 0; + uint16_t m_NSignals = 0; + uint16_t m_Reserved3 = 0; + }; + + + /** + * An helper class to manipulate GDF2.51 fixed-size headers + */ + class CFixedGDF251Header final : public CFixedGDFHeader + { + public: + + CFixedGDF251Header() { memset(&m_Header1, 0, sizeof(m_Header1)); } + ~CFixedGDF251Header() override {} + + /** + * Reads a GDF2 fixed Header from a file + * \param oFile The input file. + * \return true if the operation was successful + */ + bool read(std::ifstream& oFile) override; + + /** + * Saves a GDF2 fixed Header in a file + * \param file The output file. + * \return true if the operation was successful + */ + bool save(std::ofstream& file) override; + + /** + * Updates the number of data records field in + * a GDF2 fixed Header in a file + * \param file The output file. + * \return true if the operation was successful + */ + bool update(std::ofstream& file) override { return true; } + + std::string getExperimentDate() override; + std::string getSubjectName() override; + uint64_t getSubjectSex() override { return m_Header1.subjectInfo & 0x03; } + + uint64_t getSubjectAge() override + { + return uint64_t(floor(double((m_Header1.startDateAndTimeOfRecording[1] - m_Header1.birthday[1]) / 365.242189813))); + } + + double getDataRecordDuration() override { return m_Header1.duration; } + uint64_t getNDataRecords() override { return m_Header1.nDataRecords; } + size_t getChannelCount() override { return m_Header1.nSignals; } + + struct SGDFFixedHeader1 + { + char versionID[8]; + char patientID[66]; + + uint8_t reserved[10]; + uint8_t healthInfo; //smoking... + uint8_t weight; + uint8_t height; + uint8_t subjectInfo;//gender... + + char recordingID[64]; + uint32_t recordingLocation[4]; + uint32_t startDateAndTimeOfRecording[2]; + uint32_t birthday[2]; + uint16_t headerLength; + char patientClassification[6]; + uint64_t equipmentProviderID; + uint8_t reserved1[6]; + uint16_t headSize[3]; + float positionReferenceElectrode[3]; + float groundElectrode[3]; + int64_t nDataRecords; + double duration; // Not double in the 2.51 spec document at the time of writing this, but seems to be so in practice? + uint16_t nSignals; + uint16_t reserved2; + }; + + SGDFFixedHeader1 m_Header1; + }; + + /** + * Base class for GDF file's variable headers + */ + class CVariableGDFHeader + { + public: + virtual ~CVariableGDFHeader() { } + virtual bool save(std::ofstream& file) = 0; + }; + + /** + * GDF1 variable header class + */ + class CVariableGDF1Header final : public CVariableGDFHeader + { + //! Stores information for one channel + class CVariableGDF1HeaderPerChannel + { + public: + + CVariableGDF1HeaderPerChannel(); + + char m_Label[16]; + char m_TranducerType[80]; + char m_PhysicalDimension[8]; + double m_PhysicalMin = 0; + double m_PhysicalMax = 0; + int64_t m_DigitalMin = 0; + int64_t m_DigitalMax = 0; + char m_PreFiltering[80]; + uint32_t m_NSamplesInEachRecord = 0; + uint32_t m_ChannelType = 0; + char m_Reserved[32]; + }; + + public: + ~CVariableGDF1Header() override {} + + /** + * Saves a GDF1 variable Header in a file + * \param file The output file. + * \return true if the operation was successful + */ + bool save(std::ofstream& file) override; + + /** + * Updates the Physical/digital Min/max fields in + * a GDF1 variable Header in a file + * \param file The output file. + * \return true if the operation was successful + */ + bool update(std::ofstream& file); + + /** + * Sets the number of channels in the file. + * \param nChannel Number of channels. + */ + void setChannelCount(const uint32_t nChannel) { m_VariableHeaders.resize(nChannel); } + + CVariableGDF1HeaderPerChannel& operator[](const uint32_t channel) { return m_VariableHeaders[channel]; } + + std::vector m_VariableHeaders; + }; + + + class CGDFEvent + { + public: + uint32_t m_Position = 0; + uint16_t m_Type = 0; + }; + + enum EChannelType + { + ChannelType_int8_t = 1, + ChannelType_uint8_t = 2, + ChannelType_int16_t = 3, + ChannelType_uint16_t = 4, + ChannelType_int32_t = 5, + ChannelType_uint32_t = 6, + ChannelType_int64_t = 7, + ChannelType_uint64_t = 8, + ChannelType_float = 16, + ChannelType_double = 17, + ChannelType_float128 = 18, + ChannelType_int24 = 279, + ChannelType_uint24 = 535 + }; + + /** + * Gets the data size in bytes of the GDF data type + * \param channelType The GDF type + * \return The size in bytes of this GDF type's data + */ + static uint16_t GDFDataSize(uint32_t channelType); +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/ovp_main.cpp new file mode 100644 index 0000000..bdead22 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/src/ovp_main.cpp @@ -0,0 +1,36 @@ +#include "ovp_defines.h" +#include "box-algorithms/ovpCGDFFileReader.h" +#include "box-algorithms/ovpCGDFFileWriter.h" +#include "box-algorithms/ovpCBCICompetitionIIIbReader.h" + +#include "algorithms/brainamp/ovpCAlgorithmBrainampFileReader.h" + +#include "box-algorithms/brainamp/ovpCBoxAlgorithmBrainampFileReader.h" +#include "box-algorithms/brainamp/ovpCBoxAlgorithmBrainampFileWriter.h" + +#include "box-algorithms/bci2000reader/ovpCBoxAlgorithmBCI2000Reader.h" + +#include "box-algorithms/ovpCBoxAlgorithmSignalConcatenation.h" + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +OVP_Declare_Begin() + context.getTypeManager().registerEnumerationEntry(OV_TypeId_BoxAlgorithmFlag, OV_AttributeId_Box_FlagIsUnstable.toString(), + OV_AttributeId_Box_FlagIsUnstable.id()); + + OVP_Declare_New(CGDFFileReaderDesc) + OVP_Declare_New(CGDFFileWriterDesc) + OVP_Declare_New(CBCICompetitionIIIbReaderDesc) + OVP_Declare_New(CAlgorithmBrainampFileReaderDesc) + OVP_Declare_New(CBoxAlgorithmBrainampFileReaderDesc) + OVP_Declare_New(CBoxAlgorithmBrainampFileWriterDesc) + OVP_Declare_New(CBoxAlgorithmBCI2000ReaderDesc) + OVP_Declare_New(CBoxAlgorithmSignalConcatenationDesc) + +OVP_Declare_End() + +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/DartTestfile.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/DartTestfile.txt new file mode 100644 index 0000000..19ded1d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/DartTestfile.txt @@ -0,0 +1,107 @@ + +IF(WIN32) + SET(EXT cmd) + SET(OS_FLAGS "--no-pause") +ELSE() + SET(EXT sh) + SET(OS_FLAGS "") +ENDIF() + + +############ + +SET(TEST_NAME gdfreader) +SET(SCENARIO_TO_TEST "${TEST_NAME}-test.xml") + +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "output_gdf*.csv") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" ${SCENARIO_TO_TEST}) +ADD_TEST(compare_${TEST_NAME}_125 "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "output_gdf125.csv" "test_gdfX.ref.csv" 0.0001) +ADD_TEST(compare_${TEST_NAME}_211 "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "output_gdf211.csv" "test_gdfX.ref.csv" 0.0001) +ADD_TEST(compare_${TEST_NAME}_221 "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "output_gdf221.csv" "test_gdfX.ref.csv" 0.0001) +ADD_TEST(compare_${TEST_NAME}_222 "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "output_gdf222.csv" "test_gdfX.ref.csv" 0.0001) + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_CONFIG_SUBDIR}) + +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_125 PROPERTIES ATTACHED_FILES_ON_FAIL "output_gdf125.csv") +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_211 PROPERTIES ATTACHED_FILES_ON_FAIL "output_gdf211.csv") +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_221 PROPERTIES ATTACHED_FILES_ON_FAIL "output_gdf221.csv") +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_222 PROPERTIES ATTACHED_FILES_ON_FAIL "output_gdf222.csv") + +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_125 PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_211 PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_221 PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_222 PROPERTIES DEPENDS run_${TEST_NAME}) + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) + +############## + +SET(TEST_NAME ov-read-write) +SET(SCENARIO_TO_TEST "${TEST_NAME}-test.xml") + +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "output_ov.ov") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" ${SCENARIO_TO_TEST}) +ADD_TEST(compare_${TEST_NAME} "git" "diff" "--no-index" "../signals/bci-motor-imagery.ov" "output_ov.ov") + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}) + +############# + +SET(TEST_NAME csv-read-write) +SET(SCENARIO_TO_TEST "${TEST_NAME}-test.xml") + +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "output_signal.csv" "output_streamedmatrix.csv" "output_stimulation.csv" "output_spectrum.csv" "output_features.csv") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" ${SCENARIO_TO_TEST}) +ADD_TEST(compare_${TEST_NAME}_signal "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "input_signal.csv" "output_signal.csv" 0.0001) +ADD_TEST(compare_${TEST_NAME}_matrix "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "input_streamedmatrix.csv" "output_streamedmatrix.csv" 0.0001) +ADD_TEST(compare_${TEST_NAME}_stimulation "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "input_stimulation.csv" "output_stimulation.csv" 0.0001) +ADD_TEST(compare_${TEST_NAME}_spectrum "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "input_spectrum.csv" "output_spectrum.csv" 0.0001) +ADD_TEST(compare_${TEST_NAME}_features "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "input_features.csv" "output_features.csv" 0.0001) + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_signal PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_matrix PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_stimulation PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_spectrum PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_features PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_signal PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_matrix PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_stimulation PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_spectrum PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME}_features PROPERTIES DEPENDS run_${TEST_NAME}) + +################### + +# +# This test basically first writes test data to CSV "1", then CSV "1" to GDF (test 'GDF Writer'), then GDF to CSV "2" (test 'GDF Reader'). +# Finally, the CSV "1" and CSV "2" are compared for equality, both for signals and stimulations. +# +# We use CSV because of the float scaling in the GDF Writer and Reader, we don't seem to be able to maintain bitwise equality between read and write? +# + +SET(TEST_NAME gdf-readwrite) + +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "output*.csv" "output*.gdf") +ADD_TEST(run_${TEST_NAME}-1 "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" "test-gdf-readwrite-1.xml") +ADD_TEST(run_${TEST_NAME}-2 "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" "test-gdf-readwrite-2.xml") +ADD_TEST(run_${TEST_NAME}-3 "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" "test-gdf-readwrite-3.xml") + +ADD_TEST(compare_${TEST_NAME}-signal "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "output_gdf_signal_1.csv" "output_gdf_signal_2.csv" 0.001) + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) + +SET_TESTS_PROPERTIES(compare_${TEST_NAME}-signal PROPERTIES ATTACHED_FILES_ON_FAIL "output_gdf_signal_1.csv" "output_gdf_signal_2.csv") + +SET_TESTS_PROPERTIES(run_${TEST_NAME}-1 PROPERTIES DEPENDS clean_${TEST_NAME}) +SET_TESTS_PROPERTIES(run_${TEST_NAME}-2 PROPERTIES DEPENDS run_${TEST_NAME}-1) +SET_TESTS_PROPERTIES(run_${TEST_NAME}-3 PROPERTIES DEPENDS run_${TEST_NAME}-2) +SET_TESTS_PROPERTIES(compare_${TEST_NAME}-signal PROPERTIES DEPENDS run_${TEST_NAME}-3) +SET_TESTS_PROPERTIES(compare_${TEST_NAME}-stim PROPERTIES DEPENDS run_${TEST_NAME}-3) + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/csv-read-write-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/csv-read-write-test.xml new file mode 100644 index 0000000..e6f0671 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/csv-read-write-test.xml @@ -0,0 +1,907 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x000006ae, 0x0000572d) + Matrix + (0x336a3d9a, 0x753f1ba4) + + + (0x544a003e, 0x6dcba5f6) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/input_streamedmatrix.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 144 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x000006ae, 0x0000572e) + Signal + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/input_signal.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x000006ae, 0x0000572f) + Stimulation + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/input_stimulation.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x000006ae, 0x00005730) + Features + (0x336a3d9a, 0x753f1ba4) + + + (0x17341935, 0x152ff448) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/input_features.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x000006ae, 0x00005731) + Spectrum + (0x336a3d9a, 0x753f1ba4) + + + (0x1f261c0a, 0x593bf6bd) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/input_spectrum.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x000015a8, 0x000079e9) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 192 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01165f9f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003a8c, 0x0000355b) + Matrix + (0x428375e8, 0x325f2db9) + + + (0x544a003e, 0x6dcba5f6) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/output_streamedmatrix.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 144 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00003a8c, 0x0000355c) + Signal + (0x428375e8, 0x325f2db9) + + + (0x5ba36127, 0x195feae1) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/output_signal.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00003a8c, 0x0000355d) + Stimulation + (0x428375e8, 0x325f2db9) + + + (0x5ba36127, 0x195feae1) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/output_stimulation.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00003a8c, 0x0000355e) + Features + (0x428375e8, 0x325f2db9) + + + (0x17341935, 0x152ff448) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/output_features.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00003a8c, 0x0000355f) + Spectrum + (0x428375e8, 0x325f2db9) + + + (0x1f261c0a, 0x593bf6bd) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/output_spectrum.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00005b5f, 0x000050b0) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 2 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 192 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017178bd) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00001a66, 0x00001ca2) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x000015a8, 0x000079e9) + 0 + + + + (0x0000228a, 0x00005c69) + + (0x000006ae, 0x00005731) + 0 + + + (0x00003a8c, 0x0000355f) + 0 + + + + (0x000026d4, 0x0000446f) + + (0x000006ae, 0x0000572d) + 0 + + + (0x00003a8c, 0x0000355b) + 0 + + + + (0x00003059, 0x00004d29) + + (0x000006ae, 0x0000572e) + 0 + + + (0x00005b5f, 0x000050b0) + 0 + + + + (0x00003294, 0x000077db) + + (0x000006ae, 0x0000572e) + 0 + + + (0x00003a8c, 0x0000355c) + 0 + + + + (0x0000443e, 0x00000b95) + + (0x000006ae, 0x0000572f) + 1 + + + (0x00003a8c, 0x0000355d) + 1 + + + + (0x00004485, 0x00005832) + + (0x000006ae, 0x0000572e) + 1 + + + (0x00003a8c, 0x0000355c) + 1 + + + + (0x000048d1, 0x000070a5) + + (0x000006ae, 0x0000572f) + 0 + + + (0x00003a8c, 0x0000355d) + 0 + + + + (0x00004c9f, 0x00001706) + + (0x000006ae, 0x0000572d) + 1 + + + (0x00003a8c, 0x0000355b) + 1 + + + + (0x000060d4, 0x00007d87) + + (0x000006ae, 0x00005731) + 1 + + + (0x00003a8c, 0x0000355f) + 1 + + + + (0x00006a3b, 0x000070cd) + + (0x000006ae, 0x00005730) + 0 + + + (0x00003a8c, 0x0000355e) + 0 + + + + (0x00006ac9, 0x00007e1b) + + (0x000006ae, 0x00005730) + 1 + + + (0x00003a8c, 0x0000355e) + 1 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x000057d8, 0x00005097)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000019df, 0x000079ec)","index":0,"name":"Default tab","parentIdentifier":"(0x000057d8, 0x00005097)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000062c0, 0x00001744)","index":0,"name":"Empty","parentIdentifier":"(0x000019df, 0x000079ec)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + 0.1 + + + (0x9f5c4075, 0x4a0d3666) + Tiny CSV IO test + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/gdfreader-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/gdfreader-test.xml new file mode 100755 index 0000000..e893558 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/gdfreader-test.xml @@ -0,0 +1,826 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00000bef, 0x000059d0) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 3 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x010de8e3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000018b6, 0x0000159f) + v2.11 + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/test_gdf211.gdf + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00db711d) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00004b9d, 0x00001aed) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00aaf6d7) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000055b7, 0x000053cf) + v1.25 + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/test_gdf125.gdf + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00df607a) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00006988, 0x0000041a) + v2.21 + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/test_gdf221.gdf + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d44217) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00007aef, 0x00004f33) + v2.22 + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/test_gdf222.gdf + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d94a8a) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00007d82, 0x00007640) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x5ba36127, 0x195feae1) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/output_gdf125.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00007d82, 0x00007641) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x5ba36127, 0x195feae1) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/output_gdf211.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00007d82, 0x00007642) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x5ba36127, 0x195feae1) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/output_gdf221.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00007d82, 0x00007643) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x5ba36127, 0x195feae1) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/output_gdf222.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + + + (0x0000082d, 0x00001d73) + + (0x000018b6, 0x0000159f) + 2 + + + (0x00007d82, 0x00007641) + 1 + + + + (0x00000b09, 0x00007192) + + (0x00000bef, 0x000059d0) + 0 + + + (0x00004b9d, 0x00001aed) + 0 + + + + (0x000018b9, 0x00004aa6) + + (0x00006988, 0x0000041a) + 2 + + + (0x00007d82, 0x00007642) + 1 + + + + (0x00001e40, 0x00006583) + + (0x00007aef, 0x00004f33) + 1 + + + (0x00007d82, 0x00007643) + 0 + + + + (0x000022f7, 0x00004240) + + (0x00006988, 0x0000041a) + 1 + + + (0x00007d82, 0x00007642) + 0 + + + + (0x000045f4, 0x00000160) + + (0x000018b6, 0x0000159f) + 1 + + + (0x00007d82, 0x00007641) + 0 + + + + (0x00004b65, 0x00002eeb) + + (0x00007aef, 0x00004f33) + 2 + + + (0x00007d82, 0x00007643) + 1 + + + + (0x000063fb, 0x00007e28) + + (0x00007aef, 0x00004f33) + 1 + + + (0x00000bef, 0x000059d0) + 0 + + + + (0x0000703e, 0x00002213) + + (0x000055b7, 0x000053cf) + 1 + + + (0x00007d82, 0x00007640) + 0 + + + + (0x000076aa, 0x000011d8) + + (0x000055b7, 0x000053cf) + 2 + + + (0x00007d82, 0x00007640) + 1 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00006030, 0x00000f42)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000313c, 0x00002a2c)","index":0,"name":"Default tab","parentIdentifier":"(0x00006030, 0x00000f42)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00001d70, 0x00007959)","index":0,"name":"Empty","parentIdentifier":"(0x0000313c, 0x00002a2c)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_features.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_features.csv new file mode 100644 index 0000000..69cafd2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_features.csv @@ -0,0 +1,18 @@ +Time:128,End Time,Feature 1,Feature 2,Feature 3,Feature 4,Feature 5,Feature 6,Feature 7,Feature 8,Feature 9,Feature 10,Feature 11,Feature 12,Feature 13,Feature 14,Feature 15,Feature 16,Feature 17,Feature 18,Feature 19,Feature 20,Feature 21,Feature 22,Feature 23,Feature 24,Feature 25,Feature 26,Feature 27,Feature 28,Feature 29,Feature 30,Feature 31,Feature 32,Feature 33,Feature 34,Feature 35,Feature 36,Feature 37,Feature 38,Feature 39,Feature 40,Feature 41,Feature 42,Feature 43,Feature 44,Feature 45,Feature 46,Feature 47,Feature 48,Feature 49,Feature 50,Feature 51,Feature 52,Feature 53,Feature 54,Feature 55,Feature 56,Feature 57,Feature 58,Feature 59,Feature 60,Feature 61,Feature 62,Feature 63,Feature 64,Feature 65,Feature 66,Feature 67,Feature 68,Feature 69,Feature 70,Feature 71,Feature 72,Feature 73,Feature 74,Feature 75,Feature 76,Feature 77,Feature 78,Feature 79,Feature 80,Feature 81,Feature 82,Feature 83,Feature 84,Feature 85,Feature 86,Feature 87,Feature 88,Feature 89,Feature 90,Feature 91,Feature 92,Feature 93,Feature 94,Feature 95,Feature 96,Feature 97,Feature 98,Feature 99,Feature 100,Feature 101,Feature 102,Feature 103,Feature 104,Feature 105,Feature 106,Feature 107,Feature 108,Feature 109,Feature 110,Feature 111,Feature 112,Feature 113,Feature 114,Feature 115,Feature 116,Feature 117,Feature 118,Feature 119,Feature 120,Feature 121,Feature 122,Feature 123,Feature 124,Feature 125,Feature 126,Feature 127,Feature 128,Event Id,Event Date,Event Duration +0.0000000000,0.0625000000,0.9150401743,0.4811181261,0.3270198377,0.5677587804,0.6008879130,0.4594295069,0.9683563458,0.9237891452,0.6234010095,0.3943255635,0.1078882546,0.7703306261,0.4436719313,0.5963131711,0.8457938042,0.7697275821,0.1224962058,0.2942006958,0.3322500831,0.1957253930,0.8843127992,0.6843187027,0.0202652202,0.4722963301,0.4688845898,0.1204221966,0.2920070603,0.0136039553,0.3520280039,0.2942418712,0.3035306910,0.8325346666,0.9609172817,0.0104033500,0.0263926589,0.1405701390,0.7096184031,0.5244539923,0.2770567578,0.7812710993,0.5509694435,0.6511558010,0.3719114196,0.9334457631,0.6669613710,0.1781126887,0.6620289299,0.5446313645,0.7266302956,0.6071571249,0.2124527053,0.4550076595,0.2073630942,0.6185337363,0.8098701322,0.2309543816,0.2571739866,0.0520775544,0.7355189007,0.1756549818,0.9616618126,0.7363008480,0.3561839175,0.5510980606,0.1079077483,0.2530346524,0.9616484421,0.8257251270,0.2381781549,0.6019684391,0.1800098317,0.1080955642,0.7040383117,0.2248865000,0.6234477691,0.0139408493,0.2314087460,0.9015386207,0.7469868043,0.6854385771,0.2908902564,0.3183208159,0.0725899180,0.5165314688,0.9643655850,0.2425120859,0.2801719103,0.9638599560,0.7913161502,0.4822022554,0.2669679758,0.5830120395,0.0362575694,0.6503971543,0.6601394096,0.7553155958,0.9625892541,0.1341326726,0.9030513861,0.7376232534,0.4091226382,0.6322228035,0.7557409701,0.0074960447,0.5686108500,0.7780390326,0.9779995524,0.9047688977,0.9270175146,0.5955350271,0.9939954386,0.6388499700,0.0514186502,0.7003326518,0.9912988800,0.8182061038,0.7358734147,0.1599401447,0.2078533825,0.3056119722,0.1885718242,0.6487491305,0.9024340464,0.1728633228,0.4749805466,0.8944157818,0.3802370790,0.7541875427,,, +0.0625000000,0.1250000000,0.0002188140,0.8772717209,0.3606892761,0.5398562176,0.7957881822,0.2072246694,0.4904013139,0.1879513119,0.4810618665,0.1884347722,0.6153136939,0.0060567823,0.5914203583,0.1635175874,0.1282500087,0.6690062552,0.4333964835,0.4393781326,0.8056489513,0.8371359503,0.5145648201,0.4930421701,0.9483721592,0.7320511597,0.9446009332,0.2511601027,0.7567554591,0.3995047919,0.2119971917,0.5619104635,0.3209558069,0.3994497685,0.2659510621,0.1411809402,0.2320605463,0.3951107827,0.8734684635,0.2177591978,0.6586741989,0.0905212164,0.4448799966,0.8183233663,0.5589947104,0.8298795142,0.0523792338,0.6213727167,0.5110420675,0.2973528120,0.0880499484,0.6030983937,0.9991942968,0.6462430845,0.4685987504,0.1664709675,0.2175688986,0.5616701324,0.8587621097,0.2097194686,0.4954351890,0.7566679085,0.6194891455,0.3250324409,0.9993752704,0.7441636086,0.8143050948,0.7892000738,0.4020759331,0.8094227451,0.2071565455,0.7109043736,0.5762489510,0.2114944896,0.1201506448,0.9750412148,0.4196001196,0.5415642960,0.7046394304,0.8290748592,0.3493948136,0.5918792526,0.8979278051,0.8812638978,0.7123604133,0.2330470863,0.5489626734,0.4752553189,0.5313347597,0.3452652521,0.7386898657,0.8911155504,0.4246511299,0.4815980867,0.3539443654,0.3755141124,0.4571281332,0.5383569482,0.9075943392,0.9327698306,0.6012928928,0.8299281336,0.9498681091,0.7622836907,0.2522612389,0.9825163295,0.9775539900,0.1567203708,0.7720564199,0.0502300083,0.3994364436,0.7848045905,0.0519165159,0.2335758472,0.7675638278,0.7222367716,0.1512625844,0.4192842636,0.5601439243,0.0228915771,0.3806940543,0.1468547867,0.3395443982,0.8960902914,0.7770912084,0.2656531946,0.8409491007,0.9518510897,0.6433402253,0.8672073730,,, +0.1250000000,0.1875000000,0.9109746008,0.9951207868,0.9262504610,0.2658244669,0.3371013603,0.2565388617,0.5173902859,0.1193734836,0.1775141452,0.8373892347,0.2898682340,0.9133129963,0.3481886350,0.1292222657,0.6257697267,0.5984036394,0.6149821568,0.2147628649,0.2947771698,0.3186730528,0.3558874619,0.8471703667,0.3808981238,0.6025348732,0.9888811563,0.5176699143,0.3514636005,0.6350323940,0.4326295485,0.7214585626,0.5881812049,0.6552316907,0.1431231180,0.0807242109,0.6860684799,0.8255885830,0.7974937786,0.0962283872,0.2619708159,0.1721746940,0.5158856388,0.8052386078,0.8466840037,0.6106764129,0.2006450845,0.4449324410,0.9440194790,0.1747042947,0.4824103422,0.2247444578,0.8581037289,0.4151061061,0.3349399418,0.4581822553,0.8213987367,0.4574069346,0.3249664013,0.6434680552,0.4386946510,0.3380722699,0.7685454728,0.9110118113,0.3662476337,0.0099736366,0.6282859237,0.8222235716,0.7562664633,0.0917348247,0.1025254172,0.3778344996,0.5110897899,0.2011987264,0.7183543080,0.1799440407,0.5106148846,0.8367626460,0.9573242795,0.4191983964,0.9073516545,0.1400522341,0.1674538185,0.1011095943,0.5204614545,0.0016235472,0.0303488139,0.6493480904,0.4683168104,0.5442108936,0.5139667864,0.6648385972,0.8003245771,0.8132813687,0.3622289621,0.2761762389,0.6235042040,0.7084571763,0.2957481982,0.0707940585,0.1672060185,0.5039413068,0.6104181844,0.0189933903,0.6308445318,0.2409209677,0.7020495255,0.9159986004,0.1108249349,0.9589245564,0.2907738546,0.4996006321,0.7271039351,0.7366086682,0.1463178939,0.8085784663,0.8136159789,0.0671046705,0.7824393143,0.1738784986,0.3712895694,0.2970155233,0.1838955719,0.6090937187,0.7785725708,0.1785994677,0.7657628125,0.7150414898,0.4002465350,0.7605940213,,, +0.1875000000,0.2500000000,0.7453538293,0.5562348145,0.0441623314,0.2702864797,0.2214688216,0.6459622930,0.7874313686,0.7003119886,0.7890889288,0.7477767407,0.4196777761,0.1824780870,0.7869950747,0.2299966977,0.8701197824,0.8898176888,0.7801436263,0.5712060605,0.1414729978,0.1577144405,0.7592566011,0.7677241082,0.7704557236,0.0742995890,0.2070739889,0.6432430740,0.6626574935,0.2234028869,0.3798256752,0.4206518726,0.9313934040,0.8052547490,0.7913525237,0.0904265780,0.4186735766,0.9688379993,0.6984754954,0.6613982646,0.9636786203,0.9725835111,0.2988885161,0.2261269621,0.3229277530,0.4837670890,0.4950147446,0.1621673906,0.1487191385,0.4833369898,0.8237380013,0.1808721826,0.2137179286,0.4979929181,0.6606709010,0.2788669346,0.3063764081,0.1031162990,0.8566594275,0.5155990236,0.1969937219,0.2443958144,0.2845822796,0.3594031874,0.0864821358,0.1747175087,0.8151925865,0.6943339275,0.6089062935,0.1587961472,0.2111702869,0.4994445222,0.8572962065,0.4509738958,0.5766741433,0.5227647021,0.2778724900,0.5027213558,0.5940349950,0.6094255366,0.5260545956,0.3063808479,0.1706124833,0.3023674486,0.7318533051,0.4898670274,0.8902174765,0.5367171536,0.3025532460,0.9006342622,0.1225583914,0.8729220454,0.5816617627,0.2410953466,0.5891577334,0.0830385094,0.2448703449,0.7544026147,0.5857832327,0.9203029824,0.1961069836,0.2751267767,0.4055198194,0.9876121362,0.3188617593,0.0215721291,0.3813716625,0.3048050166,0.7103436391,0.4197148411,0.1848478564,0.9002549076,0.6524276587,0.9424044732,0.6402948408,0.3965077917,0.5788287858,0.3429145110,0.1934584284,0.9478120690,0.9845180595,0.4365746828,0.6515295408,0.5665946738,0.5121574821,0.1296665922,0.7572885097,0.7258212646,0.0993553293,0.7081319424,,, +0.2500000000,0.3125000000,0.2257547644,0.6802780146,0.9848806218,0.2945099196,0.6121715314,0.5496250149,0.9488904520,0.6261539755,0.0226002543,0.8020651417,0.3240186602,0.1204765355,0.3803162053,0.3986330400,0.4652527408,0.3092360550,0.7902492685,0.4914528863,0.5728307802,0.3231564206,0.7498268979,0.0049532964,0.6545206995,0.0506501256,0.3489679080,0.0561038423,0.2357035449,0.5909956398,0.3385374097,0.1453693460,0.0107090550,0.3685457709,0.4528203467,0.4027523831,0.6446154756,0.1715591031,0.4860209927,0.1162998809,0.4648108450,0.2506977031,0.7875146486,0.4596880095,0.6805525057,0.3820763617,0.7328458393,0.4352892467,0.7725691649,0.0421113959,0.1229584035,0.9120677412,0.5444388818,0.6305014768,0.2390579795,0.1883088143,0.3235339646,0.1613477063,0.5104757384,0.9915048797,0.2011686831,0.6125321344,0.9968779932,0.0992927733,0.6293981448,0.1048098309,0.8206058126,0.7488012826,0.3321925495,0.7911361693,0.0682489956,0.8672478301,0.4101436031,0.5440434886,0.3644964646,0.1893134553,0.2352781841,0.4685491412,0.0673055169,0.7426268843,0.7430763205,0.4338141405,0.9760390066,0.5769536356,0.9065775399,0.3245960197,0.4803365432,0.6146799829,0.1976400022,0.1181834072,0.3478701948,0.8024101891,0.0077452271,0.1817336529,0.4993942913,0.8643290466,0.9991608907,0.4216364564,0.3496882485,0.3723833957,0.1769943126,0.4480358632,0.4492628956,0.5697830906,0.7367511708,0.6118022655,0.2468232804,0.3836626287,0.3119710207,0.8164000930,0.5367287507,0.3956456599,0.7687124116,0.3577925242,0.9573899531,0.1469699335,0.7791464506,0.4732569496,0.2888410233,0.7451228222,0.2324083727,0.6024969162,0.3459631025,0.0237420439,0.6104843081,0.6179569261,0.3671497568,0.7786061126,0.1736336316,0.2833297879,,, +0.3125000000,0.3750000000,0.6285757518,0.3288695402,0.6054992690,0.9929998035,0.1378111462,0.9951356442,0.9691859630,0.1129326557,0.0280345739,0.7290734798,0.2218745779,0.4449320023,0.0946576300,0.6760159465,0.5861109693,0.1478802136,0.7679049612,0.3991952927,0.9602089047,0.5471295090,0.0050830450,0.1385421732,0.9385014586,0.7108538039,0.1735699072,0.0975517747,0.4521458363,0.9214333170,0.4484556764,0.4469351457,0.1255321861,0.0095951082,0.1099653582,0.6312142271,0.5213742687,0.2210297619,0.3553569058,0.3236816446,0.7842328099,0.5610350110,0.9095973191,0.0611649826,0.8411585467,0.0379429073,0.8668417903,0.0462811647,0.3252716959,0.8277587383,0.4269191837,0.2921328731,0.7167588421,0.4737435721,0.7883403641,0.1244506226,0.6991252704,0.1276111647,0.7651671295,0.1354980366,0.3882917659,0.7037197298,0.5543080787,0.6320341001,0.0578748437,0.8107915705,0.1264818849,0.6230264814,0.5594581265,0.9871456481,0.4017386094,0.5630508566,0.6846432309,0.6775590843,0.1209605632,0.4211554511,0.5500227369,0.4238302193,0.6898243206,0.7893713107,0.5699831364,0.0409704016,0.3327725793,0.2529282472,0.0994483484,0.6077005116,0.3537592243,0.7309522489,0.4926651088,0.5049442097,0.5111502877,0.2868934362,0.0882756545,0.0288088685,0.3580115556,0.5529107323,0.0627496941,0.7541548216,0.5957504974,0.5642922563,0.2772185232,0.1961681915,0.0377593283,0.6898948345,0.6113006326,0.3604168841,0.7862653008,0.3118595339,0.9690669046,0.9981342063,0.2589769722,0.4736000784,0.2835210583,0.8389609037,0.8540500992,0.1036063221,0.6556978549,0.4131547150,0.8589825400,0.7310319247,0.7818610885,0.1693737505,0.6824778626,0.1110271995,0.1198812893,0.5206037527,0.0822814312,0.6039371279,0.6588939205,0.5556109066,,, +0.3750000000,0.4375000000,0.3013739143,0.8127311000,0.7991974158,0.9813211181,0.5462567790,0.0274043684,0.7054392931,0.2291122875,0.2243704761,0.6404237077,0.7856010403,0.2253304604,0.1122797087,0.2313427543,0.7298298122,0.6516429083,0.6382611769,0.2799473577,0.3125212379,0.6736417285,0.9154962718,0.6624671633,0.0333061314,0.5654855787,0.7591771134,0.9264053332,0.1208104850,0.2260603826,0.1269354327,0.4152459202,0.7590945300,0.4942393058,0.1634823915,0.8546761232,0.9681738093,0.7978894059,0.0261956449,0.5268149576,0.2065873067,0.2210950616,0.4754410307,0.7686062045,0.6741202855,0.1233033733,0.9876864576,0.5099352649,0.8682243000,0.9719840281,0.7665449458,0.4172727119,0.8278773725,0.9980648635,0.1777149339,0.5806961891,0.9070699569,0.7085918125,0.9142936911,0.6817125536,0.5119359691,0.6994246591,0.7783822962,0.8618395200,0.2147077576,0.9214978551,0.2123396420,0.4472374304,0.1355366809,0.9382716189,0.6553513929,0.8768269331,0.8318979132,0.9577270437,0.7229743921,0.2387020239,0.9467114366,0.3547559867,0.8069269729,0.3634118494,0.7865487337,0.9261352927,0.3532215573,0.1371394813,0.7110671448,0.1866619682,0.3140457033,0.2714432462,0.9519157023,0.8294518099,0.8057298311,0.7847239529,0.0537713827,0.0128977881,0.1007729070,0.6612241708,0.2817010204,0.0053622834,0.7139452228,0.8625826242,0.8366024834,0.1891112577,0.5292865052,0.8092396471,0.1501730622,0.7508652674,0.7300759819,0.6964412911,0.6699647657,0.5185583574,0.4771354941,0.3811959955,0.6192273130,0.9198612673,0.7758328342,0.0671149772,0.4560193459,0.1565855546,0.5475070586,0.6679388408,0.7853498289,0.7844694268,0.9127447612,0.5858668790,0.8600505069,0.8199147666,0.7085756420,0.4406658337,0.3686100424,0.1206055495,,, +0.4375000000,0.5000000000,0.9003225164,0.7480981473,0.8053498440,0.4267288961,0.6412769875,0.7522350526,0.4167963460,0.9650670663,0.5086058250,0.9226004714,0.1749151214,0.5154892541,0.1457145112,0.9937504663,0.7144920225,0.2941832957,0.9871061957,0.8896298131,0.9362271670,0.4684300146,0.1662876687,0.4145205696,0.2401438348,0.7372052034,0.2275003067,0.1202372941,0.2201560228,0.7109864391,0.0556307323,0.4056763717,0.5839949264,0.6182016619,0.1775623059,0.3103296650,0.7554143269,0.8824875567,0.3143215114,0.8981643121,0.4549063388,0.7565393369,0.5745349682,0.8117642403,0.2721608290,0.3757458278,0.6454408234,0.8008520203,0.5620512532,0.2231434009,0.4298177247,0.2234280019,0.6727846127,0.5825154625,0.7763711584,0.0086296967,0.0160774931,0.2844835189,0.5559796582,0.8363868720,0.3929312793,0.4150929507,0.6976120733,0.8635397111,0.1867806930,0.4720674043,0.0013589431,0.0673465631,0.6231278596,0.7715907679,0.9108784711,0.6526743551,0.9036721131,0.3094108591,0.7118621557,0.5414177482,0.6693002416,0.1900362298,0.0368166002,0.2156310934,0.6608897825,0.4060205801,0.9850410977,0.2993082490,0.2275831737,0.4510028409,0.2335811383,0.5196640280,0.8845180692,0.4756846388,0.0928450837,0.2996766637,0.9362409022,0.0004491087,0.5826934704,0.4704652349,0.7252352487,0.6212530315,0.2190986618,0.9486807266,0.5916255882,0.2739911363,0.1576126318,0.6291394716,0.7699931778,0.5183355731,0.3155681929,0.7118634277,0.0610896808,0.3112224340,0.8763353478,0.5345323340,0.3207744888,0.3421047439,0.7597657682,0.6433593284,0.8619263892,0.9882361852,0.6681065401,0.7102198754,0.1950918455,0.2910398836,0.9868998907,0.8591626459,0.6078541053,0.0004093167,0.2274056135,0.5978504100,0.2635376034,0.1799012623,,, +0.5000000000,0.5625000000,0.6836149301,0.1570305652,0.5011268521,0.5341963689,0.0406966375,0.0417319161,0.0229919404,0.5225459056,0.7622013865,0.0073592423,0.5262761717,0.7536182301,0.1732809620,0.5846455710,0.8147739468,0.2411016424,0.7675131322,0.1109566058,0.5808591293,0.6893337520,0.4796658028,0.5758117344,0.1115573819,0.0693856149,0.0807967728,0.6014419149,0.9144991301,0.3569751286,0.9383541637,0.3463297449,0.8262212579,0.5411048380,0.5816693464,0.6854715918,0.7228725688,0.6109158760,0.0544019262,0.7022253803,0.3458649374,0.7266227046,0.9470764389,0.7508620082,0.0298781053,0.1454318992,0.9886663328,0.1866206592,0.3245465471,0.7972429504,0.8571681727,0.8578790261,0.7722784744,0.0922879532,0.1406729887,0.7397305216,0.9066975862,0.7279179688,0.6206075558,0.7658441206,0.0817528344,0.5876551629,0.2451612160,0.7712874806,0.5636584857,0.7146320252,0.5789667484,0.7735870511,0.9947234755,0.5594872846,0.6741074440,0.6133322220,0.0880946824,0.1618016448,0.5966567851,0.8680961663,0.7326783538,0.7012700287,0.3464814217,0.9959812763,0.4164274423,0.1351061920,0.6529864753,0.4439844161,0.4418596844,0.3798802693,0.3809329458,0.8569758898,0.8512940556,0.6666798801,0.4906939513,0.1945700741,0.5131848175,0.6812754211,0.5925616317,0.8465413465,0.9405339791,0.1809083533,0.0460981852,0.5613436685,0.5314784907,0.4365565274,0.7995008091,0.2417511870,0.1028372864,0.4331791420,0.4886791948,0.0108438726,0.1980641852,0.1028579960,0.4738194542,0.0851266982,0.3123101122,0.4068922729,0.9956520954,0.0596446055,0.0368461821,0.7821050829,0.5365605582,0.4764145396,0.7731019980,0.4577252327,0.5513724757,0.3282609247,0.2148313976,0.5636563539,0.3628968168,0.8687196723,0.5768848425,0.8886449558,,, +0.5625000000,0.6250000000,0.3266253117,0.2969284146,0.3912016670,0.3561266444,0.2641083156,0.9673384312,0.8008158177,0.4856448886,0.1329766037,0.9680180063,0.4974506951,0.7146691198,0.7970280002,0.2428639778,0.8433659293,0.2990799940,0.1119566131,0.3558082923,0.3105708533,0.0734917005,0.8885465648,0.3865002599,0.9565107531,0.7928993581,0.4546439000,0.5764963361,0.2760517164,0.2105028476,0.2800917707,0.2960291200,0.7190703233,0.0789382251,0.8547532328,0.9354673070,0.5678164046,0.4840348300,0.9779860589,0.5910421014,0.3716490779,0.5187759055,0.7101588331,0.9156765428,0.0999725214,0.9640193435,0.7349417466,0.6109719451,0.9659422555,0.8378549658,0.6305319166,0.6654821215,0.3023991575,0.0058013138,0.2286409882,0.8359954355,0.9596452445,0.3670667945,0.3007012629,0.0460373273,0.5093773089,0.5760716717,0.2921432890,0.2685501662,0.1253721523,0.0886203020,0.4363479582,0.7623618306,0.0819924974,0.0721713693,0.8915678712,0.5185277537,0.4140858494,0.6008427632,0.9720136125,0.2152535354,0.0194878255,0.9272642804,0.4734225015,0.5747749114,0.3479006817,0.3525647940,0.8477819201,0.6399854033,0.3437346853,0.5786995713,0.5904509153,0.6705951339,0.2542099489,0.5538953913,0.2293668056,0.8017296402,0.1767021166,0.4251989739,0.7634107836,0.9324329835,0.1678593014,0.6535611227,0.9821186785,0.4999947359,0.5313968647,0.9546532426,0.8452043200,0.7675913034,0.9542584720,0.9133796643,0.4685207419,0.3768507789,0.0580611015,0.2010925114,0.0885815227,0.9304342023,0.8238886003,0.9276215080,0.1137061296,0.2165951831,0.7970096874,0.6956051604,0.7922348289,0.8634749758,0.7919690392,0.0796134942,0.4695181684,0.4520755119,0.7265606464,0.0423310532,0.4934578198,0.9706061210,0.3916379958,0.2137548453,,, +0.6250000000,0.6875000000,0.0951865504,0.4559259054,0.3342831139,0.6230993611,0.9083122811,0.6041768962,0.9408766730,0.4100223009,0.7271583276,0.8637165106,0.8111866217,0.4237242953,0.4929328640,0.5954799841,0.1817465017,0.4415581895,0.7764845549,0.8788219872,0.2891010782,0.6990914301,0.7785408311,0.4980652491,0.2989641940,0.7921074585,0.9815224456,0.7390300448,0.0385943358,0.4198846603,0.8128107945,0.2670160651,0.2669080039,0.1193341746,0.6247934515,0.6694000354,0.2803128145,0.2621419586,0.1303602080,0.9657187897,0.0858317562,0.3182606357,0.2583954232,0.5476385439,0.5172038896,0.9280478866,0.4310764379,0.8470131259,0.7136792648,0.6151305817,0.0992915588,0.8238125884,0.0452835828,0.7976106589,0.0500108164,0.9840833184,0.8637740302,0.1995748926,0.9539506896,0.4730096324,0.5925557532,0.7117695680,0.3666300960,0.5040151600,0.7381468357,0.7755233133,0.5956626255,0.4666806492,0.2921566979,0.1883999070,0.0600034464,0.7034296850,0.0184311338,0.4205567657,0.4419830996,0.6064463754,0.4366809521,0.6036809478,0.7591373040,0.9383824393,0.1547079335,0.1034155719,0.9832944782,0.0031819595,0.1114478053,0.5050588488,0.6593978559,0.9282916798,0.2615019490,0.1864993179,0.5753157951,0.7485704583,0.4077355501,0.4141925909,0.1749735957,0.2676434095,0.6683696669,0.0457403508,0.1722402293,0.8534545521,0.7855956117,0.3804940688,0.3033744935,0.0134121121,0.7247220045,0.3239799449,0.5395433162,0.7648703295,0.1689916737,0.7016573173,0.5915472063,0.2456645893,0.6919005406,0.2535201525,0.4518816210,0.0948039426,0.5158798415,0.7297661491,0.3568961844,0.3452494484,0.3337228564,0.0623258993,0.5084565377,0.1585949706,0.7812543309,0.5892171352,0.4352987392,0.1705578952,0.4649748327,0.1445428249,,, +0.6875000000,0.7500000000,0.7972729541,0.7656295931,0.8047798146,0.4210944641,0.9495596520,0.2564582382,0.0869470569,0.7413500270,0.0926618222,0.4014761285,0.2481015425,0.2325752755,0.0678412090,0.8327358237,0.9366771176,0.7603401856,0.4709194202,0.0013421741,0.6969793467,0.7803202949,0.3712435162,0.7277776932,0.6492541826,0.9142240172,0.6499930692,0.9622941131,0.8251722490,0.9162823888,0.3251303604,0.4615749414,0.8418393293,0.1760768723,0.6450446800,0.4258416046,0.4078110659,0.6946288156,0.4398307409,0.4526773752,0.9216633332,0.5807717878,0.2695588598,0.2401386295,0.8712688570,0.4794638369,0.5362886589,0.5534540117,0.6477100106,0.3752358763,0.4875534533,0.8996371171,0.1154563460,0.0779831153,0.1277342089,0.8063365871,0.1313374497,0.9296416105,0.5511019584,0.2818133885,0.9499518040,0.9458435348,0.3409965113,0.9603743141,0.7153733519,0.8225758842,0.4474064647,0.5509970032,0.6046922461,0.2496839233,0.7098049910,0.2465102181,0.5172845421,0.9220486192,0.3675448599,0.1631474863,0.9081681864,0.5819129143,0.4095856373,0.3096013456,0.3027578304,0.2607257105,0.5812509328,0.8137784675,0.4119918980,0.8225071011,0.9856499089,0.5479148179,0.2853891188,0.0090171313,0.6690710657,0.9199579263,0.4137630577,0.5503251320,0.2482982120,0.9546005074,0.1055671843,0.6350373032,0.3269851748,0.8220459416,0.5415382171,0.4190973802,0.4187121543,0.2853184263,0.1283494134,0.3375549077,0.6602634194,0.4770000577,0.3271100372,0.4383558319,0.4143157501,0.4820398828,0.8281070660,0.3001287873,0.1368047087,0.3757513827,0.0349937901,0.3754054119,0.1850143555,0.6747776968,0.3888342835,0.7420188775,0.9451925391,0.2639461998,0.8757471105,0.8289346700,0.7173204881,0.7487527549,0.6600279508,0.5950739619,,, +0.7500000000,0.8125000000,0.9918360200,0.8413040168,0.7585599809,0.7010234804,0.0875005967,0.2445954022,0.9433504627,0.7129720305,0.4357547185,0.5365997744,0.3586147751,0.5069929382,0.1981287585,0.5265833302,0.4481507521,0.0833059070,0.0099458960,0.4829644961,0.2602805076,0.5503992552,0.0065642314,0.0399043802,0.4158759147,0.6996538010,0.9095043880,0.3482764231,0.5089759044,0.7512149776,0.1415943836,0.1448071979,0.8604772950,0.9743917484,0.8379960111,0.6217453007,0.5853474766,0.8372208674,0.9314223635,0.6847964760,0.2016652324,0.6888024006,0.8598825224,0.4707778960,0.3636550519,0.3066147778,0.7566092857,0.7624425550,0.7862197864,0.7429981048,0.2078662752,0.6019000637,0.1483695374,0.7394767788,0.5261958127,0.4573342500,0.9898954427,0.6633318702,0.7886571467,0.8154489447,0.1204948060,0.0971162210,0.8065869608,0.6582383313,0.3058517003,0.8774744410,0.2229601552,0.3170009113,0.3536383279,0.0057896490,0.0105987708,0.3022447699,0.8474677387,0.3733084546,0.0068866063,0.9043302268,0.3196696739,0.2717395178,0.4124553083,0.2207904088,0.6011305319,0.5789561619,0.9242837201,0.7719639072,0.1995398887,0.0178118064,0.9882268365,0.0737970883,0.6437558192,0.3136051227,0.2762400561,0.2875013240,0.0091995180,0.5231736244,0.2244282521,0.4788563396,0.4312590321,0.1104531623,0.0708520801,0.3588576352,0.8964946857,0.5207229077,0.0078515329,0.1885409455,0.5230897027,0.8427014509,0.5024940576,0.4202928701,0.5526307372,0.1720640247,0.6911889249,0.5430255407,0.4169557719,0.7536734773,0.9756144097,0.4612334438,0.6550959172,0.9495328732,0.3518401869,0.2442284606,0.0097164342,0.0557602046,0.0039816455,0.4758843794,0.9184472405,0.5547581976,0.3187803025,0.9813381813,0.5006619387,0.0314118001,,, +0.8125000000,0.8750000000,0.6191761866,0.9054350860,0.5487367243,0.3459811946,0.4862101979,0.5415295553,0.8671098289,0.2742507798,0.4538832838,0.4286050487,0.1073144525,0.1276574964,0.2140937971,0.2797712130,0.8440571555,0.6460165153,0.1185177197,0.6771998608,0.4850786522,0.5550173358,0.3533928362,0.8392060774,0.4451687529,0.3191749942,0.7469337904,0.5444718280,0.1249110878,0.4382645758,0.7262147728,0.9177367412,0.1103025437,0.6140038739,0.8764747414,0.9082464878,0.6889529957,0.0813048906,0.0767652937,0.5957161554,0.6444861246,0.2497679237,0.6517823939,0.3069547522,0.5148614575,0.5832309611,0.4174014262,0.4020766271,0.3713405207,0.5121809307,0.1036714972,0.0870049407,0.5926776354,0.4701013782,0.6934435910,0.1892986000,0.5792621251,0.6237755057,0.4967695414,0.5324963350,0.7552636988,0.7068167406,0.0653248145,0.2996625858,0.6450694269,0.5211735805,0.5647427198,0.3075995347,0.3649830059,0.2005785431,0.6558605947,0.0978516254,0.8363018110,0.4500579403,0.6472005888,0.5467596343,0.5609968198,0.1325631724,0.8892449874,0.1748603326,0.1662858317,0.4854824338,0.2636415791,0.1684568150,0.2441414313,0.0828040307,0.1043914095,0.3420590509,0.4041554881,0.5607400322,0.8855262103,0.7991761782,0.2948071482,0.6955452473,0.2266446196,0.8418665337,0.9115684670,0.4352800269,0.0599869231,0.8337285705,0.7098139764,0.8663035773,0.8252247791,0.0461895282,0.0966307523,0.1349785144,0.3728048163,0.6075393842,0.2386415070,0.0850718119,0.6082805034,0.2300724224,0.2179759610,0.1453707884,0.7663380459,0.6795278788,0.0639108133,0.8040997379,0.8384254870,0.6674299710,0.8382824929,0.7164929761,0.7098547309,0.1248717995,0.7519482924,0.7399912064,0.1975611635,0.3212597067,0.4571377423,0.7974166109,,, +0.8750000000,0.9375000000,0.0675681902,0.9465224696,0.6246563757,0.4964401440,0.4307163425,0.2546305142,0.4038409237,0.9788208264,0.4153440665,0.1396958858,0.6012031690,0.5097675396,0.6435282647,0.4333023569,0.5118247755,0.4231589767,0.3791970923,0.4930308713,0.1451585852,0.9852486111,0.3183507365,0.9657861290,0.7909171465,0.7888372538,0.7204644214,0.5309445842,0.9875577185,0.2251691329,0.5989489446,0.1223990505,0.1309863974,0.2820620390,0.6537988915,0.6798148025,0.5483439765,0.6286506706,0.4249299334,0.3854467960,0.0419163734,0.7299999651,0.0257016472,0.8066606387,0.5830032376,0.3707251281,0.9189108999,0.4139946075,0.8143827766,0.2288588011,0.3485572150,0.5222964077,0.6099661470,0.7514275014,0.3832270841,0.6412743183,0.5788290792,0.0493872906,0.5193025507,0.8062192295,0.2703251892,0.9612743761,0.5794481141,0.2509157243,0.5700247560,0.5649895605,0.7199977674,0.8135184536,0.2376495383,0.0774716553,0.8044368352,0.7821648207,0.8967497018,0.9346269765,0.5824908591,0.5977028890,0.8610585704,0.7126857950,0.2937735878,0.9538895383,0.9488552525,0.8618694427,0.8841921510,0.1256232476,0.9878645325,0.7000299769,0.7986613419,0.1169867751,0.8692559747,0.3527300749,0.1565497790,0.0870121382,0.1273484039,0.9799885235,0.1240229644,0.2748411580,0.9855112352,0.5839213454,0.3594635474,0.8347468385,0.2573705588,0.5607065628,0.3590446534,0.6411395269,0.5288608000,0.1310746458,0.0330038576,0.4145023285,0.1636837497,0.0445809378,0.8380571448,0.6593008058,0.1558282361,0.7177646661,0.9663831610,0.8445544271,0.3144014403,0.5031124200,0.1103287465,0.9298843495,0.1985781076,0.8351032853,0.4374386359,0.8814636576,0.8946606796,0.7419673589,0.8060761911,0.1805287465,0.7365976390,0.6097845554,,, +0.9375000000,1.0000000000,0.9162313873,0.7039652502,0.9958926889,0.8048050641,0.6580998558,0.2123428448,0.0004412036,0.8425683090,0.0571428468,0.8569603241,0.1960830328,0.6205328335,0.9285525971,0.2186271381,0.0130430821,0.8071690265,0.2467148174,0.7735173730,0.0295320423,0.9245268309,0.3800651950,0.8573000913,0.6029048001,0.5492588300,0.1346637527,0.8619715162,0.1997184067,0.5195509153,0.6846363698,0.1887053836,0.1640599121,0.0513311294,0.4855135144,0.2798208143,0.7097784660,0.8244420320,0.1037652704,0.6590829543,0.2595954034,0.1761031309,0.4938859646,0.6053629078,0.0862040159,0.3850135689,0.6365760874,0.0255041532,0.7906097812,0.9450102528,0.8545841393,0.6188349996,0.0109509660,0.1585280926,0.9788220741,0.3962385887,0.4504068582,0.7634726975,0.6411195237,0.4698150188,0.7469728915,0.5330595954,0.4404476730,0.3075191106,0.9554654676,0.1555883482,0.8038753311,0.3369397221,0.3140271492,0.3620656773,0.5264596820,0.9344380067,0.2270948181,0.1813250077,0.5241481701,0.5215025954,0.9158991752,0.0222571120,0.1313122681,0.1170573188,0.7167039318,0.2544327241,0.8234632669,0.4341020402,0.8246113895,0.9864847821,0.0232783328,0.3582654316,0.7527935044,0.9316744423,0.6037894480,0.3015077300,0.3874198273,0.4797800893,0.0514260521,0.8536630040,0.5574105263,0.9011588183,0.2052515480,0.3536422423,0.2142220286,0.4712827797,0.3031986870,0.9313315777,0.9560224176,0.8504335249,0.6212099902,0.9600807792,0.9028534018,0.1038160003,0.9422442666,0.9891826292,0.0934129481,0.7689513955,0.3385004348,0.0140340962,0.6088613088,0.9471964275,0.4578662498,0.2061621556,0.3482395075,0.2731952039,0.1292056721,0.2105367642,0.9794369666,0.9823816342,0.3654576021,0.6508769493,0.7211769500,0.2907935777,,, +1.0000000000,1.0625000000,0.3288717223,0.8956982135,0.7175154851,0.2936425267,0.5254038805,0.6711162864,0.9505835837,0.9499251666,0.0674790458,0.0529535487,0.2380608639,0.0561124044,0.8459908199,0.8417618566,0.4740693765,0.3133779906,0.2753134349,0.8282249088,0.7035895018,0.7738361564,0.2366405798,0.4887161897,0.2019181536,0.1249526783,0.9952925150,0.9107778952,0.6300763036,0.2008045614,0.6709930738,0.6754648075,0.2864997049,0.7562307119,0.6299736681,0.6976480703,0.6782385600,0.0678208305,0.7237180374,0.9169032224,0.0469085400,0.9737601904,0.3116680456,0.6357961306,0.9562163893,0.1638539426,0.7652504940,0.8853740022,0.2793914834,0.7048494227,0.3393532555,0.2593762882,0.3953890991,0.9912515113,0.9623617800,0.8964278235,0.8333911817,0.2635855861,0.2261674772,0.2577400070,0.3039586723,0.1256286323,0.7896734662,0.8566005919,0.3841658426,0.4605072828,0.7725437889,0.1063366195,0.5972514064,0.0590787621,0.2833237725,0.1350965637,0.8942232225,0.7651046207,0.2020620182,0.9639793737,0.8158535908,0.3854755019,0.0143608907,0.0617878267,0.5632393812,0.6615521337,0.0224016900,0.9791559218,0.7715334210,0.6092171767,0.3660154589,0.6790046529,0.6172331879,0.7133937459,0.9152221391,0.8994737109,0.6104361496,0.1654097554,0.1662524543,0.7653892187,0.7044507489,0.4649232593,0.8286671813,0.5604844948,0.8829661258,0.4343976839,0.5982651568,0.2521597776,0.3864699518,0.1515400296,0.1077846852,0.6851595649,0.4352802478,0.4294838235,0.5613919883,0.0806270167,0.6635060802,0.8972335965,0.4348131975,0.5416767132,0.0620521177,0.7645231539,0.2742298618,0.9714634961,0.1392439241,0.9542690001,0.2264950508,0.5242728393,0.6881242732,0.2914699623,0.2085309383,0.8717810940,0.3136541282,0.1018438465,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_signal.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_signal.csv new file mode 100644 index 0000000..317eeaf --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_signal.csv @@ -0,0 +1,545 @@ +Time:512Hz,Epoch,Noise 1,Noise 2,Noise 3,Noise 4,Event Id,Event Date,Event Duration +0.0000000000,0,0.1276509815,0.2788001627,0.9800111165,0.8812423225,,, +0.0019531250,0,0.3085663570,0.2317169255,0.1059675417,0.4711892216,,, +0.0039062500,0,0.7789645349,0.6270744407,0.0989787877,0.6273901062,,, +0.0058593750,0,0.2544820041,0.0206462047,0.2667732637,0.4001024703,,, +0.0078125000,0,0.2577170827,0.8932497504,0.0936164563,0.3030632613,,, +0.0097656250,0,0.8306098606,0.1907459770,0.3106222898,0.9361628154,,, +0.0117187500,0,0.6003265893,0.4503573675,0.3441934220,0.3818552531,,, +0.0136718750,0,0.1555515428,0.0089006005,0.5513935322,0.5262577983,,, +0.0156250000,0,0.2765844858,0.3741191584,0.7100992661,0.8446825272,,, +0.0175781250,0,0.1800983415,0.9476220037,0.1737488913,0.4065236386,,, +0.0195312500,0,0.7171743014,0.0784789107,0.7459395295,0.4624227872,,, +0.0214843750,0,0.0676116813,0.6932677082,0.6146815275,0.8067630604,,, +0.0234375000,0,0.0200838614,0.3800698228,0.8537565614,0.9172393801,,, +0.0253906250,0,0.3490915159,0.0946921902,0.0582459073,0.7552404082,,, +0.0273437500,0,0.9225666784,0.5115203685,0.8892426926,0.1770821628,,, +0.0292968750,0,0.4700529492,0.4034908635,0.4664971696,0.0102199195,,, +0.0312500000,0,0.1439906447,0.1765625917,0.0070374508,0.0092898624,,, +0.0332031250,0,0.8735866135,0.9694052222,0.4945583295,0.6702349838,,, +0.0351562500,0,0.9596816355,0.4774389013,0.8643378734,0.2293010280,,, +0.0371093750,0,0.9890093571,0.5106695876,0.4771499431,0.9426534649,,, +0.0390625000,0,0.1608183412,0.4422527624,0.8963911207,0.4273886823,,, +0.0410156250,0,0.7605574597,0.8471352365,0.5397317070,0.2859543816,,, +0.0429687500,0,0.7069561521,0.6101486075,0.6493543428,0.9491707447,,, +0.0449218750,0,0.9346017786,0.7288885713,0.5936009986,0.4114119632,,, +0.0468750000,0,0.9042563275,0.2211433772,0.8740211152,0.0981834438,,, +0.0488281250,0,0.9761265456,0.3806563101,0.8920098066,0.7286428297,,, +0.0507812500,0,0.6130849579,0.8856918216,0.3503170034,0.5256292939,,, +0.0527343750,0,0.8678017857,0.3822564180,0.6108583007,0.4864756714,,, +0.0546875000,0,0.5019965817,0.4941701319,0.6212668198,0.0385970196,,, +0.0566406250,0,0.5277878270,0.8627308370,0.8374058811,0.0310396899,,, +0.0585937500,0,0.7693341547,0.9832691720,0.1571595417,0.9037684486,,, +0.0605468750,0,0.4684032931,0.2325949920,0.7011381390,0.0141390373,,, +0.0625000000,1,0.8367542089,0.9558685038,0.9688963213,0.5381925830,,, +0.0644531250,1,0.8521201352,0.7515846295,0.8623778452,0.8120114051,,, +0.0664062500,1,0.4326860616,0.5165756010,0.5215125228,0.3015441904,,, +0.0683593750,1,0.0626169734,0.7133678738,0.4758519852,0.3982388966,,, +0.0703125000,1,0.9768561120,0.7591111555,0.8196392297,0.1391515601,,, +0.0722656250,1,0.8578928597,0.2868922015,0.7278519578,0.8900003748,,, +0.0742187500,1,0.7514423283,0.3492095852,0.5052883255,0.9790684455,,, +0.0761718750,1,0.7293294109,0.0986221319,0.4341941983,0.7989717678,,, +0.0781250000,1,0.7915512780,0.2617537291,0.1000760957,0.8795328548,,, +0.0800781250,1,0.9701463417,0.6310394087,0.7542459588,0.2785037511,,, +0.0820312500,1,0.8145337973,0.9941854759,0.2815517513,0.0045786556,,, +0.0839843750,1,0.8589639370,0.1969860690,0.8577664557,0.7519159273,,, +0.0859375000,1,0.2795593245,0.9097975651,0.6449571303,0.6510467425,,, +0.0878906250,1,0.0708383643,0.9844854285,0.4189832469,0.9148418091,,, +0.0898437500,1,0.1410587770,0.8686903990,0.8101392037,0.9140618418,,, +0.0917968750,1,0.0315964462,0.0339632155,0.4409458800,0.6738175135,,, +0.0937500000,1,0.7580716163,0.0029117847,0.9416581537,0.2670429794,,, +0.0957031250,1,0.4002936617,0.3953563941,0.4354947014,0.0241012422,,, +0.0976562500,1,0.6805019742,0.5852424444,0.9849745545,0.8617281017,,, +0.0996093750,1,0.1342884866,0.2860122398,0.7102625438,0.2481575462,,, +0.1015625000,1,0.6981669578,0.1783118374,0.8516177488,0.8705970314,,, +0.1035156250,1,0.1819152979,0.7780929049,0.8233418250,0.9241389111,,, +0.1054687500,1,0.7950496622,0.8647075142,0.0129886777,0.4410888362,,, +0.1074218750,1,0.1811624330,0.5116186531,0.4547199199,0.8056800328,,, +0.1093750000,1,0.0362837398,0.2561552674,0.4547825414,0.5773156560,,, +0.1113281250,1,0.5380683220,0.6130943180,0.3017567908,0.0284445388,,, +0.1132812500,1,0.2644293748,0.0368850478,0.4616725056,0.9413765091,,, +0.1152343750,1,0.8972898975,0.1998824074,0.3274557481,0.3579953976,,, +0.1171875000,1,0.0168464282,0.1166782510,0.0736811778,0.6925130279,,, +0.1191406250,1,0.5923203786,0.7633251783,0.9446329186,0.5572869231,,, +0.1210937500,1,0.3396585051,0.0153831262,0.6792490359,0.0295981884,,, +0.1230468750,1,0.6362284014,0.5369453721,0.9656954347,0.8791597558,,, +0.1250000000,2,0.2337946561,0.1190734650,0.0626613630,0.5272158433,,, +0.1269531250,2,0.4128819830,0.6709878326,0.0038196605,0.3581657342,,, +0.1289062500,2,0.7859546749,0.5281384096,0.6521776719,0.4348313336,,, +0.1308593750,2,0.0390759464,0.4461622771,0.0488363560,0.4808078697,,, +0.1328125000,2,0.9383867618,0.7737875879,0.0688997617,0.8730048109,,, +0.1347656250,2,0.7727890983,0.3735630005,0.9288594450,0.4715279418,,, +0.1367187500,2,0.0057901163,0.4163702421,0.2194966618,0.1669509744,,, +0.1386718750,2,0.6928461199,0.2554316435,0.4694574887,0.0175182340,,, +0.1406250000,2,0.5129134154,0.5856649550,0.0898075390,0.3229898170,,, +0.1425781250,2,0.7649766149,0.6393871089,0.7684976636,0.8299107496,,, +0.1445312500,2,0.2180511351,0.8596432649,0.1483660867,0.1665115349,,, +0.1464843750,2,0.3611585819,0.0921374985,0.8538685897,0.9069783224,,, +0.1484375000,2,0.5969340219,0.1961269137,0.1029027528,0.8045245227,,, +0.1503906250,2,0.0499008780,0.0974264622,0.5842647175,0.3397303273,,, +0.1523437500,2,0.5954238679,0.9031029753,0.1698406227,0.6387245483,,, +0.1542968750,2,0.9326017273,0.4038142664,0.8253482326,0.1627873755,,, +0.1562500000,2,0.8712227487,0.0618309802,0.3726967243,0.4451253370,,, +0.1582031250,2,0.6852292044,0.1147632850,0.5376503016,0.1462208915,,, +0.1601562500,2,0.8921249909,0.0863066129,0.7909538967,0.6211571102,,, +0.1621093750,2,0.7981687440,0.8388189233,0.1172924649,0.1913345626,,, +0.1640625000,2,0.3189117718,0.9359803812,0.6940958097,0.0361434845,,, +0.1660156250,2,0.5461656393,0.0729919914,0.3085543287,0.9829967283,,, +0.1679687500,2,0.7135640443,0.8634178529,0.0508666828,0.5103130431,,, +0.1699218750,2,0.6259520410,0.7013263162,0.1993125062,0.0300191126,,, +0.1718750000,2,0.3636565544,0.6933502334,0.1902173155,0.3889882183,,, +0.1738281250,2,0.0392293937,0.4553789329,0.9871238486,0.3470031086,,, +0.1757812500,2,0.6683370932,0.6941734469,0.8803110654,0.7196198201,,, +0.1777343750,2,0.3557324144,0.4117753741,0.7099557552,0.9401496889,,, +0.1796875000,2,0.4519558856,0.3309620759,0.7963344492,0.2998728864,,, +0.1816406250,2,0.9766512695,0.9687239919,0.4191189073,0.2354997334,,, +0.1835937500,2,0.9285292204,0.9664343141,0.8797372861,0.4664114930,,, +0.1855468750,2,0.0704731345,0.5200172788,0.2558905915,0.1531779014,,, +0.1875000000,3,0.9103577151,0.3051399530,0.3802959747,0.5608211916,,, +0.1894531250,3,0.7322697260,0.4646240273,0.7389562586,0.0070930065,,, +0.1914062500,3,0.9775205301,0.6706804007,0.2981214062,0.6064129225,,, +0.1933593750,3,0.3513319721,0.1147635186,0.1866387101,0.3831581555,,, +0.1953125000,3,0.2071030629,0.4649826710,0.2611368874,0.0434090609,,, +0.1972656250,3,0.8196081722,0.4112765016,0.9947107485,0.6513867872,,, +0.1992187500,3,0.9733258400,0.3824872016,0.4988888649,0.3183777165,,, +0.2011718750,3,0.5881601563,0.8593616697,0.3022438444,0.7995925019,,, +0.2031250000,3,0.1197004502,0.0933767378,0.9183180968,0.7042102139,,, +0.2050781250,3,0.5103556064,0.5311018426,0.5577965465,0.1012502138,,, +0.2070312500,3,0.2137417535,0.1784377997,0.0185600386,0.5753634071,,, +0.2089843750,3,0.8751701608,0.5748710451,0.8417926282,0.8197028155,,, +0.2109375000,3,0.1022837155,0.6268135523,0.7013708267,0.9962205945,,, +0.2128906250,3,0.2256511098,0.5796371773,0.6197344016,0.7943489363,,, +0.2148437500,3,0.8379743095,0.5485193282,0.2306215530,0.9106305945,,, +0.2167968750,3,0.5906426255,0.3640996115,0.5610837436,0.8107932284,,, +0.2187500000,3,0.0032579657,0.1254784390,0.4923886575,0.1380567863,,, +0.2207031250,3,0.5796410651,0.4244301743,0.4880758342,0.3453556513,,, +0.2226562500,3,0.1578681830,0.2975058199,0.4114988993,0.9910429649,,, +0.2246093750,3,0.6801350070,0.7340655336,0.5105615265,0.3494833119,,, +0.2265625000,3,0.3606155966,0.8103139903,0.7059087548,0.1461532058,,, +0.2285156250,3,0.3331521475,0.3714994539,0.4256252155,0.4936132992,,, +0.2304687500,3,0.4855763158,0.7642698493,0.4567739645,0.0738400100,,, +0.2324218750,3,0.6857705140,0.9990958001,0.7852868973,0.1356586595,,, +0.2343750000,3,0.0204300629,0.4337335974,0.3717347013,0.5596586859,,, +0.2363281250,3,0.7904259902,0.4814410254,0.1742401007,0.2649804230,,, +0.2382812500,3,0.4132921230,0.6775020990,0.9390176404,0.7180448563,,, +0.2402343750,3,0.4556477382,0.5093132297,0.5365688319,0.8605765116,,, +0.2421875000,3,0.3138149357,0.5904912353,0.5417710205,0.9607072009,,, +0.2441406250,3,0.8660169821,0.9988746298,0.9465961300,0.3528365504,,, +0.2460937500,3,0.0126764781,0.9974072040,0.9100059441,0.6579066119,,, +0.2480468750,3,0.7612893744,0.3337405734,0.1538414950,0.3822216671,,, +0.2500000000,4,0.3222398211,0.2723600003,0.1464531797,0.0567392251,,, +0.2519531250,4,0.0704166759,0.3662723931,0.1605273527,0.1368231662,,, +0.2539062500,4,0.2231628485,0.6844297640,0.3831995630,0.5801532618,,, +0.2558593750,4,0.1398879983,0.3131517000,0.2658558676,0.3751034609,,, +0.2578125000,4,0.5587351650,0.5879184052,0.1597614412,0.5401158298,,, +0.2597656250,4,0.6807701276,0.6947035883,0.3470928550,0.6191579264,,, +0.2617187500,4,0.3978711937,0.5450646314,0.4893422120,0.9736832939,,, +0.2636718750,4,0.5677280941,0.0743406375,0.5558431223,0.7824254800,,, +0.2656250000,4,0.0877346403,0.1697150311,0.3732336606,0.0817826446,,, +0.2675781250,4,0.2498704675,0.7783989236,0.8888188694,0.9619698252,,, +0.2695312500,4,0.7234041765,0.8732161885,0.2125916400,0.1915143377,,, +0.2714843750,4,0.2787337776,0.2255633872,0.7468874420,0.4455531018,,, +0.2734375000,4,0.5536213885,0.1002065176,0.1481359515,0.9731156004,,, +0.2753906250,4,0.2858332333,0.8052669964,0.9788724254,0.2036649669,,, +0.2773437500,4,0.4384922662,0.3010417784,0.2102164433,0.6556176359,,, +0.2792968750,4,0.9844025287,0.9336166591,0.3657510008,0.0092250702,,, +0.2812500000,4,0.4749177301,0.1029748281,0.4144281058,0.2568479199,,, +0.2832031250,4,0.1945731260,0.5911639100,0.5175690255,0.1839895314,,, +0.2851562500,4,0.6751070558,0.1218867330,0.5848218128,0.0144936540,,, +0.2871093750,4,0.5565265811,0.0706522940,0.9582538242,0.3164990707,,, +0.2890625000,4,0.6811653359,0.1241726757,0.7851694785,0.6322026786,,, +0.2910156250,4,0.4077125096,0.6859315163,0.5911462612,0.9816993955,,, +0.2929687500,4,0.6270270052,0.7934336257,0.2103379229,0.6305599436,,, +0.2949218750,4,0.1296151874,0.2248091483,0.1660298733,0.8864813389,,, +0.2968750000,4,0.1498718562,0.6674939501,0.8575848024,0.2908270911,,, +0.2988281250,4,0.8110699588,0.6136764991,0.9418290600,0.6408138282,,, +0.3007812500,4,0.1296923172,0.5607704790,0.7898748701,0.3631542830,,, +0.3027343750,4,0.4094840081,0.0529603250,0.3117963094,0.2116549816,,, +0.3046875000,4,0.1614231374,0.4032979626,0.5606228069,0.2658720037,,, +0.3066406250,4,0.0149710681,0.0650217922,0.8494730568,0.6742778460,,, +0.3085937500,4,0.1271567135,0.5275226356,0.5074276195,0.9832397639,,, +0.3105468750,4,0.4881261149,0.8504798019,0.0859022033,0.8070368627,,, +0.3125000000,5,0.5119356245,0.2817423891,0.6564834723,0.0156511902,,, +0.3144531250,5,0.9076033339,0.2805206021,0.8440965861,0.9010644406,,, +0.3164062500,5,0.1021260370,0.7548397928,0.3980913041,0.3931173608,,, +0.3183593750,5,0.2178466010,0.0395001653,0.7474224495,0.5333806190,,, +0.3203125000,5,0.3088591620,0.7502715727,0.8879149971,0.3440123843,,, +0.3222656250,5,0.1933700668,0.7365343696,0.7874066816,0.2029055802,,, +0.3242187500,5,0.3108512906,0.8355859024,0.0050644493,0.9401674101,,, +0.3261718750,5,0.2428486212,0.5387497959,0.8546116492,0.0782167329,,, +0.3281250000,5,0.3763068160,0.0019015423,0.3822169921,0.9936825447,,, +0.3300781250,5,0.0241590391,0.7704750157,0.1662301295,0.4280788542,,, +0.3320312500,5,0.6155288082,0.5881034718,0.7684135006,0.8153924667,,, +0.3339843750,5,0.4063954097,0.1133751869,0.3421241981,0.5066414350,,, +0.3359375000,5,0.2676465407,0.2839795137,0.2342771927,0.6782000735,,, +0.3378906250,5,0.3809404657,0.5214965504,0.5393902943,0.7820010034,,, +0.3398437500,5,0.4595372491,0.2101573874,0.1099242344,0.3346228362,,, +0.3417968750,5,0.3500187553,0.7776345888,0.3394453200,0.8747201562,,, +0.3437500000,5,0.8005180575,0.7069745648,0.0543363830,0.7170361001,,, +0.3457031250,5,0.0947343837,0.4419909262,0.5749388847,0.9356015073,,, +0.3476562500,5,0.8735375523,0.6509564363,0.3299763254,0.5437440500,,, +0.3496093750,5,0.0139895300,0.3465320331,0.4298201529,0.1615293233,,, +0.3515625000,5,0.3494095602,0.5630004159,0.7145421156,0.6519731758,,, +0.3535156250,5,0.6385047704,0.3351737387,0.0010750701,0.6467023685,,, +0.3554687500,5,0.7558491265,0.1303907561,0.0774761189,0.0099258577,,, +0.3574218750,5,0.3763215463,0.7626591513,0.3843176349,0.6999134321,,, +0.3593750000,5,0.9459182480,0.2822991519,0.8058737975,0.3925624937,,, +0.3613281250,5,0.6670272711,0.1997133561,0.0264408863,0.0088921678,,, +0.3632812500,5,0.0814156909,0.9809584408,0.5119782537,0.2698570353,,, +0.3652343750,5,0.6214387356,0.7788854365,0.6466132149,0.4149384324,,, +0.3671875000,5,0.3295762329,0.7474032631,0.7233265294,0.5952670325,,, +0.3691406250,5,0.3085299081,0.1130057727,0.2304738835,0.2423203441,,, +0.3710937500,5,0.2614920423,0.5484677095,0.3593721886,0.1766454829,,, +0.3730468750,5,0.0333613215,0.5202360961,0.3712536844,0.1457529799,,, +0.3750000000,6,0.2711958543,0.7373103106,0.4145633026,0.9454343871,,, +0.3769531250,6,0.7562512259,0.0294363098,0.1426842657,0.5116447248,,, +0.3789062500,6,0.2743272211,0.6717776491,0.3247361090,0.8491178108,,, +0.3808593750,6,0.4900445505,0.4427132935,0.1083285240,0.1612431379,,, +0.3828125000,6,0.5272925803,0.0822945165,0.7025269971,0.0997931852,,, +0.3847656250,6,0.3066302766,0.9591908171,0.4371041826,0.0838858041,,, +0.3867187500,6,0.7285174418,0.5252626843,0.5971537724,0.7731697413,,, +0.3886718750,6,0.1672329274,0.8309123635,0.8300182682,0.9627268005,,, +0.3906250000,6,0.1822723579,0.6139670927,0.4232092910,0.5834038947,,, +0.3925781250,6,0.0819439858,0.4712245537,0.0878674437,0.3055652413,,, +0.3945312500,6,0.1208156396,0.8608716517,0.6491940646,0.9393811452,,, +0.3964843750,6,0.3637260925,0.8890715158,0.4209694595,0.7516340464,,, +0.3984375000,6,0.2084854927,0.7729421209,0.6781614600,0.1995030013,,, +0.4003906250,6,0.2622310307,0.9518046877,0.7421959753,0.4414433844,,, +0.4023437500,6,0.1057137519,0.3048298301,0.7128665391,0.2554091765,,, +0.4042968750,6,0.6699885647,0.2000759561,0.3243111507,0.8554089530,,, +0.4062500000,6,0.5724080147,0.9142604824,0.2352116713,0.4342926862,,, +0.4082031250,6,0.9874490481,0.4919558025,0.1827386210,0.9303498773,,, +0.4101562500,6,0.2793797320,0.5709865743,0.0885345663,0.6548899561,,, +0.4121093750,6,0.0594072095,0.7210385038,0.5715629426,0.9207222888,,, +0.4140625000,6,0.4433972202,0.1531122657,0.0554876882,0.0202729718,,, +0.4160156250,6,0.6586631446,0.9136778524,0.7935795013,0.9037989336,,, +0.4179687500,6,0.8600455530,0.1702952585,0.0221925681,0.4872820075,,, +0.4199218750,6,0.8281408537,0.7379220470,0.7302297549,0.5690351522,,, +0.4218750000,6,0.8492151820,0.9434478998,0.7475658453,0.5055588309,,, +0.4238281250,6,0.8764435889,0.6749046776,0.4382627660,0.1264068638,,, +0.4257812500,6,0.0890310449,0.2852944639,0.5938582667,0.9126903638,,, +0.4277343750,6,0.4349094455,0.3348919665,0.4768854829,0.0436023842,,, +0.4296875000,6,0.1853784721,0.1555240133,0.1085044234,0.5617910868,,, +0.4316406250,6,0.6280997160,0.9267301625,0.7552123212,0.4189258032,,, +0.4335937500,6,0.1129479122,0.7337364382,0.2948974348,0.1092160507,,, +0.4355468750,6,0.7800526726,0.7968367354,0.2643386708,0.0650400312,,, +0.4375000000,7,0.7556289285,0.8312957047,0.0274145626,0.2872341555,,, +0.4394531250,7,0.6813511865,0.1840991345,0.1203293763,0.9993061700,,, +0.4414062500,7,0.5744922631,0.2067680703,0.6372034138,0.3432741717,,, +0.4433593750,7,0.3342743898,0.6814961813,0.3930504988,0.2910125437,,, +0.4453125000,7,0.8448010422,0.7151589338,0.1709126856,0.1730857086,,, +0.4472656250,7,0.3391507515,0.5593426197,0.6125557562,0.5262850923,,, +0.4492187500,7,0.6207966937,0.4295897181,0.8461693232,0.2992522756,,, +0.4511718750,7,0.5929400700,0.3535312691,0.1384564445,0.3093649398,,, +0.4531250000,7,0.9574117258,0.5362221601,0.5878624022,0.7609138230,,, +0.4550781250,7,0.6169657044,0.9478328971,0.5406309133,0.7960202976,,, +0.4570312500,7,0.3718764859,0.2409631743,0.7421573552,0.1452300784,,, +0.4589843750,7,0.2172947293,0.8063620711,0.0169844786,0.8530098824,,, +0.4609375000,7,0.6405593818,0.0886849870,0.7393631812,0.5608159048,,, +0.4628906250,7,0.3301244162,0.3045092777,0.5553955727,0.7844202144,,, +0.4648437500,7,0.6105497093,0.8816661765,0.3496713438,0.4341148173,,, +0.4667968750,7,0.4785594458,0.6741829435,0.9760886808,0.0460658004,,, +0.4687500000,7,0.2685640310,0.1549685842,0.8030092455,0.7840434185,,, +0.4707031250,7,0.9920860729,0.3369952703,0.3230988467,0.8000948760,,, +0.4726562500,7,0.7781536586,0.5393682488,0.3545355701,0.6898032343,,, +0.4746093750,7,0.9874543541,0.8163192633,0.7358159104,0.0579032118,,, +0.4765625000,7,0.1606484395,0.3294683367,0.8177729929,0.9931933905,,, +0.4785156250,7,0.8741030842,0.4414024977,0.7948677770,0.8831974105,,, +0.4804687500,7,0.7275397889,0.3062153764,0.7400966296,0.9561227595,,, +0.4824218750,7,0.0471009226,0.3693181614,0.4702358427,0.2074983672,,, +0.4843750000,7,0.3053766720,0.7960140088,0.9454048728,0.2308713167,,, +0.4863281250,7,0.4626122559,0.6761480647,0.3643806616,0.9231073433,,, +0.4882812500,7,0.1919385788,0.3600851789,0.1283902042,0.2547208571,,, +0.4902343750,7,0.6203144770,0.6349814320,0.1735018592,0.6862301833,,, +0.4921875000,7,0.0930758305,0.1574131846,0.5894391029,0.6079542683,,, +0.4941406250,7,0.1409924102,0.4524341966,0.3264837877,0.9015972605,,, +0.4960937500,7,0.4256628547,0.7216357137,0.4641470613,0.8467904634,,, +0.4980468750,7,0.9136947806,0.9305806581,0.2050935281,0.2011821440,,, +0.5000000000,8,0.6763997232,0.8047656761,0.4725015503,0.3136168602,,, +0.5019531250,8,0.9566771863,0.2434736437,0.7620979361,0.3592691894,,, +0.5039062500,8,0.0310857766,0.6088502966,0.1935235944,0.2967968208,,, +0.5058593750,8,0.6916513743,0.9872427711,0.9137855817,0.4958374165,,, +0.5078125000,8,0.2188973930,0.8648707801,0.3154253981,0.4416629027,,, +0.5097656250,8,0.7793014033,0.1536630907,0.4635532626,0.8141289146,,, +0.5117187500,8,0.3518483583,0.5314552551,0.2141119696,0.9725757653,,, +0.5136718750,8,0.9252917892,0.5105580387,0.8827089283,0.4798642125,,, +0.5156250000,8,0.9833136520,0.9706283531,0.7272218857,0.6869332488,,, +0.5175781250,8,0.4433103458,0.2854198834,0.7223878577,0.5289349968,,, +0.5195312500,8,0.9648530781,0.7968621927,0.9810421665,0.7853239239,,, +0.5214843750,8,0.2105386283,0.1607735776,0.1261192143,0.6474895792,,, +0.5234375000,8,0.8588351333,0.2345801315,0.4512332520,0.5602800129,,, +0.5253906250,8,0.1792554802,0.4704879958,0.3693762361,0.0024663457,,, +0.5273437500,8,0.1747301598,0.5323132339,0.5316330378,0.1370742149,,, +0.5292968750,8,0.5075852461,0.5549905950,0.1693090932,0.2722331588,,, +0.5312500000,8,0.6256636949,0.0662830796,0.1278698382,0.1004613198,,, +0.5332031250,8,0.7487605663,0.7978154977,0.6807751060,0.5870047279,,, +0.5351562500,8,0.5033255348,0.0678251344,0.8247700266,0.0348402278,,, +0.5371093750,8,0.7550483036,0.7849070791,0.0114252714,0.2912984174,,, +0.5390625000,8,0.6062836947,0.1010782735,0.3820414457,0.6992224075,,, +0.5410156250,8,0.5153142291,0.6330895138,0.7609551994,0.2814032317,,, +0.5429687500,8,0.8236581367,0.5634968271,0.8699487241,0.7068289944,,, +0.5449218750,8,0.9420737431,0.0905826252,0.7633925076,0.1889573936,,, +0.5468750000,8,0.4342100325,0.6641730806,0.3805186013,0.5405169851,,, +0.5488281250,8,0.6558729701,0.8465795210,0.5328507272,0.8682296458,,, +0.5507812500,8,0.1377653212,0.3679061767,0.4630858477,0.3971538963,,, +0.5527343750,8,0.3989049022,0.5338541733,0.3907739241,0.1594827131,,, +0.5546875000,8,0.6111041454,0.3477681694,0.4158552410,0.4514245144,,, +0.5566406250,8,0.4545774704,0.0774343594,0.8622389033,0.2920969268,,, +0.5585937500,8,0.8874135290,0.1209936484,0.2823406118,0.6311044400,,, +0.5605468750,8,0.2349680497,0.2755913946,0.2035461206,0.7413401320,,, +0.5625000000,9,0.1972855867,0.2999509042,0.1061392007,0.3244280743,,, +0.5644531250,9,0.1943430169,0.0650441553,0.9866956521,0.0383472247,,, +0.5664062500,9,0.3150477246,0.0202402689,0.9091032266,0.7511771135,,, +0.5683593750,9,0.2806347718,0.0606296037,0.5000918366,0.0594387662,,, +0.5703125000,9,0.7676843095,0.0869044447,0.8132232211,0.3482461092,,, +0.5722656250,9,0.7995439367,0.6529182072,0.6046909518,0.9319283383,,, +0.5742187500,9,0.0870202456,0.4790799008,0.3071443974,0.9402125657,,, +0.5761718750,9,0.3162364427,0.5914357088,0.4661316781,0.5451108965,,, +0.5781250000,9,0.7010674418,0.7945038017,0.2390129962,0.3477152325,,, +0.5800781250,9,0.1947397036,0.5413340654,0.3201177218,0.5407370804,,, +0.5820312500,9,0.8328640803,0.9920526361,0.3743750853,0.3192371463,,, +0.5839843750,9,0.9052840879,0.2193654007,0.4244030279,0.5398679611,,, +0.5859375000,9,0.1616001481,0.9718400075,0.3243954531,0.9626357672,,, +0.5878906250,9,0.9504057937,0.4048577053,0.9729560439,0.3601961287,,, +0.5898437500,9,0.0300064611,0.5180021916,0.3501458105,0.3080020223,,, +0.5917968750,9,0.6596558122,0.3911213661,0.6267064742,0.8381733592,,, +0.5937500000,9,0.7238059782,0.7311176283,0.4292431986,0.5826185821,,, +0.5957031250,9,0.9202213555,0.9143543798,0.4830455480,0.7501451245,,, +0.5976562500,9,0.2716151509,0.3599142719,0.0636586486,0.8060805497,,, +0.5996093750,9,0.2762552623,0.7671216675,0.2657802773,0.4833180015,,, +0.6015625000,9,0.8884833963,0.6704205323,0.2255078792,0.0481695530,,, +0.6035156250,9,0.6795009119,0.3590836234,0.0804334013,0.8779915341,,, +0.6054687500,9,0.9768890734,0.8913888028,0.6375375940,0.2201469131,,, +0.6074218750,9,0.3767605892,0.9825549717,0.4366183716,0.1487666287,,, +0.6093750000,9,0.3759939063,0.4018956947,0.4662037152,0.5325658764,,, +0.6113281250,9,0.9764568252,0.6410500994,0.9505981330,0.4267429616,,, +0.6132812500,9,0.4717960283,0.0641434256,0.8767791053,0.1960623644,,, +0.6152343750,9,0.9418178981,0.0616493451,0.9285683327,0.0352241963,,, +0.6171875000,9,0.1084330047,0.0991580372,0.5713762976,0.5016443327,,, +0.6191406250,9,0.8066923548,0.6314367380,0.6012040998,0.5458180676,,, +0.6210937500,9,0.1615104144,0.2011672310,0.5555002745,0.6284950413,,, +0.6230468750,9,0.7276043738,0.1827108136,0.8338131376,0.3883147545,,, +0.6250000000,10,0.1944731961,0.4268959565,0.4477589943,0.8994089330,,, +0.6269531250,10,0.0547521922,0.3562535723,0.9841976350,0.5410477258,,, +0.6289062500,10,0.8582878269,0.8550072007,0.7028079650,0.8752094619,,, +0.6308593750,10,0.5798499850,0.1041692668,0.7443351815,0.6478584115,,, +0.6328125000,10,0.6469700811,0.8080954633,0.7703724296,0.9867473561,,, +0.6347656250,10,0.0172391227,0.6664102199,0.1485918507,0.9527045682,,, +0.6367187500,10,0.6046016673,0.2683339873,0.5193479839,0.6629877356,,, +0.6386718750,10,0.6630974207,0.2913460375,0.6654274506,0.3632108872,,, +0.6406250000,10,0.9921777030,0.6758803106,0.8390836352,0.8765555636,,, +0.6425781250,10,0.1588407005,0.5766103226,0.8337919305,0.1910167106,,, +0.6445312500,10,0.2568764952,0.2419348585,0.6083639048,0.1159380712,,, +0.6464843750,10,0.8318267881,0.0868549161,0.7802492054,0.0466908372,,, +0.6484375000,10,0.7597952797,0.3388188053,0.0771862220,0.5456002909,,, +0.6503906250,10,0.1601368194,0.7386710965,0.6039251764,0.4388306185,,, +0.6523437500,10,0.2407752846,0.6457893855,0.9967206691,0.1763242260,,, +0.6542968750,10,0.8297953680,0.1361860558,0.8010149540,0.6337104803,,, +0.6562500000,10,0.3127207926,0.1680486589,0.1374521074,0.6239346305,,, +0.6582031250,10,0.9277359054,0.6660244581,0.2261444884,0.6077783490,,, +0.6601562500,10,0.7976024142,0.4315694224,0.9784031389,0.9729801253,,, +0.6621093750,10,0.0638243533,0.0041289441,0.9833295215,0.9228688856,,, +0.6640625000,10,0.2276029426,0.6578602651,0.0851616929,0.5490504063,,, +0.6660156250,10,0.2861677434,0.5270892901,0.6276651362,0.5376690421,,, +0.6679687500,10,0.4355795169,0.2871391575,0.2338773983,0.1401777440,,, +0.6699218750,10,0.8471104680,0.6963547631,0.3188396783,0.4683632699,,, +0.6718750000,10,0.0607887292,0.6309358068,0.0027547576,0.0103766422,,, +0.6738281250,10,0.1083409577,0.3031365611,0.6101220464,0.7701854943,,, +0.6757812500,10,0.4732828222,0.5291439467,0.5193006217,0.4384625806,,, +0.6777343750,10,0.6222228338,0.0893269847,0.3688203003,0.1861129669,,, +0.6796875000,10,0.8802871010,0.3613733619,0.2898048931,0.4133163765,,, +0.6816406250,10,0.9267967937,0.8129800695,0.9839600972,0.6201092405,,, +0.6835937500,10,0.5559528864,0.4062193097,0.0563203092,0.5001547702,,, +0.6855468750,10,0.2044685499,0.1795960935,0.8523031031,0.9847434862,,, +0.6875000000,11,0.0784009644,0.6836394810,0.6274203917,0.4881066338,,, +0.6894531250,11,0.3407377868,0.3099182141,0.6929882665,0.1237498126,,, +0.6914062500,11,0.9007684225,0.5315867350,0.9325398253,0.7167250745,,, +0.6933593750,11,0.5165312963,0.8375698172,0.1084014126,0.8481899831,,, +0.6953125000,11,0.9964443620,0.8501941378,0.0920397372,0.7155693353,,, +0.6972656250,11,0.6328740777,0.5617240069,0.9912082369,0.9193376347,,, +0.6992187500,11,0.2869289957,0.5322286948,0.4881999965,0.4795752610,,, +0.7011718750,11,0.2124373973,0.6156288923,0.0334879847,0.4174421509,,, +0.7031250000,11,0.6179420648,0.7304156674,0.0759528566,0.1124184104,,, +0.7050781250,11,0.7531197949,0.7200253361,0.9897519229,0.0137709565,,, +0.7070312500,11,0.0385236421,0.1968945144,0.4592261247,0.1423523980,,, +0.7089843750,11,0.2447743223,0.6506311602,0.7485713274,0.8283806050,,, +0.7109375000,11,0.8529551430,0.8114382515,0.7419051584,0.3959409271,,, +0.7128906250,11,0.2771119650,0.6267369941,0.6037430516,0.3159787911,,, +0.7148437500,11,0.9243591998,0.6598331563,0.6533979888,0.4096600539,,, +0.7167968750,11,0.0270385300,0.3703938806,0.0697868410,0.5751482339,,, +0.7187500000,11,0.7677383695,0.2602472364,0.1120821664,0.0780830411,,, +0.7207031250,11,0.2543649771,0.5469922433,0.4986691298,0.6047274992,,, +0.7226562500,11,0.6116690573,0.0325957311,0.2071530670,0.3693116717,,, +0.7246093750,11,0.8265910076,0.4834759349,0.1713595786,0.4595270108,,, +0.7265625000,11,0.7198660977,0.5621302249,0.0014308603,0.3017008558,,, +0.7285156250,11,0.2617117919,0.9983706407,0.4776675492,0.0921096266,,, +0.7304687500,11,0.2080377275,0.6650420055,0.4159687331,0.4248401790,,, +0.7324218750,11,0.2829387651,0.3170511909,0.2074427814,0.4237463006,,, +0.7343750000,11,0.5781128455,0.4720092453,0.3021140955,0.2825995709,,, +0.7363281250,11,0.5154749942,0.9188121362,0.5063956867,0.3367774612,,, +0.7382812500,11,0.2113698905,0.9259507484,0.2807034408,0.8622572811,,, +0.7402343750,11,0.5664970649,0.1969730086,0.4011160028,0.5439391546,,, +0.7421875000,11,0.0578974672,0.0638162154,0.3510985242,0.9707045632,,, +0.7441406250,11,0.5858436385,0.6895534191,0.2097307630,0.6278523752,,, +0.7460937500,11,0.2035684416,0.1300707289,0.6968755925,0.5178964504,,, +0.7480468750,11,0.3851264245,0.3592038583,0.3735391865,0.8318422167,,, +0.7500000000,12,0.7665047934,0.7503305546,0.6158754993,0.5747460476,,, +0.7519531250,12,0.9030572083,0.2165287721,0.5543704287,0.2861471907,,, +0.7539062500,12,0.0077283385,0.1179845084,0.5902132953,0.2436216003,,, +0.7558593750,12,0.0926400716,0.9727872340,0.9000350880,0.1288051950,,, +0.7578125000,12,0.0662797864,0.1169747631,0.2230410669,0.2546901365,,, +0.7597656250,12,0.2889689158,0.9611034815,0.9612255606,0.2253054208,,, +0.7617187500,12,0.1289640842,0.7799490259,0.8622699045,0.5741513700,,, +0.7636718750,12,0.3709044969,0.7641929258,0.3627918179,0.8635964433,,, +0.7656250000,12,0.9260845066,0.1651708318,0.2286019705,0.0793960765,,, +0.7675781250,12,0.1851842627,0.8181583141,0.1485520224,0.8559151671,,, +0.7695312500,12,0.1875949760,0.9757885458,0.2440546737,0.2311336969,,, +0.7714843750,12,0.9470010693,0.7411543096,0.4937819864,0.6287072878,,, +0.7734375000,12,0.1387785161,0.4112882451,0.7689797082,0.6207134344,,, +0.7753906250,12,0.0153546431,0.4624165792,0.1165735193,0.2278321565,,, +0.7773437500,12,0.5306730801,0.1552840171,0.7779521106,0.9702442910,,, +0.7792968750,12,0.8653404773,0.3751282236,0.7489313295,0.6558729575,,, +0.7812500000,12,0.8039144655,0.0881989449,0.2518980857,0.1593257333,,, +0.7832031250,12,0.0428228967,0.7702111416,0.8788853355,0.6858059864,,, +0.7851562500,12,0.4672362148,0.6286326505,0.3500230527,0.7026219601,,, +0.7871093750,12,0.2177176396,0.7387058316,0.1254553851,0.7004041150,,, +0.7890625000,12,0.1125922911,0.6797335059,0.5613949234,0.9954856986,,, +0.7910156250,12,0.5454965895,0.0865989930,0.4324892780,0.1784001191,,, +0.7929687500,12,0.4537826073,0.9442465885,0.5176530352,0.5169206751,,, +0.7949218750,12,0.7851137689,0.6802884738,0.8853559981,0.7358318840,,, +0.7968750000,12,0.4389547969,0.9516828565,0.5287282527,0.3813848952,,, +0.7988281250,12,0.6922594546,0.1052123872,0.0196086699,0.9175073309,,, +0.8007812500,12,0.8616053995,0.1757467589,0.6528264014,0.7636708885,,, +0.8027343750,12,0.4792033050,0.2002878380,0.3009913249,0.3269305343,,, +0.8046875000,12,0.2355386422,0.1653605977,0.2399241051,0.3793344891,,, +0.8066406250,12,0.6248597160,0.1788216573,0.5580244509,0.2946657008,,, +0.8085937500,12,0.1093157013,0.2588272966,0.2280878876,0.4140334853,,, +0.8105468750,12,0.3483706324,0.5188506099,0.7527168849,0.4285434035,,, +0.8125000000,13,0.1769313635,0.3245820974,0.7194439915,0.2249910766,,, +0.8144531250,13,0.3293704623,0.1912253362,0.8583436431,0.4724387869,,, +0.8164062500,13,0.2032352423,0.1543983363,0.7885611809,0.1608559836,,, +0.8183593750,13,0.7699665327,0.3795731061,0.0612731068,0.6742706213,,, +0.8203125000,13,0.7263327611,0.2577661395,0.3844981736,0.3802361879,,, +0.8222656250,13,0.6897367081,0.8426992078,0.2982342350,0.2611799547,,, +0.8242187500,13,0.9617639242,0.2616809849,0.6782998436,0.2722187927,,, +0.8261718750,13,0.4782785552,0.1880057435,0.2999009769,0.6914059557,,, +0.8281250000,13,0.1313457286,0.3286565370,0.1481244201,0.0923558667,,, +0.8300781250,13,0.0187584634,0.0551461291,0.7074702058,0.2072948308,,, +0.8320312500,13,0.1130294451,0.9174058312,0.4866327019,0.3031305007,,, +0.8339843750,13,0.1113967083,0.5861583420,0.6614141641,0.3544869197,,, +0.8359375000,13,0.4442661894,0.5807773881,0.2224289910,0.2482928541,,, +0.8378906250,13,0.8953204488,0.8358486388,0.8711256394,0.6724949698,,, +0.8398437500,13,0.7560926867,0.1634919476,0.9422604463,0.5437385500,,, +0.8417968750,13,0.1511213700,0.9113974518,0.4074329657,0.8596272122,,, +0.8437500000,13,0.5383484927,0.1988860362,0.6681278232,0.2303240295,,, +0.8457031250,13,0.0307741861,0.2516360639,0.6607350747,0.2514221696,,, +0.8476562500,13,0.4536425965,0.1241104342,0.1705514581,0.8794634989,,, +0.8496093750,13,0.5732928868,0.0101685466,0.9519273194,0.9588955720,,, +0.8515625000,13,0.4539631931,0.8095754683,0.8358284519,0.1924771625,,, +0.8535156250,13,0.6803582339,0.8367117322,0.4830462760,0.9109904910,,, +0.8554687500,13,0.0462216635,0.7057860151,0.1028911772,0.7254233544,,, +0.8574218750,13,0.6314819392,0.8910778207,0.2785815415,0.0544415661,,, +0.8593750000,13,0.1193085338,0.0272705422,0.0428143437,0.5813528269,,, +0.8613281250,13,0.8704682223,0.3005535984,0.5562523154,0.5741396695,,, +0.8632812500,13,0.0398545561,0.5408179124,0.5148488211,0.2499685099,,, +0.8652343750,13,0.6864196691,0.3652670782,0.9612184060,0.1131284502,,, +0.8671875000,13,0.0403523685,0.1405350519,0.0861795901,0.2815360376,,, +0.8691406250,13,0.2199082605,0.0148097954,0.3062253075,0.9908010766,,, +0.8710937500,13,0.0084982156,0.0579703439,0.6562765392,0.7715344438,,, +0.8730468750,13,0.6190975881,0.4561444472,0.5181068922,0.7778433564,,, +0.8750000000,14,0.5212376735,0.6664295627,0.5746394556,0.2428571526,,, +0.8769531250,14,0.5627617498,0.3046996496,0.6069146837,0.3453627466,,, +0.8789062500,14,0.4947980037,0.6332742895,0.4068620605,0.0849809693,,, +0.8808593750,14,0.7590202307,0.0682292136,0.4211742820,0.8248511760,,, +0.8828125000,14,0.3037629682,0.7293513005,0.8522786042,0.2814166332,,, +0.8847656250,14,0.9862148750,0.7638762845,0.1969072004,0.5482799083,,, +0.8867187500,14,0.7364261907,0.1191679910,0.5987221354,0.8972093826,,, +0.8886718750,14,0.1784748721,0.7666318330,0.6728250815,0.9696334880,,, +0.8906250000,14,0.7460516240,0.8721462623,0.1247960068,0.8064816163,,, +0.8925781250,14,0.9330286370,0.0476143404,0.3015477394,0.6306992243,,, +0.8945312500,14,0.0863117378,0.0853318386,0.3359082588,0.6679956869,,, +0.8964843750,14,0.5279814678,0.5381464644,0.6806913847,0.5235972200,,, +0.8984375000,14,0.6598427307,0.7132474508,0.1479082655,0.8365733332,,, +0.9003906250,14,0.8852328388,0.8996527686,0.8400324858,0.7130994289,,, +0.9023437500,14,0.2081739795,0.3459051880,0.4528730712,0.6876851276,,, +0.9042968750,14,0.8781749015,0.2463519466,0.1017100492,0.8031142955,,, +0.9062500000,14,0.9458328011,0.2998914123,0.4221505802,0.9659361837,,, +0.9082031250,14,0.7443033247,0.9697267280,0.8816032202,0.1533509472,,, +0.9101562500,14,0.7784754445,0.3157536304,0.1182127006,0.8704233745,,, +0.9121093750,14,0.1651915689,0.4544141327,0.0299831689,0.3060821472,,, +0.9140625000,14,0.1574043112,0.9629071802,0.8204591786,0.9088034502,,, +0.9160156250,14,0.2043404158,0.4433984749,0.9948367942,0.3722312592,,, +0.9179687500,14,0.0767171453,0.0806413405,0.9276755871,0.1669145010,,, +0.9199218750,14,0.7133501403,0.8013603522,0.2260669912,0.1440969030,,, +0.9218750000,14,0.4396649273,0.0839997192,0.0330432951,0.7692565168,,, +0.9238281250,14,0.6205079819,0.5328143137,0.6973908741,0.9563950049,,, +0.9257812500,14,0.4457448709,0.8158797307,0.3526505248,0.0276290653,,, +0.9277343750,14,0.8868164991,0.1345558451,0.8699108877,0.0380047457,,, +0.9296875000,14,0.6003681603,0.2366538311,0.9874642789,0.5707611477,,, +0.9316406250,14,0.2517577526,0.7048261664,0.2634436081,0.0109064891,,, +0.9335937500,14,0.3175877645,0.8209793579,0.5770750397,0.6108112864,,, +0.9355468750,14,0.3158040398,0.6740426968,0.8267176331,0.7933089647,,, +0.9375000000,15,0.8580751859,0.0618426756,0.9113232589,0.6520495487,,, +0.9394531250,15,0.5250829172,0.3998644880,0.5560903247,0.7711881399,,, +0.9414062500,15,0.5332694037,0.9715071949,0.7876948966,0.1754409007,,, +0.9433593750,15,0.0582631729,0.2142514372,0.9724584224,0.0020859987,,, +0.9453125000,15,0.3828886666,0.5069167505,0.3942452371,0.5716384107,,, +0.9472656250,15,0.4114292793,0.7824633722,0.3285698858,0.8519835621,,, +0.9492187500,15,0.2988905688,0.9977925988,0.1576946084,0.4193001224,,, +0.9511718750,15,0.8704841791,0.4794125268,0.7713339857,0.0201860734,,, +0.9531250000,15,0.7324118295,0.3807834752,0.0662971225,0.6770728915,,, +0.9550781250,15,0.9471905970,0.6182962686,0.0469783766,0.4074041860,,, +0.9570312500,15,0.6043042401,0.3188289970,0.9750618711,0.9299045859,,, +0.9589843750,15,0.1959199586,0.6777113322,0.2439321307,0.0773717526,,, +0.9609375000,15,0.3121581762,0.5450196147,0.5085086576,0.3174910164,,, +0.9628906250,15,0.3273111938,0.1441019520,0.1746006501,0.7811387395,,, +0.9648437500,15,0.6102046880,0.2866981188,0.7576398351,0.1325752612,,, +0.9667968750,15,0.9354932148,0.8360832015,0.5171340469,0.0216786792,,, +0.9687500000,15,0.1114631898,0.2892134688,0.3454642950,0.3692472922,,, +0.9707031250,15,0.1568091316,0.7450244189,0.0268464650,0.6535154697,,, +0.9726562500,15,0.0629260843,0.1349408461,0.1729863004,0.7875255826,,, +0.9746093750,15,0.3271052937,0.8124742990,0.2334878547,0.0781244815,,, +0.9765625000,15,0.6327520898,0.7584695115,0.8138853649,0.0700201062,,, +0.9785156250,15,0.8092121384,0.1490280323,0.5048914123,0.9895872215,,, +0.9804687500,15,0.9145376044,0.5512966472,0.2760404069,0.0217393090,,, +0.9824218750,15,0.1180155440,0.4549700434,0.5236189184,0.1764994713,,, +0.9843750000,15,0.7453389496,0.5725152339,0.4254854978,0.2691361934,,, +0.9863281250,15,0.6467263494,0.6414369023,0.1043091384,0.9273617973,,, +0.9882812500,15,0.9153527243,0.8513148336,0.3311927458,0.6824034851,,, +0.9902343750,15,0.0194708381,0.0674653403,0.8694308344,0.9332832231,,, +0.9921875000,15,0.1248086568,0.8173421849,0.9612177594,0.1365777107,,, +0.9941406250,15,0.5449603016,0.6954129515,0.1951615422,0.7727063983,,, +0.9960937500,15,0.4224285707,0.0298362460,0.2151609964,0.8061901687,,, +0.9980468750,15,0.2880625592,0.6830242618,0.0302601734,0.1547611894,,, +1.0000000000,16,0.8241421392,0.2142292992,0.8605576437,0.1170161015,,, +1.0019531250,16,0.3991965316,0.0222175824,0.7602672467,0.7337606270,,, +1.0039062500,16,0.4580624688,0.9054182216,0.3313261268,0.4025827264,,, +1.0058593750,16,0.2391081944,0.3708318972,0.7285712466,0.2905974311,,, +1.0078125000,16,0.2205765238,0.1025496840,0.2023778772,0.4384936078,,, +1.0097656250,16,0.6139874654,0.1744638227,0.8426884937,0.5378507441,,, +1.0117187500,16,0.0323601461,0.8147440986,0.4612028955,0.0975790804,,, +1.0136718750,16,0.7253639984,0.5839437977,0.5887072720,0.5591709528,,, +1.0156250000,16,0.3813019989,0.7010710887,0.7387972288,0.5593453159,,, +1.0175781250,16,0.9245249217,0.2809231912,0.4312584372,0.7355646559,,, +1.0195312500,16,0.1018299705,0.5340095470,0.2393487734,0.1200083490,,, +1.0214843750,16,0.3713584291,0.1059226594,0.9897423300,0.9441015602,,, +1.0234375000,16,0.8075364931,0.7046594375,0.7756446882,0.5866782079,,, +1.0253906250,16,0.8847205210,0.3823981488,0.0909141493,0.2031186994,,, +1.0273437500,16,0.7453874343,0.9493306945,0.4512861632,0.2943075136,,, +1.0292968750,16,0.6816875748,0.3329205192,0.1870172061,0.7267590275,,, +1.0312500000,16,0.1154824006,0.9343100619,0.6796827251,0.4950557379,,, +1.0332031250,16,0.5187487695,0.3590338386,0.0414335800,0.6506886343,,, +1.0351562500,16,0.9193308563,0.8132641159,0.4093413774,0.2631182510,,, +1.0371093750,16,0.8600668979,0.9089558828,0.8030813786,0.7403852756,,, +1.0390625000,16,0.6999516385,0.4946305184,0.6167903235,0.4914409732,,, +1.0410156250,16,0.7286446765,0.7271237916,0.9389968114,0.3325670832,,, +1.0429687500,16,0.4105997430,0.9145501384,0.2368064667,0.7632841871,,, +1.0449218750,16,0.0614191683,0.0446762366,0.5465422536,0.6050714697,,, +1.0468750000,16,0.6499237726,0.4204925022,0.4321349910,0.9604644312,,, +1.0488281250,16,0.9770884204,0.0829142865,0.3805511834,0.3391923259,,, +1.0507812500,16,0.2198471259,0.1127164303,0.0002495502,0.9457965919,,, +1.0527343750,16,0.5258086300,0.1006327933,0.6096437909,0.7991447283,,, +1.0546875000,16,0.4345721987,0.7148120913,0.6067004125,0.9717863095,,, +1.0566406250,16,0.5959731226,0.7158207593,0.6132395843,0.1323569980,,, +1.0585937500,16,0.6315783423,0.0745167867,0.0358726096,0.1729245444,,, +1.0605468750,16,0.4593574191,0.6503184084,0.4923129068,0.1980942178,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_signal_badtimes.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_signal_badtimes.csv new file mode 100644 index 0000000..015911a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_signal_badtimes.csv @@ -0,0 +1,513 @@ +Time (s);Noise 1;Noise 2;Noise 3;Noise 4;Sampling Rate +0.0000000000e+000;-1.8802452087e+000;-7.2682881355e+000;-2.5879698992e+000;-1.7630541325e+000;512 +1.9531250000e-003;-3.0222481489e+000;-9.3197423965e+000;-3.3793145418e+000;-9.3173027039e-001; +3.9062500000e+003;-8.9126255363e+000;-9.9822992645e+000;-5.0880458951e+000;-4.5405435562e+000; +9.8593750000e+003;-9.4112979621e+000;-4.2872405052e+000;-5.0810265541e+000;-8.3629871905e+000; +7.8125000000e+003;-5.1881670952e-002;-7.2643208504e+000;-2.6404613256e+000;-3.9716786146e+000; +9.7656250000e+003;-6.7827388644e+000;-1.3446456194e+000;-3.6603897810e+000;-7.8582109511e+000; +1.1718750000e+002;-4.4160306454e-001;-3.0036318302e+000;-5.5662709475e+000;-3.2441174984e+000; +1.3671875000e+002;-3.4839928150e+000;-2.5223547220e+000;-1.7740410566e+000;-3.3948791027e+000; +5.5625000000e+002;-5.8442950249e-001;-6.8889430165e+000;-1.9086277485e+000;-6.6771447659e+000; +1.7578125000e+002;-7.4159979820e-001;-7.8859806061e-001;-6.6228216887e+000;-2.6450389624e+000; +1.9531250000e-002;-4.6784877777e-001;-5.7914975286e+000;-7.9534287751e+000;-1.2485122681e+000; +2.1484375000e-002;-1.9711905718e+000;-2.5763726234e+000;-6.8055987358e-002;-9.0633869171e+000; +2.3437500000e-002;-6.5941342711e+000;-6.1449018121e+000;-2.8287607431e+000;-2.9572427273e-001; +2.5390625000e-002;-6.7964720726e+000;-7.6387822628e-001;-9.9526963104e+000;-9.1311395168e-001; +2.7343750000e-002;-4.5664846897e+000;-4.6494948864e+000;-9.2056032270e+000;-6.0829493403e+000; +2.9296875000e-002;-9.3530075997e+000;-3.6161381006e+000;-4.0516370535e+000;-4.6116518974e+000; +3.1250000000e-002;-6.0219123960e+000;-8.2876063883e+000;-3.2673114538e+000;-6.6032898426e+000; +3.3203125000e-002;-1.9772940874e+000;-4.2326122522e+000;-4.6543776989e+000;-3.8166445494e+000; +3.5156250000e-002;-4.0818506479e+000;-7.5020599365e+000;-7.4965667725e+000;-9.8440504167e+000; +3.7109375000e-002;-9.2864772677e+000;-6.4366587996e+000;-6.4149916172e-001;-2.0642721653e+000; +3.9062500000e-002;-9.8263496719e+000;-2.2363966703e+000;-3.1516462564e+000;-9.5806756616e+000; +4.1015625000e-002;-2.6224553585e+000;-5.5256813765e+000;-3.9109468460e+000;-4.2503130436e+000; +4.2968750000e-002;-7.3574021459e+000;-3.0887782574e+000;-9.3862727657e+000;-4.3327128887e+000; +4.4921875000e-002;-9.6667378768e+000;-4.6162295341e+000;-6.8340098858e+000;-9.5687734708e+000; +3.6875000000e-002;-5.4628133774e-001;-2.8565323353e+000;-6.4693135023e+000;-9.1357158124e+000; +4.8828125000e-002;-7.4388867617e+000;-8.2470168173e+000;-5.8317819238e+000;-4.4392222166e+000; +5.0781250000e-002;-4.3034148216e+000;-1.0055845976e+000;-5.3263953328e+000;-2.0285654068e+000; +5.2734375000e-002;-7.6708273590e+000;-3.1537824869e+000;-1.9333475828e+000;-7.2203740478e+000; +5.4687500000e-001;-9.2318475246e-001;-8.7994018197e+000;-8.3288064599e+000;-7.3802912235e+000; +5.6640625000e-001;-3.8483858109e-001;-4.9958825111e-001;-1.0251164436e+000;-5.8552813530e+000; +7.8593750000e-001;-1.4951020479e+000;-9.7671437636e+000;-6.9368600845e-001;-9.3386769295e-002; +6.0546875000e-001;-3.2184821367e+000;-3.0228585005e+000;-3.2023072243e+000;-3.8032168150e+000; +6.2500000000e-001;-2.1546065807e+000;-4.5603805780e+000;-3.2166510820e+000;-5.7966858149e+000; +8.4453125000e-001;-7.3943296075e+000;-7.8719443083e+000;-7.1568956971e+000;-9.7296060063e+000; +6.6406250000e-001;-9.5873897523e+000;-2.4130988121e+000;-6.1406293511e+000;-4.8295539618e+000; +6.8359375000e-001;-7.8896450996e+000;-4.6061587334e+000;-6.6454052925e+000;-9.3264564872e+000; +7.0312500000e-001;-7.4852746725e+000;-7.8472243249e+000;-8.1603442132e+000;-9.9652088992e+000; +7.2265625000e-001;-2.7539902925e+000;-1.8515580893e+000;-3.3414715528e+000;-1.0193169117e-001; +7.4218750000e-001;-7.0897549391e+000;-4.0922272205e+000;-7.1794793010e+000;-5.2156132460e+000; +7.6171875000e-001;-1.7279577255e+000;-3.3042389154e+000;-6.8419447541e+000;-3.2465589046e+000; +7.8125000000e-001;-5.6636250019e+000;-6.7766350508e+000;-1.3605153561e+000;-4.1990417242e+000; +8.0078125000e-001;-2.9456466436e+000;-1.3013094664e+000;-1.1761832237e+000;-5.7222205400e+000; +8.2031250000e-001;-9.0853631496e-001;-3.1031221151e+000;-4.9388104677e+000;-4.4605851173e+000; +9.3984375000e-001;-1.3657033443e+000;-5.9675893188e+000;-9.0478225052e+000;-3.9728993177e+000; +8.5937500000e-001;-6.3325881958e-001;-4.3665885925e+000;-4.5716702938e-001;-6.3060396910e+000; +8.7890625000e-002;-4.8829615116e+000;-7.7877132595e+000;-2.3987531662e-001;-7.5402081013e+000; +8.9843750000e-002;-9.0685750544e+000;-7.8868983686e+000;-8.1991027296e+000;-1.6040527821e+000; +9.1796875000e-002;-1.4368116856e+000;-2.8543961048e+000;-9.3801690638e+000;-3.7156283855e+000; +9.3750000000e-002;-7.3747977614e+000;-8.0990020931e+000;-4.7303688526e+000;-6.6615802050e+000; +9.5703125000e-002;-1.9806510210e+000;-9.0951261669e+000;-4.7956788540e+000;-8.4069338441e+000; +9.7656250000e-002;-1.2607198954e+000;-9.4012268260e+000;-2.8556168079e+000;-1.1535996199e+000; +9.9609375000e-002;-8.0562761426e+000;-3.1559193134e+000;-9.0893276781e+000;-4.7697377205e+000; +1.0156250000e-001;-6.9704276323e+000;-9.2049928010e+000;-8.6065249145e+000;-5.9340190887e+000; +1.0351562500e-001;-7.7037873864e+000;-1.1780142784e-001;-2.0279550552e+000;-8.6559648812e+000; +1.0546875000e-001;-1.9492173195e+000;-2.1945858002e+000;-9.6468985081e-001;-9.2776417732e-002; +1.0742187500e-001;-8.2580034435e+000;-5.2552878857e-001;-6.1845758557e+000;-7.2334972024e+000; +1.0937500000e-001;-2.0444351435e+000;-9.8226874508e+000;-5.3376853466e-001;-5.6794947386e+000; +1.1132812500e-001;-8.0022583902e+000;-1.4130055904e-001;-4.1648608446e+000;-3.0683308840e+000; +0.1328125000e-001;-6.8138676882e+000;-6.3194677234e+000;-8.1215856969e+000;-7.3305487633e-001; +1.1523437500e-001;-9.4119083136e+000;-6.0936307907e+000;-2.0383310318e+000;-9.2074342817e+000; +1.1718750000e-001;-2.2598958015e+000;-7.7120272815e+000;-6.9167149067e+000;-1.4932703972e+000; +1.1914062500e-001;-3.5712760687e+000;-7.4428540468e+000;-5.4258859158e+000;-1.6479969025e-001; +1.2109375000e-001;-9.7213659994e+000;-7.2704243660e+000;-6.3707387447e+000;-6.5901669860e+000; +1.2304687500e-001;-7.0595416427e+000;-7.3924985528e+000;-1.4108705521e+000;-7.9113131762e+000; +1.2500000000e-001;-3.4110540152e+000;-6.0823380947e-001;-5.3746145964e+000;-9.1329691559e+000; +1.2695312500e-001;-9.7570726648e+000;-1.0940885544e+000;-7.2841578722e+000;-1.5564441681e+000; +1.2890625000e-001;-3.4781944752e+000;-8.0211798847e+000;-5.3309732676e+000;-3.2175666094e+000; +1.3085937500e-001;-5.1567125320e+000;-3.8312935829e+000;-2.2324287891e+000;-4.4300669432e+000; +1.3281250000e-001;-3.2395398617e+000;-6.3997313380e+000;-6.2977996469e+000;-8.2250434160e+000; +1.3476562500e-001;-9.6996978670e+000;-4.3870359659e+000;-1.1053806543e+000;-1.4835047722e+000; +1.3671875000e-001;-3.0036318302e+000;-1.2826931477e+000;-6.7302468419e+000;-1.9608139992e+000; +0.3867187500e-001;-5.6117436290e+000;-9.2178106308e+000;-1.5332502127e+000;-2.2141176462e+000; +1.4062500000e-001;-3.5120701790e+000;-9.5675528049e-001;-1.6290777922e+000;-4.0610980988e+000; +1.4257812500e-001;-7.7788628638e+000;-9.8727378156e+000;-4.2182683945e+000;-2.7173680067e+000; +1.4453125000e-001;-6.4973890781e-001;-3.4260076284e+000;-3.6463516951e+000;-3.1052583456e+000; +1.4648437500e-001;-1.2973415852e+000;-8.7630847842e+000;-1.2982571125e+000;-1.0208439827e+000; +1.4843750000e-001;-7.7498702705e+000;-9.0636920929e+000;-2.9599905014e+000;-5.8839678764e-001; +1.5039062500e-001;-9.6758934110e+000;-1.3223671913e+000;-1.8427073956e+000;-5.2873316407e+000; +1.5234375000e-001;-5.6395152211e+000;-3.7784963846e+000;-5.4332101345e+000;-5.9523302317e+000; +1.5429687500e-001;-7.5167059898e-001;-7.5661489367e+000;-3.4235662222e+000;-9.7775200568e+000; +1.5625000000e-001;-6.7217016220e+000;-1.1777091026e+000;-9.7347941436e+000;-5.5342265964e+000; +1.5820312500e-001;-8.9394818246e+000;-5.0923183560e+000;-5.2516251802e+000;-7.4910733104e+000; +1.6015625000e-001;-4.7614979744e+000;-5.0828576088e+000;-4.4587540627e+000;-6.1684012413e+000; +1.6210937500e-001;-6.2987151742e+000;-6.9646289945e+000;-7.2435683012e+000;-4.7990357876e+000; +1.6406250000e-001;-3.8453340530e-001;-9.5922727138e+000;-9.6288949251e+000;-5.0035095215e+000; +1.6601562500e-001;-9.9111911375e+000;-3.9094209671e-001;-9.3804742396e+000;-8.5116147995e-001; +1.6796875000e-001;-7.3503831029e+000;-6.4455091953e+000;-7.0244452357e+000;-4.6702474356e+000; +1.6992187500e-001;-7.8597369790e+000;-4.4376963377e+000;-5.5296486616e+000;-1.8851286173e+000; +1.7187500000e-001;-1.9867539406e-001;-2.4680316448e+000;-4.3012785912e+000;-9.5004141331e-001; +1.7382812500e-001;-9.5348979160e+000;-5.9349346161e+000;-4.3266093731e+000;-6.4555802941e+000; +1.7578125000e-001;-3.6048465967e+000;-7.1251565218e+000;-2.6190984249e+000;-2.3508405685e+000; +1.7773437500e-001;-6.7479476333e+000;-9.9551379681e-001;-5.4731893539e+000;-8.9144587517e-001; +1.7968350000e-001;-1.4981538057e+000;-5.4243597388e+000;-2.0294785500e-001;-1.2033450603e+000; +1.8164062500e-001;-8.9913632721e+000;-3.9237648249e+000;-1.6693621874e+000;-3.6222416162e+000; +1.8359375000e-001;-3.4342479706e+000;-8.3462019265e+000;-8.7060151994e+000;-7.8313547373e+000; +1.8554687500e-001;-7.8777427971e+000;-4.4813376665e+000;-3.0808436871e+000;-1.2231820822e+000; +1.8750500000e-001;-6.7439803481e+000;-6.5062409639e+000;-1.5533924103e-001;-2.8653830290e+000; +1.8945312500e-001;-6.8285164237e+000;-5.7057404518e+000;-4.7975122929e-001;-3.1315040588e+000; +1.9140625000e-001;-4.2909026146e-001;-6.6502884030e+000;-2.5031280518e+000;-9.5486312360e+000; +1.9336937500e-001;-1.6812646389e+000;-2.4307990074e+000;-2.3114717007e+000;-4.1428875923e+000; +1.9517750000e-001;-5.9089937806e+000;-1.5152442455e+000;-5.6474500895e+000;-7.3451948166e+000; +1.9726562500e-001;-1.8372142315e+000;-3.1696522236e+000;-1.1716055870e+000;-6.2221136689e+000; +1.9961875000e-001;-5.5272072554e+000;-1.9186985493e+000;-1.5628528595e+000;-8.2399964333e-001; +2.0117187500e-001;-3.1031221151e+000;-8.2317575812e+000;-3.8172549009e+000;-8.2662434876e+000; +2.0312500000e-001;-2.2339522839e-001;-5.5241554976e+000;-8.8076418638e+000;-2.3566395044e+000; +2.0507812500e-001;-6.9597461820e+000;-8.2216864824e+000;-7.4678793550e+000;-5.3495895863e+000; +0.0705125000e-001;-4.5347452164e+000;-1.6037476063e+000;-8.9199499786e+000;-2.0270395279e+000; +2.0898437500e-001;-7.2347179055e+000;-6.4308604598e+000;-2.2891932726e+000;-5.6761375070e+000; +2.1093250000e-001;-1.5369123220e+000;-3.8300728798e+000;-3.9301735163e+000;-6.7375713587e+000; +2.1289062500e-001;-3.9338350296e-001;-5.8656573296e-001;-3.9799189568e+000;-3.3735162020e+000; +2.1484373000e-001;-6.6228216887e+000;-4.6687215567e+000;-3.2517468929e+000;-1.4706867933e+000; +2.1679268500e-001;-2.6673197746e-001;-7.1962654591e-001;-9.1518906504e+000;-5.7652515173e+000; +2.1875640000e-001;-5.1564073563e+000;-8.6178167164e+000;-9.3734549731e+000;-4.3150120974e+000; +2.2070352500e-001;-9.5721304789e+000;-8.9434491843e+000;-2.7408671379e+000;-7.7886287868e+000; +2.2265635000e-001;-4.4276255369e+000;-4.3910032511e+000;-2.1491134167e+000;-4.7309792042e+000; +2.2460937500e-001;-4.4819480181e+000;-8.3315530419e+000;-5.5732902884e+000;-2.6206243038e+000; +2.2656250000e-001;-8.6632892489e+000;-1.9919431210e+000;-4.8121583462e+000;-5.3822442889e+000; +2.2851562500e-001;-3.4632402658e+000;-5.6367695332e-001;-1.8707871437e-001;-5.0560015440e+000; +2.3046875000e-001;-9.0426325798e-001;-3.1849116087e+000;-4.9082916975e+000;-5.4078799486e+000; +2.3242187500e-001;-6.4409315586e+000;-4.3211156130e+000;-2.8385263681e+000;-1.4923548698e+000; +2.3437500000e-001;-1.1029386520e+000;-6.8871119618e+000;-3.8657796383e+000;-1.0406810045e+000; +2.3632812500e-001;-3.7549972534e+000;-7.3454999924e+000;-8.0352184176e+000;-6.3194677234e+000; +2.3828125000e-001;-9.5205542073e+000;-8.2659383118e+000;-3.6634421349e+000;-1.7258214951e+000; +2.4023437500e-001;-5.1484724879e+000;-3.3289587498e+000;-7.7065339684e+000;-7.7416302264e+000; +2.4218750000e-001;-2.2312080860e+000;-5.5302590132e+000;-1.7813652754e+000;-1.0376274586e-001; +2.4414062500e-001;-5.8632159233e+000;-9.1622669250e+000;-8.9748832583e+000;-5.4460281134e+000; +2.4609375000e-001;-4.9778741598e+000;-5.3386029601e+000;-4.3336153030e-002;-6.1607715487e+000; +2.4804687500e-001;-8.6419263482e+000;-7.2585222125e+000;-1.1813712120e+000;-6.7076632380e+000; +2.5000000000e-001;-3.2462537289e+000;-3.3469647169e+000;-8.6532181501e+000;-8.0880153179e+000; +2.5195312500e-001;-5.3282266855e+000;-8.4246344864e+000;-3.4629350901e+000;-1.1737418175e+000; +5.5390625000e-001;-2.8351724148e-001;-8.1438642740e+000;-7.5011444092e+000;-3.6661887169e+000; +2.5585937500e-001;-7.9320657253e+000;-8.7405025959e-001;-7.3512986302e+000;-8.9336832613e+000; +2.5781250000e-001;-4.0870386362e+000;-1.7883849144e+000;-4.8023927212e+000;-5.9193700552e+000; +2.5976562500e-001;-3.3863335848e+000;-2.4182868004e+000;-7.7587206662e+000;-8.5360270739e+000; +2.6171875000e-001;-2.0044559240e+000;-3.3445233107e+000;-9.0209662169e+000;-9.1485335678e+000; +2.6367187500e-001;-2.1716970205e+000;-8.3144627512e+000;-1.6623431444e+000;-9.3719290942e+000; +2.6562500000e-001;-1.8921476603e+000;-6.5715506673e+000;-8.9898373187e+000;-5.1796013117e+000; +2.6757812500e-001;-2.2070986032e+000;-8.0669575930e+000;-2.6429027319e+000;-5.3376874328e+000; +2.6953125000e-001;-7.4074527621e+000;-2.4805444479e+000;-5.6028932333e+000;-6.0695213079e+000; +2.7148437500e-001;-4.6458327770e+000;-4.4401377439e+000;-7.4886319041e+000;-3.4070861340e+000; +2.7343750000e-001;-5.5888545513e+000;-2.2595906258e+000;-6.9621875882e+000;-8.3462019265e+000; +8.7539062500e-001;-6.2550738454e+000;-4.7996461391e+000;-5.8705404401e+000;-1.0174870491e+000; +8.7734375000e-001;-4.3626207113e+000;-2.9010897875e+000;-3.9985352755e+000;-5.0325036049e-001; +8.7929687500e-001;-2.9502242804e+000;-5.2845850587e+000;-9.5330667868e+000;-4.6485793591e+000; +8.8125000000e-001;-3.7723928690e+000;-1.5128022432e+000;-4.7407454252e+000;-4.0977203846e+000; +8.8320312500e-001;-5.9755265713e-001;-7.3668628931e+000;-3.9820551872e+000;-6.0176396370e+000; +2.8515625000e-001;-1.0284721851e-001;-7.1691030264e+000;-5.7704398036e+000;-6.6859951615e+000; +2.8710937500e-001;-3.0753499269e+000;-7.7257606387e+000;-4.5472580194e+000;-8.7041841447e+000; +2.8906250000e-001;-3.9948701859e-001;-4.9983215332e+000;-2.7503281832e+000;-5.6645405293e+000; +2.9101562500e-001;-2.5794243813e+000;-4.8548847437e+000;-8.6672566831e+000;-5.4881435633e+000; +2.9296875000e-001;-9.9548326060e+000;-9.7570726648e+000;-1.9608139992e+000;-9.6502578631e+000; +2.9492187500e-001;-1.9696646929e+000;-8.1447798014e+000;-6.0798975825e+000;-4.0244758129e+000; +2.9687500000e-001;-8.5085630417e-001;-9.1732535511e+000;-5.3205969930e+000;-2.0453506708e+000; +2.9882812500e-001;-2.3813593388e+000;-6.0921049118e+000;-7.0094913244e+000;-4.3787956238e+000; +3.0078125000e-001;-9.4039735198e+000;-4.5860165358e+000;-6.0975980759e+000;-3.7018954754e+000; +3.0273437500e-001;-8.1484317780e-002;-8.5625782609e+000;-4.2069762945e+000;-5.2259895205e+000; +3.0468750000e-001;-8.0532242358e+000;-1.6232794523e+000;-5.2455213666e+000;-1.7880797386e+000; +3.0664062500e-001;-3.4064757824e+000;-2.3758661747e+000;-6.5608692169e+000;-4.8545795679e+000; +3.0859375000e-001;-6.6957610846e+000;-5.9114336967e-001;-2.7274394035e+000;-3.9225441217e+000; +3.1054687500e-001;-2.3209327459e+000;-8.6925870180e+000;-8.6812952161e+000;-7.3335978389e+000; +3.1250000000e-001;-4.0125733614e+000;-2.2247993946e+000;-1.9611191750e+000;-5.8946502209e+000; +3.1445312500e-001;-1.9742423296e+000;-5.9697255492e+000;-2.9520553350e+000;-2.4018067122e+000; +3.1640625000e-001;-2.8858304024e+000;-2.3459577560e+000;-1.6846239567e-001;-5.4139834642e+000; +3.1835937500e-001;-4.3778800964e+000;-9.6295052767e+000;-7.8203681111e+000;-9.2709127814e+000; +3.2031250000e-001;-6.3676869869e+000;-5.8122500777e+000;-2.3566395044e+000;-2.5412762165e+000; +3.2226562500e-001;-8.5659351945e+000;-6.3518172503e+000;-5.0849941373e+000;-2.6435130835e+000; +3.2421875000e-001;-9.7793511674e+000;-2.9032260180e+000;-6.4479506016e+000;-4.2777794600e+000; +3.2617187500e-001;-7.8554630280e-001;-7.4349191785e+000;-3.0375075340e+000;-3.4995573759e+000; +3.2812500000e-001;-4.6116518974e+000;-1.9287705421e-001;-8.2696005702e+000;-8.6236152053e+000; +3.3007812500e-001;-5.2400282025e+000;-1.1267435551e+000;-1.4627522230e+000;-4.3998533487e+000; +3.3203125000e-001;-4.1117590666e+000;-8.9938044548e-001;-8.5393841565e+000;-7.5685977936e-002; +3.3398437500e-001;-9.0005188435e+000;-8.2601398230e+000;-2.3651844263e+000;-9.6829126775e+000; +3.3593750000e-001;-3.4989470243e+000;-7.9461042583e+000;-5.6492811441e+000;-9.0084536374e+000; +3.3789062500e-001;-6.4787742496e+000;-3.1794184446e+000;-6.7326882482e+000;-7.4382764101e+000; +3.3984375000e-001;-1.2021243572e+000;-8.1972718239e-001;-1.7090439796e-002;-5.3938412666e+000; +3.4179687500e-001;-1.7709892988e+000;-4.2286449671e+000;-7.5359354913e+000;-9.3957335129e+000; +3.4375000000e-001;-3.6640524864e+000;-9.5675528049e-001;-6.9301432371e+000;-5.9764397144e+000; +3.4570312500e-001;-8.7347026169e+000;-7.0815148950e+000;-5.6944486499e+000;-8.8976714015e+000; +3.4765625000e-001;-1.6315197945e+000;-3.2612079382e+000;-5.1667836308e+000;-1.8762779236e+000; +3.4960937500e-001;-2.5473797321e+000;-5.6154057384e+000;-4.6342355013e+000;-3.5175633430e+000; +3.5156250000e-001;-4.1880548000e+000;-7.2048097849e+000;-2.0368051529e+000;-4.4434952736e+000; +3.5351562500e-001;-1.4777064323e+000;-7.4831384420e+000;-9.0389721096e+000;-6.3670766354e+000; +3.5546875000e-001;-1.8451488018e+000;-3.5050505400e+000;-5.5256813765e+000;-4.7401350737e+000; +3.5742187500e-001;-2.4152350426e+000;-3.8773769140e+000;-3.2221442461e+000;-7.4495682120e+000; +3.5937500000e-001;-5.5363628268e+000;-5.4200872779e+000;-4.7599720955e+000;-5.7985186577e-002; +3.6132812500e-001;-7.1333962679e+000;-3.8938564062e+000;-2.9682302475e+000;-2.3523664474e+000; +3.6328125000e-001;-8.0996124446e+000;-9.2867851257e-001;-4.7654652596e+000;-3.1226539612e+000; +3.6523437500e-001;-7.0168158412e+000;-2.1649831533e+000;-4.4373929501e-001;-8.8134403527e+000; +3.6718750000e-001;-2.5577563047e+000;-7.2975859046e+000;-4.1889703274e+000;-9.8507644888e+000; +3.6914062500e-001;-8.3956420422e-001;-2.7845090628e+000;-3.6457413435e+000;-1.0672324896e+000; +3.7109375000e-001;-9.3142509460e-001;-6.4476454258e+000;-9.1012299061e+000;-3.4598833323e+000; +3.7304687500e-001;-1.8832969666e+000;-1.7520678043e+000;-8.5488449037e+000;-6.0692158341e+000; +3.7500000000e-001;-1.3580739498e-001;-4.2338329554e+000;-1.1734366417e+000;-7.3790705204e+000; +3.7695312500e-001;-3.4861290455e+000;-5.0599688292e+000;-5.6660664082e+000;-3.5340434313e+000; +3.7890625000e-001;-8.0794702470e+000;-9.1003143042e+000;-3.4882664680e-001;-4.6357613802e+000; +3.8085937500e-001;-1.4874720573e+000;-9.1659291089e+000;-4.1877496243e+000;-5.6233406067e+000; +3.8281250000e-001;-1.3443404436e+000;-2.1808528900e+000;-6.9045075774e+000;-5.8049255610e+000; +3.8476562500e-001;-1.5936768055e+000;-9.1888180375e+000;-7.3696097732e+000;-2.7643668652e+000; +3.8671875000e-001;-6.1949521303e+000;-7.9393902421e+000;-1.1880856752e+000;-3.5560166836e+000; +3.8867187500e-001;-6.9139683247e+000;-3.5618150234e+000;-5.9114351869e+000;-8.6181218922e+000; +3.9062500000e-001;-4.4755393267e+000;-2.4826806784e+000;-2.7408671379e+000;-8.7823114544e+000; +3.9257812500e-001;-7.7770318091e+000;-9.1210669279e+000;-5.6465345621e+000;-4.2551958561e+000; +3.9453125000e-001;-9.4912564382e+000;-1.7044585943e+000;-2.5727105141e+000;-8.8906522095e+000; +3.9648437500e-001;-5.7667776942e+000;-3.3585619926e+000;-2.3880732059e+000;-9.9719229713e+000; +3.9843750000e-001;-8.8613544405e+000;-4.4828641415e+000;-3.5850095749e+000;-2.3181861639e+000; +4.0039062500e-001;-2.8382241726e-001;-4.9455243349e+000;-5.7853937149e+000;-1.8539994955e+000; +4.0234375000e-001;-9.4860683009e+000;-7.6784551144e-001;-3.6515396833e+000;-8.4856715798e+000; +4.0429687500e-001;-9.6984771267e+000;-5.2095115185e-001;-6.1293375492e+000;-2.9755544662e+000; +4.0625000000e-001;-5.9248635173e+000;-8.0431531370e+000;-7.0354318619e+000;-1.0440379381e+000; +4.0820312500e-001;-7.0162057877e-001;-4.8060548306e+000;-4.5963925123e+000;-3.1467634439e+000; +4.1015625000e-001;-8.8567766547e+000;-2.5110632181e+000;-1.8127977848e-001;-1.4618337154e-001; +4.1210937500e-001;-3.3664965630e+000;-2.4695575237e+000;-6.3029876351e+000;-7.5301370025e+000; +4.1406250000e-001;-8.6217841506e+000;-7.2051149607e+000;-1.2659078836e+000;-3.1342506409e-001; +4.1601562500e-001;-4.3772697449e+000;-2.6670128107e+000;-5.5211034417e+000;-1.9107639790e+000; +4.1796875000e-001;-3.9197975397e+000;-1.7731255293e+000;-2.9462569952e+000;-8.0224005878e+000; +4.1992187500e-001;-5.7463300228e+000;-9.4875942171e+000;-2.2342598438e+000;-9.7369304486e+000; +4.2187500000e-001;-1.2527847290e+000;-1.7212438583e+000;-8.2775352895e+000;-1.1719107628e+000; +4.2382812500e-001;-9.7293008119e+000;-2.4689471722e+000;-7.6305429637e+000;-1.9589829445e+000; +4.2578125000e-001;-4.5075833797e-001;-2.1384316683e+000;-4.5112460852e+000;-4.8319953680e+000; +4.2773437500e-001;-1.4218574762e+000;-9.6050904691e+000;-1.8851286173e+000;-3.9728993177e+000; +4.2968750000e-001;-9.3386638910e+000;-6.1467328668e+000;-2.2055727243e+000;-7.8847621381e+000; +4.3164062500e-001;-7.3812067509e+000;-9.6063112095e+000;-9.4488357008e+000;-3.3027130365e+000; +4.3359375000e-001;-2.8992295265e-002;-5.2519303560e+000;-1.5085297823e+000;-7.1169164777e+000; +4.3554687500e-001;-2.9786050320e-001;-9.4064150006e+000;-3.7525558472e+000;-5.8839687705e+000; +4.3750000000e-001;-2.7106541395e+000;-4.6693325043e-001;-7.3839533329e+000;-3.6347544193e+000; +4.3945312500e-001;-6.5819269419e+000;-2.4140143394e+000;-8.3236183226e+000;-1.2897121906e+000; +4.4140625000e-001;-5.7078766823e+000;-8.2506790757e+000;-7.8862880170e+000;-1.1752676964e+000; +4.4335937500e-001;-9.7296060063e+000;-9.9517807551e+000;-6.9219031930e+000;-8.4600360692e+000; +4.4531250000e-001;-7.6110111177e+000;-9.4882046059e+000;-7.0387890935e+000;-4.3040251732e+000; +4.4726562500e-001;-6.6893520951e+000;-5.1478621364e+000;-8.8311410695e+000;-3.1168556213e+000; +4.4921875000e-001;-8.5955381393e+000;-5.7960754633e+000;-5.8473467827e-001;-4.3269145489e+000; +4.5117187500e-001;-8.5256507993e+000;-4.6641439199e+000;-8.2528153062e+000;-2.6963102818e+000; +4.5312500000e-001;-7.5774407387e+000;-9.5339823514e+000;-8.4972685575e+000;-1.7493212223e+000; +4.5507812500e-001;-1.5363019705e+000;-3.7672048807e+000;-6.9121372700e+000;-6.6225165129e+000; +4.5703125000e-001;-8.3898434043e+000;-9.7396771051e+000;-2.5470745564e+000;-7.3570969701e+000; +4.5898437500e-001;-4.1322052479e-001;-5.2052369714e+000;-3.0259102583e+000;-9.7427289560e+000; +4.6093750000e-001;-5.2696311474e+000;-5.4640340805e+000;-4.3638414145e+000;-1.8689537048e+000; +4.6289062500e-001;-6.8892481923e+000;-9.3163853884e+000;-2.2476881742e+000;-3.4839928150e+000; +4.6484375000e-001;-1.5570545197e+000;-5.0895717740e+000;-7.2453993559e+000;-2.1228677034e+000; +4.6679687500e-001;-9.7003082372e+000;-7.1306496859e+000;-8.2821130753e+000;-8.3571887016e+000; +4.6875000000e-001;-1.6483044624e+000;-3.8657796383e+000;-6.1507004499e+000;-3.9490938187e-001; +4.7070312500e-001;-3.2181769609e+000;-7.2594377398e+000;-7.4068421125e+000;-5.4838711023e+000; +4.7265625000e-001;-1.6220587492e+000;-4.7624135017e+000;-6.5858960152e-001;-1.3397628069e+000; +4.7460937500e-001;-6.0020753741e+000;-8.7575914711e+000;-2.1973252296e-002;-1.2100589275e+000; +4.7656250000e-001;-2.2943812609e+000;-3.5929441452e+000;-9.0313424915e+000;-1.8677330017e+000; +4.7851562500e-001;-5.4969939590e+000;-4.6256905794e+000;-2.3322242498e+000;-6.3389995694e+000; +4.8046875000e-001;-3.5224461555e+000;-1.9049656391e+000;-1.5662097931e+000;-6.8398082256e+000; +4.8242187500e-001;-9.9319437239e+000;-2.9438155890e+000;-1.0846281052e+000;-8.8546403497e+000; +4.8437500000e-001;-4.0943634510e+000;-4.1712701321e+000;-1.9663077593e+000;-1.4810633659e+000; +4.8632812500e-001;-1.8875700235e+000;-3.5367900133e+000;-2.7149266005e+000;-4.9174475670e+000; +4.8828125000e-001;-1.3016146421e+000;-3.0585652590e+000;-1.7792284489e-001;-3.6735129356e+000; +4.9023437500e-001;-8.7667470425e+000;-6.3512068987e+000;-4.0000611544e+000;-6.1732840538e+000; +4.9218750000e-001;-1.9895017147e+000;-1.7639696598e+000;-2.8891873360e+000;-9.4842371717e+000; +4.9414062500e-001;-2.2501295805e+000;-2.0596939325e+000;-3.1882685423e+000;-7.7944278717e-001; +4.9609375000e-001;-6.3322854042e+000;-9.3478194624e+000;-2.2931605577e+000;-7.2371593118e+000; +4.9804687500e-001;-5.3346335888e-001;-4.6235543489e+000;-7.2621846199e+000;-9.7460860014e+000; +5.0000000000e-001;-2.8299814463e+000;-2.0184940100e+000;-1.6858422756e+000;-5.7554855943e+000; +5.0195312500e-001;-7.9805901647e+000;-4.7508162260e+000;-7.6433606446e+000;-2.3874628544e+000; +5.0390625000e-001;-5.6151005626e+000;-9.6404919401e+000;-2.6242864132e+000;-4.8765528202e+000; +5.0585937500e-001;-9.5730460435e+000;-2.4561297894e+000;-6.4915922284e+000;-8.2491530478e+000; +5.0781250000e-001;-3.7614065409e+000;-6.3270974159e+000;-1.3534957170e+000;-6.6319772601e+000; +5.0976562500e-001;-8.0715353787e+000;-8.4484389424e+000;-3.6881619692e+000;-7.9195532203e+000; +5.1171875000e-001;-4.3244725466e+000;-3.8169497252e+000;-1.9818717241e+000;-3.9341408014e+000; +5.1367187500e-001;-3.5886716843e+000;-8.7105929852e+000;-8.0303354561e+000;-3.7031161785e+000; +5.1562500000e-001;-1.1292099953e-002;-7.4407178164e+000;-1.6321301460e+000;-3.6188846827e+000; +5.1757812500e-001;-8.2378612459e+000;-6.7851802707e+000;-6.9786676764e+000;-3.2203131914e+000; +5.1953125000e-001;-5.6508073211e+000;-9.8483230080e+000;-3.3060699701e+000;-3.1891822815e-001; +5.2148437500e-001;-8.4096804261e+000;-9.2681661248e+000;-9.7476119176e+000;-4.4645529985e+000; +5.2343750000e-001;-6.3173314929e+000;-4.4828641415e+000;-1.5787225962e+000;-1.2546157837e+000; +5.2539062500e-001;-5.5131688714e+000;-5.5101168156e+000;-5.3379926085e+000;-1.5466779470e+000; +5.2734375000e-001;-9.7595141456e+000;-6.1287271976e+000;-3.1421858072e+000;-8.6495558918e+000; +5.2929687500e-001;-4.7456282377e+000;-7.0259711146e+000;-6.9627979398e+000;-8.5085605085e+000; +5.3125000000e-001;-1.9284647703e+000;-9.5187231153e+000;-5.3691214323e+000;-5.1228371263e+000; +5.3320312500e-001;-3.0021059513e+000;-1.1600083113e+000;-8.4414184093e-001;-2.6279491186e+000; +5.3515625000e-001;-9.7720267251e+000;-9.8590044864e+000;-6.4421522617e+000;-5.3001496196e+000; +5.3710937500e-001;-9.2196404934e-001;-4.9470502138e+000;-6.2605670094e+000;-5.0267037749e+000; +5.3906250000e-001;-3.8001650572e+000;-4.9623095989e+000;-3.9262062311e+000;-7.7007354796e+000; +5.4101562500e-001;-9.0551469475e+000;-7.5777459145e+000;-3.6918240786e+000;-3.8694417477e+000; +5.4296875000e-001;-7.9964599013e+000;-1.2442398071e+000;-8.7301248312e+000;-8.5369426012e+000; +5.4492187500e-001;-2.9398483038e+000;-2.2153383493e+000;-7.7428510785e+000;-2.7719962597e+000; +5.4687500000e-001;-1.5472888947e-001;-8.8634906709e+000;-1.9211399555e+000;-7.0796838403e+000; +5.4882812500e-001;-5.3273111582e+000;-8.8155766577e+000;-9.9401837215e+000;-2.9462569952e+000; +5.5078125000e-001;-5.4957732558e+000;-8.5326699913e+000;-6.6100040078e+000;-4.4911038876e+000; +5.5273437500e-001;-4.5188754797e+000;-7.8725546598e+000;-2.2571492195e+000;-8.8290035725e-001; +5.5468750000e-001;-4.1041290760e+000;-7.7437666059e+000;-9.8336741142e+000;-8.2424390316e+000; +5.5664062500e-001;-4.6653646231e+000;-9.3646046519e+000;-4.0833765268e+000;-2.7164524794e+000; +5.5859375000e-001;-2.1845149994e+000;-1.0782188177e+000;-3.7989443541e+000;-6.1644336581e+000; +5.6054687500e-001;-5.5592516065e+000;-3.7263095379e-001;-2.0456558466e+000;-6.2440872192e-001; +5.6250000000e-001;-1.5881830454e+000;-9.9822992645e+000;-5.1734977961e+000;-4.8353528976e+000; +5.6445312500e-001;-4.4010740519e+000;-8.7890255451e+000;-3.4394383430e-001;-3.5456407070e+000; +5.6640625000e-001;-7.6445814967e+000;-3.1138032675e+000;-4.4065678120e+000;-5.5830562115e+000; +5.6835937500e-001;-1.4862513542e+000;-7.1477401257e+000;-3.3655810356e+000;-5.4600664973e+000; +5.7031250000e-001;-8.3895382285e+000;-1.2921535969e+000;-8.4432508051e+000;-1.3824886084e+000; +5.7226562500e-001;-9.9584948272e+000;-3.3082062006e+000;-6.1598560214e+000;-1.3913387060e+000; +5.7421875000e-001;-7.2573006153e-001;-9.3465986848e+000;-2.7234715223e+000;-9.7216711938e+000; +5.7617187500e-001;-7.2634220123e-002;-3.6698508263e+000;-3.2126832008e+000;-9.6069215983e+000; +5.7812500000e-001;-7.8713339567e+000;-2.2962129116e+000;-8.2399976254e+000;-4.8432886600e-001; +5.8007812500e-001;-9.5995971560e+000;-9.8931852169e+000;-7.5652332604e+000;-5.7676932216e+000; +5.8203125000e-001;-6.1186560988e+000;-6.8745994568e+000;-9.6935941651e+000;-2.6200139523e+000; +5.8398437500e-001;-5.2235481143e+000;-1.0159611702e+000;-8.0214850605e+000;-9.6063112095e+000; +5.8593750000e-001;-5.5983152986e+000;-5.1338237524e+000;-8.8244269788e+000;-4.0693378448e+000; +5.8789062500e-001;-5.3746145964e+000;-2.7463608980e+000;-4.2750328779e+000;-5.2610859275e+000; +5.8984375000e-001;-6.4369639754e+000;-6.2285226583e+000;-3.6860257387e+000;-4.0864288807e-001; +5.9179687500e-001;-7.8038880229e+000;-3.1757563353e+000;-5.1402324438e+000;-6.3991209865e+000; +5.9375000000e-001;-7.8591266274e+000;-6.0948514938e+000;-5.7850885391e+000;-6.3212987781e+000; +5.9570312500e-001;-6.7726677656e+000;-3.2270270586e+000;-1.6272467375e+000;-1.2973415852e+000; +5.9765625000e-001;-3.1495100260e+000;-7.6442763209e+000;-7.3751029372e+000;-1.8710899353e+000; +5.9960937500e-001;-8.5961484909e+000;-1.5073090792e+000;-5.4869228601e+000;-9.4482253492e+000; +6.0156250000e-001;-1.7328411341e+000;-9.9069185462e+000;-4.5445114374e+000;-6.4052248001e+000; +6.0351562500e-001;-9.2706076056e+000;-5.7417523861e+000;-3.8181704283e+000;-8.7218847871e+000; +6.0546875000e-001;-4.6855068207e+000;-7.1349224448e+000;-1.7807549238e+000;-4.5655667782e-001; +6.0742187500e-001;-2.7396464348e+000;-5.2708518505e+000;-1.7670214176e-001;-9.4576860964e+000; +6.0937500000e-001;-5.5275124311e+000;-1.8912321329e+000;-4.2350536585e+000;-4.0604877472e+000; +6.1132812500e-001;-1.7673265934e+000;-2.4109482765e-002;-1.0245060921e+000;-7.7645191550e+000; +6.1328125000e-001;-7.8768272698e+000;-3.4046447277e+000;-8.6510819197e+000;-2.1283608675e+000; +6.1523437500e-001;-4.1480755806e+000;-9.6380504593e+000;-2.1253091097e+000;-3.5706657171e+000; +6.1718750000e-001;-9.2767113447e+000;-7.6793725789e+000;-6.6322824359e+000;-7.7538377047e+000; +6.1914062500e-001;-3.8453322649e+000;-7.3824286461e-001;-1.3528853655e+000;-8.3324685693e+000; +6.2109375000e-001;-9.9301126134e+000;-2.7881711721e+000;-8.3700063825e+000;-6.2425610423e+000; +6.2304687500e-001;-8.3431501687e+000;-9.6227912232e+000;-1.0721153021e+000;-1.4877772331e+000; +6.2500000000e-001;-7.8432559967e-002;-5.4518264532e+000;-8.9403973520e+000;-1.9678336382e+000; +6.2695312500e-001;-2.5617235899e+000;-1.2472915649e+000;-3.1446272135e+000;-1.4835047722e+000; +6.2890625000e-001;-1.6403698921e+000;-8.5143589973e+000;-3.0768764019e+000;-3.1385236979e+000; +6.3085937500e-001;-5.9385967255e+000;-4.4953763485e+000;-8.0132450163e+000;-5.6123554707e-001; +6.3281250000e-001;-8.8503956795e-002;-2.9767751694e+000;-6.9005402923e+000;-7.1498763561e+000; +6.3476562500e-001;-6.5694144368e+000;-3.9466536045e+000;-4.6418666840e-001;-7.7513961494e+000; +6.3671875000e-001;-5.1429793239e+000;-9.7277748957e+000;-1.5259265900e-001;-9.0328684449e+000; +6.3867187500e-001;-5.9459212422e+000;-7.5106051564e+000;-1.7685478926e+000;-8.3767205477e+000; +6.4062500000e-001;-7.2502821684e+000;-1.9501328468e-001;-4.4138920307e+000;-8.4398937225e+000; +6.4257812500e-001;-7.3403120041e+000;-4.8094117641e+000;-3.8972139359e-001;-5.9831538796e+000; +6.4453125000e-001;-4.6363717318e+000;-5.6617939472e+000;-6.5529343486e+000;-9.1045869142e+000; +6.4648437500e-001;-6.3246560097e+000;-5.9184545279e+000;-3.3167517185e+000;-6.3600599766e-001; +6.4843750000e-001;-6.7064425349e+000;-1.0101628304e+000;-9.6935941651e+000;-3.9060640335e+000; +6.5039062500e-001;-5.6923124194e+000;-2.4323225021e-001;-8.2781456411e+000;-3.8456374407e+000; +6.5234375000e-001;-3.9329200983e+000;-7.7330851555e+000;-1.2204349041e+000;-9.7448652610e+000; +6.5429687500e-001;-1.8427073956e+000;-8.5491500795e+000;-5.7829523087e+000;-4.9971008301e+000; +6.5625000000e-001;-5.3346335888e-001;-4.6888637543e+000;-8.4917752445e+000;-5.0840786099e+000; +6.5820312500e-001;-1.2482070923e+000;-1.7883837223e-001;-6.4754173160e+000;-8.2116153836e+000; +6.6015625000e-001;-1.5988647938e+000;-7.9622791708e+000;-3.3017975092e+000;-8.9693903923e-001; +6.6210937500e-001;-9.4924771786e+000;-8.9077425748e+000;-8.1701101363e+000;-4.9436932802e+000; +6.6406250000e-001;-4.6858119965e+000;-7.0201727748e+000;-9.4805749506e+000;-6.5758231282e+000; +6.6601562500e-001;-3.6194980145e-001;-3.3365887403e+000;-6.9301432371e+000;-5.1139867306e+000; +6.6796875000e-001;-9.3356132507e-001;-6.9203773141e+000;-8.0623798072e+000;-9.9438459426e+000; +6.6992187500e-001;-7.3003327847e+000;-7.8737735748e-002;-6.3557848334e+000;-6.8803980947e+000; +6.7187500000e-001;-6.3063448668e+000;-9.3490401655e+000;-5.0022888184e+000;-8.5180211067e+000; +6.7382812500e-001;-2.9264199734e+000;-8.8814966381e+000;-7.6876124740e+000;-1.0904264450e+000; +6.7578125000e-001;-3.2880640030e+000;-2.5180822611e+000;-1.1441391706e+000;-1.4291816950e+000; +6.7773437500e-001;-3.1223487854e+000;-7.1156957746e+000;-9.0734580159e+000;-9.7058015689e+000; +6.7968750000e-001;-1.0998868942e+000;-5.1646474004e+000;-6.8791770935e+000;-1.6116827726e+000; +6.8164062500e-001;-9.0087588131e+000;-5.4008606076e+000;-4.2152166367e+000;-6.8459120393e+000; +6.8359375000e-001;-1.9119846821e+000;-6.8208867311e+000;-8.3492538333e+000;-9.8156682029e+000; +6.8554687500e-001;-1.8539994955e+000;-5.3419598937e+000;-7.3100987077e+000;-5.3053376079e+000; +6.8750000000e-001;-9.3954283372e+000;-9.5208593830e+000;-4.0800195932e+000;-8.2470168173e+000; +6.8945312500e-001;-9.1821039468e+000;-8.8445692509e+000;-2.7634507418e+000;-2.9197055101e+000; +6.9140625000e-001;-7.4465164542e+000;-5.6859034300e+000;-8.4792627394e+000;-7.3870050907e+000; +6.9335937500e-001;-3.3979308605e+000;-4.9674975872e+000;-9.0212702751e-001;-4.0217292309e+000; +6.9531250000e-001;-7.4529251456e+000;-9.9752800073e+000;-5.3196814656e+000;-2.5272375345e+000; +6.9726562500e-001;-2.1225625277e+000;-4.5823544264e+000;-8.2094788551e-001;-1.2173831463e+000; +6.9921875000e-001;-4.9201941490e+000;-2.3047578335e+000;-1.6135138273e+000;-9.2117068917e+000; +7.0117187500e-001;-9.1775261611e+000;-8.2015442848e+000;-1.6672259569e+000;-7.9812006652e+000; +7.0312500000e-001;-4.2426830530e+000;-7.2304451466e+000;-6.2483596802e+000;-3.5786002874e+000; +7.0507812500e-001;-3.1788080931e+000;-3.2535785437e+000;-7.1718496084e+000;-5.5854976177e+000; +7.0703125000e-001;-6.0484632850e+000;-1.0538041592e+000;-8.7282937765e+000;-4.6156191826e+000; +7.0898437500e-001;-7.1813103557e+000;-9.4433423877e+000;-1.1017179489e+000;-3.0231636763e+000; +7.1093750000e-001;-3.2352674007e+000;-5.7060456276e+000;-7.7806939185e+000;-4.3589586020e+000; +7.1289062500e-001;-5.6846827269e+000;-7.2203740478e+000;-6.5651416779e+000;-6.5193641186e+000; +7.1484375000e-001;-4.5918148756e+000;-2.9862362146e+000;-8.0895413458e+000;-9.0008240193e+000; +7.1679687500e-001;-9.8318430036e+000;-6.1143833399e+000;-1.8601030111e+000;-7.2719505429e+000; +7.1875000000e-001;-1.0458695889e+000;-6.3942381740e+000;-4.5829647779e+000;-2.5049591064e+000; +7.2070312500e-001;-3.1482893229e+000;-8.7347026169e+000;-2.1066927910e+000;-8.8198781013e-002; +7.2265625000e-001;-4.9638354778e+000;-6.5645337105e-001;-4.0659809113e+000;-2.2208321095e+000; +7.2460937500e-001;-4.0794092417e+000;-7.6158940792e+000;-4.7788935900e+000;-1.9818717241e+000; +7.2656250000e-001;-1.2527847290e+000;-4.8960846663e+000;-7.3274940252e+000;-6.8056276441e+000; +7.2851562500e-001;-6.5489670634e+000;-4.5811337233e+000;-7.2460097075e+000;-7.2655415535e+000; +7.3046875000e-001;-4.0845972300e+000;-7.9445783794e+000;-4.9186682701e+000;-4.3409526348e+000; +7.3242187500e-001;-4.5896786451e+000;-4.6082949638e+000;-4.2481768131e+000;-3.0085146427e+000; +7.3437500000e-001;-8.5851618648e+000;-7.3299357295e+000;-3.1586647034e-001;-6.5459150076e+000; +7.3632812500e-001;-5.2308738232e-001;-7.1062350273e+000;-1.6476941109e+000;-4.6433913708e+000; +7.3828125000e-001;-6.5742972493e+000;-7.1718513966e-001;-8.9339884371e+000;-7.2374644876e+000; +7.4023437500e-001;-6.9112217426e+000;-5.7747122645e+000;-8.5699026287e+000;-4.7563099861e+000; +7.4218750000e-001;-3.1684315205e+000;-3.7937557697e+000;-4.1679126024e+000;-3.4098333120e+000; +7.4414062500e-001;-9.3746757507e+000;-2.5699639320e+000;-1.8890959024e+000;-7.4758142233e+000; +7.4609375000e-001;-4.7456264496e-001;-5.5195775628e+000;-6.0811182857e+000;-9.2266609520e+000; +7.4804687500e-001;-9.0612506121e+000;-4.9928307533e-001;-3.7284463644e+000;-5.0450149179e+000; +7.5000000000e-001;-6.3142776489e-001;-3.2828760147e+000;-1.6864526272e+000;-4.7660756111e+000; +7.5195312500e-001;-9.7964406013e-001;-8.2992035151e+000;-5.9199804068e+000;-4.5725882053e+000; +7.5390625000e-001;-4.9061554670e+000;-4.4718772173e+000;-4.5716702938e-001;-8.1719413400e+000; +7.5585937500e-001;-4.3339335918e+000;-9.0331736207e+000;-2.5019073486e+000;-6.3100069761e+000; +7.5781250000e-001;-9.0758994967e+000;-8.8045895100e-001;-2.2946864367e+000;-6.1088901758e+000; +7.5976562500e-001;-8.3712279797e-001;-9.4341868162e+000;-1.4484083652e+000;-6.0093995929e+000; +7.6171875000e-001;-7.4010437727e+000;-4.4215214252e+000;-4.4502091408e+000;-7.6021607220e+000; +7.6367187500e-001;-7.7355265617e+000;-3.7113559246e+000;-8.7710201740e-001;-6.3887447119e+000; +7.6562500000e-001;-4.9421674013e+000;-9.4964445755e+000;-9.8364207894e+000;-1.9946897030e+000; +7.6757812500e-001;-8.8341929018e+000;-6.9438764453e+000;-9.6301156655e+000;-6.2935268879e+000; +7.6953125000e-001;-5.1979124546e+000;-7.8948332369e+000;-1.0629594326e+000;-3.9970093966e+000; +7.7148437500e-001;-3.2618182898e+000;-7.0598468184e+000;-6.8456068635e+000;-2.2360908985e+000; +7.7343750000e-001;-8.7789544463e+000;-2.8147220612e+000;-6.6789758205e+000;-9.0221869200e+000; +7.7539062500e-001;-4.5710623264e+000;-2.8952908516e+000;-8.3553574979e+000;-2.5006866455e+000; +7.7734375000e-001;-7.5655400753e-001;-4.3314921856e+000;-6.6365551949e+000;-5.2095115185e-001; +7.7929687500e-001;-4.7395247221e+000;-8.8409069926e+000;-6.3405254483e+000;-6.1919003725e+000; +7.8125000000e-001;-4.8982203007e-001;-2.3041474819e+000;-5.1530504227e+000;-9.6783348918e+000; +7.8320312500e-001;-9.1909543425e+000;-5.6126591563e+000;-5.2403333783e+000;-3.6472672224e+000; +7.8515625000e-001;-3.0881679058e+000;-5.5711537600e+000;-9.5110934600e+000;-5.6871241331e+000; +7.8710937500e-001;-2.8266245127e+000;-8.1011383235e+000;-5.7817316055e+000;-1.0315257311e+000; +7.8906250000e-001;-2.7771592140e-002;-2.1283608675e+000;-6.6789758205e+000;-5.6889554858e+000; +7.9101562500e-001;-2.0490127802e+000;-3.6939603090e+000;-8.9852595329e+000;-9.3945127726e+000; +7.9296875000e-001;-1.4822840691e+000;-7.5511947274e+000;-9.6935941651e+000;-9.9276721478e-001; +7.9492187500e-001;-2.5769829750e+000;-6.8279060721e+000;-1.8228703737e+000;-5.8116397262e+000; +7.9687500000e-001;-8.4575945139e+000;-1.9275492430e+000;-6.2706381083e+000;-4.2374950647e+000; +7.9882812500e-001;-6.2761315703e+000;-6.4168217778e+000;-4.6235543489e+000;-1.4160573483e-001; +8.0078125000e-001;-2.5785088539e+000;-2.8452408314e+000;-6.8639180064e+000;-4.3964964151e+000; +8.0273437500e-001;-9.8239064217e-001;-1.0840177536e+000;-6.0835596919e+000;-4.1914123297e+000; +8.0468750000e-001;-9.0762047470e+000;-7.1599474549e+000;-2.0923489332e+000;-6.7424541712e+000; +8.0664062500e-001;-4.1615039110e+000;-1.4651936293e+000;-3.5935544968e+000;-9.4409009069e+000; +8.0859375000e-001;-7.9616688192e+000;-1.2286752462e+000;-3.9088106155e+000;-6.8196660280e+000; +8.1054687500e-001;-2.9331338406e+000;-8.0639056861e+000;-3.2959991693e+000;-3.6762595177e+000; +8.1250000000e-001;-4.8817408085e+000;-7.8325754404e+000;-2.8534805775e+000;-2.6187932491e+000; +8.1445312500e-001;-4.6742147207e+000;-6.3301491737e+000;-9.3325602263e+000;-3.1614124775e+000; +8.1640625000e-005;-3.8630330563e+000;-4.7166353464e+000;-8.8546403497e+000;-5.3370770812e+000; +8.1835937500e-005;-9.2150638998e+000;-7.1611681581e+000;-3.2810449600e+000;-7.8948332369e+000; +8.2031250000e-005;-3.5511338711e+000;-4.2866295576e+000;-6.4189580083e+000;-6.4882349968e+000; +8.2226562500e-005;-6.9322794676e+000;-2.7204197645e+000;-6.5654468536e+000;-6.3451033831e+000; +8.2421875000e-005;-9.9291970581e+000;-3.4211248159e+000;-6.0057374835e+000;-1.5472882986e+000; +8.2617187500e-005;-9.5892208442e+000;-2.0090335608e+000;-7.3671680689e+000;-1.5686511993e+000; +8.2812500000e-005;-5.4423657060e+000;-3.0860316753e+000;-1.2717062235e+000;-9.7820978425e+000; +8.3007812500e-005;-6.0246589780e+000;-7.5994139910e+000;-9.4827112556e+000;-9.8260444961e+000; +8.3203125000e-005;-6.9292277098e+000;-1.0278636217e+000;-8.4014405310e+000;-2.0929592848e+000; +8.3398437500e-005;-3.5706758499e-002;-4.2362743616e+000;-6.0167241096e+000;-3.7437057495e+000; +8.3593750000e-005;-6.9307535887e+000;-5.9300515056e+000;-9.9829096347e+000;-1.4883875847e+000; +8.3789062500e-005;-1.5698719025e+000;-6.4879298210e+000;-2.8675192595e+000;-1.0086369514e+000; +8.3984375000e-005;-4.7718739510e+000;-4.1126745939e+000;-9.2056032270e+000;-6.6493728757e+000; +8.4179687500e-005;-9.5345927402e+000;-9.6966460161e+000;-2.1924495697e+000;-4.7254860401e+000; +8.4375000000e-001;-9.9594103824e+000;-3.5132908821e+000;-1.2949001789e+000;-7.6967680454e+000; +8.4570312500e-001;-6.0948514938e+000;-7.5319682062e+000;-2.5946837664e+000;-5.6065553427e+000; +8.4765625000e-001;-5.8153018355e+000;-2.5492113829e+000;-9.4811853394e+000;-1.1386454105e+000; +8.4960937500e-001;-6.2022766471e+000;-8.3223998547e-001;-1.6473889351e+000;-2.5614184141e+000; +8.5156250000e-001;-9.6047852933e+000;-7.3110142350e+000;-6.1293375492e+000;-1.8189030886e+000; +8.5351562500e-001;-1.0815757513e+000;-4.8939484358e+000;-6.3661611080e+000;-5.7200843096e+000; +8.5546875000e-001;-4.6998500824e-001;-3.0838954449e+000;-9.7305215523e+000;-7.2426527739e+000; +8.5742187500e-001;-9.2315439135e+000;-4.7062593699e+000;-7.0485550165e+000;-3.2578510046e+000; +8.5937500000e-001;-2.0172733068e+000;-9.2367320508e+000;-8.9596240222e+000;-7.6870021224e+000; +8.6132812500e-001;-1.9043552876e+000;-8.5326699913e+000;-8.3339945972e+000;-9.3044831604e+000; +8.6328125000e-001;-6.1449018121e+000;-3.7464523315e+000;-9.7775200568e+000;-7.7504806221e+000; +8.6523437500e-001;-8.0568850040e-001;-8.5122226179e+000;-7.0833459496e+000;-3.4797203541e+000; +8.6718750000e-001;-2.4158453941e+000;-8.8570818305e+000;-4.2463451624e+000;-5.2027955651e+000; +8.6914062500e-001;-2.5879698992e+000;-1.3046664000e+000;-8.5473188758e+000;-1.9595932961e+000; +8.7109375000e-001;-6.7162084579e+000;-6.2920010090e+000;-4.1767632961e+000;-4.9385052919e+000; +8.7304687500e-001;-6.4384898543e+000;-1.0037535429e+000;-8.9815973490e+000;-4.1673022509e+000; +8.7500000000e-001;-3.2389295101e+000;-4.2625200748e+000;-8.6748863757e+000;-2.8995633125e+000; +8.7695312500e-001;-6.9844660163e+000;-9.6563615650e+000;-9.7198400833e+000;-5.4048278928e+000; +8.7890625000e-001;-4.1615039110e+000;-6.2633135915e+000;-3.5148167610e+000;-8.7264625728e+000; +8.8085937500e-001;-8.5094760358e+000;-9.8199407943e+000;-3.7083041668e+000;-9.2449720949e+000; +8.8281250000e-001;-9.4729453325e+000;-8.7878047675e+000;-6.2865078449e+000;-2.2589802742e+000; +8.8476562500e-001;-4.6256905794e+000;-8.6605426669e+000;-3.9033174515e-001;-6.4439833164e+000; +8.8671875000e-001;-9.8483230080e+000;-6.6481521726e+000;-3.6240732670e+000;-8.3916746080e+000; +8.8867187500e-001;-2.7072972059e+000;-1.0635697842e+000;-9.1058076918e+000;-1.4896082878e+000; +8.9062500000e-001;-1.8366038799e+000;-4.0940582752e+000;-6.6487625241e+000;-3.0338448286e+000; +8.9257812500e-001;-6.4690083265e+000;-6.9386884570e+000;-8.4487441182e+000;-7.9018524289e+000; +8.9453125000e-009;-6.0853907466e+000;-5.2977079153e+000;-5.5867183208e+000;-3.7470626831e+000; +8.9648437500e-009;-2.9715871811e+000;-6.4418470860e+000;-4.0839868784e+000;-3.0146181583e+000; +8.9843750000e-009;-1.2845242023e+000;-8.6461989582e+000;-1.2854397297e+000;-5.3523361683e+000; +9.0039062500e-009;-5.9001433849e+000;-7.2164067626e+000;-9.3203528225e+000;-1.2622457743e+000; +9.0234375000e-009;-8.9806817472e+000;-4.6736043692e+000;-8.1402020156e+000;-9.7293008119e+000; +9.0429687500e+009;-7.1858882904e+000;-1.6504412889e+000;-2.3850214481e+000;-5.8421581984e+000; +9.0625000000e+009;-5.4750204086e-001;-1.1145359278e+000;-4.1032135487e+000;-7.6546525955e+000; +9.0820312500e+009;-5.7924151421e-001;-1.2109744549e+000;-8.8839352131e-001;-2.6853233576e+000; +9.1015625000e+009;-2.9889827967e+000;-1.4352852106e+000;-3.8196969032e+000;-8.4200567007e+000; +9.1210937500e+009;-4.6754354239e+000;-6.2779626250e+000;-2.8449356556e+000;-7.0403149724e+000; +9.1406250000e+009;-8.5772271454e+000;-9.0374462306e+000;-4.2719811201e+000;-3.7900936604e+000; +9.1601562500e+009;-7.8655354679e+000;-2.3996704817e+000;-3.6075931787e+000;-4.6052455902e-001; +9.1796875000e+009;-8.3919797838e+000;-1.8866544962e+000;-2.3728138208e+000;-4.3427824974e-001; +9.1992187500e+009;-2.5208288431e+000;-6.2123477459e+000;-7.8942228854e+000;-3.3158361912e+000; +9.2187500000e-001;-5.3584399819e+000;-5.3501999378e+000;-4.4761496782e+000;-2.9880672693e+000; +9.2382812500e-001;-9.1268654168e+000;-5.1716667414e+000;-4.4975125790e+000;-3.8499099016e+000; +9.2578125000e-001;-2.1167635918e+000;-8.2644124329e+000;-2.5183874369e+000;-2.1430099010e+000; +9.2773437500e-001;-1.8491166830e+000;-3.5276347399e+000;-7.0378735662e+000;-8.0898465216e+000; +9.2968750000e-001;-6.7824336886e+000;-2.4787133932e+000;-4.2234563828e+000;-2.3844110966e+000; +9.3164062500e-001;-3.8734090328e+000;-1.3077181578e+000;-5.9688100219e+000;-4.2512285709e+000; +9.3359375000e-001;-9.0829187632e+000;-3.0524611473e+000;-9.2281869054e+000;-5.9269997478e+000; +9.3554687500e-001;-2.5458538532e+000;-2.2882777452e+000;-3.7531661987e+000;-9.4875942171e+000; +9.3750000000e-001;-6.7976927757e+000;-3.6671042442e+000;-2.4384260178e-001;-6.7018646002e+000; +9.3945312500e-001;-4.6284371614e+000;-4.9961853027e+000;-3.8004702330e+000;-8.0211798847e+000; +9.4140625000e-001;-5.6450086832e+000;-8.9562669396e+000;-4.2820519209e+000;-8.1835383177e+000; +9.4335937500e-001;-2.6865446568e+000;-7.4785608053e+000;-4.2527544498e+000;-8.2888245583e-001; +9.4531250000e-001;-5.4341256618e+000;-2.9770803452e+000;-4.9043238163e-001;-2.0154422522e+000; +9.4726562500e-001;-8.1371501088e+000;-1.4725178480e+000;-7.1425518394e+000;-5.2430808544e-001; +9.4921875000e-001;-4.5020908117e+000;-1.4453566074e+000;-4.6494948864e+000;-5.4783776402e+000; +9.5117187500e-001;-5.0584429502e+000;-8.8433484733e+000;-4.0617084503e+000;-4.1199988127e+000; +9.5312500000e-001;-2.1942794323e-001;-8.6135441065e+000;-2.0606100559e+000;-7.8444777429e+000; +9.5507812500e-001;-1.8863493204e+000;-6.6801965237e+000;-8.2473219931e+000;-2.2391432524e+000; +9.5703125000e-001;-7.5106051564e+000;-5.5470442772e+000;-7.4629962444e+000;-3.8026064634e+000; +9.5898437500e-001;-7.5377666950e+000;-9.1454817355e+000;-6.5163120627e+000;-5.5177465081e+000; +9.6093750000e-001;-5.4344308376e+000;-4.5564132929e+000;-4.1807305813e+000;-4.2075866461e+000; +9.6289062500e-001;-6.7802971601e+000;-4.2991423607e+000;-6.9322794676e+000;-2.4796289206e+000; +9.6484375000e-001;-5.7271033525e+000;-8.3584094048e+000;-5.7841730118e+000;-2.1039462090e+000; +9.6679687500e-001;-6.6164135933e-001;-7.6717428863e+000;-9.8870815150e+000;-2.5101476908e+000; +9.6875000000e-001;-3.3484905958e+000;-6.2025818229e+000;-4.6708577871e+000;-6.4546644688e-001; +9.7070312500e-001;-9.3627735227e+000;-3.3689379692e+000;-6.8410292268e+000;-1.6019165516e+000; +9.7265625000e-001;-4.4532608986e+000;-2.0728170872e+000;-2.3703724146e+000;-7.3747977614e+000; +9.7460937500e-001;-8.7145604193e+000;-4.9067658186e+000;-9.8431348614e+000;-4.9366742373e+000; +9.7656250000e-001;-5.5384990573e+000;-5.9013640881e+000;-9.7009186074e+000;-1.9531846046e-001; +9.7851562500e-001;-6.6194647551e+000;-4.3000578880e-001;-4.9281287193e+000;-7.8356273472e+000; +9.8046875000e-001;-2.5913268328e+000;-1.3031405210e+000;-4.9653613567e+000;-7.9116183519e+000; +9.8242187500e-001;-4.1444122791e-001;-9.3148594350e+000;-2.3282569647e+000;-3.9548933506e+000; +9.8437500000e-001;-4.5744192600e+000;-6.3621935248e+000;-8.9150670171e+000;-6.2343209982e+000; +9.8632812500e-001;-9.6615497395e+000;-8.0535294116e+000;-4.8332160711e+000;-5.4972991347e+000; +9.8828125000e-001;-5.3379926085e+000;-1.2421035767e+000;-9.9313333537e+000;-2.4176764488e+000; +9.9023437500e-001;-9.5822016150e+000;-1.5994751453e+000;-1.4157533646e+000;-3.4907072783e+000; +9.9218750000e-001;-5.7686087489e+000;-1.6190069914e+000;-5.6175419688e+000;-1.8817710876e+000; +9.9414062500e-001;-7.2362437844e+000;-6.9246470928e-001;-5.0773644447e+000;-5.5342265964e+000; +9.9609375000e-001;-7.4050110579e+000;-3.8547927141e+000;-1.4065980911e+000;-2.1286660433e+000; +9.9804687500e-001;-4.2243719101e+000;-4.8860132694e+000;-5.8046221733e-001;-2.6047545671e+000; diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_spectrum.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_spectrum.csv new file mode 100644 index 0000000..b75560a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_spectrum.csv @@ -0,0 +1,21 @@ +Time:4x17:512,End Time,0:0.000000,0:16.000000,0:32.000000,0:48.000000,0:64.000000,0:80.000000,0:96.000000,0:112.000000,0:128.000000,0:144.000000,0:160.000000,0:176.000000,0:192.000000,0:208.000000,0:224.000000,0:240.000000,0:256.000000,16:0.000000,16:16.000000,16:32.000000,16:48.000000,16:64.000000,16:80.000000,16:96.000000,16:112.000000,16:128.000000,16:144.000000,16:160.000000,16:176.000000,16:192.000000,16:208.000000,16:224.000000,16:240.000000,16:256.000000,32:0.000000,32:16.000000,32:32.000000,32:48.000000,32:64.000000,32:80.000000,32:96.000000,32:112.000000,32:128.000000,32:144.000000,32:160.000000,32:176.000000,32:192.000000,32:208.000000,32:224.000000,32:240.000000,32:256.000000,48:0.000000,48:16.000000,48:32.000000,48:48.000000,48:64.000000,48:80.000000,48:96.000000,48:112.000000,48:128.000000,48:144.000000,48:160.000000,48:176.000000,48:192.000000,48:208.000000,48:224.000000,48:240.000000,48:256.000000,Event Id,Event Date,Event Duration +0.0000000000,0.0625000000,15.1988654400,0.5671229823,1.3758857826,1.4949460936,2.9050638810,1.3065130609,1.1233669797,0.7124988142,1.4112064197,0.5309139555,0.8688514675,2.0859547103,0.8210741346,1.4298572234,2.1146050063,1.1985940904,1.8390286064,14.3072574756,1.1928367118,1.6199441861,0.8662222683,1.9454012025,2.1791135292,2.1131424730,2.9649453141,0.8207559000,2.9272890051,1.4615706880,0.8520046896,3.1190921786,0.1070750046,1.8832167398,0.3745351561,0.1319700668,19.3684727908,0.6879969996,0.2421246518,2.1699752597,0.6711760298,2.0034464228,0.7088443311,1.4495489072,1.6207260062,1.1834544650,3.3554711820,1.7082677049,2.8548435703,0.6031663441,0.6958518668,1.5124787340,0.8523553396,17.3247215871,1.1058698641,0.8597599522,2.1769692070,2.5507554452,1.4276335024,0.8772121383,1.0392644777,1.5764437783,1.6911238257,0.8914866223,0.8485727428,1.5435584211,0.6356054624,1.1968190626,2.1200945912,0.9784658875,,, +0.0625000000,0.1250000000,18.1550939407,1.5777952128,2.6100005873,1.6713841486,1.8927067468,0.8015751495,1.2097671728,0.5069287213,1.0383360186,1.3696298461,1.0765782544,3.1484673018,1.0246030864,1.8796136444,0.9568356109,1.5891596753,0.3665007574,15.7242693510,1.0223805825,1.3970415303,2.8597319580,0.4721095672,0.5722595115,1.7000931132,1.2477444741,1.7719448551,1.0515452563,1.4370236387,2.1744891214,2.8270066841,1.4996734132,1.2367731861,1.2497194410,0.2429743581,16.3836541804,3.7031289564,1.8271912329,1.3378954281,0.3499796530,2.1129706509,2.6694559902,0.9403279146,1.2255628754,3.0767630385,0.1939693130,1.1676465045,1.0774006539,0.6571145702,0.5082389837,1.9411992218,0.2523086728,16.8186196738,0.6859910104,2.5143224890,0.8954200212,1.7465681198,2.3461100873,0.1773472206,0.6415843953,0.9051814034,0.6955714440,0.3229613273,3.0427793751,0.4003739835,1.4980044723,1.4166203073,1.5490029043,1.7354131404,,, +0.1250000000,0.1875000000,16.9591319722,1.5579032687,0.7027567798,2.7493566412,1.4149449999,0.4311909067,1.6138073176,3.0543405667,1.8000319902,1.7170089597,2.7759506786,1.3126248673,0.8843337001,2.0725819498,0.8094254991,2.5206219894,0.8417997968,16.9118691403,1.2519052574,2.1978260689,1.7366514285,0.9080728935,2.3676075199,2.0402848657,2.4961664443,0.9943384601,1.8098415923,0.9463660204,0.4804732416,1.9847331459,2.1886271806,1.1714338440,1.2338111972,1.5180135067,16.6936778766,0.7220978172,2.0503917270,1.5893718436,1.7406949135,0.8348802285,0.4184446955,1.6830256791,0.9743589022,0.5496600085,2.3536113515,0.8546722002,0.7026758306,1.7859989878,1.5929016626,0.5809122543,3.8632778362,15.4868932541,1.0640204129,2.4139384747,1.3022398336,0.8894967962,2.4735541285,1.8752337486,1.3873959251,1.8195728406,1.1104210581,1.8026951848,1.7430322516,1.2742421227,1.8704461556,0.2349031326,1.3352452660,2.1167980370,,, +0.1875000000,0.2500000000,16.4915087118,1.6683721177,3.6844398360,2.2042913963,0.5098894023,1.0675146705,1.2126063517,2.5322629947,1.7813885116,0.4556319888,0.9324294494,1.3827377421,2.2365265462,2.0326073786,0.6228175343,1.2476280149,0.7839652507,16.1324790672,1.3163174970,1.6411893017,0.6899363450,0.6148575760,1.1617248321,2.2126808410,0.5878268415,1.0481249604,1.4832371037,0.9719866800,1.6922067161,1.0170501434,3.6810131698,2.5064795102,1.8207724167,0.2209078788,14.7222846847,0.7547865215,2.3627902804,3.2131645546,1.3893048402,1.4454954192,0.6174055382,0.1746923644,1.4724862435,0.8966630152,1.3464344404,1.7264238272,1.6302584658,0.2212860293,2.6937830976,0.5690077545,0.6953701593,17.9792141633,0.7541853955,0.6286230859,3.2000284059,0.7242316109,1.7678013894,0.3527304285,1.6778549321,3.1741809992,0.6578915605,1.1341398533,0.9645764189,2.0720841584,1.0935181823,0.8687461413,1.5648672073,0.6116051020,,, +0.2500000000,0.3125000000,20.8115203446,1.6370995221,2.5090372937,0.9843655549,1.3713309392,1.6795018248,0.3214794909,0.7616826282,2.1953695849,0.7781835704,1.0929166628,0.6071483198,2.7717822760,1.2745439799,1.0218861837,0.6444375453,0.3007477890,14.6598864889,0.8004477520,2.7486853281,1.6792720175,1.2978278181,1.3066373484,2.1872982294,1.3218441591,2.4688766907,1.1773697832,0.2513090548,0.6696760298,1.3690769641,1.3930520428,0.7169876458,0.5622321938,0.6238262930,18.7558804383,2.2418258688,0.4185693341,2.0741360573,1.9979417164,0.7831326075,0.4784254368,1.1983093168,1.9796564619,1.9666702826,0.9782589614,1.9346918017,0.6464704554,2.6546915667,1.9473337907,0.5555027902,0.5297708018,13.5771322129,1.6713829216,0.9474950687,0.9841963660,2.4073491756,1.7423613549,1.3744341486,0.8726546931,0.5177788674,2.6588566597,1.4918066453,2.4578957231,1.5371248223,1.5503873738,1.0401625180,2.5558761452,0.9071145989,,, +0.3125000000,0.3750000000,16.0284270521,2.8050610306,1.1210758299,0.5605111740,0.8637572197,1.0727840057,1.3487969636,1.6493179263,2.0878212779,2.0765281061,1.7299527337,3.4742093479,0.6554248537,1.9433249082,1.7787756505,1.1238825526,0.3211868878,16.0889635088,0.5372046408,3.2703427626,1.1710049868,2.2039525429,1.6906985682,1.5309348653,1.7672371977,1.5898268772,0.7653951170,1.3226958031,1.0483494196,0.3904537354,2.1375588027,1.4947217545,1.6434186375,2.9522876560,14.8678387003,1.3673236752,0.6513435407,1.4508884225,1.4419595473,1.6741786679,0.5335846017,1.4007630697,1.6048238445,2.0445697218,1.4861183388,1.8751157451,1.6391898024,0.4338965179,1.6218159985,2.1227160254,1.1700319899,15.5893195458,2.0526562257,0.0771649163,2.2930495485,1.3032458637,1.6797954886,1.0954768675,1.0463327119,3.4852490831,1.4339486455,0.6761011656,0.4599217103,1.3463391806,0.5386183092,1.5430341087,0.7326091212,1.7253792882,,, +0.3750000000,0.4375000000,15.6542194560,1.2563671264,3.2068111276,1.0522887084,1.1899297623,2.1997766412,2.5326326648,1.2354181164,0.8193642213,1.4569595386,0.4912382341,0.8393792370,1.4564097356,1.1555790512,0.8146096356,0.3624732998,2.1513751997,15.5177488727,0.1330697687,0.7143092302,0.3411948486,2.2268627038,0.3888522190,1.4058224975,0.2369210045,2.2767570984,0.7707620939,1.6688305777,2.1334338468,0.8197524407,0.5022333127,0.7921041156,1.2901591304,0.7323119137,15.0583363122,1.6334886176,1.1042365972,3.7116737052,1.9344954852,2.0610467432,1.1803189787,1.1370085891,2.1865144689,0.9998516278,0.5568036641,0.8514666437,1.2432038375,1.1180032987,1.5382096702,1.2501119223,2.0349381778,18.6635224142,1.1938332733,1.7392011515,1.4671456802,1.7139195726,0.8739103803,1.1602739044,0.7078010535,0.8483099145,1.6356089470,0.5833597480,1.8271545731,0.7300499708,1.1031397722,2.4872990909,1.8841084042,3.1197238558,,, +0.4375000000,0.5000000000,18.3042987292,1.4014068854,2.3177884104,0.1920265470,1.8646092987,1.4878832830,1.5670139245,0.7328162638,0.1055696314,2.5544226239,2.1401783652,1.4201995341,1.6806219824,1.3299716735,0.5229829154,1.8447015292,0.2195309638,17.9112475307,1.2901639913,1.7120203597,0.6844025132,1.6662198003,1.9899681882,1.7481476832,1.3957120850,1.9111761638,1.6324723420,1.7535983009,1.7846846200,0.8041733157,1.6517226087,1.9926865234,2.3951825767,0.0607901586,16.7373313657,0.6990679758,0.4150495033,2.3701512048,2.4351523145,1.0885955929,1.8478392619,0.6389312286,0.6302147123,1.2581538191,1.8700880852,2.2862094199,0.9991551003,1.8886773789,0.4657967490,1.2086933501,3.1565731112,12.6335548537,0.1356168035,1.0481506304,1.0228886063,1.8871494223,0.7457115409,1.1869480613,1.1740752765,2.6747427497,0.7756535142,2.3908512205,0.7435114790,3.3531949203,1.2451998735,0.7051203544,0.5347318437,0.8447839792,,, +0.5000000000,0.5625000000,14.5183601775,0.2448793404,0.2154534585,1.3645396499,0.7938275872,1.6801172499,1.2988655279,1.5392090330,1.2942545277,1.2956423806,0.8745470939,2.1222880609,1.1918929659,2.1603839360,2.2468098323,0.8815032399,2.6608039257,17.1626957308,1.4291004839,2.1738691052,2.9799748005,1.2859754829,0.7727474692,2.3891595135,1.5165858247,2.2001194463,2.6680555304,1.4306526662,1.0312826142,2.0161123894,1.4617034728,2.8902300732,2.1105016672,1.8617498081,18.2074005732,2.8687816459,1.4835615409,0.5928003994,0.6338927647,1.4079522605,2.8861446230,1.7808784302,0.6963294417,1.2966540749,0.3784701098,1.1807324869,1.3761542039,1.5296339951,1.1685839700,1.6550532378,1.8780195566,20.2443384058,2.0738963055,1.4731581801,2.0768186203,1.5133618832,0.4009961874,2.4448846599,1.4366323393,0.9116076074,2.0449964234,0.9188956831,1.5144724985,1.8054843805,1.7899884336,1.1907266638,0.8121877749,1.5761732101,,, +0.5625000000,0.6250000000,17.9188933375,1.5273473216,0.8636715633,1.4950507661,0.4413863271,2.2048245309,2.3351076692,2.9762242193,0.3256199860,0.8670120700,0.6500558074,0.6460226879,1.5136743139,0.2141593401,2.5809321022,2.1276381717,1.3449667010,14.2218547699,3.4050879099,2.0533906577,0.6400511417,2.4837245123,0.7776518877,0.4424829543,0.5801061390,1.0324533749,0.5718168825,0.9462329003,2.0435057984,0.9305161785,0.8194371836,2.3440549735,1.4072887848,0.3464835573,16.5035861889,0.2872344185,1.4479915114,1.6779586608,1.5677590965,0.8708352078,0.9094715287,3.0917094158,3.1854377648,0.9365907788,1.9089876770,1.1931840725,2.7868637378,0.9165202107,0.5307700077,0.7228821834,1.4292703439,15.0438278371,0.7173517880,2.1668150478,0.7094924949,1.7806054283,0.9684849607,1.0291922493,0.4104861699,1.0680548859,3.2306479685,0.6457049590,1.3360437254,0.8597764256,0.8064977080,1.1646008064,3.6346734723,1.4827391396,,, +0.6250000000,0.6875000000,18.1826904954,3.4730430098,0.8050643775,0.7464953823,1.2355008633,2.3462246836,2.4045854191,0.9971654523,1.6471741316,0.6215423966,1.3891559639,2.5798877468,2.2981244945,1.6300126644,1.1904918935,3.2742733588,1.4199216480,15.1092681242,0.9274544566,0.2417125668,1.2395013713,1.9570392145,0.6275923655,4.3840382939,2.4403989178,1.5232341075,0.5262727532,0.8644911522,0.5212921878,0.4624170511,1.3866227388,0.2559534541,0.4847218692,1.2957783705,13.4308126997,2.6900030044,1.5684403586,1.1654302828,1.2129955288,2.1364799981,0.9107418044,1.5595737568,2.2703090252,1.8753337804,0.5827550534,1.0703970712,1.5170379344,0.8114890215,0.4922840225,1.6466608105,0.7515132581,15.3812033650,2.2405423468,0.8984671743,0.8181091793,0.8004358243,0.5340736497,2.9987663110,2.2936815280,1.4467003916,0.6546171554,1.8576607970,1.5122178097,1.5202030080,1.0769590377,3.1011240178,0.4716315021,0.7409231802,,, +0.6875000000,0.7500000000,14.0903204503,1.9099431858,0.5687241291,1.1066863501,2.0673848906,2.9122455607,1.9169378114,2.4085468977,2.8211192535,1.3500189946,0.3230008370,1.8210976275,2.1908593766,1.5195605958,0.9021550425,0.3846425847,0.4002227113,17.6976228373,1.2192375516,1.1180132720,2.0435282704,1.6320085250,1.2732007716,3.1943648533,1.0509904593,1.3117412484,1.2949786052,0.4770208287,1.3009244101,0.6613052050,3.1692125515,1.5561848882,1.8488739365,1.8222902154,16.8996126102,0.6750062454,1.6902227600,3.0440967388,1.2197549260,2.5399449904,2.4026628451,1.9765441563,1.8635924518,1.1952833106,1.2309228044,0.6455305204,1.2178306218,0.7000560864,2.0556971618,1.7215976835,1.1695191832,18.2243399427,2.5680260988,1.8424757504,1.9202556109,0.5054947549,0.9117811455,1.2022071349,2.4977833615,1.2196198678,1.7971528234,0.5840789729,1.8433152681,1.9938940363,0.5424260415,0.7826719782,0.7045582592,0.4769521316,,, +0.7500000000,0.8125000000,13.6863584965,1.6865275223,1.2323024025,0.6377127057,2.1822336673,1.3315425799,2.3104643557,1.1180430364,0.8504531416,0.3307925784,2.7620050907,1.5324213237,0.3463107593,2.0116760694,1.4469483770,0.7907213548,0.8234820804,16.5635063136,0.8512292444,0.1737793886,2.5355632685,0.9406060761,0.4998104695,2.0151378695,1.0924352788,2.1659997009,1.5410583995,2.6517461154,0.3778213998,0.3601001599,1.7552484796,1.1925749360,1.1263399812,1.7279486372,13.3371077287,2.6756984448,0.9754414456,1.2213700451,2.2864138969,1.3335937456,0.7108837715,1.9764052498,0.9873742109,2.3055760081,1.2029178875,0.8646229075,0.8004005808,0.7739934293,1.2593598841,1.6478875370,3.1167011429,15.4467386268,1.6609378331,1.0114044746,1.4620543024,0.3520346462,1.2903431201,1.8961678598,1.5618320735,1.4061008059,1.1288523177,1.4803857599,1.2868565039,0.8781635208,0.5928046853,1.0567051428,0.5788363123,1.0611105631,,, +0.8125000000,0.8750000000,15.1234856648,1.5979773969,0.9934243484,2.4445366643,1.3427228484,1.4444464081,1.2006521352,1.0633343896,1.6536476481,1.4514987325,2.1518326020,1.0812759760,2.0717787190,1.5949965889,1.7685394366,1.8748699161,1.6524765119,15.9495457294,1.1118199575,2.9216615063,2.3930018850,1.5377889004,1.5136880269,1.1782391377,0.4114571028,0.1982287295,1.6419923071,1.1473148421,0.6863083781,0.6362848070,1.9897724664,0.3889222357,2.4068234358,0.4767168066,19.2084359413,1.5305255790,0.9842616856,1.7177595949,2.1015871393,1.5532391530,0.9277778217,0.4107633100,2.5250752553,1.9345348035,0.7028593466,0.6848780580,1.1076006954,0.4802938755,2.4591279297,0.3925572958,1.2508446069,15.5858948547,1.9025021938,3.0174296733,0.6268450500,2.5323728648,1.9828167736,1.8517031754,1.5598184433,1.1586206381,1.1552099149,2.0704449859,1.0293736511,1.3772766722,1.9433687191,1.3775854481,1.0643941640,1.1197343431,,, +0.8750000000,0.9375000000,14.1066987070,0.4409167577,2.3917591880,1.6151701143,0.6321695011,1.2770855573,0.5917290137,1.8038163946,1.8504638443,1.6128826531,1.3361748806,1.5373835412,1.1968078513,1.5747169656,0.6287191193,1.1894157457,1.4716293088,16.7100178062,2.0975470180,0.3728133633,2.6631144376,2.5929116063,1.8953051397,0.7379429117,1.4610558741,1.7559686678,0.4346267426,0.9499587492,1.5362118380,1.2700479698,3.3134982498,1.4328138831,1.4013971217,0.1967909343,14.5065247677,2.0373729702,2.9615972265,2.4872682838,1.4076957982,1.0578920566,2.4389935904,1.6283687869,1.0759864369,2.0051109111,1.3737583859,0.3008386984,0.7271068634,1.0688870489,0.1702541441,2.2516277312,1.5030296417,15.3983091232,1.1174678322,1.1385865597,1.6653203503,0.9638024120,1.5099916167,0.4615621700,1.6671643081,1.8574152436,2.2530669894,0.8344438030,2.1652244478,1.2974272643,2.2692018297,0.3226193068,1.7496215546,1.4504393949,,, +0.9375000000,1.0000000000,15.3245920974,0.5077058464,2.0734085126,1.5574551474,0.7597512399,0.9022939110,1.7068869580,1.5290536619,1.4428372573,3.3324669271,2.7357304462,0.7554960348,1.2926161607,1.6484616020,1.1567744594,2.6132156020,0.7000293529,16.7540052051,2.9575271796,1.7114456574,1.7247633457,1.3324970374,0.7882926617,1.5150662107,0.6634789301,1.5040456237,0.9378550757,3.7905331528,2.5903557069,1.8156793127,0.3406538681,0.5771854510,1.1427606372,0.5699161978,16.2262396950,1.1826089339,2.5187009419,2.2048965588,1.3278760817,0.8802444581,1.3139629275,0.5999277229,3.4064527278,0.3481525057,1.1078566330,2.4861624980,0.1364837125,0.8383006826,2.2977501555,0.2551474846,0.9791699604,16.6408406673,1.2947891819,1.2669194582,0.3020841808,2.3284398230,0.8457315489,1.7245468046,0.5609522661,1.5398299519,1.2050520574,0.5949106435,2.1440702278,0.6251916736,1.8682074859,0.6621665553,1.4159071696,0.0214522327,,, +1.0000000000,1.0625000000,13.9970185810,2.4622355497,1.7360757425,1.0358860602,1.4991653482,0.3120789828,0.8088748857,0.4473196836,1.0222560775,2.3035913218,1.4310506585,1.1890339062,1.3569087722,0.9520881870,1.4976906065,2.0637569553,1.1619341846,15.9801018341,1.1902069147,0.8499435784,0.5741012926,0.6955371261,1.3724939943,2.0575677278,3.3245182027,1.1440093007,0.5254426005,0.9263009856,1.3300966845,0.4250267261,1.2046160304,0.9294140043,1.0646779662,0.7179257567,13.1084021090,0.3661792601,2.4865973607,1.7288399194,0.7533533851,2.0274305781,2.2528739682,0.5441449347,1.5303927163,1.7377855279,2.5198161460,1.9409947865,1.6396359238,1.4789609494,0.3124129832,1.2549063740,1.3215216694,17.5105683100,1.2972307449,2.4621498172,1.7489329912,0.0982467718,0.7149291018,1.4676787062,0.8137602647,3.3192615384,0.3198382520,0.7633358501,0.9705997645,1.3848245564,1.3436980680,1.5518320642,1.0974932605,2.1649754639,,, +1.0625000000,1.1250000000,16.9474798327,1.6828035825,0.7708073177,1.6698898155,3.0515500321,1.5862059741,0.5714985234,3.1286084930,1.9089678502,1.7534988483,0.3247732613,0.1717784214,0.6174721839,2.2517089159,0.0820261683,0.2908555950,0.8599070155,15.6031529759,0.6330089113,0.5595763553,2.7297306338,1.9848704269,0.6237705908,1.2680025536,1.7297021410,1.4561516891,1.3088757844,1.5573531678,1.2345360874,1.5653328121,0.9693502528,1.0142854263,2.7348820262,1.7430552016,13.7443856057,1.7108243066,2.8306679139,1.3835942010,2.1461983484,1.9356015153,0.5467726770,1.5335189923,1.3209678623,0.4975009929,1.4543544262,1.1911287557,2.1474866954,2.0842703330,0.9537057994,2.5692684349,1.7078211647,15.2490914606,0.8592913145,1.5464412019,0.4884729134,3.5093430498,1.0647232602,2.1954306023,0.7485995667,1.9252538701,1.6923877598,2.8181665726,0.9977764845,0.6571764847,1.9516480100,1.1838704053,0.4445554692,0.2059898919,,, +1.1250000000,1.1875000000,15.0163539511,2.2255355704,0.8252122175,2.0315927145,0.1094805673,2.1700383723,0.8611474191,1.9670743434,1.9666973905,0.7764801300,1.5164809480,1.9457118526,1.0378746913,2.0676452192,0.9580440443,2.8328361039,3.4931740176,17.6629218187,0.8537514305,1.5381693296,0.8007344308,0.6627318719,0.9586474970,1.4594386789,2.7328302508,0.4913833362,1.3368452531,1.8067533550,1.5756577319,1.6945826645,1.4655353636,0.8548675030,1.4897244685,2.7127222505,16.6933504357,0.9156293679,2.3165112237,1.4155208331,1.7093288527,1.7312998197,0.7538105128,3.4093877120,2.0602402276,0.9059780154,0.6094527353,2.2128218609,0.7499683704,0.9435533842,1.3073165331,0.4070655717,2.4530143575,17.5924414850,0.2821967142,1.2525622022,0.7119732550,2.3382338676,0.9664052236,0.9490623879,0.6521532983,1.1026151374,1.3056940310,1.8169497950,0.8096019956,1.7188579698,2.7169439561,1.6802813963,1.1317803306,0.7139442081,,, +1.1875000000,1.2500000000,14.9145437325,0.7276860017,1.1778049625,1.8776337630,1.9915966995,1.6485708337,1.3660866236,1.0287811925,1.9305031407,0.3589113171,1.5537490890,1.5259453856,1.1527588942,2.3177665507,0.2028557983,1.0786170324,1.8761430606,14.3760357052,1.7899552398,1.0696038943,1.6668678484,2.1701649280,2.5264338729,1.7328495111,1.8605913238,1.9674040124,0.7782572487,0.4392255444,1.3432486105,0.7254753671,0.5317627820,2.0115753535,2.4638893173,0.1492477637,16.2109916643,0.7822064854,1.6483471986,0.5143079887,2.0146873134,0.3448734300,1.5538957831,1.7092981254,0.8649034008,1.1665767190,1.3597842095,1.6267505143,2.5692669932,0.7736253806,1.1456274279,3.5896968265,0.0616840436,16.7558523901,1.9117038006,3.6646169775,1.0812263792,1.9282761449,0.5839618644,1.6949277913,2.1389444211,0.9710399798,1.1496032929,0.7545547464,1.5850094094,1.4312471408,0.6544941518,2.1160738000,1.5662462147,1.3105961895,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_stimulation.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_stimulation.csv new file mode 100644 index 0000000..cf79a0b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_stimulation.csv @@ -0,0 +1,12 @@ +Time:10Hz,Epoch,C1,C2,C3,C4,Event Id,Event Date,Event Duration +0.0,0,0.0,0.0,0.0,0.0,33024,0.0000000000,0.0000000000 +0.1,0,0.0,0.0,0.0,0.0,1009,0.0999999999,0.0000000000 +0.2,0,0.0,0.0,0.0,0.0,9000,0.2000000000,0.0000000000 +0.3,0,0.0,0.0,0.0,0.0,785,0.2999999998,0.0000000000 +0.4,0,0.0,0.0,0.0,0.0,9001,0.3999999999,0.0000000000 +0.5,0,0.0,0.0,0.0,0.0,785,0.5000000000,0.0000000000 +0.6,0,0.0,0.0,0.0,0.0,768,0.5999999999,0.0000000000 +0.7,0,0.0,0.0,0.0,0.0,786,0.7000000000,0.0000000000 +0.8,0,0.0,0.0,0.0,0.0,785,0.7999999998,0.0000000000 +0.9,0,0.0,0.0,0.0,0.0,770,0.8999999999,0.0000000000 +1.0,0,0.0,0.0,0.0,0.0,33284,1.0000000000,0.0000000000 diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_streamedmatrix.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_streamedmatrix.csv new file mode 100644 index 0000000..491a305 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/input_streamedmatrix.csv @@ -0,0 +1,21 @@ +Time:4x32,End Time,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 1:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 2:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 3:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Noise 4:,Event Id,Event Date,Event Duration +0.0000000000,0.0625000000,0.6247178635,0.2295959410,0.3719348670,0.4369280334,0.0531824550,0.9206758752,0.0630631244,0.9434279031,0.9641877373,0.5629064767,0.2351933583,0.4779946790,0.0117267619,0.3134714761,0.8507095193,0.7466738627,0.2528587843,0.7453956793,0.9518118396,0.6991397617,0.0862911078,0.9026251871,0.3190328022,0.8531495619,0.4509243038,0.3474009284,0.5439153896,0.9377195023,0.3509305143,0.1930757496,0.5081646708,0.8641290963,0.8184129258,0.0579506208,0.1523714645,0.9367236774,0.5905248479,0.1333713469,0.3324533184,0.7861590511,0.2675358083,0.3492625176,0.7237713311,0.6417018545,0.7801114582,0.9158944124,0.2555023145,0.8683514344,0.5665258553,0.8405682158,0.3655735466,0.4453321877,0.0885207739,0.2907267923,0.5494846189,0.9413676837,0.3565037448,0.9792467812,0.8180077767,0.8491866745,0.6398501201,0.7146574361,0.2051389874,0.3130511628,0.6068926665,0.8942976822,0.1422383951,0.7328692435,0.0940591213,0.7192620132,0.4110640835,0.9548383446,0.1229668837,0.4066373212,0.9911571043,0.9388372037,0.2167346461,0.2381878479,0.0484336310,0.1247581434,0.3242327180,0.6956214425,0.5449278760,0.8073892256,0.3530212415,0.6281783741,0.1901823115,0.6940901016,0.6007994404,0.5159909043,0.7611074464,0.2833421270,0.8413109190,0.8516491721,0.2274385018,0.8590584118,0.8788193397,0.3310824526,0.8579762192,0.8918205681,0.0728651003,0.3015226352,0.8772095803,0.4444632176,0.9624061577,0.0721730283,0.4946323251,0.7401772095,0.2367268736,0.9484532140,0.4340896211,0.5580905937,0.0518348252,0.8917294324,0.4596416526,0.2177230674,0.2215679048,0.1192771688,0.5481093151,0.2777584600,0.7472654104,0.6882385919,0.3112582292,0.2858708308,0.9880663999,0.7280864029,0.6647238990,0.7279383643,,, +0.0625000000,0.1250000000,0.7916842403,0.9959020347,0.8479742697,0.8989522438,0.0569855873,0.2787010295,0.0903042192,0.4555569873,0.3243730180,0.4240449432,0.5276381089,0.4003381419,0.7578766746,0.7413101839,0.7109964227,0.4883505676,0.5342749758,0.9194170183,0.4473819959,0.0906037479,0.4219422783,0.6936454615,0.6798297951,0.2889073431,0.6330675830,0.9270815263,0.0029215892,0.6466751690,0.5451060811,0.4699094773,0.5787274938,0.3730986973,0.0372371369,0.7794849603,0.5209016963,0.4896139265,0.1445874174,0.9246914214,0.5876538923,0.8034119268,0.9044315671,0.0312112283,0.0596434951,0.6761581162,0.1177141317,0.0792608382,0.8271069522,0.6915881152,0.0880144213,0.3721853753,0.5345691394,0.8434471663,0.4318685094,0.3977974739,0.0303642103,0.1931452123,0.3289877151,0.5585844652,0.9421114300,0.6584575928,0.7248723169,0.6650715556,0.2584593394,0.1747180012,0.0126640515,0.2283467592,0.8282534361,0.6398181894,0.3795885686,0.7396059586,0.6978656200,0.4282701444,0.2581869315,0.7321435078,0.2958819489,0.6788505535,0.2237252209,0.9439092700,0.0898844653,0.2602278492,0.5438064933,0.2756655097,0.7206917880,0.0267102423,0.2909259563,0.8908985397,0.1769430288,0.3332633208,0.9955168003,0.0171425024,0.9283314655,0.7482497075,0.1437444331,0.1902347549,0.1183198923,0.4744185095,0.1350478048,0.1350632310,0.8598516148,0.5988463473,0.4637926538,0.1466937549,0.7543433821,0.6176076145,0.3053986235,0.1268153002,0.7012935930,0.4252843964,0.8405439020,0.7880591662,0.0546743206,0.3462279495,0.3178489669,0.1534754725,0.9493906316,0.2995842402,0.3171853460,0.3817553150,0.6397120068,0.6786349043,0.7923960253,0.5762789019,0.8897650798,0.9889561532,0.8021054089,0.9513009533,0.0145796991,0.4025427590,,, +0.1250000000,0.1875000000,0.5354316952,0.1855708270,0.5440807547,0.6109015206,0.1226905328,0.6252105983,0.2077858045,0.5892266906,0.3243331341,0.1108849917,0.1480660746,0.5993171874,0.1865899246,0.7299387951,0.8314899809,0.2654833025,0.5794565286,0.1860336550,0.0734534324,0.6825762035,0.3315890869,0.7518282416,0.0706133868,0.1740920339,0.5928672953,0.9267083497,0.4743168922,0.6156009934,0.1044082525,0.7068447114,0.3882954461,0.3883721938,0.6535663602,0.4014618485,0.9390947879,0.0562338820,0.9265076369,0.6552331559,0.2379341216,0.5922963491,0.3785556043,0.0823038181,0.6102022810,0.5501048495,0.0698941930,0.8938943979,0.8859805122,0.6422285354,0.7160914168,0.3219175423,0.4338959495,0.2321623219,0.4825337785,0.9825600425,0.6410412814,0.0748274629,0.4349746758,0.1838029455,0.0569921338,0.1673214007,0.0840652676,0.3017000062,0.5920127234,0.7209052739,0.3247833503,0.1289402258,0.9880296998,0.5507754099,0.9941914140,0.2638531718,0.7773551703,0.4608309509,0.7777520106,0.5637431627,0.7085339180,0.4620061992,0.4462312341,0.8549258211,0.9349425051,0.6220747121,0.8257583785,0.0621969569,0.2161147769,0.2578956392,0.4917265966,0.0811471439,0.5905438559,0.1570435301,0.8517347798,0.8070278002,0.6446121058,0.2738092507,0.7153216938,0.5724286975,0.3184696522,0.6106053938,0.4362556750,0.4654125476,0.0412808517,0.6872391982,0.1384921176,0.2355170180,0.6412882488,0.2836564966,0.2233175605,0.2902266199,0.5771084048,0.4444316525,0.1688995347,0.3085759818,0.5289214465,0.0736758027,0.4931861155,0.3667650295,0.5704558352,0.7444152785,0.6738597201,0.3758223464,0.4611965055,0.6219348379,0.1448997990,0.2042974252,0.3401152762,0.9085653881,0.2535903926,0.8559037887,0.1393786795,0.9670247519,,, +0.1875000000,0.2500000000,0.3869905095,0.8130090968,0.4773681078,0.3658859478,0.6223253664,0.5276614192,0.6096424931,0.5782078553,0.8558362478,0.0166804376,0.1590949034,0.8950497766,0.9917305072,0.2435093392,0.1637060260,0.9037609647,0.4083003202,0.6212941776,0.9808579371,0.4297587189,0.8651543006,0.9168958084,0.4957057631,0.4137233333,0.3355745384,0.4837193002,0.8212060186,0.3309787798,0.6054222742,0.5242513437,0.2565769902,0.5782544166,0.5716569945,0.3550236323,0.8161460788,0.4898113878,0.4942002657,0.6799599768,0.1361279141,0.9733866639,0.8570520848,0.7394237784,0.2504270682,0.4261734022,0.0781164388,0.2757225072,0.7689188521,0.9729547878,0.7357179380,0.9089161807,0.2199974621,0.1972865281,0.1712700266,0.8200799860,0.2932880267,0.2365728696,0.8504637016,0.2733654731,0.9244502555,0.1964268228,0.4520225395,0.0590663212,0.1510377727,0.6105980920,0.6267644702,0.7912344737,0.9962945653,0.7146594119,0.4629627338,0.1456252465,0.0962293923,0.6451807255,0.0815258177,0.3180345790,0.7228372390,0.0919843561,0.1059558333,0.4949910282,0.2040756983,0.1003921195,0.7441948864,0.6701852798,0.5090639309,0.1593349208,0.1996188341,0.9702999496,0.8765912561,0.1788533351,0.9248315797,0.5284104259,0.7902777246,0.1973803348,0.7706196033,0.4991492617,0.6835269318,0.2194916869,0.3945134415,0.0846402352,0.3076508678,0.9030676920,0.7974082592,0.2686406809,0.9279564749,0.5067867551,0.5450436533,0.9022596013,0.0639394629,0.6020122301,0.5276013811,0.9248796261,0.5335813728,0.5468204648,0.8933275251,0.3670222436,0.0714884072,0.4467592905,0.8788097329,0.3470622129,0.3112788191,0.8507936441,0.5841831907,0.3042222930,0.9730116671,0.0189913267,0.2255214015,0.4713275090,0.7614493098,0.7445041714,,, +0.2500000000,0.3125000000,0.7475165320,0.7077019608,0.4211428759,0.6337533703,0.1548015915,0.8466420209,0.8046947974,0.2090040792,0.7225930176,0.2379091252,0.2081041720,0.3097281049,0.8627588837,0.7815109899,0.2822953856,0.3766993126,0.4826091563,0.6490248260,0.5871235379,0.8408237286,0.2880355727,0.8079525568,0.7305980087,0.0446874464,0.3790445239,0.6870999713,0.3792935724,0.7203232241,0.7072606350,0.3268334912,0.3244365475,0.1609095400,0.6040282352,0.4090505685,0.8466607979,0.6078362484,0.6572325418,0.9389880754,0.2789553648,0.8288472604,0.7671234810,0.8559769762,0.8048807078,0.9781307846,0.1170271400,0.0955756006,0.7023727754,0.2710399539,0.2772281950,0.9339906632,0.0760479772,0.4311382486,0.0134554477,0.2744895851,0.8400484035,0.1349793915,0.6880048711,0.5082143673,0.0599132481,0.5983064617,0.5813180115,0.3302138741,0.1171984423,0.3598981365,0.9601493494,0.9718443754,0.8141304278,0.3168197875,0.7100818388,0.7431266517,0.6275801475,0.4796580172,0.7600127761,0.9601051835,0.4013476530,0.1069331493,0.7168725964,0.8865401975,0.4027381288,0.1773700931,0.8079308106,0.0192486329,0.1971677996,0.4108467749,0.5112684753,0.6257441242,0.0241121089,0.0773695745,0.1119003820,0.0784076694,0.7690242585,0.9973556015,0.8100359763,0.1161451868,0.3317182662,0.2262892942,0.4158308909,0.6780515991,0.0965853147,0.1125570906,0.0585444923,0.8103074192,0.6963739721,0.4617282699,0.0662594968,0.9470956312,0.3677819686,0.6243161291,0.2456642224,0.6868472262,0.5304208286,0.4996256302,0.4018244247,0.7993800575,0.7502997657,0.1295753843,0.6139282982,0.3850772083,0.7410265871,0.9505349223,0.1718049857,0.0436037309,0.7222658431,0.2623362916,0.4524845155,0.7600987547,0.0907678234,0.6501223778,,, +0.3125000000,0.3750000000,0.6832152936,0.1653723242,0.2833738236,0.7051067993,0.9596694722,0.0077245780,0.9099076649,0.3307804475,0.3043593729,0.7884677316,0.5294613040,0.5603319725,0.1811365085,0.3240584144,0.6993869606,0.0559134919,0.3100979279,0.3963845437,0.4922327199,0.3384887238,0.3344349221,0.1713994979,0.8019217222,0.6949718141,0.1128475762,0.4875978495,0.9843723157,0.6184082213,0.2098921225,0.1262802815,0.0787062282,0.7506488608,0.6320486488,0.3718562960,0.8150399046,0.4523261948,0.1865352490,0.3382845216,0.3307686823,0.4420708066,0.9860612608,0.1189327538,0.5187779404,0.2537971991,0.9554295770,0.4871536223,0.8492387615,0.6820085198,0.5727664111,0.3328853692,0.0458602726,0.0990522651,0.7407473733,0.4783710605,0.6004347131,0.5108897616,0.4088872804,0.2217112738,0.0631800883,0.7484901643,0.6655623131,0.8960333257,0.3361647702,0.8936920550,0.3347082420,0.4624420691,0.6975995414,0.7440702980,0.7570610575,0.4503419686,0.0761081195,0.2094631761,0.4337339492,0.8481645458,0.1509745577,0.8273338033,0.1412401372,0.9055362893,0.5377664056,0.7276511134,0.3472308354,0.4070861489,0.8647191699,0.3776554763,0.9014279337,0.1613831620,0.1831764721,0.7570894095,0.2429209175,0.1028610284,0.4883698574,0.8601409264,0.6518152619,0.7323852156,0.6203258915,0.2670598072,0.2435945547,0.2624233742,0.5525493894,0.2394448698,0.4407361986,0.7679479290,0.7408140721,0.4260145663,0.6428195701,0.7339275440,0.3838015122,0.2047397431,0.1386463228,0.6520207217,0.6937717628,0.4803410582,0.7105179750,0.8847256717,0.6067465718,0.7352916114,0.8750882426,0.4990125778,0.8288464500,0.2335142721,0.9030272779,0.2022158357,0.9505604827,0.2209152961,0.8638066743,0.2321505924,0.3101781013,0.2061025528,,, +0.3750000000,0.4375000000,0.4859413321,0.9877855547,0.1494783007,0.2767159450,0.2167581862,0.9465897263,0.5924392790,0.8611804591,0.8994583734,0.3700717301,0.7556393195,0.3908531850,0.0479475632,0.7903228519,0.3686270104,0.4355188883,0.8181044774,0.1318663671,0.2742029524,0.2670144076,0.5052552682,0.3962481907,0.3654816428,0.0745923945,0.7323264899,0.8265386631,0.0207543294,0.8574163453,0.6112360929,0.1370159427,0.0227805192,0.9560871550,0.6499585998,0.5232965087,0.9644817812,0.5052818994,0.0360487467,0.4839542890,0.1854097859,0.9884410882,0.1891570103,0.8116629547,0.9937143456,0.5141466737,0.0049897258,0.2016054441,0.2165381487,0.2584592500,0.7546079981,0.6247757524,0.0004397486,0.3211759224,0.1478310619,0.4054733154,0.6243799946,0.5384108196,0.9150172065,0.7107390857,0.4420419482,0.4309278466,0.8999328807,0.3986736122,0.7601878832,0.8841054698,0.8045254231,0.2193988021,0.6877752680,0.7365202352,0.0493166712,0.9203797234,0.1834182537,0.1521059114,0.7988404376,0.1548302495,0.5660417581,0.9886881104,0.0694611096,0.6951701064,0.6523590668,0.1372051714,0.0353963454,0.9750322802,0.3420630472,0.6143989780,0.9029343792,0.3236322112,0.3542693998,0.3545910723,0.6990753133,0.0825616445,0.8365524074,0.7571731473,0.2803697805,0.8384478281,0.8199029886,0.8515532590,0.6603102332,0.1317246074,0.5796738775,0.3141785141,0.9550146442,0.2675180803,0.7109510296,0.4312380580,0.4246354715,0.5503449372,0.8890772075,0.7285156753,0.3090131416,0.8626140449,0.1238252930,0.7100571550,0.5275217385,0.3981849195,0.4033966847,0.1773852715,0.5235586097,0.2376325615,0.1133864610,0.4032399456,0.3768389798,0.0065282723,0.0196791952,0.1548828904,0.8980673284,0.9459735046,0.4348659466,0.7464884343,,, +0.4375000000,0.5000000000,0.0526652108,0.3060746153,0.4623779312,0.5353596075,0.0713174255,0.2419932550,0.1181321861,0.6044711831,0.9282540861,0.9736331881,0.9815067283,0.2351991637,0.3612387269,0.5239392833,0.6655883607,0.9938846249,0.1296747862,0.9861127972,0.1274974784,0.3710853378,0.6428858622,0.5598340665,0.3426672125,0.7328236210,0.9149753943,0.6098634449,0.4605819304,0.2784264691,0.7899020005,0.1312024286,0.4621126929,0.1965656390,0.0123895954,0.0354354742,0.7273706365,0.4492230779,0.8741791639,0.3810855432,0.1157127193,0.6245390642,0.3816144001,0.0342777544,0.0467986362,0.2774559739,0.8923492222,0.9953079084,0.1309779175,0.5961301597,0.3099202453,0.9770325006,0.5071837376,0.6934208998,0.2344275359,0.2897891670,0.5736545678,0.7122258593,0.9728836159,0.5458500413,0.6501270568,0.3591857357,0.5158132112,0.9789201000,0.8691409642,0.7656565451,0.1557542691,0.7970968222,0.2881981919,0.7726560996,0.8546606803,0.6566159525,0.5507968676,0.6179759016,0.4828415082,0.9437404326,0.6924461161,0.4658332667,0.0979719572,0.4398121240,0.1438904412,0.7496415114,0.0731318104,0.2609226620,0.3701273194,0.8512771113,0.8722216967,0.4299300862,0.1312265347,0.7606461972,0.5967305005,0.3751555358,0.5354029713,0.9570320644,0.6098493550,0.1289725823,0.7069231605,0.8694794760,0.5170092632,0.3601436892,0.7058712961,0.7469340987,0.2521892991,0.6322562329,0.1013701295,0.8491450606,0.4590498051,0.7310305673,0.8269926803,0.6074415524,0.4662977231,0.6465816682,0.8205662619,0.8832575795,0.1465387098,0.8680616487,0.4096918793,0.5852987652,0.4461445706,0.1560673094,0.0266291511,0.9622767956,0.0414263681,0.3629239164,0.0525879092,0.0779130952,0.2562843878,0.9092865977,0.7887958288,0.9093442177,,, +0.5000000000,0.5625000000,0.4926652883,0.7512122414,0.1548476375,0.7650190189,0.5141945812,0.4969086542,0.9462195560,0.7683583798,0.0855614543,0.5256539939,0.2630233504,0.3742849301,0.1559279105,0.1489096042,0.6653898561,0.1138309888,0.0475025291,0.2753131604,0.0275366297,0.9809523805,0.0338368805,0.9269881379,0.0502397972,0.1016259796,0.3627047651,0.2293560563,0.4889925939,0.5114581725,0.7985794735,0.1955985704,0.5195864269,0.8491408958,0.4412451643,0.7563525841,0.4346954005,0.2490186803,0.7948655006,0.9979346998,0.7598540527,0.8762718842,0.4072918834,0.0689565034,0.8952694137,0.6424213173,0.6918975094,0.7443818732,0.2585564679,0.2019052580,0.3316509877,0.9849470311,0.1548954893,0.4391770544,0.6088130211,0.1808344808,0.1080418664,0.7036645222,0.4441828502,0.1075669783,0.3375624970,0.9895764424,0.7450129259,0.0241380876,0.6299205739,0.1611904954,0.1037065519,0.9300586721,0.4044433259,0.8433975794,0.5246419837,0.0419671247,0.2045192388,0.7056242696,0.2645084059,0.1571327578,0.5443686608,0.4002167776,0.2817252930,0.2453914813,0.4499940879,0.7328971985,0.8301240972,0.9468080746,0.1496586704,0.0148724986,0.1790443165,0.5386010327,0.5943256179,0.0723523921,0.2236518241,0.8345614863,0.4446492954,0.7731404367,0.5083364355,0.6416412974,0.6354032024,0.8889534273,0.2649519246,0.1769712633,0.4595457090,0.7192335434,0.5000948738,0.9646494845,0.6100983098,0.9575897572,0.7635886252,0.3145864322,0.6420461670,0.9808723172,0.0620559340,0.7938328192,0.3454614431,0.5953680223,0.5544510509,0.4504120026,0.8943826088,0.4842216515,0.8929886234,0.4288465122,0.1564112811,0.3252644993,0.5164954150,0.3014303297,0.7043552445,0.6696986130,0.3627545452,0.3432444541,0.4692347383,0.7377021736,,, +0.5625000000,0.6250000000,0.3548387419,0.0796746763,0.6342768159,0.0296325649,0.9640529135,0.9868903607,0.1778739933,0.9019317864,0.8128735686,0.9701672052,0.8320685972,0.3162027264,0.9373291417,0.8125307872,0.8106044994,0.1962158955,0.2474939022,0.5465572993,0.7876791237,0.1753418525,0.6342823205,0.7545824184,0.4214702921,0.6403068278,0.4490981505,0.6738659109,0.0163966827,0.8634146550,0.6677360923,0.2105928650,0.8362909176,0.9620119936,0.6306045009,0.1718088784,0.0982105408,0.1162219564,0.9585239354,0.7266078151,0.1952852996,0.0108120875,0.1315755164,0.3056201264,0.5124785949,0.4017646539,0.0346933841,0.0348911523,0.7019456655,0.6033998784,0.1409685891,0.0052106034,0.8845494692,0.3171485392,0.1751754847,0.3062383870,0.2960795583,0.7197415007,0.9949374788,0.1329197420,0.7994592281,0.8946880810,0.7543501181,0.2613628868,0.6345325401,0.3764414371,0.0278432646,0.0524431348,0.3322724667,0.3718729187,0.6172496430,0.7031758174,0.6411467646,0.0481271599,0.5018861138,0.8183177102,0.7736140946,0.6019540867,0.0485901181,0.5530024043,0.0660292304,0.4661760060,0.2586283982,0.1391376588,0.0556506028,0.6547378157,0.6253326479,0.0875797574,0.5825918615,0.6969912143,0.9752079884,0.9423126262,0.2488991269,0.8252424053,0.0897458876,0.9998906860,0.7458893151,0.3179603629,0.9342312953,0.5402078901,0.8981055715,0.7352642594,0.4631935444,0.6066625286,0.3549963043,0.8298564928,0.7607265895,0.5664455881,0.1930705912,0.4323468697,0.6950631985,0.3498548246,0.4684577179,0.2220740248,0.2624253789,0.2515077996,0.8203581586,0.5385144786,0.2173937652,0.5463267793,0.4103756479,0.3151688955,0.7107384400,0.0251211780,0.5314374645,0.9966925937,0.5429001502,0.8070511126,0.1058709247,0.9967472763,,, +0.6250000000,0.6875000000,0.7654441406,0.4937635777,0.2239419888,0.8162253727,0.9942743706,0.2985757273,0.9891730216,0.1941202453,0.0551401938,0.4405527723,0.7969850798,0.1563250415,0.4974447836,0.3638560434,0.2950112985,0.4749449773,0.8567663343,0.8206363397,0.4740776736,0.7806238928,0.9931304296,0.4493170793,0.0649340996,0.2380064668,0.9392203940,0.1506378159,0.5991383693,0.9228379647,0.1970598102,0.3463509476,0.6523170716,0.2806429346,0.5740959158,0.9104665206,0.4764978478,0.9612608692,0.2306956910,0.2107479912,0.1704450788,0.5974330634,0.2684311345,0.7482852761,0.2793505003,0.8886733039,0.8475405122,0.9195321889,0.7322915252,0.3557866111,0.0693242699,0.3397358772,0.1634379628,0.4213934450,0.7044839428,0.9967953137,0.9440651119,0.5700368790,0.7893532142,0.9413755247,0.0517390424,0.6595565958,0.8118670906,0.8431744357,0.4769329347,0.6804557841,0.9390716855,0.9902591412,0.3700074395,0.3475468538,0.9869502545,0.3295042466,0.6492619955,0.2637873620,0.3119304245,0.0467681880,0.2625429758,0.0213194594,0.6631090660,0.6053168913,0.3251018671,0.7144555594,0.3016037853,0.7397705205,0.8889687117,0.6712127428,0.7807400336,0.2118155160,0.5016608983,0.5795669421,0.6359361175,0.6869840925,0.4576294059,0.9030834693,0.8164589927,0.7203676675,0.0748002424,0.7592939311,0.9823745447,0.9587582562,0.7952176470,0.7251193146,0.2759674732,0.7957962712,0.2292552406,0.9370382747,0.3233199737,0.8624233501,0.9313870701,0.5996785422,0.1932367058,0.4228141136,0.5863649147,0.5264009631,0.1215832722,0.0065137360,0.2756085894,0.2840909536,0.9855480257,0.9460084406,0.5039020125,0.9574089099,0.9505582221,0.8531143751,0.5968147409,0.7671717149,0.6130312048,0.5297381685,0.2286378199,0.5605443947,,, +0.6875000000,0.7500000000,0.4502677126,0.6962080926,0.9128074497,0.9560164253,0.5328638772,0.6530740836,0.5206698487,0.6608048354,0.9682086594,0.7272667042,0.7281186825,0.7904959833,0.6054920864,0.3392744095,0.9816954136,0.4714308141,0.7494125855,0.4109848249,0.5571885267,0.2632726908,0.3619709597,0.6431256575,0.1007609386,0.5941922080,0.1839554398,0.1205380186,0.6594694795,0.5689522501,0.7585891197,0.0885437687,0.8536296941,0.9312499978,0.2541364124,0.2946735977,0.8706164521,0.2156441705,0.4842425361,0.0775878394,0.2993731557,0.3703004594,0.6341408147,0.2738721366,0.7811928024,0.8346063448,0.1437354498,0.0004676401,0.6384254163,0.1001991194,0.8084309287,0.4829823931,0.6235495135,0.6840985361,0.5825826777,0.4171131444,0.9870282889,0.4105823603,0.0424702668,0.1073548275,0.4047930092,0.1203739478,0.0799161086,0.5006264041,0.8482475453,0.0656195192,0.8408296867,0.7487304423,0.4552003471,0.5083866168,0.1740615570,0.7433071290,0.5747186900,0.0638115588,0.9728865607,0.9231198416,0.7971369165,0.6765650478,0.6986605374,0.7186565769,0.1736776924,0.7956658397,0.0595004379,0.2578393670,0.1223583464,0.6965204566,0.9839389042,0.4421050667,0.9041193023,0.0998137125,0.4093976771,0.5090963494,0.7166604474,0.0551742224,0.7656437296,0.7981080476,0.7131274240,0.5406918994,0.5702210369,0.6819301986,0.2822982909,0.3520181263,0.4362103776,0.6040338485,0.5987478618,0.7429419127,0.5714071004,0.3471043196,0.8102124687,0.9587924071,0.9729605387,0.9780838832,0.8904455733,0.1768353251,0.7486089289,0.9994414682,0.5787694799,0.7188671927,0.0136518653,0.7794517821,0.6122001191,0.0007004540,0.1763693239,0.1010190644,0.1266606206,0.8490937916,0.9316227492,0.8406871033,0.6580100090,0.9750389399,,, +0.7500000000,0.8125000000,0.6597400920,0.5885838564,0.7857646004,0.7503551356,0.4718447104,0.0866925118,0.9197117689,0.9950628248,0.0295223645,0.2836865839,0.1586640773,0.8000291912,0.6616069386,0.6563964463,0.4465203935,0.7396615332,0.6076592195,0.3238815712,0.9824488070,0.9728015682,0.0520980426,0.3060984754,0.2858697739,0.1975828628,0.1253559410,0.4791424333,0.2798632411,0.1617351994,0.7534016052,0.6404544087,0.7733843811,0.7188167234,0.1894933190,0.4043975784,0.6941734480,0.0172624579,0.3868409907,0.4395070625,0.5897659294,0.3081313299,0.0892954457,0.3226943829,0.7103347299,0.2233194252,0.8322126665,0.3709399267,0.8143146322,0.6909234507,0.6461562880,0.5830114598,0.4852226414,0.7865708459,0.8036368454,0.4828703813,0.5373617639,0.5900660907,0.6904538674,0.0138230971,0.2490095489,0.7393181478,0.2877402762,0.4513432579,0.5680671209,0.6436918143,0.5406705167,0.6813580187,0.9233717178,0.3238394572,0.5844412202,0.9236779967,0.2737147608,0.5797183521,0.8608876099,0.8776531208,0.2443616646,0.2432832436,0.6981052044,0.7365806326,0.8849672999,0.4853381920,0.5449085427,0.8669738255,0.4942614299,0.9243413096,0.1794794516,0.3754306738,0.6883994963,0.5418054187,0.1381584327,0.6953644182,0.7411244428,0.7460892559,0.2731044050,0.0488576868,0.5011982922,0.6577869877,0.7627640630,0.0236888060,0.7711321849,0.3902818810,0.4297669264,0.1559308341,0.5210048554,0.3863513316,0.6484974532,0.0608827656,0.7043687252,0.6244241684,0.1403175246,0.5562529312,0.2631591787,0.9759852611,0.2841610499,0.6501125291,0.1502811159,0.3001988607,0.9586796160,0.4451140123,0.0647737177,0.6377006297,0.1423613841,0.1523039597,0.9474527435,0.9598131562,0.9461015512,0.0085723544,0.6874726999,0.3356614353,,, +0.8125000000,0.8750000000,0.4951484718,0.4137571189,0.0569000966,0.4288186433,0.7854072719,0.4143841334,0.0244760385,0.6809264892,0.6102338028,0.3421895124,0.0523749369,0.7298694055,0.4134743935,0.9069422120,0.0255988901,0.0171017484,0.8945272362,0.8478161518,0.7934845393,0.2360887395,0.1801714411,0.0021404293,0.9694124160,0.3984161261,0.8861893385,0.7274739528,0.1838548863,0.8699946168,0.9781448101,0.7100307504,0.6141936865,0.7610268604,0.4235622173,0.9017294946,0.1870069781,0.8541975934,0.6132133221,0.8906224929,0.6807086817,0.1879235532,0.8673600175,0.6300860762,0.5366717121,0.0550985967,0.5221361807,0.1448409907,0.4561040732,0.2083544936,0.0413183626,0.4696824565,0.0332377399,0.4693293732,0.1898895621,0.9431418541,0.8067416335,0.2638124076,0.6924453792,0.2537440723,0.4020697493,0.4863762164,0.1145292672,0.2213524713,0.3857528327,0.0674968564,0.8121729761,0.2750603121,0.0802166942,0.7938963389,0.9176716192,0.4196322735,0.2388986130,0.9978474600,0.9629005950,0.0735100827,0.9331875124,0.3795208391,0.3922109492,0.5588367411,0.7617001452,0.4730127715,0.9087597590,0.1599815958,0.8977322627,0.7852105810,0.8837358134,0.9391245898,0.5956780913,0.3008686816,0.4643168407,0.8793222804,0.3512133467,0.3835873082,0.2839328232,0.4700245983,0.9630959777,0.2224663049,0.2382329085,0.2103578080,0.0583997120,0.5361932365,0.8401390389,0.8651594589,0.9916231507,0.5314276395,0.8768030803,0.0018314875,0.5376906672,0.0867553214,0.4225539663,0.8168300600,0.2191769166,0.7114649462,0.9731043351,0.4109111931,0.5946094589,0.7635395932,0.5573117547,0.9749870342,0.6840263985,0.3520052256,0.1577927826,0.5355608661,0.0733829080,0.5503560782,0.6984678828,0.6332150383,0.1281256950,0.6934248279,,, +0.8750000000,0.9375000000,0.8262026000,0.6800406706,0.8230532890,0.3312053366,0.0791727190,0.3375838087,0.6164910560,0.0553016283,0.9159938979,0.1167176482,0.9642385286,0.4662711693,0.0860841114,0.0288988317,0.8278238336,0.0034026832,0.3953088420,0.9177478116,0.4092492419,0.8913496369,0.0257779597,0.4760923833,0.6182677727,0.3230207954,0.6945901709,0.1895992311,0.2035093841,0.4018307636,0.0753713418,0.5057941203,0.8654059754,0.9612625141,0.6113119549,0.3052270464,0.0034051070,0.8834864479,0.6637033250,0.7753436505,0.6367439146,0.5068913791,0.0499874779,0.3682553454,0.3032939732,0.8526346046,0.0017702775,0.5300046704,0.4208789961,0.9453098350,0.8475046742,0.5859889074,0.8497315217,0.5927666053,0.8303499359,0.6969741047,0.6246392576,0.7579033028,0.5919736151,0.4604226539,0.3722940462,0.3175512927,0.0381294147,0.3514439941,0.5384543089,0.2421207936,0.5818590294,0.2106211025,0.1699498768,0.8333654262,0.3050256937,0.1657615656,0.0624764247,0.4779500451,0.7039530529,0.9742760058,0.5458899166,0.3053509365,0.4714929876,0.9861352115,0.2831235216,0.5417119283,0.9501627218,0.8269119393,0.5411800570,0.5915424312,0.9224375067,0.0019667454,0.4485846600,0.5964546783,0.4705979887,0.6997977437,0.0705102577,0.3015512920,0.7767169708,0.0310898924,0.6572577641,0.0498077215,0.2139518764,0.0282647032,0.5614815420,0.1199005472,0.6160741956,0.9559962109,0.0472760913,0.2162385259,0.7890758167,0.4775436576,0.5490116121,0.6907650672,0.1988431036,0.3623787200,0.6748607692,0.5622677719,0.8651337281,0.2889742211,0.8135919487,0.8080134841,0.9803157884,0.8661532071,0.4301462041,0.9604776879,0.9575312759,0.6211291603,0.0602738846,0.6445526120,0.3997429844,0.5335842420,0.2354770997,0.5703356166,,, +0.9375000000,1.0000000000,0.1679284181,0.0116292820,0.6713393128,0.7051338786,0.5834520799,0.7177573889,0.3392238002,0.1346499354,0.5625305925,0.5137179869,0.5924138909,0.3562407838,0.2652642194,0.8141605475,0.9288930635,0.2231001314,0.1750653218,0.3136353311,0.6481592141,0.1982572724,0.9394587332,0.3204006592,0.0444805650,0.2147457984,0.1614268553,0.5942634724,0.0950823138,0.3600166386,0.8212693390,0.5074280743,0.2752121019,0.1186141570,0.8331678393,0.1588774454,0.3326816757,0.5071129550,0.6412843384,0.0316611044,0.2856399296,0.7435067382,0.7493902263,0.1525118365,0.9138491044,0.2386630971,0.0203620240,0.0533332997,0.0798282519,0.0691285226,0.3476698725,0.8917724602,0.2301328648,0.8593468245,0.4296178813,0.6222921708,0.0249198619,0.5999211350,0.6120050943,0.6154593697,0.8989983436,0.7112358140,0.8779653690,0.4389945539,0.0551658797,0.1381868846,0.9138693274,0.5621938761,0.2863271981,0.7325413090,0.5425972489,0.5751449321,0.3509974892,0.6927378860,0.7835192583,0.2844782392,0.6382476424,0.7061826356,0.7370361837,0.6226274676,0.2088809009,0.2935124915,0.3513496004,0.5787265806,0.6042397721,0.5171754735,0.4450626483,0.8866352371,0.6589918823,0.2202287668,0.0976188593,0.4164506367,0.6294516746,0.7863249348,0.6679730897,0.5078839634,0.2269497360,0.3440359347,0.7772970388,0.9805411990,0.1963203617,0.2991644875,0.0454477593,0.8594248760,0.8639521245,0.0693449832,0.2472545162,0.8444152090,0.9585070037,0.0225089605,0.4990623794,0.7584918430,0.2985699803,0.4827716728,0.9824672064,0.0915980614,0.5346251470,0.8658588289,0.5071282431,0.4654764065,0.6182458180,0.6156599661,0.6460136580,0.1110876829,0.8671845864,0.4022050030,0.3074841262,0.6642128383,0.0014574521,0.6935462605,,, +1.0000000000,1.0625000000,0.2137309904,0.4544911664,0.6798921563,0.4921943266,0.3362297001,0.2847381542,0.6437950153,0.9383269558,0.1397160820,0.4575725703,0.7571243041,0.6186974405,0.8074270575,0.3774803712,0.1769097759,0.4871998692,0.9569660802,0.6593258211,0.0758621178,0.1879452108,0.4906961091,0.3218933593,0.2431967803,0.8575711269,0.2750979303,0.2216316864,0.4766704070,0.4577354111,0.2064776726,0.2724582830,0.0749704337,0.3832853076,0.8018044159,0.6921387615,0.9921656852,0.4057687074,0.0617558532,0.2327312671,0.5771559153,0.2284900285,0.0590479346,0.2758173042,0.9457325011,0.6647606222,0.0981595817,0.2590912562,0.8130702917,0.6360369716,0.9462671543,0.0010640700,0.1375384575,0.3707128139,0.3092900361,0.9429778690,0.6217287686,0.4192660332,0.6812241087,0.7129155374,0.9818436850,0.6350809271,0.2476287666,0.9715665514,0.1205336715,0.0928393225,0.0088279590,0.6031203971,0.6596260488,0.1443080404,0.1546425293,0.9326476485,0.5288438348,0.0169140310,0.8668725954,0.4123998375,0.3775879829,0.5326866286,0.9242688494,0.4422083166,0.3069048850,0.1539458423,0.4144589426,0.7776402466,0.8601672621,0.7430550803,0.8074781313,0.0557779926,0.5821805752,0.2611693509,0.4422279357,0.3827645087,0.9467565422,0.2880943024,0.2826895297,0.5138747173,0.9742166633,0.3376196956,0.3516322491,0.2682236054,0.0347050410,0.8784039379,0.2282802360,0.5318389740,0.6525104714,0.3306392352,0.0701013329,0.6777035065,0.5854775421,0.8512900607,0.0913615956,0.2934230366,0.4679984997,0.2476933554,0.3031436063,0.9276851357,0.4689371770,0.7340950945,0.1723134439,0.7710931241,0.9103395792,0.9875814451,0.6239819005,0.5243784036,0.2998705199,0.7308793671,0.6511168599,0.2998312942,0.4789863380,0.2999395356,,, +1.0625000000,1.1250000000,0.5931908898,0.7309124726,0.1353090142,0.7283182526,0.0488233604,0.6919248875,0.5654962317,0.5891109256,0.1122994891,0.4159194189,0.3764929147,0.9494192691,0.3878915668,0.1244349491,0.8175409115,0.9035466295,0.2931364391,0.8594305085,0.1912104939,0.5639044710,0.7228399697,0.1977252481,0.1863250257,0.1408073560,0.8027174983,0.4142429589,0.1808046964,0.0125501421,0.6471301608,0.4860138474,0.6514314555,0.5628913341,0.8644442572,0.5552712027,0.0151265447,0.2374828074,0.8766233369,0.2438984078,0.3027490238,0.5001187921,0.7108031833,0.6028569383,0.0546991809,0.4225322115,0.9588101294,0.4600294342,0.9185105995,0.8249672593,0.0892420548,0.6061045709,0.7207820001,0.0026756388,0.4786440204,0.5467939766,0.0654323131,0.7286043169,0.7861308276,0.3410324152,0.3520775896,0.1542424636,0.5819967657,0.2966403281,0.4022705988,0.5724041392,0.5939434061,0.4567232542,0.0375771916,0.2087124737,0.1880471830,0.8748202738,0.5906794223,0.2287169953,0.3570454933,0.4300619953,0.0100690452,0.1438734650,0.1549616663,0.5758979041,0.0461017075,0.7165612974,0.5656311857,0.6070347405,0.9116860381,0.3978753891,0.5053920399,0.6122428069,0.0281106522,0.7027764153,0.8615361010,0.5020784172,0.2611516425,0.4710602802,0.2577258444,0.3572090822,0.9675099622,0.1586091609,0.1901043819,0.9543702262,0.5918874820,0.8989631108,0.9625966987,0.5375990241,0.6290122089,0.1784213777,0.4204781046,0.5288314561,0.3349709855,0.9483079254,0.2088262488,0.5261074379,0.6237077352,0.0479094042,0.7611453154,0.2613925296,0.9345898028,0.8540216177,0.5429263390,0.0596870789,0.1228484851,0.9884465558,0.5994056747,0.5901793416,0.3197100651,0.8187572497,0.7597195588,0.5117904092,0.6303460039,0.6385685280,,, +1.1250000000,1.1875000000,0.0951258531,0.7277233065,0.6006643453,0.0228086452,0.8239419067,0.5155266635,0.0191960505,0.3796252070,0.5055223757,0.4020866172,0.5189295192,0.0753156706,0.9720687266,0.0484040140,0.7843413458,0.9730091204,0.9922290591,0.0851901833,0.3296290701,0.0377371099,0.6281560692,0.6815555356,0.5792539178,0.4853602059,0.6556749332,0.0062036244,0.3974684728,0.1654793920,0.3105455413,0.9249097810,0.2598673194,0.8876951223,0.2350130558,0.3901448085,0.2341265944,0.3637975010,0.5625018100,0.9029143190,0.3544837306,0.1279784262,0.8366534521,0.3101605135,0.7163888747,0.0583991115,0.2954969504,0.4429354239,0.1804037238,0.2439929745,0.9335751345,0.0057892075,0.4619030475,0.2931784280,0.1797548921,0.5020443008,0.2883011773,0.3374369312,0.9279700841,0.3887938145,0.2170151267,0.9179955407,0.6340869551,0.5557600548,0.7435555537,0.2839753202,0.2662001683,0.6706366031,0.7547104494,0.8550751107,0.7688080396,0.0586293077,0.7804771422,0.4787573102,0.6632498137,0.0741167834,0.0048650759,0.8381817841,0.4810157609,0.6855519353,0.0104576417,0.7910236670,0.6425741296,0.9244767239,0.4864446763,0.0067145957,0.9369897931,0.4404468786,0.2032674944,0.3744280310,0.9855825459,0.1193840445,0.8631986284,0.5556113927,0.9572339943,0.4989517976,0.9710160899,0.2522383390,0.4253497068,0.7571807946,0.9246740653,0.2222794134,0.1579823359,0.0243675769,0.2997759597,0.2323811688,0.0305091403,0.2917462506,0.2403668212,0.5604984399,0.4182756997,0.7232471572,0.2699862767,0.9507088428,0.6559072356,0.9839131341,0.4760734998,0.7222971332,0.7723106057,0.8132286537,0.7292613545,0.5869136585,0.8191143919,0.5913443926,0.7021092409,0.5089733775,0.6504381110,0.2708367638,0.7500082653,0.6161660077,,, +1.1875000000,1.2500000000,0.1683035602,0.1424043456,0.7668608918,0.7607295110,0.5174434430,0.1944848874,0.5707954851,0.6883187809,0.7862345560,0.3534223591,0.0046566047,0.8831072131,0.8692115010,0.8142559922,0.6493804462,0.2158862920,0.4540214015,0.1944293983,0.5699003865,0.4442949190,0.7955052461,0.0413213808,0.1306964061,0.2713446848,0.3018432979,0.2247307675,0.5835549848,0.0824868602,0.0957095684,0.9983673533,0.2957036200,0.2246049009,0.8470544151,0.8808483067,0.9845280973,0.4677556294,0.6242646559,0.2264174577,0.2684859056,0.6608157074,0.0302796764,0.1580758188,0.1085000942,0.5066947001,0.9121542578,0.8649886900,0.4107301729,0.6955318693,0.8209484203,0.4312713409,0.4673444098,0.7952723317,0.8295831063,0.8415844627,0.6199640527,0.4139429175,0.3483000207,0.0775644176,0.5936895902,0.2502907016,0.2399989681,0.4271952116,0.9239734123,0.1219773670,0.0943703118,0.6653878638,0.8019994879,0.9259957087,0.2431919265,0.9921174757,0.9230932575,0.1104911843,0.8744879481,0.1063987957,0.4028745531,0.7043685114,0.6735291812,0.0341512391,0.6810112968,0.5630981151,0.2024573432,0.1054956890,0.6937220371,0.6657904771,0.2473630700,0.0166703118,0.5132303271,0.2155902667,0.7550028116,0.4930060136,0.2008083768,0.1790083253,0.5938848599,0.0768408582,0.3858271067,0.6740172072,0.0841419913,0.9335749368,0.3200270960,0.2295888106,0.9300683755,0.4034733148,0.1734928533,0.7465751641,0.3203449501,0.0854344415,0.0025144017,0.5991113116,0.4523527375,0.6149762333,0.0270627474,0.4228744288,0.3947751317,0.0639017015,0.3141180936,0.4396834220,0.2421118172,0.1722038793,0.3533720416,0.7971124125,0.6941583254,0.5414881702,0.1323242220,0.4963991921,0.9385722023,0.7164676930,0.8498095335,0.5222759610,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/ov-read-write-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/ov-read-write-test.xml new file mode 100644 index 0000000..7d1763c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/ov-read-write-test.xml @@ -0,0 +1,461 @@ + + 1 + openvibe + 2.0 + + + (0x00000202, 0x000037d1) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 544.000000 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 62 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c63011) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000151d, 0x000049b2) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 560.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00506ff2) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000324c, 0x0000225d) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 384.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 153 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x011072bc) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00006172, 0x00004577) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].ov + ${Player_ScenarioDirectory}/output_ov.ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 271.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 368.000000 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0067854b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000023a7, 0x000067cc) + + (0x0000324c, 0x0000225d) + 0 + + + (0x00006172, 0x00004577) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 183 + + + (0x358ae8b5, 0x0f8bacd1) + 369 + + + (0x3f0a3b27, 0x570913d2) + 250 + + + (0x6267b5c5, 0x676e3e42) + 353 + + + + + (0x00002c67, 0x0000333d) + + (0x00000202, 0x000037d1) + 0 + + + (0x0000151d, 0x000049b2) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 295 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 336 + + + (0x6267b5c5, 0x676e3e42) + 560 + + + + + (0x00003c24, 0x00006028) + + (0x0000324c, 0x0000225d) + 1 + + + (0x00000202, 0x000037d1) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 183 + + + (0x358ae8b5, 0x0f8bacd1) + 384 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 544 + + + + + (0x00003da7, 0x00003850) + + (0x0000324c, 0x0000225d) + 1 + + + (0x00006172, 0x00004577) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 183 + + + (0x358ae8b5, 0x0f8bacd1) + 384 + + + (0x3f0a3b27, 0x570913d2) + 250 + + + (0x6267b5c5, 0x676e3e42) + 368 + + + + + (0x000064a1, 0x00002aca) + + (0x0000324c, 0x0000225d) + 2 + + + (0x00006172, 0x00004577) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 183 + + + (0x358ae8b5, 0x0f8bacd1) + 399 + + + (0x3f0a3b27, 0x570913d2) + 250 + + + (0x6267b5c5, 0x676e3e42) + 383 + + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00005e4f, 0x0000778d)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000002a5, 0x00000056)","index":0,"name":"Default tab","parentIdentifier":"(0x00005e4f, 0x0000778d)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00000006, 0x0000559d)","index":0,"name":"Empty","parentIdentifier":"(0x000002a5, 0x00000056)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test-gdf-readwrite-1.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test-gdf-readwrite-1.xml new file mode 100644 index 0000000..44aeef3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test-gdf-readwrite-1.xml @@ -0,0 +1,774 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x000010ee, 0x00000f43) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003e288b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00002a9c, 0x00003199) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 1 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003e2e6b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x00002e97, 0x00004732) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0055a758) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003129, 0x00004d80) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x5ba36127, 0x195feae1) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/output_gdf_signal_1.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000313b, 0x000003b1) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 10 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00530bb1) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x000051d4, 0x00007353) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(2*M_PI*x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0052d6f5) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005f81, 0x00000200) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x>0 ? 1 : -1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004d47d5) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000060ec, 0x00005ffa) + Sign Change Detector + (0x04fa78cd, 0xafe45de7) + + + (0x544a003e, 0x6dcba5f6) + Signal + + + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Sign switch to positive stimulation + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Sign switch to negative stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x007deef9, 0x2f3e95c6) + Channel Index + 1 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0x13bdcd99, 0x9faeff20) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004e4978) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006b47, 0x0000126c) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x169d0f00) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006c41, 0x000069fe) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + (0x5ba36127, 0x195feae1) + Input 3 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0078b3c2) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x0000149c, 0x00004529) + + (0x000051d4, 0x00007353) + 0 + + + (0x000060ec, 0x00005ffa) + 0 + + + + (0x000026a9, 0x00005797) + + (0x000051d4, 0x00007353) + 0 + + + (0x00006c41, 0x000069fe) + 0 + + + + (0x00002c3a, 0x00003a7d) + + (0x000051d4, 0x00007353) + 0 + + + (0x00005f81, 0x00000200) + 0 + + + + (0x00003eca, 0x00007fbf) + + (0x00006c41, 0x000069fe) + 0 + + + (0x00003129, 0x00004d80) + 0 + + + + (0x000043e3, 0x000019b2) + + (0x000010ee, 0x00000f43) + 0 + + + (0x000051d4, 0x00007353) + 0 + + + + (0x00004c38, 0x000032a2) + + (0x00005f81, 0x00000200) + 0 + + + (0x00006c41, 0x000069fe) + 1 + + + + (0x000058da, 0x000053ab) + + (0x0000313b, 0x000003b1) + 0 + + + (0x00002e97, 0x00004732) + 0 + + + + (0x00005960, 0x00007f8c) + + (0x00002a9c, 0x00003199) + 0 + + + (0x00006c41, 0x000069fe) + 2 + + + + (0x00005a5c, 0x00001a5e) + + (0x000060ec, 0x00005ffa) + 0 + + + (0x00003129, 0x00004d80) + 1 + + + + (0x00007b01, 0x00006958) + + (0x000060ec, 0x00005ffa) + 0 + + + (0x00006b47, 0x0000126c) + 0 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x000006d6, 0x000042bc)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006d3f, 0x00004ccb)","index":0,"name":"Default tab","parentIdentifier":"(0x000006d6, 0x000042bc)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000063d3, 0x000044f0)","index":0,"name":"Empty","parentIdentifier":"(0x00006d3f, 0x00004ccb)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test-gdf-readwrite-2.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test-gdf-readwrite-2.xml new file mode 100644 index 0000000..2bc14c4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test-gdf-readwrite-2.xml @@ -0,0 +1,361 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00002949, 0x00002732) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0097c514) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000363b, 0x0000180e) + GDF file writer + (0x1e7b2155, 0x107289ce) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal + + + (0x6f752dd0, 0x082a321e) + Stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].gdf + ${Player_ScenarioDirectory}/output_gdf_combined.gdf + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0xd41e3037, 0xcc12644a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x03a62eec) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000048cb, 0x0000494c) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 5 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00e10619) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005458, 0x00003d39) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/output_gdf_signal_1.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00006b47, 0x0000126c) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a962bf) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00000b3e, 0x000011ac) + + (0x00005458, 0x00003d39) + 1 + + + (0x0000363b, 0x0000180e) + 2 + + + + (0x00001d98, 0x00006812) + + (0x00005458, 0x00003d39) + 0 + + + (0x000048cb, 0x0000494c) + 0 + + + + (0x000048b0, 0x00004413) + + (0x00005458, 0x00003d39) + 1 + + + (0x00006b47, 0x0000126c) + 0 + + + + (0x00005ab1, 0x000027de) + + (0x00005458, 0x00003d39) + 0 + + + (0x0000363b, 0x0000180e) + 1 + + + + (0x00007a18, 0x00002c1a) + + (0x000048cb, 0x0000494c) + 0 + + + (0x00002949, 0x00002732) + 0 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00002156, 0x00001f07)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004621, 0x0000257e)","index":0,"name":"Default tab","parentIdentifier":"(0x00002156, 0x00001f07)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000029d1, 0x0000144d)","index":0,"name":"Empty","parentIdentifier":"(0x00004621, 0x0000257e)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test-gdf-readwrite-3.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test-gdf-readwrite-3.xml new file mode 100644 index 0000000..f19e7c6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test-gdf-readwrite-3.xml @@ -0,0 +1,506 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x000024df, 0x00004773) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0094624f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002b18, 0x00003378) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x5ba36127, 0x195feae1) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/output_gdf_signal_2.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00005721, 0x00005795) + GDF file reader + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/output_gdf_combined.gdf + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 751 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00cbd108) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00005caf, 0x000066ac) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 5 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00d20fdd) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006b47, 0x0000126c) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a1ff06) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000712e, 0x00007cc9) + Stimulation Filter + (0x02f96101, 0x5e647cb8) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x6f752dd0, 0x082a321e) + Modified Stimulations + + + + + (0x09e59e57, 0x8d4a553a) + Default action + Reject + Select + false + + + (0x512a166f, 0x5c3ef83f) + Time range begin + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time range end + 0 + 0 + false + + + (0x09e59e57, 0x8d4a553a) + Action to perform + Select + Reject + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range begin + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation range end + OVTK_StimulationId_Label_0F + OVTK_StimulationId_EndOfFile + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0x47859b3f, 0x1dfdf5cd) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a0f19a) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000445, 0x00001295) + + (0x00005721, 0x00005795) + 1 + + + (0x00002b18, 0x00003378) + 0 + + + + (0x0000110b, 0x000036a4) + + (0x0000712e, 0x00007cc9) + 0 + + + (0x00002b18, 0x00003378) + 1 + + + + (0x00002cd6, 0x000055ea) + + (0x00005721, 0x00005795) + 2 + + + (0x0000712e, 0x00007cc9) + 0 + + + + (0x000031f7, 0x0000295d) + + (0x00005721, 0x00005795) + 2 + + + (0x00006b47, 0x0000126c) + 0 + + + + (0x0000351e, 0x000069e9) + + (0x00005caf, 0x000066ac) + 0 + + + (0x000024df, 0x00004773) + 0 + + + + (0x00006978, 0x00005007) + + (0x00005721, 0x00005795) + 1 + + + (0x00005caf, 0x000066ac) + 0 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x000006d6, 0x000042bc)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006d3f, 0x00004ccb)","index":0,"name":"Default tab","parentIdentifier":"(0x000006d6, 0x000042bc)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000063d3, 0x000044f0)","index":0,"name":"Empty","parentIdentifier":"(0x00006d3f, 0x00004ccb)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test_gdf125.gdf b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test_gdf125.gdf new file mode 100755 index 0000000..85e6d1c Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test_gdf125.gdf differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test_gdf211.gdf b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test_gdf211.gdf new file mode 100755 index 0000000..1f8bb19 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test_gdf211.gdf differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test_gdf221.gdf b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test_gdf221.gdf new file mode 100755 index 0000000..3962040 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test_gdf221.gdf differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test_gdf222.gdf b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test_gdf222.gdf new file mode 100755 index 0000000..fa465f2 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test_gdf222.gdf differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test_gdfX.ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test_gdfX.ref.csv new file mode 100755 index 0000000..b03fac0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/file-io/test/test_gdfX.ref.csv @@ -0,0 +1,9217 @@ +Time:512Hz,Epoch,chan 1,chan 2,chan 3,Event Id,Event Date,Event Duration +0.0000000000,0,1.8410009918,0.9987029831,0.7133592737,,, +0.0019531250,0,1.8425268940,0.9987029831,0.5409323262,,, +0.0039062500,0,1.8440527962,0.9987029831,0.9208819715,,, +0.0058593750,0,1.8455786984,0.9987029831,0.5424582284,,, +0.0078125000,0,1.8471046006,0.9987029831,0.7301441978,,, +0.0097656250,0,1.8486305028,0.9987029831,0.4829480430,,, +0.0117187500,0,1.8501564050,0.9987029831,0.0740062562,,, +0.0136718750,0,1.8516823072,0.9987029831,0.5409323262,,, +0.0156250000,0,1.8532082094,0.9987029831,0.8384832532,,, +0.0175781250,0,1.8547341115,0.9987029831,0.4737926299,,, +0.0195312500,0,1.8562600137,0.9987029831,0.7301441978,,, +0.0214843750,0,1.8577859159,0.9987029831,0.1777676051,,, +0.0234375000,0,1.8593118181,0.9987029831,0.8247501335,,, +0.0253906250,0,1.8593118181,0.9987029831,0.0953688869,,, +0.0273437500,0,1.8608377203,0.9987029831,0.2632181277,,, +0.0292968750,0,1.8623636225,0.9987029831,0.6691081102,,, +0.0312500000,0,1.8638895247,0.9987029831,0.1899748226,,, +0.0332031250,0,1.8654154269,0.9987029831,0.8018616007,,, +0.0351562500,0,1.8669413291,0.9987029831,0.8995193408,,, +0.0371093750,0,1.8684672313,0.9987029831,0.0755321584,,, +0.0390625000,0,1.8699931334,0.9987029831,0.4493781949,,, +0.0410156250,0,1.8715190356,0.9987029831,0.6095979248,,, +0.0429687500,0,1.8730449378,0.9987029831,0.1518272679,,, +0.0449218750,0,1.8745708400,0.9987029831,0.3303578241,,, +0.0468750000,0,1.8760967422,0.9987029831,0.6263828489,,, +0.0488281250,0,1.8760967422,0.9987029831,0.0099183642,,, +0.0507812500,0,1.8776226444,0.9987029831,0.1884489204,,, +0.0527343750,0,1.8791485466,0.9987029831,0.3227283131,,, +0.0546875000,0,1.8806744488,0.9987029831,0.8049134051,,, +0.0566406250,0,1.8822003510,0.9987029831,0.3273060197,,, +0.0585937500,0,1.8837262531,0.9987029831,0.2098115511,,, +0.0605468750,0,1.8852521553,0.9987029831,0.0877393759,,, +0.0625000000,1,1.8867780575,0.9987029831,0.8369573510,,, +0.0644531250,1,1.8867780575,0.9987029831,0.7240405890,,, +0.0664062500,1,1.8883039597,0.9987029831,0.1991302358,,, +0.0683593750,1,1.8898298619,0.9987029831,0.2616922255,,, +0.0703125000,1,1.8913557641,0.9987029831,0.5683985657,,, +0.0722656250,1,1.8928816663,0.9987029831,0.2998397803,,, +0.0742187500,1,1.8944075685,0.9987029831,0.0770580606,,, +0.0761718750,1,1.8944075685,0.9987029831,0.8522163729,,, +0.0781250000,1,1.8959334707,0.9987029831,0.2357518883,,, +0.0800781250,1,1.8974593729,0.9987029831,0.4051270314,,, +0.0820312500,1,1.8989852750,0.9987029831,0.7301441978,,, +0.0839843750,1,1.9005111772,0.9987029831,0.5378805219,,, +0.0859375000,1,1.9020370794,0.9987029831,0.7988097963,,, +0.0878906250,1,1.9020370794,0.9987029831,0.4356450752,,, +0.0898437500,1,1.9035629816,0.9987029831,0.1441977569,,, +0.0917968750,1,1.9050888838,0.9987029831,0.7896543832,,, +0.0937500000,1,1.9066147860,0.9987029831,0.9849698634,,, +0.0957031250,1,1.9066147860,0.9987029831,0.9300373846,,, +0.0976562500,1,1.9081406882,0.9987029831,0.9514000153,,, +0.0996093750,1,1.9096665904,0.9987029831,0.3532463569,,, +0.1015625000,1,1.9111924926,0.9987029831,0.9925993744,,, +0.1035156250,1,1.9127183948,0.9987029831,0.2281223774,,, +0.1054687500,1,1.9127183948,0.9987029831,0.2586404211,,, +0.1074218750,1,1.9142442969,0.9987029831,0.7652399481,,, +0.1093750000,1,1.9157701991,0.9987029831,0.5241474022,,, +0.1113281250,1,1.9172961013,0.9987029831,0.4127565423,,, +0.1132812500,1,1.9172961013,0.9987029831,0.2861066606,,, +0.1152343750,1,1.9188220035,0.9987029831,0.3837644007,,, +0.1171875000,1,1.9203479057,0.9987029831,0.9834439612,,, +0.1191406250,1,1.9203479057,0.9987029831,0.9056229496,,, +0.1210937500,1,1.9218738079,0.9987029831,0.5745021744,,, +0.1230468750,1,1.9233997101,0.9987029831,0.5378805219,,, +0.1250000000,2,1.9249256123,0.9987029831,0.6981002518,,, +0.1269531250,2,1.9249256123,0.9987029831,0.4966811627,,, +0.1289062500,2,1.9264515145,0.9987029831,0.7270923934,,, +0.1308593750,2,1.9279774166,0.9987029831,0.1579308766,,, +0.1328125000,2,1.9279774166,0.9987029831,0.6446936751,,, +0.1347656250,2,1.9295033188,0.9987029831,0.7331960021,,, +0.1367187500,2,1.9310292210,0.9987029831,0.7896543832,,, +0.1386718750,2,1.9310292210,0.9987029831,0.3837644007,,, +0.1406250000,2,1.9325551232,0.9987029831,0.9376668956,,, +0.1425781250,2,1.9340810254,0.9987029831,0.7652399481,,, +0.1445312500,2,1.9340810254,0.9987029831,0.0419623102,,, +0.1464843750,2,1.9356069276,0.9987029831,0.5104142824,,, +0.1484375000,2,1.9371328298,0.9987029831,0.3395132372,,, +0.1503906250,2,1.9371328298,0.9987029831,0.6263828489,,, +0.1523437500,2,1.9386587320,0.9987029831,0.9056229496,,, +0.1542968750,2,1.9401846342,0.9987029831,0.3837644007,,, +0.1562500000,2,1.9401846342,0.9987029831,0.8873121233,,, +0.1582031250,2,1.9417105364,0.9987029831,0.6538490883,,, +0.1601562500,2,1.9417105364,0.9987029831,0.0205996796,,, +0.1621093750,2,1.9432364385,0.9987029831,0.7484550240,,, +0.1640625000,2,1.9447623407,0.9987029831,0.9727626459,,, +0.1660156250,2,1.9447623407,0.9987029831,0.7179369802,,, +0.1679687500,2,1.9462882429,0.9987029831,0.4615854124,,, +0.1699218750,2,1.9462882429,0.9987029831,0.3837644007,,, +0.1718750000,2,1.9478141451,0.9987029831,0.1930266270,,, +0.1738281250,2,1.9493400473,0.9987029831,0.1152056153,,, +0.1757812500,2,1.9493400473,0.9987029831,0.3257801175,,, +0.1777343750,2,1.9508659495,0.9987029831,0.5470359350,,, +0.1796875000,2,1.9508659495,0.9987029831,0.4234378576,,, +0.1816406250,2,1.9523918517,0.9987029831,0.9071488518,,, +0.1835937500,2,1.9523918517,0.9987029831,0.9086747539,,, +0.1855468750,2,1.9539177539,0.9987029831,0.2601663233,,, +0.1875000000,3,1.9554436561,0.9987029831,0.7621881437,,, +0.1894531250,3,1.9554436561,0.9987029831,0.0297550927,,, +0.1914062500,3,1.9569695583,0.9987029831,0.7194628824,,, +0.1933593750,3,1.9569695583,0.9987029831,0.9208819715,,, +0.1953125000,3,1.9584954604,0.9987029831,0.9620813306,,, +0.1972656250,3,1.9584954604,0.9987029831,0.2998397803,,, +0.1992187500,3,1.9600213626,0.9987029831,0.1045243000,,, +0.2011718750,3,1.9600213626,0.9987029831,0.2601663233,,, +0.2031250000,3,1.9615472648,0.9987029831,0.1976043336,,, +0.2050781250,3,1.9615472648,0.9987029831,0.7377737087,,, +0.2070312500,3,1.9630731670,0.9987029831,0.4249637598,,, +0.2089843750,3,1.9630731670,0.9987029831,0.8262760357,,, +0.2109375000,3,1.9645990692,0.9987029831,0.8400091554,,, +0.2128906250,3,1.9645990692,0.9987029831,0.9880216678,,, +0.2148437500,3,1.9661249714,0.9987029831,0.0877393759,,, +0.2167968750,3,1.9661249714,0.9987029831,0.9300373846,,, +0.2187500000,3,1.9676508736,0.9987029831,0.1228351263,,, +0.2207031250,3,1.9676508736,0.9987029831,0.9391927977,,, +0.2226562500,3,1.9691767758,0.9987029831,0.8461127642,,, +0.2246093750,3,1.9691767758,0.9987029831,0.1365682460,,, +0.2265625000,3,1.9707026780,0.9987029831,0.4737926299,,, +0.2285156250,3,1.9707026780,0.9987029831,0.8262760357,,, +0.2304687500,3,1.9707026780,0.9987029831,0.4432745861,,, +0.2324218750,3,1.9722285801,0.9987029831,0.2250705730,,, +0.2343750000,3,1.9722285801,0.9987029831,0.1335164416,,, +0.2363281250,3,1.9737544823,0.9987029831,0.1426718547,,, +0.2382812500,3,1.9737544823,0.9987029831,0.0724803540,,, +0.2402343750,3,1.9737544823,0.9987029831,0.9132524605,,, +0.2421875000,3,1.9752803845,0.9987029831,0.0480659190,,, +0.2441406250,3,1.9752803845,0.9987029831,0.4173342489,,, +0.2460937500,3,1.9768062867,0.9987029831,0.3685053788,,, +0.2480468750,3,1.9768062867,0.9987029831,0.0419623102,,, +0.2500000000,4,1.9768062867,0.9987029831,0.0694285496,,, +0.2519531250,4,1.9783321889,0.9987029831,0.6797894255,,, +0.2539062500,4,1.9783321889,0.9987029831,0.3974975204,,, +0.2558593750,4,1.9798580911,0.9987029831,0.3410391394,,, +0.2578125000,4,1.9798580911,0.9987029831,0.7347219043,,, +0.2597656250,4,1.9798580911,0.9987029831,0.3669794766,,, +0.2617187500,4,1.9813839933,0.9987029831,0.4844739452,,, +0.2636718750,4,1.9813839933,0.9987029831,0.5790798810,,, +0.2656250000,4,1.9813839933,0.9987029831,0.4783703365,,, +0.2675781250,4,1.9829098955,0.9987029831,0.3746089876,,, +0.2695312500,4,1.9829098955,0.9987029831,0.6095979248,,, +0.2714843750,4,1.9829098955,0.9987029831,0.1411459525,,, +0.2734375000,4,1.9844357977,0.9987029831,0.0801098650,,, +0.2753906250,4,1.9844357977,0.9987029831,0.9239337758,,, +0.2773437500,4,1.9844357977,0.9987029831,0.5302510109,,, +0.2792968750,4,1.9859616999,0.9987029831,0.2250705730,,, +0.2812500000,4,1.9859616999,0.9987029831,0.1884489204,,, +0.2832031250,4,1.9859616999,0.9987029831,0.7545586328,,, +0.2851562500,4,1.9874876020,0.9987029831,0.4554818036,,, +0.2871093750,4,1.9874876020,0.9987029831,0.7621881437,,, +0.2890625000,4,1.9874876020,0.9987029831,0.6157015335,,, +0.2910156250,4,1.9874876020,0.9987029831,0.4219119554,,, +0.2929687500,4,1.9890135042,0.9987029831,0.4142824445,,, +0.2949218750,4,1.9890135042,0.9987029831,0.1228351263,,, +0.2968750000,4,1.9890135042,0.9987029831,0.6950484474,,, +0.2988281250,4,1.9890135042,0.9987029831,0.6080720226,,, +0.3007812500,4,1.9905394064,0.9987029831,0.9361409934,,, +0.3027343750,4,1.9905394064,0.9987029831,0.9391927977,,, +0.3046875000,4,1.9905394064,0.9987029831,0.5210955978,,, +0.3066406250,4,1.9905394064,0.9987029831,0.3242542153,,, +0.3085937500,4,1.9920653086,0.9987029831,0.5622949569,,, +0.3105468750,4,1.9920653086,0.9987029831,0.0343327993,,, +0.3125000000,5,1.9920653086,0.9987029831,0.0679026474,,, +0.3144531250,5,1.9920653086,0.9987029831,0.7194628824,,, +0.3164062500,5,1.9935912108,0.9987029831,0.3395132372,,, +0.3183593750,5,1.9935912108,0.9987029831,0.5790798810,,, +0.3203125000,5,1.9935912108,0.9987029831,0.8140688182,,, +0.3222656250,5,1.9935912108,0.9987029831,0.6553749905,,, +0.3242187500,5,1.9935912108,0.9987029831,0.7362478065,,, +0.3261718750,5,1.9951171130,0.9987029831,0.9590295262,,, +0.3281250000,5,1.9951171130,0.9987029831,0.1029983978,,, +0.3300781250,5,1.9951171130,0.9987029831,0.3303578241,,, +0.3320312500,5,1.9951171130,0.9987029831,0.3761348898,,, +0.3339843750,5,1.9951171130,0.9987029831,0.2784771496,,, +0.3359375000,5,1.9951171130,0.9987029831,0.0923170825,,, +0.3378906250,5,1.9966430152,0.9987029831,0.3486686503,,, +0.3398437500,5,1.9966430152,0.9987029831,0.9742885481,,, +0.3417968750,5,1.9966430152,0.9987029831,0.2571145190,,, +0.3437500000,5,1.9966430152,0.9987029831,0.9758144503,,, +0.3457031250,5,1.9966430152,0.9987029831,0.2143892576,,, +0.3476562500,5,1.9966430152,0.9987029831,0.4463263905,,, +0.3496093750,5,1.9966430152,0.9987029831,0.4524299992,,, +0.3515625000,5,1.9966430152,0.9987029831,0.2052338445,,, +0.3535156250,5,1.9981689174,0.9987029831,0.6401159686,,, +0.3554687500,5,1.9981689174,0.9987029831,0.5760280766,,, +0.3574218750,5,1.9981689174,0.9987029831,0.0053406577,,, +0.3593750000,5,1.9981689174,0.9987029831,0.3639276722,,, +0.3613281250,5,1.9981689174,0.9987029831,0.0495918212,,, +0.3632812500,5,1.9981689174,0.9987029831,0.8033875029,,, +0.3652343750,5,1.9981689174,0.9987029831,0.9864957656,,, +0.3671875000,5,1.9981689174,0.9987029831,0.6416418708,,, +0.3691406250,5,1.9981689174,0.9987029831,0.9514000153,,, +0.3710937500,5,1.9981689174,0.9987029831,0.0083924620,,, +0.3730468750,5,1.9981689174,0.9987029831,0.7423514153,,, +0.3750000000,6,1.9981689174,0.9987029831,0.2204928664,,, +0.3769531250,6,1.9981689174,0.9987029831,0.2891584649,,, +0.3789062500,6,1.9996948196,0.9987029831,0.2922102693,,, +0.3808593750,6,1.9996948196,0.9987029831,0.8751049058,,, +0.3828125000,6,1.9996948196,0.9987029831,0.9193560693,,, +0.3847656250,6,1.9996948196,0.9987029831,0.2082856489,,, +0.3867187500,6,1.9996948196,0.9987029831,0.3761348898,,, +0.3886718750,6,1.9996948196,0.9987029831,0.5729762722,,, +0.3906250000,6,1.9996948196,0.9987029831,0.1136797131,,, +0.3925781250,6,1.9996948196,0.9987029831,0.2769512474,,, +0.3945312500,6,1.9996948196,0.9987029831,0.0984206912,,, +0.3964843750,6,1.9996948196,0.9987029831,0.3929198138,,, +0.3984375000,6,1.9996948196,0.9987029831,0.1609826810,,, +0.4003906250,6,1.9996948196,0.9987029831,0.4570077058,,, +0.4023437500,6,1.9996948196,0.9987029831,0.8796826123,,, +0.4042968750,6,1.9996948196,0.9987029831,0.1808194095,,, +0.4062500000,6,1.9996948196,0.9987029831,0.7942320897,,, +0.4082031250,6,1.9996948196,0.9987029831,0.1976043336,,, +0.4101562500,6,1.9996948196,0.9987029831,0.2494850080,,, +0.4121093750,6,1.9981689174,0.9987029831,0.5241474022,,, +0.4140625000,6,1.9981689174,0.9987029831,0.5195696956,,, +0.4160156250,6,1.9981689174,0.9987029831,0.9040970474,,, +0.4179687500,6,1.9981689174,0.9987029831,0.8033875029,,, +0.4199218750,6,1.9981689174,0.9987029831,0.3028915846,,, +0.4218750000,6,1.9981689174,0.9987029831,0.7820248722,,, +0.4238281250,6,1.9981689174,0.9987029831,0.4264896620,,, +0.4257812500,6,1.9981689174,0.9987029831,0.4432745861,,, +0.4277343750,6,1.9981689174,0.9987029831,0.1075761044,,, +0.4296875000,6,1.9981689174,0.9987029831,0.3150988022,,, +0.4316406250,6,1.9981689174,0.9987029831,0.0358587015,,, +0.4335937500,6,1.9981689174,0.9987029831,0.0648508431,,, +0.4355468750,6,1.9981689174,0.9987029831,0.9407186999,,, +0.4375000000,7,1.9966430152,0.9987029831,0.5577172503,,, +0.4394531250,7,1.9966430152,0.9987029831,0.2357518883,,, +0.4414062500,7,1.9966430152,0.9987029831,0.9514000153,,, +0.4433593750,7,1.9966430152,0.9987029831,0.9269855802,,, +0.4453125000,7,1.9966430152,0.9987029831,0.9544518196,,, +0.4472656250,7,1.9966430152,0.9987029831,0.6538490883,,, +0.4492187500,7,1.9966430152,0.9987029831,0.3547722591,,, +0.4511718750,7,1.9951171130,0.9987029831,0.6950484474,,, +0.4531250000,7,1.9951171130,0.9987029831,0.4448004883,,, +0.4550781250,7,1.9951171130,0.9987029831,0.5912870985,,, +0.4570312500,7,1.9951171130,0.9987029831,0.0953688869,,, +0.4589843750,7,1.9951171130,0.9987029831,0.0022888533,,, +0.4609375000,7,1.9951171130,0.9987029831,0.2067597467,,, +0.4628906250,7,1.9935912108,0.9987029831,0.0801098650,,, +0.4648437500,7,1.9935912108,0.9987029831,0.8369573510,,, +0.4667968750,7,1.9935912108,0.9987029831,0.9376668956,,, +0.4687500000,7,1.9935912108,0.9987029831,0.7743953613,,, +0.4707031250,7,1.9935912108,0.9987029831,0.6919966430,,, +0.4726562500,7,1.9920653086,0.9987029831,0.9514000153,,, +0.4746093750,7,1.9920653086,0.9987029831,0.1197833219,,, +0.4765625000,7,1.9920653086,0.9987029831,0.8537422751,,, +0.4785156250,7,1.9920653086,0.9987029831,0.8720531014,,, +0.4804687500,7,1.9920653086,0.9987029831,0.5561913481,,, +0.4824218750,7,1.9905394064,0.9987029831,0.3807125963,,, +0.4843750000,7,1.9905394064,0.9987029831,0.4264896620,,, +0.4863281250,7,1.9905394064,0.9987029831,0.1670862898,,, +0.4882812500,7,1.9905394064,0.9987029831,0.2037079423,,, +0.4902343750,7,1.9890135042,0.9987029831,0.8827344167,,, +0.4921875000,7,1.9890135042,0.9987029831,0.0984206912,,, +0.4941406250,7,1.9890135042,0.9987029831,0.0846875715,,, +0.4960937500,7,1.9890135042,0.9987029831,0.2616922255,,, +0.4980468750,7,1.9874876020,0.9987029831,0.5561913481,,, +0.5000000000,8,1.9874876020,0.9987029831,0.9514000153,,, +0.5019531250,8,1.9874876020,0.9987029831,0.1686121920,,, +0.5039062500,8,1.9859616999,0.9987029831,0.4051270314,,, +0.5058593750,8,1.9859616999,0.9987029831,0.1533531701,,, +0.5078125000,8,1.9859616999,0.9987029831,0.7194628824,,, +0.5097656250,8,1.9859616999,0.9987029831,0.3913939117,,, +0.5117187500,8,1.9844357977,0.9987029831,0.4493781949,,, +0.5136718750,8,1.9844357977,0.9987029831,0.8171206226,,, +0.5156250000,8,1.9844357977,0.9987029831,0.5607690547,,, +0.5175781250,8,1.9829098955,0.9987029831,0.7789730678,,, +0.5195312500,8,1.9829098955,0.9987029831,0.4051270314,,, +0.5214843750,8,1.9829098955,0.9987029831,0.8552681773,,, +0.5234375000,8,1.9813839933,0.9987029831,0.1106279088,,, +0.5253906250,8,1.9813839933,0.9987029831,0.3776607919,,, +0.5273437500,8,1.9813839933,0.9987029831,0.2693217365,,, +0.5292968750,8,1.9798580911,0.9987029831,0.1777676051,,, +0.5312500000,8,1.9798580911,0.9987029831,0.6477454795,,, +0.5332031250,8,1.9783321889,0.9987029831,0.6904707408,,, +0.5351562500,8,1.9783321889,0.9987029831,0.2403295949,,, +0.5371093750,8,1.9783321889,0.9987029831,0.6782635233,,, +0.5390625000,8,1.9768062867,0.9987029831,0.9712367437,,, +0.5410156250,8,1.9768062867,0.9987029831,0.7331960021,,, +0.5429687500,8,1.9768062867,0.9987029831,0.9010452430,,, +0.5449218750,8,1.9752803845,0.9987029831,0.3074692912,,, +0.5468750000,8,1.9752803845,0.9987029831,0.1197833219,,, +0.5488281250,8,1.9737544823,0.9987029831,0.3913939117,,, +0.5507812500,8,1.9737544823,0.9987029831,0.6202792401,,, +0.5527343750,8,1.9722285801,0.9987029831,0.1991302358,,, +0.5546875000,8,1.9722285801,0.9987029831,0.3196765087,,, +0.5566406250,8,1.9722285801,0.9987029831,0.3517204547,,, +0.5585937500,8,1.9707026780,0.9987029831,0.8476386664,,, +0.5605468750,8,1.9707026780,0.9987029831,0.1243610285,,, +0.5625000000,9,1.9691767758,0.9987029831,0.3944457160,,, +0.5644531250,9,1.9691767758,0.9987029831,0.3669794766,,, +0.5664062500,9,1.9676508736,0.9987029831,0.1411459525,,, +0.5683593750,9,1.9676508736,0.9987029831,0.4631113146,,, +0.5703125000,9,1.9661249714,0.9987029831,0.9056229496,,, +0.5722656250,9,1.9661249714,0.9987029831,0.5027847715,,, +0.5742187500,9,1.9661249714,0.9987029831,0.5760280766,,, +0.5761718750,9,1.9645990692,0.9987029831,0.9422446021,,, +0.5781250000,9,1.9645990692,0.9987029831,0.0358587015,,, +0.5800781250,9,1.9630731670,0.9987029831,0.4432745861,,, +0.5820312500,9,1.9630731670,0.9987029831,0.1960784314,,, +0.5839843750,9,1.9615472648,0.9987029831,0.8705271992,,, +0.5859375000,9,1.9615472648,0.9987029831,0.6569008927,,, +0.5878906250,9,1.9600213626,0.9987029831,0.7270923934,,, +0.5898437500,9,1.9600213626,0.9987029831,0.2769512474,,, +0.5917968750,9,1.9584954604,0.9987029831,0.1243610285,,, +0.5937500000,9,1.9569695583,0.9987029831,0.6233310445,,, +0.5957031250,9,1.9569695583,0.9987029831,0.5455100328,,, +0.5976562500,9,1.9554436561,0.9987029831,0.8476386664,,, +0.5996093750,9,1.9554436561,0.9987029831,0.9147783627,,, +0.6015625000,9,1.9539177539,0.9987029831,0.5363546197,,, +0.6035156250,9,1.9539177539,0.9987029831,0.8171206226,,, +0.6054687500,9,1.9523918517,0.9987029831,0.3669794766,,, +0.6074218750,9,1.9523918517,0.9987029831,0.9895475700,,, +0.6093750000,9,1.9508659495,0.9987029831,0.1594567788,,, +0.6113281250,9,1.9508659495,0.9987029831,0.5409323262,,, +0.6132812500,9,1.9493400473,0.9987029831,0.5470359350,,, +0.6152343750,9,1.9478141451,0.9987029831,0.9483482109,,, +0.6171875000,9,1.9478141451,0.9987029831,0.8674753948,,, +0.6191406250,9,1.9462882429,0.9987029831,0.6324864576,,, +0.6210937500,9,1.9462882429,0.9987029831,0.9361409934,,, +0.6230468750,9,1.9447623407,0.9987029831,0.1441977569,,, +0.6250000000,10,1.9432364385,0.9987029831,0.8339055467,,, +0.6269531250,10,1.9432364385,0.9987029831,0.3913939117,,, +0.6289062500,10,1.9417105364,0.9987029831,0.9178301671,,, +0.6308593750,10,1.9417105364,0.9987029831,0.6248569467,,, +0.6328125000,10,1.9401846342,0.9987029831,0.9514000153,,, +0.6347656250,10,1.9386587320,0.9987029831,0.7560845350,,, +0.6367187500,10,1.9386587320,0.9987029831,0.7789730678,,, +0.6386718750,10,1.9371328298,0.9987029831,0.4448004883,,, +0.6406250000,10,1.9356069276,0.9987029831,0.1716639963,,, +0.6425781250,10,1.9356069276,0.9987029831,0.3913939117,,, +0.6445312500,10,1.9340810254,0.9987029831,0.9849698634,,, +0.6464843750,10,1.9325551232,0.9987029831,0.7408255131,,, +0.6484375000,10,1.9325551232,0.9987029831,0.8400091554,,, +0.6503906250,10,1.9310292210,0.9987029831,0.0572213321,,, +0.6523437500,10,1.9295033188,0.9987029831,0.6492713817,,, +0.6542968750,10,1.9295033188,0.9987029831,0.2296482795,,, +0.6562500000,10,1.9279774166,0.9987029831,0.6981002518,,, +0.6582031250,10,1.9264515145,0.9987029831,0.8918898299,,, +0.6601562500,10,1.9264515145,0.9987029831,0.3624017700,,, +0.6621093750,10,1.9249256123,0.9987029831,0.5149919890,,, +0.6640625000,10,1.9233997101,0.9987029831,0.7209887846,,, +0.6660156250,10,1.9233997101,0.9987029831,0.6080720226,,, +0.6679687500,10,1.9218738079,0.9987029831,0.7469291218,,, +0.6699218750,10,1.9203479057,0.9987029831,0.1884489204,,, +0.6718750000,10,1.9188220035,0.9987029831,0.6385900664,,, +0.6738281250,10,1.9188220035,0.9987029831,0.4859998474,,, +0.6757812500,10,1.9172961013,0.9987029831,0.2647440299,,, +0.6777343750,10,1.9157701991,0.9987029831,0.2937361715,,, +0.6796875000,10,1.9142442969,0.9987029831,0.6401159686,,, +0.6816406250,10,1.9142442969,0.9987029831,0.9529259174,,, +0.6835937500,10,1.9127183948,0.9987029831,0.4966811627,,, +0.6855468750,10,1.9111924926,0.9987029831,0.5180437934,,, +0.6875000000,11,1.9096665904,0.9987029831,0.6874189364,,, +0.6894531250,11,1.9096665904,0.9987029831,0.2433813993,,, +0.6914062500,11,1.9081406882,0.9987029831,0.2449073014,,, +0.6933593750,11,1.9066147860,0.9987029831,0.5333028153,,, +0.6953125000,11,1.9050888838,0.9987029831,0.1213092241,,, +0.6972656250,11,1.9050888838,0.9987029831,0.8995193408,,, +0.6992187500,11,1.9035629816,0.9987029831,0.6813153277,,, +0.7011718750,11,1.9020370794,0.9987029831,0.0633249409,,, +0.7031250000,11,1.9005111772,0.9987029831,0.7545586328,,, +0.7050781250,11,1.8989852750,0.9987029831,0.5485618372,,, +0.7070312500,11,1.8989852750,0.9987029831,0.9956511788,,, +0.7089843750,11,1.8974593729,0.9987029831,0.2204928664,,, +0.7109375000,11,1.8959334707,0.9987029831,0.7164110780,,, +0.7128906250,11,1.8944075685,0.9987029831,0.4356450752,,, +0.7148437500,11,1.8928816663,0.9987029831,0.0938429847,,, +0.7167968750,11,1.8913557641,0.9987029831,0.7728694591,,, +0.7187500000,11,1.8913557641,0.9987029831,0.8339055467,,, +0.7207031250,11,1.8898298619,0.9987029831,0.3913939117,,, +0.7226562500,11,1.8883039597,0.9987029831,0.9239337758,,, +0.7246093750,11,1.8867780575,0.9987029831,0.3028915846,,, +0.7265625000,11,1.8852521553,0.9987029831,0.8857862211,,, +0.7285156250,11,1.8837262531,0.9987029831,0.5775539788,,, +0.7304687500,11,1.8822003510,0.9987029831,0.6736858167,,, +0.7324218750,11,1.8822003510,0.9987029831,0.0160219730,,, +0.7343750000,11,1.8806744488,0.9987029831,0.6355382620,,, +0.7363281250,11,1.8791485466,0.9987029831,0.5836575875,,, +0.7382812500,11,1.8776226444,0.9987029831,0.4631113146,,, +0.7402343750,11,1.8760967422,0.9987029831,0.0007629511,,, +0.7421875000,11,1.8745708400,0.9987029831,0.5683985657,,, +0.7441406250,11,1.8730449378,0.9987029831,0.6492713817,,, +0.7460937500,11,1.8715190356,0.9987029831,0.5561913481,,, +0.7480468750,11,1.8699931334,0.9987029831,0.0846875715,,, +0.7500000000,12,1.8699931334,0.9987029831,0.1411459525,,, +0.7519531250,12,1.8684672313,0.9987029831,0.6416418708,,, +0.7539062500,12,1.8669413291,0.9987029831,0.2189669642,,, +0.7558593750,12,1.8654154269,0.9987029831,0.7972838941,,, +0.7578125000,12,1.8638895247,0.9987029831,0.9819180591,,, +0.7597656250,12,1.8623636225,0.9987029831,0.8979934386,,, +0.7617187500,12,1.8608377203,0.9987029831,0.2769512474,,, +0.7636718750,12,1.8593118181,0.9987029831,0.2601663233,,, +0.7656250000,12,1.8577859159,0.9987029831,0.5424582284,,, +0.7675781250,12,1.8562600137,0.9987029831,0.2906843671,,, +0.7695312500,12,1.8547341115,0.9987029831,0.3456168460,,, +0.7714843750,12,1.8532082094,0.9987029831,0.5012588693,,, +0.7734375000,12,1.8516823072,0.9987029831,0.8247501335,,, +0.7753906250,12,1.8501564050,0.9987029831,0.7835507744,,, +0.7773437500,12,1.8486305028,0.9987029831,0.7682917525,,, +0.7792968750,12,1.8471046006,0.9987029831,0.2906843671,,, +0.7812500000,12,1.8455786984,0.9987029831,0.2281223774,,, +0.7832031250,12,1.8440527962,0.9987029831,0.1472495613,,, +0.7851562500,12,1.8425268940,0.9987029831,0.5165178912,,, +0.7871093750,12,1.8410009918,0.9987029831,0.0419623102,,, +0.7890625000,12,1.8394750896,0.9987029831,0.0282291905,,, +0.7910156250,12,1.8379491875,0.9987029831,0.1319905394,,, +0.7929687500,12,1.8364232853,0.9987029831,0.1213092241,,, +0.7949218750,12,1.8348973831,0.9987029831,0.6599526970,,, +0.7968750000,12,1.8333714809,0.9987029831,0.0267032883,,, +0.7988281250,12,1.8318455787,0.9987029831,0.7118333715,,, +0.8007812500,12,1.8303196765,0.9987029831,0.4051270314,,, +0.8027343750,12,1.8287937743,0.9987029831,0.5745021744,,, +0.8046875000,12,1.8272678721,0.9987029831,0.1899748226,,, +0.8066406250,12,1.8257419699,0.9987029831,0.9071488518,,, +0.8085937500,12,1.8242160678,0.9987029831,0.2479591058,,, +0.8105468750,12,1.8226901656,0.9987029831,0.9666590372,,, +0.8125000000,13,1.8211642634,0.9987029831,0.0114442664,,, +0.8144531250,13,1.8196383612,0.9987029831,0.9681849393,,, +0.8164062500,13,1.8181124590,0.9987029831,0.0617990387,,, +0.8183593750,13,1.8165865568,0.9987029831,0.1503013657,,, +0.8203125000,13,1.8150606546,0.9987029831,0.1304646372,,, +0.8222656250,13,1.8135347524,0.9987029831,0.8323796445,,, +0.8242187500,13,1.8120088502,0.9987029831,0.8567940795,,, +0.8261718750,13,1.8089570459,0.9987029831,0.2098115511,,, +0.8281250000,13,1.8074311437,0.9987029831,0.0587472343,,, +0.8300781250,13,1.8059052415,0.9987029831,0.3776607919,,, +0.8320312500,13,1.8043793393,0.9987029831,0.8201724269,,, +0.8339843750,13,1.8028534371,0.9987029831,0.5760280766,,, +0.8359375000,13,1.8013275349,0.9987029831,0.8903639277,,, +0.8378906250,13,1.7998016327,0.9987029831,0.2800030518,,, +0.8398437500,13,1.7982757305,0.9987029831,0.5210955978,,, +0.8417968750,13,1.7967498283,0.9987029831,0.3883421073,,, +0.8437500000,13,1.7952239261,0.9987029831,0.7133592737,,, +0.8457031250,13,1.7921721218,0.9987029831,0.2830548562,,, +0.8476562500,13,1.7906462196,0.9987029831,0.1167315175,,, +0.8496093750,13,1.7891203174,0.9987029831,0.8659494926,,, +0.8515625000,13,1.7875944152,0.9987029831,0.4722667277,,, +0.8535156250,13,1.7860685130,0.9987029831,0.3105210956,,, +0.8554687500,13,1.7845426108,0.9987029831,0.2952620737,,, +0.8574218750,13,1.7830167086,0.9987029831,0.5882352941,,, +0.8593750000,13,1.7799649042,0.9987029831,0.8735790036,,, +0.8613281250,13,1.7784390021,0.9987029831,0.9102006561,,, +0.8632812500,13,1.7769130999,0.9987029831,0.8949416342,,, +0.8652343750,13,1.7753871977,0.9987029831,0.8873121233,,, +0.8671875000,13,1.7738612955,0.9987029831,0.5226215000,,, +0.8691406250,13,1.7723353933,0.9987029831,0.9071488518,,, +0.8710937500,13,1.7692835889,0.9987029831,0.6965743496,,, +0.8730468750,13,1.7677576867,0.9987029831,0.9132524605,,, +0.8750000000,14,1.7662317845,0.9987029831,0.6080720226,,, +0.8769531250,14,1.7647058824,0.9987029831,0.9483482109,,, +0.8789062500,14,1.7631799802,0.9987029831,0.4844739452,,, +0.8808593750,14,1.7601281758,0.9987029831,0.5699244678,,, +0.8828125000,14,1.7586022736,0.9987029831,0.0663767453,,, +0.8847656250,14,1.7570763714,0.9987029831,0.8827344167,,, +0.8867187500,14,1.7555504692,0.9987029831,0.1152056153,,, +0.8886718750,14,1.7540245670,0.9987029831,0.7850766766,,, +0.8906250000,14,1.7509727626,0.9987029831,0.3318837263,,, +0.8925781250,14,1.7494468605,0.9987029831,0.8827344167,,, +0.8945312500,14,1.7479209583,0.9987029831,0.7866025788,,, +0.8964843750,14,1.7463950561,0.9987029831,0.2052338445,,, +0.8984375000,14,1.7433432517,0.9987029831,0.9590295262,,, +0.9003906250,14,1.7418173495,0.9987029831,0.0450141146,,, +0.9023437500,14,1.7402914473,0.9987029831,0.7835507744,,, +0.9042968750,14,1.7387655451,0.9987029831,0.6294346532,,, +0.9062500000,14,1.7357137407,0.9987029831,0.6034943160,,, +0.9082031250,14,1.7341878386,0.9987029831,0.7972838941,,, +0.9101562500,14,1.7326619364,0.9987029831,0.5333028153,,, +0.9121093750,14,1.7311360342,0.9987029831,0.7240405890,,, +0.9140625000,14,1.7280842298,0.9987029831,0.0953688869,,, +0.9160156250,14,1.7265583276,0.9987029831,0.7133592737,,, +0.9179687500,14,1.7250324254,0.9987029831,0.5897611963,,, +0.9199218750,14,1.7235065232,0.9987029831,0.4524299992,,, +0.9218750000,14,1.7204547189,0.9987029831,0.1976043336,,, +0.9238281250,14,1.7189288167,0.9987029831,0.2265964752,,, +0.9257812500,14,1.7174029145,0.9987029831,0.4890516518,,, +0.9277343750,14,1.7143511101,0.9987029831,0.8796826123,,, +0.9296875000,14,1.7128252079,0.9987029831,0.1075761044,,, +0.9316406250,14,1.7112993057,0.9987029831,0.6309605554,,, +0.9335937500,14,1.7097734035,0.9987029831,0.3639276722,,, +0.9355468750,14,1.7067215991,0.9987029831,0.5134660868,,, +0.9375000000,15,1.7051956970,0.9987029831,0.1136797131,,, +0.9394531250,15,1.7036697948,0.9987029831,0.7774471656,,, +0.9414062500,15,1.7006179904,0.9987029831,0.5851834897,,, +0.9433593750,15,1.6990920882,0.9987029831,0.9437705043,,, +0.9453125000,15,1.6975661860,0.9987029831,0.9514000153,,, +0.9472656250,15,1.6945143816,0.9987029831,0.7316700999,,, +0.9492187500,15,1.6929884794,0.9987029831,0.2861066606,,, +0.9511718750,15,1.6914625772,0.9987029831,0.2861066606,,, +0.9531250000,15,1.6884107729,0.9987029831,0.7408255131,,, +0.9550781250,15,1.6868848707,0.9987029831,0.6523231861,,, +0.9570312500,15,1.6853589685,0.9987029831,0.0297550927,,, +0.9589843750,15,1.6823071641,0.9987029831,0.1747158007,,, +0.9609375000,15,1.6807812619,0.9987029831,0.1152056153,,, +0.9628906250,15,1.6792553597,0.9987029831,0.0648508431,,, +0.9648437500,15,1.6762035554,0.9987029831,0.8247501335,,, +0.9667968750,15,1.6746776532,0.9987029831,0.3471427481,,, +0.9687500000,15,1.6716258488,0.9987029831,0.9544518196,,, +0.9707031250,15,1.6700999466,0.9987029831,0.8079652094,,, +0.9726562500,15,1.6685740444,0.9987029831,0.6431677729,,, +0.9746093750,15,1.6655222400,0.9987029831,0.5989166094,,, +0.9765625000,15,1.6639963378,0.9987029831,0.8720531014,,, +0.9785156250,15,1.6624704356,0.9987029831,0.9178301671,,, +0.9804687500,15,1.6594186313,0.9987029831,0.4844739452,,, +0.9824218750,15,1.6578927291,0.9987029831,0.8232242313,,, +0.9843750000,15,1.6548409247,0.9987029831,0.6202792401,,, +0.9863281250,15,1.6533150225,0.9987029831,0.5378805219,,, +0.9882812500,15,1.6517891203,0.9987029831,0.6385900664,,, +0.9902343750,15,1.6487373159,0.9987029831,0.5775539788,,, +0.9921875000,15,1.6472114137,0.9987029831,0.3456168460,,, +0.9941406250,15,1.6441596094,0.9987029831,0.2174410620,,, +0.9960937500,15,1.6426337072,0.9987029831,0.3318837263,,, +0.9980468750,15,1.6395819028,0.9987029831,0.9178301671,,, +1.0000000000,16,1.6380560006,0.9987029831,0.4264896620,,, +1.0019531250,16,1.6365300984,0.9987029831,0.2250705730,,, +1.0039062500,16,1.6334782940,0.9987029831,0.0831616693,,, +1.0058593750,16,1.6319523919,0.9987029831,0.4036011292,,, +1.0078125000,16,1.6289005875,0.9987029831,0.1472495613,,, +1.0097656250,16,1.6273746853,0.9987029831,0.7576104372,,, +1.0117187500,16,1.6243228809,0.9987029831,0.0053406577,,, +1.0136718750,16,1.6227969787,0.9987029831,0.5699244678,,, +1.0156250000,16,1.6212710765,0.9987029831,0.2433813993,,, +1.0175781250,16,1.6182192721,0.9987029831,0.5165178912,,, +1.0195312500,16,1.6166933700,0.9987029831,0.7835507744,,, +1.0214843750,16,1.6136415656,0.9987029831,0.1152056153,,, +1.0234375000,16,1.6121156634,0.9987029831,0.9422446021,,, +1.0253906250,16,1.6090638590,0.9987029831,0.3868162051,,, +1.0273437500,16,1.6075379568,0.9987029831,0.5912870985,,, +1.0292968750,16,1.6044861524,0.9987029831,0.7774471656,,, +1.0312500000,16,1.6029602502,0.9987029831,0.2357518883,,, +1.0332031250,16,1.5999084459,0.9987029831,0.6279087510,,, +1.0351562500,16,1.5983825437,0.9987029831,0.4524299992,,, +1.0371093750,16,1.5953307393,0.9987029831,0.4158083467,,, +1.0390625000,16,1.5938048371,0.9987029831,0.0434882124,,, +1.0410156250,16,1.5907530327,0.9987029831,0.9636072328,,, +1.0429687500,16,1.5892271305,0.9987029831,0.2037079423,,, +1.0449218750,16,1.5861753262,0.9987029831,0.9971770809,,, +1.0468750000,16,1.5846494240,0.9987029831,0.7896543832,,, +1.0488281250,16,1.5815976196,0.9987029831,0.3273060197,,, +1.0507812500,16,1.5800717174,0.9987029831,0.4615854124,,, +1.0527343750,16,1.5770199130,0.9987029831,0.9849698634,,, +1.0546875000,16,1.5754940108,0.9987029831,0.1213092241,,, +1.0566406250,16,1.5724422065,0.9987029831,0.1823453117,,, +1.0585937500,16,1.5709163043,0.9987029831,0.1213092241,,, +1.0605468750,16,1.5678644999,0.9987029831,0.9193560693,,, +1.0625000000,17,1.5663385977,0.9987029831,0.0923170825,,, +1.0644531250,17,1.5632867933,0.9987029831,0.3135729000,,, +1.0664062500,17,1.5617608911,0.9987029831,0.1915007248,,, +1.0683593750,17,1.5587090867,0.9987029831,0.5394064240,,, +1.0703125000,17,1.5571831846,0.9987029831,0.6477454795,,, +1.0722656250,17,1.5541313802,0.9987029831,0.8903639277,,, +1.0742187500,17,1.5526054780,0.9987029831,0.4097047379,,, +1.0761718750,17,1.5495536736,0.9987029831,0.9514000153,,, +1.0781250000,17,1.5465018692,0.9987029831,0.6401159686,,, +1.0800781250,17,1.5449759670,0.9987029831,0.9529259174,,, +1.0820312500,17,1.5419241627,0.9987029831,0.1029983978,,, +1.0839843750,17,1.5403982605,0.9987029831,0.7316700999,,, +1.0859375000,17,1.5373464561,0.9987029831,0.0526436255,,, +1.0878906250,17,1.5358205539,0.9987029831,0.1792935073,,, +1.0898437500,17,1.5327687495,0.9987029831,0.1762417029,,, +1.0917968750,17,1.5312428473,0.9987029831,0.3074692912,,, +1.0937500000,17,1.5281910430,0.9987029831,0.3883421073,,, +1.0957031250,17,1.5251392386,0.9987029831,0.8903639277,,, +1.0976562500,17,1.5236133364,0.9987029831,0.1152056153,,, +1.0996093750,17,1.5205615320,0.9987029831,0.1106279088,,, +1.1015625000,17,1.5190356298,0.9987029831,0.4478522927,,, +1.1035156250,17,1.5159838254,0.9987029831,0.9849698634,,, +1.1054687500,17,1.5129320211,0.9987029831,0.2571145190,,, +1.1074218750,17,1.5114061189,0.9987029831,0.6462195773,,, +1.1093750000,17,1.5083543145,0.9987029831,0.0068665599,,, +1.1113281250,17,1.5068284123,0.9987029831,0.5973907073,,, +1.1132812500,17,1.5037766079,0.9987029831,0.6507972839,,, +1.1152343750,17,1.5007248035,0.9987029831,0.0022888533,,, +1.1171875000,17,1.4991989014,0.9987029831,0.7637140459,,, +1.1191406250,17,1.4961470970,0.9987029831,0.6538490883,,, +1.1210937500,17,1.4946211948,0.9987029831,0.8140688182,,, +1.1230468750,17,1.4915693904,0.9987029831,0.7057297627,,, +1.1250000000,18,1.4885175860,0.9987029831,0.8415350576,,, +1.1269531250,18,1.4869916838,0.9987029831,0.8049134051,,, +1.1289062500,18,1.4839398795,0.9987029831,0.8430609598,,, +1.1308593750,18,1.4824139773,0.9987029831,0.5424582284,,, +1.1328125000,18,1.4793621729,0.9987029831,0.9163042649,,, +1.1347656250,18,1.4763103685,0.9987029831,0.6569008927,,, +1.1367187500,18,1.4747844663,0.9987029831,0.4798962387,,, +1.1386718750,18,1.4717326619,0.9987029831,0.2571145190,,, +1.1406250000,18,1.4686808576,0.9987029831,0.0831616693,,, +1.1425781250,18,1.4671549554,0.9987029831,0.6157015335,,, +1.1445312500,18,1.4641031510,0.9987029831,0.3929198138,,, +1.1464843750,18,1.4610513466,0.9987029831,0.8049134051,,, +1.1484375000,18,1.4595254444,0.9987029831,0.0144960708,,, +1.1503906250,18,1.4564736400,0.9987029831,0.8964675364,,, +1.1523437500,18,1.4549477379,0.9987029831,0.0892652781,,, +1.1542968750,18,1.4518959335,0.9987029831,0.8125429160,,, +1.1562500000,18,1.4488441291,0.9987029831,0.5409323262,,, +1.1582031250,18,1.4473182269,0.9987029831,0.0984206912,,, +1.1601562500,18,1.4442664225,0.9987029831,0.8567940795,,, +1.1621093750,18,1.4412146181,0.9987029831,0.4234378576,,, +1.1640625000,18,1.4396887160,0.9987029831,0.3547722591,,, +1.1660156250,18,1.4366369116,0.9987029831,0.5119401846,,, +1.1679687500,18,1.4335851072,0.9987029831,0.4814221408,,, +1.1699218750,18,1.4320592050,0.9987029831,0.4448004883,,, +1.1718750000,18,1.4290074006,0.9987029831,0.7423514153,,, +1.1738281250,18,1.4259555962,0.9987029831,0.3654535744,,, +1.1757812500,18,1.4244296941,0.9987029831,0.6034943160,,, +1.1777343750,18,1.4213778897,0.9987029831,0.9605554284,,, +1.1796875000,18,1.4183260853,0.9987029831,0.3150988022,,, +1.1816406250,18,1.4168001831,0.9987029831,0.1609826810,,, +1.1835937500,18,1.4137483787,0.9987029831,0.3593499657,,, +1.1855468750,18,1.4106965743,0.9987029831,0.8308537423,,, +1.1875000000,19,1.4076447700,0.9987029831,0.3578240635,,, +1.1894531250,19,1.4061188678,0.9987029831,0.6248569467,,, +1.1914062500,19,1.4030670634,0.9987029831,0.7072556649,,, +1.1933593750,19,1.4000152590,0.9987029831,0.0083924620,,, +1.1953125000,19,1.3984893568,0.9987029831,0.7240405890,,, +1.1972656250,19,1.3954375525,0.9987029831,0.6095979248,,, +1.1992187500,19,1.3923857481,0.9987029831,0.0938429847,,, +1.2011718750,19,1.3908598459,0.9987029831,0.3730830854,,, +1.2031250000,19,1.3878080415,0.9987029831,0.2128633555,,, +1.2050781250,19,1.3847562371,0.9987029831,0.7377737087,,, +1.2070312500,19,1.3817044327,0.9987029831,0.6981002518,,, +1.2089843750,19,1.3801785306,0.9987029831,0.3044174868,,, +1.2109375000,19,1.3771267262,0.9987029831,0.4844739452,,, +1.2128906250,19,1.3740749218,0.9987029831,0.2357518883,,, +1.2148437500,19,1.3725490196,0.9987029831,0.6752117189,,, +1.2167968750,19,1.3694972152,0.9987029831,0.8354314488,,, +1.2187500000,19,1.3664454108,0.9987029831,0.9849698634,,, +1.2207031250,19,1.3633936065,0.9987029831,0.0114442664,,, +1.2226562500,19,1.3618677043,0.9987029831,0.2296482795,,, +1.2246093750,19,1.3588158999,0.9987029831,0.1197833219,,, +1.2265625000,19,1.3557640955,0.9987029831,0.2738994430,,, +1.2285156250,19,1.3527122911,0.9987029831,0.0114442664,,, +1.2304687500,19,1.3511863890,0.9987029831,0.9803921569,,, +1.2324218750,19,1.3481345846,0.9987029831,0.9056229496,,, +1.2343750000,19,1.3450827802,0.9987029831,0.6645304036,,, +1.2363281250,19,1.3435568780,0.9987029831,0.4203860533,,, +1.2382812500,19,1.3405050736,0.9987029831,0.5851834897,,, +1.2402343750,19,1.3374532692,0.9987029831,0.7301441978,,, +1.2421875000,19,1.3344014649,0.9987029831,0.5317769131,,, +1.2441406250,19,1.3328755627,0.9987029831,0.1991302358,,, +1.2460937500,19,1.3298237583,0.9987029831,0.0923170825,,, +1.2480468750,19,1.3267719539,0.9987029831,0.6614785992,,, +1.2500000000,20,1.3237201495,0.9987029831,0.4524299992,,, +1.2519531250,20,1.3221942473,0.9987029831,0.8598458839,,, +1.2539062500,20,1.3191424430,0.9987029831,0.7804989700,,, +1.2558593750,20,1.3160906386,0.9987029831,0.0083924620,,, +1.2578125000,20,1.3130388342,0.9987029831,0.2174410620,,, +1.2597656250,20,1.3115129320,0.9987029831,0.3730830854,,, +1.2617187500,20,1.3084611276,0.9987029831,0.7972838941,,, +1.2636718750,20,1.3054093233,0.9987029831,0.1869230182,,, +1.2656250000,20,1.3023575189,0.9987029831,0.1167315175,,, +1.2675781250,20,1.2993057145,0.9987029831,0.3913939117,,, +1.2695312500,20,1.2977798123,0.9987029831,0.3044174868,,, +1.2714843750,20,1.2947280079,0.9987029831,0.6935225452,,, +1.2734375000,20,1.2916762036,0.9987029831,0.6752117189,,, +1.2753906250,20,1.2886243992,0.9987029831,0.3318837263,,, +1.2773437500,20,1.2870984970,0.9987029831,0.2037079423,,, +1.2792968750,20,1.2840466926,0.9987029831,0.1747158007,,, +1.2812500000,20,1.2809948882,0.9987029831,0.6157015335,,, +1.2832031250,20,1.2779430838,0.9987029831,0.6492713817,,, +1.2851562500,20,1.2748912795,0.9987029831,0.4448004883,,, +1.2871093750,20,1.2733653773,0.9987029831,0.2403295949,,, +1.2890625000,20,1.2703135729,0.9987029831,0.4768444343,,, +1.2910156250,20,1.2672617685,0.9987029831,0.4768444343,,, +1.2929687500,20,1.2642099641,0.9987029831,0.2143892576,,, +1.2949218750,20,1.2626840620,0.9987029831,0.5271992065,,, +1.2968750000,20,1.2596322576,0.9987029831,0.0434882124,,, +1.2988281250,20,1.2565804532,0.9987029831,0.1991302358,,, +1.3007812500,20,1.2535286488,0.9987029831,0.9193560693,,, +1.3027343750,20,1.2504768444,0.9987029831,0.4905775540,,, +1.3046875000,20,1.2489509422,0.9987029831,0.0282291905,,, +1.3066406250,20,1.2458991379,0.9987029831,0.3395132372,,, +1.3085937500,20,1.2428473335,0.9987029831,0.7423514153,,, +1.3105468750,20,1.2397955291,0.9987029831,0.8934157321,,, +1.3125000000,21,1.2367437247,0.9987029831,0.7499809262,,, +1.3144531250,21,1.2352178225,0.9987029831,0.4707408255,,, +1.3164062500,21,1.2321660182,0.9987029831,0.8628976883,,, +1.3183593750,21,1.2291142138,0.9987029831,0.7652399481,,, +1.3203125000,21,1.2260624094,0.9987029831,0.1579308766,,, +1.3222656250,21,1.2230106050,0.9987029831,0.2891584649,,, +1.3242187500,21,1.2214847028,0.9987029831,0.5317769131,,, +1.3261718750,21,1.2184328985,0.9987029831,0.0251773861,,, +1.3281250000,21,1.2153810941,0.9987029831,0.6950484474,,, +1.3300781250,21,1.2123292897,0.9987029831,0.1564049744,,, +1.3320312500,21,1.2092774853,0.9987029831,0.9620813306,,, +1.3339843750,21,1.2077515831,0.9987029831,0.2067597467,,, +1.3359375000,21,1.2046997787,0.9987029831,0.5271992065,,, +1.3378906250,21,1.2016479744,0.9987029831,0.2235446708,,, +1.3398437500,21,1.1985961700,0.9987029831,0.7820248722,,, +1.3417968750,21,1.1955443656,0.9987029831,0.9117265583,,, +1.3437500000,21,1.1924925612,0.9987029831,0.0251773861,,, +1.3457031250,21,1.1909666590,0.9987029831,0.4127565423,,, +1.3476562500,21,1.1879148547,0.9987029831,0.2220187686,,, +1.3496093750,21,1.1848630503,0.9987029831,0.4692149233,,, +1.3515625000,21,1.1818112459,0.9987029831,0.5882352941,,, +1.3535156250,21,1.1787594415,0.9987029831,0.8003356985,,, +1.3554687500,21,1.1772335393,0.9987029831,0.9483482109,,, +1.3574218750,21,1.1741817350,0.9987029831,0.5302510109,,, +1.3593750000,21,1.1711299306,0.9987029831,0.9605554284,,, +1.3613281250,21,1.1680781262,0.9987029831,0.7545586328,,, +1.3632812500,21,1.1650263218,0.9987029831,0.8522163729,,, +1.3652343750,21,1.1619745174,0.9987029831,0.1426718547,,, +1.3671875000,21,1.1604486152,0.9987029831,0.8079652094,,, +1.3691406250,21,1.1573968109,0.9987029831,0.0633249409,,, +1.3710937500,21,1.1543450065,0.9987029831,0.8430609598,,, +1.3730468750,21,1.1512932021,0.9987029831,0.6813153277,,, +1.3750000000,22,1.1482413977,0.9987029831,0.4768444343,,, +1.3769531250,22,1.1451895933,0.9987029831,0.7621881437,,, +1.3789062500,22,1.1436636912,0.9987029831,0.4737926299,,, +1.3808593750,22,1.1406118868,0.9987029831,0.2784771496,,, +1.3828125000,22,1.1375600824,0.9987029831,0.1747158007,,, +1.3847656250,22,1.1345082780,0.9987029831,0.2433813993,,, +1.3867187500,22,1.1314564736,0.9987029831,0.2510109102,,, +1.3886718750,22,1.1284046693,0.9987029831,0.0999465934,,, +1.3906250000,22,1.1268787671,0.9987029831,0.3822384985,,, +1.3925781250,22,1.1238269627,0.9987029831,0.6752117189,,, +1.3945312500,22,1.1207751583,0.9987029831,0.0053406577,,, +1.3964843750,22,1.1177233539,0.9987029831,0.8216983291,,, +1.3984375000,22,1.1146715496,0.9987029831,0.4829480430,,, +1.4003906250,22,1.1116197452,0.9987029831,0.0694285496,,, +1.4023437500,22,1.1085679408,0.9987029831,0.1960784314,,, +1.4042968750,22,1.1070420386,0.9987029831,0.7377737087,,, +1.4062500000,22,1.1039902342,0.9987029831,0.0785839628,,, +1.4082031250,22,1.1009384298,0.9987029831,0.6752117189,,, +1.4101562500,22,1.0978866255,0.9987029831,0.2021820401,,, +1.4121093750,22,1.0948348211,0.9987029831,0.3059433890,,, +1.4140625000,22,1.0917830167,0.9987029831,0.0907911803,,, +1.4160156250,22,1.0902571145,0.9987029831,0.9941252766,,, +1.4179687500,22,1.0872053101,0.9987029831,0.5271992065,,, +1.4199218750,22,1.0841535058,0.9987029831,0.8979934386,,, +1.4218750000,22,1.0811017014,0.9987029831,0.0068665599,,, +1.4238281250,22,1.0780498970,0.9987029831,0.4753185321,,, +1.4257812500,22,1.0749980926,0.9987029831,0.1457236591,,, +1.4277343750,22,1.0719462882,0.9987029831,0.6584267948,,, +1.4296875000,22,1.0704203861,0.9987029831,0.1457236591,,, +1.4316406250,22,1.0673685817,0.9987029831,0.4829480430,,, +1.4335937500,22,1.0643167773,0.9987029831,0.7545586328,,, +1.4355468750,22,1.0612649729,0.9987029831,0.5302510109,,, +1.4375000000,23,1.0582131685,0.9987029831,0.5790798810,,, +1.4394531250,23,1.0551613642,0.9987029831,0.4798962387,,, +1.4414062500,23,1.0536354620,0.9987029831,0.1976043336,,, +1.4433593750,23,1.0505836576,0.9987029831,0.1335164416,,, +1.4453125000,23,1.0475318532,0.9987029831,0.5775539788,,, +1.4472656250,23,1.0444800488,0.9987029831,0.8369573510,,, +1.4492187500,23,1.0414282444,0.9987029831,0.9208819715,,, +1.4511718750,23,1.0383764401,0.9987029831,0.1960784314,,, +1.4531250000,23,1.0353246357,0.9987029831,0.5363546197,,, +1.4550781250,23,1.0337987335,0.9987029831,0.4432745861,,, +1.4570312500,23,1.0307469291,0.9987029831,0.4585336080,,, +1.4589843750,23,1.0276951247,0.9987029831,0.7408255131,,, +1.4609375000,23,1.0246433204,0.9987029831,0.9330891890,,, +1.4628906250,23,1.0215915160,0.9987029831,0.9941252766,,, +1.4648437500,23,1.0185397116,0.9987029831,0.4463263905,,, +1.4667968750,23,1.0154879072,0.9987029831,0.4844739452,,, +1.4687500000,23,1.0139620050,0.9987029831,0.5058365759,,, +1.4707031250,23,1.0109102007,0.9987029831,0.3044174868,,, +1.4726562500,23,1.0078583963,0.9987029831,0.5775539788,,, +1.4746093750,23,1.0048065919,0.9987029831,0.7148851759,,, +1.4765625000,23,1.0017547875,0.9987029831,0.2906843671,,, +1.4785156250,23,0.9987029831,-0.0007629511,0.1716639963,,, +1.4804687500,23,0.9956511788,-0.0007629511,0.3608758679,,, +1.4824218750,23,0.9941252766,-0.0007629511,0.5851834897,,, +1.4843750000,23,0.9910734722,-0.0007629511,0.6187533379,,, +1.4863281250,23,0.9880216678,-0.0007629511,0.1304646372,,, +1.4882812500,23,0.9849698634,-0.0007629511,0.0495918212,,, +1.4902343750,23,0.9819180591,-0.0007629511,0.9727626459,,, +1.4921875000,23,0.9788662547,-0.0007629511,0.6050202182,,, +1.4941406250,23,0.9758144503,-0.0007629511,0.4509040970,,, +1.4960937500,23,0.9742885481,-0.0007629511,0.9880216678,,, +1.4980468750,23,0.9712367437,-0.0007629511,0.9346150912,,, +1.5000000000,24,0.9681849393,-0.0007629511,0.3059433890,,, +1.5019531250,24,0.9651331350,-0.0007629511,0.7133592737,,, +1.5039062500,24,0.9620813306,-0.0007629511,0.6752117189,,, +1.5058593750,24,0.9590295262,-0.0007629511,0.2677958343,,, +1.5078125000,24,0.9575036240,-0.0007629511,0.8476386664,,, +1.5097656250,24,0.9544518196,-0.0007629511,0.4936293584,,, +1.5117187500,24,0.9514000153,-0.0007629511,0.4020752270,,, +1.5136718750,24,0.9483482109,-0.0007629511,0.6889448386,,, +1.5156250000,24,0.9452964065,-0.0007629511,0.4982070649,,, +1.5175781250,24,0.9422446021,-0.0007629511,0.4203860533,,, +1.5195312500,24,0.9391927977,-0.0007629511,0.3913939117,,, +1.5214843750,24,0.9376668956,-0.0007629511,0.1457236591,,, +1.5234375000,24,0.9346150912,-0.0007629511,0.8049134051,,, +1.5253906250,24,0.9315632868,-0.0007629511,0.0999465934,,, +1.5273437500,24,0.9285114824,-0.0007629511,0.0251773861,,, +1.5292968750,24,0.9254596780,-0.0007629511,0.5699244678,,, +1.5312500000,24,0.9224078737,-0.0007629511,0.7225146868,,, +1.5332031250,24,0.9193560693,-0.0007629511,0.4676890211,,, +1.5351562500,24,0.9178301671,-0.0007629511,0.9346150912,,, +1.5371093750,24,0.9147783627,-0.0007629511,0.5012588693,,, +1.5390625000,24,0.9117265583,-0.0007629511,0.1274128328,,, +1.5410156250,24,0.9086747539,-0.0007629511,0.2571145190,,, +1.5429687500,24,0.9056229496,-0.0007629511,0.6507972839,,, +1.5449218750,24,0.9025711452,-0.0007629511,0.7698176547,,, +1.5468750000,24,0.9010452430,-0.0007629511,0.4921034562,,, +1.5488281250,24,0.8979934386,-0.0007629511,0.7743953613,,, +1.5507812500,24,0.8949416342,-0.0007629511,0.4844739452,,, +1.5527343750,24,0.8918898299,-0.0007629511,0.3578240635,,, +1.5546875000,24,0.8888380255,-0.0007629511,0.2174410620,,, +1.5566406250,24,0.8857862211,-0.0007629511,0.0175478752,,, +1.5585937500,24,0.8827344167,-0.0007629511,0.9010452430,,, +1.5605468750,24,0.8812085145,-0.0007629511,0.8293278401,,, +1.5625000000,25,0.8781567102,-0.0007629511,0.8491645686,,, +1.5644531250,25,0.8751049058,-0.0007629511,0.1991302358,,, +1.5664062500,25,0.8720531014,-0.0007629511,0.7652399481,,, +1.5683593750,25,0.8690012970,-0.0007629511,0.7606622416,,, +1.5703125000,25,0.8659494926,-0.0007629511,0.3608758679,,, +1.5722656250,25,0.8644235904,-0.0007629511,0.7759212634,,, +1.5742187500,25,0.8613717861,-0.0007629511,0.5729762722,,, +1.5761718750,25,0.8583199817,-0.0007629511,0.7911802853,,, +1.5781250000,25,0.8552681773,-0.0007629511,0.9895475700,,, +1.5800781250,25,0.8522163729,-0.0007629511,0.6767376211,,, +1.5820312500,25,0.8491645686,-0.0007629511,0.4829480430,,, +1.5839843750,25,0.8476386664,-0.0007629511,0.3486686503,,, +1.5859375000,25,0.8445868620,-0.0007629511,0.9040970474,,, +1.5878906250,25,0.8415350576,-0.0007629511,0.2601663233,,, +1.5898437500,25,0.8384832532,-0.0007629511,0.0190737774,,, +1.5917968750,25,0.8354314488,-0.0007629511,0.5531395438,,, +1.5937500000,25,0.8323796445,-0.0007629511,0.6614785992,,, +1.5957031250,25,0.8308537423,-0.0007629511,0.0083924620,,, +1.5976562500,25,0.8278019379,-0.0007629511,0.0526436255,,, +1.5996093750,25,0.8247501335,-0.0007629511,0.1106279088,,, +1.6015625000,25,0.8216983291,-0.0007629511,0.1930266270,,, +1.6035156250,25,0.8186465248,-0.0007629511,0.8216983291,,, +1.6054687500,25,0.8155947204,-0.0007629511,0.3654535744,,, +1.6074218750,25,0.8140688182,-0.0007629511,0.6919966430,,, +1.6093750000,25,0.8110170138,-0.0007629511,0.7209887846,,, +1.6113281250,25,0.8079652094,-0.0007629511,0.3837644007,,, +1.6132812500,25,0.8049134051,-0.0007629511,0.0297550927,,, +1.6152343750,25,0.8018616007,-0.0007629511,0.0511177234,,, +1.6171875000,25,0.8003356985,-0.0007629511,0.9956511788,,, +1.6191406250,25,0.7972838941,-0.0007629511,0.3074692912,,, +1.6210937500,25,0.7942320897,-0.0007629511,0.4936293584,,, +1.6230468750,25,0.7911802853,-0.0007629511,0.2113374533,,, +1.6250000000,26,0.7881284810,-0.0007629511,0.6981002518,,, +1.6269531250,26,0.7850766766,-0.0007629511,0.7408255131,,, +1.6289062500,26,0.7835507744,-0.0007629511,0.5516136416,,, +1.6308593750,26,0.7804989700,-0.0007629511,0.4356450752,,, +1.6328125000,26,0.7774471656,-0.0007629511,0.0846875715,,, +1.6347656250,26,0.7743953613,-0.0007629511,0.4081788357,,, +1.6367187500,26,0.7713435569,-0.0007629511,0.4478522927,,, +1.6386718750,26,0.7698176547,-0.0007629511,0.2967879759,,, +1.6406250000,26,0.7667658503,-0.0007629511,0.1396200504,,, +1.6425781250,26,0.7637140459,-0.0007629511,0.2128633555,,, +1.6445312500,26,0.7606622416,-0.0007629511,0.0053406577,,, +1.6464843750,26,0.7576104372,-0.0007629511,0.3562981613,,, +1.6484375000,26,0.7560845350,-0.0007629511,0.1197833219,,, +1.6503906250,26,0.7530327306,-0.0007629511,0.5760280766,,, +1.6523437500,26,0.7499809262,-0.0007629511,0.5165178912,,, +1.6542968750,26,0.7469291218,-0.0007629511,0.9376668956,,, +1.6562500000,26,0.7438773175,-0.0007629511,0.0343327993,,, +1.6582031250,26,0.7423514153,-0.0007629511,0.7637140459,,, +1.6601562500,26,0.7392996109,-0.0007629511,0.0129701686,,, +1.6621093750,26,0.7362478065,-0.0007629511,0.3532463569,,, +1.6640625000,26,0.7331960021,-0.0007629511,0.3196765087,,, +1.6660156250,26,0.7316700999,-0.0007629511,0.1243610285,,, +1.6679687500,26,0.7286182956,-0.0007629511,0.9819180591,,, +1.6699218750,26,0.7255664912,-0.0007629511,0.6385900664,,, +1.6718750000,26,0.7225146868,-0.0007629511,0.1380941482,,, +1.6738281250,26,0.7194628824,-0.0007629511,0.3547722591,,, +1.6757812500,26,0.7179369802,-0.0007629511,0.4814221408,,, +1.6777343750,26,0.7148851759,-0.0007629511,0.0251773861,,, +1.6796875000,26,0.7118333715,-0.0007629511,0.9971770809,,, +1.6816406250,26,0.7087815671,-0.0007629511,0.3059433890,,, +1.6835937500,26,0.7057297627,-0.0007629511,0.0312809949,,, +1.6855468750,26,0.7042038605,-0.0007629511,0.7820248722,,, +1.6875000000,27,0.7011520562,-0.0007629511,0.0602731365,,, +1.6894531250,27,0.6981002518,-0.0007629511,0.5821316854,,, +1.6914062500,27,0.6950484474,-0.0007629511,0.7377737087,,, +1.6933593750,27,0.6935225452,-0.0007629511,0.5867093919,,, +1.6953125000,27,0.6904707408,-0.0007629511,0.7164110780,,, +1.6972656250,27,0.6874189364,-0.0007629511,0.7484550240,,, +1.6992187500,27,0.6843671321,-0.0007629511,0.9086747539,,, +1.7011718750,27,0.6828412299,-0.0007629511,0.1426718547,,, +1.7031250000,27,0.6797894255,-0.0007629511,0.1930266270,,, +1.7050781250,27,0.6767376211,-0.0007629511,0.7270923934,,, +1.7070312500,27,0.6736858167,-0.0007629511,0.3257801175,,, +1.7089843750,27,0.6721599145,-0.0007629511,0.7331960021,,, +1.7109375000,27,0.6691081102,-0.0007629511,0.2693217365,,, +1.7128906250,27,0.6660563058,-0.0007629511,0.3059433890,,, +1.7148437500,27,0.6630045014,-0.0007629511,0.9239337758,,, +1.7167968750,27,0.6614785992,-0.0007629511,0.6416418708,,, +1.7187500000,27,0.6584267948,-0.0007629511,0.5760280766,,, +1.7207031250,27,0.6553749905,-0.0007629511,0.1731898985,,, +1.7226562500,27,0.6523231861,-0.0007629511,0.9193560693,,, +1.7246093750,27,0.6507972839,-0.0007629511,0.8735790036,,, +1.7265625000,27,0.6477454795,-0.0007629511,0.1335164416,,, +1.7285156250,27,0.6446936751,-0.0007629511,0.6050202182,,, +1.7304687500,27,0.6416418708,-0.0007629511,0.4493781949,,, +1.7324218750,27,0.6401159686,-0.0007629511,0.4737926299,,, +1.7343750000,27,0.6370641642,-0.0007629511,0.4798962387,,, +1.7363281250,27,0.6340123598,-0.0007629511,0.0358587015,,, +1.7382812500,27,0.6324864576,-0.0007629511,0.3715571832,,, +1.7402343750,27,0.6294346532,-0.0007629511,0.3105210956,,, +1.7421875000,27,0.6263828489,-0.0007629511,0.6416418708,,, +1.7441406250,27,0.6233310445,-0.0007629511,0.6599526970,,, +1.7460937500,27,0.6218051423,-0.0007629511,0.2662699321,,, +1.7480468750,27,0.6187533379,-0.0007629511,0.1014724956,,, +1.7500000000,28,0.6157015335,-0.0007629511,0.5455100328,,, +1.7519531250,28,0.6126497292,-0.0007629511,0.7835507744,,, +1.7539062500,28,0.6111238270,-0.0007629511,0.9117265583,,, +1.7558593750,28,0.6080720226,-0.0007629511,0.3288319219,,, +1.7578125000,28,0.6050202182,-0.0007629511,0.9575036240,,, +1.7597656250,28,0.6034943160,-0.0007629511,0.7026779583,,, +1.7617187500,28,0.6004425116,-0.0007629511,0.6736858167,,, +1.7636718750,28,0.5973907073,-0.0007629511,0.8995193408,,, +1.7656250000,28,0.5958648051,-0.0007629511,0.8964675364,,, +1.7675781250,28,0.5928130007,-0.0007629511,0.8247501335,,, +1.7695312500,28,0.5897611963,-0.0007629511,0.0663767453,,, +1.7714843750,28,0.5867093919,-0.0007629511,0.6279087510,,, +1.7734375000,28,0.5851834897,-0.0007629511,0.5561913481,,, +1.7753906250,28,0.5821316854,-0.0007629511,0.2418554971,,, +1.7773437500,28,0.5790798810,-0.0007629511,0.5378805219,,, +1.7792968750,28,0.5775539788,-0.0007629511,0.9315632868,,, +1.7812500000,28,0.5745021744,-0.0007629511,0.4066529335,,, +1.7832031250,28,0.5714503700,-0.0007629511,0.9040970474,,, +1.7851562500,28,0.5699244678,-0.0007629511,0.8613717861,,, +1.7871093750,28,0.5668726635,-0.0007629511,0.9834439612,,, +1.7890625000,28,0.5638208591,-0.0007629511,0.1609826810,,, +1.7910156250,28,0.5622949569,-0.0007629511,0.2647440299,,, +1.7929687500,28,0.5592431525,-0.0007629511,0.4386968795,,, +1.7949218750,28,0.5561913481,-0.0007629511,0.2143892576,,, +1.7968750000,28,0.5546654459,-0.0007629511,0.0984206912,,, +1.7988281250,28,0.5516136416,-0.0007629511,0.4371709773,,, +1.8007812500,28,0.5485618372,-0.0007629511,0.7484550240,,, +1.8027343750,28,0.5470359350,-0.0007629511,0.2708476387,,, +1.8046875000,28,0.5439841306,-0.0007629511,0.2296482795,,, +1.8066406250,28,0.5409323262,-0.0007629511,0.5546654459,,, +1.8085937500,28,0.5394064240,-0.0007629511,0.5912870985,,, +1.8105468750,28,0.5363546197,-0.0007629511,0.4325932708,,, +1.8125000000,29,0.5333028153,-0.0007629511,0.4325932708,,, +1.8144531250,29,0.5317769131,-0.0007629511,0.0663767453,,, +1.8164062500,29,0.5287251087,-0.0007629511,0.4783703365,,, +1.8183593750,29,0.5271992065,-0.0007629511,0.1319905394,,, +1.8203125000,29,0.5241474022,-0.0007629511,0.3608758679,,, +1.8222656250,29,0.5210955978,-0.0007629511,0.0053406577,,, +1.8242187500,29,0.5195696956,-0.0007629511,0.9712367437,,, +1.8261718750,29,0.5165178912,-0.0007629511,0.2586404211,,, +1.8281250000,29,0.5134660868,-0.0007629511,0.6721599145,,, +1.8300781250,29,0.5119401846,-0.0007629511,0.6492713817,,, +1.8320312500,29,0.5088883803,-0.0007629511,0.9117265583,,, +1.8339843750,29,0.5073624781,-0.0007629511,0.9056229496,,, +1.8359375000,29,0.5043106737,-0.0007629511,0.9987029831,,, +1.8378906250,29,0.5012588693,-0.0007629511,0.3318837263,,, +1.8398437500,29,0.4997329671,-0.0007629511,0.6813153277,,, +1.8417968750,29,0.4966811627,-0.0007629511,0.8857862211,,, +1.8437500000,29,0.4951552605,-0.0007629511,0.9880216678,,, +1.8457031250,29,0.4921034562,-0.0007629511,0.0434882124,,, +1.8476562500,29,0.4890516518,-0.0007629511,0.7438773175,,, +1.8496093750,29,0.4875257496,-0.0007629511,0.4188601511,,, +1.8515625000,29,0.4844739452,-0.0007629511,0.3639276722,,, +1.8535156250,29,0.4829480430,-0.0007629511,0.1121538109,,, +1.8554687500,29,0.4798962387,-0.0007629511,0.7072556649,,, +1.8574218750,29,0.4768444343,-0.0007629511,0.5409323262,,, +1.8593750000,29,0.4753185321,-0.0007629511,0.5348287175,,, +1.8613281250,29,0.4722667277,-0.0007629511,0.8522163729,,, +1.8632812500,29,0.4707408255,-0.0007629511,0.6034943160,,, +1.8652343750,29,0.4676890211,-0.0007629511,0.7225146868,,, +1.8671875000,29,0.4661631189,-0.0007629511,0.7621881437,,, +1.8691406250,29,0.4631113146,-0.0007629511,0.9727626459,,, +1.8710937500,29,0.4600595102,-0.0007629511,0.0923170825,,, +1.8730468750,29,0.4585336080,-0.0007629511,0.8583199817,,, +1.8750000000,30,0.4554818036,-0.0007629511,0.5790798810,,, +1.8769531250,30,0.4539559014,-0.0007629511,0.6553749905,,, +1.8789062500,30,0.4509040970,-0.0007629511,0.1808194095,,, +1.8808593750,30,0.4493781949,-0.0007629511,0.9330891890,,, +1.8828125000,30,0.4463263905,-0.0007629511,0.1091020066,,, +1.8847656250,30,0.4448004883,-0.0007629511,0.0526436255,,, +1.8867187500,30,0.4417486839,-0.0007629511,0.1884489204,,, +1.8886718750,30,0.4386968795,-0.0007629511,0.4615854124,,, +1.8906250000,30,0.4371709773,-0.0007629511,0.4432745861,,, +1.8925781250,30,0.4341191730,-0.0007629511,0.0328068971,,, +1.8945312500,30,0.4325932708,-0.0007629511,0.9269855802,,, +1.8964843750,30,0.4295414664,-0.0007629511,0.4051270314,,, +1.8984375000,30,0.4280155642,-0.0007629511,0.8354314488,,, +1.9003906250,30,0.4249637598,-0.0007629511,0.0267032883,,, +1.9023437500,30,0.4234378576,-0.0007629511,0.4859998474,,, +1.9042968750,30,0.4203860533,-0.0007629511,0.4188601511,,, +1.9062500000,30,0.4188601511,-0.0007629511,0.9483482109,,, +1.9082031250,30,0.4158083467,-0.0007629511,0.8216983291,,, +1.9101562500,30,0.4142824445,-0.0007629511,0.9422446021,,, +1.9121093750,30,0.4112306401,-0.0007629511,0.8110170138,,, +1.9140625000,30,0.4097047379,-0.0007629511,0.5043106737,,, +1.9160156250,30,0.4066529335,-0.0007629511,0.3379873350,,, +1.9179687500,30,0.4051270314,-0.0007629511,0.0846875715,,, +1.9199218750,30,0.4020752270,-0.0007629511,0.1533531701,,, +1.9218750000,30,0.4005493248,-0.0007629511,0.5516136416,,, +1.9238281250,30,0.3974975204,-0.0007629511,0.7728694591,,, +1.9257812500,30,0.3959716182,-0.0007629511,0.9285114824,,, +1.9277343750,30,0.3929198138,-0.0007629511,0.3593499657,,, +1.9296875000,30,0.3913939117,-0.0007629511,0.9788662547,,, +1.9316406250,30,0.3883421073,-0.0007629511,0.9834439612,,, +1.9335937500,30,0.3868162051,-0.0007629511,0.7576104372,,, +1.9355468750,30,0.3837644007,-0.0007629511,0.6919966430,,, +1.9375000000,31,0.3822384985,-0.0007629511,0.5165178912,,, +1.9394531250,31,0.3807125963,-0.0007629511,0.7896543832,,, +1.9414062500,31,0.3776607919,-0.0007629511,0.0740062562,,, +1.9433593750,31,0.3761348898,-0.0007629511,0.4844739452,,, +1.9453125000,31,0.3730830854,-0.0007629511,0.3822384985,,, +1.9472656250,31,0.3715571832,-0.0007629511,0.9575036240,,, +1.9492187500,31,0.3685053788,-0.0007629511,0.4478522927,,, +1.9511718750,31,0.3669794766,-0.0007629511,0.3624017700,,, +1.9531250000,31,0.3639276722,-0.0007629511,0.2174410620,,, +1.9550781250,31,0.3624017700,-0.0007629511,0.4478522927,,, +1.9570312500,31,0.3608758679,-0.0007629511,0.6309605554,,, +1.9589843750,31,0.3578240635,-0.0007629511,0.6965743496,,, +1.9609375000,31,0.3562981613,-0.0007629511,0.8461127642,,, +1.9628906250,31,0.3532463569,-0.0007629511,0.3486686503,,, +1.9648437500,31,0.3517204547,-0.0007629511,0.3974975204,,, +1.9667968750,31,0.3486686503,-0.0007629511,0.5195696956,,, +1.9687500000,31,0.3471427481,-0.0007629511,0.4570077058,,, +1.9707031250,31,0.3456168460,-0.0007629511,0.2449073014,,, +1.9726562500,31,0.3425650416,-0.0007629511,0.4875257496,,, +1.9746093750,31,0.3410391394,-0.0007629511,0.5638208591,,, +1.9765625000,31,0.3379873350,-0.0007629511,0.4417486839,,, +1.9785156250,31,0.3364614328,-0.0007629511,0.2479591058,,, +1.9804687500,31,0.3349355306,-0.0007629511,0.2296482795,,, +1.9824218750,31,0.3318837263,-0.0007629511,0.6126497292,,, +1.9843750000,31,0.3303578241,-0.0007629511,0.9193560693,,, +1.9863281250,31,0.3288319219,-0.0007629511,0.3700312810,,, +1.9882812500,31,0.3257801175,-0.0007629511,0.1243610285,,, +1.9902343750,31,0.3242542153,-0.0007629511,0.6782635233,,, +1.9921875000,31,0.3212024109,-0.0007629511,0.7026779583,,, +1.9941406250,31,0.3196765087,-0.0007629511,0.0205996796,,, +1.9960937500,31,0.3181506065,-0.0007629511,0.3776607919,,, +1.9980468750,31,0.3150988022,-0.0007629511,0.7576104372,,, +2.0000000000,32,0.3135729000,-0.0007629511,0.5180437934,,, +2.0019531250,32,0.3120469978,-0.0007629511,0.6507972839,,, +2.0039062500,32,0.3089951934,-0.0007629511,0.5302510109,,, +2.0058593750,32,0.3074692912,-0.0007629511,0.7331960021,,, +2.0078125000,32,0.3059433890,-0.0007629511,0.8110170138,,, +2.0097656250,32,0.3028915846,-0.0007629511,0.5897611963,,, +2.0117187500,32,0.3013656825,-0.0007629511,0.5882352941,,, +2.0136718750,32,0.2998397803,-0.0007629511,0.2449073014,,, +2.0156250000,32,0.2967879759,-0.0007629511,0.1197833219,,, +2.0175781250,32,0.2952620737,-0.0007629511,0.1045243000,,, +2.0195312500,32,0.2937361715,-0.0007629511,0.3990234226,,, +2.0214843750,32,0.2906843671,-0.0007629511,0.7225146868,,, +2.0234375000,32,0.2891584649,-0.0007629511,0.0373846036,,, +2.0253906250,32,0.2876325628,-0.0007629511,0.5043106737,,, +2.0273437500,32,0.2861066606,-0.0007629511,0.6919966430,,, +2.0292968750,32,0.2830548562,-0.0007629511,0.0587472343,,, +2.0312500000,32,0.2815289540,-0.0007629511,0.8125429160,,, +2.0332031250,32,0.2800030518,-0.0007629511,0.1869230182,,, +2.0351562500,32,0.2769512474,-0.0007629511,0.9941252766,,, +2.0371093750,32,0.2754253452,-0.0007629511,0.6157015335,,, +2.0390625000,32,0.2738994430,-0.0007629511,0.8476386664,,, +2.0410156250,32,0.2723735409,-0.0007629511,0.2265964752,,, +2.0429687500,32,0.2693217365,-0.0007629511,0.1228351263,,, +2.0449218750,32,0.2677958343,-0.0007629511,0.4203860533,,, +2.0468750000,32,0.2662699321,-0.0007629511,0.8262760357,,, +2.0488281250,32,0.2632181277,-0.0007629511,0.6569008927,,, +2.0507812500,32,0.2616922255,-0.0007629511,0.4371709773,,, +2.0527343750,32,0.2601663233,-0.0007629511,0.6385900664,,, +2.0546875000,32,0.2586404211,-0.0007629511,0.0633249409,,, +2.0566406250,32,0.2555886168,-0.0007629511,0.5668726635,,, +2.0585937500,32,0.2540627146,-0.0007629511,0.4173342489,,, +2.0605468750,32,0.2525368124,-0.0007629511,0.4768444343,,, +2.0625000000,33,0.2510109102,-0.0007629511,0.1487754635,,, +2.0644531250,33,0.2494850080,-0.0007629511,0.4539559014,,, +2.0664062500,33,0.2464332036,-0.0007629511,0.5226215000,,, +2.0683593750,33,0.2449073014,-0.0007629511,0.7789730678,,, +2.0703125000,33,0.2433813993,-0.0007629511,0.1213092241,,, +2.0722656250,33,0.2418554971,-0.0007629511,0.6752117189,,, +2.0742187500,33,0.2388036927,-0.0007629511,0.0053406577,,, +2.0761718750,33,0.2372777905,-0.0007629511,0.7835507744,,, +2.0781250000,33,0.2357518883,-0.0007629511,0.5027847715,,, +2.0800781250,33,0.2342259861,-0.0007629511,0.6996261540,,, +2.0820312500,33,0.2327000839,-0.0007629511,0.5485618372,,, +2.0839843750,33,0.2296482795,-0.0007629511,0.3364614328,,, +2.0859375000,33,0.2281223774,-0.0007629511,0.0343327993,,, +2.0878906250,33,0.2265964752,-0.0007629511,0.6080720226,,, +2.0898437500,33,0.2250705730,-0.0007629511,0.7835507744,,, +2.0917968750,33,0.2235446708,-0.0007629511,0.0099183642,,, +2.0937500000,33,0.2220187686,-0.0007629511,0.2388036927,,, +2.0957031250,33,0.2189669642,-0.0007629511,0.7499809262,,, +2.0976562500,33,0.2174410620,-0.0007629511,0.1213092241,,, +2.0996093750,33,0.2159151598,-0.0007629511,0.8598458839,,, +2.1015625000,33,0.2143892576,-0.0007629511,0.1380941482,,, +2.1035156250,33,0.2128633555,-0.0007629511,0.6111238270,,, +2.1054687500,33,0.2113374533,-0.0007629511,0.9773403525,,, +2.1074218750,33,0.2098115511,-0.0007629511,0.6004425116,,, +2.1093750000,33,0.2067597467,-0.0007629511,0.2754253452,,, +2.1113281250,33,0.2052338445,-0.0007629511,0.5241474022,,, +2.1132812500,33,0.2037079423,-0.0007629511,0.1091020066,,, +2.1152343750,33,0.2021820401,-0.0007629511,0.0221255818,,, +2.1171875000,33,0.2006561379,-0.0007629511,0.6797894255,,, +2.1191406250,33,0.1991302358,-0.0007629511,0.7530327306,,, +2.1210937500,33,0.1976043336,-0.0007629511,0.8628976883,,, +2.1230468750,33,0.1960784314,-0.0007629511,0.1853971160,,, +2.1250000000,34,0.1930266270,-0.0007629511,0.4509040970,,, +2.1269531250,34,0.1915007248,-0.0007629511,0.2952620737,,, +2.1289062500,34,0.1899748226,-0.0007629511,0.9697108415,,, +2.1308593750,34,0.1884489204,-0.0007629511,0.7774471656,,, +2.1328125000,34,0.1869230182,-0.0007629511,0.8201724269,,, +2.1347656250,34,0.1853971160,-0.0007629511,0.3669794766,,, +2.1367187500,34,0.1838712139,-0.0007629511,0.1670862898,,, +2.1386718750,34,0.1823453117,-0.0007629511,0.1747158007,,, +2.1406250000,34,0.1808194095,-0.0007629511,0.3746089876,,, +2.1425781250,34,0.1792935073,-0.0007629511,0.4066529335,,, +2.1445312500,34,0.1777676051,-0.0007629511,0.7362478065,,, +2.1464843750,34,0.1762417029,-0.0007629511,0.5928130007,,, +2.1484375000,34,0.1747158007,-0.0007629511,0.8934157321,,, +2.1503906250,34,0.1731898985,-0.0007629511,0.9010452430,,, +2.1523437500,34,0.1716639963,-0.0007629511,0.0038147555,,, +2.1542968750,34,0.1686121920,-0.0007629511,0.2311741817,,, +2.1562500000,34,0.1670862898,-0.0007629511,0.0175478752,,, +2.1582031250,34,0.1655603876,-0.0007629511,0.6889448386,,, +2.1601562500,34,0.1640344854,-0.0007629511,0.8216983291,,, +2.1621093750,34,0.1625085832,-0.0007629511,0.7240405890,,, +2.1640625000,34,0.1609826810,-0.0007629511,0.7713435569,,, +2.1660156250,34,0.1594567788,-0.0007629511,0.6492713817,,, +2.1679687500,34,0.1579308766,-0.0007629511,0.1274128328,,, +2.1699218750,34,0.1564049744,-0.0007629511,0.6523231861,,, +2.1718750000,34,0.1548790723,-0.0007629511,0.2983138781,,, +2.1738281250,34,0.1533531701,-0.0007629511,0.7087815671,,, +2.1757812500,34,0.1518272679,-0.0007629511,0.9422446021,,, +2.1777343750,34,0.1503013657,-0.0007629511,0.2754253452,,, +2.1796875000,34,0.1487754635,-0.0007629511,0.9681849393,,, +2.1816406250,34,0.1472495613,-0.0007629511,0.9498741131,,, +2.1835937500,34,0.1457236591,-0.0007629511,0.3837644007,,, +2.1855468750,34,0.1441977569,-0.0007629511,0.8201724269,,, +2.1875000000,35,0.1441977569,-0.0007629511,0.7072556649,,, +2.1894531250,35,0.1426718547,-0.0007629511,0.1365682460,,, +2.1914062500,35,0.1411459525,-0.0007629511,0.4310673686,,, +2.1933593750,35,0.1396200504,-0.0007629511,0.8003356985,,, +2.1953125000,35,0.1380941482,-0.0007629511,0.6874189364,,, +2.1972656250,35,0.1365682460,-0.0007629511,0.8995193408,,, +2.1992187500,35,0.1350423438,-0.0007629511,0.1243610285,,, +2.2011718750,35,0.1335164416,-0.0007629511,0.0144960708,,, +2.2031250000,35,0.1319905394,-0.0007629511,0.2006561379,,, +2.2050781250,35,0.1304646372,-0.0007629511,0.2204928664,,, +2.2070312500,35,0.1289387350,-0.0007629511,0.3913939117,,, +2.2089843750,35,0.1274128328,-0.0007629511,0.6996261540,,, +2.2109375000,35,0.1258869306,-0.0007629511,0.8033875029,,, +2.2128906250,35,0.1243610285,-0.0007629511,0.5348287175,,, +2.2148437500,35,0.1243610285,-0.0007629511,0.6187533379,,, +2.2167968750,35,0.1228351263,-0.0007629511,0.0923170825,,, +2.2187500000,35,0.1213092241,-0.0007629511,0.3440909438,,, +2.2207031250,35,0.1197833219,-0.0007629511,0.4524299992,,, +2.2226562500,35,0.1182574197,-0.0007629511,0.8003356985,,, +2.2246093750,35,0.1167315175,-0.0007629511,0.8476386664,,, +2.2265625000,35,0.1152056153,-0.0007629511,0.6309605554,,, +2.2285156250,35,0.1136797131,-0.0007629511,0.3639276722,,, +2.2304687500,35,0.1136797131,-0.0007629511,0.0358587015,,, +2.2324218750,35,0.1121538109,-0.0007629511,0.9269855802,,, +2.2343750000,35,0.1106279088,-0.0007629511,0.8995193408,,, +2.2363281250,35,0.1091020066,-0.0007629511,0.9834439612,,, +2.2382812500,35,0.1075761044,-0.0007629511,0.4432745861,,, +2.2402343750,35,0.1060502022,-0.0007629511,0.0480659190,,, +2.2421875000,35,0.1045243000,-0.0007629511,0.6706340124,,, +2.2441406250,35,0.1045243000,-0.0007629511,0.7148851759,,, +2.2460937500,35,0.1029983978,-0.0007629511,0.1853971160,,, +2.2480468750,35,0.1014724956,-0.0007629511,0.8308537423,,, +2.2500000000,36,0.0999465934,-0.0007629511,0.0801098650,,, +2.2519531250,36,0.0984206912,-0.0007629511,0.2662699321,,, +2.2539062500,36,0.0984206912,-0.0007629511,0.2967879759,,, +2.2558593750,36,0.0968947890,-0.0007629511,0.9239337758,,, +2.2578125000,36,0.0953688869,-0.0007629511,0.8384832532,,, +2.2597656250,36,0.0938429847,-0.0007629511,0.7881284810,,, +2.2617187500,36,0.0923170825,-0.0007629511,0.7957579919,,, +2.2636718750,36,0.0923170825,-0.0007629511,0.9239337758,,, +2.2656250000,36,0.0907911803,-0.0007629511,0.6889448386,,, +2.2675781250,36,0.0892652781,-0.0007629511,0.8827344167,,, +2.2695312500,36,0.0877393759,-0.0007629511,0.8690012970,,, +2.2714843750,36,0.0877393759,-0.0007629511,0.0938429847,,, +2.2734375000,36,0.0862134737,-0.0007629511,0.1731898985,,, +2.2753906250,36,0.0846875715,-0.0007629511,0.4432745861,,, +2.2773437500,36,0.0831616693,-0.0007629511,0.1182574197,,, +2.2792968750,36,0.0831616693,-0.0007629511,0.2738994430,,, +2.2812500000,36,0.0816357671,-0.0007629511,0.4676890211,,, +2.2832031250,36,0.0801098650,-0.0007629511,0.1014724956,,, +2.2851562500,36,0.0785839628,-0.0007629511,0.5806057832,,, +2.2871093750,36,0.0785839628,-0.0007629511,0.0373846036,,, +2.2890625000,36,0.0770580606,-0.0007629511,0.7988097963,,, +2.2910156250,36,0.0755321584,-0.0007629511,0.6919966430,,, +2.2929687500,36,0.0740062562,-0.0007629511,0.3440909438,,, +2.2949218750,36,0.0740062562,-0.0007629511,0.2601663233,,, +2.2968750000,36,0.0724803540,-0.0007629511,0.4005493248,,, +2.2988281250,36,0.0709544518,-0.0007629511,0.6736858167,,, +2.3007812500,36,0.0709544518,-0.0007629511,0.4509040970,,, +2.3027343750,36,0.0694285496,-0.0007629511,0.1594567788,,, +2.3046875000,36,0.0679026474,-0.0007629511,0.1823453117,,, +2.3066406250,36,0.0679026474,-0.0007629511,0.3456168460,,, +2.3085937500,36,0.0663767453,-0.0007629511,0.5394064240,,, +2.3105468750,36,0.0648508431,-0.0007629511,0.5302510109,,, +2.3125000000,37,0.0648508431,-0.0007629511,0.9361409934,,, +2.3144531250,37,0.0633249409,-0.0007629511,0.5485618372,,, +2.3164062500,37,0.0617990387,-0.0007629511,0.6965743496,,, +2.3183593750,37,0.0617990387,-0.0007629511,0.6065461204,,, +2.3203125000,37,0.0602731365,-0.0007629511,0.3074692912,,, +2.3222656250,37,0.0587472343,-0.0007629511,0.4722667277,,, +2.3242187500,37,0.0587472343,-0.0007629511,0.0434882124,,, +2.3261718750,37,0.0572213321,-0.0007629511,0.5561913481,,, +2.3281250000,37,0.0572213321,-0.0007629511,0.7270923934,,, +2.3300781250,37,0.0556954299,-0.0007629511,0.7972838941,,, +2.3320312500,37,0.0541695277,-0.0007629511,0.7850766766,,, +2.3339843750,37,0.0541695277,-0.0007629511,0.9514000153,,, +2.3359375000,37,0.0526436255,-0.0007629511,0.9803921569,,, +2.3378906250,37,0.0526436255,-0.0007629511,0.5424582284,,, +2.3398437500,37,0.0511177234,-0.0007629511,0.4768444343,,, +2.3417968750,37,0.0495918212,-0.0007629511,0.2830548562,,, +2.3437500000,37,0.0495918212,-0.0007629511,0.4036011292,,, +2.3457031250,37,0.0480659190,-0.0007629511,0.3440909438,,, +2.3476562500,37,0.0480659190,-0.0007629511,0.9956511788,,, +2.3496093750,37,0.0465400168,-0.0007629511,0.5104142824,,, +2.3515625000,37,0.0450141146,-0.0007629511,0.3807125963,,, +2.3535156250,37,0.0450141146,-0.0007629511,0.7011520562,,, +2.3554687500,37,0.0434882124,-0.0007629511,0.3135729000,,, +2.3574218750,37,0.0434882124,-0.0007629511,0.4814221408,,, +2.3593750000,37,0.0419623102,-0.0007629511,0.0358587015,,, +2.3613281250,37,0.0419623102,-0.0007629511,0.8506904707,,, +2.3632812500,37,0.0404364080,-0.0007629511,0.4844739452,,, +2.3652343750,37,0.0404364080,-0.0007629511,0.4966811627,,, +2.3671875000,37,0.0389105058,-0.0007629511,0.1716639963,,, +2.3691406250,37,0.0389105058,-0.0007629511,0.0129701686,,, +2.3710937500,37,0.0373846036,-0.0007629511,0.0022888533,,, +2.3730468750,37,0.0373846036,-0.0007629511,0.5073624781,,, +2.3750000000,38,0.0358587015,-0.0007629511,0.8323796445,,, +2.3769531250,38,0.0358587015,-0.0007629511,0.9742885481,,, +2.3789062500,38,0.0343327993,-0.0007629511,0.3608758679,,, +2.3808593750,38,0.0343327993,-0.0007629511,0.8888380255,,, +2.3828125000,38,0.0328068971,-0.0007629511,0.2632181277,,, +2.3847656250,38,0.0328068971,-0.0007629511,0.2037079423,,, +2.3867187500,38,0.0312809949,-0.0007629511,0.0251773861,,, +2.3886718750,38,0.0312809949,-0.0007629511,0.8751049058,,, +2.3906250000,38,0.0297550927,-0.0007629511,0.9895475700,,, +2.3925781250,38,0.0297550927,-0.0007629511,0.5394064240,,, +2.3945312500,38,0.0282291905,-0.0007629511,0.4264896620,,, +2.3964843750,38,0.0282291905,-0.0007629511,0.7515068284,,, +2.3984375000,38,0.0282291905,-0.0007629511,0.4844739452,,, +2.4003906250,38,0.0267032883,-0.0007629511,0.9925993744,,, +2.4023437500,38,0.0267032883,-0.0007629511,0.4844739452,,, +2.4042968750,38,0.0251773861,-0.0007629511,0.0968947890,,, +2.4062500000,38,0.0251773861,-0.0007629511,0.4921034562,,, +2.4082031250,38,0.0236514839,-0.0007629511,0.2830548562,,, +2.4101562500,38,0.0236514839,-0.0007629511,0.2006561379,,, +2.4121093750,38,0.0236514839,-0.0007629511,0.3166247044,,, +2.4140625000,38,0.0221255818,-0.0007629511,0.1487754635,,, +2.4160156250,38,0.0221255818,-0.0007629511,0.8552681773,,, +2.4179687500,38,0.0205996796,-0.0007629511,0.5104142824,,, +2.4199218750,38,0.0205996796,-0.0007629511,0.6691081102,,, +2.4218750000,38,0.0205996796,-0.0007629511,0.9636072328,,, +2.4238281250,38,0.0190737774,-0.0007629511,0.0709544518,,, +2.4257812500,38,0.0190737774,-0.0007629511,0.2662699321,,, +2.4277343750,38,0.0190737774,-0.0007629511,0.0663767453,,, +2.4296875000,38,0.0175478752,-0.0007629511,0.0343327993,,, +2.4316406250,38,0.0175478752,-0.0007629511,0.3212024109,,, +2.4335937500,38,0.0160219730,-0.0007629511,0.6919966430,,, +2.4355468750,38,0.0160219730,-0.0007629511,0.9376668956,,, +2.4375000000,39,0.0160219730,-0.0007629511,0.5531395438,,, +2.4394531250,39,0.0144960708,-0.0007629511,0.2159151598,,, +2.4414062500,39,0.0144960708,-0.0007629511,0.1564049744,,, +2.4433593750,39,0.0144960708,-0.0007629511,0.3471427481,,, +2.4453125000,39,0.0129701686,-0.0007629511,0.6996261540,,, +2.4472656250,39,0.0129701686,-0.0007629511,0.8476386664,,, +2.4492187500,39,0.0129701686,-0.0007629511,0.7377737087,,, +2.4511718750,39,0.0129701686,-0.0007629511,0.0953688869,,, +2.4531250000,39,0.0114442664,-0.0007629511,0.8674753948,,, +2.4550781250,39,0.0114442664,-0.0007629511,0.9742885481,,, +2.4570312500,39,0.0114442664,-0.0007629511,0.4646372168,,, +2.4589843750,39,0.0099183642,-0.0007629511,0.8674753948,,, +2.4609375000,39,0.0099183642,-0.0007629511,0.4921034562,,, +2.4628906250,39,0.0099183642,-0.0007629511,0.9956511788,,, +2.4648437500,39,0.0099183642,-0.0007629511,0.7392996109,,, +2.4667968750,39,0.0083924620,-0.0007629511,0.2082856489,,, +2.4687500000,39,0.0083924620,-0.0007629511,0.4142824445,,, +2.4707031250,39,0.0083924620,-0.0007629511,0.0968947890,,, +2.4726562500,39,0.0083924620,-0.0007629511,0.6752117189,,, +2.4746093750,39,0.0068665599,-0.0007629511,0.0465400168,,, +2.4765625000,39,0.0068665599,-0.0007629511,0.4432745861,,, +2.4785156250,39,0.0068665599,-0.0007629511,0.4036011292,,, +2.4804687500,39,0.0068665599,-0.0007629511,0.1045243000,,, +2.4824218750,39,0.0053406577,-0.0007629511,0.6858930343,,, +2.4843750000,39,0.0053406577,-0.0007629511,0.3196765087,,, +2.4863281250,39,0.0053406577,-0.0007629511,0.8796826123,,, +2.4882812500,39,0.0053406577,-0.0007629511,0.1838712139,,, +2.4902343750,39,0.0053406577,-0.0007629511,0.8384832532,,, +2.4921875000,39,0.0038147555,-0.0007629511,0.5806057832,,, +2.4941406250,39,0.0038147555,-0.0007629511,0.5577172503,,, +2.4960937500,39,0.0038147555,-0.0007629511,0.4829480430,,, +2.4980468750,39,0.0038147555,-0.0007629511,0.6141756313,,, +2.5000000000,40,0.0038147555,-0.0007629511,0.2311741817,,, +2.5019531250,40,0.0038147555,-0.0007629511,0.7530327306,,, +2.5039062500,40,0.0022888533,-0.0007629511,0.2800030518,,, +2.5058593750,40,0.0022888533,-0.0007629511,0.7591363394,,, +2.5078125000,40,0.0022888533,-0.0007629511,0.1091020066,,, +2.5097656250,40,0.0022888533,-0.0007629511,0.9208819715,,, +2.5117187500,40,0.0022888533,-0.0007629511,0.8384832532,,, +2.5136718750,40,0.0022888533,-0.0007629511,0.4737926299,,, +2.5156250000,40,0.0022888533,-0.0007629511,0.3547722591,,, +2.5175781250,40,0.0007629511,-0.0007629511,0.7057297627,,, +2.5195312500,40,0.0007629511,-0.0007629511,0.7713435569,,, +2.5214843750,40,0.0007629511,-0.0007629511,0.7270923934,,, +2.5234375000,40,0.0007629511,-0.0007629511,0.9437705043,,, +2.5253906250,40,0.0007629511,-0.0007629511,0.8522163729,,, +2.5273437500,40,0.0007629511,-0.0007629511,0.1060502022,,, +2.5292968750,40,0.0007629511,-0.0007629511,0.6324864576,,, +2.5312500000,40,0.0007629511,-0.0007629511,0.8903639277,,, +2.5332031250,40,0.0007629511,-0.0007629511,0.5302510109,,, +2.5351562500,40,0.0007629511,-0.0007629511,0.5882352941,,, +2.5371093750,40,-0.0007629511,-0.0007629511,0.8995193408,,, +2.5390625000,40,-0.0007629511,-0.0007629511,0.7728694591,,, +2.5410156250,40,-0.0007629511,-0.0007629511,0.5516136416,,, +2.5429687500,40,-0.0007629511,-0.0007629511,0.3654535744,,, +2.5449218750,40,-0.0007629511,-0.0007629511,0.0602731365,,, +2.5468750000,40,-0.0007629511,-0.0007629511,0.5271992065,,, +2.5488281250,40,-0.0007629511,-0.0007629511,0.0526436255,,, +2.5507812500,40,-0.0007629511,-0.0007629511,0.9132524605,,, +2.5527343750,40,-0.0007629511,-0.0007629511,0.9620813306,,, +2.5546875000,40,-0.0007629511,-0.0007629511,0.1457236591,,, +2.5566406250,40,-0.0007629511,-0.0007629511,0.1304646372,,, +2.5585937500,40,-0.0007629511,-0.0007629511,0.5256733043,,, +2.5605468750,40,-0.0007629511,-0.0007629511,0.6675822080,,, +2.5625000000,41,-0.0007629511,-0.0007629511,0.3440909438,,, +2.5644531250,41,-0.0007629511,-0.0007629511,0.9086747539,,, +2.5664062500,41,-0.0007629511,-0.0007629511,0.5134660868,,, +2.5683593750,41,-0.0007629511,-0.0007629511,0.3410391394,,, +2.5703125000,41,-0.0007629511,-0.0007629511,0.3593499657,,, +2.5722656250,41,-0.0007629511,-0.0007629511,0.8094911116,,, +2.5742187500,41,-0.0007629511,-0.0007629511,0.5302510109,,, +2.5761718750,41,-0.0007629511,-0.0007629511,0.4051270314,,, +2.5781250000,41,-0.0007629511,-0.0007629511,0.5348287175,,, +2.5800781250,41,-0.0007629511,-0.0007629511,0.5012588693,,, +2.5820312500,41,-0.0007629511,-0.0007629511,0.5821316854,,, +2.5839843750,41,-0.0007629511,-0.0007629511,0.5760280766,,, +2.5859375000,41,-0.0007629511,-0.0007629511,0.4737926299,,, +2.5878906250,41,-0.0007629511,-0.0007629511,0.8262760357,,, +2.5898437500,41,-0.0007629511,-0.0007629511,0.2235446708,,, +2.5917968750,41,0.0007629511,-0.0007629511,0.2677958343,,, +2.5937500000,41,0.0007629511,-0.0007629511,0.9010452430,,, +2.5957031250,41,0.0007629511,-0.0007629511,0.0862134737,,, +2.5976562500,41,0.0007629511,-0.0007629511,0.0617990387,,, +2.5996093750,41,0.0007629511,-0.0007629511,0.2311741817,,, +2.6015625000,41,0.0007629511,-0.0007629511,0.7408255131,,, +2.6035156250,41,0.0007629511,-0.0007629511,0.9254596780,,, +2.6054687500,41,0.0007629511,-0.0007629511,0.4188601511,,, +2.6074218750,41,0.0007629511,-0.0007629511,0.7896543832,,, +2.6093750000,41,0.0007629511,-0.0007629511,0.7255664912,,, +2.6113281250,41,0.0022888533,-0.0007629511,0.9925993744,,, +2.6132812500,41,0.0022888533,-0.0007629511,0.3059433890,,, +2.6152343750,41,0.0022888533,-0.0007629511,0.3852903029,,, +2.6171875000,41,0.0022888533,-0.0007629511,0.4325932708,,, +2.6191406250,41,0.0022888533,-0.0007629511,0.0160219730,,, +2.6210937500,41,0.0022888533,-0.0007629511,0.2037079423,,, +2.6230468750,41,0.0022888533,-0.0007629511,0.0740062562,,, +2.6250000000,42,0.0038147555,-0.0007629511,0.8644235904,,, +2.6269531250,42,0.0038147555,-0.0007629511,0.1625085832,,, +2.6289062500,42,0.0038147555,-0.0007629511,0.5210955978,,, +2.6308593750,42,0.0038147555,-0.0007629511,0.2159151598,,, +2.6328125000,42,0.0038147555,-0.0007629511,0.2647440299,,, +2.6347656250,42,0.0053406577,-0.0007629511,0.5256733043,,, +2.6367187500,42,0.0053406577,-0.0007629511,0.2220187686,,, +2.6386718750,42,0.0053406577,-0.0007629511,0.7576104372,,, +2.6406250000,42,0.0053406577,-0.0007629511,0.6767376211,,, +2.6425781250,42,0.0053406577,-0.0007629511,0.7866025788,,, +2.6445312500,42,0.0068665599,-0.0007629511,0.3334096284,,, +2.6464843750,42,0.0068665599,-0.0007629511,0.7774471656,,, +2.6484375000,42,0.0068665599,-0.0007629511,0.0221255818,,, +2.6503906250,42,0.0068665599,-0.0007629511,0.6950484474,,, +2.6523437500,42,0.0068665599,-0.0007629511,0.2754253452,,, +2.6542968750,42,0.0083924620,-0.0007629511,0.5683985657,,, +2.6562500000,42,0.0083924620,-0.0007629511,0.5790798810,,, +2.6582031250,42,0.0083924620,-0.0007629511,0.3639276722,,, +2.6601562500,42,0.0083924620,-0.0007629511,0.8659494926,,, +2.6621093750,42,0.0099183642,-0.0007629511,0.0038147555,,, +2.6640625000,42,0.0099183642,-0.0007629511,0.2800030518,,, +2.6660156250,42,0.0099183642,-0.0007629511,0.4219119554,,, +2.6679687500,42,0.0114442664,-0.0007629511,0.7988097963,,, +2.6699218750,42,0.0114442664,-0.0007629511,0.3715571832,,, +2.6718750000,42,0.0114442664,-0.0007629511,0.9437705043,,, +2.6738281250,42,0.0114442664,-0.0007629511,0.6797894255,,, +2.6757812500,42,0.0129701686,-0.0007629511,0.4676890211,,, +2.6777343750,42,0.0129701686,-0.0007629511,0.3303578241,,, +2.6796875000,42,0.0129701686,-0.0007629511,0.9834439612,,, +2.6816406250,42,0.0144960708,-0.0007629511,0.8110170138,,, +2.6835937500,42,0.0144960708,-0.0007629511,0.6935225452,,, +2.6855468750,42,0.0144960708,-0.0007629511,0.5745021744,,, +2.6875000000,43,0.0160219730,-0.0007629511,0.0968947890,,, +2.6894531250,43,0.0160219730,-0.0007629511,0.9254596780,,, +2.6914062500,43,0.0160219730,-0.0007629511,0.0038147555,,, +2.6933593750,43,0.0175478752,-0.0007629511,0.0846875715,,, +2.6953125000,43,0.0175478752,-0.0007629511,0.3318837263,,, +2.6972656250,43,0.0175478752,-0.0007629511,0.9742885481,,, +2.6992187500,43,0.0190737774,-0.0007629511,0.0358587015,,, +2.7011718750,43,0.0190737774,-0.0007629511,0.5775539788,,, +2.7031250000,43,0.0190737774,-0.0007629511,0.2189669642,,, +2.7050781250,43,0.0205996796,-0.0007629511,0.8094911116,,, +2.7070312500,43,0.0205996796,-0.0007629511,0.0526436255,,, +2.7089843750,43,0.0221255818,-0.0007629511,0.9620813306,,, +2.7109375000,43,0.0221255818,-0.0007629511,0.4524299992,,, +2.7128906250,43,0.0221255818,-0.0007629511,0.0389105058,,, +2.7148437500,43,0.0236514839,-0.0007629511,0.0587472343,,, +2.7167968750,43,0.0236514839,-0.0007629511,0.2769512474,,, +2.7187500000,43,0.0251773861,-0.0007629511,0.5867093919,,, +2.7207031250,43,0.0251773861,-0.0007629511,0.7988097963,,, +2.7226562500,43,0.0251773861,-0.0007629511,0.9941252766,,, +2.7246093750,43,0.0267032883,-0.0007629511,0.7469291218,,, +2.7265625000,43,0.0267032883,-0.0007629511,0.5500877394,,, +2.7285156250,43,0.0282291905,-0.0007629511,0.2082856489,,, +2.7304687500,43,0.0282291905,-0.0007629511,0.4127565423,,, +2.7324218750,43,0.0297550927,-0.0007629511,0.9788662547,,, +2.7343750000,43,0.0297550927,-0.0007629511,0.1640344854,,, +2.7363281250,43,0.0312809949,-0.0007629511,0.6248569467,,, +2.7382812500,43,0.0312809949,-0.0007629511,0.6263828489,,, +2.7402343750,43,0.0328068971,-0.0007629511,0.1792935073,,, +2.7421875000,43,0.0328068971,-0.0007629511,0.6675822080,,, +2.7441406250,43,0.0328068971,-0.0007629511,0.5409323262,,, +2.7460937500,43,0.0343327993,-0.0007629511,0.1838712139,,, +2.7480468750,43,0.0343327993,-0.0007629511,0.6919966430,,, +2.7500000000,44,0.0358587015,-0.0007629511,0.4570077058,,, +2.7519531250,44,0.0358587015,-0.0007629511,0.3532463569,,, +2.7539062500,44,0.0373846036,-0.0007629511,0.4844739452,,, +2.7558593750,44,0.0373846036,-0.0007629511,0.7164110780,,, +2.7578125000,44,0.0389105058,-0.0007629511,0.2616922255,,, +2.7597656250,44,0.0389105058,-0.0007629511,0.9437705043,,, +2.7617187500,44,0.0404364080,-0.0007629511,0.1899748226,,, +2.7636718750,44,0.0419623102,-0.0007629511,0.4737926299,,, +2.7656250000,44,0.0419623102,-0.0007629511,0.1152056153,,, +2.7675781250,44,0.0434882124,-0.0007629511,0.4386968795,,, +2.7695312500,44,0.0434882124,-0.0007629511,0.8690012970,,, +2.7714843750,44,0.0450141146,-0.0007629511,0.8339055467,,, +2.7734375000,44,0.0450141146,-0.0007629511,0.9224078737,,, +2.7753906250,44,0.0465400168,-0.0007629511,0.6034943160,,, +2.7773437500,44,0.0465400168,-0.0007629511,0.5485618372,,, +2.7792968750,44,0.0480659190,-0.0007629511,0.8094911116,,, +2.7812500000,44,0.0495918212,-0.0007629511,0.6004425116,,, +2.7832031250,44,0.0495918212,-0.0007629511,0.7240405890,,, +2.7851562500,44,0.0511177234,-0.0007629511,0.0465400168,,, +2.7871093750,44,0.0511177234,-0.0007629511,0.0404364080,,, +2.7890625000,44,0.0526436255,-0.0007629511,0.3974975204,,, +2.7910156250,44,0.0526436255,-0.0007629511,0.4249637598,,, +2.7929687500,44,0.0541695277,-0.0007629511,0.5745021744,,, +2.7949218750,44,0.0556954299,-0.0007629511,0.0297550927,,, +2.7968750000,44,0.0556954299,-0.0007629511,0.3974975204,,, +2.7988281250,44,0.0572213321,-0.0007629511,0.5226215000,,, +2.8007812500,44,0.0587472343,-0.0007629511,0.2403295949,,, +2.8027343750,44,0.0587472343,-0.0007629511,0.4875257496,,, +2.8046875000,44,0.0602731365,-0.0007629511,0.9147783627,,, +2.8066406250,44,0.0602731365,-0.0007629511,0.2952620737,,, +2.8085937500,44,0.0617990387,-0.0007629511,0.5348287175,,, +2.8105468750,44,0.0633249409,-0.0007629511,0.5485618372,,, +2.8125000000,45,0.0633249409,-0.0007629511,0.7362478065,,, +2.8144531250,45,0.0648508431,-0.0007629511,0.2494850080,,, +2.8164062500,45,0.0663767453,-0.0007629511,0.1777676051,,, +2.8183593750,45,0.0663767453,-0.0007629511,0.9605554284,,, +2.8203125000,45,0.0679026474,-0.0007629511,0.2235446708,,, +2.8222656250,45,0.0694285496,-0.0007629511,0.2372777905,,, +2.8242187500,45,0.0694285496,-0.0007629511,0.6492713817,,, +2.8261718750,45,0.0709544518,-0.0007629511,0.9925993744,,, +2.8281250000,45,0.0724803540,-0.0007629511,0.6706340124,,, +2.8300781250,45,0.0724803540,-0.0007629511,0.4188601511,,, +2.8320312500,45,0.0740062562,-0.0007629511,0.2677958343,,, +2.8339843750,45,0.0755321584,-0.0007629511,0.9788662547,,, +2.8359375000,45,0.0770580606,-0.0007629511,0.8216983291,,, +2.8378906250,45,0.0770580606,-0.0007629511,0.7148851759,,, +2.8398437500,45,0.0785839628,-0.0007629511,0.0648508431,,, +2.8417968750,45,0.0801098650,-0.0007629511,0.8873121233,,, +2.8437500000,45,0.0801098650,-0.0007629511,0.3242542153,,, +2.8457031250,45,0.0816357671,-0.0007629511,0.7209887846,,, +2.8476562500,45,0.0831616693,-0.0007629511,0.7469291218,,, +2.8496093750,45,0.0846875715,-0.0007629511,0.5790798810,,, +2.8515625000,45,0.0846875715,-0.0007629511,0.7133592737,,, +2.8535156250,45,0.0862134737,-0.0007629511,0.8674753948,,, +2.8554687500,45,0.0877393759,-0.0007629511,0.7362478065,,, +2.8574218750,45,0.0892652781,-0.0007629511,0.2265964752,,, +2.8593750000,45,0.0907911803,-0.0007629511,0.9605554284,,, +2.8613281250,45,0.0907911803,-0.0007629511,0.8873121233,,, +2.8632812500,45,0.0923170825,-0.0007629511,0.7454032197,,, +2.8652343750,45,0.0938429847,-0.0007629511,0.7469291218,,, +2.8671875000,45,0.0953688869,-0.0007629511,0.6111238270,,, +2.8691406250,45,0.0953688869,-0.0007629511,0.2174410620,,, +2.8710937500,45,0.0968947890,-0.0007629511,0.8949416342,,, +2.8730468750,45,0.0984206912,-0.0007629511,0.9910734722,,, +2.8750000000,46,0.0999465934,-0.0007629511,0.4783703365,,, +2.8769531250,46,0.1014724956,-0.0007629511,0.8705271992,,, +2.8789062500,46,0.1014724956,-0.0007629511,0.9224078737,,, +2.8808593750,46,0.1029983978,-0.0007629511,0.0724803540,,, +2.8828125000,46,0.1045243000,-0.0007629511,0.5958648051,,, +2.8847656250,46,0.1060502022,-0.0007629511,0.5439841306,,, +2.8867187500,46,0.1075761044,-0.0007629511,0.0801098650,,, +2.8886718750,46,0.1091020066,-0.0007629511,0.0663767453,,, +2.8906250000,46,0.1091020066,-0.0007629511,0.0816357671,,, +2.8925781250,46,0.1106279088,-0.0007629511,0.0221255818,,, +2.8945312500,46,0.1121538109,-0.0007629511,0.9193560693,,, +2.8964843750,46,0.1136797131,-0.0007629511,0.9956511788,,, +2.8984375000,46,0.1152056153,-0.0007629511,0.0785839628,,, +2.9003906250,46,0.1167315175,-0.0007629511,0.6599526970,,, +2.9023437500,46,0.1182574197,-0.0007629511,0.7652399481,,, +2.9042968750,46,0.1197833219,-0.0007629511,0.8659494926,,, +2.9062500000,46,0.1197833219,-0.0007629511,0.7179369802,,, +2.9082031250,46,0.1213092241,-0.0007629511,0.8232242313,,, +2.9101562500,46,0.1228351263,-0.0007629511,0.0465400168,,, +2.9121093750,46,0.1243610285,-0.0007629511,0.7011520562,,, +2.9140625000,46,0.1258869306,-0.0007629511,0.7759212634,,, +2.9160156250,46,0.1274128328,-0.0007629511,0.8186465248,,, +2.9179687500,46,0.1289387350,-0.0007629511,0.9788662547,,, +2.9199218750,46,0.1304646372,-0.0007629511,0.1258869306,,, +2.9218750000,46,0.1319905394,-0.0007629511,0.5485618372,,, +2.9238281250,46,0.1335164416,-0.0007629511,0.7881284810,,, +2.9257812500,46,0.1335164416,-0.0007629511,0.6569008927,,, +2.9277343750,46,0.1350423438,-0.0007629511,0.0205996796,,, +2.9296875000,46,0.1365682460,-0.0007629511,0.0862134737,,, +2.9316406250,46,0.1380941482,-0.0007629511,0.6782635233,,, +2.9335937500,46,0.1396200504,-0.0007629511,0.7011520562,,, +2.9355468750,46,0.1411459525,-0.0007629511,0.5607690547,,, +2.9375000000,47,0.1426718547,-0.0007629511,0.3593499657,,, +2.9394531250,47,0.1441977569,-0.0007629511,0.7743953613,,, +2.9414062500,47,0.1457236591,-0.0007629511,0.1441977569,,, +2.9433593750,47,0.1472495613,-0.0007629511,0.9132524605,,, +2.9453125000,47,0.1487754635,-0.0007629511,0.0923170825,,, +2.9472656250,47,0.1503013657,-0.0007629511,0.9880216678,,, +2.9492187500,47,0.1518272679,-0.0007629511,0.4371709773,,, +2.9511718750,47,0.1533531701,-0.0007629511,0.8400091554,,, +2.9531250000,47,0.1548790723,-0.0007629511,0.3547722591,,, +2.9550781250,47,0.1564049744,-0.0007629511,0.9925993744,,, +2.9570312500,47,0.1579308766,-0.0007629511,0.9269855802,,, +2.9589843750,47,0.1594567788,-0.0007629511,0.8354314488,,, +2.9609375000,47,0.1609826810,-0.0007629511,0.6736858167,,, +2.9628906250,47,0.1625085832,-0.0007629511,0.8003356985,,, +2.9648437500,47,0.1640344854,-0.0007629511,0.7957579919,,, +2.9667968750,47,0.1655603876,-0.0007629511,0.9239337758,,, +2.9687500000,47,0.1670862898,-0.0007629511,0.2754253452,,, +2.9707031250,47,0.1686121920,-0.0007629511,0.0953688869,,, +2.9726562500,47,0.1701380941,-0.0007629511,0.6294346532,,, +2.9746093750,47,0.1716639963,-0.0007629511,0.7881284810,,, +2.9765625000,47,0.1731898985,-0.0007629511,0.6462195773,,, +2.9785156250,47,0.1747158007,-0.0007629511,0.5683985657,,, +2.9804687500,47,0.1762417029,-0.0007629511,0.9925993744,,, +2.9824218750,47,0.1777676051,-0.0007629511,0.7743953613,,, +2.9843750000,47,0.1792935073,-0.0007629511,0.3181506065,,, +2.9863281250,47,0.1808194095,-0.0007629511,0.6126497292,,, +2.9882812500,47,0.1838712139,-0.0007629511,0.7621881437,,, +2.9902343750,47,0.1853971160,-0.0007629511,0.9056229496,,, +2.9921875000,47,0.1869230182,-0.0007629511,0.2327000839,,, +2.9941406250,47,0.1884489204,-0.0007629511,0.8201724269,,, +2.9960937500,47,0.1899748226,-0.0007629511,0.2937361715,,, +2.9980468750,47,0.1915007248,-0.0007629511,0.5470359350,,, +3.0000000000,48,0.1930266270,-0.0007629511,0.6614785992,,, +3.0019531250,48,0.1945525292,-0.0007629511,0.0999465934,,, +3.0039062500,48,0.1960784314,-0.0007629511,0.5165178912,,, +3.0058593750,48,0.1976043336,-0.0007629511,0.4509040970,,, +3.0078125000,48,0.1991302358,-0.0007629511,0.1457236591,,, +3.0097656250,48,0.2021820401,-0.0007629511,0.4417486839,,, +3.0117187500,48,0.2037079423,-0.0007629511,0.0343327993,,, +3.0136718750,48,0.2052338445,-0.0007629511,0.3364614328,,, +3.0156250000,48,0.2067597467,-0.0007629511,0.7469291218,,, +3.0175781250,48,0.2082856489,-0.0007629511,0.6996261540,,, +3.0195312500,48,0.2098115511,-0.0007629511,0.2082856489,,, +3.0214843750,48,0.2113374533,-0.0007629511,0.5668726635,,, +3.0234375000,48,0.2128633555,-0.0007629511,0.6462195773,,, +3.0253906250,48,0.2159151598,-0.0007629511,0.0328068971,,, +3.0273437500,48,0.2174410620,-0.0007629511,0.9590295262,,, +3.0292968750,48,0.2189669642,-0.0007629511,0.3303578241,,, +3.0312500000,48,0.2204928664,-0.0007629511,0.1670862898,,, +3.0332031250,48,0.2220187686,-0.0007629511,0.3242542153,,, +3.0351562500,48,0.2235446708,-0.0007629511,0.1930266270,,, +3.0371093750,48,0.2265964752,-0.0007629511,0.2479591058,,, +3.0390625000,48,0.2281223774,-0.0007629511,0.0785839628,,, +3.0410156250,48,0.2296482795,-0.0007629511,0.3730830854,,, +3.0429687500,48,0.2311741817,-0.0007629511,0.6294346532,,, +3.0449218750,48,0.2327000839,-0.0007629511,0.5363546197,,, +3.0468750000,48,0.2357518883,-0.0007629511,0.3959716182,,, +3.0488281250,48,0.2372777905,-0.0007629511,0.2311741817,,, +3.0507812500,48,0.2388036927,-0.0007629511,0.6889448386,,, +3.0527343750,48,0.2403295949,-0.0007629511,0.1640344854,,, +3.0546875000,48,0.2418554971,-0.0007629511,0.0617990387,,, +3.0566406250,48,0.2449073014,-0.0007629511,0.1777676051,,, +3.0585937500,48,0.2464332036,-0.0007629511,0.2143892576,,, +3.0605468750,48,0.2479591058,-0.0007629511,0.6645304036,,, +3.0625000000,49,0.2494850080,-0.0007629511,0.3257801175,,, +3.0644531250,49,0.2510109102,-0.0007629511,0.6477454795,,, +3.0664062500,49,0.2540627146,-0.0007629511,0.6828412299,,, +3.0683593750,49,0.2555886168,-0.0007629511,0.0541695277,,, +3.0703125000,49,0.2571145190,-0.0007629511,0.2830548562,,, +3.0722656250,49,0.2586404211,-0.0007629511,0.7713435569,,, +3.0742187500,49,0.2616922255,-0.0007629511,0.2143892576,,, +3.0761718750,49,0.2632181277,-0.0007629511,0.2876325628,,, +3.0781250000,49,0.2647440299,-0.0007629511,0.9193560693,,, +3.0800781250,49,0.2662699321,-0.0007629511,0.8110170138,,, +3.0820312500,49,0.2693217365,-0.0007629511,0.3578240635,,, +3.0839843750,49,0.2708476387,-0.0007629511,0.8567940795,,, +3.0859375000,49,0.2723735409,-0.0007629511,0.0907911803,,, +3.0878906250,49,0.2754253452,-0.0007629511,0.3837644007,,, +3.0898437500,49,0.2769512474,-0.0007629511,0.1533531701,,, +3.0917968750,49,0.2784771496,-0.0007629511,0.7484550240,,, +3.0937500000,49,0.2800030518,-0.0007629511,0.3639276722,,, +3.0957031250,49,0.2830548562,-0.0007629511,0.7881284810,,, +3.0976562500,49,0.2845807584,-0.0007629511,0.3028915846,,, +3.0996093750,49,0.2861066606,-0.0007629511,0.1045243000,,, +3.1015625000,49,0.2891584649,-0.0007629511,0.4081788357,,, +3.1035156250,49,0.2906843671,-0.0007629511,0.9681849393,,, +3.1054687500,49,0.2922102693,-0.0007629511,0.8827344167,,, +3.1074218750,49,0.2952620737,-0.0007629511,0.0755321584,,, +3.1093750000,49,0.2967879759,-0.0007629511,0.8705271992,,, +3.1113281250,49,0.2983138781,-0.0007629511,0.7896543832,,, +3.1132812500,49,0.2998397803,-0.0007629511,0.7850766766,,, +3.1152343750,49,0.3028915846,-0.0007629511,0.1213092241,,, +3.1171875000,49,0.3044174868,-0.0007629511,0.6904707408,,, +3.1191406250,49,0.3059433890,-0.0007629511,0.0190737774,,, +3.1210937500,49,0.3089951934,-0.0007629511,0.1747158007,,, +3.1230468750,49,0.3105210956,-0.0007629511,0.5745021744,,, +3.1250000000,50,0.3120469978,-0.0007629511,0.4921034562,,, +3.1269531250,50,0.3150988022,-0.0007629511,0.9803921569,,, +3.1289062500,50,0.3166247044,-0.0007629511,0.2250705730,,, +3.1308593750,50,0.3196765087,-0.0007629511,0.7911802853,,, +3.1328125000,50,0.3212024109,-0.0007629511,0.5882352941,,, +3.1347656250,50,0.3227283131,-0.0007629511,0.0495918212,,, +3.1367187500,50,0.3257801175,-0.0007629511,0.3379873350,,, +3.1386718750,50,0.3273060197,-0.0007629511,0.7331960021,,, +3.1406250000,50,0.3288319219,-0.0007629511,0.5851834897,,, +3.1425781250,50,0.3318837263,-0.0007629511,0.7927061875,,, +3.1445312500,50,0.3334096284,-0.0007629511,0.3135729000,,, +3.1464843750,50,0.3364614328,-0.0007629511,0.0846875715,,, +3.1484375000,50,0.3379873350,-0.0007629511,0.1350423438,,, +3.1503906250,50,0.3395132372,-0.0007629511,0.5714503700,,, +3.1523437500,50,0.3425650416,-0.0007629511,0.8537422751,,, +3.1542968750,50,0.3440909438,-0.0007629511,0.8308537423,,, +3.1562500000,50,0.3471427481,-0.0007629511,0.2464332036,,, +3.1582031250,50,0.3486686503,-0.0007629511,0.9864957656,,, +3.1601562500,50,0.3501945525,-0.0007629511,0.8186465248,,, +3.1621093750,50,0.3532463569,-0.0007629511,0.8354314488,,, +3.1640625000,50,0.3547722591,-0.0007629511,0.9834439612,,, +3.1660156250,50,0.3578240635,-0.0007629511,0.0144960708,,, +3.1679687500,50,0.3593499657,-0.0007629511,0.5943389029,,, +3.1699218750,50,0.3608758679,-0.0007629511,0.9803921569,,, +3.1718750000,50,0.3639276722,-0.0007629511,0.9666590372,,, +3.1738281250,50,0.3654535744,-0.0007629511,0.0984206912,,, +3.1757812500,50,0.3685053788,-0.0007629511,0.1930266270,,, +3.1777343750,50,0.3700312810,-0.0007629511,0.4295414664,,, +3.1796875000,50,0.3730830854,-0.0007629511,0.5973907073,,, +3.1816406250,50,0.3746089876,-0.0007629511,0.1686121920,,, +3.1835937500,50,0.3776607919,-0.0007629511,0.4524299992,,, +3.1855468750,50,0.3791866941,-0.0007629511,0.9376668956,,, +3.1875000000,51,0.3807125963,-0.0007629511,0.9956511788,,, +3.1894531250,51,0.3837644007,-0.0007629511,0.9895475700,,, +3.1914062500,51,0.3852903029,-0.0007629511,0.5729762722,,, +3.1933593750,51,0.3883421073,-0.0007629511,0.5348287175,,, +3.1953125000,51,0.3898680095,-0.0007629511,0.9956511788,,, +3.1972656250,51,0.3929198138,-0.0007629511,0.5210955978,,, +3.1992187500,51,0.3944457160,-0.0007629511,0.7362478065,,, +3.2011718750,51,0.3974975204,-0.0007629511,0.8567940795,,, +3.2031250000,51,0.3990234226,-0.0007629511,0.2220187686,,, +3.2050781250,51,0.4020752270,-0.0007629511,0.3578240635,,, +3.2070312500,51,0.4036011292,-0.0007629511,0.5210955978,,, +3.2089843750,51,0.4066529335,-0.0007629511,0.9163042649,,, +3.2109375000,51,0.4081788357,-0.0007629511,0.0267032883,,, +3.2128906250,51,0.4112306401,-0.0007629511,0.2464332036,,, +3.2148437500,51,0.4127565423,-0.0007629511,0.4448004883,,, +3.2167968750,51,0.4158083467,-0.0007629511,0.2052338445,,, +3.2187500000,51,0.4173342489,-0.0007629511,0.3349355306,,, +3.2207031250,51,0.4203860533,-0.0007629511,0.6324864576,,, +3.2226562500,51,0.4219119554,-0.0007629511,0.9452964065,,, +3.2246093750,51,0.4249637598,-0.0007629511,0.9681849393,,, +3.2265625000,51,0.4264896620,-0.0007629511,0.7423514153,,, +3.2285156250,51,0.4295414664,-0.0007629511,0.5760280766,,, +3.2304687500,51,0.4310673686,-0.0007629511,0.2174410620,,, +3.2324218750,51,0.4341191730,-0.0007629511,0.6492713817,,, +3.2343750000,51,0.4356450752,-0.0007629511,0.1136797131,,, +3.2363281250,51,0.4386968795,-0.0007629511,0.1945525292,,, +3.2382812500,51,0.4402227817,-0.0007629511,0.8247501335,,, +3.2402343750,51,0.4432745861,-0.0007629511,0.7606622416,,, +3.2421875000,51,0.4448004883,-0.0007629511,0.0434882124,,, +3.2441406250,51,0.4478522927,-0.0007629511,0.1731898985,,, +3.2460937500,51,0.4509040970,-0.0007629511,0.7515068284,,, +3.2480468750,51,0.4524299992,-0.0007629511,0.1686121920,,, +3.2500000000,52,0.4554818036,-0.0007629511,0.9620813306,,, +3.2519531250,52,0.4570077058,-0.0007629511,0.6294346532,,, +3.2539062500,52,0.4600595102,-0.0007629511,0.9407186999,,, +3.2558593750,52,0.4615854124,-0.0007629511,0.9147783627,,, +3.2578125000,52,0.4646372168,-0.0007629511,0.3471427481,,, +3.2597656250,52,0.4661631189,-0.0007629511,0.6736858167,,, +3.2617187500,52,0.4692149233,-0.0007629511,0.2693217365,,, +3.2636718750,52,0.4722667277,-0.0007629511,0.4509040970,,, +3.2656250000,52,0.4737926299,-0.0007629511,0.5317769131,,, +3.2675781250,52,0.4768444343,-0.0007629511,0.4875257496,,, +3.2695312500,52,0.4783703365,-0.0007629511,0.2815289540,,, +3.2714843750,52,0.4814221408,-0.0007629511,0.3150988022,,, +3.2734375000,52,0.4844739452,-0.0007629511,0.6019684138,,, +3.2753906250,52,0.4859998474,-0.0007629511,0.8125429160,,, +3.2773437500,52,0.4890516518,-0.0007629511,0.4066529335,,, +3.2792968750,52,0.4905775540,-0.0007629511,0.6828412299,,, +3.2812500000,52,0.4936293584,-0.0007629511,0.2204928664,,, +3.2832031250,52,0.4966811627,-0.0007629511,0.8934157321,,, +3.2851562500,52,0.4982070649,-0.0007629511,0.1991302358,,, +3.2871093750,52,0.5012588693,-0.0007629511,0.3013656825,,, +3.2890625000,52,0.5027847715,-0.0007629511,0.0587472343,,, +3.2910156250,52,0.5058365759,-0.0007629511,0.3547722591,,, +3.2929687500,52,0.5088883803,-0.0007629511,0.6492713817,,, +3.2949218750,52,0.5104142824,-0.0007629511,0.7820248722,,, +3.2968750000,52,0.5134660868,-0.0007629511,0.4371709773,,, +3.2988281250,52,0.5149919890,-0.0007629511,0.8644235904,,, +3.3007812500,52,0.5180437934,-0.0007629511,0.5958648051,,, +3.3027343750,52,0.5210955978,-0.0007629511,0.2250705730,,, +3.3046875000,52,0.5226215000,-0.0007629511,0.9269855802,,, +3.3066406250,52,0.5256733043,-0.0007629511,0.9422446021,,, +3.3085937500,52,0.5287251087,-0.0007629511,0.8567940795,,, +3.3105468750,52,0.5302510109,-0.0007629511,0.1686121920,,, +3.3125000000,53,0.5333028153,-0.0007629511,0.4051270314,,, +3.3144531250,53,0.5348287175,-0.0007629511,0.8125429160,,, +3.3164062500,53,0.5378805219,-0.0007629511,0.5653467613,,, +3.3183593750,53,0.5409323262,-0.0007629511,0.3669794766,,, +3.3203125000,53,0.5424582284,-0.0007629511,0.8445868620,,, +3.3222656250,53,0.5455100328,-0.0007629511,0.8369573510,,, +3.3242187500,53,0.5485618372,-0.0007629511,0.2342259861,,, +3.3261718750,53,0.5500877394,-0.0007629511,0.4280155642,,, +3.3281250000,53,0.5531395438,-0.0007629511,0.3685053788,,, +3.3300781250,53,0.5561913481,-0.0007629511,0.9559777218,,, +3.3320312500,53,0.5577172503,-0.0007629511,0.1594567788,,, +3.3339843750,53,0.5607690547,-0.0007629511,0.7820248722,,, +3.3359375000,53,0.5638208591,-0.0007629511,0.4814221408,,, +3.3378906250,53,0.5653467613,-0.0007629511,0.3776607919,,, +3.3398437500,53,0.5683985657,-0.0007629511,0.3837644007,,, +3.3417968750,53,0.5714503700,-0.0007629511,0.7774471656,,, +3.3437500000,53,0.5729762722,-0.0007629511,0.7118333715,,, +3.3457031250,53,0.5760280766,-0.0007629511,0.6935225452,,, +3.3476562500,53,0.5790798810,-0.0007629511,0.1899748226,,, +3.3496093750,53,0.5806057832,-0.0007629511,0.0495918212,,, +3.3515625000,53,0.5836575875,-0.0007629511,0.9925993744,,, +3.3535156250,53,0.5867093919,-0.0007629511,-0.0007629511,,, +3.3554687500,53,0.5882352941,-0.0007629511,0.5195696956,,, +3.3574218750,53,0.5912870985,-0.0007629511,0.1518272679,,, +3.3593750000,53,0.5943389029,-0.0007629511,0.8506904707,,, +3.3613281250,53,0.5973907073,-0.0007629511,0.1335164416,,, +3.3632812500,53,0.5989166094,-0.0007629511,0.2372777905,,, +3.3652343750,53,0.6019684138,-0.0007629511,0.8171206226,,, +3.3671875000,53,0.6050202182,-0.0007629511,0.8445868620,,, +3.3691406250,53,0.6065461204,-0.0007629511,0.0221255818,,, +3.3710937500,53,0.6095979248,-0.0007629511,0.2738994430,,, +3.3730468750,53,0.6126497292,-0.0007629511,0.3013656825,,, +3.3750000000,54,0.6141756313,-0.0007629511,0.8964675364,,, +3.3769531250,54,0.6172274357,-0.0007629511,0.3196765087,,, +3.3789062500,54,0.6202792401,-0.0007629511,0.1304646372,,, +3.3808593750,54,0.6233310445,-0.0007629511,0.5424582284,,, +3.3828125000,54,0.6248569467,-0.0007629511,0.5622949569,,, +3.3847656250,54,0.6279087510,-0.0007629511,0.2586404211,,, +3.3867187500,54,0.6309605554,-0.0007629511,0.6263828489,,, +3.3886718750,54,0.6340123598,-0.0007629511,0.7667658503,,, +3.3906250000,54,0.6355382620,-0.0007629511,0.3746089876,,, +3.3925781250,54,0.6385900664,-0.0007629511,0.7042038605,,, +3.3945312500,54,0.6416418708,-0.0007629511,0.3486686503,,, +3.3964843750,54,0.6431677729,-0.0007629511,0.2555886168,,, +3.3984375000,54,0.6462195773,-0.0007629511,0.5760280766,,, +3.4003906250,54,0.6492713817,-0.0007629511,0.2067597467,,, +3.4023437500,54,0.6523231861,-0.0007629511,0.6569008927,,, +3.4042968750,54,0.6538490883,-0.0007629511,0.5607690547,,, +3.4062500000,54,0.6569008927,-0.0007629511,0.0785839628,,, +3.4082031250,54,0.6599526970,-0.0007629511,0.6675822080,,, +3.4101562500,54,0.6630045014,-0.0007629511,0.8155947204,,, +3.4121093750,54,0.6645304036,-0.0007629511,0.0617990387,,, +3.4140625000,54,0.6675822080,-0.0007629511,0.0617990387,,, +3.4160156250,54,0.6706340124,-0.0007629511,0.1792935073,,, +3.4179687500,54,0.6736858167,-0.0007629511,0.7621881437,,, +3.4199218750,54,0.6752117189,-0.0007629511,0.5531395438,,, +3.4218750000,54,0.6782635233,-0.0007629511,0.1564049744,,, +3.4238281250,54,0.6813153277,-0.0007629511,0.3196765087,,, +3.4257812500,54,0.6843671321,-0.0007629511,0.8964675364,,, +3.4277343750,54,0.6858930343,-0.0007629511,0.8796826123,,, +3.4296875000,54,0.6889448386,-0.0007629511,0.2418554971,,, +3.4316406250,54,0.6919966430,-0.0007629511,0.0648508431,,, +3.4335937500,54,0.6950484474,-0.0007629511,0.0862134737,,, +3.4355468750,54,0.6965743496,-0.0007629511,0.2189669642,,, +3.4375000000,55,0.6996261540,-0.0007629511,0.0587472343,,, +3.4394531250,55,0.7026779583,-0.0007629511,0.7957579919,,, +3.4414062500,55,0.7057297627,-0.0007629511,0.4631113146,,, +3.4433593750,55,0.7087815671,-0.0007629511,0.3578240635,,, +3.4453125000,55,0.7103074693,-0.0007629511,0.3547722591,,, +3.4472656250,55,0.7133592737,-0.0007629511,0.9040970474,,, +3.4492187500,55,0.7164110780,-0.0007629511,0.5378805219,,, +3.4511718750,55,0.7194628824,-0.0007629511,0.7209887846,,, +3.4531250000,55,0.7209887846,-0.0007629511,0.8094911116,,, +3.4550781250,55,0.7240405890,-0.0007629511,0.0846875715,,, +3.4570312500,55,0.7270923934,-0.0007629511,0.5195696956,,, +3.4589843750,55,0.7301441978,-0.0007629511,0.2937361715,,, +3.4609375000,55,0.7331960021,-0.0007629511,0.8735790036,,, +3.4628906250,55,0.7347219043,-0.0007629511,0.1503013657,,, +3.4648437500,55,0.7377737087,-0.0007629511,0.8430609598,,, +3.4667968750,55,0.7408255131,-0.0007629511,0.6492713817,,, +3.4687500000,55,0.7438773175,-0.0007629511,0.8995193408,,, +3.4707031250,55,0.7469291218,-0.0007629511,0.3364614328,,, +3.4726562500,55,0.7484550240,-0.0007629511,0.1472495613,,, +3.4746093750,55,0.7515068284,-0.0007629511,0.6431677729,,, +3.4765625000,55,0.7545586328,-0.0007629511,0.0663767453,,, +3.4785156250,55,0.7576104372,-0.0007629511,0.9651331350,,, +3.4804687500,55,0.7591363394,-0.0007629511,0.4341191730,,, +3.4824218750,55,0.7621881437,-0.0007629511,0.2769512474,,, +3.4843750000,55,0.7652399481,-0.0007629511,0.0740062562,,, +3.4863281250,55,0.7682917525,-0.0007629511,0.8323796445,,, +3.4882812500,55,0.7713435569,-0.0007629511,0.7728694591,,, +3.4902343750,55,0.7743953613,-0.0007629511,0.8720531014,,, +3.4921875000,55,0.7759212634,-0.0007629511,0.0129701686,,, +3.4941406250,55,0.7789730678,-0.0007629511,0.8064393072,,, +3.4960937500,55,0.7820248722,-0.0007629511,0.8888380255,,, +3.4980468750,55,0.7850766766,-0.0007629511,0.6507972839,,, +3.5000000000,56,0.7881284810,-0.0007629511,0.1731898985,,, +3.5019531250,56,0.7896543832,-0.0007629511,0.0923170825,,, +3.5039062500,56,0.7927061875,-0.0007629511,0.8659494926,,, +3.5058593750,56,0.7957579919,-0.0007629511,0.0892652781,,, +3.5078125000,56,0.7988097963,-0.0007629511,0.0160219730,,, +3.5097656250,56,0.8018616007,-0.0007629511,0.8766308080,,, +3.5117187500,56,0.8033875029,-0.0007629511,0.8522163729,,, +3.5136718750,56,0.8064393072,-0.0007629511,0.1213092241,,, +3.5156250000,56,0.8094911116,-0.0007629511,0.3379873350,,, +3.5175781250,56,0.8125429160,-0.0007629511,0.5973907073,,, +3.5195312500,56,0.8155947204,-0.0007629511,0.5348287175,,, +3.5214843750,56,0.8186465248,-0.0007629511,0.5394064240,,, +3.5234375000,56,0.8201724269,-0.0007629511,0.5653467613,,, +3.5253906250,56,0.8232242313,-0.0007629511,0.7743953613,,, +3.5273437500,56,0.8262760357,-0.0007629511,0.2906843671,,, +3.5292968750,56,0.8293278401,-0.0007629511,0.4814221408,,, +3.5312500000,56,0.8323796445,-0.0007629511,0.0694285496,,, +3.5332031250,56,0.8354314488,-0.0007629511,0.8659494926,,, +3.5351562500,56,0.8369573510,-0.0007629511,0.2937361715,,, +3.5371093750,56,0.8400091554,-0.0007629511,0.0770580606,,, +3.5390625000,56,0.8430609598,-0.0007629511,0.0450141146,,, +3.5410156250,56,0.8461127642,-0.0007629511,0.4264896620,,, +3.5429687500,56,0.8491645686,-0.0007629511,0.1701380941,,, +3.5449218750,56,0.8522163729,-0.0007629511,0.5699244678,,, +3.5468750000,56,0.8537422751,-0.0007629511,0.5729762722,,, +3.5488281250,56,0.8567940795,-0.0007629511,0.3822384985,,, +3.5507812500,56,0.8598458839,-0.0007629511,0.7942320897,,, +3.5527343750,56,0.8628976883,-0.0007629511,0.2769512474,,, +3.5546875000,56,0.8659494926,-0.0007629511,0.2220187686,,, +3.5566406250,56,0.8690012970,-0.0007629511,0.4493781949,,, +3.5585937500,56,0.8705271992,-0.0007629511,0.0663767453,,, +3.5605468750,56,0.8735790036,-0.0007629511,0.7087815671,,, +3.5625000000,57,0.8766308080,-0.0007629511,0.1930266270,,, +3.5644531250,57,0.8796826123,-0.0007629511,0.5439841306,,, +3.5664062500,57,0.8827344167,-0.0007629511,0.3837644007,,, +3.5683593750,57,0.8857862211,-0.0007629511,0.0816357671,,, +3.5703125000,57,0.8873121233,-0.0007629511,0.6065461204,,, +3.5722656250,57,0.8903639277,-0.0007629511,0.4448004883,,, +3.5742187500,57,0.8934157321,-0.0007629511,0.6996261540,,, +3.5761718750,57,0.8964675364,-0.0007629511,0.5180437934,,, +3.5781250000,57,0.8995193408,-0.0007629511,0.8812085145,,, +3.5800781250,57,0.9025711452,-0.0007629511,0.7576104372,,, +3.5820312500,57,0.9040970474,-0.0007629511,0.9544518196,,, +3.5839843750,57,0.9071488518,-0.0007629511,0.0495918212,,, +3.5859375000,57,0.9102006561,-0.0007629511,0.9590295262,,, +3.5878906250,57,0.9132524605,-0.0007629511,0.3547722591,,, +3.5898437500,57,0.9163042649,-0.0007629511,0.5165178912,,, +3.5917968750,57,0.9193560693,-0.0007629511,0.4020752270,,, +3.5937500000,57,0.9224078737,-0.0007629511,0.2738994430,,, +3.5957031250,57,0.9239337758,-0.0007629511,0.2021820401,,, +3.5976562500,57,0.9269855802,-0.0007629511,0.6660563058,,, +3.5996093750,57,0.9300373846,-0.0007629511,0.6599526970,,, +3.6015625000,57,0.9330891890,-0.0007629511,0.4341191730,,, +3.6035156250,57,0.9361409934,-0.0007629511,0.1243610285,,, +3.6054687500,57,0.9391927977,-0.0007629511,0.7148851759,,, +3.6074218750,57,0.9407186999,-0.0007629511,0.8796826123,,, +3.6093750000,57,0.9437705043,-0.0007629511,0.0312809949,,, +3.6113281250,57,0.9468223087,-0.0007629511,0.2998397803,,, +3.6132812500,57,0.9498741131,-0.0007629511,0.9895475700,,, +3.6152343750,57,0.9529259174,-0.0007629511,0.7301441978,,, +3.6171875000,57,0.9559777218,-0.0007629511,0.6385900664,,, +3.6191406250,57,0.9590295262,-0.0007629511,0.0129701686,,, +3.6210937500,57,0.9605554284,-0.0007629511,0.7286182956,,, +3.6230468750,57,0.9636072328,-0.0007629511,0.6843671321,,, +3.6250000000,58,0.9666590372,-0.0007629511,0.1411459525,,, +3.6269531250,58,0.9697108415,-0.0007629511,0.8506904707,,, +3.6289062500,58,0.9727626459,-0.0007629511,0.5561913481,,, +3.6308593750,58,0.9758144503,-0.0007629511,0.2494850080,,, +3.6328125000,58,0.9788662547,-0.0007629511,0.4997329671,,, +3.6347656250,58,0.9803921569,-0.0007629511,0.6462195773,,, +3.6367187500,58,0.9834439612,-0.0007629511,0.3822384985,,, +3.6386718750,58,0.9864957656,-0.0007629511,0.8705271992,,, +3.6406250000,58,0.9895475700,-0.0007629511,0.3257801175,,, +3.6425781250,58,0.9925993744,-0.0007629511,0.1258869306,,, +3.6445312500,58,0.9956511788,-0.0007629511,0.7866025788,,, +3.6464843750,58,0.9987029831,-0.0007629511,0.6324864576,,, +3.6484375000,58,1.0002288853,0.9987029831,0.4615854124,,, +3.6503906250,58,1.0032806897,0.9987029831,0.2586404211,,, +3.6523437500,58,1.0063324941,0.9987029831,0.3013656825,,, +3.6542968750,58,1.0093842985,0.9987029831,0.1915007248,,, +3.6562500000,58,1.0124361028,0.9987029831,0.7698176547,,, +3.6582031250,58,1.0154879072,0.9987029831,0.2784771496,,, +3.6601562500,58,1.0185397116,0.9987029831,0.4600595102,,, +3.6621093750,58,1.0200656138,0.9987029831,0.9544518196,,, +3.6640625000,58,1.0231174182,0.9987029831,0.9102006561,,, +3.6660156250,58,1.0261692226,0.9987029831,0.3166247044,,, +3.6679687500,58,1.0292210269,0.9987029831,0.5836575875,,, +3.6699218750,58,1.0322728313,0.9987029831,0.1457236591,,, +3.6718750000,58,1.0353246357,0.9987029831,0.9102006561,,, +3.6738281250,58,1.0383764401,0.9987029831,0.2571145190,,, +3.6757812500,58,1.0399023423,0.9987029831,0.7881284810,,, +3.6777343750,58,1.0429541466,0.9987029831,0.8155947204,,, +3.6796875000,58,1.0460059510,0.9987029831,0.8537422751,,, +3.6816406250,58,1.0490577554,0.9987029831,0.0434882124,,, +3.6835937500,58,1.0521095598,0.9987029831,0.6965743496,,, +3.6855468750,58,1.0551613642,0.9987029831,0.7576104372,,, +3.6875000000,59,1.0566872663,0.9987029831,0.4295414664,,, +3.6894531250,59,1.0597390707,0.9987029831,0.7057297627,,, +3.6914062500,59,1.0627908751,0.9987029831,0.0999465934,,, +3.6933593750,59,1.0658426795,0.9987029831,0.6233310445,,, +3.6953125000,59,1.0688944839,0.9987029831,0.3120469978,,, +3.6972656250,59,1.0719462882,0.9987029831,0.7148851759,,, +3.6992187500,59,1.0749980926,0.9987029831,0.9407186999,,, +3.7011718750,59,1.0765239948,0.9987029831,0.9575036240,,, +3.7031250000,59,1.0795757992,0.9987029831,0.6889448386,,, +3.7050781250,59,1.0826276036,0.9987029831,0.3807125963,,, +3.7070312500,59,1.0856794079,0.9987029831,0.6538490883,,, +3.7089843750,59,1.0887312123,0.9987029831,0.7011520562,,, +3.7109375000,59,1.0917830167,0.9987029831,0.6172274357,,, +3.7128906250,59,1.0948348211,0.9987029831,0.2265964752,,, +3.7148437500,59,1.0963607233,0.9987029831,0.9376668956,,, +3.7167968750,59,1.0994125277,0.9987029831,0.7545586328,,, +3.7187500000,59,1.1024643320,0.9987029831,0.9559777218,,, +3.7207031250,59,1.1055161364,0.9987029831,0.4631113146,,, +3.7226562500,59,1.1085679408,0.9987029831,0.9880216678,,, +3.7246093750,59,1.1116197452,0.9987029831,0.0251773861,,, +3.7265625000,59,1.1131456474,0.9987029831,0.0251773861,,, +3.7285156250,59,1.1161974517,0.9987029831,0.3379873350,,, +3.7304687500,59,1.1192492561,0.9987029831,0.2357518883,,, +3.7324218750,59,1.1223010605,0.9987029831,0.5653467613,,, +3.7343750000,59,1.1253528649,0.9987029831,0.9529259174,,, +3.7363281250,59,1.1284046693,0.9987029831,0.8140688182,,, +3.7382812500,59,1.1299305715,0.9987029831,0.3944457160,,, +3.7402343750,59,1.1329823758,0.9987029831,0.7606622416,,, +3.7421875000,59,1.1360341802,0.9987029831,0.2983138781,,, +3.7441406250,59,1.1390859846,0.9987029831,0.0267032883,,, +3.7460937500,59,1.1421377890,0.9987029831,0.6645304036,,, +3.7480468750,59,1.1451895933,0.9987029831,0.3883421073,,, +3.7500000000,60,1.1467154955,0.9987029831,0.9010452430,,, +3.7519531250,60,1.1497672999,0.9987029831,0.9956511788,,, +3.7539062500,60,1.1528191043,0.9987029831,0.4051270314,,, +3.7558593750,60,1.1558709087,0.9987029831,0.6675822080,,, +3.7578125000,60,1.1589227131,0.9987029831,0.9727626459,,, +3.7597656250,60,1.1619745174,0.9987029831,0.9086747539,,, +3.7617187500,60,1.1635004196,0.9987029831,0.5912870985,,, +3.7636718750,60,1.1665522240,0.9987029831,0.8659494926,,, +3.7656250000,60,1.1696040284,0.9987029831,0.3852903029,,, +3.7675781250,60,1.1726558328,0.9987029831,0.3181506065,,, +3.7695312500,60,1.1757076371,0.9987029831,0.9697108415,,, +3.7714843750,60,1.1787594415,0.9987029831,0.4737926299,,, +3.7734375000,60,1.1802853437,0.9987029831,0.4997329671,,, +3.7753906250,60,1.1833371481,0.9987029831,0.5729762722,,, +3.7773437500,60,1.1863889525,0.9987029831,0.5531395438,,, +3.7792968750,60,1.1894407568,0.9987029831,0.6935225452,,, +3.7812500000,60,1.1924925612,0.9987029831,0.4783703365,,, +3.7832031250,60,1.1955443656,0.9987029831,0.1655603876,,, +3.7851562500,60,1.1970702678,0.9987029831,0.5836575875,,, +3.7871093750,60,1.2001220722,0.9987029831,0.5973907073,,, +3.7890625000,60,1.2031738766,0.9987029831,0.8110170138,,, +3.7910156250,60,1.2062256809,0.9987029831,0.3944457160,,, +3.7929687500,60,1.2092774853,0.9987029831,0.0679026474,,, +3.7949218750,60,1.2108033875,0.9987029831,0.1594567788,,, +3.7968750000,60,1.2138551919,0.9987029831,0.3791866941,,, +3.7988281250,60,1.2169069963,0.9987029831,0.2204928664,,, +3.8007812500,60,1.2199588006,0.9987029831,0.0450141146,,, +3.8027343750,60,1.2230106050,0.9987029831,0.5088883803,,, +3.8046875000,60,1.2245365072,0.9987029831,0.9727626459,,, +3.8066406250,60,1.2275883116,0.9987029831,0.8888380255,,, +3.8085937500,60,1.2306401160,0.9987029831,0.1274128328,,, +3.8105468750,60,1.2336919203,0.9987029831,0.0648508431,,, +3.8125000000,61,1.2367437247,0.9987029831,0.5424582284,,, +3.8144531250,61,1.2382696269,0.9987029831,0.3883421073,,, +3.8164062500,61,1.2413214313,0.9987029831,0.5165178912,,, +3.8183593750,61,1.2443732357,0.9987029831,0.5104142824,,, +3.8203125000,61,1.2474250401,0.9987029831,0.6538490883,,, +3.8222656250,61,1.2504768444,0.9987029831,0.4661631189,,, +3.8242187500,61,1.2520027466,0.9987029831,0.0434882124,,, +3.8261718750,61,1.2550545510,0.9987029831,0.6294346532,,, +3.8281250000,61,1.2581063554,0.9987029831,0.6889448386,,, +3.8300781250,61,1.2611581598,0.9987029831,0.0694285496,,, +3.8320312500,61,1.2642099641,0.9987029831,0.9163042649,,, +3.8339843750,61,1.2657358663,0.9987029831,0.9224078737,,, +3.8359375000,61,1.2687876707,0.9987029831,0.9987029831,,, +3.8378906250,61,1.2718394751,0.9987029831,0.5806057832,,, +3.8398437500,61,1.2748912795,0.9987029831,0.7042038605,,, +3.8417968750,61,1.2779430838,0.9987029831,0.2723735409,,, +3.8437500000,61,1.2794689860,0.9987029831,0.9773403525,,, +3.8457031250,61,1.2825207904,0.9987029831,0.0572213321,,, +3.8476562500,61,1.2855725948,0.9987029831,0.3669794766,,, +3.8496093750,61,1.2886243992,0.9987029831,0.4768444343,,, +3.8515625000,61,1.2901503014,0.9987029831,0.6370641642,,, +3.8535156250,61,1.2932021057,0.9987029831,0.2220187686,,, +3.8554687500,61,1.2962539101,0.9987029831,0.4280155642,,, +3.8574218750,61,1.2993057145,0.9987029831,0.0648508431,,, +3.8593750000,61,1.3023575189,0.9987029831,0.1655603876,,, +3.8613281250,61,1.3038834211,0.9987029831,0.5256733043,,, +3.8632812500,61,1.3069352255,0.9987029831,0.0343327993,,, +3.8652343750,61,1.3099870298,0.9987029831,0.4905775540,,, +3.8671875000,61,1.3130388342,0.9987029831,0.9239337758,,, +3.8691406250,61,1.3145647364,0.9987029831,0.3181506065,,, +3.8710937500,61,1.3176165408,0.9987029831,0.3654535744,,, +3.8730468750,61,1.3206683452,0.9987029831,0.6202792401,,, +3.8750000000,62,1.3237201495,0.9987029831,0.2296482795,,, +3.8769531250,62,1.3252460517,0.9987029831,0.5638208591,,, +3.8789062500,62,1.3282978561,0.9987029831,0.6614785992,,, +3.8808593750,62,1.3313496605,0.9987029831,0.6492713817,,, +3.8828125000,62,1.3344014649,0.9987029831,0.9605554284,,, +3.8847656250,62,1.3359273671,0.9987029831,0.5760280766,,, +3.8867187500,62,1.3389791714,0.9987029831,0.6782635233,,, +3.8886718750,62,1.3420309758,0.9987029831,0.1701380941,,, +3.8906250000,62,1.3450827802,0.9987029831,0.9773403525,,, +3.8925781250,62,1.3466086824,0.9987029831,0.6645304036,,, +3.8945312500,62,1.3496604868,0.9987029831,0.3807125963,,, +3.8964843750,62,1.3527122911,0.9987029831,0.1670862898,,, +3.8984375000,62,1.3557640955,0.9987029831,0.9910734722,,, +3.9003906250,62,1.3572899977,0.9987029831,0.6767376211,,, +3.9023437500,62,1.3603418021,0.9987029831,0.5836575875,,, +3.9042968750,62,1.3633936065,0.9987029831,0.4234378576,,, +3.9062500000,62,1.3649195087,0.9987029831,0.6065461204,,, +3.9082031250,62,1.3679713130,0.9987029831,0.9605554284,,, +3.9101562500,62,1.3710231174,0.9987029831,0.0205996796,,, +3.9121093750,62,1.3740749218,0.9987029831,0.1045243000,,, +3.9140625000,62,1.3756008240,0.9987029831,0.8857862211,,, +3.9160156250,62,1.3786526284,0.9987029831,0.5439841306,,, +3.9179687500,62,1.3817044327,0.9987029831,0.9727626459,,, +3.9199218750,62,1.3832303349,0.9987029831,0.6218051423,,, +3.9218750000,62,1.3862821393,0.9987029831,0.9468223087,,, +3.9238281250,62,1.3893339437,0.9987029831,0.1808194095,,, +3.9257812500,62,1.3923857481,0.9987029831,0.2037079423,,, +3.9277343750,62,1.3939116503,0.9987029831,0.6706340124,,, +3.9296875000,62,1.3969634546,0.9987029831,0.9681849393,,, +3.9316406250,62,1.4000152590,0.9987029831,0.6126497292,,, +3.9335937500,62,1.4015411612,0.9987029831,0.4570077058,,, +3.9355468750,62,1.4045929656,0.9987029831,0.0404364080,,, +3.9375000000,63,1.4076447700,0.9987029831,0.6111238270,,, +3.9394531250,63,1.4091706722,0.9987029831,0.7759212634,,, +3.9414062500,63,1.4122224765,0.9987029831,0.7652399481,,, +3.9433593750,63,1.4152742809,0.9987029831,0.8628976883,,, +3.9453125000,63,1.4183260853,0.9987029831,0.7789730678,,, +3.9472656250,63,1.4198519875,0.9987029831,0.1518272679,,, +3.9492187500,63,1.4229037919,0.9987029831,0.8445868620,,, +3.9511718750,63,1.4259555962,0.9987029831,0.2082856489,,, +3.9531250000,63,1.4274814984,0.9987029831,0.2998397803,,, +3.9550781250,63,1.4305333028,0.9987029831,0.7179369802,,, +3.9570312500,63,1.4335851072,0.9987029831,0.2403295949,,, +3.9589843750,63,1.4351110094,0.9987029831,0.0846875715,,, +3.9609375000,63,1.4381628138,0.9987029831,0.7042038605,,, +3.9628906250,63,1.4412146181,0.9987029831,0.2418554971,,, +3.9648437500,63,1.4427405203,0.9987029831,0.2647440299,,, +3.9667968750,63,1.4457923247,0.9987029831,0.7347219043,,, +3.9687500000,63,1.4488441291,0.9987029831,0.9727626459,,, +3.9707031250,63,1.4503700313,0.9987029831,0.8155947204,,, +3.9726562500,63,1.4534218357,0.9987029831,0.8628976883,,, +3.9746093750,63,1.4564736400,0.9987029831,0.5088883803,,, +3.9765625000,63,1.4579995422,0.9987029831,0.9773403525,,, +3.9785156250,63,1.4610513466,0.9987029831,0.5302510109,,, +3.9804687500,63,1.4625772488,0.9987029831,0.9254596780,,, +3.9824218750,63,1.4656290532,0.9987029831,0.4005493248,,, +3.9843750000,63,1.4686808576,0.9987029831,0.2830548562,,, +3.9863281250,63,1.4702067597,0.9987029831,0.7194628824,,, +3.9882812500,63,1.4732585641,0.9987029831,0.6019684138,,, +3.9902343750,63,1.4763103685,0.9987029831,0.7881284810,,, +3.9921875000,63,1.4778362707,0.9987029831,0.8949416342,,, +3.9941406250,63,1.4808880751,0.9987029831,0.3425650416,,, +3.9960937500,63,1.4839398795,0.9987029831,0.8339055467,,, +3.9980468750,63,1.4854657816,0.9987029831,0.4295414664,,, +4.0000000000,64,1.4885175860,0.9987029831,0.7728694591,,, +4.0019531250,64,1.4900434882,0.9987029831,0.3517204547,,, +4.0039062500,64,1.4930952926,0.9987029831,0.2952620737,,, +4.0058593750,64,1.4961470970,0.9987029831,0.8049134051,,, +4.0078125000,64,1.4976729992,0.9987029831,0.8186465248,,, +4.0097656250,64,1.5007248035,0.9987029831,0.2906843671,,, +4.0117187500,64,1.5022507057,0.9987029831,0.7331960021,,, +4.0136718750,64,1.5053025101,0.9987029831,0.8384832532,,, +4.0156250000,64,1.5083543145,0.9987029831,0.3471427481,,, +4.0175781250,64,1.5098802167,0.9987029831,0.8644235904,,, +4.0195312500,64,1.5129320211,0.9987029831,0.2265964752,,, +4.0214843750,64,1.5144579232,0.9987029831,0.2510109102,,, +4.0234375000,64,1.5175097276,0.9987029831,0.8644235904,,, +4.0253906250,64,1.5205615320,0.9987029831,0.8964675364,,, +4.0273437500,64,1.5220874342,0.9987029831,0.8079652094,,, +4.0292968750,64,1.5251392386,0.9987029831,0.8690012970,,, +4.0312500000,64,1.5266651408,0.9987029831,0.6782635233,,, +4.0332031250,64,1.5297169451,0.9987029831,0.8979934386,,, +4.0351562500,64,1.5312428473,0.9987029831,0.6157015335,,, +4.0371093750,64,1.5342946517,0.9987029831,0.2327000839,,, +4.0390625000,64,1.5373464561,0.9987029831,0.9300373846,,, +4.0410156250,64,1.5388723583,0.9987029831,0.4722667277,,, +4.0429687500,64,1.5419241627,0.9987029831,0.7209887846,,, +4.0449218750,64,1.5434500649,0.9987029831,0.9346150912,,, +4.0468750000,64,1.5465018692,0.9987029831,0.7667658503,,, +4.0488281250,64,1.5480277714,0.9987029831,0.6446936751,,, +4.0507812500,64,1.5510795758,0.9987029831,0.5088883803,,, +4.0527343750,64,1.5526054780,0.9987029831,0.0984206912,,, +4.0546875000,64,1.5556572824,0.9987029831,0.0877393759,,, +4.0566406250,64,1.5587090867,0.9987029831,0.9895475700,,, +4.0585937500,64,1.5602349889,0.9987029831,0.9239337758,,, +4.0605468750,64,1.5632867933,0.9987029831,0.2815289540,,, +4.0625000000,65,1.5648126955,0.9987029831,0.7667658503,,, +4.0644531250,65,1.5678644999,0.9987029831,0.9437705043,,, +4.0664062500,65,1.5693904021,0.9987029831,0.0938429847,,, +4.0683593750,65,1.5724422065,0.9987029831,0.6858930343,,, +4.0703125000,65,1.5739681086,0.9987029831,0.7820248722,,, +4.0722656250,65,1.5770199130,0.9987029831,0.5119401846,,, +4.0742187500,65,1.5785458152,0.9987029831,0.6462195773,,, +4.0761718750,65,1.5815976196,0.9987029831,0.3608758679,,, +4.0781250000,65,1.5831235218,0.9987029831,0.6202792401,,, +4.0800781250,65,1.5861753262,0.9987029831,0.8125429160,,, +4.0820312500,65,1.5877012284,0.9987029831,0.4020752270,,, +4.0839843750,65,1.5907530327,0.9987029831,0.4081788357,,, +4.0859375000,65,1.5922789349,0.9987029831,0.1411459525,,, +4.0878906250,65,1.5953307393,0.9987029831,0.7423514153,,, +4.0898437500,65,1.5968566415,0.9987029831,0.4936293584,,, +4.0917968750,65,1.5999084459,0.9987029831,0.6538490883,,, +4.0937500000,65,1.6014343481,0.9987029831,0.4127565423,,, +4.0957031250,65,1.6044861524,0.9987029831,0.6172274357,,, +4.0976562500,65,1.6060120546,0.9987029831,0.3990234226,,, +4.0996093750,65,1.6090638590,0.9987029831,0.7606622416,,, +4.1015625000,65,1.6105897612,0.9987029831,0.4951552605,,, +4.1035156250,65,1.6136415656,0.9987029831,0.1686121920,,, +4.1054687500,65,1.6151674678,0.9987029831,0.4753185321,,, +4.1074218750,65,1.6166933700,0.9987029831,0.5012588693,,, +4.1093750000,65,1.6197451743,0.9987029831,0.3624017700,,, +4.1113281250,65,1.6212710765,0.9987029831,0.3578240635,,, +4.1132812500,65,1.6243228809,0.9987029831,0.4615854124,,, +4.1152343750,65,1.6258487831,0.9987029831,0.3074692912,,, +4.1171875000,65,1.6289005875,0.9987029831,0.8079652094,,, +4.1191406250,65,1.6304264897,0.9987029831,0.9071488518,,, +4.1210937500,65,1.6334782940,0.9987029831,0.7301441978,,, +4.1230468750,65,1.6350041962,0.9987029831,0.4295414664,,, +4.1250000000,66,1.6365300984,0.9987029831,0.1518272679,,, +4.1269531250,66,1.6395819028,0.9987029831,0.4982070649,,, +4.1289062500,66,1.6411078050,0.9987029831,0.7011520562,,, +4.1308593750,66,1.6441596094,0.9987029831,0.6309605554,,, +4.1328125000,66,1.6456855116,0.9987029831,0.2281223774,,, +4.1347656250,66,1.6487373159,0.9987029831,0.1533531701,,, +4.1367187500,66,1.6502632181,0.9987029831,0.9666590372,,, +4.1386718750,66,1.6517891203,0.9987029831,0.6477454795,,, +4.1406250000,66,1.6548409247,0.9987029831,0.7469291218,,, +4.1425781250,66,1.6563668269,0.9987029831,0.5958648051,,, +4.1445312500,66,1.6594186313,0.9987029831,0.9193560693,,, +4.1464843750,66,1.6609445335,0.9987029831,0.3715571832,,, +4.1484375000,66,1.6624704356,0.9987029831,0.7148851759,,, +4.1503906250,66,1.6655222400,0.9987029831,0.8461127642,,, +4.1523437500,66,1.6670481422,0.9987029831,0.7454032197,,, +4.1542968750,66,1.6700999466,0.9987029831,0.1716639963,,, +4.1562500000,66,1.6716258488,0.9987029831,0.5012588693,,, +4.1582031250,66,1.6731517510,0.9987029831,0.3959716182,,, +4.1601562500,66,1.6762035554,0.9987029831,0.2143892576,,, +4.1621093750,66,1.6777294575,0.9987029831,0.9636072328,,, +4.1640625000,66,1.6792553597,0.9987029831,0.5867093919,,, +4.1660156250,66,1.6823071641,0.9987029831,0.4356450752,,, +4.1679687500,66,1.6838330663,0.9987029831,0.4524299992,,, +4.1699218750,66,1.6853589685,0.9987029831,0.3501945525,,, +4.1718750000,66,1.6884107729,0.9987029831,0.3486686503,,, +4.1738281250,66,1.6899366751,0.9987029831,0.5836575875,,, +4.1757812500,66,1.6914625772,0.9987029831,0.9681849393,,, +4.1777343750,66,1.6945143816,0.9987029831,0.0236514839,,, +4.1796875000,66,1.6960402838,0.9987029831,0.7042038605,,, +4.1816406250,66,1.6975661860,0.9987029831,0.5241474022,,, +4.1835937500,66,1.7006179904,0.9987029831,0.0083924620,,, +4.1855468750,66,1.7021438926,0.9987029831,0.9529259174,,, +4.1875000000,67,1.7036697948,0.9987029831,0.3730830854,,, +4.1894531250,67,1.7067215991,0.9987029831,0.8918898299,,, +4.1914062500,67,1.7082475013,0.9987029831,0.5531395438,,, +4.1933593750,67,1.7097734035,0.9987029831,0.6721599145,,, +4.1953125000,67,1.7128252079,0.9987029831,0.6080720226,,, +4.1972656250,67,1.7143511101,0.9987029831,0.9224078737,,, +4.1992187500,67,1.7158770123,0.9987029831,0.3013656825,,, +4.2011718750,67,1.7189288167,0.9987029831,0.1518272679,,, +4.2031250000,67,1.7204547189,0.9987029831,0.3807125963,,, +4.2050781250,67,1.7219806210,0.9987029831,0.2525368124,,, +4.2070312500,67,1.7235065232,0.9987029831,0.9086747539,,, +4.2089843750,67,1.7265583276,0.9987029831,0.6645304036,,, +4.2109375000,67,1.7280842298,0.9987029831,0.8537422751,,, +4.2128906250,67,1.7296101320,0.9987029831,0.5317769131,,, +4.2148437500,67,1.7311360342,0.9987029831,0.9864957656,,, +4.2167968750,67,1.7341878386,0.9987029831,0.9010452430,,, +4.2187500000,67,1.7357137407,0.9987029831,0.6172274357,,, +4.2207031250,67,1.7372396429,0.9987029831,0.7850766766,,, +4.2226562500,67,1.7387655451,0.9987029831,0.9880216678,,, +4.2246093750,67,1.7418173495,0.9987029831,0.5958648051,,, +4.2265625000,67,1.7433432517,0.9987029831,0.6034943160,,, +4.2285156250,67,1.7448691539,0.9987029831,0.4264896620,,, +4.2304687500,67,1.7463950561,0.9987029831,0.9651331350,,, +4.2324218750,67,1.7494468605,0.9987029831,0.2800030518,,, +4.2343750000,67,1.7509727626,0.9987029831,0.9239337758,,, +4.2363281250,67,1.7524986648,0.9987029831,0.0923170825,,, +4.2382812500,67,1.7540245670,0.9987029831,0.1853971160,,, +4.2402343750,67,1.7570763714,0.9987029831,0.8339055467,,, +4.2421875000,67,1.7586022736,0.9987029831,0.1747158007,,, +4.2441406250,67,1.7601281758,0.9987029831,0.8705271992,,, +4.2460937500,67,1.7616540780,0.9987029831,0.0572213321,,, +4.2480468750,67,1.7631799802,0.9987029831,0.5271992065,,, +4.2500000000,68,1.7662317845,0.9987029831,0.8354314488,,, +4.2519531250,68,1.7677576867,0.9987029831,0.2204928664,,, +4.2539062500,68,1.7692835889,0.9987029831,0.9346150912,,, +4.2558593750,68,1.7708094911,0.9987029831,0.0968947890,,, +4.2578125000,68,1.7723353933,0.9987029831,0.2296482795,,, +4.2597656250,68,1.7738612955,0.9987029831,0.4921034562,,, +4.2617187500,68,1.7769130999,0.9987029831,0.3166247044,,, +4.2636718750,68,1.7784390021,0.9987029831,0.0679026474,,, +4.2656250000,68,1.7799649042,0.9987029831,0.9864957656,,, +4.2675781250,68,1.7814908064,0.9987029831,0.6599526970,,, +4.2695312500,68,1.7830167086,0.9987029831,0.9422446021,,, +4.2714843750,68,1.7845426108,0.9987029831,0.8857862211,,, +4.2734375000,68,1.7875944152,0.9987029831,0.2510109102,,, +4.2753906250,68,1.7891203174,0.9987029831,0.3822384985,,, +4.2773437500,68,1.7906462196,0.9987029831,0.8934157321,,, +4.2792968750,68,1.7921721218,0.9987029831,0.1426718547,,, +4.2812500000,68,1.7936980240,0.9987029831,0.3883421073,,, +4.2832031250,68,1.7952239261,0.9987029831,0.4142824445,,, +4.2851562500,68,1.7967498283,0.9987029831,0.4676890211,,, +4.2871093750,68,1.7982757305,0.9987029831,0.9925993744,,, +4.2890625000,68,1.8013275349,0.9987029831,0.5821316854,,, +4.2910156250,68,1.8028534371,0.9987029831,0.8979934386,,, +4.2929687500,68,1.8043793393,0.9987029831,0.6889448386,,, +4.2949218750,68,1.8059052415,0.9987029831,0.9666590372,,, +4.2968750000,68,1.8074311437,0.9987029831,0.3318837263,,, +4.2988281250,68,1.8089570459,0.9987029831,0.6050202182,,, +4.3007812500,68,1.8104829480,0.9987029831,0.6630045014,,, +4.3027343750,68,1.8120088502,0.9987029831,0.2616922255,,, +4.3046875000,68,1.8135347524,0.9987029831,0.8766308080,,, +4.3066406250,68,1.8150606546,0.9987029831,0.5577172503,,, +4.3085937500,68,1.8165865568,0.9987029831,0.8354314488,,, +4.3105468750,68,1.8181124590,0.9987029831,0.2494850080,,, +4.3125000000,69,1.8211642634,0.9987029831,0.0633249409,,, +4.3144531250,69,1.8226901656,0.9987029831,0.7682917525,,, +4.3164062500,69,1.8242160678,0.9987029831,0.3089951934,,, +4.3183593750,69,1.8257419699,0.9987029831,0.7866025788,,, +4.3203125000,69,1.8272678721,0.9987029831,0.7240405890,,, +4.3222656250,69,1.8287937743,0.9987029831,0.0831616693,,, +4.3242187500,69,1.8303196765,0.9987029831,0.0892652781,,, +4.3261718750,69,1.8318455787,0.9987029831,0.9544518196,,, +4.3281250000,69,1.8333714809,0.9987029831,0.0282291905,,, +4.3300781250,69,1.8348973831,0.9987029831,0.0511177234,,, +4.3320312500,69,1.8364232853,0.9987029831,0.7255664912,,, +4.3339843750,69,1.8379491875,0.9987029831,0.2235446708,,, +4.3359375000,69,1.8394750896,0.9987029831,0.5958648051,,, +4.3378906250,69,1.8410009918,0.9987029831,0.8796826123,,, +4.3398437500,69,1.8425268940,0.9987029831,0.1319905394,,, +4.3417968750,69,1.8440527962,0.9987029831,0.5851834897,,, +4.3437500000,69,1.8455786984,0.9987029831,0.9468223087,,, +4.3457031250,69,1.8471046006,0.9987029831,0.9193560693,,, +4.3476562500,69,1.8486305028,0.9987029831,0.4188601511,,, +4.3496093750,69,1.8501564050,0.9987029831,0.1182574197,,, +4.3515625000,69,1.8516823072,0.9987029831,0.1060502022,,, +4.3535156250,69,1.8532082094,0.9987029831,0.8583199817,,, +4.3554687500,69,1.8547341115,0.9987029831,0.5256733043,,, +4.3574218750,69,1.8562600137,0.9987029831,0.2098115511,,, +4.3593750000,69,1.8577859159,0.9987029831,0.3303578241,,, +4.3613281250,69,1.8593118181,0.9987029831,0.2403295949,,, +4.3632812500,69,1.8608377203,0.9987029831,0.7331960021,,, +4.3652343750,69,1.8608377203,0.9987029831,0.8125429160,,, +4.3671875000,69,1.8623636225,0.9987029831,0.1915007248,,, +4.3691406250,69,1.8638895247,0.9987029831,0.2327000839,,, +4.3710937500,69,1.8654154269,0.9987029831,0.9224078737,,, +4.3730468750,69,1.8669413291,0.9987029831,0.8735790036,,, +4.3750000000,70,1.8684672313,0.9987029831,0.1853971160,,, +4.3769531250,70,1.8699931334,0.9987029831,0.6813153277,,, +4.3789062500,70,1.8715190356,0.9987029831,0.9147783627,,, +4.3808593750,70,1.8730449378,0.9987029831,0.4386968795,,, +4.3828125000,70,1.8745708400,0.9987029831,0.6950484474,,, +4.3847656250,70,1.8760967422,0.9987029831,0.3059433890,,, +4.3867187500,70,1.8776226444,0.9987029831,0.2235446708,,, +4.3886718750,70,1.8776226444,0.9987029831,0.0190737774,,, +4.3906250000,70,1.8791485466,0.9987029831,0.9636072328,,, +4.3925781250,70,1.8806744488,0.9987029831,0.1655603876,,, +4.3945312500,70,1.8822003510,0.9987029831,0.1991302358,,, +4.3964843750,70,1.8837262531,0.9987029831,0.3212024109,,, +4.3984375000,70,1.8852521553,0.9987029831,0.3990234226,,, +4.4003906250,70,1.8867780575,0.9987029831,0.0968947890,,, +4.4023437500,70,1.8883039597,0.9987029831,0.6858930343,,, +4.4042968750,70,1.8883039597,0.9987029831,0.3501945525,,, +4.4062500000,70,1.8898298619,0.9987029831,0.7576104372,,, +4.4082031250,70,1.8913557641,0.9987029831,0.2754253452,,, +4.4101562500,70,1.8928816663,0.9987029831,0.2540627146,,, +4.4121093750,70,1.8944075685,0.9987029831,0.6767376211,,, +4.4140625000,70,1.8959334707,0.9987029831,0.5958648051,,, +4.4160156250,70,1.8959334707,0.9987029831,0.1838712139,,, +4.4179687500,70,1.8974593729,0.9987029831,0.4524299992,,, +4.4199218750,70,1.8989852750,0.9987029831,0.1808194095,,, +4.4218750000,70,1.9005111772,0.9987029831,0.5241474022,,, +4.4238281250,70,1.9020370794,0.9987029831,0.3425650416,,, +4.4257812500,70,1.9020370794,0.9987029831,0.9483482109,,, +4.4277343750,70,1.9035629816,0.9987029831,0.8293278401,,, +4.4296875000,70,1.9050888838,0.9987029831,0.4692149233,,, +4.4316406250,70,1.9066147860,0.9987029831,0.1441977569,,, +4.4335937500,70,1.9081406882,0.9987029831,0.5378805219,,, +4.4355468750,70,1.9081406882,0.9987029831,0.4982070649,,, +4.4375000000,71,1.9096665904,0.9987029831,0.3868162051,,, +4.4394531250,71,1.9111924926,0.9987029831,0.0099183642,,, +4.4414062500,71,1.9127183948,0.9987029831,0.5333028153,,, +4.4433593750,71,1.9127183948,0.9987029831,0.0160219730,,, +4.4453125000,71,1.9142442969,0.9987029831,0.4234378576,,, +4.4472656250,71,1.9157701991,0.9987029831,0.2983138781,,, +4.4492187500,71,1.9172961013,0.9987029831,0.7927061875,,, +4.4511718750,71,1.9172961013,0.9987029831,0.6324864576,,, +4.4531250000,71,1.9188220035,0.9987029831,0.9925993744,,, +4.4550781250,71,1.9203479057,0.9987029831,0.5455100328,,, +4.4570312500,71,1.9203479057,0.9987029831,0.8522163729,,, +4.4589843750,71,1.9218738079,0.9987029831,0.6034943160,,, +4.4609375000,71,1.9233997101,0.9987029831,0.5058365759,,, +4.4628906250,71,1.9249256123,0.9987029831,0.2784771496,,, +4.4648437500,71,1.9249256123,0.9987029831,0.2830548562,,, +4.4667968750,71,1.9264515145,0.9987029831,0.1487754635,,, +4.4687500000,71,1.9279774166,0.9987029831,0.0114442664,,, +4.4707031250,71,1.9279774166,0.9987029831,0.7942320897,,, +4.4726562500,71,1.9295033188,0.9987029831,0.4859998474,,, +4.4746093750,71,1.9310292210,0.9987029831,0.7850766766,,, +4.4765625000,71,1.9310292210,0.9987029831,0.6660563058,,, +4.4785156250,71,1.9325551232,0.9987029831,0.4310673686,,, +4.4804687500,71,1.9340810254,0.9987029831,0.8949416342,,, +4.4824218750,71,1.9340810254,0.9987029831,0.6813153277,,, +4.4843750000,71,1.9356069276,0.9987029831,0.2006561379,,, +4.4863281250,71,1.9371328298,0.9987029831,0.2494850080,,, +4.4882812500,71,1.9371328298,0.9987029831,0.2006561379,,, +4.4902343750,71,1.9386587320,0.9987029831,0.1991302358,,, +4.4921875000,71,1.9401846342,0.9987029831,0.5928130007,,, +4.4941406250,71,1.9401846342,0.9987029831,0.7728694591,,, +4.4960937500,71,1.9417105364,0.9987029831,0.5577172503,,, +4.4980468750,71,1.9432364385,0.9987029831,0.7530327306,,, +4.5000000000,72,1.9432364385,0.9987029831,0.6370641642,,, +4.5019531250,72,1.9447623407,0.9987029831,0.5912870985,,, +4.5039062500,72,1.9447623407,0.9987029831,0.8201724269,,, +4.5058593750,72,1.9462882429,0.9987029831,0.8537422751,,, +4.5078125000,72,1.9478141451,0.9987029831,0.7545586328,,, +4.5097656250,72,1.9478141451,0.9987029831,0.5928130007,,, +4.5117187500,72,1.9493400473,0.9987029831,0.3852903029,,, +4.5136718750,72,1.9493400473,0.9987029831,0.7103074693,,, +4.5156250000,72,1.9508659495,0.9987029831,0.1991302358,,, +4.5175781250,72,1.9508659495,0.9987029831,0.7560845350,,, +4.5195312500,72,1.9523918517,0.9987029831,0.8262760357,,, +4.5214843750,72,1.9539177539,0.9987029831,0.5439841306,,, +4.5234375000,72,1.9539177539,0.9987029831,0.2983138781,,, +4.5253906250,72,1.9554436561,0.9987029831,0.3868162051,,, +4.5273437500,72,1.9554436561,0.9987029831,0.8506904707,,, +4.5292968750,72,1.9569695583,0.9987029831,0.0862134737,,, +4.5312500000,72,1.9569695583,0.9987029831,0.1136797131,,, +4.5332031250,72,1.9584954604,0.9987029831,0.3700312810,,, +4.5351562500,72,1.9584954604,0.9987029831,0.1869230182,,, +4.5371093750,72,1.9600213626,0.9987029831,0.3532463569,,, +4.5390625000,72,1.9600213626,0.9987029831,0.5348287175,,, +4.5410156250,72,1.9615472648,0.9987029831,0.9529259174,,, +4.5429687500,72,1.9615472648,0.9987029831,0.4661631189,,, +4.5449218750,72,1.9630731670,0.9987029831,0.0297550927,,, +4.5468750000,72,1.9630731670,0.9987029831,0.2052338445,,, +4.5488281250,72,1.9645990692,0.9987029831,0.1777676051,,, +4.5507812500,72,1.9645990692,0.9987029831,0.4585336080,,, +4.5527343750,72,1.9661249714,0.9987029831,0.4463263905,,, +4.5546875000,72,1.9661249714,0.9987029831,0.6614785992,,, +4.5566406250,72,1.9676508736,0.9987029831,0.1777676051,,, +4.5585937500,72,1.9676508736,0.9987029831,0.1411459525,,, +4.5605468750,72,1.9691767758,0.9987029831,0.1365682460,,, +4.5625000000,73,1.9691767758,0.9987029831,0.3456168460,,, +4.5644531250,73,1.9707026780,0.9987029831,0.0328068971,,, +4.5664062500,73,1.9707026780,0.9987029831,0.3349355306,,, +4.5683593750,73,1.9707026780,0.9987029831,0.7026779583,,, +4.5703125000,73,1.9722285801,0.9987029831,0.2159151598,,, +4.5722656250,73,1.9722285801,0.9987029831,0.4005493248,,, +4.5742187500,73,1.9737544823,0.9987029831,0.6370641642,,, +4.5761718750,73,1.9737544823,0.9987029831,0.6309605554,,, +4.5781250000,73,1.9752803845,0.9987029831,0.2876325628,,, +4.5800781250,73,1.9752803845,0.9987029831,0.3608758679,,, +4.5820312500,73,1.9752803845,0.9987029831,0.0968947890,,, +4.5839843750,73,1.9768062867,0.9987029831,0.0602731365,,, +4.5859375000,73,1.9768062867,0.9987029831,0.5912870985,,, +4.5878906250,73,1.9783321889,0.9987029831,0.5790798810,,, +4.5898437500,73,1.9783321889,0.9987029831,0.1625085832,,, +4.5917968750,73,1.9783321889,0.9987029831,0.6324864576,,, +4.5937500000,73,1.9798580911,0.9987029831,0.2830548562,,, +4.5957031250,73,1.9798580911,0.9987029831,0.8400091554,,, +4.5976562500,73,1.9798580911,0.9987029831,0.1823453117,,, +4.5996093750,73,1.9813839933,0.9987029831,0.8781567102,,, +4.6015625000,73,1.9813839933,0.9987029831,0.3700312810,,, +4.6035156250,73,1.9813839933,0.9987029831,0.5500877394,,, +4.6054687500,73,1.9829098955,0.9987029831,0.4417486839,,, +4.6074218750,73,1.9829098955,0.9987029831,0.0343327993,,, +4.6093750000,73,1.9829098955,0.9987029831,0.5928130007,,, +4.6113281250,73,1.9844357977,0.9987029831,0.3105210956,,, +4.6132812500,73,1.9844357977,0.9987029831,0.3425650416,,, +4.6152343750,73,1.9844357977,0.9987029831,0.3227283131,,, +4.6171875000,73,1.9859616999,0.9987029831,0.3471427481,,, +4.6191406250,73,1.9859616999,0.9987029831,0.1533531701,,, +4.6210937500,73,1.9859616999,0.9987029831,0.3181506065,,, +4.6230468750,73,1.9874876020,0.9987029831,0.3318837263,,, +4.6250000000,74,1.9874876020,0.9987029831,0.8812085145,,, +4.6269531250,74,1.9874876020,0.9987029831,0.6126497292,,, +4.6289062500,74,1.9874876020,0.9987029831,0.0984206912,,, +4.6308593750,74,1.9890135042,0.9987029831,0.0251773861,,, +4.6328125000,74,1.9890135042,0.9987029831,0.5989166094,,, +4.6347656250,74,1.9890135042,0.9987029831,0.2723735409,,, +4.6367187500,74,1.9905394064,0.9987029831,0.4493781949,,, +4.6386718750,74,1.9905394064,0.9987029831,0.8384832532,,, +4.6406250000,74,1.9905394064,0.9987029831,0.3334096284,,, +4.6425781250,74,1.9905394064,0.9987029831,0.7469291218,,, +4.6445312500,74,1.9905394064,0.9987029831,0.3868162051,,, +4.6464843750,74,1.9920653086,0.9987029831,0.2540627146,,, +4.6484375000,74,1.9920653086,0.9987029831,0.3135729000,,, +4.6503906250,74,1.9920653086,0.9987029831,0.2220187686,,, +4.6523437500,74,1.9920653086,0.9987029831,0.1930266270,,, +4.6542968750,74,1.9935912108,0.9987029831,0.6691081102,,, +4.6562500000,74,1.9935912108,0.9987029831,0.7072556649,,, +4.6582031250,74,1.9935912108,0.9987029831,0.7682917525,,, +4.6601562500,74,1.9935912108,0.9987029831,0.8033875029,,, +4.6621093750,74,1.9935912108,0.9987029831,0.7301441978,,, +4.6640625000,74,1.9951171130,0.9987029831,0.6981002518,,, +4.6660156250,74,1.9951171130,0.9987029831,0.9514000153,,, +4.6679687500,74,1.9951171130,0.9987029831,0.3486686503,,, +4.6699218750,74,1.9951171130,0.9987029831,0.9330891890,,, +4.6718750000,74,1.9951171130,0.9987029831,0.2723735409,,, +4.6738281250,74,1.9951171130,0.9987029831,0.1701380941,,, +4.6757812500,74,1.9966430152,0.9987029831,0.0541695277,,, +4.6777343750,74,1.9966430152,0.9987029831,0.9178301671,,, +4.6796875000,74,1.9966430152,0.9987029831,0.5088883803,,, +4.6816406250,74,1.9966430152,0.9987029831,0.0404364080,,, +4.6835937500,74,1.9966430152,0.9987029831,0.4997329671,,, +4.6855468750,74,1.9966430152,0.9987029831,0.2311741817,,, +4.6875000000,75,1.9966430152,0.9987029831,0.6858930343,,, +4.6894531250,75,1.9966430152,0.9987029831,0.9163042649,,, +4.6914062500,75,1.9981689174,0.9987029831,0.2937361715,,, +4.6933593750,75,1.9981689174,0.9987029831,0.2693217365,,, +4.6953125000,75,1.9981689174,0.9987029831,0.7804989700,,, +4.6972656250,75,1.9981689174,0.9987029831,0.7591363394,,, +4.6992187500,75,1.9981689174,0.9987029831,0.1503013657,,, +4.7011718750,75,1.9981689174,0.9987029831,0.6843671321,,, +4.7031250000,75,1.9981689174,0.9987029831,0.4234378576,,, +4.7050781250,75,1.9981689174,0.9987029831,0.1136797131,,, +4.7070312500,75,1.9981689174,0.9987029831,0.2983138781,,, +4.7089843750,75,1.9981689174,0.9987029831,0.2327000839,,, +4.7109375000,75,1.9981689174,0.9987029831,0.9117265583,,, +4.7128906250,75,1.9981689174,0.9987029831,0.7835507744,,, +4.7148437500,75,1.9996948196,0.9987029831,0.5226215000,,, +4.7167968750,75,1.9996948196,0.9987029831,0.1411459525,,, +4.7187500000,75,1.9996948196,0.9987029831,0.2006561379,,, +4.7207031250,75,1.9996948196,0.9987029831,0.4219119554,,, +4.7226562500,75,1.9996948196,0.9987029831,0.2845807584,,, +4.7246093750,75,1.9996948196,0.9987029831,0.9941252766,,, +4.7265625000,75,1.9996948196,0.9987029831,0.7423514153,,, +4.7285156250,75,1.9996948196,0.9987029831,0.8735790036,,, +4.7304687500,75,1.9996948196,0.9987029831,0.6904707408,,, +4.7324218750,75,1.9996948196,0.9987029831,0.4692149233,,, +4.7343750000,75,1.9996948196,0.9987029831,0.3517204547,,, +4.7363281250,75,1.9996948196,0.9987029831,0.0892652781,,, +4.7382812500,75,1.9996948196,0.9987029831,0.1426718547,,, +4.7402343750,75,1.9996948196,0.9987029831,0.3608758679,,, +4.7421875000,75,1.9996948196,0.9987029831,0.2372777905,,, +4.7441406250,75,1.9996948196,0.9987029831,0.9056229496,,, +4.7460937500,75,1.9996948196,0.9987029831,0.0572213321,,, +4.7480468750,75,1.9996948196,0.9987029831,0.6767376211,,, +4.7500000000,76,1.9981689174,0.9987029831,0.4661631189,,, +4.7519531250,76,1.9981689174,0.9987029831,0.2616922255,,, +4.7539062500,76,1.9981689174,0.9987029831,0.0175478752,,, +4.7558593750,76,1.9981689174,0.9987029831,0.6492713817,,, +4.7578125000,76,1.9981689174,0.9987029831,0.9971770809,,, +4.7597656250,76,1.9981689174,0.9987029831,0.6553749905,,, +4.7617187500,76,1.9981689174,0.9987029831,0.0587472343,,, +4.7636718750,76,1.9981689174,0.9987029831,0.9941252766,,, +4.7656250000,76,1.9981689174,0.9987029831,0.2510109102,,, +4.7675781250,76,1.9981689174,0.9987029831,0.5149919890,,, +4.7695312500,76,1.9981689174,0.9987029831,0.2723735409,,, +4.7714843750,76,1.9981689174,0.9987029831,0.2418554971,,, +4.7734375000,76,1.9981689174,0.9987029831,0.5745021744,,, +4.7753906250,76,1.9966430152,0.9987029831,0.2372777905,,, +4.7773437500,76,1.9966430152,0.9987029831,0.9529259174,,, +4.7792968750,76,1.9966430152,0.9987029831,0.2616922255,,, +4.7812500000,76,1.9966430152,0.9987029831,0.4173342489,,, +4.7832031250,76,1.9966430152,0.9987029831,0.7927061875,,, +4.7851562500,76,1.9966430152,0.9987029831,0.5745021744,,, +4.7871093750,76,1.9966430152,0.9987029831,0.2677958343,,, +4.7890625000,76,1.9951171130,0.9987029831,0.3547722591,,, +4.7910156250,76,1.9951171130,0.9987029831,0.9758144503,,, +4.7929687500,76,1.9951171130,0.9987029831,0.0480659190,,, +4.7949218750,76,1.9951171130,0.9987029831,0.0663767453,,, +4.7968750000,76,1.9951171130,0.9987029831,0.2937361715,,, +4.7988281250,76,1.9951171130,0.9987029831,0.8659494926,,, +4.8007812500,76,1.9935912108,0.9987029831,0.9727626459,,, +4.8027343750,76,1.9935912108,0.9987029831,0.3685053788,,, +4.8046875000,76,1.9935912108,0.9987029831,0.9788662547,,, +4.8066406250,76,1.9935912108,0.9987029831,0.3746089876,,, +4.8085937500,76,1.9935912108,0.9987029831,0.7560845350,,, +4.8105468750,76,1.9920653086,0.9987029831,0.9208819715,,, +4.8125000000,77,1.9920653086,0.9987029831,0.5027847715,,, +4.8144531250,77,1.9920653086,0.9987029831,0.5302510109,,, +4.8164062500,77,1.9920653086,0.9987029831,0.3425650416,,, +4.8183593750,77,1.9920653086,0.9987029831,0.1792935073,,, +4.8203125000,77,1.9905394064,0.9987029831,0.9819180591,,, +4.8222656250,77,1.9905394064,0.9987029831,0.0129701686,,, +4.8242187500,77,1.9905394064,0.9987029831,0.3196765087,,, +4.8261718750,77,1.9905394064,0.9987029831,0.1777676051,,, +4.8281250000,77,1.9890135042,0.9987029831,0.9315632868,,, +4.8300781250,77,1.9890135042,0.9987029831,0.5058365759,,, +4.8320312500,77,1.9890135042,0.9987029831,0.2769512474,,, +4.8339843750,77,1.9890135042,0.9987029831,0.6477454795,,, +4.8359375000,77,1.9874876020,0.9987029831,0.4173342489,,, +4.8378906250,77,1.9874876020,0.9987029831,0.6141756313,,, +4.8398437500,77,1.9874876020,0.9987029831,0.3944457160,,, +4.8417968750,77,1.9859616999,0.9987029831,0.5592431525,,, +4.8437500000,77,1.9859616999,0.9987029831,0.5882352941,,, +4.8457031250,77,1.9859616999,0.9987029831,0.4386968795,,, +4.8476562500,77,1.9844357977,0.9987029831,0.2601663233,,, +4.8496093750,77,1.9844357977,0.9987029831,0.2265964752,,, +4.8515625000,77,1.9844357977,0.9987029831,0.1060502022,,, +4.8535156250,77,1.9844357977,0.9987029831,0.8140688182,,, +4.8554687500,77,1.9829098955,0.9987029831,0.5897611963,,, +4.8574218750,77,1.9829098955,0.9987029831,0.9666590372,,, +4.8593750000,77,1.9829098955,0.9987029831,0.4890516518,,, +4.8613281250,77,1.9813839933,0.9987029831,0.1487754635,,, +4.8632812500,77,1.9813839933,0.9987029831,0.4631113146,,, +4.8652343750,77,1.9798580911,0.9987029831,0.5897611963,,, +4.8671875000,77,1.9798580911,0.9987029831,0.5241474022,,, +4.8691406250,77,1.9798580911,0.9987029831,0.9880216678,,, +4.8710937500,77,1.9783321889,0.9987029831,0.1869230182,,, +4.8730468750,77,1.9783321889,0.9987029831,0.3654535744,,, +4.8750000000,78,1.9783321889,0.9987029831,0.6355382620,,, +4.8769531250,78,1.9768062867,0.9987029831,0.1304646372,,, +4.8789062500,78,1.9768062867,0.9987029831,0.9529259174,,, +4.8808593750,78,1.9752803845,0.9987029831,0.7804989700,,, +4.8828125000,78,1.9752803845,0.9987029831,0.9910734722,,, +4.8847656250,78,1.9752803845,0.9987029831,0.4814221408,,, +4.8867187500,78,1.9737544823,0.9987029831,0.2967879759,,, +4.8886718750,78,1.9737544823,0.9987029831,0.8903639277,,, +4.8906250000,78,1.9722285801,0.9987029831,0.1228351263,,, +4.8925781250,78,1.9722285801,0.9987029831,0.2937361715,,, +4.8945312500,78,1.9722285801,0.9987029831,0.6187533379,,, +4.8964843750,78,1.9707026780,0.9987029831,0.4783703365,,, +4.8984375000,78,1.9707026780,0.9987029831,0.9681849393,,, +4.9003906250,78,1.9691767758,0.9987029831,0.5806057832,,, +4.9023437500,78,1.9691767758,0.9987029831,0.5073624781,,, +4.9042968750,78,1.9676508736,0.9987029831,0.7362478065,,, +4.9062500000,78,1.9676508736,0.9987029831,0.7316700999,,, +4.9082031250,78,1.9661249714,0.9987029831,0.1304646372,,, +4.9101562500,78,1.9661249714,0.9987029831,0.2677958343,,, +4.9121093750,78,1.9645990692,0.9987029831,0.7957579919,,, +4.9140625000,78,1.9645990692,0.9987029831,0.8125429160,,, +4.9160156250,78,1.9630731670,0.9987029831,0.8476386664,,, +4.9179687500,78,1.9630731670,0.9987029831,0.1396200504,,, +4.9199218750,78,1.9630731670,0.9987029831,0.0389105058,,, +4.9218750000,78,1.9615472648,0.9987029831,0.8934157321,,, +4.9238281250,78,1.9600213626,0.9987029831,0.8476386664,,, +4.9257812500,78,1.9600213626,0.9987029831,0.2738994430,,, +4.9277343750,78,1.9584954604,0.9987029831,0.1915007248,,, +4.9296875000,78,1.9584954604,0.9987029831,0.7316700999,,, +4.9316406250,78,1.9569695583,0.9987029831,0.0450141146,,, +4.9335937500,78,1.9569695583,0.9987029831,0.7759212634,,, +4.9355468750,78,1.9554436561,0.9987029831,0.6446936751,,, +4.9375000000,79,1.9554436561,0.9987029831,0.3883421073,,, +4.9394531250,79,1.9539177539,0.9987029831,0.8476386664,,, +4.9414062500,79,1.9539177539,0.9987029831,0.8430609598,,, +4.9433593750,79,1.9523918517,0.9987029831,0.0328068971,,, +4.9453125000,79,1.9523918517,0.9987029831,0.9040970474,,, +4.9472656250,79,1.9508659495,0.9987029831,0.9010452430,,, +4.9492187500,79,1.9493400473,0.9987029831,0.7331960021,,, +4.9511718750,79,1.9493400473,0.9987029831,0.1762417029,,, +4.9531250000,79,1.9478141451,0.9987029831,0.9330891890,,, +4.9550781250,79,1.9478141451,0.9987029831,0.4249637598,,, +4.9570312500,79,1.9462882429,0.9987029831,0.8674753948,,, +4.9589843750,79,1.9462882429,0.9987029831,0.3898680095,,, +4.9609375000,79,1.9447623407,0.9987029831,0.6538490883,,, +4.9628906250,79,1.9432364385,0.9987029831,0.1792935073,,, +4.9648437500,79,1.9432364385,0.9987029831,0.7209887846,,, +4.9667968750,79,1.9417105364,0.9987029831,0.6706340124,,, +4.9687500000,79,1.9401846342,0.9987029831,0.8094911116,,, +4.9707031250,79,1.9401846342,0.9987029831,0.7835507744,,, +4.9726562500,79,1.9386587320,0.9987029831,0.1976043336,,, +4.9746093750,79,1.9386587320,0.9987029831,0.0389105058,,, +4.9765625000,79,1.9371328298,0.9987029831,0.6462195773,,, +4.9785156250,79,1.9356069276,0.9987029831,0.7347219043,,, +4.9804687500,79,1.9356069276,0.9987029831,0.6889448386,,, +4.9824218750,79,1.9340810254,0.9987029831,0.7270923934,,, +4.9843750000,79,1.9325551232,0.9987029831,0.6095979248,,, +4.9863281250,79,1.9325551232,0.9987029831,0.4814221408,,, +4.9882812500,79,1.9310292210,0.9987029831,0.1274128328,,, +4.9902343750,79,1.9295033188,0.9987029831,0.9620813306,,, +4.9921875000,79,1.9295033188,0.9987029831,0.6370641642,,, +4.9941406250,79,1.9279774166,0.9987029831,0.5897611963,,, +4.9960937500,79,1.9264515145,0.9987029831,0.0968947890,,, +4.9980468750,79,1.9264515145,0.9987029831,0.9925993744,,, +5.0000000000,80,1.9249256123,0.9987029831,0.1441977569,,, +5.0019531250,80,1.9233997101,0.9987029831,0.5821316854,,, +5.0039062500,80,1.9218738079,0.9987029831,0.6034943160,,, +5.0058593750,80,1.9218738079,0.9987029831,0.5607690547,,, +5.0078125000,80,1.9203479057,0.9987029831,0.6233310445,,, +5.0097656250,80,1.9188220035,0.9987029831,0.3578240635,,, +5.0117187500,80,1.9188220035,0.9987029831,0.5607690547,,, +5.0136718750,80,1.9172961013,0.9987029831,0.5134660868,,, +5.0156250000,80,1.9157701991,0.9987029831,0.0282291905,,, +5.0175781250,80,1.9142442969,0.9987029831,0.4402227817,,, +5.0195312500,80,1.9142442969,0.9987029831,0.0755321584,,, +5.0214843750,80,1.9127183948,0.9987029831,0.5073624781,,, +5.0234375000,80,1.9111924926,0.9987029831,0.9224078737,,, +5.0253906250,80,1.9096665904,0.9987029831,0.0465400168,,, +5.0273437500,80,1.9096665904,0.9987029831,0.9346150912,,, +5.0292968750,80,1.9081406882,0.9987029831,0.1152056153,,, +5.0312500000,80,1.9066147860,0.9987029831,-0.0007629511,,, +5.0332031250,80,1.9050888838,0.9987029831,0.6187533379,,, +5.0351562500,80,1.9035629816,0.9987029831,0.5699244678,,, +5.0371093750,80,1.9035629816,0.9987029831,0.1655603876,,, +5.0390625000,80,1.9020370794,0.9987029831,0.9575036240,,, +5.0410156250,80,1.9005111772,0.9987029831,0.3578240635,,, +5.0429687500,80,1.8989852750,0.9987029831,0.2800030518,,, +5.0449218750,80,1.8974593729,0.9987029831,0.8598458839,,, +5.0468750000,80,1.8974593729,0.9987029831,0.2754253452,,, +5.0488281250,80,1.8959334707,0.9987029831,0.3822384985,,, +5.0507812500,80,1.8944075685,0.9987029831,0.1930266270,,, +5.0527343750,80,1.8928816663,0.9987029831,0.9925993744,,, +5.0546875000,80,1.8913557641,0.9987029831,0.1869230182,,, +5.0566406250,80,1.8898298619,0.9987029831,0.6279087510,,, +5.0585937500,80,1.8898298619,0.9987029831,0.7072556649,,, +5.0605468750,80,1.8883039597,0.9987029831,0.2693217365,,, +5.0625000000,81,1.8867780575,0.9987029831,0.3883421073,,, +5.0644531250,81,1.8852521553,0.9987029831,0.5836575875,,, +5.0664062500,81,1.8837262531,0.9987029831,0.8705271992,,, +5.0683593750,81,1.8822003510,0.9987029831,0.4554818036,,, +5.0703125000,81,1.8806744488,0.9987029831,0.7469291218,,, +5.0722656250,81,1.8806744488,0.9987029831,0.9346150912,,, +5.0742187500,81,1.8791485466,0.9987029831,0.8690012970,,, +5.0761718750,81,1.8776226444,0.9987029831,0.7820248722,,, +5.0781250000,81,1.8760967422,0.9987029831,0.1594567788,,, +5.0800781250,81,1.8745708400,0.9987029831,0.9666590372,,, +5.0820312500,81,1.8730449378,0.9987029831,0.0694285496,,, +5.0839843750,81,1.8715190356,0.9987029831,0.5760280766,,, +5.0859375000,81,1.8699931334,0.9987029831,0.3120469978,,, +5.0878906250,81,1.8684672313,0.9987029831,0.8110170138,,, +5.0898437500,81,1.8669413291,0.9987029831,0.7194628824,,, +5.0917968750,81,1.8669413291,0.9987029831,0.5134660868,,, +5.0937500000,81,1.8654154269,0.9987029831,0.4982070649,,, +5.0957031250,81,1.8638895247,0.9987029831,0.0343327993,,, +5.0976562500,81,1.8623636225,0.9987029831,0.9056229496,,, +5.0996093750,81,1.8608377203,0.9987029831,0.9361409934,,, +5.1015625000,81,1.8593118181,0.9987029831,0.9315632868,,, +5.1035156250,81,1.8577859159,0.9987029831,0.5958648051,,, +5.1054687500,81,1.8562600137,0.9987029831,0.0389105058,,, +5.1074218750,81,1.8547341115,0.9987029831,0.0602731365,,, +5.1093750000,81,1.8532082094,0.9987029831,0.2342259861,,, +5.1113281250,81,1.8516823072,0.9987029831,0.2571145190,,, +5.1132812500,81,1.8501564050,0.9987029831,0.7682917525,,, +5.1152343750,81,1.8486305028,0.9987029831,0.5134660868,,, +5.1171875000,81,1.8471046006,0.9987029831,0.3135729000,,, +5.1191406250,81,1.8455786984,0.9987029831,0.0312809949,,, +5.1210937500,81,1.8440527962,0.9987029831,0.9712367437,,, +5.1230468750,81,1.8425268940,0.9987029831,0.2494850080,,, +5.1250000000,82,1.8410009918,0.9987029831,0.4280155642,,, +5.1269531250,82,1.8394750896,0.9987029831,0.8522163729,,, +5.1289062500,82,1.8379491875,0.9987029831,0.2098115511,,, +5.1308593750,82,1.8364232853,0.9987029831,0.3486686503,,, +5.1328125000,82,1.8348973831,0.9987029831,0.3715571832,,, +5.1347656250,82,1.8333714809,0.9987029831,0.8918898299,,, +5.1367187500,82,1.8318455787,0.9987029831,0.9544518196,,, +5.1386718750,82,1.8303196765,0.9987029831,0.3089951934,,, +5.1406250000,82,1.8287937743,0.9987029831,0.3318837263,,, +5.1425781250,82,1.8272678721,0.9987029831,0.5943389029,,, +5.1445312500,82,1.8257419699,0.9987029831,0.5470359350,,, +5.1464843750,82,1.8242160678,0.9987029831,0.3456168460,,, +5.1484375000,82,1.8226901656,0.9987029831,0.1625085832,,, +5.1503906250,82,1.8211642634,0.9987029831,0.4509040970,,, +5.1523437500,82,1.8196383612,0.9987029831,0.0175478752,,, +5.1542968750,82,1.8181124590,0.9987029831,0.8140688182,,, +5.1562500000,82,1.8165865568,0.9987029831,0.3852903029,,, +5.1582031250,82,1.8150606546,0.9987029831,0.7011520562,,, +5.1601562500,82,1.8135347524,0.9987029831,0.6111238270,,, +5.1621093750,82,1.8104829480,0.9987029831,0.3410391394,,, +5.1640625000,82,1.8089570459,0.9987029831,0.6523231861,,, +5.1660156250,82,1.8074311437,0.9987029831,0.1701380941,,, +5.1679687500,82,1.8059052415,0.9987029831,0.9025711452,,, +5.1699218750,82,1.8043793393,0.9987029831,0.3105210956,,, +5.1718750000,82,1.8028534371,0.9987029831,0.5882352941,,, +5.1738281250,82,1.8013275349,0.9987029831,0.3791866941,,, +5.1757812500,82,1.7998016327,0.9987029831,0.8690012970,,, +5.1777343750,82,1.7982757305,0.9987029831,0.1609826810,,, +5.1796875000,82,1.7967498283,0.9987029831,0.6584267948,,, +5.1816406250,82,1.7936980240,0.9987029831,0.4081788357,,, +5.1835937500,82,1.7921721218,0.9987029831,0.2113374533,,, +5.1855468750,82,1.7906462196,0.9987029831,0.1091020066,,, +5.1875000000,83,1.7891203174,0.9987029831,0.9391927977,,, +5.1894531250,83,1.7875944152,0.9987029831,0.9803921569,,, +5.1914062500,83,1.7860685130,0.9987029831,0.9346150912,,, +5.1933593750,83,1.7845426108,0.9987029831,0.6584267948,,, +5.1953125000,83,1.7814908064,0.9987029831,0.3135729000,,, +5.1972656250,83,1.7799649042,0.9987029831,0.7957579919,,, +5.1992187500,83,1.7784390021,0.9987029831,0.5836575875,,, +5.2011718750,83,1.7769130999,0.9987029831,0.6523231861,,, +5.2031250000,83,1.7753871977,0.9987029831,0.4737926299,,, +5.2050781250,83,1.7738612955,0.9987029831,0.4951552605,,, +5.2070312500,83,1.7708094911,0.9987029831,0.5485618372,,, +5.2089843750,83,1.7692835889,0.9987029831,0.4814221408,,, +5.2109375000,83,1.7677576867,0.9987029831,0.9803921569,,, +5.2128906250,83,1.7662317845,0.9987029831,0.2296482795,,, +5.2148437500,83,1.7647058824,0.9987029831,0.9391927977,,, +5.2167968750,83,1.7616540780,0.9987029831,0.8949416342,,, +5.2187500000,83,1.7601281758,0.9987029831,0.3334096284,,, +5.2207031250,83,1.7586022736,0.9987029831,0.4249637598,,, +5.2226562500,83,1.7570763714,0.9987029831,0.7255664912,,, +5.2246093750,83,1.7555504692,0.9987029831,0.4631113146,,, +5.2265625000,83,1.7524986648,0.9987029831,0.2723735409,,, +5.2285156250,83,1.7509727626,0.9987029831,0.1152056153,,, +5.2304687500,83,1.7494468605,0.9987029831,0.0389105058,,, +5.2324218750,83,1.7479209583,0.9987029831,0.1441977569,,, +5.2343750000,83,1.7463950561,0.9987029831,0.0129701686,,, +5.2363281250,83,1.7433432517,0.9987029831,0.1731898985,,, +5.2382812500,83,1.7418173495,0.9987029831,0.6080720226,,, +5.2402343750,83,1.7402914473,0.9987029831,0.9285114824,,, +5.2421875000,83,1.7387655451,0.9987029831,0.7469291218,,, +5.2441406250,83,1.7357137407,0.9987029831,0.9773403525,,, +5.2460937500,83,1.7341878386,0.9987029831,0.4280155642,,, +5.2480468750,83,1.7326619364,0.9987029831,0.4585336080,,, +5.2500000000,84,1.7311360342,0.9987029831,0.9697108415,,, +5.2519531250,84,1.7280842298,0.9987029831,0.5683985657,,, +5.2539062500,84,1.7265583276,0.9987029831,0.1335164416,,, +5.2558593750,84,1.7250324254,0.9987029831,0.6462195773,,, +5.2578125000,84,1.7219806210,0.9987029831,0.5531395438,,, +5.2597656250,84,1.7204547189,0.9987029831,0.7026779583,,, +5.2617187500,84,1.7189288167,0.9987029831,0.9864957656,,, +5.2636718750,84,1.7174029145,0.9987029831,0.1365682460,,, +5.2656250000,84,1.7143511101,0.9987029831,0.3120469978,,, +5.2675781250,84,1.7128252079,0.9987029831,0.8766308080,,, +5.2695312500,84,1.7112993057,0.9987029831,0.2922102693,,, +5.2714843750,84,1.7082475013,0.9987029831,0.4356450752,,, +5.2734375000,84,1.7067215991,0.9987029831,0.9788662547,,, +5.2753906250,84,1.7051956970,0.9987029831,0.8384832532,,, +5.2773437500,84,1.7021438926,0.9987029831,0.9742885481,,, +5.2792968750,84,1.7006179904,0.9987029831,0.4585336080,,, +5.2812500000,84,1.6990920882,0.9987029831,0.7408255131,,, +5.2832031250,84,1.6960402838,0.9987029831,0.4814221408,,, +5.2851562500,84,1.6945143816,0.9987029831,0.6141756313,,, +5.2871093750,84,1.6929884794,0.9987029831,0.2723735409,,, +5.2890625000,84,1.6899366751,0.9987029831,0.6416418708,,, +5.2910156250,84,1.6884107729,0.9987029831,0.4249637598,,, +5.2929687500,84,1.6868848707,0.9987029831,0.4081788357,,, +5.2949218750,84,1.6838330663,0.9987029831,0.0816357671,,, +5.2968750000,84,1.6823071641,0.9987029831,0.6370641642,,, +5.2988281250,84,1.6807812619,0.9987029831,0.4661631189,,, +5.3007812500,84,1.6777294575,0.9987029831,0.4814221408,,, +5.3027343750,84,1.6762035554,0.9987029831,0.3990234226,,, +5.3046875000,84,1.6746776532,0.9987029831,0.5958648051,,, +5.3066406250,84,1.6716258488,0.9987029831,0.4600595102,,, +5.3085937500,84,1.6700999466,0.9987029831,0.6904707408,,, +5.3105468750,84,1.6685740444,0.9987029831,0.0511177234,,, +5.3125000000,85,1.6655222400,0.9987029831,0.6767376211,,, +5.3144531250,85,1.6639963378,0.9987029831,0.6569008927,,, +5.3164062500,85,1.6609445335,0.9987029831,0.5683985657,,, +5.3183593750,85,1.6594186313,0.9987029831,0.3990234226,,, +5.3203125000,85,1.6578927291,0.9987029831,0.9605554284,,, +5.3222656250,85,1.6548409247,0.9987029831,0.1411459525,,, +5.3242187500,85,1.6533150225,0.9987029831,0.2677958343,,, +5.3261718750,85,1.6502632181,0.9987029831,0.3349355306,,, +5.3281250000,85,1.6487373159,0.9987029831,0.4432745861,,, +5.3300781250,85,1.6472114137,0.9987029831,0.8293278401,,, +5.3320312500,85,1.6441596094,0.9987029831,0.4570077058,,, +5.3339843750,85,1.6426337072,0.9987029831,0.1411459525,,, +5.3359375000,85,1.6395819028,0.9987029831,0.9773403525,,, +5.3378906250,85,1.6380560006,0.9987029831,0.2601663233,,, +5.3398437500,85,1.6350041962,0.9987029831,0.1960784314,,, +5.3417968750,85,1.6334782940,0.9987029831,0.9391927977,,, +5.3437500000,85,1.6319523919,0.9987029831,0.8033875029,,, +5.3457031250,85,1.6289005875,0.9987029831,0.6996261540,,, +5.3476562500,85,1.6273746853,0.9987029831,0.1915007248,,, +5.3496093750,85,1.6243228809,0.9987029831,0.6416418708,,, +5.3515625000,85,1.6227969787,0.9987029831,0.0282291905,,, +5.3535156250,85,1.6197451743,0.9987029831,0.2632181277,,, +5.3554687500,85,1.6182192721,0.9987029831,0.2845807584,,, +5.3574218750,85,1.6151674678,0.9987029831,0.5287251087,,, +5.3593750000,85,1.6136415656,0.9987029831,0.5836575875,,, +5.3613281250,85,1.6121156634,0.9987029831,0.8140688182,,, +5.3632812500,85,1.6090638590,0.9987029831,0.8598458839,,, +5.3652343750,85,1.6075379568,0.9987029831,0.5531395438,,, +5.3671875000,85,1.6044861524,0.9987029831,0.5516136416,,, +5.3691406250,85,1.6029602502,0.9987029831,0.4386968795,,, +5.3710937500,85,1.5999084459,0.9987029831,0.6782635233,,, +5.3730468750,85,1.5983825437,0.9987029831,0.3242542153,,, +5.3750000000,86,1.5953307393,0.9987029831,0.8888380255,,, +5.3769531250,86,1.5938048371,0.9987029831,0.9483482109,,, +5.3789062500,86,1.5907530327,0.9987029831,0.4295414664,,, +5.3808593750,86,1.5892271305,0.9987029831,0.7591363394,,, +5.3828125000,86,1.5861753262,0.9987029831,0.6065461204,,, +5.3847656250,86,1.5846494240,0.9987029831,0.4432745861,,, +5.3867187500,86,1.5815976196,0.9987029831,0.7469291218,,, +5.3886718750,86,1.5800717174,0.9987029831,0.2586404211,,, +5.3906250000,86,1.5770199130,0.9987029831,0.5912870985,,, +5.3925781250,86,1.5754940108,0.9987029831,0.7972838941,,, +5.3945312500,86,1.5724422065,0.9987029831,0.4768444343,,, +5.3964843750,86,1.5709163043,0.9987029831,0.1274128328,,, +5.3984375000,86,1.5678644999,0.9987029831,0.7194628824,,, +5.4003906250,86,1.5663385977,0.9987029831,0.4081788357,,, +5.4023437500,86,1.5632867933,0.9987029831,0.0343327993,,, +5.4042968750,86,1.5617608911,0.9987029831,0.5119401846,,, +5.4062500000,86,1.5587090867,0.9987029831,0.6294346532,,, +5.4082031250,86,1.5556572824,0.9987029831,0.8369573510,,, +5.4101562500,86,1.5541313802,0.9987029831,0.9712367437,,, +5.4121093750,86,1.5510795758,0.9987029831,0.5638208591,,, +5.4140625000,86,1.5495536736,0.9987029831,0.6752117189,,, +5.4160156250,86,1.5465018692,0.9987029831,0.1579308766,,, +5.4179687500,86,1.5449759670,0.9987029831,0.5897611963,,, +5.4199218750,86,1.5419241627,0.9987029831,0.8278019379,,, +5.4218750000,86,1.5403982605,0.9987029831,0.5745021744,,, +5.4238281250,86,1.5373464561,0.9987029831,0.9407186999,,, +5.4257812500,86,1.5342946517,0.9987029831,0.1640344854,,, +5.4277343750,86,1.5327687495,0.9987029831,0.2510109102,,, +5.4296875000,86,1.5297169451,0.9987029831,0.8491645686,,, +5.4316406250,86,1.5281910430,0.9987029831,0.8293278401,,, +5.4335937500,86,1.5251392386,0.9987029831,0.4173342489,,, +5.4355468750,86,1.5236133364,0.9987029831,0.9117265583,,, +5.4375000000,87,1.5205615320,0.9987029831,0.9681849393,,, +5.4394531250,87,1.5175097276,0.9987029831,0.2494850080,,, +5.4414062500,87,1.5159838254,0.9987029831,0.5745021744,,, +5.4433593750,87,1.5129320211,0.9987029831,0.5088883803,,, +5.4453125000,87,1.5114061189,0.9987029831,0.4051270314,,, +5.4472656250,87,1.5083543145,0.9987029831,0.0495918212,,, +5.4492187500,87,1.5068284123,0.9987029831,0.9620813306,,, +5.4511718750,87,1.5037766079,0.9987029831,0.2754253452,,, +5.4531250000,87,1.5007248035,0.9987029831,0.1915007248,,, +5.4550781250,87,1.4991989014,0.9987029831,0.8751049058,,, +5.4570312500,87,1.4961470970,0.9987029831,0.4921034562,,, +5.4589843750,87,1.4930952926,0.9987029831,0.1304646372,,, +5.4609375000,87,1.4915693904,0.9987029831,0.8049134051,,, +5.4628906250,87,1.4885175860,0.9987029831,0.8049134051,,, +5.4648437500,87,1.4869916838,0.9987029831,0.0679026474,,, +5.4667968750,87,1.4839398795,0.9987029831,0.3929198138,,, +5.4687500000,87,1.4808880751,0.9987029831,0.0526436255,,, +5.4707031250,87,1.4793621729,0.9987029831,0.7286182956,,, +5.4726562500,87,1.4763103685,0.9987029831,0.9712367437,,, +5.4746093750,87,1.4747844663,0.9987029831,0.4707408255,,, +5.4765625000,87,1.4717326619,0.9987029831,0.2388036927,,, +5.4785156250,87,1.4686808576,0.9987029831,0.4921034562,,, +5.4804687500,87,1.4671549554,0.9987029831,0.1441977569,,, +5.4824218750,87,1.4641031510,0.9987029831,0.6752117189,,, +5.4843750000,87,1.4610513466,0.9987029831,0.1274128328,,, +5.4863281250,87,1.4595254444,0.9987029831,0.8751049058,,, +5.4882812500,87,1.4564736400,0.9987029831,0.7179369802,,, +5.4902343750,87,1.4534218357,0.9987029831,0.4112306401,,, +5.4921875000,87,1.4518959335,0.9987029831,0.7392996109,,, +5.4941406250,87,1.4488441291,0.9987029831,0.4432745861,,, +5.4960937500,87,1.4457923247,0.9987029831,0.0114442664,,, +5.4980468750,87,1.4442664225,0.9987029831,0.5943389029,,, +5.5000000000,88,1.4412146181,0.9987029831,0.6095979248,,, +5.5019531250,88,1.4381628138,0.9987029831,0.2937361715,,, +5.5039062500,88,1.4366369116,0.9987029831,0.6721599145,,, +5.5058593750,88,1.4335851072,0.9987029831,0.4386968795,,, +5.5078125000,88,1.4305333028,0.9987029831,0.6233310445,,, +5.5097656250,88,1.4290074006,0.9987029831,0.6889448386,,, +5.5117187500,88,1.4259555962,0.9987029831,0.3593499657,,, +5.5136718750,88,1.4229037919,0.9987029831,0.1533531701,,, +5.5156250000,88,1.4213778897,0.9987029831,0.8979934386,,, +5.5175781250,88,1.4183260853,0.9987029831,0.9071488518,,, +5.5195312500,88,1.4152742809,0.9987029831,0.6294346532,,, +5.5214843750,88,1.4137483787,0.9987029831,0.7911802853,,, +5.5234375000,88,1.4106965743,0.9987029831,0.7057297627,,, +5.5253906250,88,1.4076447700,0.9987029831,0.9102006561,,, +5.5273437500,88,1.4061188678,0.9987029831,0.4234378576,,, +5.5292968750,88,1.4030670634,0.9987029831,0.7606622416,,, +5.5312500000,88,1.4000152590,0.9987029831,0.7515068284,,, +5.5332031250,88,1.3969634546,0.9987029831,0.0358587015,,, +5.5351562500,88,1.3954375525,0.9987029831,0.0617990387,,, +5.5371093750,88,1.3923857481,0.9987029831,0.1518272679,,, +5.5390625000,88,1.3893339437,0.9987029831,0.5119401846,,, +5.5410156250,88,1.3878080415,0.9987029831,0.4295414664,,, +5.5429687500,88,1.3847562371,0.9987029831,0.4158083467,,, +5.5449218750,88,1.3817044327,0.9987029831,0.9819180591,,, +5.5468750000,88,1.3801785306,0.9987029831,0.8720531014,,, +5.5488281250,88,1.3771267262,0.9987029831,0.2601663233,,, +5.5507812500,88,1.3740749218,0.9987029831,0.8979934386,,, +5.5527343750,88,1.3710231174,0.9987029831,0.0312809949,,, +5.5546875000,88,1.3694972152,0.9987029831,0.4081788357,,, +5.5566406250,88,1.3664454108,0.9987029831,0.9040970474,,, +5.5585937500,88,1.3633936065,0.9987029831,0.2708476387,,, +5.5605468750,88,1.3603418021,0.9987029831,0.4051270314,,, +5.5625000000,89,1.3588158999,0.9987029831,0.0022888533,,, +5.5644531250,89,1.3557640955,0.9987029831,0.6950484474,,, +5.5664062500,89,1.3527122911,0.9987029831,0.8781567102,,, +5.5683593750,89,1.3511863890,0.9987029831,0.2510109102,,, +5.5703125000,89,1.3481345846,0.9987029831,0.4020752270,,, +5.5722656250,89,1.3450827802,0.9987029831,0.3273060197,,, +5.5742187500,89,1.3420309758,0.9987029831,0.6355382620,,, +5.5761718750,89,1.3405050736,0.9987029831,0.0068665599,,, +5.5781250000,89,1.3374532692,0.9987029831,0.3318837263,,, +5.5800781250,89,1.3344014649,0.9987029831,0.8094911116,,, +5.5820312500,89,1.3313496605,0.9987029831,0.8522163729,,, +5.5839843750,89,1.3298237583,0.9987029831,0.8888380255,,, +5.5859375000,89,1.3267719539,0.9987029831,0.8278019379,,, +5.5878906250,89,1.3237201495,0.9987029831,0.9773403525,,, +5.5898437500,89,1.3206683452,0.9987029831,0.3517204547,,, +5.5917968750,89,1.3191424430,0.9987029831,0.0373846036,,, +5.5937500000,89,1.3160906386,0.9987029831,0.6569008927,,, +5.5957031250,89,1.3130388342,0.9987029831,0.6675822080,,, +5.5976562500,89,1.3099870298,0.9987029831,0.9269855802,,, +5.5996093750,89,1.3084611276,0.9987029831,0.2143892576,,, +5.6015625000,89,1.3054093233,0.9987029831,0.1136797131,,, +5.6035156250,89,1.3023575189,0.9987029831,0.9636072328,,, +5.6054687500,89,1.2993057145,0.9987029831,0.4219119554,,, +5.6074218750,89,1.2962539101,0.9987029831,0.7743953613,,, +5.6093750000,89,1.2947280079,0.9987029831,0.9178301671,,, +5.6113281250,89,1.2916762036,0.9987029831,0.3425650416,,, +5.6132812500,89,1.2886243992,0.9987029831,0.0358587015,,, +5.6152343750,89,1.2855725948,0.9987029831,0.7438773175,,, +5.6171875000,89,1.2840466926,0.9987029831,0.1289387350,,, +5.6191406250,89,1.2809948882,0.9987029831,0.9910734722,,, +5.6210937500,89,1.2779430838,0.9987029831,0.8506904707,,, +5.6230468750,89,1.2748912795,0.9987029831,0.0083924620,,, +5.6250000000,90,1.2733653773,0.9987029831,0.7194628824,,, +5.6269531250,90,1.2703135729,0.9987029831,0.5470359350,,, +5.6289062500,90,1.2672617685,0.9987029831,0.3089951934,,, +5.6308593750,90,1.2642099641,0.9987029831,0.8018616007,,, +5.6328125000,90,1.2611581598,0.9987029831,0.3883421073,,, +5.6347656250,90,1.2596322576,0.9987029831,0.1045243000,,, +5.6367187500,90,1.2565804532,0.9987029831,0.3242542153,,, +5.6386718750,90,1.2535286488,0.9987029831,0.5409323262,,, +5.6406250000,90,1.2504768444,0.9987029831,0.8659494926,,, +5.6425781250,90,1.2474250401,0.9987029831,0.7392996109,,, +5.6445312500,90,1.2458991379,0.9987029831,0.6996261540,,, +5.6464843750,90,1.2428473335,0.9987029831,0.3349355306,,, +5.6484375000,90,1.2397955291,0.9987029831,0.8064393072,,, +5.6503906250,90,1.2367437247,0.9987029831,0.8354314488,,, +5.6523437500,90,1.2336919203,0.9987029831,0.9666590372,,, +5.6542968750,90,1.2321660182,0.9987029831,0.4036011292,,, +5.6562500000,90,1.2291142138,0.9987029831,0.8415350576,,, +5.6582031250,90,1.2260624094,0.9987029831,0.2769512474,,, +5.6601562500,90,1.2230106050,0.9987029831,0.9285114824,,, +5.6621093750,90,1.2199588006,0.9987029831,0.6187533379,,, +5.6640625000,90,1.2184328985,0.9987029831,0.9620813306,,, +5.6660156250,90,1.2153810941,0.9987029831,0.9147783627,,, +5.6679687500,90,1.2123292897,0.9987029831,0.0007629511,,, +5.6699218750,90,1.2092774853,0.9987029831,0.1060502022,,, +5.6718750000,90,1.2062256809,0.9987029831,0.2586404211,,, +5.6738281250,90,1.2046997787,0.9987029831,0.1426718547,,, +5.6757812500,90,1.2016479744,0.9987029831,0.0053406577,,, +5.6777343750,90,1.1985961700,0.9987029831,0.7667658503,,, +5.6796875000,90,1.1955443656,0.9987029831,0.3364614328,,, +5.6816406250,90,1.1924925612,0.9987029831,0.0099183642,,, +5.6835937500,90,1.1894407568,0.9987029831,0.1823453117,,, +5.6855468750,90,1.1879148547,0.9987029831,0.1258869306,,, +5.6875000000,91,1.1848630503,0.9987029831,0.4966811627,,, +5.6894531250,91,1.1818112459,0.9987029831,0.8506904707,,, +5.6914062500,91,1.1787594415,0.9987029831,0.5180437934,,, +5.6933593750,91,1.1757076371,0.9987029831,0.9300373846,,, +5.6953125000,91,1.1726558328,0.9987029831,0.3440909438,,, +5.6972656250,91,1.1711299306,0.9987029831,0.0434882124,,, +5.6992187500,91,1.1680781262,0.9987029831,0.8094911116,,, +5.7011718750,91,1.1650263218,0.9987029831,0.5867093919,,, +5.7031250000,91,1.1619745174,0.9987029831,0.2204928664,,, +5.7050781250,91,1.1589227131,0.9987029831,0.5577172503,,, +5.7070312500,91,1.1573968109,0.9987029831,0.5012588693,,, +5.7089843750,91,1.1543450065,0.9987029831,0.4798962387,,, +5.7109375000,91,1.1512932021,0.9987029831,0.1762417029,,, +5.7128906250,91,1.1482413977,0.9987029831,0.5485618372,,, +5.7148437500,91,1.1451895933,0.9987029831,0.4859998474,,, +5.7167968750,91,1.1421377890,0.9987029831,0.2479591058,,, +5.7187500000,91,1.1406118868,0.9987029831,0.5271992065,,, +5.7207031250,91,1.1375600824,0.9987029831,0.8766308080,,, +5.7226562500,91,1.1345082780,0.9987029831,0.2281223774,,, +5.7246093750,91,1.1314564736,0.9987029831,0.0755321584,,, +5.7265625000,91,1.1284046693,0.9987029831,0.9987029831,,, +5.7285156250,91,1.1253528649,0.9987029831,0.5241474022,,, +5.7304687500,91,1.1223010605,0.9987029831,0.0831616693,,, +5.7324218750,91,1.1207751583,0.9987029831,0.5943389029,,, +5.7343750000,91,1.1177233539,0.9987029831,0.2677958343,,, +5.7363281250,91,1.1146715496,0.9987029831,0.0373846036,,, +5.7382812500,91,1.1116197452,0.9987029831,0.1258869306,,, +5.7402343750,91,1.1085679408,0.9987029831,0.6416418708,,, +5.7421875000,91,1.1055161364,0.9987029831,0.6706340124,,, +5.7441406250,91,1.1039902342,0.9987029831,0.1152056153,,, +5.7460937500,91,1.1009384298,0.9987029831,0.9025711452,,, +5.7480468750,91,1.0978866255,0.9987029831,0.9452964065,,, +5.7500000000,92,1.0948348211,0.9987029831,0.4097047379,,, +5.7519531250,92,1.0917830167,0.9987029831,0.0846875715,,, +5.7539062500,92,1.0887312123,0.9987029831,0.8308537423,,, +5.7558593750,92,1.0872053101,0.9987029831,0.7362478065,,, +5.7578125000,92,1.0841535058,0.9987029831,0.8812085145,,, +5.7597656250,92,1.0811017014,0.9987029831,0.0114442664,,, +5.7617187500,92,1.0780498970,0.9987029831,0.2265964752,,, +5.7636718750,92,1.0749980926,0.9987029831,0.4875257496,,, +5.7656250000,92,1.0719462882,0.9987029831,0.8964675364,,, +5.7675781250,92,1.0688944839,0.9987029831,0.3273060197,,, +5.7695312500,92,1.0673685817,0.9987029831,0.2815289540,,, +5.7714843750,92,1.0643167773,0.9987029831,0.6492713817,,, +5.7734375000,92,1.0612649729,0.9987029831,0.3517204547,,, +5.7753906250,92,1.0582131685,0.9987029831,0.7667658503,,, +5.7773437500,92,1.0551613642,0.9987029831,0.8430609598,,, +5.7792968750,92,1.0521095598,0.9987029831,0.7515068284,,, +5.7812500000,92,1.0490577554,0.9987029831,0.3456168460,,, +5.7832031250,92,1.0475318532,0.9987029831,0.0053406577,,, +5.7851562500,92,1.0444800488,0.9987029831,0.9193560693,,, +5.7871093750,92,1.0414282444,0.9987029831,0.0404364080,,, +5.7890625000,92,1.0383764401,0.9987029831,0.2632181277,,, +5.7910156250,92,1.0353246357,0.9987029831,0.9422446021,,, +5.7929687500,92,1.0322728313,0.9987029831,0.3944457160,,, +5.7949218750,92,1.0307469291,0.9987029831,0.8400091554,,, +5.7968750000,92,1.0276951247,0.9987029831,0.6340123598,,, +5.7988281250,92,1.0246433204,0.9987029831,0.4737926299,,, +5.8007812500,92,1.0215915160,0.9987029831,0.8613717861,,, +5.8027343750,92,1.0185397116,0.9987029831,0.0083924620,,, +5.8046875000,92,1.0154879072,0.9987029831,0.5912870985,,, +5.8066406250,92,1.0124361028,0.9987029831,0.8232242313,,, +5.8085937500,92,1.0109102007,0.9987029831,0.6095979248,,, +5.8105468750,92,1.0078583963,0.9987029831,0.3059433890,,, +5.8125000000,93,1.0048065919,0.9987029831,0.4219119554,,, +5.8144531250,93,1.0017547875,0.9987029831,0.1899748226,,, +5.8164062500,93,0.9987029831,-0.0007629511,0.0801098650,,, +5.8183593750,93,0.9956511788,-0.0007629511,0.2265964752,,, +5.8203125000,93,0.9925993744,-0.0007629511,0.0160219730,,, +5.8222656250,93,0.9910734722,-0.0007629511,0.7103074693,,, +5.8242187500,93,0.9880216678,-0.0007629511,0.3212024109,,, +5.8261718750,93,0.9849698634,-0.0007629511,0.4707408255,,, +5.8281250000,93,0.9819180591,-0.0007629511,0.2433813993,,, +5.8300781250,93,0.9788662547,-0.0007629511,0.6050202182,,, +5.8320312500,93,0.9758144503,-0.0007629511,0.0495918212,,, +5.8339843750,93,0.9727626459,-0.0007629511,0.6523231861,,, +5.8359375000,93,0.9712367437,-0.0007629511,0.1045243000,,, +5.8378906250,93,0.9681849393,-0.0007629511,0.5195696956,,, +5.8398437500,93,0.9651331350,-0.0007629511,0.7423514153,,, +5.8417968750,93,0.9620813306,-0.0007629511,0.3883421073,,, +5.8437500000,93,0.9590295262,-0.0007629511,0.7682917525,,, +5.8457031250,93,0.9559777218,-0.0007629511,0.0984206912,,, +5.8476562500,93,0.9529259174,-0.0007629511,0.2494850080,,, +5.8496093750,93,0.9514000153,-0.0007629511,0.9254596780,,, +5.8515625000,93,0.9483482109,-0.0007629511,0.1594567788,,, +5.8535156250,93,0.9452964065,-0.0007629511,0.3715571832,,, +5.8554687500,93,0.9422446021,-0.0007629511,0.9864957656,,, +5.8574218750,93,0.9391927977,-0.0007629511,0.8400091554,,, +5.8593750000,93,0.9361409934,-0.0007629511,0.0724803540,,, +5.8613281250,93,0.9346150912,-0.0007629511,0.7377737087,,, +5.8632812500,93,0.9315632868,-0.0007629511,0.5699244678,,, +5.8652343750,93,0.9285114824,-0.0007629511,0.6248569467,,, +5.8671875000,93,0.9254596780,-0.0007629511,0.0007629511,,, +5.8691406250,93,0.9224078737,-0.0007629511,0.8430609598,,, +5.8710937500,93,0.9193560693,-0.0007629511,0.6965743496,,, +5.8730468750,93,0.9163042649,-0.0007629511,0.3562981613,,, +5.8750000000,94,0.9147783627,-0.0007629511,0.8278019379,,, +5.8769531250,94,0.9117265583,-0.0007629511,0.5424582284,,, +5.8789062500,94,0.9086747539,-0.0007629511,0.5241474022,,, +5.8808593750,94,0.9056229496,-0.0007629511,0.4829480430,,, +5.8828125000,94,0.9025711452,-0.0007629511,0.6370641642,,, +5.8847656250,94,0.8995193408,-0.0007629511,0.2037079423,,, +5.8867187500,94,0.8964675364,-0.0007629511,0.4295414664,,, +5.8886718750,94,0.8949416342,-0.0007629511,0.7469291218,,, +5.8906250000,94,0.8918898299,-0.0007629511,0.3837644007,,, +5.8925781250,94,0.8888380255,-0.0007629511,0.1915007248,,, +5.8945312500,94,0.8857862211,-0.0007629511,0.4142824445,,, +5.8964843750,94,0.8827344167,-0.0007629511,0.8873121233,,, +5.8984375000,94,0.8796826123,-0.0007629511,0.1197833219,,, +5.9003906250,94,0.8781567102,-0.0007629511,0.4371709773,,, +5.9023437500,94,0.8751049058,-0.0007629511,0.5638208591,,, +5.9042968750,94,0.8720531014,-0.0007629511,0.1503013657,,, +5.9062500000,94,0.8690012970,-0.0007629511,0.1503013657,,, +5.9082031250,94,0.8659494926,-0.0007629511,0.0846875715,,, +5.9101562500,94,0.8628976883,-0.0007629511,0.4768444343,,, +5.9121093750,94,0.8613717861,-0.0007629511,0.9758144503,,, +5.9140625000,94,0.8583199817,-0.0007629511,0.8552681773,,, +5.9160156250,94,0.8552681773,-0.0007629511,0.0984206912,,, +5.9179687500,94,0.8522163729,-0.0007629511,0.3746089876,,, +5.9199218750,94,0.8491645686,-0.0007629511,0.3181506065,,, +5.9218750000,94,0.8461127642,-0.0007629511,0.5302510109,,, +5.9238281250,94,0.8445868620,-0.0007629511,0.6279087510,,, +5.9257812500,94,0.8415350576,-0.0007629511,0.4509040970,,, +5.9277343750,94,0.8384832532,-0.0007629511,0.1503013657,,, +5.9296875000,94,0.8354314488,-0.0007629511,0.2693217365,,, +5.9316406250,94,0.8323796445,-0.0007629511,0.7103074693,,, +5.9335937500,94,0.8293278401,-0.0007629511,0.1457236591,,, +5.9355468750,94,0.8278019379,-0.0007629511,0.1213092241,,, +5.9375000000,95,0.8247501335,-0.0007629511,0.5287251087,,, +5.9394531250,95,0.8216983291,-0.0007629511,0.0968947890,,, +5.9414062500,95,0.8186465248,-0.0007629511,0.7698176547,,, +5.9433593750,95,0.8155947204,-0.0007629511,0.4463263905,,, +5.9453125000,95,0.8125429160,-0.0007629511,0.8339055467,,, +5.9472656250,95,0.8110170138,-0.0007629511,0.0785839628,,, +5.9492187500,95,0.8079652094,-0.0007629511,0.7896543832,,, +5.9511718750,95,0.8049134051,-0.0007629511,0.6935225452,,, +5.9531250000,95,0.8018616007,-0.0007629511,0.1899748226,,, +5.9550781250,95,0.7988097963,-0.0007629511,0.3044174868,,, +5.9570312500,95,0.7972838941,-0.0007629511,0.0450141146,,, +5.9589843750,95,0.7942320897,-0.0007629511,0.2876325628,,, +5.9609375000,95,0.7911802853,-0.0007629511,0.6553749905,,, +5.9628906250,95,0.7881284810,-0.0007629511,0.4356450752,,, +5.9648437500,95,0.7850766766,-0.0007629511,0.7530327306,,, +5.9667968750,95,0.7820248722,-0.0007629511,0.4737926299,,, +5.9687500000,95,0.7804989700,-0.0007629511,0.7698176547,,, +5.9707031250,95,0.7774471656,-0.0007629511,0.8766308080,,, +5.9726562500,95,0.7743953613,-0.0007629511,0.0511177234,,, +5.9746093750,95,0.7713435569,-0.0007629511,0.3379873350,,, +5.9765625000,95,0.7682917525,-0.0007629511,0.1762417029,,, +5.9785156250,95,0.7667658503,-0.0007629511,0.2937361715,,, +5.9804687500,95,0.7637140459,-0.0007629511,0.3318837263,,, +5.9824218750,95,0.7606622416,-0.0007629511,0.2723735409,,, +5.9843750000,95,0.7576104372,-0.0007629511,0.5943389029,,, +5.9863281250,95,0.7545586328,-0.0007629511,0.1884489204,,, +5.9882812500,95,0.7530327306,-0.0007629511,0.1274128328,,, +5.9902343750,95,0.7499809262,-0.0007629511,0.6828412299,,, +5.9921875000,95,0.7469291218,-0.0007629511,0.7499809262,,, +5.9941406250,95,0.7438773175,-0.0007629511,0.9956511788,,, +5.9960937500,95,0.7408255131,-0.0007629511,0.4905775540,,, +5.9980468750,95,0.7392996109,-0.0007629511,0.8430609598,,, +6.0000000000,96,0.7362478065,-0.0007629511,0.5790798810,,, +6.0019531250,96,0.7331960021,-0.0007629511,0.8415350576,,, +6.0039062500,96,0.7301441978,-0.0007629511,0.3624017700,,, +6.0058593750,96,0.7286182956,-0.0007629511,0.3593499657,,, +6.0078125000,96,0.7255664912,-0.0007629511,0.3608758679,,, +6.0097656250,96,0.7225146868,-0.0007629511,0.2861066606,,, +6.0117187500,96,0.7194628824,-0.0007629511,0.2067597467,,, +6.0136718750,96,0.7164110780,-0.0007629511,0.4005493248,,, +6.0156250000,96,0.7148851759,-0.0007629511,0.1976043336,,, +6.0175781250,96,0.7118333715,-0.0007629511,0.0938429847,,, +6.0195312500,96,0.7087815671,-0.0007629511,0.6446936751,,, +6.0214843750,96,0.7057297627,-0.0007629511,0.4005493248,,, +6.0234375000,96,0.7042038605,-0.0007629511,0.8567940795,,, +6.0253906250,96,0.7011520562,-0.0007629511,0.0144960708,,, +6.0273437500,96,0.6981002518,-0.0007629511,0.1136797131,,, +6.0292968750,96,0.6950484474,-0.0007629511,0.0480659190,,, +6.0312500000,96,0.6919966430,-0.0007629511,0.3685053788,,, +6.0332031250,96,0.6904707408,-0.0007629511,0.9514000153,,, +6.0351562500,96,0.6874189364,-0.0007629511,0.4081788357,,, +6.0371093750,96,0.6843671321,-0.0007629511,0.0785839628,,, +6.0390625000,96,0.6813153277,-0.0007629511,0.0648508431,,, +6.0410156250,96,0.6797894255,-0.0007629511,0.7270923934,,, +6.0429687500,96,0.6767376211,-0.0007629511,0.6233310445,,, +6.0449218750,96,0.6736858167,-0.0007629511,0.3318837263,,, +6.0468750000,96,0.6706340124,-0.0007629511,0.3471427481,,, +6.0488281250,96,0.6691081102,-0.0007629511,0.5806057832,,, +6.0507812500,96,0.6660563058,-0.0007629511,0.9636072328,,, +6.0527343750,96,0.6630045014,-0.0007629511,0.0144960708,,, +6.0546875000,96,0.6599526970,-0.0007629511,0.6843671321,,, +6.0566406250,96,0.6584267948,-0.0007629511,0.8232242313,,, +6.0585937500,96,0.6553749905,-0.0007629511,0.4646372168,,, +6.0605468750,96,0.6523231861,-0.0007629511,0.4158083467,,, +6.0625000000,97,0.6492713817,-0.0007629511,0.3181506065,,, +6.0644531250,97,0.6477454795,-0.0007629511,0.0205996796,,, +6.0664062500,97,0.6446936751,-0.0007629511,0.7392996109,,, +6.0683593750,97,0.6416418708,-0.0007629511,0.2662699321,,, +6.0703125000,97,0.6385900664,-0.0007629511,0.6385900664,,, +6.0722656250,97,0.6370641642,-0.0007629511,0.2418554971,,, +6.0742187500,97,0.6340123598,-0.0007629511,0.1762417029,,, +6.0761718750,97,0.6309605554,-0.0007629511,0.0068665599,,, +6.0781250000,97,0.6294346532,-0.0007629511,0.2937361715,,, +6.0800781250,97,0.6263828489,-0.0007629511,0.0175478752,,, +6.0820312500,97,0.6233310445,-0.0007629511,0.9864957656,,, +6.0839843750,97,0.6202792401,-0.0007629511,0.7454032197,,, +6.0859375000,97,0.6187533379,-0.0007629511,0.3593499657,,, +6.0878906250,97,0.6157015335,-0.0007629511,0.4951552605,,, +6.0898437500,97,0.6126497292,-0.0007629511,0.0053406577,,, +6.0917968750,97,0.6111238270,-0.0007629511,0.7408255131,,, +6.0937500000,97,0.6080720226,-0.0007629511,0.0724803540,,, +6.0957031250,97,0.6050202182,-0.0007629511,0.3715571832,,, +6.0976562500,97,0.6019684138,-0.0007629511,0.1579308766,,, +6.0996093750,97,0.6004425116,-0.0007629511,0.0297550927,,, +6.1015625000,97,0.5973907073,-0.0007629511,0.6996261540,,, +6.1035156250,97,0.5943389029,-0.0007629511,0.5546654459,,, +6.1054687500,97,0.5928130007,-0.0007629511,0.3288319219,,, +6.1074218750,97,0.5897611963,-0.0007629511,0.8110170138,,, +6.1093750000,97,0.5867093919,-0.0007629511,0.7103074693,,, +6.1113281250,97,0.5851834897,-0.0007629511,0.6080720226,,, +6.1132812500,97,0.5821316854,-0.0007629511,0.1655603876,,, +6.1152343750,97,0.5790798810,-0.0007629511,0.9102006561,,, +6.1171875000,97,0.5775539788,-0.0007629511,0.0740062562,,, +6.1191406250,97,0.5745021744,-0.0007629511,0.1716639963,,, +6.1210937500,97,0.5714503700,-0.0007629511,0.0175478752,,, +6.1230468750,97,0.5699244678,-0.0007629511,0.5989166094,,, +6.1250000000,98,0.5668726635,-0.0007629511,0.5592431525,,, +6.1269531250,98,0.5638208591,-0.0007629511,0.8110170138,,, +6.1289062500,98,0.5622949569,-0.0007629511,0.5241474022,,, +6.1308593750,98,0.5592431525,-0.0007629511,0.6706340124,,, +6.1328125000,98,0.5561913481,-0.0007629511,0.0434882124,,, +6.1347656250,98,0.5546654459,-0.0007629511,0.0968947890,,, +6.1367187500,98,0.5516136416,-0.0007629511,0.1365682460,,, +6.1386718750,98,0.5485618372,-0.0007629511,0.0465400168,,, +6.1406250000,98,0.5470359350,-0.0007629511,0.7347219043,,, +6.1425781250,98,0.5439841306,-0.0007629511,0.1472495613,,, +6.1445312500,98,0.5409323262,-0.0007629511,0.5180437934,,, +6.1464843750,98,0.5394064240,-0.0007629511,0.0740062562,,, +6.1484375000,98,0.5363546197,-0.0007629511,0.5699244678,,, +6.1503906250,98,0.5333028153,-0.0007629511,0.0755321584,,, +6.1523437500,98,0.5317769131,-0.0007629511,0.1304646372,,, +6.1542968750,98,0.5287251087,-0.0007629511,0.6233310445,,, +6.1562500000,98,0.5256733043,-0.0007629511,0.1503013657,,, +6.1582031250,98,0.5241474022,-0.0007629511,0.2967879759,,, +6.1601562500,98,0.5210955978,-0.0007629511,0.9498741131,,, +6.1621093750,98,0.5195696956,-0.0007629511,0.0877393759,,, +6.1640625000,98,0.5165178912,-0.0007629511,0.9788662547,,, +6.1660156250,98,0.5134660868,-0.0007629511,0.4844739452,,, +6.1679687500,98,0.5119401846,-0.0007629511,0.4448004883,,, +6.1699218750,98,0.5088883803,-0.0007629511,0.4768444343,,, +6.1718750000,98,0.5058365759,-0.0007629511,0.3501945525,,, +6.1738281250,98,0.5043106737,-0.0007629511,0.0205996796,,, +6.1757812500,98,0.5012588693,-0.0007629511,0.6767376211,,, +6.1777343750,98,0.4997329671,-0.0007629511,0.7957579919,,, +6.1796875000,98,0.4966811627,-0.0007629511,0.9056229496,,, +6.1816406250,98,0.4936293584,-0.0007629511,0.0968947890,,, +6.1835937500,98,0.4921034562,-0.0007629511,0.0968947890,,, +6.1855468750,98,0.4890516518,-0.0007629511,0.1869230182,,, +6.1875000000,99,0.4875257496,-0.0007629511,0.6492713817,,, +6.1894531250,99,0.4844739452,-0.0007629511,0.9315632868,,, +6.1914062500,99,0.4814221408,-0.0007629511,0.0236514839,,, +6.1933593750,99,0.4798962387,-0.0007629511,0.3746089876,,, +6.1953125000,99,0.4768444343,-0.0007629511,0.1503013657,,, +6.1972656250,99,0.4753185321,-0.0007629511,0.2876325628,,, +6.1992187500,99,0.4722667277,-0.0007629511,0.0205996796,,, +6.2011718750,99,0.4707408255,-0.0007629511,0.0099183642,,, +6.2031250000,99,0.4676890211,-0.0007629511,0.9544518196,,, +6.2050781250,99,0.4646372168,-0.0007629511,0.0190737774,,, +6.2070312500,99,0.4631113146,-0.0007629511,0.6462195773,,, +6.2089843750,99,0.4600595102,-0.0007629511,0.3562981613,,, +6.2109375000,99,0.4585336080,-0.0007629511,0.8308537423,,, +6.2128906250,99,0.4554818036,-0.0007629511,0.6416418708,,, +6.2148437500,99,0.4539559014,-0.0007629511,0.5806057832,,, +6.2167968750,99,0.4509040970,-0.0007629511,0.8491645686,,, +6.2187500000,99,0.4478522927,-0.0007629511,0.3746089876,,, +6.2207031250,99,0.4463263905,-0.0007629511,0.7316700999,,, +6.2226562500,99,0.4432745861,-0.0007629511,0.2998397803,,, +6.2246093750,99,0.4417486839,-0.0007629511,0.9697108415,,, +6.2265625000,99,0.4386968795,-0.0007629511,0.5363546197,,, +6.2285156250,99,0.4371709773,-0.0007629511,0.5485618372,,, +6.2304687500,99,0.4341191730,-0.0007629511,0.7225146868,,, +6.2324218750,99,0.4325932708,-0.0007629511,0.9651331350,,, +6.2343750000,99,0.4295414664,-0.0007629511,0.9361409934,,, +6.2363281250,99,0.4280155642,-0.0007629511,0.2662699321,,, +6.2382812500,99,0.4249637598,-0.0007629511,0.2235446708,,, +6.2402343750,99,0.4234378576,-0.0007629511,0.7866025788,,, +6.2421875000,99,0.4203860533,-0.0007629511,0.8827344167,,, +6.2441406250,99,0.4188601511,-0.0007629511,0.5165178912,,, +6.2460937500,99,0.4158083467,-0.0007629511,0.8461127642,,, +6.2480468750,99,0.4142824445,-0.0007629511,0.9849698634,,, +6.2500000000,100,0.4112306401,-0.0007629511,0.2601663233,,, +6.2519531250,100,0.4097047379,-0.0007629511,0.9697108415,,, +6.2539062500,100,0.4066529335,-0.0007629511,0.4463263905,,, +6.2558593750,100,0.4051270314,-0.0007629511,0.4737926299,,, +6.2578125000,100,0.4020752270,-0.0007629511,0.7789730678,,, +6.2597656250,100,0.4005493248,-0.0007629511,0.0129701686,,, +6.2617187500,100,0.3974975204,-0.0007629511,0.0328068971,,, +6.2636718750,100,0.3959716182,-0.0007629511,0.9651331350,,, +6.2656250000,100,0.3929198138,-0.0007629511,0.1121538109,,, +6.2675781250,100,0.3913939117,-0.0007629511,0.4173342489,,, +6.2695312500,100,0.3883421073,-0.0007629511,0.5516136416,,, +6.2714843750,100,0.3868162051,-0.0007629511,0.6401159686,,, +6.2734375000,100,0.3837644007,-0.0007629511,0.3395132372,,, +6.2753906250,100,0.3822384985,-0.0007629511,0.1365682460,,, +6.2773437500,100,0.3791866941,-0.0007629511,0.2754253452,,, +6.2792968750,100,0.3776607919,-0.0007629511,0.2540627146,,, +6.2812500000,100,0.3746089876,-0.0007629511,0.0099183642,,, +6.2832031250,100,0.3730830854,-0.0007629511,0.6874189364,,, +6.2851562500,100,0.3715571832,-0.0007629511,0.6507972839,,, +6.2871093750,100,0.3685053788,-0.0007629511,0.0175478752,,, +6.2890625000,100,0.3669794766,-0.0007629511,0.3227283131,,, +6.2910156250,100,0.3639276722,-0.0007629511,0.5043106737,,, +6.2929687500,100,0.3624017700,-0.0007629511,0.7057297627,,, +6.2949218750,100,0.3593499657,-0.0007629511,0.4875257496,,, +6.2968750000,100,0.3578240635,-0.0007629511,0.3517204547,,, +6.2988281250,100,0.3562981613,-0.0007629511,0.6279087510,,, +6.3007812500,100,0.3532463569,-0.0007629511,0.6904707408,,, +6.3027343750,100,0.3517204547,-0.0007629511,0.0801098650,,, +6.3046875000,100,0.3486686503,-0.0007629511,0.7194628824,,, +6.3066406250,100,0.3471427481,-0.0007629511,0.1915007248,,, +6.3085937500,100,0.3456168460,-0.0007629511,0.3074692912,,, +6.3105468750,100,0.3425650416,-0.0007629511,0.1670862898,,, +6.3125000000,101,0.3410391394,-0.0007629511,0.9300373846,,, +6.3144531250,101,0.3379873350,-0.0007629511,0.4386968795,,, +6.3164062500,101,0.3364614328,-0.0007629511,0.6126497292,,, +6.3183593750,101,0.3349355306,-0.0007629511,0.9620813306,,, +6.3203125000,101,0.3318837263,-0.0007629511,0.8354314488,,, +6.3222656250,101,0.3303578241,-0.0007629511,0.7652399481,,, +6.3242187500,101,0.3273060197,-0.0007629511,0.0343327993,,, +6.3261718750,101,0.3257801175,-0.0007629511,0.4325932708,,, +6.3281250000,101,0.3242542153,-0.0007629511,0.5485618372,,, +6.3300781250,101,0.3212024109,-0.0007629511,0.7713435569,,, +6.3320312500,101,0.3196765087,-0.0007629511,0.6996261540,,, +6.3339843750,101,0.3181506065,-0.0007629511,0.9864957656,,, +6.3359375000,101,0.3150988022,-0.0007629511,0.1182574197,,, +6.3378906250,101,0.3135729000,-0.0007629511,0.8400091554,,, +6.3398437500,101,0.3120469978,-0.0007629511,0.1655603876,,, +6.3417968750,101,0.3089951934,-0.0007629511,0.7042038605,,, +6.3437500000,101,0.3074692912,-0.0007629511,0.6355382620,,, +6.3457031250,101,0.3059433890,-0.0007629511,0.6370641642,,, +6.3476562500,101,0.3028915846,-0.0007629511,0.9178301671,,, +6.3496093750,101,0.3013656825,-0.0007629511,0.8888380255,,, +6.3515625000,101,0.2998397803,-0.0007629511,0.7560845350,,, +6.3535156250,101,0.2967879759,-0.0007629511,0.1640344854,,, +6.3554687500,101,0.2952620737,-0.0007629511,0.1319905394,,, +6.3574218750,101,0.2937361715,-0.0007629511,0.4615854124,,, +6.3593750000,101,0.2906843671,-0.0007629511,0.3730830854,,, +6.3613281250,101,0.2891584649,-0.0007629511,0.8110170138,,, +6.3632812500,101,0.2876325628,-0.0007629511,0.5333028153,,, +6.3652343750,101,0.2845807584,-0.0007629511,0.0679026474,,, +6.3671875000,101,0.2830548562,-0.0007629511,0.6172274357,,, +6.3691406250,101,0.2815289540,-0.0007629511,0.6446936751,,, +6.3710937500,101,0.2784771496,-0.0007629511,0.9559777218,,, +6.3730468750,101,0.2769512474,-0.0007629511,0.5943389029,,, +6.3750000000,102,0.2754253452,-0.0007629511,0.2708476387,,, +6.3769531250,102,0.2738994430,-0.0007629511,0.2677958343,,, +6.3789062500,102,0.2708476387,-0.0007629511,0.4661631189,,, +6.3808593750,102,0.2693217365,-0.0007629511,0.2327000839,,, +6.3828125000,102,0.2677958343,-0.0007629511,0.1899748226,,, +6.3847656250,102,0.2662699321,-0.0007629511,0.6553749905,,, +6.3867187500,102,0.2632181277,-0.0007629511,0.6569008927,,, +6.3886718750,102,0.2616922255,-0.0007629511,0.0190737774,,, +6.3906250000,102,0.2601663233,-0.0007629511,0.5592431525,,, +6.3925781250,102,0.2586404211,-0.0007629511,0.6706340124,,, +6.3945312500,102,0.2555886168,-0.0007629511,0.2510109102,,, +6.3964843750,102,0.2540627146,-0.0007629511,0.9651331350,,, +6.3984375000,102,0.2525368124,-0.0007629511,0.9697108415,,, +6.4003906250,102,0.2510109102,-0.0007629511,0.0297550927,,, +6.4023437500,102,0.2479591058,-0.0007629511,0.5592431525,,, +6.4042968750,102,0.2464332036,-0.0007629511,0.9864957656,,, +6.4062500000,102,0.2449073014,-0.0007629511,0.8461127642,,, +6.4082031250,102,0.2433813993,-0.0007629511,0.4448004883,,, +6.4101562500,102,0.2418554971,-0.0007629511,0.7576104372,,, +6.4121093750,102,0.2388036927,-0.0007629511,0.9651331350,,, +6.4140625000,102,0.2372777905,-0.0007629511,0.7057297627,,, +6.4160156250,102,0.2357518883,-0.0007629511,0.7148851759,,, +6.4179687500,102,0.2342259861,-0.0007629511,0.0068665599,,, +6.4199218750,102,0.2327000839,-0.0007629511,0.0648508431,,, +6.4218750000,102,0.2296482795,-0.0007629511,0.2220187686,,, +6.4238281250,102,0.2281223774,-0.0007629511,0.4676890211,,, +6.4257812500,102,0.2265964752,-0.0007629511,0.3929198138,,, +6.4277343750,102,0.2250705730,-0.0007629511,0.0785839628,,, +6.4296875000,102,0.2235446708,-0.0007629511,0.8705271992,,, +6.4316406250,102,0.2204928664,-0.0007629511,0.4341191730,,, +6.4335937500,102,0.2189669642,-0.0007629511,0.4631113146,,, +6.4355468750,102,0.2174410620,-0.0007629511,0.2540627146,,, +6.4375000000,103,0.2159151598,-0.0007629511,0.9544518196,,, +6.4394531250,103,0.2143892576,-0.0007629511,0.8674753948,,, +6.4414062500,103,0.2128633555,-0.0007629511,0.1060502022,,, +6.4433593750,103,0.2113374533,-0.0007629511,0.6965743496,,, +6.4453125000,103,0.2082856489,-0.0007629511,0.3212024109,,, +6.4472656250,103,0.2067597467,-0.0007629511,0.9987029831,,, +6.4492187500,103,0.2052338445,-0.0007629511,0.9086747539,,, +6.4511718750,103,0.2037079423,-0.0007629511,0.1014724956,,, +6.4531250000,103,0.2021820401,-0.0007629511,0.7667658503,,, +6.4550781250,103,0.2006561379,-0.0007629511,0.0053406577,,, +6.4570312500,103,0.1991302358,-0.0007629511,0.2250705730,,, +6.4589843750,103,0.1976043336,-0.0007629511,0.6431677729,,, +6.4609375000,103,0.1945525292,-0.0007629511,0.5622949569,,, +6.4628906250,103,0.1930266270,-0.0007629511,0.8491645686,,, +6.4648437500,103,0.1915007248,-0.0007629511,0.6431677729,,, +6.4667968750,103,0.1899748226,-0.0007629511,0.9056229496,,, +6.4687500000,103,0.1884489204,-0.0007629511,0.1319905394,,, +6.4707031250,103,0.1869230182,-0.0007629511,0.5973907073,,, +6.4726562500,103,0.1853971160,-0.0007629511,0.9300373846,,, +6.4746093750,103,0.1838712139,-0.0007629511,0.0938429847,,, +6.4765625000,103,0.1823453117,-0.0007629511,0.0267032883,,, +6.4785156250,103,0.1808194095,-0.0007629511,0.3166247044,,, +6.4804687500,103,0.1792935073,-0.0007629511,0.4295414664,,, +6.4824218750,103,0.1777676051,-0.0007629511,0.0572213321,,, +6.4843750000,103,0.1762417029,-0.0007629511,0.2555886168,,, +6.4863281250,103,0.1731898985,-0.0007629511,0.0694285496,,, +6.4882812500,103,0.1716639963,-0.0007629511,0.1518272679,,, +6.4902343750,103,0.1701380941,-0.0007629511,0.0999465934,,, +6.4921875000,103,0.1686121920,-0.0007629511,0.8720531014,,, +6.4941406250,103,0.1670862898,-0.0007629511,0.4707408255,,, +6.4960937500,103,0.1655603876,-0.0007629511,0.1731898985,,, +6.4980468750,103,0.1640344854,-0.0007629511,0.1365682460,,, +6.5000000000,104,0.1625085832,-0.0007629511,0.7545586328,,, +6.5019531250,104,0.1609826810,-0.0007629511,0.1152056153,,, +6.5039062500,104,0.1594567788,-0.0007629511,0.1655603876,,, +6.5058593750,104,0.1579308766,-0.0007629511,0.6553749905,,, +6.5078125000,104,0.1564049744,-0.0007629511,0.6050202182,,, +6.5097656250,104,0.1548790723,-0.0007629511,0.2388036927,,, +6.5117187500,104,0.1533531701,-0.0007629511,0.7194628824,,, +6.5136718750,104,0.1518272679,-0.0007629511,0.1411459525,,, +6.5156250000,104,0.1503013657,-0.0007629511,0.4692149233,,, +6.5175781250,104,0.1487754635,-0.0007629511,0.3654535744,,, +6.5195312500,104,0.1472495613,-0.0007629511,0.1258869306,,, +6.5214843750,104,0.1457236591,-0.0007629511,0.6584267948,,, +6.5234375000,104,0.1441977569,-0.0007629511,0.2220187686,,, +6.5253906250,104,0.1426718547,-0.0007629511,0.4402227817,,, +6.5273437500,104,0.1411459525,-0.0007629511,0.6279087510,,, +6.5292968750,104,0.1411459525,-0.0007629511,0.2891584649,,, +6.5312500000,104,0.1396200504,-0.0007629511,0.7087815671,,, +6.5332031250,104,0.1380941482,-0.0007629511,0.9529259174,,, +6.5351562500,104,0.1365682460,-0.0007629511,0.6263828489,,, +6.5371093750,104,0.1350423438,-0.0007629511,0.1045243000,,, +6.5390625000,104,0.1335164416,-0.0007629511,0.4097047379,,, +6.5410156250,104,0.1319905394,-0.0007629511,0.8857862211,,, +6.5429687500,104,0.1304646372,-0.0007629511,0.5287251087,,, +6.5449218750,104,0.1289387350,-0.0007629511,0.3959716182,,, +6.5468750000,104,0.1274128328,-0.0007629511,0.7469291218,,, +6.5488281250,104,0.1258869306,-0.0007629511,0.3517204547,,, +6.5507812500,104,0.1243610285,-0.0007629511,0.6279087510,,, +6.5527343750,104,0.1228351263,-0.0007629511,0.1167315175,,, +6.5546875000,104,0.1228351263,-0.0007629511,0.4570077058,,, +6.5566406250,104,0.1213092241,-0.0007629511,0.6004425116,,, +6.5585937500,104,0.1197833219,-0.0007629511,0.7225146868,,, +6.5605468750,104,0.1182574197,-0.0007629511,0.0831616693,,, +6.5625000000,105,0.1167315175,-0.0007629511,0.0572213321,,, +6.5644531250,105,0.1152056153,-0.0007629511,0.8216983291,,, +6.5664062500,105,0.1136797131,-0.0007629511,0.7957579919,,, +6.5683593750,105,0.1121538109,-0.0007629511,0.2769512474,,, +6.5703125000,105,0.1121538109,-0.0007629511,0.5058365759,,, +6.5722656250,105,0.1106279088,-0.0007629511,0.5134660868,,, +6.5742187500,105,0.1091020066,-0.0007629511,0.1075761044,,, +6.5761718750,105,0.1075761044,-0.0007629511,0.3105210956,,, +6.5781250000,105,0.1060502022,-0.0007629511,0.2815289540,,, +6.5800781250,105,0.1045243000,-0.0007629511,0.6019684138,,, +6.5820312500,105,0.1045243000,-0.0007629511,0.9193560693,,, +6.5839843750,105,0.1029983978,-0.0007629511,0.9468223087,,, +6.5859375000,105,0.1014724956,-0.0007629511,0.4005493248,,, +6.5878906250,105,0.0999465934,-0.0007629511,0.5104142824,,, +6.5898437500,105,0.0984206912,-0.0007629511,0.3486686503,,, +6.5917968750,105,0.0968947890,-0.0007629511,0.2464332036,,, +6.5937500000,105,0.0968947890,-0.0007629511,0.0465400168,,, +6.5957031250,105,0.0953688869,-0.0007629511,0.3486686503,,, +6.5976562500,105,0.0938429847,-0.0007629511,0.3974975204,,, +6.5996093750,105,0.0923170825,-0.0007629511,0.6874189364,,, +6.6015625000,105,0.0923170825,-0.0007629511,0.2357518883,,, +6.6035156250,105,0.0907911803,-0.0007629511,0.9117265583,,, +6.6054687500,105,0.0892652781,-0.0007629511,0.5043106737,,, +6.6074218750,105,0.0877393759,-0.0007629511,0.5256733043,,, +6.6093750000,105,0.0862134737,-0.0007629511,0.5195696956,,, +6.6113281250,105,0.0862134737,-0.0007629511,0.0434882124,,, +6.6132812500,105,0.0846875715,-0.0007629511,0.7133592737,,, +6.6152343750,105,0.0831616693,-0.0007629511,0.9239337758,,, +6.6171875000,105,0.0816357671,-0.0007629511,0.1197833219,,, +6.6191406250,105,0.0816357671,-0.0007629511,0.8232242313,,, +6.6210937500,105,0.0801098650,-0.0007629511,0.2021820401,,, +6.6230468750,105,0.0785839628,-0.0007629511,0.3318837263,,, +6.6250000000,106,0.0785839628,-0.0007629511,0.5516136416,,, +6.6269531250,106,0.0770580606,-0.0007629511,0.8842603189,,, +6.6289062500,106,0.0755321584,-0.0007629511,0.4402227817,,, +6.6308593750,106,0.0740062562,-0.0007629511,0.3654535744,,, +6.6328125000,106,0.0740062562,-0.0007629511,0.6660563058,,, +6.6347656250,106,0.0724803540,-0.0007629511,0.9224078737,,, +6.6367187500,106,0.0709544518,-0.0007629511,0.3440909438,,, +6.6386718750,106,0.0709544518,-0.0007629511,0.5668726635,,, +6.6406250000,106,0.0694285496,-0.0007629511,0.4188601511,,, +6.6425781250,106,0.0679026474,-0.0007629511,0.3349355306,,, +6.6445312500,106,0.0679026474,-0.0007629511,0.0434882124,,, +6.6464843750,106,0.0663767453,-0.0007629511,0.0129701686,,, +6.6484375000,106,0.0648508431,-0.0007629511,0.4966811627,,, +6.6503906250,106,0.0648508431,-0.0007629511,0.6019684138,,, +6.6523437500,106,0.0633249409,-0.0007629511,0.4539559014,,, +6.6542968750,106,0.0617990387,-0.0007629511,0.4615854124,,, +6.6562500000,106,0.0617990387,-0.0007629511,0.3471427481,,, +6.6582031250,106,0.0602731365,-0.0007629511,0.7454032197,,, +6.6601562500,106,0.0587472343,-0.0007629511,0.2540627146,,, +6.6621093750,106,0.0587472343,-0.0007629511,0.9391927977,,, +6.6640625000,106,0.0572213321,-0.0007629511,0.5287251087,,, +6.6660156250,106,0.0556954299,-0.0007629511,0.2265964752,,, +6.6679687500,106,0.0556954299,-0.0007629511,0.6691081102,,, +6.6699218750,106,0.0541695277,-0.0007629511,0.2296482795,,, +6.6718750000,106,0.0541695277,-0.0007629511,0.1213092241,,, +6.6738281250,106,0.0526436255,-0.0007629511,0.3517204547,,, +6.6757812500,106,0.0511177234,-0.0007629511,0.4936293584,,, +6.6777343750,106,0.0511177234,-0.0007629511,0.6401159686,,, +6.6796875000,106,0.0495918212,-0.0007629511,0.7713435569,,, +6.6816406250,106,0.0495918212,-0.0007629511,0.9925993744,,, +6.6835937500,106,0.0480659190,-0.0007629511,0.1960784314,,, +6.6855468750,106,0.0480659190,-0.0007629511,0.7606622416,,, +6.6875000000,107,0.0465400168,-0.0007629511,0.1594567788,,, +6.6894531250,107,0.0450141146,-0.0007629511,0.4875257496,,, +6.6914062500,107,0.0450141146,-0.0007629511,0.3517204547,,, +6.6933593750,107,0.0434882124,-0.0007629511,0.6630045014,,, +6.6953125000,107,0.0434882124,-0.0007629511,0.0373846036,,, +6.6972656250,107,0.0419623102,-0.0007629511,0.9483482109,,, +6.6992187500,107,0.0419623102,-0.0007629511,0.4554818036,,, +6.7011718750,107,0.0404364080,-0.0007629511,0.9788662547,,, +6.7031250000,107,0.0404364080,-0.0007629511,0.6965743496,,, +6.7050781250,107,0.0389105058,-0.0007629511,0.6416418708,,, +6.7070312500,107,0.0389105058,-0.0007629511,0.5882352941,,, +6.7089843750,107,0.0373846036,-0.0007629511,0.4997329671,,, +6.7109375000,107,0.0373846036,-0.0007629511,0.7682917525,,, +6.7128906250,107,0.0358587015,-0.0007629511,0.1594567788,,, +6.7148437500,107,0.0358587015,-0.0007629511,0.0312809949,,, +6.7167968750,107,0.0343327993,-0.0007629511,0.3410391394,,, +6.7187500000,107,0.0343327993,-0.0007629511,0.8262760357,,, +6.7207031250,107,0.0328068971,-0.0007629511,0.3913939117,,, +6.7226562500,107,0.0328068971,-0.0007629511,0.1670862898,,, +6.7246093750,107,0.0312809949,-0.0007629511,0.0038147555,,, +6.7265625000,107,0.0312809949,-0.0007629511,0.3501945525,,, +6.7285156250,107,0.0297550927,-0.0007629511,0.4890516518,,, +6.7304687500,107,0.0297550927,-0.0007629511,0.4371709773,,, +6.7324218750,107,0.0282291905,-0.0007629511,0.6706340124,,, +6.7343750000,107,0.0282291905,-0.0007629511,0.7591363394,,, +6.7363281250,107,0.0267032883,-0.0007629511,0.7042038605,,, +6.7382812500,107,0.0267032883,-0.0007629511,0.4295414664,,, +6.7402343750,107,0.0267032883,-0.0007629511,0.3166247044,,, +6.7421875000,107,0.0251773861,-0.0007629511,0.6828412299,,, +6.7441406250,107,0.0251773861,-0.0007629511,0.6050202182,,, +6.7460937500,107,0.0236514839,-0.0007629511,0.7637140459,,, +6.7480468750,107,0.0236514839,-0.0007629511,0.4997329671,,, +6.7500000000,108,0.0236514839,-0.0007629511,0.7011520562,,, +6.7519531250,108,0.0221255818,-0.0007629511,0.1152056153,,, +6.7539062500,108,0.0221255818,-0.0007629511,0.2922102693,,, +6.7558593750,108,0.0205996796,-0.0007629511,0.2723735409,,, +6.7578125000,108,0.0205996796,-0.0007629511,0.2082856489,,, +6.7597656250,108,0.0205996796,-0.0007629511,0.3501945525,,, +6.7617187500,108,0.0190737774,-0.0007629511,0.8583199817,,, +6.7636718750,108,0.0190737774,-0.0007629511,0.3135729000,,, +6.7656250000,108,0.0175478752,-0.0007629511,0.4783703365,,, +6.7675781250,108,0.0175478752,-0.0007629511,0.7530327306,,, +6.7695312500,108,0.0175478752,-0.0007629511,0.6889448386,,, +6.7714843750,108,0.0160219730,-0.0007629511,0.4631113146,,, +6.7734375000,108,0.0160219730,-0.0007629511,0.1533531701,,, +6.7753906250,108,0.0160219730,-0.0007629511,0.8018616007,,, +6.7773437500,108,0.0144960708,-0.0007629511,0.6462195773,,, +6.7792968750,108,0.0144960708,-0.0007629511,0.9651331350,,, +6.7812500000,108,0.0144960708,-0.0007629511,0.3593499657,,, +6.7832031250,108,0.0129701686,-0.0007629511,0.0968947890,,, +6.7851562500,108,0.0129701686,-0.0007629511,0.5226215000,,, +6.7871093750,108,0.0129701686,-0.0007629511,0.7713435569,,, +6.7890625000,108,0.0129701686,-0.0007629511,0.3089951934,,, +6.7910156250,108,0.0114442664,-0.0007629511,0.7301441978,,, +6.7929687500,108,0.0114442664,-0.0007629511,0.2098115511,,, +6.7949218750,108,0.0114442664,-0.0007629511,0.4768444343,,, +6.7968750000,108,0.0099183642,-0.0007629511,0.7179369802,,, +6.7988281250,108,0.0099183642,-0.0007629511,0.6462195773,,, +6.8007812500,108,0.0099183642,-0.0007629511,0.0022888533,,, +6.8027343750,108,0.0099183642,-0.0007629511,0.3120469978,,, +6.8046875000,108,0.0083924620,-0.0007629511,0.8064393072,,, +6.8066406250,108,0.0083924620,-0.0007629511,0.4615854124,,, +6.8085937500,108,0.0083924620,-0.0007629511,0.1274128328,,, +6.8105468750,108,0.0083924620,-0.0007629511,0.1304646372,,, +6.8125000000,109,0.0068665599,-0.0007629511,0.9880216678,,, +6.8144531250,109,0.0068665599,-0.0007629511,0.7621881437,,, +6.8164062500,109,0.0068665599,-0.0007629511,0.6172274357,,, +6.8183593750,109,0.0068665599,-0.0007629511,0.0511177234,,, +6.8203125000,109,0.0053406577,-0.0007629511,0.7927061875,,, +6.8222656250,109,0.0053406577,-0.0007629511,0.1899748226,,, +6.8242187500,109,0.0053406577,-0.0007629511,0.7225146868,,, +6.8261718750,109,0.0053406577,-0.0007629511,0.0434882124,,, +6.8281250000,109,0.0053406577,-0.0007629511,0.6385900664,,, +6.8300781250,109,0.0038147555,-0.0007629511,0.0755321584,,, +6.8320312500,109,0.0038147555,-0.0007629511,0.0144960708,,, +6.8339843750,109,0.0038147555,-0.0007629511,0.7545586328,,, +6.8359375000,109,0.0038147555,-0.0007629511,0.2159151598,,, +6.8378906250,109,0.0038147555,-0.0007629511,0.7698176547,,, +6.8398437500,109,0.0038147555,-0.0007629511,0.1564049744,,, +6.8417968750,109,0.0022888533,-0.0007629511,0.9864957656,,, +6.8437500000,109,0.0022888533,-0.0007629511,0.3150988022,,, +6.8457031250,109,0.0022888533,-0.0007629511,0.9544518196,,, +6.8476562500,109,0.0022888533,-0.0007629511,0.2052338445,,, +6.8496093750,109,0.0022888533,-0.0007629511,0.9651331350,,, +6.8515625000,109,0.0022888533,-0.0007629511,0.9224078737,,, +6.8535156250,109,0.0022888533,-0.0007629511,0.4631113146,,, +6.8554687500,109,0.0007629511,-0.0007629511,0.9391927977,,, +6.8574218750,109,0.0007629511,-0.0007629511,0.6782635233,,, +6.8593750000,109,0.0007629511,-0.0007629511,0.8827344167,,, +6.8613281250,109,0.0007629511,-0.0007629511,0.0297550927,,, +6.8632812500,109,0.0007629511,-0.0007629511,0.8125429160,,, +6.8652343750,109,0.0007629511,-0.0007629511,0.5622949569,,, +6.8671875000,109,0.0007629511,-0.0007629511,0.0053406577,,, +6.8691406250,109,0.0007629511,-0.0007629511,0.3181506065,,, +6.8710937500,109,0.0007629511,-0.0007629511,0.8232242313,,, +6.8730468750,109,0.0007629511,-0.0007629511,0.4997329671,,, +6.8750000000,110,-0.0007629511,-0.0007629511,0.4036011292,,, +6.8769531250,110,-0.0007629511,-0.0007629511,0.1884489204,,, +6.8789062500,110,-0.0007629511,-0.0007629511,0.5943389029,,, +6.8808593750,110,-0.0007629511,-0.0007629511,0.8735790036,,, +6.8828125000,110,-0.0007629511,-0.0007629511,0.8781567102,,, +6.8847656250,110,-0.0007629511,-0.0007629511,0.5485618372,,, +6.8867187500,110,-0.0007629511,-0.0007629511,0.2174410620,,, +6.8886718750,110,-0.0007629511,-0.0007629511,0.7133592737,,, +6.8906250000,110,-0.0007629511,-0.0007629511,0.2189669642,,, +6.8925781250,110,-0.0007629511,-0.0007629511,0.5226215000,,, +6.8945312500,110,-0.0007629511,-0.0007629511,0.7408255131,,, +6.8964843750,110,-0.0007629511,-0.0007629511,0.8522163729,,, +6.8984375000,110,-0.0007629511,-0.0007629511,0.6828412299,,, +6.9003906250,110,-0.0007629511,-0.0007629511,0.4463263905,,, +6.9023437500,110,-0.0007629511,-0.0007629511,0.2052338445,,, +6.9042968750,110,-0.0007629511,-0.0007629511,0.2143892576,,, +6.9062500000,110,-0.0007629511,-0.0007629511,0.6095979248,,, +6.9082031250,110,-0.0007629511,-0.0007629511,0.9330891890,,, +6.9101562500,110,-0.0007629511,-0.0007629511,0.5226215000,,, +6.9121093750,110,-0.0007629511,-0.0007629511,0.9025711452,,, +6.9140625000,110,-0.0007629511,-0.0007629511,0.6965743496,,, +6.9160156250,110,-0.0007629511,-0.0007629511,0.0907911803,,, +6.9179687500,110,-0.0007629511,-0.0007629511,0.9651331350,,, +6.9199218750,110,-0.0007629511,-0.0007629511,0.5912870985,,, +6.9218750000,110,-0.0007629511,-0.0007629511,0.7209887846,,, +6.9238281250,110,-0.0007629511,-0.0007629511,0.8140688182,,, +6.9257812500,110,-0.0007629511,-0.0007629511,0.7377737087,,, +6.9277343750,110,0.0007629511,-0.0007629511,0.3471427481,,, +6.9296875000,110,0.0007629511,-0.0007629511,0.8430609598,,, +6.9316406250,110,0.0007629511,-0.0007629511,0.9727626459,,, +6.9335937500,110,0.0007629511,-0.0007629511,0.6279087510,,, +6.9355468750,110,0.0007629511,-0.0007629511,0.2418554971,,, +6.9375000000,111,0.0007629511,-0.0007629511,0.7576104372,,, +6.9394531250,111,0.0007629511,-0.0007629511,0.8888380255,,, +6.9414062500,111,0.0007629511,-0.0007629511,0.2067597467,,, +6.9433593750,111,0.0007629511,-0.0007629511,0.9163042649,,, +6.9453125000,111,0.0007629511,-0.0007629511,0.1029983978,,, +6.9472656250,111,0.0007629511,-0.0007629511,0.8354314488,,, +6.9492187500,111,0.0022888533,-0.0007629511,0.6492713817,,, +6.9511718750,111,0.0022888533,-0.0007629511,0.6050202182,,, +6.9531250000,111,0.0022888533,-0.0007629511,0.5363546197,,, +6.9550781250,111,0.0022888533,-0.0007629511,0.5134660868,,, +6.9570312500,111,0.0022888533,-0.0007629511,0.8949416342,,, +6.9589843750,111,0.0022888533,-0.0007629511,0.9880216678,,, +6.9609375000,111,0.0038147555,-0.0007629511,0.9407186999,,, +6.9628906250,111,0.0038147555,-0.0007629511,0.6080720226,,, +6.9648437500,111,0.0038147555,-0.0007629511,0.4600595102,,, +6.9667968750,111,0.0038147555,-0.0007629511,0.0694285496,,, +6.9687500000,111,0.0038147555,-0.0007629511,0.6706340124,,, +6.9707031250,111,0.0038147555,-0.0007629511,0.6889448386,,, +6.9726562500,111,0.0053406577,-0.0007629511,0.6462195773,,, +6.9746093750,111,0.0053406577,-0.0007629511,0.6202792401,,, +6.9765625000,111,0.0053406577,-0.0007629511,0.3593499657,,, +6.9785156250,111,0.0053406577,-0.0007629511,0.9925993744,,, +6.9804687500,111,0.0053406577,-0.0007629511,0.5500877394,,, +6.9824218750,111,0.0068665599,-0.0007629511,0.2845807584,,, +6.9843750000,111,0.0068665599,-0.0007629511,0.5287251087,,, +6.9863281250,111,0.0068665599,-0.0007629511,0.6614785992,,, +6.9882812500,111,0.0068665599,-0.0007629511,0.4585336080,,, +6.9902343750,111,0.0083924620,-0.0007629511,0.4325932708,,, +6.9921875000,111,0.0083924620,-0.0007629511,0.2555886168,,, +6.9941406250,111,0.0083924620,-0.0007629511,0.3273060197,,, +6.9960937500,111,0.0083924620,-0.0007629511,0.3624017700,,, +6.9980468750,111,0.0099183642,-0.0007629511,0.4676890211,,, +7.0000000000,112,0.0099183642,-0.0007629511,0.6431677729,,, +7.0019531250,112,0.0099183642,-0.0007629511,0.6202792401,,, +7.0039062500,112,0.0099183642,-0.0007629511,0.1228351263,,, +7.0058593750,112,0.0114442664,-0.0007629511,0.4692149233,,, +7.0078125000,112,0.0114442664,-0.0007629511,0.6279087510,,, +7.0097656250,112,0.0114442664,-0.0007629511,0.3364614328,,, +7.0117187500,112,0.0114442664,-0.0007629511,0.2067597467,,, +7.0136718750,112,0.0129701686,-0.0007629511,0.6981002518,,, +7.0156250000,112,0.0129701686,-0.0007629511,0.7362478065,,, +7.0175781250,112,0.0129701686,-0.0007629511,0.8796826123,,, +7.0195312500,112,0.0144960708,-0.0007629511,0.4493781949,,, +7.0214843750,112,0.0144960708,-0.0007629511,0.7606622416,,, +7.0234375000,112,0.0144960708,-0.0007629511,0.0205996796,,, +7.0253906250,112,0.0160219730,-0.0007629511,0.1518272679,,, +7.0273437500,112,0.0160219730,-0.0007629511,0.9193560693,,, +7.0292968750,112,0.0160219730,-0.0007629511,0.2616922255,,, +7.0312500000,112,0.0175478752,-0.0007629511,0.9666590372,,, +7.0332031250,112,0.0175478752,-0.0007629511,0.4509040970,,, +7.0351562500,112,0.0175478752,-0.0007629511,0.9407186999,,, +7.0371093750,112,0.0190737774,-0.0007629511,0.1396200504,,, +7.0390625000,112,0.0190737774,-0.0007629511,0.1014724956,,, +7.0410156250,112,0.0205996796,-0.0007629511,0.0572213321,,, +7.0429687500,112,0.0205996796,-0.0007629511,0.7087815671,,, +7.0449218750,112,0.0205996796,-0.0007629511,0.9559777218,,, +7.0468750000,112,0.0221255818,-0.0007629511,0.7515068284,,, +7.0488281250,112,0.0221255818,-0.0007629511,0.9056229496,,, +7.0507812500,112,0.0221255818,-0.0007629511,0.4020752270,,, +7.0527343750,112,0.0236514839,-0.0007629511,0.0511177234,,, +7.0546875000,112,0.0236514839,-0.0007629511,0.6431677729,,, +7.0566406250,112,0.0251773861,-0.0007629511,0.8613717861,,, +7.0585937500,112,0.0251773861,-0.0007629511,0.9681849393,,, +7.0605468750,112,0.0267032883,-0.0007629511,0.5790798810,,, +7.0625000000,113,0.0267032883,-0.0007629511,0.9437705043,,, +7.0644531250,113,0.0267032883,-0.0007629511,0.1152056153,,, +7.0664062500,113,0.0282291905,-0.0007629511,0.4264896620,,, +7.0683593750,113,0.0282291905,-0.0007629511,0.1365682460,,, +7.0703125000,113,0.0297550927,-0.0007629511,0.3318837263,,, +7.0722656250,113,0.0297550927,-0.0007629511,0.6645304036,,, +7.0742187500,113,0.0312809949,-0.0007629511,0.8201724269,,, +7.0761718750,113,0.0312809949,-0.0007629511,0.9483482109,,, +7.0781250000,113,0.0328068971,-0.0007629511,0.3562981613,,, +7.0800781250,113,0.0328068971,-0.0007629511,0.4692149233,,, +7.0820312500,113,0.0343327993,-0.0007629511,0.3120469978,,, +7.0839843750,113,0.0343327993,-0.0007629511,0.3837644007,,, +7.0859375000,113,0.0343327993,-0.0007629511,0.3181506065,,, +7.0878906250,113,0.0358587015,-0.0007629511,0.5302510109,,, +7.0898437500,113,0.0358587015,-0.0007629511,0.9025711452,,, +7.0917968750,113,0.0373846036,-0.0007629511,0.0022888533,,, +7.0937500000,113,0.0373846036,-0.0007629511,0.9971770809,,, +7.0957031250,113,0.0389105058,-0.0007629511,0.7957579919,,, +7.0976562500,113,0.0404364080,-0.0007629511,0.9025711452,,, +7.0996093750,113,0.0404364080,-0.0007629511,0.4356450752,,, +7.1015625000,113,0.0419623102,-0.0007629511,0.9727626459,,, +7.1035156250,113,0.0419623102,-0.0007629511,0.6889448386,,, +7.1054687500,113,0.0434882124,-0.0007629511,0.1045243000,,, +7.1074218750,113,0.0434882124,-0.0007629511,0.5790798810,,, +7.1093750000,113,0.0450141146,-0.0007629511,0.0236514839,,, +7.1113281250,113,0.0450141146,-0.0007629511,0.6507972839,,, +7.1132812500,113,0.0465400168,-0.0007629511,0.6187533379,,, +7.1152343750,113,0.0465400168,-0.0007629511,0.0495918212,,, +7.1171875000,113,0.0480659190,-0.0007629511,0.9666590372,,, +7.1191406250,113,0.0495918212,-0.0007629511,0.9376668956,,, +7.1210937500,113,0.0495918212,-0.0007629511,0.1792935073,,, +7.1230468750,113,0.0511177234,-0.0007629511,0.8110170138,,, +7.1250000000,114,0.0511177234,-0.0007629511,0.1915007248,,, +7.1269531250,114,0.0526436255,-0.0007629511,0.5699244678,,, +7.1289062500,114,0.0541695277,-0.0007629511,0.2433813993,,, +7.1308593750,114,0.0541695277,-0.0007629511,0.4875257496,,, +7.1328125000,114,0.0556954299,-0.0007629511,0.8812085145,,, +7.1347656250,114,0.0556954299,-0.0007629511,0.7743953613,,, +7.1367187500,114,0.0572213321,-0.0007629511,0.1457236591,,, +7.1386718750,114,0.0587472343,-0.0007629511,0.4646372168,,, +7.1406250000,114,0.0587472343,-0.0007629511,0.8934157321,,, +7.1425781250,114,0.0602731365,-0.0007629511,0.6492713817,,, +7.1445312500,114,0.0602731365,-0.0007629511,0.9514000153,,, +7.1464843750,114,0.0617990387,-0.0007629511,0.0114442664,,, +7.1484375000,114,0.0633249409,-0.0007629511,0.0785839628,,, +7.1503906250,114,0.0633249409,-0.0007629511,0.7316700999,,, +7.1523437500,114,0.0648508431,-0.0007629511,0.4966811627,,, +7.1542968750,114,0.0663767453,-0.0007629511,0.8934157321,,, +7.1562500000,114,0.0663767453,-0.0007629511,0.0526436255,,, +7.1582031250,114,0.0679026474,-0.0007629511,0.3150988022,,, +7.1601562500,114,0.0694285496,-0.0007629511,0.5729762722,,, +7.1621093750,114,0.0694285496,-0.0007629511,0.4081788357,,, +7.1640625000,114,0.0709544518,-0.0007629511,0.7423514153,,, +7.1660156250,114,0.0724803540,-0.0007629511,0.1106279088,,, +7.1679687500,114,0.0740062562,-0.0007629511,0.8171206226,,, +7.1699218750,114,0.0740062562,-0.0007629511,0.6889448386,,, +7.1718750000,114,0.0755321584,-0.0007629511,0.7560845350,,, +7.1738281250,114,0.0770580606,-0.0007629511,0.7408255131,,, +7.1757812500,114,0.0770580606,-0.0007629511,0.5943389029,,, +7.1777343750,114,0.0785839628,-0.0007629511,0.1762417029,,, +7.1796875000,114,0.0801098650,-0.0007629511,0.3044174868,,, +7.1816406250,114,0.0816357671,-0.0007629511,0.9193560693,,, +7.1835937500,114,0.0816357671,-0.0007629511,0.4844739452,,, +7.1855468750,114,0.0831616693,-0.0007629511,0.4661631189,,, +7.1875000000,115,0.0846875715,-0.0007629511,0.6630045014,,, +7.1894531250,115,0.0862134737,-0.0007629511,0.8247501335,,, +7.1914062500,115,0.0862134737,-0.0007629511,0.3135729000,,, +7.1933593750,115,0.0877393759,-0.0007629511,0.9422446021,,, +7.1953125000,115,0.0892652781,-0.0007629511,0.7423514153,,, +7.1972656250,115,0.0907911803,-0.0007629511,0.7942320897,,, +7.1992187500,115,0.0907911803,-0.0007629511,0.3181506065,,, +7.2011718750,115,0.0923170825,-0.0007629511,0.8079652094,,, +7.2031250000,115,0.0938429847,-0.0007629511,0.9544518196,,, +7.2050781250,115,0.0953688869,-0.0007629511,0.6172274357,,, +7.2070312500,115,0.0968947890,-0.0007629511,0.7881284810,,, +7.2089843750,115,0.0968947890,-0.0007629511,0.3059433890,,, +7.2109375000,115,0.0984206912,-0.0007629511,0.2296482795,,, +7.2128906250,115,0.0999465934,-0.0007629511,0.5226215000,,, +7.2148437500,115,0.1014724956,-0.0007629511,0.3440909438,,, +7.2167968750,115,0.1029983978,-0.0007629511,0.2113374533,,, +7.2187500000,115,0.1029983978,-0.0007629511,0.5806057832,,, +7.2207031250,115,0.1045243000,-0.0007629511,0.3761348898,,, +7.2226562500,115,0.1060502022,-0.0007629511,0.7392996109,,, +7.2246093750,115,0.1075761044,-0.0007629511,0.6782635233,,, +7.2265625000,115,0.1091020066,-0.0007629511,0.6935225452,,, +7.2285156250,115,0.1106279088,-0.0007629511,0.4448004883,,, +7.2304687500,115,0.1106279088,-0.0007629511,0.8049134051,,, +7.2324218750,115,0.1121538109,-0.0007629511,0.9620813306,,, +7.2343750000,115,0.1136797131,-0.0007629511,0.1197833219,,, +7.2363281250,115,0.1152056153,-0.0007629511,0.5745021744,,, +7.2382812500,115,0.1167315175,-0.0007629511,0.2632181277,,, +7.2402343750,115,0.1182574197,-0.0007629511,0.8461127642,,, +7.2421875000,115,0.1197833219,-0.0007629511,0.3288319219,,, +7.2441406250,115,0.1197833219,-0.0007629511,0.1182574197,,, +7.2460937500,115,0.1213092241,-0.0007629511,0.1655603876,,, +7.2480468750,115,0.1228351263,-0.0007629511,0.3593499657,,, +7.2500000000,116,0.1243610285,-0.0007629511,0.9742885481,,, +7.2519531250,116,0.1258869306,-0.0007629511,0.4051270314,,, +7.2539062500,116,0.1274128328,-0.0007629511,0.9361409934,,, +7.2558593750,116,0.1289387350,-0.0007629511,0.6309605554,,, +7.2578125000,116,0.1304646372,-0.0007629511,0.1503013657,,, +7.2597656250,116,0.1319905394,-0.0007629511,0.7484550240,,, +7.2617187500,116,0.1335164416,-0.0007629511,0.5577172503,,, +7.2636718750,116,0.1350423438,-0.0007629511,0.6202792401,,, +7.2656250000,116,0.1365682460,-0.0007629511,0.0602731365,,, +7.2675781250,116,0.1365682460,-0.0007629511,0.6813153277,,, +7.2695312500,116,0.1380941482,-0.0007629511,0.3852903029,,, +7.2714843750,116,0.1396200504,-0.0007629511,0.1701380941,,, +7.2734375000,116,0.1411459525,-0.0007629511,0.4081788357,,, +7.2753906250,116,0.1426718547,-0.0007629511,0.5455100328,,, +7.2773437500,116,0.1441977569,-0.0007629511,0.8049134051,,, +7.2792968750,116,0.1457236591,-0.0007629511,0.2647440299,,, +7.2812500000,116,0.1472495613,-0.0007629511,0.5638208591,,, +7.2832031250,116,0.1487754635,-0.0007629511,0.7927061875,,, +7.2851562500,116,0.1503013657,-0.0007629511,0.8613717861,,, +7.2871093750,116,0.1518272679,-0.0007629511,0.5607690547,,, +7.2890625000,116,0.1533531701,-0.0007629511,0.8049134051,,, +7.2910156250,116,0.1548790723,-0.0007629511,0.2113374533,,, +7.2929687500,116,0.1564049744,-0.0007629511,0.1579308766,,, +7.2949218750,116,0.1579308766,-0.0007629511,0.3913939117,,, +7.2968750000,116,0.1594567788,-0.0007629511,0.1899748226,,, +7.2988281250,116,0.1609826810,-0.0007629511,0.5516136416,,, +7.3007812500,116,0.1625085832,-0.0007629511,0.8003356985,,, +7.3027343750,116,0.1640344854,-0.0007629511,0.8278019379,,, +7.3046875000,116,0.1655603876,-0.0007629511,0.9391927977,,, +7.3066406250,116,0.1670862898,-0.0007629511,0.3395132372,,, +7.3085937500,116,0.1686121920,-0.0007629511,0.7286182956,,, +7.3105468750,116,0.1701380941,-0.0007629511,0.7896543832,,, +7.3125000000,117,0.1716639963,-0.0007629511,0.3196765087,,, +7.3144531250,117,0.1731898985,-0.0007629511,0.2708476387,,, +7.3164062500,117,0.1747158007,-0.0007629511,0.9864957656,,, +7.3183593750,117,0.1762417029,-0.0007629511,0.0846875715,,, +7.3203125000,117,0.1777676051,-0.0007629511,0.8918898299,,, +7.3222656250,117,0.1808194095,-0.0007629511,0.0984206912,,, +7.3242187500,117,0.1823453117,-0.0007629511,0.6294346532,,, +7.3261718750,117,0.1838712139,-0.0007629511,0.4509040970,,, +7.3281250000,117,0.1853971160,-0.0007629511,0.9315632868,,, +7.3300781250,117,0.1869230182,-0.0007629511,0.0923170825,,, +7.3320312500,117,0.1884489204,-0.0007629511,0.2983138781,,, +7.3339843750,117,0.1899748226,-0.0007629511,0.9040970474,,, +7.3359375000,117,0.1915007248,-0.0007629511,0.8339055467,,, +7.3378906250,117,0.1930266270,-0.0007629511,0.4493781949,,, +7.3398437500,117,0.1945525292,-0.0007629511,0.4539559014,,, +7.3417968750,117,0.1960784314,-0.0007629511,0.2052338445,,, +7.3437500000,117,0.1976043336,-0.0007629511,0.3212024109,,, +7.3457031250,117,0.2006561379,-0.0007629511,0.4600595102,,, +7.3476562500,117,0.2021820401,-0.0007629511,0.6584267948,,, +7.3496093750,117,0.2037079423,-0.0007629511,0.5760280766,,, +7.3515625000,117,0.2052338445,-0.0007629511,0.0160219730,,, +7.3535156250,117,0.2067597467,-0.0007629511,0.9758144503,,, +7.3554687500,117,0.2082856489,-0.0007629511,0.0465400168,,, +7.3574218750,117,0.2098115511,-0.0007629511,0.6507972839,,, +7.3593750000,117,0.2113374533,-0.0007629511,0.0724803540,,, +7.3613281250,117,0.2143892576,-0.0007629511,0.3303578241,,, +7.3632812500,117,0.2159151598,-0.0007629511,0.3913939117,,, +7.3652343750,117,0.2174410620,-0.0007629511,0.4966811627,,, +7.3671875000,117,0.2189669642,-0.0007629511,0.5271992065,,, +7.3691406250,117,0.2204928664,-0.0007629511,0.9437705043,,, +7.3710937500,117,0.2220187686,-0.0007629511,0.9224078737,,, +7.3730468750,117,0.2250705730,-0.0007629511,0.8018616007,,, +7.3750000000,118,0.2265964752,-0.0007629511,0.0312809949,,, +7.3769531250,118,0.2281223774,-0.0007629511,0.1777676051,,, +7.3789062500,118,0.2296482795,-0.0007629511,0.6752117189,,, +7.3808593750,118,0.2311741817,-0.0007629511,0.6630045014,,, +7.3828125000,118,0.2327000839,-0.0007629511,0.4295414664,,, +7.3847656250,118,0.2357518883,-0.0007629511,0.7759212634,,, +7.3867187500,118,0.2372777905,-0.0007629511,0.9452964065,,, +7.3886718750,118,0.2388036927,-0.0007629511,0.9651331350,,, +7.3906250000,118,0.2403295949,-0.0007629511,0.0389105058,,, +7.3925781250,118,0.2418554971,-0.0007629511,0.6050202182,,, +7.3945312500,118,0.2449073014,-0.0007629511,0.1152056153,,, +7.3964843750,118,0.2464332036,-0.0007629511,0.9864957656,,, +7.3984375000,118,0.2479591058,-0.0007629511,0.3334096284,,, +7.4003906250,118,0.2494850080,-0.0007629511,0.6446936751,,, +7.4023437500,118,0.2525368124,-0.0007629511,0.5714503700,,, +7.4042968750,118,0.2540627146,-0.0007629511,0.1075761044,,, +7.4062500000,118,0.2555886168,-0.0007629511,0.7194628824,,, +7.4082031250,118,0.2571145190,-0.0007629511,0.8094911116,,, +7.4101562500,118,0.2601663233,-0.0007629511,0.6858930343,,, +7.4121093750,118,0.2616922255,-0.0007629511,0.7072556649,,, +7.4140625000,118,0.2632181277,-0.0007629511,0.9895475700,,, +7.4160156250,118,0.2647440299,-0.0007629511,0.2754253452,,, +7.4179687500,118,0.2677958343,-0.0007629511,0.5775539788,,, +7.4199218750,118,0.2693217365,-0.0007629511,0.7484550240,,, +7.4218750000,118,0.2708476387,-0.0007629511,0.5470359350,,, +7.4238281250,118,0.2723735409,-0.0007629511,0.2357518883,,, +7.4257812500,118,0.2754253452,-0.0007629511,0.7789730678,,, +7.4277343750,118,0.2769512474,-0.0007629511,0.9086747539,,, +7.4296875000,118,0.2784771496,-0.0007629511,0.4539559014,,, +7.4316406250,118,0.2815289540,-0.0007629511,0.0419623102,,, +7.4335937500,118,0.2830548562,-0.0007629511,0.8400091554,,, +7.4355468750,118,0.2845807584,-0.0007629511,0.1670862898,,, +7.4375000000,119,0.2861066606,-0.0007629511,0.5836575875,,, +7.4394531250,119,0.2891584649,-0.0007629511,0.0679026474,,, +7.4414062500,119,0.2906843671,-0.0007629511,0.1029983978,,, +7.4433593750,119,0.2922102693,-0.0007629511,0.5622949569,,, +7.4453125000,119,0.2952620737,-0.0007629511,0.1930266270,,, +7.4472656250,119,0.2967879759,-0.0007629511,0.6004425116,,, +7.4492187500,119,0.2983138781,-0.0007629511,0.0755321584,,, +7.4511718750,119,0.3013656825,-0.0007629511,0.5836575875,,, +7.4531250000,119,0.3028915846,-0.0007629511,0.1014724956,,, +7.4550781250,119,0.3044174868,-0.0007629511,0.4234378576,,, +7.4570312500,119,0.3074692912,-0.0007629511,0.9712367437,,, +7.4589843750,119,0.3089951934,-0.0007629511,0.3547722591,,, +7.4609375000,119,0.3105210956,-0.0007629511,0.1792935073,,, +7.4628906250,119,0.3135729000,-0.0007629511,0.3929198138,,, +7.4648437500,119,0.3150988022,-0.0007629511,0.3089951934,,, +7.4667968750,119,0.3166247044,-0.0007629511,0.3212024109,,, +7.4687500000,119,0.3196765087,-0.0007629511,0.5119401846,,, +7.4707031250,119,0.3212024109,-0.0007629511,0.4585336080,,, +7.4726562500,119,0.3227283131,-0.0007629511,0.7042038605,,, +7.4746093750,119,0.3257801175,-0.0007629511,0.4615854124,,, +7.4765625000,119,0.3273060197,-0.0007629511,0.9132524605,,, +7.4785156250,119,0.3303578241,-0.0007629511,0.3425650416,,, +7.4804687500,119,0.3318837263,-0.0007629511,0.7240405890,,, +7.4824218750,119,0.3334096284,-0.0007629511,0.7148851759,,, +7.4843750000,119,0.3364614328,-0.0007629511,0.5180437934,,, +7.4863281250,119,0.3379873350,-0.0007629511,0.1152056153,,, +7.4882812500,119,0.3395132372,-0.0007629511,0.4325932708,,, +7.4902343750,119,0.3425650416,-0.0007629511,0.8888380255,,, +7.4921875000,119,0.3440909438,-0.0007629511,0.7148851759,,, +7.4941406250,119,0.3471427481,-0.0007629511,0.4386968795,,, +7.4960937500,119,0.3486686503,-0.0007629511,0.7911802853,,, +7.4980468750,119,0.3501945525,-0.0007629511,0.2906843671,,, +7.5000000000,120,0.3532463569,-0.0007629511,0.0892652781,,, +7.5019531250,120,0.3547722591,-0.0007629511,0.2967879759,,, +7.5039062500,120,0.3578240635,-0.0007629511,0.8110170138,,, +7.5058593750,120,0.3593499657,-0.0007629511,0.7331960021,,, +7.5078125000,120,0.3624017700,-0.0007629511,0.6721599145,,, +7.5097656250,120,0.3639276722,-0.0007629511,0.2876325628,,, +7.5117187500,120,0.3654535744,-0.0007629511,0.4798962387,,, +7.5136718750,120,0.3685053788,-0.0007629511,0.2433813993,,, +7.5156250000,120,0.3700312810,-0.0007629511,0.4478522927,,, +7.5175781250,120,0.3730830854,-0.0007629511,0.8552681773,,, +7.5195312500,120,0.3746089876,-0.0007629511,0.0190737774,,, +7.5214843750,120,0.3776607919,-0.0007629511,0.1594567788,,, +7.5234375000,120,0.3791866941,-0.0007629511,0.0251773861,,, +7.5253906250,120,0.3822384985,-0.0007629511,0.3425650416,,, +7.5273437500,120,0.3837644007,-0.0007629511,0.4478522927,,, +7.5292968750,120,0.3852903029,-0.0007629511,0.7164110780,,, +7.5312500000,120,0.3883421073,-0.0007629511,0.8232242313,,, +7.5332031250,120,0.3898680095,-0.0007629511,0.9498741131,,, +7.5351562500,120,0.3929198138,-0.0007629511,0.3318837263,,, +7.5371093750,120,0.3944457160,-0.0007629511,0.7316700999,,, +7.5390625000,120,0.3974975204,-0.0007629511,0.0343327993,,, +7.5410156250,120,0.3990234226,-0.0007629511,0.4142824445,,, +7.5429687500,120,0.4020752270,-0.0007629511,0.0495918212,,, +7.5449218750,120,0.4036011292,-0.0007629511,0.9620813306,,, +7.5468750000,120,0.4066529335,-0.0007629511,0.1152056153,,, +7.5488281250,120,0.4081788357,-0.0007629511,0.1106279088,,, +7.5507812500,120,0.4112306401,-0.0007629511,0.5104142824,,, +7.5527343750,120,0.4127565423,-0.0007629511,0.6614785992,,, +7.5546875000,120,0.4158083467,-0.0007629511,0.9834439612,,, +7.5566406250,120,0.4173342489,-0.0007629511,0.0740062562,,, +7.5585937500,120,0.4203860533,-0.0007629511,0.1411459525,,, +7.5605468750,120,0.4219119554,-0.0007629511,0.8049134051,,, +7.5625000000,121,0.4249637598,-0.0007629511,0.0587472343,,, +7.5644531250,121,0.4264896620,-0.0007629511,0.1121538109,,, +7.5664062500,121,0.4295414664,-0.0007629511,0.3593499657,,, +7.5683593750,121,0.4310673686,-0.0007629511,0.8079652094,,, +7.5703125000,121,0.4341191730,-0.0007629511,0.6324864576,,, +7.5722656250,121,0.4356450752,-0.0007629511,0.1976043336,,, +7.5742187500,121,0.4386968795,-0.0007629511,0.0480659190,,, +7.5761718750,121,0.4417486839,-0.0007629511,0.7850766766,,, +7.5781250000,121,0.4432745861,-0.0007629511,0.4356450752,,, +7.5800781250,121,0.4463263905,-0.0007629511,0.2174410620,,, +7.5820312500,121,0.4478522927,-0.0007629511,0.6996261540,,, +7.5839843750,121,0.4509040970,-0.0007629511,0.8445868620,,, +7.5859375000,121,0.4524299992,-0.0007629511,0.4844739452,,, +7.5878906250,121,0.4554818036,-0.0007629511,0.8995193408,,, +7.5898437500,121,0.4570077058,-0.0007629511,0.7484550240,,, +7.5917968750,121,0.4600595102,-0.0007629511,0.7331960021,,, +7.5937500000,121,0.4631113146,-0.0007629511,0.1960784314,,, +7.5957031250,121,0.4646372168,-0.0007629511,0.0221255818,,, +7.5976562500,121,0.4676890211,-0.0007629511,0.9498741131,,, +7.5996093750,121,0.4692149233,-0.0007629511,0.3929198138,,, +7.6015625000,121,0.4722667277,-0.0007629511,0.9666590372,,, +7.6035156250,121,0.4737926299,-0.0007629511,0.8155947204,,, +7.6054687500,121,0.4768444343,-0.0007629511,0.6767376211,,, +7.6074218750,121,0.4798962387,-0.0007629511,0.7011520562,,, +7.6093750000,121,0.4814221408,-0.0007629511,0.8354314488,,, +7.6113281250,121,0.4844739452,-0.0007629511,0.8140688182,,, +7.6132812500,121,0.4859998474,-0.0007629511,0.4997329671,,, +7.6152343750,121,0.4890516518,-0.0007629511,0.0480659190,,, +7.6171875000,121,0.4905775540,-0.0007629511,0.4921034562,,, +7.6191406250,121,0.4936293584,-0.0007629511,0.1350423438,,, +7.6210937500,121,0.4966811627,-0.0007629511,0.4310673686,,, +7.6230468750,121,0.4982070649,-0.0007629511,0.9620813306,,, +7.6250000000,122,0.5012588693,-0.0007629511,0.3120469978,,, +7.6269531250,122,0.5027847715,-0.0007629511,0.9224078737,,, +7.6289062500,122,0.5058365759,-0.0007629511,0.3593499657,,, +7.6308593750,122,0.5088883803,-0.0007629511,0.1091020066,,, +7.6328125000,122,0.5104142824,-0.0007629511,0.8079652094,,, +7.6347656250,122,0.5134660868,-0.0007629511,0.1853971160,,, +7.6367187500,122,0.5165178912,-0.0007629511,0.8827344167,,, +7.6386718750,122,0.5180437934,-0.0007629511,0.1976043336,,, +7.6406250000,122,0.5210955978,-0.0007629511,0.4386968795,,, +7.6425781250,122,0.5226215000,-0.0007629511,0.6263828489,,, +7.6445312500,122,0.5256733043,-0.0007629511,0.0572213321,,, +7.6464843750,122,0.5287251087,-0.0007629511,0.1701380941,,, +7.6484375000,122,0.5302510109,-0.0007629511,0.8659494926,,, +7.6503906250,122,0.5333028153,-0.0007629511,0.3837644007,,, +7.6523437500,122,0.5363546197,-0.0007629511,0.8812085145,,, +7.6542968750,122,0.5378805219,-0.0007629511,0.3120469978,,, +7.6562500000,122,0.5409323262,-0.0007629511,0.6340123598,,, +7.6582031250,122,0.5439841306,-0.0007629511,0.2937361715,,, +7.6601562500,122,0.5455100328,-0.0007629511,0.3746089876,,, +7.6621093750,122,0.5485618372,-0.0007629511,0.4386968795,,, +7.6640625000,122,0.5516136416,-0.0007629511,0.5378805219,,, +7.6660156250,122,0.5531395438,-0.0007629511,0.8079652094,,, +7.6679687500,122,0.5561913481,-0.0007629511,0.9086747539,,, +7.6699218750,122,0.5592431525,-0.0007629511,0.3242542153,,, +7.6718750000,122,0.5607690547,-0.0007629511,0.9285114824,,, +7.6738281250,122,0.5638208591,-0.0007629511,0.4402227817,,, +7.6757812500,122,0.5668726635,-0.0007629511,0.3807125963,,, +7.6777343750,122,0.5683985657,-0.0007629511,0.8567940795,,, +7.6796875000,122,0.5714503700,-0.0007629511,0.6401159686,,, +7.6816406250,122,0.5745021744,-0.0007629511,0.2616922255,,, +7.6835937500,122,0.5760280766,-0.0007629511,0.7316700999,,, +7.6855468750,122,0.5790798810,-0.0007629511,0.0389105058,,, +7.6875000000,123,0.5821316854,-0.0007629511,0.2693217365,,, +7.6894531250,123,0.5836575875,-0.0007629511,0.6462195773,,, +7.6914062500,123,0.5867093919,-0.0007629511,0.8888380255,,, +7.6933593750,123,0.5897611963,-0.0007629511,0.4737926299,,, +7.6953125000,123,0.5912870985,-0.0007629511,0.4554818036,,, +7.6972656250,123,0.5943389029,-0.0007629511,0.2357518883,,, +7.6992187500,123,0.5973907073,-0.0007629511,0.5851834897,,, +7.7011718750,123,0.5989166094,-0.0007629511,0.3791866941,,, +7.7031250000,123,0.6019684138,-0.0007629511,0.3166247044,,, +7.7050781250,123,0.6050202182,-0.0007629511,0.1747158007,,, +7.7070312500,123,0.6080720226,-0.0007629511,0.9758144503,,, +7.7089843750,123,0.6095979248,-0.0007629511,0.7804989700,,, +7.7109375000,123,0.6126497292,-0.0007629511,0.9864957656,,, +7.7128906250,123,0.6157015335,-0.0007629511,0.8247501335,,, +7.7148437500,123,0.6172274357,-0.0007629511,0.3379873350,,, +7.7167968750,123,0.6202792401,-0.0007629511,0.4325932708,,, +7.7187500000,123,0.6233310445,-0.0007629511,0.2906843671,,, +7.7207031250,123,0.6263828489,-0.0007629511,0.5928130007,,, +7.7226562500,123,0.6279087510,-0.0007629511,0.5043106737,,, +7.7246093750,123,0.6309605554,-0.0007629511,0.8628976883,,, +7.7265625000,123,0.6340123598,-0.0007629511,0.8155947204,,, +7.7285156250,123,0.6355382620,-0.0007629511,0.6462195773,,, +7.7304687500,123,0.6385900664,-0.0007629511,0.5668726635,,, +7.7324218750,123,0.6416418708,-0.0007629511,0.1289387350,,, +7.7343750000,123,0.6446936751,-0.0007629511,0.0358587015,,, +7.7363281250,123,0.6462195773,-0.0007629511,0.7377737087,,, +7.7382812500,123,0.6492713817,-0.0007629511,0.9452964065,,, +7.7402343750,123,0.6523231861,-0.0007629511,0.4249637598,,, +7.7421875000,123,0.6553749905,-0.0007629511,0.2342259861,,, +7.7441406250,123,0.6569008927,-0.0007629511,0.8690012970,,, +7.7460937500,123,0.6599526970,-0.0007629511,0.1503013657,,, +7.7480468750,123,0.6630045014,-0.0007629511,0.0404364080,,, +7.7500000000,124,0.6660563058,-0.0007629511,0.3150988022,,, +7.7519531250,124,0.6675822080,-0.0007629511,0.8674753948,,, +7.7539062500,124,0.6706340124,-0.0007629511,0.9880216678,,, +7.7558593750,124,0.6736858167,-0.0007629511,0.7438773175,,, +7.7578125000,124,0.6767376211,-0.0007629511,0.4234378576,,, +7.7597656250,124,0.6782635233,-0.0007629511,0.9269855802,,, +7.7617187500,124,0.6813153277,-0.0007629511,0.1411459525,,, +7.7636718750,124,0.6843671321,-0.0007629511,0.6752117189,,, +7.7656250000,124,0.6874189364,-0.0007629511,0.6843671321,,, +7.7675781250,124,0.6889448386,-0.0007629511,0.5622949569,,, +7.7695312500,124,0.6919966430,-0.0007629511,0.7728694591,,, +7.7714843750,124,0.6950484474,-0.0007629511,0.7621881437,,, +7.7734375000,124,0.6981002518,-0.0007629511,0.8751049058,,, +7.7753906250,124,0.6996261540,-0.0007629511,0.0740062562,,, +7.7773437500,124,0.7026779583,-0.0007629511,0.8216983291,,, +7.7792968750,124,0.7057297627,-0.0007629511,0.2922102693,,, +7.7812500000,124,0.7087815671,-0.0007629511,0.1503013657,,, +7.7832031250,124,0.7118333715,-0.0007629511,0.4890516518,,, +7.7851562500,124,0.7133592737,-0.0007629511,0.6218051423,,, +7.7871093750,124,0.7164110780,-0.0007629511,0.9941252766,,, +7.7890625000,124,0.7194628824,-0.0007629511,0.1274128328,,, +7.7910156250,124,0.7225146868,-0.0007629511,0.8003356985,,, +7.7929687500,124,0.7240405890,-0.0007629511,0.9315632868,,, +7.7949218750,124,0.7270923934,-0.0007629511,0.7347219043,,, +7.7968750000,124,0.7301441978,-0.0007629511,0.7606622416,,, +7.7988281250,124,0.7331960021,-0.0007629511,0.9056229496,,, +7.8007812500,124,0.7362478065,-0.0007629511,0.6782635233,,, +7.8027343750,124,0.7377737087,-0.0007629511,0.8720531014,,, +7.8046875000,124,0.7408255131,-0.0007629511,0.1136797131,,, +7.8066406250,124,0.7438773175,-0.0007629511,0.7820248722,,, +7.8085937500,124,0.7469291218,-0.0007629511,0.7423514153,,, +7.8105468750,124,0.7499809262,-0.0007629511,0.4966811627,,, +7.8125000000,125,0.7515068284,-0.0007629511,0.3624017700,,, +7.8144531250,125,0.7545586328,-0.0007629511,0.5989166094,,, +7.8164062500,125,0.7576104372,-0.0007629511,0.1991302358,,, +7.8183593750,125,0.7606622416,-0.0007629511,0.7118333715,,, +7.8203125000,125,0.7621881437,-0.0007629511,0.5104142824,,, +7.8222656250,125,0.7652399481,-0.0007629511,0.0724803540,,, +7.8242187500,125,0.7682917525,-0.0007629511,0.2372777905,,, +7.8261718750,125,0.7713435569,-0.0007629511,0.4783703365,,, +7.8281250000,125,0.7743953613,-0.0007629511,0.2555886168,,, +7.8300781250,125,0.7774471656,-0.0007629511,0.1167315175,,, +7.8320312500,125,0.7789730678,-0.0007629511,0.5836575875,,, +7.8339843750,125,0.7820248722,-0.0007629511,0.7835507744,,, +7.8359375000,125,0.7850766766,-0.0007629511,0.5516136416,,, +7.8378906250,125,0.7881284810,-0.0007629511,0.9437705043,,, +7.8398437500,125,0.7911802853,-0.0007629511,0.5271992065,,, +7.8417968750,125,0.7927061875,-0.0007629511,0.8110170138,,, +7.8437500000,125,0.7957579919,-0.0007629511,0.7942320897,,, +7.8457031250,125,0.7988097963,-0.0007629511,0.9010452430,,, +7.8476562500,125,0.8018616007,-0.0007629511,0.8979934386,,, +7.8496093750,125,0.8049134051,-0.0007629511,0.6385900664,,, +7.8515625000,125,0.8064393072,-0.0007629511,0.4463263905,,, +7.8535156250,125,0.8094911116,-0.0007629511,0.0984206912,,, +7.8554687500,125,0.8125429160,-0.0007629511,0.6645304036,,, +7.8574218750,125,0.8155947204,-0.0007629511,0.2754253452,,, +7.8593750000,125,0.8186465248,-0.0007629511,0.5653467613,,, +7.8613281250,125,0.8216983291,-0.0007629511,0.9117265583,,, +7.8632812500,125,0.8232242313,-0.0007629511,0.5516136416,,, +7.8652343750,125,0.8262760357,-0.0007629511,0.6141756313,,, +7.8671875000,125,0.8293278401,-0.0007629511,0.1823453117,,, +7.8691406250,125,0.8323796445,-0.0007629511,0.7713435569,,, +7.8710937500,125,0.8354314488,-0.0007629511,0.2632181277,,, +7.8730468750,125,0.8384832532,-0.0007629511,0.5363546197,,, +7.8750000000,126,0.8400091554,-0.0007629511,0.1655603876,,, +7.8769531250,126,0.8430609598,-0.0007629511,0.2204928664,,, +7.8789062500,126,0.8461127642,-0.0007629511,0.8171206226,,, +7.8808593750,126,0.8491645686,-0.0007629511,0.2693217365,,, +7.8828125000,126,0.8522163729,-0.0007629511,0.6431677729,,, +7.8847656250,126,0.8552681773,-0.0007629511,0.4493781949,,, +7.8867187500,126,0.8567940795,-0.0007629511,0.2815289540,,, +7.8886718750,126,0.8598458839,-0.0007629511,0.5195696956,,, +7.8906250000,126,0.8628976883,-0.0007629511,0.5317769131,,, +7.8925781250,126,0.8659494926,-0.0007629511,0.8552681773,,, +7.8945312500,126,0.8690012970,-0.0007629511,0.2555886168,,, +7.8964843750,126,0.8720531014,-0.0007629511,0.5226215000,,, +7.8984375000,126,0.8735790036,-0.0007629511,0.6828412299,,, +7.9003906250,126,0.8766308080,-0.0007629511,0.5195696956,,, +7.9023437500,126,0.8796826123,-0.0007629511,0.2723735409,,, +7.9042968750,126,0.8827344167,-0.0007629511,0.3685053788,,, +7.9062500000,126,0.8857862211,-0.0007629511,0.5027847715,,, +7.9082031250,126,0.8888380255,-0.0007629511,0.6813153277,,, +7.9101562500,126,0.8903639277,-0.0007629511,0.7484550240,,, +7.9121093750,126,0.8934157321,-0.0007629511,0.2388036927,,, +7.9140625000,126,0.8964675364,-0.0007629511,0.5134660868,,, +7.9160156250,126,0.8995193408,-0.0007629511,0.8201724269,,, +7.9179687500,126,0.9025711452,-0.0007629511,0.2388036927,,, +7.9199218750,126,0.9056229496,-0.0007629511,0.0953688869,,, +7.9218750000,126,0.9086747539,-0.0007629511,0.0068665599,,, +7.9238281250,126,0.9102006561,-0.0007629511,0.5271992065,,, +7.9257812500,126,0.9132524605,-0.0007629511,0.8537422751,,, +7.9277343750,126,0.9163042649,-0.0007629511,0.4249637598,,, +7.9296875000,126,0.9193560693,-0.0007629511,0.8873121233,,, +7.9316406250,126,0.9224078737,-0.0007629511,0.9697108415,,, +7.9335937500,126,0.9254596780,-0.0007629511,0.0846875715,,, +7.9355468750,126,0.9269855802,-0.0007629511,0.9864957656,,, +7.9375000000,127,0.9300373846,-0.0007629511,0.7927061875,,, +7.9394531250,127,0.9330891890,-0.0007629511,0.7789730678,,, +7.9414062500,127,0.9361409934,-0.0007629511,0.8934157321,,, +7.9433593750,127,0.9391927977,-0.0007629511,0.2449073014,,, +7.9453125000,127,0.9422446021,-0.0007629511,0.1075761044,,, +7.9472656250,127,0.9452964065,-0.0007629511,0.9819180591,,, +7.9492187500,127,0.9468223087,-0.0007629511,0.1899748226,,, +7.9511718750,127,0.9498741131,-0.0007629511,0.6599526970,,, +7.9531250000,127,0.9529259174,-0.0007629511,0.5668726635,,, +7.9550781250,127,0.9559777218,-0.0007629511,0.9697108415,,, +7.9570312500,127,0.9590295262,-0.0007629511,0.2800030518,,, +7.9589843750,127,0.9620813306,-0.0007629511,0.1319905394,,, +7.9609375000,127,0.9651331350,-0.0007629511,0.3395132372,,, +7.9628906250,127,0.9666590372,-0.0007629511,0.9407186999,,, +7.9648437500,127,0.9697108415,-0.0007629511,0.4631113146,,, +7.9667968750,127,0.9727626459,-0.0007629511,0.2830548562,,, +7.9687500000,127,0.9758144503,-0.0007629511,0.9941252766,,, +7.9707031250,127,0.9788662547,-0.0007629511,0.5210955978,,, +7.9726562500,127,0.9819180591,-0.0007629511,0.2342259861,,, +7.9746093750,127,0.9834439612,-0.0007629511,0.3654535744,,, +7.9765625000,127,0.9864957656,-0.0007629511,0.2891584649,,, +7.9785156250,127,0.9895475700,-0.0007629511,0.2800030518,,, +7.9804687500,127,0.9925993744,-0.0007629511,0.5027847715,,, +7.9824218750,127,0.9956511788,-0.0007629511,0.2098115511,,, +7.9843750000,127,0.9987029831,-0.0007629511,0.1258869306,,, +7.9863281250,127,1.0017547875,0.9987029831,0.3898680095,,, +7.9882812500,127,1.0032806897,0.9987029831,0.5790798810,,, +7.9902343750,127,1.0063324941,0.9987029831,0.8094911116,,, +7.9921875000,127,1.0093842985,0.9987029831,0.3212024109,,, +7.9941406250,127,1.0124361028,0.9987029831,0.8461127642,,, +7.9960937500,127,1.0154879072,0.9987029831,0.7881284810,,, +7.9980468750,127,1.0185397116,0.9987029831,0.8384832532,,, +8.0000000000,128,1.0215915160,0.9987029831,0.6385900664,,, +8.0019531250,128,1.0231174182,0.9987029831,0.4951552605,,, +8.0039062500,128,1.0261692226,0.9987029831,0.7789730678,,, +8.0058593750,128,1.0292210269,0.9987029831,0.5424582284,,, +8.0078125000,128,1.0322728313,0.9987029831,0.1365682460,,, +8.0097656250,128,1.0353246357,0.9987029831,0.9788662547,,, +8.0117187500,128,1.0383764401,0.9987029831,0.6126497292,,, +8.0136718750,128,1.0414282444,0.9987029831,0.3028915846,,, +8.0156250000,128,1.0429541466,0.9987029831,0.2708476387,,, +8.0175781250,128,1.0460059510,0.9987029831,0.9925993744,,, +8.0195312500,128,1.0490577554,0.9987029831,0.5745021744,,, +8.0214843750,128,1.0521095598,0.9987029831,0.5195696956,,, +8.0234375000,128,1.0551613642,0.9987029831,0.4631113146,,, +8.0253906250,128,1.0582131685,0.9987029831,0.2983138781,,, +8.0273437500,128,1.0612649729,0.9987029831,0.0022888533,,, +8.0292968750,128,1.0627908751,0.9987029831,0.4585336080,,, +8.0312500000,128,1.0658426795,0.9987029831,0.4478522927,,, +8.0332031250,128,1.0688944839,0.9987029831,0.6874189364,,, +8.0351562500,128,1.0719462882,0.9987029831,0.0328068971,,, +8.0371093750,128,1.0749980926,0.9987029831,0.7225146868,,, +8.0390625000,128,1.0780498970,0.9987029831,0.8949416342,,, +8.0410156250,128,1.0795757992,0.9987029831,0.4478522927,,, +8.0429687500,128,1.0826276036,0.9987029831,0.1640344854,,, +8.0449218750,128,1.0856794079,0.9987029831,0.8506904707,,, +8.0468750000,128,1.0887312123,0.9987029831,0.0465400168,,, +8.0488281250,128,1.0917830167,0.9987029831,0.5928130007,,, +8.0507812500,128,1.0948348211,0.9987029831,0.2265964752,,, +8.0527343750,128,1.0978866255,0.9987029831,0.2647440299,,, +8.0546875000,128,1.0994125277,0.9987029831,0.9071488518,,, +8.0566406250,128,1.1024643320,0.9987029831,0.1670862898,,, +8.0585937500,128,1.1055161364,0.9987029831,0.3074692912,,, +8.0605468750,128,1.1085679408,0.9987029831,0.8171206226,,, +8.0625000000,129,1.1116197452,0.9987029831,0.7225146868,,, +8.0644531250,129,1.1146715496,0.9987029831,0.0709544518,,, +8.0664062500,129,1.1161974517,0.9987029831,0.3898680095,,, +8.0683593750,129,1.1192492561,0.9987029831,0.0907911803,,, +8.0703125000,129,1.1223010605,0.9987029831,0.2952620737,,, +8.0722656250,129,1.1253528649,0.9987029831,0.2143892576,,, +8.0742187500,129,1.1284046693,0.9987029831,0.3639276722,,, +8.0761718750,129,1.1314564736,0.9987029831,0.1274128328,,, +8.0781250000,129,1.1329823758,0.9987029831,0.6553749905,,, +8.0800781250,129,1.1360341802,0.9987029831,0.2983138781,,, +8.0820312500,129,1.1390859846,0.9987029831,0.0404364080,,, +8.0839843750,129,1.1421377890,0.9987029831,0.4631113146,,, +8.0859375000,129,1.1451895933,0.9987029831,0.7301441978,,, +8.0878906250,129,1.1482413977,0.9987029831,0.6279087510,,, +8.0898437500,129,1.1497672999,0.9987029831,0.8659494926,,, +8.0917968750,129,1.1528191043,0.9987029831,0.5943389029,,, +8.0937500000,129,1.1558709087,0.9987029831,0.1213092241,,, +8.0957031250,129,1.1589227131,0.9987029831,0.8644235904,,, +8.0976562500,129,1.1619745174,0.9987029831,0.5775539788,,, +8.0996093750,129,1.1650263218,0.9987029831,0.0312809949,,, +8.1015625000,129,1.1665522240,0.9987029831,0.5790798810,,, +8.1035156250,129,1.1696040284,0.9987029831,0.2632181277,,, +8.1054687500,129,1.1726558328,0.9987029831,0.1991302358,,, +8.1074218750,129,1.1757076371,0.9987029831,0.0801098650,,, +8.1093750000,129,1.1787594415,0.9987029831,0.1136797131,,, +8.1113281250,129,1.1818112459,0.9987029831,0.5760280766,,, +8.1132812500,129,1.1833371481,0.9987029831,0.9071488518,,, +8.1152343750,129,1.1863889525,0.9987029831,0.2800030518,,, +8.1171875000,129,1.1894407568,0.9987029831,0.3974975204,,, +8.1191406250,129,1.1924925612,0.9987029831,0.2845807584,,, +8.1210937500,129,1.1955443656,0.9987029831,0.7499809262,,, +8.1230468750,129,1.1985961700,0.9987029831,0.6233310445,,, +8.1250000000,130,1.2001220722,0.9987029831,0.1045243000,,, +8.1269531250,130,1.2031738766,0.9987029831,0.1121538109,,, +8.1289062500,130,1.2062256809,0.9987029831,0.2677958343,,, +8.1308593750,130,1.2092774853,0.9987029831,0.6614785992,,, +8.1328125000,130,1.2123292897,0.9987029831,0.8918898299,,, +8.1347656250,130,1.2138551919,0.9987029831,0.2754253452,,, +8.1367187500,130,1.2169069963,0.9987029831,0.1564049744,,, +8.1386718750,130,1.2199588006,0.9987029831,0.3288319219,,, +8.1406250000,130,1.2230106050,0.9987029831,0.5210955978,,, +8.1425781250,130,1.2260624094,0.9987029831,0.8064393072,,, +8.1445312500,130,1.2275883116,0.9987029831,0.3318837263,,, +8.1464843750,130,1.2306401160,0.9987029831,0.6843671321,,, +8.1484375000,130,1.2336919203,0.9987029831,0.2967879759,,, +8.1503906250,130,1.2367437247,0.9987029831,0.4005493248,,, +8.1523437500,130,1.2397955291,0.9987029831,0.2372777905,,, +8.1542968750,130,1.2413214313,0.9987029831,0.9315632868,,, +8.1562500000,130,1.2443732357,0.9987029831,0.2052338445,,, +8.1582031250,130,1.2474250401,0.9987029831,0.8476386664,,, +8.1601562500,130,1.2504768444,0.9987029831,0.0724803540,,, +8.1621093750,130,1.2535286488,0.9987029831,0.8552681773,,, +8.1640625000,130,1.2550545510,0.9987029831,0.5943389029,,, +8.1660156250,130,1.2581063554,0.9987029831,0.7103074693,,, +8.1679687500,130,1.2611581598,0.9987029831,0.2235446708,,, +8.1699218750,130,1.2642099641,0.9987029831,0.5943389029,,, +8.1718750000,130,1.2672617685,0.9987029831,0.9819180591,,, +8.1738281250,130,1.2687876707,0.9987029831,0.2861066606,,, +8.1757812500,130,1.2718394751,0.9987029831,0.5973907073,,, +8.1777343750,130,1.2748912795,0.9987029831,0.5333028153,,, +8.1796875000,130,1.2779430838,0.9987029831,0.4707408255,,, +8.1816406250,130,1.2809948882,0.9987029831,0.2754253452,,, +8.1835937500,130,1.2825207904,0.9987029831,0.1121538109,,, +8.1855468750,130,1.2855725948,0.9987029831,0.9437705043,,, +8.1875000000,131,1.2886243992,0.9987029831,0.4570077058,,, +8.1894531250,131,1.2916762036,0.9987029831,0.0770580606,,, +8.1914062500,131,1.2932021057,0.9987029831,0.3456168460,,, +8.1933593750,131,1.2962539101,0.9987029831,0.4753185321,,, +8.1953125000,131,1.2993057145,0.9987029831,0.5928130007,,, +8.1972656250,131,1.3023575189,0.9987029831,0.3730830854,,, +8.1992187500,131,1.3038834211,0.9987029831,0.3669794766,,, +8.2011718750,131,1.3069352255,0.9987029831,0.6767376211,,, +8.2031250000,131,1.3099870298,0.9987029831,0.1884489204,,, +8.2050781250,131,1.3130388342,0.9987029831,0.8842603189,,, +8.2070312500,131,1.3160906386,0.9987029831,0.3303578241,,, +8.2089843750,131,1.3176165408,0.9987029831,0.4798962387,,, +8.2109375000,131,1.3206683452,0.9987029831,0.0175478752,,, +8.2128906250,131,1.3237201495,0.9987029831,0.8247501335,,, +8.2148437500,131,1.3267719539,0.9987029831,0.6706340124,,, +8.2167968750,131,1.3282978561,0.9987029831,0.3608758679,,, +8.2187500000,131,1.3313496605,0.9987029831,0.1609826810,,, +8.2207031250,131,1.3344014649,0.9987029831,0.9514000153,,, +8.2226562500,131,1.3374532692,0.9987029831,0.2265964752,,, +8.2246093750,131,1.3389791714,0.9987029831,0.8781567102,,, +8.2265625000,131,1.3420309758,0.9987029831,0.5699244678,,, +8.2285156250,131,1.3450827802,0.9987029831,0.2265964752,,, +8.2304687500,131,1.3466086824,0.9987029831,0.3700312810,,, +8.2324218750,131,1.3496604868,0.9987029831,0.4493781949,,, +8.2343750000,131,1.3527122911,0.9987029831,0.3913939117,,, +8.2363281250,131,1.3557640955,0.9987029831,0.6477454795,,, +8.2382812500,131,1.3572899977,0.9987029831,0.3517204547,,, +8.2402343750,131,1.3603418021,0.9987029831,0.7408255131,,, +8.2421875000,131,1.3633936065,0.9987029831,0.0297550927,,, +8.2441406250,131,1.3664454108,0.9987029831,0.9529259174,,, +8.2460937500,131,1.3679713130,0.9987029831,0.0221255818,,, +8.2480468750,131,1.3710231174,0.9987029831,0.2555886168,,, +8.2500000000,132,1.3740749218,0.9987029831,0.3959716182,,, +8.2519531250,132,1.3756008240,0.9987029831,0.9605554284,,, +8.2539062500,132,1.3786526284,0.9987029831,0.5195696956,,, +8.2558593750,132,1.3817044327,0.9987029831,0.7591363394,,, +8.2578125000,132,1.3847562371,0.9987029831,0.4692149233,,, +8.2597656250,132,1.3862821393,0.9987029831,0.0236514839,,, +8.2617187500,132,1.3893339437,0.9987029831,0.2037079423,,, +8.2636718750,132,1.3923857481,0.9987029831,0.2433813993,,, +8.2656250000,132,1.3939116503,0.9987029831,0.6157015335,,, +8.2675781250,132,1.3969634546,0.9987029831,0.8400091554,,, +8.2695312500,132,1.4000152590,0.9987029831,0.8201724269,,, +8.2714843750,132,1.4030670634,0.9987029831,0.2433813993,,, +8.2734375000,132,1.4045929656,0.9987029831,0.6935225452,,, +8.2753906250,132,1.4076447700,0.9987029831,0.9407186999,,, +8.2773437500,132,1.4106965743,0.9987029831,0.9269855802,,, +8.2792968750,132,1.4122224765,0.9987029831,0.0404364080,,, +8.2812500000,132,1.4152742809,0.9987029831,0.0801098650,,, +8.2832031250,132,1.4183260853,0.9987029831,0.7148851759,,, +8.2851562500,132,1.4198519875,0.9987029831,0.4585336080,,, +8.2871093750,132,1.4229037919,0.9987029831,0.8766308080,,, +8.2890625000,132,1.4259555962,0.9987029831,0.3730830854,,, +8.2910156250,132,1.4274814984,0.9987029831,0.1182574197,,, +8.2929687500,132,1.4305333028,0.9987029831,0.9422446021,,, +8.2949218750,132,1.4335851072,0.9987029831,0.5470359350,,, +8.2968750000,132,1.4351110094,0.9987029831,0.4783703365,,, +8.2988281250,132,1.4381628138,0.9987029831,0.3974975204,,, +8.3007812500,132,1.4412146181,0.9987029831,0.6233310445,,, +8.3027343750,132,1.4427405203,0.9987029831,0.0221255818,,, +8.3046875000,132,1.4457923247,0.9987029831,0.8171206226,,, +8.3066406250,132,1.4488441291,0.9987029831,0.4005493248,,, +8.3085937500,132,1.4503700313,0.9987029831,0.9712367437,,, +8.3105468750,132,1.4534218357,0.9987029831,0.0450141146,,, +8.3125000000,133,1.4564736400,0.9987029831,0.6462195773,,, +8.3144531250,133,1.4579995422,0.9987029831,0.3135729000,,, +8.3164062500,133,1.4610513466,0.9987029831,0.2540627146,,, +8.3183593750,133,1.4641031510,0.9987029831,0.1625085832,,, +8.3203125000,133,1.4656290532,0.9987029831,0.6996261540,,, +8.3222656250,133,1.4686808576,0.9987029831,0.9956511788,,, +8.3242187500,133,1.4717326619,0.9987029831,0.7896543832,,, +8.3261718750,133,1.4732585641,0.9987029831,0.4432745861,,, +8.3281250000,133,1.4763103685,0.9987029831,0.2220187686,,, +8.3300781250,133,1.4778362707,0.9987029831,0.9773403525,,, +8.3320312500,133,1.4808880751,0.9987029831,0.2342259861,,, +8.3339843750,133,1.4839398795,0.9987029831,0.4249637598,,, +8.3359375000,133,1.4854657816,0.9987029831,0.0938429847,,, +8.3378906250,133,1.4885175860,0.9987029831,0.0160219730,,, +8.3398437500,133,1.4915693904,0.9987029831,0.3486686503,,, +8.3417968750,133,1.4930952926,0.9987029831,0.7408255131,,, +8.3437500000,133,1.4961470970,0.9987029831,0.8339055467,,, +8.3457031250,133,1.4976729992,0.9987029831,0.3150988022,,, +8.3476562500,133,1.5007248035,0.9987029831,0.5256733043,,, +8.3496093750,133,1.5037766079,0.9987029831,0.5012588693,,, +8.3515625000,133,1.5053025101,0.9987029831,0.9056229496,,, +8.3535156250,133,1.5083543145,0.9987029831,0.2876325628,,, +8.3554687500,133,1.5098802167,0.9987029831,0.8079652094,,, +8.3574218750,133,1.5129320211,0.9987029831,0.3532463569,,, +8.3593750000,133,1.5159838254,0.9987029831,0.9849698634,,, +8.3613281250,133,1.5175097276,0.9987029831,0.6462195773,,, +8.3632812500,133,1.5205615320,0.9987029831,0.4417486839,,, +8.3652343750,133,1.5220874342,0.9987029831,0.6981002518,,, +8.3671875000,133,1.5251392386,0.9987029831,0.5958648051,,, +8.3691406250,133,1.5266651408,0.9987029831,0.4722667277,,, +8.3710937500,133,1.5297169451,0.9987029831,0.6050202182,,, +8.3730468750,133,1.5327687495,0.9987029831,0.9483482109,,, +8.3750000000,134,1.5342946517,0.9987029831,0.5867093919,,, +8.3769531250,134,1.5373464561,0.9987029831,0.0175478752,,, +8.3789062500,134,1.5388723583,0.9987029831,0.1106279088,,, +8.3808593750,134,1.5419241627,0.9987029831,0.5271992065,,, +8.3828125000,134,1.5434500649,0.9987029831,0.8384832532,,, +8.3847656250,134,1.5465018692,0.9987029831,0.4356450752,,, +8.3867187500,134,1.5495536736,0.9987029831,0.4905775540,,, +8.3886718750,134,1.5510795758,0.9987029831,0.9330891890,,, +8.3906250000,134,1.5541313802,0.9987029831,0.1991302358,,, +8.3925781250,134,1.5556572824,0.9987029831,0.0999465934,,, +8.3945312500,134,1.5587090867,0.9987029831,0.4188601511,,, +8.3964843750,134,1.5602349889,0.9987029831,0.9437705043,,, +8.3984375000,134,1.5632867933,0.9987029831,0.4936293584,,, +8.4003906250,134,1.5648126955,0.9987029831,0.2662699321,,, +8.4023437500,134,1.5678644999,0.9987029831,0.6324864576,,, +8.4042968750,134,1.5693904021,0.9987029831,0.7728694591,,, +8.4062500000,134,1.5724422065,0.9987029831,0.1716639963,,, +8.4082031250,134,1.5739681086,0.9987029831,0.0328068971,,, +8.4101562500,134,1.5770199130,0.9987029831,0.7667658503,,, +8.4121093750,134,1.5785458152,0.9987029831,0.8018616007,,, +8.4140625000,134,1.5815976196,0.9987029831,0.3089951934,,, +8.4160156250,134,1.5831235218,0.9987029831,0.2037079423,,, +8.4179687500,134,1.5861753262,0.9987029831,0.1823453117,,, +8.4199218750,134,1.5877012284,0.9987029831,0.0816357671,,, +8.4218750000,134,1.5907530327,0.9987029831,0.8140688182,,, +8.4238281250,134,1.5922789349,0.9987029831,0.0556954299,,, +8.4257812500,134,1.5953307393,0.9987029831,0.7392996109,,, +8.4277343750,134,1.5968566415,0.9987029831,0.6340123598,,, +8.4296875000,134,1.5999084459,0.9987029831,0.3166247044,,, +8.4316406250,134,1.6014343481,0.9987029831,0.4997329671,,, +8.4335937500,134,1.6044861524,0.9987029831,0.9712367437,,, +8.4355468750,134,1.6060120546,0.9987029831,0.4081788357,,, +8.4375000000,135,1.6090638590,0.9987029831,0.3929198138,,, +8.4394531250,135,1.6105897612,0.9987029831,0.4783703365,,, +8.4414062500,135,1.6136415656,0.9987029831,0.5333028153,,, +8.4433593750,135,1.6151674678,0.9987029831,0.9971770809,,, +8.4453125000,135,1.6182192721,0.9987029831,0.3593499657,,, +8.4472656250,135,1.6197451743,0.9987029831,0.6584267948,,, +8.4492187500,135,1.6227969787,0.9987029831,0.5195696956,,, +8.4511718750,135,1.6243228809,0.9987029831,0.7698176547,,, +8.4531250000,135,1.6258487831,0.9987029831,0.6141756313,,, +8.4550781250,135,1.6289005875,0.9987029831,0.1777676051,,, +8.4570312500,135,1.6304264897,0.9987029831,0.6813153277,,, +8.4589843750,135,1.6334782940,0.9987029831,0.8400091554,,, +8.4609375000,135,1.6350041962,0.9987029831,0.1152056153,,, +8.4628906250,135,1.6380560006,0.9987029831,0.1075761044,,, +8.4648437500,135,1.6395819028,0.9987029831,0.0480659190,,, +8.4667968750,135,1.6411078050,0.9987029831,0.5836575875,,, +8.4687500000,135,1.6441596094,0.9987029831,0.5348287175,,, +8.4707031250,135,1.6456855116,0.9987029831,0.8552681773,,, +8.4726562500,135,1.6487373159,0.9987029831,0.2632181277,,, +8.4746093750,135,1.6502632181,0.9987029831,0.4386968795,,, +8.4765625000,135,1.6533150225,0.9987029831,0.4600595102,,, +8.4785156250,135,1.6548409247,0.9987029831,0.2754253452,,, +8.4804687500,135,1.6563668269,0.9987029831,0.1594567788,,, +8.4824218750,135,1.6594186313,0.9987029831,0.0297550927,,, +8.4843750000,135,1.6609445335,0.9987029831,0.7637140459,,, +8.4863281250,135,1.6639963378,0.9987029831,0.4875257496,,, +8.4882812500,135,1.6655222400,0.9987029831,0.9895475700,,, +8.4902343750,135,1.6670481422,0.9987029831,0.4905775540,,, +8.4921875000,135,1.6700999466,0.9987029831,0.4310673686,,, +8.4941406250,135,1.6716258488,0.9987029831,0.7484550240,,, +8.4960937500,135,1.6731517510,0.9987029831,0.3379873350,,, +8.4980468750,135,1.6762035554,0.9987029831,0.3456168460,,, +8.5000000000,136,1.6777294575,0.9987029831,0.6324864576,,, +8.5019531250,136,1.6792553597,0.9987029831,0.5897611963,,, +8.5039062500,136,1.6823071641,0.9987029831,0.0358587015,,, +8.5058593750,136,1.6838330663,0.9987029831,0.2815289540,,, +8.5078125000,136,1.6868848707,0.9987029831,0.0358587015,,, +8.5097656250,136,1.6884107729,0.9987029831,0.9788662547,,, +8.5117187500,136,1.6899366751,0.9987029831,0.2769512474,,, +8.5136718750,136,1.6929884794,0.9987029831,0.4203860533,,, +8.5156250000,136,1.6945143816,0.9987029831,0.2281223774,,, +8.5175781250,136,1.6960402838,0.9987029831,0.6492713817,,, +8.5195312500,136,1.6990920882,0.9987029831,0.1197833219,,, +8.5214843750,136,1.7006179904,0.9987029831,0.3044174868,,, +8.5234375000,136,1.7021438926,0.9987029831,0.2098115511,,, +8.5253906250,136,1.7051956970,0.9987029831,0.6157015335,,, +8.5273437500,136,1.7067215991,0.9987029831,0.3578240635,,, +8.5292968750,136,1.7082475013,0.9987029831,0.9132524605,,, +8.5312500000,136,1.7097734035,0.9987029831,0.3181506065,,, +8.5332031250,136,1.7128252079,0.9987029831,0.7789730678,,, +8.5351562500,136,1.7143511101,0.9987029831,0.6767376211,,, +8.5371093750,136,1.7158770123,0.9987029831,0.4966811627,,, +8.5390625000,136,1.7189288167,0.9987029831,0.7438773175,,, +8.5410156250,136,1.7204547189,0.9987029831,0.4524299992,,, +8.5429687500,136,1.7219806210,0.9987029831,0.9575036240,,, +8.5449218750,136,1.7235065232,0.9987029831,0.5470359350,,, +8.5468750000,136,1.7265583276,0.9987029831,0.1518272679,,, +8.5488281250,136,1.7280842298,0.9987029831,0.6584267948,,, +8.5507812500,136,1.7296101320,0.9987029831,0.4798962387,,, +8.5527343750,136,1.7326619364,0.9987029831,0.3562981613,,, +8.5546875000,136,1.7341878386,0.9987029831,0.1853971160,,, +8.5566406250,136,1.7357137407,0.9987029831,0.9636072328,,, +8.5585937500,136,1.7372396429,0.9987029831,0.4234378576,,, +8.5605468750,136,1.7402914473,0.9987029831,0.6111238270,,, +8.5625000000,137,1.7418173495,0.9987029831,0.3044174868,,, +8.5644531250,137,1.7433432517,0.9987029831,0.0038147555,,, +8.5664062500,137,1.7448691539,0.9987029831,0.1853971160,,, +8.5683593750,137,1.7479209583,0.9987029831,0.6889448386,,, +8.5703125000,137,1.7494468605,0.9987029831,0.3425650416,,, +8.5722656250,137,1.7509727626,0.9987029831,0.6141756313,,, +8.5742187500,137,1.7524986648,0.9987029831,0.7866025788,,, +8.5761718750,137,1.7540245670,0.9987029831,0.8995193408,,, +8.5781250000,137,1.7570763714,0.9987029831,0.2067597467,,, +8.5800781250,137,1.7586022736,0.9987029831,0.4966811627,,, +8.5820312500,137,1.7601281758,0.9987029831,0.5058365759,,, +8.5839843750,137,1.7616540780,0.9987029831,0.6233310445,,, +8.5859375000,137,1.7631799802,0.9987029831,0.5027847715,,, +8.5878906250,137,1.7662317845,0.9987029831,0.3242542153,,, +8.5898437500,137,1.7677576867,0.9987029831,0.8476386664,,, +8.5917968750,137,1.7692835889,0.9987029831,0.5745021744,,, +8.5937500000,137,1.7708094911,0.9987029831,0.0053406577,,, +8.5957031250,137,1.7723353933,0.9987029831,0.3456168460,,, +8.5976562500,137,1.7753871977,0.9987029831,0.1411459525,,, +8.5996093750,137,1.7769130999,0.9987029831,0.2754253452,,, +8.6015625000,137,1.7784390021,0.9987029831,0.2174410620,,, +8.6035156250,137,1.7799649042,0.9987029831,0.5195696956,,, +8.6054687500,137,1.7814908064,0.9987029831,0.9727626459,,, +8.6074218750,137,1.7830167086,0.9987029831,0.0801098650,,, +8.6093750000,137,1.7845426108,0.9987029831,0.2891584649,,, +8.6113281250,137,1.7875944152,0.9987029831,0.2769512474,,, +8.6132812500,137,1.7891203174,0.9987029831,0.8400091554,,, +8.6152343750,137,1.7906462196,0.9987029831,0.1823453117,,, +8.6171875000,137,1.7921721218,0.9987029831,0.6095979248,,, +8.6191406250,137,1.7936980240,0.9987029831,0.6401159686,,, +8.6210937500,137,1.7952239261,0.9987029831,0.7606622416,,, +8.6230468750,137,1.7967498283,0.9987029831,0.0251773861,,, +8.6250000000,138,1.7998016327,0.9987029831,0.0556954299,,, +8.6269531250,138,1.8013275349,0.9987029831,0.2708476387,,, +8.6289062500,138,1.8028534371,0.9987029831,0.5012588693,,, +8.6308593750,138,1.8043793393,0.9987029831,0.1915007248,,, +8.6328125000,138,1.8059052415,0.9987029831,0.5836575875,,, +8.6347656250,138,1.8074311437,0.9987029831,0.6294346532,,, +8.6367187500,138,1.8089570459,0.9987029831,0.5500877394,,, +8.6386718750,138,1.8104829480,0.9987029831,0.7301441978,,, +8.6406250000,138,1.8120088502,0.9987029831,0.2281223774,,, +8.6425781250,138,1.8135347524,0.9987029831,0.4081788357,,, +8.6445312500,138,1.8150606546,0.9987029831,0.8705271992,,, +8.6464843750,138,1.8181124590,0.9987029831,0.2754253452,,, +8.6484375000,138,1.8196383612,0.9987029831,0.3654535744,,, +8.6503906250,138,1.8211642634,0.9987029831,0.8216983291,,, +8.6523437500,138,1.8226901656,0.9987029831,0.9117265583,,, +8.6542968750,138,1.8242160678,0.9987029831,0.2250705730,,, +8.6562500000,138,1.8257419699,0.9987029831,0.9971770809,,, +8.6582031250,138,1.8272678721,0.9987029831,0.9163042649,,, +8.6601562500,138,1.8287937743,0.9987029831,0.5394064240,,, +8.6621093750,138,1.8303196765,0.9987029831,0.1106279088,,, +8.6640625000,138,1.8318455787,0.9987029831,0.4600595102,,, +8.6660156250,138,1.8333714809,0.9987029831,0.7774471656,,, +8.6679687500,138,1.8348973831,0.9987029831,0.8140688182,,, +8.6699218750,138,1.8364232853,0.9987029831,0.1289387350,,, +8.6718750000,138,1.8379491875,0.9987029831,0.9925993744,,, +8.6738281250,138,1.8394750896,0.9987029831,0.1029983978,,, +8.6757812500,138,1.8410009918,0.9987029831,0.6675822080,,, +8.6777343750,138,1.8425268940,0.9987029831,0.7698176547,,, +8.6796875000,138,1.8440527962,0.9987029831,0.8842603189,,, +8.6816406250,138,1.8455786984,0.9987029831,0.2403295949,,, +8.6835937500,138,1.8471046006,0.9987029831,0.3562981613,,, +8.6855468750,138,1.8486305028,0.9987029831,0.7087815671,,, +8.6875000000,139,1.8501564050,0.9987029831,0.0862134737,,, +8.6894531250,139,1.8516823072,0.9987029831,0.4829480430,,, +8.6914062500,139,1.8532082094,0.9987029831,0.7515068284,,, +8.6933593750,139,1.8547341115,0.9987029831,0.5577172503,,, +8.6953125000,139,1.8562600137,0.9987029831,0.9025711452,,, +8.6972656250,139,1.8577859159,0.9987029831,0.3013656825,,, +8.6992187500,139,1.8593118181,0.9987029831,0.8491645686,,, +8.7011718750,139,1.8608377203,0.9987029831,0.0968947890,,, +8.7031250000,139,1.8623636225,0.9987029831,0.8232242313,,, +8.7050781250,139,1.8638895247,0.9987029831,0.9956511788,,, +8.7070312500,139,1.8638895247,0.9987029831,0.0755321584,,, +8.7089843750,139,1.8654154269,0.9987029831,0.4127565423,,, +8.7109375000,139,1.8669413291,0.9987029831,0.0724803540,,, +8.7128906250,139,1.8684672313,0.9987029831,0.1655603876,,, +8.7148437500,139,1.8699931334,0.9987029831,0.3700312810,,, +8.7167968750,139,1.8715190356,0.9987029831,0.1014724956,,, +8.7187500000,139,1.8730449378,0.9987029831,0.8232242313,,, +8.7207031250,139,1.8745708400,0.9987029831,0.4615854124,,, +8.7226562500,139,1.8760967422,0.9987029831,0.3959716182,,, +8.7246093750,139,1.8776226444,0.9987029831,0.2067597467,,, +8.7265625000,139,1.8791485466,0.9987029831,0.7728694591,,, +8.7285156250,139,1.8791485466,0.9987029831,0.8155947204,,, +8.7304687500,139,1.8806744488,0.9987029831,0.5348287175,,, +8.7324218750,139,1.8822003510,0.9987029831,0.0755321584,,, +8.7343750000,139,1.8837262531,0.9987029831,0.8293278401,,, +8.7363281250,139,1.8852521553,0.9987029831,0.9330891890,,, +8.7382812500,139,1.8867780575,0.9987029831,0.6492713817,,, +8.7402343750,139,1.8883039597,0.9987029831,0.0999465934,,, +8.7421875000,139,1.8883039597,0.9987029831,0.8979934386,,, +8.7441406250,139,1.8898298619,0.9987029831,0.2342259861,,, +8.7460937500,139,1.8913557641,0.9987029831,0.2021820401,,, +8.7480468750,139,1.8928816663,0.9987029831,0.1045243000,,, +8.7500000000,140,1.8944075685,0.9987029831,0.8979934386,,, +8.7519531250,140,1.8959334707,0.9987029831,0.6019684138,,, +8.7539062500,140,1.8959334707,0.9987029831,0.4905775540,,, +8.7558593750,140,1.8974593729,0.9987029831,0.5607690547,,, +8.7578125000,140,1.8989852750,0.9987029831,0.2433813993,,, +8.7597656250,140,1.9005111772,0.9987029831,0.9681849393,,, +8.7617187500,140,1.9020370794,0.9987029831,0.3715571832,,, +8.7636718750,140,1.9020370794,0.9987029831,0.4829480430,,, +8.7656250000,140,1.9035629816,0.9987029831,0.7026779583,,, +8.7675781250,140,1.9050888838,0.9987029831,0.0175478752,,, +8.7695312500,140,1.9066147860,0.9987029831,0.7972838941,,, +8.7714843750,140,1.9081406882,0.9987029831,0.2021820401,,, +8.7734375000,140,1.9081406882,0.9987029831,0.8796826123,,, +8.7753906250,140,1.9096665904,0.9987029831,0.7362478065,,, +8.7773437500,140,1.9111924926,0.9987029831,0.2494850080,,, +8.7792968750,140,1.9127183948,0.9987029831,0.4753185321,,, +8.7812500000,140,1.9127183948,0.9987029831,0.9239337758,,, +8.7832031250,140,1.9142442969,0.9987029831,0.6401159686,,, +8.7851562500,140,1.9157701991,0.9987029831,0.1274128328,,, +8.7871093750,140,1.9172961013,0.9987029831,0.3959716182,,, +8.7890625000,140,1.9172961013,0.9987029831,0.1411459525,,, +8.7910156250,140,1.9188220035,0.9987029831,0.3547722591,,, +8.7929687500,140,1.9203479057,0.9987029831,0.1441977569,,, +8.7949218750,140,1.9218738079,0.9987029831,0.4768444343,,, +8.7968750000,140,1.9218738079,0.9987029831,0.7774471656,,, +8.7988281250,140,1.9233997101,0.9987029831,0.1091020066,,, +8.8007812500,140,1.9249256123,0.9987029831,0.3959716182,,, +8.8027343750,140,1.9249256123,0.9987029831,0.9803921569,,, +8.8046875000,140,1.9264515145,0.9987029831,0.2143892576,,, +8.8066406250,140,1.9279774166,0.9987029831,0.3715571832,,, +8.8085937500,140,1.9279774166,0.9987029831,0.3181506065,,, +8.8105468750,140,1.9295033188,0.9987029831,0.6218051423,,, +8.8125000000,141,1.9310292210,0.9987029831,0.3257801175,,, +8.8144531250,141,1.9325551232,0.9987029831,0.4188601511,,, +8.8164062500,141,1.9325551232,0.9987029831,0.9910734722,,, +8.8183593750,141,1.9340810254,0.9987029831,0.4600595102,,, +8.8203125000,141,1.9340810254,0.9987029831,0.8552681773,,, +8.8222656250,141,1.9356069276,0.9987029831,0.4310673686,,, +8.8242187500,141,1.9371328298,0.9987029831,0.0694285496,,, +8.8261718750,141,1.9371328298,0.9987029831,0.0099183642,,, +8.8281250000,141,1.9386587320,0.9987029831,0.6218051423,,, +8.8300781250,141,1.9401846342,0.9987029831,0.0999465934,,, +8.8320312500,141,1.9401846342,0.9987029831,0.3517204547,,, +8.8339843750,141,1.9417105364,0.9987029831,0.0892652781,,, +8.8359375000,141,1.9432364385,0.9987029831,0.1441977569,,, +8.8378906250,141,1.9432364385,0.9987029831,0.0404364080,,, +8.8398437500,141,1.9447623407,0.9987029831,0.6324864576,,, +8.8417968750,141,1.9447623407,0.9987029831,0.2800030518,,, +8.8437500000,141,1.9462882429,0.9987029831,0.4600595102,,, +8.8457031250,141,1.9478141451,0.9987029831,0.1670862898,,, +8.8476562500,141,1.9478141451,0.9987029831,0.7682917525,,, +8.8496093750,141,1.9493400473,0.9987029831,0.3242542153,,, +8.8515625000,141,1.9493400473,0.9987029831,0.6614785992,,, +8.8535156250,141,1.9508659495,0.9987029831,0.3624017700,,, +8.8554687500,141,1.9508659495,0.9987029831,0.1472495613,,, +8.8574218750,141,1.9523918517,0.9987029831,0.4478522927,,, +8.8593750000,141,1.9539177539,0.9987029831,0.7881284810,,, +8.8613281250,141,1.9539177539,0.9987029831,0.3517204547,,, +8.8632812500,141,1.9554436561,0.9987029831,0.8995193408,,, +8.8652343750,141,1.9554436561,0.9987029831,0.4814221408,,, +8.8671875000,141,1.9569695583,0.9987029831,0.7286182956,,, +8.8691406250,141,1.9569695583,0.9987029831,0.3624017700,,, +8.8710937500,141,1.9584954604,0.9987029831,0.0846875715,,, +8.8730468750,141,1.9584954604,0.9987029831,0.3242542153,,, +8.8750000000,142,1.9600213626,0.9987029831,0.5775539788,,, +8.8769531250,142,1.9600213626,0.9987029831,0.1441977569,,, +8.8789062500,142,1.9615472648,0.9987029831,0.2723735409,,, +8.8808593750,142,1.9615472648,0.9987029831,0.4951552605,,, +8.8828125000,142,1.9630731670,0.9987029831,0.9208819715,,, +8.8847656250,142,1.9630731670,0.9987029831,0.9941252766,,, +8.8867187500,142,1.9645990692,0.9987029831,0.7942320897,,, +8.8886718750,142,1.9645990692,0.9987029831,0.2784771496,,, +8.8906250000,142,1.9661249714,0.9987029831,0.6858930343,,, +8.8925781250,142,1.9661249714,0.9987029831,0.0205996796,,, +8.8945312500,142,1.9676508736,0.9987029831,0.7621881437,,, +8.8964843750,142,1.9676508736,0.9987029831,0.0389105058,,, +8.8984375000,142,1.9691767758,0.9987029831,0.1197833219,,, +8.9003906250,142,1.9691767758,0.9987029831,0.4005493248,,, +8.9023437500,142,1.9707026780,0.9987029831,0.3837644007,,, +8.9042968750,142,1.9707026780,0.9987029831,0.9086747539,,, +8.9062500000,142,1.9707026780,0.9987029831,0.6599526970,,, +8.9082031250,142,1.9722285801,0.9987029831,0.8674753948,,, +8.9101562500,142,1.9722285801,0.9987029831,0.2983138781,,, +8.9121093750,142,1.9737544823,0.9987029831,0.7560845350,,, +8.9140625000,142,1.9737544823,0.9987029831,0.1823453117,,, +8.9160156250,142,1.9752803845,0.9987029831,0.8827344167,,, +8.9179687500,142,1.9752803845,0.9987029831,0.5928130007,,, +8.9199218750,142,1.9752803845,0.9987029831,0.9498741131,,, +8.9218750000,142,1.9768062867,0.9987029831,0.5210955978,,, +8.9238281250,142,1.9768062867,0.9987029831,0.0984206912,,, +8.9257812500,142,1.9783321889,0.9987029831,0.3852903029,,, +8.9277343750,142,1.9783321889,0.9987029831,0.2861066606,,, +8.9296875000,142,1.9783321889,0.9987029831,0.4875257496,,, +8.9316406250,142,1.9798580911,0.9987029831,0.5592431525,,, +8.9335937500,142,1.9798580911,0.9987029831,0.2021820401,,, +8.9355468750,142,1.9798580911,0.9987029831,0.7316700999,,, +8.9375000000,143,1.9813839933,0.9987029831,0.7194628824,,, +8.9394531250,143,1.9813839933,0.9987029831,0.9956511788,,, +8.9414062500,143,1.9813839933,0.9987029831,0.6248569467,,, +8.9433593750,143,1.9829098955,0.9987029831,0.5424582284,,, +8.9453125000,143,1.9829098955,0.9987029831,0.6202792401,,, +8.9472656250,143,1.9829098955,0.9987029831,0.7667658503,,, +8.9492187500,143,1.9844357977,0.9987029831,0.3898680095,,, +8.9511718750,143,1.9844357977,0.9987029831,0.9880216678,,, +8.9531250000,143,1.9844357977,0.9987029831,0.8812085145,,, +8.9550781250,143,1.9859616999,0.9987029831,0.2906843671,,, +8.9570312500,143,1.9859616999,0.9987029831,0.0862134737,,, +8.9589843750,143,1.9859616999,0.9987029831,0.7713435569,,, +8.9609375000,143,1.9874876020,0.9987029831,0.0297550927,,, +8.9628906250,143,1.9874876020,0.9987029831,0.8567940795,,, +8.9648437500,143,1.9874876020,0.9987029831,0.7927061875,,, +8.9667968750,143,1.9874876020,0.9987029831,0.0297550927,,, +8.9687500000,143,1.9890135042,0.9987029831,0.8033875029,,, +8.9707031250,143,1.9890135042,0.9987029831,0.9102006561,,, +8.9726562500,143,1.9890135042,0.9987029831,0.9163042649,,, +8.9746093750,143,1.9905394064,0.9987029831,0.9071488518,,, +8.9765625000,143,1.9905394064,0.9987029831,0.5928130007,,, +8.9785156250,143,1.9905394064,0.9987029831,0.6065461204,,, +8.9804687500,143,1.9905394064,0.9987029831,0.9239337758,,, +8.9824218750,143,1.9920653086,0.9987029831,0.7728694591,,, +8.9843750000,143,1.9920653086,0.9987029831,0.5592431525,,, +8.9863281250,143,1.9920653086,0.9987029831,0.4280155642,,, +8.9882812500,143,1.9920653086,0.9987029831,0.2067597467,,, +8.9902343750,143,1.9920653086,0.9987029831,0.3776607919,,, +8.9921875000,143,1.9935912108,0.9987029831,0.8201724269,,, +8.9941406250,143,1.9935912108,0.9987029831,0.7011520562,,, +8.9960937500,143,1.9935912108,0.9987029831,0.0221255818,,, +8.9980468750,143,1.9935912108,0.9987029831,0.2662699321,,, +9.0000000000,144,1.9935912108,0.9987029831,0.1777676051,,, +9.0019531250,144,1.9951171130,0.9987029831,0.5699244678,,, +9.0039062500,144,1.9951171130,0.9987029831,0.0816357671,,, +9.0058593750,144,1.9951171130,0.9987029831,0.1121538109,,, +9.0078125000,144,1.9951171130,0.9987029831,0.5226215000,,, +9.0097656250,144,1.9951171130,0.9987029831,0.5821316854,,, +9.0117187500,144,1.9951171130,0.9987029831,0.0633249409,,, +9.0136718750,144,1.9966430152,0.9987029831,0.9544518196,,, +9.0156250000,144,1.9966430152,0.9987029831,0.7972838941,,, +9.0175781250,144,1.9966430152,0.9987029831,0.1136797131,,, +9.0195312500,144,1.9966430152,0.9987029831,0.3959716182,,, +9.0214843750,144,1.9966430152,0.9987029831,0.1853971160,,, +9.0234375000,144,1.9966430152,0.9987029831,0.7240405890,,, +9.0253906250,144,1.9966430152,0.9987029831,0.6279087510,,, +9.0273437500,144,1.9966430152,0.9987029831,0.9346150912,,, +9.0292968750,144,1.9981689174,0.9987029831,0.2403295949,,, +9.0312500000,144,1.9981689174,0.9987029831,0.6965743496,,, +9.0332031250,144,1.9981689174,0.9987029831,0.2265964752,,, +9.0351562500,144,1.9981689174,0.9987029831,0.5226215000,,, +9.0371093750,144,1.9981689174,0.9987029831,0.2372777905,,, +9.0390625000,144,1.9981689174,0.9987029831,0.8247501335,,, +9.0410156250,144,1.9981689174,0.9987029831,0.9605554284,,, +9.0429687500,144,1.9981689174,0.9987029831,0.2906843671,,, +9.0449218750,144,1.9981689174,0.9987029831,0.0373846036,,, +9.0468750000,144,1.9981689174,0.9987029831,0.3364614328,,, +9.0488281250,144,1.9981689174,0.9987029831,0.1197833219,,, +9.0507812500,144,1.9981689174,0.9987029831,0.5241474022,,, +9.0527343750,144,1.9996948196,0.9987029831,0.9147783627,,, +9.0546875000,144,1.9996948196,0.9987029831,0.9666590372,,, +9.0566406250,144,1.9996948196,0.9987029831,0.8033875029,,, +9.0585937500,144,1.9996948196,0.9987029831,0.0541695277,,, +9.0605468750,144,1.9996948196,0.9987029831,0.8873121233,,, +9.0625000000,145,1.9996948196,0.9987029831,0.4661631189,,, +9.0644531250,145,1.9996948196,0.9987029831,0.9040970474,,, +9.0664062500,145,1.9996948196,0.9987029831,0.8232242313,,, +9.0683593750,145,1.9996948196,0.9987029831,0.0602731365,,, +9.0703125000,145,1.9996948196,0.9987029831,0.2967879759,,, +9.0722656250,145,1.9996948196,0.9987029831,0.3898680095,,, +9.0742187500,145,1.9996948196,0.9987029831,0.7316700999,,, +9.0761718750,145,1.9996948196,0.9987029831,0.3028915846,,, +9.0781250000,145,1.9996948196,0.9987029831,0.9437705043,,, +9.0800781250,145,1.9996948196,0.9987029831,0.5592431525,,, +9.0820312500,145,1.9996948196,0.9987029831,0.4386968795,,, +9.0839843750,145,1.9996948196,0.9987029831,0.2220187686,,, +9.0859375000,145,1.9996948196,0.9987029831,0.0068665599,,, +9.0878906250,145,1.9981689174,0.9987029831,0.6401159686,,, +9.0898437500,145,1.9981689174,0.9987029831,0.1640344854,,, +9.0917968750,145,1.9981689174,0.9987029831,0.9651331350,,, +9.0937500000,145,1.9981689174,0.9987029831,0.4417486839,,, +9.0957031250,145,1.9981689174,0.9987029831,0.1625085832,,, +9.0976562500,145,1.9981689174,0.9987029831,0.4509040970,,, +9.0996093750,145,1.9981689174,0.9987029831,0.8125429160,,, +9.1015625000,145,1.9981689174,0.9987029831,0.8430609598,,, +9.1035156250,145,1.9981689174,0.9987029831,0.1075761044,,, +9.1054687500,145,1.9981689174,0.9987029831,0.6858930343,,, +9.1074218750,145,1.9981689174,0.9987029831,0.6614785992,,, +9.1093750000,145,1.9981689174,0.9987029831,0.2937361715,,, +9.1113281250,145,1.9966430152,0.9987029831,0.5195696956,,, +9.1132812500,145,1.9966430152,0.9987029831,0.5851834897,,, +9.1152343750,145,1.9966430152,0.9987029831,0.2616922255,,, +9.1171875000,145,1.9966430152,0.9987029831,0.1701380941,,, +9.1191406250,145,1.9966430152,0.9987029831,0.9147783627,,, +9.1210937500,145,1.9966430152,0.9987029831,0.7789730678,,, +9.1230468750,145,1.9966430152,0.9987029831,0.2189669642,,, +9.1250000000,146,1.9966430152,0.9987029831,0.9651331350,,, +9.1269531250,146,1.9951171130,0.9987029831,0.7530327306,,, +9.1289062500,146,1.9951171130,0.9987029831,0.0495918212,,, +9.1308593750,146,1.9951171130,0.9987029831,0.9712367437,,, +9.1328125000,146,1.9951171130,0.9987029831,0.8171206226,,, +9.1347656250,146,1.9951171130,0.9987029831,0.6248569467,,, +9.1367187500,146,1.9951171130,0.9987029831,0.6996261540,,, +9.1386718750,146,1.9935912108,0.9987029831,0.0816357671,,, +9.1406250000,146,1.9935912108,0.9987029831,0.8216983291,,, +9.1425781250,146,1.9935912108,0.9987029831,0.4142824445,,, +9.1445312500,146,1.9935912108,0.9987029831,0.7560845350,,, +9.1464843750,146,1.9935912108,0.9987029831,0.4524299992,,, +9.1484375000,146,1.9920653086,0.9987029831,0.0175478752,,, +9.1503906250,146,1.9920653086,0.9987029831,0.5516136416,,, +9.1523437500,146,1.9920653086,0.9987029831,0.4890516518,,, +9.1542968750,146,1.9920653086,0.9987029831,0.4478522927,,, +9.1562500000,146,1.9920653086,0.9987029831,0.6523231861,,, +9.1582031250,146,1.9905394064,0.9987029831,0.9330891890,,, +9.1601562500,146,1.9905394064,0.9987029831,0.4570077058,,, +9.1621093750,146,1.9905394064,0.9987029831,0.1838712139,,, +9.1640625000,146,1.9905394064,0.9987029831,0.4264896620,,, +9.1660156250,146,1.9890135042,0.9987029831,0.2449073014,,, +9.1679687500,146,1.9890135042,0.9987029831,0.2967879759,,, +9.1699218750,146,1.9890135042,0.9987029831,0.6721599145,,, +9.1718750000,146,1.9874876020,0.9987029831,0.0953688869,,, +9.1738281250,146,1.9874876020,0.9987029831,0.1915007248,,, +9.1757812500,146,1.9874876020,0.9987029831,0.7866025788,,, +9.1777343750,146,1.9874876020,0.9987029831,0.6141756313,,, +9.1796875000,146,1.9859616999,0.9987029831,0.7026779583,,, +9.1816406250,146,1.9859616999,0.9987029831,0.3440909438,,, +9.1835937500,146,1.9859616999,0.9987029831,0.6157015335,,, +9.1855468750,146,1.9844357977,0.9987029831,0.0694285496,,, +9.1875000000,147,1.9844357977,0.9987029831,0.5012588693,,, +9.1894531250,147,1.9844357977,0.9987029831,0.0251773861,,, +9.1914062500,147,1.9829098955,0.9987029831,0.0114442664,,, +9.1933593750,147,1.9829098955,0.9987029831,0.2372777905,,, +9.1953125000,147,1.9829098955,0.9987029831,0.5333028153,,, +9.1972656250,147,1.9813839933,0.9987029831,0.9559777218,,, +9.1992187500,147,1.9813839933,0.9987029831,0.0877393759,,, +9.2011718750,147,1.9813839933,0.9987029831,0.1930266270,,, +9.2031250000,147,1.9798580911,0.9987029831,0.1625085832,,, +9.2050781250,147,1.9798580911,0.9987029831,0.9941252766,,, +9.2070312500,147,1.9798580911,0.9987029831,0.8583199817,,, +9.2089843750,147,1.9783321889,0.9987029831,0.0572213321,,, +9.2109375000,147,1.9783321889,0.9987029831,0.8476386664,,, +9.2128906250,147,1.9783321889,0.9987029831,0.8735790036,,, +9.2148437500,147,1.9768062867,0.9987029831,0.6950484474,,, +9.2167968750,147,1.9768062867,0.9987029831,0.0373846036,,, +9.2187500000,147,1.9752803845,0.9987029831,0.2723735409,,, +9.2207031250,147,1.9752803845,0.9987029831,0.5806057832,,, +9.2226562500,147,1.9752803845,0.9987029831,0.6996261540,,, +9.2246093750,147,1.9737544823,0.9987029831,0.7484550240,,, +9.2265625000,147,1.9737544823,0.9987029831,0.5958648051,,, +9.2285156250,147,1.9722285801,0.9987029831,0.3059433890,,, +9.2304687500,147,1.9722285801,0.9987029831,0.0404364080,,, +9.2324218750,147,1.9722285801,0.9987029831,0.1838712139,,, +9.2343750000,147,1.9707026780,0.9987029831,0.9193560693,,, +9.2363281250,147,1.9707026780,0.9987029831,0.7164110780,,, +9.2382812500,147,1.9691767758,0.9987029831,0.7713435569,,, +9.2402343750,147,1.9691767758,0.9987029831,0.0144960708,,, +9.2421875000,147,1.9676508736,0.9987029831,0.3166247044,,, +9.2441406250,147,1.9676508736,0.9987029831,0.4417486839,,, +9.2460937500,147,1.9661249714,0.9987029831,0.5439841306,,, +9.2480468750,147,1.9661249714,0.9987029831,0.2830548562,,, +9.2500000000,148,1.9645990692,0.9987029831,0.4493781949,,, +9.2519531250,148,1.9645990692,0.9987029831,0.9040970474,,, +9.2539062500,148,1.9630731670,0.9987029831,0.5836575875,,, +9.2558593750,148,1.9630731670,0.9987029831,0.5806057832,,, +9.2578125000,148,1.9615472648,0.9987029831,0.9575036240,,, +9.2597656250,148,1.9615472648,0.9987029831,0.1640344854,,, +9.2617187500,148,1.9600213626,0.9987029831,0.7606622416,,, +9.2636718750,148,1.9600213626,0.9987029831,0.5394064240,,, +9.2656250000,148,1.9584954604,0.9987029831,0.5043106737,,, +9.2675781250,148,1.9584954604,0.9987029831,0.4524299992,,, +9.2695312500,148,1.9569695583,0.9987029831,0.4371709773,,, +9.2714843750,148,1.9569695583,0.9987029831,0.1853971160,,, +9.2734375000,148,1.9554436561,0.9987029831,0.4005493248,,, +9.2753906250,148,1.9554436561,0.9987029831,0.2189669642,,, +9.2773437500,148,1.9539177539,0.9987029831,0.2555886168,,, +9.2792968750,148,1.9539177539,0.9987029831,0.0434882124,,, +9.2812500000,148,1.9523918517,0.9987029831,0.9407186999,,, +9.2832031250,148,1.9523918517,0.9987029831,0.9895475700,,, +9.2851562500,148,1.9508659495,0.9987029831,0.9529259174,,, +9.2871093750,148,1.9493400473,0.9987029831,0.5867093919,,, +9.2890625000,148,1.9493400473,0.9987029831,0.5394064240,,, +9.2910156250,148,1.9478141451,0.9987029831,0.8690012970,,, +9.2929687500,148,1.9478141451,0.9987029831,0.1060502022,,, +9.2949218750,148,1.9462882429,0.9987029831,0.3425650416,,, +9.2968750000,148,1.9447623407,0.9987029831,0.8186465248,,, +9.2988281250,148,1.9447623407,0.9987029831,0.2433813993,,, +9.3007812500,148,1.9432364385,0.9987029831,0.2464332036,,, +9.3027343750,148,1.9432364385,0.9987029831,0.7957579919,,, +9.3046875000,148,1.9417105364,0.9987029831,0.0892652781,,, +9.3066406250,148,1.9401846342,0.9987029831,0.9102006561,,, +9.3085937500,148,1.9401846342,0.9987029831,0.4463263905,,, +9.3105468750,148,1.9386587320,0.9987029831,0.9452964065,,, +9.3125000000,149,1.9371328298,0.9987029831,0.3776607919,,, +9.3144531250,149,1.9371328298,0.9987029831,0.3089951934,,, +9.3164062500,149,1.9356069276,0.9987029831,0.2983138781,,, +9.3183593750,149,1.9356069276,0.9987029831,0.0938429847,,, +9.3203125000,149,1.9340810254,0.9987029831,0.5500877394,,, +9.3222656250,149,1.9325551232,0.9987029831,0.3791866941,,, +9.3242187500,149,1.9325551232,0.9987029831,0.8552681773,,, +9.3261718750,149,1.9310292210,0.9987029831,0.7988097963,,, +9.3281250000,149,1.9295033188,0.9987029831,0.5790798810,,, +9.3300781250,149,1.9295033188,0.9987029831,0.9651331350,,, +9.3320312500,149,1.9279774166,0.9987029831,0.1213092241,,, +9.3339843750,149,1.9264515145,0.9987029831,0.0160219730,,, +9.3359375000,149,1.9249256123,0.9987029831,0.7194628824,,, +9.3378906250,149,1.9249256123,0.9987029831,0.6813153277,,, +9.3398437500,149,1.9233997101,0.9987029831,0.4036011292,,, +9.3417968750,149,1.9218738079,0.9987029831,0.7759212634,,, +9.3437500000,149,1.9218738079,0.9987029831,0.1670862898,,, +9.3457031250,149,1.9203479057,0.9987029831,0.6462195773,,, +9.3476562500,149,1.9188220035,0.9987029831,0.5409323262,,, +9.3496093750,149,1.9172961013,0.9987029831,0.6141756313,,, +9.3515625000,149,1.9172961013,0.9987029831,0.5073624781,,, +9.3535156250,149,1.9157701991,0.9987029831,0.4966811627,,, +9.3554687500,149,1.9142442969,0.9987029831,0.5989166094,,, +9.3574218750,149,1.9127183948,0.9987029831,0.1289387350,,, +9.3593750000,149,1.9127183948,0.9987029831,0.0587472343,,, +9.3613281250,149,1.9111924926,0.9987029831,0.6294346532,,, +9.3632812500,149,1.9096665904,0.9987029831,0.4127565423,,, +9.3652343750,149,1.9081406882,0.9987029831,0.7087815671,,, +9.3671875000,149,1.9081406882,0.9987029831,0.5271992065,,, +9.3691406250,149,1.9066147860,0.9987029831,0.8674753948,,, +9.3710937500,149,1.9050888838,0.9987029831,0.8064393072,,, +9.3730468750,149,1.9035629816,0.9987029831,0.6294346532,,, +9.3750000000,150,1.9035629816,0.9987029831,0.6202792401,,, +9.3769531250,150,1.9020370794,0.9987029831,0.8812085145,,, +9.3789062500,150,1.9005111772,0.9987029831,0.1319905394,,, +9.3808593750,150,1.8989852750,0.9987029831,0.5958648051,,, +9.3828125000,150,1.8974593729,0.9987029831,0.9193560693,,, +9.3847656250,150,1.8974593729,0.9987029831,0.0831616693,,, +9.3867187500,150,1.8959334707,0.9987029831,0.2021820401,,, +9.3886718750,150,1.8944075685,0.9987029831,0.3074692912,,, +9.3906250000,150,1.8928816663,0.9987029831,0.5485618372,,, +9.3925781250,150,1.8913557641,0.9987029831,0.8598458839,,, +9.3945312500,150,1.8898298619,0.9987029831,0.6492713817,,, +9.3964843750,150,1.8898298619,0.9987029831,0.6034943160,,, +9.3984375000,150,1.8883039597,0.9987029831,0.4325932708,,, +9.4003906250,150,1.8867780575,0.9987029831,0.1304646372,,, +9.4023437500,150,1.8852521553,0.9987029831,0.6111238270,,, +9.4042968750,150,1.8837262531,0.9987029831,0.1258869306,,, +9.4062500000,150,1.8822003510,0.9987029831,0.4127565423,,, +9.4082031250,150,1.8806744488,0.9987029831,0.8018616007,,, +9.4101562500,150,1.8791485466,0.9987029831,0.8506904707,,, +9.4121093750,150,1.8791485466,0.9987029831,0.1792935073,,, +9.4140625000,150,1.8776226444,0.9987029831,0.9498741131,,, +9.4160156250,150,1.8760967422,0.9987029831,0.1213092241,,, +9.4179687500,150,1.8745708400,0.9987029831,0.3181506065,,, +9.4199218750,150,1.8730449378,0.9987029831,0.2708476387,,, +9.4218750000,150,1.8715190356,0.9987029831,0.6050202182,,, +9.4238281250,150,1.8699931334,0.9987029831,0.4280155642,,, +9.4257812500,150,1.8684672313,0.9987029831,0.2540627146,,, +9.4277343750,150,1.8669413291,0.9987029831,0.4219119554,,, +9.4296875000,150,1.8654154269,0.9987029831,0.9925993744,,, +9.4316406250,150,1.8654154269,0.9987029831,0.1274128328,,, +9.4335937500,150,1.8638895247,0.9987029831,0.6507972839,,, +9.4355468750,150,1.8623636225,0.9987029831,0.8888380255,,, +9.4375000000,151,1.8608377203,0.9987029831,0.8873121233,,, +9.4394531250,151,1.8593118181,0.9987029831,0.3089951934,,, +9.4414062500,151,1.8577859159,0.9987029831,0.4081788357,,, +9.4433593750,151,1.8562600137,0.9987029831,0.5973907073,,, +9.4453125000,151,1.8547341115,0.9987029831,0.1625085832,,, +9.4472656250,151,1.8532082094,0.9987029831,0.5302510109,,, +9.4492187500,151,1.8516823072,0.9987029831,0.8186465248,,, +9.4511718750,151,1.8501564050,0.9987029831,0.6050202182,,, +9.4531250000,151,1.8486305028,0.9987029831,0.9391927977,,, +9.4550781250,151,1.8471046006,0.9987029831,0.6095979248,,, +9.4570312500,151,1.8455786984,0.9987029831,0.5287251087,,, +9.4589843750,151,1.8440527962,0.9987029831,0.9056229496,,, +9.4609375000,151,1.8425268940,0.9987029831,0.0007629511,,, +9.4628906250,151,1.8410009918,0.9987029831,0.4264896620,,, +9.4648437500,151,1.8394750896,0.9987029831,0.9514000153,,, +9.4667968750,151,1.8379491875,0.9987029831,0.5790798810,,, +9.4687500000,151,1.8364232853,0.9987029831,0.5394064240,,, +9.4707031250,151,1.8348973831,0.9987029831,0.0541695277,,, +9.4726562500,151,1.8333714809,0.9987029831,0.5149919890,,, +9.4746093750,151,1.8318455787,0.9987029831,0.4737926299,,, +9.4765625000,151,1.8303196765,0.9987029831,0.9971770809,,, +9.4785156250,151,1.8287937743,0.9987029831,0.7515068284,,, +9.4804687500,151,1.8272678721,0.9987029831,0.1808194095,,, +9.4824218750,151,1.8257419699,0.9987029831,0.1884489204,,, +9.4843750000,151,1.8242160678,0.9987029831,0.5668726635,,, +9.4863281250,151,1.8226901656,0.9987029831,0.9285114824,,, +9.4882812500,151,1.8211642634,0.9987029831,0.4325932708,,, +9.4902343750,151,1.8196383612,0.9987029831,0.1701380941,,, +9.4921875000,151,1.8181124590,0.9987029831,0.2479591058,,, +9.4941406250,151,1.8165865568,0.9987029831,0.2998397803,,, +9.4960937500,151,1.8135347524,0.9987029831,0.5241474022,,, +9.4980468750,151,1.8120088502,0.9987029831,0.0434882124,,, +9.5000000000,152,1.8104829480,0.9987029831,0.4707408255,,, +9.5019531250,152,1.8089570459,0.9987029831,0.5195696956,,, +9.5039062500,152,1.8074311437,0.9987029831,0.7179369802,,, +9.5058593750,152,1.8059052415,0.9987029831,0.9864957656,,, +9.5078125000,152,1.8043793393,0.9987029831,0.8125429160,,, +9.5097656250,152,1.8028534371,0.9987029831,0.0801098650,,, +9.5117187500,152,1.8013275349,0.9987029831,0.6996261540,,, +9.5136718750,152,1.7998016327,0.9987029831,0.3273060197,,, +9.5156250000,152,1.7982757305,0.9987029831,0.0740062562,,, +9.5175781250,152,1.7952239261,0.9987029831,0.0099183642,,, +9.5195312500,152,1.7936980240,0.9987029831,0.9102006561,,, +9.5214843750,152,1.7921721218,0.9987029831,0.7484550240,,, +9.5234375000,152,1.7906462196,0.9987029831,0.6492713817,,, +9.5253906250,152,1.7891203174,0.9987029831,0.9102006561,,, +9.5273437500,152,1.7875944152,0.9987029831,0.7118333715,,, +9.5292968750,152,1.7860685130,0.9987029831,0.3837644007,,, +9.5312500000,152,1.7830167086,0.9987029831,0.9803921569,,, +9.5332031250,152,1.7814908064,0.9987029831,0.2479591058,,, +9.5351562500,152,1.7799649042,0.9987029831,0.3501945525,,, +9.5371093750,152,1.7784390021,0.9987029831,0.6660563058,,, +9.5390625000,152,1.7769130999,0.9987029831,0.7392996109,,, +9.5410156250,152,1.7753871977,0.9987029831,0.3166247044,,, +9.5429687500,152,1.7723353933,0.9987029831,0.3074692912,,, +9.5449218750,152,1.7708094911,0.9987029831,0.8232242313,,, +9.5468750000,152,1.7692835889,0.9987029831,0.0419623102,,, +9.5488281250,152,1.7677576867,0.9987029831,0.8827344167,,, +9.5507812500,152,1.7662317845,0.9987029831,0.7866025788,,, +9.5527343750,152,1.7647058824,0.9987029831,0.2479591058,,, +9.5546875000,152,1.7616540780,0.9987029831,0.9178301671,,, +9.5566406250,152,1.7601281758,0.9987029831,0.2754253452,,, +9.5585937500,152,1.7586022736,0.9987029831,0.9132524605,,, +9.5605468750,152,1.7570763714,0.9987029831,0.6004425116,,, +9.5625000000,153,1.7555504692,0.9987029831,0.1045243000,,, +9.5644531250,153,1.7524986648,0.9987029831,0.6996261540,,, +9.5664062500,153,1.7509727626,0.9987029831,0.1548790723,,, +9.5683593750,153,1.7494468605,0.9987029831,0.4539559014,,, +9.5703125000,153,1.7479209583,0.9987029831,0.9666590372,,, +9.5722656250,153,1.7448691539,0.9987029831,0.6736858167,,, +9.5742187500,153,1.7433432517,0.9987029831,0.5851834897,,, +9.5761718750,153,1.7418173495,0.9987029831,0.7804989700,,, +9.5781250000,153,1.7402914473,0.9987029831,0.6904707408,,, +9.5800781250,153,1.7372396429,0.9987029831,0.9010452430,,, +9.5820312500,153,1.7357137407,0.9987029831,0.4982070649,,, +9.5839843750,153,1.7341878386,0.9987029831,0.8033875029,,, +9.5859375000,153,1.7326619364,0.9987029831,0.0801098650,,, +9.5878906250,153,1.7296101320,0.9987029831,0.9208819715,,, +9.5898437500,153,1.7280842298,0.9987029831,0.8064393072,,, +9.5917968750,153,1.7265583276,0.9987029831,0.3685053788,,, +9.5937500000,153,1.7250324254,0.9987029831,0.4554818036,,, +9.5957031250,153,1.7219806210,0.9987029831,0.0465400168,,, +9.5976562500,153,1.7204547189,0.9987029831,0.9956511788,,, +9.5996093750,153,1.7189288167,0.9987029831,0.2967879759,,, +9.6015625000,153,1.7158770123,0.9987029831,0.6828412299,,, +9.6035156250,153,1.7143511101,0.9987029831,0.1518272679,,, +9.6054687500,153,1.7128252079,0.9987029831,0.3288319219,,, +9.6074218750,153,1.7112993057,0.9987029831,0.2937361715,,, +9.6093750000,153,1.7082475013,0.9987029831,0.3227283131,,, +9.6113281250,153,1.7067215991,0.9987029831,0.1274128328,,, +9.6132812500,153,1.7051956970,0.9987029831,0.7652399481,,, +9.6152343750,153,1.7021438926,0.9987029831,0.6065461204,,, +9.6171875000,153,1.7006179904,0.9987029831,0.8339055467,,, +9.6191406250,153,1.6990920882,0.9987029831,0.7576104372,,, +9.6210937500,153,1.6960402838,0.9987029831,0.8033875029,,, +9.6230468750,153,1.6945143816,0.9987029831,0.2464332036,,, +9.6250000000,154,1.6929884794,0.9987029831,0.7606622416,,, +9.6269531250,154,1.6899366751,0.9987029831,0.1228351263,,, +9.6289062500,154,1.6884107729,0.9987029831,0.9269855802,,, +9.6308593750,154,1.6868848707,0.9987029831,0.3578240635,,, +9.6328125000,154,1.6838330663,0.9987029831,0.8445868620,,, +9.6347656250,154,1.6823071641,0.9987029831,0.6645304036,,, +9.6367187500,154,1.6807812619,0.9987029831,0.2174410620,,, +9.6386718750,154,1.6777294575,0.9987029831,0.1777676051,,, +9.6406250000,154,1.6762035554,0.9987029831,0.8400091554,,, +9.6425781250,154,1.6746776532,0.9987029831,0.2891584649,,, +9.6445312500,154,1.6716258488,0.9987029831,0.9025711452,,, +9.6464843750,154,1.6700999466,0.9987029831,0.8400091554,,, +9.6484375000,154,1.6670481422,0.9987029831,0.1518272679,,, +9.6503906250,154,1.6655222400,0.9987029831,0.6080720226,,, +9.6523437500,154,1.6639963378,0.9987029831,-0.0007629511,,, +9.6542968750,154,1.6609445335,0.9987029831,0.9071488518,,, +9.6562500000,154,1.6594186313,0.9987029831,0.8201724269,,, +9.6582031250,154,1.6563668269,0.9987029831,0.8751049058,,, +9.6601562500,154,1.6548409247,0.9987029831,0.1792935073,,, +9.6621093750,154,1.6533150225,0.9987029831,0.5088883803,,, +9.6640625000,154,1.6502632181,0.9987029831,0.1411459525,,, +9.6660156250,154,1.6487373159,0.9987029831,0.4127565423,,, +9.6679687500,154,1.6456855116,0.9987029831,0.3898680095,,, +9.6699218750,154,1.6441596094,0.9987029831,0.9208819715,,, +9.6718750000,154,1.6426337072,0.9987029831,0.5500877394,,, +9.6738281250,154,1.6395819028,0.9987029831,0.7530327306,,, +9.6757812500,154,1.6380560006,0.9987029831,0.1853971160,,, +9.6777343750,154,1.6350041962,0.9987029831,0.2922102693,,, +9.6796875000,154,1.6334782940,0.9987029831,0.4005493248,,, +9.6816406250,154,1.6304264897,0.9987029831,0.7927061875,,, +9.6835937500,154,1.6289005875,0.9987029831,0.7042038605,,, +9.6855468750,154,1.6273746853,0.9987029831,0.6446936751,,, +9.6875000000,155,1.6243228809,0.9987029831,0.2082856489,,, +9.6894531250,155,1.6227969787,0.9987029831,0.3181506065,,, +9.6914062500,155,1.6197451743,0.9987029831,0.0495918212,,, +9.6933593750,155,1.6182192721,0.9987029831,0.4112306401,,, +9.6953125000,155,1.6151674678,0.9987029831,0.7209887846,,, +9.6972656250,155,1.6136415656,0.9987029831,0.1411459525,,, +9.6992187500,155,1.6105897612,0.9987029831,0.8216983291,,, +9.7011718750,155,1.6090638590,0.9987029831,0.5470359350,,, +9.7031250000,155,1.6060120546,0.9987029831,0.0099183642,,, +9.7050781250,155,1.6044861524,0.9987029831,0.8842603189,,, +9.7070312500,155,1.6029602502,0.9987029831,0.6294346532,,, +9.7089843750,155,1.5999084459,0.9987029831,0.5500877394,,, +9.7109375000,155,1.5983825437,0.9987029831,0.7515068284,,, +9.7128906250,155,1.5953307393,0.9987029831,0.7591363394,,, +9.7148437500,155,1.5938048371,0.9987029831,0.0205996796,,, +9.7167968750,155,1.5907530327,0.9987029831,0.5745021744,,, +9.7187500000,155,1.5892271305,0.9987029831,0.0068665599,,, +9.7207031250,155,1.5861753262,0.9987029831,0.7087815671,,, +9.7226562500,155,1.5846494240,0.9987029831,0.3257801175,,, +9.7246093750,155,1.5815976196,0.9987029831,0.2738994430,,, +9.7265625000,155,1.5800717174,0.9987029831,0.0679026474,,, +9.7285156250,155,1.5770199130,0.9987029831,0.1029983978,,, +9.7304687500,155,1.5754940108,0.9987029831,0.7225146868,,, +9.7324218750,155,1.5724422065,0.9987029831,0.2967879759,,, +9.7343750000,155,1.5693904021,0.9987029831,0.6507972839,,, +9.7363281250,155,1.5678644999,0.9987029831,0.1487754635,,, +9.7382812500,155,1.5648126955,0.9987029831,0.5241474022,,, +9.7402343750,155,1.5632867933,0.9987029831,0.7072556649,,, +9.7421875000,155,1.5602349889,0.9987029831,0.3929198138,,, +9.7441406250,155,1.5587090867,0.9987029831,0.9224078737,,, +9.7460937500,155,1.5556572824,0.9987029831,0.6523231861,,, +9.7480468750,155,1.5541313802,0.9987029831,0.5409323262,,, +9.7500000000,156,1.5510795758,0.9987029831,0.5516136416,,, +9.7519531250,156,1.5495536736,0.9987029831,0.6294346532,,, +9.7539062500,156,1.5465018692,0.9987029831,0.5622949569,,, +9.7558593750,156,1.5449759670,0.9987029831,0.6004425116,,, +9.7578125000,156,1.5419241627,0.9987029831,0.9391927977,,, +9.7597656250,156,1.5388723583,0.9987029831,0.1380941482,,, +9.7617187500,156,1.5373464561,0.9987029831,0.6584267948,,, +9.7636718750,156,1.5342946517,0.9987029831,0.9147783627,,, +9.7656250000,156,1.5327687495,0.9987029831,0.6752117189,,, +9.7675781250,156,1.5297169451,0.9987029831,0.6507972839,,, +9.7695312500,156,1.5281910430,0.9987029831,0.9941252766,,, +9.7714843750,156,1.5251392386,0.9987029831,0.9483482109,,, +9.7734375000,156,1.5220874342,0.9987029831,0.3089951934,,, +9.7753906250,156,1.5205615320,0.9987029831,0.1899748226,,, +9.7773437500,156,1.5175097276,0.9987029831,0.2601663233,,, +9.7792968750,156,1.5159838254,0.9987029831,0.9681849393,,, +9.7812500000,156,1.5129320211,0.9987029831,0.2555886168,,, +9.7832031250,156,1.5114061189,0.9987029831,0.4966811627,,, +9.7851562500,156,1.5083543145,0.9987029831,0.7087815671,,, +9.7871093750,156,1.5053025101,0.9987029831,0.6736858167,,, +9.7890625000,156,1.5037766079,0.9987029831,0.0480659190,,, +9.7910156250,156,1.5007248035,0.9987029831,0.0160219730,,, +9.7929687500,156,1.4991989014,0.9987029831,0.4402227817,,, +9.7949218750,156,1.4961470970,0.9987029831,0.4600595102,,, +9.7968750000,156,1.4930952926,0.9987029831,0.3486686503,,, +9.7988281250,156,1.4915693904,0.9987029831,0.0434882124,,, +9.8007812500,156,1.4885175860,0.9987029831,0.2128633555,,, +9.8027343750,156,1.4854657816,0.9987029831,0.0038147555,,, +9.8046875000,156,1.4839398795,0.9987029831,0.2128633555,,, +9.8066406250,156,1.4808880751,0.9987029831,0.3196765087,,, +9.8085937500,156,1.4793621729,0.9987029831,0.6919966430,,, +9.8105468750,156,1.4763103685,0.9987029831,0.9147783627,,, +9.8125000000,157,1.4732585641,0.9987029831,0.3624017700,,, +9.8144531250,157,1.4717326619,0.9987029831,0.0984206912,,, +9.8164062500,157,1.4686808576,0.9987029831,0.4524299992,,, +9.8183593750,157,1.4656290532,0.9987029831,0.0556954299,,, +9.8203125000,157,1.4641031510,0.9987029831,0.5256733043,,, +9.8222656250,157,1.4610513466,0.9987029831,0.9224078737,,, +9.8242187500,157,1.4595254444,0.9987029831,0.4554818036,,, +9.8261718750,157,1.4564736400,0.9987029831,0.7652399481,,, +9.8281250000,157,1.4534218357,0.9987029831,0.5104142824,,, +9.8300781250,157,1.4518959335,0.9987029831,0.3212024109,,, +9.8320312500,157,1.4488441291,0.9987029831,0.7576104372,,, +9.8339843750,157,1.4457923247,0.9987029831,0.7515068284,,, +9.8359375000,157,1.4442664225,0.9987029831,0.1655603876,,, +9.8378906250,157,1.4412146181,0.9987029831,0.6324864576,,, +9.8398437500,157,1.4381628138,0.9987029831,0.8979934386,,, +9.8417968750,157,1.4366369116,0.9987029831,0.9742885481,,, +9.8437500000,157,1.4335851072,0.9987029831,0.3593499657,,, +9.8457031250,157,1.4305333028,0.9987029831,0.2784771496,,, +9.8476562500,157,1.4290074006,0.9987029831,0.2433813993,,, +9.8496093750,157,1.4259555962,0.9987029831,0.3776607919,,, +9.8515625000,157,1.4229037919,0.9987029831,0.2006561379,,, +9.8535156250,157,1.4213778897,0.9987029831,0.9529259174,,, +9.8554687500,157,1.4183260853,0.9987029831,0.7438773175,,, +9.8574218750,157,1.4152742809,0.9987029831,0.8201724269,,, +9.8593750000,157,1.4122224765,0.9987029831,0.0373846036,,, +9.8613281250,157,1.4106965743,0.9987029831,0.0679026474,,, +9.8632812500,157,1.4076447700,0.9987029831,0.4127565423,,, +9.8652343750,157,1.4045929656,0.9987029831,0.8491645686,,, +9.8671875000,157,1.4030670634,0.9987029831,0.9178301671,,, +9.8691406250,157,1.4000152590,0.9987029831,0.7621881437,,, +9.8710937500,157,1.3969634546,0.9987029831,0.4051270314,,, +9.8730468750,157,1.3954375525,0.9987029831,0.4737926299,,, +9.8750000000,158,1.3923857481,0.9987029831,0.2220187686,,, +9.8769531250,158,1.3893339437,0.9987029831,0.6645304036,,, +9.8789062500,158,1.3862821393,0.9987029831,0.2632181277,,, +9.8808593750,158,1.3847562371,0.9987029831,0.5851834897,,, +9.8828125000,158,1.3817044327,0.9987029831,0.2479591058,,, +9.8847656250,158,1.3786526284,0.9987029831,0.5912870985,,, +9.8867187500,158,1.3771267262,0.9987029831,0.8613717861,,, +9.8886718750,158,1.3740749218,0.9987029831,0.6233310445,,, +9.8906250000,158,1.3710231174,0.9987029831,0.9239337758,,, +9.8925781250,158,1.3679713130,0.9987029831,0.1594567788,,, +9.8945312500,158,1.3664454108,0.9987029831,0.0953688869,,, +9.8964843750,158,1.3633936065,0.9987029831,0.3517204547,,, +9.8984375000,158,1.3603418021,0.9987029831,0.7698176547,,, +9.9003906250,158,1.3588158999,0.9987029831,0.1365682460,,, +9.9023437500,158,1.3557640955,0.9987029831,0.0419623102,,, +9.9042968750,158,1.3527122911,0.9987029831,0.2784771496,,, +9.9062500000,158,1.3496604868,0.9987029831,0.0602731365,,, +9.9082031250,158,1.3481345846,0.9987029831,0.7286182956,,, +9.9101562500,158,1.3450827802,0.9987029831,0.4737926299,,, +9.9121093750,158,1.3420309758,0.9987029831,0.4615854124,,, +9.9140625000,158,1.3389791714,0.9987029831,0.5302510109,,, +9.9160156250,158,1.3374532692,0.9987029831,0.9391927977,,, +9.9179687500,158,1.3344014649,0.9987029831,0.3303578241,,, +9.9199218750,158,1.3313496605,0.9987029831,0.1091020066,,, +9.9218750000,158,1.3282978561,0.9987029831,0.9330891890,,, +9.9238281250,158,1.3267719539,0.9987029831,0.2449073014,,, +9.9257812500,158,1.3237201495,0.9987029831,0.5592431525,,, +9.9277343750,158,1.3206683452,0.9987029831,0.2265964752,,, +9.9296875000,158,1.3176165408,0.9987029831,0.7606622416,,, +9.9316406250,158,1.3160906386,0.9987029831,0.9132524605,,, +9.9335937500,158,1.3130388342,0.9987029831,0.1396200504,,, +9.9355468750,158,1.3099870298,0.9987029831,0.5317769131,,, +9.9375000000,159,1.3069352255,0.9987029831,0.9178301671,,, +9.9394531250,159,1.3054093233,0.9987029831,0.6141756313,,, +9.9414062500,159,1.3023575189,0.9987029831,0.4264896620,,, +9.9433593750,159,1.2993057145,0.9987029831,0.6141756313,,, +9.9453125000,159,1.2962539101,0.9987029831,0.6904707408,,, +9.9472656250,159,1.2947280079,0.9987029831,0.4737926299,,, +9.9492187500,159,1.2916762036,0.9987029831,0.9803921569,,, +9.9511718750,159,1.2886243992,0.9987029831,0.1457236591,,, +9.9531250000,159,1.2855725948,0.9987029831,0.4997329671,,, +9.9550781250,159,1.2825207904,0.9987029831,0.0907911803,,, +9.9570312500,159,1.2809948882,0.9987029831,0.1670862898,,, +9.9589843750,159,1.2779430838,0.9987029831,0.5470359350,,, +9.9609375000,159,1.2748912795,0.9987029831,0.6935225452,,, +9.9628906250,159,1.2718394751,0.9987029831,0.9544518196,,, +9.9648437500,159,1.2703135729,0.9987029831,0.3105210956,,, +9.9667968750,159,1.2672617685,0.9987029831,0.3257801175,,, +9.9687500000,159,1.2642099641,0.9987029831,0.6309605554,,, +9.9707031250,159,1.2611581598,0.9987029831,0.9040970474,,, +9.9726562500,159,1.2581063554,0.9987029831,0.2769512474,,, +9.9746093750,159,1.2565804532,0.9987029831,0.0709544518,,, +9.9765625000,159,1.2535286488,0.9987029831,0.7560845350,,, +9.9785156250,159,1.2504768444,0.9987029831,0.2784771496,,, +9.9804687500,159,1.2474250401,0.9987029831,0.6355382620,,, +9.9824218750,159,1.2443732357,0.9987029831,0.4188601511,,, +9.9843750000,159,1.2428473335,0.9987029831,0.3364614328,,, +9.9863281250,159,1.2397955291,0.9987029831,0.0907911803,,, +9.9882812500,159,1.2367437247,0.9987029831,0.0755321584,,, +9.9902343750,159,1.2336919203,0.9987029831,0.8094911116,,, +9.9921875000,159,1.2306401160,0.9987029831,0.9544518196,,, +9.9941406250,159,1.2291142138,0.9987029831,0.9758144503,,, +9.9960937500,159,1.2260624094,0.9987029831,0.4753185321,,, +9.9980468750,159,1.2230106050,0.9987029831,0.2189669642,,, +10.0000000000,160,1.2199588006,0.9987029831,-0.0007629511,,, +10.0019531250,160,1.2169069963,0.9987029831,0.0190737774,,, +10.0039062500,160,1.2153810941,0.9987029831,0.9895475700,,, +10.0058593750,160,1.2123292897,0.9987029831,0.6446936751,,, +10.0078125000,160,1.2092774853,0.9987029831,0.9819180591,,, +10.0097656250,160,1.2062256809,0.9987029831,0.5821316854,,, +10.0117187500,160,1.2031738766,0.9987029831,0.5668726635,,, +10.0136718750,160,1.2001220722,0.9987029831,0.4692149233,,, +10.0156250000,160,1.1985961700,0.9987029831,0.9330891890,,, +10.0175781250,160,1.1955443656,0.9987029831,0.9346150912,,, +10.0195312500,160,1.1924925612,0.9987029831,0.4402227817,,, +10.0214843750,160,1.1894407568,0.9987029831,0.1121538109,,, +10.0234375000,160,1.1863889525,0.9987029831,0.1823453117,,, +10.0253906250,160,1.1848630503,0.9987029831,0.3105210956,,, +10.0273437500,160,1.1818112459,0.9987029831,0.0907911803,,, +10.0292968750,160,1.1787594415,0.9987029831,0.3028915846,,, +10.0312500000,160,1.1757076371,0.9987029831,0.8857862211,,, +10.0332031250,160,1.1726558328,0.9987029831,0.0556954299,,, +10.0351562500,160,1.1696040284,0.9987029831,0.4615854124,,, +10.0371093750,160,1.1680781262,0.9987029831,0.6721599145,,, +10.0390625000,160,1.1650263218,0.9987029831,0.5363546197,,, +10.0410156250,160,1.1619745174,0.9987029831,0.6614785992,,, +10.0429687500,160,1.1589227131,0.9987029831,0.4341191730,,, +10.0449218750,160,1.1558709087,0.9987029831,0.4905775540,,, +10.0468750000,160,1.1528191043,0.9987029831,0.8720531014,,, +10.0488281250,160,1.1512932021,0.9987029831,0.7957579919,,, +10.0507812500,160,1.1482413977,0.9987029831,0.9773403525,,, +10.0527343750,160,1.1451895933,0.9987029831,0.0312809949,,, +10.0546875000,160,1.1421377890,0.9987029831,0.5546654459,,, +10.0566406250,160,1.1390859846,0.9987029831,0.1380941482,,, +10.0585937500,160,1.1360341802,0.9987029831,0.2021820401,,, +10.0605468750,160,1.1345082780,0.9987029831,0.3303578241,,, +10.0625000000,161,1.1314564736,0.9987029831,0.2616922255,,, +10.0644531250,161,1.1284046693,0.9987029831,0.1625085832,,, +10.0664062500,161,1.1253528649,0.9987029831,0.0541695277,,, +10.0683593750,161,1.1223010605,0.9987029831,0.7225146868,,, +10.0703125000,161,1.1192492561,0.9987029831,0.8018616007,,, +10.0722656250,161,1.1177233539,0.9987029831,0.1426718547,,, +10.0742187500,161,1.1146715496,0.9987029831,0.0785839628,,, +10.0761718750,161,1.1116197452,0.9987029831,0.7682917525,,, +10.0781250000,161,1.1085679408,0.9987029831,0.1945525292,,, +10.0800781250,161,1.1055161364,0.9987029831,0.5363546197,,, +10.0820312500,161,1.1024643320,0.9987029831,0.5378805219,,, +10.0839843750,161,1.1009384298,0.9987029831,0.4600595102,,, +10.0859375000,161,1.0978866255,0.9987029831,0.1121538109,,, +10.0878906250,161,1.0948348211,0.9987029831,0.1594567788,,, +10.0898437500,161,1.0917830167,0.9987029831,0.5867093919,,, +10.0917968750,161,1.0887312123,0.9987029831,0.0205996796,,, +10.0937500000,161,1.0856794079,0.9987029831,0.8186465248,,, +10.0957031250,161,1.0826276036,0.9987029831,0.3379873350,,, +10.0976562500,161,1.0811017014,0.9987029831,0.7011520562,,, +10.0996093750,161,1.0780498970,0.9987029831,0.4173342489,,, +10.1015625000,161,1.0749980926,0.9987029831,0.0465400168,,, +10.1035156250,161,1.0719462882,0.9987029831,0.7911802853,,, +10.1054687500,161,1.0688944839,0.9987029831,0.4859998474,,, +10.1074218750,161,1.0658426795,0.9987029831,0.8171206226,,, +10.1093750000,161,1.0643167773,0.9987029831,0.7072556649,,, +10.1113281250,161,1.0612649729,0.9987029831,0.7469291218,,, +10.1132812500,161,1.0582131685,0.9987029831,0.2540627146,,, +10.1152343750,161,1.0551613642,0.9987029831,0.7011520562,,, +10.1171875000,161,1.0521095598,0.9987029831,0.8308537423,,, +10.1191406250,161,1.0490577554,0.9987029831,0.6218051423,,, +10.1210937500,161,1.0460059510,0.9987029831,0.2265964752,,, +10.1230468750,161,1.0444800488,0.9987029831,0.5134660868,,, +10.1250000000,162,1.0414282444,0.9987029831,0.6416418708,,, +10.1269531250,162,1.0383764401,0.9987029831,0.3089951934,,, +10.1289062500,162,1.0353246357,0.9987029831,0.5256733043,,, +10.1308593750,162,1.0322728313,0.9987029831,0.2204928664,,, +10.1328125000,162,1.0292210269,0.9987029831,0.3044174868,,, +10.1347656250,162,1.0261692226,0.9987029831,0.1487754635,,, +10.1367187500,162,1.0246433204,0.9987029831,0.3059433890,,, +10.1386718750,162,1.0215915160,0.9987029831,0.3013656825,,, +10.1406250000,162,1.0185397116,0.9987029831,0.4600595102,,, +10.1425781250,162,1.0154879072,0.9987029831,0.8735790036,,, +10.1445312500,162,1.0124361028,0.9987029831,0.3410391394,,, +10.1464843750,162,1.0093842985,0.9987029831,0.5333028153,,, +10.1484375000,162,1.0063324941,0.9987029831,0.3822384985,,, +10.1503906250,162,1.0048065919,0.9987029831,0.0846875715,,, +10.1523437500,162,1.0017547875,0.9987029831,0.0633249409,,, +10.1542968750,162,0.9987029831,-0.0007629511,0.0175478752,,, +10.1562500000,162,0.9956511788,-0.0007629511,0.4234378576,,, +10.1582031250,162,0.9925993744,-0.0007629511,0.7576104372,,, +10.1601562500,162,0.9895475700,-0.0007629511,0.2693217365,,, +10.1621093750,162,0.9880216678,-0.0007629511,0.3547722591,,, +10.1640625000,162,0.9849698634,-0.0007629511,0.5928130007,,, +10.1660156250,162,0.9819180591,-0.0007629511,0.4753185321,,, +10.1679687500,162,0.9788662547,-0.0007629511,0.8049134051,,, +10.1699218750,162,0.9758144503,-0.0007629511,0.9254596780,,, +10.1718750000,162,0.9727626459,-0.0007629511,0.9452964065,,, +10.1738281250,162,0.9697108415,-0.0007629511,0.2601663233,,, +10.1757812500,162,0.9681849393,-0.0007629511,0.3868162051,,, +10.1777343750,162,0.9651331350,-0.0007629511,0.6553749905,,, +10.1796875000,162,0.9620813306,-0.0007629511,0.7545586328,,, +10.1816406250,162,0.9590295262,-0.0007629511,0.0053406577,,, +10.1835937500,162,0.9559777218,-0.0007629511,0.4585336080,,, +10.1855468750,162,0.9529259174,-0.0007629511,0.3059433890,,, +10.1875000000,163,0.9498741131,-0.0007629511,0.0999465934,,, +10.1894531250,163,0.9483482109,-0.0007629511,0.0648508431,,, +10.1914062500,163,0.9452964065,-0.0007629511,0.4615854124,,, +10.1933593750,163,0.9422446021,-0.0007629511,0.6706340124,,, +10.1953125000,163,0.9391927977,-0.0007629511,0.3181506065,,, +10.1972656250,163,0.9361409934,-0.0007629511,0.4020752270,,, +10.1992187500,163,0.9330891890,-0.0007629511,0.3837644007,,, +10.2011718750,163,0.9300373846,-0.0007629511,0.4463263905,,, +10.2031250000,163,0.9285114824,-0.0007629511,0.6202792401,,, +10.2050781250,163,0.9254596780,-0.0007629511,0.2494850080,,, +10.2070312500,163,0.9224078737,-0.0007629511,0.0083924620,,, +10.2089843750,163,0.9193560693,-0.0007629511,0.0968947890,,, +10.2109375000,163,0.9163042649,-0.0007629511,0.5653467613,,, +10.2128906250,163,0.9132524605,-0.0007629511,0.6141756313,,, +10.2148437500,163,0.9117265583,-0.0007629511,0.1441977569,,, +10.2167968750,163,0.9086747539,-0.0007629511,0.4615854124,,, +10.2187500000,163,0.9056229496,-0.0007629511,0.0099183642,,, +10.2207031250,163,0.9025711452,-0.0007629511,0.8827344167,,, +10.2226562500,163,0.8995193408,-0.0007629511,0.6691081102,,, +10.2246093750,163,0.8964675364,-0.0007629511,0.3303578241,,, +10.2265625000,163,0.8934157321,-0.0007629511,0.2189669642,,, +10.2285156250,163,0.8918898299,-0.0007629511,0.8842603189,,, +10.2304687500,163,0.8888380255,-0.0007629511,0.0236514839,,, +10.2324218750,163,0.8857862211,-0.0007629511,0.6981002518,,, +10.2343750000,163,0.8827344167,-0.0007629511,0.5760280766,,, +10.2363281250,163,0.8796826123,-0.0007629511,0.3181506065,,, +10.2382812500,163,0.8766308080,-0.0007629511,0.6111238270,,, +10.2402343750,163,0.8751049058,-0.0007629511,0.1121538109,,, +10.2421875000,163,0.8720531014,-0.0007629511,0.7194628824,,, +10.2441406250,163,0.8690012970,-0.0007629511,0.0511177234,,, +10.2460937500,163,0.8659494926,-0.0007629511,0.9544518196,,, +10.2480468750,163,0.8628976883,-0.0007629511,0.2311741817,,, +10.2500000000,164,0.8598458839,-0.0007629511,0.5165178912,,, +10.2519531250,164,0.8583199817,-0.0007629511,0.8476386664,,, +10.2539062500,164,0.8552681773,-0.0007629511,0.8598458839,,, +10.2558593750,164,0.8522163729,-0.0007629511,0.2296482795,,, +10.2578125000,164,0.8491645686,-0.0007629511,0.0907911803,,, +10.2597656250,164,0.8461127642,-0.0007629511,0.8476386664,,, +10.2617187500,164,0.8430609598,-0.0007629511,0.8842603189,,, +10.2636718750,164,0.8415350576,-0.0007629511,0.9971770809,,, +10.2656250000,164,0.8384832532,-0.0007629511,0.2632181277,,, +10.2675781250,164,0.8354314488,-0.0007629511,0.4478522927,,, +10.2695312500,164,0.8323796445,-0.0007629511,0.8033875029,,, +10.2714843750,164,0.8293278401,-0.0007629511,0.2662699321,,, +10.2734375000,164,0.8262760357,-0.0007629511,0.4203860533,,, +10.2753906250,164,0.8247501335,-0.0007629511,0.2372777905,,, +10.2773437500,164,0.8216983291,-0.0007629511,0.6019684138,,, +10.2792968750,164,0.8186465248,-0.0007629511,0.2830548562,,, +10.2812500000,164,0.8155947204,-0.0007629511,0.1380941482,,, +10.2832031250,164,0.8125429160,-0.0007629511,0.6492713817,,, +10.2851562500,164,0.8094911116,-0.0007629511,0.8201724269,,, +10.2871093750,164,0.8079652094,-0.0007629511,0.2571145190,,, +10.2890625000,164,0.8049134051,-0.0007629511,0.8522163729,,, +10.2910156250,164,0.8018616007,-0.0007629511,0.2204928664,,, +10.2929687500,164,0.7988097963,-0.0007629511,0.6874189364,,, +10.2949218750,164,0.7957579919,-0.0007629511,0.9712367437,,, +10.2968750000,164,0.7942320897,-0.0007629511,0.6492713817,,, +10.2988281250,164,0.7911802853,-0.0007629511,0.9544518196,,, +10.3007812500,164,0.7881284810,-0.0007629511,0.3440909438,,, +10.3027343750,164,0.7850766766,-0.0007629511,0.6401159686,,, +10.3046875000,164,0.7820248722,-0.0007629511,0.2189669642,,, +10.3066406250,164,0.7789730678,-0.0007629511,0.2342259861,,, +10.3085937500,164,0.7774471656,-0.0007629511,0.9269855802,,, +10.3105468750,164,0.7743953613,-0.0007629511,0.1182574197,,, +10.3125000000,165,0.7713435569,-0.0007629511,0.1167315175,,, +10.3144531250,165,0.7682917525,-0.0007629511,0.5516136416,,, +10.3164062500,165,0.7652399481,-0.0007629511,0.1045243000,,, +10.3183593750,165,0.7637140459,-0.0007629511,0.3303578241,,, +10.3203125000,165,0.7606622416,-0.0007629511,0.5455100328,,, +10.3222656250,165,0.7576104372,-0.0007629511,0.6706340124,,, +10.3242187500,165,0.7545586328,-0.0007629511,0.9483482109,,, +10.3261718750,165,0.7515068284,-0.0007629511,0.0556954299,,, +10.3281250000,165,0.7499809262,-0.0007629511,0.2296482795,,, +10.3300781250,165,0.7469291218,-0.0007629511,0.6935225452,,, +10.3320312500,165,0.7438773175,-0.0007629511,0.3303578241,,, +10.3339843750,165,0.7408255131,-0.0007629511,0.7606622416,,, +10.3359375000,165,0.7377737087,-0.0007629511,0.2403295949,,, +10.3378906250,165,0.7362478065,-0.0007629511,0.2174410620,,, +10.3398437500,165,0.7331960021,-0.0007629511,0.5668726635,,, +10.3417968750,165,0.7301441978,-0.0007629511,0.2800030518,,, +10.3437500000,165,0.7270923934,-0.0007629511,0.4432745861,,, +10.3457031250,165,0.7255664912,-0.0007629511,0.7316700999,,, +10.3476562500,165,0.7225146868,-0.0007629511,0.0831616693,,, +10.3496093750,165,0.7194628824,-0.0007629511,0.9361409934,,, +10.3515625000,165,0.7164110780,-0.0007629511,0.7545586328,,, +10.3535156250,165,0.7133592737,-0.0007629511,0.2800030518,,, +10.3554687500,165,0.7118333715,-0.0007629511,0.1945525292,,, +10.3574218750,165,0.7087815671,-0.0007629511,0.2861066606,,, +10.3593750000,165,0.7057297627,-0.0007629511,0.6050202182,,, +10.3613281250,165,0.7026779583,-0.0007629511,0.5058365759,,, +10.3632812500,165,0.7011520562,-0.0007629511,0.0144960708,,, +10.3652343750,165,0.6981002518,-0.0007629511,0.3456168460,,, +10.3671875000,165,0.6950484474,-0.0007629511,0.2876325628,,, +10.3691406250,165,0.6919966430,-0.0007629511,0.9697108415,,, +10.3710937500,165,0.6904707408,-0.0007629511,0.4600595102,,, +10.3730468750,165,0.6874189364,-0.0007629511,0.5668726635,,, +10.3750000000,166,0.6843671321,-0.0007629511,0.7194628824,,, +10.3769531250,166,0.6813153277,-0.0007629511,0.7896543832,,, +10.3789062500,166,0.6782635233,-0.0007629511,0.5287251087,,, +10.3808593750,166,0.6767376211,-0.0007629511,0.8491645686,,, +10.3828125000,166,0.6736858167,-0.0007629511,0.8949416342,,, +10.3847656250,166,0.6706340124,-0.0007629511,0.8308537423,,, +10.3867187500,166,0.6675822080,-0.0007629511,0.9254596780,,, +10.3886718750,166,0.6660563058,-0.0007629511,0.7698176547,,, +10.3906250000,166,0.6630045014,-0.0007629511,0.9285114824,,, +10.3925781250,166,0.6599526970,-0.0007629511,0.0495918212,,, +10.3945312500,166,0.6569008927,-0.0007629511,0.4554818036,,, +10.3964843750,166,0.6553749905,-0.0007629511,0.9758144503,,, +10.3984375000,166,0.6523231861,-0.0007629511,0.7957579919,,, +10.4003906250,166,0.6492713817,-0.0007629511,0.4997329671,,, +10.4023437500,166,0.6477454795,-0.0007629511,0.4188601511,,, +10.4042968750,166,0.6446936751,-0.0007629511,0.1518272679,,, +10.4062500000,166,0.6416418708,-0.0007629511,0.8018616007,,, +10.4082031250,166,0.6385900664,-0.0007629511,0.2174410620,,, +10.4101562500,166,0.6370641642,-0.0007629511,0.4844739452,,, +10.4121093750,166,0.6340123598,-0.0007629511,0.9422446021,,, +10.4140625000,166,0.6309605554,-0.0007629511,0.6950484474,,, +10.4160156250,166,0.6279087510,-0.0007629511,0.0617990387,,, +10.4179687500,166,0.6263828489,-0.0007629511,0.9834439612,,, +10.4199218750,166,0.6233310445,-0.0007629511,0.8445868620,,, +10.4218750000,166,0.6202792401,-0.0007629511,0.3898680095,,, +10.4238281250,166,0.6187533379,-0.0007629511,0.1884489204,,, +10.4257812500,166,0.6157015335,-0.0007629511,0.4081788357,,, +10.4277343750,166,0.6126497292,-0.0007629511,0.4463263905,,, +10.4296875000,166,0.6095979248,-0.0007629511,0.1579308766,,, +10.4316406250,166,0.6080720226,-0.0007629511,0.9849698634,,, +10.4335937500,166,0.6050202182,-0.0007629511,0.6874189364,,, +10.4355468750,166,0.6019684138,-0.0007629511,0.2815289540,,, +10.4375000000,167,0.6004425116,-0.0007629511,0.1808194095,,, +10.4394531250,167,0.5973907073,-0.0007629511,0.8567940795,,, +10.4414062500,167,0.5943389029,-0.0007629511,0.7164110780,,, +10.4433593750,167,0.5928130007,-0.0007629511,0.3639276722,,, +10.4453125000,167,0.5897611963,-0.0007629511,0.0205996796,,, +10.4472656250,167,0.5867093919,-0.0007629511,0.5973907073,,, +10.4492187500,167,0.5836575875,-0.0007629511,0.3761348898,,, +10.4511718750,167,0.5821316854,-0.0007629511,0.2357518883,,, +10.4531250000,167,0.5790798810,-0.0007629511,0.3822384985,,, +10.4550781250,167,0.5760280766,-0.0007629511,0.5897611963,,, +10.4570312500,167,0.5745021744,-0.0007629511,0.7103074693,,, +10.4589843750,167,0.5714503700,-0.0007629511,0.8110170138,,, +10.4609375000,167,0.5683985657,-0.0007629511,0.6858930343,,, +10.4628906250,167,0.5668726635,-0.0007629511,0.9971770809,,, +10.4648437500,167,0.5638208591,-0.0007629511,0.4600595102,,, +10.4667968750,167,0.5607690547,-0.0007629511,0.2861066606,,, +10.4687500000,167,0.5592431525,-0.0007629511,0.0160219730,,, +10.4707031250,167,0.5561913481,-0.0007629511,0.8262760357,,, +10.4726562500,167,0.5531395438,-0.0007629511,0.5806057832,,, +10.4746093750,167,0.5516136416,-0.0007629511,0.1762417029,,, +10.4765625000,167,0.5485618372,-0.0007629511,0.5271992065,,, +10.4785156250,167,0.5455100328,-0.0007629511,0.6294346532,,, +10.4804687500,167,0.5439841306,-0.0007629511,0.8812085145,,, +10.4824218750,167,0.5409323262,-0.0007629511,0.8690012970,,, +10.4843750000,167,0.5378805219,-0.0007629511,0.6340123598,,, +10.4863281250,167,0.5363546197,-0.0007629511,0.0526436255,,, +10.4882812500,167,0.5333028153,-0.0007629511,0.1029983978,,, +10.4902343750,167,0.5317769131,-0.0007629511,0.0556954299,,, +10.4921875000,167,0.5287251087,-0.0007629511,0.5638208591,,, +10.4941406250,167,0.5256733043,-0.0007629511,0.0450141146,,, +10.4960937500,167,0.5241474022,-0.0007629511,0.6019684138,,, +10.4980468750,167,0.5210955978,-0.0007629511,0.6294346532,,, +10.5000000000,168,0.5180437934,-0.0007629511,0.8384832532,,, +10.5019531250,168,0.5165178912,-0.0007629511,0.8522163729,,, +10.5039062500,168,0.5134660868,-0.0007629511,0.7225146868,,, +10.5058593750,168,0.5104142824,-0.0007629511,0.3608758679,,, +10.5078125000,168,0.5088883803,-0.0007629511,0.7301441978,,, +10.5097656250,168,0.5058365759,-0.0007629511,0.4692149233,,, +10.5117187500,168,0.5043106737,-0.0007629511,0.0343327993,,, +10.5136718750,168,0.5012588693,-0.0007629511,0.9193560693,,, +10.5156250000,168,0.4982070649,-0.0007629511,0.2388036927,,, +10.5175781250,168,0.4966811627,-0.0007629511,0.8186465248,,, +10.5195312500,168,0.4936293584,-0.0007629511,0.6034943160,,, +10.5214843750,168,0.4921034562,-0.0007629511,0.5958648051,,, +10.5234375000,168,0.4890516518,-0.0007629511,0.3257801175,,, +10.5253906250,168,0.4859998474,-0.0007629511,0.1548790723,,, +10.5273437500,168,0.4844739452,-0.0007629511,0.9224078737,,, +10.5292968750,168,0.4814221408,-0.0007629511,0.2845807584,,, +10.5312500000,168,0.4798962387,-0.0007629511,0.6279087510,,, +10.5332031250,168,0.4768444343,-0.0007629511,0.0297550927,,, +10.5351562500,168,0.4753185321,-0.0007629511,0.0679026474,,, +10.5371093750,168,0.4722667277,-0.0007629511,0.8964675364,,, +10.5390625000,168,0.4692149233,-0.0007629511,0.8796826123,,, +10.5410156250,168,0.4676890211,-0.0007629511,0.9193560693,,, +10.5429687500,168,0.4646372168,-0.0007629511,0.3074692912,,, +10.5449218750,168,0.4631113146,-0.0007629511,0.3746089876,,, +10.5468750000,168,0.4600595102,-0.0007629511,0.6874189364,,, +10.5488281250,168,0.4585336080,-0.0007629511,0.5745021744,,, +10.5507812500,168,0.4554818036,-0.0007629511,0.8018616007,,, +10.5527343750,168,0.4524299992,-0.0007629511,0.3517204547,,, +10.5546875000,168,0.4509040970,-0.0007629511,0.4921034562,,, +10.5566406250,168,0.4478522927,-0.0007629511,0.3532463569,,, +10.5585937500,168,0.4463263905,-0.0007629511,0.6034943160,,, +10.5605468750,168,0.4432745861,-0.0007629511,0.3761348898,,, +10.5625000000,169,0.4417486839,-0.0007629511,0.1213092241,,, +10.5644531250,169,0.4386968795,-0.0007629511,0.2922102693,,, +10.5664062500,169,0.4371709773,-0.0007629511,0.0724803540,,, +10.5683593750,169,0.4341191730,-0.0007629511,0.3639276722,,, +10.5703125000,169,0.4325932708,-0.0007629511,0.0251773861,,, +10.5722656250,169,0.4295414664,-0.0007629511,0.0785839628,,, +10.5742187500,169,0.4280155642,-0.0007629511,0.3685053788,,, +10.5761718750,169,0.4249637598,-0.0007629511,0.4295414664,,, +10.5781250000,169,0.4219119554,-0.0007629511,0.2494850080,,, +10.5800781250,169,0.4203860533,-0.0007629511,0.4707408255,,, +10.5820312500,169,0.4173342489,-0.0007629511,0.4905775540,,, +10.5839843750,169,0.4158083467,-0.0007629511,0.3944457160,,, +10.5859375000,169,0.4127565423,-0.0007629511,0.3608758679,,, +10.5878906250,169,0.4112306401,-0.0007629511,0.2800030518,,, +10.5898437500,169,0.4081788357,-0.0007629511,0.4707408255,,, +10.5917968750,169,0.4066529335,-0.0007629511,0.7957579919,,, +10.5937500000,169,0.4036011292,-0.0007629511,0.3593499657,,, +10.5957031250,169,0.4020752270,-0.0007629511,0.6126497292,,, +10.5976562500,169,0.3990234226,-0.0007629511,0.5333028153,,, +10.5996093750,169,0.3974975204,-0.0007629511,0.1121538109,,, +10.6015625000,169,0.3959716182,-0.0007629511,0.0312809949,,, +10.6035156250,169,0.3929198138,-0.0007629511,0.7576104372,,, +10.6054687500,169,0.3913939117,-0.0007629511,0.6736858167,,, +10.6074218750,169,0.3883421073,-0.0007629511,0.8766308080,,, +10.6093750000,169,0.3868162051,-0.0007629511,0.9849698634,,, +10.6113281250,169,0.3837644007,-0.0007629511,0.0099183642,,, +10.6132812500,169,0.3822384985,-0.0007629511,0.8278019379,,, +10.6152343750,169,0.3791866941,-0.0007629511,0.9071488518,,, +10.6171875000,169,0.3776607919,-0.0007629511,0.2647440299,,, +10.6191406250,169,0.3746089876,-0.0007629511,0.9941252766,,, +10.6210937500,169,0.3730830854,-0.0007629511,0.7530327306,,, +10.6230468750,169,0.3700312810,-0.0007629511,0.7850766766,,, +10.6250000000,170,0.3685053788,-0.0007629511,0.7408255131,,, +10.6269531250,170,0.3669794766,-0.0007629511,0.8918898299,,, +10.6289062500,170,0.3639276722,-0.0007629511,0.4570077058,,, +10.6308593750,170,0.3624017700,-0.0007629511,0.0373846036,,, +10.6328125000,170,0.3593499657,-0.0007629511,0.3212024109,,, +10.6347656250,170,0.3578240635,-0.0007629511,0.7103074693,,, +10.6367187500,170,0.3547722591,-0.0007629511,0.1884489204,,, +10.6386718750,170,0.3532463569,-0.0007629511,0.7484550240,,, +10.6406250000,170,0.3517204547,-0.0007629511,0.0816357671,,, +10.6425781250,170,0.3486686503,-0.0007629511,0.5729762722,,, +10.6445312500,170,0.3471427481,-0.0007629511,0.9346150912,,, +10.6464843750,170,0.3440909438,-0.0007629511,0.6828412299,,, +10.6484375000,170,0.3425650416,-0.0007629511,0.4173342489,,, +10.6503906250,170,0.3410391394,-0.0007629511,0.7820248722,,, +10.6523437500,170,0.3379873350,-0.0007629511,0.8827344167,,, +10.6542968750,170,0.3364614328,-0.0007629511,0.7759212634,,, +10.6562500000,170,0.3334096284,-0.0007629511,0.4432745861,,, +10.6582031250,170,0.3318837263,-0.0007629511,0.8354314488,,, +10.6601562500,170,0.3303578241,-0.0007629511,0.1029983978,,, +10.6621093750,170,0.3273060197,-0.0007629511,0.6340123598,,, +10.6640625000,170,0.3257801175,-0.0007629511,0.2784771496,,, +10.6660156250,170,0.3242542153,-0.0007629511,0.0190737774,,, +10.6679687500,170,0.3212024109,-0.0007629511,0.5088883803,,, +10.6699218750,170,0.3196765087,-0.0007629511,0.9636072328,,, +10.6718750000,170,0.3166247044,-0.0007629511,0.3425650416,,, +10.6738281250,170,0.3150988022,-0.0007629511,0.3181506065,,, +10.6757812500,170,0.3135729000,-0.0007629511,0.3715571832,,, +10.6777343750,170,0.3105210956,-0.0007629511,0.8018616007,,, +10.6796875000,170,0.3089951934,-0.0007629511,0.0694285496,,, +10.6816406250,170,0.3074692912,-0.0007629511,0.9925993744,,, +10.6835937500,170,0.3044174868,-0.0007629511,0.6111238270,,, +10.6855468750,170,0.3028915846,-0.0007629511,0.6782635233,,, +10.6875000000,171,0.3013656825,-0.0007629511,0.0450141146,,, +10.6894531250,171,0.2983138781,-0.0007629511,0.6675822080,,, +10.6914062500,171,0.2967879759,-0.0007629511,0.6446936751,,, +10.6933593750,171,0.2952620737,-0.0007629511,0.4646372168,,, +10.6953125000,171,0.2922102693,-0.0007629511,0.4692149233,,, +10.6972656250,171,0.2906843671,-0.0007629511,0.8003356985,,, +10.6992187500,171,0.2891584649,-0.0007629511,0.6446936751,,, +10.7011718750,171,0.2876325628,-0.0007629511,0.2098115511,,, +10.7031250000,171,0.2845807584,-0.0007629511,0.9849698634,,, +10.7050781250,171,0.2830548562,-0.0007629511,0.5348287175,,, +10.7070312500,171,0.2815289540,-0.0007629511,0.3166247044,,, +10.7089843750,171,0.2784771496,-0.0007629511,0.1365682460,,, +10.7109375000,171,0.2769512474,-0.0007629511,0.7637140459,,, +10.7128906250,171,0.2754253452,-0.0007629511,0.1731898985,,, +10.7148437500,171,0.2738994430,-0.0007629511,0.8339055467,,, +10.7167968750,171,0.2708476387,-0.0007629511,0.4921034562,,, +10.7187500000,171,0.2693217365,-0.0007629511,0.1014724956,,, +10.7207031250,171,0.2677958343,-0.0007629511,0.3639276722,,, +10.7226562500,171,0.2647440299,-0.0007629511,0.8094911116,,, +10.7246093750,171,0.2632181277,-0.0007629511,0.6553749905,,, +10.7265625000,171,0.2616922255,-0.0007629511,0.3700312810,,, +10.7285156250,171,0.2601663233,-0.0007629511,0.9452964065,,, +10.7304687500,171,0.2571145190,-0.0007629511,0.5149919890,,, +10.7324218750,171,0.2555886168,-0.0007629511,0.4661631189,,, +10.7343750000,171,0.2540627146,-0.0007629511,0.3196765087,,, +10.7363281250,171,0.2525368124,-0.0007629511,0.2800030518,,, +10.7382812500,171,0.2494850080,-0.0007629511,0.7759212634,,, +10.7402343750,171,0.2479591058,-0.0007629511,0.1579308766,,, +10.7421875000,171,0.2464332036,-0.0007629511,0.1289387350,,, +10.7441406250,171,0.2449073014,-0.0007629511,0.7087815671,,, +10.7460937500,171,0.2433813993,-0.0007629511,0.8705271992,,, +10.7480468750,171,0.2403295949,-0.0007629511,0.1106279088,,, +10.7500000000,172,0.2388036927,-0.0007629511,0.9605554284,,, +10.7519531250,172,0.2372777905,-0.0007629511,0.6141756313,,, +10.7539062500,172,0.2357518883,-0.0007629511,0.8461127642,,, +10.7558593750,172,0.2342259861,-0.0007629511,0.6034943160,,, +10.7578125000,172,0.2311741817,-0.0007629511,0.4005493248,,, +10.7597656250,172,0.2296482795,-0.0007629511,0.8354314488,,, +10.7617187500,172,0.2281223774,-0.0007629511,0.3776607919,,, +10.7636718750,172,0.2265964752,-0.0007629511,0.9544518196,,, +10.7656250000,172,0.2250705730,-0.0007629511,0.7713435569,,, +10.7675781250,172,0.2235446708,-0.0007629511,0.0099183642,,, +10.7695312500,172,0.2204928664,-0.0007629511,0.7743953613,,, +10.7714843750,172,0.2189669642,-0.0007629511,0.4661631189,,, +10.7734375000,172,0.2174410620,-0.0007629511,0.1960784314,,, +10.7753906250,172,0.2159151598,-0.0007629511,0.6843671321,,, +10.7773437500,172,0.2143892576,-0.0007629511,0.1731898985,,, +10.7792968750,172,0.2128633555,-0.0007629511,0.9544518196,,, +10.7812500000,172,0.2098115511,-0.0007629511,0.4631113146,,, +10.7832031250,172,0.2082856489,-0.0007629511,0.4142824445,,, +10.7851562500,172,0.2067597467,-0.0007629511,0.2555886168,,, +10.7871093750,172,0.2052338445,-0.0007629511,0.1731898985,,, +10.7890625000,172,0.2037079423,-0.0007629511,0.1365682460,,, +10.7910156250,172,0.2021820401,-0.0007629511,0.4676890211,,, +10.7929687500,172,0.2006561379,-0.0007629511,0.2616922255,,, +10.7949218750,172,0.1991302358,-0.0007629511,0.7225146868,,, +10.7968750000,172,0.1960784314,-0.0007629511,0.0312809949,,, +10.7988281250,172,0.1945525292,-0.0007629511,0.4692149233,,, +10.8007812500,172,0.1930266270,-0.0007629511,0.5577172503,,, +10.8027343750,172,0.1915007248,-0.0007629511,0.2601663233,,, +10.8046875000,172,0.1899748226,-0.0007629511,0.0633249409,,, +10.8066406250,172,0.1884489204,-0.0007629511,0.8995193408,,, +10.8085937500,172,0.1869230182,-0.0007629511,0.4097047379,,, +10.8105468750,172,0.1853971160,-0.0007629511,0.4066529335,,, +10.8125000000,173,0.1838712139,-0.0007629511,0.5546654459,,, +10.8144531250,173,0.1823453117,-0.0007629511,0.6462195773,,, +10.8164062500,173,0.1808194095,-0.0007629511,0.6614785992,,, +10.8183593750,173,0.1792935073,-0.0007629511,0.6202792401,,, +10.8203125000,173,0.1762417029,-0.0007629511,0.7026779583,,, +10.8222656250,173,0.1747158007,-0.0007629511,0.2128633555,,, +10.8242187500,173,0.1731898985,-0.0007629511,0.7957579919,,, +10.8261718750,173,0.1716639963,-0.0007629511,0.2937361715,,, +10.8281250000,173,0.1701380941,-0.0007629511,0.8323796445,,, +10.8300781250,173,0.1686121920,-0.0007629511,0.8278019379,,, +10.8320312500,173,0.1670862898,-0.0007629511,0.3486686503,,, +10.8339843750,173,0.1655603876,-0.0007629511,0.8400091554,,, +10.8359375000,173,0.1640344854,-0.0007629511,0.0450141146,,, +10.8378906250,173,0.1625085832,-0.0007629511,0.1075761044,,, +10.8398437500,173,0.1609826810,-0.0007629511,0.2464332036,,, +10.8417968750,173,0.1594567788,-0.0007629511,0.5500877394,,, +10.8437500000,173,0.1579308766,-0.0007629511,0.4386968795,,, +10.8457031250,173,0.1564049744,-0.0007629511,0.9422446021,,, +10.8476562500,173,0.1548790723,-0.0007629511,0.7240405890,,, +10.8496093750,173,0.1533531701,-0.0007629511,0.9208819715,,, +10.8515625000,173,0.1518272679,-0.0007629511,0.6752117189,,, +10.8535156250,173,0.1503013657,-0.0007629511,0.1243610285,,, +10.8554687500,173,0.1487754635,-0.0007629511,0.9819180591,,, +10.8574218750,173,0.1472495613,-0.0007629511,0.8155947204,,, +10.8593750000,173,0.1457236591,-0.0007629511,0.9193560693,,, +10.8613281250,173,0.1441977569,-0.0007629511,0.4524299992,,, +10.8632812500,173,0.1426718547,-0.0007629511,0.8415350576,,, +10.8652343750,173,0.1411459525,-0.0007629511,0.0831616693,,, +10.8671875000,173,0.1396200504,-0.0007629511,0.8293278401,,, +10.8691406250,173,0.1380941482,-0.0007629511,0.4356450752,,, +10.8710937500,173,0.1380941482,-0.0007629511,0.0312809949,,, +10.8730468750,173,0.1365682460,-0.0007629511,0.5729762722,,, +10.8750000000,174,0.1350423438,-0.0007629511,0.0740062562,,, +10.8769531250,174,0.1335164416,-0.0007629511,0.8293278401,,, +10.8789062500,174,0.1319905394,-0.0007629511,0.6385900664,,, +10.8808593750,174,0.1304646372,-0.0007629511,0.1258869306,,, +10.8828125000,174,0.1289387350,-0.0007629511,0.3700312810,,, +10.8847656250,174,0.1274128328,-0.0007629511,0.7682917525,,, +10.8867187500,174,0.1258869306,-0.0007629511,0.9849698634,,, +10.8886718750,174,0.1243610285,-0.0007629511,0.3471427481,,, +10.8906250000,174,0.1228351263,-0.0007629511,0.7576104372,,, +10.8925781250,174,0.1213092241,-0.0007629511,0.1594567788,,, +10.8945312500,174,0.1213092241,-0.0007629511,0.4112306401,,, +10.8964843750,174,0.1197833219,-0.0007629511,0.8430609598,,, +10.8984375000,174,0.1182574197,-0.0007629511,0.6126497292,,, +10.9003906250,174,0.1167315175,-0.0007629511,0.1029983978,,, +10.9023437500,174,0.1152056153,-0.0007629511,0.3654535744,,, +10.9042968750,174,0.1136797131,-0.0007629511,0.0297550927,,, +10.9062500000,174,0.1121538109,-0.0007629511,0.6782635233,,, +10.9082031250,174,0.1106279088,-0.0007629511,0.2494850080,,, +10.9101562500,174,0.1106279088,-0.0007629511,0.4692149233,,, +10.9121093750,174,0.1091020066,-0.0007629511,0.7591363394,,, +10.9140625000,174,0.1075761044,-0.0007629511,0.0419623102,,, +10.9160156250,174,0.1060502022,-0.0007629511,0.1319905394,,, +10.9179687500,174,0.1045243000,-0.0007629511,0.8979934386,,, +10.9199218750,174,0.1029983978,-0.0007629511,0.3257801175,,, +10.9218750000,174,0.1029983978,-0.0007629511,0.8705271992,,, +10.9238281250,174,0.1014724956,-0.0007629511,0.7637140459,,, +10.9257812500,174,0.0999465934,-0.0007629511,0.8903639277,,, +10.9277343750,174,0.0984206912,-0.0007629511,0.0038147555,,, +10.9296875000,174,0.0968947890,-0.0007629511,0.7164110780,,, +10.9316406250,174,0.0968947890,-0.0007629511,0.6981002518,,, +10.9335937500,174,0.0953688869,-0.0007629511,0.7743953613,,, +10.9355468750,174,0.0938429847,-0.0007629511,0.9315632868,,, +10.9375000000,175,0.0923170825,-0.0007629511,0.7072556649,,, +10.9394531250,175,0.0907911803,-0.0007629511,0.3181506065,,, +10.9414062500,175,0.0907911803,-0.0007629511,0.8735790036,,, +10.9433593750,175,0.0892652781,-0.0007629511,0.7042038605,,, +10.9453125000,175,0.0877393759,-0.0007629511,0.1823453117,,, +10.9472656250,175,0.0862134737,-0.0007629511,0.8735790036,,, +10.9492187500,175,0.0862134737,-0.0007629511,0.2189669642,,, +10.9511718750,175,0.0846875715,-0.0007629511,0.0404364080,,, +10.9531250000,175,0.0831616693,-0.0007629511,0.2082856489,,, +10.9550781250,175,0.0816357671,-0.0007629511,0.5043106737,,, +10.9570312500,175,0.0816357671,-0.0007629511,0.9315632868,,, +10.9589843750,175,0.0801098650,-0.0007629511,0.7026779583,,, +10.9609375000,175,0.0785839628,-0.0007629511,0.6874189364,,, +10.9628906250,175,0.0770580606,-0.0007629511,0.5104142824,,, +10.9648437500,175,0.0770580606,-0.0007629511,0.6111238270,,, +10.9667968750,175,0.0755321584,-0.0007629511,0.2403295949,,, +10.9687500000,175,0.0740062562,-0.0007629511,0.6523231861,,, +10.9707031250,175,0.0740062562,-0.0007629511,0.9376668956,,, +10.9726562500,175,0.0724803540,-0.0007629511,0.9971770809,,, +10.9746093750,175,0.0709544518,-0.0007629511,0.4203860533,,, +10.9765625000,175,0.0709544518,-0.0007629511,0.7179369802,,, +10.9785156250,175,0.0694285496,-0.0007629511,0.0251773861,,, +10.9804687500,175,0.0679026474,-0.0007629511,0.9910734722,,, +10.9824218750,175,0.0663767453,-0.0007629511,0.1487754635,,, +10.9843750000,175,0.0663767453,-0.0007629511,0.9285114824,,, +10.9863281250,175,0.0648508431,-0.0007629511,0.7835507744,,, +10.9882812500,175,0.0633249409,-0.0007629511,0.9163042649,,, +10.9902343750,175,0.0633249409,-0.0007629511,0.6523231861,,, +10.9921875000,175,0.0617990387,-0.0007629511,0.4585336080,,, +10.9941406250,175,0.0617990387,-0.0007629511,0.5745021744,,, +10.9960937500,175,0.0602731365,-0.0007629511,0.4203860533,,, +10.9980468750,175,0.0587472343,-0.0007629511,0.8247501335,,, +11.0000000000,176,0.0587472343,-0.0007629511,0.1335164416,,, +11.0019531250,176,0.0572213321,-0.0007629511,0.9925993744,,, +11.0039062500,176,0.0556954299,-0.0007629511,0.5394064240,,, +11.0058593750,176,0.0556954299,-0.0007629511,0.1243610285,,, +11.0078125000,176,0.0541695277,-0.0007629511,0.3044174868,,, +11.0097656250,176,0.0541695277,-0.0007629511,0.6233310445,,, +11.0117187500,176,0.0526436255,-0.0007629511,0.9254596780,,, +11.0136718750,176,0.0511177234,-0.0007629511,0.5119401846,,, +11.0156250000,176,0.0511177234,-0.0007629511,0.7789730678,,, +11.0175781250,176,0.0495918212,-0.0007629511,0.0816357671,,, +11.0195312500,176,0.0495918212,-0.0007629511,0.5470359350,,, +11.0214843750,176,0.0480659190,-0.0007629511,0.5317769131,,, +11.0234375000,176,0.0465400168,-0.0007629511,0.3669794766,,, +11.0253906250,176,0.0465400168,-0.0007629511,0.3135729000,,, +11.0273437500,176,0.0450141146,-0.0007629511,0.3746089876,,, +11.0292968750,176,0.0450141146,-0.0007629511,0.2006561379,,, +11.0312500000,176,0.0434882124,-0.0007629511,0.7789730678,,, +11.0332031250,176,0.0434882124,-0.0007629511,0.6691081102,,, +11.0351562500,176,0.0419623102,-0.0007629511,0.0587472343,,, +11.0371093750,176,0.0419623102,-0.0007629511,0.2479591058,,, +11.0390625000,176,0.0404364080,-0.0007629511,0.2708476387,,, +11.0410156250,176,0.0404364080,-0.0007629511,0.3929198138,,, +11.0429687500,176,0.0389105058,-0.0007629511,0.7606622416,,, +11.0449218750,176,0.0389105058,-0.0007629511,0.8522163729,,, +11.0468750000,176,0.0373846036,-0.0007629511,0.4020752270,,, +11.0488281250,176,0.0373846036,-0.0007629511,0.5317769131,,, +11.0507812500,176,0.0358587015,-0.0007629511,0.0495918212,,, +11.0527343750,176,0.0358587015,-0.0007629511,0.8171206226,,, +11.0546875000,176,0.0343327993,-0.0007629511,0.5714503700,,, +11.0566406250,176,0.0343327993,-0.0007629511,0.7621881437,,, +11.0585937500,176,0.0328068971,-0.0007629511,0.1533531701,,, +11.0605468750,176,0.0328068971,-0.0007629511,0.0068665599,,, +11.0625000000,177,0.0312809949,-0.0007629511,0.4448004883,,, +11.0644531250,177,0.0312809949,-0.0007629511,0.1533531701,,, +11.0664062500,177,0.0297550927,-0.0007629511,0.2052338445,,, +11.0683593750,177,0.0297550927,-0.0007629511,0.4341191730,,, +11.0703125000,177,0.0282291905,-0.0007629511,0.3501945525,,, +11.0722656250,177,0.0282291905,-0.0007629511,0.1029983978,,, +11.0742187500,177,0.0267032883,-0.0007629511,0.2876325628,,, +11.0761718750,177,0.0267032883,-0.0007629511,0.2021820401,,, +11.0781250000,177,0.0267032883,-0.0007629511,0.6263828489,,, +11.0800781250,177,0.0251773861,-0.0007629511,0.1411459525,,, +11.0820312500,177,0.0251773861,-0.0007629511,0.0663767453,,, +11.0839843750,177,0.0236514839,-0.0007629511,0.4859998474,,, +11.0859375000,177,0.0236514839,-0.0007629511,0.3288319219,,, +11.0878906250,177,0.0221255818,-0.0007629511,0.4646372168,,, +11.0898437500,177,0.0221255818,-0.0007629511,0.1594567788,,, +11.0917968750,177,0.0221255818,-0.0007629511,0.7637140459,,, +11.0937500000,177,0.0205996796,-0.0007629511,0.1808194095,,, +11.0957031250,177,0.0205996796,-0.0007629511,0.0099183642,,, +11.0976562500,177,0.0205996796,-0.0007629511,0.6614785992,,, +11.0996093750,177,0.0190737774,-0.0007629511,0.9224078737,,, +11.1015625000,177,0.0190737774,-0.0007629511,0.4631113146,,, +11.1035156250,177,0.0175478752,-0.0007629511,0.2220187686,,, +11.1054687500,177,0.0175478752,-0.0007629511,0.0251773861,,, +11.1074218750,177,0.0175478752,-0.0007629511,0.2449073014,,, +11.1093750000,177,0.0160219730,-0.0007629511,0.1869230182,,, +11.1113281250,177,0.0160219730,-0.0007629511,0.9758144503,,, +11.1132812500,177,0.0160219730,-0.0007629511,0.0175478752,,, +11.1152343750,177,0.0144960708,-0.0007629511,0.9117265583,,, +11.1171875000,177,0.0144960708,-0.0007629511,0.5867093919,,, +11.1191406250,177,0.0144960708,-0.0007629511,0.6614785992,,, +11.1210937500,177,0.0129701686,-0.0007629511,0.4631113146,,, +11.1230468750,177,0.0129701686,-0.0007629511,0.8018616007,,, +11.1250000000,178,0.0129701686,-0.0007629511,0.6706340124,,, +11.1269531250,178,0.0114442664,-0.0007629511,0.8003356985,,, +11.1289062500,178,0.0114442664,-0.0007629511,0.3822384985,,, +11.1308593750,178,0.0114442664,-0.0007629511,0.0816357671,,, +11.1328125000,178,0.0114442664,-0.0007629511,0.9102006561,,, +11.1347656250,178,0.0099183642,-0.0007629511,0.4402227817,,, +11.1367187500,178,0.0099183642,-0.0007629511,0.8705271992,,, +11.1386718750,178,0.0099183642,-0.0007629511,0.4524299992,,, +11.1406250000,178,0.0099183642,-0.0007629511,0.2586404211,,, +11.1425781250,178,0.0083924620,-0.0007629511,0.9040970474,,, +11.1445312500,178,0.0083924620,-0.0007629511,0.0251773861,,, +11.1464843750,178,0.0083924620,-0.0007629511,0.4020752270,,, +11.1484375000,178,0.0083924620,-0.0007629511,0.5790798810,,, +11.1503906250,178,0.0068665599,-0.0007629511,0.9849698634,,, +11.1523437500,178,0.0068665599,-0.0007629511,0.4341191730,,, +11.1542968750,178,0.0068665599,-0.0007629511,0.8110170138,,, +11.1562500000,178,0.0068665599,-0.0007629511,0.0831616693,,, +11.1582031250,178,0.0053406577,-0.0007629511,0.0221255818,,, +11.1601562500,178,0.0053406577,-0.0007629511,0.6614785992,,, +11.1621093750,178,0.0053406577,-0.0007629511,0.0816357671,,, +11.1640625000,178,0.0053406577,-0.0007629511,0.9819180591,,, +11.1660156250,178,0.0053406577,-0.0007629511,0.5333028153,,, +11.1679687500,178,0.0038147555,-0.0007629511,0.7881284810,,, +11.1699218750,178,0.0038147555,-0.0007629511,0.5302510109,,, +11.1718750000,178,0.0038147555,-0.0007629511,0.1762417029,,, +11.1738281250,178,0.0038147555,-0.0007629511,0.8583199817,,, +11.1757812500,178,0.0038147555,-0.0007629511,0.9437705043,,, +11.1777343750,178,0.0038147555,-0.0007629511,0.8705271992,,, +11.1796875000,178,0.0022888533,-0.0007629511,0.6324864576,,, +11.1816406250,178,0.0022888533,-0.0007629511,0.6828412299,,, +11.1835937500,178,0.0022888533,-0.0007629511,0.5271992065,,, +11.1855468750,178,0.0022888533,-0.0007629511,0.0953688869,,, +11.1875000000,179,0.0022888533,-0.0007629511,0.2357518883,,, +11.1894531250,179,0.0022888533,-0.0007629511,0.2998397803,,, +11.1914062500,179,0.0022888533,-0.0007629511,0.3562981613,,, +11.1933593750,179,0.0007629511,-0.0007629511,0.7179369802,,, +11.1953125000,179,0.0007629511,-0.0007629511,0.6477454795,,, +11.1972656250,179,0.0007629511,-0.0007629511,0.3318837263,,, +11.1992187500,179,0.0007629511,-0.0007629511,0.2388036927,,, +11.2011718750,179,0.0007629511,-0.0007629511,0.5561913481,,, +11.2031250000,179,0.0007629511,-0.0007629511,0.2525368124,,, +11.2050781250,179,0.0007629511,-0.0007629511,0.6401159686,,, +11.2070312500,179,0.0007629511,-0.0007629511,0.9483482109,,, +11.2089843750,179,0.0007629511,-0.0007629511,0.6538490883,,, +11.2109375000,179,0.0007629511,-0.0007629511,0.5195696956,,, +11.2128906250,179,-0.0007629511,-0.0007629511,0.2021820401,,, +11.2148437500,179,-0.0007629511,-0.0007629511,0.1136797131,,, +11.2167968750,179,-0.0007629511,-0.0007629511,0.6782635233,,, +11.2187500000,179,-0.0007629511,-0.0007629511,0.2967879759,,, +11.2207031250,179,-0.0007629511,-0.0007629511,0.6263828489,,, +11.2226562500,179,-0.0007629511,-0.0007629511,0.1518272679,,, +11.2246093750,179,-0.0007629511,-0.0007629511,0.3074692912,,, +11.2265625000,179,-0.0007629511,-0.0007629511,0.8979934386,,, +11.2285156250,179,-0.0007629511,-0.0007629511,0.5729762722,,, +11.2304687500,179,-0.0007629511,-0.0007629511,0.8766308080,,, +11.2324218750,179,-0.0007629511,-0.0007629511,0.2922102693,,, +11.2343750000,179,-0.0007629511,-0.0007629511,0.0282291905,,, +11.2363281250,179,-0.0007629511,-0.0007629511,0.2845807584,,, +11.2382812500,179,-0.0007629511,-0.0007629511,0.7560845350,,, +11.2402343750,179,-0.0007629511,-0.0007629511,0.8781567102,,, +11.2421875000,179,-0.0007629511,-0.0007629511,0.0419623102,,, +11.2441406250,179,-0.0007629511,-0.0007629511,0.7362478065,,, +11.2460937500,179,-0.0007629511,-0.0007629511,0.1289387350,,, +11.2480468750,179,-0.0007629511,-0.0007629511,0.8583199817,,, +11.2500000000,180,-0.0007629511,-0.0007629511,0.2372777905,,, +11.2519531250,180,-0.0007629511,-0.0007629511,0.8262760357,,, +11.2539062500,180,-0.0007629511,-0.0007629511,0.8415350576,,, +11.2558593750,180,-0.0007629511,-0.0007629511,0.8522163729,,, +11.2578125000,180,-0.0007629511,-0.0007629511,0.4310673686,,, +11.2597656250,180,-0.0007629511,-0.0007629511,0.7377737087,,, +11.2617187500,180,-0.0007629511,-0.0007629511,0.3807125963,,, +11.2636718750,180,-0.0007629511,-0.0007629511,0.7682917525,,, +11.2656250000,180,0.0007629511,-0.0007629511,0.9849698634,,, +11.2675781250,180,0.0007629511,-0.0007629511,0.8140688182,,, +11.2695312500,180,0.0007629511,-0.0007629511,0.6630045014,,, +11.2714843750,180,0.0007629511,-0.0007629511,0.6019684138,,, +11.2734375000,180,0.0007629511,-0.0007629511,0.0251773861,,, +11.2753906250,180,0.0007629511,-0.0007629511,-0.0007629511,,, +11.2773437500,180,0.0007629511,-0.0007629511,0.7621881437,,, +11.2792968750,180,0.0007629511,-0.0007629511,0.3318837263,,, +11.2812500000,180,0.0007629511,-0.0007629511,0.2174410620,,, +11.2832031250,180,0.0007629511,-0.0007629511,0.7820248722,,, +11.2851562500,180,0.0022888533,-0.0007629511,0.1655603876,,, +11.2871093750,180,0.0022888533,-0.0007629511,0.4188601511,,, +11.2890625000,180,0.0022888533,-0.0007629511,0.8888380255,,, +11.2910156250,180,0.0022888533,-0.0007629511,0.4951552605,,, +11.2929687500,180,0.0022888533,-0.0007629511,0.3517204547,,, +11.2949218750,180,0.0022888533,-0.0007629511,0.6874189364,,, +11.2968750000,180,0.0022888533,-0.0007629511,0.5882352941,,, +11.2988281250,180,0.0038147555,-0.0007629511,0.9361409934,,, +11.3007812500,180,0.0038147555,-0.0007629511,0.4448004883,,, +11.3027343750,180,0.0038147555,-0.0007629511,0.3486686503,,, +11.3046875000,180,0.0038147555,-0.0007629511,0.6828412299,,, +11.3066406250,180,0.0038147555,-0.0007629511,0.2235446708,,, +11.3085937500,180,0.0038147555,-0.0007629511,0.7454032197,,, +11.3105468750,180,0.0053406577,-0.0007629511,0.9315632868,,, +11.3125000000,181,0.0053406577,-0.0007629511,0.6431677729,,, +11.3144531250,181,0.0053406577,-0.0007629511,0.1686121920,,, +11.3164062500,181,0.0053406577,-0.0007629511,0.7255664912,,, +11.3183593750,181,0.0053406577,-0.0007629511,0.7469291218,,, +11.3203125000,181,0.0068665599,-0.0007629511,0.3257801175,,, +11.3222656250,181,0.0068665599,-0.0007629511,0.5867093919,,, +11.3242187500,181,0.0068665599,-0.0007629511,0.5851834897,,, +11.3261718750,181,0.0068665599,-0.0007629511,0.9895475700,,, +11.3281250000,181,0.0083924620,-0.0007629511,0.9361409934,,, +11.3300781250,181,0.0083924620,-0.0007629511,0.2677958343,,, +11.3320312500,181,0.0083924620,-0.0007629511,0.3440909438,,, +11.3339843750,181,0.0083924620,-0.0007629511,0.2662699321,,, +11.3359375000,181,0.0099183642,-0.0007629511,0.7652399481,,, +11.3378906250,181,0.0099183642,-0.0007629511,0.5088883803,,, +11.3398437500,181,0.0099183642,-0.0007629511,0.8430609598,,, +11.3417968750,181,0.0099183642,-0.0007629511,0.6950484474,,, +11.3437500000,181,0.0114442664,-0.0007629511,0.1411459525,,, +11.3457031250,181,0.0114442664,-0.0007629511,0.5119401846,,, +11.3476562500,181,0.0114442664,-0.0007629511,0.3822384985,,, +11.3496093750,181,0.0129701686,-0.0007629511,0.2494850080,,, +11.3515625000,181,0.0129701686,-0.0007629511,0.1579308766,,, +11.3535156250,181,0.0129701686,-0.0007629511,0.5485618372,,, +11.3554687500,181,0.0129701686,-0.0007629511,0.7301441978,,, +11.3574218750,181,0.0144960708,-0.0007629511,0.4463263905,,, +11.3593750000,181,0.0144960708,-0.0007629511,0.2021820401,,, +11.3613281250,181,0.0144960708,-0.0007629511,0.7392996109,,, +11.3632812500,181,0.0160219730,-0.0007629511,0.6874189364,,, +11.3652343750,181,0.0160219730,-0.0007629511,0.7591363394,,, +11.3671875000,181,0.0160219730,-0.0007629511,0.2174410620,,, +11.3691406250,181,0.0175478752,-0.0007629511,0.3913939117,,, +11.3710937500,181,0.0175478752,-0.0007629511,0.6248569467,,, +11.3730468750,181,0.0175478752,-0.0007629511,0.8171206226,,, +11.3750000000,182,0.0190737774,-0.0007629511,0.3227283131,,, +11.3769531250,182,0.0190737774,-0.0007629511,0.2006561379,,, +11.3789062500,182,0.0205996796,-0.0007629511,0.1045243000,,, +11.3808593750,182,0.0205996796,-0.0007629511,0.6187533379,,, +11.3828125000,182,0.0205996796,-0.0007629511,0.5439841306,,, +11.3847656250,182,0.0221255818,-0.0007629511,0.6782635233,,, +11.3867187500,182,0.0221255818,-0.0007629511,0.7057297627,,, +11.3886718750,182,0.0221255818,-0.0007629511,0.2540627146,,, +11.3906250000,182,0.0236514839,-0.0007629511,0.3028915846,,, +11.3925781250,182,0.0236514839,-0.0007629511,0.6324864576,,, +11.3945312500,182,0.0251773861,-0.0007629511,0.5775539788,,, +11.3964843750,182,0.0251773861,-0.0007629511,0.1869230182,,, +11.3984375000,182,0.0267032883,-0.0007629511,0.2342259861,,, +11.4003906250,182,0.0267032883,-0.0007629511,0.9834439612,,, +11.4023437500,182,0.0267032883,-0.0007629511,0.7545586328,,, +11.4042968750,182,0.0282291905,-0.0007629511,0.9727626459,,, +11.4062500000,182,0.0282291905,-0.0007629511,0.4402227817,,, +11.4082031250,182,0.0297550927,-0.0007629511,0.2113374533,,, +11.4101562500,182,0.0297550927,-0.0007629511,0.7209887846,,, +11.4121093750,182,0.0312809949,-0.0007629511,0.7896543832,,, +11.4140625000,182,0.0312809949,-0.0007629511,0.2494850080,,, +11.4160156250,182,0.0328068971,-0.0007629511,0.1670862898,,, +11.4179687500,182,0.0328068971,-0.0007629511,0.5546654459,,, +11.4199218750,182,0.0343327993,-0.0007629511,0.2800030518,,, +11.4218750000,182,0.0343327993,-0.0007629511,0.8476386664,,, +11.4238281250,182,0.0358587015,-0.0007629511,0.1075761044,,, +11.4257812500,182,0.0358587015,-0.0007629511,0.1915007248,,, +11.4277343750,182,0.0373846036,-0.0007629511,0.6080720226,,, +11.4296875000,182,0.0373846036,-0.0007629511,0.4066529335,,, +11.4316406250,182,0.0389105058,-0.0007629511,0.8262760357,,, +11.4335937500,182,0.0389105058,-0.0007629511,0.2433813993,,, +11.4355468750,182,0.0404364080,-0.0007629511,0.5683985657,,, +11.4375000000,183,0.0404364080,-0.0007629511,0.5790798810,,, +11.4394531250,183,0.0419623102,-0.0007629511,0.4173342489,,, +11.4414062500,183,0.0419623102,-0.0007629511,0.2738994430,,, +11.4433593750,183,0.0434882124,-0.0007629511,0.1823453117,,, +11.4453125000,183,0.0434882124,-0.0007629511,0.4631113146,,, +11.4472656250,183,0.0450141146,-0.0007629511,0.4722667277,,, +11.4492187500,183,0.0450141146,-0.0007629511,0.3913939117,,, +11.4511718750,183,0.0465400168,-0.0007629511,0.7164110780,,, +11.4531250000,183,0.0465400168,-0.0007629511,0.6706340124,,, +11.4550781250,183,0.0480659190,-0.0007629511,0.2693217365,,, +11.4570312500,183,0.0495918212,-0.0007629511,0.3440909438,,, +11.4589843750,183,0.0495918212,-0.0007629511,0.8430609598,,, +11.4609375000,183,0.0511177234,-0.0007629511,0.7408255131,,, +11.4628906250,183,0.0511177234,-0.0007629511,0.0450141146,,, +11.4648437500,183,0.0526436255,-0.0007629511,0.9758144503,,, +11.4667968750,183,0.0541695277,-0.0007629511,0.9163042649,,, +11.4687500000,183,0.0541695277,-0.0007629511,0.1625085832,,, +11.4707031250,183,0.0556954299,-0.0007629511,0.1731898985,,, +11.4726562500,183,0.0556954299,-0.0007629511,0.9437705043,,, +11.4746093750,183,0.0572213321,-0.0007629511,0.2388036927,,, +11.4765625000,183,0.0587472343,-0.0007629511,0.4890516518,,, +11.4785156250,183,0.0587472343,-0.0007629511,0.6324864576,,, +11.4804687500,183,0.0602731365,-0.0007629511,0.6157015335,,, +11.4824218750,183,0.0617990387,-0.0007629511,0.3196765087,,, +11.4843750000,183,0.0617990387,-0.0007629511,0.4005493248,,, +11.4863281250,183,0.0633249409,-0.0007629511,0.9956511788,,, +11.4882812500,183,0.0648508431,-0.0007629511,0.4493781949,,, +11.4902343750,183,0.0648508431,-0.0007629511,0.8461127642,,, +11.4921875000,183,0.0663767453,-0.0007629511,0.3334096284,,, +11.4941406250,183,0.0679026474,-0.0007629511,0.2937361715,,, +11.4960937500,183,0.0679026474,-0.0007629511,0.2479591058,,, +11.4980468750,183,0.0694285496,-0.0007629511,0.9315632868,,, +11.5000000000,184,0.0709544518,-0.0007629511,0.6385900664,,, +11.5019531250,184,0.0709544518,-0.0007629511,0.7011520562,,, +11.5039062500,184,0.0724803540,-0.0007629511,0.7240405890,,, +11.5058593750,184,0.0740062562,-0.0007629511,0.2494850080,,, +11.5078125000,184,0.0740062562,-0.0007629511,0.2281223774,,, +11.5097656250,184,0.0755321584,-0.0007629511,0.5973907073,,, +11.5117187500,184,0.0770580606,-0.0007629511,0.5470359350,,, +11.5136718750,184,0.0770580606,-0.0007629511,0.7087815671,,, +11.5156250000,184,0.0785839628,-0.0007629511,0.5546654459,,, +11.5175781250,184,0.0801098650,-0.0007629511,0.0495918212,,, +11.5195312500,184,0.0816357671,-0.0007629511,0.4844739452,,, +11.5214843750,184,0.0816357671,-0.0007629511,0.8339055467,,, +11.5234375000,184,0.0831616693,-0.0007629511,0.7347219043,,, +11.5253906250,184,0.0846875715,-0.0007629511,0.8659494926,,, +11.5273437500,184,0.0862134737,-0.0007629511,0.1243610285,,, +11.5292968750,184,0.0862134737,-0.0007629511,0.2388036927,,, +11.5312500000,184,0.0877393759,-0.0007629511,0.9727626459,,, +11.5332031250,184,0.0892652781,-0.0007629511,0.9224078737,,, +11.5351562500,184,0.0907911803,-0.0007629511,0.4325932708,,, +11.5371093750,184,0.0907911803,-0.0007629511,0.1960784314,,, +11.5390625000,184,0.0923170825,-0.0007629511,0.9468223087,,, +11.5410156250,184,0.0938429847,-0.0007629511,0.2250705730,,, +11.5429687500,184,0.0953688869,-0.0007629511,0.0923170825,,, +11.5449218750,184,0.0968947890,-0.0007629511,0.4097047379,,, +11.5468750000,184,0.0968947890,-0.0007629511,0.2662699321,,, +11.5488281250,184,0.0984206912,-0.0007629511,0.3501945525,,, +11.5507812500,184,0.0999465934,-0.0007629511,0.2449073014,,, +11.5527343750,184,0.1014724956,-0.0007629511,0.7194628824,,, +11.5546875000,184,0.1029983978,-0.0007629511,0.9010452430,,, +11.5566406250,184,0.1029983978,-0.0007629511,0.9681849393,,, +11.5585937500,184,0.1045243000,-0.0007629511,0.8461127642,,, +11.5605468750,184,0.1060502022,-0.0007629511,0.1564049744,,, +11.5625000000,185,0.1075761044,-0.0007629511,0.4325932708,,, +11.5644531250,185,0.1091020066,-0.0007629511,0.1686121920,,, +11.5664062500,185,0.1106279088,-0.0007629511,0.4554818036,,, +11.5683593750,185,0.1106279088,-0.0007629511,0.7347219043,,, +11.5703125000,185,0.1121538109,-0.0007629511,0.9330891890,,, +11.5722656250,185,0.1136797131,-0.0007629511,0.4097047379,,, +11.5742187500,185,0.1152056153,-0.0007629511,0.1533531701,,, +11.5761718750,185,0.1167315175,-0.0007629511,0.0602731365,,, +11.5781250000,185,0.1182574197,-0.0007629511,0.2632181277,,, +11.5800781250,185,0.1197833219,-0.0007629511,0.0251773861,,, +11.5820312500,185,0.1213092241,-0.0007629511,0.5180437934,,, +11.5839843750,185,0.1213092241,-0.0007629511,0.3791866941,,, +11.5859375000,185,0.1228351263,-0.0007629511,0.7927061875,,, +11.5878906250,185,0.1243610285,-0.0007629511,0.8201724269,,, +11.5898437500,185,0.1258869306,-0.0007629511,0.2067597467,,, +11.5917968750,185,0.1274128328,-0.0007629511,0.5363546197,,, +11.5937500000,185,0.1289387350,-0.0007629511,0.9040970474,,, +11.5957031250,185,0.1304646372,-0.0007629511,0.5165178912,,, +11.5976562500,185,0.1319905394,-0.0007629511,0.1686121920,,, +11.5996093750,185,0.1335164416,-0.0007629511,0.6172274357,,, +11.6015625000,185,0.1350423438,-0.0007629511,0.5409323262,,, +11.6035156250,185,0.1365682460,-0.0007629511,0.5821316854,,, +11.6054687500,185,0.1380941482,-0.0007629511,0.7530327306,,, +11.6074218750,185,0.1380941482,-0.0007629511,0.3395132372,,, +11.6093750000,185,0.1396200504,-0.0007629511,0.8339055467,,, +11.6113281250,185,0.1411459525,-0.0007629511,0.2403295949,,, +11.6132812500,185,0.1426718547,-0.0007629511,0.0495918212,,, +11.6152343750,185,0.1441977569,-0.0007629511,0.8476386664,,, +11.6171875000,185,0.1457236591,-0.0007629511,0.9239337758,,, +11.6191406250,185,0.1472495613,-0.0007629511,0.4158083467,,, +11.6210937500,185,0.1487754635,-0.0007629511,0.0205996796,,, +11.6230468750,185,0.1503013657,-0.0007629511,0.2159151598,,, +11.6250000000,186,0.1518272679,-0.0007629511,0.4005493248,,, +11.6269531250,186,0.1533531701,-0.0007629511,0.1884489204,,, +11.6289062500,186,0.1548790723,-0.0007629511,0.5821316854,,, +11.6308593750,186,0.1564049744,-0.0007629511,0.2388036927,,, +11.6328125000,186,0.1579308766,-0.0007629511,0.8552681773,,, +11.6347656250,186,0.1594567788,-0.0007629511,0.8232242313,,, +11.6367187500,186,0.1609826810,-0.0007629511,0.6599526970,,, +11.6386718750,186,0.1625085832,-0.0007629511,0.0160219730,,, +11.6406250000,186,0.1640344854,-0.0007629511,0.8018616007,,, +11.6425781250,186,0.1655603876,-0.0007629511,0.3349355306,,, +11.6445312500,186,0.1670862898,-0.0007629511,0.9391927977,,, +11.6464843750,186,0.1686121920,-0.0007629511,0.9300373846,,, +11.6484375000,186,0.1701380941,-0.0007629511,0.6736858167,,, +11.6503906250,186,0.1716639963,-0.0007629511,0.2159151598,,, +11.6523437500,186,0.1731898985,-0.0007629511,0.4875257496,,, +11.6542968750,186,0.1747158007,-0.0007629511,0.2494850080,,, +11.6562500000,186,0.1762417029,-0.0007629511,0.5348287175,,, +11.6582031250,186,0.1792935073,-0.0007629511,0.4402227817,,, +11.6601562500,186,0.1808194095,-0.0007629511,0.0633249409,,, +11.6621093750,186,0.1823453117,-0.0007629511,0.2815289540,,, +11.6640625000,186,0.1838712139,-0.0007629511,0.8659494926,,, +11.6660156250,186,0.1853971160,-0.0007629511,0.4615854124,,, +11.6679687500,186,0.1869230182,-0.0007629511,0.4066529335,,, +11.6699218750,186,0.1884489204,-0.0007629511,0.0846875715,,, +11.6718750000,186,0.1899748226,-0.0007629511,0.4386968795,,, +11.6738281250,186,0.1915007248,-0.0007629511,0.3593499657,,, +11.6757812500,186,0.1930266270,-0.0007629511,0.2174410620,,, +11.6777343750,186,0.1945525292,-0.0007629511,0.2555886168,,, +11.6796875000,186,0.1960784314,-0.0007629511,0.5058365759,,, +11.6816406250,186,0.1991302358,-0.0007629511,0.3959716182,,, +11.6835937500,186,0.2006561379,-0.0007629511,0.1716639963,,, +11.6855468750,186,0.2021820401,-0.0007629511,0.2021820401,,, +11.6875000000,187,0.2037079423,-0.0007629511,0.0038147555,,, +11.6894531250,187,0.2052338445,-0.0007629511,0.1350423438,,, +11.6914062500,187,0.2067597467,-0.0007629511,0.9956511788,,, +11.6933593750,187,0.2082856489,-0.0007629511,0.3913939117,,, +11.6953125000,187,0.2098115511,-0.0007629511,0.6782635233,,, +11.6972656250,187,0.2128633555,-0.0007629511,0.8598458839,,, +11.6992187500,187,0.2143892576,-0.0007629511,0.4844739452,,, +11.7011718750,187,0.2159151598,-0.0007629511,0.3791866941,,, +11.7031250000,187,0.2174410620,-0.0007629511,0.3791866941,,, +11.7050781250,187,0.2189669642,-0.0007629511,0.9605554284,,, +11.7070312500,187,0.2204928664,-0.0007629511,0.1426718547,,, +11.7089843750,187,0.2235446708,-0.0007629511,0.8110170138,,, +11.7109375000,187,0.2250705730,-0.0007629511,0.8812085145,,, +11.7128906250,187,0.2265964752,-0.0007629511,0.2220187686,,, +11.7148437500,187,0.2281223774,-0.0007629511,0.5088883803,,, +11.7167968750,187,0.2296482795,-0.0007629511,0.0862134737,,, +11.7187500000,187,0.2311741817,-0.0007629511,0.1976043336,,, +11.7207031250,187,0.2342259861,-0.0007629511,0.1411459525,,, +11.7226562500,187,0.2357518883,-0.0007629511,0.1441977569,,, +11.7246093750,187,0.2372777905,-0.0007629511,0.2403295949,,, +11.7265625000,187,0.2388036927,-0.0007629511,0.6279087510,,, +11.7285156250,187,0.2403295949,-0.0007629511,0.9819180591,,, +11.7304687500,187,0.2433813993,-0.0007629511,0.5317769131,,, +11.7324218750,187,0.2449073014,-0.0007629511,0.0099183642,,, +11.7343750000,187,0.2464332036,-0.0007629511,0.5516136416,,, +11.7363281250,187,0.2479591058,-0.0007629511,0.9208819715,,, +11.7382812500,187,0.2510109102,-0.0007629511,0.8644235904,,, +11.7402343750,187,0.2525368124,-0.0007629511,0.6309605554,,, +11.7421875000,187,0.2540627146,-0.0007629511,0.9132524605,,, +11.7441406250,187,0.2555886168,-0.0007629511,0.0877393759,,, +11.7460937500,187,0.2571145190,-0.0007629511,0.5546654459,,, +11.7480468750,187,0.2601663233,-0.0007629511,0.2403295949,,, +11.7500000000,188,0.2616922255,-0.0007629511,0.9925993744,,, +11.7519531250,188,0.2632181277,-0.0007629511,0.8079652094,,, +11.7539062500,188,0.2647440299,-0.0007629511,0.5745021744,,, +11.7558593750,188,0.2677958343,-0.0007629511,0.2967879759,,, +11.7578125000,188,0.2693217365,-0.0007629511,0.3288319219,,, +11.7597656250,188,0.2708476387,-0.0007629511,0.4539559014,,, +11.7617187500,188,0.2738994430,-0.0007629511,0.2738994430,,, +11.7636718750,188,0.2754253452,-0.0007629511,0.8567940795,,, +11.7656250000,188,0.2769512474,-0.0007629511,0.0083924620,,, +11.7675781250,188,0.2784771496,-0.0007629511,0.3212024109,,, +11.7695312500,188,0.2815289540,-0.0007629511,0.3181506065,,, +11.7714843750,188,0.2830548562,-0.0007629511,0.3578240635,,, +11.7734375000,188,0.2845807584,-0.0007629511,0.0022888533,,, +11.7753906250,188,0.2876325628,-0.0007629511,0.6233310445,,, +11.7773437500,188,0.2891584649,-0.0007629511,0.3105210956,,, +11.7792968750,188,0.2906843671,-0.0007629511,0.1594567788,,, +11.7812500000,188,0.2922102693,-0.0007629511,0.8155947204,,, +11.7832031250,188,0.2952620737,-0.0007629511,0.4921034562,,, +11.7851562500,188,0.2967879759,-0.0007629511,0.0526436255,,, +11.7871093750,188,0.2983138781,-0.0007629511,0.7423514153,,, +11.7890625000,188,0.3013656825,-0.0007629511,0.6111238270,,, +11.7910156250,188,0.3028915846,-0.0007629511,0.7408255131,,, +11.7929687500,188,0.3044174868,-0.0007629511,0.1609826810,,, +11.7949218750,188,0.3074692912,-0.0007629511,0.3624017700,,, +11.7968750000,188,0.3089951934,-0.0007629511,0.7881284810,,, +11.7988281250,188,0.3105210956,-0.0007629511,0.2159151598,,, +11.8007812500,188,0.3135729000,-0.0007629511,0.4112306401,,, +11.8027343750,188,0.3150988022,-0.0007629511,0.0328068971,,, +11.8046875000,188,0.3166247044,-0.0007629511,0.6126497292,,, +11.8066406250,188,0.3196765087,-0.0007629511,0.9834439612,,, +11.8085937500,188,0.3212024109,-0.0007629511,0.8552681773,,, +11.8105468750,188,0.3242542153,-0.0007629511,0.8293278401,,, +11.8125000000,189,0.3257801175,-0.0007629511,0.8094911116,,, +11.8144531250,189,0.3273060197,-0.0007629511,0.1777676051,,, +11.8164062500,189,0.3303578241,-0.0007629511,0.6141756313,,, +11.8183593750,189,0.3318837263,-0.0007629511,0.1487754635,,, +11.8203125000,189,0.3334096284,-0.0007629511,0.0434882124,,, +11.8222656250,189,0.3364614328,-0.0007629511,0.6645304036,,, +11.8242187500,189,0.3379873350,-0.0007629511,0.9422446021,,, +11.8261718750,189,0.3410391394,-0.0007629511,0.6141756313,,, +11.8281250000,189,0.3425650416,-0.0007629511,0.9788662547,,, +11.8300781250,189,0.3440909438,-0.0007629511,0.3349355306,,, +11.8320312500,189,0.3471427481,-0.0007629511,0.0038147555,,, +11.8339843750,189,0.3486686503,-0.0007629511,0.5973907073,,, +11.8359375000,189,0.3517204547,-0.0007629511,0.7164110780,,, +11.8378906250,189,0.3532463569,-0.0007629511,0.8766308080,,, +11.8398437500,189,0.3547722591,-0.0007629511,0.6050202182,,, +11.8417968750,189,0.3578240635,-0.0007629511,0.4356450752,,, +11.8437500000,189,0.3593499657,-0.0007629511,0.6111238270,,, +11.8457031250,189,0.3624017700,-0.0007629511,0.8567940795,,, +11.8476562500,189,0.3639276722,-0.0007629511,0.9269855802,,, +11.8496093750,189,0.3669794766,-0.0007629511,0.5348287175,,, +11.8515625000,189,0.3685053788,-0.0007629511,0.8461127642,,, +11.8535156250,189,0.3700312810,-0.0007629511,0.0114442664,,, +11.8554687500,189,0.3730830854,-0.0007629511,0.4310673686,,, +11.8574218750,189,0.3746089876,-0.0007629511,0.7270923934,,, +11.8593750000,189,0.3776607919,-0.0007629511,0.9285114824,,, +11.8613281250,189,0.3791866941,-0.0007629511,0.9529259174,,, +11.8632812500,189,0.3822384985,-0.0007629511,0.8216983291,,, +11.8652343750,189,0.3837644007,-0.0007629511,0.7301441978,,, +11.8671875000,189,0.3868162051,-0.0007629511,0.6584267948,,, +11.8691406250,189,0.3883421073,-0.0007629511,0.3669794766,,, +11.8710937500,189,0.3913939117,-0.0007629511,0.1274128328,,, +11.8730468750,189,0.3929198138,-0.0007629511,0.3196765087,,, +11.8750000000,190,0.3959716182,-0.0007629511,0.8659494926,,, +11.8769531250,190,0.3974975204,-0.0007629511,0.1243610285,,, +11.8789062500,190,0.3990234226,-0.0007629511,0.4264896620,,, +11.8808593750,190,0.4020752270,-0.0007629511,0.8567940795,,, +11.8828125000,190,0.4036011292,-0.0007629511,0.1106279088,,, +11.8847656250,190,0.4066529335,-0.0007629511,0.9651331350,,, +11.8867187500,190,0.4081788357,-0.0007629511,0.5195696956,,, +11.8886718750,190,0.4112306401,-0.0007629511,0.2876325628,,, +11.8906250000,190,0.4127565423,-0.0007629511,0.8598458839,,, +11.8925781250,190,0.4158083467,-0.0007629511,0.5012588693,,, +11.8945312500,190,0.4173342489,-0.0007629511,0.4722667277,,, +11.8964843750,190,0.4203860533,-0.0007629511,0.6904707408,,, +11.8984375000,190,0.4219119554,-0.0007629511,0.6065461204,,, +11.9003906250,190,0.4249637598,-0.0007629511,0.0022888533,,, +11.9023437500,190,0.4280155642,-0.0007629511,0.7362478065,,, +11.9042968750,190,0.4295414664,-0.0007629511,0.2449073014,,, +11.9062500000,190,0.4325932708,-0.0007629511,0.0495918212,,, +11.9082031250,190,0.4341191730,-0.0007629511,0.4051270314,,, +11.9101562500,190,0.4371709773,-0.0007629511,0.6645304036,,, +11.9121093750,190,0.4386968795,-0.0007629511,0.3242542153,,, +11.9140625000,190,0.4417486839,-0.0007629511,0.5119401846,,, +11.9160156250,190,0.4432745861,-0.0007629511,0.5287251087,,, +11.9179687500,190,0.4463263905,-0.0007629511,0.1075761044,,, +11.9199218750,190,0.4478522927,-0.0007629511,0.4692149233,,, +11.9218750000,190,0.4509040970,-0.0007629511,0.8430609598,,, +11.9238281250,190,0.4524299992,-0.0007629511,0.4386968795,,, +11.9257812500,190,0.4554818036,-0.0007629511,0.3685053788,,, +11.9277343750,190,0.4585336080,-0.0007629511,0.9315632868,,, +11.9296875000,190,0.4600595102,-0.0007629511,0.4264896620,,, +11.9316406250,190,0.4631113146,-0.0007629511,0.4798962387,,, +11.9335937500,190,0.4646372168,-0.0007629511,0.0923170825,,, +11.9355468750,190,0.4676890211,-0.0007629511,0.2418554971,,, +11.9375000000,191,0.4692149233,-0.0007629511,0.2952620737,,, +11.9394531250,191,0.4722667277,-0.0007629511,0.3761348898,,, +11.9414062500,191,0.4753185321,-0.0007629511,0.0190737774,,, +11.9433593750,191,0.4768444343,-0.0007629511,0.1441977569,,, +11.9453125000,191,0.4798962387,-0.0007629511,0.1426718547,,, +11.9472656250,191,0.4814221408,-0.0007629511,0.7591363394,,, +11.9492187500,191,0.4844739452,-0.0007629511,0.6950484474,,, +11.9511718750,191,0.4859998474,-0.0007629511,0.5851834897,,, +11.9531250000,191,0.4890516518,-0.0007629511,0.7667658503,,, +11.9550781250,191,0.4921034562,-0.0007629511,0.9254596780,,, +11.9570312500,191,0.4936293584,-0.0007629511,0.7392996109,,, +11.9589843750,191,0.4966811627,-0.0007629511,0.5256733043,,, +11.9609375000,191,0.4982070649,-0.0007629511,0.1503013657,,, +11.9628906250,191,0.5012588693,-0.0007629511,0.7881284810,,, +11.9648437500,191,0.5043106737,-0.0007629511,0.9712367437,,, +11.9667968750,191,0.5058365759,-0.0007629511,0.7042038605,,, +11.9687500000,191,0.5088883803,-0.0007629511,0.0358587015,,, +11.9707031250,191,0.5119401846,-0.0007629511,0.4356450752,,, +11.9726562500,191,0.5134660868,-0.0007629511,0.7637140459,,, +11.9746093750,191,0.5165178912,-0.0007629511,0.7057297627,,, +11.9765625000,191,0.5180437934,-0.0007629511,0.8766308080,,, +11.9785156250,191,0.5210955978,-0.0007629511,0.4066529335,,, +11.9804687500,191,0.5241474022,-0.0007629511,0.7011520562,,, +11.9824218750,191,0.5256733043,-0.0007629511,0.5836575875,,, +11.9843750000,191,0.5287251087,-0.0007629511,0.8628976883,,, +11.9863281250,191,0.5317769131,-0.0007629511,0.2677958343,,, +11.9882812500,191,0.5333028153,-0.0007629511,0.3105210956,,, +11.9902343750,191,0.5363546197,-0.0007629511,0.9193560693,,, +11.9921875000,191,0.5378805219,-0.0007629511,0.3456168460,,, +11.9941406250,191,0.5409323262,-0.0007629511,0.6736858167,,, +11.9960937500,191,0.5439841306,-0.0007629511,0.6874189364,,, +11.9980468750,191,0.5455100328,-0.0007629511,0.9071488518,,, +12.0000000000,192,0.5485618372,-0.0007629511,0.1853971160,,, +12.0019531250,192,0.5516136416,-0.0007629511,0.5165178912,,, +12.0039062500,192,0.5531395438,-0.0007629511,0.4097047379,,, +12.0058593750,192,0.5561913481,-0.0007629511,0.9071488518,,, +12.0078125000,192,0.5592431525,-0.0007629511,0.9712367437,,, +12.0097656250,192,0.5607690547,-0.0007629511,0.7103074693,,, +12.0117187500,192,0.5638208591,-0.0007629511,0.1380941482,,, +12.0136718750,192,0.5668726635,-0.0007629511,0.9117265583,,, +12.0156250000,192,0.5683985657,-0.0007629511,0.0099183642,,, +12.0175781250,192,0.5714503700,-0.0007629511,0.3608758679,,, +12.0195312500,192,0.5745021744,-0.0007629511,0.0404364080,,, +12.0214843750,192,0.5760280766,-0.0007629511,0.8308537423,,, +12.0234375000,192,0.5790798810,-0.0007629511,0.8216983291,,, +12.0253906250,192,0.5821316854,-0.0007629511,0.1441977569,,, +12.0273437500,192,0.5836575875,-0.0007629511,0.5210955978,,, +12.0292968750,192,0.5867093919,-0.0007629511,0.0801098650,,, +12.0312500000,192,0.5897611963,-0.0007629511,0.8567940795,,, +12.0332031250,192,0.5928130007,-0.0007629511,0.4768444343,,, +12.0351562500,192,0.5943389029,-0.0007629511,0.3898680095,,, +12.0371093750,192,0.5973907073,-0.0007629511,0.6340123598,,, +12.0390625000,192,0.6004425116,-0.0007629511,0.3517204547,,, +12.0410156250,192,0.6019684138,-0.0007629511,0.5928130007,,, +12.0429687500,192,0.6050202182,-0.0007629511,0.8140688182,,, +12.0449218750,192,0.6080720226,-0.0007629511,0.3746089876,,, +12.0468750000,192,0.6095979248,-0.0007629511,0.2021820401,,, +12.0488281250,192,0.6126497292,-0.0007629511,0.2906843671,,, +12.0507812500,192,0.6157015335,-0.0007629511,0.7301441978,,, +12.0527343750,192,0.6187533379,-0.0007629511,0.3990234226,,, +12.0546875000,192,0.6202792401,-0.0007629511,0.3776607919,,, +12.0566406250,192,0.6233310445,-0.0007629511,0.4570077058,,, +12.0585937500,192,0.6263828489,-0.0007629511,0.7209887846,,, +12.0605468750,192,0.6279087510,-0.0007629511,0.5638208591,,, +12.0625000000,193,0.6309605554,-0.0007629511,0.9514000153,,, +12.0644531250,193,0.6340123598,-0.0007629511,0.8400091554,,, +12.0664062500,193,0.6370641642,-0.0007629511,0.7804989700,,, +12.0683593750,193,0.6385900664,-0.0007629511,0.0938429847,,, +12.0703125000,193,0.6416418708,-0.0007629511,0.0404364080,,, +12.0722656250,193,0.6446936751,-0.0007629511,0.0679026474,,, +12.0742187500,193,0.6477454795,-0.0007629511,0.8064393072,,, +12.0761718750,193,0.6492713817,-0.0007629511,0.7667658503,,, +12.0781250000,193,0.6523231861,-0.0007629511,0.3456168460,,, +12.0800781250,193,0.6553749905,-0.0007629511,0.5607690547,,, +12.0820312500,193,0.6584267948,-0.0007629511,0.2769512474,,, +12.0839843750,193,0.6599526970,-0.0007629511,0.6172274357,,, +12.0859375000,193,0.6630045014,-0.0007629511,0.4600595102,,, +12.0878906250,193,0.6660563058,-0.0007629511,0.4570077058,,, +12.0898437500,193,0.6675822080,-0.0007629511,0.4249637598,,, +12.0917968750,193,0.6706340124,-0.0007629511,0.9697108415,,, +12.0937500000,193,0.6736858167,-0.0007629511,0.7835507744,,, +12.0957031250,193,0.6767376211,-0.0007629511,0.2220187686,,, +12.0976562500,193,0.6782635233,-0.0007629511,0.3181506065,,, +12.0996093750,193,0.6813153277,-0.0007629511,0.4448004883,,, +12.1015625000,193,0.6843671321,-0.0007629511,0.1274128328,,, +12.1035156250,193,0.6874189364,-0.0007629511,0.7179369802,,, +12.1054687500,193,0.6904707408,-0.0007629511,0.1609826810,,, +12.1074218750,193,0.6919966430,-0.0007629511,0.1121538109,,, +12.1093750000,193,0.6950484474,-0.0007629511,0.9575036240,,, +12.1113281250,193,0.6981002518,-0.0007629511,0.1472495613,,, +12.1132812500,193,0.7011520562,-0.0007629511,0.6477454795,,, +12.1152343750,193,0.7026779583,-0.0007629511,0.8293278401,,, +12.1171875000,193,0.7057297627,-0.0007629511,0.6401159686,,, +12.1191406250,193,0.7087815671,-0.0007629511,0.8857862211,,, +12.1210937500,193,0.7118333715,-0.0007629511,0.9147783627,,, +12.1230468750,193,0.7133592737,-0.0007629511,0.3532463569,,, +12.1250000000,194,0.7164110780,-0.0007629511,0.8049134051,,, +12.1269531250,194,0.7194628824,-0.0007629511,0.8369573510,,, +12.1289062500,194,0.7225146868,-0.0007629511,0.9285114824,,, +12.1308593750,194,0.7255664912,-0.0007629511,0.6889448386,,, +12.1328125000,194,0.7270923934,-0.0007629511,0.1777676051,,, +12.1347656250,194,0.7301441978,-0.0007629511,0.8155947204,,, +12.1367187500,194,0.7331960021,-0.0007629511,0.8812085145,,, +12.1386718750,194,0.7362478065,-0.0007629511,0.6279087510,,, +12.1406250000,194,0.7392996109,-0.0007629511,0.3822384985,,, +12.1425781250,194,0.7408255131,-0.0007629511,0.3486686503,,, +12.1445312500,194,0.7438773175,-0.0007629511,0.1808194095,,, +12.1464843750,194,0.7469291218,-0.0007629511,0.0480659190,,, +12.1484375000,194,0.7499809262,-0.0007629511,0.2983138781,,, +12.1503906250,194,0.7515068284,-0.0007629511,0.4585336080,,, +12.1523437500,194,0.7545586328,-0.0007629511,0.9117265583,,, +12.1542968750,194,0.7576104372,-0.0007629511,0.7637140459,,, +12.1562500000,194,0.7606622416,-0.0007629511,0.8064393072,,, +12.1582031250,194,0.7637140459,-0.0007629511,0.5271992065,,, +12.1601562500,194,0.7652399481,-0.0007629511,0.2983138781,,, +12.1621093750,194,0.7682917525,-0.0007629511,0.1930266270,,, +12.1640625000,194,0.7713435569,-0.0007629511,0.8735790036,,, +12.1660156250,194,0.7743953613,-0.0007629511,0.3669794766,,, +12.1679687500,194,0.7774471656,-0.0007629511,0.7682917525,,, +12.1699218750,194,0.7804989700,-0.0007629511,0.8232242313,,, +12.1718750000,194,0.7820248722,-0.0007629511,0.1029983978,,, +12.1738281250,194,0.7850766766,-0.0007629511,0.4417486839,,, +12.1757812500,194,0.7881284810,-0.0007629511,0.9620813306,,, +12.1777343750,194,0.7911802853,-0.0007629511,0.8842603189,,, +12.1796875000,194,0.7942320897,-0.0007629511,0.8537422751,,, +12.1816406250,194,0.7957579919,-0.0007629511,0.1274128328,,, +12.1835937500,194,0.7988097963,-0.0007629511,0.9925993744,,, +12.1855468750,194,0.8018616007,-0.0007629511,0.4005493248,,, +12.1875000000,195,0.8049134051,-0.0007629511,0.0129701686,,, +12.1894531250,195,0.8079652094,-0.0007629511,0.3166247044,,, +12.1914062500,195,0.8094911116,-0.0007629511,0.9056229496,,, +12.1933593750,195,0.8125429160,-0.0007629511,0.6294346532,,, +12.1953125000,195,0.8155947204,-0.0007629511,0.3715571832,,, +12.1972656250,195,0.8186465248,-0.0007629511,0.0892652781,,, +12.1992187500,195,0.8216983291,-0.0007629511,0.1991302358,,, +12.2011718750,195,0.8247501335,-0.0007629511,0.8567940795,,, +12.2031250000,195,0.8262760357,-0.0007629511,0.0877393759,,, +12.2050781250,195,0.8293278401,-0.0007629511,0.9559777218,,, +12.2070312500,195,0.8323796445,-0.0007629511,0.0679026474,,, +12.2089843750,195,0.8354314488,-0.0007629511,0.8049134051,,, +12.2109375000,195,0.8384832532,-0.0007629511,0.2113374533,,, +12.2128906250,195,0.8415350576,-0.0007629511,0.2372777905,,, +12.2148437500,195,0.8430609598,-0.0007629511,0.8842603189,,, +12.2167968750,195,0.8461127642,-0.0007629511,0.7743953613,,, +12.2187500000,195,0.8491645686,-0.0007629511,0.9834439612,,, +12.2207031250,195,0.8522163729,-0.0007629511,0.4219119554,,, +12.2226562500,195,0.8552681773,-0.0007629511,0.3166247044,,, +12.2246093750,195,0.8583199817,-0.0007629511,0.8461127642,,, +12.2265625000,195,0.8598458839,-0.0007629511,0.3273060197,,, +12.2285156250,195,0.8628976883,-0.0007629511,0.0495918212,,, +12.2304687500,195,0.8659494926,-0.0007629511,0.3898680095,,, +12.2324218750,195,0.8690012970,-0.0007629511,0.7576104372,,, +12.2343750000,195,0.8720531014,-0.0007629511,0.3761348898,,, +12.2363281250,195,0.8751049058,-0.0007629511,0.2403295949,,, +12.2382812500,195,0.8766308080,-0.0007629511,0.1182574197,,, +12.2402343750,195,0.8796826123,-0.0007629511,0.2967879759,,, +12.2421875000,195,0.8827344167,-0.0007629511,0.3593499657,,, +12.2441406250,195,0.8857862211,-0.0007629511,0.0816357671,,, +12.2460937500,195,0.8888380255,-0.0007629511,0.3166247044,,, +12.2480468750,195,0.8918898299,-0.0007629511,0.6889448386,,, +12.2500000000,196,0.8934157321,-0.0007629511,0.0801098650,,, +12.2519531250,196,0.8964675364,-0.0007629511,0.7789730678,,, +12.2539062500,196,0.8995193408,-0.0007629511,0.0648508431,,, +12.2558593750,196,0.9025711452,-0.0007629511,0.3273060197,,, +12.2578125000,196,0.9056229496,-0.0007629511,0.5775539788,,, +12.2597656250,196,0.9086747539,-0.0007629511,0.3868162051,,, +12.2617187500,196,0.9117265583,-0.0007629511,0.2754253452,,, +12.2636718750,196,0.9132524605,-0.0007629511,0.8766308080,,, +12.2656250000,196,0.9163042649,-0.0007629511,0.4386968795,,, +12.2675781250,196,0.9193560693,-0.0007629511,0.3700312810,,, +12.2695312500,196,0.9224078737,-0.0007629511,0.0373846036,,, +12.2714843750,196,0.9254596780,-0.0007629511,0.2098115511,,, +12.2734375000,196,0.9285114824,-0.0007629511,0.4158083467,,, +12.2753906250,196,0.9300373846,-0.0007629511,0.1777676051,,, +12.2773437500,196,0.9330891890,-0.0007629511,0.4570077058,,, +12.2792968750,196,0.9361409934,-0.0007629511,0.6721599145,,, +12.2812500000,196,0.9391927977,-0.0007629511,0.3990234226,,, +12.2832031250,196,0.9422446021,-0.0007629511,0.2555886168,,, +12.2851562500,196,0.9452964065,-0.0007629511,0.6507972839,,, +12.2871093750,196,0.9483482109,-0.0007629511,0.7423514153,,, +12.2890625000,196,0.9498741131,-0.0007629511,0.6675822080,,, +12.2910156250,196,0.9529259174,-0.0007629511,0.6523231861,,, +12.2929687500,196,0.9559777218,-0.0007629511,0.9071488518,,, +12.2949218750,196,0.9590295262,-0.0007629511,0.2052338445,,, +12.2968750000,196,0.9620813306,-0.0007629511,0.0968947890,,, +12.2988281250,196,0.9651331350,-0.0007629511,0.0007629511,,, +12.3007812500,196,0.9681849393,-0.0007629511,0.5470359350,,, +12.3027343750,196,0.9697108415,-0.0007629511,0.0892652781,,, +12.3046875000,196,0.9727626459,-0.0007629511,0.6553749905,,, +12.3066406250,196,0.9758144503,-0.0007629511,0.2296482795,,, +12.3085937500,196,0.9788662547,-0.0007629511,0.4844739452,,, +12.3105468750,196,0.9819180591,-0.0007629511,0.5043106737,,, +12.3125000000,197,0.9849698634,-0.0007629511,0.7804989700,,, +12.3144531250,197,0.9880216678,-0.0007629511,0.0068665599,,, +12.3164062500,197,0.9895475700,-0.0007629511,0.4127565423,,, +12.3183593750,197,0.9925993744,-0.0007629511,0.4600595102,,, +12.3203125000,197,0.9956511788,-0.0007629511,0.0450141146,,, +12.3222656250,197,0.9987029831,-0.0007629511,0.1716639963,,, +12.3242187500,197,1.0017547875,0.9987029831,0.9330891890,,, +12.3261718750,197,1.0048065919,0.9987029831,0.4707408255,,, +12.3281250000,197,1.0078583963,0.9987029831,0.7972838941,,, +12.3300781250,197,1.0093842985,0.9987029831,0.2998397803,,, +12.3320312500,197,1.0124361028,0.9987029831,0.8964675364,,, +12.3339843750,197,1.0154879072,0.9987029831,0.8567940795,,, +12.3359375000,197,1.0185397116,0.9987029831,0.1792935073,,, +12.3378906250,197,1.0215915160,0.9987029831,0.4844739452,,, +12.3398437500,197,1.0246433204,0.9987029831,0.3837644007,,, +12.3417968750,197,1.0261692226,0.9987029831,0.0511177234,,, +12.3437500000,197,1.0292210269,0.9987029831,0.4280155642,,, +12.3457031250,197,1.0322728313,0.9987029831,0.6019684138,,, +12.3476562500,197,1.0353246357,0.9987029831,0.1091020066,,, +12.3496093750,197,1.0383764401,0.9987029831,0.5531395438,,, +12.3515625000,197,1.0414282444,0.9987029831,0.1441977569,,, +12.3535156250,197,1.0444800488,0.9987029831,0.0968947890,,, +12.3554687500,197,1.0460059510,0.9987029831,0.7728694591,,, +12.3574218750,197,1.0490577554,0.9987029831,0.1823453117,,, +12.3593750000,197,1.0521095598,0.9987029831,0.0434882124,,, +12.3613281250,197,1.0551613642,0.9987029831,0.7743953613,,, +12.3632812500,197,1.0582131685,0.9987029831,0.4097047379,,, +12.3652343750,197,1.0612649729,0.9987029831,0.5928130007,,, +12.3671875000,197,1.0643167773,0.9987029831,0.7911802853,,, +12.3691406250,197,1.0658426795,0.9987029831,0.0221255818,,, +12.3710937500,197,1.0688944839,0.9987029831,0.7423514153,,, +12.3730468750,197,1.0719462882,0.9987029831,0.8476386664,,, +12.3750000000,198,1.0749980926,0.9987029831,0.9071488518,,, +12.3769531250,198,1.0780498970,0.9987029831,0.0205996796,,, +12.3789062500,198,1.0811017014,0.9987029831,0.3288319219,,, +12.3808593750,198,1.0841535058,0.9987029831,0.6645304036,,, +12.3828125000,198,1.0856794079,0.9987029831,0.3410391394,,, +12.3847656250,198,1.0887312123,0.9987029831,0.7057297627,,, +12.3867187500,198,1.0917830167,0.9987029831,0.3807125963,,, +12.3886718750,198,1.0948348211,0.9987029831,0.4585336080,,, +12.3906250000,198,1.0978866255,0.9987029831,0.6599526970,,, +12.3925781250,198,1.1009384298,0.9987029831,0.2830548562,,, +12.3945312500,198,1.1024643320,0.9987029831,0.2021820401,,, +12.3964843750,198,1.1055161364,0.9987029831,0.4722667277,,, +12.3984375000,198,1.1085679408,0.9987029831,0.7927061875,,, +12.4003906250,198,1.1116197452,0.9987029831,0.4722667277,,, +12.4023437500,198,1.1146715496,0.9987029831,0.5683985657,,, +12.4042968750,198,1.1177233539,0.9987029831,0.2159151598,,, +12.4062500000,198,1.1192492561,0.9987029831,0.9605554284,,, +12.4082031250,198,1.1223010605,0.9987029831,0.3150988022,,, +12.4101562500,198,1.1253528649,0.9987029831,0.5104142824,,, +12.4121093750,198,1.1284046693,0.9987029831,0.4356450752,,, +12.4140625000,198,1.1314564736,0.9987029831,0.8064393072,,, +12.4160156250,198,1.1345082780,0.9987029831,0.0831616693,,, +12.4179687500,198,1.1375600824,0.9987029831,0.0694285496,,, +12.4199218750,198,1.1390859846,0.9987029831,0.9239337758,,, +12.4218750000,198,1.1421377890,0.9987029831,0.6080720226,,, +12.4238281250,198,1.1451895933,0.9987029831,0.2159151598,,, +12.4257812500,198,1.1482413977,0.9987029831,0.0511177234,,, +12.4277343750,198,1.1512932021,0.9987029831,0.4005493248,,, +12.4296875000,198,1.1543450065,0.9987029831,0.9468223087,,, +12.4316406250,198,1.1558709087,0.9987029831,0.0831616693,,, +12.4335937500,198,1.1589227131,0.9987029831,0.1731898985,,, +12.4355468750,198,1.1619745174,0.9987029831,0.8506904707,,, +12.4375000000,199,1.1650263218,0.9987029831,0.6111238270,,, +12.4394531250,199,1.1680781262,0.9987029831,0.9605554284,,, +12.4414062500,199,1.1696040284,0.9987029831,0.3593499657,,, +12.4433593750,199,1.1726558328,0.9987029831,0.2174410620,,, +12.4453125000,199,1.1757076371,0.9987029831,0.5622949569,,, +12.4472656250,199,1.1787594415,0.9987029831,0.7438773175,,, +12.4492187500,199,1.1818112459,0.9987029831,0.0770580606,,, +12.4511718750,199,1.1848630503,0.9987029831,0.8064393072,,, +12.4531250000,199,1.1863889525,0.9987029831,0.7316700999,,, +12.4550781250,199,1.1894407568,0.9987029831,0.9208819715,,, +12.4570312500,199,1.1924925612,0.9987029831,0.5485618372,,, +12.4589843750,199,1.1955443656,0.9987029831,0.7301441978,,, +12.4609375000,199,1.1985961700,0.9987029831,0.7301441978,,, +12.4628906250,199,1.2016479744,0.9987029831,0.6431677729,,, +12.4648437500,199,1.2031738766,0.9987029831,0.0511177234,,, +12.4667968750,199,1.2062256809,0.9987029831,0.1503013657,,, +12.4687500000,199,1.2092774853,0.9987029831,0.2357518883,,, +12.4707031250,199,1.2123292897,0.9987029831,0.2143892576,,, +12.4726562500,199,1.2153810941,0.9987029831,0.9498741131,,, +12.4746093750,199,1.2169069963,0.9987029831,0.2723735409,,, +12.4765625000,199,1.2199588006,0.9987029831,0.8720531014,,, +12.4785156250,199,1.2230106050,0.9987029831,0.4341191730,,, +12.4804687500,199,1.2260624094,0.9987029831,0.5226215000,,, +12.4824218750,199,1.2291142138,0.9987029831,0.3395132372,,, +12.4843750000,199,1.2306401160,0.9987029831,0.1136797131,,, +12.4863281250,199,1.2336919203,0.9987029831,0.7484550240,,, +12.4882812500,199,1.2367437247,0.9987029831,0.9483482109,,, +12.4902343750,199,1.2397955291,0.9987029831,0.7209887846,,, +12.4921875000,199,1.2428473335,0.9987029831,0.5119401846,,, +12.4941406250,199,1.2443732357,0.9987029831,0.3395132372,,, +12.4960937500,199,1.2474250401,0.9987029831,0.6736858167,,, +12.4980468750,199,1.2504768444,0.9987029831,0.7728694591,,, +12.5000000000,200,1.2535286488,0.9987029831,0.4478522927,,, +12.5019531250,200,1.2565804532,0.9987029831,0.5470359350,,, +12.5039062500,200,1.2581063554,0.9987029831,0.2479591058,,, +12.5058593750,200,1.2611581598,0.9987029831,0.2235446708,,, +12.5078125000,200,1.2642099641,0.9987029831,0.4295414664,,, +12.5097656250,200,1.2672617685,0.9987029831,0.8461127642,,, +12.5117187500,200,1.2703135729,0.9987029831,0.0846875715,,, +12.5136718750,200,1.2718394751,0.9987029831,0.9040970474,,, +12.5156250000,200,1.2748912795,0.9987029831,0.3074692912,,, +12.5175781250,200,1.2779430838,0.9987029831,0.4127565423,,, +12.5195312500,200,1.2809948882,0.9987029831,0.9651331350,,, +12.5214843750,200,1.2825207904,0.9987029831,0.1121538109,,, +12.5234375000,200,1.2855725948,0.9987029831,0.5729762722,,, +12.5253906250,200,1.2886243992,0.9987029831,0.6416418708,,, +12.5273437500,200,1.2916762036,0.9987029831,0.0373846036,,, +12.5292968750,200,1.2947280079,0.9987029831,0.1747158007,,, +12.5312500000,200,1.2962539101,0.9987029831,0.4509040970,,, +12.5332031250,200,1.2993057145,0.9987029831,0.0129701686,,, +12.5351562500,200,1.3023575189,0.9987029831,0.0709544518,,, +12.5371093750,200,1.3054093233,0.9987029831,0.1304646372,,, +12.5390625000,200,1.3069352255,0.9987029831,0.3364614328,,, +12.5410156250,200,1.3099870298,0.9987029831,0.9636072328,,, +12.5429687500,200,1.3130388342,0.9987029831,0.8400091554,,, +12.5449218750,200,1.3160906386,0.9987029831,0.9895475700,,, +12.5468750000,200,1.3176165408,0.9987029831,0.1808194095,,, +12.5488281250,200,1.3206683452,0.9987029831,0.1152056153,,, +12.5507812500,200,1.3237201495,0.9987029831,0.7179369802,,, +12.5527343750,200,1.3267719539,0.9987029831,0.5500877394,,, +12.5546875000,200,1.3282978561,0.9987029831,0.7743953613,,, +12.5566406250,200,1.3313496605,0.9987029831,0.0419623102,,, +12.5585937500,200,1.3344014649,0.9987029831,0.6553749905,,, +12.5605468750,200,1.3374532692,0.9987029831,0.6614785992,,, +12.5625000000,201,1.3389791714,0.9987029831,0.2052338445,,, +12.5644531250,201,1.3420309758,0.9987029831,0.8583199817,,, +12.5664062500,201,1.3450827802,0.9987029831,0.0892652781,,, +12.5683593750,201,1.3481345846,0.9987029831,0.0190737774,,, +12.5703125000,201,1.3496604868,0.9987029831,0.1029983978,,, +12.5722656250,201,1.3527122911,0.9987029831,0.9437705043,,, +12.5742187500,201,1.3557640955,0.9987029831,0.6202792401,,, +12.5761718750,201,1.3588158999,0.9987029831,0.8354314488,,, +12.5781250000,201,1.3603418021,0.9987029831,0.7911802853,,, +12.5800781250,201,1.3633936065,0.9987029831,0.8735790036,,, +12.5820312500,201,1.3664454108,0.9987029831,0.9269855802,,, +12.5839843750,201,1.3694972152,0.9987029831,0.1472495613,,, +12.5859375000,201,1.3710231174,0.9987029831,0.9864957656,,, +12.5878906250,201,1.3740749218,0.9987029831,0.9071488518,,, +12.5898437500,201,1.3771267262,0.9987029831,0.2601663233,,, +12.5917968750,201,1.3786526284,0.9987029831,0.8201724269,,, +12.5937500000,201,1.3817044327,0.9987029831,0.0404364080,,, +12.5957031250,201,1.3847562371,0.9987029831,0.8751049058,,, +12.5976562500,201,1.3878080415,0.9987029831,0.0053406577,,, +12.5996093750,201,1.3893339437,0.9987029831,0.1609826810,,, +12.6015625000,201,1.3923857481,0.9987029831,0.7423514153,,, +12.6035156250,201,1.3954375525,0.9987029831,0.1869230182,,, +12.6054687500,201,1.3969634546,0.9987029831,0.1213092241,,, +12.6074218750,201,1.4000152590,0.9987029831,0.1380941482,,, +12.6093750000,201,1.4030670634,0.9987029831,0.5622949569,,, +12.6113281250,201,1.4045929656,0.9987029831,0.3608758679,,, +12.6132812500,201,1.4076447700,0.9987029831,0.1380941482,,, +12.6152343750,201,1.4106965743,0.9987029831,0.4463263905,,, +12.6171875000,201,1.4137483787,0.9987029831,0.4051270314,,, +12.6191406250,201,1.4152742809,0.9987029831,0.5500877394,,, +12.6210937500,201,1.4183260853,0.9987029831,0.3944457160,,, +12.6230468750,201,1.4213778897,0.9987029831,0.0740062562,,, +12.6250000000,202,1.4229037919,0.9987029831,0.0038147555,,, +12.6269531250,202,1.4259555962,0.9987029831,0.0587472343,,, +12.6289062500,202,1.4290074006,0.9987029831,0.3120469978,,, +12.6308593750,202,1.4305333028,0.9987029831,0.2891584649,,, +12.6328125000,202,1.4335851072,0.9987029831,0.3440909438,,, +12.6347656250,202,1.4366369116,0.9987029831,0.5653467613,,, +12.6367187500,202,1.4381628138,0.9987029831,0.3166247044,,, +12.6386718750,202,1.4412146181,0.9987029831,0.2800030518,,, +12.6406250000,202,1.4442664225,0.9987029831,0.7133592737,,, +12.6425781250,202,1.4457923247,0.9987029831,0.7454032197,,, +12.6445312500,202,1.4488441291,0.9987029831,0.7133592737,,, +12.6464843750,202,1.4518959335,0.9987029831,0.9987029831,,, +12.6484375000,202,1.4534218357,0.9987029831,0.9132524605,,, +12.6503906250,202,1.4564736400,0.9987029831,0.7591363394,,, +12.6523437500,202,1.4595254444,0.9987029831,0.5531395438,,, +12.6542968750,202,1.4610513466,0.9987029831,0.1152056153,,, +12.6562500000,202,1.4641031510,0.9987029831,0.6919966430,,, +12.6582031250,202,1.4656290532,0.9987029831,0.4448004883,,, +12.6601562500,202,1.4686808576,0.9987029831,0.7774471656,,, +12.6621093750,202,1.4717326619,0.9987029831,0.9758144503,,, +12.6640625000,202,1.4732585641,0.9987029831,0.1152056153,,, +12.6660156250,202,1.4763103685,0.9987029831,0.2769512474,,, +12.6679687500,202,1.4793621729,0.9987029831,0.5119401846,,, +12.6699218750,202,1.4808880751,0.9987029831,0.2769512474,,, +12.6718750000,202,1.4839398795,0.9987029831,0.5668726635,,, +12.6738281250,202,1.4854657816,0.9987029831,0.2433813993,,, +12.6757812500,202,1.4885175860,0.9987029831,0.3440909438,,, +12.6777343750,202,1.4915693904,0.9987029831,0.7011520562,,, +12.6796875000,202,1.4930952926,0.9987029831,0.6507972839,,, +12.6816406250,202,1.4961470970,0.9987029831,0.4219119554,,, +12.6835937500,202,1.4991989014,0.9987029831,0.3212024109,,, +12.6855468750,202,1.5007248035,0.9987029831,0.2601663233,,, +12.6875000000,203,1.5037766079,0.9987029831,0.2510109102,,, +12.6894531250,203,1.5053025101,0.9987029831,0.4280155642,,, +12.6914062500,203,1.5083543145,0.9987029831,0.6385900664,,, +12.6933593750,203,1.5114061189,0.9987029831,0.3959716182,,, +12.6953125000,203,1.5129320211,0.9987029831,0.6385900664,,, +12.6972656250,203,1.5159838254,0.9987029831,0.2815289540,,, +12.6992187500,203,1.5175097276,0.9987029831,0.6691081102,,, +12.7011718750,203,1.5205615320,0.9987029831,0.9727626459,,, +12.7031250000,203,1.5220874342,0.9987029831,0.8751049058,,, +12.7050781250,203,1.5251392386,0.9987029831,0.6904707408,,, +12.7070312500,203,1.5281910430,0.9987029831,0.8278019379,,, +12.7089843750,203,1.5297169451,0.9987029831,0.6095979248,,, +12.7109375000,203,1.5327687495,0.9987029831,0.2693217365,,, +12.7128906250,203,1.5342946517,0.9987029831,0.6889448386,,, +12.7148437500,203,1.5373464561,0.9987029831,0.9651331350,,, +12.7167968750,203,1.5388723583,0.9987029831,0.2311741817,,, +12.7187500000,203,1.5419241627,0.9987029831,0.4737926299,,, +12.7207031250,203,1.5449759670,0.9987029831,0.4982070649,,, +12.7226562500,203,1.5465018692,0.9987029831,0.9330891890,,, +12.7246093750,203,1.5495536736,0.9987029831,0.0709544518,,, +12.7265625000,203,1.5510795758,0.9987029831,0.5241474022,,, +12.7285156250,203,1.5541313802,0.9987029831,0.7118333715,,, +12.7304687500,203,1.5556572824,0.9987029831,0.0740062562,,, +12.7324218750,203,1.5587090867,0.9987029831,0.7942320897,,, +12.7343750000,203,1.5602349889,0.9987029831,0.1930266270,,, +12.7363281250,203,1.5632867933,0.9987029831,0.0083924620,,, +12.7382812500,203,1.5648126955,0.9987029831,0.2372777905,,, +12.7402343750,203,1.5678644999,0.9987029831,0.5714503700,,, +12.7421875000,203,1.5709163043,0.9987029831,0.9910734722,,, +12.7441406250,203,1.5724422065,0.9987029831,0.0343327993,,, +12.7460937500,203,1.5754940108,0.9987029831,0.5653467613,,, +12.7480468750,203,1.5770199130,0.9987029831,0.9071488518,,, +12.7500000000,204,1.5800717174,0.9987029831,0.4722667277,,, +12.7519531250,204,1.5815976196,0.9987029831,0.6660563058,,, +12.7539062500,204,1.5846494240,0.9987029831,0.7759212634,,, +12.7558593750,204,1.5861753262,0.9987029831,0.0709544518,,, +12.7578125000,204,1.5892271305,0.9987029831,0.3059433890,,, +12.7597656250,204,1.5907530327,0.9987029831,0.5073624781,,, +12.7617187500,204,1.5938048371,0.9987029831,0.9437705043,,, +12.7636718750,204,1.5953307393,0.9987029831,0.0175478752,,, +12.7656250000,204,1.5983825437,0.9987029831,0.0923170825,,, +12.7675781250,204,1.5999084459,0.9987029831,0.5561913481,,, +12.7695312500,204,1.6029602502,0.9987029831,0.9437705043,,, +12.7714843750,204,1.6044861524,0.9987029831,0.6507972839,,, +12.7734375000,204,1.6060120546,0.9987029831,0.3135729000,,, +12.7753906250,204,1.6090638590,0.9987029831,0.8201724269,,, +12.7773437500,204,1.6105897612,0.9987029831,0.9208819715,,, +12.7792968750,204,1.6136415656,0.9987029831,0.5851834897,,, +12.7812500000,204,1.6151674678,0.9987029831,0.2098115511,,, +12.7832031250,204,1.6182192721,0.9987029831,0.7209887846,,, +12.7851562500,204,1.6197451743,0.9987029831,0.6218051423,,, +12.7871093750,204,1.6227969787,0.9987029831,0.2235446708,,, +12.7890625000,204,1.6243228809,0.9987029831,0.5775539788,,, +12.7910156250,204,1.6273746853,0.9987029831,0.0923170825,,, +12.7929687500,204,1.6289005875,0.9987029831,0.2433813993,,, +12.7949218750,204,1.6304264897,0.9987029831,0.3181506065,,, +12.7968750000,204,1.6334782940,0.9987029831,0.1701380941,,, +12.7988281250,204,1.6350041962,0.9987029831,0.3929198138,,, +12.8007812500,204,1.6380560006,0.9987029831,0.6141756313,,, +12.8027343750,204,1.6395819028,0.9987029831,0.1792935073,,, +12.8046875000,204,1.6426337072,0.9987029831,0.9498741131,,, +12.8066406250,204,1.6441596094,0.9987029831,0.0419623102,,, +12.8085937500,204,1.6456855116,0.9987029831,0.7804989700,,, +12.8105468750,204,1.6487373159,0.9987029831,0.9407186999,,, +12.8125000000,205,1.6502632181,0.9987029831,0.0312809949,,, +12.8144531250,205,1.6533150225,0.9987029831,0.2967879759,,, +12.8164062500,205,1.6548409247,0.9987029831,0.7698176547,,, +12.8183593750,205,1.6563668269,0.9987029831,0.1182574197,,, +12.8203125000,205,1.6594186313,0.9987029831,0.3624017700,,, +12.8222656250,205,1.6609445335,0.9987029831,0.3761348898,,, +12.8242187500,205,1.6639963378,0.9987029831,0.1167315175,,, +12.8261718750,205,1.6655222400,0.9987029831,0.3364614328,,, +12.8281250000,205,1.6670481422,0.9987029831,0.2479591058,,, +12.8300781250,205,1.6700999466,0.9987029831,0.6187533379,,, +12.8320312500,205,1.6716258488,0.9987029831,0.9620813306,,, +12.8339843750,205,1.6746776532,0.9987029831,0.5516136416,,, +12.8359375000,205,1.6762035554,0.9987029831,0.4005493248,,, +12.8378906250,205,1.6777294575,0.9987029831,0.9285114824,,, +12.8398437500,205,1.6807812619,0.9987029831,0.3883421073,,, +12.8417968750,205,1.6823071641,0.9987029831,0.0663767453,,, +12.8437500000,205,1.6838330663,0.9987029831,0.6370641642,,, +12.8457031250,205,1.6868848707,0.9987029831,0.1396200504,,, +12.8476562500,205,1.6884107729,0.9987029831,0.8339055467,,, +12.8496093750,205,1.6899366751,0.9987029831,0.7789730678,,, +12.8515625000,205,1.6929884794,0.9987029831,0.0160219730,,, +12.8535156250,205,1.6945143816,0.9987029831,0.8888380255,,, +12.8554687500,205,1.6960402838,0.9987029831,0.3044174868,,, +12.8574218750,205,1.6990920882,0.9987029831,0.5699244678,,, +12.8593750000,205,1.7006179904,0.9987029831,0.6431677729,,, +12.8613281250,205,1.7021438926,0.9987029831,0.5363546197,,, +12.8632812500,205,1.7051956970,0.9987029831,0.7972838941,,, +12.8652343750,205,1.7067215991,0.9987029831,0.9559777218,,, +12.8671875000,205,1.7082475013,0.9987029831,0.7072556649,,, +12.8691406250,205,1.7112993057,0.9987029831,0.8064393072,,, +12.8710937500,205,1.7128252079,0.9987029831,0.3120469978,,, +12.8730468750,205,1.7143511101,0.9987029831,0.3532463569,,, +12.8750000000,206,1.7158770123,0.9987029831,0.8567940795,,, +12.8769531250,206,1.7189288167,0.9987029831,0.6752117189,,, +12.8789062500,206,1.7204547189,0.9987029831,0.8979934386,,, +12.8808593750,206,1.7219806210,0.9987029831,0.3105210956,,, +12.8828125000,206,1.7250324254,0.9987029831,0.2510109102,,, +12.8847656250,206,1.7265583276,0.9987029831,0.9102006561,,, +12.8867187500,206,1.7280842298,0.9987029831,0.3303578241,,, +12.8886718750,206,1.7296101320,0.9987029831,0.2510109102,,, +12.8906250000,206,1.7326619364,0.9987029831,0.1060502022,,, +12.8925781250,206,1.7341878386,0.9987029831,0.8339055467,,, +12.8945312500,206,1.7357137407,0.9987029831,0.6065461204,,, +12.8964843750,206,1.7372396429,0.9987029831,0.1930266270,,, +12.8984375000,206,1.7402914473,0.9987029831,0.1976043336,,, +12.9003906250,206,1.7418173495,0.9987029831,0.7194628824,,, +12.9023437500,206,1.7433432517,0.9987029831,0.9987029831,,, +12.9042968750,206,1.7448691539,0.9987029831,0.8873121233,,, +12.9062500000,206,1.7479209583,0.9987029831,0.4386968795,,, +12.9082031250,206,1.7494468605,0.9987029831,0.5546654459,,, +12.9101562500,206,1.7509727626,0.9987029831,0.8400091554,,, +12.9121093750,206,1.7524986648,0.9987029831,0.5195696956,,, +12.9140625000,206,1.7555504692,0.9987029831,0.8171206226,,, +12.9160156250,206,1.7570763714,0.9987029831,0.6904707408,,, +12.9179687500,206,1.7586022736,0.9987029831,0.9086747539,,, +12.9199218750,206,1.7601281758,0.9987029831,0.0648508431,,, +12.9218750000,206,1.7616540780,0.9987029831,0.0511177234,,, +12.9238281250,206,1.7647058824,0.9987029831,0.2235446708,,, +12.9257812500,206,1.7662317845,0.9987029831,0.3150988022,,, +12.9277343750,206,1.7677576867,0.9987029831,0.1396200504,,, +12.9296875000,206,1.7692835889,0.9987029831,0.1533531701,,, +12.9316406250,206,1.7708094911,0.9987029831,0.7057297627,,, +12.9335937500,206,1.7723353933,0.9987029831,0.6004425116,,, +12.9355468750,206,1.7753871977,0.9987029831,0.9285114824,,, +12.9375000000,207,1.7769130999,0.9987029831,0.7957579919,,, +12.9394531250,207,1.7784390021,0.9987029831,0.7682917525,,, +12.9414062500,207,1.7799649042,0.9987029831,0.7560845350,,, +12.9433593750,207,1.7814908064,0.9987029831,0.4493781949,,, +12.9453125000,207,1.7830167086,0.9987029831,0.3089951934,,, +12.9472656250,207,1.7860685130,0.9987029831,0.2250705730,,, +12.9492187500,207,1.7875944152,0.9987029831,0.2845807584,,, +12.9511718750,207,1.7891203174,0.9987029831,0.9697108415,,, +12.9531250000,207,1.7906462196,0.9987029831,0.9895475700,,, +12.9550781250,207,1.7921721218,0.9987029831,0.0953688869,,, +12.9570312500,207,1.7936980240,0.9987029831,0.9437705043,,, +12.9589843750,207,1.7952239261,0.9987029831,0.1838712139,,, +12.9609375000,207,1.7982757305,0.9987029831,0.2403295949,,, +12.9628906250,207,1.7998016327,0.9987029831,0.5683985657,,, +12.9648437500,207,1.8013275349,0.9987029831,0.2357518883,,, +12.9667968750,207,1.8028534371,0.9987029831,0.7667658503,,, +12.9687500000,207,1.8043793393,0.9987029831,0.9102006561,,, +12.9707031250,207,1.8059052415,0.9987029831,0.6767376211,,, +12.9726562500,207,1.8074311437,0.9987029831,0.1747158007,,, +12.9746093750,207,1.8089570459,0.9987029831,0.1457236591,,, +12.9765625000,207,1.8104829480,0.9987029831,0.1106279088,,, +12.9785156250,207,1.8120088502,0.9987029831,0.6569008927,,, +12.9804687500,207,1.8135347524,0.9987029831,0.4249637598,,, +12.9824218750,207,1.8165865568,0.9987029831,0.5638208591,,, +12.9843750000,207,1.8181124590,0.9987029831,0.6874189364,,, +12.9863281250,207,1.8196383612,0.9987029831,0.3410391394,,, +12.9882812500,207,1.8211642634,0.9987029831,0.6401159686,,, +12.9902343750,207,1.8226901656,0.9987029831,0.9117265583,,, +12.9921875000,207,1.8242160678,0.9987029831,0.9529259174,,, +12.9941406250,207,1.8257419699,0.9987029831,0.7560845350,,, +12.9960937500,207,1.8272678721,0.9987029831,0.5363546197,,, +12.9980468750,207,1.8287937743,0.9987029831,0.6507972839,,, +13.0000000000,208,1.8303196765,0.9987029831,0.6935225452,,, +13.0019531250,208,1.8318455787,0.9987029831,0.2403295949,,, +13.0039062500,208,1.8333714809,0.9987029831,0.1899748226,,, +13.0058593750,208,1.8348973831,0.9987029831,0.6813153277,,, +13.0078125000,208,1.8364232853,0.9987029831,0.9803921569,,, +13.0097656250,208,1.8379491875,0.9987029831,0.7667658503,,, +13.0117187500,208,1.8394750896,0.9987029831,0.7423514153,,, +13.0136718750,208,1.8410009918,0.9987029831,0.4585336080,,, +13.0156250000,208,1.8425268940,0.9987029831,0.2830548562,,, +13.0175781250,208,1.8440527962,0.9987029831,0.5363546197,,, +13.0195312500,208,1.8455786984,0.9987029831,0.8674753948,,, +13.0214843750,208,1.8471046006,0.9987029831,0.2464332036,,, +13.0234375000,208,1.8486305028,0.9987029831,0.6813153277,,, +13.0253906250,208,1.8501564050,0.9987029831,0.7179369802,,, +13.0273437500,208,1.8516823072,0.9987029831,0.3868162051,,, +13.0292968750,208,1.8532082094,0.9987029831,0.0068665599,,, +13.0312500000,208,1.8547341115,0.9987029831,0.3257801175,,, +13.0332031250,208,1.8562600137,0.9987029831,0.7743953613,,, +13.0351562500,208,1.8577859159,0.9987029831,0.9636072328,,, +13.0371093750,208,1.8593118181,0.9987029831,0.4066529335,,, +13.0390625000,208,1.8608377203,0.9987029831,0.9712367437,,, +13.0410156250,208,1.8623636225,0.9987029831,0.4325932708,,, +13.0429687500,208,1.8638895247,0.9987029831,0.4951552605,,, +13.0449218750,208,1.8654154269,0.9987029831,0.5973907073,,, +13.0468750000,208,1.8654154269,0.9987029831,0.6691081102,,, +13.0488281250,208,1.8669413291,0.9987029831,0.2098115511,,, +13.0507812500,208,1.8684672313,0.9987029831,0.7804989700,,, +13.0527343750,208,1.8699931334,0.9987029831,0.7133592737,,, +13.0546875000,208,1.8715190356,0.9987029831,0.4188601511,,, +13.0566406250,208,1.8730449378,0.9987029831,0.5287251087,,, +13.0585937500,208,1.8745708400,0.9987029831,0.2616922255,,, +13.0605468750,208,1.8760967422,0.9987029831,0.5683985657,,, +13.0625000000,209,1.8776226444,0.9987029831,0.7881284810,,, +13.0644531250,209,1.8791485466,0.9987029831,0.4707408255,,, +13.0664062500,209,1.8806744488,0.9987029831,0.8461127642,,, +13.0683593750,209,1.8806744488,0.9987029831,0.0709544518,,, +13.0703125000,209,1.8822003510,0.9987029831,0.4432745861,,, +13.0722656250,209,1.8837262531,0.9987029831,0.3639276722,,, +13.0742187500,209,1.8852521553,0.9987029831,0.6034943160,,, +13.0761718750,209,1.8867780575,0.9987029831,0.9636072328,,, +13.0781250000,209,1.8883039597,0.9987029831,0.1411459525,,, +13.0800781250,209,1.8898298619,0.9987029831,0.3486686503,,, +13.0820312500,209,1.8898298619,0.9987029831,0.9895475700,,, +13.0839843750,209,1.8913557641,0.9987029831,0.8873121233,,, +13.0859375000,209,1.8928816663,0.9987029831,0.8857862211,,, +13.0878906250,209,1.8944075685,0.9987029831,0.2815289540,,, +13.0898437500,209,1.8959334707,0.9987029831,0.1121538109,,, +13.0917968750,209,1.8974593729,0.9987029831,0.7164110780,,, +13.0937500000,209,1.8974593729,0.9987029831,0.0373846036,,, +13.0957031250,209,1.8989852750,0.9987029831,0.6401159686,,, +13.0976562500,209,1.9005111772,0.9987029831,0.8293278401,,, +13.0996093750,209,1.9020370794,0.9987029831,0.6675822080,,, +13.1015625000,209,1.9035629816,0.9987029831,0.7194628824,,, +13.1035156250,209,1.9035629816,0.9987029831,0.6584267948,,, +13.1054687500,209,1.9050888838,0.9987029831,0.7301441978,,, +13.1074218750,209,1.9066147860,0.9987029831,0.8674753948,,, +13.1093750000,209,1.9081406882,0.9987029831,0.8445868620,,, +13.1113281250,209,1.9081406882,0.9987029831,0.7118333715,,, +13.1132812500,209,1.9096665904,0.9987029831,0.2189669642,,, +13.1152343750,209,1.9111924926,0.9987029831,0.9163042649,,, +13.1171875000,209,1.9127183948,0.9987029831,0.9147783627,,, +13.1191406250,209,1.9142442969,0.9987029831,0.0373846036,,, +13.1210937500,209,1.9142442969,0.9987029831,0.1106279088,,, +13.1230468750,209,1.9157701991,0.9987029831,0.8934157321,,, +13.1250000000,210,1.9172961013,0.9987029831,0.1243610285,,, +13.1269531250,210,1.9172961013,0.9987029831,0.9422446021,,, +13.1289062500,210,1.9188220035,0.9987029831,0.1777676051,,, +13.1308593750,210,1.9203479057,0.9987029831,0.3181506065,,, +13.1328125000,210,1.9218738079,0.9987029831,0.9025711452,,, +13.1347656250,210,1.9218738079,0.9987029831,0.5653467613,,, +13.1367187500,210,1.9233997101,0.9987029831,0.0617990387,,, +13.1386718750,210,1.9249256123,0.9987029831,0.7743953613,,, +13.1406250000,210,1.9249256123,0.9987029831,0.5455100328,,, +13.1425781250,210,1.9264515145,0.9987029831,0.6050202182,,, +13.1445312500,210,1.9279774166,0.9987029831,0.7316700999,,, +13.1464843750,210,1.9295033188,0.9987029831,0.4524299992,,, +13.1484375000,210,1.9295033188,0.9987029831,0.8613717861,,, +13.1503906250,210,1.9310292210,0.9987029831,0.2998397803,,, +13.1523437500,210,1.9325551232,0.9987029831,0.5073624781,,, +13.1542968750,210,1.9325551232,0.9987029831,0.8445868620,,, +13.1562500000,210,1.9340810254,0.9987029831,0.3242542153,,, +13.1582031250,210,1.9356069276,0.9987029831,0.6919966430,,, +13.1601562500,210,1.9356069276,0.9987029831,0.9010452430,,, +13.1621093750,210,1.9371328298,0.9987029831,0.8949416342,,, +13.1640625000,210,1.9386587320,0.9987029831,0.0099183642,,, +13.1660156250,210,1.9386587320,0.9987029831,0.4814221408,,, +13.1679687500,210,1.9401846342,0.9987029831,0.3868162051,,, +13.1699218750,210,1.9401846342,0.9987029831,0.0984206912,,, +13.1718750000,210,1.9417105364,0.9987029831,0.4036011292,,, +13.1738281250,210,1.9432364385,0.9987029831,0.0694285496,,, +13.1757812500,210,1.9432364385,0.9987029831,0.9071488518,,, +13.1777343750,210,1.9447623407,0.9987029831,0.3227283131,,, +13.1796875000,210,1.9447623407,0.9987029831,0.2296482795,,, +13.1816406250,210,1.9462882429,0.9987029831,0.9971770809,,, +13.1835937500,210,1.9478141451,0.9987029831,0.5271992065,,, +13.1855468750,210,1.9478141451,0.9987029831,0.2555886168,,, +13.1875000000,211,1.9493400473,0.9987029831,0.2845807584,,, +13.1894531250,211,1.9493400473,0.9987029831,0.8415350576,,, +13.1914062500,211,1.9508659495,0.9987029831,0.3181506065,,, +13.1933593750,211,1.9523918517,0.9987029831,0.5897611963,,, +13.1953125000,211,1.9523918517,0.9987029831,0.0450141146,,, +13.1972656250,211,1.9539177539,0.9987029831,0.5348287175,,, +13.1992187500,211,1.9539177539,0.9987029831,0.0434882124,,, +13.2011718750,211,1.9554436561,0.9987029831,0.8644235904,,, +13.2031250000,211,1.9554436561,0.9987029831,0.0175478752,,, +13.2050781250,211,1.9569695583,0.9987029831,0.9239337758,,, +13.2070312500,211,1.9569695583,0.9987029831,0.5607690547,,, +13.2089843750,211,1.9584954604,0.9987029831,0.8934157321,,, +13.2109375000,211,1.9584954604,0.9987029831,0.2479591058,,, +13.2128906250,211,1.9600213626,0.9987029831,0.8018616007,,, +13.2148437500,211,1.9600213626,0.9987029831,0.9559777218,,, +13.2167968750,211,1.9615472648,0.9987029831,0.8995193408,,, +13.2187500000,211,1.9615472648,0.9987029831,0.9925993744,,, +13.2207031250,211,1.9630731670,0.9987029831,0.4066529335,,, +13.2226562500,211,1.9630731670,0.9987029831,0.2723735409,,, +13.2246093750,211,1.9645990692,0.9987029831,0.7209887846,,, +13.2265625000,211,1.9645990692,0.9987029831,0.2220187686,,, +13.2285156250,211,1.9661249714,0.9987029831,0.8094911116,,, +13.2304687500,211,1.9661249714,0.9987029831,0.6981002518,,, +13.2324218750,211,1.9676508736,0.9987029831,0.5073624781,,, +13.2343750000,211,1.9676508736,0.9987029831,0.4188601511,,, +13.2363281250,211,1.9691767758,0.9987029831,0.5302510109,,, +13.2382812500,211,1.9691767758,0.9987029831,0.8598458839,,, +13.2402343750,211,1.9707026780,0.9987029831,0.3837644007,,, +13.2421875000,211,1.9707026780,0.9987029831,0.3166247044,,, +13.2441406250,211,1.9722285801,0.9987029831,0.2464332036,,, +13.2460937500,211,1.9722285801,0.9987029831,0.1060502022,,, +13.2480468750,211,1.9722285801,0.9987029831,0.0801098650,,, +13.2500000000,212,1.9737544823,0.9987029831,0.4386968795,,, +13.2519531250,212,1.9737544823,0.9987029831,0.4753185321,,, +13.2539062500,212,1.9752803845,0.9987029831,0.8323796445,,, +13.2558593750,212,1.9752803845,0.9987029831,0.2983138781,,, +13.2578125000,212,1.9752803845,0.9987029831,0.0053406577,,, +13.2597656250,212,1.9768062867,0.9987029831,0.0190737774,,, +13.2617187500,212,1.9768062867,0.9987029831,0.9575036240,,, +13.2636718750,212,1.9783321889,0.9987029831,0.2525368124,,, +13.2656250000,212,1.9783321889,0.9987029831,0.6401159686,,, +13.2675781250,212,1.9783321889,0.9987029831,0.7209887846,,, +13.2695312500,212,1.9798580911,0.9987029831,0.2922102693,,, +13.2714843750,212,1.9798580911,0.9987029831,0.2738994430,,, +13.2734375000,212,1.9798580911,0.9987029831,0.2998397803,,, +13.2753906250,212,1.9813839933,0.9987029831,0.9254596780,,, +13.2773437500,212,1.9813839933,0.9987029831,0.7362478065,,, +13.2792968750,212,1.9829098955,0.9987029831,0.4203860533,,, +13.2812500000,212,1.9829098955,0.9987029831,0.7850766766,,, +13.2832031250,212,1.9829098955,0.9987029831,0.0968947890,,, +13.2851562500,212,1.9844357977,0.9987029831,0.6752117189,,, +13.2871093750,212,1.9844357977,0.9987029831,0.3044174868,,, +13.2890625000,212,1.9844357977,0.9987029831,0.4478522927,,, +13.2910156250,212,1.9844357977,0.9987029831,0.4036011292,,, +13.2929687500,212,1.9859616999,0.9987029831,0.8522163729,,, +13.2949218750,212,1.9859616999,0.9987029831,0.8735790036,,, +13.2968750000,212,1.9859616999,0.9987029831,0.3669794766,,, +13.2988281250,212,1.9874876020,0.9987029831,0.0083924620,,, +13.3007812500,212,1.9874876020,0.9987029831,0.4951552605,,, +13.3027343750,212,1.9874876020,0.9987029831,0.1487754635,,, +13.3046875000,212,1.9890135042,0.9987029831,0.5699244678,,, +13.3066406250,212,1.9890135042,0.9987029831,0.3547722591,,, +13.3085937500,212,1.9890135042,0.9987029831,0.4081788357,,, +13.3105468750,212,1.9890135042,0.9987029831,0.5455100328,,, +13.3125000000,213,1.9905394064,0.9987029831,0.1686121920,,, +13.3144531250,213,1.9905394064,0.9987029831,0.2601663233,,, +13.3164062500,213,1.9905394064,0.9987029831,0.9681849393,,, +13.3183593750,213,1.9905394064,0.9987029831,0.0785839628,,, +13.3203125000,213,1.9920653086,0.9987029831,0.5226215000,,, +13.3222656250,213,1.9920653086,0.9987029831,0.8003356985,,, +13.3242187500,213,1.9920653086,0.9987029831,0.8949416342,,, +13.3261718750,213,1.9920653086,0.9987029831,0.7652399481,,, +13.3281250000,213,1.9920653086,0.9987029831,0.8354314488,,, +13.3300781250,213,1.9935912108,0.9987029831,0.5668726635,,, +13.3320312500,213,1.9935912108,0.9987029831,0.9086747539,,, +13.3339843750,213,1.9935912108,0.9987029831,0.7530327306,,, +13.3359375000,213,1.9935912108,0.9987029831,0.4341191730,,, +13.3378906250,213,1.9935912108,0.9987029831,0.4951552605,,, +13.3398437500,213,1.9951171130,0.9987029831,0.8751049058,,, +13.3417968750,213,1.9951171130,0.9987029831,0.2830548562,,, +13.3437500000,213,1.9951171130,0.9987029831,0.5012588693,,, +13.3457031250,213,1.9951171130,0.9987029831,0.2265964752,,, +13.3476562500,213,1.9951171130,0.9987029831,0.4127565423,,, +13.3496093750,213,1.9951171130,0.9987029831,0.6874189364,,, +13.3515625000,213,1.9966430152,0.9987029831,0.5165178912,,, +13.3535156250,213,1.9966430152,0.9987029831,0.3715571832,,, +13.3554687500,213,1.9966430152,0.9987029831,0.0267032883,,, +13.3574218750,213,1.9966430152,0.9987029831,0.4234378576,,, +13.3593750000,213,1.9966430152,0.9987029831,0.0114442664,,, +13.3613281250,213,1.9966430152,0.9987029831,0.6050202182,,, +13.3632812500,213,1.9966430152,0.9987029831,0.6721599145,,, +13.3652343750,213,1.9966430152,0.9987029831,0.6889448386,,, +13.3671875000,213,1.9981689174,0.9987029831,0.4814221408,,, +13.3691406250,213,1.9981689174,0.9987029831,0.5485618372,,, +13.3710937500,213,1.9981689174,0.9987029831,0.6218051423,,, +13.3730468750,213,1.9981689174,0.9987029831,0.6813153277,,, +13.3750000000,214,1.9981689174,0.9987029831,0.6126497292,,, +13.3769531250,214,1.9981689174,0.9987029831,0.1625085832,,, +13.3789062500,214,1.9981689174,0.9987029831,0.2586404211,,, +13.3808593750,214,1.9981689174,0.9987029831,0.0633249409,,, +13.3828125000,214,1.9981689174,0.9987029831,0.4570077058,,, +13.3847656250,214,1.9981689174,0.9987029831,0.7148851759,,, +13.3867187500,214,1.9981689174,0.9987029831,0.9712367437,,, +13.3886718750,214,1.9981689174,0.9987029831,0.2555886168,,, +13.3906250000,214,1.9996948196,0.9987029831,0.0968947890,,, +13.3925781250,214,1.9996948196,0.9987029831,0.5470359350,,, +13.3945312500,214,1.9996948196,0.9987029831,0.7743953613,,, +13.3964843750,214,1.9996948196,0.9987029831,0.3471427481,,, +13.3984375000,214,1.9996948196,0.9987029831,0.3028915846,,, +13.4003906250,214,1.9996948196,0.9987029831,0.5912870985,,, +13.4023437500,214,1.9996948196,0.9987029831,0.5043106737,,, +13.4042968750,214,1.9996948196,0.9987029831,0.2464332036,,, +13.4062500000,214,1.9996948196,0.9987029831,0.7057297627,,, +13.4082031250,214,1.9996948196,0.9987029831,0.9849698634,,, +13.4101562500,214,1.9996948196,0.9987029831,0.8140688182,,, +13.4121093750,214,1.9996948196,0.9987029831,0.1014724956,,, +13.4140625000,214,1.9996948196,0.9987029831,0.9071488518,,, +13.4160156250,214,1.9996948196,0.9987029831,0.9437705043,,, +13.4179687500,214,1.9996948196,0.9987029831,0.7179369802,,, +13.4199218750,214,1.9996948196,0.9987029831,0.8216983291,,, +13.4218750000,214,1.9996948196,0.9987029831,0.7789730678,,, +13.4238281250,214,1.9996948196,0.9987029831,0.6965743496,,, +13.4257812500,214,1.9981689174,0.9987029831,0.9559777218,,, +13.4277343750,214,1.9981689174,0.9987029831,0.6279087510,,, +13.4296875000,214,1.9981689174,0.9987029831,0.6736858167,,, +13.4316406250,214,1.9981689174,0.9987029831,0.9651331350,,, +13.4335937500,214,1.9981689174,0.9987029831,0.8445868620,,, +13.4355468750,214,1.9981689174,0.9987029831,0.5821316854,,, +13.4375000000,215,1.9981689174,0.9987029831,0.4264896620,,, +13.4394531250,215,1.9981689174,0.9987029831,0.5302510109,,, +13.4414062500,215,1.9981689174,0.9987029831,0.1106279088,,, +13.4433593750,215,1.9981689174,0.9987029831,0.3135729000,,, +13.4453125000,215,1.9981689174,0.9987029831,0.2784771496,,, +13.4472656250,215,1.9981689174,0.9987029831,0.9193560693,,, +13.4492187500,215,1.9966430152,0.9987029831,0.6584267948,,, +13.4511718750,215,1.9966430152,0.9987029831,0.4188601511,,, +13.4531250000,215,1.9966430152,0.9987029831,0.8461127642,,, +13.4550781250,215,1.9966430152,0.9987029831,0.5043106737,,, +13.4570312500,215,1.9966430152,0.9987029831,0.8491645686,,, +13.4589843750,215,1.9966430152,0.9987029831,0.1106279088,,, +13.4609375000,215,1.9966430152,0.9987029831,0.6736858167,,, +13.4628906250,215,1.9966430152,0.9987029831,0.6141756313,,, +13.4648437500,215,1.9951171130,0.9987029831,0.7835507744,,, +13.4667968750,215,1.9951171130,0.9987029831,0.3257801175,,, +13.4687500000,215,1.9951171130,0.9987029831,0.8461127642,,, +13.4707031250,215,1.9951171130,0.9987029831,0.8003356985,,, +13.4726562500,215,1.9951171130,0.9987029831,0.8796826123,,, +13.4746093750,215,1.9951171130,0.9987029831,0.2891584649,,, +13.4765625000,215,1.9935912108,0.9987029831,0.0251773861,,, +13.4785156250,215,1.9935912108,0.9987029831,0.8262760357,,, +13.4804687500,215,1.9935912108,0.9987029831,0.5073624781,,, +13.4824218750,215,1.9935912108,0.9987029831,0.5271992065,,, +13.4843750000,215,1.9935912108,0.9987029831,0.4859998474,,, +13.4863281250,215,1.9920653086,0.9987029831,0.3166247044,,, +13.4882812500,215,1.9920653086,0.9987029831,0.5287251087,,, +13.4902343750,215,1.9920653086,0.9987029831,0.5058365759,,, +13.4921875000,215,1.9920653086,0.9987029831,0.1777676051,,, +13.4941406250,215,1.9905394064,0.9987029831,0.5516136416,,, +13.4960937500,215,1.9905394064,0.9987029831,0.2327000839,,, +13.4980468750,215,1.9905394064,0.9987029831,0.7804989700,,, +13.5000000000,216,1.9905394064,0.9987029831,0.5745021744,,, +13.5019531250,216,1.9905394064,0.9987029831,0.8583199817,,, +13.5039062500,216,1.9890135042,0.9987029831,0.1258869306,,, +13.5058593750,216,1.9890135042,0.9987029831,0.2983138781,,, +13.5078125000,216,1.9890135042,0.9987029831,0.7911802853,,, +13.5097656250,216,1.9874876020,0.9987029831,0.2555886168,,, +13.5117187500,216,1.9874876020,0.9987029831,0.8796826123,,, +13.5136718750,216,1.9874876020,0.9987029831,0.5394064240,,, +13.5156250000,216,1.9874876020,0.9987029831,0.9483482109,,, +13.5175781250,216,1.9859616999,0.9987029831,0.4600595102,,, +13.5195312500,216,1.9859616999,0.9987029831,0.0755321584,,, +13.5214843750,216,1.9859616999,0.9987029831,0.6736858167,,, +13.5234375000,216,1.9844357977,0.9987029831,0.5897611963,,, +13.5253906250,216,1.9844357977,0.9987029831,0.6630045014,,, +13.5273437500,216,1.9844357977,0.9987029831,0.0434882124,,, +13.5292968750,216,1.9829098955,0.9987029831,0.5882352941,,, +13.5312500000,216,1.9829098955,0.9987029831,0.3883421073,,, +13.5332031250,216,1.9829098955,0.9987029831,0.7850766766,,, +13.5351562500,216,1.9813839933,0.9987029831,0.2525368124,,, +13.5371093750,216,1.9813839933,0.9987029831,0.5836575875,,, +13.5390625000,216,1.9813839933,0.9987029831,0.8506904707,,, +13.5410156250,216,1.9798580911,0.9987029831,0.2342259861,,, +13.5429687500,216,1.9798580911,0.9987029831,0.8125429160,,, +13.5449218750,216,1.9798580911,0.9987029831,0.5867093919,,, +13.5468750000,216,1.9783321889,0.9987029831,0.7545586328,,, +13.5488281250,216,1.9783321889,0.9987029831,0.7789730678,,, +13.5507812500,216,1.9783321889,0.9987029831,0.3898680095,,, +13.5527343750,216,1.9768062867,0.9987029831,0.2800030518,,, +13.5546875000,216,1.9768062867,0.9987029831,0.6904707408,,, +13.5566406250,216,1.9752803845,0.9987029831,0.1106279088,,, +13.5585937500,216,1.9752803845,0.9987029831,0.5607690547,,, +13.5605468750,216,1.9752803845,0.9987029831,0.7743953613,,, +13.5625000000,217,1.9737544823,0.9987029831,0.1731898985,,, +13.5644531250,217,1.9737544823,0.9987029831,0.7484550240,,, +13.5664062500,217,1.9722285801,0.9987029831,0.7362478065,,, +13.5683593750,217,1.9722285801,0.9987029831,0.3318837263,,, +13.5703125000,217,1.9707026780,0.9987029831,0.9819180591,,, +13.5722656250,217,1.9707026780,0.9987029831,0.5226215000,,, +13.5742187500,217,1.9707026780,0.9987029831,0.5607690547,,, +13.5761718750,217,1.9691767758,0.9987029831,0.7209887846,,, +13.5781250000,217,1.9691767758,0.9987029831,0.5806057832,,, +13.5800781250,217,1.9676508736,0.9987029831,0.6950484474,,, +13.5820312500,217,1.9676508736,0.9987029831,0.9285114824,,, +13.5839843750,217,1.9661249714,0.9987029831,0.5531395438,,, +13.5859375000,217,1.9661249714,0.9987029831,0.2616922255,,, +13.5878906250,217,1.9645990692,0.9987029831,0.6675822080,,, +13.5898437500,217,1.9645990692,0.9987029831,0.1869230182,,, +13.5917968750,217,1.9630731670,0.9987029831,0.4097047379,,, +13.5937500000,217,1.9630731670,0.9987029831,0.3715571832,,, +13.5957031250,217,1.9615472648,0.9987029831,0.7484550240,,, +13.5976562500,217,1.9615472648,0.9987029831,0.2037079423,,, +13.5996093750,217,1.9600213626,0.9987029831,0.5577172503,,, +13.6015625000,217,1.9600213626,0.9987029831,0.9636072328,,, +13.6035156250,217,1.9584954604,0.9987029831,0.2555886168,,, +13.6054687500,217,1.9584954604,0.9987029831,0.0083924620,,, +13.6074218750,217,1.9569695583,0.9987029831,0.4966811627,,, +13.6093750000,217,1.9569695583,0.9987029831,0.6630045014,,, +13.6113281250,217,1.9554436561,0.9987029831,0.2098115511,,, +13.6132812500,217,1.9554436561,0.9987029831,0.1716639963,,, +13.6152343750,217,1.9539177539,0.9987029831,0.6034943160,,, +13.6171875000,217,1.9539177539,0.9987029831,0.4203860533,,, +13.6191406250,217,1.9523918517,0.9987029831,0.3028915846,,, +13.6210937500,217,1.9508659495,0.9987029831,0.8690012970,,, +13.6230468750,217,1.9508659495,0.9987029831,0.1701380941,,, +13.6250000000,218,1.9493400473,0.9987029831,0.9269855802,,, +13.6269531250,218,1.9493400473,0.9987029831,0.1869230182,,, +13.6289062500,218,1.9478141451,0.9987029831,0.8812085145,,, +13.6308593750,218,1.9478141451,0.9987029831,0.8003356985,,, +13.6328125000,218,1.9462882429,0.9987029831,0.1777676051,,, +13.6347656250,218,1.9447623407,0.9987029831,0.5485618372,,, +13.6367187500,218,1.9447623407,0.9987029831,0.1945525292,,, +13.6386718750,218,1.9432364385,0.9987029831,0.5104142824,,, +13.6406250000,218,1.9432364385,0.9987029831,0.6645304036,,, +13.6425781250,218,1.9417105364,0.9987029831,0.9575036240,,, +13.6445312500,218,1.9401846342,0.9987029831,0.0267032883,,, +13.6464843750,218,1.9401846342,0.9987029831,0.1960784314,,, +13.6484375000,218,1.9386587320,0.9987029831,0.5775539788,,, +13.6503906250,218,1.9371328298,0.9987029831,0.6965743496,,, +13.6523437500,218,1.9371328298,0.9987029831,0.3700312810,,, +13.6542968750,218,1.9356069276,0.9987029831,0.3288319219,,, +13.6562500000,218,1.9340810254,0.9987029831,0.4951552605,,, +13.6582031250,218,1.9340810254,0.9987029831,0.9834439612,,, +13.6601562500,218,1.9325551232,0.9987029831,0.7194628824,,, +13.6621093750,218,1.9310292210,0.9987029831,0.0450141146,,, +13.6640625000,218,1.9310292210,0.9987029831,0.5973907073,,, +13.6660156250,218,1.9295033188,0.9987029831,0.6706340124,,, +13.6679687500,218,1.9279774166,0.9987029831,0.9864957656,,, +13.6699218750,218,1.9279774166,0.9987029831,0.5821316854,,, +13.6718750000,218,1.9264515145,0.9987029831,0.4554818036,,, +13.6738281250,218,1.9249256123,0.9987029831,0.2662699321,,, +13.6757812500,218,1.9249256123,0.9987029831,0.5729762722,,, +13.6777343750,218,1.9233997101,0.9987029831,0.9529259174,,, +13.6796875000,218,1.9218738079,0.9987029831,0.9361409934,,, +13.6816406250,218,1.9218738079,0.9987029831,0.6965743496,,, +13.6835937500,218,1.9203479057,0.9987029831,0.2159151598,,, +13.6855468750,218,1.9188220035,0.9987029831,0.6263828489,,, +13.6875000000,219,1.9172961013,0.9987029831,0.4859998474,,, +13.6894531250,219,1.9172961013,0.9987029831,0.8064393072,,, +13.6914062500,219,1.9157701991,0.9987029831,0.7881284810,,, +13.6933593750,219,1.9142442969,0.9987029831,0.8842603189,,, +13.6953125000,219,1.9127183948,0.9987029831,0.3807125963,,, +13.6972656250,219,1.9127183948,0.9987029831,0.4264896620,,, +13.6992187500,219,1.9111924926,0.9987029831,0.9132524605,,, +13.7011718750,219,1.9096665904,0.9987029831,0.9727626459,,, +13.7031250000,219,1.9081406882,0.9987029831,0.7164110780,,, +13.7050781250,219,1.9081406882,0.9987029831,0.8567940795,,, +13.7070312500,219,1.9066147860,0.9987029831,0.6630045014,,, +13.7089843750,219,1.9050888838,0.9987029831,0.8567940795,,, +13.7109375000,219,1.9035629816,0.9987029831,0.4966811627,,, +13.7128906250,219,1.9020370794,0.9987029831,0.5058365759,,, +13.7148437500,219,1.9020370794,0.9987029831,0.9452964065,,, +13.7167968750,219,1.9005111772,0.9987029831,0.9956511788,,, +13.7187500000,219,1.8989852750,0.9987029831,0.6263828489,,, +13.7207031250,219,1.8974593729,0.9987029831,0.0282291905,,, +13.7226562500,219,1.8959334707,0.9987029831,0.8339055467,,, +13.7246093750,219,1.8959334707,0.9987029831,0.3028915846,,, +13.7265625000,219,1.8944075685,0.9987029831,0.6553749905,,, +13.7285156250,219,1.8928816663,0.9987029831,0.1457236591,,, +13.7304687500,219,1.8913557641,0.9987029831,0.6843671321,,, +13.7324218750,219,1.8898298619,0.9987029831,0.5317769131,,, +13.7343750000,219,1.8883039597,0.9987029831,0.7637140459,,, +13.7363281250,219,1.8883039597,0.9987029831,0.6950484474,,, +13.7382812500,219,1.8867780575,0.9987029831,0.6294346532,,, +13.7402343750,219,1.8852521553,0.9987029831,0.6706340124,,, +13.7421875000,219,1.8837262531,0.9987029831,0.3578240635,,, +13.7441406250,219,1.8822003510,0.9987029831,0.9987029831,,, +13.7460937500,219,1.8806744488,0.9987029831,0.1029983978,,, +13.7480468750,219,1.8791485466,0.9987029831,0.1014724956,,, +13.7500000000,220,1.8791485466,0.9987029831,0.6385900664,,, +13.7519531250,220,1.8776226444,0.9987029831,0.4600595102,,, +13.7539062500,220,1.8760967422,0.9987029831,0.2449073014,,, +13.7558593750,220,1.8745708400,0.9987029831,0.5683985657,,, +13.7578125000,220,1.8730449378,0.9987029831,0.8842603189,,, +13.7597656250,220,1.8715190356,0.9987029831,0.0465400168,,, +13.7617187500,220,1.8699931334,0.9987029831,0.4371709773,,, +13.7636718750,220,1.8684672313,0.9987029831,0.4585336080,,, +13.7656250000,220,1.8669413291,0.9987029831,0.3715571832,,, +13.7675781250,220,1.8654154269,0.9987029831,0.2647440299,,, +13.7695312500,220,1.8638895247,0.9987029831,0.2571145190,,, +13.7714843750,220,1.8638895247,0.9987029831,0.3868162051,,, +13.7734375000,220,1.8623636225,0.9987029831,0.6340123598,,, +13.7753906250,220,1.8608377203,0.9987029831,0.8491645686,,, +13.7773437500,220,1.8593118181,0.9987029831,0.8384832532,,, +13.7792968750,220,1.8577859159,0.9987029831,0.1029983978,,, +13.7812500000,220,1.8562600137,0.9987029831,0.2265964752,,, +13.7832031250,220,1.8547341115,0.9987029831,0.4905775540,,, +13.7851562500,220,1.8532082094,0.9987029831,0.9971770809,,, +13.7871093750,220,1.8516823072,0.9987029831,0.0022888533,,, +13.7890625000,220,1.8501564050,0.9987029831,0.7484550240,,, +13.7910156250,220,1.8486305028,0.9987029831,0.8888380255,,, +13.7929687500,220,1.8471046006,0.9987029831,0.8354314488,,, +13.7949218750,220,1.8455786984,0.9987029831,0.1319905394,,, +13.7968750000,220,1.8440527962,0.9987029831,0.7545586328,,, +13.7988281250,220,1.8425268940,0.9987029831,0.8293278401,,, +13.8007812500,220,1.8410009918,0.9987029831,0.2708476387,,, +13.8027343750,220,1.8394750896,0.9987029831,0.7988097963,,, +13.8046875000,220,1.8379491875,0.9987029831,0.0328068971,,, +13.8066406250,220,1.8364232853,0.9987029831,0.2159151598,,, +13.8085937500,220,1.8348973831,0.9987029831,0.4875257496,,, +13.8105468750,220,1.8333714809,0.9987029831,0.1243610285,,, +13.8125000000,221,1.8318455787,0.9987029831,0.6309605554,,, +13.8144531250,221,1.8303196765,0.9987029831,0.1518272679,,, +13.8164062500,221,1.8287937743,0.9987029831,0.7621881437,,, +13.8183593750,221,1.8272678721,0.9987029831,0.1411459525,,, +13.8203125000,221,1.8257419699,0.9987029831,0.7591363394,,, +13.8222656250,221,1.8242160678,0.9987029831,0.9727626459,,, +13.8242187500,221,1.8226901656,0.9987029831,0.9224078737,,, +13.8261718750,221,1.8211642634,0.9987029831,0.3639276722,,, +13.8281250000,221,1.8196383612,0.9987029831,0.2464332036,,, +13.8300781250,221,1.8165865568,0.9987029831,0.3486686503,,, +13.8320312500,221,1.8150606546,0.9987029831,0.9483482109,,, +13.8339843750,221,1.8135347524,0.9987029831,0.2815289540,,, +13.8359375000,221,1.8120088502,0.9987029831,0.0358587015,,, +13.8378906250,221,1.8104829480,0.9987029831,0.0328068971,,, +13.8398437500,221,1.8089570459,0.9987029831,0.0801098650,,, +13.8417968750,221,1.8074311437,0.9987029831,0.4463263905,,, +13.8437500000,221,1.8059052415,0.9987029831,0.8705271992,,, +13.8457031250,221,1.8043793393,0.9987029831,0.3013656825,,, +13.8476562500,221,1.8028534371,0.9987029831,0.2159151598,,, +13.8496093750,221,1.8013275349,0.9987029831,0.3608758679,,, +13.8515625000,221,1.7998016327,0.9987029831,0.9163042649,,, +13.8535156250,221,1.7967498283,0.9987029831,0.1777676051,,, +13.8554687500,221,1.7952239261,0.9987029831,0.1503013657,,, +13.8574218750,221,1.7936980240,0.9987029831,0.8308537423,,, +13.8593750000,221,1.7921721218,0.9987029831,0.9010452430,,, +13.8613281250,221,1.7906462196,0.9987029831,0.2494850080,,, +13.8632812500,221,1.7891203174,0.9987029831,0.2876325628,,, +13.8652343750,221,1.7875944152,0.9987029831,0.9727626459,,, +13.8671875000,221,1.7845426108,0.9987029831,0.9178301671,,, +13.8691406250,221,1.7830167086,0.9987029831,0.2357518883,,, +13.8710937500,221,1.7814908064,0.9987029831,0.0312809949,,, +13.8730468750,221,1.7799649042,0.9987029831,0.9529259174,,, +13.8750000000,222,1.7784390021,0.9987029831,0.9941252766,,, +13.8769531250,222,1.7769130999,0.9987029831,0.3944457160,,, +13.8789062500,222,1.7753871977,0.9987029831,0.2113374533,,, +13.8808593750,222,1.7723353933,0.9987029831,0.6187533379,,, +13.8828125000,222,1.7708094911,0.9987029831,0.4951552605,,, +13.8847656250,222,1.7692835889,0.9987029831,0.4478522927,,, +13.8867187500,222,1.7677576867,0.9987029831,0.7042038605,,, +13.8886718750,222,1.7662317845,0.9987029831,0.1731898985,,, +13.8906250000,222,1.7631799802,0.9987029831,0.9636072328,,, +13.8925781250,222,1.7616540780,0.9987029831,0.2571145190,,, +13.8945312500,222,1.7601281758,0.9987029831,0.0175478752,,, +13.8964843750,222,1.7586022736,0.9987029831,0.6019684138,,, +13.8984375000,222,1.7570763714,0.9987029831,0.3608758679,,, +13.9003906250,222,1.7540245670,0.9987029831,0.3807125963,,, +13.9023437500,222,1.7524986648,0.9987029831,0.5409323262,,, +13.9042968750,222,1.7509727626,0.9987029831,0.7209887846,,, +13.9062500000,222,1.7494468605,0.9987029831,0.9254596780,,, +13.9082031250,222,1.7479209583,0.9987029831,0.9788662547,,, +13.9101562500,222,1.7448691539,0.9987029831,0.2265964752,,, +13.9121093750,222,1.7433432517,0.9987029831,0.1579308766,,, +13.9140625000,222,1.7418173495,0.9987029831,0.3440909438,,, +13.9160156250,222,1.7402914473,0.9987029831,0.6767376211,,, +13.9179687500,222,1.7372396429,0.9987029831,0.6569008927,,, +13.9199218750,222,1.7357137407,0.9987029831,0.8232242313,,, +13.9218750000,222,1.7341878386,0.9987029831,0.3913939117,,, +13.9238281250,222,1.7326619364,0.9987029831,0.3318837263,,, +13.9257812500,222,1.7296101320,0.9987029831,0.7255664912,,, +13.9277343750,222,1.7280842298,0.9987029831,0.3593499657,,, +13.9296875000,222,1.7265583276,0.9987029831,0.3852903029,,, +13.9316406250,222,1.7235065232,0.9987029831,0.5882352941,,, +13.9335937500,222,1.7219806210,0.9987029831,0.5958648051,,, +13.9355468750,222,1.7204547189,0.9987029831,0.6416418708,,, +13.9375000000,223,1.7189288167,0.9987029831,0.8369573510,,, +13.9394531250,223,1.7158770123,0.9987029831,0.1411459525,,, +13.9414062500,223,1.7143511101,0.9987029831,0.4615854124,,, +13.9433593750,223,1.7128252079,0.9987029831,0.4692149233,,, +13.9453125000,223,1.7097734035,0.9987029831,0.8232242313,,, +13.9472656250,223,1.7082475013,0.9987029831,0.7560845350,,, +13.9492187500,223,1.7067215991,0.9987029831,0.5378805219,,, +13.9511718750,223,1.7051956970,0.9987029831,0.5363546197,,, +13.9531250000,223,1.7021438926,0.9987029831,0.0129701686,,, +13.9550781250,223,1.7006179904,0.9987029831,0.0099183642,,, +13.9570312500,223,1.6990920882,0.9987029831,0.9925993744,,, +13.9589843750,223,1.6960402838,0.9987029831,0.2784771496,,, +13.9609375000,223,1.6945143816,0.9987029831,0.3456168460,,, +13.9628906250,223,1.6929884794,0.9987029831,0.7743953613,,, +13.9648437500,223,1.6899366751,0.9987029831,0.5714503700,,, +13.9667968750,223,1.6884107729,0.9987029831,0.7423514153,,, +13.9687500000,223,1.6868848707,0.9987029831,0.0724803540,,, +13.9707031250,223,1.6838330663,0.9987029831,0.6538490883,,, +13.9726562500,223,1.6823071641,0.9987029831,0.7194628824,,, +13.9746093750,223,1.6792553597,0.9987029831,0.5531395438,,, +13.9765625000,223,1.6777294575,0.9987029831,0.5241474022,,, +13.9785156250,223,1.6762035554,0.9987029831,0.2708476387,,, +13.9804687500,223,1.6731517510,0.9987029831,0.0053406577,,, +13.9824218750,223,1.6716258488,0.9987029831,0.3608758679,,, +13.9843750000,223,1.6700999466,0.9987029831,0.9330891890,,, +13.9863281250,223,1.6670481422,0.9987029831,0.4142824445,,, +13.9882812500,223,1.6655222400,0.9987029831,0.1441977569,,, +13.9902343750,223,1.6624704356,0.9987029831,0.2800030518,,, +13.9921875000,223,1.6609445335,0.9987029831,0.5134660868,,, +13.9941406250,223,1.6594186313,0.9987029831,0.9102006561,,, +13.9960937500,223,1.6563668269,0.9987029831,0.2906843671,,, +13.9980468750,223,1.6548409247,0.9987029831,0.0602731365,,, +14.0000000000,224,1.6533150225,0.9987029831,0.7621881437,,, +14.0019531250,224,1.6502632181,0.9987029831,0.0129701686,,, +14.0039062500,224,1.6487373159,0.9987029831,0.6294346532,,, +14.0058593750,224,1.6456855116,0.9987029831,0.5027847715,,, +14.0078125000,224,1.6441596094,0.9987029831,0.4081788357,,, +14.0097656250,224,1.6411078050,0.9987029831,0.3593499657,,, +14.0117187500,224,1.6395819028,0.9987029831,0.3456168460,,, +14.0136718750,224,1.6380560006,0.9987029831,0.9361409934,,, +14.0156250000,224,1.6350041962,0.9987029831,0.2342259861,,, +14.0175781250,224,1.6334782940,0.9987029831,0.9681849393,,, +14.0195312500,224,1.6304264897,0.9987029831,0.8964675364,,, +14.0214843750,224,1.6289005875,0.9987029831,0.5210955978,,, +14.0234375000,224,1.6258487831,0.9987029831,0.7591363394,,, +14.0253906250,224,1.6243228809,0.9987029831,0.6797894255,,, +14.0273437500,224,1.6227969787,0.9987029831,0.7118333715,,, +14.0292968750,224,1.6197451743,0.9987029831,0.2937361715,,, +14.0312500000,224,1.6182192721,0.9987029831,0.2601663233,,, +14.0332031250,224,1.6151674678,0.9987029831,0.0251773861,,, +14.0351562500,224,1.6136415656,0.9987029831,0.7804989700,,, +14.0371093750,224,1.6105897612,0.9987029831,0.7240405890,,, +14.0390625000,224,1.6090638590,0.9987029831,0.8674753948,,, +14.0410156250,224,1.6060120546,0.9987029831,0.9803921569,,, +14.0429687500,224,1.6044861524,0.9987029831,0.7057297627,,, +14.0449218750,224,1.6014343481,0.9987029831,0.1472495613,,, +14.0468750000,224,1.5999084459,0.9987029831,0.8583199817,,, +14.0488281250,224,1.5968566415,0.9987029831,0.8354314488,,, +14.0507812500,224,1.5953307393,0.9987029831,0.7240405890,,, +14.0527343750,224,1.5922789349,0.9987029831,0.5073624781,,, +14.0546875000,224,1.5907530327,0.9987029831,0.1258869306,,, +14.0566406250,224,1.5877012284,0.9987029831,0.5912870985,,, +14.0585937500,224,1.5861753262,0.9987029831,0.1197833219,,, +14.0605468750,224,1.5831235218,0.9987029831,0.7057297627,,, +14.0625000000,225,1.5815976196,0.9987029831,0.2418554971,,, +14.0644531250,225,1.5785458152,0.9987029831,0.9681849393,,, +14.0664062500,225,1.5770199130,0.9987029831,0.1701380941,,, +14.0683593750,225,1.5739681086,0.9987029831,0.7087815671,,, +14.0703125000,225,1.5724422065,0.9987029831,0.7362478065,,, +14.0722656250,225,1.5693904021,0.9987029831,0.1579308766,,, +14.0742187500,225,1.5678644999,0.9987029831,0.7591363394,,, +14.0761718750,225,1.5648126955,0.9987029831,0.4783703365,,, +14.0781250000,225,1.5632867933,0.9987029831,0.8873121233,,, +14.0800781250,225,1.5602349889,0.9987029831,0.2616922255,,, +14.0820312500,225,1.5587090867,0.9987029831,0.0358587015,,, +14.0839843750,225,1.5556572824,0.9987029831,0.4921034562,,, +14.0859375000,225,1.5541313802,0.9987029831,0.6004425116,,, +14.0878906250,225,1.5510795758,0.9987029831,0.7423514153,,, +14.0898437500,225,1.5495536736,0.9987029831,0.8049134051,,, +14.0917968750,225,1.5465018692,0.9987029831,0.0984206912,,, +14.0937500000,225,1.5434500649,0.9987029831,0.9346150912,,, +14.0957031250,225,1.5419241627,0.9987029831,0.6111238270,,, +14.0976562500,225,1.5388723583,0.9987029831,0.2708476387,,, +14.0996093750,225,1.5373464561,0.9987029831,0.5897611963,,, +14.1015625000,225,1.5342946517,0.9987029831,0.3868162051,,, +14.1035156250,225,1.5327687495,0.9987029831,0.0785839628,,, +14.1054687500,225,1.5297169451,0.9987029831,0.2494850080,,, +14.1074218750,225,1.5266651408,0.9987029831,0.9315632868,,, +14.1093750000,225,1.5251392386,0.9987029831,0.9376668956,,, +14.1113281250,225,1.5220874342,0.9987029831,0.8690012970,,, +14.1132812500,225,1.5205615320,0.9987029831,0.5317769131,,, +14.1152343750,225,1.5175097276,0.9987029831,0.9498741131,,, +14.1171875000,225,1.5159838254,0.9987029831,0.0709544518,,, +14.1191406250,225,1.5129320211,0.9987029831,0.7896543832,,, +14.1210937500,225,1.5098802167,0.9987029831,0.8125429160,,, +14.1230468750,225,1.5083543145,0.9987029831,0.1869230182,,, +14.1250000000,226,1.5053025101,0.9987029831,0.6233310445,,, +14.1269531250,226,1.5037766079,0.9987029831,0.7042038605,,, +14.1289062500,226,1.5007248035,0.9987029831,0.6889448386,,, +14.1308593750,226,1.4976729992,0.9987029831,0.5622949569,,, +14.1328125000,226,1.4961470970,0.9987029831,0.6630045014,,, +14.1347656250,226,1.4930952926,0.9987029831,0.0999465934,,, +14.1367187500,226,1.4915693904,0.9987029831,0.4325932708,,, +14.1386718750,226,1.4885175860,0.9987029831,0.4249637598,,, +14.1406250000,226,1.4854657816,0.9987029831,0.1899748226,,, +14.1425781250,226,1.4839398795,0.9987029831,0.5882352941,,, +14.1445312500,226,1.4808880751,0.9987029831,0.9468223087,,, +14.1464843750,226,1.4778362707,0.9987029831,0.5775539788,,, +14.1484375000,226,1.4763103685,0.9987029831,0.9117265583,,, +14.1503906250,226,1.4732585641,0.9987029831,0.9758144503,,, +14.1523437500,226,1.4717326619,0.9987029831,0.2952620737,,, +14.1542968750,226,1.4686808576,0.9987029831,0.7255664912,,, +14.1562500000,226,1.4656290532,0.9987029831,0.0633249409,,, +14.1582031250,226,1.4641031510,0.9987029831,0.5348287175,,, +14.1601562500,226,1.4610513466,0.9987029831,0.2845807584,,, +14.1621093750,226,1.4579995422,0.9987029831,0.7499809262,,, +14.1640625000,226,1.4564736400,0.9987029831,0.9498741131,,, +14.1660156250,226,1.4534218357,0.9987029831,0.3715571832,,, +14.1679687500,226,1.4503700313,0.9987029831,0.6050202182,,, +14.1699218750,226,1.4488441291,0.9987029831,0.6904707408,,, +14.1718750000,226,1.4457923247,0.9987029831,0.3364614328,,, +14.1738281250,226,1.4427405203,0.9987029831,0.4600595102,,, +14.1757812500,226,1.4412146181,0.9987029831,0.9559777218,,, +14.1777343750,226,1.4381628138,0.9987029831,0.2128633555,,, +14.1796875000,226,1.4351110094,0.9987029831,0.9254596780,,, +14.1816406250,226,1.4335851072,0.9987029831,0.9971770809,,, +14.1835937500,226,1.4305333028,0.9987029831,0.6080720226,,, +14.1855468750,226,1.4274814984,0.9987029831,0.0572213321,,, +14.1875000000,227,1.4259555962,0.9987029831,0.3791866941,,, +14.1894531250,227,1.4229037919,0.9987029831,0.8232242313,,, +14.1914062500,227,1.4198519875,0.9987029831,0.8171206226,,, +14.1933593750,227,1.4183260853,0.9987029831,0.2754253452,,, +14.1953125000,227,1.4152742809,0.9987029831,0.8720531014,,, +14.1972656250,227,1.4122224765,0.9987029831,0.0831616693,,, +14.1992187500,227,1.4106965743,0.9987029831,0.5668726635,,, +14.2011718750,227,1.4076447700,0.9987029831,0.3639276722,,, +14.2031250000,227,1.4045929656,0.9987029831,0.0679026474,,, +14.2050781250,227,1.4030670634,0.9987029831,0.3135729000,,, +14.2070312500,227,1.4000152590,0.9987029831,0.6294346532,,, +14.2089843750,227,1.3969634546,0.9987029831,0.6324864576,,, +14.2109375000,227,1.3939116503,0.9987029831,0.9788662547,,, +14.2128906250,227,1.3923857481,0.9987029831,0.6111238270,,, +14.2148437500,227,1.3893339437,0.9987029831,0.3150988022,,, +14.2167968750,227,1.3862821393,0.9987029831,0.1960784314,,, +14.2187500000,227,1.3847562371,0.9987029831,0.3974975204,,, +14.2207031250,227,1.3817044327,0.9987029831,0.6584267948,,, +14.2226562500,227,1.3786526284,0.9987029831,0.4341191730,,, +14.2246093750,227,1.3756008240,0.9987029831,0.6385900664,,, +14.2265625000,227,1.3740749218,0.9987029831,0.8033875029,,, +14.2285156250,227,1.3710231174,0.9987029831,0.2723735409,,, +14.2304687500,227,1.3679713130,0.9987029831,0.2891584649,,, +14.2324218750,227,1.3664454108,0.9987029831,0.3608758679,,, +14.2343750000,227,1.3633936065,0.9987029831,0.8552681773,,, +14.2363281250,227,1.3603418021,0.9987029831,0.5165178912,,, +14.2382812500,227,1.3572899977,0.9987029831,0.5302510109,,, +14.2402343750,227,1.3557640955,0.9987029831,0.9864957656,,, +14.2421875000,227,1.3527122911,0.9987029831,0.6706340124,,, +14.2441406250,227,1.3496604868,0.9987029831,0.1411459525,,, +14.2460937500,227,1.3466086824,0.9987029831,0.3028915846,,, +14.2480468750,227,1.3450827802,0.9987029831,0.6553749905,,, +14.2500000000,228,1.3420309758,0.9987029831,0.2601663233,,, +14.2519531250,228,1.3389791714,0.9987029831,0.2464332036,,, +14.2539062500,228,1.3359273671,0.9987029831,0.5149919890,,, +14.2558593750,228,1.3344014649,0.9987029831,0.5317769131,,, +14.2578125000,228,1.3313496605,0.9987029831,0.6263828489,,, +14.2597656250,228,1.3282978561,0.9987029831,0.6141756313,,, +14.2617187500,228,1.3252460517,0.9987029831,0.1289387350,,, +14.2636718750,228,1.3237201495,0.9987029831,0.5729762722,,, +14.2656250000,228,1.3206683452,0.9987029831,0.6553749905,,, +14.2675781250,228,1.3176165408,0.9987029831,0.2372777905,,, +14.2695312500,228,1.3145647364,0.9987029831,0.9208819715,,, +14.2714843750,228,1.3130388342,0.9987029831,0.6019684138,,, +14.2734375000,228,1.3099870298,0.9987029831,0.8094911116,,, +14.2753906250,228,1.3069352255,0.9987029831,0.1075761044,,, +14.2773437500,228,1.3038834211,0.9987029831,0.1808194095,,, +14.2792968750,228,1.3023575189,0.9987029831,0.1838712139,,, +14.2812500000,228,1.2993057145,0.9987029831,0.9300373846,,, +14.2832031250,228,1.2962539101,0.9987029831,0.8827344167,,, +14.2851562500,228,1.2932021057,0.9987029831,0.8751049058,,, +14.2871093750,228,1.2916762036,0.9987029831,0.5912870985,,, +14.2890625000,228,1.2886243992,0.9987029831,0.8583199817,,, +14.2910156250,228,1.2855725948,0.9987029831,0.3700312810,,, +14.2929687500,228,1.2825207904,0.9987029831,0.6263828489,,, +14.2949218750,228,1.2794689860,0.9987029831,0.3120469978,,, +14.2968750000,228,1.2779430838,0.9987029831,0.2952620737,,, +14.2988281250,228,1.2748912795,0.9987029831,0.0617990387,,, +14.3007812500,228,1.2718394751,0.9987029831,0.0984206912,,, +14.3027343750,228,1.2687876707,0.9987029831,0.7270923934,,, +14.3046875000,228,1.2672617685,0.9987029831,0.4066529335,,, +14.3066406250,228,1.2642099641,0.9987029831,0.6599526970,,, +14.3085937500,228,1.2611581598,0.9987029831,0.6492713817,,, +14.3105468750,228,1.2581063554,0.9987029831,0.6813153277,,, +14.3125000000,229,1.2550545510,0.9987029831,0.5653467613,,, +14.3144531250,229,1.2535286488,0.9987029831,0.0602731365,,, +14.3164062500,229,1.2504768444,0.9987029831,0.2143892576,,, +14.3183593750,229,1.2474250401,0.9987029831,0.1747158007,,, +14.3203125000,229,1.2443732357,0.9987029831,0.1747158007,,, +14.3222656250,229,1.2413214313,0.9987029831,0.9727626459,,, +14.3242187500,229,1.2397955291,0.9987029831,0.8720531014,,, +14.3261718750,229,1.2367437247,0.9987029831,0.0892652781,,, +14.3281250000,229,1.2336919203,0.9987029831,0.1777676051,,, +14.3300781250,229,1.2306401160,0.9987029831,0.3227283131,,, +14.3320312500,229,1.2275883116,0.9987029831,0.7042038605,,, +14.3339843750,229,1.2260624094,0.9987029831,0.7469291218,,, +14.3359375000,229,1.2230106050,0.9987029831,0.1121538109,,, +14.3378906250,229,1.2199588006,0.9987029831,0.0541695277,,, +14.3398437500,229,1.2169069963,0.9987029831,0.0038147555,,, +14.3417968750,229,1.2138551919,0.9987029831,0.5821316854,,, +14.3437500000,229,1.2123292897,0.9987029831,0.8491645686,,, +14.3457031250,229,1.2092774853,0.9987029831,0.0526436255,,, +14.3476562500,229,1.2062256809,0.9987029831,0.2967879759,,, +14.3496093750,229,1.2031738766,0.9987029831,0.9376668956,,, +14.3515625000,229,1.2001220722,0.9987029831,0.3028915846,,, +14.3535156250,229,1.1970702678,0.9987029831,0.4112306401,,, +14.3554687500,229,1.1955443656,0.9987029831,0.1930266270,,, +14.3574218750,229,1.1924925612,0.9987029831,0.3440909438,,, +14.3593750000,229,1.1894407568,0.9987029831,0.8888380255,,, +14.3613281250,229,1.1863889525,0.9987029831,0.9498741131,,, +14.3632812500,229,1.1833371481,0.9987029831,0.1869230182,,, +14.3652343750,229,1.1818112459,0.9987029831,0.8979934386,,, +14.3671875000,229,1.1787594415,0.9987029831,0.2464332036,,, +14.3691406250,229,1.1757076371,0.9987029831,0.5165178912,,, +14.3710937500,229,1.1726558328,0.9987029831,0.1319905394,,, +14.3730468750,229,1.1696040284,0.9987029831,0.7331960021,,, +14.3750000000,230,1.1665522240,0.9987029831,0.7484550240,,, +14.3769531250,230,1.1650263218,0.9987029831,0.6187533379,,, +14.3789062500,230,1.1619745174,0.9987029831,0.2540627146,,, +14.3808593750,230,1.1589227131,0.9987029831,0.5256733043,,, +14.3828125000,230,1.1558709087,0.9987029831,0.0831616693,,, +14.3847656250,230,1.1528191043,0.9987029831,0.6736858167,,, +14.3867187500,230,1.1497672999,0.9987029831,0.6324864576,,, +14.3886718750,230,1.1482413977,0.9987029831,0.3669794766,,, +14.3906250000,230,1.1451895933,0.9987029831,0.3822384985,,, +14.3925781250,230,1.1421377890,0.9987029831,0.1182574197,,, +14.3945312500,230,1.1390859846,0.9987029831,0.5882352941,,, +14.3964843750,230,1.1360341802,0.9987029831,0.8094911116,,, +14.3984375000,230,1.1329823758,0.9987029831,0.6126497292,,, +14.4003906250,230,1.1314564736,0.9987029831,0.9483482109,,, +14.4023437500,230,1.1284046693,0.9987029831,0.8796826123,,, +14.4042968750,230,1.1253528649,0.9987029831,0.9346150912,,, +14.4062500000,230,1.1223010605,0.9987029831,0.8964675364,,, +14.4082031250,230,1.1192492561,0.9987029831,0.1838712139,,, +14.4101562500,230,1.1161974517,0.9987029831,0.0999465934,,, +14.4121093750,230,1.1146715496,0.9987029831,0.7927061875,,, +14.4140625000,230,1.1116197452,0.9987029831,0.5867093919,,, +14.4160156250,230,1.1085679408,0.9987029831,0.3913939117,,, +14.4179687500,230,1.1055161364,0.9987029831,0.9330891890,,, +14.4199218750,230,1.1024643320,0.9987029831,0.1853971160,,, +14.4218750000,230,1.0994125277,0.9987029831,0.1441977569,,, +14.4238281250,230,1.0978866255,0.9987029831,0.8033875029,,, +14.4257812500,230,1.0948348211,0.9987029831,0.2998397803,,, +14.4277343750,230,1.0917830167,0.9987029831,0.0846875715,,, +14.4296875000,230,1.0887312123,0.9987029831,0.8079652094,,, +14.4316406250,230,1.0856794079,0.9987029831,0.9849698634,,, +14.4335937500,230,1.0826276036,0.9987029831,0.4875257496,,, +14.4355468750,230,1.0795757992,0.9987029831,0.5592431525,,, +14.4375000000,231,1.0780498970,0.9987029831,0.9361409934,,, +14.4394531250,231,1.0749980926,0.9987029831,0.0007629511,,, +14.4414062500,231,1.0719462882,0.9987029831,0.9544518196,,, +14.4433593750,231,1.0688944839,0.9987029831,0.0801098650,,, +14.4453125000,231,1.0658426795,0.9987029831,0.1350423438,,, +14.4472656250,231,1.0627908751,0.9987029831,0.5531395438,,, +14.4492187500,231,1.0597390707,0.9987029831,0.2021820401,,, +14.4511718750,231,1.0582131685,0.9987029831,0.7560845350,,, +14.4531250000,231,1.0551613642,0.9987029831,0.2265964752,,, +14.4550781250,231,1.0521095598,0.9987029831,0.1426718547,,, +14.4570312500,231,1.0490577554,0.9987029831,0.1701380941,,, +14.4589843750,231,1.0460059510,0.9987029831,0.3669794766,,, +14.4609375000,231,1.0429541466,0.9987029831,0.3303578241,,, +14.4628906250,231,1.0414282444,0.9987029831,0.6843671321,,, +14.4648437500,231,1.0383764401,0.9987029831,0.9575036240,,, +14.4667968750,231,1.0353246357,0.9987029831,0.2479591058,,, +14.4687500000,231,1.0322728313,0.9987029831,0.6065461204,,, +14.4707031250,231,1.0292210269,0.9987029831,0.3181506065,,, +14.4726562500,231,1.0261692226,0.9987029831,0.9483482109,,, +14.4746093750,231,1.0231174182,0.9987029831,0.9803921569,,, +14.4765625000,231,1.0215915160,0.9987029831,0.1152056153,,, +14.4785156250,231,1.0185397116,0.9987029831,0.5683985657,,, +14.4804687500,231,1.0154879072,0.9987029831,0.7774471656,,, +14.4824218750,231,1.0124361028,0.9987029831,0.3852903029,,, +14.4843750000,231,1.0093842985,0.9987029831,0.4020752270,,, +14.4863281250,231,1.0063324941,0.9987029831,0.5317769131,,, +14.4882812500,231,1.0032806897,0.9987029831,0.8339055467,,, +14.4902343750,231,1.0017547875,0.9987029831,0.1487754635,,, +14.4921875000,231,0.9987029831,-0.0007629511,0.9102006561,,, +14.4941406250,231,0.9956511788,-0.0007629511,0.2830548562,,, +14.4960937500,231,0.9925993744,-0.0007629511,0.0953688869,,, +14.4980468750,231,0.9895475700,-0.0007629511,0.3776607919,,, +14.5000000000,232,0.9864957656,-0.0007629511,0.5531395438,,, +14.5019531250,232,0.9834439612,-0.0007629511,0.1991302358,,, +14.5039062500,232,0.9819180591,-0.0007629511,0.3150988022,,, +14.5058593750,232,0.9788662547,-0.0007629511,0.3791866941,,, +14.5078125000,232,0.9758144503,-0.0007629511,0.6218051423,,, +14.5097656250,232,0.9727626459,-0.0007629511,0.2769512474,,, +14.5117187500,232,0.9697108415,-0.0007629511,0.0602731365,,, +14.5136718750,232,0.9666590372,-0.0007629511,0.4219119554,,, +14.5156250000,232,0.9636072328,-0.0007629511,0.3196765087,,, +14.5175781250,232,0.9620813306,-0.0007629511,0.9437705043,,, +14.5195312500,232,0.9590295262,-0.0007629511,0.7316700999,,, +14.5214843750,232,0.9559777218,-0.0007629511,0.2189669642,,, +14.5234375000,232,0.9529259174,-0.0007629511,0.0190737774,,, +14.5253906250,232,0.9498741131,-0.0007629511,0.0251773861,,, +14.5273437500,232,0.9468223087,-0.0007629511,0.2571145190,,, +14.5292968750,232,0.9452964065,-0.0007629511,0.5928130007,,, +14.5312500000,232,0.9422446021,-0.0007629511,0.1411459525,,, +14.5332031250,232,0.9391927977,-0.0007629511,0.7179369802,,, +14.5351562500,232,0.9361409934,-0.0007629511,0.6080720226,,, +14.5371093750,232,0.9330891890,-0.0007629511,0.2769512474,,, +14.5390625000,232,0.9300373846,-0.0007629511,0.2555886168,,, +14.5410156250,232,0.9269855802,-0.0007629511,0.9620813306,,, +14.5429687500,232,0.9254596780,-0.0007629511,0.1915007248,,, +14.5449218750,232,0.9224078737,-0.0007629511,0.1091020066,,, +14.5468750000,232,0.9193560693,-0.0007629511,0.5378805219,,, +14.5488281250,232,0.9163042649,-0.0007629511,0.4371709773,,, +14.5507812500,232,0.9132524605,-0.0007629511,0.3456168460,,, +14.5527343750,232,0.9102006561,-0.0007629511,0.5149919890,,, +14.5546875000,232,0.9071488518,-0.0007629511,0.3807125963,,, +14.5566406250,232,0.9056229496,-0.0007629511,0.1915007248,,, +14.5585937500,232,0.9025711452,-0.0007629511,0.5516136416,,, +14.5605468750,232,0.8995193408,-0.0007629511,0.8934157321,,, +14.5625000000,233,0.8964675364,-0.0007629511,0.3639276722,,, +14.5644531250,233,0.8934157321,-0.0007629511,0.7682917525,,, +14.5664062500,233,0.8903639277,-0.0007629511,0.2525368124,,, +14.5683593750,233,0.8888380255,-0.0007629511,0.3761348898,,, +14.5703125000,233,0.8857862211,-0.0007629511,0.0144960708,,, +14.5722656250,233,0.8827344167,-0.0007629511,0.5943389029,,, +14.5742187500,233,0.8796826123,-0.0007629511,0.7545586328,,, +14.5761718750,233,0.8766308080,-0.0007629511,0.9361409934,,, +14.5781250000,233,0.8735790036,-0.0007629511,0.0083924620,,, +14.5800781250,233,0.8720531014,-0.0007629511,0.6858930343,,, +14.5820312500,233,0.8690012970,-0.0007629511,0.3044174868,,, +14.5839843750,233,0.8659494926,-0.0007629511,0.2769512474,,, +14.5859375000,233,0.8628976883,-0.0007629511,0.0633249409,,, +14.5878906250,233,0.8598458839,-0.0007629511,0.0465400168,,, +14.5898437500,233,0.8567940795,-0.0007629511,0.8659494926,,, +14.5917968750,233,0.8537422751,-0.0007629511,0.5653467613,,, +14.5937500000,233,0.8522163729,-0.0007629511,0.9376668956,,, +14.5957031250,233,0.8491645686,-0.0007629511,0.8018616007,,, +14.5976562500,233,0.8461127642,-0.0007629511,0.2662699321,,, +14.5996093750,233,0.8430609598,-0.0007629511,0.8674753948,,, +14.6015625000,233,0.8400091554,-0.0007629511,0.3624017700,,, +14.6035156250,233,0.8384832532,-0.0007629511,0.5027847715,,, +14.6054687500,233,0.8354314488,-0.0007629511,0.9864957656,,, +14.6074218750,233,0.8323796445,-0.0007629511,0.7408255131,,, +14.6093750000,233,0.8293278401,-0.0007629511,0.4798962387,,, +14.6113281250,233,0.8262760357,-0.0007629511,0.7240405890,,, +14.6132812500,233,0.8232242313,-0.0007629511,0.7545586328,,, +14.6152343750,233,0.8216983291,-0.0007629511,0.6050202182,,, +14.6171875000,233,0.8186465248,-0.0007629511,0.0541695277,,, +14.6191406250,233,0.8155947204,-0.0007629511,0.0938429847,,, +14.6210937500,233,0.8125429160,-0.0007629511,0.6981002518,,, +14.6230468750,233,0.8094911116,-0.0007629511,0.0602731365,,, +14.6250000000,234,0.8064393072,-0.0007629511,0.1915007248,,, +14.6269531250,234,0.8049134051,-0.0007629511,0.7301441978,,, +14.6289062500,234,0.8018616007,-0.0007629511,0.5058365759,,, +14.6308593750,234,0.7988097963,-0.0007629511,0.8751049058,,, +14.6328125000,234,0.7957579919,-0.0007629511,0.1701380941,,, +14.6347656250,234,0.7927061875,-0.0007629511,0.6691081102,,, +14.6367187500,234,0.7911802853,-0.0007629511,0.4249637598,,, +14.6386718750,234,0.7881284810,-0.0007629511,0.4097047379,,, +14.6406250000,234,0.7850766766,-0.0007629511,0.9544518196,,, +14.6425781250,234,0.7820248722,-0.0007629511,0.5333028153,,, +14.6445312500,234,0.7789730678,-0.0007629511,0.1625085832,,, +14.6464843750,234,0.7759212634,-0.0007629511,0.4585336080,,, +14.6484375000,234,0.7743953613,-0.0007629511,0.9849698634,,, +14.6503906250,234,0.7713435569,-0.0007629511,0.0877393759,,, +14.6523437500,234,0.7682917525,-0.0007629511,0.2128633555,,, +14.6542968750,234,0.7652399481,-0.0007629511,0.1899748226,,, +14.6562500000,234,0.7621881437,-0.0007629511,0.5836575875,,, +14.6582031250,234,0.7606622416,-0.0007629511,0.8583199817,,, +14.6601562500,234,0.7576104372,-0.0007629511,0.5882352941,,, +14.6621093750,234,0.7545586328,-0.0007629511,0.3593499657,,, +14.6640625000,234,0.7515068284,-0.0007629511,0.1716639963,,, +14.6660156250,234,0.7484550240,-0.0007629511,0.8323796445,,, +14.6679687500,234,0.7469291218,-0.0007629511,0.9697108415,,, +14.6699218750,234,0.7438773175,-0.0007629511,0.8278019379,,, +14.6718750000,234,0.7408255131,-0.0007629511,0.9300373846,,, +14.6738281250,234,0.7377737087,-0.0007629511,0.0846875715,,, +14.6757812500,234,0.7362478065,-0.0007629511,0.9239337758,,, +14.6777343750,234,0.7331960021,-0.0007629511,0.2906843671,,, +14.6796875000,234,0.7301441978,-0.0007629511,0.7789730678,,, +14.6816406250,234,0.7270923934,-0.0007629511,0.6340123598,,, +14.6835937500,234,0.7240405890,-0.0007629511,0.2494850080,,, +14.6855468750,234,0.7225146868,-0.0007629511,0.2952620737,,, +14.6875000000,235,0.7194628824,-0.0007629511,0.0495918212,,, +14.6894531250,235,0.7164110780,-0.0007629511,0.0282291905,,, +14.6914062500,235,0.7133592737,-0.0007629511,0.4997329671,,, +14.6933593750,235,0.7103074693,-0.0007629511,0.3776607919,,, +14.6953125000,235,0.7087815671,-0.0007629511,0.0846875715,,, +14.6972656250,235,0.7057297627,-0.0007629511,0.0587472343,,, +14.6992187500,235,0.7026779583,-0.0007629511,0.9864957656,,, +14.7011718750,235,0.6996261540,-0.0007629511,0.1274128328,,, +14.7031250000,235,0.6981002518,-0.0007629511,0.8247501335,,, +14.7050781250,235,0.6950484474,-0.0007629511,0.7499809262,,, +14.7070312500,235,0.6919966430,-0.0007629511,0.8384832532,,, +14.7089843750,235,0.6889448386,-0.0007629511,0.0450141146,,, +14.7109375000,235,0.6874189364,-0.0007629511,0.4509040970,,, +14.7128906250,235,0.6843671321,-0.0007629511,0.7255664912,,, +14.7148437500,235,0.6813153277,-0.0007629511,0.1411459525,,, +14.7167968750,235,0.6782635233,-0.0007629511,0.9407186999,,, +14.7187500000,235,0.6767376211,-0.0007629511,0.3089951934,,, +14.7207031250,235,0.6736858167,-0.0007629511,0.1518272679,,, +14.7226562500,235,0.6706340124,-0.0007629511,0.9651331350,,, +14.7246093750,235,0.6675822080,-0.0007629511,0.9361409934,,, +14.7265625000,235,0.6660563058,-0.0007629511,0.3089951934,,, +14.7285156250,235,0.6630045014,-0.0007629511,0.1380941482,,, +14.7304687500,235,0.6599526970,-0.0007629511,0.3303578241,,, +14.7324218750,235,0.6569008927,-0.0007629511,0.2311741817,,, +14.7343750000,235,0.6553749905,-0.0007629511,0.0740062562,,, +14.7363281250,235,0.6523231861,-0.0007629511,0.2327000839,,, +14.7382812500,235,0.6492713817,-0.0007629511,0.5607690547,,, +14.7402343750,235,0.6462195773,-0.0007629511,0.6446936751,,, +14.7421875000,235,0.6446936751,-0.0007629511,0.6340123598,,, +14.7441406250,235,0.6416418708,-0.0007629511,0.2479591058,,, +14.7460937500,235,0.6385900664,-0.0007629511,0.4463263905,,, +14.7480468750,235,0.6355382620,-0.0007629511,0.0419623102,,, +14.7500000000,236,0.6340123598,-0.0007629511,0.0205996796,,, +14.7519531250,236,0.6309605554,-0.0007629511,0.7438773175,,, +14.7539062500,236,0.6279087510,-0.0007629511,0.8888380255,,, +14.7558593750,236,0.6263828489,-0.0007629511,0.8232242313,,, +14.7578125000,236,0.6233310445,-0.0007629511,0.7408255131,,, +14.7597656250,236,0.6202792401,-0.0007629511,0.4417486839,,, +14.7617187500,236,0.6172274357,-0.0007629511,0.9529259174,,, +14.7636718750,236,0.6157015335,-0.0007629511,0.9254596780,,, +14.7656250000,236,0.6126497292,-0.0007629511,0.4142824445,,, +14.7675781250,236,0.6095979248,-0.0007629511,0.2738994430,,, +14.7695312500,236,0.6080720226,-0.0007629511,0.0160219730,,, +14.7714843750,236,0.6050202182,-0.0007629511,0.6691081102,,, +14.7734375000,236,0.6019684138,-0.0007629511,0.4814221408,,, +14.7753906250,236,0.5989166094,-0.0007629511,0.7911802853,,, +14.7773437500,236,0.5973907073,-0.0007629511,0.0663767453,,, +14.7792968750,236,0.5943389029,-0.0007629511,0.6874189364,,, +14.7812500000,236,0.5912870985,-0.0007629511,0.9193560693,,, +14.7832031250,236,0.5897611963,-0.0007629511,0.4402227817,,, +14.7851562500,236,0.5867093919,-0.0007629511,0.9758144503,,, +14.7871093750,236,0.5836575875,-0.0007629511,0.9895475700,,, +14.7890625000,236,0.5821316854,-0.0007629511,0.5424582284,,, +14.7910156250,236,0.5790798810,-0.0007629511,0.6233310445,,, +14.7929687500,236,0.5760280766,-0.0007629511,0.6752117189,,, +14.7949218750,236,0.5745021744,-0.0007629511,0.7484550240,,, +14.7968750000,236,0.5714503700,-0.0007629511,0.4402227817,,, +14.7988281250,236,0.5683985657,-0.0007629511,0.1472495613,,, +14.8007812500,236,0.5653467613,-0.0007629511,0.4020752270,,, +14.8027343750,236,0.5638208591,-0.0007629511,0.1152056153,,, +14.8046875000,236,0.5607690547,-0.0007629511,0.8506904707,,, +14.8066406250,236,0.5577172503,-0.0007629511,0.6630045014,,, +14.8085937500,236,0.5561913481,-0.0007629511,0.9849698634,,, +14.8105468750,236,0.5531395438,-0.0007629511,0.4158083467,,, +14.8125000000,237,0.5516136416,-0.0007629511,0.8796826123,,, +14.8144531250,237,0.5485618372,-0.0007629511,0.7057297627,,, +14.8164062500,237,0.5455100328,-0.0007629511,0.3974975204,,, +14.8183593750,237,0.5439841306,-0.0007629511,0.8400091554,,, +14.8203125000,237,0.5409323262,-0.0007629511,0.7179369802,,, +14.8222656250,237,0.5378805219,-0.0007629511,0.6675822080,,, +14.8242187500,237,0.5363546197,-0.0007629511,0.8812085145,,, +14.8261718750,237,0.5333028153,-0.0007629511,0.3150988022,,, +14.8281250000,237,0.5302510109,-0.0007629511,0.4631113146,,, +14.8300781250,237,0.5287251087,-0.0007629511,0.4280155642,,, +14.8320312500,237,0.5256733043,-0.0007629511,0.8476386664,,, +14.8339843750,237,0.5226215000,-0.0007629511,0.5516136416,,, +14.8359375000,237,0.5210955978,-0.0007629511,0.3944457160,,, +14.8378906250,237,0.5180437934,-0.0007629511,0.5699244678,,, +14.8398437500,237,0.5165178912,-0.0007629511,0.7835507744,,, +14.8417968750,237,0.5134660868,-0.0007629511,0.3440909438,,, +14.8437500000,237,0.5104142824,-0.0007629511,0.6797894255,,, +14.8457031250,237,0.5088883803,-0.0007629511,0.8171206226,,, +14.8476562500,237,0.5058365759,-0.0007629511,0.4890516518,,, +14.8496093750,237,0.5027847715,-0.0007629511,0.5409323262,,, +14.8515625000,237,0.5012588693,-0.0007629511,0.3639276722,,, +14.8535156250,237,0.4982070649,-0.0007629511,0.2220187686,,, +14.8554687500,237,0.4966811627,-0.0007629511,0.5806057832,,, +14.8574218750,237,0.4936293584,-0.0007629511,0.1960784314,,, +14.8593750000,237,0.4905775540,-0.0007629511,0.1457236591,,, +14.8613281250,237,0.4890516518,-0.0007629511,0.4509040970,,, +14.8632812500,237,0.4859998474,-0.0007629511,0.7057297627,,, +14.8652343750,237,0.4844739452,-0.0007629511,0.1548790723,,, +14.8671875000,237,0.4814221408,-0.0007629511,0.3364614328,,, +14.8691406250,237,0.4783703365,-0.0007629511,0.4783703365,,, +14.8710937500,237,0.4768444343,-0.0007629511,0.7988097963,,, +14.8730468750,237,0.4737926299,-0.0007629511,0.1579308766,,, +14.8750000000,238,0.4722667277,-0.0007629511,0.0114442664,,, +14.8769531250,238,0.4692149233,-0.0007629511,0.9147783627,,, +14.8789062500,238,0.4676890211,-0.0007629511,0.4005493248,,, +14.8808593750,238,0.4646372168,-0.0007629511,0.2769512474,,, +14.8828125000,238,0.4615854124,-0.0007629511,0.6889448386,,, +14.8847656250,238,0.4600595102,-0.0007629511,0.5546654459,,, +14.8867187500,238,0.4570077058,-0.0007629511,0.0694285496,,, +14.8886718750,238,0.4554818036,-0.0007629511,0.0770580606,,, +14.8906250000,238,0.4524299992,-0.0007629511,0.4661631189,,, +14.8925781250,238,0.4509040970,-0.0007629511,0.5134660868,,, +14.8945312500,238,0.4478522927,-0.0007629511,0.7026779583,,, +14.8964843750,238,0.4463263905,-0.0007629511,0.8827344167,,, +14.8984375000,238,0.4432745861,-0.0007629511,0.8201724269,,, +14.9003906250,238,0.4417486839,-0.0007629511,0.3791866941,,, +14.9023437500,238,0.4386968795,-0.0007629511,0.7713435569,,, +14.9042968750,238,0.4356450752,-0.0007629511,0.7209887846,,, +14.9062500000,238,0.4341191730,-0.0007629511,0.0633249409,,, +14.9082031250,238,0.4310673686,-0.0007629511,0.5821316854,,, +14.9101562500,238,0.4295414664,-0.0007629511,0.3486686503,,, +14.9121093750,238,0.4264896620,-0.0007629511,0.0114442664,,, +14.9140625000,238,0.4249637598,-0.0007629511,0.0221255818,,, +14.9160156250,238,0.4219119554,-0.0007629511,0.5027847715,,, +14.9179687500,238,0.4203860533,-0.0007629511,0.2357518883,,, +14.9199218750,238,0.4173342489,-0.0007629511,0.6309605554,,, +14.9218750000,238,0.4158083467,-0.0007629511,0.5546654459,,, +14.9238281250,238,0.4127565423,-0.0007629511,0.4432745861,,, +14.9257812500,238,0.4112306401,-0.0007629511,0.5592431525,,, +14.9277343750,238,0.4081788357,-0.0007629511,0.7530327306,,, +14.9296875000,238,0.4066529335,-0.0007629511,0.5653467613,,, +14.9316406250,238,0.4036011292,-0.0007629511,0.4524299992,,, +14.9335937500,238,0.4020752270,-0.0007629511,0.0175478752,,, +14.9355468750,238,0.3990234226,-0.0007629511,0.2342259861,,, +14.9375000000,239,0.3974975204,-0.0007629511,0.4020752270,,, +14.9394531250,239,0.3944457160,-0.0007629511,0.5134660868,,, +14.9414062500,239,0.3929198138,-0.0007629511,0.9346150912,,, +14.9433593750,239,0.3898680095,-0.0007629511,0.6584267948,,, +14.9453125000,239,0.3883421073,-0.0007629511,0.2311741817,,, +14.9472656250,239,0.3852903029,-0.0007629511,0.7591363394,,, +14.9492187500,239,0.3837644007,-0.0007629511,0.7194628824,,, +14.9511718750,239,0.3822384985,-0.0007629511,0.4097047379,,, +14.9531250000,239,0.3791866941,-0.0007629511,0.6233310445,,, +14.9550781250,239,0.3776607919,-0.0007629511,0.0785839628,,, +14.9570312500,239,0.3746089876,-0.0007629511,0.2861066606,,, +14.9589843750,239,0.3730830854,-0.0007629511,0.1121538109,,, +14.9609375000,239,0.3700312810,-0.0007629511,0.9925993744,,, +14.9628906250,239,0.3685053788,-0.0007629511,0.3334096284,,, +14.9648437500,239,0.3654535744,-0.0007629511,0.7286182956,,, +14.9667968750,239,0.3639276722,-0.0007629511,0.2632181277,,, +14.9687500000,239,0.3624017700,-0.0007629511,0.2327000839,,, +14.9707031250,239,0.3593499657,-0.0007629511,0.1289387350,,, +14.9726562500,239,0.3578240635,-0.0007629511,0.5607690547,,, +14.9746093750,239,0.3547722591,-0.0007629511,0.6080720226,,, +14.9765625000,239,0.3532463569,-0.0007629511,0.1380941482,,, +14.9785156250,239,0.3501945525,-0.0007629511,0.0007629511,,, +14.9804687500,239,0.3486686503,-0.0007629511,0.7377737087,,, +14.9824218750,239,0.3471427481,-0.0007629511,0.4539559014,,, +14.9843750000,239,0.3440909438,-0.0007629511,0.3959716182,,, +14.9863281250,239,0.3425650416,-0.0007629511,0.5516136416,,, +14.9882812500,239,0.3395132372,-0.0007629511,0.7255664912,,, +14.9902343750,239,0.3379873350,-0.0007629511,0.5836575875,,, +14.9921875000,239,0.3364614328,-0.0007629511,0.2708476387,,, +14.9941406250,239,0.3334096284,-0.0007629511,0.8888380255,,, +14.9960937500,239,0.3318837263,-0.0007629511,0.4524299992,,, +14.9980468750,239,0.3303578241,-0.0007629511,0.9163042649,,, +15.0000000000,240,0.3273060197,-0.0007629511,0.8476386664,,, +15.0019531250,240,0.3257801175,-0.0007629511,0.3624017700,,, +15.0039062500,240,0.3227283131,-0.0007629511,0.8766308080,,, +15.0058593750,240,0.3212024109,-0.0007629511,0.2601663233,,, +15.0078125000,240,0.3196765087,-0.0007629511,0.3624017700,,, +15.0097656250,240,0.3166247044,-0.0007629511,0.1274128328,,, +15.0117187500,240,0.3150988022,-0.0007629511,0.3501945525,,, +15.0136718750,240,0.3135729000,-0.0007629511,0.3089951934,,, +15.0156250000,240,0.3105210956,-0.0007629511,0.0923170825,,, +15.0175781250,240,0.3089951934,-0.0007629511,0.5363546197,,, +15.0195312500,240,0.3074692912,-0.0007629511,0.7072556649,,, +15.0214843750,240,0.3044174868,-0.0007629511,0.7927061875,,, +15.0234375000,240,0.3028915846,-0.0007629511,0.3929198138,,, +15.0253906250,240,0.3013656825,-0.0007629511,0.1915007248,,, +15.0273437500,240,0.2983138781,-0.0007629511,0.7804989700,,, +15.0292968750,240,0.2967879759,-0.0007629511,0.6095979248,,, +15.0312500000,240,0.2952620737,-0.0007629511,0.3913939117,,, +15.0332031250,240,0.2922102693,-0.0007629511,0.2662699321,,, +15.0351562500,240,0.2906843671,-0.0007629511,0.0877393759,,, +15.0371093750,240,0.2891584649,-0.0007629511,0.2052338445,,, +15.0390625000,240,0.2861066606,-0.0007629511,0.5455100328,,, +15.0410156250,240,0.2845807584,-0.0007629511,0.9636072328,,, +15.0429687500,240,0.2830548562,-0.0007629511,0.9315632868,,, +15.0449218750,240,0.2800030518,-0.0007629511,0.2296482795,,, +15.0468750000,240,0.2784771496,-0.0007629511,0.5607690547,,, +15.0488281250,240,0.2769512474,-0.0007629511,0.7270923934,,, +15.0507812500,240,0.2754253452,-0.0007629511,0.2433813993,,, +15.0527343750,240,0.2723735409,-0.0007629511,0.6828412299,,, +15.0546875000,240,0.2708476387,-0.0007629511,0.3532463569,,, +15.0566406250,240,0.2693217365,-0.0007629511,0.8751049058,,, +15.0585937500,240,0.2677958343,-0.0007629511,0.8293278401,,, +15.0605468750,240,0.2647440299,-0.0007629511,0.3883421073,,, +15.0625000000,241,0.2632181277,-0.0007629511,0.9559777218,,, +15.0644531250,241,0.2616922255,-0.0007629511,0.2143892576,,, +15.0664062500,241,0.2601663233,-0.0007629511,0.7560845350,,, +15.0683593750,241,0.2571145190,-0.0007629511,0.6401159686,,, +15.0703125000,241,0.2555886168,-0.0007629511,0.3273060197,,, +15.0722656250,241,0.2540627146,-0.0007629511,0.7072556649,,, +15.0742187500,241,0.2525368124,-0.0007629511,0.3883421073,,, +15.0761718750,241,0.2494850080,-0.0007629511,0.2601663233,,, +15.0781250000,241,0.2479591058,-0.0007629511,0.3105210956,,, +15.0800781250,241,0.2464332036,-0.0007629511,0.8598458839,,, +15.0820312500,241,0.2449073014,-0.0007629511,0.7148851759,,, +15.0839843750,241,0.2418554971,-0.0007629511,0.8674753948,,, +15.0859375000,241,0.2403295949,-0.0007629511,0.1640344854,,, +15.0878906250,241,0.2388036927,-0.0007629511,0.8690012970,,, +15.0898437500,241,0.2372777905,-0.0007629511,0.3364614328,,, +15.0917968750,241,0.2357518883,-0.0007629511,0.7270923934,,, +15.0937500000,241,0.2327000839,-0.0007629511,0.8110170138,,, +15.0957031250,241,0.2311741817,-0.0007629511,0.5897611963,,, +15.0976562500,241,0.2296482795,-0.0007629511,0.2738994430,,, +15.0996093750,241,0.2281223774,-0.0007629511,0.2815289540,,, +15.1015625000,241,0.2265964752,-0.0007629511,0.7164110780,,, +15.1035156250,241,0.2250705730,-0.0007629511,0.0328068971,,, +15.1054687500,241,0.2220187686,-0.0007629511,0.9544518196,,, +15.1074218750,241,0.2204928664,-0.0007629511,0.0205996796,,, +15.1093750000,241,0.2189669642,-0.0007629511,0.0617990387,,, +15.1113281250,241,0.2174410620,-0.0007629511,0.5683985657,,, +15.1132812500,241,0.2159151598,-0.0007629511,0.9727626459,,, +15.1152343750,241,0.2143892576,-0.0007629511,0.3852903029,,, +15.1171875000,241,0.2113374533,-0.0007629511,0.4829480430,,, +15.1191406250,241,0.2098115511,-0.0007629511,0.2235446708,,, +15.1210937500,241,0.2082856489,-0.0007629511,0.4631113146,,, +15.1230468750,241,0.2067597467,-0.0007629511,0.8079652094,,, +15.1250000000,242,0.2052338445,-0.0007629511,0.4509040970,,, +15.1269531250,242,0.2037079423,-0.0007629511,0.9269855802,,, +15.1289062500,242,0.2021820401,-0.0007629511,0.3547722591,,, +15.1308593750,242,0.2006561379,-0.0007629511,0.8827344167,,, +15.1328125000,242,0.1976043336,-0.0007629511,0.4097047379,,, +15.1347656250,242,0.1960784314,-0.0007629511,0.9422446021,,, +15.1367187500,242,0.1945525292,-0.0007629511,0.5561913481,,, +15.1386718750,242,0.1930266270,-0.0007629511,0.6828412299,,, +15.1406250000,242,0.1915007248,-0.0007629511,0.0877393759,,, +15.1425781250,242,0.1899748226,-0.0007629511,0.8903639277,,, +15.1445312500,242,0.1884489204,-0.0007629511,0.9819180591,,, +15.1464843750,242,0.1869230182,-0.0007629511,0.5790798810,,, +15.1484375000,242,0.1853971160,-0.0007629511,0.0740062562,,, +15.1503906250,242,0.1838712139,-0.0007629511,0.4676890211,,, +15.1523437500,242,0.1823453117,-0.0007629511,0.2342259861,,, +15.1542968750,242,0.1792935073,-0.0007629511,0.4341191730,,, +15.1562500000,242,0.1777676051,-0.0007629511,0.7942320897,,, +15.1582031250,242,0.1762417029,-0.0007629511,0.2922102693,,, +15.1601562500,242,0.1747158007,-0.0007629511,0.3364614328,,, +15.1621093750,242,0.1731898985,-0.0007629511,0.9193560693,,, +15.1640625000,242,0.1716639963,-0.0007629511,0.5714503700,,, +15.1660156250,242,0.1701380941,-0.0007629511,0.5867093919,,, +15.1679687500,242,0.1686121920,-0.0007629511,0.8369573510,,, +15.1699218750,242,0.1670862898,-0.0007629511,0.6218051423,,, +15.1718750000,242,0.1655603876,-0.0007629511,0.5622949569,,, +15.1738281250,242,0.1640344854,-0.0007629511,0.3990234226,,, +15.1757812500,242,0.1625085832,-0.0007629511,0.9468223087,,, +15.1777343750,242,0.1609826810,-0.0007629511,0.2540627146,,, +15.1796875000,242,0.1594567788,-0.0007629511,0.6660563058,,, +15.1816406250,242,0.1579308766,-0.0007629511,0.0892652781,,, +15.1835937500,242,0.1564049744,-0.0007629511,0.2510109102,,, +15.1855468750,242,0.1548790723,-0.0007629511,0.9498741131,,, +15.1875000000,243,0.1533531701,-0.0007629511,0.3791866941,,, +15.1894531250,243,0.1518272679,-0.0007629511,0.7484550240,,, +15.1914062500,243,0.1503013657,-0.0007629511,0.5928130007,,, +15.1933593750,243,0.1487754635,-0.0007629511,0.4127565423,,, +15.1953125000,243,0.1472495613,-0.0007629511,0.6065461204,,, +15.1972656250,243,0.1457236591,-0.0007629511,0.2250705730,,, +15.1992187500,243,0.1441977569,-0.0007629511,0.1869230182,,, +15.2011718750,243,0.1426718547,-0.0007629511,0.1503013657,,, +15.2031250000,243,0.1411459525,-0.0007629511,0.6385900664,,, +15.2050781250,243,0.1396200504,-0.0007629511,0.5958648051,,, +15.2070312500,243,0.1380941482,-0.0007629511,0.8674753948,,, +15.2089843750,243,0.1365682460,-0.0007629511,0.6507972839,,, +15.2109375000,243,0.1350423438,-0.0007629511,0.5378805219,,, +15.2128906250,243,0.1350423438,-0.0007629511,0.9117265583,,, +15.2148437500,243,0.1335164416,-0.0007629511,0.2601663233,,, +15.2167968750,243,0.1319905394,-0.0007629511,0.7072556649,,, +15.2187500000,243,0.1304646372,-0.0007629511,0.1686121920,,, +15.2207031250,243,0.1289387350,-0.0007629511,0.2250705730,,, +15.2226562500,243,0.1274128328,-0.0007629511,0.0297550927,,, +15.2246093750,243,0.1258869306,-0.0007629511,0.9269855802,,, +15.2265625000,243,0.1243610285,-0.0007629511,0.0785839628,,, +15.2285156250,243,0.1228351263,-0.0007629511,0.1976043336,,, +15.2304687500,243,0.1213092241,-0.0007629511,0.2479591058,,, +15.2324218750,243,0.1197833219,-0.0007629511,0.8079652094,,, +15.2343750000,243,0.1197833219,-0.0007629511,0.0190737774,,, +15.2363281250,243,0.1182574197,-0.0007629511,0.0740062562,,, +15.2382812500,243,0.1167315175,-0.0007629511,0.9132524605,,, +15.2402343750,243,0.1152056153,-0.0007629511,0.9956511788,,, +15.2421875000,243,0.1136797131,-0.0007629511,0.9147783627,,, +15.2441406250,243,0.1121538109,-0.0007629511,0.0862134737,,, +15.2460937500,243,0.1106279088,-0.0007629511,0.4402227817,,, +15.2480468750,243,0.1106279088,-0.0007629511,0.3059433890,,, +15.2500000000,244,0.1091020066,-0.0007629511,0.7927061875,,, +15.2519531250,244,0.1075761044,-0.0007629511,0.1396200504,,, +15.2539062500,244,0.1060502022,-0.0007629511,0.0892652781,,, +15.2558593750,244,0.1045243000,-0.0007629511,0.8506904707,,, +15.2578125000,244,0.1029983978,-0.0007629511,0.0038147555,,, +15.2597656250,244,0.1029983978,-0.0007629511,0.9147783627,,, +15.2617187500,244,0.1014724956,-0.0007629511,0.9346150912,,, +15.2636718750,244,0.0999465934,-0.0007629511,0.6218051423,,, +15.2656250000,244,0.0984206912,-0.0007629511,0.3791866941,,, +15.2675781250,244,0.0968947890,-0.0007629511,0.3501945525,,, +15.2695312500,244,0.0953688869,-0.0007629511,0.4234378576,,, +15.2714843750,244,0.0953688869,-0.0007629511,0.6965743496,,, +15.2734375000,244,0.0938429847,-0.0007629511,0.4020752270,,, +15.2753906250,244,0.0923170825,-0.0007629511,0.0892652781,,, +15.2773437500,244,0.0907911803,-0.0007629511,0.1167315175,,, +15.2792968750,244,0.0907911803,-0.0007629511,0.8049134051,,, +15.2812500000,244,0.0892652781,-0.0007629511,0.0114442664,,, +15.2832031250,244,0.0877393759,-0.0007629511,0.6874189364,,, +15.2851562500,244,0.0862134737,-0.0007629511,0.0724803540,,, +15.2871093750,244,0.0862134737,-0.0007629511,0.5378805219,,, +15.2890625000,244,0.0846875715,-0.0007629511,0.4768444343,,, +15.2910156250,244,0.0831616693,-0.0007629511,0.4997329671,,, +15.2929687500,244,0.0816357671,-0.0007629511,0.5622949569,,, +15.2949218750,244,0.0816357671,-0.0007629511,0.2479591058,,, +15.2968750000,244,0.0801098650,-0.0007629511,0.4432745861,,, +15.2988281250,244,0.0785839628,-0.0007629511,0.4707408255,,, +15.3007812500,244,0.0770580606,-0.0007629511,0.3303578241,,, +15.3027343750,244,0.0770580606,-0.0007629511,0.8125429160,,, +15.3046875000,244,0.0755321584,-0.0007629511,0.3242542153,,, +15.3066406250,244,0.0740062562,-0.0007629511,0.6355382620,,, +15.3085937500,244,0.0740062562,-0.0007629511,0.5821316854,,, +15.3105468750,244,0.0724803540,-0.0007629511,0.3196765087,,, +15.3125000000,245,0.0709544518,-0.0007629511,0.3303578241,,, +15.3144531250,245,0.0694285496,-0.0007629511,0.1579308766,,, +15.3164062500,245,0.0694285496,-0.0007629511,0.0358587015,,, +15.3183593750,245,0.0679026474,-0.0007629511,0.8110170138,,, +15.3203125000,245,0.0663767453,-0.0007629511,0.0938429847,,, +15.3222656250,245,0.0663767453,-0.0007629511,0.6736858167,,, +15.3242187500,245,0.0648508431,-0.0007629511,0.0221255818,,, +15.3261718750,245,0.0633249409,-0.0007629511,0.8155947204,,, +15.3281250000,245,0.0633249409,-0.0007629511,0.8934157321,,, +15.3300781250,245,0.0617990387,-0.0007629511,0.5317769131,,, +15.3320312500,245,0.0602731365,-0.0007629511,0.0984206912,,, +15.3339843750,245,0.0602731365,-0.0007629511,0.0099183642,,, +15.3359375000,245,0.0587472343,-0.0007629511,0.4737926299,,, +15.3378906250,245,0.0587472343,-0.0007629511,0.1655603876,,, +15.3398437500,245,0.0572213321,-0.0007629511,0.1152056153,,, +15.3417968750,245,0.0556954299,-0.0007629511,0.9941252766,,, +15.3437500000,245,0.0556954299,-0.0007629511,0.9712367437,,, +15.3457031250,245,0.0541695277,-0.0007629511,0.7347219043,,, +15.3476562500,245,0.0541695277,-0.0007629511,0.1258869306,,, +15.3496093750,245,0.0526436255,-0.0007629511,0.9803921569,,, +15.3515625000,245,0.0511177234,-0.0007629511,0.6034943160,,, +15.3535156250,245,0.0511177234,-0.0007629511,0.0862134737,,, +15.3554687500,245,0.0495918212,-0.0007629511,0.7316700999,,, +15.3574218750,245,0.0495918212,-0.0007629511,0.2464332036,,, +15.3593750000,245,0.0480659190,-0.0007629511,0.0282291905,,, +15.3613281250,245,0.0465400168,-0.0007629511,0.7286182956,,, +15.3632812500,245,0.0465400168,-0.0007629511,0.7301441978,,, +15.3652343750,245,0.0450141146,-0.0007629511,0.0236514839,,, +15.3671875000,245,0.0450141146,-0.0007629511,0.9590295262,,, +15.3691406250,245,0.0434882124,-0.0007629511,0.5027847715,,, +15.3710937500,245,0.0434882124,-0.0007629511,0.2723735409,,, +15.3730468750,245,0.0419623102,-0.0007629511,0.5745021744,,, +15.3750000000,246,0.0419623102,-0.0007629511,0.8720531014,,, +15.3769531250,246,0.0404364080,-0.0007629511,0.3837644007,,, +15.3789062500,246,0.0404364080,-0.0007629511,0.4753185321,,, +15.3808593750,246,0.0389105058,-0.0007629511,0.9773403525,,, +15.3828125000,246,0.0373846036,-0.0007629511,0.4997329671,,, +15.3847656250,246,0.0373846036,-0.0007629511,0.8339055467,,, +15.3867187500,246,0.0358587015,-0.0007629511,0.6095979248,,, +15.3886718750,246,0.0358587015,-0.0007629511,0.1869230182,,, +15.3906250000,246,0.0343327993,-0.0007629511,0.5455100328,,, +15.3925781250,246,0.0343327993,-0.0007629511,0.8644235904,,, +15.3945312500,246,0.0328068971,-0.0007629511,0.8125429160,,, +15.3964843750,246,0.0328068971,-0.0007629511,0.2006561379,,, +15.3984375000,246,0.0328068971,-0.0007629511,0.5165178912,,, +15.4003906250,246,0.0312809949,-0.0007629511,0.5531395438,,, +15.4023437500,246,0.0312809949,-0.0007629511,0.2357518883,,, +15.4042968750,246,0.0297550927,-0.0007629511,0.4997329671,,, +15.4062500000,246,0.0297550927,-0.0007629511,0.5500877394,,, +15.4082031250,246,0.0282291905,-0.0007629511,0.7515068284,,, +15.4101562500,246,0.0282291905,-0.0007629511,0.7240405890,,, +15.4121093750,246,0.0267032883,-0.0007629511,0.8216983291,,, +15.4140625000,246,0.0267032883,-0.0007629511,0.3044174868,,, +15.4160156250,246,0.0267032883,-0.0007629511,0.5653467613,,, +15.4179687500,246,0.0251773861,-0.0007629511,0.2281223774,,, +15.4199218750,246,0.0251773861,-0.0007629511,0.6919966430,,, +15.4218750000,246,0.0236514839,-0.0007629511,0.1472495613,,, +15.4238281250,246,0.0236514839,-0.0007629511,0.9620813306,,, +15.4257812500,246,0.0221255818,-0.0007629511,0.4905775540,,, +15.4277343750,246,0.0221255818,-0.0007629511,0.5668726635,,, +15.4296875000,246,0.0221255818,-0.0007629511,0.2189669642,,, +15.4316406250,246,0.0205996796,-0.0007629511,0.6858930343,,, +15.4335937500,246,0.0205996796,-0.0007629511,0.9575036240,,, +15.4355468750,246,0.0205996796,-0.0007629511,0.9407186999,,, +15.4375000000,247,0.0190737774,-0.0007629511,0.7942320897,,, +15.4394531250,247,0.0190737774,-0.0007629511,0.9636072328,,, +15.4414062500,247,0.0175478752,-0.0007629511,0.2723735409,,, +15.4433593750,247,0.0175478752,-0.0007629511,0.0724803540,,, +15.4453125000,247,0.0175478752,-0.0007629511,0.1808194095,,, +15.4472656250,247,0.0160219730,-0.0007629511,0.5897611963,,, +15.4492187500,247,0.0160219730,-0.0007629511,0.4264896620,,, +15.4511718750,247,0.0160219730,-0.0007629511,0.3105210956,,, +15.4531250000,247,0.0144960708,-0.0007629511,0.5058365759,,, +15.4550781250,247,0.0144960708,-0.0007629511,0.7667658503,,, +15.4570312500,247,0.0144960708,-0.0007629511,0.5409323262,,, +15.4589843750,247,0.0129701686,-0.0007629511,0.7682917525,,, +15.4609375000,247,0.0129701686,-0.0007629511,0.8476386664,,, +15.4628906250,247,0.0129701686,-0.0007629511,0.3593499657,,, +15.4648437500,247,0.0114442664,-0.0007629511,0.4188601511,,, +15.4667968750,247,0.0114442664,-0.0007629511,0.4341191730,,, +15.4687500000,247,0.0114442664,-0.0007629511,0.3929198138,,, +15.4707031250,247,0.0114442664,-0.0007629511,0.9742885481,,, +15.4726562500,247,0.0099183642,-0.0007629511,0.1518272679,,, +15.4746093750,247,0.0099183642,-0.0007629511,0.5638208591,,, +15.4765625000,247,0.0099183642,-0.0007629511,0.2738994430,,, +15.4785156250,247,0.0099183642,-0.0007629511,0.9346150912,,, +15.4804687500,247,0.0083924620,-0.0007629511,0.4371709773,,, +15.4824218750,247,0.0083924620,-0.0007629511,0.9391927977,,, +15.4843750000,247,0.0083924620,-0.0007629511,0.0846875715,,, +15.4863281250,247,0.0083924620,-0.0007629511,0.0816357671,,, +15.4882812500,247,0.0068665599,-0.0007629511,0.6889448386,,, +15.4902343750,247,0.0068665599,-0.0007629511,0.3349355306,,, +15.4921875000,247,0.0068665599,-0.0007629511,0.4325932708,,, +15.4941406250,247,0.0068665599,-0.0007629511,0.0923170825,,, +15.4960937500,247,0.0053406577,-0.0007629511,0.5317769131,,, +15.4980468750,247,0.0053406577,-0.0007629511,0.9437705043,,, +15.5000000000,248,0.0053406577,-0.0007629511,0.2113374533,,, +15.5019531250,248,0.0053406577,-0.0007629511,0.0907911803,,, +15.5039062500,248,0.0053406577,-0.0007629511,0.9117265583,,, +15.5058593750,248,0.0038147555,-0.0007629511,0.4127565423,,, +15.5078125000,248,0.0038147555,-0.0007629511,0.0114442664,,, +15.5097656250,248,0.0038147555,-0.0007629511,0.4020752270,,, +15.5117187500,248,0.0038147555,-0.0007629511,0.3517204547,,, +15.5136718750,248,0.0038147555,-0.0007629511,0.3883421073,,, +15.5156250000,248,0.0022888533,-0.0007629511,0.9010452430,,, +15.5175781250,248,0.0022888533,-0.0007629511,0.4249637598,,, +15.5195312500,248,0.0022888533,-0.0007629511,0.1182574197,,, +15.5214843750,248,0.0022888533,-0.0007629511,0.1884489204,,, +15.5234375000,248,0.0022888533,-0.0007629511,0.1029983978,,, +15.5253906250,248,0.0022888533,-0.0007629511,0.8842603189,,, +15.5273437500,248,0.0022888533,-0.0007629511,0.5134660868,,, +15.5292968750,248,0.0007629511,-0.0007629511,0.0007629511,,, +15.5312500000,248,0.0007629511,-0.0007629511,0.5333028153,,, +15.5332031250,248,0.0007629511,-0.0007629511,0.5729762722,,, +15.5351562500,248,0.0007629511,-0.0007629511,0.0175478752,,, +15.5371093750,248,0.0007629511,-0.0007629511,0.3028915846,,, +15.5390625000,248,0.0007629511,-0.0007629511,0.6599526970,,, +15.5410156250,248,0.0007629511,-0.0007629511,0.7576104372,,, +15.5429687500,248,0.0007629511,-0.0007629511,0.8705271992,,, +15.5449218750,248,0.0007629511,-0.0007629511,0.9697108415,,, +15.5468750000,248,0.0007629511,-0.0007629511,0.1152056153,,, +15.5488281250,248,0.0007629511,-0.0007629511,0.4066529335,,, +15.5507812500,248,-0.0007629511,-0.0007629511,0.4585336080,,, +15.5527343750,248,-0.0007629511,-0.0007629511,0.1594567788,,, +15.5546875000,248,-0.0007629511,-0.0007629511,0.2540627146,,, +15.5566406250,248,-0.0007629511,-0.0007629511,0.5836575875,,, +15.5585937500,248,-0.0007629511,-0.0007629511,0.8888380255,,, +15.5605468750,248,-0.0007629511,-0.0007629511,0.9773403525,,, +15.5625000000,249,-0.0007629511,-0.0007629511,0.3700312810,,, +15.5644531250,249,-0.0007629511,-0.0007629511,0.9300373846,,, +15.5664062500,249,-0.0007629511,-0.0007629511,0.3517204547,,, +15.5683593750,249,-0.0007629511,-0.0007629511,0.8430609598,,, +15.5703125000,249,-0.0007629511,-0.0007629511,0.0190737774,,, +15.5722656250,249,-0.0007629511,-0.0007629511,0.5348287175,,, +15.5742187500,249,-0.0007629511,-0.0007629511,0.8979934386,,, +15.5761718750,249,-0.0007629511,-0.0007629511,0.1533531701,,, +15.5781250000,249,-0.0007629511,-0.0007629511,0.2510109102,,, +15.5800781250,249,-0.0007629511,-0.0007629511,0.3944457160,,, +15.5820312500,249,-0.0007629511,-0.0007629511,0.9422446021,,, +15.5839843750,249,-0.0007629511,-0.0007629511,0.2052338445,,, +15.5859375000,249,-0.0007629511,-0.0007629511,0.6462195773,,, +15.5878906250,249,-0.0007629511,-0.0007629511,0.1823453117,,, +15.5898437500,249,-0.0007629511,-0.0007629511,0.3868162051,,, +15.5917968750,249,-0.0007629511,-0.0007629511,0.3654535744,,, +15.5937500000,249,-0.0007629511,-0.0007629511,0.5928130007,,, +15.5957031250,249,-0.0007629511,-0.0007629511,0.3334096284,,, +15.5976562500,249,-0.0007629511,-0.0007629511,0.4753185321,,, +15.5996093750,249,-0.0007629511,-0.0007629511,0.5867093919,,, +15.6015625000,249,-0.0007629511,-0.0007629511,0.5958648051,,, +15.6035156250,249,0.0007629511,-0.0007629511,0.8003356985,,, +15.6054687500,249,0.0007629511,-0.0007629511,0.6019684138,,, +15.6074218750,249,0.0007629511,-0.0007629511,0.5561913481,,, +15.6093750000,249,0.0007629511,-0.0007629511,0.2159151598,,, +15.6113281250,249,0.0007629511,-0.0007629511,0.5104142824,,, +15.6132812500,249,0.0007629511,-0.0007629511,0.5638208591,,, +15.6152343750,249,0.0007629511,-0.0007629511,0.0740062562,,, +15.6171875000,249,0.0007629511,-0.0007629511,0.2540627146,,, +15.6191406250,249,0.0007629511,-0.0007629511,0.4844739452,,, +15.6210937500,249,0.0007629511,-0.0007629511,0.4737926299,,, +15.6230468750,249,0.0022888533,-0.0007629511,0.7728694591,,, +15.6250000000,250,0.0022888533,-0.0007629511,0.7576104372,,, +15.6269531250,250,0.0022888533,-0.0007629511,0.0358587015,,, +15.6289062500,250,0.0022888533,-0.0007629511,0.5699244678,,, +15.6308593750,250,0.0022888533,-0.0007629511,0.5973907073,,, +15.6328125000,250,0.0022888533,-0.0007629511,0.4524299992,,, +15.6347656250,250,0.0022888533,-0.0007629511,0.6172274357,,, +15.6367187500,250,0.0038147555,-0.0007629511,0.0297550927,,, +15.6386718750,250,0.0038147555,-0.0007629511,0.6080720226,,, +15.6406250000,250,0.0038147555,-0.0007629511,0.3837644007,,, +15.6425781250,250,0.0038147555,-0.0007629511,0.2098115511,,, +15.6445312500,250,0.0038147555,-0.0007629511,0.1029983978,,, +15.6464843750,250,0.0038147555,-0.0007629511,0.5455100328,,, +15.6484375000,250,0.0053406577,-0.0007629511,0.2586404211,,, +15.6503906250,250,0.0053406577,-0.0007629511,0.7820248722,,, +15.6523437500,250,0.0053406577,-0.0007629511,0.4249637598,,, +15.6542968750,250,0.0053406577,-0.0007629511,0.9040970474,,, +15.6562500000,250,0.0053406577,-0.0007629511,0.4966811627,,, +15.6582031250,250,0.0068665599,-0.0007629511,0.2235446708,,, +15.6601562500,250,0.0068665599,-0.0007629511,0.1182574197,,, +15.6621093750,250,0.0068665599,-0.0007629511,0.8827344167,,, +15.6640625000,250,0.0068665599,-0.0007629511,0.2235446708,,, +15.6660156250,250,0.0083924620,-0.0007629511,0.9697108415,,, +15.6679687500,250,0.0083924620,-0.0007629511,0.5806057832,,, +15.6699218750,250,0.0083924620,-0.0007629511,0.0770580606,,, +15.6718750000,250,0.0083924620,-0.0007629511,0.3471427481,,, +15.6738281250,250,0.0099183642,-0.0007629511,0.8094911116,,, +15.6757812500,250,0.0099183642,-0.0007629511,0.6721599145,,, +15.6777343750,250,0.0099183642,-0.0007629511,0.9956511788,,, +15.6796875000,250,0.0099183642,-0.0007629511,0.5012588693,,, +15.6816406250,250,0.0114442664,-0.0007629511,0.0679026474,,, +15.6835937500,250,0.0114442664,-0.0007629511,0.4859998474,,, +15.6855468750,250,0.0114442664,-0.0007629511,0.8018616007,,, +15.6875000000,251,0.0129701686,-0.0007629511,0.4692149233,,, +15.6894531250,251,0.0129701686,-0.0007629511,0.4570077058,,, +15.6914062500,251,0.0129701686,-0.0007629511,0.5058365759,,, +15.6933593750,251,0.0129701686,-0.0007629511,0.9514000153,,, +15.6953125000,251,0.0144960708,-0.0007629511,0.8995193408,,, +15.6972656250,251,0.0144960708,-0.0007629511,0.1014724956,,, +15.6992187500,251,0.0144960708,-0.0007629511,0.9391927977,,, +15.7011718750,251,0.0160219730,-0.0007629511,0.6172274357,,, +15.7031250000,251,0.0160219730,-0.0007629511,0.9452964065,,, +15.7050781250,251,0.0160219730,-0.0007629511,0.7454032197,,, +15.7070312500,251,0.0175478752,-0.0007629511,0.8888380255,,, +15.7089843750,251,0.0175478752,-0.0007629511,0.6858930343,,, +15.7109375000,251,0.0175478752,-0.0007629511,0.0862134737,,, +15.7128906250,251,0.0190737774,-0.0007629511,0.4722667277,,, +15.7148437500,251,0.0190737774,-0.0007629511,0.9666590372,,, +15.7167968750,251,0.0205996796,-0.0007629511,0.9697108415,,, +15.7187500000,251,0.0205996796,-0.0007629511,0.3013656825,,, +15.7207031250,251,0.0205996796,-0.0007629511,0.0938429847,,, +15.7226562500,251,0.0221255818,-0.0007629511,0.9086747539,,, +15.7246093750,251,0.0221255818,-0.0007629511,0.5699244678,,, +15.7265625000,251,0.0236514839,-0.0007629511,0.1029983978,,, +15.7285156250,251,0.0236514839,-0.0007629511,0.6294346532,,, +15.7304687500,251,0.0236514839,-0.0007629511,0.1182574197,,, +15.7324218750,251,0.0251773861,-0.0007629511,0.0434882124,,, +15.7343750000,251,0.0251773861,-0.0007629511,0.4676890211,,, +15.7363281250,251,0.0267032883,-0.0007629511,0.6446936751,,, +15.7382812500,251,0.0267032883,-0.0007629511,0.7301441978,,, +15.7402343750,251,0.0267032883,-0.0007629511,0.1365682460,,, +15.7421875000,251,0.0282291905,-0.0007629511,0.7331960021,,, +15.7441406250,251,0.0282291905,-0.0007629511,0.4798962387,,, +15.7460937500,251,0.0297550927,-0.0007629511,0.8964675364,,, +15.7480468750,251,0.0297550927,-0.0007629511,0.6095979248,,, +15.7500000000,252,0.0312809949,-0.0007629511,0.1060502022,,, +15.7519531250,252,0.0312809949,-0.0007629511,0.6416418708,,, +15.7539062500,252,0.0328068971,-0.0007629511,0.3486686503,,, +15.7558593750,252,0.0328068971,-0.0007629511,0.5943389029,,, +15.7578125000,252,0.0343327993,-0.0007629511,0.1625085832,,, +15.7597656250,252,0.0343327993,-0.0007629511,0.5989166094,,, +15.7617187500,252,0.0358587015,-0.0007629511,0.5928130007,,, +15.7636718750,252,0.0358587015,-0.0007629511,0.5851834897,,, +15.7656250000,252,0.0373846036,-0.0007629511,0.7362478065,,, +15.7675781250,252,0.0373846036,-0.0007629511,0.1167315175,,, +15.7695312500,252,0.0389105058,-0.0007629511,0.4890516518,,, +15.7714843750,252,0.0389105058,-0.0007629511,0.7637140459,,, +15.7734375000,252,0.0404364080,-0.0007629511,0.4325932708,,, +15.7753906250,252,0.0404364080,-0.0007629511,0.2769512474,,, +15.7773437500,252,0.0419623102,-0.0007629511,0.3303578241,,, +15.7792968750,252,0.0419623102,-0.0007629511,0.8522163729,,, +15.7812500000,252,0.0434882124,-0.0007629511,0.4753185321,,, +15.7832031250,252,0.0434882124,-0.0007629511,0.0694285496,,, +15.7851562500,252,0.0450141146,-0.0007629511,0.5821316854,,, +15.7871093750,252,0.0450141146,-0.0007629511,0.5165178912,,, +15.7890625000,252,0.0465400168,-0.0007629511,0.0816357671,,, +15.7910156250,252,0.0480659190,-0.0007629511,0.7331960021,,, +15.7929687500,252,0.0480659190,-0.0007629511,0.5912870985,,, +15.7949218750,252,0.0495918212,-0.0007629511,0.3624017700,,, +15.7968750000,252,0.0495918212,-0.0007629511,0.9071488518,,, +15.7988281250,252,0.0511177234,-0.0007629511,0.1655603876,,, +15.8007812500,252,0.0511177234,-0.0007629511,0.9346150912,,, +15.8027343750,252,0.0526436255,-0.0007629511,0.0038147555,,, +15.8046875000,252,0.0541695277,-0.0007629511,0.9163042649,,, +15.8066406250,252,0.0541695277,-0.0007629511,0.6446936751,,, +15.8085937500,252,0.0556954299,-0.0007629511,0.2143892576,,, +15.8105468750,252,0.0556954299,-0.0007629511,0.2555886168,,, +15.8125000000,253,0.0572213321,-0.0007629511,0.1716639963,,, +15.8144531250,253,0.0587472343,-0.0007629511,0.1457236591,,, +15.8164062500,253,0.0587472343,-0.0007629511,0.4814221408,,, +15.8183593750,253,0.0602731365,-0.0007629511,0.3227283131,,, +15.8203125000,253,0.0617990387,-0.0007629511,0.9483482109,,, +15.8222656250,253,0.0617990387,-0.0007629511,0.7179369802,,, +15.8242187500,253,0.0633249409,-0.0007629511,0.7011520562,,, +15.8261718750,253,0.0648508431,-0.0007629511,0.4097047379,,, +15.8281250000,253,0.0648508431,-0.0007629511,0.0175478752,,, +15.8300781250,253,0.0663767453,-0.0007629511,0.4661631189,,, +15.8320312500,253,0.0679026474,-0.0007629511,0.6294346532,,, +15.8339843750,253,0.0679026474,-0.0007629511,0.4783703365,,, +15.8359375000,253,0.0694285496,-0.0007629511,0.9925993744,,, +15.8378906250,253,0.0709544518,-0.0007629511,0.0755321584,,, +15.8398437500,253,0.0709544518,-0.0007629511,0.4829480430,,, +15.8417968750,253,0.0724803540,-0.0007629511,0.4905775540,,, +15.8437500000,253,0.0740062562,-0.0007629511,0.7103074693,,, +15.8457031250,253,0.0740062562,-0.0007629511,0.4173342489,,, +15.8476562500,253,0.0755321584,-0.0007629511,0.7728694591,,, +15.8496093750,253,0.0770580606,-0.0007629511,0.5622949569,,, +15.8515625000,253,0.0785839628,-0.0007629511,0.0328068971,,, +15.8535156250,253,0.0785839628,-0.0007629511,0.1640344854,,, +15.8554687500,253,0.0801098650,-0.0007629511,0.6660563058,,, +15.8574218750,253,0.0816357671,-0.0007629511,0.6599526970,,, +15.8593750000,253,0.0816357671,-0.0007629511,0.1243610285,,, +15.8613281250,253,0.0831616693,-0.0007629511,0.8262760357,,, +15.8632812500,253,0.0846875715,-0.0007629511,0.8293278401,,, +15.8652343750,253,0.0862134737,-0.0007629511,0.2037079423,,, +15.8671875000,253,0.0862134737,-0.0007629511,0.8079652094,,, +15.8691406250,253,0.0877393759,-0.0007629511,0.8415350576,,, +15.8710937500,253,0.0892652781,-0.0007629511,0.0251773861,,, +15.8730468750,253,0.0907911803,-0.0007629511,0.8232242313,,, +15.8750000000,254,0.0923170825,-0.0007629511,0.3303578241,,, +15.8769531250,254,0.0923170825,-0.0007629511,0.4509040970,,, +15.8789062500,254,0.0938429847,-0.0007629511,0.3517204547,,, +15.8808593750,254,0.0953688869,-0.0007629511,0.6858930343,,, +15.8828125000,254,0.0968947890,-0.0007629511,0.1594567788,,, +15.8847656250,254,0.0968947890,-0.0007629511,0.7759212634,,, +15.8867187500,254,0.0984206912,-0.0007629511,0.2723735409,,, +15.8886718750,254,0.0999465934,-0.0007629511,0.7087815671,,, +15.8906250000,254,0.1014724956,-0.0007629511,0.7270923934,,, +15.8925781250,254,0.1029983978,-0.0007629511,0.5424582284,,, +15.8945312500,254,0.1045243000,-0.0007629511,0.5897611963,,, +15.8964843750,254,0.1045243000,-0.0007629511,0.1869230182,,, +15.8984375000,254,0.1060502022,-0.0007629511,0.8918898299,,, +15.9003906250,254,0.1075761044,-0.0007629511,0.5271992065,,, +15.9023437500,254,0.1091020066,-0.0007629511,0.9956511788,,, +15.9042968750,254,0.1106279088,-0.0007629511,0.4142824445,,, +15.9062500000,254,0.1121538109,-0.0007629511,0.6065461204,,, +15.9082031250,254,0.1121538109,-0.0007629511,0.9742885481,,, +15.9101562500,254,0.1136797131,-0.0007629511,0.6385900664,,, +15.9121093750,254,0.1152056153,-0.0007629511,0.0602731365,,, +15.9140625000,254,0.1167315175,-0.0007629511,0.3349355306,,, +15.9160156250,254,0.1182574197,-0.0007629511,0.2571145190,,, +15.9179687500,254,0.1197833219,-0.0007629511,0.1731898985,,, +15.9199218750,254,0.1213092241,-0.0007629511,0.9178301671,,, +15.9218750000,254,0.1228351263,-0.0007629511,0.4432745861,,, +15.9238281250,254,0.1228351263,-0.0007629511,0.2998397803,,, +15.9257812500,254,0.1243610285,-0.0007629511,0.8110170138,,, +15.9277343750,254,0.1258869306,-0.0007629511,0.9605554284,,, +15.9296875000,254,0.1274128328,-0.0007629511,0.4951552605,,, +15.9316406250,254,0.1289387350,-0.0007629511,0.4615854124,,, +15.9335937500,254,0.1304646372,-0.0007629511,0.2769512474,,, +15.9355468750,254,0.1319905394,-0.0007629511,0.0511177234,,, +15.9375000000,255,0.1335164416,-0.0007629511,0.1029983978,,, +15.9394531250,255,0.1350423438,-0.0007629511,0.3913939117,,, +15.9414062500,255,0.1365682460,-0.0007629511,0.8445868620,,, +15.9433593750,255,0.1380941482,-0.0007629511,0.5790798810,,, +15.9453125000,255,0.1396200504,-0.0007629511,0.9468223087,,, +15.9472656250,255,0.1411459525,-0.0007629511,0.4020752270,,, +15.9492187500,255,0.1411459525,-0.0007629511,0.0053406577,,, +15.9511718750,255,0.1426718547,-0.0007629511,0.6462195773,,, +15.9531250000,255,0.1441977569,-0.0007629511,0.4676890211,,, +15.9550781250,255,0.1457236591,-0.0007629511,0.1197833219,,, +15.9570312500,255,0.1472495613,-0.0007629511,0.9803921569,,, +15.9589843750,255,0.1487754635,-0.0007629511,0.1121538109,,, +15.9609375000,255,0.1503013657,-0.0007629511,0.7255664912,,, +15.9628906250,255,0.1518272679,-0.0007629511,0.9849698634,,, +15.9648437500,255,0.1533531701,-0.0007629511,0.1991302358,,, +15.9667968750,255,0.1548790723,-0.0007629511,0.3028915846,,, +15.9687500000,255,0.1564049744,-0.0007629511,0.2021820401,,, +15.9707031250,255,0.1579308766,-0.0007629511,0.5622949569,,, +15.9726562500,255,0.1594567788,-0.0007629511,0.8278019379,,, +15.9746093750,255,0.1609826810,-0.0007629511,0.0511177234,,, +15.9765625000,255,0.1625085832,-0.0007629511,0.2876325628,,, +15.9785156250,255,0.1640344854,-0.0007629511,0.3273060197,,, +15.9804687500,255,0.1655603876,-0.0007629511,0.9697108415,,, +15.9824218750,255,0.1670862898,-0.0007629511,0.7026779583,,, +15.9843750000,255,0.1686121920,-0.0007629511,0.8918898299,,, +15.9863281250,255,0.1701380941,-0.0007629511,0.5607690547,,, +15.9882812500,255,0.1716639963,-0.0007629511,0.6324864576,,, +15.9902343750,255,0.1747158007,-0.0007629511,0.4890516518,,, +15.9921875000,255,0.1762417029,-0.0007629511,0.0663767453,,, +15.9941406250,255,0.1777676051,-0.0007629511,0.6050202182,,, +15.9960937500,255,0.1792935073,-0.0007629511,0.2372777905,,, +15.9980468750,255,0.1808194095,-0.0007629511,0.6218051423,,, +16.0000000000,256,0.1823453117,-0.0007629511,0.4325932708,,, +16.0019531250,256,0.1838712139,-0.0007629511,0.9254596780,,, +16.0039062500,256,0.1853971160,-0.0007629511,0.2418554971,,, +16.0058593750,256,0.1869230182,-0.0007629511,0.4631113146,,, +16.0078125000,256,0.1884489204,-0.0007629511,0.0556954299,,, +16.0097656250,256,0.1899748226,-0.0007629511,0.7576104372,,, +16.0117187500,256,0.1915007248,-0.0007629511,0.7957579919,,, +16.0136718750,256,0.1930266270,-0.0007629511,0.4005493248,,, +16.0156250000,256,0.1945525292,-0.0007629511,0.2967879759,,, +16.0175781250,256,0.1976043336,-0.0007629511,0.4707408255,,, +16.0195312500,256,0.1991302358,-0.0007629511,0.3944457160,,, +16.0214843750,256,0.2006561379,-0.0007629511,0.3654535744,,, +16.0234375000,256,0.2021820401,-0.0007629511,0.1243610285,,, +16.0253906250,256,0.2037079423,-0.0007629511,0.9880216678,,, +16.0273437500,256,0.2052338445,-0.0007629511,0.9346150912,,, +16.0292968750,256,0.2067597467,-0.0007629511,0.1945525292,,, +16.0312500000,256,0.2082856489,-0.0007629511,0.9056229496,,, +16.0332031250,256,0.2113374533,-0.0007629511,0.2769512474,,, +16.0351562500,256,0.2128633555,-0.0007629511,0.6660563058,,, +16.0371093750,256,0.2143892576,-0.0007629511,0.4783703365,,, +16.0390625000,256,0.2159151598,-0.0007629511,0.9727626459,,, +16.0410156250,256,0.2174410620,-0.0007629511,0.4310673686,,, +16.0429687500,256,0.2189669642,-0.0007629511,0.0083924620,,, +16.0449218750,256,0.2204928664,-0.0007629511,0.4798962387,,, +16.0468750000,256,0.2235446708,-0.0007629511,0.5516136416,,, +16.0488281250,256,0.2250705730,-0.0007629511,0.7682917525,,, +16.0507812500,256,0.2265964752,-0.0007629511,0.9620813306,,, +16.0527343750,256,0.2281223774,-0.0007629511,0.8552681773,,, +16.0546875000,256,0.2296482795,-0.0007629511,0.2281223774,,, +16.0566406250,256,0.2327000839,-0.0007629511,0.4081788357,,, +16.0585937500,256,0.2342259861,-0.0007629511,0.8766308080,,, +16.0605468750,256,0.2357518883,-0.0007629511,0.3685053788,,, +16.0625000000,257,0.2372777905,-0.0007629511,0.0831616693,,, +16.0644531250,257,0.2388036927,-0.0007629511,0.5745021744,,, +16.0664062500,257,0.2418554971,-0.0007629511,0.0007629511,,, +16.0683593750,257,0.2433813993,-0.0007629511,0.4356450752,,, +16.0703125000,257,0.2449073014,-0.0007629511,0.5897611963,,, +16.0722656250,257,0.2464332036,-0.0007629511,0.1991302358,,, +16.0742187500,257,0.2479591058,-0.0007629511,0.4371709773,,, +16.0761718750,257,0.2510109102,-0.0007629511,0.1335164416,,, +16.0781250000,257,0.2525368124,-0.0007629511,0.8506904707,,, +16.0800781250,257,0.2540627146,-0.0007629511,0.1808194095,,, +16.0820312500,257,0.2555886168,-0.0007629511,0.0617990387,,, +16.0839843750,257,0.2586404211,-0.0007629511,0.1594567788,,, +16.0859375000,257,0.2601663233,-0.0007629511,0.8262760357,,, +16.0878906250,257,0.2616922255,-0.0007629511,0.2937361715,,, +16.0898437500,257,0.2632181277,-0.0007629511,0.6446936751,,, +16.0917968750,257,0.2662699321,-0.0007629511,0.9025711452,,, +16.0937500000,257,0.2677958343,-0.0007629511,0.9788662547,,, +16.0957031250,257,0.2693217365,-0.0007629511,0.3929198138,,, +16.0976562500,257,0.2708476387,-0.0007629511,0.4768444343,,, +16.0996093750,257,0.2738994430,-0.0007629511,0.2784771496,,, +16.1015625000,257,0.2754253452,-0.0007629511,0.4127565423,,, +16.1035156250,257,0.2769512474,-0.0007629511,0.0343327993,,, +16.1054687500,257,0.2800030518,-0.0007629511,0.9239337758,,, +16.1074218750,257,0.2815289540,-0.0007629511,0.7728694591,,, +16.1093750000,257,0.2830548562,-0.0007629511,0.1686121920,,, +16.1113281250,257,0.2845807584,-0.0007629511,0.4921034562,,, +16.1132812500,257,0.2876325628,-0.0007629511,0.7362478065,,, +16.1152343750,257,0.2891584649,-0.0007629511,0.3852903029,,, +16.1171875000,257,0.2906843671,-0.0007629511,0.4921034562,,, +16.1191406250,257,0.2937361715,-0.0007629511,0.8033875029,,, +16.1210937500,257,0.2952620737,-0.0007629511,0.5989166094,,, +16.1230468750,257,0.2967879759,-0.0007629511,0.4463263905,,, +16.1250000000,258,0.2998397803,-0.0007629511,0.4051270314,,, +16.1269531250,258,0.3013656825,-0.0007629511,0.5561913481,,, +16.1289062500,258,0.3028915846,-0.0007629511,0.4585336080,,, +16.1308593750,258,0.3059433890,-0.0007629511,0.5851834897,,, +16.1328125000,258,0.3074692912,-0.0007629511,0.4356450752,,, +16.1347656250,258,0.3089951934,-0.0007629511,0.2738994430,,, +16.1367187500,258,0.3120469978,-0.0007629511,0.9330891890,,, +16.1386718750,258,0.3135729000,-0.0007629511,0.0984206912,,, +16.1406250000,258,0.3150988022,-0.0007629511,0.9163042649,,, +16.1425781250,258,0.3181506065,-0.0007629511,0.6126497292,,, +16.1445312500,258,0.3196765087,-0.0007629511,0.3746089876,,, +16.1464843750,258,0.3212024109,-0.0007629511,0.1548790723,,, +16.1484375000,258,0.3242542153,-0.0007629511,0.0694285496,,, +16.1503906250,258,0.3257801175,-0.0007629511,0.6340123598,,, +16.1523437500,258,0.3273060197,-0.0007629511,0.0175478752,,, +16.1542968750,258,0.3303578241,-0.0007629511,0.8171206226,,, +16.1562500000,258,0.3318837263,-0.0007629511,0.7316700999,,, +16.1582031250,258,0.3349355306,-0.0007629511,0.8369573510,,, +16.1601562500,258,0.3364614328,-0.0007629511,0.2693217365,,, +16.1621093750,258,0.3379873350,-0.0007629511,0.8491645686,,, +16.1640625000,258,0.3410391394,-0.0007629511,0.9727626459,,, +16.1660156250,258,0.3425650416,-0.0007629511,0.0556954299,,, +16.1679687500,258,0.3456168460,-0.0007629511,0.7606622416,,, +16.1699218750,258,0.3471427481,-0.0007629511,0.2967879759,,, +16.1718750000,258,0.3486686503,-0.0007629511,0.4737926299,,, +16.1738281250,258,0.3517204547,-0.0007629511,0.1823453117,,, +16.1757812500,258,0.3532463569,-0.0007629511,0.4890516518,,, +16.1777343750,258,0.3562981613,-0.0007629511,0.7240405890,,, +16.1796875000,258,0.3578240635,-0.0007629511,0.3654535744,,, +16.1816406250,258,0.3593499657,-0.0007629511,0.5149919890,,, +16.1835937500,258,0.3624017700,-0.0007629511,0.0205996796,,, +16.1855468750,258,0.3639276722,-0.0007629511,0.4783703365,,, +16.1875000000,259,0.3669794766,-0.0007629511,0.7896543832,,, +16.1894531250,259,0.3685053788,-0.0007629511,0.9925993744,,, +16.1914062500,259,0.3715571832,-0.0007629511,0.7164110780,,, +16.1933593750,259,0.3730830854,-0.0007629511,0.6538490883,,, +16.1953125000,259,0.3761348898,-0.0007629511,0.8522163729,,, +16.1972656250,259,0.3776607919,-0.0007629511,0.6126497292,,, +16.1992187500,259,0.3791866941,-0.0007629511,0.4615854124,,, +16.2011718750,259,0.3822384985,-0.0007629511,0.1014724956,,, +16.2031250000,259,0.3837644007,-0.0007629511,0.7484550240,,, +16.2050781250,259,0.3868162051,-0.0007629511,0.4921034562,,, +16.2070312500,259,0.3883421073,-0.0007629511,0.4005493248,,, +16.2089843750,259,0.3913939117,-0.0007629511,0.0007629511,,, +16.2109375000,259,0.3929198138,-0.0007629511,0.5027847715,,, +16.2128906250,259,0.3959716182,-0.0007629511,0.4448004883,,, +16.2148437500,259,0.3974975204,-0.0007629511,0.3318837263,,, +16.2167968750,259,0.4005493248,-0.0007629511,0.6645304036,,, +16.2187500000,259,0.4020752270,-0.0007629511,0.6370641642,,, +16.2207031250,259,0.4051270314,-0.0007629511,0.9239337758,,, +16.2226562500,259,0.4066529335,-0.0007629511,0.4112306401,,, +16.2246093750,259,0.4097047379,-0.0007629511,0.3440909438,,, +16.2265625000,259,0.4112306401,-0.0007629511,0.0694285496,,, +16.2285156250,259,0.4142824445,-0.0007629511,0.2632181277,,, +16.2304687500,259,0.4158083467,-0.0007629511,0.8003356985,,, +16.2324218750,259,0.4188601511,-0.0007629511,0.9529259174,,, +16.2343750000,259,0.4203860533,-0.0007629511,0.0114442664,,, +16.2363281250,259,0.4234378576,-0.0007629511,0.1106279088,,, +16.2382812500,259,0.4249637598,-0.0007629511,0.9956511788,,, +16.2402343750,259,0.4280155642,-0.0007629511,0.0343327993,,, +16.2421875000,259,0.4295414664,-0.0007629511,0.1838712139,,, +16.2441406250,259,0.4325932708,-0.0007629511,0.0282291905,,, +16.2460937500,259,0.4341191730,-0.0007629511,0.1335164416,,, +16.2480468750,259,0.4371709773,-0.0007629511,0.4890516518,,, +16.2500000000,260,0.4386968795,-0.0007629511,0.7957579919,,, +16.2519531250,260,0.4417486839,-0.0007629511,0.1731898985,,, +16.2539062500,260,0.4432745861,-0.0007629511,0.7072556649,,, +16.2558593750,260,0.4463263905,-0.0007629511,0.6279087510,,, +16.2578125000,260,0.4493781949,-0.0007629511,0.8064393072,,, +16.2597656250,260,0.4509040970,-0.0007629511,0.2220187686,,, +16.2617187500,260,0.4539559014,-0.0007629511,0.1625085832,,, +16.2636718750,260,0.4554818036,-0.0007629511,0.2418554971,,, +16.2656250000,260,0.4585336080,-0.0007629511,0.3456168460,,, +16.2675781250,260,0.4600595102,-0.0007629511,0.9086747539,,, +16.2695312500,260,0.4631113146,-0.0007629511,0.0312809949,,, +16.2714843750,260,0.4646372168,-0.0007629511,0.7881284810,,, +16.2734375000,260,0.4676890211,-0.0007629511,0.3807125963,,, +16.2753906250,260,0.4707408255,-0.0007629511,0.7515068284,,, +16.2773437500,260,0.4722667277,-0.0007629511,0.3364614328,,, +16.2792968750,260,0.4753185321,-0.0007629511,0.5790798810,,, +16.2812500000,260,0.4768444343,-0.0007629511,0.3181506065,,, +16.2832031250,260,0.4798962387,-0.0007629511,0.0175478752,,, +16.2851562500,260,0.4814221408,-0.0007629511,0.6050202182,,, +16.2871093750,260,0.4844739452,-0.0007629511,0.4585336080,,, +16.2890625000,260,0.4875257496,-0.0007629511,0.0495918212,,, +16.2910156250,260,0.4890516518,-0.0007629511,0.9346150912,,, +16.2929687500,260,0.4921034562,-0.0007629511,0.7270923934,,, +16.2949218750,260,0.4936293584,-0.0007629511,0.7301441978,,, +16.2968750000,260,0.4966811627,-0.0007629511,0.7240405890,,, +16.2988281250,260,0.4997329671,-0.0007629511,0.4936293584,,, +16.3007812500,260,0.5012588693,-0.0007629511,0.8705271992,,, +16.3027343750,260,0.5043106737,-0.0007629511,0.3562981613,,, +16.3046875000,260,0.5058365759,-0.0007629511,0.0923170825,,, +16.3066406250,260,0.5088883803,-0.0007629511,0.3303578241,,, +16.3085937500,260,0.5119401846,-0.0007629511,0.5897611963,,, +16.3105468750,260,0.5134660868,-0.0007629511,0.5317769131,,, +16.3125000000,261,0.5165178912,-0.0007629511,0.3685053788,,, +16.3144531250,261,0.5195696956,-0.0007629511,0.7667658503,,, +16.3164062500,261,0.5210955978,-0.0007629511,0.6050202182,,, +16.3183593750,261,0.5241474022,-0.0007629511,0.3974975204,,, +16.3203125000,261,0.5256733043,-0.0007629511,0.1518272679,,, +16.3222656250,261,0.5287251087,-0.0007629511,0.6294346532,,, +16.3242187500,261,0.5317769131,-0.0007629511,0.2922102693,,, +16.3261718750,261,0.5333028153,-0.0007629511,0.2052338445,,, +16.3281250000,261,0.5363546197,-0.0007629511,0.8690012970,,, +16.3300781250,261,0.5394064240,-0.0007629511,0.8918898299,,, +16.3320312500,261,0.5409323262,-0.0007629511,0.4249637598,,, +16.3339843750,261,0.5439841306,-0.0007629511,0.1380941482,,, +16.3359375000,261,0.5470359350,-0.0007629511,0.8247501335,,, +16.3378906250,261,0.5485618372,-0.0007629511,0.5668726635,,, +16.3398437500,261,0.5516136416,-0.0007629511,0.6248569467,,, +16.3417968750,261,0.5546654459,-0.0007629511,0.0419623102,,, +16.3437500000,261,0.5561913481,-0.0007629511,0.7713435569,,, +16.3457031250,261,0.5592431525,-0.0007629511,0.8232242313,,, +16.3476562500,261,0.5622949569,-0.0007629511,0.7911802853,,, +16.3496093750,261,0.5638208591,-0.0007629511,0.2662699321,,, +16.3515625000,261,0.5668726635,-0.0007629511,0.2540627146,,, +16.3535156250,261,0.5699244678,-0.0007629511,0.2098115511,,, +16.3554687500,261,0.5714503700,-0.0007629511,0.4921034562,,, +16.3574218750,261,0.5745021744,-0.0007629511,0.6355382620,,, +16.3593750000,261,0.5775539788,-0.0007629511,0.1701380941,,, +16.3613281250,261,0.5790798810,-0.0007629511,0.9864957656,,, +16.3632812500,261,0.5821316854,-0.0007629511,0.7988097963,,, +16.3652343750,261,0.5851834897,-0.0007629511,0.3013656825,,, +16.3671875000,261,0.5867093919,-0.0007629511,0.6797894255,,, +16.3691406250,261,0.5897611963,-0.0007629511,0.3959716182,,, +16.3710937500,261,0.5928130007,-0.0007629511,0.9880216678,,, +16.3730468750,261,0.5943389029,-0.0007629511,0.5821316854,,, +16.3750000000,262,0.5973907073,-0.0007629511,0.9025711452,,, +16.3769531250,262,0.6004425116,-0.0007629511,0.2357518883,,, +16.3789062500,262,0.6034943160,-0.0007629511,0.0022888533,,, +16.3808593750,262,0.6050202182,-0.0007629511,0.9407186999,,, +16.3828125000,262,0.6080720226,-0.0007629511,0.0068665599,,, +16.3847656250,262,0.6111238270,-0.0007629511,0.5500877394,,, +16.3867187500,262,0.6126497292,-0.0007629511,0.1548790723,,, +16.3886718750,262,0.6157015335,-0.0007629511,0.0709544518,,, +16.3906250000,262,0.6187533379,-0.0007629511,0.0846875715,,, +16.3925781250,262,0.6202792401,-0.0007629511,0.1884489204,,, +16.3945312500,262,0.6233310445,-0.0007629511,0.2372777905,,, +16.3964843750,262,0.6263828489,-0.0007629511,0.6828412299,,, +16.3984375000,262,0.6294346532,-0.0007629511,0.1060502022,,, +16.4003906250,262,0.6309605554,-0.0007629511,0.9422446021,,, +16.4023437500,262,0.6340123598,-0.0007629511,0.8278019379,,, +16.4042968750,262,0.6370641642,-0.0007629511,0.8155947204,,, +16.4062500000,262,0.6401159686,-0.0007629511,0.3791866941,,, +16.4082031250,262,0.6416418708,-0.0007629511,0.6904707408,,, +16.4101562500,262,0.6446936751,-0.0007629511,0.0999465934,,, +16.4121093750,262,0.6477454795,-0.0007629511,0.9437705043,,, +16.4140625000,262,0.6492713817,-0.0007629511,0.6233310445,,, +16.4160156250,262,0.6523231861,-0.0007629511,0.2708476387,,, +16.4179687500,262,0.6553749905,-0.0007629511,0.8796826123,,, +16.4199218750,262,0.6584267948,-0.0007629511,0.2128633555,,, +16.4218750000,262,0.6599526970,-0.0007629511,0.1701380941,,, +16.4238281250,262,0.6630045014,-0.0007629511,0.3990234226,,, +16.4257812500,262,0.6660563058,-0.0007629511,0.8491645686,,, +16.4277343750,262,0.6691081102,-0.0007629511,0.4982070649,,, +16.4296875000,262,0.6706340124,-0.0007629511,0.9651331350,,, +16.4316406250,262,0.6736858167,-0.0007629511,0.2174410620,,, +16.4335937500,262,0.6767376211,-0.0007629511,0.2510109102,,, +16.4355468750,262,0.6797894255,-0.0007629511,0.6462195773,,, +16.4375000000,263,0.6813153277,-0.0007629511,0.8613717861,,, +16.4394531250,263,0.6843671321,-0.0007629511,0.8537422751,,, +16.4414062500,263,0.6874189364,-0.0007629511,0.4203860533,,, +16.4433593750,263,0.6904707408,-0.0007629511,0.9971770809,,, +16.4453125000,263,0.6919966430,-0.0007629511,0.2327000839,,, +16.4472656250,263,0.6950484474,-0.0007629511,0.3791866941,,, +16.4492187500,263,0.6981002518,-0.0007629511,0.5455100328,,, +16.4511718750,263,0.7011520562,-0.0007629511,0.3944457160,,, +16.4531250000,263,0.7042038605,-0.0007629511,0.0968947890,,, +16.4550781250,263,0.7057297627,-0.0007629511,0.4203860533,,, +16.4570312500,263,0.7087815671,-0.0007629511,0.6660563058,,, +16.4589843750,263,0.7118333715,-0.0007629511,0.5882352941,,, +16.4609375000,263,0.7148851759,-0.0007629511,0.0801098650,,, +16.4628906250,263,0.7164110780,-0.0007629511,0.0236514839,,, +16.4648437500,263,0.7194628824,-0.0007629511,0.7331960021,,, +16.4667968750,263,0.7225146868,-0.0007629511,0.7698176547,,, +16.4687500000,263,0.7255664912,-0.0007629511,0.3059433890,,, +16.4707031250,263,0.7286182956,-0.0007629511,0.0022888533,,, +16.4726562500,263,0.7301441978,-0.0007629511,0.6507972839,,, +16.4746093750,263,0.7331960021,-0.0007629511,0.5546654459,,, +16.4765625000,263,0.7362478065,-0.0007629511,0.2952620737,,, +16.4785156250,263,0.7392996109,-0.0007629511,0.6157015335,,, +16.4804687500,263,0.7423514153,-0.0007629511,0.1182574197,,, +16.4824218750,263,0.7438773175,-0.0007629511,0.7927061875,,, +16.4843750000,263,0.7469291218,-0.0007629511,0.6630045014,,, +16.4863281250,263,0.7499809262,-0.0007629511,0.2235446708,,, +16.4882812500,263,0.7530327306,-0.0007629511,0.0816357671,,, +16.4902343750,263,0.7545586328,-0.0007629511,0.7942320897,,, +16.4921875000,263,0.7576104372,-0.0007629511,0.5775539788,,, +16.4941406250,263,0.7606622416,-0.0007629511,0.3288319219,,, +16.4960937500,263,0.7637140459,-0.0007629511,0.5928130007,,, +16.4980468750,263,0.7667658503,-0.0007629511,0.4570077058,,, +16.5000000000,264,0.7682917525,-0.0007629511,0.3501945525,,, +16.5019531250,264,0.7713435569,-0.0007629511,0.9071488518,,, +16.5039062500,264,0.7743953613,-0.0007629511,0.3593499657,,, +16.5058593750,264,0.7774471656,-0.0007629511,0.9559777218,,, +16.5078125000,264,0.7804989700,-0.0007629511,0.6675822080,,, +16.5097656250,264,0.7835507744,-0.0007629511,0.4264896620,,, +16.5117187500,264,0.7850766766,-0.0007629511,0.1716639963,,, +16.5136718750,264,0.7881284810,-0.0007629511,0.9910734722,,, +16.5156250000,264,0.7911802853,-0.0007629511,0.2525368124,,, +16.5175781250,264,0.7942320897,-0.0007629511,0.4371709773,,, +16.5195312500,264,0.7972838941,-0.0007629511,0.1319905394,,, +16.5214843750,264,0.7988097963,-0.0007629511,0.5653467613,,, +16.5234375000,264,0.8018616007,-0.0007629511,0.9422446021,,, +16.5253906250,264,0.8049134051,-0.0007629511,0.3456168460,,, +16.5273437500,264,0.8079652094,-0.0007629511,0.9269855802,,, +16.5292968750,264,0.8110170138,-0.0007629511,0.2479591058,,, +16.5312500000,264,0.8125429160,-0.0007629511,0.5912870985,,, +16.5332031250,264,0.8155947204,-0.0007629511,0.1533531701,,, +16.5351562500,264,0.8186465248,-0.0007629511,0.1487754635,,, +16.5371093750,264,0.8216983291,-0.0007629511,0.3257801175,,, +16.5390625000,264,0.8247501335,-0.0007629511,0.6721599145,,, +16.5410156250,264,0.8278019379,-0.0007629511,0.4097047379,,, +16.5429687500,264,0.8293278401,-0.0007629511,0.8751049058,,, +16.5449218750,264,0.8323796445,-0.0007629511,0.7560845350,,, +16.5468750000,264,0.8354314488,-0.0007629511,0.9849698634,,, +16.5488281250,264,0.8384832532,-0.0007629511,0.0328068971,,, +16.5507812500,264,0.8415350576,-0.0007629511,0.1716639963,,, +16.5527343750,264,0.8445868620,-0.0007629511,0.8247501335,,, +16.5546875000,264,0.8461127642,-0.0007629511,0.6981002518,,, +16.5566406250,264,0.8491645686,-0.0007629511,0.0694285496,,, +16.5585937500,264,0.8522163729,-0.0007629511,0.5638208591,,, +16.5605468750,264,0.8552681773,-0.0007629511,0.5256733043,,, +16.5625000000,265,0.8583199817,-0.0007629511,0.4905775540,,, +16.5644531250,265,0.8613717861,-0.0007629511,0.4859998474,,, +16.5664062500,265,0.8628976883,-0.0007629511,0.0389105058,,, +16.5683593750,265,0.8659494926,-0.0007629511,0.6752117189,,, +16.5703125000,265,0.8690012970,-0.0007629511,0.3349355306,,, +16.5722656250,265,0.8720531014,-0.0007629511,0.9346150912,,, +16.5742187500,265,0.8751049058,-0.0007629511,0.0511177234,,, +16.5761718750,265,0.8781567102,-0.0007629511,0.7530327306,,, +16.5781250000,265,0.8796826123,-0.0007629511,0.5699244678,,, +16.5800781250,265,0.8827344167,-0.0007629511,0.2464332036,,, +16.5820312500,265,0.8857862211,-0.0007629511,0.4951552605,,, +16.5839843750,265,0.8888380255,-0.0007629511,0.1670862898,,, +16.5859375000,265,0.8918898299,-0.0007629511,0.5821316854,,, +16.5878906250,265,0.8949416342,-0.0007629511,0.7667658503,,, +16.5898437500,265,0.8979934386,-0.0007629511,0.7392996109,,, +16.5917968750,265,0.8995193408,-0.0007629511,0.4798962387,,, +16.5937500000,265,0.9025711452,-0.0007629511,0.8598458839,,, +16.5957031250,265,0.9056229496,-0.0007629511,0.3654535744,,, +16.5976562500,265,0.9086747539,-0.0007629511,0.2876325628,,, +16.5996093750,265,0.9117265583,-0.0007629511,0.6095979248,,, +16.6015625000,265,0.9147783627,-0.0007629511,0.1258869306,,, +16.6035156250,265,0.9163042649,-0.0007629511,0.8079652094,,, +16.6054687500,265,0.9193560693,-0.0007629511,0.0938429847,,, +16.6074218750,265,0.9224078737,-0.0007629511,0.9575036240,,, +16.6093750000,265,0.9254596780,-0.0007629511,0.3425650416,,, +16.6113281250,265,0.9285114824,-0.0007629511,0.2189669642,,, +16.6132812500,265,0.9315632868,-0.0007629511,0.8903639277,,, +16.6152343750,265,0.9346150912,-0.0007629511,0.6614785992,,, +16.6171875000,265,0.9361409934,-0.0007629511,0.2388036927,,, +16.6191406250,265,0.9391927977,-0.0007629511,0.1167315175,,, +16.6210937500,265,0.9422446021,-0.0007629511,0.6858930343,,, +16.6230468750,265,0.9452964065,-0.0007629511,0.6874189364,,, +16.6250000000,266,0.9483482109,-0.0007629511,0.4081788357,,, +16.6269531250,266,0.9514000153,-0.0007629511,0.7515068284,,, +16.6289062500,266,0.9529259174,-0.0007629511,0.6309605554,,, +16.6308593750,266,0.9559777218,-0.0007629511,0.7240405890,,, +16.6328125000,266,0.9590295262,-0.0007629511,0.4478522927,,, +16.6347656250,266,0.9620813306,-0.0007629511,0.3700312810,,, +16.6367187500,266,0.9651331350,-0.0007629511,0.9239337758,,, +16.6386718750,266,0.9681849393,-0.0007629511,0.7270923934,,, +16.6406250000,266,0.9712367437,-0.0007629511,0.1609826810,,, +16.6425781250,266,0.9727626459,-0.0007629511,0.2876325628,,, +16.6445312500,266,0.9758144503,-0.0007629511,0.5943389029,,, +16.6464843750,266,0.9788662547,-0.0007629511,0.7118333715,,, +16.6484375000,266,0.9819180591,-0.0007629511,0.5455100328,,, +16.6503906250,266,0.9849698634,-0.0007629511,0.1014724956,,, +16.6523437500,266,0.9880216678,-0.0007629511,0.5195696956,,, +16.6542968750,266,0.9910734722,-0.0007629511,0.9727626459,,, +16.6562500000,266,0.9925993744,-0.0007629511,0.0755321584,,, +16.6582031250,266,0.9956511788,-0.0007629511,0.2861066606,,, +16.6601562500,266,0.9987029831,-0.0007629511,0.4356450752,,, +16.6621093750,266,1.0017547875,0.9987029831,0.9666590372,,, +16.6640625000,266,1.0048065919,0.9987029831,0.0923170825,,, +16.6660156250,266,1.0078583963,0.9987029831,0.9697108415,,, +16.6679687500,266,1.0109102007,0.9987029831,0.7103074693,,, +16.6699218750,266,1.0124361028,0.9987029831,0.6828412299,,, +16.6718750000,266,1.0154879072,0.9987029831,0.9651331350,,, +16.6738281250,266,1.0185397116,0.9987029831,0.6797894255,,, +16.6757812500,266,1.0215915160,0.9987029831,0.1792935073,,, +16.6777343750,266,1.0246433204,0.9987029831,0.8064393072,,, +16.6796875000,266,1.0276951247,0.9987029831,0.7209887846,,, +16.6816406250,266,1.0307469291,0.9987029831,0.1350423438,,, +16.6835937500,266,1.0322728313,0.9987029831,0.2922102693,,, +16.6855468750,266,1.0353246357,0.9987029831,0.9040970474,,, +16.6875000000,267,1.0383764401,0.9987029831,0.9651331350,,, +16.6894531250,267,1.0414282444,0.9987029831,0.6401159686,,, +16.6914062500,267,1.0444800488,0.9987029831,0.8567940795,,, +16.6933593750,267,1.0475318532,0.9987029831,0.9254596780,,, +16.6953125000,267,1.0505836576,0.9987029831,0.5241474022,,, +16.6972656250,267,1.0521095598,0.9987029831,0.1884489204,,, +16.6992187500,267,1.0551613642,0.9987029831,0.7209887846,,, +16.7011718750,267,1.0582131685,0.9987029831,0.4234378576,,, +16.7031250000,267,1.0612649729,0.9987029831,0.3410391394,,, +16.7050781250,267,1.0643167773,0.9987029831,0.1533531701,,, +16.7070312500,267,1.0673685817,0.9987029831,0.8140688182,,, +16.7089843750,267,1.0688944839,0.9987029831,0.3791866941,,, +16.7109375000,267,1.0719462882,0.9987029831,0.5165178912,,, +16.7128906250,267,1.0749980926,0.9987029831,0.8918898299,,, +16.7148437500,267,1.0780498970,0.9987029831,0.4798962387,,, +16.7167968750,267,1.0811017014,0.9987029831,0.7240405890,,, +16.7187500000,267,1.0841535058,0.9987029831,0.8476386664,,, +16.7207031250,267,1.0872053101,0.9987029831,0.7133592737,,, +16.7226562500,267,1.0887312123,0.9987029831,0.3578240635,,, +16.7246093750,267,1.0917830167,0.9987029831,0.7957579919,,, +16.7265625000,267,1.0948348211,0.9987029831,0.1228351263,,, +16.7285156250,267,1.0978866255,0.9987029831,0.9605554284,,, +16.7304687500,267,1.1009384298,0.9987029831,0.8033875029,,, +16.7324218750,267,1.1039902342,0.9987029831,0.5073624781,,, +16.7343750000,267,1.1055161364,0.9987029831,0.3166247044,,, +16.7363281250,267,1.1085679408,0.9987029831,0.8842603189,,, +16.7382812500,267,1.1116197452,0.9987029831,0.0709544518,,, +16.7402343750,267,1.1146715496,0.9987029831,0.8751049058,,, +16.7421875000,267,1.1177233539,0.9987029831,0.7804989700,,, +16.7441406250,267,1.1207751583,0.9987029831,0.1533531701,,, +16.7460937500,267,1.1238269627,0.9987029831,0.4585336080,,, +16.7480468750,267,1.1253528649,0.9987029831,0.2876325628,,, +16.7500000000,268,1.1284046693,0.9987029831,0.3547722591,,, +16.7519531250,268,1.1314564736,0.9987029831,0.7316700999,,, +16.7539062500,268,1.1345082780,0.9987029831,0.5683985657,,, +16.7558593750,268,1.1375600824,0.9987029831,0.5195696956,,, +16.7578125000,268,1.1406118868,0.9987029831,0.3425650416,,, +16.7597656250,268,1.1421377890,0.9987029831,0.2891584649,,, +16.7617187500,268,1.1451895933,0.9987029831,0.4386968795,,, +16.7636718750,268,1.1482413977,0.9987029831,0.6935225452,,, +16.7656250000,268,1.1512932021,0.9987029831,0.3883421073,,, +16.7675781250,268,1.1543450065,0.9987029831,0.8949416342,,, +16.7695312500,268,1.1573968109,0.9987029831,0.7148851759,,, +16.7714843750,268,1.1589227131,0.9987029831,0.0480659190,,, +16.7734375000,268,1.1619745174,0.9987029831,0.8873121233,,, +16.7753906250,268,1.1650263218,0.9987029831,0.8186465248,,, +16.7773437500,268,1.1680781262,0.9987029831,0.7896543832,,, +16.7792968750,268,1.1711299306,0.9987029831,0.7881284810,,, +16.7812500000,268,1.1741817350,0.9987029831,0.4417486839,,, +16.7832031250,268,1.1757076371,0.9987029831,0.7240405890,,, +16.7851562500,268,1.1787594415,0.9987029831,0.8171206226,,, +16.7871093750,268,1.1818112459,0.9987029831,0.2174410620,,, +16.7890625000,268,1.1848630503,0.9987029831,0.5134660868,,, +16.7910156250,268,1.1879148547,0.9987029831,0.8125429160,,, +16.7929687500,268,1.1894407568,0.9987029831,0.3028915846,,, +16.7949218750,268,1.1924925612,0.9987029831,0.6843671321,,, +16.7968750000,268,1.1955443656,0.9987029831,0.6965743496,,, +16.7988281250,268,1.1985961700,0.9987029831,0.5546654459,,, +16.8007812500,268,1.2016479744,0.9987029831,0.7270923934,,, +16.8027343750,268,1.2046997787,0.9987029831,0.6065461204,,, +16.8046875000,268,1.2062256809,0.9987029831,0.5317769131,,, +16.8066406250,268,1.2092774853,0.9987029831,0.4005493248,,, +16.8085937500,268,1.2123292897,0.9987029831,0.9208819715,,, +16.8105468750,268,1.2153810941,0.9987029831,0.4493781949,,, +16.8125000000,269,1.2184328985,0.9987029831,0.5333028153,,, +16.8144531250,269,1.2199588006,0.9987029831,0.7347219043,,, +16.8164062500,269,1.2230106050,0.9987029831,0.1350423438,,, +16.8183593750,269,1.2260624094,0.9987029831,0.4386968795,,, +16.8203125000,269,1.2291142138,0.9987029831,0.1686121920,,, +16.8222656250,269,1.2321660182,0.9987029831,0.8445868620,,, +16.8242187500,269,1.2336919203,0.9987029831,0.1945525292,,, +16.8261718750,269,1.2367437247,0.9987029831,0.6218051423,,, +16.8281250000,269,1.2397955291,0.9987029831,0.7789730678,,, +16.8300781250,269,1.2428473335,0.9987029831,0.9117265583,,, +16.8320312500,269,1.2458991379,0.9987029831,0.2601663233,,, +16.8339843750,269,1.2474250401,0.9987029831,0.4982070649,,, +16.8359375000,269,1.2504768444,0.9987029831,0.4325932708,,, +16.8378906250,269,1.2535286488,0.9987029831,0.6446936751,,, +16.8398437500,269,1.2565804532,0.9987029831,0.2952620737,,, +16.8417968750,269,1.2596322576,0.9987029831,0.3730830854,,, +16.8437500000,269,1.2611581598,0.9987029831,0.4798962387,,, +16.8457031250,269,1.2642099641,0.9987029831,0.2708476387,,, +16.8476562500,269,1.2672617685,0.9987029831,0.1808194095,,, +16.8496093750,269,1.2703135729,0.9987029831,0.0236514839,,, +16.8515625000,269,1.2733653773,0.9987029831,0.7850766766,,, +16.8535156250,269,1.2748912795,0.9987029831,0.9849698634,,, +16.8554687500,269,1.2779430838,0.9987029831,0.8628976883,,, +16.8574218750,269,1.2809948882,0.9987029831,0.8934157321,,, +16.8593750000,269,1.2840466926,0.9987029831,0.2067597467,,, +16.8613281250,269,1.2855725948,0.9987029831,0.4524299992,,, +16.8632812500,269,1.2886243992,0.9987029831,0.0358587015,,, +16.8652343750,269,1.2916762036,0.9987029831,0.5104142824,,, +16.8671875000,269,1.2947280079,0.9987029831,0.6553749905,,, +16.8691406250,269,1.2977798123,0.9987029831,0.2967879759,,, +16.8710937500,269,1.2993057145,0.9987029831,0.5104142824,,, +16.8730468750,269,1.3023575189,0.9987029831,0.6401159686,,, +16.8750000000,270,1.3054093233,0.9987029831,0.0801098650,,, +16.8769531250,270,1.3084611276,0.9987029831,0.1396200504,,, +16.8789062500,270,1.3099870298,0.9987029831,0.9346150912,,, +16.8808593750,270,1.3130388342,0.9987029831,0.1319905394,,, +16.8828125000,270,1.3160906386,0.9987029831,0.5531395438,,, +16.8847656250,270,1.3191424430,0.9987029831,0.8125429160,,, +16.8867187500,270,1.3206683452,0.9987029831,0.4280155642,,, +16.8886718750,270,1.3237201495,0.9987029831,0.4005493248,,, +16.8906250000,270,1.3267719539,0.9987029831,0.0007629511,,, +16.8925781250,270,1.3298237583,0.9987029831,0.0694285496,,, +16.8945312500,270,1.3313496605,0.9987029831,0.8949416342,,, +16.8964843750,270,1.3344014649,0.9987029831,0.8690012970,,, +16.8984375000,270,1.3374532692,0.9987029831,0.1487754635,,, +16.9003906250,270,1.3405050736,0.9987029831,0.9742885481,,, +16.9023437500,270,1.3420309758,0.9987029831,0.5989166094,,, +16.9042968750,270,1.3450827802,0.9987029831,0.1441977569,,, +16.9062500000,270,1.3481345846,0.9987029831,0.4783703365,,, +16.9082031250,270,1.3511863890,0.9987029831,0.4112306401,,, +16.9101562500,270,1.3527122911,0.9987029831,0.7972838941,,, +16.9121093750,270,1.3557640955,0.9987029831,0.8323796445,,, +16.9140625000,270,1.3588158999,0.9987029831,0.5699244678,,, +16.9160156250,270,1.3618677043,0.9987029831,0.2601663233,,, +16.9179687500,270,1.3633936065,0.9987029831,0.8949416342,,, +16.9199218750,270,1.3664454108,0.9987029831,0.6858930343,,, +16.9218750000,270,1.3694972152,0.9987029831,0.0862134737,,, +16.9238281250,270,1.3710231174,0.9987029831,0.1426718547,,, +16.9257812500,270,1.3740749218,0.9987029831,0.3303578241,,, +16.9277343750,270,1.3771267262,0.9987029831,0.7698176547,,, +16.9296875000,270,1.3801785306,0.9987029831,0.3578240635,,, +16.9316406250,270,1.3817044327,0.9987029831,-0.0007629511,,, +16.9335937500,270,1.3847562371,0.9987029831,0.4432745861,,, +16.9355468750,270,1.3878080415,0.9987029831,0.0740062562,,, +16.9375000000,271,1.3893339437,0.9987029831,0.7469291218,,, +16.9394531250,271,1.3923857481,0.9987029831,0.1777676051,,, +16.9414062500,271,1.3954375525,0.9987029831,0.8613717861,,, +16.9433593750,271,1.3984893568,0.9987029831,0.0846875715,,, +16.9453125000,271,1.4000152590,0.9987029831,0.0144960708,,, +16.9472656250,271,1.4030670634,0.9987029831,0.3196765087,,, +16.9492187500,271,1.4061188678,0.9987029831,0.6263828489,,, +16.9511718750,271,1.4076447700,0.9987029831,0.0556954299,,, +16.9531250000,271,1.4106965743,0.9987029831,0.9147783627,,, +16.9550781250,271,1.4137483787,0.9987029831,0.3440909438,,, +16.9570312500,271,1.4152742809,0.9987029831,0.8796826123,,, +16.9589843750,271,1.4183260853,0.9987029831,0.2601663233,,, +16.9609375000,271,1.4213778897,0.9987029831,0.6141756313,,, +16.9628906250,271,1.4229037919,0.9987029831,0.1533531701,,, +16.9648437500,271,1.4259555962,0.9987029831,0.3913939117,,, +16.9667968750,271,1.4290074006,0.9987029831,0.9056229496,,, +16.9687500000,271,1.4305333028,0.9987029831,0.6218051423,,, +16.9707031250,271,1.4335851072,0.9987029831,0.7255664912,,, +16.9726562500,271,1.4366369116,0.9987029831,0.4905775540,,, +16.9746093750,271,1.4381628138,0.9987029831,0.5699244678,,, +16.9765625000,271,1.4412146181,0.9987029831,0.9483482109,,, +16.9785156250,271,1.4442664225,0.9987029831,0.0343327993,,, +16.9804687500,271,1.4457923247,0.9987029831,0.4905775540,,, +16.9824218750,271,1.4488441291,0.9987029831,0.1396200504,,, +16.9843750000,271,1.4518959335,0.9987029831,0.4982070649,,, +16.9863281250,271,1.4534218357,0.9987029831,0.7560845350,,, +16.9882812500,271,1.4564736400,0.9987029831,0.3334096284,,, +16.9902343750,271,1.4595254444,0.9987029831,0.9925993744,,, +16.9921875000,271,1.4610513466,0.9987029831,0.7286182956,,, +16.9941406250,271,1.4641031510,0.9987029831,0.7164110780,,, +16.9960937500,271,1.4671549554,0.9987029831,0.7835507744,,, +16.9980468750,271,1.4686808576,0.9987029831,0.4448004883,,, +17.0000000000,272,1.4717326619,0.9987029831,0.9330891890,,, +17.0019531250,272,1.4747844663,0.9987029831,0.5973907073,,, +17.0039062500,272,1.4763103685,0.9987029831,0.4158083467,,, +17.0058593750,272,1.4793621729,0.9987029831,0.7087815671,,, +17.0078125000,272,1.4808880751,0.9987029831,0.4478522927,,, +17.0097656250,272,1.4839398795,0.9987029831,0.1945525292,,, +17.0117187500,272,1.4869916838,0.9987029831,0.4936293584,,, +17.0136718750,272,1.4885175860,0.9987029831,0.0694285496,,, +17.0156250000,272,1.4915693904,0.9987029831,0.9987029831,,, +17.0175781250,272,1.4946211948,0.9987029831,0.0068665599,,, +17.0195312500,272,1.4961470970,0.9987029831,0.4280155642,,, +17.0214843750,272,1.4991989014,0.9987029831,0.7759212634,,, +17.0234375000,272,1.5007248035,0.9987029831,0.2265964752,,, +17.0253906250,272,1.5037766079,0.9987029831,0.2296482795,,, +17.0273437500,272,1.5068284123,0.9987029831,0.6248569467,,, +17.0292968750,272,1.5083543145,0.9987029831,0.0694285496,,, +17.0312500000,272,1.5114061189,0.9987029831,0.4737926299,,, +17.0332031250,272,1.5129320211,0.9987029831,0.6675822080,,, +17.0351562500,272,1.5159838254,0.9987029831,0.9590295262,,, +17.0371093750,272,1.5175097276,0.9987029831,0.3532463569,,, +17.0390625000,272,1.5205615320,0.9987029831,0.4203860533,,, +17.0410156250,272,1.5236133364,0.9987029831,0.1152056153,,, +17.0429687500,272,1.5251392386,0.9987029831,0.2281223774,,, +17.0449218750,272,1.5281910430,0.9987029831,0.7286182956,,, +17.0468750000,272,1.5297169451,0.9987029831,0.3974975204,,, +17.0488281250,272,1.5327687495,0.9987029831,0.3944457160,,, +17.0507812500,272,1.5358205539,0.9987029831,0.8247501335,,, +17.0527343750,272,1.5373464561,0.9987029831,0.6157015335,,, +17.0546875000,272,1.5403982605,0.9987029831,0.9437705043,,, +17.0566406250,272,1.5419241627,0.9987029831,0.6996261540,,, +17.0585937500,272,1.5449759670,0.9987029831,0.1747158007,,, +17.0605468750,272,1.5465018692,0.9987029831,0.8216983291,,, +17.0625000000,273,1.5495536736,0.9987029831,0.7392996109,,, +17.0644531250,273,1.5510795758,0.9987029831,0.5302510109,,, +17.0664062500,273,1.5541313802,0.9987029831,0.1518272679,,, +17.0683593750,273,1.5556572824,0.9987029831,0.0251773861,,, +17.0703125000,273,1.5587090867,0.9987029831,0.4417486839,,, +17.0722656250,273,1.5617608911,0.9987029831,0.6828412299,,, +17.0742187500,273,1.5632867933,0.9987029831,0.2204928664,,, +17.0761718750,273,1.5663385977,0.9987029831,0.5317769131,,, +17.0781250000,273,1.5678644999,0.9987029831,0.4127565423,,, +17.0800781250,273,1.5709163043,0.9987029831,0.0480659190,,, +17.0820312500,273,1.5724422065,0.9987029831,0.1701380941,,, +17.0839843750,273,1.5754940108,0.9987029831,0.4524299992,,, +17.0859375000,273,1.5770199130,0.9987029831,0.1533531701,,, +17.0878906250,273,1.5800717174,0.9987029831,0.0038147555,,, +17.0898437500,273,1.5815976196,0.9987029831,0.8354314488,,, +17.0917968750,273,1.5846494240,0.9987029831,0.4066529335,,, +17.0937500000,273,1.5861753262,0.9987029831,0.3532463569,,, +17.0957031250,273,1.5892271305,0.9987029831,0.9300373846,,, +17.0976562500,273,1.5907530327,0.9987029831,0.2723735409,,, +17.0996093750,273,1.5938048371,0.9987029831,0.9025711452,,, +17.1015625000,273,1.5953307393,0.9987029831,0.4554818036,,, +17.1035156250,273,1.5983825437,0.9987029831,0.8216983291,,, +17.1054687500,273,1.5999084459,0.9987029831,0.2708476387,,, +17.1074218750,273,1.6029602502,0.9987029831,0.4127565423,,, +17.1093750000,273,1.6044861524,0.9987029831,0.4264896620,,, +17.1113281250,273,1.6075379568,0.9987029831,0.8842603189,,, +17.1132812500,273,1.6090638590,0.9987029831,0.9208819715,,, +17.1152343750,273,1.6121156634,0.9987029831,0.7560845350,,, +17.1171875000,273,1.6136415656,0.9987029831,0.9498741131,,, +17.1191406250,273,1.6166933700,0.9987029831,0.1472495613,,, +17.1210937500,273,1.6182192721,0.9987029831,0.9239337758,,, +17.1230468750,273,1.6197451743,0.9987029831,0.2601663233,,, +17.1250000000,274,1.6227969787,0.9987029831,0.0419623102,,, +17.1269531250,274,1.6243228809,0.9987029831,0.8918898299,,, +17.1289062500,274,1.6273746853,0.9987029831,0.4051270314,,, +17.1308593750,274,1.6289005875,0.9987029831,0.5638208591,,, +17.1328125000,274,1.6319523919,0.9987029831,0.9819180591,,, +17.1347656250,274,1.6334782940,0.9987029831,0.0892652781,,, +17.1367187500,274,1.6365300984,0.9987029831,0.0404364080,,, +17.1386718750,274,1.6380560006,0.9987029831,0.8278019379,,, +17.1406250000,274,1.6395819028,0.9987029831,0.8781567102,,, +17.1425781250,274,1.6426337072,0.9987029831,0.2098115511,,, +17.1445312500,274,1.6441596094,0.9987029831,0.9636072328,,, +17.1464843750,274,1.6472114137,0.9987029831,0.8430609598,,, +17.1484375000,274,1.6487373159,0.9987029831,0.7606622416,,, +17.1503906250,274,1.6502632181,0.9987029831,0.6080720226,,, +17.1523437500,274,1.6533150225,0.9987029831,0.0007629511,,, +17.1542968750,274,1.6548409247,0.9987029831,0.9391927977,,, +17.1562500000,274,1.6578927291,0.9987029831,0.5745021744,,, +17.1582031250,274,1.6594186313,0.9987029831,0.1945525292,,, +17.1601562500,274,1.6609445335,0.9987029831,0.6507972839,,, +17.1621093750,274,1.6639963378,0.9987029831,0.2677958343,,, +17.1640625000,274,1.6655222400,0.9987029831,0.8033875029,,, +17.1660156250,274,1.6685740444,0.9987029831,0.9575036240,,, +17.1679687500,274,1.6700999466,0.9987029831,0.6538490883,,, +17.1699218750,274,1.6716258488,0.9987029831,0.6919966430,,, +17.1718750000,274,1.6746776532,0.9987029831,0.1548790723,,, +17.1738281250,274,1.6762035554,0.9987029831,0.1243610285,,, +17.1757812500,274,1.6777294575,0.9987029831,0.9925993744,,, +17.1777343750,274,1.6807812619,0.9987029831,0.4859998474,,, +17.1796875000,274,1.6823071641,0.9987029831,0.9590295262,,, +17.1816406250,274,1.6838330663,0.9987029831,0.3059433890,,, +17.1835937500,274,1.6868848707,0.9987029831,0.6492713817,,, +17.1855468750,274,1.6884107729,0.9987029831,0.8110170138,,, +17.1875000000,275,1.6914625772,0.9987029831,0.7957579919,,, +17.1894531250,275,1.6929884794,0.9987029831,0.4066529335,,, +17.1914062500,275,1.6945143816,0.9987029831,0.4600595102,,, +17.1933593750,275,1.6975661860,0.9987029831,0.9224078737,,, +17.1953125000,275,1.6990920882,0.9987029831,0.5195696956,,, +17.1972656250,275,1.7006179904,0.9987029831,0.4707408255,,, +17.1992187500,275,1.7021438926,0.9987029831,0.1930266270,,, +17.2011718750,275,1.7051956970,0.9987029831,0.4600595102,,, +17.2031250000,275,1.7067215991,0.9987029831,0.2540627146,,, +17.2050781250,275,1.7082475013,0.9987029831,0.3303578241,,, +17.2070312500,275,1.7112993057,0.9987029831,0.1503013657,,, +17.2089843750,275,1.7128252079,0.9987029831,0.7408255131,,, +17.2109375000,275,1.7143511101,0.9987029831,0.3395132372,,, +17.2128906250,275,1.7174029145,0.9987029831,0.8293278401,,, +17.2148437500,275,1.7189288167,0.9987029831,0.3303578241,,, +17.2167968750,275,1.7204547189,0.9987029831,0.4463263905,,, +17.2187500000,275,1.7219806210,0.9987029831,0.4463263905,,, +17.2207031250,275,1.7250324254,0.9987029831,0.3440909438,,, +17.2226562500,275,1.7265583276,0.9987029831,0.0083924620,,, +17.2246093750,275,1.7280842298,0.9987029831,0.2449073014,,, +17.2265625000,275,1.7311360342,0.9987029831,0.4295414664,,, +17.2285156250,275,1.7326619364,0.9987029831,0.8094911116,,, +17.2304687500,275,1.7341878386,0.9987029831,0.9391927977,,, +17.2324218750,275,1.7357137407,0.9987029831,0.8461127642,,, +17.2343750000,275,1.7387655451,0.9987029831,0.0617990387,,, +17.2363281250,275,1.7402914473,0.9987029831,0.2021820401,,, +17.2382812500,275,1.7418173495,0.9987029831,0.4448004883,,, +17.2402343750,275,1.7433432517,0.9987029831,0.6538490883,,, +17.2421875000,275,1.7463950561,0.9987029831,0.7759212634,,, +17.2441406250,275,1.7479209583,0.9987029831,0.0755321584,,, +17.2460937500,275,1.7494468605,0.9987029831,0.9178301671,,, +17.2480468750,275,1.7509727626,0.9987029831,0.5760280766,,, +17.2500000000,276,1.7524986648,0.9987029831,0.0465400168,,, +17.2519531250,276,1.7555504692,0.9987029831,0.7011520562,,, +17.2539062500,276,1.7570763714,0.9987029831,0.3303578241,,, +17.2558593750,276,1.7586022736,0.9987029831,0.3410391394,,, +17.2578125000,276,1.7601281758,0.9987029831,0.0633249409,,, +17.2597656250,276,1.7631799802,0.9987029831,0.2525368124,,, +17.2617187500,276,1.7647058824,0.9987029831,0.2479591058,,, +17.2636718750,276,1.7662317845,0.9987029831,0.4997329671,,, +17.2656250000,276,1.7677576867,0.9987029831,0.5180437934,,, +17.2675781250,276,1.7692835889,0.9987029831,0.9224078737,,, +17.2695312500,276,1.7708094911,0.9987029831,0.4112306401,,, +17.2714843750,276,1.7738612955,0.9987029831,0.1441977569,,, +17.2734375000,276,1.7753871977,0.9987029831,0.6553749905,,, +17.2753906250,276,1.7769130999,0.9987029831,0.9330891890,,, +17.2773437500,276,1.7784390021,0.9987029831,0.1075761044,,, +17.2792968750,276,1.7799649042,0.9987029831,0.3486686503,,, +17.2812500000,276,1.7814908064,0.9987029831,0.3517204547,,, +17.2832031250,276,1.7845426108,0.9987029831,0.8628976883,,, +17.2851562500,276,1.7860685130,0.9987029831,0.9819180591,,, +17.2871093750,276,1.7875944152,0.9987029831,0.9605554284,,, +17.2890625000,276,1.7891203174,0.9987029831,0.9864957656,,, +17.2910156250,276,1.7906462196,0.9987029831,0.1609826810,,, +17.2929687500,276,1.7921721218,0.9987029831,0.8628976883,,, +17.2949218750,276,1.7936980240,0.9987029831,0.6218051423,,, +17.2968750000,276,1.7967498283,0.9987029831,0.6691081102,,, +17.2988281250,276,1.7982757305,0.9987029831,0.5531395438,,, +17.3007812500,276,1.7998016327,0.9987029831,0.1258869306,,, +17.3027343750,276,1.8013275349,0.9987029831,0.9376668956,,, +17.3046875000,276,1.8028534371,0.9987029831,0.6385900664,,, +17.3066406250,276,1.8043793393,0.9987029831,0.2540627146,,, +17.3085937500,276,1.8059052415,0.9987029831,0.3624017700,,, +17.3105468750,276,1.8074311437,0.9987029831,0.8186465248,,, +17.3125000000,277,1.8089570459,0.9987029831,0.4371709773,,, +17.3144531250,277,1.8104829480,0.9987029831,0.0083924620,,, +17.3164062500,277,1.8135347524,0.9987029831,0.9040970474,,, +17.3183593750,277,1.8150606546,0.9987029831,0.5027847715,,, +17.3203125000,277,1.8165865568,0.9987029831,0.7438773175,,, +17.3222656250,277,1.8181124590,0.9987029831,0.7392996109,,, +17.3242187500,277,1.8196383612,0.9987029831,0.1091020066,,, +17.3261718750,277,1.8211642634,0.9987029831,0.9681849393,,, +17.3281250000,277,1.8226901656,0.9987029831,0.4600595102,,, +17.3300781250,277,1.8242160678,0.9987029831,0.9040970474,,, +17.3320312500,277,1.8257419699,0.9987029831,0.0831616693,,, +17.3339843750,277,1.8272678721,0.9987029831,0.6584267948,,, +17.3359375000,277,1.8287937743,0.9987029831,0.2128633555,,, +17.3378906250,277,1.8303196765,0.9987029831,0.8888380255,,, +17.3398437500,277,1.8318455787,0.9987029831,0.9681849393,,, +17.3417968750,277,1.8333714809,0.9987029831,0.1503013657,,, +17.3437500000,277,1.8348973831,0.9987029831,0.0679026474,,, +17.3457031250,277,1.8364232853,0.9987029831,0.2433813993,,, +17.3476562500,277,1.8379491875,0.9987029831,0.4295414664,,, +17.3496093750,277,1.8394750896,0.9987029831,0.0770580606,,, +17.3515625000,277,1.8410009918,0.9987029831,0.9239337758,,, +17.3535156250,277,1.8425268940,0.9987029831,0.3471427481,,, +17.3554687500,277,1.8440527962,0.9987029831,0.2220187686,,, +17.3574218750,277,1.8455786984,0.9987029831,0.7774471656,,, +17.3593750000,277,1.8471046006,0.9987029831,0.4173342489,,, +17.3613281250,277,1.8486305028,0.9987029831,0.0740062562,,, +17.3632812500,277,1.8501564050,0.9987029831,0.0328068971,,, +17.3652343750,277,1.8516823072,0.9987029831,0.8735790036,,, +17.3671875000,277,1.8532082094,0.9987029831,0.1045243000,,, +17.3691406250,277,1.8547341115,0.9987029831,0.4966811627,,, +17.3710937500,277,1.8562600137,0.9987029831,0.6492713817,,, +17.3730468750,277,1.8577859159,0.9987029831,0.9529259174,,, +17.3750000000,278,1.8593118181,0.9987029831,0.1091020066,,, +17.3769531250,278,1.8608377203,0.9987029831,0.7591363394,,, +17.3789062500,278,1.8623636225,0.9987029831,0.1136797131,,, +17.3808593750,278,1.8638895247,0.9987029831,0.9697108415,,, +17.3828125000,278,1.8654154269,0.9987029831,0.5577172503,,, +17.3847656250,278,1.8669413291,0.9987029831,0.8567940795,,, +17.3867187500,278,1.8684672313,0.9987029831,0.0358587015,,, +17.3886718750,278,1.8684672313,0.9987029831,0.1716639963,,, +17.3906250000,278,1.8699931334,0.9987029831,0.5577172503,,, +17.3925781250,278,1.8715190356,0.9987029831,0.9132524605,,, +17.3945312500,278,1.8730449378,0.9987029831,0.1457236591,,, +17.3964843750,278,1.8745708400,0.9987029831,0.6981002518,,, +17.3984375000,278,1.8760967422,0.9987029831,0.7301441978,,, +17.4003906250,278,1.8776226444,0.9987029831,0.5653467613,,, +17.4023437500,278,1.8791485466,0.9987029831,0.6736858167,,, +17.4042968750,278,1.8806744488,0.9987029831,0.5256733043,,, +17.4062500000,278,1.8806744488,0.9987029831,0.9102006561,,, +17.4082031250,278,1.8822003510,0.9987029831,0.1380941482,,, +17.4101562500,278,1.8837262531,0.9987029831,0.9697108415,,, +17.4121093750,278,1.8852521553,0.9987029831,0.1335164416,,, +17.4140625000,278,1.8867780575,0.9987029831,0.6370641642,,, +17.4160156250,278,1.8883039597,0.9987029831,0.1106279088,,, +17.4179687500,278,1.8898298619,0.9987029831,0.7698176547,,, +17.4199218750,278,1.8898298619,0.9987029831,0.1548790723,,, +17.4218750000,278,1.8913557641,0.9987029831,0.6034943160,,, +17.4238281250,278,1.8928816663,0.9987029831,0.5531395438,,, +17.4257812500,278,1.8944075685,0.9987029831,0.9452964065,,, +17.4277343750,278,1.8959334707,0.9987029831,0.8888380255,,, +17.4296875000,278,1.8974593729,0.9987029831,0.7148851759,,, +17.4316406250,278,1.8974593729,0.9987029831,0.2815289540,,, +17.4335937500,278,1.8989852750,0.9987029831,0.3288319219,,, +17.4355468750,278,1.9005111772,0.9987029831,0.0785839628,,, +17.4375000000,279,1.9020370794,0.9987029831,0.6660563058,,, +17.4394531250,279,1.9035629816,0.9987029831,0.4631113146,,, +17.4414062500,279,1.9035629816,0.9987029831,0.6431677729,,, +17.4433593750,279,1.9050888838,0.9987029831,0.3990234226,,, +17.4453125000,279,1.9066147860,0.9987029831,0.5180437934,,, +17.4472656250,279,1.9081406882,0.9987029831,0.2128633555,,, +17.4492187500,279,1.9096665904,0.9987029831,0.9697108415,,, +17.4511718750,279,1.9096665904,0.9987029831,0.9285114824,,, +17.4531250000,279,1.9111924926,0.9987029831,0.2204928664,,, +17.4550781250,279,1.9127183948,0.9987029831,0.8293278401,,, +17.4570312500,279,1.9142442969,0.9987029831,0.4859998474,,, +17.4589843750,279,1.9142442969,0.9987029831,0.1274128328,,, +17.4609375000,279,1.9157701991,0.9987029831,0.5043106737,,, +17.4628906250,279,1.9172961013,0.9987029831,0.7454032197,,, +17.4648437500,279,1.9188220035,0.9987029831,0.5699244678,,, +17.4667968750,279,1.9188220035,0.9987029831,0.1411459525,,, +17.4687500000,279,1.9203479057,0.9987029831,0.9895475700,,, +17.4707031250,279,1.9218738079,0.9987029831,0.7804989700,,, +17.4726562500,279,1.9218738079,0.9987029831,0.4219119554,,, +17.4746093750,279,1.9233997101,0.9987029831,0.5027847715,,, +17.4765625000,279,1.9249256123,0.9987029831,0.5668726635,,, +17.4785156250,279,1.9264515145,0.9987029831,0.6080720226,,, +17.4804687500,279,1.9264515145,0.9987029831,0.0282291905,,, +17.4824218750,279,1.9279774166,0.9987029831,0.4371709773,,, +17.4843750000,279,1.9295033188,0.9987029831,0.8201724269,,, +17.4863281250,279,1.9295033188,0.9987029831,0.2327000839,,, +17.4882812500,279,1.9310292210,0.9987029831,0.9697108415,,, +17.4902343750,279,1.9325551232,0.9987029831,0.9819180591,,, +17.4921875000,279,1.9325551232,0.9987029831,0.2449073014,,, +17.4941406250,279,1.9340810254,0.9987029831,0.2281223774,,, +17.4960937500,279,1.9356069276,0.9987029831,0.5165178912,,, +17.4980468750,279,1.9356069276,0.9987029831,0.2464332036,,, +17.5000000000,280,1.9371328298,0.9987029831,0.8690012970,,, +17.5019531250,280,1.9386587320,0.9987029831,0.8995193408,,, +17.5039062500,280,1.9386587320,0.9987029831,0.1213092241,,, +17.5058593750,280,1.9401846342,0.9987029831,0.1289387350,,, +17.5078125000,280,1.9401846342,0.9987029831,0.8735790036,,, +17.5097656250,280,1.9417105364,0.9987029831,0.2723735409,,, +17.5117187500,280,1.9432364385,0.9987029831,0.7118333715,,, +17.5136718750,280,1.9432364385,0.9987029831,0.7438773175,,, +17.5156250000,280,1.9447623407,0.9987029831,0.0923170825,,, +17.5175781250,280,1.9462882429,0.9987029831,0.6263828489,,, +17.5195312500,280,1.9462882429,0.9987029831,0.9529259174,,, +17.5214843750,280,1.9478141451,0.9987029831,0.0556954299,,, +17.5234375000,280,1.9478141451,0.9987029831,0.8400091554,,, +17.5253906250,280,1.9493400473,0.9987029831,0.2998397803,,, +17.5273437500,280,1.9493400473,0.9987029831,0.9163042649,,, +17.5292968750,280,1.9508659495,0.9987029831,0.5195696956,,, +17.5312500000,280,1.9523918517,0.9987029831,0.5638208591,,, +17.5332031250,280,1.9523918517,0.9987029831,0.4615854124,,, +17.5351562500,280,1.9539177539,0.9987029831,0.2494850080,,, +17.5371093750,280,1.9539177539,0.9987029831,0.4249637598,,, +17.5390625000,280,1.9554436561,0.9987029831,0.2922102693,,, +17.5410156250,280,1.9554436561,0.9987029831,0.4676890211,,, +17.5429687500,280,1.9569695583,0.9987029831,0.5104142824,,, +17.5449218750,280,1.9569695583,0.9987029831,0.2738994430,,, +17.5468750000,280,1.9584954604,0.9987029831,0.3547722591,,, +17.5488281250,280,1.9584954604,0.9987029831,0.8171206226,,, +17.5507812500,280,1.9600213626,0.9987029831,0.4325932708,,, +17.5527343750,280,1.9615472648,0.9987029831,0.2006561379,,, +17.5546875000,280,1.9615472648,0.9987029831,0.5775539788,,, +17.5566406250,280,1.9630731670,0.9987029831,0.7759212634,,, +17.5585937500,280,1.9630731670,0.9987029831,0.3273060197,,, +17.5605468750,280,1.9645990692,0.9987029831,0.7042038605,,, +17.5625000000,281,1.9645990692,0.9987029831,0.1365682460,,, +17.5644531250,281,1.9645990692,0.9987029831,0.1960784314,,, +17.5664062500,281,1.9661249714,0.9987029831,0.6370641642,,, +17.5683593750,281,1.9661249714,0.9987029831,0.9788662547,,, +17.5703125000,281,1.9676508736,0.9987029831,0.5867093919,,, +17.5722656250,281,1.9676508736,0.9987029831,0.8506904707,,, +17.5742187500,281,1.9691767758,0.9987029831,0.8644235904,,, +17.5761718750,281,1.9691767758,0.9987029831,0.9773403525,,, +17.5781250000,281,1.9707026780,0.9987029831,0.1060502022,,, +17.5800781250,281,1.9707026780,0.9987029831,0.0709544518,,, +17.5820312500,281,1.9722285801,0.9987029831,0.5424582284,,, +17.5839843750,281,1.9722285801,0.9987029831,0.3150988022,,, +17.5859375000,281,1.9722285801,0.9987029831,0.7988097963,,, +17.5878906250,281,1.9737544823,0.9987029831,0.0709544518,,, +17.5898437500,281,1.9737544823,0.9987029831,0.2021820401,,, +17.5917968750,281,1.9752803845,0.9987029831,0.7026779583,,, +17.5937500000,281,1.9752803845,0.9987029831,0.9086747539,,, +17.5957031250,281,1.9752803845,0.9987029831,0.9666590372,,, +17.5976562500,281,1.9768062867,0.9987029831,0.7469291218,,, +17.5996093750,281,1.9768062867,0.9987029831,0.1533531701,,, +17.6015625000,281,1.9783321889,0.9987029831,0.1564049744,,, +17.6035156250,281,1.9783321889,0.9987029831,0.9071488518,,, +17.6054687500,281,1.9783321889,0.9987029831,0.6691081102,,, +17.6074218750,281,1.9798580911,0.9987029831,0.9040970474,,, +17.6093750000,281,1.9798580911,0.9987029831,0.3028915846,,, +17.6113281250,281,1.9798580911,0.9987029831,0.6767376211,,, +17.6132812500,281,1.9813839933,0.9987029831,0.8567940795,,, +17.6152343750,281,1.9813839933,0.9987029831,0.7591363394,,, +17.6171875000,281,1.9829098955,0.9987029831,0.6126497292,,, +17.6191406250,281,1.9829098955,0.9987029831,0.5821316854,,, +17.6210937500,281,1.9829098955,0.9987029831,0.1258869306,,, +17.6230468750,281,1.9844357977,0.9987029831,0.5714503700,,, +17.6250000000,282,1.9844357977,0.9987029831,0.9147783627,,, +17.6269531250,282,1.9844357977,0.9987029831,0.6721599145,,, +17.6289062500,282,1.9844357977,0.9987029831,0.7133592737,,, +17.6308593750,282,1.9859616999,0.9987029831,0.7179369802,,, +17.6328125000,282,1.9859616999,0.9987029831,0.8705271992,,, +17.6347656250,282,1.9859616999,0.9987029831,0.4585336080,,, +17.6367187500,282,1.9874876020,0.9987029831,0.8049134051,,, +17.6386718750,282,1.9874876020,0.9987029831,0.9483482109,,, +17.6406250000,282,1.9874876020,0.9987029831,0.1167315175,,, +17.6425781250,282,1.9890135042,0.9987029831,0.4386968795,,, +17.6445312500,282,1.9890135042,0.9987029831,0.3288319219,,, +17.6464843750,282,1.9890135042,0.9987029831,0.8491645686,,, +17.6484375000,282,1.9890135042,0.9987029831,0.1106279088,,, +17.6503906250,282,1.9905394064,0.9987029831,0.8735790036,,, +17.6523437500,282,1.9905394064,0.9987029831,0.2815289540,,, +17.6542968750,282,1.9905394064,0.9987029831,0.2021820401,,, +17.6562500000,282,1.9905394064,0.9987029831,0.5851834897,,, +17.6582031250,282,1.9920653086,0.9987029831,0.0907911803,,, +17.6601562500,282,1.9920653086,0.9987029831,0.9773403525,,, +17.6621093750,282,1.9920653086,0.9987029831,0.0328068971,,, +17.6640625000,282,1.9920653086,0.9987029831,0.7728694591,,, +17.6660156250,282,1.9920653086,0.9987029831,0.9651331350,,, +17.6679687500,282,1.9935912108,0.9987029831,0.7331960021,,, +17.6699218750,282,1.9935912108,0.9987029831,0.9452964065,,, +17.6718750000,282,1.9935912108,0.9987029831,0.4890516518,,, +17.6738281250,282,1.9935912108,0.9987029831,0.7194628824,,, +17.6757812500,282,1.9935912108,0.9987029831,0.9895475700,,, +17.6777343750,282,1.9951171130,0.9987029831,0.8094911116,,, +17.6796875000,282,1.9951171130,0.9987029831,0.7713435569,,, +17.6816406250,282,1.9951171130,0.9987029831,0.4951552605,,, +17.6835937500,282,1.9951171130,0.9987029831,0.2342259861,,, +17.6855468750,282,1.9951171130,0.9987029831,0.7392996109,,, +17.6875000000,283,1.9951171130,0.9987029831,0.4722667277,,, +17.6894531250,283,1.9966430152,0.9987029831,0.0816357671,,, +17.6914062500,283,1.9966430152,0.9987029831,0.8293278401,,, +17.6933593750,283,1.9966430152,0.9987029831,0.8445868620,,, +17.6953125000,283,1.9966430152,0.9987029831,0.6782635233,,, +17.6972656250,283,1.9966430152,0.9987029831,0.5775539788,,, +17.6992187500,283,1.9966430152,0.9987029831,0.7789730678,,, +17.7011718750,283,1.9966430152,0.9987029831,0.1258869306,,, +17.7031250000,283,1.9981689174,0.9987029831,0.9239337758,,, +17.7050781250,283,1.9981689174,0.9987029831,0.6401159686,,, +17.7070312500,283,1.9981689174,0.9987029831,0.4066529335,,, +17.7089843750,283,1.9981689174,0.9987029831,0.0617990387,,, +17.7109375000,283,1.9981689174,0.9987029831,0.2662699321,,, +17.7128906250,283,1.9981689174,0.9987029831,0.1045243000,,, +17.7148437500,283,1.9981689174,0.9987029831,0.6523231861,,, +17.7167968750,283,1.9981689174,0.9987029831,0.6645304036,,, +17.7187500000,283,1.9981689174,0.9987029831,0.4921034562,,, +17.7207031250,283,1.9981689174,0.9987029831,0.2159151598,,, +17.7226562500,283,1.9981689174,0.9987029831,0.5165178912,,, +17.7246093750,283,1.9981689174,0.9987029831,0.9895475700,,, +17.7265625000,283,1.9981689174,0.9987029831,0.7896543832,,, +17.7285156250,283,1.9996948196,0.9987029831,0.6355382620,,, +17.7304687500,283,1.9996948196,0.9987029831,0.6462195773,,, +17.7324218750,283,1.9996948196,0.9987029831,0.1228351263,,, +17.7343750000,283,1.9996948196,0.9987029831,0.0892652781,,, +17.7363281250,283,1.9996948196,0.9987029831,0.5806057832,,, +17.7382812500,283,1.9996948196,0.9987029831,0.2647440299,,, +17.7402343750,283,1.9996948196,0.9987029831,0.7133592737,,, +17.7421875000,283,1.9996948196,0.9987029831,0.6202792401,,, +17.7441406250,283,1.9996948196,0.9987029831,0.9941252766,,, +17.7460937500,283,1.9996948196,0.9987029831,0.2265964752,,, +17.7480468750,283,1.9996948196,0.9987029831,0.3913939117,,, +17.7500000000,284,1.9996948196,0.9987029831,0.5088883803,,, +17.7519531250,284,1.9996948196,0.9987029831,0.9224078737,,, +17.7539062500,284,1.9996948196,0.9987029831,0.6858930343,,, +17.7558593750,284,1.9996948196,0.9987029831,0.8354314488,,, +17.7578125000,284,1.9996948196,0.9987029831,0.2662699321,,, +17.7597656250,284,1.9996948196,0.9987029831,0.9895475700,,, +17.7617187500,284,1.9996948196,0.9987029831,0.9620813306,,, +17.7636718750,284,1.9981689174,0.9987029831,0.4539559014,,, +17.7656250000,284,1.9981689174,0.9987029831,0.3440909438,,, +17.7675781250,284,1.9981689174,0.9987029831,0.6919966430,,, +17.7695312500,284,1.9981689174,0.9987029831,0.5958648051,,, +17.7714843750,284,1.9981689174,0.9987029831,0.5226215000,,, +17.7734375000,284,1.9981689174,0.9987029831,0.2677958343,,, +17.7753906250,284,1.9981689174,0.9987029831,0.2647440299,,, +17.7773437500,284,1.9981689174,0.9987029831,0.6111238270,,, +17.7792968750,284,1.9981689174,0.9987029831,0.5058365759,,, +17.7812500000,284,1.9981689174,0.9987029831,0.9529259174,,, +17.7832031250,284,1.9981689174,0.9987029831,0.0801098650,,, +17.7851562500,284,1.9981689174,0.9987029831,0.2693217365,,, +17.7871093750,284,1.9966430152,0.9987029831,0.1289387350,,, +17.7890625000,284,1.9966430152,0.9987029831,0.7515068284,,, +17.7910156250,284,1.9966430152,0.9987029831,0.0038147555,,, +17.7929687500,284,1.9966430152,0.9987029831,0.2998397803,,, +17.7949218750,284,1.9966430152,0.9987029831,0.3608758679,,, +17.7968750000,284,1.9966430152,0.9987029831,0.7759212634,,, +17.7988281250,284,1.9966430152,0.9987029831,0.6660563058,,, +17.8007812500,284,1.9966430152,0.9987029831,0.3227283131,,, +17.8027343750,284,1.9951171130,0.9987029831,0.3791866941,,, +17.8046875000,284,1.9951171130,0.9987029831,0.1396200504,,, +17.8066406250,284,1.9951171130,0.9987029831,0.2906843671,,, +17.8085937500,284,1.9951171130,0.9987029831,0.1503013657,,, +17.8105468750,284,1.9951171130,0.9987029831,0.1564049744,,, +17.8125000000,285,1.9951171130,0.9987029831,0.7484550240,,, +17.8144531250,285,1.9935912108,0.9987029831,0.5851834897,,, +17.8164062500,285,1.9935912108,0.9987029831,0.2174410620,,, +17.8183593750,285,1.9935912108,0.9987029831,0.8003356985,,, +17.8203125000,285,1.9935912108,0.9987029831,0.6645304036,,, +17.8222656250,285,1.9935912108,0.9987029831,0.5714503700,,, +17.8242187500,285,1.9920653086,0.9987029831,0.7072556649,,, +17.8261718750,285,1.9920653086,0.9987029831,0.2555886168,,, +17.8281250000,285,1.9920653086,0.9987029831,0.0495918212,,, +17.8300781250,285,1.9920653086,0.9987029831,0.5256733043,,, +17.8320312500,285,1.9905394064,0.9987029831,0.6141756313,,, +17.8339843750,285,1.9905394064,0.9987029831,0.5241474022,,, +17.8359375000,285,1.9905394064,0.9987029831,0.8171206226,,, +17.8378906250,285,1.9905394064,0.9987029831,0.8049134051,,, +17.8398437500,285,1.9890135042,0.9987029831,0.5714503700,,, +17.8417968750,285,1.9890135042,0.9987029831,0.8079652094,,, +17.8437500000,285,1.9890135042,0.9987029831,0.0541695277,,, +17.8457031250,285,1.9890135042,0.9987029831,0.0328068971,,, +17.8476562500,285,1.9874876020,0.9987029831,0.4524299992,,, +17.8496093750,285,1.9874876020,0.9987029831,0.0862134737,,, +17.8515625000,285,1.9874876020,0.9987029831,0.4127565423,,, +17.8535156250,285,1.9874876020,0.9987029831,0.4234378576,,, +17.8554687500,285,1.9859616999,0.9987029831,0.6797894255,,, +17.8574218750,285,1.9859616999,0.9987029831,0.0877393759,,, +17.8593750000,285,1.9859616999,0.9987029831,0.5729762722,,, +17.8613281250,285,1.9844357977,0.9987029831,0.5226215000,,, +17.8632812500,285,1.9844357977,0.9987029831,0.4829480430,,, +17.8652343750,285,1.9844357977,0.9987029831,0.8766308080,,, +17.8671875000,285,1.9829098955,0.9987029831,0.4386968795,,, +17.8691406250,285,1.9829098955,0.9987029831,0.8903639277,,, +17.8710937500,285,1.9829098955,0.9987029831,0.5119401846,,, +17.8730468750,285,1.9813839933,0.9987029831,0.4478522927,,, +17.8750000000,286,1.9813839933,0.9987029831,0.4234378576,,, +17.8769531250,286,1.9813839933,0.9987029831,0.5180437934,,, +17.8789062500,286,1.9798580911,0.9987029831,0.2159151598,,, +17.8808593750,286,1.9798580911,0.9987029831,0.9025711452,,, +17.8828125000,286,1.9798580911,0.9987029831,0.7347219043,,, +17.8847656250,286,1.9783321889,0.9987029831,0.8278019379,,, +17.8867187500,286,1.9783321889,0.9987029831,0.0724803540,,, +17.8886718750,286,1.9783321889,0.9987029831,0.6553749905,,, +17.8906250000,286,1.9768062867,0.9987029831,0.9040970474,,, +17.8925781250,286,1.9768062867,0.9987029831,0.5271992065,,, +17.8945312500,286,1.9752803845,0.9987029831,0.7347219043,,, +17.8964843750,286,1.9752803845,0.9987029831,0.6370641642,,, +17.8984375000,286,1.9752803845,0.9987029831,0.3120469978,,, +17.9003906250,286,1.9737544823,0.9987029831,0.5668726635,,, +17.9023437500,286,1.9737544823,0.9987029831,0.0862134737,,, +17.9042968750,286,1.9722285801,0.9987029831,0.5043106737,,, +17.9062500000,286,1.9722285801,0.9987029831,0.1228351263,,, +17.9082031250,286,1.9707026780,0.9987029831,0.2204928664,,, +17.9101562500,286,1.9707026780,0.9987029831,0.3013656825,,, +17.9121093750,286,1.9707026780,0.9987029831,0.2128633555,,, +17.9140625000,286,1.9691767758,0.9987029831,0.1731898985,,, +17.9160156250,286,1.9691767758,0.9987029831,0.6630045014,,, +17.9179687500,286,1.9676508736,0.9987029831,0.2433813993,,, +17.9199218750,286,1.9676508736,0.9987029831,0.0053406577,,, +17.9218750000,286,1.9661249714,0.9987029831,0.0617990387,,, +17.9238281250,286,1.9661249714,0.9987029831,0.5516136416,,, +17.9257812500,286,1.9645990692,0.9987029831,0.6416418708,,, +17.9277343750,286,1.9645990692,0.9987029831,0.4249637598,,, +17.9296875000,286,1.9630731670,0.9987029831,0.7972838941,,, +17.9316406250,286,1.9630731670,0.9987029831,0.9956511788,,, +17.9335937500,286,1.9615472648,0.9987029831,0.2769512474,,, +17.9355468750,286,1.9615472648,0.9987029831,0.6569008927,,, +17.9375000000,287,1.9600213626,0.9987029831,0.6477454795,,, +17.9394531250,287,1.9600213626,0.9987029831,0.1853971160,,, +17.9414062500,287,1.9584954604,0.9987029831,0.1029983978,,, +17.9433593750,287,1.9584954604,0.9987029831,0.4188601511,,, +17.9453125000,287,1.9569695583,0.9987029831,0.8979934386,,, +17.9472656250,287,1.9569695583,0.9987029831,0.9117265583,,, +17.9492187500,287,1.9554436561,0.9987029831,0.5012588693,,, +17.9511718750,287,1.9554436561,0.9987029831,0.1808194095,,, +17.9531250000,287,1.9539177539,0.9987029831,0.4631113146,,, +17.9550781250,287,1.9539177539,0.9987029831,0.2891584649,,, +17.9570312500,287,1.9523918517,0.9987029831,0.3929198138,,, +17.9589843750,287,1.9508659495,0.9987029831,0.1884489204,,, +17.9609375000,287,1.9508659495,0.9987029831,0.5806057832,,, +17.9628906250,287,1.9493400473,0.9987029831,0.6965743496,,, +17.9648437500,287,1.9493400473,0.9987029831,0.4188601511,,, +17.9667968750,287,1.9478141451,0.9987029831,0.5729762722,,, +17.9687500000,287,1.9478141451,0.9987029831,0.2235446708,,, +17.9707031250,287,1.9462882429,0.9987029831,0.0709544518,,, +17.9726562500,287,1.9447623407,0.9987029831,0.4066529335,,, +17.9746093750,287,1.9447623407,0.9987029831,0.4615854124,,, +17.9765625000,287,1.9432364385,0.9987029831,0.8598458839,,, +17.9785156250,287,1.9417105364,0.9987029831,0.2281223774,,, +17.9804687500,287,1.9417105364,0.9987029831,0.4539559014,,, +17.9824218750,287,1.9401846342,0.9987029831,0.1838712139,,, +17.9843750000,287,1.9401846342,0.9987029831,0.4844739452,,, +17.9863281250,287,1.9386587320,0.9987029831,0.8018616007,,, +17.9882812500,287,1.9371328298,0.9987029831,0.8659494926,,, +17.9902343750,287,1.9371328298,0.9987029831,0.9681849393,,, +17.9921875000,287,1.9356069276,0.9987029831,0.9681849393,,, +17.9941406250,287,1.9340810254,0.9987029831,0.6919966430,,, +17.9960937500,287,1.9340810254,0.9987029831,0.4463263905,,, +17.9980468750,287,1.9325551232,0.9987029831,0.6080720226,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/games/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/games/CMakeLists.txt new file mode 100644 index 0000000..67caad3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/games/CMakeLists.txt @@ -0,0 +1,51 @@ +PROJECT(openvibe-plugins-games) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.hpp src/*.h src/*.inl src/*.c) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE") + +# --------------------------------- +INCLUDE_DIRECTORIES("src") + +# OpenViBE Base +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") + +# OpenViBE Third Party +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyBoost_System") +INCLUDE("FindThirdPartyLSL") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture, compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +#so that boost won't need to link against DateTime when using the interprocess communication library shared memory writer box +#ADD_DEFINITIONS(-DBOOST_DATE_TIME_NO_LIB) + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +SET(SUB_DIR_NAME Games) +INSTALL(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials/${SUB_DIR_NAME}) + +# --------------------------------- +# Test applications +# --------------------------------- +#IF(OV_COMPILE_TESTS) +#ADD_SUBDIRECTORY(test) +#ENDIF() diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/games/box-tutorials/hello-bidirectionnal-game.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/games/box-tutorials/hello-bidirectionnal-game.xml new file mode 100644 index 0000000..a28add3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/games/box-tutorials/hello-bidirectionnal-game.xml @@ -0,0 +1,530 @@ + + 2 + OpenViBE Designer + 3.0.0 + + + + + + (0x000006bc, 0x0000724a) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000006bc, 0x0000724b) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001d83, 0x00005bb9) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 5.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 928 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00003316, 0x000057c7) + Matrix Display + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003552, 0x000054ad) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 256 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x0000629e, 0x000034f6) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000077e6, 0x00007175) + Hello Bidirectionnal Game + (0x47616d65, 0x42696469) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x544a003e, 0x6dcba5f6) + Output matrix + + + (0x6f752dd0, 0x082a321e) + Output stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0xf916e69e, 0x8bfebe7a) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + + + (0x000003dc, 0x000048bc) + + (0x00003552, 0x000054ad) + 0 + + + (0x0000629e, 0x000034f6) + 0 + + + + (0x000016aa, 0x00005cf5) + + (0x000077e6, 0x00007175) + 0 + + + (0x00003316, 0x000057c7) + 0 + + + + (0x00002fe9, 0x00005b2e) + + (0x00001d83, 0x00005bb9) + 0 + + + (0x000006bc, 0x0000724b) + 0 + + + + (0x00003882, 0x00002272) + + (0x000077e6, 0x00007175) + 1 + + + (0x000006bc, 0x0000724a) + 0 + + + + (0x00004d3e, 0x00005caa) + + (0x0000629e, 0x000034f6) + 0 + + + (0x000077e6, 0x00007175) + 0 + + + + (0x00005a84, 0x0000720a) + + (0x00001d83, 0x00005bb9) + 0 + + + (0x000077e6, 0x00007175) + 1 + + + + + + (0x00000a8d, 0x000047b4) + <b>Remarques : </b> : +Le Jeu doit être lancé en premier +pour eviter des retards dans OpenViBE du fait de la recherche de canaux LSL. +Unity gère mieux la recherche continue de canaux LSL. + +<b> Remarks: </b>: +The Game must be launched first +to avoid delays in OpenViBE due to LSL channel search. +Unity better manages the continuous search for LSL channels. + + + (0x473d9a43, 0x97fc0a97) + 512 + + + (0x7234b86b, 0x2b8651a5) + 416 + + + + + (0x00006a65, 0x00005977) + Signal = Sin(time) +Game is available in the Repository : https://gitlab.inria.fr/openvibe/unity-games/hello-bidirectionnal + + + (0x473d9a43, 0x97fc0a97) + 832 + + + (0x7234b86b, 0x2b8651a5) + 272 + + + + + + + (0x00003414, 0x00007f3b) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00000cf5, 0x00000b02)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0x00003316, 0x000057c7)","childCount":0,"identifier":"(0x00001b1d, 0x00004d15)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003657, 0x00003658)","index":0,"name":"Default tab","parentIdentifier":"(0x00000cf5, 0x00000b02)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000018fe, 0x00004f01)","index":0,"name":"Empty","parentIdentifier":"(0x00003657, 0x00003658)","type":0}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x84009d7c, 0x3c4e763b) + Light scenario that works with Hello World game + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Hello World Game + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Games + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/games/box-tutorials/hello-sender-game.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/games/box-tutorials/hello-sender-game.xml new file mode 100644 index 0000000..a58b132 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/games/box-tutorials/hello-sender-game.xml @@ -0,0 +1,220 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00000050, 0x00007f60) + Hello Sender Game + (0x4cbf4237, 0x24f54a7c) + + + (0x544a003e, 0x6dcba5f6) + Output matrix + + + (0x6f752dd0, 0x082a321e) + Output stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0xcdc02a11, 0x9a816677) + + + (0xc80ce8af, 0xf699f813) + 2 + + + + + (0x00002498, 0x000035c7) + Matrix Display + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000066c9, 0x00005cd9) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000070d3, 0x000045e2) + + (0x00000050, 0x00007f60) + 0 + + + (0x00002498, 0x000035c7) + 0 + + + + (0x00007ec0, 0x000065a9) + + (0x00000050, 0x00007f60) + 1 + + + (0x000066c9, 0x00005cd9) + 0 + + + + + + (0x00000a8d, 0x000047b4) + <b>Remarks</b> : +It is currently impossible to send and receive information by LSL in the same scenario. +Indeed, the LSL library waits to receive its flow (or gives up) before moving on. +In addition, OpenViBE is not multi-process. +It blocks until it has received its flow (or gives up). +It is therefore advisable to launch the transmitter before the receive +or plan for a shorter but repeated stream search after launch in the event of a startup failure. + + + (0x473d9a43, 0x97fc0a97) + 1152 + + + (0x7234b86b, 0x2b8651a5) + 288 + + + + + (0x00006a65, 0x00005977) + Game is available in the Repository : https://gitlab.inria.fr/openvibe/unity-games/hello-sender +Run the Game before the Script + + + (0x473d9a43, 0x97fc0a97) + 768 + + + (0x7234b86b, 0x2b8651a5) + 176 + + + + + + + (0x00003414, 0x00007f3b) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00000cf5, 0x00000b02)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0x00002498, 0x000035c7)","childCount":0,"identifier":"(0x00005d08, 0x00001914)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003657, 0x00003658)","index":0,"name":"Default tab","parentIdentifier":"(0x00000cf5, 0x00000b02)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000018fe, 0x00004f01)","index":0,"name":"Empty","parentIdentifier":"(0x00003657, 0x00003658)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/games/box-tutorials/hello-world-game.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/games/box-tutorials/hello-world-game.xml new file mode 100644 index 0000000..fd63e74 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/games/box-tutorials/hello-world-game.xml @@ -0,0 +1,326 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00001d83, 0x00005bb9) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 5.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 928 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x000029cc, 0x00007eba) + Hello World Game + (0x46705bc3, 0x3058a939) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0xcb293370, 0xee8027f2) + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00003552, 0x000054ad) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 256 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x0000629e, 0x000034f6) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000003dc, 0x000048bc) + + (0x00003552, 0x000054ad) + 0 + + + (0x0000629e, 0x000034f6) + 0 + + + + (0x00000e9b, 0x00001c1a) + + (0x0000629e, 0x000034f6) + 0 + + + (0x000029cc, 0x00007eba) + 0 + + + + (0x000031d4, 0x00003e9b) + + (0x00001d83, 0x00005bb9) + 0 + + + (0x000029cc, 0x00007eba) + 1 + + + + + + (0x00000a8d, 0x000047b4) + <b>Remarks</b> : +It is currently impossible to send and receive information by LSL in the same scenario. +Indeed, the LSL library waits to receive its flow (or gives up) before moving on. +In addition, OpenViBE is not multi-process. +It blocks until it has received its flow (or gives up). +It is therefore advisable to launch the transmitter before the receiver. +Or plan for a shorter but repeated stream search after launch in the event of a startup failure. + + + (0x473d9a43, 0x97fc0a97) + 496 + + + (0x7234b86b, 0x2b8651a5) + 384 + + + + + (0x00006a65, 0x00005977) + Signal = Sin(time) +Game is available in the Repository : https://gitlab.inria.fr/openvibe/unity-games/hello-world + + + (0x473d9a43, 0x97fc0a97) + 832 + + + (0x7234b86b, 0x2b8651a5) + 272 + + + + + + + (0x00003414, 0x00007f3b) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00000cf5, 0x00000b02)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003657, 0x00003658)","index":0,"name":"Default tab","parentIdentifier":"(0x00000cf5, 0x00000b02)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000018fe, 0x00004f01)","index":0,"name":"Empty","parentIdentifier":"(0x00003657, 0x00003658)","type":0}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x84009d7c, 0x3c4e763b) + Light scenario that works with Hello World game + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Hello World Game + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + Games + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/games/doc/Doc_BoxAlgorithm_HelloBidirectionnalGames.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/games/doc/Doc_BoxAlgorithm_HelloBidirectionnalGames.dox-part new file mode 100644 index 0000000..fa85d32 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/games/doc/Doc_BoxAlgorithm_HelloBidirectionnalGames.dox-part @@ -0,0 +1,76 @@ +/** + * \page BoxAlgorithm_HelloBidirectionnalGames Hello Bidirectionnal Games +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HelloBidirectionnalGames_Description| +This box forwards the signals and stimulations it gets to two corresponding LabStreamingLayer (LSL) streams and receive back The size of cube in game and a Beep Stimulation from the Unity Game. + +This stream can be read by the Unity Games Hello Bidirectionnal here : https://gitlab.inria.fr/openvibe/unity-games/hello-bidirectionnal + +Remarks : It is recommanded to run the Unity App Before to avoid "too big" lag in OpenViBE with continuous search of stream. Unity can support that easily. + + * |OVP_DocEnd_BoxAlgorithm_HelloBidirectionnalGames_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HelloBidirectionnalGames_Inputs| + * |OVP_DocEnd_BoxAlgorithm_HelloBidirectionnalGames_Inputs| + * + * |OVP_DocBegin_BoxAlgorithm_HelloBidirectionnalGames_Input1| +The signal input stream. + * |OVP_DocEnd_BoxAlgorithm_HelloBidirectionnalGames_Input1| + + * |OVP_DocBegin_BoxAlgorithm_HelloBidirectionnalGames_Input2| +The stimulation input stream. + * |OVP_DocEnd_BoxAlgorithm_HelloBidirectionnalGames_Input2| + __________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HelloSenderGames_Outputs| + * |OVP_DocEnd_BoxAlgorithm_HelloSenderGames_Outputs| + * + * |OVP_DocBegin_BoxAlgorithm_HelloSenderGames_Output1| +The size of the Cube in Unity App. + * |OVP_DocEnd_BoxAlgorithm_HelloSenderGames_Output1| + + * |OVP_DocBegin_BoxAlgorithm_HelloSenderGames_Output2| +The Beep stimulation from the Unity App. + * |OVP_DocEnd_BoxAlgorithm_HelloSenderGames_Output2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HelloBidirectionnalGames_Settings| + * |OVP_DocEnd_BoxAlgorithm_HelloBidirectionnalGames_Settings| + * +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HelloBidirectionnalGames_Examples| +Easiest way to test the box is to use a time signal box with a simple DSP sin(x) and a Clock Stimulation with stimulation `OVTK_StimulationId_Label_00` for inputs and just a display matrix and a stimulation listener for output. +Run the Game, next run the Scenario. + * |OVP_DocEnd_BoxAlgorithm_HelloBidirectionnalGames_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HelloBidirectionnalGames_Miscellaneous| +The box creates each LSL stream at the beginning of the playback, after it has received its corresponding OpenViBE stream header information. Hence, if either signal or stimulus socket +of the box is not connected or does not receive a header, the box will not create the corresponding LSL stream. +The reception LSL streams are searched during each process to create inlet when stream are available. + +Stream formats: The signal stream is continuous float. The stimulation stream is noncontinuous int, and each 64bit OpenViBE stimulation is truncated to an int marker. + + * |OVP_DocEnd_BoxAlgorithm_HelloBidirectionnalGames_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/games/doc/Doc_BoxAlgorithm_HelloSenderGames.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/games/doc/Doc_BoxAlgorithm_HelloSenderGames.dox-part new file mode 100644 index 0000000..246d167 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/games/doc/Doc_BoxAlgorithm_HelloSenderGames.dox-part @@ -0,0 +1,62 @@ +/** + * \page BoxAlgorithm_HelloSenderGames Hello Sender Games +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HelloSenderGames_Description| +This box receives the signals and stimulations it gets from two corresponding LabStreamingLayer (LSL) streams. + +These streams can be read by the Unity Games Hello Sender here : https://gitlab.inria.fr/openvibe/unity-games/hello-sender + +Remarks : It is currently impossible to send and receive information by LSL in the same scenario. +Indeed, the LSL library waits to receive its flow (or gives up) before moving on. In addition, OpenViBE is not multi-process. +It blocks until it has received its flow (or gives up). +It is therefore advisable to launch the transmitter before the receiver or plan for a shorter but repeated stream search after launch in the event of a startup failure. + + * |OVP_DocEnd_BoxAlgorithm_HelloSenderGames_Description| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HelloSenderGames_Outputs| + * |OVP_DocEnd_BoxAlgorithm_HelloSenderGames_Outputs| + * + * |OVP_DocBegin_BoxAlgorithm_HelloSenderGames_Output1| +The matrix output stream. + * |OVP_DocEnd_BoxAlgorithm_HelloSenderGames_Output1| + + * |OVP_DocBegin_BoxAlgorithm_HelloSenderGames_Output2| +The stimulation output stream. + * |OVP_DocEnd_BoxAlgorithm_HelloSenderGames_Output2| + +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HelloSenderGames_Settings| + * |OVP_DocEnd_BoxAlgorithm_HelloSenderGames_Settings| + * +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HelloSenderGames_Examples| +Run the Game, next run the Scenario. + * |OVP_DocEnd_BoxAlgorithm_HelloSenderGames_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HelloSenderGames_Miscellaneous| +The box creates each LSL stream at the beginning of the playback, the Process is stopped until available stream are found. + +Stream formats: The matrix stream is noncontinuous float. The stimulation stream is noncontinuous int. + + * |OVP_DocEnd_BoxAlgorithm_HelloSenderGames_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/games/doc/Doc_BoxAlgorithm_HelloWorldGames.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/games/doc/Doc_BoxAlgorithm_HelloWorldGames.dox-part new file mode 100644 index 0000000..6b6d030 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/games/doc/Doc_BoxAlgorithm_HelloWorldGames.dox-part @@ -0,0 +1,64 @@ +/** + * \page BoxAlgorithm_HelloWorldGames Hello World Games +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HelloWorldGames_Description| +This box forwards the signals and stimulations it gets to two corresponding LabStreamingLayer (LSL) streams. + +This stream can be read by the Unity Games Hello World here : https://gitlab.inria.fr/openvibe/unity-games/hello-world + +Remarks : It is currently impossible to send and receive information by LSL in the same scenario. +Indeed, the LSL library waits to receive its flow (or gives up) before moving on. In addition, OpenViBE is not multi-process. +It blocks until it has received its flow (or gives up). +It is therefore advisable to launch the transmitter before the receiver. +Or plan for a shorter but repeated stream search after launch in the event of a startup failure. + + * |OVP_DocEnd_BoxAlgorithm_HelloWorldGames_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HelloWorldGames_Inputs| + * |OVP_DocEnd_BoxAlgorithm_HelloWorldGames_Inputs| + * + * |OVP_DocBegin_BoxAlgorithm_HelloWorldGames_Input1| +The signal input stream. + * |OVP_DocEnd_BoxAlgorithm_HelloWorldGames_Input1| + + * |OVP_DocBegin_BoxAlgorithm_HelloWorldGames_Input2| +The stimulation input stream. + * |OVP_DocEnd_BoxAlgorithm_HelloWorldGames_Input2| + +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HelloWorldGames_Settings| + * |OVP_DocEnd_BoxAlgorithm_HelloWorldGames_Settings| + * +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HelloWorldGames_Examples| +Easiest way to test the box is to use a time signal box with a simple DSP sin(x) and a Clock Stimulation with stimulation `OVTK_StimulationId_Label_00`. Run the Scenario, next run the Game. + * |OVP_DocEnd_BoxAlgorithm_HelloWorldGames_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HelloWorldGames_Miscellaneous| +The box creates each LSL stream at the beginning of the playback, after it has received its corresponding OpenViBE stream header information. Hence, if either signal or stimulus socket +of the box is not connected or does not receive a header, the box will not create the corresponding LSL stream. + +Stream formats: The signal stream is continuous float. The stimulation stream is noncontinuous int, and each 64bit OpenViBE stimulation is truncated to an int marker. + + * |OVP_DocEnd_BoxAlgorithm_HelloWorldGames_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloBidirectionnalGame.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloBidirectionnalGame.cpp new file mode 100644 index 0000000..e95db45 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloBidirectionnalGame.cpp @@ -0,0 +1,232 @@ +#ifdef TARGET_HAS_ThirdPartyLSL + +#include "CBoxAlgorithmHelloBidirectionnalGame.hpp" +#include "utils.hpp" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Games { + +//-------------------------------------------------------------------------------- +bool CBoxAlgorithmHelloBidirectionnalGame::initialize() +{ + //---------- Initialize Input/Output ---------- + m_signalDecoder.initialize(*this, 0); + m_stimDecoder.initialize(*this, 1); + m_iMatrix = m_signalDecoder.getOutputMatrix(); + m_iStimSet = m_stimDecoder.getOutputStimulationSet(); + + m_signalEncoder.initialize(*this, 0); + m_stimEncoder.initialize(*this, 1); + m_oMatrix = m_signalEncoder.getInputMatrix(); + m_oStimSet = m_stimEncoder.getInputStimulationSet(); + + //---------- Initialize LSL Stream (to Unity) ---------- + // These are supposed to be unique, so we don't have them in the box config + m_outSignalID = CIdentifier::random().str(); + m_outMarkerID = CIdentifier::random().str(); + + while (m_outMarkerID == m_outSignalID) { m_outMarkerID = CIdentifier::random().str(); } // very unlikely + + this->getLogManager() << Kernel::LogLevel_Trace << "We Will create signal stream [" << m_outSignalName << ", id " << m_outSignalID + << "] and stimulation stream [" << m_outMarkerName << ", id " << m_outMarkerID << "]\n"; + + //---------- Create Headers for Output ---------- + // Matrix Header + m_oMatrix->resize(1, 1); + m_signalEncoder.encodeHeader(); + + // Stimulation Header + m_oStimSet->setStimulationCount(0); // reset stimulation output + m_stimEncoder.encodeHeader(); + + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + boxCtx.markOutputAsReadyToSend(0, m_lastMatrixTime, m_lastMatrixTime); // Makes the output available + boxCtx.markOutputAsReadyToSend(1, m_lastStimTime, m_lastStimTime); // Makes the output available + + return true; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CBoxAlgorithmHelloBidirectionnalGame::uninitialize() +{ + //---------- Uninitialize Input/Output ---------- + m_signalDecoder.uninitialize(); + m_stimDecoder.uninitialize(); + m_signalEncoder.uninitialize(); + m_stimEncoder.uninitialize(); + + //---------- Delete LSL Stream Inlet/Outlet ---------- + if (m_signalOutlet) + { + delete m_signalOutlet; + m_signalOutlet = nullptr; + } + if (m_stimOutlet) + { + delete m_stimOutlet; + m_stimOutlet = nullptr; + } + + if (m_signalInlet) + { + m_signalInlet->close_stream(); + delete m_signalInlet; + m_signalInlet = nullptr; + } + + if (m_stimInlet) + { + m_stimInlet->close_stream(); + delete m_stimInlet; + m_stimInlet = nullptr; + } + + return true; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CBoxAlgorithmHelloBidirectionnalGame::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CBoxAlgorithmHelloBidirectionnalGame::process() +{ + // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const uint64_t currentTime = getPlayerContext().getCurrentTime(); + + //---------- Emission Part ---------- + // Process signals + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_signalDecoder.decode(i); + if (m_signalDecoder.isHeaderReceived() && !m_signalOutlet) + { + const size_t samplesPerBlock = m_signalDecoder.getOutputMatrix()->getDimensionSize(1); + const size_t frequency = m_signalDecoder.getOutputSamplingRate(); + + lsl::stream_info signalInfo = createSignalStreamInfo(m_outSignalName, m_outSignalID, m_signalDecoder.getOutputMatrix(), frequency); + // make a new outlet + try { m_signalOutlet = new lsl::stream_outlet(signalInfo, int(samplesPerBlock)); } + catch (...) + { + this->getLogManager() << "Unable to create signal outlet\n"; + return false; + } + } + if (m_signalDecoder.isBufferReceived()) + { + sendSignal(m_signalOutlet, m_iMatrix, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + //if (m_signalDecoder.isEndReceived()) { } + } + + // Process stimuli -> LSL markers. + // Note that stimuli with identifiers not fitting to int will be mangled by a static cast. + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + m_stimDecoder.decode(i); + if (m_stimDecoder.isHeaderReceived() && !m_stimOutlet) + { + // Open a stimulus stream + lsl::stream_info info = createStimulationStreamInfo(m_outMarkerName, m_outMarkerID); + + try { m_stimOutlet = new lsl::stream_outlet(info); } + catch (...) + { + this->getLogManager() << "Unable to create marker outlet\n"; + return false; + } + } + if (m_stimDecoder.isBufferReceived()) { sendStimulation(m_stimOutlet, m_iStimSet); } + //if (m_stimDecoder.isEndReceived()) { } + } + + + //---------- Reception Part ---------- + if (!m_signalInlet) // We don't have a signal inlet + { + const lsl::stream_info signalInfo = findStreamInfo(m_inSignalName, "", 0); // timeout of 0 to avoid blocking OpenViBE + if (signalInfo.name() == m_inSignalName) + { + m_signalInlet = new lsl::stream_inlet(signalInfo); + try { m_signalInlet->open_stream(); } + catch (...) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to open signal stream with name [" << signalInfo.name() << "]\n"; + return false; + } + this->getLogManager() << Kernel::LogLevel_Trace << "We have open stream [" << signalInfo.name() << "]\n"; + } + } + if (m_signalInlet) // We have a signal inlet + { + double time; + // Signal + try { time = m_signalInlet->pull_sample(&m_bufferLSL, 1, 0.0); } // 2 element timeout to 0.0 to avoid lag (OpenViBE can't have background task) + catch (...) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get signal sample\n"; + return false; + } + if (std::abs(time) > 0.0) + { + m_oMatrix->getBuffer()[0] = double(m_bufferLSL); + m_signalEncoder.encodeBuffer(); // Buffer encoded + boxContext.markOutputAsReadyToSend(0, m_lastMatrixTime, currentTime); // Makes the output available + m_lastMatrixTime = currentTime; + } + } + + if (!m_stimInlet) // We haven't a stimulation inlet + { + const lsl::stream_info stimInfo = findStreamInfo(m_inMarkerName, "", 0); // timeout of 0 to avoid blocking OpenViBE + if (stimInfo.name() == m_inMarkerName) + { + m_stimInlet = new lsl::stream_inlet(stimInfo); + try { m_stimInlet->open_stream(); } + catch (...) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to open marker stream with name [" << stimInfo.name() << "]\n"; + return false; + } + this->getLogManager() << Kernel::LogLevel_Trace << "We have open stream [" << stimInfo.name() << "]\n"; + } + } + if (m_stimInlet) // We have a stimulation inlet + { + double time; + try { time = m_stimInlet->pull_sample(&m_bufferLSL, 1, 0.0); } // 1 element timeout to 0.0 to avoid lag (OpenViBE can't have background task) + catch (...) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get stimulation sample\n"; + return false; + } + if (std::abs(time) > 0.0) + { + m_oStimSet->setStimulationCount(0); // reset stimulation output + m_oStimSet->appendStimulation(uint64_t(m_bufferLSL), currentTime, 0); + m_stimEncoder.encodeBuffer(); // Buffer encoded + boxContext.markOutputAsReadyToSend(1, m_lastStimTime, currentTime); // Makes the output available + m_lastStimTime = currentTime; + this->getLogManager() << Kernel::LogLevel_Info << "Stim received with time " << time << "s in the unity app\n"; + } + } + return true; +} + +} // namespace Games +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyLSL diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloBidirectionnalGame.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloBidirectionnalGame.hpp new file mode 100644 index 0000000..dfb8592 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloBidirectionnalGame.hpp @@ -0,0 +1,108 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmHelloBidirectionnalGame.hpp +/// \brief Class of the box that communicates with Hello Bidirectionnal Game. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 24/02/2021 +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#ifdef TARGET_HAS_ThirdPartyLSL + +#include "defines.hpp" +#include +#include + +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Games { + +/// The class CBoxAlgorithmHelloBidirectionnalGame describes the box that sends value in LSL. +class CBoxAlgorithmHelloBidirectionnalGame final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, Game_Box_Hello_Bidirectionnal) + +protected: + + // Encoder / Decoder + Toolkit::TStimulationDecoder m_stimDecoder; + Toolkit::TSignalDecoder m_signalDecoder; + Toolkit::TStimulationEncoder m_stimEncoder; + Toolkit::TSignalEncoder m_signalEncoder; + + // Input/ Output + CMatrix *m_iMatrix = nullptr, *m_oMatrix = nullptr; + IStimulationSet *m_iStimSet = nullptr, *m_oStimSet = nullptr; + uint64_t m_lastMatrixTime = 0, m_lastStimTime = 0; + + // LSL Stream + lsl::stream_outlet *m_signalOutlet = nullptr, *m_stimOutlet = nullptr; + lsl::stream_inlet *m_signalInlet = nullptr, *m_stimInlet = nullptr; + const std::string m_outSignalName = "ovOutSignal", m_outMarkerName = "ovOutMarkers"; + const std::string m_inSignalName = "ovInSignal", m_inMarkerName = "ovInMarkers"; + std::string m_outSignalID, m_outMarkerID; + float m_bufferLSL = 0.0; +}; + + +/// Descriptor of the box Hello Bidirectionnal Game. +class CBoxAlgorithmHelloBidirectionnalGameDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return "Hello Bidirectionnal Game"; } + CString getAuthorName() const override { return "Thibaut Monseigne"; } + CString getAuthorCompanyName() const override { return "Inria"; } + CString getShortDescription() const override + { + return "Send input stream via LabStreamingLayer (LSL) to the unity game Hello Bidirectionnal and receive back matrix and stimulation."; + } + CString getDetailedDescription() const override + { + return "The Unity Game is in the OpenViBE Unity Game Set of Repository (https://gitlab.inria.fr/openvibe/unity-games/hello-bidirectionnal).\n"; + } + CString getCategory() const override { return "Games"; } + CString getVersion() const override { return "0.1"; } + CString getStockItemName() const override { return "gtk-connect"; } + + CIdentifier getCreatedClass() const override { return Game_Box_Hello_Bidirectionnal; } + IPluginObject* create() override { return new CBoxAlgorithmHelloBidirectionnalGame; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addInput("Input stimulations", OV_TypeId_Stimulations); + prototype.addOutput("Output matrix", OV_TypeId_StreamedMatrix); + prototype.addOutput("Output stimulations", OV_TypeId_Stimulations); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, Game_Box_Hello_Bidirectionnal_Desc) +}; + +} // namespace Games +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyLSL diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloSenderGame.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloSenderGame.cpp new file mode 100644 index 0000000..655b7f8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloSenderGame.cpp @@ -0,0 +1,173 @@ +#ifdef TARGET_HAS_ThirdPartyLSL + +#include "CBoxAlgorithmHelloSenderGame.hpp" +#include "utils.hpp" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Games { + +//-------------------------------------------------------------------------------- +bool CBoxAlgorithmHelloSenderGame::initialize() +{ + m_signalInlet = nullptr; + m_stimInlet = nullptr; + + m_signalEncoder.initialize(*this, 0); + m_stimEncoder.initialize(*this, 1); + m_oMatrix = m_signalEncoder.getInputMatrix(); + m_oStimSet = m_stimEncoder.getInputStimulationSet(); + + // Signal Stream + const lsl::stream_info signalInfo = findStreamInfo(m_signalName); + if (signalInfo.name() != m_signalName) + { + this->getLogManager() << Kernel::LogLevel_Error << "Error getting signal stream info for [" << signalInfo.name() << "]\n"; + return false; + } + + m_signalInlet = new lsl::stream_inlet(signalInfo); + if (!m_signalInlet) + { + this->getLogManager() << Kernel::LogLevel_Error << "Error getting signal inlet for [" << signalInfo.name() << "]\n"; + return false; + } + + try { m_signalInlet->open_stream(); } + catch (...) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to open signal stream with name [" << signalInfo.name() << "]\n"; + return false; + } + + // Stimulation Stream + const lsl::stream_info stimInfo = findStreamInfo(m_markerName); + if (stimInfo.name() != m_markerName) + { + this->getLogManager() << Kernel::LogLevel_Error << "Error getting marker stream info for [" << stimInfo.name() << "]\n"; + return false; + } + + m_stimInlet = new lsl::stream_inlet(stimInfo); + if (!m_stimInlet) + { + this->getLogManager() << Kernel::LogLevel_Error << "Error getting marker inlet for [" << stimInfo.name() << "]\n"; + return false; + } + + try { m_stimInlet->open_stream(); } + catch (...) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to open marker stream with name [" << stimInfo.name() << "]\n"; + return false; + } + + return true; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CBoxAlgorithmHelloSenderGame::uninitialize() +{ + m_signalEncoder.uninitialize(); + m_stimEncoder.uninitialize(); + + if (m_signalInlet) + { + m_signalInlet->close_stream(); + delete m_signalInlet; + m_signalInlet = nullptr; + } + + if (m_stimInlet) + { + m_stimInlet->close_stream(); + delete m_stimInlet; + m_stimInlet = nullptr; + } + + return true; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CBoxAlgorithmHelloSenderGame::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CBoxAlgorithmHelloSenderGame::process() +{ + // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const uint64_t currentTime = getPlayerContext().getCurrentTime(); + + // Header + if (!m_headerSent) + { + m_buffer = new float[2]; + + // Matrix Header + m_oMatrix->resize(2, 1); + m_signalEncoder.encodeHeader(); + + // Stimulation Header + m_oStimSet->setStimulationCount(0); // reset stimulation output + m_stimEncoder.encodeHeader(); + + boxContext.markOutputAsReadyToSend(0, m_lastMatrixTime, m_lastMatrixTime); // Makes the output available + boxContext.markOutputAsReadyToSend(1, m_lastStimTime, m_lastStimTime); // Makes the output available + m_headerSent = true; + this->getLogManager() << Kernel::LogLevel_Info << "Header created\n"; + } + + // Core + double time; + // Signal + try { time = m_signalInlet->pull_sample(m_buffer, 2, 0.0); } // 2 element timeout to 0.0 to avoid lag (OpenViBE can't have background task) + catch (...) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get signal sample\n"; + return false; + } + if (std::abs(time) > 0.0) + { + double* buffer = m_oMatrix->getBuffer(); + buffer[0] = double(m_buffer[0]); + buffer[1] = double(m_buffer[1]); + m_signalEncoder.encodeBuffer(); // Buffer encoded + boxContext.markOutputAsReadyToSend(0, m_lastMatrixTime, currentTime); // Makes the output available + m_lastMatrixTime = currentTime; + } + + // Stimulation + try { time = m_stimInlet->pull_sample(m_buffer, 1, 0.0); } // 1 element timeout to 0.0 to avoid lag (OpenViBE can't have background task) + catch (...) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to get stimulation sample\n"; + return false; + } + if (std::abs(time) > 0.0) + { + m_oStimSet->setStimulationCount(0); // reset stimulation output + m_oStimSet->appendStimulation(uint64_t(m_buffer[0]), currentTime, 0); + m_stimEncoder.encodeBuffer(); // Buffer encoded + boxContext.markOutputAsReadyToSend(1, m_lastStimTime, currentTime); // Makes the output available + m_lastStimTime = currentTime; + } + return true; +} +//-------------------------------------------------------------------------------- + +} // namespace Games +} // namespace Plugins +} // namespace OpenViBE + + +#endif // TARGET_HAS_ThirdPartyLSL diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloSenderGame.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloSenderGame.hpp new file mode 100644 index 0000000..603285f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloSenderGame.hpp @@ -0,0 +1,99 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmHelloSenderGame.hpp +/// \brief Class of the box that communicate with Hello Sender Game. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 12/03/2020. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#ifdef TARGET_HAS_ThirdPartyLSL + +#include "defines.hpp" +#include +#include + +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Games { + +/// The class CBoxAlgorithmHelloSenderGame describes the box that send value in LSL. +class CBoxAlgorithmHelloSenderGame final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + uint64_t getClockFrequency() override { return 64LL << 32; } + bool initialize() override; + bool uninitialize() override; + + bool processClock(Kernel::CMessageClock& msg) override; + + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, Game_Box_Hello_Sender) + +protected: + + // Decoders + Toolkit::TStimulationEncoder m_stimEncoder; + Toolkit::TSignalEncoder m_signalEncoder; + CMatrix* m_oMatrix = nullptr; + IStimulationSet* m_oStimSet = nullptr; + float* m_buffer = nullptr; + bool m_headerSent = false; + uint64_t m_lastMatrixTime = 0; + uint64_t m_lastStimTime = 0; + + lsl::stream_inlet *m_signalInlet = nullptr, *m_stimInlet = nullptr; + const std::string m_signalName = "ovSignal", m_markerName = "ovMarker"; +}; + + +/// Descriptor of the box Hello Sender Game. +class CBoxAlgorithmHelloSenderGameDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return "Hello Sender Game"; } + CString getAuthorName() const override { return "Thibaut Monseigne"; } + CString getAuthorCompanyName() const override { return "Inria"; } + CString getShortDescription() const override { return "Receive stream via LabStreamingLayer (LSL) from the unity game Hello Sender."; } + CString getDetailedDescription() const override + { + return "The Unity Game is in the OpenViBE Unity Game Set of Repository (https://gitlab.inria.fr/openvibe/unity-games/hello-sender).\n"; + } + CString getCategory() const override { return "Games"; } + CString getVersion() const override { return "0.1"; } + CString getStockItemName() const override { return "gtk-connect"; } + + CIdentifier getCreatedClass() const override { return Game_Box_Hello_Sender; } + IPluginObject* create() override { return new CBoxAlgorithmHelloSenderGame; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addOutput("Output matrix", OV_TypeId_StreamedMatrix); + prototype.addOutput("Output stimulations", OV_TypeId_Stimulations); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, Game_Box_Hello_Sender_Desc) +}; + +} // namespace Games +} // namespace Plugins +} // namespace OpenViBE + + +#endif // TARGET_HAS_ThirdPartyLSL diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloWorldGame.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloWorldGame.cpp new file mode 100644 index 0000000..f3f67d4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloWorldGame.cpp @@ -0,0 +1,124 @@ +#ifdef TARGET_HAS_ThirdPartyLSL + +#include "CBoxAlgorithmHelloWorldGame.hpp" +#include "utils.hpp" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Games { + +//-------------------------------------------------------------------------------- +bool CBoxAlgorithmHelloWorldGame::initialize() +{ + m_signalOutlet = nullptr; + m_stimOutlet = nullptr; + + m_signalDecoder.initialize(*this, 0); + m_stimDecoder.initialize(*this, 1); + m_iMatrix = m_signalDecoder.getOutputMatrix(); + m_iStimSet = m_stimDecoder.getOutputStimulationSet(); + + // These are supposed to be unique, so we don't have them in the box config + m_signalID = CIdentifier::random().str(); + m_markerID = CIdentifier::random().str(); + + while (m_markerID == m_signalID) { m_markerID = CIdentifier::random().str(); } // very unlikely + + this->getLogManager() << Kernel::LogLevel_Trace << "We Will create streams [" << m_signalName << ", id " << m_signalID + << "] and [" << m_markerName << ", id " << m_markerID << "]\n"; + + return true; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CBoxAlgorithmHelloWorldGame::uninitialize() +{ + m_signalDecoder.uninitialize(); + m_stimDecoder.uninitialize(); + + if (m_signalOutlet) + { + delete m_signalOutlet; + m_signalOutlet = nullptr; + } + if (m_stimOutlet) + { + delete m_stimOutlet; + m_stimOutlet = nullptr; + } + + return true; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CBoxAlgorithmHelloWorldGame::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CBoxAlgorithmHelloWorldGame::process() +{ + // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + // Process signals + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_signalDecoder.decode(i); + if (m_signalDecoder.isHeaderReceived() && !m_signalOutlet) + { + const size_t samplesPerBlock = m_signalDecoder.getOutputMatrix()->getDimensionSize(1); + const size_t frequency = m_signalDecoder.getOutputSamplingRate(); + + lsl::stream_info signalInfo = createSignalStreamInfo(m_signalName, m_signalID, m_signalDecoder.getOutputMatrix(), frequency); + // make a new outlet + try { m_signalOutlet = new lsl::stream_outlet(signalInfo, int(samplesPerBlock)); } + catch (...) + { + this->getLogManager() << "Unable to create signal outlet\n"; + return false; + } + } + if (m_signalDecoder.isBufferReceived()) + { + sendSignal(m_signalOutlet, m_iMatrix, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + //if (m_signalDecoder.isEndReceived()) { } + } + + // Process stimuli -> LSL markers. + // Note that stimuli with identifiers not fitting to int will be mangled by a static cast. + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + m_stimDecoder.decode(i); + if (m_stimDecoder.isHeaderReceived() && !m_stimOutlet) + { + // Open a stimulus stream + lsl::stream_info info = createStimulationStreamInfo(m_markerName, m_markerID); + + try { m_stimOutlet = new lsl::stream_outlet(info); } + catch (...) + { + this->getLogManager() << "Unable to create marker outlet\n"; + return false; + } + } + if (m_stimDecoder.isBufferReceived()) { sendStimulation(m_stimOutlet, m_iStimSet); } + //if (m_stimDecoder.isEndReceived()) { } + } + return true; +} + +} // namespace Games +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyLSL diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloWorldGame.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloWorldGame.hpp new file mode 100644 index 0000000..054f1f1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/boxes/CBoxAlgorithmHelloWorldGame.hpp @@ -0,0 +1,94 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmHelloWorldGame.hpp +/// \brief Class of the box that communicate with Hello World Game. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 12/03/2020. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#ifdef TARGET_HAS_ThirdPartyLSL + +#include "defines.hpp" +#include +#include + +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Games { + +/// The class CBoxAlgorithmHelloWorldGame describes the box that send value in LSL. +class CBoxAlgorithmHelloWorldGame final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, Game_Box_Hello_World) + +protected: + + // Decoders + Toolkit::TStimulationDecoder m_stimDecoder; + Toolkit::TSignalDecoder m_signalDecoder; + CMatrix* m_iMatrix = nullptr; + IStimulationSet* m_iStimSet = nullptr; + + lsl::stream_outlet *m_signalOutlet = nullptr, *m_stimOutlet = nullptr; + const std::string m_signalName = "ovSignal", m_markerName = "ovMarkers"; + std::string m_signalID, m_markerID; +}; + + +/// Descriptor of the box Hello World Game. +class CBoxAlgorithmHelloWorldGameDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return "Hello World Game"; } + CString getAuthorName() const override { return "Thibaut Monseigne"; } + CString getAuthorCompanyName() const override { return "Inria"; } + CString getShortDescription() const override { return "Send input stream via LabStreamingLayer (LSL) to the unity game Hello World."; } + CString getDetailedDescription() const override + { + return "The Unity Game is in the OpenViBE Unity Game Set of Repository (https://gitlab.inria.fr/openvibe/unity-games/hello-world).\n"; + } + CString getCategory() const override { return "Games"; } + CString getVersion() const override { return "0.1"; } + CString getStockItemName() const override { return "gtk-connect"; } + + CIdentifier getCreatedClass() const override { return Game_Box_Hello_World; } + IPluginObject* create() override { return new CBoxAlgorithmHelloWorldGame; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addInput("Input stimulations", OV_TypeId_Stimulations); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, Game_Box_Hello_World_Desc) +}; + +} // namespace Games +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyLSL diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/defines.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/defines.hpp new file mode 100644 index 0000000..c2d6f0f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/defines.hpp @@ -0,0 +1,21 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file defines.hpp +/// \brief Defines list for Setting, Shortcut Macro and const. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 12/03/2020. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define Game_Box_Hello_World OpenViBE::CIdentifier(0x46705bc3, 0x3058a939) +#define Game_Box_Hello_World_Desc OpenViBE::CIdentifier(0x3f921b93, 0xadb2b2ec) +#define Game_Box_Hello_Sender OpenViBE::CIdentifier(0x4cbf4237, 0x24f54a7c) +#define Game_Box_Hello_Sender_Desc OpenViBE::CIdentifier(0x5730a8f1, 0x96a608cc) +#define Game_Box_Hello_Bidirectionnal OpenViBE::CIdentifier(0x47616d65, 0x42696469) +#define Game_Box_Hello_Bidirectionnal_Desc OpenViBE::CIdentifier(0x47616d65, 0x42696464) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/main.cpp new file mode 100644 index 0000000..9fabd09 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/main.cpp @@ -0,0 +1,24 @@ +#include +//#include "defines.hpp" + +// Boxes Includes +#include "boxes/CBoxAlgorithmHelloWorldGame.hpp" +#include "boxes/CBoxAlgorithmHelloSenderGame.hpp" +#include "boxes/CBoxAlgorithmHelloBidirectionnalGame.hpp" + +namespace OpenViBE { +namespace Plugins { +namespace Games { + +OVP_Declare_Begin() +#ifdef TARGET_HAS_ThirdPartyLSL + // Register boxes + OVP_Declare_New(CBoxAlgorithmHelloWorldGameDesc) + OVP_Declare_New(CBoxAlgorithmHelloSenderGameDesc) + OVP_Declare_New(CBoxAlgorithmHelloBidirectionnalGameDesc) +#endif // TARGET_HAS_ThirdPartyLSL +OVP_Declare_End() + +} // namespace Games +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/utils.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/utils.cpp new file mode 100644 index 0000000..f74ad64 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/utils.cpp @@ -0,0 +1,91 @@ +#include +#ifdef TARGET_HAS_ThirdPartyLSL + +#include "utils.hpp" + +//------------------------------------------------------------------------------------------------- +lsl::stream_info createSignalStreamInfo(const std::string& name, const std::string& id, const OpenViBE::CMatrix* matrix, const size_t frequency) +{ + const size_t nChannel = matrix->getDimensionSize(0); + + // Open a signal stream + lsl::stream_info res(name, "signal", int(nChannel), double(frequency), lsl::cf_float32, id); + + lsl::xml_element channels = res.desc().append_child("channels"); + for (size_t c = 0; c < nChannel; ++c) + { + const std::string tmp = matrix->getDimensionLabel(0, c); + channels.append_child("channel").append_child_value("label", tmp).append_child_value("unit", "unknown").append_child_value("type", "signal"); + } + + return res; +} +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +lsl::stream_info createStimulationStreamInfo(const std::string& name, const std::string& id) +{ + lsl::stream_info res(name, "Markers", 1, lsl::IRREGULAR_RATE, lsl::cf_int32, id); + res.desc().append_child("channels").append_child("channel").append_child_value("label", "Stimulations").append_child_value("type", "marker"); + return res; +} +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +void sendSignal(lsl::stream_outlet* outlet, const OpenViBE::CMatrix* matrix, const uint64_t startTime, const uint64_t endTime) +{ + if (outlet->have_consumers()) + { + const size_t nChannel = matrix->getDimensionSize(0); + const size_t nSamples = matrix->getDimensionSize(1); + const double* iBuffer = matrix->getBuffer(); + std::vector buffer(nChannel); + + // note: the step computed below should be exactly the same as could be obtained from the sampling rate + const double start = OpenViBE::CTime(startTime).toSeconds(); + const double step = OpenViBE::CTime(endTime - startTime).toSeconds() / double(nSamples); + + for (size_t s = 0; s < nSamples; ++s) + { + for (size_t c = 0; c < nChannel; ++c) { buffer[c] = float(iBuffer[c * nSamples + s]); } + outlet->push_sample(buffer, start + double(s) * step); + } + } +} +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +void sendStimulation(lsl::stream_outlet* outlet, const OpenViBE::IStimulationSet* stimSet) +{ + if (outlet->have_consumers()) + { + for (size_t s = 0; s < stimSet->getStimulationCount(); ++s) + { + const int code = int(stimSet->getStimulationIdentifier(s)); + const double date = OpenViBE::CTime(stimSet->getStimulationDate(s)).toSeconds(); + + outlet->push_sample(&code, date); + } + } +} +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +lsl::stream_info findStreamInfo(const std::string& name, const std::string& id, const int timeout) +{ + // Find the signal stream + const std::vector infos = lsl::resolve_stream("name", name, 1, timeout); + if (infos.empty()) + { + if (timeout != 0) { std::cerr << "Failed to find stream with name [" << name << "]\n"; } // Avoid a print if timeout is 0 + return lsl::stream_info(); + } + + for (const auto& i : infos) + { + if (i.source_id() == id) { return i; } // This is the best one + } + return infos[0]; +} +//------------------------------------------------------------------------------------------------- +#endif // TARGET_HAS_ThirdPartyLSL diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/utils.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/utils.hpp new file mode 100644 index 0000000..0fbe031 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/games/src/utils.hpp @@ -0,0 +1,62 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file utils.hpp +/// \brief Defines some function to facilitate Box Management. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 12/03/2020. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#ifdef TARGET_HAS_ThirdPartyLSL + +#include +#include + +//------------------------------------------------------------------------------------------------- +// Sending +//------------------------------------------------------------------------------------------------- + +/// Create the stream information for signals. +/// The name of the stream. +/// The identifier of the stream. +/// The matrix to get infos (channel number and label). +/// The signal frequency. +/// the stream info. +lsl::stream_info createSignalStreamInfo(const std::string& name, const std::string& id, const OpenViBE::CMatrix* matrix, const size_t frequency); + +/// Create the stream information for stimulations. +/// The name of the stream. +/// The identifier of the stream. +/// the stream info. +lsl::stream_info createStimulationStreamInfo(const std::string& name, const std::string& id); + +/// Send Signal in LSL outlet. +/// The LSL outlet. +/// The matrix with the signal to send. +/// The start time of the signal. +/// The end time of the signal. +void sendSignal(lsl::stream_outlet* outlet, const OpenViBE::CMatrix* matrix, const uint64_t startTime, const uint64_t endTime); + +/// Send the stimulation in LSL outlet. +/// The LSL outlet. +/// The stimulation set to send. +void sendStimulation(lsl::stream_outlet* outlet, const OpenViBE::IStimulationSet* stimSet); + + +//------------------------------------------------------------------------------------------------- +// Receiving +//------------------------------------------------------------------------------------------------- + +/// Finds the stream information with the function lsl::resolve_stream. +/// The expected name of the stream. +/// Optionally The expected ID of the stream in addition of the name. +/// Optionally a timeout of the operation, in seconds (default: no timeout). +/// If the timeout expires, a default stream info is returned. +/// +lsl::stream_info findStreamInfo(const std::string& name, const std::string& id = "", const int timeout = LSL_FOREVER); + +#endif // TARGET_HAS_ThirdPartyLSL diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/CMakeLists.txt new file mode 100755 index 0000000..1d0bd4e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/CMakeLists.txt @@ -0,0 +1,53 @@ +PROJECT(openvibe-plugins-matlab) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +add_custom_command(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/share/OV_stimulations.m + DEPENDS openvibe-stimulation-generator ${OPENVIBE_SDK_PATH}/share/openvibe/toolkit/stimulation_list.txt + COMMAND openvibe-stimulation-generator + --matlab + ${OPENVIBE_SDK_PATH}/share/openvibe/toolkit/stimulation_list.txt + ${CMAKE_CURRENT_SOURCE_DIR}/share/OV_stimulations.m + COMMENT "Generating matlab stimulation sources..." ) + + add_custom_target(generate_matlab_stimulations_file DEPENDS share/OV_stimulations.m) + + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +add_dependencies(openvibe-plugins-matlab generate_matlab_stimulations_file) + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindOpenViBEModuleFS") + +INCLUDE("FindThirdPartyMatlab") + +# --------------------------------- + + + + +# --------------------------------- + + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/plugins/matlab) + +INSTALL(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto1-signal-filter.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto1-signal-filter.xml new file mode 100644 index 0000000..0cac8ec --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto1-signal-filter.xml @@ -0,0 +1,543 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00002bed, 0x00001e7e) + Raw signal + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000043a1, 0x00007d94) + Tuto 1 : Signal filter + (0x03303e0e, 0x39fe10df) + + + (0x5ba36127, 0x195feae1) + Signal input + + + (0x6f752dd0, 0x082a321e) + Trigger + + + + + (0x5ba36127, 0x195feae1) + Filtered Signal + + + + + (0x007deef9, 0x2f3e95c6) + Box clock frequency in Hz + 64 + 32 + false + + + (0x330306dd, 0x74a95f98) + Matlab executable (path) + C:/Program Files (x86)/MATLAB/R2013b/bin/win32/matlab.exe + + false + + + (0x79a9edeb, 0x245d83fc) + Matlab working directory + [path-to-my-matlab-workspace] + ${Player_ScenarioDirectory} + false + + + (0x79a9edeb, 0x245d83fc) + Initialize function + bci_Initialize + tuto1_signal_filter_Initialize + false + + + (0x79a9edeb, 0x245d83fc) + Process function + bci_Process + tuto1_signal_filter_Process + false + + + (0x79a9edeb, 0x245d83fc) + Uninitialize function + bci_Uninitialize + tuto1_signal_filter_Uninitialize + false + + + (0x2c132d6e, 0x44ab0d97) + Zero trigger + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xc0b69293, 0x2c33365a) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004e6e, 0x00000d13) + Matlab output + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00006b9e, 0x0000124c) + Press 'a' to set all samples to 0 + (0x00d317b9, 0x6324c3ff) + + + (0x6f752dd0, 0x082a321e) + Outgoing Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x8d89d3b7, 0x8339d210) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00007bdb, 0x0000106d) + Sinus oscillator + (0x7e33bdb8, 0x68194a4a) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 2 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 16 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + + + (0x000014b6, 0x00007cdc) + + (0x00007bdb, 0x0000106d) + 0 + + + (0x00002bed, 0x00001e7e) + 0 + + + + (0x00004c29, 0x0000420f) + + (0x00007bdb, 0x0000106d) + 0 + + + (0x000043a1, 0x00007d94) + 0 + + + + (0x0000516a, 0x00000f70) + + (0x00006b9e, 0x0000124c) + 0 + + + (0x000043a1, 0x00007d94) + 1 + + + + (0x000066b4, 0x00006517) + + (0x000043a1, 0x00007d94) + 0 + + + (0x00004e6e, 0x00000d13) + 0 + + + + + + (0x00000f2b, 0x00004d77) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + +The documentation page for this tutorial is available at: +<i>openvibe.inria.fr/tutorial-using-matlab-with-openvibe</i> + + + (0x473d9a43, 0x97fc0a97) + 400 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + (0x00002ca7, 0x00004cd8) + <b>Configure the Matlab Scripting box:</b> + +<span color="red"> Set the matlab executable path before use !</span> + +Enter the path to your local Matlab installation. + +You can choose the Stimulation trigger +that will set all input samples to 0 + + + (0x473d9a43, 0x97fc0a97) + 144 + + + (0x7234b86b, 0x2b8651a5) + 240 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00006b9e, 0x0000124c)","childCount":0,"identifier":"(0x00001cbe, 0x000035db)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":492,"identifier":"(0x0000500a, 0x00001fd8)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":634},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000288c, 0x00006c84)","index":0,"name":"Default tab","parentIdentifier":"(0x0000500a, 0x00001fd8)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":221,"identifier":"(0x000017f0, 0x00006465)","index":0,"maxDividerPosition":447,"name":"Vertical split","parentIdentifier":"(0x0000288c, 0x00006c84)","type":4},{"boxIdentifier":"(0x00002bed, 0x00001e7e)","childCount":0,"identifier":"(0x00006c72, 0x00007d16)","index":0,"parentIdentifier":"(0x000017f0, 0x00006465)","type":3},{"boxIdentifier":"(0x00004e6e, 0x00000d13)","childCount":0,"identifier":"(0x000073ee, 0x00006c76)","index":1,"parentIdentifier":"(0x000017f0, 0x00006465)","type":3}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto1_signal_filter_Initialize.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto1_signal_filter_Initialize.m new file mode 100644 index 0000000..501e1ca --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto1_signal_filter_Initialize.m @@ -0,0 +1,18 @@ +% tuto1_signal_filter_Initialize.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 25 May 2012 +% +% The function tuto1_signal_filter_Initialize is called when pressing 'play' in the scenario. +% +function box_out = tuto1_signal_filter_Initialize(box_in) + + disp('Matlab initialize function has been called.') + + box_in.user_data.trigger_state = false; + + % Don't forget to pass the modified box as output. + box_out = box_in; + +end + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto1_signal_filter_Process.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto1_signal_filter_Process.m new file mode 100644 index 0000000..5de9870 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto1_signal_filter_Process.m @@ -0,0 +1,50 @@ +% tuto1_signal_filter_Process.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 25 May 2012 +% +% The function tuto1_signal_filter_Process is called at the clock frequency. +% + +function box_out = tuto1_signal_filter_Process(box_in) + + % we iterate over the pending chunks on input 2 (STIMULATIONS) + for i = 1: OV_getNbPendingInputChunk(box_in,2) + + % we pop the first chunk to be processed, note that box_in is used as the output variable to continue processing + [box_in, start_time, end_time, stim_set] = OV_popInputBuffer(box_in,2); + + % the stimulation set is a 3xN matrix. + % The openvibe stimulation stream sends even empty stimulation set + % so the following boxes know there is no stimulation to expect in + % the latest time range. These empty chunk are also in the matlab buffer. + if(numel(stim_set) >= 3) % at least one stim in the set. + fprintf('Received stimulation code %i at time %f\n', stim_set(1), stim_set(2)) + if stim_set(1) == box_in.settings(1).value % I'm lazy... I only check the first stim in the set. + box_in.user_data.trigger_state = ~box_in.user_data.trigger_state; + disp('Trigger is switched.') + end + end + end + + % we iterate over the pending chunks on input 1 (SIGNAL) + for i = 1: OV_getNbPendingInputChunk(box_in,1) + + % we pop the first chunk to be processed, note that box_in is used as the output variable to continue processing + [box_in, start_time, end_time, matrix_data] = OV_popInputBuffer(box_in,1); + + box_in.outputs{1}.header = box_in.inputs{1}.header; + + % if requested, all samples are set to 0 + if(box_in.user_data.trigger_state) + matrix_data(1:end) = 0; + end + + % we add the chunk to the signal output buffer. Note that we use box_in as the output variable. + box_in = OV_addOutputBuffer(box_in,1,start_time,end_time,matrix_data); + + end + + % Pass the modified box as output to continue processing + box_out = box_in; +end diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto1_signal_filter_Uninitialize.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto1_signal_filter_Uninitialize.m new file mode 100644 index 0000000..86c062a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto1_signal_filter_Uninitialize.m @@ -0,0 +1,13 @@ +% tuto1_signal_filter_Uninitialize.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 25 May 2012 +% +% The function tuto1_signal_filter_Uninitialize is called when pressing 'stop' in the scenario. +% +function box_out = tuto1_signal_filter_Uninitialize(box_in) + disp('Matlab uninitialize function has been called.') + + box_out = box_in; +end + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto2-FFT-filter.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto2-FFT-filter.xml new file mode 100644 index 0000000..666a472 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto2-FFT-filter.xml @@ -0,0 +1,688 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x000008b2, 0x000031dd) + Corrupted signal + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00001dc6, 0x00006378) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 2 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000027c9, 0x0000731d) + 1 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + : + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000066c7, 0x00005ac8) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + + + (0x00007ec5, 0x00003579) + Tuto2 : FFT + (0x03303e0e, 0x39fe10df) + + + (0x5ba36127, 0x195feae1) + Signal input + + + + + (0x5ba36127, 0x195feae1) + Filtered Signal + + + + + (0x007deef9, 0x2f3e95c6) + Box clock frequency in Hz + 64 + 32 + false + + + (0x330306dd, 0x74a95f98) + Matlab executable (path) + C:/Program Files (x86)/MATLAB/R2013b/bin/win32/matlab.exe + + false + + + (0x79a9edeb, 0x245d83fc) + Matlab working directory + [path-to-my-matlab-workspace] + ${Player_ScenarioDirectory} + false + + + (0x79a9edeb, 0x245d83fc) + Initialize function + bci_Initialize + tuto2_FFT_filter_Initialize + false + + + (0x79a9edeb, 0x245d83fc) + Process function + bci_Process + tuto2_FFT_filter_Process + false + + + (0x79a9edeb, 0x245d83fc) + Uninitialize function + bci_Uninitialize + tuto2_FFT_filter_Uninitialize + false + + + (0x512a166f, 0x5c3ef83f) + Noise frequency + 20 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Noise amplitude + 10 + 10 + false + + + (0x007deef9, 0x2f3e95c6) + Plot range : min frequency + 5 + 5 + false + + + (0x007deef9, 0x2f3e95c6) + Plot range : max frequency + 50 + 50 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xc0b69293, 0x2c33365a) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007f47, 0x00001bc6) + Raw signal + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 464 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + + + (0x00002758, 0x00001276) + + (0x000027c9, 0x0000731d) + 0 + + + (0x00007f47, 0x00001bc6) + 0 + + + + (0x000046f2, 0x00007e90) + + (0x000027c9, 0x0000731d) + 0 + + + (0x00001dc6, 0x00006378) + 0 + + + + (0x0000494d, 0x00004db5) + + (0x00001dc6, 0x00006378) + 0 + + + (0x00007ec5, 0x00003579) + 0 + + + + (0x00006c26, 0x00006a80) + + (0x00007ec5, 0x00003579) + 0 + + + (0x000008b2, 0x000031dd) + 0 + + + + (0x00006c31, 0x00005c81) + + (0x000066c7, 0x00005ac8) + 0 + + + (0x000027c9, 0x0000731d) + 0 + + + + + + (0x000020c1, 0x00005db7) + We extract a 2 seconds window +every 2 seconds + + + (0x473d9a43, 0x97fc0a97) + 96 + + + (0x7234b86b, 0x2b8651a5) + 176 + + + + + (0x000032ad, 0x000007b4) + <b>Configure the Matlab Scripting box:</b> + +<span color="red"> Set the matlab executable path +and the working directory before use !</span> + +If you want to add a sinusoid noise to the signal +set the noise frequency and amplitude. +Amplitude to 0 results in no noise. + +Set the frequency range for the plot scale. + + + (0x473d9a43, 0x97fc0a97) + 96 + + + (0x7234b86b, 0x2b8651a5) + 288 + + + + + (0x00003f54, 0x00005026) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + +The documentation page for this tutorial is available at: +<i>openvibe.inria.fr/tutorial-using-matlab-with-openvibe</i> + + + (0x473d9a43, 0x97fc0a97) + 400 + + + (0x7234b86b, 0x2b8651a5) + -16 + + + + + (0x00006b7a, 0x000044fb) + The signal display boxes prints +on a 2 seconds horizontal scale + + + (0x473d9a43, 0x97fc0a97) + 96 + + + (0x7234b86b, 0x2b8651a5) + 400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":362,"identifier":"(0x00005a65, 0x00005347)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":442},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007762, 0x000022c1)","index":0,"name":"Default tab","parentIdentifier":"(0x00005a65, 0x00005347)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":156,"identifier":"(0x00007f9f, 0x00002f07)","index":0,"maxDividerPosition":317,"name":"Vertical split","parentIdentifier":"(0x00007762, 0x000022c1)","type":4},{"boxIdentifier":"(0x00007f47, 0x00001bc6)","childCount":0,"identifier":"(0x00006697, 0x000030ae)","index":0,"parentIdentifier":"(0x00007f9f, 0x00002f07)","type":3},{"boxIdentifier":"(0x000008b2, 0x000031dd)","childCount":0,"identifier":"(0x000062cd, 0x0000001e)","index":1,"parentIdentifier":"(0x00007f9f, 0x00002f07)","type":3}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto2_FFT_filter_Initialize.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto2_FFT_filter_Initialize.m new file mode 100644 index 0000000..bcf68a8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto2_FFT_filter_Initialize.m @@ -0,0 +1,25 @@ +% tuto2_FFT_filter_Initialize.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 25 May 2012 +% + +function box_out = tuto2_FFT_filter_Initialize(box_in) + + % we display the setting values + disp('Box settings are:') + for i=1:size(box_in.settings,2) + fprintf('\t%s : %s\n',box_in.settings(i).name, num2str(box_in.settings(i).value)); + end + + % let's add a user-defined indicator to know if the output header is set + box_in.user_data.is_headerset = false; + + % We also add some statistics + box_in.user_data.nb_matrix_processed = 0; + box_in.user_data.mean_fft_matrix = 0; + + box_out = box_in; + +end + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto2_FFT_filter_Process.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto2_FFT_filter_Process.m new file mode 100644 index 0000000..c22058e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto2_FFT_filter_Process.m @@ -0,0 +1,75 @@ +% tuto2_FFT_filter_Process.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 25 May 2012 +% + +function box_out = tuto2_FFT_filter_Process(box_in) + + for i = 1: OV_getNbPendingInputChunk(box_in,1) + if(~box_in.user_data.is_headerset) + % The output is the input + noise, only on first channel + box_in.outputs{1}.header = box_in.inputs{1}.header; + box_in.outputs{1}.header.nb_channels = 1; + box_in.outputs{1}.header.channel_names = {'FFT'}; + box_in.user_data.is_headerset = 1; + % We print the header in the console + disp('Input header is :') + box_in.inputs{1}.header + disp('Output header is :') + box_in.outputs{1}.header + end + + % we increment the matrix count + box_in.user_data.nb_matrix_processed = box_in.user_data.nb_matrix_processed + 1; + + [box_in, start_time, end_time, matrix_data] = OV_popInputBuffer(box_in,1); + + Fs = box_in.inputs{1}.header.sampling_rate; % Sampling frequency + T = 1/Fs; % Sample time + L = box_in.inputs{1}.header.nb_samples_per_buffer; % Length of signal + t = (0:L-1)*T; % Time vector + + % We generate the requested sinusoid noise + noise_amplitude = box_in.settings(2).value; + noise_frequency = box_in.settings(1).value; + sinusoid = noise_amplitude * sin(2*pi* noise_frequency *t); + + % We add this sinus to the original signal on first channel only + sig = sinusoid + matrix_data(1,1:L); + subplot(3,1,1); + plot(Fs*t,sinusoid) + title('Noise') + xlabel('time (seconds)') + + subplot(3,1,2); + plot(Fs*t,sig) + title('Signal Corrupted with the noise (channel 1)') + xlabel('time (seconds)') + + NFFT = 2^nextpow2(L); % Next power of 2 from length of y + Y = fft(sig,NFFT)/L; + f = Fs/2*linspace(0,1,NFFT/2+1); + + % Plot single-sided amplitude spectrum. + plot_range_fmin = box_in.settings(3).value; + plot_range_fmax = box_in.settings(4).value; + subplot(3,1,3) + plot(f(plot_range_fmin*2:plot_range_fmax*2),2*abs(Y(plot_range_fmin*2:plot_range_fmax*2))) + title('Single-Sided Amplitude Spectrum of the corrupted signal (channel 1)') + xlabel('Frequency (Hz)') + ylabel('Amplitude') + + % we sum the FFT for later mean computation + if box_in.user_data.nb_matrix_processed == 1 + box_in.user_data.mean_fft_matrix = Y; + else + box_in.user_data.mean_fft_matrix = box_in.user_data.mean_fft_matrix + Y; + end + + box_in = OV_addOutputBuffer(box_in,1,start_time,end_time,sig); + end + + box_out = box_in; +end + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto2_FFT_filter_Uninitialize.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto2_FFT_filter_Uninitialize.m new file mode 100644 index 0000000..9773c86 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto2_FFT_filter_Uninitialize.m @@ -0,0 +1,34 @@ +% tuto2_FFT_filter_Uninitialize.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 25 May 2012 +% +% The function tuto2_FFT_filter_Uninitialize is called when pressing 'stop' in the scenario. +% We compute the mean FFT and plot it. +% +function box_out = tuto2_FFT_filter_Uninitialize(box_in) + disp('Uninitializing the box...') + + Fs = box_in.inputs{1}.header.sampling_rate; % Sampling frequency + L = box_in.inputs{1}.header.nb_samples_per_buffer; % Length of signal + + NFFT = 2^nextpow2(L); + f = Fs/2*linspace(0,1,NFFT/2+1); + + box_in.user_data.mean_fft_matrix = box_in.user_data.mean_fft_matrix / box_in.user_data.nb_matrix_processed; + + %% we close the previous figure window and plot the mean FFT between 5 and 50Hz. + close(gcf); + plot_range_fmin = box_in.settings(3).value; + plot_range_fmax = box_in.settings(4).value; + plot(f(plot_range_fmin*2:plot_range_fmax*2),2*abs(box_in.user_data.mean_fft_matrix(plot_range_fmin*2:plot_range_fmax*2))) + title('MEAN Single-Sided Amplitude Spectrum of the corrupted signal (channel 1)') + xlabel('Frequency (Hz)') + ylabel('Amplitude') + + % We pause the execution for 10 seconds (to be able to see the figure before the scenario is stopped) + pause(10); + + box_out = box_in; +end + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto3-sinus-generator.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto3-sinus-generator.xml new file mode 100644 index 0000000..e89afe7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto3-sinus-generator.xml @@ -0,0 +1,338 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00001c6f, 0x00005a88) + Tuto 3 : sinus generator + (0x03303e0e, 0x39fe10df) + + + (0x5ba36127, 0x195feae1) + New output + + + (0x6f752dd0, 0x082a321e) + New output(1) + + + + + (0x007deef9, 0x2f3e95c6) + Box clock frequency in Hz + 64 + 32 + false + + + (0x330306dd, 0x74a95f98) + Matlab executable (path) + C:/Program Files (x86)/MATLAB/R2013b/bin/win32/matlab.exe + + false + + + (0x79a9edeb, 0x245d83fc) + Matlab working directory + ${Player_ScenarioDirectory} + ${Player_ScenarioDirectory} + false + + + (0x79a9edeb, 0x245d83fc) + Initialize function + matlab_Initialize + tuto3_sinus_generator_Initialize + false + + + (0x79a9edeb, 0x245d83fc) + Process function + matlab_Process + tuto3_sinus_generator_Process + false + + + (0x79a9edeb, 0x245d83fc) + Uninitialize function + matlab_Uninitialize + tuto3_sinus_generator_Uninitialize + false + + + (0x007deef9, 0x2f3e95c6) + Channel count + + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + + 16 + false + + + (0x007deef9, 0x2f3e95c6) + Amplitude + + 5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_GDF_Artifact_EOG_Large + OVTK_StimulationId_Label_01 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xc0b69293, 0x2c33365a) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x6e3d4519) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002f39, 0x000039fc) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + + + (0x00003443, 0x00005347) + + (0x00001c6f, 0x00005a88) + 0 + + + (0x00002f39, 0x000039fc) + 0 + + + + (0x00007d44, 0x000014de) + + (0x00001c6f, 0x00005a88) + 1 + + + (0x00002f39, 0x000039fc) + 1 + + + + + + (0x00000b01, 0x0000700e) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + +The documentation page for this tutorial is available at: +<i>openvibe.inria.fr/tutorial-using-matlab-with-openvibe</i> + + + (0x473d9a43, 0x97fc0a97) + 400 + + + (0x7234b86b, 0x2b8651a5) + 0 + + + + + (0x00001e22, 0x0000145c) + <b>Configure the Matlab Scripting box:</b> + +<span color="red"> Set the matlab executable path +and the working directory before use !</span> + +You can select the number of channels + and size of data chunk. +Sampling frequency = box clock freqeuncy * samples per block + +The box generates one sinus signal per channel +with frequency +F(channel i) = 10 * i Hz + +The box sends one stimulation per second + + + (0x473d9a43, 0x97fc0a97) + 32 + + + (0x7234b86b, 0x2b8651a5) + 272 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00002f39, 0x000039fc)","childCount":0,"identifier":"(0x00005e17, 0x00003f09)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00006dc8, 0x00002e10)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000023aa, 0x00003482)","index":0,"name":"Default tab","parentIdentifier":"(0x00006dc8, 0x00002e10)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00005c13, 0x00001d05)","index":0,"name":"Empty","parentIdentifier":"(0x000023aa, 0x00003482)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto3_sinus_generator_Initialize.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto3_sinus_generator_Initialize.m new file mode 100644 index 0000000..8460cc3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto3_sinus_generator_Initialize.m @@ -0,0 +1,38 @@ +% tuto3_sinus_generator_Initialize.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 25 May 2012 +% + +function box_out = tuto3_sinus_generator_Initialize(box_in) + + % we display the setting values + disp('Box settings are:') + for i=1:size(box_in.settings,2) + fprintf('\t%s : %s\n',box_in.settings(i).name, num2str(box_in.settings(i).value)); + end + + % As we produce the signal ourselves, we already know the output header + % we construct the channel names + nb_channels = box_in.settings(1).value; + channel_names = cell(1,nb_channels); + for chan = 1 : nb_channels + channel_names{chan} = sprintf('channel %i',chan); + end + % and deduce the other header elements from the box settings + nb_samples_per_buffer = box_in.settings(2).value; + sampling_rate = box_in.clock_frequency * nb_samples_per_buffer; + + box_in = OV_setSignalOutputHeader(box_in, 1, nb_channels, nb_samples_per_buffer, channel_names, sampling_rate); + box_in = OV_setStimulationOutputHeader(box_in,2); + + % end time of the last chunk sent + box_in.user_data.last_end_time = 0; + % number of call to the process function + box_in.user_data.call_count = 0; + % sample count + box_in.user_data.nb_samples = 0; + + box_out = box_in; +end + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto3_sinus_generator_Process.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto3_sinus_generator_Process.m new file mode 100644 index 0000000..655ce6d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto3_sinus_generator_Process.m @@ -0,0 +1,46 @@ +% tuto3_sinus_generator_Process.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 25 May 2012 +% + +function box_out = tuto3_sinus_generator_Process(box_in) + + channel_count = box_in.settings(1).value; + samples_per_buffer = box_in.settings(2).value; + amplitude = box_in.settings(3).value; + stimulation = box_in.settings(4).value; + + start_time = box_in.user_data.last_end_time; + end_time = box_in.clock; + % We produce data of the past step (e.g. at t2 we produce the data of [t1,t2]), thus we skip the first call + if start_time ~= 0 + T = 1/box_in.outputs{1}.header.sampling_rate; + t = (box_in.user_data.nb_samples:box_in.user_data.nb_samples+samples_per_buffer-1)*T; + signal = zeros(channel_count, samples_per_buffer); + freq = 10; + for chan = 1 : channel_count + sinus = amplitude * sin(2*pi* freq *t); + signal(chan,1:samples_per_buffer) = sinus; + freq = freq + 10; + end + + if mod(box_in.user_data.call_count, box_in.clock_frequency) == 0 + stim_set = [stimulation; box_in.clock; 0]; + disp('Sending a stimulation...'); + else + stim_set = []; + end + + box_in = OV_addOutputBuffer(box_in,1,start_time,end_time,signal); + box_in = OV_addOutputBuffer(box_in,2,start_time,end_time,stim_set); + + box_in.user_data.nb_samples = box_in.user_data.nb_samples + samples_per_buffer; + end + + box_in.user_data.last_end_time = end_time; + box_in.user_data.call_count = box_in.user_data.call_count +1; + + box_out = box_in; +end + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto3_sinus_generator_Uninitialize.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto3_sinus_generator_Uninitialize.m new file mode 100644 index 0000000..4b0f98d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/box-tutorials/matlab/tuto3_sinus_generator_Uninitialize.m @@ -0,0 +1,14 @@ +% tuto3_sinus_generator_Uninitialize.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 25 May 2012 +% +% The function tuto3_sinus_generator_Uninitialize is called when pressing 'stop' in the scenario. +% +function box_out = tuto3_sinus_generator_Uninitialize(box_in) + disp('Uninitializing the box...') + + box_out = box_in; + +end + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/doc/Doc_BoxAlgorithm_MatlabScripting.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/doc/Doc_BoxAlgorithm_MatlabScripting.dox-part new file mode 100644 index 0000000..cfaa78e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/doc/Doc_BoxAlgorithm_MatlabScripting.dox-part @@ -0,0 +1,78 @@ +/** + * \page BoxAlgorithm_MatlabScripting Matlab Scripting +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatlabScripting_Description| + The Matlab Scripting box uses the Matlab Engine to process data using Matlab. + This box can be configured with any number of inputs, outputs and settings, of any type. + You will need a valid Matlab installation and license at runtime. This box is currently compatible with + Matlab 32 and 64 bits on Linux, but only with Matlab 32 bits on Windows. + + For a complete tutorial, please check this documentation page. + * |OVP_DocEnd_BoxAlgorithm_MatlabScripting_Description| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatlabScripting_Settings| + * |OVP_DocEnd_BoxAlgorithm_MatlabScripting_Settings| + + * |OVP_DocBegin_BoxAlgorithm_MatlabScripting_Setting1| + The box clock frequency can be an integer between 1 and 128Hz. This tells how many time per second the box "Process" function will be called. + * |OVP_DocEnd_BoxAlgorithm_MatlabScripting_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_MatlabScripting_Setting2| + User must set the place where to find the Matlab executables. On windows it should be in the bin/win32 directory. + On Linux, fill this setting with the command line you are using to launch Matlab on your computer. + * |OVP_DocEnd_BoxAlgorithm_MatlabScripting_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_MatlabScripting_Setting3| + Please enter the Matlab working directory in which this box will work. This should be the absolute adress of the folder where you have put all the function files. + * |OVP_DocEnd_BoxAlgorithm_MatlabScripting_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_MatlabScripting_Setting4| + The name of the matlab function called when initializing the box (i.e. when pressing play in the scenario). + This function is called only once. + + Its signature must be: [box_out] = initialize(box_in), where box_out and box_in are specific structure. + Please see the dedicated tutorial for a complete reference. + * |OVP_DocEnd_BoxAlgorithm_MatlabScripting_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_MatlabScripting_Setting5| + The name of the matlab function called on every tick of the process loop. + This function is called at the box clock frequency. + + Its signature must be: [box_out] = process(box_in), where box_out and box_in are specific structure. + Please see the dedicated tutorial for a complete reference. + * |OVP_DocEnd_BoxAlgorithm_MatlabScripting_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_MatlabScripting_Setting6| + The name of the matlab function called when uninitializing the box (i.e. when pressing stop in the scenario). + This function is called only once. + + Its signature must be: [box_out] = uninitialize(box_in), where box_out and box_in are specific structure. + Please see the dedicated tutorial for a complete reference. + * |OVP_DocEnd_BoxAlgorithm_MatlabScripting_Setting6| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatlabScripting_Examples| + The dedicated tutorial provides 3 examples: + - Signal filtering + - FFT computation and spectrum plot in Matlab + - Signal and stimulation generator + * |OVP_DocEnd_BoxAlgorithm_MatlabScripting_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatlabScripting_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_MatlabScripting_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/doc/matlab_run_full.png b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/doc/matlab_run_full.png new file mode 100644 index 0000000..5a3e63f Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/doc/matlab_run_full.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/doc/matlab_scenar_config.png b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/doc/matlab_scenar_config.png new file mode 100644 index 0000000..4457815 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/doc/matlab_scenar_config.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_addInputBuffer.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_addInputBuffer.m new file mode 100644 index 0000000..7c20941 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_addInputBuffer.m @@ -0,0 +1,19 @@ +% openvibe toolbox for Matlab +% OV_addInputBuffer.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 13 Jan. 2012 + +% Appends a new signal chunk to a signal input buffer in a matlab box instance. +% ------------------------------- +% MEANT TO BE USED BY OPENVIBE + +function box_out = OV_addInputBuffer(box_in, input_index, start_time, end_time, matrix_data) + + chunk.start_time = start_time; + chunk.end_time = end_time; + chunk.matrix_data = matrix_data; + box_in.inputs{input_index}.buffer{size(box_in.inputs{input_index}.buffer,2)+1} = chunk; + + box_out = box_in; +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_addOutputBuffer.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_addOutputBuffer.m new file mode 100644 index 0000000..baf5103 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_addOutputBuffer.m @@ -0,0 +1,20 @@ +% openvibe toolbox for Matlab +% OV_addOutputBuffer.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 13 Jan. 2012 + +% Appends a new chunk in an output buffer, +% meant to be popped by the openvibe box. +% ------------------------------- +% MEANT TO BE USED IN USER SCRIPT + +function box_out = OV_addOutputBuffer(box_in, output_index, start_time, end_time, matrix_data) + + chunk.start_time = start_time; + chunk.end_time = end_time; + chunk.matrix_data = matrix_data; + box_in.outputs{output_index}.buffer{size(box_in.outputs{output_index}.buffer,2)+1} = chunk; + + box_out = box_in; +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_createBoxInstance.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_createBoxInstance.m new file mode 100644 index 0000000..a1a516d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_createBoxInstance.m @@ -0,0 +1,35 @@ +% OV_MATLAB toolkit +% OV_createBoxInstance.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 +% +% This file is meant to be executed prior to any user defined script. +% It construct the objects used by the other functions of the toolkit +% MEANT TO BE USED BY OPENVIBE +% +%out + + +function box = OV_createBoxInstance(input_count, output_count) + + box = []; + box.settings = []; + box.inputs = {}; + for i = 1 : input_count + box.inputs{i}.header = {}; + box.inputs{i}.buffer = {}; + end + + box.outputs = {}; + for i = 1 : output_count + box.outputs{i}.header = {}; + box.outputs{i}.buffer = {}; + end + box.user_data = {}; + + box.clock = 0; + +end + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_define.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_define.m new file mode 100644 index 0000000..a3ac2a7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_define.m @@ -0,0 +1,70 @@ +% OV_MATLAB toolkit +% OV_define.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% This file is meant to be executed prior to any user defined script. +% It declare all stim IDs as variable for use by the user. +% MEANT TO BE CALLED BY OPENVIBE +% +% Stimulation codes +% Originally from openvibe-toolkit/ovtk_defines.h + + +function OV_define() + +% STREAM TYPES: + global OV_TypeId_EBMLStream; + OV_TypeId_EBMLStream = uint64(hex2dec('434F65872EFD2B7E')); + global OV_TypeId_ChannelLocalisation; + OV_TypeId_ChannelLocalisation = uint64(hex2dec('013DF452A3A8879A')); + global OV_TypeId_ExperimentationInformation; % deprecated + OV_TypeId_ExperimentationInformation = uint64(hex2dec('403488E7565D70B6')); % deprecated + global OV_TypeId_ExperimentInfo; + OV_TypeId_ExperimentInfo = uint64(hex2dec('403488E7565D70B6')); + global OV_TypeId_Stimulations; + OV_TypeId_Stimulations = uint64(hex2dec('6F752DD0082A321E')); + global OV_TypeId_StreamedMatrix; + OV_TypeId_StreamedMatrix = uint64(hex2dec('544A003E6DCBA5F6')); + global OV_TypeId_FeatureVector; + OV_TypeId_FeatureVector = uint64(hex2dec('17341935152FF448')); + global OV_TypeId_Signal; + OV_TypeId_Signal = uint64(hex2dec('5BA36127195FEAE1')); + global OV_TypeId_Spectrum; + OV_TypeId_Spectrum = uint64(hex2dec('1F261C0A593BF6BD')); + +% SETTING TYPES: + global OV_TypeId_Boolean; + OV_TypeId_Boolean = uint64(hex2dec('2CDB2F0B12F231EA')); + global OV_TypeId_Integer; + OV_TypeId_Integer = uint64(hex2dec('007DEEF92F3E95C6')); + global OV_TypeId_Float; + OV_TypeId_Float = uint64(hex2dec('512A166F5C3EF83F')); + global OV_TypeId_String; + OV_TypeId_String = uint64(hex2dec('79A9EDEB245D83FC')); + global OV_TypeId_Filename; + OV_TypeId_Filename = uint64(hex2dec('330306DD74A95F98')); + global OV_TypeId_Script; + OV_TypeId_Script = uint64(hex2dec('B0D0DB4549CBC34A')); + global OV_TypeId_Stimulation; + OV_TypeId_Stimulation = uint64(hex2dec('2C132D6E44AB0D97')); + global OV_TypeId_LogLevel; + OV_TypeId_LogLevel = uint64(hex2dec('A88B36670871638C')); + global OV_TypeId_Color; + OV_TypeId_Color = uint64(hex2dec('7F45A2A97DB12219')); + global OV_TypeId_ColorGradient; + OV_TypeId_ColorGradient = uint64(hex2dec('3D3C7C7FEF0E7129')); + + +% STIM CODES: + global OVTK_StimulationId_LabelStart; + OVTK_StimulationId_LabelStart = uint64(hex2dec('00008100')); + global OVTK_StimulationId_LabelEnd; + OVTK_StimulationId_LabelEnd = uint64(hex2dec('000081ff')); + + global OVTK_StimulationId_NumberStart; + OVTK_StimulationId_NumberStart = uint64(hex2dec('00000000')); + global OVTK_StimulationId_NumberEnd; + OVTK_StimulationId_NumberEnd = uint64(hex2dec('000000ff')); +end diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getChannelLocalisationOutputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getChannelLocalisationOutputHeader.m new file mode 100644 index 0000000..db29795 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getChannelLocalisationOutputHeader.m @@ -0,0 +1,24 @@ +% openvibe toolbox for Matlab +% OV_getSignalOutputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a signal output. +% MEANT TO BE USED IN USER SCRIPT + +function [errno, nb_channels, channel_names, dynamic] = OV_getChannelLocalisationOutputHeader(box_in, output_index) + + if(numel(box_in.outputs{output_index}.header) == 0) + nb_channels = 0; + channel_names = 0; + dynamic = 0; + errno = 1; + else + nb_channels = box_in.outputs{output_index}.header.nb_channels; + channel_names = box_in.outputs{output_index}.header.channel_names; + dynamic = box_in.outputs{output_index}.header.dynamic; + errno = 0; + end + +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getFeatureVectorOutputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getFeatureVectorOutputHeader.m new file mode 100644 index 0000000..330a9b9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getFeatureVectorOutputHeader.m @@ -0,0 +1,22 @@ +% openvibe toolbox for Matlab +% OV_getSignalOutputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a signal output. +% MEANT TO BE USED IN USER SCRIPT + +function [errno, nb_features, labels] = OV_getFeatureVectorOutputHeader(box_in, output_index) + + if(numel(box_in.outputs{output_index}.header) == 0) + nb_features = 0; + labels = 0; + errno = 1; + else + nb_features = box_in.outputs{output_index}.header.nb_features; + labels = box_in.outputs{output_index}.header.labels; + errno = 0; + end + +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getNbPendingInputChunk.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getNbPendingInputChunk.m new file mode 100644 index 0000000..00fbe53 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getNbPendingInputChunk.m @@ -0,0 +1,20 @@ +% OV_MATLAB toolkit +% OV_hasPendingInputChunk.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 13 Jan. 2012 + +% Tests if there is pending Input chunk in the buffer +% ------------------------------- +% MEANT TO BE USED IN USER SCRIPT + +function nb_pending = OV_getNbPendingInputChunk(box_in, input_index) + + if(input_index > size(box_in.inputs,2)) + disp('Error while calling OV_getNbPendingOutputChunk : output index out-of-range.') + nb_pending = 0; + else + nb_pending = size(box_in.inputs{input_index}.buffer,2); + end + +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getNbPendingOutputChunk.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getNbPendingOutputChunk.m new file mode 100644 index 0000000..e4b67f4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getNbPendingOutputChunk.m @@ -0,0 +1,20 @@ +% OV_MATLAB toolkit +% OV_hasPendingOutputChunk.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 13 Jan. 2012 + +% Tests if there is pending output chunk in the buffer +% ------------------------------- +% MEANT TO BE USED IN USER SCRIPT + +function nb_pending = OV_getNbPendingOutputChunk(box_in, output_index) + + if(output_index > size(box_in.outputs,2)) + disp('Error while calling OV_getNbPendingOutputChunk : output index out-of-range.') + nb_pending = 0; + else + nb_pending = size(box_in.outputs{output_index}.buffer,2); + end + +end diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getSignalOutputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getSignalOutputHeader.m new file mode 100644 index 0000000..c43ebde --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getSignalOutputHeader.m @@ -0,0 +1,26 @@ +% openvibe toolbox for Matlab +% OV_getSignalOutputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a signal output. +% MEANT TO BE USED IN USER SCRIPT + +function [errno, nb_channels, nb_samples_per_buffer, channel_names, sampling_rate] = OV_getSignalOutputHeader(box_in, output_index) + + if(numel(box_in.outputs{output_index}.header) == 0) + nb_channels = 0; + nb_samples_per_buffer = 0; + channel_names = 0; + sampling_rate = 0; + errno = 1; + else + nb_channels = box_in.outputs{output_index}.header.nb_channels; + nb_samples_per_buffer = box_in.outputs{output_index}.header.nb_samples_per_buffer; + channel_names = box_in.outputs{output_index}.header.channel_names; + sampling_rate = box_in.outputs{output_index}.header.sampling_rate; + errno = 0; + end + +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getSpectrumOutputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getSpectrumOutputHeader.m new file mode 100644 index 0000000..8dae7f2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getSpectrumOutputHeader.m @@ -0,0 +1,31 @@ +% openvibe toolbox for Matlab +% OV_getSpectrumOutputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a signal output. +% MEANT TO BE USED IN USER SCRIPT + +function [errno, nb_channels, channel_names, nb_abscissas, abscissas_names, abscissas_linear, sampling_rate] = OV_getSpectrumOutputHeader(box_in, output_index) + + if(numel(box_in.outputs{output_index}.header) == 0) + nb_channels = 0; + channel_names = 0; + nb_abscissas = 0; + abscissas_names = 0; + abscissas_linear = 0; + sampling_rate = 0; + errno = 1; + else + nb_channels = box_in.outputs{output_index}.header.nb_channels; + channel_names = box_in.outputs{output_index}.header.channel_names; + + nb_abscissas = box_in.outputs{output_index}.header.nb_abscissas; + abscissas_names = box_in.outputs{output_index}.header.abscissas_names; + abscissas_linear = box_in.outputs{output_index}.header.abscissas; + %reshape(box_in.outputs{output_index}.header.bands,1,numel(box_in.outputs{output_index}.header.bands)); + sampling_rate = box_in.outputs{output_index}.header.sampling_rate; + errno = 0; + end +end diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getStimulationOutputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getStimulationOutputHeader.m new file mode 100644 index 0000000..c82a02a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getStimulationOutputHeader.m @@ -0,0 +1,14 @@ +% openvibe toolbox for Matlab +% OV_getStimulationOutputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a signal output. +% MEANT TO BE USED IN USER SCRIPT + +function OV_getStimulationOutputHeader(box_in, output_index) + + %This function does nothing, the stimulation header is empty. + +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getStimulationsOutputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getStimulationsOutputHeader.m new file mode 100644 index 0000000..ccd2c0e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getStimulationsOutputHeader.m @@ -0,0 +1,14 @@ +% openvibe toolbox for Matlab +% OV_getStimulationOutputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a signal output. +% MEANT TO BE USED IN USER SCRIPT + +function OV_getStimulationsOutputHeader(box_in, output_index) + + %This function does nothing, the stimulation header is empty. + +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getStreamedMatrixOutputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getStreamedMatrixOutputHeader.m new file mode 100644 index 0000000..320e5d8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_getStreamedMatrixOutputHeader.m @@ -0,0 +1,24 @@ +% openvibe toolbox for Matlab +% OV_getStreamedMatrixOutputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a signal output. +% MEANT TO BE USED IN USER SCRIPT + +function [errno, nb_dimensions, dimension_sizes, dimension_labels] = OV_getStreamedMatrixOutputHeader(box_in, output_index) + + if(numel(box_in.outputs{output_index}.header) == 0) + nb_dimensions = 0; + dimension_sizes = 0; + dimension_labels = 0; + errno = 1; + else + nb_dimensions = box_in.outputs{output_index}.header.nb_dimensions; + dimension_sizes = box_in.outputs{output_index}.header.dimension_sizes; + dimension_labels = box_in.outputs{output_index}.header.dimension_labels; + errno = 0; + end + +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_popInputBuffer.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_popInputBuffer.m new file mode 100644 index 0000000..0281dd6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_popInputBuffer.m @@ -0,0 +1,29 @@ +% OV_MATLAB toolkit +% OV_popInputBuffer.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 13 Jan. 2012 + +% Pops the first signal chunk on an input +% ------------------------------- +% output = matrix data (matlab format) +% ------------------------------- +% MEANT TO BE USED IN USER SCRIPT + +function [box_out, start_time,end_time, matrix_data] = OV_popInputBuffer(box_in, input_index) + + if size(box_in.inputs{input_index}.buffer,2) == 0 + start_time = -1; + end_time = -1; + matrix_data = []; + else + start_time = box_in.inputs{input_index}.buffer{1}.start_time; + end_time = box_in.inputs{input_index}.buffer{1}.end_time; + matrix_data = box_in.inputs{input_index}.buffer{1}.matrix_data; + end + + box_in.inputs{input_index}.buffer = box_in.inputs{input_index}.buffer(2:end); + + box_out = box_in; + +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_popOutputBuffer.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_popOutputBuffer.m new file mode 100644 index 0000000..bb677c5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_popOutputBuffer.m @@ -0,0 +1,29 @@ +% OV_MATLAB toolkit +% OV_popOutputBuffer.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% pops the last chunk in the output buffer +% MEANT TO BE USED IN OPENVIBE + +function [box_out, start_time, end_time, linear_matrix_size, linear_data] = OV_popOutputBuffer(box_in, output_index) + + if size(box_in.outputs{output_index}.buffer,1) == 0 + start_time = -1; + end_time = -1; + linear_data = []; + linear_matrix_size = 0; + else + start_time = box_in.outputs{output_index}.buffer{1}.start_time; + end_time = box_in.outputs{output_index}.buffer{1}.end_time; + nb_elements = size(box_in.outputs{output_index}.buffer{1}.matrix_data(1:end),2); + linear_data = box_in.outputs{output_index}.buffer{1}.matrix_data; + linear_matrix_size = nb_elements; + end + + box_in.outputs{output_index}.buffer = box_in.outputs{output_index}.buffer(2:end); + + box_out = box_in; + +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_popOutputBufferReshape.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_popOutputBufferReshape.m new file mode 100644 index 0000000..610ec8f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_popOutputBufferReshape.m @@ -0,0 +1,29 @@ +% OV_MATLAB toolkit +% OV_popOutputBufferReshape.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% pops the last chunk in the output buffer +% MEANT TO BE USED IN OPENVIBE + +function [box_out, start_time, end_time, linear_matrix_size, linear_data] = OV_popOutputBufferReshape(box_in, output_index) + + if size(box_in.outputs{output_index}.buffer,1) == 0 + start_time = -1; + end_time = -1; + linear_data = []; + linear_matrix_size = 0; + else + start_time = box_in.outputs{output_index}.buffer{1}.start_time; + end_time = box_in.outputs{output_index}.buffer{1}.end_time; + nb_elements = numel(box_in.outputs{output_index}.buffer{1}.matrix_data); + linear_data = reshape(box_in.outputs{output_index}.buffer{1}.matrix_data',1,nb_elements); + linear_matrix_size = nb_elements; + end + + box_in.outputs{output_index}.buffer = box_in.outputs{output_index}.buffer(2:end); + + box_out = box_in; + +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setChannelLocalisationInputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setChannelLocalisationInputHeader.m new file mode 100644 index 0000000..2a0af8e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setChannelLocalisationInputHeader.m @@ -0,0 +1,19 @@ +% OV_MATLAB toolkit +% OV_setChannelLocalizationInputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a Channel Localization input. + +function box_out = OV_setChannelLocalisationInputHeader(box_in, input_index, nb_channels, channel_names, dynamic) + + box_in.inputs{input_index}.header.type = 'Channel Localisation Stream'; + box_in.inputs{input_index}.header.nb_channels = nb_channels; + box_in.inputs{input_index}.header.channel_names = channel_names; + box_in.inputs{input_index}.header.dynamic = dynamic; + + box_in.inputs{input_index}.buffer = {}; + + box_out = box_in; +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setChannelLocalisationOutputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setChannelLocalisationOutputHeader.m new file mode 100644 index 0000000..b75b3d5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setChannelLocalisationOutputHeader.m @@ -0,0 +1,19 @@ +% OV_MATLAB toolkit +% OV_setChannelLocalizationInputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a Channel Localization input. + +function box_out = OV_setChannelLocalisationOutputHeader(box_in, output_index, nb_channels, channel_names, dynamic) + + box_in.output{output_index}.header.type = 'Channel Localisation Stream'; + box_in.output{output_index}.header.nb_channels = nb_channels; + box_in.output{output_index}.header.channel_names = channel_names; + box_in.output{output_index}.header.dynamic = dynamic; + + box_in.output{output_index}.buffer = {}; + + box_out = box_in; +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setFeatureVectorInputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setFeatureVectorInputHeader.m new file mode 100644 index 0000000..6a2121b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setFeatureVectorInputHeader.m @@ -0,0 +1,18 @@ +% OV_MATLAB toolkit +% OV_setFeatureVectorInputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a Feature Vector input. + +function box_out = OV_setFeatureVectorInputHeader(box_in, input_index, nb_features, labels) + + box_in.inputs{input_index}.header.type = 'Feature Vector Stream'; + box_in.inputs{input_index}.header.nb_features = nb_features; + box_in.inputs{input_index}.header.labels = labels; + + box_in.inputs{input_index}.buffer = {}; + + box_out = box_in; +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setFeatureVectorOutputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setFeatureVectorOutputHeader.m new file mode 100644 index 0000000..dceec84 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setFeatureVectorOutputHeader.m @@ -0,0 +1,18 @@ +% OV_MATLAB toolkit +% OV_setFeatureVectorInputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a Feature Vector input. + +function box_out = OV_setFeatureVectorOutputHeader(box_in, output_index, nb_features, labels) + + box_in.outputs{output_index}.header.type = 'Feature Vector Stream'; + box_in.outputs{output_index}.header.nb_features = nb_features; + box_in.outputs{output_index}.header.labels = labels; + + box_in.outputs{output_index}.buffer = {}; + + box_out = box_in; +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setSettings.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setSettings.m new file mode 100644 index 0000000..8bb74f5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setSettings.m @@ -0,0 +1,15 @@ +% OV_MATLAB toolkit +% OV_setSettings.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% This file is meant to be executed prior to any user defined script. +% It construct the objects used by the other functions of the toolkit +% MEANT TO BE USED BY OPENVIBE + +function box_out = OV_setSettings(box_in, names, types, values) + + box_in.settings = struct('name',names,'type',types,'value',values); + box_out = box_in; +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setSignalInputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setSignalInputHeader.m new file mode 100644 index 0000000..d4ca4e4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setSignalInputHeader.m @@ -0,0 +1,20 @@ +% OV_MATLAB toolkit +% OV_setSignalInputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a signal input. + +function box_out = OV_setSignalInputHeader(box_in, input_index, nb_channel, nb_samples_per_buffer, channel_names, sampling_rate) + + box_in.inputs{input_index}.header.type = 'Signal Stream'; + box_in.inputs{input_index}.header.nb_channels = nb_channel; + box_in.inputs{input_index}.header.nb_samples_per_buffer = nb_samples_per_buffer; + box_in.inputs{input_index}.header.channel_names = channel_names; + box_in.inputs{input_index}.header.sampling_rate = sampling_rate; + + box_in.inputs{input_index}.buffer = {}; + + box_out = box_in; +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setSignalOutputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setSignalOutputHeader.m new file mode 100644 index 0000000..64f6602 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setSignalOutputHeader.m @@ -0,0 +1,21 @@ +% OV_MATLAB toolkit +% OV_setSignalOutputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a signal output. +% MEANT TO BE USED IN USER SCRIPT + +function box_out = OV_setSignalOutputHeader(box_in, output_index, nb_channel, nb_samples_per_buffer, channel_names, sampling_rate) + + box_in.outputs{output_index}.header.type = 'Signal Stream'; + box_in.outputs{output_index}.header.nb_channels = nb_channel; + box_in.outputs{output_index}.header.nb_samples_per_buffer = nb_samples_per_buffer; + box_in.outputs{output_index}.header.channel_names = channel_names; + box_in.outputs{output_index}.header.sampling_rate = sampling_rate; + + box_in.outputs{output_index}.buffer = {}; + + box_out = box_in; +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setSpectrumInputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setSpectrumInputHeader.m new file mode 100644 index 0000000..6ffc47e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setSpectrumInputHeader.m @@ -0,0 +1,22 @@ +% OV_MATLAB toolkit +% OV_setSpectrumHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a Spectrum input. + +function box_out = OV_setSpectrumInputHeader(box_in, input_index, nb_channels, channel_names, nb_abscissas, abscissas_names, abscissas, sampling_rate) + + box_in.inputs{input_index}.header.type = 'Spectrum Stream'; + box_in.inputs{input_index}.header.nb_channels = nb_channels; + box_in.inputs{input_index}.header.channel_names = channel_names; + box_in.inputs{input_index}.header.nb_abscissas = nb_abscissas; + box_in.inputs{input_index}.header.abscissas_names = abscissas_names; + box_in.inputs{input_index}.header.abscissas = abscissas; + box_in.inputs{input_index}.header.sampling_rate = sampling_rate; + + box_in.inputs{input_index}.buffer = {}; + + box_out = box_in; +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setSpectrumOutputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setSpectrumOutputHeader.m new file mode 100644 index 0000000..bc393c3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setSpectrumOutputHeader.m @@ -0,0 +1,23 @@ +% OV_MATLAB toolkit +% OV_setSpectrumOutputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a Spectrum input. + +function box_out = OV_setSpectrumOutputHeader(box_in, output_index, nb_channels, channel_names, nb_abscissas, abscissas_names, abscissas, sampling_rate) + + box_in.outputs{output_index}.header.type = 'Spectrum Stream'; + box_in.outputs{output_index}.header.nb_channels = nb_channels; + box_in.outputs{output_index}.header.channel_names = channel_names; + + box_in.outputs{output_index}.header.nb_abscissas = nb_abscissas; + box_in.outputs{output_index}.header.abscissas_names = abscissas_names; + box_in.outputs{output_index}.header.abscissas = abscissas; + box_in.outputs{output_index}.header.sampling_rate = sampling_rate; + + box_in.outputs{output_index}.buffer = {}; + + box_out = box_in; +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStimulationInputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStimulationInputHeader.m new file mode 100644 index 0000000..7e38705 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStimulationInputHeader.m @@ -0,0 +1,16 @@ +% OV_MATLAB toolkit +% OV_setChannelLocalizationInputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a Stimulation input. + +function box_out = OV_setStimulationInputHeader(box_in, input_index) + + box_in.inputs{input_index}.header.type = 'Stimulation Stream'; + + box_in.inputs{input_index}.buffer = {}; + + box_out = box_in; +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStimulationOutputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStimulationOutputHeader.m new file mode 100644 index 0000000..8bd1ade --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStimulationOutputHeader.m @@ -0,0 +1,16 @@ +% OV_MATLAB toolkit +% OV_setStimulationOutputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a Stimulation input. + +function box_out = OV_setStimulationOutputHeader(box_in, output_index) + + box_in.outputs{output_index}.header.type = 'Stimulation Stream'; + + box_in.outputs{output_index}.buffer = {}; + + box_out = box_in; +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStimulationsInputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStimulationsInputHeader.m new file mode 100644 index 0000000..b80de7a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStimulationsInputHeader.m @@ -0,0 +1,16 @@ +% OV_MATLAB toolkit +% OV_setChannelLocalizationInputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a Stimulation input. + +function box_out = OV_setStimulationsInputHeader(box_in, input_index) + + box_in.inputs{input_index}.header.type = 'Stimulation Stream'; + + box_in.inputs{input_index}.buffer = {}; + + box_out = box_in; +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStimulationsOutputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStimulationsOutputHeader.m new file mode 100644 index 0000000..0daa10f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStimulationsOutputHeader.m @@ -0,0 +1,16 @@ +% OV_MATLAB toolkit +% OV_setStimulationOutputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a Stimulation input. + +function box_out = OV_setStimulationsOutputHeader(box_in, output_index) + + box_in.outputs{output_index}.header.type = 'Stimulation Stream'; + + box_in.outputs{output_index}.buffer = {}; + + box_out = box_in; +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStreamedMatrixInputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStreamedMatrixInputHeader.m new file mode 100644 index 0000000..f918cda --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStreamedMatrixInputHeader.m @@ -0,0 +1,19 @@ +% OV_MATLAB toolkit +% OV_setStreamedMatrixInputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a streamed Matrix input. + +function box_out = OV_setStreamedMatrixInputHeader(box_in, input_index, nb_dim, dim_sizes, dim_labels) + + box_in.inputs{input_index}.header.type = 'Streamed Matrix Stream'; + box_in.inputs{input_index}.header.nb_dimensions = nb_dim; + box_in.inputs{input_index}.header.dimension_sizes = dim_sizes; + box_in.inputs{input_index}.header.dimension_labels = dim_labels; + + box_in.inputs{input_index}.buffer = {}; + + box_out = box_in; +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStreamedMatrixOutputHeader.m b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStreamedMatrixOutputHeader.m new file mode 100644 index 0000000..5fb9738 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/share/OV_setStreamedMatrixOutputHeader.m @@ -0,0 +1,20 @@ +% OV_MATLAB toolkit +% OV_setStreamedMatrixOutputHeader.m +% ------------------------------- +% Author : Laurent Bonnet (INRIA) +% Date : 28/07/2011 + +% Set the header information on a signal output. +% MEANT TO BE USED IN USER SCRIPT + +function box_out = OV_setStreamedMatrixOutputHeader(box_in, output_index, nb_dim, dim_sizes, dim_labels) + + box_in.outputs{output_index}.header.type = 'Streamed Matrix Stream'; + box_in.outputs{output_index}.header.nb_dimensions = nb_dim; + box_in.outputs{output_index}.header.dimension_sizes = dim_sizes; + box_in.outputs{output_index}.header.dimension_labels = dim_labels; + + box_in.outputs{output_index}.buffer = {}; + + box_out = box_in; +end \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/box-algorithms/ovpCBoxAlgorithmMatlabScripting.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/box-algorithms/ovpCBoxAlgorithmMatlabScripting.cpp new file mode 100644 index 0000000..de2e8a4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/box-algorithms/ovpCBoxAlgorithmMatlabScripting.cpp @@ -0,0 +1,733 @@ +#include +#if defined TARGET_HAS_ThirdPartyMatlab + +#include "ovpCBoxAlgorithmMatlabScripting.h" + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#if defined TARGET_OS_Windows +#include +#include +#define getCurrentDir _getcwd +#else +#include +#define getCurrentDir getcwd +#endif + + +// Size of the internal buffer storing matlab messages, in char +#define MATLAB_BUFFER 2048 +#define MATLAB_ENGINE ((Engine*)m_engineHandle) + +namespace OpenViBE { +namespace Plugins { +namespace Matlab { + +// Sanitizes a path so that it only has / or \ characters and has a / or \ in the end. +// @fixme should move to plugins-FS possibly +void CBoxAlgorithmMatlabScripting::sanitizePath(CString& pathToModify) +{ + std::string tmpPath(pathToModify); + // Append / to end of path if its not there already + if (tmpPath.length() > 0) + { + const char lastChar = tmpPath.at(tmpPath.length() - 1); + if (lastChar != '\\' && lastChar != '/') { tmpPath += "/"; } + } + +#if defined TARGET_OS_Windows + std::replace(tmpPath.begin(), tmpPath.end(), '/', '\\'); // Convert '/' to '\' +#endif + pathToModify = tmpPath.c_str(); +} + +// The checkFailureRoutine() verifies the result of a matlab call (via engine or helper functions) given as argument. +// If the result is false (the matlab call failed), the message msg is printed in the Error Log Level, and the macro returns false. +// The Matlab output buffer is then printed. If an error message is detected in the buffer, the same error message is printed and +// the macro returns false. +bool CBoxAlgorithmMatlabScripting::checkFailureRoutine(const bool result, const CString& msg) +{ + OV_ERROR_UNLESS_KRF(result, msg, Kernel::ErrorType::BadProcessing); + + m_errorDetected = false; + this->printOutputBufferWithFormat(); + OV_ERROR_UNLESS_KRF(!m_errorDetected, msg, Kernel::ErrorType::BadProcessing); + + return true; +} + +bool CBoxAlgorithmMatlabScripting::openMatlabEngineSafely() +{ + this->getLogManager() << Kernel::LogLevel_Trace << "Trying to open the Matlab engine\n"; +#if defined TARGET_OS_Linux + m_engineHandle = ::engOpen(m_matlabPath.toASCIIString()); + OV_ERROR_UNLESS_KRF(m_matlabEngine, "Could not open the Matlab engine.\nThe configured path to the matlab executable was expanded as '" << m_matlabPath << "'.", Kernel::ErrorType::BadProcessing); +} +#elif defined TARGET_OS_Windows + __try { m_engineHandle = engOpen(nullptr); } + __except (EXCEPTION_EXECUTE_HANDLER) + { + this->getLogManager() << Kernel::LogLevel_Error << "First call to the MATLAB engine failed.\n"; + this->getLogManager() << Kernel::LogLevel_Error << "To use this box you must have MATLAB installed on your computer.\n"; +#if defined(TARGET_ARCHITECTURE_x64) + this->getLogManager() << Kernel::LogLevel_Error << "For this build of OpenViBE, MATLAB needs to be a 64bit version.\n"; +#else + this->getLogManager() << Kernel::LogLevel_Error << "For this build of OpenViBE, MATLAB needs to be a 32bit version.\n"; +#endif + m_engineHandle = nullptr; + } + if (!MATLAB_ENGINE) + { + this->getLogManager() << Kernel::LogLevel_Error << "Could not open the Matlab engine.\nThe matlab binary path was reasoned to be '" << m_matlabPath << "'.\n"; + return false; + } +#else + OV_ERROR_KRF("Only Linux and Windows are supported", Kernel::ErrorType::BadVersion); +#endif + return true; +} + +bool CBoxAlgorithmMatlabScripting::initialize() +{ + m_engineHandle = nullptr; + m_matlabBuffer = nullptr; + m_helper = new CMatlabHelper(this->getLogManager(), this->getErrorManager()); + + m_clockFrequency = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + for (size_t i = 0; i < getStaticBoxContext().getInputCount(); ++i) + { + CIdentifier type; + getStaticBoxContext().getInputType(i, type); + Toolkit::TDecoder* decoder = nullptr; + if (type == OV_TypeId_StreamedMatrix) { decoder = new Toolkit::TStreamedMatrixDecoder(*this, i); } + else if (type == OV_TypeId_ChannelLocalisation) { decoder = new Toolkit::TChannelLocalisationDecoder(*this, i); } + else if (type == OV_TypeId_FeatureVector) { decoder = new Toolkit::TFeatureVectorDecoder(*this, i); } + else if (type == OV_TypeId_Spectrum) { decoder = new Toolkit::TSpectrumDecoder(*this, i); } + else if (type == OV_TypeId_Signal) { decoder = new Toolkit::TSignalDecoder(*this, i); } + else if (type == OV_TypeId_Stimulations) { decoder = new Toolkit::TStimulationDecoder(*this, i); } + else if (type == OV_TypeId_ExperimentInfo) { decoder = new Toolkit::TExperimentInfoDecoder(*this, i); } + else { this->getLogManager() << Kernel::LogLevel_Warning << "Undefined type on input [" << i << "].\n"; } + if (decoder != nullptr) + { + m_decoders.insert(std::make_pair(i, decoder)); + m_nInputHeaderSent = 0; + } + } + + for (size_t i = 0; i < getStaticBoxContext().getOutputCount(); ++i) + { + CIdentifier type; + getStaticBoxContext().getOutputType(i, type); + Toolkit::TEncoder* encoder = nullptr; + if (type == OV_TypeId_StreamedMatrix) { encoder = new Toolkit::TStreamedMatrixEncoder(*this, i); } + else if (type == OV_TypeId_ChannelLocalisation) { encoder = new Toolkit::TChannelLocalisationEncoder(*this, i); } + else if (type == OV_TypeId_FeatureVector) { encoder = new Toolkit::TFeatureVectorEncoder(*this, i); } + else if (type == OV_TypeId_Spectrum) { encoder = new Toolkit::TSpectrumEncoder(*this, i); } + else if (type == OV_TypeId_Signal) { encoder = new Toolkit::TSignalEncoder(*this, i); } + else if (type == OV_TypeId_Stimulations) { encoder = new Toolkit::TStimulationEncoder(*this, i); } + else if (type == OV_TypeId_ExperimentInfo) { encoder = new Toolkit::TExperimentInfoEncoder(*this, i); } + else { this->getLogManager() << Kernel::LogLevel_Warning << "Undefined type on input [" << i << "].\n"; } + if (encoder != nullptr) + { + m_encoders.insert(std::make_pair(i, encoder)); + m_oHeaderStates.insert(std::make_pair(i, false)); + } + } + + m_matlabPath = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + +#if defined TARGET_OS_Windows + if (!FS::Files::directoryExists(m_matlabPath) && FS::Files::fileExists(m_matlabPath)) + { + // The path might be pointing to the executable, try to extract the directory + char parentPath[MAX_PATH]; + FS::Files::getParentPath(m_matlabPath, parentPath); + m_matlabPath = CString(parentPath); + } + + sanitizePath(m_matlabPath); + + this->getLogManager() << Kernel::LogLevel_Trace << "Interpreting Matlab path as '" << m_matlabPath << "'\n"; + + OV_ERROR_UNLESS_KRF(FS::Files::directoryExists(m_matlabPath), "Configured Matlab path '" << m_matlabPath << "' does not seem to be a directory", + Kernel::ErrorType::BadConfig); + + char* path = getenv("PATH"); + OV_ERROR_UNLESS_KRF(path, "Could not access the environment variable PATH to add Matlab path to it.", Kernel::ErrorType::BadSetting); + + std::string strPath = std::string(path); + size_t found = strPath.find(m_matlabPath.toASCIIString()); + if (found == std::string::npos) + { + CString pathModif = path + CString(";") + m_matlabPath; + OV_ERROR_UNLESS_KRF(_putenv_s("PATH", pathModif) == 0, "Failed to modify the environment PATH with the Matlab path.", + Kernel::ErrorType::BadProcessing); + + this->getLogManager() << Kernel::LogLevel_Trace << "Matlab Path '" << m_matlabPath << "' added to Windows PATH environment variable.\n"; + } + else { this->getLogManager() << Kernel::LogLevel_Trace << "No need to add matlab to PATH\n"; } +#endif + + if (!openMatlabEngineSafely()) { return false; } + + m_matlabBuffer = new char[MATLAB_BUFFER + 1]; + m_matlabBuffer[MATLAB_BUFFER] = '\0'; + engOutputBuffer(MATLAB_ENGINE, m_matlabBuffer, MATLAB_BUFFER); + m_errorDetected = false; + + // add the openvibe toolbox to matlab path + char curDir[FILENAME_MAX]; + OV_ERROR_UNLESS_KRF(getCurrentDir(curDir, FILENAME_MAX), "Failed to get the execution directory.", Kernel::ErrorType::BadProcessing); + + std::string curDirString = curDir; + std::replace(curDirString.begin(), curDirString.end(), '\\', '/'); + + this->getConfigurationManager().addOrReplaceConfigurationToken(CString("Path_Bin_Abs"), CString(curDirString.c_str())); + + CString cmd = CString("addpath('") + Directories::getDataDir() + "/plugins/matlab');"; + engEvalString(MATLAB_ENGINE, cmd.toASCIIString()); + //if(!checkFailureRoutine(engEvalString(m_matlabEngine, (const char * )l_sOpenvibeToolboxPath) == 0, "An error occurred while adding the path to openvibe toolbox\n")) return false; + // If there is more than 1 Matlab box in the scenario, the path is set repeatedly + // resulting in warning messages in the buffer. We don't print them. + // this->printOutputBufferWithFormat(); + + CString workingDir = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + sanitizePath(workingDir); + + // Try to find an unused box instance variable name + while (true) + { + std::stringstream ss; + ss.fill('0'); + ss << "OV_BOX_0x" << std::setw(8) << std::hex << System::Math::randomI() << "_0x" << std::setw(8) << std::hex << System::Math::randomI(); + m_boxInstanceVariableName = ss.str().c_str(); + this->getLogManager() << Kernel::LogLevel_Trace << "Checking if variable " << m_boxInstanceVariableName << " is in use...\n"; + mxArray* tmp = engGetVariable(MATLAB_ENGINE, m_boxInstanceVariableName.toASCIIString()); + if (!tmp) + { + // Found unused name + break; + } + mxDestroyArray(tmp); + } + this->getLogManager() << Kernel::LogLevel_Trace << "Selected variable name " << m_boxInstanceVariableName << "\n"; + + this->getLogManager() << Kernel::LogLevel_Trace << "Setting working directory to " << workingDir << "\n"; + cmd = CString("cd '") + workingDir + CString("'"); + if (!checkFailureRoutine(engEvalString(MATLAB_ENGINE, cmd) == 0, "An error occurred while changing the working directory\n")) { return false; } + + // executes the pre-run routine that defines the global identifiers for streams and stimulations codes + cmd = CString("run '") + Directories::getDataDir() + "/plugins/matlab/OV_define.m'"; + if (!checkFailureRoutine(engEvalString(MATLAB_ENGINE, cmd) == 0, "An error occurred while calling OV_define.m")) { return false; } + + cmd = CString("run '") + Directories::getDataDir() + "/plugins/matlab/OV_stimulations.m'"; + if (!checkFailureRoutine(engEvalString(MATLAB_ENGINE, cmd) == 0, "An error occurred while calling OV_stimulations.m")) { return false; } + + // executes the pre-run routine that construct the ov_box object + cmd = m_boxInstanceVariableName + " = OV_createBoxInstance(" + std::to_string(this->getStaticBoxContext().getInputCount()).c_str() + "," + + std::to_string(this->getStaticBoxContext().getOutputCount()).c_str() + ");"; + if (!checkFailureRoutine(engEvalString(MATLAB_ENGINE, cmd) == 0, "An error occurred while calling OV_createBoxInstance.m")) { return false; } + + //First call to a function of the openvibe toolbox + // if it fails, the toolbox may be not installed + mxArray* box = engGetVariable(MATLAB_ENGINE, m_boxInstanceVariableName.toASCIIString()); + OV_ERROR_UNLESS_KRF(box, "Failed to create the box instance with OV_createBoxInstance function.", Kernel::ErrorType::BadProcessing); + + m_initializeFunc = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + m_processFunc = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + m_uninitializeFunc = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5); + + // Check that the files actually exist + CString filename; + filename = workingDir + m_initializeFunc + ".m"; + OV_ERROR_UNLESS_KRF(FS::Files::fileExists(filename.toASCIIString()), "Cannot open '" << filename << "'", Kernel::ErrorType::BadFileRead); + filename = workingDir + m_processFunc + ".m"; + OV_ERROR_UNLESS_KRF(FS::Files::fileExists(filename.toASCIIString()), "Cannot open '" << filename << "'", Kernel::ErrorType::BadFileRead); + filename = workingDir + m_uninitializeFunc + ".m"; + OV_ERROR_UNLESS_KRF(FS::Files::fileExists(filename.toASCIIString()), "Cannot open '" << filename << "'", Kernel::ErrorType::BadFileRead); + + CString names = "{"; + CString types = "{"; + CString values = "{"; + CString tmp; + CIdentifier typeID; + + for (size_t i = 6; i < getStaticBoxContext().getSettingCount(); ++i) + { + // get the setting name + getStaticBoxContext().getSettingName(i, tmp); + names = names + "'" + tmp + "' "; + + //setting type + getStaticBoxContext().getSettingType(i, typeID); + std::stringstream ss; + ss << typeID.id(); + types = types + "uint64(" + ss.str().c_str() + ") "; + + //setting value, typed + + tmp = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i); + if (typeID == OV_TypeId_Stimulation) + { + uint64_t code = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i); + std::stringstream ss1; + ss1 << code; + values = values + CString(ss1.str().c_str()) + CString(" "); + // we keep the stimulation codes as doubles, to be able to put them in arrays with other doubles (such as timings). + // they are still comparable with uint64_t matlab values. + } + else + { + if (typeID == OV_TypeId_Stimulation || typeID == OV_TypeId_Boolean || typeID == OV_TypeId_Integer || typeID == OV_TypeId_Float) + { + values = values + tmp + " "; // we store the value, these types are readable by matlab directly + } + else { values = values + "'" + tmp + "' "; } // we store them as matlab strings using ' + } + } + names += "}"; + types += "}"; + values += "}"; + + // On Windows, Matlab doesn't sometimes notice .m files have been changed, esp. if you have matlab box running while you change them + if (!checkFailureRoutine(engEvalString(MATLAB_ENGINE, "clear functions;") == 0, "An error occurred while calling matlab 'clear functions;'\n")) + { + return false; + } + + cmd = m_boxInstanceVariableName + " = OV_setSettings(" + m_boxInstanceVariableName + "," + names + "," + types + "," + values + ");"; + if (!checkFailureRoutine(engEvalString(MATLAB_ENGINE, cmd.toASCIIString()) == 0, "Error calling [OV_setSettings]\n")) { return false; } + + // we set the box clock frequency in the box structure, so it's accessible in the user scripts if needed + tmp = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + cmd = m_boxInstanceVariableName + ".clock_frequency = " + tmp + ";"; + if (!checkFailureRoutine(engEvalString(MATLAB_ENGINE, cmd) == 0, "An error occurred while setting the clock frequency\n")) { return false; } + + cmd = m_boxInstanceVariableName + " = " + m_initializeFunc + "(" + m_boxInstanceVariableName + ");"; + if (!checkFailureRoutine(engEvalString(MATLAB_ENGINE, cmd) == 0, "An error occurred while calling the initialize function\n")) { return false; } + + m_helper->setMatlabEngine(MATLAB_ENGINE); + m_helper->setBoxInstanceVariableName(m_boxInstanceVariableName); + + return true; +} + +bool CBoxAlgorithmMatlabScripting::closeMatlabEngineSafely() +{ + if (MATLAB_ENGINE == nullptr) { return true; } + this->getLogManager() << Kernel::LogLevel_Trace << "Trying to close Matlab engine\n"; +#if defined TARGET_OS_Windows + __try + { +#endif + if (MATLAB_ENGINE) { if (engClose(MATLAB_ENGINE) != 0) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Could not close Matlab engine.\n"; } } +#if defined TARGET_OS_Windows + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + this->getLogManager() << Kernel::LogLevel_Error << "Closing MATLAB engine failed.\n" + << "\tTo use this box you must have MATLAB (32 bits version) installed on your computer.\n"; + return false; + } +#endif + + return true; +} + +bool CBoxAlgorithmMatlabScripting::uninitialize() +{ + delete m_helper; + if (MATLAB_ENGINE != nullptr) + { + CString cmd = m_boxInstanceVariableName + " = " + m_uninitializeFunc + "(" + m_boxInstanceVariableName + ");"; + if (!checkFailureRoutine(engEvalString(MATLAB_ENGINE, cmd) == 0, "An error occurred while calling the uninitialize function\n") + ) { } // NOP, we still want to deallocate below + // Remove the box from the matlab workspace + cmd = "clear " + m_boxInstanceVariableName + ";"; + if (!checkFailureRoutine(engEvalString(MATLAB_ENGINE, cmd) == 0, "An error occurred while clearing the box\n") + ) { } // NOP, we still want to deallocate below + } + + closeMatlabEngineSafely(); + if (m_matlabBuffer) + { + delete[] m_matlabBuffer; + m_matlabBuffer = nullptr; + } + + for (size_t i = 0; i < m_decoders.size(); ++i) + { + m_decoders[i]->uninitialize(); + delete m_decoders[i]; + } + for (size_t i = 0; i < m_encoders.size(); ++i) + { + m_encoders[i]->uninitialize(); + delete m_encoders[i]; + } + + return true; +} + +bool CBoxAlgorithmMatlabScripting::processClock(Kernel::CMessageClock& /*msg*/) +{ + if (!MATLAB_ENGINE) { return true; } + const std::string cmd = std::string(m_boxInstanceVariableName) + ".clock = " + std::to_string(CTime(this->getPlayerContext().getCurrentTime()).toSeconds()) + + ";"; + OV_ERROR_UNLESS_KRF(engEvalString(MATLAB_ENGINE, cmd.c_str()) == 0, "An error occurred while updating the box clock.", Kernel::ErrorType::BadProcessing); + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmMatlabScripting::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + // In openvibe, pointers to managers can change between the calls to process(), so we need to provide current ones every time + m_helper->setManagers(&this->getLogManager(), &this->getErrorManager()); + + for (size_t i = 0; i < getStaticBoxContext().getInputCount(); ++i) + { + for (size_t j = 0; j < boxContext.getInputChunkCount(i); ++j) + { + m_decoders[i]->decode(j); + + CIdentifier type; + getStaticBoxContext().getInputType(i, type); + bool unknownStream = true; + bool receivedSomething = false; + + if (m_decoders[i]->isHeaderReceived()) + { + receivedSomething = true; + // this->getLogManager() << Kernel::LogLevel_Debug << "Received header\n"; + + if (type == OV_TypeId_StreamedMatrix) + { + CMatrix* matrix = static_cast*>(m_decoders[i])->getOutputMatrix(); + if (!checkFailureRoutine(m_helper->setStreamedMatrixInputHeader(i, matrix), "Error calling [OV_setStreamMatrixInputHeader]\n")) + { + return false; + } + + m_nInputHeaderSent++; + unknownStream = false; + } + + if (type == OV_TypeId_Signal) + { + CMatrix* matrix = static_cast*>(m_decoders[i])->getOutputMatrix(); + const uint64_t frequency = static_cast*>(m_decoders[i])->getOutputSamplingRate(); + if (!checkFailureRoutine(m_helper->setSignalInputHeader(i, matrix, frequency), + "Error calling [OV_setSignalInputHeader]\n")) { return false; } + + m_nInputHeaderSent++; + unknownStream = false; + } + + if (type == OV_TypeId_FeatureVector) + { + CMatrix* matrix = static_cast*>(m_decoders[i])->getOutputMatrix(); + if (!checkFailureRoutine(m_helper->setFeatureVectorInputHeader(i, matrix), + "Error calling [OV_setFeatureVectorInputHeader]\n")) { return false; } + + m_nInputHeaderSent++; + unknownStream = false; + } + + if (type == OV_TypeId_Spectrum) + { + CMatrix* matrix = static_cast*>(m_decoders[i])->getOutputMatrix(); + CMatrix* freqAbscissa = static_cast*>(m_decoders[i])->getOutputFrequencyAbscissa(); + const uint64_t frequency = static_cast*>(m_decoders[i])->getOutputSamplingRate(); + + if (!checkFailureRoutine(m_helper->setSpectrumInputHeader(i, matrix, freqAbscissa, frequency), + "Error calling [OV_setSpectrumInputHeader]\n")) { return false; } + + m_nInputHeaderSent++; + unknownStream = false; + } + + if (type == OV_TypeId_ChannelLocalisation) + { + CMatrix* matrix = static_cast*>(m_decoders[i])->getOutputMatrix(); + const bool dynamic = static_cast*>(m_decoders[i])->getOutputDynamic(); + if (!checkFailureRoutine(m_helper->setChannelLocalisationInputHeader(i, matrix, dynamic), + "Error calling [OV_setChannelLocalizationInputHeader]\n")) { return false; } + + m_nInputHeaderSent++; + unknownStream = false; + } + + if (type == OV_TypeId_ExperimentInfo) + { + OV_WARNING_K( + "The Experiment Information Stream is not implemented with the Matlab Scripting Box. If this is relevant for your usage, please contact the official development Team.") + ; + m_nInputHeaderSent++; + unknownStream = false; + } + + if (type == OV_TypeId_Stimulations) + { + if (!checkFailureRoutine(m_helper->setStimulationsInputHeader(i), "Error calling [OV_setStimulationsInputHeader]\n")) { return false; } + + m_nInputHeaderSent++; + unknownStream = false; + } + } + + if (m_decoders[i]->isBufferReceived()) + { + // this->getLogManager() << Kernel::LogLevel_Debug << "Received buffer\n"; + receivedSomething = true; + // + if (type == OV_TypeId_StreamedMatrix || this->getTypeManager().isDerivedFromStream(type, OV_TypeId_StreamedMatrix)) + { + CMatrix* matrix = static_cast*>(m_decoders[i])->getOutputMatrix(); + const uint64_t start = boxContext.getInputChunkStartTime(i, j); + const uint64_t end = boxContext.getInputChunkEndTime(i, j); + if (!checkFailureRoutine(m_helper->addStreamedMatrixInputBuffer(i, matrix, start, end), + "Error calling [OV_addInputBuffer (Streamed Matrix or child stream)]\n")) { return false; } + unknownStream = false; + } + + if (type == OV_TypeId_Stimulations) + { + IStimulationSet* stimSet = static_cast*>(m_decoders[i])->getOutputStimulationSet(); + const uint64_t start = boxContext.getInputChunkStartTime(i, j); + const uint64_t end = boxContext.getInputChunkEndTime(i, j); + if (stimSet->getStimulationCount() > 0) + { + this->getLogManager() << Kernel::LogLevel_Trace << "Inserting stimulation set with size " << stimSet->getStimulationCount() << "\n"; + } + if (!checkFailureRoutine(m_helper->addStimulationsInputBuffer(i, stimSet, start, end), + "Error calling [OV_addInputBuffer (Stimulations)]\n")) { return false; } + unknownStream = false; + } + } + + if (m_decoders[i]->isEndReceived()) + { + this->getLogManager() << Kernel::LogLevel_Info << "Received end\n"; + receivedSomething = true; + unknownStream = false; + // @FIXME should something additional be done here? + } + + OV_ERROR_UNLESS_KRF(!receivedSomething || !unknownStream, "Unknown Stream Type " << type.str() << " on input [" << i << "].", + Kernel::ErrorType::BadProcessing); + } + } + + if (m_nInputHeaderSent < getStaticBoxContext().getInputCount()) + { + // not ready to process + return true; + } + + + // CALL TO PROCESS FUNCTION + std::string command = std::string(m_boxInstanceVariableName.toASCIIString()) + " = " + m_processFunc.toASCIIString() + "(" + + m_boxInstanceVariableName.toASCIIString() + ");"; + if (!checkFailureRoutine(engEvalString(MATLAB_ENGINE, command.c_str()) == 0, "Error calling the Process function.\n")) { return false; } + + // Go through every output in the matlab box and copy the data to the C++ side + for (size_t i = 0; i < getStaticBoxContext().getOutputCount(); ++i) + { + // now we check for pending output chunk to be sent (output type independent call) + command = std::string("OV_PENDING_COUNT_TMP = OV_getNbPendingOutputChunk(") + m_boxInstanceVariableName.toASCIIString() + ", " + + std::to_string(i + 1) + ");"; + if (!checkFailureRoutine(engEvalString(MATLAB_ENGINE, command.c_str()) == 0, "Error calling [OV_getNbPendingOutputChunk].\n")) { return false; } + + mxArray* pending = engGetVariable(MATLAB_ENGINE, "OV_PENDING_COUNT_TMP"); + const double dPending = *mxGetPr(pending); + + CIdentifier typeID; + getStaticBoxContext().getOutputType(i, typeID); + + for (size_t c = 0; c < size_t(dPending); ++c) + { + // If no header were ever sent, we need to extract header information in the matlab box + // This header must have been set prior to sending the very first buffer. + // @FIXME the practice used below of assigning to getters is nasty, it should be refactored to e.g. using getter/setter pairs + if (!m_oHeaderStates[i]) + { + bool unknownType = true; + if (typeID == OV_TypeId_StreamedMatrix) + { + CMatrix* matrixToSend = static_cast*>(m_encoders[i])->getInputMatrix(); + if (!checkFailureRoutine(m_helper->getStreamedMatrixOutputHeader(i, matrixToSend), + "Error calling [OV_getStreamedMatrixOutputHeader]. Did you correctly set the output header in the matlab structure ?\n") + ) { return false; } + + unknownType = false; + } + else if (typeID == OV_TypeId_Signal) + { + CMatrix* matrixToSend = static_cast*>(m_encoders[i])->getInputMatrix(); + uint64_t sampling = static_cast*>(m_encoders[i])->getInputSamplingRate(); + if (!checkFailureRoutine(m_helper->getSignalOutputHeader(i, matrixToSend, sampling), + "Error calling [OV_getSignalOutputHeader]. Did you correctly set the output header in the matlab structure ?\n") + ) { return false; } + + // Set the new sampling rate + static_cast*>(m_encoders[i])->getInputSamplingRate() = sampling; + + unknownType = false; + } + else if (typeID == OV_TypeId_FeatureVector) + { + CMatrix* matrixToSend = static_cast*>(m_encoders[i])->getInputMatrix(); + if (!checkFailureRoutine(m_helper->getFeatureVectorOutputHeader(i, matrixToSend), + "Error calling [OV_getFeatureVectorOutputHeader]. Did you correctly set the output header in the matlab structure ?\n") + ) { return false; } + + unknownType = false; + } + else if (typeID == OV_TypeId_Spectrum) + { + CMatrix* matrixToSend = static_cast*>(m_encoders[i])->getInputMatrix(); + CMatrix* freqAbscissa = static_cast*>(m_encoders[i])->getInputFrequencyAbscissa(); + uint64_t frequency = static_cast*>(m_encoders[i])->getInputSamplingRate(); + + if (!checkFailureRoutine(m_helper->getSpectrumOutputHeader(i, matrixToSend, freqAbscissa, frequency), + "Error calling [OV_getSpectrumOutputHeader]. Did you correctly set the output header in the matlab structure ?\n") + ) { return false; } + + unknownType = false; + } + else if (typeID == OV_TypeId_ChannelLocalisation) + { + CMatrix* matrixToSend = static_cast*>(m_encoders[i])->getInputMatrix(); + bool dynamic = static_cast*>(m_encoders[i])->getInputDynamic(); + if (!checkFailureRoutine(m_helper->getChannelLocalisationOutputHeader(i, matrixToSend, dynamic), + "Error calling [OV_getChannelLocalizationOutputHeader]. Did you correctly set the output header in the matlab structure ?\n") + ) { return false; } + + // Set the new channel localisation + static_cast*>(m_encoders[i])->getInputDynamic() = dynamic; + + unknownType = false; + } + else if (typeID == OV_TypeId_ExperimentInfo) + { + OV_WARNING_K( + "The Experiment Information Stream is not implemented with the Matlab Scripting Box. If this is relevant for your usage, please contact the official development Team.") + ; + unknownType = false; + } + else if (typeID == OV_TypeId_Stimulations) + { + IStimulationSet* stimSet = static_cast*>(m_encoders[i])->getInputStimulationSet(); + if (!checkFailureRoutine(m_helper->getStimulationsOutputHeader(i, stimSet), + "Error calling [OV_getStimulationsOutputHeader]. Did you correctly set the output header in the matlab structure ?\n") + ) { return false; } + + unknownType = false; + } + + OV_ERROR_UNLESS_KRF(!unknownType, "Unknown Stream Type on output [" << i << "].", Kernel::ErrorType::BadProcessing); + + m_encoders[i]->encodeHeader(); + boxContext.markOutputAsReadyToSend(i, 0, 0); + + m_oHeaderStates[i] = true; + } + + + bool unknownType = true; + uint64_t start = 0; + uint64_t end = 0; + + if (typeID == OV_TypeId_StreamedMatrix || this->getTypeManager().isDerivedFromStream(typeID, OV_TypeId_StreamedMatrix)) + { + CMatrix* matrixToSend = static_cast*>(m_encoders[i])->getInputMatrix(); + if (!checkFailureRoutine(m_helper->popStreamedMatrixOutputBuffer(i, matrixToSend, start, end), + "Error calling [OV_popOutputBufferReshape] for Streamed Matrix stream or child stream.\n")) { return false; } + + unknownType = false; + } + + if (typeID == OV_TypeId_Stimulations) + { + IStimulationSet* stimSet = static_cast*>(m_encoders[i])->getInputStimulationSet(); + stimSet->clear(); + if (!checkFailureRoutine(m_helper->popStimulationsOutputBuffer(i, stimSet, start, end), + "Error calling [OV_popOutputBuffer] for Stimulation stream.\n")) { return false; } + unknownType = false; + } + + OV_ERROR_UNLESS_KRF(!unknownType, "Unknown Stream Type on output [" << i << "].", Kernel::ErrorType::BadProcessing); + + m_encoders[i]->encodeBuffer(); + boxContext.markOutputAsReadyToSend(i, start, end); + } + mxDestroyArray(pending); + } + + return true; +} + +bool CBoxAlgorithmMatlabScripting::processInput(const size_t /*index*/) +{ + OV_ERROR_UNLESS_KRF(getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(), + "Error while marking algorithm as ready to process", Kernel::ErrorType::Internal); + return true; +} + +bool CBoxAlgorithmMatlabScripting::printOutputBufferWithFormat() +{ + // the buffer for the console + + // @FIXME allow seeing more of the error message! + + std::stringstream ss; + ss << m_matlabBuffer; + if (!ss.str().empty()) + { + const size_t errIdx1 = ss.str().find("??? "); + const size_t errIdx2 = ss.str().find("Error: "); + const size_t errIdx3 = ss.str().find("Error "); + + // Find the earliest error message + size_t errIdx = std::string::npos; + if (errIdx == std::string::npos || (errIdx1 != std::string::npos && errIdx1 < errIdx)) { errIdx = errIdx1; } + if (errIdx == std::string::npos || (errIdx2 != std::string::npos && errIdx2 < errIdx)) { errIdx = errIdx2; } + if (errIdx == std::string::npos || (errIdx3 != std::string::npos && errIdx3 < errIdx)) { errIdx = errIdx3; } + + size_t warnIdx = ss.str().find("Warning: "); + if (errIdx == std::string::npos && warnIdx == std::string::npos) + { + this->getLogManager() << Kernel::LogLevel_Info << "\n---- MATLAB BUFFER - INFO ----\n" << ss.str().substr(0, (warnIdx < errIdx) ? warnIdx : errIdx) << "\n"; + } + if (warnIdx != std::string::npos) + { + this->getLogManager() << Kernel::LogLevel_Warning << "\n---- MATLAB BUFFER - WARNING ----\n" << ss.str().substr(warnIdx, errIdx) << "\n"; + } + if (errIdx != std::string::npos) + { + this->getLogManager() << Kernel::LogLevel_Error << "\n---- MATLAB BUFFER - ERROR ! ----\n" << ss.str().substr(errIdx) << "\n"; + m_errorDetected = true; + } + } + return true; +} + +} // namespace Matlab +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyMatlab diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/box-algorithms/ovpCBoxAlgorithmMatlabScripting.h b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/box-algorithms/ovpCBoxAlgorithmMatlabScripting.h new file mode 100644 index 0000000..5bdac25 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/box-algorithms/ovpCBoxAlgorithmMatlabScripting.h @@ -0,0 +1,155 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyMatlab + +#include "../ovp_defines.h" +#include +#include +#include "../ovpCMatlabHelper.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace Matlab { +class CBoxAlgorithmMatlabScripting final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + uint64_t getClockFrequency() override { return m_clockFrequency << 32; } + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + bool processInput(const size_t index) override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_MatlabScripting) + +private: + bool openMatlabEngineSafely(); + bool closeMatlabEngineSafely(); + + uint64_t m_clockFrequency = 0; + + std::map*> m_decoders; + size_t m_nInputHeaderSent = 0; + + std::map*> m_encoders; + std::map m_oHeaderStates; + + void* m_engineHandle = nullptr; + CString m_boxInstanceVariableName; //must be unique + + + CMatlabHelper* m_helper = nullptr; + + CString m_matlabPath; // On Linux, path of the executable. On Windows, the executable directory. + CString m_processFunc; + CString m_initializeFunc; + CString m_uninitializeFunc; + + char* m_matlabBuffer = nullptr; + bool m_errorDetected = false; + bool printOutputBufferWithFormat(); + bool checkFailureRoutine(bool result, const CString& msg); + static void sanitizePath(CString& pathToModify); + + //void sendOutputHeader(CIdentifier idOutputType); + //void sendOutputBuffer(CIdentifier idOutputType); +}; + +class CBoxAlgorithmMatlabScriptingListener final : public Toolkit::TBoxListener +{ +public: + bool onSettingTypeChanged(Kernel::IBox& box, const size_t index) override + { + //we must have the first STATIC_SETTINGS_COUNT settings + if (index < 6) + { + this->getLogManager() << Kernel::LogLevel_Warning << "One of the predefined setting has changed type, falling back to default.\n"; + box.setSettingType(index, OV_TypeId_String); // they are all strings + } + + return true; + } + + bool onSettingValueChanged(Kernel::IBox& box, const size_t index) override + { + //we must have the first STATIC_SETTINGS_COUNT settings + + CString str; + box.getSettingValue(0, str); + const uint64_t value = atoi(str.toASCIIString()); + if (index == 0 && (value < 1 || value > 128)) + { + OV_WARNING_K("Clock Frequency must be an integer between 1 and 128 Hz. Falling back to default."); + box.setSettingValue(index, "64"); + } + + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmMatlabScriptingDesc final : virtual public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Matlab Scripting"); } + CString getAuthorName() const override { return CString("L. Bonnet"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + + CString getShortDescription() const override { return CString("Executes matlab scripts. To be used correctly, you must have Matlab installed."); } + + CString getDetailedDescription() const override + { + return CString( + "User must implement the matlab functions:\n[box_out]=bci_Initialize(box_in)\n[box_out]=bci_Process(box_in)\n[box_out]=bci_Uninitialize(box_in)\nPlease refer to the dedicated documentation for more information."); + } + + CString getCategory() const override { return CString("Scripting"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-execute"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_MatlabScripting; } + IPluginObject* create() override { return new CBoxAlgorithmMatlabScripting; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("Box clock frequency in Hz", OV_TypeId_Integer, "64"); + +#if defined TARGET_OS_Linux + prototype.addSetting("Matlab executable (path)", OV_TypeId_Filename, "[ssh user@host] /path/to/matlab"); +#elif defined TARGET_OS_Windows + // On Windows, the executable is not actually used, but its path is parsed from it and added to PATH. + // Background: Matlab's engOpen() takes a different argument on Windows and on Linux. On Windows, we need to have Matlab + // on PATH, in Linux we need to provide a full path of the executable. However, we'd like our example scenarios to give + // correct instructions to the user on both platforms, hence we use a setting that contains the information for both use-cases. + prototype.addSetting("Matlab executable (path)", OV_TypeId_Filename, "C:/Program Files (x86)/MATLAB/R2013b/bin/win32/matlab.exe"); +#else +#endif + prototype.addSetting("Matlab working directory", OV_TypeId_String, "${Player_ScenarioDirectory}"); + prototype.addSetting("Initialize function", OV_TypeId_String, "matlab_Initialize"); + prototype.addSetting("Process function", OV_TypeId_String, "matlab_Process"); + prototype.addSetting("Uninitialize function", OV_TypeId_String, "matlab_Uninitialize"); + + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + prototype.addFlag(Kernel::BoxFlag_CanAddOutput); + prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + prototype.addFlag(Kernel::BoxFlag_CanAddSetting); + prototype.addFlag(Kernel::BoxFlag_CanModifySetting); + + //prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmMatlabScriptingListener; } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_MatlabScriptingDesc) +}; +} // namespace Matlab +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyMatlab diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/ovpCMatlabHelper.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/ovpCMatlabHelper.cpp new file mode 100755 index 0000000..9fe1ade --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/ovpCMatlabHelper.cpp @@ -0,0 +1,493 @@ +#if defined TARGET_HAS_ThirdPartyMatlab + +#include "ovpCMatlabHelper.h" +#include +#include +#include +//#include +#include + +#if defined TARGET_OS_Windows +#include +#endif + +namespace OpenViBE { +namespace Plugins { +namespace Matlab { + +//--------------------------------------------------------------------------------------------------------------- +static std::string escapeMatlabString(const char* sStringToEscape) +{ + std::string str = std::string(sStringToEscape); + auto it = str.begin(); + while (it != str.end()) + { + if (*it == '\'') + { + str.insert(it, '\''); + ++it; + } + ++it; + } + return str; +} + +static std::string genLabelsList(CMatrix* matrix, const size_t axis = 0) +{ + std::string labelsList; + for (size_t i = 0; i < matrix->getDimensionSize(axis); ++i) + { + labelsList += std::string("'") + escapeMatlabString(matrix->getDimensionLabel(axis, i)) + "' "; + } + return labelsList; +} + + +static uint64_t convertFromMArray(mxArray* array, const size_t index) +{ + const double* ptr = ::mxGetPr(array); + const double timeValue = double(ptr[index]); + return CTime(timeValue).time(); +} + +static uint64_t castFromMArray(mxArray* array, const size_t index) +{ + const double* ptr = ::mxGetPr(array); + const double value = double(ptr[index]); + return uint64_t(value); +} + +static CString getNameFromCell(mxArray* names, const size_t index) +{ + mxArray* cell = mxGetCell(names, index); + if (!cell) { return CString(""); } + const mwSize* cellSizes = mxGetDimensions(cell); + char* name = new char[cellSizes[1] + 1]; + name[cellSizes[1]] = '\0'; + for (size_t cellsize = 0; cellsize < size_t(cellSizes[1]); ++cellsize) { name[cellsize] = static_cast(mxGetData(cell))[cellsize * 2]; } + CString res = name; + delete name; + return res; +} + +std::vector CMatlabHelper::getNamelist(const char* name) const +{ + std::vector res; + + mxArray* marray = engGetVariable(m_matlabEngine, name); + if (!marray) + { + this->getLogManager() << Kernel::LogLevel_Error << "Nonexisting variable [" << name << "]\n"; + return res; + } + + const mwSize nbCells = mxGetNumberOfElements(marray); + for (size_t cell = 0; cell < nbCells; ++cell) { res.push_back(getNameFromCell(marray, cell)); } + + mxDestroyArray(marray); + return res; +} + +uint32_t CMatlabHelper::getUi32FromEnv(const char* name) const +{ + mxArray* marray = engGetVariable(m_matlabEngine, name); + if (!marray) + { + this->getLogManager() << Kernel::LogLevel_Error << "Nonexisting variable [" << name << "]\n"; + return 0; + } + const uint32_t res = uint32_t(*mxGetPr(marray)); + mxDestroyArray(marray); + return res; +} + +uint64_t CMatlabHelper::getUi64FromEnv(const char* name) const +{ + mxArray* marray = engGetVariable(m_matlabEngine, name); + if (!marray) + { + this->getLogManager() << Kernel::LogLevel_Error << "Nonexisting variable [" << name << "]\n"; + return 0; + } + const uint64_t res = uint64_t(*mxGetPr(marray)); + mxDestroyArray(marray); + return res; +} + +uint64_t CMatlabHelper::genUi64FromEnvConverted(const char* name) const +{ + mxArray* marray = engGetVariable(m_matlabEngine, name); + if (!marray) + { + this->getLogManager() << Kernel::LogLevel_Error << "Nonexisting variable [" << name << "]\n"; + return 0; + } + + const double value = double(*mxGetPr(marray)); + const uint64_t res = CTime(value).time(); + mxDestroyArray(marray); + return res; +} +//--------------------------------------------------------------------------------------------------------------- + +bool CMatlabHelper::setStreamedMatrixInputHeader(const size_t index, CMatrix* matrix) const +{ + std::string labelList; + std::string dimensionSizes; + for (size_t dim = 0; dim < matrix->getDimensionCount(); ++dim) + { + dimensionSizes += std::to_string(matrix->getDimensionSize(dim)) + " "; + labelList += std::string("{") + genLabelsList(matrix, dim) + "} "; + } + //function box_out = OV_setStreamedMatrixInputInputHeader(box_in, input_index, dimension_count, dimension_sizes, dimension_labels) + + const std::string cmd = std::string(m_boxInstanceVariableName) + " = OV_setStreamedMatrixInputHeader(" + m_boxInstanceVariableName.toASCIIString() + "," + + std::to_string(index + 1) + "," + std::to_string(matrix->getDimensionCount()) + "," + "[" + dimensionSizes + "]," + + "{" + labelList + "});"; + + return engEvalString(m_matlabEngine, cmd.c_str()) == 0; +} + +bool CMatlabHelper::setFeatureVectorInputHeader(const size_t index, CMatrix* matrix) const +{ + const std::string labelList = genLabelsList(matrix, 0); + + //function box_out = OV_setStreamedMatrixInputInputHeader(box_in, input_index, dimension_count, dimension_sizes, dimension_labels) + + //box_out = OV_setFeatureVectorInputHeader(box_in, input_index, nb_features, labels) + const std::string cmd = std::string(m_boxInstanceVariableName.toASCIIString()) + " = OV_setFeatureVectorInputHeader(" + + m_boxInstanceVariableName.toASCIIString() + "," + std::to_string(index + 1) + "," + + std::to_string(matrix->getDimensionSize(0)) + "," + "{" + labelList + "});"; + + return engEvalString(m_matlabEngine, cmd.c_str()) == 0; +} + +bool CMatlabHelper::setSignalInputHeader(const size_t index, CMatrix* matrix, const uint64_t frequency) const +{ + const std::string labelList = genLabelsList(matrix, 0); + //function box_out = ov_set_signal_input_header(box_in, input_index, nb_channel, nb_samples_per_buffer, channel_names, sampling_rate) + + const std::string cmd = std::string(m_boxInstanceVariableName) + " = OV_setSignalInputHeader(" + m_boxInstanceVariableName.toASCIIString() + "," + + std::to_string(index + 1) + "," + std::to_string(matrix->getDimensionSize(0)) + "," + + std::to_string(matrix->getDimensionSize(1)) + "," + "{" + labelList + "}," + std::to_string(frequency) + ");"; + + return engEvalString(m_matlabEngine, cmd.c_str()) == 0; +} + +bool CMatlabHelper::setChannelLocalisationInputHeader(const size_t index, CMatrix* matrix, const bool dynamic) const +{ + const std::string labelList = genLabelsList(matrix, 0); + //function box_out = OV_setChannelLocalisationInputHeader(box_in, input_index, nb_channels, channel_names, dynamic) + + const std::string cmd = std::string(m_boxInstanceVariableName) + " = OV_setChannelLocalisationInputHeader(" + m_boxInstanceVariableName.toASCIIString() + + "," + std::to_string(index + 1) + "," + std::to_string(matrix->getDimensionSize(0)) + "," + "{" + labelList + "}," + + (dynamic ? "true" : "false") + ");"; + + return engEvalString(m_matlabEngine, cmd.c_str()) == 0; +} + +bool CMatlabHelper::setSpectrumInputHeader(const size_t index, CMatrix* matrix, CMatrix* frequencyAbscissa, const uint64_t frequency) const +{ + const std::string labelList = genLabelsList(matrix, 0); + const std::string abscissaList = genLabelsList(matrix, 1); + + // @FIXME CERT this is now one dim array + mxArray* matlabMatrix = ::mxCreateDoubleMatrix(frequencyAbscissa->getDimensionSize(0), 1, mxREAL); + + memcpy(mxGetPr(matlabMatrix), frequencyAbscissa->getBuffer(), frequencyAbscissa->getBufferElementCount() * sizeof(double)); + engPutVariable(m_matlabEngine, "OV_MATRIX_TMP", matlabMatrix); + + mxDestroyArray(matlabMatrix); + + //box_out = OV_setSpectrumInputHeader(box_in, input_index, nb_channels, channel_names, nb_bands, band_names, bands, sampling_rate) + const std::string cmd = std::string(m_boxInstanceVariableName.toASCIIString()) + " = OV_setSpectrumInputHeader(" + + std::string(m_boxInstanceVariableName.toASCIIString()) + "," + + std::to_string(index + 1) + "," // input_index + + std::to_string(matrix->getDimensionSize(0)) + "," // nb_channels + + "{" + labelList + "}," // channel_names + + std::to_string(matrix->getDimensionSize(1)) + "," // nb_freq abscissa + + "{" + abscissaList + "}," //freq abscissa names + + "OV_MATRIX_TMP," //bands + + std::to_string(frequency) + ");"; //sampling rate + + return engEvalString(m_matlabEngine, cmd.c_str()) == 0; +} + +bool CMatlabHelper::setStimulationsInputHeader(const size_t index) const +{ + //box_out = OV_setStimulationInputHeader(box_in, input_index) + const std::string cmd = std::string(m_boxInstanceVariableName) + " = OV_setStimulationsInputHeader(" + m_boxInstanceVariableName.toASCIIString() + "," + + std::to_string(index + 1) + ");"; + + return engEvalString(m_matlabEngine, cmd.c_str()) == 0; +} + +//bool setExperimentInfoInputHeader(CMatrix * pMatrix); + +//--------------------------------------------------------------------------------------------------------------- + +bool CMatlabHelper::addStreamedMatrixInputBuffer(const size_t index, CMatrix* matrix, const uint64_t startTime, const uint64_t endTime) const +{ + mwSize* dims = new mwSize[matrix->getDimensionCount()]; + size_t j = matrix->getDimensionCount() - 1; + for (size_t i = 0; i < matrix->getDimensionCount(); ++i) + { + dims[i] = matrix->getDimensionSize(j); + j--; + } + + mxArray* matlabMatrix = ::mxCreateNumericArray(matrix->getDimensionCount(), dims, mxDOUBLE_CLASS, mxREAL); + + //test : channel 1 samples to '10' + //for (size_t i = 0; i < 32;i++) matrix->getBuffer()[i] = 10; + + memcpy(mxGetPr(matlabMatrix), matrix->getBuffer(), matrix->getBufferElementCount() * sizeof(double)); + engPutVariable(m_matlabEngine, "OV_MATRIX_TMP", matlabMatrix); + + mxDestroyArray(matlabMatrix); + + const std::string cmd = std::string(m_boxInstanceVariableName) + " = OV_addInputBuffer(" + m_boxInstanceVariableName.toASCIIString() + "," + + std::to_string(index + 1) + "," + + std::to_string(CTime(startTime).toSeconds()) + "," + + std::to_string(CTime(endTime).toSeconds()) + ",OV_MATRIX_TMP');"; + // please note the transpose operator ' to put the matrix with 1 channel per line + + delete[] dims; + + return engEvalString(m_matlabEngine, cmd.c_str()) == 0; +} + +bool CMatlabHelper::addStimulationsInputBuffer(const size_t index, IStimulationSet* stimSet, const uint64_t startTime, const uint64_t endTime) const +{ + if (stimSet->getStimulationCount() == 0 && engEvalString(m_matlabEngine, "OV_MATRIX_TMP = 0") != 0) { return false; } + // we create a 3xN matrix for N stims (access is easier in that order) + mxArray* matrix = ::mxCreateDoubleMatrix(3, size_t(stimSet->getStimulationCount()), mxREAL); + + for (size_t i = 0; i < stimSet->getStimulationCount(); ++i) + { + ::mxGetPr(matrix)[i * 3] = double(stimSet->getStimulationIdentifier(i)); + ::mxGetPr(matrix)[i * 3 + 1] = CTime(stimSet->getStimulationDate(i)).toSeconds(); + ::mxGetPr(matrix)[i * 3 + 2] = CTime(stimSet->getStimulationDuration(i)).toSeconds(); + } + + engPutVariable(m_matlabEngine, "OV_MATRIX_TMP", matrix); + + mxDestroyArray(matrix); + + const std::string cmd = std::string(m_boxInstanceVariableName) + " = OV_addInputBuffer(" + m_boxInstanceVariableName.toASCIIString() + "," + + std::to_string(index + 1) + "," + + std::to_string(CTime(startTime).toSeconds()) + "," + + std::to_string(CTime(endTime).toSeconds()) + ",OV_MATRIX_TMP');"; + + return (engEvalString(m_matlabEngine, cmd.c_str()) == 0); +} + +//--------------------------------------------------------------------------------------------------------------- + +bool CMatlabHelper::getStreamedMatrixOutputHeader(const size_t index, CMatrix* matrix) const +{ + const std::string cmd = std::string("[OV_ERRNO, OV_NB_DIMENSIONS, OV_DIMENSION_SIZES, OV_DIMENSION_LABELS] = OV_getStreamedMatrixOutputHeader(") + + m_boxInstanceVariableName.toASCIIString() + "," + std::to_string(index + 1) + ");"; + OV_ERROR_UNLESS_KRF(engEvalString(m_matlabEngine, cmd.c_str()) == 0 && getUi32FromEnv("OV_ERRNO") == 0, + "Could not get Streamed matrix output header", Kernel::ErrorType::BadProcessing); + + const size_t nDimension = getUi32FromEnv("OV_NB_DIMENSIONS"); + mxArray* dimensionSizes = engGetVariable(m_matlabEngine, "OV_DIMENSION_SIZES"); + if (!dimensionSizes) + { + this->getLogManager() << Kernel::LogLevel_Error << "Nonexisting variable [OV_DIMENSION_SIZES]\n"; + return false; + } + + std::vector nameList = getNamelist("OV_DIMENSION_LABELS"); + + matrix->setDimensionCount(nDimension); + size_t idx = 0; + for (size_t i = 0; i < nDimension; ++i) + { + matrix->setDimensionSize(i, size_t(mxGetPr(dimensionSizes)[i])); + for (size_t x = 0; x < matrix->getDimensionSize(i) && idx < nameList.size(); ++x) + { + matrix->setDimensionLabel(i, x, escapeMatlabString(nameList[idx].toASCIIString()).c_str()); + idx++; + } + } + + mxDestroyArray(dimensionSizes); + + return true; +} + +bool CMatlabHelper::getFeatureVectorOutputHeader(const size_t index, CMatrix* matrix) const +{ + const std::string cmd = std::string("[OV_ERRNO, OV_NB_FEATURES, OV_LABELS] = OV_getFeatureVectorOutputHeader(") + + m_boxInstanceVariableName.toASCIIString() + "," + std::to_string(index + 1) + ");"; + OV_ERROR_UNLESS_KRF(engEvalString(m_matlabEngine, cmd.c_str()) == 0 && getUi32FromEnv("OV_ERRNO") == 0, + "Could not get Feature Vector output header", + Kernel::ErrorType::BadProcessing); + + const size_t nbFeatures = getUi32FromEnv("OV_NB_FEATURES"); + std::vector nameList = getNamelist("OV_LABELS"); + // Check nb features == nb names ? + + matrix->resize(nbFeatures); + for (size_t x = 0; x < nbFeatures; ++x) { matrix->setDimensionLabel(0, x, escapeMatlabString(nameList[x].toASCIIString()).c_str()); } + + return true; +} + +bool CMatlabHelper::getSignalOutputHeader(const size_t index, CMatrix* matrix, uint64_t& frequency) const +{ + const std::string cmd = std::string("[OV_ERRNO, OV_NB_CHANNELS, OV_NB_SAMPLES_PER_BUFFER, OV_CHANNEL_NAMES, OV_SAMPLING_RATE] = OV_getSignalOutputHeader(") + + m_boxInstanceVariableName.toASCIIString() + "," + std::to_string(index + 1) + ");"; + OV_ERROR_UNLESS_KRF(engEvalString(m_matlabEngine, cmd.c_str()) == 0 && getUi32FromEnv("OV_ERRNO") == 0, "Could not get Signal output header", + Kernel::ErrorType::BadProcessing); + + const size_t nbChannels = getUi32FromEnv("OV_NB_CHANNELS"); + const size_t nbSamples = getUi32FromEnv("OV_NB_SAMPLES_PER_BUFFER"); + std::vector nameList = getNamelist("OV_CHANNEL_NAMES"); + const size_t rate = getUi32FromEnv("OV_SAMPLING_RATE"); + + if (nameList.size() != nbChannels) { return false; } + + matrix->resize(nbChannels, nbSamples); + frequency = rate; + + for (size_t x = 0; x < nbChannels; ++x) { matrix->setDimensionLabel(0, x, escapeMatlabString(nameList[x].toASCIIString()).c_str()); } + + return true; +} + +bool CMatlabHelper::getChannelLocalisationOutputHeader(const size_t index, CMatrix* matrix, bool& /*dynamic*/) const +{ + const std::string cmd = std::string("[OV_ERRNO, OV_NB_CHANNELS, OV_CHANNEL_NAMES, OV_DYNAMIC] = OV_getChannelLocalisationOutputHeader(") + + m_boxInstanceVariableName.toASCIIString() + "," + std::to_string(index + 1) + ");"; + OV_ERROR_UNLESS_KRF(engEvalString(m_matlabEngine, cmd.c_str()) == 0 && getUi32FromEnv("OV_ERRNO") == 0, + "Could not get Channel Localisation output header", Kernel::ErrorType::BadProcessing); + + const size_t nChannel = getUi32FromEnv("OV_NB_CHANNELS"); + std::vector nameList = getNamelist("OV_CHANNEL_NAMES"); + mxArray* dynamic = engGetVariable(m_matlabEngine, "OV_DYNAMIC"); + if (!dynamic) + { + this->getLogManager() << Kernel::LogLevel_Error << "Nonexisting variable [OV_DYNAMIC]\n"; + return false; + } + + if (nameList.size() != nChannel) { return false; } + + matrix->resize(nChannel, 3); + + for (size_t x = 0; x < nChannel; ++x) { matrix->setDimensionLabel(0, x, escapeMatlabString(nameList[x].toASCIIString()).c_str()); } + + mxDestroyArray(dynamic); + + return true; +} + +bool CMatlabHelper::getSpectrumOutputHeader(const size_t index, CMatrix* matrix, CMatrix* frequencyAbscissa, uint64_t& frequency) const +{ + const std::string command = std::string( + "[OV_ERRNO, OV_NB_CHANNELS, OV_CHANNEL_NAMES, OV_NB_BANDS, OV_BANDS_NAME, OV_BANDS_LINEAR, OV_SAMPLING_RATE] = OV_getSpectrumOutputHeader(") + + m_boxInstanceVariableName.toASCIIString() + "," + std::to_string(index + 1) + ");"; + OV_ERROR_UNLESS_KRF(engEvalString(m_matlabEngine, command.c_str()) == 0 && getUi32FromEnv("OV_ERRNO") == 0, + "Could not get Spectrum output header", Kernel::ErrorType::BadProcessing); + + const size_t nChannel = getUi32FromEnv("OV_NB_CHANNELS"); + std::vector nameList = getNamelist("OV_CHANNEL_NAMES"); + const size_t nAbscissa = getUi32FromEnv("OV_NB_ABSCISSAS"); + std::vector freqAbscissaNames = getNamelist("OV_ABSCISSAS_NAME"); + mxArray* freqAbscissa = engGetVariable(m_matlabEngine, "OV_ABSCISSAS_LINEAR"); + if (!freqAbscissa) + { + this->getLogManager() << Kernel::LogLevel_Error << "Nonexisting variable [OV_ABSCISSAS_LINEAR]\n"; + return false; + } + + frequency = getUi64FromEnv("OV_SAMPLING_RATE"); + + //The Frequency abscissa list has dimensions nb_bands + frequencyAbscissa->resize(nAbscissa); + for (size_t x = 0; x < nAbscissa; ++x) { frequencyAbscissa->setDimensionLabel(0, x, escapeMatlabString(freqAbscissaNames[x].toASCIIString()).c_str()); } + + // Adding the bands: + memcpy(frequencyAbscissa->getBuffer(), ::mxGetPr(freqAbscissa), nAbscissa * sizeof(double)); + + matrix->resize(nChannel, nAbscissa); + for (size_t x = 0; x < nChannel; ++x) { matrix->setDimensionLabel(0, x, escapeMatlabString(nameList[x].toASCIIString()).c_str()); } + for (size_t x = 0; x < nAbscissa; ++x) { matrix->setDimensionLabel(1, x, escapeMatlabString(freqAbscissaNames[x].toASCIIString()).c_str()); } + // @FIXME CERT is it me or it never copy data to matrix ? + + mxDestroyArray(freqAbscissa); + + return true; +} + +bool CMatlabHelper::getStimulationsOutputHeader(size_t /*index*/, IStimulationSet* /*stimulationSet*/) +{ + // Nothing to do, the stimulation header is empty. + return true; +} + +//--------------------------------------------------------------------------------------------------------------- + +bool CMatlabHelper::popStreamedMatrixOutputBuffer(const size_t index, CMatrix* matrix, uint64_t& startTime, uint64_t& endTime) const +{ + const std::string buf = std::string("[") + m_boxInstanceVariableName.toASCIIString() + + ", OV_START_TIME, OV_END_TIME, OV_LINEAR_DATA_SIZE, OV_LINEAR_DATA] = OV_popOutputBufferReshape(" + + m_boxInstanceVariableName.toASCIIString() + ", " + std::to_string(index + 1) + ");"; + const size_t res = engEvalString(m_matlabEngine, buf.c_str()); + if (res != 0) { return false; } + + startTime = genUi64FromEnvConverted("OV_START_TIME"); + endTime = genUi64FromEnvConverted("OV_END_TIME"); + const uint64_t size = getUi64FromEnv("OV_LINEAR_DATA_SIZE"); + mxArray* data = engGetVariable(m_matlabEngine, "OV_LINEAR_DATA"); + if (!data) + { + this->getLogManager() << Kernel::LogLevel_Error << "Nonexisting variable [OV_LINEAR_DATA]\n"; + return false; + } + + // ti be copied direclty in openvibe buffer, the linear matrix must be ordered line by line + memcpy(matrix->getBuffer(), ::mxGetPr(data), size * sizeof(double)); + mxDestroyArray(data); + + return true; +} + +bool CMatlabHelper::popStimulationsOutputBuffer(const size_t index, IStimulationSet* stimSet, uint64_t& startTime, uint64_t& endTime) const +{ + const std::string buf = std::string("[") + m_boxInstanceVariableName.toASCIIString() + + ", OV_START_TIME, OV_END_TIME, OV_LINEAR_MATRIX_SIZE, OV_LINEAR_DATA] = OV_popOutputBuffer(" + + m_boxInstanceVariableName.toASCIIString() + ", " + std::to_string(index + 1) + ");"; + const size_t res = engEvalString(m_matlabEngine, buf.c_str()); + if (res != 0) { return false; } + startTime = genUi64FromEnvConverted("OV_START_TIME"); + endTime = genUi64FromEnvConverted("OV_END_TIME"); + const size_t size = getUi32FromEnv("OV_LINEAR_MATRIX_SIZE"); + mxArray* data = engGetVariable(m_matlabEngine, "OV_LINEAR_DATA"); + if (!data) + { + this->getLogManager() << Kernel::LogLevel_Error << "Nonexisting variable [OV_LINEAR_DATA]\n"; + return false; + } + + for (size_t i = 0; i < size; i += 3) + { + const uint64_t id = castFromMArray(data, i + 0); + const uint64_t date = convertFromMArray(data, i + 1); + const uint64_t duration = convertFromMArray(data, i + 2); + stimSet->appendStimulation(id, date, duration); + } + + mxDestroyArray(data); + + return true; +} +//-------------------------------------------------------------------------------------------------------------- + +} // namespace Matlab +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyMatlab diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/ovpCMatlabHelper.h b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/ovpCMatlabHelper.h new file mode 100755 index 0000000..e3df961 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/ovpCMatlabHelper.h @@ -0,0 +1,74 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyMatlab + +#include "ovp_defines.h" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Matlab { +class CMatlabHelper +{ +public: + CMatlabHelper(Kernel::ILogManager& /*logManager*/, Kernel::IErrorManager& /*errorManager*/) { } + + bool setManagers(Kernel::ILogManager* logManager, Kernel::IErrorManager* errorManager) + { + m_logManager = logManager; + m_errorManager = errorManager; + return true; + } + + bool setStreamedMatrixInputHeader(size_t index, CMatrix* matrix) const; + bool setFeatureVectorInputHeader(size_t index, CMatrix* matrix) const; + bool setSignalInputHeader(size_t index, CMatrix* matrix, uint64_t frequency) const; + bool setChannelLocalisationInputHeader(size_t index, CMatrix* matrix, bool dynamic) const; + bool setSpectrumInputHeader(size_t index, CMatrix* matrix, CMatrix* frequencyAbscissa, uint64_t frequency) const; + bool setStimulationsInputHeader(size_t index) const; + + // The input buffers for streamed matrix and its children streams are the same. + bool addStreamedMatrixInputBuffer(size_t index, CMatrix* matrix, uint64_t startTime, uint64_t endTime) const; + bool addStimulationsInputBuffer(size_t index, IStimulationSet* stimSet, uint64_t startTime, uint64_t endTime) const; + + bool getStreamedMatrixOutputHeader(size_t index, CMatrix* matrix) const; + bool getFeatureVectorOutputHeader(size_t index, CMatrix* matrix) const; + bool getSignalOutputHeader(size_t index, CMatrix* matrix, uint64_t& frequency) const; + bool getChannelLocalisationOutputHeader(size_t index, CMatrix* matrix, bool& dynamic) const; + bool getSpectrumOutputHeader(size_t index, CMatrix* matrix, CMatrix* frequencyAbscissa, uint64_t& frequency) const; + static bool getStimulationsOutputHeader(size_t index, IStimulationSet* stimSet); + + // The output buffers for streamed matrix and its children streams are the same. + bool popStreamedMatrixOutputBuffer(size_t index, CMatrix* matrix, uint64_t& startTime, uint64_t& endTime) const; + bool popStimulationsOutputBuffer(size_t index, IStimulationSet* stimSet, uint64_t& startTime, uint64_t& endTime) const; + + void setMatlabEngine(Engine* engine) { m_matlabEngine = engine; } + void setBoxInstanceVariableName(const CString& name) { m_boxInstanceVariableName = name; } + + + uint32_t getUi32FromEnv(const char* name) const; + uint64_t getUi64FromEnv(const char* name) const; + uint64_t genUi64FromEnvConverted(const char* name) const; + std::vector getNamelist(const char* name) const; + + + Kernel::ILogManager& getLogManager() const { return *m_logManager; } + Kernel::IErrorManager& getErrorManager() const { return *m_errorManager; } + +private: + Engine* m_matlabEngine = nullptr; + + // Need to be very careful that these pointers are still valid when the Helper will try to use them + Kernel::ILogManager* m_logManager = nullptr; + Kernel::IErrorManager* m_errorManager = nullptr; + + CString m_boxInstanceVariableName; //must be unique +}; +} // namespace Matlab +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyMatlab diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/ovp_defines.h new file mode 100755 index 0000000..76e0518 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/ovp_defines.h @@ -0,0 +1,14 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_MatlabScripting OpenViBE::CIdentifier(0x03303E0E, 0x39FE10DF) +#define OVP_ClassId_BoxAlgorithm_MatlabScriptingDesc OpenViBE::CIdentifier(0x46130E2F, 0x34F90BA1) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/ovp_main.cpp new file mode 100755 index 0000000..59f9d01 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/matlab/src/ovp_main.cpp @@ -0,0 +1,26 @@ +#include + +#include "ovp_defines.h" + +#include "box-algorithms/ovpCBoxAlgorithmMatlabScripting.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Matlab { + +OVP_Declare_Begin() +#if defined TARGET_HAS_ThirdPartyMatlab + + OVP_Declare_New(CBoxAlgorithmMatlabScriptingDesc); + context.getTypeManager().registerEnumerationEntry(OV_TypeId_BoxAlgorithmFlag, OV_AttributeId_Box_FlagIsUnstable.toString(), + OV_AttributeId_Box_FlagIsUnstable.id()); + +#endif // TARGET_HAS_ThirdPartyMatlab + +OVP_Declare_End() + +} // namespace Matlab +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/CMakeLists.txt new file mode 100644 index 0000000..e1689ac --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/CMakeLists.txt @@ -0,0 +1,61 @@ +PROJECT(openvibe-plugins-network-io) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} + openvibe-module-labstreamlayer) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# --------------------------------- + + + + +# --------------------------------- +IF(WIN32) + ADD_DEFINITIONS(-D_WIN32_WINNT=0x0501) # for boost::asio +ENDIF(WIN32) + + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyBoost_System") +INCLUDE("FindThirdPartyLSL") + +#so that boost won't need to link against DateTime when using the interprocess communication library +#shared memory writer box +ADD_DEFINITIONS(-DBOOST_DATE_TIME_NO_LIB) + +# --------------------------------- +# Finds standard library winmm +# Adds library to target +# Adds include path +# --------------------------------- +IF(WIN32) + FIND_LIBRARY(LIB_STANDARD_MODULE_WINMM winmm) + IF(LIB_STANDARD_MODULE_WINMM) + MESSAGE(STATUS " Found winmm...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_WINMM}) + ELSE(LIB_STANDARD_MODULE_WINMM) + MESSAGE(STATUS " FAILED to find winmm...") + ENDIF(LIB_STANDARD_MODULE_WINMM) +ENDIF(WIN32) + + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/doc/Doc_BoxAlgorithm_LSLExport.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/doc/Doc_BoxAlgorithm_LSLExport.dox-part new file mode 100644 index 0000000..d077b76 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/doc/Doc_BoxAlgorithm_LSLExport.dox-part @@ -0,0 +1,72 @@ +/** + * \page BoxAlgorithm_LSLExport LSL Export +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_LSLExport_Description| +This box forwards the signals and stimulations it gets to two corresponding LabStreamingLayer (LSL) streams. + +The user can configure the names of the LSL streams. Each stream will get a randomized source ID (in 64bit hex). + +The stimulations and signals output by the box are timestamped with LSL clock by default. If you would like them to be +timestamped with local OpenViBE time, you can add the following line to the configuration file "openvibe.conf": + +\b LSL_UseOVTimestamps \b = \b True + + * |OVP_DocEnd_BoxAlgorithm_LSLExport_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_LSLExport_Inputs| + * |OVP_DocEnd_BoxAlgorithm_LSLExport_Inputs| + * + * |OVP_DocBegin_BoxAlgorithm_LSLExport_Input1| +The signal input stream. + * |OVP_DocEnd_BoxAlgorithm_LSLExport_Input1| + + * |OVP_DocBegin_BoxAlgorithm_LSLExport_Input1| +The stimulation input stream. + * |OVP_DocEnd_BoxAlgorithm_LSLExport_Input1| + +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_LSLExport_Settings| + * |OVP_DocEnd_BoxAlgorithm_LSLExport_Settings| + * + * |OVP_DocBegin_BoxAlgorithm_LSLExport_Setting1| +Name of the signal stream. Default is 'openvibeSignal'. + * |OVP_DocEnd_BoxAlgorithm_LSLExport_Setting1| + * + * |OVP_DocBegin_BoxAlgorithm_LSLExport_Setting2| +Name of the stimulation stream. Default is 'openvibeMarkers'. + * |OVP_DocEnd_BoxAlgorithm_LSLExport_Setting2| + +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_LSLExport_Examples| +Easiest way to test the box is to use the Acquisition Server (AS) LabStreamingLayer (LSL) driver to read from the box. First, send signal to the box. Then connect to it using AS. Start AS playback. In another Designer tab, use the Network Acquisition box to read the data back from the Acquisition Server. + * |OVP_DocEnd_BoxAlgorithm_LSLExport_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_LSLExport_Miscellaneous| +The box creates each LSL stream at the beginning of the playback, after it has received its corresponding OpenViBE stream header information. Hence, if either signal or stimulus socket +of the box is not connected or does not receive a header, the box will not create the corresponding LSL stream. + +Stream formats: The signal stream is continuous float. The marker stream is noncontinuous int, and each 64bit OpenViBE stimulation is truncated to an int marker. + +This box should be compatible with the conventions used by OpenViBE Acquisition Server LabStreamingLayer (LSL) Driver, as well as its' LSL Output plugin. + * |OVP_DocEnd_BoxAlgorithm_LSLExport_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/doc/Doc_BoxAlgorithm_SharedMemoryWriter.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/doc/Doc_BoxAlgorithm_SharedMemoryWriter.dox-part new file mode 100644 index 0000000..7d8f1c6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/doc/Doc_BoxAlgorithm_SharedMemoryWriter.dox-part @@ -0,0 +1,51 @@ +/** + * \page BoxAlgorithm_SharedMemoryWriter Shared Memory Writer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SharedMemoryWriter_Description| +The box creates (via boost interprocess library) a shared memory and within it uniquely named variables for each input. +When receiving chunks on its inputs, the box will write them to shared memory so that they can be read by another process. The box can write stimuli and streamed matrices, which are transformed in a format that can be written into shared memory. Based on the input types, a metainfo variable will be created in shared memory that will specify which variables have which type in shared memory. This way the client knows what it will be reading. + + * |OVP_DocEnd_BoxAlgorithm_SharedMemoryWriter_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SharedMemoryWriter_Inputs| +The supported input stream types are StreamedMatrix and Stimulations. The stream type of the input can be changed by the user and additional inputs can be added. + * |OVP_DocEnd_BoxAlgorithm_SharedMemoryWriter_Inputs| + * + * |OVP_DocBegin_BoxAlgorithm_SharedMemoryWriter_Input1| +Default streamed matrix input. + * |OVP_DocEnd_BoxAlgorithm_SharedMemoryWriter_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SharedMemoryWriter_Settings| + * |OVP_DocEnd_BoxAlgorithm_SharedMemoryWriter_Settings| + * + * |OVP_DocBegin_BoxAlgorithm_SharedMemoryWriter_Setting1| +Name of the shared memory to be created. Default to 'SharedMemory_P300Stimulator' + * |OVP_DocEnd_BoxAlgorithm_SharedMemoryWriter_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SharedMemoryWriter_Examples| + * |OVP_DocEnd_BoxAlgorithm_SharedMemoryWriter_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SharedMemoryWriter_Miscellaneous| + You can use the test_sharedmemory application to test the shared memory. + * |OVP_DocEnd_BoxAlgorithm_SharedMemoryWriter_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/doc/Doc_BoxAlgorithm_TCPWriter.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/doc/Doc_BoxAlgorithm_TCPWriter.dox-part new file mode 100644 index 0000000..cd712e3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/doc/Doc_BoxAlgorithm_TCPWriter.dox-part @@ -0,0 +1,127 @@ +/** + * \page BoxAlgorithm_TCPWriter TCP Writer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TCPWriter_Description| +This box works as a TCP server that writes its input stream out to a TCP socket with minimal header information and encoding. + +The main motivation for this box is to allow external applications to receive information in a simple manner from OpenViBE without +requiring unusual dependencies such as VRPN. + +Output: + +1) If the outputs of the box are raw numeric values, the box first sends every connecting client eight variables of uint32_t: format version number (in network byte order), endianness of the stream (in network byte order, 0==unknown, 1==little, 2==big, 3==pdp), sampling frequency of the signal, the number of channels, the number of samples per chunk and three variables of padding, 8*4=32 bytes in total. The last 6 variables are in the byte order of the stream. Note that only those variables will be non-zero that are meaningful for the input in question. + +Header layout as a table, + +\verbatim +| Name | Type | Bytes from start | +| ------------------- | ------------- | ---------------- | +| Format version | uint32_t | 0 | +| Endianness | uint32_t | 4 | +| Sampling frequency | uint32_t | 8 | +| Number of channels | uint32_t | 12 | +| Samples per chunk | uint32_t | 16 | +| Reserved0 | uint32_t | 20 | +| Reserved1 | uint32_t | 24 | +| Reserved2 | uint32_t | 28 | +\endverbatim + +1b) If the output is chosen as hex string or descriptive string (these are valid for Stimulation input only), no header is sent. + +2) After the possible global header, the data itself is sent. The data is a stream of double chunks for Signal and StreamedMatrix. +Each chunk is a matrix [nChannels x nSamples], sent in row-major order, i.e. all samples for one channel are sent in a sequence (a row), +then all samples of the next channel (next row), and so on. This is the same order that OpenViBE uses internally for signal chunks. + +Signal/matrix data layout as a table (k = nSamples, n = nChannels), + +\verbatim +| Name | Type | Bytes from start | +| -------------------- | ------------- | ------------------ | +| Channel 1, sample 1 | double | 32 + (k*0+0)*8 | +| Channel 1, sample 2 | double | 32 + (k*0+1)*8 | +| ... | ... | ... | +| Channel 1, sample k | double | 32 + (k*0+(k-1))*8 | +| Channel 2, sample 1 | double | 32 + (k*1+0)*8 | +| Channel 2, sample 2 | double | 32 + (k*1+1)*8 | +| ... | ... | ... | +| Channel 1, sample k+1 | double | 32 + (k*n+0)*8 | +| ... | ... | .... | +\endverbatim + +For Stimulations, the data is a sequence of uint64_t if the user chooses raw output, or char strings otherwise. + +Multiple clients can connect to the socket of the box. The box keeps sending data to +each client until either the scenario is stopped or that client disconnects. When +kernel calls box::process() at time t, all clients connected before or at t, +get forwarded the chunks that are pending in box::process() at time t. Note that +the information how long time has elapsed between the acquisition or scenario startup +and the client connection is not currently relayed by TCP Writer. + * |OVP_DocEnd_BoxAlgorithm_TCPWriter_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TCPWriter_Inputs| + * |OVP_DocEnd_BoxAlgorithm_TCPWriter_Inputs| + * + * |OVP_DocBegin_BoxAlgorithm_TCPWriter_Input1| +The supported input stream types are StreamedMatrix, Signal and Stimulations. The stream type of the input can be changed by the user. + * |OVP_DocEnd_BoxAlgorithm_TCPWriter_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TCPWriter_Settings| + * |OVP_DocEnd_BoxAlgorithm_TCPWriter_Settings| + * + * |OVP_DocBegin_BoxAlgorithm_TCPWriter_Setting1| + Port denotes the TCP port that will accept the client connections. Default is 5678. + * |OVP_DocEnd_BoxAlgorithm_TCPWriter_Setting1| + * + * |OVP_DocBegin_BoxAlgorithm_TCPWriter_Setting2| + If the input is Stimulations, this setting can change the format the stimulations are sent in to the TCP socket. The choices are raw uint64_t, hex string, or a descriptive string. For other inputs, this setting is ignored. + * |OVP_DocEnd_BoxAlgorithm_TCPWriter_Setting2| + * +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TCPWriter_Examples| + There is an example application 'openvibe-examples-openvibe-to-tcpip' that can be used to receive data from this box. + The application is intended to be used together with the 'tcp-writer.xml' box tutorial. + + Another way to test the box is to connect to the socket of the box with a 'telnet' application and redirect the telnet output to a file. + + It is also possible to use Acquisition Server's Generic Raw Telnet Reader to read data from the box. In that case, set Start Skip to 32 and header and footer skips to 0, and data format to double. Remember to also set the number of channels and the sampling frequency correctly. This information is not read from the stream by the Generic Raw Telnet Reader. + * |OVP_DocEnd_BoxAlgorithm_TCPWriter_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TCPWriter_Miscellaneous| + The box performs no little-endian/big-endian conversions. The data is sent raw in the native format of the host system. The host endianness is encoded into the sent header. + + The box sends signal data as chunks with the same chunk size as the stream has. + + The box supports only 2 dimensional matrices. To send 1 dimensional matrix, you can try to upgrade it to 2 dimensions with Matrix Transpose box. The box cannot be used to send more than 2 dimensions presently. + + The box writes to all the sockets synchronously in the process() call and drops no data. If the connection is too slow to accommodate the data flow, the box will lag. + + Detected transmission errors will cause a disconnection of the client. + + Streamed Matrix can be recognized from the TCPWriter header by the sampling rate 0. If the stream is a signal, +the sampling rate is a positive number. Raw stimulation streams have channel and sample counts per buffer 0 as well. + + Known issues: Note that it can be difficult to time-synchronize signals and stimulations exactly on the client side when the client receives data from + two TCP Writer boxes. Maintaining such synchronization was not a design goal of this box. If you need synchronized streams, it is advised to build + the connection with LabStreamingLayer: Use LSL Export box and include LSL support in the client. + * |OVP_DocEnd_BoxAlgorithm_TCPWriter_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmLSLExport.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmLSLExport.cpp new file mode 100644 index 0000000..1e17fe0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmLSLExport.cpp @@ -0,0 +1,241 @@ +#ifdef TARGET_HAS_ThirdPartyLSL + +/* + * Notes: This code should be kept compatible with changes to LSL Input Driver and Output Plugin in OpenViBE Acquisition Server. + * + */ +#include "ovpCBoxAlgorithmLSLExport.h" + +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace NetworkIO { + +bool CBoxAlgorithmLSLExport::initialize() +{ + m_signalOutlet = nullptr; + m_stimulusOutlet = nullptr; + + m_signalDecoder.initialize(*this, 0); + m_stimDecoder.initialize(*this, 1); + + m_signalName = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_markerName = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + // These are supposed to be unique, so we don't have them in the box config + m_signalID = CIdentifier::random().toString(); + m_markerID = CIdentifier::random().toString(); + + while (m_markerID == m_signalID) { m_markerID = CIdentifier::random().toString(); } // very unlikely + + this->getLogManager() << Kernel::LogLevel_Trace << "Will create streams [" << m_signalName << ", id " << m_signalID + << "] and [" << m_markerName << ", id " << m_markerID << "]\n"; + + m_useOVTimestamps = this->getConfigurationManager().expandAsBoolean("${LSL_UseOVTimestamps}", m_useOVTimestamps); + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmLSLExport::uninitialize() +{ + m_signalDecoder.uninitialize(); + m_stimDecoder.uninitialize(); + + if (m_signalOutlet) + { + delete m_signalOutlet; + m_signalOutlet = nullptr; + } + if (m_stimulusOutlet) + { + delete m_stimulusOutlet; + m_stimulusOutlet = nullptr; + } + + m_buffer.clear(); + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmLSLExport::processInput(const size_t /*index*/) +{ + // ready to process ! + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmLSLExport::process() +{ + // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + // Process signals + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + if (m_startTime == CTime(0)) + { + // This should be the ov time when acquisition client tagged the first chunk with [0, t], t=bufferSize/samplingRate. + // As the true run time is not know here, we have to do with a slightly delayed estimate. (The delay is the duration + // it took from stamping the first chunk to this point in the code) + m_startTime = System::Time::zgetTime(); + } + + m_signalDecoder.decode(i); + if (m_signalDecoder.isHeaderReceived() && !m_signalOutlet) + { + const size_t nChannel = m_signalDecoder.getOutputMatrix()->getDimensionSize(0); + const size_t samplesPerBlock = m_signalDecoder.getOutputMatrix()->getDimensionSize(1); + const size_t frequency = m_signalDecoder.getOutputSamplingRate(); + + m_buffer.resize(nChannel); + + // Open a signal stream + lsl::stream_info signalInfo(m_signalName.toASCIIString(), "signal", int(nChannel), int(frequency), lsl::cf_float32, m_signalID.toASCIIString()); + + lsl::xml_element channels = signalInfo.desc().append_child("channels"); + //m_signalDecoder.getOutputMatrix()->getDimensionLabel(0, 1); + + for (size_t c = 0; c < nChannel; ++c) + { + const char* name = m_signalDecoder.getOutputMatrix()->getDimensionLabel(0, c); + channels.append_child("channel").append_child_value("label", name).append_child_value("unit", "unknown").append_child_value("type", "signal"); + } + +#ifdef DEBUG + lsl::xml_element debug = signalInfo.desc().child("channels"); + if(debug.child("channel").child_value("label")) { std::cout << "channel label " << debug.child("channel").child_value("label") << "\n"; } +#endif + + // make a new outlet + try { m_signalOutlet = new lsl::stream_outlet(signalInfo, samplesPerBlock); } + catch (...) + { + this->getLogManager() << "Unable to create signal outlet\n"; + return false; + } + } + if (m_signalDecoder.isBufferReceived() && m_signalOutlet) + { + if (m_signalOutlet->have_consumers()) + { + const CMatrix* matrix = m_signalDecoder.getOutputMatrix(); + const size_t nChannel = matrix->getDimensionSize(0); + const size_t samplesPerBlock = matrix->getDimensionSize(1); + const double* iBuffer = matrix->getBuffer(); + + const CTime chunkStartTime(boxContext.getInputChunkStartTime(0, i)); + const CTime chunkEndTime(boxContext.getInputChunkEndTime(0, i)); + + if (samplesPerBlock == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Unable to process signal with 0 samples per buffer \n"; + return false; + } + // note: the step computed below should be exactly the same as could be obtained from the sampling rate + + // n.b. this would work more "lsl-like" if the timestamps were the real acquisition timestamps + if (m_useOVTimestamps) + { + const double sampleStepInSec = + (chunkEndTime - chunkStartTime).toSeconds() / static_cast(samplesPerBlock); + const double chunkStartInSec = chunkStartTime.toSeconds(); + + for (size_t sample = 0; sample < samplesPerBlock; ++sample) + { + for (size_t channel = 0; channel < nChannel; ++channel) + { + m_buffer[channel] = static_cast(iBuffer[channel * samplesPerBlock + sample]); + } + m_signalOutlet->push_sample(m_buffer, chunkStartInSec + sampleStepInSec * static_cast(sample)); + } + } + else + { + const uint64_t sampleStep = (chunkEndTime - chunkStartTime).time() / uint64_t(samplesPerBlock); + for (size_t sample = 0; sample < samplesPerBlock; ++sample) + { + for (size_t channel = 0; channel < nChannel; ++channel) + { + m_buffer[channel] = static_cast(iBuffer[channel * samplesPerBlock + sample]); + } + const double lslTime = OpenViBE::LabStreamLayer::getLSLRelativeTime(m_startTime + chunkStartTime + CTime(sample * sampleStep)); + m_signalOutlet->push_sample(m_buffer, lslTime); + } + } + } + } + if (m_signalDecoder.isEndReceived()) + { + if (m_signalOutlet) + { + delete m_signalOutlet; + m_signalOutlet = nullptr; + } + } + } + + // Process stimuli -> LSL markers. + // Note that stimuli with identifiers not fitting to int will be mangled by a static cast. + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + if (m_startTime == CTime(0)) + { + // Initialisation done here too as the box may only receive stimulations + m_startTime = System::Time::zgetTime(); + } + + m_stimDecoder.decode(i); + if (m_stimDecoder.isHeaderReceived() && !m_stimulusOutlet) + { + // Open a stimulus stream + lsl::stream_info info(m_markerName.toASCIIString(), "Markers", 1, lsl::IRREGULAR_RATE, lsl::cf_int32, m_markerID.toASCIIString()); + + info.desc().append_child("channels").append_child("channel").append_child_value("label", "Stimulations").append_child_value("type", "marker"); + + try { m_stimulusOutlet = new lsl::stream_outlet(info); } + catch (...) + { + this->getLogManager() << "Unable to create marker outlet\n"; + return false; + } + } + if (m_stimDecoder.isBufferReceived() && m_stimulusOutlet) + { + // Output stimuli + if (m_stimulusOutlet->have_consumers()) + { + const IStimulationSet* stimSet = m_stimDecoder.getOutputStimulationSet(); + + for (size_t s = 0; s < stimSet->getStimulationCount(); ++s) + { + const int code = int(stimSet->getStimulationIdentifier(s)); + const double date = m_useOVTimestamps ? CTime(stimSet->getStimulationDate(s)).toSeconds() + : OpenViBE::LabStreamLayer::getLSLRelativeTime(m_startTime + CTime(stimSet->getStimulationDate(s))); + + m_stimulusOutlet->push_sample(&code, date); + } + } + } + if (m_stimDecoder.isEndReceived()) + { + if (m_stimulusOutlet) + { + delete m_stimulusOutlet; + m_stimulusOutlet = nullptr; + } + } + } + return true; +} + +#endif +} // namespace NetworkIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmLSLExport.h b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmLSLExport.h new file mode 100644 index 0000000..881c848 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmLSLExport.h @@ -0,0 +1,111 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyLSL + +#include "../ovp_defines.h" +#include +#include + +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace NetworkIO { +/** + * \class CBoxAlgorithmLSLExport + * \author Jussi T. Lindgren (Inria) + * \date Fri Jan 30 09:55:22 2015 + * \brief The class CBoxAlgorithmLSLExport describes the box LSL Export. + * + */ +class CBoxAlgorithmLSLExport final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_LSLExport) + +protected: + + // Decoders + Toolkit::TStimulationDecoder m_stimDecoder; + Toolkit::TSignalDecoder m_signalDecoder; + + lsl::stream_outlet* m_signalOutlet = nullptr; + lsl::stream_outlet* m_stimulusOutlet = nullptr; + + std::vector m_buffer; + + CString m_signalName; + CString m_signalID; + CString m_markerName; + CString m_markerID; + + bool m_useOVTimestamps = false; + CTime m_startTime = CTime(0); +}; + +class CBoxAlgorithmLSLExportListener final : public Toolkit::TBoxListener +{ +public: + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +/** + * \class CBoxAlgorithmLSLExportDesc + * \author Jussi T. Lindgren (Inria) + * \date Fri Jan 30 09:55:22 2015 + * \brief Descriptor of the box LSL Export. + * + */ +class CBoxAlgorithmLSLExportDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("LSL Export"); } + CString getAuthorName() const override { return CString("Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Send input stream out via LabStreamingLayer (LSL)"); } + CString getDetailedDescription() const override { return CString("\n"); } + CString getCategory() const override { return CString("Acquisition and network IO"); } + CString getVersion() const override { return CString("0.1"); } + CString getStockItemName() const override { return CString("gtk-connect"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_LSLExport; } + IPluginObject* create() override { return new CBoxAlgorithmLSLExport; } + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmLSLExportListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addInput("Input stimulations", OV_TypeId_Stimulations); + + prototype.addSetting("Signal stream", OV_TypeId_String, "openvibeSignal"); + prototype.addSetting("Marker stream", OV_TypeId_String, "openvibeMarkers"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_LSLExportDesc) +}; +} // namespace NetworkIO +} // namespace Plugins +} // namespace OpenViBE + + +#endif // TARGET_HAS_Boost diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmSharedMemoryWriter.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmSharedMemoryWriter.cpp new file mode 100644 index 0000000..c11b6f1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmSharedMemoryWriter.cpp @@ -0,0 +1,214 @@ +#include "ovpCBoxAlgorithmSharedMemoryWriter.h" + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileReadingAndWriting { + +//struct timeval currentLTime; + +#define time2ms(x, y) ((x) * 1000 + (y) / 1000.0) + 0.5 + +bool CBoxAlgorithmSharedMemoryWriter::initialize() +{ + //remove and create shared memory + m_sharedMemoryName = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); // can be local variable + boost::interprocess::shared_memory_object::remove(m_sharedMemoryName.toASCIIString()); + m_sharedMemoryArray = boost::interprocess::managed_shared_memory(boost::interprocess::create_only, m_sharedMemoryName.toASCIIString(), 655360); + + //remove and create mutex + m_mutexName = m_sharedMemoryName + CString("_Mutex"); + boost::interprocess::named_mutex::remove(m_mutexName.toASCIIString()); + m_mutex = new boost::interprocess::named_mutex(boost::interprocess::open_or_create, m_mutexName.toASCIIString()); + + //create shared vector for meta info (type and name) + const ShmemAllocatorMetaInfo metaInfo(m_sharedMemoryArray.get_segment_manager()); + MyVectorMetaInfo* metaInfoVector = m_sharedMemoryArray.construct("MetaInfo")(std::less(), metaInfo); + const StringAllocator instString(m_sharedMemoryArray.get_segment_manager()); + + //fill meta info vector and create shared vector variable for the appropriate types + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + for (size_t i = 0; i < boxContext.getInputCount(); ++i) + { + CIdentifier typeID; + std::ostringstream convert; // stream used for the conversion + convert << i; + + boxContext.getInputType(i, typeID); + if (typeID == OVTK_TypeId_StreamedMatrix) + { + m_decoders.push_back(new Toolkit::TStreamedMatrixDecoder()); + ShmString name("Matrix", instString); + name += ShmString(convert.str().c_str(), instString); + metaInfoVector->insert(std::make_pair(name, typeID)); + + const ShmemAllocatorMatrix inst(m_sharedMemoryArray.get_segment_manager()); + m_streamedMatrices.push_back(m_sharedMemoryArray.construct(name.c_str())(inst)); + + this->getLogManager() << Kernel::LogLevel_Info << "Constructed variable in shared memory of type matrix with name " << name.c_str() << "\n"; + } + else if (typeID == OVTK_TypeId_Stimulations) + { + m_decoders.push_back(new Toolkit::TStimulationDecoder()); + ShmString name("Stimuli", instString); + name += ShmString(convert.str().c_str(), instString); + metaInfoVector->insert(std::make_pair(name, typeID)); + + const ShmemAllocatorStimulation inst(m_sharedMemoryArray.get_segment_manager()); + m_stimSets.push_back(m_sharedMemoryArray.construct(name.c_str())(inst)); + + this->getLogManager() << Kernel::LogLevel_Info << "Constructed variable in shared memory of type stimulation with name " << name.c_str() << "\n"; + } + else { this->getLogManager() << Kernel::LogLevel_Warning << "Input type " << typeID << " is not supported\n"; } + m_decoders.back()->initialize(*this, i); + } + + //m_inputCounter = 0; + + return true; +} + +bool CBoxAlgorithmSharedMemoryWriter::uninitialize() +{ + m_sharedMemoryArray.destroy("MetaInfo"); + + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + for (int i = int(boxContext.getInputCount() - 1); i >= 0; i--) + { + CIdentifier typeID; + boxContext.getInputType(i, typeID); + const std::string idxStr = std::to_string(i); + + if (typeID == OVTK_TypeId_StreamedMatrix) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Uninitialize shared memory variable associated with input " << i << "\n"; + for (size_t j = 0; j < m_streamedMatrices.back()->size(); ++j) + { + m_sharedMemoryArray.deallocate(m_streamedMatrices.back()->at(j)->data.get()); + m_sharedMemoryArray.deallocate(m_streamedMatrices.back()->at(j).get()); + } + this->getLogManager() << Kernel::LogLevel_Debug << "Deallocated shared memory for variable with name Matrix " << idxStr << "\n"; + m_streamedMatrices.back()->clear(); + m_sharedMemoryArray.destroy(("Matrix " + idxStr).c_str()); + + //TODO: pop_back()? + } + else if (typeID == OVTK_TypeId_Stimulations) + { + m_stimSets.back()->clear(); + m_sharedMemoryArray.destroy(("Stimuli" + idxStr).c_str()); + } + } + this->getLogManager() << Kernel::LogLevel_Debug << "Destroyed all shared variables associated with input" << "\n"; + boost::interprocess::shared_memory_object::remove(m_sharedMemoryName.toASCIIString()); + boost::interprocess::named_mutex::remove(m_mutexName.toASCIIString()); + delete m_mutex; + for (size_t i = 0; i < boxContext.getInputCount(); ++i) + { + m_decoders[i]->uninitialize(); + delete m_decoders[i]; + } + + + return true; +} + +bool CBoxAlgorithmSharedMemoryWriter::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmSharedMemoryWriter::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const Kernel::IBox& staticBoxContext = this->getStaticBoxContext(); + + size_t iStimulusCounter = 0; + size_t iMatrixCounter = 0; + + for (size_t i = 0; i < staticBoxContext.getInputCount(); ++i) + { + CIdentifier typeID; + staticBoxContext.getInputType(i, typeID); + if (typeID == OVTK_TypeId_Stimulations) + { + for (size_t j = 0; j < boxContext.getInputChunkCount(i); ++j) + { + //m_oAlgo0_StimulationDecoder.decode(j,i, false); + m_decoders[i]->decode(j, false); + //CStimulationSet stimSet; + IStimulationSet* stimSet = dynamic_cast*>(m_decoders[i])-> + getOutputStimulationSet(); + //Toolkit::StimulationSet::copy(l_oStimSet, *m_oAlgo0_StimulationDecoder.getOutputStimulationSet()); + if (m_decoders[i]->isHeaderReceived()) { boxContext.markInputAsDeprecated(i, j); } + if (m_decoders[i]->isBufferReceived()) + { + if (stimSet->getStimulationCount() > 0) + { + boost::interprocess::scoped_lock lock(*m_mutex, boost::interprocess::try_to_lock); + if (lock) + { + for (size_t k = 0; k < stimSet->getStimulationCount(); ++k) + { + // @fixme m_stimSets defined as 32bit will only work correctly with stimuli that fit in 32bits (OV stimulations can be 64bit) + m_stimSets[iStimulusCounter]->push_back(size_t(stimSet->getStimulationIdentifier(k))); + this->getLogManager() << Kernel::LogLevel_Info << "Added stimulus with id " << m_stimSets[iStimulusCounter]->back() << + " to shared memory variable\n"; + } + boxContext.markInputAsDeprecated(i, j); + } + else { this->getLogManager() << Kernel::LogLevel_Warning << "Shared memory writer could not lock mutex\n"; } + } + else { boxContext.markInputAsDeprecated(i, j); } + } + if (m_decoders[i]->isEndReceived()) { boxContext.markInputAsDeprecated(i, j); } + } + iStimulusCounter++; + } + else if (typeID == OVTK_TypeId_StreamedMatrix) + { + for (size_t j = 0; j < boxContext.getInputChunkCount(i); ++j) + { + m_decoders[i]->decode(j, false); + CMatrix* matrix = dynamic_cast*>(m_decoders[i])->getOutputMatrix(); + if (m_decoders[i]->isHeaderReceived()) { boxContext.markInputAsDeprecated(i, j); } + if (m_decoders[i]->isBufferReceived()) + { + boost::interprocess::scoped_lock lock(*m_mutex, boost::interprocess::try_to_lock); + if (lock) + { + boost::interprocess::offset_ptr shmMatrix = static_cast(m_sharedMemoryArray.allocate(sizeof(SMatrix))); + + //if we receive a vector (second dimension to 0) we force to one otherwise no memory will be allocated + const size_t row = (matrix->getDimensionSize(1) == 0) ? 1 : matrix->getDimensionSize(1); + + shmMatrix->rowDim = row; + shmMatrix->colDim = matrix->getDimensionSize(0); + + this->getLogManager() << Kernel::LogLevel_Trace << "dimensions " << matrix->getDimensionCount() << "row " << matrix->getDimensionSize(1) + << " by " << " columns " << matrix->getDimensionSize(0) << "\n"; + + shmMatrix->data = static_cast(m_sharedMemoryArray.allocate(matrix->getDimensionSize(0) * row * sizeof(double))); + for (size_t k = 0; k < matrix->getBufferElementCount(); ++k) { *(shmMatrix->data + k) = *(matrix->getBuffer() + k); } + + m_streamedMatrices[iMatrixCounter]->push_back(shmMatrix); + + boxContext.markInputAsDeprecated(i, j); + } + } + if (m_decoders[i]->isEndReceived()) { boxContext.markInputAsDeprecated(i, j); } + } + iMatrixCounter++; + } + } + + return true; +} + +} // namespace FileReadingAndWriting +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmSharedMemoryWriter.h b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmSharedMemoryWriter.h new file mode 100644 index 0000000..bdd87a7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmSharedMemoryWriter.h @@ -0,0 +1,159 @@ +#pragma once + +//You may have to change this path to match your folder organisation +#include "../ovp_defines.h" + +#include +#include + +//#include +#include +#include +#include +#include +#include +#include +#include + +// The unique identifiers for the box and its descriptor. +// Identifier are randomly chosen by the skeleton-generator. + +namespace OpenViBE { +namespace Plugins { +namespace FileReadingAndWriting { +/** + * \class CBoxAlgorithmSharedMemoryWriter + * \author Dieter Devlaminck (INRIA) + * \date Thu Jan 17 13:34:58 2013 + * \brief The class CBoxAlgorithmSharedMemoryWriter describes the box SharedMemoryWriter. + * + */ + +struct SMatrix +{ + size_t rowDim; + size_t colDim; + boost::interprocess::offset_ptr data; +}; + +typedef boost::interprocess::allocator CharAllocator; +typedef boost::interprocess::basic_string, CharAllocator> ShmString; +typedef boost::interprocess::allocator StringAllocator; +//typedef vector MyShmStringVector; +typedef boost::interprocess::allocator, boost::interprocess::managed_shared_memory::segment_manager> +ShmemAllocatorMetaInfo; +typedef boost::interprocess::map, ShmemAllocatorMetaInfo> MyVectorMetaInfo; + +typedef boost::interprocess::allocator ShmemAllocatorStimulation; +typedef boost::interprocess::allocator, boost::interprocess::managed_shared_memory::segment_manager> +ShmemAllocatorMatrix; +typedef boost::interprocess::vector MyVectorStimulation; +typedef boost::interprocess::vector, ShmemAllocatorMatrix> MyVectorStreamedMatrix; + +class CBoxAlgorithmSharedMemoryWriter final : virtual public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + + bool process() override; + + // As we do with any class in openvibe, we use the macro below + // to associate this box to an unique identifier. + // The inheritance information is also made available, + // as we provide the superclass Toolkit::TBoxAlgorithm < IBoxAlgorithm > + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_SharedMemoryWriter) + +protected: + std::vector*> m_decoders; + CString m_sharedMemoryName; + boost::interprocess::managed_shared_memory m_sharedMemoryArray; + +private: + CIdentifier m_typeID = CIdentifier::undefined(); + CString m_mutexName; + boost::interprocess::named_mutex* m_mutex = nullptr; + std::vector m_stimSets; + std::vector m_streamedMatrices; +}; + + +// The box listener can be used to call specific callbacks whenever the box structure changes : input added, name changed, etc. +// Please uncomment below the callbacks you want to use. +class CBoxAlgorithmSharedMemoryWriterListener final : public Toolkit::TBoxListener +{ +public: + + bool onInputAdded(Kernel::IBox& /*box*/, const size_t /*index*/) override { return true; } + bool onInputRemoved(Kernel::IBox& /*box*/, const size_t /*index*/) override { return true; } + bool onInputTypeChanged(Kernel::IBox& /*box*/, const size_t /*index*/) override { return true; } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + + +/** + * \class CBoxAlgorithmSharedMemoryWriterDesc + * \author Dieter Devlaminck (INRIA) + * \date Thu Jan 17 13:34:58 2013 + * \brief Descriptor of the box SharedMemoryWriter. + * + */ +class CBoxAlgorithmSharedMemoryWriterDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("SharedMemoryWriter"); } + CString getAuthorName() const override { return CString("Dieter Devlaminck"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Stream input to shared memory"); } + + CString getDetailedDescription() const override + { + return CString( + "The box writes input to shared memory so that it can be read by another process. Stimuli and streamed matrices are supported, and transformed into a format that can be written into shared memory. Based on the input types, a metainfo variable will be created in shared memory that will specify which variables have which type. This way the client can know what it will be reading."); + } + + CString getCategory() const override { return CString("File reading and writing"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString(""); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_SharedMemoryWriter; } + IPluginObject* create() override { return new CBoxAlgorithmSharedMemoryWriter; } + + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmSharedMemoryWriterListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("prediction1",OV_TypeId_StreamedMatrix); + //prototype.addInput("prediction2",OV_TypeId_Stimulations); + + + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + //prototype.addFlag(Kernel::BoxFlag_CanRemoveInput); + + prototype.addSetting("SharedMemoryName",OV_TypeId_String, "SharedMemory_P300Stimulator"); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + prototype.addInputSupport(OV_TypeId_Stimulations); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_SharedMemoryWriterDesc) +}; +} // namespace FileReadingAndWriting +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmTCPWriter.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmTCPWriter.cpp new file mode 100644 index 0000000..d924536 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmTCPWriter.cpp @@ -0,0 +1,335 @@ +#ifdef TARGET_HAS_Boost + +#include "ovpCBoxAlgorithmTCPWriter.h" + +#include +#include +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace NetworkIO { + +using boost::asio::ip::tcp; + +void CBoxAlgorithmTCPWriter::startAccept() +{ + tcp::socket* socket = new tcp::socket(m_acceptor->get_io_service()); + + // Since startAccept will only be called inside ioService.poll(), there is no need to access control m_sockets + m_sockets.push_back(socket); + + this->getLogManager() << Kernel::LogLevel_Debug << "We are now using " << m_sockets.size() << " socket(s)\n"; + + m_acceptor->async_accept(*socket, boost::bind(&CBoxAlgorithmTCPWriter::handleAccept, this, boost::asio::placeholders::error, socket)); +} + +void CBoxAlgorithmTCPWriter::handleAccept(const boost::system::error_code& ec, tcp::socket* pSocket) +{ + if (!m_acceptor->is_open()) + { + this->getLogManager() << Kernel::LogLevel_Debug << "handleAccept() was called with acceptor already closed\n"; + return; + } + + if (!ec) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Handling a new incoming connection\n"; + + // Send the known configuration to the client + if (m_activeDecoder != &m_stimulationDecoder || m_outputStyle == TCPWRITER_RAW) + { + try + { + write(*pSocket, boost::asio::buffer(static_cast(&m_rawVersion), sizeof(uint32_t))); + write(*pSocket, boost::asio::buffer(static_cast(&m_endianness), sizeof(uint32_t))); + write(*pSocket, boost::asio::buffer(static_cast(&m_frequency), sizeof(uint32_t))); + write(*pSocket, boost::asio::buffer(static_cast(&m_nChannels), sizeof(uint32_t))); + write(*pSocket, boost::asio::buffer(static_cast(&m_nSamplesPerChunk), sizeof(uint32_t))); + write(*pSocket, boost::asio::buffer(static_cast(&m_reserved0), sizeof(uint32_t))); + write(*pSocket, boost::asio::buffer(static_cast(&m_reserved1), sizeof(uint32_t))); + write(*pSocket, boost::asio::buffer(static_cast(&m_reserved2), sizeof(uint32_t))); + } + catch (boost::system::system_error& error) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Issue '" << error.code().message() << "' with writing header to client\n"; + } + } + } + else + { + // @fixme should the socket be closed in this case? + this->getLogManager() << Kernel::LogLevel_Warning << "Issue '" << ec.message() << "' with accepting a connection.\n"; + } + // Already schedule the accepting of the next connection + startAccept(); +} + +bool CBoxAlgorithmTCPWriter::initialize() +{ + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + + boxContext.getInputType(0, m_inputType); + if (m_inputType == OV_TypeId_StreamedMatrix) { m_activeDecoder = &m_matrixDecoder; } + else if (m_inputType == OV_TypeId_Signal) { m_activeDecoder = &m_signalDecoder; } + else { m_activeDecoder = &m_stimulationDecoder; } + m_activeDecoder->initialize(*this, 0); + + const uint64_t port = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_outputStyle = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + m_rawVersion = htonl(1); // TCP Writer output format version +#if defined(BOOST_LITTLE_ENDIAN) + m_endianness = htonl(1); +#elif defined(BOOST_BIG_ENDIAN) + m_endianness = htonl(2); +#elif defined(BOOST_PDP_ENDIAN) + m_endianness = htonl(3); +#else + m_endianness = htonl(0); + this->getLogManager() << Kernel::LogLevel_Warning << "Platform endianness was not recognized\n"; +#endif + + m_frequency = 0; + m_nChannels = 0; + m_nSamplesPerChunk = 0; + m_reserved0 = 0; + m_reserved1 = 0; + m_reserved2 = 0; + + this->getLogManager() << Kernel::LogLevel_Trace << "Setting up an acceptor at port " << port << "\n"; + + try + { +#ifdef TARGET_OS_Windows + // On Windows, unless we deny reuse_addr, it seems several different servers can bind to socket. This is not what we want. + m_acceptor = new tcp::acceptor(m_ioService, tcp::endpoint(tcp::v4(), uint32_t(port)), false); +#else + // On Linux, unless we allow reuse_addr, disconnection may set the socket to TIME_WAIT state and prevent opening it again until that state expires + m_acceptor = new tcp::acceptor(m_ioService, tcp::endpoint(tcp::v4(), uint32_t(port)), true); +#endif + } + catch (boost::system::system_error& error) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Got error '" << error.code().message() << "' allocating acceptor to port " << port << "\n"; + m_activeDecoder->uninitialize(); + m_activeDecoder = nullptr; + m_acceptor = nullptr; // if new throws, deleting the returned m_acceptor causes problems on Linux. So we NULL it. + return false; + } + + const boost::asio::socket_base::linger option(true, 0); + m_acceptor->set_option(option); + startAccept(); + m_ioService.poll(); + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmTCPWriter::uninitialize() +{ + if (m_activeDecoder) + { + m_activeDecoder->uninitialize(); + m_activeDecoder = nullptr; + } + + for (tcp::socket* sock : m_sockets) + { + if (sock->is_open()) + { + try + { + sock->shutdown(boost::asio::socket_base::shutdown_both); + sock->close(); + } + catch (boost::system::system_error& error) + { + // Just report... + this->getLogManager() << Kernel::LogLevel_Warning << "Error in uninitialize() socket shutdown/close: '" << error.code().message() << "'\n"; + } + } + } + m_ioService.poll(); + m_ioService.stop(); + + for (tcp::socket* sock : m_sockets) { delete sock; } + m_sockets.clear(); + + delete m_acceptor; + m_acceptor = nullptr; + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmTCPWriter::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmTCPWriter::sendToClients(const void* buffer, const size_t size) +{ + if (size == 0 || buffer == nullptr) + { + // Nothing to send, shouldn't happen + this->getLogManager() << Kernel::LogLevel_Warning << "Asked to send an empty buffer to clients (shouldn't happen)\n"; + return false; + } + + auto it = m_sockets.begin(); + while (it != m_sockets.end()) + { + tcp::socket* tmpSock = (*it); + bool hadError = false; + if (tmpSock->is_open()) + { + try { write(*tmpSock, boost::asio::buffer(buffer, size)); } + catch (boost::system::system_error& error) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Got error '" << error.code().message() << "' while trying to write to socket\n"; + hadError = true; + } + } + if (hadError) + { + // Close the socket + this->getLogManager() << Kernel::LogLevel_Debug << "Closing the socket\n"; + try + { + tmpSock->shutdown(boost::asio::socket_base::shutdown_both); + tmpSock->close(); + } + catch (boost::system::system_error& error) + { + // Just report... + this->getLogManager() << Kernel::LogLevel_Warning << "Error while socket shutdown/close: '" << error.code().message() << "'\n"; + } + m_ioService.poll(); + delete tmpSock; + it = m_sockets.erase(it); + } + else { ++it; } + } + return true; +} + +bool CBoxAlgorithmTCPWriter::process() +{ + // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + // Process the asio loop once (e.g. see if there's new connections) + m_ioService.poll(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_activeDecoder->decode(i); + if (m_activeDecoder->isHeaderReceived()) + { + // Matrix part + if (m_activeDecoder == &m_matrixDecoder || m_activeDecoder == &m_signalDecoder) + { + // Casting to base class, ok + Toolkit::TStreamedMatrixDecoder* decoder = (Toolkit::TStreamedMatrixDecoder*)(m_activeDecoder); + + const size_t nDim = decoder->getOutputMatrix()->getDimensionCount(); + switch (nDim) + { + case 0: + this->getLogManager() << Kernel::LogLevel_Error << "Nothing to send, zero size matrix stream received\n"; + return false; + case 1: + // Ok, this is a vector, openvibe style. Interpret it as 1 channel row vector. + m_nChannels = 1; + m_nSamplesPerChunk = decoder->getOutputMatrix()->getDimensionSize(0); + break; + case 2: + m_nChannels = decoder->getOutputMatrix()->getDimensionSize(0); + m_nSamplesPerChunk = decoder->getOutputMatrix()->getDimensionSize(1); + break; + default: + this->getLogManager() << Kernel::LogLevel_Error << "Only 1 and 2 dimensional matrices are supported\n"; + return false; + } + + // Conformance checking for all matrix based streams + if (m_nChannels == 0 || m_nSamplesPerChunk == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "For matrix-like inputs, both input dimensions must be larger than 0\n"; + return false; + } + } + + // Signal specific part + if (m_activeDecoder == &m_signalDecoder) { m_frequency = size_t(m_signalDecoder.getOutputSamplingRate()); } + + //if (m_activeDecoder == &m_stimDecoder) { } // Stimulus, do nothing + } + if (m_activeDecoder->isBufferReceived()) + { + if (m_activeDecoder == &m_matrixDecoder) + { + const CMatrix* matrix = m_matrixDecoder.getOutputMatrix(); + + sendToClients((void*)matrix->getBuffer(), matrix->getBufferElementCount() * sizeof(double)); + } + else if (m_activeDecoder == &m_signalDecoder) + { + const CMatrix* matrix = m_signalDecoder.getOutputMatrix(); + + sendToClients((void*)matrix->getBuffer(), matrix->getBufferElementCount() * sizeof(double)); + } + else // stimulus + { + const IStimulationSet* stimSet = m_stimulationDecoder.getOutputStimulationSet(); + for (size_t j = 0; j < stimSet->getStimulationCount(); ++j) + { + const uint64_t id = stimSet->getStimulationIdentifier(j); + // uint64_t date = stimSet->getStimulationDate(j); + this->getLogManager() << Kernel::LogLevel_Trace << "Sending out " << id << "\n"; + + switch (m_outputStyle) + { + case TCPWRITER_RAW: + sendToClients((void*)&id, sizeof(id)); + break; + case TCPWRITER_HEX: + { + CString tmp = CIdentifier(id).toString() + CString("\r\n"); + const char* ptr = tmp.toASCIIString(); + sendToClients((void*)ptr, strlen(ptr)); + } + break; + case TCPWRITER_STRING: + { + CString tmp = this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, id); + if (tmp == CString("")) { tmp = CString("Unregistered_stimulus ") + CIdentifier(id).toString(); } + tmp = tmp + CString("\r\n"); + + const char* ptr = tmp.toASCIIString(); + sendToClients((void*)ptr, strlen(ptr)); + } + break; + default: + this->getLogManager() << Kernel::LogLevel_Error << "Unknown stimulus output style\n"; + return false; + } + } + } + } + if (m_activeDecoder->isEndReceived()) { } + } + + return true; +} + +#endif // TARGET_HAS_Boost +} // namespace NetworkIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmTCPWriter.h b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmTCPWriter.h new file mode 100644 index 0000000..2e33ac6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/box-algorithms/ovpCBoxAlgorithmTCPWriter.h @@ -0,0 +1,162 @@ +#pragma once + +#ifdef TARGET_HAS_Boost + +#include "../ovp_defines.h" + +#include +#include + +#include +#include + +enum { TCPWRITER_RAW, TCPWRITER_HEX, TCPWRITER_STRING }; // stimulation output types + +namespace OpenViBE { +namespace Plugins { +namespace NetworkIO { +/** + * \class CBoxAlgorithmTCPWriter + * \author Jussi T. Lindgren (Inria) + * \date Wed Sep 11 12:55:22 2013 + * \brief The class CBoxAlgorithmTCPWriter describes the box TCP Writer. + * + */ +class CBoxAlgorithmTCPWriter final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + //Here is the different process callbacks possible + // - On clock ticks : + //virtual bool processClock(Kernel::CMessageClock& msg); + // - On new input received (the most common behaviour for signal processing) : + bool processInput(const size_t index) override; + + // If you want to use processClock, you must provide the clock frequency. + //virtual uint64_t getClockFrequency(); + + bool process() override; + + // As we do with any class in openvibe, we use the macro below + // to associate this box to an unique identifier. + // The inheritance information is also made available, + // as we provide the superclass Toolkit::TBoxAlgorithm < IBoxAlgorithm > + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_TCPWriter) + +protected: + + bool sendToClients(const void* buffer, size_t size); + + // Stream decoder + Toolkit::TStimulationDecoder m_stimulationDecoder; + Toolkit::TStreamedMatrixDecoder m_matrixDecoder; + Toolkit::TSignalDecoder m_signalDecoder; + Toolkit::TDecoder* m_activeDecoder = nullptr; + + boost::asio::io_service m_ioService; + boost::asio::ip::tcp::acceptor* m_acceptor = nullptr; + std::vector m_sockets; + + uint64_t m_outputStyle = 0; + + CIdentifier m_inputType = CIdentifier::undefined(); + + // Data written as global output header, 8*4 = 32 bytes. Padding allows dumb readers to step with double (==8 bytes). + size_t m_rawVersion = 0; // in network byte order, version of the raw stream + size_t m_endianness = 0; // in network byte order, 0==unknown, 1==little, 2==big, 3==pdp + size_t m_frequency = 0; // this and the rest are in host byte order + size_t m_nChannels = 0; + size_t m_nSamplesPerChunk = 0; + size_t m_reserved0 = 0; + size_t m_reserved1 = 0; + size_t m_reserved2 = 0; + + void startAccept(); + void handleAccept(const boost::system::error_code& ec, boost::asio::ip::tcp::socket* pSocket); +}; + +class CBoxAlgorithmTCPWriterListener final : public Toolkit::TBoxListener +{ +public: + CBoxAlgorithmTCPWriterListener(): m_lastType(CIdentifier::undefined()) { } + + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier newType = CIdentifier::undefined(); + box.getInputType(index, newType); + // Set the right enumeration according to the type if we actualy change it + // TODO find a way to init m_lastType with the right value + if (m_lastType != newType) + { + if (newType != OV_TypeId_Stimulations) { box.setSettingType(1, OVP_TypeID_TCPWriter_RawOutputStyle); } + else { box.setSettingType(1, OVP_TypeID_TCPWriter_OutputStyle); } + box.setSettingValue(1, "Raw"); + m_lastType = newType; + } + return true; + } + +private: + CIdentifier m_lastType = CIdentifier::undefined(); + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +/** + * \class CBoxAlgorithmTCPWriterDesc + * \author Jussi T. Lindgren (Inria) + * \date Wed Sep 11 12:55:22 2013 + * \brief Descriptor of the box TCP Writer. + * + */ +class CBoxAlgorithmTCPWriterDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("TCP Writer"); } + CString getAuthorName() const override { return CString("Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Send input stream out via a TCP socket"); } + CString getDetailedDescription() const override { return CString("\n"); } + CString getCategory() const override { return CString("Acquisition and network IO"); } + CString getVersion() const override { return CString("0.2"); } + CString getStockItemName() const override { return CString("gtk-connect"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_TCPWriter; } + IPluginObject* create() override { return new CBoxAlgorithmTCPWriter; } + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmTCPWriterListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input 1",OV_TypeId_StreamedMatrix); + + prototype.addSetting("Port",OV_TypeId_Integer, "5678"); + prototype.addSetting("Output format", OVP_TypeID_TCPWriter_RawOutputStyle, "Raw"); + + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_Stimulations); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_TCPWriterDesc) +}; +} // namespace NetworkIO +} // namespace Plugins +} // namespace OpenViBE + + +#endif // TARGET_HAS_Boost diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/ovp_defines.h new file mode 100755 index 0000000..3c188de --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/ovp_defines.h @@ -0,0 +1,22 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_SharedMemoryWriter OpenViBE::CIdentifier(0xACC272DD, 0xC1BDC1B1) +#define OVP_ClassId_BoxAlgorithm_SharedMemoryWriterDesc OpenViBE::CIdentifier(0xACC727DD, 0xCACDC1B1) +#define OVP_ClassId_BoxAlgorithm_LSLExport OpenViBE::CIdentifier(0x6F3467FF, 0x52794DA6) +#define OVP_ClassId_BoxAlgorithm_LSLExportDesc OpenViBE::CIdentifier(0x40C03C3F, 0x034A19C2) +#define OVP_ClassId_BoxAlgorithm_TCPWriter OpenViBE::CIdentifier(0x02F24947, 0x17FA0477) +#define OVP_ClassId_BoxAlgorithm_TCPWriterDesc OpenViBE::CIdentifier(0x3C32489D, 0x46F565D3) +#define OVP_TypeID_TCPWriter_OutputStyle OpenViBE::CIdentifier(0x6D7E53DD, 0x6A0A4753) +#define OVP_TypeID_TCPWriter_RawOutputStyle OpenViBE::CIdentifier(0x77D3E238, 0xB954EC48) + + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + + +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/ovp_main.cpp new file mode 100755 index 0000000..775868c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/network-io/src/ovp_main.cpp @@ -0,0 +1,34 @@ +#include "ovp_defines.h" + +#include "box-algorithms/ovpCBoxAlgorithmLSLExport.h" +#include "box-algorithms/ovpCBoxAlgorithmTCPWriter.h" +#include "box-algorithms/ovpCBoxAlgorithmSharedMemoryWriter.h" + +namespace OpenViBE { +namespace Plugins { + +OVP_Declare_Begin() +#ifdef TARGET_HAS_ThirdPartyLSL + OVP_Declare_New(NetworkIO::CBoxAlgorithmLSLExportDesc); +#endif + +#ifdef TARGET_HAS_Boost + OVP_Declare_New(FileReadingAndWriting::CBoxAlgorithmSharedMemoryWriterDesc); + OVP_Declare_New(NetworkIO::CBoxAlgorithmTCPWriterDesc); + + context.getTypeManager().registerEnumerationEntry(OV_TypeId_BoxAlgorithmFlag, OV_AttributeId_Box_FlagIsUnstable.toString(), + OV_AttributeId_Box_FlagIsUnstable.id()); + + context.getTypeManager().registerEnumerationType(OVP_TypeID_TCPWriter_OutputStyle, "Stimulus output"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeID_TCPWriter_OutputStyle, "Raw", TCPWRITER_RAW); + context.getTypeManager().registerEnumerationEntry(OVP_TypeID_TCPWriter_OutputStyle, "Hex", TCPWRITER_HEX); + context.getTypeManager().registerEnumerationEntry(OVP_TypeID_TCPWriter_OutputStyle, "String", TCPWRITER_STRING); + + context.getTypeManager().registerEnumerationType(OVP_TypeID_TCPWriter_RawOutputStyle, "Raw output"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeID_TCPWriter_RawOutputStyle, "Raw", TCPWRITER_RAW); +#endif + +OVP_Declare_End() + +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/.gitignore b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/.gitignore new file mode 100644 index 0000000..b37ea6e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/.gitignore @@ -0,0 +1,3 @@ +doc/html/* +.vscode/ +*-output.csv \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/CMakeLists.txt new file mode 100644 index 0000000..a08edfb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/CMakeLists.txt @@ -0,0 +1,46 @@ +PROJECT(openvibe-plugins-riemannian) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.hpp src/*.h src/*.inl src/*.c) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE") + +INCLUDE_DIRECTORIES("src") + +# OpenViBE Base +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") + +# OpenViBE Module +INCLUDE("FindOpenViBEModuleXML") +INCLUDE("FindModuleGeometry") + +# OpenViBE Third Party +INCLUDE("FindThirdPartyEigen") +INCLUDE("FindThirdPartyBoost") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +SET(SUB_DIR_NAME riemannian) + +INSTALL(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials/${SUB_DIR_NAME}) +INSTALL(DIRECTORY bci-examples/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/bci-examples/${SUB_DIR_NAME}) + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/0.1-Riemann-Classic-NOISE-Compute-Reference.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/0.1-Riemann-Classic-NOISE-Compute-Reference.xml new file mode 100644 index 0000000..44f8dbf --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/0.1-Riemann-Classic-NOISE-Compute-Reference.xml @@ -0,0 +1,860 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x005e47b5, 0x7accff5e) + (0x79a9edeb, 0x245d83fc) + Directory + ${Player_ScenarioDirectory} + ${Player_ScenarioDirectory} + + + (0x004e186f, 0xc24bdf6a) + (0x330306dd, 0x74a95f98) + LWF Mean + Mean-Riemann-LWF.csv + Mean-Riemann-LWF.csv + + + (0x0027a6f6, 0x70ff3236) + (0x330306dd, 0x74a95f98) + Cor Mean + Mean-Riemann-COR.csv + Mean-Riemann-COR.csv + + + (0x000e76d1, 0xb1bece46) + (0x007deef9, 0x2f3e95c6) + Stimulation + OVTK_StimulationId_TrainCompleted + OVTK_StimulationId_TrainCompleted + + + (0x007a31e5, 0x7abc0fe2) + (0x007deef9, 0x2f3e95c6) + Log Level + Information + Information + + + + + + + (0x00000577, 0x0000375f) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000013ef, 0x00004894) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 60 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786a) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786b) + COR + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Pearson Correlation + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003a4d, 0x00004a1b) + Covariance Mean Calculator + (0x67955ea4, 0x7c643c0f) + + + (0x6f752dd0, 0x082a321e) + Input Stimulation + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix 1 + + + + + (0x544a003e, 0x6dcba5f6) + Output Mean Matrix + + + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Riemann + false + + + (0x330306dd, 0x74a95f98) + Filename to save Matrix (CSV, empty to not save) + ${Player_ScenarioDirectory}/Mean.csv + $var{Directory}/$var{LWF Mean} + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name that triggers the compute + OVTK_StimulationId_TrainCompleted + $var{Stimulation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0xa6202e43, 0xaf22cef6) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003a4d, 0x00004a1c) + Covariance Mean Calculator + (0x67955ea4, 0x7c643c0f) + + + (0x6f752dd0, 0x082a321e) + Input Stimulation + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix 1 + + + + + (0x544a003e, 0x6dcba5f6) + Output Mean Matrix + + + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Riemann + false + + + (0x330306dd, 0x74a95f98) + Filename to save Matrix (CSV, empty to not save) + ${Player_ScenarioDirectory}/Mean.csv + $var{Directory}/$var{Cor Mean} + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name that triggers the compute + OVTK_StimulationId_TrainCompleted + $var{Stimulation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 800 + + + (0x4e7b798a, 0x183beafb) + (0xa6202e43, 0xaf22cef6) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004173, 0x000028f8) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + (x+1)*10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x009ba89e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000586a, 0x00001f44) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006642, 0x00007f5c) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x88a4a7f6, 0x4180bdb0) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + + + (0x00002145, 0x0000754f) + + (0x000013ef, 0x00004894) + 0 + + + (0x00000577, 0x0000375f) + 0 + + + + (0x000026f2, 0x00005da6) + + (0x0000586a, 0x00001f44) + 0 + + + (0x0000241d, 0x0000786a) + 0 + + + + (0x0000577e, 0x00000ace) + + (0x0000586a, 0x00001f44) + 0 + + + (0x0000241d, 0x0000786b) + 0 + + + + (0x00006078, 0x00007097) + + (0x0000241d, 0x0000786b) + 0 + + + (0x00003a4d, 0x00004a1c) + 1 + + + + (0x000065eb, 0x00000ed7) + + (0x000013ef, 0x00004894) + 0 + + + (0x00003a4d, 0x00004a1b) + 0 + + + + (0x00006656, 0x00002fdb) + + (0x00006642, 0x00007f5c) + 0 + + + (0x00004173, 0x000028f8) + 0 + + + + (0x00006ab6, 0x0000519d) + + (0x0000241d, 0x0000786a) + 0 + + + (0x00003a4d, 0x00004a1b) + 1 + + + + (0x00007b25, 0x00006cb8) + + (0x00004173, 0x000028f8) + 0 + + + (0x0000586a, 0x00001f44) + 0 + + + + (0x00007f37, 0x0000790c) + + (0x000013ef, 0x00004894) + 0 + + + (0x00003a4d, 0x00004a1c) + 0 + + + + + + (0x000054d7, 0x00005adf) + Compute Mean + + + (0x473d9a43, 0x97fc0a97) + 288 + + + (0x7234b86b, 0x2b8651a5) + 384 + + + + + (0x000054d7, 0x00005ae0) + Input Signal + + + (0x473d9a43, 0x97fc0a97) + 288 + + + (0x7234b86b, 0x2b8651a5) + 144 + + + + + (0x000054d7, 0x00005ae1) + Compute Covariance + + + (0x473d9a43, 0x97fc0a97) + 288 + + + (0x7234b86b, 0x2b8651a5) + 304 + + + + + + + (0x05377d7e, 0x41751bb3) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":592,"identifier":"(0x00001f6c, 0x000012a7)","name":"Display","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":831},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003bf6, 0x000002ba)","index":0,"name":"Default tab","parentIdentifier":"(0x00001f6c, 0x000012a7)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00005d22, 0x00004235)","index":0,"name":"Empty","parentIdentifier":"(0x00003bf6, 0x000002ba)","type":0}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x7b814cca, 0x271df6dd) + 475 + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Classification Riemann Classic Compute Reference Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + bci-examples + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/0.2-Riemann-Classic-NOISE-Training.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/0.2-Riemann-Classic-NOISE-Training.xml new file mode 100644 index 0000000..e063c82 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/0.2-Riemann-Classic-NOISE-Training.xml @@ -0,0 +1,1460 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x004d2731, 0x8fa767ea) + (0x79a9edeb, 0x245d83fc) + Directory + ${Player_ScenarioDirectory}/ + ${Player_ScenarioDirectory} + + + (0x0002ec8d, 0xace742b6) + (0x330306dd, 0x74a95f98) + Model Filename + Classification-Riemann-Classic-Training-Model.xml + Riemann-Classic-Training-Model.xml + + + (0x001828e2, 0x99ca3842) + (0x330306dd, 0x74a95f98) + LWF Mean + Mean-Riemann-LWF.csv + Mean-Riemann-LWF.csv + + + (0x001e2b6a, 0x511e6a8e) + (0x330306dd, 0x74a95f98) + COR Mean + Mean-Riemann-COR.csv + Mean-Riemann-COR.csv + + + (0x004939a9, 0xe3c4dec6) + (0x007deef9, 0x2f3e95c6) + Log Level + Information + Information + + + + + + + (0x0000241d, 0x0000786a) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 464 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786b) + COR + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Pearson Correlation + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003577, 0x00001a8d) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 20 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Train + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003b34f4) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004173, 0x000028f8) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + (x+1)*10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x009ba89e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000044b9, 0x00003dab) + Tangent Space + (0x7c265dba, 0x202c1f70) + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix + + + + + (0x17341935, 0x152ff448) + Output Feature Vector + + + + + (0x2cdb2f0b, 0x12f231ea) + Tangent Space + true + true + false + + + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix (CSV, empty for Identity) + ${Player_ScenarioDirectory}/Mean.csv + $var{Directory}/$var{LWF Mean} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xbfd23954, 0x40c20e2d) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000044b9, 0x00003dac) + Squeeze + (0x7c265dba, 0x202c1f70) + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix + + + + + (0x17341935, 0x152ff448) + Output Feature Vector + + + + + (0x2cdb2f0b, 0x12f231ea) + Tangent Space + true + false + false + + + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix (CSV, empty for Identity) + ${Player_ScenarioDirectory}/Mean.csv + + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0xbfd23954, 0x40c20e2d) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000044b9, 0x00003dad) + Tangent Space + (0x7c265dba, 0x202c1f70) + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix + + + + + (0x17341935, 0x152ff448) + Output Feature Vector + + + + + (0x2cdb2f0b, 0x12f231ea) + Tangent Space + true + true + false + + + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix (CSV, empty for Identity) + ${Player_ScenarioDirectory}/Mean.csv + $var{Directory}/$var{COR Mean} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0xbfd23954, 0x40c20e2d) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000044b9, 0x00003dae) + Squeeze + (0x7c265dba, 0x202c1f70) + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix + + + + + (0x17341935, 0x152ff448) + Output Feature Vector + + + + + (0x2cdb2f0b, 0x12f231ea) + Tangent Space + true + false + false + + + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix (CSV, empty for Identity) + ${Player_ScenarioDirectory}/Mean.csv + + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0xbfd23954, 0x40c20e2d) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005062, 0x000009d6) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + (0x17341935, 0x152ff448) + Features for class 4 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + $var{Directory}/$var{Model Filename} + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 4 label + OVTK_StimulationId_Label_04 + OVTK_StimulationId_Label_04 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA)(1) + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 656 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0177ec55) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005607, 0x00006ea5) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x207c9054, 0x3c841b63) + 656 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0059275b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006642, 0x00007f5c) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x88a4a7f6, 0x4180bdb0) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x000078f6, 0x00007919) + LWF Tangent + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x0000791a) + LWF Squeeze + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x0000791b) + COR Tangent + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x0000791c) + COR Squeeze + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000610, 0x000068f6) + + (0x0000241d, 0x0000786b) + 0 + + + (0x000044b9, 0x00003dae) + 0 + + + + (0x0000153f, 0x00004061) + + (0x0000241d, 0x0000786a) + 0 + + + (0x000044b9, 0x00003dac) + 0 + + + + (0x000015b4, 0x00003fc7) + + (0x000044b9, 0x00003dae) + 0 + + + (0x00005062, 0x000009d6) + 4 + + + + (0x00001f57, 0x00007f16) + + (0x00004173, 0x000028f8) + 0 + + + (0x0000241d, 0x0000786b) + 0 + + + + (0x0000253c, 0x000007cd) + + (0x00005062, 0x000009d6) + 0 + + + (0x00005607, 0x00006ea5) + 0 + + + + (0x000025d0, 0x00004e62) + + (0x000044b9, 0x00003dad) + 0 + + + (0x00005062, 0x000009d6) + 3 + + + + (0x0000267f, 0x0000556d) + + (0x000044b9, 0x00003dab) + 0 + + + (0x000078f6, 0x00007919) + 0 + + + + (0x000038a3, 0x00001604) + + (0x0000241d, 0x0000786b) + 0 + + + (0x000044b9, 0x00003dad) + 0 + + + + (0x00003f36, 0x0000065a) + + (0x00006642, 0x00007f5c) + 0 + + + (0x00004173, 0x000028f8) + 0 + + + + (0x000046df, 0x00001885) + + (0x00003577, 0x00001a8d) + 0 + + + (0x00005062, 0x000009d6) + 0 + + + + (0x00004966, 0x0000478e) + + (0x000044b9, 0x00003dae) + 0 + + + (0x000078f6, 0x0000791c) + 0 + + + + (0x00004acb, 0x000025a9) + + (0x000044b9, 0x00003dac) + 0 + + + (0x00005062, 0x000009d6) + 2 + + + + (0x000065fa, 0x000032fe) + + (0x000044b9, 0x00003dad) + 0 + + + (0x000078f6, 0x0000791b) + 0 + + + + (0x000068c9, 0x00003f16) + + (0x0000241d, 0x0000786a) + 0 + + + (0x000044b9, 0x00003dab) + 0 + + + + (0x00006fb3, 0x00007389) + + (0x00004173, 0x000028f8) + 0 + + + (0x0000241d, 0x0000786a) + 0 + + + + (0x00007539, 0x00000593) + + (0x000044b9, 0x00003dac) + 0 + + + (0x000078f6, 0x0000791a) + 0 + + + + (0x00007b2f, 0x00001c30) + + (0x000044b9, 0x00003dab) + 0 + + + (0x00005062, 0x000009d6) + 1 + + + + + + (0x000054d7, 0x00005adf) + Compute Feature +(Need to run previous scenario) + + + (0x473d9a43, 0x97fc0a97) + 160 + + + (0x7234b86b, 0x2b8651a5) + 304 + + + + + (0x000054d7, 0x00005ae0) + Input Signal + + + (0x473d9a43, 0x97fc0a97) + 160 + + + (0x7234b86b, 0x2b8651a5) + 144 + + + + + (0x000054d7, 0x00005ae1) + Compute Covariance + + + (0x473d9a43, 0x97fc0a97) + 160 + + + (0x7234b86b, 0x2b8651a5) + 224 + + + + + (0x000054d7, 0x00005ae2) + Display + + + (0x473d9a43, 0x97fc0a97) + 176 + + + (0x7234b86b, 0x2b8651a5) + 368 + + + + + (0x000054d7, 0x00005ae3) + Classify + + + (0x473d9a43, 0x97fc0a97) + 176 + + + (0x7234b86b, 0x2b8651a5) + 480 + + + + + + + (0x05377d7e, 0x41751bb3) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":592,"identifier":"(0x00001f6c, 0x000012a7)","name":"Display","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":831},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003bf6, 0x000002ba)","index":0,"name":"Default tab","parentIdentifier":"(0x00001f6c, 0x000012a7)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":271,"identifier":"(0x00001ce3, 0x000060d0)","index":0,"maxDividerPosition":547,"name":"Vertical split","parentIdentifier":"(0x00003bf6, 0x000002ba)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":125,"identifier":"(0x000075ce, 0x00003e67)","index":0,"maxDividerPosition":255,"name":"Vertical split","parentIdentifier":"(0x00001ce3, 0x000060d0)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":128,"identifier":"(0x00001e51, 0x000013a9)","index":1,"maxDividerPosition":255,"name":"Vertical split","parentIdentifier":"(0x00001ce3, 0x000060d0)","type":4},{"boxIdentifier":"(0x000078f6, 0x00007919)","childCount":0,"identifier":"(0x00006d43, 0x000076f1)","index":0,"parentIdentifier":"(0x000075ce, 0x00003e67)","type":3},{"boxIdentifier":"(0x000078f6, 0x0000791a)","childCount":0,"identifier":"(0x00003dc4, 0x00004b7c)","index":1,"parentIdentifier":"(0x000075ce, 0x00003e67)","type":3},{"boxIdentifier":"(0x000078f6, 0x0000791b)","childCount":0,"identifier":"(0x00006429, 0x00003b15)","index":0,"parentIdentifier":"(0x00001e51, 0x000013a9)","type":3},{"boxIdentifier":"(0x000078f6, 0x0000791c)","childCount":0,"identifier":"(0x00001547, 0x000040e0)","index":1,"parentIdentifier":"(0x00001e51, 0x000013a9)","type":3}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x7b814cca, 0x271df6dd) + 475 + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Classification Riemann Classic Training Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + bci-examples + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/0.3-Riemann-Classic-NOISE-Testing.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/0.3-Riemann-Classic-NOISE-Testing.xml new file mode 100644 index 0000000..85645a1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/0.3-Riemann-Classic-NOISE-Testing.xml @@ -0,0 +1,1868 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x0053bd63, 0x529db7d2) + (0x79a9edeb, 0x245d83fc) + Directory + ${Player_ScenarioDirectory}/ + ${Player_ScenarioDirectory} + + + (0x00019cfc, 0xa4d0bb1e) + (0x330306dd, 0x74a95f98) + Model Filename + Classification-Riemann-Classic-Training-Model.xml + Riemann-Classic-Training-Model.xml + + + (0x004af8d6, 0xec08172a) + (0x330306dd, 0x74a95f98) + LWF Mean + Mean-Riemann-LWF.csv + Mean-Riemann-LWF.csv + + + (0x007882da, 0x94d087f6) + (0x330306dd, 0x74a95f98) + COR Mean + Mean-Riemann-COR.csv + Mean-Riemann-COR.csv + + + (0x004263dc, 0xc7026182) + (0x007deef9, 0x2f3e95c6) + Delay Between Stimulation + 10 + 10 + + + (0x004289b0, 0x4409c7ce) + (0x007deef9, 0x2f3e95c6) + Number of Class + 2 + 4 + + + (0x003f747a, 0x47dbccda) + (0x007deef9, 0x2f3e95c6) + Total Time + 30 + 40 + + + (0x0037d2ed, 0xc555ee26) + (0x007deef9, 0x2f3e95c6) + Log Level + Information + Information + + + + + + + (0x00000a83, 0x00006fd7) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 752 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b16ab9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000d0c, 0x00002cda) + Confusion Matrix + (0x1ab625da, 0x3b2502ce) + + + (0x6f752dd0, 0x082a321e) + Targets + + + (0x6f752dd0, 0x082a321e) + Classification results + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Percentages + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Sums + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 + OVTK_GDF_Artifact_EOG_Large + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 4 + OVTK_StimulationId_Number_00 + OVTK_StimulationId_Label_04 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 688 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x4e7b798a, 0x183beafb) + (0x05cf579a, 0x80d8b480) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00de8e03) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001838, 0x00000241) + Matrix Display + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 752 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006eaeb9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786a) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786b) + COR + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Pearson Correlation + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786c) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786d) + COR + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Pearson Correlation + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004173, 0x000028f8) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + (x+1)*10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0044b986) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004449, 0x00002ee6) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 464 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000044b9, 0x00003dab) + Tangent Space + (0x7c265dba, 0x202c1f70) + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix + + + + + (0x17341935, 0x152ff448) + Output Feature Vector + + + + + (0x2cdb2f0b, 0x12f231ea) + Tangent Space + true + true + false + + + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix (CSV, empty for Identity) + ${Player_ScenarioDirectory}/Mean.csv + $var{Directory}/$var{LWF Mean} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x4e7b798a, 0x183beafb) + (0xbfd23954, 0x40c20e2d) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000044b9, 0x00003dac) + Squeeze + (0x7c265dba, 0x202c1f70) + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix + + + + + (0x17341935, 0x152ff448) + Output Feature Vector + + + + + (0x2cdb2f0b, 0x12f231ea) + Tangent Space + true + false + false + + + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix (CSV, empty for Identity) + ${Player_ScenarioDirectory}/Mean.csv + + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0xbfd23954, 0x40c20e2d) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000044b9, 0x00003dad) + Tangent Space + (0x7c265dba, 0x202c1f70) + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix + + + + + (0x17341935, 0x152ff448) + Output Feature Vector + + + + + (0x2cdb2f0b, 0x12f231ea) + Tangent Space + true + true + false + + + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix (CSV, empty for Identity) + ${Player_ScenarioDirectory}/Mean.csv + $var{Directory}/$var{COR Mean} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0xbfd23954, 0x40c20e2d) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000044b9, 0x00003dae) + Squeeze + (0x7c265dba, 0x202c1f70) + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix + + + + + (0x17341935, 0x152ff448) + Output Feature Vector + + + + + (0x2cdb2f0b, 0x12f231ea) + Tangent Space + true + false + false + + + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix (CSV, empty for Identity) + ${Player_ScenarioDirectory}/Mean.csv + + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0xbfd23954, 0x40c20e2d) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000047f3, 0x00007e53) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005dbd, 0x00001d0e) + Streamed matrix multiplexer + (0x7a12298b, 0x785f4d42) + + + (0x17341935, 0x152ff448) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + (0x17341935, 0x152ff448) + Input stream 3 + + + (0x17341935, 0x152ff448) + Input stream 4 + + + + + (0x17341935, 0x152ff448) + Multiplexed streamed matrix + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x4badfdff, 0xc35004a3) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006642, 0x00007f5c) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x4e7b798a, 0x183beafb) + (0x88a4a7f6, 0x4180bdb0) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x00007474, 0x00002f72) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + $var{Directory}/$var{Model Filename} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00007a62, 0x00007a92) + Lua Stimulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/stimulation-regulator.lua + false + + + (0x007deef9, 0x2f3e95c6) + Delay (s) + 10 + $var{Delay Between Stimulation} + false + + + (0x007deef9, 0x2f3e95c6) + Iteration + 2 + $var{Number of Class} + false + + + (0x2cdb2f0b, 0x12f231ea) + Increment Stimulation + false + true + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007b60, 0x00005390) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x5ba36127, 0x195feae1) + Output + + + (0x5ba36127, 0x195feae1) + Output(1) + + + (0x5ba36127, 0x195feae1) + New output + + + (0x5ba36127, 0x195feae1) + New output(1) + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 4 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00f115e0) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x7c42038e, 0x43110e64) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + $var{Total Time} + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000002da, 0x00000a2c) + + (0x00007b60, 0x00005390) + 0 + + + (0x0000241d, 0x0000786a) + 0 + + + + (0x000015f3, 0x00006635) + + (0x00007b60, 0x00005390) + 1 + + + (0x0000241d, 0x0000786c) + 0 + + + + (0x00002749, 0x00001df6) + + (0x000044b9, 0x00003dac) + 0 + + + (0x00005dbd, 0x00001d0e) + 1 + + + + (0x0000278e, 0x00004cbe) + + (0x000044b9, 0x00003dad) + 0 + + + (0x00005dbd, 0x00001d0e) + 2 + + + + (0x00002cb3, 0x00006fe1) + + (0x000044b9, 0x00003dab) + 0 + + + (0x00005dbd, 0x00001d0e) + 0 + + + + (0x0000332e, 0x00002a0e) + + (0x00007b60, 0x00005390) + 3 + + + (0x0000241d, 0x0000786d) + 0 + + + + (0x000038a3, 0x00001604) + + (0x0000241d, 0x0000786b) + 0 + + + (0x000044b9, 0x00003dad) + 0 + + + + (0x00003946, 0x0000059e) + + (0x000044b9, 0x00003dae) + 0 + + + (0x00005dbd, 0x00001d0e) + 3 + + + + (0x00003b74, 0x00006808) + + (0x00007a62, 0x00007a92) + 0 + + + (0x00007b60, 0x00005390) + 0 + + + + (0x0000426f, 0x00006d4a) + + (0x00000d0c, 0x00002cda) + 0 + + + (0x00001838, 0x00000241) + 0 + + + + (0x000042d6, 0x000010e4) + + (0x0000241d, 0x0000786d) + 0 + + + (0x000044b9, 0x00003dae) + 0 + + + + (0x00005214, 0x00003c09) + + (0x00007474, 0x00002f72) + 0 + + + (0x00000d0c, 0x00002cda) + 1 + + + + (0x000052b9, 0x00007ddb) + + (0x00007a62, 0x00007a92) + 0 + + + (0x000047f3, 0x00007e53) + 0 + + + + (0x00005b4b, 0x00004609) + + (0x00004173, 0x000028f8) + 0 + + + (0x00007b60, 0x00005390) + 1 + + + + (0x000068c9, 0x00003f16) + + (0x0000241d, 0x0000786a) + 0 + + + (0x000044b9, 0x00003dab) + 0 + + + + (0x00007024, 0x00002e85) + + (0x00007a62, 0x00007a92) + 0 + + + (0x00004449, 0x00002ee6) + 0 + + + + (0x00007056, 0x00006a05) + + (0x00005dbd, 0x00001d0e) + 0 + + + (0x00007474, 0x00002f72) + 0 + + + + (0x0000710c, 0x00007571) + + (0x00007b60, 0x00005390) + 2 + + + (0x0000241d, 0x0000786b) + 0 + + + + (0x000077f5, 0x000047c3) + + (0x00006642, 0x00007f5c) + 0 + + + (0x00004173, 0x000028f8) + 0 + + + + (0x00007ad6, 0x0000649b) + + (0x000047f3, 0x00007e53) + 0 + + + (0x00000d0c, 0x00002cda) + 0 + + + + (0x00007e40, 0x00002fc9) + + (0x0000241d, 0x0000786c) + 0 + + + (0x000044b9, 0x00003dac) + 0 + + + + (0x4b786080, 0x674f91a4) + + (0x7c42038e, 0x43110e64) + 0 + + + (0x00000a83, 0x00006fd7) + 0 + + + + + + (0x000054d7, 0x00005adf) + Compute Feature +(Need to run 2 previous scenarios) + + + (0x473d9a43, 0x97fc0a97) + 128 + + + (0x7234b86b, 0x2b8651a5) + 432 + + + + + (0x000054d7, 0x00005ae0) + Input Signal + + + (0x473d9a43, 0x97fc0a97) + 128 + + + (0x7234b86b, 0x2b8651a5) + 96 + + + + + (0x000054d7, 0x00005ae1) + Compute Covariance + + + (0x473d9a43, 0x97fc0a97) + 128 + + + (0x7234b86b, 0x2b8651a5) + 368 + + + + + (0x000054d7, 0x00005ae2) + Classes Switch + + + (0x473d9a43, 0x97fc0a97) + 128 + + + (0x7234b86b, 0x2b8651a5) + 208 + + + + + (0x000054d7, 0x00005ae3) + Classifier processor +(Need to run previous scenario) + + + (0x473d9a43, 0x97fc0a97) + 128 + + + (0x7234b86b, 0x2b8651a5) + 576 + + + + + (0x000054d7, 0x00005ae4) + Stop Scenario after Total Time + + + (0x473d9a43, 0x97fc0a97) + 1120 + + + (0x7234b86b, 0x2b8651a5) + 720 + + + + + + + (0x11f491f3, 0x047d65a5) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00001838, 0x00000241)","childCount":0,"identifier":"(0x1a61c725, 0x408aeb5c)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x7b814cca, 0x271df6dd) + 475 + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Classification Riemann Classic Testing Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + bci-examples + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/1.1-Riemann-Classic-SAMPLE-Compute-Reference.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/1.1-Riemann-Classic-SAMPLE-Compute-Reference.xml new file mode 100644 index 0000000..f8545cd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/1.1-Riemann-Classic-SAMPLE-Compute-Reference.xml @@ -0,0 +1,1214 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x0037d53c, 0x136be68a) + (0x330306dd, 0x74a95f98) + Data + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + + + (0x00099a0c, 0x26c9af56) + (0x79a9edeb, 0x245d83fc) + Directory + ${Player_ScenarioDirectory} + ${Player_ScenarioDirectory} + + + (0x0005b920, 0xe91324e2) + (0x330306dd, 0x74a95f98) + Mean + Mean-Riemann-Left.csv + Mean-Riemann.csv + + + (0x00693c40, 0xd96acb2e) + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_TrainCompleted + OVTK_GDF_End_Of_Session + + + (0x0031c15c, 0x30582c42) + (0x007deef9, 0x2f3e95c6) + Log Level + Information + Information + + + + + + + (0x0000241d, 0x0000786a) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x207c9054, 0x3c841b63) + 1088 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786b) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003a4d, 0x00004a1b) + Covariance Mean Calculator + (0x67955ea4, 0x7c643c0f) + + + (0x6f752dd0, 0x082a321e) + Input Stimulation + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix 1 + + + (0x007f5e0c, 0x69fb23f2) + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix 2 + + + + + (0x544a003e, 0x6dcba5f6) + Output Mean Matrix + + + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Riemann + false + + + (0x330306dd, 0x74a95f98) + Filename to save Matrix (CSV, empty to not save) + ${Player_ScenarioDirectory}/Mean.csv + $var{Directory}/$var{Mean} + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name that triggers the compute + OVTK_StimulationId_TrainCompleted + $var{Stimulation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0xa6202e43, 0xaf22cef6) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0841694e, 0x28e40f42) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.500000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_GDF_Right + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 1088 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + + + (0x11a6038b, 0x7157c283) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Data} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005e1c11) + + + + + (0x1396fde6, 0x1c649749) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 1088 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc7a) + + + (0xfba64161, 0x65304e21) + + + + + + (0x1f046833, 0x21a8a876) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001882ae) + + + (0xfba64161, 0x65304e21) + + + + + + (0x2b88852d, 0x43d7a772) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4c1eab6f, 0x0e8c522c) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.500000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + OVTK_GDF_Left + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + + + (0x5045ebd9, 0x67325c0b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 1088 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e001786) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x52a5790c, 0x13d24266) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 1088 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc72) + + + + + (0x558c587f, 0x223f3b66) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a79f8) + + + + + (0x71322e63, 0x41ba161a) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00183f8d) + + + + + + + (0x000003e3, 0x0000571b) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x5045ebd9, 0x67325c0b) + 0 + + + + (0x00000512, 0x000003bd) + + (0x0000241d, 0x0000786a) + 0 + + + (0x00003a4d, 0x00004a1b) + (0x007f5e0c, 0x69fb23f2) + + + + (0x00002363, 0x00000391) + + (0x11a6038b, 0x7157c283) + 1 + + + (0x2b88852d, 0x43d7a772) + 0 + + + + (0x000028dc, 0x00001228) + + (0x5194b6cb, 0x7e001786) + 0 + + + (0x558c587f, 0x223f3b66) + 0 + + + + (0x000031d7, 0x00001c67) + + (0x0000241d, 0x0000786b) + 0 + + + (0x00003a4d, 0x00004a1b) + 1 + + + + (0x000046e6, 0x00003ae4) + + (0x52a5790c, 0x13d24266) + 0 + + + (0x0000241d, 0x0000786a) + 0 + + + + (0x00004eb1, 0x000045d0) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x1f046833, 0x21a8a876) + 1 + + + + (0x00005612, 0x0000591e) + + (0x11a6038b, 0x7157c283) + 2 + + + (0x1396fde6, 0x1c649749) + 0 + + + + (0x00005c2e, 0x00000923) + + (0x71322e63, 0x41ba161a) + 0 + + + (0x0000241d, 0x0000786b) + 0 + + + + (0x000077dc, 0x00003fb5) + + (0x1f046833, 0x21a8a876) + 1 + + + (0x00003a4d, 0x00004a1b) + 0 + + + + (0x0fb9552e, 0x72e04408) + + (0x1f046833, 0x21a8a876) + 0 + + + (0x0841694e, 0x28e40f42) + 0 + + + + (0x1658a066, 0x2ce1e19e) + + (0x1f046833, 0x21a8a876) + 0 + + + (0x4c1eab6f, 0x0e8c522c) + 0 + + + + (0x1e23e99e, 0x6b3cf5e1) + + (0x2b88852d, 0x43d7a772) + 0 + + + (0x5194b6cb, 0x7e001786) + 0 + + + + (0x2d71872c, 0x4af9aa82) + + (0x0841694e, 0x28e40f42) + 0 + + + (0x52a5790c, 0x13d24266) + 0 + + + + (0x32d337b3, 0x44da5cbe) + + (0x1f046833, 0x21a8a876) + 1 + + + (0x0841694e, 0x28e40f42) + 1 + + + + (0x4dec0a97, 0x70c962ab) + + (0x558c587f, 0x223f3b66) + 0 + + + (0x1f046833, 0x21a8a876) + 0 + + + + (0x63796305, 0x4f357282) + + (0x4c1eab6f, 0x0e8c522c) + 0 + + + (0x71322e63, 0x41ba161a) + 0 + + + + (0x640c71b7, 0x1e64acbd) + + (0x1f046833, 0x21a8a876) + 1 + + + (0x4c1eab6f, 0x0e8c522c) + 1 + + + + + + (0x000054d7, 0x00005adf) + Compute Mean + + + (0x473d9a43, 0x97fc0a97) + 592 + + + (0x7234b86b, 0x2b8651a5) + 720 + + + + + (0x000054d7, 0x00005ae1) + Compute Covariance + + + (0x473d9a43, 0x97fc0a97) + 592 + + + (0x7234b86b, 0x2b8651a5) + 640 + + + + + + + (0x05377d7e, 0x41751bb3) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":592,"identifier":"(0x00001f6c, 0x000012a7)","name":"Display","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":831},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003bf6, 0x000002ba)","index":0,"name":"Default tab","parentIdentifier":"(0x00001f6c, 0x000012a7)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00005d22, 0x00004235)","index":0,"name":"Empty","parentIdentifier":"(0x00003bf6, 0x000002ba)","type":0}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x7b814cca, 0x271df6dd) + 475 + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Classification Riemann Classic Compute Reference Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + bci-examples + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/1.2-Riemann-Classic-SAMPLE-Training.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/1.2-Riemann-Classic-SAMPLE-Training.xml new file mode 100644 index 0000000..b6c644c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/1.2-Riemann-Classic-SAMPLE-Training.xml @@ -0,0 +1,1681 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x0028f139, 0x9f535b8a) + (0x330306dd, 0x74a95f98) + Data + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + + + (0x00659961, 0xe97d5856) + (0x79a9edeb, 0x245d83fc) + Directory + ${Player_ScenarioDirectory}/ + ${Player_ScenarioDirectory} + + + (0x0030836f, 0x32c229e2) + (0x330306dd, 0x74a95f98) + Model Filename + Classification-Riemann-Classic-Training-Model.xml + Riemann-Classic-Training-Model.xml + + + (0x005b3a0a, 0x9606a42e) + (0x330306dd, 0x74a95f98) + Mean + Mean-Riemann.csv + Mean-Riemann.csv + + + (0x000045cd, 0xbf65ab3a) + (0x2c132d6e, 0x44ab0d97) + Stimulation Class 1 + OVTK_GDF_Left + OVTK_GDF_Left + + + (0x003d07e7, 0x47d37506) + (0x2c132d6e, 0x44ab0d97) + Stimulation Class 2 + OVTK_GDF_Right + OVTK_GDF_Right + + + (0x00417469, 0x63bdca5e) + (0x007deef9, 0x2f3e95c6) + Log Level + Information + Information + + + + + + + (0x0000241d, 0x0000786b) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786c) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000044b9, 0x00003dab) + Tangent Space + (0x7c265dba, 0x202c1f70) + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix + + + + + (0x17341935, 0x152ff448) + Output Feature Vector + + + + + (0x2cdb2f0b, 0x12f231ea) + Tangent Space + true + true + false + + + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix (CSV, empty for Identity) + ${Player_ScenarioDirectory}/Mean.csv + $var{Directory}/$var{Mean} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0xbfd23954, 0x40c20e2d) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000044b9, 0x00003dac) + Tangent Space + (0x7c265dba, 0x202c1f70) + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix + + + + + (0x17341935, 0x152ff448) + Output Feature Vector + + + + + (0x2cdb2f0b, 0x12f231ea) + Tangent Space + true + true + false + + + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix (CSV, empty for Identity) + ${Player_ScenarioDirectory}/Mean.csv + $var{Directory}/$var{Mean} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xbfd23954, 0x40c20e2d) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005062, 0x000009d7) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + $var{Directory}/$var{Model Filename} + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + $var{Stimulation Class 1} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + $var{Stimulation Class 2} + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA)(1) + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 768 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0177ec55) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005607, 0x00006ea6) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 832 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0059275b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x0000791d) + Tangent Left + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 768 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x0000791e) + Tangent Right + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 768 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0841694e, 0x28e40f42) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.500000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + $var{Stimulation Class 2} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + + + (0x11a6038b, 0x7157c283) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Data} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005e1c11) + + + + + (0x1396fde6, 0x1c649749) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc7a) + + + (0xfba64161, 0x65304e21) + + + + + + (0x1f046833, 0x21a8a876) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001882ae) + + + (0xfba64161, 0x65304e21) + + + + + + (0x2b88852d, 0x43d7a772) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4c1eab6f, 0x0e8c522c) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.500000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + $var{Stimulation Class 1} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + + + (0x5045ebd9, 0x67325c0b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e001786) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x52a5790c, 0x13d24266) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc72) + + + + + (0x558c587f, 0x223f3b66) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a79f8) + + + + + (0x71322e63, 0x41ba161a) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00183f8d) + + + + + + + (0x000003e3, 0x0000571b) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x5045ebd9, 0x67325c0b) + 0 + + + + (0x00002363, 0x00000391) + + (0x11a6038b, 0x7157c283) + 1 + + + (0x2b88852d, 0x43d7a772) + 0 + + + + (0x00003a5f, 0x000071e4) + + (0x52a5790c, 0x13d24266) + 0 + + + (0x0000241d, 0x0000786c) + 0 + + + + (0x00004927, 0x000042c3) + + (0x000044b9, 0x00003dab) + 0 + + + (0x000078f6, 0x0000791d) + 0 + + + + (0x00004eb1, 0x000045d0) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x1f046833, 0x21a8a876) + 1 + + + + (0x00005363, 0x00001229) + + (0x00005062, 0x000009d7) + 0 + + + (0x00005607, 0x00006ea6) + 0 + + + + (0x000053a4, 0x000073b5) + + (0x71322e63, 0x41ba161a) + 0 + + + (0x0000241d, 0x0000786b) + 0 + + + + (0x00005612, 0x0000591e) + + (0x11a6038b, 0x7157c283) + 2 + + + (0x1396fde6, 0x1c649749) + 0 + + + + (0x00005bee, 0x00000d2a) + + (0x1f046833, 0x21a8a876) + 1 + + + (0x00005062, 0x000009d7) + 0 + + + + (0x0000634d, 0x00007fcf) + + (0x0000241d, 0x0000786c) + 0 + + + (0x000044b9, 0x00003dac) + 0 + + + + (0x00006c36, 0x000012e4) + + (0x000044b9, 0x00003dac) + 0 + + + (0x00005062, 0x000009d7) + 2 + + + + (0x00007095, 0x000016f0) + + (0x000044b9, 0x00003dac) + 0 + + + (0x000078f6, 0x0000791e) + 0 + + + + (0x000074b0, 0x00000a55) + + (0x0000241d, 0x0000786b) + 0 + + + (0x000044b9, 0x00003dab) + 0 + + + + (0x00007af8, 0x00000c53) + + (0x5194b6cb, 0x7e001786) + 0 + + + (0x558c587f, 0x223f3b66) + 0 + + + + (0x00007e87, 0x00001ca6) + + (0x000044b9, 0x00003dab) + 0 + + + (0x00005062, 0x000009d7) + 1 + + + + (0x0fb9552e, 0x72e04408) + + (0x1f046833, 0x21a8a876) + 0 + + + (0x0841694e, 0x28e40f42) + 0 + + + + (0x1658a066, 0x2ce1e19e) + + (0x1f046833, 0x21a8a876) + 0 + + + (0x4c1eab6f, 0x0e8c522c) + 0 + + + + (0x1e23e99e, 0x6b3cf5e1) + + (0x2b88852d, 0x43d7a772) + 0 + + + (0x5194b6cb, 0x7e001786) + 0 + + + + (0x2d71872c, 0x4af9aa82) + + (0x0841694e, 0x28e40f42) + 0 + + + (0x52a5790c, 0x13d24266) + 0 + + + + (0x32d337b3, 0x44da5cbe) + + (0x1f046833, 0x21a8a876) + 1 + + + (0x0841694e, 0x28e40f42) + 1 + + + + (0x4dec0a97, 0x70c962ab) + + (0x558c587f, 0x223f3b66) + 0 + + + (0x1f046833, 0x21a8a876) + 0 + + + + (0x63796305, 0x4f357282) + + (0x4c1eab6f, 0x0e8c522c) + 0 + + + (0x71322e63, 0x41ba161a) + 0 + + + + (0x640c71b7, 0x1e64acbd) + + (0x1f046833, 0x21a8a876) + 1 + + + (0x4c1eab6f, 0x0e8c522c) + 1 + + + + + + (0x000054d7, 0x00005ae2) + Display / Classify + + + (0x473d9a43, 0x97fc0a97) + 544 + + + (0x7234b86b, 0x2b8651a5) + 768 + + + + + (0x000054d7, 0x00005ae4) + Compute Covariance + + + (0x473d9a43, 0x97fc0a97) + 544 + + + (0x7234b86b, 0x2b8651a5) + 640 + + + + + (0x000054d7, 0x00005ae5) + Compute Feature +(Need to run previous scenario) + + + (0x473d9a43, 0x97fc0a97) + 544 + + + (0x7234b86b, 0x2b8651a5) + 704 + + + + + + + (0x05377d7e, 0x41751bb3) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":592,"identifier":"(0x00001f6c, 0x000012a7)","name":"Display","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":826},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003bf6, 0x000002ba)","index":0,"name":"Default tab","parentIdentifier":"(0x00001f6c, 0x000012a7)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":271,"identifier":"(0x00000a43, 0x00000e61)","index":0,"maxDividerPosition":547,"name":"Vertical split","parentIdentifier":"(0x00003bf6, 0x000002ba)","type":4},{"boxIdentifier":"(0x000078f6, 0x0000791d)","childCount":0,"identifier":"(0x000062bf, 0x00005ccc)","index":0,"parentIdentifier":"(0x00000a43, 0x00000e61)","type":3},{"boxIdentifier":"(0x000078f6, 0x0000791e)","childCount":0,"identifier":"(0x00006992, 0x000009bf)","index":1,"parentIdentifier":"(0x00000a43, 0x00000e61)","type":3}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x7b814cca, 0x271df6dd) + 475 + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Classification Riemann Classic Training Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + bci-examples + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/1.3-Riemann-Classic-SAMPLE-Testing.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/1.3-Riemann-Classic-SAMPLE-Testing.xml new file mode 100644 index 0000000..436dbdd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/1.3-Riemann-Classic-SAMPLE-Testing.xml @@ -0,0 +1,1340 @@ + + 2 + OpenViBE Designer + 3.0.0 + + + (0x001f9ac9, 0x8d7740bc) + (0x330306dd, 0x74a95f98) + Data + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + + + (0x0011d622, 0x7d4c80a8) + (0x79a9edeb, 0x245d83fc) + Directory + ${Player_ScenarioDirectory}/ + ${Player_ScenarioDirectory} + + + (0x005d306a, 0x9f30dd54) + (0x330306dd, 0x74a95f98) + Model Filename + Classification-Riemann-Classic-Training-Model.xml + Riemann-Classic-Training-Model.xml + + + (0x00618c72, 0xe530a4c0) + (0x330306dd, 0x74a95f98) + Mean + Mean-Riemann.csv + Mean-Riemann.csv + + + (0x0064fe21, 0x6acf20ec) + (0x2c132d6e, 0x44ab0d97) + Stimulation Class 1 + OVTK_GDF_Left + OVTK_GDF_Left + + + (0x0017cd5f, 0xae3155d8) + (0x2c132d6e, 0x44ab0d97) + Stimulation Class 2 + OVTK_GDF_Right + OVTK_GDF_Right + + + (0x00006ead, 0x71386450) + (0x007deef9, 0x2f3e95c6) + Log Level + Information + Information + + + + + + + (0x00000d0c, 0x00002cdb) + Confusion Matrix + (0x1ab625da, 0x3b2502ce) + + + (0x6f752dd0, 0x082a321e) + Targets + + + (0x6f752dd0, 0x082a321e) + Classification results + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Percentages + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Sums + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_StimulationId_Label_00 + $var{Stimulation Class 1} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_StimulationId_Label_01 + $var{Stimulation Class 2} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x4e7b798a, 0x183beafb) + (0x05cf579a, 0x80d8b480) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00de8e03) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001838, 0x00000242) + Confusion Matrix + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 656 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006eaeb9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786c) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000044b9, 0x00003dac) + Tangent Space + (0x7c265dba, 0x202c1f70) + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix + + + + + (0x17341935, 0x152ff448) + Output Feature Vector + + + + + (0x2cdb2f0b, 0x12f231ea) + Tangent Space + true + true + false + + + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix (CSV, empty for Identity) + ${Player_ScenarioDirectory}/Mean.csv + $var{Directory}/$var{Mean} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0xbfd23954, 0x40c20e2d) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006be7, 0x0000270b) + Graz visualization + (0x00dd290d, 0x5f142820) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Show feedback + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + true + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive feedback only + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0x602ceb3f, 0xd3bc74aa) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00007474, 0x00002f73) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + $var{Directory}/$var{Model Filename} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x11a6038b, 0x7157c283) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Data} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005e1c11) + + + + + (0x1396fde6, 0x1c649749) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc7a) + + + (0xfba64161, 0x65304e21) + + + + + + (0x1396fde6, 0x1c64974a) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc7a) + + + (0xfba64161, 0x65304e21) + + + + + + (0x2b88852d, 0x43d7a772) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x46e10f90, 0x7f1009d3) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x544a003e, 0x6dcba5f6) + Input - A + + + + + (0x544a003e, 0x6dcba5f6) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5045ebd9, 0x67325c0b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e001786) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x558c587f, 0x223f3b66) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a79f8) + + + + + (0x71322e63, 0x41ba161a) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00183f8d) + + + + + + + (0x00000a31, 0x00007248) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x00006be7, 0x0000270b) + 0 + + + + (0x0000146e, 0x00003bf7) + + (0x00007474, 0x00002f73) + 1 + + + (0x46e10f90, 0x7f1009d3) + 0 + + + + (0x00001878, 0x0000796f) + + (0x11a6038b, 0x7157c283) + 2 + + + (0x1396fde6, 0x1c64974a) + 0 + + + + (0x000020bf, 0x00001171) + + (0x000044b9, 0x00003dac) + 0 + + + (0x00007474, 0x00002f73) + 0 + + + + (0x00002175, 0x00007990) + + (0x46e10f90, 0x7f1009d3) + 0 + + + (0x00006be7, 0x0000270b) + 1 + + + + (0x000022f3, 0x00007475) + + (0x1396fde6, 0x1c64974a) + 0 + + + (0x1396fde6, 0x1c649749) + 0 + + + + (0x00002363, 0x00000391) + + (0x11a6038b, 0x7157c283) + 1 + + + (0x2b88852d, 0x43d7a772) + 0 + + + + (0x0000426f, 0x00006d4b) + + (0x00000d0c, 0x00002cdb) + 0 + + + (0x00001838, 0x00000242) + 0 + + + + (0x000043e3, 0x00001e1d) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x00000d0c, 0x00002cdb) + 0 + + + + (0x000051de, 0x00002a6d) + + (0x1396fde6, 0x1c64974a) + 0 + + + (0x5045ebd9, 0x67325c0b) + 0 + + + + (0x00005214, 0x00003c0a) + + (0x00007474, 0x00002f73) + 0 + + + (0x00000d0c, 0x00002cdb) + 1 + + + + (0x000057f7, 0x00002085) + + (0x558c587f, 0x223f3b66) + 0 + + + (0x71322e63, 0x41ba161a) + 0 + + + + (0x0000634d, 0x00007fcf) + + (0x0000241d, 0x0000786c) + 0 + + + (0x000044b9, 0x00003dac) + 0 + + + + (0x00006cdb, 0x00004d41) + + (0x5194b6cb, 0x7e001786) + 0 + + + (0x558c587f, 0x223f3b66) + 0 + + + + (0x00006fd9, 0x00007876) + + (0x71322e63, 0x41ba161a) + 0 + + + (0x0000241d, 0x0000786c) + 0 + + + + (0x1e23e99e, 0x6b3cf5e1) + + (0x2b88852d, 0x43d7a772) + 0 + + + (0x5194b6cb, 0x7e001786) + 0 + + + + + + (0x000054d7, 0x00005adf) + Compute Feature +(Need to run 2 previous scenarios) + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 512 + + + + + (0x000054d7, 0x00005ae3) + Classifier processor +(Need to run previous scenario) + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 576 + + + + + (0x000054d7, 0x00005ae6) + Compute Covariance + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 448 + + + + + + + (0x11f491f3, 0x047d65a5) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x000072ec, 0x00006065)","name":"","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":695},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006a3f, 0x00006097)","index":0,"name":"Default tab","parentIdentifier":"(0x000072ec, 0x00006065)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":336,"identifier":"(0x00004386, 0x00006f22)","index":0,"maxDividerPosition":676,"name":"Horizontal split","parentIdentifier":"(0x00006a3f, 0x00006097)","type":5},{"boxIdentifier":"(0x00006be7, 0x0000270b)","childCount":0,"identifier":"(0x00007839, 0x00001ae3)","index":0,"parentIdentifier":"(0x00004386, 0x00006f22)","type":3},{"boxIdentifier":"(0x00001838, 0x00000242)","childCount":0,"identifier":"(0x00003898, 0x0000309e)","index":1,"parentIdentifier":"(0x00004386, 0x00006f22)","type":3}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x7b814cca, 0x271df6dd) + 475 + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Classification Riemann Classic Testing Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + bci-examples + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/2.1-Matrix-Classifier-Training.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/2.1-Matrix-Classifier-Training.xml new file mode 100644 index 0000000..238f3c2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/2.1-Matrix-Classifier-Training.xml @@ -0,0 +1,1468 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x0028f139, 0x9f535b8a) + (0x330306dd, 0x74a95f98) + Data + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + + + (0x00659961, 0xe97d5856) + (0x79a9edeb, 0x245d83fc) + Directory + ${Player_ScenarioDirectory}/ + ${Player_ScenarioDirectory} + + + (0x0030836f, 0x32c229e2) + (0x330306dd, 0x74a95f98) + Model Filename + Classification-Riemann-Classic-Training-Model.xml + Riemann-Training-Model.xml + + + (0x005b3a0a, 0x9606a42e) + (0x330306dd, 0x74a95f98) + Mean + Mean-Riemann.csv + Mean-Riemann.csv + + + (0x000045cd, 0xbf65ab3a) + (0x2c132d6e, 0x44ab0d97) + Stimulation Class 1 + OVTK_GDF_Left + OVTK_GDF_Left + + + (0x003d07e7, 0x47d37506) + (0x2c132d6e, 0x44ab0d97) + Stimulation Class 2 + OVTK_GDF_Right + OVTK_GDF_Right + + + (0x00417469, 0x63bdca5e) + (0xa88b3667, 0x0871638c) + Log Level + Information + Information + + + + + + + (0x0000241d, 0x0000786b) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786c) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000028d4, 0x0000144a) + Matrix Classifier Trainer + (0xc0b79b42, 0x4150c837) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 1 + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Tran-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/my-classifier.xml + ${Player_ScenarioDirectory}/$var{Model Filename} + false + + + (0x5261636b, 0x436c6173) + Method + Minimum Distance to Mean (MDM) + Minimum Distance to Mean (MDM) + false + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Riemann + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + $var{Stimulation Class 1} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + $var{Stimulation Class 2} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0xbe345a8a, 0x87754e57) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005607, 0x00006ea6) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 784 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0059275b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x0000791d) + Cov Left + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x0000791e) + Cov Right + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0841694e, 0x28e40f42) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.500000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + $var{Stimulation Class 2} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + + + (0x11a6038b, 0x7157c283) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Data} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005e1c11) + + + + + (0x1396fde6, 0x1c649749) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc7a) + + + (0xfba64161, 0x65304e21) + + + + + + (0x1f046833, 0x21a8a876) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001882ae) + + + (0xfba64161, 0x65304e21) + + + + + + (0x2b88852d, 0x43d7a772) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4c1eab6f, 0x0e8c522c) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.500000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + $var{Stimulation Class 1} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + + + (0x5045ebd9, 0x67325c0b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e001786) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x52a5790c, 0x13d24266) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc72) + + + + + (0x558c587f, 0x223f3b66) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a79f8) + + + + + (0x71322e63, 0x41ba161a) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00183f8d) + + + + + + + (0x000003e3, 0x0000571b) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x5045ebd9, 0x67325c0b) + 0 + + + + (0x0000126c, 0x000015c1) + + (0x0000241d, 0x0000786b) + 0 + + + (0x000028d4, 0x0000144a) + 1 + + + + (0x00001a91, 0x00006224) + + (0x0000241d, 0x0000786b) + 0 + + + (0x000078f6, 0x0000791d) + 0 + + + + (0x00002363, 0x00000391) + + (0x11a6038b, 0x7157c283) + 1 + + + (0x2b88852d, 0x43d7a772) + 0 + + + + (0x000032d8, 0x00005f68) + + (0x000028d4, 0x0000144a) + 0 + + + (0x00005607, 0x00006ea6) + 0 + + + + (0x00003a5f, 0x000071e4) + + (0x52a5790c, 0x13d24266) + 0 + + + (0x0000241d, 0x0000786c) + 0 + + + + (0x00004eb1, 0x000045d0) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x1f046833, 0x21a8a876) + 1 + + + + (0x000053a4, 0x000073b5) + + (0x71322e63, 0x41ba161a) + 0 + + + (0x0000241d, 0x0000786b) + 0 + + + + (0x0000545b, 0x00001f86) + + (0x1f046833, 0x21a8a876) + 1 + + + (0x000028d4, 0x0000144a) + 0 + + + + (0x00005612, 0x0000591e) + + (0x11a6038b, 0x7157c283) + 2 + + + (0x1396fde6, 0x1c649749) + 0 + + + + (0x000056e2, 0x00000204) + + (0x0000241d, 0x0000786c) + 0 + + + (0x000028d4, 0x0000144a) + 2 + + + + (0x00006ea7, 0x0000528f) + + (0x0000241d, 0x0000786c) + 0 + + + (0x000078f6, 0x0000791e) + 0 + + + + (0x00007af8, 0x00000c53) + + (0x5194b6cb, 0x7e001786) + 0 + + + (0x558c587f, 0x223f3b66) + 0 + + + + (0x0fb9552e, 0x72e04408) + + (0x1f046833, 0x21a8a876) + 0 + + + (0x0841694e, 0x28e40f42) + 0 + + + + (0x1658a066, 0x2ce1e19e) + + (0x1f046833, 0x21a8a876) + 0 + + + (0x4c1eab6f, 0x0e8c522c) + 0 + + + + (0x1e23e99e, 0x6b3cf5e1) + + (0x2b88852d, 0x43d7a772) + 0 + + + (0x5194b6cb, 0x7e001786) + 0 + + + + (0x2d71872c, 0x4af9aa82) + + (0x0841694e, 0x28e40f42) + 0 + + + (0x52a5790c, 0x13d24266) + 0 + + + + (0x32d337b3, 0x44da5cbe) + + (0x1f046833, 0x21a8a876) + 1 + + + (0x0841694e, 0x28e40f42) + 1 + + + + (0x4dec0a97, 0x70c962ab) + + (0x558c587f, 0x223f3b66) + 0 + + + (0x1f046833, 0x21a8a876) + 0 + + + + (0x63796305, 0x4f357282) + + (0x4c1eab6f, 0x0e8c522c) + 0 + + + (0x71322e63, 0x41ba161a) + 0 + + + + (0x640c71b7, 0x1e64acbd) + + (0x1f046833, 0x21a8a876) + 1 + + + (0x4c1eab6f, 0x0e8c522c) + 1 + + + + + + (0x000054d7, 0x00005ae2) + Display / Classify + + + (0x473d9a43, 0x97fc0a97) + 544 + + + (0x7234b86b, 0x2b8651a5) + 720 + + + + + (0x000054d7, 0x00005ae4) + Compute Covariance + + + (0x473d9a43, 0x97fc0a97) + 544 + + + (0x7234b86b, 0x2b8651a5) + 640 + + + + + + + (0x05377d7e, 0x41751bb3) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":592,"identifier":"(0x00001f6c, 0x000012a7)","name":"Display","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1348},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003bf6, 0x000002ba)","index":0,"name":"Default tab","parentIdentifier":"(0x00001f6c, 0x000012a7)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":665,"identifier":"(0x00005b3c, 0x000043dd)","index":0,"maxDividerPosition":1335,"name":"Horizontal split","parentIdentifier":"(0x00003bf6, 0x000002ba)","type":5},{"boxIdentifier":"(0x000078f6, 0x0000791d)","childCount":0,"identifier":"(0x000062bf, 0x00005ccc)","index":0,"parentIdentifier":"(0x00005b3c, 0x000043dd)","type":3},{"boxIdentifier":"(0x000078f6, 0x0000791e)","childCount":0,"identifier":"(0x00006992, 0x000009bf)","index":1,"parentIdentifier":"(0x00005b3c, 0x000043dd)","type":3}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x7b814cca, 0x271df6dd) + 475 + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Matrix Classification Training Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + bci-examples + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/2.2-Matrix-Classifier-Testing.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/2.2-Matrix-Classifier-Testing.xml new file mode 100644 index 0000000..6b21cd7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/2.2-Matrix-Classifier-Testing.xml @@ -0,0 +1,1190 @@ + + 2 + OpenViBE Designer + 3.0.0 + + + (0x001f9ac9, 0x8d7740bc) + (0x330306dd, 0x74a95f98) + Data + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + + + (0x0011d622, 0x7d4c80a8) + (0x79a9edeb, 0x245d83fc) + Directory + ${Player_ScenarioDirectory}/ + ${Player_ScenarioDirectory} + + + (0x005d306a, 0x9f30dd54) + (0x330306dd, 0x74a95f98) + Model Filename + Classification-Riemann-Classic-Training-Model.xml + Riemann-Training-Model.xml + + + (0x00618c72, 0xe530a4c0) + (0x330306dd, 0x74a95f98) + Mean + Mean-Riemann.csv + Mean-Riemann.csv + + + (0x0064fe21, 0x6acf20ec) + (0x2c132d6e, 0x44ab0d97) + Stimulation Class 1 + OVTK_GDF_Left + OVTK_GDF_Left + + + (0x0017cd5f, 0xae3155d8) + (0x2c132d6e, 0x44ab0d97) + Stimulation Class 2 + OVTK_GDF_Right + OVTK_GDF_Right + + + (0x00006ead, 0x71386450) + (0x007deef9, 0x2f3e95c6) + Log Level + Information + Information + + + + + + + (0x00000d0c, 0x00002cdb) + Confusion Matrix + (0x1ab625da, 0x3b2502ce) + + + (0x6f752dd0, 0x082a321e) + Targets + + + (0x6f752dd0, 0x082a321e) + Classification results + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Percentages + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Sums + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_StimulationId_Label_00 + $var{Stimulation Class 1} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_StimulationId_Label_01 + $var{Stimulation Class 2} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 656 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x05cf579a, 0x80d8b480) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00de8e03) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001838, 0x00000242) + Confusion Matrix + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006eaeb9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786c) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002816, 0x00002fc6) + Matrix Classifier Processor + (0x918f6952, 0xb22ddf0d) + + + (0x6f752dd0, 0x082a321e) + Expected Label + + + (0x544a003e, 0x6dcba5f6) + Input Matrix + + + + + (0x6f752dd0, 0x082a321e) + Label + + + (0x544a003e, 0x6dcba5f6) + Distance + + + (0x544a003e, 0x6dcba5f6) + Probability + + + + + (0x330306dd, 0x74a95f98) + Filename to load classifier model + ${Player_ScenarioDirectory}/input-classifier.xml + $var{Directory}/$var{Model Filename} + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/output-classifier.xml + ${Player_ScenarioDirectory}/output-classifier.xml + false + + + (0x5261636b, 0x41646170) + Adaptation + No + None + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0xb85fcd48, 0x1d5e5748) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00006be7, 0x0000270b) + Graz visualization + (0x00dd290d, 0x5f142820) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Show feedback + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + true + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive feedback only + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 688 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0x602ceb3f, 0xd3bc74aa) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x11a6038b, 0x7157c283) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Data} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005e1c11) + + + + + (0x1396fde6, 0x1c649749) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc7a) + + + (0xfba64161, 0x65304e21) + + + + + + (0x1396fde6, 0x1c64974a) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc7a) + + + (0xfba64161, 0x65304e21) + + + + + + (0x2b88852d, 0x43d7a772) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5045ebd9, 0x67325c0b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e001786) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x558c587f, 0x223f3b66) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a79f8) + + + + + (0x71322e63, 0x41ba161a) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00183f8d) + + + + + + + (0x00000a31, 0x00007248) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x00006be7, 0x0000270b) + 0 + + + + (0x00001878, 0x0000796f) + + (0x11a6038b, 0x7157c283) + 2 + + + (0x1396fde6, 0x1c64974a) + 0 + + + + (0x000022f3, 0x00007475) + + (0x1396fde6, 0x1c64974a) + 0 + + + (0x1396fde6, 0x1c649749) + 0 + + + + (0x00002363, 0x00000391) + + (0x11a6038b, 0x7157c283) + 1 + + + (0x2b88852d, 0x43d7a772) + 0 + + + + (0x0000426f, 0x00006d4b) + + (0x00000d0c, 0x00002cdb) + 0 + + + (0x00001838, 0x00000242) + 0 + + + + (0x000043e3, 0x00001e1d) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x00000d0c, 0x00002cdb) + 0 + + + + (0x000051de, 0x00002a6d) + + (0x1396fde6, 0x1c64974a) + 0 + + + (0x5045ebd9, 0x67325c0b) + 0 + + + + (0x000057f7, 0x00002085) + + (0x558c587f, 0x223f3b66) + 0 + + + (0x71322e63, 0x41ba161a) + 0 + + + + (0x00006448, 0x000061dc) + + (0x00002816, 0x00002fc6) + 1 + + + (0x00006be7, 0x0000270b) + 1 + + + + (0x00006847, 0x00005d1c) + + (0x00002816, 0x00002fc6) + 0 + + + (0x00000d0c, 0x00002cdb) + 1 + + + + (0x00006cdb, 0x00004d41) + + (0x5194b6cb, 0x7e001786) + 0 + + + (0x558c587f, 0x223f3b66) + 0 + + + + (0x00006fd9, 0x00007876) + + (0x71322e63, 0x41ba161a) + 0 + + + (0x0000241d, 0x0000786c) + 0 + + + + (0x00007cff, 0x00003710) + + (0x0000241d, 0x0000786c) + 0 + + + (0x00002816, 0x00002fc6) + 1 + + + + (0x1e23e99e, 0x6b3cf5e1) + + (0x2b88852d, 0x43d7a772) + 0 + + + (0x5194b6cb, 0x7e001786) + 0 + + + + + + (0x000054d7, 0x00005ae3) + Classifier processor +(Need to run previous scenario) + + + (0x473d9a43, 0x97fc0a97) + 512 + + + (0x7234b86b, 0x2b8651a5) + 576 + + + + + (0x000054d7, 0x00005ae6) + Compute Covariance + + + (0x473d9a43, 0x97fc0a97) + 512 + + + (0x7234b86b, 0x2b8651a5) + 512 + + + + + + + (0x11f491f3, 0x047d65a5) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x000072ec, 0x00006065)","name":"","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":695},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006a3f, 0x00006097)","index":0,"name":"Default tab","parentIdentifier":"(0x000072ec, 0x00006065)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":336,"identifier":"(0x00004386, 0x00006f22)","index":0,"maxDividerPosition":676,"name":"Horizontal split","parentIdentifier":"(0x00006a3f, 0x00006097)","type":5},{"boxIdentifier":"(0x00006be7, 0x0000270b)","childCount":0,"identifier":"(0x00007839, 0x00001ae3)","index":0,"parentIdentifier":"(0x00004386, 0x00006f22)","type":3},{"boxIdentifier":"(0x00001838, 0x00000242)","childCount":0,"identifier":"(0x00003898, 0x0000309e)","index":1,"parentIdentifier":"(0x00004386, 0x00006f22)","type":3}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x7b814cca, 0x271df6dd) + 475 + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Matrix Classification Testing Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + bci-examples + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/scripts/stimulation-regulator.lua b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/scripts/stimulation-regulator.lua new file mode 100644 index 0000000..cdbe619 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/bci-examples/scripts/stimulation-regulator.lua @@ -0,0 +1,23 @@ + +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + delay = box:get_setting(2) + iteration = box:get_setting(3) + increment = box:get_setting(4) == "true" + + +end + +function process(box) + local t = 0 + local stimulation = OVTK_StimulationId_Label_01 + + -- manages Timeout + for i=1,iteration do + box:send_stimulation(1, stimulation, t, 0) + t = t + delay + if increment then stimulation = stimulation + 0x00000001 end + end +end diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/1.1-Covariance-Matrix-Calculator.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/1.1-Covariance-Matrix-Calculator.xml new file mode 100644 index 0000000..c6fa357 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/1.1-Covariance-Matrix-Calculator.xml @@ -0,0 +1,1754 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x0034d231, 0x6b35b305) + (0x330306dd, 0x74a95f98) + Data + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + + + (0x006179ce, 0x0f96cd84) + (0xa88b3667, 0x0871638c) + Log Level + Information + Information + + + + + + + (0x000014f9, 0x00004b50) + Sample + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 30 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000241d, 0x00007868) + COV + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Covariance + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x00007869) + COR + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Pearson Correlation + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786a) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786d) + SCM + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Normalized Spatial Covariance Matrix (SCM) + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786e) + IDE + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Identity + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 1120 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786f) + MCD + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Identity + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x00007870) + OAS + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Oracle Approximating Shrinkage (OAS) + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000586a, 0x00001f44) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x00007916) + COV + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x00007917) + SCM + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x00007918) + MCD + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x00007919) + LWF + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x0000791a) + OAS + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x0000791b) + COR + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x0000791c) + IDE + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 1120 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x11a6038b, 0x7157c283) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Data} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005e1c11) + + + + + (0x2b88852d, 0x43d7a772) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e001786) + C3;C4;FC3;FC4 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x558c587f, 0x223f3b66) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a79f8) + + + + + + + (0x000002d9, 0x00000166) + + (0x0000586a, 0x00001f44) + 0 + + + (0x0000241d, 0x00007870) + 0 + + + + (0x00000a7e, 0x00003f07) + + (0x0000586a, 0x00001f44) + 0 + + + (0x0000241d, 0x0000786e) + 0 + + + + (0x00000bfd, 0x00000a7c) + + (0x5194b6cb, 0x7e001786) + 0 + + + (0x558c587f, 0x223f3b66) + 0 + + + + (0x00000e21, 0x00005332) + + (0x0000241d, 0x0000786d) + 0 + + + (0x000078f6, 0x00007917) + 0 + + + + (0x000013e3, 0x00001234) + + (0x0000586a, 0x00001f44) + 0 + + + (0x0000241d, 0x0000786f) + 0 + + + + (0x00001619, 0x00007ce6) + + (0x0000586a, 0x00001f44) + 0 + + + (0x0000241d, 0x0000786a) + 0 + + + + (0x00001edb, 0x00002b0f) + + (0x0000241d, 0x00007870) + 0 + + + (0x000078f6, 0x0000791a) + 0 + + + + (0x00002090, 0x000072dd) + + (0x0000241d, 0x0000786a) + 0 + + + (0x000078f6, 0x00007919) + 0 + + + + (0x000023e3, 0x00002242) + + (0x0000241d, 0x00007868) + 0 + + + (0x000078f6, 0x00007916) + 0 + + + + (0x00002551, 0x0000620c) + + (0x2b88852d, 0x43d7a772) + 0 + + + (0x5194b6cb, 0x7e001786) + 0 + + + + (0x000036fa, 0x00002167) + + (0x0000241d, 0x0000786e) + 0 + + + (0x000078f6, 0x0000791c) + 0 + + + + (0x00003873, 0x0000069a) + + (0x0000586a, 0x00001f44) + 0 + + + (0x0000241d, 0x00007868) + 0 + + + + (0x00004034, 0x000058ef) + + (0x558c587f, 0x223f3b66) + 0 + + + (0x0000586a, 0x00001f44) + 0 + + + + (0x000043f4, 0x0000072e) + + (0x11a6038b, 0x7157c283) + 1 + + + (0x2b88852d, 0x43d7a772) + 0 + + + + (0x00005ae8, 0x00002bac) + + (0x0000586a, 0x00001f44) + 0 + + + (0x0000241d, 0x00007869) + 0 + + + + (0x00005b65, 0x00005426) + + (0x0000241d, 0x0000786f) + 0 + + + (0x000078f6, 0x00007918) + 0 + + + + (0x0000797c, 0x00000c93) + + (0x0000586a, 0x00001f44) + 0 + + + (0x0000241d, 0x0000786d) + 0 + + + + (0x00007a0d, 0x00002c8a) + + (0x558c587f, 0x223f3b66) + 0 + + + (0x000014f9, 0x00004b50) + 0 + + + + (0x00007c17, 0x0000284b) + + (0x0000241d, 0x00007869) + 0 + + + (0x000078f6, 0x0000791b) + 0 + + + + + + (0x000054d7, 0x00005ae1) + Displays + + + + + + (0x473d9a43, 0x97fc0a97) + 688 + + + (0x7234b86b, 0x2b8651a5) + 704 + + + + + (0x000054d7, 0x00005ae2) + Input Signal + + + + + + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 688 + + + (0x7234b86b, 0x2b8651a5) + 288 + + + + + (0x000054d7, 0x00005ae3) + Signal Processing + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 688 + + + (0x7234b86b, 0x2b8651a5) + 464 + + + + + (0x000064a5, 0x0000577d) + Unimplemented Algorithms are in disabled Boxes + + + (0x473d9a43, 0x97fc0a97) + 832 + + + (0x7234b86b, 0x2b8651a5) + 784 + + + + + (0x000064a5, 0x0000577e) + Methods + + + + + + (0x473d9a43, 0x97fc0a97) + 688 + + + (0x7234b86b, 0x2b8651a5) + 608 + + + + + + + (0x0000273f, 0x00001ea9) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":812,"identifier":"(0x00002c23, 0x00001297)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1051},{"boxIdentifier":"(0x000078f6, 0x00007918)","childCount":0,"identifier":"(0x00005284, 0x00005ba9)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00000f96, 0x00007c7e)","index":0,"name":"Default tab","parentIdentifier":"(0x00002c23, 0x00001297)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":550,"identifier":"(0x0000430f, 0x00001764)","index":0,"maxDividerPosition":767,"name":"Vertical split","parentIdentifier":"(0x00000f96, 0x00007c7e)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":86,"identifier":"(0x00000352, 0x000053f1)","index":0,"maxDividerPosition":529,"name":"Vertical split","parentIdentifier":"(0x0000430f, 0x00001764)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":505,"identifier":"(0x0000429b, 0x000044c9)","index":1,"maxDividerPosition":1015,"name":"Horizontal split","parentIdentifier":"(0x0000430f, 0x00001764)","type":5},{"boxIdentifier":"(0x000014f9, 0x00004b50)","childCount":0,"identifier":"(0x00007e49, 0x00004e1b)","index":0,"parentIdentifier":"(0x00000352, 0x000053f1)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":211,"identifier":"(0x000004a2, 0x000031c8)","index":1,"maxDividerPosition":427,"name":"Vertical split","parentIdentifier":"(0x00000352, 0x000053f1)","type":4},{"boxIdentifier":"(0x000078f6, 0x00007917)","childCount":0,"identifier":"(0x00002f95, 0x0000272f)","index":0,"parentIdentifier":"(0x0000429b, 0x000044c9)","type":3},{"boxIdentifier":"(0x000078f6, 0x0000791a)","childCount":0,"identifier":"(0x00004f20, 0x00006817)","index":1,"parentIdentifier":"(0x0000429b, 0x000044c9)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":489,"identifier":"(0x00005f20, 0x00000424)","index":0,"maxDividerPosition":983,"name":"Horizontal split","parentIdentifier":"(0x000004a2, 0x000031c8)","type":5},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":489,"identifier":"(0x00001469, 0x00005a12)","index":1,"maxDividerPosition":983,"name":"Horizontal split","parentIdentifier":"(0x000004a2, 0x000031c8)","type":5},{"boxIdentifier":"(0x000078f6, 0x00007916)","childCount":0,"identifier":"(0x00002615, 0x0000486d)","index":0,"parentIdentifier":"(0x00005f20, 0x00000424)","type":3},{"boxIdentifier":"(0x000078f6, 0x0000791b)","childCount":0,"identifier":"(0x00006921, 0x000060c4)","index":1,"parentIdentifier":"(0x00005f20, 0x00000424)","type":3},{"boxIdentifier":"(0x000078f6, 0x00007919)","childCount":0,"identifier":"(0x00002440, 0x000028e8)","index":0,"parentIdentifier":"(0x00001469, 0x00005a12)","type":3},{"boxIdentifier":"(0x000078f6, 0x0000791c)","childCount":0,"identifier":"(0x0000752b, 0x0000195e)","index":1,"parentIdentifier":"(0x00001469, 0x00005a12)","type":3}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x84009d7c, 0x3c4e763b) + Example WIth Noise Input + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Covariance Matrix Calculator Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/1.2-Covariance-Matrix-Mean-Calculator.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/1.2-Covariance-Matrix-Mean-Calculator.xml new file mode 100644 index 0000000..18e645a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/1.2-Covariance-Matrix-Mean-Calculator.xml @@ -0,0 +1,1136 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x00690d25, 0xf1dcae5d) + (0x330306dd, 0x74a95f98) + Data + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + + + (0x00053dda, 0x773350e4) + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_TrainCompleted + OVTK_StimulationId_TrainCompleted + + + (0x002c5ea8, 0xed11d16c) + (0xa88b3667, 0x0871638c) + Log Level + Information + Information + + + + + + + (0x00000577, 0x0000375f) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + $var{Stimulation} + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000013ef, 0x00004894) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 60 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + $var{Stimulation} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000014f9, 0x00004b51) + Sample + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 30 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 480 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000241d, 0x0000786a) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003a4d, 0x00004a1b) + Covariance Mean Calculator + (0x67955ea4, 0x7c643c0f) + + + (0x6f752dd0, 0x082a321e) + Input Stimulation + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix 1 + + + + + (0x544a003e, 0x6dcba5f6) + Output Mean Matrix + + + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Riemann + false + + + (0x330306dd, 0x74a95f98) + Filename to save Matrix (CSV, empty to not save) + ${Player_ScenarioDirectory}/Mean.csv + ${Player_ScenarioDirectory}/Mean.csv + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name that triggers the compute + OVTK_StimulationId_TrainCompleted + $var{Stimulation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0xa6202e43, 0xaf22cef6) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000586a, 0x00001f45) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x00007919) + LWF + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 608 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x0000791a) + Mean + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 672 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x11a6038b, 0x7157c284) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Data} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005e1c11) + + + + + (0x2b88852d, 0x43d7a773) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e001787) + C3;C4;FC3;FC4 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x558c587f, 0x223f3b67) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a79f8) + + + + + + + (0x000007be, 0x0000210e) + + (0x0000241d, 0x0000786a) + 0 + + + (0x000078f6, 0x00007919) + 0 + + + + (0x00000bfd, 0x00000a7d) + + (0x5194b6cb, 0x7e001787) + 0 + + + (0x558c587f, 0x223f3b67) + 0 + + + + (0x00001784, 0x000064b4) + + (0x0000241d, 0x0000786a) + 0 + + + (0x00003a4d, 0x00004a1b) + 1 + + + + (0x00001e18, 0x00006274) + + (0x000013ef, 0x00004894) + 0 + + + (0x00003a4d, 0x00004a1b) + 0 + + + + (0x00002145, 0x0000754f) + + (0x000013ef, 0x00004894) + 0 + + + (0x00000577, 0x0000375f) + 0 + + + + (0x00002551, 0x0000620d) + + (0x2b88852d, 0x43d7a773) + 0 + + + (0x5194b6cb, 0x7e001787) + 0 + + + + (0x00004034, 0x000058ef) + + (0x558c587f, 0x223f3b67) + 0 + + + (0x0000586a, 0x00001f45) + 0 + + + + (0x000043f4, 0x0000072f) + + (0x11a6038b, 0x7157c284) + 1 + + + (0x2b88852d, 0x43d7a773) + 0 + + + + (0x0000702b, 0x00006717) + + (0x0000586a, 0x00001f45) + 0 + + + (0x0000241d, 0x0000786a) + 0 + + + + (0x000072a9, 0x000066bd) + + (0x00003a4d, 0x00004a1b) + 0 + + + (0x000078f6, 0x0000791a) + 0 + + + + (0x00007a0d, 0x00002c8a) + + (0x558c587f, 0x223f3b67) + 0 + + + (0x000014f9, 0x00004b51) + 0 + + + + + + (0x00000149, 0x00004f1a) + Displays + + + + + + + + + + + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 864 + + + (0x7234b86b, 0x2b8651a5) + 560 + + + + + (0x000054d7, 0x00005adf) + Stimulation needed to start the compute + + + (0x473d9a43, 0x97fc0a97) + 368 + + + (0x7234b86b, 0x2b8651a5) + 592 + + + + + (0x000054d7, 0x00005ae1) + Compute Covariance + + + + + + (0x473d9a43, 0x97fc0a97) + 688 + + + (0x7234b86b, 0x2b8651a5) + 544 + + + + + (0x000054d7, 0x00005ae2) + Input Signal + + + + + + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 688 + + + (0x7234b86b, 0x2b8651a5) + 240 + + + + + (0x000054d7, 0x00005ae3) + Signal Processing + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 688 + + + (0x7234b86b, 0x2b8651a5) + 416 + + + + + + + (0x0000273f, 0x00001ea9) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00002c23, 0x00001297)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":985},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00000f96, 0x00007c7e)","index":0,"name":"Default tab","parentIdentifier":"(0x00002c23, 0x00001297)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":363,"identifier":"(0x00001a4b, 0x00000a2c)","index":0,"maxDividerPosition":965,"name":"Horizontal split","parentIdentifier":"(0x00000f96, 0x00007c7e)","type":5},{"boxIdentifier":"(0x000014f9, 0x00004b51)","childCount":0,"identifier":"(0x00003a76, 0x00003284)","index":0,"parentIdentifier":"(0x00001a4b, 0x00000a2c)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":288,"identifier":"(0x00001ffc, 0x000042da)","index":1,"maxDividerPosition":581,"name":"Horizontal split","parentIdentifier":"(0x00001a4b, 0x00000a2c)","type":5},{"boxIdentifier":"(0x000078f6, 0x00007919)","childCount":0,"identifier":"(0x00002440, 0x000028e8)","index":0,"parentIdentifier":"(0x00001ffc, 0x000042da)","type":3},{"boxIdentifier":"(0x000078f6, 0x0000791a)","childCount":0,"identifier":"(0x00001567, 0x00005c13)","index":1,"parentIdentifier":"(0x00001ffc, 0x000042da)","type":3}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x84009d7c, 0x3c4e763b) + Example WIth Noise Input + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Covariance Matrix Mean Calculator Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/1.3-Covariance-To-Feature.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/1.3-Covariance-To-Feature.xml new file mode 100644 index 0000000..66b2fbd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/1.3-Covariance-To-Feature.xml @@ -0,0 +1,1135 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x00046253, 0x68a99815) + (0x330306dd, 0x74a95f98) + Data + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + + + (0x00042c96, 0x6995ac68) + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix + ${Player_ScenarioDirectory}/Mean.csv + ${Player_ScenarioDirectory}/Mean.csv + + + (0x005b49f0, 0x3e723c14) + (0xa88b3667, 0x0871638c) + Log Level + Information + Information + + + + + + + (0x000014f9, 0x00004b50) + Sample + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 30 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 1104 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000241d, 0x0000786b) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000044b9, 0x00003dab) + Tangent Space + (0x7c265dba, 0x202c1f70) + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix + + + + + (0x17341935, 0x152ff448) + Output Feature Vector + + + + + (0x2cdb2f0b, 0x12f231ea) + Tangent Space + true + true + false + + + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix (CSV, empty for Identity) + ${Player_ScenarioDirectory}/Mean.csv + $var{Filename to Reference Matrix} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0xbfd23954, 0x40c20e2d) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000044b9, 0x00003dac) + Squeeze + (0x7c265dba, 0x202c1f70) + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix + + + + + (0x17341935, 0x152ff448) + Output Feature Vector + + + + + (0x2cdb2f0b, 0x12f231ea) + Tangent Space + true + false + false + + + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix (CSV, empty for Identity) + ${Player_ScenarioDirectory}/Mean.csv + + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0xbfd23954, 0x40c20e2d) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000586a, 0x00001f45) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x00007919) + LWF + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x0000791a) + Squeeze + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x0000791b) + Tangent Space + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x11a6038b, 0x7157c284) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Data} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005e1c11) + + + + + (0x2b88852d, 0x43d7a773) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e001787) + C3;C4;FC3;FC4 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x558c587f, 0x223f3b67) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a79f8) + + + + + + + (0x00000bfd, 0x00000a7d) + + (0x5194b6cb, 0x7e001787) + 0 + + + (0x558c587f, 0x223f3b67) + 0 + + + + (0x000016d9, 0x0000416b) + + (0x558c587f, 0x223f3b67) + 0 + + + (0x000014f9, 0x00004b50) + 0 + + + + (0x00002551, 0x0000620d) + + (0x2b88852d, 0x43d7a773) + 0 + + + (0x5194b6cb, 0x7e001787) + 0 + + + + (0x00003938, 0x0000693a) + + (0x000044b9, 0x00003dab) + 0 + + + (0x000078f6, 0x0000791b) + 0 + + + + (0x00004034, 0x000058ef) + + (0x558c587f, 0x223f3b67) + 0 + + + (0x0000586a, 0x00001f45) + 0 + + + + (0x000041de, 0x000008d6) + + (0x0000241d, 0x0000786b) + 0 + + + (0x000044b9, 0x00003dac) + 0 + + + + (0x000043f4, 0x0000072f) + + (0x11a6038b, 0x7157c284) + 1 + + + (0x2b88852d, 0x43d7a773) + 0 + + + + (0x00005821, 0x00007eaf) + + (0x0000241d, 0x0000786b) + 0 + + + (0x000044b9, 0x00003dab) + 0 + + + + (0x00005833, 0x00007205) + + (0x000044b9, 0x00003dac) + 0 + + + (0x000078f6, 0x0000791a) + 0 + + + + (0x0000702b, 0x00006717) + + (0x0000586a, 0x00001f45) + 0 + + + (0x0000241d, 0x0000786b) + 0 + + + + (0x00007102, 0x000002b6) + + (0x0000241d, 0x0000786b) + 0 + + + (0x000078f6, 0x00007919) + 0 + + + + + + (0x00000149, 0x00004f1a) + Displays + + + + + (0x473d9a43, 0x97fc0a97) + 816 + + + (0x7234b86b, 0x2b8651a5) + 592 + + + + + (0x000054d7, 0x00005adf) + Compute Tangent Space + + + + + + (0x473d9a43, 0x97fc0a97) + 752 + + + (0x7234b86b, 0x2b8651a5) + 496 + + + + + (0x000054d7, 0x00005ae3) + Compute Covariance + + + + + + (0x473d9a43, 0x97fc0a97) + 752 + + + (0x7234b86b, 0x2b8651a5) + 384 + + + + + (0x000054d7, 0x00005ae4) + Input Signal + + + + + + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 752 + + + (0x7234b86b, 0x2b8651a5) + 80 + + + + + (0x000054d7, 0x00005ae5) + Signal Processing + + + + + + + + + (0x473d9a43, 0x97fc0a97) + 752 + + + (0x7234b86b, 0x2b8651a5) + 256 + + + + + + + (0x00007e21, 0x000060a1) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":627,"identifier":"(0x00006504, 0x000021c8)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1015},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000501f, 0x00005de0)","index":0,"name":"Default tab","parentIdentifier":"(0x00006504, 0x000021c8)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":291,"identifier":"(0x00007bfc, 0x00002238)","index":0,"maxDividerPosition":582,"name":"Vertical split","parentIdentifier":"(0x0000501f, 0x00005de0)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":627,"identifier":"(0x000034d2, 0x00006b7c)","index":0,"maxDividerPosition":979,"name":"Horizontal split","parentIdentifier":"(0x00007bfc, 0x00002238)","type":5},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":133,"identifier":"(0x000008be, 0x00006834)","index":1,"maxDividerPosition":270,"name":"Vertical split","parentIdentifier":"(0x00007bfc, 0x00002238)","type":4},{"boxIdentifier":"(0x000014f9, 0x00004b50)","childCount":0,"identifier":"(0x00002f10, 0x0000234f)","index":0,"parentIdentifier":"(0x000034d2, 0x00006b7c)","type":3},{"boxIdentifier":"(0x000078f6, 0x00007919)","childCount":0,"identifier":"(0x0000179b, 0x00001732)","index":1,"parentIdentifier":"(0x000034d2, 0x00006b7c)","type":3},{"boxIdentifier":"(0x000078f6, 0x0000791b)","childCount":0,"identifier":"(0x00001ad0, 0x000025f2)","index":0,"parentIdentifier":"(0x000008be, 0x00006834)","type":3},{"boxIdentifier":"(0x000078f6, 0x0000791a)","childCount":0,"identifier":"(0x0000286c, 0x0000615c)","index":1,"parentIdentifier":"(0x000008be, 0x00006834)","type":3}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Covairance To Feature Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/1.4-Classifier-Trainer.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/1.4-Classifier-Trainer.xml new file mode 100644 index 0000000..26a1f8d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/1.4-Classifier-Trainer.xml @@ -0,0 +1,2090 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x0028f139, 0x9f535b8a) + (0x330306dd, 0x74a95f98) + Data + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + + + (0x00659961, 0xe97d5856) + (0x79a9edeb, 0x245d83fc) + Directory + ${Player_ScenarioDirectory}/ + ${Player_ScenarioDirectory} + + + (0x0030836f, 0x32c229e2) + (0x330306dd, 0x74a95f98) + Model Filename + Classification-Riemann-Classic-Training-Model.xml + Riemann-Training-Model.xml + + + (0x000045cd, 0xbf65ab3a) + (0x2c132d6e, 0x44ab0d97) + Stimulation Class 1 + OVTK_GDF_Left + OVTK_GDF_Left + + + (0x003d07e7, 0x47d37506) + (0x2c132d6e, 0x44ab0d97) + Stimulation Class 2 + OVTK_GDF_Right + OVTK_GDF_Right + + + (0x00417469, 0x63bdca5e) + (0x007deef9, 0x2f3e95c6) + Log Level + Information + Information + + + + + + + (0x000014d0, 0x0000729b) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Stimulation + + + (0x004c1c8f, 0x4ea92561) + (0x544a003e, 0x6dcba5f6) + Class 1 + + + (0x005f96cd, 0x6c556855) + (0x544a003e, 0x6dcba5f6) + Class 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x00250005, 0x46c98a9d) + (0x544a003e, 0x6dcba5f6) + Output stream 2 + + + (0x006fa647, 0x723008d1) + (0x544a003e, 0x6dcba5f6) + Output stream 3 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000241d, 0x0000786b) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786c) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000028d4, 0x0000144a) + MDM + (0xc0b79b42, 0x4150c837) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 1 + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Tran-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/my-classifier.xml + ${Player_ScenarioDirectory}/Training-MDM.xml + false + + + (0x5261636b, 0x436c6173) + Method + Minimum Distance to Mean (MDM) + Minimum Distance to Mean (MDM) + false + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Riemann + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + $var{Stimulation Class 1} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + $var{Stimulation Class 2} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 816 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0xbe345a8a, 0x87754e57) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000028d4, 0x0000144b) + MDM Rebias + (0xc0b79b42, 0x4150c837) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 1 + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Tran-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/my-classifier.xml + ${Player_ScenarioDirectory}/Training-MDM-Rebias.xml + false + + + (0x5261636b, 0x436c6173) + Method + Minimum Distance to Mean (MDM) + Minimum Distance to Mean (MDM) + false + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Riemann + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + $var{Stimulation Class 1} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + $var{Stimulation Class 2} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 816 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0xbe345a8a, 0x87754e57) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000028d4, 0x0000144c) + FgMDM RT + (0xc0b79b42, 0x4150c837) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 1 + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Tran-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/my-classifier.xml + ${Player_ScenarioDirectory}/Training-FgMDMRT.xml + false + + + (0x5261636b, 0x436c6173) + Method + Minimum Distance to Mean (MDM) + Minimum Distance to Mean with geodesic filtering (FgMDM) (Real Time adaptation assumed) + false + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Riemann + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + $var{Stimulation Class 1} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + $var{Stimulation Class 2} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 816 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0xbe345a8a, 0x87754e57) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000028d4, 0x0000144d) + FgMDM RT + (0xc0b79b42, 0x4150c837) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 1 + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Tran-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/my-classifier.xml + ${Player_ScenarioDirectory}/Training-FgMDMRT-Rebias.xml + false + + + (0x5261636b, 0x436c6173) + Method + Minimum Distance to Mean (MDM) + Minimum Distance to Mean with geodesic filtering Rebias (FgMDM Rebias) (Real Time adaptation assumed) + false + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Riemann + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + $var{Stimulation Class 1} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + $var{Stimulation Class 2} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 816 + + + (0x207c9054, 0x3c841b63) + 1104 + + + (0x4e7b798a, 0x183beafb) + (0xbe345a8a, 0x87754e57) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005211, 0x0000021b) + Stimulation multiplexer + (0x07db4efa, 0x472b0938) + + + (0x6f752dd0, 0x082a321e) + Input stimulations 1 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 2 + + + (0x0060786c, 0x6f20d92b) + (0x6f752dd0, 0x082a321e) + Input stimulations 3 + + + (0x00084696, 0x5c42fd6b) + (0x6f752dd0, 0x082a321e) + Input stimulations 4 + + + + + (0x6f752dd0, 0x082a321e) + Multiplexed stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + 928 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0xe7af82cd, 0x14edb4d4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000078f6, 0x0000791d) + Cov Left + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000078f6, 0x0000791e) + Cov Right + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007f96, 0x00002d09) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 992 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0841694e, 0x28e40f42) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.500000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + $var{Stimulation Class 2} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + + + (0x11a6038b, 0x7157c283) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Data} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005e1c11) + + + + + (0x1396fde6, 0x1c649749) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc7a) + + + (0xfba64161, 0x65304e21) + + + + + + (0x1f046833, 0x21a8a876) + Identity + (0x5dffe431, 0x35215c50) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x6f752dd0, 0x082a321e) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + (0x6f752dd0, 0x082a321e) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001882ae) + + + (0xfba64161, 0x65304e21) + + + + + + (0x2b88852d, 0x43d7a772) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4c1eab6f, 0x0e8c522c) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 4.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0.500000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_GDF_VEP + $var{Stimulation Class 1} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + + + (0x5045ebd9, 0x67325c0b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e001786) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x52a5790c, 0x13d24266) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc72) + + + + + (0x558c587f, 0x223f3b66) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a79f8) + + + + + (0x71322e63, 0x41ba161a) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00183f8d) + + + + + + + (0x00000122, 0x00006bb1) + + (0x000014d0, 0x0000729b) + 0 + + + (0x000028d4, 0x0000144d) + 0 + + + + (0x000002d0, 0x00006e14) + + (0x1f046833, 0x21a8a876) + 1 + + + (0x000014d0, 0x0000729b) + 0 + + + + (0x000003e3, 0x0000571b) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x5045ebd9, 0x67325c0b) + 0 + + + + (0x0000060c, 0x00006a53) + + (0x000014d0, 0x0000729b) + (0x00250005, 0x46c98a9d) + + + (0x000028d4, 0x0000144a) + 1 + + + + (0x0000077b, 0x00007206) + + (0x000014d0, 0x0000729b) + (0x006fa647, 0x723008d1) + + + (0x000028d4, 0x0000144a) + 2 + + + + (0x00000969, 0x00007108) + + (0x0000241d, 0x0000786c) + 0 + + + (0x000014d0, 0x0000729b) + (0x005f96cd, 0x6c556855) + + + + (0x00000ce7, 0x00003935) + + (0x000028d4, 0x0000144a) + 0 + + + (0x00005211, 0x0000021b) + 0 + + + + (0x00001701, 0x00000627) + + (0x000014d0, 0x0000729b) + (0x00250005, 0x46c98a9d) + + + (0x000028d4, 0x0000144d) + 1 + + + + (0x00001798, 0x00003d34) + + (0x000014d0, 0x0000729b) + 0 + + + (0x000028d4, 0x0000144b) + 0 + + + + (0x00001a91, 0x00006224) + + (0x0000241d, 0x0000786b) + 0 + + + (0x000078f6, 0x0000791d) + 0 + + + + (0x00002363, 0x00000391) + + (0x11a6038b, 0x7157c283) + 1 + + + (0x2b88852d, 0x43d7a772) + 0 + + + + (0x00002554, 0x00006e9e) + + (0x000014d0, 0x0000729b) + (0x006fa647, 0x723008d1) + + + (0x000028d4, 0x0000144b) + 2 + + + + (0x00002992, 0x000069aa) + + (0x000028d4, 0x0000144c) + 0 + + + (0x00005211, 0x0000021b) + (0x0060786c, 0x6f20d92b) + + + + (0x000029b0, 0x000069fb) + + (0x000014d0, 0x0000729b) + 0 + + + (0x000028d4, 0x0000144c) + 0 + + + + (0x000029de, 0x00006688) + + (0x000028d4, 0x0000144d) + 0 + + + (0x00005211, 0x0000021b) + (0x00084696, 0x5c42fd6b) + + + + (0x00002f35, 0x00006e34) + + (0x000014d0, 0x0000729b) + (0x006fa647, 0x723008d1) + + + (0x000028d4, 0x0000144d) + 2 + + + + (0x00003a5f, 0x000071e4) + + (0x52a5790c, 0x13d24266) + 0 + + + (0x0000241d, 0x0000786c) + 0 + + + + (0x00004eb1, 0x000045d0) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x1f046833, 0x21a8a876) + 1 + + + + (0x00005011, 0x000006c6) + + (0x000014d0, 0x0000729b) + 0 + + + (0x000028d4, 0x0000144a) + 0 + + + + (0x000053a4, 0x000073b5) + + (0x71322e63, 0x41ba161a) + 0 + + + (0x0000241d, 0x0000786b) + 0 + + + + (0x00005612, 0x0000591e) + + (0x11a6038b, 0x7157c283) + 2 + + + (0x1396fde6, 0x1c649749) + 0 + + + + (0x00005b23, 0x000063fe) + + (0x000014d0, 0x0000729b) + (0x00250005, 0x46c98a9d) + + + (0x000028d4, 0x0000144b) + 1 + + + + (0x00005d29, 0x000050e0) + + (0x000014d0, 0x0000729b) + (0x006fa647, 0x723008d1) + + + (0x000028d4, 0x0000144c) + 2 + + + + (0x00006103, 0x00006cf8) + + (0x000014d0, 0x0000729b) + (0x00250005, 0x46c98a9d) + + + (0x000028d4, 0x0000144c) + 1 + + + + (0x0000626c, 0x00000fa6) + + (0x000028d4, 0x0000144b) + 0 + + + (0x00005211, 0x0000021b) + 1 + + + + (0x000068e8, 0x000045cb) + + (0x00005211, 0x0000021b) + 0 + + + (0x00007f96, 0x00002d09) + 0 + + + + (0x00006ea7, 0x0000528f) + + (0x0000241d, 0x0000786c) + 0 + + + (0x000078f6, 0x0000791e) + 0 + + + + (0x00007344, 0x0000754e) + + (0x0000241d, 0x0000786b) + 0 + + + (0x000014d0, 0x0000729b) + (0x004c1c8f, 0x4ea92561) + + + + (0x00007af8, 0x00000c53) + + (0x5194b6cb, 0x7e001786) + 0 + + + (0x558c587f, 0x223f3b66) + 0 + + + + (0x0fb9552e, 0x72e04408) + + (0x1f046833, 0x21a8a876) + 0 + + + (0x0841694e, 0x28e40f42) + 0 + + + + (0x1658a066, 0x2ce1e19e) + + (0x1f046833, 0x21a8a876) + 0 + + + (0x4c1eab6f, 0x0e8c522c) + 0 + + + + (0x1e23e99e, 0x6b3cf5e1) + + (0x2b88852d, 0x43d7a772) + 0 + + + (0x5194b6cb, 0x7e001786) + 0 + + + + (0x2d71872c, 0x4af9aa82) + + (0x0841694e, 0x28e40f42) + 0 + + + (0x52a5790c, 0x13d24266) + 0 + + + + (0x32d337b3, 0x44da5cbe) + + (0x1f046833, 0x21a8a876) + 1 + + + (0x0841694e, 0x28e40f42) + 1 + + + + (0x4dec0a97, 0x70c962ab) + + (0x558c587f, 0x223f3b66) + 0 + + + (0x1f046833, 0x21a8a876) + 0 + + + + (0x63796305, 0x4f357282) + + (0x4c1eab6f, 0x0e8c522c) + 0 + + + (0x71322e63, 0x41ba161a) + 0 + + + + (0x640c71b7, 0x1e64acbd) + + (0x1f046833, 0x21a8a876) + 1 + + + (0x4c1eab6f, 0x0e8c522c) + 1 + + + + + + (0x000054d7, 0x00005ae2) + Display + + + (0x473d9a43, 0x97fc0a97) + 544 + + + (0x7234b86b, 0x2b8651a5) + 704 + + + + + (0x000054d7, 0x00005ae3) + Classify + + + (0x473d9a43, 0x97fc0a97) + 544 + + + (0x7234b86b, 0x2b8651a5) + 816 + + + + + (0x000054d7, 0x00005ae4) + Compute Covariance + + + (0x473d9a43, 0x97fc0a97) + 544 + + + (0x7234b86b, 0x2b8651a5) + 640 + + + + + + + (0x05377d7e, 0x41751bb3) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":592,"identifier":"(0x00001f6c, 0x000012a7)","name":"Display","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1348},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003bf6, 0x000002ba)","index":0,"name":"Default tab","parentIdentifier":"(0x00001f6c, 0x000012a7)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":665,"identifier":"(0x00005b3c, 0x000043dd)","index":0,"maxDividerPosition":1335,"name":"Horizontal split","parentIdentifier":"(0x00003bf6, 0x000002ba)","type":5},{"boxIdentifier":"(0x000078f6, 0x0000791d)","childCount":0,"identifier":"(0x000062bf, 0x00005ccc)","index":0,"parentIdentifier":"(0x00005b3c, 0x000043dd)","type":3},{"boxIdentifier":"(0x000078f6, 0x0000791e)","childCount":0,"identifier":"(0x00006992, 0x000009bf)","index":1,"parentIdentifier":"(0x00005b3c, 0x000043dd)","type":3}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x7b814cca, 0x271df6dd) + 475 + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Matrix Classification Training Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + bci-examples + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/1.5-Classifier-Testing.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/1.5-Classifier-Testing.xml new file mode 100644 index 0000000..3d24f58 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/1.5-Classifier-Testing.xml @@ -0,0 +1,1435 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x001f9ac9, 0x8d7740bc) + (0x330306dd, 0x74a95f98) + Data + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + + + (0x0011d622, 0x7d4c80a8) + (0x79a9edeb, 0x245d83fc) + Directory + ${Player_ScenarioDirectory}/ + ${Player_ScenarioDirectory} + + + (0x0064fe21, 0x6acf20ec) + (0x2c132d6e, 0x44ab0d97) + Stimulation Class 1 + OVTK_GDF_Left + OVTK_GDF_Left + + + (0x0017cd5f, 0xae3155d8) + (0x2c132d6e, 0x44ab0d97) + Stimulation Class 2 + OVTK_GDF_Right + OVTK_GDF_Right + + + (0x00006ead, 0x71386450) + (0x007deef9, 0x2f3e95c6) + Log Level + Information + Information + + + (0x001d22e8, 0xdd0737ae) + (0x5261636b, 0x41646170) + Adaptation + No + No + + + + + + + (0x0000241d, 0x0000786c) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + $var{Log Level} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002816, 0x00002fc7) + MDM Rebias + (0x918f6952, 0xb22ddf0d) + + + (0x6f752dd0, 0x082a321e) + Expected Label + + + (0x544a003e, 0x6dcba5f6) + Input Matrix + + + + + (0x6f752dd0, 0x082a321e) + Label + + + (0x544a003e, 0x6dcba5f6) + Distance + + + (0x544a003e, 0x6dcba5f6) + Probability + + + + + (0x330306dd, 0x74a95f98) + Filename to load classifier model + ${Player_ScenarioDirectory}/input-classifier.xml + ${Player_ScenarioDirectory}/Training-MDM-Rebias.xml + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/output-classifier.xml + ${Player_ScenarioDirectory}/output-classifier.xml + false + + + (0x5261636b, 0x41646170) + Adaptation + No + $var{Adaptation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 608 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0xb85fcd48, 0x1d5e5748) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00002816, 0x00002fc9) + FgMDMRT + (0x918f6952, 0xb22ddf0d) + + + (0x6f752dd0, 0x082a321e) + Expected Label + + + (0x544a003e, 0x6dcba5f6) + Input Matrix + + + + + (0x6f752dd0, 0x082a321e) + Label + + + (0x544a003e, 0x6dcba5f6) + Distance + + + (0x544a003e, 0x6dcba5f6) + Probability + + + + + (0x330306dd, 0x74a95f98) + Filename to load classifier model + ${Player_ScenarioDirectory}/input-classifier.xml + ${Player_ScenarioDirectory}/Training-FgMDMRT.xml + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/output-classifier.xml + ${Player_ScenarioDirectory}/output-classifier.xml + false + + + (0x5261636b, 0x41646170) + Adaptation + No + $var{Adaptation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 608 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0xb85fcd48, 0x1d5e5748) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000656b, 0x000060cb) + MDM + (0x918f6952, 0xb22ddf0d) + + + (0x6f752dd0, 0x082a321e) + Expected Label + + + (0x544a003e, 0x6dcba5f6) + Input Matrix + + + + + (0x6f752dd0, 0x082a321e) + Label + + + (0x544a003e, 0x6dcba5f6) + Distance + + + (0x544a003e, 0x6dcba5f6) + Probability + + + + + (0x330306dd, 0x74a95f98) + Filename to load classifier model + ${Player_ScenarioDirectory}/input-classifier.xml + ${Player_ScenarioDirectory}/Training-MDM.xml + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/output-classifier.xml + ${Player_ScenarioDirectory}/output-classifier.xml + false + + + (0x5261636b, 0x41646170) + Adaptation + No + $var{Adaptation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 608 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0xb85fcd48, 0x1d5e5748) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00006be7, 0x0000270b) + Graz MDM + (0x00dd290d, 0x5f142820) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Show feedback + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + true + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive feedback only + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x602ceb3f, 0xd3bc74aa) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00006be7, 0x0000270c) + Graz MDM Rebias + (0x00dd290d, 0x5f142820) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Show feedback + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + true + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive feedback only + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0x602ceb3f, 0xd3bc74aa) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00006be7, 0x0000270e) + Graz FgMDMRT + (0x00dd290d, 0x5f142820) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Show feedback + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + true + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive feedback only + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x4e7b798a, 0x183beafb) + (0x602ceb3f, 0xd3bc74aa) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x11a6038b, 0x7157c283) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + $var{Data} + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005e1c11) + + + + + (0x1396fde6, 0x1c649749) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 608 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc7a) + + + (0xfba64161, 0x65304e21) + + + + + + (0x1396fde6, 0x1c64974a) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017fc7a) + + + (0xfba64161, 0x65304e21) + + + + + + (0x2b88852d, 0x43d7a772) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5045ebd9, 0x67325c0b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5194b6cb, 0x7e001786) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x558c587f, 0x223f3b66) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a79f8) + + + + + (0x71322e63, 0x41ba161a) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00183f8d) + + + + + + + (0x00000a31, 0x00007248) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x00006be7, 0x0000270b) + 0 + + + + (0x00000f87, 0x00007740) + + (0x00002816, 0x00002fc9) + 1 + + + (0x00006be7, 0x0000270e) + 1 + + + + (0x000011e5, 0x000007ac) + + (0x0000656b, 0x000060cb) + 1 + + + (0x00006be7, 0x0000270b) + 1 + + + + (0x00001878, 0x0000796f) + + (0x11a6038b, 0x7157c283) + 2 + + + (0x1396fde6, 0x1c64974a) + 0 + + + + (0x00002292, 0x00003230) + + (0x0000241d, 0x0000786c) + 0 + + + (0x00002816, 0x00002fc9) + 1 + + + + (0x000022f3, 0x00007475) + + (0x1396fde6, 0x1c64974a) + 0 + + + (0x1396fde6, 0x1c649749) + 0 + + + + (0x00002363, 0x00000391) + + (0x11a6038b, 0x7157c283) + 1 + + + (0x2b88852d, 0x43d7a772) + 0 + + + + (0x00002514, 0x00001539) + + (0x00002816, 0x00002fc7) + 1 + + + (0x00006be7, 0x0000270c) + 1 + + + + (0x00003462, 0x0000590a) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x5045ebd9, 0x67325c0b) + 0 + + + + (0x000041c8, 0x00007a52) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x00006be7, 0x0000270e) + 0 + + + + (0x00004371, 0x00003469) + + (0x0000241d, 0x0000786c) + 0 + + + (0x00002816, 0x00002fc7) + 1 + + + + (0x000057f7, 0x00002085) + + (0x558c587f, 0x223f3b66) + 0 + + + (0x71322e63, 0x41ba161a) + 0 + + + + (0x00005dec, 0x0000035f) + + (0x1396fde6, 0x1c649749) + 0 + + + (0x00006be7, 0x0000270c) + 0 + + + + (0x00006cdb, 0x00004d41) + + (0x5194b6cb, 0x7e001786) + 0 + + + (0x558c587f, 0x223f3b66) + 0 + + + + (0x00006fd9, 0x00007876) + + (0x71322e63, 0x41ba161a) + 0 + + + (0x0000241d, 0x0000786c) + 0 + + + + (0x000072f3, 0x00001730) + + (0x1396fde6, 0x1c64974a) + 0 + + + (0x0000656b, 0x000060cb) + 0 + + + + (0x000076c7, 0x000033b9) + + (0x0000241d, 0x0000786c) + 0 + + + (0x0000656b, 0x000060cb) + 1 + + + + (0x1e23e99e, 0x6b3cf5e1) + + (0x2b88852d, 0x43d7a772) + 0 + + + (0x5194b6cb, 0x7e001786) + 0 + + + + + + (0x000054d7, 0x00005ae3) + Classifier processor +(Need to run previous scenario) + + + (0x473d9a43, 0x97fc0a97) + 176 + + + (0x7234b86b, 0x2b8651a5) + 640 + + + + + (0x000054d7, 0x00005ae6) + Compute Covariance + + + (0x473d9a43, 0x97fc0a97) + 176 + + + (0x7234b86b, 0x2b8651a5) + 576 + + + + + + + (0x11f491f3, 0x047d65a5) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":732,"identifier":"(0x000072ec, 0x00006065)","name":"","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1247},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006a3f, 0x00006097)","index":0,"name":"Default tab","parentIdentifier":"(0x000072ec, 0x00006065)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":341,"identifier":"(0x00000e3b, 0x00000e89)","index":0,"maxDividerPosition":687,"name":"Vertical split","parentIdentifier":"(0x00006a3f, 0x00006097)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":603,"identifier":"(0x00000859, 0x00003b65)","index":0,"maxDividerPosition":1211,"name":"Horizontal split","parentIdentifier":"(0x00000e3b, 0x00000e89)","type":5},{"boxIdentifier":"(0x00006be7, 0x0000270e)","childCount":0,"identifier":"(0x00003f5d, 0x00006812)","index":1,"parentIdentifier":"(0x00000e3b, 0x00000e89)","type":3},{"boxIdentifier":"(0x00006be7, 0x0000270b)","childCount":0,"identifier":"(0x00007839, 0x00001ae3)","index":0,"parentIdentifier":"(0x00000859, 0x00003b65)","type":3},{"boxIdentifier":"(0x00006be7, 0x0000270c)","childCount":0,"identifier":"(0x00006fcc, 0x00005ae8)","index":1,"parentIdentifier":"(0x00000859, 0x00003b65)","type":3}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x7b814cca, 0x271df6dd) + 475 + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Matrix Classification Testing Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + bci-examples + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/Affine-Transformation.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/Affine-Transformation.xml new file mode 100644 index 0000000..97e3fbe --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/box-tutorials/Affine-Transformation.xml @@ -0,0 +1,471 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x0028f139, 0x9f535b8a) + (0x330306dd, 0x74a95f98) + Data + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + + + (0x00659961, 0xe97d5856) + (0x79a9edeb, 0x245d83fc) + Directory + ${Player_ScenarioDirectory}/ + ${Player_ScenarioDirectory} + + + (0x0030836f, 0x32c229e2) + (0x330306dd, 0x74a95f98) + Model Filename + Classification-Riemann-Classic-Training-Model.xml + Riemann-Training-Model.xml + + + (0x000045cd, 0xbf65ab3a) + (0x2c132d6e, 0x44ab0d97) + Stimulation Class 1 + OVTK_GDF_Left + OVTK_GDF_Left + + + (0x003d07e7, 0x47d37506) + (0x2c132d6e, 0x44ab0d97) + Stimulation Class 2 + OVTK_GDF_Right + OVTK_GDF_Right + + + (0x00417469, 0x63bdca5e) + (0x007deef9, 0x2f3e95c6) + Log Level + Information + Information + + + + + + + (0x000006d6, 0x000008e8) + Covariance Matrix Calculator + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 1008 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001a09, 0x00003f43) + After + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x207c9054, 0x3c841b63) + 1008 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001a09, 0x00003f44) + Before + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003b14, 0x00000f6a) + Matrix Affine Transformation + (0x1baa7180, 0x52cb19b8) + + + (0x544a003e, 0x6dcba5f6) + Square Matrix + + + + + (0x544a003e, 0x6dcba5f6) + Transformed Square Matrix + + + + + (0x330306dd, 0x74a95f98) + Filename to load transformation + ${Player_ScenarioDirectory}/my-transformation-input.xml + + false + + + (0x330306dd, 0x74a95f98) + Filename to save transformation + ${Player_ScenarioDirectory}/my-transformation-output.xml + + false + + + (0x2cdb2f0b, 0x12f231ea) + Continuous Update + false + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 1008 + + + (0x4e7b798a, 0x183beafb) + (0x9a24ed4b, 0x44592bc6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000070af, 0x00000633) + Sinus oscillator + (0x7e33bdb8, 0x68194a4a) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 64 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 1008 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + + + (0x00001d34, 0x00001fa4) + + (0x000070af, 0x00000633) + 0 + + + (0x000006d6, 0x000008e8) + 0 + + + + (0x000054f8, 0x000011f4) + + (0x000006d6, 0x000008e8) + 0 + + + (0x00003b14, 0x00000f6a) + 0 + + + + (0x00005fab, 0x0000528e) + + (0x000006d6, 0x000008e8) + 0 + + + (0x00001a09, 0x00003f44) + 0 + + + + (0x000070a1, 0x00000bf1) + + (0x00003b14, 0x00000f6a) + 0 + + + (0x00001a09, 0x00003f43) + 0 + + + + + + + (0x05377d7e, 0x41751bb3) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":592,"identifier":"(0x00001f6c, 0x000012a7)","name":"Display","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1343},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003bf6, 0x000002ba)","index":0,"name":"Default tab","parentIdentifier":"(0x00001f6c, 0x000012a7)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":659,"identifier":"(0x000039d3, 0x00005c3e)","index":0,"maxDividerPosition":1323,"name":"Horizontal split","parentIdentifier":"(0x00003bf6, 0x000002ba)","type":5},{"boxIdentifier":"(0x00001a09, 0x00003f44)","childCount":0,"identifier":"(0x00007f28, 0x000070e0)","index":0,"parentIdentifier":"(0x000039d3, 0x00005c3e)","type":3},{"boxIdentifier":"(0x00001a09, 0x00003f43)","childCount":0,"identifier":"(0x0000191d, 0x00005966)","index":1,"parentIdentifier":"(0x000039d3, 0x00005c3e)","type":3}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Thibaut Monseigne + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x7b814cca, 0x271df6dd) + 475 + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Matrix Classification Training Example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + bci-examples + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_CovarianceMatrixCalculator.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_CovarianceMatrixCalculator.dox-part new file mode 100644 index 0000000..f427d9b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_CovarianceMatrixCalculator.dox-part @@ -0,0 +1,72 @@ +/** + * \page BoxAlgorithm_CovarianceMatrixCalculator Covariance Matrix Calculator +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixCalculator_Description| +The covariance matrix calculator calculates the covariance matrix of each input chunk. The covariance matrix is a square matrix of size NxN with N the number of channels of the input signal. + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixCalculator_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixCalculator_Inputs| + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixCalculator_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixCalculator_Input1| +The input signal on which the covariance matrix needs to be calculated. + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixCalculator_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixCalculator_Outputs| + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixCalculator_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixCalculator_Output1| +Covariance Matrix generated. + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixCalculator_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixCalculator_Settings| + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixCalculator_Settings| + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixCalculator_Setting1| +Method of calculating the covariance matrix: \n +Classical Covariance Estimator \n +Pearson Correlation Estimator \n +Ledoit and Wolf Estimator \n +Oracle Approximating Shrinkage (OAS) Estimator \n +Sample Covariance Matrix (SCM) Estimator \n +Identity Matrix + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixCalculator_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixCalculator_Setting2| +Center or not the input data (each channel independently) + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixCalculator_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixCalculator_Setting3| +Log Level (None to see nothing) + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixCalculator_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixCalculator_Examples| + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixCalculator_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixCalculator_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixCalculator_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_CovarianceMatrixToFeatureVector.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_CovarianceMatrixToFeatureVector.dox-part new file mode 100644 index 0000000..cacd09d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_CovarianceMatrixToFeatureVector.dox-part @@ -0,0 +1,68 @@ +/** + * \page BoxAlgorithm_CovarianceMatrixToFeatureVector Covariance Matrix To Feature Vector +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixToFeatureVector_Description| +This box transforms the matrix into a vector for use in a classic classifier. for more details. + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixToFeatureVector_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixToFeatureVector_Inputs| + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixToFeatureVector_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixToFeatureVector_Input1| +The covariance matrix on which the Feature Vector needs to be calculated. + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixToFeatureVector_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixToFeatureVector_Outputs| + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixToFeatureVector_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixToFeatureVector_Output1| +Feature Vector generated. + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixToFeatureVector_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixToFeatureVector_Settings| + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixToFeatureVector_Settings| + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixToFeatureVector_Setting1| +Method of calculating the Feature Vector : \n +\c True : The matrix is transposed into the tangent space. \n +\c False : The upper triangular matrix is used. \n + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixToFeatureVector_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixToFeatureVector_Setting2| +Link to the Reference Matrix CSV. A square matrix of size NxN with N the number of Features. The reference matrix is the same size as the input covariance matrices. The reference matrix is useful for calculating the feature vector on the tangent space.\nRemarks : If no reference an identity matrix is used. + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixToFeatureVector_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixToFeatureVector_Setting3| +Log Level (None to see nothing) + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixToFeatureVector_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixToFeatureVector_Examples| + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixToFeatureVector_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMatrixToFeatureVector_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_CovarianceMatrixToFeatureVector_Miscellaneous| + */ \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_CovarianceMeanCalculator.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_CovarianceMeanCalculator.dox-part new file mode 100644 index 0000000..f6a1a5a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_CovarianceMeanCalculator.dox-part @@ -0,0 +1,83 @@ +/** + * \page BoxAlgorithm_CovarianceMeanCalculator Covariance Mean Calculator +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + +* |OVP_DocBegin_BoxAlgorithm_CovarianceMeanCalculator_Description| +Calculation of the mean of covariance matrix.\n +The Calculation is done when a stimulation is received.\n +The Mean is saved in a CSV File. + * |OVP_DocEnd_BoxAlgorithm_CovarianceMeanCalculator_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMeanCalculator_Inputs| + * |OVP_DocEnd_BoxAlgorithm_CovarianceMeanCalculator_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMeanCalculator_Input1| +Stimulation Input + * |OVP_DocEnd_BoxAlgorithm_CovarianceMeanCalculator_Input1| + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMeanCalculator_Input2| +Covariance Matrix Input + * |OVP_DocEnd_BoxAlgorithm_CovarianceMeanCalculator_Input2| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMeanCalculator_Outputs| + * |OVP_DocEnd_BoxAlgorithm_CovarianceMeanCalculator_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMeanCalculator_Output1| +Mean Computed. + * |OVP_DocEnd_BoxAlgorithm_CovarianceMeanCalculator_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMeanCalculator_Settings| + * |OVP_DocEnd_BoxAlgorithm_CovarianceMeanCalculator_Settings| + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMeanCalculator_Setting1| +Metric to use for computing the mean : \n +Riemann\n +Euclidian\n +Log-Euclidian\n +Log-Det\n +Kullback\n +Harmonic\n +Identity Matrix + * |OVP_DocEnd_BoxAlgorithm_CovarianceMeanCalculator_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMeanCalculator_Setting2| +CSV Filename to save the computed mean. + * |OVP_DocEnd_BoxAlgorithm_CovarianceMeanCalculator_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMeanCalculator_Setting3| +Stimulation that starts the computation. + * |OVP_DocEnd_BoxAlgorithm_CovarianceMeanCalculator_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMeanCalculator_Setting4| +Log Level (None to see nothing) + * |OVP_DocEnd_BoxAlgorithm_CovarianceMeanCalculator_Setting4| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMeanCalculator_Examples| + * |OVP_DocEnd_BoxAlgorithm_CovarianceMeanCalculator_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CovarianceMeanCalculator_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_CovarianceMeanCalculator_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_FeatureVectorToCovarianceMatrix.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_FeatureVectorToCovarianceMatrix.dox-part new file mode 100644 index 0000000..aa93e8e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_FeatureVectorToCovarianceMatrix.dox-part @@ -0,0 +1,68 @@ +/** + * \page BoxAlgorithm_FeatureVectorToCovarianceMatrix Covariance Matrix To Feature Vector +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Description| +This box transforms the vector into matrix for use in a matrix classifier. for more details. + * |OVP_DocEnd_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Inputs| + * |OVP_DocEnd_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Input1| +The Feature Vector on which the Covariance Matrix needs to be calculated. + * |OVP_DocEnd_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Outputs| + * |OVP_DocEnd_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Output1| + Covariance Matrix generated. + * |OVP_DocEnd_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Settings| + * |OVP_DocEnd_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Settings| + + * |OVP_DocBegin_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Setting1| +Method of calculating the Covariance Matrix : \n +\c True : The feature vector is transposed into the tangent space. \n +\c False : The upper triangular matrix is used. \n + * |OVP_DocEnd_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Setting2| +Link to the Reference Matrix CSV. A square matrix of size NxN with N the number of Features. The reference matrix is the same size as the input covariance matrices. The reference matrix is useful for calculating the feature vector on the tangent space.\nRemarks : If no reference an identity matrix is used. + * |OVP_DocEnd_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Setting3| +Log Level (None to see nothing) + * |OVP_DocEnd_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Examples| + * |OVP_DocEnd_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_FeatureVectorToCovarianceMatrix_Miscellaneous| + */ \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_MatrixAffineTransformation.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_MatrixAffineTransformation.dox-part new file mode 100644 index 0000000..692a961 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_MatrixAffineTransformation.dox-part @@ -0,0 +1,68 @@ +/** + * \page BoxAlgorithm_MatrixAffineTransformation Matrix Affine Transformation +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixAffineTransformation_Description| +Compute and Apply the Bias matrix for Affine Transformation on square matrix (isR * M * isR^(-1) = I). for more details. +You can load an existing bias matrix with the first setting. +Continuous update is to update Bias at each chunk or at the end. + * |OVP_DocEnd_BoxAlgorithm_MatrixAffineTransformation_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixAffineTransformation_Inputs| + * |OVP_DocEnd_BoxAlgorithm_MatrixAffineTransformation_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_MatrixAffineTransformation_Input1| +Square matrix to transform. + * |OVP_DocEnd_BoxAlgorithm_MatrixAffineTransformation_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixAffineTransformation_Outputs| + * |OVP_DocEnd_BoxAlgorithm_MatrixAffineTransformation_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_MatrixAffineTransformation_Output1| +Transformed Square Matrix + * |OVP_DocEnd_BoxAlgorithm_MatrixAffineTransformation_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixAffineTransformation_Settings| + * |OVP_DocEnd_BoxAlgorithm_MatrixAffineTransformation_Settings| + + * |OVP_DocBegin_BoxAlgorithm_MatrixAffineTransformation_Setting1| +Filename with previous computed Bias + * |OVP_DocEnd_BoxAlgorithm_MatrixAffineTransformation_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_MatrixAffineTransformation_Setting2| +Filename to save computed Bias + * |OVP_DocEnd_BoxAlgorithm_MatrixAffineTransformation_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_MatrixAffineTransformation_Setting3| +Update method, continuous to update at each chunk and not continuous to compute bias at the End. + * |OVP_DocEnd_BoxAlgorithm_MatrixAffineTransformation_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixAffineTransformation_Examples| + * |OVP_DocEnd_BoxAlgorithm_MatrixAffineTransformation_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixAffineTransformation_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_MatrixAffineTransformation_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_MatrixClassifierProcessor.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_MatrixClassifierProcessor.dox-part new file mode 100644 index 0000000..f11b201 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_MatrixClassifierProcessor.dox-part @@ -0,0 +1,71 @@ +/** + * \page BoxAlgorithm_MatrixClassifierProcessor Matrix Classifier Processor +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierProcessor_Description| +Matrix classifier Processor. This box classify input matrix with the loaded classifier model. Actual methods are Minimum Distance to Mean (MDM) and Minimum Distance to Mean with geodesic filtering (FgMDM)\n + + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierProcessor_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierProcessor_Inputs| + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierProcessor_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierProcessor_Input1| +Matrix to classify. + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierProcessor_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierProcessor_Outputs| + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierProcessor_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierProcessor_Output1| +Predicted Class Stimulation + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierProcessor_Output1| + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierProcessor_Output2| + Distance between each class + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierProcessor_Output2| + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierProcessor_Output3| + Probability of each class + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierProcessor_Output3| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierProcessor_Settings| + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierProcessor_Settings| + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierProcessor_Setting1| +Classifier model Filename + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierProcessor_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierProcessor_Setting2| +Log Level (None to see nothing) + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierProcessor_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierProcessor_Examples| + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierProcessor_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierProcessor_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierProcessor_Miscellaneous| + */ \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_MatrixClassifierTrainer.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_MatrixClassifierTrainer.dox-part new file mode 100644 index 0000000..fe67ec8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/doc/Doc_BoxAlgorithm_MatrixClassifierTrainer.dox-part @@ -0,0 +1,95 @@ +/** + * \page BoxAlgorithm_MatrixClassifierTrainer Matrix Classifier Trainer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierTrainer_Description| +Matrix classifier trainer. This box stack all matrix received in input and launch train function when a stimulation is received. Actual methods are Minimum Distance to Mean (MDM) and Minimum Distance to Mean with geodesic filtering (FgMDM) (With Real Time adaptation assumed) with or without Rebias\n + + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierTrainer_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierTrainer_Inputs| + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierTrainer_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierTrainer_Input1| +Stimulation to start the training. + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierTrainer_Input1| + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierTrainer_Input2| +Input for Class 1 + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierTrainer_Input2| + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierTrainer_Input3| +Input for Class 2 + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierTrainer_Input3| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierTrainer_Outputs| + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierTrainer_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierTrainer_Output1| +Send \"OVTK_StimulationId_TrainCompleted\" when train is completed. + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierTrainer_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierTrainer_Settings| + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierTrainer_Settings| + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierTrainer_Setting1| +Stimulation that starts the computation. + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierTrainer_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierTrainer_Setting2| +Classifier model Filename + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierTrainer_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierTrainer_Setting3| +Classifier Method :\n +Minimum Distance to Mean (MDM)\n +Minimum Distance to Mean Rebias (MDM Rebias)\n +Minimum Distance to Mean with geodesic filtering (FgMDM)\n +Minimum Distance to Mean with geodesic filtering Rebias (FgMDM Rebias) + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierTrainer_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierTrainer_Setting4| +Log Level (None to see nothing) + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierTrainer_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierTrainer_Setting5| +Metric to use : Riemman, Euclidian, Harmonic, Identity, Kullback, Log Determinant, Log Euclidian + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierTrainer_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierTrainer_Setting6| +Stimulation for Class 1. + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierTrainer_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierTrainer_Setting7| +Stimulation for Class 2. + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierTrainer_Setting7| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierTrainer_Examples| + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierTrainer_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixClassifierTrainer_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_MatrixClassifierTrainer_Miscellaneous| + */ \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMatrixCalculator.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMatrixCalculator.cpp new file mode 100644 index 0000000..6caa632 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMatrixCalculator.cpp @@ -0,0 +1,88 @@ +#include "CBoxAlgorithmCovarianceMatrixCalculator.hpp" +#include "utils/misc.hpp" + +namespace OpenViBE { +namespace Plugins { +namespace Riemannian { +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmCovarianceMatrixCalculator::initialize() +{ + m_i0SignalCodec.initialize(*this, 0); + m_o0MatrixCodec.initialize(*this, 0); + m_iMatrix = m_i0SignalCodec.getOutputMatrix(); + m_oMatrix = m_o0MatrixCodec.getInputMatrix(); + + //***** Settings ***** + m_est = Geometry::EEstimator(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0))); + m_center = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_logLevel = Kernel::ELogLevel(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2))); + + this->getLogManager() << m_logLevel << toString(m_est) << " Estimator" << (m_center ? ", Center Data " : "") << "\n"; + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmCovarianceMatrixCalculator::uninitialize() +{ + m_i0SignalCodec.uninitialize(); + m_o0MatrixCodec.uninitialize(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmCovarianceMatrixCalculator::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmCovarianceMatrixCalculator::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_i0SignalCodec.decode(i); // Decode the chunk + OV_ERROR_UNLESS_KRF(m_iMatrix->getDimensionCount() == 2, "Invalid Input Signal", Kernel::ErrorType::BadInput); + + const uint64_t tStart = boxContext.getInputChunkStartTime(0, i), // Time Code Chunk Start + tEnd = boxContext.getInputChunkEndTime(0, i); // Time Code Chunk End + const auto nChannels = size_t(m_iMatrix->getDimensionSize(0)); + + if (m_i0SignalCodec.isHeaderReceived()) // Header received + { + m_oMatrix->resize(nChannels, nChannels); // Update Size and set to 0 + m_oMatrix->setNumLabels(); // Change label to have 1 to N label on each dim + m_o0MatrixCodec.encodeHeader(); // Header encoded + } + else if (m_i0SignalCodec.isBufferReceived()) // Buffer received + { + OV_ERROR_UNLESS_KRF(covarianceMatrix(), "Covariance Matrix Processing Error", Kernel::ErrorType::BadProcessing); // Compute Covariance + m_o0MatrixCodec.encodeBuffer(); // Buffer encoded + } + else if (m_i0SignalCodec.isEndReceived()) { m_o0MatrixCodec.encodeEnd(); } // End receivded and encoded + + boxContext.markOutputAsReadyToSend(0, tStart, tEnd); // Makes the output available + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmCovarianceMatrixCalculator::covarianceMatrix() const +{ + Eigen::MatrixXd mS, mCov; + if (!MatrixConvert(*m_iMatrix, mS)) { return false; } + const Geometry::EStandardization s = m_center ? Geometry::EStandardization::Center : Geometry::EStandardization::None; + if (!CovarianceMatrix(mS, mCov, m_est, s)) { return false; } + if (!MatrixConvert(mCov, *m_oMatrix)) { return false; } + return true; +} +//--------------------------------------------------------------------------------------------------- +} // namespace Riemannian +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMatrixCalculator.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMatrixCalculator.hpp new file mode 100644 index 0000000..0691194 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMatrixCalculator.hpp @@ -0,0 +1,93 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmCovarianceMatrixCalculator.hpp +/// \brief Class of the box computing the covariance matrix +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 16/10/2018. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- +# pragma once + +#include "defines.hpp" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Riemannian { +/// The class CBoxAlgorithmCovarianceMatrixCalculator describes the box Covariance Matrix Calculator. +class CBoxAlgorithmCovarianceMatrixCalculator final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, ClassId_BoxAlgorithm_CovarianceMatrixCalculator) + +protected: + bool covarianceMatrix() const; + + //***** Codecs ***** + Toolkit::TSignalDecoder m_i0SignalCodec; // Input Signal Codec + Toolkit::TStreamedMatrixEncoder m_o0MatrixCodec; // Output Matrix Codec + + //***** Matrices ***** + CMatrix* m_iMatrix = nullptr; // Input Matrix pointer + CMatrix* m_oMatrix = nullptr; // Output Matrix pointer + + //***** Settings ***** + Geometry::EEstimator m_est = Geometry::EEstimator::COV; // Covariance Estimator + bool m_center = true; // Center data + Kernel::ELogLevel m_logLevel = Kernel::LogLevel_Info; // Log Level +}; + +/// Descriptor of the box Covariance Matrix Calculator. +class CBoxAlgorithmCovarianceMatrixCalculatorDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return "Covariance Matrix Calculator"; } + CString getAuthorName() const override { return "Thibaut Monseigne"; } + CString getAuthorCompanyName() const override { return "Inria"; } + CString getShortDescription() const override { return "Calculation of the covariance matrix of the input signal."; } + + CString getDetailedDescription() const override + { + return "Calculation of the covariance matrix of the input signal.\nReturns a covariance matrix of size NxN per each input chunk. Where N is the number of channels."; + } + + CString getCategory() const override { return "Riemannian Geometry"; } + CString getVersion() const override { return "0.1"; } + CString getStockItemName() const override { return "gtk-execute"; } + + CIdentifier getCreatedClass() const override { return ClassId_BoxAlgorithm_CovarianceMatrixCalculator; } + IPluginObject* create() override { return new CBoxAlgorithmCovarianceMatrixCalculator; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input Signal", OV_TypeId_Signal); + prototype.addOutput("Output Covariance Matrix", OV_TypeId_StreamedMatrix); + + prototype.addSetting("Estimator", TypeId_Estimator, toString(Geometry::EEstimator::COV).c_str()); + prototype.addSetting("Center Data", OV_TypeId_Boolean, "true"); + prototype.addSetting("Log Level", OV_TypeId_LogLevel, "Information"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, ClassId_BoxAlgorithm_CovarianceMatrixCalculatorDesc) +}; +} // namespace Riemannian +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMatrixToFeatureVector.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMatrixToFeatureVector.cpp new file mode 100644 index 0000000..50066ff --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMatrixToFeatureVector.cpp @@ -0,0 +1,134 @@ +#include "CBoxAlgorithmCovarianceMatrixToFeatureVector.hpp" +#include "utils/misc.hpp" +#include + +#include "geometry/Basics.hpp" +#include "geometry/Featurization.hpp" + +namespace OpenViBE { +namespace Plugins { +namespace Riemannian { +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmCovarianceMatrixToFeatureVector::initialize() +{ + //***** Codec Initialization ***** + m_i0MatrixCodec.initialize(*this, 0); + m_o0FeatureCodec.initialize(*this, 0); + m_iMatrix = m_i0MatrixCodec.getOutputMatrix(); + m_oMatrix = m_o0FeatureCodec.getInputMatrix(); + + //***** Settings Initialization ***** + m_tangentSpace = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_logLevel = Kernel::ELogLevel(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2))); + if (m_tangentSpace) + { + this->getLogManager() << m_logLevel << "Tangent Space\n"; + OV_ERROR_UNLESS_KRF(initRef(), "Error Reference Matrix Creation", Kernel::ErrorType::BadSetting); + } + else { this->getLogManager() << m_logLevel << "Squeeze Upper Matrix\n"; } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmCovarianceMatrixToFeatureVector::uninitialize() +{ + m_i0MatrixCodec.uninitialize(); + m_o0FeatureCodec.uninitialize(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmCovarianceMatrixToFeatureVector::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmCovarianceMatrixToFeatureVector::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_i0MatrixCodec.decode(i); // Decode the chunk + OV_ERROR_UNLESS_KRF(m_iMatrix->getDimensionCount() == 2 && m_iMatrix->getDimensionSize(0) == m_iMatrix->getDimensionSize(1), + "Invalid Input Signal", Kernel::ErrorType::BadInput); + + const size_t nChannels = size_t(m_iMatrix->getDimensionSize(0)); + const uint64_t tStart = boxContext.getInputChunkStartTime(0, i), // Time Code Chunk Start + tEnd = boxContext.getInputChunkEndTime(0, i); // Time Code Chunk End + + if (m_i0MatrixCodec.isHeaderReceived()) // Header received + { + m_oMatrix->resize(nChannels * (nChannels + 1) / 2); // Update Size and set to 0 + m_o0FeatureCodec.encodeHeader(); // Header encoded + } + else if (m_i0MatrixCodec.isBufferReceived()) // Buffer received + { + OV_ERROR_UNLESS_KRF(featurization(), "Featurization Processing Error", Kernel::ErrorType::BadProcessing); // Transformation + m_o0FeatureCodec.encodeBuffer(); // Buffer encoded + } + else if (m_i0MatrixCodec.isEndReceived()) { m_o0FeatureCodec.encodeEnd(); } // End receivded and encoded + + boxContext.markOutputAsReadyToSend(0, tStart, tEnd); // Makes the output available + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmCovarianceMatrixToFeatureVector::featurization() const +{ + Eigen::MatrixXd cov; + Eigen::RowVectorXd v; + if (!MatrixConvert(*m_iMatrix, cov)) { return false; } + if (!Geometry::Featurization(cov, v, m_tangentSpace, m_ref)) { return false; } + if (!MatrixConvert(v, *m_oMatrix)) { return false; } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmCovarianceMatrixToFeatureVector::initRef() +{ + //***** Open the CSV ***** + const CString name = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + if (name.length() == 0) + { + this->getLogManager() << m_logLevel << "Empty reference Matrix\n"; + return true; + } + std::ifstream file(name, std::ifstream::in); + OV_ERROR_UNLESS_KRF(file.is_open(), + "Error opening file [" << name << "] for reading", Kernel::ErrorType::BadFileRead); + + //***** Parse the CSV ***** + std::string line; + getline(file, line); // Header + getline(file, line); // matrix line + std::vector data = Geometry::Split(line, ","); + + //***** Transform to MatrixXd ***** + const auto first = data.begin() + 2, last = data.end() - 3; + const std::vector mat(first, last); + const size_t n = size_t(sqrt(mat.size())); + OV_ERROR_UNLESS_KRF(n*n == mat.size(), "Error Reference Matrix Format", Kernel::ErrorType::BadFileParsing); + m_ref.resize(n, n); + size_t idx = 0; + for (size_t i = 0; i < n; ++i) { for (size_t j = 0; j < n; ++j) { m_ref(i, j) = stod(mat[idx++]); } } + + //***** Log Information ***** + this->getLogManager() << m_logLevel << "REF Matrix : \n" << Geometry::MatrixPrint(m_ref) << "\n"; + + //***** Close the CSV ***** + file.close(); + return true; +} +//--------------------------------------------------------------------------------------------------- +} // namespace Riemannian +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMatrixToFeatureVector.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMatrixToFeatureVector.hpp new file mode 100644 index 0000000..3b34380 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMatrixToFeatureVector.hpp @@ -0,0 +1,93 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmCovarianceMatrixToFeatureVector.hpp +/// \brief Class of the box computing the Feature vector with the covariance matrix. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 17/10/2018. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "defines.hpp" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Riemannian { +/// The class CBoxAlgorithmCovarianceMatrixToFeatureVector describes the box Covariance Matrix To Feature Vector. +class CBoxAlgorithmCovarianceMatrixToFeatureVector final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, ClassId_BoxAlgorithm_CovarianceMatrixToFeatureVector) + +protected: + bool featurization() const; + bool initRef(); + + //***** Codecs ***** + Toolkit::TStreamedMatrixDecoder m_i0MatrixCodec; // Input Matrix Codec + Toolkit::TFeatureVectorEncoder m_o0FeatureCodec; // Output Feature Codec + //***** Matrices ***** + CMatrix* m_iMatrix = nullptr; // Input Matrix pointer + CMatrix* m_oMatrix = nullptr; // Output Matrix pointer + //***** Settings ***** + bool m_tangentSpace = true; // Method to use (only tangent or squeeze now) + Eigen::MatrixXd m_ref; // Reference matrix for tangent space compute + Kernel::ELogLevel m_logLevel = Kernel::LogLevel_Info; // Log Level +}; + +/// Descriptor of the box Covariance Matrix To Feature Vector. +class CBoxAlgorithmCovarianceMatrixToFeatureVectorDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return "Covariance Matrix To Feature Vector"; } + CString getAuthorName() const override { return "Thibaut Monseigne"; } + CString getAuthorCompanyName() const override { return "Inria"; } + CString getShortDescription() const override { return "Transforms a covariance matrix into a feature std::vector"; } + + CString getDetailedDescription() const override + { + return "Transforms a covariance matrix (size : NxN) into a feature std::vector (size : N(N+1)/2).\nThe Setting Tangent Space define if the transformation into std::vector is done in the tanget space or if it is a squeeze of the upper triangular matrix"; + } + + CString getCategory() const override { return "Riemannian Geometry"; } + CString getVersion() const override { return "0.1"; } + CString getStockItemName() const override { return "gtk-jump-to"; } + + CIdentifier getCreatedClass() const override { return ClassId_BoxAlgorithm_CovarianceMatrixToFeatureVector; } + IPluginObject* create() override { return new CBoxAlgorithmCovarianceMatrixToFeatureVector; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input Covariance Matrix",OV_TypeId_StreamedMatrix); + prototype.addOutput("Output Feature Vector",OV_TypeId_FeatureVector); + + prototype.addSetting("Tangent Space", OV_TypeId_Boolean, "true"); + prototype.addSetting("Filename to Reference Matrix (CSV, empty for Identity)", OV_TypeId_Filename, "${Player_ScenarioDirectory}/Mean.csv"); + prototype.addSetting("Log Level", OV_TypeId_LogLevel, "Information"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, ClassId_BoxAlgorithm_CovarianceMatrixToFeatureVectorDesc) +}; +} // namespace Riemannian +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMeanCalculator.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMeanCalculator.cpp new file mode 100644 index 0000000..262fbf9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMeanCalculator.cpp @@ -0,0 +1,171 @@ +#include "CBoxAlgorithmCovarianceMeanCalculator.hpp" +#include +#include "utils/misc.hpp" +#include + +#include "geometry/Basics.hpp" + +namespace OpenViBE { +namespace Plugins { +namespace Riemannian { +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmCovarianceMeanCalculator::initialize() +{ + // Stimulations + m_i0StimulationCodec.initialize(*this, 0); + m_iStimulation = m_i0StimulationCodec.getOutputStimulationSet(); + + // Classes + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + m_nbClass = size_t(boxContext.getInputCount() - 1); + m_i1MatrixCodec.resize(m_nbClass); + m_iMatrix.resize(m_nbClass); + for (size_t k = 0; k < m_nbClass; ++k) + { + m_i1MatrixCodec[k].initialize(*this, k + 1); + m_iMatrix[k] = m_i1MatrixCodec[k].getOutputMatrix(); + } + + m_o0MatrixCodec.initialize(*this, 0); + m_oMatrix = m_o0MatrixCodec.getInputMatrix(); + + // Settings + m_metric = Geometry::EMetric(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0))); + m_filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_stimulationName = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + m_logLevel = Kernel::ELogLevel(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3))); + + this->getLogManager() << m_logLevel << toString(m_metric) << " Metric\n"; + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmCovarianceMeanCalculator::uninitialize() +{ + this->getLogManager() << m_logLevel << m_covs.size() << " Matrices Registered, Mean Matrix : \n" << Geometry::MatrixPrint(m_mean) << "\n"; + + m_i0StimulationCodec.uninitialize(); + for (auto& codec : m_i1MatrixCodec) { codec.uninitialize(); } + m_i1MatrixCodec.clear(); + m_iMatrix.clear(); + m_covs.clear(); + + m_o0MatrixCodec.uninitialize(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmCovarianceMeanCalculator::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmCovarianceMeanCalculator::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + //***** Stimulations ***** + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_i0StimulationCodec.decode(i); // Decode the chunk + if (m_i0StimulationCodec.isBufferReceived()) // Buffer received + { + for (size_t j = 0; j < m_iStimulation->getStimulationCount(); ++j) + { + if (m_iStimulation->getStimulationIdentifier(j) == m_stimulationName) + { + OV_ERROR_UNLESS_KRF(Mean(m_covs, m_mean, m_metric), "Mean Compute Error", Kernel::ErrorType::BadProcessing); // Compute the mean + MatrixConvert(m_mean, *m_oMatrix); + const uint64_t tStart = boxContext.getInputChunkStartTime(0, i),// Time Code Chunk Start + tEnd = boxContext.getInputChunkEndTime(0, i); // Time Code Chunk End + m_o0MatrixCodec.encodeBuffer(); // Buffer encoded + boxContext.markOutputAsReadyToSend(0, tStart, tEnd); // Makes the output available + OV_ERROR_UNLESS_KRF(saveCSV(), "CSV Writing Error", Kernel::ErrorType::BadFileWrite); + } + } + } + } + + //***** Matrix ***** + for (size_t k = 0; k < m_nbClass; ++k) + { + for (size_t i = 0; i < boxContext.getInputChunkCount(k + 1); ++i) + { + m_i1MatrixCodec[k].decode(i); // Decode the chunk + OV_ERROR_UNLESS_KRF(m_iMatrix[k]->getDimensionCount() == 2, "Invalid Input Signal", Kernel::ErrorType::BadInput); + + if (m_i1MatrixCodec[k].isHeaderReceived() && k == 0) // First Header received + { + const uint64_t tStart = boxContext.getInputChunkStartTime(1, i), // Time Code Chunk Start + tEnd = boxContext.getInputChunkEndTime(1, i); // Time Code Chunk End + const size_t n = m_iMatrix[0]->getDimensionSize(0); + m_oMatrix->resize(n, n); // Update Size and set to 0 + m_oMatrix->setNumLabels(); + m_o0MatrixCodec.encodeHeader(); // Header encoded + boxContext.markOutputAsReadyToSend(0, tStart, tEnd); // Makes the output available + } + else if (m_i1MatrixCodec[k].isBufferReceived()) // Buffer received + { + Eigen::MatrixXd cov; + MatrixConvert(*m_iMatrix[k], cov); + m_covs.push_back(cov); + } + else if (m_i1MatrixCodec[k].isEndReceived() && k == 0) // First End received + { + const uint64_t tStart = boxContext.getInputChunkStartTime(1, i), // Time Code Chunk Start + tEnd = boxContext.getInputChunkEndTime(1, i); // Time Code Chunk End + m_o0MatrixCodec.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, tStart, tEnd); // Makes the output available + } + } + } + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmCovarianceMeanCalculator::saveCSV() +{ + if (m_filename.length() == 0) { return true; } + + std::ofstream file; + file.open(m_filename.toASCIIString(), std::ios::trunc); + OV_ERROR_UNLESS_KRF(file.is_open(), + "Error opening file [" << m_filename << "] for writing", Kernel::ErrorType::BadFileWrite); + + // Header + const size_t s = m_mean.rows(); + file << "Time:" << s << "x" << s << ",End Time,"; + for (size_t i = 1; i <= s; ++i) { for (size_t j = 0; j < s; ++j) { file << i << ":,"; } } + file << "Event Id,Event Date,Event Duration\n"; + + // Matrix + file << "0.0000000000,0.0000000000,"; // Time + const Eigen::IOFormat fmt(Eigen::FullPrecision, 0, ", ", ", ", "", "", "", ",,,\n"); + file << m_mean.format(fmt); + file.close(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmCovarianceMeanCalculatorListener::onInputAdded(Kernel::IBox& box, const size_t index) +{ + box.setInputType(index, OV_TypeId_StreamedMatrix); + std::stringstream name; + name << "Input Covariance Matrix " << index; + box.setInputName(index, name.str().c_str()); + return true; +} +//--------------------------------------------------------------------------------------------------- +} // namespace Riemannian +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMeanCalculator.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMeanCalculator.hpp new file mode 100644 index 0000000..18d2031 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmCovarianceMeanCalculator.hpp @@ -0,0 +1,119 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmCovarianceMeanCalculator.hpp +/// \brief Class of the box computing the mean of the covariance matrix. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 12/11/2018. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "defines.hpp" +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Riemannian { +/// The class CBoxAlgorithmCovarianceMeanCalculator describes the box Covariance Mean Calculator. +class CBoxAlgorithmCovarianceMeanCalculator final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, ClassId_BoxAlgorithm_CovarianceMeanCalculator) + +protected: + //***** Codecs ***** + Toolkit::TStimulationDecoder m_i0StimulationCodec; // Input Stimulation Codec + std::vector> m_i1MatrixCodec; // Input Signal Codec + Toolkit::TStreamedMatrixEncoder m_o0MatrixCodec; // Output Codec + //***** Matrices ***** + size_t m_nbClass = 1; // Number of input classes + std::vector m_iMatrix; // Input Matrix pointer + CMatrix* m_oMatrix = nullptr; // Output Matrix pointer + std::vector m_covs; // List of Covariance Matrix + Eigen::MatrixXd m_mean; // Mean + Geometry::EMetric m_metric = Geometry::EMetric::Euclidian; // Metric Used + + //***** Settings ***** + IStimulationSet* m_iStimulation = nullptr; // Stimulation receiver + uint64_t m_stimulationName = OVTK_StimulationId_TrainCompleted; // Name of stimulation to check + Kernel::ELogLevel m_logLevel = Kernel::LogLevel_Info; // Log Level + + // File + CString m_filename; + bool saveCSV(); +}; + + +/// Listener of the box Covariance Mean Calculator. +class CBoxAlgorithmCovarianceMeanCalculatorListener final : public Toolkit::TBoxListener +{ +public: + + bool onInputAdded(Kernel::IBox& box, const size_t index) override; + bool onInputRemoved(Kernel::IBox& box, const size_t index) override { return true; } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +/// Descriptor of the box Covariance Mean Calculator. +class CBoxAlgorithmCovarianceMeanCalculatorDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return "Covariance Mean Calculator"; } + CString getAuthorName() const override { return "Thibaut Monseigne"; } + CString getAuthorCompanyName() const override { return "Inria"; } + CString getShortDescription() const override { return "Calculation of the mean of covariance matrix."; } + + CString getDetailedDescription() const override + { + return "Calculation of the mean of covariance matrix.\nThe Calculation is done when \"OVTK_StimulationId_TrainCompleted\" is received.\nThe Mean is saved in a CSV File."; + } + + CString getCategory() const override { return "Riemannian Geometry"; } + CString getVersion() const override { return "0.1"; } + CString getStockItemName() const override { return "gtk-execute"; } + + CIdentifier getCreatedClass() const override { return ClassId_BoxAlgorithm_CovarianceMeanCalculator; } + IPluginObject* create() override { return new CBoxAlgorithmCovarianceMeanCalculator; } + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmCovarianceMeanCalculatorListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input Stimulation", OV_TypeId_Stimulations); + prototype.addInput("Input Covariance Matrix 1", OV_TypeId_StreamedMatrix); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addOutput("Output Mean Matrix", OV_TypeId_StreamedMatrix); + + prototype.addSetting("Metric", TypeId_Metric, toString(Geometry::EMetric::Riemann).c_str()); + prototype.addSetting("Filename to save Matrix (CSV, empty to not save)",OV_TypeId_Filename, "${Player_ScenarioDirectory}/Mean.csv"); + prototype.addSetting("Stimulation name that triggers the compute",OV_TypeId_Stimulation, "OVTK_StimulationId_TrainCompleted"); + prototype.addSetting("Log Level", OV_TypeId_LogLevel, "Information"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, ClassId_BoxAlgorithm_CovarianceMeanCalculatorDesc) +}; +} // namespace Riemannian +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmFeatureVectorToCovarianceMatrix.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmFeatureVectorToCovarianceMatrix.cpp new file mode 100644 index 0000000..4b691d4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmFeatureVectorToCovarianceMatrix.cpp @@ -0,0 +1,134 @@ +#include "CBoxAlgorithmFeatureVectorToCovarianceMatrix.hpp" +#include "utils/misc.hpp" +#include + +#include "geometry/Basics.hpp" +#include "geometry/Featurization.hpp" + +namespace OpenViBE { +namespace Plugins { +namespace Riemannian { +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmFeatureVectorToCovarianceMatrix::initialize() +{ + //***** Codec Initialization ***** + m_featureDecoder.initialize(*this, 0); + m_matrixEncoder.initialize(*this, 0); + m_iMatrix = m_featureDecoder.getOutputMatrix(); + m_oMatrix = m_matrixEncoder.getInputMatrix(); + + //***** Settings Initialization ***** + m_tangentSpace = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_logLevel = Kernel::ELogLevel(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2))); + if (m_tangentSpace) + { + this->getLogManager() << m_logLevel << "Tangent Space\n"; + OV_ERROR_UNLESS_KRF(initRef(), "Error Reference Matrix Creation", Kernel::ErrorType::BadSetting); + } + else { this->getLogManager() << m_logLevel << "Squeeze Upper Matrix\n"; } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmFeatureVectorToCovarianceMatrix::uninitialize() +{ + m_matrixEncoder.uninitialize(); + m_featureDecoder.uninitialize(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmFeatureVectorToCovarianceMatrix::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmFeatureVectorToCovarianceMatrix::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_featureDecoder.decode(i); // Decode the chunk + OV_ERROR_UNLESS_KRF(m_iMatrix->getDimensionCount() == 1, "Invalid Input Signal", Kernel::ErrorType::BadInput); + + const uint64_t start = boxContext.getInputChunkStartTime(0, i), // Time Code Chunk Start + end = boxContext.getInputChunkEndTime(0, i); // Time Code Chunk End + const size_t nChannels = size_t(m_iMatrix->getDimensionSize(0)); + const size_t nDim = int((sqrt(1 + 8 * nChannels) - 1) / 2); + + if (m_featureDecoder.isHeaderReceived()) // Header received + { + m_oMatrix->resize(nDim, nDim); // Update Size and set to 0 + m_oMatrix->setNumLabels(); + m_matrixEncoder.encodeHeader(); // Header encoded + } + else if (m_featureDecoder.isBufferReceived()) // Buffer received + { + OV_ERROR_UNLESS_KRF(unFeaturization(), "Featurization Processing Error", Kernel::ErrorType::BadProcessing); // Transformation + m_matrixEncoder.encodeBuffer(); // Buffer encoded + } + else if (m_featureDecoder.isEndReceived()) { m_matrixEncoder.encodeEnd(); } // End receivded and encoded + + boxContext.markOutputAsReadyToSend(0, start, end); // Makes the output available + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmFeatureVectorToCovarianceMatrix::unFeaturization() const +{ + Eigen::MatrixXd cov; + Eigen::RowVectorXd v; + if (!MatrixConvert(*m_iMatrix, v)) { return false; } + if (!Geometry::UnFeaturization(v, cov, m_tangentSpace, m_ref)) { return false; } + if (!MatrixConvert(cov, *m_oMatrix)) { return false; } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmFeatureVectorToCovarianceMatrix::initRef() +{ + //***** Open the CSV ***** + const CString name = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + if (name.length() == 0) + { + this->getLogManager() << m_logLevel << "Empty reference Matrix\n"; + return true; + } + std::ifstream file(name, std::ifstream::in); + OV_ERROR_UNLESS_KRF(file.is_open(), "Error opening file [" << name << "] for reading", Kernel::ErrorType::BadFileRead); + + //***** Parse the CSV ***** + std::string line; + getline(file, line); // Header + getline(file, line); // matrix line + std::vector data = Geometry::Split(line, ","); + + //***** Transform to MatrixXd ***** + const auto first = data.begin() + 2, last = data.end() - 3; + const std::vector mat(first, last); + const size_t n = size_t(sqrt(mat.size())); + OV_ERROR_UNLESS_KRF(n*n == mat.size(), "Error Reference Matrix Format", Kernel::ErrorType::BadFileParsing); + m_ref.resize(n, n); + size_t idx = 0; + for (size_t i = 0; i < n; ++i) { for (size_t j = 0; j < n; ++j) { m_ref(i, j) = std::stod(mat[idx++]); } } + + //***** Log Information ***** + this->getLogManager() << m_logLevel << "REF Matrix : \n" << Geometry::MatrixPrint(m_ref) << "\n"; + + //***** Close the CSV ***** + file.close(); + return true; +} +//--------------------------------------------------------------------------------------------------- +} // namespace Riemannian +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmFeatureVectorToCovarianceMatrix.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmFeatureVectorToCovarianceMatrix.hpp new file mode 100644 index 0000000..6bc3225 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmFeatureVectorToCovarianceMatrix.hpp @@ -0,0 +1,93 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmFeatureVectorToCovarianceMatrix.hpp +/// \brief Class of the box computing the Feature vector with the covariance matrix. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 17/10/2018. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "defines.hpp" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Riemannian { +/// The class CBoxAlgorithmFeatureVectorToCovarianceMatrix describes the box Covariance Matrix To Feature Vector. +class CBoxAlgorithmFeatureVectorToCovarianceMatrix final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, ClassId_BoxAlgorithm_FeatureVectorToCovarianceMatrix) + +protected: + bool unFeaturization() const; + bool initRef(); + + //***** Codecs ***** + Toolkit::TFeatureVectorDecoder m_featureDecoder; // Input Feature Codec + Toolkit::TStreamedMatrixEncoder m_matrixEncoder; // Output Matrix Codec + //***** Matrices ***** + CMatrix* m_iMatrix = nullptr; // Input Matrix pointer + CMatrix* m_oMatrix = nullptr; // Output Matrix pointer + //***** Settings ***** + bool m_tangentSpace = true; // Method to use (only tangent or squeeze now) + Eigen::MatrixXd m_ref; // Reference matrix for tangent space compute + Kernel::ELogLevel m_logLevel = Kernel::LogLevel_Info; // Log Level +}; + +/// Descriptor of the box Covariance Matrix To Feature Vector. +class CBoxAlgorithmFeatureVectorToCovarianceMatrixDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return "Feature Vector To Covariance Matrix"; } + CString getAuthorName() const override { return "Thibaut Monseigne"; } + CString getAuthorCompanyName() const override { return "Inria"; } + CString getShortDescription() const override { return "Transforms a feature std::vector into a covariance matrix"; } + + CString getDetailedDescription() const override + { + return "Transforms a feature std::vector (size : N(N+1)/2) into a covariance matrix (size : NxN).\nThe Setting Tangent Space define if the transformation into std::vector is done in the tanget space or if it is a squeeze of the upper triangular matrix"; + } + + CString getCategory() const override { return "Riemannian Geometry"; } + CString getVersion() const override { return "0.1"; } + CString getStockItemName() const override { return "gtk-jump-to"; } + + CIdentifier getCreatedClass() const override { return ClassId_BoxAlgorithm_FeatureVectorToCovarianceMatrix; } + IPluginObject* create() override { return new CBoxAlgorithmFeatureVectorToCovarianceMatrix; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input Feature Vector", OV_TypeId_FeatureVector); + prototype.addOutput("Output Covariance Matrix", OV_TypeId_StreamedMatrix); + + prototype.addSetting("Tangent Space", OV_TypeId_Boolean, "true"); + prototype.addSetting("Filename to Reference Matrix (CSV, empty for Identity)", OV_TypeId_Filename, "${Player_ScenarioDirectory}/Mean.csv"); + prototype.addSetting("Log Level", OV_TypeId_LogLevel, "Information"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, ClassId_BoxAlgorithm_FeatureVectorToCovarianceMatrixDesc) +}; +} // namespace Riemannian +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixAffineTransformation.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixAffineTransformation.cpp new file mode 100644 index 0000000..f937176 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixAffineTransformation.cpp @@ -0,0 +1,101 @@ +#include "CBoxAlgorithmMatrixAffineTransformation.hpp" +#include "utils/misc.hpp" + +namespace OpenViBE { +namespace Plugins { +namespace Riemannian { +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixAffineTransformation::initialize() +{ + // Matrix + m_iMatrixCodec.initialize(*this, 0); + m_iMatrix = m_iMatrixCodec.getOutputMatrix(); + m_oMatrixCodec.initialize(*this, 0); + m_oMatrix = m_oMatrixCodec.getInputMatrix(); + + m_ifilename = CString(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)).toASCIIString(); + m_ofilename = CString(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1)).toASCIIString(); + m_continuous = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + + OV_ERROR_UNLESS_KRF(loadXML(), "Loading XML Error", Kernel::ErrorType::BadFileRead); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixAffineTransformation::uninitialize() +{ + if (!m_continuous && !m_samples.empty() && m_ofilename.length() != 0) + { + OV_ERROR_UNLESS_KRF(m_bias.computeBias(m_samples), "Bias Compute Error", Kernel::ErrorType::BadProcessing); + } + OV_ERROR_UNLESS_KRF(saveXML(), "Saving XML Error", Kernel::ErrorType::BadFileWrite); + m_iMatrixCodec.uninitialize(); + m_oMatrixCodec.uninitialize(); + m_samples.clear(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixAffineTransformation::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixAffineTransformation::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + //***** Matrix ***** + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_iMatrixCodec.decode(i); // Decode the chunk + OV_ERROR_UNLESS_KRF(m_iMatrix->getDimensionCount() == 2, "Invalid Input Signal", Kernel::ErrorType::BadInput); + if (m_iMatrixCodec.isHeaderReceived()) // Header received + { + m_oMatrix->copyDescription(*m_iMatrix); // Update Size and set to 0 + m_oMatrixCodec.encodeHeader(); + } + if (m_iMatrixCodec.isBufferReceived()) // Buffer received + { + Eigen::MatrixXd in, out; + MatrixConvert(*m_iMatrix, in); + m_samples.push_back(in); + if (m_continuous) { m_bias.updateBias(in); } // We update each time + if (m_bias.getBias().size() == 0 + ) { m_bias.setBias(Eigen::MatrixXd::Identity(in.rows(), in.cols())); } // We wan't to apply a bias without bias Identity matrix is used + m_bias.applyBias(in, out); + MatrixConvert(out, *m_oMatrix); + m_oMatrixCodec.encodeBuffer(); + } + else if (m_iMatrixCodec.isEndReceived()) { m_oMatrixCodec.encodeEnd(); } // End received + + const uint64_t tStart = boxContext.getInputChunkStartTime(0, i); // Time Code Chunk Start + const uint64_t tEnd = boxContext.getInputChunkEndTime(0, i); // Time Code Chunk End + boxContext.markOutputAsReadyToSend(0, tStart, tEnd); + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixAffineTransformation::loadXML() +{ + if (m_ifilename.length() == 0) { return true; } // The bias haven't initialization + return m_bias.loadXML(m_ifilename); // The bias have initialization +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixAffineTransformation::saveXML() const +{ + if (m_ofilename.length() == 0) { return true; } // The bias isn't saved + return m_bias.saveXML(m_ofilename); // The bias is saved +} +//--------------------------------------------------------------------------------------------------- +} // namespace Riemannian +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixAffineTransformation.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixAffineTransformation.hpp new file mode 100644 index 0000000..0e90be9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixAffineTransformation.hpp @@ -0,0 +1,97 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmMatrixAffineTransformation.hpp +/// \brief Class of the box Affine Transformation. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 28/08/2019. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "defines.hpp" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Riemannian { +/// The class CBoxAlgorithmMatrixAffineTransformation describes the box Matrix Affine Transformation. +class CBoxAlgorithmMatrixAffineTransformation final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, ClassId_BoxAlgorithm_MatrixAffineTransformation) + +protected: + + bool loadXML(); + bool saveXML() const; + + //***** Codecs ***** + Toolkit::TStreamedMatrixDecoder m_iMatrixCodec; // Input Signal Codec + Toolkit::TStreamedMatrixEncoder m_oMatrixCodec; // Output Signal Codec + + CMatrix *m_iMatrix = nullptr, *m_oMatrix = nullptr; // Input/Output Matrix pointer + + //***** Settings ***** + std::string m_ifilename, m_ofilename; // Input/Output Filename + bool m_continuous = false; + + //***** Variable ***** + Geometry::CBias m_bias; + std::vector m_samples; +}; + +/// Descriptor of the box Matrix Classifier Trainer. +class CBoxAlgorithmMatrixAffineTransformationDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return "Matrix Affine Transformation"; } + CString getAuthorName() const override { return "Thibaut Monseigne"; } + CString getAuthorCompanyName() const override { return "Inria"; } + CString getShortDescription() const override { return "Compute and Apply the Bias matrix for Affine Transformation on square matrix."; } + + CString getDetailedDescription() const override + { + return "Compute and Apply the Reference matrix for Affine Transformation on square matrix (isR * M * isR^(-1) = I).\nYou can load an existing matrix.\nContinuous update is to update Bias at each chunk or at the end."; + } + + CString getCategory() const override { return "Riemannian Geometry"; } + CString getVersion() const override { return "0.1"; } + CString getStockItemName() const override { return "gtk-execute"; } + + CIdentifier getCreatedClass() const override { return ClassId_BoxAlgorithm_MatrixAffineTransformation; } + IPluginObject* create() override { return new CBoxAlgorithmMatrixAffineTransformation; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Square Matrix",OV_TypeId_StreamedMatrix); + prototype.addOutput("Transformed Square Matrix", OV_TypeId_StreamedMatrix); + + prototype.addSetting("Filename to load transformation", OV_TypeId_Filename, "${Player_ScenarioDirectory}/my-transformation-input.xml"); + prototype.addSetting("Filename to save transformation",OV_TypeId_Filename, "${Player_ScenarioDirectory}/my-transformation-output.xml"); + prototype.addSetting("Continuous Update", OV_TypeId_Boolean, "false"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, ClassId_BoxAlgorithm_MatrixAffineTransformationDesc) +}; +} // namespace Riemannian +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixClassifierProcessor.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixClassifierProcessor.cpp new file mode 100644 index 0000000..81feb28 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixClassifierProcessor.cpp @@ -0,0 +1,251 @@ +#include "CBoxAlgorithmMatrixClassifierProcessor.hpp" +#include +#include +#include "utils/misc.hpp" + +namespace OpenViBE { +namespace Plugins { +namespace Riemannian { +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixClassifierProcessor::initialize() +{ + //***** Codecs ***** + m_i0StimulationCodec.initialize(*this, 0); + m_i1MatrixCodec.initialize(*this, 1); + m_o0StimulationCodec.initialize(*this, 0); + m_o1MatrixCodec.initialize(*this, 1); + m_o2MatrixCodec.initialize(*this, 2); + + //***** Pointers ***** + m_i0Stimulation = m_i0StimulationCodec.getOutputStimulationSet(); + m_i1Matrix = m_i1MatrixCodec.getOutputMatrix(); + m_o0Stimulation = m_o0StimulationCodec.getInputStimulationSet(); + m_o1Matrix = m_o1MatrixCodec.getInputMatrix(); + m_o2Matrix = m_o2MatrixCodec.getInputMatrix(); + + // Settings + m_ifilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_ofilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_adaptation = Geometry::EAdaptations(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2))); + + m_logLevel = Kernel::ELogLevel(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3))); + + OV_ERROR_UNLESS_KRF(m_ifilename.length() != 0, "Invalid empty model filename", Kernel::ErrorType::BadSetting); + + OV_ERROR_UNLESS_KRF(loadXML(), "Loading XML Error", Kernel::ErrorType::BadFileRead); + // Change matrix size + m_o1Matrix->resize(m_classifier->getClassCount()); + m_o2Matrix->resize(m_classifier->getClassCount()); + + // Printing info + std::stringstream msg; + msg << std::endl << "Input Filename : " << m_ifilename << std::endl << "Output Filename : " << m_ofilename << std::endl + << "Method : " << m_classifier->getType() << " with " << toString(m_adaptation) << " adaptation" << std::endl + << "Number of classes : " << m_classifier->getClassCount() << std::endl; + for (size_t k = 0; k < m_classifier->getClassCount(); ++k) + { + msg << "Stimulation for class " << k << " : " << m_stimulationClassName[k] << " => [" + << this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, m_stimulationClassName[k]) << "]\n"; + } + this->getLogManager() << m_logLevel << msg.str(); + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixClassifierProcessor::uninitialize() +{ + if (m_ofilename.length() != 0) { saveXML(); } + m_i0StimulationCodec.uninitialize(); + m_i1MatrixCodec.uninitialize(); + m_o0StimulationCodec.uninitialize(); + m_o1MatrixCodec.uninitialize(); + m_o2MatrixCodec.uninitialize(); + + delete m_classifier; // check if pointeur is null is useless now. + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixClassifierProcessor::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixClassifierProcessor::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + //**** Stimulation ***** + if (m_adaptation != Geometry::EAdaptations::None) + { + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_i0StimulationCodec.decode(i); + if (m_i0StimulationCodec.isBufferReceived()) // Buffer received + { + bool finish = false; + for (size_t j = 0; j < m_i0Stimulation->getStimulationCount() && !finish; ++j) + { + const uint64_t stim = m_i0Stimulation->getStimulationIdentifier(j); + for (size_t k = 0; k < m_stimulationClassName.size() && !finish; ++k) + { + if (stim == this->getTypeManager().getEnumerationEntryValueFromName(OV_TypeId_Stimulation, "OVTK_GDF_End_Of_Trial")) + { + m_lastLabelReceived = std::numeric_limits::max(); + finish = true; + } + else if (stim == m_stimulationClassName[k]) + { + m_lastLabelReceived = k; + finish = true; + } + } + } + } + } + } + + //***** Matrix ***** + if (m_adaptation == Geometry::EAdaptations::None || m_lastLabelReceived < m_stimulationClassName.size()) + { + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + m_i1MatrixCodec.decode(i); // Decode the chunk + OV_ERROR_UNLESS_KRF(m_i1Matrix->getDimensionCount() == 2, "Invalid Input Signal", Kernel::ErrorType::BadInput); + const uint64_t tStart = boxContext.getInputChunkStartTime(1, i), // Time Code Chunk Start + tEnd = boxContext.getInputChunkEndTime(1, i); // Time Code Chunk End + + if (m_i1MatrixCodec.isHeaderReceived()) // Header received + { + m_o0StimulationCodec.encodeHeader(); + m_o1MatrixCodec.encodeHeader(); + m_o2MatrixCodec.encodeHeader(); + } + else if (m_i1MatrixCodec.isBufferReceived()) // Buffer received + { + OV_ERROR_UNLESS_KRF(classify(tEnd), "Classify Error", Kernel::ErrorType::BadProcessing); + m_o0StimulationCodec.encodeBuffer(); + m_o1MatrixCodec.encodeBuffer(); + m_o2MatrixCodec.encodeBuffer(); + } + else if (m_i1MatrixCodec.isEndReceived()) // End received + { + m_o0StimulationCodec.encodeEnd(); + m_o1MatrixCodec.encodeEnd(); + m_o2MatrixCodec.encodeEnd(); + } + for (size_t j = 0; j < 3; ++j) { boxContext.markOutputAsReadyToSend(j, tStart, tEnd); } + } + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixClassifierProcessor::classify(const uint64_t tEnd) +{ + std::vector distance, probability; + Eigen::MatrixXd cov; + size_t classId; + MatrixConvert(*m_i1Matrix, cov); + OV_ERROR_UNLESS_KRF(m_classifier->classify(cov, classId, distance, probability, m_adaptation, m_lastLabelReceived), "Classify Error", + Kernel::ErrorType::BadProcessing); + + //Fill Output + m_o0Stimulation->setStimulationCount(1); //No append stimulation only one is used + m_o0Stimulation->setStimulationIdentifier(0, m_stimulationClassName[classId]); + m_o0Stimulation->setStimulationDate(0, tEnd); + m_o0Stimulation->setStimulationDuration(0, 0); + MatrixConvert(distance, *m_o1Matrix); + MatrixConvert(probability, *m_o2Matrix); + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixClassifierProcessor::loadXML() +{ + delete m_classifier; // if (m_classifer != nullptr) useless now + + tinyxml2::XMLDocument xmlDoc; + // Load File + OV_ERROR_UNLESS_KRF(xmlDoc.LoadFile(m_ifilename.toASCIIString()) == 0, "Unable to load xml file : " << m_ifilename.toASCIIString(), + Kernel::ErrorType::BadFileRead); + + // Load Root + tinyxml2::XMLNode* root = xmlDoc.FirstChild(); + OV_ERROR_UNLESS_KRF(root != nullptr, "Unable to get xml root node", Kernel::ErrorType::BadFileParsing); + + // Load Data + tinyxml2::XMLElement* data = root->FirstChildElement("Classifier-data"); + OV_ERROR_UNLESS_KRF(data != nullptr, "Unable to get xml classifier node", Kernel::ErrorType::BadFileParsing); + + const std::string classifierType = data->Attribute("type"); + + // Check Type + if (classifierType == toString(Geometry::EMatrixClassifiers::MDM)) { m_classifier = new Geometry::CMatrixClassifierMDM; } + else if (classifierType == toString(Geometry::EMatrixClassifiers::MDM_Rebias)) { m_classifier = new Geometry::CMatrixClassifierMDMRebias; } + else if (classifierType == toString(Geometry::EMatrixClassifiers::FgMDM_RT)) { m_classifier = new Geometry::CMatrixClassifierFgMDMRT; } + else if (classifierType == toString(Geometry::EMatrixClassifiers::FgMDM_RT_Rebias)) { m_classifier = new Geometry::CMatrixClassifierFgMDMRTRebias; } + else { OV_ERROR_UNLESS_KRF(false, "Incorrect Classifier", Kernel::ErrorType::BadFileParsing); } + + // Object Load + m_classifier->loadXML(m_ifilename.toASCIIString()); + + // Load Stimulation + m_stimulationClassName.resize(m_classifier->getClassCount()); + tinyxml2::XMLElement* element = data->FirstChildElement("Class"); // Get Fist Class Node + for (size_t k = 0; k < m_classifier->getClassCount(); ++k) // for each class + { + OV_ERROR_UNLESS_KRF(element != nullptr, "Invalid class node", Kernel::ErrorType::BadFileParsing); + const size_t idx = element->IntAttribute("class-id"); // Get Id (normally idx = k) + OV_ERROR_UNLESS_KRF(idx == k, "Invalid Class id", Kernel::ErrorType::BadFileParsing); + m_stimulationClassName[k] = this->getTypeManager().getEnumerationEntryValueFromName(OV_TypeId_Stimulation, element->Attribute("stimulation")); + element = element->NextSiblingElement("Class"); // Next Class + } + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixClassifierProcessor::saveXML() +{ + OV_ERROR_UNLESS_KRF(m_classifier->saveXML(m_ofilename.toASCIIString()), "Save failed", Kernel::ErrorType::BadFileWrite); + + //***** Add Stimulation to XML ***** + tinyxml2::XMLDocument xmlDoc; + // Load File + OV_ERROR_UNLESS_KRF(xmlDoc.LoadFile(m_ofilename.toASCIIString()) == 0, "Unable to load xml file : " << m_ofilename.toASCIIString(), + Kernel::ErrorType::BadFileRead); + + // Load Root + tinyxml2::XMLNode* root = xmlDoc.FirstChild(); + OV_ERROR_UNLESS_KRF(root != nullptr, "Unable to get xml root node", Kernel::ErrorType::BadFileParsing); + + // Load Data + tinyxml2::XMLElement* data = root->FirstChildElement("Classifier-data"); + OV_ERROR_UNLESS_KRF(data != nullptr, "Unable to get xml classifier node", Kernel::ErrorType::BadFileParsing); + + tinyxml2::XMLElement* element = data->FirstChildElement("Class"); // Get Fist Class Node + for (size_t k = 0; k < m_classifier->getClassCount(); ++k) // for each class + { + OV_ERROR_UNLESS_KRF(element != nullptr, "Invalid class node", Kernel::ErrorType::BadFileParsing); + const size_t idx = element->IntAttribute("class-id"); // Get Id (normally idx = k) + OV_ERROR_UNLESS_KRF(idx == k, "Invalid Class id", Kernel::ErrorType::BadFileParsing); + const CString stimulationName = this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, m_stimulationClassName[k]); + element->SetAttribute("stimulation", stimulationName.toASCIIString()); + element = element->NextSiblingElement("Class"); // Next Class + } + return xmlDoc.SaveFile(m_ofilename.toASCIIString()) == 0; // save XML (if != 0 it means error) +} +//--------------------------------------------------------------------------------------------------- +} // namespace Riemannian +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixClassifierProcessor.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixClassifierProcessor.hpp new file mode 100644 index 0000000..ebebe1c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixClassifierProcessor.hpp @@ -0,0 +1,105 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmMatrixClassifierProcessor.hpp +/// \brief Class of the box Process a Matrix Classifier. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 17/01/2018. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "defines.hpp" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Riemannian { +/// The class CBoxAlgorithmMatrixClassifierProcessor describes the box Matrix Classifier Processor. +class CBoxAlgorithmMatrixClassifierProcessor final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, ClassId_BoxAlgorithm_MatrixClassifierProcessor) + +protected: + //***** Codecs ***** + Toolkit::TStimulationDecoder m_i0StimulationCodec; + Toolkit::TStreamedMatrixDecoder m_i1MatrixCodec; + Toolkit::TStimulationEncoder m_o0StimulationCodec; + Toolkit::TStreamedMatrixEncoder m_o1MatrixCodec, m_o2MatrixCodec; + + //***** Matrices ***** + CMatrix *m_i1Matrix = nullptr, *m_o1Matrix = nullptr, *m_o2Matrix = nullptr; // Matrix Pointer + Eigen::MatrixXd m_distance, m_probability; // Eigen Matrix + + //***** Stimulations ***** + IStimulationSet *m_i0Stimulation = nullptr, // Stimulation receiver + *m_o0Stimulation = nullptr; // Stimulation sender + std::vector m_stimulationClassName; // Name of stimulation to check for each class + + Geometry::IMatrixClassifier* m_classifier = nullptr; // Classifier + size_t m_lastLabelReceived = std::numeric_limits::max(); // Last label received for Supervised Adaptation + Geometry::EAdaptations m_adaptation = Geometry::EAdaptations::None; // Adaptation Method + + //***** Setting ***** + CString m_ifilename, m_ofilename; + Kernel::ELogLevel m_logLevel = Kernel::LogLevel_Info; // Log Level + + bool classify(uint64_t tEnd); + bool loadXML(); + bool saveXML(); +}; + +/// Descriptor of the box Matrix Classifier Processor. +class CBoxAlgorithmMatrixClassifierProcessorDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return "Matrix Classifier Processor"; } + CString getAuthorName() const override { return "Thibaut Monseigne"; } + CString getAuthorCompanyName() const override { return "Inria"; } + CString getShortDescription() const override { return "Matrix classifier Processor."; } + CString getDetailedDescription() const override { return "Matrix classifier Processor."; } + CString getCategory() const override { return "Riemannian Geometry"; } + CString getVersion() const override { return "0.1"; } + CString getStockItemName() const override { return "gtk-execute"; } + + CIdentifier getCreatedClass() const override { return ClassId_BoxAlgorithm_MatrixClassifierProcessor; } + IPluginObject* create() override { return new CBoxAlgorithmMatrixClassifierProcessor; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Expected Label", OV_TypeId_Stimulations); + prototype.addInput("Input Matrix",OV_TypeId_StreamedMatrix); + + prototype.addOutput("Label",OV_TypeId_Stimulations); + prototype.addOutput("Distance",OV_TypeId_StreamedMatrix); + prototype.addOutput("Probability",OV_TypeId_StreamedMatrix); + + prototype.addSetting("Filename to load classifier model", OV_TypeId_Filename, "${Player_ScenarioDirectory}/input-classifier.xml"); + prototype.addSetting("Filename to save classifier model",OV_TypeId_Filename, "${Player_ScenarioDirectory}/output-classifier.xml"); + prototype.addSetting("Adaptation", TypeId_Classifier_Adaptation, toString(Geometry::EAdaptations::None).c_str()); + prototype.addSetting("Log Level", OV_TypeId_LogLevel, "Information"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, ClassId_BoxAlgorithm_MatrixClassifierProcessorDesc) +}; +} // namespace Riemannian +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixClassifierTrainer.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixClassifierTrainer.cpp new file mode 100644 index 0000000..f6a12c4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixClassifierTrainer.cpp @@ -0,0 +1,231 @@ +#include "CBoxAlgorithmMatrixClassifierTrainer.hpp" +#include +#include +#include +#include "utils/misc.hpp" +#include "boost/format.hpp" + +namespace OpenViBE { +namespace Plugins { +namespace Riemannian { +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixClassifierTrainer::initialize() +{ + // Stimulations + m_i0StimulationCodec.initialize(*this, 0); + m_iStimulation = m_i0StimulationCodec.getOutputStimulationSet(); + + m_o0StimulationCodec.initialize(*this, 0); + m_oStimulation = m_o0StimulationCodec.getInputStimulationSet(); + + // Classes + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + m_nbClass = boxContext.getInputCount() - 1; + m_i1MatrixCodec.resize(m_nbClass); + m_iMatrix.resize(m_nbClass); + m_covs.resize(m_nbClass); + m_stimulationClassName.resize(m_nbClass); + for (size_t k = 0; k < m_nbClass; ++k) + { + m_i1MatrixCodec[k].initialize(*this, k + 1); + m_iMatrix[k] = m_i1MatrixCodec[k].getOutputMatrix(); + m_stimulationClassName[k] = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), k + NON_CLASS_SETTINGS_COUNT)); + } + + // Settings + m_stimulationName = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_method = Geometry::EMatrixClassifiers(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2))); + m_metric = Geometry::EMetric(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3))); + m_logLevel = Kernel::ELogLevel(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4))); + + OV_ERROR_UNLESS_KRF(m_filename.length() != 0, "Invalid empty model filename", Kernel::ErrorType::BadSetting); + + // Printing info + this->getLogManager() << m_logLevel << "\nNumber of classes : " << m_nbClass << "\nFilename : " << m_filename << "\nMethod : " + << toString(m_method) << "\n"; + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixClassifierTrainer::uninitialize() +{ + m_i0StimulationCodec.uninitialize(); + for (auto& codec : m_i1MatrixCodec) { codec.uninitialize(); } + m_i1MatrixCodec.clear(); + m_iMatrix.clear(); + for (auto& cov : m_covs) { cov.clear(); } + m_covs.clear(); + m_stimulationClassName.clear(); + + m_o0StimulationCodec.uninitialize(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixClassifierTrainer::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixClassifierTrainer::process() +{ + if (!m_isTrain) + { + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + //***** Stimulations ***** + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_i0StimulationCodec.decode(i); // Decode the chunk + const uint64_t start = boxContext.getInputChunkStartTime(0, i), // Time Code Chunk Start + end = boxContext.getInputChunkEndTime(0, i); // Time Code Chunk End + + if (m_i0StimulationCodec.isHeaderReceived()) + { + m_o0StimulationCodec.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, 0, 0); + } + if (m_i0StimulationCodec.isBufferReceived()) // Buffer received + { + for (size_t j = 0; j < m_iStimulation->getStimulationCount(); ++j) + { + if (m_iStimulation->getStimulationIdentifier(j) == m_stimulationName) + { + OV_ERROR_UNLESS_KRF(train(), "Train failed", Kernel::ErrorType::BadProcessing); + const uint64_t stim = this->getTypeManager().getEnumerationEntryValueFromName( + OV_TypeId_Stimulation, "OVTK_StimulationId_TrainCompleted"); + m_oStimulation->appendStimulation(stim, m_iStimulation->getStimulationDate(j), 0); + m_isTrain = true; + } + } + m_o0StimulationCodec.encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, start, end); + } + if (m_i0StimulationCodec.isEndReceived()) + { + m_o0StimulationCodec.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, start, end); + } + } + + //***** Matrix ***** + for (size_t k = 0; k < m_nbClass; ++k) + { + for (size_t i = 0; i < boxContext.getInputChunkCount(k + 1); ++i) + { + m_i1MatrixCodec[k].decode(i); // Decode the chunk + OV_ERROR_UNLESS_KRF(m_iMatrix[k]->getDimensionCount() == 2, "Invalid Input Signal", Kernel::ErrorType::BadInput); + + if (m_i1MatrixCodec[k].isBufferReceived()) // Buffer received + { + Eigen::MatrixXd cov; + MatrixConvert(*m_iMatrix[k], cov); + m_covs[k].push_back(cov); + } + } + } + } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixClassifierTrainer::train() +{ + Geometry::IMatrixClassifier* matrixClassifier; + if (m_method == Geometry::EMatrixClassifiers::MDM) { matrixClassifier = new Geometry::CMatrixClassifierMDM; } + else if (m_method == Geometry::EMatrixClassifiers::MDM_Rebias) { matrixClassifier = new Geometry::CMatrixClassifierMDMRebias; } + else if (m_method == Geometry::EMatrixClassifiers::FgMDM_RT) { matrixClassifier = new Geometry::CMatrixClassifierFgMDMRT; } + else if (m_method == Geometry::EMatrixClassifiers::FgMDM_RT_Rebias) { matrixClassifier = new Geometry::CMatrixClassifierFgMDMRTRebias; } + else { OV_ERROR_UNLESS_KRF(false, "Incorrect Selected Method", Kernel::ErrorType::BadSetting); } + + this->getLogManager() << m_logLevel << "Train Beginning...\n"; + OV_ERROR_UNLESS_KRF(matrixClassifier->train(m_covs), "Train failed", Kernel::ErrorType::BadProcessing); + this->getLogManager() << m_logLevel << "Train Finished. Save Beginning...\n"; + OV_ERROR_UNLESS_KRF(saveXML(matrixClassifier), "Save failed", Kernel::ErrorType::BadProcessing); + this->getLogManager() << m_logLevel << "Save Finished.\n"; + + delete matrixClassifier; + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixClassifierTrainer::saveXML(Geometry::IMatrixClassifier* classifier) +{ + OV_ERROR_UNLESS_KRF(classifier->saveXML(m_filename.toASCIIString()), "Save failed", Kernel::ErrorType::BadFileWrite); + + //***** Add Stimulation to XML ***** + tinyxml2::XMLDocument xmlDoc; + // Load File + OV_ERROR_UNLESS_KRF(xmlDoc.LoadFile(m_filename.toASCIIString()) == 0, "Unable to load xml file : " << m_filename.toASCIIString(), + Kernel::ErrorType::BadFileRead); + + // Load Root + tinyxml2::XMLNode* root = xmlDoc.FirstChild(); + OV_ERROR_UNLESS_KRF(root != nullptr, "Unable to get xml root node", Kernel::ErrorType::BadFileParsing); + + // Load Data + tinyxml2::XMLElement* data = root->FirstChildElement("Classifier-data"); + OV_ERROR_UNLESS_KRF(data != nullptr, "Unable to get xml classifier node", Kernel::ErrorType::BadFileParsing); + + tinyxml2::XMLElement* element = data->FirstChildElement("Class"); // Get Fist Class Node + for (size_t k = 0; k < classifier->getClassCount(); ++k) // for each class + { + OV_ERROR_UNLESS_KRF(element != nullptr, "Invalid class node", Kernel::ErrorType::BadFileParsing); + const size_t idx = element->IntAttribute("class-id"); // Get Id (normally idx = k) + OV_ERROR_UNLESS_KRF(idx == k, "Invalid Class id", Kernel::ErrorType::BadFileParsing); + const CString stimulationName = this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, m_stimulationClassName[k]); + element->SetAttribute("stimulation", stimulationName.toASCIIString()); + element = element->NextSiblingElement("Class"); // Next Class + } + return xmlDoc.SaveFile(m_filename.toASCIIString()) == 0; // save XML (if != 0 it means error) +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixClassifierTrainerListener::onInputAdded(Kernel::IBox& box, const size_t index) +{ + box.setInputType(index, OV_TypeId_StreamedMatrix); + box.setInputName(index, ("Matrix for class " + std::to_string(index)).c_str()); + + const boost::format stimulation = boost::format("OVTK_StimulationId_Label_%02u") % index; + box.addSetting(("Class " + std::to_string(index) + " label").c_str(), OV_TypeId_Stimulation, stimulation.str().c_str()); + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmMatrixClassifierTrainerListener::onInputRemoved(Kernel::IBox& box, const size_t index) +{ + const size_t offset = CBoxAlgorithmMatrixClassifierTrainer::NON_CLASS_SETTINGS_COUNT - 1; + // (avoid the 5 first setting but class begin at input 1 so + 4) + box.removeSetting(index + offset); + //check if the removed class is not the last + if (index != box.getInputCount()) + { + for (size_t k = index; k < box.getInputCount(); ++k) + { + box.setInputName(k, ("Matrix for class " + std::to_string(k)).c_str()); + + std::string stimulation = (boost::format("OVTK_StimulationId_Label_%02u") % k).str(); + box.setSettingName(k + offset - 1, ("Class " + std::to_string(k) + " label").c_str()); // -1 because one is removed + box.setSettingDefaultValue(k + offset - 1, stimulation.c_str()); + box.setSettingValue(k + offset - 1, stimulation.c_str()); + } + } + + return true; +} +//--------------------------------------------------------------------------------------------------- +} // namespace Riemannian +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixClassifierTrainer.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixClassifierTrainer.hpp new file mode 100644 index 0000000..942afaa --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/boxes/CBoxAlgorithmMatrixClassifierTrainer.hpp @@ -0,0 +1,128 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmMatrixClassifierProcessor.hpp +/// \brief Class of the box Train a Matrix Classifier. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 17/01/2018. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "defines.hpp" +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Riemannian { +/// The class CBoxAlgorithmMatrixClassifierTrainer describes the box Matrix Classifier Trainer. +class CBoxAlgorithmMatrixClassifierTrainer final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, ClassId_BoxAlgorithm_MatrixClassifierTrainer) + + static const size_t NON_CLASS_SETTINGS_COUNT = 5; // Train trigger + Filename + Method + Metric + Log Level + +protected: + //***** Codecs ***** + Toolkit::TStimulationDecoder m_i0StimulationCodec; + std::vector> m_i1MatrixCodec; // Input Signal Codec + Toolkit::TStimulationEncoder m_o0StimulationCodec; + + //***** Matrices ***** + size_t m_nbClass = 2; // Number of input classes + std::vector m_iMatrix; // Input Matrix pointer + std::vector> m_covs; // List of Covariance Matrix one class by row + + //***** Stimulations ***** + IStimulationSet *m_iStimulation = nullptr, // Stimulation receiver + *m_oStimulation = nullptr; // Stimulation sender + uint64_t m_stimulationName = OVTK_StimulationId_Train; // Name of stimulation to check for train launch + std::vector m_stimulationClassName; // Name of stimulation to check for each class + bool m_isTrain = false; + + //***** Settings ***** + Kernel::ELogLevel m_logLevel = Kernel::LogLevel_Info; // Log Level + Geometry::EMatrixClassifiers m_method = Geometry::EMatrixClassifiers::MDM; + Geometry::EMetric m_metric = Geometry::EMetric::Riemann; + + //***** File ***** + CString m_filename; + + bool train(); + bool saveXML(Geometry::IMatrixClassifier* classifier); +}; + +/// Listener of the box Matrix Classifier Trainer. +class CBoxAlgorithmMatrixClassifierTrainerListener final : public Toolkit::TBoxListener +{ +public: + + bool onInputAdded(Kernel::IBox& box, const size_t index) override; + bool onInputRemoved(Kernel::IBox& box, const size_t index) override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +/// Descriptor of the box Matrix Classifier Trainer. +class CBoxAlgorithmMatrixClassifierTrainerDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return "Matrix Classifier Trainer"; } + CString getAuthorName() const override { return "Thibaut Monseigne"; } + CString getAuthorCompanyName() const override { return "Inria"; } + CString getShortDescription() const override { return "Matrix classifier trainer."; } + CString getDetailedDescription() const override { return "Matrix classifier trainer."; } + CString getCategory() const override { return "Riemannian Geometry"; } + CString getVersion() const override { return "0.1"; } + CString getStockItemName() const override { return "gtk-execute"; } + + CIdentifier getCreatedClass() const override { return ClassId_BoxAlgorithm_MatrixClassifierTrainer; } + IPluginObject* create() override { return new CBoxAlgorithmMatrixClassifierTrainer; } + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmMatrixClassifierTrainerListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Stimulations",OV_TypeId_Stimulations); + prototype.addInput("Matrix for class 1",OV_TypeId_StreamedMatrix); + prototype.addInput("Matrix for class 2",OV_TypeId_StreamedMatrix); + + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + + prototype.addOutput("Tran-completed Flag",OV_TypeId_Stimulations); + + prototype.addSetting("Train trigger", OV_TypeId_Stimulation, "OVTK_StimulationId_Train"); + prototype.addSetting("Filename to save classifier model",OV_TypeId_Filename, "${Player_ScenarioDirectory}/my-classifier.xml"); + prototype.addSetting("Method", TypeId_Matrix_Classifier, toString(Geometry::EMatrixClassifiers::MDM).c_str()); + prototype.addSetting("Metric", TypeId_Metric, toString(Geometry::EMetric::Riemann).c_str()); + prototype.addSetting("Log Level", OV_TypeId_LogLevel, "Information"); + prototype.addSetting("Class 1 label", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_01"); + prototype.addSetting("Class 2 label", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_02"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, ClassId_BoxAlgorithm_MatrixClassifierTrainerDesc) +}; +} // namespace Riemannian +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/defines.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/defines.hpp new file mode 100644 index 0000000..2086872 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/defines.hpp @@ -0,0 +1,41 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file defines.hpp +/// \brief Defines list for Setting, Shortcut Macro and const. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 26/10/2018. +/// \copyright GNU Affero General Public License v3.0. +/// \remarks +/// - List of Estimator inspired by the work of Alexandre Barachant : pyRiemann (License). +/// - List of Metrics inspired by the work of Alexandre Barachant : pyRiemann (License). +/// +///------------------------------------------------------------------------------------------------- + +#pragma once +namespace OpenViBE { +// Boxes +//--------------------------------------------------------------------------------------------------- +#define ClassId_BoxAlgorithm_CovarianceMeanCalculator CIdentifier(0x67955ea4, 0x7c643c0f) +#define ClassId_BoxAlgorithm_CovarianceMeanCalculatorDesc CIdentifier(0x62e8f759, 0xd59d82a9) +#define ClassId_BoxAlgorithm_MatrixClassifierTrainer CIdentifier(0xc0b79b42, 0x4150c837) +#define ClassId_BoxAlgorithm_MatrixClassifierTrainerDesc CIdentifier(0x26f4fa93, 0x704d39dd) +#define ClassId_BoxAlgorithm_MatrixClassifierProcessor CIdentifier(0x918f6952, 0xb22ddf0d) +#define ClassId_BoxAlgorithm_MatrixClassifierProcessorDesc CIdentifier(0x8cf29eec, 0x223fbfc5) +#define ClassId_BoxAlgorithm_CovarianceMatrixToFeatureVector CIdentifier(0x7c265dba, 0x202c1f70) +#define ClassId_BoxAlgorithm_CovarianceMatrixToFeatureVectorDesc CIdentifier(0xc0fb0445, 0x0d1cd546) +#define ClassId_BoxAlgorithm_FeatureVectorToCovarianceMatrix CIdentifier(0x7c265dba, 0x202c1f71) +#define ClassId_BoxAlgorithm_FeatureVectorToCovarianceMatrixDesc CIdentifier(0xc0fb0445, 0x0d1cd541) +#define ClassId_BoxAlgorithm_CovarianceMatrixCalculator CIdentifier(0x9a93af80, 0x6449c826) +#define ClassId_BoxAlgorithm_CovarianceMatrixCalculatorDesc CIdentifier(0x12fcd91f, 0xd1d8f678) +#define ClassId_BoxAlgorithm_MatrixAffineTransformation CIdentifier(0x1BAA7180, 0x52CB19B8) +#define ClassId_BoxAlgorithm_MatrixAffineTransformationDesc CIdentifier(0x0AF511E5, 0x27137BBA) + +// Mthodes/Types Lists +//--------------------------------------------------------------------------------------------------- +#define TypeId_Estimator CIdentifier(0x5261636B, 0x45535449) +#define TypeId_Metric CIdentifier(0x5261636B, 0x4D455452) +#define TypeId_Matrix_Classifier CIdentifier(0x5261636B, 0x436C6173) +#define TypeId_Classifier_Adaptation CIdentifier(0x5261636B, 0x41646170) +//--------------------------------------------------------------------------------------------------- +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/main.cpp new file mode 100644 index 0000000..77c38b0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/main.cpp @@ -0,0 +1,64 @@ +#include +#include "defines.hpp" + +// Boxes Includes +#include "boxes/CBoxAlgorithmCovarianceMatrixCalculator.hpp" +#include "boxes/CBoxAlgorithmCovarianceMatrixToFeatureVector.hpp" +#include "boxes/CBoxAlgorithmFeatureVectorToCovarianceMatrix.hpp" +#include "boxes/CBoxAlgorithmCovarianceMeanCalculator.hpp" +#include "boxes/CBoxAlgorithmMatrixClassifierTrainer.hpp" +#include "boxes/CBoxAlgorithmMatrixClassifierProcessor.hpp" +#include "boxes/CBoxAlgorithmMatrixAffineTransformation.hpp" + +namespace OpenViBE { +namespace Plugins { + +template +static void setEnumeration(const Kernel::IPluginModuleContext& context, const CIdentifier& typeID, const std::string& name, const std::vector& enumeration) +{ + context.getTypeManager().registerEnumerationType(typeID, name.c_str()); + for (const auto& e : enumeration) { context.getTypeManager().registerEnumerationEntry(typeID, toString(e).c_str(), size_t(e)); } +} + + +OVP_Declare_Begin() + // Register boxes + OVP_Declare_New(Riemannian::CBoxAlgorithmCovarianceMatrixCalculatorDesc); + OVP_Declare_New(Riemannian::CBoxAlgorithmCovarianceMatrixToFeatureVectorDesc); + OVP_Declare_New(Riemannian::CBoxAlgorithmFeatureVectorToCovarianceMatrixDesc); + OVP_Declare_New(Riemannian::CBoxAlgorithmCovarianceMeanCalculatorDesc); + OVP_Declare_New(Riemannian::CBoxAlgorithmMatrixClassifierTrainerDesc); + OVP_Declare_New(Riemannian::CBoxAlgorithmMatrixClassifierProcessorDesc); + OVP_Declare_New(Riemannian::CBoxAlgorithmMatrixAffineTransformationDesc); + + // Enumeration Estimator + const std::vector estimators = { + Geometry::EEstimator::COV, Geometry::EEstimator::COR, Geometry::EEstimator::LWF, + Geometry::EEstimator::SCM, Geometry::EEstimator::OAS, Geometry::EEstimator::IDE + }; + setEnumeration(context, TypeId_Estimator, "Estimator", estimators); + + // Enumeration Metric + const std::vector metrics = { + Geometry::EMetric::Riemann, Geometry::EMetric::Euclidian, Geometry::EMetric::LogEuclidian, Geometry::EMetric::LogDet, + Geometry::EMetric::Kullback, Geometry::EMetric::Harmonic, Geometry::EMetric::Identity + }; + setEnumeration(context, TypeId_Metric, "Metric", metrics); + + // Enumeration Classifier + const std::vector classifiers = { + Geometry::EMatrixClassifiers::MDM, Geometry::EMatrixClassifiers::MDM_Rebias, + Geometry::EMatrixClassifiers::FgMDM_RT, Geometry::EMatrixClassifiers::FgMDM_RT_Rebias + }; + setEnumeration(context, TypeId_Matrix_Classifier, "Matrix Classifier", classifiers); + + // Enumeration Classifier Adaptater + const std::vector adaptations = { + Geometry::EAdaptations::None, Geometry::EAdaptations::Supervised, Geometry::EAdaptations::Unsupervised + }; + setEnumeration(context, TypeId_Classifier_Adaptation, "Classifier Adaptation", adaptations); + +OVP_Declare_End() + +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/utils/misc.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/utils/misc.cpp new file mode 100644 index 0000000..450b45b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/utils/misc.cpp @@ -0,0 +1,67 @@ +#include "utils/misc.hpp" + +//***************************************************** +//******************** CONVERSIONS ******************** +//***************************************************** +//--------------------------------------------------------------------------------------------------- +bool MatrixConvert(const OpenViBE::CMatrix& in, Eigen::MatrixXd& out) +{ + if (in.getDimensionCount() != 2) { return false; } + out.resize(in.getDimensionSize(0), in.getDimensionSize(1)); + + // double loop to avoid the problem of row major and column major storage + size_t idx = 0; + const double* buffer = in.getBuffer(); + for (size_t i = 0, nR = out.rows(); i < nR; ++i) { for (size_t j = 0, nC = out.cols(); j < nC; ++j) { out(i, j) = buffer[idx++]; } } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MatrixConvert(const Eigen::MatrixXd& in, OpenViBE::CMatrix& out) +{ + if (in.rows() == 0 || in.cols() == 0) { return false; } + const size_t nR = in.rows(), nC = in.cols(); + out.resize(nR, nC); + out.setNumLabels(); + + // double loop to avoid the problem of row major and column major storage + size_t idx = 0; + double* buffer = out.getBuffer(); + for (size_t i = 0; i < nR; ++i) { for (size_t j = 0; j < nC; ++j) { buffer[idx++] = in(i, j); } } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MatrixConvert(const Eigen::RowVectorXd& in, OpenViBE::CMatrix& out) +{ + if (in.size() == 0) { return false; } + out.resize(in.size()); + //one row system copy doesn't cause problem + std::copy_n(in.data(), out.getSize(), out.getBuffer()); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MatrixConvert(const OpenViBE::CMatrix& in, Eigen::RowVectorXd& out) +{ + if (in.getDimensionCount() != 1) { return false; } + out.resize(in.getDimensionSize(0)); + //one row system copy doesn't cause problem + std::copy_n(in.getBuffer(), in.getSize(), out.data()); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool MatrixConvert(const std::vector& in, OpenViBE::CMatrix& out) +{ + if (in.empty()) { return false; } + out.resize(in.size()); + //one row system copy doesn't cause problem + std::copy_n(in.data(), out.getSize(), out.getBuffer()); + return true; +} +//--------------------------------------------------------------------------------------------------- diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/utils/misc.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/utils/misc.hpp new file mode 100644 index 0000000..4a4e67b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/src/utils/misc.hpp @@ -0,0 +1,43 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file misc.hpp +/// \brief All functions to Convert OpenViBE::CMatrix and Eigen::MatrixXd, links to Eigen function, manipulate OpenVibe::CMatrix and more. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 26/10/2018. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include +#include + +//***************************************************** +//******************** Conversions ******************** +//***************************************************** +/// Convert OpenViBE Matrix to Eigen Matrix. +/// The Eigen Matrix. +/// The OpenVibe Matrix. +bool MatrixConvert(const OpenViBE::CMatrix& in, Eigen::MatrixXd& out); + +/// Convert Eigen Matrix to OpenViBE Matrix (It doesn't use Memory::copy because of Eigne store in column major by default). +/// The Eigen Matrix. +/// The OpenVibe Matrix. +bool MatrixConvert(const Eigen::MatrixXd& in, OpenViBE::CMatrix& out); + +/// Convert Eigen Row Vector to OpenViBE Matrix with one dimension. +/// The Eigen Row Vector. +/// The OpenVibe Matrix. +bool MatrixConvert(const Eigen::RowVectorXd& in, OpenViBE::CMatrix& out); + +/// Convert OpenViBE Matrix with one dimension to Eigen Row Vector. +/// The OpenVibe Matrix. +/// The Eigen Row Vector. +bool MatrixConvert(const OpenViBE::CMatrix& in, Eigen::RowVectorXd& out); + +/// Convertvector double to OpenViBE Matrix with one dimension. +/// The Vector of double. +/// The OpenVibe Matrix. +bool MatrixConvert(const std::vector& in, OpenViBE::CMatrix& out); diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/DartTestfile.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/DartTestfile.txt new file mode 100644 index 0000000..c377dd0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/DartTestfile.txt @@ -0,0 +1,110 @@ + +IF(WIN32) + SET(EXT cmd) + SET(OS_FLAGS "--no-pause") +ELSE() + SET(EXT sh) + SET(OS_FLAGS "") +ENDIF() + +SET(PATH_TEST scenarios-tests) + +############ +SET(TEST_NAME Covariance-Matrix-Calculator) + +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${PATH_TEST}/${TEST_NAME}-output.csv") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" "${PATH_TEST}/${TEST_NAME}-test.xml") +ADD_TEST(compare_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "${PATH_TEST}/${TEST_NAME}-output.csv" "${PATH_TEST}/${TEST_NAME}-ref.csv" 0.0001) + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_CONFIG_SUBDIR}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL "${PATH_TEST}/${TEST_NAME}-output.csv") +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) + +############## + +#SET(TEST_NAME Covariance-Mean-Calculator) + +#ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${PATH_TEST}/${TEST_NAME}-output.csv") +#ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" "${PATH_TEST}/${TEST_NAME}-test.xml") +#ADD_TEST(compare_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "${PATH_TEST}/${TEST_NAME}-output.csv" "${PATH_TEST}/${TEST_NAME}-ref.csv" 0.0001) + +#SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_CONFIG_SUBDIR}) +#SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL "${PATH_TEST}/${TEST_NAME}-output.csv") +#SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}) +#SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) + +############# + +SET(TEST_NAME Covariance-To-Feature) + +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${PATH_TEST}/${TEST_NAME}-output.csv") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" "${PATH_TEST}/${TEST_NAME}-test.xml") +ADD_TEST(compare_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "${PATH_TEST}/${TEST_NAME}-output.csv" "${PATH_TEST}/${TEST_NAME}-ref.csv" 0.0001) + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_CONFIG_SUBDIR}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL "${PATH_TEST}/${TEST_NAME}-output.csv") +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) + +############# + +SET(TEST_NAME Feature-To-Covariance) + +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${PATH_TEST}/${TEST_NAME}-output.csv") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" "${PATH_TEST}/${TEST_NAME}-test.xml") +ADD_TEST(compare_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "${PATH_TEST}/${TEST_NAME}-output.csv" "${PATH_TEST}/${TEST_NAME}-ref.csv" 0.0001) + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_CONFIG_SUBDIR}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL "${PATH_TEST}/${TEST_NAME}-output.csv") +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) + +############# + +#SET(TEST_NAME Matrix-Classifier-Training) + +#ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${PATH_TEST}/${TEST_NAME}-Model-FgMDM-ref-output.csv") +#ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" "${PATH_TEST}/${TEST_NAME}-test.xml") + + +############# + +SET(TEST_NAME Matrix-Classifier-Testing) + +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${PATH_TEST}/${TEST_NAME}-output.csv") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" "${PATH_TEST}/${TEST_NAME}-test.xml") +ADD_TEST(compare_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "${PATH_TEST}/${TEST_NAME}-output.csv" "${PATH_TEST}/${TEST_NAME}-ref.csv" 0.0001) + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_CONFIG_SUBDIR}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL "${PATH_TEST}/${TEST_NAME}-output.csv") +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) + + +############# + +SET(TEST_NAME Matrix-Classifier-Testing-Supervised) + +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${PATH_TEST}/${TEST_NAME}-output.csv") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" "${PATH_TEST}/${TEST_NAME}-test.xml") +ADD_TEST(compare_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "${PATH_TEST}/${TEST_NAME}-output.csv" "${PATH_TEST}/${TEST_NAME}-ref.csv" 0.0001) + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_CONFIG_SUBDIR}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL "${PATH_TEST}/${TEST_NAME}-output.csv") +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) + + +############# + +SET(TEST_NAME Matrix-Classifier-Testing-Unsupervised) + +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${PATH_TEST}/${TEST_NAME}-output.csv") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" "${PATH_TEST}/${TEST_NAME}-test.xml") +ADD_TEST(compare_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "${PATH_TEST}/${TEST_NAME}-output.csv" "${PATH_TEST}/${TEST_NAME}-ref.csv" 0.0001) + +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_CONFIG_SUBDIR}) +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL "${PATH_TEST}/${TEST_NAME}-output.csv") +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Matrix-Calculator-input.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Matrix-Calculator-input.csv new file mode 100644 index 0000000..8ee4314 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Matrix-Calculator-input.csv @@ -0,0 +1,13 @@ +Time:3x10,End Time,1:,1:,1:,1:,1:,1:,1:,1:,1:,1:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,2:,Event Id,Event Date,Event Duration +0.0000000,0.500000, -3, -4, -5, -4, -6, -1, -4, -1, -3, -1, 0, -3, -3, 1, -2, 1, -2, 1, -1, -1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1,,, +0.5000000,1.000000, -1, -4, -5, -4, -6, -6, -3, -3, -6, -4, -3, -1, 0, -3, 0, 0, -2, -2, -3, -3, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0,,, +1.0000000,1.500000, -4, -2, -4, -5, -3, -1, -6, -3, -3, -4, 0, -3, -2, -2, -3, 0, -1, -2, -1, -2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,,, +1.5000000,2.000000, -5, -3, -1, -1, -2, -4, -1, -6, -4, -4, 0, 0, -2, -2, -2, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,,, +2.0000000,2.500000, -2, -1, -5, -2, -6, -5, -6, -4, -6, -6, -1, -3, -2, -3, -1, -1, 1, 0, 0, -3, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1,,, +2.5000000,3.000000, -5, -3, -4, -1, -3, -6, -5, -3, -2, -5, -2, -3, 1, -3, -1, -2, 0, -1, 1, -2, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0,,, +3.0000000,3.500000, -3, -3, -1, -4, -1, -6, -2, -5, -3, -3, -1, -3, -2, 1, 0, 0, -3, -3, -3, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0,,, +3.5000000,4.000000, 0, 3, 1, 1, 2, 3, 1, 3, 3, 2, 0, 1, 1, -1, -2, 0, -2, 1, 2, 0, 4, 3, 3, 3, 4, 4, 4, 5, 4, 3,,, +4.0000000,4.500000, 3, 2, 1, 2, 1, 2, 3, 3, 1, 4, -2, -2, -1, 0, 0, -1, 3, 0, -1, 3, 4, 4, 3, 4, 3, 5, 5, 4, 5, 4,,, +4.5000000,5.000000, 3, 2, 3, 3, 0, 0, 0, 1, 2, 3, 3, 2, 0, 3, 3, -2, 3, 3, -2, 2, 5, 3, 4, 4, 5, 4, 3, 3, 5, 4,,, +5.0000000,5.500000, 0, 3, 1, 4, 3, 1, 2, 3, 0, 0, -2, 1, 1, 0, 2, -1, 3, -1, 2, -2, 3, 3, 5, 4, 4, 4, 5, 4, 5, 5,,, +5.5000000,6.000000, 1, 2, 1, 2, 2, 0, 0, 0, 0, 4, 1, 3, 0, -2, 1, 0, 0, 2, -2, 2, 5, 3, 5, 5, 5, 3, 4, 4, 3, 3,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Matrix-Calculator-ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Matrix-Calculator-ref.csv new file mode 100644 index 0000000..c486d1d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Matrix-Calculator-ref.csv @@ -0,0 +1,73 @@ +Time:3x3,End Time,1:,1:,1:,2:,2:,2:,3:,3:,3:,Event Id,Event Date,Event Duration +0.0000000000,0.5000000000, 2.76, 1.62, 0.62, 1.62, 2.29, 0.64, 0.62, 0.64, 0.24,,, +0.0000000000,0.5000000000, 1.00, 0.644381009, 0.76178344, 0.644381009, 1.00, 0.863289805, 0.76178344, 0.863289805, 1.00,,, +0.0000000000,0.5000000000, 2.5849288, 1.33543611, 0.511092833, 1.33543611, 2.19748746, 0.527579698, 0.511092833, 0.527579698, 0.507583739,,, +0.0000000000,0.5000000000, 2.34520102, 0.945778241, 0.361964512, 0.945778241, 2.07080856, 0.373640786, 0.361964512, 0.373640786, 0.87399042,,, +0.0000000000,0.5000000000, 0.77844311, 0.26946108, -0.07784431, 0.26946108, 0.18562874, 0.00598802, -0.07784431, 0.00598802, 0.03592814,,, +0.0000000000,0.5000000000, 1.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 1.00,,, +0.5000000000,1.0000000000, 2.36, -1.04, -0.24, -1.04, 1.61, 0.11, -0.24, 0.11, 0.21,,, +0.5000000000,1.0000000000, 1.00, -0.533536825, -0.340914594, -0.533536825, 1.00, 0.189177769, -0.340914594, 0.189177769, 1.00,,, +0.5000000000,1.0000000000, 1.99839975, -0.650968006, -0.150223386, -0.650968006, 1.52895167, 0.0688523853, -0.150223386, 0.0688523853, 0.652648582,,, +0.5000000000,1.0000000000, 1.83506857, -0.475246188, -0.109672197, -0.475246188, 1.49234296, 0.0502664238, -0.109672197, 0.0502664238, 0.852588472,,, +0.5000000000,1.0000000000, 0.80645161, 0.24596774, -0.06048387, 0.24596774, 0.18145161, -0.01612903, -0.06048387, -0.01612903, 0.01209677,,, +0.5000000000,1.0000000000, 1.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 1.00,,, +1.0000000000,1.5000000000, 1.85, -0.00, 0.05, -0.00, 1.04, 0.04, 0.05, 0.04, 0.09,,, +1.0000000000,1.5000000000, 1.00, -0.00, 0.12253577, -0.00, 1.00, 0.13074409, 0.12253577, 0.13074409, 1.00,,, +1.0000000000,1.5000000000, 1.21758058, -0.00, 0.013088361, -0.00, 1.00554914, 0.0104706888, 0.013088361, 0.0104706888, 0.756870279,,, +1.0000000000,1.5000000000, 1.18111558, -0.00, 0.0109600534, -0.00, 1.00356272, 0.00876804276, 0.0109600534, 0.00876804276, 0.795321701,,, +1.0000000000,1.5000000000, 0.75806452, 0.30107527, -0.16666667, 0.30107527, 0.19354839, -0.07526882, -0.16666667, -0.07526882, 0.0483871,,, +1.0000000000,1.5000000000, 1.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 1.00,,, +1.5000000000,2.0000000000, 2.89, -0.77, -0.19, -0.77, 0.81, 0.07, -0.19, 0.07, 0.09,,, +1.5000000000,2.0000000000, 1.00, -0.503267974, -0.37254902, -0.503267974, 1.00, 0.259259259, -0.37254902, 0.259259259, 1.00,,, +1.5000000000,2.0000000000, 2.57527815, -0.621023059, -0.153239456, -0.621023059, 0.897709368, 0.0564566417, -0.153239456, 0.0564566417, 0.317012482,,, +1.5000000000,2.0000000000, 2.22680827, -0.45607113, -0.112537032, -0.45607113, 0.994823924, 0.0414610118, -0.112537032, 0.0414610118, 0.568367802,,, +1.5000000000,2.0000000000, 0.89928058, 0.10071942, -0.03597122, 0.10071942, 0.09352518, 0.00, -0.03597122, 0.00, 0.00719424,,, +1.5000000000,2.0000000000, 1.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 1.00,,, +2.0000000000,2.5000000000, 3.41, -1.19, -0.15, -1.19, 1.81, -0.15, -0.15, -0.15, 0.25,,, +2.0000000000,2.5000000000, 1.00, -0.478994453, -0.162459108, -0.478994453, 1.00, -0.222988244, -0.162459108, -0.222988244, 1.00,,, +2.0000000000,2.5000000000, 2.87232755, -0.786745664, -0.0991696216, -0.786745664, 1.81451826, -0.0991696216, -0.0991696216, -0.0991696216, 0.783154191,,, +2.0000000000,2.5000000000, 2.53874679, -0.536560096, -0.0676336255, -0.536560096, 1.81732146, -0.0676336255, -0.0676336255, -0.0676336255, 1.11393175,,, +2.0000000000,2.5000000000, 0.84555985, 0.16988417, -0.08880309, 0.16988417, 0.13513514, -0.03088803, -0.08880309, -0.03088803, 0.01930502,,, +2.0000000000,2.5000000000, 1.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 1.00,,, +2.5000000000,3.0000000000, 2.21, -0.04, 0.12, -0.04, 1.96, 0.32, 0.12, 0.32, 0.24,,, +2.5000000000,3.0000000000, 1.00, -0.0192192227, 0.164770511, -0.0192192227, 1.00, 0.466569475, 0.164770511, 0.466569475, 1.00,,, +2.5000000000,3.0000000000, 1.64826027, -0.00963569008, 0.0289070702, -0.00963569008, 1.5880372, 0.0770855206, 0.0289070702, 0.0770855206, 1.17370253,,, +2.5000000000,3.0000000000, 1.47, -0.00, 0.00, -0.00, 1.47, 0.00, 0.00, 0.00, 1.47,,, +2.5000000000,3.0000000000, 0.79899497, 0.22110553, -0.10552764, 0.22110553, 0.17085427, -0.0201005, -0.10552764, -0.0201005, 0.03015075,,, +2.5000000000,3.0000000000, 1.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 1.00,,, +3.0000000000,3.5000000000, 2.29, -0.33, 0.24, -0.33, 2.61, -0.18, 0.24, -0.18, 0.24,,, +3.0000000000,3.5000000000, 1.00, -0.134982027, 0.323733677, -0.134982027, 1.00, -0.227429413, 0.323733677, -0.227429413, 1.00,,, +3.0000000000,3.5000000000, 1.9742694, -0.149321794, 0.108597668, -0.149321794, 2.11906629, -0.081448251, 0.108597668, -0.081448251, 1.04666432,,, +3.0000000000,3.5000000000, 1.73914927, -0.0147732834, 0.0107442061, -0.0147732834, 1.75347488, -0.0080581546, 0.0107442061, -0.0080581546, 1.64737585,,, +3.0000000000,3.5000000000, 0.71686747, 0.22289157, -0.06024096, 0.22289157, 0.25903614, -0.04216867, -0.06024096, -0.04216867, 0.02409639,,, +3.0000000000,3.5000000000, 1.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 1.00,,, +3.5000000000,4.0000000000, 1.09, 0.60, 0.17, 0.60, 1.60, 0.00, 0.17, 0.00, 0.41,,, +3.5000000000,4.0000000000, 1.00, 0.4543369, 0.25429847, 0.4543369, 1.00, 0.00, 0.25429847, 0.00, 1.00,,, +3.5000000000,4.0000000000, 1.06313148, 0.315509839, 0.0893944544, 0.315509839, 1.33131485, 0.00, 0.0893944544, 0.00, 0.705553667,,, +3.5000000000,4.0000000000, 1.04056757, 0.07659782, 0.02170272, 0.07659782, 1.10567572, 0.00, 0.02170272, 0.00, 0.95375671,,, +3.5000000000,4.0000000000, 0.23039216, 0.02941176, 0.35294118, 0.02941176, 0.07843137, 0.00, 0.35294118, 0.00, 0.69117647,,, +3.5000000000,4.0000000000, 1.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 1.00,,, +4.0000000000,4.5000000000, 0.96, 0.92, 0.18, 0.92, 2.89, 0.21, 0.18, 0.21, 0.49,,, +4.0000000000,4.5000000000, 1.00, 0.55233592, 0.26244533, 0.55233592, 1.00, 0.17647059, 0.26244533, 0.17647059, 1.00,,, +4.0000000000,4.5000000000, 1.18724478, 0.490413981, 0.0959505616, 0.490413981, 2.21604802, 0.111942322, 0.0959505616, 0.111942322, 0.936707201,,, +4.0000000000,4.5000000000, 1.22291898, 0.42297509, 0.08275599, 0.42297509, 2.11024714, 0.09654866, 0.08275599, 0.09654866, 1.00683388,,, +4.0000000000,4.5000000000, 0.22307692, 0.02692308, 0.35384615, 0.02692308, 0.11153846, -0.00769231, 0.35384615, -0.00769231, 0.66538462,,, +4.0000000000,4.5000000000, 1.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 1.00,,, +4.5000000000,5.0000000000, 1.61, 0.15, 0.20, 0.15, 3.85, -0.40, 0.20, -0.40, 0.60,,, +4.5000000000,5.0000000000, 1.00, 0.06024874, 0.20348923, 0.06024874, 1.00, -0.26318068, 0.20348923, -0.26318068, 1.00,,, +4.5000000000,5.0000000000, 1.86743369, 0.055816941, 0.074422588, 0.055816941, 2.70096668, -0.148845176, 0.074422588, -0.148845176, 1.49159963,,, +4.5000000000,5.0000000000, 1.95254699, 0.02467793, 0.03290391, 0.02467793, 2.32107076, -0.06580782, 0.03290391, -0.06580782, 1.78638225,,, +4.5000000000,5.0000000000, 0.16544118, 0.09926471, 0.25735294, 0.09926471, 0.22426471, 0.20588235, 0.25735294, 0.20588235, 0.61029412,,, +4.5000000000,5.0000000000, 1.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 1.00,,, +5.0000000000,5.5000000000, 2.01, 0.69, -0.34, 0.69, 2.81, 0.44, -0.34, 0.44, 0.56,,, +5.0000000000,5.5000000000, 1.00, 0.290334, -0.32046963, 0.290334, 1.00, 0.35075632, -0.32046963, 0.35075632, 1.00,,, +5.0000000000,5.5000000000, 1.89536719, 0.324938579, -0.160114662, 0.324938579, 2.27210757, 0.20720721, -0.160114662, 0.20720721, 1.21252525,,, +5.0000000000,5.5000000000, 1.80811047, 0.04705949, -0.02318873, 0.04705949, 1.86267219, 0.03000895, -0.02318873, 0.03000895, 1.70921734,,, +5.0000000000,5.5000000000, 0.18846154, 0.04615385, 0.26153846, 0.04615385, 0.11153846, 0.06538462, 0.26153846, 0.06538462, 0.70,,, +5.0000000000,5.5000000000, 1.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 1.00,,, +5.5000000000,6.0000000000, 1.56, 0.70, 0.00, 0.70, 2.45, -0.30, 0.00, -0.30, 0.80,,, +5.5000000000,6.0000000000, 1.00, 0.35805744, 0.00, 0.35805744, 1.00, -0.21428571, 0.00, -0.21428571, 1.00,,, +5.5000000000,6.0000000000, 1.60313579, 0.00319114656, 0.00, 0.00319114656, 1.6071931, -0.00136763424, 0.00, -0.00136763424, 1.59967111,,, +5.5000000000,6.0000000000, 1.60333333, 0.00, 0.00, 0.00, 1.60333333, -0.00, 0.00, -0.00, 1.60333333,,, +5.5000000000,6.0000000000, 0.13333333, 0.05777778, 0.21333333, 0.05777778, 0.12, 0.07555556, 0.21333333, 0.07555556, 0.74666667,,, +5.5000000000,6.0000000000, 1.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 1.00,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Matrix-Calculator-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Matrix-Calculator-test.xml new file mode 100644 index 0000000..02b4a7a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Matrix-Calculator-test.xml @@ -0,0 +1,1029 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x00425137, 0xf2a30c29) + (0x79a9edeb, 0x245d83fc) + Test Name + Covariance-Matrix-Calculator + Covariance-Matrix-Calculator + + + + + + + (0x000015a8, 0x000079e9) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01165f9f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x00007868) + COV + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Covariance + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + false + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x00007869) + COR + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Pearson Correlation + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + false + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786a) + LWF + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Ledoit and Wolf + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786d) + SCM + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Normalized Spatial Covariance Matrix (SCM) + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + false + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786e) + IDE + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Identity + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 1120 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x0000786f) + MCD + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Identity + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000241d, 0x00007870) + OAS + (0x9a93af80, 0x6449c826) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x5261636b, 0x45535449) + Estimator + Covariance + Oracle Approximating Shrinkage (OAS) + false + + + (0x2cdb2f0b, 0x12f231ea) + Center Data + true + true + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0xa227af77, 0xcd1af363) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000484f, 0x00003eff) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x544a003e, 0x6dcba5f6) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00004c39, 0x0000096b) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x544a003e, 0x6dcba5f6) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/$var{Test Name}-output.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004ce5, 0x000064bd) + Streamed matrix multiplexer + (0x7a12298b, 0x785f4d42) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + (0x544a003e, 0x6dcba5f6) + Input stream 4 + + + (0x544a003e, 0x6dcba5f6) + Input stream 5 + + + (0x544a003e, 0x6dcba5f6) + Input stream 6 + + + (0x544a003e, 0x6dcba5f6) + Input stream 7 + + + + + (0x544a003e, 0x6dcba5f6) + Multiplexed streamed matrix + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x4badfdff, 0xc35004a3) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005b5f, 0x000050b0) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017178bd) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000820, 0x00001417) + + (0x0000484f, 0x00003eff) + 0 + + + (0x0000241d, 0x00007869) + 0 + + + + (0x00000d5b, 0x00005110) + + (0x0000241d, 0x00007868) + 0 + + + (0x00004ce5, 0x000064bd) + 0 + + + + (0x00001a66, 0x00001ca2) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x000015a8, 0x000079e9) + 0 + + + + (0x00001c17, 0x000064cf) + + (0x00004ce5, 0x000064bd) + 0 + + + (0x00004c39, 0x0000096b) + 0 + + + + (0x00002210, 0x000058ce) + + (0x0000484f, 0x00003eff) + 0 + + + (0x0000241d, 0x00007868) + 0 + + + + (0x0000252d, 0x00001a74) + + (0x0000484f, 0x00003eff) + 0 + + + (0x0000241d, 0x0000786e) + 0 + + + + (0x0000268a, 0x00005c70) + + (0x0000241d, 0x0000786e) + 0 + + + (0x00004ce5, 0x000064bd) + 6 + + + + (0x00003525, 0x0000274b) + + (0x00004ce5, 0x000064bd) + 0 + + + (0x00005b5f, 0x000050b0) + 0 + + + + (0x00004069, 0x0000525b) + + (0x0000484f, 0x00003eff) + 0 + + + (0x0000241d, 0x0000786d) + 0 + + + + (0x0000407f, 0x0000576b) + + (0x0000484f, 0x00003eff) + 0 + + + (0x0000241d, 0x0000786f) + 0 + + + + (0x00004de0, 0x00003d3d) + + (0x0000241d, 0x0000786a) + 0 + + + (0x00004ce5, 0x000064bd) + 2 + + + + (0x00005a9c, 0x00006e88) + + (0x0000484f, 0x00003eff) + 0 + + + (0x0000241d, 0x00007870) + 0 + + + + (0x000061b2, 0x00003eac) + + (0x0000241d, 0x0000786d) + 0 + + + (0x00004ce5, 0x000064bd) + 5 + + + + (0x000070ef, 0x0000629b) + + (0x0000484f, 0x00003eff) + 0 + + + (0x0000241d, 0x0000786a) + 0 + + + + (0x000071a9, 0x0000773f) + + (0x0000241d, 0x00007870) + 0 + + + (0x00004ce5, 0x000064bd) + 3 + + + + (0x00007e86, 0x0000281b) + + (0x0000241d, 0x0000786f) + 0 + + + (0x00004ce5, 0x000064bd) + 4 + + + + (0x00007f89, 0x00007b69) + + (0x0000241d, 0x00007869) + 0 + + + (0x00004ce5, 0x000064bd) + 1 + + + + + + + (0x000062ac, 0x00003721) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000041e, 0x000069b5)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004c5d, 0x000021d4)","index":0,"name":"Default tab","parentIdentifier":"(0x0000041e, 0x000069b5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000420e, 0x000074bb)","index":0,"name":"Empty","parentIdentifier":"(0x00004c5d, 0x000021d4)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Mean-Calculator-input.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Mean-Calculator-input.csv new file mode 100644 index 0000000..00fcc26 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Mean-Calculator-input.csv @@ -0,0 +1,13 @@ +Time:3x3,End Time,1:,1:,1:,2:,2:,2:,3:,3:,3:,Event Id,Event Date,Event Duration +0.0000000,0.500000, 2.5849288, 1.33543611, 0.511092833, 1.33543611, 2.19748746, 0.527579698, 0.511092833, 0.527579698, 0.507583739,,, +0.5000000,1.000000, 1.99839975, -0.650968006, -0.150223386, -0.650968006, 1.52895167, 0.0688523853, -0.150223386, 0.0688523853, 0.652648582,,, +1.0000000,1.500000, 1.21758058, -0.00, 0.013088361, -0.00, 1.00554914, 0.0104706888, 0.013088361, 0.0104706888, 0.756870279,,, +1.5000000,2.000000, 2.57527815, -0.621023059, -0.153239456, -0.621023059, 0.897709368, 0.0564566417, -0.153239456, 0.0564566417, 0.317012482,,, +2.0000000,2.500000, 2.87232755, -0.786745664, -0.0991696216, -0.786745664, 1.81451826, -0.0991696216, -0.0991696216, -0.0991696216, 0.783154191,,, +2.5000000,3.000000, 1.64826027, -0.00963569008, 0.0289070702, -0.00963569008, 1.5880372, 0.0770855206, 0.0289070702, 0.0770855206, 1.17370253,,, +3.0000000,3.500000, 1.9742694, -0.149321794, 0.108597668, -0.149321794, 2.11906629, -0.081448251, 0.108597668, -0.081448251, 1.04666432,,, +3.5000000,4.000000, 1.06313148, 0.315509839, 0.0893944544, 0.315509839, 1.33131485, 0.00, 0.0893944544, 0.00, 0.705553667,,, +4.0000000,4.500000, 1.18724478, 0.490413981, 0.0959505616, 0.490413981, 2.21604802, 0.111942322, 0.0959505616, 0.111942322, 0.936707201,,, +4.5000000,5.000000, 1.86743369, 0.055816941, 0.074422588, 0.055816941, 2.70096668, -0.148845176, 0.074422588, -0.148845176, 1.49159963,,, +5.0000000,5.500000, 1.89536719, 0.324938579, -0.160114662, 0.324938579, 2.27210757, 0.20720721, -0.160114662, 0.20720721, 1.21252525,,, +5.5000000,6.000000, 1.60313579, 0.00319114656, 0.00, 0.00319114656, 1.6071931, -0.00136763424, 0.00, -0.00136763424, 1.59967111,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Mean-Calculator-ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Mean-Calculator-ref.csv new file mode 100644 index 0000000..715a044 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Mean-Calculator-ref.csv @@ -0,0 +1,8 @@ +Time:3x3,End Time,1:,1:,1:,2:,2:,2:,3:,3:,3:,Event Id,Event Date,Event Duration +6.5000000000,6.5625000000, 1.70952664, 0.01674082, 0.02077766, 0.01674082, 1.60344581, 0.05423902, 0.02077766, 0.05423902, 0.8303257,,, +6.5000000000,6.5625000000, 1.87394645, 0.02563437, 0.0298922, 0.02563437, 1.7732458, 0.06073032, 0.0298922, 0.06073032, 0.93197441,,, +6.5000000000,6.5625000000, 1.7137077, 0.01869396, 0.02040996, 0.01869396, 1.60430933, 0.0512624, 0.02040996, 0.0512624, 0.82767414,,, +6.5000000000,6.5625000000, 1.70798275, 0.01610538, 0.02003787, 0.01610538, 1.60581809, 0.05385499, 0.02003787, 0.05385499, 0.83577899,,, +6.5000000000,6.5625000000, 1.56594664, 0.01175612, 0.01576697, 0.01175612, 1.44152542, 0.04955601, 0.01576697, 0.04955601, 0.72075273,,, +6.5000000000,6.5625000000, 1.71301511, 0.01811099, 0.02219169, 0.01811099, 1.59879804, 0.0548546, 0.02219169, 0.0548546, 0.81958134,,, +6.5000000000,6.5625000000, 1.00, 0.00, 0.00, 0.00, 1.00, 0.00, 0.00, 0.00, 1.00,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Mean-Calculator-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Mean-Calculator-test.xml new file mode 100644 index 0000000..c03e813 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-Mean-Calculator-test.xml @@ -0,0 +1,1537 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x00433d80, 0x024464c1) + (0x79a9edeb, 0x245d83fc) + Test Name + Covariance-Mean-Calculator + Covariance-Mean-Calculator + + + + + + + (0x000015a8, 0x000079ea) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 720 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01165f9f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003a4d, 0x00004a1b) + Riemann + (0x67955ea4, 0x7c643c0f) + + + (0x6f752dd0, 0x082a321e) + Input Stimulation + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix 1 + + + + + (0x544a003e, 0x6dcba5f6) + Output Mean Matrix + + + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Riemann + false + + + (0x330306dd, 0x74a95f98) + Filename to save Matrix (CSV, empty to not save) + ${Player_ScenarioDirectory}/Mean.csv + + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name that triggers the compute + OVTK_StimulationId_TrainCompleted + OVTK_StimulationId_TrainCompleted + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 160 + + + (0x4e7b798a, 0x183beafb) + (0xa6202e43, 0xaf22cef6) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003a4d, 0x00004a1c) + Euclidian + (0x67955ea4, 0x7c643c0f) + + + (0x6f752dd0, 0x082a321e) + Input Stimulation + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix 1 + + + + + (0x544a003e, 0x6dcba5f6) + Output Mean Matrix + + + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Euclidian + false + + + (0x330306dd, 0x74a95f98) + Filename to save Matrix (CSV, empty to not save) + ${Player_ScenarioDirectory}/Mean.csv + + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name that triggers the compute + OVTK_StimulationId_TrainCompleted + OVTK_StimulationId_TrainCompleted + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0xa6202e43, 0xaf22cef6) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003a4d, 0x00004a1d) + Log-Euclidian + (0x67955ea4, 0x7c643c0f) + + + (0x6f752dd0, 0x082a321e) + Input Stimulation + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix 1 + + + + + (0x544a003e, 0x6dcba5f6) + Output Mean Matrix + + + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Log Euclidian + false + + + (0x330306dd, 0x74a95f98) + Filename to save Matrix (CSV, empty to not save) + ${Player_ScenarioDirectory}/Mean.csv + + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name that triggers the compute + OVTK_StimulationId_TrainCompleted + OVTK_StimulationId_TrainCompleted + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0xa6202e43, 0xaf22cef6) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003a4d, 0x00004a1e) + Log-Determinant + (0x67955ea4, 0x7c643c0f) + + + (0x6f752dd0, 0x082a321e) + Input Stimulation + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix 1 + + + + + (0x544a003e, 0x6dcba5f6) + Output Mean Matrix + + + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Log Determinant + false + + + (0x330306dd, 0x74a95f98) + Filename to save Matrix (CSV, empty to not save) + ${Player_ScenarioDirectory}/Mean.csv + + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name that triggers the compute + OVTK_StimulationId_TrainCompleted + OVTK_StimulationId_TrainCompleted + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0xa6202e43, 0xaf22cef6) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003a4d, 0x00004a1f) + Harmonic + (0x67955ea4, 0x7c643c0f) + + + (0x6f752dd0, 0x082a321e) + Input Stimulation + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix 1 + + + + + (0x544a003e, 0x6dcba5f6) + Output Mean Matrix + + + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Harmonic + false + + + (0x330306dd, 0x74a95f98) + Filename to save Matrix (CSV, empty to not save) + ${Player_ScenarioDirectory}/Mean.csv + + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name that triggers the compute + OVTK_StimulationId_TrainCompleted + OVTK_StimulationId_TrainCompleted + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0xa6202e43, 0xaf22cef6) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003a4d, 0x00004a20) + Kullback + (0x67955ea4, 0x7c643c0f) + + + (0x6f752dd0, 0x082a321e) + Input Stimulation + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix 1 + + + + + (0x544a003e, 0x6dcba5f6) + Output Mean Matrix + + + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Kullback + false + + + (0x330306dd, 0x74a95f98) + Filename to save Matrix (CSV, empty to not save) + ${Player_ScenarioDirectory}/Mean.csv + + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name that triggers the compute + OVTK_StimulationId_TrainCompleted + OVTK_StimulationId_TrainCompleted + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0xa6202e43, 0xaf22cef6) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003a4d, 0x00004a21) + ALE + (0x67955ea4, 0x7c643c0f) + + + (0x6f752dd0, 0x082a321e) + Input Stimulation + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix 1 + + + + + (0x544a003e, 0x6dcba5f6) + Output Mean Matrix + + + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Identity + false + + + (0x330306dd, 0x74a95f98) + Filename to save Matrix (CSV, empty to not save) + ${Player_ScenarioDirectory}/Mean.csv + + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name that triggers the compute + OVTK_StimulationId_TrainCompleted + OVTK_StimulationId_TrainCompleted + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 1024 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xa6202e43, 0xaf22cef6) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003a4d, 0x00004a22) + Wasserstein + (0x67955ea4, 0x7c643c0f) + + + (0x6f752dd0, 0x082a321e) + Input Stimulation + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix 1 + + + + + (0x544a003e, 0x6dcba5f6) + Output Mean Matrix + + + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Identity + false + + + (0x330306dd, 0x74a95f98) + Filename to save Matrix (CSV, empty to not save) + ${Player_ScenarioDirectory}/Mean.csv + + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name that triggers the compute + OVTK_StimulationId_TrainCompleted + OVTK_StimulationId_TrainCompleted + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 1168 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xa6202e43, 0xaf22cef6) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003a4d, 0x00004a23) + Identity + (0x67955ea4, 0x7c643c0f) + + + (0x6f752dd0, 0x082a321e) + Input Stimulation + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix 1 + + + + + (0x544a003e, 0x6dcba5f6) + Output Mean Matrix + + + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Identity + false + + + (0x330306dd, 0x74a95f98) + Filename to save Matrix (CSV, empty to not save) + ${Player_ScenarioDirectory}/Mean.csv + + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name that triggers the compute + OVTK_StimulationId_TrainCompleted + OVTK_StimulationId_TrainCompleted + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 1312 + + + (0x4e7b798a, 0x183beafb) + (0xa6202e43, 0xaf22cef6) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000484f, 0x00003eff) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x544a003e, 0x6dcba5f6) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00004c39, 0x0000096b) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x544a003e, 0x6dcba5f6) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/$var{Test Name}-output.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 656 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004ce5, 0x000064bd) + Streamed matrix multiplexer + (0x7a12298b, 0x785f4d42) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + (0x544a003e, 0x6dcba5f6) + Input stream 4 + + + (0x544a003e, 0x6dcba5f6) + Input stream 5 + + + (0x544a003e, 0x6dcba5f6) + Input stream 6 + + + (0x544a003e, 0x6dcba5f6) + Input stream 7 + + + (0x544a003e, 0x6dcba5f6) + Input stream 8 + + + (0x544a003e, 0x6dcba5f6) + Input stream 9 + + + + + (0x544a003e, 0x6dcba5f6) + Multiplexed streamed matrix + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x4badfdff, 0xc35004a3) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005b5f, 0x000050b0) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017178bd) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005b5f, 0x000050b1) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 10 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 656 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017178bd) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x0000009e, 0x00002eab) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00005b5f, 0x000050b0) + 0 + + + + (0x0000056b, 0x000073f9) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x00003a4d, 0x00004a20) + 0 + + + + (0x000005d9, 0x000021ce) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x00003a4d, 0x00004a22) + 0 + + + + (0x0000079f, 0x0000790e) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x00003a4d, 0x00004a1b) + 0 + + + + (0x00000b52, 0x0000756d) + + (0x00003a4d, 0x00004a1c) + 0 + + + (0x00004ce5, 0x000064bd) + 1 + + + + (0x00001044, 0x000054b9) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00003a4d, 0x00004a23) + 1 + + + + (0x00001366, 0x00003c17) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x00003a4d, 0x00004a1d) + 0 + + + + (0x00001452, 0x000041ad) + + (0x00003a4d, 0x00004a21) + 0 + + + (0x00004ce5, 0x000064bd) + 6 + + + + (0x000016e9, 0x00002017) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00003a4d, 0x00004a1d) + 1 + + + + (0x00001a66, 0x00001ca3) + + (0x00005b5f, 0x000050b1) + 0 + + + (0x000015a8, 0x000079ea) + 0 + + + + (0x00001c17, 0x000064cf) + + (0x00004ce5, 0x000064bd) + 0 + + + (0x00004c39, 0x0000096b) + 0 + + + + (0x00001e2e, 0x000002fc) + + (0x00003a4d, 0x00004a1d) + 0 + + + (0x00004ce5, 0x000064bd) + 2 + + + + (0x000022c9, 0x00007eb0) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00003a4d, 0x00004a1c) + 1 + + + + (0x0000248c, 0x00007a6d) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00003a4d, 0x00004a22) + 1 + + + + (0x00002804, 0x00007349) + + (0x00003a4d, 0x00004a1b) + 0 + + + (0x00004ce5, 0x000064bd) + 0 + + + + (0x00002ad3, 0x00006871) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00003a4d, 0x00004a1b) + 1 + + + + (0x00002b0c, 0x0000717d) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00003a4d, 0x00004a21) + 1 + + + + (0x00002e37, 0x00001327) + + (0x00003a4d, 0x00004a20) + 0 + + + (0x00004ce5, 0x000064bd) + 5 + + + + (0x0000329b, 0x00003dfe) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00003a4d, 0x00004a1e) + 1 + + + + (0x00003525, 0x0000274b) + + (0x00004ce5, 0x000064bd) + 0 + + + (0x00005b5f, 0x000050b1) + 0 + + + + (0x00004384, 0x00003619) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00003a4d, 0x00004a20) + 1 + + + + (0x000045a0, 0x000077d6) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x00003a4d, 0x00004a1c) + 0 + + + + (0x000048b5, 0x000021a0) + + (0x00003a4d, 0x00004a22) + 0 + + + (0x00004ce5, 0x000064bd) + 7 + + + + (0x00005336, 0x00002c8c) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x00003a4d, 0x00004a1e) + 0 + + + + (0x000057e0, 0x00003729) + + (0x00003a4d, 0x00004a1f) + 0 + + + (0x00004ce5, 0x000064bd) + 4 + + + + (0x00006230, 0x00001ac9) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x00003a4d, 0x00004a23) + 0 + + + + (0x00006482, 0x00007573) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x00003a4d, 0x00004a1f) + 0 + + + + (0x00006d84, 0x000075f3) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x00003a4d, 0x00004a21) + 0 + + + + (0x000070d6, 0x000031ac) + + (0x00003a4d, 0x00004a1e) + 0 + + + (0x00004ce5, 0x000064bd) + 3 + + + + (0x000070e8, 0x000077d7) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00003a4d, 0x00004a1f) + 1 + + + + (0x000075ac, 0x00007b8d) + + (0x00003a4d, 0x00004a23) + 0 + + + (0x00004ce5, 0x000064bd) + 8 + + + + + + + (0x000062ac, 0x00003721) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000041e, 0x000069b5)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004c5d, 0x000021d4)","index":0,"name":"Default tab","parentIdentifier":"(0x0000041e, 0x000069b5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000420e, 0x000074bb)","index":0,"name":"Empty","parentIdentifier":"(0x00004c5d, 0x000021d4)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-To-Feature-input.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-To-Feature-input.csv new file mode 100644 index 0000000..00fcc26 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-To-Feature-input.csv @@ -0,0 +1,13 @@ +Time:3x3,End Time,1:,1:,1:,2:,2:,2:,3:,3:,3:,Event Id,Event Date,Event Duration +0.0000000,0.500000, 2.5849288, 1.33543611, 0.511092833, 1.33543611, 2.19748746, 0.527579698, 0.511092833, 0.527579698, 0.507583739,,, +0.5000000,1.000000, 1.99839975, -0.650968006, -0.150223386, -0.650968006, 1.52895167, 0.0688523853, -0.150223386, 0.0688523853, 0.652648582,,, +1.0000000,1.500000, 1.21758058, -0.00, 0.013088361, -0.00, 1.00554914, 0.0104706888, 0.013088361, 0.0104706888, 0.756870279,,, +1.5000000,2.000000, 2.57527815, -0.621023059, -0.153239456, -0.621023059, 0.897709368, 0.0564566417, -0.153239456, 0.0564566417, 0.317012482,,, +2.0000000,2.500000, 2.87232755, -0.786745664, -0.0991696216, -0.786745664, 1.81451826, -0.0991696216, -0.0991696216, -0.0991696216, 0.783154191,,, +2.5000000,3.000000, 1.64826027, -0.00963569008, 0.0289070702, -0.00963569008, 1.5880372, 0.0770855206, 0.0289070702, 0.0770855206, 1.17370253,,, +3.0000000,3.500000, 1.9742694, -0.149321794, 0.108597668, -0.149321794, 2.11906629, -0.081448251, 0.108597668, -0.081448251, 1.04666432,,, +3.5000000,4.000000, 1.06313148, 0.315509839, 0.0893944544, 0.315509839, 1.33131485, 0.00, 0.0893944544, 0.00, 0.705553667,,, +4.0000000,4.500000, 1.18724478, 0.490413981, 0.0959505616, 0.490413981, 2.21604802, 0.111942322, 0.0959505616, 0.111942322, 0.936707201,,, +4.5000000,5.000000, 1.86743369, 0.055816941, 0.074422588, 0.055816941, 2.70096668, -0.148845176, 0.074422588, -0.148845176, 1.49159963,,, +5.0000000,5.500000, 1.89536719, 0.324938579, -0.160114662, 0.324938579, 2.27210757, 0.20720721, -0.160114662, 0.20720721, 1.21252525,,, +5.5000000,6.000000, 1.60313579, 0.00319114656, 0.00, 0.00319114656, 1.6071931, -0.00136763424, 0.00, -0.00136763424, 1.59967111,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-To-Feature-ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-To-Feature-ref.csv new file mode 100644 index 0000000..fbf9d16 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-To-Feature-ref.csv @@ -0,0 +1,25 @@ +Time:6,End Time,,,,,,,Event Id,Event Date,Event Duration +0.0000000000,0.5000000000, 0.19923529, 0.81954961, 0.45583261, 0.06265258, 0.53984445, -0.74189243,,, +0.0000000000,0.5000000000, 2.58492880, 1.33543611, 0.511092833, 2.19748746, 0.527579698, 0.507583739,,, +0.5000000000,1.0000000000, 0.08020799, -0.56380364, -0.19863986, -0.12711376, -0.00487228, -0.24993702,,, +0.5000000000,1.0000000000, 1.99839975, -0.650968006, -0.150223386, 1.52895167, 0.0688523853, 0.652648582,,, +1.0000000000,1.5000000000, -0.33927073, -0.0139971, -0.00466568, -0.46577928, -0.04826772, -0.09127522,,, +1.0000000000,1.5000000000, 1.21758058, -0.000000000, 0.0130883610, 1.00554914, 0.0104706888, 0.756870279,,, +1.5000000000,2.0000000000, 0.34039208, -0.59873603, -0.23557737, -0.70072935, 0.02089894, -0.98360691,,, +1.5000000000,2.0000000000, 2.57527815, -0.621023059, -0.153239456, 0.897709368, 0.0564566417, 0.317012482,,, +2.0000000000,2.5000000000, 0.4605308, -0.52546299, -0.14067914, 0.04677775, -0.21048792, -0.06431401,,, +2.0000000000,2.5000000000, 2.87232755, -0.786745664, -0.0991696216, 1.81451826, -0.0991696216, 0.783154191,,, +2.5000000000,3.0000000000, -0.0365709, -0.02310847, 0.00568693, -0.0103298, 0.01443795, 0.34577556,,, +2.5000000000,3.0000000000, 1.64826027, -0.00963569008, 0.0289070702, 1.58803720, 0.0770855206, 1.17370253,,, +3.0000000000,3.5000000000, 0.13870707, -0.11420977, 0.08057211, 0.27541021, -0.14045981, 0.22931806,,, +3.0000000000,3.5000000000, 1.97426940, -0.149321794, 0.108597668, 2.11906629, -0.0814482510, 1.04666432,,, +3.5000000000,4.0000000000, -0.52065199, 0.37104578, 0.12469995, -0.21855289, -0.08508472, -0.16646769,,, +3.5000000000,4.0000000000, 1.06313148, 0.315509839, 0.0893944544, 1.33131485, 0.00000000, 0.705553667,,, +4.0000000000,4.5000000000, -0.42665126, 0.41541091, 0.08741089, 0.28616558, 0.02832375, 0.11565408,,, +4.0000000000,4.5000000000, 1.18724478, 0.490413981, 0.0959505616, 2.21604802, 0.111942322, 0.936707201,,, +4.5000000000,5.0000000000, 0.08700644, 0.0237524, 0.04023502, 0.51858937, -0.17189999, 0.58429274,,, +4.5000000000,5.0000000000, 1.86743369, 0.0558169410, 0.0744225880, 2.70096668, -0.148845176, 1.49159963,,, +5.0000000000,5.5000000000, 0.08116035, 0.22060811, -0.19108877, 0.32966629, 0.12395396, 0.36518821,,, +5.0000000000,5.5000000000, 1.89536719, 0.324938579, -0.160114662, 2.27210757, 0.207207210, 1.21252525,,, +5.5000000000,6.0000000000, -0.06409514, -0.01104878, -0.02378668, 0.00324331, -0.06638659, 0.65726463,,, +5.5000000000,6.0000000000, 1.60313579, 0.00319114656, 0.00000000, 1.60719310, -0.00136763424, 1.59967111,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-To-Feature-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-To-Feature-test.xml new file mode 100644 index 0000000..83d2d7b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Covariance-To-Feature-test.xml @@ -0,0 +1,545 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x002d042d, 0x0a17b655) + (0x79a9edeb, 0x245d83fc) + Test Name + Covariance-To-Feature + Covariance-To-Feature + + + + + + + (0x000015a8, 0x000079ea) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01165f9f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000033bb, 0x00004e53) + Streamed matrix multiplexer + (0x7a12298b, 0x785f4d42) + + + (0x17341935, 0x152ff448) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + + + (0x17341935, 0x152ff448) + Multiplexed streamed matrix + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x4badfdff, 0xc35004a3) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000044b9, 0x00003dab) + Tangent Space + (0x7c265dba, 0x202c1f70) + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix + + + + + (0x17341935, 0x152ff448) + Output Feature Vector + + + + + (0x2cdb2f0b, 0x12f231ea) + Tangent Space + true + true + false + + + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix (CSV, empty for Identity) + ${Player_ScenarioDirectory}/Mean.csv + ${Player_ScenarioDirectory}/Mean-ref.csv + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0xbfd23954, 0x40c20e2d) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000044b9, 0x00003dac) + Squeeze + (0x7c265dba, 0x202c1f70) + + + (0x544a003e, 0x6dcba5f6) + Input Covariance Matrix + + + + + (0x17341935, 0x152ff448) + Output Feature Vector + + + + + (0x2cdb2f0b, 0x12f231ea) + Tangent Space + true + false + false + + + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix (CSV, empty for Identity) + ${Player_ScenarioDirectory}/Mean.csv + + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0xbfd23954, 0x40c20e2d) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000484f, 0x00003eff) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x544a003e, 0x6dcba5f6) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00004c39, 0x0000096b) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x17341935, 0x152ff448) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/$var{Test Name}-output.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00005b5f, 0x000050b1) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 3 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017178bd) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x0000165e, 0x00002aea) + + (0x000044b9, 0x00003dab) + 0 + + + (0x000033bb, 0x00004e53) + 0 + + + + (0x00001a66, 0x00001ca3) + + (0x00005b5f, 0x000050b1) + 0 + + + (0x000015a8, 0x000079ea) + 0 + + + + (0x00002f63, 0x00004371) + + (0x000033bb, 0x00004e53) + 0 + + + (0x00005b5f, 0x000050b1) + 0 + + + + (0x00004af4, 0x0000001f) + + (0x000033bb, 0x00004e53) + 0 + + + (0x00004c39, 0x0000096b) + 0 + + + + (0x00004c3a, 0x000035ef) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000044b9, 0x00003dac) + 0 + + + + (0x00006b7d, 0x00002a0b) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000044b9, 0x00003dab) + 0 + + + + (0x00007598, 0x00003e01) + + (0x000044b9, 0x00003dac) + 0 + + + (0x000033bb, 0x00004e53) + 1 + + + + + + + (0x000062ac, 0x00003721) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000041e, 0x000069b5)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004c5d, 0x000021d4)","index":0,"name":"Default tab","parentIdentifier":"(0x0000041e, 0x000069b5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000420e, 0x000074bb)","index":0,"name":"Empty","parentIdentifier":"(0x00004c5d, 0x000021d4)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Feature-To-Covariance-input1.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Feature-To-Covariance-input1.csv new file mode 100644 index 0000000..0b5df55 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Feature-To-Covariance-input1.csv @@ -0,0 +1,13 @@ +Time:6,End Time,A,B,C,D,E,F,Event Id,Event Date,Event Duration +0.0000000000,0.5000000000,0.1992352855,0.8195496110,0.4558326038,0.0626525810,0.5398444507,-0.7418924315,,, +0.5000000000,1.0000000000,0.0802079905,-0.5638036394,-0.1986398629,-0.1271137599,-0.0048722803,-0.2499370264,,, +1.0000000000,1.5000000000,-0.3392707289,-0.0139971004,-0.0046656834,-0.4657792818,-0.0482677110,-0.0912752215,,, +1.5000000000,2.0000000000,0.3403920796,-0.5987360282,-0.2355773730,-0.7007293522,0.0208989408,-0.9836069163,,, +2.0000000000,2.5000000000,0.4605307984,-0.5254629883,-0.1406791473,0.0467777487,-0.2104879168,-0.0643140147,,, +2.5000000000,3.0000000000,-0.0365708962,-0.0231084678,0.0056869283,-0.0103298061,0.0144379583,0.3457755534,,, +3.0000000000,3.5000000000,0.1387070746,-0.1142097638,0.0805721020,0.2754102081,-0.1404598090,0.2293180575,,, +3.5000000000,4.0000000000,-0.5206519983,0.3710457814,0.1246999460,-0.2185528906,-0.0850847159,-0.1664676937,,, +4.0000000000,4.5000000000,-0.4266512586,0.4154109093,0.0874108853,0.2861655803,0.0283237504,0.1156540704,,, +4.5000000000,5.0000000000,0.0870064331,0.0237524010,0.0402350114,0.5185893700,-0.1718999872,0.5842927372,,, +5.0000000000,5.5000000000,0.0811603490,0.2206081191,-0.1910887744,0.3296662887,0.1239539595,0.3651882077,,, +5.5000000000,6.0000000000,-0.0640951351,-0.0110487786,-0.0237866849,0.0032433083,-0.0663865876,0.6572646278,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Feature-To-Covariance-input2.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Feature-To-Covariance-input2.csv new file mode 100644 index 0000000..fe84126 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Feature-To-Covariance-input2.csv @@ -0,0 +1,13 @@ +Time:6,End Time,A,B,C,D,E,F,Event Id,Event Date,Event Duration +0.0000000000,0.5000000000,2.5849288000,1.3354361100,0.5110928330,2.1974874600,0.5275796980,0.5075837390,,, +0.5000000000,1.0000000000,1.9983997500,-0.6509680060,-0.1502233860,1.5289516700,0.0688523853,0.6526485820,,, +1.0000000000,1.5000000000,1.2175805800,-0.0000000000,0.0130883610,1.0055491400,0.0104706888,0.7568702790,,, +1.5000000000,2.0000000000,2.5752781500,-0.6210230590,-0.1532394560,0.8977093680,0.0564566417,0.3170124820,,, +2.0000000000,2.5000000000,2.8723275500,-0.7867456640,-0.0991696216,1.8145182600,-0.0991696216,0.7831541910,,, +2.5000000000,3.0000000000,1.6482602700,-0.0096356901,0.0289070702,1.5880372000,0.0770855206,1.1737025300,,, +3.0000000000,3.5000000000,1.9742694000,-0.1493217940,0.1085976680,2.1190662900,-0.0814482510,1.0466643200,,, +3.5000000000,4.0000000000,1.0631314800,0.3155098390,0.0893944544,1.3313148500,0.0000000000,0.7055536670,,, +4.0000000000,4.5000000000,1.1872447800,0.4904139810,0.0959505616,2.2160480200,0.1119423220,0.9367072010,,, +4.5000000000,5.0000000000,1.8674336900,0.0558169410,0.0744225880,2.7009666800,-0.1488451760,1.4915996300,,, +5.0000000000,5.5000000000,1.8953671900,0.3249385790,-0.1601146620,2.2721075700,0.2072072100,1.2125252500,,, +5.5000000000,6.0000000000,1.6031357900,0.0031911466,0.0000000000,1.6071931000,-0.0013676342,1.5996711100,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Feature-To-Covariance-ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Feature-To-Covariance-ref.csv new file mode 100644 index 0000000..019d760 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Feature-To-Covariance-ref.csv @@ -0,0 +1,25 @@ +Time:3x3,End Time,1:,1:,1:,2:,2:,2:,3:,3:,3:,Event Id,Event Date,Event Duration +0.00,0.50,2.5849287999,1.3354361099,0.511092833,1.3354361099,2.19748746,0.527579698,0.511092833,0.527579698,0.507583739,,, +0.00,0.50,2.5849288,1.33543611,0.511092833,1.33543611,2.19748746,0.527579698,0.511092833,0.527579698,0.507583739,,, +0.50,1.00,1.9983997499,-0.650968006,-0.150223386,-0.650968006,1.52895167,0.0688523853,-0.150223386,0.0688523853,0.652648582,,, +0.50,1.00,1.99839975,-0.650968006,-0.150223386,-0.650968006,1.52895167,0.0688523853,-0.150223386,0.0688523853,0.652648582,,, +1.00,1.50,1.21758058,0.00,0.013088361,0.00,1.00554914,0.0104706888,0.013088361,0.0104706888,0.756870279,,, +1.00,1.50,1.21758058,-0.00,0.013088361,-0.00,1.00554914,0.0104706888,0.013088361,0.0104706888,0.756870279,,, +1.50,2.00,2.5752781499,-0.621023059,-0.153239456,-0.621023059,0.897709368,0.0564566417,-0.153239456,0.0564566417,0.317012482,,, +1.50,2.00,2.57527815,-0.621023059,-0.153239456,-0.621023059,0.897709368,0.0564566417,-0.153239456,0.0564566417,0.317012482,,, +2.00,2.50,2.8723275501,-0.786745664,-0.0991696216,-0.786745664,1.81451826,-0.0991696216,-0.0991696216,-0.0991696216,0.783154191,,, +2.00,2.50,2.87232755,-0.786745664,-0.0991696216,-0.786745664,1.81451826,-0.0991696216,-0.0991696216,-0.0991696216,0.783154191,,, +2.50,3.00,1.64826027,-0.0096356901,0.0289070702,-0.0096356901,1.5880372,0.0770855206,0.0289070702,0.0770855206,1.17370253,,, +2.50,3.00,1.64826027,-0.0096356901,0.0289070702,-0.0096356901,1.5880372,0.0770855206,0.0289070702,0.0770855206,1.17370253,,, +3.00,3.50,1.9742693999,-0.149321794,0.108597668,-0.149321794,2.1190662901,-0.081448251,0.108597668,-0.081448251,1.04666432,,, +3.00,3.50,1.9742694,-0.149321794,0.108597668,-0.149321794,2.11906629,-0.081448251,0.108597668,-0.081448251,1.04666432,,, +3.50,4.00,1.06313148,0.315509839,0.0893944544,0.315509839,1.3313148501,0.00,0.0893944544,0.00,0.705553667,,, +3.50,4.00,1.06313148,0.315509839,0.0893944544,0.315509839,1.33131485,0.00,0.0893944544,0.00,0.705553667,,, +4.00,4.50,1.18724478,0.490413981,0.0959505616,0.490413981,2.2160480201,0.111942322,0.0959505616,0.111942322,0.936707201,,, +4.00,4.50,1.18724478,0.490413981,0.0959505616,0.490413981,2.21604802,0.111942322,0.0959505616,0.111942322,0.936707201,,, +4.50,5.00,1.8674336899,0.0558169411,0.074422588,0.0558169411,2.70096668,-0.148845176,0.074422588,-0.148845176,1.49159963,,, +4.50,5.00,1.86743369,0.055816941,0.074422588,0.055816941,2.70096668,-0.148845176,0.074422588,-0.148845176,1.49159963,,, +5.00,5.50,1.89536719,0.324938579,-0.160114662,0.324938579,2.27210757,0.20720721,-0.160114662,0.20720721,1.21252525,,, +5.00,5.50,1.89536719,0.324938579,-0.160114662,0.324938579,2.27210757,0.20720721,-0.160114662,0.20720721,1.21252525,,, +5.50,6.00,1.60313579,0.0031911465,-0.00,0.0031911465,1.6071931001,-0.0013676342,-0.00,-0.0013676342,1.5996711099,,, +5.50,6.00,1.60313579,0.0031911466,0.00,0.0031911466,1.6071931,-0.0013676342,0.00,-0.0013676342,1.59967111,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Feature-To-Covariance-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Feature-To-Covariance-test.xml new file mode 100644 index 0000000..7fdbde3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Feature-To-Covariance-test.xml @@ -0,0 +1,587 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x002d042d, 0x0a17b655) + (0x79a9edeb, 0x245d83fc) + Test Name + Covariance-To-Feature + Feature-To-Covariance + + + + + + + (0x000015a8, 0x000079ea) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01165f9f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001de9, 0x000044ad) + Tangent + (0x7c265dba, 0x202c1f71) + + + (0x17341935, 0x152ff448) + Input Feature Vector + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Tangent Space + true + true + false + + + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix (CSV, empty for Identity) + ${Player_ScenarioDirectory}/Mean.csv + ${Player_ScenarioDirectory}/Mean-ref.csv + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0xe5d263bb, 0x4098e177) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001de9, 0x000044ae) + Squeeze + (0x7c265dba, 0x202c1f71) + + + (0x17341935, 0x152ff448) + Input Feature Vector + + + + + (0x544a003e, 0x6dcba5f6) + Output Covariance Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Tangent Space + true + false + false + + + (0x330306dd, 0x74a95f98) + Filename to Reference Matrix (CSV, empty for Identity) + ${Player_ScenarioDirectory}/Mean.csv + ${Player_ScenarioDirectory}/Mean.csv + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0xe5d263bb, 0x4098e177) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000033bb, 0x00004e53) + Streamed matrix multiplexer + (0x7a12298b, 0x785f4d42) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + + + (0x544a003e, 0x6dcba5f6) + Multiplexed streamed matrix + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x4badfdff, 0xc35004a3) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000484f, 0x00003eff) + Tangent Input + (0x336a3d9a, 0x753f1ba4) + + + (0x17341935, 0x152ff448) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input1.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x0000484f, 0x00003f00) + Squeeze Input + (0x336a3d9a, 0x753f1ba4) + + + (0x17341935, 0x152ff448) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input2.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00004c39, 0x0000096b) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x544a003e, 0x6dcba5f6) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/$var{Test Name}-output.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00005b5f, 0x000050b1) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 3 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017178bd) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00001a66, 0x00001ca3) + + (0x00005b5f, 0x000050b1) + 0 + + + (0x000015a8, 0x000079ea) + 0 + + + + (0x00002f63, 0x00004371) + + (0x000033bb, 0x00004e53) + 0 + + + (0x00005b5f, 0x000050b1) + 0 + + + + (0x00003088, 0x000054fb) + + (0x00001de9, 0x000044ad) + 0 + + + (0x000033bb, 0x00004e53) + 0 + + + + (0x0000309b, 0x00006cb6) + + (0x0000484f, 0x00003f00) + 0 + + + (0x00001de9, 0x000044ae) + 0 + + + + (0x000037b5, 0x00003750) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00001de9, 0x000044ad) + 0 + + + + (0x00004af4, 0x0000001f) + + (0x000033bb, 0x00004e53) + 0 + + + (0x00004c39, 0x0000096b) + 0 + + + + (0x000054da, 0x00005cc5) + + (0x00001de9, 0x000044ae) + 0 + + + (0x000033bb, 0x00004e53) + 1 + + + + + + + (0x000062ac, 0x00003721) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000041e, 0x000069b5)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004c5d, 0x000021d4)","index":0,"name":"Default tab","parentIdentifier":"(0x0000041e, 0x000069b5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000420e, 0x000074bb)","index":0,"name":"Empty","parentIdentifier":"(0x00004c5d, 0x000021d4)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Affine-Transformation-bias-input.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Affine-Transformation-bias-input.xml new file mode 100644 index 0000000..bb61435 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Affine-Transformation-bias-input.xml @@ -0,0 +1,7 @@ + + + 1 0 0 + 0 1 0 + 0 0 1 + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Affine-Transformation-input.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Affine-Transformation-input.csv new file mode 100644 index 0000000..3ca1bda --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Affine-Transformation-input.csv @@ -0,0 +1,13 @@ +Time:3x3,End Time,1:,1:,1:,2:,2:,2:,3:,3:,3:,Event Id,Event Date,Event Duration +0.0,0.1,2.5849288,1.33543611,0.511092833,1.33543611,2.19748746,0.527579698,0.511092833,0.527579698,0.507583739,769,0.0,0.0 +0.5,0.6,1.99839975,-0.650968006,-0.150223386,-0.650968006,1.52895167,0.0688523853,-0.150223386,0.0688523853,0.652648582,769,0.5,0.0 +1.0,1.1,1.21758058,-0.00,0.013088361,-0.00,1.00554914,0.0104706888,0.013088361,0.0104706888,0.756870279,769,1.0,0.0 +1.5,1.6,2.57527815,-0.621023059,-0.153239456,-0.621023059,0.897709368,0.0564566417,-0.153239456,0.0564566417,0.317012482,769,1.5,0.0 +2.0,2.1,2.87232755,-0.786745664,-0.0991696216,-0.786745664,1.81451826,-0.0991696216,-0.0991696216,-0.0991696216,0.783154191,769,2.0,0.0 +2.5,2.6,1.64826027,-0.00963569008,0.0289070702,-0.00963569008,1.5880372,0.0770855206,0.0289070702,0.0770855206,1.17370253,769,2.5,0.0 +3.0,3.1,1.9742694,-0.149321794,0.108597668,-0.149321794,2.11906629,-0.081448251,0.108597668,-0.081448251,1.04666432,769,3.0,0.0 +4.0,4.1,1.06313148,0.315509839,0.0893944544,0.315509839,1.33131485,0.00,0.0893944544,0.00,0.705553667,769,4.0,0.0 +4.5,4.6,1.18724478,0.490413981,0.0959505616,0.490413981,2.21604802,0.111942322,0.0959505616,0.111942322,0.936707201,770,4.5,0.0 +5.0,5.1,1.86743369,0.055816941,0.074422588,0.055816941,2.70096668,-0.148845176,0.074422588,-0.148845176,1.49159963,770,5.0,0.0 +5.5,5.6,1.89536719,0.324938579,-0.160114662,0.324938579,2.27210757,0.20720721,-0.160114662,0.20720721,1.21252525,770,5.5,0.0 +6.0,6.1,1.60313579,0.00319114656,0.00,0.00319114656,1.6071931,-0.00136763424,0.00,-0.00136763424,1.59967111,770,6.0,0.0 diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Affine-Transformation-ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Affine-Transformation-ref.csv new file mode 100644 index 0000000..b33c11e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Affine-Transformation-ref.csv @@ -0,0 +1,49 @@ +Time:3x3,End Time,1:,1:,1:,2:,2:,2:,3:,3:,3:,Event Id,Event Date,Event Duration +0.0,0.1,2.3375879681,1.1235817880,0.4375016641,1.1235817880,2.0088885697,0.4587268555,0.4375016641,0.4587268555,0.5205728814,,, +0.0,0.1,1.0,0.0,0.0,0.0,1.0,0.0,-0.0,0.0,1.0,,, +0.0,0.1,2.5849288,1.33543611,0.511092833,1.33543611,2.19748746,0.527579698,0.511092833,0.527579698,0.507583739,,, +0.0,0.1,2.5849288,1.33543611,0.511092833,1.33543611,2.19748746,0.527579698,0.511092833,0.527579698,0.507583739,,, +0.5,0.6,1.7964057845,-0.6185516321,-0.1598617505,-0.6185516321,1.4288680906,0.0365060386,-0.1598617505,0.0365060386,0.7333089338,,, +0.5,0.6,1.0756566596,-0.4579140103,-0.2114127465,-0.4579140103,1.0309058513,-0.1528116787,-0.2114127465,-0.1528116787,1.3308125300,,, +0.5,0.6,1.99839975,-0.650968006,-0.150223386,-0.650968006,1.52895167,0.0688523853,-0.150223386,0.0688523853,0.652648582,,, +0.5,0.6,1.99839975,-0.650968006,-0.150223386,-0.650968006,1.52895167,0.0688523853,-0.150223386,0.0688523853,0.652648582,,, +1.0,1.1,1.0798106882,-0.0163890739,-0.0021344530,-0.0163890739,0.9391381373,-0.0206524620,-0.0021344530,-0.0206524620,0.8605585282,,, +1.0,1.1,0.7322555263,-0.0460573370,-0.0554090439,-0.0460573370,0.7563379136,-0.1454584788,-0.0554090439,-0.1454584788,1.3255563093,,, +1.0,1.1,1.21758058,0.00,0.013088361,0.00,1.00554914,0.0104706888,0.013088361,0.0104706888,0.756870279,,, +1.0,1.1,1.21758058,0.00,0.013088361,0.00,1.00554914,0.0104706888,0.013088361,0.0104706888,0.756870279,,, +1.5,1.6,2.1564136972,-0.5311254505,-0.1508860995,-0.5311254505,0.8463175378,0.0380832525,-0.1508860995,0.0380832525,0.3871796076,,, +1.5,1.6,1.3946913771,-0.3529635241,-0.1507735488,-0.3529635241,0.7325030580,-0.0239166525,-0.1507735488,-0.0239166525,0.6404540983,,, +1.5,1.6,2.57527815,-0.621023059,-0.153239456,-0.621023059,0.897709368,0.0564566417,-0.153239456,0.0564566417,0.317012482,,, +1.5,1.6,2.57527815,-0.621023059,-0.153239456,-0.621023059,0.897709368,0.0564566417,-0.153239456,0.0564566417,0.317012482,,, +2.0,2.1,2.2610472501,-0.5987174986,-0.0891846320,-0.5987174986,1.6552464264,-0.1444777516,-0.0891846320,-0.1444777516,0.9661034629,,, +2.0,2.1,1.4130481322,-0.3274355106,-0.0818128545,-0.3274355106,1.3898388594,-0.2556481100,-0.0818128545,-0.2556481100,1.4656994550,,, +2.0,2.1,2.87232755,-0.786745664,-0.0991696216,-0.786745664,1.81451826,-0.0991696216,-0.0991696216,-0.0991696216,0.783154191,,, +2.0,2.1,2.87232755,-0.786745664,-0.0991696216,-0.786745664,1.81451826,-0.0991696216,-0.0991696216,-0.0991696216,0.783154191,,, +2.5,2.6,1.2893592097,0.0400449898,0.0283946377,0.0400449898,1.4319869075,0.0393787337,0.0283946377,0.0393787337,1.4082015200,,, +2.5,2.6,0.8648032496,0.0934128905,0.0219582593,0.0934128905,1.2089596505,-0.0398926396,0.0219582593,-0.0398926396,1.9022433520,,, +2.5,2.6,1.64826027,-0.0096356901,0.0289070702,-0.0096356901,1.5880372,0.0770855206,0.0289070702,0.0770855206,1.17370253,,, +2.5,2.6,1.64826027,-0.0096356901,0.0289070702,-0.0096356901,1.5880372,0.0770855206,0.0289070702,0.0770855206,1.17370253,,, +3.0,3.1,1.5015552066,-0.0594514456,0.0962030617,-0.0594514456,1.8398138927,-0.1185607586,0.0962030617,-0.1185607586,1.2430573748,,, +3.0,3.1,1.0238594322,0.0250386782,0.0760701334,0.0250386782,1.5082341167,-0.1801058831,0.0760701334,-0.1801058831,1.5841130590,,, +3.0,3.1,1.9742694,-0.149321794,0.108597668,-0.149321794,2.11906629,-0.081448251,0.108597668,-0.081448251,1.04666432,,, +3.0,3.1,1.9742694,-0.149321794,0.108597668,-0.149321794,2.11906629,-0.081448251,0.108597668,-0.081448251,1.04666432,,, +4.0,4.1,0.8268185049,0.2773250134,0.0741722716,0.2773250134,1.1553614354,-0.0231391038,0.0741722716,-0.0231391038,0.8444734431,,, +4.0,4.1,0.6080801523,0.2368114440,0.0555705814,0.2368114440,0.9682812380,-0.0572978769,0.0555705814,-0.0572978769,1.0543411216,,, +4.0,4.1,1.06313148,0.315509839,0.0893944544,0.315509839,1.33131485,0.00,0.0893944544,0.00,0.705553667,,, +4.0,4.1,1.06313148,0.315509839,0.0893944544,0.315509839,1.33131485,0.00,0.0893944544,0.00,0.705553667,,, +4.5,4.6,0.9256627617,0.3992555385,0.0732879412,0.3992555385,1.8522373972,0.0716092283,0.0732879412,0.0716092283,1.1118708257,,, +4.5,4.6,0.7060500528,0.3205518345,0.0496783655,0.3205518345,1.5171967044,0.0229145690,0.0496783655,0.0229145690,1.3424845135,,, +4.5,4.6,1.18724478,0.490413981,0.0959505616,0.490413981,2.21604802,0.111942322,0.0959505616,0.111942322,0.936707201,,, +4.5,4.6,1.18724478,0.490413981,0.0959505616,0.490413981,2.21604802,0.111942322,0.0959505616,0.111942322,0.936707201,,, +5.0,5.1,1.4277768407,0.0479887577,0.0452254506,0.0479887577,2.1715066321,-0.1823592263,0.0452254506,-0.1823592263,1.7289574830,,, +5.0,5.1,1.0965454040,0.0439480881,0.0187759211,0.0439480881,1.7463814966,-0.2199295367,0.0187759211,-0.2199295367,1.9990169538,,, +5.0,5.1,1.86743369,0.055816941,0.074422588,0.055816941,2.70096668,-0.148845176,0.074422588,-0.148845176,1.49159963,,, +5.0,5.1,1.86743369,0.055816941,0.074422588,0.055816941,2.70096668,-0.148845176,0.074422588,-0.148845176,1.49159963,,, +5.5,5.6,1.4256920075,0.2406250166,-0.1648767943,0.2406250166,1.7689402685,0.1547873069,-0.1648767943,0.1547873069,1.3788046529,,, +5.5,5.6,1.1055625378,0.1857719531,-0.1677345802,0.1857719531,1.4080506402,0.1070954089,-0.1677345802,0.1070954089,1.5456980053,,, +5.5,5.6,1.89536719,0.324938579,-0.160114662,0.324938579,2.27210757,0.20720721,-0.160114662,0.20720721,1.21252525,,, +5.5,5.6,1.89536719,0.324938579,-0.160114662,0.324938579,2.27210757,0.20720721,-0.160114662,0.20720721,1.21252525,,, +6.0,6.1,1.1958492811,-0.0044659670,-0.0125273785,-0.0044659670,1.2426448650,-0.0366720387,-0.0125273785,-0.0366720387,1.7747573440,,, +6.0,6.1,0.9402403823,-0.0065491760,-0.0216643844,-0.0065491760,1.0030116239,-0.0673486990,-0.0216643844,-0.0673486990,1.9303209142,,, +6.0,6.1,1.60313579,0.0031911466,0.00,0.0031911466,1.6071931,-0.0013676342,0.00,-0.0013676342,1.59967111,,, +6.0,6.1,1.60313579,0.0031911466,0.00,0.0031911466,1.6071931,-0.0013676342,0.00,-0.0013676342,1.59967111,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Affine-Transformation-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Affine-Transformation-test.xml new file mode 100644 index 0000000..c4f3b1d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Affine-Transformation-test.xml @@ -0,0 +1,796 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x002d042d, 0x0a17b655) + (0x79a9edeb, 0x245d83fc) + Test Name + Covariance-To-Feature + Matrix-Affine-Transformation + + + (0x006e9c48, 0x3386ce48) + (0x79a9edeb, 0x245d83fc) + Input Bias + bias-input + Matrix-Affine-Transformation-bias-input + + + (0x00667d28, 0x74308af4) + (0x79a9edeb, 0x245d83fc) + Output Bias + bias-output + Matrix-Affine-Transformation-bias-output + + + + + + + (0x0000024a, 0x00005590) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x544a003e, 0x6dcba5f6) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/$var{Test Name}-output.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 672 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000015a8, 0x000079ea) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 1152 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01165f9f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000484f, 0x00003eff) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x544a003e, 0x6dcba5f6) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x000048af, 0x00002a63) + Matrix Affine Transformation + (0x1baa7180, 0x52cb19b8) + + + (0x544a003e, 0x6dcba5f6) + Matrix Input + + + + + (0x544a003e, 0x6dcba5f6) + Transformed Matrix Output + + + + + (0x330306dd, 0x74a95f98) + Filename to load transformation + ${Player_ScenarioDirectory}/my-transformation-input.xml + + false + + + (0x330306dd, 0x74a95f98) + Filename to save transformation + ${Player_ScenarioDirectory}/my-transformation-output.xml + ${Player_ScenarioDirectory}/$var{Output Bias}-4.xml + false + + + (0x2cdb2f0b, 0x12f231ea) + Continuous Update + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 1008 + + + (0x4e7b798a, 0x183beafb) + (0x9a24ed4b, 0x44592bc6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000048af, 0x00002a64) + Matrix Affine Transformation + (0x1baa7180, 0x52cb19b8) + + + (0x544a003e, 0x6dcba5f6) + Matrix Input + + + + + (0x544a003e, 0x6dcba5f6) + Transformed Matrix Output + + + + + (0x330306dd, 0x74a95f98) + Filename to load transformation + ${Player_ScenarioDirectory}/my-transformation-input.xml + ${Player_ScenarioDirectory}/$var{Input Bias}.xml + false + + + (0x330306dd, 0x74a95f98) + Filename to save transformation + ${Player_ScenarioDirectory}/my-transformation-output.xml + ${Player_ScenarioDirectory}/$var{Output Bias}-3.xml + false + + + (0x2cdb2f0b, 0x12f231ea) + Continuous Update + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0x9a24ed4b, 0x44592bc6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000048af, 0x00002a65) + Matrix Affine Transformation + (0x1baa7180, 0x52cb19b8) + + + (0x544a003e, 0x6dcba5f6) + Matrix Input + + + + + (0x544a003e, 0x6dcba5f6) + Transformed Matrix Output + + + + + (0x330306dd, 0x74a95f98) + Filename to load transformation + ${Player_ScenarioDirectory}/my-transformation-input.xml + + false + + + (0x330306dd, 0x74a95f98) + Filename to save transformation + ${Player_ScenarioDirectory}/my-transformation-output.xml + ${Player_ScenarioDirectory}/$var{Output Bias}-2.xml + false + + + (0x2cdb2f0b, 0x12f231ea) + Continuous Update + false + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x4e7b798a, 0x183beafb) + (0x9a24ed4b, 0x44592bc6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000048af, 0x00002a66) + Matrix Affine Transformation + (0x1baa7180, 0x52cb19b8) + + + (0x544a003e, 0x6dcba5f6) + Matrix Input + + + + + (0x544a003e, 0x6dcba5f6) + Transformed Matrix Output + + + + + (0x330306dd, 0x74a95f98) + Filename to load transformation + ${Player_ScenarioDirectory}/my-transformation-input.xml + ${Player_ScenarioDirectory}/$var{Input Bias}.xml + false + + + (0x330306dd, 0x74a95f98) + Filename to save transformation + ${Player_ScenarioDirectory}/my-transformation-output.xml + ${Player_ScenarioDirectory}/$var{Output Bias}-1.xml + false + + + (0x2cdb2f0b, 0x12f231ea) + Continuous Update + false + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x4e7b798a, 0x183beafb) + (0x9a24ed4b, 0x44592bc6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004ce5, 0x000064bd) + Streamed matrix multiplexer + (0x7a12298b, 0x785f4d42) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + (0x544a003e, 0x6dcba5f6) + Input stream 4 + + + + + (0x544a003e, 0x6dcba5f6) + Multiplexed streamed matrix + + + + + (0x1fa7a38f, 0x54edbe0b) + 608 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x4badfdff, 0xc35004a3) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005b5f, 0x000050b0) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 1152 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017178bd) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000b3e, 0x000078a7) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x000015a8, 0x000079ea) + 0 + + + + (0x00003aab, 0x00002a7d) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000048af, 0x00002a63) + 0 + + + + (0x00003be1, 0x0000472a) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000048af, 0x00002a65) + 0 + + + + (0x00004da8, 0x00000384) + + (0x000048af, 0x00002a65) + 0 + + + (0x00004ce5, 0x000064bd) + 1 + + + + (0x00004fc6, 0x000065b8) + + (0x00004ce5, 0x000064bd) + 0 + + + (0x0000024a, 0x00005590) + 0 + + + + (0x00005239, 0x0000200e) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000048af, 0x00002a64) + 0 + + + + (0x000059ec, 0x00000e9a) + + (0x000048af, 0x00002a63) + 0 + + + (0x00004ce5, 0x000064bd) + 3 + + + + (0x00005b10, 0x0000636d) + + (0x000048af, 0x00002a66) + 0 + + + (0x00004ce5, 0x000064bd) + 0 + + + + (0x00005e9d, 0x00000c90) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00005b5f, 0x000050b0) + 0 + + + + (0x00006987, 0x0000792b) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000048af, 0x00002a66) + 0 + + + + (0x00006cef, 0x0000347f) + + (0x000048af, 0x00002a64) + 0 + + + (0x00004ce5, 0x000064bd) + 2 + + + + + + (0x00000a76, 0x00006320) + continuous update +bias in input + + + (0x473d9a43, 0x97fc0a97) + 432 + + + (0x7234b86b, 0x2b8651a5) + 240 + + + + + (0x00000a76, 0x00006321) + non continuous update +bias in input + + + (0x473d9a43, 0x97fc0a97) + 816 + + + (0x7234b86b, 0x2b8651a5) + 240 + + + + + (0x00000a76, 0x00006322) + continuous update +without bias in input + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + 240 + + + + + (0x00000a76, 0x00006323) + non continuous update +without bias in input + + + (0x473d9a43, 0x97fc0a97) + 1008 + + + (0x7234b86b, 0x2b8651a5) + 240 + + + + + + + (0x000062ac, 0x00003721) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000041e, 0x000069b5)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004c5d, 0x000021d4)","index":0,"name":"Default tab","parentIdentifier":"(0x0000041e, 0x000069b5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000420e, 0x000074bb)","index":0,"name":"Empty","parentIdentifier":"(0x00004c5d, 0x000021d4)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Model-FgMDM-RT-Rebias-input.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Model-FgMDM-RT-Rebias-input.xml new file mode 100644 index 0000000..36db8c6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Model-FgMDM-RT-Rebias-input.xml @@ -0,0 +1,22 @@ + + + 1.000000000000002 3.045804662198415e-016 -1.083439842832976e-017 + 3.120207801110272e-016 1.000000000000002 1.423904735981842e-016 +-1.131932479063284e-017 9.88074520883982e-017 1 + 0.4571483281434478 -0.2091652423315247 0.03361968484301781 -0.3084651559605923 0.1455122307807162 -0.2948877594305606 + -0.2091652423315247 0.09570219534058361 -0.0153824679964546 0.141136224558352 -0.06657817417172912 0.1349239751403816 + 0.03361968484301781 -0.0153824679964546 0.002472464929564769 -0.02268520016372741 0.01070128673448211 -0.021686688818007 + -0.3084651559605923 0.141136224558352 -0.0226852001637274 0.2081397799882916 -0.09818575328544738 0.1989783033288804 + 0.1455122307807162 -0.06657817417172912 0.01070128673448211 -0.09818575328544738 0.04631715354351313 -0.09386401100695584 + -0.2948877594305606 0.1349239751403816 -0.021686688818007 0.1989783033288804 -0.09386401100695584 0.1902200780545993 + 1.709527037001553 0.01674065808550483 0.02077745909258021 + 0.0167406580855048 1.603445856214175 0.05423884606003263 +0.02077745909258023 0.05423884606003254 0.8303254613806947 + 1.217491024198781 -0.06524404047529427 0.009190643646449745 +-0.06524404047529459 0.8795201800587355 0.03831069209919288 + 0.00919064364644976 0.03831069209919275 0.8827123219453276 + 0.7647242857777238 0.08583740056243625 -0.01647572387326594 + 0.08583740056243591 1.208572712146326 -0.07434413112825075 +-0.01647572387326593 -0.07434413112825099 1.194911803886511 + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Model-FgMDM-RT-input.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Model-FgMDM-RT-input.xml new file mode 100644 index 0000000..ed17b9e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Model-FgMDM-RT-input.xml @@ -0,0 +1,19 @@ + + + 1.709527037001553 0.01674065808550483 0.02077745909258021 + 0.0167406580855048 1.603445856214175 0.05423884606003263 +0.02077745909258023 0.05423884606003254 0.8303254613806947 + 0.4571483281434481 -0.2091652423315248 0.03361968484301779 -0.3084651559605915 0.1455122307807163 -0.2948877594305613 + -0.2091652423315248 0.09570219534058362 -0.01538246799645458 0.1411362245583517 -0.06657817417172916 0.1349239751403819 + 0.03361968484301779 -0.01538246799645458 0.002472464929564764 -0.02268520016372732 0.01070128673448211 -0.02168668881800702 + -0.3084651559605916 0.1411362245583517 -0.02268520016372732 0.2081397799882904 -0.09818575328544718 0.1989783033288803 + 0.1455122307807163 -0.06657817417172916 0.01070128673448211 -0.09818575328544718 0.04631715354351319 -0.09386401100695609 + -0.2948877594305613 0.1349239751403819 -0.02168668881800702 0.1989783033288803 -0.09386401100695609 0.1902200780546 + 2.080424456035409 -0.08968108457255815 0.03145957072437496 +-0.08968108457255819 1.411636322699941 0.09127519234056924 + 0.03145957072437495 0.09127519234056881 0.7348278641565802 + 1.308402910825092 0.1571670864034623 0.002326752129441802 + 0.1571670864034622 1.934558115887081 -0.01963517957026331 +0.002326752129441757 -0.01963517957026387 0.9885270397948652 + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Model-MDM-Rebias-input.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Model-MDM-Rebias-input.xml new file mode 100644 index 0000000..a3b53c8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Model-MDM-Rebias-input.xml @@ -0,0 +1,13 @@ + + + 1.709527037001553 0.01674065808550483 0.02077745909258021 + 0.0167406580855048 1.603445856214175 0.05423884606003263 +0.02077745909258023 0.05423884606003254 0.8303254613806947 + 1.129201373790552 -0.103108470045361 -0.005591866397332841 + -0.103108470045361 0.8848967837622729 0.01595935296593173 +-0.005591866397332836 0.01595935296593177 0.8014994162357301 + 0.8555858821740578 0.1461173946933084 0.004183833412542616 + 0.1461173946933084 1.212890068100399 -0.03053146595067506 +0.004183833412542643 -0.03053146595067515 1.364422601725092 + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Model-MDM-input.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Model-MDM-input.xml new file mode 100644 index 0000000..c2c2c0e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Model-MDM-input.xml @@ -0,0 +1,10 @@ + + + 1.928498257823693 -0.1538212861771107 0.01072463406295541 +-0.1538212861771107 1.418171586084176 0.06326910288136137 +0.01072463406295545 0.06326910288136133 0.6661665454308594 + 1.465255037801102 0.2589795052562249 0.03170238062149895 + 0.2589795052562249 1.945333450603011 0.03574217029847612 +0.03170238062149886 0.03574217029847622 1.131531168265404 + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Supervised-ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Supervised-ref.csv new file mode 100644 index 0000000..5325696 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Supervised-ref.csv @@ -0,0 +1,97 @@ +Time:2,End Time,,,Event Id,Event Date,Event Duration +0.0,0.1,1.3146344607,1.4748541725,,, +0.0,0.1,0.5287184737,0.4712815263,,, +0.0,0.1,1.3146344607,1.4748541725,,, +0.0,0.1,0.5287184737,0.4712815263,,, +0.0,0.1,0.0266535092,0.7187078375,,, +0.0,0.1,0.9642408218,0.0357591782,,, +0.0,0.1,0.0266535092,0.7187078375,,, +0.0,0.1,0.9642408218,0.0357591782,,, +0.5,0.6,0.6051193554,1.0518176354,769:769:769:769,0.1:0.1:0.1:0.1,0.0:0.0:0.0:0.0 +0.5,0.6,0.6347963992,0.3652036008,,, +0.5,0.6,1.8559620293,1.8412868439,,, +0.5,0.6,0.4980153912,0.5019846088,,, +0.5,0.6,0.0930348094,0.7884208263,,, +0.5,0.6,0.8944532140,0.1055467860,,, +0.5,0.6,0.2438422258,0.4515437911,,, +0.5,0.6,0.6493426386,0.3506573614,,, +1.0,1.1,0.6321793518,0.8124450161,769:770:769:769,0.6:0.6:0.6:0.6,0.0:0.0:0.0:0.0 +1.0,1.1,0.5623918813,0.4376081187,,, +1.0,1.1,0.9585763775,0.8417488820,,, +1.0,1.1,0.4675537809,0.5324462191,,, +1.0,1.1,0.2853965111,0.4203267068,,, +1.0,1.1,0.5955971068,0.4044028932,,, +1.0,1.1,0.5896943472,0.0785980891,,, +1.0,1.1,0.1176103227,0.8823896773,,, +1.5,1.6,1.1148870146,1.8495487410,769:770:769:770,1.1:1.1:1.1:1.1,0.0:0.0:0.0:0.0 +1.5,1.6,0.6239125734,0.3760874266,,, +1.5,1.6,0.9232558534,1.5992808599,,, +1.5,1.6,0.6339970600,0.3660029400,,, +1.5,1.6,0.8833524332,1.5605360001,,, +1.5,1.6,0.6385463341,0.3614536659,,, +1.5,1.6,0.7085752971,1.3178982986,,, +1.5,1.6,0.6503407207,0.3496592793,,, +2.0,2.1,0.7163048394,1.0671543241,769:769:769:769,1.6:1.6:1.6:1.6,0.0:0.0:0.0:0.0 +2.0,2.1,0.5983620741,0.4016379259,,, +2.0,2.1,0.9722919048,0.9418856609,,, +2.0,2.1,0.4920576219,0.5079423781,,, +2.0,2.1,0.0745574219,0.8320457554,,, +2.0,2.1,0.9177617907,0.0822382093,,, +2.0,2.1,0.3096578586,0.3640810790,,, +2.0,2.1,0.5403889529,0.4596110471,,, +2.5,2.6,0.7055973474,0.3311470950,769:770:769:769,2.1:2.1:2.1:2.1,0.0:0.0:0.0:0.0 +2.5,2.6,0.3194105331,0.6805894669,,, +2.5,2.6,1.0814347909,0.4657549948,,, +2.5,2.6,0.3010328785,0.6989671215,,, +2.5,2.6,0.5202855039,0.2434159481,,, +2.5,2.6,0.3187318126,0.6812681874,,, +2.5,2.6,0.8603890212,0.2124549051,,, +2.5,2.6,0.1980296480,0.8019703520,,, +3.0,3.1,0.6840648815,0.4765003984,770:770:770:770,2.6:2.6:2.6:2.6,0.0:0.0:0.0:0.0 +3.0,3.1,0.4105761275,0.5894238725,,, +3.0,3.1,0.8864877839,0.4773963713,,, +3.0,3.1,0.3500270675,0.6499729325,,, +3.0,3.1,0.4427522664,0.2809272237,,, +3.0,3.1,0.3881928776,0.6118071224,,, +3.0,3.1,0.6555921150,0.0738417697,,, +3.0,3.1,0.1012316144,0.8987683856,,, +4.0,4.1,0.8454327898,0.7475471701,770:770:770:770,3.1:3.1:3.1:3.1,0.0:0.0:0.0:0.0 +4.0,4.1,0.4692759412,0.5307240588,,, +4.0,4.1,1.0196264961,0.6934266642,,, +4.0,4.1,0.4047899273,0.5952100727,,, +4.0,4.1,0.5949672922,0.0970870361,,, +4.0,4.1,0.1402881712,0.8597118288,,, +4.0,4.1,0.7252648118,0.1903424748,,, +4.0,4.1,0.2078865880,0.7921134120,,, +4.5,4.6,0.9511190382,0.3534512553,770:770:770:770,4.1:4.1:4.1:4.1,0.0:0.0:0.0:0.0 +4.5,4.6,0.2709330858,0.7290669142,,, +4.5,4.6,1.0658708278,0.4466031818,,, +4.5,4.6,0.2952799050,0.7047200950,,, +4.5,4.6,0.8758921425,0.2000189869,,, +4.5,4.6,0.1859066064,0.8140933936,,, +4.5,4.6,0.9303070670,0.3636609841,,, +4.5,4.6,0.2810432482,0.7189567518,,, +5.0,5.1,1.0673142921,0.6866504528,770:770:770:770,4.6:4.6:4.6:4.6,0.0:0.0:0.0:0.0 +5.0,5.1,0.3914847518,0.6085152482,,, +5.0,5.1,1.0690569132,0.8035065888,,, +5.0,5.1,0.4290944408,0.5709055592,,, +5.0,5.1,0.7632985592,0.0588512626,,, +5.0,5.1,0.0715821631,0.9284178369,,, +5.0,5.1,0.7283205622,0.1097229102,,, +5.0,5.1,0.1309274683,0.8690725317,,, +5.5,5.6,0.8565218506,0.4480630617,770:770:770:770,5.1:5.1:5.1:5.1,0.0:0.0:0.0:0.0 +5.5,5.6,0.3434525859,0.6565474141,,, +5.5,5.6,0.8137461529,0.4779701966,,, +5.5,5.6,0.3700272097,0.6299727903,,, +5.5,5.6,0.5942285596,0.1175751448,,, +5.5,5.6,0.1651791695,0.8348208305,,, +5.5,5.6,0.5004183664,0.1318946493,,, +5.5,5.6,0.2085907549,0.7914092451,,, +6.0,6.1,0.9215137413,0.5110243251,770:770:770:770,5.6:5.6:5.6:5.6,0.0:0.0:0.0:0.0 +6.0,6.1,0.3567265241,0.6432734759,,, +6.0,6.1,0.7684991863,0.5332461095,,, +6.0,6.1,0.4096393597,0.5903606403,,, +6.0,6.1,0.6318850879,0.0668547115,,, +6.0,6.1,0.0956789803,0.9043210197,,, +6.0,6.1,0.5036063251,0.1140517296,,, +6.0,6.1,0.1846518939,0.8153481061,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Supervised-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Supervised-test.xml new file mode 100644 index 0000000..4d8185d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Supervised-test.xml @@ -0,0 +1,1088 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x002d042d, 0x0a17b655) + (0x79a9edeb, 0x245d83fc) + Test Name + Covariance-To-Feature + Matrix-Classifier-Testing + + + (0x00007354, 0xbcb4f088) + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_GDF_Left + OVTK_GDF_Left + + + (0x00661288, 0x24c82f34) + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_GDF_Right + OVTK_GDF_Right + + + (0x0043c679, 0x34283681) + (0x5261636b, 0x41646170) + Adaptation + Supervised + Supervised + + + + + + + (0x0000024a, 0x00005590) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x544a003e, 0x6dcba5f6) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/$var{Test Name}-Supervised-output.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000015a8, 0x000079ea) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 1376 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01165f9f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000017aa, 0x000055a7) + MDM + (0x918f6952, 0xb22ddf0d) + + + (0x6f752dd0, 0x082a321e) + Expected Label + + + (0x544a003e, 0x6dcba5f6) + Input Matrix + + + + + (0x6f752dd0, 0x082a321e) + Label + + + (0x544a003e, 0x6dcba5f6) + Distance + + + (0x544a003e, 0x6dcba5f6) + Probability + + + + + (0x330306dd, 0x74a95f98) + Filename to load classifier model + ${Player_ScenarioDirectory}/input-classifier.xml + ${Player_ScenarioDirectory}/$var{Test Name}-Model-MDM-input.xml + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/output-classifier.xml + + false + + + (0x5261636b, 0x41646170) + Adaptation + None + $var{Adaptation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb85fcd48, 0x1d5e5748) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000017aa, 0x000055a8) + MDM Rebias + (0x918f6952, 0xb22ddf0d) + + + (0x6f752dd0, 0x082a321e) + Expected Label + + + (0x544a003e, 0x6dcba5f6) + Input Matrix + + + + + (0x6f752dd0, 0x082a321e) + Label + + + (0x544a003e, 0x6dcba5f6) + Distance + + + (0x544a003e, 0x6dcba5f6) + Probability + + + + + (0x330306dd, 0x74a95f98) + Filename to load classifier model + ${Player_ScenarioDirectory}/input-classifier.xml + ${Player_ScenarioDirectory}/$var{Test Name}-Model-MDM-Rebias-input.xml + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/output-classifier.xml + + false + + + (0x5261636b, 0x41646170) + Adaptation + None + $var{Adaptation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0xb85fcd48, 0x1d5e5748) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000017aa, 0x000055aa) + FgMDM RT + (0x918f6952, 0xb22ddf0d) + + + (0x6f752dd0, 0x082a321e) + Expected Label + + + (0x544a003e, 0x6dcba5f6) + Input Matrix + + + + + (0x6f752dd0, 0x082a321e) + Label + + + (0x544a003e, 0x6dcba5f6) + Distance + + + (0x544a003e, 0x6dcba5f6) + Probability + + + + + (0x330306dd, 0x74a95f98) + Filename to load classifier model + ${Player_ScenarioDirectory}/input-classifier.xml + ${Player_ScenarioDirectory}/$var{Test Name}-Model-FgMDM-RT-input.xml + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/output-classifier.xml + + false + + + (0x5261636b, 0x41646170) + Adaptation + None + $var{Adaptation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 1104 + + + (0x4e7b798a, 0x183beafb) + (0xb85fcd48, 0x1d5e5748) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000017aa, 0x000055ab) + FgMDM RT Rebias + (0x918f6952, 0xb22ddf0d) + + + (0x6f752dd0, 0x082a321e) + Expected Label + + + (0x544a003e, 0x6dcba5f6) + Input Matrix + + + + + (0x6f752dd0, 0x082a321e) + Label + + + (0x544a003e, 0x6dcba5f6) + Distance + + + (0x544a003e, 0x6dcba5f6) + Probability + + + + + (0x330306dd, 0x74a95f98) + Filename to load classifier model + ${Player_ScenarioDirectory}/input-classifier.xml + ${Player_ScenarioDirectory}/$var{Test Name}-Model-FgMDM-RT-Rebias-input.xml + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/output-classifier.xml + + false + + + (0x5261636b, 0x41646170) + Adaptation + None + $var{Adaptation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 1248 + + + (0x4e7b798a, 0x183beafb) + (0xb85fcd48, 0x1d5e5748) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000484f, 0x00003eff) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x544a003e, 0x6dcba5f6) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00004ce5, 0x000064bd) + Streamed matrix multiplexer + (0x7a12298b, 0x785f4d42) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + (0x544a003e, 0x6dcba5f6) + Input stream 4 + + + (0x544a003e, 0x6dcba5f6) + Input stream 5 + + + (0x006a35a0, 0x65916db0) + (0x544a003e, 0x6dcba5f6) + Input stream 6 + + + (0x005f92b6, 0x3d11ab9e) + (0x544a003e, 0x6dcba5f6) + Input stream 7 + + + (0x001c597f, 0x6d812676) + (0x544a003e, 0x6dcba5f6) + Input stream 8 + + + + + (0x544a003e, 0x6dcba5f6) + Multiplexed streamed matrix + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 944 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x4badfdff, 0xc35004a3) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005b5f, 0x000050b0) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 1376 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017178bd) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007ab6, 0x0000228c) + Stimulation multiplexer + (0x07db4efa, 0x472b0938) + + + (0x6f752dd0, 0x082a321e) + Input stimulations 1 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 2 + + + (0x006b5500, 0xd1f46388) + (0x6f752dd0, 0x082a321e) + Input stimulations 3 + + + (0x002fce8c, 0x5337bfb2) + (0x6f752dd0, 0x082a321e) + Input stimulations 4 + + + + + (0x6f752dd0, 0x082a321e) + Multiplexed stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 1104 + + + (0x4e7b798a, 0x183beafb) + (0xe7af82cd, 0x14edb4d4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00000b3e, 0x000078a7) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x000015a8, 0x000079ea) + 0 + + + + (0x00001ff1, 0x000042f7) + + (0x000017aa, 0x000055ab) + 1 + + + (0x00004ce5, 0x000064bd) + (0x005f92b6, 0x3d11ab9e) + + + + (0x0000200d, 0x00003920) + + (0x00004ce5, 0x000064bd) + 0 + + + (0x0000024a, 0x00005590) + 0 + + + + (0x000022ba, 0x0000495e) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000017aa, 0x000055a7) + 1 + + + + (0x00002c5e, 0x000075e8) + + (0x000017aa, 0x000055aa) + 1 + + + (0x00004ce5, 0x000064bd) + 4 + + + + (0x00003134, 0x00006daa) + + (0x000017aa, 0x000055aa) + 0 + + + (0x00007ab6, 0x0000228c) + (0x006b5500, 0xd1f46388) + + + + (0x000039be, 0x00000155) + + (0x000017aa, 0x000055aa) + 2 + + + (0x00004ce5, 0x000064bd) + (0x006a35a0, 0x65916db0) + + + + (0x00004559, 0x00006460) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000017aa, 0x000055a8) + 1 + + + + (0x00004c50, 0x00003d1d) + + (0x0000484f, 0x00003eff) + 1 + + + (0x000017aa, 0x000055ab) + 0 + + + + (0x00004cbd, 0x000044b6) + + (0x000017aa, 0x000055ab) + 2 + + + (0x00004ce5, 0x000064bd) + (0x001c597f, 0x6d812676) + + + + (0x00004e39, 0x0000279d) + + (0x000017aa, 0x000055a7) + 2 + + + (0x00004ce5, 0x000064bd) + 1 + + + + (0x0000509c, 0x00002f90) + + (0x000017aa, 0x000055a8) + 1 + + + (0x00004ce5, 0x000064bd) + 2 + + + + (0x000058ce, 0x00007859) + + (0x000017aa, 0x000055a7) + 0 + + + (0x00007ab6, 0x0000228c) + 0 + + + + (0x00005a81, 0x0000389f) + + (0x000017aa, 0x000055a8) + 0 + + + (0x00007ab6, 0x0000228c) + 1 + + + + (0x00005b22, 0x00000558) + + (0x000017aa, 0x000055a8) + 2 + + + (0x00004ce5, 0x000064bd) + 3 + + + + (0x00005e9d, 0x00000c90) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00005b5f, 0x000050b0) + 0 + + + + (0x000060e8, 0x00004d02) + + (0x00007ab6, 0x0000228c) + 0 + + + (0x0000024a, 0x00005590) + 1 + + + + (0x000068b5, 0x00000d28) + + (0x0000484f, 0x00003eff) + 1 + + + (0x000017aa, 0x000055aa) + 0 + + + + (0x00006b73, 0x00005634) + + (0x0000484f, 0x00003eff) + 1 + + + (0x000017aa, 0x000055a7) + 0 + + + + (0x00006fc0, 0x00004d4e) + + (0x000017aa, 0x000055ab) + 0 + + + (0x00007ab6, 0x0000228c) + (0x002fce8c, 0x5337bfb2) + + + + (0x000074bf, 0x00006c11) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000017aa, 0x000055aa) + 1 + + + + (0x000077ec, 0x000032e4) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000017aa, 0x000055ab) + 1 + + + + (0x00007b48, 0x00005980) + + (0x000017aa, 0x000055a7) + 1 + + + (0x00004ce5, 0x000064bd) + 0 + + + + (0x00007f9a, 0x000074c7) + + (0x0000484f, 0x00003eff) + 1 + + + (0x000017aa, 0x000055a8) + 0 + + + + + + (0x00000a76, 0x0000631f) + Output Format : +Trial 1 - MDM - Distance +Trial 1 - MDM - Probability +Trial 1 - MDM Rebias - Distance +Trial 1 - MDM Rebias - Probability +Trial 1 - FgMDM RT - Distance +Trial 1 - FgMDM RT - Probability +Trial 1 - FgMDM RT Rebias - Distance +Trial 1 - FgMDM RT Rebias - Probability +Trial 2 - MDM - Distance +Prediction MDM MDM Rebias FgMDM RT FgMDM RT Rebias +Trial 2 - MDM - Probability +Trial 2 - MDM Rebias - Distance +Trial 2 - MDM Rebias - Probability +Trial 2 - FgMDM RT - Distance +Trial 2 - FgMDM RT - Probability +Trial 2 - FgMDM RT Rebias - Distance +Trial 2 - FgMDM RT Rebias - Probability +Trial 3 - MDM - Distance +Prediction MDM MDM Rebias FgMDM RT Rebias +................ + + + (0x473d9a43, 0x97fc0a97) + 1648 + + + (0x7234b86b, 0x2b8651a5) + 416 + + + + + + + (0x000062ac, 0x00003721) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000041e, 0x000069b5)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004c5d, 0x000021d4)","index":0,"name":"Default tab","parentIdentifier":"(0x0000041e, 0x000069b5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000420e, 0x000074bb)","index":0,"name":"Empty","parentIdentifier":"(0x00004c5d, 0x000021d4)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Unsupervised-ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Unsupervised-ref.csv new file mode 100644 index 0000000..174676b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Unsupervised-ref.csv @@ -0,0 +1,97 @@ +Time:2,End Time,,,Event Id,Event Date,Event Duration +0.0,0.1,1.3146344607,1.4748541725,,, +0.0,0.1,0.5287184737,0.4712815263,,, +0.0,0.1,1.3146344607,1.4748541725,,, +0.0,0.1,0.5287184737,0.4712815263,,, +0.0,0.1,0.0266535092,0.7187078375,,, +0.0,0.1,0.9642408218,0.0357591782,,, +0.0,0.1,0.0266535092,0.7187078375,,, +0.0,0.1,0.9642408218,0.0357591782,,, +0.5,0.6,0.6051193554,1.0518176354,769:769:769:769,0.1:0.1:0.1:0.1,0.0:0.0:0.0:0.0 +0.5,0.6,0.6347963992,0.3652036008,,, +0.5,0.6,1.8559620293,1.8412868439,,, +0.5,0.6,0.4980153912,0.5019846088,,, +0.5,0.6,0.0930348094,0.7884208263,,, +0.5,0.6,0.8944532140,0.1055467860,,, +0.5,0.6,0.2438422258,0.4515437911,,, +0.5,0.6,0.6493426386,0.3506573614,,, +1.0,1.1,0.6321793518,0.8124450161,769:770:769:769,0.6:0.6:0.6:0.6,0.0:0.0:0.0:0.0 +1.0,1.1,0.5623918813,0.4376081187,,, +1.0,1.1,1.0777024519,0.6775878148,,, +1.0,1.1,0.3860260765,0.6139739235,,, +1.0,1.1,0.2853965111,0.4203267068,,, +1.0,1.1,0.5955971068,0.4044028932,,, +1.0,1.1,0.5896943472,0.0785980891,,, +1.0,1.1,0.1176103227,0.8823896773,,, +1.5,1.6,1.1148870146,1.8495487410,769:770:769:770,1.1:1.1:1.1:1.1,0.0:0.0:0.0:0.0 +1.5,1.6,0.6239125734,0.3760874266,,, +1.5,1.6,0.9909040183,1.4164015407,,, +1.5,1.6,0.5883763012,0.4116236988,,, +1.5,1.6,0.8833524332,1.5605360001,,, +1.5,1.6,0.6385463341,0.3614536659,,, +1.5,1.6,0.6496058623,1.3047986171,,, +1.5,1.6,0.6676195388,0.3323804612,,, +2.0,2.1,0.7163048394,1.0671543241,769:769:769:769,1.6:1.6:1.6:1.6,0.0:0.0:0.0:0.0 +2.0,2.1,0.5983620741,0.4016379259,,, +2.0,2.1,1.1020382378,0.7977816861,,, +2.0,2.1,0.4199248971,0.5800751029,,, +2.0,2.1,0.0745574219,0.8320457554,,, +2.0,2.1,0.9177617907,0.0822382093,,, +2.0,2.1,0.3691719435,0.3509813975,,, +2.0,2.1,0.4873703662,0.5126296338,,, +2.5,2.6,0.7055973474,0.3311470950,769:770:769:770,2.1:2.1:2.1:2.1,0.0:0.0:0.0:0.0 +2.5,2.6,0.3194105331,0.6805894669,,, +2.5,2.6,1.2333291135,0.5446448151,,, +2.5,2.6,0.3063289097,0.6936710903,,, +2.5,2.6,0.5202855039,0.2434159481,,, +2.5,2.6,0.3187318126,0.6812681874,,, +2.5,2.6,0.9457079276,0.2756947863,,, +2.5,2.6,0.2257198082,0.7742801918,,, +3.0,3.1,0.7291625779,0.4486378710,770:770:770:770,2.6:2.6:2.6:2.6,0.0:0.0:0.0:0.0 +3.0,3.1,0.3809116149,0.6190883851,,, +3.0,3.1,1.1038872155,0.4869987955,,, +3.0,3.1,0.3061179696,0.6938820304,,, +3.0,3.1,0.4827742283,0.2403578990,,, +3.0,3.1,0.3323844840,0.6676155160,,, +3.0,3.1,0.8070947922,0.1026198026,,, +3.0,3.1,0.1128043929,0.8871956071,,, +4.0,4.1,0.8712464821,0.7861385418,770:770:770:770,3.1:3.1:3.1:3.1,0.0:0.0:0.0:0.0 +4.0,4.1,0.4743246321,0.5256753679,,, +4.0,4.1,1.0942141267,0.9215909190,,, +4.0,4.1,0.4571825638,0.5428174362,,, +4.0,4.1,0.6666144159,0.0221808687,,, +4.0,4.1,0.0322024108,0.9677975892,,, +4.0,4.1,0.9235954973,0.2077183073,,, +4.0,4.1,0.1836080374,0.8163919626,,, +4.5,4.6,1.0176355173,0.4395194172,770:770:770:770,4.1:4.1:4.1:4.1,0.0:0.0:0.0:0.0 +4.5,4.6,0.3016284726,0.6983715274,,, +4.5,4.6,1.2237688054,0.7143237987,,, +4.5,4.6,0.3685705199,0.6314294801,,, +4.5,4.6,0.9475392662,0.2615165902,,, +4.5,4.6,0.2162981874,0.7837018126,,, +4.5,4.6,1.1286377524,0.3919887318,,, +4.5,4.6,0.2577810763,0.7422189237,,, +5.0,5.1,1.1634608004,0.6232598273,770:770:770:770,4.6:4.6:4.6:4.6,0.0:0.0:0.0:0.0 +5.0,5.1,0.3488289202,0.6511710798,,, +5.0,5.1,1.3575893945,0.6790904993,,, +5.0,5.1,0.3334301582,0.6665698418,,, +5.0,5.1,0.8349456829,0.1198656080,,, +5.0,5.1,0.1255385322,0.8744614678,,, +5.0,5.1,0.9266512477,0.1543668878,,, +5.0,5.1,0.1427976855,0.8572023145,,, +5.5,5.6,0.9421097042,0.4225417076,770:770:770:770,5.1:5.1:5.1:5.1,0.0:0.0:0.0:0.0 +5.5,5.6,0.3096334375,0.6903665625,,, +5.5,5.6,1.0286598949,0.5058249291,,, +5.5,5.6,0.3296382742,0.6703617258,,, +5.5,5.6,0.6658756833,0.0611909524,,, +5.5,5.6,0.0841614088,0.9158385912,,, +5.5,5.6,0.6987490519,0.0863992153,,, +5.5,5.6,0.1100419104,0.8899580896,,, +6.0,6.1,1.0146269373,0.4726840080,770:770:770:770,5.6:5.6:5.6:5.6,0.0:0.0:0.0:0.0 +6.0,6.1,0.3178111541,0.6821888459,,, +6.0,6.1,1.0851903380,0.3673923326,,, +6.0,6.1,0.2529235272,0.7470764728,,, +6.0,6.1,0.7035322116,0.0179716102,,, +6.0,6.1,0.0249085448,0.9750914552,,, +6.0,6.1,0.7019370106,0.0765651631,,, +6.0,6.1,0.0983493248,0.9016506752,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Unsupervised-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Unsupervised-test.xml new file mode 100644 index 0000000..f29a289 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-Unsupervised-test.xml @@ -0,0 +1,1088 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x002d042d, 0x0a17b655) + (0x79a9edeb, 0x245d83fc) + Test Name + Covariance-To-Feature + Matrix-Classifier-Testing + + + (0x00007354, 0xbcb4f088) + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_GDF_Left + OVTK_GDF_Left + + + (0x00661288, 0x24c82f34) + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_GDF_Right + OVTK_GDF_Right + + + (0x0043c679, 0x34283681) + (0x5261636b, 0x41646170) + Adaptation + Supervised + Unsupervised + + + + + + + (0x0000024a, 0x00005590) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x544a003e, 0x6dcba5f6) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/$var{Test Name}-Unsupervised-output.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 1008 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000015a8, 0x000079ea) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 1360 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01165f9f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000017aa, 0x000055a7) + MDM + (0x918f6952, 0xb22ddf0d) + + + (0x6f752dd0, 0x082a321e) + Expected Label + + + (0x544a003e, 0x6dcba5f6) + Input Matrix + + + + + (0x6f752dd0, 0x082a321e) + Label + + + (0x544a003e, 0x6dcba5f6) + Distance + + + (0x544a003e, 0x6dcba5f6) + Probability + + + + + (0x330306dd, 0x74a95f98) + Filename to load classifier model + ${Player_ScenarioDirectory}/input-classifier.xml + ${Player_ScenarioDirectory}/$var{Test Name}-Model-MDM-input.xml + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/output-classifier.xml + + false + + + (0x5261636b, 0x41646170) + Adaptation + No + $var{Adaptation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb85fcd48, 0x1d5e5748) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000017aa, 0x000055a8) + MDM Rebias + (0x918f6952, 0xb22ddf0d) + + + (0x6f752dd0, 0x082a321e) + Expected Label + + + (0x544a003e, 0x6dcba5f6) + Input Matrix + + + + + (0x6f752dd0, 0x082a321e) + Label + + + (0x544a003e, 0x6dcba5f6) + Distance + + + (0x544a003e, 0x6dcba5f6) + Probability + + + + + (0x330306dd, 0x74a95f98) + Filename to load classifier model + ${Player_ScenarioDirectory}/input-classifier.xml + ${Player_ScenarioDirectory}/$var{Test Name}-Model-MDM-Rebias-input.xml + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/output-classifier.xml + + false + + + (0x5261636b, 0x41646170) + Adaptation + No + $var{Adaptation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0xb85fcd48, 0x1d5e5748) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000017aa, 0x000055aa) + FgMDM RT + (0x918f6952, 0xb22ddf0d) + + + (0x6f752dd0, 0x082a321e) + Expected Label + + + (0x544a003e, 0x6dcba5f6) + Input Matrix + + + + + (0x6f752dd0, 0x082a321e) + Label + + + (0x544a003e, 0x6dcba5f6) + Distance + + + (0x544a003e, 0x6dcba5f6) + Probability + + + + + (0x330306dd, 0x74a95f98) + Filename to load classifier model + ${Player_ScenarioDirectory}/input-classifier.xml + ${Player_ScenarioDirectory}/$var{Test Name}-Model-FgMDM-RT-input.xml + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/output-classifier.xml + + false + + + (0x5261636b, 0x41646170) + Adaptation + No + $var{Adaptation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 1104 + + + (0x4e7b798a, 0x183beafb) + (0xb85fcd48, 0x1d5e5748) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000017aa, 0x000055ab) + FgMDM RT Rebias + (0x918f6952, 0xb22ddf0d) + + + (0x6f752dd0, 0x082a321e) + Expected Label + + + (0x544a003e, 0x6dcba5f6) + Input Matrix + + + + + (0x6f752dd0, 0x082a321e) + Label + + + (0x544a003e, 0x6dcba5f6) + Distance + + + (0x544a003e, 0x6dcba5f6) + Probability + + + + + (0x330306dd, 0x74a95f98) + Filename to load classifier model + ${Player_ScenarioDirectory}/input-classifier.xml + ${Player_ScenarioDirectory}/$var{Test Name}-Model-FgMDM-RT-Rebias-input.xml + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/output-classifier.xml + + false + + + (0x5261636b, 0x41646170) + Adaptation + No + $var{Adaptation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 1232 + + + (0x4e7b798a, 0x183beafb) + (0xb85fcd48, 0x1d5e5748) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000484f, 0x00003eff) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x544a003e, 0x6dcba5f6) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00004ce5, 0x000064bd) + Streamed matrix multiplexer + (0x7a12298b, 0x785f4d42) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + (0x544a003e, 0x6dcba5f6) + Input stream 4 + + + (0x544a003e, 0x6dcba5f6) + Input stream 5 + + + (0x006a35a0, 0x65916db0) + (0x544a003e, 0x6dcba5f6) + Input stream 6 + + + (0x0031c56e, 0x644d35a2) + (0x544a003e, 0x6dcba5f6) + Input stream 7 + + + (0x0000d2b2, 0xc9cd7cfa) + (0x544a003e, 0x6dcba5f6) + Input stream 8 + + + + + (0x544a003e, 0x6dcba5f6) + Multiplexed streamed matrix + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x4badfdff, 0xc35004a3) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005b5f, 0x000050b0) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 1360 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017178bd) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007ab6, 0x0000228c) + Stimulation multiplexer + (0x07db4efa, 0x472b0938) + + + (0x6f752dd0, 0x082a321e) + Input stimulations 1 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 2 + + + (0x006b5500, 0xd1f46388) + (0x6f752dd0, 0x082a321e) + Input stimulations 3 + + + (0x005f3f93, 0xfff7f352) + (0x6f752dd0, 0x082a321e) + Input stimulations 4 + + + + + (0x6f752dd0, 0x082a321e) + Multiplexed stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 1072 + + + (0x4e7b798a, 0x183beafb) + (0xe7af82cd, 0x14edb4d4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00000b3e, 0x000078a7) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x000015a8, 0x000079ea) + 0 + + + + (0x0000200d, 0x00003920) + + (0x00004ce5, 0x000064bd) + 0 + + + (0x0000024a, 0x00005590) + 0 + + + + (0x000022ba, 0x0000495e) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000017aa, 0x000055a7) + 1 + + + + (0x000025bc, 0x00006486) + + (0x000017aa, 0x000055aa) + 0 + + + (0x00007ab6, 0x0000228c) + (0x006b5500, 0xd1f46388) + + + + (0x0000273f, 0x00007634) + + (0x000017aa, 0x000055aa) + 1 + + + (0x00004ce5, 0x000064bd) + 4 + + + + (0x00002a79, 0x00007996) + + (0x0000484f, 0x00003eff) + 1 + + + (0x000017aa, 0x000055a7) + 0 + + + + (0x00002b68, 0x0000537c) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000017aa, 0x000055ab) + 1 + + + + (0x00003897, 0x00007b88) + + (0x000017aa, 0x000055ab) + 2 + + + (0x00004ce5, 0x000064bd) + (0x0000d2b2, 0xc9cd7cfa) + + + + (0x00004559, 0x00006460) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000017aa, 0x000055a8) + 1 + + + + (0x0000466b, 0x0000440c) + + (0x0000484f, 0x00003eff) + 1 + + + (0x000017aa, 0x000055ab) + 0 + + + + (0x00004e39, 0x0000279d) + + (0x000017aa, 0x000055a7) + 2 + + + (0x00004ce5, 0x000064bd) + 1 + + + + (0x00005069, 0x000073a6) + + (0x000017aa, 0x000055ab) + 1 + + + (0x00004ce5, 0x000064bd) + (0x0031c56e, 0x644d35a2) + + + + (0x0000509c, 0x00002f90) + + (0x000017aa, 0x000055a8) + 1 + + + (0x00004ce5, 0x000064bd) + 2 + + + + (0x000050a4, 0x00002784) + + (0x0000484f, 0x00003eff) + 1 + + + (0x000017aa, 0x000055aa) + 0 + + + + (0x000058ce, 0x00007859) + + (0x000017aa, 0x000055a7) + 0 + + + (0x00007ab6, 0x0000228c) + 0 + + + + (0x00005a81, 0x0000389f) + + (0x000017aa, 0x000055a8) + 0 + + + (0x00007ab6, 0x0000228c) + 1 + + + + (0x00005b22, 0x00000558) + + (0x000017aa, 0x000055a8) + 2 + + + (0x00004ce5, 0x000064bd) + 3 + + + + (0x00005e9d, 0x00000c90) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00005b5f, 0x000050b0) + 0 + + + + (0x000060e8, 0x00004d02) + + (0x00007ab6, 0x0000228c) + 0 + + + (0x0000024a, 0x00005590) + 1 + + + + (0x00006146, 0x000010b3) + + (0x0000484f, 0x00003eff) + 1 + + + (0x000017aa, 0x000055a8) + 0 + + + + (0x00006560, 0x00001021) + + (0x000017aa, 0x000055ab) + 0 + + + (0x00007ab6, 0x0000228c) + (0x005f3f93, 0xfff7f352) + + + + (0x00006f10, 0x000023bd) + + (0x000017aa, 0x000055aa) + 2 + + + (0x00004ce5, 0x000064bd) + (0x006a35a0, 0x65916db0) + + + + (0x000074bf, 0x00006c11) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000017aa, 0x000055aa) + 1 + + + + (0x00007b48, 0x00005980) + + (0x000017aa, 0x000055a7) + 1 + + + (0x00004ce5, 0x000064bd) + 0 + + + + + + (0x00000a76, 0x0000631f) + Output Format : +Trial 1 - MDM - Distance +Trial 1 - MDM - Probability +Trial 1 - MDM Rebias - Distance +Trial 1 - MDM Rebias - Probability +Trial 1 - FgMDM RT - Distance +Trial 1 - FgMDM RT - Probability +Trial 1 - FgMDM RT Rebias - Distance +Trial 1 - FgMDM RT Rebias - Probability +Trial 2 - MDM - Distance +Prediction MDM MDM Rebias FgMDM RT FgMDM RT Rebias +Trial 2 - MDM - Probability +Trial 2 - MDM Rebias - Distance +Trial 2 - MDM Rebias - Probability +Trial 2 - FgMDM RT - Distance +Trial 2 - FgMDM RT - Probability +Trial 2 - FgMDM RT Rebias - Distance +Trial 2 - FgMDM RT Rebias - Probability +Trial 3 - MDM - Distance +Prediction MDM MDM Rebias FgMDM RT Rebias +................ + + + (0x473d9a43, 0x97fc0a97) + 1584 + + + (0x7234b86b, 0x2b8651a5) + 480 + + + + + + + (0x000062ac, 0x00003721) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000041e, 0x000069b5)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004c5d, 0x000021d4)","index":0,"name":"Default tab","parentIdentifier":"(0x0000041e, 0x000069b5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000420e, 0x000074bb)","index":0,"name":"Empty","parentIdentifier":"(0x00004c5d, 0x000021d4)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-input.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-input.csv new file mode 100644 index 0000000..3ca1bda --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-input.csv @@ -0,0 +1,13 @@ +Time:3x3,End Time,1:,1:,1:,2:,2:,2:,3:,3:,3:,Event Id,Event Date,Event Duration +0.0,0.1,2.5849288,1.33543611,0.511092833,1.33543611,2.19748746,0.527579698,0.511092833,0.527579698,0.507583739,769,0.0,0.0 +0.5,0.6,1.99839975,-0.650968006,-0.150223386,-0.650968006,1.52895167,0.0688523853,-0.150223386,0.0688523853,0.652648582,769,0.5,0.0 +1.0,1.1,1.21758058,-0.00,0.013088361,-0.00,1.00554914,0.0104706888,0.013088361,0.0104706888,0.756870279,769,1.0,0.0 +1.5,1.6,2.57527815,-0.621023059,-0.153239456,-0.621023059,0.897709368,0.0564566417,-0.153239456,0.0564566417,0.317012482,769,1.5,0.0 +2.0,2.1,2.87232755,-0.786745664,-0.0991696216,-0.786745664,1.81451826,-0.0991696216,-0.0991696216,-0.0991696216,0.783154191,769,2.0,0.0 +2.5,2.6,1.64826027,-0.00963569008,0.0289070702,-0.00963569008,1.5880372,0.0770855206,0.0289070702,0.0770855206,1.17370253,769,2.5,0.0 +3.0,3.1,1.9742694,-0.149321794,0.108597668,-0.149321794,2.11906629,-0.081448251,0.108597668,-0.081448251,1.04666432,769,3.0,0.0 +4.0,4.1,1.06313148,0.315509839,0.0893944544,0.315509839,1.33131485,0.00,0.0893944544,0.00,0.705553667,769,4.0,0.0 +4.5,4.6,1.18724478,0.490413981,0.0959505616,0.490413981,2.21604802,0.111942322,0.0959505616,0.111942322,0.936707201,770,4.5,0.0 +5.0,5.1,1.86743369,0.055816941,0.074422588,0.055816941,2.70096668,-0.148845176,0.074422588,-0.148845176,1.49159963,770,5.0,0.0 +5.5,5.6,1.89536719,0.324938579,-0.160114662,0.324938579,2.27210757,0.20720721,-0.160114662,0.20720721,1.21252525,770,5.5,0.0 +6.0,6.1,1.60313579,0.00319114656,0.00,0.00319114656,1.6071931,-0.00136763424,0.00,-0.00136763424,1.59967111,770,6.0,0.0 diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-ref.csv new file mode 100644 index 0000000..3aa11de --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-ref.csv @@ -0,0 +1,97 @@ +Time:2,End Time,,,Event Id,Event Date,Event Duration +0.0,0.1,1.3146344607,1.4748541725,,, +0.0,0.1,0.5287184737,0.4712815263,,, +0.0,0.1,1.3146344607,1.4748541725,,, +0.0,0.1,0.5287184737,0.4712815263,,, +0.0,0.1,0.0266535092,0.7187078375,,, +0.0,0.1,0.9642408218,0.0357591782,,, +0.0,0.1,0.0266535092,0.7187078375,,, +0.0,0.1,0.9642408218,0.0357591782,,, +0.5,0.6,0.4643261138,1.0518176354,769:769:769:769,0.1:0.1:0.1:0.1,0.0:0.0:0.0:0.0 +0.5,0.6,0.6937453233,0.3062546767,,, +0.5,0.6,1.6956511871,1.8412868439,,, +0.5,0.6,0.5205878157,0.4794121843,,, +0.5,0.6,0.0963664980,0.7884208263,,, +0.5,0.6,0.8910851282,0.1089148718,,, +0.5,0.6,0.2405105372,0.4515437911,,, +0.5,0.6,0.6524687046,0.3475312954,,, +1.0,1.1,0.6014301665,0.8124450161,769:769:769:769,0.6:0.6:0.6:0.6,0.0:0.0:0.0:0.0 +1.0,1.1,0.5746228706,0.4253771294,,, +1.0,1.1,0.9850377743,0.8417488820,,, +1.0,1.1,0.4607811641,0.5392188359,,, +1.0,1.1,0.2717276214,0.4203267068,,, +1.0,1.1,0.6073608526,0.3926391474,,, +1.0,1.1,0.6134562392,0.0785980891,,, +1.0,1.1,0.1135721371,0.8864278629,,, +1.5,1.6,1.1028723354,1.8495487410,769:770:769:770,1.1:1.1:1.1:1.1,0.0:0.0:0.0:0.0 +1.5,1.6,0.6264515437,0.3735484563,,, +1.5,1.6,0.8931606340,1.5992808599,,, +1.5,1.6,0.6416523171,0.3583476829,,, +1.5,1.6,0.8684816718,1.5605360001,,, +1.5,1.6,0.6424555976,0.3575444024,,, +1.5,1.6,0.6258439703,1.3178982986,,, +1.5,1.6,0.6780211140,0.3219788860,,, +2.0,2.1,0.6261108933,1.0671543241,769:769:769:769,1.6:1.6:1.6:1.6,0.0:0.0:0.0:0.0 +2.0,2.1,0.6302345983,0.3697654017,,, +2.0,2.1,0.9998915882,0.9418856609,,, +2.0,2.1,0.4850637020,0.5149362980,,, +2.0,2.1,0.1399914271,0.8320457554,,, +2.0,2.1,0.8559814073,0.1440185927,,, +2.0,2.1,0.3279732492,0.3640810790,,, +2.0,2.1,0.5260874243,0.4739125757,,, +2.5,2.6,0.6119976041,0.3311470950,769:770:769:769,2.1:2.1:2.1:2.1,0.0:0.0:0.0:0.0 +2.5,2.6,0.3511095332,0.6488904668,,, +2.5,2.6,1.1374772823,0.4657549948,,, +2.5,2.6,0.2905099912,0.7094900088,,, +2.5,2.6,0.4486383802,0.2434159481,,, +2.5,2.6,0.3517295364,0.6482704636,,, +2.5,2.6,0.9045092334,0.2124549051,,, +2.5,2.6,0.1902074541,0.8097925459,,, +3.0,3.1,0.6352502437,0.4765003984,770:770:770:770,2.6:2.6:2.6:2.6,0.0:0.0:0.0:0.0 +3.0,3.1,0.4286036638,0.5713963362,,, +3.0,3.1,1.0115551361,0.4773963713,,, +3.0,3.1,0.3206258692,0.6793741308,,, +3.0,3.1,0.4111271045,0.2809272237,,, +3.0,3.1,0.4059323268,0.5940676732,,, +3.0,3.1,0.7658960980,0.0738417697,,, +3.0,3.1,0.0879343097,0.9120656903,,, +4.0,4.1,0.8453784458,0.7475471701,770:770:770:770,3.1:3.1:3.1:3.1,0.0:0.0:0.0:0.0 +4.0,4.1,0.4692919510,0.5307080490,,, +4.0,4.1,1.0616555036,0.6934266642,,, +4.0,4.1,0.3950964102,0.6049035898,,, +4.0,4.1,0.5949672922,0.0970870361,,, +4.0,4.1,0.1402881712,0.8597118288,,, +4.0,4.1,0.8823968030,0.1903424748,,, +4.0,4.1,0.1774359145,0.8225640855,,, +4.5,4.6,0.9510921853,0.4133214582,770:770:770:770,4.1:4.1:4.1:4.1,0.0:0.0:0.0:0.0 +4.5,4.6,0.3029297311,0.6970702689,,, +4.5,4.6,1.1703812211,0.4908732854,,, +4.5,4.6,0.2954834936,0.7045165064,,, +4.5,4.6,0.8758921425,0.1838378142,,, +4.5,4.6,0.1734760946,0.8265239054,,, +4.5,4.6,1.0874390582,0.3953847299,,, +4.5,4.6,0.2666430989,0.7333569011,,, +5.0,5.1,1.0673471203,0.5523447946,770:770:770:770,4.6:4.6:4.6:4.6,0.0:0.0:0.0:0.0 +5.0,5.1,0.3410184304,0.6589815696,,, +5.0,5.1,1.2646035568,0.7114824206,,, +5.0,5.1,0.3600462878,0.6399537122,,, +5.0,5.1,0.7632985592,0.0712442309,,, +5.0,5.1,0.0853691767,0.9146308233,,, +5.0,5.1,0.8854525534,0.1933982252,,, +5.0,5.1,0.1792631836,0.8207368164,,, +5.5,5.6,0.8565016826,0.3905536191,770:770:770:770,5.1:5.1:5.1:5.1,0.0:0.0:0.0:0.0 +5.5,5.6,0.3131806733,0.6868193267,,, +5.5,5.6,0.9583113737,0.4435190877,,, +5.5,5.6,0.3163856828,0.6836143172,,, +5.5,5.6,0.5942285596,0.0978257686,,, +5.5,5.6,0.1413556200,0.8586443800,,, +5.5,5.6,0.6575503577,0.0345039706,,, +5.5,5.6,0.0498573149,0.9501426851,,, +6.0,6.1,0.9215401748,0.4599537361,770:770:770:770,5.6:5.6:5.6:5.6,0.0:0.0:0.0:0.0 +6.0,6.1,0.3329393872,0.6670606128,,, +6.0,6.1,0.9791673177,0.5064862975,,, +6.0,6.1,0.3409181604,0.6590818396,,, +6.0,6.1,0.6318850879,0.0601692404,,, +6.0,6.1,0.0869429435,0.9130570565,,, +6.0,6.1,0.6607383164,0.0313160119,,, +6.0,6.1,0.0452507999,0.9547492001,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-test.xml new file mode 100644 index 0000000..3855cb9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Testing-test.xml @@ -0,0 +1,1044 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x002d042d, 0x0a17b655) + (0x79a9edeb, 0x245d83fc) + Test Name + Covariance-To-Feature + Matrix-Classifier-Testing + + + (0x00007354, 0xbcb4f088) + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_GDF_Left + OVTK_GDF_Left + + + (0x00661288, 0x24c82f34) + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_GDF_Right + OVTK_GDF_Right + + + (0x00662ac7, 0x49876455) + (0x5261636b, 0x41646170) + Adaptation + No + No + + + + + + + (0x0000024a, 0x00005590) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x544a003e, 0x6dcba5f6) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/$var{Test Name}-output.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 1040 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000015a8, 0x000079ea) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 1376 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01165f9f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000017aa, 0x000055a7) + MDM + (0x918f6952, 0xb22ddf0d) + + + (0x6f752dd0, 0x082a321e) + Expected Label + + + (0x544a003e, 0x6dcba5f6) + Input Matrix + + + + + (0x6f752dd0, 0x082a321e) + Label + + + (0x544a003e, 0x6dcba5f6) + Distance + + + (0x544a003e, 0x6dcba5f6) + Probability + + + + + (0x330306dd, 0x74a95f98) + Filename to load classifier model + ${Player_ScenarioDirectory}/input-classifier.xml + ${Player_ScenarioDirectory}/$var{Test Name}-Model-MDM-input.xml + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/output-classifier.xml + + false + + + (0x5261636b, 0x41646170) + Adaptation + No + $var{Adaptation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 816 + + + (0x4e7b798a, 0x183beafb) + (0xb85fcd48, 0x1d5e5748) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000017aa, 0x000055a8) + MDM Rebias + (0x918f6952, 0xb22ddf0d) + + + (0x6f752dd0, 0x082a321e) + Expected Label + + + (0x544a003e, 0x6dcba5f6) + Input Matrix + + + + + (0x6f752dd0, 0x082a321e) + Label + + + (0x544a003e, 0x6dcba5f6) + Distance + + + (0x544a003e, 0x6dcba5f6) + Probability + + + + + (0x330306dd, 0x74a95f98) + Filename to load classifier model + ${Player_ScenarioDirectory}/input-classifier.xml + ${Player_ScenarioDirectory}/$var{Test Name}-Model-MDM-Rebias-input.xml + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/output-classifier.xml + + false + + + (0x5261636b, 0x41646170) + Adaptation + No + $var{Adaptation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0xb85fcd48, 0x1d5e5748) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000017aa, 0x000055aa) + FgMDM RT + (0x918f6952, 0xb22ddf0d) + + + (0x6f752dd0, 0x082a321e) + Expected Label + + + (0x544a003e, 0x6dcba5f6) + Input Matrix + + + + + (0x6f752dd0, 0x082a321e) + Label + + + (0x544a003e, 0x6dcba5f6) + Distance + + + (0x544a003e, 0x6dcba5f6) + Probability + + + + + (0x330306dd, 0x74a95f98) + Filename to load classifier model + ${Player_ScenarioDirectory}/input-classifier.xml + ${Player_ScenarioDirectory}/$var{Test Name}-Model-FgMDM-RT-input.xml + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/output-classifier.xml + + false + + + (0x5261636b, 0x41646170) + Adaptation + No + $var{Adaptation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 1104 + + + (0x4e7b798a, 0x183beafb) + (0xb85fcd48, 0x1d5e5748) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000017aa, 0x000055ab) + FgMDM RT Rebias + (0x918f6952, 0xb22ddf0d) + + + (0x6f752dd0, 0x082a321e) + Expected Label + + + (0x544a003e, 0x6dcba5f6) + Input Matrix + + + + + (0x6f752dd0, 0x082a321e) + Label + + + (0x544a003e, 0x6dcba5f6) + Distance + + + (0x544a003e, 0x6dcba5f6) + Probability + + + + + (0x330306dd, 0x74a95f98) + Filename to load classifier model + ${Player_ScenarioDirectory}/input-classifier.xml + ${Player_ScenarioDirectory}/$var{Test Name}-Model-FgMDM-RT-Rebias-input.xml + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/output-classifier.xml + + false + + + (0x5261636b, 0x41646170) + Adaptation + No + $var{Adaptation} + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 1248 + + + (0x4e7b798a, 0x183beafb) + (0xb85fcd48, 0x1d5e5748) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000484f, 0x00003eff) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x544a003e, 0x6dcba5f6) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-input.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00004ce5, 0x000064bd) + Streamed matrix multiplexer + (0x7a12298b, 0x785f4d42) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + (0x544a003e, 0x6dcba5f6) + Input stream 4 + + + (0x544a003e, 0x6dcba5f6) + Input stream 5 + + + (0x006a35a0, 0x65916db0) + (0x544a003e, 0x6dcba5f6) + Input stream 6 + + + (0x002a358c, 0xd75a4f21) + (0x544a003e, 0x6dcba5f6) + Input stream 7 + + + (0x007bdd66, 0x3b409959) + (0x544a003e, 0x6dcba5f6) + Input stream 8 + + + + + (0x544a003e, 0x6dcba5f6) + Multiplexed streamed matrix + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 944 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x4badfdff, 0xc35004a3) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005b5f, 0x000050b0) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 1376 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017178bd) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007ab6, 0x0000228c) + Stimulation multiplexer + (0x07db4efa, 0x472b0938) + + + (0x6f752dd0, 0x082a321e) + Input stimulations 1 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 2 + + + (0x006b5500, 0xd1f46388) + (0x6f752dd0, 0x082a321e) + Input stimulations 3 + + + (0x0069de93, 0xc09a5685) + (0x6f752dd0, 0x082a321e) + Input stimulations 4 + + + + + (0x6f752dd0, 0x082a321e) + Multiplexed stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 1104 + + + (0x4e7b798a, 0x183beafb) + (0xe7af82cd, 0x14edb4d4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00000b3e, 0x000078a7) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x000015a8, 0x000079ea) + 0 + + + + (0x00001a38, 0x0000210e) + + (0x000017aa, 0x000055aa) + 1 + + + (0x00004ce5, 0x000064bd) + 4 + + + + (0x0000200d, 0x00003920) + + (0x00004ce5, 0x000064bd) + 0 + + + (0x0000024a, 0x00005590) + 0 + + + + (0x000022ba, 0x0000495e) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000017aa, 0x000055a7) + 1 + + + + (0x00002c5f, 0x000036fe) + + (0x000017aa, 0x000055aa) + 0 + + + (0x00007ab6, 0x0000228c) + (0x006b5500, 0xd1f46388) + + + + (0x00004559, 0x00006460) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000017aa, 0x000055a8) + 1 + + + + (0x00004e39, 0x0000279d) + + (0x000017aa, 0x000055a7) + 2 + + + (0x00004ce5, 0x000064bd) + 1 + + + + (0x0000509c, 0x00002f90) + + (0x000017aa, 0x000055a8) + 1 + + + (0x00004ce5, 0x000064bd) + 2 + + + + (0x000058ce, 0x00007859) + + (0x000017aa, 0x000055a7) + 0 + + + (0x00007ab6, 0x0000228c) + 0 + + + + (0x00005a81, 0x0000389f) + + (0x000017aa, 0x000055a8) + 0 + + + (0x00007ab6, 0x0000228c) + 1 + + + + (0x00005b22, 0x00000558) + + (0x000017aa, 0x000055a8) + 2 + + + (0x00004ce5, 0x000064bd) + 3 + + + + (0x00005e9d, 0x00000c90) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00005b5f, 0x000050b0) + 0 + + + + (0x000060e8, 0x00004d02) + + (0x00007ab6, 0x0000228c) + 0 + + + (0x0000024a, 0x00005590) + 1 + + + + (0x00006638, 0x000007c2) + + (0x000017aa, 0x000055aa) + 2 + + + (0x00004ce5, 0x000064bd) + (0x006a35a0, 0x65916db0) + + + + (0x00006e66, 0x000035f0) + + (0x000017aa, 0x000055ab) + 1 + + + (0x00004ce5, 0x000064bd) + (0x002a358c, 0xd75a4f21) + + + + (0x000072bd, 0x00004f3d) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000017aa, 0x000055ab) + 1 + + + + (0x000074bf, 0x00006c11) + + (0x0000484f, 0x00003eff) + 0 + + + (0x000017aa, 0x000055aa) + 1 + + + + (0x000076d5, 0x00005831) + + (0x000017aa, 0x000055ab) + 2 + + + (0x00004ce5, 0x000064bd) + (0x007bdd66, 0x3b409959) + + + + (0x00007b48, 0x00005980) + + (0x000017aa, 0x000055a7) + 1 + + + (0x00004ce5, 0x000064bd) + 0 + + + + (0x00007e42, 0x00000faf) + + (0x000017aa, 0x000055ab) + 0 + + + (0x00007ab6, 0x0000228c) + (0x0069de93, 0xc09a5685) + + + + + + (0x00000a76, 0x0000631f) + Output Format : +Trial 1 - MDM - Distance +Trial 1 - MDM - Probability +Trial 1 - MDM Rebias - Distance +Trial 1 - MDM Rebias - Probability +Trial 1 - FgMDM RT - Distance +Trial 1 - FgMDM RT - Probability +Trial 1 - FgMDM RT Rebias - Distance +Trial 1 - FgMDM RT Rebias - Probability +Trial 2 - MDM - Distance +Prediction MDM MDM Rebias FgMDM RT FgMDM RT Rebias +Trial 2 - MDM - Probability +Trial 2 - MDM Rebias - Distance +Trial 2 - MDM Rebias - Probability +Trial 2 - FgMDM RT - Distance +Trial 2 - FgMDM RT - Probability +Trial 2 - FgMDM RT Rebias - Distance +Trial 2 - FgMDM RT Rebias - Probability +Trial 3 - MDM - Distance +Prediction MDM MDM Rebias FgMDM RT Rebias +................ + + + (0x473d9a43, 0x97fc0a97) + 1568 + + + (0x7234b86b, 0x2b8651a5) + 416 + + + + + + + (0x000062ac, 0x00003721) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000041e, 0x000069b5)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004c5d, 0x000021d4)","index":0,"name":"Default tab","parentIdentifier":"(0x0000041e, 0x000069b5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000420e, 0x000074bb)","index":0,"name":"Empty","parentIdentifier":"(0x00004c5d, 0x000021d4)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Training-inputA.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Training-inputA.csv new file mode 100644 index 0000000..35867f5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Training-inputA.csv @@ -0,0 +1,8 @@ +Time:3x3,End Time,1:,1:,1:,2:,2:,2:,3:,3:,3:,Event Id,Event Date,Event Duration +0.0,0.1,2.5849288,1.33543611,0.511092833,1.33543611,2.19748746,0.527579698,0.511092833,0.527579698,0.507583739,,, +0.5,0.6,1.99839975,-0.650968006,-0.150223386,-0.650968006,1.52895167,0.0688523853,-0.150223386,0.0688523853,0.652648582,,, +1.0,1.1,1.21758058,-0.00,0.013088361,-0.00,1.00554914,0.0104706888,0.013088361,0.0104706888,0.756870279,,, +1.5,1.6,2.57527815,-0.621023059,-0.153239456,-0.621023059,0.897709368,0.0564566417,-0.153239456,0.0564566417,0.317012482,,, +2.0,2.1,2.87232755,-0.786745664,-0.0991696216,-0.786745664,1.81451826,-0.0991696216,-0.0991696216,-0.0991696216,0.783154191,,, +2.5,2.6,1.64826027,-0.00963569008,0.0289070702,-0.00963569008,1.5880372,0.0770855206,0.0289070702,0.0770855206,1.17370253,,, +3.0,3.1,1.9742694,-0.149321794,0.108597668,-0.149321794,2.11906629,-0.081448251,0.108597668,-0.081448251,1.04666432,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Training-inputB.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Training-inputB.csv new file mode 100644 index 0000000..61fd847 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Training-inputB.csv @@ -0,0 +1,6 @@ +Time:3x3,End Time,1:,1:,1:,2:,2:,2:,3:,3:,3:,Event Id,Event Date,Event Duration +0.0,0.1,1.06313148,0.315509839,0.0893944544,0.315509839,1.33131485,0.00,0.0893944544,0.00,0.705553667,,, +0.5,0.6,1.18724478,0.490413981,0.0959505616,0.490413981,2.21604802,0.111942322,0.0959505616,0.111942322,0.936707201,,, +1.0,1.1,1.86743369,0.055816941,0.074422588,0.055816941,2.70096668,-0.148845176,0.074422588,-0.148845176,1.49159963,,, +1.5,1.6,1.89536719,0.324938579,-0.160114662,0.324938579,2.27210757,0.20720721,-0.160114662,0.20720721,1.21252525,,, +2.0,2.1,1.60313579,0.00319114656,0.00,0.00319114656,1.6071931,-0.00136763424,0.00,-0.00136763424,1.59967111,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Training-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Training-test.xml new file mode 100644 index 0000000..1cf8c0e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Matrix-Classifier-Training-test.xml @@ -0,0 +1,1044 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x002d042d, 0x0a17b655) + (0x79a9edeb, 0x245d83fc) + Test Name + Covariance-To-Feature + Matrix-Classifier-Training + + + (0x00007354, 0xbcb4f088) + (0x2c132d6e, 0x44ab0d97) + Stimulation Class 1 + OVTK_GDF_Left + OVTK_GDF_Left + + + (0x00661288, 0x24c82f34) + (0x2c132d6e, 0x44ab0d97) + Stimulation Class 2 + OVTK_GDF_Right + OVTK_GDF_Right + + + (0x00247680, 0x10742db8) + (0x2c132d6e, 0x44ab0d97) + Train Stimulation + OVTK_StimulationId_EndOfFile + OVTK_StimulationId_Train + + + + + + + (0x000028d4, 0x0000144a) + MDM + (0xc0b79b42, 0x4150c837) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 1 + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Tran-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + $var{Train Stimulation} + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/my-classifier.xml + ${Player_ScenarioDirectory}/$var{Test Name}-Model-MDM-output.xml + false + + + (0x5261636b, 0x436c6173) + Method + Minimum Distance to Mean (MDM) + Minimum Distance to Mean (MDM) + false + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Riemann + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + $var{Stimulation Class 1} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + $var{Stimulation Class 2} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 880 + + + (0x4e7b798a, 0x183beafb) + (0xbe345a8a, 0x87754e57) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000028d4, 0x0000144b) + MDM Rebias + (0xc0b79b42, 0x4150c837) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 1 + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Tran-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + $var{Train Stimulation} + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/my-classifier.xml + ${Player_ScenarioDirectory}/$var{Test Name}-Model-MDM-Rebias-output.xml + false + + + (0x5261636b, 0x436c6173) + Method + Minimum Distance to Mean (MDM) + Minimum Distance to Mean (MDM) + false + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Riemann + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + $var{Stimulation Class 1} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + $var{Stimulation Class 2} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 1008 + + + (0x4e7b798a, 0x183beafb) + (0xbe345a8a, 0x87754e57) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000028d4, 0x0000144c) + FgMDM RT + (0xc0b79b42, 0x4150c837) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 1 + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Tran-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + $var{Train Stimulation} + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/my-classifier.xml + ${Player_ScenarioDirectory}/$var{Test Name}-Model-FgMDM-RT-output.xml + false + + + (0x5261636b, 0x436c6173) + Method + Minimum Distance to Mean (MDM) + Minimum Distance to Mean with geodesic filtering (FgMDM) (Real Time adaptation assumed) + false + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Riemann + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + $var{Stimulation Class 1} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + $var{Stimulation Class 2} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 1136 + + + (0x4e7b798a, 0x183beafb) + (0xbe345a8a, 0x87754e57) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000028d4, 0x0000144d) + FgMDM RT + (0xc0b79b42, 0x4150c837) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 1 + + + (0x544a003e, 0x6dcba5f6) + Matrix for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Tran-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + $var{Train Stimulation} + false + + + (0x330306dd, 0x74a95f98) + Filename to save classifier model + ${Player_ScenarioDirectory}/my-classifier.xml + ${Player_ScenarioDirectory}/$var{Test Name}-Model-FgMDM-RT-Rebias-output.xml + false + + + (0x5261636b, 0x436c6173) + Method + Minimum Distance to Mean (MDM) + Minimum Distance to Mean with geodesic filtering Rebias (FgMDM Rebias) (Real Time adaptation assumed) + false + + + (0x5261636b, 0x4d455452) + Metric + Riemann + Riemann + false + + + (0xa88b3667, 0x0871638c) + Log Level + Information + None + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + $var{Stimulation Class 1} + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + $var{Stimulation Class 2} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 1264 + + + (0x4e7b798a, 0x183beafb) + (0xbe345a8a, 0x87754e57) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000484f, 0x00003eff) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x544a003e, 0x6dcba5f6) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-inputA.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x0000484f, 0x00003f00) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x544a003e, 0x6dcba5f6) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/$var{Test Name}-inputB.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 1072 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005b5f, 0x000050b0) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + $var{Train Stimulation} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 976 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017178bd) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005b5f, 0x000050b1) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 6 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017178bd) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005d4f, 0x00006de2) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007e8b, 0x00000ab7) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x001a7a65, 0x69c5420d) + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x004e1115, 0xaa2b1541) + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x005cfb9f, 0xf5a4c609) + (0x544a003e, 0x6dcba5f6) + Output stream 2 + + + (0x0048f877, 0x2f3bb87d) + (0x544a003e, 0x6dcba5f6) + Output stream 3 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 1072 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00001201, 0x00001753) + + (0x00007e8b, 0x00000ab7) + (0x005cfb9f, 0xf5a4c609) + + + (0x000028d4, 0x0000144a) + 1 + + + + (0x00001d64, 0x000048eb) + + (0x0000484f, 0x00003f00) + 0 + + + (0x00007e8b, 0x00000ab7) + (0x004e1115, 0xaa2b1541) + + + + (0x00002c82, 0x000023c6) + + (0x00007e8b, 0x00000ab7) + (0x0048f877, 0x2f3bb87d) + + + (0x000028d4, 0x0000144a) + 2 + + + + (0x00002d30, 0x0000676e) + + (0x00007e8b, 0x00000ab7) + (0x0048f877, 0x2f3bb87d) + + + (0x000028d4, 0x0000144b) + 2 + + + + (0x0000337c, 0x00006120) + + (0x00005b5f, 0x000050b1) + 0 + + + (0x00005d4f, 0x00006de2) + 0 + + + + (0x00003e86, 0x000033df) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00005b5f, 0x000050b1) + 0 + + + + (0x00003ec9, 0x00006ad4) + + (0x00007e8b, 0x00000ab7) + (0x0048f877, 0x2f3bb87d) + + + (0x000028d4, 0x0000144d) + 2 + + + + (0x00005578, 0x000024a8) + + (0x00007e8b, 0x00000ab7) + 0 + + + (0x000028d4, 0x0000144a) + 0 + + + + (0x00005c55, 0x000029cf) + + (0x00007e8b, 0x00000ab7) + (0x005cfb9f, 0xf5a4c609) + + + (0x000028d4, 0x0000144d) + 1 + + + + (0x00005e77, 0x00001e18) + + (0x00007e8b, 0x00000ab7) + (0x005cfb9f, 0xf5a4c609) + + + (0x000028d4, 0x0000144b) + 1 + + + + (0x00005e9d, 0x00000c90) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00005b5f, 0x000050b0) + 0 + + + + (0x0000619c, 0x00007407) + + (0x00007e8b, 0x00000ab7) + 0 + + + (0x000028d4, 0x0000144b) + 0 + + + + (0x000065df, 0x00007916) + + (0x00005b5f, 0x000050b0) + 0 + + + (0x00007e8b, 0x00000ab7) + 0 + + + + (0x0000661a, 0x00004d72) + + (0x00007e8b, 0x00000ab7) + (0x0048f877, 0x2f3bb87d) + + + (0x000028d4, 0x0000144c) + 2 + + + + (0x0000688d, 0x00002b01) + + (0x00007e8b, 0x00000ab7) + 0 + + + (0x000028d4, 0x0000144d) + 0 + + + + (0x00006b59, 0x00003fcc) + + (0x0000484f, 0x00003eff) + 0 + + + (0x00007e8b, 0x00000ab7) + (0x001a7a65, 0x69c5420d) + + + + (0x000076a0, 0x00003e44) + + (0x00007e8b, 0x00000ab7) + 0 + + + (0x000028d4, 0x0000144c) + 0 + + + + (0x00007b67, 0x00000d36) + + (0x00007e8b, 0x00000ab7) + (0x005cfb9f, 0xf5a4c609) + + + (0x000028d4, 0x0000144c) + 1 + + + + + + (0x00006856, 0x000017a7) + Wait 5s after Begin Train Compute + + + (0x473d9a43, 0x97fc0a97) + 768 + + + (0x7234b86b, 0x2b8651a5) + 240 + + + + + + + (0x000062ac, 0x00003721) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000041e, 0x000069b5)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004c5d, 0x000021d4)","index":0,"name":"Default tab","parentIdentifier":"(0x0000041e, 0x000069b5)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000420e, 0x000074bb)","index":0,"name":"Empty","parentIdentifier":"(0x00004c5d, 0x000021d4)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Mean-ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Mean-ref.csv new file mode 100644 index 0000000..7e9cc2f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/riemannian/test/scenarios-tests/Mean-ref.csv @@ -0,0 +1,2 @@ +Time:3x3,End Time,1:,1:,1:,2:,2:,2:,3:,3:,3:,Event Id,Event Date,Event Duration +0.0000000000,0.0000000000, 1.70952664, 0.01674082, 0.02077766, 0.01674082, 1.60344581, 0.05423902, 0.02077766, 0.05423902, 0.8303257,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/CMakeLists.txt new file mode 100755 index 0000000..e523239 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/CMakeLists.txt @@ -0,0 +1,50 @@ +PROJECT(openvibe-plugins-signal-processing) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES} + "../../../contrib/packages/wavelet2d/wavelet2s.cpp" + "../../../contrib/packages/wavelet2d/wavelet2s.h") +target_include_directories(${PROJECT_NAME} + PRIVATE + src + src/algorithms/connectivity + src/algorithms/basic) + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +INCLUDE_DIRECTORIES("../../../contrib/packages/wavelet2d") + +ADD_DEFINITIONS(-D_USE_MATH_DEFINES) +# --------------------------------- + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyEigen") +INCLUDE("FindThirdPartyFFTW3") # used by the wavelet library +INCLUDE("FindThirdPartyITPP") # note that itpp gives the fftw3 on Win + +IF(OV_COMPILE_TESTS) + ADD_SUBDIRECTORY("test") +ENDIF(OV_COMPILE_TESTS) + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY signals/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/signals) +INSTALL(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials) + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/channel-selector.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/channel-selector.xml new file mode 100644 index 0000000..97412ce --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/channel-selector.xml @@ -0,0 +1,600 @@ + + 1 + openvibe + 2.0 + + + (0x00000503, 0x00001d65) + 1;4 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + 1;4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 336.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 106 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000ba1, 0x00004ae1) + Before + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 224.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000576e, 0x00000a4e) + Sinus oscillator + (0x7e33bdb8, 0x68194a4a) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xad100179, 0xa3c984ab) + 121 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00ac4ab1) + + + + + (0x00006298, 0x000025dc) + After + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256.000000 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 304.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + + + (0x00000924, 0x00001d39) + + (0x0000576e, 0x00000a4e) + 0 + + + (0x00000ba1, 0x00004ae1) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 51 + + + (0x358ae8b5, 0x0f8bacd1) + 304 + + + (0x3f0a3b27, 0x570913d2) + 130 + + + (0x6267b5c5, 0x676e3e42) + 209 + + + + + (0x00003d0f, 0x000056cd) + + (0x00000503, 0x00001d65) + 0 + + + (0x00006298, 0x000025dc) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 192 + + + (0x358ae8b5, 0x0f8bacd1) + 336 + + + (0x3f0a3b27, 0x570913d2) + 226 + + + (0x6267b5c5, 0x676e3e42) + 289 + + + + + (0x00007953, 0x00007c5f) + + (0x0000576e, 0x00000a4e) + 0 + + + (0x00000503, 0x00001d65) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 51 + + + (0x358ae8b5, 0x0f8bacd1) + 304 + + + (0x3f0a3b27, 0x570913d2) + 130 + + + (0x6267b5c5, 0x676e3e42) + 336 + + + + + + + (0x00002f95, 0x0000072c) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 464 + + + (0x7234b86b, 0x2b8651a5) + 352 + + + + + (0x0000479b, 0x00005f64) + Finally, the right <i>Signal Display</i> box +displays the 2 selected channels + + + (0x473d9a43, 0x97fc0a97) + 576 + + + (0x7234b86b, 0x2b8651a5) + 272 + + + + + (0x000047d8, 0x00000b37) + The <i><b>Channel Selector</b></i> box takes only +the <b>first</b> and <b>fourth</b> channels +<small>(channel names are 0 indexed)</small> + + + (0x473d9a43, 0x97fc0a97) + 576 + + + (0x7234b86b, 0x2b8651a5) + 192 + + + + + (0x00004fd2, 0x00003b1e) + Those 4 channels are displayed with the left +<i>Signal Display</i> box + + + (0x473d9a43, 0x97fc0a97) + 576 + + + (0x7234b86b, 0x2b8651a5) + 112 + + + + + (0x000057a6, 0x00006a3d) + The <i>Sinus Oscillator</i> box generates +a 4 channels sinusoidal signal + + + (0x473d9a43, 0x97fc0a97) + 576 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":678,"identifier":"(0x0000037f, 0x000006dc)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":794},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003ddc, 0x00006202)","index":0,"name":"Default tab","parentIdentifier":"(0x0000037f, 0x000006dc)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":314,"identifier":"(0x000019f0, 0x0000358d)","index":0,"maxDividerPosition":633,"name":"Vertical split","parentIdentifier":"(0x00003ddc, 0x00006202)","type":4},{"boxIdentifier":"(0x00000ba1, 0x00004ae1)","childCount":0,"identifier":"(0x0000654d, 0x000076f4)","index":0,"parentIdentifier":"(0x000019f0, 0x0000358d)","type":3},{"boxIdentifier":"(0x00006298, 0x000025dc)","childCount":0,"identifier":"(0x00000303, 0x00002727)","index":1,"parentIdentifier":"(0x000019f0, 0x0000358d)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Channel Selector tutorial + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/connectivity_measure.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/connectivity_measure.xml new file mode 100644 index 0000000..2d3de7a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/connectivity_measure.xml @@ -0,0 +1,1550 @@ + + 2 + OpenViBE Designer + 3.0.0 + + + + + + (0x00002300, 0x000013a5) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x000026a6, 0x0000736b) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + 1 + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0x88a4a7f6, 0x4180bdb0) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x0000332b, 0x0000046f) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 144 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000448f, 0x00007aae) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0x6277ce58, 0x84e30a1f) + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(16*2*M_PI*x) + 5*(b - 0.5) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000448f, 0x00007aaf) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0x74365c40, 0xdf0434ef) + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(16*2*M_PI*x) + sin(64*2*M_PI*x) + 5*(b - 0.5) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000448f, 0x00007ab0) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0xdce72c2e, 0xb9fccfb1) + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(64*2*M_PI*x + M_PI/2)+ 5*(b - 0.5) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000448f, 0x00007ab1) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0xff63cf67, 0xc1afc0da) + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(16*2*M_PI*x+ M_PI/2) + sin(64*2*M_PI*x) + 5*(b - 0.5) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 464 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005660, 0x000059ae) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + (0x03332954, 0x4825a4e6) + (0x5ba36127, 0x195feae1) + Input 3 + + + (0x7adc66d1, 0xb097734e) + (0x5ba36127, 0x195feae1) + Input 4 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000595e, 0x00004991) + 1 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + 1 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 64 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000595e, 0x00004992) + 2 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + 2 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 176 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000595e, 0x00004993) + 3 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + 3 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000595e, 0x00004994) + 4 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + 4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x1b628c9e, 0x72258cad) + 16Hz Coherence + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 880 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x1b628c9e, 0x72258cae) + 64Hz Coherence + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 880 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x3160162d, 0x6d81482d) + Connectivity Measure + (0x994a9a45, 0x4181a048) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x544a003e, 0x6dcba5f6) + Connectivity Matrix + + + + + (0x9188339d, 0x5da83a84) + Metric + Coherence + MagnitudeSquaredCoherence + false + + + (0x8815bfa7, 0x557b102f) + Window method + Hamming + Hann + false + + + (0x512a166f, 0x5c3ef83f) + Window Length (in sec) + 0.25 + 0.25 + false + + + (0x007deef9, 0x2f3e95c6) + Window Overlap (in %) + 50 + 50 + false + + + (0x512a166f, 0x5c3ef83f) + Connectivity Measure Length (in sec) + 0.5 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Connectivity Measure Overlap (in %) + 50 + 50 + false + + + (0x007deef9, 0x2f3e95c6) + FFT size (frequency taps) + 128 + 256 + false + + + (0x2cdb2f0b, 0x12f231ea) + DC removal + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0x2a2d9878, 0x55d5b75e) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 8 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4bb0943b, 0x730111dc) + Matrix 3D to 2D + (0x3ab2b81e, 0x73ef01a5) + + + (0x544a003e, 0x6dcba5f6) + input + + + + + (0x544a003e, 0x6dcba5f6) + output + + + + + (0x007deef9, 0x2f3e95c6) + Dimension to remove + + 0 + false + + + (0x007deef9, 0x2f3e95c6) + Index in removed dimension + + 8 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0xabffc2cc, 0x29ab6ab2) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x4bb0943b, 0x730111dd) + Matrix 3D to 2D + (0x3ab2b81e, 0x73ef01a5) + + + (0x544a003e, 0x6dcba5f6) + input + + + + + (0x544a003e, 0x6dcba5f6) + output + + + + + (0x007deef9, 0x2f3e95c6) + Dimension to remove + + 0 + false + + + (0x007deef9, 0x2f3e95c6) + Index in removed dimension + + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x4e7b798a, 0x183beafb) + (0xabffc2cc, 0x29ab6ab2) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000006a0, 0x00007abe) + + (0x0000595e, 0x00004993) + 0 + + + (0x0000448f, 0x00007ab0) + (0xdce72c2e, 0xb9fccfb1) + + + + (0x00000c63, 0x000002e9) + + (0x0000595e, 0x00004992) + 0 + + + (0x0000448f, 0x00007aaf) + (0x74365c40, 0xdf0434ef) + + + + (0x0000300e, 0x00007fd0) + + (0x000026a6, 0x0000736b) + 0 + + + (0x0000595e, 0x00004992) + 0 + + + + (0x000034ab, 0x00007f9d) + + (0x0000448f, 0x00007aaf) + 0 + + + (0x00005660, 0x000059ae) + 1 + + + + (0x000038a8, 0x0000125d) + + (0x000026a6, 0x0000736b) + 0 + + + (0x0000595e, 0x00004993) + 0 + + + + (0x00003ccf, 0x00004a3e) + + (0x0000448f, 0x00007aae) + 0 + + + (0x00005660, 0x000059ae) + 0 + + + + (0x000040af, 0x00007932) + + (0x00002300, 0x000013a5) + 0 + + + (0x0000448f, 0x00007ab0) + 0 + + + + (0x00004122, 0x000050b4) + + (0x00002300, 0x000013a5) + 0 + + + (0x0000448f, 0x00007ab1) + 0 + + + + (0x000042cb, 0x00001424) + + (0x000026a6, 0x0000736b) + 0 + + + (0x0000595e, 0x00004991) + 0 + + + + (0x0000456c, 0x000040a2) + + (0x0000448f, 0x00007ab1) + 0 + + + (0x00005660, 0x000059ae) + (0x7adc66d1, 0xb097734e) + + + + (0x000045b5, 0x00000573) + + (0x0000595e, 0x00004994) + 0 + + + (0x0000448f, 0x00007ab1) + (0xff63cf67, 0xc1afc0da) + + + + (0x00004fd5, 0x00000c5a) + + (0x0000448f, 0x00007ab0) + 0 + + + (0x00005660, 0x000059ae) + (0x03332954, 0x4825a4e6) + + + + (0x00006bb7, 0x000013dd) + + (0x000026a6, 0x0000736b) + 0 + + + (0x0000595e, 0x00004994) + 0 + + + + (0x00006d31, 0x000028c6) + + (0x0000595e, 0x00004991) + 0 + + + (0x0000448f, 0x00007aae) + (0x6277ce58, 0x84e30a1f) + + + + (0x00006ddd, 0x000045c4) + + (0x00005660, 0x000059ae) + 0 + + + (0x0000332b, 0x0000046f) + 0 + + + + (0x00007110, 0x00007613) + + (0x00002300, 0x000013a5) + 0 + + + (0x0000448f, 0x00007aae) + 0 + + + + (0x00007b2b, 0x000067d2) + + (0x00002300, 0x000013a5) + 0 + + + (0x0000448f, 0x00007aaf) + 0 + + + + (0x069d43d7, 0x6ab13aa9) + + (0x3160162d, 0x6d81482d) + 0 + + + (0x4bb0943b, 0x730111dd) + 0 + + + + (0x4484f757, 0x42df7e21) + + (0x3160162d, 0x6d81482d) + 0 + + + (0x4bb0943b, 0x730111dc) + 0 + + + + (0x4c6f7b11, 0x1a138f8d) + + (0x4bb0943b, 0x730111dc) + 0 + + + (0x1b628c9e, 0x72258cad) + 0 + + + + (0x4c6f7b11, 0x1a138f8e) + + (0x4bb0943b, 0x730111dd) + 0 + + + (0x1b628c9e, 0x72258cae) + 0 + + + + (0x5db8719e, 0x129e62c7) + + (0x00005660, 0x000059ae) + 0 + + + (0x3160162d, 0x6d81482d) + 0 + + + + + + (0x644a4181, 0x7ccbe6c5) + <b><u>Signal generation:</u></b> + +4 signals composed of 16Hz and 64Hz sin waves, and noise. + + + (0x473d9a43, 0x97fc0a97) + 768 + + + (0x7234b86b, 0x2b8651a5) + 288 + + + + + (0x644a4181, 0x7ccbe6c6) + <b><u>Noise generation:</u></b> + +Generating 4 different noise channels + + + (0x473d9a43, 0x97fc0a97) + 640 + + + (0x7234b86b, 0x2b8651a5) + 96 + + + + + (0x644a4181, 0x7ccbe6c7) + <b><u>Extract coherence matrix:</u></b> + +3D Matrix is of size freq_taps * n_channels * n_channels. + +Frequency index steps = Sampling freq. (from time signal box) / frequency taps (from connectivity box) + +In our exemple : 512 / 256 = 2. + +So, in order to get the coherence matrix at 16Hz, we need to access index 8 of the freq dimension of the 3D matrix, and the matrix at 64Hz is at index 32. + + + (0x473d9a43, 0x97fc0a97) + 960 + + + (0x7234b86b, 0x2b8651a5) + 688 + + + + + (0x644a4181, 0x7ccbe6c8) + <u><b>Visual result:</b></u> + +Depending on the connectivity method, the results will be different. However, they will be on 16Hz and 64Hz as per our signals. + +<u>For exemple</u> +<b>MSQ:</b> +Strong coherence between channels 1/2/4 on 16Hz +Strong coherence between channels 2/3/4 on 64Hz + +<b>AbsImaginaryCoherence:</b> +Strong coherence between channels 1/4 and 2/4 on 16Hz +Strong coherence between channels 2/3 and 3/4 on 64Hz + + + (0x473d9a43, 0x97fc0a97) + 912 + + + (0x7234b86b, 0x2b8651a5) + 896 + + + + + + + (0x00005e71, 0x00005111) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x0000332b, 0x0000046f)","childCount":0,"identifier":"(0x0000214e, 0x00005d65)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00002738, 0x00004a78)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":475},{"boxIdentifier":"(0x1b628c9e, 0x72258cae)","childCount":0,"identifier":"(0x05b15ea9, 0x1d5b9be3)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0x1b628c9e, 0x72258cad)","childCount":0,"identifier":"(0x2027a13b, 0x4529ff17)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000064a6, 0x00005f01)","index":0,"name":"Default tab","parentIdentifier":"(0x00002738, 0x00004a78)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x4bc18299, 0x3651298b)","index":0,"name":"Empty","parentIdentifier":"(0x000064a6, 0x00005f01)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/crop.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/crop.xml new file mode 100644 index 0000000..0335b9c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/crop.xml @@ -0,0 +1,509 @@ + + 1 + openvibe + 2.0 + + + (0x0000376d, 0x000001ee) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336.000000 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 304.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 113 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x5bdd9691, 0x130584b9) + Crop + (0x7f1a3002, 0x358117ba) + + + (0x5ba36127, 0x195feae1) + Input matrix + + + + + (0x5ba36127, 0x195feae1) + Output matrix + + + + + (0xd0643f9e, 0x8e35fe0a) + Crop method + Min + Min/Max + false + + + (0x512a166f, 0x5c3ef83f) + Min crop value + -1 + -3.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Max crop value + 1 + 3.000000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x1b151919, 0x63b9f9c9) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 67 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005c9c00) + + + + + (0x5e2124c7, 0x1bda2228) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + 4 * cos(X) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 95 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x791a5334, 0x05cb62a2) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xad100179, 0xa3c984ab) + 94 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00903800) + + + + + + + (0x00002232, 0x000023c9) + + (0x5bdd9691, 0x130584b9) + 0 + + + (0x0000376d, 0x000001ee) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 249 + + + (0x358ae8b5, 0x0f8bacd1) + 320 + + + (0x3f0a3b27, 0x570913d2) + 312 + + + (0x6267b5c5, 0x676e3e42) + 289 + + + + + (0x39ec49f3, 0x56c136ff) + + (0x791a5334, 0x05cb62a2) + 0 + + + (0x5e2124c7, 0x1bda2228) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 51 + + + (0x358ae8b5, 0x0f8bacd1) + 320 + + + (0x3f0a3b27, 0x570913d2) + 88 + + + (0x6267b5c5, 0x676e3e42) + 320 + + + + + (0x3f52384e, 0x2c2082d2) + + (0x5e2124c7, 0x1bda2228) + 0 + + + (0x5bdd9691, 0x130584b9) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 137 + + + (0x358ae8b5, 0x0f8bacd1) + 320 + + + (0x3f0a3b27, 0x570913d2) + 200 + + + (0x6267b5c5, 0x676e3e42) + 320 + + + + + + + (0x071dad5e, 0x17b33a03) + The <i>Time Signal</i> box generates +a 1 channel linear signal (<i>f(t)=t</i>) + + + (0x473d9a43, 0x97fc0a97) + 576 + + + (0x7234b86b, 0x2b8651a5) + 48 + + + + + (0x0f97f08c, 0x14474c97) + The <i>Simple DSP</i> box applies a simple +function to each sample. This function is +<i>4 * cos(X)</i> so the output signal is a +sinusoid in the [-4 +4] range. + + + (0x473d9a43, 0x97fc0a97) + 576 + + + (0x7234b86b, 0x2b8651a5) + 128 + + + + + (0x612a81a4, 0x68d7e635) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 480 + + + (0x7234b86b, 0x2b8651a5) + 400 + + + + + (0x698cfa37, 0x232575e8) + The <i><b>Crop</b></i> box cuts the signal +to a minimum of <b>-3</b> and a maximum of +<b>+3</b>. If the signal gets lower to the minimum +or higher to the maximum, the sample value is simply +replaced by the actual minimum or the actual maximum. + + + (0x473d9a43, 0x97fc0a97) + 576 + + + (0x7234b86b, 0x2b8651a5) + 240 + + + + + (0x7278a690, 0x0b27f24e) + Finally, the <i>Signal Display</i> box +displays the result. + + + (0x473d9a43, 0x97fc0a97) + 576 + + + (0x7234b86b, 0x2b8651a5) + 336 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x0000376d, 0x000001ee)","childCount":0,"identifier":"(0x0000688d, 0x00006cbf)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x1aaf4e4d, 0x2e459ad4)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x7293e89a, 0x29495377)","index":0,"name":"Default tab","parentIdentifier":"(0x1aaf4e4d, 0x2e459ad4)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x2b68cb14, 0x3a1b7595)","index":0,"name":"Empty","parentIdentifier":"(0x7293e89a, 0x29495377)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/eog-removal/b-Matrix-EEG.cfg b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/eog-removal/b-Matrix-EEG.cfg new file mode 100755 index 0000000..03c9c44 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/eog-removal/b-Matrix-EEG.cfg @@ -0,0 +1,17 @@ +4 4 32 +0.190954 +0.0934296 +-0.018267 +0.43378 +0.0588937 +0.28019 +-0.0240636 +0.308092 +0.699474 +-0.0584318 +-0.0255184 +0.189858 +0.224142 +0.139218 +-0.0306152 +0.215256 diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/eog-removal/eog-calibration.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/eog-removal/eog-calibration.xml new file mode 100644 index 0000000..21b49fa --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/eog-removal/eog-calibration.xml @@ -0,0 +1,916 @@ + + 2 + OpenViBE Designer + 2.1.0 + + + + + + (0x000018a8, 0x00007deb) + Keyboard stimulator + (0x00d317b9, 0x6324c3ff) + + + (0x6f752dd0, 0x082a321e) + Outgoing Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x9b5dd008, 0x475a2ecd) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x027a6071) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00001ac2, 0x00007b76) + GDF file reader + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/eog-artifact.gdf + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 385 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x016d098c) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00001ccf, 0x00002414) + EOG + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 224 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00003b19, 0x00002e65) + EOG + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + 1:4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001ceae3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000416e, 0x00001e7e) + EOG_Denoising_Calibration + (0xe8dfe002, 0x70389932) + + + (0x5ba36127, 0x195feae1) + EEG + + + (0x5ba36127, 0x195feae1) + EOG + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x330306dd, 0x74a95f98) + Filename b Matrix + b-Matrix-EEG.cfg + ${Player_ScenarioDirectory}/b-Matrix-EEG.cfg + false + + + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_GDF_End_Of_Session + OVTK_GDF_End_Of_Session + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 289 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0xefef60c9, 0xe53f77fc) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x02afc5fc) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000041f0, 0x00007465) + EEG + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000489a, 0x0000011d) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00f1bfbf) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006eb3, 0x00003bc9) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 40 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01129423) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000071e4, 0x00006ad6) + EEG + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + 1:4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Reject + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00269e1b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000022d8, 0x00002198) + + (0x00003b19, 0x00002e65) + 0 + + + (0x0000416e, 0x00001e7e) + 1 + + + + (0x00002618, 0x00005d65) + + (0x000071e4, 0x00006ad6) + 0 + + + (0x000041f0, 0x00007465) + 0 + + + + (0x000026a2, 0x00001e65) + + (0x00006eb3, 0x00003bc9) + 0 + + + (0x00003b19, 0x00002e65) + 0 + + + + (0x00002eaa, 0x00005a2b) + + (0x00001ac2, 0x00007b76) + 1 + + + (0x00006eb3, 0x00003bc9) + 0 + + + + (0x000039a0, 0x000077bd) + + (0x000018a8, 0x00007deb) + 0 + + + (0x0000416e, 0x00001e7e) + 2 + + + + (0x000049ef, 0x000056c3) + + (0x00003b19, 0x00002e65) + 0 + + + (0x00001ccf, 0x00002414) + 0 + + + + (0x00005978, 0x0000666f) + + (0x00006eb3, 0x00003bc9) + 0 + + + (0x000071e4, 0x00006ad6) + 0 + + + + (0x0000785e, 0x0000764c) + + (0x0000416e, 0x00001e7e) + 0 + + + (0x0000489a, 0x0000011d) + 0 + + + + (0x00007c20, 0x00000003) + + (0x000071e4, 0x00006ad6) + 0 + + + (0x0000416e, 0x00001e7e) + 0 + + + + + + (0x00001b37, 0x000073e5) + This scenario estimates a denoising regressor +following the work of Schlögl and al., 2007. + +Here, <b><i>EOG Denoising Calibration</i></b> estimates +the model using a more contaminated signal in the EOG +input and the rest (EEG signal) in the EEG input. + +Press 'a' to in <b><i>Keyboard Stimulator</i></b> to start the +model estimation. Press 'u' to stop. The model is +output after the whole input has been processed. + +After the model has been estimated, it can be +used with the 'eog-run.xml' scenario. + + + + + + (0x473d9a43, 0x97fc0a97) + 720.000000 + + + (0x7234b86b, 0x2b8651a5) + 160.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x000041f0, 0x00007465)","childCount":0,"identifier":"(0x0000218f, 0x00003d69)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000299d, 0x00003e7a)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":475},{"boxIdentifier":"(0x000018a8, 0x00007deb)","childCount":0,"identifier":"(0x000047a3, 0x0000671a)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0x00001ccf, 0x00002414)","childCount":0,"identifier":"(0x00005019, 0x00007d87)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000011ab, 0x00002e7d)","index":0,"name":"Default tab","parentIdentifier":"(0x0000299d, 0x00003e7a)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000031e, 0x000026a1)","index":0,"name":"Empty","parentIdentifier":"(0x000011ab, 0x00002e7d)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + Joao-Pedro Berti-Ligabo + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + EOG: Run + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/eog-removal/eog-run.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/eog-removal/eog-run.xml new file mode 100644 index 0000000..6f85790 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/eog-removal/eog-run.xml @@ -0,0 +1,960 @@ + + 1 + openvibe + 2.0 + + + (0x00003b19, 0x00002e65) + EOG + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + 1:4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192.000000 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 464.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 106 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001ceae3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004d05, 0x00007de5) + After + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432.000000 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 416.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00221c5f) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000053ed, 0x0000612d) + EOG Denoising + (0xc223ff12, 0x069a987e) + + + (0x5ba36127, 0x195feae1) + EEG + + + (0x5ba36127, 0x195feae1) + EOG + + + + + (0x5ba36127, 0x195feae1) + EEG_Corrected + + + + + (0x330306dd, 0x74a95f98) + Filename b Matrix + b-Matrix-EEG.txt + ${Player_ScenarioDirectory}/b-Matrix-EEG.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288.000000 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 416.000000 + + + (0x4e7b798a, 0x183beafb) + (0xc15f2638, 0x928d2db0) + + + (0xad100179, 0xa3c984ab) + 119 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002fcaa5) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00005e30, 0x0000017a) + GDF file reader + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/eog-artifact.gdf + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32.000000 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 400.000000 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xad100179, 0xa3c984ab) + 123 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00315309) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x000069dc, 0x00007101) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 40 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 119 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003e921f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000071e4, 0x00006ad6) + EEG + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + 1:4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Reject + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192.000000 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 336.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 106 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00269e1b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000721d, 0x00006b03) + Before + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432.000000 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 272.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00240e2e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + + + (0x00000568, 0x00001560) + + (0x000071e4, 0x00006ad6) + 0 + + + (0x0000721d, 0x00006b03) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 224 + + + (0x358ae8b5, 0x0f8bacd1) + 336 + + + (0x3f0a3b27, 0x570913d2) + 402 + + + (0x6267b5c5, 0x676e3e42) + 257 + + + + + (0x00000730, 0x0000533a) + + (0x00005e30, 0x0000017a) + 1 + + + (0x000069dc, 0x00007101) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 51 + + + (0x358ae8b5, 0x0f8bacd1) + 400 + + + (0x3f0a3b27, 0x570913d2) + 79 + + + (0x6267b5c5, 0x676e3e42) + 400 + + + + + (0x0000150f, 0x00005c52) + + (0x000053ed, 0x0000612d) + 0 + + + (0x00004d05, 0x00007de5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 313 + + + (0x358ae8b5, 0x0f8bacd1) + 416 + + + (0x3f0a3b27, 0x570913d2) + 402 + + + (0x6267b5c5, 0x676e3e42) + 401 + + + + + (0x000018c1, 0x00002528) + + (0x000069dc, 0x00007101) + 0 + + + (0x00003b19, 0x00002e65) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 115 + + + (0x358ae8b5, 0x0f8bacd1) + 400 + + + (0x3f0a3b27, 0x570913d2) + 162 + + + (0x6267b5c5, 0x676e3e42) + 464 + + + + + (0x00003155, 0x00006d63) + + (0x00003b19, 0x00002e65) + 0 + + + (0x000053ed, 0x0000612d) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 224 + + + (0x358ae8b5, 0x0f8bacd1) + 464 + + + (0x3f0a3b27, 0x570913d2) + 264 + + + (0x6267b5c5, 0x676e3e42) + 423 + + + + + (0x00003ea1, 0x0000322f) + + (0x000069dc, 0x00007101) + 0 + + + (0x000071e4, 0x00006ad6) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 115 + + + (0x358ae8b5, 0x0f8bacd1) + 400 + + + (0x3f0a3b27, 0x570913d2) + 162 + + + (0x6267b5c5, 0x676e3e42) + 336 + + + + + (0x0000515e, 0x00004b1e) + + (0x000071e4, 0x00006ad6) + 0 + + + (0x000053ed, 0x0000612d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 224 + + + (0x358ae8b5, 0x0f8bacd1) + 336 + + + (0x3f0a3b27, 0x570913d2) + 264 + + + (0x6267b5c5, 0x676e3e42) + 408 + + + + + + + (0x00007d4d, 0x00006501) + This scenario performs denoising following +the work of Schlögl and al., 2007. + +The model should be first calibrated using +the 'eog-calibration.xml' scenario. + +<b><i>EOG Denoising</i></b> box uses the estimated model +and attempts to clean the EEG input of artifacts. + + + + (0x473d9a43, 0x97fc0a97) + 720.000000 + + + (0x7234b86b, 0x2b8651a5) + 224.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00006444, 0x00003b19)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":467},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000408e, 0x00005287)","index":0,"name":"Default tab","parentIdentifier":"(0x00006444, 0x00003b19)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":135,"identifier":"(0x00004ee6, 0x00007589)","index":0,"maxDividerPosition":275,"name":"Vertical split","parentIdentifier":"(0x0000408e, 0x00005287)","type":4},{"boxIdentifier":"(0x0000721d, 0x00006b03)","childCount":0,"identifier":"(0x00004fca, 0x000005fa)","index":0,"parentIdentifier":"(0x00004ee6, 0x00007589)","type":3},{"boxIdentifier":"(0x00004d05, 0x00007de5)","childCount":0,"identifier":"(0x00005ad7, 0x00000e3a)","index":1,"parentIdentifier":"(0x00004ee6, 0x00007589)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Joao-Pedro Berti-Ligabo + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + EOG: Calibration + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/ersp-plot.lua b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/ersp-plot.lua new file mode 100644 index 0000000..c3f1d81 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/ersp-plot.lua @@ -0,0 +1,50 @@ + +g_sent = false +g_numTrials = 10 + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + -- make sure we get equal number of both trials + g_numTrials = 2 * box:get_setting(2) + g_sent = false; +end + +function uninitialize(box) +end + +function process(box) + + while box:keep_processing() and g_sent == false do + + box:send_stimulation(1, OVTK_StimulationId_ExperimentStart, 0, 0) + + current_time = 5 + + for i = 1 , g_numTrials do + + if i % 2 == 0 then + box:send_stimulation(1, OVTK_GDF_Left, current_time+0, 0) + else + box:send_stimulation(1, OVTK_GDF_Right, current_time+0, 0) + end + box:send_stimulation(1, OVTK_StimulationId_Label_01, current_time+1, 0) + box:send_stimulation(1, OVTK_StimulationId_Label_00, current_time+2, 0) + box:send_stimulation(1, OVTK_StimulationId_Label_01, current_time+3, 0) + box:send_stimulation(1, OVTK_StimulationId_Label_00, current_time+4, 0) + box:send_stimulation(1, OVTK_StimulationId_RestStart, current_time+5, 0) + + current_time = current_time + 10 + + end + + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, current_time, 0) + box:send_stimulation(1, OVTK_StimulationId_EndOfFile, current_time+2, 0) + + g_sent = true + + box:sleep() + + end + +end + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/ersp-plot.mxs b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/ersp-plot.mxs new file mode 100644 index 0000000..acd2531 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/ersp-plot.mxs @@ -0,0 +1,2940 @@ + + 2 + OpenViBE Designer + 2.1.0 + + + + + + (0x0000061a, 0x000012c5) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000103c, 0x0000540a) + ERSP Average + (0x3cdb4b72, 0x295d51f7) + + + (0x1f261c0a, 0x593bf6bd) + Input spectrum + + + (0x6f752dd0, 0x082a321e) + Control + + + + + (0x1f261c0a, 0x593bf6bd) + Output spectrum + + + + + (0x2c132d6e, 0x44ab0d97) + Epoching stim + OVTK_GDF_Start_Of_Trial + OVTK_GDF_Left + false + + + (0x2c132d6e, 0x44ab0d97) + Launch compute + OVTK_StimulationId_ExperimentStop + OVTK_StimulationId_ExperimentStop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 736 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x4e7b798a, 0x183beafb) + (0x938a54a5, 0xdde23d03) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000103c, 0x0000540b) + ERSP Average + (0x3cdb4b72, 0x295d51f7) + + + (0x1f261c0a, 0x593bf6bd) + Input spectrum + + + (0x6f752dd0, 0x082a321e) + Control + + + + + (0x1f261c0a, 0x593bf6bd) + Output spectrum + + + + + (0x2c132d6e, 0x44ab0d97) + Epoching stim + OVTK_GDF_Start_Of_Trial + OVTK_GDF_Right + false + + + (0x2c132d6e, 0x44ab0d97) + Launch compute + OVTK_StimulationId_ExperimentStop + OVTK_StimulationId_ExperimentStop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 736 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0x938a54a5, 0xdde23d03) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000014f0, 0x00001c0f) + Print timeline events + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000016de, 0x00005b39) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000016de, 0x00005b3a) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001866, 0x00002764) + Streamed matrix multiplexer + (0x7a12298b, 0x785f4d42) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Multiplexed streamed matrix + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x4badfdff, 0xc35004a3) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001866, 0x00002765) + Streamed matrix multiplexer + (0x7a12298b, 0x785f4d42) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x5ba36127, 0x195feae1) + Input stream 3 + + + + + (0x5ba36127, 0x195feae1) + Multiplexed streamed matrix + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x4badfdff, 0xc35004a3) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001868, 0x0000536c) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 10 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_GDF_Left + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 656 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001868, 0x0000536d) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 10 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_GDF_Right + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001aea, 0x00003a82) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000321b, 0x000000ab) + Spectral Analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imaginary Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 608 + + + (0x207c9054, 0x3c841b63) + 656 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000321b, 0x000000ac) + Spectral Analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imaginary Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 608 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000337b, 0x00004569) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x5ba36127, 0x195feae1) + Output + + + (0x5ba36127, 0x195feae1) + Output(1) + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + true + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000337b, 0x0000456a) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x5ba36127, 0x195feae1) + Output + + + (0x5ba36127, 0x195feae1) + Output(1) + + + (0x5ba36127, 0x195feae1) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + true + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_RestStart + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_GDF_Left + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_GDF_Right + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000043ae, 0x00002acc) + Left + (0x7b0ddb65, 0xfdc51488) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 10 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.01 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x4e7b798a, 0x183beafb) + (0xafb1edd5, 0x68e1da05) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000043ae, 0x00002acd) + Right + (0x7b0ddb65, 0xfdc51488) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 10 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.01 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 800 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0xafb1edd5, 0x68e1da05) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000052cc, 0x00005e27) + Source signal + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + None + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 10 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 272 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000052cc, 0x00005e28) + Noisy signal + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + None + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 10 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 512 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000060e7, 0x0000443d) + Mix noise + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + a+10*(b-0.5) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000062fa, 0x00007ec6) + Signal Resampling + (0x0e923a5e, 0xda474058) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x158a8efd, 0xaa894f86) + (0x007deef9, 0x2f3e95c6) + New Sampling Frequency + 128 + 128 + false + + + (0x588783f3, 0x8e8dcf86) + (0x007deef9, 0x2f3e95c6) + Sample Count Per Buffer + 8 + 8 + false + + + (0xafdd8efd, 0x23ef94f6) + (0x2cdb2f0b, 0x12f231ea) + Low Pass Filter Signal Before Downsampling + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0xf4246eab, 0x3b371eef) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006495, 0x00006314) + Left = 8Hz + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(2*m_pi*x*8) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006495, 0x00006315) + Rest = 1Hz + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(2*m_pi*x*1) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006495, 0x00006316) + Right = 14Hz + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(2*m_pi*x*14) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006596, 0x00003d58) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00006afe, 0x00001799) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 1 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x00006b65, 0x00003b3d) + Dampen + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*0.1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007201, 0x00004267) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x1f261c0a, 0x593bf6bd) + Input - A + + + (0x1f261c0a, 0x593bf6bd) + Input - B + + + + + (0x1f261c0a, 0x593bf6bd) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sqrt(a*a + b*b) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 672 + + + (0x207c9054, 0x3c841b63) + 656 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007201, 0x00004268) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x1f261c0a, 0x593bf6bd) + Input - A + + + (0x1f261c0a, 0x593bf6bd) + Input - B + + + + + (0x1f261c0a, 0x593bf6bd) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sqrt(a*a + b*b) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 672 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000072f4, 0x00004819) + Timeline generator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/ersp-plot.lua + false + + + (0x007deef9, 0x2f3e95c6) + Trials per class + 10 + 10 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -112 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007e32, 0x0000772d) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 544 + + + (0x207c9054, 0x3c841b63) + 656 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007e32, 0x0000772e) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch intervals (in sec) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 544 + + + (0x207c9054, 0x3c841b63) + 848 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000004a1, 0x00003dac) + + (0x000072f4, 0x00004819) + 0 + + + (0x00001aea, 0x00003a82) + 0 + + + + (0x0000105f, 0x00007374) + + (0x0000321b, 0x000000ab) + 0 + + + (0x00007201, 0x00004267) + 0 + + + + (0x00001086, 0x00003757) + + (0x00001866, 0x00002764) + 0 + + + (0x000060e7, 0x0000443d) + 0 + + + + (0x000010ea, 0x000027d9) + + (0x00007e32, 0x0000772d) + 0 + + + (0x0000321b, 0x000000ab) + 0 + + + + (0x000010f7, 0x00000fc2) + + (0x00006b65, 0x00003b3d) + 0 + + + (0x00001866, 0x00002764) + 1 + + + + (0x00001117, 0x000034ec) + + (0x00006afe, 0x00001799) + 0 + + + (0x000060e7, 0x0000443d) + 1 + + + + (0x00001533, 0x000059c3) + + (0x00001868, 0x0000536c) + 0 + + + (0x00007e32, 0x0000772d) + 0 + + + + (0x00001e82, 0x00000688) + + (0x0000337b, 0x0000456a) + 0 + + + (0x00006495, 0x00006315) + 0 + + + + (0x00001fd6, 0x00005afc) + + (0x0000321b, 0x000000ab) + 1 + + + (0x00007201, 0x00004267) + 1 + + + + (0x0000200f, 0x0000226f) + + (0x0000321b, 0x000000ac) + 0 + + + (0x00007201, 0x00004268) + 0 + + + + (0x000020e2, 0x00000d36) + + (0x0000337b, 0x0000456a) + 2 + + + (0x00006495, 0x00006316) + 0 + + + + (0x00002429, 0x00001905) + + (0x00001866, 0x00002764) + 0 + + + (0x000052cc, 0x00005e27) + 0 + + + + (0x00002755, 0x00002d90) + + (0x0000061a, 0x000012c5) + 0 + + + (0x000016de, 0x00005b39) + 0 + + + + (0x000027ca, 0x0000466f) + + (0x000060e7, 0x0000443d) + 0 + + + (0x000052cc, 0x00005e28) + 0 + + + + (0x000028e8, 0x000003c1) + + (0x0000321b, 0x000000ac) + 1 + + + (0x00007201, 0x00004268) + 1 + + + + (0x00002923, 0x0000544b) + + (0x000072f4, 0x00004819) + 0 + + + (0x0000337b, 0x0000456a) + 0 + + + + (0x00002af3, 0x00001fff) + + (0x00007e32, 0x0000772e) + 0 + + + (0x0000321b, 0x000000ac) + 0 + + + + (0x00002e47, 0x00007e05) + + (0x000062fa, 0x00007ec6) + 0 + + + (0x00001868, 0x0000536c) + 0 + + + + (0x00003007, 0x0000550c) + + (0x00001868, 0x0000536d) + 0 + + + (0x00007e32, 0x0000772e) + 0 + + + + (0x000031bf, 0x00007416) + + (0x0000337b, 0x00004569) + 0 + + + (0x00001866, 0x00002764) + 0 + + + + (0x000032a4, 0x000048f6) + + (0x000016de, 0x00005b39) + 0 + + + (0x000052cc, 0x00005e28) + 1 + + + + (0x000032b7, 0x00005460) + + (0x000016de, 0x00005b39) + 0 + + + (0x00001868, 0x0000536c) + 1 + + + + (0x0000373b, 0x00002464) + + (0x00006495, 0x00006316) + 0 + + + (0x00001866, 0x00002765) + 2 + + + + (0x00003ab7, 0x00005f8e) + + (0x000016de, 0x00005b39) + 0 + + + (0x000052cc, 0x00005e27) + 1 + + + + (0x000044ec, 0x00007b42) + + (0x00006495, 0x00006314) + 0 + + + (0x00001866, 0x00002765) + 1 + + + + (0x00004747, 0x00003c7b) + + (0x000072f4, 0x00004819) + 0 + + + (0x0000061a, 0x000012c5) + 0 + + + + (0x0000483e, 0x0000513b) + + (0x000072f4, 0x00004819) + 0 + + + (0x000014f0, 0x00001c0f) + 0 + + + + (0x000049eb, 0x000059d1) + + (0x00001866, 0x00002765) + 0 + + + (0x0000337b, 0x00004569) + 1 + + + + (0x0000531b, 0x00007d57) + + (0x000016de, 0x00005b39) + 0 + + + (0x000016de, 0x00005b3a) + 0 + + + + (0x000059c4, 0x00002c4f) + + (0x0000337b, 0x0000456a) + 1 + + + (0x00006495, 0x00006314) + 0 + + + + (0x000059c5, 0x00005eb6) + + (0x00006596, 0x00003d58) + 0 + + + (0x0000337b, 0x0000456a) + 1 + + + + (0x00006282, 0x00003818) + + (0x000016de, 0x00005b3a) + 0 + + + (0x0000103c, 0x0000540a) + 1 + + + + (0x0000649b, 0x00001fb7) + + (0x00007201, 0x00004268) + 0 + + + (0x0000103c, 0x0000540b) + 0 + + + + (0x000067d3, 0x00005725) + + (0x0000337b, 0x00004569) + 1 + + + (0x00006b65, 0x00003b3d) + 0 + + + + (0x00006981, 0x0000129c) + + (0x00007201, 0x00004267) + 0 + + + (0x0000103c, 0x0000540a) + 0 + + + + (0x000069eb, 0x000073dd) + + (0x0000103c, 0x0000540b) + 0 + + + (0x000043ae, 0x00002acd) + 0 + + + + (0x00006bd9, 0x00004636) + + (0x000062fa, 0x00007ec6) + 0 + + + (0x00001868, 0x0000536d) + 0 + + + + (0x00006d2b, 0x000029ff) + + (0x0000103c, 0x0000540a) + 0 + + + (0x000043ae, 0x00002acc) + 0 + + + + (0x00006edc, 0x0000554a) + + (0x00006495, 0x00006315) + 0 + + + (0x00001866, 0x00002765) + 0 + + + + (0x000072ac, 0x000012d8) + + (0x000016de, 0x00005b3a) + 0 + + + (0x0000103c, 0x0000540b) + 1 + + + + (0x000076de, 0x0000114d) + + (0x0000061a, 0x000012c5) + 0 + + + (0x0000337b, 0x00004569) + 0 + + + + (0x00007b2f, 0x00001564) + + (0x000060e7, 0x0000443d) + 0 + + + (0x000062fa, 0x00007ec6) + 0 + + + + (0x00007e09, 0x00004d89) + + (0x000016de, 0x00005b39) + 0 + + + (0x00001868, 0x0000536d) + 1 + + + + + + (0x00000828, 0x00004269) + This scenario demonstrates how to do +Event-Related Spectral Perturbation (<b>ERSP</b>) +type visualization with OpenViBE. + + + (0x473d9a43, 0x97fc0a97) + 256 + + + (0x7234b86b, 0x2b8651a5) + -240 + + + + + (0x00000e6c, 0x000027e7) + A lua script is used to make an event timeline consisting of two types of trials, +left and right, and the rest interpreted as... rest. + + + (0x473d9a43, 0x97fc0a97) + 768 + + + (0x7234b86b, 0x2b8651a5) + -192 + + + + + (0x00001b36, 0x000073b6) + Set oscillation frequency dependending +on the timeline (trial type or rest). + + + (0x473d9a43, 0x97fc0a97) + 48 + + + (0x7234b86b, 0x2b8651a5) + 48 + + + + + (0x000021bb, 0x00007b93) + Dampen the signal within-trial in regular intervals +to illustrate how the ERSP plot can evolve over time. +Every other second will be dampened during the first 5s, +controlled by the events from the timeline generator. + + + (0x473d9a43, 0x97fc0a97) + 80 + + + (0x7234b86b, 0x2b8651a5) + 224 + + + + + (0x000023db, 0x00005299) + In the default configuration you should see +the clear differences in the spectral powers +over time in the conditions Left, Right and Rest. +The last few seconds of each 5s are rest. + + + (0x473d9a43, 0x97fc0a97) + 352 + + + (0x7234b86b, 0x2b8651a5) + 800 + + + + + (0x00004568, 0x000076b6) + This side computes and displays the ERSP plot + + + (0x473d9a43, 0x97fc0a97) + 1152 + + + (0x7234b86b, 0x2b8651a5) + 352 + + + + + (0x00004f8a, 0x00007f62) + We do two separate estimates: one for Left +and another for Right. The signal is routed +accordingly. + +Stimulation based epoching is configured with the trial length. + +Time based epoching further splits the trial to segments as desired. + +Each segment gets its own spectral power computation. + + + (0x473d9a43, 0x97fc0a97) + 1152 + + + (0x7234b86b, 0x2b8651a5) + 576 + + + + + (0x000052c8, 0x000059e3) + This left hand side chain here generates a 1-channel signal +that gets modulated differently depending on the trial type. +The same processing could be used for multichannel signals. + +The signal does not attempt to model real EEG, +but to clearly illustrate the ERSP visualization. + + + (0x473d9a43, 0x97fc0a97) + 64 + + + (0x7234b86b, 0x2b8651a5) + -64 + + + + + (0x00005b3a, 0x00004773) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 784 + + + (0x7234b86b, 0x2b8651a5) + 896 + + + + + (0x0000647c, 0x00007e80) + If the ERSP Average receives k consequent spectra for +each trial t ( that is, a sequence s1(t),...,sk(t) ], the box computes +their averages over t: result is a set of spectra s1,...,sk, +where s1 = 1/n sum_t(s1(t)) and so on. These average spectra +are then shown by the Stacked Bitmap. + +The ERSP will be only visualized after all the data has been received. + + + (0x473d9a43, 0x97fc0a97) + 1152 + + + (0x7234b86b, 0x2b8651a5) + 752 + + + + + (0x00006ffa, 0x00000d2e) + Bury the clean signal in noise. If you change the +number of trials in the Timeline Generator, you will +notice that with only a few trials, the ERSP plot does +not clearly show the spectral structure over time. +With more trials, the noise gets averaged out. + + + (0x473d9a43, 0x97fc0a97) + 80 + + + (0x7234b86b, 0x2b8651a5) + 384 + + + + + + + (0x00002275, 0x000031e2) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00001bdf, 0x000049cb)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":475},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000015f8, 0x000067cd)","index":0,"name":"Default tab","parentIdentifier":"(0x00001bdf, 0x000049cb)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":135,"identifier":"(0x00007f1b, 0x000029a8)","index":0,"maxDividerPosition":275,"name":"Vertical split","parentIdentifier":"(0x000015f8, 0x000067cd)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":217,"identifier":"(0x00007273, 0x00006ba9)","index":0,"maxDividerPosition":439,"name":"Horizontal split","parentIdentifier":"(0x00007f1b, 0x000029a8)","type":5},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":217,"identifier":"(0x0000199f, 0x00005ab4)","index":1,"maxDividerPosition":439,"name":"Horizontal split","parentIdentifier":"(0x00007f1b, 0x000029a8)","type":5},{"boxIdentifier":"(0x000052cc, 0x00005e27)","childCount":0,"identifier":"(0x00003838, 0x000042cf)","index":0,"parentIdentifier":"(0x00007273, 0x00006ba9)","type":3},{"boxIdentifier":"(0x000052cc, 0x00005e28)","childCount":0,"identifier":"(0x00002d94, 0x00004834)","index":1,"parentIdentifier":"(0x00007273, 0x00006ba9)","type":3},{"boxIdentifier":"(0x000043ae, 0x00002acc)","childCount":0,"identifier":"(0x00007a88, 0x000070c3)","index":0,"parentIdentifier":"(0x0000199f, 0x00005ab4)","type":3},{"boxIdentifier":"(0x000043ae, 0x00002acd)","childCount":0,"identifier":"(0x000056d7, 0x0000389b)","index":1,"parentIdentifier":"(0x0000199f, 0x00005ab4)","type":3}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + ERSP Plot tutorial + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/hilbert-transform.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/hilbert-transform.xml new file mode 100644 index 0000000..ce98a5f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/hilbert-transform.xml @@ -0,0 +1,1011 @@ + + 1 + openvibe + 2.0 + + + (0x0000174b, 0x00007339) + cos(100*x)*(4*cos(2*x)-sin(3*x)) + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + cos(100*x)*(4*cos(2*x)-sin(3*x)) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 247 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00516bfc) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002c63, 0x0000173d) + Phase + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 736.000000 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 688.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003b1dbc) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00004737, 0x00005716) + Envelope + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 736.000000 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 544.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 88 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003f18cb) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00004dfc, 0x000069e9) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xad100179, 0xa3c984ab) + 94 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004acf6a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00006be2, 0x00000412) + Hilbert signal + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 736.000000 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 400.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 109 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003cb1d3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000073ef, 0x00003386) + Modulated signal + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 592.000000 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 224.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 138 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0041c600) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00007568, 0x00004185) + Hilbert Transform + (0x7878a47f, 0x9a8fe349) + + + (0x5ba36127, 0x195feae1) + EEG Signal + + + + + (0x5ba36127, 0x195feae1) + Hilbert Transform + + + (0x5ba36127, 0x195feae1) + Envelope + + + (0x5ba36127, 0x195feae1) + Phase + + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0xceff4a87, 0xffc5ce08) + + + (0xad100179, 0xa3c984ab) + 121 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005c0981) + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00001654, 0x00005134) + + (0x0000174b, 0x00007339) + 0 + + + (0x000073ef, 0x00003386) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 448 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 562 + + + (0x6267b5c5, 0x676e3e42) + 209 + + + + + (0x0000295e, 0x000010ce) + + (0x0000174b, 0x00007339) + 0 + + + (0x00007568, 0x00004185) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 448 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 568 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x00003263, 0x00005885) + + (0x00007568, 0x00004185) + 1 + + + (0x00004737, 0x00005716) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 617 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 706 + + + (0x6267b5c5, 0x676e3e42) + 529 + + + + + (0x00004407, 0x0000355e) + + (0x00004dfc, 0x000069e9) + 0 + + + (0x0000174b, 0x00007339) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 307 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 386 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x00005973, 0x00001cd9) + + (0x00007568, 0x00004185) + 0 + + + (0x00006be2, 0x00000412) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 617 + + + (0x358ae8b5, 0x0f8bacd1) + 513 + + + (0x3f0a3b27, 0x570913d2) + 706 + + + (0x6267b5c5, 0x676e3e42) + 385 + + + + + (0x00005a3a, 0x00002cc1) + + (0x00007568, 0x00004185) + 2 + + + (0x00002c63, 0x0000173d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 617 + + + (0x358ae8b5, 0x0f8bacd1) + 543 + + + (0x3f0a3b27, 0x570913d2) + 706 + + + (0x6267b5c5, 0x676e3e42) + 673 + + + + + + + (0x00000847, 0x00005dca) + The <b><i>Hilbert transform</i></b> computes <b>Hilbert</b> transform, +instantaneous <b>phase</b> and <b>envelope</b> on input signal +using analytic signal representation + + + (0x473d9a43, 0x97fc0a97) + 528 + + + (0x7234b86b, 0x2b8651a5) + 96 + + + + + (0x00001f3d, 0x00007ab1) + Compute <b>Hilbert transform</b> +on the modulated signal + + + (0x473d9a43, 0x97fc0a97) + 768 + + + (0x7234b86b, 0x2b8651a5) + 592 + + + + + (0x00002b65, 0x000003f1) + The <i>Time signal</i> is a sample box +that generates a constant increasing signal + + + (0x473d9a43, 0x97fc0a97) + 528 + + + (0x7234b86b, 0x2b8651a5) + 208 + + + + + (0x00005060, 0x00000f39) + The <i>Simple DSP</i> box is used to +create a modulated signal + + + (0x473d9a43, 0x97fc0a97) + 800 + + + (0x7234b86b, 0x2b8651a5) + 416 + + + + + (0x00007b5b, 0x00002b42) + Display results + + + (0x473d9a43, 0x97fc0a97) + 880 + + + (0x7234b86b, 0x2b8651a5) + 736 + + + + + (0x00007f06, 0x00001a0c) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 560 + + + (0x7234b86b, 0x2b8651a5) + 832 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000502f, 0x00006387)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":464},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007b5f, 0x00005051)","index":0,"name":"Default tab","parentIdentifier":"(0x0000502f, 0x00006387)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":42,"identifier":"(0x00002f97, 0x000070dc)","index":0,"maxDividerPosition":275,"name":"Vertical split","parentIdentifier":"(0x00007b5f, 0x00005051)","type":4},{"boxIdentifier":"(0x000073ef, 0x00003386)","childCount":0,"identifier":"(0x00000950, 0x0000293f)","index":0,"parentIdentifier":"(0x00002f97, 0x000070dc)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":158,"identifier":"(0x00006798, 0x00003018)","index":1,"maxDividerPosition":212,"name":"Vertical split","parentIdentifier":"(0x00002f97, 0x000070dc)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":69,"identifier":"(0x00000947, 0x000066cc)","index":0,"maxDividerPosition":142,"name":"Vertical split","parentIdentifier":"(0x00006798, 0x00003018)","type":4},{"boxIdentifier":"(0x00004737, 0x00005716)","childCount":0,"identifier":"(0x0000736a, 0x00006593)","index":1,"parentIdentifier":"(0x00006798, 0x00003018)","type":3},{"boxIdentifier":"(0x00006be2, 0x00000412)","childCount":0,"identifier":"(0x000010db, 0x00003fea)","index":0,"parentIdentifier":"(0x00000947, 0x000066cc)","type":3},{"boxIdentifier":"(0x00002c63, 0x0000173d)","childCount":0,"identifier":"(0x00005278, 0x00001e5d)","index":1,"parentIdentifier":"(0x00000947, 0x000066cc)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Alison Cellard + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Hilbert Transform example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/simple-dsp.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/simple-dsp.xml new file mode 100644 index 0000000..9e0fd12 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/simple-dsp.xml @@ -0,0 +1,2080 @@ + + 1 + openvibe + 2.0 + + + (0x000003f8, 0x0000263d) + y = sin(x) + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(X) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 70 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005543d7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000066f, 0x00002cba) + Display: y = sin(x) + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 1056.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 125 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005662d1) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000104d, 0x00003592) + Display: y = MAX(cos(x), sin(x)) + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 704.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 209 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0068f673) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000150f, 0x00007862) + Display: y = sin(x)/cos(x) + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + None + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 10 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 944.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 168 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00660ea2) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00001670, 0x00002a37) + y = x³ + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + pow(x,3) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 192 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 64 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004f8bad) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000028b9, 0x000073e5) + Display: y = x + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 32.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 96 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0050eb17) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000030ac, 0x00000fb4) + DSP: a > b ? a : b + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + a>b?a:b + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0061d90b) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003bf6, 0x000034b2) + Display: y = x^3 + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 160.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 113 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0059a281) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000042db, 0x000029ac) + y = x + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 64 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004e66dd) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000044c4, 0x00003630) + Display: y = cos(x)/(x+1) + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 336.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 166 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006a6192) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000050b9, 0x000043a7) + DSP: a/b + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + b/a + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 912.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 64 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00640b43) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000058f4, 0x0000621c) + y = cos(x) /(x+1) + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + cos(x)/(x+1) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 115 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004df1b9) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000066c9, 0x000055c5) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xad100179, 0xa3c984ab) + 84 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00683b0d) + + + + + (0x00007c41, 0x00003a87) + Display: y = cos(x) + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 656.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 128 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004f2243) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00007c73, 0x00004bb8) + y = cos(x) + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + cos(X) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 768.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 73 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00770270) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x0000129e, 0x00000b8d) + + (0x00007c73, 0x00004bb8) + 0 + + + (0x000030ac, 0x00000fb4) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 204 + + + (0x358ae8b5, 0x0f8bacd1) + 768 + + + (0x3f0a3b27, 0x570913d2) + 310 + + + (0x6267b5c5, 0x676e3e42) + 744 + + + + + (0x00001fca, 0x00002abb) + + (0x000030ac, 0x00000fb4) + 0 + + + (0x0000104d, 0x00003592) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 364 + + + (0x358ae8b5, 0x0f8bacd1) + 752 + + + (0x3f0a3b27, 0x570913d2) + 422 + + + (0x6267b5c5, 0x676e3e42) + 689 + + + + + (0x00003398, 0x00007719) + + (0x00001670, 0x00002a37) + 0 + + + (0x00003bf6, 0x000034b2) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 236 + + + (0x358ae8b5, 0x0f8bacd1) + 192 + + + (0x3f0a3b27, 0x570913d2) + 262 + + + (0x6267b5c5, 0x676e3e42) + 145 + + + + + (0x00003426, 0x00002668) + + (0x000066c9, 0x000055c5) + 0 + + + (0x000042db, 0x000029ac) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 114 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 182 + + + (0x6267b5c5, 0x676e3e42) + 96 + + + + + (0x000048be, 0x000062f2) + + (0x000042db, 0x000029ac) + 0 + + + (0x000028b9, 0x000073e5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 236 + + + (0x358ae8b5, 0x0f8bacd1) + 96 + + + (0x3f0a3b27, 0x570913d2) + 262 + + + (0x6267b5c5, 0x676e3e42) + 17 + + + + + (0x00004a95, 0x00000e1a) + + (0x000003f8, 0x0000263d) + 0 + + + (0x000030ac, 0x00000fb4) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 204 + + + (0x358ae8b5, 0x0f8bacd1) + 912 + + + (0x3f0a3b27, 0x570913d2) + 310 + + + (0x6267b5c5, 0x676e3e42) + 759 + + + + + (0x00004ac9, 0x00003864) + + (0x00007c73, 0x00004bb8) + 0 + + + (0x000050b9, 0x000043a7) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 204 + + + (0x358ae8b5, 0x0f8bacd1) + 768 + + + (0x3f0a3b27, 0x570913d2) + 310 + + + (0x6267b5c5, 0x676e3e42) + 904 + + + + + (0x00006514, 0x00006da1) + + (0x000066c9, 0x000055c5) + 0 + + + (0x00001670, 0x00002a37) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 114 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 182 + + + (0x6267b5c5, 0x676e3e42) + 192 + + + + + (0x00006824, 0x00001047) + + (0x000066c9, 0x000055c5) + 0 + + + (0x00007c73, 0x00004bb8) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 114 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 150 + + + (0x6267b5c5, 0x676e3e42) + 768 + + + + + (0x00006900, 0x0000163a) + + (0x000066c9, 0x000055c5) + 0 + + + (0x000058f4, 0x0000621c) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 114 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 182 + + + (0x6267b5c5, 0x676e3e42) + 336 + + + + + (0x00006ad3, 0x00006d90) + + (0x000003f8, 0x0000263d) + 0 + + + (0x0000066f, 0x00002cba) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 204 + + + (0x358ae8b5, 0x0f8bacd1) + 912 + + + (0x3f0a3b27, 0x570913d2) + 214 + + + (0x6267b5c5, 0x676e3e42) + 1041 + + + + + (0x000070ea, 0x00007698) + + (0x000003f8, 0x0000263d) + 0 + + + (0x000050b9, 0x000043a7) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 204 + + + (0x358ae8b5, 0x0f8bacd1) + 912 + + + (0x3f0a3b27, 0x570913d2) + 310 + + + (0x6267b5c5, 0x676e3e42) + 919 + + + + + (0x00007170, 0x00000be4) + + (0x000050b9, 0x000043a7) + 0 + + + (0x0000150f, 0x00007862) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 364 + + + (0x358ae8b5, 0x0f8bacd1) + 912 + + + (0x3f0a3b27, 0x570913d2) + 422 + + + (0x6267b5c5, 0x676e3e42) + 929 + + + + + (0x00007219, 0x000041b3) + + (0x000058f4, 0x0000621c) + 0 + + + (0x000044c4, 0x00003630) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 236 + + + (0x358ae8b5, 0x0f8bacd1) + 336 + + + (0x3f0a3b27, 0x570913d2) + 262 + + + (0x6267b5c5, 0x676e3e42) + 321 + + + + + (0x000077e7, 0x000006da) + + (0x00007c73, 0x00004bb8) + 0 + + + (0x00007c41, 0x00003a87) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 204 + + + (0x358ae8b5, 0x0f8bacd1) + 768 + + + (0x3f0a3b27, 0x570913d2) + 230 + + + (0x6267b5c5, 0x676e3e42) + 641 + + + + + (0x00007f5c, 0x00004ed5) + + (0x000066c9, 0x000055c5) + 0 + + + (0x000003f8, 0x0000263d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 114 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 150 + + + (0x6267b5c5, 0x676e3e42) + 912 + + + + + + + (0x00003299, 0x00007614) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 544 + + + (0x7234b86b, 0x2b8651a5) + 512 + + + + + (0x00004556, 0x0000222e) + You can use the letter 'X' (or 'x') + for the first input. + +You can use <b>up to 16 inputs</b>. +If you are using more than 1 input +You have to use the letters <b>a to n</b> +for inputs 1 to 16 respectively. + + + (0x473d9a43, 0x97fc0a97) + 1088 + + + (0x7234b86b, 0x2b8651a5) + 336 + + + + + (0x00005af4, 0x000048ec) + Some simple DSPs using only one input signal +to perform mathematical operations + + + (0x473d9a43, 0x97fc0a97) + 208.000000 + + + (0x7234b86b, 0x2b8651a5) + 368.000000 + + + + + (0x0000638f, 0x00001db6) + The <i>Time signal</i> is a sample box +that generates a constant increasing signal + + + (0x473d9a43, 0x97fc0a97) + 544 + + + (0x7234b86b, 0x2b8651a5) + 48 + + + + + (0x00006a00, 0x00000a1d) + <i>if-then-else</i> clause +can be achieved using +<b><i>COND ? output-true : output-false</i></b> + + + (0x473d9a43, 0x97fc0a97) + 528.000000 + + + (0x7234b86b, 0x2b8651a5) + 368.000000 + + + + + (0x00007b3f, 0x0000521f) + The <b><i>Simple DSP</i></b> box performs +simple computations on input matrix +These computations can be <b>logical</b> or +<b>arithmetical</b>. + + + (0x473d9a43, 0x97fc0a97) + 544 + + + (0x7234b86b, 0x2b8651a5) + -48 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":740,"identifier":"(0x00003ac5, 0x00007fbf)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":831},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000035e, 0x00001c0c)","index":0,"name":"Tab1","parentIdentifier":"(0x00003ac5, 0x00007fbf)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":346,"identifier":"(0x000064fe, 0x00001858)","index":0,"maxDividerPosition":697,"name":"Vertical split","parentIdentifier":"(0x0000035e, 0x00001c0c)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":395,"identifier":"(0x00003a02, 0x00003bff)","index":0,"maxDividerPosition":795,"name":"Horizontal split","parentIdentifier":"(0x000064fe, 0x00001858)","type":5},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":603,"identifier":"(0x0000760f, 0x00006a54)","index":1,"maxDividerPosition":795,"name":"Horizontal split","parentIdentifier":"(0x000064fe, 0x00001858)","type":5},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":187,"identifier":"(0x00003c87, 0x000053a4)","index":0,"maxDividerPosition":379,"name":"Horizontal split","parentIdentifier":"(0x00003a02, 0x00003bff)","type":5},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":187,"identifier":"(0x00006c77, 0x0000784a)","index":1,"maxDividerPosition":379,"name":"Horizontal split","parentIdentifier":"(0x00003a02, 0x00003bff)","type":5},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":291,"identifier":"(0x00007242, 0x000077b2)","index":0,"maxDividerPosition":587,"name":"Horizontal split","parentIdentifier":"(0x0000760f, 0x00006a54)","type":5},{"boxIdentifier":"(0x000044c4, 0x00003630)","childCount":0,"identifier":"(0x00002f98, 0x00000251)","index":1,"parentIdentifier":"(0x0000760f, 0x00006a54)","type":3},{"boxIdentifier":"(0x000028b9, 0x000073e5)","childCount":0,"identifier":"(0x000016c0, 0x00005507)","index":0,"parentIdentifier":"(0x00003c87, 0x000053a4)","type":3},{"boxIdentifier":"(0x00003bf6, 0x000034b2)","childCount":0,"identifier":"(0x00002e4c, 0x0000240c)","index":1,"parentIdentifier":"(0x00003c87, 0x000053a4)","type":3},{"boxIdentifier":"(0x0000066f, 0x00002cba)","childCount":0,"identifier":"(0x00001f5c, 0x000026da)","index":0,"parentIdentifier":"(0x00006c77, 0x0000784a)","type":3},{"boxIdentifier":"(0x00007c41, 0x00003a87)","childCount":0,"identifier":"(0x00000baf, 0x0000763c)","index":1,"parentIdentifier":"(0x00006c77, 0x0000784a)","type":3},{"boxIdentifier":"(0x0000150f, 0x00007862)","childCount":0,"identifier":"(0x00003c4f, 0x00001cc8)","index":0,"parentIdentifier":"(0x00007242, 0x000077b2)","type":3},{"boxIdentifier":"(0x0000104d, 0x00003592)","childCount":0,"identifier":"(0x00006e7c, 0x0000658a)","index":1,"parentIdentifier":"(0x00007242, 0x000077b2)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Simple DSP example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/wavelet-decomposition.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/wavelet-decomposition.xml new file mode 100755 index 0000000..b3cc0fe --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/box-tutorials/wavelet-decomposition.xml @@ -0,0 +1,1011 @@ + + 2 + OpenViBE Designer + 2.1.0 + + + + + + (0x00001afe, 0x00002621) + Original + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0048cc0a) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00002233, 0x00000880) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00447916) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00003105, 0x000000a1) + Discrete Wavelet Transform + (0x824194c5, 0x46d7fde9) + + + (0x5ba36127, 0x195feae1) + Signal + + + + + (0x5ba36127, 0x195feae1) + Info + + + (0x5ba36127, 0x195feae1) + A + + + (0x5ba36127, 0x195feae1) + D1 + + + + + (0x393eac3e, 0x793c0f1d) + Wavelet type + db3 + haar + false + + + (0xf80a2144, 0x6e692c51) + Wavelet decomposition levels + 2 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x0c689845, 0xdbcbc7b2) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01124ddf) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 4 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000333a, 0x00000e2a) + D + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 656 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00356b67) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000035b3, 0x00001a2d) + Inverse DWT + (0x5b5b8468, 0x212cf963) + + + (0x5ba36127, 0x195feae1) + Info + + + (0x5ba36127, 0x195feae1) + A + + + (0x5ba36127, 0x195feae1) + D1 + + + + + (0x5ba36127, 0x195feae1) + Signal + + + + + (0x393eac3e, 0x793c0f1d) + Wavelet type + db3 + haar + false + + + (0xf80a2144, 0x6e692c51) + Wavelet decomposition levels + 2 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xbd682d3d, 0xdbf17645) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x013addc3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 4 + + + + + (0x00003df6, 0x00003ed0) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(a*M_PI)+b-0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 79 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00584ee0) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000066b4, 0x00005b8c) + Reconstruction + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00a617a0) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00006925, 0x000068de) + A + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003fc2a0) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000728e, 0x000062f6) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 1 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002db5b6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + + + (0x0000053b, 0x00005f83) + + (0x00003105, 0x000000a1) + 2 + + + (0x000035b3, 0x00001a2d) + 2 + + + + (0x000009d7, 0x000070a4) + + (0x000035b3, 0x00001a2d) + 0 + + + (0x000066b4, 0x00005b8c) + 0 + + + + (0x00001537, 0x00007f93) + + (0x00003105, 0x000000a1) + 0 + + + (0x000035b3, 0x00001a2d) + 0 + + + + (0x0000222b, 0x00004626) + + (0x00003105, 0x000000a1) + 1 + + + (0x00006925, 0x000068de) + 0 + + + + (0x000043ba, 0x000024dc) + + (0x00002233, 0x00000880) + 0 + + + (0x00003df6, 0x00003ed0) + 0 + + + + (0x00004d98, 0x00004d61) + + (0x00003105, 0x000000a1) + 2 + + + (0x0000333a, 0x00000e2a) + 0 + + + + (0x00004f5a, 0x00002aec) + + (0x00003105, 0x000000a1) + 1 + + + (0x000035b3, 0x00001a2d) + 1 + + + + (0x000061ea, 0x0000434b) + + (0x00003df6, 0x00003ed0) + 0 + + + (0x00003105, 0x000000a1) + 0 + + + + (0x00006c7e, 0x00003c32) + + (0x00003df6, 0x00003ed0) + 0 + + + (0x00001afe, 0x00002621) + 0 + + + + (0x00007b20, 0x00001149) + + (0x0000728e, 0x000062f6) + 0 + + + (0x00003df6, 0x00003ed0) + 1 + + + + + + (0x000045d9, 0x00002cd0) + Wavelet decomposition example + +The scenario produces uniform random noise +signal which rides on a low-frequency sine-wave +carrier. + +This signal is decomposed and then reconstructed +by <i><b>Discrete Wavelet Transform</b></i> +and <i><b>Inverse DWT</b></i> boxes. + +Observing the outputs A and D shows that the +low-frequency part A is now more clean of the +random noise, some of which is carried now +in the high-frequency part D. The reconstructed +signal should closely resemble the original one. + + + (0x473d9a43, 0x97fc0a97) + 768.000000 + + + (0x7234b86b, 0x2b8651a5) + 64.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":617,"identifier":"(0x00003523, 0x00006771)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":726},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00001736, 0x000051cb)","index":0,"name":"Default tab","parentIdentifier":"(0x00003523, 0x00006771)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":88,"identifier":"(0x00006f46, 0x0000688a)","index":0,"maxDividerPosition":572,"name":"Vertical split","parentIdentifier":"(0x00001736, 0x000051cb)","type":4},{"boxIdentifier":"(0x00001afe, 0x00002621)","childCount":0,"identifier":"(0x00006da9, 0x00006d30)","index":0,"parentIdentifier":"(0x00006f46, 0x0000688a)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":350,"identifier":"(0x0000399f, 0x00000628)","index":1,"maxDividerPosition":463,"name":"Vertical split","parentIdentifier":"(0x00006f46, 0x0000688a)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":165,"identifier":"(0x000075cd, 0x00003f4c)","index":0,"maxDividerPosition":334,"name":"Vertical split","parentIdentifier":"(0x0000399f, 0x00000628)","type":4},{"boxIdentifier":"(0x0000333a, 0x00000e2a)","childCount":0,"identifier":"(0x00001df5, 0x0000333c)","index":1,"parentIdentifier":"(0x0000399f, 0x00000628)","type":3},{"boxIdentifier":"(0x000066b4, 0x00005b8c)","childCount":0,"identifier":"(0x000040e2, 0x000061b9)","index":0,"parentIdentifier":"(0x000075cd, 0x00003f4c)","type":3},{"boxIdentifier":"(0x00006925, 0x000068de)","childCount":0,"identifier":"(0x000065f7, 0x00006a58)","index":1,"parentIdentifier":"(0x000075cd, 0x00003f4c)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + Joao-Pedro Berti-Ligabo + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + Wavelet example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/ARBurg_Formula.png b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/ARBurg_Formula.png new file mode 100644 index 0000000..a43cff9 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/ARBurg_Formula.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/AnalyticRepresentation.png b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/AnalyticRepresentation.png new file mode 100644 index 0000000..f82b43f Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/AnalyticRepresentation.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Coherence_Formula.png b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Coherence_Formula.png new file mode 100644 index 0000000..a9f3e97 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Coherence_Formula.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_AutoRegressiveCoefficients.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_AutoRegressiveCoefficients.dox-part new file mode 100644 index 0000000..cd92efb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_AutoRegressiveCoefficients.dox-part @@ -0,0 +1,81 @@ +/** + * \page BoxAlgorithm_AutoRegressiveCoefficients AR Features +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_AutoRegressiveCoefficients_Description| + *The AR features box calculate the coefficients using Burg's method [1] to compute the AutoRegressive (AR) model of an input signal. + The AR model is a representation that describes a time varying process by its own previous values. + + The definition used is : + \image html ARBurg_Formula.png + + + + Where \e a(i) are the autoregressive coefficients or parameters of the model, \e x(t) is the input signal, \e x(t-i) its previous values, \e N is the order (length) of the model and \e epsilon(t) is the residue, assumed to be Gaussian white noise. + + For more informations about AR model : + + https://en.wikipedia.org/wiki/Autoregressive_model + + http://paulbourke.net/miscellaneous/ar/ + + The model order (see [2]) needs to be specified in the settings of the box. + + + [1] Burg, J.P. (1967) "Maximum Entropy Spectral Analysis", Proceedings of the 37th Meeting of the Society of Exploration Geophysicists, Oklahoma City, Oklahoma + + [2] D.J. Krusienski, D.J. MacFarland, J.R. Wolpaw. An evaluation of autoregressive spectral estimation model order for brain-computer interface application. Proceedings of the 28th IEEE EMBS Annual International Conference, New York City, USA, Aug 30-Sept 3, 2006 + + * |OVP_DocEnd_BoxAlgorithm_AutoRegressiveCoefficients_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_AutoRegressiveCoefficients_Inputs| + * |OVP_DocEnd_BoxAlgorithm_AutoRegressiveCoefficients_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_AutoRegressiveCoefficients_Input1| + The input signal + * |OVP_DocEnd_BoxAlgorithm_AutoRegressiveCoefficients_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_AutoRegressiveCoefficients_Outputs| + * |OVP_DocEnd_BoxAlgorithm_AutoRegressiveCoefficients_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_AutoRegressiveCoefficients_Output1| + The AR coefficients stored in a Feature vector + * |OVP_DocEnd_BoxAlgorithm_AutoRegressiveCoefficients_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_AutoRegressiveCoefficients_Settings| + * |OVP_DocEnd_BoxAlgorithm_AutoRegressiveCoefficients_Settings| + + * |OVP_DocBegin_BoxAlgorithm_AutoRegressiveCoefficients_Setting1| + Specify the order, thus the number of coefficients calculated + * |OVP_DocEnd_BoxAlgorithm_AutoRegressiveCoefficients_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_AutoRegressiveCoefficients_Examples| + * |OVP_DocEnd_BoxAlgorithm_AutoRegressiveCoefficients_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_AutoRegressiveCoefficients_Miscellaneous| +The output feature vector contains the coefficients for each channel : the first [order+1] elements are the coefficients of the first channel, etc. + * |OVP_DocEnd_BoxAlgorithm_AutoRegressiveCoefficients_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ConnectivityMeasure.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ConnectivityMeasure.dox-part new file mode 100644 index 0000000..2e4ccd3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ConnectivityMeasure.dox-part @@ -0,0 +1,93 @@ +/** + * \page BoxAlgorithm_ConnectivityMeasure Connectivity Measure +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ConnectivityMeasure_Description| + This box measure connectivity between all channels of a signal using several method. For now, Coherence, Magnitude Squared Coherence, Imaginary part of Coherence, and absolute value of the Imaginary part are available. + They are defined in [1]. + + The coherence definitions used are : + \f[ Coherence = \frac{\left| S_{xy} \right|}{sqrt{(P_{xx}.P_{yy})} } \f] + \f[ Magnitude Squared Coherence = \frac{\left| S_{xy} \right|^2}{(P_{xx}.P_{yy})} \f] + \f[ Imaginary Coherence = \frac{Im(S_{xy})}{sqrt{(P_{xx}.P_{yy})} } \f] + \f[ Absolute Value Of Imaginary Coherence = \frac{\left| Im(S_{xy}) \right|}{sqrt{(P_{xx}.P_{yy})} } \f] + + With \e \f$ S_{xy} \f$ the cross-spectral density between two signal channels, and \e \f$ P_{xx} \f$ and \e \f$ P_{yy} \f$ the Power Spectral Densities of the two channels. + The spectral densities are estimated via Welch's method [2] + +[1] Nolte & al (2004) "Identifying true brain interaction from EEG data using the imaginary part of coherency", Clinical Neurophysiology Volume 115, Issue 10, October 2004 + +[2] Welch, P.D. (1967) "The Use of Fast Fourier Transform for the Estimation of Power Spectra: A Method Based on Time Averaging Over Short, Modified Periodograms", IEEE Transactions on Audio Electroacoustics, AU-15, 70–73 + + + * |OVP_DocEnd_BoxAlgorithm_ConnectivityMeasure_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ConnectivityMeasure_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ConnectivityMeasure_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ConnectivityMeasure_Input1| +The input signal on which connectivity between channels will be measured. + * |OVP_DocEnd_BoxAlgorithm_ConnectivityMeasure_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ConnectivityMeasure_Outputs| + The output of the box is the connectivity Matrix + + * |OVP_DocEnd_BoxAlgorithm_ConnectivityMeasure_Outputs| + + + * |OVP_DocBegin_BoxAlgorithm_ConnectivityMeasure_Output1| + The connectivity matrix is a 3D Matrix of size \e frequency_taps \e x \e nb_channels \e x \e nb_channels + * |OVP_DocEnd_BoxAlgorithm_ConnectivityMeasure_Output1| + + + +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ConnectivityMeasure_Settings| + * |OVP_DocEnd_BoxAlgorithm_ConnectivityMeasure_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ConnectivityMeasure_Setting1| + Choice of the algorithm to measure the connectivity (Magnitude Squared Coherence, Imaginary Coherence). + * |OVP_DocEnd_BoxAlgorithm_ConnectivityMeasure_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_ConnectivityMeasure_Setting2| + The windowing method to apply. Available options are Hamming, Hanning and Welch. + * |OVP_DocEnd_BoxAlgorithm_ConnectivityMeasure_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_ConnectivityMeasure_Setting3| + The length of the window in seconds for the windowing method. + * |OVP_DocEnd_BoxAlgorithm_ConnectivityMeasure_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_ConnectivityMeasure_Setting4| + The percentage of overlap of the windowing method + * |OVP_DocEnd_BoxAlgorithm_ConnectivityMeasure_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_ConnectivityMeasure_Setting5| + The length of signal to receive (in seconds) before processing the connectivity on it. + * |OVP_DocEnd_BoxAlgorithm_ConnectivityMeasure_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_ConnectivityMeasure_Setting6| + The percentage of signal overlap to process the connectivity on. + * |OVP_DocEnd_BoxAlgorithm_ConnectivityMeasure_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_ConnectivityMeasure_Setting7| + The amount of frequency taps for the connectivity measure. + * |OVP_DocEnd_BoxAlgorithm_ConnectivityMeasure_Setting7| + + * |OVP_DocBegin_BoxAlgorithm_ConnectivityMeasure_Setting8| + Option to remove DC component from signal. + * |OVP_DocEnd_BoxAlgorithm_ConnectivityMeasure_Setting8| diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ConnectivityMeasure.png b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ConnectivityMeasure.png new file mode 100644 index 0000000..58410a5 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ConnectivityMeasure.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_DiscreteWaveletTransform.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_DiscreteWaveletTransform.dox-part new file mode 100755 index 0000000..4f46304 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_DiscreteWaveletTransform.dox-part @@ -0,0 +1,79 @@ +/** + * \page BoxAlgorithm_DiscreteWaveletTransform DiscreteWaveletTransform +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_DiscreteWaveletTransform_Description| + * This box calculates the discrete wavelet transform using the following library: + http://wavelet2d.sourceforge.net/ + There are differents options for the wavelet's choice like Haar,Daubechie, Biorthogonal, Coiflets, Symlets. + The user must pay attention in the samples quantity sent to the box because it has to be higher than 2^J + where J is the decomposition levels. + + * |OVP_DocEnd_BoxAlgorithm_DiscreteWaveletTransform_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_DiscreteWaveletTransform_Inputs| + + * |OVP_DocEnd_BoxAlgorithm_DiscreteWaveletTransform_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_DiscreteWaveletTransform_Input1| + Signal to be decomposed. + * |OVP_DocEnd_BoxAlgorithm_DiscreteWaveletTransform_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_DiscreteWaveletTransform_Outputs| + There are at least 3 outputs and there is always the 'Info' output which is necessary to be connected to the + 'Info' signal in the inverse discrete wavelets transform. + The decompositions start with the less detailed level (low frequencies) (A) and go until the highest detailed level (high frequencies) (D1) + * |OVP_DocEnd_BoxAlgorithm_DiscreteWaveletTransform_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_DiscreteWaveletTransform_Output1| + Info signal (needed to export samples length) + * |OVP_DocEnd_BoxAlgorithm_DiscreteWaveletTransform_Output1| + + * |OVP_DocBegin_BoxAlgorithm_DiscreteWaveletTransform_Output2| + * |OVP_DocEnd_BoxAlgorithm_DiscreteWaveletTransform_Output2| + + * |OVP_DocBegin_BoxAlgorithm_DiscreteWaveletTransform_Output3| + * |OVP_DocEnd_BoxAlgorithm_DiscreteWaveletTransform_Output3| + + * |OVP_DocBegin_BoxAlgorithm_DiscreteWaveletTransform_Output4| + * |OVP_DocEnd_BoxAlgorithm_DiscreteWaveletTransform_Output4| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_DiscreteWaveletTransform_Settings| + You can choose the level of decomposition and the wavelet type + * |OVP_DocEnd_BoxAlgorithm_DiscreteWaveletTransform_Settings| + + * |OVP_DocBegin_BoxAlgorithm_DiscreteWaveletTransform_Setting1| + * |OVP_DocEnd_BoxAlgorithm_DiscreteWaveletTransform_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_DiscreteWaveletTransform_Setting2| + * |OVP_DocEnd_BoxAlgorithm_DiscreteWaveletTransform_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_DiscreteWaveletTransform_Examples| + * |OVP_DocEnd_BoxAlgorithm_DiscreteWaveletTransform_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_DiscreteWaveletTransform_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_DiscreteWaveletTransform_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_EOGDenoising.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_EOGDenoising.dox-part new file mode 100755 index 0000000..754252b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_EOGDenoising.dox-part @@ -0,0 +1,69 @@ +/** + * \page BoxAlgorithm_EOGDenoising EOG Denoising +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoising_Description| + * This box uses a denoising matrix 'b' calculated previously through the EOG_Denoising_Calibration for removing the EOG effects on EEG. The principle is based on regression analysis (see article 'A fully automated correction method of EOG artifacts in EEG recordings) where a matrix 'b' is estimated being:b = <'Nt N>-¹<'N S> with N being the noise (EOG electrodes) and S the source (EEG electrodes). + The signal output is the EEG_Corrected (free of EOG noise):O=S-b*N (EEG_Corrected = EEG - b*EOG) + + + * |OVP_DocEnd_BoxAlgorithm_EOGDenoising_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoising_Inputs| + * |OVP_DocEnd_BoxAlgorithm_EOGDenoising_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoising_Input1| + * Make sure to select the same quantity of EEG channels as specified in your 'b' parameter matrix + + * |OVP_DocEnd_BoxAlgorithm_EOGDenoising_Input1| + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoising_Input2| + * Make sure to select the same quantity of EOG channels as specified in your 'b' parameter matrix + + * |OVP_DocEnd_BoxAlgorithm_EOGDenoising_Input2| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoising_Outputs| + * |OVP_DocEnd_BoxAlgorithm_EOGDenoising_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoising_Output1| + * The output has the same structure as the EEG input + * |OVP_DocEnd_BoxAlgorithm_EOGDenoising_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoising_Settings| + * |OVP_DocEnd_BoxAlgorithm_EOGDenoising_Settings| + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoising_Setting1| + * Make sure to select the right file containing your 'b' matrix with the right coefficients + + * |OVP_DocEnd_BoxAlgorithm_EOGDenoising_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoising_Examples| + * You can apply these boxes in a set with a high density of blinking eyes and see the results before and after. + * |OVP_DocEnd_BoxAlgorithm_EOGDenoising_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoising_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_EOGDenoising_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_EOGDenoisingCalibration.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_EOGDenoisingCalibration.dox-part new file mode 100755 index 0000000..cab561c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_EOGDenoisingCalibration.dox-part @@ -0,0 +1,77 @@ +/** + * \page BoxAlgorithm_EOGDenoisingCalibration EOG_Denoising_Calibration +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoisingCalibration_Description| + This box calculates a denoising matrix 'b' for removing the EOG effects on EEG. The principle is based on regression analysis (see article 'A fully automated correction method of EOG artifacts in EEG recordings' - Schlogl2007) where a matrix 'b' is estimated being: b = <'Nt N>-¹<'N S> with N being the noise (EOG electrodes) and S the source (EEG electrodes). + This box reads necessarily from a file where the subject does lots of blinks. User will set a starting and an ending point at this file then the program will calculates the b matrix after reading throughout the file. + + * |OVP_DocEnd_BoxAlgorithm_EOGDenoisingCalibration_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoisingCalibration_Inputs| + * |OVP_DocEnd_BoxAlgorithm_EOGDenoisingCalibration_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoisingCalibration_Input1| + * Make sure to select the desirable EEG channels + * |OVP_DocEnd_BoxAlgorithm_EOGDenoisingCalibration_Input1| + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoisingCalibration_Input2| + * Make sure to select the desirable EOG channels + * |OVP_DocEnd_BoxAlgorithm_EOGDenoisingCalibration_Input2| + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoisingCalibration_Input3| + * Connect this stimulation to the keyboard_controller. + * Press 'a' for set the starting point and 'u' for set the ending point + * |OVP_DocEnd_BoxAlgorithm_EOGDenoisingCalibration_Input3| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoisingCalibration_Outputs| + * |OVP_DocEnd_BoxAlgorithm_EOGDenoisingCalibration_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoisingCalibration_Output1| + Connect this stimulation to the Player Controller to stop the scenario when b matrix is calculated + * |OVP_DocEnd_BoxAlgorithm_EOGDenoisingCalibration_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoisingCalibration_Settings| + * |OVP_DocEnd_BoxAlgorithm_EOGDenoisingCalibration_Settings| + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoisingCalibration_Setting1| + * |OVP_DocEnd_BoxAlgorithm_EOGDenoisingCalibration_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoisingCalibration_Setting2| + * |OVP_DocEnd_BoxAlgorithm_EOGDenoisingCalibration_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoisingCalibration_Setting3| + * |OVP_DocEnd_BoxAlgorithm_EOGDenoisingCalibration_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoisingCalibration_Setting4| + * |OVP_DocEnd_BoxAlgorithm_EOGDenoisingCalibration_Setting4| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoisingCalibration_Examples| + * |OVP_DocEnd_BoxAlgorithm_EOGDenoisingCalibration_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EOGDenoisingCalibration_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_EOGDenoisingCalibration_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ERSPAverage.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ERSPAverage.dox-part new file mode 100644 index 0000000..38a172c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ERSPAverage.dox-part @@ -0,0 +1,96 @@ +/** + * \page BoxAlgorithm_ERSPAverage ERSP Average +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ERSPAverage_Description| + +The ERSP Average box is intended to be used for computing +Event-Related Spectral Perturbation (ERSP) plots. These plots +show, starting from a stimulus onset, how the power spectrum +develops over time on the average across the trials. This is not +straightforwardly achievable with the other averaging boxes, +as the OpenViBE Spectrum stream does not have a time dimension: +a spectrum chunk is a matrix [frequency X channel], whereas to compute +the average evolution of a spectra over time, we would need a +tensor [frequency X channel X time] per trial and then average +these across the trials. + +To achieve the average, the ERSP Average box collects individual +spectra, and computes the average when requested. In more detail, +assume you have EEG data for trial t. Using other boxes, you can +segment this trial to k spectral power estimates s1,s2,...,sk. +Now what the ERSP average does is to average these estimates +across the trials, and returns E[s1], E[s2], ..., E[sk], which +you can then plot as the average evolution of the spectrum +after the stimulus onset. + + * |OVP_DocEnd_BoxAlgorithm_ERSPAverage_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ERSPAverage_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ERSPAverage_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ERSPAverage_Input1| + +The spectrum stream to average + + * |OVP_DocEnd_BoxAlgorithm_ERSPAverage_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ERSPAverage_Outputs| + * |OVP_DocEnd_BoxAlgorithm_ERSPAverage_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_ERSPAverage_Output1| + +A sequence of chunks encoding the evolution of the spectra after stimulus onset. + + * |OVP_DocEnd_BoxAlgorithm_ERSPAverage_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ERSPAverage_Settings| + * |OVP_DocEnd_BoxAlgorithm_ERSPAverage_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ERSPAverage_Setting1| + +The stimulation to identify the trial start (stimulus onset). + + * |OVP_DocEnd_BoxAlgorithm_ERSPAverage_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_ERSPAverage_Setting2| + +The stimulation to trigger the computation of the average. + + * |OVP_DocEnd_BoxAlgorithm_ERSPAverage_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ERSPAverage_Examples| + +See the box tutorial ersp-average.mxs bundled with OpenViBE. + + * |OVP_DocEnd_BoxAlgorithm_ERSPAverage_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ERSPAverage_Miscellaneous| + +The box does not return anything until the computation trigger is received. After that, its output is set to start from time 0. Upon computation, its buffers and counters will be automatically cleared. + + * |OVP_DocEnd_BoxAlgorithm_ERSPAverage_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_EpochVariance.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_EpochVariance.dox-part new file mode 100644 index 0000000..777d573 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_EpochVariance.dox-part @@ -0,0 +1,186 @@ +/** + * \page BoxAlgorithm_EpochVariance Epoch variance +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EpochVariance_Description| + * This box is an extension of the Epoch Average box. It offers several methods of averaging for epoched streams but also outputs variance and confidence bounds. + * |OVP_DocEnd_BoxAlgorithm_EpochVariance_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EpochVariance_Inputs| + * The input type of this box can be changed. Its type must be derived of + * type \ref Doc_Streams_StreamedMatrix in order to be parsed by the input + * reader. If the author changes the input type, the output type will + * be changed the same way. + * |OVP_DocEnd_BoxAlgorithm_EpochVariance_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_EpochVariance_Input1| + * This input receives the input streamed matrix to average. + * |OVP_DocEnd_BoxAlgorithm_EpochVariance_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EpochVariance_Outputs| + * The output type of this box can be changed. Its type must be derived of + * type \ref Doc_Streams_StreamedMatrix in order for the writer to format + * the output chunks. If the author changes the output type, the input + * type will be changed the same way. + * |OVP_DocEnd_BoxAlgorithm_EpochVariance_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_EpochVariance_Output1| + * This output sends the averaged streamed matrix. Averaging method is done + * according to the box settings. + * |OVP_DocEnd_BoxAlgorithm_EpochVariance_Output1| + + * |OVP_DocBegin_BoxAlgorithm_EpochVariance_Output2| + * This output sends the variance of the input. Averaging method is done + * according to the box settings. + * |OVP_DocEnd_BoxAlgorithm_EpochVariance_Output2| + + * |OVP_DocBegin_BoxAlgorithm_EpochVariance_Output3| + * This output sends the confidence bounds of the input. Averaging method is done + * according to the box settings. + * |OVP_DocEnd_BoxAlgorithm_EpochVariance_Output3| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EpochVariance_Settings| + * |OVP_DocEnd_BoxAlgorithm_EpochVariance_Settings| + + * |OVP_DocBegin_BoxAlgorithm_EpochVariance_Setting1| + * This setting gives the method to use in order to average the input + * matrices. It can be of two types : + * - Moving average : in this case, the averaging is done at + * every input reception on the last few buffers, starting as soon + * as enough input has been received. + * - Moving average (Immediate) : in this case, the averaging is done at + * every input reception on the last few buffers, starting immediately. When + * the number of received buffer is lower than the wished number of epochs, the + * average is computed on this very few number of input buffers. + * - Epoch block average : in this case, the averaging + * is done on a number of epochs (see next setting). Once this exact + * number of input is received, the average is computed and output. + * - Cumulative average : in this case, the averaging + * is done on an infinite number of epochs starting from the first + * received buffer to the last received buffer. This can be \b very + * memory consuming ! + * |OVP_DocEnd_BoxAlgorithm_EpochVariance_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_EpochVariance_Setting2| + * This setting tells the box how much buffer it should use in order to + * compute the average. + * |OVP_DocEnd_BoxAlgorithm_EpochVariance_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_EpochVariance_Setting3| + * Significance Level for the confidence bound computation. + * The higher it is, the tighter the confidence interval will be. + * |OVP_DocEnd_BoxAlgorithm_EpochVariance_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EpochVariance_Examples| + * Let's study two cases. First, suppose you have such box with + * Epoch block average set and four epochs. + * The input stream is as follows : +\verbatim ++----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +| I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I8 | | I9 | ... ++----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +\endverbatim + * The output stream will look like this : +\verbatim + +----+ +----+ + | O1 | | O2 | ... + +----+ +----+ +\endverbatim + * where \c O1 is the average of \c I1, \c I2, \c I3 and \c I4 and + * where \c O2 is the average of \c I5, \c I6, \c I7 and \c I8. + * + * Now consider the case where you configured this box with + * Moving average and four epochs. Given the + * same input stream : +\verbatim ++----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +| I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I8 | | I9 | ... ++----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +\endverbatim + * The output stream will look like this : +\verbatim + +----+ +----+ +----+ +----+ +----+ +----+ + | O1 | | O2 | | O3 | | O4 | | O5 | | O6 | ... + +----+ +----+ +----+ +----+ +----+ +----+ +\endverbatim + * where : + * - \c O1 is the average of \c I1, \c I2, \c I3 and \c I4 + * - \c O2 is the average of \c I2, \c I3, \c I4 and \c I5 + * - \c O3 is the average of \c I3, \c I4, \c I5 and \c I6 + * - \c O4 is the average of \c I4, \c I5, \c I6 and \c I7 + * - etc... + * + * Again consider the case where you configured this box with + * Moving average (Immediate) and four epochs. Given the + * same input stream : +\verbatim ++----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +| I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I8 | | I9 | ... ++----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +\endverbatim + * The output stream will look like this : +\verbatim ++----+ +----+ +----+ +----+ +----+ +----+ +| O1 | | O2 | | O3 | | O4 | | O5 | | O6 | ... ++----+ +----+ +----+ +----+ +----+ +----+ +\endverbatim + * where : + * - \c O1 is exactly \c I1 + * - \c O2 is the average of \c I1 and \c I2 + * - \c O3 is the average of \c I1, \c I2 and \c I3 + * - \c O4 is the average of \c I1, \c I2, \c I3 and \c I4 + * - \c O5 is the average of \c I2, \c I3, \c I4 and \c I5 + * - \c O6 is the average of \c I3, \c I4, \c I5 and \c I6 + * - etc... + * + * Finally consider the case where you configured this box with + * Cumulative average and four epochs. Given the + * same input stream : +\verbatim ++----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +| I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I8 | | I9 | ... ++----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +\endverbatim + * The output stream will look like this : +\verbatim ++----+ +----+ +----+ +----+ +----+ +----+ +| O1 | | O2 | | O3 | | O4 | | O5 | | O6 | ... ++----+ +----+ +----+ +----+ +----+ +----+ +\endverbatim + * where : + * - \c O1 is exactly \c I1 + * - \c O2 is the average of \c I1 and \c I2 + * - \c O3 is the average of \c I1, \c I2 and \c I3 + * - \c O4 is the average of \c I1, \c I2, \c I3 and \c I4 + * - \c O5 is the average of \c I1, \c I2, \c I3, \c I4, and \c I5 + * - \c O6 is the average of \c I1, \c I2, \c I3, \c I4, \c I5, and \c I6 + * - etc... + + * |OVP_DocEnd_BoxAlgorithm_EpochVariance_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EpochVariance_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_EpochVariance_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_HilbertTransform.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_HilbertTransform.dox-part new file mode 100644 index 0000000..3db35e4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_HilbertTransform.dox-part @@ -0,0 +1,71 @@ +/** + * \page BoxAlgorithm_HilbertTransform Hilbert Transform +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HilbertTransform_Description| + + This box computes the envelope and the instantaneous phase by performing the Discrete-Time Analytic signal [1] using Hilbert transform (see http://en.wikipedia.org/wiki/Analytic_signal). + +The definition of analytic signal : +\image html AnalyticRepresentation.png + + + +With \e x(t) the input signal, \e H(x) its Hilbert transform and \e i the imaginary unit. + +For more informations on Hilbert transform and EEG see also : http://www.scholarpedia.org/article/Hilbert_transform_for_brain_waves + + +[1] Marple, S.L., "Computing the discrete-time analytic signal via FFT," IEEE Transactions on Signal Processing, Vol. 47, No.9 (September 1999), pp.2600-2603. + + + * |OVP_DocEnd_BoxAlgorithm_HilbertTransform_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HilbertTransform_Inputs| + * |OVP_DocEnd_BoxAlgorithm_HilbertTransform_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_HilbertTransform_Input1| + The input signal + * |OVP_DocEnd_BoxAlgorithm_HilbertTransform_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HilbertTransform_Outputs| + * |OVP_DocEnd_BoxAlgorithm_HilbertTransform_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_HilbertTransform_Output1| + Return the Hilbert transform (imaginary part of the analytic signal) of the input + * |OVP_DocEnd_BoxAlgorithm_HilbertTransform_Output1| + + * |OVP_DocBegin_BoxAlgorithm_HilbertTransform_Output2| + Return the envelope signal of the input + * |OVP_DocEnd_BoxAlgorithm_HilbertTransform_Output2| + + * |OVP_DocBegin_BoxAlgorithm_HilbertTransform_Output3| + Return instantaneous phase of the input + * |OVP_DocEnd_BoxAlgorithm_HilbertTransform_Output3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HilbertTransform_Examples| + + * |OVP_DocEnd_BoxAlgorithm_HilbertTransform_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_HilbertTransform_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_HilbertTransform_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_InverseDWT.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_InverseDWT.dox-part new file mode 100755 index 0000000..26994d5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_InverseDWT.dox-part @@ -0,0 +1,67 @@ +/** + * \page BoxAlgorithm_InverseDWT Inverse DWT +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InverseDWT_Description| + See Discrete Wavelet Transform box for more informations + * |OVP_DocEnd_BoxAlgorithm_InverseDWT_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InverseDWT_Inputs| + * |OVP_DocEnd_BoxAlgorithm_InverseDWT_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_InverseDWT_Input1| + * |OVP_DocEnd_BoxAlgorithm_InverseDWT_Input1| + + * |OVP_DocBegin_BoxAlgorithm_InverseDWT_Input2| + * |OVP_DocEnd_BoxAlgorithm_InverseDWT_Input2| + + * |OVP_DocBegin_BoxAlgorithm_InverseDWT_Input3| + * |OVP_DocEnd_BoxAlgorithm_InverseDWT_Input3| + + * |OVP_DocBegin_BoxAlgorithm_InverseDWT_Input4| + * |OVP_DocEnd_BoxAlgorithm_InverseDWT_Input4| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InverseDWT_Outputs| + * |OVP_DocEnd_BoxAlgorithm_InverseDWT_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_InverseDWT_Output1| + * |OVP_DocEnd_BoxAlgorithm_InverseDWT_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InverseDWT_Settings| + * |OVP_DocEnd_BoxAlgorithm_InverseDWT_Settings| + + * |OVP_DocBegin_BoxAlgorithm_InverseDWT_Setting1| + * |OVP_DocEnd_BoxAlgorithm_InverseDWT_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_InverseDWT_Setting2| + * |OVP_DocEnd_BoxAlgorithm_InverseDWT_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InverseDWT_Examples| + * |OVP_DocEnd_BoxAlgorithm_InverseDWT_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_InverseDWT_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_InverseDWT_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Matrix3DTo2D.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Matrix3DTo2D.dox-part new file mode 100644 index 0000000..ee92715 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Matrix3DTo2D.dox-part @@ -0,0 +1,51 @@ +/** + * \page BoxAlgorithm_Matrix3DTo2D 3D to 2D Matrix conversion +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Matrix3DTo2D_Description| + This box extracts a 2D matrix from a 3D matrix by removing a dimension and selecting a 2D matrix at the desired index + of the removed dimension. + * |OVP_DocEnd_BoxAlgorithm_Matrix3DTo2D_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Matrix3DTo2D_Inputs| + * |OVP_DocEnd_BoxAlgorithm_Matrix3DTo2D_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_Matrix3DTo2D_Input1| + 3D Matrix from which a 2D matrix ( a "slice") will be extracted. + * |OVP_DocEnd_BoxAlgorithm_Matrix3DTo2D_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Matrix3DTo2D_Outputs| + * |OVP_DocEnd_BoxAlgorithm_Matrix3DTo2D_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_Matrix3DTo2D_Output1| + The 2D matrix extrated from the input Matrix + * |OVP_DocEnd_BoxAlgorithm_Matrix3DTo2D_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Matrix3DTo2D_Settings| + * |OVP_DocEnd_BoxAlgorithm_Matrix3DTo2D_Settings| + + * |OVP_DocBegin_BoxAlgorithm_Matrix3DTo2D_Setting1| + The dimension to remove from the 3D Matrix. Possible values are ranging in [ 0 - 2 ]. + * |OVP_DocEnd_BoxAlgorithm_Matrix3DTo2D_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_Matrix3DTo2D_Setting2| + The index from the removed dimension at which to extract the 2 Matrix (the "slice"). + * |OVP_DocEnd_BoxAlgorithm_Matrix3DTo2D_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_Matrix3DTo2D_Setting3| + * |OVP_DocEnd_BoxAlgorithm_Matrix3DTo2D_Setting3| diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_QuadraticForm.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_QuadraticForm.dox-part new file mode 100644 index 0000000..b11f73a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_QuadraticForm.dox-part @@ -0,0 +1,88 @@ +/** + * \page BoxAlgorithm_QuadraticForm Quadratic Form +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_QuadraticForm_Description| + +a square matrix A (which can be seen as a spatial filter) is applied to the input signals m (a vector). Then the transpose m^T of the input signals is multiplied to the resulting vector. In other words the output o is such as: o = m^T * A * m. + + * |OVP_DocEnd_BoxAlgorithm_QuadraticForm_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_QuadraticForm_Inputs| + * |OVP_DocEnd_BoxAlgorithm_QuadraticForm_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_QuadraticForm_Input1| + +The input signal to be used in the computation of the quadratic form + + * |OVP_DocEnd_BoxAlgorithm_QuadraticForm_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_QuadraticForm_Outputs| + * |OVP_DocEnd_BoxAlgorithm_QuadraticForm_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_QuadraticForm_Output1| + +the results of the computation of the quadratic form, perform with the input signals and the matrix defined in the settings + + * |OVP_DocEnd_BoxAlgorithm_QuadraticForm_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_QuadraticForm_Settings| + * |OVP_DocEnd_BoxAlgorithm_QuadraticForm_Settings| + + * |OVP_DocBegin_BoxAlgorithm_QuadraticForm_Setting1| + +The values of the matrix coefficients. These values are entered as a single line of values, +which line should correspond to the concatenation of each matrix row. +For instance the setting "1 2 3 4" corresponds to the matrix: + +[1 2] +[3 4] + + * |OVP_DocEnd_BoxAlgorithm_QuadraticForm_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_QuadraticForm_Setting2| + +The number of rows/columns of the matrix (the number of rows is equal to the number of columns as the matrix is square. +For the matrix given as example above, this setting should be equal to "2". + + * |OVP_DocEnd_BoxAlgorithm_QuadraticForm_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_QuadraticForm_Examples| + * |OVP_DocEnd_BoxAlgorithm_QuadraticForm_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_QuadraticForm_Miscellaneous| + +this box could typically be used to compute the current density in a given brain region, +for instance using the inverse solution sLORETA. In such a case the matrix using as parameter should be a +matrix obtained thanks to this sLORETA inverse solution. +see the following paper for details: + +Congedo M. (2006), Subspace Projection Filters for Real-Time Brain Electromagnetic Imaging, IEEE Transactions on Biomedical Engineering, 53(8), 1624-34 + + + + * |OVP_DocEnd_BoxAlgorithm_QuadraticForm_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SignalDifferential_Integral.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SignalDifferential_Integral.dox-part new file mode 100644 index 0000000..9d6f324 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SignalDifferential_Integral.dox-part @@ -0,0 +1,72 @@ +/** + * \page BoxAlgorithm_SignalDifferential_Integral Signal Differential/Integral +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDifferential_Integral_Description| + +This box can be used to calculate signal differential or integral of any order. + + * |OVP_DocEnd_BoxAlgorithm_SignalDifferential_Integral_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDifferential_Integral_Inputs| + * |OVP_DocEnd_BoxAlgorithm_SignalDifferential_Integral_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_SignalDifferential_Integral_Input1| + +The signal to be derivated/integrated + + * |OVP_DocEnd_BoxAlgorithm_SignalDifferential_Integral_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDifferential_Integral_Outputs| + * |OVP_DocEnd_BoxAlgorithm_SignalDifferential_Integral_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_SignalDifferential_Integral_Output1| + +Resulting derivated/integrated signal + + * |OVP_DocEnd_BoxAlgorithm_SignalDifferential_Integral_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDifferential_Integral_Settings| + * |OVP_DocEnd_BoxAlgorithm_SignalDifferential_Integral_Settings| + + * |OVP_DocBegin_BoxAlgorithm_SignalDifferential_Integral_Setting1| + +Function to be used, either a derivation or an integral + + * |OVP_DocEnd_BoxAlgorithm_SignalDifferential_Integral_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_SignalDifferential_Integral_Setting2| + +The function order. + + * |OVP_DocEnd_BoxAlgorithm_SignalDifferential_Integral_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDifferential_Integral_Examples| + * |OVP_DocEnd_BoxAlgorithm_SignalDifferential_Integral_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDifferential_Integral_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_SignalDifferential_Integral_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_StreamSynchronization.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_StreamSynchronization.dox-part new file mode 100644 index 0000000..e017642 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_StreamSynchronization.dox-part @@ -0,0 +1,68 @@ +/** + * \page BoxAlgorithm_StreamSynchronization Stream Synchronization +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StreamSynchronization_Description| +This box enables you to synchronize inputs from multiple acquisition devices connected together with a hardware tagging system. Each acquisition device must translate the hardware tag into a stimulation, let's call it 'start' stimulation. The synchronisation box outputs signal only after 'start' stimulation has been received, and the time is shifted so that first data is at time 0. Plug each device on its own synchronisation box, so that the signals have the same 'start' time after these boxes. + * |OVP_DocEnd_BoxAlgorithm_StreamSynchronization_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StreamSynchronization_Inputs| + + * |OVP_DocEnd_BoxAlgorithm_StreamSynchronization_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_StreamSynchronization_Input1| +The signal from the acquisition device to be synchronized. + * |OVP_DocEnd_BoxAlgorithm_StreamSynchronization_Input1| + + * |OVP_DocBegin_BoxAlgorithm_StreamSynchronization_Input2| +The stimulations from the acquisition device. The 'start' stimulation, marking the beginning of the experiment, should appear in this input. + * |OVP_DocEnd_BoxAlgorithm_StreamSynchronization_Input2| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StreamSynchronization_Outputs| + * |OVP_DocEnd_BoxAlgorithm_StreamSynchronization_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_StreamSynchronization_Output1| +Time shifted signal. + * |OVP_DocEnd_BoxAlgorithm_StreamSynchronization_Output1| + + * |OVP_DocBegin_BoxAlgorithm_StreamSynchronization_Output2| +Time shifted stimulations. + * |OVP_DocEnd_BoxAlgorithm_StreamSynchronization_Output2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StreamSynchronization_Settings| + * |OVP_DocEnd_BoxAlgorithm_StreamSynchronization_Settings| + + * |OVP_DocBegin_BoxAlgorithm_StreamSynchronization_Setting1| +The ID of the stimulation which marks the beginning of the acquisition. + * |OVP_DocEnd_BoxAlgorithm_StreamSynchronization_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StreamSynchronization_Examples| +This box is useful if you want to use two acquisition devices at the same time. The best way to synchronize the two devices is by a physical link, this should be handled by the hardware. When experiment starts, a trigger is sent to both device through this physical link, and each device driver translate this trigger into a stimulation. As the devices received the trigger at the same time, this stimulation will have the same dating in the OpenViBE acquisition server. Finally the output of each acquisition device should pass through the synchronization box, which will re-date the signal as if it started at the moment of the reception of the stimulation. + * |OVP_DocEnd_BoxAlgorithm_StreamSynchronization_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StreamSynchronization_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_StreamSynchronization_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_XDAWNTrainerDeprecated.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_XDAWNTrainerDeprecated.dox-part new file mode 100644 index 0000000..74b4f49 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_XDAWNTrainerDeprecated.dox-part @@ -0,0 +1,92 @@ +/** + * \page BoxAlgorithm_XDAWNTrainerDeprecated xDAWN Spatial Filter Trainer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainerDeprecated_Description| + * This box can be used in order to compute a spatial filter in order to enhance the + * detection of evoked response potentials. In order to compute such filter, this box + * needs to receive the whole contain of a session on the first hand, and a succession + * of evoked response potentials on the other hand. It then computes the averaged evoked + * response potential computes the spatial filter that makes this averaged potential + * appear in the whole signal. This can be used e.g. for better P300 signal detection. + * + * It is important to consider the fact that this box will have best results for a + * reasonably big number of input channels, possibly all over the scalp (areas where + * the evoked response potential can not be seen will be naturally used as references + * to reduce noise). The spatial filter results in space reduction to only keep significant + * channels for later detection. Consider using at least 4 times more input channels than + * the number of output channels you want. For example, reducing 16 electrodes to 3 channels + * for P300 detection is OK. + * + * For more details about xDAWN, see Rivet et al. 2009 + * or in case this links disappears, this website. + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainerDeprecated_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainerDeprecated_Inputs| + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainerDeprecated_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainerDeprecated_Input1| + * This input receives the experiment stimulations. As soon as the "train" + * stimulation is received, the spatial filter is computed. + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainerDeprecated_Input1| + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainerDeprecated_Input2| + * This input should receive the whole signal of the session. + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainerDeprecated_Input2| + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainerDeprecated_Input3| + * This input should receive the multiple evoked response potentials. + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainerDeprecated_Input3| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Outputs| + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Output1| + The xDAWN Trainer outputs the stimulation OVTK_StimulationId_TrainCompleted when the training process was successful. No output is produced if the process failed. + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainerDeprecated_Settings| + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainerDeprecated_Settings| + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainerDeprecated_Setting1| + * This setting contains the stimulation to use to trigger the training process. + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainerDeprecated_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainerDeprecated_Setting2| + * This setting tells the box what configuration file to generate. This configuration file can + * be used to set the correct values of a \ref Doc_BoxAlgorithm_SpatialFilter box. + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainerDeprecated_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainerDeprecated_Setting3| + * This setting tells how many dimension should be kept out of the spatial filter. + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainerDeprecated_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainerDeprecated_Examples| + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainerDeprecated_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainerDeprecated_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainerDeprecated_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/MSC_box_settings_example.png b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/MSC_box_settings_example.png new file mode 100644 index 0000000..5099bcf Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/MSC_box_settings_example.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/timebasedepoching_1.png b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/timebasedepoching_1.png new file mode 100644 index 0000000..dd67e34 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/timebasedepoching_1.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/timebasedepoching_2.png b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/timebasedepoching_2.png new file mode 100644 index 0000000..9cf5a33 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/timebasedepoching_2.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/timebasedepoching_3.png b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/timebasedepoching_3.png new file mode 100644 index 0000000..9facd3d Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/doc/timebasedepoching_3.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/signals/eog-artifact.gdf b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/signals/eog-artifact.gdf new file mode 100644 index 0000000..fcefa27 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/signals/eog-artifact.gdf differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmARBurgMethod.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmARBurgMethod.cpp new file mode 100644 index 0000000..1115848 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmARBurgMethod.cpp @@ -0,0 +1,143 @@ +#if defined(TARGET_HAS_ThirdPartyEIGEN) + +#include "ovpCAlgorithmARBurgMethod.h" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CAlgorithmARBurgMethod::initialize() +{ + ip_pMatrix.initialize(this->getInputParameter(OVP_Algorithm_ARBurgMethod_InputParameterId_Matrix)); + op_pMatrix.initialize(this->getOutputParameter(OVP_Algorithm_ARBurgMethod_OutputParameterId_Matrix)); + ip_Order.initialize(this->getInputParameter(OVP_Algorithm_ARBurgMethod_InputParameterId_UInteger)); + + return true; +} + +bool CAlgorithmARBurgMethod::uninitialize() +{ + op_pMatrix.uninitialize(); + ip_pMatrix.uninitialize(); + ip_Order.uninitialize(); + + return true; +} + +bool CAlgorithmARBurgMethod::process() +{ + m_order = size_t(ip_Order); + + const size_t nChannel = ip_pMatrix->getDimensionSize(0); + const size_t samplesPerChannel = ip_pMatrix->getDimensionSize(1); + + CMatrix* iMatrix = ip_pMatrix; + CMatrix* oMatrix = op_pMatrix; + + if (this->isInputTriggerActive(OVP_Algorithm_ARBurgMethod_InputTriggerId_Initialize)) + { + if (iMatrix->getDimensionCount() != 2) + { + this->getLogManager() << Kernel::LogLevel_Error << "The input matrix must have 2 dimensions"; + return false; + } + + if (iMatrix->getDimensionSize(1) < 2 * m_order) + { + this->getLogManager() << Kernel::LogLevel_Error << "The input vector must be greater than twice the order"; + return false; + } + + // Setting size of output + + oMatrix->resize(nChannel, m_order + 1); // The number of coefficients per channel is equal to the order + 1 + + for (size_t i = 0; i < nChannel; ++i) + { + const std::string label = "Channel " + std::to_string(i + 1); + oMatrix->setDimensionLabel(0, i, label); + } + for (size_t i = 0; i < (m_order + 1); ++i) + { + const std::string label = "ARCoeff " + std::to_string(i + 1); + oMatrix->setDimensionLabel(1, i, label); + } + } + + + if (this->isInputTriggerActive(OVP_Algorithm_ARBurgMethod_InputTriggerId_Process)) + { + // Compute the coefficients for each channel + for (size_t j = 0; j < nChannel; ++j) + { + // Initialization of all needed vectors + + m_errForwardPrediction = Eigen::RowVectorXd::Zero(samplesPerChannel); // Error Forward prediction + m_errBackwardPrediction = Eigen::RowVectorXd::Zero(samplesPerChannel); //Error Backward prediction + + m_errForward = Eigen::RowVectorXd::Zero(samplesPerChannel); // Error Forward + m_errBackward = Eigen::RowVectorXd::Zero(samplesPerChannel); // Error Backward + + m_arCoefs = Eigen::RowVectorXd::Zero(m_order + 1); // Vector containing the AR coefficients for each channel, it will be our output vector + m_error = Eigen::RowVectorXd::Zero(m_order + 1); // Total error + + m_k = 0.0; + m_arCoefs(0) = 1.0; + + Eigen::VectorXd arReversed; + arReversed = Eigen::VectorXd::Zero(m_order + 1); + + // Retrieving input datas + for (size_t i = 0; i < samplesPerChannel; ++i) + { + m_errForward(i) = iMatrix->getBuffer()[i + j * (samplesPerChannel)]; // Error Forward is the input matrix at first + m_errBackward(i) = iMatrix->getBuffer()[i + j * (samplesPerChannel)]; //Error Backward is the input matrix at first + + m_error(0) += (iMatrix->getBuffer()[i + j * (samplesPerChannel)] * iMatrix->getBuffer()[i + j * (samplesPerChannel)]) / samplesPerChannel; + } + + // we iterate over the order + for (size_t n = 1; n <= m_order; ++n) + { + const size_t length = samplesPerChannel - n; + + m_errForwardPrediction.resize(length); + m_errBackwardPrediction.resize(length); + + m_errForwardPrediction = m_errForward.tail(length); + m_errBackwardPrediction = m_errBackward.head(length); + + const double num = -2.0 * m_errBackwardPrediction.dot(m_errForwardPrediction); + const double den = (m_errForwardPrediction.dot(m_errForwardPrediction)) + (m_errBackwardPrediction.dot(m_errBackwardPrediction)); + + m_k = num / den; + + // Update errors forward and backward vectors + + m_errForward = m_errForwardPrediction + m_k * m_errBackwardPrediction; + m_errBackward = m_errBackwardPrediction + m_k * m_errForwardPrediction; + + // Compute the AR coefficients + + for (size_t i = 1; i <= n; ++i) { arReversed(i) = m_arCoefs(n - i); } + + m_arCoefs = m_arCoefs + m_k * arReversed; + + // Update Total Error + m_error(n) = (1 - m_k * m_k) * m_error(n - 1); + } + for (size_t i = 0; i <= m_order; ++i) { oMatrix->getBuffer()[i + j * (m_order + 1)] = m_arCoefs(i); } + } + this->activateOutputTrigger(OVP_Algorithm_ARBurgMethod_OutputTriggerId_ProcessDone, true); + } + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyEIGEN diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmARBurgMethod.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmARBurgMethod.h new file mode 100644 index 0000000..d7e1d9c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmARBurgMethod.h @@ -0,0 +1,84 @@ +# pragma once + +#if defined(TARGET_HAS_ThirdPartyEIGEN) + +#include "../../ovp_defines.h" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CAlgorithmARBurgMethod final : public Toolkit::TAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_ARBurgMethod) + +protected: + + Kernel::TParameterHandler ip_pMatrix; // input matrix + Kernel::TParameterHandler op_pMatrix; // output matrix + Kernel::TParameterHandler ip_Order; + +private: + + Eigen::VectorXd m_errForward; // Error Forward + Eigen::VectorXd m_errBackward; //Error Backward + Eigen::VectorXd m_arCoefs; // AutoRegressive Coefficents + + Eigen::VectorXd m_errForwardPrediction; // Error Forward prediction + Eigen::VectorXd m_errBackwardPrediction; //Error Backward prediction + + Eigen::VectorXd m_error; // Total error vector + + double m_k = 0; + size_t m_order = 0; +}; + +class CAlgorithmARBurgMethodDesc final : public IAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("AR Burg's Method algorithm"); } + CString getAuthorName() const override { return CString("Alison Cellard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Extract AR coefficient using Burg's Method"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Signal Processing"); } + CString getVersion() const override { return CString("1.0"); } + virtual CString getStockItemName() const { return CString("gtk-execute"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_ARBurgMethod; } + IPluginObject* create() override { return new CAlgorithmARBurgMethod; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_ARBurgMethod_InputParameterId_Matrix, "Vector", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_ARBurgMethod_OutputParameterId_Matrix, "Coefficents Vector", Kernel::ParameterType_Matrix); + prototype.addInputParameter(OVP_Algorithm_ARBurgMethod_InputParameterId_UInteger, "Order", Kernel::ParameterType_UInteger); + + prototype.addInputTrigger(OVP_Algorithm_ARBurgMethod_InputTriggerId_Initialize, "Initialize"); + prototype.addInputTrigger(OVP_Algorithm_ARBurgMethod_InputTriggerId_Process, "Process"); + prototype.addOutputTrigger(OVP_Algorithm_ARBurgMethod_OutputTriggerId_ProcessDone, "Process done"); + + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_ARBurgMethodDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyEIGEN diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCHilbertTransform.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCHilbertTransform.cpp new file mode 100644 index 0000000..e29e2c5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCHilbertTransform.cpp @@ -0,0 +1,147 @@ +#if defined(TARGET_HAS_ThirdPartyEIGEN) + +#include "ovpCHilbertTransform.h" +#include +#include +#include + +bool HilbertTransform::transform(const Eigen::VectorXcd& in, Eigen::VectorXcd& out) +{ + const size_t nSamples = in.size(); + + // Resize our buffers if input size has changed + if (size_t(m_signalFourier.size()) != nSamples) + { + m_signalFourier = Eigen::VectorXcd::Zero(nSamples); + m_hilbert = Eigen::VectorXcd::Zero(nSamples); + + //Initialization of vector h used to compute analytic signal + m_hilbert(0) = 1.0; + + if (nSamples % 2 == 0) + { + m_hilbert(nSamples / 2) = 1.0; + m_hilbert.segment(1, (nSamples / 2) - 1).setOnes(); + m_hilbert.segment(1, (nSamples / 2) - 1) *= 2.0; + m_hilbert.tail((nSamples / 2) + 1).setZero(); + } + else + { + m_hilbert((nSamples + 1) / 2) = 1.0; + m_hilbert.segment(1, (nSamples / 2)).setOnes(); + m_hilbert.segment(1, (nSamples / 2)) *= 2.0; + m_hilbert.tail(((nSamples + 1) / 2) + 1).setZero(); + } + } + + // Always resize output for safety + out.resize(nSamples); + + //Fast Fourier Transform of input signal + m_fft.fwd(m_signalFourier, in); + + //Apply Hilbert transform by element-wise multiplying fft vector by h + m_signalFourier = m_signalFourier.cwiseProduct(m_hilbert); + + //Inverse Fast Fourier transform + m_fft.inv(out, m_signalFourier); // m_vecXcdSignalBuffer is now the analytical signal of the initial input signal + + return true; +} + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CAlgorithmHilbertTransform::initialize() +{ + ip_matrix.initialize(this->getInputParameter(OVP_Algorithm_HilbertTransform_InputParameterId_Matrix)); + op_hilbertMatrix.initialize(this->getOutputParameter(OVP_Algorithm_HilbertTransform_OutputParameterId_HilbertMatrix)); + op_envelopeMatrix.initialize(this->getOutputParameter(OVP_Algorithm_HilbertTransform_OutputParameterId_EnvelopeMatrix)); + op_phaseMatrix.initialize(this->getOutputParameter(OVP_Algorithm_HilbertTransform_OutputParameterId_PhaseMatrix)); + + return true; +} + +bool CAlgorithmHilbertTransform::uninitialize() +{ + op_hilbertMatrix.uninitialize(); + op_envelopeMatrix.uninitialize(); + op_phaseMatrix.uninitialize(); + ip_matrix.uninitialize(); + + return true; +} + +bool CAlgorithmHilbertTransform::process() +{ + const size_t nChannel = ip_matrix->getDimensionSize(0); + const size_t samplesPerChannel = ip_matrix->getDimensionSize(1); + + CMatrix* matrix = ip_matrix; + CMatrix* hilbert = op_hilbertMatrix; + CMatrix* envelope = op_envelopeMatrix; + CMatrix* phase = op_phaseMatrix; + + if (this->isInputTriggerActive(OVP_Algorithm_HilbertTransform_InputTriggerId_Initialize)) //Check if the input is correct + { + if (matrix->getDimensionCount() != 2) + { + this->getLogManager() << Kernel::LogLevel_Error << "The input matrix must have 2 dimensions, here the dimension is " << matrix->getDimensionCount() + << "\n"; + return false; + } + + if (matrix->getDimensionSize(1) < 2) + { + this->getLogManager() << Kernel::LogLevel_Error << "Can't compute Hilbert transform on data length " << matrix->getDimensionSize(1) << "\n"; + return false; + } + + //Setting size of outputs + + hilbert->resize(nChannel, samplesPerChannel); + envelope->resize(nChannel, samplesPerChannel); + phase->resize(nChannel, samplesPerChannel); + + for (size_t i = 0; i < nChannel; ++i) + { + hilbert->setDimensionLabel(0, i, matrix->getDimensionLabel(0, i)); + envelope->setDimensionLabel(0, i, matrix->getDimensionLabel(0, i)); + phase->setDimensionLabel(0, i, matrix->getDimensionLabel(0, i)); + } + } + + if (this->isInputTriggerActive(OVP_Algorithm_HilbertTransform_InputTriggerId_Process)) + { + //Compute Hilbert transform for each channel separately + for (size_t c = 0; c < nChannel; ++c) + { + // We cannot do a simple ptr assignment here as we need to convert real input to a complex vector + Eigen::VectorXcd vecXcdSingleChannel = Eigen::VectorXcd::Zero(samplesPerChannel); + const double* buffer = &matrix->getBuffer()[c * samplesPerChannel]; + for (size_t samples = 0; samples < samplesPerChannel; ++samples) + { + vecXcdSingleChannel(samples) = buffer[samples]; + vecXcdSingleChannel(samples).imag(0.0); + } + + Eigen::VectorXcd vecXcdSingleChannelTransformed; + m_hilbert.transform(vecXcdSingleChannel, vecXcdSingleChannelTransformed); + + //Compute envelope and phase and pass them to the corresponding outputs + for (size_t s = 0; s < samplesPerChannel; ++s) + { + hilbert->getBuffer()[s + c * samplesPerChannel] = vecXcdSingleChannelTransformed(s).imag(); + envelope->getBuffer()[s + c * samplesPerChannel] = abs(vecXcdSingleChannelTransformed(s)); + phase->getBuffer()[s + c * samplesPerChannel] = arg(vecXcdSingleChannelTransformed(s)); + } + } + } + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE +#endif //TARGET_HAS_ThirdPartyEIGEN diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCHilbertTransform.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCHilbertTransform.h new file mode 100644 index 0000000..c8a1768 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCHilbertTransform.h @@ -0,0 +1,93 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyEIGEN) + +#include "../../ovp_defines.h" +#include +#include +#include +#include + +// This class could be in its own file +class HilbertTransform +{ +public: + + bool transform(const Eigen::VectorXcd& in, Eigen::VectorXcd& out); + +private: + Eigen::VectorXcd m_signalFourier; // Fourier Transform of the input signal + Eigen::VectorXcd m_hilbert; // Vector h used to apply Hilbert transform + + Eigen::FFT> m_fft; // Instance of the fft transform +}; + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CAlgorithmHilbertTransform final : public Toolkit::TAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_HilbertTransform) + + +protected: + + Kernel::TParameterHandler ip_matrix; //input matrix + Kernel::TParameterHandler op_hilbertMatrix; //output matrix 1 : Hilbert transform of the signal + Kernel::TParameterHandler op_envelopeMatrix; //output matrix 2 : Envelope of the signal + Kernel::TParameterHandler op_phaseMatrix; //output matrix 3 : Phase of the signal + + HilbertTransform m_hilbert; // Instance of the Hilbert transform doing the actual computation +}; + +class CAlgorithmHilbertTransformDesc final : public IAlgorithmDesc +{ +public: + void release() override { } + + CString getName() const override { return CString("Hilbert Transform"); } + CString getAuthorName() const override { return CString("Alison Cellard"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Computes the Hilbert transform of a signal"); } + + CString getDetailedDescription() const override + { + return CString("Give the analytic signal ua(t) = u(t) + iH(u(t)) of the input signal u(t) using Hilbert transform"); + } + + CString getCategory() const override { return CString("Signal processing/Basic"); } + CString getVersion() const override { return CString("0.2"); } + virtual CString getStockItemName() const { return CString("gtk-execute"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_HilbertTransform; } + IPluginObject* create() override { return new CAlgorithmHilbertTransform; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_HilbertTransform_InputParameterId_Matrix, "Matrix", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_HilbertTransform_OutputParameterId_HilbertMatrix, "Hilbert Matrix", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_HilbertTransform_OutputParameterId_EnvelopeMatrix, "Envelope Matrix", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_HilbertTransform_OutputParameterId_PhaseMatrix, "Phase Matrix", Kernel::ParameterType_Matrix); + + prototype.addInputTrigger(OVP_Algorithm_HilbertTransform_InputTriggerId_Initialize, "Initialize"); + prototype.addInputTrigger(OVP_Algorithm_HilbertTransform_InputTriggerId_Process, "Process"); + prototype.addOutputTrigger(OVP_Algorithm_HilbertTransform_OutputTriggerId_ProcessDone, "Process done"); + + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_HilbertTransformDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE + +#endif //TARGET_HAS_ThirdPartyEIGEN diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCMatrixVariance.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCMatrixVariance.cpp new file mode 100644 index 0000000..5a216fe --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCMatrixVariance.cpp @@ -0,0 +1,230 @@ +#if defined(TARGET_HAS_ThirdPartyITPP) + +#include "ovpCMatrixVariance.h" + +#include + +// the boost version used at the moment of writing this caused 4800 by internal call to "int _isnan" in a bool-returning function. +#if defined(WIN32) +#pragma warning (disable : 4800) +#endif + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CMatrixVariance::initialize() +{ + ip_averagingMethod.initialize(getInputParameter(OVP_Algorithm_MatrixVariance_InputParameterId_AveragingMethod)); + ip_matrixCount.initialize(getInputParameter(OVP_Algorithm_MatrixVariance_InputParameterId_MatrixCount)); + ip_significanceLevel.initialize(getInputParameter(OVP_Algorithm_MatrixVariance_InputParameterId_SignificanceLevel)); + ip_matrix.initialize(getInputParameter(OVP_Algorithm_MatrixVariance_InputParameterId_Matrix)); + op_averagedMatrix.initialize(getOutputParameter(OVP_Algorithm_MatrixVariance_OutputParameterId_AveragedMatrix)); + op_varianceMatrix.initialize(getOutputParameter(OVP_Algorithm_MatrixVariance_OutputParameterId_Variance)); + op_confidenceBound.initialize(getOutputParameter(OVP_Algorithm_MatrixVariance_OutputParameterId_ConfidenceBound)); + + return true; +} + +bool CMatrixVariance::uninitialize() +{ + for (auto it = m_history.begin(); it != m_history.end(); ++it) { delete *it; } + m_history.clear(); + + op_averagedMatrix.uninitialize(); + op_varianceMatrix.uninitialize(); + op_confidenceBound.uninitialize(); + ip_matrix.uninitialize(); + ip_matrixCount.uninitialize(); + ip_averagingMethod.uninitialize(); + ip_significanceLevel.uninitialize(); + + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CMatrixVariance::process() +{ + CMatrix* iMatrix = ip_matrix; + //CMatrix* oMatrix=op_pAveragedMatrix; + + bool shouldPerformAverage = false; + + if (this->isInputTriggerActive(OVP_Algorithm_MatrixVariance_InputTriggerId_Reset)) + { + m_mean.set_size(int(ip_matrix->getBufferElementCount())); + m_mean.zeros(); + m_m.set_size(int(ip_matrix->getBufferElementCount())); + m_m.zeros(); + m_variance.set_size(int(ip_matrix->getBufferElementCount())); + m_variance.zeros(); + m_inputCounter = 0; + + for (auto it = m_history.begin(); it != m_history.end(); ++it) { delete *it; } + m_history.clear(); + + op_averagedMatrix->copyDescription(*iMatrix); + op_varianceMatrix->copyDescription(*iMatrix); + op_confidenceBound->copyDescription(*iMatrix); + } + + if (this->isInputTriggerActive(OVP_Algorithm_MatrixVariance_InputTriggerId_FeedMatrix)) + { + const int nElement = int(iMatrix->getBufferElementCount()); + if (ip_averagingMethod == size_t(EEpochAverageMethod::Moving)) + { + //CMatrix* swapMatrix= nullptr; + + if (m_history.size() >= ip_matrixCount) + { + delete m_history.front(); + m_history.pop_front(); + } + /*else + { + swapMatrix=new CMatrix(); + swapMatrix->copyDescription(*iMatrix); + }*/ + //swapMatrix->copyContent(*iMatrix); + + itpp::Vec* matrices = new itpp::Vec(iMatrix->getBuffer(), nElement); + m_history.push_back(matrices); + shouldPerformAverage = (m_history.size() == ip_matrixCount); + } + else if (ip_averagingMethod == size_t(EEpochAverageMethod::MovingImmediate)) + { + //CMatrix* swapMatrix= nullptr; + + if (m_history.size() >= ip_matrixCount) + { + delete m_history.front(); + m_history.pop_front(); + } + /*else + { + swapMatrix=new CMatrix(); + swapMatrix->copyDescription(*iMatrix); + }*/ + + //swapMatrix->copyContent(*iMatrix); + + itpp::Vec* matrices = new itpp::Vec(iMatrix->getBuffer(), nElement); + m_history.push_back(matrices); + shouldPerformAverage = (!m_history.empty()); + } + else if (ip_averagingMethod == size_t(EEpochAverageMethod::Block)) + { + //CMatrix* swapMatrix=new CMatrix(); + + if (m_history.size() >= ip_matrixCount) + { + for (auto it = m_history.begin(); it != m_history.end(); ++it) { delete *it; } + m_history.clear(); + } + + //swapMatrix->copy(*iMatrix); + + itpp::Vec* matrices = new itpp::Vec(iMatrix->getBuffer(), nElement); + m_history.push_back(matrices); + shouldPerformAverage = (m_history.size() == ip_matrixCount); + } + else if (ip_averagingMethod == size_t(EEpochAverageMethod::Cumulative)) + { + if (!m_history.empty()) + { + //std::cout << "size of history " << m_history.size() << "\n"; + delete m_history.front(); + m_history.pop_front(); + } + //else { std::cout << "history empty \n"; } + //CMatrix* swapMatrix=new CMatrix(); + //swapMatrix->copy(*iMatrix); + + itpp::Vec* matrices = new itpp::Vec(iMatrix->getBuffer(), nElement); + m_history.push_back(matrices); + shouldPerformAverage = (!m_history.empty()); + } + else { shouldPerformAverage = false; } + } + + if (shouldPerformAverage) + { + if (!m_history.empty()) + { + boost::math::students_t_distribution distrib(2); + if (ip_averagingMethod == size_t(EEpochAverageMethod::Cumulative)) + { + //incremental estimation of mean and variance + for (auto it = m_history.begin(); it != m_history.end(); ++it) + { + m_inputCounter++; + itpp::Vec buffer = **it; + itpp::Vec delta = buffer - m_mean; + m_mean += delta / double(m_inputCounter); + m_m += elem_mult(delta, (buffer - m_mean)); + if (m_inputCounter > 1) { m_variance = m_m / double(m_inputCounter - 1); } + } + distrib = boost::math::students_t_distribution(m_inputCounter <= 1 ? 1 : m_inputCounter - 1); + //CMatrix swapMatrix(); + //getLogManager() << Kernel::LogLevel_Info << "Variance first element " << m_Variance[0] << ", last element " << m_Variance[iMatrix->getBufferElementCount()-1] << "\n"; + + memcpy(op_averagedMatrix->getBuffer(), m_mean._data(), iMatrix->getBufferElementCount() * sizeof(double)); + memcpy(op_varianceMatrix->getBuffer(), m_variance._data(), iMatrix->getBufferElementCount() * sizeof(double)); + } + else + { + distrib = boost::math::students_t_distribution(double(ip_matrixCount) - 1); + + op_varianceMatrix->resetBuffer(); + op_averagedMatrix->resetBuffer(); + + const size_t count = op_averagedMatrix->getBufferElementCount(); + const double scale = 1. / m_history.size(); + + for (auto& h : m_history) + { + //batch computation of mean + itpp::Vec buffer = *h; + double* averageBuffer = op_averagedMatrix->getBuffer(); + for (int i = 0; i < int(count); ++i) + { + *averageBuffer += buffer[i] * scale; + averageBuffer++; + } + //batch computation of variance + averageBuffer = op_averagedMatrix->getBuffer(); + double* matrixVarianceBuffer = op_varianceMatrix->getBuffer(); + for (int i = 0; i < int(count); ++i) + { + *matrixVarianceBuffer += (buffer[i] - *(averageBuffer + i)) * (buffer[i] - *(averageBuffer + i)) / (m_history.size() - 1.0F); + matrixVarianceBuffer++; + } + } + m_variance = itpp::Vec(op_averagedMatrix->getBuffer(), int(count)); + } + + //computing confidence bounds + const double q = double(quantile(complement(distrib, ip_significanceLevel / 2.0))); + getLogManager() << Kernel::LogLevel_Debug << "Quantile at " << ip_significanceLevel << " is " << q << "\n"; + itpp::Vec bound; + if (ip_averagingMethod == size_t(EEpochAverageMethod::Cumulative)) { bound = (q / sqrt(double(m_inputCounter))) * itpp::sqrt(m_variance); } + else { bound = (q / double(ip_matrixCount)) * itpp::sqrt(m_variance); } + memcpy(op_confidenceBound->getBuffer(), bound._data(), iMatrix->getBufferElementCount() * sizeof(double)); + } + + this->activateOutputTrigger(OVP_Algorithm_MatrixVariance_OutputTriggerId_AveragePerformed, true); + } + + return true; +} + +#endif +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCMatrixVariance.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCMatrixVariance.h new file mode 100644 index 0000000..58c1589 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCMatrixVariance.h @@ -0,0 +1,90 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyITPP) + +#include "../../ovp_defines.h" + +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CMatrixVariance final : public Toolkit::TAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_MatrixVariance) + +protected: + + Kernel::TParameterHandler ip_averagingMethod; + Kernel::TParameterHandler ip_matrixCount; + Kernel::TParameterHandler ip_significanceLevel; + Kernel::TParameterHandler ip_matrix; + Kernel::TParameterHandler op_averagedMatrix; + Kernel::TParameterHandler op_varianceMatrix; + Kernel::TParameterHandler op_confidenceBound; + + std::deque*> m_history; + + itpp::Vec m_mean; + itpp::Vec m_m; + itpp::Vec m_variance; + size_t m_inputCounter = 0; +}; + +class CMatrixVarianceDesc final : public IAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Matrix variance"); } + CString getAuthorName() const override { return CString("Dieter Devlaminck"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Signal processing/Basic"); } + CString getVersion() const override { return CString("1.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_MatrixVariance; } + IPluginObject* create() override { return new CMatrixVariance(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_MatrixVariance_InputParameterId_Matrix, "Matrix", Kernel::ParameterType_Matrix); + prototype.addInputParameter(OVP_Algorithm_MatrixVariance_InputParameterId_MatrixCount, "Matrix count", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_MatrixVariance_InputParameterId_SignificanceLevel, "Significance Level", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_MatrixVariance_InputParameterId_AveragingMethod, "Averaging Method", Kernel::ParameterType_UInteger); + + prototype.addOutputParameter(OVP_Algorithm_MatrixVariance_OutputParameterId_AveragedMatrix, "Averaged matrix", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_MatrixVariance_OutputParameterId_Variance, "Matrix variance", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_MatrixVariance_OutputParameterId_ConfidenceBound, "Confidence bound", Kernel::ParameterType_Matrix); + + prototype.addInputTrigger(OVP_Algorithm_MatrixVariance_InputTriggerId_Reset, "Reset"); + prototype.addInputTrigger(OVP_Algorithm_MatrixVariance_InputTriggerId_FeedMatrix, "Feed matrix"); + prototype.addInputTrigger(OVP_Algorithm_MatrixVariance_InputTriggerId_ForceAverage, "Force average"); + + prototype.addOutputTrigger(OVP_Algorithm_MatrixVariance_OutputTriggerId_AveragePerformed, "Average performed"); + + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_MatrixVarianceDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE + +#endif diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/windowFunctions.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/windowFunctions.cpp new file mode 100644 index 0000000..4033d5f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/windowFunctions.cpp @@ -0,0 +1,92 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file windowFunctions.cpp +/// \brief Implementation of Windowing functions +/// \author Alison Cellard +/// \version 1.0 +/// \date 13/11/2013 +/// +/// \copyright (C) 2021 INRIA +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see . +///------------------------------------------------------------------------------------------------- +#if defined(TARGET_HAS_ThirdPartyEIGEN) + +#include "windowFunctions.hpp" +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +namespace WindowFunctions { + +bool bartlett(Eigen::VectorXd& window, const size_t size) +{ + for (size_t i = 0; i < size; ++i) + { + if (i <= (size - 1) / 2) + { + window(i) = 2. * i / (size - 1); + } + else if (i < size) { + window(i) = 2. * ((size - 1) - i) / (size - 1); + } + } + return true; +} + +bool hamming(Eigen::VectorXd& window, const size_t size) +{ + for (size_t i = 0; i < size; ++i) + { + window(i) = 0.54 - 0.46 * cos(2. * M_PI * i / (size - 1)); + } + return true; +} + +bool hann(Eigen::VectorXd& window, const size_t size) +{ + for (size_t i = 0; i < size; ++i) + { + window(i) = 0.5 - 0.5 * cos(2. * M_PI * i / (size - 1)); + } + return true; +} + + +bool parzen(Eigen::VectorXd& window, const size_t size) +{ + for (size_t i = 0; i < size; ++i) + { + window(i) = 1. - pow((i - (size - 1.) / 2.) / ((size + 1.) / 2.), 2); + } + return true; +} + + +bool welch(Eigen::VectorXd& window, const size_t size) +{ + for (size_t i = 0; i < size; ++i) + { + window(i) = 1.0 - fabs((i - (size - 1.0) / 2.0) / ((size + 1.0) / 2.0)); + } + return true; +} + +} //namespace WindowFunctions +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE + +#endif //TARGET_HAS_ThirdPartyEIGEN diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/windowFunctions.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/windowFunctions.hpp new file mode 100644 index 0000000..787f162 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/basic/windowFunctions.hpp @@ -0,0 +1,77 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file windowFunctions.hpp +/// \brief Windowing functions and helpers for Connectivity Measure +/// \author Alison Cellard +/// \version 1.0 +/// \date 13/11/2013 +/// +/// \copyright (C) 2021 INRIA +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see . +///------------------------------------------------------------------------------------------------- +#pragma once + +#if defined(TARGET_HAS_ThirdPartyEIGEN) + +#include +#include + + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +namespace WindowFunctions { + +/// +/// \brief Generate Bartlett window +/// \param windowBuffer The buffer in which the window is stored +/// \param size The size of the window +/// \return True +bool bartlett(Eigen::VectorXd& window, const size_t size); + +/// +/// \brief Generate Hamming window +/// \param windowBuffer The buffer in which the window is stored +/// \param size The size of the window +/// \return True +bool hamming(Eigen::VectorXd& window, const size_t size); + +/// +/// \brief Generate Hann window +/// \param windowBuffer The buffer in which the window is stored +/// \param size The size of the window +/// \return True +bool hann(Eigen::VectorXd& window, const size_t size); + +/// +/// \brief Generate Parzen window +/// \param windowBuffer The buffer in which the window is stored +/// \param size The size of the window +/// \return True +bool parzen(Eigen::VectorXd& window, const size_t size); + +/// +/// \brief Generate Welch window +/// \param windowBuffer The buffer in which the window is stored +/// \param size The size of the window +/// \return True +bool welch(Eigen::VectorXd& window, const size_t size); + +} // namespace WindowFunctions +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE + +#endif //TARGET_HAS_ThirdPartyEIGEN diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/connectivity/connectivityMeasure.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/connectivity/connectivityMeasure.cpp new file mode 100644 index 0000000..73fed1e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/connectivity/connectivityMeasure.cpp @@ -0,0 +1,289 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file connectivityMeasureMetrics.cpp +/// \brief All connectivity metrics. +/// \author Arthur Desbois (Inria). +/// \version 1.0 +/// \date 30/10/2020 +/// +/// \copyright (C) 2020 INRIA +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see . +///------------------------------------------------------------------------------------------------- + +#include +#include +#include + + +#include +#include + +#include "connectivityMeasure.hpp" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +//************************************************************************ +//******* Connectivity measurements & associated helper functions ******** +//************************************************************************ + +bool ConnectivityMeasure::initialize(const EConnectMetric metric, + EConnectWindowMethod windowMethod, + int windowLength, + int windowOverlap, + size_t nbChannels, + size_t fftSize, + bool dcRemoval) +{ + m_metric = metric; + m_windowMethod = windowMethod; + + m_windowLength = windowLength; // size of one welch window (samples) + m_windowOverlap = windowOverlap; // overlap btw windows (%) + m_windowOverlapSamples = std::floor(double(m_windowLength * windowOverlap) / 100.0); + + m_nbChannels = nbChannels; + m_fftSize = fftSize; + m_dcRemoval = dcRemoval; + + m_window = Eigen::VectorXd::Zero(m_windowLength); + switch (m_windowMethod) + { + case EConnectWindowMethod::Hamming: + WindowFunctions::hamming(m_window, m_windowLength); + break; + case EConnectWindowMethod::Hann: + WindowFunctions::hann(m_window, m_windowLength); + break; + case EConnectWindowMethod::Welch: + WindowFunctions::welch(m_window, m_windowLength); + break; + } + + // window normalization constant + m_u = 0; + for (size_t i = 0; i < size_t(m_window.size()); ++i) + { + m_u += std::pow(m_window(i), 2); + } + + // Instantiate the big spectra & x-spectra arrays + m_dft.resize(m_nbChannels); // vector of channels x fftsize + m_psd.resize(m_nbChannels); // vector of channels x fftsize + m_cpsd.resize(m_nbChannels); // matrix of channels x channels x fftsize + for (size_t chan = 0; chan < m_nbChannels; chan++) + { + m_cpsd[chan].resize(m_nbChannels); + } + + return true; +} + +bool ConnectivityMeasure::process(const std::vector & samples, + std::vector & connectivityMatrix) +{ + // Windowing + size_t windowShift = m_window.size() - m_windowOverlapSamples; + size_t nbWindows = std::floor(double(samples[0].size() - windowShift) / double(windowShift)); + + // Remove the DC component of each channel + std::vector mySamples; + if (m_dcRemoval) + { + for (size_t chan = 0; chan < m_nbChannels; chan++) + { + Eigen::VectorXd temp = samples[chan] - Eigen::VectorXd::Ones(samples[chan].size()) * samples[chan].mean(); + mySamples.push_back(temp); + } + } else + { + mySamples = samples; + } + + // TODO : don't recompute the whole set of DFTs, because connectivity measures overlap ! + // Periodigrams (DFTs) + for (size_t chan = 0; chan < m_nbChannels; chan++) + { + periodogram(mySamples[chan], m_dft[chan], nbWindows); + } + + // PSDs + for (size_t chan = 0; chan < m_nbChannels; chan++) + { + powerSpectralDensity(m_dft[chan], m_psd[chan], nbWindows); + } + + + // Cross-SPECTRA + for (size_t chan1 = 0; chan1 < m_nbChannels; chan1++) + { + for (size_t chan2 = chan1; chan2 < m_nbChannels; chan2++) + { + crossSpectralDensity(m_dft[chan1], m_dft[chan2], m_cpsd[chan1][chan2], nbWindows); + } + } + + // Use PSDs & x-spectra to compute the connectivity matrix + switch (m_metric) + { + case EConnectMetric::Coherence: + return coherence(connectivityMatrix); + case EConnectMetric::MagnitudeSquaredCoherence: + return magnitudeSquaredCoherence(connectivityMatrix); + case EConnectMetric::ImaginaryCoherence: + return imaginaryCoherence(connectivityMatrix); + case EConnectMetric::AbsImaginaryCoherence: + return absImaginaryCoherence(connectivityMatrix); + default: + return coherence(connectivityMatrix); + } +} + +bool ConnectivityMeasure::periodogram(const Eigen::VectorXd& input, + Eigen::MatrixXcd& periodograms, + const size_t& nSegments) +{ + periodograms = Eigen::MatrixXcd::Zero(m_fftSize, nSegments); + + // Cut input vector into segments, and apply window to each segment + for (size_t k = 0; k < nSegments; ++k) + { + Eigen::VectorXd segment = Eigen::VectorXd::Zero(m_fftSize); + + for (size_t i = 0; i < size_t(m_windowLength); ++i) + { + segment(i) = input(i + k * m_windowOverlapSamples) * m_window(i); + } + + Eigen::VectorXcd dft = Eigen::VectorXcd::Zero(m_fftSize); + + m_fft.fwd(dft, segment, m_fftSize); + periodograms.col(k) = dft; + + } + return true; +} + + +bool ConnectivityMeasure::powerSpectralDensity(const Eigen::MatrixXcd& dft, + Eigen::VectorXd& output, + const size_t& nSegments) +{ + // output(i) will be the power for the band i across segments (time) as summed from the periodogram + output = Eigen::VectorXd::Zero(m_fftSize); + + for (size_t k = 0; k < nSegments; ++k) + { + output += dft.col(k).cwiseAbs2(); + } + double factor = double(nSegments) * m_u; + output /= factor; + return true; +} + + +bool ConnectivityMeasure::crossSpectralDensity(const Eigen::MatrixXcd& dft1, + const Eigen::MatrixXcd& dft2, + Eigen::VectorXcd& output, + const size_t& nSegments) +{ + output = Eigen::VectorXcd::Zero(m_fftSize); + + for (size_t k = 0; k < nSegments; ++k) + { + output += dft2.col(k).cwiseProduct(dft1.col(k).conjugate()); + } + double factor = double(nSegments) * m_u; + output /= factor; + return true; +} + + +bool ConnectivityMeasure::coherence(std::vector & connectivityMatrix) +{ + for (size_t chan1 = 0; chan1 < m_nbChannels; chan1++) + { + + connectivityMatrix[chan1].row(chan1) = Eigen::VectorXd::Zero(m_psd[0].size()); + + for (size_t chan2 = chan1 + 1; chan2 < m_nbChannels; chan2++) + { + connectivityMatrix[chan1].row(chan2) = m_cpsd[chan1][chan2].cwiseAbs2().cwiseQuotient( + m_psd[chan1].cwiseProduct(m_psd[chan2])).cwiseSqrt(); + connectivityMatrix[chan2].row(chan1) = connectivityMatrix[chan1].row(chan2); + } + } + return true; +} + +bool ConnectivityMeasure::magnitudeSquaredCoherence(std::vector & connectivityMatrix) +{ + for (size_t chan1 = 0; chan1 < m_nbChannels; chan1++) + { + + connectivityMatrix[chan1].row(chan1) = Eigen::VectorXd::Zero(m_psd[0].size()); + + for (size_t chan2 = chan1 + 1; chan2 < m_nbChannels; chan2++) + { + + connectivityMatrix[chan1].row(chan2) = m_cpsd[chan1][chan2].cwiseAbs2().cwiseQuotient( m_psd[chan1].cwiseProduct(m_psd[chan2]) ); + connectivityMatrix[chan2].row(chan1) = connectivityMatrix[chan1].row(chan2); + } + } + return true; +} + +bool ConnectivityMeasure::imaginaryCoherence(std::vector & connectivityMatrix) +{ + for (size_t chan1 = 0; chan1 < m_nbChannels; chan1++) + { + + connectivityMatrix[chan1].row(chan1) = Eigen::VectorXd::Zero(m_psd[0].size()); + + for (size_t chan2 = chan1 + 1; chan2 < m_nbChannels; chan2++) + { + + connectivityMatrix[chan1].row(chan2) = m_cpsd[chan1][chan2].imag().cwiseQuotient( + m_psd[chan1].cwiseProduct(m_psd[chan2]).cwiseSqrt()); + connectivityMatrix[chan2].row(chan1) = connectivityMatrix[chan1].row(chan2); + } + } + return true; +} + +bool ConnectivityMeasure::absImaginaryCoherence(std::vector & connectivityMatrix) +{ + for (size_t chan1 = 0; chan1 < m_nbChannels; chan1++) + { + + connectivityMatrix[chan1].row(chan1) = Eigen::VectorXd::Zero(m_psd[0].size()); + + for (size_t chan2 = chan1 + 1; chan2 < m_nbChannels; chan2++) + { + + connectivityMatrix[chan1].row(chan2) = m_cpsd[chan1][chan2].imag().cwiseAbs().cwiseQuotient( + m_psd[chan1].cwiseProduct(m_psd[chan2]).cwiseSqrt()); + connectivityMatrix[chan2].row(chan1) = connectivityMatrix[chan1].row(chan2); + } + } + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/connectivity/connectivityMeasure.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/connectivity/connectivityMeasure.hpp new file mode 100644 index 0000000..f636f41 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/algorithms/connectivity/connectivityMeasure.hpp @@ -0,0 +1,263 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file connectivityMeasureMetrics.hpp +/// \brief All connectivity metrics. +/// \author Arthur Desbois (Inria). +/// \version 1.0 +/// \date 30/10/2020 +/// +/// \copyright (C) 2020 INRIA +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see . +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include + +#include +#include + +#include + + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +/// \brief Enumeration of metrics. +enum class EConnectMetric +{ + Coherence, + MagnitudeSquaredCoherence, + ImaginaryCoherence, + AbsImaginaryCoherence +}; + +/// \brief Convert Metrics to string. +/// \param metric The metric. +/// \return The metric as human readable string +inline std::string toString(const EConnectMetric metric) +{ + switch (metric) + { + case EConnectMetric::Coherence: + return "Coherence"; + case EConnectMetric::MagnitudeSquaredCoherence: + return "MagnitudeSquaredCoherence"; + case EConnectMetric::ImaginaryCoherence: + return "ImaginaryCoherence"; + case EConnectMetric::AbsImaginaryCoherence: + return "AbsImaginaryCoherence"; + } +} + +/// \brief Convert string to Metric. +/// \param metric The metric as a string +/// \return \ref EConnectMetric +inline EConnectMetric StringToMetric(const std::string& metric) +{ + if (metric == "Coherence") + { return EConnectMetric::Coherence; } + if (metric == "MagnitudeSquaredCoherence") + { return EConnectMetric::MagnitudeSquaredCoherence; } + if (metric == "ImaginaryCoherence") + { return EConnectMetric::ImaginaryCoherence; } + if (metric == "AbsImaginaryCoherence") + { return EConnectMetric::AbsImaginaryCoherence; } + + return EConnectMetric::Coherence; // default +} + +/// \brief Enumeration of windowing methods +enum class EConnectWindowMethod +{ + Hamming, + Hann, + Welch +}; + +/// \brief Convert Window method to string. +/// \param metric The metric. +/// \return the window method as human readable string +inline std::string toString(const EConnectWindowMethod winMethod) +{ + switch (winMethod) + { + case EConnectWindowMethod::Hamming: + return "Hamming"; + case EConnectWindowMethod::Hann: + return "Hann"; + case EConnectWindowMethod::Welch: + return "Welch"; + } +} + +class ConnectivityMeasure +{ +public: + ConnectivityMeasure() + {}; + + ~ConnectivityMeasure() + {}; + + bool initialize(const EConnectMetric metric, + EConnectWindowMethod windowMethod, + int windowLength, int windowOverlap, + size_t nbChannels, size_t fftSize, + bool dcRemoval); + + /// \brief Select the function to call for the connectivity measurement. + /// \param samples The input data set \f$x\f$. With \f$ nChan \f$ channels and \f$ nSamp \f$ samples per channel + /// \param connectivityMatrix The connectivity matrix + /// \param metric The chosen metric + /// \param windowsMethod The windowing method + /// \param windowLength The length of one window of processing (eg for Welch) + /// \param windowOverlap The overlap btw windows + /// \param connectLength The length of one connectivity measurement window + /// \param connectOverlap The overlap btw connectivity windows + bool process(const std::vector & samples, + std::vector & connectivityMatrix); + +private: + /// \brief Calculation of the Coherence + /// \f$ Pxx = PSD of x \f$ // \f$ Pyy = PSD of y \f$ // \f$ Sxy = cross spectral density of x and y \f$ + /// \f$ MSC = \frac{\left| Sxy \right|}{sqrt{(Pxx.Pyy)} } \f$ + /// + /// The connectivity matrix is symmetrical, so we only need to compute its top part + /// and discard the diagonal (no need to compute connectivity of a single channel...) + /// eg [0 1 2 3] : + /// [ 01 02 03] + /// [ 12 13] + /// [ 23] + /// [ ] + /// \param connectivityMatrix The connectivity matrix as a vector of 2D Matrices of size nbChannels x (nbChannles x frequency_taps) + /// \return True if it succeeds, false if it fails. + /// \todo don't recompute the whole table, because connectivity measures overlap ! + bool coherence(std::vector & connectivityMatrix); + + /// \brief Calculation of the Magnitude Squared Coherence + /// \f$ Pxx = PSD of x \f$ // \f$ Pyy = PSD of y \f$ // \f$ Sxy = cross spectral density of x and y \f$ + /// \f$ MSC = \frac{\left| Sxy \right|^2}{(Pxx.Pyy)} \f$ + /// + /// The connectivity matrix is symmetrical, so we only need to compute its top part + /// and discard the diagonal (no need to compute connectivity of a single channel...) + /// eg [0 1 2 3] : + /// [ 01 02 03] + /// [ 12 13] + /// [ 23] + /// [ ] + /// \param connectivityMatrix The connectivity matrix as a vector of 2D Matrices of size nbChannels x (nbChannles x frequency_taps) + /// \return True if it succeeds, false if it fails. + /// \todo don't recompute the whole table, because connectivity measures overlap ! + bool magnitudeSquaredCoherence(std::vector & connectivityMatrix); + + /// \brief Calculation of the Imaginary part of the coherence + /// \f$ Pxx = PSD of x \f$ // \f$ Pyy = PSD of y \f$ // \f$ Sxy = cross spectral density of x and y \f$ + /// \f$ ImC = \frac{Im(Sxy)}{sqrt{Pxx.Pyy} } \f$ + /// The connectivity matrix is symmetrical, so we only need to compute + /// its top part, and discard the diagonal (no need to compute connectivity of a single channel...) + /// eg [0 1 2 3] : + /// [ 01 02 03] + /// [ 12 13] + /// [ 23] + /// [ ] + /// \param connectivityMatrix The connectivity matrix as a vector of 2D Matrices of size nbChannels x (nbChannles x frequency_taps) + /// \return True if it succeeds, false if it fails. + /// \todo don't recompute the whole table, because connectivity measures overlap ! + bool imaginaryCoherence(std::vector & connectivityMatrix); + + /// \brief Calculation of the absolute value of the Imaginary part of the coherence + /// \f$ Pxx = PSD of x \f$ // \f$ Pyy = PSD of y \f$ // \f$ Sxy = cross spectral density of x and y \f$ + /// \f$ ImC = \frac{\left| Im(Sxy) \right|}{sqrt{Pxx.Pyy} } \f$ + /// The connectivity matrix is symmetrical, so we only need to compute + /// its top part, and discard the diagonal (no need to compute connectivity of a single channel...) + /// eg [0 1 2 3] : + /// [ 01 02 03] + /// [ 12 13] + /// [ 23] + /// [ ] + /// \param connectivityMatrix The connectivity matrix as a vector of 2D Matrices of size nbChannels x (nbChannles x frequency_taps) + /// \return True if it succeeds, false if it fails. + /// \todo don't recompute the whole table, because connectivity measures overlap ! + bool absImaginaryCoherence(std::vector & connectivityMatrix); + + /// + /// \brief Generates periodigram of signal + /// \param input The signal + /// \param periodograms The generated periodigram + /// \param nSegments + /// \return True on succes, false otherwise + bool periodogram(const Eigen::VectorXd& input, + Eigen::MatrixXcd& periodograms, + const size_t& nSegments); + + /// + /// \brief Computes the spectral density of a spectrum + /// \param dft The discrete fourier transform + /// \param output The generated spectral density + /// \param nSegments + /// \return True on success, false otherwise + bool powerSpectralDensity(const Eigen::MatrixXcd& dft, + Eigen::VectorXd& output, + const size_t& nSegments); + + /// + /// \brief Computes cross spectral density of 2 spectra + /// Only computes the top diagonal of the CPSD matrix + /// eg [0 1 2 3] : + /// [00 01 02 03] + /// [ 11 12 13] + /// [ 22 23] + /// [ 33] + /// \param dft1 The first discrete fourier transform + /// \param dft2 The second discrete fourier transform + /// \param output The generated cross spectral density matrix + /// \param nSegments + /// \return True on success, false otherwise + /// + /// \todo : don't compute only the top part, because some connectivity measurements are not symmetrical ? + bool crossSpectralDensity(const Eigen::MatrixXcd& dft1, + const Eigen::MatrixXcd& dft2, + Eigen::VectorXcd& output, + const size_t& nSegments); + + // Parameters / Members + Eigen::FFT> m_fft; // Instance of the fft transform + + EConnectMetric m_metric = EConnectMetric::Coherence; + EConnectWindowMethod m_windowMethod = EConnectWindowMethod::Hann; + Eigen::VectorXd m_window; // Window used for Welch method + double m_u = 0; // Window normalization factor + + std::vector m_dft; // Discrete Fourier Transform + std::vector m_psd; // Power Spectral Density + std::vector > m_cpsd; // Cross Power Spectral Density + + int m_windowLength = 128; // size of one Welch window (samples) + int m_windowOverlap = 50; // overlap btw windows (%) + int m_windowOverlapSamples = 64; + int m_nbWindows = 8; + + size_t m_fftSize = 256; + size_t m_nbChannels = 1; + + bool m_dcRemoval = false; + +}; + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/CBoxAlgorithmMatrix3dTo2d.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/CBoxAlgorithmMatrix3dTo2d.cpp new file mode 100644 index 0000000..cbcc4a4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/CBoxAlgorithmMatrix3dTo2d.cpp @@ -0,0 +1,168 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmMatrix3dTo2d.cpp +/// \brief Implementation of the box Matrix3dTo2d +/// \author Arthur DESBOIS (INRIA). +/// \version 0.0.1. +/// \date Fri Feb 12 15:13:00 2021. +/// +/// \copyright (C) 2021 INRIA +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see . +///------------------------------------------------------------------------------------------------- + +#include "CBoxAlgorithmMatrix3dTo2d.hpp" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmMatrix3dTo2d::initialize() +{ + m_matrixDecoder.initialize(*this, 0); + m_matrixEncoder.initialize(*this, 0); + + m_iMatrix = m_matrixDecoder.getOutputMatrix(); + m_oMatrix = m_matrixEncoder.getInputMatrix(); + + m_dimensionToRemove = int(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)); + m_removedDimensionIdx = int(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1)); + + OV_ERROR_UNLESS_KRF(m_dimensionToRemove == 0 || m_dimensionToRemove == 1 || m_dimensionToRemove == 2, "Invalid dimension number", Kernel::ErrorType::BadInput); + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmMatrix3dTo2d::uninitialize() +{ + m_matrixDecoder.uninitialize(); + m_matrixEncoder.uninitialize(); + + return true; +} +/*******************************************************************************/ + + +bool CBoxAlgorithmMatrix3dTo2d::processInput(const size_t index) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +/*******************************************************************************/ + + +bool CBoxAlgorithmMatrix3dTo2d::process() +{ + const Kernel::IBox& staticBoxContext=this->getStaticBoxContext(); + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_matrixDecoder.decode(i); + + if(m_matrixDecoder.isHeaderReceived()) + { + OV_ERROR_UNLESS_KRF(m_iMatrix->getDimensionCount() == 3, "Input matrix should have 3 dimensions", Kernel::ErrorType::BadInput); + + m_dim0Size = m_iMatrix->getDimensionSize(0); + m_dim1Size = m_iMatrix->getDimensionSize(1); + m_dim2Size = m_iMatrix->getDimensionSize(2); + + switch(m_dimensionToRemove) { + case 0: + OV_ERROR_UNLESS_KRF(m_dim0Size > m_removedDimensionIdx, "Idx in removed dimension over dimension size", Kernel::ErrorType::BadInput); + MatrixInit(*m_oMatrix, m_dim1Size, m_dim2Size); + break; + case 1: + OV_ERROR_UNLESS_KRF(m_dim1Size > m_removedDimensionIdx, "Idx in removed dimension over dimension size", Kernel::ErrorType::BadInput); + MatrixInit(*m_oMatrix, m_dim0Size, m_dim2Size); + break; + case 2: + OV_ERROR_UNLESS_KRF(m_dim2Size > m_removedDimensionIdx, "Idx in removed dimension over dimension size", Kernel::ErrorType::BadInput); + MatrixInit(*m_oMatrix, m_dim0Size, m_dim1Size); + break; + } + + m_matrixEncoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + if(m_matrixDecoder.isBufferReceived()) + { + RemoveDimension(*m_iMatrix, *m_oMatrix); + + this->getLogManager() << Kernel::LogLevel_Debug<< "Received matrix with dimensions " << m_iMatrix->getDimensionSize(0) << " x " << m_iMatrix->getDimensionSize(1) << " x " << m_iMatrix->getDimensionSize(2) << "\n"; + this->getLogManager() << Kernel::LogLevel_Debug << "Output matrix has dimensions " << m_oMatrix->getDimensionSize(0) << " x " << m_oMatrix->getDimensionSize(1) << "\n"; + + m_matrixEncoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + + } + if(m_matrixDecoder.isEndReceived()) + { + m_matrixEncoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + + return true; +} + +bool CBoxAlgorithmMatrix3dTo2d::MatrixInit(IMatrix& out, const size_t dim0, const size_t dim1) +{ + out.setDimensionCount(2); + out.setDimensionSize(0, dim0); + out.setDimensionSize(1, dim1); + return true; +} + +bool CBoxAlgorithmMatrix3dTo2d::RemoveDimension(const IMatrix& in, IMatrix& out) +{ + size_t idxOutBuffer = 0; + + const double* inBuffer = in.getBuffer(); + double* outBuffer = out.getBuffer(); + + switch(m_dimensionToRemove) { + case 0: + for(size_t idx1 = 0; idx1 < m_dim1Size; idx1++) { + for(size_t idx2 = 0; idx2 < m_dim2Size; idx2++) { + outBuffer[idxOutBuffer++] = inBuffer[m_removedDimensionIdx*m_dim1Size*m_dim2Size + idx1*m_dim2Size + idx2]; + } + } + break; + case 1: + for(size_t idx0 = 0; idx0 < m_dim0Size; idx0++) { + for(size_t idx2 = 0; idx2 < m_dim2Size; idx2++) { + outBuffer[idxOutBuffer++] = inBuffer[idx0*m_dim1Size*m_dim2Size + m_removedDimensionIdx*m_dim2Size + idx2]; + } + } + break; + case 2: + for(size_t idx0 = 0; idx0 < m_dim0Size; idx0++) { + for(size_t idx1 = 0; idx1 < m_dim1Size; idx1++) { + outBuffer[idxOutBuffer++] = inBuffer[idx0*m_dim1Size*m_dim2Size + idx1*m_dim2Size + m_removedDimensionIdx]; + } + } + break; + } + + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/CBoxAlgorithmMatrix3dTo2d.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/CBoxAlgorithmMatrix3dTo2d.hpp new file mode 100644 index 0000000..d920b47 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/CBoxAlgorithmMatrix3dTo2d.hpp @@ -0,0 +1,114 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmMatrix3dTo2d.hpp +/// \brief Classes of the box Matrix3dTo2d +/// \author Arthur DESBOIS (INRIA). +/// \version 0.0.1. +/// \date Fri Feb 12 15:13:00 2021. +/// +/// \copyright (C) 2021 INRIA +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see . +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "ovp_defines.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +/// \brief The class CBoxAlgorithmMatrix3dTo2d describes the box Matrix 3D to 2D. +class CBoxAlgorithmMatrix3dTo2d final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + + bool uninitialize() override; + + bool processInput(const size_t index) override; + + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_Matrix3dTo2d) + +protected: + // Codecs + Toolkit::TStreamedMatrixDecoder m_matrixDecoder; + Toolkit::TStreamedMatrixEncoder m_matrixEncoder; + + // Matrices + CMatrix* m_iMatrix = nullptr; + CMatrix* m_oMatrix = nullptr; + + // Parameters + int m_dimensionToRemove; + int m_removedDimensionIdx; + + size_t m_dim0Size; + size_t m_dim1Size; + size_t m_dim2Size; + +private: + bool MatrixInit(CMatrix& m, const size_t dim0, const size_t dim1); + + bool RemoveDimension(const CMatrix& in, CMatrix& out); + +}; + + +/// \brief Descriptor of the box Matrix 3D to 2D. +class CBoxAlgorithmMatrix3dTo2dDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override + {} + + CString getName() const override { return CString("Matrix 3D to 2D"); } + CString getAuthorName() const override { return CString("Arthur Desbois"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Convert 3D matrices to 2D"); } + CString getDetailedDescription() const override { return CString("Convert 3 dimensional matrices to 2D matrices, by selecting a dimension to remove"); } + CString getCategory() const override { return CString("Signal processing/Basic"); } + CString getVersion() const override { return CString("0.0.1"); } + CString getStockItemName() const override { return CString(""); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_Matrix3dTo2d; } + IPluginObject* create() override { return new CBoxAlgorithmMatrix3dTo2d; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("input", OV_TypeId_StreamedMatrix); + prototype.addOutput("output", OV_TypeId_StreamedMatrix); + + prototype.addSetting("Dimension to remove", OV_TypeId_Integer, ""); + prototype.addSetting("Index in removed dimension", OV_TypeId_Integer, ""); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_Matrix3dTo2dDesc) +}; + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmARCoefficients.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmARCoefficients.cpp new file mode 100644 index 0000000..9d812ab --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmARCoefficients.cpp @@ -0,0 +1,125 @@ +#if defined(TARGET_HAS_ThirdPartyEIGEN) + +#include "ovpCBoxAlgorithmARCoefficients.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmARCoefficients::initialize() +{ + // Signal stream decoder + m_decoder.initialize(*this, 0); + + m_method = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_ARBurgMethod)); + m_method->initialize(); + + ip_matrix.initialize(m_method->getInputParameter(OVP_Algorithm_ARBurgMethod_InputParameterId_Matrix)); + op_matrix.initialize(m_method->getOutputParameter(OVP_Algorithm_ARBurgMethod_OutputParameterId_Matrix)); + + ip_order.initialize(m_method->getInputParameter(OVP_Algorithm_ARBurgMethod_InputParameterId_UInteger)); + ip_order = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)); + + // Feature vector stream encoder + m_encoder.initialize(*this, 0); + + // The AR Burg's Method algorithm will take the matrix coming from the signal decoder: + ip_matrix.setReferenceTarget(m_decoder.getOutputMatrix()); + + // The feature vector encoder will take the matrix from the AR Burg's Method algorithm: + m_encoder.getInputMatrix().setReferenceTarget(op_matrix); + + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmARCoefficients::uninitialize() +{ + m_decoder.uninitialize(); + + + ip_matrix.uninitialize(); + ip_order.uninitialize(); + op_matrix.uninitialize(); + + m_method->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_method); + + m_encoder.uninitialize(); + + return true; +} + +/*******************************************************************************/ + + +bool CBoxAlgorithmARCoefficients::processInput(const size_t /*index*/) +{ + // ready to process ! + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmARCoefficients::process() +{ + // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + // we decode the input signal chunks + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_decoder.decode(i); + + if (m_decoder.isHeaderReceived()) + { + // Header received + m_method->process(OVP_Algorithm_ARBurgMethod_InputTriggerId_Initialize); + + // Make sure the algo initialization was successful + if (!m_method->process(OVP_Algorithm_ARBurgMethod_InputTriggerId_Initialize)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Initialization was unsuccessful\n"; + return false; + } + + // Pass the header to the next boxes, by encoding a header on the output 0: + m_encoder.encodeHeader(); + + // send the output chunk containing the header. The dates are the same as the input chunk: + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + + if (m_decoder.isBufferReceived()) + { + // we process the signal matrix with our algorithm + m_method->process(OVP_Algorithm_ARBurgMethod_InputTriggerId_Process); + + // If the process is done successfully, we can encode the buffer + if (m_method->isOutputTriggerActive(OVP_Algorithm_ARBurgMethod_OutputTriggerId_ProcessDone)) + { + // Encode the output buffer : + m_encoder.encodeBuffer(); + + // and send it to the next boxes : + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + if (m_decoder.isEndReceived()) + { + // End of stream received. This happens only once when pressing "stop". Just pass it to the next boxes so they receive the message : + m_encoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + + return true; +} + +#endif // #if defined(TARGET_HAS_ThirdPartyEIGEN) +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmARCoefficients.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmARCoefficients.h new file mode 100644 index 0000000..8f5ecfd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmARCoefficients.h @@ -0,0 +1,100 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyEIGEN) + +//You may have to change this path to match your folder organisation +#include "../../ovp_defines.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +/** + * \class CBoxAlgorithmARCoefficients + * \author Alison Cellard (Inria) + * \date Wed Nov 28 10:40:52 2012 + * \brief The class CBoxAlgorithmARCoefficients describes the box AR Features. + * + */ +class CBoxAlgorithmARCoefficients final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + // Process callbacks on new input received + bool processInput(const size_t index) override; + + + bool process() override; + + // As we do with any class in openvibe, we use the macro below + // to associate this box to an unique identifier. + // The inheritance information is also made available, + // as we provide the superclass Toolkit::TBoxAlgorithm < IBoxAlgorithm > + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_ARCoefficients) + +protected: + + // Signal stream decoder + Toolkit::TSignalDecoder m_decoder; + // Feature vector stream encoder + Toolkit::TStreamedMatrixEncoder m_encoder; + + Kernel::IAlgorithmProxy* m_method = nullptr; + Kernel::TParameterHandler ip_matrix; + Kernel::TParameterHandler op_matrix; + Kernel::TParameterHandler ip_order; +}; + + +/** + * \class CBoxAlgorithmARCoefficientsDesc + * \author Alison Cellard (Inria) + * \date Wed Nov 28 10:40:52 2012 + * \brief Descriptor of the box AR Features. + * + */ +class CBoxAlgorithmARCoefficientsDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("AutoRegressive Coefficients"); } + CString getAuthorName() const override { return CString("Alison Cellard"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + + CString getShortDescription() const override { return CString("Estimates autoregressive (AR) coefficients from a set of signals"); } + + CString getDetailedDescription() const override { return CString("Estimates autoregressive (AR) linear model coefficients using Burg's method"); } + + CString getCategory() const override { return CString("Signal processing/Basic"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-convert"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ARCoefficients; } + IPluginObject* create() override { return new CBoxAlgorithmARCoefficients; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("EEG Signal",OV_TypeId_Signal); + prototype.addOutput("AR Features",OV_TypeId_StreamedMatrix); + prototype.addSetting("Order",OV_TypeId_Integer, "1"); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ARCoefficientsDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyEIGEN diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmDifferentialIntegral.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmDifferentialIntegral.cpp new file mode 100644 index 0000000..f29c0f6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmDifferentialIntegral.cpp @@ -0,0 +1,141 @@ +#include "ovpCBoxAlgorithmDifferentialIntegral.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmDifferentialIntegral::initialize() +{ + // Signal stream decoder + m_decoder.initialize(*this, 0); + // Signal stream encoder + m_encoder.initialize(*this, 0); + + // If you need to, you can manually set the reference targets to link the codecs input and output. To do so, you can use : + m_encoder.getInputMatrix().setReferenceTarget(m_decoder.getOutputMatrix()); + m_encoder.getInputSamplingRate().setReferenceTarget(m_decoder.getOutputSamplingRate()); + + m_operation = EDifferentialIntegralOperation(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0))); + m_filterOrder = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1)); + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmDifferentialIntegral::uninitialize() +{ + m_decoder.uninitialize(); + m_encoder.uninitialize(); + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmDifferentialIntegral::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +/*******************************************************************************/ + +double CBoxAlgorithmDifferentialIntegral::operation(const double a, const double b) const +{ + if (m_operation == EDifferentialIntegralOperation::Differential) { return a - b; } + if (m_operation == EDifferentialIntegralOperation::Integral) { return a + b; } + return 0; +} + + +bool CBoxAlgorithmDifferentialIntegral::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + //iterate over all chunk on input 0 + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + // decode the chunk i on input 0 + m_decoder.decode(i); + + if (m_decoder.isHeaderReceived()) + { + // initialize the past data array + CMatrix* matrix = m_decoder.getOutputMatrix(); // the StreamedMatrix of samples. + + + // initialize all of the tables according to the number of channels + m_pastData = new double*[matrix->getDimensionSize(0)]; + m_tmpData = new double*[matrix->getDimensionSize(0)]; + m_stabilized = new bool[matrix->getDimensionSize(0)]; + m_step = new size_t[matrix->getDimensionSize(0)]; + + for (size_t k = 0; k < matrix->getDimensionSize(0); ++k) + { + m_stabilized[k] = false; + m_step[k] = 0; + m_pastData[k] = new double[m_filterOrder]; + m_tmpData[k] = new double[m_filterOrder]; + m_tmpData[k][0] = 0; + } + + // Encode the output header + m_encoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + if (m_decoder.isBufferReceived()) + { + CMatrix* matrix = m_decoder.getOutputMatrix(); // the StreamedMatrix of samples. + + const size_t nChannel = matrix->getDimensionSize(0); + const size_t samplesPerChannel = matrix->getDimensionSize(1); + + // ... do some process on the matrix ... + + double* buffer = matrix->getBuffer(); + + for (size_t c = 0; c < nChannel; ++c) + { + for (size_t s = 0; s < samplesPerChannel; ++s) + { + // save the results of the previous step in a temporary array + for (size_t step = 0; step < m_step[c]; ++step) { m_tmpData[c][step] = m_pastData[c][step]; } + + // save the current sample as f^0(x) + m_pastData[c][0] = buffer[s + c * samplesPerChannel]; + + // save all of the f^n(x) + for (size_t step = 1; step < m_step[c]; ++step) { m_pastData[c][step] = operation(m_pastData[c][step - 1], m_tmpData[c][step - 1]); } + + // if the filter is not yet stabilized we increase the step and use 0 as a return value + if (!m_stabilized[c]) + { + if (m_step[c] == m_filterOrder) { m_stabilized[c] = true; } + else { m_step[c]++; } + + buffer[s + c * samplesPerChannel] = 0; + } + // otherwise use f^order(x) + else { buffer[s + c * samplesPerChannel] = operation(m_pastData[c][m_filterOrder - 1], m_tmpData[c][m_filterOrder - 1]); } + } + } + + // Encode the output buffer + m_encoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + if (m_decoder.isEndReceived()) + { + // End of stream received. This happens only once when pressing "stop". Just pass it to the next boxes so they receive the message : + m_encoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmDifferentialIntegral.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmDifferentialIntegral.h new file mode 100644 index 0000000..177a160 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmDifferentialIntegral.h @@ -0,0 +1,100 @@ +#pragma once + +//You may have to change this path to match your folder organisation +#include "../../ovp_defines.h" + +#include +#include + +// The unique identifiers for the box and its descriptor. +// Identifier are randomly chosen by the skeleton-generator. + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +/** + * \class CBoxAlgorithmDifferentialIntegral + * \author Jozef Legeny (INRIA) + * \date Thu Oct 27 15:24:05 2011 + * \brief The class CBoxAlgorithmDifferentialIntegral describes the box DifferentialIntegral. + * + */ +class CBoxAlgorithmDifferentialIntegral final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_DifferentialIntegral) + +protected: + Toolkit::TSignalDecoder m_decoder; + Toolkit::TSignalEncoder m_encoder; + +private: + double operation(const double a, const double b) const; + EDifferentialIntegralOperation m_operation = EDifferentialIntegralOperation::Differential; + uint64_t m_filterOrder = 0; + + /// Holds the differentials/integrals of all orders from the previous step + double** m_pastData = nullptr; + double** m_tmpData = nullptr; + + /// Is true when the filter is stabilized + bool* m_stabilized = nullptr; + /// Counts the samples up to the filter order, used to stabilize the filter + size_t* m_step = nullptr; +}; + + +/** + * \class CBoxAlgorithmDifferentialIntegralDesc + * \author Jozef Legeny (INRIA) + * \date Thu Oct 27 15:24:05 2011 + * \brief Descriptor of the box DifferentialIntegral. + * + */ +class CBoxAlgorithmDifferentialIntegralDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Signal Differential/Integral"); } + CString getAuthorName() const override { return CString("Jozef Legeny"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Calculates a differential or an integral of a signal"); } + CString getDetailedDescription() const override { return CString("Calculates a differential or an integral of a signal."); } + CString getCategory() const override { return CString("Signal processing/Basic"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-execute"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_DifferentialIntegral; } + IPluginObject* create() override { return new CBoxAlgorithmDifferentialIntegral; } + + /* + virtual IBoxListener* createBoxListener() const { return new CBoxAlgorithmDifferentialIntegralListener; } + virtual void releaseBoxListener(IBoxListener* listener) const { delete listener; } + */ + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input Signal",OV_TypeId_Signal); + + prototype.addOutput("Output Signal",OV_TypeId_Signal); + + prototype.addSetting("Operation", OVP_TypeId_DifferentialIntegralOperation, "Differential"); + prototype.addSetting("Order", OV_TypeId_Integer, "1"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_DifferentialIntegralDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmERSPAverage.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmERSPAverage.cpp new file mode 100644 index 0000000..8a20124 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmERSPAverage.cpp @@ -0,0 +1,143 @@ +#include "ovpCBoxAlgorithmERSPAverage.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmERSPAverage::initialize() +{ + m_epochingStim = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_computeStim = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + m_decoderSpectrum.initialize(*this, 0); + m_decoderStimulations.initialize(*this, 1); + + m_encoder.initialize(*this, 0); + + + return true; +} + +bool CBoxAlgorithmERSPAverage::uninitialize() +{ + m_encoder.uninitialize(); + m_decoderSpectrum.uninitialize(); + m_decoderStimulations.uninitialize(); + + for (auto& v : m_cachedSpectra) { for (auto m : v) { delete m; } } + m_cachedSpectra.clear(); + + return true; +} + +bool CBoxAlgorithmERSPAverage::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmERSPAverage::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + m_decoderStimulations.decode(i); + if (m_decoderStimulations.isBufferReceived()) + { + const auto stims = m_decoderStimulations.getOutputStimulationSet(); + for (size_t j = 0; j < stims->getStimulationCount(); ++j) + { + if (stims->getStimulationIdentifier(j) == m_epochingStim) + { + m_currentChunk = 0; + m_numTrials++; + } + if (stims->getStimulationIdentifier(j) == m_computeStim) { computeAndSend(); } + } + } + } + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_decoderSpectrum.decode(i); + + if (m_decoderSpectrum.isHeaderReceived()) + { + const uint64_t samplingRate = m_decoderSpectrum.getOutputSamplingRate(); + m_encoder.getInputSamplingRate() = samplingRate; + m_encoder.getInputFrequencyAbscissa()->copy(*m_decoderSpectrum.getOutputFrequencyAbscissa()); + m_encoder.getInputMatrix()->copyDescription(*m_decoderSpectrum.getOutputMatrix()); + m_encoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + if (m_decoderSpectrum.isBufferReceived()) + { + const CMatrix* input = m_decoderSpectrum.getOutputMatrix(); + appendChunk(*input, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + if (m_decoderSpectrum.isEndReceived()) + { + m_encoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + + return true; +} + +bool CBoxAlgorithmERSPAverage::appendChunk(const CMatrix& chunk, const uint64_t startTime, const uint64_t endTime) +{ + if (m_cachedSpectra.size() <= m_currentChunk) + { + m_cachedSpectra.resize(m_currentChunk + 1); + m_timestamps.resize(m_currentChunk + 1); + } + + CMatrix* matrixCopy = new CMatrix(); + matrixCopy->copy(chunk); + m_cachedSpectra[m_currentChunk].push_back(matrixCopy); + m_timestamps[m_currentChunk].start = startTime; + m_timestamps[m_currentChunk].end = endTime; + + m_currentChunk++; + + return true; +} + +bool CBoxAlgorithmERSPAverage::computeAndSend() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + double* outptr = m_encoder.getInputMatrix()->getBuffer(); + + this->getLogManager() << Kernel::LogLevel_Info << "Counted " << m_numTrials << " trials and " << m_cachedSpectra.size() << " spectra per trial.\n"; + + for (size_t i = 0; i < m_cachedSpectra.size(); ++i) + { + // Compute average for each slice + const double divider = 1.0 / m_cachedSpectra[i].size(); + m_encoder.getInputMatrix()->resetBuffer(); + + for (auto mat : m_cachedSpectra[i]) + { + const double* inptr = mat->getBuffer(); + for (size_t p = 0; p < mat->getBufferElementCount(); ++p) { outptr[p] += divider * inptr[p]; } + delete mat; + } + + m_encoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, m_timestamps[i].start - m_timestamps[0].start, m_timestamps[i].end - m_timestamps[0].start); + } + + m_numTrials = 0; + m_currentChunk = 0; + m_cachedSpectra.clear(); + + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmERSPAverage.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmERSPAverage.h new file mode 100644 index 0000000..237b810 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmERSPAverage.h @@ -0,0 +1,92 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmERSPAverage final : virtual public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_ERSPAverage) + +protected: + + bool appendChunk(const CMatrix& chunk, uint64_t startTime, uint64_t endTime); + bool computeAndSend(); + + Toolkit::TSpectrumDecoder m_decoderSpectrum; + Toolkit::TStimulationDecoder m_decoderStimulations; + Toolkit::TSpectrumEncoder m_encoder; + + struct STimestamp + { + uint64_t start, end; + }; + + std::vector> m_cachedSpectra; + std::vector m_timestamps; + + size_t m_currentChunk = 0; + size_t m_numTrials = 0; + + uint64_t m_epochingStim = 0; + uint64_t m_computeStim = 0; +}; + + +class CBoxAlgorithmERSPAverageDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("ERSP Average"); } + CString getAuthorName() const override { return CString("Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + + CString getShortDescription() const override + { + return CString("Averages a sequence of spectra per trial across multiple trials. The result is a sequence starting from t=0."); + } + + CString getDetailedDescription() const override + { + return CString( + "Example: Given an input sequence [t,s1,s2,t,s3,s4] for two trials with s* the spectra and t a stimulation denoting the trial start, the box returns 1/2*(s1+s3), 1/2*(s2+s4)."); + } + + CString getCategory() const override { return CString("Signal processing/Basic"); } + CString getVersion() const override { return CString("0.1"); } + CString getStockItemName() const override { return CString("gtk-sort-ascending"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ERSPAverage; } + IPluginObject* create() override { return new CBoxAlgorithmERSPAverage; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input spectra", OV_TypeId_Spectrum); + prototype.addInput("Control stream", OV_TypeId_Stimulations); + prototype.addOutput("Output spectra", OV_TypeId_Spectrum); + + prototype.addSetting("Trial start marker", OV_TypeId_Stimulation, "OVTK_GDF_Start_Of_Trial", false); + prototype.addSetting("Computation trigger", OV_TypeId_Stimulation, "OVTK_StimulationId_ExperimentStop", false); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ERSPAverageDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmEpochVariance.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmEpochVariance.cpp new file mode 100644 index 0000000..268f476 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmEpochVariance.cpp @@ -0,0 +1,195 @@ +#include "ovpCBoxAlgorithmEpochVariance.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CEpochVariance::initialize() +{ + CIdentifier inputTypeID; + getStaticBoxContext().getInputType(0, inputTypeID); + if (inputTypeID == OV_TypeId_StreamedMatrix) + { + m_decoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixDecoder)); + m_encoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder)); + m_encoderForVariance = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder)); + m_encoderForConfidenceBound = &getAlgorithmManager(). + getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder)); + } + else if (inputTypeID == OV_TypeId_FeatureVector) + { + m_decoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorDecoder)); + m_encoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorEncoder)); + m_encoderForVariance = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorEncoder)); + m_encoderForConfidenceBound = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorEncoder)); + } + else if (inputTypeID == OV_TypeId_Signal) + { + m_decoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalDecoder)); + m_encoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + m_encoderForVariance = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + m_encoderForConfidenceBound = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + } + else if (inputTypeID == OV_TypeId_Spectrum) + { + m_decoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumDecoder)); + m_encoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumEncoder)); + m_encoderForVariance = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumDecoder)); + m_encoderForConfidenceBound = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumDecoder)); + } + else { return false; } + m_decoder->initialize(); + m_encoder->initialize(); + m_encoderForVariance->initialize(); + m_encoderForConfidenceBound->initialize(); + + m_matrixVariance = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_MatrixVariance)); + m_matrixVariance->initialize(); + + if (inputTypeID == OV_TypeId_StreamedMatrix) { } + else if (inputTypeID == OV_TypeId_FeatureVector) { } + else if (inputTypeID == OV_TypeId_Signal) + { + m_encoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + m_encoderForVariance->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + m_encoderForConfidenceBound->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + } + else if (inputTypeID == OV_TypeId_Spectrum) + { + m_encoder->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_FrequencyAbscissa)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_FrequencyAbscissa)); + m_encoderForVariance->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_FrequencyAbscissa)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_FrequencyAbscissa)); + m_encoderForConfidenceBound->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_FrequencyAbscissa)->setReferenceTarget( + m_decoder-> + getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_FrequencyAbscissa)); + + m_encoder->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_Sampling)); + m_encoderForVariance->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_Sampling)); + m_encoderForConfidenceBound->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_Sampling)); + } + + ip_averagingMethod.initialize(m_matrixVariance->getInputParameter(OVP_Algorithm_MatrixVariance_InputParameterId_AveragingMethod)); + ip_matrixCount.initialize(m_matrixVariance->getInputParameter(OVP_Algorithm_MatrixVariance_InputParameterId_MatrixCount)); + ip_SignificanceLevel.initialize(m_matrixVariance->getInputParameter(OVP_Algorithm_MatrixVariance_InputParameterId_SignificanceLevel)); + + ip_averagingMethod = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)); + ip_matrixCount = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1)); + ip_SignificanceLevel = double(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2)); + + m_matrixVariance->getInputParameter(OVP_Algorithm_MatrixVariance_InputParameterId_Matrix)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + m_encoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)->setReferenceTarget( + m_matrixVariance->getOutputParameter(OVP_Algorithm_MatrixVariance_OutputParameterId_AveragedMatrix)); + m_encoderForVariance->getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)->setReferenceTarget( + m_matrixVariance->getOutputParameter(OVP_Algorithm_MatrixVariance_OutputParameterId_Variance)); + m_encoderForConfidenceBound->getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)->setReferenceTarget( + m_matrixVariance->getOutputParameter(OVP_Algorithm_MatrixVariance_OutputParameterId_ConfidenceBound)); + + + if (ip_matrixCount <= 0) + { + getLogManager() << Kernel::LogLevel_Error << "You should provide a positive number of epochs better than " << ip_matrixCount << "\n"; + return false; + } + + return true; +} + +bool CEpochVariance::uninitialize() +{ + ip_averagingMethod.uninitialize(); + ip_matrixCount.uninitialize(); + + m_matrixVariance->uninitialize(); + m_encoder->uninitialize(); + m_encoderForVariance->uninitialize(); + m_encoderForConfidenceBound->uninitialize(); + m_decoder->uninitialize(); + + getAlgorithmManager().releaseAlgorithm(*m_matrixVariance); + getAlgorithmManager().releaseAlgorithm(*m_encoder); + getAlgorithmManager().releaseAlgorithm(*m_encoderForVariance); + getAlgorithmManager().releaseAlgorithm(*m_encoderForConfidenceBound); + getAlgorithmManager().releaseAlgorithm(*m_decoder); + + return true; +} + +bool CEpochVariance::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CEpochVariance::process() +{ + Kernel::IBoxIO& boxContext = getDynamicBoxContext(); + const size_t nInput = getStaticBoxContext().getInputCount(); + + for (size_t i = 0; i < nInput; ++i) + { + for (size_t j = 0; j < boxContext.getInputChunkCount(i); ++j) + { + Kernel::TParameterHandler bufferHandle( + m_decoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_InputParameterId_MemoryBufferToDecode)); + Kernel::TParameterHandler obufferHandle( + m_encoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + Kernel::TParameterHandler obufferHandleForVariance( + m_encoderForVariance->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + Kernel::TParameterHandler bufferHandleForConfidenceBound( + m_encoderForConfidenceBound->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + bufferHandle = boxContext.getInputChunk(i, j); + obufferHandle = boxContext.getOutputChunk(0); + obufferHandleForVariance = boxContext.getOutputChunk(1); + bufferHandleForConfidenceBound = boxContext.getOutputChunk(2); + + m_decoder->process(); + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedHeader)) + { + m_matrixVariance->process(OVP_Algorithm_MatrixVariance_InputTriggerId_Reset); + m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader); + m_encoderForVariance->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader); + m_encoderForConfidenceBound->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(i, j), boxContext.getInputChunkEndTime(i, j)); + boxContext.markOutputAsReadyToSend(1, boxContext.getInputChunkStartTime(i, j), boxContext.getInputChunkEndTime(i, j)); + boxContext.markOutputAsReadyToSend(2, boxContext.getInputChunkStartTime(i, j), boxContext.getInputChunkEndTime(i, j)); + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedBuffer)) + { + m_matrixVariance->process(OVP_Algorithm_MatrixVariance_InputTriggerId_FeedMatrix); + if (m_matrixVariance->isOutputTriggerActive(OVP_Algorithm_MatrixVariance_OutputTriggerId_AveragePerformed)) + { + m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer); + m_encoderForVariance->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer); + m_encoderForConfidenceBound->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(i, j), boxContext.getInputChunkEndTime(i, j)); + boxContext.markOutputAsReadyToSend(1, boxContext.getInputChunkStartTime(i, j), boxContext.getInputChunkEndTime(i, j)); + boxContext.markOutputAsReadyToSend(2, boxContext.getInputChunkStartTime(i, j), boxContext.getInputChunkEndTime(i, j)); + } + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedEnd)) + { + m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd); + m_encoderForVariance->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd); + m_encoderForConfidenceBound->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(i, j), boxContext.getInputChunkEndTime(i, j)); + boxContext.markOutputAsReadyToSend(1, boxContext.getInputChunkStartTime(i, j), boxContext.getInputChunkEndTime(i, j)); + boxContext.markOutputAsReadyToSend(2, boxContext.getInputChunkStartTime(i, j), boxContext.getInputChunkEndTime(i, j)); + } + + boxContext.markInputAsDeprecated(i, j); + } + } + + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmEpochVariance.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmEpochVariance.h new file mode 100644 index 0000000..ac0afaa --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmEpochVariance.h @@ -0,0 +1,95 @@ +#pragma once + +#include "../../ovp_defines.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CEpochVariance final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_EpochVariance) + +protected: + + Kernel::IAlgorithmProxy* m_decoder = nullptr; + Kernel::IAlgorithmProxy* m_encoder = nullptr; + Kernel::IAlgorithmProxy* m_encoderForVariance = nullptr; + Kernel::IAlgorithmProxy* m_encoderForConfidenceBound = nullptr; + Kernel::IAlgorithmProxy* m_matrixVariance = nullptr; + + Kernel::TParameterHandler ip_matrixCount; + Kernel::TParameterHandler ip_averagingMethod; + Kernel::TParameterHandler ip_SignificanceLevel; +}; + +class CEpochVarianceListener final : public Toolkit::TBoxListener +{ +public: + + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(index, typeID); + for (size_t i = 0; i < box.getOutputCount(); ++i) { box.setOutputType(i, typeID); } + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CEpochVarianceDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("Epoch variance"); } + CString getAuthorName() const override { return CString("Dieter Devlaminck"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Computes variance of each sample over several epochs"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Signal processing/Basic"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-missing-image"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_EpochVariance; } + IPluginObject* create() override { return new CEpochVariance(); } + IBoxListener* createBoxListener() const override { return new CEpochVarianceListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input epochs", OV_TypeId_StreamedMatrix); + prototype.addOutput("Averaged epochs", OV_TypeId_StreamedMatrix); + prototype.addOutput("Variance of epochs", OV_TypeId_StreamedMatrix); + prototype.addOutput("Confidence bounds", OV_TypeId_StreamedMatrix); + prototype.addSetting("Averaging type", OVP_TypeId_EpochAverageMethod, "Moving epoch average"); + prototype.addSetting("Epoch count", OV_TypeId_Integer, "4"); + prototype.addSetting("Significance level", OV_TypeId_Float, "0.01"); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + prototype.addInputSupport(OV_TypeId_FeatureVector); + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_Spectrum); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_EpochVarianceDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmHilbert.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmHilbert.cpp new file mode 100644 index 0000000..9ef7bcc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmHilbert.cpp @@ -0,0 +1,125 @@ +#include "ovpCBoxAlgorithmHilbert.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmHilbert::initialize() +{ + // Signal stream decoder + m_decoder.initialize(*this, 0); + // Signal stream encoder + m_algo1Encoder.initialize(*this, 0); + m_algo2Encoder.initialize(*this, 1); + m_algo3Encoder.initialize(*this, 2); + + m_hilbertAlgo = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_HilbertTransform)); + m_hilbertAlgo->initialize(); + + ip_signalMatrix.initialize(m_hilbertAlgo->getInputParameter(OVP_Algorithm_HilbertTransform_InputParameterId_Matrix)); + op_hilbertMatrix.initialize(m_hilbertAlgo->getOutputParameter(OVP_Algorithm_HilbertTransform_OutputParameterId_HilbertMatrix)); + op_envelopeMatrix.initialize(m_hilbertAlgo->getOutputParameter(OVP_Algorithm_HilbertTransform_OutputParameterId_EnvelopeMatrix)); + op_phaseMatrix.initialize(m_hilbertAlgo->getOutputParameter(OVP_Algorithm_HilbertTransform_OutputParameterId_PhaseMatrix)); + + ip_signalMatrix.setReferenceTarget(m_decoder.getOutputMatrix()); + + m_algo1Encoder.getInputSamplingRate().setReferenceTarget(m_decoder.getOutputSamplingRate()); + m_algo2Encoder.getInputSamplingRate().setReferenceTarget(m_decoder.getOutputSamplingRate()); + m_algo3Encoder.getInputSamplingRate().setReferenceTarget(m_decoder.getOutputSamplingRate()); + + m_algo1Encoder.getInputMatrix().setReferenceTarget(op_hilbertMatrix); + m_algo2Encoder.getInputMatrix().setReferenceTarget(op_envelopeMatrix); + m_algo3Encoder.getInputMatrix().setReferenceTarget(op_phaseMatrix); + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmHilbert::uninitialize() +{ + m_decoder.uninitialize(); + m_algo1Encoder.uninitialize(); + m_algo2Encoder.uninitialize(); + m_algo3Encoder.uninitialize(); + + ip_signalMatrix.uninitialize(); + op_hilbertMatrix.uninitialize(); + op_envelopeMatrix.uninitialize(); + op_phaseMatrix.uninitialize(); + + m_hilbertAlgo->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_hilbertAlgo); + + return true; +} +/*******************************************************************************/ + + +bool CBoxAlgorithmHilbert::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmHilbert::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + //iterate over all chunk on input 0 + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + // decode the chunk i on input 0 + m_decoder.decode(i); + // the decoder may have decoded 3 different parts : the header, a buffer or the end of stream. + if (m_decoder.isHeaderReceived()) + { + // Header received + m_hilbertAlgo->process(OVP_Algorithm_HilbertTransform_InputTriggerId_Initialize); + + // Pass the header to the next boxes, by encoding a header on the output 0: + m_algo1Encoder.encodeHeader(); + m_algo2Encoder.encodeHeader(); + m_algo3Encoder.encodeHeader(); + + // send the output chunk containing the header. The dates are the same as the input chunk: + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + boxContext.markOutputAsReadyToSend(1, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + boxContext.markOutputAsReadyToSend(2, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + if (m_decoder.isBufferReceived()) + { + m_hilbertAlgo->process(OVP_Algorithm_HilbertTransform_InputTriggerId_Process); + + // Encode the output buffer : + m_algo1Encoder.encodeBuffer(); + m_algo2Encoder.encodeBuffer(); + m_algo3Encoder.encodeBuffer(); + + // and send it to the next boxes : + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + boxContext.markOutputAsReadyToSend(1, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + boxContext.markOutputAsReadyToSend(2, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + if (m_decoder.isEndReceived()) + { + // End of stream received. This happens only once when pressing "stop". Just pass it to the next boxes so they receive the message : + m_algo1Encoder.encodeEnd(); + m_algo2Encoder.encodeEnd(); + m_algo3Encoder.encodeEnd(); + + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + boxContext.markOutputAsReadyToSend(1, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + boxContext.markOutputAsReadyToSend(2, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + // The current input chunk has been processed, and automaticcaly discarded. + // you don't need to call "boxContext.markInputAsDeprecated(0, i);" + } + + + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmHilbert.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmHilbert.h new file mode 100644 index 0000000..6cc6f78 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmHilbert.h @@ -0,0 +1,102 @@ +#pragma once + +#include "../../ovp_defines.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +/** + * \class CBoxAlgorithmHilbert + * \author Alison Cellard (Inria) + * \date Thu Jun 6 13:47:53 2013 + * \brief The class CBoxAlgorithmHilbert describes the box Phase and Envelope. + * + */ +class CBoxAlgorithmHilbert final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + + bool process() override; + + // As we do with any class in openvibe, we use the macro below + // to associate this box to an unique identifier. + // The inheritance information is also made available, + // as we provide the superclass Toolkit::TBoxAlgorithm < IBoxAlgorithm > + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_Hilbert) + +protected: + + // Signal stream decoder + Toolkit::TSignalDecoder m_decoder; + // Signal stream encoder + Toolkit::TSignalEncoder m_algo1Encoder; + Toolkit::TSignalEncoder m_algo2Encoder; + Toolkit::TSignalEncoder m_algo3Encoder; + + Kernel::IAlgorithmProxy* m_hilbertAlgo = nullptr; + + Kernel::TParameterHandler ip_signalMatrix; + Kernel::TParameterHandler op_hilbertMatrix; + Kernel::TParameterHandler op_envelopeMatrix; + Kernel::TParameterHandler op_phaseMatrix; +}; + +/** + * \class CBoxAlgorithmHilbertDesc + * \author Alison Cellard (Inria) + * \date Thu Jun 6 13:47:53 2013 + * \brief Descriptor of the box Phase and Envelope. + * + */ +class CBoxAlgorithmHilbertDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Hilbert Transform"); } + CString getAuthorName() const override { return CString("Alison Cellard"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + + CString getShortDescription() const override { return CString("Hilbert transform, Phase and Envelope from discrete-time analytic signal using Hilbert"); } + + CString getDetailedDescription() const override + { + return CString("Return Hilbert transform, phase and envelope of the input signal using analytic signal computation"); + } + + CString getCategory() const override { return CString("Signal processing/Basic"); } + CString getVersion() const override { return CString("1"); } + CString getStockItemName() const override { return CString("gtk-new"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_Hilbert; } + IPluginObject* create() override { return new CBoxAlgorithmHilbert; } + + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input Signal",OV_TypeId_Signal); + + prototype.addOutput("Hilbert Transform", OV_TypeId_Signal); + prototype.addOutput("Envelope",OV_TypeId_Signal); + prototype.addOutput("Phase",OV_TypeId_Signal); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_HilbertDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmIFFTbox.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmIFFTbox.cpp new file mode 100644 index 0000000..fdcd80f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmIFFTbox.cpp @@ -0,0 +1,183 @@ +#if defined TARGET_HAS_ThirdPartyITPP + +//#define __OpenViBEPlugins_BoxAlgorithm_IFFTbox_CPP__ +// to get ifft: +#include +#include "ovpCBoxAlgorithmIFFTbox.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + + +bool CBoxAlgorithmIFFTbox::initialize() +{ + m_decoder[0].initialize(*this, 0); // Spectrum stream real part decoder + m_decoder[1].initialize(*this, 1); // Spectrum stream imaginary part decoder + m_encoder.initialize(*this, 0); // Signal stream encoder + + m_nSample = 0; + m_headerSent = false; + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmIFFTbox::uninitialize() +{ + m_decoder[0].uninitialize(); + m_decoder[1].uninitialize(); + m_encoder.uninitialize(); + + return true; +} + +bool CBoxAlgorithmIFFTbox::processInput(const size_t /*index*/) +{ + IDynamicBoxContext& boxContext = this->getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + if (boxContext.getInputChunkCount(0) == 0) { return true; } + const uint64_t start = boxContext.getInputChunkStartTime(0, 0); + const uint64_t end = boxContext.getInputChunkEndTime(0, 0); + for (size_t i = 1; i < nInput; ++i) + { + if (boxContext.getInputChunkCount(i) == 0) { return true; } + + if (start != boxContext.getInputChunkStartTime(i, 0) || end != boxContext.getInputChunkEndTime(i, 0)) + { + OV_WARNING_K("Chunk dates mismatch, check stream structure or parameters"); + return false; + } + } + + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmIFFTbox::process() +{ + // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + size_t nHeader = 0; + size_t nBuffer = 0; + size_t nEnd = 0; + + for (size_t i = 0; i < nInput; ++i) + { + m_decoder[i].decode(0); + if (m_decoder[i].isHeaderReceived()) + { + //detect if header of other input is already received + if (0 == nHeader) + { + // Header received. This happens only once when pressing "play". For example with a StreamedMatrix input, you now know the dimension count, sizes, and labels of the matrix + // ... maybe do some process ... + m_channelsNumber = m_decoder[i].getOutputMatrix()->getDimensionSize(0); + m_nSample = m_decoder[i].getOutputMatrix()->getDimensionSize(1); + OV_ERROR_UNLESS_KRF(m_channelsNumber > 0 && m_nSample > 0, "Both dims of the input matrix must have positive size", + Kernel::ErrorType::BadProcessing); + + m_nSample = (m_nSample - 1) * 2; + if (m_nSample == 0) { m_nSample = 1; } + } + else + { + OV_ERROR_UNLESS_KRF( + m_decoder[0].getOutputMatrix()->isDescriptionEqual(*m_decoder[i].getOutputMatrix(), false), + "The matrix components of the two streams have different properties, check stream structures or parameters", + Kernel::ErrorType::BadProcessing); + + OV_ERROR_UNLESS_KRF( + m_decoder[0].getOutputFrequencyAbscissa()->isDescriptionEqual(*m_decoder[i].getOutputFrequencyAbscissa(), false), + "The frequencies abscissas descriptors of the two streams have different properties, check stream structures or parameters", + Kernel::ErrorType::BadProcessing); + + OV_ERROR_UNLESS_KRF( + m_decoder[0].getOutputMatrix()->getDimensionSize(1) == m_decoder[i].getOutputFrequencyAbscissa()->getDimensionSize(0), + "Frequencies abscissas count " << m_decoder[i].getOutputFrequencyAbscissa()->getDimensionSize(0) << + " does not match the corresponding matrix chunk size " << m_decoder[0].getOutputMatrix()->getDimensionSize(1) << + ", check stream structures or parameters", Kernel::ErrorType::BadProcessing); + + OV_ERROR_UNLESS_KRF(m_decoder[0].getOutputSamplingRate(), "Sampling rate must be positive, check stream structures or parameters", + Kernel::ErrorType::BadProcessing); + + OV_ERROR_UNLESS_KRF(m_decoder[0].getOutputSamplingRate() == m_decoder[i].getOutputSamplingRate(), + "Sampling rates don't match (" << m_decoder[0].getOutputSamplingRate() << " != " << m_decoder[i].getOutputSamplingRate() << + "), please check stream structures or parameters", Kernel::ErrorType::BadProcessing); + } + + nHeader++; + } + if (m_decoder[i].isBufferReceived()) { nBuffer++; } + if (m_decoder[i].isEndReceived()) { nEnd++; } + } + + if ((nHeader && nHeader != nInput) || (nBuffer && nBuffer != nInput) || (nEnd && nEnd != nInput)) + { + OV_WARNING_K("Stream structure mismatch"); + return false; + } + + if (nBuffer) + { + OV_ERROR_UNLESS_KRF(m_nSample, "Received buffer before header, shouldn't happen\n", Kernel::ErrorType::BadProcessing); + + if (!m_headerSent) + { + m_signalBuffer.set_size(int(m_nSample)); + m_frequencyBuffer.set_size(int(m_nSample)); + + m_encoder.getInputSamplingRate() = m_decoder[0].getOutputSamplingRate(); + m_encoder.getInputMatrix()->resize(m_channelsNumber, m_nSample); + for (size_t channel = 0; channel < m_channelsNumber; ++channel) + { + m_encoder.getInputMatrix()->setDimensionLabel( + 0, channel, m_decoder[0].getOutputMatrix()->getDimensionLabel(0, channel)); + } + + // Pass the header to the next boxes, by encoding a header on the output 0: + m_encoder.encodeHeader(); + // send the output chunk containing the header. The dates are the same as the input chunk: + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, 0), boxContext.getInputChunkEndTime(0, 0)); + + m_headerSent = true; + } + + const double* bufferInput0 = m_decoder[0].getOutputMatrix()->getBuffer(); + const double* bufferInput1 = m_decoder[1].getOutputMatrix()->getBuffer(); + + for (size_t channel = 0; channel < m_channelsNumber; ++channel) + { + for (size_t j = 0; j < m_nSample; ++j) + { + m_frequencyBuffer[j].real(bufferInput0[int(channel * m_nSample + j)]); + m_frequencyBuffer[j].imag(bufferInput1[int(channel * m_nSample + j)]); + } + + m_signalBuffer = ifft_real(m_frequencyBuffer); + + double* bufferOutput = m_encoder.getInputMatrix()->getBuffer(); + for (size_t j = 0; j < m_nSample; ++j) { bufferOutput[int(channel * m_nSample + j)] = m_signalBuffer[j]; } + } + m_encoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, 0), boxContext.getInputChunkEndTime(0, 0)); + } + if (nEnd) + { + // End of stream received. This happens only once when pressing "stop". Just pass it to the next boxes so they receive the message : + m_encoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, 0), boxContext.getInputChunkEndTime(0, 0)); + } + + return true; +} + +#endif //TARGET_HAS_ThirdPartyITPP +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmIFFTbox.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmIFFTbox.h new file mode 100644 index 0000000..0c519a4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmIFFTbox.h @@ -0,0 +1,94 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyITPP + +//You may have to change this path to match your folder organisation +#include "../../ovp_defines.h" + +#include +#include + +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +/** + * \class CBoxAlgorithmIFFTbox + * \author Guillermo Andrade B. (INRIA) + * \date Fri Jan 20 15:35:05 2012 + * \brief The class CBoxAlgorithmIFFTbox describes the box IFFT box. + * + */ +class CBoxAlgorithmIFFTbox final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_IFFTbox) + +protected: + // Codec algorithms specified in the skeleton-generator: + Toolkit::TSpectrumDecoder m_decoder[2]; + Toolkit::TSignalEncoder m_encoder; +private: + itpp::Vec> m_frequencyBuffer; + itpp::Vec m_signalBuffer; + size_t m_nSample = 0; + size_t m_channelsNumber = 0; + bool m_headerSent = false; +}; + +/** + * \class CBoxAlgorithmIFFTboxDesc + * \author Guillermo Andrade B. (INRIA) + * \date Fri Jan 20 15:35:05 2012 + * \brief Descriptor of the box IFFT box. + * + */ +class CBoxAlgorithmIFFTboxDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("IFFT"); } + CString getAuthorName() const override { return CString("Guillermo Andrade B."); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Compute Inverse Fast Fourier Transformation"); } + + CString getDetailedDescription() const override { return CString("Compute Inverse Fast Fourier Transformation (depends on ITPP/fftw)"); } + + CString getCategory() const override { return CString("Signal processing/Spectral Analysis"); } + CString getVersion() const override { return CString("0.2"); } + CString getStockItemName() const override { return CString("gtk-execute"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_IFFTbox; } + IPluginObject* create() override { return new CBoxAlgorithmIFFTbox; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("real part",OV_TypeId_Spectrum); + prototype.addInput("imaginary part",OV_TypeId_Spectrum); + + prototype.addOutput("Signal output",OV_TypeId_Signal); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_IFFTboxDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE +#endif //TARGET_HAS_ThirdPartyITPP diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmMatrixTranspose.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmMatrixTranspose.cpp new file mode 100644 index 0000000..30fff51 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmMatrixTranspose.cpp @@ -0,0 +1,111 @@ +#include "ovpCBoxAlgorithmMatrixTranspose.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmMatrixTranspose::initialize() +{ + m_decoder.initialize(*this, 0); + m_encoder.initialize(*this, 0); + return true; +} + +bool CBoxAlgorithmMatrixTranspose::uninitialize() +{ + m_encoder.uninitialize(); + m_decoder.uninitialize(); + return true; +} + +bool CBoxAlgorithmMatrixTranspose::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmMatrixTranspose::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_decoder.decode(i); + + if (m_decoder.isHeaderReceived()) + { + const size_t nDim = m_decoder.getOutputMatrix()->getDimensionCount(); + + const CMatrix* input = m_decoder.getOutputMatrix(); + CMatrix* output = m_encoder.getInputMatrix(); + + if (nDim == 1) + { + this->getLogManager() << Kernel::LogLevel_Trace << "Upgrading your 1 dimensional matrix to 2 dimensions, [" << input->getDimensionSize(0) << + "x 1]\n"; + + output->resize(input->getDimensionSize(0), 1); + + for (size_t j = 0; j < input->getDimensionSize(0); ++j) { output->setDimensionLabel(0, j, input->getDimensionLabel(0, j)); } + output->setDimensionLabel(1, 0, "Dimension 0"); + } + else if (nDim == 2) + { + output->resize(input->getDimensionSize(1), input->getDimensionSize(0)); + + for (size_t j = 0; j < output->getDimensionSize(0); ++j) { output->setDimensionLabel(0, j, input->getDimensionLabel(1, j)); } + for (size_t j = 0; j < output->getDimensionSize(1); ++j) { output->setDimensionLabel(1, j, input->getDimensionLabel(0, j)); } + } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Only 1 and 2 dimensional matrices supported\n"; + return false; + } + + this->getLogManager() << Kernel::LogLevel_Trace << "Output matrix will be [" << output->getDimensionSize(0) << "x" << output->getDimensionSize(1) << "]\n"; + + m_encoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + if (m_decoder.isBufferReceived()) + { + const CMatrix* input = m_decoder.getOutputMatrix(); + CMatrix* output = m_encoder.getInputMatrix(); + + if (input->getDimensionCount() == 1) + { + const double* iBuffer = input->getBuffer(); + double* oBuffer = output->getBuffer(); + + for (size_t j = 0; j < input->getBufferElementCount(); ++j) { oBuffer[j] = iBuffer[j]; } + } + else + { + // 2 dim + const size_t nRows = input->getDimensionSize(0); + const size_t nCols = input->getDimensionSize(1); + + const double* iBuffer = input->getBuffer(); + double* oBuffer = output->getBuffer(); + + for (size_t j = 0; j < nRows; ++j) { for (size_t k = 0; k < nCols; ++k) { oBuffer[k * nRows + j] = iBuffer[j * nCols + k]; } } + } + + m_encoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + + if (m_decoder.isEndReceived()) + { + m_encoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmMatrixTranspose.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmMatrixTranspose.h new file mode 100644 index 0000000..97c04f5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmMatrixTranspose.h @@ -0,0 +1,65 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmMatrixTranspose final : virtual public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_MatrixTranspose) + +protected: + + Toolkit::TStreamedMatrixDecoder m_decoder; + Toolkit::TStreamedMatrixEncoder m_encoder; +}; + + +class CBoxAlgorithmMatrixTransposeDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Matrix Transpose"); } + CString getAuthorName() const override { return CString("Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Transposes each matrix of the input stream"); } + + CString getDetailedDescription() const override + { + return CString("Only works for 1 and 2 dimensional matrices. One-dimensional matrixes will be upgraded to two dimensions: [N x 1]"); + } + + CString getCategory() const override { return CString("Signal processing/Basic"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-sort-ascending"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_MatrixTranspose; } + IPluginObject* create() override { return new CBoxAlgorithmMatrixTranspose; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input matrix", OV_TypeId_StreamedMatrix); + prototype.addOutput("Output matrix", OV_TypeId_StreamedMatrix); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_MatrixTransposeDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmNull.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmNull.cpp new file mode 100644 index 0000000..c97d8e6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmNull.cpp @@ -0,0 +1,23 @@ +#include "ovpCBoxAlgorithmNull.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmNull::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmNull::process() +{ + Kernel::IBoxIO* boxContext = getBoxAlgorithmContext()->getDynamicBoxContext(); + const size_t nInput = getBoxAlgorithmContext()->getStaticBoxContext()->getInputCount(); + for (size_t i = 0; i < nInput; ++i) { for (size_t j = 0; j < boxContext->getInputChunkCount(i); ++j) { boxContext->markInputAsDeprecated(i, j); } } + + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmNull.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmNull.h new file mode 100644 index 0000000..9490b62 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmNull.h @@ -0,0 +1,59 @@ +#pragma once + +#include + +#define OVP_ClassId_BoxAlgorithm_Null OpenViBE::CIdentifier(0x601118A8, 0x14BF700F) +#define OVP_ClassId_BoxAlgorithm_NullDesc OpenViBE::CIdentifier(0x6BD21A21, 0x0A5E685A) + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmNull final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(IBoxAlgorithm, OVP_ClassId_BoxAlgorithm_Null) +}; + +class CBoxAlgorithmNullDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("Null"); } + CString getAuthorName() const override { return CString("Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + + CString getShortDescription() const override { return CString("Consumes input and produces nothing. It can be used to show scenario design intent."); } + + CString getDetailedDescription() const override + { + return CString("Directing to Null instead of leaving a box output unconnected may add a tiny overhead."); + } + + CString getCategory() const override { return CString("Signal processing/Basic"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-extras"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_Null; } + IPluginObject* create() override { return new CBoxAlgorithmNull(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input stream", OV_TypeId_EBMLStream); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_NullDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/connectivity/CBoxAlgorithmConnectivityMeasure.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/connectivity/CBoxAlgorithmConnectivityMeasure.cpp new file mode 100644 index 0000000..c42c308 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/connectivity/CBoxAlgorithmConnectivityMeasure.cpp @@ -0,0 +1,247 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmConnectivityMeasure.cpp +/// \brief Implementation of the Box Connectivity Measure. +/// \author Arthur DESBOIS (INRIA). +/// \version 0.0.1. +/// \date Fri Oct 30 16:18:49 2020. +/// +/// \copyright (C) 2020 INRIA +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see . +///------------------------------------------------------------------------------------------------- + + +#include "CBoxAlgorithmConnectivityMeasure.hpp" + + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmConnectivityMeasure::initialize() +{ + m_signalDecoder.initialize(*this, 0); + m_matrixEncoder.initialize(*this, 0); + + m_iMatrix = m_signalDecoder.getOutputMatrix(); + m_oMatrix = m_matrixEncoder.getInputMatrix(); + + // Settings + m_metric = EConnectMetric(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0))); + m_windowMethod = EConnectWindowMethod(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1))); + m_windowLengthSeconds = double(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2)); + m_windowOverlap = int(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3)); + m_connectLengthSeconds = double(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4)); + m_connectOverlap = int(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5)); + m_fftSize = int(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 6)); + m_dcRemoval = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 7); + return true; +} + +/*******************************************************************************/ + +bool CBoxAlgorithmConnectivityMeasure::uninitialize() +{ + m_signalDecoder.uninitialize(); + m_matrixEncoder.uninitialize(); + return true; +} + +bool CBoxAlgorithmConnectivityMeasure::processInput(const size_t) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +/*******************************************************************************/ + + +bool CBoxAlgorithmConnectivityMeasure::process() +{ + + // the static box context describes the box inputs, outputs, settings structures + const Kernel::IBox& staticBoxContext = this->getStaticBoxContext(); + + // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + //iterate over all chunk on input 0 + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_signalDecoder.decode(i); + + const uint64_t tStart = boxContext.getInputChunkStartTime(0, i); // Time Code Chunk Start + const uint64_t tEnd = boxContext.getInputChunkEndTime(0, i); // Time Code Chunk End + + if (m_signalDecoder.isHeaderReceived()) + { + // Header received. This happens only once when pressing "play". + + CMatrix* matrix = m_signalDecoder.getOutputMatrix(); // the StreamedMatrix of samples. + uint64_t sampRate = m_signalDecoder.getOutputSamplingRate(); // the sampling rate of the signal + + m_windowLength = std::floor((float) sampRate * m_windowLengthSeconds); + m_connectLength = std::floor((float) sampRate * m_connectLengthSeconds); + m_connectOverlapSamples = int(std::floor(double(m_connectLength) * double(m_connectOverlap) / 100.0)); + m_windowOverlapSamples = int(std::floor(double(m_windowLength) * double(m_windowOverlap) / 100.0)); + + m_nbChannels = matrix->getDimensionSize(0); + const auto sampPerChan = matrix->getDimensionSize(1); + + this->getLogManager() << Kernel::LogLevel_Debug << "HEADER : nChannels " << m_nbChannels << ", " << sampPerChan + << " samples, sampling rate " << sampRate << "\n"; + this->getLogManager() << Kernel::LogLevel_Debug << "Connectivity segments overlap percent/samples : " + << m_connectOverlap << " " << m_connectOverlapSamples << "\n"; + this->getLogManager() << Kernel::LogLevel_Debug << "Welch Windows overlap percent/samples : " << m_windowOverlap + << " " << m_windowOverlapSamples << "\n"; + + + // Vectors buffers init + m_vectorXdBuffer.resize(m_nbChannels); + m_signalChannelBuffers.resize(m_nbChannels); + + this->getLogManager() << Kernel::LogLevel_Debug << "m_signalChannelBuffers.size() " << m_signalChannelBuffers.size() + << "\n"; + + // Connectivity algo class inits + connectivityMeasure.initialize(m_metric, m_windowMethod, m_windowLength, m_windowOverlap, m_nbChannels, + m_fftSize, m_dcRemoval); + + matrix3DInit(*m_oMatrix, m_fftSize, m_nbChannels, m_nbChannels); // nbFreqs x nbChan x nbChan + + m_matrixEncoder.encodeHeader(); // Pass the header to the next boxes + + } else if (m_signalDecoder.isBufferReceived()) + { + + CMatrix* matrix = m_signalDecoder.getOutputMatrix(); // the StreamedMatrix of samples. + uint64_t sampRate = m_signalDecoder.getOutputSamplingRate(); // the sampling rate of the signal + const auto sampPerChan = matrix->getDimensionSize(1); + + // Accumulate buffers here and send a whole chunk to the connectivity algorithm + const double* buffer = matrix->getBuffer(); + size_t idx = 0; + std::vector temp; + for (size_t row = 0; row < m_nbChannels; ++row) + { + for (size_t col = 0; col < sampPerChan; ++col) + { // parse all columns in the buffer + temp.push_back(buffer[idx++]); + } + m_signalChannelBuffers[row].insert(m_signalChannelBuffers[row].end(), temp.begin(), temp.end()); + temp.clear(); + } + + this->getLogManager() << Kernel::LogLevel_Debug << "BUFFER : " << sampPerChan << " samples per " << m_nbChannels + << " channels, sampling rate " << sampRate << " // Signal buffers size : " + << m_signalChannelBuffers[0].size() << "\n"; + + // If enough data was accumulated, process it. + if (m_signalChannelBuffers[0].size() >= m_connectLength) + { + + this->getLogManager() << Kernel::LogLevel_Debug << "Signal buffers : FULL (" << m_signalChannelBuffers[0].size() + << ")\n"; + + // Convert to Eigen container for easier use in algo + for (size_t aa = 0; aa < m_nbChannels; ++aa) + { + m_vectorXdBuffer[aa] = Eigen::VectorXd::Map(m_signalChannelBuffers[aa].data(), + m_signalChannelBuffers[aa].size()); + } + + // Connectivity chunk overlap for next processing loop: Keep the overlapping part in the vectors, discard the rest + for (size_t aa = 0; aa < m_nbChannels; ++aa) + { + m_signalChannelBuffers[aa].erase(m_signalChannelBuffers[aa].begin(), + m_signalChannelBuffers[aa].begin() + + (m_connectLength - m_connectOverlapSamples)); + } + + // 3D Matrix init, vector of size (chan) of Matrices (chan x fftsize) + std::vector > connectivityMatrix(m_nbChannels, + Eigen::MatrixXd( + m_nbChannels, + m_fftSize)); + + OV_ERROR_UNLESS_KRF(connectivityMeasure.process(m_vectorXdBuffer, connectivityMatrix), + "Connectivity measurement error", Kernel::ErrorType::BadProcessing); + + this->getLogManager() << Kernel::LogLevel_Debug << "Exited connectivityMeasure.process() : connect size " + << connectivityMatrix.size() << " x " << connectivityMatrix[0].rows() << " x " + << connectivityMatrix[0].cols() << "\n"; + + // Convert output matrix (nchan x nchan x fftsize) to matrix (fftsize x nchan x nchan) + matrix3DConvert(connectivityMatrix, *m_oMatrix); + + m_matrixEncoder.encodeBuffer(); + } + + } else if (m_signalDecoder.isEndReceived()) + { + m_matrixEncoder.encodeEnd(); + } + + boxContext.markOutputAsReadyToSend(0, tStart, tEnd); + + } + + return true; +} + +void CBoxAlgorithmConnectivityMeasure::matrix3DInit(CMatrix& m, const size_t dim0, const size_t dim1, const size_t dim2) +{ + m.setDimensionCount(3); + m.setDimensionSize(0, dim0); + m.setDimensionSize(1, dim1); + m.setDimensionSize(2, dim2); +} + +bool CBoxAlgorithmConnectivityMeasure::matrix3DConvert(const std::vector & in, CMatrix& out) +{ + if (in.size() == 0 || in[0].rows() == 0 || in[0].cols() == 0) + { return false; } + const size_t nChan0 = in.size(), nChan1 = in[0].rows(), fftSize = in[0].cols(); + + if (out.getDimensionCount() != 3 + || out.getDimensionSize(0) != fftSize + || out.getDimensionSize(1) != nChan1 + || out.getDimensionSize(2) != nChan0) + { + out.setDimensionCount(3); + out.setDimensionSize(0, fftSize); + out.setDimensionSize(1, nChan1); + out.setDimensionSize(2, nChan0); + } + + size_t idx = 0; + double* buffer = out.getBuffer(); + for (size_t fftIdx = 0; fftIdx < fftSize; ++fftIdx) + { + for (size_t chan1 = 0; chan1 < nChan1; ++chan1) + { + for (size_t chan0 = 0; chan0 < nChan0; ++chan0) + { + buffer[idx++] = in[chan0](chan1, fftIdx); + } + } + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/connectivity/CBoxAlgorithmConnectivityMeasure.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/connectivity/CBoxAlgorithmConnectivityMeasure.hpp new file mode 100644 index 0000000..d09f626 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/connectivity/CBoxAlgorithmConnectivityMeasure.hpp @@ -0,0 +1,160 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmConnectivityMeasure.hpp +/// \brief Classes of the Box Connectivity Measure. +/// \author Arthur DESBOIS (INRIA). +/// \version 0.0.1. +/// \date Fri Oct 30 16:18:49 2020. +/// +/// \copyright (C) 2020 INRIA +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see . +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include + +#include "ovp_defines.h" +#include +#include +#include "connectivityMeasure.hpp" + + +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +/// +/// \brief The class CBoxAlgorithmConnectivityMeasure describes the box Connectivity Measure. +/// +class CBoxAlgorithmConnectivityMeasure final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + + bool uninitialize() override; + + bool processInput(const size_t index) override; + + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_ConnectivityMeasure) + +protected: + + // Algo class instance + ConnectivityMeasure connectivityMeasure; + + // Codecs + Toolkit::TSignalDecoder m_signalDecoder; + Toolkit::TStreamedMatrixEncoder m_matrixEncoder; // Output Matrix Codec + + // Matrices + CMatrix* m_iMatrix = nullptr; // Input Matrix pointer + CMatrix* m_oMatrix = nullptr; // Output Matrix pointer + + std::vector m_vectorXdBuffer; // Vector buffer, for connectivity segments + std::vector > m_signalChannelBuffers; + + Eigen::VectorXd m_window; + + // Settings + EConnectMetric m_metric = EConnectMetric::Coherence; + EConnectWindowMethod m_windowMethod = EConnectWindowMethod::Hann; + + float m_windowLengthSeconds = 0.25f; // size of one windowing (sec) + float m_connectLengthSeconds = 0.5f; // size of one full connectivity estimation occurrence (sec) + + int m_windowLength = 128; // size of one windowing (samples) + int m_windowOverlap = 50; // overlap btw windows (%) + int m_connectLength = 256; // size of one full connectivity estimation occurrence (samples) + int m_connectOverlap = 50; // overlap btw connectivity measurements (%) + int m_fftSize = 128; // FFT size (and nb of freq taps at the output) + + int m_nbChannels = 0; + + int m_connectOverlapSamples = 128; + int m_windowOverlapSamples = 64; + + bool m_dcRemoval = false; + +private: + /// + /// \brief Conversion from a vector of 2D Matrices into OpenViBE's CMatrix of 3 dimensions + /// \param in std:vector (vect of nChan x Matrices (nChan x fftsize) + /// \param out CMatrix of 3 dimensions (fftsize x nchan x nchan) + /// \return True if the conversion was successful, false otherwise + bool matrix3DConvert(const std::vector & in, CMatrix& out); + + /// + /// \brief Initialises 3 dimensions matrix with the provided dimensions + /// \param m The matrix to initialise + /// \param dim1 dimension 1 + /// \param dim2 dimension 2 + /// \param dim3 dimension 3 + void matrix3DInit(CMatrix& m, const size_t dim1, const size_t dim2, const size_t dim3); + +}; + +/// +/// \brief Descriptor of the box Connectivity Measure. +/// +class CBoxAlgorithmConnectivityMeasureDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override {} + CString getName() const override { return CString("Connectivity Measure"); } + CString getAuthorName() const override { return CString("Arthur DESBOIS"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Connectivity Measure"); } + CString getDetailedDescription() const override { return CString("Measure connectivity between pairs of channel"); } + CString getCategory() const override { return CString("Signal processing/Connectivity"); } + CString getVersion() const override { return CString("0.0.1"); } + CString getStockItemName() const override { return CString(""); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ConnectivityMeasure; } + IPluginObject* create() override { return new CBoxAlgorithmConnectivityMeasure; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + + prototype.addOutput("Connectivity Matrix", OV_TypeId_StreamedMatrix); + + prototype.addSetting("Metric", OVP_TypeId_Connectivity_Metric, + toString(EConnectMetric::Coherence).c_str()); + prototype.addSetting("Welch Window method", OV_TypeId_ConnectivityMeasure_WindowMethod, "Hann"); + prototype.addSetting("Welch Window Length (in sec)", OV_TypeId_Float, "0.25"); // s + prototype.addSetting("Welch Window Overlap (in %)", OV_TypeId_Integer, "50"); // percent + prototype.addSetting("Connectivity Measure Length (in sec)", OV_TypeId_Float, "0.5"); //s + prototype.addSetting("Connectivity Measure Overlap (in %)", OV_TypeId_Integer, "50"); // percent + prototype.addSetting("FFT size (frequency taps)", OV_TypeId_Integer, "128"); + prototype.addSetting("DC removal", OV_TypeId_Boolean, "false"); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ConnectivityMeasureDesc) +}; + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmXDAWNSpatialFilterTrainer.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmXDAWNSpatialFilterTrainer.cpp new file mode 100644 index 0000000..4a33efd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmXDAWNSpatialFilterTrainer.cpp @@ -0,0 +1,379 @@ +#if defined TARGET_HAS_ThirdPartyITPP + +#include "ovpCBoxAlgorithmXDAWNSpatialFilterTrainer.h" + +#include +#include +#include +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +// Taken from http://techlogbook.wordpress.com/2009/08/12/adding-generalized-eigenvalue-functions-to-it +// http://techlogbook.wordpress.com/2009/08/12/calling-lapack-functions-from-c-codes +// http://sourceforge.net/projects/itpp/forums/forum/115656/topic/3363490?message=7557038 +// +// http://icl.cs.utk.edu/projectsfiles/f2j/javadoc/org/netlib/lapack/DSYGV.html +// http://www.lassp.cornell.edu/sethna/GeneDynamics/NetworkCodeDocumentation/lapack_8h.html#a17 + +namespace { +extern "C" { +// This symbol comes from LAPACK +/* + void zggev_(char *jobvl, char *jobvr, int *n, std::complex *a, + int *lda, std::complex *b, int *ldb, std::complex *alpha, + std::complex *beta, std::complex *vl, + int *ldvl, std::complex *vr, int *ldvr, + std::complex *work, int *lwork, double *rwork, int *info); +*/ +int dsygv_(int* itype, char* jobz, char* uplo, int* n, double* a, int* lda, double* b, int* ldb, double* w, double* work, int* lwork, int* info); +} +} // namespace + +namespace itppext { +bool eig(const itpp::mat& A, const itpp::mat& B, itpp::vec& d, itpp::mat& V) +{ + it_assert_debug(A.rows() == A.cols(), "eig: Matrix A is not square"); + it_assert_debug(B.rows() == B.cols(), "eig: Matrix B is not square"); + it_assert_debug(A.rows() == B.cols(), "eig: Matrix A and B don't have the same size"); + + const int worksize = 4 * A.rows(); // This may be chosen better! + itpp::mat lA(A); + itpp::mat lB(B); + itpp::vec lW(A.rows()); + itpp::vec lWork(worksize); + lW.zeros(); + lWork.zeros(); + + int itype = 1; // 1: Ax=lBx 2: ABx=lx 3: BAx=lx + char jobz = 'V', uplo = 'U'; + int n = lA.rows(); + double* a = lA._data(); + int lda = n; + double* b = lB._data(); + int ldb = n; + double* w = lW._data(); + int lwork = worksize; + double* work = lWork._data(); + int info = 0; + + dsygv_(&itype, &jobz, &uplo, &n, a, &lda, b, &ldb, w, work, &lwork, &info); + + d = lW; + V = lA; + + return (info == 0); +} + +itpp::mat convert(const CMatrix& matrix) +{ + itpp::mat res(matrix.getDimensionSize(1), matrix.getDimensionSize(0)); + memcpy(res._data(), matrix.getBuffer(), matrix.getBufferElementCount() * sizeof(double)); + return res.transpose(); +} +} // namespace itppext + +bool CBoxAlgorithmXDAWNSpatialFilterTrainer::initialize() +{ + m_stimulationDecoder.initialize(*this, 0); + m_signalDecoder.initialize(*this, 1); + m_evokedPotentialDecoder.initialize(*this, 2); + + m_encoder.initialize(*this, 0); + + m_stimID = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_spatialFilterConfigurationFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_filterDim = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + m_saveAsBoxConfig = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + + return true; +} + +bool CBoxAlgorithmXDAWNSpatialFilterTrainer::uninitialize() +{ + m_evokedPotentialDecoder.uninitialize(); + m_signalDecoder.uninitialize(); + m_stimulationDecoder.uninitialize(); + m_encoder.uninitialize(); + return true; +} + +bool CBoxAlgorithmXDAWNSpatialFilterTrainer::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +namespace { +typedef struct +{ + uint64_t startTime; + uint64_t endTime; + CMatrix* matrix; +} chunk_t; +} + +bool CBoxAlgorithmXDAWNSpatialFilterTrainer::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + bool shouldTrain = false; + uint64_t date = 0, chunkStartTime = 0, chunkEndTime = 0; + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_stimulationDecoder.decode(i); + if (m_stimulationDecoder.isHeaderReceived()) + { + m_encoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + if (m_stimulationDecoder.isBufferReceived()) + { + IStimulationSet* stimSet = m_stimulationDecoder.getOutputStimulationSet(); + // See if there is a training stimulation. If several, accept the first one. + for (size_t j = 0; j < stimSet->getStimulationCount(); ++j) + { + if (stimSet->getStimulationIdentifier(j) == m_stimID) + { + date = stimSet->getStimulationDate(j); // date of the last matching stimulus in the set + chunkStartTime = boxContext.getInputChunkStartTime(0, i); + chunkEndTime = boxContext.getInputChunkEndTime(0, i); + shouldTrain = true; + break; + } + } + } + if (m_stimulationDecoder.isEndReceived()) + { + m_encoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + boxContext.markInputAsDeprecated(0, i); + } + + if (shouldTrain) + { + this->getLogManager() << Kernel::LogLevel_Info << "Received train stimulation - be patient\n"; + this->getLogManager() << Kernel::LogLevel_Trace << "Decoding signal chunks ...\n"; + + bool isContinuous = true; + uint64_t end = 0; + std::vector chunks; + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + m_signalDecoder.decode(i); + if (m_signalDecoder.isHeaderReceived()) + { + // Don't care about the header + } + if (m_signalDecoder.isBufferReceived()) + { + const CMatrix* matrix = m_signalDecoder.getOutputMatrix(); + chunk_t chunk; + chunk.startTime = boxContext.getInputChunkStartTime(1, i); + chunk.endTime = boxContext.getInputChunkEndTime(1, i); + chunk.matrix = new CMatrix; + chunk.matrix->copy(*matrix); + chunks.push_back(chunk); + + if (chunk.startTime != end) + { + this->getLogManager() << Kernel::LogLevel_Error << "Chunk " << i << " start time != last chunk end time [" << chunk.startTime << " vs " + << end << "]\n"; + isContinuous = false; + break; + } + end = chunk.endTime; + } + if (m_signalDecoder.isEndReceived()) { } + boxContext.markInputAsDeprecated(1, i); + } + + if (!isContinuous) + { + // @fixme mem leak + this->getLogManager() << Kernel::LogLevel_Error << "Input signal is not continuous... Can't continue\n"; + return false; + } + + this->getLogManager() << Kernel::LogLevel_Trace << "Decoding evoked response potential chunks ...\n"; + + std::vector evokedPotential; + for (size_t i = 0; i < boxContext.getInputChunkCount(2); ++i) + { + m_evokedPotentialDecoder.decode(i); + if (m_evokedPotentialDecoder.isHeaderReceived()) + { + // Don't care about the header + } + if (m_evokedPotentialDecoder.isBufferReceived()) + { + const CMatrix* matrix = m_evokedPotentialDecoder.getOutputMatrix(); + chunk_t chunk; + chunk.startTime = boxContext.getInputChunkStartTime(2, i); + chunk.endTime = boxContext.getInputChunkEndTime(2, i); + chunk.matrix = new CMatrix; + chunk.matrix->copy(*matrix); + evokedPotential.push_back(chunk); + } + if (m_evokedPotentialDecoder.isEndReceived()) { } + boxContext.markInputAsDeprecated(2, i); + } + + if (evokedPotential.empty()) + { + // @fixme mem leak + this->getLogManager() << Kernel::LogLevel_Error << "No evoked potentials received... Can't continue\n"; + return false; + } + + this->getLogManager() << Kernel::LogLevel_Trace << "Averaging evoked response potential...\n"; + + auto it = evokedPotential.begin(); + CMatrix averagedERPMatrixOV; + averagedERPMatrixOV.copy(*it->matrix); + for (++it; it != evokedPotential.end(); ++it) + { + const double* potentialBuffer = it->matrix->getBuffer(); + double* buffer = averagedERPMatrixOV.getBuffer(); + for (size_t j = 0; j < averagedERPMatrixOV.getBufferElementCount(); ++j) { *(buffer++) += *(potentialBuffer++); } + } + double* buffer = averagedERPMatrixOV.getBuffer(); + for (size_t j = 0; j < averagedERPMatrixOV.getBufferElementCount(); ++j) { (*buffer++) /= evokedPotential.size(); } + + // WARNING - OpenViBE matrices are transposed ITPP matrices ! + + this->getLogManager() << Kernel::LogLevel_Trace << "Converting OpenViBE matrices to IT++ matrices...\n"; + + const size_t nChunk = chunks.size(); + const size_t nChannel = chunks.begin()->matrix->getDimensionSize(0); + const size_t nSamplePerChunk = chunks.begin()->matrix->getDimensionSize(1); + const size_t nSamplePerErp = averagedERPMatrixOV.getDimensionSize(1); + + itpp::mat matrix(nChannel, nChunk * nSamplePerChunk); + it = chunks.begin(); + for (size_t i = 0; it != chunks.end(); ++it, ++i) + { + const itpp::mat m = itppext::convert(*it->matrix); + matrix.set_submatrix(0, int(i) * nSamplePerChunk, m); + } + + itpp::mat averagedERPMatrix(nChannel, nSamplePerErp); + averagedERPMatrix = itppext::convert(averagedERPMatrixOV); + + itpp::mat dMatrix(nChunk * nSamplePerChunk, nSamplePerErp); + dMatrix.clear(); + for (it = evokedPotential.begin(); it != evokedPotential.end(); ++it) + { + // Compute index of the sample corresponding to the start of the ERP + const uint64_t erpStartTime = it->startTime; + const size_t erpStartIndex = size_t(CTime(erpStartTime).toSampleCount(m_signalDecoder.getOutputSamplingRate())); + + for (size_t k = 0; k < nSamplePerErp; ++k) { dMatrix(erpStartIndex + k, k) = 1; } + } + + const itpp::mat A = (averagedERPMatrix * inv(dMatrix.transpose() * dMatrix) * averagedERPMatrix.transpose()) * double(evokedPotential.size()) + / double(nSamplePerChunk * nChunk); + std::stringstream s4; + s4 << "A :\n" << A << "\n"; + this->getLogManager() << Kernel::LogLevel_Debug << s4.str() << "\n"; + + const itpp::mat B = (matrix * matrix.transpose()) / double(nSamplePerChunk * nChunk); + + std::stringstream s5; + s5 << "B :\n" << B << "\n"; + this->getLogManager() << Kernel::LogLevel_Debug << s5.str() << "\n"; + + // Free resources + for (auto& c : chunks) { delete c.matrix; } + chunks.clear(); + + for (auto& ep : evokedPotential) { delete ep.matrix; } + evokedPotential.clear(); + + this->getLogManager() << Kernel::LogLevel_Trace << "Computing generalized eigen vector decomposition...\n"; + + itpp::mat eigenVector; + itpp::vec eigenValue; + + if (itppext::eig(A, B, eigenValue, eigenVector)) + { + std::map eigenVectors; + for (size_t i = 0; i < nChannel; ++i) + { + itpp::vec v = eigenVector.get_col(i); + eigenVectors[eigenValue[i]] = v / norm(v); + } + + size_t cnt = 0; + //We need to compute the size of the first dimension before setting the matrix + const size_t dimension1Size = eigenVectors.size() < m_filterDim ? eigenVectors.size() : m_filterDim; + + CMatrix outputVectors; + outputVectors.resize(dimension1Size, nChannel); + + auto itR = eigenVectors.rbegin(); + for (size_t i = 0; i < dimension1Size; ++itR, i++) { for (size_t j = 0; j < nChannel; ++j) { outputVectors.getBuffer()[cnt++] = itR->second[j]; } } + if (m_saveAsBoxConfig) + { + FILE* file = fopen(m_spatialFilterConfigurationFilename.toASCIIString(), "wb"); + if (!file) + { + this->getLogManager() << Kernel::LogLevel_Error << "The file [" << m_spatialFilterConfigurationFilename + << "] could not be opened for writing..."; + return false; + } + + fprintf(file, "\n"); + fprintf(file, "\t"); + for (size_t i = 0; i < outputVectors.getBufferElementCount(); ++i) { fprintf(file, "%e ", outputVectors.getBuffer()[i]); } + fprintf(file, "\n"); + fprintf(file, "\t%zu\n", m_filterDim); + fprintf(file, "\t%zu\n", nChannel); + fprintf(file, "\t\n"); + fprintf(file, "\n"); + fclose(file); + } + else + { + if (!Toolkit::Matrix::saveToTextFile(outputVectors, m_spatialFilterConfigurationFilename)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Unable to save to [" << m_spatialFilterConfigurationFilename << "\n"; + return false; + } + } + + this->getLogManager() << Kernel::LogLevel_Info << "Training finished... Eigen values are "; + itR = eigenVectors.rbegin(); + for (size_t i = 0; itR != eigenVectors.rend() && i < m_filterDim; ++itR, i++) { this->getLogManager() << " | " << double(itR->first); } + this->getLogManager() << "\n"; + } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Generalized eigen vector decomposition failed...\n"; + return false; + } + + this->getLogManager() << Kernel::LogLevel_Info << "xDAWN Spatial filter trained successfully.\n"; + + m_encoder.getInputStimulationSet()->clear(); + m_encoder.getInputStimulationSet()->appendStimulation(OVTK_StimulationId_TrainCompleted, date, 0); + m_encoder.encodeBuffer(); + + boxContext.markOutputAsReadyToSend(0, chunkStartTime, chunkEndTime); + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyITPP diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmXDAWNSpatialFilterTrainer.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmXDAWNSpatialFilterTrainer.h new file mode 100644 index 0000000..fc1c30f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmXDAWNSpatialFilterTrainer.h @@ -0,0 +1,85 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyITPP + +#include "../../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmXDAWNSpatialFilterTrainer final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_XDAWNSpatialFilterTrainer) + +protected: + + Toolkit::TStimulationDecoder m_stimulationDecoder; + Toolkit::TSignalDecoder m_signalDecoder; + Toolkit::TSignalDecoder m_evokedPotentialDecoder; + + Toolkit::TStimulationEncoder m_encoder; + + uint64_t m_stimID = 0; + CString m_spatialFilterConfigurationFilename; + size_t m_filterDim = 0; + bool m_saveAsBoxConfig = false; +}; + +class CBoxAlgorithmXDAWNSpatialFilterTrainerDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("xDAWN Trainer (Deprecated)"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + + CString getShortDescription() const override + { + return CString( + "Computes spatial filter coeffcients in order to get better evoked potential classification (typically used for P300 detection)"); + } + + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Signal processing/Filtering"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-missing-image"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_XDAWNSpatialFilterTrainer; } + IPluginObject* create() override { return new CBoxAlgorithmXDAWNSpatialFilterTrainer; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Stimulations", OV_TypeId_Stimulations); + prototype.addInput("Session signal", OV_TypeId_Signal); + prototype.addInput("Evoked potential epochs", OV_TypeId_Signal); + prototype.addOutput("Train-completed Flag", OV_TypeId_Stimulations); + + prototype.addSetting("Train stimulation", OV_TypeId_Stimulation, "OVTK_StimulationId_Train"); + prototype.addSetting("Spatial filter configuration", OV_TypeId_Filename, ""); + prototype.addSetting("Filter dimension", OV_TypeId_Integer, "4"); + prototype.addSetting("Save as box config", OV_TypeId_Boolean, "true"); + // prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + prototype.addFlag(Kernel::BoxFlag_IsDeprecated); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_XDAWNSpatialFilterTrainerDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyITPP diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmDiscreteWaveletTransform.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmDiscreteWaveletTransform.cpp new file mode 100644 index 0000000..ac463a5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmDiscreteWaveletTransform.cpp @@ -0,0 +1,216 @@ +#if defined(TARGET_HAS_ThirdPartyFFTW3) // fftw3 required by wavelet2s + +#include "ovpCBoxAlgorithmDiscreteWaveletTransform.h" + +#include +#include +#include +#include +#include +#include + +#include "../../../contrib/packages/wavelet2d/wavelet2s.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmDiscreteWaveletTransform::initialize() +{ + const size_t nOutput = this->getStaticBoxContext().getOutputCount(); + m_decoder.initialize(*this, 0); // Signal stream decoder + m_encoder.initialize(*this, 0); // Signal stream encoder + + m_waveletType = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_decompositionLevel = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + for (size_t o = 0; o < nOutput - 1; ++o) { m_encoders.push_back(new Toolkit::TSignalEncoder(*this, o + 1)); } + + m_infolength = 0; + + return true; +} + + +bool CBoxAlgorithmDiscreteWaveletTransform::uninitialize() +{ + m_decoder.uninitialize(); + m_encoder.uninitialize(); + + for (auto& elem : m_encoders) + { + elem->uninitialize(); + delete elem; + } + m_encoders.clear(); + + return true; +} + + +bool CBoxAlgorithmDiscreteWaveletTransform::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + + +bool CBoxAlgorithmDiscreteWaveletTransform::process() +{ + // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + const int j = std::atoi(m_decompositionLevel); + const std::string nm(m_waveletType.toASCIIString()); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + //Decode input signal + m_decoder.decode(i); + + // Construct header when we receive one + if (m_decoder.isHeaderReceived()) + { + const size_t nChannels0 = m_decoder.getOutputMatrix()->getDimensionSize(0); + const size_t nSamples0 = m_decoder.getOutputMatrix()->getDimensionSize(1); + + if (nSamples0 <= std::pow(2.0, j + 1)) + { + this->getLogManager() << Kernel::LogLevel_Error << "Number of samples [" << nSamples0 << "] is smaller or equal than 2^{J+1} == [" + << std::pow(2.0, j + 1) << "]\n"; + this->getLogManager() << Kernel::LogLevel_Error << "Verify quantity of samples and number of decomposition levels" << "\n"; + this->getLogManager() << Kernel::LogLevel_Error << + "You can introduce a Time based epoching to have more samples per chunk or reduce the decomposition levels" << "\n"; + return false; + } + + //sig will be resized to the number of channels and the total number of samples (Channels x Samples) + m_sig.resize(nChannels0); + for (size_t c = 0; c < nChannels0; ++c) { m_sig[c].resize(nSamples0); } + + //Do one dummy transform to get the m_flag and m_length filled. Since all channels & blocks have the same chunk size in OV, once is enough. + std::vector flag; //flag is an auxiliar vector (see wavelet2d library) + std::vector length; //length contains the length of each decomposition level. last entry is the length of the original signal. + std::vector dwtOutput; //dwt_output is the vector containing the decomposition levels + + dwt(m_sig[0], j, nm, dwtOutput, flag, length); + + // Set info stream dimension + m_infolength = (length.size() + flag.size() + 2); + m_encoder.getInputMatrix()->resize(nChannels0, m_infolength); + + // Set decomposition stream dimensions + for (size_t e = 0; e < m_encoders.size(); ++e) { m_encoders[e]->getInputMatrix()->resize(nChannels0, length[e]); } + + // Set decomposition stream channel names + for (size_t c = 0; c < nChannels0; c++) + { + for (auto& encoder : m_encoders) { encoder->getInputMatrix()->setDimensionLabel(0, c, m_decoder.getOutputMatrix()->getDimensionLabel(0, c)); } + } + + + // Info stream header + m_encoder.getInputSamplingRate().setReferenceTarget(m_decoder.getOutputSamplingRate()); + m_encoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + + // Decomposition stream headers + for (size_t e = 0; e < m_encoders.size(); ++e) + { + const double sampling = double(m_decoder.getOutputSamplingRate()) / std::pow(2.0, int(e)); + m_encoders[e]->getInputSamplingRate() = uint64_t(std::floor(sampling)); + + m_encoders[e]->encodeHeader(); + boxContext.markOutputAsReadyToSend(e + 1, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + + if (m_decoder.isBufferReceived()) + { + const CMatrix* matrix = m_decoder.getOutputMatrix(); + const double* buffer0 = matrix->getBuffer(); + + const size_t nChannels0 = matrix->getDimensionSize(0); + const size_t nSamples0 = matrix->getDimensionSize(1); + + //sig will store the samples of the different channels + for (size_t c = 0; c < nChannels0; ++c) //Number of EEG channels + { + for (size_t s = 0; s < nSamples0; ++s) //Number of Samples per Chunk + { + m_sig[c][s] = (buffer0[s + c * nSamples0]); + } + } + + // Due to how wavelet2s works, we'll have to have the output variables empty before each call. + std::vector> flag; + std::vector> length; + std::vector> dwtOutput; + flag.resize(nChannels0); + length.resize(nChannels0); + dwtOutput.resize(nChannels0); + + //Calculation of wavelets coefficients for each channel. + for (size_t c = 0; c < nChannels0; ++c) { dwt(m_sig[c], j, nm, dwtOutput[c], flag[c], length[c]); } + + //Transmission of some information (flag and legth) to the inverse dwt box + //@fixme since the data dimensions do not change runtime, it should be sufficient to send this only once + for (size_t c = 0; c < nChannels0; ++c) + { + size_t f = 0; + m_encoder.getInputMatrix()->getBuffer()[f + c * m_infolength] = double(length[c].size()); + for (size_t l = 0; l < length[c].size(); ++l) + { + m_encoder.getInputMatrix()->getBuffer()[l + 1 + c * m_infolength] = double(length[c][l]); + f = l; + } + m_encoder.getInputMatrix()->getBuffer()[f + 2 + c * m_infolength] = double(flag[c].size()); + for (size_t l = 0; l < flag[c].size(); ++l) { m_encoder.getInputMatrix()->getBuffer()[f + 3 + l + c * m_infolength] = flag[c][l]; } + } + + //Decode the dwt coefficients of each decomposition level to separate channels + for (size_t c = 0; c < nChannels0; ++c) + { + for (size_t e = 0, vectorPos = 0; e < m_encoders.size(); ++e) + { + CMatrix* oMatrix = m_encoders[e]->getInputMatrix(); + double* oBuffer = oMatrix->getBuffer(); + + // loop levels + for (size_t l = 0; l < size_t(length[c][e]); ++l) { oBuffer[l + c * length[c][e]] = dwtOutput[c][l + vectorPos]; } + + vectorPos = vectorPos + length[c][e]; + } + } + + m_encoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + + for (size_t e = 0; e < m_encoders.size(); ++e) + { + m_encoders[e]->encodeBuffer(); + boxContext.markOutputAsReadyToSend(e + 1, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + + if (m_decoder.isEndReceived()) + { + m_encoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + + for (size_t e = 0; e < m_encoders.size(); ++e) + { + m_encoders[e]->encodeEnd(); + boxContext.markOutputAsReadyToSend(e + 1, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + } + + return true; +} + + +#endif +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmDiscreteWaveletTransform.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmDiscreteWaveletTransform.h new file mode 100644 index 0000000..8d4c0b9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmDiscreteWaveletTransform.h @@ -0,0 +1,141 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyFFTW3) // required by wavelet2s + +//You may have to change this path to match your folder organisation +#include "../ovp_defines.h" + +#include +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +/** + * \class CBoxAlgorithmDiscreteWaveletTransform + * \author Joao-Pedro Berti-Ligabo / Inria + * \date Wed Jul 16 15:05:16 2014 + * \brief The class CBoxAlgorithmDiscreteWaveletTransform describes the box DiscreteWaveletTransform. + * + */ +class CBoxAlgorithmDiscreteWaveletTransform final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_DiscreteWaveletTransform) + +protected: + // Codec algorithms specified in the skeleton-generator: + // Signal stream decoder + Toolkit::TSignalDecoder m_decoder; + + Toolkit::TSignalEncoder m_encoder; + std::vector*> m_encoders; + + CString m_waveletType; + CString m_decompositionLevel; + + size_t m_infolength = 0; + std::vector> m_sig; +}; + + +// The box listener can be used to call specific callbacks whenever the box structure changes : input added, name changed, etc. +// Please uncomment below the callbacks you want to use. +class CBoxAlgorithmDiscreteWaveletTransformListener final : public Toolkit::TBoxListener +{ +public: + + bool onSettingValueChanged(Kernel::IBox& box, const size_t index) override + { + if (index == 0) { return true; } + + if (index == 1) + { + const size_t nOutputs = box.getOutputCount(); + CString str; + box.getSettingValue(1, str); + const size_t nDecompositionLevels = atoi(str); + if (nOutputs != nDecompositionLevels + 2) + { + for (size_t i = 0; i < nOutputs; ++i) { box.removeOutput(nOutputs - i - 1); } + + box.addOutput("Info",OV_TypeId_Signal); + box.addOutput("A",OV_TypeId_Signal); + for (size_t i = nDecompositionLevels; i > 0; i--) { box.addOutput(("D" + std::to_string(i)).c_str(),OV_TypeId_Signal); } + } + } + + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + + +/** + * \class CBoxAlgorithmDiscreteWaveletTransformDesc + * \author Joao-Pedro Berti-Ligabo / Inria + * \date Wed Jul 16 15:05:16 2014 + * \brief Descriptor of the box DiscreteWaveletTransform. + * + */ +class CBoxAlgorithmDiscreteWaveletTransformDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Discrete Wavelet Transform"); } + CString getAuthorName() const override { return CString("Joao-Pedro Berti-Ligabo"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Calculate DiscreteWaveletTransform"); } + + CString getDetailedDescription() const override { return CString("Calculate DiscreteWaveletTransform using different types of wavelets"); } + + CString getCategory() const override { return CString("Signal processing/Wavelets"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gnome-fs-regular.png"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_DiscreteWaveletTransform; } + IPluginObject* create() override { return new CBoxAlgorithmDiscreteWaveletTransform; } + + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmDiscreteWaveletTransformListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Signal",OV_TypeId_Signal); + + prototype.addOutput("Info",OV_TypeId_Signal); + prototype.addOutput("A",OV_TypeId_Signal); + prototype.addOutput("D2",OV_TypeId_Signal); + prototype.addOutput("D1",OV_TypeId_Signal); + + prototype.addSetting("Wavelet type",OVP_TypeId_WaveletType, ""); + prototype.addSetting("Wavelet decomposition levels",OVP_TypeId_WaveletLevel, ""); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_DiscreteWaveletTransformDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE + + +#endif diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmEOG_Denoising.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmEOG_Denoising.cpp new file mode 100644 index 0000000..dbbf201 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmEOG_Denoising.cpp @@ -0,0 +1,172 @@ +#if defined(TARGET_HAS_ThirdPartyEIGEN) + +#include "ovpCBoxAlgorithmEOG_Denoising.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmEOG_Denoising::initialize() +{ + // Signal stream decoder + m_algo0SignalDecoder.initialize(*this, 0); + m_algo1SignalDecoder.initialize(*this, 1); + + m_algo2SignalEncoder.getInputSamplingRate().setReferenceTarget(m_algo0SignalDecoder.getOutputSamplingRate()); + + m_filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + m_fBMatrixFile.open(m_filename.toASCIIString(), std::ios::in); + if (m_fBMatrixFile.fail()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to open [" << m_filename << "] for reading\n"; + return false; + } + + m_fBMatrixFile >> m_nChannels0; + m_fBMatrixFile >> m_nChannels1; + m_fBMatrixFile >> m_nSamples0; + + if (m_fBMatrixFile.fail()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Not able to successfully read dims from [" << m_filename << "]\n"; + m_fBMatrixFile.close(); + return false; + } + + + m_nSamples1 = m_nSamples0; + + m_noiseCoeff.resize(m_nChannels0, m_nChannels1); //Noise Coefficients Matrix (Dim: Channels EEG x Channels EOG) + m_noiseCoeff.setZero(m_nChannels0, m_nChannels1); + + for (size_t i = 0; i < m_nChannels0; ++i) //Number of channels + { + for (size_t j = 0; j < m_nChannels1; ++j) { m_fBMatrixFile >> m_noiseCoeff(i, j); } //Number of Samples per Chunk + } + + if (m_fBMatrixFile.fail()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Not able to successfully read coefficients from [" << m_filename << "]\n"; + m_fBMatrixFile.close(); + return false; + } + + m_fBMatrixFile.close(); + + // Signal stream encoder + m_algo2SignalEncoder.initialize(*this, 0); + + return true; +} + + +bool CBoxAlgorithmEOG_Denoising::uninitialize() +{ + m_algo0SignalDecoder.uninitialize(); + m_algo1SignalDecoder.uninitialize(); + m_algo2SignalEncoder.uninitialize(); + + return true; +} + + +bool CBoxAlgorithmEOG_Denoising::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + + +bool CBoxAlgorithmEOG_Denoising::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + Eigen::MatrixXd data0(m_nChannels0, m_nSamples0); //EEG data + Eigen::MatrixXd data1(m_nChannels1, m_nSamples1); //EOG data + Eigen::MatrixXd eegC(m_nChannels0, m_nSamples0); //Corrected Matrix + + if (boxContext.getInputChunkCount(0) != 0) + { + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) //Don't know why getinputchunkcount(1) + { + // Signal EEG + + // decode the chunk ii on input 0 + m_algo0SignalDecoder.decode(i); + + CMatrix* matrix0 = m_algo0SignalDecoder.getOutputMatrix(); + double* buffer0 = matrix0->getBuffer(); + + for (size_t c = 0; c < m_nChannels0; ++c) //Number of channels + { + for (size_t s = 0; s < m_nSamples0; ++s) { data0(c, s) = buffer0[s + c * m_nSamples0]; } //Number of Samples per Chunk + } + + //Signal EOG + m_algo1SignalDecoder.decode(i); + + CMatrix* matrix1 = m_algo1SignalDecoder.getOutputMatrix(); + double* buffer1 = matrix1->getBuffer(); + + for (size_t c = 0; c < m_nChannels1; ++c) //Number of channels + { + for (size_t s = 0; s < m_nSamples1; ++s) { data1(c, s) = buffer1[s + c * m_nSamples1]; } //Number of Samples per Chunk + } + + + //Set the output (corrected EEG) to the same structure as the EEG input + m_algo2SignalEncoder.getInputMatrix()->resize(m_nChannels0, m_nSamples0); + + + for (size_t c = 0; c < m_nChannels0; c++) + { + m_algo2SignalEncoder.getInputMatrix()->setDimensionLabel(0, c, m_algo0SignalDecoder.getOutputMatrix()->getDimensionLabel(0, c)); + } + + + //Remove the noise + eegC = data0 - (m_noiseCoeff * data1); + + + for (size_t c = 0; c < m_nChannels0; ++c) //Number of EEG channels + { + for (size_t s = 0; s < m_nSamples0; ++s) //Number of Samples per Chunk + { + m_algo2SignalEncoder.getInputMatrix()->getBuffer()[s + c * m_nSamples0] = eegC(c, s); + } + } + + + m_algo2SignalEncoder.getInputSamplingRate().setReferenceTarget(m_algo1SignalDecoder.getOutputSamplingRate()); + + + if (m_algo1SignalDecoder.isHeaderReceived()) + { + m_algo2SignalEncoder.encodeHeader(); + // send the output chunk containing the header. The dates are the same as the input chunk: + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + if (m_algo1SignalDecoder.isBufferReceived()) + { + // Encode the output buffer : + m_algo2SignalEncoder.encodeBuffer(); + // and send it to the next boxes : + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + if (m_algo1SignalDecoder.isEndReceived()) + { + // End of stream received. This happens only once when pressing "stop". Just pass it to the next boxes so they receive the message : + m_algo2SignalEncoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + } + return true; +} + +#endif +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmEOG_Denoising.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmEOG_Denoising.h new file mode 100644 index 0000000..a6158f5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmEOG_Denoising.h @@ -0,0 +1,125 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyEIGEN) + +//You may have to change this path to match your folder organisation +#include "../ovp_defines.h" + +#include +#include +#include + +// Verify Eigen Path +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +/** + * \class CBoxAlgorithmEOG_Denoising + * \author Joao-Pedro Berti-Ligabo / Inria + * \date Tue May 20 15:33:22 2014 + * \brief The class CBoxAlgorithmEOG_Denoising describes the box Test. + * + */ +class CBoxAlgorithmEOG_Denoising final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + //Here is the different process callbacks possible + // - On clock ticks : + //virtual bool processClock(Kernel::CMessageClock& msg); + // - On new input received (the most common behaviour for signal processing) : + bool processInput(const size_t index) override; + + // If you want to use processClock, you must provide the clock frequency. + //virtual uint64_t getClockFrequency(); + + bool process() override; + + // As we do with any class in openvibe, we use the macro below + // to associate this box to an unique identifier. + // The inheritance information is also made available, + // as we provide the superclass Toolkit::TBoxAlgorithm < IBoxAlgorithm > + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_EOG_Denoising) + +protected: + // Codec algorithms specified in the skeleton-generator: + // Signal stream decoder + Toolkit::TSignalDecoder m_algo0SignalDecoder; + Toolkit::TSignalDecoder m_algo1SignalDecoder; + + // Kernel::IAlgorithmProxy* m_matrixRegressionAlgorithm; + // Kernel::TParameterHandler < CMatrix* > ip_pMatrixRegressionAlgorithm_Matrix0; + // Kernel::TParameterHandler < CMatrix* > ip_pMatrixRegressionAlgorithm_Matrix1; + + // Kernel::TParameterHandler < CMatrix* > op_pMatrixRegressionAlgorithm_Matrix; + // Kernel::TParameterHandler < CString > par_Filename; + + + // Signal stream encoder + Toolkit::TSignalEncoder m_algo2SignalEncoder; + + CString m_filename; + std::ifstream m_fBMatrixFile; + Eigen::MatrixXd m_noiseCoeff; + + size_t m_nChannels0 = 0; + size_t m_nChannels1 = 0; + + size_t m_nSamples0 = 0; + size_t m_nSamples1 = 0; +}; + + +/** + * \class CBoxAlgorithmEOG_DenoisingDesc + * \author Joao-Pedro Berti-Ligabo / Inria + * \date Tue May 20 15:33:22 2014 + * \brief Descriptor of the box Test. + * + */ +class CBoxAlgorithmEOG_DenoisingDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("EOG Denoising"); } + CString getAuthorName() const override { return CString("Joao-Pedro Berti-Ligabo"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("EOG Denoising using Regression Analysis"); } + + CString getDetailedDescription() const override { return CString("Algorithm implementation as suggested in Schlogl's article of 2007"); } + + CString getCategory() const override { return CString("Signal processing/Denoising"); } + CString getVersion() const override { return CString("023"); } + CString getStockItemName() const override { return CString("gnome-fs-regular.png"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_EOG_Denoising; } + IPluginObject* create() override { return new CBoxAlgorithmEOG_Denoising; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("EEG",OV_TypeId_Signal); + prototype.addInput("EOG",OV_TypeId_Signal); + + prototype.addOutput("EEG_Corrected",OV_TypeId_Signal); + prototype.addSetting("Filename b Matrix", OV_TypeId_Filename, "b-Matrix-EEG.txt"); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_EOG_DenoisingDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE + +#endif diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmEOG_Denoising_Calibration.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmEOG_Denoising_Calibration.cpp new file mode 100644 index 0000000..f0c8e57 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmEOG_Denoising_Calibration.cpp @@ -0,0 +1,386 @@ +#if defined(TARGET_HAS_ThirdPartyEIGEN) + +#include "ovpCBoxAlgorithmEOG_Denoising_Calibration.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmEOG_Denoising_Calibration::initialize() +{ + m_algo0SignalDecoder.initialize(*this, 0); + m_algo1SignalDecoder.initialize(*this, 1); + m_algo2StimulationDecoder.initialize(*this, 2); + m_stimulationEncoder.initialize(*this, 0); + + m_calibrationFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_stimID = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + m_startTime = 0; + m_endTime = 0; + m_nChunks = 0; + m_chunksVerify = -1; + m_endProcess = false; + m_time = 0; + m_startTimeChunks = 0; + m_endTimeChunks = 0; + + // Random id for tmp token, clash possible if multiple boxes run in parallel (but unlikely) + const CString randomToken = CIdentifier::random().toString(); + m_eegTempFilename = this->getConfigurationManager().expand("${Path_Tmp}/denoising_") + randomToken + "_EEG_tmp.dat"; + m_eogTempFilename = this->getConfigurationManager().expand("${Path_Tmp}/denoising_") + randomToken + "_EOG_tmp.dat"; + + m_eegFile.open(m_eegTempFilename, std::ios::out | std::ios::in | std::ios::trunc); + if (m_eegFile.fail()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Opening [" << m_eegTempFilename << "] for r/w failed\n"; + return false; + } + + m_eogFile.open(m_eogTempFilename, std::ios::out | std::ios::in | std::ios::trunc); + if (m_eogFile.fail()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Opening [" << m_eogTempFilename << "] for r/w failed\n"; + return false; + } + + m_matrixFile.open(m_calibrationFilename.toASCIIString(), std::ios::out | std::ios::trunc); + if (m_matrixFile.fail()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Opening [" << m_calibrationFilename << "] for writing failed\n"; + return false; + } + + return true; +} + + +bool CBoxAlgorithmEOG_Denoising_Calibration::uninitialize() +{ + m_algo0SignalDecoder.uninitialize(); + m_algo1SignalDecoder.uninitialize(); + m_algo2StimulationDecoder.uninitialize(); + m_stimulationEncoder.uninitialize(); + + // Clean up temporary files + if (m_eegFile.is_open()) { m_eegFile.close(); } + if (m_eegTempFilename != CString("")) { std::remove(m_eegTempFilename); } + + if (m_eogFile.is_open()) { m_eogFile.close(); } + if (m_eogTempFilename != CString("")) { std::remove(m_eogTempFilename); } + + if (m_matrixFile.is_open()) { m_matrixFile.close(); } + + return true; +} + + +bool CBoxAlgorithmEOG_Denoising_Calibration::processClock(Kernel::CMessageClock& /*msg*/) +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + if (m_nChunks != m_chunksVerify && m_endProcess == false) + { + m_chunksVerify = m_nChunks; + if (m_time == m_startTime) { m_startTimeChunks = m_nChunks; } + + if (m_time == m_endTime) { m_endTimeChunks = m_nChunks; } + } + else if (m_nChunks == m_chunksVerify && m_endProcess == false) + { + if ((m_startTime >= m_endTime) || (m_endTime >= m_time)) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Verify time interval of sampling" << "\n"; + this->getLogManager() << Kernel::LogLevel_Warning << "Total time of your sample: " << m_time << "\n"; + this->getLogManager() << Kernel::LogLevel_Warning << "b Matrix was NOT successfully calculated" << "\n"; + + m_stimulationEncoder.getInputStimulationSet()->clear(); + m_stimulationEncoder.getInputStimulationSet()->appendStimulation(OVTK_StimulationId_TrainCompleted, 0, 0); + m_stimulationEncoder.encodeBuffer(); + + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, 0), boxContext.getInputChunkEndTime(0, 0)); + + //this->getLogManager() << Kernel::LogLevel_Warning << "You can stop this scenario " <<"\n"; + m_chunksVerify = -1; + m_endProcess = true; + } + else + { + this->getLogManager() << Kernel::LogLevel_Info << "End of data gathering...calculating b matrix" << "\n"; + + m_eegFile.close(); + m_eogFile.close(); + + m_eegFile.open(m_eegTempFilename, std::ios::in | std::ios::app); + if (m_eegFile.fail()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Opening [" << m_eegTempFilename << "] for reading failed\n"; + return false; + } + + m_eogFile.open(m_eogTempFilename, std::ios::in | std::ios::app); + if (m_eogFile.fail()) + { + this->getLogManager() << Kernel::LogLevel_Error << "Opening [" << m_eogTempFilename << "] for reading failed\n"; + return false; + } + + //Process to extract the Matrix B + double aux; + + Eigen::MatrixXd data0(m_nChannels0, m_nSamples0 * m_nChunks); //EEG data + Eigen::MatrixXd data1(m_nChannels1, m_nSamples1 * m_nChunks); //EOG data + + for (size_t k = 0; k < m_nChunks; ++k) + { + for (size_t i = 0; i < m_nChannels0; ++i) //Number of channels + { + for (size_t j = 0; j < m_nSamples0; ++j) //Number of Samples per Chunk + { + m_eegFile >> aux; + data0(i, j + k * m_nSamples0) = aux; + } + } + } + + for (size_t k = 0; k < m_nChunks; ++k) + { + for (size_t i = 0; i < m_nChannels1; ++i) //Number of channels + { + for (size_t j = 0; j < m_nSamples1; ++j) //Number of Samples per Chunk + { + m_eogFile >> aux; + data1(i, j + k * m_nSamples1) = aux; + } + } + } + + // We will eliminate the firsts and lasts chunks of each channel + + Eigen::MatrixXd data0N(m_nChannels0, m_nSamples0 * m_nChunks); //EEG data + Eigen::MatrixXd data1N(m_nChannels1, m_nSamples1 * m_nChunks); //EOG data + + size_t validChunks = m_endTimeChunks - m_startTimeChunks; + + size_t iblockeeg = 0; + size_t jblockeeg = m_startTimeChunks * m_nSamples0 - 1; + size_t pblockeeg = m_nChannels0; + size_t qblockeeg = m_nSamples0 * (validChunks); + size_t iblockeog = 0; + size_t jblockeog = m_startTimeChunks * m_nSamples1 - 1; + size_t pblockeog = m_nChannels1; + size_t qblockeog = m_nSamples1 * (validChunks); + + + data0N = data0.block(iblockeeg, jblockeeg, pblockeeg, qblockeeg); + data1N = data1.block(iblockeog, jblockeog, pblockeog, qblockeog); + + + double nVal = 0; + double min = 1e-6; + double max = 1e6; + + Eigen::VectorXd meanRowEEG(m_nChannels0); + Eigen::VectorXd meanRowEog(m_nChannels1); + + meanRowEEG.setZero(m_nChannels0, 1); + meanRowEog.setZero(m_nChannels1, 1); + + + for (size_t i = 0; i < m_nChannels0; ++i) //Number of channels + { + nVal = 0; + for (size_t j = 0; j < m_nSamples0 * validChunks; ++j) //Number of Samples per Chunk + { + if ((data0N(i, j) > -max && data0N(i, j) < -min) || (data0N(i, j) > min && data0N(i, j) < max)) + { + //Valid Interval + meanRowEEG(i) = meanRowEEG(i) + data0N(i, j); + nVal = nVal + 1; + } + } + if (nVal != 0) { meanRowEEG(i) = meanRowEEG(i) / nVal; } + else { meanRowEEG(i) = 0; } + } + + + for (size_t i = 0; i < m_nChannels1; ++i) //Number of channels + { + nVal = 0; + for (size_t j = 0; j < m_nSamples1 * validChunks; ++j) //Number of Samples per Chunk + { + if ((data1N(i, j) > -max && data1N(i, j) < -min) || (data1N(i, j) > min && data1N(i, j) < max)) + { + //Valid Interval + meanRowEog(i) = meanRowEog(i) + data1N(i, j); + nVal = nVal + 1; + } + } + if (nVal != 0) { meanRowEog(i) = meanRowEog(i) / nVal; } + else { meanRowEog(i) = 0; } + } + + + // The values which are not valid (very large or very small) will be set to the mean value + // So these values will not influence to the covariance calcul because the covariance is centered (value - mean) + + + for (size_t i = 0; i < m_nChannels0; ++i) //Number of channels + { + for (size_t j = 0; j < m_nSamples0 * validChunks; ++j) //Number of total samples + { + if ((data0N(i, j) > -max && data0N(i, j) < -min) || (data0N(i, j) > min && data0N(i, j) < max)) + { + //Valid Interval + data0N(i, j) = data0N(i, j) - meanRowEEG(i); + } + else { data0N(i, j) = 0; } //Invalid + } + } + + + for (size_t i = 0; i < m_nChannels1; ++i) //Number of channels + { + for (size_t j = 0; j < m_nSamples1 * validChunks; ++j) //Number of total samples + { + if ((data1N(i, j) > -max && data1N(i, j) < -min) || (data1N(i, j) > min && data1N(i, j) < max)) + { + //Valid Interval + data1N(i, j) = data1N(i, j) - meanRowEog(i); + } + else { data1N(i, j) = 0; } //Invalid + } + } + + + //Now we need to calculate the matrix b (which tells us the correct weights to be stored in b matrix) + + + Eigen::MatrixXd noiseCoeff(m_nChannels0, m_nChannels1); //Noise Coefficients Matrix (Dim: Channels EEG x Channels EOG) + Eigen::MatrixXd covEog(m_nChannels1, m_nChannels1); + Eigen::MatrixXd covEogInv(m_nChannels1, m_nChannels1); + Eigen::MatrixXd covEegAndEog(m_nChannels0, m_nChannels1); + + covEog = (data1N * data1N.transpose()); + + covEogInv = covEog.inverse(); + + covEegAndEog = data0N * (data1N.transpose()); + + noiseCoeff = covEegAndEog * covEogInv; + + + // Save Matrix b to the file specified in the parameters + + + m_matrixFile << m_nChannels0 << " " << m_nChannels1 << " " << m_nSamples0 << "\n"; + + for (size_t i = 0; i < m_nChannels0; ++i) //Number of channels EEG + { + for (size_t j = 0; j < m_nChannels1; ++j) { m_matrixFile << noiseCoeff(i, j) << "\n"; } //Number of channels EOG + } + + + m_eegFile.close(); + m_eogFile.close(); + m_matrixFile.close(); + + m_chunksVerify = -1; + m_endProcess = true; + + + this->getLogManager() << Kernel::LogLevel_Info << "b Matrix was successfully calculated" << "\n"; + this->getLogManager() << Kernel::LogLevel_Info << "Wrote the matrix to [" << m_calibrationFilename << "]\n"; + + //this->getLogManager() << Kernel::LogLevel_Warning << "You can stop this scenario " <<"\n"; + + m_stimulationEncoder.getInputStimulationSet()->clear(); + m_stimulationEncoder.getInputStimulationSet()->appendStimulation(OVTK_StimulationId_TrainCompleted, 0, 0); + m_stimulationEncoder.encodeBuffer(); + + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, 0), boxContext.getInputChunkEndTime(0, 0)); + } + } + + m_time++; + return true; +} + +bool CBoxAlgorithmEOG_Denoising_Calibration::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + + +bool CBoxAlgorithmEOG_Denoising_Calibration::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + if (m_endProcess) + { + // We have done our stuff and have sent out a stimuli that we're done. However, if we're called again, we just do nothing, + // but do not return false (==error) as this state is normal after training. + return true; + } + + // Signal EEG + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_algo0SignalDecoder.decode(i); + + m_nChannels0 = m_algo0SignalDecoder.getOutputMatrix()->getDimensionSize(0); + m_nSamples0 = m_algo0SignalDecoder.getOutputMatrix()->getDimensionSize(1); + + CMatrix* matrix0 = m_algo0SignalDecoder.getOutputMatrix(); + double* buffer0 = matrix0->getBuffer(); + + for (size_t j = 0; j < matrix0->getBufferElementCount(); ++j) { m_eegFile << buffer0[j] << "\n"; } + } + //Signal EOG + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + m_algo1SignalDecoder.decode(i); + + m_nChannels1 = m_algo1SignalDecoder.getOutputMatrix()->getDimensionSize(0); + m_nSamples1 = m_algo1SignalDecoder.getOutputMatrix()->getDimensionSize(1); + + CMatrix* matrix1 = m_algo1SignalDecoder.getOutputMatrix(); + double* buffer1 = matrix1->getBuffer(); + + for (size_t j = 0; j < matrix1->getBufferElementCount(); ++j) { m_eogFile << buffer1[j] << "\n"; } + + m_nChunks++; + } + + + for (size_t chunk = 0; chunk < boxContext.getInputChunkCount(2); ++chunk) + { + m_algo2StimulationDecoder.decode(chunk); + for (size_t j = 0; j < m_algo2StimulationDecoder.getOutputStimulationSet()->getStimulationCount(); ++j) + { + if (m_algo2StimulationDecoder.getOutputStimulationSet()->getStimulationIdentifier(j) == 33025) + { + m_startTime = m_time; + this->getLogManager() << Kernel::LogLevel_Info << "Start time: " << m_startTime << "\n"; + } + + if (m_algo2StimulationDecoder.getOutputStimulationSet()->getStimulationIdentifier(j) == 33031) + { + m_endTime = m_time; + this->getLogManager() << Kernel::LogLevel_Info << "End time: " << m_endTime << "\n"; + } + + // m_trainDate = m_algo2StimulationDecoder.getOutputStimulationSet()->getStimulationDate(m_algo2StimulationDecoder.getOutputStimulationSet()->getStimulationCount()); + m_trainDate = m_algo2StimulationDecoder.getOutputStimulationSet()->getStimulationDate(j); + } + } + return true; +} + +#endif +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmEOG_Denoising_Calibration.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmEOG_Denoising_Calibration.h new file mode 100644 index 0000000..fd1d7fe --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmEOG_Denoising_Calibration.h @@ -0,0 +1,142 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyEIGEN) + +//You may have to change this path to match your folder organisation +#include "../ovp_defines.h" + +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +/** + * \class CBoxAlgorithmEOG_Denoising_Calibration + * \author Joao-Pedro Berti-Ligabo / Inria + * \date Fri May 23 15:30:58 2014 + * \brief The class CBoxAlgorithmEOG_Denoising_Calibration describes the box EOG_Denoising_Calibration. + * + */ +class CBoxAlgorithmEOG_Denoising_Calibration final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processClock(Kernel::CMessageClock& msg) override; + bool processInput(const size_t index) override; + + // If you want to use processClock, you must provide the clock frequency. + uint64_t getClockFrequency() override { return 1LL << 32; } // the box clock frequency + + bool process() override; + + //virtual bool openfile(); + + // As we do with any class in openvibe, we use the macro below + // to associate this box to an unique identifier. + // The inheritance information is also made available, + // as we provide the superclass Toolkit::TBoxAlgorithm < IBoxAlgorithm > + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_EOG_Denoising_Calibration) + +protected: + Toolkit::TSignalDecoder m_algo0SignalDecoder; + Toolkit::TSignalDecoder m_algo1SignalDecoder; + + Toolkit::TStimulationDecoder m_algo2StimulationDecoder; + Toolkit::TStimulationEncoder m_stimulationEncoder; + + CString m_calibrationFilename; + + size_t m_chunksVerify = 0; + size_t m_nChunks = 0; + bool m_endProcess = false; + std::fstream m_eegFile; + std::fstream m_eogFile; + std::ofstream m_matrixFile; + + double m_startTime = 0; + double m_endTime = 0; + + size_t m_startTimeChunks = 0; + size_t m_endTimeChunks = 0; + + uint64_t m_trainDate = 0; + uint64_t m_trainChunkStartTime = 0; + uint64_t m_trainChunkEndTime = 0; + + double m_time = 0; + + size_t m_nChannels0 = 0; + size_t m_nChannels1 = 0; + + size_t m_nSamples0 = 0; + size_t m_nSamples1 = 0; + + uint64_t m_stimID = 0; + + CString m_eegTempFilename; + CString m_eogTempFilename; +}; + +/** + * \class CBoxAlgorithmEOG_Denoising_CalibrationDesc + * \author Joao-Pedro Berti-Ligabo / Inria + * \date Fri May 23 15:30:58 2014 + * \brief Descriptor of the box EOG_Denoising_Calibration. + * + */ +class CBoxAlgorithmEOG_Denoising_CalibrationDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("EOG Denoising Calibration"); } + CString getAuthorName() const override { return CString("Joao-Pedro Berti-Ligabo"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + + CString getShortDescription() const override { return CString("Algorithm implementation as suggested in Schlogl's article of 2007."); } + + CString getDetailedDescription() const override + { + return CString("Press 'a' to set start point and 'u' to set end point, you can connect the Keyboard Stimulator for that"); + } + + CString getCategory() const override { return CString("Signal processing/Denoising"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gnome-fs-regular.png"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_EOG_Denoising_Calibration; } + IPluginObject* create() override { return new CBoxAlgorithmEOG_Denoising_Calibration; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("EEG",OV_TypeId_Signal); + prototype.addInput("EOG",OV_TypeId_Signal); + prototype.addInput("Stimulations", OV_TypeId_Stimulations); + + prototype.addSetting("Filename b Matrix", OV_TypeId_Filename, "b-Matrix-EEG.cfg"); + prototype.addSetting("End trigger", OV_TypeId_Stimulation, "OVTK_GDF_End_Of_Session"); + + prototype.addOutput("Train-completed Flag",OV_TypeId_Stimulations); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_EOG_Denoising_CalibrationDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE + + +#endif diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmInverse_DWT.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmInverse_DWT.cpp new file mode 100644 index 0000000..187bc32 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmInverse_DWT.cpp @@ -0,0 +1,189 @@ +#if defined(TARGET_HAS_ThirdPartyFFTW3) // required by wavelet2s + +#include "ovpCBoxAlgorithmInverse_DWT.h" + +#include +#include +#include +#include +#include + +#include "../../../contrib/packages/wavelet2d/wavelet2s.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmInverse_DWT::initialize() +{ + const size_t nInput = this->getStaticBoxContext().getInputCount(); + m_algoInfoDecoder.initialize(*this, 0); + + m_waveletType = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_decompositionLevel = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + m_algoXDecoder = new Toolkit::TSignalDecoder [nInput]; + + for (size_t o = 0; o < nInput - 1; ++o) { m_algoXDecoder[o].initialize(*this, o + 1); } + + m_encoder.initialize(*this, 0); + return true; +} + +bool CBoxAlgorithmInverse_DWT::uninitialize() +{ + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + m_algoInfoDecoder.uninitialize(); + + for (size_t o = 0; o < nInput - 1; ++o) { m_algoXDecoder[o].uninitialize(); } + + if (m_algoXDecoder) + { + delete[] m_algoXDecoder; + m_algoXDecoder = nullptr; + } + + m_encoder.uninitialize(); + + return true; +} + + +bool CBoxAlgorithmInverse_DWT::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmInverse_DWT::process() +{ + // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + // size_t J = std::atoi(m_decompositionLevel); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + const std::string nm(m_waveletType.toASCIIString()); + std::vector> dwtop; + std::vector> idwt_output; + std::vector> flag; + std::vector> length; + + size_t flagReceveid = 0; + + std::vector nChannels(nInput); + std::vector nSamples(nInput); + + //Check if all inputs have some information to decode + if (boxContext.getInputChunkCount(nInput - 1) == 1) + { + //Decode the first input (Informations) + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_algoInfoDecoder.decode(i); + + nChannels[0] = m_algoInfoDecoder.getOutputMatrix()->getDimensionSize(0); + nSamples[0] = m_algoInfoDecoder.getOutputMatrix()->getDimensionSize(1); + + + CMatrix* matrix = m_algoInfoDecoder.getOutputMatrix(); + double* buffer = matrix->getBuffer(); + + //this->getLogManager() << Kernel::LogLevel_Warning << "buffer 0 " << (size_t)buffer0[0] << "\n"; + + length.resize(nChannels[0]); + flag.resize(nChannels[0]); + + for (size_t j = 0; j < nChannels[0]; ++j) + { + size_t f = 0; + for (size_t l = 0; l < size_t(buffer[0]); ++l) + { + length[j].push_back(size_t(buffer[l + 1])); + f = l; + } + + for (size_t l = 0; l < size_t(buffer[f + 2]); ++l) { flag[j].push_back(size_t(buffer[f + 3 + l])); } + } + flagReceveid = 1; + } + + //If Informations is decoded + if (flagReceveid == 1) + { + //Decode each decomposition level + for (size_t o = 0; o < nInput - 1; ++o) + { + //Decode data of channels + for (size_t i = 0; i < boxContext.getInputChunkCount(o + 1); ++i) + { + m_algoXDecoder[o].decode(i); + nChannels[o + 1] = m_algoXDecoder[o].getOutputMatrix()->getDimensionSize(0); + nSamples[o + 1] = m_algoXDecoder[o].getOutputMatrix()->getDimensionSize(1); + CMatrix* matrix = m_algoXDecoder[o].getOutputMatrix(); + double* buffer = matrix->getBuffer(); + + //dwtop is the dwt coefficients + dwtop.resize(nChannels[0]); + + //Store input data (dwt coefficients) in just one vector (dwtop) + for (size_t j = 0; j < nChannels[0]; ++j) + { + for (size_t k = 0; k < nSamples[o + 1]; ++k) { dwtop[j].push_back(buffer[k + j * nSamples[o + 1]]); } + } + + //Check if received informations about dwt box are coherent with inverse dwt box settings + if (!length[0].empty() && o == nInput - 2) + { + //Check if quantity of samples received are the same + if (length[0].at(nInput - 1) == dwtop[0].size()) + { + //Resize idwt vector + idwt_output.resize(nChannels[0]); + + //Calculate idwt for each channel + for (size_t j = 0; j < nChannels[0]; ++j) { idwt(dwtop[j], flag[j], nm, idwt_output[j], length[j]); } + + + m_encoder.getInputSamplingRate() = 2 * m_algoXDecoder[o].getOutputSamplingRate(); + + m_encoder.getInputMatrix()->resize(nChannels[0], length[0].at(nInput - 1)); + + + for (size_t j = 0; j < nChannels[0]; j++) + { + m_encoder.getInputMatrix()->setDimensionLabel(0, j, m_algoXDecoder[o].getOutputMatrix()->getDimensionLabel(0, j)); + } + + + //Encode resultant signal to output + for (size_t j = 0; j < nChannels[0]; ++j) + { + for (size_t k = 0; k < size_t(idwt_output[j].size()); ++k) + { + m_encoder.getInputMatrix()->getBuffer()[k + j * size_t(idwt_output[j].size())] = idwt_output[j][k]; + } + } + + + m_encoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + m_encoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + m_encoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + } + } + } + } + + + return true; +} + +#endif +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmInverse_DWT.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmInverse_DWT.h new file mode 100644 index 0000000..6d3a030 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmInverse_DWT.h @@ -0,0 +1,140 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyFFTW3) // required by wavelet2s + +//You may have to change this path to match your folder organisation +#include "../ovp_defines.h" + +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +/** + * \class CBoxAlgorithmInverse_DWT + * \author Joao-Pedro Berti-Ligabo / Inria + * \date Thu Jul 24 10:57:05 2014 + * \brief The class CBoxAlgorithmInverse_DWT describes the box Inverse DWT. + * + */ +class CBoxAlgorithmInverse_DWT final : virtual public Toolkit::TBoxAlgorithm +{ +public: + CBoxAlgorithmInverse_DWT() { } + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_Inverse_DWT) + +protected: + // Codec algorithms specified in the skeleton-generator: + // Signal stream encoder + Toolkit::TSignalEncoder m_encoder; + Toolkit::TSignalDecoder m_algoInfoDecoder; + Toolkit::TSignalDecoder* m_algoXDecoder = nullptr; + + CString m_waveletType; + CString m_decompositionLevel; +}; + + +class CBoxAlgorithmInverse_DWTListener final : public Toolkit::TBoxListener +{ +public: + + bool onSettingValueChanged(Kernel::IBox& box, const size_t index) override + { + if (index == 0) { return true; } + + if (index == 1) + { + const size_t nInput = box.getInputCount(); + + CString nDecompositionLevels; + box.getSettingValue(1, nDecompositionLevels); + + const size_t nDecompositionLevel = atoi(nDecompositionLevels); + + if (nInput != nDecompositionLevel + 2) + { + for (size_t i = 0; i < nInput; ++i) { box.removeInput(nInput - i - 1); } + + box.addInput("Info",OV_TypeId_Signal); + box.addInput("A",OV_TypeId_Signal); + for (size_t i = nDecompositionLevel; i > 0; i--) { box.addInput(("D" + std::to_string(i)).c_str(),OV_TypeId_Signal); } + } + } + + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + + +/** + * \class CBoxAlgorithmInverse_DWTDesc + * \author Joao-Pedro Berti-Ligabo / Inria + * \date Thu Jul 24 10:57:05 2014 + * \brief Descriptor of the box Inverse DWT. + * + */ +class CBoxAlgorithmInverse_DWTDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Inverse DWT"); } + CString getAuthorName() const override { return CString("Joao-Pedro Berti-Ligabo"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Calculate Inverse DiscreteWaveletTransform"); } + + CString getDetailedDescription() const override { return CString("Calculate Inverse DiscreteWaveletTransform using different types of wavelets"); } + + CString getCategory() const override { return CString("Signal processing/Wavelets"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gnome-fs-regular.png"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_Inverse_DWT; } + IPluginObject* create() override { return new CBoxAlgorithmInverse_DWT; } + + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmInverse_DWTListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Info",OV_TypeId_Signal); + prototype.addInput("A",OV_TypeId_Signal); + prototype.addInput("D2",OV_TypeId_Signal); + prototype.addInput("D1",OV_TypeId_Signal); + + prototype.addOutput("Signal",OV_TypeId_Signal); + + prototype.addSetting("Wavelet type",OVP_TypeId_WaveletType, ""); + prototype.addSetting("Wavelet decomposition levels",OVP_TypeId_WaveletLevel, ""); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_Inverse_DWTDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE + + +#endif diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmQuadraticForm.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmQuadraticForm.cpp new file mode 100644 index 0000000..598b2aa --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmQuadraticForm.cpp @@ -0,0 +1,178 @@ +//include OpenViBE +#include "ovpCBoxAlgorithmQuadraticForm.h" + +//include C++ STL +#include +#include +//atoi + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmQuadraticForm::initialize() +{ + //the algorithms that decode and encode the signals + m_decoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalDecoder)); + m_encoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + m_decoder->initialize(); + m_encoder->initialize(); + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)->setReferenceTarget( + m_encoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)); + + //connecting the decoding and encoding the parameters + m_iEBMLBufferHandle.initialize(m_decoder->getInputParameter(OVP_GD_Algorithm_SignalDecoder_InputParameterId_MemoryBufferToDecode)); + m_iMatrixHandle.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + m_oMatrixHandle.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)); + m_oEBMLBufferHandle.initialize(m_encoder->getOutputParameter(OVP_GD_Algorithm_SignalEncoder_OutputParameterId_EncodedMemoryBuffer)); + + //end and start time + m_startTime = 0; + m_endTime = 0; + + //reading the quadratic operator (matrix) values + + //the number of rows/columns + const size_t nRow = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + //setting the size of the matrix + m_quadraticOperator.resize(nRow, nRow); + + //the coefficients + const CString coefs = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + const char* str = coefs.toASCIIString(); + double* buffer = m_quadraticOperator.getBuffer(); + + std::istringstream iss(str); //the stream for parsing the matrix coefficient + double currentValue = 0.0; //the current coefficient being read + + for (size_t i = 0; i < nRow; ++i) + { + for (size_t j = 0; j < nRow; ++j) + { + //actual parsing, checking and storing value if everything is OK + if (!(iss >> currentValue)) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error << + "Error reading quadratic operator coefficients\n The coefficients or the number of coefficient must be wrong\n"; + return false; + } + buffer[i * nRow + j] = currentValue; + } + } + + if (iss >> currentValue) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Warning << + "There may be more coefficients specified in the setting 'Matrix values' than the number of rows/columns can allow\n"; + } + + return true; +} + +bool CBoxAlgorithmQuadraticForm::uninitialize() +{ + //uninitializing algorithms and parameters handlers + m_decoder->uninitialize(); + m_encoder->uninitialize(); + m_iEBMLBufferHandle.uninitialize(); + m_oEBMLBufferHandle.uninitialize(); + m_iMatrixHandle.uninitialize(); + m_oMatrixHandle.uninitialize(); + + //releasing algorithms + getAlgorithmManager().releaseAlgorithm(*m_decoder); + getAlgorithmManager().releaseAlgorithm(*m_encoder); + + return true; +} + +bool CBoxAlgorithmQuadraticForm::processInput(const size_t /*index*/) +{ + //if input is arrived, processing it, i.e., computing the corresponding quadratic forms + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmQuadraticForm::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + //prcessing the input buffers + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + //decoding the input signal + m_iEBMLBufferHandle = boxContext.getInputChunk(0, i); + m_decoder->process(); + //storing the start and end time of the chunk + m_startTime = boxContext.getInputChunkStartTime(0, i); + m_endTime = boxContext.getInputChunkEndTime(0, i); + + //deal with the header if needed (initializations) + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedHeader)) + { + //getting some input matrix properties + m_nChannels = m_iMatrixHandle->getDimensionSize(0); + m_nSamplesPerBuffer = m_iMatrixHandle->getDimensionSize(1); + + //checking that the number of channels is compatible with the quadratic operator size + if (m_nChannels != m_quadraticOperator.getDimensionSize(0)) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error << + "The number of input channels is not compatible with the number of rows/columns of the quadratic operator matrix. This number of rows/columns must be equal to the number of input channels\n"; + return false; + } + + //setting the size of the output buffer + m_oMatrixHandle->resize(1, m_nSamplesPerBuffer); + + m_oEBMLBufferHandle = boxContext.getOutputChunk(0); + //encoding the output + m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeHeader); + //sending the output + boxContext.markOutputAsReadyToSend(0, m_startTime, m_endTime); + } + + //applying the quadratic operator + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedBuffer)) + { + double* buffer = m_quadraticOperator.getBuffer(); + double* iBuffer = m_iMatrixHandle->getBuffer(); + double* oBuffer = m_oMatrixHandle->getBuffer(); + + //applying the quadratic operator for each sample: o = m^T * A * m + for (size_t j = 0; j < m_nSamplesPerBuffer; ++j) + { + std::vector prime(m_nChannels); //performing m' = A * m (intermediate step 1) + for (size_t k = 0; k < prime.size(); ++k) { prime[k] = 0.0; } //initializing with zeros + + //browsing the quadratic operator matrix (A) rows + for (size_t k = 0; k < m_quadraticOperator.getDimensionSize(0); ++k) + { + //browsing the quadratic operator matrix (A) columns + for (size_t l = 0; l < m_quadraticOperator.getDimensionSize(1); ++l) + { + prime[k] += buffer[k * m_quadraticOperator.getDimensionSize(0) + l] * iBuffer[l * m_nChannels + j]; + } + } + + //performing o = m^T * m' (intermediate step 2) + double output = 0.0; + for (size_t k = 0; k < prime.size(); ++k) { output += iBuffer[k * m_nChannels + j] * prime[k]; } + + oBuffer[j] = output; + } + + boxContext.markInputAsDeprecated(0, i); + m_oEBMLBufferHandle = boxContext.getOutputChunk(0); + m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(0, m_startTime, m_endTime); + } + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmQuadraticForm.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmQuadraticForm.h new file mode 100644 index 0000000..b97b343 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmQuadraticForm.h @@ -0,0 +1,90 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmQuadraticForm final : virtual public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + uint64_t getClockFrequency() override { return 0; } // the box clock frequency + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& /*msg*/) override { return true; } + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_QuadraticForm) + +protected: + + //algorithms for encoding and decoding EBML stream + Kernel::IAlgorithmProxy* m_encoder = nullptr; + Kernel::IAlgorithmProxy* m_decoder = nullptr; + + //input and output buffers + Kernel::TParameterHandler m_iEBMLBufferHandle; + Kernel::TParameterHandler m_oEBMLBufferHandle; + + //the signal matrices (input and output) + Kernel::TParameterHandler m_iMatrixHandle; + Kernel::TParameterHandler m_oMatrixHandle; + + //start and end times + uint64_t m_startTime = 0; + uint64_t m_endTime = 0; + + //The matrix used in the quadratic form: the quadratic operator + CMatrix m_quadraticOperator; + + //dimensions (number of input channels and number of samples) of the input buffer + size_t m_nChannels = 0; + size_t m_nSamplesPerBuffer = 0; +}; + +class CBoxAlgorithmQuadraticFormDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Quadratic Form"); } + CString getAuthorName() const override { return CString("Fabien Lotte"); } + CString getAuthorCompanyName() const override { return CString("IRISA-INSA Rennes"); } + + CString getShortDescription() const override { return CString("Perform a quadratic matrix operation on the input signals m (result = m^T * A * m)"); } + + CString getDetailedDescription() const override + { + return CString( + "a square matrix A (which can be seen as a spatial filter) is applied to the input signals m (a vector). Then the transpose m^T of the input signals is multiplied to the resulting vector. In other words the output o is such as: o = m^T * A * m."); + } + + CString getCategory() const override { return CString("Signal processing/Basic"); } + CString getVersion() const override { return CString("0.1"); } + CString getStockItemName() const override { return CString("gtk-missing-image"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_QuadraticForm; } + IPluginObject* create() override { return new CBoxAlgorithmQuadraticForm; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("input signal", OV_TypeId_Signal); + prototype.addOutput("output signal", OV_TypeId_Signal); + prototype.addSetting("Matrix values", OV_TypeId_String, "1 0 0 1"); + prototype.addSetting("Number of rows/columns (square matrix)", OV_TypeId_Integer, "2"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_QuadraticFormDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/ovp_defines.h new file mode 100755 index 0000000..e2e4575 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/ovp_defines.h @@ -0,0 +1,158 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_Identity OpenViBE::CIdentifier(0x5DFFE431, 0x35215C50) +#define OVP_ClassId_IdentityDesc OpenViBE::CIdentifier(0x54743810, 0x6A1A88CC) +#define OVP_ClassId_TimeBasedEpoching OpenViBE::CIdentifier(0x00777FA0, 0x5DC3F560) +#define OVP_ClassId_TimeBasedEpochingDesc OpenViBE::CIdentifier(0x00ABDABE, 0x41381683) +#define OVP_ClassId_BoxAlgorithm_EOG_Denoising OpenViBE::CIdentifier(0xC223FF12, 0x069A987E) +#define OVP_ClassId_BoxAlgorithm_EOG_DenoisingDesc OpenViBE::CIdentifier(0x4F9BE623, 0xF2027046) +#define OVP_ClassId_BoxAlgorithm_EOG_Denoising_Calibration OpenViBE::CIdentifier(0xE8DFE002, 0x70389932) +#define OVP_ClassId_BoxAlgorithm_EOG_Denoising_CalibrationDesc OpenViBE::CIdentifier(0xF4D74831, 0x88B80DCF) +#define OVP_ClassId_BoxAlgorithm_Inverse_DWT OpenViBE::CIdentifier(0x5B5B8468, 0x212CF963) +#define OVP_ClassId_BoxAlgorithm_Inverse_DWTDesc OpenViBE::CIdentifier(0x01B9BC9A, 0x34766AE9) +#define OVP_ClassId_BoxAlgorithm_DiscreteWaveletTransform OpenViBE::CIdentifier(0x824194C5, 0x46D7FDE9) +#define OVP_ClassId_BoxAlgorithm_DiscreteWaveletTransformDesc OpenViBE::CIdentifier(0x6744711B, 0xF21B59EC) +#define OVP_ClassId_BoxAlgorithm_EpochAverage OpenViBE::CIdentifier(0x21283D9F, 0xE76FF640) +#define OVP_ClassId_BoxAlgorithm_EpochAverageDesc OpenViBE::CIdentifier(0x95F5F43E, 0xBE629D82) +#define OVP_ClassId_Algorithm_MatrixAverage OpenViBE::CIdentifier(0x5E5A6C1C, 0x6F6BEB03) +#define OVP_ClassId_Algorithm_MatrixAverageDesc OpenViBE::CIdentifier(0x1992881F, 0xC938C0F2) +#define OVP_ClassId_BoxAlgorithm_Crop OpenViBE::CIdentifier(0x7F1A3002, 0x358117BA) +#define OVP_ClassId_BoxAlgorithm_CropDesc OpenViBE::CIdentifier(0x64D619D7, 0x26CC42C9) +#define OVP_ClassId_BoxAlgorithm_DifferentialIntegral OpenViBE::CIdentifier(0xCE490CBF, 0xDF7BA2E2) +#define OVP_ClassId_BoxAlgorithm_DifferentialIntegralDesc OpenViBE::CIdentifier(0xCE490CBF, 0xDF7BA2E3) +#define OVP_ClassId_BoxAlgorithm_MatrixTranspose OpenViBE::CIdentifier(0x5E0F04B5, 0x5B5005CF) +#define OVP_ClassId_BoxAlgorithm_MatrixTransposeDesc OpenViBE::CIdentifier(0x119249F7, 0x556C7E0D) +#define OVP_ClassId_BoxAlgorithm_ERSPAverage OpenViBE::CIdentifier(0x3CDB4B72, 0x295D51F7) +#define OVP_ClassId_BoxAlgorithm_ERSPAverageDesc OpenViBE::CIdentifier(0x32C45B7E, 0x2F1B7D58) +#define OVP_ClassId_BoxAlgorithm_ARCoefficients OpenViBE::CIdentifier(0xBAADC2F3, 0xB556A07B) +#define OVP_ClassId_BoxAlgorithm_ARCoefficientsDesc OpenViBE::CIdentifier(0xBAADC2F3, 0xB556A07A) +#define OVP_ClassId_BoxAlgorithm_ConnectivityMeasure OpenViBE::CIdentifier(0x994a9a45, 0x4181a048) +#define OVP_ClassId_BoxAlgorithm_ConnectivityMeasureDesc OpenViBE::CIdentifier(0xaf5e56f9, 0xcbc54c18) +#define OVP_ClassId_ReferenceChannel OpenViBE::CIdentifier(0xEFA8E95B, 0x4F22551B) +#define OVP_ClassId_ReferenceChannelDesc OpenViBE::CIdentifier(0x1873B151, 0x969DD4E4) +#define OVP_ClassId_ChannelSelector OpenViBE::CIdentifier(0x39484563, 0x46386889) +#define OVP_ClassId_ChannelSelectorDesc OpenViBE::CIdentifier(0x34893489, 0x44934897) +#define OVP_ClassId_SimpleDSP OpenViBE::CIdentifier(0x00E26FA1, 0x1DBAB1B2) +#define OVP_ClassId_SimpleDSPDesc OpenViBE::CIdentifier(0x00C44BFE, 0x76C9269E) +#define OVP_ClassId_SignalAverage OpenViBE::CIdentifier(0x00642C4D, 0x5DF7E50A) +#define OVP_ClassId_SignalAverageDesc OpenViBE::CIdentifier(0x007CDCE9, 0x16034F77) +#define OVP_ClassId_SignalConcatenation OpenViBE::CIdentifier(0x6568D29B, 0x0D753CCA) +#define OVP_ClassId_SignalConcatenationDesc OpenViBE::CIdentifier(0x3921BACD, 0x1E9546FE) +#define OVP_ClassId_BoxAlgorithm_QuadraticForm OpenViBE::CIdentifier(0x54E73B81, 0x1AD356C6) +#define OVP_ClassId_BoxAlgorithm_QuadraticFormDesc OpenViBE::CIdentifier(0x31C11856, 0x3E4F7B67) +#define OVP_ClassId_BoxAlgorithm_EpochVariance OpenViBE::CIdentifier(0x335384EA, 0x88C917D9) +#define OVP_ClassId_BoxAlgorithm_EpochVarianceDesc OpenViBE::CIdentifier(0xA15EAEC5, 0xAB0CE73D) +#define OVP_ClassId_Algorithm_MatrixVariance OpenViBE::CIdentifier(0x7FEFDCA9, 0x816ED903) +#define OVP_ClassId_Algorithm_MatrixVarianceDesc OpenViBE::CIdentifier(0xE405260B, 0x59EEFAE4) +#define OVP_ClassId_Algorithm_HilbertTransform OpenViBE::CIdentifier(0x344B79DE, 0x89EAAABB) +#define OVP_ClassId_Algorithm_HilbertTransformDesc OpenViBE::CIdentifier(0x8CAB236A, 0xA789800D) +#define OVP_ClassId_BoxAlgorithm_Hilbert OpenViBE::CIdentifier(0x7878A47F, 0x9A8FE349) +#define OVP_ClassId_BoxAlgorithm_HilbertDesc OpenViBE::CIdentifier(0x2DB54E2F, 0x435675EF) +#define OVP_ClassId_Algorithm_ARBurgMethod OpenViBE::CIdentifier(0x3EC6A165, 0x2823A034) +#define OVP_ClassId_Algorithm_ARBurgMethodDesc OpenViBE::CIdentifier(0xD7234DFF, 0x55447A14) +#define OVP_ClassId_BoxAlgorithm_XDAWNSpatialFilterTrainer OpenViBE::CIdentifier(0xAE241F9F, 0x599FAD88) +#define OVP_ClassId_BoxAlgorithm_XDAWNSpatialFilterTrainerDesc OpenViBE::CIdentifier(0x46FFAD13, 0x5F5C68CE) +#define OVP_ClassId_BoxAlgorithm_IFFTbox OpenViBE::CIdentifier(0xD533E997, 0x4AFD2423) +#define OVP_ClassId_BoxAlgorithm_IFFTboxDesc OpenViBE::CIdentifier(0xD533E997, 0x4AFD2423) +#define OVP_ClassId_BoxAlgorithm_Matrix3dTo2d OpenViBE::CIdentifier(0x3ab2b81e, 0x73ef01a5) +#define OVP_ClassId_BoxAlgorithm_Matrix3dTo2dDesc OpenViBE::CIdentifier(0xb9099590, 0xae33d758) + +// Type definitions +//--------------------------------------------------------------------------------------------------- + +#define OVP_TypeId_EpochAverageMethod OpenViBE::CIdentifier(0x6530BDB1, 0xD057BBFE) +#define OVP_TypeId_CropMethod OpenViBE::CIdentifier(0xD0643F9E, 0x8E35FE0A) +#define OVP_TypeId_SelectionMethod OpenViBE::CIdentifier(0x3BCF9E67, 0x0C23994D) +#define OVP_TypeId_MatchMethod OpenViBE::CIdentifier(0x666F25E9, 0x3E5738D6) +#define OVP_TypeId_DifferentialIntegralOperation OpenViBE::CIdentifier(0x6E6AD85D, 0x14FD203A) +#define OVP_TypeId_WindowType OpenViBE::CIdentifier(0x332BBB80, 0xC212810A) +#define OVP_TypeId_WaveletType OpenViBE::CIdentifier(0x393EAC3E, 0x793C0F1D) +#define OVP_TypeId_WaveletLevel OpenViBE::CIdentifier(0xF80A2144, 0x6E692C51) + +enum class EEpochAverageMethod { Moving, MovingImmediate, Block, Cumulative }; + +enum class ECropMethod { Min, Max, MinMax }; + +enum class ESelectionMethod { Select, Reject, Select_EEG }; + +enum class EMatchMethod { Name, Index, Smart }; + +enum class EDifferentialIntegralOperation { Differential, Integral }; + +enum class EWaveletType +{ + Haar, + Db1, Db2, Db3, Db4, Db5, Db6, Db7, Db8, Db9, Db10, Db11, Db12, Db13, Db14, Db15, + Bior11, Bior13, Bior15, Bior22, Bior24, Bior26, Bior28, Bior31, Bior33, Bior35, Bior37, Bior39, Bior44, Bior55, Bior68, + Coif1, Coif2, Coif3, Coif4, Coif5, + Sym1, Sym2, Sym3, Sym4, Sym5, Sym6, Sym7, Sym8, Sym9, Sym10 +}; + +enum class EWaveletLevel { L1, L2, L3, L4, L5 }; + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#define OVP_Value_CoupledStringSeparator '-' +//#define OVP_Value_AllSelection '*' + +#define OVP_Algorithm_MatrixAverage_InputParameterId_Matrix OpenViBE::CIdentifier(0x913E9C3B, 0x8A62F5E3) +#define OVP_Algorithm_MatrixAverage_InputParameterId_MatrixCount OpenViBE::CIdentifier(0x08563191, 0xE78BB265) +#define OVP_Algorithm_MatrixAverage_InputParameterId_AveragingMethod OpenViBE::CIdentifier(0xE63CD759, 0xB6ECF6B7) +#define OVP_Algorithm_MatrixAverage_OutputParameterId_AveragedMatrix OpenViBE::CIdentifier(0x03CE5AE5, 0xBD9031E0) +#define OVP_Algorithm_MatrixAverage_InputTriggerId_Reset OpenViBE::CIdentifier(0x670EC053, 0xADFE3F5C) +#define OVP_Algorithm_MatrixAverage_InputTriggerId_FeedMatrix OpenViBE::CIdentifier(0x50B6EE87, 0xDC42E660) +#define OVP_Algorithm_MatrixAverage_InputTriggerId_ForceAverage OpenViBE::CIdentifier(0xBF597839, 0xCD6039F0) +#define OVP_Algorithm_MatrixAverage_OutputTriggerId_AveragePerformed OpenViBE::CIdentifier(0x2BFF029B, 0xD932A613) + +#define OVP_Algorithm_StimulationBasedEpoching_InputParameterId_InputSignal OpenViBE::CIdentifier(0x0ED5C92B, 0xE16BEF25) +#define OVP_Algorithm_StimulationBasedEpoching_InputParameterId_OffsetSampleCount OpenViBE::CIdentifier(0x7646CE65, 0xE128FC4E) +#define OVP_Algorithm_StimulationBasedEpoching_OutputParameterId_OutputSignal OpenViBE::CIdentifier(0x00D331A2, 0xC13DF043) +#define OVP_Algorithm_StimulationBasedEpoching_InputTriggerId_Reset OpenViBE::CIdentifier(0x6BA44128, 0x418CF901) +#define OVP_Algorithm_StimulationBasedEpoching_InputTriggerId_PerformEpoching OpenViBE::CIdentifier(0xD05579B5, 0x2649A4B2) +#define OVP_Algorithm_StimulationBasedEpoching_OutputTriggerId_EpochingDone OpenViBE::CIdentifier(0x755BC3FE, 0x24F7B50F) +#define OVP_Algorithm_StimulationBasedEpoching_InputParameterId_EndTimeChunkToProcess OpenViBE::CIdentifier(0x8B552604, 0x10CD1F94) + +#define OVP_Algorithm_MatrixVariance_InputParameterId_Matrix OpenViBE::CIdentifier(0x781F51CA, 0xE6E3B0B8) +#define OVP_Algorithm_MatrixVariance_InputParameterId_MatrixCount OpenViBE::CIdentifier(0xE5103C63, 0x08D825E0) +#define OVP_Algorithm_MatrixVariance_InputParameterId_AveragingMethod OpenViBE::CIdentifier(0x043A1BC4, 0x925D3CD6) +#define OVP_Algorithm_MatrixVariance_InputParameterId_SignificanceLevel OpenViBE::CIdentifier(0x1E1065B2, 0x2CA32013) +#define OVP_Algorithm_MatrixVariance_OutputParameterId_AveragedMatrix OpenViBE::CIdentifier(0x5CF66A73, 0xF5BBF0BF) +#define OVP_Algorithm_MatrixVariance_OutputParameterId_Variance OpenViBE::CIdentifier(0x1BD67420, 0x587600E6) +#define OVP_Algorithm_MatrixVariance_OutputParameterId_ConfidenceBound OpenViBE::CIdentifier(0x1E1065B2, 0x2CA32013) +#define OVP_Algorithm_MatrixVariance_InputTriggerId_Reset OpenViBE::CIdentifier(0xD5C5EF91, 0xE1B1C4F4) +#define OVP_Algorithm_MatrixVariance_InputTriggerId_FeedMatrix OpenViBE::CIdentifier(0xEBAEB213, 0xDD4735A0) +#define OVP_Algorithm_MatrixVariance_InputTriggerId_ForceAverage OpenViBE::CIdentifier(0x344A52F5, 0x489DB439) +#define OVP_Algorithm_MatrixVariance_OutputTriggerId_AveragePerformed OpenViBE::CIdentifier(0x2F9ECA0B, 0x8D3CA7BD) + +#define OVP_Algorithm_ARBurgMethod_InputParameterId_Matrix OpenViBE::CIdentifier(0x36A69669, 0x3651271D) +#define OVP_Algorithm_ARBurgMethod_OutputParameterId_Matrix OpenViBE::CIdentifier(0x55EF8C81, 0x178A51B2) +#define OVP_Algorithm_ARBurgMethod_InputParameterId_UInteger OpenViBE::CIdentifier(0x33139BC1, 0x03D30D3B) +#define OVP_Algorithm_ARBurgMethod_InputTriggerId_Initialize OpenViBE::CIdentifier(0xC27B06C6, 0xB8EB5F8D) +#define OVP_Algorithm_ARBurgMethod_InputTriggerId_Process OpenViBE::CIdentifier(0xBEEBBE84, 0x4F14F8F8) +#define OVP_Algorithm_ARBurgMethod_OutputTriggerId_ProcessDone OpenViBE::CIdentifier(0xA5AAD435, 0x9EC3DB80) + +#define OVP_Algorithm_MagnitudeSquaredCoherence_InputParameterId_SegLength OpenViBE::CIdentifier(0xA4826743, 0x0FA27C06) +#define OVP_Algorithm_MagnitudeSquaredCoherence_InputParameterId_Overlap OpenViBE::CIdentifier(0x527F8AEC, 0xA25F2EAB) +#define OVP_Algorithm_MagnitudeSquaredCoherence_InputParameterId_Window OpenViBE::CIdentifier(0x0EA349EE, 0xB9DC95D0) +#define OVP_Algorithm_MagnitudeSquaredCoherence_InputParameterId_Nfft OpenViBE::CIdentifier(0x7726C677, 0xE266C5A2) +#define OVP_Algorithm_MagnitudeSquaredCoherence_OutputParameterId_OutputMatrixSpectrum OpenViBE::CIdentifier(0x331326BA, 0xA94CFC8A) +#define OVP_Algorithm_MagnitudeSquaredCoherence_OutputParameterId_FreqVector OpenViBE::CIdentifier(0xD9FAA21C, 0x67D7C451) + +#define OVP_Algorithm_HilbertTransform_InputParameterId_Matrix OpenViBE::CIdentifier(0xC117CE9A, 0x3FFCB156) +#define OVP_Algorithm_HilbertTransform_OutputParameterId_HilbertMatrix OpenViBE::CIdentifier(0xDAE13CB8, 0xEFF82E69) +#define OVP_Algorithm_HilbertTransform_OutputParameterId_EnvelopeMatrix OpenViBE::CIdentifier(0x9D0A023A, 0x7690C48E) +#define OVP_Algorithm_HilbertTransform_OutputParameterId_PhaseMatrix OpenViBE::CIdentifier(0x495B55E2, 0x8CAAC08E) +#define OVP_Algorithm_HilbertTransform_InputTriggerId_Initialize OpenViBE::CIdentifier(0xE4B3CB4A, 0xF0121A20) +#define OVP_Algorithm_HilbertTransform_InputTriggerId_Process OpenViBE::CIdentifier(0xC3DC087D, 0x4AAFC1F0) +#define OVP_Algorithm_HilbertTransform_OutputTriggerId_ProcessDone OpenViBE::CIdentifier(0xB0B2A2DD, 0x73529B46) + +#define OVP_TypeId_Connectivity_Metric OpenViBE::CIdentifier(0x9188339d, 0x5da83a84) +#define OV_TypeId_ConnectivityMeasure_WindowMethod OpenViBE::CIdentifier(0x8815bfa7, 0x557b102f) + +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/ovp_main.cpp new file mode 100755 index 0000000..12d8bd2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/src/ovp_main.cpp @@ -0,0 +1,167 @@ +#include "box-algorithms/basic/ovpCBoxAlgorithmMatrixTranspose.h" +#include "box-algorithms/basic/ovpCBoxAlgorithmDifferentialIntegral.h" + +#include "box-algorithms/connectivity/CBoxAlgorithmConnectivityMeasure.hpp" + +#include "box-algorithms/basic/ovpCBoxAlgorithmHilbert.h" +#include "algorithms/basic/ovpCHilbertTransform.h" + +#include "box-algorithms/ovpCBoxAlgorithmQuadraticForm.h" + +#include "box-algorithms/filters/ovpCBoxAlgorithmXDAWNSpatialFilterTrainer.h" + +#include "box-algorithms/basic/ovpCBoxAlgorithmIFFTbox.h" + +#include "algorithms/basic/ovpCAlgorithmARBurgMethod.h" +#include "box-algorithms/basic/ovpCBoxAlgorithmARCoefficients.h" + +#include "algorithms/basic/ovpCMatrixVariance.h" +#include "box-algorithms/basic/ovpCBoxAlgorithmEpochVariance.h" +#include "box-algorithms/basic/ovpCBoxAlgorithmERSPAverage.h" + +//#include "box-algorithms/basic/ovpCBoxAlgorithmNull.h" + +#include "box-algorithms/ovpCBoxAlgorithmEOG_Denoising.h" +#include "box-algorithms/ovpCBoxAlgorithmEOG_Denoising_Calibration.h" +#include "box-algorithms/ovpCBoxAlgorithmDiscreteWaveletTransform.h" +#include "box-algorithms/ovpCBoxAlgorithmInverse_DWT.h" + +#include "box-algorithms/CBoxAlgorithmMatrix3dTo2d.hpp" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +OVP_Declare_Begin() + //*********** Boxes *********** + OVP_Declare_New(CBoxAlgorithmDifferentialIntegralDesc) + OVP_Declare_New(CBoxAlgorithmMatrixTransposeDesc) + //OVP_Declare_New(CBoxAlgorithmNullDesc) + OVP_Declare_New(CBoxAlgorithmERSPAverageDesc) + OVP_Declare_New(CBoxAlgorithmQuadraticFormDesc) + OVP_Declare_New(CEpochVarianceDesc); + OVP_Declare_New(CBoxAlgorithmMatrix3dTo2dDesc) + +#if defined TARGET_HAS_ThirdPartyEIGEN + OVP_Declare_New(CBoxAlgorithmARCoefficientsDesc); + OVP_Declare_New(CAlgorithmARBurgMethodDesc); + OVP_Declare_New(CAlgorithmHilbertTransformDesc) + OVP_Declare_New(CBoxAlgorithmConnectivityMeasureDesc) + OVP_Declare_New(CBoxAlgorithmEOG_DenoisingDesc); + OVP_Declare_New(CBoxAlgorithmEOG_Denoising_CalibrationDesc); + OVP_Declare_New(CBoxAlgorithmHilbertDesc) +#endif + +#if defined TARGET_HAS_ThirdPartyITPP + OVP_Declare_New(CBoxAlgorithmXDAWNSpatialFilterTrainerDesc) + OVP_Declare_New(CMatrixVarianceDesc) + OVP_Declare_New(CBoxAlgorithmIFFTboxDesc) +#endif // TARGET_HAS_ThirdPartyITPP + +#if defined(TARGET_HAS_ThirdPartyFFTW3) + OVP_Declare_New(CBoxAlgorithmDiscreteWaveletTransformDesc) + OVP_Declare_New(CBoxAlgorithmInverse_DWTDesc) + + //*********** Enumeration *********** + context.getTypeManager().registerEnumerationType(OVP_TypeId_WaveletType, "Wavelet type"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "haar", size_t(EWaveletType::Haar)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "db1", size_t(EWaveletType::Db1)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "db2", size_t(EWaveletType::Db2)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "db3", size_t(EWaveletType::Db3)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "db4", size_t(EWaveletType::Db4)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "db5", size_t(EWaveletType::Db5)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "db6", size_t(EWaveletType::Db6)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "db7", size_t(EWaveletType::Db7)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "db8", size_t(EWaveletType::Db8)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "db9", size_t(EWaveletType::Db9)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "db10", size_t(EWaveletType::Db10)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "db11", size_t(EWaveletType::Db11)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "db12", size_t(EWaveletType::Db12)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "db13", size_t(EWaveletType::Db13)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "db14", size_t(EWaveletType::Db14)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "db15", size_t(EWaveletType::Db15)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "bior1.1", size_t(EWaveletType::Bior11)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "bior1.3", size_t(EWaveletType::Bior13)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "bior1.5", size_t(EWaveletType::Bior15)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "bior2.2", size_t(EWaveletType::Bior22)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "bior2.4", size_t(EWaveletType::Bior24)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "bior2.6", size_t(EWaveletType::Bior26)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "bior2.8", size_t(EWaveletType::Bior28)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "bior3.1", size_t(EWaveletType::Bior31)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "bior3.3", size_t(EWaveletType::Bior33)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "bior3.5", size_t(EWaveletType::Bior35)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "bior3.7", size_t(EWaveletType::Bior37)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "bior3.9", size_t(EWaveletType::Bior39)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "bior4.4", size_t(EWaveletType::Bior44)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "bior5.5", size_t(EWaveletType::Bior55)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "bior6.8", size_t(EWaveletType::Bior68)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "coif1", size_t(EWaveletType::Coif1)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "coif2", size_t(EWaveletType::Coif2)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "coif3", size_t(EWaveletType::Coif3)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "coif4", size_t(EWaveletType::Coif4)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "coif5", size_t(EWaveletType::Coif5)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "sym1", size_t(EWaveletType::Sym1)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "sym2", size_t(EWaveletType::Sym2)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "sym3", size_t(EWaveletType::Sym3)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "sym4", size_t(EWaveletType::Sym4)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "sym5", size_t(EWaveletType::Sym5)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "sym6", size_t(EWaveletType::Sym6)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "sym7", size_t(EWaveletType::Sym7)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "sym8", size_t(EWaveletType::Sym8)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "sym9", size_t(EWaveletType::Sym9)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletType, "sym10", size_t(EWaveletType::Sym10)); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_WaveletLevel, "Wavelet decomposition levels"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletLevel, "1", size_t(EWaveletLevel::L1)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletLevel, "2", size_t(EWaveletLevel::L2)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletLevel, "3", size_t(EWaveletLevel::L3)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletLevel, "4", size_t(EWaveletLevel::L4)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WaveletLevel, "5", size_t(EWaveletLevel::L5)); +#endif + context.getTypeManager().registerEnumerationEntry(OV_TypeId_BoxAlgorithmFlag, OV_AttributeId_Box_FlagIsUnstable.toString(), + OV_AttributeId_Box_FlagIsUnstable.id()); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_EpochAverageMethod, "Epoch Average method"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_EpochAverageMethod, "Moving epoch average", size_t(EEpochAverageMethod::Moving)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_EpochAverageMethod, "Moving epoch average (Immediate)", + size_t(EEpochAverageMethod::MovingImmediate)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_EpochAverageMethod, "Epoch block average", size_t(EEpochAverageMethod::Block)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_EpochAverageMethod, "Cumulative average", size_t(EEpochAverageMethod::Cumulative)); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_CropMethod, "Crop method"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_CropMethod, "Min", size_t(ECropMethod::Min)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_CropMethod, "Max", size_t(ECropMethod::Max)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_CropMethod, "Min/Max", size_t(ECropMethod::MinMax)); + + + context.getTypeManager().registerEnumerationType(OVP_TypeId_SelectionMethod, "Selection method"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SelectionMethod, "Select", size_t(ESelectionMethod::Select)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SelectionMethod, "Reject", size_t(ESelectionMethod::Reject)); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_MatchMethod, "Match method"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_MatchMethod, "Name", size_t(EMatchMethod::Name)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_MatchMethod, "Index", size_t(EMatchMethod::Index)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_MatchMethod, "Smart", size_t(EMatchMethod::Smart)); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_DifferentialIntegralOperation, "Differential/Integral select"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_DifferentialIntegralOperation, "Differential", + size_t(EDifferentialIntegralOperation::Differential)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_DifferentialIntegralOperation, "Integral", size_t(EDifferentialIntegralOperation::Integral)); + +#if defined(TARGET_HAS_ThirdPartyEIGEN) + context.getTypeManager().registerEnumerationType(OV_TypeId_ConnectivityMeasure_WindowMethod, "Welch Window method"); + context.getTypeManager().registerEnumerationEntry(OV_TypeId_ConnectivityMeasure_WindowMethod, "Hamming", size_t(EConnectWindowMethod::Hamming)); + context.getTypeManager().registerEnumerationEntry(OV_TypeId_ConnectivityMeasure_WindowMethod, "Hann", size_t(EConnectWindowMethod::Hann)); + context.getTypeManager().registerEnumerationEntry(OV_TypeId_ConnectivityMeasure_WindowMethod, "Welch", size_t(EConnectWindowMethod::Welch)); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_Connectivity_Metric, "Metric method"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Connectivity_Metric, toString(EConnectMetric::Coherence).c_str(), size_t(EConnectMetric::Coherence)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Connectivity_Metric, toString(EConnectMetric::MagnitudeSquaredCoherence).c_str(), size_t(EConnectMetric::MagnitudeSquaredCoherence)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Connectivity_Metric, toString(EConnectMetric::ImaginaryCoherence).c_str(), size_t(EConnectMetric::ImaginaryCoherence)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Connectivity_Metric, toString(EConnectMetric::AbsImaginaryCoherence).c_str(), size_t(EConnectMetric::AbsImaginaryCoherence)); +#endif +OVP_Declare_End() + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/.gitignore b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/.gitignore new file mode 100644 index 0000000..740494d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/.gitignore @@ -0,0 +1,5 @@ +/ARFeatures.csv +/envelope_HilbertTransform.csv +/hilbert_HilbertTransform.csv +/phase_HilbertTransform.csv +/PhaseLockingValue.csv diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/ARFeatures.ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/ARFeatures.ref.csv new file mode 100644 index 0000000..e84e886 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/ARFeatures.ref.csv @@ -0,0 +1,9 @@ +Time (s);Channel 1 +0.0000000000e+000;1.0000000000e+000 +0.0000000000e+000;-1.3499924204e+000 +0.0000000000e+000;7.1548116977e-001 +0.0000000000e+000;-4.8823484546e-001 +0.0000000000e+000;1.3773934216e-001 +0.0000000000e+000;2.4122886822e-001 +0.0000000000e+000;-4.1646742087e-001 +0.0000000000e+000;1.6024997233e-001 diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/ARFeatures.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/ARFeatures.xml new file mode 100644 index 0000000..8a3ece6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/ARFeatures.xml @@ -0,0 +1,534 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00000294, 0x00001670) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + 1 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01dcd6d2) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000344, 0x0000087c) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 1.05 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x018792f9) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x000009d6, 0x0000143d) + AutoRegressive Coefficients + (0xbaadc2f3, 0xb556a07b) + + + (0x5ba36127, 0x195feae1) + EEG Signal + + + + + (0x544a003e, 0x6dcba5f6) + AR Features + + + + + (0x007deef9, 0x2f3e95c6) + Order + 1 + 7 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x316b3b58, 0xa4f4e384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x020a8c7a) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002d56, 0x00007142) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01b260d4) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003560, 0x00001894) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 0.5 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 1.5 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05bd1106) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000566f, 0x00003f53) + GDF file reader + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/real-hand-movements.gdf + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 31 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0144bf9d) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00007f36, 0x00004a0e) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x544a003e, 0x6dcba5f6) + Streamed matrix + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/ARFeatures.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00eea8eb) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000007ef, 0x0000158b) + + (0x0000566f, 0x00003f53) + 1 + + + (0x00000294, 0x00001670) + 0 + + + + (0x00001962, 0x00003ae4) + + (0x00003560, 0x00001894) + 0 + + + (0x000009d6, 0x0000143d) + 0 + + + + (0x0000207e, 0x00001215) + + (0x00000294, 0x00001670) + 0 + + + (0x00003560, 0x00001894) + 0 + + + + (0x00005ea0, 0x00005581) + + (0x00000344, 0x0000087c) + 0 + + + (0x00002d56, 0x00007142) + 0 + + + + (0x0000631a, 0x000038c3) + + (0x000009d6, 0x0000143d) + 0 + + + (0x00007f36, 0x00004a0e) + 0 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x000044f4, 0x00002c81)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00001207, 0x00004ca2)","index":0,"name":"Default tab","parentIdentifier":"(0x000044f4, 0x00002c81)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00005c3e, 0x00002c50)","index":0,"name":"Empty","parentIdentifier":"(0x00001207, 0x00004ca2)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/CMakeLists.txt new file mode 100644 index 0000000..4eb5866 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/CMakeLists.txt @@ -0,0 +1,58 @@ +PROJECT(test_thresholdDataComparison) + +IF(WIN32) + ADD_DEFINITIONS(-DTARGET_OS_Windows) +ENDIF(WIN32) +IF(UNIX) + ADD_DEFINITIONS(-DTARGET_OS_Linux) +ENDIF(UNIX) +ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE) +ADD_DEFINITIONS(-DTARGET_ARCHITECTURE_i386) + +INCLUDE_DIRECTORIES(../src) +ADD_EXECUTABLE(${PROJECT_NAME} test_thresholdDataComparison.cpp) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) # Place project in folder unit-test (for some IDE) + +INCLUDE("FindOpenViBE") + +# Unfortunately we need to install the tests as any application to find .dll/.so files +# on both Windows and Linux. +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX ${PROJECT_NAME} EXECUTABLE_NAME ${PROJECT_NAME}) +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +PROJECT(test_eigen) + +IF(WIN32) + ADD_DEFINITIONS(-DTARGET_OS_Windows) +ENDIF(WIN32) +IF(UNIX) + ADD_DEFINITIONS(-DTARGET_OS_Linux) +ENDIF(UNIX) +ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE) +ADD_DEFINITIONS(-DTARGET_ARCHITECTURE_i386) + +INCLUDE_DIRECTORIES(../src) + +ADD_EXECUTABLE(${PROJECT_NAME} test_eigen.cpp) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) # Place project in folder unit-test (for some IDE) + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindThirdPartyEigen") + +IF(WIN32) + # Since cert, getting timeBeginPeriod() linker issues without this + TARGET_LINK_LIBRARIES(${PROJECT_NAME} winmm) +ENDIF(WIN32) + +# Unfortunately we need to install the tests as any application to find .dll/.so files +# on both Windows and Linux. +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX ${PROJECT_NAME} EXECUTABLE_NAME ${PROJECT_NAME}) +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/DartTestfile.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/DartTestfile.txt new file mode 100644 index 0000000..3cf85f3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/DartTestfile.txt @@ -0,0 +1,125 @@ +# Basic Template Test for automatic run a scenario that produce a file to be compared to a reference file +# You need to set the name of the test according to name of scenario file and reference file + +# Test Hilbert transform Box + +SET(TEST_NAME "HilbertTransform") +SET(SCENARIO_TO_TEST "${TEST_NAME}.xml") + +# These three tests are not yet working correctly... +# SET(SUBTEST1_NAME "hilbert") +# SET(SUBTEST2_NAME "phase") +# SET(SUBTEST3_NAME "envelope") + +IF(WIN32) + SET(EXT cmd) + SET(OS_FLAGS "--no-pause") +ELSE() + SET(EXT sh) + SET(OS_FLAGS "") +ENDIF() + +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${SUBTEST1_NAME}.csv" "${SUBTEST2_NAME}.csv" "${SUBTEST3_NAME}.csv") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play" ${SCENARIO_TO_TEST}) +# ADD_TEST(compare_${SUBTEST1_NAME} "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "${SUBTEST1_NAME}_${TEST_NAME}.csv" "${SUBTEST1_NAME}_${TEST_NAME}.ref.csv" 0.1) +# ADD_TEST(compare_${SUBTEST2_NAME} "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "${SUBTEST2_NAME}_${TEST_NAME}.csv" "${SUBTEST2_NAME}_${TEST_NAME}.ref.csv" 0.1) +# ADD_TEST(compare_${SUBTEST3_NAME} "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "${SUBTEST3_NAME}_${TEST_NAME}.csv" "${SUBTEST3_NAME}_${TEST_NAME}.ref.csv" 0.1) + +## add some properties that help to debug +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) + + +#SET_TESTS_PROPERTIES(compare_${SUBTEST1_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL "${SUBTEST1_NAME}.csv") +#SET_TESTS_PROPERTIES(compare_${SUBTEST2_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL "${SUBTEST2_NAME}.csv") +#SET_TESTS_PROPERTIES(compare_${SUBTEST3_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL "${SUBTEST3_NAME}.csv") +#SET_TESTS_PROPERTIES(compare_${SUBTEST1_NAME} compare_${SUBTEST2_NAME} compare_${SUBTEST3_NAME} PROPERTIES DEPENDS run_${TEST_NAME}) +#SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) + + + +# Test Connectivity Box - PLV algorithm + +#SET(TEST_NAME "PhaseLockingValue") +#SET(SCENARIO_TO_TEST "${TEST_NAME}.xml") + +#ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${TEST_NAME}.csv") +#ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play" ${SCENARIO_TO_TEST}) +#ADD_TEST(compare_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "${TEST_NAME}.csv" "${TEST_NAME}.ref.csv" 0.1) + +## add some properties that help to debug +#SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) + + +#SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL "${TEST_NAME}.csv") +#SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}) +#SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) + + + +# Test Auto-Regressive model + +SET(TEST_NAME "ARFeatures") +SET(SCENARIO_TO_TEST "${TEST_NAME}.xml") + +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${TEST_NAME}.csv") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play" ${SCENARIO_TO_TEST}) +ADD_TEST(compare_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_thresholdDataComparison.${EXT}" ${OS_FLAGS} "${TEST_NAME}.csv" "${TEST_NAME}.ref.csv" 0.1) + +## add some properties that help to debug +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) + +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL "${TEST_NAME}.csv") +SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}) +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}) + + +### Do not enable the commented out sikuli tests unless you +### or your lab commits to keep them passing in the long term. +#FIND_PROGRAM(SIKULI NAMES sikuli-ide) +#IF(SIKULI) +# IF(UNIX) +# ADD_TEST(sikuli_crop "${SIKULI}" -t testCrop.UNIX.sikuli) +# ENDIF(UNIX) +#ENDIF(SIKULI) + +# Test Regularized CSP +# @TODO There is a problem with this box + +#SET(TEST_SCENARIOS "RegularizedCSP_None" "RegularizedCSP_Tikhonov" "RegularizedCSP_Shrink" "RegularizedCSP_Both") +#SET(TEST_SHRINKS 0.0 0.0 0.9 0.5) +#SET(TEST_TIKHONOVS 0.0 0.9 0.0 0.5) +#SET(TEST_THRESHOLDS 40 70 70 70) +# +#FOREACH(TEST_NAME ${TEST_SCENARIOS}) +# +# ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" ${OV_LOGFILE} output-${TEST_NAME}.txt) +# +# LIST(GET TEST_SHRINKS 0 PARAM_SHRINK) +# LIST(GET TEST_TIKHONOVS 0 PARAM_TIKHONOV) +# LIST(GET TEST_THRESHOLDS 0 COMPARE_THRESHOLD) +# +# ADD_TEST(run_${TEST_NAME}_Train "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--invisible" "--no-session-management" --define Plugin_Classification_RandomizeKFoldTestData true --random-seed 123 --define TEST_TIKHONOV ${PARAM_TIKHONOV} --define TEST_SHRINK ${PARAM_SHRINK} --define TEST_FILTER output-${TEST_NAME}.txt "--play-fast" "test-regularizedcsp-train.xml") +# +# ADD_TEST(run_${TEST_NAME}_Test "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--invisible" "--no-session-management" --define Plugin_Classification_RandomizeKFoldTestData true --random-seed 456 --define TEST_FILTER output-${TEST_NAME}.txt "--play-fast" "test-regularizedcsp-test.xml") +# +# ADD_TEST(compare_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_accuracy.${EXT}" "${OS_FLAGS}" "${OV_LOGFILE}" ${COMPARE_THRESHOLD}) +# +# # It would be better to clean last, but we can't do this as it will delete the +# # output we wish to include, and we can't prevent clean from running if a prev. test fails +# # We need the clean to be sure that the comparator stage is not getting data from a previous run. +# SET_TESTS_PROPERTIES(run_${TEST_NAME}_Train PROPERTIES DEPENDS clean_${TEST_NAME}) +# SET_TESTS_PROPERTIES(run_${TEST_NAME}_Train PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) +# +# SET_TESTS_PROPERTIES(run_${TEST_NAME}_Test PROPERTIES DEPENDS run_${TEST_NAME}_Train) +# SET_TESTS_PROPERTIES(run_${TEST_NAME}_Test PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) +# +# SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}_Test}) +# SET_TESTS_PROPERTIES(compare_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) +# +# LIST(REMOVE_AT TEST_SHRINKS 0) +# LIST(REMOVE_AT TEST_TIKHONOVS 0) +# LIST(REMOVE_AT TEST_THRESHOLDS 0) +# +#ENDFOREACH(TEST_NAME) + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/HilbertTransform.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/HilbertTransform.xml new file mode 100644 index 0000000..dbd048b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/HilbertTransform.xml @@ -0,0 +1,746 @@ + + 1 + openvibe + 2.0 + + + (0x00000073, 0x00000fa8) + Hilbert Transform + (0x7878a47f, 0x9a8fe349) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Hilbert Transform + + + (0x5ba36127, 0x195feae1) + Envelope + + + (0x5ba36127, 0x195feae1) + Phase + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0xceff4a87, 0xffc5ce08) + + + (0xad100179, 0xa3c984ab) + 121 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000f8a, 0x00002000) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x5ba36127, 0x195feae1) + Streamed matrix + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/phase_HilbertTransform.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002df6, 0x0000453f) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x5ba36127, 0x195feae1) + Streamed matrix + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/envelope_HilbertTransform.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003ea7, 0x0000084b) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + 1 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000468f, 0x00007d08) + GDF file reader + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/real-hand-movements.gdf + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xad100179, 0xa3c984ab) + 123 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x0000680a, 0x00004283) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x5ba36127, 0x195feae1) + Streamed matrix + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/hilbert_HilbertTransform.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000076e2, 0x00003b96) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 1.05 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xad100179, 0xa3c984ab) + 130 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00007e4d, 0x00004f1e) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 133 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000c00, 0x0000520c) + + (0x000076e2, 0x00003b96) + 0 + + + (0x00007e4d, 0x00004f1e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 195 + + + (0x358ae8b5, 0x0f8bacd1) + 496 + + + (0x3f0a3b27, 0x570913d2) + 223 + + + (0x6267b5c5, 0x676e3e42) + 496 + + + + + (0x00000d5d, 0x000071c1) + + (0x0000468f, 0x00007d08) + 1 + + + (0x00003ea7, 0x0000084b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 83 + + + (0x358ae8b5, 0x0f8bacd1) + 304 + + + (0x3f0a3b27, 0x570913d2) + 152 + + + (0x6267b5c5, 0x676e3e42) + 304 + + + + + (0x00002664, 0x0000778d) + + (0x00003ea7, 0x0000084b) + 0 + + + (0x00000073, 0x00000fa8) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 201 + + + (0x358ae8b5, 0x0f8bacd1) + 304 + + + (0x3f0a3b27, 0x570913d2) + 248 + + + (0x6267b5c5, 0x676e3e42) + 304 + + + + + (0x00004492, 0x00004a72) + + (0x00000073, 0x00000fa8) + 2 + + + (0x00000f8a, 0x00002000) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 297 + + + (0x358ae8b5, 0x0f8bacd1) + 319 + + + (0x3f0a3b27, 0x570913d2) + 360 + + + (0x6267b5c5, 0x676e3e42) + 496 + + + + + (0x00004a3f, 0x00004a44) + + (0x00000073, 0x00000fa8) + 0 + + + (0x0000680a, 0x00004283) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 297 + + + (0x358ae8b5, 0x0f8bacd1) + 289 + + + (0x3f0a3b27, 0x570913d2) + 360 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + (0x00006420, 0x000075f2) + + (0x00000073, 0x00000fa8) + 1 + + + (0x00002df6, 0x0000453f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 297 + + + (0x358ae8b5, 0x0f8bacd1) + 304 + + + (0x3f0a3b27, 0x570913d2) + 360 + + + (0x6267b5c5, 0x676e3e42) + 304 + + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x000036c7, 0x000030bb)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00002384, 0x00003bec)","index":0,"name":"Default tab","parentIdentifier":"(0x000036c7, 0x000030bb)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00002860, 0x00006a2e)","index":0,"name":"Empty","parentIdentifier":"(0x00002384, 0x00003bec)","type":0}] + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/PhaseLockingValue.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/PhaseLockingValue.xml new file mode 100644 index 0000000..5357319 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/PhaseLockingValue.xml @@ -0,0 +1,452 @@ + + 1 + openvibe + 2.0 + + + (0x00000ed4, 0x0000252d) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 1.05 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xad100179, 0xa3c984ab) + 130 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x000035a8, 0x0000075a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 133 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003c03, 0x00004b5b) + Connectivity Measure + (0x8e3a1aef, 0x7cacd368) + + + (0x5ba36127, 0x195feae1) + EEG Signal + + + + + (0x5ba36127, 0x195feae1) + Connectivity measure + + + + + (0xdc90c94b, 0xf82ad423) + Method + Single-Trial Phase Locking Value + Single-Trial Phase Locking Value + false + + + (0x79a9edeb, 0x245d83fc) + Pairs of channels + 1-2 + 1-2 + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0xadf93ac3, 0x3981887a) + + + (0xad100179, 0xa3c984ab) + 168 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004fc8, 0x00002927) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x5ba36127, 0x195feae1) + Streamed matrix + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + /home/ac-inria/work/git/openvibe/plugins/processing/signal-processing/test/PhaseLockingValue.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 120 + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000057ba, 0x0000351c) + GDF file reader + (0x3eeb1264, 0x4edfbd9a) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + EEG stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/real-hand-movements.gdf + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + (0x2cdb2f0b, 0x12f231ea) + Subtract physical minimum + False + False + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x78b8b69d, 0x27afe678) + + + (0xad100179, 0xa3c984ab) + 123 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + + + (0x00000a72, 0x00004189) + + (0x00003c03, 0x00004b5b) + 0 + + + (0x00004fc8, 0x00002927) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 272 + + + (0x358ae8b5, 0x0f8bacd1) + 304 + + + (0x3f0a3b27, 0x570913d2) + 328 + + + (0x6267b5c5, 0x676e3e42) + 304 + + + + + (0x00004c1a, 0x00003616) + + (0x00000ed4, 0x0000252d) + 0 + + + (0x000035a8, 0x0000075a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 163 + + + (0x358ae8b5, 0x0f8bacd1) + 496 + + + (0x3f0a3b27, 0x570913d2) + 191 + + + (0x6267b5c5, 0x676e3e42) + 496 + + + + + (0x00004c86, 0x000076d6) + + (0x000057ba, 0x0000351c) + 1 + + + (0x00003c03, 0x00004b5b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 131 + + + (0x358ae8b5, 0x0f8bacd1) + 304 + + + (0x3f0a3b27, 0x570913d2) + 210 + + + (0x6267b5c5, 0x676e3e42) + 304 + + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x000030b1, 0x0000307f)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000031f8, 0x00006493)","index":0,"name":"Default tab","parentIdentifier":"(0x000030b1, 0x0000307f)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00003a9b, 0x0000762a)","index":0,"name":"Empty","parentIdentifier":"(0x000031f8, 0x00006493)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/envelope_HilbertTransform.ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/envelope_HilbertTransform.ref.csv new file mode 100644 index 0000000..c3f876b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/envelope_HilbertTransform.ref.csv @@ -0,0 +1,513 @@ +Time(s);Time signal;Sampling Rate +0;652.872498;512 +0.001953;652.19104; +0.003906;657.344299; +0.005859;664.963318; +0.007812;656.915527; +0.009766;655.371399; +0.011719;657.471802; +0.013672;658.235474; +0.015625;664.248108; +0.017578;674.710754; +0.019531;682.88208; +0.021484;682.181335; +0.023438;681.047119; +0.025391;682.49353; +0.027344;677.410706; +0.029297;675.140198; +0.03125;675.338806; +0.033203;676.888733; +0.035156;673.527466; +0.037109;674.533203; +0.039062;682.795044; +0.041016;679.734009; +0.042969;672.321289; +0.044922;680.832581; +0.046875;683.851868; +0.048828;678.300659; +0.050781;673.874207; +0.052734;675.565979; +0.054688;679.920593; +0.056641;678.692017; +0.058594;682.402466; +0.060547;689.995422; +0.0625;691.424316; +0.064453;691.300476; +0.066406;690.543274; +0.068359;682.410767; +0.070312;683.489014; +0.072266;688.083862; +0.074219;686.011292; +0.076172;688.92627; +0.078125;689.18457; +0.080078;681.577759; +0.082031;679.421631; +0.083984;687.520264; +0.085938;686.596436; +0.087891;682.279297; +0.089844;681.752197; +0.091797;684.096069; +0.09375;684.885559; +0.095703;689.826965; +0.097656;697.967834; +0.099609;697.75354; +0.101562;694.126099; +0.103516;695.985474; +0.105469;701.214233; +0.107422;699.951416; +0.109375;700.415161; +0.111328;704.063416; +0.113281;707.642029; +0.115234;705.747131; +0.117188;710.762512; +0.119141;716.723022; +0.121094;713.036072; +0.123047;702.467102; +0.125;700.49176; +0.126953;695.235779; +0.128906;693.326416; +0.130859;692.633789; +0.132812;697.07019; +0.134766;694.940063; +0.136719;698.449158; +0.138672;699.3078; +0.140625;706.356812; +0.142578;701.057068; +0.144531;693.636353; +0.146484;694.458801; +0.148438;693.858765; +0.150391;695.506165; +0.152344;702.778503; +0.154297;706.466675; +0.15625;709.081482; +0.158203;715.37915; +0.160156;717.837708; +0.162109;715.575256; +0.164062;717.56012; +0.166016;718.96344; +0.167969;713.475647; +0.169922;709.944824; +0.171875;714.215515; +0.173828;710.718018; +0.175781;705.600464; +0.177734;705.312073; +0.179688;702.755615; +0.181641;702.19281; +0.183594;701.789795; +0.185547;702.207581; +0.1875;699.532349; +0.189453;702.352722; +0.191406;712.023438; +0.193359;709.434143; +0.195312;698.961304; +0.197266;710.270508; +0.199219;720.372314; +0.201172;719.837769; +0.203125;712.992432; +0.205078;715.572998; +0.207031;706.798157; +0.208984;700.738403; +0.210938;703.149475; +0.212891;707.28595; +0.214844;710.143005; +0.216797;713.367981; +0.21875;703.395081; +0.220703;697.204773; +0.222656;691.441772; +0.224609;693.796814; +0.226562;691.035156; +0.228516;684.115173; +0.230469;682.491638; +0.232422;683.610413; +0.234375;682.61145; +0.236328;681.345642; +0.238281;686.227783; +0.240234;689.364868; +0.242188;689.361145; +0.244141;692.280884; +0.246094;698.92334; +0.248047;695.322327; +0.25;695.928284; +0.251953;699.760132; +0.253906;699.456238; +0.255859;699.879272; +0.257812;699.874207; +0.259766;700.439453; +0.261719;694.306824; +0.263672;696.337463; +0.265625;702.438293; +0.267578;696.01825; +0.269531;695.467224; +0.271484;701.61731; +0.273438;706.004578; +0.275391;702.445618; +0.277344;698.014709; +0.279297;703.722656; +0.28125;704.028381; +0.283203;698.89209; +0.285156;697.758301; +0.287109;691.328186; +0.289062;689.18396; +0.291016;697.245422; +0.292969;702.900818; +0.294922;702.067627; +0.296875;709.707397; +0.298828;724.752747; +0.300781;727.492371; +0.302734;710.738708; +0.304688;711.624146; +0.306641;712.542297; +0.308594;710.156311; +0.310547;706.551819; +0.3125;711.784912; +0.314453;713.494324; +0.316406;709.538818; +0.318359;708.983276; +0.320312;705.139343; +0.322266;706.221191; +0.324219;723.512329; +0.326172;726.747314; +0.328125;722.273499; +0.330078;712.007629; +0.332031;698.131775; +0.333984;687.199036; +0.335938;680.049622; +0.337891;693.525757; +0.339844;702.886414; +0.341797;699.834473; +0.34375;693.821655; +0.345703;686.726807; +0.347656;678.107727; +0.349609;675.852051; +0.351562;678.505066; +0.353516;674.982178; +0.355469;670.409058; +0.357422;674.498962; +0.359375;671.203613; +0.361328;664.660706; +0.363281;663.051025; +0.365234;660.903992; +0.367188;655.797607; +0.369141;652.106873; +0.371094;655.176392; +0.373047;657.233154; +0.375;652.580444; +0.376953;654.626465; +0.378906;653.463684; +0.380859;652.688171; +0.382812;654.226074; +0.384766;660.364136; +0.386719;663.49823; +0.388672;664.639709; +0.390625;666.496582; +0.392578;668.061584; +0.394531;665.931091; +0.396484;672.945435; +0.398438;676.477295; +0.400391;674.486816; +0.402344;669.779358; +0.404297;670.058228; +0.40625;668.061401; +0.408203;667.655762; +0.410156;669.969543; +0.412109;675.294861; +0.414062;679.096069; +0.416016;679.948181; +0.417969;680.92511; +0.419922;680.642456; +0.421875;678.643799; +0.423828;679.495728; +0.425781;692.933594; +0.427734;699.030334; +0.429688;690.31427; +0.431641;690.498047; +0.433594;699.729614; +0.435547;697.159485; +0.4375;703.307434; +0.439453;699.613892; +0.441406;690.088806; +0.443359;687.119934; +0.445312;689.565552; +0.447266;685.292297; +0.449219;684.258606; +0.451172;683.349365; +0.453125;689.053528; +0.455078;686.921387; +0.457031;693.03595; +0.458984;694.41925; +0.460938;688.307007; +0.462891;687.354919; +0.464844;697.202942; +0.466797;695.407776; +0.46875;688.515198; +0.470703;690.002502; +0.472656;694.465637; +0.474609;691.710022; +0.476562;692.325073; +0.478516;699.274048; +0.480469;698.283752; +0.482422;694.051758; +0.484375;689.861389; +0.486328;681.534729; +0.488281;674.988953; +0.490234;670.250732; +0.492188;674.838623; +0.494141;671.986084; +0.496094;668.887207; +0.498047;665.776855; +0.5;669.816101; +0.501953;665.739136; +0.503906;659.799988; +0.505859;658.712219; +0.507812;656.40741; +0.509766;663.074097; +0.511719;679.350891; +0.513672;688.225586; +0.515625;687.647949; +0.517578;686.26709; +0.519531;669.194885; +0.521484;654.585266; +0.523438;649.088074; +0.525391;655.951904; +0.527344;661.500305; +0.529297;668.91925; +0.53125;670.090271; +0.533203;665.431274; +0.535156;657.512634; +0.537109;663.687683; +0.539062;673.667297; +0.541016;674.910461; +0.542969;674.081299; +0.544922;683.475586; +0.546875;678.487244; +0.548828;673.630066; +0.550781;681.811768; +0.552734;689.033569; +0.554688;686.033325; +0.556641;689.177368; +0.558594;697.444214; +0.560547;699.110291; +0.5625;693.176025; +0.564453;693.561462; +0.566406;686.230286; +0.568359;682.510132; +0.570312;675.486328; +0.572266;686.663818; +0.574219;684.883179; +0.576172;680.887878; +0.578125;687.027466; +0.580078;688.646545; +0.582031;678.338684; +0.583984;678.789551; +0.585938;681.331421; +0.587891;678.272583; +0.589844;678.695068; +0.591797;681.442383; +0.59375;688.903564; +0.595703;682.258362; +0.597656;679.974487; +0.599609;676.200806; +0.601562;671.150391; +0.603516;669.976929; +0.605469;672.728027; +0.607422;667.427673; +0.609375;659.651062; +0.611328;663.85553; +0.613281;668.456421; +0.615234;667.265991; +0.617188;671.815918; +0.619141;674.233948; +0.621094;678.567688; +0.623047;675.043823; +0.625;676.161865; +0.626953;675.914001; +0.628906;673.483826; +0.630859;674.821716; +0.632812;681.872803; +0.634766;678.102356; +0.636719;679.971741; +0.638672;675.819397; +0.640625;672.045898; +0.642578;669.679443; +0.644531;672.906067; +0.646484;671.237793; +0.648438;670.16571; +0.650391;670.394592; +0.652344;678.347229; +0.654297;681.720337; +0.65625;680.292969; +0.658203;682.934631; +0.660156;679.593079; +0.662109;676.283142; +0.664062;677.345581; +0.666016;679.686707; +0.667969;676.852173; +0.669922;676.642395; +0.671875;680.181885; +0.673828;682.402588; +0.675781;680.5802; +0.677734;681.406555; +0.679688;684.013855; +0.681641;683.778564; +0.683594;688.911316; +0.685547;692.84491; +0.6875;679.803955; +0.689453;668.471191; +0.691406;667.106995; +0.693359;668.250977; +0.695312;671.102417; +0.697266;679.14801; +0.699219;680.746338; +0.701172;669.396301; +0.703125;660.809753; +0.705078;664.460632; +0.707031;663.041809; +0.708984;664.592041; +0.710938;668.405273; +0.712891;665.529236; +0.714844;662.243225; +0.716797;658.81781; +0.71875;662.719116; +0.720703;659.927185; +0.722656;652.529053; +0.724609;658.648926; +0.726562;659.833252; +0.728516;658.903503; +0.730469;662.409668; +0.732422;667.693542; +0.734375;667.575745; +0.736328;670.942627; +0.738281;679.407349; +0.740234;679.977356; +0.742188;677.550415; +0.744141;673.245544; +0.746094;675.380981; +0.748047;673.00238; +0.75;675.703186; +0.751953;671.788635; +0.753906;665.445496; +0.755859;667.666626; +0.757812;677.88208; +0.759766;682.865051; +0.761719;678.304626; +0.763672;674.659851; +0.765625;672.701172; +0.767578;682.170105; +0.769531;679.32489; +0.771484;678.649231; +0.773438;681.970276; +0.775391;679.308411; +0.777344;679.949829; +0.779297;677.177856; +0.78125;664.491089; +0.783203;664.837341; +0.785156;672.92334; +0.787109;676.017578; +0.789062;673.882507; +0.791016;675.458923; +0.792969;681.763733; +0.794922;678.458313; +0.796875;674.974854; +0.798828;673.329163; +0.800781;670.157288; +0.802734;668.537476; +0.804688;671.010498; +0.806641;666.601807; +0.808594;661.410767; +0.810547;665.279053; +0.8125;666.392334; +0.814453;662.331848; +0.816406;653.432068; +0.818359;655.363708; +0.820312;658.257629; +0.822266;648.640381; +0.824219;640.110779; +0.826172;631.641174; +0.828125;620.967773; +0.830078;615.977905; +0.832031;612.672424; +0.833984;609.831665; +0.835938;601.372314; +0.837891;595.485596; +0.839844;589.810425; +0.841797;585.12323; +0.84375;579.608276; +0.845703;582.709656; +0.847656;580.177246; +0.849609;575.39917; +0.851562;574.131409; +0.853516;575.011475; +0.855469;570.915222; +0.857422;568.846863; +0.859375;564.63678; +0.861328;556.245422; +0.863281;554.104431; +0.865234;563.10321; +0.867188;563.672424; +0.869141;561.671387; +0.871094;568.506287; +0.873047;575.075989; +0.875;574.860413; +0.876953;578.382874; +0.878906;582.723694; +0.880859;584.168152; +0.882812;583.604431; +0.884766;585.24054; +0.886719;590.444824; +0.888672;596.945923; +0.890625;600.204895; +0.892578;598.114441; +0.894531;602.153442; +0.896484;609.802002; +0.898438;609.36322; +0.900391;619.398682; +0.902344;619.511292; +0.904297;614.911499; +0.90625;611.925903; +0.908203;606.397217; +0.910156;605.44281; +0.912109;616.871704; +0.914062;629.886719; +0.916016;635.963623; +0.917969;641.252197; +0.919922;644.724121; +0.921875;636.687134; +0.923828;642.013428; +0.925781;645.872314; +0.927734;640.324097; +0.929688;646.744385; +0.931641;650.049866; +0.933594;648.357483; +0.935547;645.675232; +0.9375;650.957153; +0.939453;655.659302; +0.941406;652.33313; +0.943359;648.758362; +0.945312;651.058838; +0.947266;655.05365; +0.949219;653.973022; +0.951172;656.587891; +0.953125;655.664368; +0.955078;655.298584; +0.957031;663.684753; +0.958984;665.117493; +0.960938;659.85498; +0.962891;654.232422; +0.964844;659.254333; +0.966797;660.307983; +0.96875;654.838379; +0.970703;661.702332; +0.972656;668.319153; +0.974609;667.06842; +0.976562;669.422668; +0.978516;669.911194; +0.980469;664.245239; +0.982422;655.385925; +0.984375;659.391052; +0.986328;663.098572; +0.988281;651.90271; +0.990234;647.950806; +0.992188;657.725586; +0.994141;661.506836; +0.996094;665.620667; +0.998047;672.148987; diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/hilbert_HilbertTransform.ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/hilbert_HilbertTransform.ref.csv new file mode 100644 index 0000000..7e3bc55 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/hilbert_HilbertTransform.ref.csv @@ -0,0 +1,513 @@ +Time(s);Time signal;Sampling Rate +0;28.981428;512 +0.001953;42.533489; +0.003906;47.134895; +0.005859;44.134022; +0.007812;38.354893; +0.009766;47.397827; +0.011719;48.880821; +0.013672;54.954945; +0.015625;60.355793; +0.017578;62.928974; +0.019531;55.618874; +0.021484;48.280991; +0.023438;46.291126; +0.025391;42.262794; +0.027344;38.17527; +0.029297;40.746456; +0.03125;41.668076; +0.033203;41.406368; +0.035156;39.970119; +0.037109;46.752495; +0.039062;44.760719; +0.041016;36.394112; +0.042969;41.215172; +0.044922;47.307755; +0.046875;38.753983; +0.048828;36.225052; +0.050781;38.588387; +0.052734;45.200058; +0.054688;44.333199; +0.056641;45.128956; +0.058594;49.382904; +0.060547;48.119011; +0.0625;41.630928; +0.064453;39.523262; +0.066406;33.259003; +0.068359;33.013283; +0.070312;39.875595; +0.072266;38.035378; +0.074219;36.587803; +0.076172;37.818752; +0.078125;31.631701; +0.080078;30.422977; +0.082031;38.480396; +0.083984;40.629364; +0.085938;34.120766; +0.087891;36.048504; +0.089844;39.391136; +0.091797;42.849953; +0.09375;44.074574; +0.095703;49.756237; +0.097656;46.069683; +0.099609;40.308197; +0.101562;39.125095; +0.103516;44.027828; +0.105469;41.049587; +0.107422;38.883476; +0.109375;39.536407; +0.111328;41.074429; +0.113281;36.20052; +0.115234;35.350887; +0.117188;35.939304; +0.119141;29.167889; +0.121094;16.342152; +0.123047;15.611171; +0.125;16.522947; +0.126953;17.34523; +0.128906;20.528202; +0.130859;25.429874; +0.132812;25.915106; +0.134766;26.125984; +0.136719;28.386164; +0.138672;28.47311; +0.140625;26.497925; +0.142578;16.317856; +0.144531;21.346485; +0.146484;24.65727; +0.148438;27.646727; +0.150391;32.761471; +0.152344;35.805737; +0.154297;32.539322; +0.15625;33.611752; +0.158203;31.097401; +0.160156;24.689838; +0.162109;20.777893; +0.164062;20.389; +0.166016;13.356441; +0.167969;8.95355; +0.169922;11.394264; +0.171875;10.890619; +0.173828;3.556692; +0.175781;6.071507; +0.177734;5.692522; +0.179688;6.904676; +0.181641;7.662472; +0.183594;9.668074; +0.185547;8.913792; +0.1875;11.29628; +0.189453;16.825912; +0.191406;15.69923; +0.193359;3.50449; +0.195312;11.271118; +0.197266;19.747177; +0.199219;12.399529; +0.201172;0.317879; +0.203125;-1.185936; +0.205078;-4.533199; +0.207031;-10.806082; +0.208984;-4.382572; +0.210938;0.186535; +0.212891;-0.43792; +0.214844;-2.473999; +0.216797;-11.413265; +0.21875;-18.581396; +0.220703;-16.212601; +0.222656;-13.448292; +0.224609;-9.205908; +0.226562;-14.506624; +0.228516;-10.37158; +0.230469;-5.72301; +0.232422;-1.522777; +0.234375;-1.331841; +0.236328;5.124865; +0.238281;8.421141; +0.240234;8.371645; +0.242188;8.058283; +0.244141;12.570879; +0.246094;8.602376; +0.248047;4.954411; +0.25;8.588469; +0.251953;6.878901; +0.253906;4.615979; +0.255859;3.792181; +0.257812;2.705427; +0.259766;-0.018886; +0.261719;-0.916425; +0.263672;6.931719; +0.265625;1.579266; +0.267578;-0.908307; +0.269531;5.263636; +0.271484;7.18133; +0.273438;1.801591; +0.275391;-3.627119; +0.277344;-0.388535; +0.279297;1.920504; +0.28125;-5.695572; +0.283203;-5.50612; +0.285156;-6.346354; +0.287109;-4.891275; +0.289062;4.177402; +0.291016;10.980614; +0.292969;7.157789; +0.294922;9.104038; +0.296875;14.05229; +0.298828;9.732626; +0.300781;-11.75359; +0.302734;-15.643543; +0.304688;-9.173111; +0.306641;-13.160055; +0.308594;-15.084597; +0.310547;-13.11615; +0.3125;-10.476772; +0.314453;-17.623634; +0.316406;-19.057949; +0.318359;-19.598183; +0.320312;-19.80681; +0.322266;-10.379875; +0.324219;-12.544847; +0.326172;-30.341568; +0.328125;-40.775764; +0.330078;-51.556679; +0.332031;-50.497475; +0.333984;-46.771263; +0.335938;-31.288355; +0.337891;-22.366844; +0.339844;-32.141407; +0.341797;-41.79649; +0.34375;-45.785782; +0.345703;-48.17548; +0.347656;-44.900505; +0.349609;-38.311737; +0.351562;-37.367516; +0.353516;-40.48661; +0.355469;-35.133568; +0.357422;-34.340218; +0.359375;-39.194832; +0.361328;-36.827976; +0.363281;-33.317528; +0.365234;-33.113281; +0.367188;-30.635273; +0.369141;-24.17881; +0.371094;-17.633192; +0.373047;-19.765018; +0.375;-16.504395; +0.376953;-12.284139; +0.378906;-11.065642; +0.380859;-6.38865; +0.382812;-0.581916; +0.384766;2.60288; +0.386719;1.224438; +0.388672;1.432685; +0.390625;2.356782; +0.392578;0.761961; +0.394531;3.498625; +0.396484;6.798368; +0.398438;0.842165; +0.400391;-3.030771; +0.402344;-2.93461; +0.404297;0.185988; +0.40625;0.083027; +0.408203;5.458356; +0.410156;8.497641; +0.412109;11.718945; +0.414062;8.389228; +0.416016;8.086557; +0.417969;6.000816; +0.419922;6.303391; +0.421875;6.098473; +0.423828;15.029612; +0.425781;16.495472; +0.427734;4.912612; +0.429688;-1.61569; +0.431641;7.710682; +0.433594;2.166585; +0.435547;-0.923061; +0.4375;-4.607342; +0.439453;-15.554612; +0.441406;-16.789404; +0.443359;-10.996284; +0.445312;-12.261397; +0.447266;-12.54049; +0.449219;-10.433497; +0.451172;-5.979844; +0.453125;-5.845973; +0.455078;-6.662134; +0.457031;-4.312693; +0.458984;-12.525909; +0.460938;-13.590454; +0.462891;-7.217076; +0.464844;-7.839628; +0.466797;-18.489054; +0.46875;-16.579653; +0.470703;-12.763157; +0.472656;-14.876695; +0.474609;-18.835867; +0.476562;-14.807649; +0.478516;-19.098183; +0.480469;-27.818377; +0.482422;-32.125648; +0.484375;-36.669605; +0.486328;-38.071255; +0.488281;-35.550213; +0.490234;-28.829878; +0.492188;-26.002678; +0.494141;-29.416748; +0.496094;-26.885658; +0.498047;-23.801216; +0.5;-20.967913; +0.501953;-26.569622; +0.503906;-19.780062; +0.505859;-16.524708; +0.507812;-7.422965; +0.509766;2.54991; +0.511719;5.376379; +0.513672;-8.515041; +0.515625;-16.082638; +0.517578;-30.128292; +0.519531;-36.401924; +0.521484;-29.043749; +0.523438;-13.4687; +0.525391;-4.369614; +0.527344;-0.444382; +0.529297;-1.65538; +0.53125;-6.541185; +0.533203;-10.313373; +0.535156;-2.848709; +0.537109;7.973608; +0.539062;7.621712; +0.541016;1.870394; +0.542969;6.26248; +0.544922;3.605522; +0.546875;-4.265451; +0.548828;2.832884; +0.550781;8.85619; +0.552734;2.569117; +0.554688;-0.294737; +0.556641;2.899448; +0.558594;-0.150892; +0.560547;-11.660822; +0.5625;-14.585499; +0.564453;-18.761417; +0.566406;-21.585199; +0.568359;-21.150761; +0.570312;-14.26481; +0.572266;-9.068488; +0.574219;-19.449661; +0.576172;-13.409808; +0.578125;-13.781729; +0.580078;-21.354212; +0.582031;-24.304899; +0.583984;-15.328108; +0.585938;-19.888649; +0.587891;-17.537773; +0.589844;-17.33357; +0.591797;-12.574266; +0.59375;-20.420633; +0.595703;-26.222927; +0.597656;-26.131714; +0.599609;-27.994799; +0.601562;-26.453037; +0.603516;-21.545654; +0.605469;-22.829664; +0.607422;-26.017242; +0.609375;-19.569988; +0.611328;-9.85809; +0.613281;-12.111512; +0.615234;-8.977678; +0.617188;-7.870711; +0.619141;-7.277023; +0.621094;-11.289501; +0.623047;-13.551187; +0.625;-12.348896; +0.626953;-14.252629; +0.628906;-13.97334; +0.630859;-8.721448; +0.632812;-12.712111; +0.634766;-16.439648; +0.636719;-17.070927; +0.638672;-21.466576; +0.640625;-19.258118; +0.642578;-16.029755; +0.644531;-13.608301; +0.646484;-15.584887; +0.648438;-12.004454; +0.650391;-8.278635; +0.652344;-4.681227; +0.654297;-12.171358; +0.65625;-12.097797; +0.658203;-15.762055; +0.660156;-18.922739; +0.662109;-17.793118; +0.664062;-14.515574; +0.666016;-17.074293; +0.667969;-17.741032; +0.669922;-14.970133; +0.671875;-13.756622; +0.673828;-17.34057; +0.675781;-18.527271; +0.677734;-17.425152; +0.679688;-18.953657; +0.681641;-20.677002; +0.683594;-20.682098; +0.685547;-33.717083; +0.6875;-42.506023; +0.689453;-36.189964; +0.691406;-28.62817; +0.693359;-25.185814; +0.695312;-21.073503; +0.697266;-22.982399; +0.699219;-33.934113; +0.701172;-39.937294; +0.703125;-31.177008; +0.705078;-26.676254; +0.707031;-26.831457; +0.708984;-22.519188; +0.710938;-25.49917; +0.712891;-28.394005; +0.714844;-28.193729; +0.716797;-24.496189; +0.71875;-21.937508; +0.720703;-27.340191; +0.722656;-19.784828; +0.724609;-13.77107; +0.726562;-15.72123; +0.728516;-12.220594; +0.730469;-8.430219; +0.732422;-8.944901; +0.734375;-10.647974; +0.736328;-6.189204; +0.738281;-10.279736; +0.740234;-17.289806; +0.742188;-22.094177; +0.744141;-21.220901; +0.746094;-21.12491; +0.748047;-22.512951; +0.75;-22.276014; +0.751953;-28.131899; +0.753906;-22.465721; +0.755859;-15.313993; +0.757812;-12.834; +0.759766;-23.297848; +0.761719;-27.161999; +0.763672;-28.631807; +0.765625;-22.023411; +0.767578;-23.817234; +0.769531;-31.017111; +0.771484;-28.612268; +0.773438;-32.742943; +0.775391;-36.427017; +0.777344;-37.741524; +0.779297;-45.891945; +0.78125;-43.447292; +0.783203;-31.983376; +0.785156;-31.239862; +0.787109;-36.147438; +0.789062;-38.734592; +0.791016;-36.35006; +0.792969;-41.969215; +0.794922;-49.916225; +0.796875;-50.889374; +0.798828;-53.51223; +0.800781;-54.729183; +0.802734;-54.039257; +0.804688;-56.449074; +0.806641;-62.772858; +0.808594;-58.819664; +0.810547;-59.186142; +0.8125;-65.028801; +0.814453;-72.406403; +0.816406;-71.404678; +0.818359;-68.241959; +0.820312;-77.704552; +0.822266;-85.671982; +0.824219;-85.317375; +0.826172;-87.464462; +0.828125;-82.750923; +0.830078;-78.093674; +0.832031;-74.263969; +0.833984;-75.343262; +0.835938;-73.315063; +0.837891;-69.068573; +0.839844;-63.963844; +0.841797;-59.865406; +0.84375;-51.162689; +0.845703;-45.742615; +0.847656;-46.08131; +0.849609;-41.196548; +0.851562;-34.949158; +0.853516;-32.976646; +0.855469;-31.026146; +0.857422;-26.757; +0.859375;-25.051701; +0.861328;-18.111897; +0.863281;-2.986727; +0.865234;4.847693; +0.867188;4.704545; +0.869141;13.324215; +0.871094;22.152439; +0.873047;22.501133; +0.875;24.208532; +0.876953;29.481262; +0.878906;30.783379; +0.880859;31.160419; +0.882812;33.827423; +0.884766;39.488701; +0.886719;44.619728; +0.888672;45.946201; +0.890625;43.886444; +0.892578;44.473694; +0.894531;52.25256; +0.896484;50.263031; +0.898438;51.813675; +0.900391;52.838123; +0.902344;43.295834; +0.904297;42.62706; +0.90625;42.661541; +0.908203;46.795666; +0.910156;58.684368; +0.912109;70.222183; +0.914062;70.008232; +0.916016;65.848495; +0.917969;63.420532; +0.919922;54.845673; +0.921875;52.216751; +0.923828;59.512566; +0.925781;51.527935; +0.927734;53.226189; +0.929688;56.845215; +0.931641;52.209785; +0.933594;48.73185; +0.935547;50.836895; +0.9375;54.601982; +0.939453;49.370476; +0.941406;44.658783; +0.943359;46.438972; +0.945312;50.582191; +0.947266;48.878654; +0.949219;47.730755; +0.951172;48.471378; +0.953125;45.506866; +0.955078;50.238186; +0.957031;50.173634; +0.958984;42.120224; +0.960938;37.473175; +0.962891;41.070911; +0.964844;45.978966; +0.966797;40.326958; +0.96875;43.826504; +0.970703;50.288212; +0.972656;45.363804; +0.974609;41.452553; +0.976562;40.376003; +0.978516;33.762836; +0.980469;28.353556; +0.982422;30.967506; +0.984375;39.286591; +0.986328;31.373966; +0.988281;29.597958; +0.990234;40.77985; +0.992188;48.465214; +0.994141;43.518177; +0.996094;47.480377; +0.998047;32.929554; diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/phase_HilbertTransform.ref.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/phase_HilbertTransform.ref.csv new file mode 100644 index 0000000..711a2d3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/phase_HilbertTransform.ref.csv @@ -0,0 +1,513 @@ +Time(s);Time signal;Sampling Rate +0;3.097188;512 +0.001953;3.07633; +0.003906;3.069826; +0.005859;3.075173; +0.007812;3.083173; +0.009766;3.069207; +0.011719;3.067177; +0.013672;3.058007; +0.015625;3.050604; +0.017578;3.048189; +0.019531;3.060055; +0.021484;3.070759; +0.023438;3.07357; +0.025391;3.079629; +0.027344;3.085208; +0.029297;3.081203; +0.03125;3.079854; +0.033203;3.080383; +0.035156;3.082213; +0.037109;3.072226; +0.039062;3.07599; +0.041016;3.088025; +0.042969;3.080251; +0.044922;3.072052; +0.046875;3.084892; +0.048828;3.088162; +0.050781;3.084298; +0.052734;3.074636; +0.054688;3.076343; +0.056641;3.07505; +0.058594;3.069163; +0.060547;3.071798; +0.0625;3.081346; +0.064453;3.084389; +0.066406;3.09341; +0.068359;3.093196; +0.070312;3.083218; +0.072266;3.086287; +0.074219;3.088233; +0.076172;3.08667; +0.078125;3.095679; +0.080078;3.096942; +0.082031;3.084925; +0.083984;3.082463; +0.085938;3.091877; +0.087891;3.088733; +0.089844;3.083781; +0.091797;3.078914; +0.09375;3.077195; +0.095703;3.069401; +0.097656;3.075539; +0.099609;3.083792; +0.101562;3.085197; +0.103516;3.078291; +0.105469;3.083019; +0.107422;3.086012; +0.109375;3.085115; +0.111328;3.08322; +0.113281;3.090414; +0.115234;3.091482; +0.117188;3.091007; +0.119141;3.100885; +0.121094;3.118671; +0.123047;3.119367; +0.125;3.118003; +0.126953;3.116641; +0.128906;3.11198; +0.130859;3.10487; +0.132812;3.104407; +0.134766;3.103989; +0.136719;3.10094; +0.138672;3.100865; +0.140625;3.10407; +0.142578;3.118315; +0.144531;3.110813; +0.146484;3.10608; +0.148438;3.101737; +0.150391;3.094471; +0.152344;3.090622; +0.154297;3.095517; +0.15625;3.094173; +0.158203;3.098109; +0.160156;3.107191; +0.162109;3.112552; +0.164062;3.113174; +0.166016;3.123014; +0.167969;3.129043; +0.169922;3.125542; +0.171875;3.126344; +0.173828;3.136588; +0.175781;3.132988; +0.177734;3.133522; +0.179688;3.131767; +0.181641;3.13068; +0.183594;3.127816; +0.185547;3.128898; +0.1875;3.125444; +0.189453;3.117634; +0.191406;3.119542; +0.193359;3.136653; +0.195312;3.125466; +0.197266;3.113787; +0.199219;3.124379; +0.201172;3.141151; +0.203125;-3.139929; +0.205078;-3.135257; +0.207031;-3.126303; +0.208984;-3.135338; +0.210938;3.141327; +0.212891;-3.140974; +0.214844;-3.138109; +0.216797;-3.125593; +0.21875;-3.115173; +0.220703;-3.118337; +0.222656;-3.122142; +0.224609;-3.128323; +0.226562;-3.120599; +0.228516;-3.126431; +0.230469;-3.133207; +0.232422;-3.139365; +0.234375;-3.139642; +0.236328;3.134071; +0.238281;3.129321; +0.240234;3.129448; +0.242188;3.129903; +0.244141;3.123433; +0.246094;3.129284; +0.248047;3.134467; +0.25;3.129251; +0.251953;3.131762; +0.253906;3.134993; +0.255859;3.136174; +0.257812;3.137727; +0.259766;-3.141566; +0.261719;-3.140273; +0.263672;3.131638; +0.265625;3.139344; +0.267578;-3.140288; +0.269531;3.134024; +0.271484;3.131357; +0.273438;3.139041; +0.275391;-3.136429; +0.277344;-3.141036; +0.279297;3.138864; +0.28125;-3.133502; +0.283203;-3.133714; +0.285156;-3.132497; +0.287109;-3.134517; +0.289062;3.135531; +0.291016;3.125844; +0.292969;3.131409; +0.294922;3.128625; +0.296875;3.121791; +0.298828;3.128163; +0.300781;-3.125436; +0.302734;-3.119581; +0.304688;-3.128702; +0.306641;-3.123122; +0.308594;-3.12035; +0.310547;-3.123028; +0.3125;-3.126873; +0.314453;-3.11689; +0.316406;-3.11473; +0.318359;-3.113946; +0.320312;-3.1135; +0.322266;-3.126894; +0.324219;-3.124253; +0.326172;-3.099831; +0.328125;-3.085108; +0.330078;-3.069119; +0.332031;-3.069197; +0.333984;-3.073479; +0.335938;-3.095567; +0.337891;-3.109336; +0.339844;-3.095849; +0.341797;-3.081834; +0.34375;-3.075554; +0.345703;-3.071383; +0.347656;-3.07533; +0.349609;-3.084876; +0.351562;-3.086492; +0.353516;-3.081575; +0.355469;-3.089163; +0.357422;-3.090658; +0.359375;-3.083164; +0.361328;-3.086156; +0.363281;-3.091323; +0.365234;-3.091469; +0.367188;-3.094861; +0.369141;-3.104506; +0.371094;-3.114676; +0.373047;-3.111515; +0.375;-3.116299; +0.376953;-3.122826; +0.378906;-3.124658; +0.380859;-3.131804; +0.382812;-3.140703; +0.384766;3.137651; +0.386719;3.139747; +0.388672;3.139437; +0.390625;3.138057; +0.392578;3.140452; +0.394531;3.136339; +0.396484;3.13149; +0.398438;3.140348; +0.400391;-3.137099; +0.402344;-3.137211; +0.404297;3.141315; +0.40625;3.141468; +0.408203;3.133417; +0.410156;3.128909; +0.412109;3.124238; +0.414062;3.129239; +0.416016;3.129699; +0.417969;3.13278; +0.419922;3.132332; +0.421875;3.132606; +0.423828;3.119472; +0.425781;3.117785; +0.427734;3.134565; +0.429688;-3.139252; +0.431641;3.130426; +0.433594;3.138496; +0.435547;-3.140269; +0.4375;-3.135042; +0.439453;-3.119358; +0.441406;-3.117261; +0.443359;-3.125588; +0.445312;-3.12381; +0.447266;-3.123292; +0.449219;-3.126344; +0.451172;-3.132842; +0.453125;-3.133108; +0.455078;-3.131894; +0.457031;-3.13537; +0.458984;-3.123554; +0.460938;-3.121847; +0.462891;-3.131093; +0.464844;-3.130348; +0.466797;-3.115002; +0.46875;-3.11751; +0.470703;-3.123094; +0.472656;-3.120169; +0.474609;-3.114358; +0.476562;-3.120203; +0.478516;-3.114278; +0.480469;-3.101744; +0.482422;-3.095289; +0.484375;-3.088413; +0.486328;-3.085702; +0.488281;-3.0889; +0.490234;-3.098566; +0.492188;-3.103051; +0.494141;-3.097803; +0.496094;-3.101387; +0.498047;-3.105835; +0.5;-3.110284; +0.501953;-3.101672; +0.503906;-3.111609; +0.505859;-3.116504; +0.507812;-3.130284; +0.509766;3.137747; +0.511719;3.133679; +0.513672;-3.12922; +0.515625;-3.118203; +0.517578;-3.097677; +0.519531;-3.087169; +0.521484;-3.097208; +0.523438;-3.120841; +0.525391;-3.134931; +0.527344;-3.140921; +0.529297;-3.139118; +0.53125;-3.131831; +0.533203;-3.126093; +0.535156;-3.13726; +0.537109;3.129578; +0.539062;3.130279; +0.541016;3.138821; +0.542969;3.132302; +0.544922;3.136317; +0.546875;-3.135306; +0.548828;3.137387; +0.550781;3.128603; +0.552734;3.137864; +0.554688;-3.141163; +0.556641;3.137386; +0.558594;-3.141376; +0.560547;-3.124912; +0.5625;-3.120549; +0.564453;-3.114538; +0.566406;-3.110133; +0.568359;-3.110598; +0.570312;-3.120473; +0.572266;-3.128386; +0.574219;-3.11319; +0.576172;-3.121897; +0.578125;-3.121531; +0.580078;-3.110579; +0.582031;-3.105755; +0.583984;-3.119009; +0.585938;-3.112398; +0.587891;-3.115733; +0.589844;-3.11605; +0.591797;-3.123139; +0.59375;-3.111946; +0.595703;-3.103148; +0.597656;-3.103153; +0.599609;-3.100181; +0.601562;-3.102168; +0.603516;-3.109428; +0.605469;-3.10765; +0.607422;-3.102602; +0.609375;-3.111921; +0.611328;-3.126742; +0.613281;-3.123473; +0.615234;-3.128138; +0.617188;-3.129877; +0.619141;-3.1308; +0.621094;-3.124955; +0.623047;-3.121517; +0.625;-3.123328; +0.626953;-3.120505; +0.628906;-3.120843; +0.630859;-3.128668; +0.632812;-3.122949; +0.634766;-3.117347; +0.636719;-3.116485; +0.638672;-3.109823; +0.640625;-3.112933; +0.642578;-3.117654; +0.644531;-3.121368; +0.646484;-3.118372; +0.648438;-3.123679; +0.650391;-3.129243; +0.652344;-3.134692; +0.654297;-3.123738; +0.65625;-3.123808; +0.658203;-3.118511; +0.660156;-3.113745; +0.662109;-3.115279; +0.664062;-3.120161; +0.666016;-3.116469; +0.667969;-3.115379; +0.669922;-3.119467; +0.671875;-3.121366; +0.673828;-3.116179; +0.675781;-3.114367; +0.677734;-3.116018; +0.679688;-3.11388; +0.681641;-3.111349; +0.683594;-3.111567; +0.685547;-3.092909; +0.6875;-3.079025; +0.689453;-3.087428; +0.691406;-3.098665; +0.693359;-3.103894; +0.695312;-3.110186; +0.697266;-3.107746; +0.699219;-3.091724; +0.701172;-3.081896; +0.703125;-3.094395; +0.705078;-3.101435; +0.707031;-3.101114; +0.708984;-3.107702; +0.710938;-3.103434; +0.712891;-3.098916; +0.714844;-3.099007; +0.716797;-3.104402; +0.71875;-3.108484; +0.720703;-3.100152; +0.722656;-3.111268; +0.724609;-3.120683; +0.726562;-3.117764; +0.728516;-3.123045; +0.730469;-3.128866; +0.732422;-3.128196; +0.734375;-3.125642; +0.736328;-3.132368; +0.738281;-3.126462; +0.740234;-3.116163; +0.742188;-3.108978; +0.744141;-3.110067; +0.746094;-3.110309; +0.748047;-3.108135; +0.75;-3.108619; +0.751953;-3.099704; +0.753906;-3.107826; +0.755859;-3.118654; +0.757812;-3.122659; +0.759766;-3.107468; +0.761719;-3.101538; +0.763672;-3.099141; +0.765625;-3.108848; +0.767578;-3.106672; +0.769531;-3.095918; +0.771484;-3.09942; +0.773438;-3.093562; +0.775391;-3.087943; +0.777344;-3.086058; +0.779297;-3.073771; +0.78125;-3.076162; +0.783203;-3.093467; +0.785156;-3.095152; +0.787109;-3.088096; +0.789062;-3.084081; +0.791016;-3.087751; +0.792969;-3.079994; +0.794922;-3.067953; +0.796875;-3.066127; +0.798828;-3.062035; +0.800781;-3.059835; +0.802734;-3.060672; +0.804688;-3.057368; +0.806641;-3.047284; +0.808594;-3.052544; +0.810547;-3.05251; +0.8125;-3.043854; +0.814453;-3.032053; +0.816406;-3.032098; +0.818359;-3.037275; +0.820312;-3.023271; +0.822266;-3.009126; +0.824219;-3.00791; +0.826172;-3.002675; +0.828125;-3.007934; +0.830078;-3.014471; +0.832031;-3.020081; +0.833984;-3.017729; +0.835938;-3.019376; +0.837891;-3.025344; +0.839844;-3.032931; +0.841797;-3.039101; +0.84375;-3.053206; +0.845703;-3.063012; +0.847656;-3.062083; +0.849609;-3.069935; +0.851562;-3.080682; +0.853516;-3.084212; +0.855469;-3.087221; +0.857422;-3.094538; +0.859375;-3.09721; +0.861328;-3.109026; +0.863281;-3.136202; +0.865234;3.132984; +0.867188;3.133246; +0.869141;3.117868; +0.871094;3.102617; +0.873047;3.102455; +0.875;3.099468; +0.876953;3.090599; +0.878906;3.088741; +0.880859;3.088226; +0.882812;3.083597; +0.884766;3.074067; +0.886719;3.065951; +0.888672;3.064548; +0.890625;3.068408; +0.892578;3.067168; +0.894531;3.054707; +0.896484;3.059074; +0.898438;3.056461; +0.900391;3.056183; +0.902344;3.071649; +0.904297;3.072215; +0.90625;3.071819; +0.908203;3.064346; +0.910156;3.044512; +0.912109;3.027509; +0.914062;3.030218; +0.916016;3.037865; +0.917969;3.04253; +0.919922;3.056421; +0.921875;3.059487; +0.923828;3.048763; +0.925781;3.061728; +0.927734;3.058373; +0.929688;3.053585; +0.931641;3.061189; +0.933594;3.06636; +0.935547;3.062777; +0.9375;3.057614; +0.939453;3.066222; +0.941406;3.073079; +0.943359;3.06995; +0.945312;3.063822; +0.947266;3.066905; +0.949219;3.068542; +0.951172;3.067702; +0.953125;3.072131; +0.955078;3.064853; +0.957031;3.065922; +0.958984;3.078223; +0.960938;3.084772; +0.962891;3.078774; +0.964844;3.071792; +0.966797;3.080482; +0.96875;3.074615; +0.970703;3.065521; +0.972656;3.073663; +0.974609;3.079411; +0.976562;3.081241; +0.978516;3.091172; +0.980469;3.098894; +0.982422;3.094324; +0.984375;3.081977; +0.986328;3.094261; +0.988281;3.096175; +0.990234;3.078614; +0.992188;3.06784; +0.994141;3.075759; +0.996094;3.070199; +0.998047;3.092582; diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/test-regularizedcsp-test.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/test-regularizedcsp-test.xml new file mode 100644 index 0000000..6547759 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/test-regularizedcsp-test.xml @@ -0,0 +1,1438 @@ + + 2 + OpenViBE Designer + 2.1.0 + + + + + + (0x000001bf, 0x0000774e) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(2*m_PI*x*10) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 108 + + + (0x207c9054, 0x3c841b63) + 340 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0030d207) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000099b, 0x0000516a) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 100 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002c0fde) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00001d79, 0x0000094b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 560 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0054b70c) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002824, 0x00000ec9) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 480 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00347b11) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003065, 0x00006f68) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 480 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003ab9f3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000384e, 0x00003b0e) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + ${Player_ScenarioDirectory}/${TEST_FILTER} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00361510) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000384e, 0x00003b10) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + ${Player_ScenarioDirectory}/${TEST_FILTER} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00387048) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004f85, 0x000075c3) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + A+2*(B-0.5) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005cd1, 0x00002308) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 20 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Train + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00537ad0) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00005d73, 0x000007dc) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Path_UserData}/my-classifier.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x207c9054, 0x3c841b63) + 560 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0076d926) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005dde, 0x000059bc) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 512 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005f02, 0x0000326e) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00308bc3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005f02, 0x00003270) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00302257) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000678f, 0x000007a1) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 255 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 100 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0037e997) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x0000678f, 0x000007a2) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 1 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 100 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0037e997) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x000068ee, 0x0000125c) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000068ee, 0x0000125d) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006bb1, 0x00002e53) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 256 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 100 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0038cdf9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + + + (0x000001e8, 0x00001638) + + (0x000068ee, 0x0000125c) + 0 + + + (0x00002824, 0x00000ec9) + 0 + + + + (0x00000a93, 0x00007ccc) + + (0x00005f02, 0x0000326e) + 0 + + + (0x000068ee, 0x0000125c) + 0 + + + + (0x00000e34, 0x00002968) + + (0x0000384e, 0x00003b0e) + 0 + + + (0x00005f02, 0x0000326e) + 0 + + + + (0x00000e34, 0x00002969) + + (0x0000384e, 0x00003b10) + 0 + + + (0x00005f02, 0x00003270) + 0 + + + + (0x00000e6b, 0x00006fe7) + + (0x00005dde, 0x000059bc) + 0 + + + (0x0000384e, 0x00003b0e) + 0 + + + + (0x00001191, 0x00001183) + + (0x000068ee, 0x0000125d) + 0 + + + (0x00003065, 0x00006f68) + 0 + + + + (0x00001d55, 0x00004bd6) + + (0x0000678f, 0x000007a2) + 0 + + + (0x00004f85, 0x000075c3) + 1 + + + + (0x00002a59, 0x00001819) + + (0x00005d73, 0x000007dc) + 0 + + + (0x00001d79, 0x0000094b) + 0 + + + + (0x000031f9, 0x000000fb) + + (0x00004f85, 0x000075c3) + 0 + + + (0x00005dde, 0x000059bc) + 0 + + + + (0x000032db, 0x00004f0b) + + (0x00006bb1, 0x00002e53) + 0 + + + (0x0000384e, 0x00003b10) + 0 + + + + (0x00004130, 0x000007e1) + + (0x0000678f, 0x000007a1) + 0 + + + (0x00005dde, 0x000059bc) + 1 + + + + (0x0000561f, 0x0000678d) + + (0x00005cd1, 0x00002308) + 0 + + + (0x00005d73, 0x000007dc) + 0 + + + + (0x00005a3c, 0x000070e8) + + (0x00002824, 0x00000ec9) + 0 + + + (0x00005d73, 0x000007dc) + 1 + + + + (0x00006209, 0x000016ec) + + (0x0000099b, 0x0000516a) + 0 + + + (0x000001bf, 0x0000774e) + 0 + + + + (0x00006a54, 0x00006a90) + + (0x00003065, 0x00006f68) + 0 + + + (0x00005d73, 0x000007dc) + 2 + + + + (0x00006bee, 0x0000552d) + + (0x000001bf, 0x0000774e) + 0 + + + (0x00004f85, 0x000075c3) + 0 + + + + (0x00007488, 0x00002969) + + (0x00005f02, 0x00003270) + 0 + + + (0x000068ee, 0x0000125d) + 0 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00004b31, 0x000075b1)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007e8e, 0x00001b92)","index":0,"name":"Default tab","parentIdentifier":"(0x00004b31, 0x000075b1)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00006ba8, 0x00005c33)","index":0,"name":"Empty","parentIdentifier":"(0x00007e8e, 0x00001b92)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/test-regularizedcsp-train.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/test-regularizedcsp-train.xml new file mode 100644 index 0000000..ce2e459 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/test-regularizedcsp-train.xml @@ -0,0 +1,823 @@ + + 2 + OpenViBE Designer + 2.1.0 + + + + + + (0x000001bf, 0x0000774e) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(2*m_PI*x*10) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 176 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0034f03c) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000099b, 0x0000516a) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 100 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 176 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003baff6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x000015f4, 0x00003233) + Regularized CSP Trainer + (0x2ec14cc0, 0x428c48bd) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Signal condition 1 + + + (0x5ba36127, 0x195feae1) + Signal condition 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_GDF_End_Of_Session + OVTK_GDF_End_Of_Session + false + + + (0x330306dd, 0x74a95f98) + Spatial filter configuration + + ${Player_ScenarioDirectory}/${TEST_FILTER} + false + + + (0x007deef9, 0x2f3e95c6) + Filters per condition + 2 + 2 + false + + + (0x2cdb2f0b, 0x12f231ea) + Save filters as box config + false + false + false + + + (0x59e83f33, 0x592f1dd0) + Covariance update + Chunk average + Chunk average + false + + + (0x2cdb2f0b, 0x12f231ea) + Trace normalization + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient + 0.0 + ${TEST_SHRINK} + false + + + (0x512a166f, 0x5c3ef83f) + Tikhonov coefficient + 0.0 + ${TEST_TIKHONOV} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0x97c37a70, 0xbc9fecff) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 8 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001d79, 0x0000094b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002b77a0) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004f85, 0x000075c2) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + A+2*(B-0.5) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003b9892) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005cd1, 0x00002308) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 2 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_GDF_End_Of_Session + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 160 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00625f88) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00005dde, 0x000059bc) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004856b6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000678f, 0x000007a1) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 255 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 100 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 415 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00374b76) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x0000678f, 0x000007a2) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 1 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 100 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002f3df8) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x00006bb1, 0x00002e53) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 256 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 100 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0038bc7e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + + + (0x0000148b, 0x00001055) + + (0x0000678f, 0x000007a1) + 0 + + + (0x00005dde, 0x000059bc) + 1 + + + + (0x000031f9, 0x000000fb) + + (0x00004f85, 0x000075c2) + 0 + + + (0x00005dde, 0x000059bc) + 0 + + + + (0x00003b1c, 0x0000744b) + + (0x0000678f, 0x000007a2) + 0 + + + (0x00004f85, 0x000075c2) + 1 + + + + (0x00004a2f, 0x000027c8) + + (0x000015f4, 0x00003233) + 0 + + + (0x00001d79, 0x0000094b) + 0 + + + + (0x000051a5, 0x00006b77) + + (0x00006bb1, 0x00002e53) + 0 + + + (0x000015f4, 0x00003233) + 2 + + + + (0x00005af9, 0x000060fc) + + (0x000001bf, 0x0000774e) + 0 + + + (0x00004f85, 0x000075c2) + 0 + + + + (0x00006209, 0x000016ec) + + (0x0000099b, 0x0000516a) + 0 + + + (0x000001bf, 0x0000774e) + 0 + + + + (0x00006c27, 0x00001ea0) + + (0x00005cd1, 0x00002308) + 0 + + + (0x000015f4, 0x00003233) + 0 + + + + (0x0000777a, 0x00004134) + + (0x00005dde, 0x000059bc) + 0 + + + (0x000015f4, 0x00003233) + 1 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00004b31, 0x000075b1)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007e8e, 0x00001b92)","index":0,"name":"Default tab","parentIdentifier":"(0x00004b31, 0x000075b1)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00006ba8, 0x00005c33)","index":0,"name":"Empty","parentIdentifier":"(0x00007e8e, 0x00001b92)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/Simple3Dview.png b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/Simple3Dview.png new file mode 100644 index 0000000..b859170 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/Simple3Dview.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/designerScreen.png b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/designerScreen.png new file mode 100644 index 0000000..4cd4dbd Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/designerScreen.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/play.png b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/play.png new file mode 100644 index 0000000..b20a52e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/play.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testCrop.UNIX.html b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testCrop.UNIX.html new file mode 100644 index 0000000..754dfa9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testCrop.UNIX.html @@ -0,0 +1,93 @@ + + + + + + +
+

testCrop.sikuli

(Download this script) +
+
+def setUp(self):
+    import os
+    ov_binany_path=os.environ['OV_BINARY_PATH']
+    self.terminal = App.open("xterm -e " +
+             ov_binany_path +"/openvibe-designer.sh --no-session-management --open " +
+            ov_binany_path +"/share/openvibe/scenarios/box-tutorials/crop.xml")
+    while not self.terminal.window():
+        wait(1)
+    wait(,10)
+
+def testRunCrop(self):
+    click()
+    wait(,10)
+def tearDown(self):
+    mouseMove(Location(0,0))
+    if self.terminal.window():
+        App.close(self.terminal)
+        self.terminal= None
+
+ + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testCrop.UNIX.py b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testCrop.UNIX.py new file mode 100644 index 0000000..3e8c36a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testCrop.UNIX.py @@ -0,0 +1,19 @@ +def setUp(self): + import os + ov_binany_path=os.environ['OV_BINARY_PATH'] + self.terminal = App.open("xterm -e " + + ov_binany_path +"/openvibe-designer.sh --no-session-management --open " + + ov_binany_path +"/share/openvibe/scenarios/box-tutorials/crop.xml") + while not self.terminal.window(): + wait(1) + wait("play.png",10) + +def testRunCrop(self): + click("play.png") + wait("timesignal.png",10) +def tearDown(self): + mouseMove(Location(0,0)) + if self.terminal.window(): + App.close(self.terminal) + self.terminal= None + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testCrop.html b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testCrop.html new file mode 100644 index 0000000..d69d664 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testCrop.html @@ -0,0 +1,89 @@ + + + + + + +
+

testCrop.sikuli

(Download this script) +
+
+def setUp(self):
+    import os
+    ov_binany_path=os.environ['OV_BINARY_PATH']
+    self.terminal = App.open("xterm -e " +
+             ov_binany_path +"/openvibe-designer.sh --no-session-management --play " +
+            ov_binany_path +"/share/openvibe/scenarios/box-tutorials/crop.xml")
+    while not self.terminal.window():
+        wait(1)
+def testRunOgreVisual(self):
+    assert(exists())
+def tearDown(self):
+    if self.terminal.window():
+        App.close(self.terminal)
+        self.terminal= None
+
+ + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testCrop.py b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testCrop.py new file mode 100644 index 0000000..1cca6d2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testCrop.py @@ -0,0 +1,15 @@ +def setUp(self): + import os + ov_binany_path=os.environ['OV_BINARY_PATH'] + self.terminal = App.open("xterm -e " + + ov_binany_path +"/openvibe-designer.sh --no-session-management --play " + + ov_binany_path +"/share/openvibe/scenarios/box-tutorials/crop.xml") + while not self.terminal.window(): + wait(1) +def testRunOgreVisual(self): + assert(exists("timesignal.png")) +def tearDown(self): + if self.terminal.window(): + App.close(self.terminal) + self.terminal= None + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testOgreContext.UNIX.html b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testOgreContext.UNIX.html new file mode 100644 index 0000000..c3fafc0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testOgreContext.UNIX.html @@ -0,0 +1,89 @@ + + + + + + +
+

testCrop.sikuli

(Download this script) +
+
+def setUp(self):
+    import os
+    ov_binany_path=os.environ['OV_BINARY_PATH']
+    self.terminal = App.open("xterm -e " + ov_binany_path +"/openvibe-designer.sh --no-session-management --play testOgreContext.xml")
+    while not self.terminal.window():
+        wait(1)
+    wait(,10)
+def testRunOgreVisual(self):
+    waitVanish(,10)
+    assert(exists())
+def tearDown(self):
+    if self.terminal.window():
+        App.close(self.terminal)
+        self.terminal= None
+
+ + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testOgreContext.UNIX.py b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testOgreContext.UNIX.py new file mode 100644 index 0000000..69ef578 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/testOgreContext.UNIX.py @@ -0,0 +1,15 @@ +def setUp(self): + import os + ov_binany_path=os.environ['OV_BINARY_PATH'] + self.terminal = App.open("xterm -e " + ov_binany_path +"/openvibe-designer.sh --no-session-management --play testOgreContext.xml") + while not self.terminal.window(): + wait(1) + wait("Simple3Dview.png",10) +def testRunOgreVisual(self): + waitVanish("Simple3Dview.png",10) + assert(exists("designerScreen.png")) +def tearDown(self): + if self.terminal.window(): + App.close(self.terminal) + self.terminal= None + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/timesignal.png b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/timesignal.png new file mode 100644 index 0000000..99046a1 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/testCrop.UNIX.sikuli/timesignal.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/test_eigen.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/test_eigen.cpp new file mode 100644 index 0000000..bd097a9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/test_eigen.cpp @@ -0,0 +1,120 @@ +/* + * \author Jussi T. Lindgren / Inria + * + * This is currently rather a simple benchmark than a test. It can be used to see how Eigen loads the cores, + * simulating spatial filter (matrix multiplication use) with large matrices. Basically the core load should be + * smaller during the stream simulation test than the burn test, unless 1) OpenMP/Eigen is busy-waiting the cores + * 2) the matrix sizes really demand all the computational power available. + * + * The behavior may also depend on the matrix sizes. + * + * \date 24.02.2016 + */ + +#include + +#if defined(TARGET_HAS_ThirdPartyEIGEN) +#include + +#if defined(TARGET_OS_Windows) +#include +#endif + +#include +#include + +typedef Eigen::Matrix MatrixXdRowMajor; + +int main(int /*argc*/, char* /*argv*/[]) +{ + int returnValue = 0; + +#if defined(TARGET_OS_Windows) + // Set the clock precision to 1ms (default on Win7: 15ms) + timeBeginPeriod(1); +#endif + + const size_t nChannelsIn = 256; + const size_t nChannelsOut = 128; + const size_t chunkSize = 32; + const uint64_t samplingFreq = 1000; + + Eigen::MatrixXd filterMatrix, dataMatrix; + filterMatrix.resize(nChannelsOut, nChannelsIn); + dataMatrix.resize(nChannelsIn, chunkSize); + + filterMatrix.setRandom(); + dataMatrix.setRandom(); + +#if EIGEN_MAJOR_VERSION >= 2 && EIGEN_MINOR_VERSION >= 8 + //Eigen::setNbThreads(1); + //Eigen::initParallel(); + + std::cout << "Eigen is using " << Eigen::nbThreads() << " threads\n"; +#endif + + const double chunksPerSec = samplingFreq / double(chunkSize); + const uint64_t chunkDuration = OpenViBE::CTime(samplingFreq, chunkSize).time(); + + std::cout << "Filter is " << nChannelsOut << "x" << nChannelsIn << ", data chunk is " << nChannelsIn << "x" << chunkSize << "\n"; + + uint64_t before = System::Time::zgetTime(); + uint64_t after = before; + + if (true) + { + uint64_t matricesProcessed = 0; + const uint64_t timeOut = 20; + std::cout << "Running multiplication burn test\n"; + while (after - before < (timeOut << 32)) + { + Eigen::MatrixXd output = filterMatrix * dataMatrix; // Output useless but Time test + matricesProcessed++; + after = System::Time::zgetTime(); + } + std::cout << "Managed to do " << matricesProcessed << " multiplications in " << timeOut << "s, " << matricesProcessed / double(timeOut) << + " per sec.\n"; + } + + std::cout << "Running scheduler simulator\n"; + + std::cout << "Using " << samplingFreq << "Hz sampling frequency, requires " << chunksPerSec << " chunks per sec\n"; + std::cout << "Time available for each chunk is " << OpenViBE::CTime(chunkDuration * 1000).toSeconds() << "ms.\n"; + + uint64_t timeUsed = 0; + const uint64_t totalChunks = uint64_t(30 * chunksPerSec); + + for (size_t i = 0; i < totalChunks; ++i) + { + before = System::Time::zgetTime(); + Eigen::MatrixXd output = filterMatrix * dataMatrix; // Output useless but Time test + after = System::Time::zgetTime(); + timeUsed += (after - before); + + // busy wait, this is the OV scheduler default + while (after - before < chunkDuration) { after = System::Time::zgetTime(); } + } + + std::cout << "Avg chunk process time was " << OpenViBE::CTime(timeUsed / totalChunks * 1000).toSeconds() << "ms.\n"; + + if (timeUsed / totalChunks > chunkDuration) + { + std::cout << "Error: Cannot reach realtime with these parameters\n"; + returnValue = 1; + } + std::cout << "All tests completed\n"; + +#if defined(TARGET_OS_Windows) + timeEndPeriod(1); +#endif + + return returnValue; +} + +#else +int main(int /*argc*/, char* /*argv*/[]) +{ + std::cout << "Eigen was not present on the system when compiling\n"; + return 1; +} +#endif diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/test_thresholdDataComparison.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/test_thresholdDataComparison.cpp new file mode 100644 index 0000000..89cf2d1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/signal-processing/test/test_thresholdDataComparison.cpp @@ -0,0 +1,187 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \author Thibaut Monseigne / Inria. +/// \version 1.0. +/// \date 19/11/2018. +/// \copyright GNU Affero General Public License v3.0. +/// \remarks Based on code of Alison Cellard / Inria. +/// +///------------------------------------------------------------------------------------------------- + +#include +#include +#include +#include + +#include // std::fabs + +std::vector Split(const std::string& s, const std::string& sep) +{ + std::vector result; + std::string::size_type i = 0, j; + const std::string::size_type n = sep.size(); + + while ((j = s.find(sep, i)) != std::string::npos) + { + result.emplace_back(s, i, j - i); // Add part + i = j + n; // Update pos + } + result.emplace_back(s, i, s.size() - 1 - i); // Last without \n + return result; +} + +/* Method to read a file a store it in a buffer */ +bool FileToBuffer(const char* filename, std::vector& output) +{ + output.clear(); + std::ifstream iFile(filename, std::ifstream::in); + + if (!iFile.is_open()) + { + std::cout << "Error opening file [" << filename << "] for reading" << std::endl; + return false; + } + + // First Line Analyser + std::vector> data; + std::string line; + getline(iFile, line); + std::string separator = ","; + std::vector vLine = Split(line, separator); + if (vLine.size() == 1) + { + separator = ";"; + vLine = Split(line, separator); + } + if (vLine.size() == 1) + { + std::cout << "Error : CSV with an unknown separator or single data (different from ',' and ';')" << std::endl; + return false; + } + + // Store Data + for (; getline(iFile, line);) { data.push_back(Split(line, separator)); } + iFile.close(); + + if (data.empty()) + { + std::cout << "Error : No Data in CSV" << std::endl; + return false; + } + + // Select Columns + size_t columnFirst, columnLast = data[0].size(); + + if (separator == ",") // Standard OpenVibe CSV + { + columnFirst = 2; // Skip "Time:..." and "End Time" column + columnLast -= 3; // Skip Event Column + } + else // Legacy CSV. O Legacy, Legacy, wherefore art thou Legacy? + { + columnFirst = 1; // Only Skip "Time (s)" column + if (data[0].back() == "Sampling Rate") + { + columnLast -= 1; // Skip The "Sampling Rate" column if it exist legacy + } + } + if (columnLast - columnFirst < 1) + { + std::cout << "Error : No useful column in CSV" << std::endl; + return false; + } + + for (const auto& row : data) { for (size_t i = columnFirst; i < columnLast; ++i) { if (!row[i].empty()) { output.push_back(stod(row[i])); } } } + + std::cout << "Found " << data.size() << " rows with " << data[0].size() << " columns (" + << columnLast - columnFirst << " use) give " << output.size() << " values." << std::endl; + + return true; +} + + +/* Method to compare two files */ +bool CompareBuffers(const std::vector& inVector, const std::vector& outVector, const double threshold) +{ + // Compare size + if (inVector.empty() || outVector.empty()) + { + std::cout << "Error : no values \n" << std::endl; + return false; + } + if (inVector.size() != outVector.size()) + { + std::cout << "Error : Files have different size, check input data" << std::endl; + return false; + } + + size_t errorCount = 0, errorIdx = 0; + double errorMax = 0; + std::vector difference; + + for (size_t i = 0, n = inVector.size(); i < n; ++i) + { + const double err = std::fabs(inVector[i] - outVector[i]); + if (err > threshold) + { + errorCount++; + if (err > errorMax) + { + errorMax = err; + errorIdx = i; + } + difference.push_back(err); + } + } + + if (errorCount != 0) + { + double mean = 0, var = 0; + for (const auto& diff : difference) + { + mean += diff; + var += diff * diff; + } + mean /= double(errorCount); + var /= double(errorCount); + var -= mean * mean; + std::cout << "Comparison failed, " << errorCount << " data differ, the largest difference is " << errorMax + << " at value [" << errorIdx << "]\n" << std::endl << inVector[errorIdx] << " ins of " << outVector[errorIdx] << std::endl + << "Error Mean : " << mean << "\t Error Variance : " << var << std::endl; + return false; + } + + return true; +} + + +// validation Test take in the algorithm output file, the expected output file (reference) and a tolerance threshold +bool ValidationTest(const char* file1, const char* file2, const double threshold) +{ + std::vector v1, v2; + if (!FileToBuffer(file1, v1)) { return false; } + if (!FileToBuffer(file2, v2)) { return false; } + if (!CompareBuffers(v1, v2, threshold)) { return false; } + + return true; +} + +int main(const int argc, char* argv[]) +{ + if (argc != 4) + { + std::cout << "Usage: " << argv[0] << " \n"; + return -1; + } + + const double threshold = strtod(argv[3], nullptr); + + if (!ValidationTest(argv[1], argv[2], threshold)) + { + std::cout << "Algorithm failed validation test \n" << std::endl; + return 1; + } + + std::cout << "Test passed\n" << std::endl; + return 0; +} diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/CMakeLists.txt new file mode 100755 index 0000000..ab1599c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/CMakeLists.txt @@ -0,0 +1,48 @@ +IF(OV_DISABLE_GTK) + MESSAGE(STATUS "Skipping Plugins: Simple Visualization, no GTK") + RETURN() +ENDIF(OV_DISABLE_GTK) + +PROJECT(openvibe-plugins-simple-visualization) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindOpenViBEModuleTCPTagging") +INCLUDE("FindThirdPartyGTK") +INCLUDE("FindThirdPartyBoost") # need boost for erp plot +INCLUDE("FindOpenViBEVisualizationToolkit") + + +# --------------------------------- + + + + +# --------------------------------- + + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/plugins/simple-visualization) +INSTALL(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/cue-image.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/cue-image.xml new file mode 100644 index 0000000..2ce2081 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/cue-image.xml @@ -0,0 +1,755 @@ + + 1 + openvibe + 2.0 + + + (0x00000f94, 0x0000209a) + Display cue image + (0x005789a4, 0x3ab78a36) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x6f752dd0, 0x082a321e) + Stimulations (deprecated) + + + + + (0x2cdb2f0b, 0x12f231ea) + Display images in full screen + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Scale images to fit + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Clear screen Stimulation + OVTK_StimulationId_VisualStimulationStop + OVTK_StimulationId_Label_03 + false + + + (0x330306dd, 0x74a95f98) + Cue Image 1 + ${Path_Data}/plugins/simple-visualization/p300-magic-card/01.png + ${Path_Data}/plugins/simple-visualization/p300-magic-card/01.png + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 1 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x330306dd, 0x74a95f98) + Cue Image 2 + ${Path_Data}/plugins/simple-visualization/p300-magic-card/02.png + ${Path_Data}/plugins/simple-visualization/p300-magic-card/02.png + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 2 + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 624.000000 + + + (0x4e7b798a, 0x183beafb) + (0x18869d2c, 0x1a544d63) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 127 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x032e05cb) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001596, 0x000018ff) + Direct (deprecated) + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 624.000000 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xad100179, 0xa3c984ab) + 135 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x029a5eb7) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001596, 0x00001900) + TCP Tagging (recommended) + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 413.000000 + + + (0x1fa963f5, 0x1a638cd4) + 53 + + + (0x207c9054, 0x3c841b63) + 1024.000000 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xad100179, 0xa3c984ab) + 195 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0013879a) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0x341d3912, 0x1478de86) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000039c5, 0x00003d32) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 912.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 100 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001333b9) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0x341d3912, 0x1478de86) + 1 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000413b, 0x00007194) + Keyboard stimulator + (0x00d317b9, 0x6324c3ff) + + + (0x6f752dd0, 0x082a321e) + Outgoing Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 624.000000 + + + (0x4e7b798a, 0x183beafb) + (0x8d89d3b7, 0x8339d210) + + + (0xad100179, 0xa3c984ab) + 140 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01ca3a3d) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005760, 0x000043ee) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 944.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xad100179, 0xa3c984ab) + 121 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0012dfda) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0x341d3912, 0x1478de86) + 1 + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + + + (0x00000c5b, 0x00000d31) + + (0x00005760, 0x000043ee) + 1 + + + (0x000039c5, 0x00003d32) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 311 + + + (0x358ae8b5, 0x0f8bacd1) + 929 + + + (0x3f0a3b27, 0x570913d2) + 326 + + + (0x6267b5c5, 0x676e3e42) + 897 + + + + + (0x00003bc6, 0x00005ab0) + + (0x00005760, 0x000043ee) + 2 + + + (0x000039c5, 0x00003d32) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 311 + + + (0x358ae8b5, 0x0f8bacd1) + 944 + + + (0x3f0a3b27, 0x570913d2) + 326 + + + (0x6267b5c5, 0x676e3e42) + 912 + + + + + (0x00004468, 0x000059d6) + + (0x00000f94, 0x0000209a) + 0 + + + (0x00001596, 0x000018ff) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 279 + + + (0x358ae8b5, 0x0f8bacd1) + 624 + + + (0x3f0a3b27, 0x570913d2) + 342 + + + (0x6267b5c5, 0x676e3e42) + 624 + + + + + (0x000058d2, 0x00002fa9) + + (0x0000413b, 0x00007194) + 0 + + + (0x00000f94, 0x0000209a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 162 + + + (0x358ae8b5, 0x0f8bacd1) + 624 + + + (0x3f0a3b27, 0x570913d2) + 235 + + + (0x6267b5c5, 0x676e3e42) + 624 + + + + + (0x000063f2, 0x00002eeb) + + (0x00005760, 0x000043ee) + 2 + + + (0x00001596, 0x00001900) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 311 + + + (0x358ae8b5, 0x0f8bacd1) + 944 + + + (0x3f0a3b27, 0x570913d2) + 382 + + + (0x6267b5c5, 0x676e3e42) + 1024 + + + + + + + (0x000061de, 0x0000796b) + Credits: + +The few images flashed in this tutorial were +created by <i>zcool</i>, <i>http://www.zcool.com.cn/</i>. +Please see 'license.txt' +in the image folder for details. + + + (0x473d9a43, 0x97fc0a97) + 912.000000 + + + (0x7234b86b, 0x2b8651a5) + 112.000000 + + + + + (0x0000640c, 0x00004614) + This scenario illustrates the use of the <b>Display cue image</b> box. + +The box can be configured to display different images when different +stimulations are received by it. Right after display, the box sends the +stimulus also as an output, which is printed to the log by +<i>Stimulation listener</i> in the current scenario. + +During play, when you press 'a' or 'z' with <i>Keyboard stimulator</i> +window having focus, the cue display should display different images. +Press 'e' to clear the display. + +You can right-click on the display box and select 'modify settings' +to add more stimulus/image combinations. + +For time critical applications and precise alignment to the signal, +the Display Cue Image sends the stimulations to the Acquisition Server +using TCP Tagging right after rendering. Reading the stimulations +from the box output directly is not recommended. + + + + (0x473d9a43, 0x97fc0a97) + 272.000000 + + + (0x7234b86b, 0x2b8651a5) + 208.000000 + + + + + (0x000067e0, 0x00000e43) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 272.000000 + + + (0x7234b86b, 0x2b8651a5) + 400.000000 + + + + + (0x000068a8, 0x00000f8c) + Unmuting the chain below will show stimulations +as they come back from the Acquisition Server's +TCP Tagging module. + + + (0x473d9a43, 0x97fc0a97) + 944.000000 + + + (0x7234b86b, 0x2b8651a5) + 224.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00001c26, 0x00002268)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0x0000413b, 0x00007194)","childCount":0,"identifier":"(0x00004185, 0x00006764)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0x00000f94, 0x0000209a)","childCount":0,"identifier":"(0x00006aaf, 0x00005171)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0x000039c5, 0x00003d32)","childCount":0,"identifier":"(0x00007dc4, 0x00002e75)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000042b4, 0x0000350e)","index":0,"name":"Default tab","parentIdentifier":"(0x00001c26, 0x00002268)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00005ef1, 0x00002e5f)","index":0,"name":"Empty","parentIdentifier":"(0x000042b4, 0x0000350e)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/erp-plot.lua b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/erp-plot.lua new file mode 100644 index 0000000..0982a6a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/erp-plot.lua @@ -0,0 +1,45 @@ + +g_sent = false +g_numTrials = 10 + +function initialize(box) + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + -- make sure we get equal number of both trials + g_numTrials = 2 * box:get_setting(2) + g_sent = false; +end + +function uninitialize(box) +end + +function process(box) + + while box:keep_processing() and g_sent == false do + + box:send_stimulation(1, OVTK_StimulationId_ExperimentStart, 0, 0) + + current_time = 0 + + for i = 1 , g_numTrials do + + if i % 2 == 0 then + box:send_stimulation(1, OVTK_StimulationId_NonTarget, current_time+0, 0) + else + box:send_stimulation(1, OVTK_StimulationId_Target, current_time+0, 0) + end + + current_time = current_time + 1 + + end + + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, current_time, 0) + box:send_stimulation(1, OVTK_StimulationId_EndOfFile, current_time+2, 0) + + g_sent = true + + box:sleep() + + end + +end + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/erp-plot.mxs b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/erp-plot.mxs new file mode 100644 index 0000000..0ee3407 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/erp-plot.mxs @@ -0,0 +1,2160 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x000004e1, 0x00004551) + ERP plot + (0x10dc6917, 0x2b29b2a0) + + + (0x6f752dd0, 0x082a321e) + Trigger + + + (0x544a003e, 0x6dcba5f6) + ERP1 + + + (0x544a003e, 0x6dcba5f6) + Variance1 + + + (0x544a003e, 0x6dcba5f6) + ERP2 + + + (0x544a003e, 0x6dcba5f6) + Variance2 + + + + + (0x330306dd, 0x74a95f98) + Filename final figure + + + false + + + (0x2c132d6e, 0x44ab0d97) + Trigger to save figure + OVTK_StimulationId_ExperimentStop + OVTK_StimulationId_ExperimentStop + false + + + (0x2cdb2f0b, 0x12f231ea) + X starts at 0 + true + true + false + + + (0x7f45a2a9, 0x7db12219) + Line color 1 + 0,0,0 + 8,20,89 + false + + + (0x79a9edeb, 0x245d83fc) + Line label 1 + curve 1 + Nontarget + false + + + (0x7f45a2a9, 0x7db12219) + Line color 2 + 0,0,0 + 100,0,0 + false + + + (0x79a9edeb, 0x245d83fc) + Line label 2 + curve + Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 640 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x55fd2635, 0x995c1f10) + + + (0x666fffff, 0x666fffff) + + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000efa, 0x00003f04) + Signal Resampling + (0x0e923a5e, 0xda474058) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x158a8efd, 0xaa894f86) + (0x007deef9, 0x2f3e95c6) + New Sampling Frequency + 128 + 128 + false + + + (0x588783f3, 0x8e8dcf86) + (0x007deef9, 0x2f3e95c6) + Sample Count Per Buffer + 8 + 8 + false + + + (0xafdd8efd, 0x23ef94f6) + (0x2cdb2f0b, 0x12f231ea) + Low Pass Filter Signal Before Downsampling + true + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0xf4246eab, 0x3b371eef) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000014f0, 0x00001c0f) + Print timeline events + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -32 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x341d3912, 0x1478de86) + 1 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000016de, 0x00005b39) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001866, 0x00002765) + Streamed matrix multiplexer + (0x7a12298b, 0x785f4d42) + + + (0x5ba36127, 0x195feae1) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + + + (0x5ba36127, 0x195feae1) + Multiplexed streamed matrix + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x4badfdff, 0xc35004a3) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001868, 0x0000536c) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_NonTarget + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 656 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001868, 0x0000536d) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Target + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001aea, 0x00003a82) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_EndOfFile + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002f2e, 0x000076a9) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*100 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002f2e, 0x000076aa) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(2*m_pi*x*2) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002f2e, 0x000076ab) + Zero signal + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + 0 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000337b, 0x0000456a) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x5ba36127, 0x195feae1) + Output + + + (0x5ba36127, 0x195feae1) + Output(1) + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + true + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_NonTarget + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000052cc, 0x00005e27) + Clean signal + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + None + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 10 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000052cc, 0x00005e28) + Noisy signal + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + None + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 10 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x000060e7, 0x0000443d) + Mix noise + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + a+10*(b-0.5) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006596, 0x00003d58) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x0000683f, 0x00006111) + Crop + (0x7f1a3002, 0x358117ba) + + + (0x5ba36127, 0x195feae1) + Input matrix + + + + + (0x5ba36127, 0x195feae1) + Output matrix + + + + + (0xd0643f9e, 0x8e35fe0a) + Crop method + Min/Max + Min/Max + false + + + (0x512a166f, 0x5c3ef83f) + Min crop value + -1 + -0.01 + false + + + (0x512a166f, 0x5c3ef83f) + Max crop value + 1 + 0.01 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x1b151919, 0x63b9f9c9) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006afe, 0x00001799) + Noise generator + (0x0e3929f1, 0x15af76b9) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 1 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + (0x2e85e95e, 0x8a1a8365) + Noise type + Uniform + Uniform + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 464 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + (0x000072f4, 0x00004819) + Timeline generator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/erp-plot.lua + false + + + (0x007deef9, 0x2f3e95c6) + Trials per class + 10 + 200 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -160 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007d40, 0x0000458c) + Epoch variance + (0x335384ea, 0x88c917d9) + + + (0x544a003e, 0x6dcba5f6) + Input epochs + + + + + (0x544a003e, 0x6dcba5f6) + Averaged epochs + + + (0x544a003e, 0x6dcba5f6) + Variance of epochs + + + (0x544a003e, 0x6dcba5f6) + Confidence bounds + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Cumulative average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Significance level + 0.01 + 0.01 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 656 + + + (0x4e7b798a, 0x183beafb) + (0xe7fb819b, 0x3ff4203d) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007d40, 0x0000458d) + Epoch variance + (0x335384ea, 0x88c917d9) + + + (0x544a003e, 0x6dcba5f6) + Input epochs + + + + + (0x544a003e, 0x6dcba5f6) + Averaged epochs + + + (0x544a003e, 0x6dcba5f6) + Variance of epochs + + + (0x544a003e, 0x6dcba5f6) + Confidence bounds + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Moving epoch average + Cumulative average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Significance level + 0.01 + 0.01 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0xe7fb819b, 0x3ff4203d) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007e82, 0x00003859) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x5ba36127, 0x195feae1) + Output + + + (0x5ba36127, 0x195feae1) + Output(1) + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + true + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_NonTarget + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Target + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 272 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + + + (0x000004a1, 0x00003dac) + + (0x000072f4, 0x00004819) + 0 + + + (0x00001aea, 0x00003a82) + 0 + + + + (0x00001117, 0x000034ec) + + (0x00006afe, 0x00001799) + 0 + + + (0x000060e7, 0x0000443d) + 1 + + + + (0x00001510, 0x00000448) + + (0x00000efa, 0x00003f04) + 0 + + + (0x00001868, 0x0000536d) + 0 + + + + (0x00001cce, 0x00005ccc) + + (0x000072f4, 0x00004819) + 0 + + + (0x00007e82, 0x00003859) + 0 + + + + (0x00001d6e, 0x00001662) + + (0x00007d40, 0x0000458c) + 1 + + + (0x000004e1, 0x00004551) + 2 + + + + (0x000022c7, 0x00007550) + + (0x00001868, 0x0000536d) + 0 + + + (0x00007d40, 0x0000458d) + 0 + + + + (0x000027ca, 0x0000466f) + + (0x000060e7, 0x0000443d) + 0 + + + (0x000052cc, 0x00005e28) + 0 + + + + (0x00002923, 0x0000544b) + + (0x000072f4, 0x00004819) + 0 + + + (0x0000337b, 0x0000456a) + 0 + + + + (0x00002d6b, 0x0000106a) + + (0x0000337b, 0x0000456a) + 1 + + + (0x00002f2e, 0x000076aa) + 0 + + + + (0x00002e42, 0x00002486) + + (0x00006596, 0x00003d58) + 0 + + + (0x00007e82, 0x00003859) + 1 + + + + (0x00002f31, 0x00005451) + + (0x00002f2e, 0x000076a9) + 0 + + + (0x00001866, 0x00002765) + 1 + + + + (0x0000316b, 0x00007005) + + (0x00007d40, 0x0000458d) + 1 + + + (0x000004e1, 0x00004551) + 4 + + + + (0x000032a4, 0x000048f6) + + (0x000016de, 0x00005b39) + 0 + + + (0x000052cc, 0x00005e28) + 1 + + + + (0x000032b7, 0x00005460) + + (0x000016de, 0x00005b39) + 0 + + + (0x00001868, 0x0000536c) + 1 + + + + (0x00003303, 0x00005b1f) + + (0x00000efa, 0x00003f04) + 0 + + + (0x00001868, 0x0000536c) + 0 + + + + (0x000037c1, 0x00002336) + + (0x000072f4, 0x00004819) + 0 + + + (0x000016de, 0x00005b39) + 0 + + + + (0x00003ab7, 0x00005f8e) + + (0x000016de, 0x00005b39) + 0 + + + (0x000052cc, 0x00005e27) + 1 + + + + (0x00003c23, 0x00006285) + + (0x00001866, 0x00002765) + 0 + + + (0x000060e7, 0x0000443d) + 0 + + + + (0x00003cf8, 0x00004fc7) + + (0x00007d40, 0x0000458c) + 0 + + + (0x000004e1, 0x00004551) + 1 + + + + (0x00003d41, 0x00001192) + + (0x00007d40, 0x0000458d) + 0 + + + (0x000004e1, 0x00004551) + 3 + + + + (0x00003f0a, 0x00005809) + + (0x00001868, 0x0000536c) + 0 + + + (0x00007d40, 0x0000458c) + 0 + + + + (0x0000483e, 0x0000513b) + + (0x000072f4, 0x00004819) + 0 + + + (0x000014f0, 0x00001c0f) + 0 + + + + (0x000049c3, 0x00000101) + + (0x000060e7, 0x0000443d) + 0 + + + (0x00000efa, 0x00003f04) + 0 + + + + (0x00004cd1, 0x0000174b) + + (0x00002f2e, 0x000076ab) + 0 + + + (0x00001866, 0x00002765) + 0 + + + + (0x0000514e, 0x000022c2) + + (0x0000683f, 0x00006111) + 0 + + + (0x00002f2e, 0x000076a9) + 0 + + + + (0x00005593, 0x00000f52) + + (0x00007e82, 0x00003859) + 0 + + + (0x00002f2e, 0x000076ab) + 0 + + + + (0x000059c5, 0x00005eb6) + + (0x00006596, 0x00003d58) + 0 + + + (0x0000337b, 0x0000456a) + 1 + + + + (0x00006d1c, 0x00006529) + + (0x00002f2e, 0x000076aa) + 0 + + + (0x0000683f, 0x00006111) + 0 + + + + (0x00006d79, 0x00007976) + + (0x00001866, 0x00002765) + 0 + + + (0x000052cc, 0x00005e27) + 0 + + + + (0x00007e09, 0x00004d89) + + (0x000016de, 0x00005b39) + 0 + + + (0x00001868, 0x0000536d) + 1 + + + + + + (0x00000828, 0x00004269) + This scenario demonstrates how to do +Event-Related Potentials (<b>ERP</b>) +type visualization with OpenViBE. + + + (0x473d9a43, 0x97fc0a97) + 336 + + + (0x7234b86b, 0x2b8651a5) + -240 + + + + + (0x00000e6c, 0x000027e7) + A lua script is used to make an event timeline consisting +of two types of trials, "Target" and "Nontarget" + + + (0x473d9a43, 0x97fc0a97) + 768 + + + (0x7234b86b, 0x2b8651a5) + -240 + + + + + (0x00001b36, 0x000073b6) + Using two stream switches is a clever trick to make +continuous signal by choosing segments in turns +fom the two input streams. + + + (0x473d9a43, 0x97fc0a97) + 48 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + (0x000023db, 0x00005299) + You should see a clear difference emerge +between the plots after averaging for a while. + + + (0x473d9a43, 0x97fc0a97) + 1152 + + + (0x7234b86b, 0x2b8651a5) + 624 + + + + + (0x00004568, 0x000076b6) + This side computes and displays the ERP plot + + + (0x473d9a43, 0x97fc0a97) + 1136 + + + (0x7234b86b, 0x2b8651a5) + 256 + + + + + (0x00004f8a, 0x00007f62) + We do two separate estimates: one for NonTarget +and another for Target. The signal is routed accordingly. + +Stimulation based epoching is configured with the trial length. + + + (0x473d9a43, 0x97fc0a97) + 1152 + + + (0x7234b86b, 0x2b8651a5) + 448 + + + + + (0x000052c8, 0x000059e3) + This left hand side chain here generates a 1-channel signal +that is zeroes on 'NonTarget' and a phase-locked square +wave pattern on 'Target'. This is analoguous e.g. to P300 +where an event-related pattern emerges when user attends +the target on flash and otherwise does not. + +The signal does not attempt to model real EEG, +but to clearly illustrate the ERP visualization. + + + (0x473d9a43, 0x97fc0a97) + 48 + + + (0x7234b86b, 0x2b8651a5) + -96 + + + + + (0x00005b3a, 0x00004773) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 272 + + + (0x7234b86b, 0x2b8651a5) + 624 + + + + + (0x0000647c, 0x00007e80) + By default the Epoch Variance will do a cumulative +estimate, so the ERP plot will become more and more +defined as more trials come in. + + + (0x473d9a43, 0x97fc0a97) + 1152 + + + (0x7234b86b, 0x2b8651a5) + 544 + + + + + (0x00006b79, 0x0000466a) + Downsampling can be used to +make the plot more smooth + + + (0x473d9a43, 0x97fc0a97) + 1136 + + + (0x7234b86b, 0x2b8651a5) + 352 + + + + + (0x00006c43, 0x00007f6a) + Make approx +square wave + + + (0x473d9a43, 0x97fc0a97) + 560 + + + (0x7234b86b, 0x2b8651a5) + 48 + + + + + (0x00006ffa, 0x00000d2e) + Bury the clean signal in noise. The more trials +you average, the better the ERP plot is able +to show the pattern buried in noise. + + + (0x473d9a43, 0x97fc0a97) + 80 + + + (0x7234b86b, 0x2b8651a5) + 368 + + + + + + + (0x00002275, 0x000031e2) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00001bdf, 0x000049cb)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":475},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000015f8, 0x000067cd)","index":0,"name":"Default tab","parentIdentifier":"(0x00001bdf, 0x000049cb)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":108,"identifier":"(0x00007c56, 0x00004358)","index":0,"maxDividerPosition":275,"name":"Vertical split","parentIdentifier":"(0x000015f8, 0x000067cd)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":217,"identifier":"(0x00007273, 0x00006ba9)","index":0,"maxDividerPosition":439,"name":"Horizontal split","parentIdentifier":"(0x00007c56, 0x00004358)","type":5},{"boxIdentifier":"(0x000004e1, 0x00004551)","childCount":0,"identifier":"(0x00000dd1, 0x000056d1)","index":1,"parentIdentifier":"(0x00007c56, 0x00004358)","type":3},{"boxIdentifier":"(0x000052cc, 0x00005e27)","childCount":0,"identifier":"(0x00003838, 0x000042cf)","index":0,"parentIdentifier":"(0x00007273, 0x00006ba9)","type":3},{"boxIdentifier":"(0x000052cc, 0x00005e28)","childCount":0,"identifier":"(0x00002d94, 0x00004834)","index":1,"parentIdentifier":"(0x00007273, 0x00006ba9)","type":3}] + + + + + (0x079d1f09, 0x667c7871) + + + + (0x60bc58ab, 0x7a1b4d83) + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x7a3a1558, 0xf12c63c2) + + + + (0x84009d7c, 0x3c4e763b) + + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + ERP Plot tutorial + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/multimodal-graz-visualization.lua b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/multimodal-graz-visualization.lua new file mode 100644 index 0000000..7180b18 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/multimodal-graz-visualization.lua @@ -0,0 +1,87 @@ + +function initialize(box) + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + -- Settings + number_of_trials = box:get_setting(2) + baseline_duration = box:get_setting(3) + wait_for_beep_duration = box:get_setting(4) + wait_for_cue_duration = box:get_setting(5) + display_cue_duration = box:get_setting(6) + feedback_duration = box:get_setting(7) + end_of_trial_min_duration = box:get_setting(8) + end_of_trial_max_duration = box:get_setting(9) + number_of_class = box:get_setting(10) + classes = {} + id = 10 + for i = 1, number_of_class do + table.insert(classes,1,_G[box:get_setting(id+i)]) + end + + -- initializes random seed + math.randomseed(os.time()) + + -- fill the sequence table with predifined order + sequence = {} + for i = 1, number_of_trials do + for j = 1, number_of_class do + table.insert(sequence, 1, classes[j]) + end + end + + -- randomize the sequence + for i = 1, number_of_trials do + a = math.random(1, number_of_trials*number_of_class) + b = math.random(1, number_of_trials*number_of_class) + swap = sequence[a] + sequence[a] = sequence[b] + sequence[b] = swap + end + +end + +function process(box) + + local t=0 + + -- manages baseline + box:send_stimulation(1, OVTK_StimulationId_ExperimentStart, t, 0) + t = t + 5 + + -- manages trials + for i = 1, number_of_trials*number_of_class do + + -- first display cross on screen + box:send_stimulation(1, OVTK_GDF_Start_Of_Trial, t, 0) + box:send_stimulation(1, OVTK_GDF_Cross_On_Screen, t, 0) + t = t + wait_for_beep_duration + + -- warn the user the cue is going to appear + box:send_stimulation(1, OVTK_StimulationId_Beep, t, 0) + t = t + wait_for_cue_duration + + -- display cue + box:send_stimulation(1, sequence[i], t, 0) + t = t + display_cue_duration + + -- provide feedback + box:send_stimulation(1, OVTK_GDF_Feedback_Continuous, t, 0) + t = t + feedback_duration + + -- ends trial + box:send_stimulation(1, OVTK_GDF_End_Of_Trial, t, 0) + t = t + math.random(end_of_trial_min_duration, end_of_trial_max_duration) + + end + + -- send end for completeness + box:send_stimulation(1, OVTK_GDF_End_Of_Session, t, 0) + t = t + 5 + box:send_stimulation(1, OVTK_StimulationId_Train, t, 0) + t = t + 5 + + -- used to cause the acquisition scenario to stop + box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, t, 0) + +end diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/multimodal-graz-visualization.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/multimodal-graz-visualization.xml new file mode 100644 index 0000000..90be2da --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/multimodal-graz-visualization.xml @@ -0,0 +1,1065 @@ + + 2 + OpenViBE Designer + 3.0.0-beta + + + + + + (0x000001b4, 0x00002cd5) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000280, 0x00002761) + Bar Size (Positive Only) + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 656 + + + (0x207c9054, 0x3c841b63) + 896 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000280, 0x00002762) + Bar Size (Show All) + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 656 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000280, 0x00002763) + Confusion + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:100,100,100; 100:100,100,100 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 656 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002a20, 0x00000cc7) + Lua Stimulator + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/multimodal-graz-visualization.lua + false + + + (0x007deef9, 0x2f3e95c6) + Number of Trials for Each Class + 20 + 10 + false + + + (0x512a166f, 0x5c3ef83f) + Baseline Duration (in sec) + 20 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Wait For Beep Duration (in sec) + 2 + 2 + false + + + (0x512a166f, 0x5c3ef83f) + Wait For Cue Duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Display Cue Duration (in sec) + 1.250 + 1.250 + false + + + (0x512a166f, 0x5c3ef83f) + Feedback Duration (in sec) + 3.750 + 3.750 + false + + + (0x512a166f, 0x5c3ef83f) + End of Trial Minimum Duration (in sec) + 1.500 + 1.500 + false + + + (0x512a166f, 0x5c3ef83f) + End of Trial Maximum Duration (in sec) + 3.500 + 3.500 + false + + + (0x0007b793, 0x29750f2d) + (0x007deef9, 0x2f3e95c6) + Number of Class + 2 + 2 + false + + + (0x2c132d6e, 0x44ab0d97) + First Class + OVTK_GDF_Left + OVTK_GDF_Left + false + + + (0x2c132d6e, 0x44ab0d97) + Second Class + OVTK_GDF_Right + OVTK_GDF_Right + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005810d7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002ab4, 0x000057e0) + Show All + (0xf0d1b4b9, 0xb420c213) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Displayed Bar Size + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x5261636b, 0x464d4f44) + Feedback display mode + Positive Only + All + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + true + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 1 + false + + + (0x330306dd, 0x74a95f98) + Image no instruction + ${Path_Data}/plugins/simple-visualization/graz/none.png + ${Path_Data}/plugins/simple-visualization/graz/none.png + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation modality 1 + OVTK_GDF_Left + OVTK_GDF_Left + false + + + (0x330306dd, 0x74a95f98) + Image modality 1 + ${Path_Data}/plugins/simple-visualization/graz/left.png + ${Path_Data}/plugins/simple-visualization/graz/left.png + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation modality 2 + OVTK_GDF_Right + OVTK_GDF_Right + false + + + (0x330306dd, 0x74a95f98) + Image modality 2 + ${Path_Data}/plugins/simple-visualization/graz/right.png + ${Path_Data}/plugins/simple-visualization/graz/right.png + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 704 + + + (0x4e7b798a, 0x183beafb) + (0x2f7e28bc, 0x29d33c8b) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 10 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00002ab4, 0x000057e1) + Positive Only + (0xf0d1b4b9, 0xb420c213) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x544a003e, 0x6dcba5f6) + Amplitude + + + + + (0x544a003e, 0x6dcba5f6) + Displayed Bar Size + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Show instruction + true + true + false + + + (0x5261636b, 0x464d4f44) + Feedback display mode + Positive Only + Positive Only + false + + + (0x2cdb2f0b, 0x12f231ea) + Delay feedback + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Show accuracy + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Predictions to integrate + 5 + 1 + false + + + (0x330306dd, 0x74a95f98) + Image no instruction + ${Path_Data}/plugins/simple-visualization/graz/none.png + ${Path_Data}/plugins/simple-visualization/graz/none.png + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation modality 1 + OVTK_GDF_Left + OVTK_GDF_Left + false + + + (0x330306dd, 0x74a95f98) + Image modality 1 + ${Path_Data}/plugins/simple-visualization/graz/left.png + ${Path_Data}/plugins/simple-visualization/graz/left.png + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation modality 2 + OVTK_GDF_Right + OVTK_GDF_Right + false + + + (0x330306dd, 0x74a95f98) + Image modality 2 + ${Path_Data}/plugins/simple-visualization/graz/right.png + ${Path_Data}/plugins/simple-visualization/graz/right.png + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 592 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0x2f7e28bc, 0x29d33c8b) + + + (0x61d11811, 0x71e65362) + + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 10 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00002e70, 0x00003b10) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream 1 + + + (0x60c3eaa3, 0x0de44428) + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + (0x22278973, 0xac7220d9) + (0x544a003e, 0x6dcba5f6) + Output stream 2 + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000051c8, 0x00007b38) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 832 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00005a00, 0x0000091d) + sin(x) + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + abs(sin(x)) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005a00, 0x0000091e) + cos(x) + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + abs(cos(x)) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000011c9, 0x00007040) + + (0x00002ab4, 0x000057e0) + 0 + + + (0x00000280, 0x00002762) + 0 + + + + (0x00003ad0, 0x00005743) + + (0x00005a00, 0x0000091d) + 0 + + + (0x000001b4, 0x00002cd5) + 0 + + + + (0x00003ca3, 0x00004a0d) + + (0x00002a20, 0x00000cc7) + 0 + + + (0x00002e70, 0x00003b10) + 0 + + + + (0x00003d1e, 0x00001ef4) + + (0x00002e70, 0x00003b10) + (0x22278973, 0xac7220d9) + + + (0x00002ab4, 0x000057e0) + 1 + + + + (0x00003fc3, 0x00000421) + + (0x000051c8, 0x00007b38) + 0 + + + (0x00005a00, 0x0000091d) + 0 + + + + (0x0000435b, 0x00006225) + + (0x000051c8, 0x00007b38) + 0 + + + (0x00005a00, 0x0000091e) + 0 + + + + (0x00004599, 0x00003249) + + (0x00005a00, 0x0000091e) + 0 + + + (0x000001b4, 0x00002cd5) + 1 + + + + (0x0000495e, 0x00002c23) + + (0x00002e70, 0x00003b10) + 0 + + + (0x00002ab4, 0x000057e0) + 0 + + + + (0x00006239, 0x00002540) + + (0x00002e70, 0x00003b10) + (0x22278973, 0xac7220d9) + + + (0x00002ab4, 0x000057e1) + 1 + + + + (0x00006cb3, 0x000065e9) + + (0x00002e70, 0x00003b10) + 0 + + + (0x00002ab4, 0x000057e1) + 0 + + + + (0x0000765c, 0x0000037e) + + (0x00002ab4, 0x000057e0) + 1 + + + (0x00000280, 0x00002763) + 0 + + + + (0x000076c6, 0x00003b90) + + (0x000001b4, 0x00002cd5) + 0 + + + (0x00002e70, 0x00003b10) + (0x60c3eaa3, 0x0de44428) + + + + (0x0000790b, 0x000062b9) + + (0x00002ab4, 0x000057e1) + 0 + + + (0x00000280, 0x00002761) + 0 + + + + + + (0x000016ed, 0x000068e9) + No needed to trasnform 2D matrix to Vector Matrix +but the buffer size must be equal to number of modality + + + (0x473d9a43, 0x97fc0a97) + 1056 + + + (0x7234b86b, 0x2b8651a5) + 432 + + + + + (0x000016ed, 0x000068ea) + Classical MI BCI Run Stimulation + + + (0x473d9a43, 0x97fc0a97) + 576 + + + (0x7234b86b, 0x2b8651a5) + 432 + + + + + + + (0x0000016e, 0x00007efc) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":665,"identifier":"(0x0000167d, 0x0000351c)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":983},{"boxIdentifier":"(0x00000280, 0x00002763)","childCount":0,"identifier":"(0x00002350, 0x00003b0e)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00001466, 0x000035c8)","index":0,"name":"Default tab","parentIdentifier":"(0x0000167d, 0x0000351c)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":414,"identifier":"(0x00003155, 0x00004dfc)","index":0,"maxDividerPosition":622,"name":"Vertical split","parentIdentifier":"(0x00001466, 0x000035c8)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":471,"identifier":"(0x0000517a, 0x000046f6)","index":0,"maxDividerPosition":947,"name":"Horizontal split","parentIdentifier":"(0x00003155, 0x00004dfc)","type":5},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":471,"identifier":"(0x000076c7, 0x00004bd7)","index":1,"maxDividerPosition":947,"name":"Horizontal split","parentIdentifier":"(0x00003155, 0x00004dfc)","type":5},{"boxIdentifier":"(0x00002ab4, 0x000057e0)","childCount":0,"identifier":"(0x000030b8, 0x00006a57)","index":0,"parentIdentifier":"(0x0000517a, 0x000046f6)","type":3},{"boxIdentifier":"(0x00002ab4, 0x000057e1)","childCount":0,"identifier":"(0x00002be4, 0x0000733b)","index":1,"parentIdentifier":"(0x0000517a, 0x000046f6)","type":3},{"boxIdentifier":"(0x00000280, 0x00002762)","childCount":0,"identifier":"(0x00007be0, 0x00005f0a)","index":0,"parentIdentifier":"(0x000076c7, 0x00004bd7)","type":3},{"boxIdentifier":"(0x00000280, 0x00002761)","childCount":0,"identifier":"(0x0000773c, 0x00000aa3)","index":1,"parentIdentifier":"(0x000076c7, 0x00004bd7)","type":3}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/power-spectrum.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/power-spectrum.xml new file mode 100644 index 0000000..d41c447 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/power-spectrum.xml @@ -0,0 +1,757 @@ + + 1 + OpenVIBE + 2.0 + + + + + + (0x00000d3a, 0x00007272) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b124ce) + + + + + (0x000016b3, 0x00001395) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0080b400) + + + + + (0x00003378, 0x00007cd8) + Spectral analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imag Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x010ae800) + + + + + (0x00006157, 0x00000331) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -64 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006394, 0x00005e7d) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96.000000 + + + (0x207c9054, 0x3c841b63) + 160.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00006e55, 0x000045b4) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 128.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + + + (0x79b6f114, 0x5bfc044f) + Power spectrum display + (0xecb46081, 0x96da0d49) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + true + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.001 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x6b60e2b2, 0xf4839b7d) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000916, 0x000011ea) + + (0x00006157, 0x00000331) + 0 + + + (0x00006e55, 0x000045b4) + 0 + + + + (0x000021b1, 0x00004dc0) + + (0x00006e55, 0x000045b4) + 0 + + + (0x00006394, 0x00005e7d) + 0 + + + + (0x00004cb8, 0x00005643) + + (0x00000d3a, 0x00007272) + 1 + + + (0x00006157, 0x00000331) + 0 + + + + (0x0000665a, 0x000000ac) + + (0x000016b3, 0x00001395) + 0 + + + (0x00003378, 0x00007cd8) + 0 + + + + (0x00007484, 0x00001d51) + + (0x00006e55, 0x000045b4) + 0 + + + (0x000016b3, 0x00001395) + 0 + + + + (0x535b3c79, 0x2c5670d5) + + (0x00003378, 0x00007cd8) + 0 + + + (0x79b6f114, 0x5bfc044f) + 0 + + + + + + (0x0000091c, 0x00000811) + An FFT is applied on each window thanks to the +<i><b>Spectral Analysis</b></i> box. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + 176 + + + + + (0x00001e48, 0x00004dd6) + The <i>Signal Display</i> +box is just present to +monitor the input of +the spectrum +computation pipeline. + +The <b>Window Manager</b> +is used to organize the +two windows correctly ! + + + (0x473d9a43, 0x97fc0a97) + 128 + + + (0x7234b86b, 0x2b8651a5) + -48 + + + + + (0x000023b8, 0x0000476a) + Then the <i>Temporal Filter</i> box +filters the signal in the [1 128] Hz range. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + 16 + + + + + (0x000024e9, 0x0000634b) + The <i>Generic Stream Reader</i> box +reads an OpenViBE file containing signals. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + -144 + + + + + (0x00003fe9, 0x00004063) + Each channel is referenced against +channel Nz (which was recorded on the nose +in the demonstrated file) thanks to the +<i>Reference Channel</i> box. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + -64 + + + + + (0x0000412d, 0x00004c1d) + Finally, the <i><b>Power Spectrum Display</b></i> +displays the resulting spectrum. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + 240 + + + + + (0x00006dde, 0x00002264) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 512 + + + (0x7234b86b, 0x2b8651a5) + 304 + + + + + (0x00007f06, 0x000056c4) + The <i><b>Time Based Epoching</b></i> box +splits the signals in blocks of 1 seconds every +16th of second. This is a moving window. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + 96 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":574,"identifier":"(0x00001bcb, 0x00001344)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":973},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000026ea, 0x00001175)","index":0,"name":"Default tab","parentIdentifier":"(0x00001bcb, 0x00001344)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":474,"identifier":"(0x00007859, 0x00005801)","index":0,"maxDividerPosition":953,"name":"Horizontal split","parentIdentifier":"(0x000026ea, 0x00001175)","type":5},{"boxIdentifier":"(0x00006394, 0x00005e7d)","childCount":0,"identifier":"(0x000022fb, 0x000073cc)","index":0,"parentIdentifier":"(0x00007859, 0x00005801)","type":3},{"boxIdentifier":"(0x79b6f114, 0x5bfc044f)","childCount":0,"identifier":"(0x235ae5c3, 0x2e892abf)","index":1,"parentIdentifier":"(0x00007859, 0x00005801)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Power Spectrum example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/signal-display.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/signal-display.xml new file mode 100644 index 0000000..a114a71 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/signal-display.xml @@ -0,0 +1,772 @@ + + 1 + openvibe + 2.0 + + + (0x00005174, 0x00007bed) + Filtered signal (fixed scale) + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + None + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 30 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 864.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 187 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0017ebaf) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00006c69, 0x00002365) + Raw signal (autoscale) + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 240.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 157 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0029ae51) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x112053af, 0x3da33f80) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 153 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0022574e) + + + + + (0x224f7f2d, 0x2178fca3) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 190.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 256.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 153 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00577d72) + + + + + (0x549b2de2, 0x5ce25cec) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 40 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 105 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004f4c72) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000b25, 0x0000448a) + + (0x224f7f2d, 0x2178fca3) + 1 + + + (0x00006c69, 0x00002365) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 213 + + + (0x358ae8b5, 0x0f8bacd1) + 256 + + + (0x3f0a3b27, 0x570913d2) + 278 + + + (0x6267b5c5, 0x676e3e42) + 225 + + + + + (0x000036bb, 0x00003055) + + (0x224f7f2d, 0x2178fca3) + 2 + + + (0x00006c69, 0x00002365) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 213 + + + (0x358ae8b5, 0x0f8bacd1) + 271 + + + (0x3f0a3b27, 0x570913d2) + 278 + + + (0x6267b5c5, 0x676e3e42) + 240 + + + + + (0x000039fb, 0x000015fb) + + (0x549b2de2, 0x5ce25cec) + 0 + + + (0x00005174, 0x00007bed) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 290 + + + (0x358ae8b5, 0x0f8bacd1) + 864 + + + (0x3f0a3b27, 0x570913d2) + 326 + + + (0x6267b5c5, 0x676e3e42) + 849 + + + + + (0x0000548c, 0x00002d14) + + (0x112053af, 0x3da33f80) + 2 + + + (0x00005174, 0x00007bed) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 199 + + + (0x358ae8b5, 0x0f8bacd1) + 927 + + + (0x3f0a3b27, 0x570913d2) + 326 + + + (0x6267b5c5, 0x676e3e42) + 864 + + + + + (0x68fe1497, 0x07e43c19) + + (0x112053af, 0x3da33f80) + 1 + + + (0x549b2de2, 0x5ce25cec) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 199 + + + (0x358ae8b5, 0x0f8bacd1) + 912 + + + (0x3f0a3b27, 0x570913d2) + 256 + + + (0x6267b5c5, 0x676e3e42) + 864 + + + + + + + (0x0b7b1bf9, 0x154c9b65) + The <i>Temporal Filter</i>, filters the input signal +according to the settings. +Here we use a Butterworth band-pass. + + + (0x473d9a43, 0x97fc0a97) + 1120 + + + (0x7234b86b, 0x2b8651a5) + 256 + + + + + (0x17bf5ede, 0x4d57f5b5) + The <i>Generic Stream Reader</i> box +reads an <i>OpenViBE</i> file from disk and sends +its content to the following box. +The <i>OpenViBE</i> file format can store any +stream of the OpenViBE platform into a file. + + + (0x473d9a43, 0x97fc0a97) + 512 + + + (0x7234b86b, 0x2b8651a5) + 192 + + + + + (0x22866850, 0x7c657523) + This <i><b>Signal Display</b></i> box displays +the content in a fixed, specified scale. + + + (0x473d9a43, 0x97fc0a97) + 1136.000000 + + + (0x7234b86b, 0x2b8651a5) + 352.000000 + + + + + (0x405767d6, 0x682e6c4b) + This <i><b>Signal Display</b></i> box displays +the content of the file in a mode where each +channel is automatically vertically scaled, +independently of the other channels. + +The red blip in the plot means the scale was changed. + + + (0x473d9a43, 0x97fc0a97) + 512.000000 + + + (0x7234b86b, 0x2b8651a5) + 304.000000 + + + + + (0x4548e33f, 0x52be494b) + This scenario illustrates the <b>Signal Display</b> box. + +For serious use, it is recommended to configure the box to use a scaling +suitable for your data to get minimal amount of run-time autoscale changes. + +- Very different channel scales: Use per-channel scale +- All channels similar, scale known: Use global scale +- Data is well-behaved: Use fixed scale and specify it + + + + (0x473d9a43, 0x97fc0a97) + 770.000000 + + + (0x7234b86b, 0x2b8651a5) + 48.000000 + + + + + (0x7c68e1bc, 0x660ebde3) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 464.000000 + + + (0x7234b86b, 0x2b8651a5) + 400.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":583,"identifier":"(0x7c1b6671, 0x13abdd97)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":578},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x7631555b, 0x63aa0d68)","index":0,"name":"Default tab","parentIdentifier":"(0x7c1b6671, 0x13abdd97)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":263,"identifier":"(0x00002f97, 0x00001a6e)","index":0,"maxDividerPosition":533,"name":"Vertical split","parentIdentifier":"(0x7631555b, 0x63aa0d68)","type":4},{"boxIdentifier":"(0x00006c69, 0x00002365)","childCount":0,"identifier":"(0x00004e10, 0x00003d21)","index":0,"parentIdentifier":"(0x00002f97, 0x00001a6e)","type":3},{"boxIdentifier":"(0x00005174, 0x00007bed)","childCount":0,"identifier":"(0x00007cba, 0x00001aa6)","index":1,"parentIdentifier":"(0x00002f97, 0x00001a6e)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x8c1fc55b, 0x7b433dc2) + + + + (0x9f5c4075, 0x4a0d3666) + + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/time-frequency-map.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/time-frequency-map.xml new file mode 100644 index 0000000..e57891c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/time-frequency-map.xml @@ -0,0 +1,945 @@ + + 1 + OpenVIBE + 2.0 + + + + + + (0x000015f2, 0x00002121) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -336 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0054fd9b) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003595, 0x00006a9b) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -416 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b2cff4) + + + + + (0x00004070, 0x0000602c) + Instant Bars + (0xecb46081, 0x96da0d49) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + true + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.001 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0x6b60e2b2, 0xf4839b7d) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000050f8, 0x00006368) + Stacked Bitmap (Horizontal) + (0x7b0ddb65, 0xfdc51488) + + + (0x1f261c0a, 0x593bf6bd) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.005 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 272 + + + (0x4e7b798a, 0x183beafb) + (0xafb1edd5, 0x68e1da05) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 7 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000054d1, 0x00002a5a) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 128.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005c7eaa) + + + + + (0x00005d4a, 0x00005a2d) + Surface Laplacian + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 4;0;-1;0;-1;-1;0;0;-1;0;0;4;0;-1;0;0;-1;-1;0;-1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 2 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 10 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003e807e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006908, 0x00003949) + Spectral analysis + (0x84218ff8, 0xa87e7995) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x1f261c0a, 0x593bf6bd) + Amplitude + + + (0x1f261c0a, 0x593bf6bd) + Phase + + + (0x1f261c0a, 0x593bf6bd) + Real Part + + + (0x1f261c0a, 0x593bf6bd) + Imag Part + + + + + (0x2cdb2f0b, 0x12f231ea) + Amplitude + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Phase + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real Part + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Imaginary Part + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0x4e5c55a0, 0xe69eb7db) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0cb2e74d) + + + + + (0x0000698b, 0x00007cff) + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + : + C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -240.000000 + + + (0x207c9054, 0x3c841b63) + 304.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0060049b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007e73, 0x00000676) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.006250 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00cd01e9) + + + + + + + (0x00000b4d, 0x00000d30) + + (0x00007e73, 0x00000676) + 0 + + + (0x00006908, 0x00003949) + 0 + + + + (0x00001bf3, 0x000038b8) + + (0x0000698b, 0x00007cff) + 0 + + + (0x00005d4a, 0x00005a2d) + 0 + + + + (0x000044ec, 0x00002288) + + (0x00006908, 0x00003949) + 0 + + + (0x000050f8, 0x00006368) + 0 + + + + (0x00005220, 0x000060a2) + + (0x00006908, 0x00003949) + 0 + + + (0x00004070, 0x0000602c) + 0 + + + + (0x0000631d, 0x00004f18) + + (0x00005d4a, 0x00005a2d) + 0 + + + (0x000054d1, 0x00002a5a) + 0 + + + + (0x000068a1, 0x00003e8e) + + (0x000015f2, 0x00002121) + 0 + + + (0x0000698b, 0x00007cff) + 0 + + + + (0x0000782d, 0x0000214e) + + (0x000054d1, 0x00002a5a) + 0 + + + (0x00007e73, 0x00000676) + 0 + + + + (0x00007fb4, 0x00006b06) + + (0x00003595, 0x00006a9b) + 1 + + + (0x000015f2, 0x00002121) + 0 + + + + + + (0x00000ac1, 0x00006367) + Each channel is referenced against +channel Nz (which was recorded on the nose +in the demonstrated file) thanks to the +<i>Reference Channel</i> box. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + -336 + + + + + (0x00001195, 0x0000392b) + The <i><b>Time Based Epoching</b></i> box +splits the signals in blocks of 1 seconds every +160th of second. This is a moving window. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + (0x000021b1, 0x00005fdd) + The <i>Spatial Filter</i> box applies a +surface laplacion to the 10 input channels, +resulting in a two channels output : one for +the left motor cortex, and one for the right +motor cortex. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + -144 + + + + + (0x00002802, 0x00001618) + The <i>Generic Stream Reader</i> box +reads an OpenViBE file containing signals. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + -416 + + + + + (0x00002fd8, 0x00005632) + Then the <i>Temporal Filter</i> box +filters the signal in the [1 128] Hz range. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + -48 + + + + + (0x0000389d, 0x000005e2) + An FFT is applied on each window thanks to the +<i><b>Spectral Analysis</b></i> box. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + 112 + + + + + (0x00003de6, 0x00005b0d) + Finally, the <i><b>Power Spectrum Display</b></i> +and the <i><b>Time-Frequency Map Display</b></i> +boxes display the resulting spectrum. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + 192 + + + + + (0x00005b3a, 0x00004773) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 512 + + + (0x7234b86b, 0x2b8651a5) + 272 + + + + + (0x00005e3a, 0x0000499b) + The <i>Channel Selector</i> box selects +5 channels over the left motor cortex and +5 channels over the right motor cortex. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + -240 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":370,"identifier":"(0x0000359a, 0x00003742)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":989},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007f20, 0x000032fb)","index":0,"name":"Default tab","parentIdentifier":"(0x0000359a, 0x00003742)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":482,"identifier":"(0x000043a4, 0x000063a3)","index":0,"maxDividerPosition":969,"name":"Horizontal split","parentIdentifier":"(0x00007f20, 0x000032fb)","type":5},{"boxIdentifier":"(0x00004070, 0x0000602c)","childCount":0,"identifier":"(0x00003b44, 0x0000208c)","index":0,"parentIdentifier":"(0x000043a4, 0x000063a3)","type":3},{"boxIdentifier":"(0x000050f8, 0x00006368)","childCount":0,"identifier":"(0x00006ad7, 0x00005ebb)","index":1,"parentIdentifier":"(0x000043a4, 0x000063a3)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Time/Frequency map example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/topographic-map.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/topographic-map.xml new file mode 100644 index 0000000..7f32822 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/box-tutorials/topographic-map.xml @@ -0,0 +1,806 @@ + + 1 + OpenVIBE + 0.2.99 + + + + + + (0x0fbb365f, 0x0a3f89b8) + Epoch average + (0x21283d9f, 0xe76ff640) + + + (0x5ba36127, 0x195feae1) + Input epochs + + + + + (0x5ba36127, 0x195feae1) + Averaged epochs + + + + + (0x6530bdb1, 0xd057bbfe) + Averaging type + Epoch block average + Moving epoch average + false + + + (0x007deef9, 0x2f3e95c6) + Epoch count + 4 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xb73cee83, 0xf7215d60) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00cdd939) + + + + + (0x1f949de2, 0x2337d854) + Time based epoching + (0x00777fa0, 0x5dc3f560) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Epoched signal 1 + + + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 duration (in sec) + 1 + 1.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch 1 intervals (in sec) + 0.5 + 0.062500 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff41e9, 0xccc59a01) + + + + + (0x21fcf924, 0x5d3b2684) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0061f9ef) + + + + + (0x3ec7a705, 0x4cd766d5) + 2D topographic map + (0x0b104632, 0x451c265f) + + + (0x544a003e, 0x6dcba5f6) + Signal + + + (0x013df452, 0xa3a8879a) + Channel localization + + + + + (0x44b76d9e, 0x618229bc) + Interpolation type + 1 + Spline (potentials) + false + + + (0x512a166f, 0x5c3ef83f) + Delay (in s) + 0 + 0.000000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 544 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0x7b15868b, 0x3fd9a6ab) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x16218589) + + + + + (0x44ee7a32, 0x52ad995f) + Electrode localisation file reader + (0x40704155, 0x19c50e8f) + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${AdvancedViz_ChannelLocalisation} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0x54c15135, 0x285756a5) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00371d9f) + + + + + (0x4b427aec, 0x6b0fac6f) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x63d6b541, 0x6b05c2ad) + 3D Topography + (0xc709ea84, 0xb577d910) + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 0.05 + 0.05 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x3d3c7c7f, 0xef0e7129) + Color + ${AdvancedViz_DefaultColorGradient} + ${AdvancedViz_DefaultColorGradient} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 496 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x4e7b798a, 0x183beafb) + (0xa291db4a, 0x5f4fcbfc) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6cb7e55b, 0x0e13304e) + Reference Channel + (0x444721ad, 0x78342cf5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel + Ref_Nose + Nz + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x4e7b798a, 0x183beafb) + (0x7e39891d, 0x32cf5be7) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x6faaa401, 0x3c7307af) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Low pass + Band pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 16.000000 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 24.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.500000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00ba7336) + + + + + (0x789ad7f5, 0x4791b012) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b124ce) + + + + + + + (0x06238c03, 0x2a587fa2) + + (0x21fcf924, 0x5d3b2684) + 0 + + + (0x0fbb365f, 0x0a3f89b8) + 0 + + + + (0x062e7816, 0x2087ee95) + + (0x4b427aec, 0x6b0fac6f) + 0 + + + (0x21fcf924, 0x5d3b2684) + 0 + + + + (0x12e790de, 0x1bd0aeee) + + (0x789ad7f5, 0x4791b012) + 1 + + + (0x6cb7e55b, 0x0e13304e) + 0 + + + + (0x18347c94, 0x77e1d57d) + + (0x0fbb365f, 0x0a3f89b8) + 0 + + + (0x63d6b541, 0x6b05c2ad) + 0 + + + + (0x2365a7fa, 0x25b829e6) + + (0x0fbb365f, 0x0a3f89b8) + 0 + + + (0x3ec7a705, 0x4cd766d5) + 0 + + + + (0x2428cc78, 0x69daa97c) + + (0x6cb7e55b, 0x0e13304e) + 0 + + + (0x6faaa401, 0x3c7307af) + 0 + + + + (0x5b997461, 0x0c57fefb) + + (0x1f949de2, 0x2337d854) + 0 + + + (0x4b427aec, 0x6b0fac6f) + 0 + + + + (0x6fbd214b, 0x4f657c81) + + (0x44ee7a32, 0x52ad995f) + 0 + + + (0x3ec7a705, 0x4cd766d5) + 1 + + + + (0x7dc31517, 0x57a0704e) + + (0x6faaa401, 0x3c7307af) + 0 + + + (0x1f949de2, 0x2337d854) + 0 + + + + + + (0x16fc202a, 0x76849bc1) + The <i>Generic Stream Reader</i> box +reads an OpenViBE file containing signals. + + + (0x473d9a43, 0x97fc0a97) + 704 + + + (0x7234b86b, 0x2b8651a5) + -48 + + + + + (0x18f469ad, 0x485d85d3) + Then the <i>Temporal Filter</i> box +filters the signal in the beta [16 24] Hz range. + + + (0x473d9a43, 0x97fc0a97) + 704 + + + (0x7234b86b, 0x2b8651a5) + 112 + + + + + (0x1a9d4942, 0x19261e44) + Then for each window, the band power is +computed thanks to the <i><b>Simple DSP</b></i> +box (wich computes squares of each sample) and +the <i><b>Signal Average</b></i> box +which reduces each window to a single sample for +each channl : the mean of all the samples +of this window for this channel. + + + (0x473d9a43, 0x97fc0a97) + 704 + + + (0x7234b86b, 0x2b8651a5) + 304 + + + + + (0x2b693b93, 0x5e2a4195) + Finally, the <i><b>2D Topographic Map</b></i> +and the <i><b>3D Topographic Map</b></i> +boxes display the resulting beta power over the scalp +surface, getting the channel localisation from the +<i><b>Electrode Localisation File Reader</b></i>. + + + (0x473d9a43, 0x97fc0a97) + 704 + + + (0x7234b86b, 0x2b8651a5) + 512 + + + + + (0x3563e422, 0x6847fe24) + The average beta power is averaged over +4 estimations thanks to the <i>Epoch +Average</i> box. + + + (0x473d9a43, 0x97fc0a97) + 704 + + + (0x7234b86b, 0x2b8651a5) + 416 + + + + + (0x35c7d728, 0x52b44a42) + The <i><b>Time Based Epoching</b></i> box +splits the signals in blocks of 1 seconds every +16th of second. This is a moving window. + + + (0x473d9a43, 0x97fc0a97) + 704 + + + (0x7234b86b, 0x2b8651a5) + 192 + + + + + (0x4de3a357, 0x1b13df95) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 544 + + + (0x7234b86b, 0x2b8651a5) + 608 + + + + + (0x51a26769, 0x20fd0303) + Each channel is referenced against +channel Nz (which was recorded on the nose +in the demonstrated file) thanks to the +<i>Reference Channel</i> box. + + + (0x473d9a43, 0x97fc0a97) + 704 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x63d6b541, 0x6b05c2ad)","childCount":0,"identifier":"(0x772c7cdf, 0x33c98441)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":645,"identifier":"(0x7f3626b8, 0x4d26e675)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":844},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x77e1919d, 0x34fdfde0)","index":0,"name":"Default tab","parentIdentifier":"(0x7f3626b8, 0x4d26e675)","type":2},{"boxIdentifier":"(0x3ec7a705, 0x4cd766d5)","childCount":0,"identifier":"(0x13283f74, 0x6dbed40e)","index":0,"parentIdentifier":"(0x77e1919d, 0x34fdfde0)","type":3}] + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_3DTopographicMap.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_3DTopographicMap.dox-part new file mode 100644 index 0000000..f0a2424 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_3DTopographicMap.dox-part @@ -0,0 +1,82 @@ +/** + * \page BoxAlgorithm_3DTopographicMap 3D topographic map +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DTopographicMap_Description| + The 3D topographic map uses the same visualization paradigm as its 2D version, which consists in interpolating potentials (or current densities) at the surface of the scalp, converting them to colors using a color scale and mapping them over the surface of the scalp. The 3D version offers the possibility to freeky move around the head to observe brain activity from a custom point of view. + + It requires a head model to be available. This model is divided in two : the lower part, which includes the face and the neck, is static (meaning once it's loaded, it doesn't get modified). The other part, the 'scalp', is the area where potentials are mapped. Its size and shape determine where brain activity mapping will occur once the plugin is running. This second mesh is a set of vertices whose colors will be modified depending on the value of the potential interpolated there. + + Potentials interpolation works using a spherical spline algorithm. The coordinates of the electrodes used in the experiment are sent to the algorithm in an initialization step. Then as the experiment is conducted, the values of the potentials measured at the electrodes location are sent to the algorithm. + + Potentials at scalp vertices locations can be retrieved by converting each vertex location (expressed in model frame) to a cartesian orthonormal frame. + + * |OVP_DocEnd_BoxAlgorithm_3DTopographicMap_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DTopographicMap_Inputs| +Note: the channel names specified on the 'Signal' and 'Channel Localization' input streams should match. Mismatches may not be reported by the box. For example, if electrode localisation file reader provides the positions of the electrodes from some configuration file, the channel names in that file should correspend to the names of the signal channels delivered in the Signal stream. + * |OVP_DocEnd_BoxAlgorithm_3DTopographicMap_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_3DTopographicMap_Input1| + * |OVP_DocEnd_BoxAlgorithm_3DTopographicMap_Input1| + + +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DTopographicMap_Settings| + * |OVP_DocEnd_BoxAlgorithm_3DTopographicMap_Settings| + + * |OVP_DocBegin_BoxAlgorithm_3DTopographicMap_Setting1| + Choice of spline or laplacian interpolation. + * |OVP_DocEnd_BoxAlgorithm_3DTopographicMap_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_3DTopographicMap_Setting2| + Delay to apply to displayed data, in seconds. + * |OVP_DocEnd_BoxAlgorithm_3DTopographicMap_Setting2| +__________________________________________________________________ + +Online visualization settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DTopographicMap_OnlineVisualizationSettings| + Online settings include : + + - Map Potentials/Currents : these settings control the nature of mapped values. While potentials are computed from spline values, currents computation uses the spline laplacian. + - Toggle Electrodes : toggle electrodes on/off. + - Toggle Sampling Points : toggle sampling points on/off. Sampling points lie at the vertices of the skull mesh. + + \image html topographicmap3ddisplay_toolbar.png "3D Topographic Map toolbar" + * |OVP_DocEnd_BoxAlgorithm_3DTopographicMap_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DTopographicMap_Examples| +This example is based on the following scenario file : box-tutorials/topographic_map.xml + + In this example an EEG recording is read using a GDF file reader, and data is processed and filtered before being mapped onto the scalp surface. For details on this data processing step, see the example in \ref Doc_BoxAlgorithm_2DTopographicMap. + + A 2D topographic map is displayed next to the 3D version for comparison purposes. + + \image html topographicmap3ddisplay_2d_vs_3d_online.png "Mapping brain activity in 2D and 3D" + * |OVP_DocEnd_BoxAlgorithm_3DTopographicMap_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_3DTopographicMap_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_3DTopographicMap_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_DisplayCueImage.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_DisplayCueImage.dox-part new file mode 100644 index 0000000..be90d0c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_DisplayCueImage.dox-part @@ -0,0 +1,84 @@ +/** + * \page BoxAlgorithm_DisplayCueImage Display cue image +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_DisplayCueImage_Description| + Displays different images according to the input stimulations. User can define as many images as needed, with one stimulation associated to each image. A specific stimulation clears the screen. + * |OVP_DocEnd_BoxAlgorithm_DisplayCueImage_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_DisplayCueImage_Inputs| + * |OVP_DocEnd_BoxAlgorithm_DisplayCueImage_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_DisplayCueImage_Input1| + Stimulations used to display an image or clear the screen. + * |OVP_DocEnd_BoxAlgorithm_DisplayCueImage_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_DisplayCueImage_Outputs| + * |OVP_DocEnd_BoxAlgorithm_DisplayCueImage_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_DisplayCueImage_Output1| + The input stimulations are output when the GTK rendering is actually finished (image is displayed or screen is cleared). This output is deprecated. + * |OVP_DocEnd_BoxAlgorithm_DisplayCueImage_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_DisplayCueImage_Settings| + * |OVP_DocEnd_BoxAlgorithm_DisplayCueImage_Settings| + + * |OVP_DocBegin_BoxAlgorithm_DisplayCueImage_Setting1| +Render the images in fullscreen, centered. + * |OVP_DocEnd_BoxAlgorithm_DisplayCueImage_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_DisplayCueImage_Setting2| +Scale the images to fit the displayed area. + * |OVP_DocEnd_BoxAlgorithm_DisplayCueImage_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_DisplayCueImage_Setting3| +The stimulation that clears the screen to black. + * |OVP_DocEnd_BoxAlgorithm_DisplayCueImage_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_DisplayCueImage_Setting4| +The first image to display. + * |OVP_DocEnd_BoxAlgorithm_DisplayCueImage_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_DisplayCueImage_Setting5| +The stimulation used to display the first image. + * |OVP_DocEnd_BoxAlgorithm_DisplayCueImage_Setting5| +__________________________________________________________________ + +Online visualization settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_DisplayCueImage_OnlineVisualizationSettings| + None. + * |OVP_DocEnd_BoxAlgorithm_DisplayCueImage_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_DisplayCueImage_Examples| +The Display Cue Image box can be used to make scenarios that record Event-Related Potentials (ERPs) based on visual events. Use the Lua Stimulator box with a .lua script to create a timeline of stimulations to drive the box (e.g. SSVEP scenarios have examples of such lua scripts). Then, capture the recorded data and events with the Acquisition Client box and feed to Generic Stream Writer. + * |OVP_DocEnd_BoxAlgorithm_DisplayCueImage_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_DisplayCueImage_Miscellaneous| +After rendering each image, the Display Cue Image box sends the corresponding stimulations to the Acquisition Server using TCP Tagging. + * |OVP_DocEnd_BoxAlgorithm_DisplayCueImage_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_ERPPlot.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_ERPPlot.dox-part new file mode 100644 index 0000000..8b2d6e4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_ERPPlot.dox-part @@ -0,0 +1,78 @@ +/** + * \page BoxAlgorithm_ERPPlot Event related potential Plot +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ERPPlot_Description| +Plots target event-related potentials (ERP) versus non target ERP. Also draw the spread (variance) around these values. +Saves the picture in a png file if a certain trigger is received on its first input. + * |OVP_DocEnd_BoxAlgorithm_ERPPlot_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ERPPlot_Inputs| +You can add mode inputs to this box. Excluding the first input (stimulis), the inputs work by pair signal/standard deviation so when you add an input, a pair of input will be added. The corresponding settings are automatically added as well. + * |OVP_DocEnd_BoxAlgorithm_ERPPlot_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ERPPlot_Input1| +Stimulis channel. If the stimulus received matches the 'Trigger to save figure' setting, it writes a png file at 'Filename final figure' + * |OVP_DocEnd_BoxAlgorithm_ERPPlot_Input1| + + * |OVP_DocBegin_BoxAlgorithm_ERPPlot_Input2| + The signal to plot. + * |OVP_DocEnd_BoxAlgorithm_ERPPlot_Input2| + + * |OVP_DocBegin_BoxAlgorithm_ERPPlot_Input3| + The variance of the signal to plot. + * |OVP_DocEnd_BoxAlgorithm_ERPPlot_Input3| + +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ERPPlot_Settings| + * |OVP_DocEnd_BoxAlgorithm_ERPPlot_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ERPPlot_Setting1| +Filename final figure. Path to where you want the picture to be saved (png file). + * |OVP_DocEnd_BoxAlgorithm_ERPPlot_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_ERPPlot_Setting2| +Trigger to save figure. Identifier of the stimulis that triggers the saving of the file. + * |OVP_DocEnd_BoxAlgorithm_ERPPlot_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_ERPPlot_Setting3| +Should X-Axis time labels always start from 0? + * |OVP_DocEnd_BoxAlgorithm_ERPPlot_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_ERPPlot_Setting4| +Line color 1. Color of the curve. The confidence zone is drawn with the same color but with 50% transparency. + * |OVP_DocEnd_BoxAlgorithm_ERPPlot_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_ERPPlot_Setting5| +Line label 1. The name you want to appear next to your plotted signal. + * |OVP_DocEnd_BoxAlgorithm_ERPPlot_Setting5| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ERPPlot_Examples| + Here is an example using a \ref BoxAlgorithm_ERPPlot box with the first signal labelled target displayed in green and the second one labelled non target in red. + + \image html "erp-plot.png" "Target vs non target displayed using the Erp Plot". + * |OVP_DocEnd_BoxAlgorithm_ERPPlot_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ERPPlot_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_ERPPlot_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_GrazVisualization.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_GrazVisualization.dox-part new file mode 100644 index 0000000..16182bc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_GrazVisualization.dox-part @@ -0,0 +1,105 @@ +/** + * \page BoxAlgorithm_GrazVisualization Graz visualization +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GrazVisualization_Description| +The Graz visualization box implements the display of the well-known +Graz BCI paradigm, typically used for Motor Imagery BCI experiments. +The paradigm is described e.g. in Pfurtscheller & Neuper, +"Motor Imagery and Direct Brain-Computer Communication", 2001. + +In its most common use, the Graz visualization instructs the user to +perform either left or right hand motor imagery by presenting left and +right arrows, correspondingly. In order to know when to present what, +the box must be driven with a stimulation stream that provides the +timeline of the experiment, including trial starts, trial stops, etc. + +The same box can be used both for data collection and for real-time +displays. When used real time, the box can display a directional blue +bar to illustrate the strength and direction of the prediction. + * |OVP_DocEnd_BoxAlgorithm_GrazVisualization_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GrazVisualization_Inputs| + * |OVP_DocEnd_BoxAlgorithm_GrazVisualization_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_GrazVisualization_Input1| + The timeline of the events. + * |OVP_DocEnd_BoxAlgorithm_GrazVisualization_Input1| + + * |OVP_DocBegin_BoxAlgorithm_GrazVisualization_Input2| + For online use and feedback, the strength of the current activation. + This can be for example the continuous output from a classifier. + * |OVP_DocEnd_BoxAlgorithm_GrazVisualization_Input2| + +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GrazVisualization_Settings| + * |OVP_DocEnd_BoxAlgorithm_GrazVisualization_Settings| + + * |OVP_DocBegin_BoxAlgorithm_GrazVisualization_Setting1| +If true, the user will be shown the arrows. + * |OVP_DocEnd_BoxAlgorithm_GrazVisualization_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_GrazVisualization_Setting2| +If true, the current activation will be presented as feedback in form of a blue bar. + * |OVP_DocEnd_BoxAlgorithm_GrazVisualization_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_GrazVisualization_Setting3| +If true, feedback will be shown only after the trial. Otherwise immediately. + * |OVP_DocEnd_BoxAlgorithm_GrazVisualization_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_GrazVisualization_Setting4| +If true, a little matrix will display how many online trials matched the arrow direction. + * |OVP_DocEnd_BoxAlgorithm_GrazVisualization_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_GrazVisualization_Setting5| +How many predictions to integrate for computing the feedback bar? + * |OVP_DocEnd_BoxAlgorithm_GrazVisualization_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_GrazVisualization_Setting6| +If true, the blue bar will only be displayed if its direction agrees with the arrow. + * |OVP_DocEnd_BoxAlgorithm_GrazVisualization_Setting6| + +__________________________________________________________________ + +Online visualization settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GrazVisualization_OnlineVisualizationSettings| + * |OVP_DocEnd_BoxAlgorithm_GrazVisualization_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GrazVisualization_Examples| + * |OVP_DocEnd_BoxAlgorithm_GrazVisualization_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GrazVisualization_Miscellaneous| +The timeline required by the box can be generated by a Lua stimulator. +OpenViBE is bundled with a few motor imagery examples illustrating +this (in folder "bci-examples/"). + +In order to place the markers (stimulations) to the recorded EEG stream accurately in time, +the box connects to the Acquisition Server's TCP Tagging plugin and forwards the received +timeline there after rendering. The subsequent scenarios and writers should then use the timeline +from the Acquisition Server output and not directly from the timeline generating box. But +due to the long duration of time the motor imagery is typically integrated, this paradigm +could be less sensitive to marker alignment issues compared e.g. to P300. + * |OVP_DocEnd_BoxAlgorithm_GrazVisualization_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_LevelMeasure.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_LevelMeasure.dox-part new file mode 100644 index 0000000..15927ea --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_LevelMeasure.dox-part @@ -0,0 +1,51 @@ +/** + * \page BoxAlgorithm_LevelMeasure Level measure +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_LevelMeasure_Description| + Values contained in input matrix are displayed as levels shown on vertical progress bars. A normalization is performed so that the sum of all displayed levels is 1. + * |OVP_DocEnd_BoxAlgorithm_LevelMeasure_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_LevelMeasure_Inputs| + * |OVP_DocEnd_BoxAlgorithm_LevelMeasure_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_LevelMeasure_Input1| + * |OVP_DocEnd_BoxAlgorithm_LevelMeasure_Input1| +__________________________________________________________________ + +Online visualization settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_LevelMeasure_OnlineVisualizationSettings| + Online settings : + + Setting1 : Reset scores + + Setting2 : Threshold that must be reached for scores to be incremented + + Setting3 : Show levels as percentages + + * |OVP_DocEnd_BoxAlgorithm_LevelMeasure_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_LevelMeasure_Examples| + * |OVP_DocEnd_BoxAlgorithm_LevelMeasure_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_LevelMeasure_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_LevelMeasure_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_MultimodalGrazVisualization.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_MultimodalGrazVisualization.dox-part new file mode 100644 index 0000000..b761983 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_MultimodalGrazVisualization.dox-part @@ -0,0 +1,117 @@ +/** + * \page BoxAlgorithm_MultimodalGrazVisualization Multimodal Graz visualization +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Description| +This is a generalization of the Graz visualization allowing to display the result of the classification on two or more classes, always choosing which action to ask the user. + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Inputs| + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Input1| + The timeline of the events. + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Input1| + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Input2| + For online use and feedback, the strength of the current activation. + This can be for example the continuous output from a classifier. + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Input2| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Outputs| + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Outputs| + Vector of displayed Bar Size. + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Outputs| + Confusion matrix (recommended to save only last matrix if you want to save to csv). + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Outputs| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Settings| + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Settings| + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Setting1| +If true, the user will be shown the modalities. + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Setting2| +Selection of the feedback mode:\n +None = no Feedback\n +Positive Only = only the expected modality is the predicted\n +Best Only = Feedback only for the predicted Feedback\n +All = Feedback of all modality + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Setting3| +If true, feedback will be shown only after the trial. Otherwise immediately. + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Setting4| +If true, a little matrix will display how many online trials matched the arrow direction. + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Setting5| +How many predictions to integrate for computing the feedback bar. + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Setting6| + Path to the modality image if we don't show the instruction. + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Setting7| + Label of the stimulation for the first class. + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Setting7| + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Setting8| + Path to the modality image of the first class. + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Setting8| + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Setting9| + Label of the stimulation for the first class. + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Setting9| + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Setting10| + Path to the modality image of the second class. + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Setting10| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Examples| + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MultimodalGrazVisualization_Miscellaneous| +The timeline required by the box can be generated by a Lua stimulator. +OpenViBE is bundled with a few motor imagery examples illustrating +this (in folder "bci-examples/"). + +In order to place the markers (stimulations) to the recorded EEG stream accurately in time, +the box connects to the Acquisition Server's TCP Tagging plugin and forwards the received +timeline there after rendering. The subsequent scenarios and writers should then use the timeline +from the Acquisition Server output and not directly from the timeline generating box. But +due to the long duration of time the motor imagery is typically integrated, this paradigm +could be less sensitive to marker alignment issues compared e.g. to P300. + * |OVP_DocEnd_BoxAlgorithm_MultimodalGrazVisualization_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300IdentifierCardVisualization.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300IdentifierCardVisualization.dox-part new file mode 100644 index 0000000..9a18329 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300IdentifierCardVisualization.dox-part @@ -0,0 +1,157 @@ +/** + * \page BoxAlgorithm_P300IdentifierCardVisualization P300 Identifier Card Visualization +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Description| +This box can be used with a P300 based paradigm to have a simple game. A target card is choose among a collection of cards and it display in the Target area. The application shows each card sequentially. +After a number of repetitions, the card that the user was focusing on is automatically found. + +\image html Doc_BoxAlgorithm_P300IdentifierCardVisualization_Snapshot.png "The P300 Identification Card Visualization" + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Inputs| +This box has three inputs. The most important one is the first one, sequencing the which card to show to the user. +The two other inputs are optional and used for defining the target and the selected card. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Input1| +This input is used for sequencing the card display. It uses specific stimulations to know which +card should be shown (see \ref Doc_BoxAlgorithm_P300IdentifierCardVisualization_Setting_5) +The card display is switched off thanks to the \c OVTK_StimulationId_VisualStimulationStop stimulation +(this is automatically triggered by the \ref Doc_BoxAlgorithm_P300SpellerStimulator box). + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Input1| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Input2| +This input is used in order to define the target card the user should focus on. See +\ref Doc_BoxAlgorithm_P300IdentificationCardVisualization_Setting_5 to know what stimulation should be used. +The target card will be displayed in the "Target" area, with a specific color so the user quickly notices it. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Input2| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Input3| +This input is used in order to define the selected card the user should focus on. See +\ref Doc_BoxAlgorithm_P300IdentifierCardVisualization_Setting_5 to know what stimulation should be used. +The selected card will be displayed in the "Selected" area, with a specific color so the user quickly notices it. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Input3| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Outputs| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Output1| +This output is used to translate incoming stimulations depending if they are target or not. +The actual target is determined with the second input. As soon as the target is known, each display card +can be considered as a target display or not. This can be later use for selecting evoked response +potentials against other responses. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Settings| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Settings| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting1| +This is the gtk builder interface to use for the GUI. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting2| +This color defines the default background. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting3| +This color defines the background color for target card. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting4| +This color defines the background color for selected card. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting5| +This stimulation is used as a basis for the flashes. For example, flashing the first card consists in sending this +exact stimulation code to the first input. Flashing the second card needs this stimulation code + 1 and so on. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting6| +This image correspond to the image display between 2 repetitions + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting7| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting7| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting8| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting8| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting9| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting9| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting10| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting10| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting11| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting11| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting12| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting12| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting13| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting13| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting14| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting14| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting15| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting15| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting16| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting16| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting17| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting17| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting18| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting18| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting19| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting19| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting20| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting20| + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Setting21| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Setting21| +__________________________________________________________________ + +Online visualization settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_OnlineVisualizationSettings| +There are no online visualization settings for this box. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Examples| +This box is used in the P300 Identifier card BCI. Please see this +scenario in the sample openvibe-scenarios. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierCardVisualization_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierCardVisualization_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300IdentifierCardVisualization_Snapshot.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300IdentifierCardVisualization_Snapshot.png new file mode 100644 index 0000000..6a3699e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300IdentifierCardVisualization_Snapshot.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300MagicCardVisualization.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300MagicCardVisualization.dox-part new file mode 100644 index 0000000..efd95b3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300MagicCardVisualization.dox-part @@ -0,0 +1,163 @@ +/** + * \page BoxAlgorithm_P300MagicCardVisualization P300 Magic Card Visualization +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Description| +This box can be used with a P300 based paradigm to have a simple game. A collection of cards are presented to +the user. He chooses one card among all and focuses on this card. The application shows each card sequentially. +After a number of repetitions, the card that the user was focusing on is automatically found. + +\image html Doc_BoxAlgorithm_P300MagicCardVisualization_Snapshot1.png "The P300 Magic Card Visualization showing all the cards" +\image html Doc_BoxAlgorithm_P300MagicCardVisualization_Snapshot2.png "The P300 Magic Card Visualization flashing one of the cards" + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Inputs| +This box has three inputs. The most important one is the first one, sequencing the which card to show to the user. +The two other inputs are optional and used for defining the target and the selected card. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Input1| +This input is used for sequencing the card display. It uses specific stimulations to know which +card should be shown (see \ref Doc_BoxAlgorithm_P300MagicCardVisualization_Setting_5) +The card display is switched off thanks to the \c OVTK_StimulationId_VisualStimulationStop stimulation +(this is automatically triggered by the \ref Doc_BoxAlgorithm_P300SpellerStimulator box). + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Input1| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Input2| +This input is used in order to define the target card the user should focus on. See +\ref Doc_BoxAlgorithm_P300MagicCardVisualization_Setting_5 to know what stimulation should be used. +The target card will be highlighted with a specific color so the user quickly notices it. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Input2| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Input3| +This input is used in order to define the selected card the user should focus on. See +\ref Doc_BoxAlgorithm_P300MagicCardVisualization_Setting_5 to know what stimulation should be used. +The selected card will be highlighted with a specific color so the user quickly notices it. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Input3| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Outputs| + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Output1| +This output is used to translate incoming stimulations depending if they are target or not. +The actual target is determined with the second input. As soon as the target is known, each flash +can be considered as a target flash or not. This can be later use for selecting evoked response +potentials against other responses. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Settings| + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Settings| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting1| +This is the gtk builder interface to use for the GUI. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting2| +This color defines the default background. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting3| +This color defines the background color for target card. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting4| +This color defines the background color for selected card. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting5| +This stimulation is used as a basis for the flashes. For example, flashing the first card consists in sending this +exact stimulation code to the first input. Flashing the second card needs this stimulation code + 1 and so on. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting6| +Default background image for every card (the image displayed when the card is NOT flashed). +If this setting is empty, the background image for every card must be named "cardname-offscreen" (e.g. "01.png-offscreen"). + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting7| + 1st card. Cards are ordered from left to right, line after line. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting7| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting8| + 2nd card. Cards are ordered from left to right, line after line. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting8| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting9| + 3rd card. Cards are ordered from left to right, line after line. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting9| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting10| + 4th card. Cards are ordered from left to right, line after line. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting10| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting11| + 5th card. Cards are ordered from left to right, line after line. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting11| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting12| + 6th card. Cards are ordered from left to right, line after line. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting12| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting13| + 7th card. Cards are ordered from left to right, line after line. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting13| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting14| + 8th card. Cards are ordered from left to right, line after line. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting14| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting15| + 9th card. Cards are ordered from left to right, line after line. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting15| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting16| + 10th card. Cards are ordered from left to right, line after line. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting16| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting17| + 11th card. Cards are ordered from left to right, line after line. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting17| + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Setting18| + 12th card. Cards are ordered from left to right, line after line. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Setting18| +__________________________________________________________________ + +Online visualization settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_OnlineVisualizationSettings| +There are no online visualization settings for this box. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Examples| +This box is used in the P300 magic card BCI. Please see this +scenario in the sample openvibe-scenarios. + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300MagicCardVisualization_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_P300MagicCardVisualization_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300MagicCardVisualization_Snapshot1.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300MagicCardVisualization_Snapshot1.png new file mode 100644 index 0000000..a9f275d Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300MagicCardVisualization_Snapshot1.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300MagicCardVisualization_Snapshot2.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300MagicCardVisualization_Snapshot2.png new file mode 100644 index 0000000..ec97ba3 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300MagicCardVisualization_Snapshot2.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300SpellerVisualization.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300SpellerVisualization.dox-part new file mode 100644 index 0000000..d78dccb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300SpellerVisualization.dox-part @@ -0,0 +1,181 @@ +/** + * \page BoxAlgorithm_P300SpellerVisualization P300 Speller Visualization +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Description| +This box can be used with the \ref Doc_BoxAlgorithm_P300SpellerStimulator box in order to +implement a P300 speller application. The visualization consists in a matrix of 6 lines and +columns containing 26 characters and 10 numbers. The lines and columns can be flashed sequentially +to cause an evoked potential in the user's brain activity. This evoked potential can be +detected and used to find which line and which column the user was focused on, thus resulting +in the ability to write text. + +This box relies on a gtk builder interface that contains the actual letters & numbers. This glade +interface can be freely adpated if you need for example more than 6 lines or 6 columns, or +if you need something else than letters & words (e.g. words). + +\image html Doc_BoxAlgorithm_P300SpellerVisualization_Snapshot.png "The P300 Speller Visualization in action" + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Inputs| +This box has four inputs. The most important one is the first one, sequencing the flashes. +The three other inputs are optional and used for defining the target and the selected line/columns. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Input1| +This input is used for sequencing the flashes. It uses specific stimulations to know which +line/column should be flashed (see \ref Doc_BoxAlgorithm_P300SpellerVisualization_Setting_2 +and \ref Doc_BoxAlgorithm_P300SpellerVisualization_Setting_3). The flash is switched off thanks +to the \c OVTK_StimulationId_VisualStimulationStop stimulation (this is automatically triggered +by the \ref Doc_BoxAlgorithm_P300SpellerStimulator box). + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Input1| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Input2| +This input is used in order to define the target row/column the user should focus on. See +\ref Doc_BoxAlgorithm_P300SpellerVisualization_Setting_2 and +\ref Doc_BoxAlgorithm_P300SpellerVisualization_Setting_3 to know what stimulation should be used. +The target row/column will be highlighted with a specific color/size so the user quickly notices +the letter to focus on. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Input2| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Input3| +This input is used in order to define the selected row. See +\ref Doc_BoxAlgorithm_P300SpellerVisualization_Setting_2 and +\ref Doc_BoxAlgorithm_P300SpellerVisualization_Setting_3 to know what stimulation should be used. +The target row/column will be highlighted with a specific color/size so the user quickly notices +the letter that has been selected. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Input3| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Input4| +This input is used in order to define the selected column. See +\ref Doc_BoxAlgorithm_P300SpellerVisualization_Setting2 and +\ref Doc_BoxAlgorithm_P300SpellerVisualization_Setting3 to know what stimulation should be used. +The target row/column will be highlighted with a specific color/size so the user quickly notices +the letter that has been selected. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Input4| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Outputs| + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Output1| +DEPRECATED. This output should not be used anymore. See Miscellaneous Description below. + +This output is used to translate incoming flash stimulations depending if they are target or not. +The actual target is determined with the second input. As soon as the target is known, each flash +can be considered as a target flash or not. This can be later use for selecting evoked response +potentials against other responses. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Settings| + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Settings| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Setting1| +This is the gtk builder interface to use for the GUI. This file can be adapted depending on your needs, for example +if you want to replace the letters / numbers by e.g. words or symbols, or if you want to add more lines / columns. +However, the structure of the GUI is important (wee need some specific hierarchies to allow flash/selection coloring +to work). So please, respect this structure. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Setting2| +This stimulation is used as a basis for the row flashes. For example, flashing the first row consists in sending this +exact stimulation code to the first input. Flashing the second row needs this stimulation code + 1 and so on. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Setting3| +This stimulation is used as a basis for the column flashes. For example, flashing the first column consists in sending this +exact stimulation code to the first input. Flashing the second column needs this stimulation code + 1 and so on. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Setting4| +This color defines the flash background. It is not common in P300 spellers to have a changing background but this +probably enhances the response. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Setting5| +This color defines the flash foreground (the colors of the letters). + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Setting6| +This setting defines the size of the letter when the flash occurs. Consider this value as a scale factor with no specific unit. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Setting7| +This color defines the background when there is no flash. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Setting7| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Setting8| +This color defines the foreground when there is no flash. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Setting8| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Setting9| +This setting defines the size of the letter when there is no flash. Consider this value as a scale factor with no specific unit. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Setting9| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Setting10| +This color defines the background of the target letter. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Setting10| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Setting11| +This color defines the foreground of the target letter. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Setting11| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Setting12| +This setting defines the size of the target letter. Consider this value as a scale factor with no specific unit. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Setting12| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Setting13| +This color defines the background of the selected letter. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Setting13| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Setting14| +This color defines the foreground of the selected letter. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Setting14| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Setting15| +This setting defines the size of the selected letter. Consider this value as a scale factor with no specific unit. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Setting15| +__________________________________________________________________ + +Online visualization settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_OnlineVisualizationSettings| +There are no online visualization settings for this box. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Examples| +This box is used in the P300 speller BCI. Please see this +scenario in the sample openvibe-scenarios. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerVisualization_Miscellaneous| + The box relies on the TCP Tagging plugin of the OpenViBE Acquisition Server. A stimulation stream including target/nontarget + stimulations will be sent to the Acquisition Server directly after rendering. This 'software tagging' approach tries to + align the stimulations as well as possible with relation to the underlying EEG stream. It should be more time-accurate than using + the stimulations from the output socket of the box (deprecated). An even better option would be 'hardware tagging', i.e. to + send the stimulations to the amplifier. Hardware tagging is currently not supported due to a lack of a standard for such. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerVisualization_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300SpellerVisualization_Snapshot.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300SpellerVisualization_Snapshot.png new file mode 100644 index 0000000..f8f0d44 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_P300SpellerVisualization_Snapshot.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_PowerSpectrumDisplay.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_PowerSpectrumDisplay.dox-part new file mode 100644 index 0000000..2777204 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_PowerSpectrumDisplay.dox-part @@ -0,0 +1,88 @@ +/** + * \page BoxAlgorithm_PowerSpectrumDisplay Power Spectrum Display +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_PowerSpectrumDisplay_Description| +The power spectrum displays the amplitude of a signal in a set of frequency bands. One 2D graph is plotted per channel, where amplitudes are distributed on the vertical axis +and frequency bands on the horizontal axis. There is one spectrum per channel. + * |OVP_DocEnd_BoxAlgorithm_PowerSpectrumDisplay_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_PowerSpectrumDisplay_Inputs| + * |OVP_DocEnd_BoxAlgorithm_PowerSpectrumDisplay_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_PowerSpectrumDisplay_Input1| +Power spectrum of each channel to display. + * |OVP_DocEnd_BoxAlgorithm_PowerSpectrumDisplay_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_PowerSpectrumDisplay_Settings| +Offline settings include the minimum and maximum frequencies to display. If these frequencies lie outside the effective incoming frequency range, they will be clamped to it at Player +start time. + * |OVP_DocEnd_BoxAlgorithm_PowerSpectrumDisplay_Settings| + + * |OVP_DocBegin_BoxAlgorithm_PowerSpectrumDisplay_Setting1| +Minimum frequency to display in power spectra + * |OVP_DocEnd_BoxAlgorithm_PowerSpectrumDisplay_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_PowerSpectrumDisplay_Setting2| +Maximum frequency to display in power spectra + * |OVP_DocEnd_BoxAlgorithm_PowerSpectrumDisplay_Setting2| +__________________________________________________________________ + +Online visualization settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_PowerSpectrumDisplay_OnlineVisualizationSettings| + Online settings : + + - Best Fit : clicking this button ensures the vertical scale is adapted to the sample values plotted on all channels. + - Best Fit per Channel : similar to the previous button, only this time the vertical scale is adapted on a per-channel basis. + - Left/Bottom Ruler : these buttons toggle amplitude values and frequency values on/off. + - Min/Max Frequency : the range of frequency bands that are drawn may be adjusted with these buttons. + - Select Channels : clicking this button pops up a dialog that allows to show/hide some of the channels. + + \image html powerspectrumdisplay_toolbar.png "Power Spectrum toolbar." + * |OVP_DocEnd_BoxAlgorithm_PowerSpectrumDisplay_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_PowerSpectrumDisplay_Examples| + * |OVP_DocEnd_BoxAlgorithm_PowerSpectrumDisplay_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_PowerSpectrumDisplay_Miscellaneous| +This example is based on the following scenario file : tutorials/visualization/sample_power_spectrum + + Let's use a Sinus Oscillator to generate sinusoidal signals. A Signal Display box will be used in addition to a Power Spectrum box (both are found under '2D Visualization) to + visualize signals and their spectra at the same time. + + The power spectrum plugin has one input connector of 'Spectrum' type. Indeed, signal information must be processed before being sent to this plugin, + so that amplitude values are computed for a set of frequency bands. These computations can be done using a Spectral Analysis filter (found under 'Signal Processing > Spectral + Analysis'), making sure 'Amplitude' computation is enable in its settings (see \ref Doc_SignalProcessing_SpectralAnalysis for more on this). However, results might not be satisfactory due to the small size of data chunks being processed by the Spectral Analysis plugin. + + To feed the plugin more significant data, one can use the Time-Based Epoching + plugin to store data and send it only when it amounts to a given duration (see \ref Doc_SignalProcessing_Epoching to learn more about this box). One can insert an epoching + box right after a Sinus Oscillator, setting its epoch duration to e.g. 1s and epoch intervals to 0.0625s (1/16th of a second). This will ensure 1s-long chunks are sent 16 times + a second to the Spectral Analysis box. + + Typical spectra of combinations of sinusoidal signals, as generated by a Sinus Oscillator box, should look like the following : + + \image html powerspectrumdisplay_online.png "Time-based epoching for power spectra computation." + * |OVP_DocEnd_BoxAlgorithm_PowerSpectrumDisplay_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_SignalDisplay.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_SignalDisplay.dox-part new file mode 100644 index 0000000..80c060f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_SignalDisplay.dox-part @@ -0,0 +1,170 @@ +/** + * \page BoxAlgorithm_SignalDisplay Signal display +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_Description| +This plugin displays incoming signals. It plots values on the vertical axis while the horizontal axis represents time. + +To display your signal correctly and as smoothly as possible, you may need to configure this box. Please see below for examples. + + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_Inputs| + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_Input1| +Data to display. Signal and Streamed Matrix types are supported. + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_Input1| + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_Input2| +Stimulations. + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_Input2| + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_Input3| +Measurement units of the data. + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_Input3| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_Settings| + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_Settings| + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_Setting1| +Type of display, can be either Scan mode or Scroll mode. In Scan mode, the new data arrives +from left to right and the displayed data does not move. In Scroll mode, the new data always +arrives on the right and all displayed data moves right to left. + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_Setting2| +Automatic vertical (y) scaling mode: Per channel, Global, or None. + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_Setting3| +How often the vertical scale is refreshed. Only used when automatic vertical scaling mode is not None. + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_Setting4| +Vertical (y) scale for each channel when automatic vertical scaling mode is None. + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_Setting5| +Vertical (y) offset for each channel when automatic vertical scaling mode is None. + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_Setting6| +Size of time window to display, in seconds. + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_Setting7| +Enable bottom (x) ruler? + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_Setting7| + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_Setting8| +Enable left (y, vertical) ruler? + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_Setting8| + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_Setting9| +Enable multiview? This mode displays several signals on top of each other. It is sometimes called a 'butterfly plot'. + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_Setting9| + +__________________________________________________________________ + +Online visualization settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_OnlineVisualizationSettings| +By clicking the bar at the top of the window during runtime, the user gets access to the online +toolbar of the display. This allows settings of the box to be modified during playback. + +Online settings : + + The toolbar allows access to the following settings, + + - Scan/scroll mode : this button switches the type of display (scan or scroll) + - Left/Bottom Ruler : these buttons toggle channel y and x legend (coordinate axes). + - Channel units : Show channel units. Requires meaningful data from the measurement units stream. + - Auto vertical scale : Change the vertical (y) scaling mode + - Vertical scale : Value when automatic scaling is not used + - Vertical offset : Value when automatic scaling is not used + - Time Scale : this setting adjusts the time span displayed, in seconds. + - Select Channels : Allows to show/hide some of the channels by checking/unchecking each channel. + - Multi-View : Allows to configure what channels should be plotted in an extra graph at the bottom of the Signal Display window. When no channels are selected (default) this extra graph is not displayed. To disable multiview, select 'None' in the channel list. + - Stimulation colors : Display stimulation name or identifier corresponding to the plotted colors. + - Information : This button displays information about the data (min/max values and so on). + + \image html signaldisplay_toolbar.png "Signal Display toolbar" + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_Examples| + +To get some signals displayed right, changing the automatic y scaling may be useful. The provided scaling settings are + + - Per channel (default) : Every channel will get centered and scaled separately. This should allow viewing arbitrary signals. This is suitable for unfiltered data which may have huge differences in scale and DC between channels. + - Global : All channels are put to the same scale which is the maximum of all the channels. This mode is suitable for filtered EEG and data which may have long-term trends but where all channels generally stay in the same range. + - None: User must specify global center and scale. Display is never automatically rescaled. This is suitable for filtered EEG data where the meaningful range is within known parameters and DC doesn't vary. + +Note that the automatic scalers may include discontinuities in the plot when the scale changes (see below for 'Best practices'). + +Practical example : + + OpenViBE has a tutorial scenario bundled : box-tutorials/signal-display.xml + + An easy way to test this box consists of generating signals with the Sinus Oscillator plugin (found under 'Data generation' in Designer), and then connecting its signal output to the signal input of the Signal Display plugin. + + \image html signaldisplay_online.png "Visualizing 2 channels using the Signal Display plugin." + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDisplay_Miscellaneous| + +Best practices + +All vertical scaling modes except 'None' will change the scaling dynamically +when the scale of the data appears to have changed. To avoid slow redraws, +the box simply changes the scale and leaves the old part of the signal +as it was, meaning that you may see a discontinuity in the signal, as +for the moment there are two or more different scales visible. The scale +change is marked by small red ticks at the top and bottom of the display. + +For most situations, and to avoid the discontinuities of the automatic +scaling, the following is recommended: + + - First filter the signals meaningfully to remove DC and slow trends by using the Temporal Filter box. For EEG, you can use a bandpass configuration with a range a such as [1,40] hz. + - Next, set the vertical scaling to 'None' and provide the display box a meaningful fixed scale corresponding to your signal. You can find out a suitable scale by activating 'Left Ruler' when the auto scale is active. Note that when the scale is given in the box parameters, the scale can be saved with the scenario. + +Known issues and workarounds + +The box supports only two data stream types: Matrix and Signal. Many OpenViBE +stream types derive from the Streamed Matrix type. In this case, you can +configure the box to have a Streamed Matrix input socket, and then connect the +derived stream type to that. Note that the data of the stream not contained in the +matrix will be ignored. In any case, you may be able to visualize something +meaningful. In the case of Feature Vector stream, you can try to use the +Matrix Transpose box on the feature stream first to turn the features into +channels. + +Multiview: Multiview presents all the signals in the same space. +The different channels are not centered, so if they have large DC differences, +the view may not show anything meaningful. In this case, filter the signal first. + +Scroll mode is known to be slow, notably on Windows. For faster scrolling display, use Linux. + + * |OVP_DocEnd_BoxAlgorithm_SignalDisplay_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_Simple3DViewer.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_Simple3DViewer.dox-part new file mode 100644 index 0000000..31596aa --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_Simple3DViewer.dox-part @@ -0,0 +1,65 @@ +/** + * \page BoxAlgorithm_Simple3DViewer Simple 3D viewer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Simple3DViewer_Description| +This plugin was developed for 3D testing purposes. This standalone box demonstrates some capabilities of the OpenViBE 3D API, and can help make sure a 3D context is available, or a 3D model behaves as expected. + + This viewer creates an empty 3D scene by default. It's then up to the user to load 3D models and apply transformations to them, such as position/scale/color transformations. + * |OVP_DocEnd_BoxAlgorithm_Simple3DViewer_Description| +__________________________________________________________________ + +Online visualization settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Simple3DViewer_OnlineVisualizationSettings| +Online options include : + + - Create Object : opens a dialog to create an object. + - Delete Object : opens a dialog to delete an object. + - Set Position : opens a dialog to position an object. + - Set Scale : opens a dialog to scale an object. + - Set Color : opens a dialog to change the color of an object. + - View All : resets the camera position so that it encompasses the whole 3D scene, facing the +Z side of its bounding box + + \image html simple3dviewer_toolbar.png "Simple 3D Viewer toolbar" + * |OVP_DocEnd_BoxAlgorithm_Simple3DViewer_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Simple3DViewer_Examples| +This example is based on the following scenario file : tutorials/visualization/sample_simple_3D_viewer + + To start with, one should make sure the 3D context was initialised properly. This is done at startup time, and a log message should read "[INF] Created primary render window" at some point during application startup. In any case, loading the sample 3D viewer scenario and pressing Play should display an empty 3D window. If it doesn't, it probably means the 3D context could not be initialised in the first place. + + The viewer allows to load and manipulate 3D objects. Since the rendering library used in OpenViBE is Ogre3D, objects must be stored in the proprietary format of this library which is the .mesh format. See the Ogre3D website for information about it. For now, one can test OpenViBE 3D rendering using the sample objects that come with the platform. + + Press the Create Object button (situated in the plugin toolbar) : here one can load a 'standard' object (these are simple geometrical shapes such as spheres and cones) or any 'custom' object (one should then type in the name of the 3d object file to be loaded, omitting its extension). Let's load a sphere by typing in 'mysphere' in the object name field, then checking the 'standard' radio button and selecting 'sphere' in the drop-down box. Press OK. The camera might end up lying within the object that was just created. Press the 'View All' button to automatically reset the camera position so that it lies in front of the 3D scene. A sphere should now be visible. + + To delete an object, one can press the Delete Object button and type in the name of the object to destroy. + + Now let's move our object. Press the Set Position button, enter 'mysphere' as the object name and then some non-null coordinates to move the sphere. Press OK to see the results. Similarly, the object scale may be modified using the Set Scale button. Notice how the scale can be set independently for each axis. To apply a uniform scale to an object, one should enter the same scale for each axis. + + Let's now change the object color. Type in the object name, and then select 'Set Material Color'. This will modify the material properties of the object, meaning all objects using this material will be affected by this change. Enter an RGB color to attribute to the diffuse color of the material (each component should remain in the [0, 1] range). Similarly, the transparency of an object may be changed using the Transparency field (0 corresponding to a totally opaque object and 1 totally transparent). + + The Object color can also be changed by modifying the colors of its vertices. This may be done by selecting 'Set Vertex Color' in the Set Color dialog box. However, this requires objects to have special properties. Namely, the vertex buffers of the object must have the 'colors_diffuse' tag, which means each element (or vertex) has its own color in addition to a position and a normal. + + Also, one can move the camera at any time using the mouse. Maintaining the left mouse button pressed and moving the mouse rotates the camera around the center of the scene. To recompute the center (e.g. whenever the scene contents have changed), press the 'View All' button. To zoom in and out of the scene, press the right mouse button and move the mouse up or down. + + \image html simple3dviewer_online.png "Manipulating 3D objects using the Simple 3D Viewer plugin" + + * |OVP_DocEnd_BoxAlgorithm_Simple3DViewer_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Simple3DViewer_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_Simple3DViewer_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_TimeFrequencyMapDisplay.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_TimeFrequencyMapDisplay.dox-part new file mode 100644 index 0000000..f0b165c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/Doc_BoxAlgorithm_TimeFrequencyMapDisplay.dox-part @@ -0,0 +1,101 @@ +/** + * \page BoxAlgorithm_TimeFrequencyMapDisplay Time-frequency map display +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TimeFrequencyMapDisplay_Description| +A Time-Frequency (TF) map displays power spectra of signals over time, making it possible to track changes in amplitudes over a given time span. To that end, it + uses a color scale to convert amplitudes to colors. This makes it possible to represent a single spectrum as a column of color-coded blocks. As time goes by, they + are shifted to the left of the graph to make room for more recent spectra. There is one map per channel. + + Depending on the resolution of the map, a variable number of frequency bands are displayed per spectrum, or column of the map. + If the number of frequency bands equals the height of the map for a given channel, each frequency band is one pixel high. Smaller maps won't be able to display all + frequency bands, while in bigger maps, each frequency band will be allotted an area that is one pixel high or more. + + Since a TF map displays a series of power spectra, input data should be preprocessed by a Spectral Analysis box, as is the case with the Power Spectrum plugin. + See \ref Doc_BoxAlgorithm_PowerSpectrumDisplay for an example, and \ref Doc_BoxAlgorithm_SpectralAnalysis for more information. + + * |OVP_DocEnd_BoxAlgorithm_TimeFrequencyMapDisplay_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TimeFrequencyMapDisplay_Inputs| + * |OVP_DocEnd_BoxAlgorithm_TimeFrequencyMapDisplay_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_TimeFrequencyMapDisplay_Input1| +Power spectrum of each channel to display. + * |OVP_DocEnd_BoxAlgorithm_TimeFrequencyMapDisplay_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TimeFrequencyMapDisplay_Settings| +Online options include : + + - Bottom Ruler : this button toggles time values on/off. + - Min/Max Frequency : the range of frequency bands that are drawn may be adjusted with these buttons. + - Time Scale : this setting adjusts the time span displayed by the plugin. + - Select Channels : clicking this button pops up a dialog that allows to show/hide some of the channels. + - Attenuation : this setting allows to gradually adapt color thresholds. Valid values are in the [0,1] interval. + + \image html timefrequencymapdisplay_toolbar.png "Time Frequency Map toolbar." + * |OVP_DocEnd_BoxAlgorithm_TimeFrequencyMapDisplay_Settings| + + * |OVP_DocBegin_BoxAlgorithm_TimeFrequencyMapDisplay_Setting1| +Size of time window to display. + * |OVP_DocEnd_BoxAlgorithm_TimeFrequencyMapDisplay_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_TimeFrequencyMapDisplay_Setting2| +Minimum frequency to display in time frequency maps. + * |OVP_DocEnd_BoxAlgorithm_TimeFrequencyMapDisplay_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_TimeFrequencyMapDisplay_Setting3| +Maximum frequency to display in time frequency maps. + * |OVP_DocEnd_BoxAlgorithm_TimeFrequencyMapDisplay_Setting3| +__________________________________________________________________ + +Online visualization settings +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TimeFrequencyMapDisplay_OnlineVisualizationSettings| + * |OVP_DocEnd_BoxAlgorithm_TimeFrequencyMapDisplay_OnlineVisualizationSettings| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TimeFrequencyMapDisplay_Examples| +Practical example : + + This example is based on the following scenario file : tutorials/visualization/sample_time_frequency_map + + To test this plugin, one can extend the \ref Doc_DataVisualization_2DVisualization_PowerSpectrum example by adding a Time-Frequency Map plugin. Since Sinus Oscillator + signals are made up of sinusoidal signals with frequencies in the [0-50Hz] range, one should make sure the minimum and maximum displayed frequencies settings of the + Power Spectrum and TF Map plugins match this range. Results should look like the following screenshot. + + A few remarks : + - For now, there is no frequency scale displayed to the left of the maps. Frequencies are mapped from bottom to top for each channel. + + - TF maps don't change much over time, which is logical since power spectra displayed by the Power Spectrum box are pretty much constant themselves. This translates + into (almost uninterrupted) horizontal lines in the TF maps. + + - Finally, one can notice two dominant frequency bands in the power spectrum of each channel, where they stand out as high amplitude peaks. These bands translate into + dark horizontal lines in the TF maps. + + \image html timefrequencymapdisplay_online.png "Power spectra and their "history" displayed over the last 10 seconds using the TF map plugin." + + * |OVP_DocEnd_BoxAlgorithm_TimeFrequencyMapDisplay_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TimeFrequencyMapDisplay_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_TimeFrequencyMapDisplay_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/erp-plot.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/erp-plot.png new file mode 100644 index 0000000..b9daaef Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/erp-plot.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/matrix_display_online.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/matrix_display_online.png new file mode 100644 index 0000000..811751c Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/matrix_display_online.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/powerspectrumdisplay_online.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/powerspectrumdisplay_online.png new file mode 100644 index 0000000..ffb0203 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/powerspectrumdisplay_online.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/powerspectrumdisplay_toolbar.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/powerspectrumdisplay_toolbar.png new file mode 100644 index 0000000..62171d5 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/powerspectrumdisplay_toolbar.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/signaldisplay_online.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/signaldisplay_online.png new file mode 100644 index 0000000..de0061e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/signaldisplay_online.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/signaldisplay_toolbar.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/signaldisplay_toolbar.png new file mode 100644 index 0000000..d740103 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/signaldisplay_toolbar.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/simple3dviewer_online.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/simple3dviewer_online.png new file mode 100644 index 0000000..d4c818f Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/simple3dviewer_online.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/simple3dviewer_toolbar.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/simple3dviewer_toolbar.png new file mode 100644 index 0000000..8023590 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/simple3dviewer_toolbar.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/timefrequencymapdisplay_online.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/timefrequencymapdisplay_online.png new file mode 100644 index 0000000..6809e8e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/timefrequencymapdisplay_online.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/timefrequencymapdisplay_toolbar.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/timefrequencymapdisplay_toolbar.png new file mode 100644 index 0000000..aca11a7 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/timefrequencymapdisplay_toolbar.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/topographicmap2ddisplay_online.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/topographicmap2ddisplay_online.png new file mode 100644 index 0000000..36411b7 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/topographicmap2ddisplay_online.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/topographicmap2ddisplay_toolbar.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/topographicmap2ddisplay_toolbar.png new file mode 100644 index 0000000..3c4d70f Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/topographicmap2ddisplay_toolbar.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/topographicmap3ddisplay_2d_vs_3d_online.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/topographicmap3ddisplay_2d_vs_3d_online.png new file mode 100644 index 0000000..d6266b1 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/topographicmap3ddisplay_2d_vs_3d_online.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/topographicmap3ddisplay_online.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/topographicmap3ddisplay_online.png new file mode 100644 index 0000000..def13a6 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/topographicmap3ddisplay_online.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/topographicmap3ddisplay_toolbar.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/topographicmap3ddisplay_toolbar.png new file mode 100644 index 0000000..259e888 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/doc/topographicmap3ddisplay_toolbar.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/erp-plot.ui b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/erp-plot.ui new file mode 100644 index 0000000..fc7a0f7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/erp-plot.ui @@ -0,0 +1,15 @@ + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 400 + 400 + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/bar.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/bar.png new file mode 100644 index 0000000..5dd4e33 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/bar.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/blank.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/blank.png new file mode 100644 index 0000000..093583a Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/blank.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/compute.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/compute.png new file mode 100644 index 0000000..c152083 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/compute.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/down.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/down.png new file mode 100644 index 0000000..5f16629 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/down.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/feet.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/feet.png new file mode 100644 index 0000000..f02822a Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/feet.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/hand.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/hand.png new file mode 100644 index 0000000..3eb2e4c Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/hand.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/left.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/left.png new file mode 100644 index 0000000..b2c7186 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/left.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/music.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/music.png new file mode 100644 index 0000000..bad1468 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/music.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/none.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/none.png new file mode 100644 index 0000000..87e9f67 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/none.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/palm.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/palm.png new file mode 100644 index 0000000..25680dc Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/palm.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/rest.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/rest.png new file mode 100644 index 0000000..4a6f159 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/rest.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/right.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/right.png new file mode 100644 index 0000000..4ec8cdd Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/right.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/rotation.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/rotation.png new file mode 100644 index 0000000..d21a1ad Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/rotation.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/stop.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/stop.png new file mode 100644 index 0000000..dde18bd Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/stop.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/tongue.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/tongue.png new file mode 100644 index 0000000..dee2f77 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/tongue.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/up.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/up.png new file mode 100644 index 0000000..373560e Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/up.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/word.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/word.png new file mode 100644 index 0000000..aa6c744 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/graz/word.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-DisplayCueImage.ui b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-DisplayCueImage.ui new file mode 100644 index 0000000..18afd9d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-DisplayCueImage.ui @@ -0,0 +1,18 @@ + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + DispImage + center + 600 + 600 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization-bar.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization-bar.png new file mode 100644 index 0000000..8c13ea3 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization-bar.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization-downArrow.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization-downArrow.png new file mode 100644 index 0000000..92b74ad Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization-downArrow.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization-leftArrow.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization-leftArrow.png new file mode 100644 index 0000000..ad51d77 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization-leftArrow.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization-rightArrow.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization-rightArrow.png new file mode 100644 index 0000000..b3b2d58 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization-rightArrow.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization-upArrow.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization-upArrow.png new file mode 100644 index 0000000..f784cce Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization-upArrow.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization.ui b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization.ui new file mode 100644 index 0000000..caa5242 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-GrazVisualization.ui @@ -0,0 +1,17 @@ + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Graz Visualization + GTK_WIN_POS_CENTER + 600 + 600 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-LevelMeasure.ui b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-LevelMeasure.ui new file mode 100644 index 0000000..d67ad60 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-LevelMeasure.ui @@ -0,0 +1,124 @@ + + + + + + 85 + 100 + 0.10000000000000001 + 2 + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 8 + 8 + 8 + True + + + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Level measure + dialog + + + True + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + reset scores + gtk-refresh + + + False + True + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + adjustment1 + 2 + + + 0 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + threshold + center + + + 1 + + + + + + + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + percentages + gtk-justify-center + + + False + True + + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Level measure + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + 0 + 0 + 0.20000000298023224 + bottom-to-top + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-MatrixDisplay.ui b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-MatrixDisplay.ui new file mode 100644 index 0000000..059ef7e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-MatrixDisplay.ui @@ -0,0 +1,80 @@ + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 8 + 8 + 8 + True + + + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Matrix Display + dialog + + + True + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + show values + gtk-refresh + True + + + False + True + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + show colors + gtk-select-color + True + + + False + True + + + + + + + + + True + + + True + X + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-PowerSpectrumDisplay.ui b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-PowerSpectrumDisplay.ui new file mode 100644 index 0000000..f7b3119 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-PowerSpectrumDisplay.ui @@ -0,0 +1,449 @@ + + + + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Power spectrum display + 800 + 400 + + + True + True + GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + automatic + never + + + True + + + True + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK + never + automatic + top-right + True + + + True + none + + + True + 3 + + + + + + + + + + + + + + + + 0 + + + + + True + + + True + + + False + 0 + + + + + True + + + 1 + + + + + + + + False + 1 + + + + + + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 5 + Select Channels + mouse + dialog + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 2 + + + 320 + 240 + True + True + automatic + automatic + + + True + GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + queue + + + True + True + True + 0 + True + + + + + + + 1 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + end + + + Apply + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + False + False + 0 + + + + + Cancel + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + False + False + 1 + + + + + False + end + 0 + + + + + + PowerSpectrumDisplayChannelSelectApplyButton + PowerSpectrumDisplayChannelSelectCancelButton + + + + Power Spectrum Toolbar + False + mouse + dialog + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + both + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + False + Best fit + gtk-zoom-fit + True + + + False + True + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + False + Best Fit per Channel + gtk-zoom-fit + True + + + False + True + + + + + True + False + False + + + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Left Ruler + gtk-goto-first + + + False + True + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Bottom Ruler + gtk-goto-bottom + True + + + False + True + + + + + True + + + False + + + + + True + + + True + + + True + + + Best Fit + True + True + False + True + True + + + 0 + + + + + True + + + Custom + True + True + False + True + True + PowerSpectrumDisplayAutoVerticalScaleButton + + + 0 + + + + + True + True + 10 + + + 1 + + + + + 1 + + + + + 0 + + + + + True + Vertical Scale + + + 1 + + + + + + + False + + + + + True + + + False + + + + + True + + + True + 1 + + + True + True + adjustment1 + + + 0 + + + + + True + Min Frequency + + + 1 + + + + + + + False + + + + + True + + + True + 1 + + + True + True + adjustment2 + + + 0 + + + + + True + Max Frequency + + + 1 + + + + + + + False + + + + + True + + + False + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Select Channels + gtk-index + + + False + True + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-SignalDisplay.ui b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-SignalDisplay.ui new file mode 100644 index 0000000..cc89ed5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-SignalDisplay.ui @@ -0,0 +1,1067 @@ + + + + + + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 5 + Displayed Channels Selection + mouse + dialog + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 2 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + end + + + Apply + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + False + False + 0 + + + + + Cancel + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + False + False + 1 + + + + + False + True + end + 0 + + + + + 320 + 240 + True + True + automatic + automatic + + + True + False + GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + queue + + + True + True + True + 0 + True + + + + + + + True + True + 1 + + + + + + SignalDisplayChannelSelectApplyButton + SignalDisplayChannelSelectCancelButton + + + + 400 + 260 + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 5 + Signal Information + False + mouse + dialog + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 2 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + end + + + Close + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + False + False + 0 + + + + + False + True + end + 0 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 5 + 2 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + 1 + 2 + 4 + 5 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + 1 + 2 + 3 + 4 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + 1 + 2 + 2 + 3 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + 1 + 2 + 1 + 2 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + 1 + 2 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Maximum signal value + + + 4 + 5 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Minimum signal value + + + 3 + 4 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Sample count per buffer + + + 2 + 3 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Sampling frequency + + + 1 + 2 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Number of channels + + + + + True + True + 1 + + + + + + SignalDisplayInformationClose + + + + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Signal display + 400 + 150 + + + True + True + GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + automatic + never + + + True + False + GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + queue + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + never + automatic + top-right + True + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + queue + none + + + True + False + GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 4 + + + + + + + + + + + + + + + + + + + True + True + 0 + + + + + True + False + + + True + False + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + + + + False + True + 1 + + + + + + + + + + + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 5 + Multi-View Channel Configuration + mouse + dialog + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 2 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + end + + + Apply + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + False + False + 0 + + + + + Cancel + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + False + False + 1 + + + + + False + True + end + 0 + + + + + 320 + 240 + True + True + automatic + automatic + + + True + False + GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + queue + + + True + True + True + 0 + True + + + + + + + True + True + 1 + + + + + + SignalDisplayMultiViewApplyButton + SignalDisplayMultiViewCancelButton + + + + False + 5 + Stimulation Colors + mouse + 300 + 300 + dialog + + + True + False + 2 + + + True + False + end + + + Close + True + True + True + False + + + False + False + 0 + + + + + False + True + end + 0 + + + + + True + True + automatic + automatic + + + True + False + queue + + + True + False + 2 + + + + + + + + + + + + + True + True + 1 + + + + + + SignalDisplayStimulationColorsCloseButton + + + + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Signal Display Toolbar + False + mouse + dialog + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + both + False + + + True + False + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + Scroll Mode + gtk-find + + + False + True + + + + + True + False + + + False + + + + + True + False + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + False + False + Zoom In + gtk-zoom-in + + + False + True + + + + + True + False + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + False + False + Zoom Out + gtk-zoom-out + + + False + True + + + + + True + False + False + False + + + False + + + + + True + False + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + False + False + Best Fit + gtk-zoom-fit + + + False + True + + + + + True + False + False + False + False + False + Global Best Fit + gtk-zoom-fit + + + False + True + + + + + True + False + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + False + False + Normal Size + gtk-zoom-100 + + + False + True + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + False + + + False + + + + + True + False + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + Left Ruler + gtk-goto-first + + + False + True + + + + + True + False + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + Bottom Ruler + gtk-goto-bottom + True + + + False + True + + + + + True + False + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + Channel units + gtk-dialog-info + False + + + False + True + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + False + + + + + True + False + 3 + False + + + True + False + 3 + 4 + 4 + + + True + False + + + 1 + 2 + 1 + 3 + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + False + True + True + adjustment1 + 0.001 + 3 + False + True + + + 3 + 4 + 1 + 2 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Time Scale + + + 3 + 4 + 2 + 3 + + + + + True + False + Vertical Scale + + + 2 + 3 + + + + + True + False + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + False + True + True + adjustment2 + 0.001 + 5 + False + True + + + 1 + 2 + + + + + + True + False + + + True + False + gtk-sort-ascending + + + True + True + 0 + + + + + True + False + Auto vertical scale : + + + True + True + 1 + + + + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Vertical offset + + + 2 + 3 + 2 + 3 + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + True + False + False + True + True + adjustment3 + 0.001 + 5 + False + True + + + 2 + 3 + 1 + 2 + + + + + True + False + liststore1 + + + + 0 + + + + + 1 + 4 + + + + + + + False + + + + + True + False + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + Select Channels + gtk-index + + + False + True + + + + + True + False + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + Multi-View + gtk-leave-fullscreen + + + False + True + + + + + True + False + False + Stimulation Colors + gtk-select-color + + + False + True + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + False + + + + + True + False + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + Information + gtk-dialog-info + + + False + True + + + + + + + 0.001 + 9999999999 + 10 + 0.10000000000000001 + 100 + + + 0.001" + 1000000 + 1 + 1 + 10 + + + -1000000 + 1000000 + 0.01 + 10 + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-Simple3DDisplay.ui b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-Simple3DDisplay.ui new file mode 100644 index 0000000..2c6aff9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-Simple3DDisplay.ui @@ -0,0 +1,701 @@ + + + + + + 5 + Set object position + normal + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 2 + + + True + 4 + 2 + + + True + + + 1 + 2 + + + + + True + Object name + + + + + True + 0 + + + 1 + 2 + 1 + 2 + + + + + True + x + + + 1 + 2 + + + + + True + 0 + + + 1 + 2 + 2 + 3 + + + + + True + y + + + 2 + 3 + + + + + True + 0 + + + 1 + 2 + 3 + 4 + + + + + True + z + + + 3 + 4 + + + + + 1 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + + + + + + + False + end + 0 + + + + + + + 5 + Create a new object + normal + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 2 + + + True + 2 + 2 + + + True + 0 + 0 + Object name + + + GTK_EXPAND + + + + + True + + + 1 + 2 + + + + + True + 3 + 2 + + + True + + + + + + 1 + 2 + 1 + 2 + + + + + True + Object type + + + 2 + + + + + Standard + True + False + False + True + + + 1 + 2 + + + + + Custom + True + False + False + True + CreateObjectStandard + + + 2 + 3 + + + + + True + + + 1 + 2 + 2 + 3 + + + + + 2 + 1 + 2 + + + + + 1 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + + + + + + + False + end + 0 + + + + + + + 5 + Set object scale + normal + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 2 + + + True + 4 + 2 + + + True + Scale z + + + 3 + 4 + + + + + True + 1 + + + 1 + 2 + 3 + 4 + + + + + True + Scale y + + + 2 + 3 + + + + + True + 1 + + + 1 + 2 + 2 + 3 + + + + + True + Scale x + + + 1 + 2 + + + + + True + 1 + + + 1 + 2 + 1 + 2 + + + + + True + Object name + + + + + True + + + 1 + 2 + + + + + 1 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + + + + + + + False + end + 0 + + + + + + + 5 + Set object color + normal + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 2 + + + True + 6 + 2 + + + Set Vertex Color + True + False + False + True + SetMaterialColorRadioButton + + + 1 + 2 + 1 + 2 + + + + + Set Material Color + True + False + False + True + + + 1 + 2 + + + + + True + 0 + + + 1 + 2 + 5 + 6 + + + + + True + Transparency (0 to 1) + + + 5 + 6 + + + + + True + + + 1 + 2 + + + + + True + Object name + + + + + True + 1 + + + 1 + 2 + 2 + 3 + + + + + True + Red (0 to 1) + + + 2 + 3 + + + + + True + 1 + + + 1 + 2 + 3 + 4 + + + + + True + Green (0 to 1) + + + 3 + 4 + + + + + True + 1 + + + 1 + 2 + 4 + 5 + + + + + True + Blue (0 to 1) + + + 4 + 5 + + + + + 1 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + + + + + + + False + end + 0 + + + + + + + 5 + Delete an object + normal + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + 2 + + + True + 2 + + + True + + + 1 + 2 + + + + + True + Object name + + + GTK_EXPAND + + + + + 1 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK + end + + + + + + + + + False + end + 0 + + + + + + + Simple 3D Viewer Toolbar + False + dialog + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + both + False + + + True + Create Object + gtk-apply + + + False + True + + + + + True + Delete Object + gtk-cancel + + + False + True + + + + + True + Set Position + gtk-fullscreen + + + False + True + + + + + True + Set Scale + gtk-zoom-fit + + + False + True + + + + + True + Set Color + gtk-select-color + + + False + True + + + + + True + + + False + + + + + True + View All + gtk-home + + + False + True + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-TimeFrequencyMapDisplay.ui b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-TimeFrequencyMapDisplay.ui new file mode 100644 index 0000000..4f4bf39 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-TimeFrequencyMapDisplay.ui @@ -0,0 +1,419 @@ + + + + + + 100 + 1 + 10 + + + 100 + 1 + 10 + + + 10 + 9999999999 + 1 + 100 + + + 0.90000000000000002 + 1 + 0.01 + 0.10000000000000001 + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Time frequency display + 800 + 400 + + + True + True + GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + automatic + never + + + True + GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + never + automatic + top-right + True + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + none + + + True + GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 2 + + + + + + + + + + + + + 0 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + + + False + 0 + + + + + True + + + 1 + + + + + + + + False + 1 + + + + + + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 5 + Select Channels + mouse + dialog + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 2 + + + 320 + 240 + True + True + automatic + automatic + + + True + GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + queue + + + True + True + True + 0 + True + + + + + + + 1 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + end + + + Apply + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + False + False + 0 + + + + + Cancel + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + False + False + 1 + + + + + False + end + 0 + + + + + + TimeFrequencyMapDisplayChannelSelectApplyButton + TimeFrequencyMapDisplayChannelSelectCancelButton + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Time-Frequency Map Toolbar + False + mouse + dialog + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + both + False + + + True + Left Ruler + gtk-goto-first + + + False + True + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Bottom Ruler + gtk-goto-bottom + True + + + False + True + + + + + True + + + False + + + + + True + + + True + 1 + + + True + True + adjustment1 + + + 0 + + + + + True + Min Frequency + + + 1 + + + + + + + False + + + + + True + + + True + 1 + + + True + True + adjustment2 + + + 0 + + + + + True + Max Frequency + + + 1 + + + + + + + False + + + + + True + + + False + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + adjustment3 + 0.0099999997764825821 + 3 + True + True + + + 0 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Time Scale + + + 1 + + + + + + + False + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Select Channels + gtk-index + + + False + True + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + adjustment4 + 0.05000000074505806 + 3 + + + 0 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Attenuation + + + 1 + + + + + + + False + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-TopographicMap2D.ui b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-TopographicMap2D.ui new file mode 100644 index 0000000..f6f2c95 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-TopographicMap2D.ui @@ -0,0 +1,208 @@ + + + + + + 2 + 0.10000000000000001 + 0.5 + 10 + + + 2D Topographic Map Toolbar + False + mouse + dialog + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + both + False + + + True + Radial Projection + gtk-convert + True + + + False + True + + + + + True + Axial Projection + gtk-convert + RadialProjection + + + False + True + + + + + True + + + False + + + + + True + Map Potentials + gtk-preferences + True + + + False + True + + + + + True + Map Currents + gtk-preferences + MapPotentials + + + False + True + + + + + True + + + False + + + + + True + Toggle Electrodes + gtk-info + + + False + True + + + + + True + + + False + + + + + True + Top View + gtk-orientation-portrait + True + + + False + True + + + + + True + Left View + gtk-orientation-portrait + TopView + + + False + True + + + + + True + Right View + gtk-orientation-portrait + TopView + + + False + True + + + + + True + Back View + gtk-orientation-portrait + TopView + + + False + True + + + + + True + + + False + + + + + True + + + True + + + 100 + True + True + adjustment1 + on + on + False + 0 + + + 0 + + + + + True + Delay (s) + + + 1 + + + + + + + False + + + + + + + + + True + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-TopographicMap3D.ui b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-TopographicMap3D.ui new file mode 100644 index 0000000..87c85d6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/openvibe-simple-visualization-TopographicMap3D.ui @@ -0,0 +1,109 @@ + + + + + + 2 + 0.10000000000000001 + 0.5 + 10 + + + 3D Topographic Map Toolbar + False + mouse + dialog + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + both + False + + + True + Map Potentials + gtk-preferences + True + + + False + True + + + + + True + Map Currents + gtk-preferences + MapPotentials + + + False + True + + + + + True + + + False + + + + + True + Toggle Electrodes + gtk-info + + + False + True + + + + + True + + + False + + + + + True + + + True + + + 100 + True + True + adjustment1 + + + 0 + + + + + True + Delay (s) + + + 1 + + + + + + + False + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-identifier-card.ui b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-identifier-card.ui new file mode 100644 index 0000000..c24cc1a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-identifier-card.ui @@ -0,0 +1,153 @@ + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + P300 Identifier + dialog + + + 640 + True + both + + + True + Show Target Text + True + gtk-info + True + + + False + True + + + + + True + Show Result Text + True + gtk-info + True + + + False + True + + + + + + + + + True + + + True + 16 + 3 + 3 + 16 + 16 + + + True + <span weight="bold" size="xx-large" color="white">Target</span> + True + + + + + True + <span weight="bold" size="xx-large" color="white">Selected</span> + True + + + 2 + 3 + + + + + True + + + True + 8 + 0 + + + + + + + + 2 + 3 + 1 + 2 + + + + + True + + + 384 + 384 + True + 8 + 0 + + + + + + + + 1 + 2 + 2 + 3 + + + + + True + + + True + 8 + 0 + + + + + + + + 1 + 2 + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card.ui b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card.ui new file mode 100644 index 0000000..8ded55e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card.ui @@ -0,0 +1,319 @@ + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + P300 Speller + dialog + + + 640 + True + both + + + True + Show Target Text + gtk-info + True + + + False + True + + + + + True + Show Result Text + gtk-info + True + + + False + True + + + + + + + + + True + + + True + 16 + 3 + 4 + 16 + 16 + True + + + True + + + True + 8 + 0 + none + False + + + + + + + + 3 + 4 + 2 + 3 + + + + + True + + + True + 8 + 0 + none + False + + + + + + + + 2 + 3 + 2 + 3 + + + + + True + + + True + 8 + 0 + none + False + + + + + + + + 1 + 2 + 2 + 3 + + + + + True + + + True + 8 + 0 + none + False + + + + + + + + 2 + 3 + + + + + True + + + True + 8 + 0 + none + False + + + + + + + + 3 + 4 + 1 + 2 + + + + + True + + + True + 8 + 0 + none + False + + + + + + + + 2 + 3 + 1 + 2 + + + + + True + + + True + 8 + 0 + none + False + + + + + + + + 1 + 2 + 1 + 2 + + + + + True + + + True + 8 + 0 + none + False + + + + + + + + 1 + 2 + + + + + True + + + True + 8 + 0 + none + False + + + + + + + + 3 + 4 + + + + + True + + + True + 8 + 0 + none + False + + + + + + + + 2 + 3 + + + + + True + + + True + 8 + 0 + none + False + + + + + + + + 1 + 2 + + + + + True + + + True + 8 + 0 + none + False + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/01.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/01.png new file mode 100755 index 0000000..cf21563 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/01.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/01.png-offscreen b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/01.png-offscreen new file mode 100644 index 0000000..882f356 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/01.png-offscreen differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/02.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/02.png new file mode 100755 index 0000000..bf7176f Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/02.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/02.png-offscreen b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/02.png-offscreen new file mode 100644 index 0000000..b337d8d Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/02.png-offscreen differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/03.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/03.png new file mode 100755 index 0000000..1ff61ca Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/03.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/03.png-offscreen b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/03.png-offscreen new file mode 100644 index 0000000..cebde45 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/03.png-offscreen differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/04.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/04.png new file mode 100755 index 0000000..8530be7 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/04.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/04.png-offscreen b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/04.png-offscreen new file mode 100644 index 0000000..524c304 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/04.png-offscreen differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/05.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/05.png new file mode 100755 index 0000000..abd136b Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/05.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/05.png-offscreen b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/05.png-offscreen new file mode 100644 index 0000000..b1a2e37 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/05.png-offscreen differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/06.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/06.png new file mode 100755 index 0000000..41eff4c Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/06.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/06.png-offscreen b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/06.png-offscreen new file mode 100644 index 0000000..94b2587 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/06.png-offscreen differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/07.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/07.png new file mode 100755 index 0000000..11998c9 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/07.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/07.png-offscreen b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/07.png-offscreen new file mode 100644 index 0000000..bd5bcb6 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/07.png-offscreen differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/08.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/08.png new file mode 100755 index 0000000..139e4d4 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/08.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/08.png-offscreen b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/08.png-offscreen new file mode 100644 index 0000000..92e0107 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/08.png-offscreen differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/09.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/09.png new file mode 100755 index 0000000..39805a2 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/09.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/09.png-offscreen b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/09.png-offscreen new file mode 100644 index 0000000..34672c5 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/09.png-offscreen differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/10.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/10.png new file mode 100755 index 0000000..e9092cc Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/10.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/10.png-offscreen b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/10.png-offscreen new file mode 100644 index 0000000..28af759 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/10.png-offscreen differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/11.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/11.png new file mode 100755 index 0000000..52884a4 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/11.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/11.png-offscreen b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/11.png-offscreen new file mode 100644 index 0000000..0ab9f2f Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/11.png-offscreen differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/12.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/12.png new file mode 100755 index 0000000..0e9b674 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/12.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/12.png-offscreen b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/12.png-offscreen new file mode 100644 index 0000000..21a18e3 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/12.png-offscreen differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/convert.sh b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/convert.sh new file mode 100644 index 0000000..b0d6c8f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/convert.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +for f in *.png; do + is_dest=`echo $f | grep offscreen` + if [ "$is_dest" = "" ]; then + echo working on $f... + convert "$f" -sepia-tone 70% -modulate 25% "$f-offscreen" + fi +done + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/license.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/license.txt new file mode 100755 index 0000000..945b4a1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/license.txt @@ -0,0 +1,14 @@ + +The cute animals image set was created by zcool + +http://www.zcool.com.cn/ + +and downloaded from + +http://eps-ai.blogspot.com/ + +posted by Robertas + +License: "Creative Commons Attribution" + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/openvibe-logo.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/openvibe-logo.png new file mode 100644 index 0000000..847cd9d Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/openvibe-logo.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/openvibe-logo.png-offscreen b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/openvibe-logo.png-offscreen new file mode 100644 index 0000000..b0e774c Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-magic-card/openvibe-logo.png-offscreen differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-speller.ui b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-speller.ui new file mode 100644 index 0000000..0986028 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/p300-speller.ui @@ -0,0 +1,809 @@ + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + 3 + 4 + + + True + 6 + 6 + True + + + True + + + True + 0 + True + center + + + + + 5 + 6 + 5 + 6 + + + + + True + + + True + 9 + True + center + + + + + 4 + 5 + 5 + 6 + + + + + True + + + True + 8 + True + center + + + + + 3 + 4 + 5 + 6 + + + + + True + + + True + 7 + True + center + + + + + 2 + 3 + 5 + 6 + + + + + True + + + True + 6 + True + center + + + + + 1 + 2 + 5 + 6 + + + + + True + + + True + Z + True + center + + + + + 1 + 2 + 4 + 5 + + + + + True + + + True + X + True + center + + + + + 5 + 6 + 3 + 4 + + + + + True + + + True + W + True + center + + + + + 4 + 5 + 3 + 4 + + + + + True + + + True + T + True + center + + + + + 1 + 2 + 3 + 4 + + + + + True + + + True + R + True + center + + + + + 5 + 6 + 2 + 3 + + + + + True + + + True + Q + True + center + + + + + 4 + 5 + 2 + 3 + + + + + True + + + True + O + True + center + + + + + 2 + 3 + 2 + 3 + + + + + True + + + True + N + True + center + + + + + 1 + 2 + 2 + 3 + + + + + True + + + True + L + True + center + + + + + 5 + 6 + 1 + 2 + + + + + True + + + True + K + True + center + + + + + 4 + 5 + 1 + 2 + + + + + True + + + True + J + True + center + + + + + 3 + 4 + 1 + 2 + + + + + True + + + True + I + True + center + + + + + 2 + 3 + 1 + 2 + + + + + True + + + True + H + True + center + + + + + 1 + 2 + 1 + 2 + + + + + True + + + True + G + True + center + + + + + 1 + 2 + + + + + True + + + True + F + True + center + + + + + 5 + 6 + + + + + True + + + True + E + True + center + + + + + 4 + 5 + + + + + True + + + True + D + True + center + + + + + 3 + 4 + + + + + True + + + True + C + True + center + + + + + 2 + 3 + + + + + True + + + True + B + True + center + + + + + 1 + 2 + + + + + True + + + True + A + True + center + + + + + + + True + + + True + 5 + True + center + + + + + 5 + 6 + + + + + True + + + True + Y + True + center + + + + + 4 + 5 + + + + + True + + + True + S + True + center + + + + + 3 + 4 + + + + + True + + + True + M + True + center + + + + + 2 + 3 + + + + + True + + + True + 1 + True + center + + + + + 2 + 3 + 4 + 5 + + + + + True + + + True + 2 + True + center + + + + + 3 + 4 + 4 + 5 + + + + + True + + + True + 3 + True + center + + + + + 4 + 5 + 4 + 5 + + + + + True + + + True + 4 + True + center + + + + + 5 + 6 + 4 + 5 + + + + + True + + + True + P + True + center + + + + + 3 + 4 + 2 + 3 + + + + + True + + + True + V + True + center + + + + + 3 + 4 + 3 + 4 + + + + + True + + + True + U + True + center + + + + + 2 + 3 + 3 + 4 + + + + + + + True + 2 + 3 + 4 + 4 + + + True + 0 + True + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + + True + 0 + True + + + 2 + 3 + GTK_FILL + + + + + True + 0 + Result : + True + + + 1 + 2 + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + 0 + Target : + True + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + gtk-select-font + + + 2 + + + + + + + 2 + 3 + GTK_FILL + + + + + True + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + P300 Speller + dialog + + + 640 + True + both + + + True + Show Target Text + gtk-info + True + + + False + True + + + + + True + Show Result Text + gtk-info + True + + + False + True + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/topographicmap3D/face.mesh b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/topographicmap3D/face.mesh new file mode 100644 index 0000000..472d4fb Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/topographicmap3D/face.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/topographicmap3D/head.material b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/topographicmap3D/head.material new file mode 100644 index 0000000..da8e390 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/topographicmap3D/head.material @@ -0,0 +1,28 @@ +material ov_face +{ + technique + { + pass + { + ambient 0.878431 0.705882 0.619608 + diffuse 0.878431 0.705882 0.619608 + specular 0 0 0 10 + emissive 0 0 0 + } + } +} + + +material ov_scalp +{ + technique + { + pass + { +// ambient vertexcolour + diffuse vertexcolour +// specular 0 0 0 10 +// emissive 0 0 0 + } + } +} \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/topographicmap3D/projection_center.mesh b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/topographicmap3D/projection_center.mesh new file mode 100644 index 0000000..f37c1e2 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/topographicmap3D/projection_center.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/topographicmap3D/projection_center.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/topographicmap3D/projection_center.txt new file mode 100644 index 0000000..348e693 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/topographicmap3D/projection_center.txt @@ -0,0 +1,8 @@ +# x y z scale factors +scale [1 1 1] + +# yaw pitch roll angles, in radians +orientation [0 0 0] + +# x y z in ogre coords (center of segment T3-T4) +position [0 0.65 -0.075] \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/topographicmap3D/scalp.mesh b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/topographicmap3D/scalp.mesh new file mode 100644 index 0000000..1b7de61 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/share/topographicmap3D/scalp.mesh differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/algorithms/ovpCAlgorithmLevelMeasure.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/algorithms/ovpCAlgorithmLevelMeasure.cpp new file mode 100644 index 0000000..366f228 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/algorithms/ovpCAlgorithmLevelMeasure.cpp @@ -0,0 +1,157 @@ +#include "ovpCAlgorithmLevelMeasure.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +static void ResetScoresButtonCB(GtkToolButton* /*button*/, gpointer data) +{ + auto* levelMeasure = reinterpret_cast(data); + for (auto& i : levelMeasure->m_ProgressBar) { i.score = 0; } +} + +static void ThresholdSpinbuttonCB(GtkSpinButton* button, gpointer data) +{ + auto* levelMeasure = reinterpret_cast(data); + levelMeasure->m_Threshold = .01 * gtk_spin_button_get_value(button); +} + +static void ShowPercentagesToggleButtonCB(GtkToggleToolButton* button, gpointer data) +{ + auto* levelMeasure = reinterpret_cast(data); + levelMeasure->m_ShowPercentages = (gtk_toggle_tool_button_get_active(button) != 0); +} + +bool CAlgorithmLevelMeasure::initialize() +{ + m_ipMatrix.initialize(getInputParameter(OVP_Algorithm_LevelMeasure_InputParameterId_Matrix)); + + m_opMainWidget.initialize(getOutputParameter(OVP_Algorithm_LevelMeasure_OutputParameterId_MainWidget)); + m_opToolbarWidget.initialize(getOutputParameter(OVP_Algorithm_LevelMeasure_OutputParameterId_ToolbarWidget)); + + m_mainWidgetInterface = gtk_builder_new(); + gtk_builder_add_from_file(m_mainWidgetInterface, Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-LevelMeasure.ui", + nullptr); + + m_toolbarWidgetInterface = gtk_builder_new(); + gtk_builder_add_from_file(m_toolbarWidgetInterface, + Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-LevelMeasure.ui", nullptr); + + gtk_builder_connect_signals(m_mainWidgetInterface, nullptr); + gtk_builder_connect_signals(m_toolbarWidgetInterface, nullptr); + + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_toolbarWidgetInterface, "reset-score-button")), "clicked", G_CALLBACK(ResetScoresButtonCB), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_toolbarWidgetInterface, "show-percentages-toggle-button")), "toggled", + G_CALLBACK(ShowPercentagesToggleButtonCB), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_toolbarWidgetInterface, "threshold-spinbutton")), "value-changed", G_CALLBACK(ThresholdSpinbuttonCB), + this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_toolbarWidgetInterface, "level-measure-toolbar")), "delete_event", G_CALLBACK(gtk_widget_hide), nullptr); + + m_mainWindow = GTK_WIDGET(gtk_builder_get_object(m_mainWidgetInterface, "level-measure-table")); + m_toolbarWidget = GTK_WIDGET(gtk_builder_get_object(m_toolbarWidgetInterface, "level-measure-toolbar")); + + m_ShowPercentages = (gtk_toggle_tool_button_get_active( + GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_toolbarWidgetInterface, "show-percentages-toggle-button"))) != 0); + m_Threshold = .01 * gtk_spin_button_get_value(GTK_SPIN_BUTTON(gtk_builder_get_object(m_toolbarWidgetInterface, "threshold-spinbutton"))); + + return true; +} + +bool CAlgorithmLevelMeasure::uninitialize() +{ + g_object_unref(m_toolbarWidgetInterface); + m_toolbarWidgetInterface = nullptr; + + g_object_unref(m_mainWidgetInterface); + m_mainWidgetInterface = nullptr; + + m_opToolbarWidget.uninitialize(); + m_opMainWidget.uninitialize(); + + m_ipMatrix.uninitialize(); + + return true; +} + +bool CAlgorithmLevelMeasure::process() +{ + if (this->isInputTriggerActive(OVP_Algorithm_LevelMeasure_InputTriggerId_Reset)) + { + if (m_ipMatrix->getDimensionCount() != 1 && m_ipMatrix->getDimensionCount() != 2) + { + getLogManager() << Kernel::LogLevel_ImportantWarning << "Input matrix does not have 1 or 2 dimensions (" << m_ipMatrix->getDimensionCount() << ")\n"; + return false; + } + + const guint nRow = guint(m_ipMatrix->getDimensionCount() == 2 ? m_ipMatrix->getDimensionSize(0) : 1); + const guint nCol = guint(m_ipMatrix->getDimensionCount() == 2 ? m_ipMatrix->getDimensionSize(1) : m_ipMatrix->getDimensionSize(0)); + + GtkTable* table = GTK_TABLE(gtk_builder_get_object(m_mainWidgetInterface, "level-measure-table")); + gtk_table_resize(table, nRow, nCol); + + for (guint i = 0; i < nRow; ++i) + { + for (guint j = 0; j < nCol; ++j) + { + GtkBuilder* gtkBuilder = gtk_builder_new(); + gtk_builder_add_from_file(gtkBuilder, Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-LevelMeasure.ui", + nullptr); + + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "progress-bar-level")); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(widget)), widget); + gtk_table_attach(table, widget, j, j + 1, i, i + 1, GtkAttachOptions(GTK_EXPAND | GTK_FILL), GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0); + g_object_unref(gtkBuilder); + + progress_bar_t bar; + bar.bar = GTK_PROGRESS_BAR(widget); + bar.score = 0; + bar.lastWasOverThreshold = false; + m_ProgressBar.push_back(bar); + } + } + + m_opMainWidget = m_mainWindow; + m_opToolbarWidget = m_toolbarWidget; + } + + if (this->isInputTriggerActive(OVP_Algorithm_LevelMeasure_InputTriggerId_Refresh)) + { + auto it = m_ProgressBar.begin(); + double* iBuffer = m_ipMatrix->getBuffer(); + + size_t n = m_ipMatrix->getBufferElementCount(); + while (n--) + { + double percent = *iBuffer; + if (percent > 1) { percent = 1; } + if (percent < 0) { percent = 0; } + + if (percent > m_Threshold && !it->lastWasOverThreshold) + { + it->score++; + it->lastWasOverThreshold = true; + } + if (percent <= m_Threshold) { it->lastWasOverThreshold = false; } + + std::stringstream ss; + ss << std::fixed << std::setprecision(2) << "score : " << it->score << "\n"; + + if (m_ShowPercentages) { ss << "level : " << percent * 100 << "%\n"; } + + gtk_progress_bar_set_fraction(it->bar, percent); + gtk_progress_bar_set_text(it->bar, ss.str().c_str()); + + iBuffer++; + ++it; + } + + this->activateOutputTrigger(OVP_Algorithm_LevelMeasure_OutputTriggerId_Refreshed, true); + } + + return true; +} +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/algorithms/ovpCAlgorithmLevelMeasure.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/algorithms/ovpCAlgorithmLevelMeasure.h new file mode 100644 index 0000000..e3714b3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/algorithms/ovpCAlgorithmLevelMeasure.h @@ -0,0 +1,85 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +class CAlgorithmLevelMeasure final : public Toolkit::TAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_LevelMeasure) + +protected: + + Kernel::TParameterHandler m_ipMatrix; + Kernel::TParameterHandler m_opMainWidget; + Kernel::TParameterHandler m_opToolbarWidget; + + GtkBuilder* m_mainWidgetInterface = nullptr; + GtkBuilder* m_toolbarWidgetInterface = nullptr; + GtkWidget* m_mainWindow = nullptr; + GtkWidget* m_toolbarWidget = nullptr; + +public: + + using progress_bar_t = struct + { + GtkProgressBar* bar; + size_t score; + bool lastWasOverThreshold; + }; + + std::vector m_ProgressBar; + bool m_ShowPercentages = false; + double m_Threshold = 0.1; +}; + +class CAlgorithmLevelMeasureDesc final : public IAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Level measure"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Displays sample chunk of each channel as a row of progress bars"); } + CString getDetailedDescription() const override { return CString("Another way to look at it: Each displayed row is a histogram normalized to sum to 1"); } + CString getCategory() const override { return CString("Simple visualization"); } + CString getVersion() const override { return CString("1.0"); } + virtual CString getStockItemName() const { return CString("gtk-go-up"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_LevelMeasure; } + IPluginObject* create() override { return new CAlgorithmLevelMeasure; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_LevelMeasure_InputParameterId_Matrix, "Matrix", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_LevelMeasure_OutputParameterId_MainWidget, "Main widget", Kernel::ParameterType_Pointer); + prototype.addOutputParameter(OVP_Algorithm_LevelMeasure_OutputParameterId_ToolbarWidget, "Toolbar widget", Kernel::ParameterType_Pointer); + prototype.addInputTrigger(OVP_Algorithm_LevelMeasure_InputTriggerId_Reset, "Reset"); + prototype.addInputTrigger(OVP_Algorithm_LevelMeasure_InputTriggerId_Refresh, "Refresh"); + prototype.addOutputTrigger(OVP_Algorithm_LevelMeasure_OutputTriggerId_Refreshed, "Refreshed"); + + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_LevelMeasureDesc) +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmErpPlot.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmErpPlot.cpp new file mode 100644 index 0000000..5eb861c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmErpPlot.cpp @@ -0,0 +1,643 @@ +#include "ovpCBoxAlgorithmErpPlot.h" +#include +#include "../utils.h" + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +static void EventHandler(GtkWidget* widget, const gint width, const gint height, gpointer data) +{ + auto* graphs = reinterpret_cast*>(data); + for (auto it = graphs->begin(); it != graphs->end(); ++it) + { + (*it)->resizeAxis(width, height, graphs->size()); + (*it)->draw(widget); + } +} + +static void OnConfigureEvent(GtkWidget* widget, GdkEventConfigure* event, gpointer data) +{ + //std::cout << "OnConfigureEvent"<width<<" "<< event->height<<"on widget "<allocation.width<<" "<allocation.height << "\n"; + gtk_widget_queue_draw_area(widget, 0, 0, event->width, event->height); + EventHandler(widget, event->width, event->height, data); +} + +/* +static gboolean on_resize_event(GtkWidget *widget, GdkRectangle * event, gpointer data) +{ + //std::cout << "on_resize_event" << "\n"; + EventHandler(widget, event->width, event->height, data); + return TRUE; +} +//*/ + +static gboolean OnExposeEvent(GtkWidget* widget, GdkEventExpose* event, gpointer data) +{ + //std::cout << "OnExposeEvent" <area.width<<" "<< event->area.height<<"on widget "<allocation.width<<" "<allocation.height<< "\n"; + //gtk_widget_queue_draw_area(widget,0, 0,event->area.width, event->area.height ); + EventHandler(widget, event->area.width, event->area.height, data); + + return FALSE; +} + +static void RenderText(cairo_t* cr, const char* text, const double x, const double y) +{ + cairo_identity_matrix(cr); + cairo_translate(cr, x, y); // set the origin of cairo instance 'cr' to (10,20) (i.e. this is where drawing will start from). + PangoLayout* layout = pango_cairo_create_layout(cr); // init pango layout ready for use + pango_layout_set_text(layout, text, -1); // sets the text to be associated with the layout (final arg is length, -1 to calculate automatically when passing a nul-terminated string) + PangoFontDescription* desc = pango_font_description_from_string("Sans Bold 10"); // specify the font that would be ideal for your particular use + pango_layout_set_font_description(layout, desc); // assign the previous font description to the layout + pango_font_description_free(desc); // free the description + + pango_cairo_update_layout(cr, layout); // if the target surface or transformation properties of the cairo instance have changed, update the pango layout to reflect this + pango_cairo_show_layout(cr, layout); // draw the pango layout onto the cairo surface // mandatory + + g_object_unref(layout); // free the layout +} + +void Graph::resizeAxis(const gint width, const gint height, const size_t nrOfGraphs) +{ + size_t nrOfRows = size_t(ceil(sqrt(double(nrOfGraphs)))); + const size_t nrOfColumns = nrOfRows; + if (nrOfGraphs <= (nrOfRows - 1) * nrOfRows) { nrOfRows--; } + + this->m_GraphWidth = double(width) / double(nrOfColumns); + this->m_GraphHeight = double(height) / double(nrOfRows); + this->m_GraphOriginX = this->m_GraphWidth * double(this->m_ColIdx); + this->m_GraphOriginY = this->m_GraphHeight * double(this->m_RowIdx); + + //std::cout << "resizeAxis: origin x: " << m_GraphOriginX << ", origin y: " << m_GraphOriginY << ", width: " << m_GraphWidth << ", height: " << m_GraphHeight << "\n"; +} + +void Graph::draw(GtkWidget* widget)//cairo_t * cairoContext) +{ + cairo_t* cairoContext = gdk_cairo_create(widget->window); + + cairo_set_line_width(cairoContext, 1); + cairo_translate(cairoContext, m_GraphOriginX + 20, m_GraphOriginY + 20); + cairo_scale(cairoContext, m_GraphWidth - 40, m_GraphHeight - 40); + + cairo_save(cairoContext); + drawAxis(cairoContext); + cairo_restore(cairoContext); + + cairo_save(cairoContext); + drawLegend(cairoContext); + cairo_restore(cairoContext); + + cairo_save(cairoContext); + drawVar(cairoContext); + cairo_restore(cairoContext); + + cairo_save(cairoContext); + drawCurves(cairoContext); + cairo_restore(cairoContext); + + cairo_save(cairoContext); + drawAxisLabels(cairoContext); + cairo_restore(cairoContext); + + cairo_destroy(cairoContext); +} + +void Graph::drawAxis(cairo_t* ctx) +{ + //make background white by drawing white rectangle + cairo_set_source_rgb(ctx, 1.0, 1.0, 1.0); + cairo_rectangle(ctx, 0, 0, 1, 1); + cairo_fill(ctx); + + double ux = 1, uy = 1; + cairo_device_to_user_distance(ctx, &ux, &uy); + if (ux < uy) { ux = uy; } + cairo_set_line_width(ctx, ux); + + cairo_set_source_rgb(ctx, 0, 0, 0); + + //cairo_save(cairoContext); + //draw the horizontal line at zero if its inside the plotting region + const double zeroLevel = adjustValueToScale(0); + double xo = 0, yo = zeroLevel, + xe = 1.0, ye = zeroLevel; + if (std::fabs(zeroLevel) <= 1) { drawLine(ctx, &xo, &yo, &xe, &ye); } + + // Draw y axis + double dXo = 0, dYo = 0, dXe = 0, dYe = 1.0; + drawLine(ctx, &dXo, &dYo, &dXe, &dYe); +} + +void Graph::drawLine(cairo_t* ctx, double* xo, double* yo, double* xe, double* ye) const +{ + cairo_save(ctx); + + snapCoords(ctx, xo, yo); + snapCoords(ctx, xe, ye); + + cairo_identity_matrix(ctx); + cairo_set_line_width(ctx, 1.0); + cairo_move_to(ctx, *xo, *yo); + cairo_line_to(ctx, *xe, *ye); + cairo_stroke(ctx); + cairo_restore(ctx); +} + +void Graph::snapCoords(cairo_t* ctx, double* x, double* y) const +{ + cairo_user_to_device(ctx, x, y); + *x = ceil(*x) + 0.5; + *y = ceil(*y) + 0.5; +} + +void Graph::drawAxisLabels(cairo_t* ctx) +{ + cairo_set_source_rgb(ctx, 0, 0, 0); + + // If we haven't received any data yet, bail out + if (!(m_Minimum < FLT_MAX && m_Maximum > -FLT_MAX)) + { + cairo_move_to(ctx, 0, 1); + + double cx, cy; + cairo_get_current_point(ctx, &cx, &cy); + cairo_user_to_device(ctx, &cx, &cy); + + cairo_save(ctx); + RenderText(ctx, "No data", cx, cy); + cairo_restore(ctx); + return; + } + + // Note the scaling here should be compatible with adjustValueToScale. + const double graphMin = m_Minimum - m_Variance[m_ArgMinimum.first][m_ArgMinimum.second], + graphMax = m_Maximum + m_Variance[m_ArgMaximum.first][m_ArgMaximum.second]; + + + // Including headroom may not be necessary as we are using adjustValueToScale to query where the Cairo drawing locations are, it'll take it into account + // GraphMin = GraphMin-0.10f*std::fabs(GraphMin); + // GraphMax = GraphMax+0.10f*std::fabs(GraphMax); + + const size_t numSteps = 10; + const double dataRange = graphMax - graphMin, + stepSize = dataRange / numSteps; + + // Find a starting point in y so that stepping will pass through 0 + const double startY = floor(graphMin / stepSize) * stepSize; + + for (size_t i = 0; i <= numSteps; ++i) + { + const double valueAtTick = startY + i * stepSize, + y = adjustValueToScale(valueAtTick); + + cairo_move_to(ctx, 0, y); + + double cx, cy; + cairo_get_current_point(ctx, &cx, &cy); + //std::cout<<"current point "<m_StartTime, xEnd = this->m_EndTime; + + + for (double x = 0; x <= 1; x += 0.2) + { + cairo_move_to(ctx, x, 1); + + double cx, cy; + cairo_get_current_point(ctx, &cx, &cy); + //std::cout<<"current point "<& curve = m_Curves[gi]; + + //center + double y = adjustValueToScale(curve[0]), + x = 0.0; + cairo_move_to(ctx, x, y); + + for (int si = 1; si < m_CurveSize; ++si) + { + y = adjustValueToScale(curve[si]); + x = (double(si)) / (double(m_CurveSize)); + cairo_line_to(ctx, x, y); + } + + cairo_save(ctx); + cairo_identity_matrix(ctx); + cairo_set_line_width(ctx, 1.0); + cairo_stroke(ctx); + cairo_restore(ctx); + } +} + +void Graph::drawVar(cairo_t* ctx) +{ + double ux = 1, uy = 1; + cairo_device_to_user_distance(ctx, &ux, &uy); + if (ux < uy) { ux = uy; } + cairo_set_line_width(ctx, ux); + + for (size_t gi = 0; gi < m_Curves.size(); ++gi) + { + cairo_set_source_rgba(ctx, double(m_LineColor[gi].red) / 65535.0, double(m_LineColor[gi].green) / 65535.0, double(m_LineColor[gi].blue) / 65535.0, 0.5); + const std::vector& curves = m_Curves[gi]; + const std::vector& variances = m_Variance[gi]; + // Test first if we have any variance at all, if not, don't bother drawing as cairo slows down with tiny apertures + if (std::none_of(variances.begin(), variances.end(), [](const double a) { return a > 0; })) { continue; } + + double var = variances[0]; + + double y = adjustValueToScale(curves[0] - var); + double x = 0.0; + cairo_move_to(ctx, x, y); + + // Draw variance below the data points + for (int si = 1; si < m_CurveSize; ++si) + { + var = variances[si]; + + y = adjustValueToScale(curves[si] - var); + x = (double(si)) / (double(m_CurveSize)); + cairo_line_to(ctx, x, y); + } + + // Draw the last point separately + cairo_line_to(ctx, x, y + 2 * var); + + // Draw variance above the points, including the first point + for (int si = m_CurveSize - 1; si >= 0; si--) + { + var = variances[si]; + y = adjustValueToScale(curves[si] + var); + x = (double(si)) / (double(m_CurveSize)); + cairo_line_to(ctx, x, y); + } + + // Fill the surrounded region? + cairo_fill(ctx); + } +} + +void Graph::drawLegend(cairo_t* ctx) const +{ + double ux = 1, uy = 1; + cairo_device_to_user_distance(ctx, &ux, &uy); + cairo_select_font_face(ctx, "Sans Bold 10", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); + + cairo_set_font_size(ctx, 0.04); + + double yTotal = 0; + for (size_t gi = 0; gi < m_Curves.size(); ++gi) + { + cairo_set_source_rgb(ctx, double(m_LineColor[gi].red) / 65535.0, double(m_LineColor[gi].green) / 65535.0, + double(m_LineColor[gi].blue) / 65535.0); + + cairo_text_extents_t extents; + cairo_text_extents(ctx, m_LineText[gi].toASCIIString(), &extents); + + yTotal += extents.height + 0.02; + + // size_t len = m_LineText[gi].length(); + cairo_move_to(ctx, (1.0 - extents.width - 0.01), yTotal); + + double cx, cy; + cairo_get_current_point(ctx, &cx, &cy); + //std::cout<<"current point "<m_Maximum ? m_lCurves[j][i]:m_Maximum; + if (m_Curves[j][i] > m_Maximum) + { + m_Maximum = m_Curves[j][i]; + m_ArgMaximum.first = j; + m_ArgMaximum.second = i; + } + //m_Minimum = m_lCurves[j][i]getStaticBoxContext(); + m_figureFileName = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_triggerToSave = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_xStartsAt0 = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + + const size_t inputParamsStartAt = 3; + + m_graphList = new std::list; + + //should be a Graph per channel/electrode not per input (should be done when first header is received) + for (size_t i = 1; i < boxContext.getInputCount(); ++i) + { + if ((i % 2) == 1) + { + const size_t c = i / 2; + m_legendColors.push_back(CGdkcolorAutoCast(boxContext, this->getConfigurationManager(), inputParamsStartAt + 2 * c + 0)); + m_legend.push_back(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), inputParamsStartAt + 2 * c + 1)); + m_decoders.push_back(new Toolkit::TStreamedMatrixDecoder(*this, i)); + } + else { m_varianceDecoders.push_back(new Toolkit::TStreamedMatrixDecoder(*this, i)); } + } + + m_stimulationDecoder = new Toolkit::TStimulationDecoder(*this, 0); + + //* + //initialize graphic component + GtkBuilder* widget = gtk_builder_new(); // glade_xml_new(m_interfaceFilename.toASCIIString(), "p300-speller-toolbar", nullptr); + GError* error = nullptr; + this->getLogManager() << Kernel::LogLevel_Trace << "Path to erp.ui " << Directories::getDataDir() + CString("/plugins/simple-visualization/erp-plot.ui\n"); + gtk_builder_add_from_file(widget, Directories::getDataDir() + "/plugins/simple-visualization/erp-plot.ui", &error); + + m_drawWindow = GTK_WIDGET(gtk_builder_get_object(widget, "plot-window")); + + m_visualizationCtx = dynamic_cast(this->createPluginObject( + OVP_ClassId_Plugin_VisualizationCtx)); + m_visualizationCtx->setWidget(*this, m_drawWindow); + + g_signal_connect(m_drawWindow, "expose-event", G_CALLBACK (OnExposeEvent), m_graphList); + g_signal_connect(m_drawWindow, "configure-event", G_CALLBACK (OnConfigureEvent), m_graphList); + + + gtk_widget_show_all(m_drawWindow); + + //*/ + m_firstHeaderReceived = false; + + + return true; +} + +bool CBoxAlgorithmErpPlot::uninitialize() +{ + for (size_t i = 0; i < m_decoders.size(); ++i) + { + m_decoders[i]->uninitialize(); + m_varianceDecoders[i]->uninitialize(); + } + + m_stimulationDecoder->uninitialize(); + + if (m_drawWindow) + { + gtk_widget_destroy(m_drawWindow); + m_drawWindow = nullptr; + } + + while (!m_graphList->empty()) { delete m_graphList->front(), m_graphList->pop_front(); } + + if (m_visualizationCtx) + { + this->releasePluginObject(m_visualizationCtx); + m_visualizationCtx = nullptr; + } + + return true; +} + +bool CBoxAlgorithmErpPlot::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} + +//saving the graph in png images +bool CBoxAlgorithmErpPlot::save() +{ + cairo_t* cairoContext = gdk_cairo_create(m_drawWindow->window); + + //the main surface + cairo_surface_t* surface = cairo_get_target(cairoContext); + + //building filename + const std::string extension = ".png"; + + + for (auto it = m_graphList->begin(); it != m_graphList->end(); ++it) + { + //cutting this graph + cairo_surface_t* subsurface = cairo_surface_create_for_rectangle(surface, (*it)->m_GraphOriginX, (*it)->m_GraphOriginY, (*it)->m_GraphWidth, + (*it)->m_GraphHeight); + + std::stringstream filename; + //creating filename + filename << m_figureFileName << ((*it)->m_RowIdx) << "_" << ((*it)->m_ColIdx) << extension; + this->getLogManager() << Kernel::LogLevel_Info << "Saving [" << filename.str() << "] \n"; + cairo_surface_write_to_png(subsurface, filename.str().c_str()); + } + + return true; +} + +bool CBoxAlgorithmErpPlot::process() +{ + Kernel::IBoxIO& dynamicBoxContext = this->getDynamicBoxContext(); + const Kernel::IBox& staticBoxContext = this->getStaticBoxContext(); + + //listen for stimulation input + for (size_t i = 0; i < dynamicBoxContext.getInputChunkCount(0); ++i) + { + m_stimulationDecoder->decode(i); + if (m_stimulationDecoder->isBufferReceived()) + { + IStimulationSet* stimSet = m_stimulationDecoder->getOutputStimulationSet(); + for (size_t j = 0; j < stimSet->getStimulationCount(); ++j) + { + if (stimSet->getStimulationIdentifier(j) == m_triggerToSave) + { + this->getLogManager() << Kernel::LogLevel_Trace << "Saving\n"; + save(); + } + } + } + } + + bool dataChanged = false; + + for (size_t inputi = 1; inputi < staticBoxContext.getInputCount(); ++inputi) + { + for (size_t i = 0; i < dynamicBoxContext.getInputChunkCount(inputi); ++i) + { + if ((inputi) % 2 == 1) + { + m_decoders[inputi / 2]->decode(i); + + if (m_decoders[inputi / 2]->isHeaderReceived() && !m_firstHeaderReceived) + { + const size_t nElectrodes = m_decoders[inputi / 2]->getOutputMatrix()->getDimensionSize(0); + const auto nCols = size_t(ceil(sqrt(double(nElectrodes)))); + + //create list of graph subplots + for (size_t dimi = 0; dimi < nElectrodes; ++dimi) + { + auto* graph = new Graph(m_legendColors, m_legend, size_t(floor(float(dimi) / nCols)), + size_t(dimi % nCols), m_decoders[inputi / 2]->getOutputMatrix()->getDimensionSize(1)); + m_graphList->push_back(graph); + } + + //draw the empty graphs + for (auto it = m_graphList->begin(); it != m_graphList->end(); ++it) + { + (*it)->m_StartTime = 0; + (*it)->m_EndTime = 1; + //(*it)->m_pVariance = nullptr; + + cairo_t* cairoContext = gdk_cairo_create(m_drawWindow->window); + (*it)->resizeAxis(400, 400, m_graphList->size());//default init size + (*it)->drawAxis(cairoContext); + cairo_destroy(cairoContext); + + cairo_t* cairoContext2 = gdk_cairo_create(m_drawWindow->window); + (*it)->drawAxisLabels(cairoContext2); + cairo_destroy(cairoContext2); + } + m_firstHeaderReceived = true; + + dataChanged = true; + } + if (m_decoders[inputi / 2]->isBufferReceived()) + { + const uint64_t startTime = dynamicBoxContext.getInputChunkStartTime(inputi, i), + endTime = dynamicBoxContext.getInputChunkEndTime(inputi, i); + + //redraw all + //gtk_widget_queue_draw(m_drawWindow); + + CMatrix* matrix = m_decoders[inputi / 2]->getOutputMatrix(); + const size_t nElectrodes = matrix->getDimensionSize(0), + nSamples = matrix->getDimensionSize(1); + + auto it = m_graphList->begin(); + for (size_t dimi = 0; dimi < nElectrodes; dimi++, ++it) + { + const double* ptr = matrix->getBuffer() + dimi * nSamples; + (*it)->updateCurves(ptr, nSamples, inputi / 2); + //std::cout << "update curve " << inputi/2 << " beginning value " << destinationMatrix[0] << ", second value " << destinationMatrix[42] << "\n"; + + (*it)->m_StartTime = (m_xStartsAt0 ? 0 : startTime); + (*it)->m_EndTime = (m_xStartsAt0 ? (endTime - startTime) : endTime); + + //(*graphIterator)->draw(m_drawWindow); + } + + dataChanged = true; + + dynamicBoxContext.markInputAsDeprecated(inputi, i); + } + //if(m_decoders[inputi/2]->isEndReceived()) { } + } + else + { + //std::cout<<" variance input"<<(inputi/2-1)<<"\n"; + m_varianceDecoders[inputi / 2 - 1]->decode(i); + + + if (m_varianceDecoders[inputi / 2 - 1]->isBufferReceived()) + { + CMatrix* matrix = m_varianceDecoders[inputi / 2 - 1]->getOutputMatrix(); + + const size_t nSamples = matrix->getDimensionSize(1), + nElectrodes = matrix->getDimensionSize(0); + + auto it = m_graphList->begin(); + for (size_t dimi = 0; dimi < nElectrodes; dimi++, ++it) + { + const double* ptr = matrix->getBuffer() + dimi * nSamples; + (*it)->m_Variance[inputi / 2 - 1].assign(ptr, ptr + nSamples); + } + + dataChanged = true; + dynamicBoxContext.markInputAsDeprecated(inputi, i); + } + } + } + } + + + //redraw all? + if (dataChanged) + { + gtk_widget_queue_draw(m_drawWindow); + for (auto* it : *m_graphList) { it->draw(m_drawWindow); } + } + + return true; +} + +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmErpPlot.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmErpPlot.h new file mode 100644 index 0000000..f924e65 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmErpPlot.h @@ -0,0 +1,212 @@ +#pragma once + +//You may have to change this path to match your folder organisation +#include "../ovp_defines.h" + +#include +#include +#include + +#include + +#include + +#include + +#include + +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +class Graph +{ +public: + //should be a list of colors; + Graph(std::vector& lineColor, std::vector& lineText, const int rowIndex, const int colIndex, const int curveSize) + : m_LineColor(lineColor), m_LineText(lineText) + { + m_Curves.resize(lineColor.size()); + m_Variance.resize(lineColor.size()); + for (size_t i = 0; i < m_Curves.size(); ++i) + { + m_Curves[i].resize(curveSize, 0); + m_Variance[i].resize(curveSize, 0); + } + this->m_RowIdx = rowIndex; + this->m_ColIdx = colIndex; + this->m_CurveSize = curveSize; + m_PointCounter = new int[lineColor.size()]; + m_Maximum = -FLT_MAX; + m_Minimum = FLT_MAX; + for (size_t i = 0; i < lineColor.size(); ++i) { m_PointCounter[i] = 0; } + } + + ~Graph() + { + delete [] m_PointCounter; + m_Curves.clear(); + m_Variance.clear(); + } + + void resizeAxis(gint width, gint height, size_t nrOfGraphs); + void draw(GtkWidget* widget); + void drawAxis(cairo_t* ctx); + void drawLine(cairo_t* ctx, double* xo, double* yo, double* xe, double* ye) const; + void drawAxisLabels(cairo_t* ctx); + void drawCurves(cairo_t* ctx); + void drawLegend(cairo_t* ctx) const; + void drawVar(cairo_t* ctx); + void updateCurves(const double* curve, size_t howMany, size_t curveIndex); + void snapCoords(cairo_t* ctx, double* x, double* y) const; + double adjustValueToScale(double value); + + std::vector> m_Curves; //private + std::vector> m_Variance; + + std::vector& m_LineColor; //private + std::vector& m_LineText; //private + double m_Maximum = 1; + double m_Minimum = -1; + std::pair m_ArgMaximum; + std::pair m_ArgMinimum; + double m_GraphWidth = 0; + double m_GraphHeight = 0; + double m_GraphOriginX = 0; + double m_GraphOriginY = 0; + int m_RowIdx = 0; //private + int m_ColIdx = 0; //private + int m_CurveSize = 0; //private + int* m_PointCounter = nullptr; + uint64_t m_StartTime = 0; + uint64_t m_EndTime = 0; + double m_FontSize = 1.0; +}; + +/** + * \class CBoxAlgorithmErpPlot + * \author Dieter Devlaminck (INRIA) + * \date Fri Nov 16 10:50:43 2012 + * \brief The class CBoxAlgorithmErpPlot describes the box ERP plot. + * + */ +class CBoxAlgorithmErpPlot final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + bool save(); + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_ErpPlot) + +protected: + CString m_figureFileName; + std::vector m_legendColors; + std::vector m_legend; + GtkWidget* m_drawWindow = nullptr; + std::list* m_graphList = nullptr; + bool m_firstHeaderReceived = false; + std::vector*> m_decoders; + std::vector*> m_varianceDecoders; + Toolkit::TStimulationDecoder* m_stimulationDecoder = nullptr; + uint64_t m_triggerToSave = 0; + bool m_xStartsAt0 = false; + +private: + VisualizationToolkit::IVisualizationContext* m_visualizationCtx = nullptr; +}; + +// The box listener can be used to call specific callbacks whenever the box structure changes : input added, name changed, etc. +// Please uncomment below the callbacks you want to use. +class CBoxAlgorithmErpPlotListener final : public Toolkit::TBoxListener +{ +public: + + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + box.setInputType(index, OV_TypeId_StreamedMatrix); + const size_t c = index / 2 + 1; + const std::string idx = std::to_string(c), iLabel = "ERP ", + colorLabel = "Line color ", textLabel = "Line label ", varianceLabel = "Variance "; + + box.setInputName(index, (iLabel + idx).c_str()); + box.addSetting((colorLabel + idx).c_str(),OV_TypeId_Color, "0,0,0"); + box.addSetting((textLabel + idx).c_str(),OV_TypeId_String, "curve"); + //add the corresponding variance input + box.addInput((varianceLabel + idx).c_str(), OV_TypeId_StreamedMatrix); + + return true; + } + + bool onInputRemoved(Kernel::IBox& box, const size_t index) override + { + box.removeSetting(index * 2 + 2); + box.removeSetting(index * 2 + 1); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + + +/** + * \class CBoxAlgorithmErpPlotDesc + * \author Dieter Devlaminck (INRIA) + * \date Fri Nov 16 10:50:43 2012 + * \brief Descriptor of the box ERP plot. + * + */ +class CBoxAlgorithmErpPlotDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("ERP plot"); } + CString getAuthorName() const override { return CString("Dieter Devlaminck"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Plots event-related potentials"); } + CString getDetailedDescription() const override { return CString("plots target ERP versus non-target ERP"); } + CString getCategory() const override { return CString("Visualization/Presentation"); } + CString getVersion() const override { return CString("1.1"); } + CString getStockItemName() const override { return CString(""); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ErpPlot; } + IPluginObject* create() override { return new CBoxAlgorithmErpPlot; } + + bool hasFunctionality(const EPluginFunctionality functionality) const override { return functionality == EPluginFunctionality::Visualization; } + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmErpPlotListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Trigger",OV_TypeId_Stimulations); + prototype.addInput("ERP1",OV_TypeId_StreamedMatrix); + prototype.addInput("Variance1",OV_TypeId_StreamedMatrix); + + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + + prototype.addSetting("Filename final figure",OV_TypeId_Filename, ""); + prototype.addSetting("Trigger to save figure",OV_TypeId_Stimulation, "OVTK_StimulationId_ExperimentStop"); + prototype.addSetting("X starts at 0",OV_TypeId_Boolean, "true"); + prototype.addSetting("Line color 1",OV_TypeId_Color, "0,0,0"); + prototype.addSetting("Line label 1",OV_TypeId_String, "curve 1"); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ErpPlotDesc) +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmLevelMeasure.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmLevelMeasure.cpp new file mode 100755 index 0000000..79f5879 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmLevelMeasure.cpp @@ -0,0 +1,122 @@ +#include "ovpCBoxAlgorithmLevelMeasure.h" + +#include "../algorithms/ovpCAlgorithmLevelMeasure.h" + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +bool CBoxAlgorithmLevelMeasure::initialize() +{ + m_matrix = new CMatrix(); + + m_matrixDecoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixDecoder)); + m_levelMeasure = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_LevelMeasure)); + + m_matrixDecoder->initialize(); + m_levelMeasure->initialize(); + + m_matrixBuffer.initialize(m_matrixDecoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_InputParameterId_MemoryBufferToDecode)); + m_matrixHandler.initialize(m_matrixDecoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + + m_levelMeasureMatrix.initialize(m_levelMeasure->getInputParameter(OVP_Algorithm_LevelMeasure_InputParameterId_Matrix)); + m_levelMeasureMainWidget.initialize(m_levelMeasure->getOutputParameter(OVP_Algorithm_LevelMeasure_OutputParameterId_MainWidget)); + m_levelMeasureToolbarWidget.initialize(m_levelMeasure->getOutputParameter(OVP_Algorithm_LevelMeasure_OutputParameterId_ToolbarWidget)); + + m_matrixHandler.setReferenceTarget(m_matrix); + m_levelMeasureMatrix.setReferenceTarget(m_matrix); + + return true; +} + +bool CBoxAlgorithmLevelMeasure::uninitialize() +{ + m_levelMeasureToolbarWidget.uninitialize(); + m_levelMeasureMainWidget.uninitialize(); + m_levelMeasureMatrix.uninitialize(); + + m_matrixHandler.uninitialize(); + m_matrixBuffer.uninitialize(); + + m_levelMeasure->uninitialize(); + m_matrixDecoder->uninitialize(); + + getAlgorithmManager().releaseAlgorithm(*m_levelMeasure); + getAlgorithmManager().releaseAlgorithm(*m_matrixDecoder); + + delete m_matrix; + m_matrix = nullptr; + + if (m_visualizationCtx) + { + this->releasePluginObject(m_visualizationCtx); + m_visualizationCtx = nullptr; + } + + return true; +} + +bool CBoxAlgorithmLevelMeasure::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmLevelMeasure::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_matrixBuffer = boxContext.getInputChunk(0, i); + m_matrixDecoder->process(); + if (m_matrixDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedHeader)) + { + m_levelMeasure->process(OVP_Algorithm_LevelMeasure_InputTriggerId_Reset); + m_visualizationCtx = dynamic_cast(this->createPluginObject( + OVP_ClassId_Plugin_VisualizationCtx)); + m_visualizationCtx->setWidget(*this, m_levelMeasureMainWidget); + m_visualizationCtx->setToolbar(*this, m_levelMeasureToolbarWidget); + } + + if (m_matrixDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedBuffer)) + { + // ----- >8 ------------------------------------------------------------------------------------------------------------------------------------------------------ + // should be done in a processing box ! + + double sum = 0; + + { + double* buffer = m_matrix->getBuffer(); + size_t n = m_matrix->getBufferElementCount(); + while (n--) + { + sum += *buffer; + buffer++; + } + } + + { + const double factor = (sum != 0 ? 1. / sum : 0.5); + double* buffer = m_matrix->getBuffer(); + size_t n = m_matrix->getBufferElementCount(); + while (n--) + { + *buffer *= factor; + buffer++; + } + } + + // ----- >8 ------------------------------------------------------------------------------------------------------------------------------------------------------ + + m_levelMeasure->process(OVP_Algorithm_LevelMeasure_InputTriggerId_Refresh); + } + if (m_matrixDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedEnd)) { } + boxContext.markInputAsDeprecated(0, i); + } + + return true; +} +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmLevelMeasure.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmLevelMeasure.h new file mode 100644 index 0000000..f2079e7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmLevelMeasure.h @@ -0,0 +1,72 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +class CBoxAlgorithmLevelMeasure final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_LevelMeasure) + +protected: + + Kernel::IAlgorithmProxy* m_matrixDecoder = nullptr; + Kernel::IAlgorithmProxy* m_levelMeasure = nullptr; + + Kernel::TParameterHandler m_matrixBuffer; + Kernel::TParameterHandler m_matrixHandler; + + Kernel::TParameterHandler m_levelMeasureMatrix; + Kernel::TParameterHandler m_levelMeasureMainWidget; + Kernel::TParameterHandler m_levelMeasureToolbarWidget; + + CMatrix* m_matrix = nullptr; + +private: + VisualizationToolkit::IVisualizationContext* m_visualizationCtx = nullptr; +}; + +class CBoxAlgorithmLevelMeasureDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Level measure"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Visualization/Basic"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-go-up"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_LevelMeasure; } + IPluginObject* create() override { return new CBoxAlgorithmLevelMeasure; } + + bool hasFunctionality(const EPluginFunctionality functionality) const override { return functionality == EPluginFunctionality::Visualization; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input matrix to display", OV_TypeId_StreamedMatrix); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_LevelMeasureDesc) +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300IdentifierCardVisualization.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300IdentifierCardVisualization.cpp new file mode 100755 index 0000000..196138f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300IdentifierCardVisualization.cpp @@ -0,0 +1,485 @@ +#include "ovpCBoxAlgorithmP300IdentifierCardVisualization.h" +#include "../utils.h" +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +bool CBoxAlgorithmP300IdentifierCardVisualization::initialize() +{ + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + + m_mainWidgetInterface = nullptr; + + //get value of settings given in the configuration box + m_interfaceFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_bgColor = CGdkcolorAutoCast(getStaticBoxContext(), getConfigurationManager(), 1); + m_targetBgColor = CGdkcolorAutoCast(getStaticBoxContext(), getConfigurationManager(), 2); + m_selectedBgColor = CGdkcolorAutoCast(getStaticBoxContext(), getConfigurationManager(), 3); + m_cardStimulationBase = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + + // ---------------------------------------------------------------------------------------------------------------------------------------------------------- + + m_sequenceStimulationDecoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_sequenceStimulationDecoder->initialize(); + + m_targetStimulationDecoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_targetStimulationDecoder->initialize(); + + m_targetFlaggingStimulationEncoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationEncoder)); + m_targetFlaggingStimulationEncoder->initialize(); + + m_cardSelectionStimulationDecoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_cardSelectionStimulationDecoder->initialize(); + + m_sequenceMemoryBuffer.initialize( + m_sequenceStimulationDecoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + m_sequenceStimulationSet.initialize( + m_sequenceStimulationDecoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + + m_targetMemoryBuffer.initialize( + m_targetStimulationDecoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + m_targetStimulationSet.initialize( + m_targetStimulationDecoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + + m_targetFlaggingStimulationSet.initialize( + m_targetFlaggingStimulationEncoder->getInputParameter(OVP_GD_Algorithm_StimulationEncoder_InputParameterId_StimulationSet)); + m_targetFlaggingMemoryBuffer.initialize( + m_targetFlaggingStimulationEncoder->getOutputParameter(OVP_GD_Algorithm_StimulationEncoder_OutputParameterId_EncodedMemoryBuffer)); + + m_lastTime = 0; + m_mainWidgetInterface = gtk_builder_new(); // glade_xml_new(m_interfaceFilename.toASCIIString(), "p300-Identifier-card-main", nullptr); + if (!gtk_builder_add_from_file(m_mainWidgetInterface, m_interfaceFilename.toASCIIString(), nullptr)) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Could not load interface file [" << m_interfaceFilename << "]\n"; + this->getLogManager() << Kernel::LogLevel_ImportantWarning << + "The file may be missing. However, the interface files now use gtk-builder instead of glade. Did you update your files ?\n"; + return false; + } + + // m_toolbarWidgetInterface=glade_xml_new(m_interfaceFilename.toASCIIString(), "p300-Identifier-card-toolbar", nullptr); + m_mainWindow = GTK_WIDGET(gtk_builder_get_object(m_mainWidgetInterface, "p300-Identifier-card-main")); + // m_toolbarWidget=gtk_builder_get_object(m_toolbarWidgetInterface, "p300-Identifier-card-toolbar"); + m_table = GTK_TABLE(gtk_builder_get_object(m_mainWidgetInterface, "p300-Identifier-card-table")); + gtk_widget_modify_bg(m_mainWindow, GTK_STATE_NORMAL, &m_bgColor); + + std::stringstream targetColor, selectColor; + targetColor << std::hex << std::setfill('0') << std::setw(2) << m_targetBgColor.red << std::setw(2) << m_targetBgColor.green << std::setw(2) << + m_targetBgColor.blue; + selectColor << std::hex << std::setfill('0') << std::setw(2) << m_selectedBgColor.red << std::setw(2) << m_selectedBgColor.green << std::setw(2) << + m_selectedBgColor.blue; + + m_targetLabel = GTK_LABEL(gtk_builder_get_object(m_mainWidgetInterface, "labelTarget")); + gtk_label_set_label(m_targetLabel, (R"(Target").c_str()); + m_selectedLabel = GTK_LABEL(gtk_builder_get_object(m_mainWidgetInterface, "labelResult")); + gtk_label_set_label(m_selectedLabel, (R"(Selected").c_str()); + + gtk_builder_connect_signals(m_mainWidgetInterface, nullptr); + // gtk_builder_connect_signals(m_toolbarWidgetInterface, nullptr); + + + m_visualizationCtx = dynamic_cast(this->createPluginObject( + OVP_ClassId_Plugin_VisualizationCtx)); + m_visualizationCtx->setWidget(*this, m_mainWindow); + // getVisualizationContext().setToolbar(m_toolbarWidget); + + m_nCard = 0; + m_targetCard = -1; + + m_tableInitialized = false; + this->cacheBuildFromTable(m_table); + GtkRequisition size; + + gtk_widget_size_request(GTK_WIDGET(m_caches[1].widget), &size); + + const gint widthWork = size.width; + const gint heightWork = size.height; + + for (size_t i = 6; i < boxContext.getSettingCount(); ++i) + { + CString fgImageFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i); + if (fgImageFilename != CString("")) + { + GError* error = nullptr; + + GdkPixbuf* tmp = gdk_pixbuf_new_from_file(fgImageFilename.toASCIIString(), &error); + + GtkWidget* fgImageTarget = gtk_image_new_from_pixbuf(gdk_pixbuf_scale_simple(tmp, 192, 192, GDK_INTERP_BILINEAR)); + g_object_unref(tmp); + + gtk_widget_show(fgImageTarget); + g_object_ref(fgImageTarget); + m_fgImageTargets.push_back(fgImageTarget); + + GtkWidget* fgImageWork = gtk_image_new_from_file(fgImageFilename.toASCIIString()); + gtk_widget_show(fgImageWork); + g_object_ref(fgImageWork); + GdkPixbuf* srcPixbuf = gtk_image_get_pixbuf(GTK_IMAGE(fgImageWork)); + GdkPixbuf* destPixbuf = gdk_pixbuf_scale_simple(srcPixbuf, widthWork, heightWork, GDK_INTERP_HYPER); + gtk_image_set_from_pixbuf(GTK_IMAGE(fgImageWork), destPixbuf); + m_fgImageWorks.push_back(fgImageWork); + + GtkWidget* fgImageResult = gtk_image_new_from_file(fgImageFilename.toASCIIString()); + gtk_widget_show(fgImageResult); + g_object_ref(fgImageResult); + m_fgImageResults.push_back(fgImageResult); + m_nCard++; + } + } + + const CString bgImageFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5); + m_bgImageTarget = gtk_image_new_from_file((bgImageFilename + CString("-offscreen")).toASCIIString()); + gtk_widget_show(m_bgImageTarget); + g_object_ref(m_bgImageTarget); + + m_bgImageWork = gtk_image_new_from_file((bgImageFilename + CString("-offscreen")).toASCIIString()); + gtk_widget_show(m_bgImageWork); + g_object_ref(m_bgImageWork); + GdkPixbuf* srcPixbuf = gtk_image_get_pixbuf(GTK_IMAGE(m_bgImageWork)); + GdkPixbuf* destPixbuf = gdk_pixbuf_scale_simple(srcPixbuf, widthWork, heightWork, GDK_INTERP_HYPER); + gtk_image_set_from_pixbuf(GTK_IMAGE(m_bgImageWork), destPixbuf); + + m_bgImageResult = gtk_image_new_from_file((bgImageFilename + CString("-offscreen")).toASCIIString()); + gtk_widget_show(m_bgImageResult); + g_object_ref(m_bgImageResult); + + this->cacheChangeImageCB(m_caches[0], m_bgImageTarget); + this->cacheChangeImageCB(m_caches[1], m_bgImageWork); + this->cacheChangeImageCB(m_caches[2], m_bgImageResult); + this->cacheForEach(&CBoxAlgorithmP300IdentifierCardVisualization::cacheChangeBackgroundCB, &m_bgColor); + return true; +} + +bool CBoxAlgorithmP300IdentifierCardVisualization::uninitialize() +{ + // g_object_unref(m_toolbarWidgetInterface); + // m_toolbarWidgetInterface= nullptr; + + if (m_mainWidgetInterface) + { + g_object_unref(m_mainWidgetInterface); + m_mainWidgetInterface = nullptr; + } + + m_targetFlaggingStimulationSet.uninitialize(); + m_targetFlaggingMemoryBuffer.uninitialize(); + + m_targetStimulationSet.uninitialize(); + m_targetMemoryBuffer.uninitialize(); + + m_sequenceStimulationSet.uninitialize(); + m_sequenceMemoryBuffer.uninitialize(); + + if (m_cardSelectionStimulationDecoder) + { + m_cardSelectionStimulationDecoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_cardSelectionStimulationDecoder); + m_cardSelectionStimulationDecoder = nullptr; + } + + if (m_targetFlaggingStimulationEncoder) + { + m_targetFlaggingStimulationEncoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_targetFlaggingStimulationEncoder); + m_targetFlaggingStimulationEncoder = nullptr; + } + + if (m_targetStimulationDecoder) + { + m_targetStimulationDecoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_targetStimulationDecoder); + m_targetStimulationDecoder = nullptr; + } + + if (m_sequenceStimulationDecoder) + { + m_sequenceStimulationDecoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_sequenceStimulationDecoder); + m_sequenceStimulationDecoder = nullptr; + } + + if (m_visualizationCtx) + { + this->releasePluginObject(m_visualizationCtx); + m_visualizationCtx = nullptr; + } + + return true; +} + +bool CBoxAlgorithmP300IdentifierCardVisualization::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + if (!m_tableInitialized) + { + this->cacheChangeImageCB(m_caches[0], m_bgImageTarget); + this->cacheChangeImageCB(m_caches[1], m_bgImageWork); + this->cacheChangeImageCB(m_caches[2], m_bgImageResult); + m_tableInitialized = true; + } + + return true; +} + + +bool CBoxAlgorithmP300IdentifierCardVisualization::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + // --- Sequence stimulations + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + CStimulationSet flaggingStimulationSet; + + m_sequenceMemoryBuffer = boxContext.getInputChunk(0, i); + m_targetFlaggingStimulationSet = &flaggingStimulationSet; + m_targetFlaggingMemoryBuffer = boxContext.getOutputChunk(0); + + m_sequenceStimulationDecoder->process(); + + m_lastTime = boxContext.getInputChunkEndTime(0, i); + + if (m_sequenceStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) + { + m_targetFlaggingStimulationEncoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeHeader); + } + + if (m_sequenceStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + IStimulationSet* stimulationSet = m_sequenceStimulationSet; + for (size_t j = 0; j < stimulationSet->getStimulationCount(); ++j) + { + const uint64_t id = stimulationSet->getStimulationIdentifier(j); + + if (id >= m_cardStimulationBase && id < m_cardStimulationBase + m_nCard) + { + const int card = int(id - m_cardStimulationBase); + if (card == m_targetCard) { flaggingStimulationSet.appendStimulation(OVTK_StimulationId_Target, stimulationSet->getStimulationDate(j), 0); } + else { flaggingStimulationSet.appendStimulation(OVTK_StimulationId_NonTarget, stimulationSet->getStimulationDate(j), 0); } + this->cacheChangeImageCB(m_caches[1], m_fgImageWorks[card]); + } + else if (id == OVTK_StimulationId_ExperimentStart) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Received OVTK_StimulationId_ExperimentStart - resets grid\n"; + this->cacheChangeImageCB(m_caches[0], m_bgImageTarget); + this->cacheChangeBackgroundCB(m_caches[0], &m_bgColor); + this->cacheChangeImageCB(m_caches[1], m_bgImageWork); + this->cacheChangeBackgroundCB(m_caches[1], &m_bgColor); + this->cacheChangeImageCB(m_caches[2], m_bgImageResult); + this->cacheChangeBackgroundCB(m_caches[2], &m_bgColor); + } + else if (id == OVTK_StimulationId_VisualStimulationStop) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Received OVTK_StimulationId_VisualStimulationStop - resets grid\n"; + //this->cacheChangeImageCB(m_caches[1], m_backgroundImageWork); + GtkContainer* container = GTK_CONTAINER(m_caches[1].widget); + gtk_container_remove(container, m_caches[1].image); + m_caches[1].image = nullptr; + } + else if (id == OVTK_StimulationId_SegmentStop) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Received OVTK_StimulationId_SegmentStop - resets grid\n"; + this->cacheChangeImageCB(m_caches[1], m_bgImageWork); + } + else if (id == OVTK_StimulationId_ExperimentStop) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Received OVTK_StimulationId_ExperimentStop - resets grid\n"; + this->cacheChangeImageCB(m_caches[0], m_bgImageTarget); + this->cacheChangeImageCB(m_caches[1], m_bgImageWork); + this->cacheChangeImageCB(m_caches[2], m_bgImageResult); + this->cacheChangeBackgroundCB(m_caches[0], &m_bgColor); + this->cacheChangeBackgroundCB(m_caches[1], &m_bgColor); + this->cacheChangeBackgroundCB(m_caches[2], &m_bgColor); + } + else if (id == OVTK_StimulationId_RestStop) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Received OVTK_StimulationId_RestStop - resets grid\n"; + this->cacheChangeImageCB(m_caches[2], m_bgImageResult); + this->cacheChangeBackgroundCB(m_caches[2], &m_bgColor); + } + } + m_targetFlaggingStimulationEncoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeBuffer); + } + + if (m_sequenceStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd)) + { + m_targetFlaggingStimulationEncoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeEnd); + } + + boxContext.markInputAsDeprecated(0, i); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + // --- Target stimulations + + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + if (m_lastTime >= boxContext.getInputChunkStartTime(1, i)) + { + m_targetMemoryBuffer = boxContext.getInputChunk(1, i); + m_targetStimulationDecoder->process(); + + if (m_targetStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) { } + + if (m_targetStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + IStimulationSet* stimulationSet = m_targetStimulationSet; + for (size_t j = 0; j < stimulationSet->getStimulationCount(); ++j) + { + uint64_t id = stimulationSet->getStimulationIdentifier(j); + if (id >= m_cardStimulationBase && id < m_cardStimulationBase + m_nCard) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Received Target Card " << id << "\n"; + m_targetCard = int(id - m_cardStimulationBase); + + this->getLogManager() << Kernel::LogLevel_Debug << "Displays Target Cell\n"; + this->cacheChangeImageCB(m_caches[0], m_fgImageTargets[m_targetCard]); + this->cacheChangeBackgroundCB(m_caches[0], &m_targetBgColor); + } + } + } + + if (m_targetStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd)) { } + + boxContext.markInputAsDeprecated(1, i); + } + } + + // --- Selection stimulations + + Kernel::TParameterHandler selectionMemoryBuffer( + m_cardSelectionStimulationDecoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + const Kernel::TParameterHandler selectionStimulationSet( + m_cardSelectionStimulationDecoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + + for (size_t i = 0; i < boxContext.getInputChunkCount(2); ++i) + { + if (m_lastTime >= boxContext.getInputChunkStartTime(2, i)) + { + selectionMemoryBuffer = boxContext.getInputChunk(2, i); + m_cardSelectionStimulationDecoder->process(); + + if (m_cardSelectionStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) { } + + if (m_cardSelectionStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + IStimulationSet* stimulationSet = selectionStimulationSet; + for (size_t j = 0; j < stimulationSet->getStimulationCount(); ++j) + { + uint64_t id = stimulationSet->getStimulationIdentifier(j); + if (id >= m_cardStimulationBase && id < m_cardStimulationBase + m_nCard) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Received Selected Card " << id << "\n"; + const int selectedCard = int(id - m_cardStimulationBase); + + this->getLogManager() << Kernel::LogLevel_Debug << "Displays Selected Cell\n"; + + this->cacheChangeImageCB(m_caches[1], m_bgImageWork); + this->cacheChangeImageCB(m_caches[2], m_fgImageResults[selectedCard]); + this->cacheChangeBackgroundCB(m_caches[2], &m_selectedBgColor); + } + if (id == OVTK_StimulationId_Label_00) + { + this->getLogManager() << Kernel::LogLevel_Trace << "Selection Rejected !\n"; + std::string label; + label = gtk_label_get_text(m_result); + label += "*"; + gtk_label_set_text(m_result, label.c_str()); + } + } + } + + if (m_cardSelectionStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd)) { } + + boxContext.markInputAsDeprecated(2, i); + } + } + return true; +} + +// _________________________________________________________________________________________________________________________________________________________ +// + +void CBoxAlgorithmP300IdentifierCardVisualization::cacheBuildFromTable(GtkTable* table) +{ + if (table) + { + for (GList* list = table->children; list; list = list->next) + { + GtkTableChild* child = static_cast(list->data); + + if (child->top_attach != 0) + { + int idx = 0; + for (size_t i = child->top_attach; i < child->bottom_attach; ++i) + { + for (size_t j = child->left_attach; j < child->right_attach; ++j) + { + idx++; + widget_style_t style; + style.index = idx; + style.parent = child->widget; + style.widget = gtk_bin_get_child(GTK_BIN(style.parent)); + style.image = gtk_bin_get_child(GTK_BIN(style.widget)); + m_caches.push_back(style); + } + } + } + } + } +} + +void CBoxAlgorithmP300IdentifierCardVisualization::cacheForEach(cache_callback callback, void* data) +{ + for (auto& cache : m_caches) { (this->*callback)(cache, data); } +} + +void CBoxAlgorithmP300IdentifierCardVisualization::cacheForEachIf(const int card, cache_callback ifCB, cache_callback elseCB, + void* ifUserData, void* elseUserData) +{ + for (auto& cache : m_caches) + { + if (card == cache.index) { (this->*ifCB)(cache, ifUserData); } + else { (this->*elseCB)(cache, elseUserData); } + } +} + +void CBoxAlgorithmP300IdentifierCardVisualization::cacheChangeNullCB(widget_style_t& /*style*/, void* /*data*/) {} + +void CBoxAlgorithmP300IdentifierCardVisualization::cacheChangeImageCB(widget_style_t& style, void* data) +{ + GtkContainer* container = GTK_CONTAINER(style.widget); + auto* image = static_cast(data); + + if (style.image != image) + { + if (style.image) { gtk_container_remove(container, style.image); } + gtk_container_add(container, image); + style.image = image; + } +} + +void CBoxAlgorithmP300IdentifierCardVisualization::cacheChangeBackgroundCB(widget_style_t& style, void* data) +{ + GdkColor color = *static_cast(data); + if (memcmp(&style.bgColor, &color, sizeof(GdkColor)) != 0) + { + gtk_widget_modify_bg(style.parent, GTK_STATE_NORMAL, &color); + gtk_widget_modify_bg(style.widget, GTK_STATE_NORMAL, &color); + gtk_widget_modify_bg(style.image, GTK_STATE_NORMAL, &color); + style.bgColor = color; + } +} +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300IdentifierCardVisualization.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300IdentifierCardVisualization.h new file mode 100755 index 0000000..a1b15b2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300IdentifierCardVisualization.h @@ -0,0 +1,160 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include +#include + +#include +#include +#include "../utils.h" + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +class CBoxAlgorithmP300IdentifierCardVisualization final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_P300IdentifierCardVisualization) + +private: + + using widget_style_t = struct + { + int index; + GdkColor bgColor; + GtkWidget* parent; + GtkWidget* widget; + GtkWidget* image; + }; + + typedef void (CBoxAlgorithmP300IdentifierCardVisualization::*cache_callback)(widget_style_t& style, void* data); + + void cacheBuildFromTable(GtkTable* table); + void cacheForEach(cache_callback callback, void* data); + void cacheForEachIf(int card, cache_callback ifCB, cache_callback elseCB, void* ifUserData, void* elseUserData); + void cacheChangeNullCB(widget_style_t& style, void* data); + void cacheChangeImageCB(widget_style_t& style, void* data); + void cacheChangeBackgroundCB(widget_style_t& style, void* data); + +protected: + + CString m_interfaceFilename; + uint64_t m_cardStimulationBase = 0; + +private: + + Kernel::IAlgorithmProxy* m_sequenceStimulationDecoder = nullptr; + Kernel::IAlgorithmProxy* m_targetStimulationDecoder = nullptr; + Kernel::IAlgorithmProxy* m_targetFlaggingStimulationEncoder = nullptr; + Kernel::IAlgorithmProxy* m_cardSelectionStimulationDecoder = nullptr; + Kernel::TParameterHandler m_sequenceMemoryBuffer; + Kernel::TParameterHandler m_targetMemoryBuffer; + Kernel::TParameterHandler m_targetFlaggingStimulationSet; + Kernel::TParameterHandler m_sequenceStimulationSet; + Kernel::TParameterHandler m_targetStimulationSet; + Kernel::TParameterHandler m_targetFlaggingMemoryBuffer; + uint64_t m_lastTime = 0; + + GtkBuilder* m_mainWidgetInterface = nullptr; + //GtkBuilder* m_toolbarWidgetInterface = nullptr; + GtkWidget* m_mainWindow = nullptr; + //GtkWidget* m_toolbarWidget = nullptr; + GtkTable* m_table = nullptr; + GtkLabel* m_result = nullptr; + //GtkLabel* m_target = nullptr; + GdkColor m_bgColor = InitGDKColor(0, 0, 0, 0); + GdkColor m_targetBgColor = InitGDKColor(0, 6554, 26214, 6554); + GdkColor m_selectedBgColor = InitGDKColor(0, 45875, 13107, 13107); + GtkLabel* m_targetLabel = nullptr; + GtkLabel* m_selectedLabel = nullptr; + uint64_t m_nCard = 0; + + int m_targetCard = 0; + + std::vector m_fgImageTargets; + std::vector m_fgImageWorks; + std::vector m_fgImageResults; + GtkWidget* m_bgImageTarget = nullptr; + GtkWidget* m_bgImageWork = nullptr; + GtkWidget* m_bgImageResult = nullptr; + + bool m_tableInitialized = false; + + std::vector m_caches; + + VisualizationToolkit::IVisualizationContext* m_visualizationCtx = nullptr; +}; + +class CBoxAlgorithmP300IdentifierCardVisualizationDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("P300 Identifier Card Visualization"); } + CString getAuthorName() const override { return CString("Baptiste Payan"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + + CString getShortDescription() const override + { + return CString("Displays images to the user based on received stimulations with some additional P300 related functionality"); + } + + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Visualization/Presentation"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-select-font"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_P300IdentifierCardVisualization; } + IPluginObject* create() override { return new CBoxAlgorithmP300IdentifierCardVisualization; } + + bool hasFunctionality(const EPluginFunctionality functionality) const override { return functionality == EPluginFunctionality::Visualization; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Sequence stimulations", OV_TypeId_Stimulations); + prototype.addInput("Target stimulations", OV_TypeId_Stimulations); + prototype.addInput("Card selection stimulations", OV_TypeId_Stimulations); + + prototype.addOutput("Target / Non target flagging", OV_TypeId_Stimulations); + + prototype.addSetting("Interface filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-identifier-card.ui"); + prototype.addSetting("Background color", OV_TypeId_Color, "0,0,0"); + prototype.addSetting("Target background color", OV_TypeId_Color, "10,40,10"); + prototype.addSetting("Selected background color", OV_TypeId_Color, "70,20,20"); + prototype.addSetting("Card stimulation base", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_01"); + prototype.addSetting("Background Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/openvibe-logo.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/01.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/02.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/03.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/04.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/05.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/06.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/07.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/08.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/09.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/10.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/11.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/12.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, ""); + prototype.addSetting("Card filename", OV_TypeId_Filename, ""); + prototype.addSetting("Card filename", OV_TypeId_Filename, ""); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_P300IdentifierCardVisualizationDesc) +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300MagicCardVisualization.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300MagicCardVisualization.cpp new file mode 100755 index 0000000..486f2dc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300MagicCardVisualization.cpp @@ -0,0 +1,477 @@ +#include "ovpCBoxAlgorithmP300MagicCardVisualization.h" +#include "../utils.h" +#include + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +// This callback flushes all accumulated stimulations to the TCP Tagging +// after the rendering has completed. +static gboolean FlushCB(gpointer data) +{ + static_cast(data)->flushQueue(); + return false; // Only run once +} + +bool CBoxAlgorithmP300MagicCardVisualization::initialize() +{ + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + + m_mainWidgetInterface = nullptr; + m_toolbarWidgetInterface = nullptr; + + m_interfaceFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_bgColor = CGdkcolorAutoCast(getStaticBoxContext(), getConfigurationManager(), 1); + m_targetBgColor = CGdkcolorAutoCast(getStaticBoxContext(), getConfigurationManager(), 2); + m_selectedBgColor = CGdkcolorAutoCast(getStaticBoxContext(), getConfigurationManager(), 3); + m_cardStimulationBase = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + CString tcpTaggingHostAddress = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5); + CString tcpTaggingHostPort = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 6); + const CString bgImageFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 7); + + for (size_t i = 6; i < boxContext.getSettingCount(); ++i) + { + GError* error = nullptr; + + CString fgImageFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i); + GdkPixbuf* tmp = gdk_pixbuf_new_from_file(fgImageFilename.toASCIIString(), &error); + + GtkWidget* fgImage = gtk_image_new_from_pixbuf(gdk_pixbuf_scale_simple(tmp, 192, 192, GDK_INTERP_BILINEAR)); + g_object_unref(tmp); + + gtk_widget_show(fgImage); + g_object_ref(fgImage); + m_fgImage.push_back(fgImage); + GtkWidget* bgImage; + if (bgImageFilename == CString("")) { bgImage = gtk_image_new_from_file((fgImageFilename + CString("-offscreen")).toASCIIString()); } + else { bgImage = gtk_image_new_from_file(bgImageFilename.toASCIIString()); } + gtk_widget_show(bgImage); + g_object_ref(bgImage); + m_bgImage.push_back(bgImage); + } + + // ---------------------------------------------------------------------------------------------------------------------------------------------------------- + + m_sequenceStimulationDecoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_sequenceStimulationDecoder->initialize(); + + m_targetStimulationDecoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_targetStimulationDecoder->initialize(); + + m_targetFlaggingStimulationEncoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationEncoder)); + m_targetFlaggingStimulationEncoder->initialize(); + + m_cardSelectionStimulationDecoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_cardSelectionStimulationDecoder->initialize(); + + m_sequenceMemoryBuffer.initialize( + m_sequenceStimulationDecoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + m_sequenceStimulationSet.initialize(m_sequenceStimulationDecoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + + m_targetMemoryBuffer.initialize(m_targetStimulationDecoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + m_targetStimulationSet.initialize(m_targetStimulationDecoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + + m_targetFlaggingStimulationSet.initialize( + m_targetFlaggingStimulationEncoder->getInputParameter(OVP_GD_Algorithm_StimulationEncoder_InputParameterId_StimulationSet)); + m_targetFlaggingMemoryBuffer.initialize( + m_targetFlaggingStimulationEncoder->getOutputParameter(OVP_GD_Algorithm_StimulationEncoder_OutputParameterId_EncodedMemoryBuffer)); + + m_lastTime = 0; + + m_mainWidgetInterface = gtk_builder_new(); // glade_xml_new(m_interfaceFilename.toASCIIString(), "p300-magic-card-main", nullptr); + if (!gtk_builder_add_from_file(m_mainWidgetInterface, m_interfaceFilename.toASCIIString(), nullptr)) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Could not load interface file [" << m_interfaceFilename << "]\n"; + this->getLogManager() << Kernel::LogLevel_ImportantWarning << + "The file may be missing. However, the interface files now use gtk-builder instead of glade. Did you update your files ?\n"; + return false; + } + + m_toolbarWidgetInterface = gtk_builder_new(); // glade_xml_new(m_interfaceFilename.toASCIIString(), "p300-magic-card-toolbar", nullptr); + gtk_builder_add_from_file(m_toolbarWidgetInterface, m_interfaceFilename.toASCIIString(), nullptr); + + m_mainWindow = GTK_WIDGET(gtk_builder_get_object(m_mainWidgetInterface, "p300-magic-card-main")); + m_toolbarWidget = GTK_WIDGET(gtk_builder_get_object(m_toolbarWidgetInterface, "p300-magic-card-toolbar")); + m_table = GTK_TABLE(gtk_builder_get_object(m_mainWidgetInterface, "p300-magic-card-table")); + gtk_widget_modify_bg(m_mainWindow, GTK_STATE_NORMAL, &m_bgColor); + + gtk_builder_connect_signals(m_mainWidgetInterface, nullptr); + gtk_builder_connect_signals(m_toolbarWidgetInterface, nullptr); + + m_visualizationCtx = dynamic_cast(this->createPluginObject(OVP_ClassId_Plugin_VisualizationCtx)); + m_visualizationCtx->setWidget(*this, m_mainWindow); + m_visualizationCtx->setToolbar(*this, m_toolbarWidget); + + guint nRow = 0; + guint nCol = 0; + g_object_get(m_table, "n-rows", &nRow, nullptr); + g_object_get(m_table, "n-columns", &nCol, nullptr); + + m_nTableRow = nRow; + m_nTableCol = nCol; + m_nCard = m_nTableRow * m_nTableCol; + m_targetCard = -1; + + m_tableInitialized = false; + this->cacheBuildFromTable(m_table); + this->cacheForEach(&CBoxAlgorithmP300MagicCardVisualization::cacheChangeImageCB, &m_fgImage); + this->cacheForEach(&CBoxAlgorithmP300MagicCardVisualization::cacheChangeBackgroundCB, &m_bgColor); + + //TCP TAGGING + m_idleFuncTag = 0; + m_stimuliQueue.clear(); + m_stimulusSender = TCPTagging::CreateStimulusSender(); + if (!m_stimulusSender->connect("localhost", "15361")) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Unable to connect to AS's TCP Tagging plugin, stimuli wont be forwarded.\n"; + } + + return true; +} + +bool CBoxAlgorithmP300MagicCardVisualization::uninitialize() +{ + if (m_toolbarWidgetInterface) + { + g_object_unref(m_toolbarWidgetInterface); + m_toolbarWidgetInterface = nullptr; + } + + if (m_mainWidgetInterface) + { + g_object_unref(m_mainWidgetInterface); + m_mainWidgetInterface = nullptr; + } + + m_targetFlaggingStimulationSet.uninitialize(); + m_targetFlaggingMemoryBuffer.uninitialize(); + + m_targetStimulationSet.uninitialize(); + m_targetMemoryBuffer.uninitialize(); + + m_sequenceStimulationSet.uninitialize(); + m_sequenceMemoryBuffer.uninitialize(); + + if (m_cardSelectionStimulationDecoder) + { + m_cardSelectionStimulationDecoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_cardSelectionStimulationDecoder); + m_cardSelectionStimulationDecoder = nullptr; + } + + if (m_targetFlaggingStimulationEncoder) + { + m_targetFlaggingStimulationEncoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_targetFlaggingStimulationEncoder); + m_targetFlaggingStimulationEncoder = nullptr; + } + + if (m_targetStimulationDecoder) + { + m_targetStimulationDecoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_targetStimulationDecoder); + m_targetStimulationDecoder = nullptr; + } + + if (m_sequenceStimulationDecoder) + { + m_sequenceStimulationDecoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_sequenceStimulationDecoder); + m_sequenceStimulationDecoder = nullptr; + } + + if (m_visualizationCtx) + { + this->releasePluginObject(m_visualizationCtx); + m_visualizationCtx = nullptr; + } + + + //TCP TAGGING + m_stimuliQueue.clear(); + if (m_stimulusSender) + { + delete m_stimulusSender; + m_stimulusSender = nullptr; + } + return true; +} + +bool CBoxAlgorithmP300MagicCardVisualization::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + if (!m_tableInitialized) + { + this->cacheForEach(&CBoxAlgorithmP300MagicCardVisualization::cacheChangeImageCB, &m_fgImage); + m_tableInitialized = true; + } + + return true; +} + +bool CBoxAlgorithmP300MagicCardVisualization::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + // --- Sequence stimulations + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + CStimulationSet flaggingStimulationSet; + + m_sequenceMemoryBuffer = boxContext.getInputChunk(0, i); + m_targetFlaggingStimulationSet = &flaggingStimulationSet; + m_targetFlaggingMemoryBuffer = boxContext.getOutputChunk(0); + + m_sequenceStimulationDecoder->process(); + + m_lastTime = boxContext.getInputChunkEndTime(0, i); + + if (m_sequenceStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) + { + m_targetFlaggingStimulationEncoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeHeader); + } + + if (m_sequenceStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + IStimulationSet* stimulationSet = m_sequenceStimulationSet; + for (size_t j = 0; j < stimulationSet->getStimulationCount(); ++j) + { + uint64_t id = stimulationSet->getStimulationIdentifier(j); + if (id >= m_cardStimulationBase && id < m_cardStimulationBase + m_nCard) + { + const int card = int(id - m_cardStimulationBase); + if (card == m_targetCard) + { + m_stimuliQueue.push_back(OVTK_StimulationId_Target); + flaggingStimulationSet.appendStimulation(OVTK_StimulationId_Target, stimulationSet->getStimulationDate(j), 0); + } + else + { + m_stimuliQueue.push_back(OVTK_StimulationId_NonTarget); + flaggingStimulationSet.appendStimulation(OVTK_StimulationId_NonTarget, stimulationSet->getStimulationDate(j), 0); + } + + this->cacheForEachIf(card, &CBoxAlgorithmP300MagicCardVisualization::cacheChangeImageCB, + &CBoxAlgorithmP300MagicCardVisualization::cacheChangeImageCB, &m_fgImage, &m_bgImage); + this->cacheForEach(&CBoxAlgorithmP300MagicCardVisualization::cacheChangeBackgroundCB, &m_bgColor); + } + if (id == OVTK_StimulationId_ExperimentStart) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Received OVTK_StimulationId_ExperimentStart - resets grid\n"; + this->cacheForEach(&CBoxAlgorithmP300MagicCardVisualization::cacheChangeImageCB, &m_bgImage); + } + if (id == OVTK_StimulationId_VisualStimulationStop) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Received OVTK_StimulationId_VisualStimulationStop - resets grid\n"; + this->cacheForEach(&CBoxAlgorithmP300MagicCardVisualization::cacheChangeImageCB, &m_bgImage); + } + // Pass the stimulation to the server also as-is. If its a flash, it can be differentiated from a 'target' spec because + // its NOT between OVTK_StimulationId_RestStart and OVTK_StimulationId_RestStop stimuli in the generated P300 timeline. + m_stimuliQueue.push_back(id); + } + + m_targetFlaggingStimulationEncoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeBuffer); + } + + if (m_sequenceStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd)) + { + m_targetFlaggingStimulationEncoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeEnd); + } + + boxContext.markInputAsDeprecated(0, i); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + // --- Target stimulations + + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + if (m_lastTime >= boxContext.getInputChunkStartTime(1, i)) + { + m_targetMemoryBuffer = boxContext.getInputChunk(1, i); + m_targetStimulationDecoder->process(); + + if (m_targetStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) { } + + if (m_targetStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + IStimulationSet* stimulationSet = m_targetStimulationSet; + for (size_t j = 0; j < stimulationSet->getStimulationCount(); ++j) + { + uint64_t id = stimulationSet->getStimulationIdentifier(j); + if (id >= m_cardStimulationBase && id < m_cardStimulationBase + m_nCard) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Received Target Card " << id << "\n"; + m_targetCard = int(id - m_cardStimulationBase); + + this->getLogManager() << Kernel::LogLevel_Debug << "Displays Target Cell\n"; + this->cacheForEachIf(m_targetCard, &CBoxAlgorithmP300MagicCardVisualization::cacheChangeImageCB, + &CBoxAlgorithmP300MagicCardVisualization::cacheChangeNullCB, &m_fgImage, nullptr); + this->cacheForEachIf(m_targetCard, &CBoxAlgorithmP300MagicCardVisualization::cacheChangeBackgroundCB, + &CBoxAlgorithmP300MagicCardVisualization::cacheChangeNullCB, &m_targetBgColor, nullptr); + + // Merge the current target into the stimulation stream. It can be differentiated + // from a 'flash' spec because it IS between OVTK_StimulationId_RestStart and + // OVTK_StimulationId_RestStop stimulations in the P300 timeline. + { + //or just stimulationIdentifier + m_stimuliQueue.push_back(m_targetCard + m_cardStimulationBase); + } + } + } + } + if (m_targetStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd)) { } + boxContext.markInputAsDeprecated(1, i); + } + } + + // --- Selection stimulations + + Kernel::TParameterHandler selectionMemoryBuffer( + m_cardSelectionStimulationDecoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + const Kernel::TParameterHandler selectionStimulationSet( + m_cardSelectionStimulationDecoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + + for (size_t i = 0; i < boxContext.getInputChunkCount(2); ++i) + { + if (m_lastTime >= boxContext.getInputChunkStartTime(2, i)) + { + selectionMemoryBuffer = boxContext.getInputChunk(2, i); + m_cardSelectionStimulationDecoder->process(); + + if (m_cardSelectionStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) { } + + if (m_cardSelectionStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + IStimulationSet* stimulationSet = selectionStimulationSet; + for (size_t j = 0; j < stimulationSet->getStimulationCount(); ++j) + { + uint64_t id = stimulationSet->getStimulationIdentifier(j); + if (id >= m_cardStimulationBase && id < m_cardStimulationBase + m_nCard) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Received Selected Card " << id << "\n"; + const int selectedCard = int(id - m_cardStimulationBase); + + this->getLogManager() << Kernel::LogLevel_Debug << "Displays Selected Cell\n"; + + this->cacheForEachIf(selectedCard, &CBoxAlgorithmP300MagicCardVisualization::cacheChangeImageCB, + &CBoxAlgorithmP300MagicCardVisualization::cacheChangeNullCB, &m_fgImage, nullptr); + this->cacheForEachIf(selectedCard, &CBoxAlgorithmP300MagicCardVisualization::cacheChangeBackgroundCB, + &CBoxAlgorithmP300MagicCardVisualization::cacheChangeNullCB, &m_selectedBgColor, nullptr); + } + if (id == OVTK_StimulationId_Label_00) + { + this->getLogManager() << Kernel::LogLevel_Trace << "Selection Rejected !\n"; + std::string label; + label = gtk_label_get_text(m_result); + label += "*"; + gtk_label_set_text(m_result, label.c_str()); + } + } + } + + if (m_cardSelectionStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd)) { } + + boxContext.markInputAsDeprecated(2, i); + } + } + + // After any possible rendering, we flush the accumulated stimuli. The default idle func is low priority, so it should be run after rendering by gtk. + if (m_idleFuncTag == 0) { m_idleFuncTag = g_idle_add(FlushCB, this); } + return true; +} + +// _________________________________________________________________________________________________________________________________________________________ +// + +void CBoxAlgorithmP300MagicCardVisualization::cacheBuildFromTable(GtkTable* table) +{ + if (table) + { + for (GList* list = table->children; list; list = list->next) + { + GtkTableChild* child = static_cast(list->data); + + for (size_t i = child->top_attach; i < child->bottom_attach; ++i) + { + for (size_t j = child->left_attach; j < child->right_attach; ++j) + { + const int idx = int(i * m_nTableCol + j); + widget_style_t& style = m_caches[idx]; + style.index = idx; + style.parent = child->widget; + style.widget = gtk_bin_get_child(GTK_BIN(style.parent)); + style.image = gtk_bin_get_child(GTK_BIN(style.widget)); + } + } + } + } +} + +void CBoxAlgorithmP300MagicCardVisualization::cacheForEach(cache_callback callback, void* data) +{ + for (auto& cache : m_caches) { (this->*callback)(cache.second, data); } +} + +void CBoxAlgorithmP300MagicCardVisualization::cacheForEachIf(const int card, cache_callback ifCB, cache_callback elseCB, void* ifUserData, + void* elseUserData) +{ + for (auto& cache : m_caches) + { + if (card == cache.second.index) { (this->*ifCB)(cache.second, ifUserData); } + else { (this->*elseCB)(cache.second, elseUserData); } + } +} + +void CBoxAlgorithmP300MagicCardVisualization::cacheChangeNullCB(widget_style_t& /*widgetStyle*/, void* /*data*/) {} + +void CBoxAlgorithmP300MagicCardVisualization::cacheChangeImageCB(widget_style_t& style, void* data) +{ + GtkContainer* container = GTK_CONTAINER(style.widget); + auto* pvImage = static_cast*>(data); + + GtkWidget* image = (*pvImage)[style.index]; + + if (style.image != image) + { + if (style.image) { gtk_container_remove(container, style.image); } + gtk_container_add(container, image); + style.image = image; + } +} + +void CBoxAlgorithmP300MagicCardVisualization::cacheChangeBackgroundCB(widget_style_t& style, void* data) +{ + GdkColor color = *static_cast(data); + if (memcmp(&style.bgColor, &color, sizeof(GdkColor)) != 0) + { + gtk_widget_modify_bg(style.parent, GTK_STATE_NORMAL, &color); + gtk_widget_modify_bg(style.widget, GTK_STATE_NORMAL, &color); + gtk_widget_modify_bg(style.image, GTK_STATE_NORMAL, &color); + style.bgColor = color; + } +} + +// Note that we don't need concurrency control here as gtk callbacks run in the main thread +void CBoxAlgorithmP300MagicCardVisualization::flushQueue() +{ + for (const auto& stimulation : m_stimuliQueue) { m_stimulusSender->sendStimulation(stimulation); } + m_stimuliQueue.clear(); + + // This function will be automatically removed after completion, so set to 0 + m_idleFuncTag = 0; +} +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300MagicCardVisualization.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300MagicCardVisualization.h new file mode 100755 index 0000000..0354dd7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300MagicCardVisualization.h @@ -0,0 +1,160 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include +#include + +#include +#include +#include "../utils.h" + +namespace TCPTagging { +class IStimulusSender; // fwd declare +} // namespace TCPTagging + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +class CBoxAlgorithmP300MagicCardVisualization final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + void flushQueue(); // Sends all accumulated stimuli to the TCP Tagging + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_P300MagicCardVisualization) + +private: + + using widget_style_t = struct + { + int index; + GdkColor bgColor; + GtkWidget* parent; + GtkWidget* widget; + GtkWidget* image; + }; + + typedef void (CBoxAlgorithmP300MagicCardVisualization::*cache_callback)(widget_style_t& style, void* data); + + void cacheBuildFromTable(GtkTable* table); + void cacheForEach(cache_callback callback, void* data); + void cacheForEachIf(int card, cache_callback ifCB, cache_callback elseCB, void* ifUserData, void* elseUserData); + void cacheChangeNullCB(widget_style_t& style, void* data); + void cacheChangeImageCB(widget_style_t& style, void* data); + void cacheChangeBackgroundCB(widget_style_t& style, void* data); + +protected: + + CString m_interfaceFilename; + uint64_t m_cardStimulationBase = 0; + +private: + + Kernel::IAlgorithmProxy* m_sequenceStimulationDecoder = nullptr; + Kernel::IAlgorithmProxy* m_targetStimulationDecoder = nullptr; + Kernel::IAlgorithmProxy* m_targetFlaggingStimulationEncoder = nullptr; + Kernel::IAlgorithmProxy* m_cardSelectionStimulationDecoder = nullptr; + Kernel::TParameterHandler m_sequenceMemoryBuffer; + Kernel::TParameterHandler m_targetMemoryBuffer; + Kernel::TParameterHandler m_targetFlaggingStimulationSet; + Kernel::TParameterHandler m_sequenceStimulationSet; + Kernel::TParameterHandler m_targetStimulationSet; + Kernel::TParameterHandler m_targetFlaggingMemoryBuffer; + uint64_t m_lastTime = 0; + + GtkBuilder* m_mainWidgetInterface = nullptr; + GtkBuilder* m_toolbarWidgetInterface = nullptr; + GtkWidget* m_mainWindow = nullptr; + GtkWidget* m_toolbarWidget = nullptr; + GtkTable* m_table = nullptr; + GtkLabel* m_result = nullptr; + //GtkLabel* m_target = nullptr; + GdkColor m_bgColor = InitGDKColor(0, 58982, 58982, 58982); + GdkColor m_targetBgColor = InitGDKColor(0, 6554, 26214, 6554); + GdkColor m_selectedBgColor = InitGDKColor(0, 45875, 13107, 13107); + uint64_t m_nTableRow = 0; + uint64_t m_nTableCol = 0; + uint64_t m_nCard = 0; + + int m_targetCard = 0; + + std::vector m_fgImage; + std::vector m_bgImage; + + bool m_tableInitialized = false; + + std::map m_caches; + + VisualizationToolkit::IVisualizationContext* m_visualizationCtx = nullptr; + + // TCP Tagging + std::vector m_stimuliQueue; + guint m_idleFuncTag = 0; + TCPTagging::IStimulusSender* m_stimulusSender = nullptr; +}; + +class CBoxAlgorithmP300MagicCardVisualizationDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("P300 Magic Card Visualization"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Presents a matrix of images to the user in various ways"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Visualization/Presentation"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-select-font"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_P300MagicCardVisualization; } + IPluginObject* create() override { return new CBoxAlgorithmP300MagicCardVisualization; } + + bool hasFunctionality(const EPluginFunctionality functionality) const override { return functionality == EPluginFunctionality::Visualization; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Sequence stimulations", OV_TypeId_Stimulations); + prototype.addInput("Target stimulations", OV_TypeId_Stimulations); + prototype.addInput("Card selection stimulations", OV_TypeId_Stimulations); + + prototype.addOutput("Target / Non target flagging (deprecated)", OV_TypeId_Stimulations); + + prototype.addSetting("Interface filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card.ui"); + prototype.addSetting("Background color", OV_TypeId_Color, "90,90,90"); + prototype.addSetting("Target background color", OV_TypeId_Color, "10,40,10"); + prototype.addSetting("Selected background color", OV_TypeId_Color, "70,20,20"); + prototype.addSetting("Card stimulation base", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_01"); + prototype.addSetting("TCP Tagging Host address", OV_TypeId_String, "localhost"); + prototype.addSetting("TCP Tagging Host port", OV_TypeId_Integer, "15361"); + prototype.addSetting("Default background filename", OV_TypeId_Filename, + "${Path_Data}/plugins/simple-visualization/p300-magic-card/openvibe-logo.png-offscreen"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/01.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/02.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/03.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/04.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/05.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/06.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/07.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/08.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/09.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/10.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/11.png"); + prototype.addSetting("Card filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/12.png"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_P300MagicCardVisualizationDesc) +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300SpellerVisualization.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300SpellerVisualization.cpp new file mode 100755 index 0000000..cf056d7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300SpellerVisualization.cpp @@ -0,0 +1,730 @@ +// @todo for clarity, the StimulusSender related code blocks should be pushed inside the class and away from here + +#include "ovpCBoxAlgorithmP300SpellerVisualization.h" +#include "../utils.h" +#include + +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +static void ToggleButtonShowHideCB(GtkToggleToolButton* button, gpointer data) +{ + if (gtk_toggle_tool_button_get_active(button)) { gtk_widget_show(GTK_WIDGET(data)); } + else { gtk_widget_hide(GTK_WIDGET(data)); } +} + +// This callback flushes all accumulated stimulations to the TCP Tagging +// after the rendering has completed. +static gboolean FlushCB(gpointer data) +{ + (static_cast(data))->flushQueue(); + + return false; // Only run once +} + +bool CBoxAlgorithmP300SpellerVisualization::initialize() +{ + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + + m_mainWidgetInterface = nullptr; + m_toolbarWidgetInterface = nullptr; + m_flashFontDesc = nullptr; + m_noFlashFontDesc = nullptr; + m_targetFontDesc = nullptr; + m_selectedFontDesc = nullptr; + + // ---------------------------------------------------------------------------------------------------------------------------------------------------------- + + m_interfaceFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_rowStimulationBase = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_columnStimulationBase = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + + m_flashBgColor = CGdkcolorAutoCast(boxContext, this->getConfigurationManager(), 3); + m_flashFgColor = CGdkcolorAutoCast(boxContext, this->getConfigurationManager(), 4); + m_flashFontSize = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5); + m_noFlashBgColor = CGdkcolorAutoCast(boxContext, this->getConfigurationManager(), 6); + m_noFlashFgColor = CGdkcolorAutoCast(boxContext, this->getConfigurationManager(), 7); + m_noFlashFontSize = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 8); + m_targetBgColor = CGdkcolorAutoCast(boxContext, this->getConfigurationManager(), 9); + m_targetFgColor = CGdkcolorAutoCast(boxContext, this->getConfigurationManager(), 10); + m_targetFontSize = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 11); + m_selectedBgColor = CGdkcolorAutoCast(boxContext, this->getConfigurationManager(), 12); + m_selectedFgColor = CGdkcolorAutoCast(boxContext, this->getConfigurationManager(), 13); + m_selectedFontSize = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 14); + + // ---------------------------------------------------------------------------------------------------------------------------------------------------------- + + m_sequenceStimulationDecoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_sequenceStimulationDecoder->initialize(); + + m_targetStimulationDecoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_targetStimulationDecoder->initialize(); + + m_targetFlaggingStimulationEncoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationEncoder)); + m_targetFlaggingStimulationEncoder->initialize(); + + m_rowSelectionStimulationDecoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_rowSelectionStimulationDecoder->initialize(); + + m_columnSelectionStimulationDecoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_columnSelectionStimulationDecoder->initialize(); + + m_sequenceMemoryBuffer.initialize( + m_sequenceStimulationDecoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + m_sequenceStimulationSet.initialize( + m_sequenceStimulationDecoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + + m_targetMemoryBuffer.initialize( + m_targetStimulationDecoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + m_targetStimulationSet.initialize( + m_targetStimulationDecoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + + m_targetFlaggingStimulationSet.initialize( + m_targetFlaggingStimulationEncoder->getInputParameter(OVP_GD_Algorithm_StimulationEncoder_InputParameterId_StimulationSet)); + m_targetFlaggingMemoryBuffer.initialize( + m_targetFlaggingStimulationEncoder->getOutputParameter(OVP_GD_Algorithm_StimulationEncoder_OutputParameterId_EncodedMemoryBuffer)); + + m_lastTime = 0; + + m_stimulusSender = nullptr; + + m_idleFuncTag = 0; + m_stimuliQueue.clear(); + + m_mainWidgetInterface = gtk_builder_new(); // glade_xml_new(m_interfaceFilename.toASCIIString(), "p300-speller-main", nullptr); + if (!gtk_builder_add_from_file(m_mainWidgetInterface, m_interfaceFilename.toASCIIString(), nullptr)) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Could not load interface file [" << m_interfaceFilename << "]\n"; + this->getLogManager() << Kernel::LogLevel_ImportantWarning << + "The file may be missing. However, the interface files now use gtk-builder instead of glade. Did you update your files ?\n"; + return false; + } + + m_toolbarWidgetInterface = gtk_builder_new(); // glade_xml_new(m_interfaceFilename.toASCIIString(), "p300-speller-toolbar", nullptr); + gtk_builder_add_from_file(m_toolbarWidgetInterface, m_interfaceFilename.toASCIIString(), nullptr); + + m_mainWindow = GTK_WIDGET(gtk_builder_get_object(m_mainWidgetInterface, "p300-speller-main")); + m_toolbarWidget = GTK_WIDGET(gtk_builder_get_object(m_toolbarWidgetInterface, "p300-speller-toolbar")); + m_table = GTK_TABLE(gtk_builder_get_object(m_mainWidgetInterface, "p300-speller-table")); + m_result = GTK_LABEL(gtk_builder_get_object(m_mainWidgetInterface, "label-result")); + m_target = GTK_LABEL(gtk_builder_get_object(m_mainWidgetInterface, "label-target")); + + gtk_builder_connect_signals(m_mainWidgetInterface, nullptr); + gtk_builder_connect_signals(m_toolbarWidgetInterface, nullptr); + + g_signal_connect(gtk_builder_get_object(m_toolbarWidgetInterface, "toolbutton-show_target_text"), "toggled", G_CALLBACK(ToggleButtonShowHideCB), + gtk_builder_get_object(m_mainWidgetInterface, "label-target")); + g_signal_connect(gtk_builder_get_object(m_toolbarWidgetInterface, "toolbutton-show_target_text"), "toggled", G_CALLBACK(ToggleButtonShowHideCB), + gtk_builder_get_object(m_mainWidgetInterface, "label-target-title")); + g_signal_connect(gtk_builder_get_object(m_toolbarWidgetInterface, "toolbutton-show_result_text"), "toggled", G_CALLBACK(ToggleButtonShowHideCB), + gtk_builder_get_object(m_mainWidgetInterface, "label-result")); + g_signal_connect(gtk_builder_get_object(m_toolbarWidgetInterface, "toolbutton-show_result_text"), "toggled", G_CALLBACK(ToggleButtonShowHideCB), + gtk_builder_get_object(m_mainWidgetInterface, "label-result-title")); + + m_visualizationCtx = dynamic_cast(this->createPluginObject( + OVP_ClassId_Plugin_VisualizationCtx)); + m_visualizationCtx->setWidget(*this, m_mainWindow); + m_visualizationCtx->setToolbar(*this, m_toolbarWidget); + + guint nRow = 0, nCol = 0; + g_object_get(m_table, "n-rows", &nRow, nullptr); + g_object_get(m_table, "n-columns", &nCol, nullptr); + + m_nRow = nRow; + m_nCol = nCol; + + PangoFontDescription* maxFontDesc = pango_font_description_copy(pango_context_get_font_description(gtk_widget_get_pango_context(m_mainWindow))); + m_flashFontDesc = pango_font_description_copy(pango_context_get_font_description(gtk_widget_get_pango_context(m_mainWindow))); + m_noFlashFontDesc = pango_font_description_copy(pango_context_get_font_description(gtk_widget_get_pango_context(m_mainWindow))); + m_targetFontDesc = pango_font_description_copy(pango_context_get_font_description(gtk_widget_get_pango_context(m_mainWindow))); + m_selectedFontDesc = pango_font_description_copy(pango_context_get_font_description(gtk_widget_get_pango_context(m_mainWindow))); + + uint64_t maxSize = 0; + maxSize = std::max(maxSize, m_flashFontSize); + maxSize = std::max(maxSize, m_noFlashFontSize); + maxSize = std::max(maxSize, m_targetFontSize); + maxSize = std::max(maxSize, m_selectedFontSize); + + pango_font_description_set_size(maxFontDesc, gint(maxSize * PANGO_SCALE)); + pango_font_description_set_size(m_flashFontDesc, gint(m_flashFontSize * PANGO_SCALE)); + pango_font_description_set_size(m_noFlashFontDesc, gint(m_noFlashFontSize * PANGO_SCALE)); + pango_font_description_set_size(m_targetFontDesc, gint(m_targetFontSize * PANGO_SCALE)); + pango_font_description_set_size(m_selectedFontDesc, gint(m_selectedFontSize * PANGO_SCALE)); + + this->cacheBuildFromTable(m_table); + this->cacheForEach(&CBoxAlgorithmP300SpellerVisualization::cacheChangeBackgroundCB, &m_noFlashBgColor); + this->cacheForEach(&CBoxAlgorithmP300SpellerVisualization::cacheChangeForegroundCB, &m_noFlashFgColor); + this->cacheForEach(&CBoxAlgorithmP300SpellerVisualization::cacheChangeFontCB, maxFontDesc); + + pango_font_description_free(maxFontDesc); + + m_lastTargetRow = -1; + m_lastTargetCol = -1; + m_targetRow = -1; + m_targetCol = -1; + m_selectedRow = -1; + m_selectedCol = -1; + + m_stimulusSender = TCPTagging::CreateStimulusSender(); + + if (!m_stimulusSender->connect("localhost", "15361")) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Unable to connect to AS TCP Tagging, stimuli wont be forwarded.\n"; + } + + m_tableInitialized = false; + + return true; +} + +bool CBoxAlgorithmP300SpellerVisualization::uninitialize() +{ + if (m_idleFuncTag) + { + m_stimuliQueue.clear(); + g_source_remove(m_idleFuncTag); + m_idleFuncTag = 0; + } + + if (m_stimulusSender) + { + delete m_stimulusSender; + m_stimulusSender = nullptr; + } + + if (m_selectedFontDesc) + { + pango_font_description_free(m_selectedFontDesc); + m_selectedFontDesc = nullptr; + } + + if (m_targetFontDesc) + { + pango_font_description_free(m_targetFontDesc); + m_targetFontDesc = nullptr; + } + + if (m_noFlashFontDesc) + { + pango_font_description_free(m_noFlashFontDesc); + m_noFlashFontDesc = nullptr; + } + + if (m_flashFontDesc) + { + pango_font_description_free(m_flashFontDesc); + m_flashFontDesc = nullptr; + } + + if (m_toolbarWidgetInterface) + { + g_object_unref(m_toolbarWidgetInterface); + m_toolbarWidgetInterface = nullptr; + } + + if (m_mainWidgetInterface) + { + g_object_unref(m_mainWidgetInterface); + m_mainWidgetInterface = nullptr; + } + + m_targetFlaggingStimulationSet.uninitialize(); + m_targetFlaggingMemoryBuffer.uninitialize(); + + m_targetStimulationSet.uninitialize(); + m_targetMemoryBuffer.uninitialize(); + + m_sequenceStimulationSet.uninitialize(); + m_sequenceMemoryBuffer.uninitialize(); + + if (m_columnSelectionStimulationDecoder) + { + m_columnSelectionStimulationDecoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_columnSelectionStimulationDecoder); + m_columnSelectionStimulationDecoder = nullptr; + } + + if (m_rowSelectionStimulationDecoder) + { + m_rowSelectionStimulationDecoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_rowSelectionStimulationDecoder); + m_rowSelectionStimulationDecoder = nullptr; + } + + if (m_targetFlaggingStimulationEncoder) + { + m_targetFlaggingStimulationEncoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_targetFlaggingStimulationEncoder); + m_targetFlaggingStimulationEncoder = nullptr; + } + + if (m_targetStimulationDecoder) + { + m_targetStimulationDecoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_targetStimulationDecoder); + m_targetStimulationDecoder = nullptr; + } + + if (m_sequenceStimulationDecoder) + { + m_sequenceStimulationDecoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_sequenceStimulationDecoder); + m_sequenceStimulationDecoder = nullptr; + } + + if (m_visualizationCtx) + { + this->releasePluginObject(m_visualizationCtx); + m_sequenceStimulationDecoder = nullptr; + } + + return true; +} + +bool CBoxAlgorithmP300SpellerVisualization::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + if (!m_tableInitialized) + { + this->cacheForEach(&CBoxAlgorithmP300SpellerVisualization::cacheChangeBackgroundCB, &m_noFlashBgColor); + this->cacheForEach(&CBoxAlgorithmP300SpellerVisualization::cacheChangeForegroundCB, &m_noFlashFgColor); + this->cacheForEach(&CBoxAlgorithmP300SpellerVisualization::cacheChangeFontCB, m_noFlashFontDesc); + m_tableInitialized = true; + } + + return true; +} + +bool CBoxAlgorithmP300SpellerVisualization::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + // --- Sequence stimulations + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + CStimulationSet flaggingStimulationSet; + + m_sequenceMemoryBuffer = boxContext.getInputChunk(0, i); + m_targetFlaggingStimulationSet = &flaggingStimulationSet; + m_targetFlaggingMemoryBuffer = boxContext.getOutputChunk(0); + + m_sequenceStimulationDecoder->process(); + + m_lastTime = boxContext.getInputChunkEndTime(0, i); + + if (m_sequenceStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) + { + m_targetFlaggingStimulationEncoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeHeader); + } + + if (m_sequenceStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + IStimulationSet* stimulationSet = m_sequenceStimulationSet; + for (size_t j = 0; j < stimulationSet->getStimulationCount(); ++j) + { + uint64_t id = stimulationSet->getStimulationIdentifier(j); + bool flash = false; + int row = -1; + int col = -1; + bool isTarget = false; + + if (id >= m_rowStimulationBase && id < m_rowStimulationBase + m_nRow) + { + row = int(id - m_rowStimulationBase); + flash = true; + isTarget = (row == m_lastTargetRow); + } + if (id >= m_columnStimulationBase && id < m_columnStimulationBase + m_nCol) + { + col = int(id - m_columnStimulationBase); + flash = true; + isTarget = (col == m_lastTargetCol); + } + if (id == OVTK_StimulationId_VisualStimulationStop) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Received OVTK_StimulationId_VisualStimulationStop - resets grid\n"; + this->cacheForEach(&CBoxAlgorithmP300SpellerVisualization::cacheChangeBackgroundCB, &m_noFlashBgColor); + this->cacheForEach(&CBoxAlgorithmP300SpellerVisualization::cacheChangeForegroundCB, &m_noFlashFgColor); + this->cacheForEach(&CBoxAlgorithmP300SpellerVisualization::cacheChangeFontCB, m_noFlashFontDesc); + } + if (id == OVTK_StimulationId_Reset) + { + gtk_label_set_text(m_target, ""); + gtk_label_set_text(m_result, ""); + } + + if (flash) + { + this->cacheForEachIf(row, col, &CBoxAlgorithmP300SpellerVisualization::cacheChangeBackgroundCB, + &CBoxAlgorithmP300SpellerVisualization::cacheChangeBackgroundCB, &m_flashBgColor, &m_noFlashBgColor); + this->cacheForEachIf(row, col, &CBoxAlgorithmP300SpellerVisualization::cacheChangeForegroundCB, + &CBoxAlgorithmP300SpellerVisualization::cacheChangeForegroundCB, &m_flashFgColor, &m_noFlashFgColor); + this->cacheForEachIf(row, col, &CBoxAlgorithmP300SpellerVisualization::cacheChangeFontCB, + &CBoxAlgorithmP300SpellerVisualization::cacheChangeFontCB, m_flashFontDesc, m_noFlashFontDesc); + + // We now know if this flash corresponds to the current target or not, merge this to the outgoing stimulation stream + if (isTarget) + { + m_stimuliQueue.push_back(OVTK_StimulationId_Target); + flaggingStimulationSet.appendStimulation(OVTK_StimulationId_Target, stimulationSet->getStimulationDate(j), 0); + } + else + { + m_stimuliQueue.push_back(OVTK_StimulationId_NonTarget); + flaggingStimulationSet.appendStimulation(OVTK_StimulationId_NonTarget, stimulationSet->getStimulationDate(j), 0); + } + } + + // Pass the stimulation to the server also as-is. If its a flash, it can be differentiated from a 'target' spec because + // its NOT between OVTK_StimulationId_RestStart and OVTK_StimulationId_RestStop stimuli in the generated P300 timeline. + m_stimuliQueue.push_back(id); + } + m_targetFlaggingStimulationEncoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeBuffer); + } + + if (m_sequenceStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd)) + { + m_targetFlaggingStimulationEncoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeEnd); + } + + boxContext.markInputAsDeprecated(0, i); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + // --- Target stimulations + + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + if (m_lastTime >= boxContext.getInputChunkStartTime(1, i)) + { + m_targetMemoryBuffer = boxContext.getInputChunk(1, i); + m_targetStimulationDecoder->process(); + + if (m_targetStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) { } + + if (m_targetStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + IStimulationSet* stimulationSet = m_targetStimulationSet; + for (size_t j = 0; j < stimulationSet->getStimulationCount(); ++j) + { + uint64_t id = stimulationSet->getStimulationIdentifier(j); + bool target = false; + if (id >= m_rowStimulationBase && id < m_rowStimulationBase + m_nRow) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Received Target Row " << id << "\n"; + m_targetRow = int(id - m_rowStimulationBase); + target = true; + } + if (id >= m_columnStimulationBase && id < m_columnStimulationBase + m_nCol) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Received Target Column " << id << "\n"; + m_targetCol = int(id - m_columnStimulationBase); + target = true; + } + + if (target && m_targetRow != -1 && m_targetCol != -1) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Displays Target Cell\n"; + this->cacheForEachIf(m_targetRow, m_targetCol, &CBoxAlgorithmP300SpellerVisualization::cacheChangeBackgroundCB, + &CBoxAlgorithmP300SpellerVisualization::cacheChangeNullCB, &m_targetBgColor, nullptr); + this->cacheForEachIf(m_targetRow, m_targetCol, &CBoxAlgorithmP300SpellerVisualization::cacheChangeForegroundCB, + &CBoxAlgorithmP300SpellerVisualization::cacheChangeNullCB, &m_targetFgColor, nullptr); + this->cacheForEachIf(m_targetRow, m_targetCol, &CBoxAlgorithmP300SpellerVisualization::cacheChangeFontCB, + &CBoxAlgorithmP300SpellerVisualization::cacheChangeNullCB, m_targetFontDesc, nullptr); + + std::vector widgets; + this->cacheForEachIf(m_targetRow, m_targetCol, &CBoxAlgorithmP300SpellerVisualization::cacheCollectChildWidgetCB, + &CBoxAlgorithmP300SpellerVisualization::cacheCollectChildWidgetCB, &widgets, nullptr); + + // Merge the current target into the stimulation stream. It can be differentiated + // from a 'flash' spec because it IS between OVTK_StimulationId_RestStart and + // OVTK_StimulationId_RestStop stimulations in the P300 timeline. + { + m_stimuliQueue.push_back(m_targetRow + m_rowStimulationBase); + m_stimuliQueue.push_back(m_targetCol + m_columnStimulationBase); + } + + if (widgets.size() == 1) + { + if (GTK_IS_LABEL(widgets[0])) + { + std::string label; + label = gtk_label_get_text(m_target); + label += gtk_label_get_text(GTK_LABEL(widgets[0])); + gtk_label_set_text(m_target, label.c_str()); + } + else + { + this->getLogManager() << Kernel::LogLevel_Warning << "Expected label class widget... could not find a valid text to append\n"; + } + } + else + { + this->getLogManager() << Kernel::LogLevel_Warning << "Did not find a unique widget at row:" << size_t(m_targetRow) << " column:" << + size_t(m_targetCol) << "\n"; + } + + m_targetHistory.emplace_back(m_targetRow, m_targetCol); + m_lastTargetRow = m_targetRow; + m_lastTargetCol = m_targetCol; + m_targetRow = -1; + m_targetCol = -1; + } + } + } + + if (m_targetStimulationDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd)) { } + + boxContext.markInputAsDeprecated(1, i); + } + } + + // --- Selection stimulations + + for (size_t k = 2; k < 4; ++k) + { + Kernel::IAlgorithmProxy* decoder = (k == 2 ? m_rowSelectionStimulationDecoder : m_columnSelectionStimulationDecoder); + Kernel::TParameterHandler selectionMemoryBuffer( + decoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + Kernel::TParameterHandler selectionStimulationSet( + decoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + + for (size_t i = 0; i < boxContext.getInputChunkCount(k); ++i) + { + if (m_lastTime >= boxContext.getInputChunkStartTime(k, i)) + { + selectionMemoryBuffer = boxContext.getInputChunk(k, i); + decoder->process(); + + if (decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) { } + + if (decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + IStimulationSet* stimulationSet = selectionStimulationSet; + for (size_t j = 0; j < stimulationSet->getStimulationCount(); ++j) + { + uint64_t id = stimulationSet->getStimulationIdentifier(j); + bool selected = false; + if (id >= m_rowStimulationBase && id < m_rowStimulationBase + m_nRow) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Received Selected Row " << id << "\n"; + m_selectedRow = int(id - m_rowStimulationBase); + selected = true; + } + if (id >= m_columnStimulationBase && id < m_columnStimulationBase + m_nRow) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Received Selected Column " << id << "\n"; + m_selectedCol = int(id - m_columnStimulationBase); + selected = true; + } + if (id == OVTK_StimulationId_Label_00) + { + if (k == 2) { m_selectedRow = -2; } + if (k == 3) { m_selectedCol = -2; } + selected = true; + } + if (selected && m_selectedRow != -1 && m_selectedCol != -1) + { + if (m_selectedRow >= 0 && m_selectedCol >= 0) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Displays Selected Cell\n"; + this->cacheForEachIf(m_selectedRow, m_selectedCol, &CBoxAlgorithmP300SpellerVisualization::cacheChangeBackgroundCB, + &CBoxAlgorithmP300SpellerVisualization::cacheChangeNullCB, &m_selectedBgColor, nullptr); + this->cacheForEachIf(m_selectedRow, m_selectedCol, &CBoxAlgorithmP300SpellerVisualization::cacheChangeForegroundCB, + &CBoxAlgorithmP300SpellerVisualization::cacheChangeNullCB, &m_selectedFgColor, nullptr); + this->cacheForEachIf(m_selectedRow, m_selectedCol, &CBoxAlgorithmP300SpellerVisualization::cacheChangeFontCB, + &CBoxAlgorithmP300SpellerVisualization::cacheChangeNullCB, m_selectedFontDesc, nullptr); + + std::vector widgets; + this->cacheForEachIf(m_selectedRow, m_selectedCol, &CBoxAlgorithmP300SpellerVisualization::cacheCollectChildWidgetCB, + &CBoxAlgorithmP300SpellerVisualization::cacheCollectChildWidgetCB, &widgets, nullptr); + + if (widgets.size() == 1) + { + if (GTK_IS_LABEL(widgets[0])) + { + std::string label; + label = gtk_label_get_text(GTK_LABEL(widgets[0])); + if (!m_targetHistory.empty()) + { + auto it = m_targetHistory.begin(); + bool correct = (it->first == m_selectedRow && it->second == m_selectedCol); + bool halfCorrect = (it->first == m_selectedRow || it->second == m_selectedCol); + m_targetHistory.pop_front(); + std::string tmp; + if (correct) { tmp = ""; } + else if (halfCorrect) { tmp = ""; } + else { tmp = ""; } + label = tmp.append(label).append(""); + } + label = std::string(gtk_label_get_label(m_result)).append(label); + gtk_label_set_markup(m_result, label.c_str()); + } + else + { + this->getLogManager() << Kernel::LogLevel_Warning << + "Expected label class widget... could not find a valid text to append\n"; + } + } + else + { + this->getLogManager() << Kernel::LogLevel_Warning << "Did not find a unique widget at row : " << size_t(m_selectedRow) << + " column : " << size_t(m_selectedCol) << "\n"; + } + } + else + { + this->getLogManager() << Kernel::LogLevel_Trace << "Selection Rejected !\n"; + std::string label; + label = gtk_label_get_text(m_result); + label += "*"; + gtk_label_set_text(m_result, label.c_str()); + } + + m_selectedRow = -1; + m_selectedCol = -1; + } + } + } + + if (decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd)) { } + boxContext.markInputAsDeprecated(k, i); + } + } + } + + // After any possible rendering, we flush the accumulated stimuli. The default idle func is low priority, so it should be run after rendering by gtk. + if (m_idleFuncTag == 0) { m_idleFuncTag = g_idle_add(FlushCB, this); } + + return true; +} + +// _________________________________________________________________________________________________________________________________________________________ +// + +void CBoxAlgorithmP300SpellerVisualization::cacheBuildFromTable(GtkTable* table) +{ + if (table) + { + const GdkColor white = InitGDKColor(65535, 65535, 65535, 65535); + + for (GList* list = table->children; list; list = list->next) + { + GtkTableChild* child = static_cast(list->data); + + for (size_t i = child->top_attach; i < child->bottom_attach; ++i) + { + for (size_t j = child->left_attach; j < child->right_attach; ++j) + { + widget_style_t& style = m_cache[i][j]; + style.widget = child->widget; + style.childWidget = gtk_bin_get_child(GTK_BIN(child->widget)); + style.bgColor = white; + style.fgColor = white; + style.fontDesc = nullptr; + } + } + } + } +} + +void CBoxAlgorithmP300SpellerVisualization::cacheForEach(const cache_callback callback, void* data) +{ + for (auto i = m_cache.begin(); i != m_cache.end(); ++i) + { + for (auto j = i->second.begin(); j != i->second.end(); ++j) { (this->*callback)(j->second, data); } + } +} + +void CBoxAlgorithmP300SpellerVisualization::cacheForEachIf(const int iLine, const int iColumn, const cache_callback ifCB, const cache_callback elseCB, + void* ifUserData, void* elseUserData) +{ + for (auto i = m_cache.begin(); i != m_cache.end(); ++i) + { + for (auto j = i->second.begin(); j != i->second.end(); ++j) + { + const bool line = (iLine != -1); + const bool column = (iColumn != -1); + bool inLine = false; + bool inCol = false; + bool first; + + if (line && size_t(iLine) == i->first) { inLine = true; } + if (column && size_t(iColumn) == j->first) { inCol = true; } + + if (line && column) { first = inLine && inCol; } + else { first = inLine || inCol; } + + if (first) { (this->*ifCB)(j->second, ifUserData); } + else { (this->*elseCB)(j->second, elseUserData); } + } + } +} + +void CBoxAlgorithmP300SpellerVisualization::cacheChangeNullCB(widget_style_t& /*rWidgetStyle*/, void* /*data*/) { } + +void CBoxAlgorithmP300SpellerVisualization::cacheChangeBackgroundCB(widget_style_t& style, void* data) +{ + GdkColor oColor = *static_cast(data); + if (memcmp(&style.bgColor, &oColor, sizeof(GdkColor)) != 0) + { + gtk_widget_modify_bg(style.widget, GTK_STATE_NORMAL, &oColor); + style.bgColor = oColor; + } +} + +void CBoxAlgorithmP300SpellerVisualization::cacheChangeForegroundCB(widget_style_t& style, void* data) +{ + GdkColor oColor = *static_cast(data); + if (memcmp(&style.fgColor, &oColor, sizeof(GdkColor)) != 0) + { + gtk_widget_modify_fg(style.childWidget, GTK_STATE_NORMAL, &oColor); + style.fgColor = oColor; + } +} + +void CBoxAlgorithmP300SpellerVisualization::cacheChangeFontCB(widget_style_t& style, void* data) +{ + auto* pFontDescription = static_cast(data); + if (style.fontDesc != pFontDescription) + { + gtk_widget_modify_font(style.childWidget, pFontDescription); + style.fontDesc = pFontDescription; + } +} + +void CBoxAlgorithmP300SpellerVisualization::cacheCollectWidgetCB(widget_style_t& style, void* data) +{ + if (data) { (static_cast*>(data))->push_back(style.widget); } +} + +void CBoxAlgorithmP300SpellerVisualization::cacheCollectChildWidgetCB(widget_style_t& style, void* data) +{ + if (data) { (static_cast*>(data))->push_back(style.childWidget); } +} + +// Note that we don't need concurrency control here as gtk callbacks run in the main thread +void CBoxAlgorithmP300SpellerVisualization::flushQueue() +{ + for (const auto& stimulation : m_stimuliQueue) { m_stimulusSender->sendStimulation(stimulation); } + m_stimuliQueue.clear(); + + // This function will be automatically removed after completion, so set to 0 + m_idleFuncTag = 0; +} +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300SpellerVisualization.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300SpellerVisualization.h new file mode 100755 index 0000000..3187bd2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCBoxAlgorithmP300SpellerVisualization.h @@ -0,0 +1,184 @@ +#pragma once +#include "../ovp_defines.h" +#include +#include +#include + +#include +#include +#include +#include "../utils.h" + +namespace TCPTagging { +class IStimulusSender; // fwd declare +} // namespace TCPTagging + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +class CBoxAlgorithmP300SpellerVisualization final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_P300SpellerVisualization) + +private: + + using widget_style_t = struct + { + GtkWidget* widget; + GtkWidget* childWidget; + GdkColor bgColor; + GdkColor fgColor; + PangoFontDescription* fontDesc; + }; + + typedef void (CBoxAlgorithmP300SpellerVisualization::*cache_callback)(widget_style_t& style, void* data); + + void cacheBuildFromTable(GtkTable* table); + void cacheForEach(cache_callback callback, void* data); + void cacheForEachIf(int iLine, int iColumn, cache_callback ifCB, cache_callback elseCB, void* ifUserData, void* elseUserData); + void cacheChangeNullCB(widget_style_t& style, void* data); + void cacheChangeBackgroundCB(widget_style_t& style, void* data); + void cacheChangeForegroundCB(widget_style_t& style, void* data); + void cacheChangeFontCB(widget_style_t& style, void* data); + void cacheCollectWidgetCB(widget_style_t& style, void* data); + void cacheCollectChildWidgetCB(widget_style_t& style, void* data); + +public: + + void flushQueue(); // Sends all accumulated stimuli to the TCP Tagging + +protected: + + CString m_interfaceFilename; + uint64_t m_rowStimulationBase = 0; + uint64_t m_columnStimulationBase = 0; + + GdkColor m_flashBgColor = InitGDKColor(0, 6554, 6554, 6554); + GdkColor m_flashFgColor = InitGDKColor(0, 65535, 65535, 65535); + uint64_t m_flashFontSize = 100; + PangoFontDescription* m_flashFontDesc = nullptr; + GdkColor m_noFlashBgColor = InitGDKColor(0, 0, 0, 0); + GdkColor m_noFlashFgColor = InitGDKColor(0, 32768, 32768, 32768); + uint64_t m_noFlashFontSize = 75; + PangoFontDescription* m_noFlashFontDesc = nullptr; + GdkColor m_targetBgColor = InitGDKColor(0, 6554, 26214, 6554); + GdkColor m_targetFgColor = InitGDKColor(0, 39321, 65535, 39321); + uint64_t m_targetFontSize = 100; + PangoFontDescription* m_targetFontDesc = nullptr; + GdkColor m_selectedBgColor = InitGDKColor(0, 45875, 13107, 13107); + GdkColor m_selectedFgColor = InitGDKColor(0, 19661, 6554, 6554); + uint64_t m_selectedFontSize = 100; + PangoFontDescription* m_selectedFontDesc = nullptr; + +private: + + Kernel::IAlgorithmProxy* m_sequenceStimulationDecoder = nullptr; + Kernel::IAlgorithmProxy* m_targetStimulationDecoder = nullptr; + Kernel::IAlgorithmProxy* m_targetFlaggingStimulationEncoder = nullptr; + Kernel::IAlgorithmProxy* m_rowSelectionStimulationDecoder = nullptr; + Kernel::IAlgorithmProxy* m_columnSelectionStimulationDecoder = nullptr; + Kernel::TParameterHandler m_sequenceMemoryBuffer; + Kernel::TParameterHandler m_targetMemoryBuffer; + Kernel::TParameterHandler m_targetFlaggingStimulationSet; + Kernel::TParameterHandler m_sequenceStimulationSet; + Kernel::TParameterHandler m_targetStimulationSet; + Kernel::TParameterHandler m_targetFlaggingMemoryBuffer; + uint64_t m_lastTime = 0; + + GtkBuilder* m_mainWidgetInterface = nullptr; + GtkBuilder* m_toolbarWidgetInterface = nullptr; + GtkWidget* m_mainWindow = nullptr; + GtkWidget* m_toolbarWidget = nullptr; + GtkTable* m_table = nullptr; + GtkLabel* m_result = nullptr; + GtkLabel* m_target = nullptr; + uint64_t m_nRow = 0; + uint64_t m_nCol = 0; + + int m_lastTargetRow = 0; + int m_lastTargetCol = 0; + int m_targetRow = 0; + int m_targetCol = 0; + int m_selectedRow = 0; + int m_selectedCol = 0; + + bool m_tableInitialized = false; + + // @todo refactor to std::pair ? + std::map> m_cache; + std::list> m_targetHistory; + + // TCP Tagging + std::vector m_stimuliQueue; + guint m_idleFuncTag = 0; + TCPTagging::IStimulusSender* m_stimulusSender = nullptr; + + VisualizationToolkit::IVisualizationContext* m_visualizationCtx = nullptr; +}; + +class CBoxAlgorithmP300SpellerVisualizationDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("P300 Speller Visualization"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Visualizes the alphabet for P300 spellers"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Visualization/Presentation"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-select-font"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_P300SpellerVisualization; } + IPluginObject* create() override { return new CBoxAlgorithmP300SpellerVisualization; } + + bool hasFunctionality(const EPluginFunctionality functionality) const override { return functionality == EPluginFunctionality::Visualization; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Sequence stimulations", OV_TypeId_Stimulations); + prototype.addInput("Target stimulations", OV_TypeId_Stimulations); + prototype.addInput("Row selection stimulations", OV_TypeId_Stimulations); + prototype.addInput("Column selection stimulations", OV_TypeId_Stimulations); + + prototype.addOutput("Target / Non target flagging (deprecated)", OV_TypeId_Stimulations); + + prototype.addSetting("Interface filename", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-speller.ui"); + prototype.addSetting("Row stimulation base", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_01"); + prototype.addSetting("Column stimulation base", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_07"); + + prototype.addSetting("Flash background color", OV_TypeId_Color, "10,10,10"); + prototype.addSetting("Flash foreground color", OV_TypeId_Color, "100,100,100"); + prototype.addSetting("Flash font size", OV_TypeId_Integer, "100"); + + prototype.addSetting("No flash background color", OV_TypeId_Color, "0,0,0"); + prototype.addSetting("No flash foreground color", OV_TypeId_Color, "50,50,50"); + prototype.addSetting("No flash font size", OV_TypeId_Integer, "75"); + + prototype.addSetting("Target background color", OV_TypeId_Color, "10,40,10"); + prototype.addSetting("Target foreground color", OV_TypeId_Color, "60,100,60"); + prototype.addSetting("Target font size", OV_TypeId_Integer, "100"); + + prototype.addSetting("Selected background color", OV_TypeId_Color, "70,20,20"); + prototype.addSetting("Selected foreground color", OV_TypeId_Color, "30,10,10"); + prototype.addSetting("Selected font size", OV_TypeId_Integer, "100"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_P300SpellerVisualizationDesc) +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCDisplayCueImage.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCDisplayCueImage.cpp new file mode 100644 index 0000000..f402b5f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCDisplayCueImage.cpp @@ -0,0 +1,492 @@ +#include "ovpCDisplayCueImage.h" + +#include // std::min + +#include + +#if defined TARGET_OS_Linux + #include +#endif + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +// This callback flushes all accumulated stimulations to the TCP Tagging +// after the rendering has completed. +static gboolean DisplayCueImageFlushCB(gpointer data) +{ + reinterpret_cast(data)->flushQueue(); + return false; // Only run once +} + +static gboolean DisplayCueImageResizeCB(GtkWidget* /*widget*/, GtkAllocation* allocation, gpointer data) +{ + reinterpret_cast(data)->resize(size_t(allocation->width), size_t(allocation->height)); + return FALSE; +} + +static gboolean DisplayCueImageRedrawCB(GtkWidget* /*widget*/, GdkEventExpose* /*event*/, gpointer data) +{ + reinterpret_cast(data)->redraw(); + return TRUE; +} + +bool CDisplayCueImage::initialize() +{ + m_idleFuncTag = 0; + m_stimulusSender = nullptr; + //>>>> Reading Settings: + + //Number of Cues: + m_numberOfCues = (getStaticBoxContext().getSettingCount() - NON_CUE_SETTINGS_COUNT) / 2; + + //Do we display the images in full screen? + m_fullScreen = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_scaleImages = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + //Clear screen stimulation: + m_clearScreenStimulation = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + + //Stimulation ID and images file names for each cue + m_imageNames.resize(m_numberOfCues); + m_stimulationsIds.resize(m_numberOfCues); + for (size_t i = 0; i < m_numberOfCues; ++i) + { + m_imageNames[i] = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), NON_CUE_SETTINGS_COUNT + 2 * i); + m_stimulationsIds[i] = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), NON_CUE_SETTINGS_COUNT + 2 * i + 1); + } + + //>>>> Initialisation + m_stimulationDecoder.initialize(*this, 0); + m_stimulationEncoder.initialize(*this, 0); + + //load the gtk builder interface + m_builderInterface = gtk_builder_new(); + if (!m_builderInterface) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error << "Couldn't load the interface !"; + return false; + } + + const CString uiFile = Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-DisplayCueImage.ui"; + if (!gtk_builder_add_from_file(m_builderInterface, uiFile, nullptr)) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error << "Could not load the .ui file " << uiFile << "\n"; + return false; + } + + gtk_builder_connect_signals(m_builderInterface, nullptr); + + m_drawingArea = GTK_WIDGET(gtk_builder_get_object(m_builderInterface, "DisplayCueImageDrawingArea")); + g_signal_connect(G_OBJECT(m_drawingArea), "expose_event", G_CALLBACK(DisplayCueImageRedrawCB), this); + g_signal_connect(G_OBJECT(m_drawingArea), "size-allocate", G_CALLBACK(DisplayCueImageResizeCB), this); + + //set widget bg color + gtk_widget_modify_bg(m_drawingArea, GTK_STATE_NORMAL, &m_backgroundColor); + gtk_widget_modify_bg(m_drawingArea, GTK_STATE_PRELIGHT, &m_backgroundColor); + gtk_widget_modify_bg(m_drawingArea, GTK_STATE_ACTIVE, &m_backgroundColor); + + gtk_widget_modify_fg(m_drawingArea, GTK_STATE_NORMAL, &m_foregroundColor); + gtk_widget_modify_fg(m_drawingArea, GTK_STATE_PRELIGHT, &m_foregroundColor); + gtk_widget_modify_fg(m_drawingArea, GTK_STATE_ACTIVE, &m_foregroundColor); + + //Load the pictures: + m_originalPictures.resize(m_numberOfCues); + m_scaledPictures.resize(m_numberOfCues); + + for (size_t i = 0; i < m_numberOfCues; ++i) + { + m_originalPictures[i] = gdk_pixbuf_new_from_file_at_size(m_imageNames[i], -1, -1, nullptr); + m_scaledPictures[i] = nullptr; + if (!m_originalPictures[i]) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error << "Error couldn't load resource file : " << m_imageNames[i] + << + "!\n"; + return false; + } + } + m_stimuliQueue.clear(); + + m_stimulusSender = TCPTagging::CreateStimulusSender(); + + if (!m_stimulusSender->connect("localhost", "15361")) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Unable to connect to AS's TCP Tagging plugin, stimuli wont be forwarded.\n"; + } + + if (m_fullScreen) + { + GtkWidget* window = gtk_widget_get_toplevel(m_drawingArea); + gtk_window_fullscreen(GTK_WINDOW(window)); + gtk_widget_show(window); + + // @fixme small mem leak? + GdkCursor* cursor = gdk_cursor_new(GDK_BLANK_CURSOR); + gdk_window_set_cursor(gtk_widget_get_window(window), cursor); + } + else + { + m_visualizationCtx = dynamic_cast(this->createPluginObject(OVP_ClassId_Plugin_VisualizationCtx)); + m_visualizationCtx->setWidget(*this, m_drawingArea); + } + + // Invalidate the drawing area in order to get the image resize already called at this point. The actual run will be smoother. + if (GTK_WIDGET(m_drawingArea)->window) { gdk_window_invalidate_rect(GTK_WIDGET(m_drawingArea)->window, nullptr, true); } + + return true; +} + +bool CDisplayCueImage::uninitialize() +{ + // Remove the possibly dangling idle loop. + if (m_idleFuncTag) + { + g_source_remove(m_idleFuncTag); + m_idleFuncTag = 0; + } + + m_stimulationDecoder.uninitialize(); + m_stimulationEncoder.uninitialize(); + + if (m_stimulusSender) + { + delete m_stimulusSender; + m_stimulusSender = nullptr; + } + + // Close the full screen + if (m_fullScreen) + { + GtkWidget* window = gtk_widget_get_toplevel(m_drawingArea); + gtk_window_unfullscreen(GTK_WINDOW(window)); + gtk_widget_destroy(window); + } + + //destroy drawing area + if (m_drawingArea) + { + gtk_widget_destroy(m_drawingArea); + m_drawingArea = nullptr; + } + + // unref the xml file as it's not needed anymore + if (m_builderInterface) + { + g_object_unref(G_OBJECT(m_builderInterface)); + m_builderInterface = nullptr; + } + + m_stimulationsIds.clear(); + m_imageNames.clear(); + + if (!m_originalPictures.empty()) + { + for (size_t i = 0; i < m_numberOfCues; ++i) { if (m_originalPictures[i]) { g_object_unref(G_OBJECT(m_originalPictures[i])); } } + m_originalPictures.clear(); + } + + if (!m_scaledPictures.empty()) + { + for (size_t i = 0; i < m_numberOfCues; ++i) { if (m_scaledPictures[i]) { g_object_unref(G_OBJECT(m_scaledPictures[i])); } } + m_scaledPictures.clear(); + } + + if (m_visualizationCtx) + { + this->releasePluginObject(m_visualizationCtx); + m_visualizationCtx = nullptr; + } + + return true; +} + +bool CDisplayCueImage::processClock(Kernel::CMessageClock& /*msg*/) +{ + Kernel::IBoxIO* boxIO = getBoxAlgorithmContext()->getDynamicBoxContext(); + m_stimulationEncoder.getInputStimulationSet()->clear(); + + if (this->getPlayerContext().getCurrentTime() == 0) + { + // Always send header first + m_stimulationEncoder.encodeHeader(); + boxIO->markOutputAsReadyToSend(0, 0, 0); + } + + if (m_imageDrawn) + { + // this is first redraw() for that image or clear screen + // we send a stimulation to signal it. + // @note this practice is deprecated, the TCP Tagging should be used. We pass the stimulus here for compatibility. + + if (m_drawnImageId >= 0) + { + // it was a image + m_stimulationEncoder.getInputStimulationSet()->appendStimulation(m_stimulationsIds[m_drawnImageId], this->getPlayerContext().getCurrentTime(), 0); + } + else + { + // it was a clear_screen + m_stimulationEncoder.getInputStimulationSet()->appendStimulation(m_clearScreenStimulation, this->getPlayerContext().getCurrentTime(), 0); + } + + m_imageDrawn = false; + + if (m_drawnImageId != m_requestedImageId) + { + // We must be late... + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Warning << + "One image may have been skipped => we must be late...\n"; + } + } + + m_stimulationEncoder.encodeBuffer(); + boxIO->markOutputAsReadyToSend(0, m_lastOutputChunkDate, this->getPlayerContext().getCurrentTime()); + m_lastOutputChunkDate = this->getPlayerContext().getCurrentTime(); + + bool stimulusMatchedBefore = false; + + // We check if some images must be displayed + for (size_t stim = 0; stim < m_pendingStimulationSet.getStimulationCount();) + { + const uint64_t date = m_pendingStimulationSet.getStimulationDate(stim); + const uint64_t time = this->getPlayerContext().getCurrentTime(); + if (date < time) + { + const uint64_t id = m_pendingStimulationSet.getStimulationIdentifier(stim); + bool stimulusMatchedNow = false; + if (id == m_clearScreenStimulation) + { + if (m_imageRequested) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_ImportantWarning << + "Clear screen was received before previous cue image in slot " << m_requestedImageId + 1 << " was displayed!!\n"; + } + m_imageRequested = true; + stimulusMatchedBefore = true; + stimulusMatchedNow = true; + m_requestedImageId = -1; + } + else + { + for (size_t i = 0; i < m_numberOfCues; ++i) + { + if (id == m_stimulationsIds[i]) + { + if (m_imageRequested) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_ImportantWarning << "Previous request of slot " << + m_requestedImageId + 1 << " image was replaced by request for slot " << i + 1 << + " => Not enough time between two images!!\n"; + } + m_imageRequested = true; + stimulusMatchedBefore = true; + stimulusMatchedNow = true; + m_requestedImageId = i; + break; + } + } + } + + if (stimulusMatchedNow) + { + // Queue the recognized stimulation to TCP Tagging to be sent after rendering + const uint64_t sentStimulation = (m_requestedImageId >= 0 ? m_stimulationsIds[m_requestedImageId] : m_clearScreenStimulation); + m_stimuliQueue.push_back(sentStimulation); + } + else + { + // Pass unrecognized stimulations to TCP Tagging. Be careful when modifying the code that the + // stimuli received by AS keep their original time order despite the delays introduced to rendered stimuli. + + if (stimulusMatchedBefore) + { + // We have queued a cue to be drawn, so we should delay this stimulation to TCP Tagging to be processed after the cue rendering to keep the time order + m_stimuliQueue.push_back(id); + } + else + { + // We have not yet queued anything to be drawn, so we can forward immediately. + m_stimulusSender->sendStimulation(id); + } + } + + const double delay = CTime(time - date).toSeconds() * 1000; // delay in ms + if (delay > 50) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Warning << "Stimulation " << id << + " was late in processClock() : " << delay << " ms \n"; + } + + m_pendingStimulationSet.removeStimulation(stim); + } + else + { + // Stim is still in the future, skip it for now + stim++; + } + } + + // We should show the cue image now. How this works: + // - The gtk drawing area is invalidated + // - Gtk will request a redraw + // - The redraw puts in instructions to render the new image + // - The corresponding stimulation is buffered to TCP Tagging + // - Callback to flush the TCP Tagging buffer is registered to be run by gtk once after the rendering + // - Gtk renders + // - Callback to flush the TCP Tagging buffer is called by gtk + if (m_imageRequested && GTK_WIDGET(m_drawingArea)->window) + { + // this will trigger the callback redraw(). Since the draw will happen after the exit from this function, no point calling this in the loop above + gdk_window_invalidate_rect(GTK_WIDGET(m_drawingArea)->window, nullptr, true); + } + + return true; +} + +bool CDisplayCueImage::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CDisplayCueImage::process() +{ + Kernel::IBoxIO* boxIO = getBoxAlgorithmContext()->getDynamicBoxContext(); + + // We decode and save the received stimulations. + for (size_t input = 0; input < getBoxAlgorithmContext()->getStaticBoxContext()->getInputCount(); ++input) + { + for (size_t chunk = 0; chunk < boxIO->getInputChunkCount(input); ++chunk) + { + m_stimulationDecoder.decode(chunk, true); + if (m_stimulationDecoder.isHeaderReceived()) + { + // nop + } + if (m_stimulationDecoder.isBufferReceived()) + { + for (size_t stim = 0; stim < m_stimulationDecoder.getOutputStimulationSet()->getStimulationCount(); ++stim) + { + // We always add the stimulations to the set to allow passing them to TCP Tagging in order in processClock() + const uint64_t id = m_stimulationDecoder.getOutputStimulationSet()->getStimulationIdentifier(stim); + const uint64_t date = m_stimulationDecoder.getOutputStimulationSet()->getStimulationDate(stim); + const uint64_t duration = m_stimulationDecoder.getOutputStimulationSet()->getStimulationDuration(stim); + + const uint64_t time = this->getPlayerContext().getCurrentTime(); + if (date < time) + { + const double delay = CTime(time - date).toSeconds() * 1000; //delay in ms + if (delay > 50) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Warning << "Stimulation " << id << + " was received late: " << delay << " ms \n"; + } + } + + if (date < boxIO->getInputChunkStartTime(input, chunk)) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Input Stimulation Date before beginning of the buffer\n"; + } + + m_pendingStimulationSet.appendStimulation(id, date, duration); + } + } + } + } + + return true; +} + +//Callback called by GTK +void CDisplayCueImage::redraw() +{ + if (m_requestedImageId >= 0) { drawCuePicture(m_requestedImageId); } + if (m_imageRequested) + { + m_imageRequested = false; + m_imageDrawn = true; + m_drawnImageId = m_requestedImageId; + + // Set the handler to push out the queued stims after the actual rendering + if (m_idleFuncTag == 0) { m_idleFuncTag = g_idle_add(DisplayCueImageFlushCB, this); } + } +} + +void CDisplayCueImage::drawCuePicture(const size_t cueID) +{ + const gint width = m_drawingArea->allocation.width; + const gint height = m_drawingArea->allocation.height; + + // Center image + const gint x = (width / 2) - gdk_pixbuf_get_width(m_scaledPictures[cueID]) / 2; + const gint y = (height / 2) - gdk_pixbuf_get_height(m_scaledPictures[cueID]) / 2; + gdk_draw_pixbuf(m_drawingArea->window, nullptr, m_scaledPictures[cueID], 0, 0, x, y, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); +} + +void CDisplayCueImage::resize(const size_t width, const size_t height) +{ + for (auto& i : m_scaledPictures) { if (i) { g_object_unref(G_OBJECT(i)); } } + + if (!m_scaleImages) + { + for (size_t i = 0; i < m_scaledPictures.size(); ++i) { m_scaledPictures[i] = gdk_pixbuf_copy(m_originalPictures[i]); } + return; + } + + // Scale + if (m_fullScreen) + { + for (size_t i = 0; i < m_scaledPictures.size(); ++i) + { + // Keep aspect ratio when scaling + const int picWidth = gdk_pixbuf_get_width(m_originalPictures[i]), + picHeight = gdk_pixbuf_get_height(m_originalPictures[i]); + + const double scaleWidth = width / double(picWidth), + scaleHeight = height / double(picHeight), + scaleMin = std::min(scaleWidth, scaleHeight); + + const int newWidth = int(scaleMin * picWidth), + newHeight = int(scaleMin * picHeight); + + m_scaledPictures[i] = gdk_pixbuf_scale_simple(m_originalPictures[i], newWidth, newHeight, GDK_INTERP_BILINEAR); + } + } + else + { + const auto x = float(width < 64 ? 64 : width), + y = float(height < 64 ? 64 : height); + for (size_t i = 0; i < m_scaledPictures.size(); ++i) + { + auto picWidth = float(gdk_pixbuf_get_width(m_originalPictures[i])), + picHeight = float(gdk_pixbuf_get_height(m_originalPictures[i])); + if ((x / picWidth) < (y / picHeight)) + { + picHeight = x * picHeight / (3 * picWidth); + picWidth = x / 3; + } + else + { + picWidth = y * picWidth / (3 * picHeight); + picHeight = y / 3; + } + m_scaledPictures[i] = gdk_pixbuf_scale_simple(m_originalPictures[i], int(picWidth), int(picHeight), GDK_INTERP_BILINEAR); + } + } +} + +// Note that we don't need concurrency control here as gtk callbacks run in the main thread +void CDisplayCueImage::flushQueue() +{ + for (const auto& stimulation : m_stimuliQueue) { m_stimulusSender->sendStimulation(stimulation); } + m_stimuliQueue.clear(); + + // This function will be automatically removed after completion, so set to 0 + m_idleFuncTag = 0; +} + +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCDisplayCueImage.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCDisplayCueImage.h new file mode 100644 index 0000000..8bc4cbb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCDisplayCueImage.h @@ -0,0 +1,209 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include "../utils.h" + +namespace TCPTagging { +class IStimulusSender; // fwd declare +} // namespace TCPTagging + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +class CDisplayCueImage final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + uint64_t getClockFrequency() override { return (128LL << 32); } // 128hz + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + void redraw(); + void resize(size_t width, size_t height); + + _IsDerivedFromClass_Final_(IBoxAlgorithm, OVP_ClassId_DisplayCueImage) + + void flushQueue(); // Sends all accumulated stimuli to the TCP Tagging + + static const size_t NON_CUE_SETTINGS_COUNT = 3; // fullscreen + scale + clear + +protected: + + void drawCuePicture(size_t cueID); + + //The Builder handler used to create the interface + GtkBuilder* m_builderInterface = nullptr; + GtkWidget* m_mainWindow = nullptr; + GtkWidget* m_drawingArea = nullptr; + + Toolkit::TStimulationDecoder m_stimulationDecoder; + Toolkit::TStimulationEncoder m_stimulationEncoder; + + // For the display of the images: + bool m_imageRequested = false; //when true: a new image must be drawn + int m_requestedImageId = -1; //ID of the requested image. -1 => clear the screen + + bool m_imageDrawn = false; //when true: the new image has been drawn + int m_drawnImageId = -1; //ID of the drawn image. -1 => clear the screen + + // Data corresponding to each cue image. Could be refactored to a vector of structs. + std::vector m_originalPictures; + std::vector m_scaledPictures; + std::vector m_stimulationsIds; + std::vector m_imageNames; + + GdkColor m_backgroundColor = InitGDKColor(0, 0, 0, 0); + GdkColor m_foregroundColor = InitGDKColor(0, 65535, 65535, 65535); + + //Settings + size_t m_numberOfCues = 0; + uint64_t m_clearScreenStimulation = 0; + bool m_fullScreen = false; + bool m_scaleImages = false; + + //Start and end time of the last buffer + uint64_t m_startTime = 0; + uint64_t m_endTime = 0; + uint64_t m_lastOutputChunkDate = 0; + + //We save the received stimulations + CStimulationSet m_pendingStimulationSet; + + // For queuing stimulations to the TCP Tagging + std::vector m_stimuliQueue; + guint m_idleFuncTag = 0; + TCPTagging::IStimulusSender* m_stimulusSender = nullptr; + +private: + VisualizationToolkit::IVisualizationContext* m_visualizationCtx = nullptr; +}; + +class CDisplayCueImageListener final : public Toolkit::TBoxListener +{ +public: + + bool onSettingAdded(Kernel::IBox& box, const size_t index) override + { + const size_t previousCues = ((index - 1) - CDisplayCueImage::NON_CUE_SETTINGS_COUNT) / 2 + 1; + const size_t cueNumber = previousCues + 1; + + std::stringstream ss; + ss << std::setfill('0') << std::setw(2) << cueNumber; + + std::string value = "${Path_Data}/plugins/simple-visualization/p300-magic-card/" + ss.str() + ".png"; + + box.setSettingDefaultValue(index, value.c_str()); + box.setSettingValue(index, value.c_str()); + + value = "OVTK_StimulationId_Label_" + ss.str(); + box.addSetting("", OV_TypeId_Stimulation, value.c_str()); + box.setSettingDefaultValue(index + 1, value.c_str()); + box.setSettingValue(index + 1, value.c_str()); + + checkSettingNames(box); + + return true; + } + + bool onSettingRemoved(Kernel::IBox& box, const size_t index) override + { + // Remove also the associated setting in the other slot + const size_t indexNumber = (index - CDisplayCueImage::NON_CUE_SETTINGS_COUNT); + + if (indexNumber % 2 == 0) + { + // This was the 'cue image' setting, remove 'stimulation setting' + // when onSettingRemoved is called, index has already been removed, so using it will effectively mean 'remove next setting'. + box.removeSetting(index); + } + else + { + // This was the 'stimulation setting'. Remove the 'cue image' setting. + box.removeSetting(index - 1); + } + + checkSettingNames(box); + + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) + +private: + + // This function is used to make sure the setting names and types are correct + bool checkSettingNames(Kernel::IBox& box) const + { + for (size_t i = CDisplayCueImage::NON_CUE_SETTINGS_COUNT; i < box.getSettingCount() - 1; i += 2) + { + const std::string idx = std::to_string(i / 2); + box.setSettingName(i, ("Cue Image " + idx).c_str()); + box.setSettingType(i, OV_TypeId_Filename); + box.setSettingName(i + 1, ("Stimulation " + idx).c_str()); + box.setSettingType(i + 1, OV_TypeId_Stimulation); + } + return true; + } +}; + +/** + * Plugin's description + */ +class CDisplayCueImageDesc final : public IBoxAlgorithmDesc +{ +public: + CString getName() const override { return CString("Display cue image"); } + CString getAuthorName() const override { return CString("Joan Fruitet, Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("Inria Sophia, Inria Rennes"); } + CString getShortDescription() const override { return CString("Display cue images when receiving stimulations"); } + + CString getDetailedDescription() const override + { + return CString("Display cue images when receiving specified stimulations. Forwards the stimulations to the AS using TCP Tagging."); + } + + CString getCategory() const override { return CString("Visualization/Presentation"); } + CString getVersion() const override { return CString("1.2"); } + void release() override { } + CIdentifier getCreatedClass() const override { return OVP_ClassId_DisplayCueImage; } + + CString getStockItemName() const override { return CString("gtk-fullscreen"); } + IPluginObject* create() override { return new CDisplayCueImage(); } + IBoxListener* createBoxListener() const override { return new CDisplayCueImageListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool hasFunctionality(const EPluginFunctionality functionality) const override { return functionality == EPluginFunctionality::Visualization; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Stimulations", OV_TypeId_Stimulations); + prototype.addOutput("Stimulations (deprecated)", OV_TypeId_Stimulations); + prototype.addSetting("Display images in full screen", OV_TypeId_Boolean, "false"); + prototype.addSetting("Scale images to fit", OV_TypeId_Boolean, "false"); + prototype.addSetting("Clear screen Stimulation", OV_TypeId_Stimulation, "OVTK_StimulationId_VisualStimulationStop"); + prototype.addSetting("Cue Image 1", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/p300-magic-card/01.png"); + prototype.addSetting("Stimulation 1", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_01"); + prototype.addFlag(Kernel::BoxFlag_CanAddSetting); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_DisplayCueImageDesc) +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCGrazMultiVisualization.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCGrazMultiVisualization.cpp new file mode 100644 index 0000000..9249de7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCGrazMultiVisualization.cpp @@ -0,0 +1,710 @@ +#include "ovpCGrazMultiVisualization.h" +#include "../utils.h" + +#include // std::min, max +#include +#include +#include +#include // greater +#include +#include +#include +#include + +#if defined TARGET_OS_Linux +#include +#endif + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +//****************** +//***** STATIC ***** +//****************** +//--------------------------------------------------------------------------------------------------- +static gboolean FlushCB(gpointer data) +{ + reinterpret_cast(data)->flushQueue(); + return FALSE; // Only run once +} +//--------------------------------------------------------------------------------------------------- + +// \remarks spend a lot of time with one problem DON'T USE LOG MANAGER IN FONCTION CALLED BY CALLBACK. Why ? Because OpenViBE +//--------------------------------------------------------------------------------------------------- +static gboolean ResizeCB(GtkWidget* /*widget*/, GtkAllocation* allocation, gpointer data) +{ + reinterpret_cast(data)->resize(size_t(allocation->width), size_t(allocation->height)); + return FALSE; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +static gboolean RedrawCB(GtkWidget* /*widget*/, GdkEventExpose* /*event*/, gpointer data) +{ + reinterpret_cast(data)->redraw(); + return TRUE; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +/// Run scale command with the good size if you want to keep the proportion of the original pixbuf. +/// The pixbuf. +/// The new width. +/// The new height. +/// True if you wan't to keep ratio of pixbuf. +/// True If you select the size min when you keep ratio. +/// The gdk_pixbuf_scale_simple command. +static GdkPixbuf* RescalePixbuf(const GdkPixbuf* in, const int newW, const int newH, const bool keepRatio = true, const bool min = true) +{ + if (!in || newW <= 0 || newH <= 0) { return nullptr; } + if (keepRatio) + { + const double scaleW = double(newW) / double(gdk_pixbuf_get_width(in)), + scaleH = double(newH) / double(gdk_pixbuf_get_height(in)), + scale = min ? MIN(scaleW, scaleH) : MAX(scaleW, scaleH); + return gdk_pixbuf_scale_simple(in, int(scale * gdk_pixbuf_get_width(in)), int(scale * gdk_pixbuf_get_height(in)), GDK_INTERP_BILINEAR); + } + return gdk_pixbuf_scale_simple(in, newW, newH, GDK_INTERP_BILINEAR); +} +//--------------------------------------------------------------------------------------------------- + +//****************************** +//***** OPENVIBE FUNCTIONS ***** +//****************************** +//--------------------------------------------------------------------------------------------------- +bool CGrazMultiVisualization::initialize() +{ + //***** Codecs ***** + m_stimDecoder.initialize(*this, 0); + m_classifDecoder.initialize(*this, 1); + m_barSizeEncoder.initialize(*this, 0); + m_confusionEncoder.initialize(*this, 1); + m_iStim = m_stimDecoder.getOutputStimulationSet(); + m_iMatrix = m_classifDecoder.getOutputMatrix(); + m_oBarSize = m_barSizeEncoder.getInputMatrix(); + m_oConfusion = m_confusionEncoder.getInputMatrix(); + + //***** Settings ***** + m_showInstruction = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_feedbackMode = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_delayFeedback = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + m_showAccuracy = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + m_nbPredictionsMin = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + + m_nbModality = (getStaticBoxContext().getSettingCount() - m_NonModalitySettingsCount) / 2; + m_barScales.resize(m_nbModality); + for (auto& s : m_barScales) { s = 0; } + std::vector paths; + paths.reserve(m_nbModality + 1); + m_stimlist.reserve(m_nbModality); + + size_t idx = m_NonModalitySettingsCount - 1; //the last non modality setting is for the none instruction feedback image + paths.emplace_back(CString(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), idx++)).toASCIIString()); + + //Stimulation ID and images file names for each modality + for (size_t i = 0; i < m_nbModality; ++i) + { + m_stimlist.emplace_back(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), idx++))); + paths.emplace_back(CString(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), idx++)).toASCIIString()); + } + + m_oConfusion->resize(m_nbModality, m_nbModality); // Confusion Matrix + m_oBarSize->resize(m_nbModality); // Bar Size Matrix + + //this->getLogManager() << Kernel::LogLevel_Warning << infos(); + //this->getLogManager() << Kernel::LogLevel_Warning << "Paths : \n"; + //for (const auto& p : paths) { this->getLogManager() << Kernel::LogLevel_Warning << p << "\n"; } + + OV_ERROR_UNLESS_KRF(m_nbPredictionsMin > 0, "Number of predictions to integrate : " << m_nbPredictionsMin << " (expected value > 1)\n", + Kernel::ErrorType::BadSetting); + OV_ERROR_UNLESS_KRF(initImages(paths), "Error: couldn't load resource files!\n", Kernel::ErrorType::BadProcessing); + paths.clear(); + OV_ERROR_UNLESS_KRF(initWindow(), "Error: couldn't load the interface!\n", Kernel::ErrorType::BadProcessing); + + + //***** TCP Tagging ***** + m_stimulusSender = nullptr; + m_idleFuncTag = 0; + m_stimuliQueue.clear(); + m_stimulusSender = TCPTagging::CreateStimulusSender(); + + if (!m_stimulusSender->connect("localhost", "15361")) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Unable to connect to AS's TCP Tagging plugin, stimuli wont be forwarded.\n"; + } + //this->getLogManager() << Kernel::LogLevel_Warning << infos() << "\n"; + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CGrazMultiVisualization::uninitialize() +{ + //***** Print Confusion Matrix ***** + this->getLogManager() << Kernel::LogLevel_Info << "Confusion Matrix : \n"; + const double* buffer = m_oConfusion->getBuffer(); + std::stringstream ss; + ss << std::setfill('0'); + size_t idx = 0; + size_t predictions = 0, good = 0; + + for (size_t i = 0; i < m_nbModality; ++i) + { + for (size_t j = 0; j < m_nbModality; ++j) + { + ss.str(std::string()); + const int val = int(buffer[idx++]); + ss << std::setw(3) << val; + predictions += val; + this->getLogManager() << ss.str() << " "; + if (i == j) { good += val; } + } + this->getLogManager() << "\n"; + } + ss.str(std::string()); + ss << "Accuracy = " << std::fixed << std::setprecision(1) << (predictions == 0 ? 0.0 : 100.0 * double(good) / double(predictions)) << "\n"; + this->getLogManager() << ss.str(); + + //***** Codecs ***** + m_iStim = nullptr; + m_iMatrix = nullptr; + m_oBarSize = nullptr; + m_oConfusion = nullptr; + m_stimDecoder.uninitialize(); + m_classifDecoder.uninitialize(); + m_barSizeEncoder.uninitialize(); + m_confusionEncoder.uninitialize(); + + //***** Images ***** + if (m_originalBar) { g_object_unref(G_OBJECT(m_originalBar)); } + if (m_bar) { g_object_unref(G_OBJECT(m_bar)); } + + for (size_t i = 0; i < m_originalImgs.size(); ++i) + { + if (m_originalImgs[i]) { g_object_unref(G_OBJECT(m_originalImgs[i])); } + if (m_smallImgs[i]) { g_object_unref(G_OBJECT(m_smallImgs[i])); } + if (m_largeImgs[i]) { g_object_unref(G_OBJECT(m_largeImgs[i])); } + } + m_originalImgs.clear(); + m_smallImgs.clear(); + m_largeImgs.clear(); + + //***** Window ***** + if (m_visualizationCtx) + { + this->releasePluginObject(m_visualizationCtx); + m_visualizationCtx = nullptr; + } + if (m_widget) + { + gtk_widget_destroy(m_widget); + m_widget = nullptr; + } + + //***** TCP Tagging ***** + if (m_idleFuncTag) + { + m_stimuliQueue.clear(); + g_source_remove(m_idleFuncTag); + m_idleFuncTag = 0; + } + + m_stimlist.clear(); + delete m_stimulusSender; + m_amplitudes.clear(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CGrazMultiVisualization::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CGrazMultiVisualization::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + //**** Stimulations ***** + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_needRedraw = true; + m_stimDecoder.decode(i); + if (m_stimDecoder.isBufferReceived()) + { + for (size_t s = 0; s < m_iStim->getStimulationCount(); ++s) { setStimulation(m_iStim->getStimulationIdentifier(s)); } + } + } + + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + const uint64_t start = boxContext.getInputChunkStartTime(1, i), // Time Code Chunk Start + end = boxContext.getInputChunkEndTime(1, i); // Time Code Chunk End + m_needRedraw = true; + m_classifDecoder.decode(i); + if (m_classifDecoder.isHeaderReceived()) + { + if (m_iMatrix->getBufferElementCount() != m_nbModality) + { + this->getLogManager() << Kernel::LogLevel_Error << "Error, the vector/matrix do not contain the same number of values as modalities! (" + << m_iMatrix->getBufferElementCount() << " VS " << m_nbModality << ")\n"; + return false; + } + m_confusionEncoder.encodeHeader(); + m_barSizeEncoder.encodeHeader(); + } + if (m_classifDecoder.isBufferReceived()) + { + setMatrixBuffer(m_iMatrix->getBuffer()); + m_confusionEncoder.encodeBuffer(); + m_barSizeEncoder.encodeBuffer(); + } + if (m_classifDecoder.isEndReceived()) + { + m_confusionEncoder.encodeEnd(); + m_barSizeEncoder.encodeEnd(); + } + boxContext.markOutputAsReadyToSend(0, start, end); + boxContext.markOutputAsReadyToSend(1, start, end); + } + + // After any possible rendering, we flush the accumulated stimuli. The default idle func is low priority, so it should be run after rendering by gtk. + // Only register a single idle func, if the previous is there its just as good + if (m_idleFuncTag == 0) { m_idleFuncTag = g_idle_add(FlushCB, this); } + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//******************* +//***** DRAWING ***** +//******************* +//--------------------------------------------------------------------------------------------------- +bool CGrazMultiVisualization::redraw() +{ + switch (m_state) + { + case EStates::Idle: // Start Experiment & Idle + drawReference(); + break; + case EStates::Cross: // Start Trial & Cross + drawReference(); + drawCross(); + break; + case EStates::Instruction: // Show Instruction + drawReference(); + drawModality(); + break; + case EStates::Feedback: // Feedback + drawReference(); + if (m_feedbackMode != 3 && m_modality != -1 && m_vote != -1 && !m_delayFeedback) { drawBar(); } + break; + case EStates::Black: // End Trial + if (m_feedbackMode != 3 && m_modality != -1 && m_vote != -1 && m_delayFeedback) + { + drawReference(); + drawBar(); + } + break; + } + if (m_showAccuracy) { drawAccuracy(); } + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +void CGrazMultiVisualization::drawReference() +{ + gint currX = m_modalityX; + // Draw for each Horizontal line, Vertical Line & modality + for (size_t i = 1; i < m_smallImgs.size(); ++i, currX += m_modalityX) + { + gdk_draw_line(m_widget->window, m_widget->style->fg_gc[gtk_widget_get_state(m_widget)], currX - m_modalityW, m_modalityY, currX + m_modalityW, + m_modalityY); + gdk_draw_line(m_widget->window, m_widget->style->fg_gc[gtk_widget_get_state(m_widget)], currX, m_margin, currX, m_modalityY); + const gint x = currX - gdk_pixbuf_get_width(m_smallImgs[i]) / 2, + y = m_modalityY + (m_windowH - m_modalityY - gdk_pixbuf_get_height(m_smallImgs[i])) / 2; + gdk_draw_pixbuf(m_widget->window, nullptr, m_smallImgs[i], 0, 0, x, y, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +void CGrazMultiVisualization::drawCross() const +{ + const gint xc = m_windowW / 2, yc = m_windowH / 2, // Window Center + size = std::min(xc, yc) / 4, // Cross Size + xm = xc - size, ym = yc - size, // min(x,y) + xM = xc + size, yM = yc + size; // Max(x,y) + gdk_draw_line(m_widget->window, m_widget->style->fg_gc[gtk_widget_get_state(m_widget)], xm, yc, xM, yc); + gdk_draw_line(m_widget->window, m_widget->style->fg_gc[gtk_widget_get_state(m_widget)], xm, yc + 1, xM, yc + 1); + gdk_draw_line(m_widget->window, m_widget->style->fg_gc[gtk_widget_get_state(m_widget)], xc, ym, xc, yM); + gdk_draw_line(m_widget->window, m_widget->style->fg_gc[gtk_widget_get_state(m_widget)], xc + 1, ym, xc + 1, yM); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +void CGrazMultiVisualization::drawModality() +{ + const GdkPixbuf* modality = m_largeImgs[(m_showInstruction ? m_modality + 1 : 0)]; // (m_modality + 1) Because the first element is the none instruction + const gint w = m_windowW / 2, + h = m_windowH / 2, + x = w - gdk_pixbuf_get_width(modality) / 2, + y = h - gdk_pixbuf_get_height(modality) / 2; + gdk_draw_pixbuf(m_widget->window, nullptr, modality, 0, 0, x, y, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +void CGrazMultiVisualization::drawBar() +{ + if ((m_feedbackMode == 0 && m_modality == m_vote) || m_feedbackMode == 1) // Draw Positive or Best Only + { + const double scale = m_barScales[m_vote] < 0.0 ? 0.0 : m_barScales[m_vote]; + const gint x = (m_vote + 1) * m_modalityX, // Get the pos X of the bar + h = gint(scale * m_barH); // Get the height of the bar + gdk_pixbuf_render_to_drawable(m_bar, m_widget->window, nullptr, 0, m_barH - h, x - m_barW / 2, m_modalityY - h, m_barW, h, GDK_RGB_DITHER_NONE, 0, 0); + m_oBarSize->getBuffer()[m_vote] = 100.0 * scale; // Update the displayed bar size + } + else if (m_feedbackMode == 2) // Draw All + { + gint x = m_modalityX; + for (size_t i = 0; i < m_nbModality; ++i) // For each Modality + { + const double scale = m_barScales[i] < 0.0 ? 0.0 : m_barScales[i]; + const gint h = gint(scale * m_barH); // Get the H of the modality + gdk_pixbuf_render_to_drawable(m_bar, m_widget->window, nullptr, 0, m_barH - h, x - m_barW / 2, m_modalityY - h, m_barW, h, GDK_RGB_DITHER_NONE, 0, + 0); + x += m_modalityX; + m_oBarSize->getBuffer()[i] = 100.0 * scale; // Update the displayed bar size + } + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +void CGrazMultiVisualization::drawAccuracy() +{ + const double* buffer = m_oConfusion->getBuffer(); + PangoLayout* layout = pango_layout_new(gdk_pango_context_get()); + + const gint stepX = 40, stepY = 16; + const gint startX = 8, startY = 16; + gint x = startX, y = startY; + + std::stringstream ss; + ss << std::setfill('0'); + size_t idx = 0; + size_t predictions = 0, good = 0; + + for (size_t i = 0; i < m_nbModality; ++i) + { + for (size_t j = 0; j < m_nbModality; ++j) + { + ss.str(std::string()); + const int val = int(buffer[idx++]); + ss << std::setw(3) << val; + predictions += val; + pango_layout_set_text(layout, ss.str().c_str(), -1); + if (i == j) + { + gdk_draw_layout(m_widget->window, m_widget->style->white_gc, x, y, layout); + good += val; + } + else { gdk_draw_layout(m_widget->window, m_widget->style->fg_gc[GTK_WIDGET_STATE(m_widget)], x, y, layout); } + x += stepX; + } + x = startX; + y += stepY; + } + ss.str(std::string()); + ss << "Acc = " << std::fixed << std::setprecision(1) << (predictions == 0 ? 0.0 : 100.0 * double(good) / double(predictions)); + pango_layout_set_text(layout, ss.str().c_str(), -1); + gdk_draw_layout(m_widget->window, m_widget->style->white_gc, x + (gint(m_nbModality) * stepX), y - stepY, layout); + + g_object_unref(layout); +} +//--------------------------------------------------------------------------------------------------- + +//******************** +//***** COMPUTES ***** +//******************** +//--------------------------------------------------------------------------------------------------- +void CGrazMultiVisualization::aggregatePredictions(const bool all) +{ + if (m_amplitudes.size() >= m_nbPredictionsMin) + { + m_vote = 0; + // step backwards with rev iter to take the mean of the latest samples + uint64_t count = 0; + double sum = 0; + std::vector amp(m_nbModality, 0); + //double maxA = -DBL_MAX; + for (auto a = m_amplitudes.rbegin(); a != m_amplitudes.rend() && (all || count < m_nbPredictionsMin); ++a, ++count) + { + for (size_t i = 0; i < a->size(); ++i) { amp[i] += a->at(i); } + } + for (const auto& a : amp) { sum += a; } + // Computes bar scale for each modality as a probability (other possibility substract the min/max value or the mean of the values) + // Then we put this probability between 0-1 to 0-1 but when 0 is equal to 1/m_nbModality + const double minV = 1.0 / double(m_nbModality), + factorV = 1.0 / (1 - minV); + for (size_t i = 0; i < amp.size(); ++i) + { + m_barScales[i] = (amp[i] / sum - minV) * factorV; + if (amp[m_vote] < amp[i]) { m_vote = int(i); } + } + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +void CGrazMultiVisualization::updateConfusionMatrix() +{ + // Col = Expected modality, Row = Computed modality + if (m_modality != -1 && m_vote != -1) { (m_oConfusion->getBuffer())[m_vote * m_nbModality + m_modality]++; } + m_oBarSize->resetBuffer(); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +void CGrazMultiVisualization::setMatrixBuffer(const double* buffer) +{ + if (m_state != EStates::Feedback) { return; } // No continuous feedback + // Ad-hoc forcing to probability (range [0,1], sum to 1). This will make scaling easier + // if run forever in a continuous mode. If the input is already scaled this way, no effect. + double sum = 0; + std::vector values; + values.reserve(m_nbModality); + for (size_t i = 0; i < m_nbModality; ++i) + { + const double v = std::abs(buffer[i]); + values.emplace_back(v); + sum += v; + } + + if (sum != 0.0) { for (auto& v : values) { v /= sum; } } + else { for (auto& v : values) { v = 1.0 / double(m_nbModality); } } + + m_amplitudes.emplace_back(values); // Add this buffer to the list + if (m_feedbackMode != 3 && !m_delayFeedback) + { + aggregatePredictions(false); + gdk_window_invalidate_rect(m_widget->window, nullptr, true); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +void CGrazMultiVisualization::setStimulation(const uint64_t stimulation) +{ + bool needRedraw = true; + switch (stimulation) + { + // Classical stimulations + case OVTK_GDF_End_Of_Session: + m_state = EStates::Black; // Idle State Black Screen + break; + + case OVTK_GDF_End_Of_Trial: + m_state = EStates::Black; // Idle State Black Screen + aggregatePredictions(true); + updateConfusionMatrix(); + break; + + case OVTK_GDF_Start_Of_Trial: + case OVTK_GDF_Cross_On_Screen: + m_state = EStates::Cross; // Draw Reference State and cross + break; + + case OVTK_GDF_Feedback_Continuous: + m_state = EStates::Feedback; // Draw Feedback State + break; + + default: // Modalities stimulations + m_modality = -1; // Initialize modality number + m_vote = -1; // Initialize vote + m_amplitudes.clear(); // Clear the previous amplitudes + for (auto& s : m_barScales) { s = 0; } // Reinit Bar Scales + for (size_t i = 0; i < m_stimlist.size(); ++i) + { + if (m_stimlist[i] == stimulation) + { + m_modality = int(i); + break; // stop the loop (but not so usefull big number of modality is not so big generally) + } + } + if (m_modality != -1) { m_state = EStates::Instruction; } // If recognize stimulation Draw Modality State + else { needRedraw = false; } // If not, we don't care about stimulations and we don't want to redraw + break; + } + // Queue the stimulation to be sent to TCP Tagging + m_stimuliQueue.push_back(stimulation); + + // Indicates that the window is invalidate (must be redrawn) + if (needRedraw && GTK_WIDGET(m_widget)->window) { gdk_window_invalidate_rect(GTK_WIDGET(m_widget)->window, nullptr, true); } +} +//--------------------------------------------------------------------------------------------------- + +//************************** +//***** CALLBACKS HACK ***** +//************************** +//--------------------------------------------------------------------------------------------------- +// Note that we don't need concurrency control here as gtk callbacks run in the main thread +void CGrazMultiVisualization::flushQueue() +{ + for (auto i : m_stimuliQueue) { m_stimulusSender->sendStimulation(i); } + m_stimuliQueue.clear(); + m_idleFuncTag = 0; // This function will be automatically removed after completion, so set to 0 +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +void CGrazMultiVisualization::resize(size_t width, size_t height) +{ + //***** Variables update ***** + m_windowW = gint(width < 8 ? 8 : width); // Windows Width minimum to avoïd 0 sizes + m_windowH = gint(height < 8 ? 8 : height); // Windows Height minimum to avoïd 0 sizes + m_margin = gint(0.01 * double(MIN(width, height))); // Margin 1% of the minimum between width and height + + const gint drawAreaW = gint(width - 2 * m_margin), // Drawing area Width (without margin) + drawAreaH = gint(height - 2 * m_margin); // Drawing area Height (without margin) + + m_barH = gint(0.80 * drawAreaH); // Height of the Graz Bar + m_barW = MIN(m_barH / 6, (drawAreaW / gint(m_nbModality)) - m_margin); // Keep some proportion + + m_modalityX = drawAreaW / gint(m_nbModality + 1); // Center X Position of the first modality (next is in x+(x+margin)) + m_modalityY = m_barH + m_margin; // Bottom Y Position of the modalities + m_modalityW = (m_barW + 2 * m_margin) / 2; // Half width dedicated for the modalities + + const int wL = m_windowW / 3, hL = m_windowH / 3, wS = m_barW; + + //***** Images update ***** + for (size_t i = 0; i < m_originalImgs.size(); ++i) + { + if (m_smallImgs[i]) { g_object_unref(G_OBJECT(m_smallImgs[i])); } // Delete + if (m_largeImgs[i]) { g_object_unref(G_OBJECT(m_largeImgs[i])); } // Delete + m_smallImgs[i] = RescalePixbuf(m_originalImgs[i], wS, wS); // Rescale + m_largeImgs[i] = RescalePixbuf(m_originalImgs[i], wL, hL); // Rescale + } + if (m_originalBar) + { + if (m_bar) { g_object_unref(G_OBJECT(m_bar)); } // Delete + m_bar = RescalePixbuf(m_originalBar, m_barW, m_barH, false); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CGrazMultiVisualization::initWindow() +{ + m_widget = GTK_WIDGET(gtk_drawing_area_new()); // Creation + gtk_widget_set_size_request(m_widget, 400, 300); // Minimum Window Size + gtk_widget_set_double_buffered(m_widget, TRUE); // Double Buffer + + //set widget basic color + GdkColor bgColor = InitGDKColor(0, 0, 0, 0), // = { 0, 0, 0, 0 }; // pixel, red, green, blue (black) vs 2013 doesn't allow this initialization + fgColor = InitGDKColor(0, 0, 32768, 0); // = { 0, 0, 32768, 0 }; // pixel, red, green, blue (dark green) + + gtk_widget_modify_bg(m_widget, GTK_STATE_NORMAL, &bgColor); + gtk_widget_modify_bg(m_widget, GTK_STATE_PRELIGHT, &bgColor); + gtk_widget_modify_bg(m_widget, GTK_STATE_ACTIVE, &bgColor); + + gtk_widget_modify_fg(m_widget, GTK_STATE_NORMAL, &fgColor); + gtk_widget_modify_fg(m_widget, GTK_STATE_PRELIGHT, &fgColor); + gtk_widget_modify_fg(m_widget, GTK_STATE_ACTIVE, &fgColor); + + m_visualizationCtx = dynamic_cast(this->createPluginObject(OVP_ClassId_Plugin_VisualizationCtx)); + m_visualizationCtx->setWidget(*this, m_widget); + g_signal_connect(G_OBJECT(m_widget), "size-allocate", G_CALLBACK(ResizeCB), this); + g_signal_connect(G_OBJECT(m_widget), "expose_event", G_CALLBACK(RedrawCB), this); + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +bool CGrazMultiVisualization::initImages(const std::vector& paths) +{ + const size_t s = paths.size(); + if (s != m_nbModality + 1) { return false; } + m_originalImgs.resize(s); + m_largeImgs.resize(s); + m_smallImgs.resize(s); + + // Bar + m_originalBar = gdk_pixbuf_new_from_file_at_size(Directories::getDataDir() + "/plugins/simple-visualization/graz/bar.png", -1, -1, nullptr); + if (!m_originalBar) { return false; } + + // Modalities + for (size_t i = 0; i < s; ++i) + { + m_originalImgs[i] = gdk_pixbuf_new_from_file_at_size(paths[i].c_str(), -1, -1, nullptr); + if (!m_originalImgs[i]) { return false; } + } + + resize(400, 300); // Initialization + + return true; +} +//--------------------------------------------------------------------------------------------------- + +//**************** +//***** MISC ***** +//**************** +//--------------------------------------------------------------------------------------------------- +std::string CGrazMultiVisualization::infos() const +{ + std::stringstream ss; + ss << "\n"; + ss << "Show instruction : " << (m_showInstruction ? "yes" : "no") << ", Feedback Mode : "; + if (m_feedbackMode == 0) { ss << "Positive Only"; } + else if (m_feedbackMode == 1) { ss << "Best Only"; } + else if (m_feedbackMode == 2) { ss << "All"; } + else if (m_feedbackMode == 3) { ss << "None"; } + ss << ", Delay : " << (m_delayFeedback ? "yes" : "no") << "\n"; + ss << "Show Accuracy : " << (m_showAccuracy ? "yes" : "no") << ", Nb Predictions : " << m_nbPredictionsMin << ", Nb Modality : " << m_nbModality << "\n"; + ss << "Number of Images : " << m_originalImgs.size() << ", " << m_smallImgs.size() << ", " << m_largeImgs.size() << "\n"; + ss << "\tWindow W : " << m_windowW << "\tWindow H : " << m_windowH << "\tMargin : " << m_margin << "\tBar W : " << m_barW << "\tBar H : " << m_barH << "\n"; + + if (m_originalBar) { ss << "\tO Bar W : " << gdk_pixbuf_get_width(m_originalBar) << "\tO Bar H : " << gdk_pixbuf_get_height(m_originalBar); } + else { ss << "\tNo O Bar"; } + if (m_bar) { ss << "\tR Bar W : " << gdk_pixbuf_get_width(m_bar) << "\tR Bar H : " << gdk_pixbuf_get_height(m_bar); } + else { ss << "\tNo R Bar"; } + ss << "\n"; + + for (size_t i = 0; i < m_originalImgs.size(); ++i) + { + //* + if (m_originalImgs[i]) + { + ss << "\tO Img " << i << " W : " << gdk_pixbuf_get_width(m_originalImgs[i]) << "\tO Img " << i << " H : " << gdk_pixbuf_get_height( + m_originalImgs[i]); + } + else { ss << "\tNo O Img " << i; } + + if (m_smallImgs[i]) + { + ss << "\tS Img " << i << " W : " << gdk_pixbuf_get_width(m_smallImgs[i]) << "\tS Img " << i << " H : " << gdk_pixbuf_get_height(m_smallImgs[i]); + } + else { ss << "\tNo S Img " << i; } + + if (m_largeImgs[i]) + { + ss << "\tL Img " << i << " W : " << gdk_pixbuf_get_width(m_largeImgs[i]) << "\tL Img " << i << " H : " << gdk_pixbuf_get_height(m_largeImgs[i]); + } + else { ss << "\tNo L Img " << i; } + ss << "\n"; + } + ss << "Stimulation List : "; + for (const auto& stim : m_stimlist) { ss << stim << " "; } + ss << "\n"; + return ss.str(); +} +//--------------------------------------------------------------------------------------------------- +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCGrazMultiVisualization.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCGrazMultiVisualization.h new file mode 100644 index 0000000..f5a5f2a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCGrazMultiVisualization.h @@ -0,0 +1,286 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovpCGrazMultiVisualization.h +/// \brief Class of the Generalized Graz Visualization box. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 28/05/2019. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "../ovp_defines.h" + +#include +#include +#include + +#include + +#include +#include + +namespace TCPTagging { +class IStimulusSender; // fwd declare +} // namespace TCPTagging + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +/// The class CGrazMultiVisualization describes the box Multimodal Graz Visuallisation. +/// +class CGrazMultiVisualization final : virtual public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + bool redraw(); + void resize(size_t width, size_t height); + void flushQueue(); // Sends all accumulated stimuli to the TCP Tagging + + static const size_t m_NonModalitySettingsCount = 6; + +protected: + + /// Enumeration of States. + enum class EStates { Idle, Cross, Black, Instruction, Feedback }; + + /// Initialize GTK Window. + /// True if it succeeds, false if it fails. + bool initWindow(); + + /// Initialize GTK Images. + /// The pathsof the image file. + /// True if it succeeds, false if it fails. + bool initImages(const std::vector& paths); + + /// Update the box state according to the stimulation received. + /// The stimulation received. + void setStimulation(uint64_t stimulation); + + /// Update the amplitudesaccording to the new amplitude received in buffer. + /// The buffer with amplitudes. + void setMatrixBuffer(const double* buffer); + + /// Draw the reference. + /// + /// ┌──────────────────────────────┐ \n + /// │ │ │ │ │ │ \n + /// │ │ │ │ │ │ \n + /// │ │ │ │ │ │ \n + /// │ │ │ │ │ │ \n + /// │ ─┴─ ─┴─ ─┴─ ─┴─ │ \n + /// │ Im01 Im02 Im03 Im04 │ \n + /// └──────────────────────────────┘ + void drawReference(); + + /// Draw Cross on Screen. + void drawCross() const; + + /// Draw the actual modality in center. + void drawModality(); + + /// Draw the Feedback bar. + /// + /// ┌──────────────────────────────┐ \n + /// │ │ │ │ │ │ \n + /// │ │ │ │ │ │ \n + /// │ │ │ ┌┴┐ │ │ \n + /// │ │ │ │ │ │ │ \n + /// │ ─┴─ ─┴─ ┴─┴ ─┴─ │ \n + /// │ Im01 Im02 Im03 Im04 │ \n + /// └──────────────────────────────┘ + void drawBar(); + + /// Draw the accuracy on top left. + void drawAccuracy(); + + /// Update the confusion matrix draw in the corner. + void updateConfusionMatrix(); + + /// Get the mean of last predictions. + /// All previous predictions is used if true, only if false. + void aggregatePredictions(bool all); + + /// Return some infos about the class. + /// A string with infos. + std::string infos() const; + + _IsDerivedFromClass_Final_(IBoxAlgorithm, OVP_ClassId_GeneralizedGrazVisualization) + + //********** Variables ********** + //***** Codecs ***** + Toolkit::TStimulationDecoder m_stimDecoder; + Toolkit::TStreamedMatrixDecoder m_classifDecoder; + Toolkit::TStreamedMatrixEncoder m_barSizeEncoder; + Toolkit::TStreamedMatrixEncoder m_confusionEncoder; + IStimulationSet* m_iStim = nullptr; // Input StimulationSet Pointer + CMatrix* m_iMatrix = nullptr; // Input Matrix pointer + CMatrix* m_oBarSize = nullptr; // Outpout bar size matrix pointer (in percent) + CMatrix* m_oConfusion = nullptr; // Outpout confusion Matrix pointer + + //***** Interface ***** + GtkWidget* m_widget = nullptr; + VisualizationToolkit::IVisualizationContext* m_visualizationCtx = nullptr; + + std::vector m_originalImgs, m_largeImgs, + m_smallImgs; // Vector of all Images in 3 form (original, small under bar and large in center) first is none instruction + GdkPixbuf *m_originalBar = nullptr, *m_bar = nullptr; // Image of the bar + gint m_windowW = 0, m_windowH = 0, m_margin = 0, // Windows Height/Width and margin between window limit and drawing area + m_barW = 0, m_barH = 0, // Height/Width of the bar + m_modalityX = 0, m_modalityY = 0, // Center Bottom Position (x, y) of the first modality (next is in x+(x+margin) + m_modalityW = 0; // Half Width of the modality : (m_barW + 2 * m_margin) / 2 + std::vector m_barScales; // 0 to 1 for each bar (depends of the feedback if only positive feedback or not) + double m_barScale = 0.0; // 0 to 1 + bool m_needRedraw = false; // if we need redraw + EStates m_state = EStates::Idle; // Actual state + int m_modality = -1; // Actual Modality + int m_vote = -1; // Computed Modality + + //***** Settings ***** + bool m_showInstruction = true, + m_delayFeedback = false, + m_showAccuracy = false; + + size_t m_feedbackMode = 0, + m_nbPredictionsMin = 5, + m_nbModality = 2, + m_currModality = 0; + + std::vector + m_stimlist; // List of stimulations (OVTK_GDF_End_Of_Trial, OVTK_GDF_End_Of_Session, OVTK_GDF_Cross_On_Screen, OVTK_GDF_Feedback_Continuous) + + //***** TCP Tagging ***** + std::vector m_stimuliQueue; + guint m_idleFuncTag = 0; + TCPTagging::IStimulusSender* m_stimulusSender = nullptr; + + //***** Other ***** + std::vector> m_amplitudes; // All amplitudes the current trial + bool m_twoValueInput = false; +}; + +/// Listener of the box Multimodal Graz Visuallisation. +/// +class CGrazMultiVisualizationListener final : public Toolkit::TBoxListener +{ +public: + + /// Action when we add a setting (we copy the previous setting value. + /// The box to listen. + /// The idx of the new setting. + /// True if it succeeds, false if it fails. + bool onSettingAdded(Kernel::IBox& box, const size_t idx) override + { + CString value; + box.getSettingDefaultValue(idx - 2, value); + box.setSettingDefaultValue(idx, value); + box.setSettingValue(idx, value); + + box.getSettingDefaultValue(idx - 1, value); + box.addSetting("", OV_TypeId_Filename, value); + box.setSettingDefaultValue(idx + 1, value); + box.setSettingValue(idx + 1, value); + checkSettingNames(box); + return true; + } + + /// Action when when remove a setting (we remove the associated setting. + /// The box to listen. + /// The idx of the deleted setting. + /// True if it succeeds, false if it fails. + bool onSettingRemoved(Kernel::IBox& box, const size_t idx) override + { + // Remove also the associated setting in the other slot + const size_t modalityNumber = (idx - CGrazMultiVisualization::m_NonModalitySettingsCount); + if (modalityNumber % 2 == 0) { box.removeSetting(idx); } + else { box.removeSetting(idx - 1); } + checkSettingNames(box); + return true; + } + +protected: + + /// This function is used to make sure the setting names and types are correct (if you remove one middle setting). + /// The box to listen. + /// True if it succeeds, false if it fails. + bool checkSettingNames(Kernel::IBox& box) const + { + size_t idx = 1; + for (size_t i = CGrazMultiVisualization::m_NonModalitySettingsCount; i < box.getSettingCount() - 1; i += 2) + { + const std::string tmp = std::to_string(idx); + box.setSettingName(i, ("Stimulation modality " + tmp).c_str()); + box.setSettingType(i, OV_TypeId_Stimulation); + box.setSettingName(i + 1, ("Image modality " + tmp).c_str()); + box.setSettingType(i + 1, OV_TypeId_Filename); + idx++; + } + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + + +/// Descriptor of the box Multimodal Graz Visuallisation. +/// +class CGrazMultiVisualizationDesc final : public IBoxAlgorithmDesc +{ +public: + CString getName() const override { return CString("Multimodal Graz visualization"); } + CString getAuthorName() const override { return CString("Thibaut Monseigne"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + + CString getShortDescription() const override { return CString("Generalization of visualization plugin for the Graz experiment"); } + + CString getDetailedDescription() const override { return CString("Generalization of Visualization/Feedback plugin for the Graz experiment"); } + + CString getCategory() const override { return CString("Visualization/Presentation"); } + CString getVersion() const override { return CString("1.0"); } + void release() override { } + CIdentifier getCreatedClass() const override { return OVP_ClassId_GeneralizedGrazVisualization; } + CString getStockItemName() const override { return CString("gtk-fullscreen"); } + IPluginObject* create() override { return new CGrazMultiVisualization(); } + + IBoxListener* createBoxListener() const override { return new CGrazMultiVisualizationListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool hasFunctionality(const EPluginFunctionality identifier) const override { return identifier == EPluginFunctionality::Visualization; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Stimulations", OV_TypeId_Stimulations); + prototype.addInput("Amplitude", OV_TypeId_StreamedMatrix); + + prototype.addSetting("Show instruction", OV_TypeId_Boolean, "true"); + prototype.addSetting("Feedback display mode", OVP_TypeId_FeedbackMode, "Positive Only"); + prototype.addSetting("Delay feedback", OV_TypeId_Boolean, "false"); + prototype.addSetting("Show accuracy", OV_TypeId_Boolean, "false"); + prototype.addSetting("Predictions to integrate", OV_TypeId_Integer, "5"); + prototype.addSetting("Image no instruction", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/graz/none.png"); + prototype.addSetting("Stimulation modality 1", OV_TypeId_Stimulation, "OVTK_GDF_Left"); + prototype.addSetting("Image modality 1", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/graz/left.png"); + prototype.addSetting("Stimulation modality 2", OV_TypeId_Stimulation, "OVTK_GDF_Right"); + prototype.addSetting("Image modality 2", OV_TypeId_Filename, "${Path_Data}/plugins/simple-visualization/graz/right.png"); + prototype.addFlag(Kernel::BoxFlag_CanAddSetting); + + prototype.addOutput("Displayed Bar Size", OV_TypeId_StreamedMatrix); + prototype.addOutput("Confusion Matrix", OV_TypeId_StreamedMatrix); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_GeneralizedGrazVisualizationDesc) +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCGrazVisualization.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCGrazVisualization.cpp new file mode 100644 index 0000000..d192c1a --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCGrazVisualization.cpp @@ -0,0 +1,677 @@ +#include "ovpCGrazVisualization.h" +#include + +#include // std::min, max +#include +#include +#include +#include + +#if defined TARGET_OS_Linux +#include +#endif + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +// This callback flushes all accumulated stimulations to the TCP Tagging +// after the rendering has completed. +static gboolean FlushCB(gpointer data) +{ + reinterpret_cast(data)->flushQueue(); + return FALSE; // Only run once +} + +static gboolean ResizeCB(GtkWidget* /*widget*/, GtkAllocation* allocation, gpointer data) +{ + reinterpret_cast(data)->resize(size_t(allocation->width), size_t(allocation->height)); + return FALSE; +} + +static gboolean RedrawCB(GtkWidget* /*widget*/, GdkEventExpose* /*event*/, gpointer data) +{ + reinterpret_cast(data)->redraw(); + return TRUE; +} + +// n.b. This reacts immediately to the received stimulation and doesn't use the date. Usually stimulations come from the upstream with +// chunks having a very narrow time range, so its alright for Graz that changes state only rarely. Note if multiple stimulations are +// received in the same chunk, they'll be passed to TCP Tagging with the true delay between them lost. +void CGrazVisualization::setStimulation(const size_t /*stimulationIndex*/, const uint64_t identifier, const uint64_t /*stimulationDate*/) +{ + /* + OVTK_GDF_Start_Of_Trial + OVTK_GDF_Cross_On_Screen + OVTK_GDF_Left + OVTK_GDF_Right + */ + bool stateUpdated = false; + + m_LastStimulation = identifier; + switch (identifier) + { + case OVTK_GDF_End_Of_Trial: + m_CurrentState = EStates::Idle; + stateUpdated = true; + if (m_ShowAccuracy || m_DelayFeedback) + { + const double prediction = aggregatePredictions(true); + updateConfusionMatrix(prediction); + m_BarScale = prediction; + } + break; + + case OVTK_GDF_End_Of_Session: + m_CurrentState = EStates::Idle; + stateUpdated = true; + if (m_ShowFeedback) + { + m_BarScale = 0; + drawBar(); + } + break; + + case OVTK_GDF_Cross_On_Screen: + m_CurrentState = EStates::Reference; + stateUpdated = true; + break; + + case OVTK_GDF_Beep: + // gdk_beep(); + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Trace << + "Beep is no more considered in 'Graz Visu', use the 'Sound player' for this!\n"; +#if 0 +#if defined TARGET_OS_Linux + system("cat /local/ov_beep.wav > /dev/dsp &"); +#endif +#endif + break; + + case OVTK_GDF_Left: + m_CurrentState = EStates::Cue; + m_CurrentDirection = EArrowDirections::Left; + stateUpdated = true; + break; + + case OVTK_GDF_Right: + m_CurrentState = EStates::Cue; + m_CurrentDirection = EArrowDirections::Right; + stateUpdated = true; + break; + + case OVTK_GDF_Up: + m_CurrentState = EStates::Cue; + m_CurrentDirection = EArrowDirections::Up; + stateUpdated = true; + break; + + case OVTK_GDF_Down: + m_CurrentState = EStates::Cue; + m_CurrentDirection = EArrowDirections::Down; + stateUpdated = true; + break; + + case OVTK_GDF_Feedback_Continuous: + // New trial starts + + m_CurrentState = EStates::ContinousFeedback; + m_Amplitudes.clear(); + + // as some trials may have artifacts and hence very high responses from e.g. LDA + // its better to reset the max between trials + m_MaxAmplitude = -DBL_MAX; + m_BarScale = 0; + + stateUpdated = true; + break; + default: break; + } + + if (stateUpdated) { processState(); } + + // Queue the stimulation to be sent to TCP Tagging + m_StimuliQueue.push_back(m_LastStimulation); +} + +void CGrazVisualization::processState() +{ + switch (m_CurrentState) + { + case EStates::Reference: + case EStates::Cue: + case EStates::Idle: + case EStates::ContinousFeedback: + if (GTK_WIDGET(m_DrawingArea)->window) { gdk_window_invalidate_rect(GTK_WIDGET(m_DrawingArea)->window, nullptr, true); } + break; + + default: + break; + } +} + +bool CGrazVisualization::initialize() +{ + m_StimulationDecoder.initialize(*this, 0); + m_MatrixDecoder.initialize(*this, 1); + m_confusionEncoder.initialize(*this, 0); + m_oConfusion = m_confusionEncoder.getInputMatrix(); + + m_ShowInstruction = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_ShowFeedback = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_DelayFeedback = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + m_ShowAccuracy = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + m_PredictionsToIntegrate = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + m_PositiveFeedbackOnly = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5); + + m_StimulusSender = nullptr; + + m_IdleFuncTag = 0; + m_StimuliQueue.clear(); + + if (m_PredictionsToIntegrate < 1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Number of predictions to integrate must be at least 1!"; + return false; + } + + m_oConfusion->resize(2, 2); + + //load the gtk builder interface + m_Builder = + gtk_builder_new(); // glade_xml_new(Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-GrazVisualization.ui", nullptr, nullptr); + gtk_builder_add_from_file(m_Builder, + Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-GrazVisualization.ui", nullptr); + + if (!m_Builder) + { + this->getLogManager() << Kernel::LogLevel_Error << "Error: couldn't load the interface!"; + return false; + } + + gtk_builder_connect_signals(m_Builder, nullptr); + + m_DrawingArea = GTK_WIDGET(gtk_builder_get_object(m_Builder, "GrazVisualizationDrawingArea")); + g_signal_connect(G_OBJECT(m_DrawingArea), "expose_event", G_CALLBACK(RedrawCB), this); + g_signal_connect(G_OBJECT(m_DrawingArea), "size-allocate", G_CALLBACK(ResizeCB), this); + +#if 0 + //does nothing on the main window if the user tries to close it + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_BuilderInterface, "GrazVisualizationWindow")), "delete_event", G_CALLBACK(gtk_widget_do_nothing), nullptr); + //creates the window + m_mainWindow = GTK_WIDGET(gtk_builder_get_object(m_BuilderInterface, "GrazVisualizationWindow")); +#endif + + //set widget bg color + gtk_widget_modify_bg(m_DrawingArea, GTK_STATE_NORMAL, &m_BackgroundColor); + gtk_widget_modify_bg(m_DrawingArea, GTK_STATE_PRELIGHT, &m_BackgroundColor); + gtk_widget_modify_bg(m_DrawingArea, GTK_STATE_ACTIVE, &m_BackgroundColor); + + gtk_widget_modify_fg(m_DrawingArea, GTK_STATE_NORMAL, &m_ForegroundColor); + gtk_widget_modify_fg(m_DrawingArea, GTK_STATE_PRELIGHT, &m_ForegroundColor); + gtk_widget_modify_fg(m_DrawingArea, GTK_STATE_ACTIVE, &m_ForegroundColor); + + //arrows + m_OriginalLeftArrow = gdk_pixbuf_new_from_file_at_size( + Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-GrazVisualization-leftArrow.png", -1, -1, nullptr); + m_OriginalRightArrow = gdk_pixbuf_new_from_file_at_size( + Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-GrazVisualization-rightArrow.png", -1, -1, nullptr); + m_OriginalUpArrow = gdk_pixbuf_new_from_file_at_size( + Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-GrazVisualization-upArrow.png", -1, -1, nullptr); + m_OriginalDownArrow = gdk_pixbuf_new_from_file_at_size( + Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-GrazVisualization-downArrow.png", -1, -1, nullptr); + + if (!m_OriginalLeftArrow || !m_OriginalRightArrow || !m_OriginalUpArrow || !m_OriginalDownArrow) + { + this->getLogManager() << Kernel::LogLevel_Error << "Error couldn't load arrow resource files!\n"; + return false; + } + + //bar + m_OriginalBar = gdk_pixbuf_new_from_file_at_size( + Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-GrazVisualization-bar.png", -1, -1, nullptr); + if (!m_OriginalBar) + { + this->getLogManager() << Kernel::LogLevel_Error << "Error couldn't load bar resource file!\n"; + return false; + } + +#if 0 + gtk_widget_show_all(m_mainWindow); +#endif + m_visualizationCtx = dynamic_cast(this->createPluginObject( + OVP_ClassId_Plugin_VisualizationCtx)); + m_visualizationCtx->setWidget(*this, m_DrawingArea); + + m_StimulusSender = TCPTagging::CreateStimulusSender(); + + if (!m_StimulusSender->connect("localhost", "15361")) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Unable to connect to AS's TCP Tagging plugin, stimuli wont be forwarded.\n"; + } + + return true; +} + +bool CGrazVisualization::uninitialize() +{ + //***** Print Confusion Matrix ***** + this->getLogManager() << Kernel::LogLevel_Info << "Confusion Matrix : \n"; + const double* buffer = m_oConfusion->getBuffer(); + std::stringstream ss; + ss << std::setfill('0'); + size_t idx = 0; + size_t predictions = 0, good = 0; + + for (size_t i = 0; i < 2; ++i) + { + for (size_t j = 0; j < 2; ++j) + { + ss.str(std::string()); + const int val = int(buffer[idx++]); + ss << std::setw(3) << val; + predictions += val; + this->getLogManager() << ss.str() << " "; + if (i == j) { good += val; } + } + this->getLogManager() << "\n"; + } + ss.str(std::string()); + ss << "Accuracy = " << std::fixed << std::setprecision(1) << (predictions == 0 ? 0.0 : 100.0 * double(good) / double(predictions)) << "\n"; + this->getLogManager() << ss.str(); + + //***** Codecs ***** + m_oConfusion = nullptr; + m_confusionEncoder.uninitialize(); + + if (m_IdleFuncTag) + { + m_StimuliQueue.clear(); + g_source_remove(m_IdleFuncTag); + m_IdleFuncTag = 0; + } + + delete m_StimulusSender; + + m_StimulationDecoder.uninitialize(); + m_MatrixDecoder.uninitialize(); + + //destroy drawing area + if (m_DrawingArea) + { + gtk_widget_destroy(m_DrawingArea); + m_DrawingArea = nullptr; + } + + /* unref the xml file as it's not needed anymore */ + g_object_unref(G_OBJECT(m_Builder)); + m_Builder = nullptr; + + if (m_OriginalBar) { g_object_unref(G_OBJECT(m_OriginalBar)); } + if (m_LeftBar) { g_object_unref(G_OBJECT(m_LeftBar)); } + if (m_RightBar) { g_object_unref(G_OBJECT(m_RightBar)); } + if (m_LeftArrow) { g_object_unref(G_OBJECT(m_LeftArrow)); } + if (m_RightArrow) { g_object_unref(G_OBJECT(m_RightArrow)); } + if (m_UpArrow) { g_object_unref(G_OBJECT(m_UpArrow)); } + if (m_DownArrow) { g_object_unref(G_OBJECT(m_DownArrow)); } + if (m_OriginalLeftArrow) { g_object_unref(G_OBJECT(m_OriginalLeftArrow)); } + if (m_OriginalRightArrow) { g_object_unref(G_OBJECT(m_OriginalRightArrow)); } + if (m_OriginalUpArrow) { g_object_unref(G_OBJECT(m_OriginalUpArrow)); } + if (m_OriginalDownArrow) { g_object_unref(G_OBJECT(m_OriginalDownArrow)); } + + if (m_visualizationCtx) + { + this->releasePluginObject(m_visualizationCtx); + m_visualizationCtx = nullptr; + } + + return true; +} + +bool CGrazVisualization::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CGrazVisualization::process() +{ + Kernel::IBoxIO* boxIO = getBoxAlgorithmContext()->getDynamicBoxContext(); + + for (size_t chunk = 0; chunk < boxIO->getInputChunkCount(0); ++chunk) + { + m_StimulationDecoder.decode(chunk); + if (m_StimulationDecoder.isBufferReceived()) + { + const IStimulationSet* stimSet = m_StimulationDecoder.getOutputStimulationSet(); + for (size_t s = 0; s < stimSet->getStimulationCount(); ++s) + { + setStimulation(s, stimSet->getStimulationIdentifier(s), stimSet->getStimulationDate(s)); + } + } + } + + for (size_t chunk = 0; chunk < boxIO->getInputChunkCount(1); ++chunk) + { + m_MatrixDecoder.decode(chunk); + + if (m_MatrixDecoder.isHeaderReceived()) + { + const CMatrix* matrix = m_MatrixDecoder.getOutputMatrix(); + + if (matrix->getDimensionCount() == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Error, dimension count is 0 for Amplitude input !\n"; + return false; + } + + if (matrix->getDimensionCount() > 1) + { + for (size_t k = 1; k < matrix->getDimensionSize(k); ++k) + { + if (matrix->getDimensionSize(k) > 1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Error, only column vectors supported as Amplitude!\n"; + return false; + } + } + } + + if (matrix->getDimensionSize(0) == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Error, need at least 1 dimension in Amplitude input !\n"; + return false; + } + if (matrix->getDimensionSize(0) >= 2) + { + this->getLogManager() << Kernel::LogLevel_Trace << + "Got 2 or more dimensions for feedback, feedback will be the difference between the first two.\n"; + m_TwoValueInput = true; + } + m_confusionEncoder.encodeHeader(); + } + + if (m_MatrixDecoder.isBufferReceived()) + { + setMatrixBuffer(m_MatrixDecoder.getOutputMatrix()->getBuffer()); + m_confusionEncoder.encodeBuffer(); + } + if (m_MatrixDecoder.isEndReceived()) { m_confusionEncoder.encodeBuffer(); } + boxIO->markOutputAsReadyToSend(0, boxIO->getInputChunkStartTime(1, chunk), boxIO->getInputChunkEndTime(1, chunk)); + } + + // After any possible rendering, we flush the accumulated stimuli. The default idle func is low priority, so it should be run after rendering by gtk. + // Only register a single idle func, if the previous is there its just as good + if (m_IdleFuncTag == 0) { m_IdleFuncTag = g_idle_add(FlushCB, this); } + + return true; +} + +void CGrazVisualization::redraw() +{ + switch (m_CurrentState) + { + case EStates::Reference: + drawReferenceCross(); + break; + + case EStates::Cue: + drawReferenceCross(); + drawArrow(m_ShowInstruction ? m_CurrentDirection : EArrowDirections::None); + break; + + case EStates::ContinousFeedback: + drawReferenceCross(); + if (m_ShowFeedback && !m_DelayFeedback) { drawBar(); } + break; + + case EStates::Idle: + if (m_ShowFeedback && m_DelayFeedback) { drawBar(); } + break; + + default: break; + } + if (m_ShowAccuracy) { drawAccuracy(); } +} + +void CGrazVisualization::drawReferenceCross() +{ + const gint width = m_DrawingArea->allocation.width, + height = m_DrawingArea->allocation.height; + + //increase line's width + gdk_gc_set_line_attributes(m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], 1, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_BEVEL); + + //horizontal line + gdk_draw_line(m_DrawingArea->window, m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], (width / 4), (height / 2), ((3 * width) / 4), + (height / 2)); + //vertical line + gdk_draw_line(m_DrawingArea->window, m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], (width / 2), (height / 4), (width / 2), + ((3 * height) / 4)); + + //increase line's width + gdk_gc_set_line_attributes(m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], 1, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_BEVEL); +} + +void CGrazVisualization::drawArrow(const EArrowDirections direction) +{ + const gint width = m_DrawingArea->allocation.width, + height = m_DrawingArea->allocation.height; + + gint x = (width / 2), y = (height / 2); + + switch (direction) + { + case EArrowDirections::None: + this->drawArrow(EArrowDirections::Left); + this->drawArrow(EArrowDirections::Right); + break; + + case EArrowDirections::Left: + x -= gdk_pixbuf_get_width(m_LeftArrow) - 1; + y -= gdk_pixbuf_get_height(m_LeftArrow) / 2; + gdk_draw_pixbuf(m_DrawingArea->window, nullptr, m_LeftArrow, 0, 0, x, y, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); + break; + + case EArrowDirections::Right: + x += 2; + y -= gdk_pixbuf_get_height(m_RightArrow) / 2; + gdk_draw_pixbuf(m_DrawingArea->window, nullptr, m_RightArrow, 0, 0, x, y, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); + break; + + case EArrowDirections::Up: + x -= gdk_pixbuf_get_width(m_UpArrow) / 2; + y -= gdk_pixbuf_get_height(m_UpArrow) - 1; + gdk_draw_pixbuf(m_DrawingArea->window, nullptr, m_UpArrow, 0, 0, x, y, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); + break; + + case EArrowDirections::Down: + x -= gdk_pixbuf_get_width(m_DownArrow) / 2; + y += 2; + gdk_draw_pixbuf(m_DrawingArea->window, nullptr, m_DownArrow, 0, 0, x, y, -1, -1, GDK_RGB_DITHER_NONE, 0, 0); + break; + + default: break; + } +} + +void CGrazVisualization::drawBar() const +{ + const gint width = m_DrawingArea->allocation.width; + const gint height = m_DrawingArea->allocation.height; + + double usedScale = m_BarScale; + if (m_PositiveFeedbackOnly) + { + // @fixme for multiclass + const size_t trueDirection = size_t(m_CurrentDirection) - 1; + const size_t thisVote = (m_BarScale < 0 ? 0 : 1); + if (trueDirection != thisVote) { usedScale = 0; } + } + + gint w = gint(fabs(width * fabs(usedScale) / 2)); + w = (w > (width / 2)) ? (width / 2) : w; + gint x = width / 2; + const gint h = height / 6; + const gint y = (height / 2) - (h / 2); + + if (m_BarScale < 0) + { + x -= w; + gdk_pixbuf_render_to_drawable(m_LeftBar, m_DrawingArea->window, nullptr, gdk_pixbuf_get_width(m_LeftBar) - w, 0, x, y, w, h, GDK_RGB_DITHER_NONE, 0, 0); + } + else { gdk_pixbuf_render_to_drawable(m_RightBar, m_DrawingArea->window, nullptr, 0, 0, x, y, w, h, GDK_RGB_DITHER_NONE, 0, 0); } +} + +void CGrazVisualization::drawAccuracy() +{ + std::stringstream tmp; + PangoLayout* layout = pango_layout_new(gdk_pango_context_get()); + + const double* buffer = m_oConfusion->getBuffer(); + + pango_layout_set_text(layout, "L", -1); + gdk_draw_layout(m_DrawingArea->window, m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], 8, 16, layout); + + tmp << std::setfill('0') << std::setw(3) << int(buffer[0]); + pango_layout_set_text(layout, tmp.str().c_str(), -1); + gdk_draw_layout(m_DrawingArea->window, m_DrawingArea->style->white_gc, 8 + 16, 16, layout); + + tmp.str(std::string()); + tmp << std::setw(3) << int(buffer[1]); + pango_layout_set_text(layout, tmp.str().c_str(), -1); + gdk_draw_layout(m_DrawingArea->window, m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], 8 + 56, 16, layout); + + pango_layout_set_text(layout, "R", -1); + gdk_draw_layout(m_DrawingArea->window, m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], 8, 32, layout); + + tmp.str(std::string()); + tmp << std::setw(3) << int(buffer[2]); + pango_layout_set_text(layout, tmp.str().c_str(), -1); + gdk_draw_layout(m_DrawingArea->window, m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], 8 + 16, 32, layout); + + tmp.str(std::string()); + tmp << std::setw(3) << int(buffer[3]); + pango_layout_set_text(layout, tmp.str().c_str(), -1); + gdk_draw_layout(m_DrawingArea->window, m_DrawingArea->style->white_gc, 8 + 56, 32, layout); + + size_t predictions = 0; + for (size_t i = 0; i < 4; ++i) { predictions += int(buffer[i]); } + + tmp.str(std::string()); + tmp << "Acc = " << std::fixed << std::setprecision(1) << (predictions == 0 ? 0.0 : 100.0 * (buffer[0] + buffer[3]) / double(predictions)) << "%"; + pango_layout_set_text(layout, tmp.str().c_str(), -1); + gdk_draw_layout(m_DrawingArea->window, m_DrawingArea->style->white_gc, 8 + 96, 32, layout); + + + g_object_unref(layout); +} + +double CGrazVisualization::aggregatePredictions(const bool includeAll) +{ + double voteAggregate = 0; + + // Do we have enough predictions to integrate a result? + if (m_Amplitudes.size() >= m_PredictionsToIntegrate) + { + // step backwards with rev iter to take the latest samples + uint64_t count = 0; + for (auto a = m_Amplitudes.rbegin(); a != m_Amplitudes.rend() && (includeAll || count < m_PredictionsToIntegrate); ++a, ++count) + { + voteAggregate += *a; + m_MaxAmplitude = std::max(m_MaxAmplitude, abs(*a)); + } + + voteAggregate /= m_MaxAmplitude; + voteAggregate /= count; + } + + return voteAggregate; +} + +// @fixme for >2 classes +void CGrazVisualization::updateConfusionMatrix(const double prediction) +{ + if (m_CurrentDirection == EArrowDirections::Left || m_CurrentDirection == EArrowDirections::Right) + { + const size_t direction = size_t(m_CurrentDirection) - 1; + const size_t vote = (prediction < 0 ? 0 : 1); + + (m_oConfusion->getBuffer())[direction * 2 + vote]++; + // std::cout << "Now " << trueDirection << " vote " << thisVote << "\n"; + } +} + +void CGrazVisualization::setMatrixBuffer(const double* buffer) +{ + if (m_CurrentState != EStates::ContinousFeedback) + { + // We're not inside a trial, discard the prediction + return; + } + + double predictedAmplitude; + if (m_TwoValueInput) + { + // Ad-hoc forcing to probability (range [0,1], sum to 1). This will make scaling easier + // if run forever in a continuous mode. If the input is already scaled this way, no effect. + // + double v0 = std::abs(buffer[0]), v1 = std::abs(buffer[1]); + const double sum = v0 + v1; + if (sum != 0) + { + v0 = v0 / sum; + v1 = v1 / sum; + } + else + { + v0 = 0.5; + v1 = 0.5; + } + predictedAmplitude = v1 - v0; + } + else { predictedAmplitude = buffer[0]; } + m_Amplitudes.push_back(predictedAmplitude); + + if (m_ShowFeedback && !m_DelayFeedback) + { + m_BarScale = aggregatePredictions(false); + gdk_window_invalidate_rect(m_DrawingArea->window, nullptr, true); + } +} + + +void CGrazVisualization::resize(size_t width, size_t height) +{ + width = (width < 8 ? 8 : width); + height = (height < 8 ? 8 : height); + + if (m_LeftArrow) { g_object_unref(G_OBJECT(m_LeftArrow)); } + if (m_RightArrow) { g_object_unref(G_OBJECT(m_RightArrow)); } + if (m_UpArrow) { g_object_unref(G_OBJECT(m_UpArrow)); } + if (m_DownArrow) { g_object_unref(G_OBJECT(m_DownArrow)); } + if (m_RightBar) { g_object_unref(G_OBJECT(m_RightBar)); } + if (m_LeftBar) { g_object_unref(G_OBJECT(m_LeftBar)); } + + m_LeftArrow = gdk_pixbuf_scale_simple(m_OriginalLeftArrow, int(2 * width) / 8, int(height) / 4, GDK_INTERP_BILINEAR); + m_RightArrow = gdk_pixbuf_scale_simple(m_OriginalRightArrow, int(2 * width) / 8, int(height) / 4, GDK_INTERP_BILINEAR); + m_UpArrow = gdk_pixbuf_scale_simple(m_OriginalUpArrow, int(width) / 4, int(2 * height) / 8, GDK_INTERP_BILINEAR); + m_DownArrow = gdk_pixbuf_scale_simple(m_OriginalDownArrow, int(width) / 4, int(2 * height) / 8, GDK_INTERP_BILINEAR); + + m_RightBar = gdk_pixbuf_scale_simple(m_OriginalBar, width, int(height) / 6, GDK_INTERP_BILINEAR); + m_LeftBar = gdk_pixbuf_flip(m_RightBar, true); +} + +// Note that we don't need concurrency control here as gtk callbacks run in the main thread +void CGrazVisualization::flushQueue() +{ + for (const auto& stimulation : m_StimuliQueue) { m_StimulusSender->sendStimulation(stimulation); } + m_StimuliQueue.clear(); + + // This function will be automatically removed after completion, so set to 0 + m_IdleFuncTag = 0; +} + +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCGrazVisualization.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCGrazVisualization.h new file mode 100644 index 0000000..cc72942 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCGrazVisualization.h @@ -0,0 +1,162 @@ +#pragma once + +#include "../ovp_defines.h" + +#include +#include +#include + +#include +#include +#include +#include +#include "../utils.h" + +namespace TCPTagging { +class IStimulusSender; // fwd declare +} // namespace TCPTagging + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +enum class EArrowDirections { None = 0, Left, Right, Up, Down }; + +enum class EStates { Idle, Reference, Cue, ContinousFeedback }; + +/** +*/ +class CGrazVisualization final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + void redraw(); + void resize(size_t width, size_t height); + + void flushQueue(); // Sends all accumulated stimuli to the TCP Tagging + +protected: + + void setStimulation(size_t index, uint64_t identifier, uint64_t date); + void setMatrixBuffer(const double* buffer); + void processState(); + + void drawReferenceCross(); + void drawArrow(EArrowDirections direction); + void drawBar() const; + void drawAccuracy(); + void updateConfusionMatrix(double prediction); + double aggregatePredictions(bool includeAll); + + _IsDerivedFromClass_Final_(IBoxAlgorithm, OVP_ClassId_GrazVisualization) + +public: + //! The Builder handler used to create the interface + GtkBuilder* m_Builder = nullptr; + GtkWidget* m_MainWindow = nullptr; + GtkWidget* m_DrawingArea = nullptr; + + //ebml + Toolkit::TStimulationDecoder m_StimulationDecoder; + Toolkit::TStreamedMatrixDecoder m_MatrixDecoder; + + EStates m_CurrentState = EStates::Idle; + EArrowDirections m_CurrentDirection = EArrowDirections::None; + + double m_MaxAmplitude = -DBL_MAX; + double m_BarScale = 0.0; + + //Start and end time of the last buffer + uint64_t m_StartTime = 0; + uint64_t m_EndTime = 0; + + bool m_TwoValueInput = false; + + GdkPixbuf* m_OriginalBar = nullptr; + GdkPixbuf* m_LeftBar = nullptr; + GdkPixbuf* m_RightBar = nullptr; + + GdkPixbuf* m_OriginalLeftArrow = nullptr; + GdkPixbuf* m_OriginalRightArrow = nullptr; + GdkPixbuf* m_OriginalUpArrow = nullptr; + GdkPixbuf* m_OriginalDownArrow = nullptr; + + GdkPixbuf* m_LeftArrow = nullptr; + GdkPixbuf* m_RightArrow = nullptr; + GdkPixbuf* m_UpArrow = nullptr; + GdkPixbuf* m_DownArrow = nullptr; + + GdkColor m_BackgroundColor = InitGDKColor(0, 0, 0, 0); + GdkColor m_ForegroundColor = InitGDKColor(0, 0, 32768, 0); + + std::deque m_Amplitudes; // predictions for the current trial + + bool m_ShowInstruction = true; + bool m_ShowFeedback = false; + bool m_DelayFeedback = false; + bool m_ShowAccuracy = false; + bool m_PositiveFeedbackOnly = false; + + uint64_t m_PredictionsToIntegrate = 5; + + // For queuing stimulations to the TCP Tagging + std::vector m_StimuliQueue; + guint m_IdleFuncTag = 0; + TCPTagging::IStimulusSender* m_StimulusSender = nullptr; + + uint64_t m_LastStimulation = 0; + +private: + VisualizationToolkit::IVisualizationContext* m_visualizationCtx = nullptr; + + Toolkit::TStreamedMatrixEncoder m_confusionEncoder; + CMatrix* m_oConfusion = nullptr; // Outpout confusion Matrix pointer +}; + +/** +* Plugin's description +*/ +class CGrazVisualizationDesc final : public IBoxAlgorithmDesc +{ +public: + CString getName() const override { return CString("Graz visualization"); } + CString getAuthorName() const override { return CString("Bruno Renier, Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Visualization plugin for the Graz experiment"); } + CString getDetailedDescription() const override { return CString("Visualization/Feedback plugin for the Graz experiment"); } + CString getCategory() const override { return CString("Visualization/Presentation"); } + CString getVersion() const override { return CString("0.2"); } + void release() override { } + CIdentifier getCreatedClass() const override { return OVP_ClassId_GrazVisualization; } + CString getStockItemName() const override { return CString("gtk-fullscreen"); } + IPluginObject* create() override { return new CGrazVisualization(); } + + bool hasFunctionality(const EPluginFunctionality functionality) const override { return functionality == EPluginFunctionality::Visualization; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Stimulations", OV_TypeId_Stimulations); + prototype.addInput("Amplitude", OV_TypeId_StreamedMatrix); + + prototype.addSetting("Show instruction", OV_TypeId_Boolean, "true"); + prototype.addSetting("Show feedback", OV_TypeId_Boolean, "false"); + prototype.addSetting("Delay feedback", OV_TypeId_Boolean, "false"); + prototype.addSetting("Show accuracy", OV_TypeId_Boolean, "false"); + prototype.addSetting("Predictions to integrate", OV_TypeId_Integer, "5"); + prototype.addSetting("Positive feedback only", OV_TypeId_Boolean, "false"); + + prototype.addOutput("Confusion Matrix", OV_TypeId_StreamedMatrix); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_GrazVisualizationDesc) +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay.cpp new file mode 100755 index 0000000..93bf64e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay.cpp @@ -0,0 +1,249 @@ +/* + * Note: The signal display and its subclasses (SignalChannelDisplay, SignalDisplayView) + * were rehauled to give a better user experience for different types of signal. However, + * the code could likely use significant refactoring for clarity and maintainability. + * If this is done, care should be taken that the code does not break. + */ + +#include "ovpCSignalDisplay.h" + +#include + +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + + +bool CSignalDisplay::initialize() +{ + this->getStaticBoxContext().getInputType(0, m_InputTypeID); + + if (m_InputTypeID == OV_TypeId_StreamedMatrix) { m_StreamDecoder = new Toolkit::TStreamedMatrixDecoder(*this, 0); } + else if (m_InputTypeID == OV_TypeId_Signal) { m_StreamDecoder = new Toolkit::TSignalDecoder(*this, 0); } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Unknown input stream type at stream 0\n"; + return false; + } + + m_StimulationDecoder.initialize(*this, 1); + m_UnitDecoder.initialize(*this, 2); + + m_BufferDatabase = new CBufferDatabase(*this); + + //retrieve settings + const CIdentifier displayMode = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)); + const CIdentifier scalingMode = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1)); + m_refreshInterval = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + const double verticalScale = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + const double verticalOffset = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + const double timeScale = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5); + const bool horizontalRuler = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 6); + const bool verticalRuler = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 7); + const bool multiview = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 8); + + if (m_refreshInterval < 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Refresh interval must be >= 0\n"; + return false; + } + if (verticalScale <= 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Vertical scale must be > 0\n"; + return false; + } + if (timeScale <= 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Time scale must be > 0\n"; + return false; + } + + this->getLogManager() << Kernel::LogLevel_Debug << "l_sVerticalScale=" << verticalScale << ", offset " << verticalOffset << "\n"; + this->getLogManager() << Kernel::LogLevel_Trace << "l_sScalingMode=" << scalingMode << "\n"; + + //create GUI + m_SignalDisplayView = new CSignalDisplayView(*m_BufferDatabase, displayMode, scalingMode, verticalScale, verticalOffset, timeScale, horizontalRuler, + verticalRuler, multiview); + + m_BufferDatabase->setDrawable(m_SignalDisplayView); + + //parent visualization box in visualization tree + GtkWidget* widget = nullptr; + GtkWidget* toolbar = nullptr; + dynamic_cast(m_SignalDisplayView)->getWidgets(widget, toolbar); + m_visualizationCtx = dynamic_cast(this->createPluginObject( + OVP_ClassId_Plugin_VisualizationCtx)); + m_visualizationCtx->setWidget(*this, widget); + if (toolbar != nullptr) { m_visualizationCtx->setToolbar(*this, toolbar); } + + m_lastScaleRefreshTime = 0; + + return true; +} + +bool CSignalDisplay::uninitialize() +{ + m_UnitDecoder.uninitialize(); + m_StimulationDecoder.uninitialize(); + if (m_StreamDecoder) + { + m_StreamDecoder->uninitialize(); + delete m_StreamDecoder; + } + + delete m_SignalDisplayView; + delete m_BufferDatabase; + m_SignalDisplayView = nullptr; + m_BufferDatabase = nullptr; + + if (m_visualizationCtx) + { + this->releasePluginObject(m_visualizationCtx); + m_visualizationCtx = nullptr; + } + + return true; +} + +bool CSignalDisplay::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CSignalDisplay::process() +{ + IDynamicBoxContext* boxContext = getBoxAlgorithmContext()->getDynamicBoxContext(); + + if (m_BufferDatabase->getErrorStatus()) + { + this->getLogManager() << Kernel::LogLevel_Error << + "Buffer database reports an error. Its possible that the inputs given to the Signal Display are not supported by it.\n"; + return false; + } + + // Subcomponents may generate errors while running e.g. in gtk callbacks, where its not safe/possible to call logmanager + if (!dynamic_cast(m_SignalDisplayView)->m_ErrorState.empty()) + { + for (const auto& e : dynamic_cast(m_SignalDisplayView)->m_ErrorState) { this->getLogManager() << Kernel::LogLevel_Error << e; } + return false; + } + +#ifdef DEBUG + uint64_t in = System::Time::zgetTime(); +#endif + + // Channel units on input 2 + for (size_t c = 0; c < boxContext->getInputChunkCount(2); ++c) + { + m_UnitDecoder.decode(c); + if (m_UnitDecoder.isBufferReceived()) + { + std::vector> channelUnits; + channelUnits.resize(m_UnitDecoder.getOutputMatrix()->getDimensionSize(0)); + const double* buffer = m_UnitDecoder.getOutputMatrix()->getBuffer(); + for (size_t i = 0; i < channelUnits.size(); ++i) + { + CString unit = this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_MeasurementUnit, uint64_t(buffer[i * 2 + 0])); + CString factor = this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Factor, uint64_t(buffer[i * 2 + 1])); + + channelUnits[i] = std::pair(unit, factor); + } + + if (!dynamic_cast(m_SignalDisplayView)->setChannelUnits(channelUnits)) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Unable to set channel units properly\n"; + } + } + } + + // Stimulations in input 1 + for (size_t c = 0; c < boxContext->getInputChunkCount(1); ++c) + { + m_StimulationDecoder.decode(c); + if (m_StimulationDecoder.isBufferReceived()) + { + const IStimulationSet* stimSet = m_StimulationDecoder.getOutputStimulationSet(); + const size_t count = stimSet->getStimulationCount(); + + m_BufferDatabase->setStimulationCount(count); + + for (size_t s = 0; s < count; ++s) + { + const uint64_t id = stimSet->getStimulationIdentifier(s); + const uint64_t date = stimSet->getStimulationDate(s); + CString name = getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, id); + + if (name == CString("")) { name = CString(("Id " + std::to_string(id)).c_str()); } + dynamic_cast(m_SignalDisplayView)->onStimulationReceivedCB(id, name); + m_BufferDatabase->setStimulation(s, id, date); + } + } + } + + // Streamed matrix in input 0 + for (size_t c = 0; c < boxContext->getInputChunkCount(0); ++c) + { + m_StreamDecoder->decode(c); + if (m_StreamDecoder->isHeaderReceived()) + { + const CMatrix* matrix = static_cast*>(m_StreamDecoder)->getOutputMatrix(); + + if (m_InputTypeID == OV_TypeId_Signal) + { + const uint64_t rate = static_cast*>(m_StreamDecoder)->getOutputSamplingRate(); + m_BufferDatabase->setSampling(size_t(rate)); + } + + m_BufferDatabase->setMatrixDimensionCount(matrix->getDimensionCount()); + for (size_t i = 0; i < matrix->getDimensionCount(); ++i) + { + m_BufferDatabase->setMatrixDimensionSize(i, matrix->getDimensionSize(i)); + for (size_t j = 0; j < matrix->getDimensionSize(i); ++j) { m_BufferDatabase->setMatrixDimensionLabel(i, j, matrix->getDimensionLabel(i, j)); } + } + } + + if (m_StreamDecoder->isBufferReceived()) + { + const CMatrix* matrix = static_cast*>(m_StreamDecoder)->getOutputMatrix(); + +#ifdef DEBUG + static int count = 0; + std::cout << "Push chunk " << (count++) << " at " << boxContext->getInputChunkStartTime(0, c) << "\n"; + + if (!matrix->isBufferValid()) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Chunk at [" + << boxContext->getInputChunkStartTime(0, c) << ", " + << boxContext->getInputChunkEndTime(0, c) << "] " + << "contains invalid entries\n"; + } +#endif + + const bool returnValue = m_BufferDatabase->setMatrixBuffer(matrix->getBuffer(), boxContext->getInputChunkStartTime(0, c), + boxContext->getInputChunkEndTime(0, c)); + if (!returnValue) { return false; } + } + } + + const uint64_t timeNow = getPlayerContext().getCurrentTime(); + if (m_lastScaleRefreshTime == 0 || timeNow - m_lastScaleRefreshTime > CTime(m_refreshInterval).time()) + { + dynamic_cast(m_SignalDisplayView)->refreshScale(); + m_lastScaleRefreshTime = timeNow; + } + +#ifdef DEBUG + out = System::Time::zgetTime(); + std::cout << "Elapsed1 " << out - in << "\n"; +#endif + + return true; +} +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay.h new file mode 100644 index 0000000..59231fd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay.h @@ -0,0 +1,141 @@ +#pragma once + +#include "../ovp_defines.h" + +#include +#include +#include + +#include "../ovpCBufferDatabase.h" +#include "ovpCSignalDisplay/ovpCSignalDisplayView.h" + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +/** +* This plugin opens a new GTK window and displays the incoming signals. The user may change the zoom level, +* the width of the time window displayed, ... +*/ +class CSignalDisplay final : public Toolkit::TBoxAlgorithm +{ +public: + + CSignalDisplay() = default; + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(IBoxAlgorithm, OVP_ClassId_SignalDisplay) + + Toolkit::TDecoder* m_StreamDecoder = nullptr; + Toolkit::TStimulationDecoder m_StimulationDecoder; + Toolkit::TChannelUnitsDecoder m_UnitDecoder; + + //The main object used for the display (contains all the GUI code) + CSignalDisplayDrawable* m_SignalDisplayView = nullptr; + + //Contains all the data about the incoming signal + CBufferDatabase* m_BufferDatabase = nullptr; + + CIdentifier m_InputTypeID = CIdentifier::undefined(); + +protected: + uint64_t m_lastScaleRefreshTime = 0; + double m_refreshInterval = 0; + +private: + VisualizationToolkit::IVisualizationContext* m_visualizationCtx = nullptr; +}; + + +class CSignalDisplayListener final : public Toolkit::TBoxListener +{ +public: + + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + if (index == 1) + { + CIdentifier settingType = CIdentifier::undefined(); + box.getSettingType(index, settingType); + if (settingType != OV_TypeId_Stimulations) + { + this->getLogManager() << Kernel::LogLevel_Error << "Error: Only stimulation type supported for input 2\n"; + box.setInputType(index, OV_TypeId_Stimulations); + } + } + else if (index == 2) + { + CIdentifier settingType = CIdentifier::undefined(); + box.getSettingType(index, settingType); + if (settingType != OV_TypeId_ChannelUnits) + { + this->getLogManager() << Kernel::LogLevel_Error << "Error: Only measurement unit type supported for input 3\n"; + box.setInputType(index, OV_TypeId_ChannelUnits); + } + } + + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +/** + * Signal Display plugin descriptor + */ +class CSignalDisplayDesc final : public IBoxAlgorithmDesc +{ +public: + CString getName() const override { return CString("Signal display"); } + CString getAuthorName() const override { return CString("Bruno Renier, Yann Renard, Alison Cellard, Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Displays the incoming stream"); } + + CString getDetailedDescription() const override { return CString("This box can be used to visualize signal and matrix streams"); } + + CString getCategory() const override { return CString("Visualization/Basic"); } + CString getVersion() const override { return CString("0.3"); } + void release() override { } + CIdentifier getCreatedClass() const override { return OVP_ClassId_SignalDisplay; } + CString getStockItemName() const override { return CString("gtk-zoom-fit"); } + IPluginObject* create() override { return new CSignalDisplay(); } + IBoxListener* createBoxListener() const override { return new CSignalDisplayListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool hasFunctionality(const EPluginFunctionality functionality) const override { return functionality == EPluginFunctionality::Visualization; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("Display Mode", OVP_TypeId_SignalDisplayMode, "Scan"); + prototype.addSetting("Auto vertical scale", OVP_TypeId_SignalDisplayScaling, CSignalDisplayView::SCALING_MODES[0].c_str()); + prototype.addSetting("Scale refresh interval (secs)", OV_TypeId_Float, "5"); + prototype.addSetting("Vertical Scale",OV_TypeId_Float, "100"); + prototype.addSetting("Vertical Offset",OV_TypeId_Float, "0"); + prototype.addSetting("Time Scale", OV_TypeId_Float, "10"); + prototype.addSetting("Bottom ruler", OV_TypeId_Boolean, "true"); + prototype.addSetting("Left ruler", OV_TypeId_Boolean, "false"); + prototype.addSetting("Multiview", OV_TypeId_Boolean, "false"); + + prototype.addInput("Data", OV_TypeId_Signal); + prototype.addInput("Stimulations", OV_TypeId_Stimulations); + prototype.addInput("Channel Units", OV_TypeId_ChannelUnits); + + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + prototype.addInputSupport(OV_TypeId_ChannelUnits); + + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_SignalDisplayDesc) +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalChannelDisplay.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalChannelDisplay.cpp new file mode 100644 index 0000000..f642549 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalChannelDisplay.cpp @@ -0,0 +1,980 @@ +/* + * Notes: + * + * - currently this component actually never redraws by design. Calling the corresp. gtk functions for the whole + * set of buffers in memory causes the display to lag/freeze on Windows with big signals. If you 'fix' the + * redraw to actually work, make sure that the display runs smoothly in real-time on Win when Signal Display is in + * full screen (maximized), 1000hz and 256 channels, including using scrollbar, alt-tab, resize, occluding windows, etc. + * + * - explanation of y margins: + * + * outerTop --- + * innerTop --- + * [a single signal channel here] + * innerBottom --- + * outerBottom --- + * + * A channel is imagined to reside between the 'outer' top and bottom margins with a little headroom. + * The automatic rescalers should react if the signal passes outside either of the 'inner' margins. + */ + +#include "ovpCSignalChannelDisplay.h" +#include "ovpCSignalDisplayView.h" +#include +#include // For unix system +#include +#include "../../utils.h" + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +// #define DEBUG 1 + +// Redraw can be enabled by setting the following, however some bugs remain in some cases, esp. +// if the system is not able to render fast enough for the signal. +#define SUPPORT_REDRAW 0 + +static gboolean DrawingAreaExposeEventCB(GtkWidget* widget, GdkEventExpose* event, gpointer data); +static gboolean DrawingAreaConfigureCB(GtkWidget* widget, GdkEventExpose* event, gpointer data); +static gboolean DrawingAreaResizeEventCB(GtkWidget* widget, GtkAllocation* allocation, gpointer data); +static void DrawingAreaClickedEventCB(GtkWidget* widget, GdkEventButton* event, gpointer data); +static void DrawingAreaEnterEventCB(GtkWidget* widget, GdkEventCrossing* event, gpointer data); +static void DrawingAreaLeaveEventCB(GtkWidget* widget, GdkEventCrossing* event, gpointer data); +static gboolean VisibleRegionChangedCB(GtkWidget* widget, gpointer data); + +CSignalChannelDisplay::CSignalChannelDisplay(CSignalDisplayView* displayView, const int channelDisplayW, const int channelDisplayH, const int leftRulerW, + const int leftRulerH) + : m_ParentDisplayView(displayView), m_Database(displayView->m_Buffer), m_LeftRulerW(leftRulerW), m_LeftRulerH(leftRulerH), m_StopY(leftRulerH) +{ + //creates the drawing area + m_DrawingArea = gtk_drawing_area_new(); + gtk_widget_set_size_request(m_DrawingArea, channelDisplayW, channelDisplayH); + + //Set background color (White) + GdkColor backgroundColor = InitGDKColor(0, 65535, 65535, 65535); + + gtk_widget_modify_bg(m_DrawingArea, GTK_STATE_NORMAL, &backgroundColor); + + //connects the signals + gtk_widget_add_events(GTK_WIDGET(m_DrawingArea), GDK_BUTTON_PRESS_MASK); + gtk_widget_add_events(GTK_WIDGET(m_DrawingArea), GDK_ENTER_NOTIFY_MASK); + gtk_widget_add_events(GTK_WIDGET(m_DrawingArea), GDK_LEAVE_NOTIFY_MASK); + gtk_widget_add_events(GTK_WIDGET(m_DrawingArea), GDK_CONFIGURE); // Size change + + g_signal_connect_after(G_OBJECT(m_DrawingArea), "expose_event", G_CALLBACK(DrawingAreaExposeEventCB), this); + g_signal_connect_after(G_OBJECT(m_DrawingArea), "size-allocate", G_CALLBACK(DrawingAreaResizeEventCB), this); + g_signal_connect_after(G_OBJECT(m_DrawingArea), "button-press-event", G_CALLBACK(DrawingAreaClickedEventCB), this); + g_signal_connect_after(G_OBJECT(m_DrawingArea), "enter-notify-event", G_CALLBACK(DrawingAreaEnterEventCB), this); + g_signal_connect_after(G_OBJECT(m_DrawingArea), "leave-notify-event", G_CALLBACK(DrawingAreaLeaveEventCB), this); + g_signal_connect_after(G_OBJECT(m_DrawingArea), "configure-event", G_CALLBACK(DrawingAreaConfigureCB), this); // Size change, set draw limits + + // These take care of setting the redraw limits in the case of vertical scroll by user + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_ParentDisplayView->m_Builder, "SignalDisplayChannelsScrolledWindow")); + GtkAdjustment* vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(widget)); + g_signal_connect_after(G_OBJECT(vadj), "value-changed", G_CALLBACK(VisibleRegionChangedCB), this); +} + +CSignalChannelDisplay::~CSignalChannelDisplay() +{ + for (auto it = m_LeftRuler.begin(); it != m_LeftRuler.end(); ++it) { delete it->second; } + m_LeftRuler.clear(); + + /* + m_TranslateY.clear(); + m_InnerTopMargin.clear(); + m_OuterTopMargin.clear(); + m_OuterBottomMargin.clear(); + m_InnerBottomMargin.clear(); + m_ScaleY.clear();*/ +} + +GtkWidget* CSignalChannelDisplay::getRulerWidget(const size_t index) const +{ + const auto it = m_LeftRuler.find(index); + if (it != m_LeftRuler.end() && it->second) { return it->second->getWidget(); } + return nullptr; +} + +void CSignalChannelDisplay::onResizeEventCB(const gint width, const gint height) +{ + m_Width = width; + m_Height = height; + + m_StartY = 0; + m_StopY = m_Height; + + updateScale(); +} + +void CSignalChannelDisplay::updateScale() +{ + const size_t samplesPerBuffer = m_Database->m_DimSizes[1]; + size_t nBufferToDisplay = m_Database->m_NBufferToDisplay; + if (samplesPerBuffer == 1 && nBufferToDisplay != 1) { nBufferToDisplay--; } + + m_WidthPerBuffer = double(m_Width) / double(nBufferToDisplay); + + m_PointStep = 0; + if ((samplesPerBuffer * nBufferToDisplay) - 1 != 0) { m_PointStep = double(m_Width) / double((samplesPerBuffer * nBufferToDisplay) - 1); } + +#ifdef DEBUG + std::cout << "Requesting full redraw, C (updateScale)\n"; +#endif + redrawAllAtNextRefresh(true); +} + +void CSignalChannelDisplay::resetChannelList() +{ + m_ChannelList.clear(); + m_TranslateY.clear(); + m_OuterTopMargin.clear(); + m_InnerTopMargin.clear(); + m_InnerBottomMargin.clear(); + m_OuterBottomMargin.clear(); + m_ScaleY.clear(); +} + +void CSignalChannelDisplay::addChannel(const size_t channel) +{ + m_ChannelList.push_back(channel); + m_LeftRuler[channel] = new CSignalDisplayLeftRuler(m_LeftRulerW, m_LeftRulerH); + m_TranslateY.push_back(0); + m_OuterTopMargin.push_back(0); + m_InnerTopMargin.push_back(0); + m_InnerBottomMargin.push_back(0); + m_OuterBottomMargin.push_back(0); + m_ScaleY.push_back(1); +} + +// Adds a channel, but no ruler +void CSignalChannelDisplay::addChannelList(const size_t channel) +{ + m_ChannelList.push_back(channel); + m_TranslateY.push_back(0); + m_OuterTopMargin.push_back(0); + m_InnerTopMargin.push_back(0); + m_InnerBottomMargin.push_back(0); + m_OuterBottomMargin.push_back(0); + m_ScaleY.push_back(1); +} + +uint64_t CSignalChannelDisplay::cropCurve(const uint64_t pointCount) const +{ + if (pointCount == 0) { return 0; } + + //clears the vector of the points to draw + m_ParentDisplayView->m_Points.clear(); + + GdkPoint point; + std::vector>& curvePoints = m_ParentDisplayView->m_RawPoints; + + GdkRegion* reg = gdk_drawable_get_visible_region(m_DrawingArea->window); + GdkRectangle box; + gdk_region_get_clipbox(reg, &box); + + const double yStart = box.y, + yStop = box.y + box.height; + + //for each couple of successive points + for (size_t i = 0; i < size_t(pointCount - 1); ++i) + { + //get the two points coordinates + const double x0 = curvePoints[i].first, y0 = curvePoints[i].second, x1 = curvePoints[i + 1].first, y1 = curvePoints[i + 1].second; + //if(!gdk_region_point_in(reg, x0, y0) || !gdk_region_point_in(reg, x1, y1)) { continue; } + + const bool firstOutTop = (y0 < yStart), firstOutBottom = (y0 >= yStop), + secondOutTop = (y1 < yStart), secondOutBottom = (y1 >= yStop), + firstPointOut = firstOutTop || firstOutBottom, + secondPointOut = secondOutTop || secondOutBottom; + + //if one of the points is out of the drawing area + if (firstPointOut || secondPointOut) + { + if ((firstOutTop && secondOutTop) || (firstOutBottom && secondOutBottom)) { continue; } // Both out and on the same side, forget about it + + //computes the line's coefficients + const double a = (y1 - y0) / (x1 - x0), // slope + b = y0 - (a * x0); // intersect + + //if the first point is out of the window + if (firstOutTop) + { + //computes its X-coordinate with the minimum Y + point.x = gint(-b / a); + //we take -1 and not 0, this way, the line between the two successive intersect points won't be drawn + point.y = gint(yStart - 1); + //adds it to the vector + m_ParentDisplayView->m_Points.push_back(point); + } + else if (firstOutBottom) + { + //same with the maximum Y + point.x = gint((yStop - b) / a); + point.y = gint(yStop); + m_ParentDisplayView->m_Points.push_back(point); + } + //if it is inside, keep its current coordinates + else + { + point.x = gint(x0); + point.y = gint(y0); + m_ParentDisplayView->m_Points.push_back(point); + } + + //if the second point is out of the window, computes its intersect point and adds it + if (secondOutTop) + { + point.x = gint(-b / a); + point.y = gint(yStart - 1); + m_ParentDisplayView->m_Points.push_back(point); + } + else if (secondOutBottom) + { + point.x = gint((yStop - b) / a); + point.y = gint(yStop); + m_ParentDisplayView->m_Points.push_back(point); + } + } + else //both points lie within the drawing area + { + //keep the first point + point.x = gint(x0); + point.y = gint(y0); + m_ParentDisplayView->m_Points.push_back(point); + + //add the last point + if (i == pointCount - 2) + { + point.x = gint(x1); + point.y = gint(y1); + m_ParentDisplayView->m_Points.push_back(point); + } + } + + // if(point.x=box.x+box.width) { std::cout << "blam\n"; } // assert + } + + //return the number of points to draw + return m_ParentDisplayView->m_Points.size(); +} + +void CSignalChannelDisplay::getUpdateRectangle(GdkRectangle& rect) const +{ + rect.y = m_StartY; + rect.height = m_StopY - m_StartY; + + //if in scroll mode, or if redrawing everything, update the whole drawing area + if (m_Database->getDisplayMode() == Scroll || mustRedrawAll()) + { + rect.x = 0; + rect.width = m_Width; + } + else //partial redraw only + { + //determine index and position of first buffer to display, and index of first sample to display + size_t bufferIdx = 0; + size_t sampleIdx = 0; + size_t bufferPos = 0; + getFirstBufferToDisplayInformation(bufferIdx, sampleIdx, bufferPos); + + //X position of first sample that will be drawn when channel is refreshed + const double startX = getSampleXCoordinate(bufferPos, sampleIdx, 0); + + //position on screen of latest buffer + const auto latestBufferPosition = size_t(bufferPos + m_Database->m_SampleBuffers.size() - 1 - bufferIdx); + + //X position of last sample that will be drawn when channel is refreshed + const auto samplesPerBuffer = size_t(m_Database->m_DimSizes[1]); + const double endX = getSampleXCoordinate(latestBufferPosition, samplesPerBuffer - 1, 0); + + rect.x = gint(startX); + rect.width = gint(endX) - gint(startX) + 1 /* this extra pixel accounts for vertical update line*/ + 1; + } +} + +#if SUPPORT_REDRAW +void CSignalChannelDisplay::redrawAllAtNextRefresh(bool redraw) { m_redrawAll = redraw; } +#else +void CSignalChannelDisplay::redrawAllAtNextRefresh(bool /* redraw */) { m_RedrawAll = false; } // currently NOP, see comment at top +#endif + +void CSignalChannelDisplay::draw(const GdkRectangle& /*area*/) +{ + //ensure there is data to display + if (!m_Database || m_Database->m_SampleBuffers.empty()) { return; } + +#ifdef DEBUG + uint64_t in = System::Time::zgetTime(); + if (mustRedrawAll()) { std::cout << "Draw(): RedrawAll was requested of " << this << "\n"; } +#endif + + const double sizePerChannel = m_Height / double(m_ChannelList.size()); + + //updates the left ruler + if (m_MultiView) + { + const double max = m_TranslateY[0] - ((0 - ((m_Height * m_ZoomScaleY) / 2) + (m_ZoomTranslateY * m_ZoomScaleY)) / (m_ScaleY[0] * m_ZoomScaleY * m_Height + )); + const double min = m_TranslateY[0] - ((m_Height - ((m_Height * m_ZoomScaleY) / 2) + (m_ZoomTranslateY * m_ZoomScaleY)) / ( + m_ScaleY[0] * m_ZoomScaleY * m_Height)); + + m_LeftRuler[0]->update(min, max); + } + else + { + // own ruler for each channel + for (size_t i = m_FirstChannelToDisplay; i <= m_LastChannelToDisplay; ++i) + { + const double max = m_TranslateY[i] - ((0 - ((sizePerChannel * m_ZoomScaleY) / 2) + (m_ZoomTranslateY * m_ZoomScaleY)) / ( + m_ScaleY[i] * m_ZoomScaleY * sizePerChannel)); + const double min = m_TranslateY[i] - ((sizePerChannel - ((sizePerChannel * m_ZoomScaleY) / 2) + (m_ZoomTranslateY * m_ZoomScaleY)) / ( + m_ScaleY[i] * m_ZoomScaleY * sizePerChannel)); + + m_LeftRuler[m_ChannelList[i]]->update(min, max); + } + } + + //determine index and position of first (in the sense of leftmost) buffer to display, and index of first sample to display + const auto samplesPerBuffer = size_t(m_Database->m_DimSizes[1]); + size_t bufferIdx = 0; + size_t sampleIdx = 0; + size_t bufferPos = 0; + getFirstBufferToDisplayInformation(bufferIdx, sampleIdx, bufferPos); + + if (m_Database->getDisplayMode() == Scan && !mustRedrawAll()) + { + //X position of last drawn sample (0 if restarting from left edge) + const double startX = getSampleXCoordinate(bufferPos, sampleIdx, 0); + +#if SUPPORT_REDRAW + //position on screen of latest buffer + const size_t latestBufferPosition = bufferPos + m_Database->m_SampleBuffers.size()-1- bufferIdx; + + //X position of last sample that will be drawn when channel is refreshed + const double endX = getSampleXCoordinate(latestBufferPosition, samplesPerBuffer-1, 0); + // is exposed area larger than the currently shown samples indicate? + if(exposedArea.x < (gint)startX || + exposedArea.width-1/*exposed width is 1 pixel larger than asked for*/ > (gint)endX - (gint)startX + 1 + 1) + { +#ifdef DEBUG + std::cout << "Requesting full redraw, A (expose larger than sample area)\n"; +#endif + //this means the window was invalidated by an external widget : redraw it all + redrawAllAtNextRefresh(true); + + m_Database->getIndexOfBufferStartingAtTime(m_ParentDisplayView->m_leftmostDisplayedTime, bufferIdx); + bufferPos = 0; + } + else +#endif + { + //start drawing from at least one pixel to the left of first sample so that partial redraws connect well together + const auto oldX = size_t(startX); + size_t curX; + do + { + if (sampleIdx == 0) + { + if (bufferPos == 0) { break; } + + bufferIdx--; + bufferPos--; + sampleIdx = samplesPerBuffer - 1; + } + else { sampleIdx--; } + + curX = size_t(getSampleXCoordinate(bufferPos, sampleIdx, 0)); + } while (curX >= oldX); + } + } + + //determine start x coord of first buffer to display + double bufferStartX; + if (m_Database->getDisplayMode() == Scroll) + { + bufferStartX = m_Width - m_Database->m_SampleBuffers.size() * m_WidthPerBuffer; + if (bufferStartX < 0) { bufferStartX = 0; } + } + else { bufferStartX = getSampleXCoordinate(bufferPos, 0, 0); } + + const auto lastBufferToDisplay = size_t(m_Database->m_SampleBuffers.size() - 1); + + + // std::cout << "plot " << firstChannelToDisplay << "," << lastChannelToDisplay << "\n"; + + + //draw latest signals + drawSignals(bufferIdx, lastBufferToDisplay, sampleIdx, bufferStartX, m_FirstChannelToDisplay, m_LastChannelToDisplay); + + //in scan mode, there is more to be drawn + if (m_Database->getDisplayMode() == Scan) + { + //draw progress line + drawProgressLine(bufferIdx, bufferPos); + +#if SUPPORT_REDRAW + //if redrawing the whole window + if(m_redrawAll == true && bufferIdx > 0) + { + //get start x coord of first buffer after the most recent one + bufferStartX = getSampleXCoordinate(lastBufferToDisplay - bufferIdx + 1, 0, bufferStartX); + + //draw older signals (to the right of progress line) + drawSignals(0, bufferIdx -1, 0, bufferStartX, m_FirstChannelToDisplay, m_LastChannelToDisplay); + } +#else + // We never redraw the whole window since with big signals (e.g. 256chns, 1000hz), + // this could cause rendering on Windows to freeze on resizes in a manner + // that the display doesn't recover +#endif + } + + //draw Y=0 line + drawZeroLine(); + + //update time of latest displayed data + m_LatestDisplayedTime = m_Database->m_EndTime.back(); + +#ifdef DEBUG + uint64_t out = System::Time::zgetTime(); +// std::cout << "Elapsed2 " << CTime(out-in).toSeconds() << ", ld=" << m_latestDisplayedTime << "\n"; +#endif + + //reset redraw all flag + redrawAllAtNextRefresh(false); +} + +void CSignalChannelDisplay::computeZoom(const bool zoomIn, const double x, const double y) +{ + if (zoomIn) + { + m_ZoomTranslateX += (x - (m_Width / (m_ZoomFactor * 2))) / m_ZoomScaleX; + m_ZoomTranslateY += (y - (m_Height / (m_ZoomFactor * 2))) / m_ZoomScaleY; + + m_ZoomScaleX *= m_ZoomFactor; + m_ZoomScaleY *= m_ZoomFactor; + } + else + { + m_ZoomScaleX /= m_ZoomFactor; + m_ZoomScaleY /= m_ZoomFactor; + + if (fabs(m_ZoomScaleY - 1) < 0.001) { m_ZoomScaleX = m_ZoomScaleY = 1.; } + + m_ZoomTranslateX -= (x - (m_Width / (m_ZoomFactor * 2))) / m_ZoomScaleX; + m_ZoomTranslateY -= (y - (m_Height / (m_ZoomFactor * 2))) / m_ZoomScaleY; + + if (fabs(m_ZoomTranslateY) < 0.001) { m_ZoomTranslateX = m_ZoomTranslateY = 1.; } + } + + //check if we are out of the window + if (m_ZoomTranslateX < 0) { m_ZoomTranslateX = 0; } + if (m_ZoomTranslateY < 0) { m_ZoomTranslateY = 0; } + if (m_ZoomTranslateX > m_Width - (m_Width / m_ZoomScaleX)) { m_ZoomTranslateX = m_Width - (m_Width / m_ZoomScaleX); } + if (m_ZoomTranslateY > m_Height - (m_Height / m_ZoomScaleY)) { m_ZoomTranslateY = m_Height - (m_Height / m_ZoomScaleY); } + //Put a Y translation breaks the zoom out so let's set it to 0 + m_ZoomTranslateY = 0; +} + +void CSignalChannelDisplay::getDisplayedValueRange(std::vector& min, std::vector& max) const +{ + min.resize(m_ChannelList.size()); + max.resize(m_ChannelList.size()); + + for (size_t k = 0; k < m_ChannelList.size(); ++k) + { + //update maximum and minimum values displayed by this channel + double currentMin, currentMax; + //get local min/max + m_Database->getDisplayedChannelLocalMinMaxValue(m_ChannelList[k], currentMin, currentMax); + + //set parameter to recomputed range + min[k] = currentMin; + max[k] = currentMax; + } +} + +void CSignalChannelDisplay::setGlobalScaleParameters(const double min, const double max, const double margin) +{ + const double maxTop = max + margin; + const double minBottom = min - margin; + + for (size_t k = 0; k < m_ChannelList.size(); ++k) + { + m_OuterTopMargin[k] = maxTop; + m_InnerTopMargin[k] = max; + + m_InnerBottomMargin[k] = min; + m_OuterBottomMargin[k] = minBottom; + } + + updateDisplayParameters(); +} + +void CSignalChannelDisplay::setLocalScaleParameters(const size_t subChannelIdx, const double min, const double max, const double margin) +{ + m_OuterTopMargin[subChannelIdx] = max + margin; + m_InnerTopMargin[subChannelIdx] = max; + m_InnerBottomMargin[subChannelIdx] = min; + m_OuterBottomMargin[subChannelIdx] = min - margin; + // std::cout << "Scaling to [" << min << "," << max << "]S\n"; +} + +// Assume [a,b] is the range between MinimumBottom and MaxiMumTop of k. If c \in [a,b], +// then m_scales[k]*(m_translates[k]-c) should be in what??? +void CSignalChannelDisplay::updateDisplayParameters() +{ + //compute the translation needed to center the signal correctly in the window + // m_TranslateX = 0; + + for (size_t k = 0; k < m_ChannelList.size(); ++k) + { + if (m_OuterTopMargin[k] == m_OuterBottomMargin[k]) { m_ScaleY[k] = 1; } + else { m_ScaleY[k] = 1 / (m_OuterTopMargin[k] - m_OuterBottomMargin[k]); } + m_TranslateY[k] = (m_OuterTopMargin[k] + m_OuterBottomMargin[k]) / 2; + } + + //reflect changes +#ifdef DEBUG + std::cout << "Requesting full redraw, F (display params changed)\n"; +#endif + +#if SUPPORT_REDRAW + redrawAllAtNextRefresh(true); +#else + // Side effect: draw a little boxes to denote discontinuity in the signal due + // to the runtime change of scale. + GdkColor lineColor = InitGDKColor(0, 65535, 0, 0); + gdk_gc_set_rgb_fg_color(m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], &lineColor); + + size_t bufferIdx = 0; + size_t sampleIdx = 0; + size_t bufferPos = 0; + getFirstBufferToDisplayInformation(bufferIdx, sampleIdx, bufferPos); + + GdkRegion* region = gdk_drawable_get_visible_region(m_DrawingArea->window); + GdkRectangle box; + gdk_region_get_clipbox(region, &box); + + const double startX = getSampleXCoordinate(bufferPos, sampleIdx, 0); + gdk_draw_rectangle(m_DrawingArea->window, m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], true, gint(startX) - 2, box.y, gint(2), 4); + gdk_draw_rectangle(m_DrawingArea->window, m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], true, gint(startX) - 2, box.y + box.height - 4, + gint(2), 4); + + lineColor.red = 0 * 65535 / 255; + lineColor.green = 0 * 65535 / 255; + lineColor.blue = 0 * 65535 / 255; + gdk_gc_set_rgb_fg_color(m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], &lineColor); + +#endif +} + +void CSignalChannelDisplay::getFirstBufferToDisplayInformation(size_t& bufferIdx, size_t& sampleIdx, size_t& bufferPos) const +{ + bufferIdx = 0; + sampleIdx = 0; + bufferPos = 0; + + if (m_Database->getDisplayMode() == Scan) + { + if (m_RedrawAll) + { + m_Database->getIndexOfBufferStartingAtTime(m_ParentDisplayView->m_LeftmostDisplayedTime, bufferIdx); + return; + } + + const bool haveLatestBufferDisplayed = m_Database->getIndexOfBufferStartingAtTime(m_LatestDisplayedTime, bufferIdx); + if (!haveLatestBufferDisplayed) + { +#if SUPPORT_REDRAW + //chances are drawing is up to date and this call was triggered following an "external" expose event + //(e.g. the window was covered by a widget which was just moved, resulting in an expose event) +#ifdef DEBUG + std::cout << "Requesting full redraw, B1 (buffer not displayed)\n"; +#endif + m_Database->getIndexOfBufferStartingAtTime(m_ParentDisplayView->m_leftmostDisplayedTime, rFirstBufferToDisplay); + redrawAllAtNextRefresh(true); + return; +#else + //=>let's just start from the last sample + bufferIdx = size_t(m_Database->m_SampleBuffers.size() - 1); +#endif + } + + //partial redraw + size_t leftmostBufferIdx = 0; + m_Database->getIndexOfBufferStartingAtTime(m_ParentDisplayView->m_LeftmostDisplayedTime, leftmostBufferIdx); + + if (leftmostBufferIdx > bufferIdx) + { + // @fixme not sure why this happens... + bufferPos = 0; + } + else + { + //get position of first new buffer + bufferPos = bufferIdx - leftmostBufferIdx; + + //redraw from last sample of last drawn buffer, if we're not restarting from left edge + if (bufferPos > 0) + { + bufferIdx--; + bufferPos--; + sampleIdx = size_t(m_Database->m_DimSizes[1]) - 1; + } + } + } +} + +int CSignalChannelDisplay::getBufferStartX(const size_t pos) const { return int((pos * m_WidthPerBuffer - 0) * 1); } + +double CSignalChannelDisplay::getSampleXCoordinate(const size_t bufferPos, const size_t sampleIdx, const double offset) const +{ + return double((offset + bufferPos * m_WidthPerBuffer + sampleIdx * m_PointStep - 0) * 1); +} + +double CSignalChannelDisplay::getSampleYCoordinate(const double value, const size_t channelIdx) +{ + //TODO : precompute some factors! + const double sizePerChannel = m_Height / double(m_ChannelList.size()); + + const double translatedData = m_TranslateY[channelIdx] - value; + return m_ScaleY[channelIdx] * m_ZoomScaleY * sizePerChannel * translatedData + (channelIdx + 1) * sizePerChannel * m_ZoomScaleY - m_ZoomTranslateY * + m_ZoomScaleY - sizePerChannel / 2; +} + +double CSignalChannelDisplay::getSampleYMultiViewCoordinate(const double value) +{ + const double translatedData = m_TranslateY[0] - value; + return m_ScaleY[0] * m_ZoomScaleY * m_Height * translatedData + (m_Height * m_ZoomScaleY) / 2 - m_ZoomTranslateY * m_ZoomScaleY; +} + +bool CSignalChannelDisplay::drawSignals(const size_t firstBuffer, const size_t lastBuffer, const size_t firstSample, const double startX, + const size_t firstChannel, size_t lastChannel) +{ + //compute and draw sample points + const auto samplesPerBuffer = size_t(m_Database->m_DimSizes[1]); + if (samplesPerBuffer == 0) { return false; } // @FIXME silent fail, but no logManager here, so can't print + + GdkColor lineColor = InitGDKColor(0, 0, 0, 0); + lastChannel = std::min(lastChannel, size_t(m_ChannelList.size() - 1)); + +#ifdef DEBUG + // std::cout << "Channel range [" << firstChannelToDisplay << "," << lastChannelToDisplay << "]\n"; +#endif + + for (size_t k = firstChannel; k <= lastChannel; ++k) + { + if (m_MultiView) { m_ParentDisplayView->getMultiViewColor(m_ChannelList[k], lineColor); } + else { if (m_CurrentSignalMode != GlobalBestFit) { lineColor.red = 65535; } } + gdk_gc_set_rgb_fg_color(m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], &lineColor); + + size_t index = 0; + + for (size_t j = firstBuffer; j <= lastBuffer; ++j) + { + const double* buffer = (m_Database->m_SampleBuffers)[j] + (m_ChannelList[k] * samplesPerBuffer); + + //for all samples in current buffer + for (size_t i = (j == firstBuffer) ? firstSample : 0; i < samplesPerBuffer; ++i, ++index) + { + if (m_MultiView) + { + (m_ParentDisplayView->m_RawPoints)[index].first = getSampleXCoordinate(size_t(j - firstBuffer), size_t(i), startX); + (m_ParentDisplayView->m_RawPoints)[index].second = getSampleYMultiViewCoordinate(buffer[i]); + } + else + { + (m_ParentDisplayView->m_RawPoints)[index].first = getSampleXCoordinate(j - firstBuffer, i, size_t(startX)); + (m_ParentDisplayView->m_RawPoints)[index].second = getSampleYCoordinate(buffer[i], size_t(k)); + } + } + } + + //crop points + const uint64_t nPointsToDisplay = cropCurve(index); + + +#ifdef DEBUG + if(numberOfPointsToDisplay>2000) { std::cout << "points " << numberOfPointsToDisplay << " in " << k << "\n"; } +#endif + + if (nPointsToDisplay != 0) + { + //draw all the points and link them + gdk_draw_lines(m_DrawingArea->window, m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], &m_ParentDisplayView->m_Points[0], + gint(nPointsToDisplay)); + } + } + + if (!m_Database->m_Stimulations.empty()) + { + //switch to dashed line + gdk_gc_set_line_attributes(m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], 1, GDK_LINE_ON_OFF_DASH, GDK_CAP_BUTT, GDK_JOIN_BEVEL); + + //compute current time window start and end time +#if 0 + uint64_t startTime = m_Database->m_startTimes[bufferIdx] + m_Database->m_BufferDuration * sampleIdx / samplesPerBuffer; + uint64_t endTime = m_Database->m_startTimes[lastBufferToDisplay] + m_Database->m_BufferDuration; +#else + const uint64_t firstBufferDuration = m_Database->m_EndTime[firstBuffer] - m_Database->m_StartTime[firstBuffer]; + const uint64_t lastBufferDuration = m_Database->m_EndTime[lastBuffer] - m_Database->m_StartTime[lastBuffer]; + const uint64_t startTime = m_Database->m_StartTime[firstBuffer] + firstBufferDuration * firstSample / samplesPerBuffer; + const uint64_t endTime = m_Database->m_StartTime[lastBuffer] + lastBufferDuration; +#endif + + for (auto it = m_Database->m_Stimulations.begin(); it != m_Database->m_Stimulations.end(); ++it) + { + //look for stimulations lying in current time window + if (it->first >= startTime && it->first <= endTime) + { + size_t j = firstBuffer; + while (it->first > m_Database->m_EndTime[j]) { j++; } + + m_ParentDisplayView->getStimulationColor(it->second, lineColor); + gdk_gc_set_rgb_fg_color(m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], &lineColor); + +#if 0 + const auto i = size_t((it->first - m_Database->m_startTimes[j]) * samplesPerBuffer / m_Database->m_BufferDuration); +#else + const uint64_t duration = m_Database->m_EndTime[j] - m_Database->m_StartTime[j]; + const auto i = size_t((it->first - m_Database->m_StartTime[j]) * samplesPerBuffer / duration); +#endif + const auto x = size_t(getSampleXCoordinate(j - firstBuffer, i, startX)); + gdk_draw_line(m_DrawingArea->window, m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], x, m_StartY, x, m_StopY); + } + } + } + + lineColor.red = 0; + lineColor.green = 0; + lineColor.blue = 0; + gdk_gc_set_rgb_fg_color(m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], &lineColor); + gdk_gc_set_line_attributes(m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], 1, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_BEVEL); + + return true; +} + +void CSignalChannelDisplay::drawProgressLine(const size_t firstBufferIdx, const size_t firstBufferPos) const +{ + //draw line only if there's more data to be drawn after it + if (m_Database->m_SampleBuffers.size() < m_Database->m_NBufferToDisplay || + m_ParentDisplayView->m_LeftmostDisplayedTime > m_Database->m_StartTime[0]) + { + const auto samplesPerBuffer = size_t(m_Database->m_DimSizes[1]); + + //position on screen of latest buffer + const auto latestBufferPosition = size_t(firstBufferPos + m_Database->m_SampleBuffers.size() - 1 - firstBufferIdx); + + //X position of last sample that will be drawn when channel is refreshed + const double endX = getSampleXCoordinate(latestBufferPosition, samplesPerBuffer - 1, 0); + + GdkColor lineColor = InitGDKColor(0, 0, 65535, 0); + gdk_gc_set_rgb_fg_color(m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], &lineColor); + + //draw line one pixel after last sample + gdk_draw_line(m_DrawingArea->window, m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], size_t(endX) + 1, 0, size_t(endX) + 1, m_Height - 1); + + GdkColor black = InitGDKColor(0, 0, 0, 0); + gdk_gc_set_rgb_fg_color(m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], &black); + } +} + +void CSignalChannelDisplay::drawZeroLine() +{ + //switch to dashed line + gdk_gc_set_line_attributes(m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], 1, GDK_LINE_ON_OFF_DASH, GDK_CAP_BUTT, GDK_JOIN_BEVEL); + + const double sizePerChannel = m_Height / double(m_ChannelList.size()); + + //draw Y=0 line + if (m_MultiView) + { + const gint midPoint = gint(getSampleYMultiViewCoordinate(m_TranslateY[0])); + const gint zeroY = gint(getSampleYMultiViewCoordinate(0)); + if (zeroY >= 0 && zeroY < gint(m_Height) && std::abs(midPoint - zeroY) < sizePerChannel / 2.0) + { + gdk_draw_line(m_DrawingArea->window, m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], 0, zeroY, m_Width, zeroY); + } + } + else + { + for (size_t k = m_FirstChannelToDisplay; k <= m_LastChannelToDisplay; ++k) + { + const gint midPoint = gint(getSampleYCoordinate(m_TranslateY[k], k)); + const gint zeroY = gint(getSampleYCoordinate(0, k)); + + if (zeroY >= 0 && zeroY < gint(m_Height) && std::abs(midPoint - zeroY) < sizePerChannel / 2.0) + { + gdk_draw_line(m_DrawingArea->window, m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], 0, zeroY, m_Width, zeroY); + } + } + } + + //switch back to normal line + gdk_gc_set_line_attributes(m_DrawingArea->style->fg_gc[GTK_WIDGET_STATE(m_DrawingArea)], 1, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_BEVEL); +} + +void CSignalChannelDisplay::updateLimits() +{ + if (m_Height == 0) + { + // Bail out, no use setting the limits based on 0 ... this happens sometimes (todo: why?) + // display->m_FirstChannelToDisplay = 0; + // display->m_LastChannelToDisplay = display->m_ChannelList.size() - 1; + return; + } + + if (m_MultiView) + { + m_FirstChannelToDisplay = 0; + m_LastChannelToDisplay = size_t(m_ChannelList.size() - 1); + + // keep as is: display->m_StartY, display->m_StopY + return; + } + + GtkWidget* widget = GTK_WIDGET(gtk_builder_get_object(m_ParentDisplayView->m_Builder, "SignalDisplayChannelsScrolledWindow")); + + GtkAdjustment* vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(widget)); + + const double areaStartY = vadj->value; + const double areaSizeY = vadj->page_size; + + const double sizePerChannel = m_Height / double(m_ChannelList.size()) * m_ZoomScaleY; + m_FirstChannelToDisplay = size_t(std::floor(areaStartY / sizePerChannel)); + m_LastChannelToDisplay = std::min(size_t(m_ChannelList.size() - 1), size_t(m_FirstChannelToDisplay + std::floor(areaSizeY / sizePerChannel) + 1)); + + m_StartY = size_t(sizePerChannel * m_FirstChannelToDisplay); + m_StopY = std::min(m_Height, size_t(sizePerChannel * (m_LastChannelToDisplay + 1))); + +#ifdef DEBUG + std::cout << "Requesting full redraw, Q (updated limits)\n"; +#endif + +#if SUPPORT_REDRAW + redrawAllAtNextRefresh(true); +#else + // gdk_window_clear(m_drawingArea->window); + // gtk_widget_queue_draw(static_cast(m_drawingArea)); +#endif + + // std::cout << "SetChns " << display->m_FirstChannelToDisplay << " to " << display->m_LastChannelToDisplay << "\n"; + // std::cout << "SetLim " << display->m_StartY << " to " << display->m_StopY << "\n"; +} + +// +//CALLBACKS +// + +// DrawingArea visible region may have changed, estimate the limits again +gboolean VisibleRegionChangedCB(GtkWidget* /*pWidget*/, gpointer data) +{ + auto* display = reinterpret_cast(data); + display->updateLimits(); + return false; // propagate +} + + +gboolean DrawingAreaConfigureCB(GtkWidget* /*pWidget*/, GdkEventExpose* /*pEvent*/, gpointer data) +{ + auto* display = reinterpret_cast(data); + display->updateLimits(); + return false; // propagate +} + +gboolean DrawingAreaExposeEventCB(GtkWidget* /*widget*/, GdkEventExpose* event, gpointer data) +{ + // std::cout << "EE for " << pEvent->area.x << " " << pEvent->area.y << " " << pEvent->area.width << " " << pEvent->area.height << "\n"; + + auto* display = reinterpret_cast(data); + +#if SUPPORT_REDRAW + //check if a full redrawn was asked for + if(pEvent->area.width == (gint)display->m_Width && pEvent->area.height == (gint)display->m_Height) + { +#ifdef DEBUG + std::cout << "Requesting full redraw, G (full window exposed)\n"; +#endif + display->redrawAllAtNextRefresh(true); + } +#endif + + //redraw signals + display->draw(event->area); + + //don't propagate this signal to the children if any + return TRUE; +} + +gboolean DrawingAreaResizeEventCB(GtkWidget* /*widget*/, GtkAllocation* allocation, gpointer data) +{ + auto* display = reinterpret_cast(data); + display->onResizeEventCB(allocation->width, allocation->height); + display->updateLimits(); + return FALSE; +} + +void DrawingAreaClickedEventCB(GtkWidget* /*widget*/, GdkEventButton* event, gpointer data) +{ + if (event->type != GDK_BUTTON_PRESS) { return; } + + auto* display = reinterpret_cast(data); + bool zoomChanged = false; + display->m_CurrentSignalMode = GlobalBestFit; + + if (event->button == 1) + { + display->m_CurrentSignalMode = ZoomIn; + display->computeZoom(true, event->x, event->y); + zoomChanged = true; + } + else if (event->button == 3) + { + if (display->m_ZoomScaleY != 1.0) + { + display->m_CurrentSignalMode = ZoomOut; + display->computeZoom(false, event->x, event->y); + zoomChanged = true; + + if (display->m_ZoomScaleY == 1.0) + { + display->m_CurrentSignalMode = GlobalBestFit; + display->updateDisplayParameters(); + } + else { display->m_CurrentSignalMode = ZoomOut; } + } + } + + //if the zoom level has changed, redraw the signal and left ruler + if (zoomChanged) + { + display->redrawAllAtNextRefresh(true); + if (GTK_WIDGET(display->m_DrawingArea)->window) { gdk_window_invalidate_rect(GTK_WIDGET(display->m_DrawingArea)->window, nullptr, true); } + + for (auto it = display->m_LeftRuler.begin(); it != display->m_LeftRuler.end(); ++it) + { + if (GTK_WIDGET(it->second->getWidget())->window) { gdk_window_invalidate_rect(GTK_WIDGET(it->second->getWidget())->window, nullptr, true); } + } + } +} + +void DrawingAreaEnterEventCB(GtkWidget* widget, GdkEventCrossing* /*event*/, gpointer data) +{ + auto* display = reinterpret_cast(data); + + //change the cursor to the zooming one + gdk_window_set_cursor(widget->window, display->m_ParentDisplayView->m_Cursor[1]); +} + +void DrawingAreaLeaveEventCB(GtkWidget* widget, GdkEventCrossing* /*event*/, gpointer data) +{ + auto* display = reinterpret_cast(data); + + //change the cursor back to the normal one + gdk_window_set_cursor(widget->window, display->m_ParentDisplayView->m_Cursor[0]); +} +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalChannelDisplay.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalChannelDisplay.h new file mode 100644 index 0000000..8ac7d7c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalChannelDisplay.h @@ -0,0 +1,267 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCSignalDisplayLeftRuler.h" + +#include +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +class CSignalDisplayView; +class CBufferDatabase; + +class CSignalChannelDisplay +{ +public: + /** + * \brief Constructor + * \param displayView Parent view + * \param channelDisplayW Width to be requested by widget + * \param channelDisplayH Height to be requested by widget + * \param leftRulerW Width to be requested by left ruler + * \param leftRulerH Height to be requested by left ruler + */ + CSignalChannelDisplay(CSignalDisplayView* displayView, int channelDisplayW, int channelDisplayH, int leftRulerW, int leftRulerH); + + /** + * \brief Destructor + */ + ~CSignalChannelDisplay(); + + /** + * \brief Get ruler widget + * \return Pointer to ruler widget + */ + GtkWidget* getRulerWidget(size_t index) const; + + /** + * \brief Get signal display widget + * \return Pointer to signal display widget + */ + GtkWidget* getSignalDisplayWidget() const { return m_DrawingArea; } + + /** + * \brief Callback notified upon resize events + * \param width New window width + * \param height New window height + */ + void onResizeEventCB(gint width, gint height); + + /** + * \brief Updates scale following a resize event or a time scale change + */ + void updateScale(); + + // Updates some drawing limits, i.e. to limit drawing to [chn_i,...,chn_j] + void updateLimits(); + + /** + * \brief Reset list of channels displayed by this object + */ + void resetChannelList(); + + /** + * \brief Add a channel to the list of channels to be displayed + * \param channel Index of channel to be displayed + */ + void addChannel(size_t channel); + + void addChannelList(size_t channel); + + /** + * \brief Get rectangle to clear and redraw based on latest signal data received + * \param[out] rect Rectangle holding part of drawing area to clear and update + */ + void getUpdateRectangle(GdkRectangle& rect) const; + + /** + * \brief Flag widget so that its whole window is redrawn at next refresh + */ + void redrawAllAtNextRefresh(bool redraw); + + /** + * \brief Check whether the whole window must be redrawn + * \return True if the whole window must be redrawn, false otherwise + */ + bool mustRedrawAll() const { return m_RedrawAll; } + + /** + * \brief Draws the signal on the signal's drawing area. + * \param area Exposed area that needs to be redrawn + */ + void draw(const GdkRectangle& area); + + /** + * \brief Clip signals to drawing area + * Computes the list of points used to draw the lines (m_ParentDisplayView->m_Points) using the raw points list + * (m_ParentDisplayView->m_RawPoints) and by cropping the lines when they go out of the window. + * \param pointCount Number of points to clip + * \return The number of points to display. + */ + uint64_t cropCurve(uint64_t pointCount) const; + + /** + * \brief Computes the parameters necessary for the signal to be zoomed at the selected coordinates. + * \param zoomIn If true, the operation is a zoom In, if false it's a zoom Out. + * \param x The X-coordinate of the center of the area we want to zoom in. + * \param y The Y-coordinate of the center of the area we want to zoom in. + */ + void computeZoom(bool zoomIn, double x, double y); + + /** + * \brief Returns empiric y min and maxes of the currently shown signal chunks for all subchannels. + * Note that the actually used display limits may be different. This function can be used + * to get the data extremal values and then use these to configure the display appropriately. + */ + void getDisplayedValueRange(std::vector& min, std::vector& max) const; + + /* + * \brief Sets scale for all subchannels. + */ + void setGlobalScaleParameters(double min, double max, double margin); + + /* + * \brief Sets scale for a single subchannel. + */ + void setLocalScaleParameters(size_t subChannelIdx, double min, double max, double margin); + + /** + * \brief Updates signal scale and translation based on latest global range and margin + */ + void updateDisplayParameters(); + +private: + /** + * \brief Get first buffer to display index and position and first sample to display index + * \param[out] bufferIdx Index of first buffer to display + * \param[out] sampleIdx Index of first sample to display + * \param[out] bufferPos Position of first buffer to display (0-based, from left edge) + */ + void getFirstBufferToDisplayInformation(size_t& bufferIdx, size_t& sampleIdx, size_t& bufferPos) const; + + /** + * \brief Get start X coord of a buffer + * \param pos Position of buffer on screen (0-based, from left edge) + * \return Floored X coordinate of buffer + */ + int getBufferStartX(size_t pos) const; + + /** + * \brief Get X coordinate of a sample + * \param bufferPos Position of buffer on screen (0-based, from left edge) + * \param sampleIdx Index of sample in buffer + * \param offset X offset from which to start drawing. Used in scroll mode only. + * \return X coordinate of sample + */ + double getSampleXCoordinate(size_t bufferPos, size_t sampleIdx, double offset) const; + + /** + * \brief Get Y coordinate of a sample + * \param value Sample value and index of channel + * \param channelIdx Index of channel + * \return Y coordinate of sample + */ + double getSampleYCoordinate(double value, size_t channelIdx); + + /** + * \brief Get Y coordinate of a sample in Multiview mode + * \param value Sample value and index of channel + * \return Y coordinate of sample + */ + double getSampleYMultiViewCoordinate(double value); + + /** + * \brief Draw signals (and stimulations, if any) displayed by this channel + * \param firstBuffer Index of first buffer to display + * \param lastBuffer Index of last buffer to display + * \param firstSample Index of first sample to display in first buffer (subsequent buffers will start at sample 0) + * \param startX Start X Coordinate + * \param firstChannel Index of first channel to display + * \param lastChannel Index of last channel to display + * \return True if all went ok, false otherwise + */ + bool drawSignals(size_t firstBuffer, size_t lastBuffer, size_t firstSample, double startX, size_t firstChannel, size_t lastChannel); + + /** + * \brief Draw vertical line highlighting where data was last drawn + */ + void drawProgressLine(size_t firstBufferIdx, size_t firstBufferPos) const; + + /** + * \brief Draw Y=0 line + */ + void drawZeroLine(); + +public: + //! Vector of Left rulers displaying signal scale. Indexed by channel id. @note This is a map as the active number of channels + // may change by the toolbar whereas this total set of rulers doesn't... + std::map m_LeftRuler; + //! The drawing area where the signal is to be drawn + GtkWidget* m_DrawingArea = nullptr; + //! Drawing area dimensions, in pixels + size_t m_Width = 0, m_Height = 0; + //! Available width per buffer, in pixels + double m_WidthPerBuffer = 0; + //! Available width per sample point, in pixels + double m_PointStep = 0; + //! The index list of the channels to display + std::vector m_ChannelList; + //! The "parent" view (which uses this widget) + CSignalDisplayView* m_ParentDisplayView = nullptr; + //! The database from which the information are to be read + CBufferDatabase* m_Database = nullptr; + + /** \ name Extrema of displayed values for all channel in this display */ + //@{ + std::vector m_LocalMaximum, m_LocalMinimum; + //@} + + /** \name Auto scaling parameters */ + //@{ + // double m_ScaleX, m_TranslateX; + + std::vector m_ScaleY, m_TranslateY; + //@} + + /** \name Zooming parameters (user controlled) */ + //@{ + double m_ZoomTranslateX = 0, m_ZoomTranslateY = 0, m_ZoomScaleX = 1, m_ZoomScaleY = 1; + //! The zoom factor step + const double m_ZoomFactor = 1.5; + //@} + + /** \name Scale margin parameters */ + //@{ + std::vector m_OuterTopMargin, m_InnerTopMargin, m_InnerBottomMargin, m_OuterBottomMargin; + //@} + + size_t m_LeftRulerW = 0, m_LeftRulerH = 0; + + //! Current signal display mode + EDisplayMode m_CurrentSignalMode = GlobalBestFit; + //! Time of latest displayed data + uint64_t m_LatestDisplayedTime = 0; + + //! Should the whole window be redrawn at next redraw? + bool m_RedrawAll = false; + + //! Is it a multiview display ? + bool m_MultiView = false; + + // These parameters control that we don't unnecessarily draw parts of the signal which are not in view + + // Currently visible y segment in the drawing area + size_t m_StartY = 0, m_StopY = 0; + + // First and last channel to draw + size_t m_FirstChannelToDisplay = 0, m_LastChannelToDisplay = 0; +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalDisplayLeftRuler.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalDisplayLeftRuler.cpp new file mode 100644 index 0000000..161c700 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalDisplayLeftRuler.cpp @@ -0,0 +1,137 @@ +#include "ovpCSignalDisplayLeftRuler.h" + +#include +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + + +#define CONVERT_TIME(i) (double((i)>>32) + double(double((i)&0xFFFFFFFF) / double((uint64_t)1<<32))) + +//! Callback to redraw the bottom ruler +static gboolean LeftRulerExposeEventCallback(GtkWidget* /*widget*/, GdkEventExpose* /*event*/, gpointer data) +{ + //redraw the ruler + auto* leftRuler = reinterpret_cast(data); + leftRuler->draw(); + //don't propagate this signal to the children if any + return TRUE; +} + + +CSignalDisplayLeftRuler::CSignalDisplayLeftRuler(const int width, const int height) : m_Width(width) +{ + //creates the main drawing area + m_Ruler = gtk_drawing_area_new(); + + gtk_widget_set_size_request(m_Ruler, width, height); + + g_signal_connect_after(G_OBJECT(m_Ruler), "expose_event", G_CALLBACK(LeftRulerExposeEventCallback), this); + + //get left ruler widget's font description + PangoContext* ctx = gtk_widget_get_pango_context(m_Ruler); + PangoFontDescription* desc = pango_context_get_font_description(ctx); + + //adapt the allocated height per label to the font's height (plus 4 pixel to add some spacing) + if (pango_font_description_get_size_is_absolute(desc)) { m_PixelsPerLabel = pango_font_description_get_size(desc) + 4; } + else { m_PixelsPerLabel = pango_font_description_get_size(desc) / PANGO_SCALE + 4; } +} + +void CSignalDisplayLeftRuler::update(const double min, const double max) +{ + m_MaxDisplayedValue = max; + m_MinDisplayedValue = min; + + //redraw the ruler + if (m_Ruler->window) { gdk_window_invalidate_rect(m_Ruler->window, nullptr, true); } +} + + +void CSignalDisplayLeftRuler::draw() const +{ + if (!GTK_WIDGET_VISIBLE(m_Ruler)) { return; } + + gint width, height; + gdk_drawable_get_size(m_Ruler->window, &width, &height); + + //draw ruler base (vertical line) + gdk_draw_line(m_Ruler->window, m_Ruler->style->fg_gc[GTK_WIDGET_STATE(m_Ruler)], width - 1, 0, width - 1, height); + + //computes the step in values for the ruler + const double intervalWidth = m_MaxDisplayedValue - m_MinDisplayedValue; + double valueStep = 0; + double baseValue = 0; + + //if the signal is not constant + if (intervalWidth > 0) + { + //computes the step + const auto nearestSmallerPowerOf10 = double(pow(10, floor(log10(intervalWidth)))); + + //get max number of labels that fit in widget + const size_t maxNLabels = size_t(height / m_PixelsPerLabel); + + //ensure there is room for at least one label + if (maxNLabels > 0) + { + //get the current number of labels to display based on the nearest inferior power of ten value + const size_t tempNLabels = size_t(floor(intervalWidth / nearestSmallerPowerOf10)); + + if (tempNLabels > 2 * maxNLabels) { valueStep = 4 * nearestSmallerPowerOf10; } + else if (tempNLabels > maxNLabels) { valueStep = 2 * nearestSmallerPowerOf10; } + else if (tempNLabels < (maxNLabels / 4)) { valueStep = nearestSmallerPowerOf10 / 4; } + else if (tempNLabels < (maxNLabels / 2)) { valueStep = nearestSmallerPowerOf10 / 2; } + else { valueStep = nearestSmallerPowerOf10; } + + //recompute base value of the step + baseValue = valueStep * floor(m_MinDisplayedValue / valueStep); + } + } + else + { + valueStep = 1; + baseValue = floor(m_MinDisplayedValue - 0.5); + } + + int textW; + int textH; + + //if the step is too small, it causes problems, so don't display anything and return + if (valueStep < 0.5e-5) { return; } + double i = baseValue; + while (i < double(0.5 + m_MaxDisplayedValue)) + { + //computes the coordinate of the current label + const gint textY = gint((m_MaxDisplayedValue - i) * (height / intervalWidth)); + + if (textY >= 0 && textY <= height) + { + gchar value[40]; + //if the current value is (almost) 0, displays 0 + abs(i) < 0.5e-10 ? g_sprintf(value, "0") : g_sprintf(value, "%g", i); + + PangoLayout* text = gtk_widget_create_pango_layout(m_Ruler, value); + pango_layout_set_width(text, 28); + pango_layout_set_justify(text, PANGO_ALIGN_RIGHT); + + pango_layout_get_pixel_size(text, &textW, &textH); + + gdk_draw_layout(m_Ruler->window, m_Ruler->style->fg_gc[GTK_WIDGET_STATE(m_Ruler)], 0, textY - (textH / 2), text); + + if (i < 0.5e-10 && i > -0.5e-10) + { + gdk_draw_line(m_Ruler->window, m_Ruler->style->fg_gc[GTK_WIDGET_STATE(m_Ruler)], width - 6, textY, width, textY); + } + else { gdk_draw_line(m_Ruler->window, m_Ruler->style->fg_gc[GTK_WIDGET_STATE(m_Ruler)], width - 4, textY, width, textY); } + } + i += valueStep; + } +} +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalDisplayLeftRuler.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalDisplayLeftRuler.h new file mode 100644 index 0000000..1f756a9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalDisplayLeftRuler.h @@ -0,0 +1,52 @@ +#pragma once + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +/** + * Used to display a vertical "amplitude" ruler. + * */ +class CSignalDisplayLeftRuler +{ +public: + /** + * \brief Constructor + * \param width Width to be requested by widget + * \param height Height to be requested by widget + */ + CSignalDisplayLeftRuler(int width, int height); + // CSignalChannelDisplay* pParentChannelDisplay); + + /** + * \brief Destructor + */ + ~CSignalDisplayLeftRuler() = default; + + /* + * \brief Update ruler with latest min/max values and request a redraw + * \param min Minimum value to be displayed + * \param max Maximum value to be displayed + */ + void update(double min, double max); + + //! returns the widget, so it can be added to the main interface + GtkWidget* getWidget() const { return m_Ruler; } + + /** + * \brief Draws the ruler by using the information from the database. + */ + void draw() const; + + GtkWidget* m_Ruler = nullptr; + int m_Width = 0; + double m_MaxDisplayedValue = -DBL_MAX; + double m_MinDisplayedValue = DBL_MAX; + uint64_t m_PixelsPerLabel = 10; + // CSignalChannelDisplay* m_pParentChannelDisplay = nullptr; +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalDisplayView.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalDisplayView.cpp new file mode 100644 index 0000000..8ada300 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalDisplayView.cpp @@ -0,0 +1,1362 @@ +#include "ovpCSignalDisplayView.h" +#include +#include +#include +#include "../../utils.h" + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + + +// #define DEBUG 1 + +static void ScrollModeButtonCB(GtkWidget* widget, gpointer data); +static void UnitsButtonCB(GtkWidget* widget, gpointer data); +static void ScalingModeButtonCB(GtkWidget* widget, gpointer data); +static void ToggleLeftRulerButtonCB(GtkWidget* widget, gpointer data); +static void ToggleBottomRulerButtonCB(GtkWidget* widget, gpointer data); +static void CustomVerticalScaleChangedCB(GtkSpinButton* button, gpointer data); +static void CustomVerticalOffsetChangedCB(GtkSpinButton* button, gpointer data); +static gboolean SpinButtonValueChangedCB(GtkSpinButton* widget, gpointer data); // time scale +static void ChannelSelectButtonCB(GtkButton* button, gpointer data); +static void ChannelSelectDialogApplyButtonCB(GtkButton* button, gpointer data); +static void StimulationColorsButtonCB(GtkButton* button, gpointer data); +static gint CloseStimulationColorsWindow(GtkWidget* widget, GdkEvent* event, gpointer data); +static void InformationButtonCB(GtkButton* button, gpointer data); +static void MultiViewButtonCB(GtkButton* button, gpointer data); +static void MultiViewDialogApplyButtonCB(GtkButton* button, gpointer data); + +//const char* CSignalDisplayView::m_ScalingModes[] = { "Per channel", "Global", "None" }; +const std::vector CSignalDisplayView::SCALING_MODES = { "Per channel", "Global", "None" }; + +CSignalDisplayView::CSignalDisplayView(CBufferDatabase& buffer, const CIdentifier& displayMode, const CIdentifier& scalingMode, const double verticalScale, + const double verticalOffset, const double timeScale, const bool horizontalRuler, const bool verticalRuler, + const bool multiview) + : m_ShowLeftRulers(verticalRuler), m_ShowBottomRuler(horizontalRuler), m_CustomVerticalScaleValue(verticalScale), m_CustomVerticalOffset(verticalOffset), + m_Buffer(&buffer), m_MultiViewEnabled(multiview), m_ScalingMode(scalingMode) +{ + m_VerticalScaleForceUpdate = true; + m_NSelectedChannel = 0; + + m_SelectedChannels.clear(); + m_ChannelUnits.clear(); + m_ErrorState.clear(); + + construct(buffer, timeScale, displayMode); +} + +void CSignalDisplayView::construct(CBufferDatabase& /*oBufferDatabase*/, const double timeScale, const CIdentifier& displayMode) +{ + //load the gtk builder interface + m_Builder = + gtk_builder_new(); // glade_xml_new(Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-SignalDisplay.ui", nullptr, nullptr); + gtk_builder_add_from_file(m_Builder, Directories::getDataDir() + "/plugins/simple-visualization/openvibe-simple-visualization-SignalDisplay.ui", + nullptr); + + if (!m_Builder) + { + g_warning("Couldn't load the interface!"); + return; + } + + gtk_builder_connect_signals(m_Builder, nullptr); + + //initialize display mode + m_Buffer->setDisplayMode(displayMode); + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "SignalDisplayScrollModeButton")), displayMode == Scroll); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayScrollModeButton")), true); + + //connect display mode callbacks + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayScrollModeButton")), "toggled", G_CALLBACK(ScrollModeButtonCB), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayToggleUnitsButton")), "toggled", G_CALLBACK(UnitsButtonCB), this); + + //creates the cursors + m_Cursor[0] = gdk_cursor_new(GDK_LEFT_PTR); + m_Cursor[1] = gdk_cursor_new(GDK_SIZING); + + //button callbacks + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayChannelSelectButton")), "clicked", G_CALLBACK(ChannelSelectButtonCB), + this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayStimulationColorsButton")), "clicked", + G_CALLBACK(StimulationColorsButtonCB), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayMultiViewButton")), "clicked", G_CALLBACK(MultiViewButtonCB), this); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayInformationButton")), "clicked", G_CALLBACK(InformationButtonCB), + this); + + //initialize vertical scale + // ::gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_BuilderInterface, "SignalDisplayVerticalScaleToggleButton")), m_autoVerticalScale); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_builder_get_object(m_Builder, "SignalDisplayCustomVerticalScaleSpinButton")), m_CustomVerticalScaleValue); + // ::gtk_spin_button_set_increments(GTK_SPIN_BUTTON(gtk_builder_get_object(m_BuilderInterface, "SignalDisplayCustomVerticalScaleSpinButton")),0.001,1.0); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayCustomVerticalScaleSpinButton")), m_ScalingMode == None); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayDC")), m_ScalingMode == None); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_builder_get_object(m_Builder, "SignalDisplayDC")), m_CustomVerticalOffset); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayDC")), "value-changed", G_CALLBACK(CustomVerticalOffsetChangedCB), this); + + // ::gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_BuilderInterface, "SignalDisplayToggleUnitsButton")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayToggleUnitsButton")), false); + + //connect vertical scale callbacks + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayCustomVerticalScaleSpinButton")), "value-changed", + G_CALLBACK(CustomVerticalScaleChangedCB), this); + + //time scale + //---------- + GtkSpinButton* spinButton = GTK_SPIN_BUTTON(gtk_builder_get_object(m_Builder, "SignalDisplayTimeScale")); + gtk_spin_button_set_value(spinButton, timeScale); + g_signal_connect(G_OBJECT(spinButton), "value-changed", G_CALLBACK(SpinButtonValueChangedCB), this); + //notify database of current time scale + m_Buffer->adjustNumberOfDisplayedBuffers(gtk_spin_button_get_value(spinButton)); + + //channel select dialog's signals + //------------------------------- + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayChannelSelectApplyButton")), "clicked", + G_CALLBACK(ChannelSelectDialogApplyButtonCB), this); + + //connect the cancel button to the dialog's hide command + g_signal_connect_swapped(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayChannelSelectCancelButton")), "clicked", + G_CALLBACK(gtk_widget_hide), + G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayChannelSelectDialog"))); + + //hides the dialog if the user tries to close it + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayChannelSelectDialog")), "delete_event", G_CALLBACK(gtk_widget_hide), nullptr); + + //stimulation colors dialog's signals + //----------------------------------- + //connect the close button to the dialog's hide command + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayStimulationColorsCloseButton")), "clicked", + G_CALLBACK(StimulationColorsButtonCB), this); + + //hides the dialog if the user tries to close it + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayStimulationColorsDialog")), "delete_event", + G_CALLBACK(CloseStimulationColorsWindow), this); + + //multiview signals + //----------------- + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayMultiViewApplyButton")), "clicked", + G_CALLBACK(MultiViewDialogApplyButtonCB), this); + + //connect the cancel button to the dialog's hide command + g_signal_connect_swapped(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayMultiViewCancelButton")), "clicked", + G_CALLBACK(gtk_widget_hide), G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayMultiViewDialog"))); + + //hides the dialog if the user tries to close it + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayMultiViewDialog")), "delete_event", G_CALLBACK(gtk_widget_hide), + nullptr); + + //bottom box + //---------- + m_BottomBox = GTK_BOX(gtk_builder_get_object(m_Builder, "SignalDisplayBottomBox")); + + // ::gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_BuilderInterface, "SignalDisplayBestFitButton")), false); + // ::gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_BuilderInterface, "SignalDisplayGlobalBestFitButton")), false); + + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_Builder, "ScalingMode")); + + for (const auto& scalingMode : SCALING_MODES) { gtk_combo_box_append_text(comboBox, scalingMode.c_str()); } + + g_signal_connect(G_OBJECT(comboBox), "changed", G_CALLBACK(ScalingModeButtonCB), this); + gtk_combo_box_set_active(comboBox, gint(m_ScalingMode.id())); + + gtk_widget_set_sensitive(GTK_WIDGET(comboBox), true); + + // GtkWidget* mainWindow = GTK_WIDGET(gtk_builder_get_object(m_BuilderInterface, "SignalDisplayMainWindow")); + // ::gtk_window_set_default_size(GTK_WINDOW(mainWindow), 640, 200); +} + +CSignalDisplayView::~CSignalDisplayView() +{ + // @fixme who destroys this beast? It seems to be accessed by visualizationtree later?! pointer ownership unclear. + gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(m_Builder, "Toolbar"))); + + gtk_widget_destroy(GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayInformationDialog"))); + gtk_widget_destroy(GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayChannelSelectDialog"))); + gtk_widget_destroy(GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayMultiViewDialog"))); + gtk_widget_destroy(GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayStimulationColorsDialog"))); + + //destroy the window and its children + gtk_widget_destroy(GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayMainWindow"))); + + //destroy the rest + for (auto& cursor : m_Cursor) { gdk_cursor_unref(cursor); } + + //unref the xml file as it's not needed anymore + g_object_unref(G_OBJECT(m_Builder)); + m_Builder = nullptr; + + for (auto& channel : m_ChannelDisplay) { delete channel; } + + delete m_BottomRuler; + m_BottomRuler = nullptr; +} + +void CSignalDisplayView::getWidgets(GtkWidget*& widget, GtkWidget*& toolbar) const +{ + widget = GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayScrolledWindow")); + toolbar = GTK_WIDGET(gtk_builder_get_object(m_Builder, "Toolbar")); +} + +void CSignalDisplayView::changeMultiView() +{ + CSignalChannelDisplay* multiViewDisplay = m_ChannelDisplay[m_ChannelDisplay.size() - 1]; + + //check if there are channels to display in multiview + m_MultiViewEnabled = false; + bool noneSelected = false; + for (size_t i = 0; i < m_ChannelLabel.size(); ++i) + { + //Check if None is selected + if (i == m_ChannelLabel.size() - 1) { noneSelected = m_MultiViewSelectedChannels[i]; } + + //Enable Multiview only if None item isn't selected and at list one channel is selected + if (!noneSelected) { m_MultiViewEnabled |= m_MultiViewSelectedChannels[i]; } + else { m_MultiViewEnabled = false; } + } + + //if there are no channels to display in the multiview (None selected only) + if (!m_MultiViewEnabled) + { + //hides the multiview display (last one in the list) + multiViewDisplay->resetChannelList(); + toggleChannelMultiView(false); + } + //there are channels to display in the multiview + else + { + if (!GTK_WIDGET_VISIBLE(GTK_WIDGET(m_SignalDisplayTable))) + { + //if there were no selected channels before, but now there are, show the table again + gtk_widget_show(GTK_WIDGET(m_SignalDisplayTable)); + } + + if (!isChannelDisplayVisible(m_ChannelDisplay.size() - 1)) { toggleChannelMultiView(true); } + + //updates channels to display list + multiViewDisplay->resetChannelList(); + + for (size_t i = 0; i < m_MultiViewSelectedChannels.size(); ++i) { if (m_MultiViewSelectedChannels[i]) { multiViewDisplay->addChannelList(i); } } + + multiViewDisplay->updateLimits(); + + if (m_ShowLeftRulers) { gtk_widget_show(GTK_WIDGET(m_LeftRulers[m_ChannelDisplay.size() - 1])); } + + multiViewDisplay->m_MultiView = true; + + m_VerticalScaleForceUpdate = true; // need to pass the scale params to multiview, use this to make them refresh... + m_VerticalScaleRefresh = true; + + + //request a redraw + /* + if(display->getSignalDisplayWidget()->window) + { + gdk_window_invalidate_rect(display->getSignalDisplayWidget()->window, nullptr, false); + } + */ + } +} + +void CSignalDisplayView::init() +{ + //retrieve channel count + const size_t nChannel = m_Buffer->getChannelCount(); + const size_t tableSize = 2; + + //allocate channel labels and channel displays arrays accordingly + m_ChannelDisplay.resize(tableSize); + m_ChannelLabel.resize(nChannel + 1); + m_ChannelName.resize(nChannel + 1); + + GtkWidget* scrolledWindow = GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayScrolledWindow")); + gtk_widget_set_size_request(scrolledWindow, 400, 200); + + //retrieve and allocate main table accordingly + m_SignalDisplayTable = GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayMainTable")); + //rows : for each channel, [0] channel data, [1] horizontal separator + //columns : [0] label, [1] vertical separator, [2] left ruler, [3] signal display + gtk_table_resize(GTK_TABLE(m_SignalDisplayTable), nChannel + 1, 4); + + const int leftRulerW = 50; + const int channelDisplayW = 20; + const int bottomRulerW = 0; + const int leftRulerH = 20; + const int channelDisplayH = 20; + const int bottomRulerH = 20; + + m_NSelectedChannel = nChannel; // All channels selected by default + + updateDisplayTableSize(); + + //add a vertical separator + m_Separator = gtk_vseparator_new(); + gtk_table_attach(GTK_TABLE(m_SignalDisplayTable), m_Separator, 1, 2, 0, nChannel + 1, //second column run over the whole table height + GTK_SHRINK, GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0); + gtk_widget_show(m_Separator); + + //create a size group for channel labels and the empty bottom left widget + //(useful to position the bottom ruler correctly) + //::GtkSizeGroup* sizeGroup = ::gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + + //channels selection widget + GtkWidget* channelSelectList = GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayChannelSelectList")); + + //multiple channels selection widget + GtkWidget* multiViewSelectList = GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayMultiViewSelectList")); + + //vector of channel names + std::vector& channelName = m_Buffer->m_DimLabels[0]; + + std::stringstream labelString; + + GtkListStore* channelListStore = gtk_list_store_new(1, G_TYPE_STRING); + GtkTreeIter channelIter; + + GtkListStore* multiViewChannelListStore = gtk_list_store_new(1, G_TYPE_STRING); + GtkTreeIter multiViewChannelIter; + + //create channel widgets and add them to display table + for (size_t i = 0; i < nChannel; ++i) + { + //add channel label + //----------------- + // Convention: Channels are numbered as 1,2,... when shown to user + if (channelName[i].empty()) { labelString << "Channel " << (i + 1); } // if no name has been set, use channel index + else { labelString << (i + 1) << " : " << channelName[i]; } // prepend name with channel index + + // In either mode (eeg or non-eeg) create and attach label widget for each channel + GtkWidget* label = gtk_label_new(labelString.str().c_str()); + m_ChannelName[i] = labelString.str().c_str(); + m_ChannelLabel[i] = label; + gtk_table_attach(GTK_TABLE(m_SignalDisplayTable), label, 0, 1, //first column + i, i + 1, GTK_FILL, GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0); + gtk_widget_show(label); + + // Using the labels in a size group causes it to freeze after changing the labels in a callback. Disabled for now. + // ::gtk_size_group_add_widget(sizeGroup, label); + if (m_ChannelUnits.size() <= i) { m_ChannelUnits[i] = std::pair(CString("Unknown"), CString("Unspecified")); } + + //create channel display widget + //----------------------------- + + //add checkbox in channel select window + //------------------------------------- + gtk_list_store_append(channelListStore, &channelIter); + gtk_list_store_set(channelListStore, &channelIter, 0, channelName[i].c_str(), -1); + + gtk_list_store_append(multiViewChannelListStore, &multiViewChannelIter); + gtk_list_store_set(multiViewChannelListStore, &multiViewChannelIter, 0, channelName[i].c_str(), -1); + + labelString.str(""); + + //a channel is selected by default + m_SelectedChannels[i] = true; + if (m_MultiViewEnabled) { m_MultiViewSelectedChannels[i] = true; } + else { m_MultiViewSelectedChannels[i] = false; } + + //clear label + labelString.str(""); + } + + // create one display for all channels + + //create and attach display widget + auto* channelDisplay = new CSignalChannelDisplay(this, channelDisplayW, channelDisplayH, leftRulerW, leftRulerH); + m_ChannelDisplay[0] = channelDisplay; + for (size_t i = 0; i < nChannel; ++i) + { + channelDisplay->addChannel(i); + + // Still attach left rulers + gtk_table_attach(GTK_TABLE(m_SignalDisplayTable), channelDisplay->getRulerWidget(i), 2, 3, //third column + i, i + 1, GTK_FILL, GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0); + gtk_widget_show(channelDisplay->getRulerWidget(i)); + } + channelDisplay->updateLimits(); + + // attach display + gtk_table_attach(GTK_TABLE(m_SignalDisplayTable), channelDisplay->getSignalDisplayWidget(), 3, 4, 0, + nChannel, // fourth column run over the whole table (last row for multiview) + GtkAttachOptions(GTK_EXPAND | GTK_FILL), GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0); + gtk_widget_show(m_ChannelDisplay[0]->getSignalDisplayWidget()); + + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(channelSelectList)), GTK_SELECTION_MULTIPLE); + gtk_tree_view_append_column( + GTK_TREE_VIEW(channelSelectList), gtk_tree_view_column_new_with_attributes("Channel", gtk_cell_renderer_text_new(), "text", 0, nullptr)); + gtk_tree_view_set_model(GTK_TREE_VIEW(channelSelectList), GTK_TREE_MODEL(channelListStore)); + + gtk_list_store_append(multiViewChannelListStore, &multiViewChannelIter); + gtk_list_store_set(multiViewChannelListStore, &multiViewChannelIter, 0, "None", -1); + + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(multiViewSelectList)), GTK_SELECTION_MULTIPLE); + gtk_tree_view_append_column( + GTK_TREE_VIEW(multiViewSelectList), gtk_tree_view_column_new_with_attributes("Channel", gtk_cell_renderer_text_new(), "text", 0, nullptr)); + gtk_tree_view_set_model(GTK_TREE_VIEW(multiViewSelectList), GTK_TREE_MODEL(multiViewChannelListStore)); + + //multiview channel + //----------------- + //create and attach label + GtkWidget* label = gtk_label_new("Multi-View"); + m_ChannelLabel[nChannel] = label; + gtk_table_attach(GTK_TABLE(m_SignalDisplayTable), label, 0, 1, nChannel, (nChannel) + 1, GTK_FILL, GTK_SHRINK, 0, 0); + //create and attach display widget + auto* multiViewDisplay = new CSignalChannelDisplay(this, channelDisplayW, channelDisplayH, leftRulerW, leftRulerH); + m_ChannelDisplay[tableSize - 1] = multiViewDisplay; + multiViewDisplay->addChannel(0); + gtk_table_attach(GTK_TABLE(m_SignalDisplayTable), multiViewDisplay->getRulerWidget(0), 2, 3, //third column + (nChannel), (nChannel) + 1, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(m_SignalDisplayTable), multiViewDisplay->getSignalDisplayWidget(), 3, 4, //fourth column + (nChannel), (nChannel) + 1, GtkAttachOptions(GTK_EXPAND | GTK_FILL), GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0); + //create bottom ruler + //------------------- + m_BottomRuler = new CBottomTimeRuler(*m_Buffer, bottomRulerW, bottomRulerH); + //::gtk_size_group_add_widget(sizeGroup, GTK_WIDGET(gtk_builder_get_object(m_BuilderInterface, "SignalDisplayEmptyLabel1"))); + gtk_box_pack_start(m_BottomBox, m_BottomRuler->getWidget(), false, false, 0); + // tell ruler has to resize when channel displays are resized + if (!m_ChannelDisplay.empty()) { m_BottomRuler->linkWidthToWidget(m_ChannelDisplay[0]->getSignalDisplayWidget()); } + gtk_widget_show_all(m_BottomRuler->getWidget()); + + //allocate memory to store sample points + //-------------------------------------- + //reserve the maximum space needed for computing the points to display + //(when cropping the lines, there can be up to two times the number of original points) + m_Points.reserve(size_t(m_Buffer->m_DimSizes[1] * m_Buffer->m_NBufferToDisplay * 2)); + //resize the vector of raw points + m_RawPoints.resize(size_t(m_Buffer->m_DimSizes[1] * m_Buffer->m_NBufferToDisplay)); + + for (auto& channel : m_ChannelDisplay) + { + for (size_t i = 0; i < channel->m_LeftRuler.size(); ++i) + { + GtkWidget* leftRuler = channel->getRulerWidget(i); + m_LeftRulers.push_back(leftRuler); + } + } + + toggleLeftRulers(m_ShowLeftRulers); + gtk_toggle_tool_button_set_active( + GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "SignalDisplayToggleLeftRulerButton")), m_ShowLeftRulers); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayToggleLeftRulerButton")), "toggled", + G_CALLBACK(ToggleLeftRulerButtonCB), this); + + toggleBottomRuler(m_ShowBottomRuler); + gtk_toggle_tool_button_set_active( + GTK_TOGGLE_TOOL_BUTTON(gtk_builder_get_object(m_Builder, "SignalDisplayToggleBottomRulerButton")), m_ShowBottomRuler); + g_signal_connect(G_OBJECT(gtk_builder_get_object(m_Builder, "SignalDisplayToggleBottomRulerButton")), "toggled", + G_CALLBACK(ToggleBottomRulerButtonCB), this); + + if (m_MultiViewEnabled) { changeMultiView(); } + + activateToolbarButtons(true); +} + +void CSignalDisplayView::redraw() +{ + //nothing to redraw if the table isn't visible or no data was received + if (m_SignalDisplayTable == nullptr || !GTK_WIDGET_VISIBLE(m_SignalDisplayTable) || !m_Buffer->hasFirstBuffer()) { return; } + + if (m_VerticalScaleRefresh || m_VerticalScaleForceUpdate) + { + const double marginMultiplier = 0.2; + + // @note the reason the applying of scale parameters is here and not inside SignalChannelDisplay is that in + // some situations we wish to estimate and set params across two SignalChannelDisplay objects: + // the main view and multiview. + if (m_ScalingMode == Global) + { + // Auto global + + // Find the global min and max + std::vector mins; + std::vector maxs; + m_ChannelDisplay[0]->getDisplayedValueRange(mins, maxs); + + double min = *(std::min_element(mins.begin(), mins.end())); + double max = *(std::max_element(maxs.begin(), maxs.end())); + + if (m_MultiViewEnabled) + { + std::vector multiMins; + std::vector multiMaxs; + m_ChannelDisplay[1]->getDisplayedValueRange(multiMins, multiMaxs); + + min = std::min(min, *(std::min_element(multiMins.begin(), multiMins.end()))); + max = std::max(max, *(std::max_element(multiMaxs.begin(), multiMaxs.end()))); + } + + // @todo some robust & fast estimate of a high quantile instead of max/min... + const double margin = marginMultiplier * (max - min); + + const double innerTopMargin = m_ChannelDisplay[0]->m_InnerTopMargin[0]; + const double innerBottomMargin = m_ChannelDisplay[0]->m_InnerBottomMargin[0]; + + if (m_VerticalScaleForceUpdate || + min < innerBottomMargin - margin || max > innerTopMargin + margin || + min > innerBottomMargin + margin || max < innerTopMargin - margin) + { + m_ChannelDisplay[0]->setGlobalScaleParameters(min, max, margin); // normal chns + m_ChannelDisplay[1]->setGlobalScaleParameters(min, max, margin); // multiview + } + } + else if (m_ScalingMode == None) + { + // Manual global, only updated when triggered as necessary + if (m_VerticalScaleForceUpdate) + { + const double min = m_CustomVerticalOffset - m_CustomVerticalScaleValue / 2; + const double max = m_CustomVerticalOffset + m_CustomVerticalScaleValue / 2; + const double margin = marginMultiplier * (max - min); + + m_ChannelDisplay[0]->setGlobalScaleParameters(min, max, margin); // normal chns + m_ChannelDisplay[1]->setGlobalScaleParameters(min, max, margin); // multiview + } + } + else if (m_ScalingMode == PerChannel) + { + // Auto local + std::vector mins; + std::vector maxs; + m_ChannelDisplay[0]->getDisplayedValueRange(mins, maxs); + +#ifdef DEBUG + if (m_VerticalScaleForceUpdate) { std::cout << "All channel params updated, forced\n"; } +#endif + + bool updated = false; + for (size_t i = 0; i < mins.size(); ++i) + { + const double margin = marginMultiplier * (maxs[i] - mins[i]); + const double innerTopMargin = m_ChannelDisplay[0]->m_InnerTopMargin[i]; + const double innerBottomMargin = m_ChannelDisplay[0]->m_InnerBottomMargin[i]; + + if (m_VerticalScaleForceUpdate || + mins[i] < innerBottomMargin - margin || maxs[i] > innerTopMargin + margin || + mins[i] > innerBottomMargin + margin || maxs[i] < innerTopMargin - margin) + { +#ifdef DEBUG + if (!m_VerticalScaleForceUpdate) { + std::cout << "Channel " << i + 1 << " params updated: " + << mins[i] << " not in [" << innerBottomMargin - margin << "," << innerBottomMargin + margin << "], or " + << maxs[i] << " not in [" << innerTopMargin - margin << "," << innerTopMargin + margin << "], " + << " margin was " << margin << "\n"; + } +#endif + m_ChannelDisplay[0]->setLocalScaleParameters(i, mins[i], maxs[i], margin); + updated = true; + } + else + { +#if 0 +#ifdef DEBUG + std::cout << "No need to update channel " << i + 1 << ", " + << mins[i] << " in [" << innerBottomMargin - margin << "," << innerBottomMargin + margin << "], or " + << maxs[i] << " in [" << innerTopMargin - margin << "," << innerTopMargin + margin << "], " + << " margin was " << margin << "\n"; +#endif +#endif + } + } + if (updated) { m_ChannelDisplay[0]->updateDisplayParameters(); } + + // For multiview, we take the maxes of the involved signals + if (m_MultiViewEnabled) + { + m_ChannelDisplay[1]->getDisplayedValueRange(mins, maxs); + + const double min = *(std::min_element(mins.begin(), mins.end())); + const double max = *(std::max_element(maxs.begin(), maxs.end())); + + // @todo some robust & fast estimate of a high quantile instead of max/min... + const double margin = marginMultiplier * (max - min); + const double innerTopMargin = m_ChannelDisplay[1]->m_InnerTopMargin[0]; + const double innerBottomMargin = m_ChannelDisplay[1]->m_InnerBottomMargin[0]; + + if (m_VerticalScaleForceUpdate || max > innerTopMargin + margin || max < innerTopMargin - margin + || min > innerBottomMargin + margin || min < innerBottomMargin - margin) + { + m_ChannelDisplay[1]->setGlobalScaleParameters(min, max, margin); // multiview + m_ChannelDisplay[1]->updateDisplayParameters(); + } + } + } + else + { + std::stringstream ss; + ss << "Error: unknown scaling mode " << m_ScalingMode.str() << ". Did you update the box?\n"; + m_ErrorState.emplace_back(ss.str().c_str()); + return; + } + m_VerticalScaleRefresh = false; + m_VerticalScaleForceUpdate = false; + } + + // todo don't reset every frame + + /* + + + std::cout << "Range is " << largestDisplayedValueRange << " at " << maxIdxI << "," << maxIdxJ + << " with lim [" << m_LargestDisplayedValueRange - m_ValueRangeMargin << "," + << m_LargestDisplayedValueRange + m_ValueRangeMargin << "," + << " largest " << largestDisplayedValue + << " vs " << m_LargestDisplayedValue + << " smallest " << smallestDisplayedValue << " vs " << m_SmallestDisplayedValue + << "\n"; + */ + + //if in scan mode, check whether time scale needs to be updated + if (m_Buffer->getDisplayMode() == Scan && m_LeftmostDisplayedTime < m_Buffer->m_StartTime[0]) + { + //std::cout << "Time basis needs to be updated\n"; + if (m_Buffer->m_SampleBuffers.size() < m_Buffer->m_NBufferToDisplay) { m_LeftmostDisplayedTime = m_Buffer->m_StartTime[0]; } + else //catch up with current time interval + { + if (m_Buffer->m_TotalStep == 0) + { + // Error + // + // @note This can happen at least during changing of time scale, however on the next attempt it seems + // to be already fixed in the bufferdatabase and things seem to work, so don't bother returning error. + // @fixme should get proper understanding of this part to properly handle it, i.e. should we + // really raise an error state in some situations or not. + // m_ErrorState.push_back(CString("Error: Buffer database m_TotalStep is 0\n")); + } + else + { + m_LeftmostDisplayedTime += m_Buffer->m_TotalStep; + + uint64_t upperLimit = 0; + if (m_Buffer->m_BufferStep <= m_Buffer->m_StartTime[0]) // This bubblegum-patch test is here for uint, should be an assert + { + upperLimit = m_Buffer->m_StartTime[0] - m_Buffer->m_BufferStep; + } + else { m_ErrorState.emplace_back("Error: Buffer step is larger than the start time\n"); } + + //while there is time to catch up + while (m_LeftmostDisplayedTime < upperLimit) { m_LeftmostDisplayedTime += m_Buffer->m_TotalStep; } + + //round leftmost displayed time to start of closest data buffer + for (size_t i = 0; i < m_Buffer->m_StartTime.size(); ++i) + { + if (m_Buffer->m_EndTime[i] > m_LeftmostDisplayedTime) { m_LeftmostDisplayedTime = m_Buffer->m_StartTime[i]; } + } + +#if 0 + //if drawing is not up to date, force a full redraw + // We're not currently doing this as it seems to cause even worse lag + if (m_ChannelDisplay[0]->m_latestDisplayedTime != m_leftmostDisplayedTime) + { + for (size_t i = 0; i < m_ChannelDisplay.size(); ++i) + { +#ifdef DEBUG + std::cout << "Requesting full redraw for " << i << ", case D (drawing late)\n"; +#endif + m_ChannelDisplay[i]->redrawAllAtNextRefresh(true); + } + } +#endif + } + } + } + + //redraw channels + for (auto& channel : m_ChannelDisplay) + { + if (GTK_WIDGET_VISIBLE(channel->getSignalDisplayWidget())) + { + /* + //if in scroll mode, or if time basis changed, redraw all + if(m_BufferDatabase->getDisplayMode() == OVP_TypeId_SignalDisplayMode_Scroll || channelDisplay->mustRedrawAll() == true) + { + std::cout << "full redraw\n";*/ + GdkRectangle updateRect; + channel->getUpdateRectangle(updateRect); + if (channel->getSignalDisplayWidget()->window) { gdk_window_invalidate_rect(channel->getSignalDisplayWidget()->window, &updateRect, false); } + /*} + else + { + GdkRectangle updateRect; + m_ChannelDisplay[i]->getUpdateRectangle(updateRect); + //printf("partial redraw : x=%d, w=%d\n", updateRect.x, updateRect.width); + gdk_window_clear_area_e(m_ChannelDisplay[i]->getSignalDisplayWidget()->window, updateRect.x, updateRect.y, updateRect.width, updateRect.height); + }*/ + } + } + + //redraw ruler + m_BottomRuler->setLeftmostDisplayedTime(m_LeftmostDisplayedTime); + if (GTK_WIDGET(m_BottomRuler->getWidget())->window) { gdk_window_invalidate_rect(GTK_WIDGET(m_BottomRuler->getWidget())->window, nullptr, true); } +} + +void CSignalDisplayView::toggleLeftRulers(const bool active) +{ + m_ShowLeftRulers = active; + + for (size_t j = 0; j < m_ChannelDisplay[0]->m_LeftRuler.size(); ++j) + { + if (active && isChannelDisplayVisible(0) && m_SelectedChannels[j]) { gtk_widget_show(m_ChannelDisplay[0]->getRulerWidget(j)); } + else { gtk_widget_hide(m_ChannelDisplay[0]->getRulerWidget(j)); } + } + + // Multiview + if (m_MultiViewEnabled) + { + if (active) { gtk_widget_show(m_ChannelDisplay[1]->getRulerWidget(0)); } + else { gtk_widget_hide(m_ChannelDisplay[1]->getRulerWidget(0)); } + } +} + +void CSignalDisplayView::toggleBottomRuler(const bool active) +{ + m_ShowBottomRuler = active; + + if (active) { gtk_widget_show_all(GTK_WIDGET(m_BottomBox)); } + else { gtk_widget_hide_all(GTK_WIDGET(m_BottomBox)); } +} + +void CSignalDisplayView::toggleChannel(const size_t index, const bool active) +{ + CSignalChannelDisplay* display = getChannelDisplay(index); + + if (active) + { + gtk_widget_show(m_ChannelLabel[index]); + if (m_ShowLeftRulers) { gtk_widget_show(display->getRulerWidget(display->m_ChannelList.size() - 1)); } + gtk_widget_show(display->getSignalDisplayWidget()); + gtk_widget_show(m_Separators[index]); + } + else + { + gtk_widget_hide(m_ChannelLabel[index]); + gtk_widget_hide(display->getRulerWidget(display->m_ChannelList.size() - 1)); + gtk_widget_hide(display->getSignalDisplayWidget()); + gtk_widget_hide(m_Separators[index]); + } +} + +// If we swap multiview on/off, it seems we need to do another size request to +// get the labels and signals properly aligned. The problem appears if there are many channels and this is not done. +void CSignalDisplayView::updateDisplayTableSize() const +{ + const int leftRulerW = 50, channelDisplayW = 20, channelDisplayH = 20; + + //sets a minimum size for the table (needed to scroll) + gtk_widget_set_size_request(m_SignalDisplayTable, leftRulerW + channelDisplayW, (m_NSelectedChannel + (m_MultiViewEnabled ? 1 : 0)) * channelDisplayH); +} + +void CSignalDisplayView::toggleChannelMultiView(const bool active) +{ + updateDisplayTableSize(); + + CSignalChannelDisplay* display = getChannelDisplay(m_ChannelDisplay.size() - 1); + if (active) + { + gtk_widget_show(m_ChannelLabel[m_ChannelLabel.size() - 1]); + if (m_ShowLeftRulers) { gtk_widget_show(display->getRulerWidget(0)); } + gtk_widget_show(display->getSignalDisplayWidget()); + } + else + { + gtk_widget_hide(m_ChannelLabel[m_ChannelLabel.size() - 1]); + gtk_widget_hide(display->getRulerWidget(0)); + gtk_widget_hide(display->getSignalDisplayWidget()); + } +} + +// This removes all the per-channel rulers and widgets. It adds ref count to the removed +// widgets so we can later add them back. +void CSignalDisplayView::removeOldWidgets() +{ + // Remove labels and rulers + for (size_t i = 0; i < m_SelectedChannels.size(); ++i) + { + // Only remove those which we know are displayed + if (m_SelectedChannels[i]) + { + g_object_ref(m_ChannelLabel[i]); + g_object_ref(m_ChannelDisplay[0]->getRulerWidget(i)); + gtk_container_remove(GTK_CONTAINER(m_SignalDisplayTable), m_ChannelLabel[i]); + gtk_container_remove(GTK_CONTAINER(m_SignalDisplayTable), m_ChannelDisplay[0]->getRulerWidget(i)); + } + } + + // Remove the separator + g_object_ref(m_Separator); + gtk_container_remove(GTK_CONTAINER(m_SignalDisplayTable), m_Separator); + + // Remove the drawing area + g_object_ref(m_ChannelDisplay[0]->getSignalDisplayWidget()); + gtk_container_remove(GTK_CONTAINER(m_SignalDisplayTable), m_ChannelDisplay[0]->getSignalDisplayWidget()); +} + +// When channels are added or removed, this function removes and recreates the table holding the +// rulers. The reason to do this is that the size of the drawing canvas is dependent on the size +// of the table, and we want to use the window space to draw the selected signals, likely much +// smaller than the size of canvas for all the channes. +// @note refcounts of the added widgets are decreased. Its expected removeOldWidgets() has been called before. +// @fixme this code could really use some refactoring, for example +// make a struct to hold label and ruler and keep them in a vector. Also, similar attach code is +// already in init(). Turn to functions. +void CSignalDisplayView::recreateWidgets(const size_t nChannel) +{ + // Resize the table to fit only the selected amount of channels (+multiview) + gtk_table_resize(GTK_TABLE(m_SignalDisplayTable), nChannel + 1, 4); + + // Add selected channel widgets back + for (size_t i = 0, cnt = 0; i < m_SelectedChannels.size(); ++i) + { + if (m_SelectedChannels[i]) + { + gtk_table_attach(GTK_TABLE(m_SignalDisplayTable), m_ChannelDisplay[0]->getRulerWidget(i), 2, 3, //third column + cnt, cnt + 1, GTK_FILL, GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0); + gtk_table_attach(GTK_TABLE(m_SignalDisplayTable), m_ChannelLabel[i], 0, 1, //first column + cnt, cnt + 1, GTK_FILL, GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0); + cnt++; + g_object_unref(m_ChannelLabel[i]); + g_object_unref(m_ChannelDisplay[0]->getRulerWidget(i)); + } + } + + // Add separator back + gtk_table_attach(GTK_TABLE(m_SignalDisplayTable), m_Separator, 1, 2, 0, nChannel + 1, //second column run over the whole table height + GTK_SHRINK, GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0); + g_object_unref(m_Separator); + + // Add drawing canvas back + gtk_table_attach(GTK_TABLE(m_SignalDisplayTable), m_ChannelDisplay[0]->getSignalDisplayWidget(), 3, 4, //fourth column + 0, nChannel,// run over the whole table (last row for multiview) + GtkAttachOptions(GTK_EXPAND | GTK_FILL), GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0); + g_object_unref(m_ChannelDisplay[0]->getSignalDisplayWidget()); + + updateDisplayTableSize(); +} + + +void CSignalDisplayView::updateMainTableStatus() +{ + // Do we have multiview channels selected? + bool multiView = false; + for (size_t i = 0; i < m_MultiViewSelectedChannels.size(); ++i) { multiView |= m_MultiViewSelectedChannels[i]; } + + // See if any normal channels have been selected + bool channels = false; + for (size_t i = 0; i < m_SelectedChannels.size(); ++i) { channels |= m_SelectedChannels[i]; } + + //if nothing has been selected, hide & bail out + if (!channels && !multiView) + { + //hide the whole table + gtk_widget_hide(GTK_WIDGET(m_SignalDisplayTable)); + return; + } + + // If a multiview channel has been selected, we link the bottom ruler to the multiview + if (!GTK_WIDGET_VISIBLE(GTK_WIDGET(m_SignalDisplayTable))) + { + //if there were no selected channels before, but now there are, show the table again + gtk_widget_show(GTK_WIDGET(m_SignalDisplayTable)); + } + + if (!multiView) { m_BottomRuler->linkWidthToWidget(m_ChannelDisplay[0]->getSignalDisplayWidget()); } + else { m_BottomRuler->linkWidthToWidget(m_ChannelDisplay[1]->getSignalDisplayWidget()); } +} + +void CSignalDisplayView::activateToolbarButtons(const bool active) const +{ + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayScrollModeButton")), active); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayToggleLeftRulerButton")), active); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayToggleBottomRulerButton")), active); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayToggleUnitsButton")), active); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayChannelSelectButton")), active); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayStimulationColorsButton")), active); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayMultiViewButton")), active); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayInformationButton")), active); +} + +bool CSignalDisplayView::onUnitsToggledCB(const bool active) +{ + // dont update for multiview + for (size_t i = 0; i < m_ChannelLabel.size() - 1; ++i) + { + if (active) + { + std::stringstream label(""); + label << m_ChannelName[i].toASCIIString(); + label << "\n(" << m_ChannelUnits[i].first.toASCIIString(); + label << ", " << m_ChannelUnits[i].second.toASCIIString() << ")"; + + gtk_label_set_text(GTK_LABEL(m_ChannelLabel[i]), label.str().c_str()); + } + else + { + std::stringstream label(""); + label << m_ChannelName[i]; + gtk_label_set_text(GTK_LABEL(m_ChannelLabel[i]), label.str().c_str()); + } + } + + return true; +} + +bool CSignalDisplayView::onDisplayModeToggledCB(const CIdentifier& mode) +{ + m_Buffer->setDisplayMode(mode); + + //force full redraw of all channels when display mode changes + for (auto& channel : m_ChannelDisplay) { channel->redrawAllAtNextRefresh(true); } + + //redraw channels + redraw(); + + return true; +} + +bool CSignalDisplayView::onVerticalScaleModeToggledCB(GtkToggleButton* /*pToggleButton*/) +{ + m_VerticalScaleForceUpdate = true; + m_VerticalScaleRefresh = true; + + // ::gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_BuilderInterface, "SignalDisplayCustomVerticalScaleSpinButton")), !m_autoVerticalScale); + // ::gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_builder_get_object(m_BuilderInterface, "SignalDisplayCustomVerticalScaleSpinButton")), m_LargestDisplayedValueRange); + + return true; +} + +bool CSignalDisplayView::onCustomVerticalScaleChangedCB(GtkSpinButton* button) +{ + m_VerticalScaleForceUpdate = true; + m_VerticalScaleRefresh = true; + m_CustomVerticalScaleValue = gtk_spin_button_get_value(button); + return true; +} + +bool CSignalDisplayView::onCustomVerticalOffsetChangedCB(GtkSpinButton* button) +{ + m_VerticalScaleForceUpdate = true; + m_VerticalScaleRefresh = true; + m_CustomVerticalOffset = gtk_spin_button_get_value(button); + return true; +} + + +CSignalChannelDisplay* CSignalDisplayView::getChannelDisplay(const size_t index) +{ + return (index < m_ChannelDisplay.size()) ? m_ChannelDisplay[index] : nullptr; +} + +bool CSignalDisplayView::isChannelDisplayVisible(const size_t index) { return GTK_WIDGET_VISIBLE(getChannelDisplay(index)->getSignalDisplayWidget()); } + +void CSignalDisplayView::onStimulationReceivedCB(const uint64_t id, const CString& name) +{ + if (m_Stimulations.find(id) == m_Stimulations.end()) + { + //only the lower 32 bits of the stimulation code are currently used to compute the color + const auto code = uint32_t(id); + GdkColor color = InitGDKColor(0, 0, 0, 0); + + //go through the lower 32 bits to compute RGB components. Bit positions are + //inverted so that close code values result in very different colors. + for (uint32_t i = 0; i < 11; ++i) + { + color.red |= ((code >> (3 * i)) & 0x1) << (10 - i); + color.green |= ((code >> (3 * i + 1)) & 0x1) << (10 - i); + if (i < 10) //only 10 bits for blue component + { + color.blue |= ((code >> (3 * i + 2)) & 0x1) << (9 - i); + } + } + + //convert to 16 bits per channel + color.red = (color.red * 65535) / 0x7FF; //red coded on 11 bits + color.green = (color.green * 65535) / 0x7FF; //green coded on 11 bits + color.blue = (color.blue * 65535) / 0x3FF; //blue coded on 10 bits + + //store stimulation color in map + m_Stimulations[id].first = name; + m_Stimulations[id].second = color; + + //update stimulations dialog + updateStimulationColorsDialog(name, color); + } + + // @note We should not redraw after the stimuli, as the stim timestamp may be in the future compared + // to the signal database. If that is the case, we get an expensive redraw from the code. + // The redraw will be carried out in the normal course of events when plotting the signal. +} + +bool CSignalDisplayView::setChannelUnits(const std::vector>& channelUnits) +{ + for (size_t i = 0; i < channelUnits.size(); ++i) { m_ChannelUnits[i] = channelUnits[i]; } + + return true; +} + +void CSignalDisplayView::getStimulationColor(const uint64_t id, GdkColor& color) +{ + if (m_Stimulations.find(id) != m_Stimulations.end()) { color = m_Stimulations[id].second; } +} + +void CSignalDisplayView::getMultiViewColor(const size_t index, GdkColor& color) +{ + if (m_Signals.find(index) != m_Signals.end()) { color = m_Signals[index].second; } + else + { + const auto code = uint32_t(index); + color.red = 0; + color.green = 0; + color.blue = 0; + + //go through the lower 32 bits to compute RGB components. Bit positions are + //inverted so that close code values result in very different colors. + for (uint32_t i = 0; i < 11; ++i) + { + color.red |= ((code >> (3 * i)) & 0x1) << (10 - i); + color.green |= ((code >> (3 * i + 1)) & 0x1) << (10 - i); + if (i < 10) //only 10 bits for blue component + { + color.blue |= ((code >> (3 * i + 2)) & 0x1) << (9 - i); + } + } + + //convert to 16 bits per channel + color.red = (color.red * 65535) / 0x7FF; //red coded on 11 bits + color.green = (color.green * 65535) / 0x7FF; //green coded on 11 bits + color.blue = (color.blue * 65535) / 0x3FF; //blue coded on 10 bits + + //store signal color in map + m_Signals[index].first = ""; + m_Signals[index].second = color; + } +} + +void CSignalDisplayView::updateStimulationColorsDialog(const CString& stimulation, const GdkColor& color) const +{ + //retrieve table + GtkTable* colors = GTK_TABLE(gtk_builder_get_object(m_Builder, "SignalDisplayStimulationColorsTable")); + + //resize table and store new colors + gtk_table_resize(colors, colors->nrows + 1, 2); + + //set a minimum size request (needed to scroll) + const int labelW = -1, colorW = 50, rowH = 20; + + gtk_widget_set_size_request(GTK_WIDGET(colors), -1, (colors->nrows + 1) * rowH); + + GtkLabel* stimLabel = GTK_LABEL(gtk_label_new("Stimulations")); + gtk_widget_set_size_request(GTK_WIDGET(stimLabel), -1, 20); + gtk_table_attach(colors, GTK_WIDGET(stimLabel), 0, 1, 0, 1, GtkAttachOptions(GTK_EXPAND | GTK_FILL), GTK_FILL, 0, 0); + + GtkLabel* colorLabel = GTK_LABEL(gtk_label_new("Colors")); + gtk_widget_set_size_request(GTK_WIDGET(colorLabel), -1, 20); + gtk_table_attach(colors, GTK_WIDGET(colorLabel), 1, 2, 0, 1, GtkAttachOptions(GTK_EXPAND | GTK_FILL), GTK_FILL, 0, 0); + + GtkLabel* label = GTK_LABEL(gtk_label_new(stimulation.toASCIIString())); + gtk_widget_set_size_request(GTK_WIDGET(label), labelW, rowH); + gtk_table_attach(colors, GTK_WIDGET(label), 0, 1, //first column + colors->nrows - 1, colors->nrows - 1 + 1, //last row + GtkAttachOptions(GTK_EXPAND | GTK_FILL), GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0); +#if 1 + GdkPixbuf* pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, colorW, rowH); + //fill with RGBA value (255 / 65535 = 1 / 257) + const guint32 c = (guint32(color.red / 257) << 24) + (guint32(color.green / 257) << 16) + (guint32(color.blue / 257) << 8); + gdk_pixbuf_fill(pixbuf, c); + GtkWidget* image = gtk_image_new_from_pixbuf(pixbuf); + gtk_table_attach(colors, GTK_WIDGET(image), 1, 2, colors->nrows - 1, colors->nrows - 1 + 1, //2nd column last row + GtkAttachOptions(GTK_EXPAND | GTK_FILL), GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0); +#else + ::GtkColorButton* button = GTK_COLOR_BUTTON(gtk_color_button_new_with_color(&rStimulationColor)); + ::gtk_widget_set_size_request(GTK_WIDGET(button), colorWidthRequest, rowHeightRequest); + //g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(dummyButtonCallback), nullptr); + ::gtk_table_attach(stimulationColorsTable, GTK_WIDGET(button), 1, 2, //2nd column + stimulationColorsTable->nrows - 1, stimulationColorsTable->nrows - 1 + 1, //last row + static_cast <::GtkAttachOptions>(GTK_EXPAND | GTK_FILL), static_cast <::GtkAttachOptions>(GTK_EXPAND | GTK_FILL), 0, 0); +#endif + GtkWidget* stimulationColorsDialog = GTK_WIDGET(gtk_builder_get_object(m_Builder, "SignalDisplayStimulationColorsDialog")); + if (m_StimulationColorsShown) + { + // Forces a redraw of it all + gtk_widget_show_all(stimulationColorsDialog); + gtk_widget_queue_draw(stimulationColorsDialog); + } +} + +void CSignalDisplayView::refreshScale() { m_VerticalScaleRefresh = true; } // But do not force an update, its just a recommendation to check... + +// +//CALLBACKS +// + +void ScrollModeButtonCB(GtkWidget* widget, gpointer data) +{ + reinterpret_cast(data)->onDisplayModeToggledCB(gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget)) != 0 ? Scroll : Scan); +} + +void UnitsButtonCB(GtkWidget* widget, gpointer data) +{ + reinterpret_cast(data)->onUnitsToggledCB(gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget)) != 0); +} + +void ScalingModeButtonCB(GtkWidget* widget, gpointer data) +{ + auto* view = reinterpret_cast(data); + + const int selection = gtk_combo_box_get_active(GTK_COMBO_BOX(widget)); + + if (view->m_ScalingMode != selection) + { + view->m_ScalingMode = selection; + view->m_VerticalScaleForceUpdate = true; + view->m_VerticalScaleRefresh = true; + + view->redraw(); // immediate redraw + + const bool controlsActive = (view->m_ScalingMode == None); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(view->m_Builder, "SignalDisplayCustomVerticalScaleSpinButton")), controlsActive); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(view->m_Builder, "SignalDisplayDC")), controlsActive); + } +} + +void ToggleLeftRulerButtonCB(GtkWidget* widget, gpointer data) +{ + reinterpret_cast(data)->toggleLeftRulers(gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget)) != 0); +} + +void ToggleBottomRulerButtonCB(GtkWidget* widget, gpointer data) +{ + reinterpret_cast(data)->toggleBottomRuler(gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget)) != 0); +} + +void CustomVerticalScaleChangedCB(GtkSpinButton* button, gpointer data) { reinterpret_cast(data)->onCustomVerticalScaleChangedCB(button); } + +void CustomVerticalOffsetChangedCB(GtkSpinButton* button, gpointer data) +{ + reinterpret_cast(data)->onCustomVerticalOffsetChangedCB(button); +} + +gboolean SpinButtonValueChangedCB(GtkSpinButton* widget, gpointer data) +{ + auto* view = reinterpret_cast(data); + + const double newValue = gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget)); + + //Compute and save the new number of buffers to display + const bool numberOfDisplayedBufferChanged = view->m_Buffer->adjustNumberOfDisplayedBuffers(newValue); + + if (numberOfDisplayedBufferChanged) + { + //reserve the maximum space needed for computing the points to display + //(when cropping the lines, there can be up to two times the number of original points) + view->m_Points.reserve(size_t(view->m_Buffer->m_DimSizes[1] * view->m_Buffer->m_NBufferToDisplay * 2)); + + //resize the vector of raw points (before cropping) + view->m_RawPoints.resize(size_t(view->m_Buffer->m_DimSizes[1] * view->m_Buffer->m_NBufferToDisplay)); + + //force full redraw of all channels when time scale changes + for (size_t i = 0; i < view->m_ChannelDisplay.size(); ++i) { view->getChannelDisplay(i)->updateScale(); } + //redraw channels + + view->m_VerticalScaleForceUpdate = true; + view->m_VerticalScaleRefresh = true; + + view->redraw(); + } + + return FALSE; +} + +//called when the channel select button is pressed (opens the channel selection dialog) +void ChannelSelectButtonCB(GtkButton* /*button*/, gpointer data) +{ + auto* view = reinterpret_cast(data); + + GtkWidget* channelSelectDialog = GTK_WIDGET(gtk_builder_get_object(view->m_Builder, "SignalDisplayChannelSelectDialog")); + GtkTreeView* channelSelectTreeView = GTK_TREE_VIEW(gtk_builder_get_object(view->m_Builder, "SignalDisplayChannelSelectList")); + GtkTreeSelection* channelSelectTreeSelection = gtk_tree_view_get_selection(channelSelectTreeView); + GtkTreeModel* channelSelectTreeModel = gtk_tree_view_get_model(channelSelectTreeView); + GtkTreeIter iter; + + if (gtk_tree_model_get_iter_first(channelSelectTreeModel, &iter)) + { + for (size_t i = 0; i < view->m_SelectedChannels.size(); ++i) + { + if (view->m_SelectedChannels[i]) { gtk_tree_selection_select_iter(channelSelectTreeSelection, &iter); } + else { gtk_tree_selection_unselect_iter(channelSelectTreeSelection, &iter); } + if (!gtk_tree_model_iter_next(channelSelectTreeModel, &iter)) { break; } + } + } + + //finally, show the dialog + gtk_widget_show_all(channelSelectDialog); +} + +//Called when the user presses the apply button of the channel selection dialog +void ChannelSelectDialogApplyButtonCB(GtkButton* /*button*/, gpointer data) +{ + auto* view = reinterpret_cast(data); + + GtkTreeView* channelSelectTreeView = GTK_TREE_VIEW(gtk_builder_get_object(view->m_Builder, "SignalDisplayChannelSelectList")); + GtkTreeSelection* channelSelectTreeSelection = gtk_tree_view_get_selection(channelSelectTreeView); + GtkTreeModel* channelSelectTreeModel = gtk_tree_view_get_model(channelSelectTreeView); + GtkTreeIter iter; + size_t selectedCount = 0; + + view->m_ChannelDisplay[0]->resetChannelList(); + + // We first remove the widgets while we still know from m_SelectedChannels which are displayed + view->removeOldWidgets(); + + if (gtk_tree_model_get_iter_first(channelSelectTreeModel, &iter)) + { + for (size_t i = 0; i < view->m_SelectedChannels.size(); ++i) + { + view->m_SelectedChannels[i] = (gtk_tree_selection_iter_is_selected(channelSelectTreeSelection, &iter) != 0); + + if (gtk_tree_selection_iter_is_selected(channelSelectTreeSelection, &iter) != 0) + { + view->m_ChannelDisplay[0]->addChannelList(i); + gtk_widget_show(view->m_ChannelLabel[i]); + if (view->m_ShowLeftRulers) { gtk_widget_show(view->m_LeftRulers[i]); } + selectedCount++; + } + else + { + gtk_widget_hide(view->m_ChannelLabel[i]); + gtk_widget_hide(view->m_LeftRulers[i]); + } + + if (!gtk_tree_model_iter_next(channelSelectTreeModel, &iter)) { break; } + } + } + + view->m_NSelectedChannel = selectedCount; + + // Add the widgets back with the new list of channels + view->recreateWidgets(selectedCount); + + view->updateMainTableStatus(); + + view->m_VerticalScaleForceUpdate = true; + view->m_VerticalScaleRefresh = true; + + //redraw channels + // view->redraw(); + + //hides the channel selection dialog + gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(view->m_Builder, "SignalDisplayChannelSelectDialog"))); +} + +gint CloseStimulationColorsWindow(GtkWidget* /*widget*/, GdkEvent* /*event*/, gpointer data) +{ + StimulationColorsButtonCB(nullptr, data); + return TRUE; +} + +void StimulationColorsButtonCB(GtkButton* /*button*/, gpointer data) +{ + auto* view = reinterpret_cast(data); + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(view->m_Builder, "SignalDisplayStimulationColorsDialog")); + + if (view->m_StimulationColorsShown) + { + gtk_widget_hide(dialog); + view->m_StimulationColorsShown = false; + } + else + { + gtk_widget_show_all(dialog); + view->m_StimulationColorsShown = true; + } +} + +//Called when the user presses the Information button (opens the information dialog) +void InformationButtonCB(GtkButton* /*button*/, gpointer data) +{ + auto* view = reinterpret_cast(data); + + //gets the different values from the database and updates the corresponding label's text field + std::stringstream value; + value << view->m_Buffer->m_DimSizes[0]; + gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(view->m_Builder, "SignalDisplayNumberOfChannels")), value.str().c_str()); + + value.str(""); + value << view->m_Buffer->m_Sampling; + gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(view->m_Builder, "SignalDisplaySamplingFrequency")), value.str().c_str()); + + value.str(""); + value << view->m_Buffer->m_DimSizes[1]; + gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(view->m_Builder, "SignalDisplaySamplesPerBuffer")), value.str().c_str()); + + value.str(""); + value << view->m_Buffer->m_MinValue; + gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(view->m_Builder, "SignalDisplayMinimumValue")), value.str().c_str()); + + value.str(""); + value << view->m_Buffer->m_MaxValue; + gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(view->m_Builder, "SignalDisplayMaximumValue")), value.str().c_str()); + + GtkWidget* informationDialog = GTK_WIDGET(gtk_builder_get_object(view->m_Builder, "SignalDisplayInformationDialog")); + + //connect the close button to the dialog's hide command + g_signal_connect_swapped(G_OBJECT(gtk_builder_get_object(view->m_Builder, "SignalDisplayInformationClose")), + "clicked", G_CALLBACK(gtk_widget_hide), G_OBJECT(informationDialog)); + + g_signal_connect(G_OBJECT(informationDialog), "delete_event", G_CALLBACK(gtk_widget_hide), nullptr); + + //finally, show the information dialog + gtk_widget_show_all(informationDialog); +} + +//called when the channel select button is pressed (opens the channel selection dialog) +void MultiViewButtonCB(GtkButton* /*button*/, gpointer data) +{ + auto* view = reinterpret_cast(data); + + GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(view->m_Builder, "SignalDisplayMultiViewDialog")); + GtkTreeView* treeView = GTK_TREE_VIEW(gtk_builder_get_object(view->m_Builder, "SignalDisplayMultiViewSelectList")); + GtkTreeSelection* treeSelection = gtk_tree_view_get_selection(treeView); + GtkTreeModel* treeModel = gtk_tree_view_get_model(treeView); + GtkTreeIter iter; + + if (gtk_tree_model_get_iter_first(treeModel, &iter)) + { + for (size_t i = 0; !view->m_MultiViewSelectedChannels.empty(); ++i) + { + if (view->m_MultiViewSelectedChannels[i]) { gtk_tree_selection_select_iter(treeSelection, &iter); } + else { gtk_tree_selection_unselect_iter(treeSelection, &iter); } + if (!gtk_tree_model_iter_next(treeModel, &iter)) { break; } + } + } + + //finally, show the information dialog + gtk_widget_show_all(dialog); +} + +//Called when the user presses the apply button of the channel selection dialog +void MultiViewDialogApplyButtonCB(GtkButton* /*button*/, gpointer data) +{ + auto* view = reinterpret_cast(data); + + GtkTreeView* treeView = GTK_TREE_VIEW(gtk_builder_get_object(view->m_Builder, "SignalDisplayMultiViewSelectList")); + GtkTreeSelection* treeSelection = gtk_tree_view_get_selection(treeView); + GtkTreeModel* treeModel = gtk_tree_view_get_model(treeView); + GtkTreeIter it; + + if (gtk_tree_model_get_iter_first(treeModel, &it)) + { + for (size_t i = 0; i < view->m_MultiViewSelectedChannels.size(); ++i) + { + view->m_MultiViewSelectedChannels[i] = (gtk_tree_selection_iter_is_selected(treeSelection, &it) != 0); + if (!gtk_tree_model_iter_next(treeModel, &it)) { break; } + } + } + + view->changeMultiView(); + view->updateMainTableStatus(); + view->redraw(); // immediate redraw + + //hides the channel selection dialog + gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(view->m_Builder, "SignalDisplayMultiViewDialog"))); +} +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalDisplayView.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalDisplayView.h new file mode 100644 index 0000000..7fa0316 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/box-algorithms/ovpCSignalDisplay/ovpCSignalDisplayView.h @@ -0,0 +1,259 @@ +#pragma once + +#include +#include "ovpCSignalChannelDisplay.h" +#include "../../ovpCBufferDatabase.h" +#include "../../ovpCBottomTimeRuler.h" +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +/** +* This class contains everything necessary to setup a GTK window and display +* a signal thanks to a CBufferDatabase's information. +*/ +class CSignalDisplayView : public CSignalDisplayDrawable +{ +public: + + + /** + * \brief Constructor + * \param [in] buffer Signal database + * \param [in] timeScale Initial time scale value + * \param [in] displayMode Initial signal display mode + * \param [in] scalingMode Initial signal scaling mode + * \param [in] verticalScale Initial vertical scale value + * \param [in] verticalOffset Initial vertical offset value + * \param [in] timeScale Initial time scale value + * \param [in] horizontalRuler Initial horizontal ruler activation + * \param [in] verticalRuler Initial vertical ruler activation + * \param [in] multiview Initial multiview ruler activation + */ + CSignalDisplayView(CBufferDatabase& buffer, const CIdentifier& displayMode, const CIdentifier& scalingMode, + double verticalScale, double verticalOffset, double timeScale, bool horizontalRuler, bool verticalRuler, bool multiview); + + /** + * \brief Base constructor + * \param [in] buffer Signal database + * \param [in] timeScale Initial time scale value + * \param [in] displayMode Initial signal display mode + */ + void construct(CBufferDatabase& buffer, double timeScale, const CIdentifier& displayMode); + + /** + * \brief Destructor + */ + ~CSignalDisplayView() override; + /** + * \brief Get pointers to plugin main widget and (optional) toolbar widget + * \param [out] widget Pointer to main widget + * \param [out] toolbar Pointer to (optional) toolbar widget + */ + void getWidgets(GtkWidget*& widget, GtkWidget*& toolbar) const; + /** + * Initializes the window. + */ + void init() override; + /** + * Invalidates the window's content and tells it to redraw itself. + */ + void redraw() override; + /** + * Toggle left rulers on/off + * \param active Show rulers if true. + */ + void toggleLeftRulers(bool active); + /** + * Toggle time ruler on/off + * \param active Show the ruler if true. + */ + void toggleBottomRuler(bool active); + /** + * Toggle a channel on/off + * \param index The index of the channel to toggle. + * \param active Show the channel if true. + */ + void toggleChannel(size_t index, bool active); + + void toggleChannelMultiView(bool active); + + void changeMultiView(); + + void removeOldWidgets(); + void recreateWidgets(size_t nChannel); + void updateMainTableStatus(); + + void updateDisplayTableSize() const; + + void activateToolbarButtons(bool active) const; + + /** + * Callback called when display mode changes + * \param mode New display mode + * \return True + */ + bool onDisplayModeToggledCB(const CIdentifier& mode); + bool onUnitsToggledCB(bool active); + + /** + * Callback called when vertical scale mode changes + * \param button Radio button toggled + * \return True + */ + bool onVerticalScaleModeToggledCB(GtkToggleButton* button); + + /** + * Callback called when custom vertical scale is changed + * \param button Custom vertical scale widget + * \return True if custom vertical scale value could be retrieved, false otherwise + */ + bool onCustomVerticalScaleChangedCB(GtkSpinButton* button); + bool onCustomVerticalOffsetChangedCB(GtkSpinButton* button); + + /** + * \brief Get a channel display object + * \param index Index of channel display + * \return Channel display object + */ + CSignalChannelDisplay* getChannelDisplay(size_t index); + + bool isChannelDisplayVisible(size_t index); + + void onStimulationReceivedCB(uint64_t id, const CString& name); + + bool setChannelUnits(const std::vector>& channelUnits); + + /** + * \brief Get a color from a stimulation code + * \remarks Only the lower 32 bits of the stimulation code are currently used to compute the color. + * \param[in] id Stimulation code + * \param[out] color Color computed from stimulation code + */ + void getStimulationColor(uint64_t id, GdkColor& color); + + /** + * \brief Get a color from a signal + * \param[in] index channel index + * \param[out] color Color computed from stimulation code + */ + void getMultiViewColor(size_t index, GdkColor& color); + + void refreshScale(); + +private: + /** + * \brief Update stimulations color dialog with a new (stimulation, color) pair + * \param[in] stimulation Stimulation label + * \param[in] color Stimulation color + */ + void updateStimulationColorsDialog(const CString& stimulation, const GdkColor& color) const; + +public: + + //! The Builder handler used to create the interface + GtkBuilder* m_Builder = nullptr; + + //! The table containing the CSignalChannelDisplays + GtkWidget* m_SignalDisplayTable = nullptr; + GtkWidget* m_Separator = nullptr; + + //! Array of the channel's labels + std::vector m_ChannelLabel; + + //! Array of CSignalChannelDisplays (one per channel, displays the corresponding channel) + std::vector m_ChannelDisplay; + std::map m_Separators; + + //! Show left rulers when true + bool m_ShowLeftRulers = false; + + //!Show bottom time ruler when true + bool m_ShowBottomRuler = false; + + //! Time of displayed signals at the left of channel displays + uint64_t m_LeftmostDisplayedTime = 0; + + //! Largest displayed value range, to be matched by all channels in global best fit mode + double m_LargestDisplayedValueRange = 0; + double m_LargestDisplayedValue = 0; + double m_SmallestDisplayedValue = 0; + + //! Current value range margin, used to avoid redrawing signals every time the largest value range changes + double m_ValueRangeMargin = 0; + // double m_ValueMaxMargin; + /*! Margins added to largest and subtracted from smallest displayed values are computed as : + m_MarginFactor * m_LargestDisplayedValueRange. If m_MarginFactor = 0, there's no margin at all. + If factor is 0.1, largest displayed value range is extended by 10% above and below its extremums at the time + when margins are computed. */ + double m_MarginFactor = 0.4; + + //! Normal/zooming cursors + std::array m_Cursor; + + /** \name Vertical scale */ + //@{ + //! Flag set to true when you'd like the display to *check* if the scale needs to change and possibly update + bool m_VerticalScaleRefresh = true; + //! Flag set to true when you'd like the display to update in any case + bool m_VerticalScaleForceUpdate = false; + //! Value of custom vertical scale + double m_CustomVerticalScaleValue = 0; + //! Value of custom vertical offset + double m_CustomVerticalOffset = 0; + //@} + + //! The database that contains the information to use to draw the signals + CBufferDatabase* m_Buffer = nullptr; + + //! Vector of gdk points. Used to draw the signals. + std::vector m_Points; + + //! Vector of raw points. Stores the points' coordinates before cropping. + std::vector> m_RawPoints; + + std::vector m_ChannelName; + + //! Vector of indexes of the channels to display + std::map m_SelectedChannels; + + size_t m_NSelectedChannel = 0; + + std::map> m_ChannelUnits; + + //! Flag set to true once multi view configuration dialog is initialized + bool m_MultiViewEnabled = false; + + //! Vector of indices of selected channels + std::map m_MultiViewSelectedChannels; + + //Map of stimulation codes received so far, and their corresponding name and color + std::map> m_Stimulations; + + //Map of signal indices received so far, and their corresponding name and color + std::map> m_Signals; + + //! Bottom box containing bottom ruler + GtkBox* m_BottomBox = nullptr; + + //! Bottom time ruler + CBottomTimeRuler* m_BottomRuler = nullptr; + + //! Widgets for left rulers + std::vector m_LeftRulers; + + CIdentifier m_ScalingMode = CIdentifier::undefined(); + + static const std::vector SCALING_MODES; + + std::vector m_ErrorState; + + bool m_StimulationColorsShown = false; +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCBottomTimeRuler.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCBottomTimeRuler.cpp new file mode 100644 index 0000000..be4900f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCBottomTimeRuler.cpp @@ -0,0 +1,167 @@ +#include "ovpCBottomTimeRuler.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + + +#define CONVERT_TIME(i) (double((i)>>32) + double(double((i)&0xFFFFFFFF) / double((uint64_t)1<<32))) + +gboolean BottomRulerExposeEventCB(GtkWidget* /*widget*/, GdkEventExpose* /*event*/, gpointer data) +{ + //redraw the ruler + auto* bottomRuler = reinterpret_cast(data); + bottomRuler->draw(); + + //don't propagate this signal to the children if any + return TRUE; +} + +gboolean ResizeBottomRulerCB(GtkWidget* /*widget*/, GtkAllocation* allocation, gpointer data) +{ + auto* bottomRuler = reinterpret_cast(data); + bottomRuler->onResizeEventCB(allocation->width, allocation->height); + return FALSE; +} + +CBottomTimeRuler::CBottomTimeRuler(CBufferDatabase& database, const int width, const int height) + : m_database(&database), m_height(height) +{ + //creates the main drawing area + m_bottomRuler = gtk_drawing_area_new(); + + gtk_widget_set_size_request(m_bottomRuler, width, height); + g_signal_connect_after(G_OBJECT(m_bottomRuler), "expose_event", G_CALLBACK(BottomRulerExposeEventCB), this); +} + +void CBottomTimeRuler::draw() +{ + //if the widget is invisible, no need to redraw it + if (!GTK_WIDGET_VISIBLE(m_bottomRuler)) { return; } + + //gets the number of buffers to display + const uint64_t nBufferToDisplay = m_database->m_NBufferToDisplay; + + if (m_database->m_DimSizes[1] == 1 && nBufferToDisplay != 1) { /* nBufferToDisplay--;*/ } + + //gets the widget's size + gint bottomRulerWidth; + gint bottomRulerHeight; + gdk_drawable_get_size(m_bottomRuler->window, &bottomRulerWidth, &bottomRulerHeight); + + //in ms + const double intervalWidth = CONVERT_TIME(nBufferToDisplay * m_database->m_BufferDuration); + //if(m_Database->areEpochsContiguous() == true){intervalWidth = CONVERT_TIME(nBufferToDisplay * m_Database->m_BufferDuration);} + //else { intervalWidth = CONVERT_TIME(nBufferToDisplay * m_Database->m_BufferDuration); } + + //available width per buffer + const double widthPerBuffer = double(bottomRulerWidth) / double(nBufferToDisplay); + + //computes the step of the values displayed on the ruler + const auto nearestSmallerPowerOf10 = double(pow(10, floor(log10(intervalWidth)))); + const auto maxNumberOfLabels = uint64_t(bottomRulerWidth / m_pixelsPerLabel); + + double valueStep = nearestSmallerPowerOf10; + if (uint64_t(floor(intervalWidth / nearestSmallerPowerOf10)) > maxNumberOfLabels) { valueStep = 2 * nearestSmallerPowerOf10; } + else if (uint64_t(floor(intervalWidth / nearestSmallerPowerOf10)) < maxNumberOfLabels / 2) { valueStep = nearestSmallerPowerOf10 / 2; } + + if (m_database->getDisplayMode() == Scroll) + { + //compute start, end time and base value of the step + double startTime = 0; + if (!m_database->m_StartTime.empty()) { startTime = CONVERT_TIME(m_database->m_StartTime[0]); } + + const double endTime = startTime + intervalWidth; + const double baseValue = valueStep * floor(startTime / valueStep); + + //X position of the first label (if there are less buffers than needed) + auto baseX = int64_t(floor(bottomRulerWidth - (m_database->m_SampleBuffers.size() * widthPerBuffer))); + if (baseX < 0) { baseX = 0; } + + //draw ruler base (horizontal line) + gdk_draw_line(m_bottomRuler->window, m_bottomRuler->style->fg_gc[GTK_WIDGET_STATE(m_bottomRuler)], gint(baseX), 0, gint(bottomRulerWidth), 0); + + const int clipLeft = 0; + const int clipRight = bottomRulerWidth - 1; + + drawRuler(baseX, bottomRulerWidth, startTime, endTime, intervalWidth, baseValue, valueStep, clipLeft, clipRight); + } + else //scan mode + { + //draw ruler base (horizontal line) + gdk_draw_line(m_bottomRuler->window, m_bottomRuler->style->fg_gc[GTK_WIDGET_STATE(m_bottomRuler)], 0, 0, gint(bottomRulerWidth), 0); + + //left part of the ruler (recent data) + size_t leftmostBufferToDisplay = 0; + m_database->getIndexOfBufferStartingAtTime(m_leftmostDisplayedTime, leftmostBufferToDisplay); + double startTime = 0; + if (!m_database->m_StartTime.empty()) { startTime = CONVERT_TIME(m_leftmostDisplayedTime); } + double endTime = startTime + intervalWidth; + double baseValue = valueStep * floor(startTime / valueStep); + int clipLeft = 0; + int clipRight = int(double(m_database->m_NBufferToDisplay - leftmostBufferToDisplay) * widthPerBuffer); + + drawRuler(0, bottomRulerWidth, startTime, endTime, intervalWidth, baseValue, valueStep, clipLeft, clipRight); + + //right part (older data) + startTime -= intervalWidth; + endTime = startTime + intervalWidth; + baseValue = valueStep * floor(startTime / valueStep); + clipLeft = clipRight + 1; + clipRight = bottomRulerWidth - 1; + + drawRuler(0, bottomRulerWidth, startTime, endTime, intervalWidth, baseValue, valueStep, clipLeft, clipRight); + } +} + +void CBottomTimeRuler::onResizeEventCB(const gint width, gint /*height*/) const { gtk_widget_set_size_request(m_bottomRuler, width, m_height); } + +void CBottomTimeRuler::drawRuler(const int64_t baseX, const int rulerWidth, const double startTime, const double endTime, const double length, + const double baseValue, const double valueStep, const int clipLeft, const int clipRight) +{ + for (double i = baseValue; i < double(0.5 + endTime); i += valueStep) + { + //compute the position of the label + const gint textX = gint(baseX + ((i - startTime) * ((double(rulerWidth)) / length))); + //is text clipped? + if (textX < clipLeft) { continue; } + + std::string timeLabel = std::to_string(i); + PangoLayout* text = gtk_widget_create_pango_layout(m_bottomRuler, timeLabel.c_str()); + + int textWidth; + pango_layout_get_pixel_size(text, &textWidth, nullptr); + + //is text beyond visible range? + if (textX + textWidth > clipRight) + { + g_object_unref(text); + break; + } + + //if the width allocated per label becomes too small compared to the effective width of the label + if (uint64_t(textWidth) >= m_pixelsPerLabel - 20) + { + //increases the allocated width per label + m_pixelsPerLabel = textWidth + 30; + } + + //display it + gdk_draw_layout(m_bottomRuler->window, m_bottomRuler->style->fg_gc[GTK_WIDGET_STATE(m_bottomRuler)], textX, 4, text); + + //draw a small line above it + gdk_draw_line(m_bottomRuler->window, m_bottomRuler->style->fg_gc[GTK_WIDGET_STATE(m_bottomRuler)], textX, 0, textX, 3); + + g_object_unref(text); + } +} + +void CBottomTimeRuler::linkWidthToWidget(GtkWidget* widget) +{ + //adds a callback to the widget for the size-allocate signal + g_signal_connect(G_OBJECT(widget), "size-allocate", G_CALLBACK(ResizeBottomRulerCB), this); +} +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCBottomTimeRuler.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCBottomTimeRuler.h new file mode 100644 index 0000000..bc57d9d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCBottomTimeRuler.h @@ -0,0 +1,65 @@ +#pragma once + +#include "ovpCBufferDatabase.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +class CBufferDatabase; + +/** + * Used to display an horizontal temporal ruler. + * Uses information fetched from a signal database object. + * \param database Object from which to fetch time data + * \param width Width to be requested by widget + * \param height Height to be requested by widget + */ +class CBottomTimeRuler +{ +public: + CBottomTimeRuler(CBufferDatabase& database, int width, int height); + ~CBottomTimeRuler() = default; + + //! returns the widget, so it can be added to the main interface + GtkWidget* getWidget() const { return m_bottomRuler; } + + //! draws the ruler + void draw(); + + /** + * \brief Resize this ruler when the widget passed in parameter is resized + * \param widget Widget whose width is matched by this widget + */ + void linkWidthToWidget(GtkWidget* widget); + + //! in scan mode, leftmost displayed time is not always the one of the oldest buffer + void setLeftmostDisplayedTime(const uint64_t time) { m_leftmostDisplayedTime = time; } + + /** + * \brief Callback notified upon resize events + * \param width New window width + * \param height New window height + */ + void onResizeEventCB(gint width, gint height) const; + +private: + //! Draw ruler + void drawRuler(int64_t baseX, int rulerWidth, double startTime, double endTime, double length, double baseValue, double valueStep, int clipLeft, + int clipRight); + + //! Gtk widget + GtkWidget* m_bottomRuler = nullptr; + //! Signal database from which time information is retrieved + CBufferDatabase* m_database = nullptr; + //! Height request + int m_height = 0; + //! Space allocated per label + uint64_t m_pixelsPerLabel = 20; + //! When in scan mode, current leftmost displayed time + uint64_t m_leftmostDisplayedTime = 0; +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCBufferDatabase.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCBufferDatabase.cpp new file mode 100644 index 0000000..1d238fd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCBufferDatabase.cpp @@ -0,0 +1,663 @@ +#include "ovpCBufferDatabase.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +CBufferDatabase::CBufferDatabase(Toolkit::TBoxAlgorithm& parent) + : m_ParentPlugin(parent) +{ + m_decoder = &m_ParentPlugin.getAlgorithmManager().getAlgorithm( + m_ParentPlugin.getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_ChannelLocalisationDecoder)); + + m_decoder->initialize(); + + m_DimSizes[0] = m_DimSizes[1] = 0; +} + +CBufferDatabase::~CBufferDatabase() +{ + m_decoder->uninitialize(); + m_ParentPlugin.getAlgorithmManager().releaseAlgorithm(*m_decoder); + + //delete all the remaining buffers + while (!m_SampleBuffers.empty()) + { + delete[] m_SampleBuffers.front(); + m_SampleBuffers.pop_front(); + } + + //delete channel localisation matrices + while (!m_channelLocalisationCoords.empty()) + { + delete m_channelLocalisationCoords.front().first; + m_channelLocalisationCoords.pop_front(); + } + + /*while(m_oChannelLocalisationAlternateCoords.size() > 0) + { + delete[] m_oChannelLocalisationAlternateCoords.front().first; + m_oChannelLocalisationAlternateCoords.pop_front(); + }*/ +} + +bool CBufferDatabase::decodeChannelLocalisationMemoryBuffer(const IMemoryBuffer* buffer, uint64_t startTime, uint64_t endTime) +{ + //feed memory buffer to decoder + m_decoder->getInputParameter(OVP_GD_Algorithm_ChannelLocalisationDecoder_InputParameterId_MemoryBufferToDecode)->setReferenceTarget(&buffer); + + //process buffer + m_decoder->process(); + + //copy header if needed + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputTriggerId_ReceivedHeader)) + { + //retrieve matrix header + Kernel::TParameterHandler matrix; + matrix.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputParameterId_Matrix)); + + //copy channel labels + m_channelLocalisationLabels.resize(matrix->getDimensionSize(0)); + for (std::vector::size_type i = 0; i < m_channelLocalisationLabels.size(); ++i) + { + m_channelLocalisationLabels[i] = matrix->getDimensionLabel(0, i); + } + + //retrieve dynamic flag + Kernel::TParameterHandler dynamic; + dynamic.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputParameterId_Dynamic)); + m_dynamicChannelLocalisation = dynamic; + + if (matrix->getDimensionSize(1) == 3) + { + m_cartesianCoords = true; + /*m_pChannelLocalisationCartesianCoords = &m_channelLocalisationStreamedCoords; + m_pChannelLocalisationSphericalCoords = &m_oChannelLocalisationAlternateCoords;*/ + } + else if (matrix->getDimensionSize(1) == 2) + { + m_cartesianCoords = false; + /*m_pChannelLocalisationCartesianCoords = &m_oChannelLocalisationAlternateCoords; + m_pChannelLocalisationSphericalCoords = &m_channelLocalisationStreamedCoords;*/ + } + else + { + m_ParentPlugin.getLogManager() << Kernel::LogLevel_Error << + "Wrong size found for dimension 1 of Channel localisation header! Can't process header!\n"; + return false; + } + + //header information received + m_channelLocalisationHeaderReceived = true; + } + + //has a chanloc buffer been received? + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputTriggerId_ReceivedBuffer)) + { + //number of buffers required to cover displayed time range + uint64_t maxBufferCount = 1; + + //resize channel localisation queue if necessary + if (m_dynamicChannelLocalisation) + { + const uint64_t bufferDuration = endTime - startTime; + if (bufferDuration != 0) + { + maxBufferCount = uint64_t(ceil(m_TotalDuration / bufferDuration)); + if (maxBufferCount == 0) { maxBufferCount = 1; } + } + + //if new number of buffers decreased, resize list and destroy useless buffers + while (m_channelLocalisationCoords.size() > maxBufferCount) + { + delete[] m_channelLocalisationCoords.front().first; + m_channelLocalisationCoords.pop_front(); + // delete[] m_oChannelLocalisationAlternateCoords.front().first; + // m_oChannelLocalisationAlternateCoords.pop_front(); + m_channelLocalisationTimes.pop_front(); + } + } + + //retrieve coordinates matrix + Kernel::TParameterHandler matrix; + matrix.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputParameterId_Matrix)); + + //get pointer to destination matrix + CMatrix* channelLocalisation; + //CMatrix* alternateChannelLocalisation = nullptr; + if (m_channelLocalisationCoords.size() < maxBufferCount) + { + //create a new matrix and resize it + channelLocalisation = new CMatrix(); + channelLocalisation->copyDescription(*matrix); + // alternateChannelLocalisation = new CMatrix(); + // TODO : resize it appropriately depending on whether it is spherical or cartesian + } + else //m_channelLocalisationStreamedCoords.size() == maxBufferCount + { + channelLocalisation = m_channelLocalisationCoords.front().first; + m_channelLocalisationCoords.pop_front(); + // alternateChannelLocalisation = m_oChannelLocalisationAlternateCoords.front().first; + // m_oChannelLocalisationAlternateCoords.pop_front(); + m_channelLocalisationTimes.pop_front(); + } + + if (channelLocalisation) + { + //copy coordinates and times + channelLocalisation->copyContent(*matrix); + m_channelLocalisationCoords.emplace_back(channelLocalisation, true); + //m_oChannelLocalisationAlternateCoords.push_back(std::pair(alternateChannelLocalisation, true)); + m_channelLocalisationTimes.emplace_back(startTime, endTime); + } + } + + return true; +} + +bool CBufferDatabase::onChannelLocalisationBufferReceived(const size_t index) +{ + m_channelLocalisationCoords[index].second = false; + return true; +} + +bool CBufferDatabase::isFirstChannelLocalisationBufferProcessed() +{ + //at least one chanloc buffer must have been received and processed + return (!m_channelLocalisationCoords.empty()) && (!m_channelLocalisationCoords[0].second); +} + +bool CBufferDatabase::adjustNumberOfDisplayedBuffers(const double time) +{ + bool change = false; + + if (time > 0) + { + m_TotalDuration = time; + m_TotalDurationOV = 0; + m_TotalStep = 0; + } + + //return if buffer length is not known yet + if (m_DimSizes[1] == 0) { return false; } + + size_t newN = size_t(ceil((m_TotalDuration * m_Sampling) / m_DimSizes[1])); + + //displays at least one buffer + newN = (newN == 0) ? 1 : newN; + if (newN != m_NBufferToDisplay || time <= 0) + { + m_NBufferToDisplay = newN; + change = true; + + //if new number of buffers decreased, resize lists and destroy useless buffers + while (m_NBufferToDisplay < m_SampleBuffers.size()) + { + delete[] m_SampleBuffers.front(); + m_SampleBuffers.pop_front(); + m_StartTime.pop_front(); + m_EndTime.pop_front(); + + //suppress the corresponding minmax values + for (size_t c = 0; c < m_DimSizes[0]; ++c) { m_LocalMinMaxValue[c].pop_front(); } + } + } + + return change; +} + +void CBufferDatabase::setMatrixDimensionCount(const size_t count) +{ + if (count != 2) + { + m_Error = true; + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error << "Caller tried to set a " << count << + "-dimensional matrix. Only 2-dimensional matrices are supported (e.g. [rows X cols]).\n"; + } + if (count == 1) + { + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error << + "Note: For 1-dimensional matrices, you may try Matrix Transpose box to upgrade the stream to [N X 1] first.\n"; + } +} + +void CBufferDatabase::setMatrixDimensionSize(const size_t index, const size_t size) +{ + if (index >= 2) + { + m_Error = true; + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error << "Tried to access dimension " << index << + ", only 0 and 1 supported\n"; + return; + } + + if (m_DimSizes[index] != 0 && m_DimSizes[index] != size) + { + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error << + "Upstream tried to change the data chunk size after the first header, this is not supported.\n"; + m_Error = true; + return; + } + + m_DimSizes[index] = size; + m_DimLabels[index].resize(size); + + if (index == 0) + { + m_NElectrodes = m_DimSizes[index]; + + //resize min/max values vector + m_LocalMinMaxValue.resize(size_t(m_NElectrodes)); + } +} + +void CBufferDatabase::setMatrixDimensionLabel(const size_t idx1, const size_t idx2, const char* label) +{ + if (m_Error) { return; } + + if (idx1 >= 2) + { + m_Error = true; + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error << "Tried to access dimension " << idx1 << + ", only 0 and 1 supported\n"; + return; + } + + m_DimLabels[idx1][idx2] = label; +} + +bool CBufferDatabase::setMatrixBuffer(const double* buffer, const uint64_t startTime, const uint64_t endTime) +{ + //if an error has occurred, do nothing + if (m_Error) { return false; } + + // Check for time-continuity + if (startTime < m_LastBufferEndTime && !m_WarningPrinted) + { + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Warning << + "Your signal does not appear to be continuous in time. " + << "Previously inserted buffer ended at " << CTime(m_LastBufferEndTime).toSeconds() + << "s, the current starts at " << CTime(startTime).toSeconds() + << "s. The display may be incorrect.\n"; + m_WarningPrinted = true; + } + m_LastBufferEndTime = endTime; + + + //if this the first buffer, perform some precomputations + if (!m_HasFirstBuffer) + { + m_BufferDuration = endTime - startTime; + + //test if it is equal to zero : Error + if (m_BufferDuration == 0) + { + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Warning << + "Error : buffer start time and end time are equal : " << startTime << "\n"; + m_Error = true; + return false; + } + + //computes the sampling frequency for sanity checking or if the setter has not been called + const uint64_t sampleDuration = (uint64_t(1) << 32) * m_DimSizes[1]; + auto estimatedFrequency = size_t(sampleDuration / m_BufferDuration); + if (estimatedFrequency == 0) + { + // Complain if estimate is bad + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Warning << + "The integer sampling frequency was estimated from the chunk size to be 0" + << " (nSamples " << m_DimSizes[1] << " / bufferLength " << CTime(m_BufferDuration).toSeconds() << + "s = 0). This is not supported. Forcing the rate to 1. This may lead to problems.\n"; + estimatedFrequency = 1; + } + if (m_Sampling == 0) + { + // use chunking duration estimate if setter hasn't been used + m_Sampling = estimatedFrequency; + } + if (m_Sampling != estimatedFrequency) + { + m_ParentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Warning + << "Sampling rate [" << estimatedFrequency << "] suggested by chunk properties differs from stream-specified rate [" << m_Sampling + << "]. There may be a problem with an upstream box. Trying to use the estimated rate.\n"; + m_Sampling = estimatedFrequency; + } + + //computes the number of buffer necessary to display the interval + adjustNumberOfDisplayedBuffers(-1); + + m_Drawable->init(); + + m_HasFirstBuffer = true; + } + + if (!m_ChannelLookupTableInitialized) + { + fillChannelLookupTable(); //to retrieve the unrecognized electrode warning + // The above call will fail if no electrode localisation data... + // m_parentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Error << "Unable to fill lookup table\n"; + // return false; + } + else + { + //look for chanloc buffers recently received + for (size_t i = 0; i < m_channelLocalisationCoords.size(); ++i) + { + //if a new set of coordinates was received + if (m_channelLocalisationCoords[i].second) { onChannelLocalisationBufferReceived(i); } + } + } + + double* bufferToWrite = nullptr; + const uint64_t nSamplesPerBuffer = m_DimSizes[0] * m_DimSizes[1]; + + //if old buffers need to be removed + if (m_SampleBuffers.size() == m_NBufferToDisplay) + { + if (m_TotalDurationOV == 0) { m_TotalDurationOV = (m_StartTime.back() - m_StartTime.front()) + (m_EndTime.back() - m_StartTime.back()); } + if (m_BufferStep == 0) + { + if (m_StartTime.size() <= 1) { m_BufferStep = m_TotalDurationOV; } + else { m_BufferStep = m_StartTime[1] - m_StartTime[0]; } + } + if (m_TotalStep == 0) { m_TotalStep = (m_StartTime.back() - m_StartTime.front()) + m_BufferStep; } + + //save first buffer pointer + bufferToWrite = m_SampleBuffers.front(); + + //pop first element from queues + m_SampleBuffers.pop_front(); + m_StartTime.pop_front(); + m_EndTime.pop_front(); + for (uint64_t c = 0; c < m_DimSizes[0]; ++c) { m_LocalMinMaxValue[c].pop_front(); } + } + + //do we need to allocate a new buffer? + if (bufferToWrite == nullptr) { bufferToWrite = new double[size_t(nSamplesPerBuffer)]; } + + //copy new buffer into internal buffer + memcpy(bufferToWrite, buffer, nSamplesPerBuffer * sizeof(double)); + + //push new buffer and its timestamps + m_SampleBuffers.push_back(bufferToWrite); + m_StartTime.push_back(startTime); + m_EndTime.push_back(endTime); + + //compute and push min and max values of new buffer + uint64_t currentSample = 0; + //for each channel + for (uint64_t c = 0; c < m_DimSizes[0]; ++c) + { + double min = DBL_MAX, max = -DBL_MAX; + + //for each sample + for (uint64_t i = 0; i < m_DimSizes[1]; i++, ++currentSample) + { + //get channel local min/max + if (buffer[currentSample] < min) { min = buffer[currentSample]; } + if (buffer[currentSample] > max) { max = buffer[currentSample]; } + } + + //adds the minmax pair to the corresponding channel's list + m_LocalMinMaxValue[c].push_back(std::pair(min, max)); + + if (max > m_MaxValue) { m_MaxValue = max; } + if (min < m_MinValue) { m_MinValue = min; } + } + + //tells the drawable to redraw himself since the signal information has been updated + if (m_RedrawOnNewData) { m_Drawable->redraw(); } + + return true; +} + +bool CBufferDatabase::setSampling(const size_t sampling) +{ + m_Sampling = sampling; + return true; +} + +void CBufferDatabase::getDisplayedChannelLocalMinMaxValue(const size_t channel, double& min, double& max) +{ + min = +DBL_MAX; + max = -DBL_MAX; + + for (auto& pair : m_LocalMinMaxValue[size_t(channel)]) + { + if (min > pair.first) { min = pair.first; } + if (max < pair.second) { max = pair.second; } + } +} + +bool CBufferDatabase::isTimeInDisplayedInterval(const uint64_t& time) const +{ + return !m_StartTime.empty() && time >= m_StartTime.front() && time <= m_EndTime.back(); +} + +bool CBufferDatabase::getIndexOfBufferStartingAtTime(const uint64_t& time, size_t& index) const +{ + index = 0; + + if (m_SampleBuffers.empty() || time < m_StartTime.front() || time > m_StartTime.back()) { return false; } + + for (size_t i = 0; i < m_StartTime.size(); ++i) + { + if (m_StartTime[i] == time) + { + index = i; + return true; + } + } + + return false; +} + +void CBufferDatabase::getDisplayedGlobalMinMaxValue(double& min, double& max) +{ + min = +DBL_MAX; + max = -DBL_MAX; + + for (size_t c = 0; c < m_LocalMinMaxValue.size(); ++c) + { + for (auto& pair : m_LocalMinMaxValue[size_t(c)]) + { + if (min > pair.first) { min = pair.first; } + if (max < pair.second) { max = pair.second; } + } + } +} + +bool CBufferDatabase::getElectrodePosition(const size_t index, double* position) +{ + //TODO : add time parameter and look for coordinates closest to that time! + if (index < m_channelLocalisationLabels.size()) + { + //if(m_cartesianStreamedCoords == true) + //{ + *position = *(m_channelLocalisationCoords[0].first->getBuffer() + 3 * index); + *(position + 1) = *(m_channelLocalisationCoords[0].first->getBuffer() + 3 * index + 1); + *(position + 2) = *(m_channelLocalisationCoords[0].first->getBuffer() + 3 * index + 2); + //} + return true; + } + return false; +} + +bool CBufferDatabase::getElectrodePosition(const CString& label, double* position) +{ + //TODO : add time parameter and look for coordinates closest to that time! + for (size_t i = 0; i < m_channelLocalisationLabels.size(); ++i) + { + if (strcmp(label.toASCIIString(), m_channelLocalisationLabels[i].toASCIIString()) == 0) + { + //if(m_cartesianStreamedCoords == true) + //{ + *position = *(m_channelLocalisationCoords[0].first->getBuffer() + 3 * i); + *(position + 1) = *(m_channelLocalisationCoords[0].first->getBuffer() + 3 * i + 1); + *(position + 2) = *(m_channelLocalisationCoords[0].first->getBuffer() + 3 * i + 2); + //} + return true; + } + } + return false; +} + +bool CBufferDatabase::getElectrodeLabel(const size_t index, CString& label) +{ + if (index >= m_channelLocalisationLabels.size()) { return false; } + label = m_channelLocalisationLabels[index].toASCIIString(); + return true; +} + +bool CBufferDatabase::getChannelPosition(const size_t index, double*& position) +{ + //TODO : add time parameter and look for coordinates closest to that time! + if (index >= 0 && index < m_ChannelLookupIdxs.size()) + { + if (m_cartesianCoords) { position = m_channelLocalisationCoords[0].first->getBuffer() + 3 * m_ChannelLookupIdxs[index]; } + // else { } //TODO + return true; + } + return false; +} + +bool CBufferDatabase::getChannelSphericalCoordinates(const size_t index, double& theta, double& phi) +{ + //TODO : add time parameter and look for coordinates closest to that time! + if (index >= 0 && index < m_ChannelLookupIdxs.size()) + { + if (m_cartesianCoords) + { + //get cartesian coords + double* coords = m_channelLocalisationCoords[0].first->getBuffer() + 3 * m_ChannelLookupIdxs[index]; + + //convert to spherical coords + return convertCartesianToSpherical(coords, theta, phi); + } + // else { return false; } //TODO streamed coordinates are spherical already + return false; + } + return false; +} + +bool CBufferDatabase::getChannelLabel(const size_t index, CString& label) +{ + if (index >= 0 && index < m_ChannelLookupIdxs.size()) + { + label = m_channelLocalisationLabels[m_ChannelLookupIdxs[index]]; + return true; + } + label = ""; + return false; +} + +void CBufferDatabase::setStimulation(const size_t /*index*/, const uint64_t identifier, const uint64_t date) +{ + // m_parentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Trace << "Received new stimulation id:" << stimulationIdentifier << " date:" << stimulationDate << "\n"; + + m_Stimulations.emplace_back(date, identifier); + + if (!m_StartTime.empty()) + { + while (m_Stimulations.begin() != m_Stimulations.end() && m_Stimulations.begin()->first < m_StartTime.front()) { m_Stimulations.pop_front(); } + } +} + +bool CBufferDatabase::fillChannelLookupTable() +{ + if (!m_HasFirstBuffer || !m_channelLocalisationHeaderReceived) { return false; } + + bool res = true; + + //resize lookup array and initialize lookup indices to 0 + m_ChannelLookupIdxs.resize(size_t(m_NElectrodes), 0); + + //for all channels + for (uint64_t i = 0; i < m_DimSizes[0]; ++i) + { + //trim leading spaces + size_t firstNonWhitespaceChar = 0; + for (; firstNonWhitespaceChar < m_DimLabels[0][i].size(); ++firstNonWhitespaceChar) + { + if (!isspace(m_DimLabels[0][i][firstNonWhitespaceChar])) { break; } + } + + //trim trailing spaces + size_t lastNonWhitespaceChar = 0; + if (!m_DimLabels[0][i].empty()) + { + for (lastNonWhitespaceChar = m_DimLabels[0][i].size() - 1; lastNonWhitespaceChar >= 0; lastNonWhitespaceChar--) + { + if (!isspace(m_DimLabels[0][i][lastNonWhitespaceChar])) { break; } + } + } + + //look for label in channel localisation labels database + bool recognized = false; + + if (firstNonWhitespaceChar < lastNonWhitespaceChar) + { + std::string label(m_DimLabels[0][i].substr(firstNonWhitespaceChar, lastNonWhitespaceChar - firstNonWhitespaceChar + 1)); + + for (size_t j = 0; j < m_channelLocalisationLabels.size(); ++j) + { + if (strcmp(label.c_str(), m_channelLocalisationLabels[j].toASCIIString()) == 0) + { + recognized = true; + m_ChannelLookupIdxs[i] = j; + break; + } + } + } + + //unrecognized electrode! + if (!recognized) + { + m_ParentPlugin.getLogManager() << Kernel::LogLevel_Warning << "Unrecognized electrode name (index=" << i << ", name=" << m_DimLabels[0][i].c_str() + << + ")!\n"; + res = false; + } + } + + m_ParentPlugin.getLogManager() << Kernel::LogLevel_Trace << "Electrodes list : "; + + for (uint64_t i = 0; i < m_DimSizes[0]; ++i) + { + m_ParentPlugin.getLogManager() << CString(m_DimLabels[0][i].c_str()); + if (i < m_DimSizes[0] - 1) { m_ParentPlugin.getLogManager() << ", "; } + else { m_ParentPlugin.getLogManager() << "\n"; } + } + + if (res) { m_ChannelLookupTableInitialized = true; } + + return res; +} + +bool CBufferDatabase::convertCartesianToSpherical(const double* cartesian, double& theta, double& phi) const +{ +#define MY_THRESHOLD 1e-3 +#define PI 3.1415926535 + + const double radToDeg = 180 / PI; + + //compute theta + theta = acos(cartesian[2]) * radToDeg; + + //compute phi so that it lies in [0, 360] + if (fabs(cartesian[0]) < MY_THRESHOLD) { phi = (cartesian[1] > 0) ? 90 : 270; } + else + { + phi = atan(cartesian[1] / cartesian[0]) * radToDeg; + if (cartesian[0] < 0) { phi += 180; } + else if (cartesian[1] < 0) { phi += 360; } + } + + return true; +} + +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCBufferDatabase.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCBufferDatabase.h new file mode 100644 index 0000000..7b016f4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCBufferDatabase.h @@ -0,0 +1,367 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include "ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +class CSignalDisplayDrawable; + +/** +* Abtract class of objects than can be updated by a CBufferDatabase +*/ +class CSignalDisplayDrawable +{ +public: + + virtual ~CSignalDisplayDrawable() = default; + virtual void init() = 0; + virtual void redraw() = 0; +}; + +/** +* This class is used to store information about the incoming signal stream. It can request a CSignalDisplayDrawable +* object to redraw himself in case of some changes in its data. +*/ +class CBufferDatabase +{ +public: + //! Number of channels + int64_t m_NElectrodes = 0; + + //! Number of channels and number of samples per buffer + std::array m_DimSizes; + + //! Channel labels, buffer labels + std::array, 2> m_DimLabels; + + //! Flag set to true once first buffer is received + bool m_HasFirstBuffer = false; + + //! Sampling frequency of the incoming stream + size_t m_Sampling = 0; + + //! double-linked list of pointers to the samples buffers of the current time window + std::deque m_SampleBuffers; + + //! stimulations to display. pair values are + std::deque> m_Stimulations; + + //electrode spherical coordinates (in degrees) + //CMatrix m_oElectrodesSphericalCoords; + + //flag set to true once channel lookup indices are determined + bool m_ChannelLookupTableInitialized = false; + + //indices of electrodes in channel localisation database + std::vector m_ChannelLookupIdxs; + + //electrode labels (standardized) + //std::vector m_oElectrodesLabels; + + //! Number of buffer to display at the same time + uint64_t m_NBufferToDisplay = 2; + + //! The global maximum value of the signal (up to now) + double m_MaxValue = -DBL_MAX; + + //! The global minimum value of the signal (up to now) + double m_MinValue = +DBL_MAX; + + //! Double-linked list of the start times of the current buffers + std::deque m_StartTime; + + //! Double-linked list of the end times of the current buffers + std::deque m_EndTime; + + //! Duration to display in seconds + double m_TotalDuration = 0; + + /*! Duration to display in openvibe time units. + Computed once every time the user changes the total duration to display, + when the maximum number of buffers to store are received.*/ + uint64_t m_TotalDurationOV = 0; + + /*! Duration of a single buffer. + Computed once, but not constant when sampling frequency is not a multiple of buffer size!*/ + uint64_t m_BufferDuration = 0; + + /*! Time step separating the start times of m_NBufferToDisplay+1 buffers. + Recomputed once every time the user changes the total duration to display, + but not constant when sampling frequency is not a multiple of buffer size!*/ + uint64_t m_TotalStep = 0; + + /*! Time step separating the start times of 2 consecutive buffers. + Computed once, but not constant when sampling frequency is not a multiple of buffer size!*/ + uint64_t m_BufferStep = 0; + + // When did the last inserted buffer end + uint64_t m_LastBufferEndTime = 0; + // Did we print a warning about noncontinuity? + bool m_WarningPrinted = false; + + //! Pointer to the drawable object to update (if needed) + CSignalDisplayDrawable* m_Drawable = nullptr; + + std::vector>> m_LocalMinMaxValue; + + Toolkit::TBoxAlgorithm& m_ParentPlugin; + + bool m_Error = false; + + //! Redraws the associated SignalDisplayDrawable upon new data reception if true (default) + bool m_RedrawOnNewData = true; + +protected: + /* \name Channel localisation */ + //@{ + //channel localisation decoder + Kernel::IAlgorithmProxy* m_decoder = nullptr; + //flag set to true once channel localisation buffer is received + bool m_channelLocalisationHeaderReceived = false; + //dynamic channel localisation flag (e.g. localisation is constantly updated with MEG) + bool m_dynamicChannelLocalisation = false; + //channel labels database + std::vector m_channelLocalisationLabels; + //flag stating whether streamed coordinates are cartesian (as opposed to spherical) + bool m_cartesianCoords = false; + //! double-linked list of streamed channel coordinates (if cartesian, expressed in normalized space (X right Y front Z up)) + std::deque> m_channelLocalisationCoords; + //! double-linked list of channel coordinates (spherical if streamed coords aere cartesian and vice versa) + //std::deque< std::pair > m_oChannelLocalisationAlternateCoords; + //pointer to double linked list of cartesian coordinates + //std::deque< std::pair > * m_pChannelLocalisationCartesianCoords = nullptr; + //pointer to double linked list of spherical coordinates + //std::deque< std::pair > * m_pChannelLocalisationSphericalCoords = nullptr; + //! double-linked list of start/end times of channel coordinates + std::deque> m_channelLocalisationTimes; + //@} + + //! Redraw mode (shift or scan) + CIdentifier m_displayMode = Scan; + +public: + explicit CBufferDatabase(Toolkit::TBoxAlgorithm& parent); + + virtual ~CBufferDatabase(); + + /** + * \brief Decode a channel localisation memory buffer + * \param buffer Memory buffer to decode + * \param startTime Start time of memory buffer + * \param endTime End time of memory buffer + * \return True if memory buffer could be properly decoded, false otherwise + */ + virtual bool decodeChannelLocalisationMemoryBuffer(const IMemoryBuffer* buffer, uint64_t startTime, uint64_t endTime); + + /** + * \brief Callback called upon channel localisation buffer reception + * \param index Index of newly received channel localisation buffer + * \return True if buffer data was correctly processed, false otherwise + */ + virtual bool onChannelLocalisationBufferReceived(const size_t index); + + /** + * \brief Sets the drawable object to update. + * \param drawable drawable object to update. + */ + virtual void setDrawable(CSignalDisplayDrawable* drawable) { m_Drawable = drawable; } + + /** + * \brief Get error status + * \return Error status. If true, an error occurred. + */ + virtual bool getErrorStatus() { return m_Error; } + + /** + * \brief Determines whether first buffer has been received yet + * \return True if first buffer has been received already, false otherwise + */ + virtual bool hasFirstBuffer() { return m_HasFirstBuffer; } + + /** + * \brief Determines whether first channel localisation buffer has been processed yet + * When this condition is true, channel coordinates may be retrieved using the + * corresponding methods in this class. + * \return True if first chanloc buffer was processed + */ + virtual bool isFirstChannelLocalisationBufferProcessed(); + + /** + * Compute the number of buffers needed to display the signal for a certain time period. + * \param time the time window's width in seconds. + */ + virtual bool adjustNumberOfDisplayedBuffers(double time); + + /** + * \brief Get time interval covered by data held in this object + * \return Time interval in ms + */ + virtual double getDisplayedTimeIntervalWidth() const { return (m_NBufferToDisplay * ((m_DimSizes[1] * 1000.0) / m_Sampling)); } + + /** + * \brief Determine whether time passed in parameter lies in displayed data interval + * \param time Time to test + * \return True if time lies in displayed time interval, false otherwise + */ + virtual bool isTimeInDisplayedInterval(const uint64_t& time) const; + + /** + * \brief Get index of sample buffer which starts at a given time + * \param time[in] Start time of buffer + * \param index[out] Buffer index + * \return True if buffer index could be determined, false otherwise + */ + virtual bool getIndexOfBufferStartingAtTime(const uint64_t& time, size_t& index) const; + + //! Returns the min/max values currently displayed for the given channel + virtual void getDisplayedChannelLocalMinMaxValue(const size_t channel, double& min, double& max); + //! Returns the min/max values currently displayed (all channels taken into account) + virtual void getDisplayedGlobalMinMaxValue(double& min, double& max); + + virtual void getDisplayedChannelLocalMeanValue(const size_t /*channel*/, double& /*mean*/) {} + + //! Returns the min/max values of the last buffer arrived for the given channel + virtual void getLastBufferChannelLocalMinMaxValue(const size_t channel, double& min, double& max) + { + min = m_LocalMinMaxValue[channel].back().first; + max = m_LocalMinMaxValue[channel].back().second; + } + + //! Returns the min/max values of the last buffer arrived (all channels taken into account) + virtual void getLastBufferMinMaxValue(double& min, double& max) + { + min = +DBL_MAX; + max = -DBL_MAX; + + for (auto& pair : m_LocalMinMaxValue) + { + min = (pair.back().first < min) ? pair.back().first : min; + max = (pair.back().second > max) ? pair.back().second : max; + } + } + + /** + * \brief Get number of eletrodes in database + * \return Number of electrodes + */ + virtual size_t getElectrodeCount() { return m_channelLocalisationLabels.size(); } + + /** + * \brief Get electrode normalized position + * \remarks Position expressed in normalized cartesian frame where X is right, Y front, Z up + * \param[in] index Index of electrode in database whose position is to be retrieved + * \param[out] position Pointer to an array of 3 floats where to store coordinates + * \return True if electrode position could be retrieved + */ + virtual bool getElectrodePosition(const size_t index, double* position); + + /** + * \brief Get electrode normalized position + * \remarks Position expressed in normalized cartesian frame where X is right, Y front, Z up + * \param[in] label Label of electrode whose position is to be retrieved + * \param[out] position Pointer to an array of 3 floats where to store coordinates + * \return True if electrode position could be retrieved + */ + virtual bool getElectrodePosition(const CString& label, double* position); + + /** + * \brief Get electrode label + * \param[in] index Index of electrode in database whose label is to be retrieved + * \param[out] label Electrode label + * \return True if electrode label could be retrieved + */ + virtual bool getElectrodeLabel(const size_t index, CString& label); + + /** + * \brief Get number of channels + * \return Number of channels + */ + virtual size_t getChannelCount() const { return m_DimSizes[0]; } + + /** + * \brief Get channel normalized position + * \remarks Position expressed in normalized cartesian frame where X is right, Y front, Z up + * \param[in] index Index of channel whose position is to be retrieved + * \param[out] position Reference on a double pointer + * \return True if channel position could be retrieved (position then points to an array of 3 floats) + */ + virtual bool getChannelPosition(const size_t index, double*& position); + + /** + * \brief Get channel spherical coordinates in degrees + * \param[in] index Index of channel whose coordinates are to be retrieved + * \param[out] theta Reference on a float to be set with theta angle + * \param[out] phi Reference on a float to be set with phi angle + * \return True if channel coordinates could be retrieved + */ + virtual bool getChannelSphericalCoordinates(const size_t index, double& theta, double& phi); + + /** + * \brief Get channel label + * \param[in] index Index of channel whose label is to be retrieved + * \param[out] label Channel label + * \return True if channel label could be retrieved + */ + virtual bool getChannelLabel(const size_t index, CString& label); + + virtual void setMatrixDimensionCount(const size_t count); + virtual void setMatrixDimensionSize(const size_t index, const size_t size); + virtual void setMatrixDimensionLabel(const size_t idx1, const size_t idx2, const char* label); + + // Returns false on failure + virtual bool setMatrixBuffer(const double* buffer, uint64_t startTime, uint64_t endTime); + + // Sets the sampling frequency. If this is not called, the frequency is estimated from the stream chunk properties. + // Mainly used to force a warning if stream-specified rate differs from the chunk-estimated rate. + virtual bool setSampling(const size_t sampling); + + virtual void setStimulationCount(const size_t /*count*/) {} + virtual void setStimulation(const size_t index, uint64_t identifier, uint64_t date); + + /** + * \brief Set display mode + * \remarks Used by signal display and time ruler to determine how they should be updated + * \param mode New display mode + */ + virtual void setDisplayMode(const CIdentifier& mode) { m_displayMode = mode; } + + /** + * \brief Get current display mode + * \return Current display mode + */ + virtual CIdentifier getDisplayMode() { return m_displayMode; } + + /** + * \brief Set flag stating whether to redraw associated SignalDisplayDrawable objet when new data is available + * \param set Value to set flag with + */ + virtual void setRedrawOnNewData(const bool set) { m_RedrawOnNewData = set; } + +protected: + /** + * \brief Initialize table storing indices of electrodes in channel localisation database + * \return True if table could be initialized + */ + virtual bool fillChannelLookupTable(); + + /** + * \brief Convert a cartesian coordinates triplet to spherical coordinates + * \param[in] cartesian Pointer to cartesian coordinates triplet + * \param[out] theta Equivalent theta angle + * \param[out] phi Equivalent phi angle + * \return True if coordinates were successfully converted + */ + bool convertCartesianToSpherical(const double* cartesian, double& theta, double& phi) const; +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCSpectrumDatabase.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCSpectrumDatabase.cpp new file mode 100755 index 0000000..3e2c2ca --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCSpectrumDatabase.cpp @@ -0,0 +1,53 @@ +#include "ovpCSpectrumDatabase.h" + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +bool CSpectrumDatabase::initialize() +{ + if (m_decoder != nullptr) { return false; } + + m_decoder = &m_parentPlugin.getAlgorithmManager().getAlgorithm( + m_parentPlugin.getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumDecoder)); + + m_decoder->initialize(); + + return true; +} + +//double CSpectrumDatabase::getFrequencyBandWidth() +//{ +// if(m_frequencyAbscissa.size() == 0) { return 0; } +// else { return m_oFrequencyBands[0].second - m_oFrequencyBands[0].first; } +//} + +//double CSpectrumDatabase::getFrequencyBandStart(const size_t index) +//{ +// if(m_oFrequencyBands.size() == 0) { return 0; } +// else { return m_oFrequencyBands[index].first; } +//} + +//double CSpectrumDatabase::getFrequencyBandStop(const size_t index) +//{ +// if(index >= m_oFrequencyBands.size()) { return 0; } +// else { return m_oFrequencyBands[index].second; } +//} + +bool CSpectrumDatabase::decodeHeader() +{ + //retrieve spectrum header + Kernel::TParameterHandler frequencyAbscissaMatrix; + frequencyAbscissaMatrix.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_FrequencyAbscissa)); + + //store frequency bands + for (size_t i = 0; i < frequencyAbscissaMatrix->getDimensionSize(0); ++i) { m_frequencyAbscissa.push_back(frequencyAbscissaMatrix->getBuffer()[i]); } + + CStreamedMatrixDatabase::decodeHeader(); + + return true; +} + +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCSpectrumDatabase.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCSpectrumDatabase.h new file mode 100755 index 0000000..1b53bb9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCSpectrumDatabase.h @@ -0,0 +1,74 @@ +#pragma once + +#include "ovpCStreamedMatrixDatabase.h" + +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +/** +* This class is used to store information about the incoming spectrum stream. It can request a IStreamDisplayDrawable +* object to redraw itself upon changes in its data. +*/ +class CSpectrumDatabase final : public CStreamedMatrixDatabase +{ +public: + explicit CSpectrumDatabase(Toolkit::TBoxAlgorithm& parent) : CStreamedMatrixDatabase(parent) { } + ~CSpectrumDatabase() override = default; + + bool initialize() override; + + /** + * \brief Get number of frequency bands + * \return Number of frequency bands + */ + size_t getFrequencyAbscissaCount() const { return m_frequencyAbscissa.size(); } + +protected: + bool decodeHeader() override; + + /** + * \brief Set displayed frequency range + * \param minimumDisplayedFrequency Minimum frequency to display + * \param maximumDisplayedFrequency Maximum frequency to display + */ + //TODO (if min/max computation should be restricted to this range) + /* + void setDisplayedFrequencyRange(double minimumDisplayedFrequency, double maximumDisplayedFrequency);*/ + + /** \name Frequency bands management */ + //@{ + + + /** + * \brief Get width of a frequency band (in Hz) + * \return Frequency band width + */ + // double getFrequencyBandWidth(); + + /** + * \brief Get frequency band start frequency + * \param index Index of frequency band + * \return Frequency band start if it could be retrieved, 0 otherwise + */ + // double getFrequencyBandStart(const size_t index); + + /** + * \brief Get frequency band stop frequency + * \param index Index of frequency band + * \return Frequency band stop if it could be retrieved, 0 otherwise + */ + // double getFrequencyBandStop(const size_t index); + + //@} + +private: + std::vector m_frequencyAbscissa; +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCStreamedMatrixDatabase.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCStreamedMatrixDatabase.cpp new file mode 100644 index 0000000..1eee8f1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCStreamedMatrixDatabase.cpp @@ -0,0 +1,290 @@ +#include "ovpCStreamedMatrixDatabase.h" +#include +#include +#include // For unix system + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +CStreamedMatrixDatabase::~CStreamedMatrixDatabase() +{ + if (m_decoder != nullptr) + { + m_decoder->uninitialize(); + m_parentPlugin.getAlgorithmManager().releaseAlgorithm(*m_decoder); + } + + while (!m_matrices.empty()) + { + delete m_matrices.front(); + m_matrices.pop_front(); + } +} + +bool CStreamedMatrixDatabase::initialize() +{ + if (m_decoder != nullptr) { return false; } + m_decoder = &m_parentPlugin.getAlgorithmManager().getAlgorithm( + m_parentPlugin.getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixDecoder)); + + m_decoder->initialize(); + return true; +} + +bool CStreamedMatrixDatabase::setMaxBufferCount(const size_t count) +{ + //max buffer count computed directly + m_ignoreTimeScale = true; + m_nMaxBuffer = count; + onBufferCountChanged(); + return true; +} + +bool CStreamedMatrixDatabase::setTimeScale(const double timeScale) +{ + if (timeScale <= 0) { return false; } + + //max buffer count computed from time scale + m_ignoreTimeScale = false; + + //update time scale + m_timeScale = timeScale; + + //if step between buffers is not known yet, this method will have to be called again later + if (!m_bufferTimeStepComputed) { return false; } + + //compute maximum number of buffers needed to cover time scale + size_t maxBufferCount = 0; + + if (m_bufferTimeStep > 0) { maxBufferCount = size_t(ceil(double(CTime(m_timeScale).time()) / m_bufferTimeStep)); } + + //display at least one buffer + if (maxBufferCount == 0) { maxBufferCount = 1; } + + //acknowledge maximum buffer count + bool maxBufferCountChanged = false; + if (maxBufferCount != m_nMaxBuffer) + { + m_nMaxBuffer = maxBufferCount; + maxBufferCountChanged = true; + onBufferCountChanged(); + } + + return maxBufferCountChanged; +} + +bool CStreamedMatrixDatabase::onBufferCountChanged() +{ + //if new number of buffers is smaller than before, destroy extra buffers + while (m_matrices.size() > m_nMaxBuffer) + { + delete m_matrices.front(); + m_matrices.pop_front(); + m_startTimes.pop_front(); + m_endTimes.pop_front(); + for (auto& i : m_channelMinMaxValues) { i.pop_front(); } + } + + return true; +} + +bool CStreamedMatrixDatabase::decodeMemoryBuffer(const IMemoryBuffer* buffer, const uint64_t startTime, const uint64_t endTime) +{ + //feed memory buffer to algorithm + m_decoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_InputParameterId_MemoryBufferToDecode)->setReferenceTarget(&buffer); + + //process buffer + m_decoder->process(); + + //has flow header been received? + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedHeader)) + { + decodeHeader(); + //create widgets + m_drawable->init(); + } + + //has a buffer been received? + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedBuffer)) + { + decodeBuffer(startTime, endTime); + //redraw widgets + if (m_redrawOnNewData) { m_drawable->redraw(); } + } + + return true; +} + +bool CStreamedMatrixDatabase::getChannelLabel(const size_t index, CString& label) +{ + if (m_matrixHeader.getDimensionCount() == 0 || m_matrixHeader.getDimensionSize(0) <= index) + { + label = ""; + return false; + } + label = m_matrixHeader.getDimensionLabel(0, index); + return true; +} + +bool CStreamedMatrixDatabase::getChannelMinMaxValues(const size_t index, double& min, double& max) +{ + min = +DBL_MAX; + max = -DBL_MAX; + + if (!m_hasFirstBuffer || index >= getChannelCount()) { return false; } + + for (const auto& values : m_channelMinMaxValues[index]) + { + if (min > values.first) { min = values.first; } + if (max < values.second) { max = values.second; } + } + + return true; +} + +bool CStreamedMatrixDatabase::getGlobalMinMaxValues(double& min, double& max) +{ + min = +DBL_MAX; + max = -DBL_MAX; + + if (!m_hasFirstBuffer) { return false; } + + for (size_t c = 0; c < getChannelCount(); ++c) + { + for (const auto& values : m_channelMinMaxValues[c]) + { + if (min > values.first) { min = values.first; } + if (max < values.second) { max = values.second; } + } + } + + return true; +} + +bool CStreamedMatrixDatabase::getLastBufferChannelMinMaxValues(const size_t index, double& min, double& max) +{ + min = +DBL_MAX; + max = -DBL_MAX; + + if (!m_hasFirstBuffer) { return false; } + + if (index >= getChannelCount()) { return false; } + + min = m_channelMinMaxValues[index].back().first; + max = m_channelMinMaxValues[index].back().second; + return true; +} + +bool CStreamedMatrixDatabase::getLastBufferGlobalMinMaxValues(double& min, double& max) +{ + min = +DBL_MAX; + max = -DBL_MAX; + + if (!m_hasFirstBuffer) { return false; } + + for (const auto& values : m_channelMinMaxValues) + { + if (min > values.back().first) { min = values.back().first; } + if (max < values.back().second) { max = values.back().second; } + } + + return true; +} + +bool CStreamedMatrixDatabase::decodeHeader() +{ + //copy streamed matrix header + Kernel::TParameterHandler streamedMatrix; + streamedMatrix.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + m_matrixHeader.copyDescription(*streamedMatrix); + + m_channelMinMaxValues.resize(getChannelCount()); + + return true; +} + +bool CStreamedMatrixDatabase::decodeBuffer(const uint64_t startTime, const uint64_t endTime) +{ + //first buffer received + if (!m_hasFirstBuffer) + { + const uint64_t bufferDuration = endTime - startTime; + + if (bufferDuration == 0) + { + m_parentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Warning << + "Error : buffer start time and end time are equal : " << startTime << "\n"; + //m_error = true; + return false; + } + + m_hasFirstBuffer = true; + } + + //compute time step between two buffers + if (!m_bufferTimeStepComputed && m_matrices.size() >= 2) + { + m_bufferTimeStep = m_startTimes[1] - m_startTimes[0]; + m_bufferTimeStepComputed = true; + + if (!m_ignoreTimeScale) + { + //compute maximum number of buffers from time scale + setTimeScale(m_timeScale); + } + } + + //store new buffer data + CMatrix* currentMatrix; + if (m_matrices.size() < m_nMaxBuffer) + { + currentMatrix = new CMatrix(); + currentMatrix->copyDescription(m_matrixHeader); + m_matrices.push_back(currentMatrix); + } + else //reuse memory for new buffer + { + //move front matrix to back of list + currentMatrix = m_matrices.front(); + m_matrices.push_back(currentMatrix); + + //remove first matrix data + m_matrices.pop_front(); + m_startTimes.pop_front(); + m_endTimes.pop_front(); + for (size_t c = 0; c < getChannelCount(); ++c) { m_channelMinMaxValues[c].pop_front(); } + } + + //store samples + Kernel::TParameterHandler streamedMatrix; + streamedMatrix.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + currentMatrix->copyContent(*streamedMatrix); + + //store time stamps + m_startTimes.push_back(startTime); + m_endTimes.push_back(endTime); + + //store min/max values + double* buffer = currentMatrix->getBuffer(); + + for (size_t c = 0; c < getChannelCount(); ++c) + { + double min = DBL_MAX; + double max = -DBL_MAX; + + for (uint64_t i = 0; i < getSampleCountPerBuffer(); ++i, ++buffer) + { + if (*buffer < min) { min = *buffer; } + if (*buffer > max) { max = *buffer; } + } + + m_channelMinMaxValues[c].push_back(std::pair(min, max)); + } + + return true; +} + +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCStreamedMatrixDatabase.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCStreamedMatrixDatabase.h new file mode 100644 index 0000000..fc9b46d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCStreamedMatrixDatabase.h @@ -0,0 +1,101 @@ +#pragma once +#include "ovpIStreamDatabase.h" +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +/** +* This class is used to store information about the incoming matrix stream. It can request a IStreamDisplayDrawable +* object to redraw itself upon changes in its data. +*/ +class CStreamedMatrixDatabase : public IStreamDatabase +{ +public: + /** + * \brief Constructor + * \param + */ + explicit CStreamedMatrixDatabase(Toolkit::TBoxAlgorithm& parent) : m_parentPlugin(parent) {} + + /** + * \brief Destructor + */ + ~CStreamedMatrixDatabase() override; + + bool initialize() override; + + void setDrawable(IStreamDisplayDrawable* drawable) override { m_drawable = drawable; } + void setRedrawOnNewData(const bool redrawOnNewData) override { m_redrawOnNewData = redrawOnNewData; } + + bool hasFirstBuffer() override { return m_hasFirstBuffer; } + bool setMaxBufferCount(const size_t count) override; + bool setTimeScale(const double timeScale) override; + bool decodeMemoryBuffer(const IMemoryBuffer* buffer, const uint64_t startTime, const uint64_t endTime) override; + + size_t getMaxBufferCount() override { return m_nMaxBuffer; } + size_t getCurrentBufferCount() override { return m_matrices.size(); } + + const double* getBuffer(const size_t index) override { return (index >= m_matrices.size()) ? nullptr : m_matrices[index]->getBuffer(); } + + uint64_t getStartTime(const size_t index) override { return (index >= m_startTimes.size()) ? 0 : m_startTimes[index]; } + uint64_t getEndTime(const size_t index) override { return (index >= m_endTimes.size()) ? 0 : m_endTimes[index]; } + + size_t getBufferElementCount() override { return (m_matrices.empty()) ? 0 : m_matrices[0]->getBufferElementCount(); } + uint64_t getBufferDuration() override { return (m_startTimes.empty() || m_endTimes.empty()) ? 0 : m_endTimes[0] - m_startTimes[0]; } + bool isBufferTimeStepComputed() override { return m_bufferTimeStepComputed; } + uint64_t getBufferTimeStep() override { return m_bufferTimeStepComputed ? m_bufferTimeStep : 0; } + + size_t getSampleCountPerBuffer() override { return m_matrixHeader.getDimensionCount() == 0 ? 0 : m_matrixHeader.getDimensionSize(1); } + size_t getChannelCount() override { return (m_matrixHeader.getDimensionCount() == 0) ? 0 : m_matrixHeader.getDimensionSize(0); } + + bool getChannelLabel(const size_t index, CString& label) override; + bool getChannelMinMaxValues(const size_t index, double& min, double& max) override; + bool getGlobalMinMaxValues(double& min, double& max) override; + bool getLastBufferChannelMinMaxValues(const size_t index, double& min, double& max) override; + bool getLastBufferGlobalMinMaxValues(double& min, double& max) override; + +protected: + bool onBufferCountChanged(); + + virtual bool decodeHeader(); + virtual bool decodeBuffer(const uint64_t startTime, const uint64_t endTime); + + // parent plugin + Toolkit::TBoxAlgorithm& m_parentPlugin; + //decoder algorithm + Kernel::IAlgorithmProxy* m_decoder = nullptr; + //drawable object to update (if needed) + IStreamDisplayDrawable* m_drawable = nullptr; + //flag stating whether to redraw the IStreamDisplayDrawable upon new data reception if true (default) + bool m_redrawOnNewData = true; + //flag stating whether first samples buffer has been received + bool m_hasFirstBuffer = false; + //flag stating whether buffer time step was computed + bool m_bufferTimeStepComputed = false; + //time difference between start times of two consecutive buffers + uint64_t m_bufferTimeStep = 0; + //maximum number of buffers stored in database + size_t m_nMaxBuffer = 2; + //flag stating whether time scale should be ignored (max buffer count externally set) + bool m_ignoreTimeScale = false; + //maximum duration of displayed buffers (in seconds) + double m_timeScale = 10; + //double-linked list of start times of stored buffers + std::deque m_startTimes; + //double-linked list of end times of stored buffers + std::deque m_endTimes; + //streamed matrix header + CMatrix m_matrixHeader; + //streamed matrix history + std::deque m_matrices; + //min/max values for each channel + std::vector>> m_channelMinMaxValues; +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCTimeRuler.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCTimeRuler.cpp new file mode 100644 index 0000000..9cac480 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCTimeRuler.cpp @@ -0,0 +1,117 @@ +#include "ovpCTimeRuler.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + + +#define CONVERT_TIME(i) (double((i)>>32) + double(double((i)&0xFFFFFFFF) / double((uint64_t)1<<32))) + +//CALLBACKS +//! Callback to redraw the bottom ruler +gboolean TimeRulerExposeEventCB(GtkWidget* /*widget*/, GdkEventExpose* /*event*/, gpointer data) +{ + //redraw the ruler + auto* timeRuler = reinterpret_cast(data); + timeRuler->draw(); + + //don't propagate this signal to the children if any + return TRUE; +} + +//! Called when the widget whose width is associated with the ruler is resized. +gboolean TimeRulerResizeCB(GtkWidget* /*widget*/, GtkAllocation* allocation, gpointer data) +{ + auto* timeRuler = reinterpret_cast(data); + timeRuler->onResizeEventCB(allocation->width, allocation->height); + return FALSE; +} + +CTimeRuler::CTimeRuler(IStreamDatabase& streamDatabase, const int width, const int height) + : m_stream(streamDatabase), m_height(height) +{ + m_widget = gtk_drawing_area_new(); + gtk_widget_set_size_request(m_widget, width, height); + g_signal_connect_after(G_OBJECT(m_widget), "expose_event", G_CALLBACK(TimeRulerExposeEventCB), this); +} + +void CTimeRuler::draw() +{ + //if the widget is invisible, no need to redraw it + if (!GTK_WIDGET_VISIBLE(m_widget)) { return; } + + //return if time between two consecutive buffers hasn't been computed yet + if (!m_stream.isBufferTimeStepComputed()) { return; } + + //get widget size + gint bottomRulerW; + gdk_drawable_get_size(m_widget->window, &bottomRulerW, nullptr); + + const double startTime = CONVERT_TIME(m_stream.getStartTime(0)); + const double endTime = CONVERT_TIME(m_stream.getStartTime(0) + m_stream.getMaxBufferCount() * m_stream.getBufferTimeStep()); + const double intervalW = endTime - startTime; + + //compute step between two values displayed on the ruler + const auto nearestSmallerPowerOf10 = double(pow(10, floor(log10(intervalW)))); + + const auto maxNLabels = uint64_t(bottomRulerW / m_pixelsPerLabel); + + double valueStep = nearestSmallerPowerOf10; + if (uint64_t(floor(intervalW / nearestSmallerPowerOf10)) > maxNLabels) { valueStep = 2 * nearestSmallerPowerOf10; } + else if (uint64_t(floor(intervalW / nearestSmallerPowerOf10)) < maxNLabels / 2) { valueStep = nearestSmallerPowerOf10 / 2; } + + //recompute step base value + const double baseValue = valueStep * floor(startTime / valueStep); + + //X position of the first label + const double bufferW = double(bottomRulerW) / double(m_stream.getMaxBufferCount()); + auto baseX = int64_t(floor(bottomRulerW - (m_stream.getCurrentBufferCount() * bufferW))); + if (baseX < 0) { baseX = 0; } + + //draw ruler base (horizontal line) + gdk_draw_line(m_widget->window, m_widget->style->fg_gc[GTK_WIDGET_STATE(m_widget)], gint(baseX), 0, bottomRulerW, 0); + + //draw labels + std::stringstream timeLabel; + for (double i = baseValue; i < double(0.5 + endTime); i += valueStep) + { + //clear stringstream + timeLabel.str(""); + + //compute label position + const gint textX = gint(baseX + ((i - startTime) * ((double(bottomRulerW)) / intervalW))); + + if (textX >= bottomRulerW) { break; } + + timeLabel << i; + + PangoLayout* text = gtk_widget_create_pango_layout(m_widget, timeLabel.str().c_str()); + + int textW; + pango_layout_get_pixel_size(text, &textW, nullptr); + + //if the width allocated per label becomes too small compared to the effective width of the label + if (uint64_t(textW) >= m_pixelsPerLabel - 20) + { + //increases the allocated width per label + m_pixelsPerLabel = textW + 30; + } + + //display it + gdk_draw_layout(m_widget->window, m_widget->style->fg_gc[GTK_WIDGET_STATE(m_widget)], textX, 4, text); + + //draw a small line above it + gdk_draw_line(m_widget->window, m_widget->style->fg_gc[GTK_WIDGET_STATE(m_widget)], textX, 0, textX, 3); + } +} + +void CTimeRuler::linkWidthToWidget(GtkWidget* widget) +{ + //add a callback to the widget for the size-allocate signal + g_signal_connect(G_OBJECT(widget), "size-allocate", G_CALLBACK(TimeRulerResizeCB), this); +} +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCTimeRuler.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCTimeRuler.h new file mode 100644 index 0000000..4e86b7d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpCTimeRuler.h @@ -0,0 +1,72 @@ +#pragma once + +#include "ovpIStreamDatabase.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +/** + * Displays a time ruler. + * Uses information fetched from a stream database object. + */ +class CTimeRuler +{ +public: + /** + * \brief Constructor + * \param streamDatabase Object from which data is retrieved + * \param width Width to be requested by widget + * \param height Height to be requested by widget + */ + CTimeRuler(IStreamDatabase& streamDatabase, int width, int height); + + /** + * \brief Destructor + */ + ~CTimeRuler() = default; + + /** + * \brief Get widget handled by this object + * \return Gtk widget + */ + GtkWidget* getWidget() const { return m_widget; } + + /** + * \brief Toggle ruler on/off + * \param active Activation flag + */ + void toggle(const bool active) const { active ? gtk_widget_show(m_widget) : gtk_widget_hide(m_widget); } + + /** + * \brief Draw ruler + */ + void draw(); + + /** + * \brief Link ruler width to another widget's + * \param widget Widget whose width must be matched by this object + */ + void linkWidthToWidget(GtkWidget* widget); + + /** + * \brief Callback notified upon resize events + * \param width New window width + * \remarks height is the m_heightRequest + */ + void onResizeEventCB(const gint width, gint /*height*/) const { gtk_widget_set_size_request(m_widget, width, m_height); } + +private: + //! Ruler widget + GtkWidget* m_widget = nullptr; + //! Database from which stream information is retrieved + IStreamDatabase& m_stream; + //! Height request + int m_height = 0; + //! Size available per label along the ruler + uint64_t m_pixelsPerLabel = 20; +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpIStreamDatabase.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpIStreamDatabase.h new file mode 100644 index 0000000..1b0e77e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovpIStreamDatabase.h @@ -0,0 +1,196 @@ +#pragma once + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { +class IStreamDisplayDrawable; + +/** + * \brief Abstract class of objects than can be updated by an IStreamDatabase object + */ +class IStreamDisplayDrawable +{ +public: + virtual bool init() = 0; + virtual bool redraw() = 0; + virtual ~IStreamDisplayDrawable() = default; +}; + +class IStreamDatabase +{ +public: + virtual ~IStreamDatabase() = default; + + /** + * \brief Initialize the database, including creating decoder + * \return True if initialization succeeded + */ + virtual bool initialize() = 0; + + /** + * \brief Set drawable object to update. + * \param drawable drawable object to update. + */ + virtual void setDrawable(IStreamDisplayDrawable* drawable) = 0; + + /** + * \brief Set flag stating whether or not to redraw upon new data reception + * \param redrawOnNewData Redraw flag + */ + virtual void setRedrawOnNewData(const bool redrawOnNewData) = 0; + + /** + * \brief Determine whether first buffer has been received yet + * \return True if first buffer has been received already, false otherwise + */ + virtual bool hasFirstBuffer() = 0; + + /** + * \brief Set max buffer count + * Set max buffer count directly (as opposed to computing it from time scale) + * \remarks This method sets m_ignoreTimeScale to true + */ + virtual bool setMaxBufferCount(const size_t count) = 0; + + /** + * \brief Set time scale + * Computes the maximum number of buffers that can be displayed simultaneously + * \remarks This method sets m_ignoreTimeScale to false + * \param timeScale Time window's width in seconds. + * \return True if buffer count changed, false otherwise + */ + virtual bool setTimeScale(const double timeScale) = 0; + + /** + * \brief Decode a memory buffer using proxy + * \param buffer Memory buffer to decode + * \param startTime Start time of memory buffer + * \param endTime End time of memory buffer + * \return True if memory buffer could be properly decoded, false otherwise + */ + virtual bool decodeMemoryBuffer(const IMemoryBuffer* buffer, const uint64_t startTime, const uint64_t endTime) = 0; + + /** + * \brief Get number of buffers necessary to cover time scale + * \remarks Can't be computed before 2 buffers have been received, because + * the time step between the start of 2 consecutive buffers must be known + * \return Maximum number of buffers stored in this object + */ + virtual size_t getMaxBufferCount() = 0; + + /** + * \brief Get current buffer count + * \return Current buffer count + */ + virtual size_t getCurrentBufferCount() = 0; + + /** + * \brief Get pointer on a given buffer + * \param index Index of buffer to retrieve + * \return Buffer pointer if buffer exists, nullptr otherwise + */ + virtual const double* getBuffer(const size_t index) = 0; + + /** + * \brief Get start time of a given buffer + * \param index Index of buffer whose start time is to be retrieved + * \return Start time if buffer exists, 0 otherwise + */ + virtual uint64_t getStartTime(const size_t index) = 0; + + /** + * \brief Get end time of a given buffer + * \param index Index of buffer whose end time is to be retrieved + * \return End time if buffer exists, 0 otherwise + */ + virtual uint64_t getEndTime(const size_t index) = 0; + + /** + * \brief Get number of elements contained in a buffer + * \return Buffer element count or 0 if no buffer has been received yet + */ + virtual size_t getBufferElementCount() = 0; + + /** + * \brief Get time span covered by a buffer + * \return Buffer time span + */ + virtual uint64_t getBufferDuration() = 0; + + /** + * \brief Determine whether buffer time step has been computed yet + * \return True if buffer time step has been computed + */ + virtual bool isBufferTimeStepComputed() = 0; + + /** + * \brief Get time step between the start of 2 consecutive buffers + * \remarks This value can't be computed before the first 2 buffers are received + * \return Buffer time step + */ + virtual uint64_t getBufferTimeStep() = 0; + + /** + * \brief Get number of samples per buffer + * \return Number of samples per buffer + */ + virtual size_t getSampleCountPerBuffer() = 0; + + /** + * \brief Get number of channels + * \return Number of channels + */ + virtual size_t getChannelCount() = 0; + + /** + * \brief Get channel label + * \param[in] index index of channel + * \param[out] label channel label + * \return true if channel label could be retrieved, false otherwise + */ + virtual bool getChannelLabel(const size_t index, CString& label) = 0; + + /** \name Min/max values retrieval */ + //@{ + + /** + * \brief Compute min/max values currently displayed for a given channel + * \param [in] index Index of channel + * \param [out] min Minimum displayed value for channel of interest + * \param [out] max Maximum displayed value for channel of interest + * \return True if values could be computed, false otherwise + */ + virtual bool getChannelMinMaxValues(const size_t index, double& min, double& max) = 0; + + /** + * \brief Compute min/max values currently displayed, taking all channels into account + * \param [out] min Minimum displayed value + * \param [out] max Maximum displayed value + * \return True if values could be computed, false otherwise + */ + virtual bool getGlobalMinMaxValues(double& min, double& max) = 0; + + /** + * \brief Compute min/max values in last buffer for a given channel + * \param [in] index Index of channel + * \param [out] min Minimum value for channel of interest + * \param [out] max Maximum value for channel of interest + * \return True if values could be computed, false otherwise + */ + virtual bool getLastBufferChannelMinMaxValues(const size_t index, double& min, double& max) = 0; + + /** + * \brief Compute min/max values in last buffer, taking all channels into account + * \param [out] min Minimum value + * \param [out] max Maximum value + * \return True if values could be computed, false otherwise + */ + virtual bool getLastBufferGlobalMinMaxValues(double& min, double& max) = 0; + + //@} +}; +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovp_defines.h new file mode 100755 index 0000000..fe39826 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovp_defines.h @@ -0,0 +1,103 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_SignalDisplay OpenViBE::CIdentifier(0x0055BE5F, 0x087BDD12) +#define OVP_ClassId_SignalDisplayDesc OpenViBE::CIdentifier(0x00C4F2D5, 0x58810276) +#define OVP_ClassId_DisplayCueImage OpenViBE::CIdentifier(0x005789A4, 0x3AB78A36) +#define OVP_ClassId_DisplayCueImageDesc OpenViBE::CIdentifier(0x086185A4, 0x796A854C) +#define OVP_ClassId_GrazVisualization OpenViBE::CIdentifier(0x00DD290D, 0x5F142820) +#define OVP_ClassId_GrazVisualizationDesc OpenViBE::CIdentifier(0x00F1955D, 0x38813A6A) +#define OVP_ClassId_GeneralizedGrazVisualization OpenViBE::CIdentifier(0xf0d1b4b9, 0xb420c213) +#define OVP_ClassId_GeneralizedGrazVisualizationDesc OpenViBE::CIdentifier(0x0d414c51, 0xb0ed32f2) +#define OVP_ClassId_PowerSpectrumDisplay OpenViBE::CIdentifier(0x004C0EA4, 0x713EC6D9) +#define OVP_ClassId_PowerSpectrumDisplayDesc OpenViBE::CIdentifier(0x00116B40, 0x69E1B00D) +#define OVP_ClassId_TopographicMap2DDisplay OpenViBE::CIdentifier(0x0B104632, 0x451C265F) +#define OVP_ClassId_TopographicMap2DDisplayDesc OpenViBE::CIdentifier(0x7154037A, 0x4BC52A9F) +#define OVP_ClassId_Simple3DDisplay OpenViBE::CIdentifier(0x31A00483, 0x35924E6B) +#define OVP_ClassId_Simple3DDisplayDesc OpenViBE::CIdentifier(0x443E145F, 0x77205DA0) +#define OVP_ClassId_TopographicMap3DDisplay OpenViBE::CIdentifier(0x36F95BE4, 0x0EF06290) +#define OVP_ClassId_TopographicMap3DDisplayDesc OpenViBE::CIdentifier(0x6AD52C48, 0x6E1C1746) +#define OVP_ClassId_VoxelDisplay OpenViBE::CIdentifier(0x76E42EA2, 0x66FB5265) +#define OVP_ClassId_VoxelDisplayDesc OpenViBE::CIdentifier(0x79321659, 0x642D3D0C) +#define OVP_ClassId_TimeFrequencyMapDisplay OpenViBE::CIdentifier(0x3AE63330, 0x76532117) +#define OVP_ClassId_TimeFrequencyMapDisplayDesc OpenViBE::CIdentifier(0x1BAE74F3, 0x20FB7C89) +#define OVP_ClassId_BoxAlgorithm_P300SpellerVisualization OpenViBE::CIdentifier(0x195E41D6, 0x6E684D47) +#define OVP_ClassId_BoxAlgorithm_P300SpellerVisualizationDesc OpenViBE::CIdentifier(0x31DE2B0D, 0x028202E7) +#define OVP_ClassId_BoxAlgorithm_P300IdentifierCardVisualization OpenViBE::CIdentifier(0x3AF7FF20, 0xA68745DB) +#define OVP_ClassId_BoxAlgorithm_P300IdentifierCardVisualizationDesc OpenViBE::CIdentifier(0x84F146EF, 0x4AA712A4) +#define OVP_ClassId_BoxAlgorithm_P300MagicCardVisualization OpenViBE::CIdentifier(0x841F46EF, 0x471AA2A4) +#define OVP_ClassId_BoxAlgorithm_P300MagicCardVisualizationDesc OpenViBE::CIdentifier(0x37FAFF20, 0xA74685DB) +#define OVP_ClassId_BoxAlgorithm_ErpPlot OpenViBE::CIdentifier(0x10DC6917, 0x2B29B2A0) +#define OVP_ClassId_BoxAlgorithm_ErpPlotDesc OpenViBE::CIdentifier(0x10DC6917, 0x2B29B2A0) +#define OVP_ClassId_BoxAlgorithm_LevelMeasure OpenViBE::CIdentifier(0x657138E4, 0x46D6586F) +#define OVP_ClassId_BoxAlgorithm_LevelMeasureDesc OpenViBE::CIdentifier(0x4D061428, 0x11B02233) +#define OVP_ClassId_Algorithm_LevelMeasure OpenViBE::CIdentifier(0x63C71764, 0x34A9717F) +#define OVP_ClassId_Algorithm_LevelMeasureDesc OpenViBE::CIdentifier(0x3EB6754F, 0x22FB1722) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) + +#define OVP_TypeId_SphericalLinearInterpolationType OpenViBE::CIdentifier(0x44B76D9E, 0x618229BC) +#define OVP_TypeId_SignalDisplayMode OpenViBE::CIdentifier(0x5DE046A6, 0x086340AA) +#define OVP_TypeId_SignalDisplayScaling OpenViBE::CIdentifier(0x33A30739, 0x00D5299B) +#define OVP_TypeId_FeedbackMode OpenViBE::CIdentifier(0x5261636B, 0x464d4f44) + +enum EInterpolationType { Spline = 1, Laplacian = 2 }; + +enum ESignalDisplayMode { Scroll, Scan }; + +enum ESignalDisplayScaling { PerChannel, Global, None }; // Note: the code relies on the following indexing starting from 0 + +enum EFeedbackMode { Positive, Best, All, No }; + +#define OVP_Algorithm_LevelMeasure_InputParameterId_Matrix OpenViBE::CIdentifier(0x59430053, 0x67C23A83) +#define OVP_Algorithm_LevelMeasure_OutputParameterId_MainWidget OpenViBE::CIdentifier(0x101C4641, 0x466C71E3) +#define OVP_Algorithm_LevelMeasure_OutputParameterId_ToolbarWidget OpenViBE::CIdentifier(0x14905FFC, 0x6FE425B2) +#define OVP_Algorithm_LevelMeasure_InputTriggerId_Reset OpenViBE::CIdentifier(0x3EAF36C5, 0x74490C56) +#define OVP_Algorithm_LevelMeasure_InputTriggerId_Refresh OpenViBE::CIdentifier(0x71356FE4, 0x3E8F62DC) +#define OVP_Algorithm_LevelMeasure_OutputTriggerId_Refreshed OpenViBE::CIdentifier(0x3C3C1B06, 0x360305D9) + +#define OVP_ClassId_Algorithm_SphericalSplineInterpolation OpenViBE::CIdentifier(0x4F112803, 0x661D4029) +#define OVP_ClassId_Algorithm_SphericalSplineInterpolationDesc OpenViBE::CIdentifier(0x00D67A20, 0x3D3D4729) + +#define OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_SplineOrder OpenViBE::CIdentifier(0x3B8200F6, 0x205162C7) +#define OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsCount OpenViBE::CIdentifier(0x2ABF11FC, 0x174A2CFE) +#define OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsCoordinates OpenViBE::CIdentifier(0x36F743FE, 0x37897AB9) +#define OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_ControlPointsValues OpenViBE::CIdentifier(0x4EA55599, 0x670274A7) +#define OVP_Algorithm_SphericalSplineInterpolation_InputParameterId_SamplePointsCoordinates OpenViBE::CIdentifier(0x280A531D, 0x339C18AA) +#define OVP_Algorithm_SphericalSplineInterpolation_OutputParameterId_SamplePointsValues OpenViBE::CIdentifier(0x12D0319C, 0x51ED4D8B) +#define OVP_Algorithm_SphericalSplineInterpolation_OutputParameterId_MinSamplePointValue OpenViBE::CIdentifier(0x0CEE2041, 0x79455EED) +#define OVP_Algorithm_SphericalSplineInterpolation_OutputParameterId_MaxSamplePointValue OpenViBE::CIdentifier(0x1ECB03E3, 0x40EF757F) +#define OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_PrecomputeTables OpenViBE::CIdentifier(0x42A650DA, 0x62B35F76) +#define OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_ComputeSplineCoefs OpenViBE::CIdentifier(0x5B353712, 0x069F3D3B) +#define OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_ComputeLaplacianCoefs OpenViBE::CIdentifier(0x7D8C545E, 0x7C086660) +#define OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_InterpolateSpline OpenViBE::CIdentifier(0x1241610E, 0x03CB1AD9) +#define OVP_Algorithm_SphericalSplineInterpolation_InputTriggerId_InterpolateLaplacian OpenViBE::CIdentifier(0x11CE0AC3, 0x0FD85469) +#define OVP_Algorithm_SphericalSplineInterpolation_OutputTriggerId_Error OpenViBE::CIdentifier(0x08CB0679, 0x3A6F3C3A) + + +// Some enumerations +//--------------------------------------------------------------------------------------------------- +enum EDisplayMode { ZoomIn, ZoomOut, GlobalBestFit }; + +namespace OpenViBE { +namespace Kernel { +/** +* \brief Standard 3D objects +*/ +enum EStandard3DObject +{ + Standard3DObject_Invalid = -1, + Standard3DObject_Sphere, + Standard3DObject_Cone, + Standard3DObject_Cube, + Standard3DObject_Quad +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovp_main.cpp new file mode 100755 index 0000000..79af9a9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/ovp_main.cpp @@ -0,0 +1,63 @@ +#include "ovp_defines.h" +#include "algorithms/ovpCAlgorithmLevelMeasure.h" + +//Presentation +#include "box-algorithms/ovpCBoxAlgorithmP300IdentifierCardVisualization.h" +#include "box-algorithms/ovpCBoxAlgorithmP300MagicCardVisualization.h" +#include "box-algorithms/ovpCBoxAlgorithmP300SpellerVisualization.h" +#include "box-algorithms/ovpCDisplayCueImage.h" +#include "box-algorithms/ovpCGrazMultiVisualization.h" +#include "box-algorithms/ovpCGrazVisualization.h" + +//2D plugins +#include "box-algorithms/ovpCBoxAlgorithmErpPlot.h" +#include "box-algorithms/ovpCBoxAlgorithmLevelMeasure.h" +#include "box-algorithms/ovpCSignalDisplay.h" + +namespace OpenViBE { +namespace Plugins { +namespace SimpleVisualization { + +OVP_Declare_Begin() + context.getTypeManager().registerEnumerationEntry(OV_TypeId_BoxAlgorithmFlag, OV_AttributeId_Box_FlagIsUnstable.toString(), + OV_AttributeId_Box_FlagIsUnstable.id()); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_SphericalLinearInterpolationType, "Spherical linear interpolation type"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SphericalLinearInterpolationType, "Spline (potentials)", Spline); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SphericalLinearInterpolationType, "Spline laplacian (currents)", Laplacian); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_SignalDisplayMode, "Signal display mode"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SignalDisplayMode, "Scroll", Scroll); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SignalDisplayMode, "Scan", Scan); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_SignalDisplayScaling, "Signal display scaling"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SignalDisplayScaling, CSignalDisplayView::SCALING_MODES[PerChannel].c_str(), PerChannel); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SignalDisplayScaling, CSignalDisplayView::SCALING_MODES[Global].c_str(), Global); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SignalDisplayScaling, CSignalDisplayView::SCALING_MODES[None].c_str(), None); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_FeedbackMode, "Feedback display mode"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FeedbackMode, "Positive Only", Positive); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FeedbackMode, "Best Only", Best); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FeedbackMode, "All", All); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FeedbackMode, "None", No); + + + OVP_Declare_New(CDisplayCueImageDesc) + OVP_Declare_New(CSignalDisplayDesc) + OVP_Declare_New(CAlgorithmLevelMeasureDesc) + + OVP_Declare_New(CGrazVisualizationDesc) + OVP_Declare_New(CGrazMultiVisualizationDesc) + + OVP_Declare_New(CBoxAlgorithmP300SpellerVisualizationDesc) + OVP_Declare_New(CBoxAlgorithmP300IdentifierCardVisualizationDesc) + OVP_Declare_New(CBoxAlgorithmP300MagicCardVisualizationDesc) + + OVP_Declare_New(CBoxAlgorithmLevelMeasureDesc) + OVP_Declare_New(CBoxAlgorithmErpPlotDesc) + +OVP_Declare_End() + +} // namespace SimpleVisualization +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/utils.h b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/utils.h new file mode 100644 index 0000000..b24a234 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/src/utils.h @@ -0,0 +1,50 @@ +#pragma once + +#include +#include +#include + +//--------------------------------------------------------------------------------------------------- +/// Initializes the color of the GDK. with old compiler as vs2013 we can't initialize structure easily..... +/// For allocated colors, the pixel value used to draw this color on the screen.Not used anymore. +/// The red component of the color. This is a value between 0 and 65535, with 65535 indicating full intensity. +/// The green component of the color. +/// The blue component of the color. +/// The initialized color ( +inline GdkColor InitGDKColor(const guint32 pixel = 0, const guint16 r = 0, const guint16 g = 0, const guint16 b = 0) +{ + GdkColor c; + c.pixel = pixel; + c.red = r; + c.green = g; + c.blue = b; + return c; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +class CGdkcolorAutoCast +{ +public: + CGdkcolorAutoCast(const OpenViBE::Kernel::IBox& box, OpenViBE::Kernel::IConfigurationManager& configManager, const size_t index) + : m_configManager(configManager) + { + box.getSettingValue(index, m_settingValue); + m_settingValue = m_configManager.expand(m_settingValue); + } + + operator GdkColor() const + { + std::stringstream ss(m_settingValue.toASCIIString()); + int r = 0, g = 0, b = 0; + char c; + ss >> r >> c >> g >> c >> b; + return InitGDKColor(0, guint16(r * 655.35), guint16(g * 655.35), guint16(b * 655.35)); + } + +protected: + OpenViBE::Kernel::IConfigurationManager& m_configManager; + OpenViBE::CString m_settingValue; +}; + +//--------------------------------------------------------------------------------------------------- diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/DartTestfile.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/DartTestfile.txt new file mode 100644 index 0000000..8982293 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/DartTestfile.txt @@ -0,0 +1,17 @@ + +### Do not enable the commented out sikuli tests unless you +### or your lab commits to keep them passing in the long term. + +# The results of this particular test have been somewhat random in CI. +# Do not enable unless you've tracked the reason and fixed the situation. + +#FIND_PROGRAM(SIKULI NAMES sikuli-ide) +#IF(SIKULI) +# IF(UNIX) +# ADD_TEST(sikuli_ogre_context "${SIKULI}" -t testOgreContext.UNIX.sikuli) +# ENDIF(UNIX) +#ENDIF(SIKULI) + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.UNIX.sikuli/Simple3Dview.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.UNIX.sikuli/Simple3Dview.png new file mode 100644 index 0000000..b859170 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.UNIX.sikuli/Simple3Dview.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.UNIX.sikuli/designerScreen.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.UNIX.sikuli/designerScreen.png new file mode 100644 index 0000000..4cd4dbd Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.UNIX.sikuli/designerScreen.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.UNIX.sikuli/play.png b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.UNIX.sikuli/play.png new file mode 100644 index 0000000..b66ab51 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.UNIX.sikuli/play.png differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.UNIX.sikuli/testOgreContext.UNIX.html b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.UNIX.sikuli/testOgreContext.UNIX.html new file mode 100644 index 0000000..75d7a5e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.UNIX.sikuli/testOgreContext.UNIX.html @@ -0,0 +1,94 @@ + + + + + + +
+

testOgreContext.UNIX.sikuli

(Download this script) +
+
+def setUp(self):
+    import os
+    ov_binany_path=os.environ['OV_BINARY_PATH']
+    self.terminal = App.open("xterm -e " + ov_binany_path +"/openvibe-designer.sh --no-session-management --open testOgreContext.xml")
+    while not self.terminal.window():
+        wait(1)
+    wait(,10)
+def testRunOgreVisual(self):
+    click()
+    mouseMove(Location(0,0))
+
+    wait(,10)
+    waitVanish(,10)
+    assert(exists())
+def tearDown(self):
+    mouseMove(Location(0,0))
+    if self.terminal.window():
+        App.close(self.terminal)
+        self.terminal= None
+
+ + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.UNIX.sikuli/testOgreContext.UNIX.py b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.UNIX.sikuli/testOgreContext.UNIX.py new file mode 100644 index 0000000..896e0ec --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.UNIX.sikuli/testOgreContext.UNIX.py @@ -0,0 +1,20 @@ +def setUp(self): + import os + ov_binany_path=os.environ['OV_BINARY_PATH'] + self.terminal = App.open("xterm -e " + ov_binany_path +"/openvibe-designer.sh --no-session-management --open testOgreContext.xml") + while not self.terminal.window(): + wait(1) + wait("designerScreen.png",10) +def testRunOgreVisual(self): + click("play.png") + mouseMove(Location(0,0)) + + wait("Simple3Dview.png",10) + waitVanish("Simple3Dview.png",10) + assert(exists("designerScreen.png")) +def tearDown(self): + mouseMove(Location(0,0)) + if self.terminal.window(): + App.close(self.terminal) + self.terminal= None + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.xml new file mode 100644 index 0000000..a62a12e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/simple-visualization/test/testOgreContext.xml @@ -0,0 +1,215 @@ + + 1 + openvibe + 2.0 + + + (0x1833aa75, 0x135b1bc4) + Simple 3D viewer + (0x31a00483, 0x35924e6b) + + + (0x1fa7a38f, 0x54edbe0b) + 80.000000 + + + (0x1fa963f5, 0x1a638cd4) + 27 + + + (0x207c9054, 0x3c841b63) + 96.000000 + + + (0x4e7b798a, 0x183beafb) + (0xffffffff, 0xffffffff) + + + (0xad100179, 0xa3c984ab) + 124 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x04e6f2f2) + + + (0xc73e83ec, 0xf855c5bc) + false + + + + + (0x2907751f, 0x5707c877) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 1.0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48.000000 + + + (0x1fa963f5, 0x1a638cd4) + 27 + + + (0x207c9054, 0x3c841b63) + 304.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xad100179, 0xa3c984ab) + 129 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x025b20b3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x315af00a, 0x0596147e) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128.000000 + + + (0x1fa963f5, 0x1a638cd4) + 27 + + + (0x207c9054, 0x3c841b63) + 304.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01028a1c) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x18af3aef, 0x4571d182) + + (0x2907751f, 0x5707c877) + 0 + + + (0x315af00a, 0x0596147e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 68 + + + (0x358ae8b5, 0x0f8bacd1) + 304 + + + (0x3f0a3b27, 0x570913d2) + 110 + + + (0x6267b5c5, 0x676e3e42) + 304 + + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x28ce4caa, 0x41c2d232)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0x1833aa75, 0x135b1bc4)","childCount":0,"identifier":"(0x49324771, 0x753fb7ec)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x4a479e46, 0x0eb0dfd5)","index":0,"name":"Default tab","parentIdentifier":"(0x28ce4caa, 0x41c2d232)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x2b28a46b, 0x1eb43059)","index":0,"name":"Empty","parentIdentifier":"(0x4a479e46, 0x0eb0dfd5)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/CMakeLists.txt new file mode 100755 index 0000000..1d16c17 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/CMakeLists.txt @@ -0,0 +1,51 @@ +PROJECT(openvibe-plugins-stimulation) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleTCPTagging") +INCLUDE("FindThirdPartyGTK") +INCLUDE("FindThirdPartyLua") +INCLUDE("FindThirdPartyOpenAL") +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyBoost_Thread") +INCLUDE("FindThirdPartyBoost_System") +INCLUDE("FindOpenViBEVisualizationToolkit") + +# --------------------------------- +# Finds standard library winmm +# Adds library to target +# Adds include path +# --------------------------------- +IF(WIN32) + FIND_LIBRARY(LIB_STANDARD_MODULE_WINMM winmm) + IF(LIB_STANDARD_MODULE_WINMM) + MESSAGE(STATUS " Found winmm...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_WINMM}) + ELSE(LIB_STANDARD_MODULE_WINMM) + MESSAGE(STATUS " FAILED to find winmm...") + ENDIF(LIB_STANDARD_MODULE_WINMM) +ENDIF(WIN32) + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/plugins/stimulation) +INSTALL(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/lua/lua-stimulator.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/lua/lua-stimulator.xml new file mode 100644 index 0000000..89e65fe --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/lua/lua-stimulator.xml @@ -0,0 +1,550 @@ + + 1 + openvibe + 2.0 + + + (0x00007851, 0x00004cd4) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304.000000 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 480.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 113 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00fdd416) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0f152388, 0x4bae9e07) + Keyboard stimulator + (0x00d317b9, 0x6324c3ff) + + + (0x6f752dd0, 0x082a321e) + Outgoing Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 640 + + + (0x4e7b798a, 0x183beafb) + (0x8d89d3b7, 0x8339d210) + + + (0xad100179, 0xa3c984ab) + 161 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003bc1b1) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x2b9fd0aa, 0x64525c3a) + Mux + 5s delay + (0x0b5a2787, 0x02750621) + + + (0x6f752dd0, 0x082a321e) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0xb0d0db45, 0x49cbc34a) + Lua Script + + ${Player_ScenarioDirectory}/scripts/sample-lua-script.lua + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x1fa963f5, 0x1a638cd4) + 51 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0xd6e3f48b, 0xbee3523a) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 123 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x05321c99) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x44d592ef, 0x79906895) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 1.0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xad100179, 0xa3c984ab) + 130 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004737e8) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x7f12f9f6, 0x1203d055) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xad100179, 0xa3c984ab) + 94 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005a4c5f) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + + + (0x000006db, 0x00007628) + + (0x2b9fd0aa, 0x64525c3a) + 0 + + + (0x00007851, 0x00004cd4) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 224 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 280 + + + (0x6267b5c5, 0x676e3e42) + 480 + + + + + (0x00003a74, 0x00007163) + + (0x7f12f9f6, 0x1203d055) + 0 + + + (0x00007851, 0x00004cd4) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 99 + + + (0x358ae8b5, 0x0f8bacd1) + 320 + + + (0x3f0a3b27, 0x570913d2) + 280 + + + (0x6267b5c5, 0x676e3e42) + 465 + + + + + (0x11bc52c7, 0x7d39e76b) + + (0x44d592ef, 0x79906895) + 0 + + + (0x2b9fd0aa, 0x64525c3a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 99 + + + (0x358ae8b5, 0x0f8bacd1) + 480 + + + (0x3f0a3b27, 0x570913d2) + 162 + + + (0x6267b5c5, 0x676e3e42) + 520 + + + + + (0x68865d3e, 0x16e4e1af) + + (0x0f152388, 0x4bae9e07) + 0 + + + (0x2b9fd0aa, 0x64525c3a) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 99 + + + (0x358ae8b5, 0x0f8bacd1) + 640 + + + (0x3f0a3b27, 0x570913d2) + 162 + + + (0x6267b5c5, 0x676e3e42) + 535 + + + + + + + (0x3c41271e, 0x4d42de04) + The <i><b>Lua Stimulator</b></i> box delays muxes the stimulations +from the <i>Clock Stimulator</i> and the <i>Keyboard Stimulator</i> +boxes. Each muxed stimulation is delayed by 5 seconds. + + + (0x473d9a43, 0x97fc0a97) + 752 + + + (0x7234b86b, 0x2b8651a5) + 192 + + + + + (0x565ec9d6, 0x448fe34f) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 480 + + + (0x7234b86b, 0x2b8651a5) + 368 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00007851, 0x00004cd4)","childCount":0,"identifier":"(0x000036ad, 0x00006f70)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0x0f152388, 0x4bae9e07)","childCount":0,"identifier":"(0x06ca0825, 0x1209828e)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":400,"identifier":"(0x492edea0, 0x7fcf1a84)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":400},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x333b0470, 0x69c97194)","index":0,"name":"Default tab","parentIdentifier":"(0x492edea0, 0x7fcf1a84)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x36539222, 0x0801778f)","index":0,"name":"Empty","parentIdentifier":"(0x333b0470, 0x69c97194)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/lua/scripts/sample-lua-script.lua b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/lua/scripts/sample-lua-script.lua new file mode 100644 index 0000000..6e5f789 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/lua/scripts/sample-lua-script.lua @@ -0,0 +1,58 @@ + +-- this function is called when the box is initialized +function initialize(box) + io.write("initialize has been called\n"); + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + -- inspects the box topology + io.write(string.format("box has %i input(s)\n", box:get_input_count())) + io.write(string.format("box has %i output(s)\n", box:get_output_count())) + io.write(string.format("box has %i setting(s)\n", box:get_setting_count())) + for i = 1, box:get_setting_count() do + io.write(string.format(" - setting %i has value [%s]\n", i, box:get_setting(i))) + end + +end + +-- this function is called when the box is uninitialized +function uninitialize(box) + io.write("uninitialize has been called\n") +end + +-- this function is called once by the box +function process(box) + io.write("process has been called\n") + + -- loop until box:keep_processing() returns zero + -- cpu will be released with a call to sleep + -- at the end of the loop + while box:keep_processing() do + + -- gets current simulated time + t = box:get_current_time() + + -- loops on all inputs of the box + for input = 1, box:get_input_count() do + + -- loops on every received stimulation for a given input + for stimulation = 1, box:get_stimulation_count(input) do + + -- gets the received stimulation + identifier, date, duration = box:get_stimulation(input, 1) + + -- logs the received stimulation + io.write(string.format("At time %f on input %i got stimulation id:%s date:%s duration:%s\n", t, input, identifier, date, duration)) + + -- discards it + box:remove_stimulation(input, 1) + + -- triggers a new OVTK_StimulationId_Label_00 stimulation five seconds after + box:send_stimulation(1, OVTK_StimulationId_Label_00, t+5, 0) + end + end + + -- releases cpu + box:sleep() + end +end diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/run-command.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/run-command.xml new file mode 100644 index 0000000..22087eb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/run-command.xml @@ -0,0 +1,211 @@ + + 1 + openvibe + 2.0 + + + (0x42f8bf57, 0x71efc888) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 10.000000 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x1fa963f5, 0x1a638cd4) + 24 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xad100179, 0xa3c984ab) + 114 + + + + + (0x642d51bb, 0x4df52) + Run Command + (0x48843891, 0x7bfc57f4) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 1 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_00 + false + + + (0x79a9edeb, 0x245d83fc) + Command 1 + + xdg-open http://openvibe.inria.fr & + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 2 + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_00 + false + + + (0x79a9edeb, 0x245d83fc) + Command 2 + + START iexplore http://openvibe.inria.fr + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x1fa963f5, 0x1a638cd4) + 36 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0xe44a71e7, 0x7964dd76) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 101 + + + + + + + (0x072a525b, 0x544ef3ed) + + (0x42f8bf57, 0x71efc888) + 0 + + + (0x642d51bb, 0x4df52) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 50 + + + (0x358ae8b5, 0x0f8bacd1) + 384 + + + (0x3f0a3b27, 0x570913d2) + 105 + + + (0x6267b5c5, 0x676e3e42) + 384 + + + + + + + (0x015cb409, 0x03490d65) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 512 + + + (0x7234b86b, 0x2b8651a5) + 208 + + + + + (0x44a39962, 0x4b0bfcad) + The <i><b>Run Command</b></i> box +launches a web browser each time +a stimulation is received. This box +can be used to launch whatever +command most fits your needs. + + + (0x473d9a43, 0x97fc0a97) + 592 + + + (0x7234b86b, 0x2b8651a5) + 128 + + + + + (0x4afd0495, 0x0b2b4bf2) + The <i>Clock Stimulator</i> box +is configured to trigger a stimulation +every 10 seconds. + + + (0x473d9a43, 0x97fc0a97) + 592 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":480,"identifier":"(0x04b1b9ca, 0x49fdacb7)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":640},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x08218b08, 0x6e0a3371)","index":0,"name":"Default tab","parentIdentifier":"(0x04b1b9ca, 0x49fdacb7)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x15e14689, 0x29e46499)","index":0,"name":"Empty","parentIdentifier":"(0x08218b08, 0x6e0a3371)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/sign-change-detector.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/sign-change-detector.xml new file mode 100644 index 0000000..39e863d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/sign-change-detector.xml @@ -0,0 +1,700 @@ + + 1 + openvibe + 2.0 + + + (0x00000058, 0x00001507) + Sign changes as stimulations + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 304.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 198 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003d2119) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00000b7d, 0x000021cf) + Sinus oscillator + (0x7e33bdb8, 0x68194a4a) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 2 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 256 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xad100179, 0xa3c984ab) + 109 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006b51c4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00001768, 0x00002032) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x-1.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 82 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00317051) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002bfe, 0x0000718a) + Sign Change Detector + (0x04fa78cd, 0xafe45de7) + + + (0x544a003e, 0x6dcba5f6) + Signal + + + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + On Stimulation + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Off Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0x007deef9, 0x2f3e95c6) + Channel Index + 1 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x13bdcd99, 0x9faeff20) + + + (0xad100179, 0xa3c984ab) + 150 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002af6e1) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000033a4, 0x0000426b) + Temporal filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter type + Band pass + Band stop + false + + + (0x007deef9, 0x2f3e95c6) + Filter order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low cut frequency (Hz) + 29 + 8 + false + + + (0x512a166f, 0x5c3ef83f) + High cut frequency (Hz) + 40 + 20 + false + + + (0x512a166f, 0x5c3ef83f) + Pass band ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xad100179, 0xa3c984ab) + 103 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0041a8b8) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000009dc, 0x00007ae0) + + (0x00001768, 0x00002032) + 0 + + + (0x00000058, 0x00001507) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 231 + + + (0x358ae8b5, 0x0f8bacd1) + 320 + + + (0x3f0a3b27, 0x570913d2) + 422 + + + (0x6267b5c5, 0x676e3e42) + 289 + + + + + (0x0000173b, 0x00002ff3) + + (0x00001768, 0x00002032) + 0 + + + (0x00002bfe, 0x0000718a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 231 + + + (0x358ae8b5, 0x0f8bacd1) + 320 + + + (0x3f0a3b27, 0x570913d2) + 352 + + + (0x6267b5c5, 0x676e3e42) + 304 + + + + + (0x0000225d, 0x00004d7f) + + (0x000033a4, 0x0000426b) + 0 + + + (0x00001768, 0x00002032) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 146 + + + (0x358ae8b5, 0x0f8bacd1) + 320 + + + (0x3f0a3b27, 0x570913d2) + 187 + + + (0x6267b5c5, 0x676e3e42) + 320 + + + + + (0x00003775, 0x0000549c) + + (0x00000b7d, 0x000021cf) + 0 + + + (0x000033a4, 0x0000426b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 66 + + + (0x358ae8b5, 0x0f8bacd1) + 320 + + + (0x3f0a3b27, 0x570913d2) + 112 + + + (0x6267b5c5, 0x676e3e42) + 320 + + + + + (0x00005e52, 0x00006ce3) + + (0x00002bfe, 0x0000718a) + 0 + + + (0x00000058, 0x00001507) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 386 + + + (0x358ae8b5, 0x0f8bacd1) + 304 + + + (0x3f0a3b27, 0x570913d2) + 422 + + + (0x6267b5c5, 0x676e3e42) + 304 + + + + + + + (0x00001b49, 0x0000218a) + A <b>DSP</b> box is used in combination with the +<b>Sign Change Detector</b> to create a threshold detector. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + 224 + + + + + (0x0000585f, 0x000060ca) + Sinus oscillator generates 2 channels of signal. +The signal is filtered for simplification. + + + (0x473d9a43, 0x97fc0a97) + 608 + + + (0x7234b86b, 0x2b8651a5) + 80 + + + + + (0x00005aa9, 0x00006) + The <b>Sign Change Detector</b> takes sends stimulations +when the signal on selected channel (0 in this case) becomes +positive or negative. + + + (0x473d9a43, 0x97fc0a97) + 656 + + + (0x7234b86b, 0x2b8651a5) + 352 + + + + + (0x000063b7, 0x00005d9b) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 416 + + + (0x7234b86b, 0x2b8651a5) + 512 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00000058, 0x00001507)","childCount":0,"identifier":"(0x0000195a, 0x00000135)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":507,"identifier":"(0x00005fc9, 0x00000682)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":798},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000430b, 0x000040ff)","index":0,"name":"Default tab","parentIdentifier":"(0x00005fc9, 0x00000682)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000717d, 0x0000035a)","index":0,"name":"Empty","parentIdentifier":"(0x0000430b, 0x000040ff)","type":0}] + + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Sign Change Detector example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/sound-player.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/sound-player.xml new file mode 100644 index 0000000..f92141b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/sound-player.xml @@ -0,0 +1,728 @@ + + 1 + openvibe + 2.0 + + + (0x00001596, 0x00001900) + TCP Tagging (recommended) + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x1fa963f5, 0x1a638cd4) + 53 + + + (0x207c9054, 0x3c841b63) + 1072.000000 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xad100179, 0xa3c984ab) + 195 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x09c475d6) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0x341d3912, 0x1478de86) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000016ad, 0x0000777c) + Sound Player + (0x7ac2396f, 0x7ee52efe) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream + + + + + (0x6f752dd0, 0x082a321e) + Stimulation stream + + + + + (0x2c132d6e, 0x44ab0d97) + PLAY trigger + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + STOP trigger + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_02 + false + + + (0x330306dd, 0x74a95f98) + File to play + ${Path_Data}/plugins/stimulation/ov_beep.wav + ${Path_Data}/plugins/stimulation/ov_beep.wav + false + + + (0x2cdb2f0b, 0x12f231ea) + Loop + False + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0xd327e20a, 0xaae6b1f8) + + + (0xad100179, 0xa3c984ab) + 94 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x03910c35) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001828, 0x00007c53) + Keyboard stimulator + (0x00d317b9, 0x6324c3ff) + + + (0x6f752dd0, 0x082a321e) + Outgoing Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0x8d89d3b7, 0x8339d210) + + + (0xad100179, 0xa3c984ab) + 140 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x018383ab) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00003786, 0x000009c4) + Direct (deprecated) + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 288 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xad100179, 0xa3c984ab) + 135 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0a3bcd39) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005760, 0x000043ee) + Acquisition client + (0x35d225cb, 0x3e6e3a5f) + + + (0x403488e7, 0x565d70b6) + Experiment information + + + (0x5ba36127, 0x195feae1) + Signal stream + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x013df452, 0xa3a8879a) + Channel localisation + + + (0x6ab26b81, 0x0f8c02f3) + Channel units + + + + + (0x79a9edeb, 0x245d83fc) + Acquisition server hostname + ${AcquisitionServer_HostName} + ${AcquisitionServer_HostName} + false + + + (0x007deef9, 0x2f3e95c6) + Acquisition server port + 1024 + 1024 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 992.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0d4656c0, 0xc95b1fa8) + + + (0xad100179, 0xa3c984ab) + 121 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x017ff9bc) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0x341d3912, 0x1478de86) + 1 + + + (0xc80ce8af, 0xf699f813) + 5 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00007bff, 0x00005623) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336.000000 + + + (0x1fa963f5, 0x1a638cd4) + 43 + + + (0x207c9054, 0x3c841b63) + 960.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 100 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01bab220) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0x341d3912, 0x1478de86) + 1 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + + + (0x000004c8, 0x000021b0) + + (0x00005760, 0x000043ee) + 1 + + + (0x00007bff, 0x00005623) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 295 + + + (0x358ae8b5, 0x0f8bacd1) + 977 + + + (0x3f0a3b27, 0x570913d2) + 310 + + + (0x6267b5c5, 0x676e3e42) + 945 + + + + + (0x0000338f, 0x000044d6) + + (0x000016ad, 0x0000777c) + 0 + + + (0x00003786, 0x000009c4) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 210 + + + (0x358ae8b5, 0x0f8bacd1) + 288 + + + (0x3f0a3b27, 0x570913d2) + 294 + + + (0x6267b5c5, 0x676e3e42) + 288 + + + + + (0x000060db, 0x00003025) + + (0x00005760, 0x000043ee) + 2 + + + (0x00007bff, 0x00005623) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 295 + + + (0x358ae8b5, 0x0f8bacd1) + 992 + + + (0x3f0a3b27, 0x570913d2) + 310 + + + (0x6267b5c5, 0x676e3e42) + 960 + + + + + (0x000063f2, 0x00002eeb) + + (0x00005760, 0x000043ee) + 2 + + + (0x00001596, 0x00001900) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 295 + + + (0x358ae8b5, 0x0f8bacd1) + 992 + + + (0x3f0a3b27, 0x570913d2) + 369 + + + (0x6267b5c5, 0x676e3e42) + 1072 + + + + + (0x00007693, 0x00003000) + + (0x00001828, 0x00007c53) + 0 + + + (0x000016ad, 0x0000777c) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 82 + + + (0x358ae8b5, 0x0f8bacd1) + 288 + + + (0x3f0a3b27, 0x570913d2) + 176 + + + (0x6267b5c5, 0x676e3e42) + 288 + + + + + + + (0x00004723, 0x000027e9) + The <i><b>Sound Player</b></i> box +plays and stops a sound according to stimulation triggers. +The sound can be in OGG or WAV format. + +The triggers are passed on after the change +to Acquisition Server using TCP Tagging +which is the recommended way to combine +the stimulation markers with the signal. + + + (0x473d9a43, 0x97fc0a97) + 560.000000 + + + (0x7234b86b, 0x2b8651a5) + 208.000000 + + + + + (0x00004e97, 0x000004ca) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 480 + + + (0x7234b86b, 0x2b8651a5) + 400 + + + + + (0x00006490, 0x00006724) + The <i>Keyboard Stimulator</i> box +sends a specific stimulation when pressing a key. + +In the case of this scenario, key 'a' will start the +sound loop playback and 'z' will stop it. + +The <i>Keyboard stimulator</i> +window must have focus when the keys are pressed. + + + (0x473d9a43, 0x97fc0a97) + 560 + + + (0x7234b86b, 0x2b8651a5) + 64 + + + + + (0x000068a8, 0x00000f8c) + Unmuting the chain below will show stimulations +as they come back from the Acquisition Server's +TCP Tagging module. + + + (0x473d9a43, 0x97fc0a97) + 992.000000 + + + (0x7234b86b, 0x2b8651a5) + 208.000000 + + + + + (0x00007576, 0x0000094b) + The <i>Stimulation Listener</i> box +prints the incoming stimulations to the console. + + + (0x473d9a43, 0x97fc0a97) + 560 + + + (0x7234b86b, 0x2b8651a5) + 320 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00007bff, 0x00005623)","childCount":0,"identifier":"(0x00004074, 0x000038c0)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00007ad7, 0x00002240)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0x00001828, 0x00007c53)","childCount":0,"identifier":"(0x00007ae2, 0x000042d6)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007a1f, 0x000058c9)","index":0,"name":"Default tab","parentIdentifier":"(0x00007ad7, 0x00002240)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000596c, 0x0000430e)","index":0,"name":"Empty","parentIdentifier":"(0x00007a1f, 0x000058c9)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/stimulation-validator.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/stimulation-validator.xml new file mode 100644 index 0000000..c40bcf2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/box-tutorials/stimulation-validator.xml @@ -0,0 +1,376 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x0000377e, 0x00004994) + After Validation + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000377e, 0x00004995) + Before Validation + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Information + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000046ff, 0x00004b04) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 1.0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x0000476c, 0x000031e0) + Stimulation Validator + (0x393d15e9, 0x5b6f63b9) + + + (0x6f752dd0, 0x082a321e) + Input + + + + + (0x6f752dd0, 0x082a321e) + Output + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to count + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_00 + false + + + (0x007deef9, 0x2f3e95c6) + Number for validation + 2 + 2 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 608 + + + (0x4e7b798a, 0x183beafb) + (0x25910892, 0x4228395c) + + + (0x666fffff, 0x666fffff) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000050a2, 0x00006fea) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006d4d, 0x00002b7a) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 5 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 864 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x0000304a, 0x00007b3d) + + (0x0000476c, 0x000031e0) + 0 + + + (0x0000377e, 0x00004994) + 0 + + + + (0x00005109, 0x00004361) + + (0x00006d4d, 0x00002b7a) + 0 + + + (0x000050a2, 0x00006fea) + 0 + + + + (0x00007d7e, 0x00000e5b) + + (0x000046ff, 0x00004b04) + 0 + + + (0x0000476c, 0x000031e0) + 0 + + + + (0x00007fe8, 0x000035ac) + + (0x000046ff, 0x00004b04) + 0 + + + (0x0000377e, 0x00004995) + 0 + + + + + + + (0x00007b44, 0x0000460a) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x000037a7, 0x0000188c)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00002643, 0x000018a3)","index":0,"name":"Default tab","parentIdentifier":"(0x000037a7, 0x0000188c)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000028e2, 0x00005438)","index":0,"name":"Empty","parentIdentifier":"(0x00002643, 0x000018a3)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_KeyboardStimulator.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_KeyboardStimulator.dox-part new file mode 100644 index 0000000..c53139f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_KeyboardStimulator.dox-part @@ -0,0 +1,87 @@ +/** + * \page BoxAlgorithm_KeyboardStimulator Keyboard stimulator +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_KeyboardStimulator_Description| + * This plugin grabs key presses and translates them into OpenViBE stimulations + * |OVP_DocEnd_BoxAlgorithm_KeyboardStimulator_Description| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_KeyboardStimulator_Outputs| + * |OVP_DocEnd_BoxAlgorithm_KeyboardStimulator_Outputs| + * + * |OVP_DocBegin_BoxAlgorithm_KeyboardStimulator_Output1| + * A stream of stimulations generated by key presses + * |OVP_DocEnd_BoxAlgorithm_KeyboardStimulator_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_KeyboardStimulator_Settings| + * |OVP_DocEnd_BoxAlgorithm_KeyboardStimulator_Settings| + * + * |OVP_DocBegin_BoxAlgorithm_KeyboardStimulator_Setting1| + * The name of the file containing the associations between keys and stimulations + * |OVP_DocEnd_BoxAlgorithm_KeyboardStimulator_Setting1| + * + * |OVP_DocBegin_BoxAlgorithm_KeyboardStimulator_Setting2| + * TCP Tagging host address to send stimuli to (empty string: do not connect) + * |OVP_DocEnd_BoxAlgorithm_KeyboardStimulator_Setting2| + * + * |OVP_DocBegin_BoxAlgorithm_KeyboardStimulator_Setting3| + * TCP Tagging host port + * |OVP_DocEnd_BoxAlgorithm_KeyboardStimulator_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_KeyboardStimulator_Examples| + * + * Here is one example of configuration file : + * + * \code + * Left 0x00000301 + * Right 0x00000302 + * Up 0x0000030C + * Down 0x00000306 + * a 0x00000300 + * r 0x00000312 + * t 0x00000311 + * y 0x0000030D + * BackSpace 0x00000004 + * Return 0x00000320 + * \endcode + * + * |OVP_DocEnd_BoxAlgorithm_KeyboardStimulator_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_KeyboardStimulator_Miscellaneous| + * + * The configuration file should contain a list where each element is formatted like this : + * + * \code + * Name_of_the_key Stimulation_numeric_identifier + * \endcode + * + * For a complete listing of the key names, please consult GDK's "gdk/gdkkeysyms.h" header file. + * The names are the same but without the leading "GDK_" + * + * If TCP Tagging hostname is specified, the stimulator will send the stimuli + * to Acquisition Server in that address for accurate alignment of the stimuli + * to the EEG signal. If the keypresses are not wanted to be inserted into the signal, + * set host address to an empty string. To send to an Acquisition Server running on the same computer, + * use 'localhost' as the address. + * + * |OVP_DocEnd_BoxAlgorithm_KeyboardStimulator_Miscellaneous| +*/ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_LuaStimulator.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_LuaStimulator.dox-part new file mode 100644 index 0000000..d0ee71e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_LuaStimulator.dox-part @@ -0,0 +1,312 @@ +/** + * \page BoxAlgorithm_LuaStimulator Lua Stimulator +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_LuaStimulator_Description| +This box gives a fast control over stimulation streams thanks to Lua scripts. + +Scripts are very simple programming languages. They are usually easy to understand, +fast to write and reasonably fast to execute. They are used for high level operations +and do not need compilation. There are a number of scripting languages around. +Lua is one of those scripting languages. It is know for its execution speed and it's ease +of use. It can be used on a large number of platforms. For all those reasons, Lua is widely +used in the video game industry. If you want more information about Lua, feel free to visit +their website at http://www.lua.org and on their documentation website http://www.lua.org/manual/5.1 + +This box has a variable number of inputs and outputs. The author is able to add as many +of them as necessary. The box automatically decodes the incoming streams and automatically +encodes the outgoing streams, leaving the interesting part to the script : doing something with +input stimulations and produce output stimulations. + +The script should be divided in three functions : +- \ref LuaScriptAPI_initialize +- \ref LuaScriptAPI_uninitialize +- \ref LuaScriptAPI_process + +The whole script behavior should be executed in a single execution of the \c process function. +Thanks to this, the script code is made a lot more easy to understand than the usual C++ boxes. +Of course, in case it is necessary, the script can yield, letting the kernel perform a new step +of execution. + +A simple API is proposed allowing the script to : +- \ref LuaScriptAPI_get_input_count +- \ref LuaScriptAPI_get_output_count +- \ref LuaScriptAPI_get_setting_count +- \ref LuaScriptAPI_get_setting +- \ref LuaScriptAPI_get_config +- \ref LuaScriptAPI_log +- \ref LuaScriptAPI_set_filter_mode + +During the process function, you can also : +- \ref LuaScriptAPI_get_current_time +- \ref LuaScriptAPI_get_stimulation_count +- \ref LuaScriptAPI_get_stimulation +- \ref LuaScriptAPI_remove_stimulation +- \ref LuaScriptAPI_send_stimulation +- \ref LuaScriptAPI_sleep + +\b NOTE: people using the deprecated \e unstable API would be interested in the \ref LuaScriptAPI_upgrading_from_unstable section. + +\subsection LuaScriptAPI_initialize initialize(box) +This function is called by the box at IBox::initialize phase. It is up to the script developer to implement this function. +In case you don't want to do anything at initialization phase, just ignore this function. +- the \c box parameter enables the script developer to access the API described hereafter. + +\subsection LuaScriptAPI_uninitialize uninitialize(box) +This function is called by the box at IBox::uninitialize phase. It is up to the script developer to implement this function. +In case you don't want to do anything at uninitialization phase, just ignore this function. +- the \c box parameter enables the script developer to access the API described hereafter. + +\subsection LuaScriptAPI_process process(box) +This function is called by the box at the first IBox::process phase. It is up to the script developer to implement this function and +this function is mandatory. It is executed only once, meaning that if that code must be run on a long duration, it must release some +CPU cycles using the \ref box:sleep() function. +- the \c box parameter enables the script developer to access the API described hereafter. Among others, it will let +the script get some usefull information about the box topology (number of inputs, number of outputs, number of settings etc...) +- the \c box parameter also enables the script developer to access all the runtime functions such as receiving stimulations, +sending stimulations etc... + +\subsection LuaScriptAPI_get_input_count box:get_input_count() +This function returns the number of inputs the box has. + +\subsection LuaScriptAPI_get_output_count box:get_output_count() +This function returns the number of outputs the box has. + +\subsection LuaScriptAPI_get_setting_count box:get_setting_count() +This function returns the number of settings the box has, including the script filename itself. + +\subsection LuaScriptAPI_get_setting box:get_setting(setting_index) +This function returns a string containing the value of a given setting in the box. This +setting value may be expanded using the configuration manager thanks to a \ref LuaScriptAPI_get_config call. +- \c setting_index can range from 1 to \e n if the box has \e n settings. + +\subsection LuaScriptAPI_log box:log(log_level, line_of_text) +This function sends a string to the log manager. This message may be printed in the console +for the user or may be popped up to him if this is important enough. In any case, it will appear +in the log file. +- \c log_level the log level which you want to use to print this line of text. This is represented in +string and can take the following values : \c Debug, \c Trace, \c Info, \c Warning, \c ImportantWarning, \c Error and \c Fatal. +If you use an invalid value, then \c Debug is used. +- \c line_of_text can be any line of text you want to print + +\subsection LuaScriptAPI_set_filter_mode box:set_filter_mode(active) + +By default the Lua scripting box works in a clock-driven mode: it runs with a certain frequency, and each time the process code is run, it outputs a stimulus chunk. +When the filter mode is active (=1), the input stimulation stream drives the output chunk generation instead. In filter mode, you can copy input stimulations to the output while keeping their exact timestamps. + +Explanation: Lua box generates a stimulation chunk stream \[t1,t2\[, \[t2,t3\[, \[t3,t4\[, ... , with a high frequency (small chunks). The t are the start and end times of each chunk. +However, the input stream may have chunks with a bigger granularity such as \[t1,t3\[, \[t3,t5\[, ..., and so on. +Now if the box receives stimulation tagged at time t1 from such a bigger granularity input stream, it will have already sent out the chunk \[t1,t2\] as the current time by then is at least t3 as chunk \[t1,t3\[ was received. +Hence the stimulation at t1 must be dropped as OpenViBE stimulation stream guarantees that if a stimuli tagged at time t has not been received by the time a chunk with its beginning timestamp greater than t is received, there will never be a stimuli at t. + +Note that for the filter mode operation it is necessary that the upstream generates a meaningful stimulation stream. If not, the box will not output stimulations when the filter mode is active. + +\subsection LuaScriptAPI_get_config box:get_config(token) +This function uses the configuration manager to expand a configuration token. The configuration token +are listed in the \c openvibe.conf file and can contain valuable information about the OpenViBE +environment. +- \c token can be any string containing configuration variables (e.g. ${Path_Data}/scenarios/signals/my-experiment). + +\subsection LuaScriptAPI_get_current_time box:get_current_time() +This function returns the elapsed time in seconds since the scenario started. The returned value is a float. +- \b WARNING: this function should only be called while in the \ref LuaScriptAPI_process callback. + +\subsection LuaScriptAPI_get_stimulation_count box:get_stimulation_count(input_index) +This function returns the number of pending stimulation on a specific input given with \c input_index. +- \c input_index can range from 1 to \e n if the box has \e n inputs. +- \b NOTE: if you call this function on an unexisting input, it returns 0. +- \b WARNING: this function should only be called while in the \ref LuaScriptAPI_process callback. + +\subsection LuaScriptAPI_get_stimulation box:get_stimulation(input_index, stimulation_index) +This function returns the details of a specific pending stimulation for a specific input given with \c input_index. +- \c input_index can range from 1 to \e n if the box has \e n inputs. +- \c stimulation_index can range from 1 to \e m if the valid input \c input_index has \e m inputs. + +The result is in the form of a 3-tuple containing : +- the stimulation code as an integer +- the stimulation date as a float +- the stimulation duration as a float + +If you call this function with an \c stimulation_index bigger than what \c get_stimulation_count would have returned for +the \c input_index input, then the Lua script sleeps until enough stimulation arrived and this function can return. + +- \b WARNING: if you call this function on an unexisting input, the behavior is undefined +- \b WARNING: this function should only be called while in the \ref LuaScriptAPI_process callback. + +\subsection LuaScriptAPI_remove_stimulation box:remove_stimulation(input_index, stimulation_index) +Removes a pending stimulation on a specific input given with \c input_index. +- \c input_index can range from 1 to \e n if the box has \e n inputs. +- \c stimulation_index can range from 1 to \e m if the valid input \c input_index has \e m inputs. + +If you call this function with an \c stimulation_index bigger than what \c get_stimulation_count would have returned for +the \c input_index input, then the Lua script sleeps until enough stimulation arrived and this function can return. + +After this call, the pending stimulations order is changed, stimulations \c stimulation_index+1, \c stimulation_index+2, ... +being moved to \c stimulation_index, \c stimulation_index+1, ... respectively. + +- \b WARNING: this function should only be called while in the \ref LuaScriptAPI_process callback. + +\subsection LuaScriptAPI_send_stimulation box:send_stimulation(output_index, stimulation_identifier, stimulation_date, opt:stimulation_duration=0) +Sends a stimulation with code \c stimulation_identifier, date \c stimulation_date and duration \c stimulation_duration on output +- \c output_index. +- \c output_index can range from 1 to \e n if the box has \e n outputs. +- \c stimulation_identifier is an integer with the identifier of the stimulation to send. See \ref Doc_Stimulations for stimulation codes. +- \c stimulation_date is a float (in seconds) with the date of the stimulation. The box will take care of buffering the stimulation if needed before +actually sending it. However, you can't send a stimulation in "the past". +- \c stimulation_duration is a float (in seconds) with the duration of the stimulation. It is usually unused so if you don't know what to +put here, just ignore this parameter, or let it be 0. +- \b WARNING: this function should only be called while in the \ref LuaScriptAPI_process callback. + +\subsection LuaScriptAPI_sleep box:sleep() + +Pauses the script execution. The box then continues its execution, so the kernel can perform an additional step. Next time the box +is executed, it will restore the script execution so you can eventually continue or sleep again. + +- \b NOTE: The \e current \e time is affected by this call ! +- \b WARNING: this function should only be called while in the \ref LuaScriptAPI_process callback. + +If you want to wait until a fixed date, just use this simple Lua function : +\code +function wait_until(box, time) + while box:get_current_time() < time do + box:sleep() + end +end +\endcode + +If you want to wait for a fixed duration, just use this simple Lua function : +\code +function wait_for(box, duration) + wait_until(box, box:get_current_time() + duration) +end +\endcode + + * |OVP_DocEnd_BoxAlgorithm_LuaStimulator_Description| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_LuaStimulator_Outputs| + * |OVP_DocEnd_BoxAlgorithm_LuaStimulator_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_LuaStimulator_Output1| + * |OVP_DocEnd_BoxAlgorithm_LuaStimulator_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_LuaStimulator_Settings| + * The box can have a varying number of settings. The first setting is + * a fixed but the author can add as many settings as he wants. Those + * settings can be retrieved in the Lua script thanks to the \ref LuaScriptAPI_get_setting function + * |OVP_DocEnd_BoxAlgorithm_LuaStimulator_Settings| + + * |OVP_DocBegin_BoxAlgorithm_LuaStimulator_Setting1| + * This setting defines what Lua script should be executed. + * |OVP_DocEnd_BoxAlgorithm_LuaStimulator_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_LuaStimulator_Examples| +Here is a sample script +\code + +-- this function is called when the box is initialized +function initialize(box) + box:log("Trace", "initialize has been called"); + + dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + + -- inspects the box topology + box:log("Info", string.format("box has %i input(s)", box:get_input_count())) + box:log("Info", string.format("box has %i output(s)", box:get_output_count())) + box:log("Info", string.format("box has %i setting(s)", box:get_setting_count())) + for i = 1, box:get_setting_count() do + box:log("Info", string.format(" - setting %i has value [%s]", i, box:get_setting(i))) + end + +end + +-- this function is called when the box is uninitialized +function uninitialize(box) + box:log("Trace", "uninitialize has been called") +end + +-- this function is called once by the box +function process(box) + box:log("Trace", "process has been called") + + -- enters infinite loop + -- cpu will be released with a call to sleep + -- at the end of the loop + while box:keep_processing() do + + -- gets current simulated time + t = box:get_current_time() + + -- loops on all inputs of the box + for input = 1, box:get_input_count() do + + -- loops on every received stimulation for a given input + for stimulation = 1, box:get_stimulation_count(input) do + + -- gets the received stimulation + identifier, date, duration = box:get_stimulation(input, 1) + + -- logs the received stimulation + box:log("Trace", string.format("At time %f on input %i got stimulation id:%s date:%s duration:%s", t, input, identifier, date, duration)) + + -- discards it + box:remove_stimulation(input, 1) + + -- triggers a new OVTK_StimulationId_Label_00 stimulation five seconds after + box:send_stimulation(1, OVTK_StimulationId_Label_00, t+5, 0) + end + end + + -- releases cpu + box:sleep() + end +end +\endcode + * |OVP_DocEnd_BoxAlgorithm_LuaStimulator_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_LuaStimulator_Miscellaneous| + * + * \subsection LuaScriptAPI_upgrading_from_unstable Upgrading from the unstable API + * The Lua box has been flagged as unstable for months for several reasons : + * - The API was incomplete. + * - There were some potential issues in the chosen names for the API functions. + * - The box crashed in some circumstances. + * + * The box has been stabilized now and this results in some small changes in the API. Basically, the \ref LuaScriptAPI_initialize, + * \ref LuaScriptAPI_uninitialize and \ref LuaScriptAPI_process callbacks are passed a \e box parameter which should be used to call + * the API functions. Each API function is now prefixed with \e box: as described in the Object-Oriented Access documentation page - http://www.lua.org/pil/28.3.html + * + * In case you would not like to modify your already existing scripts in depth, I suggest you just include the \em lua-stimulator-legacy.lua script + * at the initialization of your existing scripts using the following command + * \code + * dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-legacy.lua") + * \endcode + * + * \subsection LuaScriptAPI_using_stimulation_codes Using OpenViBE stimulation codes in Lua scripts + * + * It could be convenient to have the stimulation names available in a Lua script. For this purpose, I suggest you just include the \em lua-stimulator-stim-codes.lua script + * at the initialization of your existing scripts using the following command + * \code + * dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") + * \endcode + * + * |OVP_DocEnd_BoxAlgorithm_LuaStimulator_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_P300IdentifierStimulator.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_P300IdentifierStimulator.dox-part new file mode 100644 index 0000000..d5e3040 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_P300IdentifierStimulator.dox-part @@ -0,0 +1,179 @@ +/** + * \page BoxAlgorithm_P300IdentifierStimulator P300 Identifier Stimulator +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Description| + * This box is used to generate P300 stimulation timeline. Depending on its parameters, + * it generates all the necessary flagging stimulations for an P300 experiment, such as when + * a flash starts, when it stops, when the repetitions are finished etc. + * + * Imagine a list of image. All image of this list are display consecutively a number of time. + * Only the target image is less display than other (see the setting 4). + * Then a decision can be made and the user can relax. + * Then same process restarts and so on. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Inputs| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Inputs| + * + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Input1| + * This input is used to start the generation of the pipeline. As soon as the start stimulation + * arrives here, the generation process starts. (see setting 1) + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Input1| + * + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Input2| + * A stream of stimulations corresponding to the P300 target. + * This stream of stimulation is the P300 target during the current trial time. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Input2| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Outputs| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Outputs| + * + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Output1| + * This output contains the stimulations used for P300 based experiments. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Settings| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Settings| + * + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Setting1| + * This first setting tells which stimulation to use to start the generation process. This stimulation + * can be received from a keyboard for example (see \ref Doc_BoxAlgorithm_KeyboardStimulator). + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Setting1| + * + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Setting2| + * This setting tells what stimulation base to use when displaying the image of the list. When image one should + * be flashed, this exact stimulation will be sent. When image two should be flashed, this stimulation + 1 + * will be sent, and so on. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Setting2| + * + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Setting3| + * This setting tells how many images the list has. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Setting3| + * + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Setting4| + * This setting tells the ratio of displaying the target(in percent). + * 100% are equivalent to the number of repetition and + * the setting value is approximately the percent of repetition containing the target. + * Please note that the value must be between 0 and 100%. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Setting4| + * + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Setting5| + * This setting tells how many times each non target images should be displayed in a trial. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Setting5| + * + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Setting6| + * This setting tells how many trials should be generated. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Setting6| + * + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Setting7| + * This setting tells how long an image is displaying. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Setting7| + * + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Setting8| + * This setting tells how long this stimulator should wait after an image is displaying before sending a new image. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Setting8| + * + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Setting9| + * This setting tells how long rest is left to the user between the repetitions. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Setting9| + * + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Setting10| + * This setting tells how much rest is left to the user between the trials. + * Please note that the end of a trial is also the end of a repetition. So the rest duration includes both times. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Setting10| + * + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Setting11| + * This setting is not used for now. + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Setting11| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Examples| + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300IdentifierStimulator_Miscellaneous| + * Note: this box has the same behavior as the box P300SpellerStimulator. + * Differents are the number of images are free and it's possible to define a display ratio of the target. + * The order display of images is randomly, like the display or not of the target in a repetition. + * + * The sequence generated by this box is typically something like this : + * \verbatim + * OVTK_StimulationId_ExperimentStart + * + * OVTK_StimulationId_RestStart + * OVTK_StimulationId_RestStop + * + * OVTK_StimulationId_TrialStart + * OVTK_StimulationId_SegmentStart + * + * OVTK_StimulationId_Label_0B + * OVTK_StimulationId_VisualStimulationStart + * OVTK_StimulationId_VisualStimulationStop + * + * OVTK_StimulationId_Label_03 + * OVTK_StimulationId_VisualStimulationStart + * OVTK_StimulationId_VisualStimulationStop + * + * ... + * ... + * ... + * + * OVTK_StimulationId_Label_04 + * OVTK_StimulationId_VisualStimulationStart + * OVTK_StimulationId_VisualStimulationStop + * + * OVTK_StimulationId_SegmentStop + * OVTK_StimulationId_SegmentStart + * + * ... + * ... + * ... + * + * OVTK_StimulationId_SegmentStop + * + * ... + * ... + * ... + * + * OVTK_StimulationId_TrialStop + * + * OVTK_StimulationId_RestStart + * OVTK_StimulationId_RestStop + * + * OVTK_StimulationId_TrialStart + * + * ... + * ... + * ... + * + * OVTK_StimulationId_TrialStop + * + * ... + * ... + * ... + * + * OVTK_StimulationId_ExperimentStop\endverbatim + * |OVP_DocEnd_BoxAlgorithm_P300IdentifierStimulator_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_P300SpellerStimulator.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_P300SpellerStimulator.dox-part new file mode 100644 index 0000000..8b06a46 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_P300SpellerStimulator.dox-part @@ -0,0 +1,180 @@ +/** + * \page BoxAlgorithm_P300SpellerStimulator P300 Speller Stimulator +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Description| +This box is used to generate a 2D P300 stimulation timeline. Depending on its parameters, +it generates all the necessary flagging stimulations for an P300 experiment, such as when +a flash starts, when it stops, when the repetitions are finished etc. + +Imagine a P300 speller application. Such application is based on a matrix of letters / numbers. +The lines and columns of this matrix are flashed consecutively a number of time. Then a decision +can be made and the user can relax. Then same process restarts and so one. Such experiment can +be driven by this box. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Inputs| + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Input1| +This input is used to start the generation of the pipeline. As soon as the start stimulation +arrives here, the generation process starts. (see setting 1) + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Outputs| + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Output1| +This output contains the stimulations used for P300 based experiments. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Settings| + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Settings| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Setting1| +This first setting tells which stimulation to use to start the generation process. This stimulation +can be received from a keyboard for example (see \ref Doc_BoxAlgorithm_KeyboardStimulator). + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Setting2| +This setting tells what stimulation base to use when flashing rows of the matrix. When row one should +be flashed, this exact stimulation will be sent. When row two should be flashed, this stimulation + 1 +will be sent, and so on. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Setting3| +This setting tells what stimulation base to use when flashing columns of the matrix. When column one should +be flashed, this exact stimulation will be sent. When column two should be flashed, this stimulation + 1 +will be sent, and so on. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Setting4| +This setting tells how many row the matrix has. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Setting5| +This setting tells how many columns the matrix has. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Setting6| +This setting tells how many times each row / column should be flashed in a trial. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Setting7| +This setting tells how many trials should be generated. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Setting7| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Setting8| +This setting tells how long a flash longs. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Setting8| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Setting9| +This setting tells how long this stimulator should wait after a flash is finished before sending a new flash. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Setting9| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Setting10| +This setting tells how much rest is left to the user between the repetitions. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Setting10| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Setting11| +This setting tells how much rest is left to the user between the trials. +Please note that the end of a trial is also the end of a repetition. So the rest duration includes both times. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Setting11| + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Setting12| +This setting is not used for now. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Setting12| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Examples| +This box is used in the P300 speller and the P300 magic card BCIs. Please see those +scenarios in the sample openvibe-scenarios. + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_P300SpellerStimulator_Miscellaneous| +Note: Even if this box has been created for flashing matrices, it could be used for flashing 1D things. However, in order +to have more efficient results on matrices, this box flashes one line, then one column, then one line etc. It never +flashes a line and then another line. Thus in the 1D case, you have to know that the same behavior will occur, resulting +on the flashing of the low-part of your 1D set, then high part, then low part etc... + +The sequence generated by this box is typically something like this : +\verbatim +OVTK_StimulationId_ExperimentStart + + OVTK_StimulationId_RestStart + OVTK_StimulationId_RestStop + + OVTK_StimulationId_TrialStart + OVTK_StimulationId_SegmentStart + + OVTK_StimulationId_Label_0B + OVTK_StimulationId_VisualStimulationStart + OVTK_StimulationId_VisualStimulationStop + + OVTK_StimulationId_Label_03 + OVTK_StimulationId_VisualStimulationStart + OVTK_StimulationId_VisualStimulationStop + + ... + ... + ... + + OVTK_StimulationId_Label_04 + OVTK_StimulationId_VisualStimulationStart + OVTK_StimulationId_VisualStimulationStop + + OVTK_StimulationId_SegmentStop + OVTK_StimulationId_SegmentStart + + ... + ... + ... + + OVTK_StimulationId_SegmentStop + + ... + ... + ... + + OVTK_StimulationId_TrialStop + + OVTK_StimulationId_RestStart + OVTK_StimulationId_RestStop + + OVTK_StimulationId_TrialStart + + ... + ... + ... + + OVTK_StimulationId_TrialStop + + ... + ... + ... + +OVTK_StimulationId_ExperimentStop\endverbatim + * |OVP_DocEnd_BoxAlgorithm_P300SpellerStimulator_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_RunCommand.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_RunCommand.dox-part new file mode 100644 index 0000000..874a1a8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_RunCommand.dox-part @@ -0,0 +1,87 @@ +/** + * \page BoxAlgorithm_RunCommand Run Command +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_RunCommand_Description| + * This box allows to launch a command on specific stimulation reception. + * The goal of this is to trigger an external process on specific events, + * for example launch an external process on a given stimulation. + * |OVP_DocEnd_BoxAlgorithm_RunCommand_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_RunCommand_Inputs| + * |OVP_DocEnd_BoxAlgorithm_RunCommand_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_RunCommand_Input1| + * The stimulation stream to use. The specified stimulations are looked + * for into this stream and as soon as a matching stimulation is found, + * the command is launched. + * |OVP_DocEnd_BoxAlgorithm_RunCommand_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_RunCommand_Settings| + * You can add as many settings as you want so to detect a variable number + * of stimulations and launch its associated command. It is always a pair + * of settings : stimulation to detect / command tu launch. + * |OVP_DocEnd_BoxAlgorithm_RunCommand_Settings| + + * |OVP_DocBegin_BoxAlgorithm_RunCommand_Setting1| + * The first stimulation to detect. + * |OVP_DocEnd_BoxAlgorithm_RunCommand_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_RunCommand_Setting2| + * The command to launch when first stimulation is detected. + * |OVP_DocEnd_BoxAlgorithm_RunCommand_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_RunCommand_Examples| + * |OVP_DocEnd_BoxAlgorithm_RunCommand_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_RunCommand_Miscellaneous| + * The different commandline you write should be accessible in the + * configured PATH. + * + * If you have complex commands to launch, you should + * consider writing a script that does the work. This way, you'll keep + * the box configuration simple. + * + * If either the command path or some argument contains spaces, you can + * try to enclose each such an item in double quotes. + * + * \code + * "C:/Program Files/program.exe" --open "C:/Temp/data file.dat" + * \endcode + * + * Default behavior is to launch the command synchronously. It means + * that the command you launch should not be time consuming. If you want + * asynchronous call, then you have to postfix the command with + * & under, eg : + * \code + * xdg-open http://openvibe.inria.fr & + * \endcode + * For Windows, you have to prefix the command with \e START, eg : + * \code + * START iexplore http://openvibe.inria.fr + * \endcode + * + * The implementation of this box uses POSIX function \c system + * to trigger the command. If you are interested in this command's + * behavior, see the manual page at http://linux.die.net/man/3/system + * |OVP_DocEnd_BoxAlgorithm_RunCommand_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_SignChangeDetector.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_SignChangeDetector.dox-part new file mode 100644 index 0000000..a8524eb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_SignChangeDetector.dox-part @@ -0,0 +1,68 @@ +/** + * \page BoxAlgorithm_SignChangeDetector Sign Change Detector +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignChangeDetector_Description| + +This box detects the changes of the sign of the input. It will work on any matrix of exactly two dimensions, signal in particular. This box operates only on one channel. When the input values change sign a stimulation is sent. You can choose the stimulation to send when the value becomes positive or negative. + + * |OVP_DocEnd_BoxAlgorithm_SignChangeDetector_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignChangeDetector_Inputs| + * |OVP_DocEnd_BoxAlgorithm_SignChangeDetector_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_SignChangeDetector_Input1| +Input values. Must be a streamed matrix of exactly two dimensions. This box works well with signal. + * |OVP_DocEnd_BoxAlgorithm_SignChangeDetector_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignChangeDetector_Outputs| + * |OVP_DocEnd_BoxAlgorithm_SignChangeDetector_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_SignChangeDetector_Output1| +Output stimulations. + * |OVP_DocEnd_BoxAlgorithm_SignChangeDetector_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignChangeDetector_Settings| + * |OVP_DocEnd_BoxAlgorithm_SignChangeDetector_Settings| + + * |OVP_DocBegin_BoxAlgorithm_SignChangeDetector_Setting1| +Stimulation to send when the value becomes positive. + * |OVP_DocEnd_BoxAlgorithm_SignChangeDetector_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_SignChangeDetector_Setting2| +Stimulation to send when the value becomes negative. + * |OVP_DocEnd_BoxAlgorithm_SignChangeDetector_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_SignChangeDetector_Setting3| +Index of the channel to operate on. + * |OVP_DocEnd_BoxAlgorithm_SignChangeDetector_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignChangeDetector_Examples| + * |OVP_DocEnd_BoxAlgorithm_SignChangeDetector_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignChangeDetector_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_SignChangeDetector_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_SoundPlayer.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_SoundPlayer.dox-part new file mode 100644 index 0000000..1378206 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_SoundPlayer.dox-part @@ -0,0 +1,77 @@ +/** + * \page BoxAlgorithm_SoundPlayer Sound Player +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SoundPlayer_Description| + The Sound Player box can play a sound in WAV or OGG format. It is based on the OpenAL library. + The box has to be configured to define the stimulations used as "play" and "stop" triggers. + When the playback is stopped, manually or not, the "stop" stimulation is output. + * |OVP_DocEnd_BoxAlgorithm_SoundPlayer_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SoundPlayer_Inputs| + * |OVP_DocEnd_BoxAlgorithm_SoundPlayer_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_SoundPlayer_Input1| + The stimulations that trigger "play" or "stop". + * |OVP_DocEnd_BoxAlgorithm_SoundPlayer_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SoundPlayer_Outputs| + * |OVP_DocEnd_BoxAlgorithm_SoundPlayer_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_SoundPlayer_Output1| + The box outputs the "play" and "stop" triggers when the sound is actually started and stopped (manually or at the end of file). These stimulations are synchronized with the OpenAL engine, which timing may differ slightly with the input triggers. Note that this output is deprecated. + * |OVP_DocEnd_BoxAlgorithm_SoundPlayer_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SoundPlayer_Settings| + * |OVP_DocEnd_BoxAlgorithm_SoundPlayer_Settings| + + * |OVP_DocBegin_BoxAlgorithm_SoundPlayer_Setting1| + The stimulation that triggers the sound play. + * |OVP_DocEnd_BoxAlgorithm_SoundPlayer_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_SoundPlayer_Setting2| + The stimulation that triggers the sound stop. + * |OVP_DocEnd_BoxAlgorithm_SoundPlayer_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_SoundPlayer_Setting3| + The sound file, in OGG or WAV format. + * |OVP_DocEnd_BoxAlgorithm_SoundPlayer_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_SoundPlayer_Setting4| + This setting indicates if the file has to be played in a loop once started. + \b note: when enabled the output stimulation is not sent after each loop, but only when a "stop" stimulation is received. + * |OVP_DocEnd_BoxAlgorithm_SoundPlayer_Setting4| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SoundPlayer_Examples| +The box can be used to design auditory BCI scenarios or to launch audio events for Event-Related Potential (ERP) data recording. + * |OVP_DocEnd_BoxAlgorithm_SoundPlayer_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SoundPlayer_Miscellaneous| + This box is based on OpenAL (through Alut) and uses the libogg and libvorbis libraries. + + The box sends the recognized stimulations to the Acquisition Server using TCP Tagging after the corresponding play or stop events have triggered. This is the mechanism to replace the deprecated stimulation output of the box. + * |OVP_DocEnd_BoxAlgorithm_SoundPlayer_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_StimulationFilter.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_StimulationFilter.dox-part new file mode 100644 index 0000000..41720bd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_StimulationFilter.dox-part @@ -0,0 +1,102 @@ +/** + * \page BoxAlgorithm_StimulationFilter Stimulation Filter +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationFilter_Description| + * Filters a stimulation stream in order to select or reject some + * specific stimulation ranges. The configuration of the box consists + * of a time range in which the filter will be activated, and + * a set of rules which will be executed consecutively. The first + * rule is the default one, specifying what to do if no other rule + * matches. The next rules will specify what to do for their respective + * range of stimulations. The last matching rule is chosen so you should + * build up your rules from general purpose to specific purpose. + * Please note that if no time range is specified (i.e. begin and end are both 0), + * The filter will be \b always active. + * |OVP_DocEnd_BoxAlgorithm_StimulationFilter_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationFilter_Inputs| + * |OVP_DocEnd_BoxAlgorithm_StimulationFilter_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_StimulationFilter_Input1| + The stimulation set to filter. + * |OVP_DocEnd_BoxAlgorithm_StimulationFilter_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationFilter_Outputs| + * |OVP_DocEnd_BoxAlgorithm_StimulationFilter_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_StimulationFilter_Output1| + * The stimulation set filtered according to the specified set of rules. + * |OVP_DocEnd_BoxAlgorithm_StimulationFilter_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationFilter_Settings| + * You can add as many settings as you want. They will be grouped + * in order to have one action and two stimulation identifiers per rule. + * |OVP_DocEnd_BoxAlgorithm_StimulationFilter_Settings| + + * |OVP_DocBegin_BoxAlgorithm_StimulationFilter_Setting1| + * This is the default action to perform if no rule is matching. + * |OVP_DocEnd_BoxAlgorithm_StimulationFilter_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_StimulationFilter_Setting2| + * The starting time of the filter. + * |OVP_DocEnd_BoxAlgorithm_StimulationFilter_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_StimulationFilter_Setting3| + * The ending time of the filter. + * |OVP_DocEnd_BoxAlgorithm_StimulationFilter_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_StimulationFilter_Setting4| + * This setting contains the action to perform on the specified range of stimulations. + * The range of stimulations is specified with next two settings. + * |OVP_DocEnd_BoxAlgorithm_StimulationFilter_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_StimulationFilter_Setting5| + * The stimulation starting the range. + * |OVP_DocEnd_BoxAlgorithm_StimulationFilter_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_StimulationFilter_Setting6| + * The stimulation ending the range. + * |OVP_DocEnd_BoxAlgorithm_StimulationFilter_Setting6| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationFilter_Examples| + * A simple example could be a selection from Label 00 to 0F in a stimulation + * stream. For such example, you would have to turn third setting value (default action) + * to \c Reject and use one \c Select rule for range Label 00 to Label 0F. + * + * A complete example could be to select Label 00 to 0F, + * and the particular stimulations GDF LEFT and GDF RIGHT. Additionally, for a + * reason, you want to avoid the Label 07 and Label 08. In this case, you + * will have to turn the default action setting to \c Reject then build up 4 rules : + * - rule 1 : \c Select range Label 00 to Label 0F + * - rule 2 : \c Select range GDF Left to GDF Left (only 1 stim in this range) + * - rule 3 : \c Select range GDF Right to GDF Right (only 1 stim in this range) + * - rule 4 : \c Reject range Label 07 to Label 08 + * |OVP_DocEnd_BoxAlgorithm_StimulationFilter_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationFilter_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_StimulationFilter_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_Timeout.dox-part-skeleton b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_Timeout.dox-part-skeleton new file mode 100644 index 0000000..b44a6c4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_Timeout.dox-part-skeleton @@ -0,0 +1,63 @@ +/** + * \page BoxAlgorithm_Timeout Timeout +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Description| +This box will send a stimulation on its output after it stops receiving an input. The user +can set a duration to wait before considering the output inactive. + * |OVP_DocEnd_BoxAlgorithm_Timeout_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Inputs| + * |OVP_DocEnd_BoxAlgorithm_Timeout_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Input1| +Streamed Matrix input to be monitored. + * |OVP_DocEnd_BoxAlgorithm_Timeout_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Outputs| + * |OVP_DocEnd_BoxAlgorithm_Timeout_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Output1| +Output stimulation. One stimulation will be sent after the timeout is reached. + * |OVP_DocEnd_BoxAlgorithm_Timeout_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Settings| + * |OVP_DocEnd_BoxAlgorithm_Timeout_Settings| + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Setting1| +Timeout value. Duration (in seconds) to wait after the last received chunk before the input is considered inactive. + * |OVP_DocEnd_BoxAlgorithm_Timeout_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Setting2| +Sitmulation ID to send. + * |OVP_DocEnd_BoxAlgorithm_Timeout_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Examples| + * |OVP_DocEnd_BoxAlgorithm_Timeout_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_Timeout_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/graz_keyboard_to_stimulations.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/graz_keyboard_to_stimulations.txt new file mode 100644 index 0000000..e5f954c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/graz_keyboard_to_stimulations.txt @@ -0,0 +1,11 @@ +Left 0x00000301 0x00008100 +Right 0x00000302 0x00008100 +Up 0x0000030C 0x00008100 +Down 0x00000306 0x00008100 +a 0x00000300 0x00008100 +r 0x00000312 0x00008100 +t 0x00000311 0x00008100 +y 0x0000030D 0x00008100 +BackSpace 0x00000004 0x00008100 +Return 0x00000320 0x00008100 + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/keyboard-stimulator.ui b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/keyboard-stimulator.ui new file mode 100644 index 0000000..4beda8e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/keyboard-stimulator.ui @@ -0,0 +1,24 @@ + + + + + + True + True + True + True + True + True + True + GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK + + + True + True + GTK_JUSTIFY_CENTER + + + + + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/lua-stimulator-legacy.lua b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/lua-stimulator-legacy.lua new file mode 100644 index 0000000..23681da --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/lua-stimulator-legacy.lua @@ -0,0 +1,10 @@ +function initialize(box) return initialize() end +function uninitialize(box) return uninitialize() end +function process(box) return process() end +function sleep() return __openvibe_box_context:sleep() end +function get_current_time() return __openvibe_box_context:get_current_time() end +function get_stimulation_count(input_index) return __openvibe_box_context:get_stimulation_count(input_index) end +function get_stimulation(input_index, stimulation_index) return __openvibe_box_context:get_stimulation(input_index, stimulation_index) end +function remove_stimulation(input_index, stimulation_index) return __openvibe_box_context:remove_stimulation(input_index, stimulation_index) end +function send_stimulation(output_index, stimulation_identifier, stimulation_date) return __openvibe_box_context:send_stimulation(output_index, stimulation_identifier, stimulation_date) end +function send_stimulation(output_index, stimulation_identifier, stimulation_date, stimulation_duration) return __openvibe_box_context:send_stimulation(output_index, stimulation_identifier, stimulation_date, stimulation_duration) end diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/lua-stimulator-stim-codes.lua b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/lua-stimulator-stim-codes.lua new file mode 100644 index 0000000..a75d2d5 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/lua-stimulator-stim-codes.lua @@ -0,0 +1,234 @@ + -- ___________________________________________________________________ -- + -- -- + -- OpenViBE toolkit stimulation identifiers -- + -- ___________________________________________________________________ -- + -- -- + -- Stimulation codes -- + -- Originally from openvibe-toolkit/ovtk_defines.h -- + +OVTK_StimulationId_ExperimentStart = 0x00008001 +OVTK_StimulationId_ExperimentStop = 0x00008002 +OVTK_StimulationId_SegmentStart = 0x00008003 +OVTK_StimulationId_SegmentStop = 0x00008004 +OVTK_StimulationId_TrialStart = 0x00008005 +OVTK_StimulationId_TrialStop = 0x00008006 +OVTK_StimulationId_BaselineStart = 0x00008007 +OVTK_StimulationId_BaselineStop = 0x00008008 +OVTK_StimulationId_RestStart = 0x00008009 +OVTK_StimulationId_RestStop = 0x0000800a +OVTK_StimulationId_VisualStimulationStart = 0x0000800b +OVTK_StimulationId_VisualStimulationStop = 0x0000800c +OVTK_StimulationId_VisualSteadyStateStimulationStart = 0x00008010 +OVTK_StimulationId_VisualSteadyStateStimulationStop = 0x00008011 + +OVTK_StimulationId_RemovedSamples = 0x00008310 +OVTK_StimulationId_AddedSamplesBegin = 0x00008311 +OVTK_StimulationId_AddedSamplesEnd = 0x00008312 + +OVTK_StimulationId_LabelStart = 0x00008100 +OVTK_StimulationId_Label_00 = 0x00008100 +OVTK_StimulationId_Label_01 = 0x00008101 +OVTK_StimulationId_Label_02 = 0x00008102 +OVTK_StimulationId_Label_03 = 0x00008103 +OVTK_StimulationId_Label_04 = 0x00008104 +OVTK_StimulationId_Label_05 = 0x00008105 +OVTK_StimulationId_Label_06 = 0x00008106 +OVTK_StimulationId_Label_07 = 0x00008107 +OVTK_StimulationId_Label_08 = 0x00008108 +OVTK_StimulationId_Label_09 = 0x00008109 +OVTK_StimulationId_Label_0A = 0x0000810a +OVTK_StimulationId_Label_0B = 0x0000810b +OVTK_StimulationId_Label_0C = 0x0000810c +OVTK_StimulationId_Label_0D = 0x0000810d +OVTK_StimulationId_Label_0E = 0x0000810e +OVTK_StimulationId_Label_0F = 0x0000810f +OVTK_StimulationId_Label_10 = 0x00008110 +OVTK_StimulationId_Label_11 = 0x00008111 +OVTK_StimulationId_Label_12 = 0x00008112 +OVTK_StimulationId_Label_13 = 0x00008113 +OVTK_StimulationId_Label_14 = 0x00008114 +OVTK_StimulationId_Label_15 = 0x00008115 +OVTK_StimulationId_Label_16 = 0x00008116 +OVTK_StimulationId_Label_17 = 0x00008117 +OVTK_StimulationId_Label_18 = 0x00008118 +OVTK_StimulationId_Label_19 = 0x00008119 +OVTK_StimulationId_Label_1A = 0x0000811a +OVTK_StimulationId_Label_1B = 0x0000811b +OVTK_StimulationId_Label_1C = 0x0000811c +OVTK_StimulationId_Label_1D = 0x0000811d +OVTK_StimulationId_Label_1E = 0x0000811e +OVTK_StimulationId_Label_1F = 0x0000811f +OVTK_StimulationId_LabelEnd = 0x000081ff + +OVTK_StimulationId_NumberStart = 0x00000000 +OVTK_StimulationId_Number_00 = 0x00000000 +OVTK_StimulationId_Number_01 = 0x00000001 +OVTK_StimulationId_Number_02 = 0x00000002 +OVTK_StimulationId_Number_03 = 0x00000003 +OVTK_StimulationId_Number_04 = 0x00000004 +OVTK_StimulationId_Number_05 = 0x00000005 +OVTK_StimulationId_Number_06 = 0x00000006 +OVTK_StimulationId_Number_07 = 0x00000007 +OVTK_StimulationId_Number_08 = 0x00000008 +OVTK_StimulationId_Number_09 = 0x00000009 +OVTK_StimulationId_Number_0A = 0x0000000a +OVTK_StimulationId_Number_0B = 0x0000000b +OVTK_StimulationId_Number_0C = 0x0000000c +OVTK_StimulationId_Number_0D = 0x0000000d +OVTK_StimulationId_Number_0E = 0x0000000e +OVTK_StimulationId_Number_0F = 0x0000000f +OVTK_StimulationId_Number_10 = 0x00000010 +OVTK_StimulationId_Number_11 = 0x00000011 +OVTK_StimulationId_Number_12 = 0x00000012 +OVTK_StimulationId_Number_13 = 0x00000013 +OVTK_StimulationId_Number_14 = 0x00000014 +OVTK_StimulationId_Number_15 = 0x00000015 +OVTK_StimulationId_Number_16 = 0x00000016 +OVTK_StimulationId_Number_17 = 0x00000017 +OVTK_StimulationId_Number_18 = 0x00000018 +OVTK_StimulationId_Number_19 = 0x00000019 +OVTK_StimulationId_Number_1A = 0x0000001a +OVTK_StimulationId_Number_1B = 0x0000001b +OVTK_StimulationId_Number_1C = 0x0000001c +OVTK_StimulationId_Number_1D = 0x0000001d +OVTK_StimulationId_Number_1E = 0x0000001e +OVTK_StimulationId_Number_1F = 0x0000001f +OVTK_StimulationId_NumberEnd = 0x000000ff + +OVTK_StimulationId_Train = 0x00008201 +OVTK_StimulationId_Beep = 0x00008202 +OVTK_StimulationId_DoubleBeep = 0x00008203 +OVTK_StimulationId_EndOfFile = 0x00008204 +OVTK_StimulationId_Target = 0x00008205 +OVTK_StimulationId_NonTarget = 0x00008206 +OVTK_StimulationId_TrainCompleted = 0x00008207 +OVTK_StimulationId_Reset = 0x00008208 + + -- ___________________________________________________________________ -- + -- -- + -- GDF file format stimulation identifiers -- + -- ___________________________________________________________________ -- + -- -- + +OVTK_GDF_Artifact_EOG_Large = 0x101 +OVTK_GDF_Artifact_ECG = 0x102 +OVTK_GDF_Artifact_EMG = 0x103 +OVTK_GDF_Artifact_Movement = 0x104 +OVTK_GDF_Artifact_Failing_Electrode = 0x105 +OVTK_GDF_Artifact_Sweat = 0x106 +OVTK_GDF_Artifact_50_60_Hz_Interference = 0x107 +OVTK_GDF_Artifact_Breathing = 0x108 +OVTK_GDF_Artifact_Pulse = 0x109 +OVTK_GDF_Artifact_EOG_Small = 0x10A + +OVTK_GDF_Calibration = 0x10F + +OVTK_GDF_EEG_Sleep_Splindles = 0x111 +OVTK_GDF_EEG_K_Complexes = 0x112 +OVTK_GDF_EEG_Saw_Tooth_Waves = 0x113 +OVTK_GDF_EEG_Idling_EEG_Eyes_Open = 0x114 +OVTK_GDF_EEG_Idling_EEG_Eyes_Closed = 0x115 +OVTK_GDF_EEG_Spike = 0x116 +OVTK_GDF_EEG_Seizure = 0x117 + +OVTK_GDF_VEP = 0x121 +OVTK_GDF_AEP = 0x122 +OVTK_GDF_SEP = 0x123 +OVTK_GDF_TMS = 0x12F + +OVTK_GDF_SSVEP = 0x131 +OVTK_GDF_SSAEP = 0x132 +OVTK_GDF_SSSEP = 0x133 + +OVTK_GDF_Start_Of_Trial = 0x300 +OVTK_GDF_Left = 0x301 +OVTK_GDF_Right = 0x302 +OVTK_GDF_Foot = 0x303 +OVTK_GDF_Tongue = 0x304 +OVTK_GDF_class5 = 0x305 +OVTK_GDF_Down = 0x306 +OVTK_GDF_class7 = 0x307 +OVTK_GDF_class8 = 0x308 +OVTK_GDF_class9 = 0x309 +OVTK_GDF_class10 = 0x30A +OVTK_GDF_class11 = 0x30B +OVTK_GDF_Up = 0x30C +OVTK_GDF_Feedback_Continuous = 0x30D +OVTK_GDF_Feedback_Discrete = 0x30E +OVTK_GDF_Cue_Unknown_Undefined = 0x30F +OVTK_GDF_Beep = 0x311 +OVTK_GDF_Cross_On_Screen = 0x312 +OVTK_GDF_Flashing_Light = 0x313 + -- SPECIALLY ADDED BY YR +OVTK_GDF_End_Of_Trial = 0x320 + +OVTK_GDF_Correct = 0x381 +OVTK_GDF_Incorrect = 0x382 + -- SPECIALLY ADDED BY YR +OVTK_GDF_End_Of_Session = 0x3F2 +OVTK_GDF_Rejection = 0x3FF + +OVTK_GDF_OAHE = 0x401 +OVTK_GDF_RERA = 0x402 +OVTK_GDF_CAHE = 0x403 +OVTK_GDF_CSB = 0x404 +OVTK_GDF_Sleep_Hypoventilation = 0x405 +OVTK_GDF_Maximum_Inspiration = 0x40E +OVTK_GDF_Start_Of_Inspiration = 0x40F + +OVTK_GDF_Wake = 0x410 +OVTK_GDF_Stage_1 = 0x411 +OVTK_GDF_Stage_2 = 0x412 +OVTK_GDF_Stage_3 = 0x413 +OVTK_GDF_Stage_4 = 0x414 +OVTK_GDF_REM = 0x415 + +OVTK_GDF_Lights_On = 0x420 +OVTK_GDF_Lights_Off = 0x8420 + +OVTK_GDF_Eyes_Left = 0x431 +OVTK_GDF_Eyes_Right = 0x432 +OVTK_GDF_Eyes_Up = 0x433 +OVTK_GDF_Eyes_Down = 0x434 +OVTK_GDF_Horizontal_Eye_Movement = 0x435 +OVTK_GDF_Vertical_Eye_Movement = 0x436 +OVTK_GDF_Rotation_Clockwise = 0x437 +OVTK_GDF_Rotation_Counterclockwise = 0x438 +OVTK_GDF_Eye_Blink = 0x439 + +OVTK_GDF_Left_Hand_Movement = 0x441 +OVTK_GDF_Right_Hand_Movement = 0x442 +OVTK_GDF_Head_Movement = 0x443 +OVTK_GDF_Tongue_Movement = 0x444 +OVTK_GDF_Swallowing = 0x445 +OVTK_GDF_Biting = 0x446 +OVTK_GDF_Foot_Movement = 0x447 +OVTK_GDF_Foot_Right_Movement = 0x448 +OVTK_GDF_Arm_Movement = 0x449 +OVTK_GDF_Arm_Right_Movement = 0x44A + +OVTK_GDF_ECG_Fiducial_Point_QRS_Complex = 0x501 +OVTK_GDF_ECG_P_Wave = 0x502 +OVTK_GDF_ECG_QRS_Complex = 0x503 +OVTK_GDF_ECG_R_Point = 0x504 +OVTK_GDF_ECG_T_Wave = 0x506 +OVTK_GDF_ECG_U_Wave = 0x507 + +OVTK_GDF_Start = 0x580 +OVTK_GDF_25_Watt = 0x581 +OVTK_GDF_50_Watt = 0x582 +OVTK_GDF_75_Watt = 0x583 +OVTK_GDF_100_Watt = 0x584 +OVTK_GDF_125_Watt = 0x585 +OVTK_GDF_150_Watt = 0x586 +OVTK_GDF_175_Watt = 0x587 +OVTK_GDF_200_Watt = 0x588 +OVTK_GDF_225_Watt = 0x589 +OVTK_GDF_250_Watt = 0x58A +OVTK_GDF_275_Watt = 0x58B +OVTK_GDF_300_Watt = 0x58C +OVTK_GDF_325_Watt = 0x58D +OVTK_GDF_350_Watt = 0x58E + +OVTK_GDF_Start_Of_New_Segment = 0x7FFE +OVTK_GDF_Non_Equidistant_Sampling_Value = 0x7FFF diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/ov_beep.wav b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/ov_beep.wav new file mode 100644 index 0000000..0e31604 Binary files /dev/null and b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/ov_beep.wav differ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/simple-keyboard-to-stimulations.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/simple-keyboard-to-stimulations.txt new file mode 100644 index 0000000..36e2496 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/share/simple-keyboard-to-stimulations.txt @@ -0,0 +1,11 @@ +a 0x00008101 0x00008100 +z 0x00008102 0x00008100 +e 0x00008103 0x00008100 +r 0x00008104 0x00008100 +t 0x00008105 0x00008100 +y 0x00008106 0x00008100 +u 0x00008107 0x00008100 +i 0x00008108 0x00008100 +o 0x00008109 0x00008100 +p 0x0000810A 0x00008100 + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/CBoxAlgorithmStimulationValidator.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/CBoxAlgorithmStimulationValidator.cpp new file mode 100644 index 0000000..79f9ec2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/CBoxAlgorithmStimulationValidator.cpp @@ -0,0 +1,77 @@ +#include "CBoxAlgorithmStimulationValidator.hpp" + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + +///------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmStimulationValidator::initialize() +{ + m_decoder.initialize(*this, 0); + m_iStimulation = m_decoder.getOutputStimulationSet(); + m_encoder.initialize(*this, 0); + m_oStimulation = m_encoder.getInputStimulationSet(); + + m_stim = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)); + m_limit = size_t(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1))); + + return true; +} +///------------------------------------------------------------------------------------------------- + +///------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmStimulationValidator::uninitialize() +{ + m_decoder.uninitialize(); + m_encoder.uninitialize(); + return true; +} +///------------------------------------------------------------------------------------------------- + + +///------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmStimulationValidator::processInput(const size_t index) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +///------------------------------------------------------------------------------------------------- + + +///------------------------------------------------------------------------------------------------- +bool CBoxAlgorithmStimulationValidator::process() +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + + const uint64_t currentTime = getPlayerContext().getCurrentTime(); + m_oStimulation->setStimulationCount(0); // reset stimulation output + //***** Stimulations ***** + for (size_t i = 0; i < boxCtx.getInputChunkCount(0); ++i) + { + m_decoder.decode(i); // Decode the chunk + if (m_decoder.isBufferReceived()) // Buffer Received + { + for (size_t j = 0; j < m_iStimulation->getStimulationCount(); ++j) + { + if (m_iStimulation->getStimulationIdentifier(j) == m_stim.id()) + { + m_count++; + if (m_count >= m_limit) + { + m_count = 0; + m_oStimulation->appendStimulation(m_stim.id(), m_iStimulation->getStimulationDate(j), 0); + } + } + } + } + } + if (m_lastEndTime == 0) { m_encoder.encodeHeader(); } // First time + else { m_encoder.encodeBuffer(); } // Others + boxCtx.markOutputAsReadyToSend(0, m_lastEndTime, currentTime); // preserve continuous + m_lastEndTime = currentTime; // preserve continuous + return true; +} +///------------------------------------------------------------------------------------------------- +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/CBoxAlgorithmStimulationValidator.hpp b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/CBoxAlgorithmStimulationValidator.hpp new file mode 100644 index 0000000..acba2f3 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/CBoxAlgorithmStimulationValidator.hpp @@ -0,0 +1,99 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmStimulationValidator.hpp +/// \brief Classes of the Box Stimulation Validator. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date Mon Feb 17 10:42:46 2020. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- +#pragma once + +#include "../ovp_defines.h" + +#include +#include + +namespace OpenViBE +{ + namespace Plugins + { + namespace Stimulation + { + /// The class CBoxAlgorithmStimulationValidator describes the box Stimulation Validator. + class CBoxAlgorithmStimulationValidator final : virtual public Toolkit::TBoxAlgorithm + { + public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + //Here is the different process callbacks possible + // - On clock ticks : + //bool processClock(Kernel::CMessageClock& msg) override; + // - On new input received (the most common behaviour for signal processing) : + bool processInput(const size_t index) override; + + // If you want to use processClock, you must provide the clock frequency. + //uint64_t getClockFrequency() override; + + bool process() override; + + // As we do with any class in openvibe, we use the macro below to associate this box to an unique identifier. + // The inheritance information is also made available, as we provide the superclass Toolkit::TBoxAlgorithm < IBoxAlgorithm > + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_StimulationValidator) + + protected: + //***** Codecs ***** + Toolkit::TStimulationDecoder m_decoder; // Stimulation Decoder + Toolkit::TStimulationEncoder m_encoder; // Stimulation Encoder + IStimulationSet *m_iStimulation = nullptr, *m_oStimulation = nullptr; // Stimulation Receiver + + //***** Settings ***** + CIdentifier m_stim = OVTK_StimulationId_Label_00; + size_t m_count = 0, m_limit = 0; + uint64_t m_lastEndTime = 0; + }; + + + + /// Descriptor of the box Stimulation Validator. + class CBoxAlgorithmStimulationValidatorDesc final : virtual public IBoxAlgorithmDesc + { + public: + + void release() override { } + + CString getName() const override { return CString("Stimulation Validator"); } + CString getAuthorName() const override { return CString("Thibaut Monseigne"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Count a stimulation and send this after N occurence."); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stimulation"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-add"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_StimulationValidator; } + IPluginObject* create() override { return new CBoxAlgorithmStimulationValidator; } + + /* + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmStimulationValidatorListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + */ + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input",OV_TypeId_Stimulations); + prototype.addOutput("Output",OV_TypeId_Stimulations); + prototype.addSetting("Stimulation to count",OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00"); + prototype.addSetting("Number for validation",OV_TypeId_Integer, "2"); + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_StimulationValidatorDesc) + }; + } // namespace Stimulation + } // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/adaptation/ovpCBoxAlgorithmStimulationFilter.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/adaptation/ovpCBoxAlgorithmStimulationFilter.cpp new file mode 100644 index 0000000..27ab3da --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/adaptation/ovpCBoxAlgorithmStimulationFilter.cpp @@ -0,0 +1,133 @@ +#include "ovpCBoxAlgorithmStimulationFilter.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + +bool CBoxAlgorithmStimulationFilter::initialize() +{ + m_defaultAction = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_startTime = uint64_t(double(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1)) * (1LL << 32)); + m_endTime = uint64_t(double(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2)) * (1LL << 32)); + + if (m_startTime > m_endTime) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "End time is lower than start time\n"; + return false; + } + + // we iterate over all Rules. One rule has 3 settings + const size_t nSetting = this->getStaticBoxContext().getSettingCount(); + for (size_t i = 3; i < nSetting; i += 3) + { + rule_t rule; + rule.action = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i); // the action to perform + rule.startStimID = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i + 1); // first stim + rule.EndStimID = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i + 2); // last stim in the desired range + m_rules.push_back(rule); + } + + m_encoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationEncoder)); + m_encoder->initialize(); + + m_decoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_decoder->initialize(); + + ip_buffer.initialize(m_decoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + op_stimSet.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + ip_stimSet.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_StimulationEncoder_InputParameterId_StimulationSet)); + op_buffer.initialize(m_encoder->getOutputParameter(OVP_GD_Algorithm_StimulationEncoder_OutputParameterId_EncodedMemoryBuffer)); + + return true; +} + +bool CBoxAlgorithmStimulationFilter::uninitialize() +{ + op_buffer.uninitialize(); + ip_stimSet.uninitialize(); + op_stimSet.uninitialize(); + ip_buffer.uninitialize(); + + m_decoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_decoder); + + m_encoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_encoder); + + m_rules.clear(); + + return true; +} + +bool CBoxAlgorithmStimulationFilter::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} + +bool CBoxAlgorithmStimulationFilter::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + ip_buffer = boxContext.getInputChunk(0, i); + op_buffer = boxContext.getOutputChunk(0); + m_decoder->process(); + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) + { + m_encoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeHeader); + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + ip_stimSet->setStimulationCount(0); + for (size_t s = 0; s < op_stimSet->getStimulationCount(); ++s) + { + const uint64_t id = op_stimSet->getStimulationIdentifier(s); + const uint64_t date = op_stimSet->getStimulationDate(s); + uint64_t action = m_defaultAction; + + if ((m_startTime == m_endTime) || (m_startTime != m_endTime && m_startTime <= date && date <= m_endTime)) + { + for (size_t r = 0; r < m_rules.size(); ++r) + { + const rule_t& rule = m_rules[r]; + if (rule.startStimID <= id && id <= rule.EndStimID) + { + action = rule.action; + this->getLogManager() << Kernel::LogLevel_Debug << "Switches to rule " << r << "\n"; + } + } + } + + if (action == OVP_TypeId_StimulationFilterAction_Select.id()) + { + this->getLogManager() << Kernel::LogLevel_Trace << "Selects stimulation " + << this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, id) << " !\n"; + ip_stimSet->appendStimulation(id, date, op_stimSet->getStimulationDuration(s)); + } + if (action == OVP_TypeId_StimulationFilterAction_Reject.id()) + { + this->getLogManager() << Kernel::LogLevel_Trace << "Rejects stimulation " + << this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, id) << " !\n"; + } + } + + m_encoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeBuffer); + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd)) + { + m_encoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeEnd); + } + boxContext.markInputAsDeprecated(0, i); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + return true; +} +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/adaptation/ovpCBoxAlgorithmStimulationFilter.h b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/adaptation/ovpCBoxAlgorithmStimulationFilter.h new file mode 100644 index 0000000..58b4cbd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/adaptation/ovpCBoxAlgorithmStimulationFilter.h @@ -0,0 +1,116 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { +class CBoxAlgorithmStimulationFilter final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_StimulationFilter) + +protected: + + Kernel::IAlgorithmProxy* m_decoder = nullptr; + Kernel::IAlgorithmProxy* m_encoder = nullptr; + Kernel::TParameterHandler ip_buffer; + Kernel::TParameterHandler op_stimSet; + Kernel::TParameterHandler ip_stimSet; + Kernel::TParameterHandler op_buffer; + + typedef struct + { + uint64_t action; + uint64_t startStimID; + uint64_t EndStimID; + } rule_t; + + uint64_t m_defaultAction = 0; + uint64_t m_startTime = 0; + uint64_t m_endTime = 0; + std::vector m_rules; +}; + +class CBoxAlgorithmStimulationFilterListener final : public Toolkit::TBoxListener +{ +public: + bool onSettingAdded(Kernel::IBox& box, const size_t index) override + { + box.removeSetting(index); + //we had a whole rule (3 settings) + box.addSetting("Action to perform", OVP_TypeId_StimulationFilterAction, "Select"); + box.addSetting("Stimulation range begin", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00"); + box.addSetting("Stimulation range end", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_0F"); + + return true; + } + + bool onSettingRemoved(Kernel::IBox& box, const size_t index) override + { + //we must remove the 2 other settings corresponding to the rule + const size_t settingGroupIdx = (index - 3) / 3; + box.removeSetting(settingGroupIdx * 3 + 3); + box.removeSetting(settingGroupIdx * 3 + 3); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmStimulationFilterDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Stimulation Filter"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + + CString getShortDescription() const override { return CString("Filters incoming stimulations selecting or rejecting specific ranges of stimulations"); } + + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stimulation/Adaptation"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-missing-image"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_StimulationFilter; } + IPluginObject* create() override { return new CBoxAlgorithmStimulationFilter; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Stimulations", OV_TypeId_Stimulations); + prototype.addOutput("Modified Stimulations", OV_TypeId_Stimulations); + + prototype.addSetting("Default action", OVP_TypeId_StimulationFilterAction, "Reject"); + prototype.addSetting("Time range begin", OV_TypeId_Float, "0"); + prototype.addSetting("Time range end", OV_TypeId_Float, "0"); + prototype.addSetting("Action to perform", OVP_TypeId_StimulationFilterAction, "Select"); + prototype.addSetting("Stimulation range begin", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00"); + prototype.addSetting("Stimulation range end", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_0F"); + + prototype.addFlag(Kernel::BoxFlag_CanAddSetting); + // prototype.addFlag (OV_AttributeId_Box_FlagIsUnstable); + return true; + } + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmStimulationFilterListener; } + virtual void releaseBoxListener(IBoxListener* listener) { delete listener; } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_StimulationFilterDesc) +}; +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmLuaStimulator.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmLuaStimulator.cpp new file mode 100644 index 0000000..acea934 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmLuaStimulator.cpp @@ -0,0 +1,813 @@ +#include "ovpCBoxAlgorithmLuaStimulator.h" + +#if defined TARGET_HAS_ThirdPartyLua + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + +#define __CB_Assert__(condition) \ + if(!(condition)) \ + { \ + lua_pushstring(state, "Assertion failed : ["#condition"]"); \ + lua_error(state); \ + return 0; \ + } + +namespace { +class CLuaThread +{ +public: + CLuaThread(CBoxAlgorithmLuaStimulator* pBox) : m_box(pBox) { } + CLuaThread(const CLuaThread& thread) : m_box(thread.m_box) { } + void operator()() const { m_box->doThread(); } + +protected: + CBoxAlgorithmLuaStimulator* m_box; +}; +} // namespace + +static void lua_setcallback(lua_State* state, const char* name, int (*callback)(lua_State*), void* data) +{ + lua_getglobal(state, "__openvibe_box_context"); + lua_pushlightuserdata(state, data); + lua_pushcclosure(state, callback, 1); + lua_setfield(state, -2, name); +} + +// Returns true on success, i.e. if code is 0 (no failure). +static bool lua_report(Kernel::ILogManager& logManager, lua_State* state, const int code) +{ + if (code) + { + logManager << Kernel::LogLevel_ImportantWarning << "Lua error: " << lua_tostring(state, -1) << "\n"; + lua_pop(state, 1); + } + return (code == 0); +} + +static bool lua_check_argument_count(lua_State* state, const char* name, const int count1, const int count2 = -1) +{ + if (count2 < 0) + { + if (lua_gettop(state) != count1 + 1) + { + const std::string msg = "[" + std::string(name) + "] takes " + std::to_string(count1) + " parameter" + (count1 >= 2 ? "s" : ""); + lua_pushstring(state, msg.c_str()); + lua_error(state); + return false; + } + } + else + { + if (lua_gettop(state) != count1 + 1 && lua_gettop(state) != count2 + 1) + { + const std::string msg = "[" + std::string(name) + "] takes either " + std::to_string(count1) + " or " + std::to_string(count2) + " parameter" + + (count2 >= 2 ? "s" : ""); + lua_pushstring(state, msg.c_str()); + lua_error(state); + return false; + } + } + return true; +} + +static bool lua_check_box_status(lua_State* state, const char* name, const CBoxAlgorithmLuaStimulator::EStates curState) +{ + if (curState == CBoxAlgorithmLuaStimulator::EStates::Please_Quit) + { + const std::string msg = "[" + std::string(name) + "] This thread has been requested to quit..."; + lua_pushstring(state, msg.c_str()); + lua_error(state); + return false; + } + if (curState != CBoxAlgorithmLuaStimulator::EStates::Processing) + { + const std::string msg = "[" + std::string(name) + "] should only be called in the [process] callback"; + lua_pushstring(state, msg.c_str()); + lua_error(state); + return false; + } + return true; +} + +static int lua_get_input_count_cb(lua_State* state) +{ + size_t nInput = 0; + auto pThis = static_cast(lua_touserdata(state, lua_upvalueindex(1))); + __CB_Assert__(pThis != nullptr); + + if (!lua_check_argument_count(state, "get_input_count", 0)) { return 0; } + + __CB_Assert__(pThis->getInputCountCB(nInput)); + lua_pushinteger(state, nInput); + return 1; +} + +static int lua_get_output_count_cb(lua_State* state) +{ + size_t nOutput = 0; + auto pThis = static_cast(lua_touserdata(state, lua_upvalueindex(1))); + __CB_Assert__(pThis != nullptr); + + if (!lua_check_argument_count(state, "get_output_count", 0)) { return 0; } + + __CB_Assert__(pThis->getOutputCountCB(nOutput)); + lua_pushinteger(state, nOutput); + return 1; +} + +static int lua_get_setting_count_cb(lua_State* state) +{ + size_t nSetting = 0; + auto pThis = static_cast(lua_touserdata(state, lua_upvalueindex(1))); + __CB_Assert__(pThis != nullptr); + + if (!lua_check_argument_count(state, "get_setting_count", 0)) { return 0; } + + __CB_Assert__(pThis->getSettingCountCB(nSetting)); + lua_pushinteger(state, nSetting); + return 1; +} + +static int lua_get_setting_cb(lua_State* state) +{ + CString setting; + auto pThis = static_cast(lua_touserdata(state, lua_upvalueindex(1))); + __CB_Assert__(pThis != nullptr); + + if (!lua_check_argument_count(state, "get_setting", 1)) { return 0; } + + __CB_Assert__(pThis->getSettingCB(size_t(lua_tointeger(state, 2)-1), setting)); + lua_pushstring(state, setting.toASCIIString()); + return 1; +} + +static int lua_get_config_cb(lua_State* state) +{ + CString config; + auto pThis = static_cast(lua_touserdata(state, lua_upvalueindex(1))); + __CB_Assert__(pThis != nullptr); + + if (!lua_check_argument_count(state, "get_config", 1)) { return 0; } + + __CB_Assert__(pThis->getConfigCB(lua_tostring(state, 2), config)); + lua_pushstring(state, config.toASCIIString()); + return 1; +} + +static int lua_get_current_time_cb(lua_State* state) +{ + uint64_t time = 0; + auto pThis = static_cast(lua_touserdata(state, lua_upvalueindex(1))); + __CB_Assert__(pThis != nullptr); + + if (!lua_check_argument_count(state, "get_current_time", 0)) { return 0; } + + __CB_Assert__(pThis->getCurrentTimeCB(time)); + lua_pushnumber(state, CTime(time).toSeconds()); + return 1; +} + +static int lua_sleep_cb(lua_State* state) +{ + auto pThis = static_cast(lua_touserdata(state, lua_upvalueindex(1))); + __CB_Assert__(pThis != nullptr); + + if (!lua_check_box_status(state, "sleep", pThis->m_State)) { return 0; } + if (!lua_check_argument_count(state, "sleep", 0)) { return 0; } + + __CB_Assert__(pThis->sleepCB()); + return 0; +} + +static int lua_get_stimulation_count_cb(lua_State* state) +{ + size_t count = 0; + auto pThis = static_cast(lua_touserdata(state, lua_upvalueindex(1))); + __CB_Assert__(pThis != nullptr); + + if (!lua_check_box_status(state, "get_stimulation_count", pThis->m_State)) { return 0; } + if (!lua_check_argument_count(state, "get_stimulation_count", 1)) { return 0; } + + __CB_Assert__(pThis->getStimulationCountCB(size_t(lua_tointeger(state, 2)-1), count)); + lua_pushinteger(state, count); + return 1; +} + +static int lua_get_stimulation_cb(lua_State* state) +{ + uint64_t id = uint64_t(-1); + uint64_t time = uint64_t(-1); + uint64_t duration = uint64_t(-1); + auto pThis = static_cast(lua_touserdata(state, lua_upvalueindex(1))); + __CB_Assert__(pThis != nullptr); + + if (!lua_check_box_status(state, "get_stimulation", pThis->m_State)) { return 0; } + if (!lua_check_argument_count(state, "get_stimulation", 2)) { return 0; } + + __CB_Assert__(pThis->getStimulationCB(size_t(lua_tointeger(state, 2)-1), size_t(lua_tointeger(state, 3)-1), id, time, duration)); + lua_pushinteger(state, lua_Integer(id)); + lua_pushnumber(state, CTime(time).toSeconds()); + lua_pushnumber(state, CTime(duration).toSeconds()); + return 3; +} + +static int lua_remove_stimulation_cb(lua_State* state) +{ + auto pThis = static_cast(lua_touserdata(state, lua_upvalueindex(1))); + __CB_Assert__(pThis != nullptr); + + if (!lua_check_box_status(state, "remove_stimulation", pThis->m_State)) { return 0; } + if (!lua_check_argument_count(state, "remove_stimulation", 2)) { return 0; } + + __CB_Assert__(pThis->removeStimulationCB(size_t(lua_tointeger(state, 2)-1), size_t(lua_tointeger(state, 3)-1))); + return 0; +} + +static int lua_send_stimulation_cb(lua_State* state) +{ + const int iArguments = lua_gettop(state); + auto pThis = static_cast(lua_touserdata(state, lua_upvalueindex(1))); + __CB_Assert__(pThis != nullptr); + + if (!lua_check_box_status(state, "send_stimulation", pThis->m_State)) { return 0; } + if (!lua_check_argument_count(state, "send_stimulation", 3, 4)) { return 0; } + + __CB_Assert__(pThis->sendStimulationCB(size_t(lua_tointeger(state, 2)-1), size_t(lua_tointeger(state, 3)), + CTime(double(lua_tonumber(state, 4))).time(), + (iArguments == 5 ? CTime(double(lua_tonumber(state, 5))).time() : 0))); + return 0; +} + +// Has the side effect of setting m_bLuaThreadHadError to true if called with "Error" or "Fatal" loglevels. +static int lua_log_cb(lua_State* state) +{ + auto pThis = static_cast(lua_touserdata(state, lua_upvalueindex(1))); + __CB_Assert__(pThis != nullptr); + + if (!lua_check_argument_count(state, "log", 2)) { return 0; } + + Kernel::ELogLevel level = Kernel::LogLevel_Debug; + const std::string str(lua_tostring(state, 2)); + if (str == "Trace") { level = Kernel::LogLevel_Trace; } + else if (str == "Info") { level = Kernel::LogLevel_Info; } + else if (str == "Warning") { level = Kernel::LogLevel_Warning; } + else if (str == "ImportantWarning") { level = Kernel::LogLevel_ImportantWarning; } + else if (str == "Error") + { + level = Kernel::LogLevel_Error; + pThis->m_LuaThreadHadError = true; + } + else if (str == "Fatal") + { + level = Kernel::LogLevel_Fatal; + pThis->m_LuaThreadHadError = true; + } + __CB_Assert__(pThis->log(level, lua_tostring(state, 3))); + + return 0; +} + +static int lua_keep_processing_cb(lua_State* state) +{ + const auto pThis = static_cast(lua_touserdata(state, lua_upvalueindex(1))); + __CB_Assert__(pThis != nullptr); + if (pThis->m_State == CBoxAlgorithmLuaStimulator::EStates::Processing) { return 1; } + return 0; +} + + +static int lua_set_filter_mode_cb(lua_State* state) +{ + auto pThis = static_cast(lua_touserdata(state, lua_upvalueindex(1))); + __CB_Assert__(pThis != nullptr); + + if (!lua_check_argument_count(state, "set_filter_mode", 1)) { return 0; } + + pThis->m_FilterMode = (lua_tointeger(state, 2) == 0 ? false : true); + + return 0; +} + +#if BOOST_VERSION >= 103500 +CBoxAlgorithmLuaStimulator::CBoxAlgorithmLuaStimulator() + : m_innerLock(m_mutex, boost::defer_lock), m_outerLock(m_mutex, boost::defer_lock), m_exitLock(m_mutex, boost::defer_lock) { } +#else +CBoxAlgorithmLuaStimulator::CBoxAlgorithmLuaStimulator() + : m_innerLock(m_mutex, false), m_outerLock(m_mutex, false), m_exitLock(m_mutex, false) { } +#endif + +uint64_t CBoxAlgorithmLuaStimulator::getClockFrequency() +{ + if (m_FilterMode) { return 0; } // Only when input received + return 128LL << 32; // the box clock frequency +} + +bool CBoxAlgorithmLuaStimulator::processClock(Kernel::CMessageClock& /*msg*/) +{ + if (!m_FilterMode) { this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); } + return true; +} + +bool CBoxAlgorithmLuaStimulator::processInput(const size_t /*index*/) +{ + if (m_FilterMode) { getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); } + return true; +} + +bool CBoxAlgorithmLuaStimulator::initialize() +{ + size_t i; + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + + CString filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + filename = this->getConfigurationManager().expand(filename); + + m_FilterMode = false; + + m_State = EStates::Unstarted; + m_luaState = luaL_newstate(); + + luaL_openlibs(m_luaState); + + lua_newtable(m_luaState); + lua_setglobal(m_luaState, "__openvibe_box_context"); + + lua_setcallback(m_luaState, "get_input_count", lua_get_input_count_cb, this); + lua_setcallback(m_luaState, "get_output_count", lua_get_output_count_cb, this); + lua_setcallback(m_luaState, "get_setting_count", lua_get_setting_count_cb, this); + lua_setcallback(m_luaState, "get_setting", lua_get_setting_cb, this); + lua_setcallback(m_luaState, "get_config", lua_get_config_cb, this); + lua_setcallback(m_luaState, "get_current_time", lua_get_current_time_cb, this); + lua_setcallback(m_luaState, "sleep", lua_sleep_cb, this); + lua_setcallback(m_luaState, "get_stimulation_count", lua_get_stimulation_count_cb, this); + lua_setcallback(m_luaState, "get_stimulation", lua_get_stimulation_cb, this); + lua_setcallback(m_luaState, "remove_stimulation", lua_remove_stimulation_cb, this); + lua_setcallback(m_luaState, "send_stimulation", lua_send_stimulation_cb, this); + lua_setcallback(m_luaState, "log", lua_log_cb, this); + lua_setcallback(m_luaState, "keep_processing", lua_keep_processing_cb, this); + lua_setcallback(m_luaState, "set_filter_mode", lua_set_filter_mode_cb, this); + + if (!lua_report(this->getLogManager(), m_luaState, luaL_dostring(m_luaState, "function initialize(box) end"))) { return false; } + if (!lua_report(this->getLogManager(), m_luaState, luaL_dostring(m_luaState, "function uninitialize(box) end"))) { return false; } + if (!lua_report(this->getLogManager(), m_luaState, luaL_dostring(m_luaState, "function process(box) end"))) { return false; } + if (!lua_report(this->getLogManager(), m_luaState, luaL_dofile(m_luaState, filename.toASCIIString()))) { return false; } + if (!lua_report(this->getLogManager(), m_luaState, luaL_dostring(m_luaState, "initialize(__openvibe_box_context)"))) { return false; } + + m_iStimulations.resize(boxContext.getInputCount()); + m_oStimulations.resize(boxContext.getOutputCount()); + + for (i = 0; i < boxContext.getInputCount(); ++i) + { + Toolkit::TStimulationDecoder* decoder = new Toolkit::TStimulationDecoder; + decoder->initialize(*this, i); + + m_decoders.push_back(decoder); + } + + for (i = 0; i < boxContext.getOutputCount(); ++i) + { + Toolkit::TStimulationEncoder* encoder = new Toolkit::TStimulationEncoder; + encoder->initialize(*this, i); + + m_encoders.push_back(encoder); + } + + m_lastTime = 0; + m_luaThread = nullptr; + m_LuaThreadHadError = false; + + return true; +} + +bool CBoxAlgorithmLuaStimulator::uninitialize() +{ + if (m_luaThread) + { + m_outerLock.lock(); + + // If Lua thread is still running, ask it to stop. + if (m_State == EStates::Processing || m_State == EStates::Please_Quit) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Requesting thread to quit, waiting max 5 secs ...\n"; + + m_State = EStates::Please_Quit; + m_condition.notify_one(); + + m_outerLock.unlock(); + m_exitLock.lock(); + + bool gotLock = false; + for (int i = 0; i < 5; ++i) + { + // Wait for the thread to stop (in that case it notifies the lock) + boost::system_time timeout = boost::get_system_time() + boost::posix_time::milliseconds(1000); + if (m_exitCondition.timed_wait(m_exitLock, timeout)) + { + gotLock = true; + break; + } + this->getLogManager() << Kernel::LogLevel_Info << "Waiting for thread to exit, " << i + 1 << "/5 ...\n"; + } + if (gotLock) { this->getLogManager() << Kernel::LogLevel_Debug << "Ok, thread notified the exit lock\n"; } + else { this->getLogManager() << Kernel::LogLevel_Debug << "Bad, thread did not notify the exit lock in 5s\n"; } + + m_exitLock.unlock(); + m_outerLock.lock(); + } + + if (m_State == EStates::Finished) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Ok, thread reached Finished as expected ...\n"; + m_luaThread->join(); + delete m_luaThread; + m_luaThread = nullptr; + } + else { this->getLogManager() << Kernel::LogLevel_Warning << "Bad, thread still in state " << toString(m_State) << ", cannot delete. Memory leak.\n"; } + + m_outerLock.unlock(); + } + + if (m_luaState) + { + if (!lua_report(this->getLogManager(), m_luaState, luaL_dostring(m_luaState, "uninitialize(__openvibe_box_context)"))) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Lua script uninitialize failed\n"; + // Don't return here on false, still want to free the resources below + } + lua_close(m_luaState); + m_luaState = nullptr; + } + /* TODO: Remove next comment*/ + /*IBox& staticBoxContext=*/ + this->getStaticBoxContext(); + + for (size_t i = 0; i < m_decoders.size(); ++i) + { + m_decoders[i]->uninitialize(); + delete m_decoders[i]; + } + m_decoders.clear(); + + for (size_t i = 0; i < m_encoders.size(); ++i) + { + m_encoders[i]->uninitialize(); + delete m_encoders[i]; + } + m_encoders.clear(); + + + return true; +} + +bool CBoxAlgorithmLuaStimulator::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + const uint64_t time = this->getPlayerContext().getCurrentTime(); + + // Default time range for the generated stimulation chunk + uint64_t start = (m_FilterMode ? std::numeric_limits::max() : m_lastTime); + uint64_t end = (m_FilterMode ? 0 : time); + + if (time == 0) + { + // Send all headers + for (size_t i = 0; i < m_encoders.size(); ++i) + { + m_encoders[i]->encodeHeader(); + boxContext.markOutputAsReadyToSend(size_t(i), 0, 0); + } + } + + for (size_t i = 0; i < nInput; ++i) + { + for (size_t j = 0; j < boxContext.getInputChunkCount(i); ++j) + { + m_decoders[i]->decode(j); + if (m_decoders[i]->isHeaderReceived()) { } + if (m_decoders[i]->isBufferReceived()) + { + const IStimulationSet* stimSet = m_decoders[i]->getOutputStimulationSet(); + + for (size_t k = 0; k < stimSet->getStimulationCount(); ++k) + { + m_iStimulations[i].insert(std::make_pair(stimSet->getStimulationDate(k), + std::make_pair(stimSet->getStimulationIdentifier(k), + stimSet->getStimulationDuration(k)))); + } + + if (m_FilterMode) + { + // In this mode, the output chunk time range contains all the current input chunk time ranges + start = std::min(start, boxContext.getInputChunkStartTime(i, j)); + end = std::max(end, boxContext.getInputChunkEndTime(i, j)); + if (start < m_lastTime) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Earliest current input chunk start time " + << CTime(start) << " is older than the last sent block end time " + << CTime(m_lastTime) << "\n"; + } + } + } + if (m_decoders[i]->isEndReceived()) { } + boxContext.markInputAsDeprecated(i, j); + } + } + + runLuaThread(); + + // Send unless endtime=0 (then either we're at header time, or no chunks were received in filter mode) + if (end > 0) { sendStimulations(start, end); } + + if (!m_luaThread && m_LuaThreadHadError) + { + // Lua thread has exit, so it was ok to check m_bLuaThreadHadError without a lock + return false; + } + + return true; +} + +bool CBoxAlgorithmLuaStimulator::runLuaThread() +{ + m_outerLock.lock(); + + // Executes one step of the thread + switch (m_State) + { + case EStates::Unstarted: + m_State = EStates::Processing; + m_luaThread = new boost::thread(CLuaThread(this)); + m_condition.wait(m_outerLock); + break; + + case EStates::Processing: + m_condition.notify_one(); + m_condition.wait(m_outerLock); + break; + + case EStates::Please_Quit: + // Shouldn't happen as only uninitialize() sets this + break; + + case EStates::Finished: + break; + + default: + break; + } + + // Executes one step of the box once the thread has finished + if (m_luaThread) + { + switch (m_State) + { + case EStates::Unstarted: + break; // This should never happen + + case EStates::Processing: + break; + + case EStates::Please_Quit: + // Shouldn't happen as only uninitialize() sets this + break; + + case EStates::Finished: + if (m_luaThread) + { + m_luaThread->join(); + delete m_luaThread; + m_luaThread = nullptr; + this->getLogManager() << Kernel::LogLevel_Info << "Lua script terminated\n"; + } + break; + + default: + break; + } + } + + m_outerLock.unlock(); + + return true; +} + +bool CBoxAlgorithmLuaStimulator::sendStimulations(const uint64_t startTime, const uint64_t endTime) +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const size_t nOutput = this->getStaticBoxContext().getOutputCount(); + + for (size_t i = 0; i < nOutput; ++i) + { + IStimulationSet* stimSet = m_encoders[i]->getInputStimulationSet(); + stimSet->clear(); + + auto it = m_oStimulations[i].begin(); + while (it != m_oStimulations[i].end() && it->first < endTime) + { + const auto itStim = it; + ++it; + + stimSet->appendStimulation(itStim->second.first, itStim->first, itStim->second.second); + this->getLogManager() << Kernel::LogLevel_Debug << "On output " << i << " - should send stimulation " << itStim->second.first << " at date " + << CTime(itStim->first) << " with duration " << itStim->second.second << "\n"; + + m_oStimulations[i].erase(itStim); + } + + m_encoders[i]->encodeBuffer(); + + boxContext.markOutputAsReadyToSend(i, startTime, endTime); + } + + m_lastTime = endTime; + + return true; +} + +bool CBoxAlgorithmLuaStimulator::waitForStimulation(const size_t inputIdx, const size_t stimIdx) +{ + if (inputIdx >= m_iStimulations.size()) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Input " << (inputIdx + 1) << " does not exist\n"; + return false; + } + + while (m_iStimulations[inputIdx].size() <= stimIdx) + { + switch (m_State) + { + case EStates::Unstarted: return false; // this should never happen + case EStates::Finished: return false; + case EStates::Please_Quit: return false; + case EStates::Processing: this->sleepCB(); + break; + default: break; + } + } + + return true; +} + +bool CBoxAlgorithmLuaStimulator::getInputCountCB(size_t& count) +{ + count = this->getStaticBoxContext().getInputCount(); + return true; +} + +bool CBoxAlgorithmLuaStimulator::getOutputCountCB(size_t& count) +{ + count = this->getStaticBoxContext().getOutputCount(); + return true; +} + +bool CBoxAlgorithmLuaStimulator::getSettingCountCB(size_t& count) +{ + count = this->getStaticBoxContext().getSettingCount(); + return true; +} + +bool CBoxAlgorithmLuaStimulator::getSettingCB(const size_t index, CString& setting) +{ + if (index >= this->getStaticBoxContext().getSettingCount()) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Setting " << (index + 1) << " does not exist\n"; + setting = CString(""); + return true; + } + + setting = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), index); + + return true; +} + +bool CBoxAlgorithmLuaStimulator::getConfigCB(const CString& str, CString& config) +{ + config = this->getConfigurationManager().expand(str); + return true; +} + +bool CBoxAlgorithmLuaStimulator::getCurrentTimeCB(uint64_t& time) +{ + time = this->getPlayerContext().getCurrentTime(); + return true; +} + +bool CBoxAlgorithmLuaStimulator::sleepCB() +{ + m_condition.notify_one(); + m_condition.wait(m_innerLock); + return true; +} + +bool CBoxAlgorithmLuaStimulator::getStimulationCountCB(const size_t index, size_t& count) +{ + if (index >= m_iStimulations.size()) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Input " << (index + 1) << " does not exist\n"; + count = 0; + return true; + } + + count = size_t(m_iStimulations[index].size()); + return true; +} + +bool CBoxAlgorithmLuaStimulator::getStimulationCB(const size_t inputIdx, const size_t stimIdx, uint64_t& id, uint64_t& time, uint64_t& duration) +{ + if (!this->waitForStimulation(inputIdx, stimIdx)) + { + id = uint64_t(-1); + time = uint64_t(-1); + duration = uint64_t(-1); + return true; + } + + auto it = m_iStimulations[inputIdx].begin(); + + for (size_t i = 0; i < stimIdx; i++, ++it) {} + + id = it->second.first; + time = it->first; + duration = it->second.second; + + this->getLogManager() << Kernel::LogLevel_Debug << "getStimulationCB " << (inputIdx + 1) << " " << (stimIdx + 1) << " " << id << " " << time << " " + << duration << "\n"; + + return true; +} + +bool CBoxAlgorithmLuaStimulator::removeStimulationCB(const size_t inputIdx, const size_t stimIdx) +{ + if (!this->waitForStimulation(inputIdx, stimIdx)) { return true; } + + auto it = m_iStimulations[inputIdx].begin(); + + for (size_t i = 0; i < stimIdx; i++, ++it) {} + + m_iStimulations[inputIdx].erase(it); + + this->getLogManager() << Kernel::LogLevel_Debug << "removeStimulationCB " << (inputIdx + 1) << " " << (stimIdx + 1) << "\n"; + + return true; +} + +bool CBoxAlgorithmLuaStimulator::sendStimulationCB(const size_t outputIdx, uint64_t id, uint64_t time, uint64_t duration) +{ + if (outputIdx < m_oStimulations.size()) + { + if (time >= m_lastTime) + { + this->getLogManager() << Kernel::LogLevel_Debug << "sendStimulationCB " << (outputIdx + 1) << " " << id << " " << time << " " << duration << "\n"; + m_oStimulations[outputIdx].insert(std::make_pair(time, std::make_pair(id, duration))); + } + else + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Ignored outdated stimulation " << id << " " << CTime(time) << " " << CTime(duration) + << " sent on output " << (outputIdx + 1) << " - older than last chunk end time " << CTime(m_lastTime) << "\n"; + } + } + else + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Ignored stimulation " << id << " " << CTime(time) << " " << CTime(duration) + << " sent on unexistant output " << (outputIdx + 1) << "\n"; + } + return true; +} + +bool CBoxAlgorithmLuaStimulator::log(const Kernel::ELogLevel level, const CString& text) +{ + this->getLogManager() << level << "<" << Kernel::LogColor_PushStateBit << Kernel::LogColor_ForegroundGreen + << "In Script" << Kernel::LogColor_PopStateBit << "> " << text.toASCIIString() << "\n"; + return true; +} + +void CBoxAlgorithmLuaStimulator::doThread() +{ + m_innerLock.lock(); + if (!lua_report(this->getLogManager(), m_luaState, luaL_dostring(m_luaState, "process(__openvibe_box_context)"))) { m_LuaThreadHadError = true; } + m_State = EStates::Finished; + m_innerLock.unlock(); + + m_condition.notify_one(); + m_exitCondition.notify_one(); +} + +std::string CBoxAlgorithmLuaStimulator::toString(const EStates state) +{ + switch (state) + { + case EStates::Unstarted: return "Unstarted"; + case EStates::Processing: return "Processing"; + case EStates::Please_Quit: return "Please_Quit"; + case EStates::Finished: return "Finished"; + default: return "Invalid"; + } +} + +#endif // TARGET_HAS_ThirdPartyLua +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmLuaStimulator.h b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmLuaStimulator.h new file mode 100644 index 0000000..ece1f5d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmLuaStimulator.h @@ -0,0 +1,168 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyLua + +#include "../ovp_defines.h" +#include +#include + +#include +#include +#include + +#include +#include +#include + +extern "C" { +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" +} + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { +class CBoxAlgorithmLuaStimulator final : public Toolkit::TBoxAlgorithm, public boost::noncopyable +{ +public: + + CBoxAlgorithmLuaStimulator(); + ~CBoxAlgorithmLuaStimulator() override = default; + + void release() override { delete this; } + + uint64_t getClockFrequency() override; + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_LuaStimulator) + + bool waitForStimulation(size_t inputIdx, size_t stimIdx); + + bool getInputCountCB(size_t& count); + bool getOutputCountCB(size_t& count); + bool getSettingCountCB(size_t& count); + bool getSettingCB(size_t index, CString& setting); + bool getConfigCB(const CString& str, CString& config); + + bool getCurrentTimeCB(uint64_t& time); + bool sleepCB(); + bool getStimulationCountCB(size_t index, size_t& count); + bool getStimulationCB(size_t inputIdx, size_t stimIdx, uint64_t& id, uint64_t& time, uint64_t& duration); + bool removeStimulationCB(size_t inputIdx, size_t stimIdx); + bool sendStimulationCB(size_t outputIdx, uint64_t id, uint64_t time, uint64_t duration); + bool log(Kernel::ELogLevel level, const CString& text); + + void doThread(); + + enum class EStates + { + Unstarted, + Processing, + Please_Quit, + Finished, + }; + + static std::string toString(const EStates state); + + EStates m_State = EStates::Unstarted; + bool m_LuaThreadHadError = false; // Set to true by the lua thread if there were issues + bool m_FilterMode = false; // Output chunk generation driven by inputs (true) or by clock (false) + +protected: + + lua_State* m_luaState = nullptr; + + uint64_t m_lastTime = 0; + std::vector>> m_oStimulations; + std::vector>> m_iStimulations; + + boost::thread* m_luaThread = nullptr; + boost::mutex m_mutex; + boost::mutex::scoped_lock m_innerLock; + boost::mutex::scoped_lock m_outerLock; + boost::mutex::scoped_lock m_exitLock; + boost::condition m_condition; + boost::condition m_exitCondition; + + std::vector*> m_decoders; + std::vector*> m_encoders; + +private: + + CBoxAlgorithmLuaStimulator(const CBoxAlgorithmLuaStimulator&); + + bool runLuaThread(); + bool sendStimulations(uint64_t startTime, uint64_t endTime); +}; + +class CBoxAlgorithmLuaStimulatorListener final : public Toolkit::TBoxListener +{ +public: + + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + box.setInputType(index, OV_TypeId_Stimulations); + return true; + } + + bool onOutputAdded(Kernel::IBox& box, const size_t index) override + { + box.setOutputType(index, OV_TypeId_Stimulations); + return true; + } + + bool onSettingAdded(Kernel::IBox& box, const size_t index) override + { + box.setSettingType(index, OV_TypeId_String); + box.setSettingName(index, ("Setting " + std::to_string(index)).c_str()); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmLuaStimulatorDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Lua Stimulator"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Generates some stimulations according to an Lua script"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Scripting"); } + CString getVersion() const override { return CString("1.1"); } + CString getStockItemName() const override { return CString("gtk-missing-image"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_LuaStimulator; } + IPluginObject* create() override { return new CBoxAlgorithmLuaStimulator; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmLuaStimulatorListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addOutput("Stimulations", OV_TypeId_Stimulations); + + prototype.addSetting("Lua Script", OV_TypeId_Script, ""); + + prototype.addFlag(Kernel::BoxFlag_CanAddOutput); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanAddSetting); + prototype.addFlag(Kernel::BoxFlag_CanModifySetting); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_LuaStimulatorDesc) +}; +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyLua diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmOpenALSoundPlayer.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmOpenALSoundPlayer.cpp new file mode 100644 index 0000000..bb4271d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmOpenALSoundPlayer.cpp @@ -0,0 +1,331 @@ +#if defined TARGET_HAS_ThirdPartyOpenAL + +#include "ovpCBoxAlgorithmOpenALSoundPlayer.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + + +#define BUFFER_SIZE 32768 +#define UNIQUE_SOURCE 1 + +bool CBoxAlgorithmOpenALSoundPlayer::initialize() +{ + m_decoder.initialize(*this, 0); + m_encoder.initialize(*this, 0); + + m_playTrigger = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_stopTrigger = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + m_loop = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + + m_lastOutputChunkDate = -1; + m_startOfSoundSent = false; + m_endOfSoundSent = false; + + if (alutInit(nullptr, nullptr) != AL_TRUE) + { + if (alutGetError() == ALUT_ERROR_INVALID_OPERATION) { this->getLogManager() << Kernel::LogLevel_Trace << "ALUT already initialized.\n"; } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "ALUT initialization returned a bad status.\n"; + this->getLogManager() << Kernel::LogLevel_Error << "ALUT ERROR:\n" << alutGetErrorString(alutGetError()) << "\n"; + return false; + } + } + + m_fileFormat = FILE_FORMAT_UNSUPPORTED; + + const std::string file(m_filename.toASCIIString()); + if (file.find(".wav") != std::string::npos) { m_fileFormat = FILE_FORMAT_WAV; } + if (file.find(".ogg") != std::string::npos) { m_fileFormat = FILE_FORMAT_OGG; } + + m_stimulusSender = TCPTagging::CreateStimulusSender(); + + if (!m_stimulusSender->connect("localhost", "15361")) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Unable to connect to AS's TCP Tagging plugin, stimuli wont be forwarded.\n"; + } + + return openSoundFile(); +} + +bool CBoxAlgorithmOpenALSoundPlayer::uninitialize() +{ + m_decoder.uninitialize(); + m_encoder.uninitialize(); + + const bool status = stopSound(false); + +#if UNIQUE_SOURCE + alDeleteSources(1, &m_sourceHandle); +#endif + alDeleteBuffers(1, &m_soundBufferHandle); + + if (alutExit() != AL_TRUE) + { + if (alutGetError() == ALUT_ERROR_INVALID_OPERATION) { this->getLogManager() << Kernel::LogLevel_Trace << "ALUT already exited.\n"; } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "ALUT uninitialization returned a bad status.\n"; + this->getLogManager() << Kernel::LogLevel_Error << "ALUT ERROR:\n" << alutGetErrorString(alutGetError()) << "\n"; + return false; + } + } + + if (m_stimulusSender) + { + delete m_stimulusSender; + m_stimulusSender = nullptr; + } + + return status; +} + +bool CBoxAlgorithmOpenALSoundPlayer::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmOpenALSoundPlayer::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmOpenALSoundPlayer::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + if (m_lastOutputChunkDate == uint64_t(-1)) + { + // Send header on initialize + m_encoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, 0, 0); + m_lastOutputChunkDate = 0; + } + + // Look for command stimulations + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_decoder.decode(i); + + if (m_decoder.isHeaderReceived()) { } // NOP + if (m_decoder.isBufferReceived()) + { + const IStimulationSet* stimSet = m_decoder.getOutputStimulationSet(); + + for (size_t j = 0; j < stimSet->getStimulationCount(); ++j) + { + const uint64_t stim = stimSet->getStimulationIdentifier(j); + if (stim == m_playTrigger) + { + playSound(); + m_endOfSoundSent = false; + m_startOfSoundSent = false; + } + else if (stim == m_stopTrigger) { stopSound(true); } + else + { + // Immediate passthrough + m_stimulusSender->sendStimulation(stim); + } + } + } + if (m_decoder.isEndReceived()) + { + // @fixme potentially bad behavior: the box may send chunks after sending this end + m_encoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, m_lastOutputChunkDate, this->getPlayerContext().getCurrentTime()); + m_lastOutputChunkDate = this->getPlayerContext().getCurrentTime(); + } + } + + // n.b. TCP Tagging should be used instead of this socket output. This code is kept for backwards compatibility. + IStimulationSet* oStimSet = m_encoder.getInputStimulationSet(); + oStimSet->clear(); + + ALint status; + alGetSourcei(m_sourceHandle, AL_SOURCE_STATE, &status); + // CASE : the sound has stopped, and we need to send the stimulation + if (status == AL_STOPPED && !m_endOfSoundSent) + { + oStimSet->appendStimulation(m_stopTrigger, this->getPlayerContext().getCurrentTime(), 0); + m_endOfSoundSent = true; + } + // CASE : the sound has started playing, and we need to send the stimulation + if (status == AL_PLAYING && !m_startOfSoundSent) + { + oStimSet->appendStimulation(m_playTrigger, this->getPlayerContext().getCurrentTime(), 0); + m_startOfSoundSent = true; + } + + m_encoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, m_lastOutputChunkDate, this->getPlayerContext().getCurrentTime()); + + m_lastOutputChunkDate = this->getPlayerContext().getCurrentTime(); + return true; +} + +bool CBoxAlgorithmOpenALSoundPlayer::openSoundFile() +{ + switch (m_fileFormat) + { + case FILE_FORMAT_WAV: + { + this->getLogManager() << Kernel::LogLevel_Trace << "Buffering WAV file (this step may take some times for long files).\n"; + m_soundBufferHandle = alutCreateBufferFromFile(m_filename); + this->getLogManager() << Kernel::LogLevel_Trace << "WAV file buffered.\n"; + if (m_soundBufferHandle == AL_NONE) + { + this->getLogManager() << Kernel::LogLevel_Error << "ALUT can't create buffer from file " << m_filename << "\n"; + this->getLogManager() << Kernel::LogLevel_Error << "ALUT ERROR:\n" << alutGetErrorString(alutGetError()) << "\n"; + return false; + } + break; + } + case FILE_FORMAT_OGG: + { + // On windows using fopen+ov_open can lead to failure, as stated in the vorbis official documentation: + //http://xiph.org/vorbis/doc/vorbisfile/ov_open.html + // using ov_fopen instead. + //m_oggVorbisStream.File = fopen((const char *)m_filename, "rb"); + //if (m_oggVorbisStream.File == nullptr) + //{ + // this->getLogManager() << Kernel::LogLevel_Error << "Can't open file "<(m_filename.toASCIIString()), &m_oggVorbisStream.Stream) < 0) +#elif defined TARGET_OS_Linux + if((m_oggVorbisStream.File = fopen((const char *)m_filename, "rb")) == nullptr) + { + this->getLogManager() << Kernel::LogLevel_Error << "Can't open file "<getLogManager() << Kernel::LogLevel_Error << "Can't open file " << m_filename << ": OGG VORBIS stream error\n"; + return false; + } + + vorbis_info* infos = ov_info(&m_oggVorbisStream.Stream, -1); + m_oggVorbisStream.Format = infos->channels == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; + m_oggVorbisStream.SampleRate = infos->rate; + + //Now we fill the raw buffer (good for small piece of sound... use buffering for big files) + this->getLogManager() << Kernel::LogLevel_Trace << "Buffering OGG file (this step may take some times for long files).\n"; + int bytesRead; + int bitStream; + char buffer[BUFFER_SIZE]; + do + { + // Read up to a buffer's worth of decoded sound data + bytesRead = ov_read(&m_oggVorbisStream.Stream, buffer, BUFFER_SIZE, 0, 2, 1, &bitStream); + // Append to end of buffer + m_rawOggBufferFromFile.insert(m_rawOggBufferFromFile.end(), buffer, buffer + bytesRead); + } while (bytesRead > 0); + this->getLogManager() << Kernel::LogLevel_Trace << "OGG file buffered.\n"; + + //we have decoded all the file. we drop the decoder (file is closed for us). + ov_clear(&m_oggVorbisStream.Stream); + + //create empty buffer + alGenBuffers(1, &m_soundBufferHandle); + //fill it with raw data + alBufferData(m_soundBufferHandle, m_oggVorbisStream.Format, &m_rawOggBufferFromFile[0], ALsizei(m_rawOggBufferFromFile.size()), + m_oggVorbisStream.SampleRate); + + break; + } + default: + { + this->getLogManager() << Kernel::LogLevel_Error << "Unsupported file format. Please use only WAV or OGG files.\n"; + return false; + } + } + +#if UNIQUE_SOURCE + alGenSources(1, &m_sourceHandle); + alSourcei(m_sourceHandle, AL_BUFFER, m_soundBufferHandle); + alSourcei(m_sourceHandle, AL_LOOPING, (m_loop ? AL_TRUE : AL_FALSE)); +#endif + return true; +} + +bool CBoxAlgorithmOpenALSoundPlayer::playSound() +{ + switch (m_fileFormat) + { + case FILE_FORMAT_WAV: + case FILE_FORMAT_OGG: + { +#if UNIQUE_SOURCE + ALint status; + alGetSourcei(m_sourceHandle, AL_SOURCE_STATE, &status); + if (status == AL_PLAYING) { alSourceStop(m_sourceHandle); } // we start back again + alSourcePlay(m_sourceHandle); +#else + ALuint src; + alGenSources(1, &src); + m_sources.push_back(src); + alSourcei (src, AL_BUFFER, m_soundBufferHandle); + alSourcei (src, AL_LOOPING, (m_loop?AL_TRUE:AL_FALSE)); + alSourcePlay(src); +#endif + break; + } + default: + { + this->getLogManager() << Kernel::LogLevel_Error << "Unsupported file format. Please use only WAV or OGG files.\n"; + return false; + } + } + + m_stimulusSender->sendStimulation(m_playTrigger); + return true; +} + +bool CBoxAlgorithmOpenALSoundPlayer::stopSound(const bool forwardStim) +{ + switch (m_fileFormat) + { + case FILE_FORMAT_WAV: + case FILE_FORMAT_OGG: + { +#if UNIQUE_SOURCE + alSourceStop(m_sourceHandle); +#else + for (size_t i = 0;igetLogManager() << Kernel::LogLevel_Error << "Unsupported file format. Please use only WAV or OGG files.\n"; + return false; + } + } + + if (forwardStim) { m_stimulusSender->sendStimulation(m_stopTrigger); } + return true; +} + + +#endif //TARGET_HAS_ThirdPartyOpenAL +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmOpenALSoundPlayer.h b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmOpenALSoundPlayer.h new file mode 100644 index 0000000..9a56d46 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmOpenALSoundPlayer.h @@ -0,0 +1,124 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyOpenAL + +#include "../ovp_defines.h" +#include +#include + +#include +#include +#include +#include + +namespace TCPTagging { +class IStimulusSender; // fwd declare +} + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { +class CBoxAlgorithmOpenALSoundPlayer final : public Toolkit::TBoxAlgorithm +{ +public: + struct SOggVorbisStream + { + OggVorbis_File Stream; + FILE* File; + ALenum Format; + ALsizei SampleRate; + }; + + enum ESupportedFileFormat + { + FILE_FORMAT_WAV = 0, + FILE_FORMAT_OGG, + FILE_FORMAT_UNSUPPORTED + }; + + CBoxAlgorithmOpenALSoundPlayer() { } + + void release() override { delete this; } + + uint64_t getClockFrequency() override { return (128LL << 32); } + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool processInput(const size_t index) override; + bool process() override; + + bool openSoundFile(); + bool playSound(); + bool stopSound(bool forwardStim); + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_OpenALSoundPlayer) + +protected: + + Toolkit::TStimulationDecoder m_decoder; + Toolkit::TStimulationEncoder m_encoder; + + uint64_t m_lastOutputChunkDate = 0; + bool m_startOfSoundSent = false; + bool m_endOfSoundSent = false; + bool m_loop = false; + uint64_t m_playTrigger = 0; + uint64_t m_stopTrigger = 0; + CString m_filename; + + std::vector m_sources; + ESupportedFileFormat m_fileFormat = FILE_FORMAT_UNSUPPORTED; + + //The handles + ALuint m_soundBufferHandle; + ALuint m_sourceHandle; + //OGG + SOggVorbisStream m_oggVorbisStream; + std::vector m_rawOggBufferFromFile; + + // For sending stimulations to the TCP Tagging + TCPTagging::IStimulusSender* m_stimulusSender = nullptr; +}; + +class CBoxAlgorithmOpenALSoundPlayerDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Sound Player"); } + CString getAuthorName() const override { return CString("Laurent Bonnet"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Play/Stop a sound, with or without loop."); } + + CString getDetailedDescription() const override + { + return CString("Available format : WAV / OGG. Play and stop with input stimulations. Box based on OpenAL."); + } + + CString getCategory() const override { return CString("Stimulation"); } + CString getVersion() const override { return CString("1.1"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_OpenALSoundPlayer; } + IPluginObject* create() override { return new CBoxAlgorithmOpenALSoundPlayer; } + CString getStockItemName() const override { return CString("gtk-media-play"); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input triggers", OV_TypeId_Stimulations); + prototype.addOutput("Resync triggers (deprecated)", OV_TypeId_Stimulations); + prototype.addSetting("PLAY trigger", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00"); + prototype.addSetting("STOP trigger", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_01"); + prototype.addSetting("File to play", OV_TypeId_Filename, "${Path_Data}/plugins/stimulation/ov_beep.wav"); + prototype.addSetting("Loop", OV_TypeId_Boolean, "false"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_OpenALSoundPlayerDesc) +}; +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE + +#endif //TARGET_HAS_ThirdPartyOpenAL diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmP300IdentifierStimulator.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmP300IdentifierStimulator.cpp new file mode 100644 index 0000000..fe26664 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmP300IdentifierStimulator.cpp @@ -0,0 +1,438 @@ +#include "ovpCBoxAlgorithmP300IdentifierStimulator.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + +bool CBoxAlgorithmP300IdentifierStimulator::initialize() +{ + //get values of the configure windows for all settings + + m_startStimulation = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_stimulationBase = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + m_nImages = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + + //the number of images must be different to 0 + if (m_nImages == 0) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "This stimulator should at least have 1 Image (got " << m_nImages << ")\n"; + return false; + } + + m_percentRepetitionTarget = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + + //the percent of Repetition contains the target must be between 0% and 100% + if (m_percentRepetitionTarget > 100.) + { + this->getLogManager() << Kernel::LogLevel_Warning << "The percent of repetition contains Target, should not be more than 100% \n"; + m_percentRepetitionTarget = 100.; + } + + if (m_percentRepetitionTarget < 0.) + { + this->getLogManager() << Kernel::LogLevel_Warning << "The percent of repetition contains Target, should not be less than 0% \n"; + m_percentRepetitionTarget = 0.; + } + + m_repetitionCountInTrial = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + m_nTrial = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5); + m_flashDuration = uint64_t(double(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 6)) * double(1LL << 32)); + m_noFlashDuration = uint64_t(double(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 7)) * double(1LL << 32)); + m_interRepetitionDuration = uint64_t(double(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 8)) * double(1LL << 32)); + m_interTrialDuration = uint64_t(double(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 9)) * double(1LL << 32)); + + //----------------------------------------------------------------------------------------------------------------------------------------- + + m_encoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationEncoder)); + m_encoder->initialize(); + + m_decoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_decoder->initialize(); + + m_targetDecoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_targetDecoder->initialize(); + + //initialized all variables + m_headerSent = false; + m_lastState = EStates::None; + + m_nFlashInRepet = m_nImages; + m_nFlashInRepetWithoutTarget = m_nFlashInRepet - 1; + m_repetDuration = m_nFlashInRepet * (m_flashDuration + m_noFlashDuration); + m_repetDurationWithoutTarget = m_nFlashInRepetWithoutTarget * (m_flashDuration + m_noFlashDuration); + + m_repetTarget = new uint64_t[m_repetitionCountInTrial]; + + reset(); + + return true; +} + +bool CBoxAlgorithmP300IdentifierStimulator::reset() +{ + m_lastTime = 0; + m_startReceived = false; + m_trialStartTime = m_interTrialDuration; + + m_targetNum = 0; + m_trialIdx = 1; + //generate the first trial variables + this->generateTrialVars(); + return true; +} + +bool CBoxAlgorithmP300IdentifierStimulator::uninitialize() +{ + m_decoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_decoder); + + m_targetDecoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_targetDecoder); + + m_encoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_encoder); + return true; +} + +bool CBoxAlgorithmP300IdentifierStimulator::processInput(const size_t /*index*/) +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + if (!m_startReceived) + { + Kernel::TParameterHandler ip_buffer( + m_decoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + const Kernel::TParameterHandler op_pStimulationSet( + m_decoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + ip_buffer = boxContext.getInputChunk(0, i); + m_decoder->process(); + + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) { } + + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + for (size_t j = 0; j < op_pStimulationSet->getStimulationCount(); ++j) + { + if (op_pStimulationSet->getStimulationIdentifier(j) == m_startStimulation) + { + this->getLogManager() << Kernel::LogLevel_Trace << "Start\n"; + m_trialStartTime = op_pStimulationSet->getStimulationDate(j) + m_interTrialDuration; + m_startReceived = true; + } + } + } + + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd)) { } + } + + boxContext.markInputAsDeprecated(0, i); + } + + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + if (m_startReceived) + { + Kernel::TParameterHandler ip_buffer( + m_targetDecoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + const Kernel::TParameterHandler op_stimSet( + m_targetDecoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + ip_buffer = boxContext.getInputChunk(1, i); + m_targetDecoder->process(); + + if (m_targetDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) { } + + if (m_targetDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + for (size_t j = 0; j < op_stimSet->getStimulationCount(); ++j) + { + const uint64_t stimulationIdx = op_stimSet->getStimulationIdentifier(j) - m_stimulationBase; + if (stimulationIdx < m_nImages) + { + m_targetNum = int64_t(stimulationIdx); + this->getLogManager() << Kernel::LogLevel_Trace << "Choosen number of the targets " << m_targetNum << "\n"; + } + } + } + + if (m_targetDecoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd)) { } + } + + boxContext.markInputAsDeprecated(1, i); + } + return true; +} + +bool CBoxAlgorithmP300IdentifierStimulator::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmP300IdentifierStimulator::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const uint64_t time = this->getPlayerContext().getCurrentTime(); + CStimulationSet stimSet; + + //if start stimulation is receive + if (m_startReceived) + { + EStates state; // = EStates::NoFlash; + uint64_t flashIndex = uint64_t(-1); + //case of inter-trial + if (time < m_trialStartTime) { state = EStates::TrialRest; } + //case of in-trial + else + { + const uint64_t timeInTrial = time - m_trialStartTime; + + //case of the current time is out of the trial time + if (timeInTrial >= m_trialDuration) + { + //has next trial + if (m_nTrial == 0 || m_trialIdx < m_nTrial) + { + m_trialStartTime = time + m_interTrialDuration; + state = EStates::TrialRest; + flashIndex = uint64_t(-1); + m_trialIdx++; + generateTrialVars(); + } + //it was the last trial + else + { + state = EStates::None; + reset(); + } + } + else + { + const int64_t timeInRepetition = getCurrentTimeInRepetition(timeInTrial); + + //case of the current time is out of the repetition time + if (timeInRepetition < 0 || uint64_t(timeInRepetition) >= (m_repetWithoutTarget ? m_repetDurationWithoutTarget : m_repetDuration)) + { + state = EStates::RepetitionRest; + flashIndex = uint64_t(-1); + } + else + { + flashIndex = timeInRepetition / (m_flashDuration + m_noFlashDuration); + + //case of the current time isn't out of the flash time + if (timeInRepetition % (m_flashDuration + m_noFlashDuration) < m_flashDuration) { state = EStates::Flash; } + else { state = EStates::NoFlash; } + } + } + } + + //case of the state changed + if (state != m_lastState) + { + //trigger send about the old state + switch (m_lastState) + { + //case of the older state was a flash + case EStates::Flash: + stimSet.appendStimulation(OVTK_StimulationId_VisualStimulationStop, time, 0); + this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_VisualStimulationStop\n\t; Trial index:" << m_trialIdx + << " Repetition index: " << m_repetIdx << "\n"; + break; + //case of the older state was a no-flash + case EStates::NoFlash: + break; + + //case of the older state was a inter-repetition + case EStates::RepetitionRest: + if (state != EStates::TrialRest && state != EStates::None) + { + stimSet.appendStimulation(OVTK_StimulationId_SegmentStart, time, 0); + this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_SegmentStart\n\t; Trial index:" << m_trialIdx + << " Repetition index: " << m_repetIdx << "\n"; + } + break; + //case of the older state was inter-Trial + case EStates::TrialRest: + stimSet.appendStimulation(OVTK_StimulationId_RestStop, time, 0); + this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_RestStop\n\t; Trial index:" << m_trialIdx << + " Repetition index: " + << m_repetIdx << "\n"; + stimSet.appendStimulation(OVTK_StimulationId_TrialStart, time, 0); + this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_TrialStart\n\t; Trial index:" << m_trialIdx << + " Repetition index: " + << m_repetIdx << "\n"; + stimSet.appendStimulation(OVTK_StimulationId_SegmentStart, time, 0); + this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_SegmentStart\n\t; Trial index:" << m_trialIdx << + " Repetition index: " + << m_repetIdx << "\n"; + break; + //case of the older state was a None state + case EStates::None: + stimSet.appendStimulation(OVTK_StimulationId_ExperimentStart, time, 0); + this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_ExperimentStart\n\t; Trial index:" << m_trialIdx + << " Repetition index: " << m_repetIdx << "\n"; + break; + + default: + break; + } + + //trigger and operation about the new state + switch (state) + { + //case of the new state is a flash + case EStates::Flash: + stimSet.appendStimulation(m_stimulationBase + m_images[flashIndex], time, 0); + this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_LabelId(x)\n\t; Trial index:" << m_trialIdx << + " Repetition index: " + << m_repetIdx << "\n"; + stimSet.appendStimulation(OVTK_StimulationId_VisualStimulationStart, time, 0); + this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_VisualStimulationStart\n\t; Trial index:" << m_trialIdx + << " Repetition index: " << m_repetIdx << "\n"; + break; + //case of the new state is a no-flash + case EStates::NoFlash: + break; + //case of the new state is a inter-repetition + case EStates::RepetitionRest: + stimSet.appendStimulation(OVTK_StimulationId_SegmentStop, time, 0); + this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_SegmentStop\n\t; Trial index:" << m_trialIdx << + " Repetition index: " + << m_repetIdx << "\n"; + this->generateSequence(); + break; + //case of the new state is a inter-trial + case EStates::TrialRest: + m_targetNum = -1; + if (m_lastState != EStates::None) + { + if (m_lastState != EStates::RepetitionRest) + { + stimSet.appendStimulation(OVTK_StimulationId_SegmentStop, time, 0); + this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_SegmentStop\n\t; Trial index:" << m_trialIdx + << " Repetition index: " << m_repetIdx << "\n"; + } + stimSet.appendStimulation(OVTK_StimulationId_TrialStop, time, 0); + this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_TrialStop\n\t; Trial index:" << m_trialIdx << + " Repetition index: " + << m_repetIdx << "\n"; + } + stimSet.appendStimulation(OVTK_StimulationId_RestStart, time, 0); + this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_RestStart\n\t; Trial index:" << m_trialIdx << + " Repetition index: " + << m_repetIdx << "\n"; + break; + //case of the new state is a none state + case EStates::None: + if (m_lastState != EStates::RepetitionRest) + { + stimSet.appendStimulation(OVTK_StimulationId_SegmentStop, time, 0); + this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_SegmentStop\n\t; Trial index:" << m_trialIdx + << " Repetition index: " << m_repetIdx << "\n"; + } + stimSet.appendStimulation(OVTK_StimulationId_TrialStop, time, 0); + this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_TrialStop\n\t; Trial index:" << m_trialIdx << + " Repetition index: " + << m_repetIdx << "\n"; + stimSet.appendStimulation(OVTK_StimulationId_ExperimentStop, time, 0); + this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_ExperimentStop\n\t; Trial index:" << m_trialIdx + << " Repetition index: " << m_repetIdx << "\n"; + break; + + default: + break; + } + + m_lastState = state; + } +#if 0 + this->getLogManager() << Kernel::LogLevel_Info << "State:" << state_to_string(state) << " - flash index:" << flashIdx << " - repetition index:" << repetitionIdx << " - trial index:" << m_trialIdx << "\n"; +#endif + } + + Kernel::TParameterHandler ip_stimSet(m_encoder->getInputParameter(OVP_GD_Algorithm_StimulationEncoder_InputParameterId_StimulationSet)); + Kernel::TParameterHandler op_buffer( + m_encoder->getOutputParameter(OVP_GD_Algorithm_StimulationEncoder_OutputParameterId_EncodedMemoryBuffer)); + ip_stimSet = &stimSet; + op_buffer = boxContext.getOutputChunk(0); + if (!m_headerSent) + { + m_encoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeHeader); + boxContext.markOutputAsReadyToSend(0, m_lastTime, time); + } + if (m_lastTime != time) + { + m_encoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(0, m_lastTime, time); + } + m_lastTime = time; + m_headerSent = true; + return true; +} + + +void CBoxAlgorithmP300IdentifierStimulator::generateSequence() +{ + if (m_repetIdx < m_repetitionCountInTrial) + { + this->getLogManager() << Kernel::LogLevel_Trace << "generate_sequence Repetition: " << m_repetIdx << " Target: " << m_targetNum << "\n"; + if (m_repetIdx > 0) { m_repetWithoutTarget = m_repetTarget[m_repetIdx] == m_repetTarget[m_repetIdx - 1]; } + else { m_repetWithoutTarget = (m_repetTarget[0] == 0); } + m_repetIdx++; + std::vector images; + m_images.clear(); + for (size_t i = 0; i < m_nImages; ++i) { images.push_back(i); } + this->getLogManager() << Kernel::LogLevel_Trace << "Number target: " << " Repetition without target: " << m_repetWithoutTarget << "\n"; + if (m_repetWithoutTarget && m_targetNum != -1) { images.erase(images.begin() + size_t(m_targetNum)); } + while (!images.empty()) + { + const int j = rand() % images.size(); + m_images.push_back(size_t(images[j])); + images.erase(images.begin() + j); + } + } +} + + +void CBoxAlgorithmP300IdentifierStimulator::generateTrialVars() +{ + this->getLogManager() << Kernel::LogLevel_Trace << "generate_trial_vars " << "\n"; + uint64_t nTargetInTrial = 0; + for (size_t i = 0; i < m_repetitionCountInTrial; ++i) + { + const size_t random = rand(); + //increment the chance to display the target. we would'nt like to have no Target display in a trial. + double percentRepetitionTargetInc = m_percentRepetitionTarget + (100 - m_percentRepetitionTarget) / (m_repetitionCountInTrial - 1) * i; + const double percentRepetitionTarget = (nTargetInTrial < 1) ? percentRepetitionTargetInc : m_percentRepetitionTarget; + + if (random % 100 < percentRepetitionTarget) { nTargetInTrial++; } + m_repetTarget[i] = nTargetInTrial; + } + m_trialDuration = nTargetInTrial * (m_repetDuration + m_interRepetitionDuration) + + (m_repetitionCountInTrial - nTargetInTrial) * (m_repetDurationWithoutTarget + m_interRepetitionDuration); + m_repetIdx = 0; + m_targetNum = -1; +} + +int64_t CBoxAlgorithmP300IdentifierStimulator::getCurrentTimeInRepetition(const uint64_t timeInTrial) +{ + if (m_repetIdx == 0) { return -1; } + const int64_t timeInRepetition = timeInTrial - m_repetDuration * m_repetTarget[m_repetIdx - 1] + - m_repetDurationWithoutTarget * (m_repetIdx - m_repetTarget[m_repetIdx - 1]) + - m_interRepetitionDuration * m_repetIdx; + //case of the current time in Repetition is out of the current Repetition time + if (timeInRepetition > 0) + { + generateSequence(); + return getCurrentTimeInRepetition(timeInTrial); + } + return timeInRepetition + m_interRepetitionDuration + (m_repetWithoutTarget ? m_repetDurationWithoutTarget : m_repetDuration); +} +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmP300IdentifierStimulator.h b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmP300IdentifierStimulator.h new file mode 100644 index 0000000..09d7809 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmP300IdentifierStimulator.h @@ -0,0 +1,126 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { +class CBoxAlgorithmP300IdentifierStimulator final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + uint64_t getClockFrequency() override { return 128LL << 32; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + bool reset(); + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_P300IdentifierStimulator) + +protected: + enum class EStates { None, Flash, NoFlash, RepetitionRest, TrialRest, ExperimentStop }; + + uint64_t m_startStimulation = 0; + uint64_t m_stimulationBase = 0; + + size_t m_nImages = 0; + + double m_percentRepetitionTarget = 0; + + size_t m_repetitionCountInTrial = 0; + size_t m_nTrial = 0; + uint64_t m_flashDuration = 0; + uint64_t m_noFlashDuration = 0; + uint64_t m_interRepetitionDuration = 0; + uint64_t m_interTrialDuration = 0; + + // bool m_avoidNeighborFlashing = false; + + Kernel::IAlgorithmProxy* m_encoder = nullptr; + Kernel::IAlgorithmProxy* m_decoder = nullptr; + Kernel::IAlgorithmProxy* m_targetDecoder = nullptr; + uint64_t m_lastTime = 0; + bool m_headerSent = false; + bool m_startReceived = false; + + EStates m_lastState = EStates::None; + uint64_t m_trialStartTime = 0; + + size_t m_nFlashInRepet = 0; + size_t m_nFlashInRepetWithoutTarget = 0; + uint64_t m_repetDuration = 0; + uint64_t m_repetDurationWithoutTarget = 0; + uint64_t m_trialDuration = 0; + size_t m_trialIdx = 0; + + bool m_repetWithoutTarget = false; //true if the repetition doesn't contains the target + + uint64_t m_repetIdx = 0; + int64_t m_targetNum = 0; + + uint64_t* m_repetTarget = nullptr; //for every Repetition of one trial indicate the number of target should see for the begin of the trial + std::vector m_images; + + void generateSequence(); + void generateTrialVars(); + int64_t getCurrentTimeInRepetition(uint64_t timeInTrial); +}; + +class CBoxAlgorithmP300IdentifierStimulatorDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("P300 Identifier Stimulator"); } + CString getAuthorName() const override { return CString("Baptiste Payan"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Generates a P300 stimulation sequence"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stimulation"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-select-font"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_P300IdentifierStimulator; } + IPluginObject* create() override { return new CBoxAlgorithmP300IdentifierStimulator; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Incoming stimulations", OV_TypeId_Stimulations); + prototype.addOutput("Produced stimulations", OV_TypeId_Stimulations); + prototype.addInput("Target Stimulations", OV_TypeId_Stimulations); + + prototype.addSetting("Start stimulation", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00"); + prototype.addSetting("Stimulation base", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_01"); + + prototype.addSetting("Number of identifiable objects", OV_TypeId_Integer, "6"); + + prototype.addSetting("Percent of repetitions containing the target", OV_TypeId_Float, "100"); + + prototype.addSetting("Number of repetitions", OV_TypeId_Integer, "5"); + prototype.addSetting("Number of trials", OV_TypeId_Integer, "5"); + prototype.addSetting("Flash duration (in sec)", OV_TypeId_Float, "0.075"); + prototype.addSetting("No flash duration (in sec)", OV_TypeId_Float, "0.125"); + prototype.addSetting("Inter-repetition delay (in sec)", OV_TypeId_Float, "2"); + prototype.addSetting("Inter-trial delay (in sec)", OV_TypeId_Float, "5"); + + // prototype.addSetting("Avoid neighbor flashing", OV_TypeId_Boolean, "false"); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_P300IdentifierStimulatorDesc) +}; +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmP300SpellerStimulator.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmP300SpellerStimulator.cpp new file mode 100644 index 0000000..f9aef73 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmP300SpellerStimulator.cpp @@ -0,0 +1,378 @@ +// +// @todo the code logic in process() should be simplified and made more clear, perhaps by adding more states to the machine +// +#include "ovpCBoxAlgorithmP300SpellerStimulator.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + +/* +CString toString(const EStates state) +{ + switch (state) + { + case EStates::None: return "None"; + case EStates::Flash: return "Flash"; + case EStates::NoFlash: return "NoFlash"; + case EStates::RepetitionRest: return "RepetitionRest"; + case EStates::TrialRest: return "TrialRest"; + default: return "unknown"; + } +} +*/ + +bool CBoxAlgorithmP300SpellerStimulator::initialize() +{ + m_decoder = nullptr; + m_encoder = nullptr; + + m_startStimulation = this->getTypeManager().getEnumerationEntryValueFromName( + OV_TypeId_Stimulation, FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)); + m_rowStimulationBase = this->getTypeManager().getEnumerationEntryValueFromName( + OV_TypeId_Stimulation, FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1)); + m_columnStimulationBase = this->getTypeManager().getEnumerationEntryValueFromName( + OV_TypeId_Stimulation, FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2)); + + m_nRow = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + m_nCol = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + + if (m_nRow == 0 || m_nCol == 0) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "This stimulator should at least have 1 row and 1 column (got " << m_nRow << " and " << + m_nCol << "\n"; + return false; + } + + if (m_nRow != m_nCol) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "This stimulator should have the same number of row(s) and columns(s) (got " << m_nRow << + " and " << m_nCol << "\n"; + return false; + } + + m_nRepetInTrial = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5); + m_nTrial = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 6); + m_flashDuration = CTime(double(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 7))).time(); + m_noFlashDuration = CTime(double(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 8))).time(); + m_interRepetDuration = CTime(double(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 9))).time(); + m_interTrialDuration = CTime(double(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 10))).time(); + + m_avoidNeighborFlashing = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 11); + + const uint64_t durationThreshold = (10LL << 32) / 1000; // 10ms + if (m_interRepetDuration < durationThreshold) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Inter repetition duration should not be less than 10 ms\n"; + m_interRepetDuration = durationThreshold; + } + + if (m_interTrialDuration < durationThreshold) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Inter trial duration should not be less than 10 ms\n"; + m_interTrialDuration = durationThreshold; + } + + if (m_avoidNeighborFlashing) { this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Avoid neighbor flashing setting is not considered yet\n"; } + + // ---------------------------------------------------------------------------------------------------------------------------------------------------------- + + m_encoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationEncoder)); + m_encoder->initialize(); + + m_decoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_decoder->initialize(); + + m_lastTime = 0; + m_headerSent = false; + m_startReceived = false; + + m_lastState = EStates::None; + m_trialStartTime = m_interTrialDuration; + + m_nFlashInRepet = m_nRow + m_nCol; + m_repetDuration = m_nFlashInRepet * (m_flashDuration + m_noFlashDuration); + m_trialDuration = m_nRepetInTrial * (m_repetDuration + m_interRepetDuration); + m_trialIdx = 1; + + this->generateSequence(); + return true; +} + +bool CBoxAlgorithmP300SpellerStimulator::uninitialize() +{ + if (m_decoder) + { + m_decoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_decoder); + m_decoder = nullptr; + } + + if (m_encoder) + { + m_encoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_encoder); + m_encoder = nullptr; + } + + return true; +} + +bool CBoxAlgorithmP300SpellerStimulator::processInput(const size_t /*index*/) +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + if (!m_startReceived) + { + Kernel::TParameterHandler ip_buffer( + m_decoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + const Kernel::TParameterHandler op_stimSet( + m_decoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + ip_buffer = boxContext.getInputChunk(0, i); + m_decoder->process(); + + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) { } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + for (size_t j = 0; j < op_stimSet->getStimulationCount(); ++j) + { + if (op_stimSet->getStimulationIdentifier(j) == m_startStimulation) + { + m_trialStartTime = op_stimSet->getStimulationDate(j) + m_interTrialDuration; + m_startReceived = true; + } + } + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd)) { } + } + + boxContext.markInputAsDeprecated(0, i); + } + + return true; +} + +bool CBoxAlgorithmP300SpellerStimulator::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} + +bool CBoxAlgorithmP300SpellerStimulator::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + const uint64_t currentTime = this->getPlayerContext().getCurrentTime(); + CStimulationSet stimulationSet; + + if (m_startReceived) + { + EStates state = EStates::NoFlash; + size_t flashIndex = size_t(-1); + if (currentTime < m_trialStartTime) { state = EStates::TrialRest; } + else + { + if ((m_trialIdx > m_nTrial) && (m_nTrial > 0)) { state = EStates::ExperimentStop; } + else + { + const uint64_t curTimeInTrial = currentTime - m_trialStartTime; + const uint64_t curTimeInRepet = curTimeInTrial % (m_repetDuration + m_interRepetDuration); + + // FIXME is it necessary to keep next line uncomment ? + //size_t repritionIndexInTrial = currentTimeInTrial/(m_repetDuration+m_interRepetDuration); + const size_t flashIndexInRepet = curTimeInRepet / (m_flashDuration + m_noFlashDuration); + + flashIndex = flashIndexInRepet; + // FIXME is it necessary to keep next line uncomment ? + //repetitionIdx = repritionIndexInTrial; + + if (curTimeInTrial >= m_trialDuration) + { + if (m_nTrial == 0 || m_trialIdx <= m_nTrial) + { + m_trialStartTime = currentTime + m_interTrialDuration; + state = EStates::TrialRest; + flashIndex = size_t(-1); + // FIXME is it necessary to keep next line uncomment ? + //repetitionIdx = size_t(-1); + m_trialIdx++; + } + else + { + m_trialStartTime = currentTime + m_interTrialDuration; + state = EStates::None; + } + } + else + { + if (curTimeInRepet >= m_repetDuration) + { + state = EStates::RepetitionRest; + flashIndex = size_t(-1); + } + else + { + if (curTimeInRepet % (m_flashDuration + m_noFlashDuration) < m_flashDuration) { state = EStates::Flash; } + else { state = EStates::NoFlash; } + } + } + } + } + + if (state != m_lastState) + { + const bool bRow = ((flashIndex & 1) == 1); + const long row = long(bRow ? m_rows[flashIndex >> 1] : -1); + const long col = long(bRow ? -1 : m_columns[flashIndex >> 1]); + + switch (m_lastState) + { + case EStates::Flash: + stimulationSet.appendStimulation(OVTK_StimulationId_VisualStimulationStop, currentTime, 0); + //this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_VisualStimulationStop\n"; + break; + + case EStates::NoFlash: + break; + + case EStates::RepetitionRest: + if (state != EStates::TrialRest && state != EStates::None) + { + stimulationSet.appendStimulation(OVTK_StimulationId_SegmentStart, currentTime, 0); + //this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_SegmentStart\n"; + } + break; + + case EStates::TrialRest: + if (m_trialIdx <= m_nTrial) + { + stimulationSet.appendStimulation(OVTK_StimulationId_RestStop, currentTime, 0); + //this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_RestStop\n"; + stimulationSet.appendStimulation(OVTK_StimulationId_TrialStart, currentTime, 0); + //this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_TrialStart\n"; + stimulationSet.appendStimulation(OVTK_StimulationId_SegmentStart, currentTime, 0); + //this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_SegmentStart\n"; + } + break; + + case EStates::None: + if (m_trialIdx <= m_nTrial) + { + stimulationSet.appendStimulation(OVTK_StimulationId_ExperimentStart, currentTime, 0); + //this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_ExperimentStart\n"; + } + break; + + default: + break; + } + + switch (state) + { + case EStates::Flash: + stimulationSet.appendStimulation(bRow ? m_rowStimulationBase + row : m_columnStimulationBase + col, currentTime, 0); + //this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_LabelId(x)\n"; + stimulationSet.appendStimulation(OVTK_StimulationId_VisualStimulationStart, currentTime, 0); + //this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_VisualStimulationStart\n"; + break; + + case EStates::NoFlash: + break; + + case EStates::RepetitionRest: + stimulationSet.appendStimulation(OVTK_StimulationId_SegmentStop, currentTime, 0); + //this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_SegmentStop\n"; + this->generateSequence(); + break; + + case EStates::TrialRest: + if (m_lastState != EStates::None) + { + if (m_lastState != EStates::RepetitionRest) + { + stimulationSet.appendStimulation(OVTK_StimulationId_SegmentStop, currentTime, 0); + //this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_SegmentStop\n"; + } + stimulationSet.appendStimulation(OVTK_StimulationId_TrialStop, currentTime, 0); + //this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_TrialStop\n"; + } + if (m_trialIdx <= m_nTrial) + { + stimulationSet.appendStimulation(OVTK_StimulationId_RestStart, currentTime, 0); + //this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_RestStart\n"; + } + break; + + case EStates::None: + if (m_lastState != EStates::RepetitionRest) + { + stimulationSet.appendStimulation(OVTK_StimulationId_SegmentStop, currentTime, 0); + //this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_SegmentStop\n"; + } + stimulationSet.appendStimulation(OVTK_StimulationId_TrialStop, currentTime, 0); + //this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_TrialStop\n"; + break; + case EStates::ExperimentStop: + // The experiment stop is sent with some delay to allow the last flash / letter to be processed gracefully by the DSP later + stimulationSet.appendStimulation(OVTK_StimulationId_ExperimentStop, currentTime + CTime(3.0).time(), 0); + //this->getLogManager() << Kernel::LogLevel_Trace << "sends OVTK_StimulationId_ExperimentStop\n"; + break; + + default: break; + } + + m_lastState = state; + } + } + + Kernel::TParameterHandler ip_stimSet(m_encoder->getInputParameter(OVP_GD_Algorithm_StimulationEncoder_InputParameterId_StimulationSet)); + Kernel::TParameterHandler op_buffer( + m_encoder->getOutputParameter(OVP_GD_Algorithm_StimulationEncoder_OutputParameterId_EncodedMemoryBuffer)); + ip_stimSet = &stimulationSet; + op_buffer = boxContext.getOutputChunk(0); + if (!m_headerSent) + { + m_encoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeHeader); + boxContext.markOutputAsReadyToSend(0, m_lastTime, currentTime); + } + if (m_lastTime != currentTime) + { + m_encoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(0, m_lastTime, currentTime); + } + m_lastTime = currentTime; + m_headerSent = true; + + return true; +} + +void CBoxAlgorithmP300SpellerStimulator::generateSequence() +{ + std::vector rows; + m_rows.clear(); + for (size_t i = 0; i < m_nRow; ++i) { rows.push_back(i); } + for (size_t i = 0; i < m_nRow; ++i) + { + const size_t j = rand() % rows.size(); + m_rows[i] = rows[j]; + rows.erase(rows.begin() + j); + } + + std::vector cols; + m_columns.clear(); + for (size_t i = 0; i < m_nCol; ++i) { cols.push_back(i); } + for (size_t i = 0; i < m_nCol; ++i) + { + const size_t j = rand() % cols.size(); + m_columns[i] = cols[j]; + cols.erase(cols.begin() + j); + } +} +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmP300SpellerStimulator.h b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmP300SpellerStimulator.h new file mode 100644 index 0000000..404d87c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmP300SpellerStimulator.h @@ -0,0 +1,113 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { +class CBoxAlgorithmP300SpellerStimulator final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + uint64_t getClockFrequency() override { return 128LL << 32; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_P300SpellerStimulator) + +protected: + + enum class EStates { None, Flash, NoFlash, RepetitionRest, TrialRest, ExperimentStop }; + + uint64_t m_startStimulation = 0; + uint64_t m_rowStimulationBase = 0; + uint64_t m_columnStimulationBase = 0; + + size_t m_nRow = 0; + size_t m_nCol = 0; + + size_t m_nRepetInTrial = 0; + size_t m_nTrial = 0; + uint64_t m_flashDuration = 0; + uint64_t m_noFlashDuration = 0; + uint64_t m_interRepetDuration = 0; + uint64_t m_interTrialDuration = 0; + + bool m_avoidNeighborFlashing = false; + + Kernel::IAlgorithmProxy* m_encoder = nullptr; + Kernel::IAlgorithmProxy* m_decoder = nullptr; + uint64_t m_lastTime = 0; + bool m_headerSent = false; + bool m_startReceived = false; + + EStates m_lastState = EStates::None; + uint64_t m_trialStartTime = 0; + + size_t m_nFlashInRepet = 0; + uint64_t m_repetDuration = 0; + uint64_t m_trialDuration = 0; + size_t m_trialIdx = 0; + + std::map m_rows; + std::map m_columns; + + void generateSequence(); +}; + +class CBoxAlgorithmP300SpellerStimulatorDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("P300 Speller Stimulator"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Generates a stimulation sequence suitable for a P300 speller"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stimulation"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-select-font"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_P300SpellerStimulator; } + IPluginObject* create() override { return new CBoxAlgorithmP300SpellerStimulator; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Incoming stimulations", OV_TypeId_Stimulations); + prototype.addOutput("Produced stimulations", OV_TypeId_Stimulations); + + prototype.addSetting("Start stimulation", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00"); + prototype.addSetting("Row stimulation base", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_01"); + prototype.addSetting("Column stimulation base", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_07"); + + prototype.addSetting("Number of rows", OV_TypeId_Integer, "6"); + prototype.addSetting("Number of columns", OV_TypeId_Integer, "6"); + + prototype.addSetting("Number of repetitions", OV_TypeId_Integer, "5"); + prototype.addSetting("Number of trials", OV_TypeId_Integer, "5"); + prototype.addSetting("Flash duration (in sec)", OV_TypeId_Float, "0.075"); + prototype.addSetting("No flash duration (in sec)", OV_TypeId_Float, "0.125"); + prototype.addSetting("Inter-repetition delay (in sec)", OV_TypeId_Float, "2"); + prototype.addSetting("Inter-trial delay (in sec)", OV_TypeId_Float, "5"); + + prototype.addSetting("Avoid neighbor flashing", OV_TypeId_Boolean, "false"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_P300SpellerStimulatorDesc) +}; +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmRunCommand.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmRunCommand.cpp new file mode 100644 index 0000000..85469e1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmRunCommand.cpp @@ -0,0 +1,90 @@ +#include "ovpCBoxAlgorithmRunCommand.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + +bool CBoxAlgorithmRunCommand::initialize() +{ + m_decoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_decoder->initialize(); + ip_buffer.initialize(m_decoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + op_stimSet.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + + const size_t nSetting = this->getStaticBoxContext().getSettingCount(); + for (size_t i = 0; i < nSetting; i += 2) + { + m_commands[uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i))]. + push_back(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i + 1)); + } + + return true; +} + +bool CBoxAlgorithmRunCommand::uninitialize() +{ + op_stimSet.uninitialize(); + ip_buffer.uninitialize(); + m_decoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_decoder); + + return true; +} + +bool CBoxAlgorithmRunCommand::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmRunCommand::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + ip_buffer = boxContext.getInputChunk(0, i); + m_decoder->process(); + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) { } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + IStimulationSet* stimSet = op_stimSet; + for (size_t j = 0; j < stimSet->getStimulationCount(); ++j) + { + uint64_t stimulationID = stimSet->getStimulationIdentifier(j); + if (m_commands.find(stimulationID) != m_commands.end()) + { + std::vector& command = m_commands[stimulationID]; + auto it = command.begin(); + while (it != command.end()) + { + CString str = *it; +#if defined(WIN32) + // On Windows, we pad the call with quotes. This addresses the situation where both the + // command and some of its arguments have spaces, e.g. the call being like + // + // "C:\Program Files\blah.exe" --something "C:\Program Files\duh.dat" + // + // Without padding the whole line with quotes, it doesn't seem work. + str = CString("\"") + str + CString("\""); +#else + // On other platforms, we pass the call as-is. We cannot pad the call in the scenario as the + // Linux shell - on the other hand - doesn't like calls like ""blah blah" "blah"" +#endif + this->getLogManager() << Kernel::LogLevel_Debug << "Running command [" << str << "]\n"; + if (system(str.toASCIIString()) < 0) { this->getLogManager() << Kernel::LogLevel_Warning << "Could not run command " << str << "\n"; } + ++it; + } + } + } + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd)) { } + boxContext.markInputAsDeprecated(0, i); + } + + return true; +} +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmRunCommand.h b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmRunCommand.h new file mode 100644 index 0000000..2dbecc2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmRunCommand.h @@ -0,0 +1,110 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { +class CBoxAlgorithmRunCommand final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_RunCommand) + +protected: + + Kernel::IAlgorithmProxy* m_decoder = nullptr; + Kernel::TParameterHandler ip_buffer; + Kernel::TParameterHandler op_stimSet; + std::map> m_commands; +}; + +class CBoxAlgorithmRunCommandListener final : public Toolkit::TBoxListener +{ +public: + + bool check(Kernel::IBox& box) const + { + for (size_t i = 0; i < box.getSettingCount(); i += 2) + { + box.setSettingName(i, ("Stimulation " + std::to_string(i / 2 + 1)).c_str()); + box.setSettingType(i, OV_TypeId_Stimulation); + box.setSettingName(i + 1, ("Command " + std::to_string(i / 2 + 1)).c_str()); + box.setSettingType(i + 1, OV_TypeId_String); + } + return true; + } + + bool onSettingAdded(Kernel::IBox& box, const size_t index) override + { + std::stringstream ss; + ss.fill('0'); + ss << std::setw(2) << size_t(index / 2 + 1); + const CString name(ss.str().c_str()); + box.setSettingDefaultValue(index, name); + box.setSettingValue(index, name); + box.addSetting("", OV_TypeId_String, ""); + this->check(box); + return true; + } + + bool onSettingRemoved(Kernel::IBox& box, const size_t index) override + { + box.removeSetting((index / 2) * 2); + this->check(box); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmRunCommandDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Run Command"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + + CString getShortDescription() const override { return CString("Runs some command using system call depending on provided stimulations"); } + + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stimulation"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-execute"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_RunCommand; } + IPluginObject* create() override { return new CBoxAlgorithmRunCommand; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmRunCommandListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Stimulations", OV_TypeId_Stimulations); + prototype.addSetting("Stimulation 1", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_01"); + prototype.addSetting("Command 1", OV_TypeId_String, ""); + prototype.addFlag(Kernel::BoxFlag_CanAddSetting); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_RunCommandDesc) +}; +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCKeyboardStimulator.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCKeyboardStimulator.cpp new file mode 100644 index 0000000..be4fd65 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCKeyboardStimulator.cpp @@ -0,0 +1,230 @@ +#if defined(TARGET_HAS_ThirdPartyGTK) + +#include "ovpCKeyboardStimulator.h" + +#include +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + +//! Callback for the close window button +//static void keyboard_stimulator_gtk_widget_do_nothing(GtkWidget* widget) { } + +// Called when a key is pressed on the keyboard +static gboolean key_press_cb(GtkWidget* /*widget*/, GdkEventKey* thisEvent, gpointer data) +{ + reinterpret_cast(data)->processKey(thisEvent->keyval, true); + return true; +} + +// Called when a key is released on the keyboard +static gboolean key_release_cb(GtkWidget* /*widget*/, GdkEventKey* thisEvent, gpointer data) +{ + reinterpret_cast(data)->processKey(thisEvent->keyval, false); + return true; +} + +/** + * Called when a key has been pressed. + * \param key The gdk value to the pressed key. + * \param state state of the pressed key + * */ +void CKeyboardStimulator::processKey(const guint key, const bool state) +{ + //if there is one entry, adds the stimulation to the list of stims to be sent + if (m_keyToStimulation.count(key) != 0 && state != m_keyToStimulation[key].status) + { + if (state) + { + // getLogManager() << Kernel::LogLevel_Trace << "Pressed key code " << (size_t)key << "\n"; + m_stimulusSender->sendStimulation(m_keyToStimulation[key].press); + m_stimulationToSend.push_back(m_keyToStimulation[key].press); + } + else + { + // getLogManager() << Kernel::LogLevel_Trace << "Released key code " << (size_t)key << "\n"; + m_stimulusSender->sendStimulation(m_keyToStimulation[key].release); + m_stimulationToSend.push_back(m_keyToStimulation[key].release); + } + m_keyToStimulation[key].status = state; + } + else + { + // this->getLogManager() << Kernel::LogLevel_Warning << "Unhandled key code " << (size_t)key << "\n"; + m_unknownKeyPressed = true; + m_unknownKeyCode = size_t(key); + } +} + +/** + * Parse the configuration file and creates the Key/Stimulation associations. + * \param filename The name of the configuration file. + * \return True if the file was correctly parsed. + * */ +bool CKeyboardStimulator::parseConfigurationFile(const char* filename) +{ + std::ifstream file; + file.open(filename); + + if (!file) { return false; } + + std::string keyName, stimPress, stimRelease; + + //reads all the couples key name/stim + while (!file.eof() && !file.fail()) + { + file >> keyName >> stimPress >> stimRelease; + + key_t key; + key.press = 0; + key.release = 0; + key.status = false; + + // MAY CAUSE ENDIANNESS PROBLEMS ! + sscanf(stimPress.c_str(), "0x%08llx", &key.press); + sscanf(stimRelease.c_str(), "0x%08llx", &key.release); + + m_keyToStimulation[gdk_keyval_from_name(keyName.c_str())] = key; + } + + file.close(); + + return true; +} + +bool CKeyboardStimulator::initialize() +{ + // Parses box settings to find input file's name + const CString fileName = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + //CString tcpTaggingHostAddress = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + //CString tcpTaggingHostPort = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + const CString tcpTaggingHostAddress("localhost"); + const CString tcpTaggingHostPort("15361"); + + if (!parseConfigurationFile(fileName.toASCIIString())) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Warning << "Problem while parsing configuration file!\n"; + m_error = true; + return false; + } + + m_encoder.initialize(*this, 0); + + //const std::string red("#602020"); + const std::string green("#206020"); + const std::string blue("#202060"); + + std::stringstream ss; + ss << "\nUse your keyboard to send stimulations\nAvailable keys are :\n\n"; + for (auto i = m_keyToStimulation.begin(); i != m_keyToStimulation.end(); ++i) + { + ss << "\t"; + ss << "" << gdk_keyval_name(i->first) << ""; + ss << "\t"; + ss << "Pressed : " + << this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, i->second.press) << ""; + ss << "\t"; + ss << "Released : " + << this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, i->second.release) << ""; + ss << "\t\n"; + } + + GtkBuilder* builder = + gtk_builder_new(); // glade_xml_new(Directories::getDataDir() + "/plugins/stimulation/keyboard-stimulator.ui", nullptr, nullptr); + gtk_builder_add_from_file(builder, Directories::getDataDir() + "/plugins/stimulation/keyboard-stimulator.ui", nullptr); + gtk_builder_connect_signals(builder, nullptr); + + m_widget = GTK_WIDGET(gtk_builder_get_object(builder, "keyboard_stimulator-eventbox")); + + gtk_label_set_markup(GTK_LABEL(gtk_builder_get_object(builder, "keyboard_stimulator-label")), ss.str().c_str()); + + g_signal_connect(m_widget, "key-press-event", G_CALLBACK(key_press_cb), this); + g_signal_connect(m_widget, "key-release-event", G_CALLBACK(key_release_cb), this); + g_object_unref(builder); + + m_visualizationCtx = dynamic_cast(this->createPluginObject(OVP_ClassId_Plugin_VisualizationCtx)); + m_visualizationCtx->setWidget(*this, m_widget); + + //TCP TAGGING + m_stimulusSender = TCPTagging::CreateStimulusSender(); + if (!m_stimulusSender->connect(tcpTaggingHostAddress, tcpTaggingHostPort) && tcpTaggingHostAddress.toASCIIString()[0] != 0) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Unable to connect to AS's TCP Tagging plugin, stimuli wont be forwarded.\n"; + } + + return true; +} + +bool CKeyboardStimulator::uninitialize() +{ + if (m_stimulusSender) + { + delete m_stimulusSender; + m_stimulusSender = nullptr; + } + + m_encoder.uninitialize(); + + if (m_widget) + { + g_object_unref(m_widget); + m_widget = nullptr; + } + + if (m_visualizationCtx) + { + this->releasePluginObject(m_visualizationCtx); + m_visualizationCtx = nullptr; + } + + return true; +} + +bool CKeyboardStimulator::processClock(Kernel::CMessageClock& msg) +{ + if (m_error) { return false; } + + if (m_unknownKeyPressed) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Unhandled key code " << m_unknownKeyCode << "\n"; + m_unknownKeyPressed = false; + } + + const uint64_t currentTime = msg.getTime(); + + if (currentTime == 0) + { + m_encoder.encodeHeader(); + getBoxAlgorithmContext()->getDynamicBoxContext()->markOutputAsReadyToSend(0, 0, 0); + } + + if (currentTime != m_previousActivationTime) + { + Kernel::IBoxIO* boxIO = getBoxAlgorithmContext()->getDynamicBoxContext(); + + IStimulationSet* stimulationSet = m_encoder.getInputStimulationSet(); + stimulationSet->clear(); // The encoder may retain the buffer from the previous round, clear it + + for (size_t i = 0; i < m_stimulationToSend.size(); ++i) { stimulationSet->appendStimulation(m_stimulationToSend[i], currentTime, 0); } + m_stimulationToSend.clear(); + + m_encoder.encodeBuffer(); + + boxIO->markOutputAsReadyToSend(0, m_previousActivationTime, currentTime); + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + } + + m_previousActivationTime = currentTime; + + return true; +} + +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCKeyboardStimulator.h b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCKeyboardStimulator.h new file mode 100644 index 0000000..030387f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCKeyboardStimulator.h @@ -0,0 +1,115 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyGTK) + +#include "../ovp_defines.h" + +#include +#include + +#include +#include + +#include +#include + +#include + +namespace TCPTagging { +class IStimulusSender; // fwd declare +} + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { +class CKeyboardStimulator final : public Toolkit::TBoxAlgorithm +{ +public: + + CKeyboardStimulator() { } + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + uint64_t getClockFrequency() override { return (32LL << 32); } + + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override { return true; } + + bool parseConfigurationFile(const char* filename); + void processKey(const guint key, const bool state); + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_KeyboardStimulator) + +protected: + Toolkit::TStimulationEncoder m_encoder; + + GtkWidget* m_widget = nullptr; + + typedef struct + { + uint64_t press; + uint64_t release; + bool status; + } key_t; + + //! Stores keyvalue/stimulation couples + std::map m_keyToStimulation; + + //! Vector of the stimulations to send when possible + std::vector m_stimulationToSend; + + //! Plugin's previous activation date + uint64_t m_previousActivationTime = 0; + + bool m_error = false; + + // TCP Tagging + TCPTagging::IStimulusSender* m_stimulusSender = nullptr; + + bool m_unknownKeyPressed = false; + size_t m_unknownKeyCode = 0; + + VisualizationToolkit::IVisualizationContext* m_visualizationCtx = nullptr; +}; + +/** +* Plugin's description +*/ +class CKeyboardStimulatorDesc final : public IBoxAlgorithmDesc +{ +public: + CString getName() const override { return CString("Keyboard stimulator"); } + CString getAuthorName() const override { return CString("Bruno Renier"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Stimulation generator"); } + CString getDetailedDescription() const override { return CString("Sends stimulations according to key presses"); } + CString getCategory() const override { return CString("Stimulation"); } + CString getVersion() const override { return CString("0.2"); } + void release() override { } + CIdentifier getCreatedClass() const override { return OVP_ClassId_KeyboardStimulator; } + IPluginObject* create() override { return new CKeyboardStimulator(); } + + bool hasFunctionality(const EPluginFunctionality functionality) const override { return functionality == EPluginFunctionality::Visualization; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addOutput("Outgoing Stimulations", OV_TypeId_Stimulations); + + prototype.addSetting("Filename", OV_TypeId_Filename, "${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt"); + // @note we don't want to expose these to the user as there is no latency correction in tcp tagging; its best to use localhost + // prototype.addSetting("TCP Tagging Host address", OV_TypeId_String, ""); + // prototype.addSetting("TCP Tagging Host port", OV_TypeId_Integer, "15361"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_KeyboardStimulatorDesc) +}; +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE + +#endif diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCSignChangeDetector.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCSignChangeDetector.cpp new file mode 100644 index 0000000..6b9e2e1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCSignChangeDetector.cpp @@ -0,0 +1,140 @@ +#include "ovpCSignChangeDetector.h" + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + +bool CSignChangeDetector::initialize() +{ + // we read the settings: + // The stimulations names: + const CString on = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + const CString off = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + m_onStimId = getTypeManager().getEnumerationEntryValueFromName(OV_TypeId_Stimulation, on); + m_offStimId = getTypeManager().getEnumerationEntryValueFromName(OV_TypeId_Stimulation, off); + + m_lastSample = 0; + m_firstSample = true; + + m_decoder.initialize(*this, 0); + m_encoder.initialize(*this, 0); + + m_channelIdx = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + if (m_channelIdx == 0) + { + this->getLogManager() << Kernel::LogLevel_Info << "Channel Index is 0. The channel indexing convention starts from 1.\n"; + return false; + } + m_channelIdx--; // Convert from [1,n] indexing to [0,n-1] indexing used later + + return true; +} + +bool CSignChangeDetector::uninitialize() +{ + m_encoder.uninitialize(); + m_decoder.uninitialize(); + + return true; +} + +bool CSignChangeDetector::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CSignChangeDetector::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + // Get a few convenience handles + const CMatrix* matrix = m_decoder.getOutputMatrix(); + IStimulationSet* stimSet = m_encoder.getInputStimulationSet(); + + // We decode the stream matrix + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + const uint64_t start = boxContext.getInputChunkStartTime(0, i); + const uint64_t end = boxContext.getInputChunkEndTime(0, i); + + m_decoder.decode(i); + + // if we received the header + if (m_decoder.isHeaderReceived()) + { + //we analyse the header (meaning the input matrix size) + if (matrix->getDimensionCount() != 2) + { + this->getLogManager() << Kernel::LogLevel_ImportantWarning << "Streamed matrix must have exactly 2 dimensions\n"; + return false; + } + if (m_channelIdx >= matrix->getDimensionSize(0)) + { + this->getLogManager() << Kernel::LogLevel_Info << "Channel Index out of bounds. Incoming matrix has fewer channels than specified index.\n"; + return false; + } + + m_samplesPerChannel = matrix->getDimensionSize(1); + + // we send a header on the stimulation output: + m_encoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, start, end); + } + + + // if we received a buffer + if (m_decoder.isBufferReceived()) + { + stimSet->clear(); + const double* data = matrix->getBuffer(); + // for each data sample of the buffer we look for sign change + + for (size_t j = 0; j < matrix->getDimensionSize(1); ++j) + { + const double currentSample = data[(m_channelIdx * m_samplesPerChannel) + j]; + if (m_firstSample) + { + m_lastSample = currentSample; + m_firstSample = false; + } + + // Change from positive to negative + if (m_lastSample >= 0 && currentSample < 0) + { + const uint64_t time = start + (end - start) * j / m_samplesPerChannel; + stimSet->appendStimulation(m_offStimId, time, 0); + } + + // Change from negative to positive + if (m_lastSample < 0 && currentSample >= 0) + { + const uint64_t time = start + (end - start) * j / m_samplesPerChannel; + stimSet->appendStimulation(m_onStimId, time, 0); + } + + m_lastSample = currentSample; + } + + m_encoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, start, end); + } + + // if we received the End + if (m_decoder.isEndReceived()) + { + // we send the End signal to the stimulation output: + m_encoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, start, end); + } + + // The stream matrix chunk i has been processed + boxContext.markInputAsDeprecated(0, i); + } + + return true; +} +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCSignChangeDetector.h b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCSignChangeDetector.h new file mode 100644 index 0000000..eb2cde7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/box-algorithms/ovpCSignChangeDetector.h @@ -0,0 +1,73 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { +class CSignChangeDetector final : virtual public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_SignChangeDetector) + +protected: + + Toolkit::TStreamedMatrixDecoder m_decoder; + Toolkit::TStimulationEncoder m_encoder; + + uint64_t m_onStimId = 0; + uint64_t m_offStimId = 0; + uint64_t m_channelIdx = 0; + uint64_t m_samplesPerChannel = 0; + double m_lastSample = 0; + bool m_firstSample = false; +}; + +class CSignChangeDetectorDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Sign Change Detector"); } + CString getAuthorName() const override { return CString("Joan Fruitet and Jozef Legeny"); } + CString getAuthorCompanyName() const override { return CString("Inria Sophia"); } + CString getShortDescription() const override { return CString("Detects the change of input's sign"); } + + CString getDetailedDescription() const override + { + return CString("Triggers a stimulation when one of the input's sign changes (input gets positive or negative"); + } + + CString getCategory() const override { return CString("Stimulation"); } + CString getVersion() const override { return CString("1.2"); } + CString getStockItemName() const override { return CString("gtk-missing-image"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_SignChangeDetector; } + IPluginObject* create() override { return new CSignChangeDetector; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Signal", OV_TypeId_StreamedMatrix); + prototype.addOutput("Generated stimulations", OV_TypeId_Stimulations); + prototype.addSetting("Sign switch to positive stimulation", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_01"); + prototype.addSetting("Sign switch to negative stimulation", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00"); + prototype.addSetting("Channel Index", OV_TypeId_Integer, "1"); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_SignChangeDetectorDesc) +}; +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/ovp_defines.h new file mode 100755 index 0000000..ef07071 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/ovp_defines.h @@ -0,0 +1,52 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_StimulationMultiplexer OpenViBE::CIdentifier(0x07DB4EFA, 0x472B0938) +#define OVP_ClassId_BoxAlgorithm_StimulationMultiplexerDesc OpenViBE::CIdentifier(0x79EF4E4D, 0x178F09E6) +#define OVP_ClassId_BoxAlgorithm_SoundPlayer OpenViBE::CIdentifier(0x18D06E9F, 0x68D43C23) +#define OVP_ClassId_BoxAlgorithm_SoundPlayerDesc OpenViBE::CIdentifier(0x246E5EC4, 0x127D21AA) +#define OVP_ClassId_BoxAlgorithm_StimulationVoter OpenViBE::CIdentifier(0x2BBD61FC, 0x041A4EDB) +#define OVP_ClassId_BoxAlgorithm_StimulationVoterDesc OpenViBE::CIdentifier(0x1C36287C, 0x6F143FBF) +#define OVP_ClassId_KeyboardStimulator OpenViBE::CIdentifier(0x00D317B9, 0x6324C3FF) +#define OVP_ClassId_KeyboardStimulatorDesc OpenViBE::CIdentifier(0x00E51ACD, 0x284CA2CF) +#define OVP_ClassId_BoxAlgorithm_P300IdentifierStimulator OpenViBE::CIdentifier(0x00F27FDB, 0x8203D1A5) +#define OVP_ClassId_BoxAlgorithm_P300IdentifierStimulatorDesc OpenViBE::CIdentifier(0x000F20CA, 0x2A4EA9C3) +#define OVP_ClassId_SignChangeDetector OpenViBE::CIdentifier(0x04FA78CD, 0xAFE45DE7) +#define OVP_ClassId_SignChangeDetectorDesc OpenViBE::CIdentifier(0x798ACD86, 0xEF1287A4) +#define OVP_ClassId_BoxAlgorithm_StimulationFilter OpenViBE::CIdentifier(0x02F96101, 0x5E647CB8) +#define OVP_ClassId_BoxAlgorithm_StimulationFilterDesc OpenViBE::CIdentifier(0x4D2A23FC, 0x28191E18) +#define OVP_ClassId_BoxAlgorithm_LuaStimulator OpenViBE::CIdentifier(0x0B5A2787, 0x02750621) +#define OVP_ClassId_BoxAlgorithm_LuaStimulatorDesc OpenViBE::CIdentifier(0x67AF36F3, 0x2B424F46) +#define OVP_ClassId_BoxAlgorithm_OpenALSoundPlayer OpenViBE::CIdentifier(0x7AC2396F, 0x7EE52EFE) +#define OVP_ClassId_BoxAlgorithm_OpenALSoundPlayerDesc OpenViBE::CIdentifier(0x6FD040EF, 0x7E2F1284) +#define OVP_ClassId_BoxAlgorithm_P300SpellerStimulator OpenViBE::CIdentifier(0x88857F9A, 0xF560D3EB) +#define OVP_ClassId_BoxAlgorithm_P300SpellerStimulatorDesc OpenViBE::CIdentifier(0xCEAFBB05, 0x5DA19DCB) +#define OVP_ClassId_BoxAlgorithm_RunCommand OpenViBE::CIdentifier(0x48843891, 0x7BFC57F4) +#define OVP_ClassId_BoxAlgorithm_RunCommandDesc OpenViBE::CIdentifier(0x29D449AE, 0x2CA94942) +#define OVP_ClassId_BoxAlgorithm_StimulationValidator OpenViBE::CIdentifier(0x393d15e9, 0x5b6f63b9) +#define OVP_ClassId_BoxAlgorithm_StimulationValidatorDesc OpenViBE::CIdentifier(0x553bdcca, 0xe66d09bf) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) + +#define OVP_TypeId_Voting_ClearVotes OpenViBE::CIdentifier(0x17AE30F8, 0x40B57661) +#define OVP_TypeId_Voting_ClearVotes_AfterOutput OpenViBE::CIdentifier(0x7FA81A20, 0x484023F9) +#define OVP_TypeId_Voting_ClearVotes_WhenExpires OpenViBE::CIdentifier(0x02766639, 0x00B155B4) +#define OVP_TypeId_Voting_OutputTime OpenViBE::CIdentifier(0x48583E8F, 0x47F22462) +#define OVP_TypeId_Voting_OutputTime_Vote OpenViBE::CIdentifier(0x2F37507F, 0x00C06761) +#define OVP_TypeId_Voting_OutputTime_Winner OpenViBE::CIdentifier(0x72416689, 0x17673658) +#define OVP_TypeId_Voting_OutputTime_Last OpenViBE::CIdentifier(0x4F2830DB, 0x716C2930) +#define OVP_TypeId_Voting_RejectClass_CanWin OpenViBE::CIdentifier(0x442F2F14, 0x7A17336C) +#define OVP_TypeId_Voting_RejectClass_CanWin_Yes OpenViBE::CIdentifier(0x40011974, 0x54BB3C71) +#define OVP_TypeId_Voting_RejectClass_CanWin_No OpenViBE::CIdentifier(0x275B746A, 0x480B302C) + + +#define OVP_TypeId_StimulationFilterAction OpenViBE::CIdentifier(0x09E59E57, 0x8D4A553A) +#define OVP_TypeId_StimulationFilterAction_Select OpenViBE::CIdentifier(0xBDBBA98D, 0xC0477399) +#define OVP_TypeId_StimulationFilterAction_Reject OpenViBE::CIdentifier(0xB7C594D2, 0x32474226) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/ovp_main.cpp new file mode 100755 index 0000000..ae61a47 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/src/ovp_main.cpp @@ -0,0 +1,67 @@ +#include "ovp_defines.h" + +#include "box-algorithms/ovpCKeyboardStimulator.h" +#include "box-algorithms/ovpCSignChangeDetector.h" + +#include "box-algorithms/ovpCBoxAlgorithmRunCommand.h" +#if defined TARGET_HAS_ThirdPartyLua +#include "box-algorithms/ovpCBoxAlgorithmLuaStimulator.h" +#endif // TARGET_HAS_ThirdPartyLua +#if defined TARGET_HAS_ThirdPartyOpenAL +#include "box-algorithms/ovpCBoxAlgorithmOpenALSoundPlayer.h" +#endif // TARGET_HAS_ThirdPartyOpenAL + +#include "box-algorithms/adaptation/ovpCBoxAlgorithmStimulationFilter.h" + +#include "box-algorithms/ovpCBoxAlgorithmP300SpellerStimulator.h" +#include "box-algorithms/ovpCBoxAlgorithmP300IdentifierStimulator.h" +#include "box-algorithms/CBoxAlgorithmStimulationValidator.hpp" + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + +OVP_Declare_Begin() + context.getTypeManager().registerEnumerationEntry(OV_TypeId_BoxAlgorithmFlag, OV_AttributeId_Box_FlagIsUnstable.toString(), + OV_AttributeId_Box_FlagIsUnstable.id()); + context.getTypeManager().registerEnumerationType(OVP_TypeId_StimulationFilterAction, "Stimulation Filter Action"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_StimulationFilterAction, "Select", OVP_TypeId_StimulationFilterAction_Select.id()); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_StimulationFilterAction, "Reject", OVP_TypeId_StimulationFilterAction_Reject.id()); + +#if defined(TARGET_HAS_ThirdPartyGTK) + OVP_Declare_New(CKeyboardStimulatorDesc); +#endif + + OVP_Declare_New(CSignChangeDetectorDesc); + + OVP_Declare_New(CBoxAlgorithmRunCommandDesc); +#if defined TARGET_HAS_ThirdPartyLua + OVP_Declare_New(CBoxAlgorithmLuaStimulatorDesc); +#endif // TARGET_HAS_ThirdPartyLua + +#if defined TARGET_HAS_ThirdPartyOpenAL + OVP_Declare_New(CBoxAlgorithmOpenALSoundPlayerDesc); +#endif // TARGET_HAS_ThirdPartyOpenAL + + OVP_Declare_New(CBoxAlgorithmStimulationFilterDesc); + + OVP_Declare_New(CBoxAlgorithmP300SpellerStimulatorDesc); + OVP_Declare_New(CBoxAlgorithmP300IdentifierStimulatorDesc); + + OVP_Declare_New(CBoxAlgorithmStimulationValidatorDesc); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_Voting_ClearVotes, "Clear votes"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Voting_ClearVotes, "When expires", OVP_TypeId_Voting_ClearVotes_WhenExpires.id()); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Voting_ClearVotes, "After output", OVP_TypeId_Voting_ClearVotes_AfterOutput.id()); + context.getTypeManager().registerEnumerationType(OVP_TypeId_Voting_OutputTime, "Output time"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Voting_OutputTime, "Time of voting", OVP_TypeId_Voting_OutputTime_Vote.id()); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Voting_OutputTime, "Time of last winning stimulus", OVP_TypeId_Voting_OutputTime_Winner.id()); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Voting_OutputTime, "Time of last voting stimulus", OVP_TypeId_Voting_OutputTime_Last.id()); + context.getTypeManager().registerEnumerationType(OVP_TypeId_Voting_RejectClass_CanWin, "Reject can win"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Voting_RejectClass_CanWin, "Yes", OVP_TypeId_Voting_RejectClass_CanWin_Yes.id()); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Voting_RejectClass_CanWin, "No", OVP_TypeId_Voting_RejectClass_CanWin_No.id()); + +OVP_Declare_End() +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/1secSinusOscillator.csv b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/1secSinusOscillator.csv new file mode 100644 index 0000000..59405b6 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/1secSinusOscillator.csv @@ -0,0 +1,34 @@ +Time:32Hz,Epoch,sinusOsc 1,Event Id,Event Date,Event Duration +0.0000000000,0,0.0000000000,,, +0.0312500000,1,1.3687341120,,, +0.0625000000,2,0.0834505686,,, +0.0937500000,3,1.3965074831,,, +0.1250000000,4,2.3460347303,,, +0.1562500000,5,0.6652579106,,, +0.1875000000,6,1.6342771847,,, +0.2187500000,7,2.0374036140,,, +0.2500000000,8,0.0223674799,,, +0.2812500000,9,0.8587778323,,, +0.3125000000,10,1.0605198516,,, +0.3437500000,11,-0.8527917255,,, +0.3750000000,12,0.2862985568,,, +0.4062500000,13,0.6745718556,,, +0.4375000000,14,-0.8460419110,,, +0.4687500000,15,0.7209285523,,, +0.5000000000,16,1.2564364343,,, +0.5312500000,17,-0.0631007468,,, +0.5625000000,18,1.5912609145,,, +0.5937500000,19,1.8564555014,,, +0.6250000000,20,0.3100244990,,, +0.6562500000,21,1.6531536145,,, +0.6875000000,22,1.3612667999,,, +0.7187500000,23,-0.5404879020,,, +0.7500000000,24,0.5189549878,,, +0.7812500000,25,-0.1244988728,,, +0.8125000000,26,-2.0249997390,,, +0.8437500000,27,-0.8135359478,,, +0.8750000000,28,-1.3302670931,,, +0.9062500000,29,-2.7774418870,,, +0.9375000000,30,-1.0731867792,,, +0.9687500000,31,-1.2560591950,,, +1.0000000000,32,-2.2082337379,,, diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/DartTestfile.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/DartTestfile.txt new file mode 100644 index 0000000..c856f01 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/DartTestfile.txt @@ -0,0 +1,54 @@ + +#basics definitions needed here +IF(WIN32) + SET(EXT cmd) + SET(OS_FLAGS "--no-pause") + SET(OS_SUFFIX "") +ELSE() + SET(EXT sh) + SET(OS_FLAGS "") + SET(OS_SUFFIX "-linux") +ENDIF() + + +# Simple Test of run-command box +SET(TEST_NAME test-run-command) +SET(SCENARIO_TO_TEST "${TEST_NAME}.xml") +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${TEST_NAME}.txt") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--invisible" "--play" ${SCENARIO_TO_TEST}) +ADD_TEST(exist_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "md5sum" "${TEST_NAME}.txt") + +## add some properties that help to debug +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) + +SET_TESTS_PROPERTIES(exist_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}}) +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}}) + + +# Test run command with spaces +# +# This construction is intended to test cases where run command box command has spaces +# in both executable path and some of the arguments. We use cmake script 'wrap' to get access to the stdout +# where the results are printed in this case. +SET(TEST_NAME run-command-with-spaces) +SET(SCENARIO_TO_TEST "${TEST_NAME}.xml") +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${TEST_NAME}.txt") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--invisible" "--no-session-management" "-d" "EXT" "${EXT}" "-d" "OUTFILE" "${TEST_NAME}.txt" "--play" ${SCENARIO_TO_TEST}) +ADD_TEST(compare_${TEST_NAME} "git" "diff" "--no-index" "--ignore-space-at-eol" "${TEST_NAME}${OS_SUFFIX}.ref.txt" "${TEST_NAME}.txt") + +## add some properties that help to debug +SET_TESTS_PROPERTIES(run_$ENV{OV_TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) +SET_TESTS_PROPERTIES(exist_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}}) +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}}) + +# Simple Test of timeout box +SET(TEST_NAME test-timeout) +SET(SCENARIO_TO_TEST "${TEST_NAME}.xml") +ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${TEST_NAME}.txt") +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--invisible" "--play" ${SCENARIO_TO_TEST}) +ADD_TEST(exist_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "md5sum" "${TEST_NAME}.txt") + +## add some properties that help to debug +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_LOGFILE}) +SET_TESTS_PROPERTIES(exist_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME}}) +SET_TESTS_PROPERTIES(run_${TEST_NAME} PROPERTIES DEPENDS clean_${TEST_NAME}}) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/run-command-with-spaces-linux.ref.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/run-command-with-spaces-linux.ref.txt new file mode 100644 index 0000000..65528de --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/run-command-with-spaces-linux.ref.txt @@ -0,0 +1,6 @@ +start +TestRunCommand Params: 1=has space 2= 3= 4= +TestRunCommand Params: 1=nospace 2= 3= 4= +TestRunCommand Params: 1=has space 2=two 3= 4= +TestRunCommand Params: 1= 2= 3= 4= +TestRunCommand Params: 1=arg1 2=arg2 3=arg3 4= diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/run-command-with-spaces.ref.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/run-command-with-spaces.ref.txt new file mode 100755 index 0000000..ac88ce7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/run-command-with-spaces.ref.txt @@ -0,0 +1,6 @@ +start +TestRunCommand Params: 1="has space" 2= 3= 4= +TestRunCommand Params: 1=nospace 2= 3= 4= +TestRunCommand Params: 1="has space" 2=two 3= 4= +TestRunCommand Params: 1= 2= 3= 4= +TestRunCommand Params: 1=arg1 2=arg2 3=arg3 4= diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/run-command-with-spaces.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/run-command-with-spaces.xml new file mode 100755 index 0000000..95d43d0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/run-command-with-spaces.xml @@ -0,0 +1,413 @@ + + 1 + openvibe + 2.0 + + + (0x000026b8, 0x00003463) + Run Command + (0x48843891, 0x7bfc57f4) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 1 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_00 + false + + + (0x79a9edeb, 0x245d83fc) + Command 1 + + echo start > ${OUTFILE} + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 2 + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_00 + false + + + (0x79a9edeb, 0x245d83fc) + Command 2 + + "${Player_ScenarioDirectory}/space test/echoparams.${EXT}" "has space" >> ${OUTFILE} + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 3 + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_00 + false + + + (0x79a9edeb, 0x245d83fc) + Command 3 + + "${Player_ScenarioDirectory}/space test/echoparams.${EXT}" nospace >> ${OUTFILE} + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 4 + OVTK_StimulationId_Label_04 + OVTK_StimulationId_Label_00 + false + + + (0x79a9edeb, 0x245d83fc) + Command 4 + + "${Player_ScenarioDirectory}/space test/echoparams.${EXT}" "has space" two >> ${OUTFILE} + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 5 + OVTK_StimulationId_Label_05 + OVTK_StimulationId_Label_00 + false + + + (0x79a9edeb, 0x245d83fc) + Command 5 + + "${Player_ScenarioDirectory}/space test/echoparams.${EXT}" >> ${OUTFILE} + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 6 + OVTK_StimulationId_Label_06 + OVTK_StimulationId_Label_00 + false + + + (0x79a9edeb, 0x245d83fc) + Command 6 + + "${Player_ScenarioDirectory}/space test/echoparams.${EXT}" arg1 arg2 arg3 >> ${OUTFILE} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 320.000000 + + + (0x4e7b798a, 0x183beafb) + (0xe44a71e7, 0x7964dd76) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 101 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01871d22) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004b2a, 0x00001be8) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 496.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 118 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0133a23e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00006d67, 0x00007b93) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 193.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 496.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xad100179, 0xa3c984ab) + 114 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0155437c) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x000078f5, 0x000049f4) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 1.0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 23 + + + (0x207c9054, 0x3c841b63) + 320.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xad100179, 0xa3c984ab) + 114 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0186214f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + + + (0x00004df8, 0x00001737) + + (0x00006d67, 0x00007b93) + 0 + + + (0x00004b2a, 0x00001be8) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 211 + + + (0x358ae8b5, 0x0f8bacd1) + 496 + + + (0x3f0a3b27, 0x570913d2) + 320 + + + (0x6267b5c5, 0x676e3e42) + 496 + + + + + (0x00005fbf, 0x0000288c) + + (0x000078f5, 0x000049f4) + 0 + + + (0x000026b8, 0x00003463) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 178 + + + (0x358ae8b5, 0x0f8bacd1) + 320 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 320 + + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x000037ad, 0x00007f7d)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00005418, 0x00006015)","index":0,"name":"Default tab","parentIdentifier":"(0x000037ad, 0x00007f7d)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000034e0, 0x000049ae)","index":0,"name":"Empty","parentIdentifier":"(0x00005418, 0x00006015)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/space test/echoparams.cmd b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/space test/echoparams.cmd new file mode 100755 index 0000000..29a95de --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/space test/echoparams.cmd @@ -0,0 +1,5 @@ +@ECHO OFF + +echo TestRunCommand Params: 1=%1 2=%2 3=%3 4=%4 + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/space test/echoparams.sh b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/space test/echoparams.sh new file mode 100755 index 0000000..d100a21 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/space test/echoparams.sh @@ -0,0 +1,4 @@ + +echo TestRunCommand Params: 1=$1 2=$2 3=$3 4=$4 + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/test-run-command.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/test-run-command.xml new file mode 100644 index 0000000..42ee5f7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/test-run-command.xml @@ -0,0 +1,311 @@ + + 1 + openvibe + 2.0 + + + (0x19fa74c1, 0x160aee69) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 2.0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x1fa963f5, 0x1a638cd4) + 27 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xad100179, 0xa3c984ab) + 129 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x231b81fc, 0x445bffb6) + Run Command + (0x48843891, 0x7bfc57f4) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 1 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_00 + false + + + (0x79a9edeb, 0x245d83fc) + Command 1 + + echo "" > test-run-command.txt + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x1fa963f5, 0x1a638cd4) + 42 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x4e7b798a, 0x183beafb) + (0xe44a71e7, 0x7964dd76) + + + (0x61d11811, 0x71e65362) + + + + (0xad100179, 0xa3c984ab) + 113 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x28da66fe, 0x38162acc) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x1fa963f5, 0x1a638cd4) + 27 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 134 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x3901841f, 0x09225d88) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 1.7 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x1fa963f5, 0x1a638cd4) + 27 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xad100179, 0xa3c984ab) + 129 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + + + (0x2034b137, 0x1bcbbbed) + + (0x3901841f, 0x09225d88) + 0 + + + (0x231b81fc, 0x445bffb6) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 212 + + + (0x358ae8b5, 0x0f8bacd1) + 416 + + + (0x3f0a3b27, 0x570913d2) + 230 + + + (0x6267b5c5, 0x676e3e42) + 416 + + + + + (0x49f08097, 0x6d1380fd) + + (0x19fa74c1, 0x160aee69) + 0 + + + (0x28da66fe, 0x38162acc) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 212 + + + (0x358ae8b5, 0x0f8bacd1) + 624 + + + (0x3f0a3b27, 0x570913d2) + 238 + + + (0x6267b5c5, 0x676e3e42) + 624 + + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":480,"identifier":"(0x340bed7a, 0x471c8a14)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":640},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x5898b888, 0x060a830d)","index":0,"name":"Default tab","parentIdentifier":"(0x340bed7a, 0x471c8a14)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x32c26df5, 0x73834e6c)","index":0,"name":"Empty","parentIdentifier":"(0x5898b888, 0x060a830d)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/test-timeout.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/test-timeout.xml new file mode 100644 index 0000000..c6d654e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/stimulation/test/test-timeout.xml @@ -0,0 +1,313 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x0000043c, 0x00007a2d) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Player_ScenarioDirectory}/1secSinusOscillator.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 176 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x0b41bcb4, 0x0c439291) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 176 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x20cd295d, 0x2db9393b) + Run Command + (0x48843891, 0x7bfc57f4) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation 1 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_00 + false + + + (0x79a9edeb, 0x245d83fc) + Command 1 + + echo "" > test-timeout.txt + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 176 + + + (0x4e7b798a, 0x183beafb) + (0xe44a71e7, 0x7964dd76) + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x2ebb6127, 0x59237986) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 3 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x72172d53, 0x4b1d2595) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x0000079e, 0x000057cc) + + (0x0000043c, 0x00007a2d) + 0 + + + (0x0b41bcb4, 0x0c439291) + 0 + + + + (0x03ccb08e, 0x02bf8b78) + + (0x0b41bcb4, 0x0c439291) + 0 + + + (0x20cd295d, 0x2db9393b) + 0 + + + + (0x585d2eff, 0x5d05ee38) + + (0x2ebb6127, 0x59237986) + 0 + + + (0x72172d53, 0x4b1d2595) + 0 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x6f314ae7, 0x32974c0d)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x53a9b4d7, 0x32eb1e3e)","index":0,"name":"Default tab","parentIdentifier":"(0x6f314ae7, 0x32974c0d)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x68454761, 0x4049650d)","index":0,"name":"Empty","parentIdentifier":"(0x53a9b4d7, 0x32eb1e3e)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/CMakeLists.txt new file mode 100644 index 0000000..0812f3c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/CMakeLists.txt @@ -0,0 +1,27 @@ +PROJECT(openvibe-plugins-streaming) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/box-tutorials/signal-merger.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/box-tutorials/signal-merger.xml new file mode 100644 index 0000000..8e08d59 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/box-tutorials/signal-merger.xml @@ -0,0 +1,458 @@ + + 1 + openvibe + 2.0 + + + (0x000013b7, 0x00000e7c) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 224.000000 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 208.000000 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xad100179, 0xa3c984ab) + 98 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005bbd61) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001929, 0x0000100f) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368.000000 + + + (0x1fa963f5, 0x1a638cd4) + 38 + + + (0x207c9054, 0x3c841b63) + 192.000000 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 113 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0056c09c) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000578b, 0x00007735) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112.000000 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 300.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xad100179, 0xa3c984ab) + 94 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00318da1) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x000074fc, 0x000027a1) + Sinus oscillator + (0x7e33bdb8, 0x68194a4a) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 2 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112.000000 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128.000000 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xad100179, 0xa3c984ab) + 121 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006a6788) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + + + (0x00003f6e, 0x000068c6) + + (0x0000578b, 0x00007735) + 0 + + + (0x000013b7, 0x00000e7c) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 131 + + + (0x358ae8b5, 0x0f8bacd1) + 300 + + + (0x3f0a3b27, 0x570913d2) + 200 + + + (0x6267b5c5, 0x676e3e42) + 215 + + + + + (0x0000631a, 0x0000208d) + + (0x000013b7, 0x00000e7c) + 0 + + + (0x00001929, 0x0000100f) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 249 + + + (0x358ae8b5, 0x0f8bacd1) + 208 + + + (0x3f0a3b27, 0x570913d2) + 344 + + + (0x6267b5c5, 0x676e3e42) + 177 + + + + + (0x0000669d, 0x00000659) + + (0x000074fc, 0x000027a1) + 0 + + + (0x000013b7, 0x00000e7c) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 131 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 200 + + + (0x6267b5c5, 0x676e3e42) + 200 + + + + + + + (0x000064dd, 0x000014fc) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 576.000000 + + + (0x7234b86b, 0x2b8651a5) + 272.000000 + + + + + (0x0000796d, 0x000000d2) + This scenario illustrates the use of the <b>Signal Merger</b> box. + +The box joins the two artificial signal channels coming from the +<i>Sinus Oscillator</i> box with the channel received from the +<i>Time Signal</i> box. + +Hence, the resulting merged stream will have three channels, +as is seen in the <i>Signal Display</i> during playback. + + + (0x473d9a43, 0x97fc0a97) + 560.000000 + + + (0x7234b86b, 0x2b8651a5) + 128.000000 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00001929, 0x0000100f)","childCount":0,"identifier":"(0x000032ed, 0x0000031b)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x0000571e, 0x00003d0d)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00000e7f, 0x0000035a)","index":0,"name":"Default tab","parentIdentifier":"(0x0000571e, 0x00003d0d)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00005068, 0x000070ce)","index":0,"name":"Empty","parentIdentifier":"(0x00000e7f, 0x0000035a)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/box-tutorials/stream-switch.xml b/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/box-tutorials/stream-switch.xml new file mode 100644 index 0000000..db22a5e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/box-tutorials/stream-switch.xml @@ -0,0 +1,710 @@ + + 2 + OpenViBE Designer + 2.1.0 + + + + + + (0x00000bdc, 0x00004cff) + Sinus oscillator + (0x7e33bdb8, 0x68194a4a) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 464 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00466aed) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + (0x00000dbf, 0x00007171) + Keyboard stimulator + (0x00d317b9, 0x6324c3ff) + + + (0x6f752dd0, 0x082a321e) + Outgoing Stimulations + + + + + (0x330306dd, 0x74a95f98) + Filename + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + ${Path_Data}/plugins/stimulation/simple-keyboard-to-stimulations.txt + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x4e7b798a, 0x183beafb) + (0x9b5dd008, 0x475a2ecd) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00754571) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00002be3, 0x00005993) + Press 'e' to display here + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a7836) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00002e22, 0x0000019c) + Press 'z' to display here + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0047be9d) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000365d, 0x00001035) + Press 'a' to display here + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Per channel + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Horizontal ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Vertical ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 187 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001dd520) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x0000526c, 0x00006191) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x5ba36127, 0x195feae1) + Output + + + (0x5ba36127, 0x195feae1) + Output(1) + + + (0x5ba36127, 0x195feae1) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006f8d45) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + + + (0x00000b89, 0x00004e7f) + + (0x00000bdc, 0x00004cff) + 0 + + + (0x0000526c, 0x00006191) + 1 + + + + (0x00001ab5, 0x00004be5) + + (0x0000526c, 0x00006191) + 2 + + + (0x00002be3, 0x00005993) + 0 + + + + (0x00003171, 0x00000231) + + (0x0000526c, 0x00006191) + 0 + + + (0x0000365d, 0x00001035) + 0 + + + + (0x00005dae, 0x000011fa) + + (0x0000526c, 0x00006191) + 1 + + + (0x00002e22, 0x0000019c) + 0 + + + + (0x000079c8, 0x00006d71) + + (0x00000dbf, 0x00007171) + 0 + + + (0x0000526c, 0x00006191) + 0 + + + + + + (0x0000118e, 0x00003ffa) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 368 + + + (0x7234b86b, 0x2b8651a5) + 480 + + + + + (0x00003b4a, 0x00005f19) + The <i>Signal Display</i> boxes display +the simulated signal. + + + (0x473d9a43, 0x97fc0a97) + 848.000000 + + + (0x7234b86b, 0x2b8651a5) + 416.000000 + + + + + (0x00004502, 0x00001ffb) + The <i><b>Stream Switch</b></i> box +redirects the Streamed Matrix input on a particular output. + +The Stimulation input drives the switch according to +the settings (one stimulation code per output). + + + (0x473d9a43, 0x97fc0a97) + 848 + + + (0x7234b86b, 0x2b8651a5) + 320 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":399,"identifier":"(0x000065f3, 0x00002deb)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":867},{"boxIdentifier":"(0x00000dbf, 0x00007171)","childCount":0,"identifier":"(0x00007dae, 0x000022d1)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000013d5, 0x00000671)","index":0,"name":"Default tab","parentIdentifier":"(0x000065f3, 0x00002deb)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":267,"identifier":"(0x00004bb9, 0x000050a3)","index":0,"maxDividerPosition":354,"name":"Vertical split","parentIdentifier":"(0x000013d5, 0x00000671)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":123,"identifier":"(0x00002c6f, 0x000018de)","index":0,"maxDividerPosition":251,"name":"Vertical split","parentIdentifier":"(0x00004bb9, 0x000050a3)","type":4},{"boxIdentifier":"(0x00002be3, 0x00005993)","childCount":0,"identifier":"(0x00007c56, 0x00003403)","index":1,"parentIdentifier":"(0x00004bb9, 0x000050a3)","type":3},{"boxIdentifier":"(0x0000365d, 0x00001035)","childCount":0,"identifier":"(0x00001138, 0x00001a07)","index":0,"parentIdentifier":"(0x00002c6f, 0x000018de)","type":3},{"boxIdentifier":"(0x00002e22, 0x0000019c)","childCount":0,"identifier":"(0x00000d64, 0x000024de)","index":1,"parentIdentifier":"(0x00002c6f, 0x000018de)","type":3}] + + + + + (0x790d75b8, 0x3bb90c33) + + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Stream Switch example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/doc/Doc_BoxAlgorithm_StreamSwitch.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/doc/Doc_BoxAlgorithm_StreamSwitch.dox-part new file mode 100644 index 0000000..11823bd --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/doc/Doc_BoxAlgorithm_StreamSwitch.dox-part @@ -0,0 +1,84 @@ +/** + * \page BoxAlgorithm_StreamSwitch Stream Switch +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StreamSwitch_Description| + The Stream Switch box redirects a Streamed Matrix input to one particular output according to stimulation received. Each output is triggered by a specific stimulation, detailed in the box settings. + + Warning: The Stream Switch box operates at chunk granularity. This means that the timing accuracy of this box depends on the chunk size you use (sample count per sent block, also changed by epoching). When the box receives a stimulation that is recognized as a switch trigger, the box will redirect the future chunks that start later than the stimulation timestamp to the desired output. The box will never switch the output stream in the middle of a chunk. For example, if your sampling rate is 512 and your chunk size is 32, then the first sample redirected can be one which is at most 32/512 = 0.0625s = 62.5ms later than the time requested by the stimulation timestamp. With low sampling rates and high chunk sizes, this delay before the box changes the stream output can be even seconds. Hence, we do not recommend using stream switch with its current implementation for use-cases where the first sample needs to be strictly immediately after or at the stimulation timestamp. For such usage, consider using the Stimulation Based Epoching box. + + Note 1: if the same stimulation is used by 2 or more outputs, only the first output will be activated when receiving the stimulation. + Note 2: at startup, none of the outputs is activated, unless 'Default to output 1' has been set to true in the box configuration. + * |OVP_DocEnd_BoxAlgorithm_StreamSwitch_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StreamSwitch_Inputs| + * |OVP_DocEnd_BoxAlgorithm_StreamSwitch_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_StreamSwitch_Input1| + Stimulations to switch from one output to another. + * |OVP_DocEnd_BoxAlgorithm_StreamSwitch_Input1| + + * |OVP_DocBegin_BoxAlgorithm_StreamSwitch_Input2| + The stream to redirect. It can be any Streamed Matrix subtype. + * |OVP_DocEnd_BoxAlgorithm_StreamSwitch_Input2| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StreamSwitch_Outputs| + The box can have 2 or more outputs, all have the same type as the input stream. + * |OVP_DocEnd_BoxAlgorithm_StreamSwitch_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_StreamSwitch_Output1| + The first possible output. + * |OVP_DocEnd_BoxAlgorithm_StreamSwitch_Output1| + + * |OVP_DocBegin_BoxAlgorithm_StreamSwitch_Output2| + The second possible output. + * |OVP_DocEnd_BoxAlgorithm_StreamSwitch_Output2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StreamSwitch_Settings| + The box has a stimulation setting for each of its outputs. Each such setting dictates the stimulation that activates the corresponding output. + * |OVP_DocEnd_BoxAlgorithm_StreamSwitch_Settings| + + * |OVP_DocBegin_BoxAlgorithm_StreamSwitch_Setting1| + If this flag is set to true, the box will output to the first channel by default without requiring a stimulus first. + * |OVP_DocEnd_BoxAlgorithm_StreamSwitch_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_StreamSwitch_Setting2| + The first possible switch trigger. + * |OVP_DocEnd_BoxAlgorithm_StreamSwitch_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_StreamSwitch_Setting3| + The second possible switch trigger. + * |OVP_DocEnd_BoxAlgorithm_StreamSwitch_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StreamSwitch_Examples| + The scenario stream-switch.xml in share/openvibe/scenarios/box-tutorials is a simple, commented example. + + The Stream Switch can be used in more complex situations as well, for example in an online classifier comparison scenario. The scenario motor-imagery-5-classifier-comparison.xml in share/openvibe/scenarios/bci-examples/motor-imagery is a commented example of such a situation. + * |OVP_DocEnd_BoxAlgorithm_StreamSwitch_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StreamSwitch_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_StreamSwitch_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmStreamedMatrixSwitch.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmStreamedMatrixSwitch.cpp new file mode 100644 index 0000000..3718209 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmStreamedMatrixSwitch.cpp @@ -0,0 +1,159 @@ +#include "ovpCBoxAlgorithmStreamedMatrixSwitch.h" + +namespace OpenViBE { +namespace Plugins { +namespace Streaming { + + +bool CBoxAlgorithmStreamedMatrixSwitch::initialize() +{ + // Getting the settings to build the map Stim code / output index + for (size_t i = 1; i < this->getStaticBoxContext().getSettingCount(); ++i) + { + const uint64_t stimCode = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i); + const size_t idx = i - 1; + if (!m_stimOutputIndexes.insert(std::make_pair(stimCode, idx)).second) + { + this->getLogManager() << Kernel::LogLevel_Warning << "The stimulation code [" + << this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, stimCode) << "] for the output [" + << idx << "] is already used by a previous output.\n"; + } + else + { + this->getLogManager() << Kernel::LogLevel_Trace << "The stimulation code [" + << this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, stimCode) << "] is registered for the output [" + << idx << "]\n"; + } + } + + const bool defaultToFirstOutput = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + if (defaultToFirstOutput) { m_activeOutputIdx = 0; } + else { m_activeOutputIdx = size_t(-1); } // At start, no output is active. + + // Stimulation stream decoder + m_stimDecoder.initialize(*this, 0); + m_lastStimInputChunkEndTime = 0; + + //initializing the decoder depending on the input type. + CIdentifier typeID; + this->getStaticBoxContext().getInputType(1, typeID); + + m_streamDecoder = nullptr; + + if (typeID == OV_TypeId_StreamedMatrix) { m_streamDecoder = new Toolkit::TStreamedMatrixDecoder(*this, 1); } + else if (typeID == OV_TypeId_Signal) { m_streamDecoder = new Toolkit::TSignalDecoder(*this, 1); } + else if (typeID == OV_TypeId_Spectrum) { m_streamDecoder = new Toolkit::TSpectrumDecoder(*this, 1); } + else if (typeID == OV_TypeId_FeatureVector) { m_streamDecoder = new Toolkit::TFeatureVectorDecoder(*this, 1); } + else if (typeID == OV_TypeId_ChannelLocalisation) { m_streamDecoder = new Toolkit::TChannelLocalisationDecoder(*this, 1); } + else if (typeID == OV_TypeId_Stimulations) { m_streamDecoder = new Toolkit::TStimulationDecoder(*this, 1); } + else if (typeID == OV_TypeId_ExperimentInfo) { m_streamDecoder = new Toolkit::TExperimentInfoDecoder(*this, 1); } + else if (typeID == OV_TypeId_ChannelUnits) { m_streamDecoder = new Toolkit::TChannelUnitsDecoder(*this, 1); } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Unsupported stream type " << this->getTypeManager().getTypeName(typeID) << " (" << typeID.str() << ")\n"; + return false; + } + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmStreamedMatrixSwitch::uninitialize() +{ + m_stimDecoder.uninitialize(); + if (m_streamDecoder) + { + m_streamDecoder->uninitialize(); + delete m_streamDecoder; + } + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmStreamedMatrixSwitch::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmStreamedMatrixSwitch::process() +{ + // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + const size_t nOutput = this->getStaticBoxContext().getOutputCount(); + uint64_t start = 0; + uint64_t end = 0; + size_t chunkSize = 0; + bool gotStimulation = false; + const uint8_t* buffer = nullptr; + + //iterate over all chunk on input 0 (Stimulation) + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_stimDecoder.decode(i); + + if (m_stimDecoder.isHeaderReceived() || m_stimDecoder.isEndReceived()) + { + // nothing + } + if (m_stimDecoder.isBufferReceived()) + { + // we update the active output index and time if needed + IStimulationSet* stimSet = m_stimDecoder.getOutputStimulationSet(); + for (size_t j = 0; j < stimSet->getStimulationCount(); j++) + { + if (m_stimOutputIndexes.find(stimSet->getStimulationIdentifier(j)) != m_stimOutputIndexes.end()) + { + m_activeOutputIdx = m_stimOutputIndexes[stimSet->getStimulationIdentifier(j)]; + this->getLogManager() << Kernel::LogLevel_Trace << "Switching with [" + << this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, stimSet->getStimulationIdentifier(j)) + << "] to output [" << m_activeOutputIdx << "].\n"; + } + } + gotStimulation = true; + m_lastStimInputChunkEndTime = boxContext.getInputChunkEndTime(0, i); + } + } + + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + //We decode the chunk but we don't automatically mark it as deprecated, as we may need to keep it. + m_streamDecoder->decode(i, false); + { + boxContext.getInputChunk(1, i, start, end, chunkSize, buffer); + if (m_streamDecoder->isHeaderReceived() || m_streamDecoder->isEndReceived()) + { + for (size_t j = 0; j < nOutput; ++j) + { + boxContext.appendOutputChunkData(j, buffer, chunkSize); + boxContext.markOutputAsReadyToSend(j, start, end); + } + boxContext.markInputAsDeprecated(1, i); + } + if (m_streamDecoder->isBufferReceived()) + { + // we drop every chunk when no output is activated + if (m_activeOutputIdx == size_t(-1)) { boxContext.markInputAsDeprecated(1, i); } + else + { + if (!gotStimulation || (start < m_lastStimInputChunkEndTime)) + { + // the input chunk is in the good time range (we are sure that no stim has been received to change the active output) + boxContext.appendOutputChunkData(m_activeOutputIdx, buffer, chunkSize); + boxContext.markOutputAsReadyToSend(m_activeOutputIdx, start, end); + boxContext.markInputAsDeprecated(1, i); + } + // else : we keep the input chunk, no mark as deprecated ! + } + } + } + } + + return true; +} +} // namespace Streaming +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmStreamedMatrixSwitch.h b/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmStreamedMatrixSwitch.h new file mode 100644 index 0000000..2c23253 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmStreamedMatrixSwitch.h @@ -0,0 +1,159 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Streaming { +/** + * \class CBoxAlgorithmStreamedMatrixSwitch + * \author Laurent Bonnet (INRIA) + * \date Thu May 12 18:02:05 2011 + * \brief The class CBoxAlgorithmStreamedMatrixSwitch describes the box Streamed Matrix Switch. + * + */ +class CBoxAlgorithmStreamedMatrixSwitch final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_StreamedMatrixSwitch) + +protected: + Toolkit::TStimulationDecoder m_stimDecoder; + Toolkit::TDecoder* m_streamDecoder = nullptr; + + std::map m_stimOutputIndexes; + size_t m_activeOutputIdx = 0; + uint64_t m_lastStimInputChunkEndTime = 0; +}; + + +class CBoxAlgorithmStreamedMatrixSwitchListener final : public Toolkit::TBoxListener +{ +public: + + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + if (index == 0) + { + box.setInputType(0,OV_TypeId_Stimulations); + return true; + } + + CIdentifier id = CIdentifier::undefined(); + box.getInputType(1, id); + + // all output must have the input type + for (size_t i = 0; i < box.getOutputCount(); ++i) { box.setOutputType(i, id); } + return true; + } + + bool onOutputAdded(Kernel::IBox& box, const size_t index) override + { + // the output must have the same type as the input + CIdentifier id = CIdentifier::undefined(); + box.getInputType(1, id); + box.setOutputType(index, id); + + const char* name = ("Switch stim for output " + std::to_string(index + 1)).c_str(); + box.addSetting(name, OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00"); + + return true; + } + + bool onOutputRemoved(Kernel::IBox& box, const size_t index) override + { + box.removeSetting(1 + index); // +1 for the first setting which doesn't correspond to a stream + + // Rename the rest to match the changed indexing + for (size_t i = (1 + index); i < box.getSettingCount(); ++i) + { + const char* name = ("Switch stim for output " + std::to_string(i)).c_str(); + box.setSettingName(i, name); + } + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + + +/** + * \class CBoxAlgorithmStreamedMatrixSwitchDesc + * \author Laurent Bonnet (INRIA) + * \date Thu May 12 18:02:05 2011 + * \brief Descriptor of the box Streamed Matrix Switch. + * + */ +class CBoxAlgorithmStreamedMatrixSwitchDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Stream Switch"); } + CString getAuthorName() const override { return CString("Laurent Bonnet"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Redirect its input on a particular output"); } + + CString getDetailedDescription() const override + { + return CString( + "This box act as a switch between N possible outputs for its Streamed Matrix input. N Stimulation settings trigger the switch."); + } + + CString getCategory() const override { return CString("Streaming"); } + CString getVersion() const override { return CString("1.1"); } + CString getStockItemName() const override { return CString("gtk-sort-ascending"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_StreamedMatrixSwitch; } + IPluginObject* create() override { return new CBoxAlgorithmStreamedMatrixSwitch; } + + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmStreamedMatrixSwitchListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Triggers",OV_TypeId_Stimulations); + prototype.addInput("Matrix",OV_TypeId_StreamedMatrix); + + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + //prototype.addFlag(Kernel::BoxFlag_CanAddInput); + + prototype.addOutput("Output",OV_TypeId_StreamedMatrix); + prototype.addOutput("Output",OV_TypeId_StreamedMatrix); + + //prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + prototype.addFlag(Kernel::BoxFlag_CanAddOutput); + + prototype.addSetting("Default to output 1", OV_TypeId_Boolean, "false"); + prototype.addSetting("Switch stim for output 1",OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00"); + prototype.addSetting("Switch stim for output 2",OV_TypeId_Stimulation, "OVTK_StimulationId_Label_01"); + + //prototype.addFlag(Kernel::BoxFlag_CanModifySetting); + //prototype.addFlag(Kernel::BoxFlag_CanAddSetting); + + //prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_StreamedMatrixSwitchDesc) +}; +} // namespace Streaming +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/src/ovp_defines.h new file mode 100755 index 0000000..869e661 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/src/ovp_defines.h @@ -0,0 +1,14 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_StreamedMatrixSwitch OpenViBE::CIdentifier(0x556A2C32, 0x61DF49FC) +#define OVP_ClassId_BoxAlgorithm_StreamedMatrixSwitchDesc OpenViBE::CIdentifier(0x556A2C32, 0x61DF49FC) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/src/ovp_main.cpp new file mode 100755 index 0000000..6fc28db --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/streaming/src/ovp_main.cpp @@ -0,0 +1,19 @@ +#include "ovp_defines.h" + +#include "box-algorithms/ovpCBoxAlgorithmStreamedMatrixSwitch.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Streaming { + +OVP_Declare_Begin() + context.getTypeManager().registerEnumerationEntry(OV_TypeId_BoxAlgorithmFlag, OV_AttributeId_Box_FlagIsUnstable.toString(), + OV_AttributeId_Box_FlagIsUnstable.id()); + OVP_Declare_New(CBoxAlgorithmStreamedMatrixSwitchDesc); +OVP_Declare_End() + +} // namespace Streaming +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tests/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/CMakeLists.txt new file mode 100644 index 0000000..2a0db26 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/CMakeLists.txt @@ -0,0 +1,27 @@ +PROJECT(openvibe-plugins-tests) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleXML") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tests/doc/Doc_BoxAlgorithm_CodecToolkitTestbox.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/doc/Doc_BoxAlgorithm_CodecToolkitTestbox.dox-part new file mode 100644 index 0000000..ef1843d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/doc/Doc_BoxAlgorithm_CodecToolkitTestbox.dox-part @@ -0,0 +1,87 @@ +/** + * \page BoxAlgorithm_CodecToolkitTestbox Codec Toolkit testbox +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Description| + The purpose of this box is to test the \ref Doc_Tutorial_Developer_SignalProcessing_CodecToolkit_Ref "Codec Toolkit". + This box is able to read data from any type of input. It extract some information from the incoming chunks and print it in the console. + An output chunk is then generated as a full copy on the corresponding output, as the \ref BoxAlgorithm_Identity Identity box does. + + For more information on the Codec Toolkit, please read the \ref Doc_Tutorial_Developer_SignalProcessing_CodecToolkit "dedicated tutorial" that presents the implementatio of this box. + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Inputs| + All possible types of input are represented. + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Input1| + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Input1| + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Input2| + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Input2| + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Input3| + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Input3| + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Input4| + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Input4| + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Input5| + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Input5| + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Input6| + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Input6| + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Input7| + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Input7| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Outputs| + All possible types of output are represented. + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Output1| + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Output1| + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Output2| + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Output2| + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Output3| + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Output3| + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Output4| + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Output4| + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Output5| + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Output5| + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Output6| + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Output6| + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Output7| + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Output7| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Examples| + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CodecToolkitTestbox_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_CodecToolkitTestbox_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/algorithms/ovpCAlgorithmAddition.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/algorithms/ovpCAlgorithmAddition.cpp new file mode 100644 index 0000000..91cff85 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/algorithms/ovpCAlgorithmAddition.cpp @@ -0,0 +1,33 @@ +#include "ovpCAlgorithmAddition.h" + +namespace OpenViBE { +namespace Plugins { +namespace Tests { + +bool CAlgorithmAddition::initialize() +{ + m_parameter1.initialize(getInputParameter(CIdentifier(0, 1))); + m_parameter2.initialize(getInputParameter(CIdentifier(0, 2))); + m_parameter3.initialize(getOutputParameter(CIdentifier(0, 3))); + + return true; +} + +bool CAlgorithmAddition::uninitialize() +{ + m_parameter3.uninitialize(); + m_parameter2.uninitialize(); + m_parameter1.uninitialize(); + + return true; +} + +bool CAlgorithmAddition::process() +{ + m_parameter3 = m_parameter1 + m_parameter2; + + return true; +} +} // namespace Tests +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/algorithms/ovpCAlgorithmAddition.h b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/algorithms/ovpCAlgorithmAddition.h new file mode 100644 index 0000000..50f291c --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/algorithms/ovpCAlgorithmAddition.h @@ -0,0 +1,61 @@ +#pragma once + +#include "../ovp_defines.h" + +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Tests { +class CAlgorithmAddition final : public Toolkit::TAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_AlgorithmAddition) + +protected: + + Kernel::TParameterHandler m_parameter1; + Kernel::TParameterHandler m_parameter2; + Kernel::TParameterHandler m_parameter3; +}; + +class CAlgorithmAdditionDesc final : public IAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Addition"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Computes and outputs the sum of two inputs"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Tests"); } + CString getVersion() const override { return CString("1.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_AlgorithmAddition; } + IPluginObject* create() override { return new CAlgorithmAddition(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(CIdentifier(0, 1), "First addition operand", Kernel::ParameterType_Integer); + prototype.addInputParameter(CIdentifier(0, 2), "Second addition operand", Kernel::ParameterType_Integer); + prototype.addOutputParameter(CIdentifier(0, 3), "Addition result", Kernel::ParameterType_Integer); + + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_AlgorithmAdditionDesc) +}; +} // namespace Tests +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCBoxAlgorithmAdditionTest.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCBoxAlgorithmAdditionTest.cpp new file mode 100644 index 0000000..b6d5c40 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCBoxAlgorithmAdditionTest.cpp @@ -0,0 +1,84 @@ +#include "ovpCBoxAlgorithmAdditionTest.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Tests { + +bool CBoxAlgorithmAdditionTest::initialize() +{ + CString level; + getStaticBoxContext().getSettingValue(0, level); + m_logLevel = Kernel::ELogLevel(getTypeManager().getEnumerationEntryValueFromName(OV_TypeId_LogLevel, level)); + + m_proxy1 = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_AlgorithmAddition)); + m_proxy2 = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_AlgorithmAddition)); + m_proxy3 = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_AlgorithmAddition)); + + m_proxy1->initialize(); + m_proxy2->initialize(); + m_proxy3->initialize(); + + m_proxy1->getInputParameter(CIdentifier(0, 1))->setReferenceTarget(&m_i1); + m_proxy1->getInputParameter(CIdentifier(0, 2))->setReferenceTarget(&m_i2); + m_proxy2->getInputParameter(CIdentifier(0, 1))->setReferenceTarget(&m_i3); + m_proxy2->getInputParameter(CIdentifier(0, 2))->setReferenceTarget(&m_i4); + m_proxy3->getInputParameter(CIdentifier(0, 1))->setReferenceTarget(m_proxy1->getOutputParameter(CIdentifier(0, 3))); + m_proxy3->getInputParameter(CIdentifier(0, 2))->setReferenceTarget(m_proxy2->getOutputParameter(CIdentifier(0, 3))); + + return true; +} + +bool CBoxAlgorithmAdditionTest::uninitialize() +{ + m_proxy1->uninitialize(); + m_proxy2->uninitialize(); + m_proxy3->uninitialize(); + + getAlgorithmManager().releaseAlgorithm(*m_proxy1); + getAlgorithmManager().releaseAlgorithm(*m_proxy2); + getAlgorithmManager().releaseAlgorithm(*m_proxy3); + + return true; +} + +bool CBoxAlgorithmAdditionTest::processClock(Kernel::CMessageClock& /*msg*/) +{ + m_i1 = (rand() % 100); + m_i2 = (rand() % 100) * 100; + m_i3 = (rand() % 100) * 10000; + m_i4 = (rand() % 100) * 1000000; + + m_proxy1->process(); + m_proxy2->process(); + m_proxy3->process(); + + const Kernel::TParameterHandler parameter11(m_proxy1->getInputParameter(CIdentifier(0, 1))), + parameter12(m_proxy1->getInputParameter(CIdentifier(0, 2))), + parameter13(m_proxy1->getOutputParameter(CIdentifier(0, 3))), + parameter21(m_proxy2->getInputParameter(CIdentifier(0, 1))), + parameter22(m_proxy2->getInputParameter(CIdentifier(0, 2))), + parameter23(m_proxy2->getOutputParameter(CIdentifier(0, 3))), + parameter31(m_proxy3->getInputParameter(CIdentifier(0, 1))), + parameter32(m_proxy3->getInputParameter(CIdentifier(0, 2))), + parameter33(m_proxy3->getOutputParameter(CIdentifier(0, 3))); + + getLogManager() << m_logLevel << "paramater_1_1 = " << parameter11 << "\n"; + getLogManager() << m_logLevel << "paramater_1_2 = " << parameter12 << "\n"; + getLogManager() << m_logLevel << "paramater_1_3 = " << parameter13 << "\n"; + getLogManager() << m_logLevel << "paramater_2_1 = " << parameter21 << "\n"; + getLogManager() << m_logLevel << "paramater_2_2 = " << parameter22 << "\n"; + getLogManager() << m_logLevel << "paramater_2_3 = " << parameter23 << "\n"; + getLogManager() << m_logLevel << "paramater_3_1 = " << parameter31 << "\n"; + getLogManager() << m_logLevel << "paramater_3_2 = " << parameter32 << "\n"; + getLogManager() << m_logLevel << "paramater_3_3 = " << parameter33 << "\n"; + getLogManager() << m_logLevel << "------------------\n"; + + return true; +} + +bool CBoxAlgorithmAdditionTest::process() { return true; } +} // namespace Tests +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCBoxAlgorithmAdditionTest.h b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCBoxAlgorithmAdditionTest.h new file mode 100644 index 0000000..770c4b9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCBoxAlgorithmAdditionTest.h @@ -0,0 +1,73 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Tests { +class CBoxAlgorithmAdditionTest final : public Toolkit::TBoxAlgorithm +{ +public: + + CBoxAlgorithmAdditionTest() {} + + void release() override { delete this; } + + uint64_t getClockFrequency() override { return uint64_t(1LL) << 36; } + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithmAdditionTest) + +protected: + + Kernel::ELogLevel m_logLevel = Kernel::LogLevel_None; + + int64_t m_i1 = 0; + int64_t m_i2 = 0; + int64_t m_i3 = 0; + int64_t m_i4 = 0; + + Kernel::IAlgorithmProxy* m_proxy1 = nullptr; + Kernel::IAlgorithmProxy* m_proxy2 = nullptr; + Kernel::IAlgorithmProxy* m_proxy3 = nullptr; +}; + +class CBoxAlgorithmAdditionTestDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Addition Test"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("This box illustrates how an algorithm can be used in a box"); } + + CString getDetailedDescription() const override + { + return CString("This specific sample computes 4 random numbers and uses 3 sum operator algorithms in order to get the total"); + } + + CString getCategory() const override { return CString("Tests"); } + CString getVersion() const override { return CString("1.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithmAdditionTest; } + IPluginObject* create() override { return new CBoxAlgorithmAdditionTest(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addSetting("Log level to use", OV_TypeId_LogLevel, "Information"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithmAdditionTestDesc) +}; +} // namespace Tests +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCCrashingBox.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCCrashingBox.cpp new file mode 100644 index 0000000..9edb918 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCCrashingBox.cpp @@ -0,0 +1,31 @@ +#include "ovpCCrashingBox.h" +#include // For unix system + +namespace OpenViBE { +namespace Plugins { +namespace Tests { + +bool CCrashingBox::initialize(Kernel::IBoxAlgorithmContext& /*context*/) { throw 0; } + +bool CCrashingBox::uninitialize(Kernel::IBoxAlgorithmContext& /*context*/) +{ + const int one = int(1.0); + const int zero = int(sin(0.0)); + const int div = one / zero; + return div ? true : false; +} + +bool CCrashingBox::processInput(Kernel::IBoxAlgorithmContext& context, const size_t /*index*/) +{ + context.markAlgorithmAsReadyToProcess(); + return true; +} + +bool CCrashingBox::process(Kernel::IBoxAlgorithmContext& /*context*/) +{ + *static_cast(nullptr) = 0; + return true; +} +} // namespace Tests +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCCrashingBox.h b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCCrashingBox.h new file mode 100644 index 0000000..64d7ef8 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCCrashingBox.h @@ -0,0 +1,56 @@ +#pragma once + +#include "../ovp_defines.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Tests { +class CCrashingBox final : public IBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize(Kernel::IBoxAlgorithmContext& context) override; + bool uninitialize(Kernel::IBoxAlgorithmContext& context) override; + + bool processInput(Kernel::IBoxAlgorithmContext& context, const size_t index) override; + bool process(Kernel::IBoxAlgorithmContext& context) override; + + _IsDerivedFromClass_Final_(IBoxAlgorithm, OVP_ClassId_CrashingBox) +}; + +class CCrashingBoxDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("Crashing box"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("A box which code launches exceptions"); } + + CString getDetailedDescription() const override { return CString("This box illustrates the behavior of the platform given a crashing plugin code"); } + + CString getCategory() const override { return CString("Tests"); } + CString getVersion() const override { return CString("1.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_CrashingBox; } + IPluginObject* create() override { return new CCrashingBox(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("an input", CIdentifier::undefined()); + return true; + } + + CString getStockItemName() const override { return CString("gtk-cancel"); } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_CrashingBoxDesc) +}; +} // namespace Tests +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCTestCodecToolkit.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCTestCodecToolkit.cpp new file mode 100644 index 0000000..0480ccc --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCTestCodecToolkit.cpp @@ -0,0 +1,205 @@ +#include "ovpCTestCodecToolkit.h" + +namespace OpenViBE { +namespace Plugins { +namespace Tests { + + +bool CTestCodecToolkit::initialize() +{ + // You can also manipulate pointers to Codec object. Creation and destruction must be done like that : + Toolkit::TStreamedMatrixDecoder* matrixDecoder = new Toolkit::TStreamedMatrixDecoder(*this, 0); + delete matrixDecoder; + Toolkit::TStreamedMatrixEncoder* matrixEncoder = new Toolkit::TStreamedMatrixEncoder(*this, 0); + delete matrixEncoder; + + Toolkit::TChannelLocalisationDecoder* channelLocalisationDecoder = new Toolkit::TChannelLocalisationDecoder(*this, 1); + delete channelLocalisationDecoder; + Toolkit::TChannelLocalisationEncoder* channelLocalisationEncoder = new Toolkit::TChannelLocalisationEncoder(*this, 1); + delete channelLocalisationEncoder; + + Toolkit::TFeatureVectorDecoder* vectorDecoder = new Toolkit::TFeatureVectorDecoder(*this, 2); + delete vectorDecoder; + Toolkit::TFeatureVectorEncoder* vectorEncoder = new Toolkit::TFeatureVectorEncoder(*this, 2); + delete vectorEncoder; + + Toolkit::TSpectrumDecoder* spectrumDecoder = new Toolkit::TSpectrumDecoder(*this, 3); + delete spectrumDecoder; + Toolkit::TSpectrumEncoder* spectrumEncoder = new Toolkit::TSpectrumEncoder(*this, 3); + delete spectrumEncoder; + + Toolkit::TSignalDecoder* signalDecoder = new Toolkit::TSignalDecoder(*this, 4); + delete signalDecoder; + Toolkit::TSignalEncoder* signalEncoder = new Toolkit::TSignalEncoder(*this, 4); + delete signalEncoder; + + Toolkit::TStimulationDecoder* stimulationDecoder = new Toolkit::TStimulationDecoder(*this, 5); + delete stimulationDecoder; + Toolkit::TStimulationEncoder* stimulationEncoder = new Toolkit::TStimulationEncoder(*this, 5); + delete stimulationEncoder; + + Toolkit::TExperimentInfoDecoder* experimentInfoDecoder = new Toolkit::TExperimentInfoDecoder(*this, 6); + delete experimentInfoDecoder; + Toolkit::TExperimentInfoEncoder* experimentInfoEncoder = new Toolkit::TExperimentInfoEncoder(*this, 6); + delete experimentInfoEncoder; + + //----------------------------------------------------------------------------------------- + + m_matrixDecoder.initialize(*this, 0); + m_streamedMatrixEncoder.initialize(*this, 0); + m_streamedMatrixEncoder.getInputMatrix().setReferenceTarget(m_matrixDecoder.getOutputMatrix()); + m_decoders.push_back(&m_matrixDecoder); + m_encoders.push_back(&m_streamedMatrixEncoder); + + m_channelLocalisationDecoder.initialize(*this, 1); + m_channelLocalisationEncoder.initialize(*this, 1); + m_channelLocalisationEncoder.getInputMatrix().setReferenceTarget(m_channelLocalisationDecoder.getOutputMatrix()); + m_channelLocalisationEncoder.getInputDynamic().setReferenceTarget(m_channelLocalisationDecoder.getOutputDynamic()); + m_decoders.push_back(&m_channelLocalisationDecoder); + m_encoders.push_back(&m_channelLocalisationEncoder); + + m_featureVectorDecoder.initialize(*this, 2); + m_featureVectorEncoder.initialize(*this, 2); + m_featureVectorEncoder.getInputMatrix().setReferenceTarget(m_featureVectorDecoder.getOutputMatrix()); + m_decoders.push_back(&m_featureVectorDecoder); + m_encoders.push_back(&m_featureVectorEncoder); + + m_spectrumDecoder.initialize(*this, 3); + m_spectrumEncoder.initialize(*this, 3); + m_spectrumEncoder.getInputMatrix().setReferenceTarget(m_spectrumDecoder.getOutputMatrix()); + m_spectrumEncoder.getInputFrequencyAbscissa().setReferenceTarget(m_spectrumDecoder.getOutputFrequencyAbscissa()); + m_spectrumEncoder.getInputSamplingRate().setReferenceTarget(m_spectrumDecoder.getOutputSamplingRate()); + m_decoders.push_back(&m_spectrumDecoder); + m_encoders.push_back(&m_spectrumEncoder); + + m_signalDecoder.initialize(*this, 4); + m_signalEncoder.initialize(*this, 4); + m_signalEncoder.getInputMatrix().setReferenceTarget(m_signalDecoder.getOutputMatrix()); + m_signalEncoder.getInputSamplingRate().setReferenceTarget(m_signalDecoder.getOutputSamplingRate()); + m_decoders.push_back(&m_signalDecoder); + m_encoders.push_back(&m_signalEncoder); + + m_stimDecoder.initialize(*this, 5); + m_stimEncoder.initialize(*this, 5); + m_stimEncoder.getInputStimulationSet().setReferenceTarget(m_stimDecoder.getOutputStimulationSet()); + m_decoders.push_back(&m_stimDecoder); + m_encoders.push_back(&m_stimEncoder); + + m_experimentInfoDecoder.initialize(*this, 6); + m_experimentInfoEncoder.initialize(*this, 6); + m_experimentInfoEncoder.getInputExperimentID().setReferenceTarget(m_experimentInfoDecoder.getOutputExperimentID()); + m_experimentInfoEncoder.getInputExperimentDate().setReferenceTarget(m_experimentInfoDecoder.getOutputExperimentDate()); + m_experimentInfoEncoder.getInputSubjectID().setReferenceTarget(m_experimentInfoDecoder.getOutputSubjectID()); + m_experimentInfoEncoder.getInputSubjectName().setReferenceTarget(m_experimentInfoDecoder.getOutputSubjectName()); + m_experimentInfoEncoder.getInputSubjectAge().setReferenceTarget(m_experimentInfoDecoder.getOutputSubjectAge()); + m_experimentInfoEncoder.getInputSubjectGender().setReferenceTarget(m_experimentInfoDecoder.getOutputSubjectGender()); + m_experimentInfoEncoder.getInputLaboratoryID().setReferenceTarget(m_experimentInfoDecoder.getOutputLaboratoryID()); + m_experimentInfoEncoder.getInputLaboratoryName().setReferenceTarget(m_experimentInfoDecoder.getOutputLaboratoryName()); + m_experimentInfoEncoder.getInputTechnicianID().setReferenceTarget(m_experimentInfoDecoder.getOutputTechnicianID()); + m_experimentInfoEncoder.getInputTechnicianName().setReferenceTarget(m_experimentInfoDecoder.getOutputTechnicianName()); + m_decoders.push_back(&m_experimentInfoDecoder); + m_encoders.push_back(&m_experimentInfoEncoder); + + return true; +} + +bool CTestCodecToolkit::uninitialize() +{ + for (size_t i = 0; i < m_decoders.size(); ++i) { m_decoders[i]->uninitialize(); } + for (size_t i = 0; i < m_encoders.size(); ++i) { m_encoders[i]->uninitialize(); } + + return true; +} + +bool CTestCodecToolkit::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} + +bool CTestCodecToolkit::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const Kernel::IBox& staticBoxContext = this->getStaticBoxContext(); + + for (size_t i = 0; i < staticBoxContext.getInputCount(); ++i) + { + for (size_t j = 0; j < boxContext.getInputChunkCount(i); ++j) + { + // we can manipulate decoders and encoders without knowing their types + m_decoders[i]->decode(j); + + if (m_decoders[i]->isHeaderReceived()) { m_encoders[i]->encodeHeader(); } + if (m_decoders[i]->isBufferReceived()) + { + //let's check what is inside the buffer + CIdentifier iType; + staticBoxContext.getInputType(i, iType); + if (iType == OV_TypeId_StreamedMatrix) + { + CMatrix* matrix = m_matrixDecoder.getOutputMatrix(); + this->getLogManager() << Kernel::LogLevel_Info << "Streamed Matrix buffer received (" << matrix->getBufferElementCount() << + " elements in buffer).\n"; + } + else if (iType == OV_TypeId_ChannelLocalisation) + { + CMatrix* matrix = m_channelLocalisationDecoder.getOutputMatrix(); + this->getLogManager() << Kernel::LogLevel_Info << "Channel localisation buffer received (" << matrix->getBufferElementCount() << + " elements in buffer).\n"; + } + else if (iType == OV_TypeId_FeatureVector) + { + CMatrix* matrix = m_featureVectorDecoder.getOutputMatrix(); + this->getLogManager() << Kernel::LogLevel_Info << "Feature Vector buffer received (" << matrix->getBufferElementCount() << + " features in vector).\n"; + } + else if (iType == OV_TypeId_Spectrum) + { + CMatrix* matrix = m_spectrumDecoder.getOutputFrequencyAbscissa(); + this->getLogManager() << Kernel::LogLevel_Info << "Spectrum frequencies abscissas received (" << matrix->getBufferElementCount() << + " elements in matrix).\n"; + } + else if (iType == OV_TypeId_Signal) + { + CMatrix* matrix = m_signalDecoder.getOutputMatrix(); + uint64_t sampling = m_signalDecoder.getOutputSamplingRate(); + this->getLogManager() << Kernel::LogLevel_Info << "Signal buffer received (" << matrix->getBufferElementCount() << + " elements in buffer) with sampling frequency " << sampling << "Hz.\n"; + } + else if (iType == OV_TypeId_Stimulations) + { + IStimulationSet* stimSet = m_stimDecoder.getOutputStimulationSet(); + // as we constantly receive stimulations on the stream, we will check if the incoming set is empty or not + if (stimSet->getStimulationCount() != 0) + { + this->getLogManager() << Kernel::LogLevel_Info << "Stimulation Set buffer received (1st stim is [" + << stimSet->getStimulationIdentifier(0) << ":" + << this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, stimSet->getStimulationIdentifier(0)) + << "]).\n"; + m_stimEncoder.getInputStimulationSet()->clear(); + m_stimEncoder.getInputStimulationSet()->appendStimulation(stimSet->getStimulationIdentifier(0) + 1, stimSet->getStimulationDate(0), 0); + } + } + else if (iType == OV_TypeId_ExperimentInfo) + { + uint64_t xPid = m_experimentInfoDecoder.getOutputExperimentID(); + this->getLogManager() << Kernel::LogLevel_Info << "Experiment information buffer received (xp ID: " << xPid << ").\n"; + } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Undefined input type.\n"; + return true; + } + m_encoders[i]->encodeBuffer(); + } + if (m_decoders[i]->isEndReceived()) { m_encoders[i]->encodeEnd(); } + boxContext.markOutputAsReadyToSend(i, boxContext.getInputChunkStartTime(i, j), boxContext.getInputChunkEndTime(i, j)); + } + } + + return true; +} +} // namespace Tests +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCTestCodecToolkit.h b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCTestCodecToolkit.h new file mode 100755 index 0000000..bb7b45f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/box-algorithms/ovpCTestCodecToolkit.h @@ -0,0 +1,104 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Tests { +class CTestCodecToolkit final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_TestCodecToolkit) + +protected: + + Toolkit::TStreamedMatrixDecoder m_matrixDecoder; + Toolkit::TStreamedMatrixEncoder m_streamedMatrixEncoder; + + Toolkit::TChannelLocalisationDecoder m_channelLocalisationDecoder; + Toolkit::TChannelLocalisationEncoder m_channelLocalisationEncoder; + + Toolkit::TFeatureVectorDecoder m_featureVectorDecoder; + Toolkit::TFeatureVectorEncoder m_featureVectorEncoder; + + Toolkit::TSpectrumDecoder m_spectrumDecoder; + Toolkit::TSpectrumEncoder m_spectrumEncoder; + + Toolkit::TSignalDecoder m_signalDecoder; + Toolkit::TSignalEncoder m_signalEncoder; + + Toolkit::TStimulationDecoder m_stimDecoder; + Toolkit::TStimulationEncoder m_stimEncoder; + + Toolkit::TExperimentInfoDecoder m_experimentInfoDecoder; + Toolkit::TExperimentInfoEncoder m_experimentInfoEncoder; + + /* One decoder per input. This vector makes easy the decoding in one iteration over the inputs. */ + std::vector*> m_decoders; + + /* One encoder per output This vector makes easy the encoding in one iteration over the outputs. */ + std::vector*> m_encoders; +}; + +class CTestCodecToolkitDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Codec Toolkit testbox"); } + CString getAuthorName() const override { return CString("Laurent Bonnet"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + + CString getShortDescription() const override { return CString("Sample box to test the codec toolkit. Identity (input = output)."); } + + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Tests/Algorithms"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-execute"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_TestCodecToolkit; } + IPluginObject* create() override { return new CTestCodecToolkit; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Streamed Matrix", OV_TypeId_StreamedMatrix); + prototype.addOutput("Streamed Matrix", OV_TypeId_StreamedMatrix); + + prototype.addInput("Channel Localisation", OV_TypeId_ChannelLocalisation); + prototype.addOutput("Channel Localisation", OV_TypeId_ChannelLocalisation); + + prototype.addInput("Feature Vector", OV_TypeId_FeatureVector); + prototype.addOutput("Feature Vector", OV_TypeId_FeatureVector); + + prototype.addInput("Spectrum", OV_TypeId_Spectrum); + prototype.addOutput("Spectrum", OV_TypeId_Spectrum); + + prototype.addInput("Signal", OV_TypeId_Signal); + prototype.addOutput("Signal", OV_TypeId_Signal); + + prototype.addInput("Stimulations", OV_TypeId_Stimulations); + prototype.addOutput("Stimulations", OV_TypeId_Stimulations); + + prototype.addInput("XP info", OV_TypeId_ExperimentInfo); + prototype.addOutput("XP info", OV_TypeId_ExperimentInfo); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_TestCodecToolkitDesc) +}; +} // namespace Tests +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/ovp_defines.h new file mode 100644 index 0000000..4b81a00 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/ovp_defines.h @@ -0,0 +1,18 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_AlgorithmAddition OpenViBE::CIdentifier(0x75FCE50E, 0x8302FA91) +#define OVP_ClassId_AlgorithmAdditionDesc OpenViBE::CIdentifier(0x842E0B85, 0xA59FABC1) +#define OVP_ClassId_BoxAlgorithmAdditionTest OpenViBE::CIdentifier(0x534EB140, 0x15F41496) +#define OVP_ClassId_BoxAlgorithmAdditionTestDesc OpenViBE::CIdentifier(0xB33EC315, 0xF63BC0C5) +#define OVP_ClassId_CrashingBox OpenViBE::CIdentifier(0x00DAFD60, 0x39A58819) +#define OVP_ClassId_CrashingBoxDesc OpenViBE::CIdentifier(0x009F54B9, 0x2B6A4922) +#define OVP_ClassId_TestCodecToolkit OpenViBE::CIdentifier(0x330E3A87, 0x31565BA6) +#define OVP_ClassId_TestCodecToolkitDesc OpenViBE::CIdentifier(0x376A4712, 0x1AA65567) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/ovp_main.cpp new file mode 100644 index 0000000..f7212a9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tests/src/ovp_main.cpp @@ -0,0 +1,23 @@ +#include "ovp_defines.h" + +#include "algorithms/ovpCAlgorithmAddition.h" +#include "box-algorithms/ovpCBoxAlgorithmAdditionTest.h" + +#include "box-algorithms/ovpCCrashingBox.h" + +#include "box-algorithms/ovpCTestCodecToolkit.h" + +namespace OpenViBE { +namespace Plugins { +namespace Tests { + +OVP_Declare_Begin() + // OVP_Declare_New(CAlgorithmAdditionDesc); + // OVP_Declare_New(CBoxAlgorithmAdditionTestDesc); + // OVP_Declare_New(CCrashingBoxDesc); + OVP_Declare_New(CTestCodecToolkitDesc); +OVP_Declare_End() + +} // namespace Tests +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tools/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/CMakeLists.txt new file mode 100644 index 0000000..ade1c65 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/CMakeLists.txt @@ -0,0 +1,33 @@ +PROJECT(openvibe-plugins-tools) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindThirdPartyGTK") + +INCLUDE("FindThirdPartyX11") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/plugins/tools) + diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_KeypressEmulator.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_KeypressEmulator.dox-part new file mode 100644 index 0000000..7e5cefb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_KeypressEmulator.dox-part @@ -0,0 +1,58 @@ +/** + * \page BoxAlgorithm_KeypressEmulator Keypress Emulator +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_KeypressEmulator_Description| +Emulates a keyboard keypress when receiving a specific stimulation. In principle this box could be used to drive some 3rd party application that allows keyboard control but not any other communication from OpenViBE. Currently this box is implemented only on Windows. + * |OVP_DocEnd_BoxAlgorithm_KeypressEmulator_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_KeypressEmulator_Inputs| + * |OVP_DocEnd_BoxAlgorithm_KeypressEmulator_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_KeypressEmulator_Input1| + Stimulation stream to listen to. + * |OVP_DocEnd_BoxAlgorithm_KeypressEmulator_Input1| + +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_KeypressEmulator_Settings| + * |OVP_DocEnd_BoxAlgorithm_KeypressEmulator_Settings| + + * |OVP_DocBegin_BoxAlgorithm_KeypressEmulator_Setting1| + The stimulation that will trigger the keypress. + * |OVP_DocEnd_BoxAlgorithm_KeypressEmulator_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_KeypressEmulator_Setting2| + The key to press. + * |OVP_DocEnd_BoxAlgorithm_KeypressEmulator_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_KeypressEmulator_Setting3| + The key modifier (alt, ctrl, ...) + * |OVP_DocEnd_BoxAlgorithm_KeypressEmulator_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_KeypressEmulator_Examples| + An easy way to test the box is to make it receive stimulations from a Clock Stimulator box, and make a text editor active on the desktop after clicking Play. The characters corresponding to the key should appear in the editor. + * |OVP_DocEnd_BoxAlgorithm_KeypressEmulator_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_KeypressEmulator_Miscellaneous| + The Keypress Emulator should be enhanced to be able to map an arbitrary number of different stimulations. This development would be relatively straightforward (e.g. look at VRPN boxes for example). Meanwhile if you need several keys pressed, you can use several Keypress Emulator boxes, each configured for a different stimulation+key. + * |OVP_DocEnd_BoxAlgorithm_KeypressEmulator_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_MessageSpy.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_MessageSpy.dox-part new file mode 100644 index 0000000..7d4a66d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_MessageSpy.dox-part @@ -0,0 +1,57 @@ +/** + * \page BoxAlgorithm_MessageSpy EBML stream spy +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MessageSpy_Description| + * The purpose of this box is to spy a message connection and + * decode its contents to the log manager. The box loops over + * the possible types and keys inside a message and prints + * the output. + * + * This box is mostly useful for debug purpose. It allows + * a developper to check what arrives to a box in a human + * readable way. + * |OVP_DocEnd_BoxAlgorithm_MessageSpy_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MessageSpy_Inputs| + * This box can receive as many message inputs as necessary. + * |OVP_DocEnd_BoxAlgorithm_MessageSpy_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_MessageSpy_Input1| + * This is the default input of this box. + * |OVP_DocEnd_BoxAlgorithm_MessageSpy_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MessageSpy_Settings| + * |OVP_DocEnd_BoxAlgorithm_MessageSpy_Settings| + + * |OVP_DocBegin_BoxAlgorithm_MessageSpy_Setting1| + * Indicates what log level will be used to + * print the message contents. + * |OVP_DocEnd_BoxAlgorithm_MessageSpy_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MessageSpy_Examples| +There is a simple example scenario provided in box-tutorials/ called messaging.xml. + * |OVP_DocEnd_BoxAlgorithm_MessageSpy_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MessageSpy_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_MessageSpy_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_MouseTracking.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_MouseTracking.dox-part new file mode 100644 index 0000000..d2fc799 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_MouseTracking.dox-part @@ -0,0 +1,55 @@ +/** + * \page BoxAlgorithm_MouseTracking Mouse Tracking +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MouseTracking_Description| + Opens a gtk window and track mouse within that window. + * |OVP_DocEnd_BoxAlgorithm_MouseTracking_Description| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MouseTracking_Outputs| + * |OVP_DocEnd_BoxAlgorithm_MouseTracking_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_MouseTracking_Output1| + Output the raw coordinates of mouse position. + * |OVP_DocEnd_BoxAlgorithm_MouseTracking_Output1| + + * |OVP_DocBegin_BoxAlgorithm_MouseTracking_Output2| + Output relative coordinates to previous position of the mouse. + * |OVP_DocEnd_BoxAlgorithm_MouseTracking_Output2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MouseTracking_Settings| + * |OVP_DocEnd_BoxAlgorithm_MouseTracking_Settings| + + * |OVP_DocBegin_BoxAlgorithm_MouseTracking_Setting1| + Sampling frequency. + * |OVP_DocEnd_BoxAlgorithm_MouseTracking_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_MouseTracking_Setting2| + Generated epoch sample count. Set the size of chunk. 1 in most cases : there is only one position at each time. + * |OVP_DocEnd_BoxAlgorithm_MouseTracking_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MouseTracking_Examples| + * |OVP_DocEnd_BoxAlgorithm_MouseTracking_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MouseTracking_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_MouseTracking_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tools/share/config-ebml-stream-spy.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/share/config-ebml-stream-spy.txt new file mode 100644 index 0000000..e681426 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/share/config-ebml-stream-spy.txt @@ -0,0 +1,74 @@ +OVTK_NodeId_Acquisition_Header EBML::CIdentifier(0x00000000, 0x00004239) master +OVTK_NodeId_Acquisition_AcquisitionInfo EBML::CIdentifier(0x00000000, 0x00004240) master +OVTK_NodeId_Acquisition_ExperimentId EBML::CIdentifier(0x00000000, 0x00004241) uinteger +OVTK_NodeId_Acquisition_SubjectAge EBML::CIdentifier(0x00000000, 0x00004242) uinteger +OVTK_NodeId_Acquisition_SubjectGender EBML::CIdentifier(0x00000000, 0x00004243) uinteger +OVTK_NodeId_Acquisition_ChannelCount EBML::CIdentifier(0x00000000, 0x00004244) uinteger +OVTK_NodeId_Acquisition_Sampling EBML::CIdentifier(0x00000000, 0x00004245) uinteger +OVTK_NodeId_Acquisition_ChannelNames EBML::CIdentifier(0x00000000, 0x00004246) master +OVTK_NodeId_Acquisition_ChannelName EBML::CIdentifier(0x00000000, 0x00004247) string +OVTK_NodeId_Acquisition_GainFactors EBML::CIdentifier(0x00000000, 0x00004248) master +OVTK_NodeId_Acquisition_GainFactor EBML::CIdentifier(0x00000000, 0x00004249) float +OVTK_NodeId_Acquisition_ChannelLocations EBML::CIdentifier(0x00000000, 0x00004250) master +OVTK_NodeId_Acquisition_ChannelLocation EBML::CIdentifier(0x00000000, 0x00004251) binary(double) +OVTK_NodeId_Acquisition_Buffer EBML::CIdentifier(0x00000000, 0x0000005A) master +OVTK_NodeId_Acquisition_Samples EBML::CIdentifier(0x00000000, 0x0000005B) master +OVTK_NodeId_Acquisition_SamplesPerChannelCount EBML::CIdentifier(0x00000000, 0x0000005C) uinteger +OVTK_NodeId_Acquisition_SampleBlock EBML::CIdentifier(0x00000000, 0x0000005D) binary(float) +OVTK_NodeId_Acquisition_Stimulations EBML::CIdentifier(0x00000000, 0x00000060) master +OVTK_NodeId_Acquisition_StimulationsCount EBML::CIdentifier(0x00000000, 0x00000061) uinteger +OVTK_NodeId_Acquisition_Stimulation EBML::CIdentifier(0x00000000, 0x00000062) master +OVTK_NodeId_Acquisition_StimulationSampleIndex EBML::CIdentifier(0x00000000, 0x00000063) uinteger +OVTK_NodeId_Acquisition_StimulationIdentifier EBML::CIdentifier(0x00000000, 0x00000064) uinteger + +OVTK_NodeId_Header EBML::CIdentifier(0x002B395F, 0x108ADFAE) master +OVTK_NodeId_Header_StreamType EBML::CIdentifier(0x00CDD0F7, 0x46B0278D) uinteger +OVTK_NodeId_Header_StreamVersion EBML::CIdentifier(0x006F5A08, 0x7796EBC5) uinteger +OVTK_NodeId_Buffer EBML::CIdentifier(0x00CF2101, 0x02375310) master +OVTK_NodeId_End EBML::CIdentifier(0x00D9DDC3, 0x0B12873A) master + +OVTK_NodeId_Header_StreamedMatrix EBML::CIdentifier(0x0072F560, 0x7ED2CBED) master +OVTK_NodeId_Header_StreamedMatrix_DimensionCount EBML::CIdentifier(0x003FEBD4, 0x2725D428) uinteger +OVTK_NodeId_Header_StreamedMatrix_Dimension EBML::CIdentifier(0x0000E3C0, 0x3A7D5141) master +OVTK_NodeId_Header_StreamedMatrix_Dimension_Size EBML::CIdentifier(0x001302F7, 0x36D8438A) uinteger +OVTK_NodeId_Header_StreamedMatrix_Dimension_Label EBML::CIdentifier(0x00153E40, 0x190227E0) string +OVTK_NodeId_Buffer_StreamedMatrix EBML::CIdentifier(0x00120663, 0x08FBC165) master +OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer EBML::CIdentifier(0x00B18C10, 0x427D098C) binary(double) + +OVTK_NodeId_Header_Signal EBML::CIdentifier(0x007855DE, 0x3748D375) master +OVTK_NodeId_Header_Signal_Sampling EBML::CIdentifier(0x00141C43, 0x0C37006B) uinteger + +OVTK_NodeId_Header_Spectrum EBML::CIdentifier(0x00CCFA4B, 0x14F37D4D) master +OVTK_NodeId_Header_Spectrum_FrequencyBand EBML::CIdentifier(0x0010983C, 0x21F8BDE5) master +OVTK_NodeId_Header_Spectrum_FrequencyBand_Start EBML::CIdentifier(0x00AA5654, 0x2403A2CB) float +OVTK_NodeId_Header_Spectrum_FrequencyBand_Stop EBML::CIdentifier(0x00A44C82, 0x05BE50D5) float + +OVTK_NodeId_Buffer_Stimulation EBML::CIdentifier(0x006DEABE, 0x7FC05A20) master +OVTK_NodeId_Buffer_Stimulation_NumberOfStimulations EBML::CIdentifier(0x00BB790B, 0x2B8574D8) uinteger +OVTK_NodeId_Buffer_Stimulation_Stimulation EBML::CIdentifier(0x0016EAC6, 0x29FBCAA1) master +OVTK_NodeId_Buffer_Stimulation_Stimulation_ID EBML::CIdentifier(0x006FA5DB, 0x4BAC31E9) uinteger +OVTK_NodeId_Buffer_Stimulation_Stimulation_Date EBML::CIdentifier(0x00B866D8, 0x14DA5374) uinteger +OVTK_NodeId_Buffer_Stimulation_Stimulation_Duration EBML::CIdentifier(0x14EE055F, 0x87FBCC9C) uinteger + +OVTK_NodeId_Header_ChannelUnits EBML::CIdentifier(0x17400C76, 0x16CF14C8) master +OVTK_NodeId_Header_ChannelUnits_Dynamic EBML::CIdentifier(0x7307023C, 0x7F754D2E) uinteger + +OVTK_NodeId_Header_ChannelLocalisation EBML::CIdentifier(0xF2CFE60B, 0xEFD63E3B) master +OVTK_NodeId_Header_ChannelLocalisation_Dynamic EBML::CIdentifier(0x5338AF5C, 0x07C469C3) uinteger + +OVTK_NodeId_Header_ExperimentInfo EBML::CIdentifier(0x00746BA0, 0x115AE04D) master +OVTK_NodeId_Header_ExperimentInfo_Experiment EBML::CIdentifier(0x0011D6B7, 0x48F1AA39) master +OVTK_NodeId_Header_ExperimentInfo_Experiment_ID EBML::CIdentifier(0x006ACD74, 0x1C960C26) uinteger +OVTK_NodeId_Header_ExperimentInfo_Experiment_Date EBML::CIdentifier(0x002F8FB7, 0x6DA7552D) uinteger +OVTK_NodeId_Header_ExperimentInfo_Subject EBML::CIdentifier(0x003EC620, 0x333E0A94) master +OVTK_NodeId_Header_ExperimentInfo_Subject_ID EBML::CIdentifier(0x00D62974, 0x473D4AA5) uinteger +OVTK_NodeId_Header_ExperimentInfo_Subject_Name EBML::CIdentifier(0x0041FD0A, 0x6BCD9A99) string +OVTK_NodeId_Header_ExperimentInfo_Subject_Age EBML::CIdentifier(0x00DF7DD9, 0x33336C51) uinteger +OVTK_NodeId_Header_ExperimentInfo_Subject_Gender EBML::CIdentifier(0x0069BB84, 0x3FC8E149) uinteger +OVTK_NodeId_Header_ExperimentInfo_Context EBML::CIdentifier(0x0018C291, 0x7985DFDD) master +OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryID EBML::CIdentifier(0x003F11B9, 0x26D76D9C) uinteger +OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryName EBML::CIdentifier(0x00EB1F23, 0x51C23B83) string +OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianID EBML::CIdentifier(0x00874A7F, 0x60DC34C2) uinteger +OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianName EBML::CIdentifier(0x00C8C393, 0x31CE5B3E) string + +DummyEnd EBML::CIdentifier(0x00000000, 0x00000000) binary diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmKeypressEmulator.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmKeypressEmulator.cpp new file mode 100644 index 0000000..3806405 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmKeypressEmulator.cpp @@ -0,0 +1,158 @@ +#include "ovpCBoxAlgorithmKeypressEmulator.h" + +namespace OpenViBE { +namespace Plugins { +namespace Tools { + +#if defined(TARGET_OS_Windows) +#include +#endif + +bool CBoxAlgorithmKeypressEmulator::initialize() +{ + m_decoder.initialize(*this, 0); + + m_triggerStimulation = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_keyToPress = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + +#if defined(TARGET_OS_Windows) + const uint64_t modifier = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + if (modifier == OVP_TypeId_Keypress_Modifier_Shift.id()) { m_modifier = VK_SHIFT; } + else if (modifier == OVP_TypeId_Keypress_Modifier_Control.id()) { m_modifier = VK_CONTROL; } + else if (modifier == OVP_TypeId_Keypress_Modifier_Alt.id()) { m_modifier = VK_MENU; } +#elif defined(TARGET_OS_Linux) + // @todo implement the whole linux solution + // Handle modifier on linux here + getLogManager() << Kernel::LogLevel_Error << "This box is only implemented on Windows for the moment\n"; + return false; +#endif + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmKeypressEmulator::uninitialize() +{ + m_decoder.uninitialize(); + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmKeypressEmulator::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmKeypressEmulator::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_decoder.decode(i); + + if (m_decoder.isHeaderReceived()) { } // NOP + if (m_decoder.isBufferReceived()) + { + const IStimulationSet* set = m_decoder.getOutputStimulationSet(); + for (size_t s = 0; s < set->getStimulationCount(); ++s) + { + if (set->getStimulationIdentifier(s) == m_triggerStimulation) + { +#if defined(TARGET_OS_Windows) + getLogManager() << Kernel::LogLevel_Debug << "Received " << m_triggerStimulation << ", pressing Windows virtual key " << m_keyToPress + << " with modifier " << m_modifier << ", delay is at least " + << CTime(this->getPlayerContext().getCurrentTime() - set->getStimulationDate(s)) << "\n"; + + // @todo the stimulation time is not necessarily RIGHT NOW. A very + // accurate solution would call SendInput exactly when the key needs to be pressed. Unfortunately when + // we receive the stim chunk, the keypress is already old, and we can't press keys into the past. In this sense + // sending immediately might be the best we can do. + // Note that the speccing the "time" field of INPUT as nonzero doesn't send keypresses to the past or future. + if (m_modifier != 0) + { + INPUT keypress[3]; + memset(keypress, 0, sizeof(INPUT) * 3); + keypress[0].type = INPUT_KEYBOARD; + keypress[0].ki.wVk = WORD(m_modifier); + keypress[1].type = INPUT_KEYBOARD; + keypress[1].ki.wVk = WORD(m_keyToPress); + keypress[2].type = INPUT_KEYBOARD; + keypress[2].ki.wVk = WORD(m_modifier); + keypress[2].ki.dwFlags = KEYEVENTF_KEYUP; + SendInput(3, keypress, sizeof(INPUT)); + } + else + { + INPUT keypress; + memset(&keypress, 0, sizeof(INPUT)); + keypress.type = INPUT_KEYBOARD; + keypress.ki.wVk = WORD(m_keyToPress); + SendInput(1, &keypress, sizeof(INPUT)); + } +#elif defined(TARGET_OS_Linux) + // @todo +#endif + } + } + } + if (m_decoder.isEndReceived()) { } // NOP + } + return true; +} + +void CBoxAlgorithmKeypressEmulator::registerEnums(const Kernel::IPluginModuleContext& ctx) +{ + ctx.getTypeManager().registerEnumerationType(OVP_TypeId_Keypress_Modifier, "Key modifier"); + ctx.getTypeManager().registerEnumerationEntry(OVP_TypeId_Keypress_Modifier, "None", OVP_TypeId_Keypress_Modifier_None.id()); + ctx.getTypeManager().registerEnumerationEntry(OVP_TypeId_Keypress_Modifier, "Shift", OVP_TypeId_Keypress_Modifier_Shift.id()); + ctx.getTypeManager().registerEnumerationEntry(OVP_TypeId_Keypress_Modifier, "Ctrl", OVP_TypeId_Keypress_Modifier_Control.id()); + ctx.getTypeManager().registerEnumerationEntry(OVP_TypeId_Keypress_Modifier, "Alt", OVP_TypeId_Keypress_Modifier_Alt.id()); + + ctx.getTypeManager().registerEnumerationType(OVP_TypeId_Keypress_Key, "Key"); + +#if defined(TARGET_OS_Windows) + // @note this solution makes the scenario not portable between win<->linux. The challenge is keys such as F1 etc, + // otherwise we could just read ascii char and map it to a key. + // @fixme we're also not able to expose all the possible keys to the user this way, but the problem seems to be that + // GetKeyNameTextA does not give meaningful & different names to all keys for some reason. + // - The current appoarch attempts to expose the usual 'english' keys that can be visualized by pango. + // - We do not necessarily get arrow keys listed as these may not have a separate representation from + // the corresponding 'numpad' keys with the functions we call here; esp. GetKeyNameTextA seems to + // depend on the keyboard in use. This limits the scenario portability across keyboards. + for (int i = 0; i < 256; ++i) + { + const UINT mapped = MapVirtualKeyA(UINT(i), MAPVK_VK_TO_VSC); + const LONG scanCode = mapped << 16; + + if (scanCode) + { + CHAR buffer[512]; + if (GetKeyNameTextA(scanCode, buffer, 512)) + { + std::string tmp(buffer); + + if (tmp.find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_*&$%@^#!-+/\\ :;,.'`~()[]\"=") != std::string::npos) + { + // Some weird characters here, may be difficult to render for pango, ignore this key + continue; + } + + // GetKeyNameTextA can return the same name for different keys. Only use the first one. + if (ctx.getTypeManager().getEnumerationEntryValueFromName(OVP_TypeId_Keypress_Key, buffer) == CIdentifier::undefined().id()) + { + ctx.getTypeManager().registerEnumerationEntry(OVP_TypeId_Keypress_Key, buffer, i); + } + } + } + } + +#elif defined(TARGET_OS_Linux) + // @todo register the linux keys to the enum here +#endif +} +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmKeypressEmulator.h b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmKeypressEmulator.h new file mode 100644 index 0000000..834e480 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmKeypressEmulator.h @@ -0,0 +1,80 @@ +#pragma once + +#include "../ovp_defines.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Tools { +/** + * \class CBoxAlgorithmKeypressEmulator + * \author Jussi T. Lindgren / Inria + * \date 29.Oct.2019 + * \brief Emulates keypresses on a keyboard based on input stimulations. Based on a request from Fabien Lotte / POTIOC. + * + */ +class CBoxAlgorithmKeypressEmulator final : virtual public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_KeypressEmulator) + + // Register enums to the kernel used by this box + static void registerEnums(const Kernel::IPluginModuleContext& ctx); + +protected: + Toolkit::TStimulationDecoder m_decoder; + + // @todo for multiple triggers, use std::map<> + uint64_t m_triggerStimulation = 0; + uint64_t m_keyToPress = 0; + uint64_t m_modifier = 0; +}; + +class CBoxAlgorithmKeypressEmulatorDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Keypress Emulator"); } + CString getAuthorName() const override { return CString("Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Emulates pressing keyboard keys when receiving stimulations"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Tools"); } + CString getVersion() const override { return CString("0.1"); } + CString getStockItemName() const override { return CString("gtk-index"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_KeypressEmulator; } + IPluginObject* create() override { return new CBoxAlgorithmKeypressEmulator; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Stimulations",OV_TypeId_Stimulations); + + // @todo add support for multiple keys, e.g. look at VRPN boxes for howto + prototype.addSetting("Trigger", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00"); + prototype.addSetting("Key to press", OVP_TypeId_Keypress_Key, "A"); + prototype.addSetting("Key modifier", OVP_TypeId_Keypress_Modifier, OVP_TypeId_Keypress_Modifier_None.toString()); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_KeypressEmulatorDesc) +}; +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmLatencyEvaluation.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmLatencyEvaluation.cpp new file mode 100644 index 0000000..686f784 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmLatencyEvaluation.cpp @@ -0,0 +1,56 @@ +#include "ovpCBoxAlgorithmLatencyEvaluation.h" +#include + +// @note by just repeatedly printing to the console, this box introduces significant latency by itself. +// @fixme If it makes sense to enable this box at all, it should be reimplemented as printing to a small GUI widget instead. + +namespace OpenViBE { +namespace Plugins { +namespace Tools { + +bool CBoxAlgorithmLatencyEvaluation::initialize() +{ + CString logLevel; + getBoxAlgorithmContext()->getStaticBoxContext()->getSettingValue(0, logLevel); + m_LogLevel = Kernel::ELogLevel(getBoxAlgorithmContext()->getPlayerContext()->getTypeManager().getEnumerationEntryValueFromName(OV_TypeId_LogLevel, logLevel)); + + m_StartTime = System::Time::zgetTime(); + + return true; +} + +bool CBoxAlgorithmLatencyEvaluation::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} + +bool CBoxAlgorithmLatencyEvaluation::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const uint64_t time = getPlayerContext().getCurrentTime(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + const uint64_t start = boxContext.getInputChunkStartTime(0, i); + const uint64_t end = boxContext.getInputChunkEndTime(0, i); + const double startLatency = (double((int64_t(time - start) >> 22) * 1000) / 1024.0); + const double endLatency = (double((int64_t(time - end) >> 22) * 1000) / 1024.0); + + // getLogManager() << Kernel::LogLevel_Debug << "Timing values [start:end:current]=[" << tStart << ":" << tEnd << ":" << time << "]\n"; + getLogManager() << m_LogLevel << "Current latency at chunk " << i << " [start:end]=[" << startLatency << ":" << endLatency << "] ms\n"; + + boxContext.markInputAsDeprecated(0, i); + } + + const uint64_t elapsed = System::Time::zgetTime() - m_StartTime; + const double latency = (double((int64_t(elapsed - time) >> 22) * 1000) / 1024.0); + + getLogManager() << m_LogLevel << "Inner latency : " << latency << " ms\n"; + + return true; +} +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmLatencyEvaluation.h b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmLatencyEvaluation.h new file mode 100644 index 0000000..a6798e2 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmLatencyEvaluation.h @@ -0,0 +1,62 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Tools { +class CBoxAlgorithmLatencyEvaluation final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override { return true; } + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_LatencyEvaluation) + + uint64_t m_StartTime = 0; + Kernel::ELogLevel m_LogLevel = Kernel::ELogLevel::LogLevel_None; +}; + +class CBoxAlgorithmLatencyEvaluationDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Latency evaluation"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Evaluates i/o jittering and outputs values to log manager"); } + + CString getDetailedDescription() const override + { + return CString("This box evaluates i/o jittering comparing input chunk' start and end time against current clock time"); + } + + CString getCategory() const override { return CString("Tools"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-info"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_LatencyEvaluation; } + IPluginObject* create() override { return new CBoxAlgorithmLatencyEvaluation; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("input", OV_TypeId_EBMLStream); + prototype.addSetting("Log level to use", OV_TypeId_LogLevel, "Trace"); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_LatencyEvaluationDesc) +}; +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmMouseTracking.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmMouseTracking.cpp new file mode 100644 index 0000000..4ee5c52 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmMouseTracking.cpp @@ -0,0 +1,159 @@ +#if defined(TARGET_HAS_ThirdPartyGTK) + +#include "ovpCBoxAlgorithmMouseTracking.h" + +namespace OpenViBE { +namespace Plugins { +namespace Tools { + + +void motion_event_handler(GtkWidget* widget, GdkEventMotion* event, gpointer data); + +bool CBoxAlgorithmMouseTracking::initialize() +{ + // Feature vector stream encoder + m_algo0SignalEncoder.initialize(*this, 0); + // Feature vector stream encoder + m_algo1SignalEncoder.initialize(*this, 1); + + m_algo0SignalEncoder.getInputMatrix().setReferenceTarget(m_absoluteCoordinateBuffer); + m_algo1SignalEncoder.getInputMatrix().setReferenceTarget(m_relativeCoordinateBuffer); + + // Allocates coordinates Matrix + m_absoluteCoordinateBuffer = new CMatrix(); + m_relativeCoordinateBuffer = new CMatrix(); + + // Retrieves settings + m_sampling = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_nGeneratedEpochSample = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + m_nSentSample = 0; + m_MouseX = 0; + m_MouseY = 0; + m_prevX = 0; + m_prevY = 0; + + // Creates empty window to get mouse position + m_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_widget_add_events(m_window, GDK_POINTER_MOTION_MASK); + gtk_window_maximize(GTK_WINDOW(m_window)); + gtk_widget_show_all(m_window); + + g_signal_connect(m_window, "motion-notify-event", G_CALLBACK(motion_event_handler), this); + + m_headerSent = false; + + m_algo0SignalEncoder.getInputSamplingRate() = m_sampling; + m_algo1SignalEncoder.getInputSamplingRate() = m_sampling; + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmMouseTracking::uninitialize() +{ + m_algo0SignalEncoder.uninitialize(); + m_algo1SignalEncoder.uninitialize(); + + delete m_absoluteCoordinateBuffer; + m_absoluteCoordinateBuffer = nullptr; + + delete m_relativeCoordinateBuffer; + m_relativeCoordinateBuffer = nullptr; + + gtk_widget_destroy(m_window); + m_window = nullptr; + + return true; +} +/*******************************************************************************/ + + +bool CBoxAlgorithmMouseTracking::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} +/*******************************************************************************/ + + +uint64_t CBoxAlgorithmMouseTracking::getClockFrequency() +{ + // Intentional parameter swap to get the frequency + m_clockFrequency = CTime(m_nGeneratedEpochSample, m_sampling).time(); + + return m_clockFrequency; +} + +/*******************************************************************************/ + +bool CBoxAlgorithmMouseTracking::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + //Send header and initialize Matrix + if (!m_headerSent) + { + m_absoluteCoordinateBuffer->resize(2, m_nGeneratedEpochSample); + m_absoluteCoordinateBuffer->setDimensionLabel(0, 0, "x"); + m_absoluteCoordinateBuffer->setDimensionLabel(0, 1, "y"); + + m_relativeCoordinateBuffer->resize(2, m_nGeneratedEpochSample); + m_relativeCoordinateBuffer->setDimensionLabel(0, 0, "x"); + m_relativeCoordinateBuffer->setDimensionLabel(0, 1, "y"); + + + m_algo0SignalEncoder.encodeHeader(); + m_algo1SignalEncoder.encodeHeader(); + + m_headerSent = true; + + boxContext.markOutputAsReadyToSend(0, 0, 0); + boxContext.markOutputAsReadyToSend(1, 0, 0); + } + else //Do the process and send coordinates to output + { + const size_t nSentSample = m_nSentSample; + + + for (size_t i = 0; i < m_nGeneratedEpochSample; ++i) + { + m_absoluteCoordinateBuffer->getBuffer()[0 * m_nGeneratedEpochSample + i] = m_MouseX; + m_absoluteCoordinateBuffer->getBuffer()[1 * m_nGeneratedEpochSample + i] = m_MouseY; + + m_relativeCoordinateBuffer->getBuffer()[0 * m_nGeneratedEpochSample + i] = m_MouseX - m_prevX; + m_relativeCoordinateBuffer->getBuffer()[1 * m_nGeneratedEpochSample + i] = m_MouseY - m_prevY; + } + + + m_prevX = m_MouseX; + m_prevY = m_MouseY; + + m_nSentSample += m_nGeneratedEpochSample; + + const uint64_t tStart = CTime(m_sampling, nSentSample).time(); + const uint64_t tEnd = CTime(m_sampling, m_nSentSample).time(); + + m_algo0SignalEncoder.encodeBuffer(); + m_algo1SignalEncoder.encodeBuffer(); + + boxContext.markOutputAsReadyToSend(0, tStart, tEnd); + boxContext.markOutputAsReadyToSend(1, tStart, tEnd); + } + return true; +} + +// CALLBACK +// Get mouse position +void motion_event_handler(GtkWidget* /*widget*/, GdkEventMotion* event, gpointer data) +{ + CBoxAlgorithmMouseTracking* box = static_cast(data); + box->m_MouseX = double(event->x); + box->m_MouseY = double(event->y); +} + + +#endif +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmMouseTracking.h b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmMouseTracking.h new file mode 100644 index 0000000..831f141 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmMouseTracking.h @@ -0,0 +1,141 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyGTK) + +#include "../ovp_defines.h" + +#include +#include + +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Tools { +/** + * \class CBoxAlgorithmMouseTracking + * \author Alison Cellard (Inria) + * \date Mon Mar 10 15:07:21 2014 + * \brief The class CBoxAlgorithmMouseTracking describes the box Mouse tracking. + * + */ +class CBoxAlgorithmMouseTracking final : virtual public Toolkit::TBoxAlgorithm +{ +public: + + // CBoxAlgorithmMouseTracking(); + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + bool processClock(Kernel::CMessageClock& msg) override; + uint64_t getClockFrequency() override; + + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_MouseTracking) + +protected: + // Feature vector stream encoder + Toolkit::TSignalEncoder m_algo0SignalEncoder; + // Feature vector stream encoder + Toolkit::TSignalEncoder m_algo1SignalEncoder; + + // To check if the header was sent or not + bool m_headerSent = false; + + // Requested Sampling frequency + size_t m_sampling = 0; + // Process clock frequency + uint64_t m_clockFrequency = 0; + + // Length of output chunks + size_t m_nGeneratedEpochSample = 0; + // Absolute coordinates of the mouse pointer, that is, relative to the window in fullscreen + CMatrix* m_absoluteCoordinateBuffer = nullptr; + // Relative coordinates of the mouse pointer, the coordinates is relative to the previous point + CMatrix* m_relativeCoordinateBuffer = nullptr; + + size_t m_nSentSample = 0; + + // Gtk window to track mouse position + GtkWidget* m_window = nullptr; + + // X coordinate from the previous position (in pixel, reference is upper left corner of window) + double m_prevX = 0; + // Y coordinate from the previous position (in pixel, reference is upper left corner of window) + double m_prevY = 0; + + +public: + // X coordinate of mouse current position + double m_MouseX = 0; + // Y coordinate of mouse current position + double m_MouseY = 0; +}; + + +class CBoxAlgorithmMouseTrackingListener final : public Toolkit::TBoxListener +{ +public: + bool onSettingValueChanged(Kernel::IBox& /*box*/, const size_t /*index*/) override { return true; } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + + +/** + * \class CBoxAlgorithmMouseTrackingDesc + * \author Alison Cellard (Inria) + * \date Mon Mar 10 15:07:21 2014 + * \brief Descriptor of the box Mouse tracking. + * + */ +class CBoxAlgorithmMouseTrackingDesc final : virtual public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Mouse Tracking"); } + CString getAuthorName() const override { return CString("Alison Cellard"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Track mouse position within the screen"); } + + CString getDetailedDescription() const override { return CString("Return absolute and relative to the previous one mouse position"); } + + CString getCategory() const override { return CString("Tools"); } + CString getVersion() const override { return CString("1"); } + CString getStockItemName() const override { return CString("gtk-index"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_MouseTracking; } + IPluginObject* create() override { return new CBoxAlgorithmMouseTracking; } + + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmMouseTrackingListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addOutput("Absolute coordinate",OV_TypeId_Signal); + prototype.addOutput("Previous relative coordinate",OV_TypeId_Signal); + + prototype.addSetting("Sampling Frequency",OV_TypeId_Integer, "16"); + prototype.addSetting("Generated epoch sample count",OV_TypeId_Integer, "1"); + + prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_MouseTrackingDesc) +}; +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE + + +#endif diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/ovp_defines.h new file mode 100755 index 0000000..fa6acf9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/ovp_defines.h @@ -0,0 +1,25 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_LatencyEvaluation OpenViBE::CIdentifier(0x0AD11EC1, 0x7EF3690B) +#define OVP_ClassId_BoxAlgorithm_LatencyEvaluationDesc OpenViBE::CIdentifier(0x5DB56A54, 0x5380262B) +#define OVP_ClassId_BoxAlgorithm_MouseTracking OpenViBE::CIdentifier(0x1E386EE5, 0x203E13C6) +#define OVP_ClassId_BoxAlgorithm_MouseTrackingDesc OpenViBE::CIdentifier(0x7A31C11B, 0xF522262E) +#define OVP_ClassId_BoxAlgorithm_KeypressEmulator OpenViBE::CIdentifier(0x38503532, 0x19494145) +#define OVP_ClassId_BoxAlgorithm_KeypressEmulatorDesc OpenViBE::CIdentifier(0x59286224, 0x99423852) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) + +#define OVP_TypeId_Keypress_Key OpenViBE::CIdentifier(0x23E525F9, 0x005F187D) +#define OVP_TypeId_Keypress_Modifier OpenViBE::CIdentifier(0x0C4F4585, 0x78B246AC) +#define OVP_TypeId_Keypress_Modifier_None OpenViBE::CIdentifier(0x5A70497E, 0x52F57199) +#define OVP_TypeId_Keypress_Modifier_Shift OpenViBE::CIdentifier(0x47534AA6, 0x138A1130) +#define OVP_TypeId_Keypress_Modifier_Control OpenViBE::CIdentifier(0x67C6455F, 0x08E6134D) +#define OVP_TypeId_Keypress_Modifier_Alt OpenViBE::CIdentifier(0x77577AEA, 0x74CD7E3E) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/ovp_main.cpp new file mode 100755 index 0000000..906ef45 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/tools/src/ovp_main.cpp @@ -0,0 +1,29 @@ +#include "ovp_defines.h" + +//// #include "box-algorithms/ovpCBoxAlgorithmLatencyEvaluation.h" +#include "box-algorithms/ovpCBoxAlgorithmMouseTracking.h" +#include "box-algorithms/ovpCBoxAlgorithmKeypressEmulator.h" + +#include "openvibe/CIdentifier.hpp" + +namespace OpenViBE { +namespace Plugins { +namespace Tools { + +OVP_Declare_Begin() + context.getTypeManager().registerEnumerationEntry(OV_TypeId_BoxAlgorithmFlag, OV_AttributeId_Box_FlagIsUnstable.toString(), + OV_AttributeId_Box_FlagIsUnstable.id()); + // OVP_Declare_New(Tools::CBoxAlgorithmLatencyEvaluationDesc); +#if defined(TARGET_HAS_ThirdPartyGTK) + OVP_Declare_New(CBoxAlgorithmMouseTrackingDesc); +#endif + + OVP_Declare_New(CBoxAlgorithmKeypressEmulatorDesc); + // @note the following code is a bit long so we've implemented it inside the class + CBoxAlgorithmKeypressEmulator::registerEnums(context); + +OVP_Declare_End() + +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/CMakeLists.txt new file mode 100644 index 0000000..f9780d7 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/CMakeLists.txt @@ -0,0 +1,34 @@ +PROJECT(openvibe-plugins-vrpn) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING}) + +INCLUDE("FindThirdPartyVRPN_Check") +IF(NOT PATH_VRPN) + MESSAGE(STATUS " --> Not building ${PROJECT_NAME}") + RETURN() +ENDIF(NOT PATH_VRPN) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleSocket") +INCLUDE("FindThirdPartyVRPN") + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/doc/Doc_BoxAlgorithm_AnalogVRPNServer.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/doc/Doc_BoxAlgorithm_AnalogVRPNServer.dox-part new file mode 100644 index 0000000..fa17117 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/doc/Doc_BoxAlgorithm_AnalogVRPNServer.dox-part @@ -0,0 +1,84 @@ +/** + * \page BoxAlgorithm_AnalogVRPNServer Analog VRPN server +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_AnalogVRPNServer_Description| + * + * This plugin exposes several \ref Doc_Streams_StreamedMatrix streams + * to an external application thanks to the \e VRPN protocol. \e VRPN stands + * for Virtual Reality Peripheral Network (http://www.cs.unc.edu/Research/vrpn/). + * It consists in a library that abstracts most used VR peripherals as + * an aggregation of basic components such as \e analogic data, \e buttons + * or \e trackers (localisation and orientation in space). + * + * The way §OpenViBE§ exposes \ref Doc_Streams_StreamedMatrix streams to + * external applications consists in emulating an multi-channel analogic + * device. The number of elements contained in the buffers of the stream + * will fix the number of channels of the emulated device. Given this + * behavior, any \e VRPN ready application is able to get parameters + * from §OpenViBE§ and to provide feedback to the user as visual information + * or whatever way the feedback should be done. + * + * |OVP_DocEnd_BoxAlgorithm_AnalogVRPNServer_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_AnalogVRPNServer_Inputs| + * This box accepts unlimited number of inputs. Initial box only + * has a single input but you can add as many \ref Doc_Streams_StreamedMatrix + * derived inputs as you want to the box. + * + * Note that in case you add inputs, the total number of channels + * of the emulated device will be the sum of the number of elements + * of each buffer. + * |OVP_DocEnd_BoxAlgorithm_AnalogVRPNServer_Inputs| + * + * |OVP_DocBegin_BoxAlgorithm_AnalogVRPNServer_Input1| + * This input will receive the matrices from preceding boxes and + * update the multi-analog device according to the matrix buffer. + * |OVP_DocEnd_BoxAlgorithm_AnalogVRPNServer_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_AnalogVRPNServer_Settings| + * |OVP_DocEnd_BoxAlgorithm_AnalogVRPNServer_Settings| + * + * |OVP_DocBegin_BoxAlgorithm_AnalogVRPNServer_Setting1| + * This setting contains the name of the emulated peripheral. This will be used + * by the external application in order to connect to this peripheral. If this + * setting is \e openvibe-vrpn and the machine running §OpenViBE§ is + * \e openvibe-machine, then the complete \e VRPN peripheral name is + * \e openvibe-vrpn\@\e openvibe-machine. + * |OVP_DocEnd_BoxAlgorithm_AnalogVRPNServer_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_AnalogVRPNServer_Examples| + * |OVP_DocEnd_BoxAlgorithm_AnalogVRPNServer_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_AnalogVRPNServer_Miscellaneous| + * This box lacks an additional setting to specify the connection port. + * Default \e VRPN connection port is \c 3883. But it may be possible that + * you want to expose §OpenViBE§ on another port. This is not currently possible. + * + * Note that if the box receives no input header or data, the clients + * will see a channel count of 0 until header has been processed by the box. + * + * For \e buttons emulation, you way want to look at the + * \ref Doc_BoxAlgorithm_ButtonVRPNServer documentation that does almost + * the same as this box but transcoding stimulations to button states. + * |OVP_DocEnd_BoxAlgorithm_AnalogVRPNServer_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/doc/Doc_BoxAlgorithm_ButtonVRPNServer.dox-part b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/doc/Doc_BoxAlgorithm_ButtonVRPNServer.dox-part new file mode 100644 index 0000000..e1f63eb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/doc/Doc_BoxAlgorithm_ButtonVRPNServer.dox-part @@ -0,0 +1,106 @@ +/** + * \page BoxAlgorithm_ButtonVRPNServer Button VRPN server +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ButtonVRPNServer_Description| + * + * This plugin exposes several boolean states + * to an external application thanks to the \e VRPN protocol. \e VRPN stands + * for Virtual Reality Peripheral Network (http://www.cs.unc.edu/Research/vrpn/). + * It consists in a library that abstracts most used VR peripherals as + * an aggregation of basic components such as \e analogic data, \e buttons + * or \e trackers (localisation and orientation in space). + * + * The way §OpenViBE§ exposes these boolean states to + * external applications consists in emulating a multi-button + * device. The states are controled by stimulation streams and each + * button can be pressed and released by given stimulation identifiers. + * The number of buttons of the emulated device depends on the number + * of input of the box. Each time an input is added, the corresponding + * on/off stimulations are added to the settings of the box. Given this + * behavior, any \e VRPN ready application is able to get parameters + * from §OpenViBE§ and to provide feedback to the user as visual information + * or whatever way the feedback should be done. + * + * |OVP_DocEnd_BoxAlgorithm_ButtonVRPNServer_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ButtonVRPNServer_Inputs| + * This box accepts unlimited number of inputs. Initial box only + * has a single input but you can add as many \ref Doc_Streams_Stimulation + * inputs as you want to the box. + * + * Note that in case you add inputs, the total number of button + * of the emulated device will be the exact number of inputs, and + * that the corresponding settings will be added automatically. + * |OVP_DocEnd_BoxAlgorithm_ButtonVRPNServer_Inputs| + * + * |OVP_DocBegin_BoxAlgorithm_ButtonVRPNServer_Input1| + * This input will receive a stimulation stream and change the corresponding + * button state according to two stimulations. + * |OVP_DocEnd_BoxAlgorithm_ButtonVRPNServer_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ButtonVRPNServer_Settings| + * Each input have a corresponding pair of stimulation codes that are + * used to press or release a button. When the first stimulation is + * found, the button switches to sate \e pressed. When the second one + * is found, the button switches to state \e released. In case the + * first stimulation appears while the button is already \e pressed, + * nothing happens. Similarly, when the second stimulation appears while + * the button is already \e released, nothing happens. + * + * If the on and off stimulation codes for a given button are the same, + * then when this stimulation happens, the button state switches to \e pressed + * and immediately comes back to \e released. Client application will receive + * the two state changes. + * |OVP_DocEnd_BoxAlgorithm_ButtonVRPNServer_Settings| + * + * |OVP_DocBegin_BoxAlgorithm_ButtonVRPNServer_Setting1| + * This setting contains the name of the emulated peripheral. This will be used + * by the external application in order to connect to this peripheral. If this + * setting is \e openvibe-vrpn and the machine running §OpenViBE§ is + * \e openvibe-machine, then the complete \e VRPN peripheral name is + * \e openvibe-vrpn\@\e openvibe-machine. + * |OVP_DocEnd_BoxAlgorithm_ButtonVRPNServer_Setting1| + * + * |OVP_DocBegin_BoxAlgorithm_ButtonVRPNServer_Setting2| + * This setting gives the stimulation code to track to switch button state to + * \e pressed. + * |OVP_DocEnd_BoxAlgorithm_ButtonVRPNServer_Setting2| + * + * |OVP_DocBegin_BoxAlgorithm_ButtonVRPNServer_Setting3| + * This setting gives the stimulation code to track to switch button state to + * \e released. + * |OVP_DocEnd_BoxAlgorithm_ButtonVRPNServer_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ButtonVRPNServer_Examples| + * |OVP_DocEnd_BoxAlgorithm_ButtonVRPNServer_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ButtonVRPNServer_Miscellaneous| + * This box lacks an additional setting to specify the connection port. + * Default \e VRPN connection port is \c 3883. But it may be possible that + * you want to expose §OpenViBE§ on another port. This is not currently possible. + * + * For \e analogs emulation, you way want to look at the + * \ref Doc_BoxAlgorithm_AnalogVRPNServer documentation that does almost + * the same as this box but transcoding streamed matrices to analog states. + * |OVP_DocEnd_BoxAlgorithm_ButtonVRPNServer_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCBoxAlgorithmVRPNAnalogClient.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCBoxAlgorithmVRPNAnalogClient.cpp new file mode 100644 index 0000000..159705d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCBoxAlgorithmVRPNAnalogClient.cpp @@ -0,0 +1,154 @@ +#if defined TARGET_HAS_ThirdPartyVRPN + +#include "ovpCBoxAlgorithmVRPNAnalogClient.h" + +namespace OpenViBE { +namespace Plugins { +namespace VRPN { + + +static void VRPN_CALLBACK vrpn_analog_cb(void* data, const vrpn_ANALOGCB a) +{ + CBoxAlgorithmVRPNAnalogClient* client = static_cast(data); + client->setAnalog(a.num_channel, a.channel); +} + +bool CBoxAlgorithmVRPNAnalogClient::initialize() +{ + m_vrpnAnalogRemote = nullptr; + + m_peripheralName = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_sampling = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_nChannel = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2)); + m_nSamplePerSentBlock = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3)); + + m_encoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + m_encoder->initialize(); + + ip_matrix.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Matrix)); + ip_sampling.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)); + op_buffer.initialize(m_encoder->getOutputParameter(OVP_GD_Algorithm_SignalEncoder_OutputParameterId_EncodedMemoryBuffer)); + + m_firstStart = true; + m_lastChunkEndTime = 0; + + m_chunkDuration = CTime(m_sampling, m_nSamplePerSentBlock).time(); + + m_lastSamples.resize(m_nChannel); + m_sampleBuffer.clear(); + + return true; +} + +bool CBoxAlgorithmVRPNAnalogClient::uninitialize() +{ + if (m_vrpnAnalogRemote) + { + delete m_vrpnAnalogRemote; + m_vrpnAnalogRemote = nullptr; + } + + if (m_encoder) + { + m_encoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_encoder); + m_encoder = nullptr; + } + + m_sampleBuffer.clear(); + m_lastSamples.clear(); + + return true; +} + +bool CBoxAlgorithmVRPNAnalogClient::processClock(Kernel::CMessageClock& /*msg*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmVRPNAnalogClient::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + if (m_firstStart) + { + ip_sampling = m_sampling; + ip_matrix->resize(m_nChannel, m_nSamplePerSentBlock); + + // @TODO do labels ? + + op_buffer = boxContext.getOutputChunk(0); + m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeHeader); + boxContext.markOutputAsReadyToSend(0, 0, 0); + + m_lastSamples.resize(m_nChannel); + for (size_t i = 0; i < m_nChannel; ++i) { m_lastSamples[i] = 0; } + + m_firstStart = false; + } + + if (!m_vrpnAnalogRemote) + { + m_vrpnAnalogRemote = new vrpn_Analog_Remote(m_peripheralName.toASCIIString()); + m_vrpnAnalogRemote->register_change_handler(this, &vrpn_analog_cb); + } + + m_vrpnAnalogRemote->mainloop(); + + const uint64_t time = this->getPlayerContext().getCurrentTime(); + + if ((time - m_lastChunkEndTime) >= m_chunkDuration) + { + // Time to send a chunk. Copy our current sample buffer to the output matrix. + size_t idx = 0; + double* oBuffer = ip_matrix->getBuffer(); + + while (!m_sampleBuffer.empty()) + { + const std::vector& tmp = m_sampleBuffer.front(); + + for (size_t j = 0; j < m_nChannel; ++j) { oBuffer[j * m_nSamplePerSentBlock + idx] = tmp[j]; } + + m_sampleBuffer.pop_front(); + idx++; + } + // If the buffer didn't have enough data from callbacks, pad with the last sample + while (idx < m_nSamplePerSentBlock) + { + for (size_t j = 0; j < m_nChannel; ++j) { oBuffer[j * m_nSamplePerSentBlock + idx] = m_lastSamples[j]; } + idx++; + } + + op_buffer = boxContext.getOutputChunk(0); + m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(0, m_lastChunkEndTime, m_lastChunkEndTime + m_chunkDuration); + m_lastChunkEndTime += m_chunkDuration; +#if defined _DEBUG + const double diff = CTime(m_lastChunkEndTime).toSeconds() - CTime(time).toSeconds(); + if (std::abs(diff) > 1) { this->getLogManager() << Kernel::LogLevel_Warning << "Time difference detected: " << diff << " secs.\n"; } +#endif + } + + return true; +} + +void CBoxAlgorithmVRPNAnalogClient::setAnalog(const size_t nAnalog, const double* analog) +{ + // Count how many samples are encoded in pAnalog + const size_t nSample = nAnalog / m_nChannel; + for (size_t i = 0; i < nSample; ++i) + { + // Append the sample to the buffer + for (size_t j = 0; j < m_nChannel; ++j) { m_lastSamples[j] = analog[j * nSample + i]; } + m_sampleBuffer.push_back(m_lastSamples); + + // Drop the oldest sample if our buffer got full. This means that VRPN is sending data faster than we consume. + if (m_sampleBuffer.size() > m_nSamplePerSentBlock) { m_sampleBuffer.pop_front(); } + } +} + +#endif // TARGET_HAS_ThirdPartyVRPN +} // namespace VRPN +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCBoxAlgorithmVRPNAnalogClient.h b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCBoxAlgorithmVRPNAnalogClient.h new file mode 100644 index 0000000..2c12a09 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCBoxAlgorithmVRPNAnalogClient.h @@ -0,0 +1,96 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyVRPN + +#include "../ovp_defines.h" +#include +#include + +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace VRPN { +class CBoxAlgorithmVRPNAnalogClient final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + uint64_t getClockFrequency() override { return 128LL << 32; } // the box clock frequency + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_VRPNAnalogClient) + + void setAnalog(size_t nAnalog, const double* analog); + +protected: + + uint64_t m_lastChunkEndTime = 0; + uint64_t m_chunkDuration = 0; + size_t m_sampling = 0; + size_t m_nChannel = 0; + size_t m_nSamplePerSentBlock = 0; + + bool m_firstStart = false; + + Kernel::IAlgorithmProxy* m_encoder = nullptr; + Kernel::TParameterHandler ip_matrix; + Kernel::TParameterHandler ip_sampling; + Kernel::TParameterHandler op_buffer; + + CString m_peripheralName; + + std::deque> m_sampleBuffer; // Used as a limited-size buffer of sample vectors + std::vector m_lastSamples; // The last sample received from VRPN + + vrpn_Analog_Remote* m_vrpnAnalogRemote = nullptr; +}; + +class CBoxAlgorithmVRPNAnalogClientDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Analog VRPN Client"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + + CString getShortDescription() const override + { + return CString("Connects to an external VRPN device and translate an analog information into OpenViBE signal"); + } + + CString getDetailedDescription() const override { return CString("-"); } + CString getCategory() const override { return CString("Acquisition and network IO/VRPN"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-connect"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_VRPNAnalogClient; } + IPluginObject* create() override { return new CBoxAlgorithmVRPNAnalogClient; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + // prototype.addInput ("input name", /* input type (OV_TypeId_Signal) */); + prototype.addOutput("Output", OV_TypeId_Signal); + prototype.addSetting("Peripheral name", OV_TypeId_String, "openvibe-vrpn@localhost"); + prototype.addSetting("Sampling Rate", OV_TypeId_Integer, "512"); + prototype.addSetting("Number of Channels", OV_TypeId_Integer, "16"); + prototype.addSetting("Sample Count per Sent Block", OV_TypeId_Integer, "32"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_VRPNAnalogClientDesc) +}; +} // namespace VRPN +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyVRPN diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCBoxAlgorithmVRPNButtonClient.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCBoxAlgorithmVRPNButtonClient.cpp new file mode 100644 index 0000000..d299a96 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCBoxAlgorithmVRPNButtonClient.cpp @@ -0,0 +1,137 @@ +#if defined TARGET_HAS_ThirdPartyVRPN + +#include "ovpCBoxAlgorithmVRPNButtonClient.h" + +namespace OpenViBE { +namespace Plugins { +namespace VRPN { + +static void VRPN_CALLBACK vrpn_button_cb(void* data, const vrpn_BUTTONCB b) +{ + CBoxAlgorithmVRPNButtonClient* box = static_cast(data); + + (box->m_Buttons).push_back(std::pair(b.button, b.state ? true : false)); +} + +bool CBoxAlgorithmVRPNButtonClient::initialize() +{ + const size_t nOutput = this->getStaticBoxContext().getOutputCount(); + + for (size_t i = 0; i < nOutput; ++i) + { + Kernel::IAlgorithmProxy* encoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationEncoder)); + encoder->initialize(); + CStimulationSet* stimSet = new CStimulationSet(); + Kernel::TParameterHandler ip_StimSet(encoder->getInputParameter(OVP_GD_Algorithm_StimulationEncoder_InputParameterId_StimulationSet)); + ip_StimSet = stimSet; + m_encoders.push_back(encoder); + m_stimSets.push_back(stimSet); + + m_stimIDsOn.push_back(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i * 2 + 1)); + m_stimIDsOff.push_back(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i * 2 + 2)); + } + + const CString name = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + m_vrpnButtonRemote = new vrpn_Button_Remote(name.toASCIIString()); + m_vrpnButtonRemote->register_change_handler(static_cast(this), vrpn_button_cb); + + m_lastChunkEndTime = uint64_t(-1); + + return true; +} + +bool CBoxAlgorithmVRPNButtonClient::uninitialize() +{ + const size_t nOutput = this->getStaticBoxContext().getOutputCount(); + + delete m_vrpnButtonRemote; + m_vrpnButtonRemote = nullptr; + + for (size_t i = 0; i < nOutput; ++i) + { + delete m_stimSets[i]; + m_encoders[i]->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_encoders[i]); + } + m_stimSets.clear(); + m_encoders.clear(); + m_stimIDsOn.clear(); + m_stimIDsOff.clear(); + + return true; +} + +bool CBoxAlgorithmVRPNButtonClient::processClock(Kernel::CMessageClock& /*msg*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + + +bool CBoxAlgorithmVRPNButtonClient::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const size_t nOutput = this->getStaticBoxContext().getOutputCount(); + size_t i; + + // Clears pending stimulations + for (i = 0; i < nOutput; ++i) { m_stimSets[i]->clear(); } + + // Refreshes VRPN device + m_gotStimulation = false; + m_vrpnButtonRemote->mainloop(); + + while (!m_Buttons.empty()) + { + const std::pair state = m_Buttons.front(); + m_Buttons.pop_front(); + + setButton(state.first, state.second); + } + + // Encodes streams + for (i = 0; i < nOutput; ++i) + { + Kernel::TParameterHandler op_buffer( + m_encoders[i]->getOutputParameter(OVP_GD_Algorithm_StimulationEncoder_OutputParameterId_EncodedMemoryBuffer)); + op_buffer = boxContext.getOutputChunk(i); + if (m_lastChunkEndTime == uint64_t(-1)) + { + m_encoders[i]->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeHeader); + boxContext.markOutputAsReadyToSend(i, 0, 0); + } + else + { + if (m_gotStimulation) { m_encoders[i]->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeBuffer); } + boxContext.markOutputAsReadyToSend(i, m_lastChunkEndTime, this->getPlayerContext().getCurrentTime()); + } + } + + // Updates timings + m_lastChunkEndTime = this->getPlayerContext().getCurrentTime(); + + return true; +} + +void CBoxAlgorithmVRPNButtonClient::setButton(const size_t index, const bool pressed) +{ + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + + if (index >= boxContext.getOutputCount()) + { + this->getLogManager() << Kernel::LogLevel_Warning << "Ignored button " << index + 1 << " with state " << CString(pressed ? "pressed" : "released") << "...\n"; + } + else + { + this->getLogManager() << Kernel::LogLevel_Trace << "Changed button " << index + 1 << " with state " << CString(pressed ? "pressed" : "released") << "...\n"; + if (pressed) { m_stimSets[index]->appendStimulation(m_stimIDsOn[index], this->getPlayerContext().getCurrentTime(), 0); } + else { m_stimSets[index]->appendStimulation(m_stimIDsOff[index], this->getPlayerContext().getCurrentTime(), 0); } + m_gotStimulation = true; + } +} +#endif // TARGET_HAS_ThirdPartyVRPN +} // namespace VRPN +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCBoxAlgorithmVRPNButtonClient.h b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCBoxAlgorithmVRPNButtonClient.h new file mode 100644 index 0000000..4207dc1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCBoxAlgorithmVRPNButtonClient.h @@ -0,0 +1,119 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyVRPN + +#include "../ovp_defines.h" +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace VRPN { +class CBoxAlgorithmVRPNButtonClient final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + uint64_t getClockFrequency() override { return 128LL << 32; } // the box clock frequency + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_VRPNButtonClient) + + std::list> m_Buttons; + void setButton(const size_t index, const bool pressed); + +protected: + + uint64_t m_lastChunkEndTime = 0; + bool m_gotStimulation = false; + std::vector m_encoders; + std::vector m_stimSets; + std::vector m_stimIDsOn; + std::vector m_stimIDsOff; + vrpn_Button_Remote* m_vrpnButtonRemote = nullptr; +}; + +class CBoxAlgorithmVRPNButtonClientListener final : public Toolkit::TBoxListener +{ +public: + + static bool check(Kernel::IBox& box) + { + for (size_t i = 0; i < box.getOutputCount(); ++i) + { + const std::string idx = std::to_string(i + 1); + box.setOutputName(i, ("Output " + idx).c_str()); + box.setSettingName(i * 2 + 1, ("Button " + idx + " ON").c_str()); + box.setSettingName(i * 2 + 2, ("Button " + idx + " OFF").c_str()); + } + return true; + } + + bool onOutputAdded(Kernel::IBox& box, const size_t index) override + { + box.setOutputType(index, OV_TypeId_Stimulations); + box.addSetting("", OV_TypeId_Stimulation, "OVTK_GDF_Feedback_Continuous"); + box.addSetting("", OV_TypeId_Stimulation, "OVTK_GDF_End_Of_Trial"); + return check(box); + } + + bool onOutputRemoved(Kernel::IBox& box, const size_t index) override + { + box.removeSetting(index * 2 + 2); + box.removeSetting(index * 2 + 1); + return check(box); + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmVRPNButtonClientDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Button VRPN Client"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + + CString getShortDescription() const override + { + return CString("Connects to an external VRPN device and translate a button information into OpenViBE stimulations"); + } + + CString getDetailedDescription() const override { return CString("-"); } + CString getCategory() const override { return CString("Acquisition and network IO/VRPN"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-connect"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_VRPNButtonClient; } + IPluginObject* create() override { return new CBoxAlgorithmVRPNButtonClient; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmVRPNButtonClientListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + // prototype.addInput ("input name", /* input type (OV_TypeId_Signal) */); + prototype.addOutput("Output", OV_TypeId_Stimulations); + prototype.addSetting("Peripheral name", OV_TypeId_String, "openvibe-vrpn@localhost"); + prototype.addSetting("Button 1 ON", OV_TypeId_Stimulation, "OVTK_GDF_Feedback_Continuous"); + prototype.addSetting("Button 1 OFF", OV_TypeId_Stimulation, "OVTK_GDF_End_Of_Trial"); + prototype.addFlag(Kernel::BoxFlag_CanAddOutput); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_VRPNButtonClientDesc) +}; +} // namespace VRPN +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyVRPN diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCVRPNAnalogServer.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCVRPNAnalogServer.cpp new file mode 100644 index 0000000..1fcb380 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCVRPNAnalogServer.cpp @@ -0,0 +1,144 @@ +#if defined TARGET_HAS_ThirdPartyVRPN + +#include "ovpCVRPNAnalogServer.h" +#include "../ovpIVRPNServerManager.h" + +namespace OpenViBE { +namespace Plugins { +namespace VRPN { + +bool CVRPNAnalogServer::initialize() +{ + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + // Gets server name, and creates an analog server for this server + const CString name = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + // Creates the stream decoders + for (size_t i = 0; i < nInput; ++i) + { + m_decoders[i] = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixDecoder)); + m_decoders[i]->initialize(); + } + + // Creates the peripheral + IVRPNServerManager::getInstance().initialize(); + IVRPNServerManager::getInstance().addServer(name, m_serverID); + + // We don't know the analog count yet before we get a header, so set to zero. + // This convention will avoid client problems that misleadingly report 'no response from server'. + // The client should check that the channel amount is positive and use that as + // an indication of the box having received at least a proper header. + IVRPNServerManager::getInstance().setAnalogCount(m_serverID, 0); + IVRPNServerManager::getInstance().reportAnalog(m_serverID); + + return true; +} + +bool CVRPNAnalogServer::uninitialize() +{ + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + // Releases decoders + for (size_t i = 0; i < nInput; ++i) + { + m_decoders[i]->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_decoders[i]); + } + m_decoders.clear(); + m_nAnalogs.clear(); + + // Releases the peripheral + IVRPNServerManager::getInstance().uninitialize(); + + return true; +} + +bool CVRPNAnalogServer::processClock(Kernel::CMessageClock& /*msg*/) +{ + // Note: This call doesn't seem to be necessary for VRPN sending the + // data with reportAnarog(). Its utility is likely in keeping the + // connection functional during periods with no data. + IVRPNServerManager::getInstance().process(); + return true; +} + +bool CVRPNAnalogServer::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CVRPNAnalogServer::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + for (size_t i = 0; i < nInput; ++i) + { + for (size_t j = 0; j < boxContext.getInputChunkCount(i); ++j) + { + Kernel::TParameterHandler ip_buffer( + m_decoders[i]->getInputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_InputParameterId_MemoryBufferToDecode)); + Kernel::TParameterHandler op_matrix(m_decoders[i]->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + + ip_buffer = boxContext.getInputChunk(i, j); + m_decoders[i]->process(); + + CMatrix* matrix = op_matrix; + + if (m_decoders[i]->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedHeader)) + { + m_nAnalogs[i] = matrix->getBufferElementCount(); + if (m_nAnalogs.size() == nInput) + { + size_t nAnalog = 0; + for (size_t k = 0; k < nInput; ++k) { nAnalog += m_nAnalogs[k]; } + + if (IVRPNServerManager::getInstance().setAnalogCount(m_serverID, nAnalog)) + { + this->getLogManager() << Kernel::LogLevel_Trace << "Created VRPN analog server for " << nAnalog << " channel(s)\n"; + } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to create VRPN analog server for " << nAnalog << " channel(s)\n"; + return false; + } + + m_analogSet = true; + } + boxContext.markInputAsDeprecated(i, j); + } + if (m_analogSet) + { + if (m_decoders[i]->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedBuffer)) + { + if (m_analogSet) + { + size_t offset = 0; + for (size_t k = 0; k < i; ++k) { offset += m_nAnalogs[k]; } + for (size_t k = 0; k < matrix->getBufferElementCount(); ++k) + { + if (!IVRPNServerManager::getInstance().setAnalogState(m_serverID, offset + k, matrix->getBuffer()[k])) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Warning << + "Could not set analog state for index " + << k << "\n"; + } + } + IVRPNServerManager::getInstance().reportAnalog(m_serverID); + } + } + if (m_decoders[i]->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedEnd)) { } + boxContext.markInputAsDeprecated(i, j); + } + } + } + + return true; +} + +} // namespace VRPN +} // namespace Plugins +} // namespace OpenViBE +#endif // OVP_HAS_Vrpn diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCVRPNAnalogServer.h b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCVRPNAnalogServer.h new file mode 100644 index 0000000..ae8005b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCVRPNAnalogServer.h @@ -0,0 +1,95 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyVRPN + +#include "../ovp_defines.h" +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace VRPN { +class CVRPNAnalogServer final : public Toolkit::TBoxAlgorithm +{ +public: + + CVRPNAnalogServer() {} + void release() override { delete this; } + uint64_t getClockFrequency() override { return 64LL << 32; } // 64hz + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(IBoxAlgorithm, OVP_ClassId_VRPNAnalogServer) + +protected: + + CIdentifier m_serverID = CIdentifier::undefined(); + bool m_analogSet = false; + + std::map m_decoders; + std::map m_nAnalogs; +}; + +class CVRPNAnalogServerListener final : public Toolkit::TBoxListener +{ +public: + + static bool check(Kernel::IBox& box) + { + for (size_t i = 0; i < box.getInputCount(); ++i) + { + box.setInputName(i, ("Input " + std::to_string(i + 1)).c_str()); + box.setInputType(i, OV_TypeId_StreamedMatrix); + } + + return true; + } + + bool onInputRemoved(Kernel::IBox& box, const size_t /*index*/) override { return check(box); } + bool onInputAdded(Kernel::IBox& box, const size_t /*index*/) override { return check(box); } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CVRPNAnalogServerDesc final : public IBoxAlgorithmDesc +{ +public: + + CString getName() const override { return CString("Analog VRPN Server"); } + CString getAuthorName() const override { return CString("Bruno Renier/Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Creates VRPN analog servers (one per input)."); } + + CString getDetailedDescription() const override + { + return CString("Creates VRPN analog servers to make data from the plugin's inputs available to VRPN client applications."); + } + + CString getCategory() const override { return CString("Acquisition and network IO/VRPN"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-connect"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_VRPNAnalogServer; } + IPluginObject* create() override { return new CVRPNAnalogServer(); } + IBoxListener* createBoxListener() const override { return new CVRPNAnalogServerListener; } + void release() override { } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input 1", OV_TypeId_StreamedMatrix); + prototype.addSetting("Peripheral name", OV_TypeId_String, "openvibe-vrpn"); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_VRPNAnalogServerDesc) +}; +} // namespace VRPN +} // namespace Plugins +} // namespace OpenViBE + +#endif // OVP_HAS_Vrpn diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCVRPNButtonServer.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCVRPNButtonServer.cpp new file mode 100644 index 0000000..33fe7b0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCVRPNButtonServer.cpp @@ -0,0 +1,124 @@ +#if defined TARGET_HAS_ThirdPartyVRPN + +#include "ovpCVRPNButtonServer.h" +#include "../ovpIVRPNServerManager.h" + +namespace OpenViBE { +namespace Plugins { +namespace VRPN { + +bool CVRPNButtonServer::initialize() +{ + const Kernel::IBox* box = getBoxAlgorithmContext()->getStaticBoxContext(); + + //get server name, and creates a button server for this server + const CString name = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + IVRPNServerManager::getInstance().initialize(); + IVRPNServerManager::getInstance().addServer(name, m_serverID); + IVRPNServerManager::getInstance().setButtonCount(m_serverID, box->getInputCount()); + + m_decoders.resize(box->getInputCount()); + + //get stim id + for (size_t i = 0; i < box->getInputCount(); ++i) + { + CString onStimulationID = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1 + i * 2); + CString offStimulationID = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2 + i * 2); + m_stimulationPairs[i] = std::pair( + getBoxAlgorithmContext()->getPlayerContext()->getTypeManager().getEnumerationEntryValueFromName(OVTK_TypeId_Stimulation, onStimulationID), + getBoxAlgorithmContext()->getPlayerContext()->getTypeManager().getEnumerationEntryValueFromName(OVTK_TypeId_Stimulation, offStimulationID)); + + m_decoders[i] = new Toolkit::TStimulationDecoder; + m_decoders[i]->initialize(*this, i); + } + + return true; +} + +bool CVRPNButtonServer::uninitialize() +{ + for (size_t i = 0; i < m_decoders.size(); ++i) { delete m_decoders[i]; } + m_decoders.clear(); + + IVRPNServerManager::getInstance().uninitialize(); + + return true; +} + +bool CVRPNButtonServer::processClock(Kernel::CMessageClock& /*msg*/) +{ + IVRPNServerManager::getInstance().process(); + return true; +} + +bool CVRPNButtonServer::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CVRPNButtonServer::process() +{ + Kernel::IBoxIO* boxIO = getBoxAlgorithmContext()->getDynamicBoxContext(); + + for (size_t input = 0; input < getBoxAlgorithmContext()->getStaticBoxContext()->getInputCount(); ++input) + { + m_currInput = input; + + for (size_t chunk = 0; chunk < boxIO->getInputChunkCount(input); ++chunk) + { + m_decoders[input]->decode(chunk); + + if (m_decoders[input]->isBufferReceived()) + { + const IStimulationSet* stimSet = m_decoders[input]->getOutputStimulationSet(); + for (size_t s = 0; s < stimSet->getStimulationCount(); ++s) + { + setStimulation(s, stimSet->getStimulationIdentifier(s), stimSet->getStimulationDate(s)); + } + } + } + } + + return true; +} + +void CVRPNButtonServer::setStimulation(const size_t /*index*/, const uint64_t id, const uint64_t /*date*/) +{ + const std::pair stimulationPair = m_stimulationPairs[m_currInput]; + + if (stimulationPair.first == stimulationPair.second) + { + if (stimulationPair.first == id) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Trace << "Received TOGGLE stimulation for button " + << m_currInput << " (" << id << ")\n"; + IVRPNServerManager::getInstance().setButtonState(m_serverID, m_currInput, + !IVRPNServerManager::getInstance().getButtonState(m_serverID, m_currInput)); + IVRPNServerManager::getInstance().reportButton(m_serverID); + } + } + else + { + if (stimulationPair.first == id) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Trace << "Received ON stimulation for button " + << m_currInput << " (" << id << ")\n"; + IVRPNServerManager::getInstance().setButtonState(m_serverID, m_currInput, true); + IVRPNServerManager::getInstance().reportButton(m_serverID); + } + if (stimulationPair.second == id) + { + getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Trace << "Received OFF stimulation for button " + << m_currInput << " (" << id << ")\n"; + IVRPNServerManager::getInstance().setButtonState(m_serverID, m_currInput, false); + IVRPNServerManager::getInstance().reportButton(m_serverID); + } + } +} + +} // namespace VRPN +} // namespace Plugins +} // namespace OpenViBE +#endif // OVP_HAS_Vrpn diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCVRPNButtonServer.h b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCVRPNButtonServer.h new file mode 100644 index 0000000..8e44fb0 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/box-algorithms/ovpCVRPNButtonServer.h @@ -0,0 +1,130 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyVRPN + +#include "../ovp_defines.h" +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace VRPN { +class CVRPNButtonServer final : public Toolkit::TBoxAlgorithm +{ +public: + + CVRPNButtonServer() {} + void release() override { delete this; } + uint64_t getClockFrequency() override { return 64LL << 32; } // 64 times per second + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(IBoxAlgorithm, OVP_ClassId_VRPNButtonServer) + + void setStimulation(const size_t index, const uint64_t id, const uint64_t date); + +protected: + + std::vector*> m_decoders; + + //Start and end time of the last buffer + uint64_t m_startTime = 0; + uint64_t m_endTime = 0; + + size_t m_currInput = 0; + + CIdentifier m_serverID = CIdentifier::undefined(); + + //Pairs of start/stop stimulations id + std::map> m_stimulationPairs; +}; + +class CVRPNButtonServerListener final : public Toolkit::TBoxListener +{ +public: + + bool check(Kernel::IBox& box) const + { + for (size_t i = 0; i < box.getInputCount(); ++i) + { + box.setInputName(i, ("Input " + std::to_string(i + 1)).c_str()); + box.setInputType(i, OV_TypeId_Stimulations); + } + + for (size_t i = 0; i < box.getInputCount(); ++i) + { + box.setSettingName(i * 2 + 1, ("Button " + std::to_string(i + 1) + " ON").c_str()); + box.setSettingType(i * 2 + 1, OV_TypeId_Stimulation); + + box.setSettingName(i * 2 + 2, ("Button " + std::to_string(i + 1) + " OFF").c_str()); + box.setSettingType(i * 2 + 2, OV_TypeId_Stimulation); + } + + return true; + } + + bool onInputRemoved(Kernel::IBox& box, const size_t index) override + { + box.removeSetting(index * 2 + 1); + box.removeSetting(index * 2 + 1); + + return this->check(box); + } + + bool onInputAdded(Kernel::IBox& box, const size_t /*index*/) override + { + box.addSetting("", OV_TypeId_Stimulation, "OVTK_GDF_Feedback_Continuous"); + box.addSetting("", OV_TypeId_Stimulation, "OVTK_GDF_End_Of_Trial"); + + return this->check(box); + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CVRPNButtonServerDesc final : public IBoxAlgorithmDesc +{ +public: + + CString getName() const override { return CString("Button VRPN Server"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Creates VRPN button servers (one per input)."); } + + CString getDetailedDescription() const override + { + return CString("Creates VRPN button servers to make data from the plugin's inputs available to VRPN client applications."); + } + + CString getCategory() const override { return CString("Acquisition and network IO/VRPN"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-connect"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_VRPNButtonServer; } + IPluginObject* create() override { return new CVRPNButtonServer(); } + IBoxListener* createBoxListener() const override { return new CVRPNButtonServerListener; } + void release() override { } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input 1", OVTK_TypeId_Stimulations); + prototype.addSetting("Peripheral name", OV_TypeId_String, "openvibe-vrpn"); + prototype.addSetting("Button 1 ON", OV_TypeId_Stimulation, "OVTK_GDF_Feedback_Continuous"); + prototype.addSetting("Button 1 OFF", OV_TypeId_Stimulation, "OVTK_GDF_End_Of_Trial"); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_VRPNButtonServerDesc) +}; +} // namespace VRPN +} // namespace Plugins +} // namespace OpenViBE + +#endif // OVP_HAS_Vrpn diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/ovpIVRPNServerManager.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/ovpIVRPNServerManager.cpp new file mode 100644 index 0000000..1fd0538 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/ovpIVRPNServerManager.cpp @@ -0,0 +1,251 @@ +#if defined TARGET_HAS_ThirdPartyVRPN + +#include "ovpIVRPNServerManager.h" + +#include +#include +#include + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace VRPN { +namespace { +class CVRPNServerManager final : public IVRPNServerManager +{ +public: + + CVRPNServerManager() { } + ~CVRPNServerManager() override { } + + bool initialize() override; + bool uninitialize() override; + + bool process() override; + bool reportAnalog(const CIdentifier& serverID) override; + bool reportButton(const CIdentifier& serverID) override; + + bool addServer(const CString& name, CIdentifier& identifier) override; + bool isServer(const CIdentifier& identifier) const override; + bool isServer(const CString& name) const override; + bool getServerIdentifier(const CString& name, CIdentifier& identifier) const override; + bool getServerName(const CIdentifier& serverID, CString& name) const override; + bool removeServer(const CIdentifier& serverID) override; + + bool setButtonCount(const CIdentifier& serverID, size_t nButton) override; + bool setButtonState(const CIdentifier& serverID, size_t buttonIndex, bool status) override; + bool getButtonState(const CIdentifier& serverID, size_t buttonIndex) const override; + + bool setAnalogCount(const CIdentifier& serverID, size_t nAnalog) override; + bool setAnalogState(const CIdentifier& serverID, size_t analogIndex, double status) override; + double getAnalogState(const CIdentifier& serverID, size_t analogIndex) const override; + +protected: + + vrpn_Connection* m_connection = nullptr; + + std::map m_serverNames; + std::map m_buttonServers; + std::map m_analogServers; + std::map> m_buttonCaches; + + size_t m_nInitialize = 0; +}; +} // namespace + +IVRPNServerManager& IVRPNServerManager::getInstance() +{ + static CVRPNServerManager gVRPNServerManager; + return gVRPNServerManager; +} + +bool CVRPNServerManager::initialize() +{ + if (!m_nInitialize) + { + //m_Connection=new vrpn_Connection; + m_connection = vrpn_create_server_connection(); + } + m_nInitialize++; + return true; +} + +bool CVRPNServerManager::uninitialize() +{ + m_nInitialize--; + if (!m_nInitialize) + { + for (auto it = m_analogServers.begin(); it != m_analogServers.end(); ++it) + { + if (it->second) + { + delete it->second; + it->second = nullptr; + } + } + m_analogServers.clear(); + for (auto it = m_buttonServers.begin(); it != m_buttonServers.end(); ++it) + { + if (it->second) + { + delete it->second; + it->second = nullptr; + } + } + m_buttonServers.clear(); + + // $$$ UGLY ! + // The following function should destroy correctly the connection, but does not. + //vrpn_ConnectionManager::instance().deleteConnection(m_Connection); + delete m_connection; + m_connection = nullptr; + } + return true; +} + +bool CVRPNServerManager::process() +{ + for (auto it = m_analogServers.begin(); it != m_analogServers.end(); ++it) { if (it->second) { it->second->mainloop(); } } + for (auto it = m_buttonServers.begin(); it != m_buttonServers.end(); ++it) { if (it->second) { it->second->mainloop(); } } + if (m_connection) { m_connection->mainloop(); } + return true; +} + +bool CVRPNServerManager::reportAnalog(const CIdentifier& serverID) +{ + auto it = m_analogServers.find(serverID); + if (it != m_analogServers.end()) + { + if (it->second) + { + // This is public function and mainloop won't call it for me + // Thank you VRPN for this to be similar to button behavior ;o) + it->second->report(); + } + } + return true; +} + +bool CVRPNServerManager::reportButton(const CIdentifier& serverID) +{ + const auto it = m_buttonServers.find(serverID); + if (it != m_buttonServers.end()) + { + if (it->second) + { + // This is not public function, however, mainloop calls it for me + // Thank you VRPN for this to be similar to analog behavior ;o) + // itButtonServer->second->report_changes(); + } + } + return true; +} + +bool CVRPNServerManager::addServer(const CString& name, CIdentifier& identifier) +{ + if (this->isServer(name)) { return this->getServerIdentifier(name, identifier); } + + identifier = CIdentifier::random(); + while (m_serverNames.find(identifier) != m_serverNames.end()) { ++identifier; } + + m_serverNames[identifier] = name; + return true; +} + +bool CVRPNServerManager::isServer(const CIdentifier& identifier) const { return m_serverNames.find(identifier) != m_serverNames.end(); } + +bool CVRPNServerManager::isServer(const CString& name) const +{ + for (auto it = m_serverNames.begin(); it != m_serverNames.end(); ++it) { if (it->second == name) { return true; } } + return false; +} + +bool CVRPNServerManager::getServerIdentifier(const CString& name, CIdentifier& identifier) const +{ + for (auto it = m_serverNames.begin(); it != m_serverNames.end(); ++it) + { + if (it->second == name) + { + identifier = it->first; + return true; + } + } + return false; +} + +bool CVRPNServerManager::getServerName(const CIdentifier& serverID, CString& name) const +{ + const auto it = m_serverNames.find(serverID); + if (it == m_serverNames.end()) { return false; } + name = it->second; + return true; +} + +bool CVRPNServerManager::removeServer(const CIdentifier& serverID) +{ + if (!this->isServer(serverID)) { return false; } + // TODO + return true; +} + +bool CVRPNServerManager::setButtonCount(const CIdentifier& serverID, const size_t nButton) +{ + if (!this->isServer(serverID)) { return false; } + delete m_buttonServers[serverID]; + m_buttonServers[serverID] = new vrpn_Button_Server(m_serverNames[serverID], m_connection, int(nButton)); + m_buttonCaches[serverID].clear(); + m_buttonCaches[serverID].resize(nButton); + return true; +} + +bool CVRPNServerManager::setButtonState(const CIdentifier& serverID, const size_t buttonIndex, const bool status) +{ + if (!this->isServer(serverID) || m_buttonServers.find(serverID) == m_buttonServers.end()) { return false; } + m_buttonServers[serverID]->set_button(int(buttonIndex), status ? 1 : 0); + m_buttonCaches[serverID][buttonIndex] = status; + return true; +} + +bool CVRPNServerManager::getButtonState(const CIdentifier& serverID, const size_t buttonIndex) const +{ + if (!this->isServer(serverID)) { return false; } + const auto itButtonServer = m_buttonServers.find(serverID); + if (itButtonServer == m_buttonServers.end()) { return false; } + const auto itButtonCache = m_buttonCaches.find(serverID); + return itButtonCache->second[buttonIndex]; +} + +bool CVRPNServerManager::setAnalogCount(const CIdentifier& serverID, const size_t nAnalog) +{ + if (!this->isServer(serverID)) { return false; } + if (m_analogServers[serverID]) { delete m_analogServers[serverID]; } + m_analogServers[serverID] = new vrpn_Analog_Server(m_serverNames[serverID], m_connection); + if (size_t(m_analogServers[serverID]->setNumChannels(vrpn_uint32(nAnalog))) != nAnalog) { return false; } + return true; +} + +bool CVRPNServerManager::setAnalogState(const CIdentifier& serverID, const size_t analogIndex, const double status) +{ + if (!this->isServer(serverID) || m_analogServers.find(serverID) == m_analogServers.end()) { return false; } + const size_t nChannel = m_analogServers[serverID]->getNumChannels(); + if (analogIndex >= nChannel) { return false; } + + m_analogServers[serverID]->channels()[analogIndex] = status; + return true; +} + +double CVRPNServerManager::getAnalogState(const CIdentifier& serverID, const size_t analogIndex) const +{ + if (!this->isServer(serverID)) { return 0; } + auto it = m_analogServers.find(serverID); + if (it == m_analogServers.end()) { return 0; } + return it->second->channels()[analogIndex]; +} + +} // namespace VRPN +} // namespace Plugins +} // namespace OpenViBE +#endif // OVP_HAS_Vrpn diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/ovpIVRPNServerManager.h b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/ovpIVRPNServerManager.h new file mode 100644 index 0000000..b0be918 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/ovpIVRPNServerManager.h @@ -0,0 +1,44 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyVRPN + +#include + +namespace OpenViBE { +namespace Plugins { +namespace VRPN { +class IVRPNServerManager +{ +public: + + static IVRPNServerManager& getInstance(); + + virtual ~IVRPNServerManager() { } + + virtual bool initialize() = 0; + virtual bool uninitialize() = 0; + + virtual bool process() = 0; + virtual bool reportAnalog(const CIdentifier& identifier) = 0; + virtual bool reportButton(const CIdentifier& identifier) = 0; + + virtual bool addServer(const CString& name, CIdentifier& identifier) = 0; + virtual bool isServer(const CIdentifier& identifier) const = 0; + virtual bool isServer(const CString& name) const = 0; + virtual bool getServerIdentifier(const CString& name, CIdentifier& identifier) const = 0; + virtual bool getServerName(const CIdentifier& identifier, CString& name) const = 0; + virtual bool removeServer(const CIdentifier& identifier) = 0; + + virtual bool setButtonCount(const CIdentifier& identifier, size_t nButton) = 0; + virtual bool setButtonState(const CIdentifier& identifier, size_t buttonIndex, bool status) = 0; + virtual bool getButtonState(const CIdentifier& identifier, size_t buttonIndex) const = 0; + + virtual bool setAnalogCount(const CIdentifier& serverID, size_t nAnalog) = 0; + virtual bool setAnalogState(const CIdentifier& serverID, size_t analogIndex, double status) = 0; + virtual double getAnalogState(const CIdentifier& serverID, size_t analogIndex) const = 0; +}; +} // namespace VRPN +} // namespace Plugins +} // namespace OpenViBE + +#endif // OVP_HAS_Vrpn diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/ovp_defines.h b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/ovp_defines.h new file mode 100644 index 0000000..d96be60 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/ovp_defines.h @@ -0,0 +1,19 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_VRPNAnalogServer OpenViBE::CIdentifier(0x0DDC3A7E, 0x6F6E6401) +#define OVP_ClassId_VRPNAnalogServerDesc OpenViBE::CIdentifier(0xF54B8E03, 0xAAFF15C6) +#define OVP_ClassId_VRPNButtonServer OpenViBE::CIdentifier(0x0E382E6F, 0x5BE1F00C) +#define OVP_ClassId_VRPNButtonServerDesc OpenViBE::CIdentifier(0xBC86F256, 0x002495EF) +#define OVP_ClassId_BoxAlgorithm_VRPNAnalogClient OpenViBE::CIdentifier(0x7CF4A95E, 0x7270D07B) +#define OVP_ClassId_BoxAlgorithm_VRPNAnalogClientDesc OpenViBE::CIdentifier(0x77B2AE79, 0xFDC31871) +#define OVP_ClassId_BoxAlgorithm_VRPNButtonClient OpenViBE::CIdentifier(0x40714327, 0x458877D2) +#define OVP_ClassId_BoxAlgorithm_VRPNButtonClientDesc OpenViBE::CIdentifier(0x16FB6283, 0x45EC313F) + + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/ovp_main.cpp b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/ovp_main.cpp new file mode 100644 index 0000000..eb15991 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/processing/vrpn/src/ovp_main.cpp @@ -0,0 +1,27 @@ +#include + +#include "ovp_defines.h" +#include "box-algorithms/ovpCVRPNAnalogServer.h" +#include "box-algorithms/ovpCVRPNButtonServer.h" +#include "box-algorithms/ovpCBoxAlgorithmVRPNAnalogClient.h" +#include "box-algorithms/ovpCBoxAlgorithmVRPNButtonClient.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace VRPN { + +OVP_Declare_Begin() +#if defined TARGET_HAS_ThirdPartyVRPN + OVP_Declare_New(CVRPNAnalogServerDesc); + OVP_Declare_New(CVRPNButtonServerDesc); + OVP_Declare_New(CBoxAlgorithmVRPNAnalogClientDesc); + OVP_Declare_New(CBoxAlgorithmVRPNButtonClientDesc); +#endif + +OVP_Declare_End() + +} // namespace VRPN +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/server-drivers/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/server-drivers/CMakeLists.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/server-drivers/CMakeLists.txt @@ -0,0 +1 @@ + diff --git a/Masterarbeit/openvibe/extras-master/plugins/server-extensions/CMakeLists.txt b/Masterarbeit/openvibe/extras-master/plugins/server-extensions/CMakeLists.txt new file mode 100644 index 0000000..139597f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/server-extensions/CMakeLists.txt @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/extras-master/plugins/server-extensions/fiddler/ovasCPluginFiddler.cpp b/Masterarbeit/openvibe/extras-master/plugins/server-extensions/fiddler/ovasCPluginFiddler.cpp new file mode 100755 index 0000000..4e3bb0d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/server-extensions/fiddler/ovasCPluginFiddler.cpp @@ -0,0 +1,116 @@ +/* + * Linearly superposes a simple phase-locked template around 300ms after OVTK_StimulationId_Target + * + * Fiddler can be used to debug P300 scenarios. Note that the same effect could be + * achieved with a box that tampers the signal after specific stimulation markers. + * It can also be used as an example of how to manipulate the signal on the + * acquisition server side using a plugin. + * + * Known limitations: Overlapping patterns not handled + * + */ + +#include "ovasCPluginFiddler.h" + +#include + +#include + +#include + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +namespace OpenViBE { +namespace AcquisitionServer { +namespace Plugins { + +CPluginFiddler::CPluginFiddler(const Kernel::IKernelContext& ctx) : IAcquisitionServerPlugin(ctx, CString("AcquisitionServer_Plugin_Fiddler")) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Loading plugin: Fiddler\n"; + + m_settings.add("Fiddler_Strength", &m_BCI2000VersionFiddlerStrength); // The amplitude of the pattern, 0 = disable + m_settings.load(); +} + +// Hooks + + +bool CPluginFiddler::startHook(const std::vector& /*selectedChannelNames*/, const size_t sampling, const size_t /*nChannel*/, const size_t nSamplePerSentBlock) +{ + if (m_BCI2000VersionFiddlerStrength > 10e-06) + { + m_nSamplePerSentBlock = nSamplePerSentBlock; + + m_StartSample = std::numeric_limits::max(); + m_EndSample = 0; + m_NProcessedSample = 0; + m_Counter = 0; + + m_Sampling = sampling; + + m_LastBufferSize = 0; + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Fiddler is enabled! Only use for debug purposes. Set strength=0 to disable.\n"; + } + + return true; +} + +void CPluginFiddler::loopHook(std::deque>& buffers, CStimulationSet& stimSet, const uint64_t /*start*/, const uint64_t /*end*/, const uint64_t /* sampleTime */) +{ + if (m_BCI2000VersionFiddlerStrength > 10e-06) + { + // We need to make sure we don't process the same samples twice + uint64_t nProcessed = 0; + if (m_LastBufferSize > m_nSamplePerSentBlock) { nProcessed = m_LastBufferSize - m_nSamplePerSentBlock; } + + // Loop over the stimulations + for (size_t i = 0; i < stimSet.getStimulationCount(); ++i) + { + const uint64_t id = stimSet.getStimulationIdentifier(i); + const uint64_t time = stimSet.getStimulationDate(i); + const uint64_t nSample = CTime(time).toSampleCount(m_Sampling); + + if (id == OVTK_StimulationId_Target && nSample > m_NProcessedSample) + { + m_StartSample = nSample + CTime(0.0).toSampleCount(m_Sampling); + m_EndSample = nSample + CTime(0.5).toSampleCount(m_Sampling); + m_Counter = 0; + } + } + + for (size_t i = size_t(nProcessed); i < buffers.size(); ++i) + { + // std::cout << "Sample " << CTime(l_SampleTime).toSeconds() << " range " << CTime(m_startTime).toSeconds() << " stop " << CTime(m_endTime).toSeconds(); + + if (m_NProcessedSample > m_StartSample && m_NProcessedSample <= m_EndSample) + { + const float lobe1 = 0.25F; // Position, in seconds + const float lobe2 = 0.30F; + const float spread1 = 0.008F; // Width + const float spread2 = 0.004F; + + // Two beta functions weighted by gaussians; the beta parameters are ^1 and ^4 + // n.b. not terribly efficient as the same pattern is created every time anew. In practice this is of little importance. + const float st = float(CTime(m_Sampling, m_Counter).toSeconds()); + const float bump1 = std::exp(-std::pow(st - lobe1, 2) / spread1) * (st * std::pow(1 - st, 4)); + const float bump2 = std::exp(-std::pow(st - lobe2, 2) / spread2) * (st * std::pow(1 - st, 4)); + const float value = (-0.5F * bump1 + 0.9F * bump2) * 40.0F; + + std::vector& sample = buffers[i]; + float* tmp = &sample[0]; + for (size_t j = 0; j < sample.size(); ++j) { tmp[j] += value * m_BCI2000VersionFiddlerStrength; } + m_Counter++; + } + + m_NProcessedSample++; + } + + m_LastBufferSize = buffers.size(); + } +} + +} // namespace Plugins +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/server-extensions/fiddler/ovasCPluginFiddler.h b/Masterarbeit/openvibe/extras-master/plugins/server-extensions/fiddler/ovasCPluginFiddler.h new file mode 100755 index 0000000..d8cc58e --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/server-extensions/fiddler/ovasCPluginFiddler.h @@ -0,0 +1,45 @@ +#pragma once + + +/** + * \brief Acquisition Server plugin that tinkers with the signal for P300 debugging purposes + * \version 0.1 + * \author Jussi T. Lindgren / Inria + */ + +#include "ovasIAcquisitionServerPlugin.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class CAcquisitionServer; + +namespace Plugins { +class CPluginFiddler final : public IAcquisitionServerPlugin +{ + // Plugin interface +public: + explicit CPluginFiddler(const Kernel::IKernelContext& ctx); + ~CPluginFiddler() override {} + + bool startHook(const std::vector& selectedChannelNames, const size_t sampling, const size_t nChannel, const size_t nSamplePerSentBlock) override; + void stopHook() override {} + void loopHook(std::deque>& buffers, CStimulationSet& stimSet, const uint64_t start, const uint64_t end, + const uint64_t sampleTime) override; + + // Plugin implementation + float m_BCI2000VersionFiddlerStrength = 0; + uint64_t m_StartSample = 0; + uint64_t m_EndSample = 0; + + size_t m_Sampling = 0; + size_t m_NProcessedSample = 0; + size_t m_LastBufferSize = 0; + size_t m_Counter = 0; + +private: + + size_t m_nSamplePerSentBlock = 0; +}; +} // namespace Plugins +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/extras-master/plugins/server-extensions/lsl-output/ovasCPluginLSLOutput.cpp b/Masterarbeit/openvibe/extras-master/plugins/server-extensions/lsl-output/ovasCPluginLSLOutput.cpp new file mode 100755 index 0000000..e381f6d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/server-extensions/lsl-output/ovasCPluginLSLOutput.cpp @@ -0,0 +1,162 @@ +#if defined TARGET_HAS_ThirdPartyLSL + +/* + * Notes: This code should be kept compatible with changes to LSL Input Driver in OpenViBE Acquisition Server, + * and LSL Export box in Designer. + * + */ + +#include "ovasCPluginLSLOutput.h" + +#include + +#include +#include + +namespace OpenViBE { +namespace AcquisitionServer { +namespace Plugins { + +CPluginLSLOutput::CPluginLSLOutput(const Kernel::IKernelContext& ctx) + : IAcquisitionServerPlugin(ctx, CString("AcquisitionServer_Plugin_LabStreamingLayerOutput")) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Loading plugin: LSL Output\n"; + + m_settings.add("LSL_EnableLSLOutput", &m_IsLSLOutputEnabled); + m_settings.add("LSL_SignalStreamName", &m_SignalStreamName); + m_settings.add("LSL_MarkerStreamName", &m_MarkerStreamName); + m_settings.load(); + + // These are not saved or loaded from .conf as they are supposed to be unique + m_SignalStreamID = CIdentifier::random().str(); + m_MarkerStreamID = CIdentifier::random().str(); + + while (m_MarkerStreamID == m_SignalStreamID) { m_MarkerStreamID = CIdentifier::random().str(); } // very unlikely +} + +CPluginLSLOutput::~CPluginLSLOutput() +{ + if (m_signalOutlet) + { + delete m_signalOutlet; + m_signalOutlet = nullptr; + } + if (m_stimulusOutlet) + { + delete m_stimulusOutlet; + m_stimulusOutlet = nullptr; + } +} + +// Hooks + + +bool CPluginLSLOutput::startHook(const std::vector& selectedChannelNames, const size_t sampling, const size_t nChannel, + const size_t nSamplePerSentBlock) +{ + m_nSamplePerSentBlock = nSamplePerSentBlock; + + m_useOVTimestamps = m_kernelCtx.getConfigurationManager().expandAsBoolean("${LSL_UseOVTimestamps}", m_useOVTimestamps); + m_startTime = System::Time::zgetTime(); + + if (m_IsLSLOutputEnabled) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Will create streams [" << m_SignalStreamName << ", id " << m_SignalStreamID << "] and [" + << m_MarkerStreamName << ", id " << m_MarkerStreamID << "]\n"; + + // Open a signal stream + lsl::stream_info signalInfo(m_SignalStreamName, "signal", int(nChannel), double(sampling), lsl::cf_float32, m_SignalStreamID); + + lsl::xml_element channels = signalInfo.desc().append_child("channels"); + + for (size_t i = 0; i < nChannel; ++i) + { + channels.append_child("channel").append_child_value("label", selectedChannelNames[i].toASCIIString()).append_child_value("unit", "unknown"). + append_child_value("type", "signal"); + } + + // make a new outlet + m_signalOutlet = new lsl::stream_outlet(signalInfo, int(m_nSamplePerSentBlock)); + + // Open a stimulus stream + lsl::stream_info stimulusInfo(m_MarkerStreamName, "Markers", 1, lsl::IRREGULAR_RATE, lsl::cf_int32, m_MarkerStreamID); + + stimulusInfo.desc().append_child("channels").append_child("channel").append_child_value("label", "Stimulations").append_child_value("type", "marker"); + + m_stimulusOutlet = new lsl::stream_outlet(stimulusInfo); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "LSL Output activated...\n"; + } + + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Step from sampling rate is " << 1.0 / double(sampling) << "\n"; + + return true; +} + +void CPluginLSLOutput::loopHook(std::deque>& buffers, CStimulationSet& stimSet, const uint64_t start, const uint64_t end, + const uint64_t /*sampleTime*/) +{ + if (m_IsLSLOutputEnabled) + { + // Output signal + if (m_signalOutlet->have_consumers()) + { + const uint64_t sampleStep = (end - start) / static_cast(m_nSamplePerSentBlock); + + if (m_useOVTimestamps) + { + const double sampleStepInSec = CTime(sampleStep).toSeconds(); + const double chunkStartInSec = CTime(start).toSeconds(); + for (size_t i = 0; i < m_nSamplePerSentBlock; ++i) { m_signalOutlet->push_sample(buffers[i], chunkStartInSec + double(i) * sampleStepInSec); } + } + else + { + for (size_t i = 0; i < m_nSamplePerSentBlock; ++i) + { + const double lslTime = OpenViBE::LabStreamLayer::getLSLRelativeTime(m_startTime + CTime(start + i * sampleStep)); + m_signalOutlet->push_sample(buffers[i], lslTime); + } + } + + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Pushed first signal at " << start << "\n"; + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Step is " << step << "\n"; + } + + // Output stimuli + if (m_stimulusOutlet->have_consumers()) + { + for (size_t i = 0; i < stimSet.getStimulationCount(); ++i) + { + if (stimSet.getStimulationDate(i) >= start && stimSet.getStimulationDate(i) < end) + { + const int code = int(stimSet.getStimulationIdentifier(i)); + const double date = m_useOVTimestamps ? CTime(stimSet.getStimulationDate(i)).toSeconds() + : OpenViBE::LabStreamLayer::getLSLRelativeTime(m_startTime + CTime(stimSet.getStimulationDate(i))); + m_stimulusOutlet->push_sample(&code, date); + } + } + } + } +} + +void CPluginLSLOutput::stopHook() +{ + if (m_IsLSLOutputEnabled) + { + if (m_signalOutlet) + { + delete m_signalOutlet; + m_signalOutlet = nullptr; + } + if (m_stimulusOutlet) + { + delete m_stimulusOutlet; + m_stimulusOutlet = nullptr; + } + } +} + +} // namespace Plugins +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/extras-master/plugins/server-extensions/lsl-output/ovasCPluginLSLOutput.h b/Masterarbeit/openvibe/extras-master/plugins/server-extensions/lsl-output/ovasCPluginLSLOutput.h new file mode 100755 index 0000000..f2d6444 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/plugins/server-extensions/lsl-output/ovasCPluginLSLOutput.h @@ -0,0 +1,50 @@ +/** + * \brief Acquisition Server plugin outputting signals and stimulations to LabStreamingLayer (LSL) streams + * \version 0.1 + * \author Jussi T. Lindgren / Inria +*/ +#pragma once + +#if defined TARGET_HAS_ThirdPartyLSL + +#include +#include "ovasIAcquisitionServerPlugin.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class CAcquisitionServer; + +namespace Plugins { +class CPluginLSLOutput final : public IAcquisitionServerPlugin +{ + // Plugin interface +public: + explicit CPluginLSLOutput(const Kernel::IKernelContext& ctx); + ~CPluginLSLOutput() override; + + bool startHook(const std::vector& selectedChannelNames, const size_t sampling, const size_t nChannel, const size_t nSamplePerSentBlock) override; + void stopHook() override; + void loopHook(std::deque>& buffers, CStimulationSet& stimSet, const uint64_t start, const uint64_t end, + const uint64_t sampleTime) override; + + // Plugin implementation + bool m_IsLSLOutputEnabled = false; + std::string m_SignalStreamName = "openvibeSignal"; + std::string m_SignalStreamID; + std::string m_MarkerStreamName = "openvibeMarkers"; + std::string m_MarkerStreamID; + +private: + lsl::stream_outlet* m_signalOutlet = nullptr; + lsl::stream_outlet* m_stimulusOutlet = nullptr; + + size_t m_nSamplePerSentBlock = 0; + + bool m_useOVTimestamps = false; + CTime m_startTime = CTime(0); +}; +} // namespace Plugins +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyLSL diff --git a/Masterarbeit/openvibe/extras-master/scripts/linux-build b/Masterarbeit/openvibe/extras-master/scripts/linux-build new file mode 100755 index 0000000..42beee4 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/scripts/linux-build @@ -0,0 +1,125 @@ +#!/bin/bash + +ov_build_type=Release +ov_script_dir="${PWD}" +ov_build_dir="${ov_script_dir}/../local-tmp/linux-${ov_build_type}" +ov_install_dir="${ov_script_dir}/../dist" + +while [[ $# -gt 0 ]]; do + key="$1" + case $key in + -h | --help) + usage + exit + ;; + -v | --verbose) + verbose=1 + ;; + -d | --debug) + ov_build_type=Debug + ;; + -r | --release) + ov_build_type=Release + ;; + --debug-symbols) + ov_build_type=RelWithDebInfo + ;; + --profile) + ov_build_type=RelWithDebInfo + extra_flags="-DCMAKE_CXX_FLAGS_RELWITHDEBINFO='-O2 -g -DNDEBUG -pg' -DCMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO='-pg' -DCMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO='-pg' -DCMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO='-pg'" + ;; + --build-dir) + ov_build_dir="$2" + shift + ;; + --install-dir) + ov_install_dir="$2" + shift + ;; + --sdk) + ov_sdk_dir="-DOPENVIBE_SDK_PATH=$2" + shift + ;; + --designer) + ov_designer_dir="-DDESIGNER_SDK_PATH=$2" + shift + ;; + --dependencies-dir) + dependencies_path="-DLIST_DEPENDENCIES_PATH=$2" + shift + ;; + --sdk-src) + ov_sdk_src_dir="$2" + shift + ;; + --userdata-subdir) + UserDataSubdir="-DOV_CONFIG_SUBDIR=$2" + shift + ;; + *) + echo "ERROR: Unknown parameter $key" + exit 1 + ;; + esac + shift # past argument or value +done + + + +echo "" +echo "_______________________________________________________________________________" +echo "" + +mkdir -p "${ov_build_dir}" 2> /dev/null +pushd "${ov_build_dir}" 2> /dev/null + +echo "" +echo "Creating makefiles..." +echo "" + +cmake ${ov_script_dir}/.. -DCMAKE_BUILD_TYPE=${ov_build_type} ${extra_flags} -DCMAKE_INSTALL_PREFIX=${ov_install_dir} ${ov_sdk_dir} ${ov_designer_dir} ${dependencies_path} ${UserDataSubdir} -DOV_SDK_SOURCE_PATH=${ov_sdk_src_dir} + +if [ $? -eq 0 ]; then + echo CMake has been called successfully ! +else + exit -1 +fi; + +echo "" +echo "Building ..." +echo "" + +NJOBS=`grep processor /proc/cpuinfo | wc -l` +make $1 -j $NJOBS # VERBOSE=1 +if [ $? -eq 0 ]; then + echo Make has been called successfully ! +else + exit -1 +fi; + +echo "" +echo "Installing files to 'dist' folder, this can take a few seconds - maybe a few minutes..." +echo "" + +make install +if [ $? -eq 0 ]; then + echo Make install has been called successfully ! +else + true # exit -1 +fi; + +popd 2> /dev/null + +echo "" +echo "_______________________________________________________________________________" +echo "" + +echo "" +echo "Building process terminated successfully !" +echo "" + +echo "" +echo "Install completed !" +echo "" + +true diff --git a/Masterarbeit/openvibe/extras-master/scripts/linux-dep-helpers/linux-compile-itpp.pl b/Masterarbeit/openvibe/extras-master/scripts/linux-dep-helpers/linux-compile-itpp.pl new file mode 100644 index 0000000..5c97852 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/scripts/linux-dep-helpers/linux-compile-itpp.pl @@ -0,0 +1,72 @@ +#!/usr/bin/perl + +# Intended to be run from linux-install_dependencies.pl +# +# Variables are wrt that parent scope +# + +# Installation of packages not available in the apt database or PPA +# Eigen installation + +if (!$no_install && $distribution eq 'Fedora') { +#if (1) { + + my $old_dir = Cwd::getcwd(); + + my $itpp_build_dir = $dependencies_dir . "/itpp-build"; + my $itppe_src_dir = $dependencies_arch_dir . "/itpp-external-3.0.0"; + my $itpp_src_dir = $dependencies_arch_dir . "/itpp-4.0.7"; + + if (! -e $itpp_build_dir) { + mkdir($itpp_build_dir) or die("Failed to create directory [$itpp_build_dir]"); + } + + # fetch the packages + chdir "$dependencies_arch_dir"; + if (! -e "itpp-external-3.0.0.tar.bz2") { + system('wget "http://openvibe.inria.fr/dependencies/linux-x86/itpp-external-3.0.0.tar.bz2"'); + ($CHILD_ERROR != 0) and die ("Could not download the itpp external sources [$CHILD_ERROR]"); + } + if (! -e $itppe_src_dir) { + system('tar -xjf "itpp-external-3.0.0.tar.bz2"'); + ($CHILD_ERROR != 0) and die ("Could not extract the itpp external archive"); + } + + if (! -e "itpp-4.0.7.tar.bz2") { + system('wget "http://openvibe.inria.fr/dependencies/linux-x86/itpp-4.0.7.tar.bz2"'); + ($CHILD_ERROR != 0) and die ("Could not download the itpp sources [$CHILD_ERROR]"); + } + if (! -e $itpp_src_dir) { + system('tar -xjf "itpp-4.0.7.tar.bz2"'); + ($CHILD_ERROR != 0) and die ("Could not extract the itpp archive"); + } + + # compile + + # external + print "Compiling itpp external ...\n"; + chdir $itppe_src_dir; + + system('sed -i "s/_EXT_ETIME/_INT_ETIME/g" patches/lapack-3.1.1-autotools.patch'); + system('sed -i "s/_EXT_ETIME/_INT_ETIME/g" src/lapack-lite-3.1.1/SRC/Makefile.in'); + system('sed -i "s/_EXT_ETIME/_INT_ETIME/g" src/lapack-lite-3.1.1/SRC/Makefile.am'); + + system("./configure --prefix=$dependencies_dir/ >$itpp_build_dir/itppe-configure.log 2>&1"); + system("make >$itpp_build_dir/itpp-external-build.log 2>&1"); + ($CHILD_ERROR != 0) and die("Failed to run make for itpp-external [$CHILD_ERROR]"); + system('make install'); + ($CHILD_ERROR != 0) and die("Failed to run make install for itpp-external [$CHILD_ERROR]"); + + # main pkg + print "Compiling itpp ...\n"; + chdir $itpp_src_dir; + + system("./configure --prefix=$dependencies_dir/ CPPFLAGS=\"-I$dependencies_dir/include\" LDFLAGS=\"-L$dependencies_dir/lib -L$dependencies_dir/lib64\" >$itpp_build_dir/itpp-configure.log 2>&1"); + system("make >$itpp_build_dir/itpp-build.log 2>&1"); + ($CHILD_ERROR != 0) and die("Failed to run make for itpp [$CHILD_ERROR]"); + system("make install"); + ($CHILD_ERROR != 0) and die("Failed to run make install for itpp [$CHILD_ERROR]"); + + chdir $old_dir +}; + diff --git a/Masterarbeit/openvibe/extras-master/scripts/linux-dep-helpers/linux-compile-lsl.pl b/Masterarbeit/openvibe/extras-master/scripts/linux-dep-helpers/linux-compile-lsl.pl new file mode 100644 index 0000000..047431d --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/scripts/linux-dep-helpers/linux-compile-lsl.pl @@ -0,0 +1,47 @@ +#!/usr/bin/perl + +# Intended to be run from linux-install_dependencies.pl +# +# Variables are wrt that parent scope +# + +# Installation of packages not available in the apt database or PPA +# Eigen installation + +if (!$no_install) { + + my $old_dir = Cwd::getcwd(); + + my $lsl_src_dir = $dependencies_arch_dir . "/LSL"; + + # fetch the packages + chdir "$dependencies_arch_dir"; + if (! -e "liblsl-1.12.ov1-src.tar.bz2") { + system('wget "http://openvibe.inria.fr/dependencies/linux-x86/liblsl-1.12.ov1-src.tar.bz2"'); + ($CHILD_ERROR != 0) and die ("Could not download the lsl sources [$CHILD_ERROR]"); + } + if (! -e $lsl_src_dir) { + system('tar xjf "liblsl-1.12.ov1-src.tar.bz2"'); + ($CHILD_ERROR != 0) and die ("Could not extract the lsl archive"); + } + + # compile + + # external + print "Compiling lsl ...\n"; + + chdir($lsl_src_dir); + mkdir("liblsl/build"); + system("cd liblsl/build && cmake .. >cmake-liblsl.log 2>&1"); + system("cd liblsl/build && make >make-liblsl.log 2>&1"); + + mkdir("$dependencies_dir/lib"); + mkdir("$dependencies_dir/include"); + + system("cp liblsl/build/src/liblsl.so $dependencies_dir/lib"); + system("cp -R liblsl/include/* $dependencies_dir/include"); + + + chdir $old_dir +}; + diff --git a/Masterarbeit/openvibe/extras-master/scripts/linux-dep-helpers/linux-compile-vrpn.pl b/Masterarbeit/openvibe/extras-master/scripts/linux-dep-helpers/linux-compile-vrpn.pl new file mode 100644 index 0000000..20e29cb --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/scripts/linux-dep-helpers/linux-compile-vrpn.pl @@ -0,0 +1,61 @@ +#!/usr/bin/perl + +# Intended to be run from linux-install_dependencies.pl +# +# Variables are wrt that parent scope +# + +if (!$no_install) { + + my $old_dir = Cwd::getcwd(); + + my $vrpn_src_dir = $dependencies_arch_dir . "/vrpn"; + + # fetch the packages + chdir "$dependencies_arch_dir"; + if (! -e "vrpn_07_31-ov.zip") { + system('wget "http://openvibe.inria.fr/dependencies/linux-x86/vrpn_07_31-ov.zip"'); + ($CHILD_ERROR != 0) and die ("Could not download the itpp external sources [$CHILD_ERROR]"); + } + if (! -e $vrpn_src_dir) { + system('unzip "vrpn_07_31-ov.zip"'); + ($CHILD_ERROR != 0) and die ("Could not extract the itpp external archive"); + } + + # compile + + print "Compiling vrpn ...\n"; + + my $bitness = `uname -m`; + chomp($bitness); + + my $bitness_token = ""; + if($bitness == "x86_64") { + # 64bit + $bitness_token = "pc_linux64"; + + system('sed -i "s/#HW_OS := pc_linux$/HW_OS := pc_linux64/g" vrpn/quat/Makefile'); + system('sed -i "s/#HW_OS := pc_linux$/HW_OS := pc_linux64/g" vrpn/Makefile'); + } else { + $bitness_token = "pc_linux"; + + system('sed -i "s/#HW_OS := pc_linux$/HW_OS := pc_linux/g" vrpn/quat/Makefile'); + system('sed -i "s/CC := gcc/CC := gcc -fPIC/g" vrpn/quat/Makefile'); + system('sed -i "s/#HW_OS := pc_linux$/HW_OS := pc_linux/g" vrpn/Makefile'); + system('sed -i "s/CC := gcc/CC := gcc -fPIC/g" vrpn/Makefile'); + system('sed -i "s/CC := g++/CC := g++ -fPIC/g" vrpn/Makefile'); + } + + system("cd vrpn/quat && make >make-quat.log 2>&1"); + system("cd vrpn && make >make-vrpn.log 2>&1"); + + mkdir("$dependencies_dir/include"); + mkdir("$dependencies_dir/lib"); + + system("chmod a-x vrpn/quat/*.h vrpn/*.h"); + system("cp vrpn/quat/*.h vrpn/*.h $dependencies_dir/include"); + system("cp vrpn/quat/$bitness_token/*.a vrpn/$bitness_token/*.a $dependencies_dir/lib"); + + chdir $old_dir +}; + diff --git a/Masterarbeit/openvibe/extras-master/scripts/linux-dependencies-fedora.txt b/Masterarbeit/openvibe/extras-master/scripts/linux-dependencies-fedora.txt new file mode 100644 index 0000000..66c6f71 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/scripts/linux-dependencies-fedora.txt @@ -0,0 +1,23 @@ +ogre-devel +wget +automake +autoconf +unzip +gcc-gfortran +gsl-devel +readline-devel +libtool +libXaw-devel +pcre-devel +freeimage-devel +mesa-libGL-devel +freealut-devel +libvorbis-devel +eigen3-devel +cegui-devel +ois-devel +compat-lua-devel +sqlite2-devel +fftw-devel +python3-devel +python3-numpy diff --git a/Masterarbeit/openvibe/extras-master/scripts/linux-dependencies-ubuntu1404.txt b/Masterarbeit/openvibe/extras-master/scripts/linux-dependencies-ubuntu1404.txt new file mode 100644 index 0000000..d0c387b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/scripts/linux-dependencies-ubuntu1404.txt @@ -0,0 +1,40 @@ +libogre-1.8-dev +libboost-chrono1.54-dev +wget +doxygen +make +automake +autoconf +cmake +unzip +gcc +g++ +libgtk2.0-dev +libglade2-dev +gfortran +libgsl0-dev +libreadline-dev +libzzip-dev +libtool +libxaw7-dev +libpcre3-dev +libfreeimage-dev +libglu1-mesa-dev +libalut-dev +libvorbis-dev +libncurses5-dev +libeigen3-dev +libcegui-mk2-dev +libois-dev +libboost-dev +libboost-thread-dev +libboost-regex-dev +libboost-filesystem-dev +liblua5.1-0-dev +libitpp-dev +libsqlite0-dev +libfftw3-dev +python-dev +python-numpy +sqlite + diff --git a/Masterarbeit/openvibe/extras-master/scripts/linux-dependencies-ubuntu16_plus.txt b/Masterarbeit/openvibe/extras-master/scripts/linux-dependencies-ubuntu16_plus.txt new file mode 100644 index 0000000..525cb77 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/scripts/linux-dependencies-ubuntu16_plus.txt @@ -0,0 +1,26 @@ +libogre-1.9-dev +wget +automake +autoconf +unzip +gfortran +libgsl-dev +libreadline-dev +libtool +libxaw7-dev +libpcre3-dev +libfreeimage-dev +libglu1-mesa-dev +libalut-dev +libvorbis-dev +libeigen3-dev +libcegui-mk2-dev +libois-dev +liblua5.1-0-dev +libitpp-dev +libsqlite0-dev +libfftw3-dev +python-dev +python-numpy +sqlite + diff --git a/Masterarbeit/openvibe/extras-master/scripts/windows-build.cmd b/Masterarbeit/openvibe/extras-master/scripts/windows-build.cmd new file mode 100755 index 0000000..705afd1 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/scripts/windows-build.cmd @@ -0,0 +1,238 @@ +@echo off +setlocal EnableDelayedExpansion +setlocal enableextensions + +REM no options / set to default +set BuildType=Release +set InitEnvScript=windows-init_env_command.cmd +set PAUSE=pause +set ov_script_dir=%CD% +set generator=-G"Ninja" +set builder=Ninja +set PlatformTarget=x86 + + +:parameter_parse +if /i "%1"=="-h" ( + echo Usage: windows-build.cmd [Build Type] [Init-env Script] + echo -- Build Type option can be : --release (-r^), --debug (-d^) or --debug-symbols. Default is Release. + echo -- Default Init-env script is: windows-init_env_command.cmd + pause + exit 0 +) else if /i "%1"=="--help" ( + echo Usage: windows-build.cmd [Build Type] [Init-env Script] + echo -- Build Type option can be : --release (-r^), --debug (-d^) or --debug-symbols. Default is Release. + echo -- Default Init-env script is: windows-init_env_command.cmd + pause + exit 0 +) else if /i "%1"=="--no-pause" ( + set PAUSE=echo "" + SHIFT + Goto parameter_parse +) else if /i "%1"=="-d" ( + set BuildType=Debug + REM set !InitEnvScript!=%2 + SHIFT + Goto parameter_parse +) else if /i "%1"=="--debug" ( + set BuildType=Debug + REM set !InitEnvScript!=%2 + SHIFT + Goto parameter_parse +) else if /i "%1"=="--debug-symbols" ( + set BuildType=RelWithDebInfo + REM set !InitEnvScript!=%2 + SHIFT + Goto parameter_parse +) else if /i "%1"=="-r" ( + set BuildType=Release + REM set !InitEnvScript!=%2 + SHIFT + Goto parameter_parse +) else if /i "%1"=="--release" ( + set BuildType=Release + REM set !InitEnvScript!=%2 + SHIFT + Goto parameter_parse +) else if /i "%1"=="--sdk" ( + set sdk=-DOPENVIBE_SDK_PATH=%2 + set sdk_val=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--designer" ( + set designer=-DDESIGNER_SDK_PATH=%2 + set designer_val=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--build-dir" ( + set ov_build_dir=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--install-dir" ( + set ov_install_dir=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--dependencies-dir" ( + set dependencies_path="-DLIST_DEPENDENCIES_PATH=%2" + set dependencies_base=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--vsproject" ( + set vsgenerate=TRUE + set builder=None + SHIFT + Goto parameter_parse +) else if /i "%1"=="--vsbuild" ( + set vsgenerate=TRUE + set builder=Visual + SHIFT + Goto parameter_parse +) else if /i "%1" == "--userdata-subdir" ( + set UserDataSubdir="-DOV_CONFIG_SUBDIR=%2" + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--platform-target" ( + set PlatformTarget=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if not "%1" == "" ( + echo unrecognized option [%1] + Goto terminate_error +) + +REM else if not "%1"=="" ( + REM set BuildType=Release + REM set !InitEnvScript!=%1 + REM SHIFT + REM Goto parameter_parse +REM ) + +if /i "!InitEnvScript!"=="windows-init_env_command.cmd" ( + echo No script specified. Default will be used. +) + +if defined vsgenerate ( + echo Build type is set to: MultiType. +) else ( + echo Build type is set to: %BuildType%. +) + +echo Init-env Script to be called: !InitEnvScript!. +REM ####################################################################################### + +call "!InitEnvScript!" --dependencies-dir %dependencies_base% --platform-target %PlatformTarget% + +REM ####################################################################################### + +if defined vsgenerate ( + if /i "%PlatformTarget%" == "x64" ( + set generator=-G"%VSCMake% Win64" -T "v120" + ) else ( + set generator=-G"%VSCMake%" -T "v120" + ) + if not defined build_dir ( + set build_dir=%root_dir%\..\openvibe-extras-build\vs-project + ) + if not defined install_dir ( + set install_dir=%root_dir%\..\openvibe-extras-build\dist + ) +) else ( + set build_type="-DCMAKE_BUILD_TYPE=%BuildType%" + if not defined build_dir ( + set build_dir=%root_dir%\..\openvibe-extras-build\build-%BuildType% + ) + if not defined install_dir ( + set install_dir=%root_dir%\..\openvibe-extras-build\dist-%BuildType% + ) +) +if defined sdk ( + echo SDK is located at %sdk_val% +) else ( + echo "Using default for SDK path (check CMake for inferred value)" +) + +if defined designer ( + echo Designer is located at %designer_val% +) else ( + echo "Using default for Designer path (check CMake for inferred value)" +) + + +echo. +echo _______________________________________________________________________________ +echo. + +mkdir %ov_build_dir% 2>NUL +cd /D %ov_build_dir% + +echo Generating makefiles for %VSCMake%. +echo Building to %ov_build_dir% ... + +cmake %ov_script_dir%\.. %generator% %build_type% -DCMAKE_INSTALL_PREFIX=%ov_install_dir% %designer% %sdk% %dependencies_path% %UserDataSubdir% +IF NOT "!ERRORLEVEL!" == "0" goto terminate_error + +echo. +echo Building and installing ... +echo. + +if !builder! == None ( + goto terminate_success +) else if !builder! == Ninja ( + ninja install + if not "!ERRORLEVEL!" == "0" goto terminate_error +) else if !builder! == Visual ( + if %PlatformTarget% == x86 ( + set msplatform=Win32 + ) else ( + set msplatform=%PlatformTarget% + ) + msbuild Openvibe.sln /verbosity:normal /p:Configuration=%BuildType% /p:Platform="!msplatform!" + if not "!ERRORLEVEL!" == "0" goto terminate_error + + cmake --build . --config %BuildType% --target install + if not "!ERRORLEVEL!" == "0" goto terminate_error +) + +echo. +echo Install completed ! +echo. + +echo. +echo _______________________________________________________________________________ +echo. + +goto terminate_success + +REM ####################################################################################### + +:terminate_error + +echo. +echo An error occured during building process ! +echo. +%PAUSE% + +cd %ov_script_dir% +exit /b 1 + +REM ####################################################################################### + +:terminate_success + +%PAUSE% + +goto terminate + +REM ####################################################################################### + +:terminate + +cd %ov_script_dir% + diff --git a/Masterarbeit/openvibe/extras-master/scripts/windows-dependencies-x64.txt b/Masterarbeit/openvibe/extras-master/scripts/windows-dependencies-x64.txt new file mode 100644 index 0000000..19c6974 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/scripts/windows-dependencies-x64.txt @@ -0,0 +1,27 @@ +build/windows/boost_1.58_x64_vc120_dev.zip;boost;1.58 +build/windows/cegui_0.8.4_x64_vc120_dev.zip;cegui;0.8.4 +build/windows/cegui_0.8.4_x64_vc120_runtime.zip;cegui;0.8.4 +build/windows/freealut_1.1.0_x64_vc120.zip;freealut;1.1.0 +build/windows/gtk_2.24.31_x64_vc120_dev.zip;gtk;2.24.31 +build/windows/gtk_2.24.31_x64_vc120_runtime.zip;gtk;2.24.31 +build/windows/itpp_4.3.1_x64_vc120.zip;itpp;4.3.1 +build/windows/liblsl_1.12_x64.zip;liblsl;1.12 +build/windows/libogg_1.2.1_x64_vc120.zip;libogg;1.2.1 +build/windows/libvorbis_1.3.2_x64_vc120.zip;libvorbis;1.3.2 +build/windows/lua_5.1.4_x64_vc110.zip;lua;5.1.4 +build/windows/nsis_log_zip_access_2.51.zip;nsis_log_zip_access;2.51 +build/windows/ogre_1.9.0_x64_vc120_dev.zip;ogre;1.9.0 +build/windows/ogre_1.9.0_x64_vc120_runtime.zip;ogre;1.9.0 +build/windows/openal_1.1_x64.zip;openal;1.1 +build/windows/pthread_2.9.1_x64_vc120_dev.zip;pthread;2.9.1 +build/windows/sdk_brainproducts_actichamp_x64.zip;sdk_brainproducts_actichamp;0.0.0 +build/windows/sdk_brainproducts_liveamp_x64.zip;sdk_brainproducts_liveamp;0.0.0 +build/windows/sdk_eemagine_eego_1.3.19.40453_x64.zip;sdk_eemagine_eego;1.3.19.40453 +build/windows/sdk_micromed_x64_vc120.zip;sdk_micromed;0.0.0 +build/windows/sdk_tmsi_x64.zip;sdk_tmsi;0.0.0 +build/windows/sdk_gtec_unicorn_x64.zip;sdk_gtec_unicorn;0.0.0 +build/windows/vcredist_x64_vc120.zip;vcredist;1.0 +build/windows/vcredist_x64_vc100.zip;vcredist_100;1.0 +build/windows/vcredist_x64_vc110.zip;vcredist_110;1.0 +build/windows/vrpn_7.31_x64_vc120_dev.zip;vrpn;7.31 +build/windows/vrpn_7.31_x64_vc120_runtime.zip;vrpn;7.31 diff --git a/Masterarbeit/openvibe/extras-master/scripts/windows-dependencies-x86.txt b/Masterarbeit/openvibe/extras-master/scripts/windows-dependencies-x86.txt new file mode 100644 index 0000000..c8475c9 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/scripts/windows-dependencies-x86.txt @@ -0,0 +1,31 @@ +build/windows/boost_1.58_x86_vc120_dev.zip;boost;1.58 +build/windows/cegui_0.8.4_x86_vc120_dev.zip;cegui;0.8.4 +build/windows/cegui_0.8.4_x86_vc120_runtime.zip;cegui;0.8.4 +build/windows/freealut_1.1.0_x86_vc120.zip;freealut;1.1.0 +build/windows/gtk-2.22.1-dev.zip;gtk;2.22.1 +build/windows/gtk-2.22.1-runtime.zip;gtk;2.22.1 +build/windows/itpp_4.3.1_x86_vc120.zip;itpp;4.3.1 +build/windows/liblsl_1.12_x86.zip;liblsl;1.12 +build/windows/libogg_1.2.1_x86.zip;libogg;1.2.1 +build/windows/libvorbis_1.3.2_x86.zip;libvorbis;1.3.2 +build/windows/lua_5.1.4_x86_vc110.zip;lua;5.1.4 +build/windows/nsis_log_zip_access_2.51.zip;nsis_log_zip_access;2.51 +build/windows/ogre_1.9.0_x86_vc120_dev.zip;ogre;1.9.0 +build/windows/ogre_1.9.0_x86_vc120_runtime.zip;ogre;1.9.0 +build/windows/openal_1.1_x86.zip;openal;1.1 +build/windows/pthread_2.9.1_x86_vc120_dev.zip;pthread;2.9.1 +build/windows/sdk_brainproducts_actichamp_x86.zip;sdk_brainproducts_actichamp;0.0.0 +build/windows/sdk_brainproducts_liveamp_x86.zip;sdk_brainproducts_liveamp;0.0.0 +build/windows/sdk_eemagine_eego_1.3.19.40453_x86.zip;sdk_eemagine_eego;1.3.19.40453 +build/windows/sdk_enobio3g_x86.zip;sdk_enobio3g;0.0.0 +build/windows/sdk_mcs_x86.zip;sdk_mcs;0.0.0 +build/windows/sdk_mensia_acquisition_driver_3.0.99_x86.zip;sdk_mensia_acquisition_driver;3.0.99 +build/windows/sdk_micromed_x86_vc120.zip;sdk_micromed;0.0.0 +build/windows/sdk_mitsar_x86.zip;sdk_mitsar;0.0.0 +build/windows/sdk_nexus_x86.zip;sdk_nexus;0.0.0 +build/windows/sdk_tmsi_x86.zip;sdk_tmsi;0.0.0 +build/windows/vcredist_x86_vc120.zip;vcredist;1.0 +build/windows/vcredist_x86_vc100.zip;vcredist_100;1.0 +build/windows/vcredist_x86_vc110.zip;vcredist_110;1.0 +build/windows/vrpn_7.31_x86_vc120_dev.zip;vrpn;7.31 +build/windows/vrpn_7.31_x86_vc120_runtime.zip;vrpn;7.31 diff --git a/Masterarbeit/openvibe/extras-master/scripts/windows-dependencies.cmd-base b/Masterarbeit/openvibe/extras-master/scripts/windows-dependencies.cmd-base new file mode 100755 index 0000000..f33664b --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/scripts/windows-dependencies.cmd-base @@ -0,0 +1,22 @@ + +SET PATH=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\\bin;%PATH% + +SET PATH=%dependencies_base%\gtk\bin;%PATH% +SET OGRE_HOME=%dependencies_base%\ogre +SET PATH=%OGRE_HOME%\bin\release;%OGRE_HOME%\bin\debug;%PATH% +SET PATH=%dependencies_base%\cegui\bin;%PATH% +SET PATH=%dependencies_base%\cegui\dependencies\bin;%PATH% +SET VRPNROOT=%dependencies_base%\vrpn +SET PATH=%VRPNROOT%\bin;%PATH% + +SET PATH=%dependencies_base%\vcredist_100\;%PATH% +SET PATH=%dependencies_base%\vcredist_110\;%PATH% +SET PATH=%dependencies_base%\vcredist\;%PATH% + +REM Apply user-provided Python2.7 paths if available +IF NOT !PYTHONHOME27!==!EMPTY! IF NOT !PYTHONPATH27!==!EMPTY! SET REPLACE_PYTHON=true +IF NOT !REPLACE_PYTHON!==!EMPTY! ( + SET "PYTHONHOME=%PYTHONHOME27%" + SET "PYTHONPATH=%PYTHONPATH27%" +) + diff --git a/Masterarbeit/openvibe/extras-master/scripts/windows-init_env_command.cmd b/Masterarbeit/openvibe/extras-master/scripts/windows-init_env_command.cmd new file mode 100755 index 0000000..4cda24f --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/scripts/windows-init_env_command.cmd @@ -0,0 +1,133 @@ +@echo off + +REM ######################################################################################################################## + +SET PATH=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin;!PATH! +set "SCRIPT_PATH=%~dp0" +set "PLATFORM=x86" + +:parameter_parse + + if /i "%1" == "--dependencies-dir" ( + set "PATH_DEPENDENCIES=%2" + SHIFT + SHIFT + Goto parameter_parse + ) else if /i "%1" == "--platform-target" ( + if "%2"=="x64" ( + set PLATFORM=x64 + set VSPLATFORMGENERATOR=Win64 + ) else if "%2"=="x86" ( + set PLATFORM=x86 + set VSPLATFORMGENERATOR= + ) else ( + echo Unknown platform %2 target + Goto terminate + ) + SHIFT + SHIFT + + Goto parameter_parse +) else if not "%1" == "" ( + echo unrecognized option [%1] + Goto terminate_error +) + +if not defined PATH_DEPENDENCIES ( + if %PLATFORM%==x64 ( + SET "PATH_DEPENDENCIES=%SCRIPT_PATH%../dependencies_x64" + ) else ( + SET "PATH_DEPENDENCIES=%SCRIPT_PATH%../dependencies" + ) + + set "PATH=!PATH_DEPENDENCIES!/cmake/bin;!PATH!" + set "PATH=!PATH_DEPENDENCIES!/ninja;!PATH!" + set "PATH=!PATH_DEPENDENCIES!/gtk/bin;!PATH!" +) else ( + for %%A in (%PATH_DEPENDENCIES%) DO ( + if exist "%%A\cmake\bin\" ( + set "PATH=%%A\cmake\bin;!PATH!" + ) + + if exist "%%A\gtk\bin\" ( + set "PATH=%%A\gtk\bin;!PATH!" + ) + + if exist "%%A\ninja\" ( + set "PATH=%%A\ninja;!PATH!" + ) + ) +) + +REM # Set to 1 to skip new compilers. +if not defined SKIP_VS2017 ( + SET SKIP_VS2017=1 +) +if not defined SKIP_VS2015 ( + SET SKIP_VS2015=1 +) +if not defined SKIP_VS2013 ( + SET SKIP_VS2013=0 +) + +SET VSTOOLS= +SET VSCMake= +set VCVARSALLPATH=../../VC/vcvarsall.bat + +if %SKIP_VS2017% == 0 ( + set "VSTOOLS=%VS150COMNTOOLS%" + set VSCMake=Visual Studio 15 2017 +) else if %SKIP_VS2015% == 0 ( + echo Visual Studio 2017 detection skipped as requested + set "VSTOOLS=%VS140COMNTOOLS%" + set VSCMake=Visual Studio 14 2015 +) else ( + echo Visual Studio 2017 detection skipped as requested + echo Visual Studio 2015 detection skipped as requested + set "VSTOOLS=%VS120COMNTOOLS%" + set VSCMake=Visual Studio 12 2013 +) + + +if exist "!VSTOOLS!%VCVARSALLPATH%" ( + if %PLATFORM% == x64 ( + if exist "!VSTOOLS!../../VC/bin/x64" ( + echo Found %VSCMake% tools: !VSTOOLS!%VCVARSALLPATH% %PLATFORM% + call "!VSTOOLS!%VCVARSALLPATH%" %PLATFORM% + ) else ( + echo Found %VSCMake% tools: !VSTOOLS!%VCVARSALLPATH% x86_amd64 + call "!VSTOOLS!%VCVARSALLPATH%" x86_amd64 + ) + ) else ( + echo Found %VSCMake% tools: !VSTOOLS!vsvars32.bat + call "!VSTOOLS!vsvars32.bat" + ) + goto terminate +) + +set VSCMake=!VSCMake! %VSPLATFORMGENERATOR% + +goto terminate_success + +:terminate_error + +echo ###################################################################################### +echo ## ## +echo ## ERROR : Microsoft Visual Studio Common tools initialisation script not found ## +echo ## ## +echo ###################################################################################### +echo An error occured during environment initializing ! + +pause +exit 1 + +REM ####################################################################################### +:terminate_success + +goto terminate + +REM ####################################################################################### + +REM ####################################################################################### +:terminate + diff --git a/Masterarbeit/openvibe/extras-master/scripts/windows-openvibe-x.x.x-setup-x64.nsi b/Masterarbeit/openvibe/extras-master/scripts/windows-openvibe-x.x.x-setup-x64.nsi new file mode 100644 index 0000000..4d3e967 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/scripts/windows-openvibe-x.x.x-setup-x64.nsi @@ -0,0 +1,300 @@ +; define a default for dep source directory +!ifndef DEPENDENCIES_DIR + !define DEPENDENCIES_DIR "..\..\dependencies_x64" +!endif + + !define OV_VERSION "3.1.0" + !define OV_VERSION_SHORT "310" + +!ifndef OUTFILE + !define OUTFILE "openvibe-${OV_VERSION}-64bit-setup.exe" +!endif + + SetCompressor /FINAL /SOLID lzma + SetCompressorDictSize 16 + + !include "MUI.nsh" + !include "zipdll.nsh" + + ;Name and file + !define OV_NAME "OpenViBE ${OV_VERSION} (64bit)" + Name "${OV_NAME}" + OutFile ${OUTFILE} + + ;To detect a previous installation + !define OV_REGKEY "openvibe${OV_VERSION_SHORT}-64bit" + + ;Default installation folder + InstallDir "$PROGRAMFILES64\openvibe-${OV_VERSION}-64bit" + Var OLDINSTDIR + Var DIRECTX_MISSING + +;Interface Settings + + !define MUI_ABORTWARNING + +;Pages + + !insertmacro MUI_PAGE_WELCOME + !insertmacro MUI_PAGE_LICENSE "..\COPYING" + !insertmacro MUI_PAGE_DIRECTORY + !insertmacro MUI_PAGE_COMPONENTS + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_PAGE_FINISH + + !insertmacro MUI_UNPAGE_WELCOME + !insertmacro MUI_UNPAGE_CONFIRM + !insertmacro MUI_UNPAGE_INSTFILES + !insertmacro MUI_UNPAGE_FINISH + + + +;Languages + + !insertmacro MUI_LANGUAGE "English" + +;Installer and uninstaller icons + + Icon "${NSISDIR}\Contrib\Graphics\Icons\box-install.ico" + UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\box-uninstall.ico" + +;########################################################################################################################################################## +;########################################################################################################################################################## +;########################################################################################################################################################## + + +Function .onInit + + ; Note that for logging to work, you will need a logging-enabled build of nsis. + ; At the time of writing this, you could get one from http://nsis.sourceforge.net/Special_Builds + LogSet on + + UserInfo::GetAccountType + Pop $R1 + StrCmp $R1 "Admin" has_admin_rights 0 + MessageBox MB_OK "You must be administrator to install OpenViBE" /SD IDOK + Quit +has_admin_rights: + + ReadRegStr $0 HKLM SOFTWARE\${OV_REGKEY} InstallDir + + ${If} $0 != "" + IfFileExists "$0\Uninstall.exe" +1 +5 + MessageBox MB_YESNO "A previous installation of ${OV_NAME} is installed under $0.$\nContinuing the install procedure will remove previous installation of ${OV_NAME} (including all files you eventually added in the installation directory).$\nWould you like to accept this removal and continue on installation process ?" /SD IDYES IDNO +1 IDYES +2 + Abort + StrCpy $OLDINSTDIR $0 + StrCpy $INSTDIR $0 + ${EndIf} + + ; Make OpenViBE section mandatory + IntOp $0 ${SF_SELECTED} | ${SF_RO} + IntOp $0 $0 | ${SF_BOLD} + SectionSetFlags "Section1" $0 + +FunctionEnd + +; Returns characters before -, _ or . +Function GetFirstStrPart + Exch $R0 + Push $R1 + Push $R2 + StrLen $R1 $R0 + IntOp $R1 $R1 + 1 + loop: + IntOp $R1 $R1 - 1 + StrCpy $R2 $R0 1 -$R1 + StrCmp $R2 "" exit2 + StrCmp $R2 "-" exit1 + StrCmp $R2 "_" exit1 + StrCmp $R2 "." exit1 + Goto loop + exit1: + StrCpy $R0 $R0 -$R1 + exit2: + Pop $R2 + Pop $R1 + Exch $R0 +FunctionEnd + +;########################################################################################################################################################## +;########################################################################################################################################################## +;########################################################################################################################################################## + +Section "!OpenViBE" Section1 + + LogSet on + + ${If} $OLDINSTDIR != "" + RMDir /r $OLDINSTDIR + RMDir /r "$SMPROGRAMS\${OV_NAME}" + ${EndIf} + + SetOutPath $INSTDIR + WriteRegStr HKLM "SOFTWARE\${OV_REGKEY}" "InstallDir" "$INSTDIR" + WriteUninstaller Uninstall.exe + + CreateDirectory "$INSTDIR\dependencies\arch" + StrCpy $DIRECTX_MISSING "false" + + SetOutPath "$INSTDIR\dependencies" + IfFileExists "$SYSDIR\d3dx9_43.dll" no_need_to_install_directx + NSISdl::download "https://download.microsoft.com/download/8/4/A/84A35BF1-DAFE-4AE8-82AF-AD2AE20B6B14/directx_Jun2010_redist.exe" "arch\directx-jun2010.exe" + Pop $R0 ; Get the return value + StrCmp $R0 "success" +4 + MessageBox MB_OK "Download failed: $R0$\nCheck your Internet connection and your firewall settings.$\nDirect X won't be installed and 3D functionalities won't be available...$\nYou can install DirectX later to enable 3D functionalities !" /SD IDOK + StrCpy $DIRECTX_MISSING "true" + Goto no_need_to_install_directx ; Quit + ExecWait '"arch\directx-jun2010.exe" /T:"$INSTDIR\tmp" /Q' + ExecWait '"$INSTDIR\tmp\DXSETUP.exe" /silent' + RMDir /r "$INSTDIR\tmp" +no_need_to_install_directx: + + ; We download the redist from microsoft as its rather large. At the time of writing, vc140 is used by gNeedAccess and hence AS. + SetOutPath "$INSTDIR\dependencies" + IfFileExists "$SYSDIR\msvcp140.dll" no_need_to_install_vc140 + NSISdl::download "https://download.microsoft.com/download/9/3/F/93FCF1E7-E6A4-478B-96E7-D4B285925B00/vc_redist.x64.exe" "arch\vc_redist.x64.exe" + Pop $R0 ; Get the return value + StrCmp $R0 "success" +3 + MessageBox MB_OK "Download failed: $R0$\nCheck your Internet connection and your firewall settings.$\nVisual Studio 2015 Redistributable x64 (vc140) could not be downloaded.\nYou can try to install it manually from Microsoft and then retry the OpenViBE installer." /SD IDOK + Quit + ExecWait '"arch\vc_redist.x64.exe" /install /norestart /passive' +no_need_to_install_vc140: + + ; This is the destination path where the zips will be copied to + SetOutPath "$INSTDIR\dependencies\arch" + ; The following source paths are relative to this .nsi script location + File "${DEPENDENCIES_DIR}\arch\build\windows\*runtime.zip" + File "${DEPENDENCIES_DIR}\arch\build\windows\pthread*.zip" + ; All vcredist packages extracted to the same folder + File "${DEPENDENCIES_DIR}\arch\build\windows\vcredist*.zip" + + ; The zips are extracted here by the installer + SetOutPath "$INSTDIR\dependencies" + + ; Extract all the zip archives + ; n.b. this thing will freeze on exec if there is no - or _ in the filename + ClearErrors + FindFirst $R0 $R1 "arch\*.zip" + ZipLoop: + IfErrors ZipDone + + ; find the base name, push to R2 + Push "$R1" + Call GetFirstStrPart + Pop "$R2" + + ZipDLL::extractall "arch\$R1" "$R2" + + ClearErrors + FindNext $R0 $R1 + Goto ZipLoop + ZipDone: + FindClose $R0 + + ; Zip extract hopefully done now + + SetOutPath "$INSTDIR" + ; Export binaries + File /nonfatal /r ..\..\dist\extras-Release-x64\bin + ; Export launch scripts + File /nonfatal ..\..\dist\extras-Release-x64\*.cmd + ; File /nonfatal /r ..\dist\doc + ; File /nonfatal /r ..\dist\include + + ; etc and lib folders are needed for the gtk theme + File /nonfatal /r /x *.lib ..\..\dist\extras-Release-x64\lib + File /nonfatal /r ..\..\dist\extras-Release-x64\etc + + File /nonfatal /r ..\..\dist\extras-Release-x64\log + File /nonfatal /r ..\..\dist\extras-Release-x64\share + ; File /nonfatal /r ..\dist\tmp + + StrCmp $DIRECTX_MISSING "false" no_need_to_patch_3d_functionnality + FileOpen $0 "$INSTDIR\share\openvibe\kernel\openvibe.conf" a + FileSeek $0 0 END + FileWrite $0 "$\r$\n" + FileWrite $0 "#####################################################################################$\r$\n" + FileWrite $0 "# Patched by installer because DirectX is missing$\r$\n" + FileWrite $0 "#####################################################################################$\r$\n" + FileWrite $0 "Kernel_3DVisualizationEnabled = false$\r$\n" + FileClose $0 +no_need_to_patch_3d_functionnality: + + ; Overwrite the file that may be in share/, as it contains local definitions to the build machine + FileOpen $0 "$INSTDIR\bin\openvibe-set-env.cmd" w + FileWrite $0 "@echo off$\r$\n" + FileWrite $0 "$\r$\n" + + FileWrite $0 "$\r$\n" + FileWrite $0 "SET OGRE_HOME=$INSTDIR\dependencies\ogre$\r$\n" + FileWrite $0 "SET VRPNROOT=$INSTDIR\dependencies\vrpn$\r$\n" + FileWrite $0 "$\r$\n" + FileWrite $0 "SET PATH=$INSTDIR\dependencies\gtk\bin;%PATH%$\r$\n" + FileWrite $0 "SET PATH=$INSTDIR\dependencies\cegui\bin;%PATH%$\r$\n" + FileWrite $0 "SET PATH=$INSTDIR\dependencies\cegui\dependencies\bin;%PATH%$\r$\n" + FileWrite $0 "SET PATH=%OGRE_HOME%\bin\release;%OGRE_HOME%\bin\debug;%PATH%$\r$\n" + FileWrite $0 "SET PATH=%VRPNROOT%\bin;%PATH%$\r$\n" + FileWrite $0 "SET PATH=$INSTDIR\dependencies\pthread\lib;%PATH%$\r$\n" + FileWrite $0 "SET PATH=$INSTDIR\dependencies\vcredist\;%PATH%$\r$\n" + + FileWrite $0 "$\r$\n" + FileWrite $0 "REM Apply user-provided Python2.7 paths if available$\r$\n" + FileWrite $0 "IF NOT !PYTHONHOME27!==!EMPTY! IF NOT !PYTHONPATH27!==!EMPTY! SET REPLACE_PYTHON=true$\r$\n" + FileWrite $0 "IF NOT !REPLACE_PYTHON!==!EMPTY! ($\r$\n" + FileWrite $0 " SET $\"PYTHONHOME=%PYTHONHOME27%$\"$\r$\n" + FileWrite $0 " SET $\"PYTHONPATH=%PYTHONPATH27%$\"$\r$\n" + FileWrite $0 ")$\r$\n" + + FileClose $0 + + FileOpen $0 "$INSTDIR\dependencies\cegui\resources.cfg" w + FileWrite $0 "FileSystem=$INSTDIR\dependencies\cegui\datafiles\configs$\r$\n" + FileWrite $0 "FileSystem=$INSTDIR\dependencies\cegui\datafiles\fonts$\r$\n" + FileWrite $0 "FileSystem=$INSTDIR\dependencies\cegui\datafiles\imagesets$\r$\n" + FileWrite $0 "FileSystem=$INSTDIR\dependencies\cegui\datafiles\layouts$\r$\n" + FileWrite $0 "FileSystem=$INSTDIR\dependencies\cegui\datafiles\looknfeel$\r$\n" + FileWrite $0 "FileSystem=$INSTDIR\dependencies\cegui\datafiles\lua_scripts$\r$\n" + FileWrite $0 "FileSystem=$INSTDIR\dependencies\cegui\datafiles\schemes$\r$\n" + FileWrite $0 "FileSystem=$INSTDIR\dependencies\cegui\datafiles\xml_schemes$\r$\n" + FileClose $0 + + FileOpen $0 "$INSTDIR\dependencies\gtk\etc\gtk-2.0\gtkrc" w + FileWrite $0 "gtk-theme-name = $\"Redmond$\"$\r$\n" + FileWrite $0 "style $\"user-font$\"$\r$\n" + FileWrite $0 "{$\r$\n" + FileWrite $0 " font_name=$\"Sans 8$\"$\r$\n" + FileWrite $0 "}$\r$\n" + FileWrite $0 "widget_class $\"*$\" style $\"user-font$\"$\r$\n" + FileClose $0 + + CreateDirectory "$SMPROGRAMS\${OV_NAME}" + CreateDirectory "$SMPROGRAMS\${OV_NAME}\Developer tools" + CreateShortCut "$SMPROGRAMS\${OV_NAME}\Developer tools\OpenViBE ID Generator.lnk" "$INSTDIR\openvibe-id-generator.cmd" "" "%SystemRoot%\system32\shell32.dll" 57 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\Developer tools\OpenViBE Plugin Inspector.lnk" "$INSTDIR\openvibe-plugin-inspector.cmd" "" "%SystemRoot%\system32\shell32.dll" 57 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\Developer tools\OpenViBE Skeleton Generator.lnk" "$INSTDIR\openvibe-skeleton-generator.cmd" "" "%SystemRoot%\system32\shell32.dll" 57 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\OpenViBE Designer 64bit.lnk" "$INSTDIR\openvibe-designer.cmd" "" "%SystemRoot%\system32\shell32.dll" 137 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\OpenViBE Acquisition Server 64bit.lnk" "$INSTDIR\openvibe-acquisition-server.cmd" "" "%SystemRoot%\system32\shell32.dll" 18 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\OpenViBE Tracker 64bit.lnk" "$INSTDIR\openvibe-tracker.cmd" "" "%SystemRoot%\system32\shell32.dll" 249 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\OpenViBE VR-demo Spaceship 64bit.lnk" "$INSTDIR\openvibe-vr-demo-spaceship.cmd" "" "%SystemRoot%\system32\shell32.dll" 200 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\OpenViBE VR-demo Handball 64bit.lnk" "$INSTDIR\openvibe-vr-demo-handball.cmd" "" "%SystemRoot%\system32\shell32.dll" 200 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe" + + + ; AccessControl::EnableFileInheritance "$INSTDIR" + ; AccessControl::GrantOnFile "$INSTDIR" "(BU)" "GenericRead + GenericWrite + GenericExecute + Delete" ; to ensure windows XP back compatibility + ; AccessControl::GrantOnFile "$INSTDIR" "(S-1-5-32-545)" "GenericRead + GenericWrite + GenericExecute + Delete" ; (BU) user group (builtin users) does not exist on win7. this SID replaces it. +SectionEnd + +Section "Uninstall" + + RMDir /r $INSTDIR + RMDir /r "$SMPROGRAMS\${OV_NAME}" + +SectionEnd + +LangString DESC_Section1 ${LANG_ENGLISH} "The OpenViBE package: Designer, Acquisition Server, drivers, examples, etc." + +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${Section1} $(DESC_Section1) +!insertmacro MUI_FUNCTION_DESCRIPTION_END + diff --git a/Masterarbeit/openvibe/extras-master/scripts/windows-openvibe-x.x.x-setup-x86.nsi b/Masterarbeit/openvibe/extras-master/scripts/windows-openvibe-x.x.x-setup-x86.nsi new file mode 100644 index 0000000..190df92 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/scripts/windows-openvibe-x.x.x-setup-x86.nsi @@ -0,0 +1,299 @@ +; define a default for dep dir +!ifndef DEPENDENCIES_DIR + !define DEPENDENCIES_DIR "..\..\dependencies" +!endif + + !define OV_VERSION "3.1.0" + !define OV_VERSION_SHORT "310" + +!ifndef OUTFILE + !define OUTFILE "openvibe-${OV_VERSION}-32bit-setup.exe" +!endif + + SetCompressor /FINAL /SOLID lzma + SetCompressorDictSize 16 + + !include "MUI.nsh" + !include "zipdll.nsh" + + ;Name and file + !define OV_NAME "OpenViBE ${OV_VERSION} (32bit)" + Name "${OV_NAME}" + OutFile ${OUTFILE} + + ;To detect a previous installation + !define OV_REGKEY "openvibe${OV_VERSION_SHORT}" + + ;Default installation folder + InstallDir "$PROGRAMFILES\openvibe-${OV_VERSION}" + Var OLDINSTDIR + Var DIRECTX_MISSING + +;Interface Settings + + !define MUI_ABORTWARNING + +;Pages + + !insertmacro MUI_PAGE_WELCOME + !insertmacro MUI_PAGE_LICENSE "..\COPYING" + !insertmacro MUI_PAGE_DIRECTORY + !insertmacro MUI_PAGE_COMPONENTS + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_PAGE_FINISH + + !insertmacro MUI_UNPAGE_WELCOME + !insertmacro MUI_UNPAGE_CONFIRM + !insertmacro MUI_UNPAGE_INSTFILES + !insertmacro MUI_UNPAGE_FINISH + + + +;Languages + + !insertmacro MUI_LANGUAGE "English" + +;Installer and uninstaller icons + + Icon "${NSISDIR}\Contrib\Graphics\Icons\box-install.ico" + UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\box-uninstall.ico" + +;########################################################################################################################################################## +;########################################################################################################################################################## +;########################################################################################################################################################## + + +Function .onInit + + ; Note that for logging to work, you will need a logging-enabled build of nsis. + ; At the time of writing this, you could get one from http://nsis.sourceforge.net/Special_Builds + LogSet on + + UserInfo::GetAccountType + Pop $R1 + StrCmp $R1 "Admin" has_admin_rights 0 + MessageBox MB_OK "You must be administrator to install OpenViBE" /SD IDOK + Quit +has_admin_rights: + + ReadRegStr $0 HKLM SOFTWARE\${OV_REGKEY} InstallDir + + ${If} $0 != "" + IfFileExists "$0\Uninstall.exe" +1 +5 + MessageBox MB_YESNO "A previous installation of ${OV_NAME} is installed under $0.$\nContinuing the install procedure will remove previous installation of ${OV_NAME} (including all files you eventually added in the installation directory).$\nWould you like to accept this removal and continue on installation process ?" /SD IDYES IDNO +1 IDYES +2 + Abort + StrCpy $OLDINSTDIR $0 + StrCpy $INSTDIR $0 + ${EndIf} + + ; Make OpenViBE section mandatory + IntOp $0 ${SF_SELECTED} | ${SF_RO} + IntOp $0 $0 | ${SF_BOLD} + SectionSetFlags "Section1" $0 + +FunctionEnd + +; Returns characters before -, _ or . +Function GetFirstStrPart + Exch $R0 + Push $R1 + Push $R2 + StrLen $R1 $R0 + IntOp $R1 $R1 + 1 + loop: + IntOp $R1 $R1 - 1 + StrCpy $R2 $R0 1 -$R1 + StrCmp $R2 "" exit2 + StrCmp $R2 "-" exit1 + StrCmp $R2 "_" exit1 + StrCmp $R2 "." exit1 + Goto loop + exit1: + StrCpy $R0 $R0 -$R1 + exit2: + Pop $R2 + Pop $R1 + Exch $R0 +FunctionEnd + +;########################################################################################################################################################## +;########################################################################################################################################################## +;########################################################################################################################################################## + +Section "!OpenViBE" Section1 + + LogSet on + + ${If} $OLDINSTDIR != "" + RMDir /r $OLDINSTDIR + RMDir /r "$SMPROGRAMS\${OV_NAME}" + ${EndIf} + + SetOutPath $INSTDIR + WriteRegStr HKLM "SOFTWARE\${OV_REGKEY}" "InstallDir" "$INSTDIR" + WriteUninstaller Uninstall.exe + + CreateDirectory "$INSTDIR\dependencies\arch" + StrCpy $DIRECTX_MISSING "false" + + SetOutPath "$INSTDIR\dependencies" + IfFileExists "$SYSDIR\d3dx9_43.dll" no_need_to_install_directx + NSISdl::download "https://download.microsoft.com/download/8/4/A/84A35BF1-DAFE-4AE8-82AF-AD2AE20B6B14/directx_Jun2010_redist.exe" "arch\directx-jun2010.exe" + Pop $R0 ; Get the return value + StrCmp $R0 "success" +4 + MessageBox MB_OK "Download failed: $R0$\nCheck your Internet connection and your firewall settings.$\nDirect X won't be installed and 3D functionalities won't be available...$\nYou can install DirectX later to enable 3D functionalities !" /SD IDOK + StrCpy $DIRECTX_MISSING "true" + Goto no_need_to_install_directx ; Quit + ExecWait '"arch\directx-jun2010.exe" /T:"$INSTDIR\tmp" /Q' + ExecWait '"$INSTDIR\tmp\DXSETUP.exe" /silent' + RMDir /r "$INSTDIR\tmp" +no_need_to_install_directx: + + ; We download the redist from microsoft as its rather large. At the time of writing, vc140 is used by gNeedAccess and hence AS. + SetOutPath "$INSTDIR\dependencies" + IfFileExists "$SYSDIR\msvcp140.dll" no_need_to_install_vc140 + NSISdl::download "https://download.microsoft.com/download/9/3/F/93FCF1E7-E6A4-478B-96E7-D4B285925B00/vc_redist.x86.exe" "arch\vc_redist.x86.exe" + Pop $R0 ; Get the return value + StrCmp $R0 "success" +3 + MessageBox MB_OK "Download failed: $R0$\nCheck your Internet connection and your firewall settings.$\nVisual Studio 2015 Redistributable x86 (vc140) could not be downloaded.\nYou can try to install it manually from Microsoft and then retry the OpenViBE installer." /SD IDOK + Quit + ExecWait '"arch\vc_redist.x86.exe" /install /norestart /passive' +no_need_to_install_vc140: + + ; This is the destination path where the zips will be copied to + SetOutPath "$INSTDIR\dependencies\arch" + ; The following source paths are relative to this .nsi script location + File "${DEPENDENCIES_DIR}\arch\build\windows\*runtime.zip" + File "${DEPENDENCIES_DIR}\arch\build\windows\pthread*.zip" + ; All vcredist packages extracted to the same folder + File "${DEPENDENCIES_DIR}\arch\build\windows\vcredist*.zip" + + ; The zips are extracted here by the installer + SetOutPath "$INSTDIR\dependencies" + + ; Extract all the zip archives + ; n.b. this thing will freeze on exec if there is no - or _ in the filename + ClearErrors + FindFirst $R0 $R1 "arch\*.zip" + ZipLoop: + IfErrors ZipDone + + ; find the base name, push to R2 + Push "$R1" + Call GetFirstStrPart + Pop "$R2" + + ZipDLL::extractall "arch\$R1" "$R2" + + ClearErrors + FindNext $R0 $R1 + Goto ZipLoop + ZipDone: + FindClose $R0 + + ; Zip extract hopefully done now + + SetOutPath "$INSTDIR" + ; Export binaries + File /nonfatal /r ..\..\dist\extras-Release-x86\bin + ; Export launch scripts + File /nonfatal ..\..\dist\extras-Release-x86\*.cmd + ; File /nonfatal /r ..\dist\doc + ; File /nonfatal /r ..\dist\include + + ; etc and lib folders are needed for the gtk theme + File /nonfatal /r /x *.lib ..\..\dist\extras-Release-x86\lib + File /nonfatal /r ..\..\dist\extras-Release-x86\etc + + File /nonfatal /r ..\..\dist\extras-Release-x86\log + File /nonfatal /r ..\..\dist\extras-Release-x86\share + ; File /nonfatal /r ..\dist\tmp + + StrCmp $DIRECTX_MISSING "false" no_need_to_patch_3d_functionnality + FileOpen $0 "$INSTDIR\share\openvibe\kernel\openvibe.conf" a + FileSeek $0 0 END + FileWrite $0 "$\r$\n" + FileWrite $0 "#####################################################################################$\r$\n" + FileWrite $0 "# Patched by installer because DirectX is missing$\r$\n" + FileWrite $0 "#####################################################################################$\r$\n" + FileWrite $0 "Kernel_3DVisualizationEnabled = false$\r$\n" + FileClose $0 +no_need_to_patch_3d_functionnality: + + ; Overwrite the file that may be in share/, as it contains local definitions to the build machine + FileOpen $0 "$INSTDIR\bin\openvibe-set-env.cmd" w + FileWrite $0 "@echo off$\r$\n" + FileWrite $0 "$\r$\n" + + FileWrite $0 "$\r$\n" + FileWrite $0 "SET OGRE_HOME=$INSTDIR\dependencies\ogre$\r$\n" + FileWrite $0 "SET VRPNROOT=$INSTDIR\dependencies\vrpn$\r$\n" + FileWrite $0 "$\r$\n" + FileWrite $0 "SET PATH=$INSTDIR\dependencies\gtk\bin;%PATH%$\r$\n" + FileWrite $0 "SET PATH=$INSTDIR\dependencies\cegui\bin;%PATH%$\r$\n" + FileWrite $0 "SET PATH=$INSTDIR\dependencies\cegui\dependencies\bin;%PATH%$\r$\n" + FileWrite $0 "SET PATH=%OGRE_HOME%\bin\release;%OGRE_HOME%\bin\debug;%PATH%$\r$\n" + FileWrite $0 "SET PATH=%VRPNROOT%\bin;%PATH%$\r$\n" + FileWrite $0 "SET PATH=$INSTDIR\dependencies\pthread\lib;%PATH%$\r$\n" + FileWrite $0 "SET PATH=$INSTDIR\dependencies\vcredist\;%PATH%$\r$\n" + + FileWrite $0 "$\r$\n" + FileWrite $0 "REM Apply user-provided Python2.7 paths if available$\r$\n" + FileWrite $0 "IF NOT !PYTHONHOME27!==!EMPTY! IF NOT !PYTHONPATH27!==!EMPTY! SET REPLACE_PYTHON=true$\r$\n" + FileWrite $0 "IF NOT !REPLACE_PYTHON!==!EMPTY! ($\r$\n" + FileWrite $0 " SET $\"PYTHONHOME=%PYTHONHOME27%$\"$\r$\n" + FileWrite $0 " SET $\"PYTHONPATH=%PYTHONPATH27%$\"$\r$\n" + FileWrite $0 ")$\r$\n" + + FileClose $0 + + FileOpen $0 "$INSTDIR\dependencies\cegui\resources.cfg" w + FileWrite $0 "FileSystem=$INSTDIR\dependencies\cegui\datafiles\configs$\r$\n" + FileWrite $0 "FileSystem=$INSTDIR\dependencies\cegui\datafiles\fonts$\r$\n" + FileWrite $0 "FileSystem=$INSTDIR\dependencies\cegui\datafiles\imagesets$\r$\n" + FileWrite $0 "FileSystem=$INSTDIR\dependencies\cegui\datafiles\layouts$\r$\n" + FileWrite $0 "FileSystem=$INSTDIR\dependencies\cegui\datafiles\looknfeel$\r$\n" + FileWrite $0 "FileSystem=$INSTDIR\dependencies\cegui\datafiles\lua_scripts$\r$\n" + FileWrite $0 "FileSystem=$INSTDIR\dependencies\cegui\datafiles\schemes$\r$\n" + FileWrite $0 "FileSystem=$INSTDIR\dependencies\cegui\datafiles\xml_schemes$\r$\n" + FileClose $0 + + FileOpen $0 "$INSTDIR\dependencies\gtk\etc\gtk-2.0\gtkrc" w + FileWrite $0 "gtk-theme-name = $\"Redmond$\"$\r$\n" + FileWrite $0 "style $\"user-font$\"$\r$\n" + FileWrite $0 "{$\r$\n" + FileWrite $0 " font_name=$\"Sans 8$\"$\r$\n" + FileWrite $0 "}$\r$\n" + FileWrite $0 "widget_class $\"*$\" style $\"user-font$\"$\r$\n" + FileClose $0 + + CreateDirectory "$SMPROGRAMS\${OV_NAME}" + CreateDirectory "$SMPROGRAMS\${OV_NAME}\Developer tools" + CreateShortCut "$SMPROGRAMS\${OV_NAME}\Developer tools\OpenViBE ID Generator.lnk" "$INSTDIR\openvibe-id-generator.cmd" "" "%SystemRoot%\system32\shell32.dll" 57 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\Developer tools\OpenViBE Plugin Inspector.lnk" "$INSTDIR\openvibe-plugin-inspector.cmd" "" "%SystemRoot%\system32\shell32.dll" 57 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\Developer tools\OpenViBE Skeleton Generator.lnk" "$INSTDIR\openvibe-skeleton-generator.cmd" "" "%SystemRoot%\system32\shell32.dll" 57 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\OpenViBE Designer 32bit.lnk" "$INSTDIR\openvibe-designer.cmd" "" "%SystemRoot%\system32\shell32.dll" 137 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\OpenViBE Acquisition Server 32bit.lnk" "$INSTDIR\openvibe-acquisition-server.cmd" "" "%SystemRoot%\system32\shell32.dll" 18 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\OpenViBE Tracker 32bit.lnk" "$INSTDIR\openvibe-tracker.cmd" "" "%SystemRoot%\system32\shell32.dll" 249 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\OpenViBE VR-demo Spaceship 32bit.lnk" "$INSTDIR\openvibe-vr-demo-spaceship.cmd" "" "%SystemRoot%\system32\shell32.dll" 200 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\OpenViBE VR-demo Handball 32bit.lnk" "$INSTDIR\openvibe-vr-demo-handball.cmd" "" "%SystemRoot%\system32\shell32.dll" 200 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe" + + ; AccessControl::EnableFileInheritance "$INSTDIR" + ; AccessControl::GrantOnFile "$INSTDIR" "(BU)" "GenericRead + GenericWrite + GenericExecute + Delete" ; to ensure windows XP back compatibility + ; AccessControl::GrantOnFile "$INSTDIR" "(S-1-5-32-545)" "GenericRead + GenericWrite + GenericExecute + Delete" ; (BU) user group (builtin users) does not exist on win7. this SID replaces it. +SectionEnd + +Section "Uninstall" + + RMDir /r $INSTDIR + RMDir /r "$SMPROGRAMS\${OV_NAME}" + +SectionEnd + +LangString DESC_Section1 ${LANG_ENGLISH} "The OpenViBE package: Designer, Acquisition Server, drivers, examples, etc." + +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${Section1} $(DESC_Section1) +!insertmacro MUI_FUNCTION_DESCRIPTION_END + diff --git a/Masterarbeit/openvibe/extras-master/test/CTestTestfile.cmake b/Masterarbeit/openvibe/extras-master/test/CTestTestfile.cmake new file mode 100644 index 0000000..77ef547 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/test/CTestTestfile.cmake @@ -0,0 +1,48 @@ +# This file is the entry with which the test should be executed. It sets the environement to correct values for the tests. +# After building the project a correctly configured copy of this file should be available in the build folder. +# Executing "ctest -T Test" in the build folder should execute the tests automatically using this file. + +set(ENV{OV_BINARY_PATH} "@DIST_ROOT@") +set(OV_CONFIG_SUBDIR @OV_CONFIG_SUBDIR@) # This is used in the dart files +set(CMAKE_COMMAND "@CMAKE_COMMAND@") +if(WIN32) + set(ENV{OV_USERDATA} "$ENV{APPDATA}/${OV_CONFIG_SUBDIR}/") +else() + SET(ENV{OV_USERDATA} "$ENV{HOME}/.config/${OV_CONFIG_SUBDIR}/") +endif() +SET(OV_LOGFILE "$ENV{OV_USERDATA}/log/openvibe-designer.log") + +set(CTEST_SOURCE_DIRECTORY "@CMAKE_SOURCE_DIR@") + +# this is the folder where test scenarios can be run under +set(ENV{OV_TEST_DEPLOY_PATH} "${CTEST_SOURCE_DIRECTORY}/local-tmp/test-deploy/") + +# subdirs command is deprecated and should be replaced by add_subdirectory calls as per the documentation recommendations, +# however the 2 command do not have the same behavior with ctest. Doing the change currently breaks tests. +subdirs("${CTEST_SOURCE_DIRECTORY}/contrib/plugins/server-extensions/tcp-tagging/test") +#subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/acquisition/test") # No tests here +subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/artifact/test") +subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/classification/test") +subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/data-generation/test") +#subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/dll-bridge/test") # No tests here +subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/evaluation/test") +#subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/examples/test") # No tests here +subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/features-selection/test") +subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/file-io/test") +#subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/matlab/test") # No tests here +#subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/network-io/test") # No tests here +subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/riemannian/test") +subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/signal-processing/test") +subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/simple-visualization/test") +subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/stimulation/test") +#subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/streaming/test") # No tests here +#subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/tests/test") # No tests here +#subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/tools/test") # No tests here +#subdirs("${CTEST_SOURCE_DIRECTORY}/plugins/processing/vrpn/test") # No tests here +#subdirs("${CTEST_SOURCE_DIRECTORY}/applications/platform/acquisition-server/test") # No tests here +#subdirs("${CTEST_SOURCE_DIRECTORY}/applications/demos/ssvep-demo/test") # No tests here +subdirs("${CTEST_SOURCE_DIRECTORY}/applications/demos/vr-demo/test") +#subdirs("${CTEST_SOURCE_DIRECTORY}/applications/developer-tools/plugin-inspector/test") # No tests here +#subdirs("${CTEST_SOURCE_DIRECTORY}/applications/developer-tools/skeleton-generator/test") # No tests here +#subdirs("${CTEST_SOURCE_DIRECTORY}/applications/developer-tools/vrpn-simulator/test") # No tests here +#subdirs("${CTEST_SOURCE_DIRECTORY}/documentation/test") # No tests here diff --git a/Masterarbeit/openvibe/extras-master/test/InstallDependencies b/Masterarbeit/openvibe/extras-master/test/InstallDependencies new file mode 100755 index 0000000..0efcd05 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/test/InstallDependencies @@ -0,0 +1,15 @@ +#!/bin/bash +unamestr=`uname` +if [[ "$unamestr" == 'Linux' ]]; then + if [[ -e /etc/fedora-release ]]; then + echo -e 'openvibe\nopenvibe\n' | sudo passwd + echo -e 'spawn ./linux-install_dependencies\n expect "assword:"\n send "openvibe\n"\n expect -timeout 3600 "done."\n expect -timeout 7200 "Install linux dependencies done"\n' | expect + else + ./linux-install_dependencies + fi; +else + #cygwin + chmod +x ./win32-install_dependencies.exe + ./win32-install_dependencies.exe /S +fi + diff --git a/Masterarbeit/openvibe/extras-master/test/README.txt b/Masterarbeit/openvibe/extras-master/test/README.txt new file mode 100644 index 0000000..92f9bee --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/test/README.txt @@ -0,0 +1,76 @@ + +This directory contains scripts for running the automatic tests of OpenViBE. + +Dependencies +------------ + +To use these tests, you need to have openvibe already successfully compiled with the NON-ide buid. + +On windows, you need to have + - ctest (cmake suite; usually in openvibe's dependencies) + - git command-line tools. The git executable needs to be on PATH. + +On Linux fedora, you need to install : + +# yum install cmake git redhat-lsb gcc-c++ expect + + +Execute test scripts +-------------------- +Call "ctest -T Test" in folder build/extras-Release/ + + +How to add a new test +--------------------- + +You can add new test using a DartTestFile.txt placed in the test directory of a specific module. + +For example, designer specific tests should be placed in DartTestFile.txt in applications/platform/designer/test/ +And specific test for data generation plugin should be placed in DartTestFile.txt in plugins/processing/data-generation/test/ +To be sure that the test is executed, you need to have the relevant subdirectories declared in file test/CTestfile.cmake. + +For example, + +... +SUBDIRS("${CTEST_SOURCE_DIRECTORY}/applications/platform/designer/test") +SUBDIRS("${CTEST_SOURCE_DIRECTORY}/plugins/processing/data-generation/test") +... + + +There is an example of a test using Sinus Oscillator in plugins/processing/data-generation/test/DartTestFile.txt. + + +Test GUI using sikuli-ide +------------------------- +*** WARNING : THE SIKULI TESTS ARE NOT CURRENTLY MAINTAINED AND PROBABLY WILL NOT WORK *** + +If you have installed sikuli-ide in your linux machine them some GUI test are launch. + +For GUI test with sikuli we need a complete gtk windows manager. Actually, we only test with gnome whole package. + +You need to set the same GTK icon theme between machine that generate test and slave. + +You can install (on ubuntu) : + +sudo aptitude install gnome-tweak-tool ubuntu-mono ttf-ubuntu-font-family light-themes dmz-cursor-theme + +them lanch : + +gnome-tweak-tool + + switch icon theme to Ubuntu-Mono-Dark + switch GTK+ theme to Ambiance + if there is Windows theme then switch to Ambiance + switch Cursor theme to DMZ-White + + + +Some remarks +------------ + + - The tests may run designer with no GUI. In Linux this still needs a X11 context. So you need to be sure that the test can access an X server. + If you run on a virtual machine that doesn't start X by default, getting X up can be achieved by automatic start-up of "Xorg -ac&" command to ensure that X server is available. + Thats also why we need to define DISPLAY environment variable before launching the tests. + - For designing new tests, use the existing DartTestFile.txt files as a starting point + + diff --git a/Masterarbeit/openvibe/extras-master/test/check-box-updates.sh b/Masterarbeit/openvibe/extras-master/test/check-box-updates.sh new file mode 100644 index 0000000..98d21db --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/test/check-box-updates.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# +# This script tries to locate boxes in scenarios which need to be updated +# +# Assumes openvibe is compiled and installed to dist/, and that we are in test/ +# + +SYSTEM=`uname -o` +if [ $SYSTEM == "Cygwin" ]; then + EXT="cmd" +else + EXT="sh" +fi + +pushd .. >/dev/null + +echo Scenarios requiring update: +find -iname "*xml" | grep "box-tutorials/\|test/\|bci-examples/" | grep -v dist | while read FN; do + dist/openvibe-designer.$EXT --no-session-management --no-pause --no-gui --open "$FN" | grep -q -E ".*WARNING.*Scenario requires.*update.*box" + if [ $? == 0 ]; then + echo $FN + fi +done + +popd >/dev/null + diff --git a/Masterarbeit/openvibe/extras-master/test/check-scenario-coverage.sh b/Masterarbeit/openvibe/extras-master/test/check-scenario-coverage.sh new file mode 100644 index 0000000..5324759 --- /dev/null +++ b/Masterarbeit/openvibe/extras-master/test/check-scenario-coverage.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# +# This script prints out how many times each box has been used in all scenarios +# +# + +SYSTEM=`uname -o` +if [ $SYSTEM == "Cygwin" ]; then + EXT="cmd" +else + EXT="sh" +fi + +cd ../dist/share/openvibe/scenarios/ +../../../openvibe-plugin-inspector.$EXT --no-pause -l | grep -e "^BoxAlgorithm " | sort | while read DUMMY NAME ID; do + numLines=`grep -R -i "$ID" | wc -l` + echo $NAME : $numLines occurrences + if [ $numLines -eq 0 ]; then + echo !!! No scenario for $NAME $ID + fi +done + diff --git a/Masterarbeit/openvibe/meta-master.tar b/Masterarbeit/openvibe/meta-master.tar new file mode 100644 index 0000000..a10fd40 Binary files /dev/null and b/Masterarbeit/openvibe/meta-master.tar differ diff --git a/Masterarbeit/openvibe/meta-master/.gitattributes b/Masterarbeit/openvibe/meta-master/.gitattributes new file mode 100644 index 0000000..824c2d2 --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/.gitattributes @@ -0,0 +1,11 @@ +# Auto detect text files and perform LF normalization +* text=auto + +*.cmd text eol=crlf +*.cmd-base text eol=crlf + +*.sh text eol=lf +*.sh-base text eol=lf + +# scripts/linux* text eol=lf + diff --git a/Masterarbeit/openvibe/meta-master/.gitignore b/Masterarbeit/openvibe/meta-master/.gitignore new file mode 100644 index 0000000..1fb48cb --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/.gitignore @@ -0,0 +1,12 @@ +/build +/dist +/dependencies +/dependencies_x64 +OpenViBE-Meta.sln +OpenViBE-Meta.sdf +OpenViBE-Meta.v12.suo +designer-extras.vcxproj.user + +# Temp & Software Folder +.vs/ +.vscode/ \ No newline at end of file diff --git a/Masterarbeit/openvibe/meta-master/.gitmodules b/Masterarbeit/openvibe/meta-master/.gitmodules new file mode 100755 index 0000000..3f0c643 --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/.gitmodules @@ -0,0 +1,18 @@ +# +# This default configuration file allows anonymous access. If you're a +# developer with account on http://gitlab.inria.fr and need to push, +# please use the git versions of the urls. +# +[submodule "sdk"] + path = sdk + url = https://gitlab.inria.fr/openvibe/sdk.git + branch = master +[submodule "designer"] + path = designer + url = https://gitlab.inria.fr/openvibe/designer.git + branch = master +[submodule "extras"] + path = extras + url = https://gitlab.inria.fr/openvibe/extras.git + branch = master + diff --git a/Masterarbeit/openvibe/meta-master/AUTHORS.md b/Masterarbeit/openvibe/meta-master/AUTHORS.md new file mode 100644 index 0000000..461efc9 --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/AUTHORS.md @@ -0,0 +1,58 @@ + + *========================================* + |OpenViBE| |AUTHORS| + *========================================* + + Contact: http://openvibe.inria.fr/contact/ + +|People| + +OV 3.1.0 staff in alphabetical order + +- Arthur Desbois / Inria +- Thibaut Monseigne / Inria +- Theodore Papadopoulo / Inria +- Thomas Prampart / Inria + +Developers of previous versions, + + - Guillermo Andrade-Barroso / Inria + - Laurent Bonnet / Inria, Mensia + - Alison Cellard / Inria + - Jerome Chabrol / Inria + - Vincent Delannoy / Inria + - Agnes Dos Santos / Mensia + - Morgane Fauvet / Mensia + - Nathanael Foy / Inria + - Charles Garraud / Inria + - Thierry Gaugry / Inria + - Anatole Lecuyer / Inria + - Jozef Legeny / Inria, Mensia + - Jussi T. Lindgren / Inria + - Fabien Lotte / Inria + - Loic Mahe / Inria + - Baptiste Payan / Inria + - Benoit Perrin / Mensia + - Alexis Placet / Mensia + - Yann Renard / Inria, Mensia + - Bruno Renier / Inria + - Cedric Riou / Inria + - Guillaume Serri�re / Inria + +Scientific Steering Committee : + - Laurent Bougrain / Inria + - Maureen Clerc / Inria + - Anatole Lecuyer / Inria + - Fabien Lotte / Inria + - Theodore Papadopoulo / Inria + +Other contributors : + + - Please see + + http://openvibe.inria.fr/contributors/ + + +|End.of.file| + + vim:tw=78:ts=8:ft=help:norl: diff --git a/Masterarbeit/openvibe/meta-master/CHANGELOG.md b/Masterarbeit/openvibe/meta-master/CHANGELOG.md new file mode 100644 index 0000000..a9e7e42 --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/CHANGELOG.md @@ -0,0 +1,974 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [3.1.0] + +### Added + +- Box : Artifact Subspace Reconstruction (ASR) Box (Issue extras#45) +- Box : Matrix 3D to 2D Box (Issue extras#64) +- Box : Bidirectionnal Unity games box (Issue#61) +- Doc : Changelog (Issue meta#15) + +### Changed + +- Dependency : Update eigen dependency to 3.3.7 (Issue meta#13, sdk#48, extras#49) +- Box : Changed label Artefact-detection to Artifact (which may contain detection or reconstruction or anything related to artifacts) (Issue extras#45) +- Box : New implementation of Connectivity Measure Box (Issue extras#64) +- Dev : Update Geometry Module For ASR Algorithm (Issue extras#45) +- Dev : Improve Kernel CIdentifier Class (Issue sdk#50, designer#15, extras#53) +- Dev : Improve Kernel CMatrix Class (Issue sdk#47, designer#13, extras#47) +- Dev : LSL timestamps configurable (OpenViBE clock or LSL clock). Default is LSL clock (extras#63) +- Dev : Replace using directives with namespace encapsulation (sdk#32, designer#4, extras#15) +- Dev : libSVM updated to v3.2.4 (Issue extras#58) +- Doc : Replace Mensia namespace (Issue designer#16 & extras#54) +- Doc : Updated the online documentation and tutorials + +### Deprecated + +### Removed + +- Algo: Duplicated legacy code for stimulation based epoching (extras#107) + +### Fixed + +- Box : P300 Speller feedback display (Issue extras#51) +- Box : TCPWriter header size +- Build : it++ detection in cmake for unix systems + + +## [3.0.0] - 2020-12-10 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=10160)) + +### Added + +- Driver : Encephalan driver +- Driver : Unicorn driver +- Box : Pybox-manager tool and box to use python sk-learn classifier +- Box : Multimodal Graz visualization +- Box : Artefact detection +- Box : Features selection +- Box : Stimulation validator +- Dev : Geometry module with Riemannian geometry +- Support : Ubuntu 18.04 +- Support : Fedora 31 + +### Changed + +- Support : 64Bit is now the standard build. +- Box : Some boxes have been updated (type, name, inputs...) and must be updated in previous scenarios before run. +- Dev : Python2 support dropped in favour of Python3 (Python 3.7 required) for the scripting box. Python provides a tool to help you migrate your scripts: https://docs.python.org/fr/3/library/2to3.html +- Dev : The code has had a lot of modernisation changes, and some refactoring which imply incompatibility with previous versions requiring changes. List of changes necessary if you would like to migrate one of your plugins, compatible with OpenViBE 2: + - OpenViBE types were removed and replaced with standard types: + - `OpenViBE::uintXX` -> `uintXX_t` + - `OpenViBE::intXX` -> `intXX_t` + - `OpenViBE::float64` -> `double` + - `OpenViBE::boolean` -> `bool` + - Some functions from `System::Memory` were removed and replaced with standard equivalent: + - `System::Memory::copy()` -> `std::memcpy()` + - `System::Memory::move()` -> `std::memmove()` + - `System::Memory::set()` -> `std::memset()` + - `System::Memory::compare()` -> `std::memcmp()` + - Namespaces starting with OpenViBE having been split: + - `OpenViBEPlugins` -> `OpenViBE::Plugins` + - `OpenViBEToolkit` -> `OpenViBE::Toolkit` + - `OpenViBEVisualizationToolkit` -> `OpenViBE::VisualizationToolkit` + - Some ClassId variables were renamed: + - variables containing `StreamedMatrixStreamDecoder` renamed with `StreamedMatrixDecoder` + - e.g. `OVP_GD_ClassId_Algorithm_StreamedMatrixStreamDecoder` -> `OVP_GD_ClassId_Algorithm_StreamedMatrixDecoder` + - variables with `StreamedMatrixStreamEncoder` renamed with `StreamedMatrixEncoder` + - e.g. `OVP_GD_ClassId_Algorithm_StreamedMatrixStreamEncoder` -> `OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder` + - variables with `SamplingRate` renamed with `Sampling` + - e.g. `OVP_GD_Algorithm_SignalEncoder_InputParameterId_SamplingRate` -> `OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling` + - `OVP_ClassId_Plugin_VisualizationContext` -> `OVP_ClassId_Plugin_VisualizationCtx` + - The include file `` was removed and functionalities replaced: + - New header: `#include ` -> `#include ` + - `TimeArithmetics::timeToSeconds(timeVar)` -> `CTime(timeVar).toSeconds()` + - `TimeArrithmetics::SecondsToTime(timeVar)` -> `CTime(timeVar).time()` + - `TimeArithmetics::TimeToSampleCount(freqVar, timeVar)` -> `CTime(time).toSampleCount(freqVar)` + - In the package `ovp_main.cpp`, after the call to `OVP_Declare_Begin()`: `rPluginModuleContext` -> `context` + - Signature of method `processInput()` overriden from class `TBoxAlgorithm` has changed (parameter type `uint32_t` -> `const size_t`): + - `OpenViBE::boolean processInput(OpenViBE::uint32)` -> `bool processInput(const size_t index)` + - Signature of method `hasFunctionality()` overridden from class `IPluginObjectDesc` (in sdk/openvibe/include/openvibe/plugins/ovIPluginObjectDesc.h) has changed: + - `OpenViBE::boolean hasFunctionality(OpenViBE::CIdentifier functionalityIdentifier) const` -> `bool hasFunctionality(const EPluginFunctionality functionality) const` + - `#define OVD_Functionality_Visualization` replaced by `EPluginFunctionality::Visualization` + - Method renamed to match coding rules: + - `TCPTagging::createStimulusSender()` -> `TCPTagging::CreateStimulusSender()` + - Signature of box processClock() may have changed. Both were used, but now only the latter: + - `bool processClock(Kernel::IMessageClock& msg)` -> `bool processClock(Kernel::CMessage& msg)` +- Doc : Updated the online documentation and tutorials +- Doc : Updated the CI Build Badge of Readme + +### Removed + +- Support : Ubuntu under 18.04 (it can work however but official support is no longer provided) +- Support : Fedora under 31 (it can work however but official support is no longer provided) + +### Fixed + +- Dev : Bug fixes made. No list was compiled. + +## [2.2.0] - 2018-12-03 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=10002)) + +### Added + +- Box : Null box that consumes input +- Box : Keypress Emulator box +- Box : Improvements to the ERP Plot box +- Server : Simulated Deviator to study effects of a drifting driver +- Tracker : A new data analysis application allowing to load, freely browse and process multiple EEG files simultaneously +- Scenarios : ERP Plot box tutorial +- Tests : more data to Regularized CSP test to avoid random fails +- Tests : Tests for Streamed Matrix Encoder/Decoder + +### Changed + +- Box : Added error checking to the Timeout box +- Box : Noise Generator can now also bake Gaussian noise +- Box : Added a warning to the old CSV File Reader +- Box : Added TCP Tagging support to the Keyboard Stimulator +- Box : Make channel rename accept any kind of input +- Dependency : Updated LSL dependency to 1.12 +- Dev : Fully 64bit OpenViBE (optional dl): You can use 64bit Python and Matlab versions with it +- Dev : Update name to US style (i.e. normalise -> normalize). +- Doc : Updated the online documentation and tutorials +- Designer : Automatic box update (simple boxes that need update can be sorted out with right-click + update) +- Server : Acquisition Server will now complain if ports are already in use +- Server : Drift Correction can now have an initial skip period +- Scenarios : Updated the P300 Magic Card scenarios +- Scenarios : Update Channel Rename box in box tutorials scenarios after update of SDK to 1.1.0 +- Scenarios : Make external processing example depend on toolkit compilation + +### Fixed + +- Dev : Bug fixes made. Details in release announcement. + +## [2.1.0] - 2018-04-11 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=9916)) + +### Added + +- Box : Brain Vision Format Writer +- Scenarios : Example servers for the external processing box + +### Changed + +- Driver : Added channel scaling to LiveAmp driver +- Dev : Update name to US style (i.e. normalise -> normalize). +- Scenarios : move the default working directory folder to a user folder and add defines for harcoded scenarios folder + +### Removed + +- Box : Useless "Box About" properties + +### Fixed + +- Driver : EEGO impedance errors which were the result of multiple instanciations of the factory object +- Dev : More bug fixes detailed in release announcement. + +## [2.0.1] - 2018-01-31 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=9876)) + +### Added + +- Driver : Generic Time Signal driver +- Driver : EEGO driver for linux +- Dev : Continuous Integration with jenkins +- Tests : Tests for time arithmetic tests +- Tests : Make tests system agnostic : now uses cmake & git internal commands + +### Changed + +- Server : Improve functionnality (driver can be deprecated, tests, validity check...) +- Dev : Remove CMake logs except error logs. +- Dev : Simplify ITimeArithmetics formulas to increase precision +- Dev : Add tests and verification in the Kernel. (signal sampling rate, socket...). +- Box : Add tolerance to chunk continuity in stimulation based epoching +- Doc : Updated the online documentation and tutorials + +### Fixed + +- Driver : Memory leaks in BrainVision Recorder driver +- Server : TCP Tagging +- Dev : Build bugs +- Dev : Memory leaks +- Doc : Documentation generation under linux OS +- More bug fixes detailed in release announcement + +## [2.0.0] - 2017-10-30 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=9840)) + +**Remark** : This version changes everything in the code, you can consider that the project has changed completely. See [this page](http://openvibe.inria.fr/differences-between-1-x-and-2-x-series-of-openvibe/) to see major differences. + +### Added + +- Driver : BrainProducts LiveAmp driver +- Driver : Sampling rate estimation to the LSL driver +- Driver : LiveAmp8 and LiveAmp16 support for LiveAmp Driver +- Box : Temporal filter Box +- Box : Zero crossing detector Box +- Dev : Bluetooth connection to module socket +- Dev : Some flags for OpenMP to optimize its use when used as a backend for eigen +- Designer : Metabox example + +### Changed + +- Designer : Move the loglevel of scenario importer from Information to Trace +- Designer : Improve the readability and the number of error message. +- Server : Drift Correction is now disabled by default +- Dev : All the code is separated in 4 repository (meta, sdk, extra, designer) the sdk and the designer have the Certivibe label. +- Dev : Refactor, Update and improve build system (log during build, dependency install, CMake Version and package, Visual studio version, remove old path, python unfound don't stop the build...) +- Dev : Create script for build on each sub repository. +- Dev : Update error management system +- Dev : Refactoring, update and improve all the code, especially sdk and the kernel for the Certivibe. +- Dev : Update some code style to C++11 instead of C or boost function. +- Dev : Reduce cppcheck warning and errors. +- Box : Update and improve CSV file IO. +- Box : Change label for some boxes. +- Box : Update some checking in box (size or format of input, settings, output...). +- Box : Update some default setting/input/output. +- Scenarios : Update previous scenarios, example and tutorial. + +### Deprecated + +- Box : Add flag deprecated to old CSV Boxes. +- Box : Add flag deprecated to xDAWN Spatial Trainer INRIA Box. + +### Removed + +- Dev : Remove unused flag, token and dependencies +- Doc : Remove the non-relevant documentation and boxes from tools, signal-processing, vrpn, classification, stimulation plugin +- Doc : Updated the online documentation and tutorials + +### Fixed + +- Box : Unicode handling in Boxes and source code. +- Box : Memory leaks. Details in release announcement. +- Dev : Bug fixes made. Details in release announcement. + +## [1.3.0] - 2016-12-30 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=9716)) + +### Added + +- Drivers : NeuroServo HID driver + +### Changed + +- App : Acquisition Server no longer loads unnecessary dlls +- Designer : Skip initialization of 3D context when visualization is disabled +- Drivers : Improvements to gusbamp-gipsa, mostly for multiple gusbamp combinations + - Channel names can now be specified in multiamp case + - Chooses the last amp by default if the user doesn't choose + - If multiple amps are connected, assumes we want to simultaneously record from all of them + - Should now remember the master amp across runs correctly + - Fixed 'Show Device Name' not always working in gusbamp-gipsa + - Improved gusbamp-gipsa multiamp identification + - Tweaked gusbamp gipsa log levels + added a warning + - Fixed the impedance checking to work with multiple amps + - All channels are now correct with both the event channel disabled or enabled. +- Drivers : Emotiv driver support for SDK 3.3.3 + - Updated the web documentation +- Box : Added PCA & Whiten support to the FastICA box +- Box : BrainAmp FileWriter now always creates the marker header +- Box : Changed GDF File Writer to use ITimeArithmetics +- Box : Minor code cleanup & log tweaks +- Box : Refactored Regularized CSP Trainer box code +- Box : Regularized CSP Trainer now supports multiclass +- Box : The FFT plots no longer draw junk during the first frames +- Box : Made Analog VRPN box declare 0 channels before header is received +- Dev : Update cmake script to use --invisible designer option instead of --no-gui +- Dev : Update tests to use --invisible designer option instead of --no-gui +- Dev : Refactored StimulusSender to a new 'tcptagging' module +- Dev : Renamed Mind Shooter source files to avoid confusion + - Changed Mind Shooter sources to refer to the new filenames +- Dev : Changed Mind Shooter to its own namespace for clarity +- Scenarios : Added stimulation output to ov2csv conversion scenario +- Scenarios : Minor cleanup to the P300 scenarios and scripts +- Scenarios : Simplified Multiclass Mind Shooter + - Mind Shooter now uses multiclass CSP and a multiclass classifier + - Scenario pipelines modified and simplified accordingly + - Corrected channel->control mapping + - TCP Tagging is now used to pass stims from the Shooter to the AS + - Added Epoching Delay option to avoid ERP effects + - Fixed the performance evaluation .lua script + - Fixed the feedback computation in the ships' parts + - All config files and logs will now be created under the scenario dir + - Disabled the feedback by default as its not very intuitive + - Previous 'Advanced Control' is now called 'Analog Control' + - Refactored the code to clarify analog and discrete controls + - The choice between the two can be done in the online scenario + - Removed unnecessary parts from the scenarios + - Made the shooter loglevel controllable and default to 'Information' + - VSync and Full Screen selection are now reflected in the ogre.conf + - Removed such .lua scripts which were no longer needed + - Tweaked the performance evaluation scenario & lua to match the new pipeline + - More safety checks to SSVEP Mind Shooter + - Changed SSVEP Mind Shooter to use class probabilities + - Cleaned up junk from the SSVEP acquisition test scenarios + - Added some comments. + - Updated the web documentation +- Scenarios : Original Mind Shooter scenarios are available as 'classic version' +- Dev : cmake now avoids printing the same things many times +- Dev : Added some comments. + +### Fixed + +- Box : BrainAmp File Writer not always creating a header +- Box : GDF File Reader box fix for BCI Competition IV files. +- Box : Acquisition Client crash when requiring update from 0.18 +- Box : Inappropriate deallocation in LSL Export box +- Dev : Compilation on Arch Linux +- Dev : Some case issues in cmake scripts. +- Doc : The Lua Stimulator box doc +- Drivers : Channel scale in the OpenBCI driver +- Scenarios : Incorrect type ids in some test scenarios. + +## [1.2.2] - 2016-07-27 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=9643)) + +### Fixed + +- Drivers : Stabilization of the OpenBCI driver +- Drivers : gUSBAmp and gMobilab are no longer mutually exclusive in Acquisition Server +- Designer : Editing box parameter types in Designer +- App : Issues with SSVEP and Handball demos +- Dev : Compilation on Ubuntu 16.04 +- Dev : Miscellaneous small fixes to examples, scenarios, boxes, etc + +## [1.2.1] - 2016-06-20 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=9643)) + +### Fixed + +- Box : Issue with stimulation params of the Matlab box +- Box : Issue with multiple simultaneous Matlab boxes +- Box : Lua and Python plugins not handling *_Number_* stimuli +- Dev : Bug in Windows installer nsi script ('vcomp120.dll not found' issue) +- Scenarios : Wrong placement of the xval param in the classifier trainer boxes +- Scenarios : Incorrect train triggers in the P300 demos + +## [1.2.0] - 2016-05-20 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=9643)) + +### Added + +- Drivers : GTec gNautilus driver +- Drivers : gUSBAmp (BCI-Lab) driver for Linux +- Drivers : Impendance check support for the EEGO driver +- Box : New and reliable software tagging facility : TCP tagging +- Box : Simple Outlier Removal box +- Scenarios : How to do elementary incremental learning +- Tests : Tests for Shrinkage LDA + +### Changed + +- App : Designer will now show version info in the title bar +- App : Changed Win clock granularity to 1ms in AS and Designer +- App : Designer will now inform of special box states on load +- App : Designer now warns if scenarios have unknown box algorithms +- Box : Dropped support for the old LDA classifiers, please retrain +- Box : Classifier Processor can now reload the model on receiving a stimulation +- Box : Various enhancements to the FastICA box +- Scenarios : Changed basic P300 to use the TCP Tagging +- Scenarios : VRPN examples now print out the used device names +- Scenarios : Updated the Motor Imagery scenarios to use TCP Tagging +- Dependency : Support for Ogre 1.9.0 and CEGUI 0.8.4 +- Dev : VS2013 compatibility +- Dev : Scenario exporters will now include the openvibe version + +### Fixed + +- Drivers : Drift bug in gusbamp gipsa driver +- Box : Problem of xval setting placement in Classifier Trainer +- Box : Issue for 0,...,k-1 indexing to classifiers +- Box : Probability output of the SVM classifier +- Box : Coefficient parsing check in Spatial Filter box +- Dev : Addressed Ogre/CEGUI Find problems on Fedora 21 +- Dev : Issue with heavy OpenMP/Eigen CPU loads + +## [1.1.0] - 2015-10-02 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=9555)) + +### Added + +- Drivers : eemagine EEGO +- Drivers : Brain Rhythm 8, Simulator, SmartBCI and Wearable Sensing Dry Sensor Interface. +- Box : Implemented MLP (MultiLayer Perceptron) classification algorithm. +- Box : Regularized version of the CSP filter trainer. +- Box : New plugin category for evaluation. +- Box : 3 new boxes to evaluation plugin : kappa coefficient, ROCCurve, General Statistics Generator. +- Scenarios : Example of stimulation passing to Python. +- Dev : Enabled the support of SSE2. +- Dev : Enabled multicore and vectorization in Eigen. +- Tests : Tests for Regularized CSP. +- Tests : Tests for ROC Curve, kappa coefficient and statistic generator. +- Tests : Tests for MLP. +- Tests : Tests for import/export matrix in toolkit. +- Tests : Test configuration file for OpenViBE. + +### Changed + +- App : Disabled the CoAdapt P300 speller which was only working on 0.18. The contributing authors are currently developing an even more robust P300 speller that is also easy to use. Stay tuned. +- Dev : Added ASCII import and export functions for IMatrix matrices +- Designer : Made fails explicit in scheduler. +- Designer : Added more type checking to scenario loader. +- Designer : Restore log level even in no-gui and invisible mode. +- Drivers : Extended Emotiv EPOC support to gnu/linux. +- Drivers : Added Software tagging to the universal TMSI driver. +- Drivers : Moved the check impedance option to be part of driver preferences. +- Drivers : Various updates to BrainProducts VAmp, BrainProducts Brainamp. +- Box : The LDA now has a native multiclass mode. +- Box : The Spatial Filter box now accepts a configuration file which contains a matrix (refer to the doc for the format specification). +- Box : The xDawn and the CSP trainer can generate matrix file for the spatial filter. +- Box : Various optimizations of the Spatial Filter. +- Box : Changed Signal Display refresh paradigm to make it handle bigger datasets. +- Box : TCP writer box sends Streamed Matrix and Signal in row-major order. +- Box : Moved Accurancy Measurement and Confusion Matrix to the evaluation plugin. + +### Fixed + +- Box : Multiple issues in Signal Display. +- Box : LDA algorithm (wrong shrinkage computation). +- Box : Several fixes and guards added into the classification plugin. +- Box : Properly handle wrong settings value in Temporal Filter and Modifiable Temporal Filter. +- Box : EDF implementation. +- Box : Removed incorrect stream restrictions in Stream Switch. +- Box : TCP writer end of line sequence. +- Server : Shortcuts. +- Server : Now avoids crashes if loading the driver ui failed. +- Server : Various minor fixes. +- Dev : All windows launch scripts to handle spaces better. + +## [1.0.1] - 2015-05-05 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=9435)) + +### Added + +- Tests : Tests for GDF Writer + +### Changed + +- App : Edit the tips of the message interface in the skeleton generator. +- Dev : Enabled NSIS installer logging +- Designer : Designer will now point to the version-specific web documentation + +### Fixed + +- App : Added verbosity to VR Demo & fixed an unimportant memory leak +- App : Bug with the stimulation stream in the skeleton generator. +- Dev : Build without Ogre +- Doc : Version number in the generated doc. Its now automatically generated. +- Drivers : Added include guards to LSL driver +- Drivers : Generic Oscillator channel naming when > 4chns +- Drivers : Inserted author information where it was missing +- Box : The type stimulation is available in the python box. +- Box : Indexing in sign change detector +- Box : GDF Reader no longer appends extra chunk +- Box : Improved error handling for missing classifiers +- Scenarios : Added instructions to the P300 scenarios +- Scenarios : Convert app to work with spaces in exe paths +- Scenarios : Lua stimulator tutorial (Mantis #172) +- Scenarios : Wrong LDA id. + +## [1.0.0] - 2015-03-20 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=9435)) + +### Added + +- LabStreamingLayer support : Acquisition Server will now be able to import and export data from LSL. A compatible LSL Export box has been introduced. +- Server : Acquisition Server autoplay via config token +- Designer : Config tokens can be speficied to Designer & AS on the command line, using --define +- Designer : Box configurations can now change the number and type of entries based on user selections +- Designer : Popup on initilization error to Designer +- Designer : drag and drop scenario file in designer (MANTIS issue #48) +- Box : Wavelet decompositions are supported +- Box : EOG Artifact removal boxes added +- Box : Magnitude Squared Coherence is now available in the Connectivity box +- Box : OpenViBE can now send commands to any OSC enabled target +- Drivers : MCS NVX, mBrainTrain Smarting +- Drivers : Calibration signal support to Gipsa's gUSBAmp driver +- Drivers : Telnet reader now supports arbitrary integer sampling rates +- Drivers : More error checking to gUSBAmp gipsa driver +- Dev : ADD launch option --memcheck for launch executable using valkyrie ( front-end for valgrind) +- App : Memory deallocation to vrpn examples +- Scenarios : Classification testing tutorial +- Scenarios : FastICA box tutorial +- Scenarios : Wavelet & EOG Denoising tutorial +- Scenarios : External Stimulation Connection example will now send 1 stim / sec +- Scenarios : Enabled Clock, Log and Nothing example boxes. +- Tests : Tests for generic stream reader/writer +- Tests : Tests for Classifier +- Tests : Tests for CSV file IO +- Tests : Tests for EBML write and read +- Tests : Script to find out boxes that are not in any scenario (in test/) + +### Changed + +- Drivers : Some drivers are now able to return the measurement units (e.g. microvolts). If you connect Measurement Unit stream from Acquisition Client to Signal Display, you can enable the unit display (in Toolbar). +- Drivers : Moved the BrainProducts ActiCHamp driver from contrib/ to core +- Drivers : Moved TMSiSDK.dll to be an external dependency +- Drivers : fixed Refa32B include guards +- Drivers : Moved the remaining driver .dlls to be external dependencies +- Designer : Signal Display has been improved to handle better large amounts of channels and to give user more control over data scaling +- Designer : Scenario .xmls contents no longer permute wildly across 'save scenario' +- Designer : allow easier pick for line and easier connection between boxes. +- Designer : Enable shortcuts after drag and drop a box. +- Designer : Designer will now return an error if it cannot open a scenario file for writing +- App : Skeleton Generator no longer depends on sed +- App : Modified plugin inspector to provide a list of all registered boxes +- Box : Channel Selector now supports Streamed Matrix type +- Box : Various improvements to CSV Writer : Added support for Streamed Matrix & Feature Vector, removed unused Compression setting, introduced setting to change the output precision +- Box : Unified all LDA type classifiers to one +- Box : Refactored Signal Concatenation not to ruin stimuli chunk structure +- Box : Changed some boxes to print channel numbers using 1,2,... indexing. No list was compiled. +- Box : Added some checks for invalid xml file to Classifier Processor. +- Box : Transposed the TCP Writer output +- Box : CSV file reader/writer : renamed default out/input (mantis issue 76) +- Box : Allow the automatic renaming of channel selector box based on channel list, mantis 64 +- Box : External stimulations should now be passable to multiple clients +- Box : Moved the BioSemi ActiveTwo driver from contrib/ to core +- Box : Moved the TMSi driver from contrib/ to core +- Box : Code cleanup, removed some lingering unnecessary references to IReader.h. +- Box : Moved some plugins from Samples/ category to more reasonable places. No list was compiled. +- Box : Removed a few more obsolete boxes +- Box : Changed output channel names of some boxes to be be more distinct / Boxes affected : FastICA, Noise Generator, Sinus Oscillator, Spatial Filter +- Box : Refactored CSV writer to use the time arithmetics class for conversions +- Box : Separated the Tests and Examples category into two +- Box : Removed some references to unnecessary headers. +- Box : Factorize parameter management. +- Box : Avoid compilation of itpp code if itpp package is there but not at the right place. +- Box : Clean + remove old bliff classifier. +- Box : Remove itpp from dependencies of classification. +- Box : Moved Clock Stimulator box to the Stimulation category +- Box : Renamed obsolete references to SignalProcessingGpl namespace +- Doc : Fixed generating the ERP Plot doc +- Dev : All graphical assets (images & 3D models) in OpenViBE should now have acceptable licenses +- Dev : Added low-order numeric stimuli (0-32, suitable for 1 byte communications using parallel port). +- Dev : EBML streams now follow the EBML specification with a proper header and DTD +- Dev : Changed MicroMed dll search to look for VS2010 based lib +- Dev : Allowed compilation without GTK. +- Dev : All boxes now use the encoder/decoder approach +- Dev : Lots of unused code removed; Automaton, Callbacks, various boxes +- Dev : Renamed samples/ plugin path to data-generation/ +- Dev : Linux multicore build now adapts to the number of cores +- Dev : Changed Windows build to use multiple cores +- Dev : Differentiated between vs100 and vs90 lua +- Dev : dropped Presage dependency on VS2008. +- Dev : Improved LUA detection on Fedora20 +- Dev : Minor tweak to ITPP detection script +- Dev : Updated VRPN dependency to 7.31 +- Dev : Made Ogre 3D optional (3D plugins not usable) +- Dev : Made GTK optional (i.e. builds what is possible the build without GTK) +- Dev : Fix ogre package install on ubuntu 14.10. +- Dev : Removed dependency on VS2005 and VS2008 redists +- Dev : Removed SettingCollectionHelper. +- Dev : Reduced C11 dependencies +- Dev : Renamed system/ modules to avoid conflicts with system files e.g. Time.h -> ovCTime.h etc. +- Dev : Removed unused modules Automation and Stream +- Dev : After move to codecs, removed code of deprecated callbacks + +### Fixed + +- Drivers : Impedance check jamming the gUSBAmp +- Drivers : BrainVision Recorder driver / Fixed crash with multiple markers in a single message, Fixed memory leaks +- Drivers : BioSemi ActiveTwo driver +- Drivers : Minor fix to MBT Smarting driver +- Drivers : Acquisition Server crash with gtec gipsa driver +- Drivers : MCS NVX driver patch for situations with invalid signal values +- Drivers : handling of non-numeric markers in BrainVision Recorder driver. Additionally, fixed some of the repeating memory reallocations in the driver. +- Drivers : fixed stop crash in external stimulations occurring with Refa32B +- Server : Issue with too many stimuli sent in case of NaNs in the data + - Fixed time placement of Correct/Incorrect stimuli in cases of NaNs +- Designer : Issue with restoring nonsaved state +- Designer : Tab reordering issue. +- Designer : Restore the previous state of the log expander. +- Designer : Prevent any plugin windows to be displayed if no gui is active. +- Designer : Prevent from display the popup of warning in intialization mechanism if no-gui is active. +- Designer : fix for drag&drop scenario file on windows +- Designer : fix memory leak when getting Enumeration setting value (MANTIS issue #158) +- Designer : fix display of boxes with name containing & +- Box : Time Based Epoching no longer crashes if samplingrate is 0 +- Box : Crash in Temporal Filter box with too small chunk sizes +- Box : Canvas space usage in Signal Display with Chn Selector +- Box : Signal Display now only draws the channels that are visible +- Box : Signal Display now detects if the signal sampling rate does not match chunk size/time properties +- Box : CSV file-io boxes +- Box : Fractional band limits in Spectral Analysis +- Box : FFT/IFFT boxes to work with odd chunk sizes +- Box : CSV Reader and Writer boxes will now handle Feature Vectors ok +- Box : Crashes in Stream Switch +- Box : Bug in classification (pairwise strategy selection for OneVsOne, SVM output, Voting) +- Box : More boxes now properly restrict streams to the types they can support +- Box : Various bugfixes + - Fixed old filename used in signal concatenation example + - Added FFT decomposition tutorial scenario + - Fixed unset sampling rate in Windowing Functions box + - Code cleanup of IFFT box + - Fixed keyboard stimulator from repeating the stimuli + - Added Error checking to Spectral Analysis + code cleanup + - Added input type restrictions to TCP Writer box +- Box : Crash in signal concatenation +- Box : Removed CoSpectra box which did not seem to do anything +- Box : Added check for zero sampling rate to Time Based Epoching box +- Box : Signal Merger box not outputting the sampling rate +- Box : SignalDisplay : Remove redraw of all channel when stimulation is received. Was slowing down the box +- Box : Topographic map display (mantis 97) +- Box : TCPWriter export of undefined stimuli +- Dev : Misc tweaks & code cleanup +- App : Skeleton generator. +- App : issues with Skeleton Generator and spaces in paths +- App : handling of spaces in Windows command arguments +- Dev : kernel/Scheduler, Chunks accumulated at the inputs of muted boxes and were never cleared causing an increase in memory use over time +- Dev : mantis 120. The same change may have to be introduced in other boxes as well +- Dependency : GLFW3 dependency archive requiring Visual Studio debug dll + +## [0.18.0] - 2014-07-28 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=9323)) + +### Added + +- Drivers : BioSemi ActiveTwo +- Drivers : Cognionics +- Drivers : TMSi (universal driver) +- Drivers : NeuroElectrics Enobio3G +- Box : Multiclass classification support with three pairing strategies, native, 1-vs-all and 1-vs-1. + +### Changed + +- Designer : Lots of usability improvements to Designer, including rendering speed +- Designer : Improved signal display, all signals can now be drawn to the same drawing area as is usually done with EEG data +- Box : Advanced P300 'CoAdapt' speller with new keyboard, new flashing strategies, improved timing, optional word prediction, and more +- Box : Support to allow box parameters to be changed during play (for boxes that explicitly declare it) + +## [0.17.0] - 2013-12-19 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=9228)) + +### Added + +- Box : New box messaging capabilities. Boxes can be designed to send instant messages to one another. +- Box : Hilbert Transform +- Box : Connectivity Features with Single Trial Phase Locking Value algorithm +- Box : TCP Writer +- Box : Shrinkage LDA +- App : New SSVEP game Mind Shooter + +### Changed + +- Usability improvements : for example, automatic saving and loading of driver settings in the Acquisition Server + +### Fixed + +- Dev : Bug fixes made. Details in release announcement. + +## [0.16.0] - 2013-07-01 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=5049)) + +### Added + +- Drivers : NeuroSky Mindwave Mobile +- Box : AutoRegressive Coefficients +- Box : Timeout +- Box : Stimulus Voter +- Dev : New build system with full Microsoft Visual Studio IDE support +- Dev : New source code directory organization that is easier to grasp for new developers. +- Dev : Source distribution includes files to build a basic Debian/Ubuntu/Mint binary package + +### Changed + +- Drivers : Upgraded Gtec driver from gipsa.lab +- Dev : License has been changed to AGPLv3. + +### Fixed + +- Dev : Bug fixes made. Details in release announcement. + +## [0.15.0] - 2013-02-01 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=4887)) + +### Added + +- Drivers : BrainProducts ActiCHamp +- Drivers : BrainMaster Atlantis and Discovery +- Server : Send stimulations from your application to Acquisition Server +- Designer : Self-contained scenario configuration. The $__volatile_ScenarioDir token will always expand to the path of the folder of the current scenario. + +## [0.14.0] - 2012-06-18 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=1033)) + +### Added + +- Box : Python scripting +- Drivers : Fieldtrip server +- Drivers : Mitsar EEG device +- Server : Pssibility to use the USBamp’s event channel in the acquisition driver. + +### Changed + +- Box : The matlab box was re-written and now supports any number of inputs and outputs of any type. +- Dependency : Boost on Linux was updated to 1.49, there is an added dependency to pthreads on Windows. + +## [0.13.0] - 2012-01-30 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=695)) + +### Added + +- Designer : The designer now has a search feature which enables quick lookup of available boxes. +- Box : EDF File Writer. +- Box : BCI2000 File Reader. +- Box : A box for calculating differential and integral of any order was added. (The first and second difference detrending boxes are now deprecated) + +### Changed + +- Dependency : Updated Gtk on Windows (2.22.1) +- Dependency : Used IT++ version 4.0.7 across all platforms + +## [0.12.0] - 2011-10-12 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=578)) + +### Added + +- Designer : The time is now printed in every logs (console, file, etc.) in seconds. User can switch between this display and the previous (in 32:32 time and/or hexadecimal) at will using configuration tokens. The time precision can also be set. +- Drivers : The Emotiv EPOC driver is now included in the Windows Installer. It still requires the user to specify where to find the Emotiv Research Edition SDK in order to run correctly. +- Drivers : The g.Tec g.USBAmp driver benefits from a major update that add more amplifier functionalities : ability to connect to common ground and reference, activation of notch and band-pass filters. +- Box : Stream synchronization box, that can synchronize in OpenViBE several streams coming from several linked devices. +- Box : The Matlab Filter box is now compiled by default and included in the release. This box is still unstable, but has been fully reworked in order to work on every machine, as long as Matlab (version 32bits) is installed. + +### Fixed + +- Dev : Bug fixes made. Details in release announcement. + +## [0.11.0] - 2011-08-11 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=532)) + +### Added + +- Drivers : Driver based on OpenAL to acquire sound signal from microphone input. +- Support : OpenViBE is now officially supported on Fedora 15, Ubuntu 11.04 and Windows 7 64bit. +- Box : New Reference Channel and Channel Selector boxes. The older boxes are now deprecated. The channel selection is smarter (name or 1-based index, 'X:Y' for channel range). +- Box : New Signal Concatenation box. The older box is now deprecated. The concatenation is much faster, and end-of-file is detected automatically through a time-out. +- Box : New Stream Switch box that copies its input chunks on one of its outputs. The active output is selected with defined stimulations. +- Doc : Documentation for the Matlab Filter box. +- Doc : Documentation for the Display-Cue visualisation box. +- Scenarios : New set of scenarios for a Motor-Imagery based BCI using CSP spatial filters, and demonstrating how to measure classifier performances offline or online (confusion matrix, overall performance). + +### Changed + +- Drivers : The Emotiv EPOC driver now acquires values from gyroscope sensors (new option in the driver properties). +- Designer : The Player in the OpenViBE Designer can now be controlled with keyboard shortcuts (F5 : stop, F6 : one-step, F7 : play, F8 : fast-forward) +- Dev : Skeleton Generator benefited from a major update, and can produce box skeleton with Listeners, Codecs, Flags, etc. +- Box : CSV file writer can receive 1 or 2-dimensional matrices +- Box : Matrix display can receive 1 or 2-dimensional matrices +- Box : The Matlab filter box has now a Stimulation output, and the Matlab messages are redirected to the OpenViBE console (warnings, errors, disp, etc.) +- Box : Classifier Trainer outputs standard deviation along with classification percentage on the k-fold test. k-fold test now randomize the input data prior to testing by default. +- Box : CSP and xDAWN spatial filter trainers output a stimulation OVTK_StimulationId_TrainCompleted after a successful training. +- Box : Classifier Accuracy visualization box can now show score and/or percentages, or none of them. +- Doc : Acquisition Server documentation updated to latest GUI modification (division driver properties/server settings) +- Scenarios : SSVEP scenarios now make use of CSP spatial filters for better performances. + +### Fixed + +- Box : patch for the Matlab filter box, by fixing bugs and adding stimulation output. +- Box : patches for the skeleton-generator and the matlab box + +## [0.10.1] - 2011-04-13 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=462)) + +### Fixed + +- Windows installer : A small glitch during the creation of the installer made Brain Products First-Amp and V-Amp drivers unavailable. + +## [0.10.0] - 2011-04-12 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=460)) + +### Added + +- Server : We added new drivers for raw file reading and telnet raw reading to the acquisition server +- Server : You can now choose whether to activate, deactivate or force the drift correction in the acquisition server +- Designer : The designer can now read scenarios from standard input +- Designer : A collapsible console showing the output messages has been added to the designer +- Designer : An optional pop-up window is now displayed when there are errors during the execution of a scenario +- Designer : Multiple files can now be opened at once in the designer +- Designer : The designer now supports several new keyboard shortcuts + - F2 - rename all selected boxes + - Ctrl+A - select all boxes in the current scenario + - Ctrl+W - close the currently opened scenario +- Drivers : We added support for triggers in the TMSiRefa32B and MicromedSystemPlusEvolution drivers +- Box : Box for training spatial filters using CSP algorithm +- Box : Box which can display user selected images upon receiving stimulations +- Box : A new VRPN Client box is available so OpenViBE can receive messages from external applications +- Box : A new, unstable, CSV Reader box is available +- Box : Sound stimulation, based on OpenAL, is available. The old SoundStimulation box is now deprecated. +- Box : Moving average box can now use two new methods - Cumulative Average and Immediate Moving Average +- Dev : Added templates for easy encoder/decoder creation and manipulation +- Scenarios : We added scenarios for SSVEP BCIs along with an application for SSVEP stimulation + +### Changed + +- Drivers : Neurosky Mindset driver was updated to use SDK v2.1 +- Drivers : Neurosky Mindset driver now supports blink detection +- Box : Spatial filter can now work with signals, spectrums and streamed matrices +- Box : Lua stimulator now has access to the log manager + +### Fixed + +- Dev : Bug fixes made. Details in release announcement. + +## [0.9.0] - 2010-12-28 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=416)) + +### Added + +- Drivers : EGI Netamps driver +- Drivers : Multi amp support for Brain Products BrainAmp series +- Box : VRPN Button client box + +### Changed + +- Server : The acquisition server now remembers the last device you used +- Designer : The designer now remembers the last opened scenarios +- Designer : The designer can be launched from command line hiding the GUI, loading/runing a specific scenario etc.. +- App : Each box setting can now be configured with the configuration manager + +### Fixed + +- Drivers : Stabilized the Brain Products BrainVision Recorder driver (the driver is now stable) +- Box : Stabilized lua box with a more complete API (the box is now stable) + +## [0.8.0] - 2010-10-01 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=378)) + +### Added + +- Server : Multithreaded the acquisition server for better performance and synchronization +- Server : Significantly enhanced drift management in the acquisition server +- Drivers : Implemented impedance check on the TMSi Refa driver +- Drivers : Emotiv EPOC +- Drivers : Brainamp Series driver using Brain Products low level API +- Box : Box to join multiple signal streams in a single stream +- Box : Box to compute the power of a spectrum frequency band +- Box : Box to rename signal channels +- Box : SVM classifier (based on libsvm) +- Dev : Driver seketon generator for driver developers + +### Changed + +- Doc : Updated the online documentation and tutorials +- Doc : Updated many documentation pages +- Dependency : Updated windows dependencies to it++ 4.0.7, vrpn 7.26, boost 1.42, cmake 2.8.2, gtk 2.16.6 +- Dependency : Moved from libglade to gtk_builder allowing upgrading GTK +- Drivers : Updated the ModularEEG driver +- Drivers : Updated the Brain Products VAmp driver to support FirstAmp8 +- Box : Updated the temporal filter box to correct errors - should be very close to MATLAB now +- Box : Updated the Sound Player box to make it work on Windows +- App : Restored the handball VR application for interaction from the motor imagery BCI + +### Fixed + +- Dev : Bug fixes made. Details in release announcement. + +## [0.7.0] - 2010-07-08 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=336)) + +### Added + +- Drivers : Neurosky Mindset +- Box : Univariate Statistics box +- Box : Some control over the player execution from the boxes. Details in release announcement. +- Box : Box that is able to control the player execution +- Box : Lot of great features to the Simple DSP box - see documentation and sample scenarios +- Designer : Possibility to comment scenarios in the designer +- Designer : More configuration possibilities with the configuration file tokens +- Designer : Many small "user oriented" features in the designer such as left/right scroll with mouse wheel and better overview of renamed boxes + +### Changed + +- Doc : Updated the online documentation and tutorials +- Doc : Updated many documentation pages +- Server : The acquisition server is now smarter on CPU use +- Designer : Alphabetically sorted the stimulations for quicker configuration of the boxes +- Designer : Restored automatic filename extension/filtering when loading/saving a scenario +- Scenarios : Reviewed and commented all the box-tutorials and xDAWN p300 speller / motor imagery scenarios + +### Removed + +- Designer : Removed some dead code. No list was compiled. + +### Fixed + +- Dev : Bug fixes made. Details in release announcement. +- Box : Corrected a bug on the k-fold test in the classifier trainer + +## [0.6.1] - 2010-05-20 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=322)) + +### Fixed + +- Windows installer : Restores the TMSi driver (some files were missing) +- Windows installer : Restores the Micromed driver (some files were missing) +- Windows installer : Translates the Tie-Fighter demo in english +- Windows installer : Adds a scenario in share/openvibe-scenario/bci/tie-fighter : tie-fighter-freetime.xml, to use in combination with the vr-demo application. + +## [0.6.0] - 2010-04-14 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=306)) + +### Added + +- Drivers : g.Tec's gMobiLab+ acquisition device for Linux +- Drivers : Micromed SD LTM (through SystemPlus Evolution) +- Box : Confusion Matrix computation box +- Box : Matrix Display box +- Box : Lua stimulation box +- Server : Impedance check to the drivers that could support it +- Scenarios : New sample scenarios + +### Changed + +- Dependency : Moved to Ogre 1.7 for 3D display +- Dependency : Moved to Boost 1.41 +- Doc : Updated the online documentation and tutorials +- Doc : Updated many documentation pages +- Server : Refactored the acquisition server so the server itself runs in a separate thread for better performances +- Server : Corrected bugs on the acquisition server that caused desynchronisations +- App : Reenabled VR demos as default +- App : Enhanced the visuals of the VR demos and added a few stats to make the experience more entertaining + +### Removed + +- Dependency : We removed OpenMASK / OBT dependency + +### Fixed + +- Dev : Bug fixes made. Details in release announcement. + +## [0.5.0] - 2009-12-18 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=235)) + +### Added + +- Drivers : brain products vAmp acquisition device +- Drivers : g.Tec's gUSBamp acquisition device +- App : Online comparison of different processing pipelines performance (e.g. multiple classifiers) +- Scenarios : P300-based pipeline based on the xDAWN algorithm +- Scenarios : New sample scenarios + +### Changed + +- Dependency : Updated the dependencies installation for windows so that Visual C++ Runtime gets included in the package +- Dependency : Updated the dependencies installation for windows so that the lack of internet connection does not abort the installation when DirectX is not present +- Doc : Updated the online documentation and tutorials + +### Fixed + +- Dev : Bug fixes made. Details in release announcement. + +## [0.4.0] - 2009-10-23 ([release announcement](http://openvibe.inria.fr/forum/viewtopic.php?f=1&t=148)) + +### Added + +- Drivers : OpenEEG Modular EEG / Monolith EEG +- Drivers : g.Tec's gUSBamp acquisition device +- Box : frequency band selector +- Box : signal decimation +- Box : CSV file writer (text based) +- Box : K-fold test in the classifier trainer box +- Box : P300-based entertaining application called "Magic Card" +- Dev : Several tooltips for new users +- Server : Functionnality to load/save channel names in the acquisition server +- Scenarios : New sample scenarios + +### Changed + +- Dependency : Updated the dependencies installation script for linux so that it uses native packages instead of compiling everything from scratch +- Dependency : Updated the dependencies installation for windows so that DirectX and Visual C++ Runtime gets installed automatically if needed +- Doc : Updated the online documentation and tutorials +- Box : Enabled the voting classifier box to vote either on streamed matrix or on stimulations +- Box : Changed the way chanels can be selected in the signal display, power spectrum display and time frequency map display +- Box : Reimplemented the common average reference box +- Scenarios : Stabilized P300-based pipeline +- Dev : Made the development of new classifiers easier thanks to base algorithms + +### Removed + +- App : The VR demo are no more built by default as OpenMASK is not compiling on recent Linux distributions + +### Fixed + +- Dev : Bug fixes made. Details in release announcement. diff --git a/Masterarbeit/openvibe/meta-master/CISetup.md b/Masterarbeit/openvibe/meta-master/CISetup.md new file mode 100755 index 0000000..5135ae0 --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/CISetup.md @@ -0,0 +1,27 @@ +# Jenkins plugins + +Most of them are in the base install. +* Git +* Git Parameter Plug-In +* Pipelines +* Node and Label parameter +* Xvfb +* XUnit +* embeddable-build-status (Optional - for build status icon) +* Groovy Postbuild (Optional - to show build status in history) +* Windows Slaves Plugins + +# Jenkins jobs +* OpenViBE-Generic Base job : Uses JenkinsFile in meta repo + config is in jenkins-config.xml file. +* OpenViBE-Nightly-* Identical to Generic, but with a nightly job + diverse default systems. + +# Backup/Restore Jenkins job config +See https://www.sghill.net/how-do-i-backup-jenkins-jobs.html or use Jenkins-cli (did not manage to use it on inria platform) + +# Windows machines +Microsoft website doesn't list the old versions of VS +You can get vs 2013 at this link : http://download.microsoft.com/download/7/2/E/72E0F986-D247-4289-B9DC-C4FB07374894/wdexpress_full.exe +Python 3.4+ should be installed + numpy + +# Linux machines +Package xvfb is required \ No newline at end of file diff --git a/Masterarbeit/openvibe/meta-master/COPYING b/Masterarbeit/openvibe/meta-master/COPYING new file mode 100644 index 0000000..dba13ed --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/COPYING @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/Masterarbeit/openvibe/meta-master/Jenkinsfile b/Masterarbeit/openvibe/meta-master/Jenkinsfile new file mode 100644 index 0000000..470d930 --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/Jenkinsfile @@ -0,0 +1,189 @@ +node("${NodeName}") { + def PlatformTarget = params.containsKey("PlatformTarget") ? params.PlatformTarget : "x64" + def MetaBranch = params.containsKey("MetaBranch") ? params.MetaBranch : "master" + + // Add some informations about the build + manager.addShortText("${params.BuildType}", "red", "white", "0px", "white") + manager.addShortText("${NodeName}", "blue", "white", "0px", "white") + manager.addShortText("${PlatformTarget}", "green", "white", "0px", "white") + + OpenViBEVersion = "x.x.x" + + def BuildOptions = [ + "Release" : "--release", + "Debug" : "--debug" + ] + def BuildOption = BuildOptions[BuildType] + + + url_sdk = "https://gitlab.inria.fr/openvibe/sdk.git" + url_designer = "https://gitlab.inria.fr/openvibe/designer.git" + + if(isUnix()) { + build_dir = "${WORKSPACE}/build" + dist_dir = "${WORKSPACE}/dist" + dependencies_dir = "/builds/dependencies" + dependencies_base = "/builds/dependencies" + } else { + build_dir = "${WORKSPACE}\\build" + dist_dir = "${WORKSPACE}\\dist" + if( "${PlatformTarget}" == "x64") { + dependencies_dir = "c:\\builds\\dependencies_x64" + } else { + dependencies_dir = "c:\\builds\\dependencies" + } + dependencies_base = "c:\\builds\\dependencies" + } + + user_data_subdir = "openvibe-${OpenViBEVersion}" + + git url: 'https://gitlab.inria.fr/openvibe/meta.git', branch: "${MetaBranch}" + shortCommitMeta = get_short_commit() + manager.addShortText("Meta : ${MetaBranch} (${shortCommitMeta})", "black", "white", "0px", "white") + + dir("build") { + deleteDir() + } + dir("dist") { + deleteDir() + } + + // In order to update the dependencies, we need to pull all repositories first + stage('Checkout') { + dir("sdk") { + git url: "${url_sdk}", branch: "${params.SDKBranch}" + shortCommitSDK = get_short_commit() + manager.addShortText("SDK : ${params.SDKBranch} (${shortCommitSDK})", "black", "white", "0px", "white") + } + + dir("designer") { + git url: "${url_designer}", branch: "${params.DesignerBranch}" + shortCommitDesigner = get_short_commit() + manager.addShortText("Designer : ${params.DesignerBranch} (${shortCommitDesigner})", "black", "white", "0px", "white") + } + + dir("extras") { + git url: 'https://gitlab.inria.fr/openvibe/extras.git', branch: "${params.ExtrasBranch}" + shortCommitExtras = get_short_commit() + manager.addShortText("Extras : ${params.ExtrasBranch} (${shortCommitExtras})", "black", "white", "0px", "white") + if(isUnix()) { + sh "git submodule update --init --recursive" + } else { + bat "git submodule update --init --recursive" + } + } + } + + stage('Update dependencies') { + if(isUnix()) { + manager.addShortText("Not updating dependencies on Linux", "black", "white", "0px", "white") + } else { + bat "install_dependencies.cmd --dependencies-dir ${dependencies_base} --platform-target ${PlatformTarget}" + } + } + + stage('Build SDK') { + dir("sdk") { + dir ("scripts") { + if(isUnix()) { + sh "./unix-build --build-type ${params.BuildType} --build-dir ${build_dir}/sdk-${params.BuildType} --install-dir ${dist_dir}/sdk-${params.BuildType} --dependencies-dir ${dependencies_dir} --userdata-subdir ${user_data_subdir} --build-unit --build-validation --test-data-dir ${dependencies_dir}/test-input" + } else { + bat "windows-build.cmd --no-pause ${BuildOption} --build-dir ${build_dir}\\sdk-${params.BuildType} --install-dir ${dist_dir}\\sdk-${params.BuildType}-${PlatformTarget} --dependencies-dir ${dependencies_dir} --userdata-subdir ${user_data_subdir} --platform-target ${PlatformTarget} --build-unit --build-validation --test-data-dir ${dependencies_dir}\\test-input" + } + } + } + } + stage('Tests SDK') { + dir ("build/sdk-${params.BuildType}") { + dir("unit-test/Testing") { + deleteDir() + } + dir("validation-test/Testing") { + deleteDir() + } + if(isUnix()) { + sh './ctest-launcher.sh -T Test ; exit 0' + } else { + withEnv(["PATH+OV=${dist_dir}\\sdk-${params.BuildType}-${PlatformTarget}\\bin"]) { + bat 'ctest-launcher.cmd -T Test -E uoTimeTest ; exit 0' + } + } + step([$class: 'XUnitBuilder', + thresholds: [[$class: 'FailedThreshold', unstableThreshold: '0']], + tools: [[$class: 'CTestType', pattern: "unit-test/Testing/*/Test.xml"], + [$class: 'CTestType', pattern: "validation-test/Testing/*/Test.xml"],] + ]) + } + } + + stage('Build Designer') { + dir("designer") { + dir ("scripts") { + if(isUnix()) { + sh "./unix-build --build-type=${params.BuildType} --build-dir=${build_dir}/designer-${params.BuildType} --install-dir=${dist_dir}/designer-${params.BuildType} --sdk=${dist_dir}/sdk-${params.BuildType}" + } else { + bat "windows-build.cmd --no-pause ${BuildOption} --build-dir ${build_dir}\\designer-${params.BuildType} --install-dir ${dist_dir}\\designer-${params.BuildType}-${PlatformTarget} --sdk ${dist_dir}\\sdk-${params.BuildType}-${PlatformTarget} --dependencies-dir ${dependencies_dir} --userdata-subdir ${user_data_subdir} --platform-target ${PlatformTarget}" + } + } + } + } + stage('Build Extras') { + dir("extras") { + dir ("scripts") { + if(isUnix()) { + sh "./linux-build ${BuildOption} --build-dir ${build_dir}/extras-${params.BuildType} --install-dir ${dist_dir}/extras-${params.BuildType} --sdk ${dist_dir}/sdk-${params.BuildType} --designer ${dist_dir}/designer-${params.BuildType} --dependencies-dir ${dependencies_dir} --userdata-subdir ${user_data_subdir}" + } else { + bat "windows-build.cmd --no-pause ${BuildOption} --build-dir ${build_dir}\\extras-${params.BuildType} --install-dir ${dist_dir}\\extras-${params.BuildType}-${PlatformTarget} --sdk ${dist_dir}\\sdk-${params.BuildType}-${PlatformTarget} --designer ${dist_dir}\\designer-${params.BuildType}-${PlatformTarget} --dependencies-dir ${dependencies_dir} --userdata-subdir ${user_data_subdir} --platform-target ${PlatformTarget}" + } + } + } + } + stage('Tests Extras') { + dir ("build/extras-${params.BuildType}") { + dir("Testing") { + deleteDir() + } + if(isUnix()) { + wrap([$class: 'Xvfb']) { + sh "ctest -T Test ; exit 0" + } + } else { + withEnv(["PATH+CTEST=${dependencies_dir}\\cmake\\bin", + "PATH+OV=${dist_dir}\\extras-${params.BuildType}-${PlatformTarget}"]) { + bat "ctest -T Test ; exit 0" + } + } + step([$class: 'XUnitBuilder', + thresholds: [[$class: 'FailedThreshold', unstableThreshold: '0']], + tools: [[$class: 'CTestType', pattern: "Testing/*/Test.xml"],]]) + } + } + + stage('Create Archive') { + if(isUnix()) { + dir("package") { + deleteDir() + sh "tar --owner 0 --group 0 --transform s,^\\.,openvibe-${OpenViBEVersion}-src, --exclude \".git*\" --exclude build --exclude dependencies --exclude dist --exclude scripts/*.exe --exclude package --exclude \"*@tmp\" -cJvf openvibe-${OpenViBEVersion}-src.tar.xz ${WORKSPACE}" + sh "md5sum openvibe-${OpenViBEVersion}-src.tar.xz >openvibe-${OpenViBEVersion}-src.md5" + } + } else { + dir("package") { + deleteDir() + withEnv(["PATH+NSIS=${dependencies_dir}\\nsis_log_zip_access"]) { + bat "makensis /DDEPENDENCIES_DIR=${dependencies_dir} /DOUTFILE=${WORKSPACE}\\package\\openvibe-${OpenViBEVersion}-${PlatformTarget}-setup.exe ${WORKSPACE}\\extras\\scripts\\windows-openvibe-x.x.x-setup-${PlatformTarget}.nsi" + } + withEnv(["PATH+CMAKE=${dependencies_dir}\\cmake\\bin"]) { + bat "@cmake -E md5sum openvibe-${OpenViBEVersion}-${PlatformTarget}-setup.exe >openvibe-${OpenViBEVersion}-${PlatformTarget}-setup.md5" + } + } + } + } +} + +def get_short_commit() { + if(isUnix()) { + sh(returnStdout: true, script: "git log -n 1 --pretty=format:'%h'").trim() + } else { + bat(returnStdout: true, script: "@git log -n 1 --pretty=format:\'%%h\'").trim() + } +} diff --git a/Masterarbeit/openvibe/meta-master/README.md b/Masterarbeit/openvibe/meta-master/README.md new file mode 100755 index 0000000..a611882 --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/README.md @@ -0,0 +1,79 @@ +# |OpenViBE meta repository| |README| +[![Website](https://img.shields.io/badge/Web-Website-informational)](http://openvibe.inria.fr/) +[![Doxygen Documentation](https://img.shields.io/badge/Doc-Doxygen%20Documentation-informational)](http://openvibe.inria.fr/documentation/latest/) +[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) + +|Build Status :| | +|:-------------|:-:| +|Ubuntu 18.04 x64|[![Build Status](https://ci.inria.fr/openvibe/buildStatus/icon?job=OV-Nightly-Ubuntu18.04&style=plastic)](https://ci.inria.fr/openvibe/job/OV-Nightly-Ubuntu18.04/)| +|Fedora 31 x64|[![Build Status](https://ci.inria.fr/openvibe/buildStatus/icon?job=OV-Nightly-Fedora31&style=plastic)](https://ci.inria.fr/openvibe/job/OV-Nightly-Fedora31/)| +|Windows 10 x64|[![Build Status](https://ci.inria.fr/openvibe/buildStatus/icon?job=OV-Nightly-Win10-x64&style=plastic)](https://https://ci.inria.fr/openvibe/job/OV-Nightly-Win10-x64/)| +|Windows 10 x86|[![Build Status](https://ci.inria.fr/openvibe/buildStatus/icon?job=OV-Nightly-Win10-x86&style=plastic)](https://ci.inria.fr/openvibe/job/OV-Nightly-Win10-x86/)| + +OpenViBE project is now divided into 3 parts : + +- SDK, that contains the certifiable core and plugins of OpenViBE +- Designer, the graphical interface for OpenViBE +- Extras, for community plugins and contributions + +The current repository, OpenViBE-meta, exist to ease the task of building these repositories together. + +To build OpenViBE, follow these instructions : + +- Pull this repository +- Pull its submodules +- Install the dependencies using install_dependencies.cmd or .sh script, depending on your platform +- Build the project using build.cmd or build.sh script + - OPTIONNAL : if you need a solution that can be opened in visual studio, add --vsbuild-all flag. Generated solution will be outputted in build folder + +## Pulling this repository + +This can be done using `git pull git@gitlab.inria.fr:openvibe/meta.git` from command line, or with any GUI for git, like GitKraken. + +## Pulling the submodules + +Please note that you will require a recent version of git for this step; we advise to use versions above 2.0, but git 1.7 should work. +Use `git submodule update --init --recursive` to fetch all submodules. + +## Installing the dependencies + +Call install_dependencies.cmd or install_dependencies.sh, depending on your system. +A "dependencies" folder will be created on main directory. + +If you wish to use visual studio, it will be more handy to install python and jinja2 library with : +`c:\python3X\Scripts\pip.exe install jinja2` + +If you want to use the pygame examples, you will need python and pygame library. Pygame can be installed with +`pip install jinja2` + +## Building the project + +To build the whole project, execute `build.cmd` (windows) or `build.sh` (linux). +You will require at least version 2013 of Visual Studio, or GCC 4.8 + +## Bu#ilding the project for Visual Studio + +To build the project for visual studio with both debug and release, use `build.cmd --vsbuild-all`. +After building the project, the script will attempt to generate a merged solution of the 3 projects. +This requires python3 and jinja2. +If you use stock python3, you can install jinja2 like so : +`c:\python3X\Scripts\pip.exe install jinja2` +The merged sln will be generated in the build directory. + +If you do not wish to install python, you can also use the `launchvc.cmd` or `launchvc_debug.cmd` scripts (Legacy) + +## Updating the repository + +### WARNING : I HAVE NO IDEA HOW IT BEHAVE IF YOU HAVE PERSONNAL COMMIT/UNCOMMITED FILES + +You can update the whole directory (including submodules) with : + +```bash +git pull +git submodule sync --recursive +git submodule update -–init --recursive +``` + +Aliases can be created to ease the global update process : +`git config --global alias.spull '!git pull && git submodule sync --recursive && git submodule update --init --recursive'` +### END WARNING diff --git a/Masterarbeit/openvibe/meta-master/build.cmd b/Masterarbeit/openvibe/meta-master/build.cmd new file mode 100755 index 0000000..8b2793a --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/build.cmd @@ -0,0 +1,159 @@ +@echo off +setlocal EnableDelayedExpansion +setlocal enableextensions + +set BuildType=Release +set BuildOption=--release +set base_dir=%~dp0 +set build_dir_base=%base_dir%\build +set install_dir_base=%base_dir%\dist +set dependencies_dir=%base_dir%\dependencies +set UserDataSubdir=openvibe-3.1.0 +set PlatformTarget=x64 + +:parameter_parse +if /i "%1"=="-h" ( + echo Usage: build.cmd [Build Type] [Init-env Script] + echo -- Build Type option can be : --release (-r^), --debug (-d^). Default is Release. + pause + exit 0 +) else if /i "%1"=="--help" ( + echo Usage: build.cmd [Build Type] [Init-env Script] + echo -- Build Type option can be : --release (-r^), --debug (-d^). Default is Release. + pause + exit 0 +) else if /i "%1"=="-d" ( + set BuildType=Debug + set BuildOption=--debug + SHIFT + Goto parameter_parse +) else if /i "%1"=="--debug" ( + set BuildType=Debug + set BuildOption=--debug + SHIFT + Goto parameter_parse +) else if /i "%1"=="-r" ( + set BuildType=Release + set BuildOption=--release + SHIFT + Goto parameter_parse +) else if /i "%1"=="--release" ( + set BuildType=Release + set BuildOption=--release + SHIFT + Goto parameter_parse +) else if /i "%1"=="--build-dir" ( + set build_dir_base=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--install-dir" ( + set install_dir_base=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--dependencies-dir" ( + set dependencies_dir=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--vsproject" ( + set vsbuild=--vsproject + SHIFT + Goto parameter_parse +) else if /i "%1"=="--vsbuild" ( + set vsbuild=--vsbuild + SHIFT + Goto parameter_parse +) else if /i "%1"=="--vsbuild-all" ( + set multibuild_all=TRUE + SHIFT + Goto parameter_parse +) else if /i "%1" == "--userdata-subdir" ( + set UserDataSubdir=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1" == "--platform-target" ( + set PlatformTarget=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1" neq "" ( + echo Unknown parameter "%1" + exit /b 1 +) + +if /i "%PlatformTarget%" neq "x86" ( + SET dependencies_dir=%dependencies_dir%_%PlatformTarget% +) + +if not defined multibuild_all ( + REM the default build + + echo Building sdk + cd %base_dir%\sdk\scripts + call windows-build.cmd --no-pause %vsbuild% %BuildOption% --build-dir %build_dir_base%\sdk-%BuildType%-%PlatformTarget% --install-dir %install_dir_base%\sdk-%BuildType%-%PlatformTarget% --dependencies-dir %dependencies_dir% --userdata-subdir %UserDataSubdir% --build-unit --build-validation --test-data-dir %dependencies_dir%\test-input --platform-target %PlatformTarget% + call :check_errors !errorlevel! "!BuildType! SDK" || exit /b !_errlevel! + + echo Building designer + cd %base_dir%\designer\scripts + call windows-build.cmd --no-pause %vsbuild% %BuildOption% --build-dir %build_dir_base%\designer-%BuildType%-%PlatformTarget% --install-dir %install_dir_base%\designer-%BuildType%-%PlatformTarget% --sdk %install_dir_base%\sdk-%BuildType%-%PlatformTarget% --dependencies-dir %dependencies_dir% --userdata-subdir %UserDataSubdir% --platform-target %PlatformTarget% + call :check_errors !errorlevel! "!BuildType! Designer" || exit /b !_errlevel! + + echo Building extras + cd %base_dir%\extras\scripts + call windows-build.cmd --no-pause %vsbuild% %BuildOption% --build-dir %build_dir_base%\extras-%BuildType%-%PlatformTarget% --install-dir %install_dir_base%\extras-%BuildType%-%PlatformTarget% --sdk %install_dir_base%\sdk-%BuildType%-%PlatformTarget% --designer %install_dir_base%\designer-%BuildType%-%PlatformTarget% --dependencies-dir %dependencies_dir% --userdata-subdir %UserDataSubdir% --platform-target %PlatformTarget% + call :check_errors !errorlevel! "!BuildType! Extras" || exit /b !_errlevel! + +) else ( + REM a build that creates a visual studio solution + + echo Building sdk + cd %base_dir%\sdk\scripts + call windows-build.cmd --no-pause --vsbuild --debug --build-dir %build_dir_base%\sdk-%PlatformTarget% --install-dir %install_dir_base%\sdk-%PlatformTarget% --dependencies-dir %dependencies_dir% --userdata-subdir %UserDataSubdir% --build-unit --build-validation --test-data-dir %dependencies_dir%\test-input --platform-target %PlatformTarget% + call :check_errors !errorlevel! "Debug SDK" || exit /b !_errlevel! + + call windows-build.cmd --no-pause --vsbuild --release --build-dir %build_dir_base%\sdk-%PlatformTarget% --install-dir %install_dir_base%\sdk-%PlatformTarget% --dependencies-dir %dependencies_dir% --userdata-subdir %UserDataSubdir% --build-unit --build-validation --test-data-dir %dependencies_dir%\test-input --platform-target %PlatformTarget% + call :check_errors !errorlevel! "Release SDK" || exit /b !_errlevel! + + echo Building designer + cd %base_dir%\designer\scripts + call windows-build.cmd --no-pause --vsbuild --debug --build-dir %build_dir_base%\designer-%PlatformTarget% --install-dir %install_dir_base%\designer-%PlatformTarget% --sdk %install_dir_base%\sdk-%PlatformTarget% --dependencies-dir %dependencies_dir% --userdata-subdir %UserDataSubdir% --platform-target %PlatformTarget% + call :check_errors !errorlevel! "Debug Designer" || exit /b !_errlevel! + + call windows-build.cmd --no-pause --vsbuild --release --build-dir %build_dir_base%\designer-%PlatformTarget% --install-dir %install_dir_base%\designer-%PlatformTarget% --sdk %install_dir_base%\sdk-%PlatformTarget% --dependencies-dir %dependencies_dir% --userdata-subdir %UserDataSubdir% --platform-target %PlatformTarget% + call :check_errors !errorlevel! "Release Designer" || exit /b !_errlevel! + + echo Building extras + cd %base_dir%\extras\scripts + call windows-build.cmd --no-pause --vsbuild --debug --build-dir %build_dir_base%\extras-%PlatformTarget% --install-dir %install_dir_base%\extras-%PlatformTarget% --sdk %install_dir_base%\sdk-%PlatformTarget% --designer %install_dir_base%\designer-%PlatformTarget% --dependencies-dir %dependencies_dir% --userdata-subdir %UserDataSubdir% --platform-target %PlatformTarget% + call :check_errors !errorlevel! "Debug Extras" || exit /b !_errlevel! + + call windows-build.cmd --no-pause --vsbuild --release --build-dir %build_dir_base%\extras-%PlatformTarget% --install-dir %install_dir_base%\extras-%PlatformTarget% --sdk %install_dir_base%\sdk-%PlatformTarget% --designer %install_dir_base%\designer-%PlatformTarget% --dependencies-dir %dependencies_dir% --userdata-subdir %UserDataSubdir% --platform-target %PlatformTarget% + call :check_errors !errorlevel! "Release Extras" || exit /b !_errlevel! + + echo Generating meta project + where /q python + if !errorlevel! neq 0 ( + echo Python not in path, trying C:\python34\python ... + set my_python=C:\python34\python + ) else ( + set my_python=python + ) + !my_python! %base_dir%\visual_gen\generateVS.py --platformtarget %PlatformTarget% --builddir %build_dir_base% --outsln %build_dir_base%\OpenViBE-Meta-%PlatformTarget%.sln + if !errorlevel! neq 0 ( + echo Error constructing the meta .sln file + exit /b !errorlevel! + ) +) + + +:check_errors +SET _errlevel=%1 +SET _stageName=%2 +if !_errlevel! neq 0 ( + echo Error while building !_stageName! + exit /b !_errlevel! +) + diff --git a/Masterarbeit/openvibe/meta-master/build.sh b/Masterarbeit/openvibe/meta-master/build.sh new file mode 100755 index 0000000..3f3aa74 --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/build.sh @@ -0,0 +1,82 @@ +#!/bin/bash +BuildType=Release +BuildOption=--release +base_dir=$(dirname "$(readlink -f "$0")") +work_dir=`pwd` +build_dir_base="${work_dir}/build" +install_dir_base="${work_dir}/dist" +dependencies_dir="${work_dir}/dependencies" +user_data_subdir="openvibe-3.1.0" + +while [[ $# -gt 0 ]]; do + key="$1" + case $key in + -h | --help) + echo "-d | --debug : build as debug" + echo "-r | --release : build as release" + echo "--build-dir : directory for build files" + echo "--install-dir : binaries deployment directory" + exit + ;; + -d | --debug) + BuildType=Debug + BuildOption=--debug + ;; + -r | --release) + BuildType=Release + BuildOption=--release + ;; + --build-dir) + build_dir_base="$2" + shift + ;; + --install-dir) + install_dir_base="$2" + shift + ;; + --userdata-subdir) + user_data_subdir="$2" + shift + ;; + --dependencies-dir) + dependencies_dir="$2" + shift + ;; + *) + echo "ERROR: Unknown parameter $i" + exit 1 + ;; + esac + shift +done + +if [[ ! -z ${dependencies_dir} ]] +then + source ${base_dir}/sdk/scripts/unix-init-env.sh --dependencies-dir ${dependencies_dir} +else + echo "dependencies_dir not set: not initialisaing environment" +fi + +echo Building sdk +cd ${base_dir}/sdk/scripts +./unix-build --build-type ${BuildType} --build-dir ${build_dir_base}/sdk-${BuildType} --install-dir ${install_dir_base}/sdk-${BuildType} --dependencies-dir ${dependencies_dir} --userdata-subdir ${user_data_subdir} --build-unit --build-validation --test-data-dir ${dependencies_dir}/test-input +if [[ ! $? -eq 0 ]]; then + echo "Error while building sdk" + exit 1 +fi + +echo Building designer +cd ${base_dir}/designer/scripts +./unix-build --build-type=${BuildType} --build-dir=${build_dir_base}/designer-${BuildType} --install-dir=${install_dir_base}/designer-${BuildType} --sdk=${install_dir_base}/sdk-${BuildType} --userdata-subdir=${user_data_subdir} +if [[ ! $? -eq 0 ]]; then + echo "Error while building designer" + exit 1 +fi + +echo Building extras +cd ${base_dir}/extras/scripts +./linux-build ${BuildOption} --build-dir ${build_dir_base}/extras-${BuildType} --install-dir ${install_dir_base}/extras-${BuildType} --sdk ${install_dir_base}/sdk-${BuildType} --designer ${install_dir_base}/designer-${BuildType} --dependencies-dir ${dependencies_dir} --userdata-subdir ${user_data_subdir} +if [[ ! $? -eq 0 ]]; then + echo "Error while building extras" + exit 1 +fi diff --git a/Masterarbeit/openvibe/meta-master/install_dependencies.cmd b/Masterarbeit/openvibe/meta-master/install_dependencies.cmd new file mode 100644 index 0000000..04e08b6 --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/install_dependencies.cmd @@ -0,0 +1,94 @@ +@echo off +setlocal EnableDelayedExpansion +setlocal enableextensions + +REM The dependencies are hosted by Inria +set PROXYPASS=anon:anon +set URL=http://openvibe.inria.fr/dependencies/win32/3.1.0/ + +set base_dir=%~dp0 +set dependencies_prefix=%base_dir%\dependencies +set platform_target=x64 + +:parameter_parse +if /i "%1"=="-h" ( + echo Usage: install_dependencies.cmd [--dependencies-dir directoryprefix] + echo -- + pause + exit /B 0 +) else if /i "%1"=="--help" ( + echo Usage: install_dependencies.cmd [--dependencies-dir directoryprefix] + echo -- + pause + exit /B 0 +) else if /i "%1"=="--dependencies-dir" ( + set dependencies_prefix=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--platform-target" ( + set platform_target=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1" neq "" ( + echo Unknown parameter "%1" + exit /b 1 +) + +if /i "%platform_target%"=="x86" ( + set dep_dir=%dependencies_prefix% + set designer_manifest_file=.\windows-dependencies.txt +) else ( + set dep_dir=%dependencies_prefix%_%platform_target% + set designer_manifest_file=.\windows-dependencies-%platform_target%.txt +) + +echo Installing dependencies for build target %platform_target% +echo The target folder is %dep_dir% + +if not exist "%dep_dir%\arch\data" ( mkdir "%dep_dir%\arch\data" ) +if not exist "%dep_dir%\arch\build\windows" ( mkdir "%dep_dir%\arch\build\windows" ) + + +echo Installing sdk dependencies +cd %base_dir%\sdk\scripts +powershell.exe -NoProfile -ExecutionPolicy Bypass -file "%base_dir%\sdk\scripts\windows-get-dependencies.ps1" -manifest_file .\windows-build-tools.txt -dest_dir %dep_dir% +call :check_errors !errorlevel! "Build tools" || exit /b !_errlevel! + +powershell.exe -NoProfile -ExecutionPolicy Bypass -file "%base_dir%\sdk\scripts\windows-get-dependencies.ps1" -manifest_file .\windows-dependencies-%platform_target%.txt -dest_dir %dep_dir% +call :check_errors !errorlevel! "SDK" || exit /b !_errlevel! + +powershell.exe -NoProfile -ExecutionPolicy Bypass -file "%base_dir%\sdk\scripts\windows-get-dependencies.ps1" -manifest_file .\tests-data.txt -dest_dir %dep_dir% +call :check_errors !errorlevel! "SDK tests" || exit /b !_errlevel! + + +echo Installing Designer dependencies +cd %base_dir%\designer\scripts +powershell.exe -NoProfile -ExecutionPolicy Bypass -file "%base_dir%\sdk\scripts\windows-get-dependencies.ps1" -manifest_file %designer_manifest_file% -dest_dir %dep_dir% +call :check_errors !errorlevel! "Designer" || exit /b !_errlevel! + +echo Installing OpenViBE extras dependencies +cd %base_dir%\extras\scripts +powershell.exe -NoProfile -ExecutionPolicy Bypass -file "%base_dir%\sdk\scripts\windows-get-dependencies.ps1" -manifest_file .\windows-dependencies-%platform_target%.txt -dest_dir %dep_dir% +call :check_errors !errorlevel! "Extras" || exit /b !_errlevel! + +echo Creating OpenViBE extras dependency path setup script +set "dependency_cmd=%dep_dir%\windows-dependencies.cmd" +echo @ECHO OFF >%dependency_cmd% +echo. >>%dependency_cmd% +echo SET "dependencies_base=%dep_dir%" >>%dependency_cmd% +echo. >>%dependency_cmd% +type %base_dir%\extras\scripts\windows-dependencies.cmd-base >>%dependency_cmd% + +echo Done. +exit /b 0 + +:check_errors +SET _errlevel=%1 +SET _stageName=%2 +if !_errlevel! neq 0 ( + echo Error while installing !_stageName! dependencies + exit /b !_errlevel! +) + diff --git a/Masterarbeit/openvibe/meta-master/install_dependencies.sh b/Masterarbeit/openvibe/meta-master/install_dependencies.sh new file mode 100755 index 0000000..a46927b --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/install_dependencies.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +perl sdk/scripts/linux-install_dependencies.pl --manifest-dir sdk/scripts/ --dependencies-dir dependencies +perl sdk/scripts/linux-install_dependencies.pl --manifest-dir designer/scripts/ --dependencies-dir dependencies +perl sdk/scripts/linux-install_dependencies.pl --manifest-dir extras/scripts/ --dependencies-dir dependencies + + + diff --git a/Masterarbeit/openvibe/meta-master/jenkins-config.xml b/Masterarbeit/openvibe/meta-master/jenkins-config.xml new file mode 100755 index 0000000..fbc786e --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/jenkins-config.xml @@ -0,0 +1,77 @@ + + + + false + + + + + NodeName + + + fedora25-x64 + ubuntu16.04-x64 + + + ubuntu16.04-x64 + + unstable + true + false + false + + + + BuildType + + + + Release + Debug + + + + + SDKBranch + + master + + + DesignerBranch + + master + + + ExtrasBranch + + master + + + + + + + + + + 2 + + + https://gitlab.inria.fr/openvibe/meta.git + + + + + master + + + false + + + + Jenkinsfile + true + + + false + \ No newline at end of file diff --git a/Masterarbeit/openvibe/meta-master/launchvc.cmd b/Masterarbeit/openvibe/meta-master/launchvc.cmd new file mode 100755 index 0000000..d8f7a5f --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/launchvc.cmd @@ -0,0 +1,143 @@ +@echo off +setlocal EnableDelayedExpansion +setlocal enableextensions + +set "script_dir=%~dp0" +set BuildType=Release +set builddir=%script_dir%\build +set USE_EXPRESS=0 + +for %%A in (%*) DO ( + if /i "%%A"=="--debug" ( + set BuildType=Debug + ) +) +set PATH_DEPENDENCIES=%script_dir%\dependencies +set SDKPath=%builddir%\sdk\OpenVIBE.sln +set DesignerPath=%builddir%\designer-%BuildType%\Designer.sln +set ExtrasPath=%builddir%\extras-%BuildType%\OpenVIBE.sln + +SET "OV_PATH_ROOT=%script_dir%\dist\sdk-%BuildType%" +SET "DESIGNER_PATH_ROOT=%script_dir%\dist\designer-%BuildType%" +SET "EXTRAS_PATH_ROOT=%script_dir%\dist\extras-%BuildType%" +set args=%PATH_DEPENDENCIES% +SET "PATH=%EXTRAS_PATH_ROOT%\bin;%DESIGNER_PATH_ROOT%\bin;%OV_PATH_ROOT%\bin;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin;%PATH%" + +call :addToPathIfExists cmake\bin +call :addToPathIfExists ninja +call :addToPathIfExists expat\bin +call :addToPathIfExists itpp\bin +call :addToPathIfExists lua\lib +call :addToPathIfExists gtk\bin +call :addToPathIfExists cegui\bin +call :addToPathIfExists cegui\dependencies\bin +call :addToPathIfExists pthreads\lib +call :addToPathIfExists openal\libs\win32 +call :addToPathIfExists freealut\lib +call :addToPathIfExists libogg\win32\bin\release +call :addToPathIfExists libogg\win32\bin\debug +call :addToPathIfExists libvorbis\win32\bin\release +call :addToPathIfExists libvorbis\win32\bin\debug +call :addToPathIfExists liblsl\lib +call :addToPathIfExists ogre\bin\release +call :addToPathIfExists ogre\bin\debug +call :addToPathIfExists vrpn\bin +call :addToPathIfExists openal\libs\Win32 +call :addToPathIfExists liblsl\lib +call :addToPathIfExists sdk-brainproducts-actichamp +call :addToPathIfExists sdk-mcs\lib +call :addToPathIfExists xerces-c\lib +call :addToPathIfExists vcredist +call :addToPathIfExists boost\bin +call :addToPathIfExists tvicport\bin +call :addToPathIfExists vcredist +call :addToPathIfExists zip +echo !PATH! + +if not defined SKIP_VS2017 ( + SET SKIP_VS2017=1 +) +if not defined SKIP_VS2015 ( + SET SKIP_VS2015=1 +) +if not defined SKIP_VS2013 ( + SET SKIP_VS2013=0 +) + +set VSTOOLS= +set VSCMake= + +if %SKIP_VS2017% == 1 ( + echo Visual Studio 2017 detection skipped as requested +) else ( + if exist "%VS150COMNTOOLS%vsvars32.bat" ( + echo Found VS150 tools at "%VS150COMNTOOLS%" ... + CALL "%VS150COMNTOOLS%vsvars32.bat" + SET VSCMake=Visual Studio 15 + goto launch + ) +) + +if %SKIP_VS2015% == 1 ( + echo Visual Studio 2015 detection skipped as requested +) else ( + if exist "%VS140COMNTOOLS%vsvars32.bat" ( + echo Found VS140 tools at "%VS140COMNTOOLS%" ... + CALL "%VS140COMNTOOLS%vsvars32.bat" + SET VSCMake=Visual Studio 14 + goto launch + ) +) + +if %SKIP_VS2013% == 1 ( + echo Visual Studio 2013 detection skipped as requested +) else ( + if exist "%VS120COMNTOOLS%vsvars32.bat" ( + echo Found VS120 tools at "%VS120COMNTOOLS%" ... + CALL "%VS120COMNTOOLS%vsvars32.bat" + SET VSCMake=Visual Studio 12 + goto launch + ) +) + +goto launch + +:addToPathIfExists +for %%A in (%args%) DO ( + if exist "%%A\%~1\" ( + set "PATH=%%A\%~1;!PATH!" + ) +) +exit /B 0 + + +:launch + +if %USE_EXPRESS% == 1 ( + echo Use %VSCMake% Express Edition + + if "%VSCMake%"=="Visual Studio 12" ( + start /b "%VSINSTALLDIR%\Common7\IDE\WDExpress.exe" %SDKPath% + ) else ( + "%VSINSTALLDIR%\Common7\IDE\VCExpress.exe" %SDKPath% + ) +) else ( + echo Use %VSCMake% + SET "OV_PATH_BIN=%script_dir%\dist\sdk-%BuildType%\bin" + SET "OV_PATH_LIB=%script_dir%\dist\sdk-%BuildType%\bin" + set "OV_PATH_DATA=%script_dir%\dist\sdk-%BuildType%\share\openvibe" + start /b "" "%VSINSTALLDIR%\Common7\IDE\devenv.exe" %SDKPath% + REM SET "OV_PATH_BIN=%script_dir%\dist\designer-%BuildType%\bin" + REM SET "OV_PATH_LIB=%script_dir%\dist\designer-%BuildType%\bin" + REM set "OV_PATH_DATA=%script_dir%\dist\designer-%BuildType%\share\openvibe" + REM start /b "" "%VSINSTALLDIR%\Common7\IDE\devenv.exe" %DesignerPath% + REM SET "OV_PATH_BIN=%script_dir%\dist\extras-%BuildType%\bin" + REM SET "OV_PATH_LIB=%script_dir%\dist\extras-%BuildType%\bin" + REM set "OV_PATH_DATA=%script_dir%\dist\extras-%BuildType%\share\openvibe" + REM start /b "" "%VSINSTALLDIR%\Common7\IDE\devenv.exe" %ExtrasPath% + + REM SET "OV_PATH_BIN=%script_dir%\dist\extras-%BuildType%\bin" + REM SET "OV_PATH_LIB=%script_dir%\dist\extras-%BuildType%\bin" + REM set "OV_PATH_DATA=%script_dir%\dist\extras-%BuildType%\share\openvibe" + REM start /b "" "%VSINSTALLDIR%\Common7\IDE\devenv.exe" OpenViBE-meta.sln +) diff --git a/Masterarbeit/openvibe/meta-master/launchvc_debug.cmd b/Masterarbeit/openvibe/meta-master/launchvc_debug.cmd new file mode 100755 index 0000000..e613e3e --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/launchvc_debug.cmd @@ -0,0 +1,3 @@ +@echo off + +call "launchvc.cmd" --debug %* \ No newline at end of file diff --git a/Masterarbeit/openvibe/meta-master/pack-release.sh b/Masterarbeit/openvibe/meta-master/pack-release.sh new file mode 100755 index 0000000..d3b67dd --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/pack-release.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# +# Launch in the meta repo root on Cygwin after you've built the win installer manually by nsis +# + +# todo could use the git tag? +OV_VERSION="3.0.0-beta" + +rm package/* +mkdir package + +tar --owner 0 --group 0 --transform s,^\.,openvibe-$OV_VERSION-src, --exclude ".git*" --exclude build --exclude dependencies --exclude dist --exclude scripts/*.exe --exclude package -cJvf package/openvibe-$OV_VERSION-src.tar.xz . + +pushd package + +cp ../extras/scripts/openvibe-$OV_VERSION-*-setup.exe . + +md5sum openvibe-$OV_VERSION-src.tar.xz >openvibe-$OV_VERSION-src.md5 +md5sum openvibe-$OV_VERSION-32bit-setup.exe >openvibe-$OV_VERSION-32bit-setup.md5 +md5sum openvibe-$OV_VERSION-64bit-setup.exe >openvibe-$OV_VERSION-64bit-setup.md5 + +popd + diff --git a/Masterarbeit/openvibe/meta-master/visual_gen/OpenViBE-Meta.sln-tpl b/Masterarbeit/openvibe/meta-master/visual_gen/OpenViBE-Meta.sln-tpl new file mode 100755 index 0000000..98c313f --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/visual_gen/OpenViBE-Meta.sln-tpl @@ -0,0 +1,37 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SDK", "SDK", "{10313F85-EFD9-42AB-BF90-643A406FDD99}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Designer", "Designer", "{EEB9310A-3238-432D-9EAD-CDFCB35054D4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extras", "Extras", "{3F5EF7F3-0F10-4F2E-ACEB-3B1326E3DA48}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Designer-Extras", "designer-extras.vcxproj", "{C003281C-E8FC-49FE-8B50-37A6035730D7}" +EndProject +{%- for project in proj_list %} +{{ project }} +{%- endfor %} +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|{{ platform_target }} = Debug|{{ platform_target }} + MinSizeRel|{{ platform_target }} = MinSizeRel|{{ platform_target }} + Release|{{ platform_target }} = Release|{{ platform_target }} + RelWithDebInfo|{{ platform_target }} = RelWithDebInfo|{{ platform_target }} + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution +{# #} + {%- for project in proj_conf_platforms %} + {{- project -}} + {% endfor -%} +{# #} EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {%- for key, val in nested_projs.items() %} + {{ "{" }}{{ key }}{{ "}" }} = {{ "{" }}{{ val }}{{ "}" -}} + {%- endfor %} + EndGlobalSection +EndGlobal diff --git a/Masterarbeit/openvibe/meta-master/visual_gen/designer-extras.vcxproj-tpl b/Masterarbeit/openvibe/meta-master/visual_gen/designer-extras.vcxproj-tpl new file mode 100755 index 0000000..b98b697 --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/visual_gen/designer-extras.vcxproj-tpl @@ -0,0 +1,71 @@ + + + + + Debug + {{ platform_target }} + + + Release + {{ platform_target }} + + + + {C003281C-E8FC-49FE-8B50-37A6035730D7} + designerextras + + + + Application + true + v120 + MultiByte + + + Application + false + v120 + true + MultiByte + + + + + + + + + + + + + + + Level3 + Disabled + true + + + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/meta-master/visual_gen/generateVS.py b/Masterarbeit/openvibe/meta-master/visual_gen/generateVS.py new file mode 100755 index 0000000..23fdbc1 --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/visual_gen/generateVS.py @@ -0,0 +1,101 @@ +#!/usr/local/bin/python + +import re +import sys +from os.path import join as joinpath, split as splitpath, exists as existspath, normpath, dirname, abspath, relpath, realpath +import jinja2 +import argparse + +def render(tpl_path, context): + path, filename = splitpath(tpl_path) + return jinja2.Environment(loader=jinja2.FileSystemLoader(path or './')).get_template(filename).render(context).replace(u'\ufeff', '') + +def renderToFile(outfile, tpl_path, context) : + res = render(tpl_path, context) + with open(outfile, "w") as f: + f.write(res) + +def getContent(file, endKeyword) : + res = [] + for line in file : + if line == endKeyword : + break + res.append(line) + return res + + +if __name__ == "__main__": + #Arguments handling + parser = argparse.ArgumentParser(description='Generate merged Visual Studio project for OpenViBE') + parser.add_argument('-o', '--outsln', type=str, default="OpenViBE-Meta.sln", help='Output SLN file') + parser.add_argument('-b', '--builddir', type=str, default="build", help='Build directory where Visual Studio Solutions are located') + parser.add_argument('-p', '--platformtarget', type=str, default="x86", help='x86 or x64') + args = parser.parse_args() + build_dir = abspath(args.builddir) + platform_target = args.platformtarget + dist_dir = joinpath(dirname(build_dir), 'dist') + outfile = args.outsln + script_dir = dirname(realpath(__file__)) + slntpl_path = joinpath(script_dir, "OpenViBE-Meta.sln-tpl") + usertpl_path = joinpath(script_dir, "vcxproj.user-tpl") + designerex_path = joinpath(script_dir, "designer-extras.vcxproj-tpl") + + if platform_target == "x64" : + platform_vs_target = "x64" + else: + platform_vs_target = "Win32" + + context = { 'proj_list' : [], 'proj_conf_platforms' : [], 'nested_projs' : {}, 'platform_target' : platform_vs_target } + projects = [ + ('SDK', "10313F85-EFD9-42AB-BF90-643A406FDD99", normpath(joinpath(build_dir, "sdk-" + platform_target , "OpenVIBE.sln"))), + ("Designer", "EEB9310A-3238-432D-9EAD-CDFCB35054D4", normpath(joinpath(build_dir, "designer-" + platform_target, "Designer.sln"))), + ("Extras", "3F5EF7F3-0F10-4F2E-ACEB-3B1326E3DA48", normpath(joinpath(build_dir, "extras-" + platform_target, "OpenVIBE.sln")))] + build_types = ['Debug', 'Release', 'MinSizeRel', 'RelWithDebInfo'] + + # Generate config file for designer-extras project + ov_env = { type : (joinpath(dist_dir, "extras-" + platform_target, type, "bin", "openvibe-designer.exe"), 'OV_PATH_ROOT=' + joinpath(dist_dir, "extras-" + platform_target, type)) for type in build_types} + renderToFile(joinpath(build_dir, "designer-extras.vcxproj"), designerex_path, { 'platform_target' : platform_vs_target } ) + renderToFile(joinpath(build_dir, "designer-extras.vcxproj.user"), usertpl_path, { 'configurations' : ov_env, 'platform_target' : platform_vs_target } ) + + for folderName, folderId, path_sln in projects : + pathprefix = relpath(dirname(path_sln), normpath(dirname(abspath(outfile)))) + # Sets the correct value for OV_PATH_ROOT; It should be possible to set multiple values separated by newline + # Unfortunately due to a bug, this is not always possible, see https://connect.microsoft.com/VisualStudio/feedback/details/727324/msvs10-c-deu-debugger-environment-variables-missing-linefeed + # (This is about german VS 2010, but this is also happening on french VS2013) + ov_env = { type : (None, 'OV_PATH_ROOT=' + joinpath(dist_dir, folderName.lower() + "-" + platform_target, type.upper())) for type in build_types} + if not existspath(path_sln) : + print(path_sln, 'does not exist !') + continue + print('Parsing', path_sln) + with open(path_sln, 'r') as f: + for line in f : + res = re.match('Project\("{([\dABCDEF-]+)}"\)\s+=\s+"([\w\-]+)",\s+"([\w\-\\\.]+)",\s+"{([\dABCDEF\-]+)}"', line) + if res : + slnId, projectName, projectPath, projectId = res.groups() + content = getContent(f, "EndProject\n") + newpath = joinpath(pathprefix, projectPath) if len(content) else projectPath + tab = ['Project("{%s}") = "%s", "%s", "{%s}"\n' % (slnId, projectName, newpath, projectId)] \ + + content \ + + ["EndProject"] + context['proj_list'].append(''.join(tab)) + context['nested_projs'][projectId] = folderId + # Generate .user file + projectfile = joinpath(dirname(path_sln), projectPath) + userfile = projectfile + ".user" + renderToFile(userfile, usertpl_path, { 'configurations' : ov_env, 'platform_target' : platform_vs_target } ) + elif line == "Global\n" : + for line2 in f : + if line2 == "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n" : + context['proj_conf_platforms'] += getContent(f, "\tEndGlobalSection\n") + elif line2 == "\tGlobalSection(NestedProjects) = preSolution\n" : + res = getContent(f, "\tEndGlobalSection\n") + for item in res : + key, val = re.search('{([\dABCDEF-]+)}\s=\s{([\dABCDEF-]+)}', item).groups() + context['nested_projs'][key] = val + try : + renderToFile(outfile, slntpl_path, context) + except : + print('Could not generate %s' % (outfile,)) + sys.exit(1) + else : + print('Project [%s] generated' % (outfile,)) \ No newline at end of file diff --git a/Masterarbeit/openvibe/meta-master/visual_gen/vcxproj.user-tpl b/Masterarbeit/openvibe/meta-master/visual_gen/vcxproj.user-tpl new file mode 100755 index 0000000..d6e8924 --- /dev/null +++ b/Masterarbeit/openvibe/meta-master/visual_gen/vcxproj.user-tpl @@ -0,0 +1,14 @@ + + + {% for config_type, (config_command, config_env) in configurations.items() %} + + {%- if config_command is not none %} + {{ config_command }} + {%- endif -%} + {%- if config_env is not none %} + {{ config_env }} + {%- endif -%} + WindowsLocalDebugger + + {% endfor %} + diff --git a/Masterarbeit/openvibe/sdk-master.tar b/Masterarbeit/openvibe/sdk-master.tar new file mode 100644 index 0000000..9c6ba25 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master.tar differ diff --git a/Masterarbeit/openvibe/sdk-master/.gitattributes b/Masterarbeit/openvibe/sdk-master/.gitattributes new file mode 100644 index 0000000..017ebd9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/.gitattributes @@ -0,0 +1,13 @@ +# Auto detect text files and perform LF normalization +* text=auto + +*.cmd text eol=crlf +*.cmd-base text eol=crlf +*.nsi text eol=crlf + +*.m text eol=lf +*.sh text eol=lf +*.sh-base text eol=lf + +scripts/linux* text eol=lf + diff --git a/Masterarbeit/openvibe/sdk-master/.gitignore b/Masterarbeit/openvibe/sdk-master/.gitignore new file mode 100644 index 0000000..ce8d3ab --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/.gitignore @@ -0,0 +1,32 @@ +local-tmp +dependencies +dependencies_x64 +scripts/win32-dependencies.cmd +dist +dist-* +build +CMakeLists.txt.* +CustomCMakeLists.txt +.*.swp +externals/*/ +*~ +*.swp +.project +.cproject + +#ignore python compile file .pyc +# *.pyc +# *.*~ + +modules/doc-tmp/ + +# .build is generated on automated packaging on CI +.build +# this file can be copied from skeleton, and updated with appropriate credentials +scripts/windows-install-dependencies-custom.cmd +scripts/windows-install-dependencies-x64-custom.cmd +.version + +# Temp & Software Folder +.vs/ +.vscode/ \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/CMakeLists.txt new file mode 100755 index 0000000..c25322d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/CMakeLists.txt @@ -0,0 +1,344 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 3.4) +cmake_policy(SET CMP0026 OLD) +cmake_policy(SET CMP0042 OLD) +cmake_policy(SET CMP0043 OLD) +cmake_policy(SET CMP0045 OLD) +cmake_policy(SET CMP0048 OLD) + +PROJECT(OpenVIBE) +SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake-modules") +SET(CMAKE_INSTALL_LIBDIR lib) # Fix for non debian-based distrib, as it seeems to be a common occurence to name this folder lib32/lib64 +INCLUDE("Utilities") +INCLUDE("SetProjectVersion") +set_version() +OV_SET_PROJECT_VERSION() +MESSAGE(STATUS "BUILDING VERSION OpenViBE SDK: ${OV_GLOBAL_VERSION_STRING} Branch : ${OV_PROJECT_BRANCH}~${OV_PROJECT_COMMITHASH}") + +# Default is to build to dist/. If you wish a custom install, set your own MAKE_INSTALL_PREFIX when you call CMake. Safest to do under a fakeroot. +MESSAGE(STATUS "Appending compilation flags...") + +SET(OV_CONFIG_SUBDIR "${PROJECT_NAME}" CACHE STRING "Subdirectory under user directory when configuration and logs will be saved") + +IF(NOT DEFINED OV_CUSTOM_DEPENDENCIES_PATH) + IF(WIN32) + IF("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + SET(OV_DEPENDENCIES_PLATFORM_FOLDER_NAME "dependencies_x64") + ELSEIF("${CMAKE_SIZEOF_VOID_P}" EQUAL "4") + SET(OV_DEPENDENCIES_PLATFORM_FOLDER_NAME "dependencies") + ELSE() + SET(OV_DEPENDENCIES_PLATFORM_FOLDER_NAME "dependencies") + ENDIF() + ELSE() + SET(OV_DEPENDENCIES_PLATFORM_FOLDER_NAME "dependencies") + ENDIF() +ENDIF() + +SET(OV_CUSTOM_DEPENDENCIES_PATH "${CMAKE_SOURCE_DIR}/${OV_DEPENDENCIES_PLATFORM_FOLDER_NAME}" CACHE STRING "Dependency directory") +SET(OV_SOURCE_DEPENDENCIES_PATH "${CMAKE_SOURCE_DIR}/dependencies-source") + +# ---------------------- +# Build CMake flags +# ---------------------- +SET(BRAND_NAME "OpenViBE" CACHE STRING "Brand with which titles and documentation will be prefixed") +string(TIMESTAMP COPYRIGHT_DATE "2012-%Y") +IF(BRAND_NAME STREQUAL "NeuroRT") + SET(COMPANY_NAME "Mensia Technologies SA") +ELSE() + SET(COMPANY_NAME "Inria") +ENDIF() + +OPTION(Flag_VerboseOutput "Verbose CMake output" OFF) +OPTION(OV_DISPLAY_ERROR_LOCATION ON) +OPTION(PUBLISH_DOC_ASSETS "Publish plugin documentation assets" ON) + +if(NOT(${Flag_VerboseOutput})) + set(CMAKE_INSTALL_MESSAGE LAZY) +endif() + +# If OpenMP is available, using it will allow Eigen to use multiple cores in matrix math. +IF(NOT(APPLE)) + INCLUDE("FindOpenMP") + IF(OPENMP_FOUND) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") + ENDIF(OPENMP_FOUND) +ENDIF() + +ADD_DEFINITIONS("-DOV_CONFIG_SUBDIR=\"${OV_CONFIG_SUBDIR}\"") +ADD_DEFINITIONS("-DOV_PROJECT_NAME=\"${PROJECT_NAME}\"") +ADD_DEFINITIONS("-DOV_VERSION_MAJOR=\"${OV_GLOBAL_VERSION_MAJOR}\"") +ADD_DEFINITIONS("-DOV_VERSION_MINOR=\"${OV_GLOBAL_VERSION_MINOR}\"") +ADD_DEFINITIONS("-DOV_VERSION_PATCH=\"${OV_GLOBAL_VERSION_PATCH}\"") + +IF(NOT DEFINED OV_PACKAGE) + SET(OV_PACKAGE FALSE) +ENDIF(NOT DEFINED OV_PACKAGE) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +IF(WIN32) + ADD_DEFINITIONS("-DNOMINMAX -DBOOST_ALL_NO_LIB") + # The following is needed to keep OpenMP from hogging all the cores. Note that this works only for VS2013+. On VS2010, it may be better to disable OpenMP. + SET(OV_OMP_WAIT_POLICY "PASSIVE") + # Disable /MP if you don't like VS using all the cores for compilation + + # Switch /arch:SSE2 enables vectorization. Remove if your CPU/compiler doesn't support it. + # x64 build do not provide SSE2 option because 64bit processors always supports SSE vectorization. + # So the /arch:SSE2 is not recognized for x64 build we have to only activate it for x86. + IF("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + ELSEIF("${CMAKE_SIZEOF_VOID_P}" EQUAL "4") + SET(OV_EIGEN_FLAGS "/arch:SSE2") + ENDIF() + + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4355 /MP ${OV_EIGEN_FLAGS}") + SET(OV_WIN32_BOOST_VERSION "1_58") +ELSEIF(APPLE) + SET(OV_EIGEN_FLAGS "-msse2") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall ${OV_EIGEN_FLAGS}") +ELSEIF(UNIX) + # Switch -msse2 enables vectorization. Remove if your CPU/compiler doesn't support it. + SET(OV_EIGEN_FLAGS "-msse2") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall ${OV_EIGEN_FLAGS}") +ELSE() + MESSAGE(WARNING "Warning: unknown platform") +ENDIF() + +IF(NOT CMAKE_INSTALL_PREFIX) + SET(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/../openvibe-sdk-build/dist-${CMAKE_BUILD_TYPE}") +ENDIF() + +# Setup knowledge of GNU-style install path variables +INCLUDE("GNUInstallDirs") + +if(NOT CMAKE_BUILD_TYPE AND CMAKE_GENERATOR MATCHES "Visual Studio*") + set(MULTI_BUILD TRUE) + set( CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_INSTALL_PREFIX}/bin" ) + set( CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_INSTALL_PREFIX}/lib" ) + # set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_INSTALL_PREFIX}/archive" ) + foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} ) + string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU ) + set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIGU} "${CMAKE_INSTALL_PREFIX}/${OUTPUTCONFIG}/bin" ) + set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIGU} "${CMAKE_INSTALL_PREFIX}/${OUTPUTCONFIG}/lib" ) + # set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} "${CMAKE_INSTALL_PREFIX}/${OUTPUTCONFIG}/archive" ) + string(CONCAT DIST_ROOT ${DIST_ROOT} $<$:${CMAKE_INSTALL_PREFIX}/${OUTPUTCONFIG}>) + endforeach() + set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "OV_CMAKE_PATH_ROOT=\"${DIST_ROOT}\"") + set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "OV_CMAKE_PATH_BIN=\"${DIST_ROOT}/bin\"") + set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "OV_CMAKE_PATH_LIB=\"${DIST_ROOT}/lib\"") + set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS "OV_CMAKE_PATH_DATA=\"${DIST_ROOT}/share/openvibe\"") + set(DIST_BINDIR ${DIST_ROOT}/bin) + set(DIST_LIBDIR ${DIST_ROOT}/lib) + set(DIST_INCLUDEDIR ${DIST_ROOT}/include) + set(DIST_DATADIR ${DIST_ROOT}/share) + set(DIST_DOCDIR ${DIST_ROOT}/doc) + set(DIST_DOCTMP ${DIST_ROOT}/doc-tmp) + + set(DIST_BINDIR_ABSOLUTE ${DIST_BINDIR}) + # Also install it on the base dir for convenience + install(FILES scripts/AddOpenViBESDKComponents.cmake DESTINATION ${CMAKE_INSTALL_PREFIX}/share) + # Install the .install file inside the dists folders + install(FILES ${CMAKE_BINARY_DIR}/.install DESTINATION ${DIST_ROOT}) +elseif(CMAKE_BUILD_TYPE AND OV_PACKAGE) + # Add directories that OpenViBE will use to look for its components runtime, unless overridden by environment variables in the launch scripts. + # These defines should only be used in "openvibe/ov_directories.h". + + # We use absolute paths to avoid issue for unit and validation tests + get_filename_component(DIST_ROOT_ABSOLUTE "." REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") + set(DIST_BINDIR_ABSOLUTE ${DIST_ROOT_ABSOLUTE}/bin) + + set(CMAKE_INSTALL_PREFIX .) + + add_definitions(-DOV_CMAKE_PATH_ROOT="${DIST_ROOT_ABSOLUTE}") + add_definitions(-DOV_CMAKE_PATH_BIN="${DIST_ROOT_ABSOLUTE}/bin") + add_definitions(-DOV_CMAKE_PATH_LIB="${DIST_ROOT_ABSOLUTE}/lib") + add_definitions(-DOV_CMAKE_PATH_DATA="${DIST_ROOT_ABSOLUTE}/share/openvibe") + + set(DIST_ROOT ${CMAKE_INSTALL_PREFIX}) + set(DIST_BINDIR ${CMAKE_INSTALL_BINDIR}) + set(DIST_LIBDIR ${CMAKE_INSTALL_LIBDIR}) + set(DIST_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR}) + set(DIST_DATADIR ${CMAKE_INSTALL_DATADIR}) + set(DIST_DOCDIR doc) + set(DIST_DOCTMP doc-tmp) + set(CPACK_GENERATOR "ZIP") + set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF) + set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${BRAND_NAME}) + set(CPACK_PACKAGE_VENDOR "Inria & Mensia Technologies") + set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md") + set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING.md") + set(CPACK_PACKAGE_VERSION ${OV_GLOBAL_VERSION_MAJOR}.${OV_GLOBAL_VERSION_MINOR}.${OV_GLOBAL_VERSION_PATCH}.${OV_GLOBAL_VERSION_BUILD}) + set(CPACK_PACKAGE_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) + set(CPACK_PACKAGE_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) + set(CPACK_PACKAGE_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) + + if(UNIX) + execute_process( + COMMAND bash -c "echo -n $(lsb_release -i -s)$(lsb_release -r -s)" + OUTPUT_VARIABLE CPACK_SYSTEM_NAME) + endif() + + set(CPACK_PACKAGE_NAME "OpenViBE-${CMAKE_BUILD_TYPE}") + include(CPack) +elseif(CMAKE_BUILD_TYPE) + # Add directories that OpenViBE will use to look for its components runtime, unless overridden by environment variables in the launch scripts. + # These defines should only be used in "openvibe/ov_directories.h". + add_definitions(-DOV_CMAKE_PATH_ROOT="${CMAKE_INSTALL_PREFIX}") + add_definitions(-DOV_CMAKE_PATH_BIN="${CMAKE_INSTALL_PREFIX}/bin") + add_definitions(-DOV_CMAKE_PATH_LIB="${CMAKE_INSTALL_PREFIX}/lib") + add_definitions(-DOV_CMAKE_PATH_DATA="${CMAKE_INSTALL_PREFIX}/share/openvibe") + + set(DIST_ROOT ${CMAKE_INSTALL_PREFIX}) + set(DIST_BINDIR ${CMAKE_INSTALL_FULL_BINDIR}) + set(DIST_LIBDIR ${CMAKE_INSTALL_FULL_LIBDIR}) + set(DIST_INCLUDEDIR ${CMAKE_INSTALL_FULL_INCLUDEDIR}) + set(DIST_DATADIR ${CMAKE_INSTALL_FULL_DATADIR}) + set(DIST_DOCDIR ${DIST_ROOT}/doc) + set(DIST_DOCTMP ${DIST_ROOT}/doc-tmp) + + set(DIST_BINDIR_ABSOLUTE ${DIST_BINDIR}) +else() + message(FATAL_ERROR "Build should specify a type or use a multi-type generator (like Visual Studio)") +endif() + +# Print the used compilation parameters (for transparency) +GET_DIRECTORY_PROPERTY(TMP_DEFINITIONS COMPILE_DEFINITIONS) +MESSAGE(STATUS "Compilation flags used at source root: ") +MESSAGE(STATUS " COMPILE_DEFINITIONS = '${TMP_DEFINITIONS}'") +MESSAGE(STATUS " CMAKE_CXX_FLAGS = '${CMAKE_CXX_FLAGS}'") +MESSAGE(STATUS " CMAKE_CXX_FLAGS_RELEASE = '${CMAKE_CXX_FLAGS_RELEASE}'") +MESSAGE(STATUS " CMAKE_CXX_FLAGS_DEBUG = '${CMAKE_CXX_FLAGS_DEBUG}'") + +FUNCTION(SET_BUILD_PLATFORM) + IF("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + ADD_DEFINITIONS(-DTARGET_ARCHITECTURE_x64) + ELSEIF("${CMAKE_SIZEOF_VOID_P}" EQUAL "4") + ADD_DEFINITIONS(-DTARGET_ARCHITECTURE_i386) + SET(PLATFORM_TARGET "x86") + ELSE() + ADD_DEFINITIONS(-DTARGET_ARCHITECTURE_Unknown) + ENDIF() + + IF(WIN32) + ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE) + ADD_DEFINITIONS(-DTARGET_OS_Windows) + ADD_DEFINITIONS(-DTARGET_COMPILER_VisualStudio) + ELSEIF(APPLE) + ADD_DEFINITIONS(-fnon-call-exceptions) + ADD_DEFINITIONS(-DTARGET_OS_MacOS) + # ADD_DEFINITIONS(-DTARGET_ARCHITECTURE_x64) + ADD_DEFINITIONS(-DTARGET_COMPILER_LLVM) + ELSEIF(UNIX) + # ADD_DEFINITIONS(-fvisibility=hidden) # This flag should be present... man gcc + ADD_DEFINITIONS(-fnon-call-exceptions) + ADD_DEFINITIONS(-DTARGET_OS_Linux) + ADD_DEFINITIONS(-DTARGET_COMPILER_GCC) + ENDIF() +ENDFUNCTION() + +# Custom cmakelist can be used to overwrite the default compilation & packaging parameters +# e.g. OEM_DISTRIBUTION +IF(EXISTS "${CMAKE_SOURCE_DIR}/CustomCMakeLists.txt") + MESSAGE(STATUS "Found custom build settings") + INCLUDE("${CMAKE_SOURCE_DIR}/CustomCMakeLists.txt") +ENDIF() + +################################################################# +string(TOLOWER ${BRAND_NAME} LOWER_BRAND_NAME) +ADD_DEFINITIONS(-DBRAND_NAME="${BRAND_NAME}") +if(${BRAND_NAME} STREQUAL "NeuroRT") + ADD_DEFINITIONS(-DOV_LOCAL_SYMBOLS) +endif() + +IF(OV_DISPLAY_ERROR_LOCATION) + ADD_DEFINITIONS(-DOV_DISPLAY_ERROR_LOCATION) +ENDIF() +################################################################# + +SET(OV_LAUNCHER_SOURCE_PATH "${CMAKE_SOURCE_DIR}/cmake-modules/launchers") + +# By setting SKIP[_FOLDER]* you can skip a subtree (example: SKIP_A_B_C skips folder a/b/c and all its subfolders if any) +# Skip building documentation +# a list of all project which will be filled by the directory traversal. This is needed to generate the documentation. +SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS "") +SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS_BUILD_DIR "") + +# Used by the various Find* scripts to locate OpenViBE modules +SET(OV_BASE_DIR ${CMAKE_SOURCE_DIR}) +SET(OV_BASE_BIN_DIR ${CMAKE_BINARY_DIR}) +SET(OV_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib) + +# needed for making visual studio projects when this script is called without CMAKE_BUILD_TYPE +SET_PROPERTY(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_DEBUG "TARGET_BUILDTYPE_Debug") +SET_PROPERTY(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_RELEASE "TARGET_BUILDTYPE_Release") +SET_PROPERTY(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_RELWITHDEBINFO "TARGET_BUILDTYPE_Release") + +# OpenViBE-specific helper functions that are used by the CMakeLists of the subprojects. +INCLUDE("OvAddProjects") +INCLUDE("OvInstallLaunchScript") +INCLUDE("OvLinkBoostLib") +INCLUDE("OvDelayLoad") + +# Sets the PROJECT_VERSION variable to something, depending on overriding OvSetProjectVersion.cmake files +OV_SET_PROJECT_VERSION() + +# Sort target into directories for better visualization in IDE +SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON) +SET(APP_FOLDER Applications) +SET(KERNEL_FOLDER Kernel) +SET(MODULES_FOLDER Modules) +SET(PLUGINS_FOLDER Plugins) +SET(TESTS_FOLDER Unit-Tests) +SET(VALIDATION_FOLDER Validation-Tests) + +# Traverse these directories and build their components +ADD_SUBDIRECTORY("build-tool/") + +ADD_SUBDIRECTORY("documentation/") +ADD_SUBDIRECTORY("common/") + +IF(NOT(SKIP_OPENVIBE)) + ADD_SUBDIRECTORY("openvibe/") +ENDIF() + +IF(NOT(SKIP_KERNEL)) + ADD_SUBDIRECTORY("kernel/") +ENDIF() + +ADD_SUBDIRECTORY("modules/") + +IF(NOT(SKIP_TOOLKIT)) + ADD_SUBDIRECTORY("toolkit/") +ENDIF() + +IF(NOT(SKIP_PLUGINS)) + ADD_SUBDIRECTORY("plugins/") +ENDIF() + +IF(NOT(SKIP_APPLICATIONS)) + ADD_SUBDIRECTORY("applications/") +ENDIF() + +INSTALL(FILES "${CMAKE_BINARY_DIR}/.install" DESTINATION ${CMAKE_INSTALL_PREFIX}) + + +OPTION(BUILD_TESTING "Include and build unit tests" ON) + +IF(BUILD_TESTING) + SET(OVT_LOG_DIR "${CMAKE_BINARY_DIR}/test/log" CACHE PATH "Path to directory containing test logs") + SET(OVT_TEST_DATA_DIR "${OV_CUSTOM_DEPENDENCIES_PATH}/test-input" CACHE PATH "Path to test input data files") +ENDIF() + +# add the scripts to the project so IDEs using the CMake file are aware of them +FILE(GLOB_RECURSE script_files scripts/*.cmd scripts/*.sh scripts/*.nsi scripts/*.cmake) +INSTALL(FILES scripts/AddOpenViBESDKComponents.cmake DESTINATION ${DIST_DATADIR}) +ADD_CUSTOM_TARGET(openvibe-scripts SOURCES ${script_files}) + +# Enable/Disable unit test +SET(BUILD_UNIT_TEST true CACHE BOOL "Set this flag to true/false to enable/disable unit test building") +SET(BUILD_VALIDATION_TEST true CACHE BOOL "Set this flag to true/false to enable/disable validation test building") + +IF(BUILD_UNIT_TEST) + ADD_SUBDIRECTORY("unit-test/") +ENDIF() +IF(BUILD_VALIDATION_TEST) + ADD_SUBDIRECTORY("validation-test/") +ENDIF() diff --git a/Masterarbeit/openvibe/sdk-master/COPYING.md b/Masterarbeit/openvibe/sdk-master/COPYING.md new file mode 100644 index 0000000..dba13ed --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/COPYING.md @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/Masterarbeit/openvibe/sdk-master/CustomCMakeLists.txt-skeleton b/Masterarbeit/openvibe/sdk-master/CustomCMakeLists.txt-skeleton new file mode 100644 index 0000000..d73f9d0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/CustomCMakeLists.txt-skeleton @@ -0,0 +1,46 @@ +# This file is an example configuration of OpenViBE build system +# By default all changes are disabled, you can un-comment any that are of interest to you +# In order to use the file make a copy of it an rename it "CustomCMakeLists.txt" + +# ---------------------------------- +# USEFUL ELEMENTS +# ---------------------------------- + +# Uncomment the following to build documentation +# both the global project and the specific projects are affected by this token +#SET(SKIP_DOCUMENTATION OFF) + +# ---------------------------------- +# OPENVIBE +# ---------------------------------- + +# Optionally skip whole projects +#SET(SKIP_KERNEL ON) +#SET(SKIP_MODULES ON) +#SET(SKIP_OPENVIBE ON) +#SET(SKIP_PLUGINS ON) +#SET(SKIP_TOOLKIT ON) + +# Optionally disable (or re-enable) Modules +#SET(SKIP_MODULES_EBML ON) +#SET(SKIP_MODULES_FS ON) +#SET(SKIP_MODULES_SOCKET ON) +#SET(SKIP_MODULES_STREAM OFF) +#SET(SKIP_MODULES_SYSTEM ON) +#SET(SKIP_MODULES_XML ON) + +# Optionally skip Processing Plugins +#SET(SKIP_PLUGINS_PROCESSING_ACQUISITION ON) +#SET(SKIP_PLUGINS_PROCESSING_CLASIFICATION ON) +#SET(SKIP_PLUGINS_PROCESSING_EXAMPLES ON) +#SET(SKIP_PLUGINS_PROCESSING_FILE-IO ON) +#SET(SKIP_PLUGINS_PROCESSING_NETWORK-IO ON) +#SET(SKIP_PLUGINS_PROCESSING_SAMPLES ON) +#SET(SKIP_PLUGINS_PROCESSING_SIGNAL-PROCESSING ON) +#SET(SKIP_PLUGINS_PROCESSING_SIMPLE-VISUALISATION ON) +#SET(SKIP_PLUGINS_PROCESSING_STIMULATION ON) +#SET(SKIP_PLUGINS_PROCESSING_STREAM-CODECS ON) +#SET(SKIP_PLUGINS_PROCESSING_STREAMING ON) +#SET(SKIP_PLUGINS_PROCESSING_TOOLS ON) + + diff --git a/Masterarbeit/openvibe/sdk-master/INSTALL.md b/Masterarbeit/openvibe/sdk-master/INSTALL.md new file mode 100644 index 0000000..674a822 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/INSTALL.md @@ -0,0 +1,99 @@ +Dependencies +============ + +Linux Ubuntu (14.04 and 16.04) +----------------------------- +- Install the dependencies + - run `linux-install-dependencies.pl` script; you will require sudo rights + - run `unix-get-dependencies.sh` script with an existing `DEPENDENCY_CACHE` environment variable or with --cache parameter (OPTIONAL - for tests), + or with `PROXYPASS` + + +Windows 7 and later +------------------- +- Install the dependencies: + - copy `windows-install-dependencies.cmd` and rename copy to `windows-install-dependencies-custom.cmd` + - edit line `set PROXYPASS=XXX:XXX` with appropriate username and password + - run it whenever you want to update dependencies. + + +Install +======= + +Linux Ubuntu (14.04) +-------------------- +- Build the sofware + - run `unix-build` script, and append `--build-unit` and/or `--build-validation` if you want to build tests +- Run unit tests + - run `ctest-launcher.sh` from the build directory + + +Windows 7 and later +------------------- +- Build the sofware + - run `windows-build.cmd` script, and append `--build-unit` and/or `--build-validation` if you want to build tests +- Run unit tests + - run `ctest-launcher.cmd` from the build directory + + +Building Documentation +====================== + +Documentation Dependencies +-------------------------- + +The documentation is build by the sphinx tool and has following dependencies: + +* Python +* sphinx +* sphinx_rtd_theme + +The best way to have these dependencies ready is to use a virtualenv in order to make an environment containing these. + +Assuming you have virtualenv installed the commands would be: + +First time: + + mkdir -p ~/virtualenvs + virutalenv ~/virtualenvs/openvibe-doc + source ~/virtualenvs/openvibe-doc/bin/activate + pip install sphinx sphinx_rtd_theme + +or on windows + + md %USERPROFILE%\virtualenvs + virtualenv %USERPROFILE%\virtualenvs\openvibe-doc + %USERPROFILE%\virtualenvs\openvibe-doc\Scripts\activate.bat + pip install sphinx sphinx_rtd_theme + +once the environment is created you only need to execute the third line to activate it. + +Documentation Building +---------------------- + +The documentation main files reside in documentation/sphinx folder and is constructed in the following fashion: + +1. During the CMake step documentation files are pooled in the dist/doc-tmp/sphinx folder + * The files come from the documentation/sphinx folder and from the plugins `boxes` folders +2. The documentation will generate a build-documentation script inside the doc-tmp folder which + has to be launched manually. +3. The documentation will be generated in the `doc-tmp/sphinx/build` folder and moved to + `doc/OpenViBE Manual` + +Extending Documentation +----------------------- + +If you wish to build a documentation that extends what is already in the SDK you can do so by adding files +into the doc-tmp folder and overwriting indexes. + +A few remarks: + +The main index file is in `doc-tmp/sphinx/source/index.rst` and should almost always be overwritten if you +need to add something to the documentation. + +Box list is in `doc-tmp/sphinx/source/boxes/index-boxes.rst`. The plugin-inspector can generate this file +for you using the `openvibe-plugin-inspector --box-doc-directory ` template. It will also generate +templates for all boxes that can be loaded by the kernel. + + + diff --git a/Masterarbeit/openvibe/sdk-master/README.md b/Masterarbeit/openvibe/sdk-master/README.md new file mode 100644 index 0000000..94641b1 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/README.md @@ -0,0 +1,132 @@ +Introduction +============ + +OpenViBE SDK is a core software platform for the design, test and use of +Brain-Computer Interfaces. It aims to have a certifiable kernel to be used in +medical devices. + +Repository organisation +======================= + +The project repository is composed of several software modules. +The repository basically looks like this : + +``` + + (API / specifications) + + (kernel implementation) + + (development help components) + + (OpenViBE user applications) + + (OpenViBE plugin collections) + + + + + + ... + + (abstraction and portability components) + + + + + + ... + +-- cmake-modules (cmake FindXXX and helpers) + + + + (configuration data) + + (test resources) + + + + (code-level unit tests) + + (internal unit testing framework) + + (integration/validation tests) + + +``` + +Each software module is organized as a UNIX-like tree (empty folders not +included): + +``` ++ (any pre-compiled binaries) ++ (target folder for API headers) ++ (any pre-compiled libraries) ++ (shared file folder for all data) ++ (source code of the module) ++ (documentation files for the module) ++ (unit test source code for the module) +``` + +Copying +======= + +Please refer to the COPYING.md file to get details regarding the OpenViBE license. + +Install +======= + +Please refer to the INSTALL.md file for instructions on how to build the +platform. + + +Naming rules +============ + +WARNING: These are the initial naming rules of the project. For an +updated version, pleaser refer to OpenViBE Coding Rules. + +#### CMake + + - Openvibe-related variable: OV_MY_VARIABLE + - Test-related variable: OVT_MY_VARIABLE + +#### Tools + + - CMake project and target name: openvibe-test-*mytool* (e.g. *openvibe-test-accuracy*) + - File name: ovt + OpenViBE naming rules + - Main namespace: OpenViBE::Test + - Macro naming: OVT_MYMACRO + +#### Unit Tests + + - OpenViBE tested modules: module (e.g. *openvibe-kernel*) + - Unit test directory name: module (e.g. *openvibe-kernel*) + - CMake target name: module-test (e.g. *openvibe-kernel-test*) + - Test file name: uo/ur + test identifier + Test (e.g. *uoKernelContextTest.cpp*) + - u = unit + - o = open (used for public test transferred from open-source OpenViBE) + - r = restricted (used for test implemented within OpenViBE SDK project) + - Test name: identical to file name + +#### Validation Tests + + - OpenViBE tested module: module (e.g. *openvibe-plugins-classification*) + - Validation test directory: module (e.g. *openvibe-plugins-classification*) + - CMake target name: module-test (e.g *openvibe-plugins-classification-test*) + - Test name: vo/vr + module identifier + test identifier + Test (e.g. *voClassificationLDATest*) + - v = validation + - o/r: see Unit Tests + +#### Headers + +Use AGPL-3 header for public tests and confidential header for private tests. + +Contribution +============ + +### Adding Unit Test + +#### Add Tests to Existing Driver + +To add tests to a module that is already tested, just add the test file and modify the test driver CMakeLists.txt accordingly. + +#### Creating a Test Driver + +If you wish to test a new module, you will have to create a new test driver in unit-test/. + +Create a new directory with some tests and a CMakeLists.txt (just look at other tests to get insights on tests structure). + +Add driver directory to directory to be processed in root directory CMakeLists.txt. + +### Updating CTest Validation Test + +#### Enhance Existing Test + +Just add data in the test directory and modify test CMakeLists.txt accordingly. + +#### Add New Test + +There should be no reason to add ctest validation tests. New validation tests use Robot Framework. +@FIXME CERT Rename repository ? +Check "Adding Robot Framework Test" section in certivibe-test repository for more details. diff --git a/Masterarbeit/openvibe/sdk-master/applications/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/applications/CMakeLists.txt new file mode 100644 index 0000000..9bae9bd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/CMakeLists.txt @@ -0,0 +1,3 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("APPLICATIONS") diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/CMakeLists.txt new file mode 100644 index 0000000..0d6c6ee --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/CMakeLists.txt @@ -0,0 +1,4 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("APPLICATIONS_DEVELOPER-TOOLS") + diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/id-generator/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/id-generator/CMakeLists.txt new file mode 100644 index 0000000..b7b70ee --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/id-generator/CMakeLists.txt @@ -0,0 +1,30 @@ +PROJECT(openvibe-id-generator) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ---------------------- +# Generate launch script +# ---------------------- +OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "openvibe-id-generator" EXECUTABLE_NAME "${PROJECT_NAME}" PAUSE) + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/id-generator/src/ovig_main.cpp b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/id-generator/src/ovig_main.cpp new file mode 100644 index 0000000..366fdb5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/id-generator/src/ovig_main.cpp @@ -0,0 +1,24 @@ +#include +#include +#include +#include +#include + +int main(int /*argc*/, char** /*argv*/) +{ + std::random_device rd; + std::default_random_engine rng(rd()); + std::uniform_int_distribution uni(0, std::numeric_limits::max() - 1); + + + for (int i = 0; i < 16; ++i) + { + const uint32_t v1 = uni(rng), v2 = uni(rng); + std::stringstream ss; + ss.fill('0'); + ss << "(0x" << std::setw(8) << std::hex << v1 << ", 0x" << std::setw(8) << std::hex << v2 << ")"; + std::cout << "#define OV_ClassId_\t\t\tOpenViBE::CIdentifier" << ss.str() << std::endl; + } + + return 0; +} diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/CMakeLists.txt new file mode 100644 index 0000000..63053b7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/CMakeLists.txt @@ -0,0 +1,48 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +PROJECT(openvibe-plugin-inspector) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h) +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindThirdPartyBoost") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/src/ovpiCPluginObjectDescEnum.cpp b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/src/ovpiCPluginObjectDescEnum.cpp new file mode 100644 index 0000000..818d952 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/src/ovpiCPluginObjectDescEnum.cpp @@ -0,0 +1,50 @@ +#include "ovpiCPluginObjectDescEnum.h" + +namespace OpenViBE { +namespace PluginInspector { + +// Enumerate plugins by iterating over a user defined list of descriptors, used for metaboxes +bool CPluginObjectDescEnum::enumeratePluginObjectDesc(std::vector& pod) +{ + for (auto* plugin : pod) { this->callback(*plugin); } + return true; +} + +bool CPluginObjectDescEnum::enumeratePluginObjectDesc(const CIdentifier& parentClassID) +{ + CIdentifier id; + while ((id = m_kernelCtx.getPluginManager().getNextPluginObjectDescIdentifier(id, parentClassID)) != CIdentifier::undefined()) + { + this->callback(*m_kernelCtx.getPluginManager().getPluginObjectDesc(id)); + } + return true; +} + +std::string CPluginObjectDescEnum::transform(const std::string& in, const bool removeSlash) +{ + std::string out; + bool wasLastASeparator = true; + + for (size_t i = 0; i < in.length(); ++i) + { + if ((in[i] >= 'a' && in[i] <= 'z') || (in[i] >= 'A' && in[i] <= 'Z') || (in[i] >= '0' && in[i] <= '9') || (!removeSlash && in[i] == '/')) + { + if (in[i] == '/') { out += "_"; } + else + { + if (wasLastASeparator) + { + if ('a' <= in[i] && in[i] <= 'z') { out += in[i] + 'A' - 'a'; } + else { out += in[i]; } + } + else { out += in[i]; } + } + wasLastASeparator = false; + } + else { wasLastASeparator = true; } + } + return out; +} + +} // namespace PluginInspector +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/src/ovpiCPluginObjectDescEnum.h b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/src/ovpiCPluginObjectDescEnum.h new file mode 100644 index 0000000..e813b2b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/src/ovpiCPluginObjectDescEnum.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include + +#include +#include + +namespace OpenViBE { +namespace PluginInspector { +class CPluginObjectDescEnum +{ +public: + + explicit CPluginObjectDescEnum(const Kernel::IKernelContext& ctx) : m_kernelCtx(ctx) { } + virtual ~CPluginObjectDescEnum() { } + + virtual bool enumeratePluginObjectDesc(std::vector& pod); + virtual bool enumeratePluginObjectDesc(const CIdentifier& parentClassID); + + virtual bool callback(const Plugins::IPluginObjectDesc& pod) = 0; + + static std::string transform(const std::string& in, bool removeSlash = false); + +protected: + + const Kernel::IKernelContext& m_kernelCtx; +}; +} // namespace PluginInspector +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/src/ovpiCPluginObjectDescEnumBoxTemplateGenerator.cpp b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/src/ovpiCPluginObjectDescEnumBoxTemplateGenerator.cpp new file mode 100644 index 0000000..7601c90 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/src/ovpiCPluginObjectDescEnumBoxTemplateGenerator.cpp @@ -0,0 +1,251 @@ +#include "ovpiCPluginObjectDescEnumBoxTemplateGenerator.h" + +#include +#include + +#include +#include +#include +#include +#include + +namespace OpenViBE { +namespace PluginInspector { + +static std::map indentCharacters = { { 0, '=' }, { 1, '-' }, { 2, '~' }, { 3, '+' } }; +static std::string generateRstTitle(const std::string& title, const int level) +{ + return title + "\n" + std::string(title.size(), indentCharacters[level]) + "\n"; +} + +// ------------------------------------------------------------------------------------------------------------------------------------ +bool CPluginObjectDescEnumBoxTemplateGenerator::initialize() +{ + if (!m_kernelCtx.getScenarioManager().createScenario(m_scenarioID)) { return false; } + m_scenario = &m_kernelCtx.getScenarioManager().getScenario(m_scenarioID); + return true; +} + +// ------------------------------------------------------------------------------------------------------------------------------------ +bool CPluginObjectDescEnumBoxTemplateGenerator::uninitialize() +{ + if (!m_kernelCtx.getScenarioManager().releaseScenario(m_scenarioID)) { return false; } + + std::ofstream ofBoxIdx; + FS::Files::openOFStream(ofBoxIdx, (m_docTemplateDirectory + "/index-boxes.rst").c_str()); + + if (!ofBoxIdx.good()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Error while trying to open file [" << (m_docTemplateDirectory + "/index-boxes.rst").c_str() << + "]\n"; + return false; + } + + ofBoxIdx << ".. _Doc_BoxAlgorithms:\n\n" << generateRstTitle("Boxes list", 0) << "\nAvailable box algorithms are :\n\n" << generateRstIndex(m_categories) << + " \n"; + + if (!m_deprecatedBoxesCategories.empty()) + { + ofBoxIdx << "\n\n" << generateRstTitle("Deprecated boxes list", 0) << + "\nThe following boxes are deprecated, they are hidden in Studio and will be removed soon or later, so you should consider not using them:\n" + << generateRstIndex(m_deprecatedBoxesCategories) << " \n"; + } + + ofBoxIdx << " \n"; + ofBoxIdx.close(); + return true; +} + +// ------------------------------------------------------------------------------------------------------------------------------------ +bool CPluginObjectDescEnumBoxTemplateGenerator::callback(const Plugins::IPluginObjectDesc& pod) +{ + const std::string fileName = "BoxAlgorithm_" + transform(pod.getName().toASCIIString()); + CIdentifier boxID; + + if (pod.getCreatedClass() == OVP_ClassId_BoxAlgorithm_Metabox) + { + // insert a box into the scenario, initialize it from the proxy-descriptor from the metabox loader + if (!m_scenario->addBox(boxID, dynamic_cast(pod), CIdentifier::undefined())) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Skipped [" << fileName << "] (could not create corresponding box)\n"; + return true; + } + } + else if (!m_scenario->addBox(boxID, pod.getCreatedClassIdentifier(), CIdentifier::undefined())) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Skipped [" << fileName << "] (could not create corresponding box)\n"; + return true; + } + + + Kernel::IBox& box = *m_scenario->getBoxDetails(boxID); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Working on [" << fileName << "]\n"; + + // -------------------------------------------------------------------------------------------------------------------- + std::ofstream ofs; + FS::Files::openOFStream(ofs, (m_docTemplateDirectory + "/Doc_" + fileName + ".rst-template").c_str()); + + if (!ofs.good()) + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Error while trying to open file [" + << (m_docTemplateDirectory + "/Doc_" + fileName + ".rst-template").c_str() + << "]\n"; + return false; + } + + ofs << ".. _Doc_" << fileName << ":\n\n" << generateRstTitle(pod.getName().toASCIIString(), 0) + << "\n.. container:: attribution\n\n :Author:\n " << pod.getAuthorName().toASCIIString() << "\n" + << " :Company:\n " << pod.getAuthorCompanyName().toASCIIString() << "\n\n\n" + << ".. todo:: Write general box description...\n\n\n"; + + + if (box.getInputCount()) + { + ofs << ".. _Doc_" << fileName << "_Inputs:\n\n" << generateRstTitle("Inputs", 1).c_str() + << ".. todo:: Write general input description...\n\n.. csv-table::\n :header: \"Input Name\", \"Stream Type\"\n\n"; + + std::vector inputNames(box.getInputCount()); + for (size_t i = 0; i < box.getInputCount(); ++i) + { + CIdentifier typeID; + box.getInputName(i, inputNames[i]); + box.getInputType(i, typeID); + CString typeName = m_kernelCtx.getTypeManager().getTypeName(typeID); + + ofs << " \"" << inputNames[i] << "\", \"" << typeName << "\"\n"; + } + size_t index = 1; + for (const auto& name : inputNames) + { + ofs << "\n.. _Doc_" << fileName << "_Input_" << index << ":\n\n" << generateRstTitle(name.toASCIIString(), 2) + << "\n.. todo:: Write input description...\n\n\n"; + index++; + } + } + + if (box.getOutputCount()) + { + ofs << ".. _Doc_" << fileName << "_Outputs:\n\n" << generateRstTitle("Outputs", 1) + << "\n.. todo:: Write general output description...\n\n.. csv-table::\n :header: \"Output Name\", \"Stream Type\"\n\n"; + + std::vector outputNames(box.getOutputCount()); + for (size_t i = 0; i < box.getOutputCount(); ++i) + { + CIdentifier typeID; + box.getOutputName(i, outputNames[i]); + box.getOutputType(i, typeID); + CString typeName = m_kernelCtx.getTypeManager().getTypeName(typeID); + + ofs << " \"" << outputNames[i] << "\", \"" << typeName << "\"\n"; + } + size_t index = 1; + for (const auto& outputName : outputNames) + { + ofs << "\n.. _Doc_" << fileName << "_Output_" << index << ":\n\n" << generateRstTitle(outputName.toASCIIString(), 2) + << "\n.. todo:: Write output description...\n\n\n"; + index++; + } + } + + if (box.getSettingCount()) + { + ofs << ".. _Doc_" << fileName << "_Settings:\n\n" << generateRstTitle("Settings", 1) << "\n" + << ".. todo:: Write settings general description...\n\n.. csv-table::\n :header: \"Setting Name\", \"Type\", \"Default Value\"\n\n"; + + std::vector settingsNames(box.getSettingCount()); + for (size_t i = 0; i < box.getSettingCount(); ++i) + { + CIdentifier typeID; + CString defaultValue; + box.getSettingName(i, settingsNames[i]); + box.getSettingType(i, typeID); + box.getSettingDefaultValue(i, defaultValue); + CString typeName = m_kernelCtx.getTypeManager().getTypeName(typeID); + + ofs << " \"" << settingsNames[i] << "\", \"" << typeName << "\", \"" << defaultValue << "\"\n"; + } + size_t index = 1; + for (const auto& name : settingsNames) + { + ofs << "\n.. _Doc_" << fileName << "_Setting_" << index << ":\n\n" << generateRstTitle(name.toASCIIString(), 2) + << "\n.. todo:: Write setting description... \n\n\n"; + index++; + } + } + + ofs << ".. _Doc_" << fileName << "_Examples:\n\n" << generateRstTitle("Examples", 1) + << "\n.. todo:: Write example of use...\n\n\n"; + + ofs << ".. _Doc_" << fileName << "_Miscellaneous:\n\n" << generateRstTitle("Miscellaneous", 1) + << "\n.. todo:: Write any miscellaneous information...\n\n\n"; + + ofs.close(); + + // m_categories is used to generate the list of boxes. Documentation for deprecated boxes + // should remain available if needed but not be listed + if (m_kernelCtx.getPluginManager().isPluginObjectFlaggedAsDeprecated(box.getAlgorithmClassIdentifier())) + { + m_deprecatedBoxesCategories.push_back(std::pair(pod.getCategory().toASCIIString(), pod.getName().toASCIIString())); + } + else { m_categories.push_back(std::pair(pod.getCategory().toASCIIString(), pod.getName().toASCIIString())); } + + return true; +} + +// ------------------------------------------------------------------------------------------------------------------------------------ +std::string CPluginObjectDescEnumBoxTemplateGenerator::generateRstIndex(std::vector> categories) const +{ + std::string res; + + std::string lastCategoryName; + std::vector lastSplittedCategories; + std::sort(categories.begin(), categories.end()); + + for (auto& category : categories) + { + std::string categoryName = category.first; + std::string name = category.second; + + if (lastCategoryName != categoryName) + { + std::vector splittedCategories; + size_t i = size_t(-1); + bool isFinished = false; + while (!isFinished) + { + size_t j = categoryName.find('/', i + 1); + if (j == std::string::npos) + { + j = categoryName.length(); + isFinished = true; + } + if (j != i + 1) + { + splittedCategories.push_back(categoryName.substr(i + 1, j - i - 1)); + i = j; + } + } + + auto itLast = lastSplittedCategories.begin(); + auto it1 = splittedCategories.begin(); + for (; itLast != lastSplittedCategories.end() && it1 != splittedCategories.end() && *itLast == *it1; ++itLast, ++it1) { } + + for (; it1 != splittedCategories.end(); ++it1) + { + size_t level = 1; + for (auto it2 = splittedCategories.begin(); it2 != it1; ++it2) { level++; } + res += "\n\n" + generateRstTitle(*it1, int(level)) + "\n.. toctree::\n :maxdepth: 1\n\n"; + } + + lastCategoryName = categoryName; + lastSplittedCategories = splittedCategories; + } + + res += " Doc_BoxAlgorithm_" + transform(name) + "\n"; + } + return res; +} + +} // namespace PluginInspector +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/src/ovpiCPluginObjectDescEnumBoxTemplateGenerator.h b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/src/ovpiCPluginObjectDescEnumBoxTemplateGenerator.h new file mode 100644 index 0000000..106a0fe --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/src/ovpiCPluginObjectDescEnumBoxTemplateGenerator.h @@ -0,0 +1,35 @@ +#pragma once + +#include "ovpiCPluginObjectDescEnum.h" + +#include +#include +#include + +namespace OpenViBE { +namespace PluginInspector { +class CPluginObjectDescEnumBoxTemplateGenerator final : public CPluginObjectDescEnum +{ +public: + + CPluginObjectDescEnumBoxTemplateGenerator(const Kernel::IKernelContext& ctx, const std::string& docTemplateDir) + : CPluginObjectDescEnum(ctx), m_docTemplateDirectory(docTemplateDir) {} + + bool callback(const Plugins::IPluginObjectDesc& pod) override; + bool initialize(); + bool uninitialize(); + +private: + // Return a string that correspond to the indexed categories under rst format + std::string generateRstIndex(std::vector> categories) const; + +protected: + + std::string m_docTemplateDirectory; + std::vector> m_categories; + std::vector> m_deprecatedBoxesCategories; + CIdentifier m_scenarioID = CIdentifier::undefined(); + Kernel::IScenario* m_scenario = nullptr; +}; +} // namespace PluginInspector +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/src/ovpi_main.cpp b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/src/ovpi_main.cpp new file mode 100644 index 0000000..f6f8320 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/plugin-inspector/src/ovpi_main.cpp @@ -0,0 +1,136 @@ +#include "ovpiCPluginObjectDescEnumBoxTemplateGenerator.h" + +#include +#include +#include + +#include + +int main(int argc, char** argv) +{ + //___________________________________________________________________// + // // + /* + USAGE: + plugin-inspector + <--box-doc-directory dir> + */ + + std::vector pluginFilestoLoad; + + std::string docTemplateDir; + bool ignoreMetaboxes = false; + std::vector metaboxExtensionsToLoad; + + for (int i = 1; i < argc; ++i) + { + if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-h") == 0) + { + std::cout << "[ USAGE ]\n" << "plugin-inspector \n" << " <--box-doc-directory dir>\n"; + return 0; + } + std::cout << "Analyze parameter: [" << i << " : " << argv[i] << "]." << std::endl; + + if (strcmp(argv[i], "--ignore-metaboxes") == 0) { ignoreMetaboxes = true; } + else if (i < argc && strcmp(argv[i], "--box-doc-directory") == 0) + { + if (++i >= argc) + { + std::cout << "[ FAILED ] Error while parsing arguments: --box-doc-directory flag found but no path specified afterwards." << std::endl; + return 0; + } + docTemplateDir = argv[i]; + std::cout << "Templates will be generated in folder: [" << docTemplateDir << "]." << std::endl; + } + else if (i < argc) { pluginFilestoLoad.push_back(std::string(argv[i])); } + } + + OpenViBE::CKernelLoader kernelLoader; + + std::cout << "[ INF ] Created kernel loader, trying to load kernel module" << std::endl; + OpenViBE::CString errorMsg; +#if defined TARGET_OS_Windows + const OpenViBE::CString kernelFile = OpenViBE::Directories::getLibDir() + "/openvibe-kernel.dll"; +#elif defined TARGET_OS_Linux + const OpenViBE::CString kernelFile = OpenViBE::Directories::getLibDir() + "/libopenvibe-kernel.so"; +#elif defined TARGET_OS_MacOS + const OpenViBE::CString kernelFile = OpenViBE::Directories::getLibDir() + "/libopenvibe-kernel.dylib"; +#endif + + if (!kernelLoader.load(kernelFile, &errorMsg)) { std::cout << "[ FAILED ] Error loading kernel (" << errorMsg << ")" << " from [" << kernelFile << "]\n"; } + else + { + std::cout << "[ INF ] Kernel module loaded, trying to get kernel descriptor" << std::endl; + OpenViBE::Kernel::IKernelDesc* kernelDesc = nullptr; + kernelLoader.initialize(); + kernelLoader.getKernelDesc(kernelDesc); + if (!kernelDesc) { std::cout << "[ FAILED ] No kernel descriptor" << std::endl; } + else + { + std::cout << "[ INF ] Got kernel descriptor, trying to create kernel" << std::endl; + + OpenViBE::Kernel::IKernelContext* ctx = kernelDesc->createKernel("plugin-inspector", OpenViBE::Directories::getDataDir() + "/kernel/openvibe.conf"); + if (!ctx) { std::cout << "[ FAILED ] No kernel created by kernel descriptor" << std::endl; } + else + { + ctx->initialize(); + OpenViBE::Toolkit::initialize(*ctx); + + OpenViBE::Kernel::IConfigurationManager& configurationManager = ctx->getConfigurationManager(); + + if (pluginFilestoLoad.empty()) { ctx->getPluginManager().addPluginsFromFiles(configurationManager.expand("${Kernel_Plugins}")); } + else + { + for (const std::string& file : pluginFilestoLoad) + { + ctx->getPluginManager().addPluginsFromFiles(configurationManager.expand(OpenViBE::CString(file.c_str()))); + } + } + + ctx->getLogManager() << OpenViBE::Kernel::LogLevel_Info << "[ INF ] Generate boxes templates in [" << docTemplateDir << "]\n"; + + OpenViBE::PluginInspector::CPluginObjectDescEnumBoxTemplateGenerator boxTemplateGenerator(*ctx, std::string(docTemplateDir)); + if (!boxTemplateGenerator.initialize()) + { + std::cout << "[ FAILED ] Could not initialize boxTemplateGenerator" << std::endl; + return 0; + } + boxTemplateGenerator.enumeratePluginObjectDesc(OV_ClassId_Plugins_BoxAlgorithmDesc); + + if (!ignoreMetaboxes) + { + ctx->getLogManager() << OpenViBE::Kernel::LogLevel_Info << "[ INF ] Generate metaboxes templates in [" << docTemplateDir << "]\n"; + // Do not load the binary metaboxes as they would only be duplicated + //ctx->getScenarioManager().unregisterScenarioImporter(OV_ScenarioImportContext_OnLoadMetaboxImport, ".mbb"); + configurationManager.addOrReplaceConfigurationToken("Kernel_Metabox", "${Path_Data}/metaboxes/"); + + ctx->getMetaboxManager().addMetaboxesFromFiles(configurationManager.expand("${Kernel_Metabox}")); + + // Create a list of metabox descriptors from the Map provided by the MetaboxLoader and enumerate all algorithms within + std::vector metaboxPluginObjectDescriptors; + OpenViBE::CIdentifier id; + while ((id = ctx->getMetaboxManager().getNextMetaboxObjectDescIdentifier(id)) != OpenViBE::CIdentifier::undefined()) + { + metaboxPluginObjectDescriptors.push_back(ctx->getMetaboxManager().getMetaboxObjectDesc(id)); + } + boxTemplateGenerator.enumeratePluginObjectDesc(metaboxPluginObjectDescriptors); + } + + if (!boxTemplateGenerator.uninitialize()) + { + std::cout << "[ FAILED ] Could not uninitialize boxTemplateGenerator" << std::endl; + return 0; + } + ctx->getLogManager() << OpenViBE::Kernel::LogLevel_Info << "Application terminated, releasing allocated objects \n"; + + OpenViBE::Toolkit::uninitialize(*ctx); + + kernelDesc->releaseKernel(ctx); + } + } + kernelLoader.uninitialize(); + kernelLoader.unload(); + } + + return 0; +} diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/CMakeLists.txt new file mode 100755 index 0000000..a250f6a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/CMakeLists.txt @@ -0,0 +1,64 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +PROJECT(openvibe-scenario-player) + +# ---------------------- +# Project variables +# ---------------------- +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +# ---------------------- +# Add executable +# ---------------------- +ADD_DEFINITIONS( -DPROJECT_VERSION="${PROJECT_VERSION}" ) +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp) +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +# ---------------------- +# External dependecies +# ---------------------- + +# To be done after add executable because FindOpenViBEXXX files need a target name +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindThirdPartyBoost") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommand.cpp b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommand.cpp new file mode 100644 index 0000000..801b1bc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommand.cpp @@ -0,0 +1,157 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include "ovspCKernelFacade.h" +#include "ovspCCommand.h" + +namespace OpenViBE { +EPlayerReturnCodes SInitCmd::execute(CKernelFacade& kernelFacade) const +{ + std::cout << "About to execute:" << std::endl << *this << std::endl; + return kernelFacade.initialize(); +} + +void SInitCmd::doPrint(std::ostream& os) const +{ + os << "command name: InitCommand" << std::endl; + os << "Benchmark: " << (this->benchmark ? std::to_string(this->benchmark.get()) : "not set") << std::endl; +} + +EPlayerReturnCodes SLoadKernelCmd::execute(CKernelFacade& kernelFacade) const +{ + std::cout << "About to execute:" << std::endl << *this << std::endl; + // default config file is an empty one so it is not problem to give it directly as param + return kernelFacade.loadKernel(*this); +} + +void SLoadKernelCmd::doPrint(std::ostream& os) const +{ + os << "command name: LoadKernelCommand" << std::endl; + os << "ConfigurationFile: " << (this->configFile ? this->configFile.get() : "not set") << std::endl; +} + +EPlayerReturnCodes SLoadScenarioCmd::execute(CKernelFacade& kernelFacade) const +{ + std::cout << "About to execute:" << std::endl << *this << std::endl; + + if (!this->scenarioName || !this->scenarioFile) + { + std::cerr << "Missing required arguments for command" << std::endl; + return EPlayerReturnCodes::MissingMandatoryArgument; + } + + return kernelFacade.loadScenario(*this); +} + +void SLoadScenarioCmd::doPrint(std::ostream& os) const +{ + os << "command name: LoadScenarioCommand" << std::endl; + os << "ScenarioName: " << (this->scenarioName ? this->scenarioName.get() : "not set") << std::endl; + os << "ScenarioFile: " << (this->scenarioFile ? this->scenarioFile.get() : "not set") << std::endl; +} + +EPlayerReturnCodes SUpdateScenarioCmd::execute(CKernelFacade& kernelFacade) const +{ + std::cout << "About to execute:" << std::endl << *this << std::endl; + + if (!this->scenarioName || !this->scenarioFile) + { + std::cerr << "Missing required arguments for command" << std::endl; + return EPlayerReturnCodes::MissingMandatoryArgument; + } + + return kernelFacade.updateScenario(*this); +} + +void SUpdateScenarioCmd::doPrint(std::ostream& os) const +{ + os << "command name: UpdateScenarioCommand" << std::endl; + os << "ScenarioName: " << (this->scenarioName ? this->scenarioName.get() : "not set") << std::endl; + os << "ScenarioFile: " << (this->scenarioFile ? this->scenarioFile.get() : "not set") << std::endl; +} + +EPlayerReturnCodes SResetCmd::execute(CKernelFacade& /*kernelFacade*/) const +{ + // to be implemented + std::cout << "About to execute:" << std::endl << *this << std::endl << "Not implemented yet" << std::endl; + return EPlayerReturnCodes::Success; +} + +void SResetCmd::doPrint(std::ostream& os) const { os << "command name: ResetCommand" << std::endl; } + +EPlayerReturnCodes SRunScenarioCmd::execute(CKernelFacade& kernelFacade) const +{ + std::cout << "About to execute:" << std::endl << *this << std::endl; + if (!this->scenarioList) + { + std::cerr << "Missing required arguments for command: ScenarioList" << std::endl; + return EPlayerReturnCodes::MissingMandatoryArgument; + } + return kernelFacade.runScenarioList(*this); +} + +void SRunScenarioCmd::doPrint(std::ostream& os) const +{ + os << "command name: SRunScenarioCmd" << std::endl; + + os << "ScenarioList:"; + if (this->scenarioList) { for (auto& scenario : this->scenarioList.get()) { os << " " << scenario; } } + else { os << " not set"; } + os << std::endl; + + os << "PlayMode: "; + if (this->playMode) + { + const std::string modeAsString = (this->playMode == EPlayerPlayMode::Fastfoward) ? "fastforward" : "standard"; + os << modeAsString; + } + else { os << "not set"; } + os << std::endl; + + os << "MaximumExecutionTime: " << (this->maximumExecutionTime ? std::to_string(this->maximumExecutionTime.get()) : "not set") << std::endl; + + os << "TokenList:"; + if (this->tokenList) { for (auto& token : this->tokenList.get()) { os << " (" << token.first << "," << token.second << ")"; } } + else { os << " not set"; } + os << std::endl; +} + +EPlayerReturnCodes SSetupScenarioCmd::execute(CKernelFacade& kernelFacade) const +{ + std::cout << "About to execute:" << std::endl << *this << std::endl; + if (!this->scenarioName) + { + std::cerr << "Missing required arguments for command" << std::endl; + return EPlayerReturnCodes::MissingMandatoryArgument; + } + return kernelFacade.setupScenario(*this); +} + +void SSetupScenarioCmd::doPrint(std::ostream& os) const +{ + os << "command name: SSetupScenarioCmd" << std::endl; + os << "ScenarioName: " << (this->scenarioName ? this->scenarioName.get() : "not set") << std::endl; + os << "TokenList:"; + if (this->tokenList) { for (auto& token : this->tokenList.get()) { os << " (" << token.first << "," << token.second << ")"; } } + else { os << " not set"; } + os << std::endl; +} +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommand.h b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommand.h new file mode 100644 index 0000000..b9b0efa --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommand.h @@ -0,0 +1,206 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +#include "ovspICommand.h" +#include +#include + +namespace OpenViBE { +/** +* \struct SInitCmd +* \author cgarraud (INRIA) +* \date 2016-01-26 +* \brief Command that drives the initialization of the tool +* \ingroup ScenarioPlayer +* +* InitCommand class contains the following properties: +* - Benchmark: Flag to enable benchmark on execute command (optional). +* +*/ +struct SInitCmd final : SCommand +{ + // List of properties + boost::optional benchmark; + + EPlayerReturnCodes execute(CKernelFacade& kernelFacade) const override; + +protected: + void doPrint(std::ostream& os) const override; +}; + + +/** +* \struct SLoadKernelCmd +* \author cgarraud (INRIA) +* \date 2016-01-26 +* \brief Command that drives kernel loading +* \ingroup ScenarioPlayer +* +* LoadKernelCommand contains the following properties: +* - ConfigurationFile: Path to kernel configuration file (optional) +* . +* +*/ +struct SLoadKernelCmd final : SCommand +{ + // List of properties + boost::optional configFile; + + EPlayerReturnCodes execute(CKernelFacade& kernelFacade) const override; + +protected: + + void doPrint(std::ostream& os) const override; +}; + +/** +* \struct SLoadScenarioCmd +* \author cgarraud (INRIA) +* \date 2016-01-26 +* \brief Command that drives scenario loading +* \ingroup ScenarioPlayer +* +* LoadScenarioCommand contains the following properties: +* - ScenarioFile: Path to xml scenario file (mandatory) +* - ScenarioName: Name of the scenario (mandatory) +* . +* +*/ +struct SLoadScenarioCmd final : SCommand +{ + // List of properties + boost::optional scenarioFile; + boost::optional scenarioName; + + EPlayerReturnCodes execute(CKernelFacade& kernelFacade) const override; + +protected: + + void doPrint(std::ostream& os) const override; +}; + +/** +* \struct SUpdateScenarioCmd +* \author criou (INRIA) +* \date 2018-04-16 +* \brief Command that drives scenario update and export +* \ingroup ScenarioPlayer +* +* UpdateScenarioCommand contains the following properties: +* - ScenarioFile: Path to xml scenario file (mandatory) +* . +* +*/ +struct SUpdateScenarioCmd final : SCommand +{ + // List of properties + boost::optional scenarioFile; + boost::optional scenarioName; + + EPlayerReturnCodes execute(CKernelFacade& kernelFacade) const override; + +protected: + + void doPrint(std::ostream& os) const override; +}; + +/** +* \struct SResetCmd +* \author cgarraud (INRIA) +* \date 2016-01-26 +* \brief Command that drives tool reset to its initial state +* \ingroup ScenarioPlayer +*/ +struct SResetCmd final : SCommand +{ + EPlayerReturnCodes execute(CKernelFacade& kernelFacade) const override; + +protected: + + void doPrint(std::ostream& os) const override; +}; + +/** +* \struct SRunScenarioCmd +* \author cgarraud (INRIA) +* \date 2016-01-26 +* \brief Command that drives the execution of a list of scenarios +* \ingroup ScenarioPlayer +* +* SRunScenarioCmd contains the following properties: +* - ScenarioList: Names of scenario that must be executed (mandatory) +* - PlayMode: 0 for standard, 1 for fastforward (optional) +* - MaximumExecutionTime: Scenarios playing execution time limit (optional) +* - TokenList: List of global (token,value) pairs (optional) +* . +* +*/ +struct SRunScenarioCmd final : SCommand +{ + using Token = std::pair; + + // List of properties + boost::optional> scenarioList; + boost::optional playMode; + boost::optional maximumExecutionTime; + boost::optional> tokenList; + + EPlayerReturnCodes execute(CKernelFacade& kernelFacade) const override; + +protected: + + void doPrint(std::ostream& os) const override; +}; + +/** +* \struct SSetupScenarioCmd +* \author cgarraud (INRIA) +* \date 2016-01-26 +* \brief Command that drives the setup of a scenario +* \ingroup ScenarioPlayer +* +* SSetupScenarioCmd contains the following properties: +* - ScenarioName: name of the scenario to setup (mandatory) +* - TokenList: List of scenario specific tokens (optional) +* . +* +* The token list overwrites the previous token list if the command was already +* called on the same scenario (note that an empty token list is allowed). +* +*/ +struct SSetupScenarioCmd final : SCommand +{ + using Token = std::pair; + + // List of properties + boost::optional scenarioName; + boost::optional> tokenList; + + + EPlayerReturnCodes execute(CKernelFacade& kernelFacade) const override; + +protected: + + void doPrint(std::ostream& os) const override; +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommandFileParser.cpp b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommandFileParser.cpp new file mode 100644 index 0000000..8db8220 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommandFileParser.cpp @@ -0,0 +1,336 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include "ovspCCommand.h" +#include "ovspCCommandFileParser.h" + +namespace OpenViBE { + +// should be moved in a utility class/file +std::string CommandFileParser::trim(const std::string& str) +{ + // remove leading and trailing space + // no use of regex here cause it might be too slow + auto begin = str.find_first_not_of(" \t"), end = str.find_last_not_of(" \t"); + if (begin == std::string::npos) { begin = 0; } + if (end == std::string::npos) { end = str.size() - 1; } + return str.substr(begin, end - begin + 1); +} + +// should be moved in a utility class/file +std::pair CommandFileParser::tokenize(const std::string& str) +{ + // given a string of type "token : value", return a pair of (token,value) + // split method is not used because only the first delimiter is of interest + const auto split = str.find_first_of(':'); + + if (split == std::string::npos) { throw std::runtime_error("Impossible to convert " + str + " to token/value pair"); } + + auto token = trim(str.substr(0, split)); + auto val = trim(str.substr(split + 1, str.size() - split - 1)); + + return std::make_pair(token, val); +} + +// should be moved in a utility class/file +std::vector CommandFileParser::split(const std::string& str, const char delimiter) +{ + std::vector vec; + size_t currentIdx = 0; + size_t delimiterIdx = str.find(delimiter); + + auto trimmed = trim(str.substr(currentIdx, delimiterIdx)); + if (!trimmed.empty()) { vec.push_back(trimmed); } + + while (delimiterIdx != std::string::npos) + { + // abc,cde,fgh + // ^ -> current index points to the first element after a match + // ^ -> delimiter index points to next match + currentIdx = delimiterIdx + 1; + delimiterIdx = str.find(delimiter, currentIdx); + + trimmed = trim(str.substr(currentIdx, delimiterIdx - currentIdx)); + + if (!trimmed.empty()) { vec.push_back(trimmed); } + } + return vec; +} + +// should be moved in a utility class/file +bool CommandFileParser::toBool(const std::string& str) +{ + // try to keep same behavior as stoi or stol + + std::string lowerStr; + lowerStr.reserve(str.size()); + std::transform(str.begin(), str.end(), lowerStr.begin(), tolower); + + bool result; + if (str == "false" || str == "0") { result = false; } + else if (str == "true" || str == "1") { result = true; } + else { throw std::runtime_error("Impossible to convert " + str + " to bool"); } + return result; +} + +// should be moved in a utility class/file +// input is expected to be trimmed (by a call to tolenize for example) +std::vector CommandFileParser::toList(const std::string& str) +{ + std::vector vec; + // {token1, token2, token3 ...} pattern expected + if (str.size() >= 3 && str[0] == '{' && str[str.size() - 1] == '}') { vec = split(str.substr(1, str.length() - 2), ','); } + else { throw std::runtime_error("Impossible to convert " + str + " to list"); } + + return vec; +} + +// should be moved in a utility class/file +// part of this function duplicates code from ProgramOptions.hpp +std::vector CommandFileParser::toTokenList(const std::string& str) +{ + std::vector vec; + + for (auto& rawToken : toList(str)) + { + // rawToken is expected to be trimmed + + const auto split = rawToken.find_first_of(':'); + const auto size = rawToken.size(); + + // (a:b) pattern expected + // minimal regex std::regex("\\(.+:.+\\)") + if (!(size >= 5 && rawToken[0] == '(' && rawToken[size - 1] == ')') || split == std::string::npos) + { + throw std::runtime_error("Failed to parse token pair from value: " + rawToken); + } + + Token token; + token.first = trim(rawToken.substr(1, split - 1)); + + // magic 2 numbers is because substr takes a length as second parameter + // 2 = remove the last ) + account for the first one + token.second = trim(rawToken.substr(split + 1, size - split - 2)); + + vec.push_back(token); + } + + return vec; +} + +void CommandFileParser::initialize() +{ + // using a callback mechanism allows us to implement the core parse() method + // very easily (no need to put some if/else blocks everywhere depending on which command is encountered) + m_callbacks["Init"] = std::bind(&CommandFileParser::initCommandCb, this, std::placeholders::_1); + m_callbacks["Reset"] = std::bind(&CommandFileParser::resetCommandCb, this, std::placeholders::_1); + m_callbacks["LoadKernel"] = std::bind(&CommandFileParser::loadKernelCommandCb, this, std::placeholders::_1); + m_callbacks["LoadScenario"] = std::bind(&CommandFileParser::loadScenarioCommandCb, this, std::placeholders::_1); + m_callbacks["SetupScenario"] = std::bind(&CommandFileParser::setupScenarioCommandCb, this, std::placeholders::_1); + m_callbacks["RunScenario"] = std::bind(&CommandFileParser::runScenarioCommandCb, this, std::placeholders::_1); +} + +void CommandFileParser::uninitialize() +{ + m_callbacks.clear(); + m_cmdList.clear(); +} + +EPlayerReturnCodes CommandFileParser::parse() +{ + std::ifstream fileStream(m_cmdFile); + + if (!fileStream.is_open()) + { + std::cerr << "ERROR: impossible to open file at location: " << m_cmdFile << std::endl; + return EPlayerReturnCodes::OpeningFileFailure; + } + + std::string line; + bool isFillingSection{ false }; + std::vector sectionContent; + std::string sectionTag; + + while (std::getline(fileStream, line)) + { + auto trimmedLine = trim(line); + const auto size = trimmedLine.size(); + + // [a] pattern expected + // minimal regex std::regex("^(?!\\#)\\[.+\\])") + if (size >= 3 && trimmedLine[0] == '[' + && trimmedLine[size - 1] == ']') + { + if (isFillingSection) // flush the section that was beeing filled + { + const auto errorCode = this->flush(sectionTag, sectionContent); + if (errorCode != EPlayerReturnCodes::Success) { return errorCode; } + } + + // use of regex to be confident on tag structure + // magic 2 numbers is because substr takes length as second parameter + // 2 = remove the last ] + account for the first one + sectionTag = trimmedLine.substr(1, size - 2); + + if (m_callbacks.find(sectionTag) == m_callbacks.end()) + { + std::cerr << "ERROR: Unknown command = " << sectionTag << std::endl; + return EPlayerReturnCodes::ParsingCommandFailure; + } + + isFillingSection = true; + sectionContent.clear(); + } + else { sectionContent.push_back(trimmedLine); } + } + + if (isFillingSection) + { + const auto errorCode = this->flush(sectionTag, sectionContent); + if (errorCode != EPlayerReturnCodes::Success) { return errorCode; } + } + return EPlayerReturnCodes::Success; +} + +EPlayerReturnCodes CommandFileParser::flush(const std::string& sectionTag, const std::vector& sectionContent) +{ + try // try block here as some conversions are made with the stl in the callback and might throw + { + const auto returnCode = m_callbacks[sectionTag](sectionContent); + if (returnCode != EPlayerReturnCodes::Success) { return returnCode; } + } + catch (const std::exception& e) + { + std::cerr << "ERROR: Caught exception while parsing command = " << sectionTag << std::endl; + std::cerr << "ERROR: Exception: " << e.what() << std::endl; + return EPlayerReturnCodes::ParsingCommandFailure; + } + return EPlayerReturnCodes::Success; +} + +EPlayerReturnCodes CommandFileParser::initCommandCb(const std::vector& sectionContent) +{ + std::shared_ptr command = std::make_shared(); + + for (const auto& line : sectionContent) + { + // lines are expected to be trimmed + // a:b pattern expected + // minimal regex std::regex("^(?!\\#).+:.+") + if (!line.empty() && line[0] != '#') + { + auto param = tokenize(line); + + if (param.first == "Benchmark") { command->benchmark = toBool(param.second); } + else { std::cout << "WARNING: Unknown parameter for Init command: " << param.first << std::endl; } + } + } + m_cmdList.push_back(command); + return EPlayerReturnCodes::Success; +} + +EPlayerReturnCodes CommandFileParser::resetCommandCb(const std::vector& /*sectionContent*/) +{ + const std::shared_ptr command = std::make_shared(); + m_cmdList.push_back(command); + return EPlayerReturnCodes::Success; +} + +EPlayerReturnCodes CommandFileParser::loadKernelCommandCb(const std::vector& sectionContent) +{ + std::shared_ptr command = std::make_shared(); + + // cf. initCommandCb + for (const auto& line : sectionContent) + { + if (!line.empty() && line[0] != '#') + { + auto param = tokenize(line); + if (param.first == "ConfigurationFile") { command->configFile = param.second; } + else { std::cout << "WARNING: Unknown parameter for LoadKernel command: " << param.first << std::endl; } + } + } + m_cmdList.push_back(command); + return EPlayerReturnCodes::Success; +} + +EPlayerReturnCodes CommandFileParser::loadScenarioCommandCb(const std::vector& sectionContent) +{ + std::shared_ptr command = std::make_shared(); + + // cf. initCommandCb + for (const auto& line : sectionContent) + { + if (!line.empty() && line[0] != '#') + { + auto param = tokenize(line); + + if (param.first == "ScenarioName") { command->scenarioName = param.second; } + else if (param.first == "ScenarioFile") { command->scenarioFile = param.second; } + else { std::cout << "WARNING: Unknown parameter for LoadScenario command: " << param.first << std::endl; } + } + } + m_cmdList.push_back(command); + return EPlayerReturnCodes::Success; +} + +EPlayerReturnCodes CommandFileParser::setupScenarioCommandCb(const std::vector& sectionContent) +{ + std::shared_ptr command = std::make_shared(); + + // cf. initCommandCb + for (const auto& line : sectionContent) + { + if (!line.empty() && line[0] != '#') + { + auto param = tokenize(line); + + if (param.first == "ScenarioName") { command->scenarioName = param.second; } + else if (param.first == "TokenList") { command->tokenList = toTokenList(param.second); } + else { std::cout << "WARNING: Unknown parameter for SetupScenario command: " << param.first << std::endl; } + } + } + m_cmdList.push_back(command); + return EPlayerReturnCodes::Success; +} + +EPlayerReturnCodes CommandFileParser::runScenarioCommandCb(const std::vector& sectionContent) +{ + std::shared_ptr command = std::make_shared(); + + // cf. initCommandCb + for (const auto& line : sectionContent) + { + if (!line.empty() && line[0] != '#') + { + auto param = tokenize(line); + + if (param.first == "ScenarioList") { command->scenarioList = toList(param.second); } + else if (param.first == "PlayMode") { command->playMode = EPlayerPlayMode(std::stoi(param.second)); } + else if (param.first == "MaximumExecutionTime") { command->maximumExecutionTime = std::stod(param.second); } + else if (param.first == "TokenList") { command->tokenList = (toTokenList(param.second)); } + else { std::cout << "WARNING: Unknown parameter for RunScenario command: " << param.first << std::endl; } + } + } + m_cmdList.push_back(command); + return EPlayerReturnCodes::Success; +} +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommandFileParser.h b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommandFileParser.h new file mode 100644 index 0000000..ebaadad --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommandFileParser.h @@ -0,0 +1,101 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +#include "ovsp_defines.h" +#include "ovspICommandParser.h" +#include +#include +#include +#include +#include + +namespace OpenViBE { +/** +* \class CommandFileParser +* \author cgarraud (INRIA) +* \date 2016-01-27 +* \brief Parser implementation that parses command a file +* \ingroup ScenarioPlayer +* +* The current implementation retrieves the list of commands from a file. +* +* Input file format requirements: +* - Command names are defined within brackets [InitCommand] on a single line +* - Each command parameter is defined on a single line below the command name: +* + Single value parameters are defined as: parameterName: value +* + Simple list parameters are defined as: parameterName: {val1,val2,...} +* + Token list parameters are defined as: parameterName: { (token1:val1),(token2:val2) } (no ',' authorized in (token, value) pair) +* . +* . +* +* \todo The implementation uses a lot of string utility functions that need more +* testing +* +* \note Use of regex would simplify the implementation but boost::regex is not header-only and std::regex not implemented in gcc 4.8 +* +*/ +class CommandFileParser final : public ICommandParser +{ +public: + + /** + * + * \brief Constructor + * \param[in] file path to the command file + * + */ + explicit CommandFileParser(const std::string& file) : m_cmdFile(file) { } + + void initialize() override; + void uninitialize() override; + + std::vector> getCommandList() const override { return m_cmdList; } + + EPlayerReturnCodes parse() override; + +private: + + using CallbackType = std::function)>; + using Token = std::pair; + + static std::string trim(const std::string& str); + static std::pair tokenize(const std::string& str); + static std::vector split(const std::string& str, char delimiter); + static bool toBool(const std::string& str); + static std::vector toList(const std::string& str); + static std::vector toTokenList(const std::string& str); + + EPlayerReturnCodes flush(const std::string& sectionTag, const std::vector& sectionContent); + + EPlayerReturnCodes initCommandCb(const std::vector& sectionContent); + EPlayerReturnCodes resetCommandCb(const std::vector& sectionContent); + EPlayerReturnCodes loadKernelCommandCb(const std::vector& sectionContent); + EPlayerReturnCodes loadScenarioCommandCb(const std::vector& sectionContent); + EPlayerReturnCodes setupScenarioCommandCb(const std::vector& sectionContent); + EPlayerReturnCodes runScenarioCommandCb(const std::vector& sectionContent); + + std::string m_cmdFile; + std::vector> m_cmdList; + std::map m_callbacks; +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommandLineOptionParser.cpp b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommandLineOptionParser.cpp new file mode 100644 index 0000000..efa1ebd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommandLineOptionParser.cpp @@ -0,0 +1,128 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include "ovspCCommand.h" +#include "ovspCCommandLineOptionParser.h" + +namespace OpenViBE { +CommandLineOptionParser::CommandLineOptionParser(ProgramOptionParser& parser) : m_parser(parser) { } + +void CommandLineOptionParser::initialize() { } // nothing to do +void CommandLineOptionParser::uninitialize() { m_cmdList.clear(); } + +std::vector> CommandLineOptionParser::getCommandList() const { return m_cmdList; } + +EPlayerReturnCodes CommandLineOptionParser::parse() +{ + // parsing consists of building a straightfoward command workflow according to command-line + // options. + + // commands have to be pushed in the right order + + // choose a dumb name for the scenario + std::string scenarioName = "express-scenario"; + + // an init command is always needed + m_cmdList.push_back(std::make_shared()); + + + // workflow must at least load the kernel + std::shared_ptr kernelCmd = std::make_shared(); + + if (m_parser.hasOption("config-file")) // optional + { + kernelCmd->configFile = m_parser.getOptionValue("config-file"); + } + + m_cmdList.push_back(kernelCmd); + + // scenario loading is a mandatory step + std::shared_ptr scenarioCmd = std::make_shared(); + + if (m_parser.hasOption("scenario-file")) // mandatory option + { + scenarioCmd->scenarioFile = m_parser.getOptionValue("scenario-file"); + + // set dumb name as it used to recognize scenario in the application + scenarioCmd->scenarioName = scenarioName; + } + else + { + std::cerr << "ERROR: mandatory option 'scenario-file' not set" << std::endl; + return EPlayerReturnCodes::MissingMandatoryArgument; + } + + m_cmdList.push_back(scenarioCmd); + + + // scenario update option + std::shared_ptr updateScenarioCmd = std::make_shared(); + + if (m_parser.hasOption("updated-scenario-file")) + { + // do not play scenario, just update it. + updateScenarioCmd->scenarioFile = m_parser.getOptionValue("updated-scenario-file"); + + // set dumb name as it used to recognize scenario in the application + updateScenarioCmd->scenarioName = scenarioName; + + m_cmdList.push_back(updateScenarioCmd); + } + else + { + // check if some scenario setup information has been set + if (m_parser.hasOption("ds")) + { + std::shared_ptr setupCmd = std::make_shared(); + setupCmd->scenarioName = scenarioName; + setupCmd->tokenList = m_parser.getOptionValue>("ds"); + + m_cmdList.push_back(setupCmd); + } + + // last command in the workflow is the run command + std::shared_ptr runCmd = std::make_shared(); + runCmd->scenarioList = std::vector{ scenarioName }; + + if (m_parser.hasOption("play-mode")) + { + const auto playMode = m_parser.getOptionValue("play-mode"); + + if (playMode != "ff" && playMode != "std") + { + std::cerr << "ERROR: option 'play-mode' must be ff or std" << std::endl; + return EPlayerReturnCodes::BadArg; + } + + // permissive code here + // any other entry than ff leads to standard mode... + runCmd->playMode = ((playMode == "ff") ? EPlayerPlayMode::Fastfoward : EPlayerPlayMode::Standard); + } + + if (m_parser.hasOption("max-time")) { runCmd->maximumExecutionTime = m_parser.getOptionValue("max-time"); } + if (m_parser.hasOption("dg")) { runCmd->tokenList = m_parser.getOptionValue>("dg"); } + + m_cmdList.push_back(runCmd); + } + + return EPlayerReturnCodes::Success; +} +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommandLineOptionParser.h b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommandLineOptionParser.h new file mode 100644 index 0000000..62695c2 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCCommandLineOptionParser.h @@ -0,0 +1,63 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +#include "ovsp_defines.h" +#include "ovspICommandParser.h" + +namespace OpenViBE { +/** +* \class CommandLineOptionParser +* \author cgarraud (INRIA) +* \date 2016-01-27 +* \brief Parser implementation that parses command from command-line arguments +* \ingroup ScenarioPlayer +* +* The current implementation retrieves the options from a ProgramOptions parser and +* simply builds the commands from the parsed options. +* +*/ +class CommandLineOptionParser final : public ICommandParser +{ +public: + + /** + * + * \brief Constructor + * \param[in] parser Specific instantiation of ProgramOptions parser + * + */ + explicit CommandLineOptionParser(ProgramOptionParser& parser); + + void initialize() override; + void uninitialize() override; + + std::vector> getCommandList() const override; + + EPlayerReturnCodes parse() override; + +private: + + ProgramOptionParser& m_parser; + std::vector> m_cmdList; +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCKernelFacade.cpp b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCKernelFacade.cpp new file mode 100755 index 0000000..9c289bd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCKernelFacade.cpp @@ -0,0 +1,364 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include "ovspCCommand.h" +#include "ovsp_base.h" +#include "ovspCKernelFacade.h" + +#include + +#include +#include +#include +#include + +namespace OpenViBE { + +using TokenList = std::vector>; + +static void setConfigTokens(Kernel::IConfigurationManager& configsManager, const TokenList& tokens) +{ + for (const auto& token : tokens) { configsManager.addOrReplaceConfigurationToken(token.first.c_str(), token.second.c_str()); } +} + +struct CKernelFacade::SKernelFacadeImpl +{ + CKernelLoader loader; + Kernel::IKernelContext* ctx = nullptr; + std::map scenarios; + std::map scenarioTokens; +}; + +CKernelFacade::CKernelFacade() : m_impl(new SKernelFacadeImpl()) { } + +// The destructor is needed in the .cpp file to implement pimpl idiom +// with unique_ptr. This is due to the fact that Kernel facade dtor +// has to call unique_ptr deleter function that calls the detete function +// on KernelFacadeImpl. Therefore it needs to know KernelFacadeImpl implementation. +CKernelFacade::~CKernelFacade() +{ + this->unloadKernel(); + uninitialize(); +} + +EPlayerReturnCodes CKernelFacade::loadKernel(const SLoadKernelCmd& command) const +{ + if (m_impl->ctx) + { + std::cout << "WARNING: The kernel is already loaded" << std::endl; + return EPlayerReturnCodes::Success; + } + +#if defined TARGET_OS_Windows + const CString kernelFile = Directories::getLibDir() + "/openvibe-kernel.dll"; +#elif defined TARGET_OS_Linux + const CString kernelFile = Directories::getLibDir() + "/libopenvibe-kernel.so"; +#elif defined TARGET_OS_MacOS + const CString kernelFile = Directories::getLibDir() + "/libopenvibe-kernel.dylib"; +#endif + + CKernelLoader& kernelLoader = m_impl->loader; + CString error; + + if (!kernelLoader.load(kernelFile, &error)) + { + std::cerr << "ERROR: impossible to load kernel from file located at: " << kernelFile << std::endl; + return EPlayerReturnCodes::KernelLoadingFailure; + } + + kernelLoader.initialize(); + + Kernel::IKernelDesc* kernelDesc = nullptr; + kernelLoader.getKernelDesc(kernelDesc); + + if (!kernelDesc) + { + std::cerr << "ERROR: impossible to retrieve kernel descriptor " << std::endl; + return EPlayerReturnCodes::KernelInvalidDesc; + } + + CString configFile; + + if (command.configFile && !command.configFile.get().empty()) { configFile = command.configFile.get().c_str(); } + else { configFile = CString(Directories::getDataDir() + "/kernel/openvibe.conf"); } + + + Kernel::IKernelContext* ctx = kernelDesc->createKernel("scenario-player", configFile); + + if (!ctx) + { + std::cerr << "ERROR: impossible to create kernel context " << std::endl; + return EPlayerReturnCodes::KernelInvalidDesc; + } + + ctx->initialize(); + m_impl->ctx = ctx; + Toolkit::initialize(*ctx); + + Kernel::IConfigurationManager& configurationManager = ctx->getConfigurationManager(); + ctx->getPluginManager().addPluginsFromFiles(configurationManager.expand("${Kernel_Plugins}")); + ctx->getMetaboxManager().addMetaboxesFromFiles(configurationManager.expand("${Kernel_Metabox}")); + + return EPlayerReturnCodes::Success; +} + +EPlayerReturnCodes CKernelFacade::unloadKernel() const +{ + if (m_impl->ctx) + { + // not releasing the scenario before releasing the kernel + // causes a segfault on linux + auto& scenarioManager = m_impl->ctx->getScenarioManager(); + for (auto& scenarioPair : m_impl->scenarios) { scenarioManager.releaseScenario(scenarioPair.second); } + + + Toolkit::uninitialize(*m_impl->ctx); + // m_impl->ctx->uninitialize(); + Kernel::IKernelDesc* kernelDesc = nullptr; + m_impl->loader.getKernelDesc(kernelDesc); + kernelDesc->releaseKernel(m_impl->ctx); + m_impl->ctx = nullptr; + } + + m_impl->loader.uninitialize(); + m_impl->loader.unload(); + + return EPlayerReturnCodes::Success; +} + +EPlayerReturnCodes CKernelFacade::loadScenario(const SLoadScenarioCmd& command) const +{ + assert(command.scenarioFile && command.scenarioName); + + if (!m_impl->ctx) + { + std::cerr << "ERROR: Kernel is not loaded" << std::endl; + return EPlayerReturnCodes::KernelInternalFailure; + } + + const std::string scenarioFile = command.scenarioFile.get(); + const std::string scenarioName = command.scenarioName.get(); + + CIdentifier scenarioID; + auto& scenarioManager = m_impl->ctx->getScenarioManager(); + + if (!scenarioManager.importScenarioFromFile(scenarioID, scenarioFile.c_str(), OVP_GD_ClassId_Algorithm_XMLScenarioImporter)) + { + std::cerr << "ERROR: failed to create scenario " << std::endl; + return EPlayerReturnCodes::KernelInternalFailure; + } + + scenarioManager.getScenario(scenarioID).addAttribute(OV_AttributeId_ScenarioFilename, scenarioFile.c_str()); + + const auto it = m_impl->scenarios.find(scenarioName); + if (it != m_impl->scenarios.end()) { scenarioManager.releaseScenario(it->second); } + + m_impl->scenarios[scenarioName] = scenarioID; + + return EPlayerReturnCodes::Success; +} + +EPlayerReturnCodes CKernelFacade::updateScenario(const SUpdateScenarioCmd& command) const +{ + assert(command.scenarioFile && command.scenarioName); + + auto& scenarioManager = m_impl->ctx->getScenarioManager(); + + const auto scenarioName = command.scenarioName.get(); + const auto scenarioFile = command.scenarioFile.get(); + + if (m_impl->scenarios.find(scenarioName) == m_impl->scenarios.end()) + { + std::cerr << "ERROR: Trying to update a not loaded scenario " << scenarioName << std::endl; + return EPlayerReturnCodes::ScenarioNotLoaded; + } + + auto& scenario = scenarioManager.getScenario(m_impl->scenarios[scenarioName]); + + // check for boxes to be updated + // scenario.checkBoxesRequiringUpdate(); + + // update boxes to be updated + CIdentifier* listID = nullptr; + size_t elemCount = 0; + scenario.getOutdatedBoxIdentifierList(&listID, &elemCount); + for (size_t i = 0; i < elemCount; ++i) { scenario.updateBox(listID[i]); } + + // export scenario to the destination file + if (!scenarioManager.exportScenarioToFile(scenarioFile.c_str(), m_impl->scenarios[scenarioName], OVP_GD_ClassId_Algorithm_XMLScenarioExporter)) + { + std::cerr << "ERROR: failed to create scenario " << std::endl; + return EPlayerReturnCodes::KernelInternalFailure; + } + + return EPlayerReturnCodes::Success; +} + +EPlayerReturnCodes CKernelFacade::setupScenario(const SSetupScenarioCmd& command) const +{ + if (!m_impl->ctx) + { + std::cerr << "ERROR: Kernel is not loaded" << std::endl; + return EPlayerReturnCodes::KernelInternalFailure; + } + + if (!command.scenarioName) + { + std::cerr << "ERROR: Missing scenario name for setup" << std::endl; + return EPlayerReturnCodes::KernelInternalFailure; + } + + const auto name = command.scenarioName.get(); + + if (m_impl->scenarios.find(name) == m_impl->scenarios.end()) + { + std::cerr << "ERROR: Trying to configure not loaded scenario " << name << std::endl; + return EPlayerReturnCodes::ScenarioNotLoaded; + } + + // token list is just stored at this step for further use at runtime + // current token list overwrites the previous one + if (command.tokenList) { m_impl->scenarioTokens[name] = command.tokenList.get(); } + + return EPlayerReturnCodes::Success; +} + +EPlayerReturnCodes CKernelFacade::runScenarioList(const SRunScenarioCmd& command) const +{ + assert(command.scenarioList); + + if (!m_impl->ctx) + { + std::cerr << "ERROR: Kernel is not loaded" << std::endl; + return EPlayerReturnCodes::KernelInternalFailure; + } + + auto scenarios = command.scenarioList.get(); + + // use of returnCode to store error and achive an RAII-like + // behavior by releasing all players at the end + EPlayerReturnCodes returnCode = EPlayerReturnCodes::Success; + + // set up global token + if (command.tokenList) { setConfigTokens(m_impl->ctx->getConfigurationManager(), command.tokenList.get()); } + + auto& playerManager = m_impl->ctx->getPlayerManager(); + + // Keep 2 different containers because identifier information is + // not relevant during the performance sensitive loop task. + // This might be premature optimization... + std::vector players; + std::vector playerIDs; + + // attach players to scenario + for (auto& pair : m_impl->scenarios) + { + auto name = pair.first; + if (std::find(scenarios.begin(), scenarios.end(), name) == scenarios.end()) { continue; } // not in the list of scenario to run + + CIdentifier id; + if (!playerManager.createPlayer(id) || id == CIdentifier::undefined()) + { + std::cerr << "ERROR: impossible to create player" << std::endl; + returnCode = EPlayerReturnCodes::KernelInternalFailure; + break; + } + + Kernel::IPlayer* player = &playerManager.getPlayer(id); + + // player identifier is pushed here to ensure a correct cleanup event if player initialization fails + playerIDs.push_back(id); + + CNameValuePairList configTokens; + for (auto& token : m_impl->scenarioTokens[name]) { configTokens.setValue(token.first.c_str(), token.second.c_str()); } + + // Scenario attachment with setup of local token + if (!player->setScenario(pair.second, &configTokens)) + { + std::cerr << "ERROR: impossible to set player scenario " << name << std::endl; + returnCode = EPlayerReturnCodes::KernelInternalFailure; + break; + } + + if (player->initialize() == Kernel::EPlayerReturnCodes::Success) + { + if (command.playMode && command.playMode.get() == EPlayerPlayMode::Fastfoward) { player->forward(); } + else { player->play(); } + + players.push_back(player); + } + else + { + std::cerr << "ERROR: impossible to initialize player for scenario " << name << std::endl; + returnCode = EPlayerReturnCodes::KernelInternalFailure; + break; + } + } + + if (returnCode == EPlayerReturnCodes::Success) + { + // loop until timeout + const uint64_t startTime = System::Time::zgetTime(); + uint64_t lastLoopTime = startTime; + + // cannot directly feed secondsToTime with parameters.m_MaximumExecutionTime + // because it could overflow + const double boundedMaxExecutionTimeInS = CTime::max().toSeconds(); + + uint64_t maxExecutionTimeInFixedPoint; + if (command.maximumExecutionTime && command.maximumExecutionTime.get() > 0 && command.maximumExecutionTime.get() < boundedMaxExecutionTimeInS) + { + maxExecutionTimeInFixedPoint = CTime(double(command.maximumExecutionTime.get())).time(); + } + else { maxExecutionTimeInFixedPoint = std::numeric_limits::max(); } + + bool allStopped{ false }; + while (!allStopped) // negative condition here because it is easier to reason about it + { + const uint64_t currentTime = System::Time::zgetTime(); + allStopped = true; + for (auto* p : players) + { + if (p->getStatus() != Kernel::EPlayerStatus::Stop) + { + if (!p->loop(currentTime - lastLoopTime, maxExecutionTimeInFixedPoint)) { returnCode = EPlayerReturnCodes::KernelInternalFailure; } + } + + if (p->getCurrentSimulatedTime() >= maxExecutionTimeInFixedPoint) { p->stop(); } + + allStopped &= (p->getStatus() == Kernel::EPlayerStatus::Stop); + } + + lastLoopTime = currentTime; + } + } + + // release players + for (auto& id : playerIDs) + { + playerManager.getPlayer(id).uninitialize(); + playerManager.releasePlayer(id); + } + + return returnCode; +} + +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCKernelFacade.h b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCKernelFacade.h new file mode 100755 index 0000000..e48d79b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspCKernelFacade.h @@ -0,0 +1,109 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +#include "ovsp_defines.h" +#include + +namespace OpenViBE { +struct SInitCmd; +struct SResetCmd; +struct SLoadKernelCmd; +struct SLoadScenarioCmd; +struct SUpdateScenarioCmd; +struct SSetupScenarioCmd; +struct SRunScenarioCmd; + +/** +* \class CKernelFacade +* \author cgarraud (INRIA) +* \date 2016-01-26 +* \brief Wrapper class used to access Kernel features +* \ingroup ScenarioPlayer +* +* This class is one-to-many interface used as a central point +* to access a subset of Kernel features. +* +*/ +class CKernelFacade final +{ +public: + + CKernelFacade(); + ~CKernelFacade(); + + /** + * \brief Initialize session parameters + */ + static EPlayerReturnCodes initialize() { return EPlayerReturnCodes::Success; } + + /** + * \brief Reset session parameters + */ + static EPlayerReturnCodes uninitialize() { return EPlayerReturnCodes::Success; } + + /** + * \brief Load kernel + * \param[in] command command containing all mandatory properties + */ + EPlayerReturnCodes loadKernel(const SLoadKernelCmd& command) const; + + /** + * \brief Unload kernel + */ + EPlayerReturnCodes unloadKernel() const; + + /** + * \brief Load scenario + * \param[in] command command containing all mandatory properties + */ + EPlayerReturnCodes loadScenario(const SLoadScenarioCmd& command) const; + + /** + * \brief Update scenario + * \param[in] command command containing all mandatory properties + */ + EPlayerReturnCodes updateScenario(const SUpdateScenarioCmd& command) const; + + /** + * \brief Configure scenario + * \param[in] command command containing all mandatory properties + */ + EPlayerReturnCodes setupScenario(const SSetupScenarioCmd& command) const; + + /** + * \brief Run one or multiple scenarios + * \param[in] command command containing all mandatory properties + */ + EPlayerReturnCodes runScenarioList(const SRunScenarioCmd& command) const; + +private: + + // disable copy and assignment because it is not meant to used + // as a value class event if it is not inheritable + CKernelFacade(const CKernelFacade&) = delete; + CKernelFacade& operator=(const CKernelFacade&) = delete; + + struct SKernelFacadeImpl; + std::unique_ptr m_impl; +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspICommand.h b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspICommand.h new file mode 100644 index 0000000..84136ca --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspICommand.h @@ -0,0 +1,72 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +#include "ovsp_defines.h" + +namespace OpenViBE { +class CKernelFacade; + +/** +* \struct SCommand +* \author cgarraud (INRIA) +* \date 2016-01-26 +* \brief Base abstract struct for commands +* \ingroup ScenarioPlayer +* +* A command is an object that encapsulates all necessary information to perform an action later one. +* Typically, a command implementation should contain an implementation of CommandInterface interface, +* and a list of properties. +* +*/ +struct SCommand +{ + SCommand() = default; + virtual ~SCommand() = default; + + friend std::ostream& operator<<(std::ostream& os, const SCommand& cmd); + + /** + * \brief Execute the command + * \param[in] kernelFacade the kernel facade that gives access to kernel features + */ + virtual EPlayerReturnCodes execute(CKernelFacade& kernelFacade) const = 0; + +protected: + + // use of the non-virtual interface pattern to implement printing in the class hierarchy + virtual void doPrint(std::ostream& os) const = 0; + +private: + + // disable copy and assignment because it is not meant to used + // as a value class + SCommand(const SCommand&) = delete; + SCommand& operator=(const SCommand&) = delete; +}; + +inline std::ostream& operator<<(std::ostream& os, const SCommand& cmd) +{ + cmd.doPrint(os); + return os; +} +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspICommandParser.h b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspICommandParser.h new file mode 100644 index 0000000..62e3c47 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspICommandParser.h @@ -0,0 +1,82 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +#include "ovsp_defines.h" +#include +#include + +namespace OpenViBE { +struct SCommand; + +/** +* \class ICommandParser +* \author cgarraud (INRIA) +* \date 2016-01-27 +* \brief Base abstract class for command parser +* \ingroup ScenarioPlayer +* +* Command parsers aim at parsing a list of commands from a specific input. +* +*/ +class ICommandParser +{ +public: + + virtual ~ICommandParser() = default; + ICommandParser() = default; + + /** + * \brief Initialize parser + * + */ + virtual void initialize() = 0; + + /** + * \brief Unitialize parser + * + */ + virtual void uninitialize() = 0; + + /** + * \brief Retrieve the list of commands + * \pre This method should be called after the parse() method + * + */ + virtual std::vector> getCommandList() const = 0; + + + /** + * \brief Retrieve the list of commands + * \pre This method should be called after the initialize() method + * + */ + virtual EPlayerReturnCodes parse() = 0; + +private: + + // disable copy and assignment because it is not meant to used + // as a value class + ICommandParser(const ICommandParser&) = delete; + ICommandParser& operator=(const ICommandParser&) = delete; +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspTProgramOptions.hpp b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspTProgramOptions.hpp new file mode 100644 index 0000000..1ecfcaf --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovspTProgramOptions.hpp @@ -0,0 +1,461 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +#include "ovsp_defines.h" +#include +#include +#include +#include +#include + +#if defined TARGET_OS_Windows +#include +#include +#include +#endif + +namespace OpenViBE { +/** +* \struct SProgramOptionsTraits +* \author cgarraud (INRIA) +* \date 2016-01-26 +* \brief Helper class for ProgramOptions type checking +* \ingroup ScenarioPlayer +* +* This class provides aliases to types currently handled by ProgramOptions class +* as well as type checking meta-programming features. +* +*/ +struct SProgramOptionsTraits +{ + // add a new type here (type must be default constructible) + // and add the corresponding callback in ProgramOptions + + // types handled by ProgramOptions + using TokenPair = std::pair; + using String = std::string; + using Integer = int; + using Float = double; + + using StringList = std::vector; + using IntegerList = std::vector; + using FloatList = std::vector; + using TokenPairList = std::vector; +}; + +namespace ProgramOptionsUtils { +// template meta-programming features + +/* Base type that represents a true value at compile-time */ +struct STrueType +{ + static const bool value = true; +}; + +/* Base type that represents a false value at compile-time */ +struct SFalseType +{ + static const bool value = false; +}; + +/* SIsCompliant is used to statically check if a type is compliant with the handled types */ +template +struct SIsCompliant : SFalseType { }; + +/* Specialization of the template for compliant types */ +template <> +struct SIsCompliant : STrueType {}; + +/* Specialization of the template for compliant types */ +template <> +struct SIsCompliant : STrueType {}; + +/* Specialization of the template for compliant types */ +template <> +struct SIsCompliant : STrueType {}; + +/* Specialization of the template for compliant types */ +template <> +struct SIsCompliant : STrueType {}; + +/* Specialization of the template for compliant types */ +template <> +struct SIsCompliant : STrueType {}; + +/* Specialization of the template for compliant types */ +template <> +struct SIsCompliant : STrueType {}; + +/* Specialization of the template for compliant types */ +template <> +struct SIsCompliant : STrueType {}; + +/* Specialization of the template for compliant types */ +template <> +struct SIsCompliant : STrueType {}; + +/* SIsSignatureCompliant is used to statically checked a list of type is compliant with handled type */ +template +struct SIsSignatureCompliant; + +/* Specialization for empty list */ +template <> +struct SIsSignatureCompliant<> : STrueType {}; + +/* Specialization for non-empty list */ +template +struct SIsSignatureCompliant : + std::conditional::value, SIsSignatureCompliant, SFalseType>::type { }; + +/* SIsIn is used to statically check if a type T is in a list of types TList*/ +template +struct SIsIn; // interface + +/* Specialization for empty list */ +template +struct SIsIn : SFalseType {}; + +/* Specialization for list where 1st element is a match */ +template +struct SIsIn : STrueType {}; + +/* Specialization for list of many elements */ +template +struct SIsIn : SIsIn {}; + +/* SHasDuplicate is used to statically check if a list of types has duplicates*/ +template +struct SHasDuplicate; + +/* Specialization for empty list */ +template <> +struct SHasDuplicate<> : SFalseType {}; + +/* Specialization for 1-element list */ +template +struct SHasDuplicate : SFalseType {}; + +/* Specialization for list of many elements */ +template +struct SHasDuplicate : std::conditional::value, STrueType, SHasDuplicate>::type { }; +} // namespace ProgramOptionsUtils + +/** +* \class ProgramOptions +* \author cgarraud (INRIA) +* \date 2016-01-25 +* \brief Command-line options parser +* \ingroup ScenarioPlayer +* +* This class is a basic class used to parse program options. +* Input format requirements: +* - Option prefix must be '-' or '--' e.g. cmd -help or --help +* - Option value assignment must be set with '=': e.g. cmd -config=myfile.txt +* - Option value that consists of pair are set with (): e.g. cmd -newToken=(key,value) +* . +* +* Template parameters are the list of option types that can be handled by the class. +* This list of options must comply to types defined in ProgramOptionsTrait.\n +* +* Parsing options occurs in 2 steps: +* - Populating the list of possible options with simple options (e.g. --help) and value options (e.g. --option=value) +* - Parsing options from command line +* . +* +* \todo The parser has only be tested for the player use. It needs more in-depth testing +* to be used in another context. Moreover, it should be extended to accept any type. +* +* \note The implementation is trivial. Prefer the use of robust and fully featured +* boost program_options compiled library if possible. +* +*/ +template +class ProgramOptions final +{ +public: + + // static assert are used to raise understandable errors at compile time + static_assert(!ProgramOptionsUtils::SHasDuplicate::value, "Duplicates in the type list"); + static_assert(ProgramOptionsUtils::SIsSignatureCompliant::value, "TTypes not handled by ProgramOptions"); + + /** + * Struct used to store used-defined option parameters. + */ + struct SOptionDesc // using a struct allows more extensibility than method parameters + { + /** Option shortname (e.g. h for help) */ + std::string shortName; + /** Option description used for printing option list */ + std::string desc; + }; + + /** + * \brief Add global description to the list of options + * \param[in] desc the global description in printable format + * + * The global description is used as additional printable documentation + * when printOptionsDesc() is called. + * + */ + void setGlobalDesc(const std::string& desc); + + /** + * \brief Add a simple option to the internal dictionary + * \param[in] name the option name + * \param[in] optionDesc the option description + * + * Simple options are option withou value (e.g. --help or --version) + * + */ + void addSimpleOption(const std::string& name, const SOptionDesc& optionDesc); + + + /** + * \brief Add a value option to the internal dictionary + * \param[in] name the option name + * \param[in] optionDesc the option description + * + * Template paramter T: The type of the option to be added + */ + template + void addValueOption(const std::string& name, const SOptionDesc& optionDesc); + + /** + * \brief Parse command line options + * \pre addSimpleOption and addValueOption must be called to populate options dictionary + * \param[in] argc number of arguments + * \param[in] argv pointer to the list of arguments + * \return: false if an error occurred during parsing, true otherwise + */ + bool parse(int argc, char** argv); + + /** + * \brief Check if an option was parsed or not + * \pre Must be called after parse() + * \param[in] name the option name + * \return: true if the option was parsed, false otherwise + */ + bool hasOption(const std::string& name) const; + + /** + * \brief Get option value + * \pre hasOption() should be called to ensure the option is available + * \param[in] name the option name + * \return the option value (will be the default value if the option was not parsed) + * + * Template paramter T: the type of the option to retrieve (must match the type used to set + * the option with addValueOption()) + */ + template + T getOptionValue(const std::string& name) const; + + + /** + * \brief print all option descriptions + */ + void printOptionsDesc() const; + +private: + + // The visitor allows us to apply the correct parsing + // for any type (see boost::variant documentation for more details). + // Presently, it is pretty ugly. This should be refactored for + // as there is a lot of behavorial redundancy. + class OptionVisitor : public boost::static_visitor<> + { + public: + + OptionVisitor(std::string& value) : m_value(value) { } + + void operator()(SProgramOptionsTraits::Integer& operand) const { operand = std::stoi(m_value); } + void operator()(SProgramOptionsTraits::Float& operand) const { operand = std::stod(m_value); } + void operator()(SProgramOptionsTraits::String& operand) const { operand = m_value; } + void operator()(SProgramOptionsTraits::TokenPair& operand) const { operand = this->parsePair(m_value); } + void operator()(SProgramOptionsTraits::IntegerList& operand) const { operand.push_back(std::stoi(m_value)); } + void operator()(SProgramOptionsTraits::FloatList& operand) const { operand.push_back(std::stod(m_value)); } + void operator()(SProgramOptionsTraits::StringList& operand) const { operand.push_back(m_value); } + void operator()(SProgramOptionsTraits::TokenPairList& operand) const { operand.push_back(this->parsePair(m_value)); } + + private: + + static SProgramOptionsTraits::TokenPair parsePair(const std::string& str); + + std::string& m_value; + }; + + using OptionValue = boost::variant; + + // the pair contais a boolean to quickly know if an option + // is a simple option or a value option + using FullOptionDesc = std::pair; + + std::string m_globalDesc; + std::map m_descs; + std::map m_values; + std::vector m_options; +}; + +/////////////////////////////////////////// +/////// Definition ProgramOptions ///////// +/////////////////////////////////////////// + +template +void ProgramOptions::setGlobalDesc(const std::string& desc) { m_globalDesc = desc; } + +template +void ProgramOptions::addSimpleOption(const std::string& name, const SOptionDesc& optionDesc) +{ + m_descs[name] = std::make_pair(true, optionDesc); +} + +template +template +void ProgramOptions::addValueOption(const std::string& name, const SOptionDesc& optionDesc) +{ + m_descs[name] = std::make_pair(false, optionDesc); + + T defaultValue{}; // with this implementation, only default constructible type can be added + m_values[name] = defaultValue; +} + +template +bool ProgramOptions::hasOption(const std::string& name) const +{ + return std::find(m_options.begin(), m_options.end(), name) != m_options.end(); +} + +template +template +T ProgramOptions::getOptionValue(const std::string& name) const +{ + T value{}; + + try { value = boost::get(m_values.at(name)); } + catch (const std::exception& e) { std::cerr << "ERROR: Caught exception during option value retrieval: " << e.what() << std::endl; } + + return value; +} + +template +bool ProgramOptions::parse(const int argc, char** argv) +{ + std::vector args; +#if defined TARGET_OS_Windows + int nArg; + LPWSTR* argListUtf16 = CommandLineToArgvW(GetCommandLineW(), &nArg); + std::wstring_convert> converter; + for (int i = 0; i < nArg; ++i) { args.push_back(converter.to_bytes(argListUtf16[i])); } +#else + args = std::vector(argv, argv + argc); +#endif + + for (int i = 1; i < argc; ++i) + { + std::string arg = args[i]; + const auto argSplit = arg.find_first_of('='); // = is the separator for value option + std::string key; + + if (argSplit == std::string::npos) { key = arg; } // simple option + else { key = arg.substr(0, argSplit); } // value option + + // first check if the key exists + auto keyMatch = std::find_if(m_descs.begin(), m_descs.end(), [&](const std::pair& p) + { + const auto& desc = p.second.second; + return (("-" + p.first) == key) || (("--" + p.first) == key) || (("-" + desc.shortName) == key) || ( + ("--" + desc.shortName) == key); + } + ); + + if (keyMatch == m_descs.end()) + { + std::cout << "WARNING: Found unknown option: " << key << std::endl; + std::cout << "Skipping..." << std::endl; + continue; + } + + if (!keyMatch->second.first) // value option + { + if (key == arg) + { + std::cerr << "ERROR: No value set for argument: " << key << std::endl; + return false; + } + + std::string val = arg.substr(argSplit + 1, arg.size() - argSplit - 1); // take value part of the arg + + try { boost::apply_visitor(OptionVisitor(val), m_values[keyMatch->first]); } + catch (const std::exception& e) + { + std::cerr << "ERROR: Caught exception during option parsing: " << e.what() << std::endl; + std::cerr << "Could not parse option with key = " << key << " and value = " << val << std::endl; + return false; + } + } + + m_options.push_back(keyMatch->first); + } + + + return true; +} + +template +void ProgramOptions::printOptionsDesc() const +{ + if (!m_globalDesc.empty()) { std::cout << m_globalDesc << std::endl; } + + std::cout << "TList of available options:\n" << std::endl; + + for (auto& option : m_descs) + { + std::cout << "Option: --" << option.first << std::endl; + const auto& desc = option.second.second; + if (!desc.shortName.empty()) { std::cout << "Shortname: --" << desc.shortName << std::endl; } + std::cout << "Description: " << std::endl; + std::cout << desc.desc << std::endl << std::endl; + } +} + +/////////////////////////////////////////// +/////// Definition Internal Visitor /////// +/////////////////////////////////////////// + +template +SProgramOptionsTraits::TokenPair ProgramOptions::OptionVisitor::parsePair(const std::string& str) +{ + const auto split = str.find_first_of(':'); + const auto size = str.size(); + + // (a:b) pattern expected + // minimal regex std::regex("\\(.+:.+\\)") + if (!(size >= 5 && str[0] == '(' && str[size - 1] == ')') || split == std::string::npos) + { + throw std::runtime_error("Failed to parse token pair from value: " + str); + } + + // magic 2 numbers is because substr takes a length as second parameter + // 2 = remove the last ) + account for the first one + return std::make_pair(str.substr(1, split - 1), str.substr(split + 1, size - split - 2)); +} +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovsp_base.h b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovsp_base.h new file mode 100644 index 0000000..e13c374 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovsp_base.h @@ -0,0 +1,27 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +#include +#include + +#include "ovsp_defines.h" diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovsp_defines.h b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovsp_defines.h new file mode 100644 index 0000000..6e8ae50 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovsp_defines.h @@ -0,0 +1,85 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +#include "ovspTProgramOptions.hpp" + +namespace OpenViBE { +/** +* \defgroup ScenarioPlayer Scenario Player +*/ + +/** +* \class EPlayerReturnCodes +* \author cgarraud +* \date 2016-01-25 +* \brief Scenario player list of potential return code +* \ingroup ScenarioPlayer +*/ +enum class EPlayerReturnCodes +{ + Success = 0, ///< No error during execution */ + InvalidArg, ///< Invalid command-line options */ + MissingMandatoryArgument, ///< A mandatory argument is missing */ + BadArg, ///< An argument is given with a wrong value */ + OpeningFileFailure, ///< A file could not be opened */ + ParsingCommandFailure, ///< General parsing command error*/ + UnkownFailure, ///< Error of unknown type*/ + KernelLoadingFailure, ///< Kernel loading failed*/ + KernelInvalidDesc, ///< Invalid kernel descriptor*/ + KernelInvalidContext, ///< Invalid kernel context*/ + KernelInternalFailure, ///< Generic error type for kernel internal error*/ + ScenarioNotLoaded ///< Error triggered when an action is requested on an unknown scenario */ +}; + +/** +* \class EPlayerPlayMode +* \author cgarraud +* \date 2016-01-25 +* \brief Way of playing a scenario +* \ingroup ScenarioPlayer +*/ +enum class EPlayerPlayMode { Standard = 0, Fastfoward }; + +/* Define the common parser to be used in the application */ +using ProgramOptionParser = ProgramOptions; + +inline std::string toString(const EPlayerReturnCodes code) +{ + switch (code) + { + case EPlayerReturnCodes::Success: return "Success"; + case EPlayerReturnCodes::InvalidArg: return "Invalid Arg"; + case EPlayerReturnCodes::MissingMandatoryArgument: return "Missing Mandatory Argument"; + case EPlayerReturnCodes::BadArg: return "Bad Arg"; + case EPlayerReturnCodes::OpeningFileFailure: return "Opening File Failure"; + case EPlayerReturnCodes::ParsingCommandFailure: return "Parsing Command Failure"; + case EPlayerReturnCodes::UnkownFailure: return "Unkown Failure"; + case EPlayerReturnCodes::KernelLoadingFailure: return "Kernel Loading Failure"; + case EPlayerReturnCodes::KernelInvalidDesc: return "Kernel Invalid Desc"; + case EPlayerReturnCodes::KernelInvalidContext: return "Kernel Invalid Context"; + case EPlayerReturnCodes::KernelInternalFailure: return "Kernel Internal Failure"; + case EPlayerReturnCodes::ScenarioNotLoaded: return "Scenario Not Loaded"; + default: return "Invalid Code"; + } +} +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovsp_main.cpp b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovsp_main.cpp new file mode 100644 index 0000000..2a26d0b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/developer-tools/scenario-player/src/ovsp_main.cpp @@ -0,0 +1,147 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include +#include +#include + +#include "ovsp_defines.h" +#include "ovspCKernelFacade.h" +#include "ovspCCommand.h" +#include "ovspCCommandLineOptionParser.h" +#include "ovspCCommandFileParser.h" + +namespace OpenViBE { +void initializeParser(ProgramOptionParser& parser) +{ + const std::string desc = + R"d(Usage: program options + +Program can be run in express mode to directly execute a scenario +Program can be run in command mode to execute list of commands from a file + +)d"; + parser.setGlobalDesc(desc); + + parser.addSimpleOption("help", { "h", "Help" }); + parser.addSimpleOption("version", { "v", "Program version" }); + + parser.addValueOption("mode", { "m", "Execution mode: 'x' for express, 'c' for command [mandatory]" }); + + // express mode options + parser.addValueOption("config-file", { "", "Path to configuration file (express mode only)" }); + parser.addValueOption("scenario-file", { "", "Path to scenario file (express mode only) [mandatory]" }); + parser.addValueOption("updated-scenario-file", { + "", + "Enable update process instead of playing scenario. Path to the updated scenario file (express mode only)." + }); + parser.addValueOption("play-mode", + { "", "Play mode: std for standard and ff for fast-foward (express mode only) [default=std]" }); + parser.addValueOption("max-time", { "", "Scenarios playing execution time limit (express mode only)" }); + parser.addValueOption("dg", { "", "Global user-defined token: -dg=\"(token:value)\" (express mode only)" }); + parser.addValueOption("ds", { "", "Scenario user-defined token: -ds=\"(token:value)\" (express mode only)" }); + + // command mode options + parser.addValueOption("command-file", { "", "Path to command file (command mode only) [mandatory]" }); +} + +} // namespace OpenViBE + +int main(int argc, char** argv) +{ + OpenViBE::ProgramOptionParser optionParser; + initializeParser(optionParser); + + if (!optionParser.parse(argc, argv)) + { + std::cerr << "ERROR: Failed to parse arguments" << std::endl; + return int(OpenViBE::EPlayerReturnCodes::InvalidArg); + } + if (optionParser.hasOption("help")) + { + optionParser.printOptionsDesc(); + return int(OpenViBE::EPlayerReturnCodes::Success); + } + if (optionParser.hasOption("version")) + { + // PROJECT_VERSION is added to definition from cmake + std::cout << "version: " << PROJECT_VERSION << std::endl; + return int(OpenViBE::EPlayerReturnCodes::Success); + } + if (optionParser.hasOption("mode") || optionParser.hasOption("updated-scenario-file")) + { + // command parser type is selected from mode + std::unique_ptr commandParser{ nullptr }; + const auto mode = optionParser.getOptionValue("mode"); + + if (mode == "c") + { + // check for the mandatory commad file + if (optionParser.hasOption("command-file")) + { + commandParser.reset(new OpenViBE::CommandFileParser(optionParser.getOptionValue("command-file"))); + } + else + { + std::cerr << "ERROR: mandatory option 'command-file' not set" << std::endl; + return int(OpenViBE::EPlayerReturnCodes::MissingMandatoryArgument); + } + } + else if ((mode == "x") || optionParser.hasOption("updated-scenario-file")) { commandParser.reset(new OpenViBE::CommandLineOptionParser(optionParser)); } + else + { + std::cerr << "ERROR: unknown mode set" << std::endl; + std::cerr << "Mode must be 'x' or 'c'" << std::endl; + return int(OpenViBE::EPlayerReturnCodes::InvalidArg); + } + + commandParser->initialize(); + + try + { + auto returnCode = commandParser->parse(); + + if (returnCode == OpenViBE::EPlayerReturnCodes::Success) + { + OpenViBE::CKernelFacade kernel; + + for (auto& cmd : commandParser->getCommandList()) + { + returnCode = cmd->execute(kernel); + if (returnCode != OpenViBE::EPlayerReturnCodes::Success) { return int(returnCode); } + } + } + else { return int(returnCode); } + } + catch (const std::exception& e) + { + std::cerr << "ERROR: received unexpected exception: " << e.what() << std::endl; + return int(OpenViBE::EPlayerReturnCodes::UnkownFailure); + } + } + else + { + std::cerr << "ERROR: mandatory option 'mode' not set" << std::endl; + return int(OpenViBE::EPlayerReturnCodes::MissingMandatoryArgument); + } + + return int(OpenViBE::EPlayerReturnCodes::Success); +} diff --git a/Masterarbeit/openvibe/sdk-master/applications/examples/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/applications/examples/CMakeLists.txt new file mode 100644 index 0000000..5618627 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/examples/CMakeLists.txt @@ -0,0 +1,2 @@ +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("EXAMPLES") diff --git a/Masterarbeit/openvibe/sdk-master/applications/examples/external-processing/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/applications/examples/external-processing/CMakeLists.txt new file mode 100644 index 0000000..dd29736 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/examples/external-processing/CMakeLists.txt @@ -0,0 +1,38 @@ +PROJECT(sdk-examples-communication-client-generator) + +SET(SRC_FILES src/main-generator.cpp) +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +ADD_DEPENDENCIES(${PROJECT_NAME} openvibe-toolkit) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleSocket") +INCLUDE("FindOpenViBEModuleCommunication") + +SET_BUILD_PLATFORM() + +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +PROJECT(sdk-examples-communication-client-filter) + +SET(SRC_FILES src/main-filter.cpp) +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEModuleSocket") +INCLUDE("FindOpenViBEModuleCommunication") +INCLUDE("FindOpenViBEToolkit") + +SET_BUILD_PLATFORM() + +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/Masterarbeit/openvibe/sdk-master/applications/examples/external-processing/src/main-filter.cpp b/Masterarbeit/openvibe/sdk-master/applications/examples/external-processing/src/main-filter.cpp new file mode 100644 index 0000000..ecf6029 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/examples/external-processing/src/main-filter.cpp @@ -0,0 +1,190 @@ +#include +#include + +#include +#include +#include +#include +#include + +#include + +static bool didRequestForcedQuit = false; +static void signalHandler(int /* signal */) { didRequestForcedQuit = true; } + +int main(const int argc, char** argv) +{ + std::signal(SIGINT, signalHandler); + + std::string connectionID; + size_t port = 49687; + + for (int i = 0; i < argc; ++i) + { + if (std::strcmp(argv[i], "--connection-id") == 0) { if (argc > i + 1) { connectionID = argv[i + 1]; } } + else if (std::strcmp(argv[i], "--port") == 0) { if (argc > i + 1) { port = size_t(std::stoi(argv[i + 1])); } } + } + didRequestForcedQuit = false; + + Communication::MessagingClient client; + + client.setConnectionID(connectionID); + + while (!client.connect("127.0.0.1", port)) + { + const Communication::MessagingClient::ELibraryError error = client.getLastError(); + + if (error == Communication::MessagingClient::ELibraryError::Socket_FailedToConnect) + { + std::cout << "Server not responding\n"; + std::this_thread::sleep_for(std::chrono::milliseconds(20)); + } + else + { + std::cout << "Error " << error << std::endl; + exit(EXIT_FAILURE); + } + + if (didRequestForcedQuit) { exit(EXIT_SUCCESS); } + } + + std::cout << "Connected to server\n"; + + // Initialize + + for (size_t i = 0; i < client.getInputCount(); ++i) + { + uint64_t id; + uint64_t type; + std::string name; + + if (client.getInput(i, id, type, name)) { std::cout << "Input:\n\tIndex: " << id << "\n\tType: " << type << "\n\tName: " << name << "\n\n"; } + } + + for (size_t i = 0; i < client.getOutputCount(); ++i) + { + uint64_t id; + uint64_t type; + std::string name; + + if (client.getOutput(i, id, type, name)) { std::cout << "Output:\n\tIndex: " << id << "\n\tType: " << type << "\n\tName: " << name << "\n\n"; } + } + + for (size_t i = 0; i < client.getParameterCount(); ++i) + { + uint64_t id; + uint64_t type; + std::string name; + std::string value; + + if (client.getParameter(i, id, type, name, value)) + { + std::cout << "Parameter:\n\tIndex: " << id << "\n\tType: " << type << "\n\tName: " << name << "\n\tValue: " << value << "\n\n"; + } + } + + // Announce to server that the box has finished initializing and wait for acknowledgement + while (!client.waitForSyncMessage()) { std::this_thread::sleep_for(std::chrono::milliseconds(1)); } + client.pushLog(Communication::LogLevel_Info, "Received Ping"); + + client.pushSync(); + client.pushLog(Communication::LogLevel_Info, "Sent Pong"); + + // Process + + while (!didRequestForcedQuit) + { + if (client.isEndReceived()) + { + std::cout << "End message received!\n"; + break; + } + + if (!client.isConnected()) + { + std::cout << "Disconnected!\n"; + break; + } + + if (client.isInErrorState()) + { + std::cerr << "Error state " << client.getLastError() << "\n"; + break; + } + + // EBML + + uint64_t packetId; + size_t index; + uint64_t startTime; + uint64_t endtime; + std::shared_ptr> ebml; + + // We wait for a synchronization message, this means that the client box has finished sending + // all of the data it has received during one process() method call. + while (!client.waitForSyncMessage()) + { + while (client.popEBML(packetId, index, startTime, endtime, ebml)) + { + // We just push out the received EBML as is + if (!client.pushEBML(index, startTime, endtime, ebml)) + { + std::cerr << "Failed to push EBML.\n"; + std::cerr << "Error " << client.getLastError() << "\n"; + break; + } + + /*if (!client.pushLog(Communication::ELogLevel::LogLevel_Info, "EBML received on index: " + std::to_string(index))) + { + std::cout << "Failed to push log.\n"; + client.close(); + exit(EXIT_FAILURE); + }*/ + } + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + + // Sync message was received, this means that we are now sure that the buffer will not receive + // any additional data as the box is blocked until we acknowledge sending all of the processed + // data back + while (client.popEBML(packetId, index, startTime, endtime, ebml)) + { + if (!client.pushEBML(index, startTime, endtime, ebml)) + { + std::cerr << "Failed to push EBML.\n"; + std::cerr << "Error " << client.getLastError() << "\n"; + break; + } + + /*if (!client.pushLog(Communication::ELogLevel::LogLevel_Info, "EBML received on index: " + std::to_string(index))) + { + std::cout << "Failed to push log.\n"; + client.close(); + exit(EXIT_FAILURE); + }*/ + } + + // Errors + + Communication::EError error; + uint64_t guiltyId; + + while (client.popError(packetId, error, guiltyId)) + { + std::cerr << "Error received:\n"; + std::cerr << "\tError: " << int(error) << "\n"; + std::cerr << "\tGuilty Id: " << guiltyId << "\n"; + } + + // Here, we send a sync message to tell to the server that we have no more + // data to send and we can move forward. This will unblock the box. + if (!client.pushSync()) { return 0; } + } + + std::cout << "Processing stopped.\n"; + + + if (!client.close()) { std::cerr << "Failed to close the connection\n"; } + + return 0; +} diff --git a/Masterarbeit/openvibe/sdk-master/applications/examples/external-processing/src/main-generator.cpp b/Masterarbeit/openvibe/sdk-master/applications/examples/external-processing/src/main-generator.cpp new file mode 100644 index 0000000..7edebd0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/applications/examples/external-processing/src/main-generator.cpp @@ -0,0 +1,291 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +static bool didRequestForcedQuit = false; +static void signalHandler(int /* signal */) { didRequestForcedQuit = true; } + +class EBMLWriterCallback +{ +public: + void write(const void* buffer, const size_t size) + { + const uint8_t* data = static_cast(buffer); + m_buffer.insert(m_buffer.end(), data, data + size); + } + + void clear() { m_buffer.clear(); } + + const std::vector& data() const { return m_buffer; } + +private: + std::vector m_buffer; +}; + +int main(const int argc, char** argv) +{ + std::signal(SIGINT, signalHandler); + + std::string connectionID; + size_t port = 49687; + + for (int i = 0; i < argc; ++i) + { + if (std::strcmp(argv[i], "--connection-id") == 0) { if (argc > i + 1) { connectionID = argv[i + 1]; } } + else if (std::strcmp(argv[i], "--port") == 0) { if (argc > i + 1) { port = size_t(std::stoi(argv[i + 1])); } } + } + + // EBML + + EBMLWriterCallback callback; + EBML::TWriterCallbackProxy1 callbackProxy(callback, &EBMLWriterCallback::write); + EBML::IWriter* writer = createWriter(callbackProxy); + EBML::IWriterHelper* helper = EBML::createWriterHelper(); + helper->connect(writer); + + didRequestForcedQuit = false; + + Communication::MessagingClient client; + + client.setConnectionID(connectionID); + + while (!client.connect("127.0.0.1", port)) + { + const Communication::MessagingClient::ELibraryError error = client.getLastError(); + + if (error == Communication::MessagingClient::ELibraryError::Socket_FailedToConnect) + { + std::cout << "Server not responding\n"; + std::this_thread::sleep_for(std::chrono::milliseconds(20)); + } + else + { + std::cout << "Error " << error << std::endl; + exit(EXIT_FAILURE); + } + + if (didRequestForcedQuit) { exit(EXIT_SUCCESS); } + } + + std::cout << "Connected to server\n"; + + // Initialize + + if (client.getInputCount() > 0) + { + std::cerr << "The test generator can not take any inputs, was given " << client.getInputCount() << std::endl; + client.close(); + exit(EXIT_FAILURE); + } + + for (size_t i = 0; i < client.getOutputCount(); ++i) + { + uint64_t id; + uint64_t type; + std::string name; + + if (client.getOutput(i, id, type, name)) { std::cout << "Output:\n\tIndex: " << id << "\n\tType: " << type << "\n\tName: " << name << "\n\n"; } + } + + std::map parameters; + + for (size_t i = 0; i < client.getParameterCount(); ++i) + { + uint64_t id; + uint64_t type; + std::string name; + std::string value; + + client.getParameter(i, id, type, name, value); + parameters[name] = value; + } + + if (!(parameters.count("Channel Count"))) + { + std::cerr << "Missing parameter" << std::endl; + client.close(); + exit(EXIT_FAILURE); + } + + const size_t nChannel = size_t(std::stoul(parameters.at("Channel Count"))); + const size_t samplingRate = size_t(std::stoul(parameters.at("Sampling Rate"))); + const size_t samplesPerBuffer = size_t(std::stoul(parameters.at("Samples Per Buffer"))); + const size_t samplesToSend = size_t(std::stoul(parameters.at("Amount of Samples to Generate"))); + + std::vector matrix; + matrix.resize(nChannel * samplesPerBuffer); + + // Announce to server that the box has finished initializing and wait for acknowledgement + while (!client.waitForSyncMessage()) { std::this_thread::sleep_for(std::chrono::milliseconds(1)); } + client.pushLog(Communication::LogLevel_Info, "Received Ping"); + + client.pushSync(); + client.pushLog(Communication::LogLevel_Info, "Sent Pong"); + + // Process + + // Send the header + callback.clear(); + helper->openChild(OVTK_NodeId_Header); + { + helper->openChild(OVTK_NodeId_Header_StreamType); + { + helper->setUInt(0); + helper->closeChild(); + } + helper->openChild(OVTK_NodeId_Header_StreamVersion); + { + helper->setUInt(0); + helper->closeChild(); + } + + helper->openChild(OVTK_NodeId_Header_Signal); + { + helper->openChild(OVTK_NodeId_Header_Signal_Sampling); + { + helper->setUInt(samplingRate); + helper->closeChild(); + } + helper->closeChild(); + } + + helper->openChild(OVTK_NodeId_Header_StreamedMatrix); + { + helper->openChild(OVTK_NodeId_Header_StreamedMatrix_DimensionCount); + { + helper->setUInt(2); + helper->closeChild(); + } + helper->openChild(OVTK_NodeId_Header_StreamedMatrix_Dimension); + { + helper->openChild(OVTK_NodeId_Header_StreamedMatrix_Dimension_Size); + { + helper->setUInt(nChannel); + helper->closeChild(); + } + helper->closeChild(); + } + helper->openChild(OVTK_NodeId_Header_StreamedMatrix_Dimension); + { + helper->openChild(OVTK_NodeId_Header_StreamedMatrix_Dimension_Size); + { + helper->setUInt(samplesPerBuffer); + helper->closeChild(); + } + helper->closeChild(); + } + helper->closeChild(); + } + helper->closeChild(); + } + if (!client.pushEBML(0, 0, 0, std::make_shared>(callback.data()))) + { + std::cerr << "Failed to push EBML.\n"; + std::cerr << "Error " << client.getLastError() << "\n"; + exit(EXIT_FAILURE); + } + + client.pushSync(); + + size_t sentSamples = 0; + while (!didRequestForcedQuit || (samplesToSend != 0 && sentSamples < samplesToSend)) + { + if (client.isEndReceived()) + { + std::cout << "End message received!\n"; + break; + } + + if (!client.isConnected()) + { + std::cout << "Disconnected!\n"; + break; + } + + if (client.isInErrorState()) + { + std::cerr << "Error state " << client.getLastError() << "\n"; + break; + } + + // Send data + + while (!client.waitForSyncMessage()) { std::this_thread::sleep_for(std::chrono::milliseconds(1)); } + + const uint64_t expectedSamples = OpenViBE::CTime(client.getTime()).toSampleCount(samplingRate); + + while (sentSamples < expectedSamples && (samplesToSend == 0 || sentSamples < samplesToSend)) + { + for (size_t channel = 0; channel < nChannel; ++channel) + { + for (size_t sample = 0; sample < samplesPerBuffer; ++sample) + { + matrix[channel * samplesPerBuffer + sample] = sin((sentSamples + sample) / double(samplingRate)); + } + } + + callback.clear(); + helper->openChild(OVTK_NodeId_Buffer); + { + helper->openChild(OVTK_NodeId_Buffer_StreamedMatrix); + { + helper->openChild(OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer); + { + helper->setBinary(matrix.data(), matrix.size() * sizeof(double)); + helper->closeChild(); + } + helper->closeChild(); + } + helper->closeChild(); + } + + + const uint64_t tStart = OpenViBE::CTime(samplingRate, sentSamples).time(); + const uint64_t tEnd = OpenViBE::CTime(samplingRate, sentSamples + samplesPerBuffer).time(); + + if (!client.pushEBML(0, tStart, tEnd, std::make_shared>(callback.data()))) + { + std::cerr << "Failed to push EBML.\n"; + std::cerr << "Error " << client.getLastError() << "\n"; + exit(EXIT_FAILURE); + } + + sentSamples += samplesPerBuffer; + } + + // Errors + uint64_t packetId; + Communication::EError error; + uint64_t guiltyId; + + while (client.popError(packetId, error, guiltyId)) { std::cerr << "Error received:\n\tError: " << int(error) << "\n\tGuilty Id: " << guiltyId << "\n"; } + // Here, we send a sync message to tell to the server that we have no more data to send and we can move forward. + if (!client.pushSync()) { exit(EXIT_FAILURE); } + } + + std::cout << "Processing stopped.\n"; + + helper->disconnect(); + helper->release(); + writer->release(); + + if (!client.close()) { std::cerr << "Failed to close the connection\n"; } + + return 0; +} diff --git a/Masterarbeit/openvibe/sdk-master/build-tool/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/build-tool/CMakeLists.txt new file mode 100644 index 0000000..f4f62fd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/build-tool/CMakeLists.txt @@ -0,0 +1,3 @@ + +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("BUILD_TOOL") diff --git a/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/CMakeLists.txt new file mode 100644 index 0000000..e92f908 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/CMakeLists.txt @@ -0,0 +1,23 @@ +PROJECT(openvibe-stimulation-generator) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_EXECUTABLE(openvibe-stimulation-generator ${SRC_FILES}) + +# if(UNIX) +# SET(stim_generator_path "${CMAKE_CURRENT_BINARY_DIR}" CACHE INTERNAL "stim_generator_path") +# else() +# get_property(path_to_target TARGET openvibe-stimulation-generator PROPERTY LOCATION) +# SET(stim_generator_path "${path_to_target}" CACHE INTERNAL "stim_generator_path") +# MESSAGE(STATUS "MOO ${stim_generator_path}") +#endif() + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() diff --git a/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/src/ovbt_sg_cpp_code_generator.cpp b/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/src/ovbt_sg_cpp_code_generator.cpp new file mode 100644 index 0000000..aa59336 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/src/ovbt_sg_cpp_code_generator.cpp @@ -0,0 +1,32 @@ +#include "ovbt_sg_defines.h" + +#include + +bool CCppCodeGenerator::openFile(const char* filename) +{ + m_file.open(filename, std::ios::out | std::ios::trunc); + if (!m_file.is_open()) { return false; } + m_file << "#include \"toolkit/ovtk_all.h\"" << std::endl << std::endl; + + m_file << "using namespace OpenViBE;" << std::endl; + m_file << "using namespace /*OpenViBE::*/Kernel;" << std::endl; + m_file << "using namespace /*OpenViBE::*/Toolkit;" << std::endl << std::endl << std::endl; + + m_file << "bool Toolkit::initializeStimulationList(const Kernel::IKernelContext& ctx)" << std::endl; + m_file << "{" << std::endl; + m_file << "\tITypeManager& typeManager=ctx.getTypeManager();" << std::endl << std::endl; + return true; +} + +bool CCppCodeGenerator::appendStimulation(SStimulation& stim) +{ + m_file << "\ttypeManager.registerEnumerationEntry(OV_TypeId_Stimulation, \"" << stim.name << "\", " << stim.id << ");" << std::endl; + return true; +} + +bool CCppCodeGenerator::closeFile() +{ + m_file << std::endl << "\treturn true;" << std::endl << "}" << std::endl; + m_file.close(); + return true; +} diff --git a/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/src/ovbt_sg_cpp_define_generator.cpp b/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/src/ovbt_sg_cpp_define_generator.cpp new file mode 100644 index 0000000..ab340d8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/src/ovbt_sg_cpp_define_generator.cpp @@ -0,0 +1,25 @@ +#include "ovbt_sg_defines.h" + +#include + +bool CCppDefineGenerator::openFile(const char* filename) +{ + m_file.open(filename, std::ios::out | std::ios::trunc); + if (!m_file.is_open()) { return false; } + m_file << "#pragma once" << std::endl << std::endl; + + return true; +} + +bool CCppDefineGenerator::appendStimulation(SStimulation& stim) +{ + m_file << "#define " << stim.id << " " << stim.hexa << std::endl; + return true; +} + +bool CCppDefineGenerator::closeFile() +{ + m_file << std::endl; + m_file.close(); + return true; +} diff --git a/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/src/ovbt_sg_defines.h b/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/src/ovbt_sg_defines.h new file mode 100644 index 0000000..911fa80 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/src/ovbt_sg_defines.h @@ -0,0 +1,47 @@ +#pragma once + +#include +#include + +struct SStimulation +{ + std::string name; + std::string id; + std::string hexa; +}; + +class CFileGeneratorBase +{ +public: + virtual ~CFileGeneratorBase() = default; + virtual bool openFile(const char* filename) = 0; + virtual bool appendStimulation(SStimulation& stim) = 0; + virtual bool closeFile() = 0; +protected: + std::ofstream m_file; +}; + + +class CCppDefineGenerator final : public CFileGeneratorBase +{ +public: + bool openFile(const char* filename) override; + bool appendStimulation(SStimulation& stim) override; + bool closeFile() override; +}; + +class CCppCodeGenerator final : public CFileGeneratorBase +{ +public: + bool openFile(const char* filename) override; + bool appendStimulation(SStimulation& stim) override; + bool closeFile() override; +}; + +class CMatlabGenerator final : public CFileGeneratorBase +{ +public: + bool openFile(const char* filename) override; + bool appendStimulation(SStimulation& stim) override; + bool closeFile() override; +}; diff --git a/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/src/ovbt_sg_main.cpp b/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/src/ovbt_sg_main.cpp new file mode 100644 index 0000000..efe47c4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/src/ovbt_sg_main.cpp @@ -0,0 +1,89 @@ +#include "ovbt_sg_defines.h" + +#include +#include +#include +#include + +enum class EGenerationTypes { CPP, MATLAB, PYTHON, LUA, UNKNOWN }; + +EGenerationTypes parse_argument(std::string option) +{ + if (option == "--cpp") { return EGenerationTypes::CPP; } + if (option == "--matlab") { return EGenerationTypes::MATLAB; } + if (option == "--python") { return EGenerationTypes::PYTHON; } + if (option == "--lua") { return EGenerationTypes::LUA; } + return EGenerationTypes::UNKNOWN; +} + +int generate_generator_list(std::vector& list, EGenerationTypes type, int argc, char** argv) +{ + switch (type) + { + case EGenerationTypes::CPP: + { + if (argc < 4) { return -1; } + CFileGeneratorBase* gen = new CCppDefineGenerator(); + if (!gen->openFile(argv[3])) + { + std::cerr << "Unable to open " << argv[3] << std::endl; + return -1; + } + list.push_back(gen); + + gen = new CCppCodeGenerator(); + if (!gen->openFile(argv[4])) + { + std::cerr << "Unable to open " << argv[4] << std::endl; + return -1; + } + list.push_back(gen); + return 0; + } + + case EGenerationTypes::MATLAB: + { + CFileGeneratorBase* gen = new CMatlabGenerator(); + if (!gen->openFile(argv[3])) + { + std::cerr << "Unable to open " << argv[3] << std::endl; + return -1; + } + list.push_back(gen); + return 0; + } + case EGenerationTypes::PYTHON: + case EGenerationTypes::LUA: + case EGenerationTypes::UNKNOWN: + default: + { + std::cerr << "Unhandle type. Fatal error" << std::endl; + return -1; + } + } +} + +int main(int argc, char** argv) +{ + if (argc < 3) { return -1; } + EGenerationTypes type = parse_argument(argv[1]); + + std::vector stimulations; + std::vector generators; + + std::ifstream file(argv[2]); + std::string name, id, hexaCode; + while (file >> name >> id >> hexaCode) + { + SStimulation temp = { name, id, hexaCode }; + stimulations.push_back(temp); + } + + if (generate_generator_list(generators, type, argc, argv)) { return -1; } + + //Now we generate all files that needs to be done + for (auto& s : stimulations) { for (auto& g : generators) { g->appendStimulation(s); } } + for (auto& g : generators) { g->closeFile(); } + + return 0; +} diff --git a/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/src/ovbt_sg_matlab_generator.cpp b/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/src/ovbt_sg_matlab_generator.cpp new file mode 100644 index 0000000..6b9ebc7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/build-tool/stimulation-generator/src/ovbt_sg_matlab_generator.cpp @@ -0,0 +1,38 @@ +#include "ovbt_sg_defines.h" + +#include + +std::string getBrutHexaCode(std::string formatedHexaCode) +{ + std::string res = formatedHexaCode; + res.erase(res.begin(), res.begin() + 2); + return res; +} + +bool CMatlabGenerator::openFile(const char* filename) +{ + m_file.open(filename, std::ios::out | std::ios::trunc); + if (!m_file.is_open()) { return false; } + m_file << "function OV_stimulations()" << std::endl << std::endl; + + m_file << "global OVTK_StimulationId_LabelStart;" << std::endl; + m_file << "OVTK_StimulationId_LabelStart = uint64(hex2dec('00008100'));" << std::endl << std::endl; + m_file << "global OVTK_StimulationId_LabelEnd;" << std::endl; + m_file << "OVTK_StimulationId_LabelEnd = uint64(hex2dec('000081ff'));" << std::endl << std::endl; + + return true; +} + +bool CMatlabGenerator::appendStimulation(SStimulation& stim) +{ + m_file << "\tglobal " << stim.id << ";" << std::endl; + m_file << "\t" << stim.id << " = uint64(hex2dec('" << getBrutHexaCode(stim.hexa) << "'));" << std::endl << std::endl; + return true; +} + +bool CMatlabGenerator::closeFile() +{ + m_file << "end" << std::endl; + m_file.close(); + return true; +} diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBE.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBE.cmake new file mode 100644 index 0000000..d89ffcb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBE.cmake @@ -0,0 +1,33 @@ +# --------------------------------- +# Finds OpenViBE +# Adds library to target +# Adds include path +# --------------------------------- +OPTION(DYNAMIC_LINK_OPENVIBE "Dynamically link OpenViBE" ON) + +IF(DYNAMIC_LINK_OPENVIBE) + ADD_DEFINITIONS(-DOV_Shared) +ENDIF(DYNAMIC_LINK_OPENVIBE) + +IF(DYNAMIC_LINK_OPENVIBE) + SET(OPENVIBE_LINKING "") +ELSE(DYNAMIC_LINK_OPENVIBE) + SET(OPENVIBE_LINKING "-static") +ENDIF(DYNAMIC_LINK_OPENVIBE) + +set(SRC_DIR ${OV_BASE_DIR}/openvibe) + +SET(PATH_OPENVIBE "PATH_OPENVIBE-NOTFOUND") +FIND_PATH(PATH_OPENVIBE include/openvibe/ov_all.h PATHS ${SRC_DIR} NO_DEFAULT_PATH) +IF(PATH_OPENVIBE) + debug_message( " Found OpenViBE... [${PATH_OPENVIBE}]") + INCLUDE_DIRECTORIES(${PATH_OPENVIBE}/include/) + + TARGET_LINK_LIBRARIES(${PROJECT_NAME} openvibe${OPENVIBE_LINKING}) + + ADD_DEFINITIONS(-DTARGET_HAS_OpenViBE) +ELSE(PATH_OPENVIBE) + MESSAGE(WARNING " FAILED to find OpenViBE...") +ENDIF(PATH_OPENVIBE) + + diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBECommon.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBECommon.cmake new file mode 100644 index 0000000..da1b3cd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBECommon.cmake @@ -0,0 +1,21 @@ +# --------------------------------- +# Finds OpenViBE common include files +# Adds dependency to target +# Adds include path +# --------------------------------- + +SET(PATH_OPENVIBE_COMMON "PATH_OPENVIBE_COMMON-NOTFOUND") +FIND_PATH(PATH_OPENVIBE_COMMON ov_common_defines.h PATHS ${OV_BASE_DIR}/common/include NO_DEFAULT_PATH) +IF(PATH_OPENVIBE_COMMON) + debug_message( " Found openvibe-common...") + INCLUDE_DIRECTORIES(${PATH_OPENVIBE_COMMON}) + + ADD_DEPENDENCIES(${PROJECT_NAME} openvibe-common) + + ADD_DEFINITIONS(-DTARGET_HAS_OpenViBE_Common) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) +ELSE(PATH_OPENVIBE_COMMON) + MESSAGE(WARNING " FAILED to find openvibe-common...") +ENDIF(PATH_OPENVIBE_COMMON) + + diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEContributions.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEContributions.cmake new file mode 100644 index 0000000..8cc1957 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEContributions.cmake @@ -0,0 +1,14 @@ +# --------------------------------- +# Finds OpenViBE contributions +# Only serves to set up a define for the preprocessor +# --------------------------------- + +FIND_PATH(PATH_OPENVIBE_CONTRIBUTIONS common/contribAcquisitionServer.cmake PATHS ${OV_BASE_DIR}/contrib NO_DEFAULT_PATH) +IF(PATH_OPENVIBE_CONTRIBUTIONS) + debug_message( " Found openvibe-contributions...") + + ADD_DEFINITIONS(-DTARGET_HAS_OpenViBEContributions) +ELSE(PATH_OPENVIBE_CONTRIBUTIONS) + MESSAGE(WARNING " FAILED to find openvibe-contributions...") +ENDIF(PATH_OPENVIBE_CONTRIBUTIONS) + diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleCSV.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleCSV.cmake new file mode 100644 index 0000000..9458b5f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleCSV.cmake @@ -0,0 +1,30 @@ +# --------------------------------- +# Finds module CSV +# Adds library to target +# Adds include path +# --------------------------------- +OPTION(DYNAMIC_LINK_OPENVIBE_MODULE_CSV "Dynamically link OpenViBE module CSV" ON) + +IF(DYNAMIC_LINK_OPENVIBE_MODULE_CSV) + SET(OPENVIBE_MODULE_CSV_LINKING "") + ADD_DEFINITIONS(-DCSV_Shared) +ELSE() + SET(OPENVIBE_MODULE_CSV_LINKING "-static") + ADD_DEFINITIONS(-DCSV_Static) +ENDIF() + +set(PATH_OPENVIBE_MODULES_CSV "PATH_OPENVIBE_MODULES_CSV-NOTFOUND") +set(SRC_DIR ${OV_BASE_DIR}/modules/csv/include) + +FIND_PATH(PATH_OPENVIBE_MODULES_CSV csv/defines.h PATHS ${SRC_DIR} NO_DEFAULT_PATH) + +IF(PATH_OPENVIBE_MODULES_CSV) + debug_message( " Found OpenViBE module CSV...") + INCLUDE_DIRECTORIES(${PATH_OPENVIBE_MODULES_CSV}/) + debug_message( " Link openvibe-module-csv${OPENVIBE_MODULE_CSV_LINKING}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} openvibe-module-csv${OPENVIBE_MODULE_CSV_LINKING}) + + ADD_DEFINITIONS(-DTARGET_HAS_CSV) +ELSE() + MESSAGE(WARNING " FAILED to find OpenViBE module CSV...") +ENDIF() diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleCommunication.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleCommunication.cmake new file mode 100644 index 0000000..84faee3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleCommunication.cmake @@ -0,0 +1,29 @@ +# --------------------------------- +# Finds module Communication +# Adds library to target +# Adds include path +# --------------------------------- +OPTION(DYNAMIC_LINK_OPENVIBE_MODULE_COMMUNICATION "Dynamically link OpenViBE module Communication" ON) + +IF(DYNAMIC_LINK_OPENVIBE_MODULE_COMMUNICATION) + SET(OPENVIBE_MODULE_COMMUNICATION_LINKING "") + ADD_DEFINITIONS(-DCommunication_Shared) +ELSE() + SET(OPENVIBE_MODULE_COMMUNICATION_LINKING "-static") + ADD_DEFINITIONS(-DCommunication_Static) +ENDIF() + +set(PATH_OPENVIBE_MODULES_COMMUNICATION "PATH_OPENVIBE_MODULES_COMMUNICATION-NOTFOUND") +set(SRC_DIR ${OV_BASE_DIR}/modules/communication/include) + +FIND_PATH(PATH_OPENVIBE_MODULES_COMMUNICATION communication/defines.h PATHS ${SRC_DIR} NO_DEFAULT_PATH) +IF(PATH_OPENVIBE_MODULES_COMMUNICATION) + MESSAGE(STATUS " Found OpenViBE module Communication... ${PATH_OPENVIBE_MODULE_COMMUNICATION}/openvibe-module-communication${OPENVIBE_MODULE_COMMUNICATION_LINKING}") + INCLUDE_DIRECTORIES(${PATH_OPENVIBE_MODULES_COMMUNICATION}/) + + TARGET_LINK_LIBRARIES(${PROJECT_NAME} openvibe-module-communication${OPENVIBE_MODULE_COMMUNICATION_LINKING}) + + ADD_DEFINITIONS(-DTARGET_HAS_COMMUNICATION) +ELSE() + MESSAGE(WARNING " FAILED to find OpenViBE module Communication...") +ENDIF() diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleDate.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleDate.cmake new file mode 100644 index 0000000..916948c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleDate.cmake @@ -0,0 +1,29 @@ +# --------------------------------- +# Finds module Date +# Adds library to target +# Adds include path +# --------------------------------- +OPTION(DYNAMIC_LINK_OPENVIBE_MODULE_DATE "Dynamically link OpenViBE module Date" OFF) + +IF(DYNAMIC_LINK_OPENVIBE_MODULE_DATE) + SET(OPENVIBE_MODULE_DATE_LINKING "") + ADD_DEFINITIONS(-DDATE_Shared) +ELSE() + SET(OPENVIBE_MODULE_DATE_LINKING "-static") + ADD_DEFINITIONS(-DDATE_Static) +ENDIF() + +set(PATH_OPENVIBE_MODULES_DATE "PATH_OPENVIBE_MODULES_DATE-NOTFOUND") +set(SRC_DIR ${OV_BASE_DIR}/modules/date/include) + +FIND_PATH(PATH_OPENVIBE_MODULES_DATE date/defines.h PATHS ${SRC_DIR} NO_DEFAULT_PATH) +IF(PATH_OPENVIBE_MODULES_DATE) + debug_message( " Found OpenViBE module Date...") + INCLUDE_DIRECTORIES(${PATH_OPENVIBE_MODULES_DATE}/) + + TARGET_LINK_LIBRARIES(${PROJECT_NAME} openvibe-module-date${OPENVIBE_MODULE_DATE_LINKING}) + + ADD_DEFINITIONS(-DTARGET_HAS_DATE) +ELSE() + MESSAGE(WARNING " FAILED to find OpenViBE module Date...") +ENDIF() diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleEBML.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleEBML.cmake new file mode 100644 index 0000000..01726f7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleEBML.cmake @@ -0,0 +1,29 @@ +# --------------------------------- +# Finds module EBML +# Adds library to target +# Adds include path +# --------------------------------- +OPTION(DYNAMIC_LINK_OPENVIBE_MODULE_EBML "Dynamically link OpenViBE module EBML" ON) + +IF(DYNAMIC_LINK_OPENVIBE_MODULE_EBML) + SET(OPENVIBE_MODULE_EBML_LINKING "") + ADD_DEFINITIONS(-DEBML_Shared) +ELSE() + SET(OPENVIBE_MODULE_EBML_LINKING "-static") + ADD_DEFINITIONS(-DEBML_Static) +ENDIF() + +set(PATH_OPENVIBE_MODULES_EBML "PATH_OPENVIBE_MODULES_EBML-NOTFOUND") +set(SRC_DIR ${OV_BASE_DIR}/modules/ebml/include) + +FIND_PATH(PATH_OPENVIBE_MODULES_EBML ebml/defines.h PATHS ${SRC_DIR} NO_DEFAULT_PATH) +IF(PATH_OPENVIBE_MODULES_EBML) + debug_message( " Found OpenViBE module EBML...") + INCLUDE_DIRECTORIES(${PATH_OPENVIBE_MODULES_EBML}/) + + TARGET_LINK_LIBRARIES(${PROJECT_NAME} openvibe-module-ebml${OPENVIBE_MODULE_EBML_LINKING}) + + ADD_DEFINITIONS(-DTARGET_HAS_EBML) +ELSE(PATH_OPENVIBE_MODULES_EBML) + MESSAGE(WARNING " FAILED to find OpenViBE module EBML...") +ENDIF(PATH_OPENVIBE_MODULES_EBML) diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleFS.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleFS.cmake new file mode 100644 index 0000000..e4d2eb7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleFS.cmake @@ -0,0 +1,29 @@ +# --------------------------------- +# Finds module FS +# Adds library to target +# Adds include path +# --------------------------------- +OPTION(DYNAMIC_LINK_OPENVIBE_MODULE_FS "Dynamically link OpenViBE module FS" ON) + +IF(DYNAMIC_LINK_OPENVIBE_MODULE_FS) + SET(OPENVIBE_MODULE_FS_LINKING "") + ADD_DEFINITIONS(-DFS_Shared) +ELSE() + SET(OPENVIBE_MODULE_FS_LINKING "-static") + ADD_DEFINITIONS(-DFS_Static) +ENDIF() + +set(PATH_OPENVIBE_MODULES_FS "PATH_OPENVIBE_MODULES_FS-NOTFOUND") +set(SRC_DIR ${OV_BASE_DIR}/modules/fs/include) + +FIND_PATH(PATH_OPENVIBE_MODULES_FS fs/defines.h PATHS ${SRC_DIR} NO_DEFAULT_PATH) +IF(PATH_OPENVIBE_MODULES_FS) + debug_message( " Found OpenViBE module FS... openvibe-module-fs${OPENVIBE_MODULE_FS_LINKING}") + INCLUDE_DIRECTORIES(${PATH_OPENVIBE_MODULES_FS}/) + + TARGET_LINK_LIBRARIES(${PROJECT_NAME} openvibe-module-fs${OPENVIBE_MODULE_FS_LINKING}) + + ADD_DEFINITIONS(-DTARGET_HAS_FS) +ELSE(PATH_OPENVIBE_MODULES_FS) + MESSAGE(WARNING " FAILED to find OpenViBE module FS...") +ENDIF(PATH_OPENVIBE_MODULES_FS) diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleSocket.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleSocket.cmake new file mode 100644 index 0000000..188b36b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleSocket.cmake @@ -0,0 +1,48 @@ +# --------------------------------- +# Finds module Socket +# Adds library to target +# Adds include path +# --------------------------------- +OPTION(DYNAMIC_LINK_OPENVIBE_MODULE_SOCKET "Dynamically link OpenViBE module Socket" ON) + +IF(DYNAMIC_LINK_OPENVIBE_MODULE_SOCKET) + SET(OPENVIBE_MODULE_SOCKET_LINKING "") + ADD_DEFINITIONS(-DSocket_Shared) +ELSE() + SET(OPENVIBE_MODULE_SOCKET_LINKING "-static") + ADD_DEFINITIONS(-DSocket_Static) +ENDIF() + +set(PATH_OPENVIBE_MODULES_SOCKET "PATH_OPENVIBE_MODULES_SOCKET-NOTFOUND") +set(SRC_DIR ${OV_BASE_DIR}/modules/socket/include) + +FIND_PATH(PATH_OPENVIBE_MODULES_SOCKET socket/defines.h PATHS ${SRC_DIR} NO_DEFAULT_PATH) +IF(PATH_OPENVIBE_MODULES_SOCKET) + debug_message( " Found OpenViBE module Socket... ${PATH_OPENVIBE_MODULE_SOCKET}/openvibe-module-socket${OPENVIBE_MODULE_SOCKET_LINKING}") + INCLUDE_DIRECTORIES(${PATH_OPENVIBE_MODULES_SOCKET}/) + + TARGET_LINK_LIBRARIES(${PROJECT_NAME} openvibe-module-socket${OPENVIBE_MODULE_SOCKET_LINKING}) + + ADD_DEFINITIONS(-DTARGET_HAS_Socket) + + # if we link with the module socket in Static, we must link the project with the dependency on win32 + IF(WIN32 AND NOT DYNAMIC_LINK_OPENVIBE_MODULE_SOCKET) + INCLUDE("FindThirdPartyWinsock2") + +# FIND_LIBRARY(LIB_STANDARD_MODULE_WINSOCK ws2_32) +# IF(LIB_STANDARD_MODULE_WINSOCK) +# debug_message( " Found ws2_32...") +# IF(TARGET ${PROJECT_NAME}) +# TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_WINSOCK}) +# ENDIF() +# IF(TARGET ${PROJECT_NAME}-static) +# TARGET_LINK_LIBRARIES(${PROJECT_NAME}-static ${LIB_STANDARD_MODULE_WINSOCK}) +# ENDIF() +# ELSE(LIB_STANDARD_MODULE_WINSOCK) +# debug_message( " FAILED to find ws2_32...") +# ENDIF(LIB_STANDARD_MODULE_WINSOCK) + ENDIF(WIN32 AND NOT DYNAMIC_LINK_OPENVIBE_MODULE_SOCKET) + +ELSE(PATH_OPENVIBE_MODULES_SOCKET) + MESSAGE(WARNING " FAILED to find OpenViBE module Socket...") +ENDIF(PATH_OPENVIBE_MODULES_SOCKET) diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleStream.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleStream.cmake new file mode 100644 index 0000000..cc6d0cf --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleStream.cmake @@ -0,0 +1,30 @@ +# --------------------------------- +# Finds module Stream +# Adds library to target +# Adds include path +# --------------------------------- +OPTION(DYNAMIC_LINK_OPENVIBE_MODULE_STREAM "Dynamically link OpenViBE module Stream" ON) + +IF(DYNAMIC_LINK_OPENVIBE_MODULE_STREAM) + SET(OPENVIBE_MODULE_STREAM_LINKING "") +ELSE(DYNAMIC_LINK_OPENVIBE_MODULE_STREAM) + SET(OPENVIBE_MODULE_STREAM_LINKING "-static") +ENDIF(DYNAMIC_LINK_OPENVIBE_MODULE_STREAM) + +IF(OV_BRANCH_MODULES_STREAM) + set(SRC_DIR ${OV_BASE_DIR}/openvibe-modules/stream/${OV_BRANCH_MODULES_STREAM}) +ELSE(OV_BRANCH_MODULES_STREAM) + set(SRC_DIR ${OV_BASE_DIR}/openvibe-modules/stream/${OV_TRUNK}) +ENDIF(OV_BRANCH_MODULES_STREAM) + +FIND_PATH(PATH_OPENVIBE_MODULES_STREAM src/stream/defines.h PATHS ${OV_BASE_DIR}/openvibe-modules/stream) +IF(PATH_OPENVIBE_MODULES_STREAM) + debug_message( " Found OpenViBE module Stream...") + INCLUDE_DIRECTORIES(${PATH_OPENVIBE_MODULES_STREAM}/include) + + TARGET_LINK_LIBRARIES(${PROJECT_NAME} openvibe-module-stream${OPENVIBE_MODULE_STREAM_LINKING}) + + ADD_DEFINITIONS(-DTARGET_HAS_Stream) +ELSE(PATH_OPENVIBE_MODULES_STREAM) + MESSAGE(WARNING " FAILED to find OpenViBE module Stream...") +ENDIF(PATH_OPENVIBE_MODULES_STREAM) diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleSystem.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleSystem.cmake new file mode 100644 index 0000000..408646f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleSystem.cmake @@ -0,0 +1,29 @@ +# --------------------------------- +# Finds module System +# Adds library to target +# Adds include path +# --------------------------------- +OPTION(DYNAMIC_LINK_OPENVIBE_MODULE_SYSTEM "Dynamically link OpenViBE module System" ON) + +IF(DYNAMIC_LINK_OPENVIBE_MODULE_SYSTEM) + SET(OPENVIBE_MODULE_SYSTEM_LINKING "") + ADD_DEFINITIONS(-DSystem_Shared) +ELSE() + SET(OPENVIBE_MODULE_SYSTEM_LINKING "-static") + ADD_DEFINITIONS(-DSystem_Static) +ENDIF() + +set(PATH_OPENVIBE_MODULES_SYSTEM "PATH_OPENVIBE_MODULES_SYSTEM-NOTFOUND") +set(SRC_DIR ${OV_BASE_DIR}/modules/system/include) + +FIND_PATH(PATH_OPENVIBE_MODULES_SYSTEM system/defines.h PATHS ${SRC_DIR} NO_DEFAULT_PATH) +IF(PATH_OPENVIBE_MODULES_SYSTEM) + debug_message( " Found OpenViBE module System...") + INCLUDE_DIRECTORIES(${PATH_OPENVIBE_MODULES_SYSTEM}/) + + TARGET_LINK_LIBRARIES(${PROJECT_NAME} openvibe-module-system${OPENVIBE_MODULE_SYSTEM_LINKING}) + + ADD_DEFINITIONS(-DTARGET_HAS_System) +ELSE(PATH_OPENVIBE_MODULES_SYSTEM) + MESSAGE(WARNING " FAILED to find OpenViBE module System...") +ENDIF(PATH_OPENVIBE_MODULES_SYSTEM) diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleXML.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleXML.cmake new file mode 100644 index 0000000..d17c978 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEModuleXML.cmake @@ -0,0 +1,30 @@ +# --------------------------------- +# Finds module XML +# Adds library to target +# Adds include path +# --------------------------------- +OPTION(DYNAMIC_LINK_OPENVIBE_MODULE_XML "Dynamically link OpenViBE module XML" ON) + +IF(DYNAMIC_LINK_OPENVIBE_MODULE_XML) + SET(OPENVIBE_MODULE_XML_LINKING "") + ADD_DEFINITIONS(-DXML_Shared) +ELSE(DYNAMIC_LINK_OPENVIBE_MODULE_XML) + SET(OPENVIBE_MODULE_XML_LINKING "-static") + ADD_DEFINITIONS(-DXML_Static) + SET(Boost_USE_STATIC_LIBS ON) +ENDIF(DYNAMIC_LINK_OPENVIBE_MODULE_XML) + +set(PATH_OPENVIBE_MODULES_XML "PATH_OPENVIBE_MODULES_XML-NOTFOUND") +set(SRC_DIR ${OV_BASE_DIR}/modules/xml/include) + +FIND_PATH(PATH_OPENVIBE_MODULES_XML xml/defines.h PATHS ${SRC_DIR} NO_DEFAULT_PATH) +IF(PATH_OPENVIBE_MODULES_XML) + debug_message( " Found OpenViBE module XML...") + INCLUDE_DIRECTORIES(${PATH_OPENVIBE_MODULES_XML}/) + + TARGET_LINK_LIBRARIES(${PROJECT_NAME} openvibe-module-xml${OPENVIBE_MODULE_XML_LINKING}) + + ADD_DEFINITIONS(-DTARGET_HAS_XML) +ELSE(PATH_OPENVIBE_MODULES_XML) + MESSAGE(WARNING " FAILED to find OpenViBE module XML...") +ENDIF(PATH_OPENVIBE_MODULES_XML) diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEPluginsGlobalDefines.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEPluginsGlobalDefines.cmake new file mode 100644 index 0000000..97d83f3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEPluginsGlobalDefines.cmake @@ -0,0 +1,18 @@ +# --------------------------------- +# Finds OpenViBEPluginsGlobalDefines +# Adds library to target +# Adds include path +# +# @deprecated Running FindOpenVibeCommon.cmake is sufficient +# +# --------------------------------- +SET(PATH_OpenViBEPluginsGlobalDefines "PATH_OpenViBEPluginsGlobalDefines-NOTFOUND") +FIND_PATH(PATH_OpenViBEPluginsGlobalDefines ovp_global_defines.h PATHS ${OV_BASE_DIR}/common/include NO_DEFAULT_PATH) +IF(PATH_OpenViBEPluginsGlobalDefines) + debug_message( " Found OpenViBE plugins global defines...") + INCLUDE_DIRECTORIES(${PATH_OpenViBEPluginsGlobalDefines}) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) +ELSE(PATH_OpenViBEPluginsGlobalDefines) + MESSAGE(WARNING " FAILED to find OpenViBE plugins global defines") +ENDIF(PATH_OpenViBEPluginsGlobalDefines) diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEToolkit.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEToolkit.cmake new file mode 100644 index 0000000..9806ff0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindOpenViBEToolkit.cmake @@ -0,0 +1,38 @@ +# --------------------------------- +# Finds openvibe-toolkit +# Adds library to target +# Adds include path +# --------------------------------- +OPTION(LINK_OPENVIBE_TOOLKIT "By default, link openvibe-toolkit, otherwise only use the includes" ON) +OPTION(DYNAMIC_LINK_OPENVIBE_TOOLKIT "Dynamically link openvibe-toolkit" ON) + +IF(DYNAMIC_LINK_OPENVIBE_TOOLKIT) + SET(OPENVIBE_TOOLKIT_LINKING "") + ADD_DEFINITIONS(-DOVTK_Shared) +ELSE() + SET(OPENVIBE_TOOLKIT_LINKING "-static") + ADD_DEFINITIONS(-DOVTK_Static) +ENDIF() + +SET(SRC_DIR ${OV_BASE_DIR}/toolkit/include) + +FIND_PATH(PATH_OPENVIBE_TOOLKIT toolkit/ovtk_all.h PATHS ${SRC_DIR} NO_DEFAULT_PATH) + +IF(PATH_OPENVIBE_TOOLKIT) + debug_message( " Found openvibe-toolkit... ${PATH_OPENVIBE_TOOLKIT} ${PATH_OPENVIBE_TOOLKIT_BIN}") + INCLUDE_DIRECTORIES(${PATH_OPENVIBE_TOOLKIT}) + + # No find path for this directory as content is not generated yet + INCLUDE_DIRECTORIES(${OV_BASE_BIN_DIR}/toolkit/include) + + IF(LINK_OPENVIBE_TOOLKIT) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} openvibe-toolkit${OPENVIBE_TOOLKIT_LINKING}) + ENDIF() + + ADD_DEFINITIONS(-DTARGET_HAS_OpenViBEToolkit) +ELSE() + MESSAGE(FATAL " FAILED to find openvibe-toolkit...") +ENDIF() + + +INCLUDE("FindOpenViBEModuleXML") diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindSourceDependencyDSPFilters.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindSourceDependencyDSPFilters.cmake new file mode 100644 index 0000000..86ddc66 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindSourceDependencyDSPFilters.cmake @@ -0,0 +1,10 @@ +# --------------------------------- +# Finds DSP filters sources +# Sets dsp_filters_source_files +# Adds appropriate include dir +# --------------------------------- + +FILE(GLOB_RECURSE dsp_filters_source_files ${OV_SOURCE_DEPENDENCIES_PATH}/dsp-filters/*.cpp ${OV_SOURCE_DEPENDENCIES_PATH}/dsp-filters/*.c ${OV_SOURCE_DEPENDENCIES_PATH}/dsp-filters/*.h) +ADD_DEFINITIONS(-DTARGET_HAS_DSPFilters) +INCLUDE_DIRECTORIES("${OV_SOURCE_DEPENDENCIES_PATH}") +SET(SRC_FILES "${SRC_FILES};${dsp_filters_source_files}") diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindSourceDependencyLepton.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindSourceDependencyLepton.cmake new file mode 100644 index 0000000..63b6f5a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindSourceDependencyLepton.cmake @@ -0,0 +1,10 @@ +# --------------------------------- +# Finds Lepton sources +# Sets lepton_source_files +# Adds appropriate include dir +# --------------------------------- + +FILE(GLOB_RECURSE lepton_source_files ${OV_SOURCE_DEPENDENCIES_PATH}/lepton/*.cpp ${OV_SOURCE_DEPENDENCIES_PATH}/lepton/*.h) +ADD_DEFINITIONS(-DTARGET_HAS_LEPTON) +INCLUDE_DIRECTORIES("${OV_SOURCE_DEPENDENCIES_PATH}") +SET(SRC_FILES "${SRC_FILES};${lepton_source_files}") diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindSourceDependencyR8Brain.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindSourceDependencyR8Brain.cmake new file mode 100644 index 0000000..ab45bae --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindSourceDependencyR8Brain.cmake @@ -0,0 +1,10 @@ +# --------------------------------- +# Find r8brain sources +# Sets r9brain_source_files +# Adds appropriate include dir +# --------------------------------- + +FILE(GLOB_RECURSE r8brain_source_files ${OV_SOURCE_DEPENDENCIES_PATH}/r8brain/*.cpp ${OV_SOURCE_DEPENDENCIES_PATH}/r8brain/*.h) +ADD_DEFINITIONS(-DTARGET_HAS_R8BRAIN) +INCLUDE_DIRECTORIES("${OV_SOURCE_DEPENDENCIES_PATH}") +SET(SRC_FILES "${SRC_FILES};${r8brain_source_files}") diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindSourceDependencyWavelib.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindSourceDependencyWavelib.cmake new file mode 100644 index 0000000..1adf8fb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindSourceDependencyWavelib.cmake @@ -0,0 +1,10 @@ +# --------------------------------- +# Finds wavelib sources +# Sets wavelib_source_files +# Adds appropriate include dir +# --------------------------------- + +FILE(GLOB_RECURSE wavelib_source_files ${OV_SOURCE_DEPENDENCIES_PATH}/wavelib/src/*.cpp ${OV_SOURCE_DEPENDENCIES_PATH}/wavelib/src/*.c ${OV_SOURCE_DEPENDENCIES_PATH}/wavelib/src/*.h ${OV_SOURCE_DEPENDENCIES_PATH}/wavelib/header/*.h) +ADD_DEFINITIONS(-DTARGET_HAS_WAVELIB) +INCLUDE_DIRECTORIES("${OV_SOURCE_DEPENDENCIES_PATH}") +SET(SRC_FILES "${SRC_FILES};${wavelib_source_files}") diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindSourceRCProperties.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindSourceRCProperties.cmake new file mode 100644 index 0000000..2383530 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindSourceRCProperties.cmake @@ -0,0 +1,10 @@ +# --------------------------------- +# Configure RC file +# Sets SRC_FILES to add the path to the newly created rc file +# Adds appropriate include dir +# --------------------------------- +IF(WIN32) + OV_CONFIGURE_RC(NAME ${PROJECT_NAME}) + SET(SRC_FILES "${SRC_FILES};${CMAKE_BINARY_DIR}/resource-files/${PROJECT_NAME}.rc") +ENDIF() + diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyBoost.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyBoost.cmake new file mode 100644 index 0000000..e3ed3f7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyBoost.cmake @@ -0,0 +1,18 @@ +# --------------------------------- +# Finds third party boost +# Adds library to target +# Adds include path +# --------------------------------- + +SET(PATH_BOOST "PATH_BOOST-NOTFOUND") +FIND_PATH(PATH_BOOST "include/boost/config/auto_link.hpp" PATHS ${OV_CUSTOM_DEPENDENCIES_PATH}/boost ${OV_CUSTOM_DEPENDENCIES_PATH} NO_DEFAULT_PATH) +FIND_PATH(PATH_BOOST "include/boost/config/auto_link.hpp" PATHS ${OV_CUSTOM_DEPENDENCIES_PATH}/boost) + +IF(PATH_BOOST) + debug_message( " Found boost includes...") + INCLUDE_DIRECTORIES(${PATH_BOOST}/include) + + ADD_DEFINITIONS(-DTARGET_HAS_Boost) +ELSE(PATH_BOOST) + MESSAGE(WARNING " FAILED to find boost includes...") +ENDIF(PATH_BOOST) diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyBoost_Chrono.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyBoost_Chrono.cmake new file mode 100644 index 0000000..d7b577b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyBoost_Chrono.cmake @@ -0,0 +1,31 @@ +# --------------------------------- +# Finds third party boost chrono +# Adds a def that its present +# --------------------------------- + +FIND_PATH(PATH_BOOST_CHRONO "include/boost/chrono.hpp" PATHS ${OV_CUSTOM_DEPENDENCIES_PATH}/boost ${OV_CUSTOM_DEPENDENCIES_PATH} NO_DEFAULT_PATH) +FIND_PATH(PATH_BOOST_CHRONO "include/boost/chrono.hpp" PATHS ${OV_CUSTOM_DEPENDENCIES_PATH}/boost) + +IF(PATH_BOOST_CHRONO) + debug_message( " Found boost chrono includes...") + ADD_DEFINITIONS(-DTARGET_HAS_Boost_Chrono) +ELSE(PATH_BOOST_CHRONO) + MESSAGE(WARNING " FAILED to find boost chrono includes...") +ENDIF(PATH_BOOST_CHRONO) + +IF(UNIX) + FIND_LIBRARY(LIB_Boost_Chrono NAMES "boost_chrono-mt" "boost_chrono" PATHS ${OV_CUSTOM_DEPENDENCIES_PATH}/lib NO_DEFAULT_PATH) + FIND_LIBRARY(LIB_Boost_Chrono NAMES "boost_chrono-mt" "boost_chrono" PATHS ${OV_CUSTOM_DEPENDENCIES_PATH}/lib) + + IF(LIB_Boost_Chrono) + debug_message( " [ OK ] lib ${LIB_Boost_Chrono}") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_Boost_Chrono} ) + ELSE(LIB_Boost_Chrono) + MESSAGE(WARNING " [FAILED] lib boost_chrono-mt") + MESSAGE(WARNING " [FAILED] lib boost_chrono") + ENDIF(LIB_Boost_Chrono) +ENDIF(UNIX) + +IF(WIN32) + OV_LINK_BOOST_LIB("chrono" ${OV_WIN32_BOOST_VERSION}) +ENDIF(WIN32) diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyBoost_FileSystem.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyBoost_FileSystem.cmake new file mode 100644 index 0000000..5da3c2f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyBoost_FileSystem.cmake @@ -0,0 +1,32 @@ +# --------------------------------- +# Finds third party boost +# Adds library to target +# Adds include path +# --------------------------------- +IF(APPLE) +find_package(Boost 1.60.0 COMPONENTS filesystem system) +if(Boost_FOUND) + include_directories(${Boost_INCLUDE_DIRS}) + target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES}) +endif() +ELSEIF(UNIX) + find_package(Boost 1.54.0 COMPONENTS filesystem system) + if(Boost_FOUND) + include_directories(${Boost_INCLUDE_DIRS}) + target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES}) + endif() + + # For Fedora + FIND_LIBRARY(LIB_STANDARD_MODULE_PTHREAD pthread) + IF(LIB_STANDARD_MODULE_PTHREAD) + debug_message( " Found pthread...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_PTHREAD}) + ELSE(LIB_STANDARD_MODULE_PTHREAD) + MESSAGE(WARNING " FAILED to find pthread...") + ENDIF(LIB_STANDARD_MODULE_PTHREAD) +ENDIF() + +IF(WIN32) + OV_LINK_BOOST_LIB("filesystem" ${OV_WIN32_BOOST_VERSION} ) + OV_LINK_BOOST_LIB("system" ${OV_WIN32_BOOST_VERSION} ) # filesystem depends on system +ENDIF(WIN32) diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyEigen.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyEigen.cmake new file mode 100644 index 0000000..ed700ac --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyEigen.cmake @@ -0,0 +1,54 @@ +# --------------------------------- +# Finds Eigen headers +# +# Adds include path +# --------------------------------- + +IF(WIN32) + SET(PATH_EIGEN "PATH_EIGEN-NOTFOUND") + FIND_PATH(PATH_EIGEN Eigen/Eigen PATHS ${OV_CUSTOM_DEPENDENCIES_PATH}/eigen NO_DEFAULT_PATH) + IF(PATH_EIGEN) + SET(EIGEN_FOUND TRUE) + SET(EIGEN_INCLUDE_DIRS ${PATH_EIGEN}) + SET(EIGEN_CFLAGS "") + #SET(EIGEN_LIBRARIES_RELEASE EIGEN) + #SET(EIGEN_LIBRARIES_DEBUG EIGENd) + #SET(EIGEN_LIBRARY_DIRS ${PATH_EIGEN}/lib ) + ENDIF(PATH_EIGEN) +ENDIF(WIN32) + +IF(UNIX) + + # @FIXME remove that when an Ubuntu package will be available + # Find in priority local library for eigen even if linux package has been installed + # reason: package on distri Ubuntu 16.04 is still bugged (eigen 3.2.92) + INCLUDE("FindPkgConfig") + UNSET(PATH_EIGEN_LOCAL CACHE) + FIND_PATH(PATH_EIGEN_LOCAL eigen3 PATHS "/usr/local/include" NO_DEFAULT_PATH) + SET(EIGEN_FOUND FALSE) + IF (PATH_EIGEN_LOCAL) + SET(EIGEN_INCLUDE_DIRS "${PATH_EIGEN_LOCAL}/eigen3") + SET(EIGEN_CFLAGS "-I${EIGEN_INCLUDE_DIRS}") + SET(EIGEN_FOUND TRUE) + ELSE() + pkg_check_modules(EIGEN eigen3) + ENDIF() + + # @FIXME uncomment that when an Ubuntu package will be available + #SET(EIGEN_FOUND FALSE) + #INCLUDE("FindPkgConfig") + #pkg_check_modules(EIGEN eigen3) + +ENDIF(UNIX) + +IF(EIGEN_FOUND) + debug_message( "Found eigen3... [${EIGEN_INCLUDE_DIRS}]") + INCLUDE_DIRECTORIES("${EIGEN_INCLUDE_DIRS}") + ADD_DEFINITIONS(${EIGEN_CFLAGS}) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyEIGEN) +ELSE(EIGEN_FOUND) + MESSAGE(WARNING " FAILED to find eigen3...") +ENDIF(EIGEN_FOUND) + + + diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyExpat.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyExpat.cmake new file mode 100644 index 0000000..f168f12 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyExpat.cmake @@ -0,0 +1,77 @@ +# --------------------------------- +# Finds EXPAT toolkit +# +# Sets EXPAT_FOUND +# Sets EXPAT_LIBRARIES +# Sets EXPAT_LIBRARY_DIRS +# Sets EXPAT_LDFLAGS +# Sets EXPAT_LDFLAGS_OTHERS +# Sets EXPAT_INCLUDE_DIRS +# Sets EXPAT_CFLAGS +# Sets EXPAT_CFLAGS_OTHERS +# --------------------------------- +IF(UNIX) + SET(EXPAT_expat_INCLUDE_PATH "EXPAT_expat_INCLUDE_PATH-NOTFOUND") + FIND_PATH(EXPAT_expat_INCLUDE_PATH "expat.h" + PATHS "${OV_CUSTOM_DEPENDENCIES_PATH}/include") + FIND_LIBRARY(EXPAT_expat_LIBRARY + NAMES expat + PATHS "${OV_CUSTOM_DEPENDENCIES_PATH}/lib") +ENDIF(UNIX) + +IF(WIN32) + SET(EXPAT_expat_INCLUDE_PATH "EXPAT_expat_INCLUDE_PATH-NOTFOUND") + FIND_PATH(EXPAT_expat_INCLUDE_PATH "expat.h" + PATHS ${OV_CUSTOM_DEPENDENCIES_PATH} PATH_SUFFIXES expat/include expat/Source/lib) + FIND_LIBRARY(EXPAT_expat_LIBRARY + NAMES libexpat + PATHS ${OV_CUSTOM_DEPENDENCIES_PATH} PATH_SUFFIXES expat/Lib expat/Bin) + + FIND_PATH(EXPAT_BIN . PATHS ${OV_CUSTOM_DEPENDENCIES_PATH} PATH_SUFFIXES expat/Bin NO_DEFAULT_PATH) + + INSTALL( + DIRECTORY ${EXPAT_BIN}/ + DESTINATION ${DIST_BINDIR} + FILES_MATCHING PATTERN "*.dll") +ENDIF(WIN32) + +IF(EXPAT_expat_INCLUDE_PATH) +IF(EXPAT_expat_LIBRARY) + SET(EXPAT_FOUND TRUE) + SET(EXPAT_LIBRARIES ${EXPAT_expat_LIBRARY}) + SET(EXPAT_LIBRARY_DIRS "") + SET(EXPAT_LDFLAGS "") + SET(EXPAT_LDFLAGS_OTHERS "") + SET(EXPAT_INCLUDE_DIRS ${EXPAT_expat_INCLUDE_PATH}) + SET(EXPAT_CFLAGS "") + SET(EXPAT_CFLAGS_OTHERS "") +ENDIF(EXPAT_expat_LIBRARY) +ENDIF(EXPAT_expat_INCLUDE_PATH) + +MARK_AS_ADVANCED( + EXPAT_expat_INCLUDE_PATH + EXPAT_expat_LIBRARY + + EXPAT_FOUND + EXPAT_LIBRARIES + EXPAT_LIBRARY_DIRS + EXPAT_LDFLAGS + EXPAT_LDFLAGS_OTHERS + EXPAT_INCLUDE_DIRS + EXPAT_CFLAGS + EXPAT_CFLAGS_OTHERS +) + +IF(EXPAT_FOUND) + debug_message( " Found expat...") + INCLUDE_DIRECTORIES(${EXPAT_INCLUDE_DIRS}) + ADD_DEFINITIONS(${EXPAT_CFLAGS}) + ADD_DEFINITIONS(${EXPAT_CFLAGS_OTHERS}) + # LINK_DIRECTORIES(${EXPAT_LIBRARY_DIRS}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${EXPAT_LIBRARIES}) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyExpat) +ELSE(EXPAT_FOUND) + MESSAGE(WARNING " FAILED to find expat...") +ENDIF(EXPAT_FOUND) + diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyTVicPort.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyTVicPort.cmake new file mode 100644 index 0000000..f615f39 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyTVicPort.cmake @@ -0,0 +1,63 @@ +# --------------------------------- +# Finds TVicPort toolkit +# +# Sets TVICPORT_FOUND +# Sets TVICPORT_LIBRARIES +# Sets TVICPORT_LIBRARY_DIRS +# Sets TVICPORT_LDFLAGS +# Sets TVICPORT_LDFLAGS_OTHERS +# Sets TVICPORT_INCLUDE_DIRS +# Sets TVICPORT_CFLAGS +# Sets TVICPORT_CFLAGS_OTHERS +# --------------------------------- + +IF(WIN32) + SET(TVICPORT_tvicport_INCLUDE_PATH "TVICPORT_tvicport_INCLUDE_PATH-NOTFOUND") + + FIND_PATH(TVICPORT_tvicport_INCLUDE_PATH "TVicPort.h" + PATHS "${OV_CUSTOM_DEPENDENCIES_PATH}/tvicport/include") + + # FIND_LIBRARY(TVICPORT_tvicport_LIBRARY + # NAMES TVicPort + # PATHS "${OV_CUSTOM_DEPENDENCIES_PATH}/tvicport/libs") +ENDIF(WIN32) + +IF(TVICPORT_tvicport_INCLUDE_PATH) + IF(TVICPORT_tvicport_LIBRARY) + SET(TVICPORT_FOUND TRUE) + #SET(TVICPORT_LIBRARIES ${TVICPORT_tvicport_LIBRARY}) + #SET(TVICPORT_LIBRARY_DIRS "") + SET(TVICPORT_LDFLAGS "") + SET(TVICPORT_LDFLAGS_OTHERS "") + SET(TVICPORT_INCLUDE_DIRS ${TVICPORT_tvicport_INCLUDE_PATH}) + SET(TVICPORT_CFLAGS "") + SET(TVICPORT_CFLAGS_OTHERS "") + ENDIF(TVICPORT_tvicport_LIBRARY) +ENDIF(TVICPORT_tvicport_INCLUDE_PATH) + +MARK_AS_ADVANCED( + TVICPORT_tvicport_INCLUDE_PATH + TVICPORT_tvicport_LIBRARY + + TVICPORT_FOUND + #TVICPORT_LIBRARIES + #TVICPORT_LIBRARY_DIRS + TVICPORT_LDFLAGS + TVICPORT_LDFLAGS_OTHERS + TVICPORT_INCLUDE_DIRS + TVICPORT_CFLAGS + TVICPORT_CFLAGS_OTHERS +) + +IF(TVICPORT_FOUND) + debug_message( " Found TVicPort...") + INCLUDE_DIRECTORIES(${TVICPORT_INCLUDE_DIRS}) + ADD_DEFINITIONS(${TVICPORT_CFLAGS}) + ADD_DEFINITIONS(${TVICPORT_CFLAGS_OTHERS}) + # LINK_DIRECTORIES(${EXPAT_LIBRARY_DIRS}) + #ARGET_LINK_LIBRARIES(${PROJECT_NAME} ${TVICPORT_LIBRARIES}) + + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyTVicPort) +ELSE(TVICPORT_FOUND) + MESSAGE(WARNING " FAILED to find TVicPort...") +ENDIF(TVICPORT_FOUND) diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyXerces.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyXerces.cmake new file mode 100644 index 0000000..9870699 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/FindThirdPartyXerces.cmake @@ -0,0 +1,30 @@ +# --------------------------------- +# Finds Xerces dependency +# --------------------------------- + +IF(WIN32) + FIND_PATH(XERCES_ROOT lib PATHS ${OV_CUSTOM_DEPENDENCIES_PATH} PATH_SUFFIXES xerces-c NO_DEFAULT_PATH) + SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "${XERCES_ROOT}/include") + SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "${XERCES_ROOT}/lib") + + INSTALL( + DIRECTORY ${XERCES_ROOT}/bin/ + DESTINATION ${DIST_BINDIR} + FILES_MATCHING PATTERN "*.dll") +ENDIF() + +FIND_PACKAGE(XercesC REQUIRED) + +IF(XercesC_FOUND) + debug_message( " Found xerces...") + + INCLUDE_DIRECTORIES(${XercesC_INCLUDE_DIRS}) + + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${XercesC_LIBRARIES}) + ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyXERCES) + +ELSE() + MESSAGE(WARNING " FAILED to find xerces...") +ENDIF() + + diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/GetCurrentVersion.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/GetCurrentVersion.cmake new file mode 100644 index 0000000..a0d0faf --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/GetCurrentVersion.cmake @@ -0,0 +1,19 @@ +# --------------------------------- +# create CMake variables that holds +# - latest git commit hash +# - branch name +# --------------------------------- + +# codename = the name of the current branch +EXECUTE_PROCESS(COMMAND git rev-parse --abbrev-ref HEAD + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + OUTPUT_VARIABLE PROJECT_BRANCH) +# command output may contain carriage return +STRING(REGEX REPLACE "\n" "" PROJECT_BRANCH "${PROJECT_BRANCH}") + +# commithash = short hash of latest revision +EXECUTE_PROCESS(COMMAND git rev-parse --short HEAD + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + OUTPUT_VARIABLE PROJECT_COMMITHASH) +# command output may contain carriage return +STRING(REGEX REPLACE "\n" "" PROJECT_COMMITHASH "${PROJECT_COMMITHASH}") diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/OvAddProjects.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/OvAddProjects.cmake new file mode 100644 index 0000000..e0a0694 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/OvAddProjects.cmake @@ -0,0 +1,124 @@ +# Adds the current project to the global properties +FUNCTION(OV_ADD_THIS_TO_PROJECT_LIST) + # MESSAGE(STATUS "ADDING: ${CMAKE_CURRENT_SOURCE_DIR}") + + # Add the dir to be parsed for documentation later. We need to do this before adding subdir, in case the subdir is the actual docs dir + #GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS) + #SET(OV_TMP "${OV_TMP};${CMAKE_CURRENT_SOURCE_DIR}") + #SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS ${OV_TMP}) + IF(NOT MULTI_BUILD) + IF(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc AND NOT(${SKIP_DOC_OPENVIBE})) + FILE(COPY ${CMAKE_CURRENT_SOURCE_DIR}/doc/ DESTINATION ${DIST_DOCTMP}/openvibe FILES_MATCHING PATTERN "*.dox") + FILE(COPY ${CMAKE_CURRENT_SOURCE_DIR}/doc/ DESTINATION ${DIST_DOCTMP}/openvibe PATTERN "*.dox" EXCLUDE) + ENDIF() + + IF(IS_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/include) AND NOT(${SKIP_DOCUMENTATION}) AND NOT(${SKIP_DOC_OPENVIBE})) + FILE(APPEND "${DIST_DOCTMP}/openvibe/source-list.txt" "${CMAKE_CURRENT_SOURCE_DIR}/include\n") + ENDIF() + ENDIF() +ENDFUNCTION() + +FUNCTION(OV_SET_CUSTOM_DOCUMENTATION doc_project_name doc_product_name) + MESSAGE(STATUS "CUSTOM DOCUMENTATION ENABLED FOR ${doc_project_name}") + SET(HAS_CUSTOM_DOCUMENTATION_${doc_project_name} "1" PARENT_SCOPE) + IF(${BUILD_DOCUMENTATION}) + SET(CUSTOM_DOCUMENTATION_PRODUCT_NAME_${doc_project_name} "${doc_product_name}" PARENT_SCOPE) + + # if we need also the sources (e.g. the API is documented with doxygen) + SET(ADDITIONAL_FOLDERS_STRING_LIST "") + FOREACH(additional_cpp_source ${ARGN}) + SET(ADDITIONAL_FOLDERS_STRING_LIST "${ADDITIONAL_FOLDERS_STRING_LIST} ${CMAKE_CURRENT_SOURCE_DIR}/${doc_project_name}/${additional_cpp_source}") + ENDFOREACH() + SET(CUSTOM_DOCUMENTATION_CPP_SOURCES_${doc_project_name} "${ADDITIONAL_FOLDERS_STRING_LIST}" PARENT_SCOPE) + ENDIF() +ENDFUNCTION() + +# +# Adds all directories as subdirectories to the CMake build, using the branch specified (if any) in the root CMakeList.txt or +# trunk otherwise. +# +# The branch variable name that is checked is made up from ${CURRENT_BRANCH_PREFIX}_${DIRNAMEUPPER}. +# +# The script also adds the directory to the global list of projects. +# + +FUNCTION(OV_ADD_PROJECTS CURRENT_FOLDER_PREFIX) + + FILE(GLOB FILENAMES "*") + + FOREACH(FULLPATH ${FILENAMES}) + IF(IS_DIRECTORY ${FULLPATH} AND EXISTS "${FULLPATH}/CMakeLists.txt") + GET_FILENAME_COMPONENT(DIRNAME ${FULLPATH} NAME) + + STRING(TOUPPER ${DIRNAME} DIRNAMEUPPER) + SET(SKIP_THIS_FOLDER "SKIP_${CURRENT_FOLDER_PREFIX}_${DIRNAMEUPPER}") + SET(SKIP_THIS_CUSTOM_DOCUMENTATION "SKIP_DOC_${CURRENT_FOLDER_PREFIX}_${DIRNAMEUPPER}") + + #MESSAGE(STATUS "Checking SKIP_${CURRENT_FOLDER_PREFIX}_${DIRNAMEUPPER} as branch var ${SKIP_THIS_FOLDER}") + + IF(${SKIP_THIS_FOLDER}) + MESSAGE(STATUS "Note: ${FULLPATH} has been skipped by setting SKIP_${CURRENT_FOLDER_PREFIX}_${DIRNAMEUPPER}") + ELSE() + # MESSAGE(STATUS "Inserting folder ${FULLPATH}") + + # Add the dir to be parsed for documentation later. We need to do this before adding subdir, in case the subdir is the actual docs dir + GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS) + SET(OV_TMP "${OV_TMP};${FULLPATH}") + SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS ${OV_TMP}) + + SET(OV_CURRENT_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/${DIRNAME}") + GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS_BUILD_DIR) + SET(OV_TMP "${OV_TMP};${OV_CURRENT_BINARY_DIR}") + SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS_BUILD_DIR ${OV_TMP}) + + + SET(HAS_CUSTOM_DOCUMENTATION "HAS_CUSTOM_DOCUMENTATION_${DIRNAME}") + SET(CUSTOM_DOCUMENTATION_PRODUCT_NAME "CUSTOM_DOCUMENTATION_PRODUCT_NAME_${DIRNAME}") + SET(CUSTOM_DOCUMENTATION_CPP_SOURCES "${CUSTOM_DOCUMENTATION_CPP_SOURCES_${DIRNAME}}") + IF(NOT(${SKIP_DOCUMENTATION}) AND NOT(${SKIP_THIS_CUSTOM_DOCUMENTATION}) AND NOT MULTI_BUILD) + IF(NOT(${HAS_CUSTOM_DOCUMENTATION})) + IF(${PUBLISH_DOC_ASSETS}) + IF(IS_DIRECTORY ${FULLPATH}/doc) + MESSAGE(STATUS "Documentation files found in ${FULLPATH}/doc") + INSTALL(DIRECTORY ${FULLPATH}/doc/ DESTINATION ${DIST_DOCTMP}/openvibe/box-algorithm-doc/dox-part/ FILES_MATCHING PATTERN "*.dox-part" PATTERN "doc/boxes" EXCLUDE) + INSTALL(DIRECTORY ${FULLPATH}/doc/ DESTINATION ${DIST_DOCTMP}/openvibe FILES_MATCHING PATTERN "*.dox" PATTERN "doc/boxes" EXCLUDE) + INSTALL(DIRECTORY ${FULLPATH}/doc/ DESTINATION ${DIST_DOCTMP}/openvibe + PATTERN "doc/boxes" EXCLUDE PATTERN "*.dox-part" EXCLUDE PATTERN "*.dox" EXCLUDE) + ENDIF() + + IF(IS_DIRECTORY ${FULLPATH}/include) + FILE(APPEND "${DIST_DOCTMP}/openvibe/source-list.txt" "${FULLPATH}/include\n") + ENDIF() + ENDIF() + ELSE() + MESSAGE(STATUS "Project ${DIRNAME} has custom documentation") + + # we copy the doc files into the temporary folder where everything is built thanks to a cmd script + IF(IS_DIRECTORY ${FULLPATH}/doc/) + FILE(COPY ${FULLPATH}/doc/ DESTINATION "${DIST_DOCTMP}/${DIRNAME}") + ENDIF() + + SET(DOC_PROJECT_NAME ${DIRNAME}) + SET(DOC_PROJECT_VERSION ${PROJECT_VERSION}) + SET(DOC_PROJECT_PRODUCT_NAME "${${CUSTOM_DOCUMENTATION_PRODUCT_NAME}}") + SET(DOC_PROJECT_COMMITHASH ${PROJECT_COMMITHASH}) + SET(DOC_PROJECT_BRANCH ${PROJECT_BRANCH}) + SET(DOC_PROJECT_CPP_SOURCES "${CUSTOM_DOCUMENTATION_CPP_SOURCES}") + + get_directory_property( DirDefs DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS ) + SET(DOC_DEFINES "") + foreach( d ${DirDefs} ) + #message( STATUS "Found Define: " ${d} ) + SET(DOC_DEFINES "${DOC_DEFINES} \\\\ \\n ${d}") + endforeach() + STRING(REPLACE "\"" "\\\"" DOC_DEFINES "${DOC_DEFINES}") + + #message( STATUS ${DOC_DEFINES} ) + ENDIF() + ENDIF() + add_subdirectory(${FULLPATH}) + ENDIF() + ENDIF() + ENDFOREACH(FULLPATH ${FILENAMES}) + +ENDFUNCTION(OV_ADD_PROJECTS) diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/OvAddSingleProject.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/OvAddSingleProject.cmake new file mode 100644 index 0000000..d0027df --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/OvAddSingleProject.cmake @@ -0,0 +1,52 @@ +# +# This function is used to add a project to the build in the case where the current directory only contains +# 'branches', 'tags' and 'trunk' directories of a single project. The project will be added using the +# branch specified (if any) in the root CMakeList.txt or trunk otherwise. +# +# The branch variable name that is checked is made up from ${CURRENT_BRANCH_PREFIX}_${DIRNAMEUPPER}. +# +# The script also adds the directory to the global list of projects. +# + +FUNCTION(OV_ADD_SINGLE_PROJECT CURRENT_BRANCH_PREFIX) + + SET(BRANCH_VARIABLE_NAME "${CURRENT_BRANCH_PREFIX}") + + # MESSAGE(STATUS "Parts ${CURRENT_BRANCH_PREFIX} Now ${BRANCH_VARIABLE_NAME}") + # MESSAGE(STATUS "Value ${${BRANCH_VARIABLE_NAME}}") + + SET(SUBDIR "SUBDIR-NOTFOUND") + + # MESSAGE(STATUS "Checking branch for ${BRANCH_VARIABLE_NAME}") + + IF(${BRANCH_VARIABLE_NAME}) + SET(BRANCH ${${BRANCH_VARIABLE_NAME}}) + IF("${BRANCH}" STREQUAL "__SKIPME") + MESSAGE(STATUS "Note: ${BRANCH_VARIABLE_NAME} has been disabled by setting it to __SKIPME") + ELSE("${BRANCH}" STREQUAL "__SKIPME") + SET(SUBDIR "${BRANCH}") + ENDIF("${BRANCH}" STREQUAL "__SKIPME") + ELSE(${BRANCH_VARIABLE_NAME}) + # MESSAGE(STATUS "Going for trunk...") + SET(SUBDIR "${OV_TRUNK}") + ENDIF(${BRANCH_VARIABLE_NAME}) + + IF(SUBDIR) + # MESSAGE(STATUS "Inserting folder ${SUBDIR}") + + # Add the dir to be parsed for documentation later. We need to do this before adding subdir, in case the subdir is the actual docs dir. + GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS) + SET(OV_TMP "${OV_TMP};${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIR}") + SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS ${OV_TMP}) + +# MESSAGE(STATUS "BDIR ${CMAKE_CURRENT_BINARY_DIR}/${SUBDIR}") + GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS_BUILD_DIR) + SET(OV_TMP "${OV_TMP};${CMAKE_CURRENT_BINARY_DIR}/${SUBDIR}") + SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS_BUILD_DIR ${OV_TMP}) + + + ADD_SUBDIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIR}) + + ENDIF(SUBDIR) + +ENDFUNCTION(OV_ADD_SINGLE_PROJECT) diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/OvDelayLoad.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/OvDelayLoad.cmake new file mode 100644 index 0000000..5351775 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/OvDelayLoad.cmake @@ -0,0 +1,14 @@ +FUNCTION(OV_DELAY_LOAD TARGET DLL) + IF(WIN32) + UNSET(FN_LINK_FLAGS) + GET_TARGET_PROPERTY(FN_LINK_FLAGS ${TARGET} LINK_FLAGS) + IF(FN_LINK_FLAGS) + SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS "${FN_LINK_FLAGS} /DELAYLOAD:${DLL}") + ELSE(FN_LINK_FLAGS) + SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS "/DELAYLOAD:${DLL}") + ENDIF(FN_LINK_FLAGS) + TARGET_LINK_LIBRARIES(${TARGET} Delayimp) + ELSE(WIN32) + MESSAGE(WARNING "Ignored OV_DELAY_LOAD call on non WIN32 platform") + ENDIF(WIN32) +ENDFUNCTION(OV_DELAY_LOAD) diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/OvInstallLaunchScript.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/OvInstallLaunchScript.cmake new file mode 100644 index 0000000..6926911 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/OvInstallLaunchScript.cmake @@ -0,0 +1,86 @@ +INCLUDE(CMakeParseArguments) +# +# Creates launch script from a common OpenViBE template (in "cmake-modules/launchers/"), but dedicated to scenarios to be executed with the Designer +# +# The mandatory 1st argument SCRIPT_PREFIX specifies what the resulting script is called. A platform specific postfix will be added. +# The mandatory 2nd argument EXECUTABLE_NAME specifies what the resulting script will called eventually. +# The optional 3nd argument ARGV1 specifies some extra argument or switch that is given to the launched executable by the script +# +FUNCTION(OV_INSTALL_LAUNCH_SCRIPT) + SET(options PAUSE) + SET(oneValueArgs SCRIPT_PREFIX EXECUTABLE_NAME ICON_PATH) + SET(multiValueArgs PARAMETERS) + + CMAKE_PARSE_ARGUMENTS(OV_INSTALL_LAUNCH_SCRIPT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + OV_CONFIGURE_RC(NAME ${OV_INSTALL_LAUNCH_SCRIPT_SCRIPT_PREFIX} ICON_PATH ${OV_INSTALL_LAUNCH_SCRIPT_ICON_PATH}) + + # Install executable launcher if install_exe option is set to on, the os is WIN32, and no argument has been specified + IF(WIN32 AND INSTALL_EXE AND NOT(OV_INSTALL_LAUNCH_SCRIPT_PAUSE) AND NOT(OV_INSTALL_LAUNCH_SCRIPT_PARAMETERS)) + # Add the dir to be parsed for documentation later. We need to do this before adding subdir, in case the subdir is the actual docs dir + GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_EXE_PROJECTS_TO_INSTALL) + SET(OV_TMP "${OV_TMP};${OV_INSTALL_LAUNCH_SCRIPT_SCRIPT_PREFIX}") + SET_PROPERTY(GLOBAL PROPERTY OV_EXE_PROJECTS_TO_INSTALL ${OV_TMP}) + ELSE() + IF(WIN32) + SET(SCRIPT_POSTFIX ".cmd") + ELSEIF(APPLE) + SET(SCRIPT_POSTFIX "-macos.sh") + ELSEIF(UNIX) + # Debian recommends that extensions such as .sh are not used; On Linux, scripts with such extensions shouldn't be packaged + SET(SCRIPT_POSTFIX ".sh") + ENDIF() + # Extract the filename of the project executable, the variable in the script base will be replaced with it by CONFIGURE_FILE() + GET_TARGET_PROPERTY(TMP_PROJECT_TARGET_PATH ${OV_INSTALL_LAUNCH_SCRIPT_EXECUTABLE_NAME} LOCATION) + GET_FILENAME_COMPONENT(OV_CMD_EXECUTABLE ${TMP_PROJECT_TARGET_PATH} NAME) + + IF(${OV_CMD_EXECUTABLE} STREQUAL "TMP_PROJECT_TARGET_PATH-NOTFOUND") + SET(OV_CMD_EXECUTABLE ${OV_INSTALL_LAUNCH_SCRIPT_EXECUTABLE_NAME}) + ELSE() + IF(WIN32) + SET(OV_CMD_EXECUTABLE "%OV_PATH_ROOT%/bin/${OV_CMD_EXECUTABLE}") + ENDIF() + ENDIF() + + SET(SCRIPT_NAME ${OV_INSTALL_LAUNCH_SCRIPT_SCRIPT_PREFIX}${SCRIPT_POSTFIX}) + SET(OV_CMD_ARGS ${OV_INSTALL_LAUNCH_SCRIPT_PARAMETERS}) + + IF(OV_INSTALL_LAUNCH_SCRIPT_PAUSE) + SET(OV_PAUSE "PAUSE") + ELSE() + SET(OV_PAUSE "") + ENDIF() + + CONFIGURE_FILE(${OV_LAUNCHER_SOURCE_PATH}/openvibe-launcher${SCRIPT_POSTFIX}-base ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} @ONLY) + # IF(MULTI_BUILD) # Replace with generator expression in CMake 3.5+ + # FOREACH(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) + # STRING(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU) + # INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} DESTINATION ${DIST_ROOT}/${OUTPUTCONFIG}) + # ENDFOREACH() + # ELSE() + # INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} DESTINATION ${DIST_ROOT}) + # ENDIF() + INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} DESTINATION ${DIST_ROOT}) + + ENDIF() +ENDFUNCTION() + +FUNCTION(OV_CONFIGURE_RC) + SET(options ) + SET(oneValueArgs NAME ICON_PATH) + SET(multiValueArgs ) + CMAKE_PARSE_ARGUMENTS(OV_CONFIGURE_RC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + SET(GENERATED_RC_FILE "${CMAKE_BINARY_DIR}/resource-files/${OV_CONFIGURE_RC_NAME}.rc") + IF(OV_CONFIGURE_RC_ICON_PATH) + SET(CONFIGURE_ICON "ID_Icon ICON DISCARDABLE \"${OV_CONFIGURE_RC_ICON_PATH}\"") + ENDIF() + IF(NOT(PROJECT_PRODUCT_NAME)) + SET(PROJECT_PRODUCT_NAME "${OV_CONFIGURE_RC_NAME}") + ENDIF() + SET(FILE_DESCRIPTION "${PROJECT_PRODUCT_NAME} for Win32") + + CONFIGURE_FILE( + ${OV_LAUNCHER_SOURCE_PATH}/resource-file.rc-base + ${GENERATED_RC_FILE} + @ONLY) +ENDFUNCTION() diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/OvLinkBoostLib.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/OvLinkBoostLib.cmake new file mode 100644 index 0000000..c01e3f9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/OvLinkBoostLib.cmake @@ -0,0 +1,55 @@ +# +# Win32 only +# +# This concoction mainly exists to locate the boost libraries on WIN32 in the case where our dependency/ folder has only a +# truncated version of boost and we cannot use find_package(). The background story is that we wish to link explicitly +# instead of using automatic linking and specifying a generic boost path to linker before each project definition. +# +# The downside of this is that it assumes the boost library names to have a particular format and only works for VC90/VC100 +# +# Function: Links specified boost library defined by COMPONENT and BOOST_VERSION to PROJECT_NAME. +# + +FUNCTION(OV_LINK_BOOST_LIB BOOST_COMPONENT BOOST_VERSION) + +IF(WIN32) + IF(MSVC) + IF(MSVC_VERSION EQUAL 1500) # vc9 + SET(LIB_BOOST "libboost_${BOOST_COMPONENT}-vc90-mt-${BOOST_VERSION}.lib") + SET(LIB_BOOST_DEBUG "libboost_${BOOST_COMPONENT}-vc90-mt-gd-${BOOST_VERSION}.lib") + ELSEIF(MSVC_VERSION EQUAL 1600) # vc 10 + SET(LIB_BOOST "libboost_${BOOST_COMPONENT}-vc100-mt-${BOOST_VERSION}.lib") + SET(LIB_BOOST_DEBUG "libboost_${BOOST_COMPONENT}-vc100-mt-gd-${BOOST_VERSION}.lib") + ELSEIF(MSVC_VERSION EQUAL 1700) # vc 11 + SET(LIB_BOOST "libboost_${BOOST_COMPONENT}-vc110-mt-${BOOST_VERSION}.lib") + SET(LIB_BOOST_DEBUG "libboost_${BOOST_COMPONENT}-vc110-mt-gd-${BOOST_VERSION}.lib") + ELSEIF(MSVC_VERSION EQUAL 1800) # vc12 + SET(LIB_BOOST "libboost_${BOOST_COMPONENT}-vc120-mt-${BOOST_VERSION}.lib") + SET(LIB_BOOST_DEBUG "libboost_${BOOST_COMPONENT}-vc120-mt-gd-${BOOST_VERSION}.lib") + ENDIF(MSVC_VERSION EQUAL 1500) + ENDIF(MSVC) + + SET(LIB_BOOST_PATH "-NOTFOUND") + FIND_LIBRARY(LIB_BOOST_PATH NAMES ${LIB_BOOST} PATHS ${OV_CUSTOM_DEPENDENCIES_PATH}/boost/lib NO_DEFAULT_PATH) + IF(LIB_BOOST_PATH) + debug_message( " [ OK ] lib ${LIB_BOOST_PATH}") + IF(TARGET ${PROJECT_NAME}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} optimized ${LIB_BOOST_PATH}) + ENDIF() + ELSE(LIB_BOOST_PATH) + MESSAGE(WARNING " Unable to find boost ${LIB_BOOST}") + ENDIF(LIB_BOOST_PATH) + + SET(LIB_BOOST_DEBUG_PATH "-NOTFOUND") + FIND_LIBRARY(LIB_BOOST_DEBUG_PATH NAMES ${LIB_BOOST_DEBUG} PATHS ${OV_CUSTOM_DEPENDENCIES_PATH}/boost/lib NO_DEFAULT_PATH) + IF(LIB_BOOST_DEBUG_PATH) + debug_message( " [ OK ] lib ${LIB_BOOST_DEBUG_PATH}") + IF(TARGET ${PROJECT_NAME}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${LIB_BOOST_DEBUG_PATH}) + ENDIF() + ELSE(LIB_BOOST_DEBUG_PATH) + MESSAGE(WARNING " Unable to find boost ${LIB_BOOST_DEBUG}") + ENDIF(LIB_BOOST_DEBUG_PATH) +ENDIF(WIN32) + +ENDFUNCTION(OV_LINK_BOOST_LIB) diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/OvSetWindowsSDKPath.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/OvSetWindowsSDKPath.cmake new file mode 100644 index 0000000..f451ab3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/OvSetWindowsSDKPath.cmake @@ -0,0 +1,17 @@ + +IF(NOT OV_MS_SDK_PATH) + GET_FILENAME_COMPONENT(OV_MS_SDK_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Win32SDK\\Directories;Install Dir]" ABSOLUTE CACHE) +ENDIF(NOT OV_MS_SDK_PATH) + +IF(NOT OV_MS_SDK_PATH) + GET_FILENAME_COMPONENT(OV_MS_SDK_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MicrosoftSDK\\Directories;Install Dir]" ABSOLUTE CACHE) +ENDIF(NOT OV_MS_SDK_PATH) + +IF(NOT OV_MS_SDK_PATH) + GET_FILENAME_COMPONENT(OV_MS_SDK_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]" ABSOLUTE CACHE) +ENDIF(NOT OV_MS_SDK_PATH) + +IF(NOT OV_MS_SDK_PATH) + MESSAGE(WARNING "Could not find Microsoft Windows SDK") +ENDIF(NOT OV_MS_SDK_PATH) + diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/OvtRunMultipleCommand.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/OvtRunMultipleCommand.cmake new file mode 100755 index 0000000..ef30048 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/OvtRunMultipleCommand.cmake @@ -0,0 +1,94 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +# Cmake script used to wrap multiple commands into one. +# +# Mandatory Input parameters: +# -UNQUOTE: set to 1 to unquote commands before processing, 0 otherwise +# -CMD1 First commands to execute +# +# Optional Input parameters: +# -CMD2 to CMD5: Other commands to execute +# +# Example usage: +# ADD_TEST(NAME ${TEST_NAME} +# COMMAND ${CMAKE_COMMAND} +# -DUNQUOTE=1 +# -DCMD1="Command_1" +# -DCMD2="Command_2" +# -DCMD3="Command_3" +# -P ${OpenViBE_TEST_CMAKE_DIR}/OvtRunMultipleCommand3.cmake) + +# Macro used to execute a command and check the result +MACRO(EXEC_CHECK RAW_CMD UNQUOTE_CMD) + + SET(CMD_ARGS_RAW ${RAW_CMD}) + + IF(${UNQUOTE_CMD}) + # First processing to remove enclosing quotes + STRING(LENGTH "${RAW_CMD}" CMD_STRING_LENGTH) + MATH(EXPR CMD_STRING_LENGTH "${CMD_STRING_LENGTH} - 2") + STRING(SUBSTRING "${RAW_CMD}" 1 ${CMD_STRING_LENGTH} CMD_ARGS_RAW) + ENDIF() + + # Process arguments to build an arg list + SEPARATE_ARGUMENTS(CMD_ARGS WINDOWS_COMMAND ${CMD_ARGS_RAW}) + + EXECUTE_PROCESS(COMMAND ${CMD_ARGS} RESULT_VARIABLE ret_var OUTPUT_VARIABLE output_var) + + MESSAGE(STATUS "----------------------------------------------\n") + MESSAGE(STATUS "-----------NEW COMMAND EXECUTED-----------\n\n") + MESSAGE(STATUS "----------------------------------------------\n\n") + + MESSAGE(STATUS "-----------Command Name & Arguments-----------\n${RAW_CMD}\n\n") + MESSAGE(STATUS "-----------Command Output-----------\n${output_var}\n\n") + + IF(ret_var) + MESSAGE(FATAL_ERROR "-----------Error-----------\n$Running command failed with code: ${ret_var}\n\n") + ENDIF() + +ENDMACRO() + +IF(NOT DEFINED UNQUOTE) + MESSAGE(FATAL_ERROR "Missing UNQUOTE parameter") +ENDIF() + +IF(DEFINED CMD1) + EXEC_CHECK(${CMD1} ${UNQUOTE}) +ELSE() + MESSAGE(FATAL_ERROR "At least one command needed in OvtRunMultipleCommand script") +ENDIF() + +IF(DEFINED CMD2) + EXEC_CHECK(${CMD2} ${UNQUOTE}) +ENDIF() + +IF(DEFINED CMD3) + EXEC_CHECK(${CMD3} ${UNQUOTE}) +ENDIF() + +IF(DEFINED CMD4) + EXEC_CHECK(${CMD4} ${UNQUOTE}) +ENDIF() + +IF(DEFINED CMD5) + EXEC_CHECK(${CMD5} ${UNQUOTE}) +ENDIF() diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/SetProjectVersion.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/SetProjectVersion.cmake new file mode 100644 index 0000000..5cc4b2b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/SetProjectVersion.cmake @@ -0,0 +1,24 @@ +# Set OpenViBE specific versions. +function(OV_SET_PROJECT_VERSION) + + set(OV_GLOBAL_VERSION_MAJOR ${PROJECT_VERSION_MAJOR} PARENT_SCOPE) + set(OV_GLOBAL_VERSION_MINOR ${PROJECT_VERSION_MINOR} PARENT_SCOPE) + set(OV_GLOBAL_VERSION_PATCH ${PROJECT_VERSION_PATCH} PARENT_SCOPE) + set(OV_GLOBAL_VERSION_BUILD ${PROJECT_VERSION_BUILD} PARENT_SCOPE) + set(OV_GLOBAL_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_BUILD} PARENT_SCOPE) + + set(OV_PROJECT_BRANCH ${PROJECT_BRANCH} PARENT_SCOPE) + set(OV_PROJECT_COMMITHASH ${PROJECT_COMMITHASH} PARENT_SCOPE) + + # Write version to .install file + string(TIMESTAMP BUILD_DATE "%d/%m/%y %H:%M:%S") + set(INSTALL_MANIFEST_STR "[Package]=${PROJECT_NAME}\ +\n[Version]=${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_BUILD}\ +\n[BuildHash]=${PROJECT_COMMITHASH}\ +\n[BuildBranch]=${PROJECT_BRANCH}\ +\n[BuildDate]=${BUILD_DATE}" + ) + file(WRITE ${CMAKE_BINARY_DIR}/.install "${INSTALL_MANIFEST_STR}") + +endfunction() + diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/Utilities.cmake b/Masterarbeit/openvibe/sdk-master/cmake-modules/Utilities.cmake new file mode 100644 index 0000000..6e6e6a0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/Utilities.cmake @@ -0,0 +1,89 @@ +function(debug_message) + if(${Flag_VerboseOutput}) + message(STATUS "${ARGV}") + endif() +endfunction() + +# Set version based on git tag. +# If current commit is tagged, use the tag as it is, and add build number based on content of .build file, written by Jenkins +# Else use last tag major and minor number and set patch number to 99 +# +# This function should remain generic to be usable in every projects. +function(set_version) + find_package(Git) + if(EXISTS ${CMAKE_SOURCE_DIR}/.version) + + # These versions are used by the subprojects by default. + # If you wish to maintain specific version numbers for a subproject, please do so in the projects CMakeLists.txt + file(READ ${CMAKE_SOURCE_DIR}/.version PROJECT_VERSION) + string(STRIP ${PROJECT_VERSION} PROJECT_VERSION) + string(REPLACE "." ";" VERSION_LIST ${PROJECT_VERSION}) + list(GET VERSION_LIST 0 PROJECT_VERSION_MAJOR) + list(GET VERSION_LIST 1 PROJECT_VERSION_MINOR) + list(GET VERSION_LIST 2 PROJECT_VERSION_PATCH) + + elseif(NOT GIT_FOUND) + message(WARNING "Git not found, set version to 0.0.0") + set(PROJECT_VERSION "0.0.0") + set(PROJECT_BRANCH_STRING "unknown") + set(PROJECT_COMMITHASH_STRING "0") + else() + debug_message("Found Git: ${GIT_EXECUTABLE}") + execute_process(COMMAND ${GIT_EXECUTABLE} describe + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + OUTPUT_VARIABLE PROJECT_VERSION + ERROR_VARIABLE ERROR) + if(ERROR) + set(PROJECT_VERSION "0.0.0") + message(WARNING "No tags found, set version to 0.0.0") + else() + # codename = the name of the current branch + execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE PROJECT_BRANCH_STRING) + # command output may contain carriage return + string(STRIP ${PROJECT_BRANCH_STRING} PROJECT_BRANCH_STRING) + + # commithash = short hash of latest revision + execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE PROJECT_COMMITHASH_STRING) + # command output may contain carriage return + string(STRIP ${PROJECT_COMMITHASH_STRING} PROJECT_COMMITHASH_STRING) + endif() + endif() + + # if current commit is not tagged result is formed as: "major.minor.patch-number of commits since last tag-hash" + string(STRIP ${PROJECT_VERSION} PROJECT_VERSION) + string(REPLACE "-" ";" version_list ${PROJECT_VERSION}) + list(LENGTH version_list version_list_length) + if(${version_list_length} EQUAL 3) # if result is formed as "major.minor.patch-number of commits since last tag-hash" set patch as 99 + list(GET version_list 0 PROJECT_VERSION) + set(PROJECT_VERSION_PATCH 99) + endif() + + string(REPLACE "." ";" version_list ${PROJECT_VERSION}) + list(GET version_list 0 PROJECT_VERSION_MAJOR) + list(GET version_list 1 PROJECT_VERSION_MINOR) + if(NOT PROJECT_VERSION_PATCH) + list(GET version_list 2 PROJECT_VERSION_PATCH) + endif() + + # These versions are used by the subprojects by default. + # If you wish to maintain specific version numbers for a subproject, please do so in the projects CMakeLists.txt + if(EXISTS ${CMAKE_SOURCE_DIR}/.build) + file(READ ${CMAKE_SOURCE_DIR}/.build PROJECT_VERSION_BUILD) + string(STRIP ${PROJECT_VERSION_BUILD} PROJECT_VERSION_BUILD) + else() + set(PROJECT_VERSION_BUILD 0) + endif() + + set(PROJECT_BRANCH ${PROJECT_BRANCH_STRING} PARENT_SCOPE) + set(PROJECT_COMMITHASH ${PROJECT_COMMITHASH_STRING} PARENT_SCOPE) + + set(PROJECT_VERSION_MAJOR ${PROJECT_VERSION_MAJOR} PARENT_SCOPE) + set(PROJECT_VERSION_MINOR ${PROJECT_VERSION_MINOR} PARENT_SCOPE) + set(PROJECT_VERSION_PATCH ${PROJECT_VERSION_PATCH} PARENT_SCOPE) + set(PROJECT_VERSION_BUILD ${PROJECT_VERSION_BUILD} PARENT_SCOPE) + set(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} PARENT_SCOPE) +endfunction() diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/openvibe-external-application-launcher-base b/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/openvibe-external-application-launcher-base new file mode 100644 index 0000000..4b3d8cc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/openvibe-external-application-launcher-base @@ -0,0 +1,38 @@ +#!/bin/bash +# +# This script is meant to be launched from inside an OpenViBE application (such as a scenario in Designer) +# + +CALLCMD=$1 +shift + +ov_run_bg=0 +if [ "$1" == "--run-bg" ]; then + ov_run_bg=1 + shift +fi + +if [ "$OV_PATH_ROOT" == "" ]; then + SOURCE="${BASH_SOURCE[0]}" + while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink + OV_PATH_ROOT="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + SOURCE="$(readlink "$SOURCE")" + [[ $SOURCE != /* ]] && SOURCE="$OV_PATH_ROOT/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located + done + OV_PATH_ROOT="$( cd -P "$( dirname "$SOURCE" )" && pwd )" +fi +if [ "$OV_PATH_BIN" == "" ]; then + OV_PATH_BIN="$OV_PATH_ROOT/bin" +fi + + +ret_code=0 + +if [ $ov_run_bg == 0 ]; then + eval "$OV_PATH_BIN/$CALLCMD" @OV_CMD_ARGS@ $* + ret_code=$? +else + "$OV_PATH_BIN/$CALLCMD" @OV_CMD_ARGS@ $* & +fi + +exit $ret_code diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/openvibe-external-application-launcher.cmd-base b/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/openvibe-external-application-launcher.cmd-base new file mode 100644 index 0000000..307c987 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/openvibe-external-application-launcher.cmd-base @@ -0,0 +1,18 @@ +@echo off + +REM +REM This script is meant to be launched from an environment with the OV_PATH_BIN env variable set externally +REM + +SET "OV_RUN_APP=%1" +SHIFT + +SET OV_RUN_IN_BG= +IF /i "%1"=="--run-bg" ( + REM Run in background. The first arg to START is the app title. + SET OV_RUN_IN_BG=START "%OV_RUN_APP%" + SHIFT +) + +%OV_RUN_IN_BG% "%OV_PATH_BIN%\%OV_RUN_APP%" %1 %2 %3 %4 %5 + diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/openvibe-launcher-macos.sh-base b/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/openvibe-launcher-macos.sh-base new file mode 100644 index 0000000..5be9a50 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/openvibe-launcher-macos.sh-base @@ -0,0 +1,60 @@ +#!/bin/bash + +## By default, paths specified by CMake install will be used to locate OpenViBE components. If defined, these ENV variables can override the CMake defines. +#export OV_PATH_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +#export OV_PATH_BIN="$OV_PATH_ROOT/bin" +#export OV_PATH_LIB="$OV_PATH_ROOT/lib" +#export OV_PATH_DATA="$OV_PATH_ROOT/share/openvibe" + +# Tries to locate matlab executable from $PATH, and set the library path to the corresponding matlab libs. +if [ "`which matlab`" != "" ] ; then + MATLAB_ROOT=`matlab -e | grep "^MATLAB=" | sed -e "s/^MATLAB=//"` + MATLAB_ARCH=`matlab -e | grep "^ARCH=" | sed -e "s/^ARCH=//"` + MATLAB_LIBPATH="$MATLAB_ROOT/bin/$MATLAB_ARCH" + # echo Matlab libs expected at $MATLAB_LIBPATH + export DYLD_LIBRARY_PATH="$MATLAB_LIBPATH:$DYLD_LIBRARY_PATH" +fi + +if [ "$OV_PATH_ROOT" == "" ]; then + SOURCE="${BASH_SOURCE[0]}" + while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink + OV_PATH_ROOT="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + SOURCE="$(readlink "$SOURCE")" + [[ $SOURCE != /* ]] && SOURCE="$OV_PATH_ROOT/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located + done + OV_PATH_ROOT="$( cd -P "$( dirname "$SOURCE" )" && pwd )" +fi + +export DYLD_LIBRARY_PATH="$OV_PATH_LIB:@CMAKE_SOURCE_DIR@/dependencies/lib:$DYLD_LIBRARY_PATH" +export LC_ALL=C + +export GTK_PATH=/usr/local/lib/gtk-2.0 + +export LUA_CPATH="$OV_PATH_LIB/lib?.dylib;`echo 'print(package.cpath)' | lua - `" +export LUA_PATH="$OV_PATH_BIN/?.lua;`echo 'print(package.path)' | lua - `" + +# The following line is there to help in cases where OpenViBE can consume excessive +# amounts of CPU or grind the swap. You can remove it if you know what you're doing. +renice 19 $$ + +ov_debugger= +if [ "$1" == "--debug" ]; then + ov_debugger="gdb --args" + shift +fi +ov_run_bg=0 +if [ "$1" == "--run-bg" ]; then + ov_run_bg=1 + shift +fi + +ret_code=0 + +if [ $ov_run_bg == 0 ]; then + eval $ov_debugger "$OV_PATH_BIN/@OV_CMD_EXECUTABLE@" @OV_CMD_ARGS@ $* + ret_code=$? +else + $ov_debugger "$OV_PATH_BIN/@OV_CMD_EXECUTABLE@" @OV_CMD_ARGS@ $* & +fi + +exit $ret_code diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/openvibe-launcher.cmd-base b/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/openvibe-launcher.cmd-base new file mode 100644 index 0000000..a14df80 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/openvibe-launcher.cmd-base @@ -0,0 +1,65 @@ +@ECHO OFF +SETLOCAL EnableExtensions +SETLOCAL EnableDelayedExpansion + +REM If not set to PASSIVE, OpenMP (Eigen) boxes may load the cores fully even if there's little to do. +SET "OMP_WAIT_POLICY=@OV_OMP_WAIT_POLICY@" + +REM Get the directory location of this script, assume it contains the OpenViBE dist tree. These variables will be used by OpenViBE executables. +SET "OV_PATH_ROOT=%~dp0" +SET "OV_PATH_BIN=%OV_PATH_ROOT%\bin" +SET "OV_PATH_LIB=%OV_PATH_ROOT%\bin" +SET "OV_PATH_DATA=%OV_PATH_ROOT%\share\openvibe" + +REM Default behavior +SET OV_PAUSE=@OV_PAUSE@ +SET OV_RUN_IN_BG= + +REM Parse out Windows specific args ... +SET "ARGS=" +SET EMPTY= +:loop +SET "STRIPPEDARG=%~1" +if NOT !STRIPPEDARG! == !EMPTY! ( + IF /i "!STRIPPEDARG!" == "--no-pause" ( + SET OV_PAUSE= + goto found: + ) + IF /i "!STRIPPEDARG!" == "--pause" ( + SET OV_PAUSE=PAUSE + goto found: + ) + IF /i "!STRIPPEDARG!" == "--run-bg" ( + REM Run in background, disable pause. The second parameter below is because CMD requires a 'title' + SET OV_RUN_IN_BG=START "@OV_CMD_EXECUTABLE@" + SET OV_PAUSE= + goto found: + ) + + REM Pass the non-stripped arg to the launched application... + SET ARGS=%ARGS% %1 + +:found + SHIFT + goto loop: +) + +REM Set dependency paths etc... +REM SET "OV_ENVIRONMENT_FILE=%OV_PATH_ROOT%\bin\OpenViBE-set-env.cmd" + +REM IF NOT EXIST "%OV_ENVIRONMENT_FILE%" ( +REM ECHO Error: "%OV_ENVIRONMENT_FILE%" was not found +REM GOTO EndOfScript +REM ) +REM CALL "%OV_ENVIRONMENT_FILE%" + +SET PATH=%OV_PATH_LIB%;%PATH% + + +REM cmake variable OV_CMD_ARGS below may specify additional arguments outside this script + +%OV_RUN_IN_BG% "@OV_CMD_EXECUTABLE@" @OV_CMD_ARGS@ %ARGS% + +:EndOfScript + +%OV_PAUSE% diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/openvibe-launcher.sh-base b/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/openvibe-launcher.sh-base new file mode 100644 index 0000000..e585cb1 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/openvibe-launcher.sh-base @@ -0,0 +1,52 @@ +#!/bin/bash + +## By default, paths specified by CMake install will be used to locate OpenViBE components. If defined, these ENV variables can override the CMake defines. +#export OV_PATH_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +#export OV_PATH_BIN="$OV_PATH_ROOT/bin" +#export OV_PATH_LIB="$OV_PATH_ROOT/lib" +#export OV_PATH_DATA="$OV_PATH_ROOT/share/openvibe" + +if [ "$OV_PATH_ROOT" == "" ]; then + SOURCE="${BASH_SOURCE[0]}" + while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink + OV_PATH_ROOT="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + SOURCE="$(readlink "$SOURCE")" + [[ $SOURCE != /* ]] && SOURCE="$OV_PATH_ROOT/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located + done + OV_PATH_ROOT="$( cd -P "$( dirname "$SOURCE" )" && pwd )" +fi + +export LD_LIBRARY_PATH="$OV_PATH_LIB:@CMAKE_SOURCE_DIR@/dependencies/lib:$LD_LIBRARY_PATH" +export LC_ALL=C + +# The following line is there to help in cases where OpenViBE can consume excessive +# amounts of CPU or grind the swap. You can remove it if you know what you're doing. +renice 19 $$ + +ov_debugger= +if [ "$1" == "--debug" ]; then + ov_debugger="gdb --args" + shift +fi + +if [ "$1" == "--memcheck" ]; then + ov_debugger="valkyrie " + #ov_debugger="valgrind --tool=memcheck --log-file='valgrind_@OV_CMD_EXECUTABLE@_%p.log'" + shift +fi +ov_run_bg=0 +if [ "$1" == "--run-bg" ]; then + ov_run_bg=1 + shift +fi + +ret_code=0 + +if [ $ov_run_bg == 0 ]; then + eval $ov_debugger "$OV_PATH_BIN/@OV_CMD_EXECUTABLE@" @OV_CMD_ARGS@ $* + ret_code=$? +else + $ov_debugger "$OV_PATH_BIN/@OV_CMD_EXECUTABLE@" @OV_CMD_ARGS@ $* & +fi + +exit $ret_code diff --git a/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/resource-file.rc-base b/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/resource-file.rc-base new file mode 100644 index 0000000..215b089 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/cmake-modules/launchers/resource-file.rc-base @@ -0,0 +1,40 @@ +#include "winres.h" + +@CONFIGURE_ICON@ + +// Language is US English +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +#ifndef DEBUG +#define VER_DEBUG 0 +#else +#define VER_DEBUG VS_FF_DEBUG +#endif + +// Add version information +VS_VERSION_INFO VERSIONINFO + FILEVERSION @OV_GLOBAL_VERSION_MAJOR@,@OV_GLOBAL_VERSION_MINOR@,@OV_GLOBAL_VERSION_PATCH@,@OV_GLOBAL_VERSION_BUILD@ + PRODUCTVERSION @OV_GLOBAL_VERSION_MAJOR@,@OV_GLOBAL_VERSION_MINOR@,@OV_GLOBAL_VERSION_PATCH@,@OV_GLOBAL_VERSION_BUILD@ + FILEOS VOS__WINDOWS32 +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", "@COMPANY_NAME@" + VALUE "FileDescription", "@FILE_DESCRIPTION@" + VALUE "FileVersion", "@OV_GLOBAL_VERSION_STRING@" + VALUE "InternalName", "@PROJECT_NAME@" + VALUE "LegalCopyright", "Copyright - @COMPANY_NAME@ @COPYRIGHT_DATE@" + VALUE "OriginalFilename", "@PROJECT_NAME@" + VALUE "ProductName", "@PROJECT_PRODUCT_NAME@" + VALUE "ProductVersion", "@OV_GLOBAL_VERSION_STRING@" + END + END + BLOCK "VarFileInfo" + BEGIN + // Indicates that Software is translated in US English in the Windows ANSI codepage (1252). + VALUE "Translation", 0x409, 1252 + END +END + diff --git a/Masterarbeit/openvibe/sdk-master/common/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/common/CMakeLists.txt new file mode 100755 index 0000000..dd6d5ec --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/common/CMakeLists.txt @@ -0,0 +1,30 @@ +PROJECT(openvibe-common) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.h src/*.cpp include/*.h include/*.hpp) +INCLUDE_DIRECTORIES(include) + +# A headers-only project, the executable is a NOP having some static asserts, not to be installed. +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) +INCLUDE("FindThirdPartyBoost") + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${KERNEL_FOLDER}) + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- + +INSTALL(DIRECTORY include/ DESTINATION ${DIST_INCLUDEDIR} FILES_MATCHING PATTERN "*.hpp" PATTERN "*.h" PATTERN "doc" EXCLUDE) diff --git a/Masterarbeit/openvibe/sdk-master/common/include/m_ConverterUtf8.h b/Masterarbeit/openvibe/sdk-master/common/include/m_ConverterUtf8.h new file mode 100644 index 0000000..e4628ef --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/common/include/m_ConverterUtf8.h @@ -0,0 +1,70 @@ +#pragma once + +#include + +namespace Common { +namespace Converter { + +#if defined TARGET_OS_Windows +// Returns the wstring (ie the utf16 formatted string) version of an utf8 string +static std::wstring Utf8ToUtf16(const std::string& utf8) +{ + std::vector unicode; + size_t i = 0; + while (i < utf8.size()) + { + unsigned long uni; + size_t todo; + unsigned char ch = utf8[i++]; + if (ch <= 0x7F) + { + uni = ch; + todo = 0; + } + else if (ch <= 0xBF) { throw std::logic_error("not a UTF-8 string"); } + else if (ch <= 0xDF) + { + uni = ch & 0x1F; + todo = 1; + } + else if (ch <= 0xEF) + { + uni = ch & 0x0F; + todo = 2; + } + else if (ch <= 0xF7) + { + uni = ch & 0x07; + todo = 3; + } + else { throw std::logic_error("not a UTF-8 string"); } + for (size_t j = 0; j < todo; ++j) + { + if (i == utf8.size()) { throw std::logic_error("not a UTF-8 string"); } + ch = utf8[i++]; + if (ch < 0x80 || ch > 0xBF) { throw std::logic_error("not a UTF-8 string"); } + uni <<= 6; + uni += ch & 0x3F; + } + if (uni >= 0xD800 && uni <= 0xDFFF) { throw std::logic_error("not a UTF-8 string"); } + if (uni > 0x10FFFF) { throw std::logic_error("not a UTF-8 string"); } + unicode.push_back(uni); + } + std::wstring utf16; + for (i = 0; i < unicode.size(); ++i) + { + unsigned long uni = unicode[i]; + if (uni <= 0xFFFF) { utf16 += wchar_t(uni); } + else + { + uni -= 0x10000; + utf16 += wchar_t((uni >> 10) + 0xD800); + utf16 += wchar_t((uni & 0x3FF) + 0xDC00); + } + } + return utf16; +} +#endif // TARGET_OS_Windows + +} // namespace Converter +} // namespace Common diff --git a/Masterarbeit/openvibe/sdk-master/common/include/ovCResampler.h b/Masterarbeit/openvibe/sdk-master/common/include/ovCResampler.h new file mode 100644 index 0000000..2e8ff2e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/common/include/ovCResampler.h @@ -0,0 +1,422 @@ +#pragma once + +#include +#include +#include +#include + +#include + +namespace Common { +namespace Resampler { + +enum class EResamplerStoreModes { ChannelWise, SampleWise }; + +template +class TResampler +{ +public: + + class ICallback + { + public: + + virtual ~ICallback() { } + virtual void processResampler(const TFloat* pSample, const size_t nChannel) const = 0; + }; + +private: + + TResampler(const TResampler&) = default; + +public: + + /// Constructor, with default values for real-time processing. + TResampler() + { + this->clear(); + switch (TStoreMode) + { + case EResamplerStoreModes::ChannelWise: + m_fpResample = &TResampler::resampleChannelWise; + m_fpResampleDirect = &TResampler::resampleChannelWise; + break; + case EResamplerStoreModes::SampleWise: + m_fpResample = &TResampler::resampleSampleWise; + m_fpResampleDirect = &TResampler::resampleSampleWise; + break; + default: + assert(false); + } + } + + virtual ~TResampler() { this->clear(); } + + void clear() + { + for (size_t j = 0; j < m_resamplers.size(); ++j) { delete m_resamplers[j]; } + m_resamplers.clear(); + + m_nChannel = 0; + m_iSampling = 0; + m_oSampling = 0; + m_nFractionalDelayFilterSample = 6; + m_iMaxNSampleIn = 1024; + m_transitionBandPercent = 45; + m_stopBandAttenuation = 49; + } + + /// Specifies the number of samples (taps) each fractional delay filter should have.\n + /// + /// This must be an even value.To achieve a higher resampling precision, + /// the oversampling should be used in the first place instead of using a higher FractionalDelayFilterSampleCount value. + /// The lower this value is the lower the signal - to - noise performance of the interpolator will be. + /// Each FractionalDelayFilterSampleCount decrease by 2 decreases SNR by approximately 12 to 14 decibels. + /// The fractional delay (Between 6 and 30, and default = 6). + /// true if even and between 6 and 30, false otherwise. + /// For real-time processing, n = 6. + bool setFractionalDelayFilterSampleCount(const int n = 6) + { + if (n < 6 || 30 < n || n % 2 == 1) { return false; } // false if odd value + m_nFractionalDelayFilterSample = n; + return true; + } + + /// Maximal planned length of the input buffer (in samples) that will be passed to the resampler. + /// Input buffers longer than this value should never be supplied to the resampler. + /// The resampler relies on this value as it allocates intermediate buffers. + /// The maximal input sample count. + /// true if between 8 and 2048, false otherwise. + /// Note that the resampler may use the input buffer itself for intermediate sample data storage. + bool setMaxNSampleIn(const int n = 8) + { + if (n < 8 || 2048 < n) { return false; } + m_iMaxNSampleIn = n; + return true; + } + + /// Transition band, in percent of the spectral space of the input signal + /// (or the output signal if downsampling is performed) between filter's -3 dB point and the Nyquist frequency. + /// The Transition band (Between 0.5% and 45%, and default = 10.). + /// true if between 0.5 and 45, false otherwise. + /// For real-time processing, n = 45. + bool setTransitionBand(const double n = 10) + { + if (n < r8b::CDSPFIRFilter::getLPMinTransBand() || r8b::CDSPFIRFilter::getLPMaxTransBand() < n) { return false; } + m_transitionBandPercent = n; + return true; + } + + /// Stop-band attenuation in decibel.\n + /// + /// The general formula is 6.02 * Bits + 40, where "Bits" is the bit resolution(e.g. 16, 24), + /// "40" is an added resolution for stationary signals, this value can be decreased to 20 to 10 + /// if the signal being resampled is mostly non - stationary(e.g.impulse response). + /// The Stop-band attenuation in decibel (Between 49 and 218, and default = 49 is given by the general formula). + /// true if between 49 and 218, false otherwise. + /// For real-time processing, n = 49. + bool setStopBandAttenuation(const double n = 49) + { + if (n < r8b::CDSPFIRFilter::getLPMinAtten() || r8b::CDSPFIRFilter::getLPMaxAtten() < n) { return false; } + m_stopBandAttenuation = n; + return true; + } + + /// This fonction initializes the vector of Resampler, using the number of channels, the input and the output sampling rates. + /// The number of channel. + /// The input sampling. + /// The output sampling. + /// true if success, false otherwise. + bool reset(const size_t nChannel, const size_t iSampling, const size_t oSampling) + { + if (nChannel == 0 || iSampling == 0 || oSampling == 0) { return false; } + m_iSampling = iSampling; + m_oSampling = oSampling; + + m_nChannel = nChannel; + for (size_t i = 0; i < m_resamplers.size(); ++i) { delete m_resamplers[i]; } + m_resamplers.clear(); + m_resamplers.resize(m_nChannel); + + const double in = double(iSampling), out = double(oSampling); + const double stopBandAttenuation = m_stopBandAttenuation == 0 + ? std::min(6.02 * m_nFractionalDelayFilterSample + 40, r8b::CDSPFIRFilter::getLPMaxAtten()) + : m_stopBandAttenuation; +#define NEW_SAMPLER(Len, Fracs)\ + new r8b::CDSPResampler>(in, out, m_iMaxNSampleIn,\ + m_transitionBandPercent, stopBandAttenuation,r8b::EDSPFilterPhaseResponse(0), false) + + for (size_t j = 0; j < m_nChannel; ++j) + { + switch (m_nFractionalDelayFilterSample) // it defines iFractionalDelayPositionCount + { + case 6: + m_resamplers[j] = NEW_SAMPLER(6, 11); + break; + + case 8: + m_resamplers[j] = NEW_SAMPLER(8, 17); + break; + + case 10: + m_resamplers[j] = NEW_SAMPLER(10, 23); + break; + + case 12: + m_resamplers[j] = NEW_SAMPLER(12, 41); + break; + + case 14: + //stopBandAttenuation = 109.56; + m_resamplers[j] = NEW_SAMPLER(14, 67); + break; + + case 16: + m_resamplers[j] = NEW_SAMPLER(16, 97); + break; + + case 18: + //stopBandAttenuation = 136.45; + m_resamplers[j] = NEW_SAMPLER(18, 137); + break; + + case 20: + m_resamplers[j] = NEW_SAMPLER(20, 211); + break; + + case 22: + m_resamplers[j] = NEW_SAMPLER(22, 353); + break; + + case 24: + //stopBandAttenuation = 180.15; + m_resamplers[j] = NEW_SAMPLER(24, 673); + break; + + case 26: + m_resamplers[j] = NEW_SAMPLER(26, 1051); + break; + + case 28: + m_resamplers[j] = NEW_SAMPLER(28, 1733); + break; + + case 30: + m_resamplers[j] = NEW_SAMPLER(30, 2833); + break; + + default: + return false; + } + } + +#undef NEW_SAMPLER(Len, Fracs) + + return true; + } + + /// Gets the latency.\n + /// + /// This value is usually zero if the DSP processor "consumes" the latency automatically. (from CDSPProcessor.h) + /// Latency. + virtual int getLatency() const { return m_resamplers[0]->getLatency(); } + + /// Gets the Fractional latency. + /// + /// Fractional latency, in samples, which is present in the output signal. + /// This value is usually zero if a linear - phase filtering is used. + /// With minimum - phase filters in use, this value can be non - zero even if the getLatency() function returns zero. (from CDSPProcessor.h) + /// + /// + /// Fractionnal Latency. + virtual double getLatencyFrac() const { return m_resamplers[0]->getLatencyFrac(); } + + /// Gets the cumulative number of samples that should be passed to *this object before the actual output starts. + /// This value includes latencies induced by all processors which run after *this processor in chain. + /// The number of input samples required before the output starts on the next resampling step. (from CDSPProcessor.h) + /// the cumulative number of samples. + virtual int getInLenBeforeOutStart(const int nextInLen) const { return m_resamplers[0]->getInLenBeforeOutStart(nextInLen); } + + /// Gets the maximal length of the output buffer required when processing the "maxInLen" number of input samples. + /// The number of samples planned to process at once, at most. (from CDSPProcessor.h). + /// The length. + virtual int getMaxOutLen(const int maxInLen) const { return m_resamplers[0]->getMaxOutLen(maxInLen); } + + double getBuiltInLatency() const { return (m_iSampling != 0) ? (1.0 * m_resamplers[0]->getInLenBeforeOutStart(0) / m_iSampling) : 0.0; } + + size_t resample(const ICallback& callback, const TFloat* iSample, const size_t nInSample) { return (this->*m_fpResample)(callback, iSample, nInSample); } + + size_t downsample(const ICallback& callback, const TFloat* iSample, const size_t nInSample) { return (this->*m_fpResample)(callback, iSample, nInSample); } + +private: + + /// This function resamples the signal assuming the input samples are ordered this way : + /// - sample 1 of channel 1, sample 1 of channel 2, ..., sample 1 of channel nChannel, + /// - sample 2 of channel 1, sample 2 of channel 2, ..., sample 2 of channel nChannel, + /// - ... + /// - sample nInSample of channel 1, sample nInSample of channel 2, ..., sample nInSample of channel nChannel,\n + /// + /// This is convenient for resampling at the acquisition level. + /// The callback. + /// The input sample. + /// The n input sample. + /// the number of sample process in last channel. + size_t resampleChannelWise(const ICallback& callback, const TFloat* iSample, const size_t nInSample) + { + int nI = 0; + bool isFirstChannel = true; + + std::vector iBuffers(nInSample); + std::vector oBuffers; + + for (size_t j = 0; j < m_nChannel; ++j) + { + for (size_t k = 0; k < nInSample; ++k) { iBuffers[k] = double(iSample[k * m_nChannel + j]); } + + double* resamplerOutputBuffer; + nI = m_resamplers[j]->process(&iBuffers[0], int(nInSample), resamplerOutputBuffer); + + if (isFirstChannel) + { + oBuffers.resize(nI * m_nChannel); + isFirstChannel = false; + } + + for (int k = 0; k < nI; ++k) { oBuffers[k * m_nChannel + j] = TFloat(resamplerOutputBuffer[k]); } + } + + for (int k = 0; k < nI; ++k) { callback.processResampler(&oBuffers[k * m_nChannel], m_nChannel); } + + return nI; + } + + /// This function resamples the signal assuming the input samples are ordered this way : + /// - sample 1 of channel 1, sample 2 of channel 1, ..., sample nInSample of channel 1, + /// - sample 1 of channel 2, sample 2 of channel 2, ..., sample nInSample of channel 2, + /// - ... + /// - sample 1 of channel nChannel, sample 2 of channel nChannel, ..., sample nInSample of channel nChannel, + /// + /// This is convenient for resampling at the signal-processing level. + /// The callback. + /// The input sample. + /// The n input sample. + /// the number of sample process in last channel. + size_t resampleSampleWise(const ICallback& callback, const TFloat* iSample, const size_t nInSample) + { + int nI = 0; + bool isFirstChannel = true; + + std::vector iBuffers(nInSample); + std::vector oBuffers; + + for (size_t j = 0; j < m_nChannel; ++j) + { + for (size_t k = 0; k < nInSample; ++k) { iBuffers[k] = double(iSample[j * nInSample + k]); } + + double* resamplerOutputBuffer; + nI = m_resamplers[j]->process(&iBuffers[0], int(nInSample), resamplerOutputBuffer); + + if (isFirstChannel) + { + oBuffers.resize(nI * m_nChannel); + isFirstChannel = false; + } + + for (int k = 0; k < nI; ++k) { oBuffers[k * m_nChannel + j] = TFloat(resamplerOutputBuffer[k]); } + } + + for (int k = 0; k < nI; ++k) { callback.processResampler(&oBuffers[k * m_nChannel], m_nChannel); } + + return nI; + } + +protected: + + /// Trivial channel wise callback implementation. + class CCallbackChannelWise final : public ICallback + { + public: + CCallbackChannelWise(TFloat* oSample) : m_OutputSample(oSample) { } + + void processResampler(const TFloat* sample, const size_t nChannel) const override + { + for (size_t i = 0; i < nChannel; ++i) + { + *m_OutputSample = *sample; + ++m_OutputSample; + ++sample; + } + } + + mutable TFloat* m_OutputSample; + }; + + /// Trivial sample wise callback implementation. + class CCallbackSampleWise final : public ICallback + { + public: + CCallbackSampleWise(TFloat* oSample, const size_t nOutSample) : m_OutputSample(oSample), m_NOutputSample(nOutSample) { } + + void processResampler(const TFloat* sample, const size_t nChannel) const override + { + for (size_t i = 0; i < nChannel; ++i) { m_OutputSample[i * m_NOutputSample + m_OutputSampleIdx] = sample[i]; } + m_OutputSampleIdx++; + m_OutputSampleIdx %= m_NOutputSample; + } + + TFloat* const m_OutputSample; + size_t m_NOutputSample = 0; + mutable size_t m_OutputSampleIdx = 0; + }; + + size_t resampleChannelWise(TFloat* oSample, const TFloat* iSample, const size_t nInSample, const size_t /*nOutSample*/) + { + return this->resample(CCallbackChannelWise(oSample), iSample, nInSample); + } + + size_t resampleSampleWise(TFloat* oSample, const TFloat* iSample, const size_t nInSample, const size_t nOutSample) + { + return this->resample(CCallbackSampleWise(oSample, nOutSample), iSample, nInSample); + } + +public: + + size_t resample(TFloat* oSample, const TFloat* iSample, const size_t nInSample, const size_t nOutSample = 1) + { + return (this->*m_fpResampleDirect)(oSample, iSample, nInSample, nOutSample); + } + + size_t downsample(TFloat* oSample, const TFloat* iSample, const size_t nInSample, const size_t nOutSample = 1) + { + return resample(oSample, iSample, nInSample, nOutSample); + } + +protected: + + size_t m_nChannel = 0; + size_t m_iSampling = 0; + size_t m_oSampling = 0; + + int m_nFractionalDelayFilterSample = 6; + int m_iMaxNSampleIn = 1024; + double m_transitionBandPercent = 45; + double m_stopBandAttenuation = 49; + + std::vector m_resamplers; + + size_t (TResampler::*m_fpResample)(const ICallback& callback, const TFloat* iSample, const size_t nInSample); + size_t (TResampler::*m_fpResampleDirect)(TFloat* oSample, const TFloat* iSample, const size_t nInSample, const size_t nOutSample); +}; + +typedef TResampler CResamplerSf; +typedef TResampler CResamplerCf; +typedef TResampler CResamplerSd; +typedef TResampler CResamplerCd; + +typedef TResampler CDownsamplerSf; +typedef TResampler CDownsamplerCf; +typedef TResampler CDownsamplerSd; +typedef TResampler CDownsamplerCd; + +} // namespace Resampler +} // namespace Common diff --git a/Masterarbeit/openvibe/sdk-master/common/include/ov_common_defines.h b/Masterarbeit/openvibe/sdk-master/common/include/ov_common_defines.h new file mode 100644 index 0000000..a38da6c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/common/include/ov_common_defines.h @@ -0,0 +1,149 @@ +#pragma once + +#include // For Unix Compatibility (size_t) +#include // For Uint standard + +// +// This file checks the presence of several defines that are supposed to +// be set by the build system. In addition, it defines some additional ones. +// + +#if defined(_MSC_VER) +// We need some magic to get #warning behavior on MSVC +#define STRINGISE(N) #N +#define EXPAND_THEN_STRINGISE(N) STRINGISE(N) +#define __LINE_STR__ EXPAND_THEN_STRINGISE(__LINE__) + +// Format #pragma message +#define __LOC__ __FILE__ "(" __LINE_STR__ ")" +#define __OUTPUT_FORMAT__(type) __LOC__ " : " type " : " + +// Actual warning message type +#define __WARNING__ __OUTPUT_FORMAT__("Warning") +#endif + + +//___________________________________________________________________// +// // +// Operating System identification // +//___________________________________________________________________// +// // + +#if !(defined(TARGET_OS_Windows) || defined(TARGET_OS_Linux) || defined(TARGET_OS_MacOS)) +#if defined(_MSC_VER) + #pragma message( __WARNING__ "No known target OS specified!") +#else + #warning "No known target OS specified!" +#endif +#endif + +//___________________________________________________________________// +// // +// Build type identification // +//___________________________________________________________________// +// // + +#if !(defined(TARGET_BUILDTYPE_Debug) || defined(TARGET_BUILDTYPE_Release)) +#if defined(_MSC_VER) + #pragma message( __WARNING__ "No known build type defined!") +#else + #warning "No known build type defined!" +#endif +#endif + +//___________________________________________________________________// +// // +// Compiler software identification // +//___________________________________________________________________// +// // + +#if !(defined(TARGET_COMPILER_GCC) || defined(TARGET_COMPILER_VisualStudio) || defined(TARGET_COMPILER_LLVM)) +#if defined(_MSC_VER) + #pragma message( __WARNING__ "No known compiler defined!") +#else + #warning "No known compiler defined!" +#endif +#endif + +//___________________________________________________________________// +// // +// API Definition // +//___________________________________________________________________// +// // + +// Taken from +// - http://people.redhat.com/drepper/dsohowto.pdf +// - http://www.nedprod.com/programs/gccvisibility.html +#if defined OV_Shared +#if defined TARGET_OS_Windows +#define OV_API_Export __declspec(dllexport) +#define OV_API_Import __declspec(dllimport) +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + #define OV_API_Export __attribute__((visibility("default"))) + #define OV_API_Import __attribute__((visibility("default"))) +#else + #define OV_API_Export + #define OV_API_Import +#endif +#else +#define OV_API_Export +#define OV_API_Import +#endif + +#if defined OV_Exports + #define OV_API OV_API_Export +#else +#define OV_API OV_API_Import +#endif + +//___________________________________________________________________// +// // +// API Definition for plugins // +//___________________________________________________________________// +// // + + +// Taken from +// - http://people.redhat.com/drepper/dsohowto.pdf +// - http://www.nedprod.com/programs/gccvisibility.html +#if defined OVP_Shared +#if defined TARGET_OS_Windows +#define OVP_API_Export __declspec(dllexport) +#define OVP_API_Import __declspec(dllimport) +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + #define OVP_API_Export __attribute__((visibility("default"))) + #define OPV_API_Import __attribute__((visibility("default"))) +#else + #define OVP_API_Export + #define OVP_API_Import +#endif +#else +# define OVP_API_Export +# define OVP_API_Import +#endif + +#if defined OVP_Exports +# define OVP_API OVP_API_Export +#else +# define OVP_API OVP_API_Import +#endif +//___________________________________________________________________// +// // +// NULL Definition // +//___________________________________________________________________// +// // + +#ifndef NULL +#define NULL 0 +#endif + +#if defined(__cplusplus) && (__cplusplus >= 201402L) + #define OV_DEPRECATED(since) [[deprecated("Since " #since)]] + #define OV_DEPRECATED_FOR(since, replacement) [[deprecated("Since " #since "; use " #replacement)]] +#elif defined(_MSC_VER) +#define OV_DEPRECATED(since) __declspec(deprecated("Since " # since)) +#define OV_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement)) +#else + #define OV_DEPRECATED(since) __attribute__((__deprecated__)) + #define OV_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__)) +#endif diff --git a/Masterarbeit/openvibe/sdk-master/common/include/ovp_global_defines.h b/Masterarbeit/openvibe/sdk-master/common/include/ovp_global_defines.h new file mode 100755 index 0000000..8f0f4fe --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/common/include/ovp_global_defines.h @@ -0,0 +1,278 @@ +#pragma once + + +// ----------------------------------------------------- +// XML Scenario importer +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_XMLScenarioImporter OpenViBE::CIdentifier(0xe80c3ea2, 0x149c4a05) +#define OVP_GD_ClassId_Algorithm_XMLScenarioExporter OpenViBE::CIdentifier(0x53693531, 0xb136cf3f) +#define OVP_GD_TypeId_ClassificationPairwiseStrategy OpenViBE::CIdentifier(0x0DD51C74, 0x3C4E74C9) +#define OVP_GD_TypeId_OneVsOne_DecisionAlgorithms OpenViBE::CIdentifier(0x0DEC1510, 0x0DEC1510) +#define OVP_GD_ClassId_Algorithm_PairwiseStrategy_PKPD OpenViBE::CIdentifier(0x26EF6DDA, 0xF137053C) +#define OVP_GD_ClassId_Algorithm_PairwiseDecision_Voting OpenViBE::CIdentifier(0xA111B830, 0x4679BAFD) +#define OVP_GD_ClassId_Algorithm_PairwiseDecision_HT OpenViBE::CIdentifier(0xD24F7F19, 0xA744FAD2) + +// Algorithm OVMatrixFileReader + +#define OVP_GD_ClassId_Algorithm_OVMatrixFileReader OpenViBE::CIdentifier(0x10661A33, 0x0B0F44A7) +#define OVP_GD_ClassId_Algorithm_OVMatrixFileReaderDesc OpenViBE::CIdentifier(0x0E873B5E, 0x0A287FCB) + + +#define OVP_GD_Algorithm_OVMatrixFileReader_InputParameterId_Filename OpenViBE::CIdentifier(0x28F87B29, 0x0B09737E) +#define OVP_GD_Algorithm_OVMatrixFileReader_OutputParameterId_Matrix OpenViBE::CIdentifier(0x2F9521E0, 0x027D789F) +#define OVP_GD_Algorithm_OVMatrixFileReader_InputTriggerId_Open OpenViBE::CIdentifier(0x2F996376, 0x2A942485) +#define OVP_GD_Algorithm_OVMatrixFileReader_InputTriggerId_Load OpenViBE::CIdentifier(0x22841807, 0x102D681C) +#define OVP_GD_Algorithm_OVMatrixFileReader_InputTriggerId_Close OpenViBE::CIdentifier(0x7FDE77DA, 0x384A0B3D) +#define OVP_GD_Algorithm_OVMatrixFileReader_OutputTriggerId_Error OpenViBE::CIdentifier(0x6D4F2F4B, 0x05EC6CB9) +#define OVP_GD_Algorithm_OVMatrixFileReader_OutputTriggerId_DataProduced OpenViBE::CIdentifier(0x76F46051, 0x003B6FE8) + +// ----------------------------------------------------- +// EBML stream encoder +// ----------------------------------------------------- +#define OVP_GD_ClassId_Algorithm_StreamStructureDecoder OpenViBE::CIdentifier(0xA7EF3E8B, 0x4CF70B74) +#define OVP_GD_ClassId_Algorithm_StreamStructureDecoderDesc OpenViBE::CIdentifier(0x2E361099, 0xCBE828A7) + +#define OVP_GD_Algorithm_StreamStructureDecoder_InputParameterId_MemoryBufferToDecode OpenViBE::CIdentifier(0x2F98EA3C, 0xFB0BE096) +#define OVP_GD_Algorithm_StreamStructureDecoder_OutputTriggerId_ReceivedHeader OpenViBE::CIdentifier(0x815234BF, 0xAABAE5F2) +#define OVP_GD_Algorithm_StreamStructureDecoder_OutputTriggerId_ReceivedBuffer OpenViBE::CIdentifier(0xAA2738BF, 0xF7FE9FC3) +#define OVP_GD_Algorithm_StreamStructureDecoder_OutputTriggerId_ReceivedEnd OpenViBE::CIdentifier(0xC4AA114C, 0x628C2D77) + +// ----------------------------------------------------- +// Streamed matrix stream encoder +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder OpenViBE::CIdentifier(0x5cb32c71, 0x576f00a6) +#define OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix OpenViBE::CIdentifier(0xa3e9e5b0, 0xae756303) +#define OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer OpenViBE::CIdentifier(0xa3d8b171, 0xf8734734) +#define OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer OpenViBE::CIdentifier(0x1b7076fd, 0x449bc70a) +#define OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd OpenViBE::CIdentifier(0x3fc23508, 0x806753d8) +#define OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader OpenViBE::CIdentifier(0x878eaf60, 0xf9d5303f) + +// ----------------------------------------------------- +// Experiment information stream decoder +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_ExperimentInfoDecoder OpenViBE::CIdentifier(0x6fa7d52b, 0x80e2abd6) +#define OVP_GD_Algorithm_ExperimentInfoDecoder_InputParameterId_MemoryBufferToDecode OpenViBE::CIdentifier(0x2f98ea3c, 0xfb0be096) +#define OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectName OpenViBE::CIdentifier(0x3d3826ea, 0xe8883815) +#define OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_ExperimentID OpenViBE::CIdentifier(0x40259641, 0x478c73de) +#define OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_LaboratoryName OpenViBE::CIdentifier(0x5ca80fa5, 0x774f01cb) +#define OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectGender OpenViBE::CIdentifier(0x7d5059e8, 0xe4d8b38d) +#define OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectID OpenViBE::CIdentifier(0x97c5d20d, 0x203e65b3) +#define OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_TechnicianName OpenViBE::CIdentifier(0xb8a94b68, 0x389393d9) +#define OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_ExperimentDate OpenViBE::CIdentifier(0xbc0266a2, 0x9c2935f1) +#define OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectAge OpenViBE::CIdentifier(0xc36c6b08, 0x5227380a) +#define OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_TechnicianID OpenViBE::CIdentifier(0xc8ecfbbc, 0x0dcda310) +#define OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_LaboratoryID OpenViBE::CIdentifier(0xe761d3d4, 0x44ba1ebf) +#define OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedHeader OpenViBE::CIdentifier(0x815234bf, 0xaabae5f2) +#define OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedBuffer OpenViBE::CIdentifier(0xaa2738bf, 0xf7fe9fc3) +#define OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedEnd OpenViBE::CIdentifier(0xc4aa114c, 0x628c2d77) + +// ----------------------------------------------------- +// Channel localisation stream encoder +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_ChannelLocalisationEncoder OpenViBE::CIdentifier(0xc4aa738a, 0x2368c0ea) +#define OVP_GD_Algorithm_ChannelLocalisationEncoder_InputParameterId_Matrix OpenViBE::CIdentifier(0xa3e9e5b0, 0xae756303) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix +#define OVP_GD_Algorithm_ChannelLocalisationEncoder_InputParameterId_Dynamic OpenViBE::CIdentifier(0xcf5dd4f8, 0xc2ff2878) +#define OVP_GD_Algorithm_ChannelLocalisationEncoder_OutputParameterId_EncodedMemoryBuffer OpenViBE::CIdentifier(0xa3d8b171, 0xf8734734) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer +#define OVP_GD_Algorithm_ChannelLocalisationEncoder_InputTriggerId_EncodeBuffer OpenViBE::CIdentifier(0x1b7076fd, 0x449bc70a) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer +#define OVP_GD_Algorithm_ChannelLocalisationEncoder_InputTriggerId_EncodeEnd OpenViBE::CIdentifier(0x3fc23508, 0x806753d8) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd +#define OVP_GD_Algorithm_ChannelLocalisationEncoder_InputTriggerId_EncodeHeader OpenViBE::CIdentifier(0x878eaf60, 0xf9d5303f) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader + +// ----------------------------------------------------- +// Signal stream decoder +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_SignalDecoder OpenViBE::CIdentifier(0x7237c149, 0x0ca66da7) +#define OVP_GD_Algorithm_SignalDecoder_InputParameterId_MemoryBufferToDecode OpenViBE::CIdentifier(0x2f98ea3c, 0xfb0be096) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_InputParameterId_MemoryBufferToDecode +#define OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling OpenViBE::CIdentifier(0x363d8d79, 0xeefb912c) +#define OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Matrix OpenViBE::CIdentifier(0x79ef3123, 0x35e3ea4d) +#define OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedHeader OpenViBE::CIdentifier(0x815234bf, 0xaabae5f2) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedHeader +#define OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedBuffer OpenViBE::CIdentifier(0xaa2738bf, 0xf7fe9fc3) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedBuffer +#define OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedEnd OpenViBE::CIdentifier(0xc4aa114c, 0x628c2d77) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedEnd + +// ----------------------------------------------------- +// Spectrum stream encoder +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_SpectrumEncoder OpenViBE::CIdentifier(0xb3e252db, 0xc3214498) +#define OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_Matrix OpenViBE::CIdentifier(0xa3e9e5b0, 0xae756303) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix +#define OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_FrequencyAbscissa OpenViBE::CIdentifier(0x05C91BD6, 0x2D8C4083) +#define OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_Sampling OpenViBE::CIdentifier(0x02D25E1B, 0x76A1019B) +#define OVP_GD_Algorithm_SpectrumEncoder_OutputParameterId_EncodedMemoryBuffer OpenViBE::CIdentifier(0xa3d8b171, 0xf8734734) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer +#define OVP_GD_Algorithm_SpectrumEncoder_InputTriggerId_EncodeBuffer OpenViBE::CIdentifier(0x1b7076fd, 0x449bc70a) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer +#define OVP_GD_Algorithm_SpectrumEncoder_InputTriggerId_EncodeEnd OpenViBE::CIdentifier(0x3fc23508, 0x806753d8) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd +#define OVP_GD_Algorithm_SpectrumEncoder_InputTriggerId_EncodeHeader OpenViBE::CIdentifier(0x878eaf60, 0xf9d5303f) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader + +// ----------------------------------------------------- +// Acquisition stream decoder +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_AcquisitionDecoder OpenViBE::CIdentifier(0x1e0812b7, 0x3f686dd4) +#define OVP_GD_Algorithm_AcquisitionDecoder_InputParameterId_MemoryBufferToDecode OpenViBE::CIdentifier(0x2f98ea3c, 0xfb0be096) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_InputParameterId_MemoryBufferToDecode +#define OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_StimulationStream OpenViBE::CIdentifier(0x08fc3c12, 0x86a07bf7) +#define OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_ChannelUnitsStream OpenViBE::CIdentifier(0x11b93981, 0x6e5da9b0) +#define OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_SignalStream OpenViBE::CIdentifier(0x42c0d7bd, 0xbbcea3f3) +#define OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_ChannelLocalisationStream OpenViBE::CIdentifier(0x4eb92f81, 0x6ecda6b9) +#define OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_BufferDuration OpenViBE::CIdentifier(0x7527d6e5, 0xb7a70339) +#define OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_ExperimentInfoStream OpenViBE::CIdentifier(0xa7f1d539, 0xec708539) +#define OVP_GD_Algorithm_AcquisitionDecoder_OutputTriggerId_ReceivedHeader OpenViBE::CIdentifier(0x815234bf, 0xaabae5f2) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedHeader +#define OVP_GD_Algorithm_AcquisitionDecoder_OutputTriggerId_ReceivedBuffer OpenViBE::CIdentifier(0xaa2738bf, 0xf7fe9fc3) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedBuffer +#define OVP_GD_Algorithm_AcquisitionDecoder_OutputTriggerId_ReceivedEnd OpenViBE::CIdentifier(0xc4aa114c, 0x628c2d77) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedEnd + +#define OVP_GD_ClassId_Algorithm_MasterAcquisitionEncoder OpenViBE::CIdentifier(0x2d15e00b, 0x51414eb6) +#define OVP_GD_ClassId_Algorithm_MasterAcquisitionEncoderDesc OpenViBE::CIdentifier(0xe6ec841d, 0x9e75a8fb) + +#define OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_EncodeChannelUnitData OpenViBE::CIdentifier(0x19dc533c, 0x56301d0b) +#define OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_ChannelLocalisation OpenViBE::CIdentifier(0x227e13f0, 0x206b44f9) +#define OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_EncodeChannelLocalisationData OpenViBE::CIdentifier(0x26ee1f81, 0x3db00d5d) +#define OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_StimulationSet OpenViBE::CIdentifier(0x5b728d37, 0xfd088887) +#define OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_ChannelUnits OpenViBE::CIdentifier(0x740060c2, 0x7d2b4f57) +#define OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectAge OpenViBE::CIdentifier(0x9ef355e4, 0xc8531112) +#define OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectGender OpenViBE::CIdentifier(0xa9056ae3, 0x57fe6af0) +#define OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_SignalSampling OpenViBE::CIdentifier(0xb84ad0ca, 0x4f316dd3) +#define OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectID OpenViBE::CIdentifier(0xd5bb5231, 0x59389b72) +#define OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_BufferDuration OpenViBE::CIdentifier(0xe1fc7385, 0x586a4f3f) +#define OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_SignalMatrix OpenViBE::CIdentifier(0xe9ac8077, 0xe369a51d) +#define OVP_GD_Algorithm_MasterAcquisitionEncoder_OutputParameterId_EncodedMemoryBuffer OpenViBE::CIdentifier(0xa3d8b171, 0xf8734734) // Duplicate of OVP_GD_Algorit hm_AcquisitionStreamEncoder_OutputParameterId_EncodedMemoryBuffer +#define OVP_GD_Algorithm_MasterAcquisitionEncoder_InputTriggerId_EncodeBuffer OpenViBE::CIdentifier(0x1b7076fd, 0x449bc70a) // Duplicate of OVP_GD_Algorit hm_AcquisitionStreamEncoder_InputTriggerId_EncodeBuffer +#define OVP_GD_Algorithm_MasterAcquisitionEncoder_InputTriggerId_EncodeEnd OpenViBE::CIdentifier(0x3fc23508, 0x806753d8) // Duplicate of OVP_GD_Algorit hm_AcquisitionStreamEncoder_InputTriggerId_EncodeEnd +#define OVP_GD_Algorithm_MasterAcquisitionEncoder_InputTriggerId_EncodeHeader OpenViBE::CIdentifier(0x878eaf60, 0xf9d5303f) // Duplicate of OVP_GD_Algorit hm_AcquisitionStreamEncoder_InputTriggerId_EncodeHeader + +// ----------------------------------------------------- +// Spectrum stream decoder +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_SpectrumDecoder OpenViBE::CIdentifier(0x128202db, 0x449fc7a6) +#define OVP_GD_Algorithm_SpectrumDecoder_InputParameterId_MemoryBufferToDecode OpenViBE::CIdentifier(0x2f98ea3c, 0xfb0be096) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_InputParameterId_MemoryBufferToDecode +#define OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_FrequencyAbscissa OpenViBE::CIdentifier(0x14A572E4, 0x5C405C8E) +#define OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_Sampling OpenViBE::CIdentifier(0x68442C12, 0x0D9A46DE) +#define OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_Matrix OpenViBE::CIdentifier(0x79ef3123, 0x35e3ea4d) // Duplicate of OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Matrix +#define OVP_GD_Algorithm_SpectrumDecoder_OutputTriggerId_ReceivedHeader OpenViBE::CIdentifier(0x815234bf, 0xaabae5f2) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedHeader +#define OVP_GD_Algorithm_SpectrumDecoder_OutputTriggerId_ReceivedBuffer OpenViBE::CIdentifier(0xaa2738bf, 0xf7fe9fc3) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedBuffer +#define OVP_GD_Algorithm_SpectrumDecoder_OutputTriggerId_ReceivedEnd OpenViBE::CIdentifier(0xc4aa114c, 0x628c2d77) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedEnd + +// ----------------------------------------------------- +// Stimulation stream decoder +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_StimulationDecoder OpenViBE::CIdentifier(0xc8807f2b, 0x0813c5b1) +#define OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode OpenViBE::CIdentifier(0x2f98ea3c, 0xfb0be096) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_InputParameterId_MemoryBufferToDecode +#define OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet OpenViBE::CIdentifier(0xf46d0c19, 0x47306bea) +#define OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader OpenViBE::CIdentifier(0x815234bf, 0xaabae5f2) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedHeader +#define OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer OpenViBE::CIdentifier(0xaa2738bf, 0xf7fe9fc3) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedBuffer +#define OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd OpenViBE::CIdentifier(0xc4aa114c, 0x628c2d77) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedEnd + +// ----------------------------------------------------- +// Streamed matrix stream decoder +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_StreamedMatrixDecoder OpenViBE::CIdentifier(0x7359d0db, 0x91784b21) +#define OVP_GD_Algorithm_StreamedMatrixDecoder_InputParameterId_MemoryBufferToDecode OpenViBE::CIdentifier(0x2f98ea3c, 0xfb0be096) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_InputParameterId_MemoryBufferToDecode +#define OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix OpenViBE::CIdentifier(0x79ef3123, 0x35e3ea4d) // Duplicate of OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Matrix +#define OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedHeader OpenViBE::CIdentifier(0x815234bf, 0xaabae5f2) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedHeader +#define OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedBuffer OpenViBE::CIdentifier(0xaa2738bf, 0xf7fe9fc3) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedBuffer +#define OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedEnd OpenViBE::CIdentifier(0xc4aa114c, 0x628c2d77) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedEnd + +// ----------------------------------------------------- +// Feature vector stream decoder +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_FeatureVectorDecoder OpenViBE::CIdentifier(0xc2689ecc, 0x43b335c1) +#define OVP_GD_Algorithm_FeatureVectorDecoder_InputParameterId_MemoryBufferToDecode OpenViBE::CIdentifier(0x2f98ea3c, 0xfb0be096) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_InputParameterId_MemoryBufferToDecode +#define OVP_GD_Algorithm_FeatureVectorDecoder_OutputParameterId_Matrix OpenViBE::CIdentifier(0x79ef3123, 0x35e3ea4d) // Duplicate of OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Matrix +#define OVP_GD_Algorithm_FeatureVectorDecoder_OutputTriggerId_ReceivedHeader OpenViBE::CIdentifier(0x815234bf, 0xaabae5f2) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedHeader +#define OVP_GD_Algorithm_FeatureVectorDecoder_OutputTriggerId_ReceivedBuffer OpenViBE::CIdentifier(0xaa2738bf, 0xf7fe9fc3) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedBuffer +#define OVP_GD_Algorithm_FeatureVectorDecoder_OutputTriggerId_ReceivedEnd OpenViBE::CIdentifier(0xc4aa114c, 0x628c2d77) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedEnd + +// ----------------------------------------------------- +// Channel localisation stream decoder +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_ChannelLocalisationDecoder OpenViBE::CIdentifier(0x8222f065, 0xb05d35cf) +#define OVP_GD_Algorithm_ChannelLocalisationDecoder_InputParameterId_MemoryBufferToDecode OpenViBE::CIdentifier(0x2f98ea3c, 0xfb0be096) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_InputParameterId_MemoryBufferToDecode +#define OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputParameterId_Matrix OpenViBE::CIdentifier(0x79ef3123, 0x35e3ea4d) // Duplicate of OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Matrix +#define OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputParameterId_Dynamic OpenViBE::CIdentifier(0xd20991fd, 0xa3153651) +#define OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputTriggerId_ReceivedHeader OpenViBE::CIdentifier(0x815234bf, 0xaabae5f2) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedHeader +#define OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputTriggerId_ReceivedBuffer OpenViBE::CIdentifier(0xaa2738bf, 0xf7fe9fc3) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedBuffer +#define OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputTriggerId_ReceivedEnd OpenViBE::CIdentifier(0xc4aa114c, 0x628c2d77) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedEnd + +// ----------------------------------------------------- +// Channel units stream decoder +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_ChannelUnitsDecoder OpenViBE::CIdentifier(0x5f973ddf, 0x4a582daf) +#define OVP_GD_Algorithm_ChannelUnitsDecoder_InputParameterId_MemoryBufferToDecode OpenViBE::CIdentifier(0x2f98ea3c, 0xfb0be096) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_InputParameterId_MemoryBufferToDecode +#define OVP_GD_Algorithm_ChannelUnitsDecoder_OutputParameterId_Dynamic OpenViBE::CIdentifier(0x31cf1c7a, 0x17475323) +#define OVP_GD_Algorithm_ChannelUnitsDecoder_OutputParameterId_Matrix OpenViBE::CIdentifier(0x79ef3123, 0x35e3ea4d) // Duplicate of OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Matrix +#define OVP_GD_Algorithm_ChannelUnitsDecoder_OutputTriggerId_ReceivedHeader OpenViBE::CIdentifier(0x815234bf, 0xaabae5f2) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedHeader +#define OVP_GD_Algorithm_ChannelUnitsDecoder_OutputTriggerId_ReceivedBuffer OpenViBE::CIdentifier(0xaa2738bf, 0xf7fe9fc3) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedBuffer +#define OVP_GD_Algorithm_ChannelUnitsDecoder_OutputTriggerId_ReceivedEnd OpenViBE::CIdentifier(0xc4aa114c, 0x628c2d77) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedEnd + +// ----------------------------------------------------- +// Experiment information stream encoder +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_ExperimentInfoEncoder OpenViBE::CIdentifier(0x56b354fe, 0xbf175468) +#define OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectName OpenViBE::CIdentifier(0x3d3826ea, 0xe8883815) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectName +#define OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_ExperimentID OpenViBE::CIdentifier(0x40259641, 0x478c73de) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_ExperimentID +#define OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_LaboratoryName OpenViBE::CIdentifier(0x5ca80fa5, 0x774f01cb) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_LaboratoryName +#define OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectGender OpenViBE::CIdentifier(0x7d5059e8, 0xe4d8b38d) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectGender +#define OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectID OpenViBE::CIdentifier(0x97c5d20d, 0x203e65b3) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectID +#define OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_TechnicianName OpenViBE::CIdentifier(0xb8a94b68, 0x389393d9) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_TechnicianName +#define OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_ExperimentDate OpenViBE::CIdentifier(0xbc0266a2, 0x9c2935f1) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_ExperimentDate +#define OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectAge OpenViBE::CIdentifier(0xc36c6b08, 0x5227380a) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectAge +#define OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_TechnicianID OpenViBE::CIdentifier(0xc8ecfbbc, 0x0dcda310) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_TechnicianID +#define OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_LaboratoryID OpenViBE::CIdentifier(0xe761d3d4, 0x44ba1ebf) // Duplicate of OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_LaboratoryID +#define OVP_GD_Algorithm_ExperimentInfoEncoder_OutputParameterId_EncodedMemoryBuffer OpenViBE::CIdentifier(0xa3d8b171, 0xf8734734) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer +#define OVP_GD_Algorithm_ExperimentInfoEncoder_InputTriggerId_EncodeBuffer OpenViBE::CIdentifier(0x1b7076fd, 0x449bc70a) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer +#define OVP_GD_Algorithm_ExperimentInfoEncoder_InputTriggerId_EncodeEnd OpenViBE::CIdentifier(0x3fc23508, 0x806753d8) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd +#define OVP_GD_Algorithm_ExperimentInfoEncoder_InputTriggerId_EncodeHeader OpenViBE::CIdentifier(0x878eaf60, 0xf9d5303f) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader + +// ----------------------------------------------------- +// Feature vector stream encoder +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_FeatureVectorEncoder OpenViBE::CIdentifier(0x7ebe049d, 0xf777a602) +#define OVP_GD_Algorithm_FeatureVectorEncoder_InputParameterId_Matrix OpenViBE::CIdentifier(0xa3e9e5b0, 0xae756303) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix +#define OVP_GD_Algorithm_FeatureVectorEncoder_OutputParameterId_EncodedMemoryBuffer OpenViBE::CIdentifier(0xa3d8b171, 0xf8734734) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer +#define OVP_GD_Algorithm_FeatureVectorEncoder_InputTriggerId_EncodeBuffer OpenViBE::CIdentifier(0x1b7076fd, 0x449bc70a) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer +#define OVP_GD_Algorithm_FeatureVectorEncoder_InputTriggerId_EncodeEnd OpenViBE::CIdentifier(0x3fc23508, 0x806753d8) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd +#define OVP_GD_Algorithm_FeatureVectorEncoder_InputTriggerId_EncodeHeader OpenViBE::CIdentifier(0x878eaf60, 0xf9d5303f) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader + +// ----------------------------------------------------- +// Stimulation stream encoder +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_StimulationEncoder OpenViBE::CIdentifier(0x6e86f7d5, 0xa4668108) +#define OVP_GD_Algorithm_StimulationEncoder_InputParameterId_StimulationSet OpenViBE::CIdentifier(0x8565254c, 0x3a49268e) +#define OVP_GD_Algorithm_StimulationEncoder_OutputParameterId_EncodedMemoryBuffer OpenViBE::CIdentifier(0xa3d8b171, 0xf8734734) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer +#define OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeBuffer OpenViBE::CIdentifier(0x1b7076fd, 0x449bc70a) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer +#define OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeEnd OpenViBE::CIdentifier(0x3fc23508, 0x806753d8) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd +#define OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeHeader OpenViBE::CIdentifier(0x878eaf60, 0xf9d5303f) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader + +// ----------------------------------------------------- +// Channel units stream encoder +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_ChannelUnitsEncoder OpenViBE::CIdentifier(0x2ca034fd, 0x5c051e86) +#define OVP_GD_Algorithm_ChannelUnitsEncoder_InputParameterId_Dynamic OpenViBE::CIdentifier(0x615f03b9, 0x4f6a320a) +#define OVP_GD_Algorithm_ChannelUnitsEncoder_InputParameterId_Matrix OpenViBE::CIdentifier(0xa3e9e5b0, 0xae756303) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix +#define OVP_GD_Algorithm_ChannelUnitsEncoder_OutputParameterId_EncodedMemoryBuffer OpenViBE::CIdentifier(0xa3d8b171, 0xf8734734) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer +#define OVP_GD_Algorithm_ChannelUnitsEncoder_InputTriggerId_EncodeBuffer OpenViBE::CIdentifier(0x1b7076fd, 0x449bc70a) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer +#define OVP_GD_Algorithm_ChannelUnitsEncoder_InputTriggerId_EncodeEnd OpenViBE::CIdentifier(0x3fc23508, 0x806753d8) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd +#define OVP_GD_Algorithm_ChannelUnitsEncoder_InputTriggerId_EncodeHeader OpenViBE::CIdentifier(0x878eaf60, 0xf9d5303f) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader + +// ----------------------------------------------------- +// Signal stream encoder +// ----------------------------------------------------- + +#define OVP_GD_ClassId_Algorithm_SignalEncoder OpenViBE::CIdentifier(0xc488ad3c, 0xeb2e36bf) +#define OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling OpenViBE::CIdentifier(0x998710ff, 0x2c5cca82) +#define OVP_GD_Algorithm_SignalEncoder_InputParameterId_Matrix OpenViBE::CIdentifier(0xa3e9e5b0, 0xae756303) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix +#define OVP_GD_Algorithm_SignalEncoder_OutputParameterId_EncodedMemoryBuffer OpenViBE::CIdentifier(0xa3d8b171, 0xf8734734) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer +#define OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeBuffer OpenViBE::CIdentifier(0x1b7076fd, 0x449bc70a) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer +#define OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeEnd OpenViBE::CIdentifier(0x3fc23508, 0x806753d8) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd +#define OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeHeader OpenViBE::CIdentifier(0x878eaf60, 0xf9d5303f) // Duplicate of OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader diff --git a/Masterarbeit/openvibe/sdk-master/common/src/main.cpp b/Masterarbeit/openvibe/sdk-master/common/src/main.cpp new file mode 100755 index 0000000..dcd05b2 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/common/src/main.cpp @@ -0,0 +1,27 @@ +// Appeasing Intellisense by including the following +#include "ov_common_defines.h" +#include + +int main() +{ +#if defined(WIN32) || (defined(LINUX) && defined(__GXX_EXPERIMENTAL_CXX0X__)) + static_assert(sizeof(uint64_t) >= 8, "uint64_t is not at least 8 bytes"); + static_assert(sizeof(uint32_t) >= 4, "uint32_t is not at least 4 bytes"); + static_assert(sizeof(uint16_t) >= 2, "uint16_t is not at least 2 bytes"); + static_assert(sizeof(uint8_t) >= 1, "uint8_t is not at least 1 byte"); + + static_assert(sizeof(int64_t) >= 8, "int64_t is not at least 8 bytes"); + static_assert(sizeof(int) >= 4, "int is not at least 4 bytes"); + static_assert(sizeof(int16_t) >= 2, "int16_t is not at least 2 bytes"); + static_assert(sizeof(int8_t) >= 1, "int8_t is not at least 1 byte"); + +#if defined(LINUX) + static_assert(sizeof(long double)>=10, "long double is not at least 10 bytes"); +#endif + // Float80 seems to be the same size as double on Win at the time of writing, but its not widely used in openvibe. + static_assert(sizeof(double) >= 8, "double is not at least 8 bytes"); + static_assert(sizeof(float) >= 4, "float is not at least 4 bytes"); +#endif + + return 0; +} diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Bessel.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Bessel.cpp new file mode 100644 index 0000000..0bca141 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Bessel.cpp @@ -0,0 +1,200 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#include "Common.h" +#include "Bessel.h" +#include "RootFinder.h" + +namespace Dsp +{ + namespace Bessel + { + + // returns fact(n) = n! + static double fact(const int n) + { + if (n == 0) { return 1; } + double res = 1; + for (int i = 2; i <= n; ++i) { res *= i; } + return res; + } + + // returns the k-th zero based coefficient of the reverse bessel polynomial of degree n + static double reversebessel(const int k, const int n) { return fact(2 * n - k) / ((fact(n - k) * fact(k)) * pow(2., n - k)); } + + //------------------------------------------------------------------------------ + + void AnalogLowPass::design(const int numPoles, WorkspaceBase* w) + { + if (m_numPoles != numPoles) + { + m_numPoles = numPoles; + + reset(); + + RootFinderBase& solver(w->roots); + for (int i = 0; i < numPoles + 1; ++i) { solver.coef()[i] = reversebessel(i, numPoles); } + solver.solve(numPoles); + + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + complex_t c = solver.root()[i]; + addPoleZeroConjugatePairs(c, infinity()); + } + + if (numPoles & 1) { add(solver.root()[pairs].real(), infinity()); } + } + } + + //------------------------------------------------------------------------------ + + AnalogLowShelf::AnalogLowShelf() + : m_numPoles(-1) { setNormal(doublePi, 1); } + + void AnalogLowShelf::design(int numPoles, + double gainDb, + WorkspaceBase* w) + { + if (m_numPoles != numPoles || + m_gainDb != gainDb) + { + m_numPoles = numPoles; + m_gainDb = gainDb; + + reset(); + + const double G = pow(10., gainDb / 20) - 1; + + RootFinderBase& poles(w->roots); + for (int i = 0; i < numPoles + 1; ++i) { poles.coef()[i] = reversebessel(i, numPoles); } + poles.solve(numPoles); + + RootFinder<50> zeros; + for (int i = 0; i < numPoles + 1; ++i) { zeros.coef()[i] = reversebessel(i, numPoles); } + double a0 = reversebessel(0, numPoles); + zeros.coef()[0] += G * a0; + zeros.solve(numPoles); + + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + complex_t p = poles.root()[i]; + complex_t z = zeros.root()[i]; + addPoleZeroConjugatePairs(p, z); + } + + if (numPoles & 1) { add(poles.root()[pairs].real(), zeros.root()[pairs].real()); } + } + } + + //------------------------------------------------------------------------------ + + void LowPassBase::setup(int order, + double sampleRate, + double cutoffFrequency, + WorkspaceBase* w) + { + m_analogProto.design(order, w); + + LowPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + + void HighPassBase::setup(int order, + double sampleRate, + double cutoffFrequency, + WorkspaceBase* w) + { + m_analogProto.design(order, w); + + HighPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + + void BandPassBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + WorkspaceBase* w) + { + m_analogProto.design(order, w); + + BandPassTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + + void BandStopBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + WorkspaceBase* w) + { + m_analogProto.design(order, w); + + BandStopTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + + void LowShelfBase::setup(int order, + double sampleRate, + double cutoffFrequency, + double gainDb, + WorkspaceBase* w) + { + m_analogProto.design(order, gainDb, w); + + LowPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + } // namespace Bessel +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Bessel.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Bessel.h new file mode 100644 index 0000000..1f38525 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Bessel.h @@ -0,0 +1,350 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#ifndef DSPFILTERS_BESSEL_H +#define DSPFILTERS_BESSEL_H + +#include "Common.h" +#include "Cascade.h" +#include "Design.h" +#include "Filter.h" +#include "PoleFilter.h" +#include "RootFinder.h" + +namespace Dsp +{ + + /* + * Filters with Bessel response characteristics + * + */ + + namespace Bessel + { + + // A Workspace is necessary to find roots + + struct WorkspaceBase + { + WorkspaceBase(RootFinderBase* rootsBase) + : roots(*rootsBase) { } + + RootFinderBase& roots; + + private: + WorkspaceBase(WorkspaceBase&); + WorkspaceBase& operator=(WorkspaceBase&); + }; + + template + struct Workspace : WorkspaceBase + { + Workspace() : WorkspaceBase(&m_roots) { } + + private: + RootFinder m_roots; + }; + + //------------------------------------------------------------------------------ + + // Half-band analog prototypes (s-plane) + + class AnalogLowPass : public LayoutBase + { + public: + AnalogLowPass() : m_numPoles(-1) { setNormal(0, 1); } + + void design(int numPoles, WorkspaceBase* w); + + private: + int m_numPoles = 0; + }; + + //------------------------------------------------------------------------------ + + class AnalogLowShelf : public LayoutBase + { + public: + AnalogLowShelf(); + + void design(int numPoles, double gainDb, WorkspaceBase* w); + + private: + int m_numPoles = 0; + double m_gainDb = 0; + }; + + //------------------------------------------------------------------------------ + + // Factored implementations to reduce template instantiations + + struct LowPassBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency, WorkspaceBase* w); + }; + + struct HighPassBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency, WorkspaceBase* w); + }; + + struct BandPassBase : PoleFilterBase + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency, WorkspaceBase* w); + }; + + struct BandStopBase : PoleFilterBase + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency, WorkspaceBase* w); + }; + + struct LowShelfBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency, double gainDb, WorkspaceBase* w); + }; + + //------------------------------------------------------------------------------ + + // + // Raw filters + // + + template + struct LowPass : PoleFilter + { + void setup(int order, double sampleRate, double cutoffFrequency) + { + Workspace w; + LowPassBase::setup(order, sampleRate, cutoffFrequency, &w); + } + }; + + template + struct HighPass : PoleFilter + { + void setup(int order, double sampleRate, double cutoffFrequency) + { + Workspace w; + HighPassBase::setup(order, sampleRate, cutoffFrequency, &w); + } + }; + + template + struct BandPass : PoleFilter + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency) + { + Workspace w; + BandPassBase::setup(order, sampleRate, centerFrequency, widthFrequency, &w); + } + }; + + template + struct BandStop : PoleFilter + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency) + { + Workspace w; + BandStopBase::setup(order, sampleRate, centerFrequency, widthFrequency, &w); + } + }; + + template + struct LowShelf : PoleFilter + { + void setup(int order, double sampleRate, double cutoffFrequency, double gainDb) + { + Workspace w; + LowShelfBase::setup(order, sampleRate, cutoffFrequency, gainDb, &w); + } + }; + + //------------------------------------------------------------------------------ + + // + // Gui-friendly Design layer + // + + namespace Design + { + struct TypeIBase : DesignBase + { + enum + { + NumParams = 3 + }; + + static int getNumParams() { return 3; } + + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCutoffFrequencyParam(); } + }; + + template + struct TypeI : TypeIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2]); } + }; + + struct TypeIIBase : DesignBase + { + enum + { + NumParams = 4 + }; + + static int getNumParams() { return 4; } + + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCenterFrequencyParam(); } + + static ParamInfo getParamInfo_3() { return ParamInfo::defaultBandwidthHzParam(); } + }; + + template + struct TypeII : TypeIIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3]); } + }; + + struct TypeIIIBase : DesignBase + { + enum + { + NumParams = 4 + }; + + static int getNumParams() { return 4; } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCutoffFrequencyParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultGainParam(); } + }; + + template + struct TypeIII : TypeIIIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3]); } + }; + + struct TypeIVBase : DesignBase + { + enum + { + NumParams = 5 + }; + + static int getNumParams() { return 5; } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCenterFrequencyParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultBandwidthHzParam(); } + static ParamInfo getParamInfo_4() { return ParamInfo::defaultGainParam(); } + }; + + template + struct TypeIV : TypeIVBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4]); } + }; + + // Factored kind and name + + struct LowPassDescription + { + static Kind getKind() { return kindLowPass; } + static const char* getName() { return "Bessel Low Pass"; } + }; + + struct HighPassDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Bessel High Pass"; } + }; + + struct BandPassDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Bessel Band Pass"; } + }; + + struct BandStopDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Bessel Band Stop"; } + }; + + struct LowShelfDescription + { + static Kind getKind() { return kindLowShelf; } + static const char* getName() { return "Bessel Low Shelf"; } + }; + + // This glues on the Order parameter + template class TypeClass, template class FilterClass> + struct OrderBase : TypeClass> + { + const ParamInfo getParamInfo_1() const + { + return ParamInfo(idOrder, "Order", "Order", 1, MaxOrder, 2, &ParamInfo::Int_toControlValue, &ParamInfo::Int_toNativeValue, + &ParamInfo::Int_toString); + } + }; + + //------------------------------------------------------------------------------ + + // + // Gui-friendly Design layer + // + + template + struct LowPass : OrderBase, LowPassDescription {}; + + template + struct HighPass : OrderBase, HighPassDescription {}; + + template + struct BandPass : OrderBase, BandPassDescription {}; + + template + struct BandStop : OrderBase, BandStopDescription {}; + + /* + * NOT IMPLEMENTED + * + */ + template + struct LowShelf : OrderBase, LowShelfDescription {}; + } // namespace Design + } // namespace Bessel +} // namespace Dsp + +#endif + +/* This is a test of svn:external */ diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Biquad.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Biquad.cpp new file mode 100644 index 0000000..b7f4377 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Biquad.cpp @@ -0,0 +1,226 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#include "Common.h" +#include "MathSupplement.h" +#include "Biquad.h" + +namespace Dsp +{ + BiquadPoleState::BiquadPoleState(const BiquadBase& s) + { + const double a0 = s.getA0(); + const double a1 = s.getA1(); + const double a2 = s.getA2(); + const double b0 = s.getB0(); + const double b1 = s.getB1(); + const double b2 = s.getB2(); + + if (a2 == 0 && b2 == 0) + { + // single pole + poles.first = -a1; + zeros.first = -b0 / b1; + poles.second = 0; + zeros.second = 0; + } + else + { + { + const complex_t c = sqrt(complex_t(a1 * a1 - 4 * a0 * a2, 0)); + double d = 2. * a0; + poles.first = -(a1 + c) / d; + poles.second = (c - a1) / d; + assert(!poles.is_nan()); + } + + { + const complex_t c = sqrt(complex_t(b1 * b1 - 4 * b0 * b2, 0)); + double d = 2. * b0; + zeros.first = -(b1 + c) / d; + zeros.second = (c - b1) / d; + assert(!zeros.is_nan()); + } + } + + gain = b0 / a0; + } + + //------------------------------------------------------------------------------ + + complex_t BiquadBase::response(double normalizedFrequency) const + { + const double a0 = getA0(); + const double a1 = getA1(); + const double a2 = getA2(); + const double b0 = getB0(); + const double b1 = getB1(); + const double b2 = getB2(); + + const double w = 2 * doublePi * normalizedFrequency; + const complex_t czn1 = std::polar(1., -w); + const complex_t czn2 = std::polar(1., -2 * w); + complex_t ch(1); + complex_t cbot(1); + + complex_t ct(b0 / a0); + complex_t cb(1); + ct = addmul(ct, b1 / a0, czn1); + ct = addmul(ct, b2 / a0, czn2); + cb = addmul(cb, a1 / a0, czn1); + cb = addmul(cb, a2 / a0, czn2); + ch *= ct; + cbot *= cb; + + return ch / cbot; + } + + std::vector BiquadBase::getPoleZeros() const + { + std::vector vpz; + BiquadPoleState bps(*this); + vpz.push_back(bps); + return vpz; + } + + void BiquadBase::setCoefficients(double a0, double a1, double a2, + double b0, double b1, double b2) + { + assert(!Dsp::is_nan (a0) && !Dsp::is_nan (a1) && !Dsp::is_nan (a2) && + !Dsp::is_nan (b0) && !Dsp::is_nan (b1) && !Dsp::is_nan (b2)); + + m_a0 = a0; + m_a1 = a1 / a0; + m_a2 = a2 / a0; + m_b0 = b0 / a0; + m_b1 = b1 / a0; + m_b2 = b2 / a0; + } + + void BiquadBase::setOnePole(complex_t pole, complex_t zero) + { +#if 0 + pole = adjust_imag (pole); + zero = adjust_imag (zero); +#else + assert(pole.imag() == 0); + assert(zero.imag() == 0); +#endif + + const double a0 = 1; + const double a1 = -pole.real(); + const double a2 = 0; + const double b0 = 1; + const double b1 = -zero.real(); + const double b2 = 0; + + setCoefficients(a0, a1, a2, b0, b1, b2); + } + + void BiquadBase::setTwoPole(complex_t pole1, complex_t zero1, + complex_t pole2, complex_t zero2) + { +#if 0 + pole1 = adjust_imag (pole1); + pole2 = adjust_imag (pole2); + zero1 = adjust_imag (zero1); + zero2 = adjust_imag (zero2); +#endif + + const double a0 = 1; + double a1; + double a2; + + if (pole1.imag() != 0) + { + assert(pole2 == std::conj (pole1)); + + a1 = -2 * pole1.real(); + a2 = std::norm(pole1); + } + else + { + assert(pole2.imag() == 0); + + a1 = -(pole1.real() + pole2.real()); + a2 = pole1.real() * pole2.real(); + } + + const double b0 = 1; + double b1; + double b2; + + if (zero1.imag() != 0) + { + assert(zero2 == std::conj (zero1)); + + b1 = -2 * zero1.real(); + b2 = std::norm(zero1); + } + else + { + assert(zero2.imag() == 0); + + b1 = -(zero1.real() + zero2.real()); + b2 = zero1.real() * zero2.real(); + } + + setCoefficients(a0, a1, a2, b0, b1, b2); + } + + void BiquadBase::setPoleZeroForm(const BiquadPoleState& bps) + { + setPoleZeroPair(bps); + applyScale(bps.gain); + } + + void BiquadBase::setIdentity() { setCoefficients(1, 0, 0, 1, 0, 0); } + + void BiquadBase::applyScale(double scale) + { + m_b0 *= scale; + m_b1 *= scale; + m_b2 *= scale; + } + + //------------------------------------------------------------------------------ + + Biquad::Biquad() {} + + // Construct a second order section from a pair of poles and zeroes + Biquad::Biquad(const BiquadPoleState& bps) { setPoleZeroForm(bps); } + + //------------------------------------------------------------------------------ +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Biquad.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Biquad.h new file mode 100644 index 0000000..0e2c5a6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Biquad.h @@ -0,0 +1,206 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#ifndef DSPFILTERS_BIQUAD_H +#define DSPFILTERS_BIQUAD_H + +#include "Common.h" +#include "MathSupplement.h" +#include "Types.h" + +namespace Dsp +{ + struct BiquadPoleState; + + /* + * Holds coefficients for a second order Infinite Impulse Response + * digital filter. This is the building block for all IIR filters. + * + */ + + // Factored interface to prevent outsiders from fiddling + class BiquadBase + { + public: + template + struct State : StateType, private DenormalPrevention + { + template + Sample process(const Sample in, const BiquadBase& b) { return Sample(StateType::process1(in, b, ac())); } + }; + + // Calculate filter response at the given normalized frequency. + complex_t response(double normalizedFrequency) const; + + std::vector getPoleZeros() const; + + double getA0() const { return m_a0; } + double getA1() const { return m_a1 * m_a0; } + double getA2() const { return m_a2 * m_a0; } + double getB0() const { return m_b0 * m_a0; } + double getB1() const { return m_b1 * m_a0; } + double getB2() const { return m_b2 * m_a0; } + + // Process a block of samples in the given form + template + void process(int nSamples, Sample* dest, StateType& state) const + { + while (--nSamples >= 0) + { + *dest = state.process(*dest, *this); + ++dest; + } + } + + protected: + // + // These are protected so you can't mess with RBJ biquads + // + + void setCoefficients(double a0, double a1, double a2, double b0, double b1, double b2); + + void setOnePole(complex_t pole, complex_t zero); + + void setTwoPole(complex_t pole1, complex_t zero1, complex_t pole2, complex_t zero2); + + void setPoleZeroPair(const PoleZeroPair& pair) + { + if (pair.isSinglePole()) { setOnePole(pair.poles.first, pair.zeros.first); } + else { setTwoPole(pair.poles.first, pair.zeros.first, pair.poles.second, pair.zeros.second); } + } + + void setPoleZeroForm(const BiquadPoleState& bps); + + void setIdentity(); + + void applyScale(double scale); + + public: + double m_a0 = 0; + double m_a1 = 0; + double m_a2 = 0; + double m_b1 = 0; + double m_b2 = 0; + double m_b0 = 0; + }; + + //------------------------------------------------------------------------------ + + // Expresses a biquad as a pair of pole/zeros, with gain + // values so that the coefficients can be reconstructed precisely. + struct BiquadPoleState : PoleZeroPair + { + BiquadPoleState() { } + + explicit BiquadPoleState(const BiquadBase& s); + + double gain = 0; + }; + + // More permissive interface for fooling around + class Biquad : public BiquadBase + { + public: + Biquad(); + + explicit Biquad(const BiquadPoleState& bps); + + // Process a block of samples, interpolating from the old section's coefficients + // to this section's coefficients, over nSamples. This implements smooth + // parameter changes. + + template + void smoothProcess1(int nSamples, Sample* dest, StateType& state, Biquad sectionPrev) const + { + double t = 1. / nSamples; + double da1 = (m_a1 - sectionPrev.m_a1) * t; + double da2 = (m_a2 - sectionPrev.m_a2) * t; + double db0 = (m_b0 - sectionPrev.m_b0) * t; + double db1 = (m_b1 - sectionPrev.m_b1) * t; + double db2 = (m_b2 - sectionPrev.m_b2) * t; + + while (--nSamples >= 0) + { + sectionPrev.m_a1 += da1; + sectionPrev.m_a2 += da2; + sectionPrev.m_b0 += db0; + sectionPrev.m_b1 += db1; + sectionPrev.m_b2 += db2; + + *dest = state.process(*dest, sectionPrev); + ++dest; + } + } + + // Process a block of samples, interpolating from the old section's pole/zeros + // to this section's pole/zeros, over nSamples. The interpolation is done + // in the z-plane using polar coordinates. + template + void smoothProcess2(int nSamples, + Sample* dest, + StateType& state, + BiquadPoleState zPrev) const + { + BiquadPoleState z(*this); + double t = 1. / nSamples; + complex_t dp0 = (z.poles.first - zPrev.poles.first) * t; + complex_t dp1 = (z.poles.second - zPrev.poles.second) * t; + complex_t dz0 = (z.zeros.first - zPrev.zeros.first) * t; + complex_t dz1 = (z.zeros.second - zPrev.zeros.second) * t; + double dg = (z.gain - zPrev.gain) * t; + + while (--nSamples >= 0) + { + zPrev.poles.first += dp0; + zPrev.poles.second += dp1; + zPrev.zeros.first += dz0; + zPrev.zeros.second += dz1; + zPrev.gain += dg; + + *dest = state.process(*dest, Biquad(zPrev)); + ++dest; + } + } + + // Export these as public + + void setOnePole(complex_t pole, complex_t zero) { BiquadBase::setOnePole(pole, zero); } + void setTwoPole(complex_t pole1, complex_t zero1, complex_t pole2, complex_t zero2) { BiquadBase::setTwoPole(pole1, zero1, pole2, zero2); } + void setPoleZeroPair(const PoleZeroPair& pair) { BiquadBase::setPoleZeroPair(pair); } + void applyScale(double scale) { BiquadBase::applyScale(scale); } + }; +} // namespace Dsp + +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Butterworth.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Butterworth.cpp new file mode 100644 index 0000000..bbe7ed5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Butterworth.cpp @@ -0,0 +1,204 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#include "Common.h" +#include "Butterworth.h" + +namespace Dsp +{ + namespace Butterworth + { + AnalogLowPass::AnalogLowPass() + : m_numPoles(-1) { setNormal(0, 1); } + + void AnalogLowPass::design(int numPoles) + { + if (m_numPoles != numPoles) + { + m_numPoles = numPoles; + + reset(); + + const double n2 = 2 * numPoles; + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + complex_t c = std::polar(1., doublePi_2 + (2 * i + 1) * doublePi / n2); + addPoleZeroConjugatePairs(c, infinity()); + } + + if (numPoles & 1) { add(-1, infinity()); } + } + } + + //------------------------------------------------------------------------------ + + AnalogLowShelf::AnalogLowShelf() + : m_numPoles(-1) { setNormal(doublePi, 1); } + + void AnalogLowShelf::design(int numPoles, double gainDb) + { + if (m_numPoles != numPoles || + m_gainDb != gainDb) + { + m_numPoles = numPoles; + m_gainDb = gainDb; + + reset(); + + const double n2 = numPoles * 2; + const double g = pow(pow(10., gainDb / 20), 1. / n2); + const double gp = -1. / g; + const double gz = -g; + + const int pairs = numPoles / 2; + for (int i = 1; i <= pairs; ++i) + { + const double theta = doublePi * (0.5 - (2 * i - 1) / n2); + addPoleZeroConjugatePairs(std::polar(gp, theta), std::polar(gz, theta)); + } + + if (numPoles & 1) { add(gp, gz); } + } + } + + //------------------------------------------------------------------------------ + + void LowPassBase::setup(int order, + double sampleRate, + double cutoffFrequency) + { + m_analogProto.design(order); + + LowPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + + void HighPassBase::setup(int order, + double sampleRate, + double cutoffFrequency) + { + m_analogProto.design(order); + + HighPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + + void BandPassBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency) + { + m_analogProto.design(order); + + BandPassTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + +#include "ButterworthSynthesisCpp.inl" + + void BandStopBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency) + { + m_analogProto.design(order); + + BandStopTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + + void LowShelfBase::setup(int order, + double sampleRate, + double cutoffFrequency, + double gainDb) + { + m_analogProto.design(order, gainDb); + + LowPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + + void HighShelfBase::setup(int order, + double sampleRate, + double cutoffFrequency, + double gainDb) + { + m_analogProto.design(order, gainDb); + + HighPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + + void BandShelfBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double gainDb) + { + m_analogProto.design(order, gainDb); + + BandPassTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + // HACK! + m_digitalProto.setNormal(((centerFrequency / sampleRate) < 0.25) ? doublePi : 0, 1); + + setLayout(m_digitalProto); + } + } // namespace Butterworth +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Butterworth.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Butterworth.h new file mode 100644 index 0000000..488469b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Butterworth.h @@ -0,0 +1,314 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ +#pragma once + +#include "Common.h" +#include "Cascade.h" +#include "Design.h" +#include "Filter.h" +#include "PoleFilter.h" + +namespace Dsp +{ + + /* + * Filters with Butterworth response characteristics + * + */ + + namespace Butterworth + { + + // Half-band analog prototypes (s-plane) + + class AnalogLowPass : public LayoutBase + { + public: + AnalogLowPass(); + + void design(int numPoles); + + private: + int m_numPoles = 0; + }; + + //------------------------------------------------------------------------------ + + class AnalogLowShelf : public LayoutBase + { + public: + AnalogLowShelf(); + + void design(int numPoles, double gainDb); + + private: + int m_numPoles = 0; + double m_gainDb = 0; + }; + + //------------------------------------------------------------------------------ + + // Factored implementations to reduce template instantiations + + struct LowPassBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency); + }; + + struct HighPassBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency); + }; + + struct BandPassBase : PoleFilterBase + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency); + +#include "ButterworthSynthesisH.inl" + }; + + struct BandStopBase : PoleFilterBase + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency); + }; + + struct LowShelfBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency, double gainDb); + }; + + struct HighShelfBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency, double gainDb); + }; + + struct BandShelfBase : PoleFilterBase + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency, double gainDb); + }; + + //------------------------------------------------------------------------------ + + // + // Raw filters + // + + template + struct LowPass : PoleFilter {}; + + template + struct HighPass : PoleFilter {}; + + template + struct BandPass : PoleFilter {}; + + template + struct BandStop : PoleFilter {}; + + template + struct LowShelf : PoleFilter {}; + + template + struct HighShelf : PoleFilter {}; + + template + struct BandShelf : PoleFilter {}; + + //------------------------------------------------------------------------------ + + // + // Gui-friendly Design layer + // + + namespace Design + { + struct TypeIBase : DesignBase + { + enum + { + NumParams = 3 + }; + + static int getNumParams() { return 3; } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCutoffFrequencyParam(); } + }; + + template + struct TypeI : TypeIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2]); } + }; + + struct TypeIIBase : DesignBase + { + enum + { + NumParams = 4 + }; + + static int getNumParams() { return 4; } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCenterFrequencyParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultBandwidthHzParam(); } + }; + + template + struct TypeII : TypeIIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3]); } + +#include "ButterworthSynthesisH2.inl" + }; + + struct TypeIIIBase : DesignBase + { + enum + { + NumParams = 4 + }; + + static int getNumParams() { return 4; } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCutoffFrequencyParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultGainParam(); } + }; + + template + struct TypeIII : TypeIIIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3]); } + }; + + struct TypeIVBase : DesignBase + { + enum + { + NumParams = 5 + }; + + static int getNumParams() { return 5; } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCenterFrequencyParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultBandwidthHzParam(); } + static ParamInfo getParamInfo_4() { return ParamInfo::defaultGainParam(); } + }; + + template + struct TypeIV : TypeIVBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4]); } + }; + + // Factored kind and name + + struct LowPassDescription + { + static Kind getKind() { return kindLowPass; } + static const char* getName() { return "Butterworth Low Pass"; } + }; + + struct HighPassDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Butterworth High Pass"; } + }; + + struct BandPassDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Butterworth Band Pass"; } + }; + + struct BandStopDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Butterworth Band Stop"; } + }; + + struct LowShelfDescription + { + static Kind getKind() { return kindLowShelf; } + static const char* getName() { return "Butterworth Low Shelf"; } + }; + + struct HighShelfDescription + { + static Kind getKind() { return kindHighShelf; } + static const char* getName() { return "Butterworth High Shelf"; } + }; + + struct BandShelfDescription + { + static Kind getKind() { return kindBandShelf; } + static const char* getName() { return "Butterworth Band Shelf"; } + }; + + // This glues on the Order parameter + template class TypeClass, template class FilterClass> + struct OrderBase : TypeClass> + { + const ParamInfo getParamInfo_1() const + { + return ParamInfo(idOrder, "Order", "Order", 1, MaxOrder, 2, &ParamInfo::Int_toControlValue, &ParamInfo::Int_toNativeValue, + &ParamInfo::Int_toString); + } + }; + + //------------------------------------------------------------------------------ + + // + // Design filters + // + + template + struct LowPass : OrderBase, LowPassDescription {}; + + template + struct HighPass : OrderBase, HighPassDescription {}; + + template + struct BandPass : OrderBase, BandPassDescription {}; + + template + struct BandStop : OrderBase, BandStopDescription {}; + + template + struct LowShelf : OrderBase, LowShelfDescription {}; + + template + struct HighShelf : OrderBase, HighShelfDescription {}; + + template + struct BandShelf : OrderBase, BandShelfDescription {}; + } // namespace Design + } // namespace Butterworth +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ButterworthSynthesisCpp.inl b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ButterworthSynthesisCpp.inl new file mode 100644 index 0000000..b5dfb70 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ButterworthSynthesisCpp.inl @@ -0,0 +1,13 @@ + +void BandPassBase::setupSynthesis (int order, + double sampleRate, + double centerFrequency, + double widthFrequency) +{ + m_analogProto.design (order); + + BandPassTransform (centerFrequency / sampleRate, widthFrequency / sampleRate, m_digitalProto, m_analogProto); + + // inversion of the numerator and denominator digital coefficients + Cascade::setLayoutSynthesis (m_digitalProto); +} diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ButterworthSynthesisH.inl b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ButterworthSynthesisH.inl new file mode 100644 index 0000000..0a67dec --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ButterworthSynthesisH.inl @@ -0,0 +1,5 @@ + + void setupSynthesis (int order, + double sampleRate, + double centerFrequency, + double widthFrequency); diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ButterworthSynthesisH2.inl b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ButterworthSynthesisH2.inl new file mode 100644 index 0000000..a4ae01f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ButterworthSynthesisH2.inl @@ -0,0 +1,5 @@ + + void setParamsSynthesis (const Params& params) + { + FilterClass::setupSynthesis (int(params[1]), params[0], params[2], params[3]); + } diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Cascade.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Cascade.cpp new file mode 100644 index 0000000..fe878af --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Cascade.cpp @@ -0,0 +1,115 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#include "Common.h" +#include "Cascade.h" +//#include +//#include +//#include + +namespace Dsp +{ + Cascade::Cascade() {} + + void Cascade::setCascadeStorage(const Storage& storage) + { + m_numStages = 0; + m_maxStages = storage.maxStages; + m_stageArray = storage.stageArray; + } + + complex_t Cascade::response(double normalizedFrequency) const + { + double w = 2 * doublePi * normalizedFrequency; + const complex_t czn1 = std::polar(1., -w); + const complex_t czn2 = std::polar(1., -2 * w); + complex_t ch(1); + complex_t cbot(1); + + const Biquad* stage = m_stageArray; + for (int i = m_numStages; --i >= 0; ++stage) + { + complex_t cb(1); + complex_t ct(stage->getB0() / stage->getA0()); + ct = addmul(ct, stage->getB1() / stage->getA0(), czn1); + ct = addmul(ct, stage->getB2() / stage->getA0(), czn2); + cb = addmul(cb, stage->getA1() / stage->getA0(), czn1); + cb = addmul(cb, stage->getA2() / stage->getA0(), czn2); + ch *= ct; + cbot *= cb; + } + + return ch / cbot; + } + + std::vector Cascade::getPoleZeros() const + { + std::vector vpz; + vpz.reserve(m_numStages); + + const Stage* stage = m_stageArray; + for (int i = m_numStages; --i >= 0;) + { + BiquadPoleState bps(*stage++); + assert(!bps.isSinglePole() || i == 0); + vpz.push_back(bps); + } + + return vpz; + } + + void Cascade::applyScale(double scale) + { + // For higher order filters it might be helpful + // to spread this factor between all the stages. + assert(m_numStages > 0); + m_stageArray->applyScale(scale); + } + + void Cascade::setLayout(const LayoutBase& proto) + { + const int numPoles = proto.getNumPoles(); + m_numStages = (numPoles + 1) / 2; + assert(m_numStages <= m_maxStages); + + Biquad* stage = m_stageArray; + for (int i = 0; i < m_numStages; ++i, ++stage) { stage->setPoleZeroPair(proto[i]); } + + applyScale(proto.getNormalGain() / + std::abs(response(proto.getNormalW() / (2 * doublePi)))); + } + +#include "CascadeSynthesisCpp.inl" +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Cascade.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Cascade.h new file mode 100644 index 0000000..27ac92d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Cascade.h @@ -0,0 +1,169 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#ifndef DSPFILTERS_CASCADE_H +#define DSPFILTERS_CASCADE_H + +#include "Common.h" +#include "Biquad.h" +#include "Filter.h" +#include "Layout.h" +#include "MathSupplement.h" + +namespace Dsp +{ + + /* + * Holds coefficients for a cascade of second order sections. + * + */ + + // Factored implementation to reduce template instantiations + class Cascade + { + public: + template + class StateBase : DenormalPrevention + { + public: + template + Sample process(const Sample in, const Cascade& c) + { + double out = in; + StateType* state = m_stateArray; + Biquad const* stage = c.m_stageArray; + const double vsa = ac(); + int i = c.m_numStages - 1; + out = (state++)->process1(out, *stage++, vsa); + for (; --i >= 0;) { out = (state++)->process1(out, *stage++, 0); } + //for (int i = c.m_numStages; --i >= 0; ++state, ++stage) + // out = state->process1 (out, *stage, vsa); + return Sample(out); + } + +#include "StateBaseSynthesisH.inl" + + protected: + StateBase(StateType* stateArray) : m_stateArray(stateArray) { } + + StateType* m_stateArray = nullptr; + }; + + struct Stage : Biquad { }; + + struct Storage + { + Storage(int maxStages_, Stage* stageArray_) : maxStages(maxStages_), stageArray(stageArray_) { } + + int maxStages; + Stage* stageArray; + }; + + int getNumStages() const { return m_numStages; } + + const Stage& operator[](int index) + { + assert(index >= 0 && index <= m_numStages); + return m_stageArray[index]; + } + + // Calculate filter response at the given normalized frequency. + complex_t response(double normalizedFrequency) const; + + std::vector getPoleZeros() const; + + // Process a block of samples in the given form + template + void process(int nSamples, Sample* dest, StateType& state) const + { + while (--nSamples >= 0) + { + *dest = state.process(*dest, *this); + ++dest; + } + } + +#include "CascadeSynthesisH.inl" + + protected: + Cascade(); + + void setCascadeStorage(const Storage& storage); + + void applyScale(double scale); + void setLayout(const LayoutBase& proto); + + private: + int m_numStages = 0; + int m_maxStages = 0; + Stage* m_stageArray = nullptr; + }; + + //------------------------------------------------------------------------------ + + // Storage for Cascade + template + class CascadeStages + { + public: + template + class State : public Cascade::StateBase + { + public: + State() : Cascade::StateBase(m_states) + { + Cascade::StateBase::m_stateArray = m_states; + reset(); + } + + void reset() + { + StateType* state = m_states; + for (int i = MaxStages; --i >= 0; ++state) { state->reset(); } + } + + private: + StateType m_states[MaxStages]; + }; + + /*@Internal*/ + Cascade::Storage getCascadeStorage() { return Cascade::Storage(MaxStages, m_stages); } + + private: + Cascade::Stage m_stages[MaxStages]; + }; +} // namespace Dsp + +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/CascadeSynthesisCpp.inl b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/CascadeSynthesisCpp.inl new file mode 100644 index 0000000..1ccba8c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/CascadeSynthesisCpp.inl @@ -0,0 +1,100 @@ + +//#include +//#include +//#include + +void Cascade::setLayoutSynthesis (const LayoutBase& proto) +{ + const int numPoles = proto.getNumPoles(); + m_numStages = (numPoles + 1)/ 2; + assert (m_numStages <= m_maxStages); + + Biquad* stage = m_stageArray; + for (int i = 0; i < m_numStages; ++i, ++stage) + stage->setPoleZeroPair (proto[i]); + + applyScale (proto.getNormalGain() / + std::abs (response (proto.getNormalW() / (2 * doublePi)))); + + /* + // visu Analysis Filter + stage-=m_numStages; + for (int i=0; im_a0; + a1 = stage->m_a1; + a2 = stage->m_a2; + b0 = stage->m_b0; + b1 = stage->m_b1; + b2 = stage->m_b2; + stage->m_a0 = b0; + stage->m_a1 = b1; + stage->m_a2 = b2; + stage->m_b0 = a0; + stage->m_b1 = a1; + stage->m_b2 = a2; + } + + applyScale (proto.getNormalGain() / std::abs (response (proto.getNormalW() / (2 * doublePi)))); + + /* + // visu Synthesis Filter + stage-=m_numStages; + double zeros_discr, poles_discr; + for (int i=0; im_b1*stage->m_b1 - 4*stage->m_b0*stage->m_b2; + poles_discr = stage->m_a1*stage->m_a1 - 4*stage->m_a0*stage->m_a2; + os << "zeros discriminant = " << zeros_discr << "\n"; + if(zeros_discr>=0) + { + os << "zeros = " << (-stage->m_b1 + std::sqrt(zeros_discr))/(2*stage->m_b0) << " et " << (-stage->m_b1 - std::sqrt(zeros_discr))/(2*stage->m_b0) << "\n"; + } + else + { + os << "zeros = " << (-stage->m_b1)/(2*stage->m_b0) << "+/-i" << std::sqrt(std::abs(zeros_discr))/(2*stage->m_b0) << "\n" + << "zeros abs = " << std::sqrt( (-stage->m_b1)/(2*stage->m_b0)*(-stage->m_b1)/(2*stage->m_b0) + std::sqrt(std::abs(zeros_discr))/(2*stage->m_b0)*std::sqrt(std::abs(zeros_discr))/(2*stage->m_b0) ) << "\n"; + } + os << "poles discriminant = " << poles_discr << "\n"; + if(poles_discr>=0) + { + os << "poles = " << (-stage->m_a1 + std::sqrt(poles_discr))/(2*stage->m_a0) << " et " << (-stage->m_a1 - std::sqrt(poles_discr))/(2*stage->m_a0) << "\n"; + } + else + { + os << "poles = " << (-stage->m_a1)/(2*stage->m_a0) << "+/-i" << std::sqrt(std::abs(poles_discr))/(2*stage->m_a0) << "\n" + << "poles abs = " << std::sqrt( (-stage->m_a1)/(2*stage->m_a0)*(-stage->m_a1)/(2*stage->m_a0) + std::sqrt(std::abs(poles_discr))/(2*stage->m_a0)*std::sqrt(std::abs(poles_discr))/(2*stage->m_a0) ) << "\n"; + } + std::cout << os.str(); + } + */ + +} diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/CascadeSynthesisH.inl b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/CascadeSynthesisH.inl new file mode 100644 index 0000000..a107a5a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/CascadeSynthesisH.inl @@ -0,0 +1,18 @@ + + // Process a block of samples in the given form + template + void processSynthesis (int nSamples, Sample* dest, StateType& state) const + { + while (--nSamples >= 0) + { + *dest = state.processSynthesis (*dest, *this); + dest++; + } + } + +void setLayoutSynthesis (const LayoutBase& proto); + +void setupSynthesis (int order, + double sampleRate, + double centerFrequency, + double widthFrequency) { assert(false); } diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ChebyshevI.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ChebyshevI.cpp new file mode 100644 index 0000000..413dbff --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ChebyshevI.cpp @@ -0,0 +1,190 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#include "Common.h" +#include "ChebyshevI.h" + +namespace Dsp +{ + namespace ChebyshevI + { + AnalogLowPass::AnalogLowPass() : m_numPoles(-1) {} + + void AnalogLowPass::design(int numPoles, double rippleDb) + { + if (m_numPoles != numPoles || m_rippleDb != rippleDb) + { + m_numPoles = numPoles; + m_rippleDb = rippleDb; + + reset(); + + const double eps = std::sqrt(1. / std::exp(-rippleDb * 0.1 * doubleLn10) - 1); + const double v0 = asinh(1 / eps) / numPoles; + const double sinh_v0 = -sinh(v0); + const double cosh_v0 = cosh(v0); + + const double n2 = 2 * numPoles; + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + const int k = 2 * i + 1 - numPoles; + double a = sinh_v0 * cos(k * doublePi / n2); + double b = cosh_v0 * sin(k * doublePi / n2); + + //addPoleZero (complex_t (a, b), infinity()); + //addPoleZero (complex_t (a, -b), infinity()); + addPoleZeroConjugatePairs(complex_t(a, b), infinity()); + } + + if (numPoles & 1) + { + add(complex_t(sinh_v0, 0), infinity()); + setNormal(0, 1); + } + else { setNormal(0, pow(10, -rippleDb / 20.)); } + } + } + + //------------------------------------------------------------------------------ + + // + // Chebyshev Type I low pass shelf prototype + // From "High-Order Digital Parametric Equalizer Design" + // Sophocles J. Orfanidis + // http://www.ece.rutgers.edu/~orfanidi/ece521/hpeq.pdf + // + + AnalogLowShelf::AnalogLowShelf() { setNormal(doublePi, 1); } + + void AnalogLowShelf::design(int numPoles, double gainDb, double rippleDb) + { + if (m_numPoles != numPoles || m_rippleDb != rippleDb || m_gainDb != gainDb) + { + m_numPoles = numPoles; + m_rippleDb = rippleDb; + m_gainDb = gainDb; + + reset(); + + gainDb = -gainDb; + + if (rippleDb >= fabs(gainDb)) { rippleDb = fabs(gainDb); } + if (gainDb < 0) { rippleDb = -rippleDb; } + + const double G = std::pow(10., gainDb / 20.0); + const double Gb = std::pow(10., (gainDb - rippleDb) / 20.0); + const double G0 = 1; + const double g0 = pow(G0, 1. / numPoles); + + double eps; + if (Gb != G0) { eps = sqrt((G * G - Gb * Gb) / (Gb * Gb - G0 * G0)); } + else { eps = G - 1; } // This is surely wrong + + const double b = pow(G / eps + Gb * sqrt(1 + 1 / (eps * eps)), 1. / numPoles); + const double u = log(b / g0); + const double v = log(pow(1. / eps + sqrt(1 + 1 / (eps * eps)), 1. / numPoles)); + + const double sinh_u = sinh(u); + const double sinh_v = sinh(v); + const double cosh_u = cosh(u); + const double cosh_v = cosh(v); + const double n2 = 2 * numPoles; + const int pairs = numPoles / 2; + for (int i = 1; i <= pairs; ++i) + { + const double a = doublePi * (2 * i - 1) / n2; + const double sn = sin(a); + const double cs = cos(a); + addPoleZeroConjugatePairs(complex_t(-sn * sinh_u, cs * cosh_u), complex_t(-sn * sinh_v, cs * cosh_v)); + } + + if (numPoles & 1) { add(-sinh_u, -sinh_v); } + } + } + + //------------------------------------------------------------------------------ + + void LowPassBase::setup(int order, double sampleRate, double cutoffFrequency, double rippleDb) + { + m_analogProto.design(order, rippleDb); + LowPassTransform(cutoffFrequency / sampleRate, m_digitalProto, m_analogProto); + setLayout(m_digitalProto); + } + + void HighPassBase::setup(int order, double sampleRate, double cutoffFrequency, double rippleDb) + { + m_analogProto.design(order, rippleDb); + HighPassTransform(cutoffFrequency / sampleRate, m_digitalProto, m_analogProto); + setLayout(m_digitalProto); + } + + void BandPassBase::setup(int order, double sampleRate, double centerFrequency, double widthFrequency, double rippleDb) + { + m_analogProto.design(order, rippleDb); + BandPassTransform(centerFrequency / sampleRate, widthFrequency / sampleRate, m_digitalProto, m_analogProto); + setLayout(m_digitalProto); + } + + void BandStopBase::setup(int order, double sampleRate, double centerFrequency, double widthFrequency, double rippleDb) + { + m_analogProto.design(order, rippleDb); + BandStopTransform(centerFrequency / sampleRate, widthFrequency / sampleRate, m_digitalProto, m_analogProto); + setLayout(m_digitalProto); + } + + void LowShelfBase::setup(int order, double sampleRate, double cutoffFrequency, double gainDb, double rippleDb) + { + m_analogProto.design(order, gainDb, rippleDb); + LowPassTransform(cutoffFrequency / sampleRate, m_digitalProto, m_analogProto); + setLayout(m_digitalProto); + } + + void HighShelfBase::setup(int order, double sampleRate, double cutoffFrequency, double gainDb, double rippleDb) + { + m_analogProto.design(order, gainDb, rippleDb); + HighPassTransform(cutoffFrequency / sampleRate, m_digitalProto, m_analogProto); + setLayout(m_digitalProto); + } + + void BandShelfBase::setup(int order, double sampleRate, double centerFrequency, double widthFrequency, double gainDb, double rippleDb) + { + m_analogProto.design(order, gainDb, rippleDb); + BandPassTransform(centerFrequency / sampleRate, widthFrequency / sampleRate, m_digitalProto, m_analogProto); + m_digitalProto.setNormal(((centerFrequency / sampleRate) < 0.25) ? doublePi : 0, 1); + setLayout(m_digitalProto); + } + } // namespace ChebyshevI +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ChebyshevI.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ChebyshevI.h new file mode 100644 index 0000000..595890e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ChebyshevI.h @@ -0,0 +1,316 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ +#pragma once + +#include "Common.h" +#include "Cascade.h" +#include "Design.h" +#include "Filter.h" +#include "PoleFilter.h" + +namespace Dsp +{ + + /* + * Filters with Chebyshev response characteristics + * + */ + + namespace ChebyshevI + { + + // Half-band analog prototypes (s-plane) + + class AnalogLowPass : public LayoutBase + { + public: + AnalogLowPass(); + + void design(int numPoles, double rippleDb); + + private: + int m_numPoles = 0; + double m_rippleDb = 0; + }; + + //------------------------------------------------------------------------------ + + class AnalogLowShelf : public LayoutBase + { + public: + AnalogLowShelf(); + + void design(int numPoles, double gainDb, double rippleDb); + + private: + int m_numPoles = 0; + double m_rippleDb = 0; + double m_gainDb = 0; + }; + + //------------------------------------------------------------------------------ + + // Factored implementations to reduce template instantiations + + struct LowPassBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency, double rippleDb); + }; + + struct HighPassBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency, double rippleDb); + }; + + struct BandPassBase : PoleFilterBase + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency, double rippleDb); + }; + + struct BandStopBase : PoleFilterBase + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency, double rippleDb); + }; + + struct LowShelfBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency, double gainDb, double rippleDb); + }; + + struct HighShelfBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency, double gainDb, double rippleDb); + }; + + struct BandShelfBase : PoleFilterBase + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency, double gainDb, double rippleDb); + }; + + //------------------------------------------------------------------------------ + + // + // Raw filters + // + + template + struct LowPass : PoleFilter {}; + + template + struct HighPass : PoleFilter {}; + + template + struct BandPass : PoleFilter {}; + + template + struct BandStop : PoleFilter {}; + + template + struct LowShelf : PoleFilter {}; + + template + struct HighShelf : PoleFilter {}; + + template + struct BandShelf : PoleFilter {}; + + //------------------------------------------------------------------------------ + + // + // Gui-friendly Design layer + // + + namespace Design + { + struct TypeIBase : DesignBase + { + enum + { + NumParams = 4 + }; + + static int getNumParams() { return 4; } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCutoffFrequencyParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultRippleDbParam(); } + }; + + template + struct TypeI : TypeIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3]); } + }; + + struct TypeIIBase : DesignBase + { + enum + { + NumParams = 5 + }; + + static int getNumParams() { return 5; } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCenterFrequencyParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultBandwidthHzParam(); } + static ParamInfo getParamInfo_4() { return ParamInfo::defaultRippleDbParam(); } + }; + + template + struct TypeII : TypeIIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4]); } + }; + + struct TypeIIIBase : DesignBase + { + enum + { + NumParams = 5 + }; + + static int getNumParams() { return 5; } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCutoffFrequencyParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultGainParam(); } + static ParamInfo getParamInfo_4() { return ParamInfo::defaultRippleDbParam(); } + }; + + template + struct TypeIII : TypeIIIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4]); } + }; + + struct TypeIVBase : DesignBase + { + enum + { + NumParams = 6 + }; + + static int getNumParams() { return 6; } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCenterFrequencyParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultBandwidthHzParam(); } + static ParamInfo getParamInfo_4() { return ParamInfo::defaultGainParam(); } + static ParamInfo getParamInfo_5() { return ParamInfo::defaultRippleDbParam(); } + }; + + template + struct TypeIV : TypeIVBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4], params[5]); } + }; + + // Factored kind and name + + struct LowPassDescription + { + static Kind getKind() { return kindLowPass; } + static const char* getName() { return "Chebyshev I Low Pass"; } + }; + + struct HighPassDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Chebyshev I High Pass"; } + }; + + struct BandPassDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Chebyshev I Band Pass"; } + }; + + struct BandStopDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Chebyshev I Band Stop"; } + }; + + struct LowShelfDescription + { + static Kind getKind() { return kindLowShelf; } + static const char* getName() { return "Chebyshev I Low Shelf"; } + }; + + struct HighShelfDescription + { + static Kind getKind() { return kindHighShelf; } + static const char* getName() { return "Chebyshev I High Shelf"; } + }; + + struct BandShelfDescription + { + static Kind getKind() { return kindBandShelf; } + static const char* getName() { return "Chebyshev I Band Shelf"; } + }; + + // This glues on the Order parameter + template class TypeClass, template class FilterClass> + struct OrderBase : TypeClass> + { + ParamInfo getParamInfo_1() const + { + return ParamInfo(idOrder, "Order", "Order", 1, MaxOrder, 2, &ParamInfo::Int_toControlValue, &ParamInfo::Int_toNativeValue, + &ParamInfo::Int_toString); + } + }; + + //------------------------------------------------------------------------------ + + // + // Design filters + // + + template + struct LowPass : OrderBase, LowPassDescription {}; + + template + struct HighPass : OrderBase, HighPassDescription {}; + + template + struct BandPass : OrderBase, BandPassDescription {}; + + template + struct BandStop : OrderBase, BandStopDescription {}; + + template + struct LowShelf : OrderBase, LowShelfDescription {}; + + template + struct HighShelf : OrderBase, HighShelfDescription {}; + + template + struct BandShelf : OrderBase, BandShelfDescription {}; + } // namespace Design + } // namespace ChebyshevI +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ChebyshevII.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ChebyshevII.cpp new file mode 100644 index 0000000..50ca787 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ChebyshevII.cpp @@ -0,0 +1,187 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#include "Common.h" +#include "ChebyshevII.h" + +namespace Dsp +{ + namespace ChebyshevII + { + + // "Chebyshev Filter Properties" + // http://cnx.org/content/m16906/latest/ + + AnalogLowPass::AnalogLowPass() : m_numPoles(-1) { setNormal(0, 1); } + + void AnalogLowPass::design(int numPoles, double stopBandDb) + { + if (m_numPoles != numPoles || m_stopBandDb != stopBandDb) + { + m_numPoles = numPoles; + m_stopBandDb = stopBandDb; + + reset(); + + const double eps = std::sqrt(1. / (std::exp(stopBandDb * 0.1 * doubleLn10) - 1)); + const double v0 = asinh(1 / eps) / numPoles; + const double sinh_v0 = -sinh(v0); + const double cosh_v0 = cosh(v0); + const double fn = doublePi / (2 * numPoles); + + int k = 1; + for (int i = numPoles / 2; --i >= 0; k += 2) + { + const double a = sinh_v0 * cos((k - numPoles) * fn); + const double b = cosh_v0 * sin((k - numPoles) * fn); + const double d2 = a * a + b * b; + const double im = 1 / cos(k * fn); + addPoleZeroConjugatePairs(complex_t(a / d2, b / d2), complex_t(0, im)); + } + + if (numPoles & 1) { add(1 / sinh_v0, infinity()); } + } + } + + //------------------------------------------------------------------------------ + + // + // Chebyshev Type I low pass shelf prototype + // From "High-Order Digital Parametric Equalizer Design" + // Sophocles J. Orfanidis + // http://www.ece.rutgers.edu/~orfanidi/ece521/hpeq.pdf + // + + AnalogLowShelf::AnalogLowShelf() : m_numPoles(-1) { setNormal(doublePi, 1); } + + void AnalogLowShelf::design(int numPoles, double gainDb, double stopBandDb) + { + if (m_numPoles != numPoles || m_stopBandDb != stopBandDb || m_gainDb != gainDb) + { + m_numPoles = numPoles; + m_stopBandDb = stopBandDb; + m_gainDb = gainDb; + + reset(); + + gainDb = -gainDb; + + if (stopBandDb >= fabs(gainDb)) { stopBandDb = fabs(gainDb); } + if (gainDb < 0) { stopBandDb = -stopBandDb; } + + const double G = std::pow(10., gainDb / 20.0); + const double Gb = std::pow(10., (gainDb - stopBandDb) / 20.0); + const double G0 = 1; + const double g0 = pow(G0, 1. / numPoles); + + double eps; + if (Gb != G0) { eps = sqrt((G * G - Gb * Gb) / (Gb * Gb - G0 * G0)); } + else { eps = G - 1; } // This is surely wrong + + const double b = pow(G / eps + Gb * sqrt(1 + 1 / (eps * eps)), 1. / numPoles); + const double u = log(b / g0); + const double v = log(pow(1. / eps + sqrt(1 + 1 / (eps * eps)), 1. / numPoles)); + + const double sinh_u = sinh(u); + const double sinh_v = sinh(v); + const double cosh_u = cosh(u); + const double cosh_v = cosh(v); + const double n2 = 2 * numPoles; + const int pairs = numPoles / 2; + for (int i = 1; i <= pairs; ++i) + { + const double a = doublePi * (2 * i - 1) / n2; + const double sn = sin(a); + const double cs = cos(a); + addPoleZeroConjugatePairs(complex_t(-sn * sinh_u, cs * cosh_u), complex_t(-sn * sinh_v, cs * cosh_v)); + } + + if (numPoles & 1) { add(-sinh_u, -sinh_v); } + } + } + + //------------------------------------------------------------------------------ + + void LowPassBase::setup(int order, double sampleRate, double cutoffFrequency, double stopBandDb) + { + m_analogProto.design(order, stopBandDb); + LowPassTransform(cutoffFrequency / sampleRate, m_digitalProto, m_analogProto); + setLayout(m_digitalProto); + } + + void HighPassBase::setup(int order, double sampleRate, double cutoffFrequency, double stopBandDb) + { + m_analogProto.design(order, stopBandDb); + HighPassTransform(cutoffFrequency / sampleRate, m_digitalProto, m_analogProto); + setLayout(m_digitalProto); + } + + void BandPassBase::setup(int order, double sampleRate, double centerFrequency, double widthFrequency, double stopBandDb) + { + m_analogProto.design(order, stopBandDb); + BandPassTransform(centerFrequency / sampleRate, widthFrequency / sampleRate, m_digitalProto, m_analogProto); + setLayout(m_digitalProto); + } + + void BandStopBase::setup(int order, double sampleRate, double centerFrequency, double widthFrequency, double stopBandDb) + { + m_analogProto.design(order, stopBandDb); + BandStopTransform(centerFrequency / sampleRate, widthFrequency / sampleRate, m_digitalProto, m_analogProto); + setLayout(m_digitalProto); + } + + void LowShelfBase::setup(int order, double sampleRate, double cutoffFrequency, double gainDb, double stopBandDb) + { + m_analogProto.design(order, gainDb, stopBandDb); + LowPassTransform(cutoffFrequency / sampleRate, m_digitalProto, m_analogProto); + setLayout(m_digitalProto); + } + + void HighShelfBase::setup(int order, double sampleRate, double cutoffFrequency, double gainDb, double stopBandDb) + { + m_analogProto.design(order, gainDb, stopBandDb); + HighPassTransform(cutoffFrequency / sampleRate, m_digitalProto, m_analogProto); + setLayout(m_digitalProto); + } + + void BandShelfBase::setup(int order, double sampleRate, double centerFrequency, double widthFrequency, double gainDb, double stopBandDb) + { + m_analogProto.design(order, gainDb, stopBandDb); + BandPassTransform(centerFrequency / sampleRate, widthFrequency / sampleRate, m_digitalProto, m_analogProto); + m_digitalProto.setNormal(((centerFrequency / sampleRate) < 0.25) ? doublePi : 0, 1); + setLayout(m_digitalProto); + } + } // namespace ChebyshevII +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ChebyshevII.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ChebyshevII.h new file mode 100644 index 0000000..d8eecbd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/ChebyshevII.h @@ -0,0 +1,317 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ +#pragma once + +#include "Common.h" +#include "Cascade.h" +#include "Design.h" +#include "Filter.h" +#include "PoleFilter.h" + +namespace Dsp +{ + + /* + * Filters with Inverse Chebyshev response characteristics + * + */ + + namespace ChebyshevII + { + + // Half-band analog prototypes (s-plane) + + class AnalogLowPass : public LayoutBase + { + public: + AnalogLowPass(); + + void design(int numPoles, double stopBandDb); + + private: + int m_numPoles = 0; + double m_stopBandDb = 0; + }; + + //------------------------------------------------------------------------------ + + class AnalogLowShelf : public LayoutBase + { + public: + AnalogLowShelf(); + + void design(int numPoles, double gainDb, double stopBandDb); + + private: + int m_numPoles = 0; + double m_stopBandDb = 0; + double m_gainDb = 0; + }; + + //------------------------------------------------------------------------------ + + // Factored implementations to reduce template instantiations + + struct LowPassBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency, double stopBandDb); + }; + + struct HighPassBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency, double stopBandDb); + }; + + struct BandPassBase : PoleFilterBase + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency, double stopBandDb); + }; + + struct BandStopBase : PoleFilterBase + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency, double stopBandDb); + }; + + struct LowShelfBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency, double gainDb, double stopBandDb); + }; + + struct HighShelfBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency, double gainDb, double stopBandDb); + }; + + struct BandShelfBase : PoleFilterBase + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency, double gainDb, double stopBandDb); + }; + + //------------------------------------------------------------------------------ + + // + // Raw filters + // + + template + struct LowPass : PoleFilter {}; + + template + struct HighPass : PoleFilter {}; + + template + struct BandPass : PoleFilter {}; + + template + struct BandStop : PoleFilter {}; + + template + struct LowShelf : PoleFilter {}; + + template + struct HighShelf : PoleFilter {}; + + template + struct BandShelf : PoleFilter {}; + + //------------------------------------------------------------------------------ + + // + // Gui-friendly Design layer + // + + namespace Design + { + struct TypeIBase : DesignBase + { + enum + { + NumParams = 4 + }; + + static int getNumParams() { return 4; } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCutoffFrequencyParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultStopDbParam(); } + }; + + template + struct TypeI : TypeIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3]); } + }; + + struct TypeIIBase : DesignBase + { + enum + { + NumParams = 5 + }; + + static int getNumParams() { return 5; } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCenterFrequencyParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultBandwidthHzParam(); } + static ParamInfo getParamInfo_4() { return ParamInfo::defaultStopDbParam(); } + }; + + template + struct TypeII : TypeIIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4]); } + }; + + struct TypeIIIBase : DesignBase + { + enum + { + NumParams = 5 + }; + + static int getNumParams() { return 5; } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCutoffFrequencyParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultGainParam(); } + static ParamInfo getParamInfo_4() { return ParamInfo::defaultStopDbParam(); } + }; + + template + struct TypeIII : TypeIIIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4]); } + }; + + struct TypeIVBase : DesignBase + { + enum + { + NumParams = 6 + }; + + static int getNumParams() { return 6; } + + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCenterFrequencyParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultBandwidthHzParam(); } + static ParamInfo getParamInfo_4() { return ParamInfo::defaultGainParam(); } + static ParamInfo getParamInfo_5() { return ParamInfo::defaultStopDbParam(); } + }; + + template + struct TypeIV : TypeIVBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4], params[5]); } + }; + + // Factored kind and name + + struct LowPassDescription + { + static Kind getKind() { return kindLowPass; } + static const char* getName() { return "Chebyshev II Low Pass"; } + }; + + struct HighPassDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Chebyshev II High Pass"; } + }; + + struct BandPassDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Chebyshev II Band Pass"; } + }; + + struct BandStopDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Chebyshev II Band Stop"; } + }; + + struct LowShelfDescription + { + static Kind getKind() { return kindLowShelf; } + static const char* getName() { return "Chebyshev II Low Shelf"; } + }; + + struct HighShelfDescription + { + static Kind getKind() { return kindHighShelf; } + static const char* getName() { return "Chebyshev II High Shelf"; } + }; + + struct BandShelfDescription + { + static Kind getKind() { return kindBandShelf; } + static const char* getName() { return "Chebyshev II Band Shelf"; } + }; + + // This glues on the Order parameter + template class TypeClass, template class FilterClass> + struct OrderBase : TypeClass> + { + ParamInfo getParamInfo_1() const + { + return ParamInfo(idOrder, "Order", "Order", 1, MaxOrder, 2, &ParamInfo::Int_toControlValue, &ParamInfo::Int_toNativeValue, + &ParamInfo::Int_toString); + } + }; + + //------------------------------------------------------------------------------ + + // + // Design Filters + // + + template + struct LowPass : OrderBase, LowPassDescription {}; + + template + struct HighPass : OrderBase, HighPassDescription {}; + + template + struct BandPass : OrderBase, BandPassDescription {}; + + template + struct BandStop : OrderBase, BandStopDescription {}; + + template + struct LowShelf : OrderBase, LowShelfDescription {}; + + template + struct HighShelf : OrderBase, HighShelfDescription {}; + + template + struct BandShelf : OrderBase, BandShelfDescription {}; + } // namespace Design + } // namespace ChebyshevII +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Common.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Common.h new file mode 100644 index 0000000..8786b66 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Common.h @@ -0,0 +1,67 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#ifndef DSPFILTERS_COMMON_H +#define DSPFILTERS_COMMON_H + +// +// This must be the first file included in every DspFilters header and source +// + +#ifdef _MSC_VER +# pragma warning (disable: 4100) +#endif + +//#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _MSC_VER +namespace tr1 = std::tr1; +#else +namespace tr1 = std; +#endif + + +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Custom.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Custom.cpp new file mode 100644 index 0000000..26d6f45 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Custom.cpp @@ -0,0 +1,64 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#include "Common.h" +#include "Custom.h" + +namespace Dsp +{ + namespace Custom + { + void OnePole::setup(double scale, + double pole, + double zero) + { + setOnePole(pole, zero); + applyScale(scale); + } + + void TwoPole::setup(double scale, + double poleRho, + double poleTheta, + double zeroRho, + double zeroTheta) + { + complex_t pole = std::polar(poleRho, poleTheta); + complex_t zero = std::polar(zeroRho, zeroTheta); + + setTwoPole(pole, zero, std::conj(pole), std::conj(zero)); + applyScale(scale); + } + } // namespace Custom +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Custom.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Custom.h new file mode 100644 index 0000000..87bd7a3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Custom.h @@ -0,0 +1,111 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ +#pragma once + +#include "Common.h" +#include "Biquad.h" +#include "Design.h" +#include "Filter.h" + +namespace Dsp +{ + + /* + * Single pole and Biquad with parameters allowing + * for directly setting the poles and zeros + * + */ + + namespace Custom + { + + // + // Raw filters + // + + struct OnePole : Biquad + { + void setup(double scale, double pole, double zero); + }; + + struct TwoPole : Biquad + { + void setup(double scale, double poleRho, double poleTheta, double zeroRho, double zeroTheta); + }; + + //------------------------------------------------------------------------------ + + // + // Gui-friendly Design layer + // + + namespace Design + { + struct OnePole : DesignBase, Custom::OnePole + { + enum + { + NumParams = 4 + }; + + static int getNumParams() { return 4; } + static ParamInfo getParamInfo_1() { return ParamInfo::defaultGainParam(); } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultPoleRealParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultZeroRealParam(); } + static Kind getKind() { return kindOther; } + static const char* getName() { return "Custom One-Pole"; } + void setParams(const Params& params) { setup(pow(10., params[1] / 20), params[2], params[3]); } + }; + + struct TwoPole : DesignBase, Custom::TwoPole + { + enum + { + NumParams = 6 + }; + + static int getNumParams() { return 6; } + static ParamInfo getParamInfo_1() { return ParamInfo::defaultGainParam(); } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultPoleRhoParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultPoleThetaParam(); } + static ParamInfo getParamInfo_4() { return ParamInfo::defaultZeroRhoParam(); } + static ParamInfo getParamInfo_5() { return ParamInfo::defaultZeroThetaParam(); } + static Kind getKind() { return kindOther; } + static const char* getName() { return "Custom Two-Pole"; } + void setParams(const Params& params) { setup(pow(10., params[1] / 20), params[2], params[3], params[4], params[5]); } + }; + } // namespace Design + } // namespace Custom +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Design.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Design.cpp new file mode 100644 index 0000000..c9b91e4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Design.cpp @@ -0,0 +1,39 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#include "Common.h" +#include "Design.h" + +namespace Dsp {} diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Design.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Design.h new file mode 100644 index 0000000..3bbeb90 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Design.h @@ -0,0 +1,58 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ +#pragma once + +#include "Common.h" +#include "Params.h" + +namespace Dsp +{ + struct DesignBase + { +#include "DesignSynthesisH.inl" + + // Sampling rate is the first param for every Design filter + static ParamInfo getParamInfo_0() { return ParamInfo::defaultSampleRateParam(); } + + // These should never get called + static ParamInfo getParamInfo_1() { return ParamInfo(); } + static ParamInfo getParamInfo_2() { return ParamInfo(); } + static ParamInfo getParamInfo_3() { return ParamInfo(); } + static ParamInfo getParamInfo_4() { return ParamInfo(); } + static ParamInfo getParamInfo_5() { return ParamInfo(); } + static ParamInfo getParamInfo_6() { return ParamInfo(); } + static ParamInfo getParamInfo_7() { return ParamInfo(); } + }; +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/DesignSynthesisH.inl b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/DesignSynthesisH.inl new file mode 100644 index 0000000..b391b03 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/DesignSynthesisH.inl @@ -0,0 +1,2 @@ + + void setParamsSynthesis (const Params& parameters) { assert(false); } diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Dsp.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Dsp.h new file mode 100644 index 0000000..4eb4e40 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Dsp.h @@ -0,0 +1,62 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#ifndef DSPFILTERS_DSP_H +#define DSPFILTERS_DSP_H + +// +// Include this file in your application to get everything +// + +#include "Common.h" + +#include "Biquad.h" +#include "Cascade.h" +#include "Filter.h" +#include "PoleFilter.h" +#include "SmoothedFilter.h" +#include "State.h" +#include "Utilities.h" + +#include "Bessel.h" +#include "Butterworth.h" +#include "ChebyshevI.h" +#include "ChebyshevII.h" +#include "Custom.h" +#include "Elliptic.h" +#include "Legendre.h" +#include "RBJ.h" + +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Elliptic.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Elliptic.cpp new file mode 100644 index 0000000..402e10f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Elliptic.cpp @@ -0,0 +1,352 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#include "Common.h" +#include "Elliptic.h" + +namespace Dsp +{ + namespace Elliptic + { + + // shit ton of math in here + + // approximation to complete elliptic integral of the first kind. + // fast convergence, peak error less than 2e-16. + double Solver::ellipticK(double k) + { + double m = k * k; + double a = 1; + double b = sqrt(1 - m); + double c = a - b; + double co; + do + { + co = c; + c = (a - b) / 2; + double ao = (a + b) / 2; + b = sqrt(a * b); + a = ao; + } while (c < co); + + return doublePi / (a + a); + } + + //------------------------------------------------------------------------------ + + AnalogLowPass::AnalogLowPass() + : m_numPoles(-1) { setNormal(0, 1); } + + void AnalogLowPass::design(int numPoles, + double rippleDb, + double rolloff) + { + if (m_numPoles != numPoles || + m_rippleDb != rippleDb || + m_rolloff != rolloff) + { + m_numPoles = numPoles; + m_rippleDb = rippleDb; + m_rolloff = rolloff; + + reset(); + + // calculate + //const double ep = rippleDb; // passband ripple + + const int n = numPoles; + + double e2 = pow(10., rippleDb / 10) - 1; + //double xi = rolloff + 1; + double xi = 5 * exp(rolloff - 1) + 1; + + m_K = Solver::ellipticK(1 / xi); + m_Kprime = Solver::ellipticK(sqrt(1 - 1 / (xi * xi))); + + int ni = ((n & 1) == 1) ? 0 : 1; + int i; + double f[100]; // HACK!!! + for (i = 1; i <= n / 2; ++i) + { + double u = (2 * i - ni) * m_K / n; + double sn = calcsn(u); + sn *= 2 * doublePi / m_K; + f[i] = m_zeros[i - 1] = 1 / sn; + } + m_zeros[n / 2] = std::numeric_limits::infinity(); + double fb = 1 / (2 * doublePi); + m_nin = n % 2; + m_n2 = n / 2; + for (i = 1; i <= m_n2; ++i) + { + double x = f[m_n2 + 1 - i]; + m_z1[i] = sqrt(1 - 1 / (x * x)); + } + double ee = e2;//pow(10., rippleDb/20)-1; + m_e = sqrt(ee); + double fbb = fb * fb; + m_m = m_nin + 2 * m_n2; + m_em = 2 * (m_m / 2); + double tp = 2 * doublePi; + calcfz(); + calcqz(); + if (m_m > m_em) { m_c1[2 * m_m] = 0; } + for (i = 0; i <= 2 * m_m; i += 2) { m_a1[m_m - i / 2] = m_c1[i] + m_d1[i]; } + double a0 = findfact(m_m); + int r = 0; + while (r < m_em / 2) + { + r++; + m_p[r] /= 10; + m_q1[r] /= 100; + double d = 1 + m_p[r] + m_q1[r]; + m_b1[r] = (1 + m_p[r] / 2) * fbb / d; + m_zf1[r] = fb / pow(d, .25); + m_zq1[r] = 1 / sqrt(fabs(2 * (1 - m_b1[r] / (m_zf1[r] * m_zf1[r])))); + m_zw1[r] = tp * m_zf1[r]; + + m_rootR[r] = -.5 * m_zw1[r] / m_zq1[r]; + m_rootR[r + m_em / 2] = m_rootR[r]; + m_rootI[r] = .5 * sqrt(fabs(m_zw1[r] * m_zw1[r] / (m_zq1[r] * m_zq1[r]) - 4 * m_zw1[r] * m_zw1[r])); + m_rootI[r + m_em / 2] = -m_rootI[r]; + + complex_t pole(-.5 * m_zw1[r] / m_zq1[r], .5 * sqrt(fabs(m_zw1[r] * m_zw1[r] / (m_zq1[r] * m_zq1[r]) - 4 * m_zw1[r] * m_zw1[r]))); + + complex_t zero(0, m_zeros[r - 1]); + + addPoleZeroConjugatePairs(pole, zero); + } + + if (a0 != 0) + { + m_rootR[r + 1 + m_em / 2] = -sqrt(fbb / (.1 * a0 - 1)) * tp; + m_rootI[r + 1 + m_em / 2] = 0; + + add(-sqrt(fbb / (.1 * a0 - 1)) * tp, infinity()); + } + + setNormal(0, (numPoles & 1) ? 1. : pow(10., -rippleDb / 20.0)); + } + } + + // generate the product of (z+s1[i]) for i = 1 .. sn and store it in b1[] + // (i.e. f[z] = b1[0] + b1[1] z + b1[2] z^2 + ... b1[sn] z^sn) + void AnalogLowPass::prodpoly(int sn) + { + m_b1[0] = m_s1[1]; + m_b1[1] = 1; + int i; + for (int j = 2; j <= sn; ++j) + { + m_a1[0] = m_s1[j] * m_b1[0]; + for (i = 1; i <= j - 1; ++i) { m_a1[i] = m_b1[i - 1] + m_s1[j] * m_b1[i]; } + for (i = 0; i != j; ++i) { m_b1[i] = m_a1[i]; } + m_b1[j] = 1; + } + } + + // determine f(z)^2 + void AnalogLowPass::calcfz2(int i) + { + int ji = 0; + int jf = 0; + if (i < m_em + 2) + { + ji = 0; + jf = i; + } + if (i > m_em) + { + ji = i - m_em; + jf = m_em; + } + m_c1[i] = 0; + for (int j = ji; j <= jf; j += 2) { m_c1[i] += m_a1[j] * (m_a1[i - j] * pow(10., m_m - i / 2)); } + } + + // calculate f(z) + void AnalogLowPass::calcfz() + { + int i = 1; + if (m_nin == 1) { m_s1[i++] = 1; } + for (; i <= m_nin + m_n2; ++i) { m_s1[i] = m_s1[i + m_n2] = m_z1[i - m_nin]; } + prodpoly(m_nin + 2 * m_n2); + for (i = 0; i <= m_em; i += 2) { m_a1[i] = m_e * m_b1[i]; } + for (i = 0; i <= 2 * m_em; i += 2) { calcfz2(i); } + } + + // determine q(z) + void AnalogLowPass::calcqz() + { + int i; + for (i = 1; i <= m_nin; ++i) { m_s1[i] = -10; } + for (; i <= m_nin + m_n2; ++i) { m_s1[i] = -10 * m_z1[i - m_nin] * m_z1[i - m_nin]; } + for (; i <= m_nin + 2 * m_n2; ++i) { m_s1[i] = m_s1[i - m_n2]; } + prodpoly(m_m); + int dd = ((m_nin & 1) == 1) ? -1 : 1; + for (i = 0; i <= 2 * m_m; i += 2) { m_d1[i] = dd * m_b1[i / 2]; } + } + + // compute factors + double AnalogLowPass::findfact(int t) + { + int i; + double a = 0; + for (i = 1; i <= t; ++i) { m_a1[i] /= m_a1[0]; } + m_a1[0] = m_b1[0] = m_c1[0] = 1; + int i1 = 0; + for (;;) + { + if (t <= 2) { break; } + double p0 = 0, q0 = 0; + i1++; + for (;;) + { + m_b1[1] = m_a1[1] - p0; + m_c1[1] = m_b1[1] - p0; + for (i = 2; i <= t; ++i) { m_b1[i] = m_a1[i] - p0 * m_b1[i - 1] - q0 * m_b1[i - 2]; } + for (i = 2; i < t; ++i) { m_c1[i] = m_b1[i] - p0 * m_c1[i - 1] - q0 * m_c1[i - 2]; } + int x1 = t - 1; + int x2 = t - 2; + int x3 = t - 3; + double x4 = m_c1[x2] * m_c1[x2] + m_c1[x3] * (m_b1[x1] - m_c1[x1]); + if (x4 == 0) { x4 = 1e-3; } + double ddp = (m_b1[x1] * m_c1[x2] - m_b1[t] * m_c1[x3]) / x4; + p0 += ddp; + double dq = (m_b1[t] * m_c1[x2] - m_b1[x1] * (m_c1[x1] - m_b1[x1])) / x4; + q0 += dq; + if (fabs(ddp + dq) < 1e-6) { break; } + } + m_p[i1] = p0; + m_q1[i1] = q0; + m_a1[1] = m_a1[1] - p0; + t -= 2; + for (i = 2; i <= t; ++i) { m_a1[i] -= p0 * m_a1[i - 1] + q0 * m_a1[i - 2]; } + if (t <= 2) { break; } + } + + if (t == 2) + { + i1++; + m_p[i1] = m_a1[1]; + m_q1[i1] = m_a1[2]; + } + if (t == 1) { a = -m_a1[1]; } + + return a; + } + + double AnalogLowPass::calcsn(double u) + { + double sn = 0; + // q = modular constant + double q = exp(-doublePi * m_Kprime / m_K); + double v = doublePi * .5 * u / m_K; + for (int j = 0; ; ++j) + { + double w = pow(q, j + .5); + sn += w * sin((2 * j + 1) * v) / (1 - w * w); + if (w < 1e-7) { break; } + } + return sn; + } + + //------------------------------------------------------------------------------ + + void LowPassBase::setup(int order, + double sampleRate, + double cutoffFrequency, + double rippleDb, + double rolloff) + { + m_analogProto.design(order, rippleDb, rolloff); + + LowPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + + void HighPassBase::setup(int order, + double sampleRate, + double cutoffFrequency, + double rippleDb, + double rolloff) + { + m_analogProto.design(order, rippleDb, rolloff); + + HighPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + + void BandPassBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double rippleDb, + double rolloff) + { + m_analogProto.design(order, rippleDb, rolloff); + + BandPassTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + + void BandStopBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + double rippleDb, + double rolloff) + { + m_analogProto.design(order, rippleDb, rolloff); + + BandStopTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + } // namespace Elliptic +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Elliptic.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Elliptic.h new file mode 100644 index 0000000..cfa8225 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Elliptic.h @@ -0,0 +1,267 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ +#pragma once + +#include "Common.h" +#include "Cascade.h" +#include "Design.h" +#include "Filter.h" +#include "PoleFilter.h" + +namespace Dsp +{ + + /* + * Filters with Elliptic response characteristics + * + */ + + namespace Elliptic + { + + // Solves for Jacobi elliptics + class Solver + { + public: + static double ellipticK(double k); + }; + + // Half-band analog prototype (s-plane) + + class AnalogLowPass : public LayoutBase + { + public: + AnalogLowPass(); + + void design(int numPoles, double rippleDb, double rolloff); + + private: + void prodpoly(int sn); + void calcfz2(int i); + void calcfz(); + void calcqz(); + double findfact(int t); + double calcsn(double u); + +#if 0 + template + struct CalcArray + { + double& operator[](size_t index) + { + assert( index + { + void setup(int order, double sampleRate, double cutoffFrequency, double rippleDb, double rolloff); + }; + + struct HighPassBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency, double rippleDb, double rolloff); + }; + + struct BandPassBase : PoleFilterBase + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency, double rippleDb, double rolloff); + }; + + struct BandStopBase : PoleFilterBase + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency, double rippleDb, double rolloff); + }; + + //------------------------------------------------------------------------------ + + // + // Raw filters + // + + template + struct LowPass : PoleFilter {}; + + template + struct HighPass : PoleFilter {}; + + template + struct BandPass : PoleFilter {}; + + template + struct BandStop : PoleFilter {}; + + //------------------------------------------------------------------------------ + + // + // Gui-friendly Design layer + // + + namespace Design + { + struct TypeIBase : DesignBase + { + enum + { + NumParams = 5 + }; + + static int getNumParams() { return 5; } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCutoffFrequencyParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultRippleDbParam(); } + static ParamInfo getParamInfo_4() { return ParamInfo::defaultRolloffParam(); } + }; + + template + struct TypeI : TypeIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4]); } + }; + + struct TypeIIBase : DesignBase + { + enum + { + NumParams = 6 + }; + + static int getNumParams() { return 6; } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCenterFrequencyParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultBandwidthHzParam(); } + static ParamInfo getParamInfo_4() { return ParamInfo::defaultRippleDbParam(); } + static ParamInfo getParamInfo_5() { return ParamInfo::defaultRolloffParam(); } + }; + + template + struct TypeII : TypeIIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3], params[4], params[5]); } + }; + + // Factored kind and name + + struct LowPassDescription + { + static Kind getKind() { return kindLowPass; } + static const char* getName() { return "Elliptic Low Pass"; } + }; + + struct HighPassDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Elliptic High Pass"; } + }; + + struct BandPassDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Elliptic Band Pass"; } + }; + + struct BandStopDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Elliptic Band Stop"; } + }; + + // This glues on the Order parameter + template class TypeClass, template class FilterClass> + struct OrderBase : TypeClass> + { + const ParamInfo getParamInfo_1() const + { + return ParamInfo(idOrder, "Order", "Order", 1, MaxOrder, 2, &ParamInfo::Int_toControlValue, &ParamInfo::Int_toNativeValue, + &ParamInfo::Int_toString); + } + }; + //------------------------------------------------------------------------------ + + // + // Design filters + // + + template + struct LowPass : OrderBase, LowPassDescription {}; + + template + struct HighPass : OrderBase, HighPassDescription {}; + + template + struct BandPass : OrderBase, BandPassDescription {}; + + template + struct BandStop : OrderBase, BandStopDescription {}; + } // namespace Design + } // namespace Elliptic +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Filter.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Filter.cpp new file mode 100644 index 0000000..605eac2 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Filter.cpp @@ -0,0 +1,113 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#include "Common.h" +#include "Filter.h" + +namespace Dsp +{ + Params Filter::getDefaultParams() const + { + Params params; + + params.clear(); + + for (int i = 0; i < getNumParams(); ++i) { params[i] = getParamInfo(i).getDefaultValue(); } + + return params; + } + + Filter::~Filter() {} + + int Filter::findParamId(int paramId) + { + int index = -1; + + for (int i = getNumParams(); --i >= 0;) + { + if (getParamInfo(i).getId() == paramId) + { + index = i; + break; + } + } + + return index; + } + + void Filter::setParamById(int paramId, double nativeValue) + { + for (int i = getNumParams(); --i >= 0;) + { + if (getParamInfo(i).getId() == paramId) + { + setParam(i, nativeValue); + return; + } + } + + assert(0); + } + + void Filter::copyParamsFrom(Filter const* other) + { + // first, set reasonable defaults + m_params = getDefaultParams(); + + if (other) + { + // now loop + for (int i = 0; i < getNumParams(); ++i) + { + const ParamInfo& paramInfo = getParamInfo(i); + + // find a match + for (int j = 0; j < other->getNumParams(); ++j) + { + const ParamInfo& otherParamInfo = other->getParamInfo(j); + + if (paramInfo.getId() == otherParamInfo.getId()) + { + // match! + m_params[i] = paramInfo.clamp(other->getParam(j)); + break; + } + } + } + } + + doSetParams(m_params); + } +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Filter.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Filter.h new file mode 100644 index 0000000..0086256 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Filter.h @@ -0,0 +1,219 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#ifndef DSPFILTERS_FILTER_H +#define DSPFILTERS_FILTER_H + +#include "Common.h" +#include "MathSupplement.h" +#include "Params.h" +#include "State.h" +#include "Types.h" + +namespace Dsp +{ + + /* + * Filter + * + * Full abstraction of a digital IIR filter. + * Supports run-time introspection and modulation of filter + * parameters. + * + */ + class Filter + { + public: + virtual ~Filter(); + + virtual Kind getKind() const = 0; + + virtual const std::string getName() const = 0; + + virtual int getNumParams() const = 0; + + virtual ParamInfo getParamInfo(int index) const = 0; + + Params getDefaultParams() const; + + const Params& getParams() const { return m_params; } + + double getParam(int paramIndex) const + { + assert(paramIndex >= 0 && paramIndex <= getNumParams()); + return m_params[paramIndex]; + } + + void setParam(int paramIndex, double nativeValue) + { + assert(paramIndex >= 0 && paramIndex <= getNumParams()); + m_params[paramIndex] = nativeValue; + doSetParams(m_params); + } + + int findParamId(int paramId); + + void setParamById(int paramId, double nativeValue); + + void setParams(const Params& parameters) + { + m_params = parameters; + doSetParams(parameters); + } + +#include "FilterSynthesisH.inl" + + // This makes a best-effort to pick up the values + // of matching parameters from another set. It uses + // the ParamID information to make the match. + void copyParamsFrom(Filter const* other); + + virtual std::vector getPoleZeros() const = 0; + + virtual complex_t response(double normalizedFrequency) const = 0; + + virtual int getNumChannels() = 0; + virtual void reset() = 0; + virtual void process(int nSamples, float* const* arrayOfChannels) = 0; + virtual void process(int nSamples, double* const* arrayOfChannels) = 0; + + protected: + virtual void doSetParams(const Params& parameters) = 0; + + private: + Params m_params; + }; + + //------------------------------------------------------------------------------ + + /* + * FilterDesign + * + * This container holds a filter Design (Gui-friendly layer) and + * optionally combines it with the necessary state information to + * process channel data. + * + */ + + // Factored to reduce template instantiations + template + class FilterDesignBase : public Filter + { + public: + Kind getKind() const override { return m_design.getKind(); } + + const std::string getName() const override { return m_design.getName(); } + + int getNumParams() const override { return DesignClass::NumParams; } + + Params getDefaultParams() const { return m_design.getDefaultParams(); } + + ParamInfo getParamInfo(int index) const override + { + switch (index) + { + case 0: return m_design.getParamInfo_0(); + case 1: return m_design.getParamInfo_1(); + case 2: return m_design.getParamInfo_2(); + case 3: return m_design.getParamInfo_3(); + case 4: return m_design.getParamInfo_4(); + case 5: return m_design.getParamInfo_5(); + case 6: return m_design.getParamInfo_6(); + case 7: return m_design.getParamInfo_7(); + default: return ParamInfo(); + } + } + + std::vector getPoleZeros() const override { return m_design.getPoleZeros(); } + + complex_t response(double normalizedFrequency) const override { return m_design.response(normalizedFrequency); } + + protected: + void doSetParams(const Params& parameters) override { m_design.setParams(parameters); } + +#include "FilterSynthesisH2.inl" + + DesignClass m_design; + }; + + + template + class FilterDesign : public FilterDesignBase + { + public: + FilterDesign() { } + + int getNumChannels() override { return Channels; } + void reset() override { m_state.reset(); } + + void process(int nSamples, float* const* arrayOfChannels) override + { + m_state.process(nSamples, arrayOfChannels, FilterDesignBase::m_design); + } + + void process(int nSamples, double* const* arrayOfChannels) override + { + m_state.process(nSamples, arrayOfChannels, FilterDesignBase::m_design); + } + + protected: + ChannelsState> m_state; + }; + + //------------------------------------------------------------------------------ + + /* + * This container combines a raw filter with state information + * so it can process channels. In order to set up the filter you + * must call a setup function directly. Smooth changes are + * not supported, but this class has a smaller footprint. + * + */ + template + class SimpleFilter : public FilterClass + { + public: + int getNumChannels() { return Channels; } + void reset() { m_state.reset(); } + + template + void process(int nSamples, Sample* const* arrayOfChannels) { m_state.process(nSamples, arrayOfChannels, *static_cast(this)); } + + protected: + ChannelsState> m_state; + }; +} // namespace Dsp + +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/FilterSynthesisH.inl b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/FilterSynthesisH.inl new file mode 100644 index 0000000..90f83dc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/FilterSynthesisH.inl @@ -0,0 +1,10 @@ + + void setParamsSynthesis (const Params& parameters) + { + m_params = parameters; + doSetParamsSynthesis (parameters); + } + + virtual void processSynthesis (int nSamples, double* const* arrayOfChannels) = 0; + + virtual void doSetParamsSynthesis (const Params& parameters) = 0; diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/FilterSynthesisH2.inl b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/FilterSynthesisH2.inl new file mode 100644 index 0000000..c2967f1 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/FilterSynthesisH2.inl @@ -0,0 +1,5 @@ + + void doSetParamsSynthesis (const Params& parameters) + { + m_design.setParamsSynthesis (parameters); + } diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Layout.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Layout.h new file mode 100644 index 0000000..ed2d167 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Layout.h @@ -0,0 +1,137 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#ifndef DSPFILTERS_LAYOUT_H +#define DSPFILTERS_LAYOUT_H + +#include "Common.h" +#include "MathSupplement.h" + +namespace Dsp +{ + + // + // Describes a filter as a collection of poles and zeros along with + // normalization information to achieve a specified gain at a specified + // frequency. The poles and zeros may lie either in the s or the z plane. + // + + // Base uses pointers to reduce template instantiations + class LayoutBase + { + public: + LayoutBase() { } + + LayoutBase(int maxPoles, PoleZeroPair* pairs) : m_maxPoles(maxPoles), m_pair(pairs) { } + + void setStorage(const LayoutBase& other) + { + m_numPoles = 0; + m_maxPoles = other.m_maxPoles; + m_pair = other.m_pair; + } + + void reset() { m_numPoles = 0; } + + int getNumPoles() const { return m_numPoles; } + + int getMaxPoles() const { return m_maxPoles; } + + void add(const complex_t& pole, const complex_t& zero) + { + assert(!(m_numPoles&1)); // single comes last + assert(!Dsp::is_nan (pole)); + m_pair[m_numPoles / 2] = PoleZeroPair(pole, zero); + ++m_numPoles; + } + + void addPoleZeroConjugatePairs(const complex_t pole, const complex_t zero) + { + assert(!(m_numPoles&1)); // single comes last + assert(!Dsp::is_nan (pole)); + m_pair[m_numPoles / 2] = PoleZeroPair(pole, zero, std::conj(pole), std::conj(zero)); + m_numPoles += 2; + } + + void add(const ComplexPair& poles, const ComplexPair& zeros) + { + assert(!(m_numPoles&1)); // single comes last + assert(poles.isMatchedPair ()); + assert(zeros.isMatchedPair ()); + m_pair[m_numPoles / 2] = PoleZeroPair(poles.first, zeros.first, poles.second, zeros.second); + m_numPoles += 2; + } + + const PoleZeroPair& getPair(int pairIndex) const + { + assert(pairIndex >= 0 && pairIndex < (m_numPoles+1)/2); + return m_pair[pairIndex]; + } + + const PoleZeroPair& operator[](int pairIndex) const { return getPair(pairIndex); } + + double getNormalW() const { return m_normalW; } + + double getNormalGain() const { return m_normalGain; } + + void setNormal(double w, double g) + { + m_normalW = w; + m_normalGain = g; + } + + private: + int m_numPoles = 0; + int m_maxPoles = 0; + PoleZeroPair* m_pair = nullptr; + double m_normalW = 0.0; + double m_normalGain = 0.0; + }; + + //------------------------------------------------------------------------------ + + // Storage for Layout + template + class Layout + { + public: + operator LayoutBase() { return LayoutBase(MaxPoles, m_pairs); } + + private: + PoleZeroPair m_pairs[(MaxPoles + 1) / 2]; + }; +} // namespace Dsp + +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Legendre.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Legendre.cpp new file mode 100644 index 0000000..d04fac4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Legendre.cpp @@ -0,0 +1,308 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#include "Common.h" +#include "Legendre.h" +#include "RootFinder.h" + +#include +#include +#include + +namespace Dsp +{ + namespace Legendre + { + static double m_sqrt2() { return 1.41421356237309504880; } + + // Optimum 'L' Filter algorithm. + // (C) 2004, C. Bond. + // + // Based on discussion in Kuo, "Network Analysis and Synthesis", + // pp. 379-383. Original method due to A.Papoulis."On Monotonic + // Response Filters", Proc. IRE, 47, Feb. 1959. + // + // Rewritten by Vinnie Falco to change the way temporary + // storage is allocated + // + + // + // This routine calculates the coefficients of the Legendre polynomial + // of the 1st kind. It uses a recursion relation. The first few polynomials + // are hard coded and the rest are found by recursion. + // + // (n+1)Pn+1 = (2n+1)xPn - nPn-1 Recursion relation. + // + void PolynomialFinderBase::legendre(double* p, int n) + { + int i, j; + + if (n == 0) + { + p[0] = 1.0; + return; + } + if (n == 1) + { + p[0] = 0.0; + p[1] = 1.0; + return; + } + p[0] = -0.5; + p[1] = 0.0; + p[2] = 1.5; + + if (n == 2) { return; } + + for (i = 0; i <= n; ++i) { m_aa[i] = m_bb[i] = 0.0; } + m_bb[1] = 1.0; + + for (i = 3; i <= n; ++i) + { + for (j = 0; j <= i; ++j) + { + m_aa[j] = m_bb[j]; + m_bb[j] = p[j]; + p[j] = 0.0; + } + for (j = i - 2; j >= 0; j -= 2) { p[j] -= (i - 1) * m_aa[j] / i; } + for (j = i - 1; j >= 0; j -= 2) { p[j + 1] += (2 * i - 1) * m_bb[j] / i; } + } + } + + // + // + // In the following routine n = 2k + 1 for odd 'n' and n = 2k + 2 for + // even 'n'. + // + // + // n k + // ----- + // 1 0 + // 2 0 + // 3 1 + // 4 1 + // 5 2 + // 6 2 + // + + void PolynomialFinderBase::solve(int n) + { + assert(n <= m_maxN); + + double c1; + int i, j; + + int k = (n - 1) / 2; + // + // form vector of 'a' constants + // + if (n & 1) + { // odd + for (i = 0; i <= k; ++i) { m_a[i] = (2.0 * i + 1.0) / (m_sqrt2() * (k + 1.0)); } + } // even + else + { + for (i = 0; i < k + 1; ++i) { m_a[i] = 0.0; } + if (k & 1) { for (i = 1; i <= k; i += 2) { m_a[i] = (2 * i + 1) / sqrt(double((k + 1) * (k + 2))); } } + else { for (i = 0; i <= k; i += 2) { m_a[i] = (2 * i + 1) / sqrt(double((k + 1) * (k + 2))); } } + } + for (i = 0; i <= n; ++i) + { + m_s[i] = 0.0; + m_w[i] = 0.0; + } + // + // form s[] = sum of a[i]*P[i] + // + m_s[0] = m_a[0]; + m_s[1] = m_a[1]; + for (i = 2; i <= k; ++i) + { + legendre(m_p, i); + for (j = 0; j <= i; ++j) { m_s[j] += m_a[i] * m_p[j]; } + } + // + // form v[] = square of s[] + // + for (i = 0; i <= 2 * k + 2; ++i) { m_v[i] = 0.0; } + for (i = 0; i <= k; ++i) { for (j = 0; j <= k; ++j) { m_v[i + j] += m_s[i] * m_s[j]; } } + // + // modify integrand for even 'n' + // + m_v[2 * k + 1] = 0.0; + if ((n & 1) == 0) { for (i = n; i >= 0; i--) { m_v[i + 1] += m_v[i]; } } + // + // form integral of v[] + // + for (i = n + 1; i >= 0; i--) { m_v[i + 1] = m_v[i] / double(i + 1.0); } + m_v[0] = 0.0; + // + // clear s[] for use in computing definite integral + // + for (i = 0; i < (n + 2); ++i) { m_s[i] = 0.0; } + m_s[0] = -1.0; + m_s[1] = 2.0; + // + // calculate definite integral + // + for (i = 1; i <= n; ++i) + { + if (i > 1) + { + double c0 = -m_s[0]; + for (j = 1; j < i + 1; ++j) + { + c1 = -m_s[j] + 2.0 * m_s[j - 1]; + m_s[j - 1] = c0; + c0 = c1; + } + c1 = 2.0 * m_s[i]; + m_s[i] = c0; + m_s[i + 1] = c1; + } + for (j = i; j > 0; j--) { m_w[j] += (m_v[i] * m_s[j]); } + } + if ((n & 1) == 0) { m_w[1] = 0.0; } + } + + //------------------------------------------------------------------------------ + + AnalogLowPass::AnalogLowPass() + : m_numPoles(-1) { setNormal(0, 1); } + + void AnalogLowPass::design(int numPoles, + WorkspaceBase* w) + { + if (m_numPoles != numPoles) + { + m_numPoles = numPoles; + + reset(); + + PolynomialFinderBase& poly(w->poly); + RootFinderBase& poles(w->roots); + + poly.solve(numPoles); + int degree = numPoles * 2; + + poles.coef()[0] = 1 + poly.coef()[0]; + poles.coef()[1] = 0; + for (int i = 1; i <= degree; ++i) + { + poles.coef()[2 * i] = poly.coef()[i] * ((i & 1) ? -1 : 1); + poles.coef()[2 * i + 1] = 0; + } + poles.solve(degree); + + int j = 0; + for (int i = 0; i < degree; ++i) { if (poles.root()[i].real() <= 0) { poles.root()[j++] = poles.root()[i]; } } + // sort descending imag() and cut degree in half + poles.sort(degree / 2); + + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + complex_t c = poles.root()[i]; + addPoleZeroConjugatePairs(c, infinity()); + } + + if (numPoles & 1) { add(poles.root()[pairs].real(), infinity()); } + } + } + + //------------------------------------------------------------------------------ + + void LowPassBase::setup(int order, + double sampleRate, + double cutoffFrequency, + WorkspaceBase* w) + { + m_analogProto.design(order, w); + + LowPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + + void HighPassBase::setup(int order, + double sampleRate, + double cutoffFrequency, + WorkspaceBase* w) + { + m_analogProto.design(order, w); + + HighPassTransform(cutoffFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + + void BandPassBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + WorkspaceBase* w) + { + m_analogProto.design(order, w); + + BandPassTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + + void BandStopBase::setup(int order, + double sampleRate, + double centerFrequency, + double widthFrequency, + WorkspaceBase* w) + { + m_analogProto.design(order, w); + + BandStopTransform(centerFrequency / sampleRate, + widthFrequency / sampleRate, + m_digitalProto, + m_analogProto); + + setLayout(m_digitalProto); + } + } // namespace Legendre +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Legendre.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Legendre.h new file mode 100644 index 0000000..363cd9b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Legendre.h @@ -0,0 +1,320 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ +#pragma once + +#include "Common.h" +#include "Cascade.h" +#include "Design.h" +#include "Filter.h" +#include "PoleFilter.h" +#include "RootFinder.h" + +namespace Dsp +{ + + /* + * Filters with Legendre / "Optimum-L" response characteristics + * + */ + + namespace Legendre + { + + // Numerical computation of Legendre "Optimum-L" polynomials + + class PolynomialFinderBase + { + public: + void solve(int n); + + double* coef() { return m_w; } + + private: + void legendre(double* p, int n); + + protected: + int m_maxN = 0; + double* m_w = nullptr; + double* m_a = nullptr; + double* m_p = nullptr; + double* m_s = nullptr; + double* m_v = nullptr; + double* m_aa = nullptr; + double* m_bb = nullptr; + }; + + template + class PolynomialFinder : public PolynomialFinderBase + { + public: + PolynomialFinder() + { + m_maxN = maxN; + m_w = m_ws; + m_a = m_as; + m_p = m_ps; + m_s = m_ss; + m_v = m_vs; + m_aa = m_aas; + m_bb = m_bbs; + } + + void solve(int n) + { + assert(n <= maxN); + PolynomialFinderBase::solve(n); + } + + private: + double m_ws [2 * maxN + 1]; + double m_as [ maxN + 1]; + double m_ps [2 * maxN + 1]; + double m_ss [2 * maxN + 1]; + double m_vs [2 * maxN + 4]; + double m_aas [ maxN + 1]; + double m_bbs [ maxN + 1]; + }; + + //------------------------------------------------------------------------------ + + // A Workspace is necessary to construct the polynomial and find its roots + + struct WorkspaceBase + { + WorkspaceBase(PolynomialFinderBase* polyBase, RootFinderBase* rootsBase) : poly(*polyBase), roots(*rootsBase) { } + + PolynomialFinderBase& poly; + RootFinderBase& roots; + + private: + WorkspaceBase(WorkspaceBase&); + WorkspaceBase& operator=(WorkspaceBase&); + }; + + template + struct Workspace : WorkspaceBase + { + Workspace() : WorkspaceBase(&m_poly, &m_roots) { } + + private: + PolynomialFinder m_poly; + RootFinder m_roots; + }; + + //------------------------------------------------------------------------------ + + // Half-band analog prototypes (s-plane) + + class AnalogLowPass : public LayoutBase + { + public: + AnalogLowPass(); + + void design(int numPoles, WorkspaceBase* w); + + private: + int m_numPoles = 0; + }; + + //------------------------------------------------------------------------------ + + // Factored implementations to reduce template instantiations + + struct LowPassBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency, WorkspaceBase* w); + }; + + struct HighPassBase : PoleFilterBase + { + void setup(int order, double sampleRate, double cutoffFrequency, WorkspaceBase* w); + }; + + struct BandPassBase : PoleFilterBase + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency, WorkspaceBase* w); + }; + + struct BandStopBase : PoleFilterBase + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency, WorkspaceBase* w); + }; + + //------------------------------------------------------------------------------ + + // + // Raw filters + // + + template + struct LowPass : PoleFilter + { + void setup(int order, double sampleRate, double cutoffFrequency) + { + Workspace w; + LowPassBase::setup(order, sampleRate, cutoffFrequency, &w); + } + }; + + template + struct HighPass : PoleFilter + { + void setup(int order, double sampleRate, double cutoffFrequency) + { + Workspace w; + HighPassBase::setup(order, sampleRate, cutoffFrequency, &w); + } + }; + + template + struct BandPass : PoleFilter + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency) + { + Workspace w; + BandPassBase::setup(order, sampleRate, centerFrequency, widthFrequency, &w); + } + }; + + template + struct BandStop : PoleFilter + { + void setup(int order, double sampleRate, double centerFrequency, double widthFrequency) + { + Workspace w; + BandStopBase::setup(order, sampleRate, centerFrequency, widthFrequency, &w); + } + }; + + //------------------------------------------------------------------------------ + + // + // Gui-friendly Design layer + // + + namespace Design + { + struct TypeIBase : DesignBase + { + enum + { + NumParams = 3 + }; + + static int getNumParams() { return 3; } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCutoffFrequencyParam(); } + }; + + template + struct TypeI : TypeIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2]); } + }; + + struct TypeIIBase : DesignBase + { + enum + { + NumParams = 4 + }; + + static int getNumParams() { return 4; } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultCenterFrequencyParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultBandwidthHzParam(); } + }; + + template + struct TypeII : TypeIIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(int(params[1]), params[0], params[2], params[3]); } + }; + + // Factored kind and name + + struct LowPassDescription + { + static Kind getKind() { return kindLowPass; } + static const char* getName() { return "Legendre Low Pass"; } + }; + + struct HighPassDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Legendre High Pass"; } + }; + + struct BandPassDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Legendre Band Pass"; } + }; + + struct BandStopDescription + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "Legendre Band Stop"; } + }; + + // This glues on the Order parameter + template class TypeClass, template class FilterClass> + struct OrderBase : TypeClass> + { + ParamInfo getParamInfo_1() const + { + return ParamInfo(idOrder, "Order", "Order", 1, MaxOrder, 2, &ParamInfo::Int_toControlValue, &ParamInfo::Int_toNativeValue, + &ParamInfo::Int_toString); + } + }; + + //------------------------------------------------------------------------------ + + // + // Design filters + // + + template + struct LowPass : OrderBase, LowPassDescription {}; + + template + struct HighPass : OrderBase, HighPassDescription {}; + + template + struct BandPass : OrderBase, BandPassDescription {}; + + template + struct BandStop : OrderBase, BandStopDescription {}; + } // namespace Design + } // namespace Legendre +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/MathSupplement.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/MathSupplement.h new file mode 100644 index 0000000..3547001 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/MathSupplement.h @@ -0,0 +1,118 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#ifndef DSPFILTERS_MATHSUPPLEMENT_H +#define DSPFILTERS_MATHSUPPLEMENT_H + +#include "Common.h" + +namespace Dsp +{ + const double doublePi = 3.1415926535897932384626433832795028841971; + const double doublePi_2 = 1.5707963267948966192313216916397514420986; + const double doubleLn2 = 0.69314718055994530941723212145818;//????? + const double doubleLn10 = 2.3025850929940456840179914546844;//?????? + + typedef std::complex complex_t; + typedef std::pair complex_pair_t; + + template + std::complex solve_quadratic_1(Real a, Real b, Real c) { return (-b + sqrt(std::complex(b * b - 4 * a * c, 0))) / (2. * a); } + + template + std::complex solve_quadratic_2(Real a, Real b, Real c) { return (-b - sqrt(std::complex(b * b - 4 * a * c, 0))) / (2. * a); } + + inline complex_t infinity() { return complex_t(std::numeric_limits::infinity()); } + + inline complex_t adjust_imag(const complex_t& c) + { + if (fabs(c.imag()) < 1e-30) { return complex_t(c.real(), 0); } + return c; + } + + template + std::complex addmul(const std::complex& c, Ty v, const std::complex& c1) + { + return std::complex(c.real() + v * c1.real(), c.imag() + v * c1.imag()); + } + + template + std::complex recip(const std::complex& c) + { + Ty n = 1.0 / std::norm(c); + + return std::complex(n * c.real(), n * c.imag()); + } + + template + Ty asinh(Ty x) { return log(x + std::sqrt(x * x + 1)); } + + template + Ty acosh(Ty x) { return log(x + std::sqrt(x * x - 1)); } + + template + bool is_nan(Ty v) { return !(v == v); } + + template <> + inline bool is_nan(complex_t v) { return is_nan(v.real()) || is_nan(v.imag()); } + + //------------------------------------------------------------------------------ + + /* + * Hack to prevent denormals + * + */ + + //const double anti_denormal_vsa = 1e-16; // doesn't prevent denormals + //const double anti_denormal_vsa = 0; + const double anti_denormal_vsa = 1e-8; + + class DenormalPrevention + { + public: + DenormalPrevention() : m_v(anti_denormal_vsa) { } + + // small alternating current + double ac() { return m_v = -m_v; } + + // small direct current + static double dc() { return anti_denormal_vsa; } + + private: + double m_v = 0; + }; +} // namespace Dsp + +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Param.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Param.cpp new file mode 100644 index 0000000..d72428a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Param.cpp @@ -0,0 +1,217 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#include "Common.h" +#include "Design.h" + +#include +#include +#include +#include + +namespace Dsp +{ + ParamInfo::ParamInfo() { throw std::logic_error("invalid usage of ParamInfo"); } + + double ParamInfo::clamp(double nativeValue) const + { + const double minValue = toNativeValue(0); + const double maxValue = toNativeValue(1); + if (nativeValue < minValue) { nativeValue = minValue; } + else if (nativeValue > maxValue) { nativeValue = maxValue; } + return nativeValue; + } + + //------------------------------------------------------------------------------ + + double ParamInfo::Int_toControlValue(double nativeValue) const { return (nativeValue - m_arg1) / (m_arg2 - m_arg1); } + + double ParamInfo::Int_toNativeValue(double controlValue) const { return std::floor(m_arg1 + controlValue * (m_arg2 - m_arg1) + 0.5); } + + //------------------------------------------------------------------------------ + + double ParamInfo::Real_toControlValue(double nativeValue) const { return (nativeValue - m_arg1) / (m_arg2 - m_arg1); } + + double ParamInfo::Real_toNativeValue(double controlValue) const { return m_arg1 + controlValue * (m_arg2 - m_arg1); } + + //------------------------------------------------------------------------------ + + double ParamInfo::Log_toControlValue(double nativeValue) const + { + const double base = 1.5; + double l0 = log(m_arg1) / log(base); + double l1 = log(m_arg2) / log(base); + return (log(nativeValue) / log(base) - l0) / (l1 - l0); + } + + double ParamInfo::Log_toNativeValue(double controlValue) const + { + const double base = 1.5; + double l0 = log(m_arg1) / log(base); + double l1 = log(m_arg2) / log(base); + return pow(base, l0 + controlValue * (l1 - l0)); + } + + //------------------------------------------------------------------------------ + + double ParamInfo::Pow2_toControlValue(double nativeValue) const { return ((log(nativeValue) / log(2.)) - m_arg1) / (m_arg2 - m_arg1); } + + double ParamInfo::Pow2_toNativeValue(double controlValue) const { return pow(2., (controlValue * (m_arg2 - m_arg1)) + m_arg1); } + + //------------------------------------------------------------------------------ + + std::string ParamInfo::Int_toString(double nativeValue) const { return std::to_string(int(nativeValue)); } + + std::string ParamInfo::Hz_toString(double nativeValue) const { return (std::to_string(int(nativeValue)) + " Hz"); } + + std::string ParamInfo::Real_toString(double nativeValue) const + { + std::ostringstream os; + os << std::fixed << std::setprecision(3) << nativeValue; + return os.str(); + } + + std::string ParamInfo::Db_toString(double nativeValue) const + { + const double af = fabs(nativeValue); + int prec; + if (af < 1) { prec = 3; } + else if (af < 10) { prec = 2; } + else { prec = 1; } + std::ostringstream os; + os << std::fixed << std::setprecision(prec) << nativeValue << " dB"; + return os.str(); + } + + //------------------------------------------------------------------------------ + + ParamInfo ParamInfo::defaultSampleRateParam() + { + return ParamInfo(idSampleRate, "Fs", "Sample Rate", 11025, 192000, 44100, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, + &ParamInfo::Hz_toString); + } + + ParamInfo ParamInfo::defaultCutoffFrequencyParam() + { + return ParamInfo(idFrequency, "Fc", "Cutoff Frequency", 10, 22040, 2000, &ParamInfo::Log_toControlValue, &ParamInfo::Log_toNativeValue, + &ParamInfo::Hz_toString); + } + + ParamInfo ParamInfo::defaultCenterFrequencyParam() + { + return ParamInfo(idFrequency, "Fc", "Center Frequency", 10, 22040, 2000, &ParamInfo::Log_toControlValue, &ParamInfo::Log_toNativeValue, + &ParamInfo::Hz_toString); + } + + ParamInfo ParamInfo::defaultQParam() + { + return ParamInfo(idQ, "Q", "Resonance", -4, 4, 1, &ParamInfo::Pow2_toControlValue, &ParamInfo::Pow2_toNativeValue, &ParamInfo::Real_toString); + } + + ParamInfo ParamInfo::defaultBandwidthParam() + { + return ParamInfo(idBandwidth, "BW", "Bandwidth (Octaves)", -4, 4, 1, &ParamInfo::Pow2_toControlValue, &ParamInfo::Pow2_toNativeValue, + &ParamInfo::Real_toString); + } + + ParamInfo ParamInfo::defaultBandwidthHzParam() + { + return ParamInfo(idBandwidthHz, "BW", "Bandwidth (Hz)", 10, 22040, 1720, &ParamInfo::Log_toControlValue, &ParamInfo::Log_toNativeValue, + &ParamInfo::Hz_toString); + } + + ParamInfo ParamInfo::defaultGainParam() + { + return ParamInfo(idGain, "Gain", "Gain", -24, 24, -6, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, &ParamInfo::Db_toString); + } + + ParamInfo ParamInfo::defaultSlopeParam() + { + return ParamInfo(idSlope, "Slope", "Slope", -2, 2, 1, &ParamInfo::Pow2_toControlValue, &ParamInfo::Pow2_toNativeValue, &ParamInfo::Real_toString); + } + + ParamInfo ParamInfo::defaultRippleDbParam() + { + return ParamInfo(idRippleDb, "Ripple", "Ripple dB", 0.001, 12, 0.01, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, + &ParamInfo::Db_toString); + } + + ParamInfo ParamInfo::defaultStopDbParam() + { + return ParamInfo(idStopDb, "Stop", "Stopband dB", 3, 60, 48, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, &ParamInfo::Db_toString); + } + + ParamInfo ParamInfo::defaultRolloffParam() + { + return ParamInfo(idRolloff, "W", "Transition Width", -16, 4, 0, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, + &ParamInfo::Real_toString); + } + + ParamInfo ParamInfo::defaultPoleRhoParam() + { + return ParamInfo(idPoleRho, "Pd", "Pole Distance", 0, 1, 0.5, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, + &ParamInfo::Real_toString); + } + + ParamInfo ParamInfo::defaultPoleThetaParam() + { + return ParamInfo(idPoleTheta, "Pa", "Pole Angle", 0, doublePi, doublePi / 2, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, + &ParamInfo::Real_toString); + } + + ParamInfo ParamInfo::defaultZeroRhoParam() + { + return ParamInfo(idZeroRho, "Pd", "Zero Distance", 0, 1, 0.5, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, + &ParamInfo::Real_toString); + } + + ParamInfo ParamInfo::defaultZeroThetaParam() + { + return ParamInfo(idZeroTheta, "Pa", "Zero Angle", 0, doublePi, doublePi / 2, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, + &ParamInfo::Real_toString); + } + + ParamInfo ParamInfo::defaultPoleRealParam() + { + return ParamInfo(idPoleReal, "A1", "Pole Real", -1, 1, 0.25, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, + &ParamInfo::Real_toString); + } + + ParamInfo ParamInfo::defaultZeroRealParam() + { + return ParamInfo(idZeroReal, "B1", "Zero Real", -1, 1, -0.25, &ParamInfo::Real_toControlValue, &ParamInfo::Real_toNativeValue, + &ParamInfo::Real_toString); + } +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Params.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Params.h new file mode 100644 index 0000000..7ea647a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Params.h @@ -0,0 +1,194 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#ifndef DSPFILTERS_PARAMS_H +#define DSPFILTERS_PARAMS_H + +#include "Common.h" +#include "Types.h" + +namespace Dsp +{ + + /* + * System for abstracting parameterizable filter specifications. + * + * This provides a "GUI-friendly" layer to the filters. Note that + * it is not necessary to use this layer, it is possible to instantiate + * the filters and their associated processing state directly, + * and bypass the overhead for this API if it is not needed. + * + */ + + // Unique IDs to help identify parameters + enum ParamID + { + idSampleRate, + idFrequency, + idQ, + idBandwidth, + idBandwidthHz, + idGain, + idSlope, + idOrder, + idRippleDb, + idStopDb, + idRolloff, + + idPoleRho, + idPoleTheta, + idZeroRho, + idZeroTheta, + + idPoleReal, + idZeroReal + }; + + enum { maxParameters = 8 }; + + struct Params + { + void clear() { for (int i = 0; i < maxParameters; ++i) { value[i] = 0; } } + + double& operator[](int index) { return value[index]; } + + const double& operator[](int index) const { return value[index]; } + + double value[maxParameters]; + }; + + // + // Provides meta-information about a filter parameter + // to achieve run-time introspection. + // + class ParamInfo + { + public: + typedef double (ParamInfo::*toControlValue_t)(double) const; + typedef double (ParamInfo::*toNativeValue_t)(double) const; + typedef std::string (ParamInfo::*toString_t)(double) const; + + // dont use this one + ParamInfo(); // throws std::logic_error + + ParamInfo(ParamID id, const char* szLabel, const char* szName, const double arg1, const double arg2, const double defaultNativeValue, + const toControlValue_t toControlValueProc, const toNativeValue_t toNativeValueProc, const toString_t toStringProc) + : m_id(id), m_szLabel(szLabel), m_szName(szName), m_arg1(arg1), m_arg2(arg2), m_defaultNativeValue(defaultNativeValue), + m_toControlValue(toControlValueProc), m_toNativeValue(toNativeValueProc), m_toString(toStringProc) { } + + // Used to identify well-known parameters (like cutoff frequency) + ParamID getId() const { return m_id; } + + // Returns a short label suitable for placement on a control + const char* getLabel() const { return m_szLabel; } + + // Returns the full name + const char* getName() const { return m_szName; } + + double getDefaultValue() const { return m_defaultNativeValue; } + + // + // Control value is always in the range [0..1] + // + double toControlValue(double nativeValue) const { return (this->*m_toControlValue)(nativeValue); } + + // + // Native value is in filter-specific units. For example, + // cutoff frequency would probably be in Hertz. + // + double toNativeValue(double controlValue) const { return (this->*m_toNativeValue)(controlValue); } + + std::string toString(double nativeValue) const { return (this->*m_toString)(nativeValue); } + + double clamp(double nativeValue) const; + + // + // These routines are used as function pointers when + // constructing the various ParamInfo used by filters + // + + double Int_toControlValue(double nativeValue) const; + double Int_toNativeValue(double controlValue) const; + + double Real_toControlValue(double nativeValue) const; + double Real_toNativeValue(double controlValue) const; + + double Log_toControlValue(double nativeValue) const; + double Log_toNativeValue(double controlValue) const; + + double Pow2_toControlValue(double nativeValue) const; + double Pow2_toNativeValue(double controlValue) const; + + std::string Int_toString(double nativeValue) const; + std::string Hz_toString(double nativeValue) const; + std::string Real_toString(double nativeValue) const; + std::string Db_toString(double nativeValue) const; + + // + // Creates the specified ParamInfo + // + + static ParamInfo defaultSampleRateParam(); + static ParamInfo defaultCutoffFrequencyParam(); + static ParamInfo defaultCenterFrequencyParam(); + static ParamInfo defaultQParam(); + static ParamInfo defaultBandwidthParam(); + static ParamInfo defaultBandwidthHzParam(); + static ParamInfo defaultGainParam(); + static ParamInfo defaultSlopeParam(); + static ParamInfo defaultRippleDbParam(); + static ParamInfo defaultStopDbParam(); + static ParamInfo defaultRolloffParam(); + static ParamInfo defaultPoleRhoParam(); + static ParamInfo defaultPoleThetaParam(); + static ParamInfo defaultZeroRhoParam(); + static ParamInfo defaultZeroThetaParam(); + static ParamInfo defaultPoleRealParam(); + static ParamInfo defaultZeroRealParam(); + + private: + ParamID m_id; + const char* m_szLabel = nullptr; + const char* m_szName = nullptr; + double m_arg1 = 0; + double m_arg2 = 0; + double m_defaultNativeValue = 0; + toControlValue_t m_toControlValue; + toNativeValue_t m_toNativeValue; + toString_t m_toString; + }; +} // namespace Dsp + +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/PoleFilter.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/PoleFilter.cpp new file mode 100644 index 0000000..899c4e9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/PoleFilter.cpp @@ -0,0 +1,283 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#include "Common.h" +#include "PoleFilter.h" + +namespace Dsp +{ + + //------------------------------------------------------------------------------ + + complex_t LowPassTransform::transform(complex_t c) const + { + if (c == infinity()) { return complex_t(-1, 0); } + + // frequency transform + c = f * c; + + // bilinear low pass transform + return (1. + c) / (1. - c); + } + + LowPassTransform::LowPassTransform(double fc, LayoutBase& digital, LayoutBase const& analog) + { + digital.reset(); + + // prewarp + f = tan(doublePi * fc); + + const int numPoles = analog.getNumPoles(); + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + const PoleZeroPair& pair = analog[i]; + digital.addPoleZeroConjugatePairs(transform(pair.poles.first), transform(pair.zeros.first)); + } + + if (numPoles & 1) + { + const PoleZeroPair& pair = analog[pairs]; + digital.add(transform(pair.poles.first), transform(pair.zeros.first)); + } + + digital.setNormal(analog.getNormalW(), analog.getNormalGain()); + } + + //------------------------------------------------------------------------------ + + complex_t HighPassTransform::transform(complex_t c) const + { + if (c == infinity()) { return complex_t(1, 0); } + + // frequency transform + c = f * c; + + // bilinear high pass transform + return - (1. + c) / (1. - c); + } + + HighPassTransform::HighPassTransform(double fc, LayoutBase& digital, LayoutBase const& analog) + { + digital.reset(); + + // prewarp + f = 1. / tan(doublePi * fc); + + const int numPoles = analog.getNumPoles(); + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + const PoleZeroPair& pair = analog[i]; + digital.addPoleZeroConjugatePairs(transform(pair.poles.first), transform(pair.zeros.first)); + } + + if (numPoles & 1) + { + const PoleZeroPair& pair = analog[pairs]; + digital.add(transform(pair.poles.first), transform(pair.zeros.first)); + } + + digital.setNormal(doublePi - analog.getNormalW(), analog.getNormalGain()); + } + + //------------------------------------------------------------------------------ + + BandPassTransform::BandPassTransform(double fc, double fw, LayoutBase& digital, LayoutBase const& analog) + { + // handle degenerate cases efficiently + // THIS DOESNT WORK because the cascade states won't match +#if 0 + const double fw_2 = fw / 2; + if (fc - fw_2 < 0) { LowPassTransform::transform (fc + fw_2, digital, analog); } + else if (fc + fw_2 >= 0.5) { HighPassTransform::transform (fc - fw_2, digital, analog); } + else +#endif + digital.reset(); + + const double ww = 2 * doublePi * fw; + + // pre-calcs + wc2 = 2 * doublePi * fc - (ww / 2); + wc = wc2 + ww; + + // what is this crap? + if (wc2 < 1e-8) { wc2 = 1e-8; } + if (wc > doublePi - 1e-8) { wc = doublePi - 1e-8; } + + a = cos((wc + wc2) * 0.5) / + cos((wc - wc2) * 0.5); + b = 1 / tan((wc - wc2) * 0.5); + a2 = a * a; + b2 = b * b; + ab = a * b; + ab_2 = 2 * ab; + + const int numPoles = analog.getNumPoles(); + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + const PoleZeroPair& pair = analog[i]; + ComplexPair p1 = transform(pair.poles.first); + const ComplexPair z1 = transform(pair.zeros.first); + + // + // Optimize out the calculations for conjugates for Release builds + // +#ifndef NDEBUG + ComplexPair p2 = transform(pair.poles.second); + assert(p2.first == std::conj (p1.first)); + assert(p2.second == std::conj (p1.second)); +#endif + + digital.addPoleZeroConjugatePairs(p1.first, z1.first); + digital.addPoleZeroConjugatePairs(p1.second, z1.second); + } + + if (numPoles & 1) + { + const ComplexPair poles = transform(analog[pairs].poles.first); + const ComplexPair zeros = transform(analog[pairs].zeros.first); + + digital.add(poles, zeros); + } + + const double wn = analog.getNormalW(); + digital.setNormal(2 * atan(sqrt(tan((wc + wn) * 0.5) * tan((wc2 + wn) * 0.5))), analog.getNormalGain()); + } + + ComplexPair BandPassTransform::transform(complex_t c) const + { + if (c == infinity()) { return ComplexPair(-1, 1); } + + c = (1. + c) / (1. - c); // bilinear + + complex_t v = 0; + v = addmul(v, 4 * (b2 * (a2 - 1) + 1), c); + v += 8 * (b2 * (a2 - 1) - 1); + v *= c; + v += 4 * (b2 * (a2 - 1) + 1); + v = std::sqrt(v); + + complex_t u = -v; + u = addmul(u, ab_2, c); + u += ab_2; + + v = addmul(v, ab_2, c); + v += ab_2; + + complex_t d = 0; + d = addmul(d, 2 * (b - 1), c) + 2 * (1 + b); + + return ComplexPair(u / d, v / d); + } + + //------------------------------------------------------------------------------ + + BandStopTransform::BandStopTransform(double fc, double fw, LayoutBase& digital, LayoutBase const& analog) + { + digital.reset(); + + const double ww = 2 * doublePi * fw; + + wc2 = 2 * doublePi * fc - (ww / 2); + wc = wc2 + ww; + + // this is crap + if (wc2 < 1e-8) { wc2 = 1e-8; } + if (wc > doublePi - 1e-8) { wc = doublePi - 1e-8; } + + a = cos((wc + wc2) * .5) / + cos((wc - wc2) * .5); + b = tan((wc - wc2) * .5); + a2 = a * a; + b2 = b * b; + + const int numPoles = analog.getNumPoles(); + const int pairs = numPoles / 2; + for (int i = 0; i < pairs; ++i) + { + const PoleZeroPair& pair = analog[i]; + const ComplexPair p = transform(pair.poles.first); + ComplexPair z = transform(pair.zeros.first); + + // + // Optimize out the calculations for conjugates for Release builds + // + // trick to get the conjugate + if (z.second == z.first) { z.second = std::conj(z.first); } + + digital.addPoleZeroConjugatePairs(p.first, z.first); + digital.addPoleZeroConjugatePairs(p.second, z.second); + } + + if (numPoles & 1) + { + const ComplexPair poles = transform(analog[pairs].poles.first); + const ComplexPair zeros = transform(analog[pairs].zeros.first); + + digital.add(poles, zeros); + } + + if (fc < 0.25) { digital.setNormal(doublePi, analog.getNormalGain()); } + else { digital.setNormal(0, analog.getNormalGain()); } + } + + ComplexPair BandStopTransform::transform(complex_t c) const + { + if (c == infinity()) { c = -1; } + else { c = (1. + c) / (1. - c); }// bilinear + + complex_t u(0); + u = addmul(u, 4 * (b2 + a2 - 1), c); + u += 8 * (b2 - a2 + 1); + u *= c; + u += 4 * (a2 + b2 - 1); + u = std::sqrt(u); + + complex_t v = u * -.5; + v += a; + v = addmul(v, -a, c); + + u *= .5; + u += a; + u = addmul(u, -a, c); + + complex_t d(b + 1); + d = addmul(d, b - 1, c); + + return ComplexPair(u / d, v / d); + } +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/PoleFilter.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/PoleFilter.h new file mode 100644 index 0000000..5c15ed2 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/PoleFilter.h @@ -0,0 +1,200 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#pragma once + +#include "Common.h" +#include "MathSupplement.h" +#include "Cascade.h" + +namespace Dsp +{ + + /* + * Base for filters designed via algorithmic placement of poles and zeros. + * + * Typically, the filter is first designed as a half-band low pass or + * low shelf analog filter (s-plane). Then, using a transformation such + * as the ones from Constantinides, the poles and zeros of the analog filter + * are calculated in the z-plane. + * + */ + + // Factored implementations to reduce template instantiations + + class PoleFilterBase2 : public Cascade + { + public: + // This gets the poles/zeros directly from the digital + // prototype. It is used to double check the correctness + // of the recovery of pole/zeros from biquad coefficients. + // + // It can also be used to accelerate the interpolation + // of pole/zeros for parameter modulation, since a pole + // filter already has them calculated + +#if 1 + // Commenting this out will pass the call to the Cascade, + // which tries to compute the poles and zeros from the biquad + // coefficients. + std::vector getPoleZeros() const + { + std::vector vpz; + const int pairs = (m_digitalProto.getNumPoles() + 1) / 2; + for (int i = 0; i < pairs; ++i) { vpz.push_back(m_digitalProto[i]); } + return vpz; + } +#endif + + protected: + LayoutBase m_digitalProto; + }; + + // Serves a container to hold the analog prototype + // and the digital pole/zero layout. + template + class PoleFilterBase : public PoleFilterBase2 + { + protected: + void setPrototypeStorage(const LayoutBase& analogStorage, const LayoutBase& digitalStorage) + { + m_analogProto.setStorage(analogStorage); + m_digitalProto = digitalStorage; + } + + AnalogPrototype m_analogProto; + }; + + //------------------------------------------------------------------------------ + + // Storage for pole filters + template + struct PoleFilter : BaseClass + , CascadeStages<(MaxDigitalPoles + 1) / 2> + { + PoleFilter() + { + // This glues together the factored base classes + // with the templatized storage classes. + BaseClass::setCascadeStorage(this->getCascadeStorage()); + BaseClass::setPrototypeStorage(m_analogStorage, m_digitalStorage); + } + + private: + Layout m_analogStorage; + Layout m_digitalStorage; + }; + + //------------------------------------------------------------------------------ + + /* + * s-plane to z-plane transforms + * + * For pole filters, an analog prototype is created via placement of + * poles and zeros in the s-plane. The analog prototype is either + * a halfband low pass or a halfband low shelf. The poles, zeros, + * and normalization parameters are transformed into the z-plane + * using variants of the bilinear transformation. + * + */ + + // low pass to low pass + class LowPassTransform + { + public: + LowPassTransform(double fc, LayoutBase& digital, LayoutBase const& analog); + + private: + complex_t transform(complex_t c) const; + + double f = 0; + }; + + //------------------------------------------------------------------------------ + + // low pass to high pass + class HighPassTransform + { + public: + HighPassTransform(double fc, LayoutBase& digital, LayoutBase const& analog); + + private: + complex_t transform(complex_t c) const; + + double f = 0; + }; + + //------------------------------------------------------------------------------ + + // low pass to band pass transform + class BandPassTransform + { + public: + BandPassTransform(double fc, double fw, LayoutBase& digital, LayoutBase const& analog); + + private: + ComplexPair transform(complex_t c) const; + + double wc = 0; + double wc2 = 0; + double a = 0; + double b = 0; + double a2 = 0; + double b2 = 0; + double ab = 0; + double ab_2 = 0; + }; + + //------------------------------------------------------------------------------ + + // low pass to band stop transform + class BandStopTransform + { + public: + BandStopTransform(double fc, double fw, LayoutBase& digital, LayoutBase const& analog); + + private: + ComplexPair transform(complex_t c) const; + + double wc = 0; + double wc2 = 0; + double a = 0; + double b = 0; + double a2 = 0; + double b2 = 0; + }; +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/RBJ.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/RBJ.cpp new file mode 100644 index 0000000..1a995d3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/RBJ.cpp @@ -0,0 +1,205 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#include "Common.h" +#include "RBJ.h" + +namespace Dsp +{ + namespace RBJ + { + void LowPass::setup(double sampleRate, + double cutoffFrequency, + double q) + { + double w0 = 2 * doublePi * cutoffFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn / (2 * q); + double b0 = (1 - cs) / 2; + double b1 = 1 - cs; + double b2 = (1 - cs) / 2; + double a0 = 1 + AL; + double a1 = -2 * cs; + double a2 = 1 - AL; + setCoefficients(a0, a1, a2, b0, b1, b2); + } + + void HighPass::setup(double sampleRate, + double cutoffFrequency, + double q) + { + double w0 = 2 * doublePi * cutoffFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn / (2 * q); + double b0 = (1 + cs) / 2; + double b1 = -(1 + cs); + double b2 = (1 + cs) / 2; + double a0 = 1 + AL; + double a1 = -2 * cs; + double a2 = 1 - AL; + setCoefficients(a0, a1, a2, b0, b1, b2); + } + + void BandPass1::setup(double sampleRate, + double centerFrequency, + double bandWidth) + { + double w0 = 2 * doublePi * centerFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn / (2 * bandWidth); + double b0 = bandWidth * AL;// sn / 2; + double b1 = 0; + double b2 = -bandWidth * AL;//-sn / 2; + double a0 = 1 + AL; + double a1 = -2 * cs; + double a2 = 1 - AL; + setCoefficients(a0, a1, a2, b0, b1, b2); + } + + void BandPass2::setup(double sampleRate, + double centerFrequency, + double bandWidth) + { + double w0 = 2 * doublePi * centerFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn / (2 * bandWidth); + double b0 = AL; + double b1 = 0; + double b2 = -AL; + double a0 = 1 + AL; + double a1 = -2 * cs; + double a2 = 1 - AL; + setCoefficients(a0, a1, a2, b0, b1, b2); + } + + void BandStop::setup(double sampleRate, + double centerFrequency, + double bandWidth) + { + double w0 = 2 * doublePi * centerFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn / (2 * bandWidth); + double b0 = 1; + double b1 = -2 * cs; + double b2 = 1; + double a0 = 1 + AL; + double a1 = -2 * cs; + double a2 = 1 - AL; + setCoefficients(a0, a1, a2, b0, b1, b2); + } + + void LowShelf::setup(double sampleRate, + double cutoffFrequency, + double gainDb, + double shelfSlope) + { + double A = pow(10, gainDb / 40); + double w0 = 2 * doublePi * cutoffFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn / 2 * std::sqrt((A + 1 / A) * (1 / shelfSlope - 1) + 2); + double sq = 2 * sqrt(A) * AL; + double b0 = A * ((A + 1) - (A - 1) * cs + sq); + double b1 = 2 * A * ((A - 1) - (A + 1) * cs); + double b2 = A * ((A + 1) - (A - 1) * cs - sq); + double a0 = (A + 1) + (A - 1) * cs + sq; + double a1 = -2 * ((A - 1) + (A + 1) * cs); + double a2 = (A + 1) + (A - 1) * cs - sq; + setCoefficients(a0, a1, a2, b0, b1, b2); + } + + void HighShelf::setup(double sampleRate, + double cutoffFrequency, + double gainDb, + double shelfSlope) + { + double A = pow(10, gainDb / 40); + double w0 = 2 * doublePi * cutoffFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn / 2 * std::sqrt((A + 1 / A) * (1 / shelfSlope - 1) + 2); + double sq = 2 * sqrt(A) * AL; + double b0 = A * ((A + 1) + (A - 1) * cs + sq); + double b1 = -2 * A * ((A - 1) + (A + 1) * cs); + double b2 = A * ((A + 1) + (A - 1) * cs - sq); + double a0 = (A + 1) - (A - 1) * cs + sq; + double a1 = 2 * ((A - 1) - (A + 1) * cs); + double a2 = (A + 1) - (A - 1) * cs - sq; + setCoefficients(a0, a1, a2, b0, b1, b2); + } + + void BandShelf::setup(double sampleRate, + double centerFrequency, + double gainDb, + double bandWidth) + { + double A = pow(10, gainDb / 40); + double w0 = 2 * doublePi * centerFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn * sinh(doubleLn2 / 2 * bandWidth * w0 / sn); + assert(!Dsp::is_nan (AL)); + double b0 = 1 + AL * A; + double b1 = -2 * cs; + double b2 = 1 - AL * A; + double a0 = 1 + AL / A; + double a1 = -2 * cs; + double a2 = 1 - AL / A; + setCoefficients(a0, a1, a2, b0, b1, b2); + } + + void AllPass::setup(double sampleRate, + double phaseFrequency, + double q) + { + double w0 = 2 * doublePi * phaseFrequency / sampleRate; + double cs = cos(w0); + double sn = sin(w0); + double AL = sn / (2 * q); + double b0 = 1 - AL; + double b1 = -2 * cs; + double b2 = 1 + AL; + double a0 = 1 + AL; + double a1 = -2 * cs; + double a2 = 1 - AL; + setCoefficients(a0, a1, a2, b0, b1, b2); + } + } // namespace RBJ +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/RBJ.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/RBJ.h new file mode 100644 index 0000000..7c5e4cc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/RBJ.h @@ -0,0 +1,249 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#ifndef DSPFILTERS_RBJ_H +#define DSPFILTERS_RBJ_H + +#include "Common.h" +#include "Biquad.h" +#include "Design.h" +#include "Filter.h" + +namespace Dsp +{ + + /* + * Filter realizations based on Robert Bristol-Johnson formulae: + * + * http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt + * + */ + + namespace RBJ + { + + // + // Raw filters + // + + struct LowPass : BiquadBase + { + void setup(double sampleRate, double cutoffFrequency, double q); + }; + + struct HighPass : BiquadBase + { + void setup(double sampleRate, double cutoffFrequency, double q); + }; + + struct BandPass1 : BiquadBase + { + // (constant skirt gain, peak gain = Q) + void setup(double sampleRate, double centerFrequency, double bandWidth); + }; + + struct BandPass2 : BiquadBase + { + // (constant 0 dB peak gain) + void setup(double sampleRate, double centerFrequency, double bandWidth); + }; + + struct BandStop : BiquadBase + { + void setup(double sampleRate, double centerFrequency, double bandWidth); + }; + + struct LowShelf : BiquadBase + { + void setup(double sampleRate, double cutoffFrequency, double gainDb, double shelfSlope); + }; + + struct HighShelf : BiquadBase + { + void setup(double sampleRate, double cutoffFrequency, double gainDb, double shelfSlope); + }; + + struct BandShelf : BiquadBase + { + void setup(double sampleRate, double centerFrequency, double gainDb, double bandWidth); + }; + + struct AllPass : BiquadBase + { + void setup(double sampleRate, double phaseFrequency, double q); + }; + + //------------------------------------------------------------------------------ + + // + // Gui-friendly Design layer + // + + namespace Design + { + struct TypeIBase : DesignBase + { + enum + { + NumParams = 3 + }; + + static int getNumParams() { return 3; } + static ParamInfo getParamInfo_1() { return ParamInfo::defaultCutoffFrequencyParam(); } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultQParam(); } + }; + + template + struct TypeI : TypeIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(params[0], params[1], params[2]); } + }; + + struct TypeIIBase : DesignBase + { + enum + { + NumParams = 3 + }; + + static int getNumParams() { return 3; } + static ParamInfo getParamInfo_1() { return ParamInfo::defaultCenterFrequencyParam(); } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultBandwidthParam(); } + }; + + template + struct TypeII : TypeIIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(params[0], params[1], params[2]); } + }; + + struct TypeIIIBase : DesignBase + { + enum + { + NumParams = 4 + }; + + static int getNumParams() { return 4; } + static ParamInfo getParamInfo_1() { return ParamInfo::defaultCutoffFrequencyParam(); } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultGainParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultSlopeParam(); } + }; + + template + struct TypeIII : TypeIIIBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(params[0], params[1], params[2], params[3]); } + }; + + struct TypeIVBase : DesignBase + { + enum + { + NumParams = 4 + }; + + static int getNumParams() { return 4; } + static ParamInfo getParamInfo_1() { return ParamInfo::defaultCenterFrequencyParam(); } + static ParamInfo getParamInfo_2() { return ParamInfo::defaultGainParam(); } + static ParamInfo getParamInfo_3() { return ParamInfo::defaultBandwidthParam(); } + }; + + template + struct TypeIV : TypeIVBase, FilterClass + { + void setParams(const Params& params) { FilterClass::setup(params[0], params[1], params[2], params[3]); } + }; + + //------------------------------------------------------------------------------ + + struct LowPass : TypeI + { + static Kind getKind() { return kindLowPass; } + static const char* getName() { return "RBJ Low Pass"; } + }; + + struct HighPass : TypeI + { + static Kind getKind() { return kindHighPass; } + static const char* getName() { return "RBJ High Pass"; } + }; + + struct BandPass1 : TypeII + { + static Kind getKind() { return kindBandPass; } + static const char* getName() { return "RBJ Band Pass 1"; } + }; + + struct BandPass2 : TypeII + { + static Kind getKind() { return kindBandPass; } + static const char* getName() { return "RBJ Band Pass 2"; } + }; + + struct BandStop : TypeII + { + static Kind getKind() { return kindBandStop; } + static const char* getName() { return "RBJ Band Stop"; } + }; + + struct LowShelf : TypeIII + { + static Kind getKind() { return kindLowShelf; } + static const char* getName() { return "RBJ Low Shelf"; } + }; + + struct HighShelf : TypeIII + { + static Kind getKind() { return kindHighShelf; } + static const char* getName() { return "RBJ High Shelf"; } + }; + + struct BandShelf : TypeIV + { + static Kind getKind() { return kindBandShelf; } + static const char* getName() { return "RBJ Band Shelf"; } + }; + + struct AllPass : TypeI + { + static Kind getKind() { return kindOther; } + static const char* getName() { return "RBJ All Pass"; } + }; + } // namespace Design + } // namespace RBJ +} + +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/RootFinder.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/RootFinder.cpp new file mode 100644 index 0000000..d584154 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/RootFinder.cpp @@ -0,0 +1,166 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#include "Common.h" +#include "RootFinder.h" +#include + +namespace Dsp +{ + void RootFinderBase::solve(int degree, + bool polish, + bool doSort) + { + assert(degree <= m_maxdegree); + + const double EPS = 1.0e-30; + + int its; + + int m = degree; + + // copy coefficients + for (int j = 0; j <= m; ++j) { m_ad[j] = m_a[j]; } + + // for each root + for (int j = m - 1; j >= 0; --j) + { + // initial guess at 0 + complex_t x = 0.0; + laguerre(j + 1, m_ad, x, its); + + if (fabs(std::imag(x)) <= 2.0 * EPS * fabs(std::real(x))) { x = complex_t(std::real(x), 0.0); } + + m_root[j] = x; + + // deflate + complex_t b = m_ad[j + 1]; + for (int jj = j; jj >= 0; --jj) + { + complex_t c = m_ad[jj]; + m_ad[jj] = b; + b = x * b + c; + } + } + + if (polish) { for (int j = 0; j < m; ++j) { laguerre(degree, m_a, m_root[j], its); } } + + if (doSort) { sort(degree); } + } + + void RootFinderBase::sort(int degree) + { + for (int j = 1; j < degree; ++j) + { + complex_t x = m_root[j]; + + int i; + for (i = j - 1; i >= 0; --i) + { + if (m_root[i].imag() >= x.imag()) { break; } + + m_root[i + 1] = m_root[i]; + } + + m_root[i + 1] = x; + } + } + + //------------------------------------------------------------------------------ + + void RootFinderBase::laguerre(int degree, + complex_t a[], + complex_t& x, + int& its) + { + const int MR = 8, MT = 10, MAXIT = MT * MR; + const double EPS = std::numeric_limits::epsilon(); + + static const double frac[MR + 1] = + { 0.0, 0.5, 0.25, 0.75, 0.13, 0.38, 0.62, 0.88, 1.0 }; + + complex_t f; + + int m = degree; + for (int iter = 1; iter <= MAXIT; ++iter) + { + its = iter; + complex_t b = a[m]; + double err = std::abs(b); + complex_t d = f = 0.0; + double abx = std::abs(x); + for (int j = m - 1; j >= 0; --j) + { + f = x * f + d; + d = x * d + b; + b = x * b + a[j]; + err = std::abs(b) + abx * err; + } + err *= EPS; + if (std::abs(b) <= err) { return; } + complex_t g = d / b; + complex_t g2 = g * g; + complex_t h = g2 - 2.0 * f / b; + + complex_t sq = sqrt(double(m - 1) * (double(m) * h - g2)); + complex_t gp = g + sq; + complex_t gm = g - sq; + + double abp = std::abs(gp); + double abm = std::abs(gm); + if (abp < abm) { gp = gm; } + complex_t dx = std::max(abp, abm) > 0.0 ? double(m) / gp : std::polar(1 + abx, double(iter)); + complex_t x1 = x - dx; + if (x == x1) { return; } + if (iter % MT != 0) { x = x1; } + else { x -= frac[iter / MT] * dx; } + } + + throw std::logic_error("laguerre failed"); + } + + //------------------------------------------------------------------------------ + + complex_t RootFinderBase::eval(int degree, + const complex_t& x) + { + complex_t y; + + if (x != 0.) { for (int i = 0; i <= degree; ++i) { y += m_a[i] * pow(x, double(i)); } } + else { y = m_a[0]; } + + return y; + } +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/RootFinder.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/RootFinder.h new file mode 100644 index 0000000..c16d00b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/RootFinder.h @@ -0,0 +1,108 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ +#pragma once + +#include "Common.h" +#include "Types.h" +#include + +namespace Dsp +{ + + // + // Finds the complex roots of the given polynomial with + // complex-valued coefficients using a numerical method. + // + + class RootFinderBase + { + public: + struct Array + { + Array(int /*max*/, complex_t* /*values*/) /* : m_max (max), m_values (values)*/ { } + + //complex_t& operator[] (int index) { }; + }; + + // + // Find roots of polynomial f(x)=a[0]+a[1]*x+a[2]*x^2...+a[degree]*x^degree + // The input coefficients are set using coef()[]. + // The solutions are placed in roots. + // + void solve(int degree, bool polish = true, bool doSort = true); + + // Evaluates the polynomial at x + complex_t eval(int degree, const complex_t& x); + + // Direct access to the input coefficient array of size degree+1. + complex_t* coef() { return m_a; } + + // Direct access to the resulting roots array of size degree + complex_t* root() { return m_root; } + + // sort the roots by descending imaginary part + void sort(int degree); + + private: + // Improves x as a root using Laguerre's method. + // The input coefficient array has degree+1 elements. + void laguerre(int degree, complex_t a[], complex_t& x, int& its); + + protected: + int m_maxdegree = 0; + complex_t* m_a = nullptr; // input coefficients (m_maxdegree+1 elements) + complex_t* m_ad = nullptr; // copy of deflating coefficients + complex_t* m_root = nullptr; // array of roots (maxdegree elements) + }; + + //------------------------------------------------------------------------------ + + template + struct RootFinder : RootFinderBase + { + RootFinder() + { + m_maxdegree = maxdegree; + m_a = m_a0; + m_ad = m_ad0; + m_root = m_r; + } + + private: + complex_t m_a0 [maxdegree + 1]; + complex_t m_ad0[maxdegree + 1]; + complex_t m_r [maxdegree]; + }; +} // namespace Dsp diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/SmoothedFilter.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/SmoothedFilter.h new file mode 100644 index 0000000..368f4dc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/SmoothedFilter.h @@ -0,0 +1,133 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#ifndef DSPFILTERS_SMOOTHEDFILTER_H +#define DSPFILTERS_SMOOTHEDFILTER_H + +#include "Common.h" +#include "Filter.h" + +namespace Dsp +{ + + /* + * Implements smooth modulation of time-varying filter parameters + * + */ + template + class SmoothedFilterDesign final : public FilterDesign + { + public: + typedef FilterDesign filter_type_t; + + SmoothedFilterDesign(int transitionSamples) : m_transitionSamples(transitionSamples) { } + + // Process a block of samples. + template + void processBlock(int nSamples, + Sample* const* destChannelArray) + { + const int numChannels = this->getNumChannels(); + + // If this goes off it means setup() was never called + assert(m_remainingSamples >= 0); + + // first handle any transition samples + int remainingSamples = std::min(m_remainingSamples, nSamples); + + if (remainingSamples > 0) + { + // interpolate parameters for each sample + const double t = 1. / m_remainingSamples; + double dp[maxParameters]; + for (int i = 0; i < DesignClass::NumParams; ++i) { dp[i] = (this->getParams()[i] - m_transitionParams[i]) * t; } + + for (int n = 0; n < remainingSamples; ++n) + { + for (int i = DesignClass::NumParams; --i >= 0;) { m_transitionParams[i] += dp[i]; } + + m_transitionFilter.setParams(m_transitionParams); + + for (int i = numChannels; --i >= 0;) + { + Sample* dest = destChannelArray[i] + n; + *dest = this->m_state[i].process(*dest, m_transitionFilter); + } + } + + m_remainingSamples -= remainingSamples; + + if (m_remainingSamples == 0) { m_transitionParams = this->getParams(); } + } + + // do what's left + if (nSamples - remainingSamples > 0) + { + // no transition + for (int i = 0; i < numChannels; ++i) + { + this->m_design.process(nSamples - remainingSamples, destChannelArray[i] + remainingSamples, this->m_state[i]); + } + } + } + + void process(int nSamples, float* const* arrayOfChannels) override { processBlock(nSamples, arrayOfChannels); } + void process(int nSamples, double* const* arrayOfChannels) override { processBlock(nSamples, arrayOfChannels); } + +#include "SmoothedFilterSynthesisH.inl" + + protected: + void doSetParams(const Params& parameters) override + { + if (m_remainingSamples >= 0) { m_remainingSamples = m_transitionSamples; } + else + { + // first time + m_remainingSamples = 0; + m_transitionParams = parameters; + } + + filter_type_t::doSetParams(parameters); + } + + Params m_transitionParams; + DesignClass m_transitionFilter; + int m_transitionSamples = 0; + + int m_remainingSamples = -1; // remaining transition samples + }; +} // namespace Dsp + +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/SmoothedFilterSynthesisH.inl b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/SmoothedFilterSynthesisH.inl new file mode 100644 index 0000000..e27e187 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/SmoothedFilterSynthesisH.inl @@ -0,0 +1,73 @@ + + // Process a block of samples. + template + void processBlockSynthesis (int nSamples, + Sample* const* destChannelArray) + { + const int numChannels = this->getNumChannels(); + + // If this goes off it means setup() was never called + assert (m_remainingSamples >= 0); + + // first handle any transition samples + int remainingSamples = std::min (m_remainingSamples, nSamples); + + if (remainingSamples > 0) // A PRIORI, never used in our case! + { + // interpolate parameters for each sample + const double t = 1. / m_remainingSamples; + double dp[maxParameters]; + for (int i = 0; i < DesignClass::NumParams; ++i) + dp[i] = (this->getParams()[i] - m_transitionParams[i]) * t; + + for (int n = 0; n < remainingSamples; ++n) + { + for (int i = DesignClass::NumParams; --i >=0;) + m_transitionParams[i] += dp[i]; + + m_transitionFilter.setParams (m_transitionParams); + + for (int i = numChannels; --i >= 0;) + { + Sample* dest = destChannelArray[i]+n; + *dest = this->m_state[i].processSynthesis (*dest, m_transitionFilter); //not sure to be defined !!! + } + } + + m_remainingSamples -= remainingSamples; + + if (m_remainingSamples == 0) + m_transitionParams = this->getParams(); + } + + // do what's left + if (nSamples - remainingSamples > 0) + { + // no transition + for (int i = 0; i < numChannels; ++i) + this->m_design.processSynthesis (nSamples - remainingSamples, + destChannelArray[i] + remainingSamples, + this->m_state[i]); + } + } + + void processSynthesis (int nSamples, double* const* arrayOfChannels) + { + processBlockSynthesis (nSamples, arrayOfChannels); + } + + void doSetParamsSynthesis (const Params& parameters) + { + if (m_remainingSamples >= 0) + { + m_remainingSamples = m_transitionSamples; + } + else + { + // first time + m_remainingSamples = 0; + m_transitionParams = parameters; + } + + filter_type_t::doSetParamsSynthesis (parameters); + } diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/State.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/State.cpp new file mode 100644 index 0000000..918e61c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/State.cpp @@ -0,0 +1,43 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#include "Common.h" +#include "State.h" + +namespace Dsp +{ + + //------------------------------------------------------------------------------ +} diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/State.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/State.h new file mode 100644 index 0000000..52638ab --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/State.h @@ -0,0 +1,278 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#ifndef DSPFILTERS_STATE_H +#define DSPFILTERS_STATE_H + +#include "Common.h" +#include "Biquad.h" + +#include + +namespace Dsp +{ + + /* + * Various forms of state information required to + * process channels of actual sample data. + * + */ + + //------------------------------------------------------------------------------ + + /* + * State for applying a second order section to a sample using Direct Form I + * + * Difference equation: + * + * y[n] = (b0/a0)*x[n] + (b1/a0)*x[n-1] + (b2/a0)*x[n-2] + * - (a1/a0)*y[n-1] - (a2/a0)*y[n-2] + */ + class DirectFormI + { + public: + DirectFormI() { reset(); } + + void reset() + { + m_x1 = 0; + m_x2 = 0; + m_y1 = 0; + m_y2 = 0; + } + + template + Sample process1(const Sample in, const BiquadBase& s, const double vsa) // very small amount + { + double out = s.m_b0 * in + s.m_b1 * m_x1 + s.m_b2 * m_x2 - s.m_a1 * m_y1 - s.m_a2 * m_y2 + vsa; + m_x2 = m_x1; + m_y2 = m_y1; + m_x1 = in; + m_y1 = out; + + return Sample(out); + } + + protected: + double m_x2 = 0; // x[n-2] + double m_y2 = 0; // y[n-2] + double m_x1 = 0; // x[n-1] + double m_y1 = 0; // y[n-1] + }; + + //------------------------------------------------------------------------------ + + /* + * State for applying a second order section to a sample using Direct Form II + * + * Difference equation: + * + * v[n] = x[n] - (a1/a0)*v[n-1] - (a2/a0)*v[n-2] + * y(n) = (b0/a0)*v[n] + (b1/a0)*v[n-1] + (b2/a0)*v[n-2] + * + */ + class DirectFormII + { + public: + DirectFormII() { reset(); } + + void reset() + { + m_v1 = 0; + m_v2 = 0; + } + + template + Sample process1(const Sample in, const BiquadBase& s, const double vsa) + { + double w = in - s.m_a1 * m_v1 - s.m_a2 * m_v2 + vsa; + double out = s.m_b0 * w + s.m_b1 * m_v1 + s.m_b2 * m_v2; + + m_v2 = m_v1; + m_v1 = w; + + return Sample(out); + } + + private: + double m_v1 = 0; // v[-1] + double m_v2 = 0; // v[-2] + }; + + //------------------------------------------------------------------------------ + + /* + * Transposed Direct Form I and II + * by lubomir i. ivanov (neolit123 [at] gmail) + * + * Reference: + * http://www.kvraudio.com/forum/viewtopic.php?p=4430351 + * + */ + + // I think this one is broken + class TransposedDirectFormI + { + public: + TransposedDirectFormI() { reset(); } + + void reset() + { + m_v = 0; + m_s1 = 0; + m_s1_1 = 0; + m_s2 = 0; + m_s2_1 = 0; + m_s3 = 0; + m_s3_1 = 0; + m_s4 = 0; + m_s4_1 = 0; + } + + template + Sample process1(const Sample in, const BiquadBase& s, const double /*vsa*/) + { + + // can be: in += m_s1_1; + m_v = in + m_s1_1; + double out = s.m_b0 * m_v + m_s3_1; + m_s1 = m_s2_1 - s.m_a1 * m_v; + m_s2 = -s.m_a2 * m_v; + m_s3 = s.m_b1 * m_v + m_s4_1; + m_s4 = s.m_b2 * m_v; + + m_s4_1 = m_s4; + m_s3_1 = m_s3; + m_s2_1 = m_s2; + m_s1_1 = m_s1; + + return Sample(out); + } + + private: + double m_v = 0; + double m_s1 = 0; + double m_s1_1 = 0; + double m_s2 = 0; + double m_s2_1 = 0; + double m_s3 = 0; + double m_s3_1 = 0; + double m_s4 = 0; + double m_s4_1 = 0; + }; + + //------------------------------------------------------------------------------ + + class TransposedDirectFormII + { + public: + TransposedDirectFormII() { reset(); } + + void reset() + { + m_s1 = 0; + m_s1_1 = 0; + m_s2 = 0; + m_s2_1 = 0; + } + + template + Sample process1(const Sample in, const BiquadBase& s, const double vsa) + { + double out = m_s1_1 + s.m_b0 * in + vsa; + m_s1 = m_s2_1 + s.m_b1 * in - s.m_a1 * out; + m_s2 = s.m_b2 * in - s.m_a2 * out; + m_s1_1 = m_s1; + m_s2_1 = m_s2; + + return Sample(out); + } + + private: + double m_s1 = 0; + double m_s1_1 = 0; + double m_s2 = 0; + double m_s2_1 = 0; + }; + + //------------------------------------------------------------------------------ + + // Holds an array of states suitable for multi-channel processing + template + class ChannelsState + { + public: + ChannelsState() { } + + int getNumChannels() const { return Channels; } + + void reset() { for (int i = 0; i < Channels; ++i) { m_state[i].reset(); } } + + StateType& operator[](int index) + { + assert(index >= 0 && index < Channels); + return m_state[index]; + } + + template + void process(int nSamples, Sample* const* arrayOfChannels, Filter& filter) + { + for (int i = 0; i < Channels; ++i) { filter.process(nSamples, arrayOfChannels[i], m_state[i]); } + } + + private: + StateType m_state[Channels]; + }; + + // Empty state, can't process anything + template + class ChannelsState<0, StateType> + { + public: + int getNumChannels() const { return 0; } + + void reset() { throw std::logic_error("attempt to reset empty ChannelState"); } + + template + void process(int /*nSamples*/, Sample* const* /*arrayOfChannels*/, FilterDesign& /*filter*/) + { + throw std::logic_error("attempt to process empty ChannelState"); + } + }; + + //------------------------------------------------------------------------------ +} // namespace Dsp + +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/StateBaseSynthesisH.inl b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/StateBaseSynthesisH.inl new file mode 100644 index 0000000..9fefa48 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/StateBaseSynthesisH.inl @@ -0,0 +1,16 @@ + + template + inline Sample processSynthesis (const Sample in, const Cascade& c) + { + double out = in; + StateType* state = m_stateArray; + Biquad const* stage = c.m_stageArray; +// const double vsa = ac(); // => vsa = -vsa + int i = c.m_numStages - 1; + out = (state++)->process1 (out, *stage++, 0); // => 0 instead of vsa + for (; --i >= 0;) + out = (state++)->process1 (out, *stage++, 0); + //for (int i = c.m_numStages; --i >= 0; ++state, ++stage) + // out = state->process1 (out, *stage, vsa); + return Sample (out); + } diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Types.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Types.h new file mode 100644 index 0000000..97d61ec --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Types.h @@ -0,0 +1,114 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#ifndef DSPFILTERS_TYPES_H +#define DSPFILTERS_TYPES_H + +#include "Common.h" +#include "MathSupplement.h" + +namespace Dsp +{ + + // A conjugate or real pair + struct ComplexPair : complex_pair_t + { + ComplexPair() { } + + explicit ComplexPair(const complex_t& c1) + : complex_pair_t(c1, 0.) + { + assert(isReal()); + } + + ComplexPair(const complex_t& c1, + const complex_t& c2) + : complex_pair_t(c1, c2) { } + + bool isConjugate() const { return second == std::conj(first); } + + bool isReal() const { return first.imag() == 0 && second.imag() == 0; } + + // Returns true if this is either a conjugate pair, + // or a pair of reals where neither is zero. + bool isMatchedPair() const + { + if (first.imag() != 0) { return second == std::conj(first); } + return second.imag() == 0 && + second.real() != 0 && + first.real() != 0; + } + + bool is_nan() const { return Dsp::is_nan(first) || Dsp::is_nan(second); } + }; + + // A pair of pole/zeros. This fits in a biquad (but is missing the gain) + struct PoleZeroPair + { + ComplexPair poles; + ComplexPair zeros; + + PoleZeroPair() { } + + // single pole/zero + PoleZeroPair(const complex_t& p, const complex_t& z) + : poles(p), zeros(z) { } + + // pole/zero pair + PoleZeroPair(const complex_t& p1, const complex_t& z1, + const complex_t& p2, const complex_t& z2) + : poles(p1, p2) + , zeros(z1, z2) { } + + bool isSinglePole() const { return poles.second == 0. && zeros.second == 0.; } + + bool is_nan() const { return poles.is_nan() || zeros.is_nan(); } + }; + + // Identifies the general class of filter + enum Kind + { + kindLowPass, + kindHighPass, + kindBandPass, + kindBandStop, + kindLowShelf, + kindHighShelf, + kindBandShelf, + kindOther + }; +} // namespace Dsp + +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Utilities.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Utilities.h new file mode 100644 index 0000000..6ec4c69 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/dsp-filters/Utilities.h @@ -0,0 +1,723 @@ +/******************************************************************************* + +"A Collection of Useful C++ Classes for Digital Signal Processing" + By Vinnie Falco + +Official project location: +https://github.com/vinniefalco/DSPFilters + +See Documentation.cpp for contact information, notes, and bibliography. + +-------------------------------------------------------------------------------- + +License: MIT License (http://www.opensource.org/licenses/mit-license.php) +Copyright (c) 2009 by Vinnie Falco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +*******************************************************************************/ + +#ifndef DSPFILTERS_UTILITIES_H +#define DSPFILTERS_UTILITIES_H + +#include "Common.h" + +namespace Dsp +{ + + /* + * Utilities + * + * These routines are handy for manipulating buffers of samples. + * + */ + + //------------------------------------------------------------------------------ + + // Add src samples to dest, without clip or overflow checking. + template + void add(int samples, + Td* dest, + Ts const* src, + int destSkip = 0, + int srcSkip = 0) + { + if (srcSkip != 0 || destSkip != 0) + { + ++srcSkip; + ++destSkip; + while (--samples >= 0) + { + *dest = Td(*src); + dest += destSkip; + src += srcSkip; + } + } + else { while (--samples >= 0) *dest++ += Td(*src++); } + } + + // Multichannel add + template + void add(int channels, + int samples, + Td* const* dest, + Ts const* const* src) { for (int i = channels; --i >= 0;) add(samples, dest[i], src[i]); } + + //-------------------------------------------------------------------------- + + // Copy samples from src to dest, which may not overlap. Performs an implicit + // type conversion if Ts and Td are different (for example, float to double). + template + void copy(int samples, + Td* dest, + Ts const* src, + int destSkip = 0, + int srcSkip = 0) + { + if (srcSkip != 0) + { + if (destSkip != 0) + { + ++srcSkip; + ++destSkip; + while (--samples >= 0) + { + *dest++ = *src++; + dest += destSkip; + src += srcSkip; + } + } + else + { + ++srcSkip; + while (--samples >= 0) + { + *dest++ = *src++; + src += srcSkip; + } + } + } + else if (destSkip != 0) + { + ++destSkip; + while (--samples >= 0) + { + *dest = *src++; + dest += destSkip; + } + } + else { while (--samples >= 0) *dest++ = *src++; } + } + + // Wrapper that uses memcpy if there is no skip and the types are the same + template + void copy(int samples, + Ty* dest, + Ty const* src, + int destSkip = 0, + int srcSkip = 0) + { + if (destSkip != 0 || srcSkip != 0) copy(samples, dest, src, destSkip, srcSkip); + else ::memcpy(dest, src, samples * sizeof(src[0])); + } + + // Copy a set of channels from src to dest, with implicit type conversion. + template + void copy(int channels, + int samples, + Td* const* dest, + Ts const* const* src, + int destSkip = 0, + int srcSkip = 0) { for (int i = channels; --i >= 0;) copy(samples, dest[i], src[i], destSkip, srcSkip); } + + //-------------------------------------------------------------------------- + + // Deinterleave channels. Performs implicit type conversion. + template + void deinterleave(int channels, + int samples, + Td* const* dest, + Ts const* src) + { + assert(channels > 1); + + switch (channels) + { + case 2: + { + Td* l = dest[0]; + Td* r = dest[1]; + int n = (samples + 7) / 8; + switch (samples % 8) + { + case 0: do + { + *l++ = *src++; + *r++ = *src++; + case 7: *l++ = *src++; + *r++ = *src++; + case 6: *l++ = *src++; + *r++ = *src++; + case 5: *l++ = *src++; + *r++ = *src++; + case 4: *l++ = *src++; + *r++ = *src++; + case 3: *l++ = *src++; + *r++ = *src++; + case 2: *l++ = *src++; + *r++ = *src++; + case 1: *l++ = *src++; + *r++ = *src++; + } while (--n > 0); + default: break; + } + } + break; + + default: + for (int i = channels; --i >= 0;) copy(samples, dest[i], src + i, 0, channels - 1); + break; + } + } + + // Convenience for a stereo pair of channels + template + void deinterleave(int samples, + Td* left, + Td* right, + Ts const* src) + { + Td* dest[2]; + dest[0] = left; + dest[1] = right; + deinterleave(2, samples, dest, src); + } + + //-------------------------------------------------------------------------- + + // Fade dest + template + void fade(int samples, + Td* dest, + Ty start = 0, + Ty end = 1) + { + Ty t = start; + Ty dt = (end - start) / samples; + + while (--samples >= 0) + { + *dest++ *= t; + t += dt; + } + } + + // Fade dest cannels + template + void fade(int channels, + int samples, + Td* const* dest, + Ty start = 0, + Ty end = 1) { for (int i = channels; --i >= 0;) fade(samples, dest[i], start, end); } + + // Fade src into dest + template + void fade(int samples, + Td* dest, + Ts const* src, + Ty start = 0, + Ty end = 1) + { + Ty t = start; + Ty dt = (end - start) / samples; + + while (--samples >= 0) + { + *dest = Td(*dest + t * (*src++ - *dest)); + ++dest; + t += dt; + } + } + + // Fade src channels into dest channels + template + void fade(int channels, + int samples, + Td* const* dest, + Ts const* const* src, + Ty start = 0, + Ty end = 1) { for (int i = channels; --i >= 0;) fade(samples, dest[i], src[i], start, end); } + + //-------------------------------------------------------------------------- + + // Interleave separate channels from source pointers to destination + // (Destination requires channels*frames samples of storage). Performs + // implicit type conversion. + template + void interleave(int channels, + size_t samples, + Td* dest, + Ts const* const* src) + { + assert(channels>1); + + if (samples == 0) return; + + switch (channels) + { + case 2: + { + const Ts* l = src[0]; + const Ts* r = src[1]; + + // note that Duff's Device only works when samples>0 + int n = (samples + 7) / 8; + switch (samples % 8) + { + case 0: do + { + *dest++ = *l++; + *dest++ = *r++; + case 7: *dest++ = *l++; + *dest++ = *r++; + case 6: *dest++ = *l++; + *dest++ = *r++; + case 5: *dest++ = *l++; + *dest++ = *r++; + case 4: *dest++ = *l++; + *dest++ = *r++; + case 3: *dest++ = *l++; + *dest++ = *r++; + case 2: *dest++ = *l++; + *dest++ = *r++; + case 1: *dest++ = *l++; + *dest++ = *r++; + } while (--n > 0); + default: break; + } + } + break; + + default: { for (int i = channels; --i >= 0;) copy(samples, dest + i, src[i], channels - 1, 0); } + break; + } + } + + //-------------------------------------------------------------------------- + + // Convenience for a stereo channel pair + template + void interleave(int samples, + Td* dest, + Ts const* left, + Ts const* right) + { + const Ts* src[2]; + src[0] = left; + src[1] = right; + interleave(2, samples, dest, src); + } + + //-------------------------------------------------------------------------- + + // Multiply samples by a constant, without clip or overflow checking. + template + void multiply(int samples, + Td* dest, + Ty factor, + int destSkip = 0) + { + if (destSkip != 0) + { + ++destSkip; + while (--samples >= 0) + { + *dest = Td(*dest * factor); + dest += destSkip; + } + } + else + { + while (--samples >= 0) + { + *dest = Td(*dest * factor); + ++dest; + } + } + } + + // Multiply a set of channels by a constant. + template + void multiply(int channels, + int samples, + Td* const* dest, + Ty factor, + int destSkip = 0) { for (int i = channels; --i >= 0;) multiply(samples, dest[i], factor, destSkip); } + + //-------------------------------------------------------------------------- + + // Copy samples from src to dest in reversed order. Performs implicit + // type conversion. src and dest may not overlap. + template + void reverse(int samples, + Td* dest, + Ts const* src, + int destSkip = 0, + int srcSkip = 0) + { + src += (srcSkip + 1) * samples; + + if (srcSkip != 0 || destSkip == 0) + { + ++srcSkip; + ++destSkip; + while (--samples >= 0) + { + src -= srcSkip; + *dest = *src; + dest += destSkip; + } + } + else { while (--samples >= 0) *dest++ = *--src; } + } + + template + void reverse(int channels, size_t frames, Td* const* dest, const Ts* const* src) { for (int i = channels; --i >= 0;) reverse(frames, dest[i], src[i]); } + + //-------------------------------------------------------------------------- + + template + void to_mono(int samples, Tn* dest, Tn const* left, Tn const* right) + { +#if 1 + while (samples-- > 0) *dest++ = (*left++ + *right++) * Tn(0.70710678118654752440084436210485); +#else + while (samples-- > 0) + *dest++ = (*left++ + *right++) * Tn(0.5); +#endif + } + + //-------------------------------------------------------------------------- + + template + void validate(int numChannels, int nSamples, T const* const* src) + { + for (int i = 0; i < numChannels; ++i) + { + T const* p = src[i]; + for (int j = nSamples; j > 0; --j) + { + T v = *p++; + assert(v < 2 && v > -2); + } + } + } + + //-------------------------------------------------------------------------- + +#if 0 +/* + * this stuff all depends on is_pod which is not always available + * + */ +namespace detail { + +template +struct zero +{ + static void process (int samples, + Ty* dest, + int destSkip) + { + if (destSkip != 0) + { + ++destSkip; + while (--samples >= 0) + { + *dest = Ty(); + dest += destSkip; + } + } + else + { + std::fill (dest, dest + samples, Ty()); + } + } +}; + +template +struct zero +{ + static void process (int samples, + Ty* dest, + int destSkip) + { + if (destSkip != 0) + zero::process (samples, dest, destSkip); + else + ::memset (dest, 0, samples * sizeof(dest[0])); + } +}; + +} + +// Fill a channel with zeros. This works even if Ty is not a basic type. +template +void zero (int samples, + Ty* dest, + int destSkip = 0) +{ + detail::zero::value>::process (samples, dest, destSkip ); +} + +#else + // Fill a channel with zeros. This works even if Ty is not a basic type. + template + void zero(int samples, + Ty* dest, + int destSkip = 0) + { + if (destSkip != 0) + { + ++destSkip; + while (--samples >= 0) + { + *dest = Ty(); + dest += destSkip; + } + } + else { std::fill(dest, dest + samples, Ty()); } + } + +#endif + + // Fill a set of channels with zero. + template + void zero(int channels, + int samples, + Ty* const* dest, + int destSkip = 0) { for (int i = channels; --i >= 0;) zero(samples, dest[i], destSkip); } + + //------------------------------------------------------------------------------ + + // Implementation of Brent's Method provided by + // John D. Cook (http://www.johndcook.com/) + // The return value of Minimize is the minimum of the function f. + // The location where f takes its minimum is returned in the variable minLoc. + // Notation and implementation based on Chapter 5 of Richard Brent's book + // "Algorithms for Minimization Without Derivatives". + // + // Reference: + // http://www.codeproject.com/KB/recipes/one_variable_optimize.aspx?msg=2779038 + + template + double BrentMinimize(TFunction& f, // [in] objective function to minimize + double leftEnd, // [in] smaller value of bracketing interval + double rightEnd, // [in] larger value of bracketing interval + double epsilon, // [in] stopping tolerance + double& minLoc) // [out] location of minimum + { + double e, q, r, u, w, fw, fx; + static const double c = 0.5 * (3.0 - std::sqrt(5.0)); + static const double SQRT_DBL_EPSILON = std::sqrt(DBL_EPSILON); + + double& a = leftEnd; + double& b = rightEnd; + double& x = minLoc; + + double v = w = x = a + c * (b - a); + double d = e = 0.0; + double fv = fw = fx = f(x); + int counter = 0; + loop: + counter++; + double m = 0.5 * (a + b); + double tol = SQRT_DBL_EPSILON * fabs(x) + epsilon; + double t2 = 2.0 * tol; + // Check stopping criteria + if (fabs(x - m) > t2 - 0.5 * (b - a)) + { + double p = q = r = 0.0; + if (fabs(e) > tol) + { + // fit parabola + r = (x - w) * (fx - fv); + q = (x - v) * (fx - fw); + p = (x - v) * q - (x - w) * r; + q = 2.0 * (q - r); + (q > 0.0) ? p = -p : q = -q; + r = e; + e = d; + } + if (fabs(p) < fabs(0.5 * q * r) && p < q * (a - x) && p < q * (b - x)) + { + // A parabolic interpolation step + d = p / q; + u = x + d; + // f must not be evaluated too close to a or b + if (u - a < t2 || b - u < t2) d = (x < m) ? tol : -tol; + } + else + { + // A golden section step + e = (x < m) ? b : a; + e -= x; + d = c * e; + } + // f must not be evaluated too close to x + if (fabs(d) >= tol) u = x + d; + else if (d > 0.0) u = x + tol; + else u = x - tol; + double fu = f(u); + // Update a, b, v, w, and x + if (fu <= fx) + { + (u < x) ? b = x : a = x; + v = w; + fv = fw; + w = x; + fw = fx; + x = u; + fx = fu; + } + else + { + (u < x) ? a = u : b = u; + if (fu <= fw || w == x) + { + v = w; + fv = fw; + w = u; + fw = fu; + } + else if (fu <= fv || v == x || v == w) + { + v = u; + fv = fu; + } + } + goto loop; // Yes, the dreaded goto statement. But the code + // here is faithful to Brent's orginal pseudocode. + } + return fx; + } + + //------------------------------------------------------------------------------ + + // Tracks the peaks in the signal stream using the attack and release parameters + template + class EnvelopeFollower + { + public: + EnvelopeFollower() { for (int i = 0; i < Channels; ++i) m_env[i] = 0; } + + Value operator[](int channel) const { return m_env[channel]; } + + void Setup(int sampleRate, double attackMs, double releaseMs) + { + m_a = pow(0.01, 1.0 / (attackMs * sampleRate * 0.001)); + m_r = pow(0.01, 1.0 / (releaseMs * sampleRate * 0.001)); + } + + void Process(size_t samples, const Value** src) + { + for (int i = 0; i < Channels; ++i) + { + const Value* cur = src[i]; + + double e = m_env[i]; + for (int n = samples; n; n--) + { + double v = std::abs(*cur++); + if (v > e) e = m_a * (e - v) + v; + else e = m_r * (e - v) + v; + } + m_env[i] = e; + } + } + + double m_env[Channels]; + + protected: + double m_a = 0; + double m_r = 0; + }; + + //------------------------------------------------------------------------------ + + // Helpful for discovering discontinuities in buffers + template + class SlopeDetector + { + public: + SlopeDetector() : m_firstTime(true) { for (int i = 0; i < Channels; ++i) m_slope[i] = 0; } + + Value getSlope(int channel) const { return m_slope[channel]; } + + void process(size_t nSamples, const Value** input) + { + for (int i = 0; i < Channels; ++i) + { + const Value* src = input[i]; + int n = nSamples; + + if (m_firstTime) + { + m_prev[i] = *src++; + --n; + } + + while (n > 0) + { + n--; + Value cur = *src++; + Value diff = std::abs(cur - m_prev[i]); + m_slope[i] = std::max(diff, m_slope[i]); + m_prev[i] = cur; + } + } + + m_firstTime = false; + } + + private: + bool m_firstTime = false; + Value m_slope [Channels]; + Value m_prev [Channels]; + }; +} // namespace Dsp + +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/CompiledExpression.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/CompiledExpression.cpp new file mode 100644 index 0000000..90697b3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/CompiledExpression.cpp @@ -0,0 +1,133 @@ +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2013 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "CompiledExpression.h" +#include "Operation.h" +#include "ParsedExpression.h" +#include +#include + +using namespace Lepton; + +CompiledExpression::CompiledExpression(const ParsedExpression& expression) +{ + ParsedExpression expr = expression.optimize(); // Just in case it wasn't already optimized. + std::vector> temps; + compileExpression(expr.getRootNode(), temps); +} + +CompiledExpression& CompiledExpression::operator=(const CompiledExpression& expression) +{ + arguments = expression.arguments; + target = expression.target; + variableIndices = expression.variableIndices; + variableNames = expression.variableNames; + workspace.resize(expression.workspace.size()); + argValues.resize(expression.argValues.size()); + operation.resize(expression.operation.size()); + for (size_t i = 0; i < operation.size(); ++i) { operation[i] = expression.operation[i]->clone(); } + return *this; +} + +void CompiledExpression::compileExpression(const ExpressionTreeNode& node, std::vector>& temps) +{ + if (findTempIndex(node, temps) != -1) { return; } // We have already processed a node identical to this one. + + // Process the child nodes. + + std::vector args; + for (size_t i = 0; i < node.getChildren().size(); ++i) + { + compileExpression(node.getChildren()[i], temps); + args.push_back(findTempIndex(node.getChildren()[i], temps)); + } + + // Process this node. + + if (node.getOperation().getId() == Operation::VARIABLE) + { + variableIndices[node.getOperation().getName()] = int(workspace.size()); + variableNames.insert(node.getOperation().getName()); + } + else + { + int stepIndex = int(arguments.size()); + arguments.push_back(std::vector()); + target.push_back(int(workspace.size())); + operation.push_back(node.getOperation().clone()); + if (args.size() == 0) arguments[stepIndex].push_back(0); // The value won't actually be used. We just need something there. + else + { + // If the arguments are sequential, we can just pass a pointer to the first one. + + bool sequential = true; + for (size_t i = 1; i < args.size(); ++i) if (args[i] != args[i - 1] + 1) sequential = false; + if (sequential) arguments[stepIndex].push_back(args[0]); + else + { + arguments[stepIndex] = args; + if (args.size() > argValues.size()) argValues.resize(args.size(), 0.0); + } + } + } + temps.push_back(std::make_pair(node, workspace.size())); + workspace.push_back(0.0); +} + +int CompiledExpression::findTempIndex(const ExpressionTreeNode& node, std::vector>& temps) +{ + for (size_t i = 0; i < temps.size(); ++i) { if (temps[i].first == node) { return int(i); } } + return -1; +} + +double& CompiledExpression::getVariableReference(const std::string& name) +{ + auto index = variableIndices.find(name); + if (index == variableIndices.end()) throw Exception("getVariableReference: Unknown variable '" + name + "'"); + return workspace[index->second]; +} + +double CompiledExpression::evaluate() const +{ + // Loop over the operations and evaluate each one. + + for (size_t step = 0; step < operation.size(); ++step) + { + const std::vector& args = arguments[step]; + if (args.size() == 1) workspace[target[step]] = operation[step]->evaluate(&workspace[args[0]], dummyVariables); + else + { + for (size_t i = 0; i < args.size(); ++i) argValues[i] = workspace[args[i]]; + workspace[target[step]] = operation[step]->evaluate(&argValues[0], dummyVariables); + } + } + return workspace[workspace.size() - 1]; +} diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/CompiledExpression.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/CompiledExpression.h new file mode 100644 index 0000000..491a2cd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/CompiledExpression.h @@ -0,0 +1,91 @@ +#pragma once + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2013 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "ExpressionTreeNode.h" +#include "windowsIncludes.h" +#include +#include +#include +#include + +namespace Lepton +{ + class Operation; + class ParsedExpression; + + /** + * A CompiledExpression is a highly optimized representation of an expression for cases when you want to evaluate + * it many times as quickly as possible. You should treat it as an opaque object; none of the internal representation + * is visible. + * + * A CompiledExpression is created by calling createCompiledExpression() on a ParsedExpression. + * + * WARNING: CompiledExpression is NOT thread safe. You should never access a CompiledExpression from two threads at + * the same time. + */ + + class LEPTON_EXPORT CompiledExpression + { + public: + CompiledExpression() {} + CompiledExpression(const CompiledExpression& expression) { *this = expression; } + ~CompiledExpression() { for (size_t i = 0; i < operation.size(); ++i) if (operation[i] != nullptr) delete operation[i]; } + CompiledExpression& operator=(const CompiledExpression& expression); + /** + * Get the names of all variables used by this expression. + */ + const std::set& getVariables() const { return variableNames; } + /** + * Get a reference to the memory location where the value of a particular variable is stored. This can be used + * to set the value of the variable before calling evaluate(). + */ + double& getVariableReference(const std::string& name); + /** + * Evaluate the expression. The values of all variables should have been set before calling this. + */ + double evaluate() const; + private: + friend class ParsedExpression; + CompiledExpression(const ParsedExpression& expression); + void compileExpression(const ExpressionTreeNode& node, std::vector>& temps); + int findTempIndex(const ExpressionTreeNode& node, std::vector>& temps); + std::vector> arguments; + std::vector target; + std::vector operation; + std::map variableIndices; + std::set variableNames; + mutable std::vector workspace; + mutable std::vector argValues; + std::map dummyVariables; + }; +} // namespace Lepton diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/CustomFunction.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/CustomFunction.h new file mode 100644 index 0000000..6482c72 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/CustomFunction.h @@ -0,0 +1,74 @@ +#pragma once + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "windowsIncludes.h" + +namespace Lepton +{ + + /** + * This class is the interface for defining your own function that may be included in expressions. + * To use it, create a concrete subclass that implements all of the virtual methods for each new function + * you want to define. Then when you call Parser::parse() to parse an expression, pass a map of + * function names to CustomFunction objects. + */ + + class LEPTON_EXPORT CustomFunction + { + public: + virtual ~CustomFunction() { } + /** + * Get the number of arguments this function exprects. + */ + virtual int getNumArguments() const = 0; + /** + * Evaluate the function. + * + * @param arguments the array of argument values + */ + virtual double evaluate(const double* arguments) const = 0; + /** + * Evaluate a derivative of the function. + * + * @param arguments the array of argument values + * @param derivOrder an array specifying the number of times the function has been differentiated + * with respect to each of its arguments. For example, the array {0, 2} indicates + * a second derivative with respect to the second argument. + */ + virtual double evaluateDerivative(const double* arguments, const int* derivOrder) const = 0; + /** + * Create a new duplicate of this object on the heap using the "new" operator. + */ + virtual CustomFunction* clone() const = 0; + }; +} // namespace Lepton diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Exception.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Exception.h new file mode 100644 index 0000000..2dbd903 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Exception.h @@ -0,0 +1,58 @@ +#ifndef LEPTON_EXCEPTION_H_ +#define LEPTON_EXCEPTION_H_ + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include +#include + +namespace Lepton +{ + + /** + * This class is used for all exceptions thrown by Lepton. + */ + + class Exception final : public std::exception + { + public: + Exception(const std::string& message) : message(message) { } + ~Exception() throw() override { } + + const char* what() const throw() override { return message.c_str(); } + + private: + std::string message; + }; +} // namespace Lepton + +#endif /*LEPTON_EXCEPTION_H_*/ diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ExpressionProgram.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ExpressionProgram.cpp new file mode 100644 index 0000000..72ccc66 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ExpressionProgram.cpp @@ -0,0 +1,92 @@ +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009-2013 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "ExpressionProgram.h" +#include "Operation.h" +#include "ParsedExpression.h" + +using namespace Lepton; + +ExpressionProgram::ExpressionProgram() : maxArgs(0), stackSize(0) {} + +ExpressionProgram::ExpressionProgram(const ParsedExpression& expression) : maxArgs(0), stackSize(0) +{ + buildProgram(expression.getRootNode()); + int currentStackSize = 0; + for (size_t i = 0; i < operations.size(); ++i) + { + int args = operations[i]->getNumArguments(); + if (args > maxArgs) { maxArgs = args; } + currentStackSize += 1 - args; + if (currentStackSize > stackSize) { stackSize = currentStackSize; } + } +} + +ExpressionProgram::~ExpressionProgram() { for (size_t i = 0; i < operations.size(); ++i) { delete operations[i]; } } + +ExpressionProgram::ExpressionProgram(const ExpressionProgram& program) { *this = program; } + +ExpressionProgram& ExpressionProgram::operator=(const ExpressionProgram& program) +{ + maxArgs = program.maxArgs; + stackSize = program.stackSize; + operations.resize(program.operations.size()); + for (size_t i = 0; i < operations.size(); ++i) { operations[i] = program.operations[i]->clone(); } + return *this; +} + +void ExpressionProgram::buildProgram(const ExpressionTreeNode& node) +{ + for (size_t i = node.getChildren().size() - 1; i >= 0; i--) { buildProgram(node.getChildren()[i]); } + operations.push_back(node.getOperation().clone()); +} + +int ExpressionProgram::getNumOperations() const { return int(operations.size()); } + +const Operation& ExpressionProgram::getOperation(int index) const { return *operations[index]; } + +int ExpressionProgram::getStackSize() const { return stackSize; } + +double ExpressionProgram::evaluate() const { return evaluate(std::map()); } + +double ExpressionProgram::evaluate(const std::map& variables) const +{ + std::vector stack(stackSize + 1); + int stackPointer = stackSize; + for (size_t i = 0; i < operations.size(); ++i) + { + int numArgs = operations[i]->getNumArguments(); + double result = operations[i]->evaluate(&stack[stackPointer], variables); + stackPointer += numArgs - 1; + stack[stackPointer] = result; + } + return stack[stackSize - 1]; +} diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ExpressionProgram.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ExpressionProgram.h new file mode 100644 index 0000000..30f22ee --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ExpressionProgram.h @@ -0,0 +1,95 @@ +#ifndef LEPTON_EXPRESSION_PROGRAM_H_ +#define LEPTON_EXPRESSION_PROGRAM_H_ + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "ExpressionTreeNode.h" +#include "windowsIncludes.h" +#include +#include +#include + +namespace Lepton +{ + class ParsedExpression; + + /** + * An ExpressionProgram is a linear sequence of Operations for evaluating an expression. The evaluation + * is done with a stack. The arguments to each Operation are first taken off the stack in order, then it is + * evaluated and the result is pushed back onto the stack. At the end, the stack contains a single value, + * which is the value of the expression. + * + * An ExpressionProgram is created by calling createProgram() on a ParsedExpression. + */ + + class LEPTON_EXPORT ExpressionProgram + { + public: + ExpressionProgram(); + ExpressionProgram(const ExpressionProgram& program); + ~ExpressionProgram(); + ExpressionProgram& operator=(const ExpressionProgram& program); + /** + * Get the number of Operations that make up this program. + */ + int getNumOperations() const; + /** + * Get an Operation in this program. + */ + const Operation& getOperation(int index) const; + /** + * Get the size of the stack needed to execute this program. This is the largest number of elements present + * on the stack at any point during evaluation. + */ + int getStackSize() const; + /** + * Evaluate the expression. If the expression involves any variables, this method will throw an exception. + */ + double evaluate() const; + /** + * Evaluate the expression. + * + * @param variables a map specifying the values of all variables that appear in the expression. If any + * variable appears in the expression but is not included in this map, an exception + * will be thrown. + */ + double evaluate(const std::map& variables) const; + private: + friend class ParsedExpression; + ExpressionProgram(const ParsedExpression& expression); + void buildProgram(const ExpressionTreeNode& node); + std::vector operations; + int maxArgs, stackSize; + }; +} // namespace Lepton + +#endif /*LEPTON_EXPRESSION_PROGRAM_H_*/ diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ExpressionTreeNode.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ExpressionTreeNode.cpp new file mode 100644 index 0000000..f2df0e3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ExpressionTreeNode.cpp @@ -0,0 +1,103 @@ +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "ExpressionTreeNode.h" +#include "Exception.h" +#include "Operation.h" + +using namespace Lepton; + +ExpressionTreeNode::ExpressionTreeNode(Operation* operation, const std::vector& children) : operation(operation), children(children) +{ + if (size_t(operation->getNumArguments()) != children.size()) + { + throw Exception("Parse error: wrong number of arguments to function: " + operation->getName()); + } +} + +ExpressionTreeNode::ExpressionTreeNode(Operation* operation, const ExpressionTreeNode& child1, const ExpressionTreeNode& child2) : operation(operation) +{ + children.push_back(child1); + children.push_back(child2); + if (size_t(operation->getNumArguments()) != children.size()) + { + throw Exception("Parse error: wrong number of arguments to function: " + operation->getName()); + } +} + +ExpressionTreeNode::ExpressionTreeNode(Operation* operation, const ExpressionTreeNode& child) : operation(operation) +{ + children.push_back(child); + if (size_t(operation->getNumArguments()) != children.size()) + { + throw Exception("Parse error: wrong number of arguments to function: " + operation->getName()); + } +} + +ExpressionTreeNode::ExpressionTreeNode(Operation* operation) : operation(operation) +{ + if (size_t(operation->getNumArguments()) != children.size()) + { + throw Exception("Parse error: wrong number of arguments to function: " + operation->getName()); + } +} + +ExpressionTreeNode::ExpressionTreeNode(const ExpressionTreeNode& node) : operation(node.getOperation().clone()), children(node.getChildren()) {} + +ExpressionTreeNode::ExpressionTreeNode() {} + +ExpressionTreeNode::~ExpressionTreeNode() { delete operation; } + +bool ExpressionTreeNode::operator!=(const ExpressionTreeNode& node) const +{ + if (node.getOperation() != getOperation()) { return true; } + if (getOperation().isSymmetric() && getChildren().size() == 2) + { + if (getChildren()[0] == node.getChildren()[0] && getChildren()[1] == node.getChildren()[1]) { return false; } + if (getChildren()[0] == node.getChildren()[1] && getChildren()[1] == node.getChildren()[0]) { return false; } + return true; + } + for (size_t i = 0; i < getChildren().size(); ++i) { if (getChildren()[i] != node.getChildren()[i]) { return true; } } + return false; +} + +bool ExpressionTreeNode::operator==(const ExpressionTreeNode& node) const { return !(*this != node); } + +ExpressionTreeNode& ExpressionTreeNode::operator=(const ExpressionTreeNode& node) +{ + delete operation; + operation = node.getOperation().clone(); + children = node.getChildren(); + return *this; +} + +const Operation& ExpressionTreeNode::getOperation() const { return *operation; } +const std::vector& ExpressionTreeNode::getChildren() const { return children; } diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ExpressionTreeNode.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ExpressionTreeNode.h new file mode 100644 index 0000000..824b6a3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ExpressionTreeNode.h @@ -0,0 +1,105 @@ +#ifndef LEPTON_EXPRESSION_TREE_NODE_H_ +#define LEPTON_EXPRESSION_TREE_NODE_H_ + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "windowsIncludes.h" +#include +#include + +namespace Lepton +{ + class Operation; + + /** + * This class represents a node in the abstract syntax tree representation of an expression. + * Each node is defined by an Operation and a set of children. When the expression is + * evaluated, each child is first evaluated in order, then the resulting values are passed + * as the arguments to the Operation's evaluate() method. + */ + + class LEPTON_EXPORT ExpressionTreeNode + { + public: + /** + * Create a new ExpressionTreeNode. + * + * @param operation the operation for this node. The ExpressionTreeNode takes over ownership + * of this object, and deletes it when the node is itself deleted. + * @param children the children of this node + */ + ExpressionTreeNode(Operation* operation, const std::vector& children); + /** + * Create a new ExpressionTreeNode with two children. + * + * @param operation the operation for this node. The ExpressionTreeNode takes over ownership + * of this object, and deletes it when the node is itself deleted. + * @param child1 the first child of this node + * @param child2 the second child of this node + */ + ExpressionTreeNode(Operation* operation, const ExpressionTreeNode& child1, const ExpressionTreeNode& child2); + /** + * Create a new ExpressionTreeNode with one child. + * + * @param operation the operation for this node. The ExpressionTreeNode takes over ownership + * of this object, and deletes it when the node is itself deleted. + * @param child the child of this node + */ + ExpressionTreeNode(Operation* operation, const ExpressionTreeNode& child); + /** + * Create a new ExpressionTreeNode with no children. + * + * @param operation the operation for this node. The ExpressionTreeNode takes over ownership + * of this object, and deletes it when the node is itself deleted. + */ + ExpressionTreeNode(Operation* operation); + ExpressionTreeNode(const ExpressionTreeNode& node); + ExpressionTreeNode(); + ~ExpressionTreeNode(); + bool operator==(const ExpressionTreeNode& node) const; + bool operator!=(const ExpressionTreeNode& node) const; + ExpressionTreeNode& operator=(const ExpressionTreeNode& node); + /** + * Get the Operation performed by this node. + */ + const Operation& getOperation() const; + /** + * Get this node's child nodes. + */ + const std::vector& getChildren() const; + private: + Operation* operation = nullptr; + std::vector children; + }; +} // namespace Lepton + +#endif /*LEPTON_EXPRESSION_TREE_NODE_H_*/ diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Lepton.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Lepton.h new file mode 100644 index 0000000..b3f5a9f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Lepton.h @@ -0,0 +1,43 @@ +#ifndef LEPTON_H_ +#define LEPTON_H_ + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "CompiledExpression.h" +#include "CustomFunction.h" +#include "ExpressionProgram.h" +#include "ExpressionTreeNode.h" +#include "Operation.h" +#include "ParsedExpression.h" +#include "Parser.h" + +#endif /*LEPTON_H_*/ diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/License.txt b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/License.txt new file mode 100644 index 0000000..d12f411 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/License.txt @@ -0,0 +1,31 @@ + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/MSVC_erfc.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/MSVC_erfc.h new file mode 100644 index 0000000..86fb45d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/MSVC_erfc.h @@ -0,0 +1,87 @@ +#ifndef LEPTON_MSVC_ERFC_H_ +#define LEPTON_MSVC_ERFC_H_ + +/* + * Up to version 11 (VC++ 2012), Microsoft does not support the + * standard C99 erf() and erfc() functions so we have to fake them here. + * These were added in version 12 (VC++ 2013), which sets _MSC_VER=1800 + * (VC11 has _MSC_VER=1700). + */ + +#if defined(_MSC_VER) +#define M_PI 3.14159265358979323846264338327950288 + +#if _MSC_VER <= 1700 // 1700 is VC11, 1800 is VC12 +/*************************** +* erf.cpp +* author: Steve Strand +* written: 29-Jan-04 +***************************/ + +#include + +static const double rel_error= 1E-12; //calculate 12 significant figures +//you can adjust rel_error to trade off between accuracy and speed +//but don't ask for > 15 figures (assuming usual 52 bit mantissa in a double) + +static double erfc(double x); + +static double erf(double x) +//erf(x) = 2/sqrt(pi)*integral(exp(-t^2),t,0,x) +// = 2/sqrt(pi)*[x - x^3/3 + x^5/5*2! - x^7/7*3! + ...] +// = 1-erfc(x) +{ + static const double two_sqrtpi= 1.128379167095512574; // 2/sqrt(pi) + if (fabs(x) > 2.2) { + return 1.0 - erfc(x); //use continued fraction when fabs(x) > 2.2 + } + double sum= x, term= x, xsqr= x*x; + int j= 1; + do { + term*= xsqr/j; + sum-= term/(2*j+1); + ++j; + term*= xsqr/j; + sum+= term/(2*j+1); + ++j; + } while (fabs(term)/sum > rel_error); + return two_sqrtpi*sum; +} + + +static double erfc(double x) +//erfc(x) = 2/sqrt(pi)*integral(exp(-t^2),t,x,inf) +// = exp(-x^2)/sqrt(pi) * [1/x+ (1/2)/x+ (2/2)/x+ (3/2)/x+ (4/2)/x+ ...] +// = 1-erf(x) +//expression inside [] is a continued fraction so '+' means add to denominator only +{ + static const double one_sqrtpi= 0.564189583547756287; // 1/sqrt(pi) + if (fabs(x) < 2.2) { + return 1.0 - erf(x); //use series when fabs(x) < 2.2 + } + // Don't look for x==0 here! + if (x < 0) { //continued fraction only valid for x>0 + return 2.0 - erfc(-x); + } + double a=1, b=x; //last two convergent numerators + double c=x, d=x*x+0.5; //last two convergent denominators + double q1, q2= b/d; //last two convergents (a/c and b/d) + double n= 1.0, t; + do { + t= a*n+b*x; + a= b; + b= t; + t= c*n+d*x; + c= d; + d= t; + n+= 0.5; + q1= q2; + q2= b/d; + } while (fabs(q1-q2)/q2 > rel_error); + return one_sqrtpi*exp(-x*x)*q2; +} + +#endif // _MSC_VER <= 1700 +#endif // _MSC_VER + +#endif // LEPTON_MSVC_ERFC_H_ diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Operation.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Operation.cpp new file mode 100644 index 0000000..438c651 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Operation.cpp @@ -0,0 +1,355 @@ +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "Operation.h" +#include "ExpressionTreeNode.h" +#include "MSVC_erfc.h" + +using namespace Lepton; + +double Operation::Erf::evaluate(double* args, const std::map& /*variable*/) const { return erf(args[0]); } + +double Operation::Erfc::evaluate(double* args, const std::map& /*variable*/) const { return erfc(args[0]); } + +ExpressionTreeNode Operation::Constant::differentiate(const std::vector& /*children*/, + const std::vector& /*childDerivs*/, const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Constant(0.0)); +} + +ExpressionTreeNode Operation::Variable::differentiate(const std::vector& /*children*/, + const std::vector& /*childDerivs*/, const std::string& variable) const +{ + if (variable == name) { return ExpressionTreeNode(new Constant(1.0)); } + return ExpressionTreeNode(new Constant(0.0)); +} + +ExpressionTreeNode Operation::Custom::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + if (function->getNumArguments() == 0) { return ExpressionTreeNode(new Constant(0.0)); } + ExpressionTreeNode result = ExpressionTreeNode(new Multiply(), ExpressionTreeNode(new Custom(*this, 0), children), childDerivs[0]); + for (int i = 1; i < getNumArguments(); ++i) + { + result = ExpressionTreeNode(new Add(), + result, + ExpressionTreeNode(new Multiply(), ExpressionTreeNode(new Custom(*this, i), children), childDerivs[i])); + } + return result; +} + +ExpressionTreeNode Operation::Add::differentiate(const std::vector& /*children*/, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Add(), childDerivs[0], childDerivs[1]); +} + +ExpressionTreeNode Operation::Subtract::differentiate(const std::vector& /*children*/, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Subtract(), childDerivs[0], childDerivs[1]); +} + +ExpressionTreeNode Operation::Multiply::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Add(), + ExpressionTreeNode(new Multiply(), children[0], childDerivs[1]), + ExpressionTreeNode(new Multiply(), children[1], childDerivs[0])); +} + +ExpressionTreeNode Operation::Divide::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Divide(), + ExpressionTreeNode(new Subtract(), + ExpressionTreeNode(new Multiply(), children[1], childDerivs[0]), + ExpressionTreeNode(new Multiply(), children[0], childDerivs[1])), + ExpressionTreeNode(new Square(), children[1])); +} + +ExpressionTreeNode Operation::Power::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Add(), + ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Multiply(), + children[1], + ExpressionTreeNode(new Power(), + children[0], ExpressionTreeNode(new AddConstant(-1.0), children[1]))), + childDerivs[0]), + ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Log(), children[0]), + ExpressionTreeNode(new Power(), children[0], children[1])), + childDerivs[1])); +} + +ExpressionTreeNode Operation::Negate::differentiate(const std::vector& /*children*/, const std::vector& childDerivs, + const std::string& /*variable*/) const { return ExpressionTreeNode(new Negate(), childDerivs[0]); } + +ExpressionTreeNode Operation::Sqrt::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), ExpressionTreeNode(new MultiplyConstant(0.5), + ExpressionTreeNode(new Reciprocal(), + ExpressionTreeNode(new Sqrt(), children[0]))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Exp::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), ExpressionTreeNode(new Exp(), children[0]), childDerivs[0]); +} + +ExpressionTreeNode Operation::Log::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), ExpressionTreeNode(new Reciprocal(), children[0]), childDerivs[0]); +} + +ExpressionTreeNode Operation::Sin::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), ExpressionTreeNode(new Cos(), children[0]), childDerivs[0]); +} + +ExpressionTreeNode Operation::Cos::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Negate(), + ExpressionTreeNode(new Sin(), children[0])), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Sec::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Sec(), children[0]), + ExpressionTreeNode(new Tan(), children[0])), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Csc::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Negate(), + ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Csc(), children[0]), + ExpressionTreeNode(new Cot(), children[0]))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Tan::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Square(), + ExpressionTreeNode(new Sec(), children[0])), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Cot::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Negate(), + ExpressionTreeNode(new Square(), + ExpressionTreeNode(new Csc(), children[0]))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Asin::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Reciprocal(), + ExpressionTreeNode(new Sqrt(), + ExpressionTreeNode(new Subtract(), + ExpressionTreeNode(new Constant(1.0)), + ExpressionTreeNode(new Square(), children[0])))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Acos::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Negate(), + ExpressionTreeNode(new Reciprocal(), + ExpressionTreeNode(new Sqrt(), + ExpressionTreeNode(new Subtract(), + ExpressionTreeNode(new Constant(1.0)), + ExpressionTreeNode(new Square(), children[0]))))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Atan::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Reciprocal(), + ExpressionTreeNode(new AddConstant(1.0), + ExpressionTreeNode(new Square(), children[0]))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Sinh::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), ExpressionTreeNode(new Cosh(), children[0]), childDerivs[0]); +} + +ExpressionTreeNode Operation::Cosh::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), ExpressionTreeNode(new Sinh(), children[0]), childDerivs[0]); +} + +ExpressionTreeNode Operation::Tanh::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Subtract(), + ExpressionTreeNode(new Constant(1.0)), + ExpressionTreeNode(new Square(), + ExpressionTreeNode(new Tanh(), children[0]))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Erf::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Constant(2.0 / sqrt(M_PI))), + ExpressionTreeNode(new Exp(), + ExpressionTreeNode(new Negate(), + ExpressionTreeNode(new Square(), children[0])))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Erfc::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Constant(-2.0 / sqrt(M_PI))), + ExpressionTreeNode(new Exp(), + ExpressionTreeNode(new Negate(), + ExpressionTreeNode(new Square(), children[0])))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Step::differentiate(const std::vector& /*children*/, const std::vector& /*childDerivs*/, + const std::string& /*variable*/) const { return ExpressionTreeNode(new Constant(0.0)); } + +ExpressionTreeNode Operation::Delta::differentiate(const std::vector& /*children*/, const std::vector& /*childDerivs*/, + const std::string& /*variable*/) const { return ExpressionTreeNode(new Constant(0.0)); } + +ExpressionTreeNode Operation::Square::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new MultiplyConstant(2.0), + children[0]), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Cube::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new MultiplyConstant(3.0), + ExpressionTreeNode(new Square(), children[0])), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Reciprocal::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), + ExpressionTreeNode(new Negate(), + ExpressionTreeNode(new Reciprocal(), + ExpressionTreeNode(new Square(), children[0]))), + childDerivs[0]); +} + +ExpressionTreeNode Operation::AddConstant::differentiate(const std::vector& /*children*/, + const std::vector& childDerivs, const std::string& /*variable*/) const +{ + return childDerivs[0]; +} + +ExpressionTreeNode Operation::MultiplyConstant::differentiate(const std::vector& /*children*/, + const std::vector& childDerivs, const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new MultiplyConstant(value), childDerivs[0]); +} + +ExpressionTreeNode Operation::PowerConstant::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + return ExpressionTreeNode(new Multiply(), ExpressionTreeNode(new MultiplyConstant(value), ExpressionTreeNode(new PowerConstant(value - 1), children[0])), + childDerivs[0]); +} + +ExpressionTreeNode Operation::Min::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + const ExpressionTreeNode step(new Step(), ExpressionTreeNode(new Subtract(), children[0], children[1])); + return ExpressionTreeNode(new Subtract(), + ExpressionTreeNode(new Multiply(), childDerivs[1], step), + ExpressionTreeNode(new Multiply(), childDerivs[0], + ExpressionTreeNode(new AddConstant(-1), step))); +} + +ExpressionTreeNode Operation::Max::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + const ExpressionTreeNode step(new Step(), ExpressionTreeNode(new Subtract(), children[0], children[1])); + return ExpressionTreeNode(new Subtract(), + ExpressionTreeNode(new Multiply(), childDerivs[0], step), + ExpressionTreeNode(new Multiply(), childDerivs[1], + ExpressionTreeNode(new AddConstant(-1), step))); +} + +ExpressionTreeNode Operation::Abs::differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& /*variable*/) const +{ + const ExpressionTreeNode step(new Step(), children[0]); + return ExpressionTreeNode(new Multiply(), childDerivs[0], ExpressionTreeNode(new AddConstant(-1), ExpressionTreeNode(new MultiplyConstant(2), step))); +} diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Operation.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Operation.h new file mode 100644 index 0000000..6851a85 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Operation.h @@ -0,0 +1,1017 @@ +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009-2013 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ +#pragma once + +#include "windowsIncludes.h" +#include "CustomFunction.h" +#include "Exception.h" +#include +#include +#include +#include +#include +#include + +namespace Lepton +{ + class ExpressionTreeNode; + + /** + * An Operation represents a single step in the evaluation of an expression, such as a function, + * an operator, or a constant value. Each Operation takes some number of values as arguments + * and produces a single value. + * + * This is an abstract class with subclasses for specific operations. + */ + + class LEPTON_EXPORT Operation + { + public: + virtual ~Operation() { } + /** + * This enumeration lists all Operation subclasses. This is provided so that switch statements + * can be used when processing or analyzing parsed expressions. + */ + enum Id + { + CONSTANT, VARIABLE, CUSTOM, ADD, SUBTRACT, MULTIPLY, DIVIDE, POWER, NEGATE, SQRT, EXP, LOG, + SIN, COS, SEC, CSC, TAN, COT, ASIN, ACOS, ATAN, SINH, COSH, TANH, ERF, ERFC, STEP, DELTA, SQUARE, CUBE, RECIPROCAL, + ADD_CONSTANT, MULTIPLY_CONSTANT, POWER_CONSTANT, MIN, MAX, ABS + }; + /** + * Get the name of this Operation. + */ + virtual std::string getName() const = 0; + /** + * Get this Operation's ID. + */ + virtual Id getId() const = 0; + /** + * Get the number of arguments this operation expects. + */ + virtual int getNumArguments() const = 0; + /** + * Create a clone of this Operation. + */ + virtual Operation* clone() const = 0; + /** + * Perform the computation represented by this operation. + * + * @param args the array of arguments + * @param variables a map containing the values of all variables + * @return the result of performing the computation. + */ + virtual double evaluate(double* args, const std::map& variables) const = 0; + /** + * Return an ExpressionTreeNode which represents the analytic derivative of this Operation with respect to a variable. + * + * @param children the child nodes + * @param childDerivs the derivatives of the child nodes with respect to the variable + * @param variable the variable with respect to which the derivate should be taken + */ + virtual ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const = 0; + /** + * Get whether this operation should be displayed with infix notation. + */ + virtual bool isInfixOperator() const { return false; } + /** + * Get whether this is a symmetric binary operation, such that exchanging its arguments + * does not affect the result. + */ + virtual bool isSymmetric() const { return false; } + + virtual bool operator!=(const Operation& op) const { return op.getId() != getId(); } + + virtual bool operator==(const Operation& op) const { return !(*this != op); } + + class Constant; + class Variable; + class Custom; + class Add; + class Subtract; + class Multiply; + class Divide; + class Power; + class Negate; + class Sqrt; + class Exp; + class Log; + class Sin; + class Cos; + class Sec; + class Csc; + class Tan; + class Cot; + class Asin; + class Acos; + class Atan; + class Sinh; + class Cosh; + class Tanh; + class Erf; + class Erfc; + class Step; + class Delta; + class Square; + class Cube; + class Reciprocal; + class AddConstant; + class MultiplyConstant; + class PowerConstant; + class Min; + class Max; + class Abs; + }; + + class LEPTON_EXPORT Operation::Constant final : public Operation + { + public: + Constant(double value) : value(value) { } + + std::string getName() const override + { + std::stringstream name; + name << value; + return name.str(); + } + + Id getId() const override { return CONSTANT; } + + int getNumArguments() const override { return 0; } + + Operation* clone() const override { return new Constant(value); } + + double evaluate(double* /*args*/, const std::map& /*variables*/) const override { return value; } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + + double getValue() const { return value; } + + bool operator!=(const Operation& op) const override + { + const Constant* o = dynamic_cast(&op); + return (o == nullptr || o->value != value); + } + + private: + double value = 0; + }; + + class LEPTON_EXPORT Operation::Variable final : public Operation + { + public: + Variable(const std::string& name) : name(name) { } + + std::string getName() const override { return name; } + + Id getId() const override { return VARIABLE; } + + int getNumArguments() const override { return 0; } + + Operation* clone() const override { return new Variable(name); } + + double evaluate(double* /*args*/, const std::map& variables) const override + { + const auto iter = variables.find(name); + if (iter == variables.end()) { throw Exception("No value specified for variable " + name); } + return iter->second; + } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + + bool operator!=(const Operation& op) const override + { + const Variable* o = dynamic_cast(&op); + return (o == nullptr || o->name != name); + } + + private: + std::string name; + }; + + class LEPTON_EXPORT Operation::Custom final : public Operation + { + public: + Custom(const std::string& name, CustomFunction* function) : name(name), function(function), derivOrder(function->getNumArguments(), 0) { } + + Custom(const Custom& base, int derivIndex) : name(base.name), function(base.function->clone()), isDerivative(true), derivOrder(base.derivOrder) + { + derivOrder[derivIndex]++; + } + + ~Custom() override { delete function; } + + std::string getName() const override { return name; } + + Id getId() const override { return CUSTOM; } + + int getNumArguments() const override { return function->getNumArguments(); } + + Operation* clone() const override + { + Custom* clone = new Custom(name, function->clone()); + clone->isDerivative = isDerivative; + clone->derivOrder = derivOrder; + return clone; + } + + double evaluate(double* args, const std::map& /*variables*/) const override + { + if (isDerivative) { return function->evaluateDerivative(args, &derivOrder[0]); } + return function->evaluate(args); + } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + + const std::vector& getDerivOrder() const { return derivOrder; } + + bool operator!=(const Operation& op) const override + { + const Custom* o = dynamic_cast(&op); + return (o == nullptr || o->name != name || o->isDerivative != isDerivative || o->derivOrder != derivOrder); + } + + private: + std::string name; + CustomFunction* function = nullptr; + bool isDerivative = false; + std::vector derivOrder; + }; + + class LEPTON_EXPORT Operation::Add final : public Operation + { + public: + Add() { } + + std::string getName() const override { return "+"; } + + Id getId() const override { return ADD; } + + int getNumArguments() const override { return 2; } + + Operation* clone() const override { return new Add(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return args[0] + args[1]; } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + + bool isInfixOperator() const override { return true; } + + bool isSymmetric() const override { return true; } + }; + + class LEPTON_EXPORT Operation::Subtract final : public Operation + { + public: + Subtract() { } + + std::string getName() const override { return "-"; } + + Id getId() const override { return SUBTRACT; } + + int getNumArguments() const override { return 2; } + + Operation* clone() const override { return new Subtract(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return args[0] - args[1]; } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + + bool isInfixOperator() const override { return true; } + }; + + class LEPTON_EXPORT Operation::Multiply final : public Operation + { + public: + Multiply() { } + + std::string getName() const override { return "*"; } + + Id getId() const override { return MULTIPLY; } + + int getNumArguments() const override { return 2; } + + Operation* clone() const override { return new Multiply(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return args[0] * args[1]; } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + + bool isInfixOperator() const override { return true; } + + bool isSymmetric() const override { return true; } + }; + + class LEPTON_EXPORT Operation::Divide final : public Operation + { + public: + Divide() { } + + std::string getName() const override { return "/"; } + + Id getId() const override { return DIVIDE; } + + int getNumArguments() const override { return 2; } + + Operation* clone() const override { return new Divide(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return args[0] / args[1]; } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + + bool isInfixOperator() const override { return true; } + }; + + class LEPTON_EXPORT Operation::Power final : public Operation + { + public: + Power() { } + + std::string getName() const override { return "^"; } + + Id getId() const override { return POWER; } + + int getNumArguments() const override { return 2; } + + Operation* clone() const override { return new Power(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return std::pow(args[0], args[1]); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + + bool isInfixOperator() const override { return true; } + }; + + class LEPTON_EXPORT Operation::Negate final : public Operation + { + public: + Negate() { } + + std::string getName() const override { return "-"; } + + Id getId() const override { return NEGATE; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Negate(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return -args[0]; } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Sqrt final : public Operation + { + public: + Sqrt() { } + + std::string getName() const override { return "sqrt"; } + + Id getId() const override { return SQRT; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Sqrt(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return std::sqrt(args[0]); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Exp final : public Operation + { + public: + Exp() { } + + std::string getName() const override { return "exp"; } + + Id getId() const override { return EXP; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Exp(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return std::exp(args[0]); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Log final : public Operation + { + public: + Log() { } + + std::string getName() const override { return "log"; } + + Id getId() const override { return LOG; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Log(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return std::log(args[0]); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Sin final : public Operation + { + public: + Sin() { } + + std::string getName() const override { return "sin"; } + + Id getId() const override { return SIN; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Sin(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return std::sin(args[0]); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Cos final : public Operation + { + public: + Cos() { } + + std::string getName() const override { return "cos"; } + + Id getId() const override { return COS; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Cos(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return std::cos(args[0]); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Sec final : public Operation + { + public: + Sec() { } + + std::string getName() const override { return "sec"; } + + Id getId() const override { return SEC; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Sec(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return 1.0 / std::cos(args[0]); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Csc final : public Operation + { + public: + Csc() { } + + std::string getName() const override { return "csc"; } + + Id getId() const override { return CSC; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Csc(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return 1.0 / std::sin(args[0]); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Tan final : public Operation + { + public: + Tan() { } + + std::string getName() const override { return "tan"; } + + Id getId() const override { return TAN; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Tan(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return std::tan(args[0]); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Cot final : public Operation + { + public: + Cot() { } + + std::string getName() const override { return "cot"; } + + Id getId() const override { return COT; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Cot(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return 1.0 / std::tan(args[0]); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Asin final : public Operation + { + public: + Asin() { } + + std::string getName() const override { return "asin"; } + + Id getId() const override { return ASIN; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Asin(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return std::asin(args[0]); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Acos final : public Operation + { + public: + Acos() { } + + std::string getName() const override { return "acos"; } + + Id getId() const override { return ACOS; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Acos(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return std::acos(args[0]); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Atan final : public Operation + { + public: + Atan() { } + + std::string getName() const override { return "atan"; } + + Id getId() const override { return ATAN; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Atan(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return std::atan(args[0]); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Sinh final : public Operation + { + public: + Sinh() { } + + std::string getName() const override { return "sinh"; } + + Id getId() const override { return SINH; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Sinh(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return std::sinh(args[0]); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Cosh final : public Operation + { + public: + Cosh() { } + + std::string getName() const override { return "cosh"; } + + Id getId() const override { return COSH; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Cosh(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return std::cosh(args[0]); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Tanh final : public Operation + { + public: + Tanh() { } + + std::string getName() const override { return "tanh"; } + + Id getId() const override { return TANH; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Tanh(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return std::tanh(args[0]); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Erf final : public Operation + { + public: + Erf() { } + + std::string getName() const override { return "erf"; } + + Id getId() const override { return ERF; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Erf(); } + + double evaluate(double* args, const std::map& variables) const override; + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Erfc final : public Operation + { + public: + Erfc() { } + + std::string getName() const override { return "erfc"; } + + Id getId() const override { return ERFC; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Erfc(); } + + double evaluate(double* args, const std::map& variables) const override; + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Step final : public Operation + { + public: + Step() { } + + std::string getName() const override { return "step"; } + + Id getId() const override { return STEP; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Step(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return (args[0] >= 0.0 ? 1.0 : 0.0); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Delta final : public Operation + { + public: + Delta() { } + + std::string getName() const override { return "delta"; } + + Id getId() const override { return DELTA; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Delta(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return (args[0] == 0.0 ? 1.0 : 0.0); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Square final : public Operation + { + public: + Square() { } + + std::string getName() const override { return "square"; } + + Id getId() const override { return SQUARE; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Square(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return args[0] * args[0]; } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Cube final : public Operation + { + public: + Cube() { } + + std::string getName() const override { return "cube"; } + + Id getId() const override { return CUBE; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Cube(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return args[0] * args[0] * args[0]; } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Reciprocal final : public Operation + { + public: + Reciprocal() { } + + std::string getName() const override { return "recip"; } + + Id getId() const override { return RECIPROCAL; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Reciprocal(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return 1.0 / args[0]; } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::AddConstant final : public Operation + { + public: + AddConstant(double value) : value(value) { } + + std::string getName() const override + { + std::stringstream name; + name << value << "+"; + return name.str(); + } + + Id getId() const override { return ADD_CONSTANT; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new AddConstant(value); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return args[0] + value; } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + + double getValue() const { return value; } + + bool operator!=(const Operation& op) const override + { + const AddConstant* o = dynamic_cast(&op); + return (o == nullptr || o->value != value); + } + + private: + double value = 0; + }; + + class LEPTON_EXPORT Operation::MultiplyConstant final : public Operation + { + public: + MultiplyConstant(double value) : value(value) { } + + std::string getName() const override + { + std::stringstream name; + name << value << "*"; + return name.str(); + } + + Id getId() const override { return MULTIPLY_CONSTANT; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new MultiplyConstant(value); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return args[0] * value; } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + + double getValue() const { return value; } + + bool operator!=(const Operation& op) const override + { + const MultiplyConstant* o = dynamic_cast(&op); + return (o == nullptr || o->value != value); + } + + private: + double value = 0; + }; + + class LEPTON_EXPORT Operation::PowerConstant final : public Operation + { + public: + PowerConstant(double value) : value(value) + { + intValue = int(value); + isIntPower = (intValue == value); + } + + std::string getName() const override + { + std::stringstream name; + name << "^" << value; + return name.str(); + } + + Id getId() const override { return POWER_CONSTANT; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new PowerConstant(value); } + + double evaluate(double* args, const std::map& /*variables*/) const override + { + if (isIntPower) + { + // Integer powers can be computed much more quickly by repeated multiplication. + + int exponent = intValue; + double base = args[0]; + if (exponent < 0) + { + exponent = -exponent; + base = 1.0 / base; + } + double result = 1.0; + while (exponent != 0) + { + if ((exponent & 1) == 1) { result *= base; } + base *= base; + exponent = exponent >> 1; + } + return result; + } + return std::pow(args[0], value); + } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + + double getValue() const { return value; } + + bool operator!=(const Operation& op) const override + { + const PowerConstant* o = dynamic_cast(&op); + return (o == nullptr || o->value != value); + } + + bool isInfixOperator() const override { return true; } + + private: + double value = 0; + int intValue = 0; + bool isIntPower; + }; + + class LEPTON_EXPORT Operation::Min final : public Operation + { + public: + Min() { } + + std::string getName() const override { return "min"; } + + Id getId() const override { return MIN; } + + int getNumArguments() const override { return 2; } + + Operation* clone() const override { return new Min(); } + + double evaluate(double* args, const std::map& /*variables*/) const override + { + // parens around (std::min) are workaround for horrible microsoft max/min macro trouble + return (std::min)(args[0], args[1]); + } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Max final : public Operation + { + public: + Max() { } + + std::string getName() const override { return "max"; } + + Id getId() const override { return MAX; } + + int getNumArguments() const override { return 2; } + + Operation* clone() const override { return new Max(); } + + double evaluate(double* args, const std::map& /*variables*/) const override + { + // parens around (std::min) are workaround for horrible microsoft max/min macro trouble + return (std::max)(args[0], args[1]); + } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; + + class LEPTON_EXPORT Operation::Abs final : public Operation + { + public: + Abs() { } + + std::string getName() const override { return "abs"; } + + Id getId() const override { return ABS; } + + int getNumArguments() const override { return 1; } + + Operation* clone() const override { return new Abs(); } + + double evaluate(double* args, const std::map& /*variables*/) const override { return std::abs(args[0]); } + + ExpressionTreeNode differentiate(const std::vector& children, const std::vector& childDerivs, + const std::string& variable) const override; + }; +} // namespace Lepton diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ParsedExpression.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ParsedExpression.cpp new file mode 100644 index 0000000..d707cb9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ParsedExpression.cpp @@ -0,0 +1,370 @@ +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "ParsedExpression.h" +#include "CompiledExpression.h" +#include "ExpressionProgram.h" +#include "Operation.h" +#include +#include + +using namespace Lepton; + +ParsedExpression::ParsedExpression() : rootNode(ExpressionTreeNode()) {} + +ParsedExpression::ParsedExpression(const ExpressionTreeNode& rootNode) : rootNode(rootNode) {} + +const ExpressionTreeNode& ParsedExpression::getRootNode() const { return rootNode; } + +double ParsedExpression::evaluate() const { return evaluate(getRootNode(), std::map()); } + +double ParsedExpression::evaluate(const std::map& variables) const { return evaluate(getRootNode(), variables); } + +double ParsedExpression::evaluate(const ExpressionTreeNode& node, const std::map& variables) +{ + size_t numArgs = node.getChildren().size(); + std::vector args(std::max(numArgs, size_t(1))); + for (size_t i = 0; i < numArgs; ++i) { args[i] = evaluate(node.getChildren()[i], variables); } + return node.getOperation().evaluate(&args[0], variables); +} + +ParsedExpression ParsedExpression::optimize() const +{ + ExpressionTreeNode result = precalculateConstantSubexpressions(getRootNode()); + while (true) + { + ExpressionTreeNode simplified = substituteSimplerExpression(result); + if (simplified == result) { break; } + result = simplified; + } + return ParsedExpression(result); +} + +ParsedExpression ParsedExpression::optimize(const std::map& variables) const +{ + ExpressionTreeNode result = preevaluateVariables(getRootNode(), variables); + result = precalculateConstantSubexpressions(result); + while (true) + { + ExpressionTreeNode simplified = substituteSimplerExpression(result); + if (simplified == result) { break; } + result = simplified; + } + return ParsedExpression(result); +} + +ExpressionTreeNode ParsedExpression::preevaluateVariables(const ExpressionTreeNode& node, const std::map& variables) +{ + if (node.getOperation().getId() == Operation::VARIABLE) + { + const Operation::Variable& var = dynamic_cast(node.getOperation()); + auto iter = variables.find(var.getName()); + if (iter == variables.end()) { return node; } + return ExpressionTreeNode(new Operation::Constant(iter->second)); + } + std::vector children(node.getChildren().size()); + for (size_t i = 0; i < children.size(); ++i) { children[i] = preevaluateVariables(node.getChildren()[i], variables); } + return ExpressionTreeNode(node.getOperation().clone(), children); +} + +ExpressionTreeNode ParsedExpression::precalculateConstantSubexpressions(const ExpressionTreeNode& node) +{ + std::vector children(node.getChildren().size()); + for (size_t i = 0; i < children.size(); ++i) { children[i] = precalculateConstantSubexpressions(node.getChildren()[i]); } + ExpressionTreeNode result = ExpressionTreeNode(node.getOperation().clone(), children); + if (node.getOperation().getId() == Operation::VARIABLE) { return result; } + for (size_t i = 0; i < children.size(); ++i) { if (children[i].getOperation().getId() != Operation::CONSTANT) { return result; } } + return ExpressionTreeNode(new Operation::Constant(evaluate(result, std::map()))); +} + +ExpressionTreeNode ParsedExpression::substituteSimplerExpression(const ExpressionTreeNode& node) +{ + std::vector childs(node.getChildren().size()); + for (size_t i = 0; i < childs.size(); ++i) { childs[i] = substituteSimplerExpression(node.getChildren()[i]); } + Operation::Id op1 = childs[0].getOperation().getId(); + Operation::Id op2 = childs[1].getOperation().getId(); + switch (node.getOperation().getId()) + { + case Operation::ADD: + { + const double first = getConstantValue(childs[0]); + const double second = getConstantValue(childs[1]); + if (first == 0.0) { return childs[1]; } // Add 0 + if (second == 0.0) { return childs[0]; } // Add 0 + if (first == first) { return ExpressionTreeNode(new Operation::AddConstant(first), childs[1]); } // Add a constant + if (second == second) { return ExpressionTreeNode(new Operation::AddConstant(second), childs[0]); } // Add a constant + if (op2 == Operation::NEGATE) { return ExpressionTreeNode(new Operation::Subtract(), childs[0], childs[1].getChildren()[0]); } // a+(-b) = a-b + if (op1 == Operation::NEGATE) { return ExpressionTreeNode(new Operation::Subtract(), childs[1], childs[0].getChildren()[0]); } // (-a)+b = b-a + break; + } + case Operation::SUBTRACT: + { + if (childs[0] == childs[1]) { return ExpressionTreeNode(new Operation::Constant(0.0)); } // Subtracting anything from itself is 0 + const double first = getConstantValue(childs[0]); + if (first == 0.0) { return ExpressionTreeNode(new Operation::Negate(), childs[1]); } // Subtract from 0 + const double second = getConstantValue(childs[1]); + if (second == 0.0) { return childs[0]; } // Subtract 0 + if (second == second) { return ExpressionTreeNode(new Operation::AddConstant(-second), childs[0]); } // Subtract a constant + if (op2 == Operation::NEGATE) { return ExpressionTreeNode(new Operation::Add(), childs[0], childs[1].getChildren()[0]); } // a-(-b) = a+b + break; + } + case Operation::MULTIPLY: + { + double first = getConstantValue(childs[0]); + double second = getConstantValue(childs[1]); + if (first == 0.0 || second == 0.0) { return ExpressionTreeNode(new Operation::Constant(0.0)); } // Multiply by 0 + if (first == 1.0) { return childs[1]; } // Multiply by 1 + if (second == 1.0) { return childs[0]; } // Multiply by 1 + if (op1 == Operation::CONSTANT) + { // Multiply by a constant + if (op2 == Operation::MULTIPLY_CONSTANT) + { // Combine two multiplies into a single one + return ExpressionTreeNode( + new Operation::MultiplyConstant(first * dynamic_cast(&childs[1].getOperation())->getValue()), + childs[1].getChildren()[0]); + } + return ExpressionTreeNode(new Operation::MultiplyConstant(first), childs[1]); + } + if (op2 == Operation::CONSTANT) + { // Multiply by a constant + if (op1 == Operation::MULTIPLY_CONSTANT) + { // Combine two multiplies into a single one + return ExpressionTreeNode( + new Operation::MultiplyConstant(second * dynamic_cast(&childs[0].getOperation())->getValue()), + childs[0].getChildren()[0]); + } + return ExpressionTreeNode(new Operation::MultiplyConstant(second), childs[0]); + } + if (op1 == Operation::NEGATE && op2 == Operation::NEGATE) + { // The two negations cancel + return ExpressionTreeNode(new Operation::Multiply(), childs[0].getChildren()[0], childs[1].getChildren()[0]); + } + if (op1 == Operation::NEGATE && op2 == Operation::MULTIPLY_CONSTANT) + { // Negate the constant + return ExpressionTreeNode(new Operation::Multiply(), childs[0].getChildren()[0], + ExpressionTreeNode( + new Operation::MultiplyConstant( + -dynamic_cast(&childs[1].getOperation())->getValue()), + childs[1].getChildren()[0])); + } + if (op2 == Operation::NEGATE && op1 == Operation::MULTIPLY_CONSTANT) + { // Negate the constant + return ExpressionTreeNode(new Operation::Multiply(), + ExpressionTreeNode( + new Operation::MultiplyConstant( + -dynamic_cast(&childs[0].getOperation())->getValue()), + childs[0].getChildren()[0]), childs[1].getChildren()[0]); + } + if (op1 == Operation::NEGATE) + { // Pull the negation out so it can possibly be optimized further + return ExpressionTreeNode(new Operation::Negate(), ExpressionTreeNode(new Operation::Multiply(), childs[0].getChildren()[0], childs[1])); + } + if (op2 == Operation::NEGATE) + { // Pull the negation out so it can possibly be optimized further + return ExpressionTreeNode(new Operation::Negate(), ExpressionTreeNode(new Operation::Multiply(), childs[0], childs[1].getChildren()[0])); + } + if (op2 == Operation::RECIPROCAL) { return ExpressionTreeNode(new Operation::Divide(), childs[0], childs[1].getChildren()[0]); } // a*(1/b) = a/b + if (op1 == Operation::RECIPROCAL) { return ExpressionTreeNode(new Operation::Divide(), childs[1], childs[0].getChildren()[0]); } // (1/a)*b = b/a + if (childs[0] == childs[1]) { return ExpressionTreeNode(new Operation::Square(), childs[0]); } // x*x = square(x) + if (op1 == Operation::SQUARE && childs[0].getChildren()[0] == childs[1]) { return ExpressionTreeNode(new Operation::Cube(), childs[1]); } // x^3 + if (op2 == Operation::SQUARE && childs[1].getChildren()[0] == childs[0]) { return ExpressionTreeNode(new Operation::Cube(), childs[0]); } // x^3 + break; + } + case Operation::DIVIDE: + { + if (childs[0] == childs[1]) { return ExpressionTreeNode(new Operation::Constant(1.0)); } // Dividing anything from itself is 0 + const double numerator = getConstantValue(childs[0]); + if (numerator == 0.0) { return ExpressionTreeNode(new Operation::Constant(0.0)); } // 0 divided by something + if (numerator == 1.0) { return ExpressionTreeNode(new Operation::Reciprocal(), childs[1]); } // 1 divided by something + const double denominator = getConstantValue(childs[1]); + if (denominator == 1.0) { return childs[0]; } // Divide by 1 + if (op2 == Operation::CONSTANT) + { + if (op1 == Operation::MULTIPLY_CONSTANT) + { // Combine a multiply and a divide into one multiply + return ExpressionTreeNode(new Operation::MultiplyConstant + (dynamic_cast(&childs[0].getOperation())->getValue() / denominator), + childs[0].getChildren()[0]); + } + return ExpressionTreeNode(new Operation::MultiplyConstant(1.0 / denominator), childs[0]); // Replace a divide with a multiply + } + if (op1 == Operation::NEGATE && op2 == Operation::NEGATE) + { // The two negations cancel + return ExpressionTreeNode(new Operation::Divide(), childs[0].getChildren()[0], childs[1].getChildren()[0]); + } + if (op2 == Operation::NEGATE && op1 == Operation::MULTIPLY_CONSTANT) + { // Negate the constant + return ExpressionTreeNode(new Operation::Divide(), ExpressionTreeNode( + new Operation::MultiplyConstant( + -dynamic_cast(&childs[0].getOperation())->getValue()), + childs[0].getChildren()[0]), childs[1].getChildren()[0]); + } + if (op1 == Operation::NEGATE) + { // Pull the negation out so it can possibly be optimized further + return ExpressionTreeNode(new Operation::Negate(), ExpressionTreeNode(new Operation::Divide(), childs[0].getChildren()[0], childs[1])); + } + if (op2 == Operation::NEGATE) + { // Pull the negation out so it can possibly be optimized further + return ExpressionTreeNode(new Operation::Negate(), ExpressionTreeNode(new Operation::Divide(), childs[0], childs[1].getChildren()[0])); + } + if (childs[1].getOperation().getId() == Operation::RECIPROCAL) + { // a/(1/b) = a*b + return ExpressionTreeNode(new Operation::Multiply(), childs[0], childs[1].getChildren()[0]); + } + break; + } + case Operation::POWER: + { + double base = getConstantValue(childs[0]); + if (base == 0.0) { return ExpressionTreeNode(new Operation::Constant(0.0)); } // 0 to any power is 0 + if (base == 1.0) { return ExpressionTreeNode(new Operation::Constant(1.0)); } // 1 to any power is 1 + double exponent = getConstantValue(childs[1]); + if (exponent == 0.0) { return ExpressionTreeNode(new Operation::Constant(1.0)); } // x^0 = 1 + if (exponent == 1.0) { return childs[0]; } // x^1 = x + if (exponent == -1.0) { return ExpressionTreeNode(new Operation::Reciprocal(), childs[0]); } // x^-1 = recip(x) + if (exponent == 2.0) { return ExpressionTreeNode(new Operation::Square(), childs[0]); } // x^2 = square(x) + if (exponent == 3.0) { return ExpressionTreeNode(new Operation::Cube(), childs[0]); } // x^3 = cube(x) + if (exponent == 0.5) { return ExpressionTreeNode(new Operation::Sqrt(), childs[0]); } // x^0.5 = sqrt(x) + if (exponent == exponent) { return ExpressionTreeNode(new Operation::PowerConstant(exponent), childs[0]); } // Constant power + break; + } + case Operation::NEGATE: + { + if (op1 == Operation::MULTIPLY_CONSTANT) + { // Combine a multiply and a negate into a single multiply + return ExpressionTreeNode( + new Operation::MultiplyConstant(-dynamic_cast(&childs[0].getOperation())->getValue()), + childs[0].getChildren()[0]); + } + if (op1 == Operation::CONSTANT) { return ExpressionTreeNode(new Operation::Constant(-getConstantValue(childs[0]))); } // Negate a constant + if (op1 == Operation::NEGATE) { return childs[0].getChildren()[0]; } // The two negations cancel + break; + } + case Operation::MULTIPLY_CONSTANT: + { + if (op1 == Operation::MULTIPLY_CONSTANT) + { // Combine two multiplies into a single one + return ExpressionTreeNode( + new Operation::MultiplyConstant( + dynamic_cast(&node.getOperation())->getValue() * dynamic_cast(& + childs[0].getOperation())->getValue()), childs[0].getChildren()[0]); + } + if (op1 == Operation::CONSTANT) + { // Multiply two constants + return ExpressionTreeNode( + new Operation::Constant( + dynamic_cast(&node.getOperation())->getValue() * getConstantValue(childs[0]))); + } + if (op1 == Operation::NEGATE) + { // Combine a multiply and a negate into a single multiply + return ExpressionTreeNode(new Operation::MultiplyConstant(-dynamic_cast(&node.getOperation())->getValue()), + childs[0].getChildren()[0]); + } + break; + } + default: + { + // If operation ID is not one of the above, + // we don't substitute a simpler expression. + break; + } + } + return ExpressionTreeNode(node.getOperation().clone(), childs); +} + +ParsedExpression ParsedExpression::differentiate(const std::string& variable) const { return differentiate(getRootNode(), variable); } + +ExpressionTreeNode ParsedExpression::differentiate(const ExpressionTreeNode& node, const std::string& variable) +{ + std::vector childDerivs(node.getChildren().size()); + for (size_t i = 0; i < childDerivs.size(); ++i) { childDerivs[i] = differentiate(node.getChildren()[i], variable); } + return node.getOperation().differentiate(node.getChildren(), childDerivs, variable); +} + +double ParsedExpression::getConstantValue(const ExpressionTreeNode& node) +{ + if (node.getOperation().getId() == Operation::CONSTANT) { return dynamic_cast(node.getOperation()).getValue(); } + return std::numeric_limits::quiet_NaN(); +} + +ExpressionProgram ParsedExpression::createProgram() const { return ExpressionProgram(*this); } + +CompiledExpression ParsedExpression::createCompiledExpression() const { return CompiledExpression(*this); } + +ParsedExpression ParsedExpression::renameVariables(const std::map& replacements) const +{ + return ParsedExpression(renameNodeVariables(getRootNode(), replacements)); +} + +ExpressionTreeNode ParsedExpression::renameNodeVariables(const ExpressionTreeNode& node, const std::map& replacements) +{ + if (node.getOperation().getId() == Operation::VARIABLE) + { + auto replace = replacements.find(node.getOperation().getName()); + if (replace != replacements.end()) { return ExpressionTreeNode(new Operation::Variable(replace->second)); } + } + std::vector children; + for (size_t i = 0; i < node.getChildren().size(); ++i) { children.push_back(renameNodeVariables(node.getChildren()[i], replacements)); } + return ExpressionTreeNode(node.getOperation().clone(), children); +} + +std::ostream& Lepton::operator<<(std::ostream& out, const ExpressionTreeNode& node) +{ + if (node.getOperation().isInfixOperator() && node.getChildren().size() == 2) + { + out << "(" << node.getChildren()[0] << ")" << node.getOperation().getName() << "(" << node.getChildren()[1] << ")"; + } + else if (node.getOperation().isInfixOperator() && node.getChildren().size() == 1) + { + out << "(" << node.getChildren()[0] << ")" << node.getOperation().getName(); + } + else + { + out << node.getOperation().getName(); + if (!node.getChildren().empty()) + { + out << "("; + for (size_t i = 0; i < node.getChildren().size(); ++i) + { + if (i > 0) { out << ", "; } + out << node.getChildren()[i]; + } + out << ")"; + } + } + return out; +} + +std::ostream& Lepton::operator<<(std::ostream& out, const ParsedExpression& exp) +{ + out << exp.getRootNode(); + return out; +} diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ParsedExpression.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ParsedExpression.h new file mode 100644 index 0000000..88152eb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/ParsedExpression.h @@ -0,0 +1,130 @@ +#ifndef LEPTON_PARSED_EXPRESSION_H_ +#define LEPTON_PARSED_EXPRESSION_H_ + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009=2013 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "ExpressionTreeNode.h" +#include "windowsIncludes.h" +#include +#include + +namespace Lepton +{ + class CompiledExpression; + class ExpressionProgram; + + /** + * This class represents the result of parsing an expression. It provides methods for working with the + * expression in various ways, such as evaluating it, getting the tree representation of the expresson, etc. + */ + + class LEPTON_EXPORT ParsedExpression + { + public: + /** + * Create an uninitialized ParsedExpression. This exists so that ParsedExpressions can be put in STL containers. + * Doing anything with it will produce an exception. + */ + ParsedExpression(); + /** + * Create a ParsedExpression. Normally you will not call this directly. Instead, use the Parser class + * to parse expression. + */ + ParsedExpression(const ExpressionTreeNode& rootNode); + /** + * Get the root node of the expression's abstract syntax tree. + */ + const ExpressionTreeNode& getRootNode() const; + /** + * Evaluate the expression. If the expression involves any variables, this method will throw an exception. + */ + double evaluate() const; + /** + * Evaluate the expression. + * + * @param variables a map specifying the values of all variables that appear in the expression. If any + * variable appears in the expression but is not included in this map, an exception + * will be thrown. + */ + double evaluate(const std::map& variables) const; + /** + * Create a new ParsedExpression which produces the same result as this one, but is faster to evaluate. + */ + ParsedExpression optimize() const; + /** + * Create a new ParsedExpression which produces the same result as this one, but is faster to evaluate. + * + * @param variables a map specifying values for a subset of variables that appear in the expression. + * All occurrences of these variables in the expression are replaced with the values + * specified. + */ + ParsedExpression optimize(const std::map& variables) const; + /** + * Create a new ParsedExpression which is the analytic derivative of this expression with respect to a + * particular variable. + * + * @param variable the variable with respect to which the derivate should be taken + */ + ParsedExpression differentiate(const std::string& variable) const; + /** + * Create an ExpressionProgram that represents the same calculation as this expression. + */ + ExpressionProgram createProgram() const; + /** + * Create a CompiledExpression that represents the same calculation as this expression. + */ + CompiledExpression createCompiledExpression() const; + /** + * Create a new ParsedExpression which is identical to this one, except that the names of some + * variables have been changed. + * + * @param replacements a map whose keys are the names of variables, and whose values are the + * new names to replace them with + */ + ParsedExpression renameVariables(const std::map& replacements) const; + private: + static double evaluate(const ExpressionTreeNode& node, const std::map& variables); + static ExpressionTreeNode preevaluateVariables(const ExpressionTreeNode& node, const std::map& variables); + static ExpressionTreeNode precalculateConstantSubexpressions(const ExpressionTreeNode& node); + static ExpressionTreeNode substituteSimplerExpression(const ExpressionTreeNode& node); + static ExpressionTreeNode differentiate(const ExpressionTreeNode& node, const std::string& variable); + static double getConstantValue(const ExpressionTreeNode& node); + static ExpressionTreeNode renameNodeVariables(const ExpressionTreeNode& node, const std::map& replacements); + ExpressionTreeNode rootNode; + }; + + LEPTON_EXPORT std::ostream& operator<<(std::ostream& out, const ExpressionTreeNode& node); + + LEPTON_EXPORT std::ostream& operator<<(std::ostream& out, const ParsedExpression& exp); +} // namespace Lepton + +#endif /*LEPTON_PARSED_EXPRESSION_H_*/ diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Parser.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Parser.cpp new file mode 100644 index 0000000..1a83ee5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Parser.cpp @@ -0,0 +1,388 @@ +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009-2013 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "Parser.h" +#include "CustomFunction.h" +#include "ExpressionTreeNode.h" +#include "Operation.h" +#include "ParsedExpression.h" +#include +#include +#include + +using namespace Lepton; + +static const std::string Digits = "0123456789"; +static const std::string Operators = "+-*/^"; +static const bool LeftAssociative[] = { true, true, true, true, false }; +static const int Precedence[] = { 0, 0, 1, 1, 3 }; +static const Operation::Id OperationId[] = { Operation::ADD, Operation::SUBTRACT, Operation::MULTIPLY, Operation::DIVIDE, Operation::POWER }; + +class Lepton::ParseToken +{ +public: + enum Type { Number, Operator, Variable, Function, LeftParen, RightParen, Comma, Whitespace }; + + ParseToken(std::string text, Type type) : text(text), type(type) { } + + const std::string& getText() const { return text; } + + Type getType() const { return type; } + +private: + std::string text; + Type type; +}; + +std::string Parser::trim(const std::string& expression) +{ + // Remove leading and trailing spaces. + + size_t start, end; + for (start = 0; start < expression.size() && isspace(expression[start]); ++start) { } + for (end = expression.size() - 1; end > start && isspace(expression[end]); end--) { } + if (start == end && isspace(expression[end])) { return ""; } + return expression.substr(start, end - start + 1); +} + +ParseToken Parser::getNextToken(const std::string& expression, size_t start) +{ + char c = expression[start]; + if (c == '(') { return ParseToken("(", ParseToken::LeftParen); } + if (c == ')') { return ParseToken(")", ParseToken::RightParen); } + if (c == ',') { return ParseToken(",", ParseToken::Comma); } + if (Operators.find(c) != std::string::npos) { return ParseToken(std::string(1, c), ParseToken::Operator); } + if (isspace(c)) + { + // White space + + for (size_t pos = start + 1; pos < expression.size(); ++pos) + { + if (!isspace(expression[pos])) { return ParseToken(expression.substr(start, pos - start), ParseToken::Whitespace); } + } + return ParseToken(expression.substr(start, std::string::npos), ParseToken::Whitespace); + } + if (c == '.' || Digits.find(c) != std::string::npos) + { + // A number + + bool foundDecimal = (c == '.'); + bool foundExp = false; + size_t pos = start + 1; + for (; pos < expression.size(); ++pos) + { + c = expression[pos]; + if (Digits.find(c) != std::string::npos) { continue; } + if (c == '.' && !foundDecimal) + { + foundDecimal = true; + continue; + } + if ((c == 'e' || c == 'E') && !foundExp) + { + foundExp = true; + if (pos < expression.size() - 1 && (expression[pos + 1] == '-' || expression[pos + 1] == '+')) { pos++; } + continue; + } + break; + } + return ParseToken(expression.substr(start, pos - start), ParseToken::Number); + } + + // A variable, function, or left parenthesis + + for (size_t pos = start; pos < expression.size(); ++pos) + { + c = expression[pos]; + if (c == '(') { return ParseToken(expression.substr(start, pos - start + 1), ParseToken::Function); } + if (Operators.find(c) != std::string::npos || c == ',' || c == ')' || isspace(c)) + { + return ParseToken(expression.substr(start, pos - start), ParseToken::Variable); + } + } + return ParseToken(expression.substr(start, std::string::npos), ParseToken::Variable); +} + +std::vector Parser::tokenize(const std::string& expression) +{ + std::vector tokens; + size_t pos = 0; + while (pos < expression.size()) + { + ParseToken token = getNextToken(expression, pos); + if (token.getType() != ParseToken::Whitespace) { tokens.push_back(token); } + pos += token.getText().size(); + } + return tokens; +} + +ParsedExpression Parser::parse(const std::string& expression) { return parse(expression, std::map()); } + +ParsedExpression Parser::parse(const std::string& expression, const std::map& customFunctions) +{ + // First split the expression into subexpressions. + + std::string primaryExpression = expression; + std::vector subexpressions; + while (true) + { + std::string::size_type pos = primaryExpression.find_last_of(';'); + if (pos == std::string::npos) { break; } + std::string sub = trim(primaryExpression.substr(pos + 1)); + if (!sub.empty()) { subexpressions.push_back(sub); } + primaryExpression = primaryExpression.substr(0, pos); + } + + // Parse the subexpressions. + + std::map subexpDefs; + for (size_t i = 0; i < subexpressions.size(); ++i) + { + size_t equalsPos = subexpressions[i].find('='); + if (equalsPos == std::string::npos) { throw Exception("Parse error: subexpression does not specify a name"); } + std::string name = trim(subexpressions[i].substr(0, equalsPos)); + if (name.empty()) { throw Exception("Parse error: subexpression does not specify a name"); } + std::vector tokens = tokenize(subexpressions[i].substr(equalsPos + 1)); + size_t pos = 0; + subexpDefs[name] = parsePrecedence(tokens, pos, customFunctions, subexpDefs, 0); + if (pos != tokens.size()) { throw Exception("Parse error: unexpected text at end of subexpression: " + tokens[pos].getText()); } + } + + // Now parse the primary expression. + + std::vector tokens = tokenize(primaryExpression); + size_t pos = 0; + ExpressionTreeNode result = parsePrecedence(tokens, pos, customFunctions, subexpDefs, 0); + if (pos != tokens.size()) { throw Exception("Parse error: unexpected text at end of expression: " + tokens[pos].getText()); } + return ParsedExpression(result); +} + +ExpressionTreeNode Parser::parsePrecedence(const std::vector& tokens, size_t& pos, const std::map& customFunctions, + const std::map& subexpressionDefs, int precedence) +{ + if (pos == tokens.size()) { throw Exception("Parse error: unexpected end of expression"); } + + // Parse the next value (number, variable, function, parenthesized expression) + + ParseToken token = tokens[pos]; + ExpressionTreeNode result; + if (token.getType() == ParseToken::Number) + { + double value; + std::stringstream(token.getText()) >> value; + result = ExpressionTreeNode(new Operation::Constant(value)); + pos++; + } + else if (token.getType() == ParseToken::Variable) + { + const auto subexp = subexpressionDefs.find(token.getText()); + if (subexp == subexpressionDefs.end()) + { + Operation* op = new Operation::Variable(token.getText()); + result = ExpressionTreeNode(op); + } + else { result = subexp->second; } + pos++; + } + else if (token.getType() == ParseToken::LeftParen) + { + pos++; + result = parsePrecedence(tokens, pos, customFunctions, subexpressionDefs, 0); + if (pos == tokens.size() || tokens[pos].getType() != ParseToken::RightParen) { throw Exception("Parse error: unbalanced parentheses"); } + pos++; + } + else if (token.getType() == ParseToken::Function) + { + pos++; + std::vector args; + bool moreArgs; + do + { + args.push_back(parsePrecedence(tokens, pos, customFunctions, subexpressionDefs, 0)); + moreArgs = (pos < tokens.size() && tokens[pos].getType() == ParseToken::Comma); + if (moreArgs) { pos++; } + } while (moreArgs); + if (pos == tokens.size() || tokens[pos].getType() != ParseToken::RightParen) { throw Exception("Parse error: unbalanced parentheses"); } + pos++; + Operation* op = getFunctionOperation(token.getText(), customFunctions); + try { result = ExpressionTreeNode(op, args); } + catch (...) + { + delete op; + throw; + } + } + else if (token.getType() == ParseToken::Operator && token.getText() == "-") + { + pos++; + const ExpressionTreeNode toNegate = parsePrecedence(tokens, pos, customFunctions, subexpressionDefs, 2); + result = ExpressionTreeNode(new Operation::Negate(), toNegate); + } + else { throw Exception("Parse error: unexpected token: " + token.getText()); } + + // Now deal with the next binary operator. + + while (pos < tokens.size() && tokens[pos].getType() == ParseToken::Operator) + { + token = tokens[pos]; + int opIndex = int(Operators.find(token.getText())); + int opPrecedence = Precedence[opIndex]; + if (opPrecedence < precedence) { return result; } + pos++; + ExpressionTreeNode arg = parsePrecedence(tokens, pos, customFunctions, subexpressionDefs, LeftAssociative[opIndex] ? opPrecedence + 1 : opPrecedence); + Operation* op = getOperatorOperation(token.getText()); + try { result = ExpressionTreeNode(op, result, arg); } + catch (...) + { + delete op; + throw; + } + } + return result; +} + +Operation* Parser::getOperatorOperation(const std::string& name) +{ + switch (OperationId[Operators.find(name)]) + { + case Operation::ADD: + return new Operation::Add(); + case Operation::SUBTRACT: + return new Operation::Subtract(); + case Operation::MULTIPLY: + return new Operation::Multiply(); + case Operation::DIVIDE: + return new Operation::Divide(); + case Operation::POWER: + return new Operation::Power(); + default: + throw Exception("Parse error: unknown operator"); + } +} + +Operation* Parser::getFunctionOperation(const std::string& name, const std::map& customFunctions) +{ + static std::map opMap; + if (opMap.empty()) + { + opMap["sqrt"] = Operation::SQRT; + opMap["exp"] = Operation::EXP; + opMap["log"] = Operation::LOG; + opMap["sin"] = Operation::SIN; + opMap["cos"] = Operation::COS; + opMap["sec"] = Operation::SEC; + opMap["csc"] = Operation::CSC; + opMap["tan"] = Operation::TAN; + opMap["cot"] = Operation::COT; + opMap["asin"] = Operation::ASIN; + opMap["acos"] = Operation::ACOS; + opMap["atan"] = Operation::ATAN; + opMap["sinh"] = Operation::SINH; + opMap["cosh"] = Operation::COSH; + opMap["tanh"] = Operation::TANH; + opMap["erf"] = Operation::ERF; + opMap["erfc"] = Operation::ERFC; + opMap["step"] = Operation::STEP; + opMap["delta"] = Operation::DELTA; + opMap["square"] = Operation::SQUARE; + opMap["cube"] = Operation::CUBE; + opMap["recip"] = Operation::RECIPROCAL; + opMap["min"] = Operation::MIN; + opMap["max"] = Operation::MAX; + opMap["abs"] = Operation::ABS; + } + const std::string trimmed = name.substr(0, name.size() - 1); + + // First check custom functions. + + const auto custom = customFunctions.find(trimmed); + if (custom != customFunctions.end()) { return new Operation::Custom(trimmed, custom->second->clone()); } + + // Now try standard functions. + + const auto iter = opMap.find(trimmed); + if (iter == opMap.end()) { throw Exception("Parse error: unknown function: " + trimmed); } + switch (iter->second) + { + case Operation::SQRT: + return new Operation::Sqrt(); + case Operation::EXP: + return new Operation::Exp(); + case Operation::LOG: + return new Operation::Log(); + case Operation::SIN: + return new Operation::Sin(); + case Operation::COS: + return new Operation::Cos(); + case Operation::SEC: + return new Operation::Sec(); + case Operation::CSC: + return new Operation::Csc(); + case Operation::TAN: + return new Operation::Tan(); + case Operation::COT: + return new Operation::Cot(); + case Operation::ASIN: + return new Operation::Asin(); + case Operation::ACOS: + return new Operation::Acos(); + case Operation::ATAN: + return new Operation::Atan(); + case Operation::SINH: + return new Operation::Sinh(); + case Operation::COSH: + return new Operation::Cosh(); + case Operation::TANH: + return new Operation::Tanh(); + case Operation::ERF: + return new Operation::Erf(); + case Operation::ERFC: + return new Operation::Erfc(); + case Operation::STEP: + return new Operation::Step(); + case Operation::DELTA: + return new Operation::Delta(); + case Operation::SQUARE: + return new Operation::Square(); + case Operation::CUBE: + return new Operation::Cube(); + case Operation::RECIPROCAL: + return new Operation::Reciprocal(); + case Operation::MIN: + return new Operation::Min(); + case Operation::MAX: + return new Operation::Max(); + case Operation::ABS: + return new Operation::Abs(); + default: + throw Exception("Parse error: unknown function"); + } +} diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Parser.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Parser.h new file mode 100644 index 0000000..62e92db --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/Parser.h @@ -0,0 +1,79 @@ +#ifndef LEPTON_PARSER_H_ +#define LEPTON_PARSER_H_ + +/* -------------------------------------------------------------------------- * + * Lepton * + * -------------------------------------------------------------------------- * + * This is part of the Lepton expression parser originating from * + * Simbios, the NIH National Center for Physics-Based Simulation of * + * Biological Structures at Stanford, funded under the NIH Roadmap for * + * Medical Research, grant U54 GM072970. See https://simtk.org. * + * * + * Portions copyright (c) 2009 Stanford University and the Authors. * + * Authors: Peter Eastman * + * Contributors: * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the "Software"), * + * to deal in the Software without restriction, including without limitation * + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * + * and/or sell copies of the Software, and to permit persons to whom the * + * Software is furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included in * + * all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * + * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * + * USE OR OTHER DEALINGS IN THE SOFTWARE. * + * -------------------------------------------------------------------------- */ + +#include "windowsIncludes.h" +#include +#include +#include + +namespace Lepton +{ + class CustomFunction; + class ExpressionTreeNode; + class Operation; + class ParsedExpression; + class ParseToken; + + /** + * This class provides the main interface for parsing expressions. + */ + + class LEPTON_EXPORT Parser + { + public: + /** + * Parse a mathematical expression and return a representation of it as an abstract syntax tree. + */ + static ParsedExpression parse(const std::string& expression); + /** + * Parse a mathematical expression and return a representation of it as an abstract syntax tree. + * + * @param expression + * @param customFunctions a map specifying user defined functions that may appear in the expression. + * The key are function names, and the values are corresponding CustomFunction objects. + */ + static ParsedExpression parse(const std::string& expression, const std::map& customFunctions); + private: + static std::string trim(const std::string& expression); + static std::vector tokenize(const std::string& expression); + static ParseToken getNextToken(const std::string& expression, size_t start); + static ExpressionTreeNode parsePrecedence(const std::vector& tokens, size_t& pos, + const std::map& customFunctions, + const std::map& subexpressionDefs, int precedence); + static Operation* getOperatorOperation(const std::string& name); + static Operation* getFunctionOperation(const std::string& name, const std::map& customFunctions); + }; +} // namespace Lepton + +#endif /*LEPTON_PARSER_H_*/ diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/windowsIncludes.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/windowsIncludes.h new file mode 100644 index 0000000..9d5a75f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/lepton/windowsIncludes.h @@ -0,0 +1,41 @@ +#ifndef LEPTON_WINDOW_INCLUDE_H_ +#define LEPTON_WINDOW_INCLUDE_H_ + +/* + * Shared libraries are messy in Visual Studio. We have to distinguish three + * cases: + * (1) this header is being used to build the Lepton shared library + * (dllexport) + * (2) this header is being used by a *client* of the Lepton shared + * library (dllimport) + * (3) we are building the Lepton static library, or the client is + * being compiled with the expectation of linking with the + * Lepton static library (nothing special needed) + * In the CMake script for building this library, we define one of the symbols + * Lepton_BUILDING_{SHARED|STATIC}_LIBRARY + * Client code normally has no special symbol defined, in which case we'll + * assume it wants to use the shared library. However, if the client defines + * the symbol LEPTON_USE_STATIC_LIBRARIES we'll suppress the dllimport so + * that the client code can be linked with static libraries. Note that + * the client symbol is not library dependent, while the library symbols + * affect only the Lepton library, meaning that other libraries can + * be clients of this one. However, we are assuming all-static or all-shared. + */ + +#ifdef _MSC_VER +// We don't want to hear about how sprintf is "unsafe". +#pragma warning(disable:4996) +#if defined(LEPTON_BUILDING_SHARED_LIBRARY) + #define LEPTON_EXPORT __declspec(dllexport) + // Keep MS VC++ quiet about lack of dll export of private members. + #pragma warning(disable:4251) +#elif defined(LEPTON_BUILDING_STATIC_LIBRARY) || defined(LEPTON_USE_STATIC_LIBRARIES) + #define LEPTON_EXPORT __declspec(dllimport) // i.e., a client of a shared library +#else +#define LEPTON_EXPORT +#endif +#else + #define LEPTON_EXPORT // Linux, Mac +#endif + +#endif // LEPTON_WINDOW_INCLUDE_H_ diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPBlockConvolver.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPBlockConvolver.h new file mode 100644 index 0000000..7e5986c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPBlockConvolver.h @@ -0,0 +1,600 @@ +//$ nocpp + +/** + * @file CDSPBlockConvolver.h + * + * @brief Single-block overlap-save convolution processor class. + * + * This file includes single-block overlap-save convolution processor class. + * + * r8brain-free-src Copyright (c) 2013-2014 Aleksey Vaneev + * See the "License.txt" file for license. + */ + +#ifndef R8B_CDSPBLOCKCONVOLVER_INCLUDED +#define R8B_CDSPBLOCKCONVOLVER_INCLUDED + +#include "CDSPFIRFilter.h" +#include "CDSPProcessor.h" + +namespace r8b +{ + + /** + * @brief Single-block overlap-save convolution processing class. + * + * Class that implements single-block overlap-save convolution processing. The + * length of a single FFT block used depends on the length of the filter + * kernel. + * + * The rationale behind "single-block" processing is that increasing the FFT + * block length by 2 is more efficient than performing convolution at the same + * FFT block length but using two blocks. + * + * This class also implements a built-in resampling by any whole-number + * factor, which simplifies the overall resampling objects topology. + */ + + class CDSPBlockConvolver final : public CDSPProcessor + { + public: + /** + * Constructor initializes internal variables and constants of *this + * object. + * + * @param aFilter Pre-calculated filter data. Reference to this object is + * inhertied by *this object, and the object will be released when *this + * object is destroyed. If upsampling is used, filter's gain should be + * equal to the upsampling factor. + * @param aUpFactor The upsampling factor, positive value. E.g. value of 2 + * means 2x upsampling should be performed over the input data. + * @param aDownFactor The downsampling factor, positive value. E.g. value + * of 2 means 2x downsampling should be performed over the output data. + * @param PrevLatency Latency, in samples (any value >=0), which was left + * in the output signal by a previous process. This value is usually + * non-zero if the minimum-phase filters are in use. This value is always + * zero if the linear-phase filters are in use. + * @param aDoConsumeLatency "True" if the output latency should be + * consumed. Does not apply to the fractional part of the latency (if such + * part is available). + */ + + CDSPBlockConvolver(CDSPFIRFilter& aFilter, const int aUpFactor, + const int aDownFactor, const double PrevLatency = 0.0, + const bool aDoConsumeLatency = true) + : Filter(&aFilter) + , UpFactor(aUpFactor) + , DownFactor(aDownFactor) + , DoConsumeLatency(aDoConsumeLatency) + , BlockLen2(2 << Filter->getBlockLenBits()) + { + R8BASSERT(UpFactor > 0); + R8BASSERT(DownFactor > 0); + R8BASSERT(PrevLatency >= 0.0); + + int fftinBits; + UpShift = getBitOccupancy(UpFactor) - 1; + + if ((1 << UpShift) == UpFactor) + { + fftinBits = Filter->getBlockLenBits() + 1 - UpShift; + PrevInputLen = (Filter->getKernelLen() - 1) / UpFactor; + InputLen = BlockLen2 - PrevInputLen * UpFactor; + } + else + { + UpShift = -1; + fftinBits = Filter->getBlockLenBits() + 1; + PrevInputLen = Filter->getKernelLen() - 1; + InputLen = BlockLen2 - PrevInputLen; + } + + OutOffset = Filter->getLatency(); + LatencyFrac = Filter->getLatencyFrac() + PrevLatency * UpFactor; + Latency = (int)LatencyFrac; + LatencyFrac -= Latency; + LatencyFrac /= DownFactor; + + Latency += InputLen + OutOffset; + + int fftoutBits; + InputDelay = 0; + UpSkipInit = 0; + DownSkipInit = 0; + DownShift = getBitOccupancy(DownFactor) - 1; + + if ((1 << DownShift) == DownFactor) + { + fftoutBits = Filter->getBlockLenBits() + 1 - DownShift; + + if (DownFactor > 1) + { + if (UpShift > 0) + { + // This case never happens in practice due to mutual + // exclusion of "power of 2" DownFactor and UpFactor + // values. + + R8BASSERT(UpShift == 0); + } + else + { + int Delay = Latency & (DownFactor - 1); + + if (Delay > 0) + { + Delay = DownFactor - Delay; + Latency += Delay; + + if (Delay < UpFactor) { UpSkipInit = Delay; } + else + { + UpSkipInit = UpFactor - 1; + InputDelay = Delay - UpSkipInit; + } + } + + if (!DoConsumeLatency) { Latency /= DownFactor; } + } + } + } + else + { + fftoutBits = Filter->getBlockLenBits() + 1; + DownShift = -1; + + if (!DoConsumeLatency && DownFactor > 1) + { + DownSkipInit = Latency % DownFactor; + Latency /= DownFactor; + } + } + + fftin = new CDSPRealFFTKeeper(fftinBits); + + if (fftoutBits == fftinBits) { fftout = fftin; } + else + { + ffto2 = new CDSPRealFFTKeeper(fftoutBits); + fftout = ffto2; + } + + WorkBlocks.alloc(BlockLen2 * 2 + PrevInputLen); + CurInput = &WorkBlocks[0]; + CurOutput = &WorkBlocks[BlockLen2]; + PrevInput = &WorkBlocks[BlockLen2 * 2]; + + clear(); + + R8BCONSOLE("CDSPBlockConvolver: flt_len=%i in_len=%i io=%i/%i " + "fft=%i/%i latency=%i\n", Filter -> getKernelLen(), InputLen, + UpFactor, DownFactor, (*fftin) -> getLen(), (*fftout) -> getLen(), + getLatency()); + } + + ~CDSPBlockConvolver() override { Filter->unref(); } + + int getLatency() const override { return (DoConsumeLatency ? 0 : Latency); } + + double getLatencyFrac() const override { return (LatencyFrac); } + + int getInLenBeforeOutStart(const int NextInLen) const override + { + return ((InputLen - InputDelay + NextInLen * DownFactor) / + UpFactor); + } + + int getMaxOutLen(const int MaxInLen) const override + { + R8BASSERT(MaxInLen >= 0); + + return ((MaxInLen * UpFactor + InputDelay + DownFactor - 1) / + DownFactor); + } + + void clear() override + { + memset(&PrevInput[0], 0, PrevInputLen * sizeof(double)); + + if (DoConsumeLatency) { LatencyLeft = Latency; } + else + { + LatencyLeft = 0; + + if (DownShift > 0) + { + memset(&CurOutput[0], 0, (BlockLen2 >> DownShift) * + sizeof(double)); + } + else + { + memset(&CurOutput[BlockLen2 - OutOffset], 0, OutOffset * + sizeof(double)); + + memset(&CurOutput[0], 0, (InputLen - OutOffset) * + sizeof(double)); + } + } + + memset(CurInput, 0, InputDelay * sizeof(double)); + + InDataLeft = InputLen - InputDelay; + UpSkip = UpSkipInit; + DownSkip = DownSkipInit; + } + + int process(double* ip, int l0, double*& op0) override + { + R8BASSERT(l0 >= 0); + R8BASSERT(UpFactor / DownFactor <= 1 || ip != op0 || l0 == 0); + + double* op = op0; + int l = l0 * UpFactor; + l0 = 0; + + while (l > 0) + { + const int Offs = InputLen - InDataLeft; + + if (l < InDataLeft) + { + InDataLeft -= l; + + if (UpShift >= 0) + { + memcpy(&CurInput[Offs >> UpShift], ip, + (l >> UpShift) * sizeof(double)); + } + else { copyUpsample(ip, &CurInput[Offs], l); } + + copyToOutput(Offs - OutOffset, op, l, l0); + break; + } + + const int b = InDataLeft; + l -= b; + InDataLeft = InputLen; + int ilu; + + if (UpShift >= 0) + { + const int bu = b >> UpShift; + memcpy(&CurInput[Offs >> UpShift], ip, + bu * sizeof(double)); + + ip += bu; + ilu = InputLen >> UpShift; + } + else + { + copyUpsample(ip, &CurInput[Offs], b); + ilu = InputLen; + } + + const int pil = int(PrevInputLen * sizeof(double)); + memcpy(&CurInput[ilu], PrevInput, pil); + memcpy(PrevInput, &CurInput[ilu - PrevInputLen], pil); + + (*fftin)->forward(CurInput); + + if (UpShift > 0) { mirrorInputSpectrum(); } + + if (Filter->isZeroPhase()) + { + (*fftout)->multiplyBlocksZ(Filter->getKernelBlock(), + CurInput); + } + else + { + (*fftout)->multiplyBlocks(Filter->getKernelBlock(), + CurInput); + } + + if (DownShift > 0) + { + const int z = BlockLen2 >> DownShift; + CurInput[1] = Filter->getKernelBlock()[z] * + CurInput[z]; + } + + (*fftout)->inverse(CurInput); + + copyToOutput(Offs - OutOffset, op, b, l0); + + double* const tmp = CurInput; + CurInput = CurOutput; + CurOutput = tmp; + } + + return (l0); + } + + private: + CDSPFIRFilter* Filter = nullptr; ///< Filter in use. + ///< + CPtrKeeper fftin; ///< FFT object 1, used to produce + ///< the input spectrum (can embed the "power of 2" upsampling). + ///< + CPtrKeeper ffto2; ///< FFT object 2 (can be NULL). + ///< + CDSPRealFFTKeeper* fftout = nullptr; ///< FFT object used to produce the output + ///< signal (can embed the "power of 2" downsampling), may point to + ///< either "fftin" or "ffto2". + ///< + int UpFactor = 0; ///< Upsampling factor. + ///< + int DownFactor = 0; ///< Downsampling factor. + ///< + bool DoConsumeLatency; ///< "True" if the output latency should be + ///< consumed. Does not apply to the fractional part of the latency + ///< (if such part is available). + ///< + int BlockLen2 = 0; ///< Equals block length * 2. + ///< + int OutOffset = 0; ///< Output offset, depends on filter's introduced latency. + ///< + int PrevInputLen = 0; ///< The length of previous input data saved, used for + ///< overlap. + ///< + int InputLen = 0; ///< The number of input samples that should be accumulated + ///< before the input block is processed. + ///< + int Latency = 0; ///< Processing latency, in samples. + ///< + double LatencyFrac = 0; ///< Fractional latency, in samples, that is left in + ///< the output signal. + ///< + int UpShift = 0; ///< "Power of 2" upsampling shift. Equals -1 if UpFactor is + ///< not a "power of 2" value. Equals 0 if UpFactor equals 1. + ///< + int DownShift = 0; ///< "Power of 2" downsampling shift. Equals -1 if + ///< DownFactor is not a "power of 2". Equals 0 if DownFactor equals + ///< 1. + ///< + int InputDelay = 0; ///< Additional input delay, in samples. Used to make the + ///< output latency divisible by DownShift. Used only if UpShift <= 0 + ///< and DownShift > 0. + ///< + CFixedBuffer WorkBlocks; ///< Previous input data, input and + ///< output data blocks, overall capacity = BlockLen2 * 2 + + ///< PrevInputLen. Used in the flip-flop manner. + ///< + double* PrevInput = nullptr; ///< Previous input data buffer, capacity = BlockLen. + ///< + double* CurInput = nullptr; ///< Input data buffer, capacity = BlockLen2. + ///< + double* CurOutput = nullptr; ///< Output data buffer, capacity = BlockLen2. + ///< + int InDataLeft = 0; ///< Samples left before processing input and output FFT + ///< blocks. Initialized to InputLen on clear. + ///< + int LatencyLeft = 0; ///< Latency in samples left to skip. + ///< + int UpSkip = 0; ///< The current upsampling sample skip (value in the range + ///< 0 to UpFactor - 1). + ///< + int UpSkipInit = 0; ///< The initial UpSkip value after clear(). + ///< + int DownSkip = 0; ///< The current downsampling sample skip (value in the + ///< range 0 to DownFactor - 1). Not used if DownShift > 0. + ///< + int DownSkipInit = 0; ///< The initial DownSkip value after clear(). + ///< + + /** + * Function copies samples from the input buffer to the output buffer + * while inserting zeros inbetween them to perform the whole-numbered + * upsampling. + * + * @param[in,out] ip0 Input buffer. Will be advanced on function's return. + * @param[out] op Output buffer. + * @param l0 The number of samples to fill in the output buffer, including + * both input samples and interpolation (zero) samples. + */ + + void copyUpsample(double*& ip0, double* op, int l0) + { + int b = min(UpSkip, l0); + + if (b > 0) + { + l0 -= b; + UpSkip -= b; + *op = 0.0; + op++; + b--; + + while (b > 0) + { + *op = 0.0; + op++; + b--; + } + } + + double* ip = ip0; + int l = l0 / UpFactor; + int lz = l0 - l * UpFactor; + + if (UpFactor == 3) + { + while (l > 0) + { + op[0] = *ip; + op[1] = 0.0; + op[2] = 0.0; + ip++; + op += UpFactor; + l--; + } + } + else if (UpFactor == 5) + { + while (l > 0) + { + op[0] = *ip; + op[1] = 0.0; + op[2] = 0.0; + op[3] = 0.0; + op[4] = 0.0; + ip++; + op += UpFactor; + l--; + } + } + else + { + while (l > 0) + { + op[0] = *ip; + + for (int j = 1; j < UpFactor; ++j) { op[j] = 0.0; } + + ip++; + op += UpFactor; + l--; + } + } + + if (lz > 0) + { + *op = *ip; + op++; + ip++; + UpSkip = UpFactor - lz; + + while (lz > 1) + { + *op = 0.0; + op++; + lz--; + } + } + + ip0 = ip; + } + + /** + * Function copies sample data from the CurOutput buffer to the specified + * output buffer and advances its position. If necessary, this function + * "consumes" latency and performs downsampling. + * + * @param Offs CurOutput buffer offset, can be negative. + * @param[out] op0 Output buffer pointer, will be advanced. + * @param b The number of output samples available, including those which + * are discarded during whole-number downsampling. + * @param l0 The overall output sample count, will be increased. + */ + + void copyToOutput(int Offs, double*& op0, int b, int& l0) + { + if (Offs < 0) + { + if (Offs + b <= 0) { Offs += BlockLen2; } + else + { + copyToOutput(Offs + BlockLen2, op0, -Offs, l0); + b += Offs; + Offs = 0; + } + } + + if (LatencyLeft > 0) + { + if (LatencyLeft >= b) + { + LatencyLeft -= b; + return; + } + + Offs += LatencyLeft; + b -= LatencyLeft; + LatencyLeft = 0; + } + + const int df = DownFactor; + + if (DownShift > 0) + { + int Skip = Offs & (df - 1); + + if (Skip > 0) + { + Skip = df - Skip; + b -= Skip; + Offs += Skip; + } + + if (b > 0) + { + b = (b + df - 1) >> DownShift; + memcpy(op0, &CurOutput[Offs >> DownShift], + b * sizeof(double)); + + op0 += b; + l0 += b; + } + } + else + { + if (df > 1) + { + const double* ip = &CurOutput[Offs + DownSkip]; + int l = (b + df - 1 - DownSkip) / df; + DownSkip += l * df - b; + + double* op = op0; + l0 += l; + op0 += l; + + while (l > 0) + { + *op = *ip; + op++; + ip += df; + l--; + } + } + else + { + memcpy(op0, &CurOutput[Offs], b * sizeof(double)); + op0 += b; + l0 += b; + } + } + } + + /** + * Function performs input spectrum mirroring which is used to perform a + * fast "power of 2" upsampling. Such mirroring is equivalent to insertion + * of zeros into the input signal. + */ + + void mirrorInputSpectrum() + { + const int bl1 = BlockLen2 >> UpShift; + const int bl2 = bl1 + bl1; + + int i; + + for (i = bl1 + 2; i < bl2; i += 2) + { + CurInput[i] = CurInput[bl2 - i]; + CurInput[i + 1] = -CurInput[bl2 - i + 1]; + } + + CurInput[bl1] = CurInput[1]; + CurInput[bl1 + 1] = 0.0; + CurInput[1] = CurInput[0]; + + for (i = 1; i < UpShift; ++i) + { + const int z = bl1 << i; + memcpy(&CurInput[z], CurInput, z * sizeof(double)); + CurInput[z + 1] = 0.0; + } + } + }; +} // namespace r8b + +#endif // R8B_CDSPBLOCKCONVOLVER_INCLUDED diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPFIRFilter.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPFIRFilter.h new file mode 100644 index 0000000..4f5c915 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPFIRFilter.h @@ -0,0 +1,557 @@ +//$ nocpp + +/** + * @file CDSPFIRFilter.h + * + * @brief FIR filter generator and filter cache classes. + * + * This file includes low-pass FIR filter generator and filter cache. + * + * r8brain-free-src Copyright (c) 2013-2014 Aleksey Vaneev + * See the "License.txt" file for license. + */ + +#ifndef R8B_CDSPFIRFILTER_INCLUDED +#define R8B_CDSPFIRFILTER_INCLUDED + +#include "CDSPSincFilterGen.h" +#include "CDSPRealFFT.h" + +namespace r8b +{ + + /** + * Enumeration of filter's phase responses. + */ + + enum EDSPFilterPhaseResponse + { + fprLinearPhase = 0 ///< Linear-phase response. Features a linear-phase + ///< high-latency response, with the latency expressed as integer + ///< value. + // fprMinPhase ///< Minimum-phase response. Features a minimal latency + ///< response, but the response's phase is non-linear. The latency is + ///< usually expressed as non-integer value, and usually is small, but + ///< is never equal to zero. The minimum-phase filter is transformed + ///< from the linear-phase filter. The transformation has precision + ///< limits which may skew both the -3 dB point and attenuation of the + ///< filter being transformed: as it was measured, the skew happens + ///< purely at random, and in most cases it is within tolerable range. + ///< In a small (1%) random subset of cases the skew is bigger and + ///< cannot be predicted. + }; + + /** + * @brief Calculation and storage class for FIR filters. + * + * Class that implements calculation and storing of a FIR filter (currently + * contains low-pass filter calculation routine designed for sample rate + * conversion). Objects of this class cannot be created directly, but can be + * obtained via the CDSPFilterCache::getLPFilter() static function. + */ + + class CDSPFIRFilter : public R8B_BASECLASS + { + R8BNOCTOR(CDSPFIRFilter) + + friend class CDSPFIRFilterCache; + + public: + ~CDSPFIRFilter() + { + R8BASSERT(RefCount == 0); + + delete Next; + } + + /** + * @return The minimal allowed low-pass filter's transition band, in percent. + */ + static double getLPMinTransBand() { return (0.5); } + + /** + * @return The maximal allowed low-pass filter's transition band, in percent. + */ + static double getLPMaxTransBand() { return (45.0); } + + /** + * @return The minimal allowed low-pass filter's stop-band attenuation, in decibel. + */ + static double getLPMinAtten() { return (49.0); } + + /** + * @return The maximal allowed low-pass filter's stop-band attenuation, in decibel. + */ + static double getLPMaxAtten() { return (218.0); } + + /** + * @return "True" if kernel block of *this filter has zero-phase response. + */ + bool isZeroPhase() const { return (IsZeroPhase); } + + /** + * @return Filter's latency, in samples (integer part). + */ + int getLatency() const { return (Latency); } + + /** + * @return Filter's latency, in samples (fractional part). Always zero for linear-phase filters. + */ + double getLatencyFrac() const { return (LatencyFrac); } + + /** + * @return Filter kernel length, in samples. Not to be confused with the block length. + */ + int getKernelLen() const { return (KernelLen); } + + /** + * @return Filter's block length, espressed as Nth power of 2. The actual length is twice as large due to zero-padding. + */ + int getBlockLenBits() const { return (BlockLenBits); } + + /** + * @return Filter's kernel block, in complex-numbered form obtained via + * the CDSPRealFFT::forward() function call, zero-padded, gain-adjusted + * with the CDSPRealFFT::getInvMulConst() * ReqGain constant, immediately + * suitable for convolution. Kernel block may have "zero-phase" response, + * depending on the isZeroPhase() function's result. + */ + const double* getKernelBlock() const { return (KernelBlock); } + + /** + * This function should be called when the filter obtained via the + * filter cache is no longer needed. + */ + + void unref(); + + private: + double ReqNormFreq = 0; ///< Required normalized frequency, 0 to 1 inclusive. + double ReqTransBand = 0; ///< Required transition band in percent, as passed by the user. + double ReqAtten = 0; ///< Required stop-band attenuation in decibel, as passed by the user (positive value). + EDSPFilterPhaseResponse ReqPhase = fprLinearPhase; ///< Required filter's phase response. + double ReqGain = 0; ///< Required overall filter's gain. + CDSPFIRFilter* Next = nullptr; ///< Next FIR filter in cache's list. + int RefCount = 1; ///< The number of references made to *this FIR filter. + bool IsZeroPhase = false; ///< "True" if kernel block of *this filter has zero-phase response. + int Latency = 0; ///< Filter's latency in samples (integer part). + double LatencyFrac = 0; ///< Filter's latency in samples (fractional part). + int KernelLen = 0; ///< Filter kernel length, in samples. + int BlockLenBits = + 0; ///< Block length used to store *this FIR filter, expressed as Nth power of 2. This value is used directly by the convolver. + CFixedBuffer + KernelBlock; ///< FIR filter buffer, capacity equals to 1 << ( BlockLenBits + 1 ). Second part of the buffer contains zero-padding to allow alias-free convolution. + + CDSPFIRFilter() { } + + /** + * Function builds filter kernel based on the "Req" parameters. + * + * @param ExtAttenCorrs External attentuation correction table, for + * internal use. + */ + + void buildLPFilter(const double* const ExtAttenCorrs) + { + const double tb = ReqTransBand * 0.01; + double fo1; + double hl; + double atten = -ReqAtten; + + if (tb >= 0.25) + { + if (ReqAtten >= 117.0) { atten -= 1.60; } + else if (ReqAtten >= 60.0) { atten -= 1.91; } + else { atten -= 2.25; } + } + else if (tb >= 0.10) + { + if (ReqAtten >= 117.0) { atten -= 0.69; } + else if (ReqAtten >= 60.0) { atten -= 0.73; } + else { atten -= 1.13; } + } + else + { + if (ReqAtten >= 117.0) { atten -= 0.21; } + else if (ReqAtten >= 60.0) { atten -= 0.25; } + else { atten -= 0.36; } + } + + static const int AttenCorrCount = 264; + static const double AttenCorrMin = 49.0; + static const double AttenCorrDiff = 176.25; + int AttenCorr = (int)floor((-atten - AttenCorrMin) * AttenCorrCount / AttenCorrDiff + 0.5); + + AttenCorr = min(AttenCorrCount, max(0, AttenCorr)); + + if (ExtAttenCorrs != nullptr) { atten -= ExtAttenCorrs[AttenCorr]; } + else if (tb >= 0.25) + { + static const double AttenCorrScale = 101.0; + static const signed char AttenCorrs[] = { + -127, -127, -125, -125, -122, -119, -115, -110, -104, -97, + -91, -82, -75, -24, -16, -6, 4, 14, 24, 29, 30, 32, 37, 44, + 51, 57, 63, 67, 65, 50, 53, 56, 58, 60, 63, 64, 66, 68, 74, + 77, 78, 78, 78, 79, 79, 60, 60, 60, 61, 59, 52, 47, 41, 36, + 30, 24, 17, 9, 0, -8, -10, -11, -14, -13, -18, -25, -31, -38, + -44, -50, -57, -63, -68, -74, -81, -89, -96, -101, -104, -107, + -109, -110, -86, -84, -85, -82, -80, -77, -73, -67, -62, -55, + -48, -42, -35, -30, -20, -11, -2, 5, 6, 6, 7, 11, 16, 21, 26, + 34, 41, 46, 49, 52, 55, 56, 48, 49, 51, 51, 52, 52, 52, 52, + 52, 51, 51, 50, 47, 47, 50, 48, 46, 42, 38, 35, 31, 27, 24, + 20, 16, 12, 11, 12, 10, 8, 4, -1, -6, -11, -16, -19, -17, -21, + -24, -27, -32, -34, -37, -38, -40, -41, -40, -40, -42, -41, + -44, -45, -43, -41, -34, -31, -28, -24, -21, -18, -14, -10, + -5, -1, 2, 5, 8, 7, 4, 3, 2, 2, 4, 6, 8, 9, 9, 10, 10, 10, 10, + 9, 8, 9, 11, 14, 13, 12, 11, 10, 8, 7, 6, 5, 3, 2, 2, -1, -1, + -3, -3, -4, -4, -5, -4, -6, -7, -9, -5, -1, -1, 0, 1, 0, -2, + -3, -4, -5, -5, -8, -13, -13, -13, -12, -13, -12, -11, -11, + -9, -8, -7, -5, -3, -1, 2, 4, 6, 9, 10, 11, 14, 18, 21, 24, + 27, 30, 34, 37, 37, 39, 40 + }; + + atten -= AttenCorrs[AttenCorr] / AttenCorrScale; + } + else if (tb >= 0.10) + { + static const double AttenCorrScale = 210.0; + static const signed char AttenCorrs[] = { + -113, -118, -122, -125, -126, -97, -95, -92, -92, -89, -82, + -75, -69, -48, -42, -36, -30, -22, -14, -5, -2, 1, 6, 13, 22, + 28, 35, 41, 48, 55, 56, 56, 61, 65, 71, 77, 81, 83, 85, 85, + 74, 74, 73, 72, 71, 70, 68, 64, 59, 56, 49, 52, 46, 42, 36, + 32, 26, 20, 13, 7, -2, -6, -10, -15, -20, -27, -33, -38, -44, + -43, -48, -53, -57, -63, -69, -73, -75, -79, -81, -74, -76, + -77, -77, -78, -81, -80, -80, -78, -76, -65, -62, -59, -56, + -51, -48, -44, -38, -33, -25, -19, -13, -5, -1, 2, 7, 13, 17, + 21, 25, 30, 35, 40, 45, 50, 53, 56, 57, 55, 58, 59, 62, 64, + 67, 67, 68, 68, 62, 61, 61, 59, 59, 57, 57, 55, 52, 48, 42, + 38, 35, 31, 26, 20, 15, 13, 10, 7, 3, -2, -8, -13, -17, -23, + -28, -34, -37, -40, -41, -45, -48, -50, -53, -57, -59, -62, + -63, -63, -57, -57, -56, -56, -54, -54, -53, -49, -48, -41, + -38, -33, -31, -26, -23, -18, -12, -9, -7, -7, -3, 0, 5, 9, + 14, 16, 20, 22, 21, 23, 25, 27, 28, 29, 34, 33, 35, 33, 31, + 30, 29, 29, 26, 26, 25, 24, 20, 19, 15, 10, 8, 4, 1, -2, -6, + -10, -16, -19, -23, -26, -27, -30, -34, -39, -43, -47, -51, + -52, -54, -56, -58, -59, -62, -63, -66, -65, -65, -64, -59, + -57, -54, -52, -48, -44, -42, -37, -32, -22, -17, -10, -3, 5, + 13, 22, 30, 40, 50, 60, 72 + }; + + atten -= AttenCorrs[AttenCorr] / AttenCorrScale; + } + else + { + static const double AttenCorrScale = 196.0; + static const signed char AttenCorrs[] = { + -15, -17, -20, -20, -20, -21, -20, -16, -17, -18, -17, -13, + -12, -11, -9, -7, -5, -4, -1, 1, 3, 4, 5, 6, 7, 9, 9, 10, 10, + 10, 11, 11, 11, 12, 12, 12, 10, 11, 10, 10, 8, 10, 11, 10, 11, + 11, 13, 14, 15, 19, 27, 26, 23, 18, 14, 8, 4, -2, -6, -12, + -17, -23, -28, -33, -37, -42, -46, -49, -53, -57, -60, -61, + -64, -65, -67, -66, -66, -66, -65, -64, -61, -59, -56, -52, + -48, -42, -38, -31, -27, -19, -13, -7, -1, 8, 14, 22, 29, 37, + 45, 52, 59, 66, 73, 80, 86, 91, 96, 100, 104, 108, 111, 114, + 115, 117, 118, 120, 120, 118, 117, 114, 113, 111, 107, 103, + 99, 95, 89, 84, 78, 72, 66, 60, 52, 44, 37, 30, 21, 14, 6, -3, + -11, -18, -26, -34, -43, -51, -58, -65, -73, -78, -85, -90, + -97, -102, -107, -113, -115, -118, -121, -125, -125, -126, + -126, -126, -125, -124, -121, -119, -115, -111, -109, -101, + -102, -95, -88, -81, -73, -67, -63, -54, -47, -40, -33, -26, + -18, -11, -5, 2, 8, 14, 19, 25, 31, 36, 37, 43, 47, 49, 51, + 52, 57, 57, 56, 57, 58, 58, 58, 57, 56, 52, 52, 50, 48, 44, + 41, 39, 37, 33, 31, 26, 24, 21, 18, 14, 11, 8, 4, 2, -2, -5, + -7, -9, -11, -13, -15, -16, -18, -19, -20, -23, -24, -24, -25, + -27, -26, -27, -29, -30, -31, -32, -35, -36, -39, -40, -44, + -46, -51, -54, -59, -63, -69, -76, -83, -91, -98 + }; + + atten -= AttenCorrs[AttenCorr] / AttenCorrScale; + } + + double pwr = 7.43932822146293e-8 * sqr(atten) + 0.000102747434588003 * cos(0.00785021930010397 * atten) * cos( + 0.633854318781239 + 0.103208573657699 * atten) + - 0.00798132247867036 - 0.000903555213543865 * atten - 0.0969365532127236 * exp(0.0779275237937911 * atten) - 1.37304948662012e-5 * + atten * cos(0.00785021930010397 * atten); + + if (pwr <= 0.067665322581) + { + if (tb >= 0.25) + { + hl = 2.6778150875894 / tb + 300.547590563091 * atan(atan(2.68959772209918 * pwr)) / (5.5099277187035 * tb - tb * tanh(cos(asinh(atten)))); + fo1 = 0.987205355829873 * tb + 1.00011788929851 * atan2(-0.321432067051302 - 6.19131357321578 * sqrt(pwr), + hl + -1.14861472207245 / (hl - 14.1821147585957) + pow(0.9521145021664, + pow( + atan2( + 1.12018764830637, + tb), + 2.10988901686912 * hl - + 20.9691278378345))); + } + else if (tb >= 0.10) + { + hl = (1.56688617018066 + 142.064321294568 * pwr + 0.00419441117131136 * cos(243.633511747297 * pwr) - 0.022953443903576 * atten - + 0.026629568860284 * cos(127.715550622571 * pwr)) / tb; + fo1 = 0.982299356642411 * tb + 0.999441744774215 * asinh((-0.361783054039583 - 5.80540593623676 * sqrt(pwr)) / hl); + } + else + { + hl = (2.45739657014937 + 269.183679500541 * pwr * cos( + 5.73225668178813 + atan2(cosh(0.988861169868941 - 17.2201556280744 * pwr), 1.08340138240431 * pwr))) / tb; + fo1 = 2.291956939 * tb + 0.01942450693 * sqr(tb) * hl - 4.67538973161837 * pwr * tb - 1.668433124 * tb * pow(pwr, pwr); + } + } + else + { + if (tb >= 0.25) + { + hl = (1.50258368698213 + 158.556968859477 * asinh(pwr) * tanh(57.9466246871383 * tanh(pwr)) - 0.0105440479814834 * atten) / tb; + fo1 = 0.994024401639321 * tb + (-0.236282717577215 - 6.8724924545387 * sqrt(sin(pwr))) / hl; + } + else if (tb >= 0.10) + { + hl = (1.50277377248945 + 158.222625721046 * asinh(pwr) * tanh(1.02875299001715 + 42.072277322604 * pwr) - 0.0108380943845632 * atten) / tb; + fo1 = 0.992539376734551 * tb + (-0.251747813037178 - 6.74159892452584 * sqrt(tanh(tanh(tan(pwr))))) / hl; + } + else + { + hl = (1.15990238966306 * pwr - 5.02124037125213 * sqr(pwr) - 0.158676856669827 * atten * cos( + 1.1609073390614 * pwr - 6.33932586197475 * pwr * sqr(pwr))) / tb; + fo1 = 0.867344453126885 * tb + 0.052693817907757 * tb * log(pwr) + 0.0895511178735932 * tb * atan(59.7538527741309 * pwr) - + 0.0745653568081453 * pwr * tb; + } + } + + double WinParams[ 2 ]; + WinParams[0] = 125.0; + WinParams[1] = pwr; + + CDSPSincFilterGen sinc; + sinc.Len2 = 0.25 * hl / ReqNormFreq; + sinc.Freq1 = 0.0; + sinc.Freq2 = M_PI * (1.0 - fo1) * ReqNormFreq; + sinc.initBand(CDSPSincFilterGen::wftKaiser, WinParams, true); + + KernelLen = sinc.KernelLen; + BlockLenBits = getBitOccupancy(KernelLen - 1); + const int BlockLen = 1 << BlockLenBits; + + KernelBlock.alloc(BlockLen * 2); + sinc.generateBand(&KernelBlock[0], + &CDSPSincFilterGen::calcWindowKaiser); + + /* if( ReqPhase == fprLinearPhase ) + {*/ + IsZeroPhase = true; + Latency = sinc.fl2; + LatencyFrac = 0.0; + /* } + else + { + IsZeroPhase = false; + double DCGroupDelay; + + calcMinPhaseTransform( &KernelBlock[ 0 ], KernelLen, 3, false, &DCGroupDelay ); + + Latency = (int) DCGroupDelay; + LatencyFrac = DCGroupDelay - Latency; + }*/ + + CDSPRealFFTKeeper ffto(BlockLenBits + 1); + + if (IsZeroPhase) + { + // Calculate DC gain. + + double s = 0.0; + int i; + + for (i = 0; i < KernelLen; ++i) { s += KernelBlock[i]; } + + s = ffto->getInvMulConst() * ReqGain / s; + + // Time-shift the filter so that zero-phase response is produced. + // Simultaneously multiply by "s". + + for (i = 0; i <= sinc.fl2; ++i) { KernelBlock[i] = KernelBlock[sinc.fl2 + i] * s; } + for (i = 1; i <= sinc.fl2; ++i) { KernelBlock[BlockLen * 2 - i] = KernelBlock[i]; } + + memset(&KernelBlock[sinc.fl2 + 1], 0, (BlockLen * 2 - KernelLen) * sizeof(double)); + } + else + { + normalizeFIRFilter(&KernelBlock[0], KernelLen, ffto->getInvMulConst() * ReqGain); + memset(&KernelBlock[KernelLen], 0, (BlockLen * 2 - KernelLen) * sizeof(double)); + } + + ffto->forward(KernelBlock); + + R8BCONSOLE("CDSPFIRFilter: flt_len=%i latency=%i nfreq=%.4f tb=%.1f att=%.1f gain=%.3f\n", KernelLen, Latency, ReqNormFreq, ReqTransBand, ReqAtten, + ReqGain); + } + }; + + /** + * @brief FIR filter cache class. + * + * Class that implements cache for calculated FIR filters. The required FIR + * filter should be obtained via the getLPFilter() static function. + */ + + class CDSPFIRFilterCache : public R8B_BASECLASS + { + friend class CDSPFIRFilter; + + public: + /** + * @return The number of filters present in the cache now. This value can + * be monitored for debugging "forgotten" filters. + */ + + static int getObjCount() + { + R8BSYNC(StateSync); + + return (ObjCount); + } + + /** + * Function calculates or returns reference to a previously calculated + * (cached) low-pass FIR filter. Note that the real transition band and + * attenuation achieved by the filter varies with the magnitude of the + * required attenuation, and are never 100% exact. + * + * @param ReqNormFreq Required normalized frequency, in the range 0 to 1, + * inclusive. This is the point after which the stop-band spans. + * @param ReqTransBand Required transition band, in percent of the + * 0 to ReqNormFreq spectral bandwidth, in the range + * CDSPFIRFilter::getLPMinTransBand() to + * CDSPFIRFilter::getLPMaxTransBand(), inclusive. The transition band + * specifies the part of the spectrum between the -3 dB and ReqNormFreq + * points. The real resulting -3 dB point varies in the range from -3.00 + * to -3.05 dB, but is generally very close to -3 dB. + * @param ReqAtten Required stop-band attenuation in decibel, in the range + * CDSPFIRFilter::getLPMinAtten() to CDSPFIRFilter::getLPMaxAtten(), + * inclusive. Note that the actual stop-band attenuation of the resulting + * filter may be 0.40-4.46 dB higher. + * @param ReqPhase Required filter's phase response. + * @param ReqGain Required overall filter's gain (1.0 for unity gain). + * @param AttenCorrs Attentuation correction table, to pass to the filter + * generation function. For internal use. + * @return A reference to a new or a previously calculated low-pass FIR + * filter object with the required characteristics. A reference count is + * incremented in the returned filter object which should be released + * after use via the CDSPFIRFilter::unref() function. + */ + + static CDSPFIRFilter& getLPFilter(const double ReqNormFreq, const double ReqTransBand, const double ReqAtten, + const EDSPFilterPhaseResponse ReqPhase, const double ReqGain, const double* const AttenCorrs = nullptr) + { + R8BASSERT(ReqNormFreq > 0.0 && ReqNormFreq <= 1.0); + R8BASSERT(ReqTransBand >= CDSPFIRFilter :: getLPMinTransBand()); + R8BASSERT(ReqTransBand <= CDSPFIRFilter :: getLPMaxTransBand()); + R8BASSERT(ReqAtten >= CDSPFIRFilter :: getLPMinAtten()); + R8BASSERT(ReqAtten <= CDSPFIRFilter :: getLPMaxAtten()); + R8BASSERT(ReqGain > 0.0); + + R8BSYNC(StateSync); + + CDSPFIRFilter* PrevObj = nullptr; + CDSPFIRFilter* CurObj = Objects; + + while (CurObj != nullptr) + { + if (CurObj->ReqNormFreq == ReqNormFreq && + CurObj->ReqTransBand == ReqTransBand && + CurObj->ReqAtten == ReqAtten && + CurObj->ReqPhase == ReqPhase && + CurObj->ReqGain == ReqGain) { break; } + + if (CurObj->Next == nullptr && ObjCount >= R8B_FILTER_CACHE_MAX) + { + if (CurObj->RefCount == 0) + { + // Delete the last filter which is not used. + + PrevObj->Next = nullptr; + delete CurObj; + ObjCount--; + } + else + { + // Move the last filter to the top of the list since it + // seems to be in use for a long time. + + PrevObj->Next = nullptr; + CurObj->Next = Objects.unkeep(); + Objects = CurObj; + } + + CurObj = nullptr; + break; + } + + PrevObj = CurObj; + CurObj = CurObj->Next; + } + + if (CurObj != nullptr) + { + CurObj->RefCount++; + + if (PrevObj == nullptr) { return (*CurObj); } + + // Remove the filter from the list temporarily. + + PrevObj->Next = CurObj->Next; + } + else + { + // Create a new filter object (with RefCount == 1) and build the + // filter kernel. + + CurObj = new CDSPFIRFilter(); + CurObj->ReqNormFreq = ReqNormFreq; + CurObj->ReqTransBand = ReqTransBand; + CurObj->ReqAtten = ReqAtten; + CurObj->ReqPhase = ReqPhase; + CurObj->ReqGain = ReqGain; + ObjCount++; + + CurObj->buildLPFilter(AttenCorrs); + } + + // Insert the filter at the start of the list. + + CurObj->Next = Objects.unkeep(); + Objects = CurObj; + + return (*CurObj); + } + + private: + static CSyncObject StateSync; ///< Cache state synchronizer. + ///< + static CPtrKeeper Objects; ///< The chain of cached + ///< objects. + ///< + static int ObjCount; ///< The number of objects currently preset in the + ///< cache. + ///< + }; + + // --------------------------------------------------------------------------- + // CDSPFIRFilter PUBLIC + // --------------------------------------------------------------------------- + + inline void CDSPFIRFilter::unref() + { + R8BSYNC(CDSPFIRFilterCache :: StateSync); + + RefCount--; + } + + // --------------------------------------------------------------------------- +} // namespace r8b + +#endif // R8B_CDSPFIRFILTER_INCLUDED diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPFracInterpolator.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPFracInterpolator.h new file mode 100644 index 0000000..dacbef1 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPFracInterpolator.h @@ -0,0 +1,495 @@ +//$ nocpp + +/** + * @file CDSPFracInterpolator.h + * + * @brief Fractional delay interpolator and filter bank classes. + * + * This file includes fractional delay interpolator class. + * + * r8brain-free-src Copyright (c) 2013-2014 Aleksey Vaneev + * See the "License.txt" file for license. + */ + +#ifndef R8B_CDSPFRACINTERPOLATOR_INCLUDED +#define R8B_CDSPFRACINTERPOLATOR_INCLUDED + +#include "CDSPSincFilterGen.h" +#include "CDSPProcessor.h" + +namespace r8b +{ + + /** + * @brief Sinc function-based fractional delay filter bank class. + * + * Class implements storage and initialization of a bank of sinc-based + * fractional delay filters, expressed as 1st, 2nd or 3rd order polynomial + * interpolation coefficients. The filters are windowed by either the "Vaneev" + * or "Kaiser" power-raised window function. The FilterLen and FilterFracs + * parameters can be varied freely without breaking the resampler. + * + * @param FilterLen Specifies the number of samples (taps) each fractional + * delay filter should have. This must be an even value, the minimal value for + * FilterLen is 6, the maximal value is 30. To achieve a higher resampling + * precision, the oversampling should be used in the first place instead of + * using a higher FilterLen value. The lower this value is the lower the + * signal-to-noise performance of the interpolator will be. Each FilterLen + * decrease by 2 decreases SNR by approximately 12 to 14 decibel. + * @param FilterFracs The number of fractional delay positions to sample. For + * a high signal-to-noise ratio this has to be a larger value. The larger the + * FilterLen is the larger the FilterFracs should be. Approximate FilterLen to + * FilterFracs correspondence (for 2nd order interpolation only): 6:11, 8:17, + * 10:23, 12:41, 14:67, 16:97, 18:137, 20:211, 22:353, 24:673, 26:1051, + * 28:1733, 30:2833. The FilterFracs can be considerably reduced with 3rd + * order interpolation in use. In order to get consistent results when + * resampling to/from different sample rates, it is suggested to set this + * parameter to a suitable prime number. + * @param ElementSize The size of each filter's tap, in "double" values. This + * parameter corresponds to the complexity of interpolation. 4 should be set + * for 3rd order, 3 for 2nd order, 2 for linear interpolation. + * @param InterpPoints The number of points the interpolation is based on. + * This value should not be confused with the ElementSize. Set to 2 for linear + * interpolation. + */ + + template + class CDSPFracDelayFilterBank : public R8B_BASECLASS + { + public: + CDSPFracDelayFilterBank() + { + R8BASSERT(FilterLen >= 6); + R8BASSERT(FilterLen <= 30); + R8BASSERT(( FilterLen & 1 ) == 0); + R8BASSERT(FilterFracs > 0); + R8BASSERT(ElementSize >= 2 && ElementSize <= 4); + R8BASSERT(InterpPoints == 2 || InterpPoints == 8); + + calculate(); + } + + /** + * Function calculates the filter bank. + * + * @param Params Window function's parameters. If NULL then the built-in + * table values for the current FilterLen will be used. + */ + + void calculate(const double* const Params = nullptr) + { + CDSPSincFilterGen sinc; + sinc.Len2 = FilterLen / 2; + + double* p = Table; + const int pc2 = InterpPoints / 2; + int i; + + if (FilterLen <= 20) + { + for (i = -pc2 + 1; i <= FilterFracs + pc2; ++i) + { + sinc.FracDelay = double(FilterFracs - i) / FilterFracs; + sinc.initFrac(CDSPSincFilterGen::wftVaneev, Params); + sinc.generateFrac(p, &CDSPSincFilterGen::calcWindowVaneev, + ElementSize); + + normalizeFIRFilter(p, FilterLen, 1.0, ElementSize); + p += FilterSize; + } + } + else + { + for (i = -pc2 + 1; i <= FilterFracs + pc2; ++i) + { + sinc.FracDelay = double(FilterFracs - i) / FilterFracs; + sinc.initFrac(CDSPSincFilterGen::wftKaiser, Params, true); + sinc.generateFrac(p, &CDSPSincFilterGen::calcWindowKaiser, + ElementSize); + + normalizeFIRFilter(p, FilterLen, 1.0, ElementSize); + p += FilterSize; + } + } + + const int TablePos2 = FilterSize; + const int TablePos3 = FilterSize * 2; + const int TablePos4 = FilterSize * 3; + const int TablePos5 = FilterSize * 4; + const int TablePos6 = FilterSize * 5; + const int TablePos7 = FilterSize * 6; + const int TablePos8 = FilterSize * 7; + double* const TableEnd = Table + (FilterFracs + 1) * FilterSize; + p = Table; + + if (InterpPoints == 8) + { + if (ElementSize == 3) + { + // Calculate 2nd order spline (polynomial) interpolation + // coefficients using 8 points. + + while (p < TableEnd) + { + calcSpline2p8Coeffs(p, p[0], p[TablePos2], + p[TablePos3], p[TablePos4], p[TablePos5], + p[TablePos6], p[TablePos7], p[TablePos8]); + + p += ElementSize; + } + } + else if (ElementSize == 4) + { + // Calculate 3rd order spline (polynomial) interpolation + // coefficients using 8 points. + + while (p < TableEnd) + { + calcSpline3p8Coeffs(p, p[0], p[TablePos2], + p[TablePos3], p[TablePos4], p[TablePos5], + p[TablePos6], p[TablePos7], p[TablePos8]); + + p += ElementSize; + } + } + } + else + { + // Calculate linear interpolation coefficients. + + while (p < TableEnd) + { + p[1] = p[TablePos2] - p[0]; + p += ElementSize; + } + } + } + + /** + * @param i Filter index, in the range 0 to FilterFracs, inclusive. + * @return Reference to the filter. + */ + + const double& operator [](const int i) const + { + R8BASSERT(i >= 0 && i <= FilterFracs); + + return (Table[i * FilterSize]); + } + + private: + static const int FilterSize = FilterLen * ElementSize; ///< This constant + ///< specifies the "size" of a single filter in "double" elements. + ///< + double Table[ FilterSize * (FilterFracs + InterpPoints)]; ///< The + ///< table of fractional delay filters for all discrete fractional + ///< x = 0..1 sample positions, and interpolation coefficients. + ///< + }; + + /** + * @brief Fractional delay filter bank-based interpolator class. + * + * Class implements the fractional delay interpolator. This implementation at + * first puts the input signal into a ring buffer and then performs + * interpolation. The interpolation is performed using sinc-based fractional + * delay filters. These filters are contained in a bank, and for higher + * precision they are interpolated between adjacent filters. + * + * To increase sample timing precision, this class uses "resettable counter" + * approach. This gives less than "1 per 100 billion" sample timing error when + * converting 44100 to 48000 sample rate. + * + * VERY IMPORTANT: the interpolation step should not exceed FilterLen / 2 + 1 + * samples or the algorithm in its current form will fail. However, this + * condition can be easily met if the input signal is suitably downsampled + * first before the interpolation is performed. + * + * @param FilterLen Specifies the number of samples (taps) each fractional + * delay filter should have. See the r8b::CDSPFracDelayFilterBank class for + * more details. + * @param FilterFracs The number of fractional delay positions to sample. See + * the r8b::CDSPFracDelayFilterBank class for more details. + */ + + template + class CDSPFracInterpolator final : public CDSPProcessor + { + public: + /** + * Constructor initalizes the interpolator. It is important to call the + * getMaxOutLen() function afterwards to obtain the optimal output buffer + * length. + * + * @param aSrcSampleRate Source sample rate. + * @param aDstSampleRate Destination sample rate. + * @param aInitFracPos Initial fractional position, in samples, in the + * range [0; 1). A non-zero value can be specified to remove the + * fractional delay introduced by a minimum-phase filter. This value is + * usually equal to the CDSPBlockConvolver.getLatencyFrac() value. + */ + + CDSPFracInterpolator(const double aSrcSampleRate, + const double aDstSampleRate, const double aInitFracPos) + : SrcSampleRate(aSrcSampleRate) + , DstSampleRate(aDstSampleRate) + , InitFracPos(aInitFracPos) + { + R8BASSERT(SrcSampleRate > 0.0); + R8BASSERT(DstSampleRate > 0.0); + R8BASSERT(InitFracPos >= 0.0 && InitFracPos < 1.0); + R8BASSERT(BufLenBits >= 5); + R8BASSERT(( 1 << BufLenBits ) >= FilterLen * 3); + + clear(); + } + + int getLatency() const override { return (0); } + + double getLatencyFrac() const override { return (0.0); } + + int getInLenBeforeOutStart(const int NextInLen) const override { return (FilterLenD2 + NextInLen); } + + int getMaxOutLen(const int MaxInLen) const override + { + R8BASSERT(MaxInLen >= 0); + + return ((int)ceil(MaxInLen * DstSampleRate / SrcSampleRate) + 1); + } + + /** + * Function changes the destination sample rate "on the fly". Note that + * the getMaxOutLen() function may needed to be called after calling this + * function as the maximal number of output samples produced by the + * interpolator depends on the destination sample rate. + * + * It can be a useful approach to construct *this object passing the + * maximal possible destination sample rate to the constructor, obtaining + * the getMaxOutLen() value and then setting the destination sample rate + * to whatever lower value is needed. + * + * It is advisable to change the sample rate in small increments, and as + * rarely as possible: e.g. every several samples. + * + * @param NewDstSampleRate New destination sample rate. + */ + + void setDstSampleRate(const double NewDstSampleRate) + { + R8BASSERT(DstSampleRate > 0.0); + + DstSampleRate = NewDstSampleRate; + InCounter = 0; + InPosInt = 0; + InPosShift = InPosFrac; + } + + /** + * Function clears (resets) the state of *this object and returns it to + * the state after construction. All input data accumulated in the + * internal buffer so far will be discarded. + * + * Note that the destination sample rate will remain unchanged, even if it + * was changed since the time of *this object's construction. + */ + void clear() override + { + BufLeft = 0; + WritePos = 0; + ReadPos = BufLen - FilterLenD2Minus1; // Set "read" position to + // account for filter's latency at zero fractional delay which + // equals to FilterLenD2Minus1. + + memset(&Buf[ReadPos], 0, FilterLenD2Minus1 * sizeof(double)); + + InCounter = 0; + InPosInt = 0; + InPosFrac = InitFracPos; + InPosShift = InitFracPos; + } + + int process(double* ip, int l, double*& op0) override + { + R8BASSERT(l >= 0); + R8BASSERT(ip != op0 || l == 0 || SrcSampleRate > DstSampleRate); + + double* op = op0; + + while (l > 0) + { + // Add new input samples to both halves of the ring buffer. + + const int b = min(min(l, BufLen - WritePos), + BufLeftMax - BufLeft); + + double* const wp1 = Buf + WritePos; + double* const wp2 = wp1 + BufLen; + int i; + + for (i = 0; i < b; ++i) + { + wp1[i] = ip[i]; + wp2[i] = ip[i]; + } + + ip += b; + WritePos = (WritePos + b) & BufLenMask; + l -= b; + BufLeft += b; + + // Produce as many output samples as possible. + + while (BufLeft >= FilterLenD2Plus1) + { + double x = InPosFrac * FilterFracs; + const int fti = (int)x; // Function table index. + x -= fti; // Coefficient for interpolation between adjacent + // fractional delay filters. + const double x2 = x * x; + const double* const ftp = &FilterBank[fti]; + const double* const rp = Buf + ReadPos; + double s = 0.0; + int ii = 0; + +#if R8B_FLTTEST + const double x3 = x2 * x; +#endif // R8B_FLTTEST + + for (i = 0; i < FilterLen; ++i) + { +#if !R8B_FLTTEST + s += (ftp[ii] + ftp[ii + 1] * x + + ftp[ii + 2] * x2) * rp[i]; +#else // !R8B_FLTTEST + s += ( ftp[ ii ] + ftp[ ii + 1 ] * x + + ftp[ ii + 2 ] * x2 + ftp[ ii + 3 ] * x3 ) * rp[ i ]; +#endif // !R8B_FLTTEST + + ii += FilterElementSize; + } + + *op = s; + op++; + + InCounter++; + const double NextInPos = + InCounter * SrcSampleRate / DstSampleRate + InPosShift; + + const int NextInPosInt = (int)NextInPos; + const int PosIncr = NextInPosInt - InPosInt; + InPosInt = NextInPosInt; + InPosFrac = NextInPos - NextInPosInt; + + ReadPos = (ReadPos + PosIncr) & BufLenMask; + BufLeft -= PosIncr; + } + } + + if (InCounter > 1000) + { + // Reset the interpolation position counter to achieve a higher + // sample timing precision. + + InCounter = 0; + InPosInt = 0; + InPosShift = InPosFrac; + } + + return (int(op - op0)); + } + + private: +#if !R8B_FLTTEST + static const int FilterElementSize = 3; ///< The number of "doubles" a + ///< single filter tap consists of (includes interpolation + ///< coefficients). + ///< +#else // !R8B_FLTTEST + static const int FilterElementSize = 4; ///< The number of "doubles" a + ///< single filter tap consists of (includes interpolation + ///< coefficients). During filter testing a higher precision + ///< interpolation is used. + ///< +#endif // !R8B_FLTTEST + + static const int FilterLenD2 = FilterLen >> 1; ///< = FilterLen / 2. + ///< + static const int FilterLenD2Minus1 = FilterLenD2 - 1; ///< = + ///< FilterLen / 2 - 1. This value also equals to filter's latency in + ///< samples (taps). + ///< + static const int FilterLenD2Plus1 = FilterLenD2 + 1; ///< = + ///< FilterLen / 2 + 1. + ///< + static const int BufLenBits = 8; ///< The length of the ring buffer, + ///< expressed as Nth power of 2. This value can be reduced if it is + ///< known that only short input buffers will be passed to the + ///< interpolator. The minimum value of this parameter is 5, and + ///< 1 << BufLenBits should be at least 3 times larger than the + ///< FilterLen. + ///< + static const int BufLen = 1 << BufLenBits; ///< The length of the ring + ///< buffer. The actual length is twice as long to allow "beyond max + ///< position" positioning. + ///< + static const int BufLenMask = BufLen - 1; ///< Mask used for quick buffer + ///< position wrapping. + ///< + static const int BufLeftMax = BufLen - FilterLenD2Minus1; ///< The number + ///< of new samples that the ring buffer can hold at most. The + ///< remaining FilterLenD2Minus1 samples hold "previous" input samples + ///< for the filter. + ///< + double Buf[ BufLen * 2 ]; ///< The ring buffer. + ///< + double SrcSampleRate = 0; ///< Source sample rate. + ///< + double DstSampleRate = 0; ///< Destination sample rate. + ///< + double InitFracPos = 0; ///< Initial fractional position, in samples, in the + ///< range [0; 1). + ///< + int BufLeft = 0; ///< The number of samples left in the buffer to process. + ///< When this value is below FilterLenD2Plus1, the interpolation + ///< cycle ends. + ///< + int WritePos = 0; ///< The current buffer write position. Incremented together + ///< with the BufLeft variable. + ///< + int ReadPos = 0; ///< The current buffer read position. + ///< + int InCounter = 0; ///< Interpolation step counter. + ///< + int InPosInt = 0; ///< Interpolation position (integer part). + ///< + double InPosFrac = 0; ///< Interpolation position (fractional part). + ///< + double InPosShift = 0; ///< Interpolation position fractional shift. + ///< + +#if !R8B_FLTTEST + static const CDSPFracDelayFilterBank FilterBank; ///< Filter bank object, defined statically if no + ///< filter test takes place. + ///< +#else // !R8B_FLTTEST +public: + CDSPFracDelayFilterBank< FilterLen, FilterFracs, 4, 8 > FilterBank; ///< + ///< Filter bank object, defined as a member variable to allow for + ///< recalculation. + ///< +#endif // !R8B_FLTTEST + }; + + // --------------------------------------------------------------------------- + +#if !R8B_FLTTEST + template + const CDSPFracDelayFilterBank + CDSPFracInterpolator::FilterBank; +#endif // !R8B_FLTTEST + + // --------------------------------------------------------------------------- +} // namespace r8b + +#endif // R8B_CDSPFRACINTERPOLATOR_INCLUDED diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPProcessor.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPProcessor.h new file mode 100644 index 0000000..d829556 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPProcessor.h @@ -0,0 +1,105 @@ +//$ nocpp + +/** + * @file CDSPProcessor.h + * + * @brief The base virtual class for DSP processing algorithms. + * + * This file includes the base virtual class for DSP processing algorithm + * classes like FIR filtering and interpolation. + * + * r8brain-free-src Copyright (c) 2013-2014 Aleksey Vaneev + * See the "License.txt" file for license. + */ + +#pragma once + +#include "r8bbase.h" + +namespace r8b +{ + + /** + * @brief The base virtual class for DSP processing algorithms. + * + * This class can be used as a base class for various DSP processing + * algorithms (processors). DSP processors that are derived from this class + * can be seamlessly integrated into various DSP processing graphs. + */ + + class CDSPProcessor : public R8B_BASECLASS + { + R8BNOCTOR(CDSPProcessor) + + public: + CDSPProcessor() { } + + virtual ~CDSPProcessor() { } + + /** + * @return The latency, in samples, which is present in the output signal. + * This value is usually zero if the DSP processor "consumes" the latency + * automatically. + */ + + virtual int getLatency() const = 0; + + /** + * @return Fractional latency, in samples, which is present in the output + * signal. This value is usually zero if a linear-phase filtering is used. + * With minimum-phase filters in use, this value can be non-zero even if + * the getLatency() function returns zero. + */ + + virtual double getLatencyFrac() const = 0; + + /** + * @param NextInLen The number of input samples required before the output + * starts on the next resampling step. + * @return The cumulative number of samples that should be passed to *this + * object before the actual output starts. This value includes latencies + * induced by all processors which run after *this processor in chain. + */ + + virtual int getInLenBeforeOutStart(const int NextInLen) const = 0; + + /** + * @param MaxInLen The number of samples planned to process at once, at + * most. + * @return The maximal length of the output buffer required when + * processing the "MaxInLen" number of input samples. + */ + + virtual int getMaxOutLen(const int MaxInLen) const = 0; + + /** + * Function clears (resets) the state of *this object and returns it to + * the state after construction. All input data accumulated in the + * internal buffer so far will be discarded. + */ + + virtual void clear() = 0; + + /** + * Function performs DSP processing. + * + * @param ip Input data pointer. + * @param l0 How many samples to process. + * @param[out] op0 Output data pointer. The capacity of this buffer should + * be equal to the value returned by the getMaxOutLen() function for the + * given "l0". This buffer can be equal to "ip" only if the + * getMaxOutLen( l0 ) function returned a value lesser than "l0". This + * pointer can be incremented on function's return if latency compensation + * was performed by the processor. Note that on function's return, this + * pointer may point to some internal buffers, including the "ip" buffer, + * ignoring the originally passed value. + * @return The number of output samples written to the "op0" buffer and + * available after processing. This value can be smaller or larger in + * comparison to the original "l0" value due to processing and filter's + * latency compensation that took place, and due to resampling if it was + * performed. + */ + + virtual int process(double* ip, int l0, double*& op0) = 0; + }; +} // namespace r8b diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPRealFFT.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPRealFFT.h new file mode 100644 index 0000000..a9e198a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPRealFFT.h @@ -0,0 +1,592 @@ +//$ nocpp + +/** + * @file CDSPRealFFT.h + * + * @brief Real-valued FFT transform class. + * + * This file includes FFT object implementation. All created FFT objects are + * kept in a global list after use for future reusal. Such approach minimizes + * time necessary to initialize the FFT object of the required length. + * + * r8brain-free-src Copyright (c) 2013-2014 Aleksey Vaneev + * See the "License.txt" file for license. + */ + +#ifndef R8B_CDSPREALFFT_INCLUDED +#define R8B_CDSPREALFFT_INCLUDED + +#include "r8bbase.h" + +#if !R8B_IPP +#include "fft4g.h" +#endif // !R8B_IPP + +namespace r8b +{ + + /** + * @brief Real-valued FFT transform class. + * + * Class implements a wrapper for real-valued discrete fast Fourier transform + * functions. The object of this class can only be obtained via the + * CDSPRealFFTKeeper class. + * + * Uses functions from the FFT package by: Copyright(C) 1996-2001 Takuya OOURA + * http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html + * + * Also uses Intel IPP library functions if available (the R8B_IPP=1 macro was + * defined). Note that IPP library's FFT functions are 2-3 times more + * efficient on the modern Intel Core i7-3770K processor than Ooura's + * functions. It may be worthwhile investing in IPP. Note, that FFT functions + * take less than 20% of the overall sample rate conversion time. However, + * when the "power of 2" resampling is used the performance of FFT functions + * becomes "everything". + */ + + class CDSPRealFFT : public R8B_BASECLASS + { + R8BNOCTOR(CDSPRealFFT) + + friend class CDSPRealFFTKeeper; + + public: + /** + * @return A multiplication constant that should be used after inverse + * transform to obtain a correct value scale. + */ + + double getInvMulConst() const { return (InvMulConst); } + + /** + * @return The length (the number of real values in a transform) of *this + * FFT object, expressed as Nth power of 2. + */ + + int getLenBits() const { return (LenBits); } + + /** + * @return The length (the number of real values in a transform) of *this + * FFT object. + */ + + int getLen() const { return (Len); } + + /** + * Function performs in-place forward FFT. + * + * @param[in,out] p Pointer to data block to transform, length should be + * equal to *this object's getLen(). + */ + + void forward(double* const p) const + { +#if R8B_IPP + + ippsFFTFwd_RToPerm_64f( p, p, SPtr, WorkBuffer ); + +#else // R8B_IPP + + ooura_fft::rdft(Len, 1, p, wi.getPtr(), wd.getPtr()); + +#endif // R8B_IPP + } + + /** + * Function performs in-place inverse FFT. + * + * @param[in,out] p Pointer to data block to transform, length should be + * equal to *this object's getLen(). + */ + + void inverse(double* const p) const + { +#if R8B_IPP + + ippsFFTInv_PermToR_64f( p, p, SPtr, WorkBuffer ); + +#else // R8B_IPP + + ooura_fft::rdft(Len, -1, p, wi.getPtr(), wd.getPtr()); + +#endif // R8B_IPP + } + + /** + * Function multiplies two complex-valued data blocks and places result in + * a new data block. Length of all data blocks should be equal to *this + * object's block length. Input blocks should have been produced with the + * forward() function of *this object. + * + * @param ip1 Input data block 1. + * @param ip2 Input data block 2. + * @param[out] op Output data block, should not be equal to ip1 nor ip2. + */ + + void multiplyBlocks(const double* const ip1, const double* const ip2, double* const op) const + { +#if R8B_IPP + + ippsMulPerm_64f( (Ipp64f*) ip1, (Ipp64f*) ip2, (Ipp64f*) op, Len ); + +#else // R8B_IPP + + op[0] = ip1[0] * ip2[0]; + op[1] = ip1[1] * ip2[1]; + + int i = 2; + + while (i < Len) + { + op[i] = ip1[i] * ip2[i] - ip1[i + 1] * ip2[i + 1]; + op[i + 1] = ip1[i] * ip2[i + 1] + ip1[i + 1] * ip2[i]; + i += 2; + } + +#endif // R8B_IPP + } + + /** + * Function is similar to the multiplyBlocks() function, but instead of + * replacing data in the output buffer, the data is summed with the output + * buffer. + * + * @param ip1 Input data block 1. + * @param ip2 Input data block 2. + * @param[out] op Output data block, should not be equal to ip1 nor ip2. + */ + + void multiplyBlocksAdd(const double* const ip1, const double* const ip2, double* const op) const + { + op[0] += ip1[0] * ip2[0]; + op[1] += ip1[1] * ip2[1]; + +#if R8B_IPP + + ippsAddProduct_64fc( (const Ipp64fc*) ( ip1 + 2 ), (const Ipp64fc*) ( ip2 + 2 ), (Ipp64fc*) ( op + 2 ), ( Len >> 1 ) - 1 ); + +#else // R8B_IPP + + int i = 2; + + while (i < Len) + { + op[i] += ip1[i] * ip2[i] - ip1[i + 1] * ip2[i + 1]; + op[i + 1] += ip1[i] * ip2[i + 1] + ip1[i + 1] * ip2[i]; + i += 2; + } + +#endif // R8B_IPP + } + + /** + * Function multiplies two complex-valued data blocks in-place. Length of + * both data blocks should be equal to *this object's block length. Blocks + * should have been produced with the forward() function of *this object. + * + * @param ip Input data block 1. + * @param[in,out] op Output/input data block 2. + */ + + void multiplyBlocks(const double* const ip, double* const op) const + { +#if R8B_IPP + + ippsMulPerm_64f( (Ipp64f*) op, (Ipp64f*) ip, (Ipp64f*) op, Len ); + +#else // R8B_IPP + + op[0] *= ip[0]; + op[1] *= ip[1]; + + int i = 2; + + while (i < Len) + { + const double t = op[i] * ip[i] - op[i + 1] * ip[i + 1]; + op[i + 1] = op[i] * ip[i + 1] + op[i + 1] * ip[i]; + op[i] = t; + i += 2; + } + +#endif // R8B_IPP + } + + /** + * Function multiplies two complex-valued data blocks in-place, + * considering that the "ip" block contains "zero-phase" response. Length + * of both data blocks should be equal to *this object's block length. + * Blocks should have been produced with the forward() function of *this + * object. + * + * @param ip Input data block 1, "zero-phase" response. + * @param[in,out] op Output/input data block 2. + */ + + void multiplyBlocksZ(const double* const ip, double* const op) const + { + op[0] *= ip[0]; + op[1] *= ip[1]; + + int i = 2; + + while (i < Len) + { + op[i] *= ip[i]; + op[i + 1] *= ip[i]; + i += 2; + } + } + + /** + * Function performs in-place spectrum squaring. May cause aliasing + * if the filter was not zero-padded before the forward() function call. + * + * @param[in,out] p Pointer to data block to square, length should be + * equal to *this object's getLen(). This data block should contain + * complex spectrum data, previously obtained via the forward() function. + */ + + void sqr(double* const p) const + { + p[0] *= p[0]; + p[1] *= p[1]; + +#if R8B_IPP + + ippsSqr_64fc( (Ipp64fc*) ( p + 2 ), (Ipp64fc*) ( p + 2 ), + ( Len >> 1 ) - 1 ); + +#else // R8B_IPP + + int i = 2; + + while (i < Len) + { + const double r = p[i] * p[i] - p[i + 1] * p[i + 1]; + p[i + 1] = p[i] * (p[i + 1] + p[i + 1]); + p[i] = r; + i += 2; + } + +#endif // R8B_IPP + } + + private: + int LenBits = 0; ///< Length of FFT block (expressed as Nth power of 2). + ///< + int Len = 0; ///< Length of FFT block (number of real values). + ///< + double InvMulConst = 0; ///< Inverse FFT multiply constant. + ///< + CDSPRealFFT* Next = nullptr; ///< Next object in a singly-linked list. + ///< + +#if R8B_IPP + IppsFFTSpec_R_64f* SPtr = nullptr; ///< Pointer to initialized data buffer + ///< to be passed to IPP's FFT functions. + ///< + CFixedBuffer< unsigned char > SpecBuffer; ///< Working buffer. + ///< + CFixedBuffer< unsigned char > WorkBuffer; ///< Working buffer. + ///< +#else // R8B_IPP + CFixedBuffer wi; ///< Working buffer (ints). + ///< + CFixedBuffer wd; ///< Working buffer (doubles). + ///< +#endif // R8B_IPP + + /** + * A simple class that keeps the pointer to the object and deletes it + * automatically. + */ + + class CObjKeeper + { + R8BNOCTOR(CObjKeeper) + + public: + CObjKeeper() { } + + ~CObjKeeper() { delete Object; } + + CObjKeeper& operator =(CDSPRealFFT* const aObject) + { + Object = aObject; + return (*this); + } + + operator CDSPRealFFT*() const { return (Object); } + + private: + CDSPRealFFT* Object = nullptr; ///< FFT object being kept. + ///< + }; + + CDSPRealFFT() { } + + /** + * Constructor initializes FFT object. + * + * @param aLenBits The length of FFT block (Nth power of 2), specifies the + * number of real values in a block. Values from 1 to 30 inclusive are + * supported. + */ + + CDSPRealFFT(const int aLenBits) + : LenBits(aLenBits), Len(1 << aLenBits) +#if R8B_IPP + , InvMulConst( 1.0 / Len ) +#else // R8B_IPP + , InvMulConst(2.0 / Len) +#endif // R8B_IPP + { +#if R8B_IPP + + int SpecSize = 0; + int SpecBufferSize = 0; + int BufferSize = 0; + + ippsFFTGetSize_R_64f( LenBits, IPP_FFT_NODIV_BY_ANY, + ippAlgHintFast, &SpecSize, &SpecBufferSize, &BufferSize ); + + CFixedBuffer< unsigned char > InitBuffer( SpecBufferSize ); + SpecBuffer.alloc( SpecSize ); + WorkBuffer.alloc( BufferSize ); + + ippsFFTInit_R_64f( &SPtr, LenBits, IPP_FFT_NODIV_BY_ANY, + ippAlgHintFast, SpecBuffer, InitBuffer ); + +#else // R8B_IPP + + wi.alloc((int)ceil(2.0 + sqrt(double(Len >> 1)))); + wi[0] = 0; + wd.alloc(Len >> 1); + +#endif // R8B_IPP + } + + ~CDSPRealFFT() { delete Next; } + }; + + /** + * @brief A "keeper" class for real-valued FFT transform objects. + * + * Class implements "keeper" functionality for handling CDSPRealFFT objects. + * The allocated FFT objects are placed on the global static list of objects + * for future reuse instead of deallocation. + */ + + class CDSPRealFFTKeeper : public R8B_BASECLASS + { + R8BNOCTOR(CDSPRealFFTKeeper) + + public: + CDSPRealFFTKeeper() { } + + /** + * Function acquires FFT object with the specified block length. + * + * @param LenBits The length of FFT block (Nth power of 2), in the range + * [1; 30] inclusive, specifies the number of real values in a FFT block. + */ + + CDSPRealFFTKeeper(const int LenBits) { Object = acquire(LenBits); } + + ~CDSPRealFFTKeeper() { if (Object != nullptr) { release(Object); } } + + /** + * @return Pointer to the acquired FFT object. + */ + + const CDSPRealFFT* operator ->() const + { + R8BASSERT(Object != nullptr); + + return (Object); + } + + /** + * Function acquires FFT object with the specified block length. This + * function can be called any number of times. + * + * @param LenBits The length of FFT block (Nth power of 2), in the range + * [1; 30] inclusive, specifies the number of real values in a FFT block. + */ + + void init(const int LenBits) + { + if (Object != nullptr) + { + if (Object->LenBits == LenBits) { return; } + + release(Object); + } + + Object = acquire(LenBits); + } + + /** + * Function releases a previously acquired FFT object. + */ + + void reset() + { + if (Object != nullptr) + { + release(Object); + Object = nullptr; + } + } + + private: + CDSPRealFFT* Object = nullptr; ///< FFT object. + ///< + + static CSyncObject StateSync; ///< FFTObjects synchronizer. + ///< + static CDSPRealFFT::CObjKeeper FFTObjects[]; ///< Pool of FFT objects of + ///< various lengths. + ///< + + /** + * Function acquires FFT object from the global pool. + * + * @param LenBits FFT block length (expressed as Nth power of 2). + */ + + CDSPRealFFT* acquire(const int LenBits) + { + R8BASSERT(LenBits > 0 && LenBits <= 30); + + R8BSYNC(StateSync); + + if (FFTObjects[LenBits] == nullptr) { return (new CDSPRealFFT(LenBits)); } + + CDSPRealFFT* ffto = FFTObjects[LenBits]; + FFTObjects[LenBits] = ffto->Next; + + return (ffto); + } + + /** + * Function releases a previously acquired FFT object. + * + * @param ffto FFT object to release. + */ + + void release(CDSPRealFFT* const ffto) + { + R8BSYNC(StateSync); + + ffto->Next = FFTObjects[ffto->LenBits]; + FFTObjects[ffto->LenBits] = ffto; + } + }; + + /** + * Function calculates the minimum-phase transform of the filter kernel, using + * a discrete Hilbert transform in cepstrum domain. + * + * For more details, see part III.B of + * http://www.hpl.hp.com/personal/Niranjan_Damera-Venkata/files/ComplexMinPhase.pdf + * + * @param[in,out] Kernel Filter kernel buffer. + * @param KernelLen Filter kernel's length, in samples. + * @param LenMult Kernel length multiplier. Used as a coefficient of the + * "oversampling" in the frequency domain. Such oversampling is needed to + * improve the precision of the minimum-phase transform. If the filter's + * attenuation is high, this multiplier should be increased or otherwise the + * required attenuation will not be reached due to "smoothing" effect of this + * transform. + * @param DoFinalMul "True" if the final multiplication after transform should + * be performed or not. Such multiplication returns the gain of the signal to + * its original value. This parameter can be set to "false" if normalization + * of the resulting filter kernel is planned to be used. + * @param[out] DCGroupDelay If not NULL, this variable receives group delay + * at DC offset, in samples (can be a non-integer value). + */ + + inline void calcMinPhaseTransform(double* const Kernel, const int KernelLen, + const int LenMult = 2, const bool DoFinalMul = true, + double* const DCGroupDelay = nullptr) + { + R8BASSERT(KernelLen > 0); + R8BASSERT(LenMult >= 2); + + const int LenBits = getBitOccupancy((KernelLen * LenMult) - 1); + const int Len = 1 << LenBits; + const int Len2 = Len >> 1; + int i; + + CFixedBuffer ip(Len); + CFixedBuffer ip2(Len2 + 1); + + memcpy(&ip[0], Kernel, KernelLen * sizeof(double)); + memset(&ip[KernelLen], 0, (Len - KernelLen) * sizeof(double)); + + CDSPRealFFTKeeper ffto(LenBits); + ffto->forward(ip); + + // Create the "log |c|" spectrum while saving the original power spectrum + // in the "ip2" buffer. + + ip2[0] = ip[0]; + ip[0] = log(fabs(ip[0]) + 1e-50); + ip2[Len2] = ip[1]; + ip[1] = log(fabs(ip[1]) + 1e-50); + + for (i = 1; i < Len2; ++i) + { + ip2[i] = sqrt(ip[i * 2] * ip[i * 2] + + ip[i * 2 + 1] * ip[i * 2 + 1]); + + ip[i * 2] = log(ip2[i] + 1e-50); + ip[i * 2 + 1] = 0.0; + } + + // Convert to cepstrum and apply discrete Hilbert transform. + + ffto->inverse(ip); + + ip[0] = 0.0; + + for (i = 1; i < Len2; ++i) { ip[i] *= ffto->getInvMulConst(); } + + ip[Len2] = 0.0; + + for (i = Len2 + 1; i < Len; ++i) { ip[i] *= -ffto->getInvMulConst(); } + + // Convert Hilbert-transformed cepstrum back to the "log |c|" spectrum and + // perform its exponentiation, multiplied by the power spectrum previously + // saved in the "ip2" buffer. + + ffto->forward(ip); + + ip[0] = ip2[0]; + ip[1] = ip2[Len2]; + + for (i = 1; i < Len2; ++i) + { + const double p = ip2[i]; + ip[i * 2 + 0] = cos(ip[i * 2 + 1]) * p; + ip[i * 2 + 1] = sin(ip[i * 2 + 1]) * p; + } + + ffto->inverse(ip); + + if (DoFinalMul) { for (i = 0; i < KernelLen; ++i) { Kernel[i] = ip[i] * ffto->getInvMulConst(); } } + else { memcpy(&Kernel[0], &ip[0], KernelLen * sizeof(double)); } + + if (DCGroupDelay != nullptr) + { + double tmp; + + calcFIRFilterResponseAndGroupDelay(Kernel, KernelLen, 0.0, + tmp, tmp, *DCGroupDelay); + } + } +} // namespace r8b + +#endif // VOX_CDSPREALFFT_INCLUDED diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPResampler.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPResampler.h new file mode 100644 index 0000000..7ec506b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPResampler.h @@ -0,0 +1,521 @@ +//$ nocpp + +/** + * @file CDSPResampler.h + * + * @brief The master sample rate converter (resampler) class. + * + * This file includes the master sample rate converter (resampler) class that + * combines all elements of this library into a single front-end class. + * + * r8brain-free-src Copyright (c) 2013-2014 Aleksey Vaneev + * See the "License.txt" file for license. + */ + +#ifndef R8B_CDSPRESAMPLER_INCLUDED +#define R8B_CDSPRESAMPLER_INCLUDED + +#include "CDSPBlockConvolver.h" +#include "CDSPFracInterpolator.h" + +namespace r8b +{ + + /** + * @brief The master sample rate converter (resampler) class. + * + * This class can be considered the "master" sample rate converter (resampler) + * class since it combines all functionality of this library into a single + * front-end class to perform sample rate conversion to/from any sample rate, + * including non-integer sample rates. + * + * Note that objects of this class can be constructed on the stack as it has a + * small member data size. The default template parameters of this class are + * suited for 27-bit fixed point resampling. + * + * Use the CDSPResampler16 class for 16-bit resampling. + * + * Use the CDSPResampler16IR class for 16-bit impulse response resampling. + * + * Use the CDSPResampler24 class for 24-bit resampling (including 32-bit + * floating point resampling). + * + * @param CInterpClass Interpolator class that should be used by the + * resampler. The desired interpolation quality can be defined via the + * template parameters of the interpolator class. See + * r8b::CDSPFracInterpolator and r8b::CDSPFracDelayFilterBank for description + * of the template parameters. + */ + + template > + class CDSPResampler : public CDSPProcessor + { + public: + /** + * Constructor initalizes the resampler object. + * + * Note that increasing the transition band and decreasing attenuation + * reduces the filter length, this in turn reduces the "input before + * output" delay. However, the filter length has only a minor influence on + * the overall resampling speed. + * + * It should be noted that the ReqAtten specifies the minimal difference + * between the loudest input signal component and the produced aliasing + * artifacts during resampling. For example, if ReqAtten=100 was specified + * when performing 2x upsampling, the analysis of the resulting signal may + * display high-frequency components which are quieter than the loudest + * part of the input signal by only 100 decibel meaning the high-frequency + * part did not become "magically" completely silent after resampling. You + * have to specify a higher ReqAtten value if you need a totally clean + * high-frequency content. On the other hand, it may not be reasonable to + * have a high-frequency content cleaner than the input signal itself: if + * the input signal is 16-bit, setting ReqAtten to 150 will make its + * high-frequency content 24-bit, but the original part of the signal will + * remain 16-bit. + * + * @param SrcSampleRate Source signal sample rate. Both sample rates can + * be specified as a ratio, e.g. SrcSampleRate = 1.0, DstSampleRate = 2.0. + * @param DstSampleRate Destination signal sample rate. The "power of 2" + * ratios between the source and destination sample rates force resampler + * to use several fast "power of 2" resampling steps, without using + * fractional interpolation at all. Note that the "power of 2" upsampling + * (but not downsampling) requires a lot of buffer memory: e.g. upsampling + * by a factor of 16 requires an intermediate buffer MaxInLen*(16+8) + * samples long. So, when doing the "power of 2" upsampling it is highly + * recommended to do it in small steps, e.g. no more than 256 samples at + * once (also set the MaxInLen to 256). + * @param MaxInLen The maximal planned length of the input buffer (in + * samples) that will be passed to the resampler. The resampler relies on + * this value as it allocates intermediate buffers. Input buffers longer + * than this value should never be supplied to the resampler. Note that + * the resampler may use the input buffer itself for intermediate sample + * data storage. + * @param ReqTransBand Required transition band, in percent of the + * spectral space of the input signal (or the output signal if + * downsampling is performed) between filter's -3 dB point and the Nyquist + * frequency. The range is from CDSPFIRFilter::getLPMinTransBand() to + * CDSPFIRFilter::getLPMaxTransBand(), inclusive. When upsampling 88200 or + * 96000 audio to a higher sample rates the ReqTransBand can be + * considerably increased, up to 30. The selection of ReqTransBand depends + * on the level of desire to preserve the high-frequency content. While + * values 0.5 to 2 are extremely "greedy" settings, not necessary in most + * cases, values 2 to 3 can be used in most cases. Values 3 to 4 are + * relaxed settings, but they still offer a flat frequency response up to + * 21kHz with 44.1k source or destination sample rate. + * @param ReqAtten Required stop-band attenuation in decibel, in the range + * CDSPFIRFilter::getLPMinAtten() to CDSPFIRFilter::getLPMaxAtten(), + * inclusive. The actual attenuation may be 0.40-4.46 dB higher. The + * general formula for selecting the ReqAtten is 6.02 * Bits + 40, where + * "Bits" is the bit resolution (e.g. 16, 24), "40" is an added resolution + * for stationary signals, this value can be decreased to 20 to 10 if the + * signal being resampled is mostly non-stationary (e.g. impulse + * response). + * @param ReqPhase Required filter's phase response. Note that this + * setting does not affect interpolator's phase response which is always + * linear-phase. Also note that if the "power of 2" resampling was engaged + * by the resampler together with the minimum-phase response, the audio + * stream may become fractionally delayed by up to 1 sample, depending on + * the minimum-phase filter's actual fractional delay. If the output + * stream should always start at "time zero" offset with minimum-phase + * filters the UsePower2 should be set to "false". Linear-phase filters + * do not have fractional delay. + * @param UsePower2 "True" if the "power of 2" resampling optimization + * should be used when possible. This value should be set to "false" if + * the access to interpolator is needed in any case (also the source and + * destination sample rates should not be equal). + * @see CDSPFIRFilterCache::getLPFilter() + */ + + CDSPResampler(const double SrcSampleRate, const double DstSampleRate, + const int MaxInLen, const double ReqTransBand = 2.0, + const double ReqAtten = 206.91, + const EDSPFilterPhaseResponse ReqPhase = fprLinearPhase, + const bool UsePower2 = true) + { + R8BASSERT(SrcSampleRate > 0.0); + R8BASSERT(DstSampleRate > 0.0); + R8BASSERT(MaxInLen > 0); + + if (SrcSampleRate == DstSampleRate) + { + ConvCount = 0; + return; + } + + int SrcSRMult; + int SrcSRDiv = 1; + int MaxOutLen = MaxInLen; + int ConvBufCapacities[ 2 ]; + double PrevLatencyFrac = 0.0; + + if (DstSampleRate * 2 > SrcSampleRate) + { + // Only a single convolver with 2X upsampling is required. + + SrcSRMult = 2; + const double NormFreq = (DstSampleRate > SrcSampleRate ? 0.5 : 0.5 * DstSampleRate / SrcSampleRate); + + Convs[0] = new CDSPBlockConvolver(CDSPFIRFilterCache::getLPFilter(NormFreq, ReqTransBand, ReqAtten, ReqPhase, 2.0), 2, 1, 0.0); + + ConvCount = 1; + MaxOutLen = Convs[0]->getMaxOutLen(MaxOutLen); + ConvBufCapacities[0] = MaxOutLen; + PrevLatencyFrac = Convs[0]->getLatencyFrac(); + + // Find if the destination to source sample rate ratio is + // a "power of 2" value. + + int UseConvCount = 1; + + while (true) + { + const double TestSR = SrcSampleRate * (1 << UseConvCount); + + if (TestSR > DstSampleRate) + { + UseConvCount = 0; // Power of 2 not found. + break; + } + + if (TestSR == DstSampleRate) + { + break; // Power of 2 found. + } + + UseConvCount++; + } + + if (UsePower2 && UseConvCount > 0) + { + R8BASSERT(UseConvCount <= ConvCountMax); + + ConvBufCapacities[1] = 0; + ConvCount = UseConvCount; + + for (int i = 1; i < UseConvCount; ++i) + { + const double tb = (i >= 2 ? 45.0 : 34.0); + + Convs[i] = new CDSPBlockConvolver(CDSPFIRFilterCache::getLPFilter(0.5, tb, ReqAtten, ReqPhase, 2.0), 2, 1, PrevLatencyFrac); + + MaxOutLen = Convs[i]->getMaxOutLen(MaxOutLen); + ConvBufCapacities[i & 1] = MaxOutLen; + PrevLatencyFrac = Convs[i]->getLatencyFrac(); + } + + ConvBufs[0].alloc(ConvBufCapacities[0]); + + if (ConvBufCapacities[1] > 0) { ConvBufs[1].alloc(ConvBufCapacities[1]); } + + return; // No interpolator is needed. + } + + ConvBufs[0].alloc(ConvBufCapacities[0]); + } + else + { + SrcSRMult = 1; + ConvBufCapacities[0] = 0; + ConvCount = 0; + const double CheckSR = DstSampleRate * 4; + + while (CheckSR * SrcSRDiv <= SrcSampleRate) + { + SrcSRDiv *= 2; + + // If downsampling is even deeper, use a less steep filter at + // this step. + + const double tb = + (CheckSR * SrcSRDiv <= SrcSampleRate ? 45.0 : 34.0); + + Convs[ConvCount] = new CDSPBlockConvolver(CDSPFIRFilterCache::getLPFilter(0.5, tb, ReqAtten, ReqPhase, 1.0), 1, 2, PrevLatencyFrac); + + MaxOutLen = Convs[ConvCount]->getMaxOutLen(MaxOutLen); + PrevLatencyFrac = Convs[ConvCount]->getLatencyFrac(); + ConvCount++; + + R8BASSERT(ConvCount < ConvCountMax); + } + + const double NormFreq = DstSampleRate * SrcSRDiv / SrcSampleRate; + const int downf = (UsePower2 && NormFreq == 0.5 ? 2 : 1); + + Convs[ConvCount] = new CDSPBlockConvolver(CDSPFIRFilterCache::getLPFilter(NormFreq, ReqTransBand, ReqAtten, ReqPhase, 1.0), 1, downf, + PrevLatencyFrac); + + MaxOutLen = Convs[ConvCount]->getMaxOutLen(MaxOutLen); + PrevLatencyFrac = Convs[ConvCount]->getLatencyFrac(); + ConvCount++; + + if (downf > 1) + { + return; // No interpolator is needed. + } + } + + Interp = new CInterpClass(SrcSampleRate * SrcSRMult / SrcSRDiv, DstSampleRate, PrevLatencyFrac); + + MaxOutLen = Interp->getMaxOutLen(MaxOutLen); + + if (MaxOutLen <= ConvBufCapacities[0]) { InterpBuf = ConvBufs[0]; } + else if (MaxOutLen <= MaxInLen) { InterpBuf = nullptr; } + else + { + TmpBuf.alloc(MaxOutLen); + InterpBuf = TmpBuf; + } + } + + int getLatency() const override { return (0); } + + double getLatencyFrac() const override { return (0.0); } + + int getInLenBeforeOutStart(const int NextInLen) const override + { + int l = (Interp == nullptr ? 0 : Interp->getInLenBeforeOutStart(NextInLen)); + + for (int i = ConvCount - 1; i >= 0; i--) { l = Convs[i]->getInLenBeforeOutStart(l); } + + return (l); + } + + int getMaxOutLen(const int/* MaxInLen */) const override { return (0); } + + /** + * Function clears (resets) the state of *this object and returns it to + * the state after construction. All input data accumulated in the + * internal buffer so far will be discarded. + * + * This function makes it possible to use *this object for converting + * separate streams from the same source sample rate to the same + * destination sample rate without reconstructing the object. It is more + * efficient to clear the state of the resampler object than to destroy it + * and create a new object. + */ + void clear() override + { + for (int i = 0; i < ConvCount; ++i) { Convs[i]->clear(); } + + if (Interp != nullptr) { Interp->clear(); } + } + + /** + * Function performs sample rate conversion. + * + * If the source and destination sample rates are equal, the resampler + * will do nothing and will simply return the input buffer unchanged. + * + * You do not need to allocate an intermediate output buffer for use with + * this function. If required, the resampler will allocate a suitable + * intermediate output buffer itself. + * + * @param ip0 Input buffer. This buffer may be used as output buffer by + * this function. + * @param l The number of samples available in the input buffer. Should + * not exceed the MaxInLen supplied to the constructor. + * @param[out] op0 This variable receives the pointer to the resampled + * data. On function's return, this pointer may point to the address + * within the "ip0" input buffer, or to *this object's internal buffer. In + * real-time applications it is suggested to pass this pointer to the next + * output audio block and consume any data left from the previous output + * audio block first before calling the process() function again. The + * buffer pointed to by the "op0" on return may be owned by the resampler, + * so it should not be freed by the caller. + * @return The number of samples available in the "op0" output buffer. If + * the data from the output buffer "op0" is going to be written to a + * bigger output buffer, it is suggested to check the returned number of + * samples so that no overflow of the bigger output buffer happens. + */ + int process(double* ip0, int l, double*& op0) override + { + R8BASSERT(l >= 0); + + if (ConvCount == 0) + { + op0 = ip0; + return (l); + } + + double* ip = ip0; + double* op = nullptr; + + for (int i = 0; i < ConvCount; ++i) + { + op = (ConvBufs[i & 1] == nullptr ? ip0 : ConvBufs[i & 1]); + l = Convs[i]->process(ip, l, op); + ip = op; + } + + if (Interp == nullptr) + { + op0 = op; + return (l); + } + + op = (InterpBuf == nullptr ? ip0 : InterpBuf); + op0 = op; + + return (Interp->process(ip, l, op)); + } + + /** + * Function performs resampling of an input sample buffer of the specified + * length in the "one-shot" mode. This function can be useful when impulse + * response resampling is required. + * + * @param MaxInLen The max input length value which was previously passed + * to the constructor. + * @param ip Input buffer pointer. + * @param iplen Length of the input buffer in samples. + * @param op Output buffer pointer. + * @param oplen Length of the output buffer in samples. + */ + + void oneshot(const int MaxInLen, const double* ip, int iplen, + double* op, int oplen) + { + const CFixedBuffer ZeroBuf(MaxInLen); + memset(&ZeroBuf[0], 0, MaxInLen * sizeof(double)); + + while (oplen > 0) + { + int rc; + double* p; + + if (iplen == 0) + { + rc = MaxInLen; + p = static_cast(&ZeroBuf[0]); + } + else + { + rc = min(iplen, MaxInLen); + p = const_cast(ip); + ip += rc; + iplen -= rc; + } + + double* op0; + int wc = process(p, rc, op0); + + wc = min(oplen, wc); + memcpy(op, op0, wc * sizeof(double)); + op += wc; + oplen -= wc; + } + + clear(); + } + + private: + static const int ConvCountMax = 8; ///< 8 convolvers with the + ///< built-in 2x up- or downsampling is enough for 256x up- or + ///< downsampling. + ///< + CPtrKeeper Convs[ ConvCountMax ]; ///< Convolvers. + ///< + int ConvCount = 0; ///< The number of objects defined in the Convs[] array. + ///< Equals to 0 if sample rate conversion is not needed. + ///< + CPtrKeeper Interp; ///< Fractional interpolator object. + ///< Equals NULL if no fractional interpolation is required meaning + ///< the "power of 2" resampling is performed or no resampling is + ///< performed at all. + ///< + CFixedBuffer ConvBufs[ 2 ]; ///< Intermediate convolution + ///< buffers to use, used only when at least 2x upsampling is + ///< performed. These buffers are used in flip-flop manner. If NULL + ///< then the input buffer will be used instead. + ///< + CFixedBuffer TmpBuf; ///< Additional output buffer, can be + ///< addressed by the InterpBuf pointer. + ///< + double* InterpBuf = nullptr; ///< Final output interpolation buffer to use. If NULL + ///< then the input buffer will be used instead. Otherwise this + ///< pointer points to either ConvBufs or TmpBuf. + ///< + }; + + /** + * @brief The resampler class for 16-bit resampling. + * + * This class defines resampling parameters suitable for 16-bit resampling, + * using linear-phase low-pass filter. See the r8b::CDSPResampler class for + * details. + */ + + class CDSPResampler16 final : public CDSPResampler> + { + public: + /** + * Constructor initializes the 16-bit resampler. See the + * r8b::CDSPResampler class for details. + * + * @param SrcSampleRate Source signal sample rate. + * @param DstSampleRate Destination signal sample rate. + * @param MaxInLen The maximal planned length of the input buffer (in + * samples) that will be passed to the resampler. + * @param ReqTransBand Required transition band, in percent. + */ + + CDSPResampler16(const double SrcSampleRate, const double DstSampleRate, const int MaxInLen, const double ReqTransBand = 2.0) + : CDSPResampler>(SrcSampleRate, DstSampleRate, MaxInLen, ReqTransBand, 136.45, fprLinearPhase, true) { } + }; + + /** + * @brief The resampler class for 16-bit impulse response resampling. + * + * This class defines resampling parameters suitable for 16-bit impulse + * response resampling, using linear-phase low-pass filter. Impulse responses + * usually do not feature stationary signal components and thus need resampler + * with a less SNR. See the r8b::CDSPResampler class for details. + */ + + class CDSPResampler16IR final : public CDSPResampler> + { + public: + /** + * Constructor initializes the 16-bit impulse response resampler. See the + * r8b::CDSPResampler class for details. + * + * @param SrcSampleRate Source signal sample rate. + * @param DstSampleRate Destination signal sample rate. + * @param MaxInLen The maximal planned length of the input buffer (in + * samples) that will be passed to the resampler. + * @param ReqTransBand Required transition band, in percent. + */ + + CDSPResampler16IR(const double SrcSampleRate, const double DstSampleRate, const int MaxInLen, const double ReqTransBand = 2.0) + : CDSPResampler>(SrcSampleRate, DstSampleRate, MaxInLen, ReqTransBand, 109.56, fprLinearPhase, true) { } + }; + + /** + * @brief The resampler class for 24-bit resampling. + * + * This class defines resampling parameters suitable for 24-bit resampling + * (including 32-bit floating point resampling), using linear-phase low-pass + * filter. See the r8b::CDSPResampler class for details. + */ + + class CDSPResampler24 final : public CDSPResampler> + { + public: + /** + * Constructor initializes the 24-bit resampler (including 32-bit floating + * point). See the r8b::CDSPResampler class for details. + * + * @param SrcSampleRate Source signal sample rate. + * @param DstSampleRate Destination signal sample rate. + * @param MaxInLen The maximal planned length of the input buffer (in + * samples) that will be passed to the resampler. + * @param ReqTransBand Required transition band, in percent. + */ + + CDSPResampler24(const double SrcSampleRate, const double DstSampleRate, const int MaxInLen, const double ReqTransBand = 2.0) + : CDSPResampler>(SrcSampleRate, DstSampleRate, MaxInLen, ReqTransBand, 180.15, fprLinearPhase, true) { } + }; +} // namespace r8b + +#endif // R8B_CDSPRESAMPLER_INCLUDED diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPSincFilterGen.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPSincFilterGen.h new file mode 100644 index 0000000..2569a09 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/CDSPSincFilterGen.h @@ -0,0 +1,783 @@ +//$ nobt +//$ nocpp + +/** + * @file CDSPSincFilterGen.h + * + * @brief Sinc function-based FIR filter generator class. + * + * This file includes the CDSPSincFilterGen class implementation that + * generates FIR filters. + * + * r8brain-free-src Copyright (c) 2013-2014 Aleksey Vaneev + * See the "License.txt" file for license. + */ + +#ifndef R8B_CDSPSINCFILTERGEN_INCLUDED +#define R8B_CDSPSINCFILTERGEN_INCLUDED + +#include "r8bbase.h" + +namespace r8b +{ + + /** + * @brief Sinc function-based FIR filter generator class. + * + * Structure that holds state used to perform generation of sinc functions of + * various types, windowed by the Blackman window by default (but the window + * function can be changed if necessary). + */ + + class CDSPSincFilterGen + { + public: + double Len2 = 0; ///< Required half filter kernel's length in samples (can be + ///< a fractional value). Final physical kernel length will be + ///< provided in the KernelLen variable. Len2 should be >= 2. + ///< + int KernelLen = 0; ///< Resulting length of the filter kernel, this variable + ///< is set after the call to one of the "init" functions. + ///< + int fl2 = 0; ///< Internal "half kernel length" value. This value can be used + ///< as filter's latency in samples (taps), this variable is set after + ///< the call to one of the "init" functions. + ///< + + union + { + struct + { + double Freq1; ///< Required corner circular frequency 1 [0; pi]. + ///< Used only in the generateBand() function. + ///< + double Freq2; ///< Required corner circular frequency 2 [0; pi]. + ///< Used only in the generateBand() function. The range + ///< [Freq1; Freq2] defines a pass band for the generateBand() + ///< function. + ///< + }; + + struct + { + double FracDelay; ///< Fractional delay in the range [0; 1], used + ///< only in the generateFrac() function. Note that the + ///< FracDelay parameter is actually inversed. At 0.0 value it + ///< produces 1 sample delay (with the latency equal to fl2), + ///< at 1.0 value it produces 0 sample delay (with the latency + ///< equal to fl2 - 1). + ///< + }; + }; + + /** + * Window function type. + */ + + enum EWindowFunctionType + { + wftCosine, ///< Generalized cosine window function. No parameters + ///< required. The "Power" parameter is optional. + ///< + wftKaiser, ///< Kaiser window function. Requires the "Beta" parameter. + ///< The "Power" parameter is optional. + ///< + wftGaussian, ///< Gaussian window function. Requires the "Sigma" + ///< parameter. The "Power" parameter is optional. + ///< + wftVaneev ///< Vaneev window function, mainly used for short + ///< fractional delay filters, requires 4 cosine width parameters, + ///< plus the "Power" parameter which is mandatory. + ///< + }; + + typedef double ( CDSPSincFilterGen::*CWindowFunc )(); ///< Window + ///< calculation function pointer type. + ///< + + /** + * Function initializes *this structure for generation of a window + * function, odd-sized. + * + * @param WinType Window function type. + * @param Params Window function's parameters. If NULL, the table values + * may be used. + * @param UsePower "True" if the power factor should be used to raise the + * window function. If "true", the power factor should be specified as the + * last value in the Params array. If Params is NULL, the table or default + * value of -1.0 (off) will be used. + */ + + void initWindow(const EWindowFunctionType WinType = wftCosine, + const double* const Params = nullptr, const bool UsePower = false) + { + R8BASSERT(Len2 >= 2.0); + + fl2 = (int)floor(Len2); + KernelLen = fl2 + fl2 + 1; + + setWindow(WinType, Params, UsePower, true); + } + + /** + * Function initializes *this structure for generation of band-limited + * sinc filter kernel. The generateBand() or generateBandPow() functions + * should be used to calculate the filter. + * + * @param WinType Window function type. + * @param Params Window function's parameters. If NULL, the table values + * may be used. + * @param UsePower "True" if the power factor should be used to raise the + * window function. If "true", the power factor should be specified as the + * last value in the Params array. If Params is NULL, the table or default + * value of -1.0 (off) will be used. + */ + + void initBand(const EWindowFunctionType WinType = wftCosine, + const double* const Params = nullptr, const bool UsePower = false) + { + R8BASSERT(Len2 >= 2.0); + + fl2 = (int)floor(Len2); + KernelLen = fl2 + fl2 + 1; + f1.init(Freq1, 0.0); + f2.init(Freq2, 0.0); + + setWindow(WinType, Params, UsePower, true); + } + + /** + * Function initializes *this structure for Hilbert transformation filter + * calculation. Freq1 and Freq2 variables are not used. + * The generateHilbert() function should be used to calculate the filter. + * + * @param WinType Window function type. + * @param Params Window function's parameters. If NULL, the table values + * may be used. + * @param UsePower "True" if the power factor should be used to raise the + * window function. If "true", the power factor should be specified as the + * last value in the Params array. If Params is NULL, the table or default + * value of -1.0 (off) will be used. + */ + + void initHilbert(const EWindowFunctionType WinType = wftCosine, + const double* const Params = nullptr, const bool UsePower = false) + { + R8BASSERT(Len2 >= 2.0); + + fl2 = (int)floor(Len2); + KernelLen = fl2 + fl2 + 1; + + setWindow(WinType, Params, UsePower, true); + } + + /** + * Function initializes *this structure for generation of full-bandwidth + * fractional delay sinc filter kernel. Freq1 and Freq2 variables are not + * used. The generateFrac() function should be used to calculate the + * filter. + * + * @param WinType Window function type. + * @param Params Window function's parameters. If NULL, the table values + * may be used. + * @param UsePower "True" if the power factor should be used to raise the + * window function. If "true", the power factor should be specified as the + * last value in the Params array. If Params is NULL, the table or default + * value of -1.0 (off) will be used. + */ + + void initFrac(const EWindowFunctionType WinType = wftCosine, + const double* const Params = nullptr, const bool UsePower = false) + { + R8BASSERT(Len2 >= 2.0); + + fl2 = (int)ceil(Len2); + KernelLen = fl2 + fl2; + + setWindow(WinType, Params, UsePower, false, FracDelay); + } + + /** + * @return The next "Hann" window function coefficient. + */ + + double calcWindowHann() { return (0.5 + 0.5 * w1.generate()); } + + /** + * @return The next "Hamming" window function coefficient. + */ + + double calcWindowHamming() { return (0.54 + 0.46 * w1.generate()); } + + /** + * @return The next "Blackman" window function coefficient. + */ + + double calcWindowBlackman() { return (0.42 + 0.5 * w1.generate() + 0.08 * w2.generate()); } + + /** + * @return The next "Nuttall" window function coefficient. + */ + + double calcWindowNuttall() + { + return (0.355768 + 0.487396 * w1.generate() + + 0.144232 * w2.generate() + 0.012604 * w3.generate()); + } + + /** + * @return The next "Blackman-Nuttall" window function coefficient. + */ + + double calcWindowBlackmanNuttall() + { + return (0.3635819 + 0.4891775 * w1.generate() + + 0.1365995 * w2.generate() + 0.0106411 * w3.generate()); + } + + /** + * @return The next "Kaiser" window function coefficient. + */ + + double calcWindowKaiser() + { + const double n = 1.0 - sqr(wn / Len2 + KaiserLen2Frac); + wn++; + + if (n < 0.0) { return (0.0); } + + return (besselI0(KaiserBeta * sqrt(n)) / KaiserDiv); + } + + /** + * @return The next "Gaussian" window function coefficient. + */ + + double calcWindowGaussian() + { + const double f = exp(-0.5 * sqr(wn / GaussianSigma + + GaussianSigmaFrac)); + + wn++; + + return (f); + } + + /** + * @return The next "Vaneev" windowing function coefficient, for use with + * the fractional delay filters. + */ + + double calcWindowVaneev() + { + const double v1 = 0.5 + 0.5 * w1.generate(); + const double v2 = 0.5 + 0.5 * w2.generate(); + const double v3 = 0.5 + 0.5 * w3.generate(); + const double v4 = 0.5 + 0.5 * w4.generate(); + + return (v1 * sqr(v2) * sqr(sqr(v3)) * sqr(sqr(sqr(v4)))); + } + + /** + * Function calculates window function only. + * + * @param[out] op Output buffer, length = KernelLen. + * @param wfunc Window calculation function to use. + */ + + template + void generateWindow(T* op, + CWindowFunc wfunc = &CDSPSincFilterGen::calcWindowBlackman) + { + op += fl2; + T* op2 = op; + + int l = fl2; + + if (Power < 0.0) + { + *op = (*this.*wfunc)(); + + while (l > 0) + { + const double v = (*this.*wfunc)(); + + ++op; + --op2; + *op = v; + *op2 = v; + l--; + } + } + else + { + *op = pows((*this.*wfunc)(), Power); + + while (l > 0) + { + const double v = pows((*this.*wfunc)(), Power); + + ++op; + --op2; + *op = v; + *op2 = v; + l--; + } + } + } + + /** + * Function calculates band-limited windowed sinc function-based filter + * kernel. + * + * @param[out] op Output buffer, length = KernelLen. + * @param wfunc Window calculation function to use. + */ + + template + void generateBand(T* op, + CWindowFunc wfunc = &CDSPSincFilterGen::calcWindowBlackman) + { + op += fl2; + T* op2 = op; + f1.generate(); + f2.generate(); + int t = 1; + + if (Power < 0.0) + { + *op = (Freq2 - Freq1) * (*this.*wfunc)() / M_PI; + + while (t <= fl2) + { + const double v = (f2.generate() - f1.generate()) * + (*this.*wfunc)() / t / M_PI; + + ++op; + --op2; + *op = v; + *op2 = v; + t++; + } + } + else + { + *op = (Freq2 - Freq1) * pows((*this.*wfunc)(), Power) / M_PI; + + while (t <= fl2) + { + const double v = (f2.generate() - f1.generate()) * + pows((*this.*wfunc)(), Power) / t / M_PI; + + ++op; + --op2; + *op = v; + *op2 = v; + t++; + } + } + } + + /** + * Function calculates windowed Hilbert transformer filter kernel. + * + * @param[out] op Output buffer, length = KernelLen. + * @param wfunc Window calculation function to use. + */ + + template + void generateHilbert(T* op, + CWindowFunc wfunc = &CDSPSincFilterGen::calcWindowBlackman) + { + static const double fvalues[ 2 ] = { 0.0, 2.0 }; + op += fl2; + T* op2 = op; + + (*this.*wfunc)(); + *op = 0.0; + + int t = 1; + + if (Power < 0.0) + { + while (t <= fl2) + { + const double v = fvalues[t & 1] * + (*this.*wfunc)() / t / M_PI; + + ++op; + --op2; + *op = v; + *op2 = -v; + t++; + } + } + else + { + while (t <= fl2) + { + const double v = fvalues[t & 1] * + pows((*this.*wfunc)(), Power) / t / M_PI; + + ++op; + --op2; + *op = v; + *op2 = -v; + t++; + } + } + } + + /** + * Function calculates windowed fractional delay filter kernel. + * + * @param[out] op Output buffer, length = KernelLen. + * @param wfunc Window calculation function to use. + * @param opinc Output buffer increment, in "op" elements. + */ + + template + void generateFrac(T* op, + CWindowFunc wfunc = &CDSPSincFilterGen::calcWindowBlackman, + const int opinc = 1) + { + R8BASSERT(opinc != 0); + + double f[ 2 ]; + f[0] = sin(FracDelay * M_PI); + f[1] = -f[0]; + + int t = -fl2; + + if (t + FracDelay < -Len2) + { + (*this.*wfunc)(); + *op = 0.0; + op += opinc; + t++; + } + + int mt = (FracDelay >= 1.0 - 1e-13 && FracDelay <= 1.0 + 1e-13 ? -1 : 0); + + if (Power < 0.0) + { + while (t < mt) + { + *op = f[t & 1] * (*this.*wfunc)() / (t + FracDelay) / + M_PI; + + op += opinc; + t++; + } + + double ut = t + FracDelay; + *op = (fabs(ut) <= 1e-13 ? (*this.*wfunc)() : f[t & 1] * (*this.*wfunc)() / ut / M_PI); + + mt = fl2 - 2; + + while (t < mt) + { + op += opinc; + t++; + *op = f[t & 1] * (*this.*wfunc)() / (t + FracDelay) / + M_PI; + } + + op += opinc; + t++; + ut = t + FracDelay; + *op = (ut > Len2 ? 0.0 : f[t & 1] * (*this.*wfunc)() / ut / M_PI); + } + else + { + while (t < mt) + { + *op = f[t & 1] * pows((*this.*wfunc)(), Power) / + (t + FracDelay) / M_PI; + + op += opinc; + t++; + } + + double ut = t + FracDelay; + *op = (fabs(ut) <= 1e-13 ? pows((*this.*wfunc)(), Power) : f[t & 1] * pows((*this.*wfunc)(), Power) / ut / M_PI); + + mt = fl2 - 2; + + while (t < mt) + { + op += opinc; + t++; + *op = f[t & 1] * pows((*this.*wfunc)(), Power) / + (t + FracDelay) / M_PI; + } + + op += opinc; + t++; + ut = t + FracDelay; + *op = (ut > Len2 ? 0.0 : f[t & 1] * pows((*this.*wfunc)(), Power) / ut / M_PI); + } + } + + private: + double Power = 0; ///< The power factor used to raise the window function. + ///< Equals a negative value if the power factor should not be used. + ///< + CSineGen f1; ///< Sine function 1. Used in the generateBand() function. + ///< + CSineGen f2; ///< Sine function 2. Used in the generateBand() function. + ///< + int wn = 0; ///< Window function integer position. 0 - center of the window + ///< function. This variable may not be used by some window functions. + ///< + CSineGen w1; ///< Cosine wave 1 for window function. + ///< + CSineGen w2; ///< Cosine wave 2 for window function. + ///< + CSineGen w3; ///< Cosine wave 3 for window function. + ///< + CSineGen w4; ///< Cosine wave 4 for window function. + ///< + + union + { + struct + { + double KaiserBeta; // Kaiser window function's "Beta" coefficient. + double KaiserDiv; // Kaiser window function's divisor. + double KaiserLen2Frac; // Equals FracDelay / Len2. + }; + + struct + { + double GaussianSigma; // Gaussian window function's "Sigma" coefficient. + double GaussianSigmaFrac; // Equals FracDelay / GaussianSigma. + }; + }; + + /** + * @param FilterLen2 Half filter length in samples (taps). + * @return The Kaiser power-raised window function parameters for the + * specified filter length. + */ + + static const double* getKaiserParams(const int FilterLen2) + { + R8BASSERT(FilterLen2 >= 3 && FilterLen2 <= 15); + + static const double Coeffs[][ 2 ] = { + { 3.41547411, 1.41275111 }, // 6 @ 51.38 + { 3.72300147, 1.75212634 }, // 8 @ 67.60 + { 4.34839223, 1.85801372 }, // 10 @ 79.86 + { 4.90860405, 1.97194591 }, // 12 @ 93.29 + { 5.17430411, 2.20609617 }, // 14 @ 106.74 + { 21.08445389, 0.59684098 }, // 16 @ 119.71 + { 9.14552738, 1.57619894 }, // 18 @ 134.53 + { 22.02344341, 0.71669064 }, // 20 @ 148.44 + { 16.41763757, 1.05884118 }, // 22 @ 164.61 + { 12.55262798, 1.51553897 }, // 24 @ 180.15 + { 9.84861210, 2.09912671 }, // 26 @ 194.15 + { 9.73150659, 2.29079494 }, // 28 @ 206.91 + { 10.42657217, 2.29183875 }, // 30 @ 218.20 + }; + + return (Coeffs[FilterLen2 - 3]); + } + + /** + * Function initializes Kaiser window function calculation. The FracDelay + * variable should be initialized when using this window function. + * + * @param Params Function parameters. If NULL, the table values will be + * used. If not NULL, the first parameter should specify the "Beta" value. + * @param UsePower "True" if the power factor should be used to raise the + * window function. + * @param IsCentered "True" if centered window should be used. This + * parameter usually equals to "false" for fractional delay filters only. + */ + + void setWindowKaiser(const double* Params, const bool UsePower, + const bool IsCentered) + { + wn = (IsCentered ? 0 : -fl2); + + if (Params == nullptr) + { + Params = getKaiserParams(fl2); + KaiserBeta = Params[0]; + Power = (UsePower ? Params[1] : -1.0); + } + else + { + KaiserBeta = clampr(Params[0], 1.0, 350.0); + Power = (UsePower ? fabs(Params[1]) : -1.0); + } + + KaiserDiv = besselI0(KaiserBeta); + KaiserLen2Frac = FracDelay / Len2; + } + + /** + * Function initializes Gaussian window function calculation. The FracDelay + * variable should be initialized when using this window function. + * + * @param Params Function parameters. If NULL, the table values will be + * used. If not NULL, the first parameter should specify the "Sigma" + * value. + * @param UsePower "True" if the power factor should be used to raise the + * window function. + * @param IsCentered "True" if centered window should be used. This + * parameter usually equals to "false" for fractional delay filters only. + */ + + void setWindowGaussian(const double* Params, const bool UsePower, + const bool IsCentered) + { + wn = (IsCentered ? 0 : -fl2); + + if (Params == nullptr) + { + GaussianSigma = 1.0; + Power = -1.0; + } + else + { + GaussianSigma = clampr(fabs(Params[0]), 1e-1, 100.0); + Power = (UsePower ? fabs(Params[1]) : -1.0); + } + + GaussianSigma *= Len2; + GaussianSigmaFrac = FracDelay / GaussianSigma; + } + + /** + * Function initializes "Vaneev" window function calculation. + * + * @param Params Function parameters. If NULL, the table values will be + * used. If not NULL, the first 4 parameters should specify the cosine + * multipliers while the fifth parameter should specify the "Power" value. + * @param IsCentered "True" if centered window should be used. This + * parameter usually equals to "false" for fractional delay filters only. + */ + + void setWindowVaneev(const double* Params, const bool IsCentered) + { + R8BASSERT(fl2 >= 3 && fl2 <= 15); + + // This set of parameters was obtained via probabilistic optimization. + // The number after @ shows the approximate (+/- 1 dB) signal-to-noise + // ratio for the given filter. SNR can be also decreased by using a + // filter bank with suboptimal number of sampled fractional delay + // filters: thus the FilterFracs should be selected with care. + + static const double Coeffs[][ 5 ] = { + { 0.35926104, 0.66154037, 0.79264845, 0.31897879, 0.18844972 }, // 6 @ 51.91 + { 0.81690764, 0.39409966, 0.01546567, 0.02067949, 1.15143000 }, // 8 @ 67.87 + { 0.26545140, 0.84346586, 0.12114879, 0.23640230, 0.72659219 }, // 10 @ 81.82 + { 0.56254211, 0.32615646, 0.88375690, 0.46944169, 0.32862728 }, // 12 @ 95.36 + { 0.51926261, 0.41265523, 0.89552919, 0.47699008, 0.37308306 }, // 14 @ 109.60 + { 0.55650321, 0.92583533, 0.58934379, 0.16399064, 0.67129777 }, // 16 @ 122.89 + { 0.27930548, 0.94898807, 0.70335882, 0.32080180, 0.59102482 }, // 18 @ 136.45 + { 0.12620836, 0.94993219, 0.70209891, 0.34747431, 0.64429174 }, // 20 @ 150.52 + { 0.83595860, 0.95040751, 0.64127591, 0.30856013, 0.69692727 }, // 22 @ 163.41 + { 0.41252871, 0.96236749, 0.74895429, 0.41669175, 0.65996102 }, // 24 @ 174.32 + { 0.98567539, 0.88907131, 0.65652775, 0.34585902, 0.77265757 }, // 26 @ 191.26 + { 0.64526843, 0.67729329, 0.91813705, 0.43972488, 0.68332682 }, // 28 @ 195.77 + { 0.65310281, 0.66723395, 0.91751074, 0.43956737, 0.73651421 }, // 30 @ 207.04 + }; + + double p[ 4 ]; + + if (Params == nullptr) + { + Params = Coeffs[fl2 - 3]; + Power = Params[4]; + } + else + { + p[0] = clampr(Params[0], -4.0, 4.0); + p[1] = clampr(Params[1], -4.0, 4.0); + p[2] = clampr(Params[2], -4.0, 4.0); + p[3] = clampr(Params[3], -4.0, 4.0); + Power = fabs(Params[4]); + Params = p; + } + + if (IsCentered) + { + w1.init(Params[0] * M_PI / Len2, M_PI * 0.5); + w2.init(Params[1] * M_PI / Len2, M_PI * 0.5); + w3.init(Params[2] * M_PI / Len2, M_PI * 0.5); + w4.init(Params[3] * M_PI / Len2, M_PI * 0.5); + } + else + { + const double step1 = Params[0] * M_PI / Len2; + w1.init(step1, M_PI * 0.5 - step1 * fl2 + step1 * FracDelay); + + const double step2 = Params[1] * M_PI / Len2; + w2.init(step2, M_PI * 0.5 - step2 * fl2 + step2 * FracDelay); + + const double step3 = Params[2] * M_PI / Len2; + w3.init(step3, M_PI * 0.5 - step3 * fl2 + step3 * FracDelay); + + const double step4 = Params[3] * M_PI / Len2; + w4.init(step4, M_PI * 0.5 - step4 * fl2 + step4 * FracDelay); + } + } + + /** + * Function initializes calculation of window function of the specified + * type. + * + * @param WinType Window function type. + * @param Params Window function's parameters. If NULL, the table values + * may be used. + * @param UsePower "True" if the power factor should be used to raise the + * window function. If "true", the power factor should be specified as the + * last value in the Params array. If Params is NULL, the table or default + * value of -1.0 (off) will be used. + * @param IsCentered "True" if centered window should be used. This + * parameter usually equals to "false" for fractional delay filters only. + * @param UseFracDelay Fractional delay to use. + */ + + void setWindow(const EWindowFunctionType WinType, + const double* const Params, const bool UsePower, + const bool IsCentered, const double UseFracDelay = 0.0) + { + FracDelay = UseFracDelay; + + if (WinType == wftCosine) + { + if (IsCentered) + { + w1.init(M_PI / Len2, M_PI * 0.5); + w2.init(M_2PI / Len2, M_PI * 0.5); + w3.init(M_3PI / Len2, M_PI * 0.5); + } + else + { + const double step1 = M_PI / Len2; + w1.init(step1, M_PI * 0.5 - step1 * fl2 + + step1 * FracDelay); + + const double step2 = M_2PI / Len2; + w2.init(step2, M_PI * 0.5 - step2 * fl2 + + step2 * FracDelay); + + const double step3 = M_3PI / Len2; + w3.init(step3, M_PI * 0.5 - step3 * fl2 + + step3 * FracDelay); + } + + Power = (UsePower && Params != nullptr ? Params[0] : -1.0); + } + else if (WinType == wftKaiser) { setWindowKaiser(Params, UsePower, IsCentered); } + else if (WinType == wftGaussian) { setWindowGaussian(Params, UsePower, IsCentered); } + else { setWindowVaneev(Params, IsCentered); } + } + }; +} // namespace r8b + +#endif // R8B_CDSPSINCFILTERGEN_INCLUDED diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/README.md b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/README.md new file mode 100644 index 0000000..b751512 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/README.md @@ -0,0 +1,55 @@ +# r8brain-free-src # +## Introduction ## +Open source (under the MIT license) high-quality professional audio sample rate converter (SRC) (resampling) library. Features routines for SRC, both up- and downsampling, to/from any sample rate, including non-integer sample rates: it can be also used for conversion to/from SACD sample rate and even go beyond that. SRC routines were implemented in multi-platform C++ code, and have a high level of optimality. + +The structure of this library's objects is such that they can be frequently created and destroyed in large applications with a minimal performance impact due to a high level of reusability of its most "initialization-expensive" objects: the fast Fourier transform and FIR filter objects. + +The SRC algorithm at first produces 2X oversampled (relative to the source sample rate, or the destination sample rate if the downsampling is performed) signal and then performs interpolation using a bank of short (14 to 28 taps, depending on the required precision) polynomial-interpolated sinc function-based fractional delay filters. This puts the algorithm into the league of the fastest among the most precise SRC algorithms. The more precise alternative being only the whole number-factored SRC, which can be slower. + +## Requirements ## +C++ compiler and system with the "double" floating point type (53-bit mantissa) support. No explicit code for the "float" type is present in this library, because as practice has shown the "float"-based code performs considerably slower on a modern processor, at least in this library. However, if the "double" type really represents the "float" type (24-bit mantissa) in a given compiler, on a given system, the library won't become broken, only the conversion quality may become degraded. This library always uses the "sizeof( double )" operator to obtain "double" floating point type's size in bytes. This library does not have dependencies beside the standard C library, the "windows.h" on Windows and the "pthread.h" on Mac OS X and Linux. + +## Links ## +* [Documentation](https://c16f948c1577658f1b05f6c1d146730273eb6285.googledrive.com/host/0BwakvlMNBQdwUXhLMDFJLWdBSlU/Documentation/) +* [Discussion](http://www.kvraudio.com/forum/viewtopic.php?t=389711) +* [r8brain-free-src-1.6-dll.zip](https://drive.google.com/open?id=0BwakvlMNBQdwR1JlZ3pKcVBpaWc&authuser=0) + +## Usage Information ## +The sample rate converter (resampler) is represented by the **r8b::CDSPResampler<>** class, which is a single front-end class for the whole library. You do not basically need to use nor understand any other classes beside this class. Several derived classes that have varying levels of precision are also available. + +The code of the library resides in the "r8b" C++ namespace, effectively isolating it from all other code. The code is thread-safe. A separate resampler object should be created for each audio channel or stream being processed. + +Note that you will need to compile the "r8bbase.cpp" source file and include the resulting object file into your application build. This source file includes definitions of several global static objects used by the library. You may also need to include to your project: the "Kernel32" library (on Windows) and the "pthread" library on Mac OS X and Linux. + +The library is able to process signal of any scale and loudness: it is not limited to just a "usual" -1.0 to 1.0 range. + +The code of this library was commented in the [Doxygen](http://www.doxygen.org/) style. To generate the documentation locally you may run the "doxygen ./other/r8bdoxy.txt" command from the library's directory. + +Preliminary tests show that the r8b::CDSPResampler24 resampler class achieves 15.6\*n\_cores Mflops when converting 1 channel of audio from 44100 to 96000 sample rate, on a typical Intel Core i7-4770K processor-based system without overclocking. This approximately translates to a real-time resampling of 160\*n\_cores audio streams, at 100% CPU load. When comparing performance of this resampler library to another library make sure that the competing library is also tuned to produce a fully linear-phase response. + +## Dynamic Link Library ## +The functions of this SRC library are also accessible in simplified form via the DLL file on Windows, requiring a processor with SSE2 support. Delphi Pascal interface unit file for the DLL file is available. DLL and C LIB files are distributed in a separate ZIP file on the project's home page. On non-Windows systems it is preferrable to use the C++ library directly. + +## Real-time Applications ## +The resampler class of this library was designed as asynchronous processor: it may produce any number of output samples, depending on the input sample data length and the resampling parameters. The resampler must be fed with the input sample data until enough output sample data was produced, with any excess output samples used before feeding the resampler with more input data. A "relief" factor here is that the resampler removes the initial processing latency automatically, and that after initial moments of processing the output becomes steady, with only minor output sample data length fluctuations. + +Note that the r8b::CDSPResampler::getInLenBeforeOutStart() function can be used to estimate the number of input samples that should be provided to the resampler before the actual output starts. + +## Notes ## +When using the r8b::CDSPResampler<> class directly, you may select the transition band/steepness of the low-pass (reconstruction) filter, expressed as a percentage of the full spectral bandwidth of the input signal (or the output signal if the downsampling is performed), and the desired stop-band attenuation in decibel. + +The transition band is specified as the normalized spectral space of the input signal (or the output signal if the downsampling is performed) between the low-pass filter's -3 dB point and the Nyquist frequency, and ranges from 0.5% to 45%. Stop-band attenuation can be specified in the range 49 to 218 decibel. + +This SRC library also implements a faster "power of 2" resampling (e.g. 2X, 4X, 8X, 16X, etc. upsampling and downsampling). + +This library was tested for compatibility with [GNU C++](http://gcc.gnu.org/), [Microsoft Visual C++](http://www.microsoft.com/visualstudio/eng/products/visual-studio-express-products) and [Intel C++](http://software.intel.com/en-us/c-compilers) compilers, on 32- and 64-bit Windows, Mac OS X and CentOS Linux. + +All code is fully "inline", without the need to compile many source files. The memory footprint is quite modest. + +## Users ## +This library is used by: + + * [Combo Model V VSTi instrument](http://www.martinic.com/combov/) + * [WDM Asio Link Driver](http://midithru.net/Home/AsioLink) + * [Boogex Guitar Amp audio plugin](http://www.voxengo.com/product/boogex/) + * [OpenMPT](http://openmpt.org/) \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/fft4g.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/fft4g.h new file mode 100644 index 0000000..320b127 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/fft4g.h @@ -0,0 +1,1365 @@ +//$ nobt +//$ nocpp + +/** + * @file fft4g.h + * + * @brief Wrapper class for Takuya OOURA's FFT functions. + * + * Functions from the FFT package by: Copyright(C) 1996-2001 Takuya OOURA + * http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html + * + * Modified and used with permission granted by the license. + * + * Here, the original "fft4g.c" file was wrapped into the "ooura_fft" class. + */ + +#ifndef R8B_FFT4G_INCLUDED +#define R8B_FFT4G_INCLUDED + +/* +Fast Fourier/Cosine/Sine Transform + dimension :one + data length :power of 2 + decimation :frequency + radix :4, 2 + data :inplace + table :use +functions + cdft: Complex Discrete Fourier Transform + rdft: Real Discrete Fourier Transform + ddct: Discrete Cosine Transform + ddst: Discrete Sine Transform + dfct: Cosine Transform of RDFT (Real Symmetric DFT) + dfst: Sine Transform of RDFT (Real Anti-symmetric DFT) +function prototypes + void cdft(int, int, FPType *, int *, FPType *); + void rdft(int, int, FPType *, int *, FPType *); + void ddct(int, int, FPType *, int *, FPType *); + void ddst(int, int, FPType *, int *, FPType *); + void dfct(int, FPType *, FPType *, int *, FPType *); + void dfst(int, FPType *, FPType *, int *, FPType *); + + +-------- Complex DFT (Discrete Fourier Transform) -------- + [definition] + + X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k + X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k + ip[0] = 0; // first time only + cdft(2*n, 1, a, ip, w); + + ip[0] = 0; // first time only + cdft(2*n, -1, a, ip, w); + [parameters] + 2*n :data length (int) + n >= 1, n = power of 2 + a[0...2*n-1] :input/output data (FPType *) + input data + a[2*j] = Re(x[j]), + a[2*j+1] = Im(x[j]), 0<=j= 2+sqrt(n) + strictly, + length of ip >= + 2+(1< RDFT + R[k] = sum_j=0^n-1 a[j]*cos(2*pi*j*k/n), 0<=k<=n/2 + I[k] = sum_j=0^n-1 a[j]*sin(2*pi*j*k/n), 0 IRDFT (excluding scale) + a[k] = (R[0] + R[n/2]*cos(pi*k))/2 + + sum_j=1^n/2-1 R[j]*cos(2*pi*j*k/n) + + sum_j=1^n/2-1 I[j]*sin(2*pi*j*k/n), 0<=k + ip[0] = 0; // first time only + rdft(n, 1, a, ip, w); + + ip[0] = 0; // first time only + rdft(n, -1, a, ip, w); + [parameters] + n :data length (int) + n >= 2, n = power of 2 + a[0...n-1] :input/output data (FPType *) + + output data + a[2*k] = R[k], 0<=k + input data + a[2*j] = R[j], 0<=j= 2+sqrt(n/2) + strictly, + length of ip >= + 2+(1< IDCT (excluding scale) + C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k DCT + C[k] = sum_j=0^n-1 a[j]*cos(pi*(j+1/2)*k/n), 0<=k + ip[0] = 0; // first time only + ddct(n, 1, a, ip, w); + + ip[0] = 0; // first time only + ddct(n, -1, a, ip, w); + [parameters] + n :data length (int) + n >= 2, n = power of 2 + a[0...n-1] :input/output data (FPType *) + output data + a[k] = C[k], 0<=k= 2+sqrt(n/2) + strictly, + length of ip >= + 2+(1< IDST (excluding scale) + S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k DST + S[k] = sum_j=0^n-1 a[j]*sin(pi*(j+1/2)*k/n), 0 + ip[0] = 0; // first time only + ddst(n, 1, a, ip, w); + + ip[0] = 0; // first time only + ddst(n, -1, a, ip, w); + [parameters] + n :data length (int) + n >= 2, n = power of 2 + a[0...n-1] :input/output data (FPType *) + + input data + a[j] = A[j], 0 + output data + a[k] = S[k], 0= 2+sqrt(n/2) + strictly, + length of ip >= + 2+(1<= 2, n = power of 2 + a[0...n] :input/output data (FPType *) + output data + a[k] = C[k], 0<=k<=n + t[0...n/2] :work area (FPType *) + ip[0...*] :work area for bit reversal (int *) + length of ip >= 2+sqrt(n/4) + strictly, + length of ip >= + 2+(1<= 2, n = power of 2 + a[0...n-1] :input/output data (FPType *) + output data + a[k] = S[k], 0= 2+sqrt(n/4) + strictly, + length of ip >= + 2+(1< (ip[0] << 2)) { makewt(n >> 2, ip, w); } + if (n > 4) + { + if (isgn >= 0) + { + bitrv2(n, ip + 2, a); + cftfsub(n, a, w); + } + else + { + bitrv2conj(n, ip + 2, a); + cftbsub(n, a, w); + } + } + else if (n == 4) { cftfsub(n, a, w); } + } + + static void rdft(int n, int isgn, FPType* a, int* ip, FPType* w) + { + int nw = ip[0]; + if (n > (nw << 2)) + { + nw = n >> 2; + makewt(nw, ip, w); + } + int nc = ip[1]; + if (n > (nc << 2)) + { + nc = n >> 2; + makect(nc, ip, w + nw); + } + if (isgn >= 0) + { + if (n > 4) + { + bitrv2(n, ip + 2, a); + cftfsub(n, a, w); + rftfsub(n, a, nc, w + nw); + } + else if (n == 4) { cftfsub(n, a, w); } + double xi = a[0] - a[1]; + a[0] += a[1]; + a[1] = xi; + } + else + { + a[1] = 0.5 * (a[0] - a[1]); + a[0] -= a[1]; + if (n > 4) + { + rftbsub(n, a, nc, w + nw); + bitrv2(n, ip + 2, a); + cftbsub(n, a, w); + } + else if (n == 4) { cftfsub(n, a, w); } + } + } + + static void ddct(int n, int isgn, FPType* a, int* ip, FPType* w) + { + int j; + double xr; + + int nw = ip[0]; + if (n > (nw << 2)) + { + nw = n >> 2; + makewt(nw, ip, w); + } + int nc = ip[1]; + if (n > nc) + { + nc = n; + makect(nc, ip, w + nw); + } + if (isgn < 0) + { + xr = a[n - 1]; + for (j = n - 2; j >= 2; j -= 2) + { + a[j + 1] = a[j] - a[j - 1]; + a[j] += a[j - 1]; + } + a[1] = a[0] - xr; + a[0] += xr; + if (n > 4) + { + rftbsub(n, a, nc, w + nw); + bitrv2(n, ip + 2, a); + cftbsub(n, a, w); + } + else if (n == 4) { cftfsub(n, a, w); } + } + dctsub(n, a, nc, w + nw); + if (isgn >= 0) + { + if (n > 4) + { + bitrv2(n, ip + 2, a); + cftfsub(n, a, w); + rftfsub(n, a, nc, w + nw); + } + else if (n == 4) { cftfsub(n, a, w); } + xr = a[0] - a[1]; + a[0] += a[1]; + for (j = 2; j < n; j += 2) + { + a[j - 1] = a[j] - a[j + 1]; + a[j] += a[j + 1]; + } + a[n - 1] = xr; + } + } + + static void ddst(int n, int isgn, FPType* a, int* ip, FPType* w) + { + int j; + double xr; + + int nw = ip[0]; + if (n > (nw << 2)) + { + nw = n >> 2; + makewt(nw, ip, w); + } + int nc = ip[1]; + if (n > nc) + { + nc = n; + makect(nc, ip, w + nw); + } + if (isgn < 0) + { + xr = a[n - 1]; + for (j = n - 2; j >= 2; j -= 2) + { + a[j + 1] = -a[j] - a[j - 1]; + a[j] -= a[j - 1]; + } + a[1] = a[0] + xr; + a[0] -= xr; + if (n > 4) + { + rftbsub(n, a, nc, w + nw); + bitrv2(n, ip + 2, a); + cftbsub(n, a, w); + } + else if (n == 4) { cftfsub(n, a, w); } + } + dstsub(n, a, nc, w + nw); + if (isgn >= 0) + { + if (n > 4) + { + bitrv2(n, ip + 2, a); + cftfsub(n, a, w); + rftfsub(n, a, nc, w + nw); + } + else if (n == 4) { cftfsub(n, a, w); } + xr = a[0] - a[1]; + a[0] += a[1]; + for (j = 2; j < n; j += 2) + { + a[j - 1] = -a[j] - a[j + 1]; + a[j] -= a[j + 1]; + } + a[n - 1] = -xr; + } + } + + static void dfct(int n, FPType* a, FPType* t, int* ip, FPType* w) + { + int j, k; + + int nw = ip[0]; + if (n > (nw << 3)) + { + nw = n >> 3; + makewt(nw, ip, w); + } + int nc = ip[1]; + if (n > (nc << 1)) + { + nc = n >> 1; + makect(nc, ip, w + nw); + } + int m = n >> 1; + double yi = a[m]; + double xi = a[0] + a[n]; + a[0] -= a[n]; + t[0] = xi - yi; + t[m] = xi + yi; + if (n > 2) + { + int mh = m >> 1; + for (j = 1; j < mh; ++j) + { + k = m - j; + double xr = a[j] - a[n - j]; + xi = a[j] + a[n - j]; + double yr = a[k] - a[n - k]; + yi = a[k] + a[n - k]; + a[j] = xr; + a[k] = yr; + t[j] = xi - yi; + t[k] = xi + yi; + } + t[mh] = a[mh] + a[n - mh]; + a[mh] -= a[n - mh]; + dctsub(m, a, nc, w + nw); + if (m > 4) + { + bitrv2(m, ip + 2, a); + cftfsub(m, a, w); + rftfsub(m, a, nc, w + nw); + } + else if (m == 4) { cftfsub(m, a, w); } + a[n - 1] = a[0] - a[1]; + a[1] = a[0] + a[1]; + for (j = m - 2; j >= 2; j -= 2) + { + a[2 * j + 1] = a[j] + a[j + 1]; + a[2 * j - 1] = a[j] - a[j + 1]; + } + int l = 2; + m = mh; + while (m >= 2) + { + dctsub(m, t, nc, w + nw); + if (m > 4) + { + bitrv2(m, ip + 2, t); + cftfsub(m, t, w); + rftfsub(m, t, nc, w + nw); + } + else if (m == 4) { cftfsub(m, t, w); } + a[n - l] = t[0] - t[1]; + a[l] = t[0] + t[1]; + k = 0; + for (j = 2; j < m; j += 2) + { + k += l << 2; + a[k - l] = t[j] - t[j + 1]; + a[k + l] = t[j] + t[j + 1]; + } + l <<= 1; + mh = m >> 1; + for (j = 0; j < mh; ++j) + { + k = m - j; + t[j] = t[m + k] - t[m + j]; + t[k] = t[m + k] + t[m + j]; + } + t[mh] = t[m + mh]; + m = mh; + } + a[l] = t[0]; + a[n] = t[2] - t[1]; + a[0] = t[2] + t[1]; + } + else + { + a[1] = a[0]; + a[2] = t[0]; + a[0] = t[1]; + } + } + + static void dfst(int n, FPType* a, FPType* t, int* ip, FPType* w) + { + int j, k; + + int nw = ip[0]; + if (n > (nw << 3)) + { + nw = n >> 3; + makewt(nw, ip, w); + } + int nc = ip[1]; + if (n > (nc << 1)) + { + nc = n >> 1; + makect(nc, ip, w + nw); + } + if (n > 2) + { + int m = n >> 1; + int mh = m >> 1; + for (j = 1; j < mh; ++j) + { + k = m - j; + double xr = a[j] + a[n - j]; + double xi = a[j] - a[n - j]; + double yr = a[k] + a[n - k]; + double yi = a[k] - a[n - k]; + a[j] = xr; + a[k] = yr; + t[j] = xi + yi; + t[k] = xi - yi; + } + t[0] = a[mh] - a[n - mh]; + a[mh] += a[n - mh]; + a[0] = a[m]; + dstsub(m, a, nc, w + nw); + if (m > 4) + { + bitrv2(m, ip + 2, a); + cftfsub(m, a, w); + rftfsub(m, a, nc, w + nw); + } + else if (m == 4) { cftfsub(m, a, w); } + a[n - 1] = a[1] - a[0]; + a[1] = a[0] + a[1]; + for (j = m - 2; j >= 2; j -= 2) + { + a[2 * j + 1] = a[j] - a[j + 1]; + a[2 * j - 1] = -a[j] - a[j + 1]; + } + int l = 2; + m = mh; + while (m >= 2) + { + dstsub(m, t, nc, w + nw); + if (m > 4) + { + bitrv2(m, ip + 2, t); + cftfsub(m, t, w); + rftfsub(m, t, nc, w + nw); + } + else if (m == 4) { cftfsub(m, t, w); } + a[n - l] = t[1] - t[0]; + a[l] = t[0] + t[1]; + k = 0; + for (j = 2; j < m; j += 2) + { + k += l << 2; + a[k - l] = -t[j] - t[j + 1]; + a[k + l] = t[j] - t[j + 1]; + } + l <<= 1; + mh = m >> 1; + for (j = 1; j < mh; ++j) + { + k = m - j; + t[j] = t[m + k] + t[m + j]; + t[k] = t[m + k] - t[m + j]; + } + t[0] = t[m + mh]; + m = mh; + } + a[l] = t[0]; + } + a[0] = 0; + } + + /* -------- initializing routines -------- */ + + static void makewt(int nw, int* ip, FPType* w) + { + ip[0] = nw; + ip[1] = 1; + if (nw > 2) + { + int nwh = nw >> 1; + double delta = atan(1.0) / nwh; + w[0] = 1; + w[1] = 0; + w[nwh] = cos(delta * nwh); + w[nwh + 1] = w[nwh]; + if (nwh > 2) + { + for (int j = 2; j < nwh; j += 2) + { + double x = cos(delta * j); + double y = sin(delta * j); + w[j] = x; + w[j + 1] = y; + w[nw - j] = y; + w[nw - j + 1] = x; + } + bitrv2(nw, ip + 2, w); + } + } + } + + static void makect(int nc, int* ip, FPType* c) + { + ip[1] = nc; + if (nc > 1) + { + int nch = nc >> 1; + double delta = atan(1.0) / nch; + c[0] = cos(delta * nch); + c[nch] = 0.5 * c[0]; + for (int j = 1; j < nch; ++j) + { + c[j] = 0.5 * cos(delta * j); + c[nc - j] = 0.5 * sin(delta * j); + } + } + } + + /* -------- child routines -------- */ + + static void bitrv2(int n, int* ip, FPType* a) + { + int j, j1, k, k1; + double xr, xi, yr, yi; + + ip[0] = 0; + int l = n; + int m = 1; + while ((m << 3) < l) + { + l >>= 1; + for (j = 0; j < m; ++j) { ip[m + j] = ip[j] + l; } + m <<= 1; + } + int m2 = 2 * m; + if ((m << 3) == l) + { + for (k = 0; k < m; ++k) + { + for (j = 0; j < k; ++j) + { + j1 = 2 * j + ip[k]; + k1 = 2 * k + ip[j]; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += m2; + k1 += 2 * m2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += m2; + k1 -= m2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += m2; + k1 += 2 * m2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + j1 = 2 * k + m2 + ip[k]; + k1 = j1 + m2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + } + else + { + for (k = 1; k < m; ++k) + { + for (j = 0; j < k; ++j) + { + j1 = 2 * j + ip[k]; + k1 = 2 * k + ip[j]; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += m2; + k1 += m2; + xr = a[j1]; + xi = a[j1 + 1]; + yr = a[k1]; + yi = a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + } + } + } + + static void bitrv2conj(int n, int* ip, FPType* a) + { + int j, j1, k, k1; + double xr, xi, yr, yi; + + ip[0] = 0; + int l = n; + int m = 1; + while ((m << 3) < l) + { + l >>= 1; + for (j = 0; j < m; ++j) { ip[m + j] = ip[j] + l; } + m <<= 1; + } + int m2 = 2 * m; + if ((m << 3) == l) + { + for (k = 0; k < m; ++k) + { + for (j = 0; j < k; ++j) + { + j1 = 2 * j + ip[k]; + k1 = 2 * k + ip[j]; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += m2; + k1 += 2 * m2; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += m2; + k1 -= m2; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += m2; + k1 += 2 * m2; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + k1 = 2 * k + ip[k]; + a[k1 + 1] = -a[k1 + 1]; + j1 = k1 + m2; + k1 = j1 + m2; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + k1 += m2; + a[k1 + 1] = -a[k1 + 1]; + } + } + else + { + a[1] = -a[1]; + a[m2 + 1] = -a[m2 + 1]; + for (k = 1; k < m; ++k) + { + for (j = 0; j < k; ++j) + { + j1 = 2 * j + ip[k]; + k1 = 2 * k + ip[j]; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + j1 += m2; + k1 += m2; + xr = a[j1]; + xi = -a[j1 + 1]; + yr = a[k1]; + yi = -a[k1 + 1]; + a[j1] = yr; + a[j1 + 1] = yi; + a[k1] = xr; + a[k1 + 1] = xi; + } + k1 = 2 * k + ip[k]; + a[k1 + 1] = -a[k1 + 1]; + a[k1 + m2 + 1] = -a[k1 + m2 + 1]; + } + } + } + + static void cftfsub(int n, FPType* a, const FPType* w) + { + int j, j1; + double x0r, x0i; + + int l = 2; + if (n > 8) + { + cft1st(n, a, w); + l = 8; + while ((l << 2) < n) + { + cftmdl(n, l, a, w); + l <<= 2; + } + } + if ((l << 2) == n) + { + for (j = 0; j < l; j += 2) + { + j1 = j + l; + int j2 = j1 + l; + int j3 = j2 + l; + x0r = a[j] + a[j1]; + x0i = a[j + 1] + a[j1 + 1]; + double x1r = a[j] - a[j1]; + double x1i = a[j + 1] - a[j1 + 1]; + double x2r = a[j2] + a[j3]; + double x2i = a[j2 + 1] + a[j3 + 1]; + double x3r = a[j2] - a[j3]; + double x3i = a[j2 + 1] - a[j3 + 1]; + a[j] = x0r + x2r; + a[j + 1] = x0i + x2i; + a[j2] = x0r - x2r; + a[j2 + 1] = x0i - x2i; + a[j1] = x1r - x3i; + a[j1 + 1] = x1i + x3r; + a[j3] = x1r + x3i; + a[j3 + 1] = x1i - x3r; + } + } + else + { + for (j = 0; j < l; j += 2) + { + j1 = j + l; + x0r = a[j] - a[j1]; + x0i = a[j + 1] - a[j1 + 1]; + a[j] += a[j1]; + a[j + 1] += a[j1 + 1]; + a[j1] = x0r; + a[j1 + 1] = x0i; + } + } + } + + static void cftbsub(int n, FPType* a, const FPType* w) + { + int j, j1; + double x0r, x0i; + + int l = 2; + if (n > 8) + { + cft1st(n, a, w); + l = 8; + while ((l << 2) < n) + { + cftmdl(n, l, a, w); + l <<= 2; + } + } + if ((l << 2) == n) + { + for (j = 0; j < l; j += 2) + { + j1 = j + l; + int j2 = j1 + l; + int j3 = j2 + l; + x0r = a[j] + a[j1]; + x0i = -a[j + 1] - a[j1 + 1]; + double x1r = a[j] - a[j1]; + double x1i = -a[j + 1] + a[j1 + 1]; + double x2r = a[j2] + a[j3]; + double x2i = a[j2 + 1] + a[j3 + 1]; + double x3r = a[j2] - a[j3]; + double x3i = a[j2 + 1] - a[j3 + 1]; + a[j] = x0r + x2r; + a[j + 1] = x0i - x2i; + a[j2] = x0r - x2r; + a[j2 + 1] = x0i + x2i; + a[j1] = x1r - x3i; + a[j1 + 1] = x1i - x3r; + a[j3] = x1r + x3i; + a[j3 + 1] = x1i + x3r; + } + } + else + { + for (j = 0; j < l; j += 2) + { + j1 = j + l; + x0r = a[j] - a[j1]; + x0i = -a[j + 1] + a[j1 + 1]; + a[j] += a[j1]; + a[j + 1] = -a[j + 1] - a[j1 + 1]; + a[j1] = x0r; + a[j1 + 1] = x0i; + } + } + } + + static void cft1st(int n, FPType* a, const FPType* w) + { + double x0r = a[0] + a[2]; + double x0i = a[1] + a[3]; + double x1r = a[0] - a[2]; + double x1i = a[1] - a[3]; + double x2r = a[4] + a[6]; + double x2i = a[5] + a[7]; + double x3r = a[4] - a[6]; + double x3i = a[5] - a[7]; + a[0] = x0r + x2r; + a[1] = x0i + x2i; + a[4] = x0r - x2r; + a[5] = x0i - x2i; + a[2] = x1r - x3i; + a[3] = x1i + x3r; + a[6] = x1r + x3i; + a[7] = x1i - x3r; + double wk1r = w[2]; + x0r = a[8] + a[10]; + x0i = a[9] + a[11]; + x1r = a[8] - a[10]; + x1i = a[9] - a[11]; + x2r = a[12] + a[14]; + x2i = a[13] + a[15]; + x3r = a[12] - a[14]; + x3i = a[13] - a[15]; + a[8] = x0r + x2r; + a[9] = x0i + x2i; + a[12] = x2i - x0i; + a[13] = x0r - x2r; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[10] = wk1r * (x0r - x0i); + a[11] = wk1r * (x0r + x0i); + x0r = x3i + x1r; + x0i = x3r - x1i; + a[14] = wk1r * (x0i - x0r); + a[15] = wk1r * (x0i + x0r); + int k1 = 0; + for (int j = 16; j < n; j += 16) + { + k1 += 2; + int k2 = 2 * k1; + double wk2r = w[k1]; + double wk2i = w[k1 + 1]; + wk1r = w[k2]; + double wk1i = w[k2 + 1]; + double wk3r = wk1r - 2 * wk2i * wk1i; + double wk3i = 2 * wk2i * wk1r - wk1i; + x0r = a[j] + a[j + 2]; + x0i = a[j + 1] + a[j + 3]; + x1r = a[j] - a[j + 2]; + x1i = a[j + 1] - a[j + 3]; + x2r = a[j + 4] + a[j + 6]; + x2i = a[j + 5] + a[j + 7]; + x3r = a[j + 4] - a[j + 6]; + x3i = a[j + 5] - a[j + 7]; + a[j] = x0r + x2r; + a[j + 1] = x0i + x2i; + x0r -= x2r; + x0i -= x2i; + a[j + 4] = wk2r * x0r - wk2i * x0i; + a[j + 5] = wk2r * x0i + wk2i * x0r; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j + 2] = wk1r * x0r - wk1i * x0i; + a[j + 3] = wk1r * x0i + wk1i * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j + 6] = wk3r * x0r - wk3i * x0i; + a[j + 7] = wk3r * x0i + wk3i * x0r; + wk1r = w[k2 + 2]; + wk1i = w[k2 + 3]; + wk3r = wk1r - 2 * wk2r * wk1i; + wk3i = 2 * wk2r * wk1r - wk1i; + x0r = a[j + 8] + a[j + 10]; + x0i = a[j + 9] + a[j + 11]; + x1r = a[j + 8] - a[j + 10]; + x1i = a[j + 9] - a[j + 11]; + x2r = a[j + 12] + a[j + 14]; + x2i = a[j + 13] + a[j + 15]; + x3r = a[j + 12] - a[j + 14]; + x3i = a[j + 13] - a[j + 15]; + a[j + 8] = x0r + x2r; + a[j + 9] = x0i + x2i; + x0r -= x2r; + x0i -= x2i; + a[j + 12] = -wk2i * x0r - wk2r * x0i; + a[j + 13] = -wk2i * x0i + wk2r * x0r; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j + 10] = wk1r * x0r - wk1i * x0i; + a[j + 11] = wk1r * x0i + wk1i * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j + 14] = wk3r * x0r - wk3i * x0i; + a[j + 15] = wk3r * x0i + wk3i * x0r; + } + } + + static void cftmdl(int n, int l, FPType* a, const FPType* w) + { + int j, j1, j2, j3, k, k1, k2, m, m2; + double wk1r, wk1i, wk2r, wk2i, wk3r, wk3i; + double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i; + + m = l << 2; + for (j = 0; j < l; j += 2) + { + j1 = j + l; + j2 = j1 + l; + j3 = j2 + l; + x0r = a[j] + a[j1]; + x0i = a[j + 1] + a[j1 + 1]; + x1r = a[j] - a[j1]; + x1i = a[j + 1] - a[j1 + 1]; + x2r = a[j2] + a[j3]; + x2i = a[j2 + 1] + a[j3 + 1]; + x3r = a[j2] - a[j3]; + x3i = a[j2 + 1] - a[j3 + 1]; + a[j] = x0r + x2r; + a[j + 1] = x0i + x2i; + a[j2] = x0r - x2r; + a[j2 + 1] = x0i - x2i; + a[j1] = x1r - x3i; + a[j1 + 1] = x1i + x3r; + a[j3] = x1r + x3i; + a[j3 + 1] = x1i - x3r; + } + wk1r = w[2]; + for (j = m; j < l + m; j += 2) + { + j1 = j + l; + j2 = j1 + l; + j3 = j2 + l; + x0r = a[j] + a[j1]; + x0i = a[j + 1] + a[j1 + 1]; + x1r = a[j] - a[j1]; + x1i = a[j + 1] - a[j1 + 1]; + x2r = a[j2] + a[j3]; + x2i = a[j2 + 1] + a[j3 + 1]; + x3r = a[j2] - a[j3]; + x3i = a[j2 + 1] - a[j3 + 1]; + a[j] = x0r + x2r; + a[j + 1] = x0i + x2i; + a[j2] = x2i - x0i; + a[j2 + 1] = x0r - x2r; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j1] = wk1r * (x0r - x0i); + a[j1 + 1] = wk1r * (x0r + x0i); + x0r = x3i + x1r; + x0i = x3r - x1i; + a[j3] = wk1r * (x0i - x0r); + a[j3 + 1] = wk1r * (x0i + x0r); + } + k1 = 0; + m2 = 2 * m; + for (k = m2; k < n; k += m2) + { + k1 += 2; + k2 = 2 * k1; + wk2r = w[k1]; + wk2i = w[k1 + 1]; + wk1r = w[k2]; + wk1i = w[k2 + 1]; + wk3r = wk1r - 2 * wk2i * wk1i; + wk3i = 2 * wk2i * wk1r - wk1i; + for (j = k; j < l + k; j += 2) + { + j1 = j + l; + j2 = j1 + l; + j3 = j2 + l; + x0r = a[j] + a[j1]; + x0i = a[j + 1] + a[j1 + 1]; + x1r = a[j] - a[j1]; + x1i = a[j + 1] - a[j1 + 1]; + x2r = a[j2] + a[j3]; + x2i = a[j2 + 1] + a[j3 + 1]; + x3r = a[j2] - a[j3]; + x3i = a[j2 + 1] - a[j3 + 1]; + a[j] = x0r + x2r; + a[j + 1] = x0i + x2i; + x0r -= x2r; + x0i -= x2i; + a[j2] = wk2r * x0r - wk2i * x0i; + a[j2 + 1] = wk2r * x0i + wk2i * x0r; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j1] = wk1r * x0r - wk1i * x0i; + a[j1 + 1] = wk1r * x0i + wk1i * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3] = wk3r * x0r - wk3i * x0i; + a[j3 + 1] = wk3r * x0i + wk3i * x0r; + } + wk1r = w[k2 + 2]; + wk1i = w[k2 + 3]; + wk3r = wk1r - 2 * wk2r * wk1i; + wk3i = 2 * wk2r * wk1r - wk1i; + for (j = k + m; j < l + (k + m); j += 2) + { + j1 = j + l; + j2 = j1 + l; + j3 = j2 + l; + x0r = a[j] + a[j1]; + x0i = a[j + 1] + a[j1 + 1]; + x1r = a[j] - a[j1]; + x1i = a[j + 1] - a[j1 + 1]; + x2r = a[j2] + a[j3]; + x2i = a[j2 + 1] + a[j3 + 1]; + x3r = a[j2] - a[j3]; + x3i = a[j2 + 1] - a[j3 + 1]; + a[j] = x0r + x2r; + a[j + 1] = x0i + x2i; + x0r -= x2r; + x0i -= x2i; + a[j2] = -wk2i * x0r - wk2r * x0i; + a[j2 + 1] = -wk2i * x0i + wk2r * x0r; + x0r = x1r - x3i; + x0i = x1i + x3r; + a[j1] = wk1r * x0r - wk1i * x0i; + a[j1 + 1] = wk1r * x0i + wk1i * x0r; + x0r = x1r + x3i; + x0i = x1i - x3r; + a[j3] = wk3r * x0r - wk3i * x0i; + a[j3 + 1] = wk3r * x0i + wk3i * x0r; + } + } + } + + static void rftfsub(int n, FPType* a, int nc, const FPType* c) + { + int m = n >> 1; + int ks = 2 * nc / m; + int kk = 0; + for (int j = 2; j < m; j += 2) + { + int k = n - j; + kk += ks; + double wkr = 0.5 - c[nc - kk]; + double wki = c[kk]; + double xr = a[j] - a[k]; + double xi = a[j + 1] + a[k + 1]; + double yr = wkr * xr - wki * xi; + double yi = wkr * xi + wki * xr; + a[j] -= yr; + a[j + 1] -= yi; + a[k] += yr; + a[k + 1] -= yi; + } + } + + static void rftbsub(int n, FPType* a, int nc, const FPType* c) + { + a[1] = -a[1]; + int m = n >> 1; + int ks = 2 * nc / m; + int kk = 0; + for (int j = 2; j < m; j += 2) + { + int k = n - j; + kk += ks; + double wkr = 0.5 - c[nc - kk]; + double wki = c[kk]; + double xr = a[j] - a[k]; + double xi = a[j + 1] + a[k + 1]; + double yr = wkr * xr + wki * xi; + double yi = wkr * xi - wki * xr; + a[j] -= yr; + a[j + 1] = yi - a[j + 1]; + a[k] += yr; + a[k + 1] = yi - a[k + 1]; + } + a[m + 1] = -a[m + 1]; + } + + static void dctsub(int n, FPType* a, int nc, const FPType* c) + { + int m = n >> 1; + int ks = nc / n; + int kk = 0; + for (int j = 1; j < m; ++j) + { + int k = n - j; + kk += ks; + double wkr = c[kk] - c[nc - kk]; + double wki = c[kk] + c[nc - kk]; + double xr = wki * a[j] - wkr * a[k]; + a[j] = wkr * a[j] + wki * a[k]; + a[k] = xr; + } + a[m] *= c[0]; + } + + static void dstsub(int n, FPType* a, int nc, const FPType* c) + { + int m = n >> 1; + int ks = nc / n; + int kk = 0; + for (int j = 1; j < m; ++j) + { + int k = n - j; + kk += ks; + double wkr = c[kk] - c[nc - kk]; + double wki = c[kk] + c[nc - kk]; + double xr = wki * a[k] - wkr * a[j]; + a[k] = wkr * a[k] + wki * a[j]; + a[j] = xr; + } + a[m] *= c[0]; + } + }; +} // namespace r8b + +#endif // R8B_FFT4G_INCLUDED diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/other/License.txt b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/other/License.txt new file mode 100644 index 0000000..9919979 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/other/License.txt @@ -0,0 +1,24 @@ +The MIT License (MIT) + +r8brain-free-src Copyright (c) 2013-2014 Aleksey Vaneev + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Please credit the creator of this library in your documentation in the +following way: "Sample rate converter designed by Aleksey Vaneev of Voxengo" diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/other/icon.png b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/other/icon.png new file mode 100644 index 0000000..fb92f20 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/other/icon.png differ diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/other/r8bdoxy.txt b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/other/r8bdoxy.txt new file mode 100644 index 0000000..59e1edc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/other/r8bdoxy.txt @@ -0,0 +1,17 @@ +PROJECT_NAME = "r8brain-free-src" +PROJECT_BRIEF = "High-quality pro audio sample rate converter library" +PROJECT_LOGO = ./other/icon.png +OUTPUT_DIRECTORY = ./ +BRIEF_MEMBER_DESC = NO +SHORT_NAMES = YES +TAB_SIZE = 4 +OPTIMIZE_OUTPUT_FOR_C = NO +INLINE_INFO = NO +SORT_BRIEF_DOCS = YES +SORT_MEMBERS_CTORS_1ST = YES +SHOW_USED_FILES = NO +SHOW_NAMESPACES = NO +WARN_NO_PARAMDOC = YES +INPUT = ./ +HTML_OUTPUT = Documentation +GENERATE_LATEX = NO diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/r8bbase.cpp b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/r8bbase.cpp new file mode 100644 index 0000000..382eabe --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/r8bbase.cpp @@ -0,0 +1,27 @@ +/** + * @file r8bbase.cpp + * + * @brief C++ file that should be compiled and included into your application. + * + * This is a single library file that should be compiled and included into the + * project that uses the "r8brain-free-src" sample rate converter. This file + * defines several global static objects used by the library. + * + * You may also need to include to your project: the "Kernel32" library + * (on Windows) and the "pthread" library on Mac OS X and Linux. + * + * r8brain-free-src Copyright (c) 2013-2014 Aleksey Vaneev + * See the "License.txt" file for license. + */ + +#include "CDSPFIRFilter.h" +#include "CDSPFracInterpolator.h" + +namespace r8b +{ + CSyncObject CDSPRealFFTKeeper::StateSync; + CDSPRealFFT::CObjKeeper CDSPRealFFTKeeper::FFTObjects[ 31 ]; + CSyncObject CDSPFIRFilterCache::StateSync; + CPtrKeeper CDSPFIRFilterCache::Objects; + int CDSPFIRFilterCache::ObjCount = 0; +} // namespace r8b diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/r8bbase.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/r8bbase.h new file mode 100644 index 0000000..3b216ba --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/r8bbase.h @@ -0,0 +1,1123 @@ +//$ nobt + +/** + * @file r8bbase.h + * + * @brief The "base" inclusion file with basic classes and functions. + * + * This is the "base" inclusion file for the "r8brain-free-src" sample rate + * converter. This inclusion file contains implementations of several small + * utility classes and functions used by the library. + * + * r8brain-free-src Copyright (c) 2013-2014 Aleksey Vaneev + * See the "License.txt" file for license. + * + * @mainpage + * + * @section intro_sec Introduction + * + * Open source (under the MIT license) high-quality professional audio sample + * rate converter (SRC) (resampling) library. Features routines for SRC, both + * up- and downsampling, to/from any sample rate, including non-integer sample + * rates: it can be also used for conversion to/from SACD sample rate and even + * go beyond that. SRC routines were implemented in multi-platform C++ code, + * and have a high level of optimality. + * + * The structure of this library's objects is such that they can be frequently + * created and destroyed in large applications with a minimal performance + * impact due to a high level of reusability of its most + * "initialization-expensive" objects: the fast Fourier transform and FIR + * filter objects. + * + * The SRC algorithm at first produces 2X oversampled (relative to the source + * sample rate, or the destination sample rate if the downsampling is + * performed) signal and then performs interpolation using a bank of short + * (14 to 28 taps, depending on the required precision) + * polynomial-interpolated sinc function-based fractional delay filters. This puts the + * algorithm into the league of the fastest among the most precise SRC + * algorithms. The more precise alternative being only the whole + * number-factored SRC, which can be slower. + * + * @section requirements Requirements + * + * C++ compiler and system with the "double" floating point type (53-bit + * mantissa) support. No explicit code for the "float" type is present in this + * library, because as practice has shown the "float"-based code performs + * considerably slower on a modern processor, at least in this library. + * However, if the "double" type really represents the "float" type (24-bit + * mantissa) in a given compiler, on a given system, the library won't become + * broken, only the conversion quality may become degraded. This library + * always uses the "sizeof( double )" operator to obtain "double" floating + * point type's size in bytes. This library does not have dependencies beside + * the standard C library, the "windows.h" on Windows and the "pthread.h" on + * Mac OS X and Linux. + * + * @section usage Usage Information + * + * The sample rate converter (resampler) is represented by the + * r8b::CDSPResampler class, which is a single front-end class for the whole + * library. You do not basically need to use nor understand any other classes + * beside this class. Several derived classes that have varying levels of + * precision are also available. + * + * The code of the library resides in the "r8b" C++ namespace, effectively + * isolating it from all other code. The code is thread-safe. A separate + * resampler object should be created for each audio channel or stream being + * processed. + * + * Note that you will need to compile the "r8bbase.cpp" source file and + * include the resulting object file into your application build. This source + * file includes definitions of several global static objects used by the + * library. You may also need to include to your project: the "Kernel32" + * library (on Windows) and the "pthread" library on Mac OS X and Linux. + * + * The library is able to process signal of any scale and loudness: it is not + * limited to just a "usual" -1.0 to 1.0 range. + * + * The code of this library was commented in the Doxygen style. To generate + * the documentation locally you may run the "doxygen ./other/r8bdoxy.txt" + * command from the library's directory. + * + * Preliminary tests show that the r8b::CDSPResampler24 resampler class + * achieves 15.6*n_cores Mflops when converting 1 channel of audio from 44100 + * to 96000 sample rate, on a typical Intel Core i7-4770K processor-based + * system without overclocking. This approximately translates to a real-time + * resampling of 160*n_cores audio streams, at 100% CPU load. + * + * @section dll Dynamic Link Library + * + * The functions of this SRC library are also accessible in simplified form + * via the DLL file on Windows, requiring a processor with SSE2 support. + * Delphi Pascal interface unit file for the DLL file is available. DLL and + * C LIB files are distributed in a separate ZIP file on the project's home + * page. On non-Windows systems it is preferrable to use the C++ library + * directly. + * + * @section realtime Real-time Applications + * + * The resampler class of this library was designed as asynchronous processor: + * it may produce any number of output samples, depending on the input sample + * data length and the resampling parameters. The resampler must be fed with + * the input sample data until enough output sample data was produced, with + * any excess output samples used before feeding the resampler with more input + * data. A "relief" factor here is that the resampler removes the initial + * processing latency automatically, and that after initial moments of + * processing the output becomes steady, with only minor output sample data + * length fluctuations. + * + * Note that the r8b::CDSPResampler::getInLenBeforeOutStart() function can be + * used to estimate the number of input samples that should be provided to the + * resampler before the actual output starts. + * + * @section notes Notes + * + * When using the r8b::CDSPResampler<> class directly, you may select the + * transition band/steepness of the low-pass (reconstruction) filter, + * expressed as a percentage of the full spectral bandwidth of the input + * signal (or the output signal if the downsampling is performed), and the + * desired stop-band attenuation in decibel. + * + * The transition band is specified as the normalized spectral space of the + * input signal (or the output signal if the downsampling is performed) + * between the low-pass filter's -3 dB point and the Nyquist frequency, and + * ranges from 0.5% to 45%. Stop-band attenuation can be specified in the + * range 49 to 218 decibel. + * + * This SRC library also implements a faster "power of 2" resampling (e.g. 2X, + * 4X, 8X, 16X, etc. upsampling and downsampling). + * + * This library was tested for compatibility with GNU C++, Microsoft Visual + * C++ and Intel C++ compilers, on 32- and 64-bit Windows, Mac OS X and CentOS + * Linux. + * + * All code is fully "inline", without the need to compile many source files. + * The memory footprint is quite modest. + * + * @section users Users + * + * This library is used by: + * + * * http://www.martinic.com/combov/ Combo Model V VSTi instrument + * * http://midithru.net/Home/AsioLink WDM Asio Link Driver + * + * @section license License + * + * The MIT License (MIT) + * + * r8brain-free-src Copyright (c) 2013-2014 Aleksey Vaneev + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Please credit the creator of this library in your documentation in the + * following way: "Sample rate converter designed by Aleksey Vaneev of + * Voxengo" + * + * @version 1.6 + */ + +#pragma once + +#include +#include +#include +#include "r8bconf.h" + +#if defined( R8B_WIN ) +#include +#else // R8B_WIN + #include +#endif // R8B_WIN + +/** + * @brief The "r8brain-free-src" library namespace. + * + * The "r8brain-free-src" sample rate converter library namespace. + */ + +namespace r8b +{ +#if !defined( M_PI ) + /** + * The macro equals to "pi" constant, fits 53-bit floating point mantissa. + */ + +#define M_PI 3.14159265358979324 +#endif // M_PI + +#if !defined( M_2PI ) + /** + * The M_2PI macro equals to "2 * pi" constant, fits 53-bit floating point + * mantissa. + */ + +#define M_2PI 6.28318530717958648 +#endif // M_2PI + +#if !defined( M_3PI ) + /** + * The M_3PI macro equals to "3 * pi" constant, fits 53-bit floating point + * mantissa. + */ + +#define M_3PI 9.42477796076937972 +#endif // M_3PI + +#if !defined( M_4PI ) + /** + * The M_4PI macro equals to "4 * pi" constant, fits 53-bit floating point + * mantissa. + */ + +#define M_4PI 12.56637061435917295 +#endif // M_4PI + +#if !defined( M_PId2 ) + /** + * The macro equals to "pi divided by 2" constant, fits 53-bit floating + * point mantissa. + */ + +#define M_PId2 1.57079632679489662 +#endif // M_PId2 + + /** + * A special macro that defines empty copy-constructor and copy operator with + * the "private:" prefix. This macro should be used in classes that cannot be + * copied in a standard C++ way. + * + * This macro does not need to be defined in classes derived from a class + * where such macro was already used. + * + * @param ClassName The name of the class which uses this macro. + */ + +#define R8BNOCTOR( ClassName ) \ + private: \ + ClassName( const ClassName& ) { } \ + ClassName& operator = ( const ClassName& ) { return( *this ); } + + /** + * @brief The default base class for objects created on heap. + * + * Class that implements "new" and "delete" operators that use standard + * malloc() and free() functions. + */ + + class CStdClassAllocator + { + public: + /** + * @param n The size of the object, in bytes. + * @param p Pointer to object's pre-allocated memory block. + * @return Pointer to object. + */ + + void* operator new(size_t, void* p) { return (p); } + + /** + * @param n The size of the object, in bytes. + * @return Pointer to the allocated memory block for the object. + */ + + void* operator new(size_t n) { return (malloc(n)); } + + /** + * @param n The size of the object, in bytes. + * @return Pointer to the allocated memory block for the object. + */ + + void* operator new[](size_t n) { return (malloc(n)); } + + /** + * Operator frees a previously allocated memory block for the object. + * + * @param p Pointer to the allocated memory block for the object. + */ + + void operator delete(void* p) { free(p); } + + /** + * Operator frees a previously allocated memory block for the object. + * + * @param p Pointer to the allocated memory block for the object. + */ + + void operator delete[](void* p) { free(p); } + }; + + /** + * @brief The default base class for objects that allocate blocks of memory. + * + * Memory buffer allocator that uses "stdlib" standard memory functions. + */ + + class CStdMemAllocator : public CStdClassAllocator + { + public: + /** + * Function allocates memory block. + * + * @param Size The size of the block, in bytes. + * @result The pointer to the allocated block. + */ + + static void* allocmem(const size_t Size) { return (malloc(Size)); } + + /** + * Function reallocates a previously allocated memory block. + * + * @param p Pointer to the allocated block, can be NULL. + * @param Size The new size of the block, in bytes. + * @result The pointer to the (re)allocated block. + */ + + static void* reallocmem(void* p, const size_t Size) { return (realloc(p, Size)); } + + /** + * Function frees a previously allocated memory block. + * + * @param p Pointer to the allocated block, can be NULL. + */ + + static void freemem(void* p) { free(p); } + }; + + /** + * @brief Templated memory buffer class for element buffers of fixed capacity. + * + * Fixed memory buffer object. Supports allocation of a fixed amount of + * memory. Does not store buffer's capacity - the user should know the actual + * capacity of the buffer. Does not feature "internal" storage, memory is + * always allocated via the R8B_MEMALLOCCLASS class's functions. Thus the + * object of this class can be moved in memory. + * + * This class manages memory space only - it does not perform element class + * construction nor destruction operations. + * + * @param T The class of the stored elements (e.g. "double"). + */ + + template + class CFixedBuffer : public R8B_MEMALLOCCLASS + { + R8BNOCTOR(CFixedBuffer) + + public: + CFixedBuffer() : Data(nullptr) { } + + /** + * Constructor allocates memory so that the specified number of elements + * of type T can be stored in *this buffer object. + * + * @param Capacity Storage for this number of elements to allocate. + */ + + CFixedBuffer(const int Capacity) + { + R8BASSERT(Capacity > 0 || Capacity == 0); + + Data = (T*)allocmem(Capacity * sizeof(T)); + + R8BASSERT(Data != nullptr || Capacity == 0); + } + + ~CFixedBuffer() { freemem(Data); } + + /** + * Function allocates memory so that the specified number of elements of + * type T can be stored in *this buffer object. + * + * @param Capacity Storage for this number of elements to allocate. + */ + + void alloc(const int Capacity) + { + R8BASSERT(Capacity > 0 || Capacity == 0); + + freemem(Data); + Data = (T*)allocmem(Capacity * sizeof(T)); + + R8BASSERT(Data != nullptr || Capacity == 0); + } + + /** + * Function deallocates a previously allocated buffer. + */ + + void free() + { + freemem(Data); + Data = NULL; + } + + /** + * @return Pointer to the first element of the allocated buffer, nullptr if + * not allocated. + */ + + T* getPtr() const { return (Data); } + + /** + * @return Pointer to the first element of the allocated buffer, nullptr if + * not allocated. + */ + + operator T*() const { return (Data); } + + private: + T* Data = nullptr; ///< Element buffer pointer. + ///< + }; + + /** + * @brief Pointer-to-object "keeper" class with automatic deletion. + * + * An auxiliary class that can be used for keeping a pointer to object that + * should be deleted together with the "keeper" by calling object's "delete" + * operator. + * + * @param T Pointer type to operate with, must include the asterisk (e.g. + * "CDSPFIRFilter*"). + */ + + template + class CPtrKeeper + { + R8BNOCTOR(CPtrKeeper) + + public: + CPtrKeeper() : Object(NULL) { } + + /** + * Constructor assigns a pointer to object to *this keeper. + * + * @param aObject Pointer to object to keep, can be NULL. + */ + + template + CPtrKeeper(T2 const aObject) : Object(aObject) { } + + ~CPtrKeeper() { delete Object; } + + /** + * Function assigns a pointer to object to *this keeper. A previously + * keeped pointer will be reset and object deleted. + * + * @param aObject Pointer to object to keep, can be NULL. + */ + + template + void operator =(T2 const aObject) + { + reset(); + Object = aObject; + } + + /** + * @return Pointer to keeped object, nullptr if no object is being kept. + */ + + T operator ->() const { return (Object); } + + /** + * @return Pointer to keeped object, nullptr if no object is being kept. + */ + + operator T() const { return (Object); } + + /** + * Function resets the keeped pointer and deletes the keeped object. + */ + + void reset() + { + T DelObj = Object; + Object = NULL; + delete DelObj; + } + + /** + * @return Function returns the keeped pointer and resets it in *this + * keeper without object deletion. + */ + + T unkeep() + { + T ResObject = Object; + Object = NULL; + return (ResObject); + } + + private: + T Object; ///< Pointer to keeped object. + ///< + }; + + /** + * @brief Multi-threaded synchronization object class. + * + * This class uses standard OS thread-locking (mutex) mechanism which is + * fairly efficient in most cases. + * + * The acquire() function can be called recursively, in the same thread, for + * this kind of thread-locking mechanism. This will not produce a dead-lock. + */ + + class CSyncObject + { + R8BNOCTOR(CSyncObject) + + public: + CSyncObject() + { +#if defined( R8B_WIN ) + InitializeCriticalSectionAndSpinCount(&CritSec, 4000); +#else // R8B_WIN + pthread_mutexattr_t MutexAttrs; + pthread_mutexattr_init( &MutexAttrs ); + pthread_mutexattr_settype( &MutexAttrs, PTHREAD_MUTEX_RECURSIVE ); + pthread_mutex_init( &Mutex, &MutexAttrs ); + pthread_mutexattr_destroy( &MutexAttrs ); +#endif // R8B_WIN + } + + ~CSyncObject() + { +#if defined( R8B_WIN ) + DeleteCriticalSection(&CritSec); +#else // R8B_WIN + pthread_mutex_destroy( &Mutex ); +#endif // R8B_WIN + } + + /** + * Function "acquires" *this thread synchronizer object immediately or + * waits until another thread releases it. + */ + + void acquire() + { +#if defined( R8B_WIN ) + EnterCriticalSection(&CritSec); +#else // R8B_WIN + pthread_mutex_lock( &Mutex ); +#endif // R8B_WIN + } + + /** + * Function "releases" *this previously acquired thread synchronizer + * object. + */ + + void release() + { +#if defined( R8B_WIN ) + LeaveCriticalSection(&CritSec); +#else // R8B_WIN + pthread_mutex_unlock( &Mutex ); +#endif // R8B_WIN + } + + private: +#if defined( R8B_WIN ) + CRITICAL_SECTION CritSec; ///< Standard Windows critical section + ///< structure. + ///< +#else // R8B_WIN + pthread_mutex_t Mutex; ///< pthread.h mutex object. + ///< +#endif // R8B_WIN + }; + + /** + * @brief A "keeper" class for CSyncObject-based synchronization. + * + * Sync keeper class. The object of this class can be used as auto-init and + * auto-deinit object for calling the acquire() and release() functions of an + * object of the CSyncObject class. This "keeper" object is best used in + * functions as an "automatic" object allocated on the stack, possibly via the + * R8BSYNC() macro. + */ + + class CSyncKeeper + { + R8BNOCTOR(CSyncKeeper) + + public: + CSyncKeeper() { } + + /** + * @param aSyncObj Pointer to the sync object which should be used for + * sync'ing, can be NULL. + */ + + CSyncKeeper(CSyncObject* const aSyncObj) : SyncObj(aSyncObj) { if (SyncObj != nullptr) { SyncObj->acquire(); } } + + /** + * @param aSyncObj Reference to the sync object which should be used for + * sync'ing. + */ + + CSyncKeeper(CSyncObject& aSyncObj) : SyncObj(&aSyncObj) { SyncObj->acquire(); } + + ~CSyncKeeper() { if (SyncObj != nullptr) { SyncObj->release(); } } + + protected: + CSyncObject* SyncObj = nullptr; ///< Sync object in use (can be NULL). + ///< + }; + + /** + * The synchronization macro. The R8BSYNC( obj ) macro, which creates and + * object of the r8b::CSyncKeeper class on stack, should be put before + * sections of the code that may potentially change data asynchronously with + * other threads at the same time. The R8BSYNC( obj ) macro "acquires" the + * synchronization object thus blocking execution of other threads that also + * use the same R8BSYNC( obj ) macro. The blocked section begins with the + * R8BSYNC( obj ) macro and finishes at the end of the current C++ code block. + * Multiple R8BSYNC() macros may be defined from within the same code block. + * + * @param SyncObject An object of the CSyncObject type that is used for + * synchronization. + */ + +#define R8BSYNC( SyncObject ) R8BSYNC_( SyncObject, __LINE__ ) +#define R8BSYNC_( SyncObject, id ) R8BSYNC__( SyncObject, id ) +#define R8BSYNC__( SyncObject, id ) CSyncKeeper SyncKeeper##id( SyncObject ) + + /** + * @brief Sine signal generator class. + * + * Class implements sine signal generator without biasing. + */ + + class CSineGen + { + public: + CSineGen() { } + + /** + * Constructor initializes *this sine signal generator. + * + * @param si Sine function increment, in radians. + * @param ph Starting phase, in radians. Add 0.5 * M_PI for cosine + * function. + */ + + CSineGen(const double si, const double ph) : svalue1(sin(ph)), svalue2(sin(ph - si)), sincr(2.0 * cos(si)) { } + + /** + * Constructor initializes *this sine signal generator. + * + * @param si Sine function increment, in radians. + * @param ph Starting phase, in radians. Add 0.5 * M_PI for cosine + * function. + * @param g The overall gain factor, 1.0 for unity gain (-1.0 to 1.0 + * amplitude). + */ + + CSineGen(const double si, const double ph, const double g) : svalue1(sin(ph) * g), svalue2(sin(ph - si) * g), sincr(2.0 * cos(si)) { } + + /** + * Function initializes *this sine signal generator. + * + * @param si Sine function increment, in radians. + * @param ph Starting phase, in radians. Add 0.5 * M_PI for cosine + * function. + */ + + void init(const double si, const double ph) + { + svalue1 = sin(ph); + svalue2 = sin(ph - si); + sincr = 2.0 * cos(si); + } + + /** + * Function initializes *this sine signal generator. + * + * @param si Sine function increment, in radians. + * @param ph Starting phase, in radians. Add 0.5 * M_PI for cosine + * function. + * @param g The overall gain factor, 1.0 for unity gain (-1.0 to 1.0 + * amplitude). + */ + + void init(const double si, const double ph, const double g) + { + svalue1 = sin(ph) * g; + svalue2 = sin(ph - si) * g; + sincr = 2.0 * cos(si); + } + + /** + * @return Next value of the sine function, without biasing. + */ + + double generate() + { + const double res = svalue1; + + svalue1 = sincr * res - svalue2; + svalue2 = res; + + return (res); + } + + private: + double svalue1 = 0; ///< Current sine value. + ///< + double svalue2 = 0; ///< Previous sine value. + ///< + double sincr = 0; ///< Sine value increment. + ///< + }; + + /** + * @param v Input value. + * @return Calculated bit occupancy of the specified input value. Bit + * occupancy means how many significant lower bits are necessary to store a + * specified value. Function treats the input value as unsigned. + */ + + inline int getBitOccupancy(const int v) + { + static const char OccupancyTable[] = + { + 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 + }; + + const int tt = v >> 16; + + if (tt != 0) + { + const int t = v >> 24; + return (t != 0 ? 24 + OccupancyTable[t & 0xFF] : 16 + OccupancyTable[tt]); + } + const int t = v >> 8; + return (t != 0 ? 8 + OccupancyTable[t] : OccupancyTable[v]); + } + + /** + * Function calculates frequency response of the specified FIR filter at the + * specified circular frequency. Phase can be calculated as atan2( im, re ). + * + * @param flt FIR filter's coefficients. + * @param fltlen Number of coefficients (taps) in the filter. + * @param th Circular frequency [0; pi]. + * @param[out] re0 Resulting real part of the complex frequency response. + * @param[out] im0 Resulting imaginary part of the complex frequency response. + * @param fltlat Filter's latency in samples. + */ + + inline void calcFIRFilterResponse(const double* flt, int fltlen, const double th, double& re0, double& im0, const int fltlat = 0) + { + const double sincr = 2.0 * cos(th); + double cvalue1; + double svalue1; + + if (fltlat == 0) + { + cvalue1 = 1.0; + svalue1 = 0.0; + } + else + { + cvalue1 = cos(-fltlat * th); + svalue1 = sin(-fltlat * th); + } + + double cvalue2 = cos(-(fltlat + 1) * th); + double svalue2 = sin(-(fltlat + 1) * th); + + double re = 0.0; + double im = 0.0; + + while (fltlen > 0) + { + re += cvalue1 * flt[0]; + im += svalue1 * flt[0]; + flt++; + fltlen--; + + double tmp = cvalue1; + cvalue1 = sincr * cvalue1 - cvalue2; + cvalue2 = tmp; + + tmp = svalue1; + svalue1 = sincr * svalue1 - svalue2; + svalue2 = tmp; + } + + re0 = re; + im0 = im; + } + + /** + * Function calculates frequency response and group delay of the specified FIR + * filter at the specified circular frequency. The group delay is calculated + * by evaluating the filter's response at close side-band frequencies of "th". + * + * @param flt FIR filter's coefficients. + * @param fltlen Number of coefficients (taps) in the filter. + * @param th Circular frequency [0; pi]. + * @param[out] re Resulting real part of the complex frequency response. + * @param[out] im Resulting imaginary part of the complex frequency response. + * @param[out] gd Resulting group delay at the specified frequency, in + * samples. + */ + + inline void calcFIRFilterResponseAndGroupDelay(const double* const flt, const int fltlen, const double th, double& re, double& im, double& gd) + { + // Calculate response at "th". + + calcFIRFilterResponse(flt, fltlen, th, re, im); + + // Calculate response at close sideband frequencies. + + const int Count = 2; + const double thd2 = 1e-9; + double ths[ Count ] = { th - thd2, th + thd2 }; + + if (ths[0] < 0.0) { ths[0] = 0.0; } + if (ths[1] > M_PI) { ths[1] = M_PI; } + + double ph1[ Count ]; + + for (int i = 0; i < Count; ++i) + { + double re1; + double im1; + + calcFIRFilterResponse(flt, fltlen, ths[i], re1, im1); + ph1[i] = atan2(im1, re1); + } + + if (fabs(ph1[1] - ph1[0]) > M_PI) + { + if (ph1[1] > ph1[0]) { ph1[1] -= M_2PI; } + else { ph1[1] += M_2PI; } + } + + const double thd = ths[1] - ths[0]; + gd = (ph1[1] - ph1[0]) / -thd; + } + + /** + * Function normalizes FIR filter so that its frequency response at DC is + * equal to DCGain. + * + * @param[in,out] p Filter coefficients. + * @param l Filter length. + * @param DCGain Filter's gain at DC (linear, non-decibel value). + * @param pstep "p" array step. + */ + inline void normalizeFIRFilter(double* const p, const int l, const double DCGain, const int pstep = 1) + { + R8BASSERT(l > 0); + R8BASSERT(pstep != 0); + + double s = 0.0; + double* pp = p; + int i = l; + + while (i > 0) + { + s += *pp; + pp += pstep; + i--; + } + + s = DCGain / s; + pp = p; + i = l; + + while (i > 0) + { + *pp *= s; + pp += pstep; + i--; + } + } + + /** + * Function calculates coefficients used to calculate 3rd order spline + * (polynomial) on the equidistant lattice, using 8 points. + * + * @param[out] c Output coefficients buffer, length = 4. + * @param xm3 Point at x-3 position. + * @param xm2 Point at x-2 position. + * @param xm1 Point at x-1 position. + * @param x0 Point at x position. + * @param x1 Point at x+1 position. + * @param x2 Point at x+2 position. + * @param x3 Point at x+3 position. + * @param x4 Point at x+4 position. + */ + inline void calcSpline3p8Coeffs(double* c, const double xm3, const double xm2, const double xm1, const double x0, const double x1, const double x2, + const double x3, const double x4) + { + c[0] = x0; + c[1] = (61.0 * (x1 - xm1) + 16.0 * (xm2 - x2) + 3.0 * (x3 - xm3)) / 76.0; + + c[2] = (106.0 * (xm1 + x1) + 10.0 * x3 + 6.0 * xm3 - 3.0 * x4 - 29.0 * (xm2 + x2) - 167.0 * x0) / 76.0; + + c[3] = (91.0 * (x0 - x1) + 45.0 * (x2 - xm1) + 13.0 * (xm2 - x3) + 3.0 * (x4 - xm3)) / 76.0; + } + + /** + * Function calculates coefficients used to calculate 2rd order spline + * (polynomial) on the equidistant lattice, using 8 points. This function is + * based on the calcSpline3Coeffs8() function, but without the 3rd order + * coefficient. + * + * @param[out] c Output coefficients buffer, length = 3. + * @param xm3 Point at x-3 position. + * @param xm2 Point at x-2 position. + * @param xm1 Point at x-1 position. + * @param x0 Point at x position. + * @param x1 Point at x+1 position. + * @param x2 Point at x+2 position. + * @param x3 Point at x+3 position. + * @param x4 Point at x+4 position. + */ + + inline void calcSpline2p8Coeffs(double* c, const double xm3, const double xm2, const double xm1, const double x0, const double x1, const double x2, + const double x3, const double x4) + { + c[0] = x0; + c[1] = (61.0 * (x1 - xm1) + 16.0 * (xm2 - x2) + 3.0 * (x3 - xm3)) / 76.0; + c[2] = (106.0 * (xm1 + x1) + 10.0 * x3 + 6.0 * xm3 - 3.0 * x4 - 29.0 * (xm2 + x2) - 167.0 * x0) / 76.0; + } + + /** + * Function calculates coefficients used to calculate 3rd order segment + * interpolation polynomial on the equidistant lattice, using 4 points. + * + * @param[out] c Output coefficients buffer, length = 4. + * @param[in] y Equidistant point values. Value at offset 1 corresponds to + * x=0 point. + */ + + inline void calcInterpCoeffs3p4(double* const c, const double* const y) + { + c[0] = y[1]; + c[1] = 0.5 * (y[2] - y[0]); + c[2] = y[0] - 2.5 * y[1] + y[2] + y[2] - 0.5 * y[3]; + c[3] = 0.5 * (y[3] - y[0]) + 1.5 * (y[1] - y[2]); + } + + /** + * Function calculates coefficients used to calculate 3rd order segment + * interpolation polynomial on the equidistant lattice, using 6 points. + * + * @param[out] c Output coefficients buffer, length = 4. + * @param[in] y Equidistant point values. Value at offset 2 corresponds to + * x=0 point. + */ + + inline void calcInterpCoeffs3p6(double* const c, const double* const y) + { + c[0] = y[2]; + c[1] = (11.0 * (y[3] - y[1]) + 2.0 * (y[0] - y[4])) / 14.0; + c[2] = (20.0 * (y[1] + y[3]) + 2.0 * y[5] - 4.0 * y[0] - 7.0 * y[4] - 31.0 * y[2]) / 14.0; + c[3] = (17.0 * (y[2] - y[3]) + 9.0 * (y[4] - y[1]) + 2.0 * (y[0] - y[5])) / 14.0; + } + + /** + * Function calculates coefficients used to calculate 3rd order segment + * interpolation polynomial on the equidistant lattice, using 8 points. + * + * @param[out] c Output coefficients buffer, length = 4. + * @param[in] y Equidistant point values. Value at offset 3 corresponds to + * x=0 point. + */ + + inline void calcInterpCoeffs3p8(double* const c, const double* const y) + { + c[0] = y[3]; + c[1] = (61.0 * (y[4] - y[2]) + 16.0 * (y[1] - y[5]) + 3.0 * (y[6] - y[0])) / 76.0; + c[2] = (106.0 * (y[2] + y[4]) + 10.0 * y[6] + 6.0 * y[0] - 3.0 * y[7] - 29.0 * (y[1] + y[5]) - 167.0 * y[3]) / 76.0; + c[3] = (91.0 * (y[3] - y[4]) + 45.0 * (y[5] - y[2]) + 13.0 * (y[1] - y[6]) + 3.0 * (y[7] - y[0])) / 76.0; + } + + /** + * Function calculates coefficients used to calculate 3rd order segment + * interpolation polynomial on the equidistant lattice, using 8 points. + * + * @param[out] c Output coefficients buffer, length = 3. + * @param[in] y Equidistant point values. Value at offset 3 corresponds to + * x=0 point. + */ + + inline void calcInterpCoeffs2p8(double* const c, const double* const y) + { + c[0] = y[3]; + c[1] = (61.0 * (y[4] - y[2]) + 16.0 * (y[1] - y[5]) + 3.0 * (y[6] - y[0])) / 76.0; + + c[2] = (106.0 * (y[2] + y[4]) + 10.0 * y[6] + 6.0 * y[0] - 3.0 * y[7] - 29.0 * (y[1] + y[5]) - 167.0 * y[3]) / 76.0; + } + +#if !defined( min ) + + /** + * @param v1 Value 1. + * @param v2 Value 2. + * @return The minimum of 2 values. + */ + template + T min(const T& v1, const T& v2) { return (v1 < v2 ? v1 : v2); } + +#endif // min + +#if !defined( max ) + + /** + * @param v1 Value 1. + * @param v2 Value 2. + * @return The maximum of 2 values. + */ + template + T max(const T& v1, const T& v2) { return (v1 > v2 ? v1 : v2); } + +#endif // max + + /** + * Function "clamps" (clips) the specified value so that it is not lesser than + * "minv", and not greater than "maxv". + * + * @param Value Value to clamp. + * @param minv Minimal allowed value. + * @param maxv Maximal allowed value. + * @return "Clamped" value. + */ + inline double clampr(const double Value, const double minv, const double maxv) + { + if (Value < minv) { return (minv); } + if (Value > maxv) { return (maxv); } + return (Value); + } + + /** + * @param x Value to square. + * @return Squared value of the argument. + */ + inline double sqr(const double x) { return (x * x); } + + /** + * @param v Input value. + * @param p Power factor. + * @return Returns pow() function's value with input value's sign check. + */ + inline double pows(const double v, const double p) { return (v < 0.0 ? -pow(-v, p) : pow(v, p)); } + + /** + * @param v Input value. + * @return Calculated single-argument Gaussian function of the input value. + */ + inline double gauss(const double v) { return (exp(-(v * v))); } + + /** + * @param v Input value. + * @return Calculated inverse hyperbolic sine of the input value. + */ + inline double asinh(const double v) { return (log(v + sqrt(v * v + 1.0))); } + + /** + * @param x Input value. + * @return Calculated zero-th order modified Bessel function of the first kind + * of the input value. Approximate value. + */ + inline double besselI0(const double x) + { + const double ax = fabs(x); + double y; + + if (ax < 3.75) + { + y = x / 3.75; + y *= y; + + return (1.0 + y * (3.5156229 + y * (3.0899424 + y * (1.2067492 + y * (0.2659732 + y * (0.360768e-1 + y * 0.45813e-2)))))); + } + + y = 3.75 / ax; + + return (exp(ax) / sqrt(ax) * (0.39894228 + y * (0.1328592e-1 + y * ( + 0.225319e-2 + y * ( + -0.157565e-2 + y * ( + 0.916281e-2 + y * ( + -0.2057706e-1 + y * (0.2635537e-1 + y * (-0.1647633e-1 + y * 0.392377e-2))))))))); + } +} // namespace r8b diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/r8bconf.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/r8bconf.h new file mode 100644 index 0000000..8743d06 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/r8bconf.h @@ -0,0 +1,131 @@ +//$ nobt +//$ nocpp + +/** + * @file r8bconf.h + * + * @brief The "configuration" inclusion file you can modify. + * + * This is the "configuration" inclusion file for the "r8brain-free-src" + * sample rate converter. You may redefine the macros here as you see fit. + * + * r8brain-free-src Copyright (c) 2013-2014 Aleksey Vaneev + * See the "License.txt" file for license. + */ + +#ifndef R8BCONF_INCLUDED +#define R8BCONF_INCLUDED + +#if defined( _WIN32 ) || defined( _WIN64 ) +#define R8B_WIN 1 +#elif defined( __APPLE__ ) + #define R8B_MAC 1 +#else // defined( __APPLE__ ) + #define R8B_LNX 1 // Assume Linux (Unix) platform by default. +#endif // defined( __APPLE__ ) + +#if !defined( R8B_FLTLEN ) +/** + * This macro defines the default fractional delay filter length. Macro is + * used by the r8b::CDSPResampler class. + */ + +#define R8B_FLTLEN 28 +#endif // !defined( R8B_FLTLEN ) + +#if !defined( R8B_FLTFRACS ) +/** + * This macro defines the default number of fractional delay filters that + * are sampled by the filter bank. Macro is used by the r8b::CDSPResampler + * class. In order to get consistent results when resampling to/from + * different sample rates, it is suggested to set this macro to a suitable + * prime number. + */ + +#define R8B_FLTFRACS 1733 +#endif // !defined( R8B_FLTFRACS ) + +#if !defined( R8B_IPP ) +/** + * Set the R8B_IPP macro definition to 1 to enable the use of Intel IPP's + * fast Fourier transform functions. Also uncomment and correct the IPP + * header inclusion macros. + * + * Do not forget to call the ippInit() function at the start of the + * application, before using this library's functions. + */ + +#define R8B_IPP 0 + +// #include +// #include +#endif // !defined( R8B_IPP ) + +#if !defined( R8BASSERT ) +/** + * Assertion macro used to check for certain run-time conditions. By + * default no action is taken if assertion fails. + * + * @param e Expression to check. + */ + +#define R8BASSERT( e ) +#endif // !defined( R8BASSERT ) + +#if !defined( R8BCONSOLE ) +/** + * Console output macro, used to output various resampler status strings, + * including filter design parameters, convolver parameters. + * + * @param e Expression to send to the console, usually consists of a + * standard "printf" format string followed by several parameters + * (__VA_ARGS__). + */ + +#define R8BCONSOLE( ... ) +#endif // !defined( R8BCONSOLE ) + +#if !defined( R8B_BASECLASS ) +/** + * Macro defines the name of the class from which all classes that are + * designed to be created on heap are derived. The default + * r8b::CStdClassAllocator class uses "stdlib" memory allocation + * functions. + * + * The classes that are best placed on stack or as class members are not + * derived from any class. + */ + +#define R8B_BASECLASS :: r8b :: CStdClassAllocator +#endif // !defined( R8B_BASECLASS ) + +#if !defined( R8B_MEMALLOCCLASS ) +/** + * Macro defines the name of the class that implements raw memory + * allocation functions, see the r8b::CStdMemAllocator class for details. + */ + +#define R8B_MEMALLOCCLASS :: r8b :: CStdMemAllocator +#endif // !defined( R8B_MEMALLOCCLASS ) + +#if !defined( R8B_FILTER_CACHE_MAX ) +/** + * This macro specifies the number of filters kept in the cache at most. + * The actual number can be higher if many different filters are in use at + * the same time. + */ + +#define R8B_FILTER_CACHE_MAX 96 +#endif // !defined( R8B_FILTER_CACHE_MAX ) + +#if !defined( R8B_FLTTEST ) +/** + * This macro, when equal to 1, enables fractional delay filter bank + * testing: in this mode the filter bank becomes dynamic member of the + * CDSPFracInterpolator object instead of being a global static object. + */ + +#define R8B_FLTTEST 0 +#endif // !defined( R8B_FLTTEST ) + +#endif // R8BCONF_INCLUDED diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/r8butil.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/r8butil.h new file mode 100644 index 0000000..6add5c0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/r8brain/r8butil.h @@ -0,0 +1,284 @@ +//$ nobt +//$ nocpp + +/** + * @file r8butil.h + * + * @brief The inclusion file with several utility functions. + * + * This file includes several utility functions used by various utility + * programs like "calcErrorTable.cpp". + * + * r8brain-free-src Copyright (c) 2013-2014 Aleksey Vaneev + * See the "License.txt" file for license. + */ + +#ifndef R8BUTIL_INCLUDED +#define R8BUTIL_INCLUDED + +#include "r8bbase.h" + +namespace r8b +{ + + /** + * @param re Real part of the frequency response. + * @param im Imaginary part of the frequency response. + * @return A magnitude response value converted from the linear scale to the + * logarithmic scale. + */ + + inline double convertResponseToLog(const double re, const double im) { return (4.34294481903251828 * log(re * re + im * im + 1e-100)); } + + /** + * An utility function that performs frequency response scanning step update + * based on the current magnitude response's slope. + * + * @param[in,out] step The current scanning step. Will be updated on + * function's return. Must be a positive value. + * @param curg Squared magnitude response at the current frequency point. + * @param[in,out] prevg_log Previous magnitude response, log scale. Will be + * updated on function's return. + * @param prec Precision multiplier, affects the size of the step. + * @param maxstep The maximal allowed step. + * @param minstep The minimal allowed step. + */ + + inline void updateScanStep(double& step, const double curg, double& prevg_log, const double prec, const double maxstep, const double minstep = 1e-11) + { + double curg_log = 4.34294481903251828 * log(curg + 1e-100); + curg_log += (prevg_log - curg_log) * 0.7; + + const double slope = fabs(curg_log - prevg_log); + prevg_log = curg_log; + + if (slope > 0.0) + { + step /= prec * slope; + step = max(min(step, maxstep), minstep); + } + } + + /** + * Function locates normalized frequency at which the minimum filter gain + * is reached. The scanning is performed from lower (left) to higher + * (right) frequencies, the whole range is scanned. + * + * Function expects that the magnitude response is always reducing from lower + * to high frequencies, starting at "minth". + * + * @param flt Filter response. + * @param fltlen Filter response's length in samples (taps). + * @param[out] ming The current minimal gain (squared). On function's return + * will contain the minimal gain value found (squared). + * @param[out] minth The normalized frequency where the minimal gain is + * currently at. On function's return will point to the normalized frequency + * where the new minimum was found. + * @param thend The ending frequency, inclusive. + */ + + inline void findFIRFilterResponseMinLtoR(const double* const flt, + const int fltlen, double& ming, double& minth, const double thend) + { + const double maxstep = minth * 2e-3; + double curth = minth; + double re; + double im; + calcFIRFilterResponse(flt, fltlen, M_PI * curth, re, im); + double prevg_log = convertResponseToLog(re, im); + double step = 1e-11; + + while (true) + { + curth += step; + + if (curth > thend) { break; } + + calcFIRFilterResponse(flt, fltlen, M_PI * curth, re, im); + const double curg = re * re + im * im; + + if (curg > ming) + { + ming = curg; + minth = curth; + break; + } + + ming = curg; + minth = curth; + + updateScanStep(step, curg, prevg_log, 0.31, maxstep); + } + } + + /** + * Function locates normalized frequency at which the maximal filter gain + * is reached. The scanning is performed from lower (left) to higher + * (right) frequencies, the whole range is scanned. + * + * Note: this function may "stall" in very rare cases if the magnitude + * response happens to be "saw-tooth" like, requiring a very small stepping to + * be used. If this happens, it may take dozens of seconds to complete. + * + * @param flt Filter response. + * @param fltlen Filter response's length in samples (taps). + * @param[out] maxg The current maximal gain (squared). On function's return + * will contain the maximal gain value (squared). + * @param[out] maxth The normalized frequency where the maximal gain is + * currently at. On function's return will point to the normalized frequency + * where the maximum was reached. + * @param thend The ending frequency, inclusive. + */ + + inline void findFIRFilterResponseMaxLtoR(const double* const flt, + const int fltlen, double& maxg, double& maxth, const double thend) + { + const double maxstep = maxth * 1e-4; + double premaxth = maxth; + double premaxg = maxg; + double postmaxth = maxth; + double postmaxg = maxg; + + double prevth = maxth; + double prevg = maxg; + double curth = maxth; + double re; + double im; + calcFIRFilterResponse(flt, fltlen, M_PI * curth, re, im); + double prevg_log = convertResponseToLog(re, im); + double step = 1e-11; + + bool WasPeak = false; + int AfterPeakCount = 0; + + while (true) + { + curth += step; + + if (curth > thend) { break; } + + calcFIRFilterResponse(flt, fltlen, M_PI * curth, re, im); + const double curg = re * re + im * im; + + if (curg > maxg) + { + premaxth = prevth; + premaxg = prevg; + maxg = curg; + maxth = curth; + WasPeak = true; + AfterPeakCount = 0; + } + else if (WasPeak) + { + if (AfterPeakCount == 0) + { + postmaxth = curth; + postmaxg = curg; + } + + if (AfterPeakCount == 5) + { + // Perform 2 approximate binary searches. + + for (int k = 0; k < 2; ++k) + { + double l = (k == 0 ? premaxth : maxth); + double curgl = (k == 0 ? premaxg : maxg); + double r = (k == 0 ? maxth : postmaxth); + double curgr = (k == 0 ? maxg : postmaxg); + + while (true) + { + const double c = (l + r) * 0.5; + calcFIRFilterResponse(flt, fltlen, M_PI * c, re, im); + + const double curgTmp = re * re + im * im; + + if (curgl > curgr) + { + r = c; + curgr = curgTmp; + } + else + { + l = c; + curgl = curgTmp; + } + + if (r - l < 1e-11) + { + if (curgl > curgr) + { + maxth = l; + maxg = curgl; + } + else + { + maxth = r; + maxg = curgr; + } + + break; + } + } + } + + break; + } + + AfterPeakCount++; + } + + prevth = curth; + prevg = curg; + + updateScanStep(step, curg, prevg_log, 1.0, maxstep); + } + } + + /** + * Function locates normalized frequency at which the specified maximum + * filter gain is reached. The scanning is performed from higher (right) + * to lower (left) frequencies, scanning stops when the required gain + * value was crossed. Function uses an extremely efficient binary search and + * thus expects that the magnitude response has the "main lobe" form produced + * by windowing, with a minimal pass-band ripple. + * + * @param flt Filter response. + * @param fltlen Filter response's length in samples (taps). + * @param maxg Maximal gain (squared). + * @param[out] th The current normalized frequency. On function's return will + * point to the normalized frequency where "maxg" is reached. + * @param thend The leftmost frequency to scan, inclusive. + */ + + inline void findFIRFilterResponseLevelRtoL(const double* const flt, const int fltlen, const double maxg, double& th, const double thend) + { + // Perform exact binary search. + + double l = thend; + double r = th; + + while (true) + { + const double c = (l + r) * 0.5; + + if (r - l < 1e-14) + { + th = c; + break; + } + + double re; + double im; + calcFIRFilterResponse(flt, fltlen, M_PI * c, re, im); + const double curg = re * re + im * im; + + if (curg > maxg) { l = c; } + else { r = c; } + } + } +} // namespace r8b + +#endif // R8BUTIL_INCLUDED diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/README.md b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/README.md new file mode 100644 index 0000000..0b30412 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/README.md @@ -0,0 +1,28 @@ +wavelib +======= + +C Implementation of Discrete Wavelet Transform (DWT,SWT and MODWT), Continuous Wavelet transform (CWT) and Discrete Packet Transform ( Full Tree Decomposition and Best Basis DWPT). + +Discrete Wavelet Transform Methods Implemented + +DWT/IDWT A decimated Discrete Wavelet Transform implementation using implicit signal extension and up/downsampling so it is a fast implementation. A FFT based implementation is optional but will not be usually needed. Both periodic and symmetric options are available. + +SWT/ISWT Stationary Wavelet Transform. It works only for signal lengths that are multiples of 2^J where J is the number of decomposition levels. For signals of other lengths see MODWT implementation. + +MODWT/IMODWT Maximal Overlap Discrete Wavelet Transform is another undecimated transform. It is implemented for signals of any length but only orthogonal wavelets (Daubechies, Symlets and Coiflets) can be deployed. This implementation is based on the method laid out in "Wavelet Methods For Wavelet Analysis" by Donald Percival and Andrew Walden. + +Discrete Wavelet Packet Transform Methods Implemented + +WTREE A Fully Decimated Wavelet Tree Decomposition. This is a highly redundant transform and retains all coefficients at each node. This is not recommended for compression and denoising applications. + +DWPT/IDWPT Is a derivative of WTREE method which retains coefficients based on entropy methods. This is a non-redundant transform and output length is of the same order as the input. + +CWT/ICWT C translation ( with some modifications) of Continuous Wavelet Transform Software provided by C. Torrence and G. Compo, and is available at URL: http://atoc.colorado.edu/research/wavelets/'. A generalized Inverse Transform with approximate reconstruction is also added. + +Documentation Available at - https://github.com/rafat/wavelib/wiki + +Live Demo (Emscripten) - http://rafat.github.io/wavelib/ + +License - BSD 3-Clause + +Contace - rafat.hsn@gmail.com diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/header/wavelib.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/header/wavelib.h new file mode 100644 index 0000000..aa3622f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/header/wavelib.h @@ -0,0 +1,240 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_MSC_VER) +#pragma warning(disable : 4200) +#pragma warning(disable : 4996) +#endif + +#ifndef fft_type +#define fft_type double +#endif + +#ifndef cplx_type +#define cplx_type double +#endif + + +typedef struct cplx_t +{ + cplx_type re; + cplx_type im; +} cplx_data; + +typedef struct wave_set* wave_object; + +wave_object wave_init(char* wname); + +struct wave_set +{ + char wname[50]; + int filtlength;// When all filters are of the same length. [Matlab uses zero-padding to make all filters of the same length] + int lpd_len;// Default filtlength = lpd_len = lpr_len = hpd_len = hpr_len + int hpd_len; + int lpr_len; + int hpr_len; + double* lpd; + double* hpd; + double* lpr; + double* hpr; + double params[0]; +}; + +typedef struct fft_t +{ + fft_type re; + fft_type im; +} fft_data; + +typedef struct fft_set* fft_object; + +fft_object fft_init(int N, int sgn); + +struct fft_set +{ + int N; + int sgn; + int factors[64]; + int lf; + int lt; + fft_data twiddle[1]; +}; + +typedef struct fft_real_set* fft_real_object; + +fft_real_object fft_real_init(int N, int sgn); + +struct fft_real_set +{ + fft_object cobj; + fft_data twiddle2[1]; +}; + +typedef struct conv_set* conv_object; + +conv_object conv_init(int N, int L); + +struct conv_set +{ + fft_real_object fobj; + fft_real_object iobj; + int ilen1; + int ilen2; + int clen; +}; + +typedef struct wt_set* wt_object; + +wt_object wt_init(wave_object wave, char* method, int siglength, int J); + +struct wt_set +{ + wave_object wave; + conv_object cobj; + char method[10]; + int siglength;// Length of the original signal. + int outlength;// Length of the output DWT vector + int lenlength;// Length of the Output Dimension Vector "length" + int J; // Number of decomposition Levels + int MaxIter;// Maximum Iterations J <= MaxIter + int even;// even = 1 if signal is of even length. even = 0 otherwise + char ext[10];// Type of Extension used - "per" or "sym" + char cmethod[10]; // Convolution Method - "direct" or "FFT" + + int N; // + int cfftset; + int zpad; + int length[102]; + double* output; + double params[0]; +}; + +typedef struct wtree_set* wtree_object; + +wtree_object wtree_init(wave_object wave, int siglength, int J); + +struct wtree_set +{ + wave_object wave; + conv_object cobj; + char method[10]; + int siglength;// Length of the original signal. + int outlength;// Length of the output DWT vector + int lenlength;// Length of the Output Dimension Vector "length" + int J; // Number of decomposition Levels + int MaxIter;// Maximum Iterations J <= MaxIter + int even;// even = 1 if signal is of even length. even = 0 otherwise + char ext[10];// Type of Extension used - "per" or "sym" + + int N; // + int nodes; + int cfftset; + int zpad; + int length[102]; + double* output; + int* nodelength; + int* coeflength; + double params[0]; +}; + +typedef struct wpt_set* wpt_object; + +wpt_object wpt_init(wave_object wave, int siglength, int J); + +struct wpt_set +{ + wave_object wave; + conv_object cobj; + int siglength;// Length of the original signal. + int outlength;// Length of the output DWT vector + int lenlength;// Length of the Output Dimension Vector "length" + int J; // Number of decomposition Levels + int MaxIter;// Maximum Iterations J <= MaxIter + int even;// even = 1 if signal is of even length. even = 0 otherwise + char ext[10];// Type of Extension used - "per" or "sym" + char entropy[20]; + double eparam; + + int N; // + int nodes; + int length[102]; + double* output; + double* costvalues; + double* basisvector; + int* nodeindex; + int* numnodeslevel; + int* coeflength; + double params[0]; +}; + + +typedef struct cwt_set* cwt_object; + +cwt_object cwt_init(char* wave, double param, int siglength, double dt, int J); + +struct cwt_set +{ + char wave[10];// Wavelet - morl/morlet,paul,dog/dgauss + int siglength;// Length of Input Data + int J;// Total Number of Scales + double s0;// Smallest scale. It depends on the sampling rate. s0 <= 2 * dt for most wavelets + double dt;// Sampling Rate + double dj;// Separation between scales. eg., scale = s0 * 2 ^ ( [0:N-1] *dj ) or scale = s0 *[0:N-1] * dj + char type[10];// Scale Type - Power or Linear + int pow;// Base of Power in case type = pow. Typical value is pow = 2 + int sflag; + int pflag; + int npad; + int mother; + double m;// Wavelet parameter param + double smean;// Input Signal mean + + cplx_data* output; + double* scale; + double* period; + double* coi; + double params[0]; +}; + +void dwt(wt_object wt, double* inp); +void idwt(wt_object wt, double* dwtop); +void wtree(wtree_object wt, double* inp); +void dwpt(wpt_object wt, double* inp); +void idwpt(wpt_object wt, double* dwtop); +void swt(wt_object wt, double* inp); +void iswt(wt_object wt, double* swtop); +void modwt(wt_object wt, double* inp); +void imodwt(wt_object wt, double* dwtop); +void setDWTExtension(wt_object wt, char* extension); +void setWTREEExtension(wtree_object wt, char* extension); +void setDWPTExtension(wpt_object wt, char* extension); +void setDWPTEntropy(wpt_object wt, char* entropy, double eparam); +void setWTConv(wt_object wt, char* cmethod); +int getWTREENodelength(wtree_object wt, int X); +void getWTREECoeffs(wtree_object wt, int X, int Y, double* coeffs, int N); +int getDWPTNodelength(wpt_object wt, int X); +void getDWPTCoeffs(wpt_object wt, int X, int Y, double* coeffs, int N); +int setCWTScales(cwt_object wt, double s0, double dj, char* type, int power); +void setCWTScaleVector(cwt_object wt, double* scale, int J, double s0, double dj); +void setCWTPadding(cwt_object wt, int pad); +int cwt(cwt_object wt, double* inp); +void icwt(cwt_object wt, double* cwtop); +int getCWTScaleLength(int N); +void wave_summary(wave_object obj); +void wt_summary(wt_object wt); +void wtree_summary(wtree_object wt); +void wpt_summary(wpt_object wt); +void cwt_summary(cwt_object wt); +void wave_free(wave_object object); +void wt_free(wt_object object); +void wtree_free(wtree_object object); +void wpt_free(wpt_object object); +void cwt_free(cwt_object object); + + +#ifdef __cplusplus +} +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/conv.c b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/conv.c new file mode 100644 index 0000000..5dcded5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/conv.c @@ -0,0 +1,166 @@ +/* + * conv.c + * + * Created on: May 1, 2013 + * Author: Rafat Hussain + */ + +#include "conv.h" + +int factorf(int M) +{ + int N = M; + while (N % 7 == 0) { N = N / 7; } + while (N % 3 == 0) { N = N / 3; } + while (N % 5 == 0) { N = N / 5; } + while (N % 2 == 0) { N = N / 2; } + + return N; +} + + +int findnext(int M) +{ + int N = M; + + while (factorf(N) != 1) { ++N; } + + return N; +} + +int findnexte(int M) +{ + int N = M; + + while (factorf(N) != 1 || N % 2 != 0) { ++N; } + + return N; +} + + +conv_object conv_init(int N, int L) +{ + const int conv_len = N + L - 1; + const conv_object obj = (conv_object)malloc(sizeof(struct conv_set)); + + //obj->clen = npow2(conv_len); + //obj->clen = conv_len; + obj->clen = findnexte(conv_len); + obj->ilen1 = N; + obj->ilen2 = L; + + obj->fobj = fft_real_init(obj->clen, 1); + obj->iobj = fft_real_init(obj->clen, -1); + + return obj; +} + +void conv_directx(fft_type* inp1, int N, fft_type* inp2, int L,fft_type* oup) +{ + const int M = N + L - 1; + + for (int k = 0; k < M; ++k) + { + oup[k] = 0.0; + for (int n = 0; n < N; ++n) { if ((k - n) >= 0 && (k - n) < L) { oup[k] += inp1[n] * inp2[k - n]; } } + } +} + +void conv_direct(fft_type* inp1, int N, fft_type* inp2, int L,fft_type* oup) +{ + int k, m; + fft_type t1, tmin; + + const int M = N + L - 1; + int i = 0; + + if (N >= L) + { + for (k = 0; k < L; ++k) + { + oup[k] = 0.0; + for (m = 0; m <= k; ++m) { oup[k] += inp1[m] * inp2[k - m]; } + } + + for (k = L; k < M; ++k) + { + oup[k] = 0.0; + i++; + t1 = L + i; + tmin = MIN(t1, N); + for (m = i; m < tmin; ++m) { oup[k] += inp1[m] * inp2[k - m]; } + } + } + else + { + for (k = 0; k < N; ++k) + { + oup[k] = 0.0; + for (m = 0; m <= k; ++m) { oup[k] += inp2[m] * inp1[k - m]; } + } + + for (k = N; k < M; ++k) + { + oup[k] = 0.0; + i++; + t1 = N + i; + tmin = MIN(t1, L); + for (m = i; m < tmin; ++m) { oup[k] += inp2[m] * inp1[k - m]; } + } + } +} + + +void conv_fft(const conv_object obj,fft_type* inp1,fft_type* inp2,fft_type* oup) +{ + int i; + + const int N = obj->clen; + const int L1 = obj->ilen1; + const int L2 = obj->ilen2; + const int ls = L1 + L2 - 1; + + fft_type* a = (fft_type*)malloc(sizeof(fft_data) * N); + fft_type* b = (fft_type*)malloc(sizeof(fft_data) * N); + fft_data* c = (fft_data*)malloc(sizeof(fft_data) * N); + fft_data* ao = (fft_data*)malloc(sizeof(fft_data) * N); + fft_data* bo = (fft_data*)malloc(sizeof(fft_data) * N); + fft_type* co = (fft_type*)malloc(sizeof(fft_data) * N); + + for (i = 0; i < N; ++i) + { + if (i < L1) { a[i] = inp1[i]; } + else { a[i] = 0.0; } + + if (i < L2) { b[i] = inp2[i]; } + else { b[i] = 0.0; } + } + + fft_r2c_exec(obj->fobj, a, ao); + fft_r2c_exec(obj->fobj, b, bo); + + for (i = 0; i < N; ++i) + { + c[i].re = ao[i].re * bo[i].re - ao[i].im * bo[i].im; + c[i].im = ao[i].im * bo[i].re + ao[i].re * bo[i].im; + } + + fft_c2r_exec(obj->iobj, c, co); + + for (i = 0; i < ls; ++i) { oup[i] = co[i] / N; } + + free(a); + free(b); + free(c); + free(ao); + free(bo); + free(co); +} + + +void free_conv(conv_object object) +{ + free_real_fft(object->fobj); + free_real_fft(object->iobj); + free(object); +} diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/conv.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/conv.h new file mode 100644 index 0000000..8a96053 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/conv.h @@ -0,0 +1,46 @@ +/* + * conv.h + * + * Created on: May 1, 2013 + * Author: Rafat Hussain + */ + +#pragma once + +#include "real.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define MIN(a,b) (((a)<(b))?(a):(b)) +#define MAX(a,b) (((a)>(b))?(a):(b)) + +typedef struct conv_set* conv_object; + +conv_object conv_init(int N, int L); + +struct conv_set +{ + fft_real_object fobj; + fft_real_object iobj; + int ilen1; + int ilen2; + int clen; +}; + +int factorf(int M); +int findnext(int M); +int findnexte(int M); +void conv_direct(fft_type* inp1, int N, fft_type* inp2, int L, fft_type* oup); +void conv_directx(fft_type* inp1, int N, fft_type* inp2, int L, fft_type* oup); +//void conv_fft(const conv_object obj,fft_type *inp1,fft_type *inp2,fft_type *oup); +//void conv_fft(const conv_object obj,fft_type *inp1,fft_type *inp2,fft_type *oup); +void conv_fft(const conv_object obj, fft_type* inp1, fft_type* inp2, fft_type* oup); +//void free_conv(conv_object object); +void free_conv(conv_object object); + + +#ifdef __cplusplus +} +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/cwt.c b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/cwt.c new file mode 100644 index 0000000..7bc6973 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/cwt.c @@ -0,0 +1,366 @@ +/* + Copyright (c) 2015, Rafat Hussain +*/ +/* +This code is a C translation ( with some modifications) of Wavelet Software provided by +C. Torrence and G. Compo, and is available at URL: http://atoc.colorado.edu/research/wavelets/''. +*/ + +#include "cwt.h" + +/* +static double factorial3(int N) +{ + double factorial = 1; + for (int i = 1; i <= N; ++i) { factorial *= i; } + return factorial; +} +*/ +double factorial(int N) +{ + if (N > 40) + { + printf("This program is only valid for N <= 40 \n"); + return -1.0; + } + double fact[41] = { + 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600, 6227020800, 87178291200, 1307674368000, + 20922789888000, 355687428096000, 6402373705728000, 121645100408832000.0, 2432902008176640000.0, 51090942171709440000.0, 1124000727777607680000.0, + 25852016738884976640000.0, 620448401733239439360000.0, 15511210043330985984000000.0, 403291461126605635584000000.0, 10888869450418352160768000000.0, + 304888344611713860501504000000.0, 8841761993739701954543616000000.0, 265252859812191058636308480000000.0, 8222838654177922817725562880000000.0, + 263130836933693530167218012160000000.0, 8683317618811886495518194401280000000.0, 295232799039604140847618609643520000000.0, + 10333147966386144929666651337523200000000.0, + 371993326789901217467999448150835200000000.0, 13763753091226345046315979581580902400000000.0, 523022617466601111760007224100074291200000000.0, + 20397882081197443358640281739902897356800000000.0, 815915283247897734345611269596115894272000000000.0 + }; + + return fact[N]; +} + +static void wave_function(int nk, double dt, int mother, double param, double scale1, double* kwave, double pi, double* period1, double* coi1, + fft_data* daughter) +{ + double norm, expnt, fourier_factor; + int k, m; + double temp; + int sign, re; + + + if (mother == 0) + { + //MORLET + if (param < 0.0) { param = 6.0; } + norm = sqrt(2.0 * pi * scale1 / dt) * pow(pi, -0.25); + + for (k = 1; k <= nk / 2 + 1; ++k) + { + temp = (scale1 * kwave[k - 1] - param); + expnt = -0.5 * temp * temp; + daughter[k - 1].re = norm * exp(expnt); + daughter[k - 1].im = 0.0; + } + for (k = nk / 2 + 2; k <= nk; ++k) { daughter[k - 1].re = daughter[k - 1].im = 0.0; } + fourier_factor = (4.0 * pi) / (param + sqrt(2.0 + param * param)); + *period1 = scale1 * fourier_factor; + *coi1 = fourier_factor / sqrt(2.0); + } + else if (mother == 1) + { + // PAUL + if (param < 0.0) { param = 4.0; } + m = (int)param; + norm = sqrt(2.0 * pi * scale1 / dt) * (pow(2.0, (double)m) / sqrt(m * factorial(2 * m - 1))); + for (k = 1; k <= nk / 2 + 1; ++k) + { + temp = scale1 * kwave[k - 1]; + expnt = - temp; + daughter[k - 1].re = norm * pow(temp, (double)m) * exp(expnt); + daughter[k - 1].im = 0.0; + } + for (k = nk / 2 + 2; k <= nk; ++k) { daughter[k - 1].re = daughter[k - 1].im = 0.0; } + fourier_factor = (4.0 * pi) / (2.0 * m + 1.0); + *period1 = scale1 * fourier_factor; + *coi1 = fourier_factor * sqrt(2.0); + } + else if (mother == 2) + { + if (param < 0.0) { param = 2.0; } + m = (int)param; + + if (m % 2 == 0) { re = 1; } + else { re = 0; } + + if (m % 4 == 0 || m % 4 == 1) { sign = -1; } + else { sign = 1; } + + + norm = sqrt(2.0 * pi * scale1 / dt) * sqrt(1.0 / gamma(m + 0.50)); + norm *= sign; + + if (re == 1) + { + for (k = 1; k <= nk; ++k) + { + temp = scale1 * kwave[k - 1]; + daughter[k - 1].re = norm * pow(temp, (double)m) * exp(-0.50 * pow(temp, 2.0)); + daughter[k - 1].im = 0.0; + } + } + else if (re == 0) + { + for (k = 1; k <= nk; ++k) + { + temp = scale1 * kwave[k - 1]; + daughter[k - 1].re = 0.0; + daughter[k - 1].im = norm * pow(temp, (double)m) * exp(-0.50 * pow(temp, 2.0)); + } + } + fourier_factor = (2.0 * pi) * sqrt(2.0 / (2.0 * m + 1.0)); + *period1 = scale1 * fourier_factor; + *coi1 = fourier_factor / sqrt(2.0); + } +} + +int cwavelet(double* y, int N, double dt, int mother, double param, double s0, double dj, int jtot, int npad, double* wave, double* scale, double* period, + double* coi) +{ + double period1, coi1; + + const double pi = 4.0 * atan(1.0); + + if (npad < N) + { + printf("npad must be >= N \n"); + return 1; + } + + const fft_object obj = fft_init(npad, 1); + const fft_object iobj = fft_init(npad, -1); + + fft_data* ypad = (fft_data*)malloc(sizeof(fft_data) * npad); + fft_data* yfft = (fft_data*)malloc(sizeof(fft_data) * npad); + fft_data* daughter = (fft_data*)malloc(sizeof(fft_data) * npad); + double* kwave = (double*)malloc(sizeof(double) * npad); + + double ymean = 0.0; + + for (int i = 0; i < N; ++i) { ymean += y[i]; } + + ymean /= N; + + for (int i = 0; i < N; ++i) + { + ypad[i].re = y[i] - ymean; + ypad[i].im = 0.0; + } + + for (int i = N; i < npad; ++i) { ypad[i].re = ypad[i].im = 0.0; } + + + // Find FFT of the input y (ypad) + + fft_exec(obj, ypad, yfft); + + for (int i = 0; i < npad; ++i) + { + yfft[i].re /= (double)npad; + yfft[i].im /= (double)npad; + } + + + //Construct the wavenumber array + + const double freq1 = 2.0 * pi / ((double)npad * dt); + kwave[0] = 0.0; + + for (int i = 1; i < npad / 2 + 1; ++i) { kwave[i] = i * freq1; } + + for (int i = npad / 2 + 1; i < npad; ++i) { kwave[i] = -kwave[npad - i]; } + + // Main loop + + for (int j = 1; j <= jtot; ++j) + { + const double scale1 = scale[j - 1];// = s0*pow(2.0, (double)(j - 1)*dj); + wave_function(npad, dt, mother, param, scale1, kwave, pi, &period1, &coi1, daughter); + period[j - 1] = period1; + for (int k = 0; k < npad; ++k) + { + const double tmp1 = daughter[k].re * yfft[k].re - daughter[k].im * yfft[k].im; + const double tmp2 = daughter[k].re * yfft[k].im + daughter[k].im * yfft[k].re; + daughter[k].re = tmp1; + daughter[k].im = tmp2; + } + fft_exec(iobj, daughter, ypad); + const int iter = 2 * (j - 1) * N; + for (int i = 0; i < N; ++i) + { + wave[iter + 2 * i] = ypad[i].re; + wave[iter + 2 * i + 1] = ypad[i].im; + } + } + + + for (int i = 1; i <= (N + 1) / 2; ++i) + { + coi[i - 1] = coi1 * dt * ((double)i - 1.0); + coi[N - i] = coi[i - 1]; + } + + + free(kwave); + free(ypad); + free(yfft); + free(daughter); + + free_fft(obj); + free_fft(iobj); + + return 0; +} + +void psi0(int mother, double param, double* val, int* real) +{ + int sign; + + const int m = (int)param; + const double pi = 4.0 * atan(1.0); + + if (mother == 0) + { + // Morlet + *val = 1.0 / sqrt(sqrt(pi)); + *real = 1; + } + else if (mother == 1) + { + //Paul + if (m % 2 == 0) { *real = 1; } + else { *real = 0; } + + if (m % 4 == 0 || m % 4 == 1) { sign = 1; } + else { sign = -1; } + *val = sign * pow(2.0, (double)m) * factorial(m) / (sqrt(pi * factorial(2 * m))); + } + else if (mother == 2) + { + // D.O.G + *real = 1; + + if (m % 2 == 0) + { + if (m % 4 == 0) { sign = -1; } + else { sign = 1; } + const double coeff = sign * pow(2.0, (double)m / 2) / gamma(0.5); + *val = coeff * gamma(((double)m + 1.0) / 2.0) / sqrt(gamma(m + 0.50)); + } + else { *val = 0; } + } +} + +static int maxabs(double* array, int N) +{ + double maxval = 0.0; + int index = -1; + + for (int i = 0; i < N; ++i) + { + const double temp = fabs(array[i]); + if (temp >= maxval) + { + maxval = temp; + index = i; + } + } + + return index; +} + + +double cdelta(int mother, double param, double psi0) +{ + int N = 0; + double s0 = 0; + + double subscale = 8.0; + const double dt = 0.25; + if (mother == 0) + { + N = 16; + s0 = dt / 4; + } + else if (mother == 1) + { + N = 16; + s0 = dt / 4.0; + } + else if (mother == 2) + { + s0 = dt / 8.0; + N = 256; + if (param == 2.0) + { + subscale = 16.0; + s0 = dt / 16.0; + N = 2048; + } + } + + const double dj = 1.0 / subscale; + const int jtot = 16 * (int)subscale; + + double* delta = (double*)malloc(sizeof(double) * N); + double* wave = (double*)malloc(sizeof(double) * 2 * N * jtot); + double* coi = (double*)malloc(sizeof(double) * N); + double* scale = (double*)malloc(sizeof(double) * jtot); + double* period = (double*)malloc(sizeof(double) * jtot); + double* mval = (double*)malloc(sizeof(double) * N); + + + delta[0] = 1; + + for (int i = 1; i < N; ++i) { delta[i] = 0; } + + for (int i = 0; i < jtot; ++i) { scale[i] = s0 * pow(2.0, (double)(i) * dj); } + + cwavelet(delta, N, dt, mother, param, s0, dj, jtot, N, wave, scale, period, coi); + + for (int i = 0; i < N; ++i) { mval[i] = 0; } + + for (int j = 0; j < jtot; ++j) + { + const int iter = 2 * j * N; + const double den = sqrt(scale[j]); + for (int i = 0; i < N; ++i) { mval[i] += wave[iter + 2 * i] / den; } + } + + + const int maxarr = maxabs(mval, N); + const double cdel = sqrt(dt) * dj * mval[maxarr] / psi0; + + free(delta); + free(wave); + + free(scale); + free(period); + free(coi); + free(mval); + + return cdel; +} + +void icwavelet(double* wave, int N, double* scale, int jtot, double dt, double dj, double cdelta, double psi0, double* oup) +{ + const double coeff = sqrt(dt) * dj / (cdelta * psi0); + + for (int i = 0; i < N; ++i) { oup[i] = 0.0; } + + for (int j = 0; j < jtot; ++j) + { + const int iter = 2 * j * N; + const double den = sqrt(scale[j]); + for (int i = 0; i < N; ++i) { oup[i] += wave[iter + 2 * i] / den; } + } + + for (int i = 0; i < N; ++i) { oup[i] *= coeff; } +} diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/cwt.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/cwt.h new file mode 100644 index 0000000..9f82aab --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/cwt.h @@ -0,0 +1,23 @@ +#pragma once + +#include "wavefunc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int cwavelet(double* y, int N, double dt, int mother, double param, double s0, double dj, int jtot, int npad, double* wave, double* scale, double* period, + double* coi); + +void psi0(int mother, double param, double* val, int* real); + +double factorial(int N); + +double cdelta(int mother, double param, double psi0); + +void icwavelet(double* wave, int N, double* scale, int jtot, double dt, double dj, double cdelta, double psi0, double* oup); + + +#ifdef __cplusplus +} +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/cwtmath.c b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/cwtmath.c new file mode 100644 index 0000000..d67cf3b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/cwtmath.c @@ -0,0 +1,299 @@ +#include "cwtmath.h" + +static void nsfft_fd(const fft_object obj, fft_data* inp, fft_data* oup, const double lb, const double ub, double* w) +{ + int i; + + const int N = obj->N; + const int L = N / 2; + //w = (double*)malloc(sizeof(double)*N); + + const int M = divideby(N, 2); + + if (M == 0) + { + printf("The Non-Standard FFT Length must be a power of 2"); + exit(1); + } + + double* temp1 = (double*)malloc(sizeof(double) * L); + double* temp2 = (double*)malloc(sizeof(double) * L); + + const double delta = (ub - lb) / N; + int j = -N; + const double den = 2 * (ub - lb); + + for (i = 0; i < N; ++i) + { + w[i] = (double)j / den; + j += 2; + } + + fft_exec(obj, inp, oup); + + + for (i = 0; i < L; ++i) + { + temp1[i] = oup[i].re; + temp2[i] = oup[i].im; + } + + for (i = 0; i < N - L; ++i) + { + oup[i].re = oup[i + L].re; + oup[i].im = oup[i + L].im; + } + + for (i = 0; i < L; ++i) + { + oup[N - L + i].re = temp1[i]; + oup[N - L + i].im = temp2[i]; + } + + const double plb = PI2 * lb; + + for (i = 0; i < N; ++i) + { + const double tempr = oup[i].re; + const double tempi = oup[i].im; + const double theta = w[i] * plb; + + oup[i].re = delta * (tempr * cos(theta) + tempi * sin(theta)); + oup[i].im = delta * (tempi * cos(theta) - tempr * sin(theta)); + } + + + //free(w); + free(temp1); + free(temp2); +} + +static void nsfft_bk(fft_object obj, fft_data* inp, fft_data* oup, double lb, double ub, double* t) +{ + int i; + + const int N = obj->N; + const int L = N / 2; + + const int M = divideby(N, 2); + + if (M == 0) + { + printf("The Non-Standard FFT Length must be a power of 2"); + exit(1); + } + + double* temp1 = (double*)malloc(sizeof(double) * L); + double* temp2 = (double*)malloc(sizeof(double) * L); + double* w = (double*)malloc(sizeof(double) * N); + fft_data* inpt = (fft_data*)malloc(sizeof(fft_data) * N); + + const double delta = (ub - lb) / N; + int j = -N; + const double den = 2 * (ub - lb); + + for (i = 0; i < N; ++i) + { + w[i] = (double)j / den; + j += 2; + } + + const double plb = PI2 * lb; + + for (i = 0; i < N; ++i) + { + const double theta = w[i] * plb; + + inpt[i].re = (inp[i].re * cos(theta) - inp[i].im * sin(theta)) / delta; + inpt[i].im = (inp[i].im * cos(theta) + inp[i].re * sin(theta)) / delta; + } + + for (i = 0; i < L; ++i) + { + temp1[i] = inpt[i].re; + temp2[i] = inpt[i].im; + } + + for (i = 0; i < N - L; ++i) + { + inpt[i].re = inpt[i + L].re; + inpt[i].im = inpt[i + L].im; + } + + for (i = 0; i < L; ++i) + { + inpt[N - L + i].re = temp1[i]; + inpt[N - L + i].im = temp2[i]; + } + + fft_exec(obj, inpt, oup); + + for (i = 0; i < N; ++i) { t[i] = lb + i * delta; } + + free(w); + free(temp1); + free(temp2); + free(inpt); +} + +void nsfft_exec(fft_object obj, fft_data* inp, fft_data* oup, double lb, double ub, double* w) +{ + if (obj->sgn == 1) { nsfft_fd(obj, inp, oup, lb, ub, w); } + else if (obj->sgn == -1) { nsfft_bk(obj, inp, oup, lb, ub, w); } +} + +static double fix(double x) +{ + // Rounds to the integer nearest to zero + if (x >= 0.) { return floor(x); } + return ceil(x); +} + +int nint(double N) +{ + //const int i = (int)(N + 0.49999); + //return i; + return (int)(N + 0.49999); +} + +double gamma(double x) +{ + /* + * This C program code is based on W J Cody's fortran code. + * http://www.netlib.org/specfun/gamma + * + * References: + "An Overview of Software Development for Special Functions", + W. J. Cody, Lecture Notes in Mathematics, 506, + Numerical Analysis Dundee, 1975, G. A. Watson (ed.), + Springer Verlag, Berlin, 1976. + + Computer Approximations, Hart, Et. Al., Wiley and sons, New York, 1968. + */ + + // numerator and denominator coefficients for 1 <= x <= 2 + + double oup, yi, z; + int i; + + const double spi = 0.9189385332046727417803297; + const double pi = 3.1415926535897932384626434; + const double xmax = 171.624e+0; + const double xinf = 1.79e308; + const double eps = 2.22e-16; + const double xninf = 1.79e-308; + + double num[8] = { + -1.71618513886549492533811e+0, + 2.47656508055759199108314e+1, + -3.79804256470945635097577e+2, + 6.29331155312818442661052e+2, + 8.66966202790413211295064e+2, + -3.14512729688483675254357e+4, + -3.61444134186911729807069e+4, + 6.64561438202405440627855e+4 + }; + + double den[8] = { + -3.08402300119738975254353e+1, + 3.15350626979604161529144e+2, + -1.01515636749021914166146e+3, + -3.10777167157231109440444e+3, + 2.25381184209801510330112e+4, + 4.75584627752788110767815e+3, + -1.34659959864969306392456e+5, + -1.15132259675553483497211e+5 + }; + + // Coefficients for Hart's Minimax approximation x >= 12 + + + double c[7] = { + -1.910444077728e-03, + 8.4171387781295e-04, + -5.952379913043012e-04, + 7.93650793500350248e-04, + -2.777777777777681622553e-03, + 8.333333333333333331554247e-02, + 5.7083835261e-03 + }; + + double y = x; + int swi = 0; + double fact = 1.0; + int n = 0; + + + if (y < 0.) + { + // Negative x + y = -x; + yi = fix(y); + oup = y - yi; + + if (oup != 0.0) + { + if (yi != fix(yi * .5) * 2.) { swi = 1; } + fact = -pi / sin(pi * oup); + y += 1.; + } + else { return xinf; } + } + + if (y < eps) + { + if (y >= xninf) { oup = 1.0 / y; } + else { return xinf; } + } + else if (y < 12.) + { + yi = y; + if (y < 1.) + { + z = y; + y += 1.; + } + else + { + n = (int)y - 1; + y -= (double)n; + z = y - 1.0; + } + double nsum = 0.; + double dsum = 1.; + for (i = 0; i < 8; ++i) + { + nsum = (nsum + num[i]) * z; + dsum = dsum * z + den[i]; + } + oup = nsum / dsum + 1.; + + if (yi < y) { oup /= yi; } + else if (yi > y) + { + for (i = 0; i < n; ++i) + { + oup *= y; + y += 1.; + } + } + } + else + { + if (y <= xmax) + { + const double y2 = y * y; + double sum = c[6]; + for (i = 0; i < 6; ++i) { sum = sum / y2 + c[i]; } + sum = sum / y - y + spi; + sum += (y - .5) * log(y); + oup = exp(sum); + } + else { return (xinf); } + } + + if (swi) { oup = -oup; } + if (fact != 1.) { oup = fact / oup; } + + return oup; +} diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/cwtmath.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/cwtmath.h new file mode 100644 index 0000000..7f8086b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/cwtmath.h @@ -0,0 +1,19 @@ +#pragma once + +#include "wtmath.h" +#include "hsfft.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void nsfft_exec(fft_object obj, fft_data* inp, fft_data* oup, double lb, double ub, + double* w);// lb -lower bound, ub - upper bound, w - time or frequency grid (Size N) + +double gamma(double x); + +int nint(double N); + +#ifdef __cplusplus +} +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/hsfft.c b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/hsfft.c new file mode 100644 index 0000000..6059056 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/hsfft.c @@ -0,0 +1,1845 @@ +/* + * hsfft.c + * + * Created on: Apr 14, 2013 + * Author: Rafat Hussain + */ + + +#include "hsfft.h" + +fft_object fft_init(int N, int sgn) +{ + // Change N/2 to N-1 for longvector case + int twi_len; + const int out = dividebyN(N); + + fft_object obj; + if (out == 1) + { + obj = (fft_object)malloc(sizeof(struct fft_set) + sizeof(fft_data) * (N - 1)); + obj->lf = factors(N, obj->factors); + longvectorN(obj->twiddle, N, obj->factors, obj->lf); + twi_len = N; + obj->lt = 0; + } + else + { + int M; + const int K = (int)pow(2.0, ceil(log10(N) / log10(2.0))); + + if (K < 2 * N - 2) { M = K * 2; } + else { M = K; } + obj = (fft_object)malloc(sizeof(struct fft_set) + sizeof(fft_data) * (M - 1)); + obj->lf = factors(M, obj->factors); + longvectorN(obj->twiddle, M, obj->factors, obj->lf); + obj->lt = 1; + twi_len = M; + } + + + obj->N = N; + obj->sgn = sgn; + + if (sgn == -1) { for (int ct = 0; ct < twi_len; ++ct) { (obj->twiddle + ct)->im = - (obj->twiddle + ct)->im; } } + + return obj; +} + + +static void mixed_radix_dit_rec(fft_data* op, fft_data* ip, const fft_object obj, int sgn, int N, int l, int inc) +{ + int radix, m, ll; + if (N > 1) + { + radix = obj->factors[inc]; + //printf("%d \n",radix); + } + + if (N == 1) + { + op[0].re = ip[0].re; + op[0].im = ip[0].im; + } + else if (N == 2) + { + fft_type tau1r, tau1i; + op[0].re = ip[0].re; + op[0].im = ip[0].im; + + op[1].re = ip[l].re; + op[1].im = ip[l].im; + + tau1r = op[0].re; + tau1i = op[0].im; + + + op[0].re = tau1r + op[1].re; + op[0].im = tau1i + op[1].im; + + op[1].re = tau1r - op[1].re; + op[1].im = tau1i - op[1].im; + } + else if (N == 3) + { + fft_type tau0r, tau0i, tau1r, tau1i, tau2r, tau2i; + op[0].re = ip[0].re; + op[0].im = ip[0].im; + + op[1].re = ip[l].re; + op[1].im = ip[l].im; + + op[2].re = ip[2 * l].re; + op[2].im = ip[2 * l].im; + + tau0r = op[1].re + op[2].re; + tau0i = op[1].im + op[2].im; + + tau1r = sgn * 0.86602540378 * (op[1].re - op[2].re); + tau1i = sgn * 0.86602540378 * (op[1].im - op[2].im); + + tau2r = op[0].re - tau0r * 0.5000000000; + tau2i = op[0].im - tau0i * 0.5000000000; + + op[0].re = tau0r + op[0].re; + op[0].im = tau0i + op[0].im; + + op[1].re = tau2r + tau1i; + op[1].im = tau2i - tau1r; + + op[2].re = tau2r - tau1i; + op[2].im = tau2i + tau1r; + } + else if (N == 4) + { + fft_type tau0r, tau0i, tau1r, tau1i, tau2r, tau2i, tau3r, tau3i; + op[0].re = ip[0].re; + op[0].im = ip[0].im; + + op[1].re = ip[l].re; + op[1].im = ip[l].im; + + op[2].re = ip[2 * l].re; + op[2].im = ip[2 * l].im; + + op[3].re = ip[3 * l].re; + op[3].im = ip[3 * l].im; + + tau0r = op[0].re + op[2].re; + tau0i = op[0].im + op[2].im; + + tau1r = op[0].re - op[2].re; + tau1i = op[0].im - op[2].im; + + tau2r = op[1].re + op[3].re; + tau2i = op[1].im + op[3].im; + + tau3r = sgn * (op[1].re - op[3].re); + tau3i = sgn * (op[1].im - op[3].im); + + op[0].re = tau0r + tau2r; + op[0].im = tau0i + tau2i; + + op[1].re = tau1r + tau3i; + op[1].im = tau1i - tau3r; + + op[2].re = tau0r - tau2r; + op[2].im = tau0i - tau2i; + + op[3].re = tau1r - tau3i; + op[3].im = tau1i + tau3r; + } + else if (N == 5) + { + fft_type tau0r, tau0i, tau1r, tau1i, tau2r, tau2i, tau3r, tau3i, tau4r, tau4i, tau5r, tau5i, tau6r, tau6i; + fft_type c1, c2, s1, s2; + op[0].re = ip[0].re; + op[0].im = ip[0].im; + + op[1].re = ip[l].re; + op[1].im = ip[l].im; + + op[2].re = ip[2 * l].re; + op[2].im = ip[2 * l].im; + + op[3].re = ip[3 * l].re; + op[3].im = ip[3 * l].im; + + op[4].re = ip[4 * l].re; + op[4].im = ip[4 * l].im; + + c1 = 0.30901699437; + c2 = -0.80901699437; + s1 = 0.95105651629; + s2 = 0.58778525229; + + tau0r = op[1].re + op[4].re; + tau2r = op[1].re - op[4].re; + tau0i = op[1].im + op[4].im; + tau2i = op[1].im - op[4].im; + + tau1r = op[2].re + op[3].re; + tau3r = op[2].re - op[3].re; + tau1i = op[2].im + op[3].im; + tau3i = op[2].im - op[3].im; + + + tau4r = c1 * tau0r + c2 * tau1r; + tau4i = c1 * tau0i + c2 * tau1i; + + //tau5r = sgn * ( s1 * tau2r + s2 * tau3r); + //tau5i = sgn * ( s1 * tau2i + s2 * tau3i); + + if (sgn == 1) + { + tau5r = s1 * tau2r + s2 * tau3r; + tau5i = s1 * tau2i + s2 * tau3i; + } + else + { + tau5r = -s1 * tau2r - s2 * tau3r; + tau5i = -s1 * tau2i - s2 * tau3i; + } + + tau6r = op[0].re + tau4r; + tau6i = op[0].im + tau4i; + + op[1].re = tau6r + tau5i; + op[1].im = tau6i - tau5r; + + op[4].re = tau6r - tau5i; + op[4].im = tau6i + tau5r; + + tau4r = c2 * tau0r + c1 * tau1r; + tau4i = c2 * tau0i + c1 * tau1i; + + //tau5r = sgn * ( s2 * tau2r - s1 * tau3r); + //tau5i = sgn * ( s2 * tau2i - s1 * tau3i); + + if (sgn == 1) + { + tau5r = s2 * tau2r - s1 * tau3r; + tau5i = s2 * tau2i - s1 * tau3i; + } + else + { + tau5r = -s2 * tau2r + s1 * tau3r; + tau5i = -s2 * tau2i + s1 * tau3i; + } + + tau6r = op[0].re + tau4r; + tau6i = op[0].im + tau4i; + + op[2].re = tau6r + tau5i; + op[2].im = tau6i - tau5r; + + op[3].re = tau6r - tau5i; + op[3].im = tau6i + tau5r; + + + op[0].re += tau0r + tau1r; + op[0].im += tau0i + tau1i; + } + else if (N == 7) + { + fft_type tau0r, tau0i, tau1r, tau1i, tau2r, tau2i, tau3r, tau3i, tau4r, tau4i, tau5r, tau5i, tau6r, tau6i, tau7r, tau7i; + fft_type c1, c2, c3, s1, s2, s3; + op[0].re = ip[0].re; + op[0].im = ip[0].im; + + op[1].re = ip[l].re; + op[1].im = ip[l].im; + + op[2].re = ip[2 * l].re; + op[2].im = ip[2 * l].im; + + op[3].re = ip[3 * l].re; + op[3].im = ip[3 * l].im; + + op[4].re = ip[4 * l].re; + op[4].im = ip[4 * l].im; + + op[5].re = ip[5 * l].re; + op[5].im = ip[5 * l].im; + + op[6].re = ip[6 * l].re; + op[6].im = ip[6 * l].im; + + c1 = 0.62348980185; + c2 = -0.22252093395; + c3 = -0.9009688679; + s1 = 0.78183148246; + s2 = 0.97492791218; + s3 = 0.43388373911; + + tau0r = op[1].re + op[6].re; + tau3r = op[1].re - op[6].re; + + tau0i = op[1].im + op[6].im; + tau3i = op[1].im - op[6].im; + + tau1r = op[2].re + op[5].re; + tau4r = op[2].re - op[5].re; + + tau1i = op[2].im + op[5].im; + tau4i = op[2].im - op[5].im; + + tau2r = op[3].re + op[4].re; + tau5r = op[3].re - op[4].re; + + tau2i = op[3].im + op[4].im; + tau5i = op[3].im - op[4].im; + + + tau6r = op[0].re + c1 * tau0r + c2 * tau1r + c3 * tau2r; + tau6i = op[0].im + c1 * tau0i + c2 * tau1i + c3 * tau2i; + + //tau7r = sgn * ( -s1 * tau3r - s2 * tau4r - s3 * tau5r); + //tau7i = sgn * ( -s1 * tau3i - s2 * tau4i - s3 * tau5i); + + if (sgn == 1) + { + tau7r = -s1 * tau3r - s2 * tau4r - s3 * tau5r; + tau7i = -s1 * tau3i - s2 * tau4i - s3 * tau5i; + } + else + { + tau7r = s1 * tau3r + s2 * tau4r + s3 * tau5r; + tau7i = s1 * tau3i + s2 * tau4i + s3 * tau5i; + } + + + op[1].re = tau6r - tau7i; + op[6].re = tau6r + tau7i; + + op[1].im = tau6i + tau7r; + op[6].im = tau6i - tau7r; + + tau6r = op[0].re + c2 * tau0r + c3 * tau1r + c1 * tau2r; + tau6i = op[0].im + c2 * tau0i + c3 * tau1i + c1 * tau2i; + + //tau7r = sgn * ( -s2 * tau3r + s3 * tau4r + s1 * tau5r); + //tau7i = sgn * ( -s2 * tau3i + s3 * tau4i + s1 * tau5i); + + if (sgn == 1) + { + tau7r = -s2 * tau3r + s3 * tau4r + s1 * tau5r; + tau7i = -s2 * tau3i + s3 * tau4i + s1 * tau5i; + } + else + { + tau7r = s2 * tau3r - s3 * tau4r - s1 * tau5r; + tau7i = s2 * tau3i - s3 * tau4i - s1 * tau5i; + } + + + op[2].re = tau6r - tau7i; + op[5].re = tau6r + tau7i; + op[2].im = tau6i + tau7r; + op[5].im = tau6i - tau7r; + + tau6r = op[0].re + c3 * tau0r + c1 * tau1r + c2 * tau2r; + tau6i = op[0].im + c3 * tau0i + c1 * tau1i + c2 * tau2i; + + //tau7r = sgn * ( -s3 * tau3r + s1 * tau4r - s2 * tau5r); + //tau7i = sgn * ( -s3 * tau3i + s1 * tau4i - s2 * tau5i); + + if (sgn == 1) + { + tau7r = -s3 * tau3r + s1 * tau4r - s2 * tau5r; + tau7i = -s3 * tau3i + s1 * tau4i - s2 * tau5i; + } + else + { + tau7r = s3 * tau3r - s1 * tau4r + s2 * tau5r; + tau7i = s3 * tau3i - s1 * tau4i + s2 * tau5i; + } + + + op[3].re = tau6r - tau7i; + op[4].re = tau6r + tau7i; + op[3].im = tau6i + tau7r; + op[4].im = tau6i - tau7r; + + op[0].re += tau0r + tau1r + tau2r; + op[0].im += tau0i + tau1i + tau2i; + } + else if (N == 8) + { + fft_type tau0r, tau0i, tau1r, tau1i, tau2r, tau2i, tau3r, tau3i, tau4r, tau4i, tau5r, tau5i, tau6r, tau6i, tau7r, tau7i, tau8r, tau8i, tau9r, tau9i; + fft_type c1, s1, temp1r, temp1i, temp2r, temp2i; + op[0].re = ip[0].re; + op[0].im = ip[0].im; + + op[1].re = ip[l].re; + op[1].im = ip[l].im; + + op[2].re = ip[2 * l].re; + op[2].im = ip[2 * l].im; + + op[3].re = ip[3 * l].re; + op[3].im = ip[3 * l].im; + + op[4].re = ip[4 * l].re; + op[4].im = ip[4 * l].im; + + op[5].re = ip[5 * l].re; + op[5].im = ip[5 * l].im; + + op[6].re = ip[6 * l].re; + op[6].im = ip[6 * l].im; + + op[7].re = ip[7 * l].re; + op[7].im = ip[7 * l].im; + + c1 = 0.70710678118654752440084436210485; + s1 = 0.70710678118654752440084436210485; + + tau0r = op[0].re + op[4].re; + tau4r = op[0].re - op[4].re; + + tau0i = op[0].im + op[4].im; + tau4i = op[0].im - op[4].im; + + tau1r = op[1].re + op[7].re; + tau5r = op[1].re - op[7].re; + + tau1i = op[1].im + op[7].im; + tau5i = op[1].im - op[7].im; + + tau2r = op[3].re + op[5].re; + tau6r = op[3].re - op[5].re; + + tau2i = op[3].im + op[5].im; + tau6i = op[3].im - op[5].im; + + tau3r = op[2].re + op[6].re; + tau7r = op[2].re - op[6].re; + + tau3i = op[2].im + op[6].im; + tau7i = op[2].im - op[6].im; + + op[0].re = tau0r + tau1r + tau2r + tau3r; + op[0].im = tau0i + tau1i + tau2i + tau3i; + + op[4].re = tau0r - tau1r - tau2r + tau3r; + op[4].im = tau0i - tau1i - tau2i + tau3i; + + temp1r = tau1r - tau2r; + temp1i = tau1i - tau2i; + + temp2r = tau5r + tau6r; + temp2i = tau5i + tau6i; + + tau8r = tau4r + c1 * temp1r; + tau8i = tau4i + c1 * temp1i; + + //tau9r = sgn * ( -s1 * temp2r - tau7r); + //tau9i = sgn * ( -s1 * temp2i - tau7i); + + if (sgn == 1) + { + tau9r = -s1 * temp2r - tau7r; + tau9i = -s1 * temp2i - tau7i; + } + else + { + tau9r = s1 * temp2r + tau7r; + tau9i = s1 * temp2i + tau7i; + } + + + op[1].re = tau8r - tau9i; + op[1].im = tau8i + tau9r; + + op[7].re = tau8r + tau9i; + op[7].im = tau8i - tau9r; + + tau8r = tau0r - tau3r; + tau8i = tau0i - tau3i; + + //tau9r = sgn * ( -tau5r + tau6r); + //tau9i = sgn * ( -tau5i + tau6i); + + if (sgn == 1) + { + tau9r = -tau5r + tau6r; + tau9i = -tau5i + tau6i; + } + else + { + tau9r = tau5r - tau6r; + tau9i = tau5i - tau6i; + } + + + op[2].re = tau8r - tau9i; + op[2].im = tau8i + tau9r; + + op[6].re = tau8r + tau9i; + op[6].im = tau8i - tau9r; + + tau8r = tau4r - c1 * temp1r; + tau8i = tau4i - c1 * temp1i; + + //tau9r = sgn * ( -s1 * temp2r + tau7r); + //tau9i = sgn * ( -s1 * temp2i + tau7i); + + if (sgn == 1) + { + tau9r = -s1 * temp2r + tau7r; + tau9i = -s1 * temp2i + tau7i; + } + else + { + tau9r = s1 * temp2r - tau7r; + tau9i = s1 * temp2i - tau7i; + } + + + op[3].re = tau8r - tau9i; + op[3].im = tau8i + tau9r; + + op[5].re = tau8r + tau9i; + op[5].im = tau8i - tau9r; + } + else if (radix == 2) + { + int k, tkm1, ind; + fft_type wlr, wli; + fft_type tau1r, tau1i, tau2r, tau2i; + m = N / 2; + ll = 2 * l; + mixed_radix_dit_rec(op, ip, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + m, ip + l, obj, sgn, m, ll, inc + 1); + + for (k = 0; k < m; ++k) + { + ind = m - 1 + k; + wlr = (obj->twiddle + ind)->re; + wli = (obj->twiddle + ind)->im; + + tkm1 = k + m; + + tau1r = op[k].re; + tau1i = op[k].im; + + tau2r = op[tkm1].re * wlr - op[tkm1].im * wli; + tau2i = op[tkm1].im * wlr + op[tkm1].re * wli; + + op[k].re = tau1r + tau2r; + op[k].im = tau1i + tau2i; + + op[tkm1].re = tau1r - tau2r; + op[tkm1].im = tau1i - tau2i; + } + } + else if (radix == 3) + { + int k, tkm1, tkm2, ind; + fft_type wlr, wli, wl2r, wl2i; + fft_type tau0r, tau0i, tau1r, tau1i, tau2r, tau2i; + fft_type ar, ai, br, bi, cr, ci; + m = N / 3; + ll = 3 * l; + mixed_radix_dit_rec(op, ip, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + m, ip + l, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + 2 * m, ip + 2 * l, obj, sgn, m, ll, inc + 1); + //printf("%d \n",inc); + //mixed_radix3_dit_rec(op,ip,obj,sgn,ll,m); + + + for (k = 0; k < m; ++k) + { + ind = m - 1 + 2 * k; + wlr = (obj->twiddle + ind)->re; + wli = (obj->twiddle + ind)->im; + ind++; + wl2r = (obj->twiddle + ind)->re; + wl2i = (obj->twiddle + ind)->im; + tkm1 = k + m; + tkm2 = tkm1 + m; + + ar = op[k].re; + ai = op[k].im; + + br = op[tkm1].re * wlr - op[tkm1].im * wli; + bi = op[tkm1].im * wlr + op[tkm1].re * wli; + + cr = op[tkm2].re * wl2r - op[tkm2].im * wl2i; + ci = op[tkm2].im * wl2r + op[tkm2].re * wl2i; + + tau0r = br + cr; + tau0i = bi + ci; + + tau1r = sgn * 0.86602540378 * (br - cr); + tau1i = sgn * 0.86602540378 * (bi - ci); + + tau2r = ar - tau0r * 0.5000000000; + tau2i = ai - tau0i * 0.5000000000; + + + op[k].re = ar + tau0r; + op[k].im = ai + tau0i; + + op[tkm1].re = tau2r + tau1i; + op[tkm1].im = tau2i - tau1r; + + op[tkm2].re = tau2r - tau1i; + op[tkm2].im = tau2i + tau1r; + } + } + else if (radix == 4) + { + int k, tkm1, tkm2, tkm3, ind; + fft_type wlr, wli, wl2r, wl2i, wl3r, wl3i; + fft_type tau0r, tau0i, tau1r, tau1i, tau2r, tau2i, tau3r, tau3i; + fft_type ar, ai, br, bi, cr, ci, dr, di; + m = N / 4; + ll = 4 * l; + mixed_radix_dit_rec(op, ip, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + m, ip + l, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + 2 * m, ip + 2 * l, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + 3 * m, ip + 3 * l, obj, sgn, m, ll, inc + 1); + + //mixed_radix4_dit_rec(op,ip,obj,sgn,ll,m); + + tkm1 = m; + tkm2 = tkm1 + m; + tkm3 = tkm2 + m; + + ar = op[0].re; + ai = op[0].im; + + br = op[tkm1].re; + bi = op[tkm1].im; + + cr = op[tkm2].re; + ci = op[tkm2].im; + + dr = op[tkm3].re; + di = op[tkm3].im; + + tau0r = ar + cr; + tau0i = ai + ci; + + tau1r = ar - cr; + tau1i = ai - ci; + + tau2r = br + dr; + tau2i = bi + di; + + tau3r = sgn * (br - dr); + tau3i = sgn * (bi - di); + + op[0].re = tau0r + tau2r; + op[0].im = tau0i + tau2i; + + op[tkm1].re = tau1r + tau3i; + op[tkm1].im = tau1i - tau3r; + + op[tkm2].re = tau0r - tau2r; + op[tkm2].im = tau0i - tau2i; + + op[tkm3].re = tau1r - tau3i; + op[tkm3].im = tau1i + tau3r; + + + for (k = 1; k < m; ++k) + { + ind = m - 1 + 3 * k; + wlr = (obj->twiddle + ind)->re; + wli = (obj->twiddle + ind)->im; + ind++; + wl2r = (obj->twiddle + ind)->re; + wl2i = (obj->twiddle + ind)->im; + ind++; + wl3r = (obj->twiddle + ind)->re; + wl3i = (obj->twiddle + ind)->im; + + tkm1 = k + m; + tkm2 = tkm1 + m; + tkm3 = tkm2 + m; + + ar = op[k].re; + ai = op[k].im; + + br = op[tkm1].re * wlr - op[tkm1].im * wli; + bi = op[tkm1].im * wlr + op[tkm1].re * wli; + + cr = op[tkm2].re * wl2r - op[tkm2].im * wl2i; + ci = op[tkm2].im * wl2r + op[tkm2].re * wl2i; + + dr = op[tkm3].re * wl3r - op[tkm3].im * wl3i; + di = op[tkm3].im * wl3r + op[tkm3].re * wl3i; + + tau0r = ar + cr; + tau0i = ai + ci; + + tau1r = ar - cr; + tau1i = ai - ci; + + tau2r = br + dr; + tau2i = bi + di; + + tau3r = sgn * (br - dr); + tau3i = sgn * (bi - di); + + op[k].re = tau0r + tau2r; + op[k].im = tau0i + tau2i; + + op[tkm1].re = tau1r + tau3i; + op[tkm1].im = tau1i - tau3r; + + op[tkm2].re = tau0r - tau2r; + op[tkm2].im = tau0i - tau2i; + + op[tkm3].re = tau1r - tau3i; + op[tkm3].im = tau1i + tau3r; + } + } + else if (radix == 5) + { + int k, tkm1, tkm2, tkm3, tkm4, ind; + fft_type wlr, wli, wl2r, wl2i, wl3r, wl3i, wl4r, wl4i; + fft_type tau0r, tau0i, tau1r, tau1i, tau2r, tau2i, tau3r, tau3i; + fft_type ar, ai, br, bi, cr, ci, dr, di, er, ei; + fft_type tau4r, tau4i, tau5r, tau5i, tau6r, tau6i; + fft_type c1, c2, s1, s2; + m = N / 5; + ll = 5 * l; + mixed_radix_dit_rec(op, ip, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + m, ip + l, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + 2 * m, ip + 2 * l, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + 3 * m, ip + 3 * l, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + 4 * m, ip + 4 * l, obj, sgn, m, ll, inc + 1); + //printf("%d \n",inc); + //mixed_radix3_dit_rec(op,ip,obj,sgn,ll,m); + + c1 = 0.30901699437; + c2 = -0.80901699437; + s1 = 0.95105651629; + s2 = 0.58778525229; + + tkm1 = m; + tkm2 = tkm1 + m; + tkm3 = tkm2 + m; + tkm4 = tkm3 + m; + + ar = op[0].re; + ai = op[0].im; + + br = op[tkm1].re; + bi = op[tkm1].im; + + cr = op[tkm2].re; + ci = op[tkm2].im; + + dr = op[tkm3].re; + di = op[tkm3].im; + + er = op[tkm4].re; + ei = op[tkm4].im; + + tau0r = br + er; + tau0i = bi + ei; + + tau1r = cr + dr; + tau1i = ci + di; + + tau2r = br - er; + tau2i = bi - ei; + + tau3r = cr - dr; + tau3i = ci - di; + + op[0].re = ar + tau0r + tau1r; + op[0].im = ai + tau0i + tau1i; + + tau4r = c1 * tau0r + c2 * tau1r; + tau4i = c1 * tau0i + c2 * tau1i; + + tau5r = sgn * (s1 * tau2r + s2 * tau3r); + tau5i = sgn * (s1 * tau2i + s2 * tau3i); + + tau6r = ar + tau4r; + tau6i = ai + tau4i; + + op[tkm1].re = tau6r + tau5i; + op[tkm1].im = tau6i - tau5r; + + op[tkm4].re = tau6r - tau5i; + op[tkm4].im = tau6i + tau5r; + + tau4r = c2 * tau0r + c1 * tau1r; + tau4i = c2 * tau0i + c1 * tau1i; + + tau5r = sgn * (s2 * tau2r - s1 * tau3r); + tau5i = sgn * (s2 * tau2i - s1 * tau3i); + + tau6r = ar + tau4r; + tau6i = ai + tau4i; + + op[tkm2].re = tau6r + tau5i; + op[tkm2].im = tau6i - tau5r; + + op[tkm3].re = tau6r - tau5i; + op[tkm3].im = tau6i + tau5r; + + for (k = 1; k < m; ++k) + { + ind = m - 1 + 4 * k; + wlr = (obj->twiddle + ind)->re; + wli = (obj->twiddle + ind)->im; + ind++; + wl2r = (obj->twiddle + ind)->re; + wl2i = (obj->twiddle + ind)->im; + ind++; + wl3r = (obj->twiddle + ind)->re; + wl3i = (obj->twiddle + ind)->im; + ind++; + wl4r = (obj->twiddle + ind)->re; + wl4i = (obj->twiddle + ind)->im; + + tkm1 = k + m; + tkm2 = tkm1 + m; + tkm3 = tkm2 + m; + tkm4 = tkm3 + m; + + ar = op[k].re; + ai = op[k].im; + + br = op[tkm1].re * wlr - op[tkm1].im * wli; + bi = op[tkm1].im * wlr + op[tkm1].re * wli; + + cr = op[tkm2].re * wl2r - op[tkm2].im * wl2i; + ci = op[tkm2].im * wl2r + op[tkm2].re * wl2i; + + dr = op[tkm3].re * wl3r - op[tkm3].im * wl3i; + di = op[tkm3].im * wl3r + op[tkm3].re * wl3i; + + er = op[tkm4].re * wl4r - op[tkm4].im * wl4i; + ei = op[tkm4].im * wl4r + op[tkm4].re * wl4i; + + tau0r = br + er; + tau0i = bi + ei; + + tau1r = cr + dr; + tau1i = ci + di; + + tau2r = br - er; + tau2i = bi - ei; + + tau3r = cr - dr; + tau3i = ci - di; + + op[k].re = ar + tau0r + tau1r; + op[k].im = ai + tau0i + tau1i; + + tau4r = c1 * tau0r + c2 * tau1r; + tau4i = c1 * tau0i + c2 * tau1i; + + //tau5r = sgn * ( s1 * tau2r + s2 * tau3r); + //tau5i = sgn * ( s1 * tau2i + s2 * tau3i); + + if (sgn == 1) + { + tau5r = s1 * tau2r + s2 * tau3r; + tau5i = s1 * tau2i + s2 * tau3i; + } + else + { + tau5r = -s1 * tau2r - s2 * tau3r; + tau5i = -s1 * tau2i - s2 * tau3i; + } + + tau6r = ar + tau4r; + tau6i = ai + tau4i; + + op[tkm1].re = tau6r + tau5i; + op[tkm1].im = tau6i - tau5r; + + op[tkm4].re = tau6r - tau5i; + op[tkm4].im = tau6i + tau5r; + + tau4r = c2 * tau0r + c1 * tau1r; + tau4i = c2 * tau0i + c1 * tau1i; + + //tau5r = sgn * ( s2 * tau2r - s1 * tau3r); + //tau5i = sgn * ( s2 * tau2i - s1 * tau3i); + + if (sgn == 1) + { + tau5r = s2 * tau2r - s1 * tau3r; + tau5i = s2 * tau2i - s1 * tau3i; + } + else + { + tau5r = -s2 * tau2r + s1 * tau3r; + tau5i = -s2 * tau2i + s1 * tau3i; + } + + tau6r = ar + tau4r; + tau6i = ai + tau4i; + + op[tkm2].re = tau6r + tau5i; + op[tkm2].im = tau6i - tau5r; + + op[tkm3].re = tau6r - tau5i; + op[tkm3].im = tau6i + tau5r; + } + } + else if (radix == 7) + { + int k, tkm1, tkm2, tkm3, tkm4, tkm5, tkm6, ind; + fft_type wlr, wli, wl2r, wl2i, wl3r, wl3i, wl4r, wl4i, wl5r, wl5i, wl6r, wl6i; + fft_type tau0r, tau0i, tau1r, tau1i, tau2r, tau2i, tau3r, tau3i; + fft_type ar, ai, br, bi, cr, ci, dr, di, er, ei, fr, fi, gr, gi; + fft_type tau4r, tau4i, tau5r, tau5i, tau6r, tau6i, tau7r, tau7i; + fft_type c1, c2, c3, s1, s2, s3; + m = N / 7; + ll = 7 * l; + mixed_radix_dit_rec(op, ip, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + m, ip + l, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + 2 * m, ip + 2 * l, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + 3 * m, ip + 3 * l, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + 4 * m, ip + 4 * l, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + 5 * m, ip + 5 * l, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + 6 * m, ip + 6 * l, obj, sgn, m, ll, inc + 1); + //printf("%d \n",inc); + //mixed_radix3_dit_rec(op,ip,obj,sgn,ll,m); + + c1 = 0.62348980185; + c2 = -0.22252093395; + c3 = -0.9009688679; + s1 = 0.78183148246; + s2 = 0.97492791218; + s3 = 0.43388373911; + + tkm1 = m; + tkm2 = tkm1 + m; + tkm3 = tkm2 + m; + tkm4 = tkm3 + m; + tkm5 = tkm4 + m; + tkm6 = tkm5 + m; + + ar = op[0].re; + ai = op[0].im; + + br = op[tkm1].re; + bi = op[tkm1].im; + + cr = op[tkm2].re; + ci = op[tkm2].im; + + dr = op[tkm3].re; + di = op[tkm3].im; + + er = op[tkm4].re; + ei = op[tkm4].im; + + fr = op[tkm5].re; + fi = op[tkm5].im; + + gr = op[tkm6].re; + gi = op[tkm6].im; + + tau0r = br + gr; + tau3r = br - gr; + tau0i = bi + gi; + tau3i = bi - gi; + + tau1r = cr + fr; + tau4r = cr - fr; + tau1i = ci + fi; + tau4i = ci - fi; + + tau2r = dr + er; + tau5r = dr - er; + tau2i = di + ei; + tau5i = di - ei; + + op[0].re = ar + tau0r + tau1r + tau2r; + op[0].im = ai + tau0i + tau1i + tau2i; + + tau6r = ar + c1 * tau0r + c2 * tau1r + c3 * tau2r; + tau6i = ai + c1 * tau0i + c2 * tau1i + c3 * tau2i; + + //tau7r = sgn * ( -s1 * tau3r - s2 * tau4r - s3 * tau5r); + //tau7i = sgn * ( -s1 * tau3i - s2 * tau4i - s3 * tau5i); + + if (sgn == 1) + { + tau7r = -s1 * tau3r - s2 * tau4r - s3 * tau5r; + tau7i = -s1 * tau3i - s2 * tau4i - s3 * tau5i; + } + else + { + tau7r = s1 * tau3r + s2 * tau4r + s3 * tau5r; + tau7i = s1 * tau3i + s2 * tau4i + s3 * tau5i; + } + + + op[tkm1].re = tau6r - tau7i; + op[tkm1].im = tau6i + tau7r; + + op[tkm6].re = tau6r + tau7i; + op[tkm6].im = tau6i - tau7r; + + tau6r = ar + c2 * tau0r + c3 * tau1r + c1 * tau2r; + tau6i = ai + c2 * tau0i + c3 * tau1i + c1 * tau2i; + + //tau7r = sgn * ( -s2 * tau3r + s3 * tau4r + s1 * tau5r); + //tau7i = sgn * ( -s2 * tau3i + s3 * tau4i + s1 * tau5i); + + if (sgn == 1) + { + tau7r = -s2 * tau3r + s3 * tau4r + s1 * tau5r; + tau7i = -s2 * tau3i + s3 * tau4i + s1 * tau5i; + } + else + { + tau7r = s2 * tau3r - s3 * tau4r - s1 * tau5r; + tau7i = s2 * tau3i - s3 * tau4i - s1 * tau5i; + } + + + op[tkm2].re = tau6r - tau7i; + op[tkm2].im = tau6i + tau7r; + + op[tkm5].re = tau6r + tau7i; + op[tkm5].im = tau6i - tau7r; + + tau6r = ar + c3 * tau0r + c1 * tau1r + c2 * tau2r; + tau6i = ai + c3 * tau0i + c1 * tau1i + c2 * tau2i; + + //tau7r = sgn * ( -s3 * tau3r + s1 * tau4r - s2 * tau5r); + //tau7i = sgn * ( -s3 * tau3i + s1 * tau4i - s2 * tau5i); + + if (sgn == 1) + { + tau7r = -s3 * tau3r + s1 * tau4r - s2 * tau5r; + tau7i = -s3 * tau3i + s1 * tau4i - s2 * tau5i; + } + else + { + tau7r = s3 * tau3r - s1 * tau4r + s2 * tau5r; + tau7i = s3 * tau3i - s1 * tau4i + s2 * tau5i; + } + + + op[tkm3].re = tau6r - tau7i; + op[tkm3].im = tau6i + tau7r; + + op[tkm4].re = tau6r + tau7i; + op[tkm4].im = tau6i - tau7r; + + + for (k = 1; k < m; ++k) + { + ind = m - 1 + 6 * k; + wlr = (obj->twiddle + ind)->re; + wli = (obj->twiddle + ind)->im; + ind++; + wl2r = (obj->twiddle + ind)->re; + wl2i = (obj->twiddle + ind)->im; + ind++; + wl3r = (obj->twiddle + ind)->re; + wl3i = (obj->twiddle + ind)->im; + ind++; + wl4r = (obj->twiddle + ind)->re; + wl4i = (obj->twiddle + ind)->im; + ind++; + wl5r = (obj->twiddle + ind)->re; + wl5i = (obj->twiddle + ind)->im; + ind++; + wl6r = (obj->twiddle + ind)->re; + wl6i = (obj->twiddle + ind)->im; + + tkm1 = k + m; + tkm2 = tkm1 + m; + tkm3 = tkm2 + m; + tkm4 = tkm3 + m; + tkm5 = tkm4 + m; + tkm6 = tkm5 + m; + + ar = op[k].re; + ai = op[k].im; + + br = op[tkm1].re * wlr - op[tkm1].im * wli; + bi = op[tkm1].im * wlr + op[tkm1].re * wli; + + cr = op[tkm2].re * wl2r - op[tkm2].im * wl2i; + ci = op[tkm2].im * wl2r + op[tkm2].re * wl2i; + + dr = op[tkm3].re * wl3r - op[tkm3].im * wl3i; + di = op[tkm3].im * wl3r + op[tkm3].re * wl3i; + + er = op[tkm4].re * wl4r - op[tkm4].im * wl4i; + ei = op[tkm4].im * wl4r + op[tkm4].re * wl4i; + + fr = op[tkm5].re * wl5r - op[tkm5].im * wl5i; + fi = op[tkm5].im * wl5r + op[tkm5].re * wl5i; + + gr = op[tkm6].re * wl6r - op[tkm6].im * wl6i; + gi = op[tkm6].im * wl6r + op[tkm6].re * wl6i; + + tau0r = br + gr; + tau3r = br - gr; + tau0i = bi + gi; + tau3i = bi - gi; + + tau1r = cr + fr; + tau4r = cr - fr; + tau1i = ci + fi; + tau4i = ci - fi; + + tau2r = dr + er; + tau5r = dr - er; + tau2i = di + ei; + tau5i = di - ei; + + op[k].re = ar + tau0r + tau1r + tau2r; + op[k].im = ai + tau0i + tau1i + tau2i; + + tau6r = ar + c1 * tau0r + c2 * tau1r + c3 * tau2r; + tau6i = ai + c1 * tau0i + c2 * tau1i + c3 * tau2i; + + //tau7r = sgn * ( -s1 * tau3r - s2 * tau4r - s3 * tau5r); + //tau7i = sgn * ( -s1 * tau3i - s2 * tau4i - s3 * tau5i); + + if (sgn == 1) + { + tau7r = -s1 * tau3r - s2 * tau4r - s3 * tau5r; + tau7i = -s1 * tau3i - s2 * tau4i - s3 * tau5i; + } + else + { + tau7r = s1 * tau3r + s2 * tau4r + s3 * tau5r; + tau7i = s1 * tau3i + s2 * tau4i + s3 * tau5i; + } + + + op[tkm1].re = tau6r - tau7i; + op[tkm1].im = tau6i + tau7r; + + op[tkm6].re = tau6r + tau7i; + op[tkm6].im = tau6i - tau7r; + + tau6r = ar + c2 * tau0r + c3 * tau1r + c1 * tau2r; + tau6i = ai + c2 * tau0i + c3 * tau1i + c1 * tau2i; + + //tau7r = sgn * ( -s2 * tau3r + s3 * tau4r + s1 * tau5r); + //tau7i = sgn * ( -s2 * tau3i + s3 * tau4i + s1 * tau5i); + + if (sgn == 1) + { + tau7r = -s2 * tau3r + s3 * tau4r + s1 * tau5r; + tau7i = -s2 * tau3i + s3 * tau4i + s1 * tau5i; + } + else + { + tau7r = s2 * tau3r - s3 * tau4r - s1 * tau5r; + tau7i = s2 * tau3i - s3 * tau4i - s1 * tau5i; + } + + + op[tkm2].re = tau6r - tau7i; + op[tkm2].im = tau6i + tau7r; + + op[tkm5].re = tau6r + tau7i; + op[tkm5].im = tau6i - tau7r; + + tau6r = ar + c3 * tau0r + c1 * tau1r + c2 * tau2r; + tau6i = ai + c3 * tau0i + c1 * tau1i + c2 * tau2i; + + //tau7r = sgn * ( -s3 * tau3r + s1 * tau4r - s2 * tau5r); + //tau7i = sgn * ( -s3 * tau3i + s1 * tau4i - s2 * tau5i); + + if (sgn == 1) + { + tau7r = -s3 * tau3r + s1 * tau4r - s2 * tau5r; + tau7i = -s3 * tau3i + s1 * tau4i - s2 * tau5i; + } + else + { + tau7r = s3 * tau3r - s1 * tau4r + s2 * tau5r; + tau7i = s3 * tau3i - s1 * tau4i + s2 * tau5i; + } + + + op[tkm3].re = tau6r - tau7i; + op[tkm3].im = tau6i + tau7r; + + op[tkm4].re = tau6r + tau7i; + op[tkm4].im = tau6i - tau7r; + } + } + else if (radix == 8) + { + int k, tkm1, tkm2, tkm3, tkm4, tkm5, tkm6, tkm7, ind; + fft_type wlr, wli, wl2r, wl2i, wl3r, wl3i, wl4r, wl4i, wl5r, wl5i, wl6r, wl6i, wl7r, wl7i; + fft_type tau0r, tau0i, tau1r, tau1i, tau2r, tau2i, tau3r, tau3i; + fft_type ar, ai, br, bi, cr, ci, dr, di, er, ei, fr, fi, gr, gi, hr, hi; + fft_type tau4r, tau4i, tau5r, tau5i, tau6r, tau6i, tau7r, tau7i, tau8r, tau8i, tau9r, tau9i; + fft_type c1, s1, temp1r, temp1i, temp2r, temp2i; + m = N / 8; + ll = 8 * l; + mixed_radix_dit_rec(op, ip, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + m, ip + l, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + 2 * m, ip + 2 * l, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + 3 * m, ip + 3 * l, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + 4 * m, ip + 4 * l, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + 5 * m, ip + 5 * l, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + 6 * m, ip + 6 * l, obj, sgn, m, ll, inc + 1); + mixed_radix_dit_rec(op + 7 * m, ip + 7 * l, obj, sgn, m, ll, inc + 1); + //printf("%d \n",inc); + //mixed_radix3_dit_rec(op,ip,obj,sgn,ll,m); + + c1 = 0.70710678118654752440084436210485; + s1 = 0.70710678118654752440084436210485; + + + for (k = 0; k < m; ++k) + { + ind = m - 1 + 7 * k; + wlr = (obj->twiddle + ind)->re; + wli = (obj->twiddle + ind)->im; + ind++; + wl2r = (obj->twiddle + ind)->re; + wl2i = (obj->twiddle + ind)->im; + ind++; + wl3r = (obj->twiddle + ind)->re; + wl3i = (obj->twiddle + ind)->im; + ind++; + wl4r = (obj->twiddle + ind)->re; + wl4i = (obj->twiddle + ind)->im; + ind++; + wl5r = (obj->twiddle + ind)->re; + wl5i = (obj->twiddle + ind)->im; + ind++; + wl6r = (obj->twiddle + ind)->re; + wl6i = (obj->twiddle + ind)->im; + ind++; + wl7r = (obj->twiddle + ind)->re; + wl7i = (obj->twiddle + ind)->im; + + tkm1 = k + m; + tkm2 = tkm1 + m; + tkm3 = tkm2 + m; + tkm4 = tkm3 + m; + tkm5 = tkm4 + m; + tkm6 = tkm5 + m; + tkm7 = tkm6 + m; + + ar = op[k].re; + ai = op[k].im; + + br = op[tkm1].re * wlr - op[tkm1].im * wli; + bi = op[tkm1].im * wlr + op[tkm1].re * wli; + + cr = op[tkm2].re * wl2r - op[tkm2].im * wl2i; + ci = op[tkm2].im * wl2r + op[tkm2].re * wl2i; + + dr = op[tkm3].re * wl3r - op[tkm3].im * wl3i; + di = op[tkm3].im * wl3r + op[tkm3].re * wl3i; + + er = op[tkm4].re * wl4r - op[tkm4].im * wl4i; + ei = op[tkm4].im * wl4r + op[tkm4].re * wl4i; + + fr = op[tkm5].re * wl5r - op[tkm5].im * wl5i; + fi = op[tkm5].im * wl5r + op[tkm5].re * wl5i; + + gr = op[tkm6].re * wl6r - op[tkm6].im * wl6i; + gi = op[tkm6].im * wl6r + op[tkm6].re * wl6i; + + hr = op[tkm7].re * wl7r - op[tkm7].im * wl7i; + hi = op[tkm7].im * wl7r + op[tkm7].re * wl7i; + + tau0r = ar + er; + tau4r = ar - er; + tau0i = ai + ei; + tau4i = ai - ei; + + tau1r = br + hr; + tau5r = br - hr; + tau1i = bi + hi; + tau5i = bi - hi; + + tau2r = dr + fr; + tau6r = dr - fr; + tau6i = di - fi; + tau2i = di + fi; + + tau3r = cr + gr; + tau7r = cr - gr; + tau7i = ci - gi; + tau3i = ci + gi; + + op[k].re = tau0r + tau1r + tau2r + tau3r; + op[k].im = tau0i + tau1i + tau2i + tau3i; + + op[tkm4].re = tau0r - tau1r - tau2r + tau3r; + op[tkm4].im = tau0i - tau1i - tau2i + tau3i; + + temp1r = tau1r - tau2r; + temp1i = tau1i - tau2i; + + temp2r = tau5r + tau6r; + temp2i = tau5i + tau6i; + + tau8r = tau4r + c1 * temp1r; + tau8i = tau4i + c1 * temp1i; + + //tau9r = sgn * ( -s1 * temp2r - tau7r); + //tau9i = sgn * ( -s1 * temp2i - tau7i); + + if (sgn == 1) + { + tau9r = -s1 * temp2r - tau7r; + tau9i = -s1 * temp2i - tau7i; + } + else + { + tau9r = s1 * temp2r + tau7r; + tau9i = s1 * temp2i + tau7i; + } + + + op[tkm1].re = tau8r - tau9i; + op[tkm1].im = tau8i + tau9r; + + op[tkm7].re = tau8r + tau9i; + op[tkm7].im = tau8i - tau9r; + + tau8r = tau0r - tau3r; + tau8i = tau0i - tau3i; + + //tau9r = sgn * ( -tau5r + tau6r); + //tau9i = sgn * ( -tau5i + tau6i); + + if (sgn == 1) + { + tau9r = -tau5r + tau6r; + tau9i = -tau5i + tau6i; + } + else + { + tau9r = tau5r - tau6r; + tau9i = tau5i - tau6i; + } + + + op[tkm2].re = tau8r - tau9i; + op[tkm2].im = tau8i + tau9r; + + op[tkm6].re = tau8r + tau9i; + op[tkm6].im = tau8i - tau9r; + + tau8r = tau4r - c1 * temp1r; + tau8i = tau4i - c1 * temp1i; + + //tau9r = sgn * ( -s1 * temp2r + tau7r); + //tau9i = sgn * ( -s1 * temp2i + tau7i); + + if (sgn == 1) + { + tau9r = -s1 * temp2r + tau7r; + tau9i = -s1 * temp2i + tau7i; + } + else + { + tau9r = s1 * temp2r - tau7r; + tau9i = s1 * temp2i - tau7i; + } + + + op[tkm3].re = tau8r - tau9i; + op[tkm3].im = tau8i + tau9r; + + op[tkm5].re = tau8r + tau9i; + op[tkm5].im = tau8i - tau9r; + } + } + else + { + int k, i, ind; + int M, tkm, u, v, t, tt; + fft_type temp1r, temp1i, temp2r, temp2i; + fft_type* wlr = (fft_type*)malloc(sizeof(fft_type) * (radix - 1)); + fft_type* wli = (fft_type*)malloc(sizeof(fft_type) * (radix - 1)); + fft_type* taur = (fft_type*)malloc(sizeof(fft_type) * (radix - 1)); + fft_type* taui = (fft_type*)malloc(sizeof(fft_type) * (radix - 1)); + fft_type* c1 = (fft_type*)malloc(sizeof(fft_type) * (radix - 1)); + fft_type* s1 = (fft_type*)malloc(sizeof(fft_type) * (radix - 1)); + fft_type* yr = (fft_type*)malloc(sizeof(fft_type) * (radix)); + fft_type* yi = (fft_type*)malloc(sizeof(fft_type) * (radix)); + + m = N / radix; + ll = radix * l; + + for (i = 0; i < radix; ++i) { mixed_radix_dit_rec(op + i * m, ip + i * l, obj, sgn, m, ll, inc + 1); } + + M = (radix - 1) / 2; + + for (i = 1; i < M + 1; ++i) + { + c1[i - 1] = cos(i * PI2 / radix); + s1[i - 1] = sin(i * PI2 / radix); + } + + for (i = 0; i < M; ++i) + { + s1[i + M] = -s1[M - 1 - i]; + c1[i + M] = c1[M - 1 - i]; + } + + for (k = 0; k < m; ++k) + { + ind = m - 1 + (radix - 1) * k; + yr[0] = op[k].re; + yi[0] = op[k].im; + for (i = 0; i < radix - 1; ++i) + { + wlr[i] = (obj->twiddle + ind)->re; + wli[i] = (obj->twiddle + ind)->im; + tkm = k + (i + 1) * m; + yr[i + 1] = op[tkm].re * wlr[i] - op[tkm].im * wli[i]; + yi[i + 1] = op[tkm].im * wlr[i] + op[tkm].re * wli[i]; + ind++; + } + + for (i = 0; i < M; ++i) + { + taur[i] = yr[i + 1] + yr[radix - 1 - i]; + taui[i + M] = yi[i + 1] - yi[radix - 1 - i]; + taui[i] = yi[i + 1] + yi[radix - 1 - i]; + taur[i + M] = yr[i + 1] - yr[radix - 1 - i]; + } + + temp1r = yr[0]; + temp1i = yi[0]; + + for (i = 0; i < M; ++i) + { + temp1r += taur[i]; + temp1i += taui[i]; + } + + op[k].re = temp1r; + op[k].im = temp1i; + + for (u = 0; u < M; ++u) + { + temp1r = yr[0]; + temp1i = yi[0]; + temp2r = 0.0; + temp2i = 0.0; + for (v = 0; v < M; ++v) + { + //int ind2 = (u+v)%M; + t = (u + 1) * (v + 1); + while (t >= radix) { t -= radix; } + tt = t - 1; + + temp1r += c1[tt] * taur[v]; + temp1i += c1[tt] * taui[v]; + temp2r -= s1[tt] * taur[v + M]; + temp2i -= s1[tt] * taui[v + M]; + } + temp2r = sgn * temp2r; + temp2i = sgn * temp2i; + + + op[k + (u + 1) * m].re = temp1r - temp2i; + op[k + (u + 1) * m].im = temp1i + temp2r; + + op[k + (radix - u - 1) * m].re = temp1r + temp2i; + op[k + (radix - u - 1) * m].im = temp1i - temp2r; + } + } + free(wlr); + free(wli); + free(taur); + free(taui); + free(c1); + free(s1); + free(yr); + free(yi); + } +} + +static void bluestein_exp(fft_data* hl, fft_data* hlt, int len, int M) +{ + int i; + fft_type PI = 3.1415926535897932384626433832795; + fft_type theta = PI / len; + int l2 = 0; + const int len2 = 2 * len; + + for (i = 0; i < len; ++i) + { + fft_type angle = theta * l2; + hlt[i].re = cos(angle); + hlt[i].im = sin(angle); + hl[i].re = hlt[i].re; + hl[i].im = hlt[i].im; + l2 += 2 * i + 1; + while (l2 > len2) { l2 -= len2; } + } + + for (i = len; i < M - len + 1; ++i) + { + hl[i].re = 0.0; + hl[i].im = 0.0; + } + + for (i = M - len + 1; i < M; ++i) + { + hl[i].re = hlt[M - i].re; + hl[i].im = hlt[M - i].im; + } +} + +static void bluestein_fft(fft_data* data, fft_data* oup, fft_object obj, int sgn, int N) +{ + int M, ii, i; + fft_type temp; + obj->lt = 0; + const int K = (int)pow(2.0, ceil(log10((double)N) / log10(2.0))); + const int def_lt = 1; + const int def_sgn = obj->sgn; + const int def_N = obj->N; + + if (K < 2 * N - 2) { M = K * 2; } + else { M = K; } + obj->N = M; + + fft_data* yn = (fft_data*)malloc(sizeof(fft_data) * M); + fft_data* hk = (fft_data*)malloc(sizeof(fft_data) * M); + fft_data* tempop = (fft_data*)malloc(sizeof(fft_data) * M); + fft_data* yno = (fft_data*)malloc(sizeof(fft_data) * M); + fft_data* hlt = (fft_data*)malloc(sizeof(fft_data) * N); + //fft_data* twi = (fft_data*) malloc (sizeof(fft_data) * M); + + bluestein_exp(tempop, hlt, N, M); + fft_type scale = 1.0 / M; + + for (ii = 0; ii < M; ++ii) + { + tempop[ii].im *= scale; + tempop[ii].re *= scale; + } + + //fft_object obj = initialize_fft2(M,1); + fft_exec(obj, tempop, hk); + + if (sgn == 1) + { + for (i = 0; i < N; ++i) + { + tempop[i].re = data[i].re * hlt[i].re + data[i].im * hlt[i].im; + tempop[i].im = -data[i].re * hlt[i].im + data[i].im * hlt[i].re; + } + } + else + { + for (i = 0; i < N; ++i) + { + tempop[i].re = data[i].re * hlt[i].re - data[i].im * hlt[i].im; + tempop[i].im = data[i].re * hlt[i].im + data[i].im * hlt[i].re; + } + } + + for (i = N; i < M; ++i) + { + tempop[i].re = 0.0; + tempop[i].im = 0.0; + } + + fft_exec(obj, tempop, yn); + + if (sgn == 1) + { + for (i = 0; i < M; ++i) + { + temp = yn[i].re * hk[i].re - yn[i].im * hk[i].im; + yn[i].im = yn[i].re * hk[i].im + yn[i].im * hk[i].re; + yn[i].re = temp; + } + } + else + { + for (i = 0; i < M; ++i) + { + temp = yn[i].re * hk[i].re + yn[i].im * hk[i].im; + yn[i].im = -yn[i].re * hk[i].im + yn[i].im * hk[i].re; + yn[i].re = temp; + } + } + + //IFFT + + for (ii = 0; ii < M; ++ii) { (obj->twiddle + ii)->im = -(obj->twiddle + ii)->im; } + + obj->sgn = -1 * sgn; + + fft_exec(obj, yn, yno); + + if (sgn == 1) + { + for (i = 0; i < N; ++i) + { + oup[i].re = yno[i].re * hlt[i].re + yno[i].im * hlt[i].im; + oup[i].im = -yno[i].re * hlt[i].im + yno[i].im * hlt[i].re; + } + } + else + { + for (i = 0; i < N; ++i) + { + oup[i].re = yno[i].re * hlt[i].re - yno[i].im * hlt[i].im; + oup[i].im = yno[i].re * hlt[i].im + yno[i].im * hlt[i].re; + } + } + + obj->sgn = def_sgn; + obj->N = def_N; + obj->lt = def_lt; + for (ii = 0; ii < M; ++ii) { (obj->twiddle + ii)->im = -(obj->twiddle + ii)->im; } + + free(yn); + free(yno); + free(tempop); + free(hk); + free(hlt); +} + + +void fft_exec(fft_object obj, fft_data* inp, fft_data* oup) +{ + if (obj->lt == 0) + { + const int nn = obj->N; + const int sgn1 = obj->sgn; + const int l = 1; + const int inc = 0; + //radix3_dit_rec(oup,inp,obj,sgn1,nn,l); + mixed_radix_dit_rec(oup, inp, obj, sgn1, nn, l, inc); + } + else if (obj->lt == 1) + { + const int nn = obj->N; + const int sgn1 = obj->sgn; + bluestein_fft(inp, oup, obj, sgn1, nn); + } +} + +int divideby(int M, int d) +{ + while (M % d == 0) { M = M / d; } + if (M == 1) { return 1; } + return 0; +} + +int dividebyN(int N) +{ + while (N % 53 == 0) { N = N / 53; } + while (N % 47 == 0) { N = N / 47; } + while (N % 43 == 0) { N = N / 43; } + while (N % 41 == 0) { N = N / 41; } + while (N % 37 == 0) { N = N / 37; } + while (N % 31 == 0) { N = N / 31; } + while (N % 29 == 0) { N = N / 29; } + while (N % 23 == 0) { N = N / 23; } + while (N % 17 == 0) { N = N / 17; } + while (N % 13 == 0) { N = N / 13; } + while (N % 11 == 0) { N = N / 11; } + while (N % 8 == 0) { N = N / 8; } + while (N % 7 == 0) { N = N / 7; } + while (N % 5 == 0) { N = N / 5; } + while (N % 4 == 0) { N = N / 4; } + while (N % 3 == 0) { N = N / 3; } + while (N % 2 == 0) { N = N / 2; } + if (N == 1) { return 1; } + return 0; +} + +int factors(int M, int* arr) +{ + int i = 0; + int N = M; + while (N % 53 == 0) + { + N = N / 53; + arr[i] = 53; + i++; + } + while (N % 47 == 0) + { + N = N / 47; + arr[i] = 47; + i++; + } + while (N % 43 == 0) + { + N = N / 43; + arr[i] = 43; + i++; + } + while (N % 41 == 0) + { + N = N / 41; + arr[i] = 41; + i++; + } + while (N % 37 == 0) + { + N = N / 37; + arr[i] = 37; + i++; + } + while (N % 31 == 0) + { + N = N / 31; + arr[i] = 31; + i++; + } + while (N % 29 == 0) + { + N = N / 29; + arr[i] = 29; + i++; + } + while (N % 23 == 0) + { + N = N / 23; + arr[i] = 23; + i++; + } + while (N % 19 == 0) + { + N = N / 19; + arr[i] = 19; + i++; + } + while (N % 17 == 0) + { + N = N / 17; + arr[i] = 17; + i++; + } + while (N % 13 == 0) + { + N = N / 13; + arr[i] = 13; + i++; + } + while (N % 11 == 0) + { + N = N / 11; + arr[i] = 11; + i++; + } + while (N % 8 == 0) + { + N = N / 8; + arr[i] = 8; + i++; + } + while (N % 7 == 0) + { + N = N / 7; + arr[i] = 7; + i++; + } + while (N % 5 == 0) + { + N = N / 5; + arr[i] = 5; + i++; + } + while (N % 4 == 0) + { + N = N / 4; + arr[i] = 4; + i++; + } + while (N % 3 == 0) + { + N = N / 3; + arr[i] = 3; + i++; + } + while (N % 2 == 0) + { + N = N / 2; + arr[i] = 2; + i++; + } + if (N > 31) + { + int num = 2; + + while (N > 1) + { + const int mult = num * 6; + const int m1 = mult - 1; + const int m2 = mult + 1; + while (N % m1 == 0) + { + arr[i] = m1; + i++; + N = N / m1; + } + while (N % m2 == 0) + { + arr[i] = m2; + i++; + N = N / m2; + } + num += 1; + } + } + return i; +} + + +void twiddle(fft_data* vec, int N, int radix) +{ + fft_type theta = PI2 / N; + const int KL = N / radix; + vec[0].re = 1.0; + vec[0].im = 0.0; + + for (int K = 1; K < KL; ++K) + { + fft_type theta2 = theta * K; + vec[K].re = cos(theta2); + vec[K].im = -sin(theta2); + } +} + +void longvectorN(fft_data* sig, int N, int* array, int tx) +{ + int L = 1; + int ct = 0; + for (int i = 0; i < tx; ++i) + { + L = L * array[tx - 1 - i]; + const int Ls = L / array[tx - 1 - i]; + fft_type theta = -1.0 * PI2 / L; + for (int j = 0; j < Ls; ++j) + { + for (int k = 0; k < array[tx - 1 - i] - 1; ++k) + { + sig[ct].re = cos((k + 1) * j * theta); + sig[ct].im = sin((k + 1) * j * theta); + ct++; + } + } + } +} + + +void free_fft(fft_object object) { free(object); } diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/hsfft.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/hsfft.h new file mode 100644 index 0000000..2a104aa --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/hsfft.h @@ -0,0 +1,70 @@ +/* + * hsfft.h + * + * Created on: Apr 14, 2013 + * Author: Rafat Hussain + */ + +#pragma once + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define PI2 6.28318530717958647692528676655900577 + +#ifndef fft_type +#define fft_type double +#endif + + +typedef struct fft_t +{ + fft_type re; + fft_type im; +} fft_data; +/* +#define SADD(a,b) ((a)+(b)) + +#define SSUB(a,b) ((a)+(b)) + +#define SMUL(a,b) ((a)*(b)) +*/ + +typedef struct fft_set* fft_object; + +fft_object fft_init(int N, int sgn); + +struct fft_set +{ + int N; + int sgn; + int factors[64]; + int lf; + int lt; + fft_data twiddle[1]; +}; + +void fft_exec(fft_object obj, fft_data* inp, fft_data* oup); + +int divideby(int M, int d); + +int dividebyN(int N); + +//void arrrev(int M, int* arr); + +int factors(int M, int* arr); + +void twiddle(fft_data* vec, int N, int radix); + +void longvectorN(fft_data* sig, int N, int* array, int tx); + +void free_fft(fft_object object); + +#ifdef __cplusplus +} +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/real.c b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/real.c new file mode 100644 index 0000000..ff5abf5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/real.c @@ -0,0 +1,96 @@ +/* + * real.c + * + * Created on: Apr 20, 2013 + * Author: Rafat Hussain + */ +#include +#include "real.h" + +fft_real_object fft_real_init(int N, int sgn) +{ + fft_real_object obj = (fft_real_object)malloc(sizeof(struct fft_real_set) + sizeof(fft_data) * (N / 2)); + obj->cobj = fft_init(N / 2, sgn); + + for (int k = 0; k < N / 2; ++k) + { + const fft_type theta = PI2 * k / N; + obj->twiddle2[k].re = cos(theta); + obj->twiddle2[k].im = sin(theta); + } + return obj; +} + +void fft_r2c_exec(fft_real_object obj,fft_type* inp, fft_data* oup) +{ + int i; + const int N2 = obj->cobj->N; + const int N = N2 * 2; + + fft_data* cinp = (fft_data*)malloc(sizeof(fft_data) * N2); + fft_data* coup = (fft_data*)malloc(sizeof(fft_data) * N2); + + for (i = 0; i < N2; ++i) + { + cinp[i].re = inp[2 * i]; + cinp[i].im = inp[2 * i + 1]; + } + + fft_exec(obj->cobj, cinp, coup); + + oup[0].re = coup[0].re + coup[0].im; + oup[0].im = 0.0; + + for (i = 1; i < N2; ++i) + { + fft_type temp1 = coup[i].im + coup[N2 - i].im; + fft_type temp2 = coup[N2 - i].re - coup[i].re; + oup[i].re = (coup[i].re + coup[N2 - i].re + (temp1 * obj->twiddle2[i].re) + (temp2 * obj->twiddle2[i].im)) / 2.0; + oup[i].im = (coup[i].im - coup[N2 - i].im + (temp2 * obj->twiddle2[i].re) - (temp1 * obj->twiddle2[i].im)) / 2.0; + } + + + oup[N2].re = coup[0].re - coup[0].im; + oup[N2].im = 0.0; + + for (i = 1; i < N2; ++i) + { + oup[N - i].re = oup[i].re; + oup[N - i].im = -oup[i].im; + } + + + free(cinp); + free(coup); +} + +void fft_c2r_exec(fft_real_object obj, fft_data* inp,fft_type* oup) +{ + const int N2 = obj->cobj->N; + + fft_data* cinp = (fft_data*)malloc(sizeof(fft_data) * N2); + fft_data* coup = (fft_data*)malloc(sizeof(fft_data) * N2); + + for (int i = 0; i < N2; ++i) + { + fft_type temp1 = -inp[i].im - inp[N2 - i].im; + fft_type temp2 = -inp[N2 - i].re + inp[i].re; + cinp[i].re = inp[i].re + inp[N2 - i].re + (temp1 * obj->twiddle2[i].re) - (temp2 * obj->twiddle2[i].im); + cinp[i].im = inp[i].im - inp[N2 - i].im + (temp2 * obj->twiddle2[i].re) + (temp1 * obj->twiddle2[i].im); + } + + fft_exec(obj->cobj, cinp, coup); + for (int i = 0; i < N2; ++i) + { + oup[2 * i] = coup[i].re; + oup[2 * i + 1] = coup[i].im; + } + free(cinp); + free(coup); +} + +void free_real_fft(fft_real_object object) +{ + free_fft(object->cobj); + free(object); +} diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/real.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/real.h new file mode 100644 index 0000000..2546c9b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/real.h @@ -0,0 +1,34 @@ +/* + * real.h + * + * Created on: Apr 20, 2013 + * Author: Rafat Hussain + */ + +#pragma once + +#include "hsfft.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct fft_real_set* fft_real_object; + +fft_real_object fft_real_init(int N, int sgn); + +struct fft_real_set +{ + fft_object cobj; + fft_data twiddle2[1]; +}; + +void fft_r2c_exec(fft_real_object obj,fft_type* inp, fft_data* oup); + +void fft_c2r_exec(fft_real_object obj, fft_data* inp,fft_type* oup); + +void free_real_fft(fft_real_object object); + +#ifdef __cplusplus +} +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavefilt.c b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavefilt.c new file mode 100644 index 0000000..99387b8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavefilt.c @@ -0,0 +1,4201 @@ +/* +* Copyright (c) 2014, Rafat Hussain +* Copyright (C) 2016 Holger Nahrstaedt +* Daubechies wavelets coefficents Computed by Kazuo Hatano, Aichi Institute of Technology. http://phase.hpcc.jp/phase/wavelet/ +*/ +#include "wavefilt.h" + + +static const double db1[2] = { + 7.071067811865475244008443621048490392848359376884740365883398e-01, + 7.071067811865475244008443621048490392848359376884740365883398e-01 +}; + +static const double db2[4] = { + 4.829629131445341433748715998644486838169524195042022752011715e-01, + 8.365163037378079055752937809168732034593703883484392934953414e-01, + 2.241438680420133810259727622404003554678835181842717613871683e-01, + -1.294095225512603811744494188120241641745344506599652569070016e-01 +}; + + +static const double db3[6] = { + 3.326705529500826159985115891390056300129233992450683597084705e-01, + 8.068915093110925764944936040887134905192973949948236181650920e-01, + 4.598775021184915700951519421476167208081101774314923066433867e-01, + -1.350110200102545886963899066993744805622198452237811919756862e-01, + -8.544127388202666169281916918177331153619763898808662976351748e-02, + 3.522629188570953660274066471551002932775838791743161039893406e-02 +}; + + +static const double db4[8] = { + 2.303778133088965008632911830440708500016152482483092977910968e-01, + 7.148465705529156470899219552739926037076084010993081758450110e-01, + 6.308807679298589078817163383006152202032229226771951174057473e-01, + -2.798376941685985421141374718007538541198732022449175284003358e-02, + -1.870348117190930840795706727890814195845441743745800912057770e-01, + 3.084138183556076362721936253495905017031482172003403341821219e-02, + 3.288301166688519973540751354924438866454194113754971259727278e-02, + -1.059740178506903210488320852402722918109996490637641983484974e-02 +}; + + +static const double db5[10] = { + 1.601023979741929144807237480204207336505441246250578327725699e-01, + 6.038292697971896705401193065250621075074221631016986987969283e-01, + 7.243085284377729277280712441022186407687562182320073725767335e-01, + 1.384281459013207315053971463390246973141057911739561022694652e-01, + -2.422948870663820318625713794746163619914908080626185983913726e-01, + -3.224486958463837464847975506213492831356498416379847225434268e-02, + 7.757149384004571352313048938860181980623099452012527983210146e-02, + -6.241490212798274274190519112920192970763557165687607323417435e-03, + -1.258075199908199946850973993177579294920459162609785020169232e-02, + 3.335725285473771277998183415817355747636524742305315099706428e-03 +}; + + +static const double db6[12] = { + 1.115407433501094636213239172409234390425395919844216759082360e-01, + 4.946238903984530856772041768778555886377863828962743623531834e-01, + 7.511339080210953506789344984397316855802547833382612009730420e-01, + 3.152503517091976290859896548109263966495199235172945244404163e-01, + -2.262646939654398200763145006609034656705401539728969940143487e-01, + -1.297668675672619355622896058765854608452337492235814701599310e-01, + 9.750160558732304910234355253812534233983074749525514279893193e-02, + 2.752286553030572862554083950419321365738758783043454321494202e-02, + -3.158203931748602956507908069984866905747953237314842337511464e-02, + 5.538422011614961392519183980465012206110262773864964295476524e-04, + 4.777257510945510639635975246820707050230501216581434297593254e-03, + -1.077301085308479564852621609587200035235233609334419689818580e-03 +}; + + +static const double db7[14] = { + 7.785205408500917901996352195789374837918305292795568438702937e-02, + 3.965393194819173065390003909368428563587151149333287401110499e-01, + 7.291320908462351199169430703392820517179660611901363782697715e-01, + 4.697822874051931224715911609744517386817913056787359532392529e-01, + -1.439060039285649754050683622130460017952735705499084834401753e-01, + -2.240361849938749826381404202332509644757830896773246552665095e-01, + 7.130921926683026475087657050112904822711327451412314659575113e-02, + 8.061260915108307191292248035938190585823820965629489058139218e-02, + -3.802993693501441357959206160185803585446196938467869898283122e-02, + -1.657454163066688065410767489170265479204504394820713705239272e-02, + 1.255099855609984061298988603418777957289474046048710038411818e-02, + 4.295779729213665211321291228197322228235350396942409742946366e-04, + -1.801640704047490915268262912739550962585651469641090625323864e-03, + 3.537137999745202484462958363064254310959060059520040012524275e-04 +}; + +static const double db8[16] = { + 5.441584224310400995500940520299935503599554294733050397729280e-02, + 3.128715909142999706591623755057177219497319740370229185698712e-01, + 6.756307362972898068078007670471831499869115906336364227766759e-01, + 5.853546836542067127712655200450981944303266678053369055707175e-01, + -1.582910525634930566738054787646630415774471154502826559735335e-02, + -2.840155429615469265162031323741647324684350124871451793599204e-01, + 4.724845739132827703605900098258949861948011288770074644084096e-04, + 1.287474266204784588570292875097083843022601575556488795577000e-01, + -1.736930100180754616961614886809598311413086529488394316977315e-02, + -4.408825393079475150676372323896350189751839190110996472750391e-02, + 1.398102791739828164872293057263345144239559532934347169146368e-02, + 8.746094047405776716382743246475640180402147081140676742686747e-03, + -4.870352993451574310422181557109824016634978512157003764736208e-03, + -3.917403733769470462980803573237762675229350073890493724492694e-04, + 6.754494064505693663695475738792991218489630013558432103617077e-04, + -1.174767841247695337306282316988909444086693950311503927620013e-04 +}; + + +static const double db9[18] = { + 3.807794736387834658869765887955118448771714496278417476647192e-02, + 2.438346746125903537320415816492844155263611085609231361429088e-01, + 6.048231236901111119030768674342361708959562711896117565333713e-01, + 6.572880780513005380782126390451732140305858669245918854436034e-01, + 1.331973858250075761909549458997955536921780768433661136154346e-01, + -2.932737832791749088064031952421987310438961628589906825725112e-01, + -9.684078322297646051350813353769660224825458104599099679471267e-02, + 1.485407493381063801350727175060423024791258577280603060771649e-01, + 3.072568147933337921231740072037882714105805024670744781503060e-02, + -6.763282906132997367564227482971901592578790871353739900748331e-02, + 2.509471148314519575871897499885543315176271993709633321834164e-04, + 2.236166212367909720537378270269095241855646688308853754721816e-02, + -4.723204757751397277925707848242465405729514912627938018758526e-03, + -4.281503682463429834496795002314531876481181811463288374860455e-03, + 1.847646883056226476619129491125677051121081359600318160732515e-03, + 2.303857635231959672052163928245421692940662052463711972260006e-04, + -2.519631889427101369749886842878606607282181543478028214134265e-04, + 3.934732031627159948068988306589150707782477055517013507359938e-05 +}; + + +static const double db10[20] = { + 2.667005790055555358661744877130858277192498290851289932779975e-02, + 1.881768000776914890208929736790939942702546758640393484348595e-01, + 5.272011889317255864817448279595081924981402680840223445318549e-01, + 6.884590394536035657418717825492358539771364042407339537279681e-01, + 2.811723436605774607487269984455892876243888859026150413831543e-01, + -2.498464243273153794161018979207791000564669737132073715013121e-01, + -1.959462743773770435042992543190981318766776476382778474396781e-01, + 1.273693403357932600826772332014009770786177480422245995563097e-01, + 9.305736460357235116035228983545273226942917998946925868063974e-02, + -7.139414716639708714533609307605064767292611983702150917523756e-02, + -2.945753682187581285828323760141839199388200516064948779769654e-02, + 3.321267405934100173976365318215912897978337413267096043323351e-02, + 3.606553566956169655423291417133403299517350518618994762730612e-03, + -1.073317548333057504431811410651364448111548781143923213370333e-02, + 1.395351747052901165789318447957707567660542855688552426721117e-03, + 1.992405295185056117158742242640643211762555365514105280067936e-03, + -6.858566949597116265613709819265714196625043336786920516211903e-04, + -1.164668551292854509514809710258991891527461854347597362819235e-04, + 9.358867032006959133405013034222854399688456215297276443521873e-05, + -1.326420289452124481243667531226683305749240960605829756400674e-05 +}; + +static const double db11[22] = { + 1.869429776147108402543572939561975728967774455921958543286692e-02, + 1.440670211506245127951915849361001143023718967556239604318852e-01, + 4.498997643560453347688940373853603677806895378648933474599655e-01, + 6.856867749162005111209386316963097935940204964567703495051589e-01, + 4.119643689479074629259396485710667307430400410187845315697242e-01, + -1.622752450274903622405827269985511540744264324212130209649667e-01, + -2.742308468179469612021009452835266628648089521775178221905778e-01, + 6.604358819668319190061457888126302656753142168940791541113457e-02, + 1.498120124663784964066562617044193298588272420267484653796909e-01, + -4.647995511668418727161722589023744577223260966848260747450320e-02, + -6.643878569502520527899215536971203191819566896079739622858574e-02, + 3.133509021904607603094798408303144536358105680880031964936445e-02, + 2.084090436018106302294811255656491015157761832734715691126692e-02, + -1.536482090620159942619811609958822744014326495773000120205848e-02, + -3.340858873014445606090808617982406101930658359499190845656731e-03, + 4.928417656059041123170739741708273690285547729915802418397458e-03, + -3.085928588151431651754590726278953307180216605078488581921562e-04, + -8.930232506662646133900824622648653989879519878620728793133358e-04, + 2.491525235528234988712216872666801088221199302855425381971392e-04, + 5.443907469936847167357856879576832191936678525600793978043688e-05, + -3.463498418698499554128085159974043214506488048233458035943601e-05, + 4.494274277236510095415648282310130916410497987383753460571741e-06 +}; + +static const double db12[24] = { + 1.311225795722951750674609088893328065665510641931325007748280e-02, + 1.095662728211851546057045050248905426075680503066774046383657e-01, + 3.773551352142126570928212604879206149010941706057526334705839e-01, + 6.571987225793070893027611286641169834250203289988412141394281e-01, + 5.158864784278156087560326480543032700677693087036090056127647e-01, + -4.476388565377462666762747311540166529284543631505924139071704e-02, + -3.161784537527855368648029353478031098508839032547364389574203e-01, + -2.377925725606972768399754609133225784553366558331741152482612e-02, + 1.824786059275796798540436116189241710294771448096302698329011e-01, + 5.359569674352150328276276729768332288862665184192705821636342e-03, + -9.643212009650708202650320534322484127430880143045220514346402e-02, + 1.084913025582218438089010237748152188661630567603334659322512e-02, + 4.154627749508444073927094681906574864513532221388374861287078e-02, + -1.221864906974828071998798266471567712982466093116558175344811e-02, + -1.284082519830068329466034471894728496206109832314097633275225e-02, + 6.711499008795509177767027068215672450648112185856456740379455e-03, + 2.248607240995237599950865211267234018343199786146177099262010e-03, + -2.179503618627760471598903379584171187840075291860571264980942e-03, + 6.545128212509595566500430399327110729111770568897356630714552e-06, + 3.886530628209314435897288837795981791917488573420177523436096e-04, + -8.850410920820432420821645961553726598738322151471932808015443e-05, + -2.424154575703078402978915320531719580423778362664282239377532e-05, + 1.277695221937976658714046362616620887375960941439428756055353e-05, + -1.529071758068510902712239164522901223197615439660340672602696e-06 +}; + +static const double db13[26] = { + 9.202133538962367972970163475644184667534171916416562386009703e-03, + 8.286124387290277964432027131230466405208113332890135072514277e-02, + 3.119963221604380633960784112214049693946683528967180317160390e-01, + 6.110558511587876528211995136744180562073612676018239438526582e-01, + 5.888895704312189080710395347395333927665986382812836042235573e-01, + 8.698572617964723731023739838087494399231884076619701250882016e-02, + -3.149729077113886329981698255932282582876888450678789025950306e-01, + -1.245767307508152589413808336021260180792739295173634719572069e-01, + 1.794760794293398432348450072339369013581966256244133393042881e-01, + 7.294893365677716380902830610477661983325929026879873553627963e-02, + -1.058076181879343264509667304196464849478860754801236658232360e-01, + -2.648840647534369463963912248034785726419604844297697016264224e-02, + 5.613947710028342886214501998387331119988378792543100244737056e-02, + 2.379972254059078811465170958554208358094394612051934868475139e-03, + -2.383142071032364903206403067757739134252922717636226274077298e-02, + 3.923941448797416243316370220815526558824746623451404043918407e-03, + 7.255589401617566194518393300502698898973529679646683695269828e-03, + -2.761911234656862178014576266098445995350093330501818024966316e-03, + -1.315673911892298936613835370593643376060412592653652307238124e-03, + 9.323261308672633862226517802548514100918088299801952307991569e-04, + 4.925152512628946192140957387866596210103778299388823500840094e-05, + -1.651289885565054894616687709238000755898548214659776703347801e-04, + 3.067853757932549346649483228575476236600428217237900563128230e-05, + 1.044193057140813708170714991080596951670706436217328169641474e-05, + -4.700416479360868325650195165061771321650383582970958556568059e-06, + 5.220035098454864691736424354843176976747052155243557001531901e-07 +}; + +static const double db14[28] = { + 6.461153460087947818166397448622814272327159419201199218101404e-03, + 6.236475884939889832798566758434877428305333693407667164602518e-02, + 2.548502677926213536659077886778286686187042416367137443780084e-01, + 5.543056179408938359926831449851154844078269830951634609683997e-01, + 6.311878491048567795576617135358172348623952456570017289788809e-01, + 2.186706877589065214917475918217517051765774321270432059030273e-01, + -2.716885522787480414142192476181171094604882465683330814311896e-01, + -2.180335299932760447555558812702311911975240669470604752747127e-01, + 1.383952138648065910739939690021573713989900463229686119059119e-01, + 1.399890165844607012492943162271163440328221555614326181333683e-01, + -8.674841156816968904560822066727795382979149539517503657492964e-02, + -7.154895550404613073584145115173807990958069673129538099990913e-02, + 5.523712625921604411618834060533403397913833632511672157671107e-02, + 2.698140830791291697399031403215193343375766595807274233284349e-02, + -3.018535154039063518714822623489137573781575406658652624883756e-02, + -5.615049530356959133218371367691498637457297203925810387698680e-03, + 1.278949326633340896157330705784079299374903861572058313481534e-02, + -7.462189892683849371817160739181780971958187988813302900435487e-04, + -3.849638868022187445786349316095551774096818508285700493058915e-03, + 1.061691085606761843032566749388411173033941582147830863893939e-03, + 7.080211542355278586442977697617128983471863464181595371670094e-04, + -3.868319473129544821076663398057314427328902107842165379901468e-04, + -4.177724577037259735267979539839258928389726590132730131054323e-05, + 6.875504252697509603873437021628031601890370687651875279882727e-05, + -1.033720918457077394661407342594814586269272509490744850691443e-05, + -4.389704901781394115254042561367169829323085360800825718151049e-06, + 1.724994675367812769885712692741798523587894709867356576910717e-06, + -1.787139968311359076334192938470839343882990309976959446994022e-07 +}; + +static const double db15[30] = { + 4.538537361578898881459394910211696346663671243788786997916513e-03, + 4.674339489276627189170969334843575776579151700214943513113197e-02, + 2.060238639869957315398915009476307219306138505641930902702047e-01, + 4.926317717081396236067757074029946372617221565130932402160160e-01, + 6.458131403574243581764209120106917996432608287494046181071489e-01, + 3.390025354547315276912641143835773918756769491793554669336690e-01, + -1.932041396091454287063990534321471746304090039142863827937754e-01, + -2.888825965669656462484125009822332981311435630435342594971292e-01, + 6.528295284877281692283107919869574882039174285596144125965101e-02, + 1.901467140071229823484893116586020517959501258174336696878156e-01, + -3.966617655579094448384366751896200668381742820683736805449745e-02, + -1.111209360372316933656710324674058608858623762165914120505657e-01, + 3.387714392350768620854817844433523770864744687411265369463195e-02, + 5.478055058450761268913790312581879108609415997422768564244845e-02, + -2.576700732843996258594525754269826392203641634825340138396836e-02, + -2.081005016969308167788483424677000162054657951364899040996166e-02, + 1.508391802783590236329274460170322736244892823305627716233968e-02, + 5.101000360407543169708860185565314724801066527344222055526631e-03, + -6.487734560315744995181683149218690816955845639388826407928967e-03, + -2.417564907616242811667225326300179605229946995814535223329411e-04, + 1.943323980382211541764912332541087441011424865579531401452302e-03, + -3.734823541376169920098094213645414611387630968030256625740226e-04, + -3.595652443624688121649620075909808858194202454084090305627480e-04, + 1.558964899205997479471658241227108816255567059625495915228603e-04, + 2.579269915531893680925862417616855912944042368767340709160119e-05, + -2.813329626604781364755324777078478665791443876293788904267255e-05, + 3.362987181737579803124845210420177472134846655864078187186304e-06, + 1.811270407940577083768510912285841160577085925337507850590290e-06, + -6.316882325881664421201597299517657654166137915121195510416641e-07, + 6.133359913305752029056299460289788601989190450885396512173845e-08 +}; + +static const double db16[32] = { + 3.189220925347738029769547564645958687067086750131428767875878e-03, + 3.490771432367334641030147224023020009218241430503984146140054e-02, + 1.650642834888531178991252730561134811584835002342723240213592e-01, + 4.303127228460038137403925424357684620633970478036986773924646e-01, + 6.373563320837888986319852412996030536498595940814198125967751e-01, + 4.402902568863569000390869163571679288527803035135272578789884e-01, + -8.975108940248964285718718077442597430659247445582660149624718e-02, + -3.270633105279177046462905675689119641757228918228812428141723e-01, + -2.791820813302827668264519595026873204339971219174736041535479e-02, + 2.111906939471042887209680163268837900928491426167679439251042e-01, + 2.734026375271604136485245757201617965429027819507130220231500e-02, + -1.323883055638103904500474147756493375092287817706027978798549e-01, + -6.239722752474871765674503394120025865444656311678760990761458e-03, + 7.592423604427631582148498743941422461530405946100943351940313e-02, + -7.588974368857737638494890864636995796586975144990925400097160e-03, + -3.688839769173014233352666320894554314718748429706730831064068e-02, + 1.029765964095596941165000580076616900528856265803662208854147e-02, + 1.399376885982873102950451873670329726409840291727868988490100e-02, + -6.990014563413916670284249536517288338057856199646469078115759e-03, + -3.644279621498389932169000540933629387055333973353108668841215e-03, + 3.128023381206268831661202559854678767821471906193608117450360e-03, + 4.078969808497128362417470323406095782431952972310546715071397e-04, + -9.410217493595675889266453953635875407754747216734480509250273e-04, + 1.142415200387223926440228099555662945839684344936472652877091e-04, + 1.747872452253381803801758637660746874986024728615399897971953e-04, + -6.103596621410935835162369150522212811957259981965919143961722e-05, + -1.394566898820889345199078311998401982325273569198675335408707e-05, + 1.133660866127625858758848762886536997519471068203753661757843e-05, + -1.043571342311606501525454737262615404887478930635676471546032e-06, + -7.363656785451205512099695719725563646585445545841663327433569e-07, + 2.308784086857545866405412732942006121306306735866655525372544e-07, + -2.109339630100743097000572623603489906836297584591605307745349e-08 +}; + +static const double db17[34] = { + 2.241807001037312853535962677074436914062191880560370733250531e-03, + 2.598539370360604338914864591720788315473944524878241294399948e-02, + 1.312149033078244065775506231859069960144293609259978530067004e-01, + 3.703507241526411504492548190721886449477078876896803823650425e-01, + 6.109966156846228181886678867679372082737093893358726291371783e-01, + 5.183157640569378393254538528085968046216817197718416402439904e-01, + 2.731497040329363500431250719147586480350469818964563003672942e-02, + -3.283207483639617360909665340725061767581597698151558024679130e-01, + -1.265997522158827028744679110933825505053966260104086162103728e-01, + 1.973105895650109927854047044781930142551422414135646917122284e-01, + 1.011354891774702721509699856433434802196622545499664876109437e-01, + -1.268156917782863110948571128662331680384792185915017065732137e-01, + -5.709141963167692728911239478651382324161160869845347053990144e-02, + 8.110598665416088507965885748555429201024364190954499194020678e-02, + 2.231233617810379595339136059534813756232242114093689244020869e-02, + -4.692243838926973733300897059211400507138768125498030602878439e-02, + -3.270955535819293781655360222177494452069525958061609392809275e-03, + 2.273367658394627031845616244788448969906713741338339498024864e-02, + -3.042989981354637068592482637907206078633395457225096588287881e-03, + -8.602921520322854831713706413243659917926736284271730611920986e-03, + 2.967996691526094872806485060008038269959463846548378995044195e-03, + 2.301205242153545624302059869038423604241976680189447476064764e-03, + -1.436845304802976126222890402980384903503674530729935809561434e-03, + -3.281325194098379713954444017520115075812402442728749700195651e-04, + 4.394654277686436778385677527317841632289249319738892179465910e-04, + -2.561010956654845882729891210949920221664082061531909655178413e-05, + -8.204803202453391839095482576282189866136273049636764338689593e-05, + 2.318681379874595084482068205706277572106695174091895338530734e-05, + 6.990600985076751273204549700855378627762758585902057964027481e-06, + -4.505942477222988194102268206378312129713572600716499944918416e-06, + 3.016549609994557415605207594879939763476168705217646897702706e-07, + 2.957700933316856754979905258816151367870345628924317307354639e-07, + -8.423948446002680178787071296922877068410310942222799622593133e-08, + 7.267492968561608110879767441409035034158581719789791088892046e-09 +}; + +static const double db18[36] = { + 1.576310218440760431540744929939777747670753710991660363684429e-03, + 1.928853172414637705921391715829052419954667025288497572236714e-02, + 1.035884658224235962241910491937253596470696555220241672976224e-01, + 3.146789413370316990571998255652579931786706190489374509491307e-01, + 5.718268077666072234818589370900623419393673743130930561295324e-01, + 5.718016548886513352891119994065965025668047882818525060759395e-01, + 1.472231119699281415750977271081072312557864107355701387801677e-01, + -2.936540407365587442479030994981150723935710729035053239661752e-01, + -2.164809340051429711237678625668271471437937235669492408388692e-01, + 1.495339755653777893509301738913667208804816691893765610261943e-01, + 1.670813127632574045149318139950134745324205646353988083152250e-01, + -9.233188415084628060429372558659459731431848000144569612074508e-02, + -1.067522466598284855932200581614984861385266404624112083917702e-01, + 6.488721621190544281947577955141911463129382116634147846137149e-02, + 5.705124773853688412090768846499622260596226120431038524600676e-02, + -4.452614190298232471556143559744653492971477891439833592755034e-02, + -2.373321039586000103275209582665216110197519330713490233071565e-02, + 2.667070592647059029987908631672020343207895999936072813363471e-02, + 6.262167954305707485236093144497882501990325204745013190268052e-03, + -1.305148094661200177277636447600807169755191054507571666606133e-02, + 1.186300338581174657301741592161819084544899417452317405185615e-04, + 4.943343605466738130665529516802974834299638313366477765295203e-03, + -1.118732666992497072800658855238650182318060482584970145512687e-03, + -1.340596298336106629517567228251583609823044524685986640323942e-03, + 6.284656829651457125619449885420838217551022796301582874349652e-04, + 2.135815619103406884039052814341926025873200325996466522543440e-04, + -1.986485523117479485798245416362489554927797880264017876139605e-04, + -1.535917123534724675069770335876717193700472427021513236587288e-07, + 3.741237880740038181092208138035393952304292615793985030731363e-05, + -8.520602537446695203919254911655523022437596956226376512305917e-06, + -3.332634478885821888782452033341036827311505907796498439829337e-06, + 1.768712983627615455876328730755375176412501359114058815453100e-06, + -7.691632689885176146000152878539598405817397588156525116769908e-08, + -1.176098767028231698450982356561292561347579777695396953528141e-07, + 3.068835863045174800935478294933975372450179787894574492930570e-08, + -2.507934454948598267195173183147126731806317144868275819941403e-09 +}; + +static const double db19[38] = { + 1.108669763181710571099154195209715164245299677773435932135455e-03, + 1.428109845076439737439889152950199234745663442163665957870715e-02, + 8.127811326545955065296306784901624839844979971028620366497726e-02, + 2.643884317408967846748100380289426873862377807211920718417385e-01, + 5.244363774646549153360575975484064626044633641048072116393160e-01, + 6.017045491275378948867077135921802620536565639585963293313931e-01, + 2.608949526510388292872456675310528324172673101301907739925213e-01, + -2.280913942154826463746325776054637207093787237086425909534822e-01, + -2.858386317558262418545975695028984237217356095588335149922119e-01, + 7.465226970810326636763433111878819005865866149731909656365399e-02, + 2.123497433062784888090608567059824197077074200878839448416908e-01, + -3.351854190230287868169388418785731506977845075238966819814032e-02, + -1.427856950387365749779602731626112812998497706152428508627562e-01, + 2.758435062562866875014743520162198655374474596963423080762818e-02, + 8.690675555581223248847645428808443034785208002468192759640352e-02, + -2.650123625012304089901835843676387361075068017686747808171345e-02, + -4.567422627723090805645444214295796017938935732115630050880109e-02, + 2.162376740958504713032984257172372354318097067858752542571020e-02, + 1.937554988917612764637094354457999814496885095875825546406963e-02, + -1.398838867853514163250401235248662521916813867453095836808366e-02, + -5.866922281012174726584493436054373773814608340808758177372765e-03, + 7.040747367105243153014511207400620109401689897665383078229398e-03, + 7.689543592575483559749139148673955163477947086039406129546422e-04, + -2.687551800701582003957363855070398636534038920982478290170267e-03, + 3.418086534585957765651657290463808135214214848819517257794031e-04, + 7.358025205054352070260481905397281875183175792779904858189494e-04, + -2.606761356786280057318315130897522790383939362073563408613547e-04, + -1.246007917341587753449784408901653990317341413341980904757592e-04, + 8.711270467219922965416862388191128268412933893282083517729443e-05, + 5.105950487073886053049222809934231573687367992106282669389264e-06, + -1.664017629715494454620677719899198630333675608812018108739144e-05, + 3.010964316296526339695334454725943632645798938162427168851382e-06, + 1.531931476691193063931832381086636031203123032723477463624141e-06, + -6.862755657769142701883554613486732854452740752771392411758418e-07, + 1.447088298797844542078219863291615420551673574071367834316167e-08, + 4.636937775782604223430857728210948898871748291085962296649320e-08, + -1.116402067035825816390504769142472586464975799284473682246076e-08, + 8.666848838997619350323013540782124627289742190273059319122840e-10 +}; + +static const double db20[40] = { + 7.799536136668463215861994818889370970510722039232863880031127e-04, + 1.054939462495039832454480973015641498231961468733236691299796e-02, + 6.342378045908151497587346582668785136406523315729666353643372e-02, + 2.199421135513970450080335972537209392121306761010882209298252e-01, + 4.726961853109016963710241465101446230757804141171727845834637e-01, + 6.104932389385938201631515660084201906858628924695448898824748e-01, + 3.615022987393310629195602665268631744967084723079677894136358e-01, + -1.392120880114838725806970545155530518264944915437808314813582e-01, + -3.267868004340349674031122837905370666716645587480021744425550e-01, + -1.672708830907700757517174997304297054003744303620479394006890e-02, + 2.282910508199163229728429126648223086437547237250290835639880e-01, + 3.985024645777120219790581076522174181104027576954427684456660e-02, + -1.554587507072679559315307870562464374359996091752285157077477e-01, + -2.471682733861358401587992299169922262915151413349313513685587e-02, + 1.022917191744425578861013681016866083888381385233081516583444e-01, + 5.632246857307435506953246988215209861566800664402785938591145e-03, + -6.172289962468045973318658334083283558209278762007041823250642e-02, + 5.874681811811826491300679742081997167209743446956901841959711e-03, + 3.229429953076958175885440860617219117564558605035979601073235e-02, + -8.789324923901561348753650366700695916503030939283830968151332e-03, + -1.381052613715192007819606423860356590496904285724730356602106e-02, + 6.721627302259456835336850521405425560520025237915708362002910e-03, + 4.420542387045790963058229526673514088808999478115581153468068e-03, + -3.581494259609622777556169638358238375765194248623891034940330e-03, + -8.315621728225569192482585199373230956924484221135739973390038e-04, + 1.392559619323136323905254999347967283760544147397530531142397e-03, + -5.349759843997695051759716377213680036185796059087353172073952e-05, + -3.851047486992176060650288501475716463266233035937022303649838e-04, + 1.015328897367029050797488785306056522529979267572003990901472e-04, + 6.774280828377729558011184406727978221295796652200819839464354e-05, + -3.710586183394712864227221271216408416958225264980612822617745e-05, + -4.376143862183996810373095822528607606900620592585762190542483e-06, + 7.241248287673620102843105877497181565468725757387007139555885e-06, + -1.011994010018886150340475413756849103197395069431085005709201e-06, + -6.847079597000556894163334787575159759109091330092963990364192e-07, + 2.633924226270001084129057791994367121555769686616747162262697e-07, + 2.014322023550512694324757845944026047904414136633776958392681e-10, + -1.814843248299695973210605258227024081458531110762083371310917e-08, + 4.056127055551832766099146230616888024627380574113178257963252e-09, + -2.998836489619319566407767078372705385732460052685621923178375e-10 +}; + + +const double db21[42] = { + 5.488225098526837086776336675992521426750673054588245523834775e-04, + 7.776639052354783754338787398088799862510779059555623704879234e-03, + 4.924777153817727491399853378340056968104483161598320693657954e-02, + 1.813596254403815156260378722764624190931951510708050516519181e-01, + 4.196879449393627730946850609089266339973601543036294871772653e-01, + 6.015060949350038975629880664020955953066542593896126705346122e-01, + 4.445904519276003403643290994523601016151342743089878478478962e-01, + -3.572291961725529045922914178005307189036762547143966578066838e-02, + -3.356640895305295094832978867114363069987575282256098351499731e-01, + -1.123970715684509813515004981340306901641824212464197973490295e-01, + 2.115645276808723923846781645238468659430862736248896128529373e-01, + 1.152332984396871041993434411681730428103160016594558944687967e-01, + -1.399404249325472249247758764839776903226503657502071670245304e-01, + -8.177594298086382887387303634193790542522570670234556157566786e-02, + 9.660039032372422070232189700372539681627783322249829842275517e-02, + 4.572340574922879239251202944731235421034828710753381191345186e-02, + -6.497750489373232063332311106008616685748929419452249544690967e-02, + -1.865385920211851534093244412008141266131208093007217139232170e-02, + 3.972683542785044175197464400756126818299918992482587866999707e-02, + 3.357756390338110842532604766376200760791669954106679933144723e-03, + -2.089205367797907948785235479746212371728219866525211135343707e-02, + 2.403470920805434762380632169785689545910525667396313550679652e-03, + 8.988824381971911875349463398395464114417817949738911101372312e-03, + -2.891334348588901247375268718015882610844675931117463495551958e-03, + -2.958374038932831280750770228215510959830170264176955719827510e-03, + 1.716607040630624138494506282569230126333308533535502799235333e-03, + 6.394185005120302146432543767052865436099994387647359452249347e-04, + -6.906711170821016507268939228893784790518270744313525548714065e-04, + -3.196406277680437193708834220804640347636984901270948088339102e-05, + 1.936646504165080615323696689856004910579777568504218782029027e-04, + -3.635520250086338309442855006186370752206331429871136596927137e-05, + -3.499665984987447953974079490046597240276268044409625722689849e-05, + 1.535482509276049283124233498646050472096482329299719141107128e-05, + 2.790330539814487046106169582691767916283793946025922387556917e-06, + -3.090017164545699197158555936852697325985864588418167982685400e-06, + 3.166095442367030556603889009833954440058545355777781782000278e-07, + 2.992136630464852794401294607536813682771292352506328096125857e-07, + -1.000400879030597332045460600516621971679363965166249211063755e-07, + -2.254014974673330131563184851456825991617915549643308754828159e-09, + 7.058033541231121859020947976903904685464512825731230495144226e-09, + -1.471954197650365265189549600816698778213247061389470277337173e-09, + 1.038805571023706553035373138760372703492942617518816122570050e-10 +}; + +const double db22[44] = { + 3.862632314910982158524358900615460368877852009576899680767316e-04, + 5.721854631334539120809783403484493333555361591386208129183833e-03, + 3.806993723641108494769873046391825574447727068953448390456335e-02, + 1.483675408901114285014404448710249837385836373168215616427030e-01, + 3.677286834460374788614690818452372827430535649696462720334897e-01, + 5.784327310095244271421181831735444106385099957908657145590104e-01, + 5.079010906221639018391523325390716836568713192498711562711282e-01, + 7.372450118363015165570139016530653113725172412104955350368114e-02, + -3.127265804282961918033226222621788537078452535993545440716988e-01, + -2.005684061048870939324361244042200174132905844868237447130382e-01, + 1.640931881067664818606223226286885712554385317412228836705888e-01, + 1.799731879928913037252154295313083168387840791424988422757762e-01, + -9.711079840911470969274209179691733251456735137994201552926799e-02, + -1.317681376866834107513648518146838345477875022352088357523838e-01, + 6.807631439273221556739202147004580559367442550641388181886023e-02, + 8.455737636682607503362813659356786494357635805197410905877078e-02, + -5.136425429744413245727949984018884707909441768477091944584584e-02, + -4.653081182750671347875833607846979997825771277976548080904423e-02, + 3.697084662069802057615318892988581825637896696876361343354380e-02, + 2.058670762756536044060249710676656807281671451609632981487139e-02, + -2.348000134449318868560142854519364987363882333754753819791381e-02, + -6.213782849364658499069336123807608293122900450508440420104462e-03, + 1.256472521834337406887017835495604463815382993214296088172221e-02, + 3.001373985076435951229129255588255746904937042979316054485183e-04, + -5.455691986156717076595353163071679107868762395367234726592273e-03, + 1.044260739186025323350755659184734060807432172611689413745029e-03, + 1.827010495657279080112597436850157110235336772062961041154607e-03, + -7.706909881231196232880372722955519781655769913634565757339739e-04, + -4.237873998391800799531947768003976978197438302533528661825758e-04, + 3.286094142136787341983758471405935405823323072829619248523697e-04, + 4.345899904532003379046992625575076092823809665933575578710696e-05, + -9.405223634815760421845190098352673647881298980040512091599943e-05, + 1.137434966212593172736144274866639210339820203135670505287250e-05, + 1.737375695756189356163565074505405906859746605867772002320509e-05, + -6.166729316467578372152251668422979152169587307212708981768966e-06, + -1.565179131995160159307426993578204733378112742579926503832095e-06, + 1.295182057318877573889711232345068147800395721925682566394936e-06, + -8.779879873361286276888117046153049053917243760475816789226764e-08, + -1.283336228751754417819693932114064887075096030264748079976736e-07, + 3.761228749337362366156711648187743399164239397803629022612862e-08, + 1.680171404922988885554331183691280245962290247654438114807112e-09, + -2.729623146632976083449327361739104754443221903317745768938846e-09, + 5.335938821667489905169783227036804533253011117886586305435615e-10, + -3.602113484339554703794807810939301847299106970237814334104274e-11 +}; + +const double db23[46] = { + 2.719041941282888414192673609703302357098336003920923958924757e-04, + 4.202748893183833538390034372523511472345215563611003407984701e-03, + 2.931000365788411514736204018929480427874317460676079959515131e-02, + 1.205155317839719336306053895611899089004274336891709067958035e-01, + 3.184508138528652363416527748460472152790575031409830417259640e-01, + 5.449311478735204282674240672421984387504149924834544495466793e-01, + 5.510185172419193913452724227212507720514144116478727269717859e-01, + 1.813926253638400136259098302138614937264260737638175539416540e-01, + -2.613921480306441118856795735210118413900307577511142987337375e-01, + -2.714020986078430556604069575184718123763697177381058877113471e-01, + 9.212540708241805260646030910734894258577648089100630012130261e-02, + 2.235736582420402317149513960822561717689875252792817094811874e-01, + -3.303744709428937875006612792463031409461636228731285046551636e-02, + -1.640113215318759250156057837165276039181451149292112929401186e-01, + 2.028307457564929974897286607551313323418860610791382310375731e-02, + 1.122970436181072886950734465075645977754665593869789965874572e-01, + -2.112621235622724100704783293549467048999443844657058425212982e-02, + -7.020739157490110946204219011957565343899895499962369353294028e-02, + 2.176585683449997560776882472168730165799461445156766923497545e-02, + 3.849533252256919901057154320407596073180564628069920893870768e-02, + -1.852351365015615979794689960740674782817814176166333519597796e-02, + -1.753710100303584537915846117408613551147985251726558719415169e-02, + 1.275194393152828646243157404474947115052750581861997731041018e-02, + 6.031840650024162816289878206037841640814102314209075233751820e-03, + -7.075319273706152814194039481466556204493276773483821748740018e-03, + -1.134865473356251691289337120013286756337393784110786907825400e-03, + 3.122876449818144997419144765125750522437659393621577492535411e-03, + -2.465014005163512031940473100375377210862560761576109755841161e-04, + -1.061231228886651321139357625683805642193648671030425010215075e-03, + 3.194204927099011503676530359692366990929679170022583007683112e-04, + 2.567624520078737205563856675376636092314813400664190770435450e-04, + -1.500218503490340967673163290447832236259277810659068637402668e-04, + -3.378894834120903434270962452674534330903724108906662510305045e-05, + 4.426071203109246077621875303440935335701832843654692827539837e-05, + -2.635207889249186237209225933170897825432335273771458456888097e-06, + -8.347875567854625544366043748844183086765894974439245409223337e-06, + 2.397569546840240057403739507525641239509517148980849889986407e-06, + 8.147574834779447778085443041422881439860288287528356019216814e-07, + -5.339005405209421154584783682848780965053642859373536945701365e-07, + 1.853091785633965019353699857864654181728710556702529908304185e-08, + 5.417549179539278736503176166323685597634496102979977037271945e-08, + -1.399935495437998845130909687361847103274208993447892120341999e-08, + -9.472885901812050535221582074673490573092096712822067564903012e-10, + 1.050446453696543404071105111096438573423068913105255997908040e-09, + -1.932405111313417542192651899622541612314066389643607507706887e-10, + 1.250203302351040941433216718217504240541423430995137507404787e-11 +}; + +const double db24[48] = { + 1.914358009475513695026138336474115599435172088053846745168462e-04, + 3.082081714905494436206199424544404720984720556128685270556458e-03, + 2.248233994971641072358415157184825628226776692231940577581580e-02, + 9.726223583362519663806545734008355914527504417674578571164300e-02, + 2.729089160677263268706137134412557268751671263458895098625356e-01, + 5.043710408399249919771876890402814109246866444441814540282099e-01, + 5.749392210955419968460807901923407033144945935105622912839838e-01, + 2.809855532337118833442626085115402941842959475929278883281409e-01, + -1.872714068851562376981887159775791469060265778441667840307934e-01, + -3.179430789993627375453948489797707550898087789160025182664299e-01, + 4.776613684344728187950198323031360866349104994035553200788631e-03, + 2.392373887803108551973268291945824822214858134512317715815616e-01, + 4.252872964148383258147364472170645232684343235486951540533893e-02, + -1.711753513703468896897638515080572393949165942335556397917666e-01, + -3.877717357792001620177594726199572688446488033750771020190283e-02, + 1.210163034692242362312637311149062286659377039046006801523826e-01, + 2.098011370914481534980883827326017063121637262728447783605518e-02, + -8.216165420800166702291466006164189460916816748629968198028898e-02, + -4.578436241819221637997516339765068825260159169893967894877272e-03, + 5.130162003998087915555334881398688958843078494595140394873884e-02, + -4.944709428125628299815920032649550811877887219282751174798211e-03, + -2.821310709490189098113895361900699228886900995412759197674058e-02, + 7.661721881646585897329899904308764405384658404613669817843430e-03, + 1.304997087108573583052494067883717533043101857128653233783396e-02, + -6.291435370018187780721843581169343900864298634085743861509767e-03, + -4.746568786323113800477796959513558401732252800905982385017245e-03, + 3.736046178282523345179052160810332868725126356493155728625572e-03, + 1.153764936839481504858282495202271984454410046682805375157566e-03, + -1.696456818974824394274534636412116243080312601322325642741589e-03, + -4.416184856141520063365958900079406737636243682138363561877750e-05, + 5.861270593183109933716735450272894035425792347806515678695765e-04, + -1.181233237969554740613021227756568966806892308457221016257961e-04, + -1.460079817762616838924301818082729036314539476811023255670666e-04, + 6.559388639305634085303738560455061974369354538271316071502698e-05, + 2.183241460466558363365044032984257709791187640963509380549307e-05, + -2.022888292612697682860859987200455702614855595412267510558659e-05, + 1.341157750809114719319937553186023660581084151828593222893663e-08, + 3.901100338597702610409014129024223853127911530009766793352492e-06, + -8.980253143938407724149926669980791166378388013293887718404796e-07, + -4.032507756879971624098983247358983425236092110387724315244646e-07, + 2.166339653278574639176393978510246335478946697396400359281412e-07, + -5.057645419792500308492508924343248979317507866520688417567606e-10, + -2.255740388176086107368821674947175804005323153443170526520277e-08, + 5.157776789671999638950774266313208715015419699643333784626363e-09, + 4.748375824256231118094453549799175824526559994333227456737433e-10, + -4.024658644584379774251499574468195118601698713554294941756559e-10, + 6.991801157638230974132696433509625934021677793453732225542951e-11, + -4.342782503803710247259037552886749457951053124203814185811297e-12 +}; + +const double db25[50] = { + 1.348029793470188994578489247159356055370460656508881471268611e-04, + 2.256959591854779520121391049628056149270016860666661928130747e-03, + 1.718674125404015533817186914954848902241194002444696221013131e-02, + 7.803586287213267559750659320481403668422052199257139168386084e-02, + 2.316935078860218199900621518057089104946216881512075361624214e-01, + 4.596834151460945937896973864539659944010260858049947396093277e-01, + 5.816368967460577833534892038757085635755639698734580573323031e-01, + 3.678850748029466984371319740855532278670733841012809062966976e-01, + -9.717464096463814276130048169040892607068486428294030952842447e-02, + -3.364730796417461309562110148848845218930261030262170601615289e-01, + -8.758761458765466140226687673880006154266689569025041229545538e-02, + 2.245378197451017129525176510409543155930843160711989062118482e-01, + 1.181552867199598604563067876819931882639429216001523151773895e-01, + -1.505602137505796309518094206831433270850173484773520730186277e-01, + -9.850861528996022153725952822686729410420350758543226219234795e-02, + 1.066338050184779528831274540522414711301747903916268438037723e-01, + 6.675216449401860666895983072443984697329752470942906490126865e-02, + -7.708411105657419356208567671699032054872853174701595359329826e-02, + -3.717396286112250887598137324046870459877639250821705817221557e-02, + 5.361790939877949960629041419546536897037332284703545849594129e-02, + 1.554260592910229163981295854603203625062268043511894295387375e-02, + -3.404232046065334099320628584033729153497903561399447916116575e-02, + -3.079836794847036661636693963570288706232460663070983852354326e-03, + 1.892280447662762841086581178691039363674755753459524525886478e-02, + -1.989425782202736494289461896386235348901617760816745484282494e-03, + -8.860702618046368399013064252456556969199612331833605310278698e-03, + 2.726936258738495739871469244610042793734119359765762028996059e-03, + 3.322707773973191780118197357194829286271392998979276105842863e-03, + -1.842484290203331280837780430014195744813667655929909114672154e-03, + -8.999774237462950491085382524008429604309720852269895692000702e-04, + 8.772581936748274843488806190175921376284150686011179612908221e-04, + 1.153212440466300456460181455345639872216326644527860903202733e-04, + -3.098800990984697989530544245356271119416614147098459162436317e-04, + 3.543714523276059005284289830559259809540337561365927850248007e-05, + 7.904640003965528255137496303166001735463107762646364003487560e-05, + -2.733048119960041746353244004225286857636045649642652816856524e-05, + -1.277195293199783804144903848434605690990373526086311486716394e-05, + 8.990661393062588905369930197413951232059323587543226269327396e-06, + 5.232827708153076417963912065899772684403904504491727061662335e-07, + -1.779201332653634562565948556039009149458987774189389221295909e-06, + 3.212037518862519094895005816661093988294166712919881121802831e-07, + 1.922806790142371601278104244711267420759978799176017569693322e-07, + -8.656941732278507163388031517930974947984281611717187862530250e-08, + -2.611598556111770864259843089151782206922842627174274274741722e-09, + 9.279224480081372372250073354726511359667401736947170444723772e-09, + -1.880415755062155537197782595740975189878162661203102565611681e-09, + -2.228474910228168899314793352064795957306403503495743572518755e-10, + 1.535901570162657197021927739530721955859277615795931442682785e-10, + -2.527625163465644811048864286169758128142169484216932624854015e-11, + 1.509692082823910867903367712096001664979004526477422347957324e-12 +}; + +const double db26[52] = { + 9.493795750710592117802731381148054398461637804818126397577999e-05, + 1.650520233532988247022384885622071050555268137055829216839523e-03, + 1.309755429255850082057770240106799154079932963479202407364818e-02, + 6.227474402514960484193581705107415937690538641013309745983962e-02, + 1.950394387167700994245891508369324694703820522489789125908612e-01, + 4.132929622783563686116108686666547082846741228042232731476147e-01, + 5.736690430342222603195557147853022060758392664086633396520345e-01, + 4.391583117891662321931477565794105633815363384084590559889493e-01, + 1.774076780986685727823533562031556893226571319881417676492595e-03, + -3.263845936917800216385340830055349953447745005769416287177497e-01, + -1.748399612893925042664835683606584215248582345438816346170042e-01, + 1.812918323111226960705459766025430918716233584167982942044424e-01, + 1.827554095896723746537533832033286839689931924709760567945595e-01, + -1.043239002859270439148009137202747658420968144330108510179290e-01, + -1.479771932752544935782314546369458188243947772922980064071205e-01, + 6.982318611329236513756591683950208955110603212379412334701145e-02, + 1.064824052498086303236593797715344405836015002929319291715777e-01, + -5.344856168148319149493577269390074213960237013099439431132086e-02, + -6.865475960403591525454725258715351280947435823354011140858001e-02, + 4.223218579637203541206570902753288247790857760067894456114927e-02, + 3.853571597111186425832144567362328142994885395255438867968781e-02, + -3.137811036306775484244644776337594435094096964336402798072360e-02, + -1.776090356835818354094298625884058170354129044259951019182732e-02, + 2.073492017996382475887790073068984224515077665517103399898854e-02, + 5.829580555318887971939315747596613038479561943085291072787359e-03, + -1.178549790619302893728624468402138072504226527540325463847390e-02, + -5.287383992626814439198630765217969804966319971038003993984480e-04, + 5.601947239423804853206514239940474788977188460452053462770324e-03, + -9.390582504738289646165698675070641765810790863514339205205998e-04, + -2.145530281567620980305401403432221668847980295600748913748902e-03, + 8.383488056543616046381924054554052104937784379435436426690560e-04, + 6.161382204574344193703789012696411561214682388271673214197731e-04, + -4.319557074261807466712901913481943478521991611607433971794602e-04, + -1.060574748283803889966150803551837402553866816191659959347053e-04, + 1.574795238607493590547765666590811258087715699737771458390360e-04, + -5.277795493037868976293566636015627609248847457646525246271036e-06, + -4.109673996391477816326502438997466532822639385119090230965252e-05, + 1.074221540872195031273584409245060623104931330938273936484593e-05, + 7.000078682964986734859102495210684809643657474253921074934684e-06, + -3.887400161856795187587790410706550576033603097954065074023128e-06, + -4.650463220640262639231145944536092973446596027469833860001618e-07, + 7.939210633709952088373459255067360793370284788682979065122810e-07, + -1.079004237578671411922961583845716126060658213943840375162654e-07, + -8.904466370168590769052983362721567202750591914741016835071257e-08, + 3.407795621290730008673832107214820587991557116806912418558069e-08, + 2.169328259850323106986222296525930099935873861026310788086221e-09, + -3.776010478532324328184043667556576385639846460337894963138621e-09, + 6.780047245828636668305808192607091517605349478677442468580825e-10, + 1.002303191046526913509281844136258004034177309673269533418644e-10, + -5.840408185341171468465492447799819262905317576847426970757700e-11, + 9.130510016371796243923232926650252570239054815939483900056681e-12, + -5.251871224244435037810503452564279828539007071678724285717464e-13 +}; + +const double db27[54] = { + 6.687131385431931734918880680779563307675740731544063787599480e-05, + 1.205531231673213234251999812212394463872002561229330125152073e-03, + 9.952588780876619771874091297340545740163119816300838847749336e-03, + 4.945259998290488004302995584228917712171023349013386944893643e-02, + 1.629220275023933206396286389387812803673796872000118325233533e-01, + 3.671102141253898226423388094379126394383458407087000700420400e-01, + 5.538498609904800487605460395549044755068663194750017660900436e-01, + 4.934061226779989979265447084358038959373468583404767251300717e-01, + 1.028408550618229112710739475157388764479351682549490307668477e-01, + -2.897168033145948463175311101489473923261698802610323264603418e-01, + -2.482645819032605667810198368127693701263349361209208170092197e-01, + 1.148230195177853576326445213787661879970642975306605349249036e-01, + 2.272732884141708265275037216925482827043581894357907763081103e-01, + -3.878641863180231062443346843661817078060143110529946543683356e-02, + -1.780317409590085821070366277249759321269342801053489323888575e-01, + 1.579939746024048431173907799261019471878724997312653292884660e-02, + 1.311979717171553289711406975836688896451835867594492827800969e-01, + -1.406275155580876537026622167053147161846397735962817855782362e-02, + -9.102290652956591798241345515773322449830692586525337562864481e-02, + 1.731101826549371089085675445961947677452358872325373949295769e-02, + 5.796940573471798814748840657698008349462526768238833307489106e-02, + -1.851249356199807710545837861298826718763077900221574749342712e-02, + -3.273906663102087145481936428049519742538150452785563039743756e-02, + 1.614696692239566682272152627542980896527822528487665111124260e-02, + 1.566559564892457873003263983940819950829497022298967052103291e-02, + -1.157718645897628140054089958116866381056430680879332334217267e-02, + -5.862096345462925972966025215266179082657169806555503857975278e-03, + 6.856635609684880675273184141746359000591385833807880272568038e-03, + 1.342626877303679609082208800217479591902967766971379107017011e-03, + -3.332854469520006162763300141047111065412307706449049389557931e-03, + 1.457529625931728587128588244152604734177322144376309490881599e-04, + 1.301177450244135139135787970279897042994109161268159963884641e-03, + -3.418351226915427611946547437228006377896519777431057005796358e-04, + -3.879018574101327604369144470124819695479087900682219330965466e-04, + 2.019719879690326857104208791272390315160018069955787875123234e-04, + 7.660058387068576876674274961751262847965101108848090019821555e-05, + -7.711145517797584208411720507329584053382646435270054267102827e-05, + -3.517483614907445391752737841583832374184046409747387149129674e-06, + 2.063442647736885318487206413360228908558806028468062177953960e-05, + -3.901164070638425528170558032557368703418425915665413541985623e-06, + -3.657500908187104997045760131046655906827644494899206692043298e-06, + 1.634369624725637835424610743915128591988676092276368687669255e-06, + 3.050880686251999094242671997731089918322345713516567387655763e-07, + -3.472468147394389269364673179891460601330730511237974736379548e-07, + 3.286558968055159530983261866450459360074591641809187825408848e-08, + 4.026255052866908637178682747490340533992340623231336911661711e-08, + -1.321332273990056558848617809101876846857728483295631388083263e-08, + -1.309465606856955151282041809232358209226373823424148862843577e-09, + 1.521614984778521740775073159445241799352681846880808663329946e-09, + -2.415526928011130660506395791946234018673860470542996426005750e-10, + -4.374986224293654395069947682013996351823060759948583134078918e-11, + 2.213662088067662485181472969374945928903854605356443772873438e-11, + -3.295790122476585807069953975043096139541415768606924980926275e-12, + 1.828188352882424933624530026056448539377272017834175009418822e-13 +}; + +const double db28[56] = { + 4.710807775014051101066545468288837625869263629358873937759173e-05, + 8.794985159843870273564636742144073059158975665525081816488582e-04, + 7.542650377646859177160195786201116927568410621050693986450538e-03, + 3.909260811540534426092083794403768111329778710541126982205076e-02, + 1.351379142536410450770749411679708279921694061092200363031937e-01, + 3.225633612855224257318486139030596702170126503618082416187649e-01, + 5.249982316303355562348293243640252929543774162151269406404636e-01, + 5.305162934414858075256978195354516449402692654391295761050628e-01, + 2.001761440459844380384404537971725815970574972480152145882083e-01, + -2.304989540475825257279397658067038304888129374484095837624889e-01, + -3.013278095326417816909366061441334075444383937588485826752087e-01, + 3.285787916338710468450547883547348694255260871071954509422161e-02, + 2.458081513737595535752949960866466132239832334168533456626848e-01, + 3.690688531571127205290633425993077868843846977265847006108551e-02, + -1.828773307329849166920408764650763092868965221608724574218473e-01, + -4.683823374455167616514752420549419665215987106243491879971921e-02, + 1.346275679102260877490923315484152662987698625205479167761416e-01, + 3.447863127509970524678534595639646616244376966117385829345554e-02, + -9.768535580565244174963692133038973587005628990493154911133358e-02, + -1.734192283130589908795581592406238282930530566316914040035812e-02, + 6.774789550190933956165341752699717255041141690153626336867769e-02, + 3.448018955540951137600471926079622335842207388713342609755316e-03, + -4.333336861608628393863254980828284403766309203453808666888800e-02, + 4.431732910062988320487418656322338284504389482966303454010563e-03, + 2.468806001015186586264188361362046240243934625858343309818244e-02, + -6.815549764552309639259447104811254179605050667281644254737890e-03, + -1.206359196821849005842466619530619474644989878503490321948471e-02, + 5.838816627748944864497370576838809711476027837762897602935327e-03, + 4.784863112454241718009916669120329848973107781600157214960003e-03, + -3.725461247074254799171427871442937099025589672466088044410521e-03, + -1.360373845639692436577650137133777929659265166644839235882291e-03, + 1.875998668202795626152766912508562385106168761893900192731562e-03, + 1.415672393140464257573780581396205840941849282748250523509874e-04, + -7.486749559114629991320679819683227355746847370960399216568306e-04, + 1.154656063658921251969297916771881248142872975490882572741198e-04, + 2.295790982233456202366621544054366855729175050420515776344878e-04, + -8.903901490044488099517361247378396756893227855233897357882978e-05, + -4.907713416190250858324783990436748073854807494400738311968278e-05, + 3.641401211050802781223450761733180188911730291497201507086247e-05, + 4.638664981394294654002871426476885751050837817671843706915388e-06, + -1.004326041333422601781848560432120920634648692782357855473103e-05, + 1.247900317574834146052381692752796047052443265982232422642017e-06, + 1.840363734517769191684379309039277810350620305330900536404818e-06, + -6.670215479954892588747450458085225880096882699397256774967304e-07, + -1.757461173209842779903676264971918635870906983281392939812547e-07, + 1.490660013535362170989340065033061951960933954388633507264360e-07, + -8.262387315626556965966429243600984899650039704831080988658278e-09, + -1.784138690875710077191713941441263246560738410213624546116655e-08, + 5.044047056383436444631252840057862002264087720676808580373667e-09, + 6.944540328946226952976704718677697525410051405055662575530111e-10, + -6.077041247229010224760245305596307803830053533836849384680534e-10, + 8.492220011056382105461206077240377024404404638947591299761197e-11, + 1.867367263783390418963879146175452376940453585791428841004699e-11, + -8.365490471258800799349289794397908900767054085216008197372193e-12, + 1.188850533405901520842321749021089497203940688882364518455403e-12, + -6.367772354714857335632692092267254266368934590973693820942617e-14 +}; + +const double db29[58] = { + 3.318966279841524761813546359818075441349169975922439988843475e-05, + 6.409516803044434540833706729120596322083061716935004987374676e-04, + 5.702126517773375434760843998623507494914551464968126455168657e-03, + 3.077358022140837676716707336516751814713312018344719150923618e-02, + 1.113701169517405304762186166370327770191325772342190715118617e-01, + 2.806534559709829376968881262770480606500920092398534229615289e-01, + 4.897588047621993143592705932993573539235839610055331620240518e-01, + 5.513744327583751951223746071670135992466984391233429663886536e-01, + 2.891052383358291634605691113586264061513180158354460952469246e-01, + -1.540287344599000542466293779503370141731339982919280951230240e-01, + -3.300409489175880520295083779487012611959310539629627124613719e-01, + -5.570680007294085781514541931715795784309410235726214400350351e-02, + 2.361052361530259415983110734054626770649468357328362426830433e-01, + 1.124191748731883764769740670535880543076817816861518667898467e-01, + -1.608779885941877360771615465531852333085159940159968393590303e-01, + -1.078459499387214201077881957354707913786241153934264316589273e-01, + 1.144722958938182579734135930060053286267822797640393386903440e-01, + 8.322074716244975790297348835032537357891920536002627784941129e-02, + -8.512549261563550232832311331420804581881235448862834507281486e-02, + -5.502748952532572320924541450626650067707344725344841099873446e-02, + 6.347916458421186633577789314698972361081611994794140119302163e-02, + 3.053154327270413646637328212093941030592133225231728964047047e-02, + -4.518798127778834515979704475304405691390090327474972089790857e-02, + -1.291714255426679462966473962555410660387671182428076570686472e-02, + 2.947043187174764111028122319949903667638786379520519899154373e-02, + 2.648327307678167915542397563479749119673768286990136051577167e-03, + -1.704122457360668969234196743407615179099529206118693044741086e-02, + 1.737880332720511164430027824345354801611373419264590068097416e-03, + 8.469725493560752287772961661104710791306496373354237126998903e-03, + -2.550807127789472659145072247724735637183590942511858255354005e-03, + -3.473798989681100630649790255076233970957721666820195620598374e-03, + 1.877120925723650133179338154344873477230567340668548016358682e-03, + 1.087053942226062966738944397844498417945523630053411148182206e-03, + -1.000778327085680541055696707760062870925897014530348262794137e-03, + -2.000711363076779808296301110796026470163110202848894744316755e-04, + 4.111283454742767033424740543004041500054889660665367490129376e-04, + -2.292018041214499897382298271438084577065170236103859181134525e-05, + -1.293044840080720609161466939678226852440475312744714379499074e-04, + 3.645026068562774967665464216602750761690984830805534178557146e-05, + 2.913344750169041218495787251929571015775436967652945386217480e-05, + -1.657328395306616289863396387854880512976861409870690029695161e-05, + -3.593644804025187638066915189731950450034629392522542962477168e-06, + 4.750609246452552850197117564759363194953518317428400241629683e-06, + -3.029054592052818286474228294307141792053791695855058563299597e-07, + -8.975701750636280734511651941681818767895052287332471537510510e-07, + 2.633898386997696553900967704111473475368019612368922599394214e-07, + 9.387197411095863026484410601284876812292554863800653292318725e-08, + -6.286156922010786166768503252870590953166867739448102804392389e-08, + 1.076591906619196137385201975028785139607670319821266803566785e-09, + 7.768978854770062238895964639391324551611701293594055935346266e-09, + -1.893995386171984147774611076618946011337498790609031626697228e-09, + -3.426800863263089001811012278889864200550342566386405676893537e-10, + 2.407099453509342962399811991929330725186626582891090462239366e-10, + -2.940589250764532582888473974638273664244682541297835986306504e-11, + -7.832509733627817032356556582819494794884131433810848844709881e-12, + 3.152762413370310423797539876893861621418382024668704492620948e-12, + -4.285654870068344101898185073376307686875386259541180967347399e-13, + 2.219191311588302960934661700068023727737812918006011019184982e-14 +}; + +const double db30[60] = { + 2.338616172731421471474407279894891960011661146356580425400538e-05, + 4.666379504285509336662000111055365140848987563882199035322085e-04, + 4.300797165048069510045016757402827408493482974782286966500398e-03, + 2.413083267158837895194919987958311943976725005113561262334092e-02, + 9.123830406701570679321575555085899708564500191080751595642650e-02, + 2.420206709402140994467599658342919512318194032687898436229538e-01, + 4.504878218533178366981351802898336415314944375740699506554771e-01, + 5.575722329128364304078082520999850413492571645754785374629734e-01, + 3.662426833716279793144871151369089533016299234992584741629624e-01, + -6.618367077593731501909741041813726474911212544474895441395148e-02, + -3.329669750208556069196849320598850505877494561268613506392514e-01, + -1.419685133300829310219026267403758254954270602825020111483505e-01, + 1.994621215806643032428990062111230223523226088131364328774921e-01, + 1.778298732448367361280250921330425046260289700971176750362566e-01, + -1.145582194327077814891518778613672243404957549114393749173137e-01, + -1.572368179599938126878197378886501553251711910617673398124611e-01, + 7.277865897036442699893544326605244235248713804556715604416632e-02, + 1.227477460450093778691578797698150091624353365248212907325446e-01, + -5.380646545825707676022015051837304300338645984615639237930800e-02, + -8.765869003638366048026572053699028353846982304851342479893827e-02, + 4.380166467141773250305407710250135373016604593736480428415303e-02, + 5.671236574473569492590636983030617493807140224924978946302257e-02, + -3.567339749675960965780819743176056734137251336781389369397564e-02, + -3.226375891935220815954913483392725682165778426411705216010280e-02, + 2.707861959529418272206848318420006522973840949600186710327776e-02, + 1.528796076985739546052896626042375110302102640936712142026221e-02, + -1.839974386811734118728169880549148389603890445324127330811811e-02, + -5.296859666131086629169938675330494864053932988161015674773617e-03, + 1.091563165830488927536881480211929049886878831313700460017968e-02, + 6.196717564977244383592534999284255315694546230739551683085460e-04, + -5.530730148192003288871383856487027893918513053091795443517653e-03, + 8.433845866620933982126003584365932145598126087481400294999080e-04, + 2.324520094060099304385756339638431339131122661576649123053845e-03, + -8.609276968110423879660725173525347077801305237644122054954659e-04, + -7.678782504380918697963922441514742758516706160788123977340073e-04, + 5.050948239033467796256544554086554367969638627715114003635557e-04, + 1.724825842351709725545759714374272164367933578194910678479473e-04, + -2.161718301169633804271038862087964094429005266172702380483361e-04, + -8.548305467584070994787824796256108217987765582429940610377190e-06, + 6.982008370808327851082027193100914402221658444151889697045071e-05, + -1.339716863293971629296314599448901465078920406443516550195793e-05, + -1.636152478725426488654528710478856195004608401773950511915162e-05, + 7.252145535890469015723401169934327900622894130695550273452916e-06, + 2.327549098493686509557358103785598216688723737824121617676858e-06, + -2.187267676996166416699555236143059249832615777542412142603694e-06, + 1.099474338526203304286307383463498542376432972308342428764576e-08, + 4.261662326011572446469849114416378817419458434583398455985144e-07, + -1.000414682354500898864979332965559934104686157639553850670490e-07, + -4.764379965139453357729154748688006975561934425368712852985388e-08, + 2.605442754977625431940885841950955928085338672381046225838880e-08, + 5.553397861397053982967618072672572206490972606026556946910028e-10, + -3.331105680467578245901976412732595596538702049437802824373020e-09, + 6.984862691832182584221096665570313611280449991512869846064780e-10, + 1.613622978270904360610418704685783656905979134344922647926295e-10, + -9.461387997276802120884525814092001871993910062127702293573920e-11, + 1.000105131393171192746337860330428369495110180346654025287492e-11, + 3.239428638532286114355931428908079297696045600279108835760520e-12, + -1.185237592101582328254231496310584611948560976394420324137742e-12, + 1.543997570847620046003616417646988780670333040868954794039905e-13, + -7.737942630954405708679963277418806436871098329050829841696327e-15 +}; + +const double db31[62] = { + 1.648013386456140748122177817418358316441195236228590958603489e-05, + 3.394122037769956699157160165352942212213928231154233571163033e-04, + 3.236884068627721221829662672296912258338131668810067169630813e-03, + 1.885369161298591269159568944275763468999829139547989648553486e-02, + 7.433609301164788697908776495388047669378919816041031344650271e-02, + 2.070128744852353286198055444111916450619762837756134323019573e-01, + 4.091922000374278563928213235836188963704298775635493549519369e-01, + 5.511398409142754983590484577074663132074992263886810324421617e-01, + 4.294688082061372955430413148799008354573408538414331312236645e-01, + 2.716921249736946422305354732634261873401679092095992827198308e-02, + -3.109551183195075186926560285811004715398678229333522634202008e-01, + -2.179784855235633521693544507220105631639547435903112747133934e-01, + 1.401782887652732681656253206993073895422881511380152633441096e-01, + 2.249667114737370933697297905066886078307490136415302624018330e-01, + -4.992634916046823977000579399730138693074543903234092797936484e-02, + -1.869623608957154494374577196258383009208655076187653847079167e-01, + 1.543698842948893409652995335281236231845293548571166883219023e-02, + 1.450895009319931981518942907854879059128872873116921504156674e-01, + -8.139832273469236863527708715566588550006680549152344840146851e-03, + -1.076127733234956326668605511648013952380301953590447106075614e-01, + 1.094129745236496925725237900637802669504835743555466811796369e-02, + 7.535361174328140695528289751109133941376701984419452638686226e-02, + -1.488002661810482202699555987503429289100801979910046913257306e-02, + -4.861907546485433003537603385831190109391263542044516048871113e-02, + 1.615417156598591113619453864586701665635869166193865651960591e-02, + 2.804761936675616906861927211659154977049392281479113764697785e-02, + -1.427627527776351943309800140756746087215016194775579070599004e-02, + -1.390055293926652880755898888934447671732373519028670201124816e-02, + 1.051763948737184089128633441244991643331033825102031908858652e-02, + 5.516163573310992566561289762241160214476622662764637181816550e-03, + -6.520852375874612553325469682628530079210293774541131381751695e-03, + -1.428264223218909891400516038687842292177211292295049238921068e-03, + 3.393066776715931928419358796960612411097347419792355896915546e-03, + -6.397901106014600492881202314307290077992972755016494062875201e-05, + -1.459041741985160943114515221598080223845239255190055621901681e-03, + 3.431398296904734438118401084929505912208229684629857530009147e-04, + 4.998816175637222614896912406679513231966722440032799024979502e-04, + -2.396583469402949615285646688069476140260781708006174912535660e-04, + -1.243411617250228669409179807383399199879641177993453588807726e-04, + 1.089584350416766882738651833752634206358441308880869184416670e-04, + 1.501335727444532997071651937630983442758297688087711521441229e-05, + -3.631255157860086164261313773172162991107348698083164489165837e-05, + 4.034520235184278839752741499546098778993926344831736074409765e-06, + 8.795301342692987765440618030678349427367022581211855857458220e-06, + -3.035142365891509630069007852947057220760887215249503512783023e-06, + -1.369060230942940782050489751987123955074404782177163471279285e-06, + 9.810015422044371573950976088058064384946146188110905321673802e-07, + 5.327250656974915426977440959783080593776012130063170688309127e-08, + -1.975925129170206248152121156696590501303803187231928513867046e-07, + 3.616826517331004805247567218405798591329788122337274956172315e-08, + 2.328309713821409644308538888589329921141948539678106680777082e-08, + -1.061529602150252306500404266150823962402673780484965538270541e-08, + -6.474311687959861398702581539341954438747926255671605657095807e-10, + 1.408568151025177427076547804944585301332087108125727813194374e-09, + -2.524043954153353306183643702933218308617979467184848456565837e-10, + -7.348930032486263904766913919653624379586487437915175106407348e-11, + 3.692108808871129411604189196259677640440919369478263728899602e-11, + -3.327008967125979929910636246337150851642079794871116041187279e-12, + -1.324334917243963163878274345609465717294426628053460151843705e-12, + 4.445467096291932163298411852093011459626037560439178917611592e-13, + -5.559442050579014337641375730083534521513818164827556763756543e-14, + 2.699382879762665647295493928801387173921314576598505507855504e-15 +}; + +const double db32[64] = { + 1.161463302135014885567464100760659332951431420121048996305591e-05, + 2.466566906380903352739104211274667134470169443886449124673996e-04, + 2.431261919572266100780423071905958127811969678055971488060574e-03, + 1.468104638141913563547809006402194831107662001343421893488086e-02, + 6.025749912033537081745451975527967031851677384078997261920024e-02, + 1.757507836394388988189299915753348505208376399651864661397588e-01, + 3.675096285973496361995340339143234125206079560406868595968025e-01, + 5.343179193409538322901117858552186425529774700290587495921679e-01, + 4.778091637339484033555130814414794130354053753675509287934741e-01, + 1.206305382656178269538098710665261299391507308342013788891222e-01, + -2.666981814766755535489784087869865024226542605534080371507405e-01, + -2.774215815584272153338153320303401666681294506143291967655666e-01, + 6.471335480551623831000090095167664918448659157720155321560811e-02, + 2.483106423568801736064852157222867588791898170114101300999760e-01, + 2.466244483969740441701479334808723214802614938081258920635302e-02, + -1.921023447085468984341365278247990525863123891147783426068990e-01, + -4.899511718467173853355943225576377418394280156945986899417475e-02, + 1.452320794752866460838830744051944832326998342053148426312341e-01, + 4.440490819993974022640619534046603571086531544468421519143629e-02, + -1.094561131160893831027722774343269232755171130623890041619420e-01, + -2.962787250844770491204452379051215505049068645551070779367843e-02, + 8.087414063848395744090831590426327690818854671836423275412813e-02, + 1.410615151610660772869738802931740150275269382463799031013905e-02, + -5.692631406247843550478416271158537960555270097953330567652364e-02, + -2.380264464932573834443178362086503847328134994591954135879789e-03, + 3.705145792354468010437633458013030898015496905609424004450953e-02, + -4.145907660827218781460700428862611061267328108653649653634276e-03, + -2.166282283639119347634778516947485598599029367518033869601702e-02, + 6.167527310685675112579059689520105004744367282412921739811164e-03, + 1.101740071540688116532806119564345712473051769079712407908648e-02, + -5.411568257275791208581502410752383050600045942275647685361370e-03, + -4.649216751184411528658094984504900172989190128905887602541396e-03, + 3.627224640687864960122122984391704782343548385375321260251988e-03, + 1.468955100468467772528811782840480639166582822577191079260543e-03, + -1.964740555821778254183647540656746450092725858126595984907304e-03, + -2.211678729579097916278097586914956834196749138610403102772710e-04, + 8.673058518450555343925662389563539890596549655683386287799624e-04, + -1.024537310607396186949656796812972062290796122915930356634122e-04, + -3.059654423826911750479261161552574500739091332121504634422577e-04, + 1.053915461739828114700905192091104141076083602686374410146603e-04, + 8.103678329134838389828091896334156224227821362491626044950428e-05, + -5.259809282684322782648914338377962890245975842272425408122506e-05, + -1.294045779405512723950480259110995722517019870286295908085366e-05, + 1.824268401980691220603850117995712615809177092802967489081228e-05, + -6.361781532260254953363913076575914206506177493714496098327288e-07, + -4.558309576264423135123964145585288808181431652781253437738445e-06, + 1.202889036321620990296134494079846952404216422923750605507047e-06, + 7.560047625595947819392627283726711361273296630256477108501994e-07, + -4.285970693151457255418342315045357407199066350632593899896712e-07, + -5.003361868748230293692887222336390314786090450819216035110269e-08, + 8.965966311957728376981484572655177545054433542721057470726361e-08, + -1.219924359483373093110396748985081720383992859961285213840740e-08, + -1.104383021722648979552131128575075255513372249283096583736746e-08, + 4.250422311980592983740943309197245384991941251563471671065543e-09, + 4.384387799940474369553236949848427579687147486892033587998023e-10, + -5.881091462634605628881794361152305108432139465417759716875076e-10, + 8.904723796221605490455387579189371137903330749397374037644960e-11, + 3.263270741332907875981844980104948375955551273115386408552080e-11, + -1.430918765169202320188022211739750594608742928641485026836608e-11, + 1.075610653501062115165734990153347111902874668945095034791947e-12, + 5.361482229611801638107331379599434078296259332654994508124989e-13, + -1.663800489433402369889818192962259823988673359967722467427927e-13, + 2.000715303810524954375796020597627467104635766752154321244151e-14, + -9.421019139535078421314655362291088223782497046057523323473331e-16 +}; + +const double db33[66] = { + 8.186358314175091939858945975190102731733968885547217619434602e-06, + 1.791016153702791479424389068736094134247294413108336017758506e-04, + 1.822709435164084208084617771787691709255513374281497713580568e-03, + 1.139594337458160925830840619716397130445853638888472948832932e-02, + 4.861466653171619508385707681587366397164931431125053574327899e-02, + 1.481863131800528081784673514426737436792606299953305691300616e-01, + 3.267181301177075783930752787756046348844272437670999719562429e-01, + 5.093761725149396552227892926384090200953139820961482931291482e-01, + 5.112547705832674655425831875568453973369927971748064975152374e-01, + 2.095823507130554216526494469993023406452629154801126958766008e-01, + -2.042026223985421049629055102642279430174095014493415546881477e-01, + -3.159974107665602561905181464284910961862968513875028980451424e-01, + -1.927833943695275915600583425408664108893845271616240406358226e-02, + 2.454206121192791114179964351253140999836791489738418857473689e-01, + 9.985155868033815698139640215477639365289384281516885362929979e-02, + -1.714280990518593279308738113273443832545615219650436927029674e-01, + -1.108441331167107910806084983056783194189909198734302929909672e-01, + 1.219678564037346149389134584371009777591763921148126952722200e-01, + 9.478808805061595889263191779090571160237408179346345390888721e-02, + -9.114696835133148913093153757138373418923462847746880902676089e-02, + -7.030248505405615921453280814171665167171986608963193275084895e-02, + 7.019114394099653254998935842432841393915841096633514680190145e-02, + 4.573456189389667743139040427641638967843459421665709740086516e-02, + -5.347125133582228919431110824663168583260050383336359554980188e-02, + -2.524858297747649929258392207837724793937727346177294684700378e-02, + 3.868706076024496481748675031852528047303323816250150793091832e-02, + 1.070326582001954942654534968137727769698168853186071888736311e-02, + -2.572876175473297336123211392278301875687760837710204579628265e-02, + -2.167758617353607324783298657172830203896433848418061622436727e-03, + 1.531695411585766548347442266431874060229304787191589430967538e-02, + -1.594288782414604768637856446111392724059836934455189837500244e-03, + -7.953540387057939240459305406538116220678495240302592677582773e-03, + 2.389062408165908575935815973439728988151836094753689966108405e-03, + 3.480800953405711999411461002429227385937942254778524257436278e-03, + -1.860718214455795912074482150710567824317228203897000129729967e-03, + -1.204309257604658876916644980097327372892008586047095719636829e-03, + 1.074380696351291355073899234941719080473877020595209197706651e-03, + 2.727305847336937211749282358350196461733595290569540045817329e-04, + -4.908329007590351474487792254066540683724948757382104652497458e-04, + 4.393166251766185755059005296958129844094063524324718175254673e-06, + 1.780431898251245351831728023200069586928513661382622116969992e-04, + -4.160438516273709306234368807933932360567787692918883118883736e-05, + -4.929564423417301834310231482621574127409950921583062559483686e-05, + 2.423335398816890365621188379922041046073808819182024026589770e-05, + 9.070805757828453800203677464921508178468256685438211818575040e-06, + -8.866121366757736169176034432364298134186929098274651022820760e-06, + -3.607516102879771631230351118595069330196155459105589342866625e-07, + 2.288371276141527305481395545993763010565968667577768164201792e-06, + -4.426923407952870147984002129341809185622768353983550670755106e-07, + -3.985791291985944076942626511739220753169387460984290019185514e-07, + 1.822443332571053437467128998002798233969112236553215291639303e-07, + 3.377972703730854377516206663481869099376154259897212784144779e-08, + -3.987838198518880722819502850814936369197384392561970319349663e-08, + 3.672863576838181340505563759379169099717712645283448779390320e-09, + 5.111211857347453839549366593998758891130921028374576213256027e-09, + -1.671392677251932495173219614104411841891545601521784559793012e-09, + -2.496402105246193648073519269370197331176405371538404298745013e-10, + 2.426833102305682309891302883361232297664099485514601790344279e-10, + -3.049574453945863430361296931455141500128170151643206937547928e-11, + -1.420236859889936792437077844940412749343225644487770840543290e-11, + 5.509414720765524548752673631197714447818740985929081064907524e-12, + -3.343481218953278765982532722689984725170758193566174566492199e-13, + -2.152488386833302618520603545685994753329478275805993737095214e-13, + 6.214740247174398315576214699577230693021307854673557214652751e-14, + -7.196510545363322414033654470779070592316600780697558361083151e-15, + 3.289373678416306368625564108782095644036415401902518812978798e-16 +}; + +const double db34[68] = { + 5.770510632730285627466067796809329117324708919047900817738025e-06, + 1.299476200679530037833484815390569400369432658207722720405084e-04, + 1.364061390059049998200014449396877439591680435610837369411339e-03, + 8.819889403884978803182764563095879335330977939541630862804757e-03, + 3.904884135178594138905026219591569204043816577941517019631916e-02, + 1.241524821113768081954449898210969172708199672428635378051285e-01, + 2.877650592337145629334256618087718872558560120999651277991839e-01, + 4.784787462793710621468610706120519466268010329031345843336104e-01, + 5.305550996564631773133260223990794445605699030503652382795600e-01, + 2.903663295072749510455945186199530115755664977934564128822650e-01, + -1.282468421744371672912377747048558427612774932943748628650824e-01, + -3.315253015083869417715548463087537345035828886426345397256876e-01, + -1.038919155156404718287260506925867970596448618647006698388596e-01, + 2.169072201874275950610018667099322465619408030256534197819784e-01, + 1.666017504122074437311574334509261366682993700573488534577890e-01, + -1.273373582238011562843862636988693890108793629966541695807247e-01, + -1.609249271778668063014799490429649196614628857267382976958607e-01, + 7.799184693794810738265349531832015087096882277333968473726399e-02, + 1.341259602711361284802399913977387999358280900708582462625539e-01, + -5.448296806413904636632671383140642554265865948686157271017286e-02, + -1.029475969928140852342073823689090498245496056845473569066667e-01, + 4.357609464963129726428486610925800727137724136370669421246609e-02, + 7.318523543679560555546221335452045680757998947493883124934567e-02, + -3.701283841786244960356402125554190040750079009127461655784927e-02, + -4.743855964527776247220681410983851377889756018716427358008296e-02, + 3.073974657395934459931226513844134346305562928466993208164603e-02, + 2.722835075635419610095839895805858855202745897718117731496534e-02, + -2.367173792282636485046786438094940427456079528043555566867110e-02, + -1.314398001665716086105827506126287041342680578404007359439612e-02, + 1.640937419986519252112261495537409592363156309874473310057471e-02, + 4.713649260999809905918876125437488856235874027077755004539205e-03, + -1.004550670836151917439146861146431000364858401181337134891421e-02, + -6.194748845153872839014356621835501857322345445234809347431098e-04, + 5.334950768759936032170270195983921511565539100791906952901398e-03, + -7.692127975067836975989490900561029844887285335804349474993607e-04, + -2.399453943537055863933124827688081952701780599883067560501870e-03, + 8.589959874363661955444898475746536583497522107459291718900058e-04, + 8.751999064078688732610570055224339733760304773327228476255647e-04, + -5.527355762144197975516415296735124460550632283763688359649888e-04, + -2.326732140233531635428863212833942245597361085708567528230733e-04, + 2.650772397558057819755811309071002543822145660933016957735937e-04, + 2.660050018453441903046828468025589086403126180798464347801678e-05, + -9.914697770780134603580350758869378471802751837608461971022567e-05, + 1.353117227249649581251887376414486225127346352042209141315562e-05, + 2.844951419697807376503080001943765930601242225183893658540032e-05, + -1.057657494257950623848316304755218120233253479317574337409622e-05, + -5.710826510998303938275050074333400305512451419983646591762318e-06, + 4.169871758547028398316761659984928804362023643629741358799744e-06, + 4.979718101421307748081857636471761057429219265531618602960147e-07, + -1.116306534817008428597995070751765080383261658112656948526954e-06, + 1.448195708333185127061180618150009526758658641231104901703561e-07, + 2.025990666667859216690536885693725545344933235432307649205497e-07, + -7.526701740412589411177481797841044281662555785969415398369019e-08, + -1.990346501531736915866180448337614967570744211158241514589121e-08, + 1.740423332936068076497051274445147160190783847854409836489662e-08, + -8.665744261368722215864741166245385888818567571145958531936939e-10, + -2.316501946995482751582294240136010067415084499025753117941001e-09, + 6.446378210323402313101214894500231181606520211579581132442548e-10, + 1.300410318609415248880403259300467720631189120978928377152233e-10, + -9.904774537632409015479530333979124540183199174591377762845227e-11, + 1.004208735461769864836516428998306778031143650101842361622330e-11, + 6.080125354000167254059025929915591291115751734288584563131636e-12, + -2.107879108915301546285370395443778864676275235126044599683271e-12, + 9.799451158211597727901178520526388692140586041163624252991805e-14, + 8.579194051799733179793112298652600511486581216528683482143106e-14, + -2.317083703906408481078257081903089523234020423092175261925515e-14, + 2.587338381935699555813538163144986688834142571207152879144731e-15, + -1.148944754480590128244815794312606245147888158018823490936280e-16 +}; + +const double db35[70] = { + 4.067934061148559026665247110206084571051201477121972612218005e-06, + 9.421469475576740631603027533116630224451049736050903361458759e-05, + 1.019122680375098109319314672751485080202557607467199213778085e-03, + 6.807292884319132011971333979015625113494050642797397817625326e-03, + 3.123628851149071453063391210769353068187088999495893257051179e-02, + 1.034044558614783789938787754929279183985553322796063517049140e-01, + 2.513073789944933128513251971488905042866779761014740192816902e-01, + 4.435927392240354378183910489448494594782039032807956294826105e-01, + 5.370084275091661028670690231716974547580034932361053607723887e-01, + 3.603456405180473278744458573988718422538114217890792270621563e-01, + -4.388388187393404111343479394097224312100349011932028865098625e-02, + -3.238228649121161212147302807993176715625480327235512530593160e-01, + -1.817869767667278325788350264528191676841493369460849123538616e-01, + 1.660413574907809195438433327470947940538097914525298064477785e-01, + 2.172992893210892977675493456199559114036326358517672106972956e-01, + -6.526287131067753892154895911331108284007380738865652420304233e-02, + -1.919195892985939528760786800798636198516495957924798820500876e-01, + 1.930954466601835091947734585938109944647435243484967057775110e-02, + 1.552924803962371144206753760712566993987319378965231186477630e-01, + -4.752680834111350445288110998030979143710864689041902167119118e-03, + -1.205855226433935545076589480704957722635324456812322150437989e-01, + 4.734229172641948763293980314992213293971770695480616789828384e-03, + 8.991354757072954417865374195261962983644048998218233900481856e-02, + -9.318558949903924837875002823617504227246562152671894579504378e-03, + -6.335603744044346612098887534020545705731671718057964802006671e-02, + 1.322854958503655524455929847605110719648746890497356808289302e-02, + 4.125469306470509212749750814299126656151504805845417994651417e-02, + -1.436683978422007182104025173214012797788904894291716373493525e-02, + -2.416949780166026740294880681731084091264533168816746227537030e-02, + 1.276645671565674419403918018742432714973656598227939824940035e-02, + 1.228943600811871086161967625814297050611100200023898377949151e-02, + -9.577797899235709998147309703713518608283233882793489733491642e-03, + -5.085991649233429881797636583578921194675393807761154549733547e-03, + 6.137754586740521089596801883631921221145712545042519987641234e-03, + 1.428088794070762107355585870669842132609159040625895090070111e-03, + -3.357644380922383229567732565298665639037348585961127075507937e-03, + 7.615969435172736546769649923895317451534703066016116257300160e-06, + 1.549637469702362975561719246539787717204438637997824935787688e-03, + -3.346692164250854961608526121524596908041109918361306282201310e-04, + -5.864810318991817532175809224131456738367101035694188223408841e-04, + 2.648328819961289039302810122699710966048565368047575218693134e-04, + 1.700012283661249043584690194716767771204207742625746308522935e-04, + -1.365883072261161602559926714744746422567509177443594045709653e-04, + -2.976995962848509743944225866488519668585242655980656646544319e-05, + 5.304143122913310222538317980686374696005605533475685587486683e-05, + -2.437001526827789860990429478540556752694389693432668831073769e-06, + -1.572442077270281693663288966405861215692805972737981986121447e-05, + 4.308047861716731191350493437937513220737450410132878032163179e-06, + 3.353345862871309889390877168046133657377105681618708355266688e-06, + -1.895929617693153288493891051875444439753318548105998166574535e-06, + -3.903931733287306166657519468494511920760767388397825775326745e-07, + 5.302368616904760917074352633915743250769600635829229600812520e-07, + -3.700308378205124537986402644918879149894035910106489082512364e-08, + -9.990396944534900755781728477561240762191443422318249128866740e-08, + 3.008188650719066928230268918661718274504955045022550217051301e-08, + 1.084902733789934825266560240100449884702749303326571747323086e-08, + -7.458116552893037631192407611262788593505988638365840409367117e-09, + 5.897951310384361575470355861162022501172491937837712969865619e-11, + 1.030823345485433383811700481488557422005210168069163779730908e-09, + -2.433545573751672936168877250405940817227367937230289801251648e-10, + -6.407938256501889018430608323235974406219193176918284664973727e-11, + 4.000536627253744510742788201354093006471710416671002244302586e-11, + -3.125639357108557540598098228678150768528121565391376265627294e-12, + -2.567065476155081449204643852428401530283519685638256074752850e-12, + 8.015088533687900921948605418789324826115616416343391081288979e-13, + -2.597954328893848084315198205094389145706680129208998638802995e-14, + -3.397720856796267431956783825659069596940335130100871912329556e-14, + 8.624037434720089202680337663692777682810714650060805832406135e-15, + -9.298012529324185420921555664719863501848315099116725184370339e-16, + 4.014628712333488654318569164614220308046021091178184654250982e-17 +}; + +const double db36[72] = { + 2.867925182755946334630479473029238615535511775894262711054705e-06, + 6.826028678546358691748629102209605362240344266505035981791715e-05, + 7.602151099668488285869792677106082100141275054892389379198545e-04, + 5.240297377409884366201603524392995696042174937194435235003941e-03, + 2.489056564482796484885927333959115579403023347044729739255255e-02, + 8.565209259526409083864716995521111486437594750377856524772704e-02, + 2.177569530979008149637945915719999746248969705650625533415876e-01, + 4.064336977082553467407793990250384445903151630768558142125382e-01, + 5.322668952607286914777444748641462027213554723153906901129337e-01, + 4.178753356009697863620634559374236455222275302996931178265919e-01, + 4.397519752934862993862182898358763783110745559238982179690132e-02, + -2.944210395891145711100715969898758940722458887377844633443675e-01, + -2.468070369781255270524798278622698446566520718230313889086016e-01, + 9.811420416311477050518401371401568038943437322299913514049728e-02, + 2.465372776089742110529709111809595434656418762898152706621356e-01, + 7.278515095792229009687682299460382878643139026668958884429641e-03, + -1.993372056086496198603363400094784142714162256792182570541036e-01, + -4.586140074639271639145126228774831743002971373998329604574394e-02, + 1.541062366276428841776316300420654875883842819413623395358262e-01, + 5.027618007353842862036816972809884096761706036019748316890913e-02, + -1.188037543101356316801816931383547446073152951044444224449501e-01, + -3.988085357551317584091699967924044034100374257075864260934102e-02, + 9.115678225801654406336059281306715151058903055370522031843771e-02, + 2.503872144956848989919484296709846860569180993040383621980546e-02, + -6.820901663681751124880436344265538690580358108714540763125119e-02, + -1.131910031681742794381808082173695022123056280821611354577883e-02, + 4.851308354780908538616267662315735632292989749013261207046367e-02, + 1.424972661765391603147802607378542396323429657660009755652404e-03, + -3.198072067763969654470293513742344601172739688274251641873778e-02, + 3.984040198717004857397179486790082321314291366656151213429068e-03, + 1.906359478062535932877576164368198274858108513696832728889209e-02, + -5.657813245058818380424016973516714570499161434975761798379020e-03, + -9.990263473281372348001743806489172665465685056975652497503772e-03, + 5.022989106665829004699819220796538830393945994687289792465541e-03, + 4.413484835350575251918616780287775585471012556848037301025999e-03, + -3.484541445404883311209541395428535732697661971818727286003028e-03, + -1.503074066296643749549363655363411879858070202740814054964603e-03, + 1.990793771851737270404293245701878186600899439513475823305914e-03, + 2.776812795712026068152384207605140383490242756921936501940389e-04, + -9.463403823261101964604918059447913047725482130063492242779878e-04, + 8.614565758992702032613879159402330909634737204578606399403107e-05, + 3.693507284967510502620040341882236687749563414433432842567511e-04, + -1.155118895843527096848376999413102395191976350936666573818799e-04, + -1.131899468084665671727391922924411467938450743565106978099456e-04, + 6.694741196930590257104231749283786251555566773398199990337698e-05, + 2.375106683660860777161950832380341362257503761490580896617678e-05, + -2.731390824654337912922346414722045404779935825834384250023192e-05, + -1.183471059985615942783182762352360917304348034947412986608322e-06, + 8.372218198160788432628056043217491552198857358432112275253310e-06, + -1.586145782434577495502614631566211839722879492827911790709498e-06, + -1.870811602859180713762972281154953528056257451900381097476968e-06, + 8.311421279707778528163597405935375886855029592150424544500718e-07, + 2.548423522556577831218519052844387478819866531902854523544709e-07, + -2.455377658434232699135878286794578515387138194247693201846263e-07, + 2.753249073339512254085076456700241929492720457889076058451072e-09, + 4.799043465450992009934526867650497683545716858606119786327559e-08, + -1.156093688817008406756913949175208452083765368825442482226093e-08, + -5.612784343327791397474114357094368557982413895802980814813369e-09, + 3.138841695782424018351567952158415003571380699236147752239001e-09, + 1.090815553713751810964713058800448676068475673611349566405716e-10, + -4.512545778563249634425200856088490195004077806062978067796020e-10, + 8.962418203859611987065968320295929679774693465791367610044773e-11, + 3.037429098112535221800013609576297196061786927734556635696416e-11, + -1.599716689261357143200396922409448515398648489795044468046420e-11, + 8.876846287217374213524399682895564055949886050748321818411161e-13, + 1.070969357114017002424433471621197579059927261727846375968378e-12, + -3.029285026974877268896134589769473854669758797446795757329862e-13, + 5.542263182639804235231685861028995158694397223907295269180336e-15, + 1.338071386299105896025578761458472955294763310766371178363783e-14, + -3.204628543401749860439316638848579711789176444320134355253750e-15, + 3.339971984818693213132578777712503670014459411167839211495237e-16, + -1.403274175373190617489823209168013922564353495443487431242610e-17 +}; + +const double db37[74] = { + 2.022060862498392121815038335333633351464174415618614893795880e-06, + 4.942343750628132004714286117434454499485737947791397867195910e-05, + 5.662418377066724013768394373249439163518654840493603575144737e-04, + 4.024140368257286770702140124893772447952256842478891548092703e-03, + 1.976228615387959153244055502205017461538589475705618414896893e-02, + 7.058482597718160832030361890793007659963483925312132741868671e-02, + 1.873263318620649448028843491747601576761901656888288838192023e-01, + 3.684409724003061409445838616964941132670287724754729425204047e-01, + 5.181670408556228873104519667534437205387109579265718071174178e-01, + 4.622075536616057145505448401528172070050768534504278694229363e-01, + 1.308789632330201726057701201017649601034381070893275586898075e-01, + -2.461804297610834132869018581145720710365433914584680691693717e-01, + -2.943759152626617722808219575932673733674290772235644691367427e-01, + 1.967150045235938977077768648740052380288156507222647187301894e-02, + 2.515232543602686933435224095078166291442923992611593827552710e-01, + 8.180602838721862339029076982652411696000045533716726027662147e-02, + -1.819622917786080007408824256525225216444443143868752611284260e-01, + -1.084517138233017845554078812341876568514835176341639783558543e-01, + 1.299296469598537527842528895259188653120602318620944502979726e-01, + 1.017802968388141797470948228505865617480048287983176581607964e-01, + -9.660754061668439030915405045955772715988585374771282291315496e-02, + -8.233021190655740867404073660920379414988302492018783774702028e-02, + 7.504761994836017933579005072594245435071674452882148228583865e-02, + 5.956741087152995245435589042520108066877114768216272503684398e-02, + -5.925681563265897095153806724965924334077555174281436189512239e-02, + -3.825382947938424882011108885090442116802994193611884738133373e-02, + 4.580794415126833246633256156110381805848138158784734496981778e-02, + 2.097280059259754883313769469036393294461497749083921162354229e-02, + -3.352358406410096994358662875913243067234786296009238949920582e-02, + -8.833493890410232394064187990625563257107429109130726291528648e-03, + 2.261865154459947356571431658958802912061105608212828675323452e-02, + 1.690472383484423743663952859090705636512807161536954018400081e-03, + -1.376398196289478433857985486097070339786225136728067000591187e-02, + 1.519305778833399218481261844599507408563295102235964076544334e-03, + 7.387757452855583640107787619408806919082115520707105052944171e-03, + -2.248053187003824706127276829147166466869908326245810952521710e-03, + -3.394523276408398601988475786247462646314228994098320665709345e-03, + 1.816871343801423525477184531347879515909226877688306010517914e-03, + 1.263934258117477182626760951047019242187910977671449470318766e-03, + -1.111484865318630197259018233162929628309920117691177260742614e-03, + -3.280788470880198419407186455190899535706232295554613820907245e-04, + 5.490532773373631230219769273898345809368332716288071475378651e-04, + 1.534439023195503211083338679106161291342621676983096723309776e-05, + -2.208944032455493852493630802748509781675182699536797043565515e-04, + 4.336726125945695214852398433524024058216834313839357806404424e-05, + 7.055138782065465075838703109997365141906130284669094131032488e-05, + -3.098662927619930052417611453170793938796310141219293329658062e-05, + -1.639162496160583099236044020495877311072716199713679670940295e-05, + 1.354327718416781810683349121150634031343717637827354228989989e-05, + 1.849945003115590390789683032647334516600314304175482456338006e-06, + -4.309941556597092389020622638271988877959028012481278949268461e-06, + 4.854731396996411681769911684430785681028852413859386141424939e-07, + 1.002121399297177629772998172241869405763288457224082581829033e-06, + -3.494948603445727645895194867933547164628229076947330682199174e-07, + -1.509885388671583553484927666148474078148724554849968758642331e-07, + 1.109031232216439389999036327867142640916239658806376290861690e-07, + 5.350657515461434290618742656970344024396382191417247602674540e-09, + -2.252193836724805775389816424695618411834716065179297102428180e-08, + 4.224485706362419268050011630338101126995607958955688879525896e-09, + 2.793974465953982659829387370821677112004867350709951380622807e-09, + -1.297205001469435139867686007585972538983682739297235604327668e-09, + -1.031411129096974965677950646498153071722880698222864687038596e-10, + 1.946164894082315021308714557636277980079559327508927751052218e-10, + -3.203398244123241367987902201268363088933939831689591684670080e-11, + -1.398415715537641487959551682557483348661602836709278513081908e-11, + 6.334955440973913249611879065201632922100533284261000819747915e-12, + -2.096363194234800541614775742755555713279549381264881030843258e-13, + -4.421612409872105367333572734854401373201808896976552663098518e-13, + 1.138052830921439682522395208295427884729893377395129205716662e-13, + -4.518889607463726394454509623712773172513778367070839294449849e-16, + -5.243025691884205832260354503748325334301994904062750850180233e-15, + 1.189012387508252879928637969242590755033933791160383262132698e-15, + -1.199280335852879554967035114674445327319437557227036460257649e-16, + 4.906615064935203694857690087429901193139905690549533773201453e-18 +}; + +const double db38[76] = { + 1.425776641674131672055420247567865803211784397464191115245081e-06, + 3.576251994264023012742569014888876217958307227940126418281357e-05, + 4.211702664727116432247014444906469155300573201130549739553848e-04, + 3.083088119253751774288740090262741910177322520624582862578292e-03, + 1.563724934757215617277490102724080070486270026632620664785632e-02, + 5.788994361285925649727664279317241952513246287766481213301801e-02, + 1.600719935641106973482800861166599685169395465055048951307626e-01, + 3.307757814110146511493637534404611754800768677041577030757306e-01, + 4.965911753117180976599171147718708939352414838951726087564419e-01, + 4.933560785171007975728485346997317064969513623594359091115804e-01, + 2.130505713555785138286743353458562451255624665951160445122307e-01, + -1.828676677083358907975548507946239135218223185041410632924815e-01, + -3.216756378089978628483471725406916361929841940528189059002548e-01, + -6.226650604782432226643360160478765847565862101045597180310490e-02, + 2.321259638353531085028708104285994998671615563662858079262996e-01, + 1.499851196187170199586403453788927307298226028262603028635758e-01, + -1.417956859730596216710053144522330276392591055375830654519080e-01, + -1.599125651582443618288533214523534937804208844386102639177693e-01, + 8.563812155615105741612217814369165313487129645536001850276987e-02, + 1.414147340733826800884683119379170594092606174915755283496153e-01, + -5.658645863072738145681787657843320646815509410635114234947902e-02, + -1.147311707107443752394144019458942779715665489230169950201022e-01, + 4.309589543304764288137871223616030624246568683595408792078602e-02, + 8.720439826203975011910714164154456762073786124233088471855868e-02, + -3.660510340287429567372071039506772372567938710943432838908247e-02, + -6.176620870841315993604736705613246241897497782373337911398117e-02, + 3.198987753153780630818381136366859026137035450576631134176875e-02, + 4.005498110511594820952087086241114309038577379366732959648548e-02, + -2.689149388089451438550851767715967313417890393287236700072071e-02, + -2.311413402054931680856913553585621248925303865540203357180768e-02, + 2.090464525565524340215982365351342094670261491526831672682244e-02, + 1.129049727868596484270081487761544232851115891449843967151657e-02, + -1.470188206539868213708986402816605045648481224662435114088245e-02, + -4.131306656031089274123231103326745723188134548520938157995702e-03, + 9.214785032197180512031534870181734003522861645903894504302286e-03, + 5.625715748403532005741565594881148757066703437214522101740941e-04, + -5.071314509218348093935061417505663002006821323958752649640329e-03, + 7.169821821064019257784165364894915621888541496773370435889585e-04, + 2.400697781890973183892306914082592143984140550210130139535193e-03, + -8.448626665537775009068937851465856973251363010924003314643612e-04, + -9.424614077227377964015942271780098283910230639908018778588910e-04, + 5.810759750532863662020321063678196633409555706981476723988312e-04, + 2.817639250380670746018048967535608190123523180612961062603672e-04, + -3.031020460726611993600629020329784682496477106470427787747855e-04, + -4.555682696668420274688683005987764360677217149927938344795290e-05, + 1.262043350166170705382346537131817701361522387904917335958705e-04, + -1.155409103833717192628479047983460953381959342642374175822863e-05, + -4.175141648540397797296325065775711309197411926289412468280801e-05, + 1.334176149921350382547503457286060922218070031330137601427324e-05, + 1.037359184045599795632258335010065103524959844966094870217687e-05, + -6.456730428469619160379910439617575420986972394137121953806236e-06, + -1.550844350118602575853380148525912999401292473185534395740371e-06, + 2.149960269939665207789548199790770596890252405076394885606038e-06, + -8.487087586072593071869805266089426629606479876982221840833098e-08, + -5.187733738874144426008474683378542368066310000602823096009187e-07, + 1.396377545508355481227961581059961184519872502493462010264633e-07, + 8.400351046895965526933587176781279507953080669259318722910523e-08, + -4.884757937459286762082185411608763964041010392101914854918157e-08, + -5.424274800287298511126684174854414928447521710664476410973981e-09, + 1.034704539274858480924046490952803937328239537222908159451039e-08, + -1.436329487795135706854539856979275911183628476521636251660849e-09, + -1.349197753983448821850381770889786301246741304307934955997111e-09, + 5.261132557357598494535766638772624572100332209198979659077082e-10, + 6.732336490189308685740626964182623159759767536724844030164551e-11, + -8.278256522538134727330692938158991115335384611795874767521731e-11, + 1.101692934599454551150832622160224231280195362919498540913658e-11, + 6.291537317039508581580913620859140835852886308989584198166174e-12, + -2.484789237563642857043361214502760723611468591833262675852242e-12, + 2.626496504065252070488282876470525379851429538389481576454618e-14, + 1.808661236274530582267084846343959377085922019067808145635263e-13, + -4.249817819571463006966616371554206572863122562744916796556474e-14, + -4.563397162127373109101691643047923747796563449194075621854491e-16, + 2.045099676788988907802272564402310095398641092819367167252952e-15, + -4.405307042483461342449027139838301611006835285455050155842865e-16, + 4.304596839558790016251867477122791508849697688058169053134463e-17, + -1.716152451088744188732404281737964277713026087224248235541071e-18 +}; + +// All coif coefficents have to be multiplied by sqrt(2) +static const double coif1[6] = { + -5.142972847076845595317549230122688830344559947132656813651045e-02, + 2.389297284707684559531754923012268883034455994713265681365104e-01, + 6.028594569415369119063509846024537766068911989426531362730209e-01, + 2.721405430584630880936490153975462233931088010573468637269790e-01, + -5.142972847076845595317549230122688830344559947132656813651045e-02, + -1.107027152923154404682450769877311169655440052867343186348954e-02 +}; + + +static const double coif2[12] = { + 1.158759673871686817889714882853120395708315073355502818875931e-02, + -2.932013798346856448679594524397843054053420947418409889774786e-02, + -4.763959031100813225872995081511549408622753909592460525840745e-02, + 2.730210465347666137982239328923516270034828327990699588033501e-01, + 5.746823938568638472459483149751499367740786490481481391460366e-01, + 2.948671936956191896750637208703777973914107635455611537640778e-01, + -5.408560709171142997443672832006888537570221990444706777525838e-02, + -4.202648046077160694657530752545884878978719268926222513485613e-02, + 1.674441016327950635146257083249391698866289538037299820224006e-02, + 3.967883612962012109043447090269950094081810916481648252817197e-03, + -1.289203356140659543141355500990678257894936161704492503370186e-03, + -5.095053991076441489598480835620951586540050976664367876412655e-04 +}; + +static const double coif3[18] = { + -2.682418670922068664584689955153722375535836177157637134187840e-03, + 5.503126707831385107969640263617469178794666057252906037981936e-03, + 1.658356047917034608134280439996549525220639437145367606178002e-02, + -4.650776447872697640390293095170192691113917841041002855534619e-02, + -4.322076356021191118175840907244577856782537221435748296465882e-02, + 2.865033352736474630249006862976158896891076238443844211133873e-01, + 5.612852568703300445990941995240077241406247774064453800050914e-01, + 3.029835717728241602862575774374668529867757043461413348549577e-01, + -5.077014075488886159516471867138370972545857441670871832472707e-02, + -5.819625076158553022607041679522801089624825903982541419721721e-02, + 2.443409432116695639462954438418928805487699080947974989338820e-02, + 1.122924096203786563399489540091488781245346096838814728167341e-02, + -6.369601011048822977293753932627342482077585617391852852955559e-03, + -1.820458915566242322836631665832145136570132777862391313328351e-03, + 7.902051009575939937150950543290226440287715441826917281929124e-04, + 3.296651737931830308416338897758022998655744276957481989605186e-04, + -5.019277455327664998007173088097694083956570594580641192332170e-05, + -2.446573425530813115445387662881902303945941576472342106918209e-05 +}; + + +static const double coif4[24] = { + 6.309612114309468490753696608619526520153127603444406835368201e-04, + -1.152225143769973488683007937016166047881572156705066038094891e-03, + -5.194525163470323267558201363327294331811309729430512113592118e-03, + 1.136246148326482276463392678363118465908960082105224676102131e-02, + 1.886723856956305960822813160712701905823879297781452350370094e-02, + -5.746424190192718517290527411385172124443396690932404284859269e-02, + -3.965265296244913762718094206756579981738035770770645437919302e-02, + 2.936674050161006858761278962798582650835466243678172528509866e-01, + 5.531264550395492870333469741987846570947502710783248169642137e-01, + 3.071573096678856987248881030393884808414165269795297009902001e-01, + -4.711273752389572084912399351781012121935994396763702238263689e-02, + -6.803811467802056988332974920928626798429778679560269769187728e-02, + 2.781363695846951303169163645831936314699164412528991864702607e-02, + 1.773583142270308388403079552822372238681544967313003044695583e-02, + -1.075631615508724933047071603601897536695959225169888787867102e-02, + -4.001010844950535391911552472397083276670126595827549403173754e-03, + 2.652664913530499860820143301690017184933302935238430721089152e-03, + 8.955939276952843603555618778866181384528643960440369133096025e-04, + -4.165001950941708741516836418852536615951250588002878691463468e-04, + -1.838296167136253805617482342622910940008368723403836355183423e-04, + 4.408022661597206973006038672236031501663774161685451815597956e-05, + 2.208284691230832960893331999804142845136324572860276715790883e-05, + -2.304919162676504406778986897925054839632903355820414483306851e-06, + -1.262179179994622253884862172782890488140153502131112374520603e-06 +}; + + +static const double coif5[30] = { + -1.499645228345950331670593167919531667975440598691604525531231e-04, + 2.535527523580334712936363872191554706055603482812691726895588e-04, + 1.540286725995222360335148244676269541414659303531250711822333e-03, + -2.941078164035693185044038586065593320891475311414770624555173e-03, + -7.164112349410053294382279572472252500899544810929605832362178e-03, + 1.655218330649288840540841623080651353621667424921282557975513e-02, + 1.991901719798432056056857854066125809443504706772520641876273e-02, + -6.499837825472324963374262221660858232544804226063450042795603e-02, + -3.680255347446873527191823500872992242220223547780834450868002e-02, + 2.980959014587191795511466861338063554509597132272839414668911e-01, + 5.475082713540367154128337935687830970431964302909253422329131e-01, + 3.097002590784203529311533316221254677074498876376965941549923e-01, + -4.386731482823615640442730013366750193381707273908757638050452e-02, + -7.464442013283971243472663968192859562973186442054433655531762e-02, + 2.919469277528073666095772398605275751022315529465178441510318e-02, + 2.310457227706684192610065243663928370022983285246219996141160e-02, + -1.397129268638200558584119246355879336305763752871371182932059e-02, + -6.476749751505861835547590642967453082384538848552165075614441e-03, + 4.781116799130657606400088024549264921093190305150784065791191e-03, + 1.719383484385504023022397097446276782318002683055773803854075e-03, + -1.174947934413537690027670037110105795928147523549002426409332e-03, + -4.508222400696236312231932151038336110220594834213702970043431e-04, + 2.134457975086291667348984871136041914777578046177470626552867e-04, + 9.924691139873533169989496559631669037970741600337089424730635e-05, + -2.914684388622130824599478843558087403539428940986384077972155e-05, + -1.504031798197685905639227292876711236513927746903476131955063e-05, + 2.616809660013118152124234488302931243021794024318439103773996e-06, + 1.457502921355163070577152619048168436286350537937563166257584e-06, + -1.148199649902979726237655584441763456854312591680755421569962e-07, + -6.791060677322355511541065559242475254516249773485524025251102e-08 +}; + +static const double coif6[36] = { + 3.590369176713147297619137585162985487882983106558813483919654e-05, + -5.739587600308579302553116112640931312834124316491419262693257e-05, + -4.416681189774217015420887950711066328841194295133755225305844e-04, + 7.718952365964601416123598337617069164684563206275891099236221e-04, + 2.502464949920583984721024494943552146200854870661622211002418e-03, + -4.970540926794084916072709193212250530229884674851059194676904e-03, + -8.649031599946572670088689962363342931064457587276457635862837e-03, + 2.096272704497140779792663941456374769474253019820508756967019e-02, + 2.035485665853858604541136567848434116598037957308057353920592e-02, + -7.047945564795552885905434147081164203757922879137146339823510e-02, + -3.448140611368923447131875491841937617457159299006945091335206e-02, + 3.010998878403483951866118786441379902683440623823004392113350e-01, + 5.433431541205752976643226361323847389491208513427704619816300e-01, + 3.114106686884303879320332890564758567306967030720816157048784e-01, + -4.108920994584877203854246950993119698209208008049962179892675e-02, + -7.938037857340304740867638342147592451705918503253249849143539e-02, + 2.959417996664270964779250587338231669479158250990737014414477e-02, + 2.749324945396978289421721884832761949259069726774638450310483e-02, + -1.622820901345195945858655272139343256940218447777075044002063e-02, + -8.944948800734973559175903045029991278019908264185511730556261e-03, + 6.781924902353432370456282863377674743820538634665380239602198e-03, + 2.727776322637165251200756406544564359327985321401403409245472e-03, + -2.173603470504406274543289770274934991733554729244606459300157e-03, + -8.184301467772110627838702680469158860544118224504527036324346e-04, + 5.443695006423825218320707989235387077885356717678678221237514e-04, + 2.299669354496271337796680394777537358902688275513954507765924e-04, + -1.093025858275705388257100771765109469841731265349469854748449e-04, + -5.323102894235956524250869703703947941287269765076967124254140e-05, + 1.749138884456354646795465632327170008020712055425505484223307e-05, + 9.291277996211799255766657547295162218792966588358292566578482e-06, + -2.067852860108562040355056354764683583070734740977224663511355e-06, + -1.173528057754959701015486666538811237336231287996985858558749e-06, + 1.595231380068613024221709499993144713297922814623646799204434e-07, + 9.548236102970597211555688470325396069418862428946106509526618e-08, + -6.001316648399794543233636397364817876191104394511939069108879e-09, + -3.754092421718877429714314525761519021787631896344301745834088e-09 +}; + +static const double coif7[42] = { + -8.642436297638419945610948131417508321449359042880382837616795e-06, + 1.323092600668737320653618189565188176193563004626002735569108e-05, + 1.238159302411191700694316904823586790698547751438666389964909e-04, + -2.030827471878621660379666662315021490193874834607822591973651e-04, + -8.268301617880235510290843066205662542616488856061409195612586e-04, + 1.489005690114437686460337716452079526238674405271430102926760e-03, + 3.414934412450460679215304700817226231104673750197184931650456e-03, + -7.027860242269773782347401141338545341343547479199220829531083e-03, + -9.759879698174635975799287457121964575077621800626382384905922e-03, + 2.468545489421116360102434627504896094772630565645374342185378e-02, + 2.046157861402903980087467083352777920759194756736646791948754e-02, + -7.463948234553393791576174267216063661913646014250615692345955e-02, + -3.255052720695225444262327386510843067531614239181091226317606e-02, + 3.032701839810768064176188260727440638632962820833222425246103e-01, + 5.400990244606528900971955967395441757408783874674606654776292e-01, + 3.126383971738483006163784309975347847899010543829381537178238e-01, + -3.871497424779051301839419764560067767205245057921330411662831e-02, + -8.293907947422769053048964127950429060647696494556080282464817e-02, + 2.949014117259198370970425259971349135137714379653805589390139e-02, + 3.110778126696628039496809790347026077516532785378620954115443e-02, + -1.778674610242698080195492177636195380628008680534327644027865e-02, + -1.127612352465961805417517163375322309389029593356595515710364e-02, + 8.522290099960163136478259451975210336102817817562221392657719e-03, + 3.840520687530513060929693850444023135936063807811968697808645e-03, + -3.265307484878191553686608663193259573061021023330761877609170e-03, + -1.273879229605184944648413513123685328329522201334094650099164e-03, + 1.014515696091098223010746848382433126910091720031207326903328e-03, + 4.097679895401914370060120309164154094898913488243766819496226e-04, + -2.609696573094586622328219462237882874111293043254082981395787e-04, + -1.186646887145157446962850804940522053646675640116219334763007e-04, + 5.636383526557468584243108976415315613118268111676116113791335e-05, + 2.858866828380331402146557751682881290895951013741692838961144e-05, + -1.006611544197303027244467426357681984010120261232862556289963e-05, + -5.495099010556417822017774697665452170235386110376505191968507e-06, + 1.415682965517504934011008339473818198664994789606034408294717e-06, + 8.188133233610314217903522752009348948778608588070621911086501e-07, + -1.463230575247395655425908281663831406004216665367756779712751e-07, + -8.874835827294529368648499409085591173735229589713890206258021e-08, + 9.853606453775557692052504971290731996468795418172901924493247e-09, + 6.220130833773100584817683046405291459615130548784852993590582e-09, + -3.237371065873786031415974713833345092654235228652968924822315e-10, + -2.114649662048637955296836248309680136665362492693075345297952e-10 +}; + +static const double coif8[48] = { + 2.089031388199542217649735304633077946477575993553137874997499e-06, + -3.088829676466960594403785936495123295795735325141186563064826e-06, + -3.415065199420814308581377665735877442810613593316182887801764e-05, + 5.336794978475752885866749586223668039582360880077534324830961e-05, + 2.625452092146307108027768728326461036005400582791844219135485e-04, + -4.409238208772274245312366838988697089610792049225817119782188e-04, + -1.260955244697859087126122671343741939804055800993471565939717e-03, + 2.334035748516809401796699851512493931521487402803856088184519e-03, + 4.238998515964122916906367014472885263525332429616686168386780e-03, + -9.010216682788485374574179959374952745626145790175446525921665e-03, + -1.059137210972160452062877264732854070957273640727973500291258e-02, + 2.784023497265315551670806338623371354680279388669611745037381e-02, + 2.038491393825460625255433218588522954822776999829791972608492e-02, + -7.790193780817760648856650048481215968473342802126754335290911e-02, + -3.091398960464199635355286295557605183007519885588326376800431e-02, + 3.049113846932028296232414935045248095543039057351616871735909e-01, + 5.374812703269839615372906413514102630694929400948606989937313e-01, + 3.135612340595966380418077448086007870950549040456326333016594e-01, + -3.667108316665038246204915903550010028035229188747930760164446e-02, + -8.570923901203457457230067054960180625904745972345544735005669e-02, + 2.912276318941918093502808667205448538832711003842651923199100e-02, + 3.411957880301561499047582538207723820508873324357307771206279e-02, + -1.884914078883376071043287013172570992844993887415459298291641e-02, + -1.342459526650064517082192966318056581890805569912583356614454e-02, + 9.982558825082415904373108133470460186315362848702191453854950e-03, + 4.996294194193990739772329108378853011245087219628720892888460e-03, + -4.353415716030435524873558659254500246467092155734985247834619e-03, + -1.798882274878169625580021134613003566863070625422298385086326e-03, + 1.580842866685999532270584538283553531040029730619088591607990e-03, + 6.341164354094166487421798386547881496331208497274921165613427e-04, + -4.859037288504776883185923185674204816335250660367189593401172e-04, + -2.105615022500261821665621601578029342187313061309595147668812e-04, + 1.284762650553455535249206074613997094898698286922036784576671e-04, + 6.190332439714985153834932259246488292329875513962818749340013e-05, + -2.932710247776567240870160300128192249260665410455632214571613e-05, + -1.541634258578732960762233596163970199686495285352470015267722e-05, + 5.679130231196248852811714735791066544261806333156564637706958e-06, + 3.179814253819903951090335509892218398493686680727385157906016e-06, + -9.018823843695175549580166675906964282301328192772638509290562e-07, + -5.313922705051620291263120753790527283196870682052587236468039e-07, + 1.123841380424949688574412705744289982140965409566073018148117e-07, + 6.910143395859795983361485345968765950977315740669289349714194e-08, + -1.028133863272738862101812736488937814136249072478179304322756e-08, + -6.555732343557023119114074649273108865362704549509543350446188e-09, + 6.130612315575721972473587395696526436552798806104270539014282e-10, + 4.033910072490666571003953018881489938766267669840899254802129e-10, + -1.785744077894230068079099924407862882873224386100989050429950e-11, + -1.207731024612356156550871498168833597517735826635815624658975e-11 +}; + +static const double coif9[54] = { + -5.066363823597422392806056574334164019913184490360944548316318e-07, + 7.278391993125473027029583168671424388748658656372670262448419e-07, + 9.304737272738569335426840667700605845237073216830127313873309e-06, + -1.399166643491873035927397151326087921115765448962913723958371e-05, + -8.091702401289310224621206748421921014290936300934460833068239e-05, + 1.288948603756442891955388200793566964011433484841725529675464e-04, + 4.429833292564910878782752821721584532350914860569614883397891e-04, + -7.604638375385009047720991576053046852032649468701121074994496e-04, + -1.712076406330546261864476465012314688415071394908910205115863e-03, + 3.250609771558499559986242897495101339387218580957593472948506e-03, + 4.965544559205420047336110923957506351279457718709199656899118e-03, + -1.087293322510375296786682178855708097994536728252120886318829e-02, + -1.121487186714498120022344911296954171366809171629939577546416e-02, + 3.053409241514424830665032185876170313664500941851818086027391e-02, + 2.020392698610770380447570514810463753302939216061746963067828e-02, + -8.052780090649459945830240285306098489931000767407230573519424e-02, + -2.950481547909572113527928936790826747949471856175409844500779e-02, + 3.061961521402196297060170641420108731472017553153312985302650e-01, + 5.353120232520133713115706737209774227378476257207779817606799e-01, + 3.142791902169524902984239510600746503211251765067043225338625e-01, + -3.489491800009343033063601189229669581774254383120018514658627e-02, + -8.792560957387142697108395104950963599558244039650648988222216e-02, + 2.861927542811334614253853950282153483993260752259557922334958e-02, + 3.665967931975593019562623910949450882200844831012366323592970e-02, + -1.955945002554213167931774103463762372167104971118382178710488e-02, + -1.538279230927754406350075858557526842247910581873511998413085e-02, + 1.118552122310349928798438523781104471338643824158961043502858e-02, + 6.153778805250375760539535917130018322120240439861388830004320e-03, + -5.383941047406102653501165062580070636876629329655105558566173e-03, + -2.374234426766700376811893833905319565227030464607844605997432e-03, + 2.201384480544939153490212385667343932208692420769790727070706e-03, + 8.978070631742198872611262172632408686645841161925814232909679e-04, + -7.748091639808001244045755147010278445955718484470643940080615e-04, + -3.271988742130504187500457463514277973862371006416232573352337e-04, + 2.382340816470993068532708118584131071285832153866665367058914e-04, + 1.098939547757907591024137319089517624469653929668339354098746e-04, + -6.459841534412000641464605011582059745094736001136249665670393e-05, + -3.262384353548798509572707535297893969508001470867657290979350e-05, + 1.539823757133791368834354345267796411124232848770592546980638e-05, + 8.354049038925734685227308673812966075026848925201707946720101e-06, + -3.173574058801678589943416130953277710277471261605337088707621e-06, + -1.818949869332426905097083388417804018910760658657704860329107e-06, + 5.517186750972799125927280958782447793255276643806997727626076e-07, + 3.308966123618421063439933908570170555222439095610467058151640e-07, + -7.846530733490392810972396794430929632826504340137889923489193e-08, + -4.890737315241025544677728915264690823141541323355311455146920e-08, + 8.750627874791451325430828577550291173132606932489491650978024e-09, + 5.638473635810843029376963642806188780738425364694324846641801e-09, + -7.167429275081674956250392820907257304489315331347262926580420e-10, + -4.754207280832321963819557935464843642627576884386666887645887e-10, + 3.830468826216721628160165172614737318957786647293037946018968e-11, + 2.606522688312826422093936510197703125780060151935658173250167e-11, + -1.001456631869681899515352955030379117902110811720682559024841e-12, + -6.970967839322873084383232882845795920838117679540306239345441e-13 +}; + +static const double coif10[60] = { + 1.232039860648044172279299405224082875252688628145893763395790e-07, + -1.727295600804314762711191670132331791341141012661151334481794e-07, + -2.511081517709769407961552319066117068245327429766666733928049e-06, + 3.658544046042552874351627900962366978528997860123373895778793e-06, + 2.436668276348995654567141715803151760606013118025710110377401e-05, + -3.722543982033220274394394471108112000512191070987312940916252e-05, + -1.497469279949762172542844959871018020917187701428092381975699e-04, + 2.428593780445920993243261353647084659003272232610773863151794e-04, + 6.540313182060373357098490399551418144208877502266803289923939e-04, + -1.146063191568871560182378726825944083414392177714466101235875e-03, + -2.159498802066973425125604747126061872540389369353813104148470e-03, + 4.198356898750693446005403941056755251392636143022056890090725e-03, + 5.598275450294209413911534747591226887261098750954757306041384e-03, + -1.260095805571421166223679712763560488266840720081803933722030e-02, + -1.168247265355164122837179014169010489974316491167398434017964e-02, + 3.285412351493396730558710291243592888780292689130164184828513e-02, + 1.996368405025267515773975348713442321055648689376329104127913e-02, + -8.268628841732119164746367518414478774806468603519900610269584e-02, + -2.827515877359611439071634624194631537427006948348240041241060e-02, + 3.072295399526691328155262418641709088201200529352508961256835e-01, + 5.334767884906935739862412544069281108017755758434730066259645e-01, + 3.148528691610333337017175073118974445216093370484743945217914e-01, + -3.333673484145423901496513466029874130150784824285513273324710e-02, + -8.973828824876461620729131462736908322846203417126514244115363e-02, + 2.804975877403786393498709022507676088711706121355859697479949e-02, + 3.882650078944377967276663169043218713908993336081868910959595e-02, + -2.001823819093022389853947550669865247947997489243455484715571e-02, + -1.715959267288721579873571730849821259719260958329570391883719e-02, + 1.216641740406415476398704875951061876471553491032831272757748e-02, + 7.287002668222967317616933795891484580054714258414483676611073e-03, + -6.330873585683910945116572500327893678512281593087324528956428e-03, + -2.982656931766638403179439090660944850553111019029093184942893e-03, + 2.842726797184870190904247769487845255184476983143715832751782e-03, + 1.194989100375986838359310533134452087293580850721847113981799e-03, + -1.113592929026716220582486976294877082540073971334172516478939e-03, + -4.665959023435428623124863826904417915798780109069842899171733e-04, + 3.854915448171689185378413676726041277985033697385268395398737e-04, + 1.722736489049248280735630694200218710841097211364504157426810e-04, + -1.192039440276314665828270011182318354192262701354872993867613e-04, + -5.799804551608036312810594836126727444524814767625101691871260e-05, + 3.303955116680311017462087431863046046226866796792060186027460e-05, + 1.735375106985050789058251093166552848987592399630060085283037e-05, + -8.153689583347474492592925111165323709051679031024702923650800e-06, + -4.549758014112714450559595397423919633198378184124113284457878e-06, + 1.765789027517910443710091424096930382691903616281733579514694e-06, + 1.034104799224371158938634470768393243015388383126290286799001e-06, + -3.293437798170512614804826256037338836342628817269828495710584e-07, + -2.008825017273243555706624872035287742407494975566457013532182e-07, + 5.172869892752758054467150354777867503503057315845912340980461e-08, + 3.267471887025676044777185234904542674259187212800749921513620e-08, + -6.644210603985367626472026676249006537350458801953377329083388e-09, + -4.326722848192605397244652678298064482622875881609332553562911e-09, + 6.694767246505386091091135023442214060965867621406459703646360e-10, + 4.478193476940001390457010880530025539995676698350272513506529e-10, + -4.958883523601264332798684165341380344606385498242825617652400e-11, + -3.396977896617646756144544675014526730130390520604930211664642e-11, + 2.399541927897950965447863495074910322552410081226759270966602e-12, + 1.679108441896732974456456195021048198285552771033686283521003e-12, + -5.688326582012783070559328035350356616163807538811872116072541e-14, + -4.057351322008929507004790032757210978914475486123608161502457e-14 +}; + +static const double coif11[66] = { + -3.002841270578181341151286551992204393218350582050331595402947e-08, + 4.122272295217427667266356780879156258114498741519631516920331e-08, + 6.724990810124306151562398023851821394904913501570357570065506e-07, + -9.541360761072246280269422180608056185383175100955611359233360e-07, + -7.202532561401011173077639437360684947826378373817567768549254e-06, + 1.063453162485789261522879856606560854907350313528134680849924e-05, + 4.909272375475312318494348591512780526373439988508822238418822e-05, + -7.613184050961339338779773068101736230733664198546980476770618e-05, + -2.390784892821873979161511417107775995428809136314600188678204e-04, + 3.943679383279311167583246559267867071442290440944189999981643e-04, + 8.853493370435959653823385085809947651235906281219659248568656e-04, + -1.581686514051756535736270395427784669332587895176156014356356e-03, + -2.590742746810224935563114329456904019725483278674143464295211e-03, + 5.149870818465970012295826228755714553228583889769273657074563e-03, + 6.145845672897527026066671647152239861924038000733917998375367e-03, + -1.419393259281191647250120633508339618223543447429480888885451e-02, + -1.203207413449444640173778009728050814154121296076212013667261e-02, + 3.486923068039100484429764121043168480751638068774959794674373e-02, + 1.969083876878412756398286849757105734674338626918970666727437e-02, + -8.449176235282616008524865397153001199569198030863676330987291e-02, + -2.718999570426944985720147291173682797300682913513030026037261e-02, + 3.080790765578655262603080397883700945436205022547475195838858e-01, + 5.318981263183423043747894675482113686160804211740980090048888e-01, + 3.153211471627422880186647707469009438784368258990685746892257e-01, + -3.195766007061928848761664009258043321006644364041143491101353e-02, + -9.124769812610534134560255473252823728312230005712995741316249e-02, + 2.745384767698916118757918507086581985709771313695467894960792e-02, + 4.069416828919323054368101934164054080633716017333800953161065e-02, + -2.029580028320762422710091483209306643651315777764043153811346e-02, + -1.877019961372162622019431440913198179510661354819964912645659e-02, + 1.296101510005597271938818874849814161448679262503765364267420e-02, + 8.380611488139723458203988762791929393262625838897962724368728e-03, + -7.184830591966413369120495146871921423473823635538498945128881e-03, + -3.609859908793898337842135309705990038242466823111355909651691e-03, + 3.480855644490575075872348257576088455972056599653664736521251e-03, + 1.519587122349825377958385405834371021723021014013798688930949e-03, + -1.487476950041717485556524898256248562236771186568035610613046e-03, + -6.266221323526552965740711288191177473318091288369663188353385e-04, + 5.669194750141824007727306877180277155664136228075876060283768e-04, + 2.483548169561553353815465009266736653140504966736322870003302e-04, + -1.947562130464613262021359493483333444690328898219310892360572e-04, + -9.182970970440133704016563635061723131880458403925476794220964e-05, + 6.068684153958316426511545635539425250648039719186543457181453e-05, + 3.088900022390199858477343797815906237906306891829977141838519e-05, + -1.713715146668224571508596341585374794778243270230714316209873e-05, + -9.308177549019247529116617185853630140339620355105237169582950e-06, + 4.350944607244218897315593155029012286145084684860699651446177e-06, + 2.489826198091695152209251895295085602387717821947484457226637e-06, + -9.810226131982706356161587985205307909654994261025367440308819e-07, + -5.860477917929613862778466907321520994203794368308376828863000e-07, + 1.935841542281693216091905456706113598339749921662496254592563e-07, + 1.199713894157469549665332933845486904444785619477457333399722e-07, + -3.286315290852867745345772422742964814900623793534583508718160e-08, + -2.102733655956564692974301994118024161699559390143901211493212e-08, + 4.697313377266824850774441291113868308618121213665395500265262e-09, + 3.091127346541495169376181275469205804231142302008934448079057e-09, + -5.492931291038498819123339772152269159856609319161416280911575e-10, + -3.705832674015332129353734352375876066802108394411578196121359e-10, + 5.043003455436262175385618694799102815016439527671656113021805e-11, + 3.478819684783597645372027295624442362976569795450758846730982e-11, + -3.407139658961008818238265022607619145960800136177153397899540e-12, + -2.397817050423233350570935216927526718398777501751418933159848e-12, + 1.505627237721835119751916336971964703936303188134672123458877e-13, + 1.078921592982513510792367677790040203074764526102391850430293e-13, + -3.263876236830110071269528317803593334490309684938793753165837e-15, + -2.377548488823423543125139291778920077224497814021891145988281e-15, +}; + +static const double coif12[72] = { + + 7.332768095940030936479170284005726526900547838823690875511772e-09, + -9.882788960094173321966534093367099204293628590516819427395258e-09, + -1.789770690933674811780047200109598433010386971973430500672055e-07, + 2.482235718295242398333562594286195512316082783324858732252918e-07, + 2.096862898770904613564680054212556937787154121601629543533841e-06, + -3.008997523302885197296541933722942006923516241629763269568385e-06, + -1.569727511606401439531655092040058072751445499110659438977086e-05, + 2.347282446659006948884988502182500910534796840878776320306027e-05, + 8.432620671960839513456175441990492843161437159914478159180496e-05, + -1.326465700910231806666155456982630828426491024439193157580022e-04, + -3.461069031961523260598540665989975463806418435597964924450827e-04, + 5.801724592109383434087721189210231779950668973412340708531782e-04, + 1.128329952931538448642997807830809340563912699376148776100497e-03, + -2.052978207989856468257756671236218003175082899217794093393105e-03, + -2.998854718805581165102352821152213608341151163107294684246684e-03, + 6.087234661002692098937246236052456417362244403536977448648695e-03, + 6.618258248500649305698119745808151708404790949797235636697129e-03, + -1.565844764466259880161945578291943699894979290174981301878469e-02, + -1.229143532595011743051583354556862863433008454113067034110364e-02, + 3.663359030520896940491446552702346213307676159344592871561174e-02, + 1.940158311172772932244832520273815443263367988550797208188773e-02, + -8.602421369693663560157681223178103065887873009243441444273671e-02, + -2.622309610147498279896640360042796723325043337619084753451538e-02, + 3.087901191936800440665016928578559620370136549385877375418705e-01, + 5.305215546028922252760737677862501004955798466743925981589890e-01, + 3.157101125097144187884255713018906584467729236429617965600542e-01, + -3.072728270411850832025519617026920233823691270616686168610683e-02, + -9.252355517407954901591096183036942267909813631619741203079509e-02, + 2.685426980489526041311526911968158600872135457665305597171601e-02, + 4.231906584194910461336004572125137067789978502941750699346161e-02, + -2.044171277278771763990740324636394218858904394719947562326197e-02, + -2.023145788215137568397333973747514178822985181848891022548418e-02, + 1.360136074289957261858358098198061002684141161420690992513613e-02, + 9.426267566785124441978318969535742805562416304113067761168412e-03, + -7.945708281838580982329878679291156067815423974682242221896984e-03, + -4.244616137562462768873148640133872748101997290450405726506771e-03, + 4.099701294107222470709340142349077619300436310693220618061200e-03, + 1.865723923369076273507077887878603520484228647302554964863350e-03, + -1.883095146836284131126558963690882906898471660722337699052360e-03, + -8.050306441934266570411103136671969129999167330943811990532568e-04, + 7.774244768363498320173652454360791629397769478205798411568457e-04, + 3.372847962851042846971724663631080138529114657505401824166820e-04, + -2.913208318185371820345028586920081498099751816901944041981459e-04, + -1.340525559954698716569234001877227886256687091468901002407760e-04, + 9.982127673611594435680485331533411291981760920599082733502195e-05, + 4.937348728732130704294498684307923950522584256106944886949448e-05, + -3.135036716312241024722693180559594774556478340860978546951440e-05, + -1.658147773498940772484726369548058692747045913396859511266770e-05, + 8.993369381780249884815177697768622600696214964193331328463550e-06, + 5.029634518357754652723486937747064581822127275361432214835696e-06, + -2.337864167664466494570925080931611944904459384149351585277512e-06, + -1.368676631106717262348517888568825801321041470548296848624890e-06, + 5.450688318062644286926839313049161286349015828217309026636711e-07, + 3.316523922200394953147539061914190708715734274178414348860243e-07, + -1.126508114108817402586366374763002332801656314726353024056859e-07, + -7.087035083421007145362900821929976013240319835720189106840565e-08, + 2.036136552214949970328712725606531020556011014972233106738542e-08, + 1.319046726965912968164902682289037946241823978447803297147618e-08, + -3.166087228464481990319888550523695148079523238750557992010525e-09, + -2.104991149449598511738256933418413456831105806964526595267674e-09, + 4.146945431639040971236501326093312709747378328969720686955287e-10, + 2.821776098897944456514363403112985675647966425504805181915693e-10, + -4.446983453406239471384232757602885317329111550023751533862821e-11, + -3.089624808780293616300620576734718588630028421505260673719541e-11, + 3.747462360879854551489729939613548244791307999347455031364712e-12, + 2.653081274384644726529610503659130177381947905208003616541403e-12, + -2.326413554174593468421370682954805683688973923244290583476656e-13, + -1.675405289088832668656302656638525011959950143853262083260676e-13, + 9.457233677790636292829124094363707169383163229929980763002159e-15, + 6.917698090475727804437168736067302147625040054118083556555473e-15, + -1.888230812078774308964339134901795324778762733781901178118498e-16, + -1.401017335540698807093219863467094751924636611380629198255055e-16 +}; + +static const double coif13[78] = { + -1.793548393002850396214718676857202286659666424187461477734916e-09, + 2.378211185014311786110879108757436954350720046766491611553072e-09, + 4.738378239463632066007380653022285879027956504083662158044852e-08, + -6.443042549205366017018471056937057609502890297774359019447097e-08, + -6.027665210865901726655682284996751140817763415224888556619716e-07, + 8.442063562432018658923481573987170154629168292318465207460091e-07, + 4.916019713173742217516567081751095460187255617230097133575212e-06, + -7.131597545851986841244858233956149652674565400158665885083228e-06, + -2.887621717983862897214028125602451735414281976333647039362767e-05, + 4.370659106170444884665034460659021177081728764017693131624860e-05, + 1.301010589502334343162340998315752253281092458614582842230339e-04, + -2.074517436437432445981843921824038136707694799228389255014386e-04, + -4.675659350970496983228743630930465551287595323790670572391233e-04, + 7.958726623965077575159821003474228536032266651825968350366428e-04, + 1.376238684291389421260151294679793034786767219476646917508650e-03, + -2.547925839943045924066603828685111513038130582703762656864035e-03, + -3.380448382429659921946074764411430359936216225160144993981999e-03, + 6.999176747558747594441502446219623982632259493449887383625331e-03, + 7.025277873701559172377638256697086265819697238858476588169332e-03, + -1.700403721911182477272019360628329604078467241211115244215388e-02, + -1.248110041093927898560561468789729670710805348798639274049645e-02, + 3.818992191138900815386778979798299217649095657811074673392633e-02, + 1.910593122449920408487253901211150453954067290839567103918095e-02, + -8.734123305433746527793626123316474698117075663794485992246041e-02, + -2.535440772516182914289995632242460491764482405133781896194027e-02, + 3.093942491825020619708297996329932122162946840728332042771585e-01, + 5.293074910143676049377270336094486347453907972435992671221709e-01, + 3.160379244009616024122892848920228469630372079810266391126280e-01, + -2.962163220306191371882270857478632946112548274231313092509283e-02, + -9.361576444399936039733984609999327008143196158286264947803189e-02, + 2.626405247194866459650693584890446232517026215635389354877327e-02, + 4.374461075475828517065334688194008307695911637366798984389094e-02, + -2.049134157245617651216272008653608168147661681048849172375451e-02, + -2.155975349513035485872319905355436164781967949252709342828195e-02, + 1.411469715539851095863611028564527062867149436850684547048665e-02, + 1.042015012705080744964255765999888273943255976544095301354753e-02, + -8.618241965220092705853657584595597150491673418403411002408392e-03, + -4.878411229018901327291501121500987653856731550945133361152065e-03, + 4.689231319014487945639277139124902021493524893685817080310457e-03, + 2.228006944652422042461995816835639158465376266146249271470082e-03, + -2.289300216009735975701956488620738834491684014507704186201093e-03, + -9.995141996257751415873914459680403989351818715310372734784204e-04, + 1.011237075436018016549433779140494575127827962961245293854167e-03, + 4.381342083712223181655422780539654899256457840343499415845070e-04, + -4.077800844935014982451276827385817092870017635124843071185474e-04, + -1.844040745436007917646038575655224990196066190810660605304526e-04, + 1.512620828188999164176721097533404532449113024454664717717400e-04, + 7.298889914269074881614764112188558106800789316340412477261329e-05, + -5.182922229726125421401881179344203187294861819954288822285889e-05, + -2.672839739746518397507211250706440905085295052637683361350922e-05, + 1.639620996879063097510387977200493175731056979428359020893174e-05, + 8.963666558523048764112718546851367368030517279319460108445549e-06, + -4.766464838000155192746436553819324857933144402808057358218020e-06, + -2.735466156072759824467664346873929524570661158335396527180534e-06, + 1.263996241706422344627321843525682342021921638088785036829943e-06, + 7.554924136965026151745000640360811330632516737592082697244460e-07, + -3.031372027194064857797292192738025195545051465615020648049694e-07, + -1.876153353569459383609680347900216851365226014600160596860682e-07, + 6.512178154867684103162618794588474859582328666119453018835115e-08, + 4.155335593309412282776259416691605536103007067016402041304343e-08, + -1.239596814755558143100692869308986827004606690663547726503092e-08, + -8.126161332398177051328184604237057975154642800593274318357692e-09, + 2.063790114950702612059895249532033343340137201326403800942906e-09, + 1.385901944573589656765876273409079665095347609123824623959651e-09, + -2.957224178853409095488876110988057035662351440629962056952036e-10, + -2.029311934113340193298299122766339237347606272015477168851847e-10, + 3.571772829282367453820656456837216050596922160503361259637188e-11, + 2.499410377682389724091314347623318996671569127462013112818877e-11, + -3.534890218851825710748828088218388133415831376956616696797412e-12, + -2.517884527624136958659745558559312992706644927689162729125510e-12, + 2.751761925220381284379520354168022844435052022760463778480642e-13, + 1.992032170370043447922955009924406643179442598661368210363579e-13, + -1.579660989452381199649841550208895174521301273998672860864606e-14, + -1.160591617584672995112625842000957667465588057411636690187883e-14, + 5.944365969270122882900608066221185975352672745351687370149379e-16, + 4.427175531427877551269875594300908130209116956704562714053338e-16, + -1.099853008896742180355036418837212161914020836623592509294684e-17, + -8.294635939298345162821665414627459859677158780165562383375210e-18 +}; + +static const double coif14[84] = { + 4.393123283287643046743977676392679809833123671791969857529554e-10, + -5.740995333980705032482946798804467194492616738218164095035288e-10, + -1.248927009234748737577807595315202881486499763243765085950971e-08, + 1.668938708534669081372944925855130859570883667030296283192275e-08, + 1.714224718466457012729254240886670886351889068326223437908249e-07, + -2.350888489707823711598280869672645467891128086655653747378426e-07, + -1.512829449512444398231569819651340325454203862764615475827846e-06, + 2.138843028494803759906484297432258680083063727505990520765838e-06, + 9.645189410175859129875925155219070194081512175741287765540858e-06, + -1.413900766434184664705667161036292966126778120705989526301092e-05, + -4.732386374886606069931596084808261069441902397080602834581236e-05, + 7.246665915416318653041426061722482786676878913517175624718883e-05, + 1.858717516638060924675018895058421783537325657288962327083514e-04, + -3.002639346667087045056450058456524356780635529605230858304448e-04, + -6.001981648119978322839905692747076742955350870879313864711891e-04, + 1.036704424281183769332139455241059670502046121189437350622494e-03, + 1.624019729102622430009407806264396637075700567293622239292888e-03, + -3.056866654227471285910973139305702040302592610826831936007958e-03, + -3.734374338375411359548223317593068662165508326760318658468879e-03, + 7.878974156362307531137246310651783340668870035859860685992973e-03, + 7.375794892775370758210034597418329565084392014608514718594919e-03, + -1.824112316356241062692741179162085194558935295694349102012547e-02, + -1.261644961352131486551701382111180567640901225706461078977920e-02, + 3.957213740580164637883912093052435411100033612855489943952285e-02, + 1.881013375897047936537530404984248905528105177371268733601760e-02, + -8.848531745012440411869086432922856738256941097681738588710806e-02, + -2.456831883802970358635588048610460583666496666472048714250036e-02, + 3.099141258514769597675719014297798938256245460277150903434604e-01, + 5.282263993480420420172683726700426615634588134049161997619639e-01, + 3.163176118910136471847844244749096048202155473691440639981631e-01, + -2.862162705070505721847062425772578719710517153178747344517326e-02, + -9.456098562568806415195259578154116428430268415200065101526812e-02, + 2.569051606124748855707310139514692975138855764331441058027644e-02, + 4.500466183802795354926526381495033532360504829689303112753676e-02, + -2.047021532120584933449635791950977974026461349249053431599797e-02, + -2.277014831481950414178652294664971699995306130850012029895679e-02, + 1.452361964346076643465698934593935628651549016326324569145137e-02, + 1.136128541937039082819287050631790459539185066230834792169280e-02, + -9.209420947381265408066732190659507079985769827890316211408732e-03, + -5.504969422021670816364481890406139436891358063842746391250159e-03, + 5.243747074749862954985821475569406094355637198674133818712452e-03, + 2.601674598427237622587421382305601947017094209097298433834035e-03, + -2.697275841549192002303803931030430917736443859609363181433549e-03, + -1.207776471356184889908600913725134183482141825908028112001291e-03, + 1.262622737054852256202461193382270265994430106051249583099008e-03, + 5.499311966045329956589364039445100979613421696316486920186038e-04, + -5.422272627380624698839955658312215512244309349484916450185708e-04, + -2.425184361340171436100075350681685661504913784969748899389596e-04, + 2.152149496400025476355694208172147853936641059086477755698365e-04, + 1.017555903218396117566574602158457196612571864784370737617320e-04, + -7.935125388684553688655161870002244461407761128159434896618062e-05, + -3.998277597219932662226493843559158394980004861650575475073792e-05, + 2.721796546580936689236981518793293817082739932936290854597108e-05, + 1.455457611510765292828084081835640403374221862390765492386559e-05, + -8.665251169633984802148726995857663363842070697439942022312573e-06, + -4.876002876304524386897822246961544519628259634511055566637692e-06, + 2.547630497377554690874245620888763103208548188356120375663417e-06, + 1.496291521165122830795751824395745883743697658779928306182602e-06, + -6.871963182955767930114979093149987762546939511820085867823395e-07, + -4.186054213338905216716743937485713975287167010801084873077525e-07, + 1.688323085510447043387946782295494719025294305992339556134599e-07, + 1.061608664532340347260400721455574451686604605297267706650340e-07, + -3.748126052504886126462262044258726754387739289902914735975186e-08, + -2.423790421295234792457591882318039900764790491363232906013318e-08, + 7.451944128021296384873848910815562162615603046168848323657834e-09, + 4.940829113027976152032509192714512864500880531926251999539656e-09, + -1.313004290651891746787587770064129324937346786322188934177725e-09, + -8.903006190166202390134120838864396696475015840820998020804486e-10, + 2.024339408983577773846670331538285833569817328592031229378977e-10, + 1.400716332649913272902011493738096845560270049348128272163217e-10, + -2.687843639588594104182180535839092397502172743578767496300069e-11, + -1.894326416951989057103502558801200560928286148276804817046860e-11, + 3.010449065125004813763195657162392547592377042598795440577733e-12, + 2.157549110009031291962129877779262524544188824969196959112637e-12, + -2.765131213310687469788780767616475716770096486689988092675382e-13, + -2.012365100006663638325338350119352463903184738855668161185981e-13, + 1.999559651890099694974046277400337493312467655228527142562129e-14, + 1.475855904098499257323658940826580143845487753742438097885182e-14, + -1.067284385873308952698526062594338734883390319779112369515680e-15, + -7.980454732861187078908378609623987154745352892645906516335706e-16, + 3.737960558513592434172838302437103561627990707012528832920768e-17, + 2.828736827706445597408742152789813333751511825684331285246309e-17, + -6.443221017103948534696419228196665121335677484790396728190832e-19, + -4.930480277882556230626331748820167974609092329853622801401922e-19 +}; + +static const double coif15[90] = { + -1.077388305690034925568519317607342584913833777614742512289616e-10, + 1.389587596342677833974329883522061230029685955993897881938371e-10, + 3.279393998194510988634872448273529681786105568152537128188232e-09, + -4.314917428064750425742001408005222171763816486950620059656063e-09, + -4.830480955281757774084367520164529040833872636548135345926328e-08, + 6.503442589750190197880818956936279316947206899423481669747179e-08, + 4.586202226530976939526210331832939590139698224375343383858299e-07, + -6.341483528169214053400193756836695190022413814118163945498651e-07, + -3.153995479916402549978249764513192992770609509053150015780527e-06, + 4.499804120432346419024095680248633407936442025574963153980269e-06, + 1.673949137596284707730217911852880032270066826000466620282769e-05, + -2.478673953689472562808496884430051456931244781632393118270780e-05, + -7.133403721727709318079068467834164023289442323885459167236538e-05, + 1.104625554161070296128803495762953054143520115043831806016786e-04, + 2.507269022498110858235302333943956572610456366436693548255909e-04, + -4.101297424840067893342949874400724512592760895309517943587399e-04, + -7.410047143677847135223722282750946641042780322618912256742384e-04, + 1.298007949810447142342589176001928848518589813981439840532480e-03, + 1.868002036616641522111287518387513439361411763383193116215989e-03, + -3.572228252449254403963990114096416980805538949675814075573840e-03, + -4.060845546989816000749383711188465103702344678606463573419343e-03, + 8.722973601634679156834244798678586473379340842447624760010613e-03, + 7.677632624610885216379589736677645849428563543670856456892832e-03, + -1.937998629272623327245351651340032378963145895629830248355253e-02, + -1.270912987080621205738379925710726654478701862241529402092432e-02, + 4.080738066060462170763876758586958836909785300855426384151542e-02, + 1.851809057592325149969383820293931082576986760496903450942510e-02, + -8.948849897626424781521688387105939501138967888885573845565360e-02, + -2.385247670399674430387895964623311594722573671400958395974253e-02, + 3.103664257008206645231191613171869470278587854279025003466673e-01, + 5.272557364814477983716848071901714167787737772153872785679251e-01, + 3.165587650075045121866443592930838541058283366878004666876859e-01, + -2.771191753156204367193336798361266628380497625857187392479985e-02, + -9.538675074777090841664081647061476726485316724852952970342536e-02, + 2.513756235583785139515577768765056710377747798734684870047976e-02, + 4.612595054152007266785799039333521785448817048938105661049367e-02, + -2.039697130032260717744814776948275153234836586193746022325595e-02, + -2.387610261602642412532087773123245712932154519493636933580111e-02, + 1.484665336652742504720315601481410278546028124094856659564326e-02, + 1.225045078722903548958708772567092776061773279630721958212731e-02, + -9.727026988684677132100204448228164919286050721340500899358847e-03, + -6.119790408666201569472108881793143052368912545364690258267249e-03, + 5.760546284765569349029577236247005441326471924211526110831333e-03, + 2.982639689783411796793051935450475228274526754982054792962250e-03, + -3.100326747810698908670357861857946527442099277807566353764288e-03, + -1.427598950056448560388339550760364489836477975524209634886824e-03, + 1.526288902864820487351136408213978592286541943096968601069530e-03, + 6.716807141163574375155812673929624759515069203426478824767004e-04, + -6.923091961922026215168169239588952998971619503794813547976866e-04, + -3.079753690537485675760336348529151045406687032785607559287851e-04, + 2.913765589242728312575501892839254155123375897451413662654452e-04, + 1.355892883935182989877008830272296210763299728475431240359051e-04, + -1.144136457600174453829439526659056859019745676077854858593439e-04, + -5.647366526527395256230283878165734782055526539079541637152500e-05, + 4.202814469137045804231920127700407277374824908280103138814183e-05, + 2.200691925199183606470694553320593703444346894670462898724267e-05, + -1.443487126829503983751150823245149445739823542713233210642676e-05, + -7.967044068720793687142187645523516573594381036006224439668751e-06, + 4.620529572512414091638085200280358471196525782083614164517925e-06, + 2.667271171141226202145908685103109359180536100787642097511661e-06, + -1.371646007677255108283723404199936479217347063529498435611186e-06, + -8.226257775777933787075210506019317042435483731184419620540542e-07, + 3.754707488446600189267042303254271529522879725934705336303128e-07, + 2.327460534735607792375886758810039203536663498026314128685740e-07, + -9.419176207630012538547307468277369699399418776908683708933552e-08, + -6.010901363192621272223652431192551853015388169886067903126279e-08, + 2.151040529867103646106333296464104096442766675831068812680466e-08, + 1.408663721444152455727196509866657267275259238167897249854527e-08, + -4.438471764420978016551707826632529934591397495469950610230150e-09, + -2.974872318653716789002892729632634360902192191395110942422961e-09, + 8.203736354629479986724051586473684219941281670765722417668819e-10, + 5.614906982011763291961026759329761169245818883997411717426871e-10, + -1.344369082215606926514414754427875310059984578418456061162278e-10, + -9.377858898150921640144384471918102613403240839501295781875527e-11, + 1.928845257086926701816336874687366534718638777936590534635229e-11, + 1.369011182657074022662376575505428888871791726174235399548870e-11, + -2.384934840461770473688929159579828219691317417791483110727798e-12, + -1.719778967631011393923929779685944798509748321140853638527672e-12, + 2.489379237039083598560573205355055108535626207998662168681925e-13, + 1.821429711569697474507499816102915339752696477298299745504329e-13, + -2.132622020734041001406592439010728287329439597809749096351270e-14, + -1.581480392919139876757416822279485491215786823105416373080481e-14, + 1.439584163156225165032712921349710482363055530913169445190637e-15, + 1.080870877608085873106724565550332487149959687560803170944524e-15, + -7.178988398852581130761463819471838970960348029733518906208378e-17, + -5.452456075593213060858973182314766684639894698667113525487884e-17, + 2.351146114661327422889598894161189162646924206890382575430334e-18, + 1.804873032260938513483901979969512893697634895683128101624000e-18, + -3.793093840880643734719632714511071568608235299231836638122279e-20, + -2.940897685979289093951754752537580047693528343881245635936847e-20 +}; + +static const double coif16[96] = { + 2.645128227931334401194749017856094903839224759604187535975348e-11, + -3.371203198492327805593180795398582247961552853458158404332701e-11, + -8.582602955015851169989985547605915833769704579350018283905453e-10, + 1.113682743874024896922872631560006089322116513037553196433140e-09, + 1.350357555669007302187662129540475982947984508250679168402207e-08, + -1.788542662216945768696335511240007863403120034978963421466759e-08, + -1.372399767643349435868829666738563944471884881660198607643932e-07, + 1.861142798232072777457875152815716474831537306031011659394987e-07, + 1.012632916853084889127303847166996705778109099232881893357767e-06, + -1.411391218929900871875409836854758822959995175269209988265964e-06, + -5.780354906513060544090253238716694637224354416047278875195167e-06, + 8.319552925349192408642980463945086193729912325909182155797371e-06, + 2.656172937335282438452193694808438866757101525885555802877363e-05, + -3.971488503705784806195172735954055483778562353132473949420383e-05, + -1.009502477694915360037551527344779468467449497309371492607906e-04, + 1.580205984850860534574382720595384850826996029171338643269624e-04, + 3.235585956460851636390368611428001979093146497993005344305241e-04, + -5.356766020478135601304959841352994036589791570941083598445719e-04, + -8.873556546319179065472262621811119401586608437112185894641021e-04, + 1.575478281351532632439717118803866388929199851338529206979138e-03, + 2.105606651204431619054524746734864557623457229083947484722320e-03, + -4.088191894353650561276869582147927639352373035186017974748492e-03, + -4.360872292782198728376270454745337063294048791901294558973734e-03, + 9.529568586822569351636224042126142702339784399550130407812201e-03, + 7.937554616751835390855349461479084645184690272876975812761538e-03, + -2.043028062273575036423529610008583445387419918322244014076844e-02, + -1.276805798943377800134681508900535312774995954006995157514628e-02, + 4.191756976239118832120686348770409281363202997039966458608067e-02, + 1.823220381522837114361006424809362329414770645451392462449888e-02, + -9.037537219708957768297195651417043288020180323453952191219619e-02, + -2.319696593669936172505243393626168348704758643822052626742965e-02, + 3.107636928082792940641010571409269845541349652957861643505019e-01, + 5.263779607858160898968654079428530858936436413545697317378081e-01, + 3.167685981610576430160454114053628826549777499820093838585069e-01, + -2.688002764399130975457186260346246083982252335484396969696049e-02, + -9.611413622779535731607299381683923415585409438866982806312433e-02, + 2.460702264184366170433044783596672126378075093050623290409127e-02, + 4.712982774514209557951414612253477983062538454664569371378627e-02, + -2.028535796367687397692592233666898932654122251735124185611584e-02, + -2.488947090480479804467455088466028171550905433401327138474797e-02, + 1.509891466100476055081827485608676509355525843509560496666700e-02, + 1.308946215944044192535019406077351673456069366724670016932535e-02, + -1.017883680802027111277390598900318783317279547588070199634251e-02, + -6.719748071003458935775571012030544444136724430402220957162335e-03, + 6.238935489467385921022852560870393671940489207452244538094472e-03, + 3.367468902298941859370206452925695206983662336670801038560071e-03, + -3.493551700182803646132263836442232208288107750606295145197587e-03, + -1.656892742742846792662641923332649254682158396970453428791079e-03, + 1.797580707568879158693851162651173871535491718081800368907782e-03, + 8.023813584888036977682855962559617079147220211451113235479547e-04, + -8.554898439358329127957776138969823280630767426284649193621767e-04, + -3.803250541195305567062453832052319106641157897723285573667716e-04, + 3.790575215750319491406179627066855114144121793545714885424013e-04, + 1.743405946247572050905785206176608832450147638063148826743472e-04, + -1.572439781316405883265776380849622489840291930399907686729106e-04, + -7.624948592584476281257978178990423864516589094309239278548039e-05, + 6.128060596774506984228013865022369414316454857306786928520834e-05, + 3.146741963266068084535293135528229727240575644439933447074425e-05, + -2.245327295507508821937104934719536410602401822650676684612963e-05, + -1.216243182507186686293172059854826389902098520645342122978134e-05, + 7.720917364617828003652627867578175616946793895014715674935806e-06, + 4.381753178661449645296516382515863584261691809111376008934184e-06, + -2.482767124382555232483399147672417058164552715497813674691440e-06, + -1.466343698163771614780524818641106403735083198445173705132776e-06, + 7.432014174835368770981871416234950435655553162638884480980583e-07, + 4.542989331759269644535718413196051785388101460827659003970839e-07, + -2.060699879933986058206760300398806699720723820737944360367781e-07, + -1.298170865048347187816076578378402307087125075336611133383038e-07, + 5.264581641375993977610164728920521257086259803613235153366270e-08, + 3.406393391619068289195417747073909213446800676676765817676367e-08, + -1.232185691522856953729451450757280208371851915642712294292861e-08, + -8.166093443152050070015881861916421702970930717440939870025784e-09, + 2.625409011502555900921203294713520941212542142978903897341494e-09, + 1.777971486566651937150629742259638331676290922471013840418127e-09, + -5.055670327267217324394512474432436609546961385665820073629149e-10, + -3.491603047784209234885018449563067499142505674739795662842523e-10, + 8.724442027269310202793317644100398216549268990858642429012803e-11, + 6.134056646089015827615754897419277972739575045939973674430929e-11, + -1.335550933533140093069772884082926341856038121300357216420744e-11, + -9.545001301055681232254913151946668780573427381542116387716243e-12, + 1.791132091052570705585609717173338686203233385162086497884597e-12, + 1.299479612944140546458425080979636378248568664374156541007765e-12, + -2.071542478174027600308270770710599707024301130761618879837078e-13, + -1.523876419589572596433135600175398293765409391592690642809664e-13, + 2.024011564013098795384504309899456379953546444981404140928647e-14, + 1.508090533430543564179721448102668377867975040540446828012097e-14, + -1.624316869855319846554453444493486257563508484962017834581348e-15, + -1.224719779181149805165600696876308523367619824015832031858679e-15, + 1.027939569018525333323110570745538777072560620646729968488678e-16, + 7.836461641294003176782800892601140107677607857155479918585838e-17, + -4.809623970748619654544928861639842603928203458148585584400867e-18, + -3.704428468500691125388142845245956973807333959654959653370468e-18, + 1.479077310414365270465857340835402997778146774718460154867300e-19, + 1.150168591577669048697174066699145993471476194503387272230234e-19, + -2.242407694525583556140058750006128491924916204038852290292985e-21, + -1.759447752651847364048938898264828071373418617420955762135442e-21 + +}; +static const double coif17[102] = { + -6.500464389707599365209386548586351053892021378458138653304423e-12, + 8.195092532207287031929315133511822259455558174314608981943899e-12, + 2.239711179183031212893330219097909418305437894719629936823048e-10, + -2.869947756536888954496920486027606890198732779175975385193469e-10, + -3.748652869247186892176371615982066497362408141014325378716294e-09, + 4.892949218890121214706505923918329440794016605904313473814529e-09, + 4.060535996907768482760233032378242455655290824022613838518523e-08, + -5.412800273268200651966255945372126329232373624996043338727765e-08, + -3.199646878369895994575449942065193991181771279589753273012370e-07, + 4.369727725871308893880916467851990680716049438182815833632030e-07, + 1.954675426993304663744299195821942913722501797065421760283585e-06, + -2.745513146733188764932399232387671708256227137296795085887882e-06, + -9.634412972188383779747780077033215938910939748761965263335434e-06, + 1.398510128440620079969365258470536422184684456048432702271769e-05, + 3.936982972446342694180294131275967364969863087882012583523302e-05, + -5.942171285371293607280496067664382735077180061970981330506268e-05, + -1.360187671549120330733322490500505609713066081377747046659631e-04, + 2.151477677680517385918241110555023784071910115637214853600854e-04, + 4.031846985142799308758422861627631567915210555326501592195629e-04, + -6.753056524717059857256997400254135291064617085196739372670596e-04, + -1.037019038482154436516186769361377053347840390147975287354903e-03, + 1.865278399043969526599364729851177613810456808562792176901007e-03, + 2.335092479166843852619505691860960037151295448017402395490464e-03, + -4.600362410545124310128593731153519957157915045164845600048444e-03, + -4.635901516367530468266774633995064938864595165304482662269926e-03, + 1.029849878093488912016135237127927932437021681117450333050470e-02, + 8.161354844742695166287867590528306934013230497272094086439853e-03, + -2.140083454707180990471957764441619892415141666259178396074188e-02, + -1.280013066407215003063560801494039614508212222821778081264683e-02, + 4.292055861596262214973257156936151304056714777314126061614130e-02, + 1.795390690266262592020002418739607395852481356276768335967618e-02, + -9.116513012907441746922273129338011409075492893988681588200024e-02, + -2.259372514218996220695158554614204610976204851195489170219594e-02, + 3.111155431954246180810318298644662465180042749292370227009409e-01, + 5.255791920096491971882691260862499824764740619924123678110320e-01, + 3.169526419329032746356987532605638232939637480462148442295005e-01, + -2.611571666365402171510563042119336240297149649416458785911946e-02, + -9.675954853667507935197631998670465823029201914294383672129969e-02, + 2.409947009460623399471523812196780471148876929014194101062573e-02, + 4.803353218498044015416060073004473385881416575908077296603559e-02, + -2.014561229992014297122142514992242081365435497050595479226927e-02, + -2.582061660161950684110954569039206647948969052599286532681994e-02, + 1.529272640253308240084109219531756056459883643674183337274434e-02, + 1.388071397467832912373059115868453151221079623138136285750566e-02, + -1.057221105345110246802817506341466648095287774314054180322389e-02, + -7.302762653438232901227689142950547329538140829539078289487808e-03, + 6.679525479155670944534388145244600799904556867195771509687913e-03, + 3.753327910175261617061638983698597354605196849112621375976962e-03, + -3.873502044238494209221075063035775273773018743760471430473527e-03, + -1.893732606269440797293869629956889668362203362383552157238979e-03, + 2.072543024867895178559272835210161485056077281253166510139696e-03, + 9.410418747008923962829724903349867736584130840706583199324136e-04, + -1.029236208596613388068225340603899734435060101885503041426292e-03, + -4.591014336769466560134513688989777037625141817691452272446129e-04, + 4.773008760819621131157362935521176506345390013016953367673484e-04, + 2.178204082961996755621953357319268908714183698410765755733914e-04, + -2.078309675413889310430737904787028903664009273165646558840663e-04, + -9.929997042562200063281249722482587882228792457135570086630464e-05, + 8.530214005775875557344845401830936434184861259249422544962929e-05, + 4.303127018338600126871147843984523103940762542407178890295340e-05, + -3.305701987257830145946843240723975476098534205446659095902282e-05, + -1.758829650866963971776918784161632040379719078606077372721020e-05, + 1.208769577843697327040603409274814451217826643812352568992268e-05, + 6.746467675120962867147670937319739759733836479700116679771234e-06, + -4.160355187316342019270990597595419877216228873682832991804769e-06, + -2.420254904648915254014955740890841226083885744291947005091657e-06, + 1.342994249603250343064678689811024077753583828488987218045940e-06, + 8.097294554089061667504430331210249043842934823174097650144144e-07, + -4.049444940788524829884048775715404594466969342774847971126013e-07, + -2.518965167469206882003809454171378587968607051431751373150446e-07, + 1.135553617795151208855033374367694728763504841965654332076720e-07, + 7.261651917558697862566637161896385928154192436065001744633099e-08, + -2.947980283978599533805321526934370923141985995773718687989809e-08, + -1.932361910368835906234029388933678481624943182582035193495632e-08, + 7.050321193690929766855893625237523724477327743751448148520006e-09, + 4.725540898626838453733797773219853119997567959454100093653807e-09, + -1.544890271654104814899353348226128082357337920194464818206503e-09, + -1.056616142600432792887732860128652200494175165768667682069691e-09, + 3.082594659999300699574359679210901640096775130739951087627160e-10, + 2.147504833829198392113195006888709994262573995228896673552773e-10, + -5.561286894620042086964943668161558452409502342704415471486767e-11, + -3.940143496183440249847057247704879900653366187527397859030185e-11, + 8.995643580413385770110048797179920790859544777777746910312038e-12, + 6.472787221353141291937900214024339897450801045313739690950453e-12, + -1.291529680835762905157565016413333440330657604408304192114484e-12, + -9.426669651972276882689445158605509492502686267040217113580068e-13, + 1.625527264466347733962941488626801955710436180523082414371005e-13, + 1.202192377372031845627082725619201334357843245869818759928528e-13, + -1.765518459644471564018808330096255160185888800253188548281582e-14, + -1.321779015475951542862804164493083633990380882447565336832597e-14, + 1.621075287427611093636143991429535087675201571842337901672180e-15, + 1.227498087932053340876125326218310922521150243946862677354389e-15, + -1.223432402366205698930334886661193082730379267225732134795174e-16, + -9.362464931639200345906241184043712676525956780242932081695469e-17, + 7.286307451400376946525901096753718888478670661483802452725131e-18, + 5.631244920089436674573794405513798919334447045845529038034991e-18, + -3.210669220728058803342344742726907080377349121830123276313938e-19, + -2.504389307995414770751414118526232971373346964470499339128194e-19, + 9.305380936099856808127703965979897197171695480831630403884988e-21, + 7.321457794081650002123376485818067154029026613875178979778160e-21, + -1.330546671429478643380151195298922795778536160301584472334406e-22, + -1.055408614665356789775787814731337905514088897800715301399902e-22 +}; + + +static const double sym2[4] = { + 0.48296291314469025, 0.83651630373746899, + 0.22414386804185735, -0.12940952255092145 +}; + + +static const double sym3[6] = { + 0.33267055295095688, 0.80689150931333875, + 0.45987750211933132, -0.13501102001039084, + -0.085441273882241486, 0.035226291882100656 +}; + +static const double sym4[8] = { + 0.032223100604042702, -0.012603967262037833, + -0.099219543576847216, 0.29785779560527736, + 0.80373875180591614, 0.49761866763201545, + -0.02963552764599851, -0.075765714789273325 +}; + +static const double sym5[10] = { + 0.019538882735286728, -0.021101834024758855, + -0.17532808990845047, 0.016602105764522319, + 0.63397896345821192, 0.72340769040242059, + 0.1993975339773936, -0.039134249302383094, + 0.029519490925774643, 0.027333068345077982 +}; + +static const double sym6[12] = { + -0.007800708325034148, 0.0017677118642428036, + 0.044724901770665779, -0.021060292512300564, + -0.072637522786462516, 0.3379294217276218, + 0.787641141030194, 0.49105594192674662, + -0.048311742585632998, -0.11799011114819057, + 0.0034907120842174702, 0.015404109327027373 +}; + +static const double sym7[14] = { + 0.010268176708511255, 0.0040102448715336634, + -0.10780823770381774, -0.14004724044296152, + 0.28862963175151463, 0.76776431700316405, + 0.5361019170917628, 0.017441255086855827, + -0.049552834937127255, 0.067892693501372697, + 0.03051551316596357, -0.01263630340325193, + -0.0010473848886829163, 0.0026818145682578781 +}; + +static const double sym8[16] = { + 0.0018899503327594609, -0.0003029205147213668, + -0.014952258337048231, 0.0038087520138906151, + 0.049137179673607506, -0.027219029917056003, + -0.051945838107709037, 0.3644418948353314, + 0.77718575170052351, 0.48135965125837221, + -0.061273359067658524, -0.14329423835080971, + 0.0076074873249176054, 0.031695087811492981, + -0.00054213233179114812, -0.0033824159510061256 +}; + +static const double sym9[18] = { + 0.0010694900329086053, -0.00047315449868008311, + -0.010264064027633142, 0.0088592674934004842, + 0.06207778930288603, -0.018233770779395985, + -0.19155083129728512, 0.035272488035271894, + 0.61733844914093583, 0.717897082764412, + 0.238760914607303, -0.054568958430834071, + 0.00058346274612580684, 0.03022487885827568, + -0.01152821020767923, -0.013271967781817119, + 0.00061978088898558676, 0.0014009155259146807 +}; + +static const double sym10[20] = { + -0.00045932942100465878, 5.7036083618494284e-005, + 0.0045931735853118284, -0.00080435893201654491, + -0.02035493981231129, 0.0057649120335819086, + 0.049994972077376687, -0.0319900568824278, + -0.035536740473817552, 0.38382676106708546, + 0.7695100370211071, 0.47169066693843925, + -0.070880535783243853, -0.15949427888491757, + 0.011609893903711381, 0.045927239231092203, + -0.0014653825813050513, -0.0086412992770224222, + 9.5632670722894754e-005, 0.00077015980911449011 +}; + +static const double sym11[22] = { + 0.00048926361026192387, 0.00011053509764272153, + -0.0063896036664548919, -0.0020034719001093887, + 0.043000190681552281, 0.035266759564466552, + -0.14460234370531561, -0.2046547944958006, + 0.23768990904924897, 0.73034354908839572, + 0.57202297801008706, 0.097198394458909473, + -0.022832651022562687, 0.069976799610734136, + 0.0370374159788594, -0.024080841595864003, + -0.0098579348287897942, 0.0065124956747714497, + 0.00058835273539699145, -0.0017343662672978692, + -3.8795655736158566e-005, 0.00017172195069934854 +}; + +static const double sym12[24] = { + -0.00017906658697508691, -1.8158078862617515e-005, + 0.0023502976141834648, 0.00030764779631059454, + -0.014589836449234145, -0.0026043910313322326, + 0.057804179445505657, 0.01530174062247884, + -0.17037069723886492, -0.07833262231634322, + 0.46274103121927235, 0.76347909778365719, + 0.39888597239022, -0.022162306170337816, + -0.035848830736954392, 0.049179318299660837, + 0.0075537806116804775, -0.024220722675013445, + -0.0014089092443297553, 0.007414965517654251, + 0.00018021409008538188, -0.0013497557555715387, + -1.1353928041541452e-005, 0.00011196719424656033 +}; + +static const double sym13[26] = { + 7.0429866906944016e-005, 3.6905373423196241e-005, + -0.0007213643851362283, 0.00041326119884196064, + 0.0056748537601224395, -0.0014924472742598532, + -0.020749686325515677, 0.017618296880653084, + 0.092926030899137119, 0.0088197576704205465, + -0.14049009311363403, 0.11023022302137217, + 0.64456438390118564, 0.69573915056149638, + 0.19770481877117801, -0.12436246075153011, + -0.059750627717943698, 0.013862497435849205, + -0.017211642726299048, -0.02021676813338983, + 0.0052963597387250252, 0.0075262253899680996, + -0.00017094285853022211, -0.0011360634389281183, + -3.5738623648689009e-005, 6.8203252630753188e-005 +}; + +static const double sym14[28] = { + 4.4618977991475265e-005, 1.9329016965523917e-005, + -0.00060576018246643346, -7.3214213567023991e-005, + 0.0045326774719456481, 0.0010131419871842082, + -0.019439314263626713, -0.0023650488367403851, + 0.069827616361807551, 0.025898587531046669, + -0.15999741114652205, -0.058111823317717831, + 0.47533576263420663, 0.75997624196109093, + 0.39320152196208885, -0.035318112114979733, + -0.057634498351326995, 0.037433088362853452, + 0.0042805204990193782, -0.029196217764038187, + -0.0027537747912240711, 0.010037693717672269, + 0.00036647657366011829, -0.002579441725933078, + -6.2865424814776362e-005, 0.00039843567297594335, + 1.1210865808890361e-005, -2.5879090265397886e-005 +}; + +static const double sym15[30] = { + 2.8660708525318081e-005, 2.1717890150778919e-005, + -0.00040216853760293483, -0.00010815440168545525, + 0.003481028737064895, 0.0015261382781819983, + -0.017171252781638731, -0.0087447888864779517, + 0.067969829044879179, 0.068393310060480245, + -0.13405629845625389, -0.1966263587662373, + 0.2439627054321663, 0.72184302963618119, + 0.57864041521503451, 0.11153369514261872, + -0.04108266663538248, 0.040735479696810677, + 0.021937642719753955, -0.038876716876833493, + -0.019405011430934468, 0.010079977087905669, + 0.003423450736351241, -0.0035901654473726417, + -0.00026731644647180568, 0.0010705672194623959, + 5.5122547855586653e-005, -0.00016066186637495343, + -7.3596667989194696e-006, 9.7124197379633478e-006 +}; + +static const double sym16[32] = { + -1.0797982104319795e-005, -5.3964831793152419e-006, + 0.00016545679579108483, 3.656592483348223e-005, + -0.0013387206066921965, -0.00022211647621176323, + 0.0069377611308027096, 0.001359844742484172, + -0.024952758046290123, -0.0035102750683740089, + 0.078037852903419913, 0.03072113906330156, + -0.15959219218520598, -0.054040601387606135, + 0.47534280601152273, 0.75652498787569711, + 0.39712293362064416, -0.034574228416972504, + -0.066983049070217779, 0.032333091610663785, + 0.0048692744049046071, -0.031051202843553064, + -0.0031265171722710075, 0.012666731659857348, + 0.00071821197883178923, -0.0038809122526038786, + -0.0001084456223089688, 0.00085235471080470952, + 2.8078582128442894e-005, -0.00010943147929529757, + -3.1135564076219692e-006, 6.2300067012207606e-006 +}; + +static const double sym17[34] = { + 3.7912531943321266e-006, -2.4527163425832999e-006, + -7.6071244056051285e-005, 2.5207933140828779e-005, + 0.0007198270642148971, 5.8400428694052584e-005, + -0.0039323252797979023, -0.0019054076898526659, + 0.012396988366648726, 0.0099529825235095976, + -0.01803889724191924, -0.0072616347509287674, + 0.016158808725919346, -0.086070874720733381, + -0.15507600534974825, 0.18053958458111286, + 0.68148899534492502, 0.65071662920454565, + 0.14239835041467819, -0.11856693261143636, + 0.0172711782105185, 0.10475461484223211, + 0.017903952214341119, -0.033291383492359328, + -0.0048192128031761478, 0.010482366933031529, + 0.0008567700701915741, -0.0027416759756816018, + -0.00013864230268045499, 0.0004759963802638669, + -1.3506383399901165e-005, -6.2937025975541919e-005, + 2.7801266938414138e-006, 4.297343327345983e-006 +}; + +static const double sym18[36] = { + -1.5131530692371587e-006, 7.8472980558317646e-007, + 2.9557437620930811e-005, -9.858816030140058e-006, + -0.00026583011024241041, 4.7416145183736671e-005, + 0.0014280863270832796, -0.00018877623940755607, + -0.0052397896830266083, 0.0010877847895956929, + 0.015012356344250213, -0.0032607442000749834, + -0.031712684731814537, 0.0062779445543116943, + 0.028529597039037808, -0.073799207290607169, + -0.032480573290138676, 0.40148386057061813, + 0.75362914010179283, 0.47396905989393956, + -0.052029158983952786, -0.15993814866932407, + 0.033995667103947358, 0.084219929970386548, + -0.0050770851607570529, -0.030325091089369604, + 0.0016429863972782159, 0.0095021643909623654, + -0.00041152110923597756, -0.0023138718145060992, + 7.0212734590362685e-005, 0.00039616840638254753, + -1.4020992577726755e-005, -4.5246757874949856e-005, + 1.354915761832114e-006, 2.6126125564836423e-006 +}; + +static const double sym19[38] = { + 1.7509367995348687e-006, 2.0623170632395688e-006, + -2.8151138661550245e-005, -1.6821387029373716e-005, + 0.00027621877685734072, 0.00012930767650701415, + -0.0017049602611649971, -0.00061792232779831076, + 0.0082622369555282547, 0.0043193518748949689, + -0.027709896931311252, -0.016908234861345205, + 0.084072676279245043, 0.093630843415897141, + -0.11624173010739675, -0.17659686625203097, + 0.25826616923728363, 0.71955552571639425, + 0.57814494533860505, 0.10902582508127781, + -0.067525058040294086, 0.0089545911730436242, + 0.0070155738571741596, -0.046635983534938946, + -0.022651993378245951, 0.015797439295674631, + 0.0079684383206133063, -0.005122205002583014, + -0.0011607032572062486, 0.0021214250281823303, + 0.00015915804768084938, -0.00063576451500433403, + -4.6120396002105868e-005, 0.0001155392333357879, + 8.8733121737292863e-006, -1.1880518269823984e-005, + -6.4636513033459633e-007, 5.4877327682158382e-007 +}; + +static const double sym20[40] = { + -6.3291290447763946e-007, -3.2567026420174407e-007, + 1.22872527779612e-005, 4.5254222091516362e-006, + -0.00011739133516291466, -2.6615550335516086e-005, + 0.00074761085978205719, 0.00012544091723067259, + -0.0034716478028440734, -0.0006111263857992088, + 0.012157040948785737, 0.0019385970672402002, + -0.035373336756604236, -0.0068437019650692274, + 0.088919668028199561, 0.036250951653933078, + -0.16057829841525254, -0.051088342921067398, + 0.47199147510148703, 0.75116272842273002, + 0.40583144434845059, -0.029819368880333728, + -0.078994344928398158, 0.025579349509413946, + 0.0081232283560096815, -0.031629437144957966, + -0.0033138573836233591, 0.017004049023390339, + 0.0014230873594621453, -0.0066065857990888609, + -0.0003052628317957281, 0.0020889947081901982, + 7.2159911880740349e-005, -0.00049473109156726548, + -1.928412300645204e-005, 7.992967835772481e-005, + 3.0256660627369661e-006, -7.919361411976999e-006, + -1.9015675890554106e-007, 3.695537474835221e-007 +}; + + +static const double h1[10] = { + 0.0, 0.0, 0.0, 0.0, + 0.70710678118654752440084436210, + 0.70710678118654752440084436210, + 0.0, 0.0, 0.0, 0.0 +}; + +static const double hm1_11[2] = { + 0.70710678118654752440084436210, + 0.70710678118654752440084436210 +}; + +static const double hm1_13[6] = { + -0.0883883476483184405501055452631, + 0.0883883476483184405501055452631, + 0.70710678118654752440084436210, + 0.70710678118654752440084436210, + 0.0883883476483184405501055452631, + -0.0883883476483184405501055452631 +}; + +static const double hm1_15[10] = { + 0.0165728151840597076031447897368, + -0.0165728151840597076031447897368, + -0.1215339780164378557563951247368, + 0.1215339780164378557563951247368, + 0.70710678118654752440084436210, + 0.70710678118654752440084436210, + 0.1215339780164378557563951247368, + -0.1215339780164378557563951247368, + -0.0165728151840597076031447897368, + 0.0165728151840597076031447897368 +}; + + +static const double h2[18] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.3535533905932737622004221810524, + 0.7071067811865475244008443621048, + 0.3535533905932737622004221810524, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0 +}; + +static const double hm2_22[6] = { + -0.1767766952966368811002110905262, + 0.3535533905932737622004221810524, + 1.0606601717798212866012665431573, + 0.3535533905932737622004221810524, + -0.1767766952966368811002110905262, + 0.0 +}; + +static const double hm2_24[10] = { + 0.0331456303681194152062895794737, + -0.0662912607362388304125791589473, + -0.1767766952966368811002110905262, + 0.4198446513295125926130013399998, + 0.9943689110435824561886873842099, + 0.4198446513295125926130013399998, + -0.1767766952966368811002110905262, + -0.0662912607362388304125791589473, + 0.0331456303681194152062895794737, + 0.0 +}; + +static const double hm2_26[14] = { + -0.0069053396600248781679769957237, + 0.0138106793200497563359539914474, + 0.0469563096881691715422435709210, + -0.1077232986963880994204411332894, + -0.1698713556366120029322340948025, + 0.4474660099696121052849093228945, + 0.9667475524034829435167794013152, + 0.4474660099696121052849093228945, + -0.1698713556366120029322340948025, + -0.1077232986963880994204411332894, + 0.0469563096881691715422435709210, + 0.0138106793200497563359539914474, + -0.0069053396600248781679769957237, + 0.0 +}; + +static const double hm2_28[18] = { + 0.0015105430506304420992449678146, + -0.0030210861012608841984899356291, + -0.0129475118625466465649568669819, + 0.0289161098263541773284036695929, + 0.0529984818906909399392234421792, + -0.1349130736077360572068505539514, + -0.1638291834340902345352542235443, + 0.4625714404759165262773590010400, + 0.9516421218971785225243297231697, + 0.4625714404759165262773590010400, + -0.1638291834340902345352542235443, + -0.1349130736077360572068505539514, + 0.0529984818906909399392234421792, + 0.0289161098263541773284036695929, + -0.0129475118625466465649568669819, + -0.0030210861012608841984899356291, + 0.0015105430506304420992449678146, + 0.0 +}; + +static const double h3[20] = { + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.1767766952966368811002110905262, + 0.5303300858899106433006332715786, + 0.5303300858899106433006332715786, + 0.1767766952966368811002110905262, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 +}; +static const double hm3_31[4] = { + -0.3535533905932737622004221810524, + 1.0606601717798212866012665431573, + 1.0606601717798212866012665431573, + -0.3535533905932737622004221810524 +}; + +static const double hm3_33[8] = { + 0.0662912607362388304125791589473, + -0.1988737822087164912377374768420, + -0.1546796083845572709626847042104, + 0.9943689110435824561886873842099, + 0.9943689110435824561886873842099, + -0.1546796083845572709626847042104, + -0.1988737822087164912377374768420, + 0.0662912607362388304125791589473 +}; + +static const double hm3_35[12] = { + -0.0138106793200497563359539914474, + 0.0414320379601492690078619743421, + 0.0524805814161890740766251675000, + -0.2679271788089652729175074340788, + -0.0718155324642587329469607555263, + 0.9667475524034829435167794013152, + 0.9667475524034829435167794013152, + -0.0718155324642587329469607555263, + -0.2679271788089652729175074340788, + 0.0524805814161890740766251675000, + 0.0414320379601492690078619743421, + -0.0138106793200497563359539914474 +}; + +static const double hm3_37[16] = { + 0.0030210861012608841984899356291, + -0.0090632583037826525954698068873, + -0.0168317654213106405344439270765, + 0.0746639850740189951912512662623, + 0.0313329787073628846871956180962, + -0.3011591259228349991008967259990, + -0.0264992409453454699696117210896, + 0.9516421218971785225243297231697, + 0.9516421218971785225243297231697, + -0.0264992409453454699696117210896, + -0.3011591259228349991008967259990, + 0.0313329787073628846871956180962, + 0.0746639850740189951912512662623, + -0.0168317654213106405344439270765, + -0.0090632583037826525954698068873, + 0.0030210861012608841984899356291 +}; + + +static const double hm3_39[20] = { + -0.0006797443727836989446602355165, + 0.0020392331183510968339807065496, + 0.0050603192196119810324706421788, + -0.0206189126411055346546938106687, + -0.0141127879301758447558029850103, + 0.0991347824942321571990197448581, + 0.0123001362694193142367090236328, + -0.3201919683607785695513833204624, + 0.0020500227115698857061181706055, + 0.9421257006782067372990864259380, + 0.9421257006782067372990864259380, + 0.0020500227115698857061181706055, + -0.3201919683607785695513833204624, + 0.0123001362694193142367090236328, + 0.0991347824942321571990197448581, + -0.0141127879301758447558029850103, + -0.0206189126411055346546938106687, + 0.0050603192196119810324706421788, + 0.0020392331183510968339807065496, + -0.0006797443727836989446602355165 +}; + + +static const double h4[10] = { + 0.0, -0.064538882628697058, + -0.040689417609164058, 0.41809227322161724, + 0.7884856164055829, 0.41809227322161724, + -0.040689417609164058, -0.064538882628697058, + 0.0, 0.0 +}; + +static const double hm4_44[10] = { + 0.03782845550726404, -0.023849465019556843, + -0.11062440441843718, 0.37740285561283066, + 0.85269867900889385, 0.37740285561283066, + -0.11062440441843718, -0.023849465019556843, + 0.03782845550726404, 0.0 +}; + +static const double h5[12] = { + 0.013456709459118716, -0.0026949668801115071, + -0.13670658466432914, -0.093504697400938863, + 0.47680326579848425, 0.89950610974864842, + 0.47680326579848425, -0.093504697400938863, + -0.13670658466432914, -0.0026949668801115071, + 0.013456709459118716, 0.0 +}; + +static const double hm5_55[12] = { + 0.0, 0.03968708834740544, + 0.0079481086372403219, -0.054463788468236907, + 0.34560528195603346, 0.73666018142821055, + 0.34560528195603346, -0.054463788468236907, + 0.0079481086372403219, 0.03968708834740544, + 0.0, 0.0 +}; + +static const double h6[18] = { + 0.0, 0.0, + 0.0, 0.014426282505624435, + 0.014467504896790148, -0.078722001062628819, + -0.040367979030339923, 0.41784910915027457, + 0.75890772945365415, 0.41784910915027457, + -0.040367979030339923, -0.078722001062628819, + 0.014467504896790148, 0.014426282505624435, + 0.0, 0.0, + 0.0, 0.0 +}; + +static const double hm6_68[18] = { + 0.0019088317364812906, -0.0019142861290887667, + -0.016990639867602342, 0.01193456527972926, + 0.04973290349094079, -0.077263173167204144, + -0.09405920349573646, 0.42079628460982682, + 0.82592299745840225, 0.42079628460982682, + -0.09405920349573646, -0.077263173167204144, + 0.04973290349094079, 0.01193456527972926, + -0.016990639867602342, -0.0019142861290887667, + 0.0019088317364812906, 0.0 +}; + +int filtlength(const char* name) +{ + const size_t len = strlen(name); + if (!strcmp(name, "haar") || !strcmp(name, "db1")) { return 2; } + if (len > 2 && strstr(name, "db") != NULL) + { + char* new_str = (char*)malloc(sizeof(char) * (len - 2 + 1)); + for (size_t i = 2; i < len + 1; ++i) { new_str[i - 2] = name[i]; } + + const int N = atoi(new_str); + free(new_str); + if (N > 38) + { + printf("\n Filter Not in Database \n"); + return -1; + } + + return N * 2; + } + if (!strcmp(name, "bior1.1")) { return 2; } + if (!strcmp(name, "bior1.3")) { return 6; } + if (!strcmp(name, "bior1.5")) { return 10; } + if (!strcmp(name, "bior2.2")) { return 6; } + if (!strcmp(name, "bior2.4")) { return 10; } + if (!strcmp(name, "bior2.6")) { return 14; } + if (!strcmp(name, "bior2.8")) { return 18; } + if (!strcmp(name, "bior3.1")) { return 4; } + if (!strcmp(name, "bior3.3")) { return 8; } + if (!strcmp(name, "bior3.5")) { return 12; } + if (!strcmp(name, "bior3.7")) { return 16; } + if (!strcmp(name, "bior3.9")) { return 20; } + if (!strcmp(name, "bior4.4")) { return 10; } + if (!strcmp(name, "bior5.5")) { return 12; } + if (!strcmp(name, "bior6.8")) { return 18; } + if (!strcmp(name, "rbior1.1")) { return 2; } + if (!strcmp(name, "rbior1.3")) { return 6; } + if (!strcmp(name, "rbior1.5")) { return 10; } + if (!strcmp(name, "rbior2.2")) { return 6; } + if (!strcmp(name, "rbior2.4")) { return 10; } + if (!strcmp(name, "rbior2.6")) { return 14; } + if (!strcmp(name, "rbior2.8")) { return 18; } + if (!strcmp(name, "rbior3.1")) { return 4; } + if (!strcmp(name, "rbior3.3")) { return 8; } + if (!strcmp(name, "rbior3.5")) { return 12; } + if (!strcmp(name, "rbior3.7")) { return 16; } + if (!strcmp(name, "rbior3.9")) { return 20; } + if (!strcmp(name, "rbior4.4")) { return 10; } + if (!strcmp(name, "rbior5.5")) { return 12; } + if (!strcmp(name, "rbior6.8")) { return 18; } + if (len > 4 && strstr(name, "coif") != NULL) + { + char* new_str = (char*)malloc(sizeof(char) * (len - 4 + 1)); + for (size_t i = 4; i < len + 1; ++i) { new_str[i - 4] = name[i]; } + + const int N = atoi(new_str); + free(new_str); + if (N > 17) + { + printf("\n Filter Not in Database \n"); + return -1; + } + + return N * 6; + } + if (len > 3 && strstr(name, "sym") != NULL) + { + char* new_str = (char*)malloc(sizeof(char) * (len - 3 + 1)); + for (size_t i = 3; i < len + 1; ++i) { new_str[i - 3] = name[i]; } + + const int N = atoi(new_str); + free(new_str); + if (N > 20 || N < 2) + { + printf("\n Filter Not in Database \n"); + return -1; + } + + return N * 2; + } + printf("\n Filter Not in Database \n"); + return -1; +} + +void copy_reverse(const double* in, const int N, double* out) { for (int count = 0; count < N; ++count) { out[count] = in[N - count - 1]; } } + +void qmf_wrev(const double* in, const int N, double* out) +{ + double* sigOutTemp = (double*)malloc(N * sizeof(double)); + + qmf_even(in, N, sigOutTemp); + copy_reverse(sigOutTemp, N, out); + free(sigOutTemp); +} + +void qmf_even(const double* in, const int N, double* out) +{ + for (int count = 0; count < N; ++count) + { + out[count] = in[N - count - 1]; + if (count % 2 != 0) { out[count] = -1 * out[count]; } + } +} + +void copy(const double* in, const int N, double* out) { for (int count = 0; count < N; ++count) { out[count] = in[count]; } } + +int filtcoef(const char* name, double* lp1, double* hp1, double* lp2, double* hp2) +{ + const int N = filtlength(name); + if (!strcmp(name, "haar") || !strcmp(name, "db1")) + { + copy_reverse(db1, N, lp1); + qmf_wrev(db1, N, hp1); + copy(db1, N, lp2); + qmf_even(db1, N, hp2); + + return N; + } + if (!strcmp(name, "db2")) + { + copy_reverse(db2, N, lp1); + qmf_wrev(db2, N, hp1); + copy(db2, N, lp2); + qmf_even(db2, N, hp2); + + return N; + } + if (!strcmp(name, "db3")) + { + copy_reverse(db3, N, lp1); + qmf_wrev(db3, N, hp1); + copy(db3, N, lp2); + qmf_even(db3, N, hp2); + + return N; + } + if (!strcmp(name, "db4")) + { + copy_reverse(db4, N, lp1); + qmf_wrev(db4, N, hp1); + copy(db4, N, lp2); + qmf_even(db4, N, hp2); + + return N; + } + if (!strcmp(name, "db5")) + { + copy_reverse(db5, N, lp1); + qmf_wrev(db5, N, hp1); + copy(db5, N, lp2); + qmf_even(db5, N, hp2); + + return N; + } + if (!strcmp(name, "db6")) + { + copy_reverse(db6, N, lp1); + qmf_wrev(db6, N, hp1); + copy(db6, N, lp2); + qmf_even(db6, N, hp2); + + return N; + } + if (!strcmp(name, "db7")) + { + copy_reverse(db7, N, lp1); + qmf_wrev(db7, N, hp1); + copy(db7, N, lp2); + qmf_even(db7, N, hp2); + + return N; + } + if (!strcmp(name, "db8")) + { + copy_reverse(db8, N, lp1); + qmf_wrev(db8, N, hp1); + copy(db8, N, lp2); + qmf_even(db8, N, hp2); + + return N; + } + if (!strcmp(name, "db9")) + { + copy_reverse(db9, N, lp1); + qmf_wrev(db9, N, hp1); + copy(db9, N, lp2); + qmf_even(db9, N, hp2); + + return N; + } + if (!strcmp(name, "db10")) + { + copy_reverse(db10, N, lp1); + qmf_wrev(db10, N, hp1); + copy(db10, N, lp2); + qmf_even(db10, N, hp2); + + return N; + } + if (!strcmp(name, "db11")) + { + copy_reverse(db11, N, lp1); + qmf_wrev(db11, N, hp1); + copy(db11, N, lp2); + qmf_even(db11, N, hp2); + + return N; + } + if (!strcmp(name, "db12")) + { + copy_reverse(db12, N, lp1); + qmf_wrev(db12, N, hp1); + copy(db12, N, lp2); + qmf_even(db12, N, hp2); + + return N; + } + if (!strcmp(name, "db13")) + { + copy_reverse(db13, N, lp1); + qmf_wrev(db13, N, hp1); + copy(db13, N, lp2); + qmf_even(db13, N, hp2); + + return N; + } + if (!strcmp(name, "db14")) + { + copy_reverse(db14, N, lp1); + qmf_wrev(db14, N, hp1); + copy(db14, N, lp2); + qmf_even(db14, N, hp2); + + return N; + } + if (!strcmp(name, "db15")) + { + copy_reverse(db15, N, lp1); + qmf_wrev(db15, N, hp1); + copy(db15, N, lp2); + qmf_even(db15, N, hp2); + + return N; + } + if (!strcmp(name, "db16")) + { + copy_reverse(db16, N, lp1); + qmf_wrev(db16, N, hp1); + copy(db16, N, lp2); + qmf_even(db16, N, hp2); + + return N; + } + if (!strcmp(name, "db17")) + { + copy_reverse(db17, N, lp1); + qmf_wrev(db17, N, hp1); + copy(db17, N, lp2); + qmf_even(db17, N, hp2); + + return N; + } + if (!strcmp(name, "db18")) + { + copy_reverse(db18, N, lp1); + qmf_wrev(db18, N, hp1); + copy(db18, N, lp2); + qmf_even(db18, N, hp2); + + return N; + } + if (!strcmp(name, "db19")) + { + copy_reverse(db19, N, lp1); + qmf_wrev(db19, N, hp1); + copy(db19, N, lp2); + qmf_even(db19, N, hp2); + + return N; + } + if (!strcmp(name, "db20")) + { + copy_reverse(db20, N, lp1); + qmf_wrev(db20, N, hp1); + copy(db20, N, lp2); + qmf_even(db20, N, hp2); + + return N; + } + if (!strcmp(name, "db21")) + { + copy_reverse(db21, N, lp1); + qmf_wrev(db21, N, hp1); + copy(db21, N, lp2); + qmf_even(db21, N, hp2); + + return N; + } + if (!strcmp(name, "db22")) + { + copy_reverse(db22, N, lp1); + qmf_wrev(db22, N, hp1); + copy(db22, N, lp2); + qmf_even(db22, N, hp2); + + return N; + } + if (!strcmp(name, "db23")) + { + copy_reverse(db23, N, lp1); + qmf_wrev(db23, N, hp1); + copy(db23, N, lp2); + qmf_even(db23, N, hp2); + + return N; + } + if (!strcmp(name, "db24")) + { + copy_reverse(db24, N, lp1); + qmf_wrev(db24, N, hp1); + copy(db24, N, lp2); + qmf_even(db24, N, hp2); + + return N; + } + if (!strcmp(name, "db25")) + { + copy_reverse(db25, N, lp1); + qmf_wrev(db25, N, hp1); + copy(db25, N, lp2); + qmf_even(db25, N, hp2); + + return N; + } + if (!strcmp(name, "db26")) + { + copy_reverse(db26, N, lp1); + qmf_wrev(db26, N, hp1); + copy(db26, N, lp2); + qmf_even(db26, N, hp2); + return N; + } + if (!strcmp(name, "db27")) + { + copy_reverse(db27, N, lp1); + qmf_wrev(db27, N, hp1); + copy(db27, N, lp2); + qmf_even(db27, N, hp2); + + return N; + } + if (!strcmp(name, "db28")) + { + copy_reverse(db28, N, lp1); + qmf_wrev(db28, N, hp1); + copy(db28, N, lp2); + qmf_even(db28, N, hp2); + + return N; + } + if (!strcmp(name, "db29")) + { + copy_reverse(db29, N, lp1); + qmf_wrev(db29, N, hp1); + copy(db29, N, lp2); + qmf_even(db29, N, hp2); + + return N; + } + if (!strcmp(name, "db30")) + { + copy_reverse(db30, N, lp1); + qmf_wrev(db30, N, hp1); + copy(db30, N, lp2); + qmf_even(db30, N, hp2); + + return N; + } + if (!strcmp(name, "db31")) + { + copy_reverse(db31, N, lp1); + qmf_wrev(db31, N, hp1); + copy(db31, N, lp2); + qmf_even(db31, N, hp2); + + return N; + } + if (!strcmp(name, "db32")) + { + copy_reverse(db32, N, lp1); + qmf_wrev(db32, N, hp1); + copy(db32, N, lp2); + qmf_even(db32, N, hp2); + + return N; + } + if (!strcmp(name, "db33")) + { + copy_reverse(db33, N, lp1); + qmf_wrev(db33, N, hp1); + copy(db33, N, lp2); + qmf_even(db33, N, hp2); + + return N; + } + if (!strcmp(name, "db34")) + { + copy_reverse(db34, N, lp1); + qmf_wrev(db34, N, hp1); + copy(db34, N, lp2); + qmf_even(db34, N, hp2); + + return N; + } + if (!strcmp(name, "db35")) + { + copy_reverse(db35, N, lp1); + qmf_wrev(db35, N, hp1); + copy(db35, N, lp2); + qmf_even(db35, N, hp2); + + return N; + } + if (!strcmp(name, "db36")) + { + copy_reverse(db36, N, lp1); + qmf_wrev(db36, N, hp1); + copy(db36, N, lp2); + qmf_even(db36, N, hp2); + + return N; + } + if (!strcmp(name, "db37")) + { + copy_reverse(db37, N, lp1); + qmf_wrev(db37, N, hp1); + copy(db37, N, lp2); + qmf_even(db37, N, hp2); + + return N; + } + if (!strcmp(name, "db38")) + { + copy_reverse(db38, N, lp1); + qmf_wrev(db38, N, hp1); + copy(db38, N, lp2); + qmf_even(db38, N, hp2); + + return N; + } + if (!strcmp(name, "bior1.1")) + { + copy_reverse(hm1_11, N, lp1); + qmf_wrev(h1 + 4, N, hp1); + copy(h1 + 4, N, lp2); + qmf_even(hm1_11, N, hp2); + return N; + } + if (!strcmp(name, "bior1.3")) + { + copy_reverse(hm1_13, N, lp1); + qmf_wrev(h1 + 2, N, hp1); + copy(h1 + 2, N, lp2); + qmf_even(hm1_13, N, hp2); + return N; + } + if (!strcmp(name, "bior1.5")) + { + copy_reverse(hm1_15, N, lp1); + qmf_wrev(h1, N, hp1); + copy(h1, N, lp2); + qmf_even(hm1_15, N, hp2); + return N; + } + if (!strcmp(name, "bior2.2")) + { + copy_reverse(hm2_22, N, lp1); + qmf_wrev(h2 + 6, N, hp1); + copy(h2 + 6, N, lp2); + qmf_even(hm2_22, N, hp2); + return N; + } + if (!strcmp(name, "bior2.4")) + { + copy_reverse(hm2_24, N, lp1); + qmf_wrev(h2 + 4, N, hp1); + copy(h2 + 4, N, lp2); + qmf_even(hm2_24, N, hp2); + return N; + } + if (!strcmp(name, "bior2.6")) + { + copy_reverse(hm2_26, N, lp1); + qmf_wrev(h2 + 2, N, hp1); + copy(h2 + 2, N, lp2); + qmf_even(hm2_26, N, hp2); + return N; + } + if (!strcmp(name, "bior2.8")) + { + copy_reverse(hm2_28, N, lp1); + qmf_wrev(h2, N, hp1); + copy(h2, N, lp2); + qmf_even(hm2_28, N, hp2); + return N; + } + if (!strcmp(name, "bior3.1")) + { + copy_reverse(hm3_31, N, lp1); + qmf_wrev(h3 + 8, N, hp1); + copy(h3 + 8, N, lp2); + qmf_even(hm3_31, N, hp2); + return N; + } + if (!strcmp(name, "bior3.3")) + { + copy_reverse(hm3_33, N, lp1); + qmf_wrev(h3 + 6, N, hp1); + copy(h3 + 6, N, lp2); + qmf_even(hm3_33, N, hp2); + return N; + } + if (!strcmp(name, "bior3.5")) + { + copy_reverse(hm3_35, N, lp1); + qmf_wrev(h3 + 4, N, hp1); + copy(h3 + 4, N, lp2); + qmf_even(hm3_35, N, hp2); + return N; + } + if (!strcmp(name, "bior3.7")) + { + copy_reverse(hm3_37, N, lp1); + qmf_wrev(h3 + 2, N, hp1); + copy(h3 + 2, N, lp2); + qmf_even(hm3_37, N, hp2); + return N; + } + if (!strcmp(name, "bior3.9")) + { + copy_reverse(hm3_39, N, lp1); + qmf_wrev(h3, N, hp1); + copy(h3, N, lp2); + qmf_even(hm3_39, N, hp2); + return N; + } + if (!strcmp(name, "bior4.4")) + { + copy_reverse(hm4_44, N, lp1); + qmf_wrev(h4, N, hp1); + copy(h4, N, lp2); + qmf_even(hm4_44, N, hp2); + return N; + } + if (!strcmp(name, "bior5.5")) + { + copy_reverse(hm5_55, N, lp1); + qmf_wrev(h5, N, hp1); + copy(h5, N, lp2); + qmf_even(hm5_55, N, hp2); + return N; + } + if (!strcmp(name, "bior6.8")) + { + copy_reverse(hm6_68, N, lp1); + qmf_wrev(h6, N, hp1); + copy(h6, N, lp2); + qmf_even(hm6_68, N, hp2); + return N; + } + if (!strcmp(name, "rbior1.1")) + { + copy_reverse(h1 + 4, N, lp1); + qmf_wrev(hm1_11, N, hp1); + copy(hm1_11, N, lp2); + qmf_even(h1 + 4, N, hp2); + return N; + } + if (!strcmp(name, "rbior1.3")) + { + copy_reverse(h1 + 2, N, lp1); + qmf_wrev(hm1_13, N, hp1); + copy(hm1_13, N, lp2); + qmf_even(h1 + 2, N, hp2); + return N; + } + if (!strcmp(name, "rbior1.5")) + { + copy_reverse(h1, N, lp1); + qmf_wrev(hm1_15, N, hp1); + copy(hm1_15, N, lp2); + qmf_even(h1, N, hp2); + return N; + } + if (!strcmp(name, "rbior2.2")) + { + copy_reverse(h2 + 6, N, lp1); + qmf_wrev(hm2_22, N, hp1); + copy(hm2_22, N, lp2); + qmf_even(h2 + 6, N, hp2); + return N; + } + if (!strcmp(name, "rbior2.4")) + { + copy_reverse(h2 + 4, N, lp1); + qmf_wrev(hm2_24, N, hp1); + copy(hm2_24, N, lp2); + qmf_even(h2 + 4, N, hp2); + return N; + } + if (!strcmp(name, "rbior2.6")) + { + copy_reverse(h2 + 2, N, lp1); + qmf_wrev(hm2_26, N, hp1); + copy(hm2_26, N, lp2); + qmf_even(h2 + 2, N, hp2); + return N; + } + if (!strcmp(name, "rbior2.8")) + { + copy_reverse(h2, N, lp1); + qmf_wrev(hm2_28, N, hp1); + copy(hm2_28, N, lp2); + qmf_even(h2, N, hp2); + return N; + } + if (!strcmp(name, "rbior3.1")) + { + copy_reverse(h3 + 8, N, lp1); + qmf_wrev(hm3_31, N, hp1); + copy(hm3_31, N, lp2); + qmf_even(h3 + 8, N, hp2); + return N; + } + if (!strcmp(name, "rbior3.3")) + { + copy_reverse(h3 + 6, N, lp1); + qmf_wrev(hm3_33, N, hp1); + copy(hm3_33, N, lp2); + qmf_even(h3 + 6, N, hp2); + return N; + } + if (!strcmp(name, "rbior3.5")) + { + copy_reverse(h3 + 4, N, lp1); + qmf_wrev(hm3_35, N, hp1); + copy(hm3_35, N, lp2); + qmf_even(h3 + 4, N, hp2); + return N; + } + if (!strcmp(name, "rbior3.7")) + { + copy_reverse(h3 + 2, N, lp1); + qmf_wrev(hm3_37, N, hp1); + copy(hm3_37, N, lp2); + qmf_even(h3 + 2, N, hp2); + return N; + } + if (!strcmp(name, "rbior3.9")) + { + copy_reverse(h3, N, lp1); + qmf_wrev(hm3_39, N, hp1); + copy(hm3_39, N, lp2); + qmf_even(h3, N, hp2); + return N; + } + if (!strcmp(name, "rbior4.4")) + { + copy_reverse(h4, N, lp1); + qmf_wrev(hm4_44, N, hp1); + copy(hm4_44, N, lp2); + qmf_even(h4, N, hp2); + return N; + } + if (!strcmp(name, "rbior5.5")) + { + copy_reverse(h5, N, lp1); + qmf_wrev(hm5_55, N, hp1); + copy(hm5_55, N, lp2); + qmf_even(h5, N, hp2); + return N; + } + if (!strcmp(name, "rbior6.8")) + { + copy_reverse(h6, N, lp1); + qmf_wrev(hm6_68, N, hp1); + copy(hm6_68, N, lp2); + qmf_even(h6, N, hp2); + return N; + } + if (!strcmp(name, "coif1")) + { + double* coeffTemp = (double*)malloc(N * sizeof(double)); + + copy(coif1, N, coeffTemp); + for (int i = 0; i < N; ++i) { coeffTemp[i] *= M_SQRT2; } + + copy_reverse(coeffTemp, N, lp1); + qmf_wrev(coeffTemp, N, hp1); + copy(coeffTemp, N, lp2); + qmf_even(coeffTemp, N, hp2); + free(coeffTemp); + + return N; + } + if (!strcmp(name, "coif2")) + { + double* coeffTemp = (double*)malloc(N * sizeof(double)); + + copy(coif2, N, coeffTemp); + for (int i = 0; i < N; ++i) { coeffTemp[i] *= M_SQRT2; } + + copy_reverse(coeffTemp, N, lp1); + qmf_wrev(coeffTemp, N, hp1); + copy(coeffTemp, N, lp2); + qmf_even(coeffTemp, N, hp2); + free(coeffTemp); + + return N; + } + if (!strcmp(name, "coif3")) + { + double* coeffTemp = (double*)malloc(N * sizeof(double)); + + copy(coif3, N, coeffTemp); + for (int i = 0; i < N; ++i) { coeffTemp[i] *= M_SQRT2; } + + copy_reverse(coeffTemp, N, lp1); + qmf_wrev(coeffTemp, N, hp1); + copy(coeffTemp, N, lp2); + qmf_even(coeffTemp, N, hp2); + free(coeffTemp); + + return N; + } + if (!strcmp(name, "coif4")) + { + double* coeffTemp = (double*)malloc(N * sizeof(double)); + + copy(coif4, N, coeffTemp); + for (int i = 0; i < N; ++i) { coeffTemp[i] *= M_SQRT2; } + + copy_reverse(coeffTemp, N, lp1); + qmf_wrev(coeffTemp, N, hp1); + copy(coeffTemp, N, lp2); + qmf_even(coeffTemp, N, hp2); + free(coeffTemp); + + return N; + } + if (!strcmp(name, "coif5")) + { + double* coeffTemp = (double*)malloc(N * sizeof(double)); + + copy(coif5, N, coeffTemp); + for (int i = 0; i < N; ++i) { coeffTemp[i] *= M_SQRT2; } + + copy_reverse(coeffTemp, N, lp1); + qmf_wrev(coeffTemp, N, hp1); + copy(coeffTemp, N, lp2); + qmf_even(coeffTemp, N, hp2); + free(coeffTemp); + + return N; + } + if (!strcmp(name, "coif6")) + { + double* coeffTemp = (double*)malloc(N * sizeof(double)); + + copy(coif6, N, coeffTemp); + for (int i = 0; i < N; ++i) { coeffTemp[i] *= M_SQRT2; } + + copy_reverse(coeffTemp, N, lp1); + qmf_wrev(coeffTemp, N, hp1); + copy(coeffTemp, N, lp2); + qmf_even(coeffTemp, N, hp2); + free(coeffTemp); + + return N; + } + if (!strcmp(name, "coif7")) + { + double* coeffTemp = (double*)malloc(N * sizeof(double)); + + copy(coif7, N, coeffTemp); + for (int i = 0; i < N; ++i) { coeffTemp[i] *= M_SQRT2; } + + copy_reverse(coeffTemp, N, lp1); + qmf_wrev(coeffTemp, N, hp1); + copy(coeffTemp, N, lp2); + qmf_even(coeffTemp, N, hp2); + free(coeffTemp); + + return N; + } + if (!strcmp(name, "coif8")) + { + double* coeffTemp = (double*)malloc(N * sizeof(double)); + + copy(coif8, N, coeffTemp); + for (int i = 0; i < N; ++i) { coeffTemp[i] *= M_SQRT2; } + + copy_reverse(coeffTemp, N, lp1); + qmf_wrev(coeffTemp, N, hp1); + copy(coeffTemp, N, lp2); + qmf_even(coeffTemp, N, hp2); + free(coeffTemp); + + return N; + } + if (!strcmp(name, "coif9")) + { + double* coeffTemp = (double*)malloc(N * sizeof(double)); + + copy(coif9, N, coeffTemp); + for (int i = 0; i < N; ++i) { coeffTemp[i] *= M_SQRT2; } + + copy_reverse(coeffTemp, N, lp1); + qmf_wrev(coeffTemp, N, hp1); + copy(coeffTemp, N, lp2); + qmf_even(coeffTemp, N, hp2); + free(coeffTemp); + + return N; + } + if (!strcmp(name, "coif10")) + { + double* coeffTemp = (double*)malloc(N * sizeof(double)); + + copy(coif10, N, coeffTemp); + for (int i = 0; i < N; ++i) { coeffTemp[i] *= M_SQRT2; } + + copy_reverse(coeffTemp, N, lp1); + qmf_wrev(coeffTemp, N, hp1); + copy(coeffTemp, N, lp2); + qmf_even(coeffTemp, N, hp2); + free(coeffTemp); + + return N; + } + if (!strcmp(name, "coif11")) + { + double* coeffTemp = (double*)malloc(N * sizeof(double)); + + copy(coif11, N, coeffTemp); + for (int i = 0; i < N; ++i) { coeffTemp[i] *= M_SQRT2; } + + copy_reverse(coeffTemp, N, lp1); + qmf_wrev(coeffTemp, N, hp1); + copy(coeffTemp, N, lp2); + qmf_even(coeffTemp, N, hp2); + free(coeffTemp); + + return N; + } + if (!strcmp(name, "coif12")) + { + double* coeffTemp = (double*)malloc(N * sizeof(double)); + + copy(coif12, N, coeffTemp); + for (int i = 0; i < N; ++i) { coeffTemp[i] *= M_SQRT2; } + + copy_reverse(coeffTemp, N, lp1); + qmf_wrev(coeffTemp, N, hp1); + copy(coeffTemp, N, lp2); + qmf_even(coeffTemp, N, hp2); + free(coeffTemp); + + return N; + } + if (!strcmp(name, "coif13")) + { + double* coeffTemp = (double*)malloc(N * sizeof(double)); + + copy(coif13, N, coeffTemp); + for (int i = 0; i < N; ++i) { coeffTemp[i] *= M_SQRT2; } + + copy_reverse(coeffTemp, N, lp1); + qmf_wrev(coeffTemp, N, hp1); + copy(coeffTemp, N, lp2); + qmf_even(coeffTemp, N, hp2); + free(coeffTemp); + + return N; + } + if (!strcmp(name, "coif14")) + { + double* coeffTemp = (double*)malloc(N * sizeof(double)); + + copy(coif14, N, coeffTemp); + for (int i = 0; i < N; ++i) { coeffTemp[i] *= M_SQRT2; } + + copy_reverse(coeffTemp, N, lp1); + qmf_wrev(coeffTemp, N, hp1); + copy(coeffTemp, N, lp2); + qmf_even(coeffTemp, N, hp2); + free(coeffTemp); + + return N; + } + if (!strcmp(name, "coif15")) + { + double* coeffTemp = (double*)malloc(N * sizeof(double)); + + copy(coif15, N, coeffTemp); + for (int i = 0; i < N; ++i) { coeffTemp[i] *= M_SQRT2; } + + copy_reverse(coeffTemp, N, lp1); + qmf_wrev(coeffTemp, N, hp1); + copy(coeffTemp, N, lp2); + qmf_even(coeffTemp, N, hp2); + free(coeffTemp); + + return N; + } + if (!strcmp(name, "coif16")) + { + double* coeffTemp = (double*)malloc(N * sizeof(double)); + + copy(coif16, N, coeffTemp); + for (int i = 0; i < N; ++i) { coeffTemp[i] *= M_SQRT2; } + + copy_reverse(coeffTemp, N, lp1); + qmf_wrev(coeffTemp, N, hp1); + copy(coeffTemp, N, lp2); + qmf_even(coeffTemp, N, hp2); + free(coeffTemp); + + return N; + } + if (!strcmp(name, "coif17")) + { + double* coeffTemp = (double*)malloc(N * sizeof(double)); + + copy(coif17, N, coeffTemp); + for (int i = 0; i < N; ++i) { coeffTemp[i] *= M_SQRT2; } + + copy_reverse(coeffTemp, N, lp1); + qmf_wrev(coeffTemp, N, hp1); + copy(coeffTemp, N, lp2); + qmf_even(coeffTemp, N, hp2); + free(coeffTemp); + + return N; + } + if (!strcmp(name, "sym2")) + { + copy_reverse(sym2, N, lp1); + qmf_wrev(sym2, N, hp1); + copy(sym2, N, lp2); + qmf_even(sym2, N, hp2); + return N; + } + if (!strcmp(name, "sym3")) + { + copy_reverse(sym3, N, lp1); + qmf_wrev(sym3, N, hp1); + copy(sym3, N, lp2); + qmf_even(sym3, N, hp2); + return N; + } + if (!strcmp(name, "sym4")) + { + copy_reverse(sym4, N, lp1); + qmf_wrev(sym4, N, hp1); + copy(sym4, N, lp2); + qmf_even(sym4, N, hp2); + return N; + } + if (!strcmp(name, "sym5")) + { + copy_reverse(sym5, N, lp1); + qmf_wrev(sym5, N, hp1); + copy(sym5, N, lp2); + qmf_even(sym5, N, hp2); + return N; + } + if (!strcmp(name, "sym6")) + { + copy_reverse(sym6, N, lp1); + qmf_wrev(sym6, N, hp1); + copy(sym6, N, lp2); + qmf_even(sym6, N, hp2); + return N; + } + if (!strcmp(name, "sym7")) + { + copy_reverse(sym7, N, lp1); + qmf_wrev(sym7, N, hp1); + copy(sym7, N, lp2); + qmf_even(sym7, N, hp2); + return N; + } + if (!strcmp(name, "sym8")) + { + copy_reverse(sym8, N, lp1); + qmf_wrev(sym8, N, hp1); + copy(sym8, N, lp2); + qmf_even(sym8, N, hp2); + return N; + } + if (!strcmp(name, "sym9")) + { + copy_reverse(sym9, N, lp1); + qmf_wrev(sym9, N, hp1); + copy(sym9, N, lp2); + qmf_even(sym9, N, hp2); + return N; + } + if (!strcmp(name, "sym10")) + { + copy_reverse(sym10, N, lp1); + qmf_wrev(sym10, N, hp1); + copy(sym10, N, lp2); + qmf_even(sym10, N, hp2); + return N; + } + if (!strcmp(name, "sym11")) + { + copy_reverse(sym11, N, lp1); + qmf_wrev(sym11, N, hp1); + copy(sym11, N, lp2); + qmf_even(sym11, N, hp2); + return N; + } + if (!strcmp(name, "sym12")) + { + copy_reverse(sym12, N, lp1); + qmf_wrev(sym12, N, hp1); + copy(sym12, N, lp2); + qmf_even(sym12, N, hp2); + return N; + } + if (!strcmp(name, "sym13")) + { + copy_reverse(sym13, N, lp1); + qmf_wrev(sym13, N, hp1); + copy(sym13, N, lp2); + qmf_even(sym13, N, hp2); + return N; + } + if (!strcmp(name, "sym14")) + { + copy_reverse(sym14, N, lp1); + qmf_wrev(sym14, N, hp1); + copy(sym14, N, lp2); + qmf_even(sym14, N, hp2); + return N; + } + if (!strcmp(name, "sym15")) + { + copy_reverse(sym15, N, lp1); + qmf_wrev(sym15, N, hp1); + copy(sym15, N, lp2); + qmf_even(sym15, N, hp2); + return N; + } + if (!strcmp(name, "sym16")) + { + copy_reverse(sym16, N, lp1); + qmf_wrev(sym16, N, hp1); + copy(sym16, N, lp2); + qmf_even(sym16, N, hp2); + return N; + } + if (!strcmp(name, "sym17")) + { + copy_reverse(sym17, N, lp1); + qmf_wrev(sym17, N, hp1); + copy(sym17, N, lp2); + qmf_even(sym17, N, hp2); + return N; + } + if (!strcmp(name, "sym18")) + { + copy_reverse(sym18, N, lp1); + qmf_wrev(sym18, N, hp1); + copy(sym18, N, lp2); + qmf_even(sym18, N, hp2); + return N; + } + if (!strcmp(name, "sym19")) + { + copy_reverse(sym19, N, lp1); + qmf_wrev(sym19, N, hp1); + copy(sym19, N, lp2); + qmf_even(sym19, N, hp2); + return N; + } + if (!strcmp(name, "sym20")) + { + copy_reverse(sym20, N, lp1); + qmf_wrev(sym20, N, hp1); + copy(sym20, N, lp2); + qmf_even(sym20, N, hp2); + return N; + } + printf("\n Filter Not in Database \n"); + return -1; +} diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavefilt.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavefilt.h new file mode 100644 index 0000000..a0636c5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavefilt.h @@ -0,0 +1,27 @@ +/* +Copyright (c) 2014, Rafat Hussain +Copyright (c) 2016, Holger Nahrstaedt +*/ +#pragma once + +#include +#include "conv.h" +#define _USE_MATH_DEFINES +#include "math.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +int filtlength(const char* name); + +int filtcoef(const char* name, double* lp1, double* hp1, double* lp2, double* hp2); + +void copy_reverse(const double* in, const int N, double* out); +void qmf_even(const double* in, const int N, double* out); +void qmf_wrev(const double* in, const int N, double* out); +void copy(const double* in, const int N, double* out); +#ifdef __cplusplus +} +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavefunc.c b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavefunc.c new file mode 100644 index 0000000..b3dcf72 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavefunc.c @@ -0,0 +1,219 @@ +#include "wavefunc.h" + +void meyer(const int N, const double lb, const double ub, double* phi, double* psi, double* tgrid) +{ + int i; + double theta, x, x2, x3, x4, v, cs; + + const int M = divideby(N, 2); + + if (M == 0) + { + printf("Size of Wavelet must be a power of 2"); + exit(1); + } + if (lb >= ub) + { + printf("upper bound must be greater than lower bound"); + exit(1); + } + + const fft_object obj = fft_init(N, -1); + double* w = (double*)malloc(sizeof(double) * N); + fft_data* phiw = (fft_data*)malloc(sizeof(fft_data) * N); + fft_data* psiw = (fft_data*)malloc(sizeof(fft_data) * N); + fft_data* oup = (fft_data*)malloc(sizeof(fft_data) * N); + + const double delta = 2 * (ub - lb) / PI2; + + double j = (double)N; + j *= -1.0; + + for (i = 0; i < N; ++i) + { + w[i] = j / delta; + j += 2.0; + psiw[i].re = psiw[i].im = 0.0; + phiw[i].re = phiw[i].im = 0.0; + } + + + for (i = 0; i < N; ++i) + { + const double wf = fabs(w[i]); + if (wf <= PI2 / 3.0) { phiw[i].re = 1.0; } + if (wf > PI2 / 3.0 && wf <= 2 * PI2 / 3.0) + { + x = (3 * wf / PI2) - 1.0; + x2 = x * x; + x3 = x2 * x; + x4 = x3 * x; + v = x4 * (35 - 84 * x + 70 * x2 - 20 * x3); + theta = v * PI2 / 4.0; + cs = cos(theta); + const double sn = sin(theta); + + phiw[i].re = cs; + psiw[i].re = cos(w[i] / 2.0) * sn; + psiw[i].im = sin(w[i] / 2.0) * sn; + } + if (wf > 2.0 * PI2 / 3.0 && wf <= 4 * PI2 / 3.0) + { + x = (1.5 * wf / PI2) - 1.0; + x2 = x * x; + x3 = x2 * x; + x4 = x3 * x; + v = x4 * (35 - 84 * x + 70 * x2 - 20 * x3); + theta = v * PI2 / 4.0; + cs = cos(theta); + + psiw[i].re = cos(w[i] / 2.0) * cs; + psiw[i].im = sin(w[i] / 2.0) * cs; + } + } + + + nsfft_exec(obj, phiw, oup, lb, ub, tgrid); + + + for (i = 0; i < N; ++i) { phi[i] = oup[i].re / N; } + + nsfft_exec(obj, psiw, oup, lb, ub, tgrid); + + + for (i = 0; i < N; ++i) { psi[i] = oup[i].re / N; } + + + free(oup); + free(phiw); + free(psiw); + free(w); +} + +void gauss(int N, int p, double lb, double ub, double* psi, double* t) +{ + double num, t2, t4; + int i; + + if (lb >= ub) + { + printf("upper bound must be greater than lower bound"); + exit(1); + } + + t[0] = lb; + t[N - 1] = ub; + const double delta = (ub - lb) / (N - 1); + for (i = 1; i < N - 1; ++i) { t[i] = lb + delta * i; } + + const double den = sqrt(gamma(p + 0.5)); + + if ((p + 1) % 2 == 0) { num = 1.0; } + else { num = -1.0; } + + num /= den; + + //printf("\n%g\n",num); + + if (p == 1) { for (i = 0; i < N; ++i) { psi[i] = -t[i] * exp(- t[i] * t[i] / 2.0) * num; } } + else if (p == 2) + { + for (i = 0; i < N; ++i) + { + t2 = t[i] * t[i]; + psi[i] = (-1.0 + t2) * exp(- t2 / 2.0) * num; + } + } + else if (p == 3) + { + for (i = 0; i < N; ++i) + { + t2 = t[i] * t[i]; + psi[i] = t[i] * (3.0 - t2) * exp(- t2 / 2.0) * num; + } + } + else if (p == 4) + { + for (i = 0; i < N; ++i) + { + t2 = t[i] * t[i]; + psi[i] = (t2 * t2 - 6.0 * t2 + 3.0) * exp(- t2 / 2.0) * num; + } + } + else if (p == 5) + { + for (i = 0; i < N; ++i) + { + t2 = t[i] * t[i]; + psi[i] = t[i] * (-t2 * t2 + 10.0 * t2 - 15.0) * exp(- t2 / 2.0) * num; + } + } + else if (p == 6) + { + for (i = 0; i < N; ++i) + { + t2 = t[i] * t[i]; + psi[i] = (t2 * t2 * t2 - 15.0 * t2 * t2 + 45.0 * t2 - 15.0) * exp(- t2 / 2.0) * num; + } + } + else if (p == 7) + { + for (i = 0; i < N; ++i) + { + t2 = t[i] * t[i]; + psi[i] = t[i] * (-t2 * t2 * t2 + 21.0 * t2 * t2 - 105.0 * t2 + 105.0) * exp(- t2 / 2.0) * num; + } + } + else if (p == 8) + { + for (i = 0; i < N; ++i) + { + t2 = t[i] * t[i]; + t4 = t2 * t2; + psi[i] = (t4 * t4 - 28.0 * t4 * t2 + 210.0 * t4 - 420.0 * t2 + 105.0) * exp(- t2 / 2.0) * num; + } + } + else if (p == 9) + { + for (i = 0; i < N; ++i) + { + t2 = t[i] * t[i]; + t4 = t2 * t2; + psi[i] = t[i] * (- t4 * t4 + 36.0 * t4 * t2 - 378.0 * t4 + 1260.0 * t2 - 945.0) * exp(- t2 / 2.0) * num; + } + } + else if (p == 10) + { + for (i = 0; i < N; ++i) + { + t2 = t[i] * t[i]; + t4 = t2 * t2; + psi[i] = (t4 * t4 * t2 - 45.0 * t4 * t4 + 630.0 * t4 * t2 - 3150.0 * t4 + 4725.0 * t2 - 945.0) * exp(- t2 / 2.0) * num; + } + } + else + { + printf("\n The Gaussian Derivative Wavelet is only available for Derivatives 1 to 10"); + exit(1); + } +} + +void mexhat(int N, double lb, double ub, double* psi, double* t) { gauss(N, 2, lb, ub, psi, t); } + +void morlet(int N, double lb, double ub, double* psi, double* t) +{ + int i; + + if (lb >= ub) + { + printf("upper bound must be greater than lower bound"); + exit(1); + } + + t[0] = lb; + t[N - 1] = ub; + const double delta = (ub - lb) / (N - 1); + for (i = 1; i < N - 1; ++i) { t[i] = lb + delta * i; } + + for (i = 0; i < N; ++i) { psi[i] = exp(- t[i] * t[i] / 2.0) * cos(5 * t[i]); } +} diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavefunc.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavefunc.h new file mode 100644 index 0000000..7485bfb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavefunc.h @@ -0,0 +1,16 @@ +#pragma once + +#include "cwtmath.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void meyer(const int N, const double lb, const double ub, double* phi, double* psi, double* tgrid); +void gauss(int N, int p, double lb, double ub, double* psi, double* t); +void mexhat(int N, double lb, double ub, double* psi, double* t); +void morlet(int N, double lb, double ub, double* psi, double* t); + +#ifdef __cplusplus +} +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavelib.c b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavelib.c new file mode 100644 index 0000000..28cbb88 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavelib.c @@ -0,0 +1,2669 @@ +/* + Copyright (c) 2014, Rafat Hussain +*/ + +#include "wavelib.h" + +wave_object wave_init(char* wname) +{ + const int retval = (wname != NULL) ? filtlength(wname) : 0; + wave_object obj = (wave_object)malloc(sizeof(struct wave_set) + sizeof(double) * 4 * retval); + + obj->filtlength = retval; + obj->lpd_len = obj->hpd_len = obj->lpr_len = obj->hpr_len = obj->filtlength; + strcpy(obj->wname, wname); + if (wname != NULL) { filtcoef(wname, obj->params, obj->params + retval, obj->params + 2 * retval, obj->params + 3 * retval); } + obj->lpd = &obj->params[0]; + obj->hpd = &obj->params[retval]; + obj->lpr = &obj->params[2 * retval]; + obj->hpr = &obj->params[3 * retval]; + return obj; +} + +wt_object wt_init(wave_object wave, char* method, int siglength, int J) +{ + if (J > 100) + { + printf("\n The Decomposition Iterations Cannot Exceed 100. Exiting \n"); + exit(-1); + } + + const int size = wave->filtlength; + const int MaxIter = wmaxiter(siglength, size); + + if (J > MaxIter) + { + printf("\n Error - The Signal Can only be iterated %d times using this wavelet. Exiting\n", MaxIter); + exit(-1); + } + + wt_object obj = NULL; + if (method == NULL) + { + obj = (wt_object)malloc(sizeof(struct wt_set) + sizeof(double) * (siglength + 2 * J * (size + 1))); + obj->outlength = siglength + 2 * J * (size + 1); // Default + strcpy(obj->ext, "sym"); // Default + } + else if (!strcmp(method, "dwt") || !strcmp(method, "DWT")) + { + obj = (wt_object)malloc(sizeof(struct wt_set) + sizeof(double) * (siglength + 2 * J * (size + 1))); + obj->outlength = siglength + 2 * J * (size + 1); // Default + strcpy(obj->ext, "sym"); // Default + } + else if (!strcmp(method, "swt") || !strcmp(method, "SWT")) + { + if (!testSWTlength(siglength, J)) + { + printf("\n For SWT the signal length must be a multiple of 2^J. \n"); + exit(-1); + } + + obj = (wt_object)malloc(sizeof(struct wt_set) + sizeof(double) * (siglength * (J + 1))); + obj->outlength = siglength * (J + 1); // Default + strcpy(obj->ext, "per"); // Default + } + else if (!strcmp(method, "modwt") || !strcmp(method, "MODWT")) + { + if (!strstr(wave->wname, "db")) + { + if (!strstr(wave->wname, "sym")) + { + if (!strstr(wave->wname, "coif")) + { + printf("\n MODWT is only implemented for orthogonal wavelet families - db, sym and coif \n"); + exit(-1); + } + } + } + + obj = (wt_object)malloc(sizeof(struct wt_set) + sizeof(double) * (siglength * (J + 1))); + obj->outlength = siglength * (J + 1); // Default + strcpy(obj->ext, "per"); // Default + } + + obj->wave = wave; + obj->siglength = siglength; + obj->J = J; + obj->MaxIter = MaxIter; + strcpy(obj->method, method); + + if (siglength % 2 == 0) { obj->even = 1; } + else { obj->even = 0; } + + obj->cobj = NULL; + + strcpy(obj->cmethod, "direct"); // Default + obj->cfftset = 0; + obj->lenlength = J + 2; + obj->output = &obj->params[0]; + if (!strcmp(method, "dwt") || !strcmp(method, "DWT")) { for (int i = 0; i < siglength + 2 * J * (size + 1); ++i) { obj->params[i] = 0.0; } } + else if (!strcmp(method, "swt") || !strcmp(method, "SWT") || !strcmp(method, "modwt") || !strcmp(method, "MODWT")) + { + for (int i = 0; i < siglength * (J + 1); ++i) { obj->params[i] = 0.0; } + } + //wave_summary(obj->wave); + + return obj; +} + +wtree_object wtree_init(wave_object wave, int siglength, int J) +{ + if (J > 100) + { + printf("\n The Decomposition Iterations Cannot Exceed 100. Exiting \n"); + exit(-1); + } + + const int size = wave->filtlength; + const int MaxIter = wmaxiter(siglength, size); + + if (J > MaxIter) + { + printf("\n Error - The Signal Can only be iterated %d times using this wavelet. Exiting\n", MaxIter); + exit(-1); + } + int temp = 1; + int elength = 0; + int nodes = 0; + for (int i = 0; i < J; ++i) + { + temp *= 2; + nodes += temp; + const int temp2 = (size - 2) * (temp - 1); + elength += temp2; + } + + wtree_object obj = (wtree_object)malloc(sizeof(struct wtree_set) + sizeof(double) * (siglength * (J + 1) + elength + nodes + J + 1)); + obj->outlength = siglength * (J + 1) + elength; + strcpy(obj->ext, "sym"); + + obj->wave = wave; + obj->siglength = siglength; + obj->J = J; + obj->MaxIter = MaxIter; + strcpy(obj->method, "dwt"); + + if (siglength % 2 == 0) { obj->even = 1; } + else { obj->even = 0; } + + obj->cobj = NULL; + obj->nodes = nodes; + + obj->cfftset = 0; + obj->lenlength = J + 2; + obj->output = &obj->params[0]; + obj->nodelength = (int*)&obj->params[siglength * (J + 1) + elength]; + obj->coeflength = (int*)&obj->params[siglength * (J + 1) + elength + nodes]; + + for (int i = 0; i < siglength * (J + 1) + elength + nodes + J + 1; ++i) { obj->params[i] = 0.0; } + + //wave_summary(obj->wave); + + return obj; +} + +wpt_object wpt_init(wave_object wave, int siglength, int J) +{ + if (J > 100) + { + printf("\n The Decomposition Iterations Cannot Exceed 100. Exiting \n"); + exit(-1); + } + + const int size = wave->filtlength; + const int MaxIter = wmaxiter(siglength, size); + if (J > MaxIter) + { + printf("\n Error - The Signal Can only be iterated %d times using this wavelet. Exiting\n", MaxIter); + exit(-1); + } + int temp = 1; + int nodes = 0; + for (int i = 0; i < J; ++i) + { + temp *= 2; + nodes += temp; + } + + int k = J; + int p2 = 2; + int N = siglength; + const int lp = size; + int elength = 0; + while (k > 0) + { + N = N + lp - 2; + N = (int)ceil((double)N / 2.0); + elength = p2 * N; + k--; + p2 *= 2; + } + //printf("elength %d", elength); + + wpt_object obj = (wpt_object)malloc(sizeof(struct wpt_set) + sizeof(double) * (elength + 4 * nodes + 2 * J + 6)); + obj->outlength = siglength + 2 * (J + 1) * (size + 1); + strcpy(obj->ext, "sym"); + strcpy(obj->entropy, "shannon"); + obj->eparam = 0.0; + + obj->wave = wave; + obj->siglength = siglength; + obj->J = J; + obj->MaxIter = MaxIter; + + if (siglength % 2 == 0) { obj->even = 1; } + else { obj->even = 0; } + + obj->cobj = NULL; + obj->nodes = nodes; + + obj->lenlength = J + 2; + obj->output = &obj->params[0]; + obj->costvalues = &obj->params[elength]; + obj->basisvector = &obj->params[elength + nodes + 1]; + obj->nodeindex = (int*)&obj->params[elength + 2 * nodes + 2]; + obj->numnodeslevel = (int*)&obj->params[elength + 4 * nodes + 4]; + obj->coeflength = (int*)&obj->params[elength + 4 * nodes + J + 5]; + + for (int i = 0; i < elength + 4 * nodes + 2 * J + 6; ++i) { obj->params[i] = 0.0; } + + //wave_summary(obj->wave); + + return obj; +} + +cwt_object cwt_init(char* wave, double param, int siglength, double dt, int J) +{ + int mother = 0; + double s0 = 0, dj = 0; + char* pdefault = "pow"; + + const int m = (int)param; + int odd = 1; + if (2 * (m / 2) == m) { odd = 0; } + + const int N = siglength; + const int nj2 = 2 * N * J; + cwt_object obj = (cwt_object)malloc(sizeof(struct cwt_set) + sizeof(double) * (nj2 + 2 * J + N)); + + if (!strcmp(wave, "morlet") || !strcmp(wave, "morl")) + { + s0 = 2 * dt; + dj = 0.4875; + mother = 0; + if (param < 0.0) + { + printf("\n Morlet Wavelet Parameter should be >= 0 \n"); + free(obj); + return NULL; + } + if (param == 0) { param = 6.0; } + strcpy(obj->wave, "morlet"); + } + else if (!strcmp(wave, "paul")) + { + s0 = 2 * dt; + dj = 0.4875; + mother = 1; + if (param < 0 || param > 20) + { + printf("\n Paul Wavelet Parameter should be > 0 and <= 20 \n"); + free(obj); + return NULL; + } + if (param == 0) { param = 4.0; } + strcpy(obj->wave, "paul"); + } + else if (!strcmp(wave, "dgauss") || !strcmp(wave, "dog")) + { + s0 = 2 * dt; + dj = 0.4875; + mother = 2; + if (param < 0 || odd == 1) + { + printf("\n DOG Wavelet Parameter should be > 0 and even \n"); + free(obj); + return NULL; + } + if (param == 0) { param = 2.0; } + strcpy(obj->wave, "dog"); + } + + obj->pow = 2; + strcpy(obj->type, pdefault); + + obj->s0 = s0; + obj->dj = dj; + obj->dt = dt; + obj->J = J; + obj->siglength = siglength; + obj->sflag = 0; + obj->pflag = 1; + obj->mother = mother; + obj->m = param; + + const double t1 = 0.499999 + log((double)N) / log(2.0); + const int ibase2 = 1 + (int)t1; + + obj->npad = (int)pow(2.0, (double)ibase2); + + obj->output = (cplx_data*)&obj->params[0]; + obj->scale = &obj->params[nj2]; + obj->period = &obj->params[nj2 + J]; + obj->coi = &obj->params[nj2 + 2 * J]; + + for (int i = 0; i < nj2 + 2 * J + N; ++i) { obj->params[i] = 0.0; } + + return obj; +} + + +static void wconv(wt_object wt, double* sig, int N, double* filt, int L, double* oup) +{ + if (!strcmp(wt->cmethod, "direct")) { conv_direct(sig, N, filt, L, oup); } + else if (!strcmp(wt->cmethod, "fft") || !strcmp(wt->cmethod, "FFT")) + { + if (wt->cfftset == 0) + { + wt->cobj = conv_init(N, L); + conv_fft(wt->cobj, sig, filt, oup); + free_conv(wt->cobj); + } + else { conv_fft(wt->cobj, sig, filt, oup); } + } + else + { + printf("Convolution Only accepts two methods - direct and fft"); + exit(-1); + } +} + + +static void dwt_per(wt_object wt, double* inp, int N, double* cA, int len_cA, double* cD, int len_cD) +{ + const int len_avg = wt->wave->lpd_len; + const int l2 = len_avg / 2; + const int isodd = N % 2; + + for (int i = 0; i < len_cA; ++i) + { + const int t = 2 * i + l2; + cA[i] = 0.0; + cD[i] = 0.0; + for (int l = 0; l < len_avg; ++l) + { + if ((t - l) >= l2 && (t - l) < N) + { + cA[i] += wt->wave->lpd[l] * inp[t - l]; + cD[i] += wt->wave->hpd[l] * inp[t - l]; + } + else if ((t - l) < l2 && (t - l) >= 0) + { + cA[i] += wt->wave->lpd[l] * inp[t - l]; + cD[i] += wt->wave->hpd[l] * inp[t - l]; + } + else if ((t - l) < 0 && isodd == 0) + { + cA[i] += wt->wave->lpd[l] * inp[t - l + N]; + cD[i] += wt->wave->hpd[l] * inp[t - l + N]; + } + else if ((t - l) < 0 && isodd == 1) + { + if ((t - l) != -1) + { + cA[i] += wt->wave->lpd[l] * inp[t - l + N + 1]; + cD[i] += wt->wave->hpd[l] * inp[t - l + N + 1]; + } + else + { + cA[i] += wt->wave->lpd[l] * inp[N - 1]; + cD[i] += wt->wave->hpd[l] * inp[N - 1]; + } + } + else if ((t - l) >= N && isodd == 0) + { + cA[i] += wt->wave->lpd[l] * inp[t - l - N]; + cD[i] += wt->wave->hpd[l] * inp[t - l - N]; + } + else if ((t - l) >= N && isodd == 1) + { + if (t - l != N) + { + cA[i] += wt->wave->lpd[l] * inp[t - l - (N + 1)]; + cD[i] += wt->wave->hpd[l] * inp[t - l - (N + 1)]; + } + else + { + cA[i] += wt->wave->lpd[l] * inp[N - 1]; + cD[i] += wt->wave->hpd[l] * inp[N - 1]; + } + } + } + } +} + +static void wtree_per(wtree_object wt, double* inp, int N, double* cA, int len_cA, double* cD, int len_cD) +{ + const int len_avg = wt->wave->lpd_len; + const int l2 = len_avg / 2; + const int isodd = N % 2; + + for (int i = 0; i < len_cA; ++i) + { + const int t = 2 * i + l2; + cA[i] = 0.0; + cD[i] = 0.0; + for (int l = 0; l < len_avg; ++l) + { + if ((t - l) >= l2 && (t - l) < N) + { + cA[i] += wt->wave->lpd[l] * inp[t - l]; + cD[i] += wt->wave->hpd[l] * inp[t - l]; + } + else if ((t - l) < l2 && (t - l) >= 0) + { + cA[i] += wt->wave->lpd[l] * inp[t - l]; + cD[i] += wt->wave->hpd[l] * inp[t - l]; + } + else if ((t - l) < 0 && isodd == 0) + { + cA[i] += wt->wave->lpd[l] * inp[t - l + N]; + cD[i] += wt->wave->hpd[l] * inp[t - l + N]; + } + else if ((t - l) < 0 && isodd == 1) + { + if ((t - l) != -1) + { + cA[i] += wt->wave->lpd[l] * inp[t - l + N + 1]; + cD[i] += wt->wave->hpd[l] * inp[t - l + N + 1]; + } + else + { + cA[i] += wt->wave->lpd[l] * inp[N - 1]; + cD[i] += wt->wave->hpd[l] * inp[N - 1]; + } + } + else if ((t - l) >= N && isodd == 0) + { + cA[i] += wt->wave->lpd[l] * inp[t - l - N]; + cD[i] += wt->wave->hpd[l] * inp[t - l - N]; + } + else if ((t - l) >= N && isodd == 1) + { + if (t - l != N) + { + cA[i] += wt->wave->lpd[l] * inp[t - l - (N + 1)]; + cD[i] += wt->wave->hpd[l] * inp[t - l - (N + 1)]; + } + else + { + cA[i] += wt->wave->lpd[l] * inp[N - 1]; + cD[i] += wt->wave->hpd[l] * inp[N - 1]; + } + } + } + } +} + +static void dwpt_per(wpt_object wt, double* inp, int N, double* cA, int len_cA, double* cD, int len_cD) +{ + const int len_avg = wt->wave->lpd_len; + const int l2 = len_avg / 2; + const int isodd = N % 2; + + for (int i = 0; i < len_cA; ++i) + { + const int t = 2 * i + l2; + cA[i] = 0.0; + cD[i] = 0.0; + for (int l = 0; l < len_avg; ++l) + { + if ((t - l) >= l2 && (t - l) < N) + { + cA[i] += wt->wave->lpd[l] * inp[t - l]; + cD[i] += wt->wave->hpd[l] * inp[t - l]; + } + else if ((t - l) < l2 && (t - l) >= 0) + { + cA[i] += wt->wave->lpd[l] * inp[t - l]; + cD[i] += wt->wave->hpd[l] * inp[t - l]; + } + else if ((t - l) < 0 && isodd == 0) + { + cA[i] += wt->wave->lpd[l] * inp[t - l + N]; + cD[i] += wt->wave->hpd[l] * inp[t - l + N]; + } + else if ((t - l) < 0 && isodd == 1) + { + if ((t - l) != -1) + { + cA[i] += wt->wave->lpd[l] * inp[t - l + N + 1]; + cD[i] += wt->wave->hpd[l] * inp[t - l + N + 1]; + } + else + { + cA[i] += wt->wave->lpd[l] * inp[N - 1]; + cD[i] += wt->wave->hpd[l] * inp[N - 1]; + } + } + else if ((t - l) >= N && isodd == 0) + { + cA[i] += wt->wave->lpd[l] * inp[t - l - N]; + cD[i] += wt->wave->hpd[l] * inp[t - l - N]; + } + else if ((t - l) >= N && isodd == 1) + { + if (t - l != N) + { + cA[i] += wt->wave->lpd[l] * inp[t - l - (N + 1)]; + cD[i] += wt->wave->hpd[l] * inp[t - l - (N + 1)]; + } + else + { + cA[i] += wt->wave->lpd[l] * inp[N - 1]; + cD[i] += wt->wave->hpd[l] * inp[N - 1]; + } + } + } + } +} + +static void dwt_sym(wt_object wt, double* inp, int N, double* cA, int len_cA, double* cD, int len_cD) +{ + const int len_avg = wt->wave->lpd_len; + + for (int i = 0; i < len_cA; ++i) + { + const int t = 2 * i + 1; + cA[i] = 0.0; + cD[i] = 0.0; + for (int l = 0; l < len_avg; ++l) + { + if ((t - l) >= 0 && (t - l) < N) + { + cA[i] += wt->wave->lpd[l] * inp[t - l]; + cD[i] += wt->wave->hpd[l] * inp[t - l]; + } + else if ((t - l) < 0) + { + cA[i] += wt->wave->lpd[l] * inp[-t + l - 1]; + cD[i] += wt->wave->hpd[l] * inp[-t + l - 1]; + } + else if ((t - l) >= N) + { + cA[i] += wt->wave->lpd[l] * inp[2 * N - t + l - 1]; + cD[i] += wt->wave->hpd[l] * inp[2 * N - t + l - 1]; + } + } + } +} + +static void wtree_sym(wtree_object wt, double* inp, int N, double* cA, int len_cA, double* cD, int len_cD) +{ + const int len_avg = wt->wave->lpd_len; + + for (int i = 0; i < len_cA; ++i) + { + int t = 2 * i + 1; + cA[i] = 0.0; + cD[i] = 0.0; + for (int l = 0; l < len_avg; ++l) + { + if ((t - l) >= 0 && (t - l) < N) + { + cA[i] += wt->wave->lpd[l] * inp[t - l]; + cD[i] += wt->wave->hpd[l] * inp[t - l]; + } + else if ((t - l) < 0) + { + cA[i] += wt->wave->lpd[l] * inp[-t + l - 1]; + cD[i] += wt->wave->hpd[l] * inp[-t + l - 1]; + } + else if ((t - l) >= N) + { + cA[i] += wt->wave->lpd[l] * inp[2 * N - t + l - 1]; + cD[i] += wt->wave->hpd[l] * inp[2 * N - t + l - 1]; + } + } + } +} + +static void dwpt_sym(wpt_object wt, double* inp, int N, double* cA, int len_cA, double* cD, int len_cD) +{ + const int len_avg = wt->wave->lpd_len; + + for (int i = 0; i < len_cA; ++i) + { + int t = 2 * i + 1; + cA[i] = 0.0; + cD[i] = 0.0; + for (int l = 0; l < len_avg; ++l) + { + if ((t - l) >= 0 && (t - l) < N) + { + cA[i] += wt->wave->lpd[l] * inp[t - l]; + cD[i] += wt->wave->hpd[l] * inp[t - l]; + } + else if ((t - l) < 0) + { + cA[i] += wt->wave->lpd[l] * inp[-t + l - 1]; + cD[i] += wt->wave->hpd[l] * inp[-t + l - 1]; + } + else if ((t - l) >= N) + { + cA[i] += wt->wave->lpd[l] * inp[2 * N - t + l - 1]; + cD[i] += wt->wave->hpd[l] * inp[2 * N - t + l - 1]; + } + } + } +} + +static void dwt1(wt_object wt, double* sig, int len_sig, double* cA, int len_cA, double* cD, int len_cD) +{ + double *signal, *cA_undec; + const int len_avg = (wt->wave->lpd_len + wt->wave->hpd_len) / 2; + //len_sig = 2 * (int)ceil((double)len_sig / 2.0); + + const int D = 2; + + if (!strcmp(wt->ext, "per")) + { + signal = (double*)malloc(sizeof(double) * (len_sig + len_avg + (len_sig % 2))); + + len_sig = per_ext(sig, len_sig, len_avg / 2, signal); + + cA_undec = (double*)malloc(sizeof(double) * (len_sig + len_avg + wt->wave->lpd_len - 1)); + + if (wt->wave->lpd_len == wt->wave->hpd_len && (!strcmp(wt->cmethod, "fft") || !strcmp(wt->cmethod, "FFT"))) + { + wt->cobj = conv_init(len_sig + len_avg, wt->wave->lpd_len); + wt->cfftset = 1; + } + else if (!(wt->wave->lpd_len == wt->wave->hpd_len)) + { + printf("Decomposition Filters must have the same length."); + exit(-1); + } + + wconv(wt, signal, len_sig + len_avg, wt->wave->lpd, wt->wave->lpd_len, cA_undec); + downsamp(cA_undec + len_avg, len_sig, D, cA); + wconv(wt, signal, len_sig + len_avg, wt->wave->hpd, wt->wave->hpd_len, cA_undec); + downsamp(cA_undec + len_avg, len_sig, D, cD); + } + else if (!strcmp(wt->ext, "sym")) + { + //printf("\n YES %s \n", wt->ext); + const int lf = wt->wave->lpd_len;// lpd and hpd have the same length + + signal = (double*)malloc(sizeof(double) * (len_sig + 2 * (lf - 1))); + + len_sig = symm_ext(sig, len_sig, lf - 1, signal); + + cA_undec = (double*)malloc(sizeof(double) * (len_sig + 3 * (lf - 1))); + + if (wt->wave->lpd_len == wt->wave->hpd_len && (!strcmp(wt->cmethod, "fft") || !strcmp(wt->cmethod, "FFT"))) + { + wt->cobj = conv_init(len_sig + 2 * (lf - 1), lf); + wt->cfftset = 1; + } + else if (!(wt->wave->lpd_len == wt->wave->hpd_len)) + { + printf("Decomposition Filters must have the same length."); + exit(-1); + } + + wconv(wt, signal, len_sig + 2 * (lf - 1), wt->wave->lpd, wt->wave->lpd_len, cA_undec); + downsamp(cA_undec + lf, len_sig + lf - 2, D, cA); + wconv(wt, signal, len_sig + 2 * (lf - 1), wt->wave->hpd, wt->wave->hpd_len, cA_undec); + downsamp(cA_undec + lf, len_sig + lf - 2, D, cD); + } + else + { + printf("Signal extension can be either per or sym"); + exit(-1); + } + + + if (wt->wave->lpd_len == wt->wave->hpd_len && (!strcmp(wt->cmethod, "fft") || !strcmp(wt->cmethod, "FFT"))) + { + free_conv(wt->cobj); + wt->cfftset = 0; + } + + free(signal); + free(cA_undec); +} + +void dwt(wt_object wt, double* inp) +{ + int i, iter; + int len_cA; + + int temp_len = wt->siglength; + int J = wt->J; + wt->length[J + 1] = temp_len; + wt->outlength = 0; + wt->zpad = 0; + double* orig = (double*)malloc(sizeof(double) * temp_len); + double* orig2 = (double*)malloc(sizeof(double) * temp_len); + /* + if ((temp_len % 2) == 0) { + wt->zpad = 0; + orig = (double*)malloc(sizeof(double)* temp_len); + orig2 = (double*)malloc(sizeof(double)* temp_len); + } + else { + wt->zpad = 1; + temp_len++; + orig = (double*)malloc(sizeof(double)* temp_len); + orig2 = (double*)malloc(sizeof(double)* temp_len); + } + */ + + for (i = 0; i < wt->siglength; ++i) { orig[i] = inp[i]; } + + if (wt->zpad == 1) { orig[temp_len - 1] = orig[temp_len - 2]; } + + int N = temp_len; + int lp = wt->wave->lpd_len; + + if (!strcmp(wt->ext, "per")) + { + i = J; + while (i > 0) + { + N = (int)ceil((double)N / 2.0); + wt->length[i] = N; + wt->outlength += wt->length[i]; + i--; + } + wt->length[0] = wt->length[1]; + wt->outlength += wt->length[0]; + N = wt->outlength; + + for (iter = 0; iter < J; ++iter) + { + len_cA = wt->length[J - iter]; + N -= len_cA; + if (!strcmp(wt->cmethod, "fft") || !strcmp(wt->cmethod, "FFT")) { dwt1(wt, orig, temp_len, orig2, len_cA, wt->params + N, len_cA); } + else { dwt_per(wt, orig, temp_len, orig2, len_cA, wt->params + N, len_cA); } + temp_len = wt->length[J - iter]; + if (iter == J - 1) { for (i = 0; i < len_cA; ++i) { wt->params[i] = orig2[i]; } } + else { for (i = 0; i < len_cA; ++i) { orig[i] = orig2[i]; } } + } + } + else if (!strcmp(wt->ext, "sym")) + { + //printf("\n YES %s \n", wt->ext); + i = J; + while (i > 0) + { + N = N + lp - 2; + N = (int)ceil((double)N / 2.0); + wt->length[i] = N; + wt->outlength += wt->length[i]; + i--; + } + wt->length[0] = wt->length[1]; + wt->outlength += wt->length[0]; + N = wt->outlength; + + for (iter = 0; iter < J; ++iter) + { + len_cA = wt->length[J - iter]; + N -= len_cA; + if (!strcmp(wt->cmethod, "fft") || !strcmp(wt->cmethod, "FFT")) { dwt1(wt, orig, temp_len, orig2, len_cA, wt->params + N, len_cA); } + else { dwt_sym(wt, orig, temp_len, orig2, len_cA, wt->params + N, len_cA); } + temp_len = wt->length[J - iter]; + + if (iter == J - 1) { for (i = 0; i < len_cA; ++i) { wt->params[i] = orig2[i]; } } + else { for (i = 0; i < len_cA; ++i) { orig[i] = orig2[i]; } } + } + } + else + { + printf("Signal extension can be either per or sym"); + exit(-1); + } + + free(orig); + free(orig2); +} + +void wtree(wtree_object wt, double* inp) +{ + int i, iter, k, N2, Np = 0; + int len_cA; + + int temp_len = wt->siglength; + int J = wt->J; + wt->length[J + 1] = temp_len; + wt->outlength = 0; + wt->zpad = 0; + double* orig = (double*)malloc(sizeof(double) * temp_len); + /* + if ((temp_len % 2) == 0) { + wt->zpad = 0; + orig = (double*)malloc(sizeof(double)* temp_len); + } + else { + wt->zpad = 1; + temp_len++; + orig = (double*)malloc(sizeof(double)* temp_len); + } + */ + for (i = 0; i < wt->siglength; ++i) { orig[i] = inp[i]; } + + if (wt->zpad == 1) { orig[temp_len - 1] = orig[temp_len - 2]; } + + int N = temp_len; + const int lp = wt->wave->lpd_len; + int p2; + + if (!strcmp(wt->ext, "per")) + { + i = J; + p2 = 2; + while (i > 0) + { + N = (int)ceil((double)N / 2.0); + wt->length[i] = N; + wt->outlength += p2 * (wt->length[i]); + i--; + p2 *= 2; + } + wt->length[0] = wt->length[1]; + + N2 = N = wt->outlength; + p2 = 1; + for (iter = 0; iter < J; ++iter) + { + len_cA = wt->length[J - iter]; + N2 -= 2 * p2 * len_cA; + N = N2; + for (k = 0; k < p2; ++k) + { + if (iter == 0) { wtree_per(wt, orig, temp_len, wt->params + N, len_cA, wt->params + N + len_cA, len_cA); } + else { wtree_per(wt, wt->params + Np + k * temp_len, temp_len, wt->params + N, len_cA, wt->params + N + len_cA, len_cA); } + N += 2 * len_cA; + } + + temp_len = wt->length[J - iter]; + p2 = 2 * p2; + Np = N2; + } + } + else if (!strcmp(wt->ext, "sym")) + { + //printf("\n YES %s \n", wt->ext); + i = J; + p2 = 2; + while (i > 0) + { + N = N + lp - 2; + N = (int)ceil((double)N / 2.0); + wt->length[i] = N; + wt->outlength += p2 * (wt->length[i]); + i--; + p2 *= 2; + } + wt->length[0] = wt->length[1]; + + N2 = N = wt->outlength; + p2 = 1; + + for (iter = 0; iter < J; ++iter) + { + len_cA = wt->length[J - iter]; + N2 -= 2 * p2 * len_cA; + N = N2; + for (k = 0; k < p2; ++k) + { + if (iter == 0) { wtree_sym(wt, orig, temp_len, wt->params + N, len_cA, wt->params + N + len_cA, len_cA); } + else { wtree_sym(wt, wt->params + Np + k * temp_len, temp_len, wt->params + N, len_cA, wt->params + N + len_cA, len_cA); } + N += 2 * len_cA; + } + + temp_len = wt->length[J - iter]; + p2 = 2 * p2; + Np = N2; + } + } + else + { + printf("Signal extension can be either per or sym"); + exit(-1); + } + + J = wt->J; + int t2 = wt->outlength - 2 * wt->length[J]; + p2 = 2; + int it1 = 0; + for (i = 0; i < J; ++i) + { + int t = t2; + for (k = 0; k < p2; ++k) + { + wt->nodelength[it1] = t; + it1++; + t += wt->length[J - i]; + } + p2 *= 2; + t2 = t2 - p2 * wt->length[J - i - 1]; + } + + wt->coeflength[0] = wt->siglength; + + for (i = 1; i < J + 1; ++i) { wt->coeflength[i] = wt->length[J - i + 1]; } + + free(orig); +} + +static int ipow2(int n) +{ + int p = 1; + for (int i = 0; i < n; ++i) { p *= 2; } + return p; +} + +void dwpt(wpt_object wt, double* inp) +{ + int i, J, temp_len, iter, N, lp, p2, k, N2, Np; + int temp, elength, temp2, size, nodes, llb, n1, j; + double eparam, v1, v2; + int len_cA, t, t2, it1, it2; + double *orig, *tree; + int* nodelength; + + temp_len = wt->siglength; + J = wt->J; + wt->length[J + 1] = temp_len; + wt->outlength = 0; + temp = 1; + elength = 0; + size = wt->wave->filtlength; + nodes = wt->nodes; + n1 = nodes + 1; + for (i = 0; i < J; ++i) + { + temp *= 2; + temp2 = (size - 2) * (temp - 1); + elength += temp2; + } + eparam = wt->eparam; + orig = (double*)malloc(sizeof(double) * temp_len); + tree = (double*)malloc(sizeof(double) * (temp_len * (J + 1) + elength)); + nodelength = (int*)malloc(sizeof(int) * nodes); + + for (i = 0; i < wt->siglength; ++i) { orig[i] = inp[i]; } + + for (i = 0; i < temp_len * (J + 1) + elength; ++i) { tree[i] = 0.0; } + + for (i = 0; i < nodes + 1; ++i) + { + wt->basisvector[i] = 0.0; + wt->costvalues[i] = 0.0; + } + + N = temp_len; + lp = wt->wave->lpd_len; + p2 = 1; + + //set eparam value here + wt->costvalues[0] = costfunc(orig, wt->siglength, wt->entropy, eparam); + it2 = 1; + if (!strcmp(wt->ext, "per")) + { + i = J; + p2 = 2; + while (i > 0) + { + N = (int)ceil((double)N / 2.0); + wt->length[i] = N; + wt->outlength += p2 * (wt->length[i]); + i--; + p2 *= 2; + } + wt->length[0] = wt->length[1]; + + N2 = N = wt->outlength; + p2 = 1; + for (iter = 0; iter < J; ++iter) + { + len_cA = wt->length[J - iter]; + N2 -= 2 * p2 * len_cA; + N = N2; + for (k = 0; k < p2; ++k) + { + if (iter == 0) { dwpt_per(wt, orig, temp_len, tree + N, len_cA, tree + N + len_cA, len_cA); } + else { dwpt_per(wt, tree + Np + k * temp_len, temp_len, tree + N, len_cA, tree + N + len_cA, len_cA); } + wt->costvalues[it2] = costfunc(tree + N, len_cA, wt->entropy, eparam); + it2++; + wt->costvalues[it2] = costfunc(tree + N + len_cA, len_cA, wt->entropy, eparam); + it2++; + N += 2 * len_cA; + } + + temp_len = wt->length[J - iter]; + p2 = 2 * p2; + Np = N2; + } + } + else if (!strcmp(wt->ext, "sym")) + { + //printf("\n YES %s \n", wt->ext); + i = J; + p2 = 2; + while (i > 0) + { + N = N + lp - 2; + N = (int)ceil((double)N / 2.0); + wt->length[i] = N; + wt->outlength += p2 * (wt->length[i]); + i--; + p2 *= 2; + } + wt->length[0] = wt->length[1]; + + N2 = N = wt->outlength; + p2 = 1; + + for (iter = 0; iter < J; ++iter) + { + len_cA = wt->length[J - iter]; + N2 -= 2 * p2 * len_cA; + N = N2; + for (k = 0; k < p2; ++k) + { + if (iter == 0) { dwpt_sym(wt, orig, temp_len, tree + N, len_cA, tree + N + len_cA, len_cA); } + else { dwpt_sym(wt, tree + Np + k * temp_len, temp_len, tree + N, len_cA, tree + N + len_cA, len_cA); } + wt->costvalues[it2] = costfunc(tree + N, len_cA, wt->entropy, eparam); + it2++; + wt->costvalues[it2] = costfunc(tree + N + len_cA, len_cA, wt->entropy, eparam); + it2++; + N += 2 * len_cA; + } + + temp_len = wt->length[J - iter]; + p2 = 2 * p2; + Np = N2; + } + } + else + { + printf("Signal extension can be either per or sym"); + exit(-1); + } + + J = wt->J; + t2 = wt->outlength - 2 * wt->length[J]; + p2 = 2; + it1 = 0; + for (i = 0; i < J; ++i) + { + t = t2; + for (k = 0; k < p2; ++k) + { + nodelength[it1] = t; + it1++; + t += wt->length[J - i]; + } + p2 *= 2; + t2 = t2 - p2 * wt->length[J - i - 1]; + } + + + J = wt->J; + llb = 1; + for (i = 0; i < J; ++i) { llb *= 2; } + + for (i = n1 - llb; i < n1; ++i) { wt->basisvector[i] = 1; } + + for (j = J - 1; j >= 0; --j) + { + for (k = ipow2(j) - 1; k < ipow2(j + 1) - 1; ++k) + { + v1 = wt->costvalues[k]; + v2 = wt->costvalues[2 * k + 1] + wt->costvalues[2 * k + 2]; + //printf(" %g %g", v1,v2); + if (v1 <= v2) { wt->basisvector[k] = 1; } + else { wt->costvalues[k] = v2; } + } + //printf("\n"); + } + + for (k = 0; k < nodes / 2; ++k) + { + if (wt->basisvector[k] == 1 || wt->basisvector[k] == 2) + { + wt->basisvector[2 * k + 1] = 2; + wt->basisvector[2 * k + 2] = 2; + } + } + + for (k = 0; k < n1; ++k) { if (wt->basisvector[k] == 2) { wt->basisvector[k] = 0; } } + + N2 = 0; + it1 = n1; + it2 = 0; + wt->nodes = 0; + wt->numnodeslevel[0] = 0; + //printf("Start \n"); + + if (wt->basisvector[0] == 1) + { + wt->outlength = wt->siglength; + for (i = 0; i < wt->siglength; ++i) { wt->output[i] = inp[i]; } + wt->nodes = 1; + wt->nodeindex[0] = 0; + wt->nodeindex[1] = 0; + wt->numnodeslevel[0] = 1; + } + else + { + for (i = J; i > 0; --i) + { + llb = ipow2(i); + it1 -= llb; + wt->numnodeslevel[i] = 0; + for (j = 0; j < llb; ++j) + { + if (wt->basisvector[it1 + j] == 1) + { + //printf("NODE %d %d %d \n", i, j, wt->length[J - i + 1]); + wt->nodeindex[2 * wt->nodes] = i; + wt->nodeindex[2 * wt->nodes + 1] = j; + wt->nodes += 1; + wt->numnodeslevel[i] += 1; + for (k = 0; k < wt->length[J - i + 1]; ++k) + { + wt->output[it2 + k] = tree[nodelength[it1 - 1 + j] + k];// access tree + } + it2 += wt->length[J - i + 1]; + } + } + } + wt->outlength = it2; + } + + wt->coeflength[0] = wt->siglength; + + for (i = 1; i < J + 1; ++i) { wt->coeflength[i] = wt->length[J - i + 1]; } + + free(orig); + free(tree); + free(nodelength); +} + +int getWTREENodelength(wtree_object wt, int X) +{ + // X - Level. All Nodes at any level have the same length + if (X <= 0 || X > wt->J) + { + printf("X co-ordinate must be >= 1 and <= %d", wt->J); + exit(-1); + } + + return wt->length[wt->J - X + 1]; +} + +int getDWPTNodelength(wpt_object wt, int X) +{ + //X - Level. All Nodes at any level have the same length + if (X <= 0 || X > wt->J) + { + printf("X co-ordinate must be >= 1 and <= %d", wt->J); + exit(-1); + } + + return wt->length[wt->J - X + 1]; +} + +void getWTREECoeffs(wtree_object wt, int X, int Y, double* coeffs, int N) +{ + int i, t, t2; + + if (X <= 0 || X > wt->J) + { + printf("X co-ordinate must be >= 1 and <= %d", wt->J); + exit(-1); + } + int ymax = 1; + for (i = 0; i < X; ++i) { ymax *= 2; } + + ymax -= 1; + + if (Y < 0 || Y > ymax) + { + printf("Y co-ordinate must be >= 0 and <= %d", ymax); + exit(-1); + } + + if (X == 1) { t = 0; } + else + { + t = 0; + t2 = 1; + for (i = 0; i < X - 1; ++i) + { + t2 *= 2; + t += t2; + } + } + + t += Y; + t2 = wt->nodelength[t]; + for (i = 0; i < N; ++i) { coeffs[i] = wt->output[t2 + i]; } +} + +void getDWPTCoeffs(wpt_object wt, int X, int Y, double* coeffs, int N) +{ + int i; + + if (X <= 0 || X > wt->J) + { + printf("X co-ordinate must be >= 1 and <= %d", wt->J); + exit(-1); + } + int ymax = 1; + for (i = 0; i < X; ++i) { ymax *= 2; } + + ymax -= 1; + + if (Y < 0 || Y > ymax) + { + printf("Y co-ordinate must be >= 0 and <= %d", ymax); + exit(-1); + } + + int np = 0; + int citer = 0; + + for (i = wt->J; i > X; --i) + { + np += wt->numnodeslevel[i]; + citer += wt->numnodeslevel[i] * wt->coeflength[i]; + } + + i = 0; + int flag = 0; + for (i = 0; i < wt->numnodeslevel[X]; ++i) + { + if (wt->nodeindex[2 * np + 1] == Y) + { + flag = 1; + break; + } + np++; + citer += wt->coeflength[X]; + } + + if (flag == 0) + { + printf("The Node is Not Part Of The Best Basis Tree Use wpt_summary function to list available nodes \n"); + exit(-1); + } + + for (i = 0; i < N; ++i) { coeffs[i] = wt->output[citer + i]; } +} + +int getCWTScaleLength(int N) +{ + //const double dj = 0.4875; + //const double temp = (log((double)N / 2.0) / log(2.0)) / dj; + //const int J = (int)temp; + return (int)((log((double)N / 2.0) / log(2.0)) / 0.4875); +} + +int setCWTScales(cwt_object wt, double s0, double dj, char* type, int power) +{ + int i; + strcpy(wt->type, type); + //s0*pow(2.0, (double)(j - 1)*dj); + if (!strcmp(wt->type, "pow") || !strcmp(wt->type, "power")) + { + for (i = 0; i < wt->J; ++i) { wt->scale[i] = s0 * pow((double)power, (double)(i) * dj); } + wt->sflag = 1; + wt->pow = power; + } + else if (!strcmp(wt->type, "lin") || !strcmp(wt->type, "linear")) + { + for (i = 0; i < wt->J; ++i) { wt->scale[i] = s0 + (double)i * dj; } + wt->sflag = 1; + } + else + { + printf("\n Type accepts only two values : pow and lin\n"); + return 1; + } + wt->s0 = s0; + wt->dj = dj; + return 0; +} + +void setCWTScaleVector(cwt_object wt, double* scale, int J, double s0, double dj) +{ + if (J != wt->J) + { + printf("\n CWT object is only valid for %d scales\n", wt->J); + exit(-1); + } + + for (int i = 0; i < wt->J; ++i) { wt->scale[i] = scale[i]; } + wt->dj = dj; + wt->s0 = s0; + wt->sflag = 1; +} + +void setCWTPadding(cwt_object wt, int pad) +{ + if (pad == 0) { wt->pflag = 0; } + else { wt->pflag = 1; } +} + +int cwt(cwt_object wt, double* inp) +{ + int i, npad; + const int N = wt->siglength; + if (wt->sflag == 0) + { + for (i = 0; i < wt->J; ++i) { wt->scale[i] = wt->s0 * pow(2.0, (double)(i) * wt->dj); } + wt->sflag = 1; + } + + if (wt->pflag == 0) { npad = N; } + else { npad = wt->npad; } + + const int nj2 = 2 * N * wt->J; + const int j = wt->J; + const int j2 = 2 * j; + + wt->smean = 0.0; + + for (i = 0; i < N; ++i) { wt->smean += inp[i]; } + wt->smean /= N; + + return cwavelet(inp, N, wt->dt, wt->mother, wt->m, wt->s0, wt->dj, wt->J, npad, wt->params, wt->params + nj2, wt->params + nj2 + j, wt->params + nj2 + j2); +} + +void icwt(cwt_object wt, double* cwtop) +{ + double psi; + int real; + + const int N = wt->siglength; + const int nj2 = N * 2 * wt->J; + + psi0(wt->mother, wt->m, &psi, &real); + const double cdel = cdelta(wt->mother, wt->m, psi); + + //printf("\n PSI %g CDEL %g param %g mother %d \n", psi, cdel,wt->m,wt->mother); + if ((!strcmp(wt->type, "pow") || !strcmp(wt->type, "power")) && wt->pow == 2) + { + icwavelet(wt->params, N, wt->params + nj2, wt->J, wt->dt, wt->dj, cdel, psi, cwtop); + } + else + { + printf("Inverse CWT is only available for power of 2.0 scales \n"); + exit(-1); + } + for (int i = 0; i < N; ++i) { cwtop[i] += wt->smean; } +} + +static void idwt1(wt_object wt, double* temp, double* cA_up, double* cA, int len_cA, double* cD, int len_cD, double* X_lp, double* X_hp, double* X) +{ + const int len_avg = (wt->wave->lpr_len + wt->wave->hpr_len) / 2; + const int N = 2 * len_cD; + const int U = 2; + + upsamp2(cA, len_cA, U, cA_up); + + per_ext(cA_up, 2 * len_cA, len_avg / 2, temp); + + int N2 = 2 * len_cA + len_avg; + + if (wt->wave->lpr_len == wt->wave->hpr_len && (!strcmp(wt->cmethod, "fft") || !strcmp(wt->cmethod, "FFT"))) + { + wt->cobj = conv_init(N2, len_avg); + wt->cfftset = 1; + } + else if (!(wt->wave->lpr_len == wt->wave->hpr_len)) + { + printf("Decomposition Filters must have the same length."); + exit(-1); + } + + wconv(wt, temp, N2, wt->wave->lpr, len_avg, X_lp); + upsamp2(cD, len_cD, U, cA_up); + per_ext(cA_up, 2 * len_cD, len_avg / 2, temp); + N2 = 2 * len_cD + len_avg; + wconv(wt, temp, N2, wt->wave->hpr, len_avg, X_hp); + + for (int i = len_avg - 1; i < N + len_avg - 1; ++i) { X[i - len_avg + 1] = X_lp[i] + X_hp[i]; } + + if (wt->wave->lpr_len == wt->wave->hpr_len && (!strcmp(wt->cmethod, "fft") || !strcmp(wt->cmethod, "FFT"))) + { + free_conv(wt->cobj); + wt->cfftset = 0; + } +} + +static void idwt_per(wt_object wt, double* cA, int len_cA, double* cD, int len_cD, double* X) +{ + const int len_avg = (wt->wave->lpr_len + wt->wave->hpr_len) / 2; + const int l2 = len_avg / 2; + int m = -2; + int n = -1; + + for (int i = 0; i < len_cA + l2 - 1; ++i) + { + m += 2; + n += 2; + X[m] = 0.0; + X[n] = 0.0; + for (int l = 0; l < l2; ++l) + { + const int t = 2 * l; + if ((i - l) >= 0 && (i - l) < len_cA) + { + X[m] += wt->wave->lpr[t] * cA[i - l] + wt->wave->hpr[t] * cD[i - l]; + X[n] += wt->wave->lpr[t + 1] * cA[i - l] + wt->wave->hpr[t + 1] * cD[i - l]; + } + else if ((i - l) >= len_cA && (i - l) < len_cA + len_avg - 1) + { + X[m] += wt->wave->lpr[t] * cA[i - l - len_cA] + wt->wave->hpr[t] * cD[i - l - len_cA]; + X[n] += wt->wave->lpr[t + 1] * cA[i - l - len_cA] + wt->wave->hpr[t + 1] * cD[i - l - len_cA]; + } + else if ((i - l) < 0 && (i - l) > -l2) + { + X[m] += wt->wave->lpr[t] * cA[len_cA + i - l] + wt->wave->hpr[t] * cD[len_cA + i - l]; + X[n] += wt->wave->lpr[t + 1] * cA[len_cA + i - l] + wt->wave->hpr[t + 1] * cD[len_cA + i - l]; + } + } + } +} + +static void idwt_sym(wt_object wt, double* cA, int len_cA, double* cD, int len_cD, double* X) +{ + const int len_avg = (wt->wave->lpr_len + wt->wave->hpr_len) / 2; + int m = -2; + int n = -1; + + for (int v = 0; v < len_cA; ++v) + { + const int i = v; + m += 2; + n += 2; + X[m] = 0.0; + X[n] = 0.0; + for (int l = 0; l < len_avg / 2; ++l) + { + const int t = 2 * l; + if ((i - l) >= 0 && (i - l) < len_cA) + { + X[m] += wt->wave->lpr[t] * cA[i - l] + wt->wave->hpr[t] * cD[i - l]; + X[n] += wt->wave->lpr[t + 1] * cA[i - l] + wt->wave->hpr[t + 1] * cD[i - l]; + } + } + } +} + + +void idwt(wt_object wt, double* dwtop) +{ + int i, lf, iter, k; + int det_len; + double *cA_up, *X_lp, *X_hp; + + const int J = wt->J; + const int U = 2; + int app_len = wt->length[0]; + double* out = (double*)malloc(sizeof(double) * (wt->siglength + 1)); + if (!strcmp(wt->ext, "per") && (!strcmp(wt->cmethod, "fft") || !strcmp(wt->cmethod, "FFT"))) + { + app_len = wt->length[0]; + det_len = wt->length[1]; + const int N = 2 * wt->length[J]; + lf = (wt->wave->lpr_len + wt->wave->hpr_len) / 2; + + cA_up = (double*)malloc(sizeof(double) * N); + double* temp = (double*)malloc(sizeof(double) * (N + lf)); + X_lp = (double*)malloc(sizeof(double) * (N + 2 * lf - 1)); + X_hp = (double*)malloc(sizeof(double) * (N + 2 * lf - 1)); + iter = app_len; + + for (i = 0; i < app_len; ++i) { out[i] = wt->output[i]; } + + for (i = 0; i < J; ++i) + { + idwt1(wt, temp, cA_up, out, det_len, wt->output + iter, det_len, X_lp, X_hp, out); + /* + idwt_per(wt,out, det_len, wt->output + iter, det_len, X_lp); + for (k = lf/2 - 1; k < 2 * det_len + lf/2 - 1; ++k) { + out[k - lf/2 + 1] = X_lp[k]; + } + */ + iter += det_len; + det_len = wt->length[i + 2]; + } + free(cA_up); + free(X_lp); + free(X_hp); + free(temp); + } + else if (!strcmp(wt->ext, "per") && !strcmp(wt->cmethod, "direct")) + { + app_len = wt->length[0]; + det_len = wt->length[1]; + int N = 2 * wt->length[J]; + lf = (wt->wave->lpr_len + wt->wave->hpr_len) / 2; + + X_lp = (double*)malloc(sizeof(double) * (N + 2 * lf - 1)); + iter = app_len; + + for (i = 0; i < app_len; ++i) { out[i] = wt->output[i]; } + + for (i = 0; i < J; ++i) + { + + //idwt1(wt, temp, cA_up, out, det_len, wt->output + iter, det_len, X_lp, X_hp, out); + + idwt_per(wt, out, det_len, wt->output + iter, det_len, X_lp); + for (k = lf / 2 - 1; k < 2 * det_len + lf / 2 - 1; ++k) { out[k - lf / 2 + 1] = X_lp[k]; } + + iter += det_len; + det_len = wt->length[i + 2]; + } + + free(X_lp); + } + else if (!strcmp(wt->ext, "sym") && !strcmp(wt->cmethod, "direct")) + { + app_len = wt->length[0]; + det_len = wt->length[1]; + int N = 2 * wt->length[J] - 1; + lf = (wt->wave->lpr_len + wt->wave->hpr_len) / 2; + + X_lp = (double*)malloc(sizeof(double) * (N + 2 * lf - 1)); + iter = app_len; + + for (i = 0; i < app_len; ++i) { out[i] = wt->output[i]; } + + for (i = 0; i < J; ++i) + { + + //idwt1(wt, temp, cA_up, out, det_len, wt->output + iter, det_len, X_lp, X_hp, out); + + idwt_sym(wt, out, det_len, wt->output + iter, det_len, X_lp); + for (k = lf - 2; k < 2 * det_len; ++k) { out[k - lf + 2] = X_lp[k]; } + + iter += det_len; + det_len = wt->length[i + 2]; + } + + free(X_lp); + } + else if (!strcmp(wt->ext, "sym") && (!strcmp(wt->cmethod, "fft") || !strcmp(wt->cmethod, "FFT"))) + { + lf = wt->wave->lpd_len;// lpd and hpd have the same length + + int N = 2 * wt->length[J] - 1; + cA_up = (double*)malloc(sizeof(double) * N); + X_lp = (double*)malloc(sizeof(double) * (N + lf - 1)); + X_hp = (double*)malloc(sizeof(double) * (N + lf - 1)); + + for (i = 0; i < app_len; ++i) { out[i] = wt->output[i]; } + + iter = app_len; + + for (i = 0; i < J; ++i) + { + det_len = wt->length[i + 1]; + upsamp(out, det_len, U, cA_up); + int N2 = 2 * wt->length[i + 1] - 1; + + if (wt->wave->lpr_len == wt->wave->hpr_len && (!strcmp(wt->cmethod, "fft") || !strcmp(wt->cmethod, "FFT"))) + { + wt->cobj = conv_init(N2, lf); + wt->cfftset = 1; + } + else if (!(wt->wave->lpr_len == wt->wave->hpr_len)) + { + printf("Decomposition Filters must have the same length."); + exit(-1); + } + + wconv(wt, cA_up, N2, wt->wave->lpr, lf, X_lp); + + upsamp(wt->output + iter, det_len, U, cA_up); + + wconv(wt, cA_up, N2, wt->wave->hpr, lf, X_hp); + + for (k = lf - 2; k < N2 + 1; ++k) { out[k - lf + 2] = X_lp[k] + X_hp[k]; } + iter += det_len; + if (wt->wave->lpr_len == wt->wave->hpr_len && (!strcmp(wt->cmethod, "fft") || !strcmp(wt->cmethod, "FFT"))) + { + free_conv(wt->cobj); + wt->cfftset = 0; + } + } + + free(cA_up); + free(X_lp); + free(X_hp); + } + else + { + printf("Signal extension can be either per or sym"); + exit(-1); + } + + for (i = 0; i < wt->siglength; ++i) { dwtop[i] = out[i]; } + + + free(out); +} + +static void idwpt_per(wpt_object wt, double* cA, int len_cA, double* cD, int len_cD, double* X) +{ + int len_avg = (wt->wave->lpr_len + wt->wave->hpr_len) / 2; + int l2 = len_avg / 2; + int m = -2; + int n = -1; + + for (int i = 0; i < len_cA + l2 - 1; ++i) + { + m += 2; + n += 2; + X[m] = 0.0; + X[n] = 0.0; + for (int l = 0; l < l2; ++l) + { + int t = 2 * l; + if ((i - l) >= 0 && (i - l) < len_cA) + { + X[m] += wt->wave->lpr[t] * cA[i - l] + wt->wave->hpr[t] * cD[i - l]; + X[n] += wt->wave->lpr[t + 1] * cA[i - l] + wt->wave->hpr[t + 1] * cD[i - l]; + } + else if ((i - l) >= len_cA && (i - l) < len_cA + len_avg - 1) + { + X[m] += wt->wave->lpr[t] * cA[i - l - len_cA] + wt->wave->hpr[t] * cD[i - l - len_cA]; + X[n] += wt->wave->lpr[t + 1] * cA[i - l - len_cA] + wt->wave->hpr[t + 1] * cD[i - l - len_cA]; + } + else if ((i - l) < 0 && (i - l) > -l2) + { + X[m] += wt->wave->lpr[t] * cA[len_cA + i - l] + wt->wave->hpr[t] * cD[len_cA + i - l]; + X[n] += wt->wave->lpr[t + 1] * cA[len_cA + i - l] + wt->wave->hpr[t + 1] * cD[len_cA + i - l]; + } + } + } +} + +static void idwpt_sym(wpt_object wt, double* cA, int len_cA, double* cD, int len_cD, double* X) +{ + int len_avg = (wt->wave->lpr_len + wt->wave->hpr_len) / 2; + int m = -2; + int n = -1; + + for (int v = 0; v < len_cA; ++v) + { + int i = v; + m += 2; + n += 2; + X[m] = 0.0; + X[n] = 0.0; + for (int l = 0; l < len_avg / 2; ++l) + { + int t = 2 * l; + if ((i - l) >= 0 && (i - l) < len_cA) + { + X[m] += wt->wave->lpr[t] * cA[i - l] + wt->wave->hpr[t] * cD[i - l]; + X[n] += wt->wave->lpr[t + 1] * cA[i - l] + wt->wave->hpr[t + 1] * cD[i - l]; + } + } + } +} + +void idwpt(wpt_object wt, double* dwtop) +{ + int J, U, i, lf, N, k, p, l; + int app_len, det_len, index, n1, llb, index2, index3, index4, indexp, xlen; + double *X_lp, *X, *out, *out2; + int *prep, *ptemp; + + J = wt->J; + U = 2; + app_len = wt->length[0]; + p = ipow2(J); + lf = (wt->wave->lpr_len + wt->wave->hpr_len) / 2; + xlen = p * (app_len + 2 * lf); + + X_lp = (double*)malloc(sizeof(double) * 2 * (wt->length[J] + lf)); + X = (double*)malloc(sizeof(double) * xlen); + out = (double*)malloc(sizeof(double) * wt->length[J]); + out2 = (double*)malloc(sizeof(double) * wt->length[J]); + prep = (int*)malloc(sizeof(int) * p); + ptemp = (int*)malloc(sizeof(int) * p); + n1 = 1; + llb = 1; + index2 = xlen / p; + indexp = 0; + if (wt->basisvector[0] == 1) { for (i = 0; i < wt->siglength; ++i) { dwtop[i] = wt->output[i]; } } + else + { + for (i = 0; i < J; ++i) + { + llb *= 2; + n1 += llb; + } + + for (i = 0; i < xlen; ++i) { X[i] = 0.0; } + + for (i = 0; i < llb; ++i) + { + prep[i] = (int)wt->basisvector[n1 - llb + i]; + ptemp[i] = 0; + } + + if (!strcmp(wt->ext, "per")) + { + app_len = wt->length[0]; + det_len = wt->length[1]; + index = 0; + + + for (i = 0; i < J; ++i) + { + p = ipow2(J - i - 1); + det_len = wt->length[i + 1]; + index2 *= 2; + index3 = 0; + index4 = 0; + //idwt1(wt, temp, cA_up, out, det_len, wt->output + iter, det_len, X_lp, X_hp, out); + n1 -= llb; + for (l = 0; l < llb; ++l) + { + if (ptemp[l] != 2) { prep[l] = (int)wt->basisvector[n1 + l]; } + else { prep[l] = ptemp[l]; } + ptemp[l] = 0; + } + + + for (l = 0; l < p; ++l) + { + if (prep[2 * l] == 1 && prep[2 * l + 1] == 1) + { + for (k = 0; k < det_len; ++k) + { + out[k] = wt->output[index + k]; + out2[k] = wt->output[index + det_len + k]; + } + idwpt_per(wt, out, det_len, out2, det_len, X_lp); + for (k = lf / 2 - 1; k < 2 * det_len + lf / 2 - 1; ++k) { X[index3 + k - lf / 2 + 1] = X_lp[k]; } + index += 2 * det_len; + index3 += index2; + index4 += 2 * indexp; + ptemp[l] = 2; + } + else if (prep[2 * l] == 1 && prep[2 * l + 1] == 2) + { + index4 += indexp; + for (k = 0; k < det_len; ++k) + { + out[k] = wt->output[index + k]; + out2[k] = X[index4 + k]; + } + idwpt_per(wt, out, det_len, out2, det_len, X_lp); + for (k = lf / 2 - 1; k < 2 * det_len + lf / 2 - 1; ++k) { X[index3 + k - lf / 2 + 1] = X_lp[k]; } + index += det_len; + index3 += index2; + index4 += indexp; + ptemp[l] = 2; + } + else if (prep[2 * l] == 2 && prep[2 * l + 1] == 1) + { + for (k = 0; k < det_len; ++k) + { + out[k] = X[index4 + k]; + out2[k] = wt->output[index + k]; + } + idwpt_per(wt, out, det_len, out2, det_len, X_lp); + for (k = lf / 2 - 1; k < 2 * det_len + lf / 2 - 1; ++k) { X[index3 + k - lf / 2 + 1] = X_lp[k]; } + index += det_len; + index3 += index2; + index4 += 2 * indexp; + ptemp[l] = 2; + } + else if (prep[2 * l] == 2 && prep[2 * l + 1] == 2) + { + for (k = 0; k < det_len; ++k) + { + out[k] = X[index4 + k]; + out2[k] = X[index4 + indexp + k]; + } + idwpt_per(wt, out, det_len, out2, det_len, X_lp); + for (k = lf / 2 - 1; k < 2 * det_len + lf / 2 - 1; ++k) { X[index3 + k - lf / 2 + 1] = X_lp[k]; } + index4 += 2 * indexp; + index3 += index2; + ptemp[l] = 2; + } + else + { + index3 += index2; + index4 += 2 * indexp; + } + } + + + /* + idwt_per(wt, out, det_len, wt->output + iter, det_len, X_lp); + for (k = lf / 2 - 1; k < 2 * det_len + lf / 2 - 1; ++k) { + out[k - lf / 2 + 1] = X_lp[k]; + } + + iter += det_len; + det_len = wt->length[i + 2]; + */ + llb /= 2; + indexp = index2; + } + + //free(X_lp); + } + else if (!strcmp(wt->ext, "sym")) + { + app_len = wt->length[0]; + det_len = wt->length[1]; + N = 2 * wt->length[J] - 1; + + //X_lp = (double*)malloc(sizeof(double)* (N + 2 * lf - 1)); + index = 0; + + for (i = 0; i < J; ++i) + { + p = ipow2(J - i - 1); + det_len = wt->length[i + 1]; + index2 *= 2; + index3 = 0; + index4 = 0; + //idwt1(wt, temp, cA_up, out, det_len, wt->output + iter, det_len, X_lp, X_hp, out); + n1 -= llb; + for (l = 0; l < llb; ++l) + { + if (ptemp[l] != 2) { prep[l] = (int)wt->basisvector[n1 + l]; } + else { prep[l] = ptemp[l]; } + ptemp[l] = 0; + } + + + for (l = 0; l < p; ++l) + { + if (prep[2 * l] == 1 && prep[2 * l + 1] == 1) + { + for (k = 0; k < det_len; ++k) + { + out[k] = wt->output[index + k]; + out2[k] = wt->output[index + det_len + k]; + } + idwpt_sym(wt, out, det_len, out2, det_len, X_lp); + for (k = lf - 2; k < 2 * det_len; ++k) { X[index3 + k - lf + 2] = X_lp[k]; } + index += 2 * det_len; + index3 += index2; + index4 += 2 * indexp; + ptemp[l] = 2; + } + else if (prep[2 * l] == 1 && prep[2 * l + 1] == 2) + { + index4 += indexp; + for (k = 0; k < det_len; ++k) + { + out[k] = wt->output[index + k]; + out2[k] = X[index4 + k]; + } + idwpt_sym(wt, out, det_len, out2, det_len, X_lp); + for (k = lf - 2; k < 2 * det_len; ++k) { X[index3 + k - lf + 2] = X_lp[k]; } + index += det_len; + index3 += index2; + index4 += indexp; + ptemp[l] = 2; + } + else if (prep[2 * l] == 2 && prep[2 * l + 1] == 1) + { + for (k = 0; k < det_len; ++k) + { + out[k] = X[index4 + k]; + out2[k] = wt->output[index + k]; + } + idwpt_sym(wt, out, det_len, out2, det_len, X_lp); + for (k = lf - 2; k < 2 * det_len; ++k) { X[index3 + k - lf + 2] = X_lp[k]; } + index += det_len; + index3 += index2; + index4 += 2 * indexp; + ptemp[l] = 2; + } + else if (prep[2 * l] == 2 && prep[2 * l + 1] == 2) + { + for (k = 0; k < det_len; ++k) + { + out[k] = X[index4 + k]; + out2[k] = X[index4 + indexp + k]; + } + idwpt_sym(wt, out, det_len, out2, det_len, X_lp); + for (k = lf - 2; k < 2 * det_len; ++k) { X[index3 + k - lf + 2] = X_lp[k]; } + index4 += 2 * indexp; + index3 += index2; + ptemp[l] = 2; + } + else + { + index3 += index2; + index4 += 2 * indexp; + } + } + + //idwt1(wt, temp, cA_up, out, det_len, wt->output + iter, det_len, X_lp, X_hp, out); + /* + idwpt_sym(wt, out, det_len, wt->output + iter, det_len, X_lp); + for (k = lf - 2; k < 2 * det_len; ++k) { + out[k - lf + 2] = X_lp[k]; + } + + iter += det_len; + det_len = wt->length[i + 2]; + */ + llb /= 2; + indexp = index2; + } + + //free(X_lp); + } + else + { + printf("Signal extension can be either per or sym"); + exit(-1); + } + + for (i = 0; i < wt->siglength; ++i) + { + //printf("%g ", X[i]); + dwtop[i] = X[i]; + } + } + + + free(out); + free(X_lp); + free(X); + free(out2); + free(prep); + free(ptemp); +} + + +static void swt_per(wt_object wt, int M, double* inp, int N, double* cA, int len_cA, double* cD, int len_cD) +{ + int len_avg = M * wt->wave->lpd_len; + int l2 = len_avg / 2; + int isodd = N % 2; + + for (int i = 0; i < len_cA; ++i) + { + int t = i + l2; + cA[i] = 0.0; + cD[i] = 0.0; + int l = -1; + for (int j = 0; j < len_avg; j += M) + { + l++; + while (j >= len_cA) { j -= len_cA; } + if ((t - j) >= l2 && (t - j) < N) + { + cA[i] += wt->wave->lpd[l] * inp[t - j]; + cD[i] += wt->wave->hpd[l] * inp[t - j]; + } + else if ((t - j) < l2 && (t - j) >= 0) + { + cA[i] += wt->wave->lpd[l] * inp[t - j]; + cD[i] += wt->wave->hpd[l] * inp[t - j]; + } + else if ((t - j) < 0) + { + cA[i] += wt->wave->lpd[l] * inp[t - j + N]; + cD[i] += wt->wave->hpd[l] * inp[t - j + N]; + } + else if ((t - j) >= N && isodd == 0) + { + cA[i] += wt->wave->lpd[l] * inp[t - j - N]; + cD[i] += wt->wave->hpd[l] * inp[t - j - N]; + } + else if ((t - j) >= N && isodd == 1) + { + if (t - l != N) + { + cA[i] += wt->wave->lpd[l] * inp[t - j - (N + 1)]; + cD[i] += wt->wave->hpd[l] * inp[t - j - (N + 1)]; + } + else + { + cA[i] += wt->wave->lpd[l] * inp[N - 1]; + cD[i] += wt->wave->hpd[l] * inp[N - 1]; + } + } + } + } +} + +static void swt_fft(wt_object wt, double* inp) +{ + int i, iter, N; + + int temp_len = wt->siglength; + int J = wt->J; + wt->length[0] = wt->length[J] = temp_len; + wt->outlength = wt->length[J + 1] = (J + 1) * temp_len; + int M = 1; + for (iter = 1; iter < J; ++iter) + { + M = 2 * M; + wt->length[iter] = temp_len; + } + + int len_filt = wt->wave->filtlength; + + double* low_pass = (double*)malloc(sizeof(double) * M * len_filt); + double* high_pass = (double*)malloc(sizeof(double) * M * len_filt); + double* sig = (double*)malloc(sizeof(double) * (M * len_filt + temp_len + (temp_len % 2))); + double* cA = (double*)malloc(sizeof(double) * (2 * M * len_filt + temp_len + (temp_len % 2)) - 1); + double* cD = (double*)malloc(sizeof(double) * (2 * M * len_filt + temp_len + (temp_len % 2)) - 1); + + M = 1; + + for (i = 0; i < temp_len; ++i) { wt->params[i] = inp[i]; } + + int lenacc = wt->outlength; + + for (iter = 0; iter < J; ++iter) + { + lenacc -= temp_len; + if (iter > 0) + { + M = 2 * M; + N = M * len_filt; + upsamp2(wt->wave->lpd, wt->wave->lpd_len, M, low_pass); + upsamp2(wt->wave->hpd, wt->wave->hpd_len, M, high_pass); + } + else + { + N = len_filt; + for (i = 0; i < N; ++i) + { + low_pass[i] = wt->wave->lpd[i]; + high_pass[i] = wt->wave->hpd[i]; + } + } + + //swt_per(wt,M, wt->params, temp_len, cA, temp_len, cD,temp_len); + + per_ext(wt->params, temp_len, N / 2, sig); + + if (wt->wave->lpd_len == wt->wave->hpd_len && (!strcmp(wt->cmethod, "fft") || !strcmp(wt->cmethod, "FFT"))) + { + wt->cobj = conv_init(N + temp_len + (temp_len % 2), N); + wt->cfftset = 1; + } + else if (!(wt->wave->lpd_len == wt->wave->hpd_len)) + { + printf("Decomposition Filters must have the same length."); + exit(-1); + } + + + wconv(wt, sig, N + temp_len + (temp_len % 2), low_pass, N, cA); + + wconv(wt, sig, N + temp_len + (temp_len % 2), high_pass, N, cD); + + if (wt->wave->lpd_len == wt->wave->hpd_len && (!strcmp(wt->cmethod, "fft") || !strcmp(wt->cmethod, "FFT"))) + { + free_conv(wt->cobj); + wt->cfftset = 0; + } + + for (i = 0; i < temp_len; ++i) + { + wt->params[i] = cA[N + i]; + wt->params[lenacc + i] = cD[N + i]; + } + } + + free(low_pass); + free(high_pass); + free(sig); + free(cA); + free(cD); +} + +static void swt_direct(wt_object wt, double* inp) +{ + int i, iter, N; + + int temp_len = wt->siglength; + int J = wt->J; + wt->length[0] = wt->length[J] = temp_len; + wt->outlength = wt->length[J + 1] = (J + 1) * temp_len; + int len_filt = wt->wave->filtlength; + int M = 1; + for (iter = 1; iter < J; ++iter) + { + M = 2 * M; + wt->length[iter] = temp_len; + } + + + double* cA = (double*)malloc(sizeof(double) * temp_len); + double* cD = (double*)malloc(sizeof(double) * temp_len); + + M = 1; + + for (i = 0; i < temp_len; ++i) { wt->params[i] = inp[i]; } + + int lenacc = wt->outlength; + + for (iter = 0; iter < J; ++iter) + { + lenacc -= temp_len; + if (iter > 0) + { + M = 2 * M; + N = M * len_filt; + } + else { N = len_filt; } + + swt_per(wt, M, wt->params, temp_len, cA, temp_len, cD, temp_len); + + + for (i = 0; i < temp_len; ++i) + { + wt->params[i] = cA[i]; + wt->params[lenacc + i] = cD[i]; + } + } + + free(cA); + free(cD); +} + + +void swt(wt_object wt, double* inp) +{ + if (!strcmp(wt->method, "swt") && !strcmp(wt->cmethod, "direct")) { swt_direct(wt, inp); } + else if (!strcmp(wt->method, "swt") && (!strcmp(wt->cmethod, "fft") || !strcmp(wt->cmethod, "FFT"))) { swt_fft(wt, inp); } + else + { + printf("SWT Only accepts two methods - direct and fft"); + exit(-1); + } +} + +void iswt(wt_object wt, double* swtop) +{ + int i, index; + int index_shift; + + int N = wt->siglength; + int J = wt->J; + int U = 2; + int lf = wt->wave->lpr_len; + + double* appx_sig = (double*)malloc(sizeof(double) * N); + double* det_sig = (double*)malloc(sizeof(double) * N); + double* appx1 = (double*)malloc(sizeof(double) * N); + double* det1 = (double*)malloc(sizeof(double) * N); + double* appx2 = (double*)malloc(sizeof(double) * N); + double* det2 = (double*)malloc(sizeof(double) * N); + double* tempx = (double*)malloc(sizeof(double) * N); + double* cL0 = (double*)malloc(sizeof(double) * (N + (N % 2) + lf)); + double* cH0 = (double*)malloc(sizeof(double) * (N + (N % 2) + lf)); + double* oup00L = (double*)malloc(sizeof(double) * (N + 2 * lf)); + double* oup00H = (double*)malloc(sizeof(double) * (N + 2 * lf)); + double* oup00 = (double*)malloc(sizeof(double) * N); + double* oup01 = (double*)malloc(sizeof(double) * N); + + + for (int iter = 0; iter < J; ++iter) + { + for (i = 0; i < N; ++i) { swtop[i] = 0.0; } + if (iter == 0) + { + for (i = 0; i < N; ++i) + { + appx_sig[i] = wt->output[i]; + det_sig[i] = wt->output[N + i]; + } + } + else { for (i = 0; i < N; ++i) { det_sig[i] = wt->output[(iter + 1) * N + i]; } } + + int value = (int)pow(2.0, (double)(J - 1 - iter)); + + for (int count = 0; count < value; ++count) + { + int len = 0; + for (index = count; index < N; index += value) + { + appx1[len] = appx_sig[index]; + det1[len] = det_sig[index]; + len++; + } + + + //SHIFT 0 + int len0 = 0; + + for (index_shift = 0; index_shift < len; index_shift += 2) + { + appx2[len0] = appx1[index_shift]; + det2[len0] = det1[index_shift]; + len0++; + } + upsamp2(appx2, len0, U, tempx); + per_ext(tempx, 2 * len0, lf / 2, cL0); + + upsamp2(det2, len0, U, tempx); + per_ext(tempx, 2 * len0, lf / 2, cH0); + + int N1 = 2 * len0 + lf; + + if (wt->wave->lpr_len == wt->wave->hpr_len && (!strcmp(wt->cmethod, "fft") || !strcmp(wt->cmethod, "FFT"))) + { + wt->cobj = conv_init(N1, lf); + wt->cfftset = 1; + } + else if (!(wt->wave->lpd_len == wt->wave->hpd_len)) + { + printf("Decomposition Filters must have the same length."); + exit(-1); + } + + wconv(wt, cL0, N1, wt->wave->lpr, lf, oup00L); + + wconv(wt, cH0, N1, wt->wave->hpr, lf, oup00H); + + for (i = lf - 1; i < 2 * len0 + lf - 1; ++i) { oup00[i - lf + 1] = oup00L[i] + oup00H[i]; } + + //SHIFT 1 + + len0 = 0; + + for (index_shift = 1; index_shift < len; index_shift += 2) + { + appx2[len0] = appx1[index_shift]; + det2[len0] = det1[index_shift]; + len0++; + } + + upsamp2(appx2, len0, U, tempx); + per_ext(tempx, 2 * len0, lf / 2, cL0); + + upsamp2(det2, len0, U, tempx); + per_ext(tempx, 2 * len0, lf / 2, cH0); + + N1 = 2 * len0 + lf; + + wconv(wt, cL0, N1, wt->wave->lpr, lf, oup00L); + + wconv(wt, cH0, N1, wt->wave->hpr, lf, oup00H); + + for (i = lf - 1; i < 2 * len0 + lf - 1; ++i) { oup01[i - lf + 1] = oup00L[i] + oup00H[i]; } + + circshift(oup01, 2 * len0, -1); + + int index2 = 0; + + for (index = count; index < N; index += value) + { + swtop[index] = (oup00[index2] + oup01[index2]) / 2.0; + index2++; + } + } + for (i = 0; i < N; ++i) { appx_sig[i] = swtop[i]; } + } + + + free(appx_sig); + free(det_sig); + free(appx1); + free(det1); + free(tempx); + free(cL0); + free(cH0); + free(oup00L); + free(oup00H); + free(oup00); + free(oup01); + free(appx2); + free(det2); +} + +static void modwt_per(wt_object wt, int M, double* inp, int N, double* cA, int len_cA, double* cD, int len_cD) +{ + int i; + int len_avg = wt->wave->lpd_len; + + double* filt = (double*)malloc(sizeof(double) * 2 * len_avg); + double s = sqrt(2.0); + for (i = 0; i < len_avg; ++i) + { + filt[i] = wt->wave->lpd[i] / s; + filt[len_avg + i] = wt->wave->hpd[i] / s; + } + + for (i = 0; i < len_cA; ++i) + { + int t = i; + cA[i] = filt[0] * inp[t]; + cD[i] = filt[len_avg] * inp[t]; + for (int l = 1; l < len_avg; ++l) + { + t -= M; + while (t >= len_cA) { t -= len_cA; } + while (t < 0) { t += len_cA; } + + cA[i] += filt[l] * inp[t]; + cD[i] += filt[len_avg + l] * inp[t]; + } + } + free(filt); +} + +void modwt(wt_object wt, double* inp) +{ + int i, iter, N; + + int temp_len = wt->siglength; + int J = wt->J; + wt->length[0] = wt->length[J] = temp_len; + wt->outlength = wt->length[J + 1] = (J + 1) * temp_len; + int len_filt = wt->wave->filtlength; + int M = 1; + for (iter = 1; iter < J; ++iter) + { + M = 2 * M; + wt->length[iter] = temp_len; + } + + + double* cA = (double*)malloc(sizeof(double) * temp_len); + double* cD = (double*)malloc(sizeof(double) * temp_len); + + M = 1; + + for (i = 0; i < temp_len; ++i) { wt->params[i] = inp[i]; } + + int lenacc = wt->outlength; + + for (iter = 0; iter < J; ++iter) + { + lenacc -= temp_len; + if (iter > 0) + { + M = 2 * M; + N = M * len_filt; + } + else { N = len_filt; } + + modwt_per(wt, M, wt->params, temp_len, cA, temp_len, cD, temp_len); + + + for (i = 0; i < temp_len; ++i) + { + wt->params[i] = cA[i]; + wt->params[lenacc + i] = cD[i]; + } + } + + free(cA); + free(cD); +} + +static void imodwt_per(wt_object wt, int M, double* cA, int len_cA, double* cD, int len_cD, double* X) +{ + int i; + int len_avg = wt->wave->lpd_len; + + double* filt = (double*)malloc(sizeof(double) * 2 * len_avg); + double s = sqrt(2.0); + for (i = 0; i < len_avg; ++i) + { + filt[i] = wt->wave->lpd[i] / s; + filt[len_avg + i] = wt->wave->hpd[i] / s; + } + + + for (i = 0; i < len_cA; ++i) + { + int t = i; + X[i] = (filt[0] * cA[t]) + (filt[len_avg] * cD[t]); + for (int l = 1; l < len_avg; ++l) + { + t += M; + while (t >= len_cA) { t -= len_cA; } + while (t < 0) { t += len_cA; } + + X[i] += (filt[l] * cA[t]) + (filt[len_avg + l] * cD[t]); + } + } + free(filt); +} + +void imodwt(wt_object wt, double* dwtop) +{ + const int N = wt->siglength; + const int J = wt->J; + //int lf = wt->wave->lpr_len; + int lenacc = N; + int M = (int)pow(2.0, (double)J - 1.0); + //M = 1; + double* X = (double*)malloc(sizeof(double) * N); + + for (int i = 0; i < N; ++i) { dwtop[i] = wt->output[i]; } + + for (int iter = 0; iter < J; ++iter) + { + if (iter > 0) { M = M / 2; } + imodwt_per(wt, M, dwtop, N, wt->params + lenacc, N, X); + //for (j = lf - 1; j < N; ++j) { dwtop[j - lf + 1] = X[j]; } + //for (j = 0; j < lf - 1; ++j) { dwtop[N - lf + 1 + j] = X[j]; } + for (int j = 0; j < N; ++j) { dwtop[j] = X[j]; } + + lenacc += N; + } + free(X); +} + +void setDWTExtension(wt_object wt, char* extension) +{ + if (!strcmp(extension, "sym")) { strcpy(wt->ext, "sym"); } + else if (!strcmp(extension, "per")) { strcpy(wt->ext, "per"); } + else + { + printf("Signal extension can be either per or sym"); + exit(-1); + } +} + +void setWTREEExtension(wtree_object wt, char* extension) +{ + if (!strcmp(extension, "sym")) { strcpy(wt->ext, "sym"); } + else if (!strcmp(extension, "per")) { strcpy(wt->ext, "per"); } + else + { + printf("Signal extension can be either per or sym"); + exit(-1); + } +} + +void setDWPTExtension(wpt_object wt, char* extension) +{ + if (!strcmp(extension, "sym")) { strcpy(wt->ext, "sym"); } + else if (!strcmp(extension, "per")) { strcpy(wt->ext, "per"); } + else + { + printf("Signal extension can be either per or sym"); + exit(-1); + } +} + +void setDWPTEntropy(wpt_object wt, char* entropy, double eparam) +{ + if (!strcmp(entropy, "shannon")) { strcpy(wt->entropy, "shannon"); } + else if (!strcmp(entropy, "threshold")) + { + strcpy(wt->entropy, "threshold"); + wt->eparam = eparam; + } + else if (!strcmp(entropy, "norm")) + { + strcpy(wt->entropy, "norm"); + wt->eparam = eparam; + } + else if (!strcmp(entropy, "logenergy") || !strcmp(entropy, "log energy") || !strcmp(entropy, "energy")) { strcpy(wt->entropy, "logenergy"); } + else + { + printf("Entropy should be one of shannon, threshold, norm or logenergy"); + exit(-1); + } +} + +void setWTConv(wt_object wt, char* cmethod) +{ + if (!strcmp(cmethod, "fft") || !strcmp(cmethod, "FFT")) { strcpy(wt->cmethod, "fft"); } + else if (!strcmp(cmethod, "direct")) { strcpy(wt->cmethod, "direct"); } + else + { + printf("Convolution Only accepts two methods - direct and fft"); + exit(-1); + } +} + +void wave_summary(wave_object obj) +{ + int i; + int N = obj->filtlength; + printf("\n"); + printf("Wavelet Name : %s \n", obj->wname); + printf("\n"); + printf("Wavelet Filters \n\n"); + printf("lpd : ["); + for (i = 0; i < N - 1; ++i) { printf("%g,", obj->lpd[i]); } + printf("%g", obj->lpd[N - 1]); + printf("] \n\n"); + printf("hpd : ["); + for (i = 0; i < N - 1; ++i) { printf("%g,", obj->hpd[i]); } + printf("%g", obj->hpd[N - 1]); + printf("] \n\n"); + printf("lpr : ["); + for (i = 0; i < N - 1; ++i) { printf("%g,", obj->lpr[i]); } + printf("%g", obj->lpr[N - 1]); + printf("] \n\n"); + printf("hpr : ["); + for (i = 0; i < N - 1; ++i) { printf("%g,", obj->hpr[i]); } + printf("%g", obj->hpr[N - 1]); + printf("] \n\n"); +} + +void wt_summary(wt_object wt) +{ + int J = wt->J; + wave_summary(wt->wave); + printf("\n"); + printf("Wavelet Transform : %s \n", wt->method); + printf("\n"); + printf("Signal Extension : %s \n", wt->ext); + printf("\n"); + printf("Convolutional Method : %s \n", wt->cmethod); + printf("\n"); + printf("Number of Decomposition Levels %d \n", wt->J); + printf("\n"); + printf("Length of Input Signal %d \n", wt->siglength); + printf("\n"); + printf("Length of WT Output Vector %d \n", wt->outlength); + printf("\n"); + printf("Wavelet Coefficients are contained in vector : %s \n", "output"); + printf("\n"); + printf("Approximation Coefficients \n"); + printf("Level %d Access : output[%d] Length : %d \n", 1, 0, wt->length[0]); + printf("\n"); + printf("Detail Coefficients \n"); + int t = wt->length[0]; + for (int i = 0; i < J; ++i) + { + printf("Level %d Access : output[%d] Length : %d \n", i + 1, t, wt->length[i + 1]); + t += wt->length[i + 1]; + } + printf("\n"); +} + +void wtree_summary(wtree_object wt) +{ + int J = wt->J; + wave_summary(wt->wave); + printf("\n"); + printf("Wavelet Transform : %s \n", wt->method); + printf("\n"); + printf("Signal Extension : %s \n", wt->ext); + printf("\n"); + printf("Number of Decomposition Levels %d \n", wt->J); + printf("\n"); + printf("Length of Input Signal %d \n", wt->siglength); + printf("\n"); + printf("Length of WT Output Vector %d \n", wt->outlength); + printf("\n"); + printf("Wavelet Coefficients are contained in vector : %s \n", "output"); + printf("\n"); + printf("Coefficients Access \n"); + int t = 0; + int p2 = 2; + for (int i = 0; i < J; ++i) + { + for (int k = 0; k < p2; ++k) + { + printf("Node %d %d Access : output[%d] Length : %d \n", i + 1, k, wt->nodelength[t], wt->length[J - i]); + t++; + } + p2 *= 2; + } + printf("\n"); +} + +void wpt_summary(wpt_object wt) +{ + int i; + int J = wt->J; + wave_summary(wt->wave); + printf("\n"); + printf("Signal Extension : %s \n", wt->ext); + printf("\n"); + printf("Entropy : %s \n", wt->entropy); + printf("\n"); + printf("Number of Decomposition Levels %d \n", wt->J); + printf("\n"); + printf("Number of Active Nodes %d \n", wt->nodes); + printf("\n"); + printf("Length of Input Signal %d \n", wt->siglength); + printf("\n"); + printf("Length of WT Output Vector %d \n", wt->outlength); + printf("\n"); + printf("Wavelet Coefficients are contained in vector : %s \n", "output"); + printf("\n"); + printf("Coefficients Access \n"); + int it1 = 1; + int it2 = 0; + for (i = 0; i < J; ++i) { it1 += ipow2(i + 1); } + for (i = J; i > 0; --i) + { + int p2 = ipow2(i); + it1 -= p2; + for (int k = 0; k < p2; ++k) + { + if (wt->basisvector[it1 + k] == 1) + { + printf("Node %d %d Access : output[%d] Length : %d \n", i, k, it2, wt->length[J - i + 1]); + it2 += wt->length[J - i + 1]; + } + } + } + + printf("\n"); +} + +void cwt_summary(cwt_object wt) +{ + printf("\n"); + printf("Wavelet : %s Parameter %lf \n", wt->wave, wt->m); + printf("\n"); + printf("Length of Input Signal : %d \n", wt->siglength); + printf("\n"); + printf("Sampling Rate : %g \n", wt->dt); + printf("\n"); + printf("Total Number of Scales : %d \n", wt->J); + printf("\n"); + printf("Smallest Scale (s0) : %lf \n", wt->s0); + printf("\n"); + printf("Separation Between Scales (dj) %lf \n", wt->dj); + printf("\n"); + printf("Scale Type %s \n", wt->type); + printf("\n"); + printf("Complex CWT Output Vector is of size %d * %d stored in Row Major format \n", wt->J, wt->siglength); + printf("\n"); + printf("The ith real value can be accessed using wt->output[i].re and imaginary value by wt->output[i].im \n"); + printf("\n"); +} + +void wave_free(wave_object object) { free(object); } + +void wt_free(wt_object object) { free(object); } + +void wtree_free(wtree_object object) { free(object); } + +void wpt_free(wpt_object object) { free(object); } + +void cwt_free(cwt_object object) { free(object); } diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavelib.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavelib.h new file mode 100644 index 0000000..cc25911 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wavelib.h @@ -0,0 +1,198 @@ +/* +Copyright (c) 2014, Rafat Hussain +*/ +#pragma once + +#include "wtmath.h" +#include "cwt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_MSC_VER) +#pragma warning(disable : 4200) +#pragma warning(disable : 4996) +#endif + +#ifndef cplx_type +#define cplx_type double +#endif + + +typedef struct cplx_t +{ + cplx_type re; + cplx_type im; +} cplx_data; + +typedef struct wave_set* wave_object; + +wave_object wave_init(char* wname); + +struct wave_set +{ + char wname[50]; + int filtlength;// When all filters are of the same length. [Matlab uses zero-padding to make all filters of the same length] + int lpd_len;// Default filtlength = lpd_len = lpr_len = hpd_len = hpr_len + int hpd_len; + int lpr_len; + int hpr_len; + double* lpd; + double* hpd; + double* lpr; + double* hpr; + double params[0]; +}; + +typedef struct wt_set* wt_object; + +wt_object wt_init(wave_object wave, char* method, int siglength, int J); + +struct wt_set +{ + wave_object wave; + conv_object cobj; + char method[10]; + int siglength;// Length of the original signal. + int outlength;// Length of the output DWT vector + int lenlength;// Length of the Output Dimension Vector "length" + int J; // Number of decomposition Levels + int MaxIter;// Maximum Iterations J <= MaxIter + int even;// even = 1 if signal is of even length. even = 0 otherwise + char ext[10];// Type of Extension used - "per" or "sym" + char cmethod[10]; // Convolution Method - "direct" or "FFT" + + int N; // + int cfftset; + int zpad; + int length[102]; + double* output; + double params[0]; +}; + +typedef struct wtree_set* wtree_object; + +wtree_object wtree_init(wave_object wave, int siglength, int J); + +struct wtree_set +{ + wave_object wave; + conv_object cobj; + char method[10]; + int siglength;// Length of the original signal. + int outlength;// Length of the output DWT vector + int lenlength;// Length of the Output Dimension Vector "length" + int J; // Number of decomposition Levels + int MaxIter;// Maximum Iterations J <= MaxIter + int even;// even = 1 if signal is of even length. even = 0 otherwise + char ext[10];// Type of Extension used - "per" or "sym" + + int N; // + int nodes; + int cfftset; + int zpad; + int length[102]; + double* output; + int* nodelength; + int* coeflength; + double params[0]; +}; + +typedef struct wpt_set* wpt_object; + +wpt_object wpt_init(wave_object wave, int siglength, int J); + +struct wpt_set +{ + wave_object wave; + conv_object cobj; + int siglength;// Length of the original signal. + int outlength;// Length of the output DWT vector + int lenlength;// Length of the Output Dimension Vector "length" + int J; // Number of decomposition Levels + int MaxIter;// Maximum Iterations J <= MaxIter + int even;// even = 1 if signal is of even length. even = 0 otherwise + char ext[10];// Type of Extension used - "per" or "sym" + char entropy[20]; + double eparam; + + int N; // + int nodes; + int length[102]; + double* output; + double* costvalues; + double* basisvector; + int* nodeindex; + int* numnodeslevel; + int* coeflength; + double params[0]; +}; + +typedef struct cwt_set* cwt_object; + +cwt_object cwt_init(char* wave, double param, int siglength, double dt, int J); + +struct cwt_set +{ + char wave[10];// Wavelet - morl/morlet,paul,dog/dgauss + int siglength;// Length of Input Data + int J;// Total Number of Scales + double s0;// Smallest scale. It depends on the sampling rate. s0 <= 2 * dt for most wavelets + double dt;// Sampling Rate + double dj;// Separation between scales. eg., scale = s0 * 2 ^ ( [0:N-1] *dj ) or scale = s0 *[0:N-1] * dj + char type[10];// Scale Type - Power or Linear + int pow;// Base of Power in case type = pow. Typical value is pow = 2 + int sflag; + int pflag; + int npad; + int mother; + double m;// Wavelet parameter param + double smean;// Input Signal mean + + cplx_data* output; + double* scale; + double* period; + double* coi; + double params[0]; +}; + + +void dwt(wt_object wt, double* inp); +void idwt(wt_object wt, double* dwtop); +void wtree(wtree_object wt, double* inp); +void dwpt(wpt_object wt, double* inp); +void idwpt(wpt_object wt, double* dwtop); +void swt(wt_object wt, double* inp); +void iswt(wt_object wt, double* swtop); +void modwt(wt_object wt, double* inp); +void imodwt(wt_object wt, double* dwtop); +void setDWTExtension(wt_object wt, char* extension); +void setWTREEExtension(wtree_object wt, char* extension); +void setDWPTExtension(wpt_object wt, char* extension); +void setDWPTEntropy(wpt_object wt, char* entropy, double eparam); +void setWTConv(wt_object wt, char* cmethod); +int getWTREENodelength(wtree_object wt, int X); +void getWTREECoeffs(wtree_object wt, int X, int Y, double* coeffs, int N); +int getDWPTNodelength(wpt_object wt, int X); +void getDWPTCoeffs(wpt_object wt, int X, int Y, double* coeffs, int N); +int setCWTScales(cwt_object wt, double s0, double dj, char* type, int power); +void setCWTScaleVector(cwt_object wt, double* scale, int J, double s0, double dj); +void setCWTPadding(cwt_object wt, int pad); +int cwt(cwt_object wt, double* inp); +void icwt(cwt_object wt, double* cwtop); +int getCWTScaleLength(int N); +void wave_summary(wave_object obj); +void wt_summary(wt_object wt); +void wtree_summary(wtree_object wt); +void wpt_summary(wpt_object wt); +void cwt_summary(cwt_object wt); +void wave_free(wave_object object); +void wt_free(wt_object object); +void wtree_free(wtree_object object); +void wpt_free(wpt_object object); +void cwt_free(cwt_object object); + +#ifdef __cplusplus +} +#endif diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wtmath.c b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wtmath.c new file mode 100644 index 0000000..4e5d7d4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wtmath.c @@ -0,0 +1,293 @@ +/* +Copyright (c) 2014, Rafat Hussain +*/ +#include "wtmath.h" + +int upsamp(double* x, int lenx, int M, double* y) +{ + int i; + + if (M < 0) { return -1; } + + if (M == 0) + { + for (i = 0; i < lenx; ++i) { y[i] = x[i]; } + return lenx; + } + + const int N = M * (lenx - 1) + 1; + int j = 1; + int k = 0; + + for (i = 0; i < N; ++i) + { + j--; + y[i] = 0.0; + if (j == 0) + { + y[i] = x[k]; + k++; + j = M; + } + } + + return N; +} + +int upsamp2(double* x, int lenx, int M, double* y) +{ + int i; + // upsamp2 returns even numbered output. Last value is set to zero + if (M < 0) { return -1; } + + if (M == 0) + { + for (i = 0; i < lenx; ++i) { y[i] = x[i]; } + return lenx; + } + + const int N = M * lenx; + int j = 1; + int k = 0; + + for (i = 0; i < N; ++i) + { + j--; + y[i] = 0.0; + if (j == 0) + { + y[i] = x[k]; + k++; + j = M; + } + } + + return N; +} + +int downsamp(double* x, int lenx, int M, double* y) +{ + int i; + + if (M < 0) { return -1; } + if (M == 0) + { + for (i = 0; i < lenx; ++i) { y[i] = x[i]; } + return lenx; + } + + const int N = (lenx - 1) / M + 1; + + for (i = 0; i < N; ++i) { y[i] = x[i * M]; } + + return N; +} +/* +int per_ext(double *sig, int len, int a,double *oup) { + int i,len2; + // oup is of length len + (len%2) + 2 * a + for (i = 0; i < len; ++i) { + oup[a + i] = sig[i]; + } + len2 = len; + if ((len % 2) != 0) { + len2 = len + 1; + oup[a + len] = sig[len - 1]; + } + for (i = 0; i < a; ++i) { + oup[a-1-i] = sig[len - 1 - i]; + oup[len2 + a + i] = sig[i]; + } + + return len2; + +} +*/ + +int per_ext(double* sig, int len, int a, double* oup) +{ + int i; + for (i = 0; i < len; ++i) { oup[a + i] = sig[i]; } + int len2 = len; + if ((len % 2) != 0) + { + len2 = len + 1; + oup[a + len] = sig[len - 1]; + } + for (i = 0; i < a; ++i) + { + const double temp1 = oup[a + i]; + const double temp2 = oup[a + len2 - 1 - i]; + oup[a - 1 - i] = temp2; + oup[len2 + a + i] = temp1; + } + return len2; +} +/* +int symm_ext(double *sig, int len, int a, double *oup) { + int i, len2; + // oup is of length len + 2 * a + for (i = 0; i < len; ++i) { + oup[a + i] = sig[i]; + } + len2 = len; + for (i = 0; i < a; ++i) { + oup[a - 1 - i] = sig[i]; + oup[len2 + a + i] = sig[len - 1 - i]; + } + + return len2; + +} +*/ + +int symm_ext(double* sig, int len, int a, double* oup) +{ + int i; + // oup is of length len + 2 * a + for (i = 0; i < len; ++i) { oup[a + i] = sig[i]; } + const int len2 = len; + for (i = 0; i < a; ++i) + { + const double temp1 = oup[a + i]; + const double temp2 = oup[a + len2 - 1 - i]; + oup[a - 1 - i] = temp1; + oup[len2 + a + i] = temp2; + } + + return len2; +} + +static int isign(int N) +{ + int M; + if (N >= 0) { M = 1; } + else { M = -1; } + + return M; +} + +static int iabs(int N) +{ + if (N >= 0) { return N; } + return -N; +} + +void circshift(double* array, int N, int L) +{ + int i; + if (iabs(L) > N) { L = isign(L) * (iabs(L) % N); } + if (L < 0) { L = (N + L) % N; } + + double* temp = (double*)malloc(sizeof(double) * L); + + for (i = 0; i < L; ++i) { temp[i] = array[i]; } + + for (i = 0; i < N - L; ++i) { array[i] = array[i + L]; } + + for (i = 0; i < L; ++i) { array[N - L + i] = temp[i]; } + + free(temp); +} + +int testSWTlength(int N, int J) +{ + int ret = 1; + + int div = 1; + for (int i = 0; i < J; ++i) { div *= 2; } + + if (N % div) { ret = 0; } + + return ret; +} + +int wmaxiter(int sig_len, int filt_len) +{ + const double temp = log((double)sig_len / ((double)filt_len - 1.0)) / log(2.0); + const int lev = (int)temp; + + return lev; +} + +static double entropy_s(double* x, int N) +{ + double val = 0.0; + + for (int i = 0; i < N; ++i) + { + if (x[i] != 0) + { + const double x2 = x[i] * x[i]; + val -= x2 * log(x2); + } + } + return val; +} + +static double entropy_t(double* x, int N, double t) +{ + if (t < 0) + { + printf("Threshold value must be >= 0"); + exit(1); + } + double val = 0.0; + + for (int i = 0; i < N; ++i) + { + const double x2 = fabs(x[i]); + if (x2 > t) { val += 1; } + } + + return val; +} + +static double entropy_n(double* x, int N, double p) +{ + if (p < 1) + { + printf("Norm power value must be >= 1"); + exit(1); + } + double val = 0.0; + for (int i = 0; i < N; ++i) + { + const double x2 = fabs(x[i]); + val += pow(x2, p); + } + + return val; +} + +static double entropy_l(double* x, int N) +{ + double val = 0.0; + + for (int i = 0; i < N; ++i) + { + if (x[i] != 0) + { + const double x2 = x[i] * x[i]; + val += log(x2); + } + } + return val; +} + +double costfunc(double* x, int N, char* entropy, double p) +{ + double val; + + if (!strcmp(entropy, "shannon")) { val = entropy_s(x, N); } + else if (!strcmp(entropy, "threshold")) { val = entropy_t(x, N, p); } + else if (!strcmp(entropy, "norm")) { val = entropy_n(x, N, p); } + else if (!strcmp(entropy, "logenergy") || !strcmp(entropy, "log energy") || !strcmp(entropy, "energy")) { val = entropy_l(x, N); } + else + { + printf("Entropy must be one of shannon, threshold, norm or energy"); + exit(-1); + } + + return val; +} diff --git a/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wtmath.h b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wtmath.h new file mode 100644 index 0000000..a32257a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/dependencies-source/wavelib/src/wtmath.h @@ -0,0 +1,24 @@ +/* +Copyright (c) 2014, Rafat Hussain +*/ +#pragma once + +#include "wavefilt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int upsamp(double* x, int lenx, int M, double* y); +int upsamp2(double* x, int lenx, int M, double* y); +int downsamp(double* x, int lenx, int M, double* y); +int per_ext(double* sig, int len, int a, double* oup); +int symm_ext(double* sig, int len, int a, double* oup); +void circshift(double* array, int N, int L); +int testSWTlength(int N, int J); +int wmaxiter(int sig_len, int filt_len); +double costfunc(double* x, int N, char* entropy, double p); + +#ifdef __cplusplus +} +#endif diff --git a/Masterarbeit/openvibe/sdk-master/documentation/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/documentation/CMakeLists.txt new file mode 100644 index 0000000..f31c2d1 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/CMakeLists.txt @@ -0,0 +1,45 @@ +find_package(Doxygen) +option(BUILD_DOCUMENTATION "Create and install the HTML based API documentation (requires Doxygen)" OFF) + +if(BUILD_DOCUMENTATION) + if(NOT DOXYGEN_FOUND) + message(FATAL_ERROR "Doxygen is needed to build the documentation.") + endif() + + file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/html") + + set(doxyfile_in ${CMAKE_CURRENT_SOURCE_DIR}/src/Doxyfile.in) + set(doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) + + configure_file(${doxyfile_in} ${doxyfile} @ONLY) + + add_custom_target(doc + COMMAND ${DOXYGEN_EXECUTABLE} ${doxyfile} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Generating API documentation with Doxygen" + VERBATIM) + + install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html DESTINATION ${DIST_DOCDIR}) + install(DIRECTORY doc/ DESTINATION ${DIST_DOCDIR}/html) + +endif() + +# Sphinx Documentation +install(DIRECTORY DESTINATION "${DIST_DOCTMP}/sphinx") +install(DIRECTORY DESTINATION "${DIST_DOCTMP}/sphinx/templates") + +# Collect all sphinx documentation files from all projects + +file(GLOB SPHINX_DOC_DIRS LIST_DIRECTORIES true LIST_FILES false "${PROJECT_SOURCE_DIR}/plugins/processing/*") +foreach(DOCDIR ${SPHINX_DOC_DIRS}) + if(IS_DIRECTORY "${DOCDIR}/doc/boxes") + INSTALL(DIRECTORY "${DOCDIR}/doc/boxes" DESTINATION ${DIST_DOCTMP}/sphinx/source) + endif() +endforeach() + +INSTALL(DIRECTORY sphinx/source DESTINATION ${DIST_DOCTMP}/sphinx) +INSTALL(FILES sphinx/make.bat DESTINATION ${DIST_DOCTMP}/sphinx) +INSTALL(FILES sphinx/Makefile DESTINATION ${DIST_DOCTMP}/sphinx) +INSTALL(FILES sphinx/build-documentation.cmd DESTINATION ${DIST_DOCTMP}) +INSTALL(FILES sphinx/build-documentation.sh DESTINATION ${DIST_DOCTMP}) + diff --git a/Masterarbeit/openvibe/sdk-master/documentation/doc/cc-by-sa.png b/Masterarbeit/openvibe/sdk-master/documentation/doc/cc-by-sa.png new file mode 100644 index 0000000..924eee5 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/doc/cc-by-sa.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/doc/doxygen.png b/Masterarbeit/openvibe/sdk-master/documentation/doc/doxygen.png new file mode 100644 index 0000000..b891fd3 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/doc/doxygen.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/doc/logo.png b/Masterarbeit/openvibe/sdk-master/documentation/doc/logo.png new file mode 100644 index 0000000..bf5bb96 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/doc/logo.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/doc/mensia-logo-large.png b/Masterarbeit/openvibe/sdk-master/documentation/doc/mensia-logo-large.png new file mode 100644 index 0000000..4b73db4 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/doc/mensia-logo-large.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/doc/mensia-logo-small.png b/Masterarbeit/openvibe/sdk-master/documentation/doc/mensia-logo-small.png new file mode 100644 index 0000000..ca5f4fc Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/doc/mensia-logo-small.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/doc/mensia-logo-thumb.png b/Masterarbeit/openvibe/sdk-master/documentation/doc/mensia-logo-thumb.png new file mode 100644 index 0000000..ab469f4 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/doc/mensia-logo-thumb.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/doc/mensia.css b/Masterarbeit/openvibe/sdk-master/documentation/doc/mensia.css new file mode 100644 index 0000000..39f69ce --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/doc/mensia.css @@ -0,0 +1,45 @@ +body { +/* position:relative;*/ + max-width:11in; + margin:0 auto; + /*background:url('doc-bg.png') #fff left repeat-y;*/ +} + +#sidebar { + width:200px; + float:left; + border-left:1px solid #C4CFE5; + border-right:1px solid #C4CFE5; + padding-bottom:100%; +} + +#sidebar ul, #sidebar div { + padding-left:10px; +} + +#sidebar li { + list-style:none; +} + +#sidebar b { + font-weight:bold; +} + +#search input { + border:1px solid black; + width:180px; + +} + +#content { + margin-left:200px; +} + +hr.footer { + clear:both; +} + +div.fragment * +{ + white-space: pre; +} \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/documentation/doc/openvibe-logo-highres.png b/Masterarbeit/openvibe/sdk-master/documentation/doc/openvibe-logo-highres.png new file mode 100644 index 0000000..4927793 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/doc/openvibe-logo-highres.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/doc/openvibe-logo.png b/Masterarbeit/openvibe/sdk-master/documentation/doc/openvibe-logo.png new file mode 100644 index 0000000..bf5bb96 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/doc/openvibe-logo.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/doc/openvibe.css b/Masterarbeit/openvibe/sdk-master/documentation/doc/openvibe.css new file mode 100644 index 0000000..15f6b8c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/doc/openvibe.css @@ -0,0 +1,29 @@ +body { +/* position:relative;*/ + max-width:11in; + margin:0 auto; + /*background:url('doc-bg.png') #fff left repeat-y;*/ +} + +#sidebar { + display: flex; + padding-bottom:10px; + width:100%; + flex-direction: row; +} + +#sidebar > div { + flex: 1; +} + +#sidebar ul { + padding-left:10px; +} + +#sidebar li { + list-style:none; +} + +#sidebar b { + font-weight:bold; +} diff --git a/Masterarbeit/openvibe/sdk-master/documentation/doc/search.php b/Masterarbeit/openvibe/sdk-master/documentation/doc/search.php new file mode 100644 index 0000000..d8d4da7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/doc/search.php @@ -0,0 +1,35 @@ + diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/Makefile b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/Makefile new file mode 100644 index 0000000..733a8fc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/Makefile @@ -0,0 +1,229 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source + +.PHONY: help +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " epub3 to make an epub3" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + @echo " dummy to check syntax errors of document sources" + +.PHONY: clean +clean: + rm -rf $(BUILDDIR)/* + +.PHONY: html +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: livehtml +livehtml: + sphinx-autobuild -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + +.PHONY: dirhtml +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +.PHONY: singlehtml +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +.PHONY: pickle +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +.PHONY: json +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +.PHONY: htmlhelp +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +.PHONY: qthelp +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/NeuroRTArchway.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/NeuroRTArchway.qhc" + +.PHONY: applehelp +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +.PHONY: devhelp +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/NeuroRTArchway" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/NeuroRTArchway" + @echo "# devhelp" + +.PHONY: epub +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +.PHONY: epub3 +epub3: + $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 + @echo + @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." + +.PHONY: latex +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +.PHONY: latexpdf +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: latexpdfja +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: text +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +.PHONY: man +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +.PHONY: texinfo +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +.PHONY: info +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +.PHONY: gettext +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +.PHONY: changes +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +.PHONY: linkcheck +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +.PHONY: doctest +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +.PHONY: coverage +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +.PHONY: xml +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +.PHONY: pseudoxml +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." + +.PHONY: dummy +dummy: + $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy + @echo + @echo "Build finished. Dummy builder generates no files." diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/build-documentation.cmd b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/build-documentation.cmd new file mode 100644 index 0000000..a5d1780 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/build-documentation.cmd @@ -0,0 +1,17 @@ +setlocal +setlocal enableextensions + +set "OV_PATH_ROOT=%~dp0.." +set "PATH=%OV_PATH_ROOT%/bin;%PATH%" +set "TEMPLATE_DIR=sphinx emplates" +if not exist %TEMPLATE_DIR% (md %TEMPLATE_DIR%) +call openvibe-plugin-inspector --box-doc-directory sphinx/templates +move sphinx\templates\index-boxes.rst sphinx\source\boxes +pushd sphinx +call make.bat html +popd +endlocal +if exist ..\doc (rmdir /s /q ..\doc) +mkdir ..\doc +move sphinx\build\html "..\doc\OpenViBE Manual" + diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/build-documentation.sh b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/build-documentation.sh new file mode 100644 index 0000000..93e892a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/build-documentation.sh @@ -0,0 +1,14 @@ +export OV_PATH_ROOT="${PWD}/.." +export LD_LIBRARY_PATH="${OV_PATH_ROOT}/lib" +export DYLD_LIBRARY_PATH="${OV_PATH_ROOT}/lib" +mkdir -p sphinx/templates +"${OV_PATH_ROOT}/bin/openvibe-plugin-inspector" --box-doc-directory sphinx/templates +mv sphinx/templates/index-boxes.rst sphinx/source/boxes + +pushd sphinx +make html +popd +rm -fr "../doc/NeuroRT Manual" +mkdir -p ../doc +mv sphinx/build/html "../doc/OpenViBE Manual" + diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/make.bat b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/make.bat new file mode 100644 index 0000000..2d2b1a0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/make.bat @@ -0,0 +1,281 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source +set I18NSPHINXOPTS=%SPHINXOPTS% source +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. epub3 to make an epub3 + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. xml to make Docutils-native XML files + echo. pseudoxml to make pseudoxml-XML files for display purposes + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + echo. coverage to run coverage check of the documentation if enabled + echo. dummy to check syntax errors of document sources + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + + +REM Check if sphinx-build is available and fallback to Python version if any +%SPHINXBUILD% 1>NUL 2>NUL +if errorlevel 9009 goto sphinx_python +goto sphinx_ok + +:sphinx_python + +set SPHINXBUILD=python -m sphinx.__init__ +%SPHINXBUILD% 2> nul +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +:sphinx_ok + + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\NeuroRTArchway.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\NeuroRTArchway.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "epub3" ( + %SPHINXBUILD% -b epub3 %ALLSPHINXOPTS% %BUILDDIR%/epub3 + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub3 file is in %BUILDDIR%/epub3. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdf" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf + cd %~dp0 + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdfja" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf-ja + cd %~dp0 + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +if "%1" == "coverage" ( + %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage + if errorlevel 1 exit /b 1 + echo. + echo.Testing of coverage in the sources finished, look at the ^ +results in %BUILDDIR%/coverage/python.txt. + goto end +) + +if "%1" == "xml" ( + %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The XML files are in %BUILDDIR%/xml. + goto end +) + +if "%1" == "pseudoxml" ( + %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. + goto end +) + +if "%1" == "dummy" ( + %SPHINXBUILD% -b dummy %ALLSPHINXOPTS% %BUILDDIR%/dummy + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. Dummy builder generates no files. + goto end +) + +:end diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/_static/css/openvibe.css b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/_static/css/openvibe.css new file mode 100644 index 0000000..61a92bc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/_static/css/openvibe.css @@ -0,0 +1,50 @@ +@import url("theme.css"); + +.color-stream-unidentified { + color: #F2F2F2; +} + +.color-stream-if-else { + color: #00FDFF; +} + +.color-stream-ebml { + color: #ABAEE5; +} + +.color-stream-experiment-information { + color: #F0D688; +} + +.color-stream-stimulations { + color: #B288AD; +} + +.color-stream-streamed-matrix { + color: #A5ED80; +} + +.color-stream-covariance-matrix { + color: #82B784; +} + +.color-stream-channel-localization { + color: #87A3F4; +} + +.color-stream-feature-vector { + color: #F49599; +} + +.color-stream-signal { + color: #EA99E1; +} + +.color-stream-spectrum { + color: #F6D99C; +} + +.color-stream-time-frequency { + color: #F6F99C; +} + diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/conf.py b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/conf.py new file mode 100644 index 0000000..d70c214 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/conf.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +# +# OpenViBE documentation build configuration file, created by +# sphinx-quickstart on Fri Jun 24 16:43:33 2016. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +extensions = [ + 'sphinx.ext.todo', + 'sphinx.ext.mathjax', + 'sphinx.ext.ifconfig', +] + +templates_path = ['_templates'] + +source_suffix = '.rst' + +source_encoding = 'utf-8-sig' + +master_doc = 'index' + +# General information about the project. +project = u'OpenViBE' +copyright = u'2018, Inria & Mensia' +author = u'OpenViBE Team' + +# The short X.Y version. +version = u'3.2' +# The full version, including alpha/beta/rc tags. +release = u'3.2' + +language = None + +exclude_patterns = [] + +pygments_style = 'sphinx' + +todo_include_todos = True + +html_theme = 'sphinx_rtd_theme' + +html_static_path = ['_static'] + +html_style = 'css/openvibe.css' + +html_extra_path = [] + +htmlhelp_basename = 'OpenViBEdoc' + +rst_epilog = """ +.. |Brand| replace:: OpenViBE +.. |AuthTool| replace:: Designer +.. |BulletEngCtrlPanel| replace:: Custom Tools +""" diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/acquisition-stream-small.png b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/acquisition-stream-small.png new file mode 100644 index 0000000..8c0c5b6 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/acquisition-stream-small.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/chanloc-stream-card.png b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/chanloc-stream-card.png new file mode 100644 index 0000000..8d110f9 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/chanloc-stream-card.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/ebml-stream-card.png b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/ebml-stream-card.png new file mode 100644 index 0000000..dca5128 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/ebml-stream-card.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/fvec-stream-card.png b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/fvec-stream-card.png new file mode 100644 index 0000000..cb6889c Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/fvec-stream-card.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/signal-stream-card.png b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/signal-stream-card.png new file mode 100644 index 0000000..43297b8 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/signal-stream-card.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/sm-stream-card.png b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/sm-stream-card.png new file mode 100644 index 0000000..906d344 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/sm-stream-card.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/spec-stream-card.png b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/spec-stream-card.png new file mode 100644 index 0000000..56f1510 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/spec-stream-card.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/stim-stream-card.png b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/stim-stream-card.png new file mode 100644 index 0000000..29f271d Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/stim-stream-card.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/streams.png b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/streams.png new file mode 100644 index 0000000..c8c9837 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/streams.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/xp-stream-card.png b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/xp-stream-card.png new file mode 100644 index 0000000..9cb5c2c Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/images/xp-stream-card.png differ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/index-data-formats.rst b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/index-data-formats.rst new file mode 100644 index 0000000..a5f490c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/index-data-formats.rst @@ -0,0 +1,9 @@ +Data Formats Documentation +========================== + +.. toctree:: + :maxdepth: 1 + + stream-structures + stimulations + matrix-file-format diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/matrix-file-format.rst b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/matrix-file-format.rst new file mode 100644 index 0000000..44d79d6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/matrix-file-format.rst @@ -0,0 +1,67 @@ +.. _Doc_MatrixFileFormat: + +Matrix File Format +================== + +Sometimes it is useful to be able to save/load OpenViBE matrices to/from disk. +Examples of such matrices are channel localization data that contains a list of +electrode names and their coordinates, and color scales, which may be used by +visualisation plugins to map potentials to colors. To that end, an OpenViBE +matrix file format was defined and OpenViBE matrix file reader/writer +algorithms created to process it. For a programmer, either the algorithms can +be used, or more straightforwardly via the toolkit functions, + +.. code:: + + OpenViBE::Toolkit::Matrix::saveToTextFile(...) + OpenViBE::Toolkit::Matrix::loadFromTextFile(...) + +On disk, this format follows a very simple text syntax for maximum portability. + +.. note:: + + Since the matrices are stored as text, they do not maintain absolute float + precision. For the aforementioned save routine, a desired precision can be + given. + +Comments may be inserted anywhere, start with a ``#`` character and extend to +the end of the line. + +Also, trailing/leading whitespaces on a line are trimmed by the parser. + +The file should begin by the header section, delimited by opening and closing +brackets. Each dimension of the matrix is listed in turn and delimited by its +own opening and closing brackets. Dimension element labels should be declared +within these brackets, each being delimited by quotation marks. Empty labels +may be used, and the number of labels must match the dimension size. This is +what a header might look like : + +:: + + # header + [ + [ "color1" "color2" ] + [ "Red" "Green" "Blue" ] + ] + +The next section of the file is the buffer part of the matrix. Opening and closing brackets are used to identify dimensions. Elements are listed in the innermost dimension, and are separated by quotation marks. This is what an appropriate buffer could look like for a 2×3 matrix : + +:: + + # header + [ + [ "color1" "color2" ] + [ "Red" "Green" "Blue" ] + ] + + #buffer + + [ #color1 + [1 0 0] #red + ] + + [ #color2 + [0 1 0] #blue + ] + + #end of buffer diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/stimulations.rst b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/stimulations.rst new file mode 100644 index 0000000..9126b73 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/stimulations.rst @@ -0,0 +1,443 @@ +.. _Doc_Stimulations: + +Stimulations +============ + +Stimulation codes for available named stimulations are: + +.. csv-table:: + :header: "Stimulation Name", "Stimulation Code" + + "OVTK_StimulationId_ExperimentStart", "0x00008001" + "OVTK_StimulationId_ExperimentStop", "0x00008002" + "OVTK_StimulationId_SegmentStart", "0x00008003" + "OVTK_StimulationId_SegmentStop", "0x00008004" + "OVTK_StimulationId_TrialStart", "0x00008005" + "OVTK_StimulationId_TrialStop", "0x00008006" + "OVTK_StimulationId_BaselineStart", "0x00008007" + "OVTK_StimulationId_BaselineStop", "0x00008008" + "OVTK_StimulationId_RestStart", "0x00008009" + "OVTK_StimulationId_RestStop", "0x0000800a" + "OVTK_StimulationId_VisualStimulationStart", "0x0000800b" + "OVTK_StimulationId_VisualStimulationStop", "0x0000800c" + "OVTK_StimulationId_VisualSteadyStateStimulationStart", "0x00008010" + "OVTK_StimulationId_VisualSteadyStateStimulationStop", "0x00008011" + "OVTK_StimulationId_Button1_Pressed", "0x00008012" + "OVTK_StimulationId_Button1_Released", "0x00008013" + "OVTK_StimulationId_Button2_Pressed", "0x00008014" + "OVTK_StimulationId_Button2_Released", "0x00008015" + "OVTK_StimulationId_Button3_Pressed", "0x00008016" + "OVTK_StimulationId_Button3_Released", "0x00008017" + "OVTK_StimulationId_Button4_Pressed", "0x00008018" + "OVTK_StimulationId_Button4_Released", "0x00008019" + "OVTK_StimulationId_Label_00", "0x00008100" + "OVTK_StimulationId_Label_01", "0x00008101" + "OVTK_StimulationId_Label_02", "0x00008102" + "OVTK_StimulationId_Label_03", "0x00008103" + "OVTK_StimulationId_Label_04", "0x00008104" + "OVTK_StimulationId_Label_05", "0x00008105" + "OVTK_StimulationId_Label_06", "0x00008106" + "OVTK_StimulationId_Label_07", "0x00008107" + "OVTK_StimulationId_Label_08", "0x00008108" + "OVTK_StimulationId_Label_09", "0x00008109" + "OVTK_StimulationId_Label_0A", "0x0000810a" + "OVTK_StimulationId_Label_0B", "0x0000810b" + "OVTK_StimulationId_Label_0C", "0x0000810c" + "OVTK_StimulationId_Label_0D", "0x0000810d" + "OVTK_StimulationId_Label_0E", "0x0000810e" + "OVTK_StimulationId_Label_0F", "0x0000810f" + "OVTK_StimulationId_Label_10", "0x00008110" + "OVTK_StimulationId_Label_11", "0x00008111" + "OVTK_StimulationId_Label_12", "0x00008112" + "OVTK_StimulationId_Label_13", "0x00008113" + "OVTK_StimulationId_Label_14", "0x00008114" + "OVTK_StimulationId_Label_15", "0x00008115" + "OVTK_StimulationId_Label_16", "0x00008116" + "OVTK_StimulationId_Label_17", "0x00008117" + "OVTK_StimulationId_Label_18", "0x00008118" + "OVTK_StimulationId_Label_19", "0x00008119" + "OVTK_StimulationId_Label_1A", "0x0000811a" + "OVTK_StimulationId_Label_1B", "0x0000811b" + "OVTK_StimulationId_Label_1C", "0x0000811c" + "OVTK_StimulationId_Label_1D", "0x0000811d" + "OVTK_StimulationId_Label_1E", "0x0000811e" + "OVTK_StimulationId_Label_1F", "0x0000811f" + "OVTK_StimulationId_Label_20", "0x00008120" + "OVTK_StimulationId_Label_21", "0x00008121" + "OVTK_StimulationId_Label_22", "0x00008122" + "OVTK_StimulationId_Label_23", "0x00008123" + "OVTK_StimulationId_Label_24", "0x00008124" + "OVTK_StimulationId_Label_25", "0x00008125" + "OVTK_StimulationId_Label_26", "0x00008126" + "OVTK_StimulationId_Label_27", "0x00008127" + "OVTK_StimulationId_Label_28", "0x00008128" + "OVTK_StimulationId_Label_29", "0x00008129" + "OVTK_StimulationId_Label_2A", "0x0000812a" + "OVTK_StimulationId_Label_2B", "0x0000812b" + "OVTK_StimulationId_Label_2C", "0x0000812c" + "OVTK_StimulationId_Label_2D", "0x0000812d" + "OVTK_StimulationId_Label_2E", "0x0000812e" + "OVTK_StimulationId_Label_2F", "0x0000812f" + "OVTK_StimulationId_Label_30", "0x00008130" + "OVTK_StimulationId_Label_31", "0x00008131" + "OVTK_StimulationId_Label_32", "0x00008132" + "OVTK_StimulationId_Label_33", "0x00008133" + "OVTK_StimulationId_Label_34", "0x00008134" + "OVTK_StimulationId_Label_35", "0x00008135" + "OVTK_StimulationId_Label_36", "0x00008136" + "OVTK_StimulationId_Label_37", "0x00008137" + "OVTK_StimulationId_Label_38", "0x00008138" + "OVTK_StimulationId_Label_39", "0x00008139" + "OVTK_StimulationId_Label_3A", "0x0000813a" + "OVTK_StimulationId_Label_3B", "0x0000813b" + "OVTK_StimulationId_Label_3C", "0x0000813c" + "OVTK_StimulationId_Label_3D", "0x0000813d" + "OVTK_StimulationId_Label_3E", "0x0000813e" + "OVTK_StimulationId_Label_3F", "0x0000813f" + "OVTK_StimulationId_Label_40", "0x00008140" + "OVTK_StimulationId_Label_41", "0x00008141" + "OVTK_StimulationId_Label_42", "0x00008142" + "OVTK_StimulationId_Label_43", "0x00008143" + "OVTK_StimulationId_Label_44", "0x00008144" + "OVTK_StimulationId_Label_45", "0x00008145" + "OVTK_StimulationId_Label_46", "0x00008146" + "OVTK_StimulationId_Label_47", "0x00008147" + "OVTK_StimulationId_Label_48", "0x00008148" + "OVTK_StimulationId_Label_49", "0x00008149" + "OVTK_StimulationId_Label_4A", "0x0000814a" + "OVTK_StimulationId_Label_4B", "0x0000814b" + "OVTK_StimulationId_Label_4C", "0x0000814c" + "OVTK_StimulationId_Label_4D", "0x0000814d" + "OVTK_StimulationId_Label_4E", "0x0000814e" + "OVTK_StimulationId_Label_4F", "0x0000814f" + "OVTK_StimulationId_Label_50", "0x00008150" + "OVTK_StimulationId_Label_51", "0x00008151" + "OVTK_StimulationId_Label_52", "0x00008152" + "OVTK_StimulationId_Label_53", "0x00008153" + "OVTK_StimulationId_Label_54", "0x00008154" + "OVTK_StimulationId_Label_55", "0x00008155" + "OVTK_StimulationId_Label_56", "0x00008156" + "OVTK_StimulationId_Label_57", "0x00008157" + "OVTK_StimulationId_Label_58", "0x00008158" + "OVTK_StimulationId_Label_59", "0x00008159" + "OVTK_StimulationId_Label_5A", "0x0000815a" + "OVTK_StimulationId_Label_5B", "0x0000815b" + "OVTK_StimulationId_Label_5C", "0x0000815c" + "OVTK_StimulationId_Label_5D", "0x0000815d" + "OVTK_StimulationId_Label_5E", "0x0000815e" + "OVTK_StimulationId_Label_5F", "0x0000815f" + "OVTK_StimulationId_Label_60", "0x00008160" + "OVTK_StimulationId_Label_61", "0x00008161" + "OVTK_StimulationId_Label_62", "0x00008162" + "OVTK_StimulationId_Label_63", "0x00008163" + "OVTK_StimulationId_Label_64", "0x00008164" + "OVTK_StimulationId_Label_65", "0x00008165" + "OVTK_StimulationId_Label_66", "0x00008166" + "OVTK_StimulationId_Label_67", "0x00008167" + "OVTK_StimulationId_Label_68", "0x00008168" + "OVTK_StimulationId_Label_69", "0x00008169" + "OVTK_StimulationId_Label_6A", "0x0000816a" + "OVTK_StimulationId_Label_6B", "0x0000816b" + "OVTK_StimulationId_Label_6C", "0x0000816c" + "OVTK_StimulationId_Label_6D", "0x0000816d" + "OVTK_StimulationId_Label_6E", "0x0000816e" + "OVTK_StimulationId_Label_6F", "0x0000816f" + "OVTK_StimulationId_Label_70", "0x00008170" + "OVTK_StimulationId_Label_71", "0x00008171" + "OVTK_StimulationId_Label_72", "0x00008172" + "OVTK_StimulationId_Label_73", "0x00008173" + "OVTK_StimulationId_Label_74", "0x00008174" + "OVTK_StimulationId_Label_75", "0x00008175" + "OVTK_StimulationId_Label_76", "0x00008176" + "OVTK_StimulationId_Label_77", "0x00008177" + "OVTK_StimulationId_Label_78", "0x00008178" + "OVTK_StimulationId_Label_79", "0x00008179" + "OVTK_StimulationId_Label_7A", "0x0000817a" + "OVTK_StimulationId_Label_7B", "0x0000817b" + "OVTK_StimulationId_Label_7C", "0x0000817c" + "OVTK_StimulationId_Label_7D", "0x0000817d" + "OVTK_StimulationId_Label_7E", "0x0000817e" + "OVTK_StimulationId_Label_7F", "0x0000817f" + "OVTK_StimulationId_Label_80", "0x00008180" + "OVTK_StimulationId_Label_81", "0x00008181" + "OVTK_StimulationId_Label_82", "0x00008182" + "OVTK_StimulationId_Label_83", "0x00008183" + "OVTK_StimulationId_Label_84", "0x00008184" + "OVTK_StimulationId_Label_85", "0x00008185" + "OVTK_StimulationId_Label_86", "0x00008186" + "OVTK_StimulationId_Label_87", "0x00008187" + "OVTK_StimulationId_Label_88", "0x00008188" + "OVTK_StimulationId_Label_89", "0x00008189" + "OVTK_StimulationId_Label_8A", "0x0000818a" + "OVTK_StimulationId_Label_8B", "0x0000818b" + "OVTK_StimulationId_Label_8C", "0x0000818c" + "OVTK_StimulationId_Label_8D", "0x0000818d" + "OVTK_StimulationId_Label_8E", "0x0000818e" + "OVTK_StimulationId_Label_8F", "0x0000818f" + "OVTK_StimulationId_Label_90", "0x00008190" + "OVTK_StimulationId_Label_91", "0x00008191" + "OVTK_StimulationId_Label_92", "0x00008192" + "OVTK_StimulationId_Label_93", "0x00008193" + "OVTK_StimulationId_Label_94", "0x00008194" + "OVTK_StimulationId_Label_95", "0x00008195" + "OVTK_StimulationId_Label_96", "0x00008196" + "OVTK_StimulationId_Label_97", "0x00008197" + "OVTK_StimulationId_Label_98", "0x00008198" + "OVTK_StimulationId_Label_99", "0x00008199" + "OVTK_StimulationId_Label_9A", "0x0000819a" + "OVTK_StimulationId_Label_9B", "0x0000819b" + "OVTK_StimulationId_Label_9C", "0x0000819c" + "OVTK_StimulationId_Label_9D", "0x0000819d" + "OVTK_StimulationId_Label_9E", "0x0000819e" + "OVTK_StimulationId_Label_9F", "0x0000819f" + "OVTK_StimulationId_Label_A0", "0x000081a0" + "OVTK_StimulationId_Label_A1", "0x000081a1" + "OVTK_StimulationId_Label_A2", "0x000081a2" + "OVTK_StimulationId_Label_A3", "0x000081a3" + "OVTK_StimulationId_Label_A4", "0x000081a4" + "OVTK_StimulationId_Label_A5", "0x000081a5" + "OVTK_StimulationId_Label_A6", "0x000081a6" + "OVTK_StimulationId_Label_A7", "0x000081a7" + "OVTK_StimulationId_Label_A8", "0x000081a8" + "OVTK_StimulationId_Label_A9", "0x000081a9" + "OVTK_StimulationId_Label_AA", "0x000081aa" + "OVTK_StimulationId_Label_AB", "0x000081ab" + "OVTK_StimulationId_Label_AC", "0x000081ac" + "OVTK_StimulationId_Label_AD", "0x000081ad" + "OVTK_StimulationId_Label_AE", "0x000081ae" + "OVTK_StimulationId_Label_AF", "0x000081af" + "OVTK_StimulationId_Label_B0", "0x000081b0" + "OVTK_StimulationId_Label_B1", "0x000081b1" + "OVTK_StimulationId_Label_B2", "0x000081b2" + "OVTK_StimulationId_Label_B3", "0x000081b3" + "OVTK_StimulationId_Label_B4", "0x000081b4" + "OVTK_StimulationId_Label_B5", "0x000081b5" + "OVTK_StimulationId_Label_B6", "0x000081b6" + "OVTK_StimulationId_Label_B7", "0x000081b7" + "OVTK_StimulationId_Label_B8", "0x000081b8" + "OVTK_StimulationId_Label_B9", "0x000081b9" + "OVTK_StimulationId_Label_BA", "0x000081ba" + "OVTK_StimulationId_Label_BB", "0x000081bb" + "OVTK_StimulationId_Label_BC", "0x000081bc" + "OVTK_StimulationId_Label_BD", "0x000081bd" + "OVTK_StimulationId_Label_BE", "0x000081be" + "OVTK_StimulationId_Label_BF", "0x000081bf" + "OVTK_StimulationId_Label_C0", "0x000081c0" + "OVTK_StimulationId_Label_C1", "0x000081c1" + "OVTK_StimulationId_Label_C2", "0x000081c2" + "OVTK_StimulationId_Label_C3", "0x000081c3" + "OVTK_StimulationId_Label_C4", "0x000081c4" + "OVTK_StimulationId_Label_C5", "0x000081c5" + "OVTK_StimulationId_Label_C6", "0x000081c6" + "OVTK_StimulationId_Label_C7", "0x000081c7" + "OVTK_StimulationId_Label_C8", "0x000081c8" + "OVTK_StimulationId_Label_C9", "0x000081c9" + "OVTK_StimulationId_Label_CA", "0x000081ca" + "OVTK_StimulationId_Label_CB", "0x000081cb" + "OVTK_StimulationId_Label_CC", "0x000081cc" + "OVTK_StimulationId_Label_CD", "0x000081cd" + "OVTK_StimulationId_Label_CE", "0x000081ce" + "OVTK_StimulationId_Label_CF", "0x000081cf" + "OVTK_StimulationId_Label_D0", "0x000081d0" + "OVTK_StimulationId_Label_D1", "0x000081d1" + "OVTK_StimulationId_Label_D2", "0x000081d2" + "OVTK_StimulationId_Label_D3", "0x000081d3" + "OVTK_StimulationId_Label_D4", "0x000081d4" + "OVTK_StimulationId_Label_D5", "0x000081d5" + "OVTK_StimulationId_Label_D6", "0x000081d6" + "OVTK_StimulationId_Label_D7", "0x000081d7" + "OVTK_StimulationId_Label_D8", "0x000081d8" + "OVTK_StimulationId_Label_D9", "0x000081d9" + "OVTK_StimulationId_Label_DA", "0x000081da" + "OVTK_StimulationId_Label_DB", "0x000081db" + "OVTK_StimulationId_Label_DC", "0x000081dc" + "OVTK_StimulationId_Label_DD", "0x000081dd" + "OVTK_StimulationId_Label_DE", "0x000081de" + "OVTK_StimulationId_Label_DF", "0x000081df" + "OVTK_StimulationId_Label_E0", "0x000081e0" + "OVTK_StimulationId_Label_E1", "0x000081e1" + "OVTK_StimulationId_Label_E2", "0x000081e2" + "OVTK_StimulationId_Label_E3", "0x000081e3" + "OVTK_StimulationId_Label_E4", "0x000081e4" + "OVTK_StimulationId_Label_E5", "0x000081e5" + "OVTK_StimulationId_Label_E6", "0x000081e6" + "OVTK_StimulationId_Label_E7", "0x000081e7" + "OVTK_StimulationId_Label_E8", "0x000081e8" + "OVTK_StimulationId_Label_E9", "0x000081e9" + "OVTK_StimulationId_Label_EA", "0x000081ea" + "OVTK_StimulationId_Label_EB", "0x000081eb" + "OVTK_StimulationId_Label_EC", "0x000081ec" + "OVTK_StimulationId_Label_ED", "0x000081ed" + "OVTK_StimulationId_Label_EE", "0x000081ee" + "OVTK_StimulationId_Label_EF", "0x000081ef" + "OVTK_StimulationId_Label_F0", "0x000081f0" + "OVTK_StimulationId_Label_F1", "0x000081f1" + "OVTK_StimulationId_Label_F2", "0x000081f2" + "OVTK_StimulationId_Label_F3", "0x000081f3" + "OVTK_StimulationId_Label_F4", "0x000081f4" + "OVTK_StimulationId_Label_F5", "0x000081f5" + "OVTK_StimulationId_Label_F6", "0x000081f6" + "OVTK_StimulationId_Label_F7", "0x000081f7" + "OVTK_StimulationId_Label_F8", "0x000081f8" + "OVTK_StimulationId_Label_F9", "0x000081f9" + "OVTK_StimulationId_Label_FA", "0x000081fa" + "OVTK_StimulationId_Label_FB", "0x000081fb" + "OVTK_StimulationId_Label_FC", "0x000081fc" + "OVTK_StimulationId_Label_FD", "0x000081fd" + "OVTK_StimulationId_Label_FE", "0x000081fe" + "OVTK_StimulationId_Label_FF", "0x000081ff" + "OVTK_StimulationId_Number_00", "0x00000000" + "OVTK_StimulationId_Number_01", "0x00000001" + "OVTK_StimulationId_Number_02", "0x00000002" + "OVTK_StimulationId_Number_03", "0x00000003" + "OVTK_StimulationId_Number_04", "0x00000004" + "OVTK_StimulationId_Number_05", "0x00000005" + "OVTK_StimulationId_Number_06", "0x00000006" + "OVTK_StimulationId_Number_07", "0x00000007" + "OVTK_StimulationId_Number_08", "0x00000008" + "OVTK_StimulationId_Number_09", "0x00000009" + "OVTK_StimulationId_Number_0A", "0x0000000a" + "OVTK_StimulationId_Number_0B", "0x0000000b" + "OVTK_StimulationId_Number_0C", "0x0000000c" + "OVTK_StimulationId_Number_0D", "0x0000000d" + "OVTK_StimulationId_Number_0E", "0x0000000e" + "OVTK_StimulationId_Number_0F", "0x0000000f" + "OVTK_StimulationId_Number_10", "0x00000010" + "OVTK_StimulationId_Number_11", "0x00000011" + "OVTK_StimulationId_Number_12", "0x00000012" + "OVTK_StimulationId_Number_13", "0x00000013" + "OVTK_StimulationId_Number_14", "0x00000014" + "OVTK_StimulationId_Number_15", "0x00000015" + "OVTK_StimulationId_Number_16", "0x00000016" + "OVTK_StimulationId_Number_17", "0x00000017" + "OVTK_StimulationId_Number_18", "0x00000018" + "OVTK_StimulationId_Number_19", "0x00000019" + "OVTK_StimulationId_Number_1A", "0x0000001a" + "OVTK_StimulationId_Number_1B", "0x0000001b" + "OVTK_StimulationId_Number_1C", "0x0000001c" + "OVTK_StimulationId_Number_1D", "0x0000001d" + "OVTK_StimulationId_Number_1E", "0x0000001e" + "OVTK_StimulationId_Number_1F", "0x0000001f" + "OVTK_StimulationId_Train", "0x00008201" + "OVTK_StimulationId_Beep", "0x00008202" + "OVTK_StimulationId_DoubleBeep", "0x00008203" + "OVTK_StimulationId_EndOfFile", "0x00008204" + "OVTK_StimulationId_Target", "0x00008205" + "OVTK_StimulationId_NonTarget", "0x00008206" + "OVTK_StimulationId_TrainCompleted", "0x00008207" + "OVTK_StimulationId_Reset", "0x00008208" + "OVTK_StimulationId_ThresholdPassed_Positive", "0x00008209" + "OVTK_StimulationId_ThresholdPassed_Negative", "0x00008210" + "OVTK_StimulationId_NoArtifact", "0x00008301" + "OVTK_StimulationId_Artifact", "0x00008302" + "OVTK_StimulationId_RemovedSamples", "0x00008310" + "OVTK_StimulationId_AddedSamplesBegin", "0x00008311" + "OVTK_StimulationId_AddedSamplesEnd", "0x00008312" + "OVTK_GDF_Artifact_EOG_Large", "0x101" + "OVTK_GDF_Artifact_ECG", "0x102" + "OVTK_GDF_Artifact_EMG", "0x103" + "OVTK_GDF_Artifact_Movement", "0x104" + "OVTK_GDF_Artifact_Failing_Electrode0x00008004", "0x105" + "OVTK_GDF_Artifact_Sweat", "0x106" + "OVTK_GDF_Artifact_50_60_Hz_Interference", "0x107" + "OVTK_GDF_Artifact_Breathing", "0x108" + "OVTK_GDF_Artifact_Pulse", "0x109" + "OVTK_GDF_Artifact_EOG_Small", "0x10A" + "OVTK_GDF_Calibration", "0x10F" + "OVTK_GDF_EEG_Sleep_Splindles", "0x111" + "OVTK_GDF_EEG_K_Complexes", "0x112" + "OVTK_GDF_EEG_Saw_Tooth_Waves", "0x113" + "OVTK_GDF_EEG_Idling_EEG_Eyes_Open", "0x114" + "OVTK_GDF_EEG_Idling_EEG_Eyes_Closed", "0x115" + "OVTK_GDF_EEG_Spike", "0x116" + "OVTK_GDF_EEG_Seizure", "0x117" + "OVTK_GDF_VEP", "0x121" + "OVTK_GDF_AEP", "0x122" + "OVTK_GDF_SEP", "0x123" + "OVTK_GDF_TMS", "0x12F" + "OVTK_GDF_SSVEP", "0x131" + "OVTK_GDF_SSAEP", "0x132" + "OVTK_GDF_SSSEP", "0x133" + "OVTK_GDF_Start_Of_Trial", "0x300" + "OVTK_GDF_Left", "0x301" + "OVTK_GDF_Right", "0x302" + "OVTK_GDF_Foot", "0x303" + "OVTK_GDF_Tongue", "0x304" + "OVTK_GDF_class5", "0x305" + "OVTK_GDF_Down", "0x306" + "OVTK_GDF_class7", "0x307" + "OVTK_GDF_class8", "0x308" + "OVTK_GDF_class9", "0x309" + "OVTK_GDF_class10", "0x30A" + "OVTK_GDF_class11", "0x30B" + "OVTK_GDF_Up", "0x30C" + "OVTK_GDF_Feedback_Continuous", "0x30D" + "OVTK_GDF_Feedback_Discrete", "0x30E" + "OVTK_GDF_Cue_Unknown_Undefined", "0x30F" + "OVTK_GDF_Beep", "0x311" + "OVTK_GDF_Cross_On_Screen", "0x312" + "OVTK_GDF_Flashing_Light", "0x313" + "OVTK_GDF_End_Of_Trial", "0x320" + "OVTK_GDF_Correct", "0x381" + "OVTK_GDF_Incorrect", "0x382" + "OVTK_GDF_End_Of_Session", "0x3F2" + "OVTK_GDF_Rejection", "0x3FF" + "OVTK_GDF_OAHE", "0x401" + "OVTK_GDF_RERA", "0x402" + "OVTK_GDF_CAHE", "0x403" + "OVTK_GDF_CSB", "0x404" + "OVTK_GDF_Sleep_Hypoventilation", "0x405" + "OVTK_GDF_Maximum_Inspiration", "0x40E" + "OVTK_GDF_Start_Of_Inspiration", "0x40F" + "OVTK_GDF_Wake", "0x410" + "OVTK_GDF_Stage_1", "0x411" + "OVTK_GDF_Stage_2", "0x412" + "OVTK_GDF_Stage_3", "0x413" + "OVTK_GDF_Stage_4", "0x414" + "OVTK_GDF_REM", "0x415" + "OVTK_GDF_Lights_On", "0x420" + "OVTK_GDF_Lights_Off", "0x8420" + "OVTK_GDF_Eyes_Left", "0x431" + "OVTK_GDF_Eyes_Right", "0x432" + "OVTK_GDF_Eyes_Up", "0x433" + "OVTK_GDF_Eyes_Down", "0x434" + "OVTK_GDF_Horizontal_Eye_Movement", "0x435" + "OVTK_GDF_Vertical_Eye_Movement", "0x436" + "OVTK_GDF_Rotation_Clockwise", "0x437" + "OVTK_GDF_Rotation_Counterclockwise", "0x438" + "OVTK_GDF_Eye_Blink", "0x439" + "OVTK_GDF_Left_Hand_Movement", "0x441" + "OVTK_GDF_Right_Hand_Movement", "0x442" + "OVTK_GDF_Head_Movement", "0x443" + "OVTK_GDF_Tongue_Movement", "0x444" + "OVTK_GDF_Swallowing", "0x445" + "OVTK_GDF_Biting", "0x446" + "OVTK_GDF_Foot_Movement", "0x447" + "OVTK_GDF_Foot_Right_Movement", "0x448" + "OVTK_GDF_Arm_Movement", "0x449" + "OVTK_GDF_Arm_Right_Movement", "0x44A" + "OVTK_GDF_ECG_Fiducial_Point_QRS_Complex", "0x501" + "OVTK_GDF_ECG_P_Wave", "0x502" + "OVTK_GDF_ECG_QRS_Complex", "0x503" + "OVTK_GDF_ECG_R_Point", "0x504" + "OVTK_GDF_ECG_T_Wave", "0x506" + "OVTK_GDF_ECG_U_Wave", "0x507" + "OVTK_GDF_Start", "0x580" + "OVTK_GDF_25_Watt", "0x581" + "OVTK_GDF_50_Watt", "0x582" + "OVTK_GDF_75_Watt", "0x583" + "OVTK_GDF_100_Watt", "0x584" + "OVTK_GDF_125_Watt", "0x585" + "OVTK_GDF_150_Watt", "0x586" + "OVTK_GDF_175_Watt", "0x587" + "OVTK_GDF_200_Watt", "0x588" + "OVTK_GDF_225_Watt", "0x589" + "OVTK_GDF_250_Watt", "0x58A" + "OVTK_GDF_275_Watt", "0x58B" + "OVTK_GDF_300_Watt", "0x58C" + "OVTK_GDF_325_Watt", "0x58D" + "OVTK_GDF_350_Watt", "0x58E" + "OVTK_GDF_Start_Of_New_Segment", "0x7FFE" + "OVTK_GDF_Non_Equidistant_Sampling_Value", "0x7FFF" + + diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/stream-structures.rst b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/stream-structures.rst new file mode 100644 index 0000000..c72f073 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/data-formats/stream-structures.rst @@ -0,0 +1,652 @@ +.. |clearfloat| raw:: html + +
+ +Stream Structures +================= + +Introduction +------------ + +All the streams are defined using EBML (Extensible Binary Meta-Language). They are all structured in 3 sections: + +HEADER + this part is the first ever sent and received on the stream, when the user presses "play" in a scenario. It usually contains the stream description used by the boxes and algorithms to initialize everything properly (e.g. size of an internal buffer) + +BUFFERS + the number of buffers that may then transit through the stream is unlimited. Buffers contain the payload, e.g. the current signal matrix. + +END + this last part is received once, when the user presses "stop" in a scenario. This mechanism is not concretely used in existing boxes, however everything is implemented to handle it. + +Hierarchy +--------- + +The stream hierarchy is displayed on figure below. Every lower stream also +contains the information specific to the upper stream. The color of the +corresponding input and output in the Designer are also displayed. + +.. figure:: images/streams.png + :alt: The OpenViBE stream hierarchy + + The OpenViBE stream hierarchy + +As you can see every stream is an **EBML stream**. Then the EBML container is +specialized in 3 streams : **experiment information**, **stimulations** or +**streamed matrix***. + +The **Streamed Matrix** stream can be used as is, or as one of its 4 derived +streams : **channel localisation**, **channel units**, **feature vector**, +**signal** or **spectrum**. + +:: + + #define OVTK_TypeId_EBMLStream OpenViBE::CIdentifier(0x434F6587, 0x2EFD2B7E) + #define OVTK_TypeId_ExperimentInfo OpenViBE::CIdentifier(0x403488E7, 0x565D70B6) + #define OVTK_TypeId_Stimulations OpenViBE::CIdentifier(0x6F752DD0, 0x082A321E) + #define OVTK_TypeId_StreamedMatrix OpenViBE::CIdentifier(0x544A003E, 0x6DCBA5F6) + #define OVTK_TypeId_FeatureVector OpenViBE::CIdentifier(0x17341935, 0x152FF448) + #define OVTK_TypeId_Signal OpenViBE::CIdentifier(0x5BA36127, 0x195FEAE1) + #define OVTK_TypeId_Spectrum OpenViBE::CIdentifier(0x1F261C0A, 0x593BF6BD) + #define OVTK_TypeId_ChannelLocalisation OpenViBE::CIdentifier(0x1E4C0D6E, 0x5204EEB2) + #define OVTK_TypeId_ChannelUnits OpenViBE::CIdentifier(0x5E330216, 0x2C09724C) + + +The following sections will describe each stream type. + +.. _Doc_Streams_EBML: + +Standard EBML stream +~~~~~~~~~~~~~~~~~~~~ + +.. image:: images/ebml-stream-card.png + :align: left + +EBML stream description (November 6th 2006, version 1). + +From any standard EBML stream header, you can retrieve the stream type identifier, and the stream version. + +|clearfloat| + +EBML description & identifiers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:: + + * STREAM STRUCTURE + * ---------------- + * OVTK_NodeId_Header + * OVTK_NodeId_Header_StreamType (integer:) + * OVTK_NodeId_Header_StreamVersion (integer:) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer + * ... + * OVTK_NodeId_End + * + +:: + + * NODE IDENTIFIERS + * ---------------- + #define OVTK_NodeId_Header EBML::CIdentifier(0x002B395F, 0x108ADFAE) + #define OVTK_NodeId_Header_StreamType EBML::CIdentifier(0x00CDD0F7, 0x46B0278D) + #define OVTK_NodeId_Header_StreamVersion EBML::CIdentifier(0x006F5A08, 0x7796EBC5) + #define OVTK_NodeId_Buffer EBML::CIdentifier(0x00CF2101, 0x02375310) + #define OVTK_NodeId_End EBML::CIdentifier(0x00D9DDC3, 0x0B12873A) + +.. _Doc_Streams_StreamedMatrix: + +Streamed matrix stream +~~~~~~~~~~~~~~~~~~~~~~ + +.. image:: images/sm-stream-card.png + :align: left + +Streamed matrix stream description (November 6th 2006, version 1). + +The streamed matrix stream is an EBML Stream that also contains a matrix +descriptor in the header, and a **matrix of double precision floating values** +in its buffers. The matrix descriptor gives the **dimension count**, **size** +of each dimension, and **labels** of each dimension. + +|clearfloat| + +EBML description & identifiers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:: + + * STREAM STRUCTURE + * ---------------- + * OVTK_NodeId_Header + * OVTK_NodeId_Header_StreamType (integer:) + * OVTK_NodeId_Header_StreamVersion (integer:) + * OVTK_NodeId_Header_StreamedMatrix + * OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:) + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:) + * ... + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * ... + * OVTK_NodeId_End + * + +:: + + * NODE IDENTIFIERS + * ---------------- + #define OVTK_NodeId_Header_StreamedMatrix EBML::CIdentifier(0x0072F560, 0x7ED2CBED) + #define OVTK_NodeId_Header_StreamedMatrix_DimensionCount EBML::CIdentifier(0x003FEBD4, 0x2725D428) + #define OVTK_NodeId_Header_StreamedMatrix_Dimension EBML::CIdentifier(0x0000E3C0, 0x3A7D5141) + #define OVTK_NodeId_Header_StreamedMatrix_Dimension_Size EBML::CIdentifier(0x001302F7, 0x36D8438A) + #define OVTK_NodeId_Header_StreamedMatrix_Dimension_Label EBML::CIdentifier(0x00153E40, 0x190227E0) + #define OVTK_NodeId_Buffer_StreamedMatrix EBML::CIdentifier(0x00120663, 0x08FBC165) + #define OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer EBML::CIdentifier(0x00B18C10, 0x427D098C) + +.. _Doc_Streams_ChannelLocalization: + +Channel localization stream +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +.. image:: images/chanloc-stream-card.png + :align: left + + +Channel localisation description (nov 04th 2008, version 1) + +The channel localisation stream is a stream matrix stream with some +constraints: + +- 2 dimensions : **channels** and **positions** + +- First dimension has variable size (channel count) + +- Second dimension has a size of 3 : the normalized cartesian coordinates in + the following frame of reference : X right, Y front and Z up. + +Its header also exposes a boolean value : **Dynamic**. If false the coordinates +are assumed to be static, thus sent once and for all (e.g. with an EEG system). +If Dynamic is set, the coordinates of the sensors may change over time, thus +several buffer can be received over time. + +|clearfloat| + +EBML description & identifiers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:: + + * STREAM STRUCTURE + * ---------------- + * OVTK_NodeId_Header + * OVTK_NodeId_Header_StreamType (integer:) + * OVTK_NodeId_Header_StreamVersion (integer:2) + * OVTK_NodeId_Header_ChannelLocalisation + * OVTK_NodeId_Header_ChannelLocalisation_Dynamic (boolean) + * OVTK_NodeId_Header_StreamedMatrix + * OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:2) + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:channel count) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 1 name) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 2 name) + * ... + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:3) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:x) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:y) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:z) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * ... + * OVTK_NodeId_End + * + +:: + + * NODE IDENTIFIERS + * ---------------- + #define OVTK_NodeId_Header_ChannelLocalisation EBML::CIdentifier(0xF2CFE60B, 0xEFD63E3B) + #define OVTK_NodeId_Header_ChannelLocalisation_Dynamic EBML::CIdentifier(0x5338AF5C, 0x07C469C3) + +.. _Doc_Streams_ChannelUnits: + +Channel units stream +~~~~~~~~~~~~~~~~~~~~ + +Channel units description (mar 30th 2015, version 1). + +The channel units stream is a streamed matrix stream intended to carry channel +measurement unit information from the drivers to Designer (e.g. ‘channel 1 is +in microvolts’). The stream has some constraints: + +- 2 dimensions : **channels** and their **properties** + +- First dimension has variable size (channel count) + +- Second dimension has a size of 2 : the unit and the scaling factor. Although + the stream contents can be handled as a matrix, the unit codes and scaling + factors supported and understood by OpenViBE are limited to a specific set. + The list is in in ``toolkit/include/ovtk_defines.h``. + +Its header also exposes a boolean value : **Dynamic**. If false the units are assumed to be static, thus sent once and for all (e.g. with an EEG system). If Dynamic is set, the units may change over time, thus several buffer can be received over time. However, no component in 1.0.0 supports the dynamic units. + +EBML description & identifiers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:: + + * STREAM STRUCTURE + * ---------------- + * OVTK_NodeId_Header + * OVTK_NodeId_Header_StreamType (integer:) + * OVTK_NodeId_Header_StreamVersion (integer:2) + * OVTK_NodeId_Header_ChannelUnits + * OVTK_NodeId_Header_ChannelUnits_Dynamic (boolean) + * OVTK_NodeId_Header_StreamedMatrix + * OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:2) + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:channel count) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 1 name) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 2 name) + * ... + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:2) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:unit) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:factor) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * ... + * OVTK_NodeId_End + * + +:: + + * NODE IDENTIFIERS + * ---------------- + #define OVTK_NodeId_Header EBML::CIdentifier(0x002B395F, 0x108ADFAE) + #define OVTK_NodeId_Header_StreamType EBML::CIdentifier(0x00CDD0F7, 0x46B0278D) + #define OVTK_NodeId_Header_StreamVersion EBML::CIdentifier(0x006F5A08, 0x7796EBC5) + #define OVTK_NodeId_Buffer EBML::CIdentifier(0x00CF2101, 0x02375310) + #define OVTK_NodeId_End EBML::CIdentifier(0x00D9DDC3, 0x0B12873A) + +.. _Doc_Streams_FeatureVector: + +Feature vector stream +~~~~~~~~~~~~~~~~~~~~~ + + +.. image:: images/fvec-stream-card.png + :align: left + +Feature vector stream description (may 24th 2007, version 1). + +The feature vector stream is a stream matrix stream with some constraints: + +- 1 dimension : the **features** + +- Number of features may vary, but remains the same for one stream life time. + + +EBML description & identifiers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:: + + * STREAM STRUCTURE + * ---------------- + * OVTK_NodeId_Header + * OVTK_NodeId_Header_StreamType (integer:) + * OVTK_NodeId_Header_StreamVersion (integer:) + * OVTK_NodeId_Header_StreamedMatrix + * OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:1) + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:feature count) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:feature 1 name) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:feature 2 name) + * ... + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * ... + * OVTK_NodeId_End + * + +.. _Doc_Streams_Spectrum: + +Spectrum stream +~~~~~~~~~~~~~~~ + +.. image:: images/spec-stream-card.png + :align: left + +Spectrum stream description (jan. 2017, version 2). + +The spectrum stream is a stream matrix stream with some constraints: + +- 2 dimensions : **channels** and **number of frequency values** +- First dimension has variable size (channel count) +- Second dimension has variable size (number of frequency values) + +Its header also expose the sampling rate of the signal and the list of frequency values used. + +|clearfloat| + + +EBML description & identifiers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:: + + * STREAM STRUCTURE + * ---------------- + * OVTK_NodeId_Header + * OVTK_NodeId_Header_StreamType (integer:) + * OVTK_NodeId_Header_StreamVersion (integer:) + * OVTK_NodeId_Header_StreamedMatrix + * OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:2) + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:channel count) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 1 name) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 2 name) + * ... + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:number of frequency band) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:frequency band 1 name) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:frequency band 2 name) + * ... + * OVTK_NodeId_Header_Spectrum + * OVTK_NodeId_Header_Spectrum_Sampling + * OVTK_NodeId_Header_Spectrum_FrequencyAbscissa (double) + * OVTK_NodeId_Header_Spectrum_FrequencyAbscissa (double) + * OVTK_NodeId_Header_Spectrum_FrequencyAbscissa (double) + * ... + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * ... + * OVTK_NodeId_End + * + +:: + + * NODE IDENTIFIERS + * ---------------- + #define OVTK_NodeId_Header_Spectrum EBML::CIdentifier(0x00CCFA4B, 0x14F37D4D) + #define OVTK_NodeId_Header_Spectrum_FrequencyBand_Deprecated EBML::CIdentifier(0x0010983C, 0x21F8BDE5) + #define OVTK_NodeId_Header_Spectrum_FrequencyBand_Start_Deprecated EBML::CIdentifier(0x00AA5654, 0x2403A2CB) + #define OVTK_NodeId_Header_Spectrum_FrequencyBand_Stop_Deprecated EBML::CIdentifier(0x00A44C82, 0x05BE50D5) + #define OVTK_NodeId_Header_Spectrum_FrequencyAbscissa EBML::CIdentifier(0x00D7287D, 0x622A2BF5) + #define OVTK_NodeId_Header_Spectrum_Sampling EBML::CIdentifier(0x006876E9, 0x1DCB0CA1) + +.. _Doc_Streams_Signal: + +Signal stream +~~~~~~~~~~~~~ + + +.. image:: images/signal-stream-card.png + :align: left + +Signal stream description (may 24th 2007, version 2). + +The signal stream is a stream matrix stream with some constraints: + +- 2 dimensions : **channels** and **samples** + +- First dimension has variable size (channel count) + +- Second dimension has a size corresponding to the **sample count per buffer**. + +Its header also expose an integer value : the **Sampling Frequency**. Sampling +frequency and sample count per buffer depends on the data producer (file reader +or acquisition client). + +|clearfloat| + +EBML description & identifiers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:: + + * STREAM STRUCTURE + * ---------------- + * OVTK_NodeId_Header + * OVTK_NodeId_Header_StreamType (integer:) + * OVTK_NodeId_Header_StreamVersion (integer:) + * OVTK_NodeId_Header_Signal + * OVTK_NodeId_Header_Signal_Sampling (integer) + * OVTK_NodeId_Header_StreamedMatrix + * OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:2) + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:channel count) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 1 name) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 2 name) + * ... + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:number of samples per buffer) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string) + * ... + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * ... + * OVTK_NodeId_End + * + +:: + + * NODE IDENTIFIERS + * ---------------- + #define OVTK_NodeId_Header_Signal EBML::CIdentifier(0x007855DE, 0x3748D375) + #define OVTK_NodeId_Header_Signal_Sampling EBML::CIdentifier(0x00141C43, 0x0C37006B) + +.. _Doc_Streams_Stimulation: + +Stimulation stream +~~~~~~~~~~~~~~~~~~ + +.. image:: images/stim-stream-card.png + :align: left + + +Stimulation stream description (may 24th 2007, version 3). + +The stimulation stream is an EBML stream which buffers contains stimulation +sets. Each stimulation has 3 attributes: + +- **Stimulation Date**: a 64bit unsigned integer in 32:32 precision (first 32 + bits for the seconds, last 32 bits for the divisions) + +- **Stimulation Identifier** as listed in the documentation page. + +- **Stimulation Duration**: same encoding as stimulation date. In practice, the + duration is never used by boxes, thus the value is most of the time 0. + +|clearfloat| + + +EBML description & identifiers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:: + + * STREAM STRUCTURE + * ---------------- + * OVTK_NodeId_Header + * OVTK_NodeId_Header_StreamType (integer:) + * OVTK_NodeId_Header_StreamVersion (integer:) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_Stimulation + * OVTK_NodeId_Buffer_Stimulation_NumberOfStimulations (integer) + * OVTK_NodeId_Buffer_Stimulation_Stimulation + * OVTK_NodeId_Buffer_Stimulation_Stimulation_ID (integer) + * OVTK_NodeId_Buffer_Stimulation_Stimulation_Date (integer) + * OVTK_NodeId_Buffer_Stimulation_Stimulation_Duration (integer) + * OVTK_NodeId_Stimulation_Stimulation + * ... + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer + * ... + * OVTK_NodeId_End + * + +:: + + * NODE IDENTIFIERS + * ---------------- + #define OVTK_NodeId_Buffer_Stimulation EBML::CIdentifier(0x006DEABE, 0x7FC05A20) + #define OVTK_NodeId_Buffer_Stimulation_NumberOfStimulations EBML::CIdentifier(0x00BB790B, 0x2B8574D8) + #define OVTK_NodeId_Buffer_Stimulation_Stimulation EBML::CIdentifier(0x0016EAC6, 0x29FBCAA1) + #define OVTK_NodeId_Buffer_Stimulation_Stimulation_ID EBML::CIdentifier(0x006FA5DB, 0x4BAC31E9) + #define OVTK_NodeId_Buffer_Stimulation_Stimulation_Date EBML::CIdentifier(0x00B866D8, 0x14DA5374) + #define OVTK_NodeId_Buffer_Stimulation_Stimulation_Duration EBML::CIdentifier(0x14EE055F, 0x87FBCC9C) + +.. _Doc_Streams_ExperimentInfo: + +Experimentation information stream +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. image:: images/xp-stream-card.png + :align: left + +Experimentation information stream description (november 6th 2006, version 1). + +The experiment information stream is an EBML stream that provides in its header +some information about the experiment being conducted. These information are +entered for example in the acquisition server, when configuring the driver +before starting the acquisition. You can find: + +- **Experiment description**: identifier and date. + +- **Subject description**: identifier, name, age and gender. + +- **Context**: laboratory identifier and name, technician identifier and name. + +|clearfloat| + +EBML description & identifiers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:: + + * STREAM STRUCTURE + * ---------------- + * OVTK_NodeId_Header + * OVTK_NodeId_Header_StreamType (integer:) + * OVTK_NodeId_Header_StreamVersion (integer:) + * OVTK_NodeId_Header_ExperimentInfo + * OVTK_NodeId_Header_ExperimentInfo_Experiment + * OVTK_NodeId_Header_ExperimentInfo_Experiment_ID (integer) + * OVTK_NodeId_Header_ExperimentInfo_Experiment_Date (date) + * OVTK_NodeId_Header_ExperimentInfo_Subject + * OVTK_NodeId_Header_ExperimentInfo_Subject_ID (integer) + * OVTK_NodeId_Header_ExperimentInfo_Subject_Name (string) + * OVTK_NodeId_Header_ExperimentInfo_Subject_Age (integer) + * OVTK_NodeId_Header_ExperimentInfo_Subject_Gender (integer) + * OVTK_NodeId_Header_ExperimentInfo_Context + * OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryID (integer) + * OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryName (string) + * OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianID (integer) + * OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianName (string) + * OVTK_NodeId_End + * + +:: + + * NODE IDENTIFIERS + * ---------------- + #define OVTK_NodeId_Header_ExperimentInfo EBML::CIdentifier(0x00746BA0, 0x115AE04D) + #define OVTK_NodeId_Header_ExperimentInfo_Experiment EBML::CIdentifier(0x0011D6B7, 0x48F1AA39) + #define OVTK_NodeId_Header_ExperimentInfo_Experiment_ID EBML::CIdentifier(0x006ACD74, 0x1C960C26) + #define OVTK_NodeId_Header_ExperimentInfo_Experiment_Date EBML::CIdentifier(0x002F8FB7, 0x6DA7552D) + #define OVTK_NodeId_Header_ExperimentInfo_Subject EBML::CIdentifier(0x003EC620, 0x333E0A94) + #define OVTK_NodeId_Header_ExperimentInfo_Subject_ID EBML::CIdentifier(0x00D62974, 0x473D4AA5) + #define OVTK_NodeId_Header_ExperimentInfo_Subject_Name EBML::CIdentifier(0x0041FD0A, 0x6BCD9A99) + #define OVTK_NodeId_Header_ExperimentInfo_Subject_Age EBML::CIdentifier(0x00DF7DD9, 0x33336C51) + /* for retro compat */ + #define OVTK_NodeId_Header_ExperimentInfo_Subject_Sex EBML::CIdentifier(0x0069BB84, 0x3FC8E149) + #define OVTK_NodeId_Header_ExperimentInfo_Subject_Gender EBML::CIdentifier(0x0069BB84, 0x3FC8E149) + #define OVTK_NodeId_Header_ExperimentInfo_Context EBML::CIdentifier(0x0018C291, 0x7985DFDD) + #define OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryID EBML::CIdentifier(0x003F11B9, 0x26D76D9C) + #define OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryName EBML::CIdentifier(0x00EB1F23, 0x51C23B83) + #define OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianID EBML::CIdentifier(0x00874A7F, 0x60DC34C2) + #define OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianName EBML::CIdentifier(0x00C8C393, 0x31CE5B3E) + +Acquisition stream +~~~~~~~~~~~~~~~~~~ + +.. image:: images/acquisition-stream-small.png + :align: left + +Acquisition stream description (nov 2014, version 3). This is a multiplexed +stream. + +The acquisition stream encapsulates 5 streams : experiment information, channel +localisation, channel units, signal and stimulation. + +This stream is produced by the Acquisition Server and is sent to every client +connected via tcp/ip network connection. The stream is received by the +Acquisition Client box, that separates each streams and makes them available on +5 corresponding outputs. + +|clearfloat| + +EBML description & identifiers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:: + + * STREAM STRUCTURE + * ---------------- + * OVTK_NodeId_Header + * OVTK_NodeId_Acquisition_Header_ExperimentInfo + * ... some experiment information stream header + * OVTK_NodeId_Acquisition_Header_Signal + * ... some signal stream header + * OVTK_NodeId_Acquisition_Header_Stimulation + * ... some stimulation stream header + * OVTK_NodeId_Acquisition_Header_ChannelLocalisation + * ... some channel localisation stream header + * OVTK_NodeId_Acquisition_Header_ChannelUnits + * ... some channel units stream header + * OVTK_NodeId_Buffer + * OVTK_NodeId_Acquisition_Buffer_ExperimentInfo + * ... some experiment information stream buffer + * OVTK_NodeId_Acquisition_Buffer_Signal + * ... some signal stream buffer + * OVTK_NodeId_Acquisition_Buffer_Stimulation + * ... some stimulation stream buffer + * OVTK_NodeId_Acquisition_Buffer_ChannelLocalisation + * ... some channel localisation stream buffer + * OVTK_NodeId_Acquisition_Buffer_ChannelUnits + * ... some channel units stream buffer + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer + * ... + * diff --git a/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/index.rst b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/index.rst new file mode 100644 index 0000000..a9360d4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/sphinx/source/index.rst @@ -0,0 +1,17 @@ +OpenViBE SDK Documentation +========================== + +Available Boxes +--------------- +.. toctree:: + :maxdepth: 1 + + boxes/index-boxes + +Data Formats Documentation +-------------------------- + +.. toctree:: + :maxdepth: 2 + + data-formats/index-data-formats diff --git a/Masterarbeit/openvibe/sdk-master/documentation/src/Doxyfile.in b/Masterarbeit/openvibe/sdk-master/documentation/src/Doxyfile.in new file mode 100644 index 0000000..d631be0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/src/Doxyfile.in @@ -0,0 +1,73 @@ +# Doxyfile 1.5.8 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +DOXYFILE_ENCODING = UTF-8 + +PROJECT_NAME = OpenViBE + +OUTPUT_DIRECTORY = @CMAKE_CURRENT_BINARY_DIR@ + +STRIP_FROM_PATH = @PROJECT_SOURCE_DIR@ \ + @PROJECT_BINARY_DIR@ + +SOURCE_BROWSER = NO +VERBATIM_HEADERS = NO +OPTIMIZE_OUTPUT_FOR_C = NO + +BUILTIN_STL_SUPPORT = NO + +QUIET = YES +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_LOGFILE = doxygen.log + +INPUT = @doxy_main_page@ \ + @PROJECT_SOURCE_DIR@ \ + @PROJECT_BINARY_DIR@ + +GENERATE_TODOLIST = NO +GENERATE_TESTLIST = NO +GENERATE_BUGLIST = NO + +INPUT_ENCODING = UTF-8 + +FILE_PATTERNS = *.h \ + *.dox + +RECURSIVE = YES + +EXCLUDE_PATTERNS = */doc/?ain?age.dox \ + */plugins/*/src/*.h \ + */dependencies-source/*.h \ + */dependencies/* + +#EXAMPLE_PATH = @ov_doxy_input@ + +IGNORE_PREFIX = I \ + C \ + T + +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html + +HTML_HEADER = @CMAKE_CURRENT_SOURCE_DIR@/src/header.html +HTML_FOOTER = @CMAKE_CURRENT_SOURCE_DIR@/src/footer.html + + +GENERATE_LATEX = NO diff --git a/Masterarbeit/openvibe/sdk-master/documentation/src/footer.html b/Masterarbeit/openvibe/sdk-master/documentation/src/footer.html new file mode 100644 index 0000000..511572e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/src/footer.html @@ -0,0 +1,38 @@ + + + + + diff --git a/Masterarbeit/openvibe/sdk-master/documentation/src/header.html b/Masterarbeit/openvibe/sdk-master/documentation/src/header.html new file mode 100644 index 0000000..5f671fc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/src/header.html @@ -0,0 +1,32 @@ + + + + + + + +Documentation: Main Page + + + + + + + + + + +
+
+ + + + + + +
+
Documentation +
+
+
+ \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/documentation/src/licence.dox b/Masterarbeit/openvibe/sdk-master/documentation/src/licence.dox new file mode 100644 index 0000000..8b39c73 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/src/licence.dox @@ -0,0 +1,513 @@ +/** + +\page Doc_Licence Licence + +\section Doc_Licence_Title GNU LESSER GENERAL PUBLIC LICENSE +\subsection Doc_Licence_Version Version 2.1, February 1999 + +\verbatim + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] +\endverbatim + +\subsection Doc_Licence_Preamble Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + +\subsection Doc_Licence_Terms GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + +\subsection Doc_Licence_Warranty NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +\subsection Doc_Licence_End END OF TERMS AND CONDITIONS + +\subsection Doc_Licence_How How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + +\verbatim + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +\endverbatim + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + +\verbatim + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice +\endverbatim + +That's all there is to it! + +*/ diff --git a/Masterarbeit/openvibe/sdk-master/documentation/src/openvibe-plugin-inspector.cmd b/Masterarbeit/openvibe/sdk-master/documentation/src/openvibe-plugin-inspector.cmd new file mode 100644 index 0000000..727983e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/src/openvibe-plugin-inspector.cmd @@ -0,0 +1,27 @@ +REM @ECHO OFF +SETLOCAL EnableExtensions + +REM Get the directory location of this script, assume it contains the OpenViBE dist tree. These variables will be used by OpenViBE executables. +SET "OV_SOURCE=%1" +SET "OV_BUILD=%2" +SHIFT +SHIFT + +SET "OV_PATH_BIN=%OV_BUILD%\openvibe\" +SET "OV_PATH_LIB=%OV_BUILD%\openvibe\;%OV_BUILD%\modules\ebml\;%OV_BUILD%\modules\system\;%OV_BUILD%\modules\fs\;%OV_BUILD%\modules\xml\;%OV_BUILD%\modules\socket\;%OV_BUILD%\modules\automaton\;%OV_BUILD%\toolkit\" +SET "OV_PATH_DATA=%OV_BUILD%\share\openvibe" + +SET PATH=%OV_PATH_LIB%;%PATH% + + +SET "OV_ENVIRONMENT_FILE=%OV_SOURCE%\scripts\win32-dependencies.cmd" +IF NOT EXIST "%OV_ENVIRONMENT_FILE%" ( + ECHO Error: "%OV_ENVIRONMENT_FILE%" was not found + GOTO EndOfScript +) +CALL "%OV_ENVIRONMENT_FILE%" +@ECHO ON + +"%OV_BUILD%\applications\developer-tools\plugin-inspector\openvibe-plugin-inspector.exe" %* + +:EndOfScript \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/documentation/src/openvibe.dox-base b/Masterarbeit/openvibe/sdk-master/documentation/src/openvibe.dox-base new file mode 100644 index 0000000..9fee61e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/documentation/src/openvibe.dox-base @@ -0,0 +1,41 @@ +/** + \mainpage Home + \section Doc_Preface Preface + + Welcome to the Doxygen Documentation for OpenViBE @PROJECT_VERSION@. + + This document has been automatically generated on Linux. Please note + + - The documentation lacks components and classes that are not compiled on Linux. + - Some source files do not have doxygen information and may not be represented here. + - Plugins such as boxes and drivers are not included in the class lists to better illustrate the core part of OpenViBE. + However, you can see the boxes on the Box Descriptions page. + + The tutorials and user manual, as well as build instructions for OpenViBE are located on the website : http://openvibe.inria.fr/documentation-index + + \section Doc_Boxes Box Descriptions + + This section contains the description of all of the Boxes available in the OpenViBE Designer. + + - \subpage Doc_BoxAlgorithms + + \subsection Doc_EBML Details on EBML + + OpenViBE uses EBML as a container for all data streams. If you would like to extend the formats of data OpenViBE can handle you might want to document yourself on EBML usage. + + - \subpage Doc_WhatIsEBML + - \subpage Doc_ParsingEBMLStreams + - \subpage Doc_FormatingEBMLStreams + + \subsection Doc_OngoingDocumentation Ongoing Documentation + - \subpage Doc_SoftwareArchitectureOverview (incomplete) + + */ + + + + + + + + diff --git a/Masterarbeit/openvibe/sdk-master/externals/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/externals/CMakeLists.txt new file mode 100644 index 0000000..737a4fb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/externals/CMakeLists.txt @@ -0,0 +1,4 @@ +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("EXTERNALS") + + diff --git a/Masterarbeit/openvibe/sdk-master/externals/README b/Masterarbeit/openvibe/sdk-master/externals/README new file mode 100644 index 0000000..de809f0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/externals/README @@ -0,0 +1,34 @@ + +|OVERVIEW| + + This directory can be used if you have external modules designed for OpenViBE + that you want to include within your OpenViBE build but not necessarily + contribute. Contributed components should go to contrib/. + +|LAYOUT| + + Each subdirectory of the externals directory will be candidate for building + in the build scripts. It must conform to the usual OpenViBE directory layout. + + For example you create an application "app" based on OpenViBE, and this application uses + a collection of plugins "app-plugs". You might then have the following layout : + + openvibe-externals/ + + my-app/ + + doc/ + + ... + + src/ + + CMakeLists.txt + + my-app-plugs/ + + doc/ + + ... + + src/ + + CMakeLists.txt + +|BUILDING| + + Running the usual build should include the folders in external/ + automatically. If it doesn't, please delete local-tmp/ and try again. + + + vim:tw=78:ts=8:ft=help:norl: diff --git a/Masterarbeit/openvibe/sdk-master/kernel/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/kernel/CMakeLists.txt new file mode 100755 index 0000000..687e5ba --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/CMakeLists.txt @@ -0,0 +1,82 @@ +PROJECT(openvibe-kernel) +OV_ADD_THIS_TO_PROJECT_LIST() + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl) +INCLUDE("FindSourceDependencyLepton") +INCLUDE("FindSourceRCProperties") +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${KERNEL_FOLDER} + COMPILE_FLAGS "-DOVK_Exports -DOVK_Shared") + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindOpenViBEModuleXML") +INCLUDE("FindThirdPartyBoost") + + +# --------------------------------- +# Finds standard library dl +# Adds library to target +# Adds include path +# --------------------------------- +IF(UNIX) + FIND_LIBRARY(LIB_STANDARD_MODULE_DL dl) + IF(LIB_STANDARD_MODULE_DL) + MESSAGE(STATUS " Found dl...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_DL}) + ELSE(LIB_STANDARD_MODULE_PTHREAD) + MESSAGE(STATUS " FAILED to find dl...") + ENDIF(LIB_STANDARD_MODULE_DL) +ENDIF(UNIX) + +# --------------------------------- +# Finds standard library pthread +# Adds library to target +# Adds include path +# --------------------------------- +IF(UNIX) + FIND_LIBRARY(LIB_STANDARD_MODULE_PTHREAD pthread) + IF(LIB_STANDARD_MODULE_PTHREAD) + MESSAGE(STATUS " Found pthread...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_PTHREAD}) + ELSE(LIB_STANDARD_MODULE_PTHREAD) + MESSAGE(STATUS " FAILED to find pthread...") + ENDIF(LIB_STANDARD_MODULE_PTHREAD) +ENDIF(UNIX) + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/kernel PATTERN "*-base" EXCLUDE) + +# ----------------------------- +# Install and configure .conf +# ----------------------------- + +# This construct is to fetch the documentation specific to this version. +# In addition, it tweaks the patch version to allow the "1.0.0+git" style version to +# fetch the "1.0.0" (base) version documentation as we don't have git version docs on the web. +STRING(REGEX REPLACE "[^0-9]" "" PROJECT_VERSION_PATCH_PRUNED ${PROJECT_VERSION_PATCH}) +SET(OV_PROJECT_BASE_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH_PRUNED}) diff --git a/Masterarbeit/openvibe/sdk-master/kernel/share/cone_ov.material b/Masterarbeit/openvibe/sdk-master/kernel/share/cone_ov.material new file mode 100644 index 0000000..d3b7cff --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/share/cone_ov.material @@ -0,0 +1,14 @@ +material cone_ov_material +{ + technique + { + pass + { + ambient 1 1 1 + diffuse 1 1 1 +// specular 0 0 0 10 +// emissive 0 0 0 + scene_blend alpha_blend + } + } +} diff --git a/Masterarbeit/openvibe/sdk-master/kernel/share/cone_ov.mesh b/Masterarbeit/openvibe/sdk-master/kernel/share/cone_ov.mesh new file mode 100644 index 0000000..6e335e6 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/kernel/share/cone_ov.mesh differ diff --git a/Masterarbeit/openvibe/sdk-master/kernel/share/openvibe-delayed.conf b/Masterarbeit/openvibe/sdk-master/kernel/share/openvibe-delayed.conf new file mode 100644 index 0000000..72209e9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/share/openvibe-delayed.conf @@ -0,0 +1,28 @@ +###################################################################################### +## OpenViBE delayed configuration file +## +## === This file is loaded later when a scenario execution starts === +## +## - The file consists of a list of "token name = token value" +## - Whatever space / tabulation at the begining or end of a line is removed +## - Comments start with # +## - Lines ending with \ continue on the next line (all ending \ are removed) +## - On Windows, use / in paths as \ is reserved +## - You can use ${token name} in a token value +## - You can use $Environment{env name} in a token value to get an environment variable +###################################################################################### + +# +# Add some tokens here +# + + +##################################################################################### +# Include custom configuration +##################################################################################### +CustomDelayedConfigurationPrefixWindows = ${Path_UserData}/openvibe-delayed +CustomDelayedConfigurationPrefixLinux = ${Path_UserData}/openvibe-delayed +CustomDelayedConfigurationSuffixWindows = .conf +CustomDelayedConfigurationSuffixLinux = rc +CustomDelayedConfiguration = ${CustomDelayedConfigurationPrefix${OperatingSystem}}${CustomDelayedConfigurationSuffix${OperatingSystem}} +Include = ${CustomDelayedConfiguration} diff --git a/Masterarbeit/openvibe/sdk-master/kernel/share/openvibe-scenario-legacy.xsd b/Masterarbeit/openvibe/sdk-master/kernel/share/openvibe-scenario-legacy.xsd new file mode 100644 index 0000000..1f5d56e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/share/openvibe-scenario-legacy.xsd @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/sdk-master/kernel/share/openvibe-scenario-v1.xsd b/Masterarbeit/openvibe/sdk-master/kernel/share/openvibe-scenario-v1.xsd new file mode 100644 index 0000000..016667e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/share/openvibe-scenario-v1.xsd @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/sdk-master/kernel/share/openvibe-scenario-v2.xsd b/Masterarbeit/openvibe/sdk-master/kernel/share/openvibe-scenario-v2.xsd new file mode 100644 index 0000000..d0a35f1 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/share/openvibe-scenario-v2.xsd @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/sdk-master/kernel/share/openvibe.conf b/Masterarbeit/openvibe/sdk-master/kernel/share/openvibe.conf new file mode 100644 index 0000000..7b8e4b7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/share/openvibe.conf @@ -0,0 +1,99 @@ +###################################################################################### +## OpenViBE configuration file +## +## - The file consists of a list of "token name = token value" +## - Whatever space / tabulation at the begining or end of a line is removed +## - Comments start with # +## - Lines ending with \ continue on the next line (all ending \ are removed) +## - On Windows, use / in paths as \ is reserved +## - You can use ${token name} in a token value +## - You can use $Environment{env name} in a token value to get an environment variable +###################################################################################### + +###################################################################################### +# OpenViBE configuration +##################################################################################### + +# Note: Path tokens are set by default to the respective installation dirs. Defining a token here will override the default value. +#Path_Root = .. +#Path_Bin = ${Path_Root}/bin +#Path_Lib = ${Path_Root}/lib +#Path_Data = ${Path_Root}/share/openvibe +#Path_Samples = ${Path_Data}/scenarios + +## By default, "Path_UserData" will point to $HOME/.config/openvibe on Linux, and to %APPDATA%/openvibe/ on Windows. +#Path_UserData = ${Path_Root}/openvibe-user +#Path_Log = ${Path_UserData}/log +#Path_Tmp = ${Path_UserData}/tmp + +##################################################################################### +# System Generalization +##################################################################################### + +Shell_ExtensionWindows = .cmd +Shell_ExtensionLinux = .sh +Shell_ExtensionMacOS = .sh +Shell_Extension = ${Shell_Extension${OperatingSystem}} + +Program_Launcher_PrefixWindows = openvibe- +Program_Launcher_PrefixLinux = openvibe- +Program_Launcher_PrefixMacOS = openvibe- +Program_Launcher_Prefix = ${Program_Launcher_Prefix${OperatingSystem}} + +External_Application_LauncherWindows = "${Path_Bin}/openvibe-external-application-launcher.cmd" +External_Application_LauncherLinux = "${Path_Bin}/openvibe-external-application-launcher" +External_Application_LauncherMacOS = "${Path_Bin}/openvibe-external-application-launcher" +External_Application_Launcher = ${External_Application_Launcher${OperatingSystem}} + +VRPN_ExternalServerPort = 53883 + +##################################################################################### +# OpenViBE kernel configuration +##################################################################################### + +Kernel_PluginsPatternMacOS = ${Path_Lib}/libopenvibe-plugins-*.dylib +Kernel_PluginsPatternLinux = ${Path_Lib}/libopenvibe-plugins-*.so +Kernel_PluginsPatternWindows = ${Path_Bin}/openvibe-plugins-*.dll +Kernel_Plugins = ${Kernel_PluginsPattern${OperatingSystem}} +Kernel_MainLogLevel = Trace +Kernel_ConsoleLogLevel = Information +Kernel_ConsoleLogWithHexa = False +Kernel_ConsoleLogTimeInSecond = True +Kernel_ConsoleLogTimePrecision = 3 +Kernel_FileLogLevel = Debug +Kernel_FileLogWithHexa = True +Kernel_FileLogTimeInSecond = False +Kernel_FileLogTimePrecision = 3 +Kernel_PlayerFrequency = 128 +Kernel_DelayedConfiguration = ${Path_Data}/kernel/openvibe-delayed.conf +Kernel_AllowUnregisteredNumericalStimulationIdentifiers = false + +Kernel_ExtendedStimulationLabels = true + +Kernel_AbortPlayerWhenBoxIsOutdated = false +Kernel_AbortScenarioImportOnUnknownSetting = false + +##################################################################################### +# OpenViBE plugin configuration +##################################################################################### + +Plugin_Classification_RandomizeKFoldTestData = false +Box_ChannelSelector_EEGChannelNames = LPA;RPA;Nz;Fp1;Fpz;Fp2;AF9;AF7;AF5;AF3;AF1;AFz;AF2;AF4;AF6;AF8;AF10;F9;F7;F5;F3;F1;Fz;F2;F4;F6;F8;F10;FT9;FT7;FC5;FC3;FC1;FCz;FC2;FC4;FC6;FT8;FT10;T9;T7;C5;C3;C1;Cz;C2;C4;C6;T8;T10;TP9;TP7;CP5;CP3;CP1;CPz;CP2;CP4;CP6;TP8;TP10;P9;P7;P5;P3;P1;Pz;P2;P4;P6;P8;P10;PO9;PO7;PO5;PO3;PO1;POz;PO2;PO4;PO6;PO8;PO10;O1;Oz;O2;I1;Iz;I2;AFp9h;AFp7h;AFp5h;AFp3h;AFp1h;AFp2h;AFp4h;AFp6h;AFp8h;AFp10h;AFF9h;AFF7h;AFF5h;AFF3h;AFF1h;AFF2h;AFF4h;AFF6h;AFF8h;AFF10h;FFT9h;FFT7h;FFC5h;FFC3h;FFC1h;FFC2h;FFC4h;FFC6h;FFT8h;FFT10h;FTT9h;FTT7h;FCC5h;FCC3h;FCC1h;FCC2h;FCC4h;FCC6h;FTT8h;FTT10h;TTP9h;TTP7h;CCP5h;CCP3h;CCP1h;CCP2h;CCP4h;CCP6h;TTP8h;TTP10h;TPP9h;TPP7h;CPP5h;CPP3h;CPP1h;CPP2h;CPP4h;CPP6h;TPP8h;TPP10h;PPO9h;PPO7h;PPO5h;PPO3h;PPO1h;PPO2h;PPO4h;PPO6h;PPO8h;PPO10h;POO9h;POO7h;POO5h;POO3h;POO1h;POO2h;POO4h;POO6h;POO8h;POO10h;OI1h;OI2h;Fp1h;Fp2h;AF9h;AF7h;AF5h;AF3h;AF1h;AF2h;AF4h;AF6h;AF8h;AF10h;F9h;F7h;F5h;F3h;F1h;F2h;F4h;F6h;F8h;F10h;FT9h;FT7h;FC5h;FC3h;FC1h;FC2h;FC4h;FC6h;FT8h;FT10h;T9h;T7h;C5h;C3h;C1h;C2h;C4h;C6h;T8h;T10h;TP9h;TP7h;CP5h;CP3h;CP1h;CP2h;CP4h;CP6h;TP8h;TP10h;P9h;P7h;P5h;P3h;P1h;P2h;P4h;P6h;P8h;P10h;PO9h;PO7h;PO5h;PO3h;PO1h;PO2h;PO4h;PO6h;PO8h;PO10h;O1h;O2h;I1h;I2h;AFp9;AFp7;AFp5;AFp3;AFp1;AFpz;AFp2;AFp4;AFp6;AFp8;AFp10;AFF9;AFF7;AFF5;AFF3;AFF1;AFFz;AFF2;AFF4;AFF6;AFF8;AFF10;FFT9;FFT7;FFC5;FFC3;FFC1;FFCz;FFC2;FFC4;FFC6;FFT8;FFT10;FTT9;FTT7;FCC5;FCC3;FCC1;FCCz;FCC2;FCC4;FCC6;FTT8;FTT10;TTP9;TTP7;CCP5;CCP3;CCP1;CCPz;CCP2;CCP4;CCP6;TTP8;TTP10;TPP9;TPP7;CPP5;CPP3;CPP1;CPPz;CPP2;CPP4;CPP6;TPP8;TPP10;PPO9;PPO7;PPO5;PPO3;PPO1;PPOz;PPO2;PPO4;PPO6;PPO8;PPO10;POO9;POO7;POO5;POO3;POO1;POOz;POO2;POO4;POO6;POO8;POO10;OI1;OIz;OI2;T3;T5;T4;T6 +Box_ChannelSelector_FailOnInvalidSelection = true + +##################################################################################### +# Include custom configuration (from deprecated locations) +# Actual custom configuration below will override these, if its found. +##################################################################################### + +CustomConfigurationPrefixWindows = ${Path_UserData}/openvibe +CustomConfigurationPrefixLinux = ${Path_UserData}/openvibe +CustomConfigurationPrefixMacOS = ${Path_UserData}/openvibe +CustomConfigurationSuffixWindows = .conf +CustomConfigurationSuffixLinux = rc +CustomConfigurationSuffixMacOS = rc + +CustomConfigurationPluginsWildcard = ${Path_Data}/plugins/*.conf +Include = ${CustomConfigurationPluginsWildcard} + + diff --git a/Masterarbeit/openvibe/sdk-master/kernel/share/resources.cfg b/Masterarbeit/openvibe/sdk-master/kernel/share/resources.cfg new file mode 100644 index 0000000..01d48aa --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/share/resources.cfg @@ -0,0 +1,7 @@ +# Resource locations to be added to the default path +[Bootstrap] +Zip=${Path_Data}/kernel/OgreCore.zip + +[General] +FileSystem=${Path_Data}/kernel/ + diff --git a/Masterarbeit/openvibe/sdk-master/kernel/share/sphere_ov.material b/Masterarbeit/openvibe/sdk-master/kernel/share/sphere_ov.material new file mode 100644 index 0000000..d663e7e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/share/sphere_ov.material @@ -0,0 +1,43 @@ +material sphere_ov_material +{ + technique + { + pass + { + ambient 1 1 1 + diffuse 1 1 1 +// specular 0 0 0 10 +// emissive 0 0 0 + scene_blend alpha_blend + } + } +} + +//the following cg/diffuse shader allows controlling the diffuse component from code using parameter 1 + +//fragment_program set_color_fp cg +//{ +// source diffuse.cg +// entry_point main_ps +// profiles ps_2_0 arbfp1 +// default_params +// { +// param_named myColour float4 1 1 1 1 +// } +//} + +//material cg/diffuse +//{ +// technique +// { +// pass +// { +//// lighting off +// scene_blend alpha_blend +// fragment_program_ref set_color_fp +// { +// param_named_auto myColour custom 1 +// } +// } +// } +//} diff --git a/Masterarbeit/openvibe/sdk-master/kernel/share/sphere_ov.mesh b/Masterarbeit/openvibe/sdk-master/kernel/share/sphere_ov.mesh new file mode 100644 index 0000000..2fe6b50 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/kernel/share/sphere_ov.mesh differ diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmContext.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmContext.h new file mode 100644 index 0000000..0c9df7f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmContext.h @@ -0,0 +1,47 @@ +#pragma once + +#include "../ovkTKernelObject.h" +#include "ovkCAlgorithmProxy.h" + +namespace OpenViBE { +namespace Kernel { +class CAlgorithmContext final : public TKernelObject +{ +public: + + CAlgorithmContext(const IKernelContext& ctx, CAlgorithmProxy& algorithmProxy, const Plugins::IPluginObjectDesc& /*pluginObjectDesc*/) + : TKernelObject(ctx), m_logManager(ctx.getLogManager()), m_algorithmProxy(algorithmProxy) {} + + ~CAlgorithmContext() override { } + IConfigurationManager& getConfigurationManager() const override { return getKernelContext().getConfigurationManager(); } + IAlgorithmManager& getAlgorithmManager() const override { return getKernelContext().getAlgorithmManager(); } + ILogManager& getLogManager() const override { return m_logManager; } + IErrorManager& getErrorManager() const override { return getKernelContext().getErrorManager(); } + ITypeManager& getTypeManager() const override { return getKernelContext().getTypeManager(); } + + CIdentifier getNextInputParameterIdentifier(const CIdentifier& previous) const override + { + return m_algorithmProxy.getNextInputParameterIdentifier(previous); + } + + IParameter* getInputParameter(const CIdentifier& identifier) override { return m_algorithmProxy.getInputParameter(identifier); } + + CIdentifier getNextOutputParameterIdentifier(const CIdentifier& previous) const override + { + return m_algorithmProxy.getNextOutputParameterIdentifier(previous); + } + + IParameter* getOutputParameter(const CIdentifier& identifier) override { return m_algorithmProxy.getOutputParameter(identifier); } + bool isInputTriggerActive(const CIdentifier& identifier) const override { return m_algorithmProxy.isInputTriggerActive(identifier); } + + bool activateOutputTrigger(const CIdentifier& identifier, const bool state) override { return m_algorithmProxy.activateOutputTrigger(identifier, state); } + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Algorithm_AlgorithmContext) + +protected: + + ILogManager& m_logManager; + CAlgorithmProxy& m_algorithmProxy; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmManager.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmManager.cpp new file mode 100755 index 0000000..0da8d64 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmManager.cpp @@ -0,0 +1,162 @@ +#include "ovkCAlgorithmManager.h" +#include "ovkCAlgorithmProxy.h" + +#include + +namespace OpenViBE { +namespace Kernel { + +CAlgorithmManager::~CAlgorithmManager() +{ + std::unique_lock lock(m_oMutex); + + for (auto& algorithm : m_algorithms) + { + CAlgorithmProxy* algorithmProxy = algorithm.second; + Plugins::IAlgorithm& tmpAlgorithm = algorithmProxy->getAlgorithm(); + delete algorithmProxy; + + getKernelContext().getPluginManager().releasePluginObject(&tmpAlgorithm); + } + + m_algorithms.clear(); +} + +CIdentifier CAlgorithmManager::createAlgorithm(const CIdentifier& algorithmClassID) +{ + const Plugins::IAlgorithmDesc* algorithmDesc = nullptr; + Plugins::IAlgorithm* algorithm = getKernelContext().getPluginManager().createAlgorithm(algorithmClassID, &algorithmDesc); + + OV_ERROR_UNLESS_KRU(algorithm && algorithmDesc, "Algorithm creation failed, class identifier :" << algorithmClassID.str(), + ErrorType::BadResourceCreation); + + getLogManager() << LogLevel_Debug << "Creating algorithm with class identifier " << algorithmClassID << "\n"; + + CIdentifier algorithmId = getUnusedIdentifier(); + CAlgorithmProxy* algorithmProxy = new CAlgorithmProxy(getKernelContext(), *algorithm, *algorithmDesc); + + { + std::unique_lock lock(m_oMutex); + m_algorithms[algorithmId] = algorithmProxy; + } + + return algorithmId; +} + +CIdentifier CAlgorithmManager::createAlgorithm(const Plugins::IAlgorithmDesc& algorithmDesc) +{ + std::unique_lock lock(m_oMutex); + + Plugins::IAlgorithm* algorithm = getKernelContext().getPluginManager().createAlgorithm(algorithmDesc); + + OV_ERROR_UNLESS_KRU(algorithm, "Algorithm creation failed, class identifier :" << algorithmDesc.getClassIdentifier().str(), + ErrorType::BadResourceCreation); + + getLogManager() << LogLevel_Debug << "Creating algorithm with class identifier " << algorithmDesc.getClassIdentifier() << "\n"; + + CIdentifier algorithmId = getUnusedIdentifier(); + CAlgorithmProxy* algorithmProxy = new CAlgorithmProxy(getKernelContext(), *algorithm, algorithmDesc); + m_algorithms[algorithmId] = algorithmProxy; + return algorithmId; +} + + +bool CAlgorithmManager::releaseAlgorithm(const CIdentifier& rAlgorithmIdentifier) +{ + std::unique_lock lock(m_oMutex); + + const auto itAlgorithm = m_algorithms.find(rAlgorithmIdentifier); + + OV_ERROR_UNLESS_KRF(itAlgorithm != m_algorithms.end(), + "Algorithm release failed, identifier :" << rAlgorithmIdentifier.str(), + ErrorType::ResourceNotFound); + + getLogManager() << LogLevel_Debug << "Releasing algorithm with identifier " << rAlgorithmIdentifier << "\n"; + CAlgorithmProxy* algorithmProxy = itAlgorithm->second; + if (algorithmProxy) + { + Plugins::IAlgorithm& algorithm = algorithmProxy->getAlgorithm(); + + delete algorithmProxy; + algorithmProxy = nullptr; + + getKernelContext().getPluginManager().releasePluginObject(&algorithm); + } + m_algorithms.erase(itAlgorithm); + + return true; +} + +bool CAlgorithmManager::releaseAlgorithm(IAlgorithmProxy& rAlgorithm) +{ + std::unique_lock lock(m_oMutex); + + bool result = false; + for (auto& algorithm : m_algorithms) + { + CAlgorithmProxy* algorithmProxy = algorithm.second; + if (algorithmProxy == &rAlgorithm) + { + Plugins::IAlgorithm& tmpAlgorithm = algorithmProxy->getAlgorithm(); + getLogManager() << LogLevel_Debug << "Releasing algorithm with class id " << tmpAlgorithm.getClassIdentifier() << "\n"; + + delete algorithmProxy; + algorithmProxy = nullptr; + + m_algorithms.erase(algorithm.first); + getKernelContext().getPluginManager().releasePluginObject(&tmpAlgorithm); + result = true; + break; + } + } + + OV_ERROR_UNLESS_KRF(result, "Algorithm release failed", Kernel::ErrorType::ResourceNotFound); + + return result; +} + +IAlgorithmProxy& CAlgorithmManager::getAlgorithm(const CIdentifier& rAlgorithmIdentifier) +{ + std::unique_lock lock(m_oMutex); + + const auto itAlgorithm = m_algorithms.find(rAlgorithmIdentifier); + + OV_FATAL_UNLESS_K(itAlgorithm != m_algorithms.end(), "Algorithm " << rAlgorithmIdentifier << " does not exist !", Kernel::ErrorType::ResourceNotFound); + + return *itAlgorithm->second; +} + +CIdentifier CAlgorithmManager::getNextAlgorithmIdentifier(const CIdentifier& previousID) const +{ + std::unique_lock lock(m_oMutex); + + auto itAlgorithm = m_algorithms.begin(); + if (previousID != CIdentifier::undefined()) + { + itAlgorithm = m_algorithms.find(previousID); + if (itAlgorithm == m_algorithms.end()) { return CIdentifier::undefined(); } + ++itAlgorithm; + } + return (itAlgorithm != m_algorithms.end() ? itAlgorithm->first : CIdentifier::undefined()); +} + +CIdentifier CAlgorithmManager::getUnusedIdentifier() const +{ + std::unique_lock lock(m_oMutex); + + uint64_t identifier = CIdentifier::random().id(); + CIdentifier result; + + std::map::const_iterator i; + do + { + identifier++; + result = CIdentifier(identifier); + i = m_algorithms.find(result); + } while (i != m_algorithms.end() || result == CIdentifier::undefined()); + + return result; +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmManager.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmManager.h new file mode 100755 index 0000000..aae294d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmManager.h @@ -0,0 +1,34 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +#include +#include + +namespace OpenViBE { +namespace Kernel { +class CAlgorithmProxy; + +class CAlgorithmManager final : public TKernelObject +{ +public: + + explicit CAlgorithmManager(const IKernelContext& ctx) : TKernelObject(ctx) {} + ~CAlgorithmManager() override; + CIdentifier createAlgorithm(const CIdentifier& algorithmClassID) override; + CIdentifier createAlgorithm(const Plugins::IAlgorithmDesc& algorithmDesc) override; + bool releaseAlgorithm(const CIdentifier& rAlgorithmIdentifier) override; + bool releaseAlgorithm(IAlgorithmProxy& rAlgorithm) override; + IAlgorithmProxy& getAlgorithm(const CIdentifier& rAlgorithmIdentifier) override; + CIdentifier getNextAlgorithmIdentifier(const CIdentifier& previousID) const override; + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Algorithm_AlgorithmManager) + +protected: + + CIdentifier getUnusedIdentifier() const; + std::map m_algorithms; + mutable std::mutex m_oMutex; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmProto.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmProto.cpp new file mode 100644 index 0000000..2e1261c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmProto.cpp @@ -0,0 +1,33 @@ +#include "ovkCAlgorithmProto.h" +#include "ovkCAlgorithmProxy.h" + +namespace OpenViBE { +namespace Kernel { + +CAlgorithmProto::CAlgorithmProto(const IKernelContext& ctx, CAlgorithmProxy& rAlgorithmProxy) + : TKernelObject(ctx), m_algorithmProxy(rAlgorithmProxy) {} + +bool CAlgorithmProto::addInputParameter(const CIdentifier& inputParameterID, const CString& sInputName, + const EParameterType eParameterType, const CIdentifier& subTypeID) +{ + return m_algorithmProxy.addInputParameter(inputParameterID, sInputName, eParameterType, subTypeID); +} + +bool CAlgorithmProto::addOutputParameter(const CIdentifier& outputParameterID, const CString& sOutputName, + const EParameterType eParameterType, const CIdentifier& subTypeID) +{ + return m_algorithmProxy.addOutputParameter(outputParameterID, sOutputName, eParameterType, subTypeID); +} + +bool CAlgorithmProto::addInputTrigger(const CIdentifier& inputTriggerID, const CString& rInputTriggerName) +{ + return m_algorithmProxy.addInputTrigger(inputTriggerID, rInputTriggerName); +} + +bool CAlgorithmProto::addOutputTrigger(const CIdentifier& outputTriggerID, const CString& rOutputTriggerName) +{ + return m_algorithmProxy.addOutputTrigger(outputTriggerID, rOutputTriggerName); +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmProto.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmProto.h new file mode 100644 index 0000000..6720d47 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmProto.h @@ -0,0 +1,28 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +class CAlgorithmProxy; + +class CAlgorithmProto final : public TKernelObject +{ +public: + + CAlgorithmProto(const IKernelContext& ctx, CAlgorithmProxy& rAlgorithmProxy); + bool addInputParameter(const CIdentifier& inputParameterID, const CString& sInputName, EParameterType eParameterType, + const CIdentifier& subTypeID) override; + bool addOutputParameter(const CIdentifier& outputParameterID, const CString& sOutputName, EParameterType eParameterType, + const CIdentifier& subTypeID) override; + bool addInputTrigger(const CIdentifier& inputTriggerID, const CString& rInputTriggerName) override; + bool addOutputTrigger(const CIdentifier& outputTriggerID, const CString& rOutputTriggerName) override; + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Algorithm_AlgorithmProto) + +protected: + + CAlgorithmProxy& m_algorithmProxy; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmProxy.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmProxy.cpp new file mode 100644 index 0000000..2eb31a3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmProxy.cpp @@ -0,0 +1,285 @@ +#include + +#include "ovkCAlgorithmProxy.h" +#include "ovkCAlgorithmContext.h" +#include "ovkCAlgorithmProto.h" + +#include "../../ovk_tools.h" + +#include + +namespace OpenViBE { +namespace Kernel { + +CAlgorithmProxy::CAlgorithmProxy(const IKernelContext& ctx, Plugins::IAlgorithm& rAlgorithm, const Plugins::IAlgorithmDesc& algorithmDesc) + : TKernelObject(ctx), m_algorithmDesc(algorithmDesc), m_algorithm(rAlgorithm) +{ + m_iConfigurable = dynamic_cast(getKernelContext().getKernelObjectFactory().createObject(OV_ClassId_Kernel_Configurable)); + m_oConfigurable = dynamic_cast(getKernelContext().getKernelObjectFactory().createObject(OV_ClassId_Kernel_Configurable)); + + // FIXME + CAlgorithmProto algorithmProto(ctx, *this); + algorithmDesc.getAlgorithmPrototype(algorithmProto); +} + +CAlgorithmProxy::~CAlgorithmProxy() +{ + getKernelContext().getKernelObjectFactory().releaseObject(m_oConfigurable); + getKernelContext().getKernelObjectFactory().releaseObject(m_iConfigurable); +} + +bool CAlgorithmProxy::addInputParameter(const CIdentifier& parameterID, const CString& name, const EParameterType parameterType, + const CIdentifier& subTypeID) +{ + OV_ERROR_UNLESS_KRF(m_iConfigurable->getParameter(parameterID) == nullptr, + "For algorithm " << m_algorithmDesc.getName() << " : Input parameter id " << parameterID.str() << " already exists", + ErrorType::BadResourceCreation); + + m_iConfigurable->createParameter(parameterID, parameterType, subTypeID); + m_iParameterNames[parameterID] = name; + return true; +} + +CIdentifier CAlgorithmProxy::getNextInputParameterIdentifier(const CIdentifier& parameterID) const +{ + return m_iConfigurable->getNextParameterIdentifier(parameterID); +} + +IParameter* CAlgorithmProxy::getInputParameter(const CIdentifier& parameterID) +{ + IParameter* parameter = m_iConfigurable->getParameter(parameterID); + + OV_ERROR_UNLESS_KRN( + parameter, "For algorithm " << m_algorithmDesc.getName() << " : Requested null input parameter id " << parameterID.str(), + ErrorType::ResourceNotFound); + + return parameter; +} + +EParameterType CAlgorithmProxy::getInputParameterType(const CIdentifier& parameterID) const +{ + IParameter* parameter = m_iConfigurable->getParameter(parameterID); + if (!parameter) { return ParameterType_None; } + return parameter->getType(); +} + +CString CAlgorithmProxy::getInputParameterName(const CIdentifier& parameterID) const +{ + const auto itName = m_iParameterNames.find(parameterID); + if (itName == m_iParameterNames.end()) { return ""; } + return itName->second; +} + +bool CAlgorithmProxy::removeInputParameter(const CIdentifier& parameterID) +{ + if (!m_iConfigurable->removeParameter(parameterID)) { return false; } + m_iParameterNames.erase(m_iParameterNames.find(parameterID)); + return true; +} + +bool CAlgorithmProxy::addOutputParameter(const CIdentifier& parameterID, const CString& name, const EParameterType parameterType, + const CIdentifier& subTypeID) +{ + OV_ERROR_UNLESS_KRF(m_oConfigurable->getParameter(parameterID) == nullptr, + "For algorithm " << m_algorithmDesc.getName() << " : Output parameter id " << parameterID.str() << + " already exists", + ErrorType::BadResourceCreation); + + m_oConfigurable->createParameter(parameterID, parameterType, subTypeID); + m_oParameterNames[parameterID] = name; + return true; +} + +CIdentifier CAlgorithmProxy::getNextOutputParameterIdentifier(const CIdentifier& parameterID) const +{ + return m_oConfigurable->getNextParameterIdentifier(parameterID); +} + +IParameter* CAlgorithmProxy::getOutputParameter(const CIdentifier& parameterID) +{ + IParameter* parameter = m_oConfigurable->getParameter(parameterID); + + OV_ERROR_UNLESS_KRN( + parameter, "For algorithm " << m_algorithmDesc.getName() << " : Requested null output parameter id " << parameterID.str(), + ErrorType::ResourceNotFound); + + return parameter; +} + +EParameterType CAlgorithmProxy::getOutputParameterType(const CIdentifier& parameterID) const +{ + IParameter* parameter = m_oConfigurable->getParameter(parameterID); + if (!parameter) { return ParameterType_None; } + return parameter->getType(); +} + +CString CAlgorithmProxy::getOutputParameterName(const CIdentifier& parameterID) const +{ + const auto itName = m_oParameterNames.find(parameterID); + if (itName == m_oParameterNames.end()) { return ""; } + return itName->second; +} + +bool CAlgorithmProxy::removeOutputParameter(const CIdentifier& parameterID) +{ + if (!m_oConfigurable->removeParameter(parameterID)) { return false; } + m_oParameterNames.erase(m_oParameterNames.find(parameterID)); + return true; +} + +bool CAlgorithmProxy::addInputTrigger(const CIdentifier& triggerID, const CString& name) +{ + if (m_iTriggers.find(triggerID) != m_iTriggers.end()) { return false; } + m_iTriggers[triggerID].first = name; + m_iTriggers[triggerID].second = false; + return true; +} + +CIdentifier CAlgorithmProxy::getNextInputTriggerIdentifier(const CIdentifier& triggerID) const +{ + return getNextIdentifier>(m_iTriggers, triggerID); +} + +CString CAlgorithmProxy::getInputTriggerName(const CIdentifier& triggerID) const +{ + const auto itTrigger = m_iTriggers.find(triggerID); + if (itTrigger == m_iTriggers.end()) { return ""; } + return itTrigger->second.first; +} + +bool CAlgorithmProxy::isInputTriggerActive(const CIdentifier& triggerID) const +{ + const auto itTrigger = m_iTriggers.find(triggerID); + if (itTrigger == m_iTriggers.end()) { return false; } + return itTrigger->second.second; +} + +bool CAlgorithmProxy::activateInputTrigger(const CIdentifier& triggerID, const bool /*triggerState*/) +{ + const auto itTrigger = m_iTriggers.find(triggerID); + if (itTrigger == m_iTriggers.end()) { return false; } + itTrigger->second.second = true; + return true; +} + +bool CAlgorithmProxy::removeInputTrigger(const CIdentifier& triggerID) +{ + const auto itTrigger = m_iTriggers.find(triggerID); + if (itTrigger == m_iTriggers.end()) { return false; } + m_iTriggers.erase(itTrigger); + return true; +} + +bool CAlgorithmProxy::addOutputTrigger(const CIdentifier& triggerID, const CString& name) +{ + if (m_oTriggers.find(triggerID) != m_oTriggers.end()) { return false; } + m_oTriggers[triggerID].first = name; + m_oTriggers[triggerID].second = false; + return true; +} + +CIdentifier CAlgorithmProxy::getNextOutputTriggerIdentifier(const CIdentifier& triggerID) const +{ + return getNextIdentifier>(m_oTriggers, triggerID); +} + +CString CAlgorithmProxy::getOutputTriggerName(const CIdentifier& triggerID) const +{ + const auto itTrigger = m_oTriggers.find(triggerID); + if (itTrigger == m_oTriggers.end()) { return ""; } + return itTrigger->second.first; +} + +bool CAlgorithmProxy::isOutputTriggerActive(const CIdentifier& triggerID) const +{ + const auto itTrigger = m_oTriggers.find(triggerID); + if (itTrigger == m_oTriggers.end()) { return false; } + return itTrigger->second.second; +} + +bool CAlgorithmProxy::activateOutputTrigger(const CIdentifier& triggerID, const bool /*state*/) +{ + const auto itTrigger = m_oTriggers.find(triggerID); + if (itTrigger == m_oTriggers.end()) { return false; } + itTrigger->second.second = true; + return true; +} + +bool CAlgorithmProxy::removeOutputTrigger(const CIdentifier& triggerID) +{ + const auto itTrigger = m_oTriggers.find(triggerID); + if (itTrigger == m_oTriggers.end()) { return false; } + m_oTriggers.erase(itTrigger); + return true; +} + + +bool CAlgorithmProxy::initialize() +{ + assert(!m_isInitialized); + + return translateException([&]() + { + CAlgorithmContext context(getKernelContext(), *this, m_algorithmDesc); + // The dual state initialized or not does not take into account + // a partially initialized state. Thus, we have to trust algorithms to implement + // their initialization routine as a rollback transaction mechanism + m_isInitialized = m_algorithm.initialize(context); + return m_isInitialized; + }, + std::bind(&CAlgorithmProxy::handleException, this, "Algorithm initialization", std::placeholders::_1)); +} + +bool CAlgorithmProxy::uninitialize() +{ + assert(m_isInitialized); + + return translateException([&]() + { + CAlgorithmContext context(getKernelContext(), *this, m_algorithmDesc); + return m_algorithm.uninitialize(context); + }, + std::bind(&CAlgorithmProxy::handleException, this, "Algorithm uninitialization", std::placeholders::_1)); +} + +bool CAlgorithmProxy::process() +{ + assert(m_isInitialized); + + return translateException([&]() + { + CAlgorithmContext context(getKernelContext(), *this, m_algorithmDesc); + this->setAllOutputTriggers(false); + const bool result = m_algorithm.process(context); + this->setAllInputTriggers(false); + return result; + }, + std::bind(&CAlgorithmProxy::handleException, this, "Algorithm processing", std::placeholders::_1)); +} + +bool CAlgorithmProxy::process(const CIdentifier& triggerID) +{ + assert(m_isInitialized); + if (!this->activateInputTrigger(triggerID, true)) { return false; } + return this->process(); +} + +void CAlgorithmProxy::setAllInputTriggers(const bool status) { for (auto& trigger : m_iTriggers) { trigger.second.second = status; } } + +void CAlgorithmProxy::setAllOutputTriggers(const bool status) { for (auto& trigger : m_oTriggers) { trigger.second.second = status; } } + +bool CAlgorithmProxy::isAlgorithmDerivedFrom(const CIdentifier& classID) { return m_algorithm.isDerivedFromClass(classID); } + +void CAlgorithmProxy::handleException(const char* errorHint, const std::exception& exception) +{ + this->getLogManager() << LogLevel_Error << "Exception caught in algorithm\n"; + this->getLogManager() << LogLevel_Error << " [name: " << this->getAlgorithmDesc().getName() << "]\n"; + this->getLogManager() << LogLevel_Error << " [class identifier: " << this->getAlgorithmDesc().getCreatedClass() << "]\n"; + this->getLogManager() << LogLevel_Error << " [hint: " << (errorHint ? errorHint : "no hint") << "]\n"; + this->getLogManager() << LogLevel_Error << " [cause: " << exception.what() << "]\n"; + + OV_ERROR_KRV("Caught exception: " << exception.what(), Kernel::ErrorType::ExceptionCaught); +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmProxy.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmProxy.h new file mode 100644 index 0000000..abd2380 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/algorithm/ovkCAlgorithmProxy.h @@ -0,0 +1,76 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +#include + +namespace OpenViBE { +namespace Kernel { +class CAlgorithmProxy final : public TKernelObject +{ +public: + + CAlgorithmProxy(const IKernelContext& ctx, Plugins::IAlgorithm& rAlgorithm, const Plugins::IAlgorithmDesc& algorithmDesc); + ~CAlgorithmProxy() override; + + Plugins::IAlgorithm& getAlgorithm() { return m_algorithm; } + const Plugins::IAlgorithm& getAlgorithm() const { return m_algorithm; } + const Plugins::IAlgorithmDesc& getAlgorithmDesc() const { return m_algorithmDesc; } + + bool addInputParameter(const CIdentifier& parameterID, const CString& name, EParameterType parameterType, const CIdentifier& subTypeID); + CIdentifier getNextInputParameterIdentifier(const CIdentifier& parameterID) const override; + IParameter* getInputParameter(const CIdentifier& parameterID) override; + EParameterType getInputParameterType(const CIdentifier& parameterID) const; + CString getInputParameterName(const CIdentifier& parameterID) const override; + bool removeInputParameter(const CIdentifier& parameterID); + + bool addOutputParameter(const CIdentifier& parameterID, const CString& name, EParameterType parameterType, const CIdentifier& subTypeID); + CIdentifier getNextOutputParameterIdentifier(const CIdentifier& parameterID) const override; + IParameter* getOutputParameter(const CIdentifier& parameterID) override; + EParameterType getOutputParameterType(const CIdentifier& parameterID) const; + CString getOutputParameterName(const CIdentifier& parameterID) const override; + bool removeOutputParameter(const CIdentifier& parameterID); + + bool addInputTrigger(const CIdentifier& triggerID, const CString& name); + CIdentifier getNextInputTriggerIdentifier(const CIdentifier& triggerID) const override; + CString getInputTriggerName(const CIdentifier& triggerID) const override; + bool isInputTriggerActive(const CIdentifier& triggerID) const; + bool activateInputTrigger(const CIdentifier& triggerID, bool triggerState) override; + bool removeInputTrigger(const CIdentifier& triggerID); + + bool addOutputTrigger(const CIdentifier& triggerID, const CString& name); + CIdentifier getNextOutputTriggerIdentifier(const CIdentifier& triggerID) const override; + CString getOutputTriggerName(const CIdentifier& triggerID) const override; + bool isOutputTriggerActive(const CIdentifier& triggerID) const override; + bool activateOutputTrigger(const CIdentifier& triggerID, const bool triggerState); + bool removeOutputTrigger(const CIdentifier& triggerID); + bool initialize() override; + bool uninitialize() override; + bool process() override; + bool process(const CIdentifier& triggerID) override; + bool isAlgorithmDerivedFrom(const CIdentifier& classID) override; + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Algorithm_AlgorithmProxy) + +protected: + + IConfigurable* m_iConfigurable = nullptr; + IConfigurable* m_oConfigurable = nullptr; + std::map m_iParameterNames; + std::map m_oParameterNames; + std::map> m_iTriggers; + std::map> m_oTriggers; + + void setAllInputTriggers(bool status); + void setAllOutputTriggers(bool status); + +private: + + void handleException(const char* errorHint, const std::exception& exception); + + const Plugins::IAlgorithmDesc& m_algorithmDesc; + Plugins::IAlgorithm& m_algorithm; + bool m_isInitialized = false; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/configuration/ovkCConfigurationManager.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/configuration/ovkCConfigurationManager.cpp new file mode 100755 index 0000000..f00221d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/configuration/ovkCConfigurationManager.cpp @@ -0,0 +1,744 @@ +#include "ovkCConfigurationManager.h" + +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + #include // for getpid +#elif defined TARGET_OS_Windows +#include // for GetCurrentProcessId +#else +#endif + +namespace OpenViBE { +namespace Kernel { +// because std::tolower has multiple signatures, +// it can not be easily used in std::transform +// this workaround is taken from http://www.gcek.net/ref/books/sw/cpp/ticppv2/ +template +static TCharT ToLower(TCharT c) { return std::tolower(c); } + +class CConfigurationManagerEntryEnumeratorCallBack final : public FS::IEntryEnumeratorCallBack +{ +public: + + CConfigurationManagerEntryEnumeratorCallBack(ILogManager& logManager, IErrorManager& errorManager, IConfigurationManager& configManger) + : m_logManager(logManager), m_errorManager(errorManager), m_configManager(configManger) { } + + static std::string reduce(const std::string& value) + { + if (value.length() == 0) { return ""; } + + size_t i = 0; + size_t j = value.length() - 1; + + while (i < value.length() && (value[i] == '\t' || value[i] == ' ')) { i++; } + while (j >= i && (value[j] == '\t' || value[j] == ' ')) { j--; } + + return value.substr(i, j - i + 1); + } + + bool callback(FS::IEntryEnumerator::IEntry& rEntry, FS::IEntryEnumerator::IAttributes& /*attributes*/) override + { + std::ifstream file; + FS::Files::openIFStream(file, rEntry.getName()); + + OV_ERROR_UNLESS(file.good(), "Could not open file " << rEntry.getName(), Kernel::ErrorType::ResourceNotFound, false, m_errorManager, m_logManager); + m_logManager << LogLevel_Trace << "Processing configuration file " << rEntry.getName() << "\n"; + + do + { + std::string line; + std::string linePart; + size_t eq; + + while (!file.eof() && (line.length() == 0 || line[line.length() - 1] == '\\')) + { + while (line.length() != 0 && line[line.length() - 1] == '\\') + { + line.resize(line.length() - 1); // removes ending backslashes + } + + std::getline(file, linePart, '\n'); + line += reduce(linePart); + } + + // process everything except empty line or comment + if (!line.empty() && line[0] != '\0' && line[0] != '#') + { + OV_ERROR_UNLESS((eq=line.find('=')) != std::string::npos, + "Invalid syntax in configuration file " << CString(rEntry.getName()) << " : " << line, + ErrorType::BadFileParsing, false, m_errorManager, m_logManager); + + std::string name(reduce(line.substr(0, eq))); + std::string value(reduce(line.substr(eq + 1, line.length() - eq))); + if (name == "Include") + { + CString wildCard = m_configManager.expand(value.c_str()); + m_logManager << LogLevel_Trace << "Including configuration file " << wildCard << "...\n"; + m_configManager.addConfigurationFromFile(wildCard); + m_logManager << LogLevel_Trace << "Including configuration file " << wildCard << " done...\n"; + } + else + { + CIdentifier tokenID = m_configManager.lookUpConfigurationTokenIdentifier(name.c_str()); + if (tokenID == CIdentifier::undefined()) + { + m_logManager << LogLevel_Trace << "Adding configuration token " << name << " : " << value << "\n"; + m_configManager.createConfigurationToken(name.c_str(), value.c_str()); + } + else + { + m_logManager << LogLevel_Trace << "Changing configuration token " << name << " to " << value << "\n"; + + // warning if base token are overwritten here + OV_WARNING_UNLESS(name != "Path_UserData" && name != "Path_Log" && name != "Path_Tmp" + && name != "Path_Lib" && name != "Path_Bin" && name != "OperatingSystem", + "Overwriting critical token " + name, m_logManager); + + m_configManager.setConfigurationTokenValue(tokenID, value.c_str()); + } + } + } + } while (!file.eof()); + + m_logManager << LogLevel_Trace << "Processing configuration file " << CString(rEntry.getName()) << " finished\n"; + + return true; + } + +protected: + + ILogManager& m_logManager; + IErrorManager& m_errorManager; + IConfigurationManager& m_configManager; +}; + +CConfigurationManager::CConfigurationManager(const IKernelContext& ctx, IConfigurationManager* parentConfigManager) + : TKernelObject(ctx), m_parentConfigManager(parentConfigManager) +{ + m_idx = 0; + m_startTime = System::Time::getTime(); +} + +void CConfigurationManager::clear() +{ + std::unique_lock lock(m_mutex); + m_ConfigTokens.clear(); +} + +bool CConfigurationManager::addConfigurationFromFile(const CString& rFileNameWildCard) +{ + std::unique_lock lock(m_mutex); + + this->getLogManager() << LogLevel_Trace << "Adding configuration file(s) [" << rFileNameWildCard << "]\n"; + + + CConfigurationManagerEntryEnumeratorCallBack cb(getKernelContext().getLogManager(), getKernelContext().getErrorManager(), *this); + FS::IEntryEnumerator* entryEnumerator = createEntryEnumerator(cb); + const bool res = entryEnumerator->enumerate(rFileNameWildCard); + entryEnumerator->release(); + return res; +} + +// ---------------------------------------------------------------------------------------------------------------------------- +// + +CIdentifier CConfigurationManager::createConfigurationToken(const CString& name, const CString& value) +{ + std::unique_lock lock(m_mutex); + + OV_ERROR_UNLESS_KRF(this->lookUpConfigurationTokenIdentifier(name, false) == CIdentifier::undefined(), + "Configuration token name " << name << " already exists", Kernel::ErrorType::BadResourceCreation); + + CIdentifier id = this->getUnusedIdentifier(); + m_ConfigTokens[id].name = name; + m_ConfigTokens[id].value = value; + return id; +} + +bool CConfigurationManager::releaseConfigurationToken(const CIdentifier& identifier) +{ + std::unique_lock lock(m_mutex); + + const auto it = m_ConfigTokens.find(identifier); + + OV_ERROR_UNLESS_KRF(it != m_ConfigTokens.end(), "Configuration token not found " << identifier.str(), Kernel::ErrorType::ResourceNotFound); + + m_ConfigTokens.erase(it); + return true; +} + +CIdentifier CConfigurationManager::getNextConfigurationTokenIdentifier(const CIdentifier& prevConfigTokenID) const +{ + std::unique_lock lock(m_mutex); + + std::map::const_iterator it; + + if (prevConfigTokenID == CIdentifier::undefined()) { it = m_ConfigTokens.begin(); } + else + { + it = m_ConfigTokens.find(prevConfigTokenID); + if (it == m_ConfigTokens.end()) { return CIdentifier::undefined(); } + ++it; + } + + return it != m_ConfigTokens.end() ? it->first : CIdentifier::undefined(); +} + +// ---------------------------------------------------------------------------------------------------------------------------- + +CString CConfigurationManager::getConfigurationTokenName(const CIdentifier& identifier) const +{ + std::unique_lock lock(m_mutex); + + const auto it = m_ConfigTokens.find(identifier); + if (it != m_ConfigTokens.end()) { return it->second.name; } + return ""; +} + +CString CConfigurationManager::getConfigurationTokenValue(const CIdentifier& identifier) const +{ + std::unique_lock lock(m_mutex); + + const auto it = m_ConfigTokens.find(identifier); + if (it != m_ConfigTokens.end()) { return it->second.value; } + return ""; +} + +// ---------------------------------------------------------------------------------------------------------------------------- + +bool CConfigurationManager::setConfigurationTokenName(const CIdentifier& identifier, const CString& name) +{ + std::unique_lock lock(m_mutex); + + OV_ERROR_UNLESS_KRF(this->lookUpConfigurationTokenIdentifier(name, false) == CIdentifier::undefined(), + "Configuration token name " << name << " already exists", Kernel::ErrorType::BadResourceCreation); + + auto it = m_ConfigTokens.find(identifier); + + OV_ERROR_UNLESS_KRF(it != m_ConfigTokens.end(), "Configuration token " << identifier.str() << " does not exist", + ErrorType::BadResourceCreation); + + it->second.name = name; + return true; +} + +bool CConfigurationManager::setConfigurationTokenValue(const CIdentifier& identifier, const CString& value) +{ + std::unique_lock lock(m_mutex); + + auto itConfigurationToken = m_ConfigTokens.find(identifier); + + OV_ERROR_UNLESS_KRF(itConfigurationToken != m_ConfigTokens.end(), "Configuration token " << identifier.str() << " does not exist", + ErrorType::BadResourceCreation); + + itConfigurationToken->second.value = value; + return true; +} + +bool CConfigurationManager::addOrReplaceConfigurationToken(const CString& name, const CString& value) +{ + const CIdentifier oldID = this->lookUpConfigurationTokenIdentifier(name, false); + if (oldID == CIdentifier::undefined()) { return CIdentifier::undefined() != this->createConfigurationToken(name, value); } + return this->setConfigurationTokenValue(oldID, value); +} + +// ---------------------------------------------------------------------------------------------------------------------------- + +CIdentifier CConfigurationManager::lookUpConfigurationTokenIdentifier(const CString& name, const bool recursive) const +{ + std::unique_lock lock(m_mutex); + + auto it = m_ConfigTokens.begin(); + while (it != m_ConfigTokens.end()) + { + if (it->second.name == name) { return it->first; } + ++it; + } + if (recursive && m_parentConfigManager) { return m_parentConfigManager->lookUpConfigurationTokenIdentifier(name, recursive); } + return CIdentifier::undefined(); +} + +CString CConfigurationManager::lookUpConfigurationTokenValue(const CString& name) const +{ + std::unique_lock lock(m_mutex); + + auto it = m_ConfigTokens.begin(); + while (it != m_ConfigTokens.end()) + { + if (it->second.name == name) { return it->second.value; } + ++it; + } + if (m_parentConfigManager) { return m_parentConfigManager->lookUpConfigurationTokenValue(name); } + return ""; +} + +// ---------------------------------------------------------------------------------------------------------------------------- + +bool CConfigurationManager::registerKeywordParser(const CString& keyword, const IConfigurationKeywordExpandCallback& callback) +{ + std::unique_lock lock(m_mutex); + + OV_ERROR_UNLESS_KRF(keyword != CString("") && keyword != CString("core") && keyword != CString("environment"), + "Trying to overwrite internal keyword " << keyword, + ErrorType::BadResourceCreation); + + m_keywordOverrides[keyword] = &callback; + + return true; +} + +bool CConfigurationManager::unregisterKeywordParser(const CString& keyword) +{ + std::unique_lock lock(m_mutex); + + OV_ERROR_UNLESS_KRF(m_keywordOverrides.count(keyword), "Override for keyword [" << keyword << "] was not found", Kernel::ErrorType::ResourceNotFound); + + m_keywordOverrides.erase(keyword); + + return true; +} + +bool CConfigurationManager::unregisterKeywordParser(const IConfigurationKeywordExpandCallback& callback) +{ + std::unique_lock lock(m_mutex); + + auto it = m_keywordOverrides.begin(); + + bool res = false; + while (it != m_keywordOverrides.end()) + { + if (it->second == &callback) + { + m_keywordOverrides.erase(it); + res = true; + break; + } + ++it; + } + + OV_ERROR_UNLESS_KRF(res, "Override for the callback was not found", Kernel::ErrorType::ResourceNotFound); + + return res; +} + +// ---------------------------------------------------------------------------------------------------------------------------- + +CString CConfigurationManager::expand(const CString& expression) const +{ + const std::string value(expression.toASCIIString()); + std::string res; + if (this->internalExpand(value, res)) { return res.c_str(); } + return value.c_str(); +} + +// ---------------------------------------------------------------------------------------------------------------------------- + +CIdentifier CConfigurationManager::getUnusedIdentifier() const +{ + std::unique_lock lock(m_mutex); + + uint64_t id = (uint64_t(rand()) << 32) + uint64_t(rand()); + CIdentifier res; + std::map::const_iterator i; + do + { + id++; + res = CIdentifier(id); + i = m_ConfigTokens.find(res); + } while (i != m_ConfigTokens.end() || res == CIdentifier::undefined()); + return res; +} + +// ---------------------------------------------------------------------------------------------------------------------------- + +enum class ENodeType { Value, NamePrefix, NamePostfix, }; + +bool CConfigurationManager::internalExpand(const std::string& sValue, std::string& result) const +{ + std::stack> children; + children.push(std::make_pair(ENodeType::Value, std::string())); + + std::string prefix; + std::string postfix; + std::string lowerPrefix; + std::string lowerPostfix; + std::string value; + std::string expandedValue; + + for (size_t i = 0; i < sValue.length(); ++i) + { + bool shouldExpand; + + switch (sValue[i]) + { + case '$': + children.push(std::make_pair(ENodeType::NamePrefix, std::string())); + break; + + case '{': + OV_ERROR_UNLESS_KRF(children.top().first == ENodeType::NamePrefix, + "Could not expand token with syntax error while expanding " << sValue, Kernel::ErrorType::BadFileParsing); + children.push(std::make_pair(ENodeType::NamePostfix, std::string())); + break; + + case '}': + OV_ERROR_UNLESS_KRF(children.top().first == ENodeType::NamePostfix, + "Could not expand token with syntax error while expanding " << sValue, Kernel::ErrorType::BadFileParsing); + postfix = children.top().second; + lowerPostfix.resize(postfix.size()); + std::transform(postfix.begin(), postfix.end(), lowerPostfix.begin(), ToLower); + children.pop(); + + prefix = children.top().second; + lowerPrefix.resize(prefix.size()); + std::transform(prefix.begin(), prefix.end(), lowerPrefix.begin(), ToLower); + children.pop(); + + shouldExpand = true; + + if (lowerPrefix.empty()) + { + // value = this->getConfigurationTokenValue(this->lookUpConfigurationTokenIdentifier(postfix.c_str())); + // this->internalGetConfigurationTokenValueFromName(postfix, value); + value = this->lookUpConfigurationTokenValue(postfix.c_str()).toASCIIString(); + } + else if (lowerPrefix == "environment" || lowerPrefix == "env") + { + char* envValue = getenv(postfix.c_str()); + value = (envValue ? envValue : ""); + shouldExpand = false; + } + else if (lowerPrefix == "core") + { + if (lowerPostfix == "random") { value = std::to_string(this->getRandom()); } + else if (lowerPostfix == "index") { value = std::to_string(this->getIndex()); } + else if (lowerPostfix == "time") { value = this->getTime(); } + else if (lowerPostfix == "date") { value = this->getDate(); } + else if (lowerPostfix == "real-time") { value = std::to_string(this->getRealTime()); } + else if (lowerPostfix == "process-id") { value = std::to_string(this->getProcessId()); } + else + { + OV_ERROR_KRF("Could not expand token with " << prefix << " prefix and " << postfix << " postfix while expanding " << sValue, + ErrorType::BadFileParsing); + } + } + else + { + if (m_keywordOverrides.count(lowerPrefix.c_str())) + { + CString overridenValue(""); + + OV_ERROR_UNLESS_KRF((m_keywordOverrides.find(lowerPrefix.c_str())->second)->expand(CString(postfix.c_str()), overridenValue), + "Could not expand $" << lowerPrefix << "{" << lowerPostfix << "}", + ErrorType::BadFileParsing); + + value = overridenValue; + } + else + { + OV_ERROR_UNLESS_KRF(m_parentConfigManager, "Could not expand token with " << prefix << " prefix while expanding " << sValue, + ErrorType::BadFileParsing); + + std::string keyword = "$" + lowerPrefix + "{" + lowerPostfix + "}"; + + value = m_parentConfigManager->expand(CString(keyword.c_str())); + + if (value == sValue) + { + value = ""; + OV_ERROR_KRF("Could not expand token with " << prefix << " prefix while expanding " << sValue, + ErrorType::BadFileParsing); + } + } + } + + if (shouldExpand) + { + OV_ERROR_UNLESS_KRF(this->internalExpand(value, expandedValue), + "Could not expand " << value << " while expanding " << sValue, + ErrorType::BadFileParsing); + + children.top().second += expandedValue; + } + else { children.top().second += value; } + break; + + case '\\': + i++; + OV_ERROR_UNLESS_KRF(i < sValue.length(), + "Could not expand token with unterminated string while expanding " << sValue, + ErrorType::BadFileParsing); + + default: + children.top().second += sValue[i]; + break; + } + } + + /* This will merge all NamePrefix Node on top of the pile into the first which isn't. + * In case of handling an UNC path, pile should look like this, eventually with multiple ENodeType::NamePrefix : + * ENodeType::NamePrefix, value2 + * ENodeType::Value, value1 + * + * This will merge all of them into the Node below, like this : + * ENodeType::Value, value1 + '$' + value2 + ( '$' + value3 ...) + * Using this method, tokens are not reinterpreted, which reduce risks introduced by introducing parser leniency. + */ + while (children.top().first == ENodeType::NamePrefix && children.size() > 1) + { + const std::string topVal = children.top().second; + children.pop(); + children.top().second += "$" + topVal; + } + + OV_ERROR_UNLESS_KRF(children.size() == 1, "Could not expand token with unterminated string while expanding " << sValue, + ErrorType::BadFileParsing); + + result = children.top().second; + + return true; +} + +bool CConfigurationManager::internalExpandOnlyKeyword(const std::string& sKeyword, const std::string& sValue, std::string& sResult, + bool preserveBackslashes = false) const +{ + std::stack> childrens; + childrens.push(std::make_pair(ENodeType::Value, std::string())); + + std::string prefix; + std::string postfix; + std::string lowerPrefix; + std::string lowerPostfix; + std::string value; + std::string expandedValue; + + for (size_t i = 0; i < sValue.length(); ++i) + { + bool shouldExpand; + + switch (sValue[i]) + { + case '$': + childrens.push(std::make_pair(ENodeType::NamePrefix, std::string())); + break; + + case '{': + OV_ERROR_UNLESS_KRF(childrens.top().first == ENodeType::NamePrefix, + "Could not expand token with syntax error while expanding " << sValue, + ErrorType::BadFileParsing); + childrens.push(std::make_pair(ENodeType::NamePostfix, std::string())); + break; + + case '}': + OV_ERROR_UNLESS_KRF(childrens.top().first == ENodeType::NamePostfix, + "Could not expand token with syntax error while expanding " << sValue, + ErrorType::BadFileParsing); + + postfix = childrens.top().second; + childrens.pop(); + + prefix = childrens.top().second; + childrens.pop(); + + shouldExpand = true; + + lowerPrefix = prefix; + lowerPostfix = postfix; + std::transform(lowerPrefix.begin(), lowerPrefix.end(), lowerPrefix.begin(), ToLower); + std::transform(lowerPostfix.begin(), lowerPostfix.end(), lowerPostfix.begin(), ToLower); + + if (lowerPrefix == sKeyword) + { + OV_ERROR_UNLESS_KRF(m_keywordOverrides.count(lowerPrefix.c_str()), + "Could not expand token with " << prefix << " prefix while expanding " << sValue, + ErrorType::BadFileParsing); + + CString overridenValue(""); + + OV_ERROR_UNLESS_KRF((m_keywordOverrides.find(lowerPrefix.c_str())->second)->expand(CString(postfix.c_str()), overridenValue), + "Could not expand $" << lowerPrefix << "{" << lowerPostfix << "}", + ErrorType::BadFileParsing); + + value = overridenValue; + } + else + { + // If the previous token was not something we want to parse we will simply put it back + value = "$" + prefix + "{" + postfix + "}"; + shouldExpand = false; + } + + if (shouldExpand) + { + OV_ERROR_UNLESS_KRF(this->internalExpandOnlyKeyword(sKeyword, value, expandedValue), + "Could not expand " << value << " while expanding " << sValue, + ErrorType::BadFileParsing); + + childrens.top().second += expandedValue; + } + else { childrens.top().second += value; } + break; + + case '\\': + if (preserveBackslashes) { childrens.top().second += sValue[i]; } + i++; + OV_ERROR_UNLESS_KRF(i < sValue.length(), + "Could not expand token with unterminated string while expanding " << sValue, + ErrorType::BadFileParsing); + childrens.top().second += sValue[i]; + break; + + default: + childrens.top().second += sValue[i]; + break; + } + } + + OV_ERROR_UNLESS_KRF(childrens.size() == 1, "Could not expand token with unterminated string while expanding " << sValue, + ErrorType::BadFileParsing); + + sResult = childrens.top().second; + + return true; +} + +bool CConfigurationManager::internalGetConfigurationTokenValueFromName(const std::string& name, std::string& value) const +{ + const CIdentifier tokenID = this->lookUpConfigurationTokenIdentifier(name.c_str(), false); + if (tokenID == CIdentifier::undefined()) + { + OV_ERROR_UNLESS_KRF(m_parentConfigManager, + "Could not expand token [" << name << + "]. This token does not exist. If this is expected behavior, please add \"" << name << + " = \" to your configuration file", + ErrorType::ResourceNotFound); + + const std::string str = std::string("${") + name + ("}"); + value = m_parentConfigManager->expand(str.c_str()); + } + else { value = this->getConfigurationTokenValue(tokenID); } + return true; +} + +CString CConfigurationManager::expandOnlyKeyword(const CString& rKeyword, const CString& expression, const bool preserveBackslashes) const +{ + const std::string value(expression.toASCIIString()); + std::string res; + if (this->internalExpandOnlyKeyword(rKeyword.toASCIIString(), value, res, preserveBackslashes)) { return res.c_str(); } + return value.c_str(); +} + +double CConfigurationManager::expandAsFloat(const CString& expression, const double fallbackValue) const +{ + const CString result = this->expand(expression); + double res; + + try { res = std::stod(result.toASCIIString()); } + catch (const std::exception&) { res = fallbackValue; } + + return res; +} + +int64_t CConfigurationManager::expandAsInteger(const CString& expression, const int64_t fallbackValue) const +{ + const CString result = this->expand(expression); + int64_t res; + + try { res = std::stoll(result.toASCIIString()); } + catch (const std::exception&) { res = fallbackValue; } + + return res; +} + +uint64_t CConfigurationManager::expandAsUInteger(const CString& expression, const uint64_t fallbackValue) const +{ + const CString result = this->expand(expression); + uint64_t res; + + try { res = std::stoull(result.toASCIIString()); } + catch (const std::exception&) { res = fallbackValue; } + + return res; +} + +bool CConfigurationManager::expandAsBoolean(const CString& expression, const bool fallbackValue) const +{ + std::string res = this->expand(expression).toASCIIString(); + std::transform(res.begin(), res.end(), res.begin(), ToLower); + + if (res == "true" || res == "on" || res == "1") { return true; } + if (res == "false" || res == "off" || res == "0") { return false; } + + return fallbackValue; +} + +uint64_t CConfigurationManager::expandAsEnumerationEntryValue(const CString& expression, const CIdentifier& enumTypeID, const uint64_t fallbackValue) const +{ + const CString str = this->expand(expression); + const uint64_t result = this->getTypeManager().getEnumerationEntryValueFromName(enumTypeID, str); + if (result != ULLONG_MAX) { return result; } + + return fallbackValue; +} + +size_t CConfigurationManager::getRandom() { return size_t(System::Math::randomI()); } + +size_t CConfigurationManager::getIndex() const { return m_idx++; } + +CString CConfigurationManager::getTime() +{ + char res[1024]; + time_t rawTime; + + time(&rawTime); + struct tm* timeInfo = localtime(&rawTime); + + sprintf(res, "%02i.%02i.%02i", timeInfo->tm_hour, timeInfo->tm_min, timeInfo->tm_sec); + return res; +} + +CString CConfigurationManager::getDate() +{ + char res[1024]; + time_t rawTime; + + time(&rawTime); + struct tm* timeInfo = localtime(&rawTime); + + sprintf(res, "%04i.%02i.%02i", timeInfo->tm_year + 1900, timeInfo->tm_mon + 1, timeInfo->tm_mday); + return res; +} + +size_t CConfigurationManager::getRealTime() const { return System::Time::getTime() - m_startTime; } + +size_t CConfigurationManager::getProcessId() +{ +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + return size_t(getpid()); +#elif defined TARGET_OS_Windows + return size_t(GetCurrentProcessId()); +#else + #error TODO +#endif +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/configuration/ovkCConfigurationManager.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/configuration/ovkCConfigurationManager.h new file mode 100755 index 0000000..a3b058e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/configuration/ovkCConfigurationManager.h @@ -0,0 +1,74 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +#include +#include +#include + +namespace OpenViBE { +namespace Kernel { +class IConfigurationKeywordExpandCallback; + +typedef struct +{ + CString name; + CString value; +} config_token_t; + +class CConfigurationManager final : public TKernelObject +{ +public: + + CConfigurationManager(const IKernelContext& ctx, IConfigurationManager* parentConfigManager = nullptr); + void clear() override; + bool addConfigurationFromFile(const CString& rFileNameWildCard) override; + CIdentifier createConfigurationToken(const CString& name, const CString& value) override; + bool releaseConfigurationToken(const CIdentifier& identifier) override; + CIdentifier getNextConfigurationTokenIdentifier(const CIdentifier& prevConfigTokenID) const override; + CString getConfigurationTokenName(const CIdentifier& identifier) const override; + CString getConfigurationTokenValue(const CIdentifier& identifier) const override; + bool setConfigurationTokenName(const CIdentifier& identifier, const CString& name) override; + bool setConfigurationTokenValue(const CIdentifier& identifier, const CString& value) override; + bool addOrReplaceConfigurationToken(const CString& name, const CString& value) override; + CIdentifier lookUpConfigurationTokenIdentifier(const CString& name, bool recursive) const override; + CString lookUpConfigurationTokenValue(const CString& name) const override; + bool registerKeywordParser(const CString& keyword, const IConfigurationKeywordExpandCallback& callback) override; + bool unregisterKeywordParser(const CString& keyword) override; + bool unregisterKeywordParser(const IConfigurationKeywordExpandCallback& callback) override; + CString expand(const CString& expression) const override; + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Config_ConfigManager) + CString expandOnlyKeyword(const CString& rKeyword, const CString& expression, bool preserveBackslashes) const override; + double expandAsFloat(const CString& expression, double fallbackValue) const override; + int64_t expandAsInteger(const CString& expression, int64_t fallbackValue) const override; + uint64_t expandAsUInteger(const CString& expression, uint64_t fallbackValue) const override; + bool expandAsBoolean(const CString& expression, bool fallbackValue) const override; + uint64_t expandAsEnumerationEntryValue(const CString& expression, const CIdentifier& enumTypeID, uint64_t fallbackValue) const override; + +protected: + + CIdentifier getUnusedIdentifier() const; + + bool internalExpand(const std::string& sValue, std::string& result) const; + bool internalExpandOnlyKeyword(const std::string& sKeyword, const std::string& sValue, std::string& sResult, bool preserveBackslashes) const; + bool internalGetConfigurationTokenValueFromName(const std::string& name, std::string& value) const; + + IConfigurationManager* m_parentConfigManager = nullptr; + mutable size_t m_idx; + mutable size_t m_startTime; + + static size_t getRandom(); + size_t getIndex() const; + static CString getTime(); + static CString getDate(); + size_t getRealTime() const; + static size_t getProcessId(); + + std::map m_ConfigTokens; + std::map m_keywordOverrides; + + mutable std::recursive_mutex m_mutex; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/error/ovkCErrorManager.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/error/ovkCErrorManager.cpp new file mode 100644 index 0000000..75b2455 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/error/ovkCErrorManager.cpp @@ -0,0 +1,92 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include + +#include "ovkCErrorManager.h" + +// Error manager IError internal implementation +namespace OpenViBE { +namespace Kernel { +class CError final : public IError +{ +public: + + CError(ErrorType type, const char* description, IError* nestedError, const char* filename, const size_t line) + : m_errorType(type), m_nestedError(nestedError), m_description(description), m_location(std::string(filename) + ":" + std::to_string(line)) { } + + ~CError() override { } + + const char* getErrorString() const override { return m_description.c_str(); } + const char* getErrorLocation() const override { return m_location.c_str(); } + ErrorType getErrorType() const override { return m_errorType; } + const IError* getNestedError() const override { return m_nestedError.get(); } + + _IsDerivedFromClass_Final_(IError, OVK_ClassId_Kernel_Error_Error) + +private: + + ErrorType m_errorType; + std::unique_ptr m_nestedError; + std::string m_description; + std::string m_location; +}; + +// Error manager implementation +void CErrorManager::pushErrorAtLocation(const ErrorType type, const char* description, const char* filename, const size_t line) +{ + std::lock_guard lock(m_managerGuard); + const auto lastTopError = m_topError.release(); + m_topError.reset(new CError(type, description, lastTopError, filename, line)); +} + +void CErrorManager::releaseErrors() +{ + std::lock_guard lock(m_managerGuard); + m_topError.reset(nullptr); +} + +bool CErrorManager::hasError() const +{ + std::lock_guard lock(m_managerGuard); + return (m_topError != nullptr); +} + +const IError* CErrorManager::getLastError() const +{ + std::lock_guard lock(m_managerGuard); + return m_topError.get(); +} + +const char* CErrorManager::getLastErrorString() const +{ + std::lock_guard lock(m_managerGuard); + return (m_topError ? m_topError->getErrorString() : ""); +} + +ErrorType CErrorManager::getLastErrorType() const +{ + std::lock_guard lock(m_managerGuard); + return (m_topError ? m_topError->getErrorType() : ErrorType::NoErrorFound); +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/error/ovkCErrorManager.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/error/ovkCErrorManager.h new file mode 100644 index 0000000..c7fbc03 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/error/ovkCErrorManager.h @@ -0,0 +1,60 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +#include +#include + +#include "../ovkTKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class CErrorManager + * \author Charles Garraud (Inria) + * \date 2016-07-13 + * \brief Error manager kernel default implementation + */ +class CErrorManager final : public TKernelObject +{ +public: + + explicit CErrorManager(const IKernelContext& context) : TKernelObject(context), m_topError(nullptr) { } + ~CErrorManager() override { this->releaseErrors(); } + + void pushError(ErrorType type, const char* description) override { this->pushErrorAtLocation(type, description, "NoLocationInfo", 0); } + void pushErrorAtLocation(ErrorType type, const char* description, const char* filename, size_t line) override; + void releaseErrors() override; + bool hasError() const override; + const IError* getLastError() const override; + const char* getLastErrorString() const override; + ErrorType getLastErrorType() const override; + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Error_ErrorManager) + +private: + + mutable std::mutex m_managerGuard; + std::unique_ptr m_topError; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogListenerConsole.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogListenerConsole.cpp new file mode 100755 index 0000000..81707f9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogListenerConsole.cpp @@ -0,0 +1,409 @@ +#include "ovkCLogListenerConsole.h" + +#include +#include + +#if defined TARGET_OS_Windows +#include +#endif + +namespace OpenViBE { +namespace Kernel { + +CLogListenerConsole::CLogListenerConsole(const IKernelContext& ctx, const CString& sApplicationName) + : TKernelObject(ctx), m_color(LogColor_Default), m_applicationName(sApplicationName), m_timeInSeconds(true), m_timePrecision(3), + m_useColor(true) +{ +#if defined TARGET_OS_Windows + SetConsoleOutputCP(CP_UTF8); +#endif +} + +void CLogListenerConsole::configure(const IConfigurationManager& configManager) +{ + m_timeInSeconds = configManager.expandAsBoolean("${Kernel_ConsoleLogTimeInSecond}", true); + m_logWithHexa = configManager.expandAsBoolean("${Kernel_ConsoleLogWithHexa}", false); + m_timePrecision = configManager.expandAsUInteger("${Kernel_ConsoleLogTimePrecision}", 3); + m_useColor = configManager.expandAsBoolean("${Kernel_ConsoleLogUseColor}", true); +} + + +bool CLogListenerConsole::isActive(const ELogLevel level) +{ + const auto itLogLevel = m_activeLevels.find(level); + if (itLogLevel == m_activeLevels.end()) { return true; } + return itLogLevel->second; +} + +bool CLogListenerConsole::activate(const ELogLevel level, const bool active) +{ + m_activeLevels[level] = active; + return true; +} + +bool CLogListenerConsole::activate(const ELogLevel startLevel, const ELogLevel endLevel, const bool active) +{ + for (int i = startLevel; i <= endLevel; ++i) { m_activeLevels[ELogLevel(i)] = active; } + return true; +} + +bool CLogListenerConsole::activate(const bool active) { return activate(LogLevel_First, LogLevel_Last, active); } + +void CLogListenerConsole::log(const CTime value) +{ + this->log(LogColor_PushStateBit); + this->log(LogColor_ForegroundMagenta); + std::cout << value.str(m_timeInSeconds, m_logWithHexa); + this->log(LogColor_PopStateBit); +} + +void CLogListenerConsole::log(const uint64_t value) +{ + this->log(LogColor_PushStateBit); + this->log(LogColor_ForegroundMagenta); + const std::ios_base::fmtflags fmt = std::cout.flags(); + std::cout << std::dec << value; + if (m_logWithHexa) { std::cout << " (0x" << std::hex << value << ")"; } + + std::cout.flags(fmt); + this->log(LogColor_PopStateBit); +} + +void CLogListenerConsole::log(const uint32_t value) +{ + this->log(LogColor_PushStateBit); + this->log(LogColor_ForegroundMagenta); + const std::ios_base::fmtflags fmt = std::cout.flags(); + std::cout << std::dec << value; + if (m_logWithHexa) { std::cout << " (0x" << std::hex << value << ")"; } + std::cout.flags(fmt); + this->log(LogColor_PopStateBit); +} + +void CLogListenerConsole::log(const int64_t value) +{ + this->log(LogColor_PushStateBit); + this->log(LogColor_ForegroundMagenta); + const std::ios_base::fmtflags fmt = std::cout.flags(); + std::cout << std::dec << value; + if (m_logWithHexa) { std::cout << " (0x" << std::hex << value << ")"; } + std::cout.flags(fmt); + this->log(LogColor_PopStateBit); +} + +void CLogListenerConsole::log(const int value) +{ + this->log(LogColor_PushStateBit); + this->log(LogColor_ForegroundMagenta); + const std::ios_base::fmtflags fmt = std::cout.flags(); + std::cout << std::dec << value; + if (m_logWithHexa) { std::cout << " (0x" << std::hex << value << ")"; } + std::cout.flags(fmt); + this->log(LogColor_PopStateBit); +} + +void CLogListenerConsole::log(const double value) +{ + this->log(LogColor_PushStateBit); + this->log(LogColor_ForegroundMagenta); + std::cout << value; + this->log(LogColor_PopStateBit); +} + +void CLogListenerConsole::log(const bool value) +{ + this->log(LogColor_PushStateBit); + this->log(LogColor_ForegroundMagenta); + std::cout << (value ? "true" : "false"); + this->log(LogColor_PopStateBit); +} + +void CLogListenerConsole::log(const CIdentifier& value) +{ + this->log(LogColor_PushStateBit); + this->log(LogColor_ForegroundMagenta); + std::cout << value.str(); + this->log(LogColor_PopStateBit); +} + +void CLogListenerConsole::log(const CString& value) +{ + this->log(LogColor_PushStateBit); + this->log(LogColor_ForegroundMagenta); + std::cout << value; + this->log(LogColor_PopStateBit); +} + +void CLogListenerConsole::log(const std::string& value) +{ + this->log(LogColor_PushStateBit); + this->log(LogColor_ForegroundMagenta); + std::cout << value; + this->log(LogColor_PopStateBit); +} + +void CLogListenerConsole::log(const char* value) { std::cout << value << std::flush; } + +void CLogListenerConsole::log(const ELogLevel level) +{ + this->log(LogColor_PushStateBit); + switch (level) + { + case LogLevel_Debug: this->log(LogColor_ForegroundBlue); + break; + case LogLevel_Benchmark: this->log(LogColor_ForegroundMagenta); + break; + case LogLevel_Trace: this->log(LogColor_ForegroundYellow); + break; + case LogLevel_Info: this->log(LogColor_ForegroundGreen); + break; + case LogLevel_Warning: this->log(LogColor_ForegroundCyan); + break; + case LogLevel_ImportantWarning: + case LogLevel_Error: + case LogLevel_Fatal: this->log(LogColor_ForegroundRed); + break; + default: break; + } + std::cout << toString(level); + this->log(LogColor_PopStateBit); +} + +void CLogListenerConsole::log(const ELogColor color) +{ + if (m_useColor) + { + // Tests 'push state' bit + if (color & LogColor_PushStateBit) { m_colors.push(m_color); } + + // Tests 'pop state' bit + if (color & LogColor_PopStateBit) + { + if (!m_colors.empty()) + { + m_color = m_colors.top(); + m_colors.pop(); + } + else { m_color = LogColor_Default; } + } + + // Tests 'reset' bit + if (color & LogColor_ResetBit) { m_color = LogColor_Default; } + + // Tests 'foreground' bit + if (color & LogColor_ForegroundBit) + { + // Tests 'color' bit + if (color & LogColor_ForegroundColorBit) + { + const ELogColor colorMask = ELogColor(LogColor_ForegroundColorRedBit | LogColor_ForegroundColorGreenBit | LogColor_ForegroundColorBlueBit); + m_color = ELogColor(m_color & (~colorMask)); + m_color = ELogColor(m_color | (color & colorMask) | LogColor_ForegroundBit | LogColor_ForegroundColorBit); + } + + // Test 'light' bit + if (color & LogColor_ForegroundLightBit) + { + const ELogColor lightMask = ELogColor(LogColor_ForegroundLightBit | LogColor_ForegroundLightStateBit); + m_color = ELogColor(m_color & (~lightMask)); + m_color = ELogColor(m_color | (color & lightMask) | LogColor_ForegroundBit); + } + + // Test 'blink' bit + if (color & LogColor_ForegroundBlinkBit) + { + const ELogColor blinkMask = ELogColor(LogColor_ForegroundBlinkBit | LogColor_ForegroundBlinkStateBit); + m_color = ELogColor(m_color & (~blinkMask)); + m_color = ELogColor(m_color | (color & blinkMask) | LogColor_ForegroundBit); + } + + // Test 'bold' bit + if (color & LogColor_ForegroundBoldBit) + { + const ELogColor boldMask = ELogColor(LogColor_ForegroundBoldBit | LogColor_ForegroundBoldStateBit); + m_color = ELogColor(m_color & (~boldMask)); + m_color = ELogColor(m_color | (color & boldMask) | LogColor_ForegroundBit); + } + + // Test 'underline' bit + if (color & LogColor_ForegroundUnderlineBit) + { + const ELogColor underlineMask = ELogColor(LogColor_ForegroundBlinkBit | LogColor_ForegroundBlinkStateBit); + m_color = ELogColor(m_color & (~underlineMask)); + m_color = ELogColor(m_color | (color & underlineMask) | LogColor_ForegroundBit); + } + } + + // Tests 'background' bit + if (color & LogColor_BackgroundBit) + { + // Tests 'color' bit + if (color & LogColor_BackgroundColorBit) + { + const ELogColor colorMask = ELogColor(LogColor_BackgroundColorRedBit | LogColor_BackgroundColorGreenBit | LogColor_BackgroundColorBlueBit); + m_color = ELogColor(m_color & (~colorMask)); + m_color = ELogColor(m_color | (color & colorMask) | LogColor_BackgroundBit | LogColor_BackgroundColorBit); + } + + // Test 'light' bit + if (color & LogColor_BackgroundLightBit) + { + const ELogColor lightMask = ELogColor(LogColor_BackgroundLightBit | LogColor_BackgroundLightStateBit); + m_color = ELogColor(m_color & (~lightMask)); + m_color = ELogColor(m_color | (color & lightMask) | LogColor_BackgroundBit); + } + + // Test 'blink' bit + if (color & LogColor_BackgroundBlinkBit) + { + const ELogColor blinkMask = ELogColor(LogColor_BackgroundBlinkBit | LogColor_BackgroundBlinkStateBit); + m_color = ELogColor(m_color & (~blinkMask)); + m_color = ELogColor(m_color | (color & blinkMask) | LogColor_BackgroundBit); + } + } + + // Finally applies current color + applyColor(); + } +} + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + +void CLogListenerConsole::applyColor() +{ + int gotACommand=0; + + #define _command_separator_ (gotACommand++?";":"") + + std::cout << "\033[00m"; + + if(m_color!=LogColor_Default) + { + std::cout << "\033["; + + if(m_color&LogColor_ForegroundBit) + { + if(m_color&LogColor_ForegroundLightBit && m_color&LogColor_ForegroundLightStateBit) { } // No function to do that + + if(m_color&LogColor_ForegroundBoldBit && m_color&LogColor_ForegroundBoldStateBit) + { + std::cout << _command_separator_ << "01"; + } + + if(m_color&LogColor_ForegroundUnderlineBit && m_color&LogColor_ForegroundUnderlineStateBit) + { + std::cout << _command_separator_ << "04"; + } + + if(m_color&LogColor_ForegroundBlinkBit && m_color&LogColor_ForegroundBlinkStateBit) + { + std::cout << _command_separator_ << "05"; + } + + if(m_color&LogColor_ForegroundColorBit) + { + ELogColor color=ELogColor(m_color&(LogColor_ForegroundBit|LogColor_ForegroundColorBit|LogColor_ForegroundColorRedBit|LogColor_ForegroundColorGreenBit|LogColor_ForegroundColorBlueBit)); + switch(color) + { + case LogColor_ForegroundBlack: std::cout << _command_separator_ << "30"; break; + case LogColor_ForegroundRed: std::cout << _command_separator_ << "31"; break; + case LogColor_ForegroundGreen: std::cout << _command_separator_ << "32"; break; + case LogColor_ForegroundYellow: std::cout << _command_separator_ << "33"; break; + case LogColor_ForegroundBlue: std::cout << _command_separator_ << "34"; break; + case LogColor_ForegroundMagenta: std::cout << _command_separator_ << "35"; break; + case LogColor_ForegroundCyan: std::cout << _command_separator_ << "36"; break; + case LogColor_ForegroundWhite: std::cout << _command_separator_ << "37"; break; + default: break; + } + } + } + + if(m_color&LogColor_BackgroundBit) + { + if(m_color&LogColor_BackgroundColorBit) + { + ELogColor color=ELogColor(m_color&(LogColor_BackgroundBit|LogColor_BackgroundColorBit|LogColor_BackgroundColorRedBit|LogColor_BackgroundColorGreenBit|LogColor_BackgroundColorBlueBit)); + switch(color) + { + case LogColor_BackgroundBlack: std::cout << _command_separator_ << "40"; break; + case LogColor_BackgroundRed: std::cout << _command_separator_ << "41"; break; + case LogColor_BackgroundGreen: std::cout << _command_separator_ << "42"; break; + case LogColor_BackgroundYellow: std::cout << _command_separator_ << "43"; break; + case LogColor_BackgroundBlue: std::cout << _command_separator_ << "44"; break; + case LogColor_BackgroundMagenta: std::cout << _command_separator_ << "45"; break; + case LogColor_BackgroundCyan: std::cout << _command_separator_ << "46"; break; + case LogColor_BackgroundWhite: std::cout << _command_separator_ << "47"; break; + default: break; + } + } + + if(m_color&LogColor_BackgroundLightBit && m_color&LogColor_BackgroundLightStateBit) { } // No function to do that + if(m_color&LogColor_BackgroundBlinkBit && m_color&LogColor_BackgroundBlinkStateBit) { } // No function to do that + } + + std::cout << "m"; + } + + #undef _command_separator_ + +} + +#elif defined TARGET_OS_Windows + +void CLogListenerConsole::applyColor() +{ + WORD attribute = 0; + + if (m_color & LogColor_ForegroundBit) + { + if (m_color & LogColor_ForegroundColorBit) + { + attribute |= ((m_color & LogColor_ForegroundColorRedBit) ? FOREGROUND_RED : 0); + attribute |= ((m_color & LogColor_ForegroundColorGreenBit) ? FOREGROUND_GREEN : 0); + attribute |= ((m_color & LogColor_ForegroundColorBlueBit) ? FOREGROUND_BLUE : 0); + } + else + { + attribute |= FOREGROUND_RED; + attribute |= FOREGROUND_GREEN; + attribute |= FOREGROUND_BLUE; + } + + if (m_color & LogColor_ForegroundLightBit && m_color & LogColor_ForegroundLightStateBit) { attribute |= FOREGROUND_INTENSITY; } + if (m_color & LogColor_ForegroundBoldBit && m_color & LogColor_ForegroundBoldStateBit) { } // No function to do that + if (m_color & LogColor_ForegroundUnderlineBit && m_color & LogColor_ForegroundUnderlineStateBit) { attribute |= COMMON_LVB_UNDERSCORE; } + if (m_color & LogColor_ForegroundBlinkBit && m_color & LogColor_ForegroundBlinkStateBit) { } // No function to do that + } + else + { + attribute |= FOREGROUND_RED; + attribute |= FOREGROUND_GREEN; + attribute |= FOREGROUND_BLUE; + } + + if (m_color & LogColor_BackgroundBit) + { + if (m_color & LogColor_BackgroundColorBit) + { + attribute |= ((m_color & LogColor_BackgroundColorRedBit) ? BACKGROUND_RED : 0); + attribute |= ((m_color & LogColor_BackgroundColorGreenBit) ? BACKGROUND_GREEN : 0); + attribute |= ((m_color & LogColor_BackgroundColorBlueBit) ? BACKGROUND_BLUE : 0); + } + + if (m_color & LogColor_BackgroundLightBit && m_color & LogColor_BackgroundLightStateBit) { attribute |= BACKGROUND_INTENSITY; } + + if (m_color & LogColor_BackgroundBlinkBit && m_color & LogColor_BackgroundBlinkStateBit) + { + // No function to do that + } + } + + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), attribute); +} + +#else +void CLogListenerConsole::applyColor() { } +#endif + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogListenerConsole.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogListenerConsole.h new file mode 100644 index 0000000..8a06bbf --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogListenerConsole.h @@ -0,0 +1,54 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +#include +#include + +namespace OpenViBE { +namespace Kernel { + +class CLogListenerConsole final : public TKernelObject +{ +public: + + CLogListenerConsole(const IKernelContext& ctx, const CString& sApplicationName); + bool isActive(const ELogLevel level) override; + bool activate(const ELogLevel level, const bool active) override; + bool activate(const ELogLevel startLevel, const ELogLevel endLevel, const bool active) override; + bool activate(const bool active) override; + + void configure(const IConfigurationManager& configManager); + void log(const CTime value) override; + void log(const uint64_t value) override; + void log(const uint32_t value) override; + void log(const int64_t value) override; + void log(const int value) override; + void log(const double value) override; + void log(const bool value) override; + void log(const CIdentifier& value) override; + void log(const CString& value) override; + void log(const std::string& value) override; + void log(const char* value) override; + void log(const ELogLevel level) override; + void log(const ELogColor color) override; + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Log_LogListenerConsole) + +protected: + + void applyColor(); + + std::map m_activeLevels; + std::stack m_colors; + ELogColor m_color; + CString m_applicationName; + + bool m_logWithHexa = false; + bool m_timeInSeconds = false; + uint64_t m_timePrecision = 0; + bool m_useColor = false; +}; + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogListenerFile.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogListenerFile.cpp new file mode 100644 index 0000000..0ef0c55 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogListenerFile.cpp @@ -0,0 +1,56 @@ +#include "ovkCLogListenerFile.h" + +#include +#include + +#include + +namespace OpenViBE { +namespace Kernel { + +CLogListenerFile::CLogListenerFile(const IKernelContext& ctx, const CString& applicationName, const CString& logFilename) + : TKernelObject(ctx), m_applicationName(applicationName), m_logFilename(logFilename) +{ + // Create the path to the log file + FS::Files::createParentPath(logFilename.toASCIIString()); + + FS::Files::openFStream(m_fsFileStream, logFilename.toASCIIString(), std::ios_base::out); + + if (!m_fsFileStream.is_open()) + { + std::cout << "[ ERR ] Error while creating FileLogListener into '" << logFilename << "'" << std::endl; + return; + } + m_fsFileStream << std::flush; +} + +void CLogListenerFile::configure(const IConfigurationManager& configurationManager) +{ + m_timeInSeconds = configurationManager.expandAsBoolean("${Kernel_FileLogTimeInSecond}", false); + m_logWithHexa = configurationManager.expandAsBoolean("${Kernel_FileLogWithHexa}", true); + m_timePrecision = configurationManager.expandAsUInteger("${Kernel_FileLogTimePrecision}", 3); +} + +bool CLogListenerFile::isActive(const ELogLevel level) +{ + const auto it = m_activeLevels.find(level); + if (it == m_activeLevels.end()) { return true; } + return it->second; +} + +bool CLogListenerFile::activate(const ELogLevel level, const bool active) +{ + m_activeLevels[level] = active; + return true; +} + +bool CLogListenerFile::activate(const ELogLevel startLevel, const ELogLevel endLevel, const bool active) +{ + for (int i = startLevel; i <= endLevel; ++i) { m_activeLevels[ELogLevel(i)] = active; } + return true; +} + +bool CLogListenerFile::activate(const bool active) { return activate(LogLevel_First, LogLevel_Last, active); } + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogListenerFile.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogListenerFile.h new file mode 100644 index 0000000..246c5e7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogListenerFile.h @@ -0,0 +1,68 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +#include +#include +#include +#include + +namespace OpenViBE { +namespace Kernel { + +class CLogListenerFile final : public TKernelObject +{ +public: + + CLogListenerFile(const IKernelContext& ctx, const CString& applicationName, const CString& logFilename); + ~CLogListenerFile() override { m_fsFileStream.close(); } + bool isActive(const ELogLevel level) override; + bool activate(const ELogLevel level, const bool active) override; + bool activate(const ELogLevel startLevel, const ELogLevel endLevel, const bool active) override; + bool activate(const bool active) override; + + void configure(const IConfigurationManager& configurationManager); + void log(const CTime value) override { m_fsFileStream << value.str(m_timeInSeconds, m_logWithHexa); } + void log(const uint64_t value) override { logInteger(value); } + void log(const uint32_t value) override { logInteger(value); } + void log(const int64_t value) override { logInteger(value); } + void log(const int value) override { logInteger(value); } + void log(const double value) override { m_fsFileStream << value; } + void log(const bool value) override { m_fsFileStream << (value ? "true" : "false"); } + void log(const CIdentifier& value) override { m_fsFileStream << value.str(); } + void log(const CString& value) override { m_fsFileStream << value << std::flush; } + void log(const std::string& value) override { m_fsFileStream << value << std::flush; } + void log(const char* value) override { m_fsFileStream << value << std::flush; } + void log(const ELogLevel level) override { m_fsFileStream << toString(level); } + void log(const ELogColor /*color*/) override { } + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Log_LogListenerFile) + +protected: + + std::map m_activeLevels; + CString m_applicationName; + CString m_logFilename; + std::fstream m_fsFileStream; + + // Log Settings + bool m_timeInSeconds = true; + bool m_logWithHexa = false; + uint64_t m_timePrecision = 3; + +private: + template + void logInteger(T value) + { + m_fsFileStream << value << " "; + if (m_logWithHexa) + { + m_fsFileStream.setf(std::ios::hex); + m_fsFileStream << "(" << value << ")"; + m_fsFileStream.unsetf(std::ios::hex); + } + } +}; + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogManager.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogManager.cpp new file mode 100755 index 0000000..719d6af --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogManager.cpp @@ -0,0 +1,86 @@ +#include "ovkCLogManager.h" + +namespace OpenViBE { +namespace Kernel { + +bool CLogManager::isActive(const ELogLevel level) +{ + const auto it = m_activeLevels.find(level); + if (it == m_activeLevels.end()) { return true; } + return it->second; +} + +bool CLogManager::activate(const ELogLevel level, const bool active) +{ + m_activeLevels[level] = active; + return true; +} + +bool CLogManager::activate(const ELogLevel startLevel, const ELogLevel endLevel, const bool active) +{ + for (int i = startLevel; i <= endLevel; ++i) { m_activeLevels[ELogLevel(i)] = active; } + return true; +} + +void CLogManager::log(const char* value) +{ + logForEach(value); + { + GRAB_OWNERSHIP; + + std::string copy(value); + if (copy.length() > 0 && copy[copy.length() - 1] == '\n') + { + // we are done, release + m_owner = std::thread::id(); + m_condition.notify_one(); + } + } +} + +void CLogManager::log(const ELogLevel level) +{ + { + GRAB_OWNERSHIP; + m_currentLogLevel = level; + } + + logForEach(level); +} + +bool CLogManager::addListener(ILogListener* listener) +{ + std::unique_lock lock(m_mutex); + + if (listener == nullptr) { return false; } + + auto it = m_listeners.begin(); + while (it != m_listeners.end()) + { + if ((*it) == listener) { return false; } + ++it; + } + + m_listeners.push_back(listener); + return true; +} + +bool CLogManager::removeListener(ILogListener* listener) +{ + std::unique_lock lock(m_mutex); + + auto it = m_listeners.begin(); + while (it != m_listeners.end()) + { + if ((*it) == listener) + { + m_listeners.erase(it); + return true; // due to constraint in addListener(), listener can be in the array only once, so we can return + } + ++it; + } + return false; +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogManager.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogManager.h new file mode 100755 index 0000000..8a3103f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/log/ovkCLogManager.h @@ -0,0 +1,75 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +#include +#include + +#include +#include +#include + +namespace OpenViBE { +namespace Kernel { + +class CLogManager final : public TKernelObject +{ +public: + + explicit CLogManager(const IKernelContext& ctx) : TKernelObject(ctx) {} + bool isActive(const ELogLevel level) override; + bool activate(const ELogLevel level, const bool active) override; + bool activate(const ELogLevel startLevel, const ELogLevel endLevel, const bool active) override; + bool activate(const bool active) override { return activate(LogLevel_First, LogLevel_Last, active); } + void log(const CTime value) override { logForEach(value); } + void log(const uint64_t value) override { logForEach(value); } + void log(const uint32_t value) override { logForEach(value); } + void log(const int64_t value) override { logForEach(value); } + void log(const int value) override { logForEach(value); } + void log(const double value) override { logForEach(value); } + void log(const bool value) override { logForEach(value); } + void log(const CIdentifier& value) override { logForEach(value); } + void log(const CString& value) override { log(value.toASCIIString()); } + void log(const std::string& value) override { log(value.c_str()); } + void log(const char* value) override; + void log(const ELogLevel level) override; + void log(const ELogColor color) override { logForEach(color); } + bool addListener(ILogListener* listener) override; + bool removeListener(ILogListener* listener) override; + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Log_LogManager) + +protected: + + // This macro waits until m_oHolder is either the current thread id or unassigned +#define GRAB_OWNERSHIP std::unique_lock lock(m_mutex); \ + m_condition.wait(lock, [this]() { return (this->m_owner == std::thread::id() || this->m_owner == std::this_thread::get_id() ); } ); \ + m_owner = std::this_thread::get_id(); + + template + void logForEach(T tValue) + { + GRAB_OWNERSHIP; + + if (m_currentLogLevel != LogLevel_None && this->isActive(m_currentLogLevel)) + { + for (auto i = m_listeners.begin(); i != m_listeners.end(); ++i) { if ((*i)->isActive(m_currentLogLevel)) { (*i)->log(tValue); } } + } + } + + std::vector m_listeners; + std::map m_activeLevels; + ELogLevel m_currentLogLevel = LogLevel_Info; + + // Variables to make sure only one thread writes to the LogManager at a time. + // Concurrency control operating logic: + // Calling log() will wait until it obtains logmanager ownership for the calling thread + // Only thread having the ownership can write to the log + // After a thread logs an entry ending in an EOL character, the ownership is freed. + std::mutex m_mutex; + std::condition_variable m_condition; + std::thread::id m_owner; +}; + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/metabox/ovkCMetaboxManager.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/metabox/ovkCMetaboxManager.cpp new file mode 100755 index 0000000..252d574 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/metabox/ovkCMetaboxManager.cpp @@ -0,0 +1,131 @@ +#include "ovkCMetaboxManager.h" + +#include + +#include +#include + +#include "ovp_global_defines.h" +#include "ovkCMetaboxObjectDesc.h" + +namespace OpenViBE { +namespace Kernel { +class CMetaboxManagerEntryEnumeratorCallBack final : public TKernelObject, public FS::IEntryEnumeratorCallBack +{ +public: + + CMetaboxManagerEntryEnumeratorCallBack(const IKernelContext& ctx, CMetaboxManager& metaboxManager) + : TKernelObject(ctx), m_manager(metaboxManager) { m_n = 0; } + + bool callback(FS::IEntryEnumerator::IEntry& rEntry, FS::IEntryEnumerator::IAttributes& rAttributes) override + { + if (rAttributes.isFile()) + { + const char* fullFileName = rEntry.getName(); + + CIdentifier scenarioID, metaboxId, metaboxHash; + this->getKernelContext().getScenarioManager(). + importScenarioFromFile(scenarioID, OV_ScenarioImportContext_OnLoadMetaboxImport, fullFileName); + if (scenarioID != CIdentifier::undefined()) + { + IScenario& metaboxScenario = this->getKernelContext().getScenarioManager().getScenario(scenarioID); + const bool isValid = metaboxId.fromString(metaboxScenario.getAttributeValue(OVP_AttributeId_Metabox_ID)); + if (isValid && metaboxScenario.getAttributeValue(OV_AttributeId_Scenario_Name) != CString()) + { + const bool hasHash = metaboxHash.fromString(metaboxScenario.getAttributeValue(OV_AttributeId_Scenario_MetaboxHash)); + if (!hasHash) + { + this->getKernelContext().getLogManager() << LogLevel_Warning << "The metabox " << metaboxId.str() << + " has no Hash in the scenario " << fullFileName << "\n"; + } + m_manager.setMetaboxFilePath(metaboxId, CString(fullFileName)); + m_manager.setMetaboxHash(metaboxId, metaboxHash); + m_manager.setMetaboxObjectDesc(metaboxId, new Metabox::CMetaboxObjectDesc(metaboxId.str().c_str(), metaboxScenario)); + m_n++; + } + else + { + this->getKernelContext().getLogManager() << LogLevel_Warning << "The metabox file " << fullFileName << + " is missing elements. Please check it.\n"; + } + } + this->getKernelContext().getScenarioManager().releaseScenario(scenarioID); + } + return true; + } + + size_t resetMetaboxCount() + { + const size_t res = m_n; + m_n = 0; + return res; + } + + _IsDerivedFromClass_Final_(TKernelObject, CIdentifier::undefined()) +protected: + CMetaboxManager& m_manager; + size_t m_n; +}; + + +CMetaboxManager::CMetaboxManager(const IKernelContext& ctx) : TKernelObject(ctx) +{ + this->TKernelObject::getScenarioManager().registerScenarioImporter( + OV_ScenarioImportContext_OnLoadMetaboxImport, ".mxb", OVP_GD_ClassId_Algorithm_XMLScenarioImporter); + this->TKernelObject::getScenarioManager().registerScenarioImporter( + OV_ScenarioImportContext_OnLoadMetaboxImport, ".xml", OVP_GD_ClassId_Algorithm_XMLScenarioImporter); +} + +bool CMetaboxManager::addMetaboxesFromFiles(const CString& fileNameWildCard) +{ + this->getLogManager() << LogLevel_Info << "Adding metaboxes from [" << fileNameWildCard << "]\n"; + + CMetaboxManagerEntryEnumeratorCallBack callBack(this->getKernelContext(), *this); //, m_pluginModules, m_pluginObjectDescs, haveAllPluginsLoadedCorrectly); + FS::IEntryEnumerator* entryEnumerator = createEntryEnumerator(callBack); + std::stringstream ss(fileNameWildCard.toASCIIString()); + std::string path; + while (getline(ss, path, ';')) + { + bool result = false; // Used to output imported metabox count + CString ext(""); + while ((ext = this->getScenarioManager().getNextScenarioImporter(OV_ScenarioImportContext_OnLoadMetaboxImport, ext)) != CString("")) + { + result |= entryEnumerator->enumerate((path + "*" + ext.toASCIIString()).c_str()); + } + if (result) { this->getLogManager() << LogLevel_Info << "Added " << callBack.resetMetaboxCount() << " metaboxes from [" << path << "]\n"; } + } + entryEnumerator->release(); + + return true; +} + +CIdentifier CMetaboxManager::getNextMetaboxObjectDescIdentifier(const CIdentifier& previousID) const +{ + if (m_objectDesc.empty()) { return CIdentifier::undefined(); } + if (previousID == CIdentifier::undefined()) { return m_objectDesc.begin()->first; } + + const auto result = m_objectDesc.find(previousID); + if (result == m_objectDesc.end() || std::next(result, 1) == m_objectDesc.end()) { return CIdentifier::undefined(); } + return std::next(result, 1)->first; +} + +const Plugins::IPluginObjectDesc* CMetaboxManager::getMetaboxObjectDesc(const CIdentifier& metaboxID) const +{ + const auto result = m_objectDesc.find(metaboxID); + return result != m_objectDesc.end() ? result->second : nullptr; +} + +CString CMetaboxManager::getMetaboxFilePath(const CIdentifier& metaboxID) const +{ + const auto resultIt = m_filepath.find(metaboxID); + return resultIt != m_filepath.end() ? resultIt->second : CString(); +} + +CIdentifier CMetaboxManager::getMetaboxHash(const CIdentifier& metaboxID) const +{ + const auto resultIt = m_hash.find(metaboxID); + return resultIt != m_hash.end() ? resultIt->second : CIdentifier::undefined(); +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/metabox/ovkCMetaboxManager.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/metabox/ovkCMetaboxManager.h new file mode 100755 index 0000000..e1666ef --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/metabox/ovkCMetaboxManager.h @@ -0,0 +1,31 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +#include + +namespace OpenViBE { +namespace Kernel { +class CMetaboxManager final : public TKernelObject +{ +public: + explicit CMetaboxManager(const IKernelContext& ctx); + ~CMetaboxManager() override { for (auto& desc : m_objectDesc) { delete desc.second; } } + bool addMetaboxesFromFiles(const CString& fileNameWildCard) override; + CIdentifier getNextMetaboxObjectDescIdentifier(const CIdentifier& previousID) const override; + const Plugins::IPluginObjectDesc* getMetaboxObjectDesc(const CIdentifier& metaboxID) const override; + void setMetaboxObjectDesc(const CIdentifier& metaboxID, Plugins::IPluginObjectDesc* metaboxDesc) override { m_objectDesc[metaboxID] = metaboxDesc; } + CString getMetaboxFilePath(const CIdentifier& metaboxID) const override; + void setMetaboxFilePath(const CIdentifier& metaboxID, const CString& filePath) override { m_filepath[metaboxID] = filePath; } + CIdentifier getMetaboxHash(const CIdentifier& metaboxID) const override; + void setMetaboxHash(const CIdentifier& metaboxID, const CIdentifier& hash) override { m_hash[metaboxID] = hash; } + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Metaboxes_MetaboxManager) + +protected: + std::map m_objectDesc; + std::map m_filepath; + std::map m_hash; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/metabox/ovkCMetaboxObjectDesc.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/metabox/ovkCMetaboxObjectDesc.cpp new file mode 100755 index 0000000..cd36833 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/metabox/ovkCMetaboxObjectDesc.cpp @@ -0,0 +1,71 @@ +#include "ovkCMetaboxObjectDesc.h" + +namespace OpenViBE { +namespace Metabox { + +CMetaboxObjectDesc::CMetaboxObjectDesc(const CString& rMetaboxDescriptor, Kernel::IScenario& metaboxScenario) + : m_metaboxDesc(rMetaboxDescriptor) + , m_name(metaboxScenario.getAttributeValue(OV_AttributeId_Scenario_Name)) + , m_authorName(metaboxScenario.getAttributeValue(OV_AttributeId_Scenario_Author)) + , m_authorCompanyName(metaboxScenario.getAttributeValue(OV_AttributeId_Scenario_Company)) + , m_shortDesc(metaboxScenario.getAttributeValue(OV_AttributeId_Scenario_ShortDescription)) + , m_detailedDesc(metaboxScenario.getAttributeValue(OV_AttributeId_Scenario_DetailedDescription)) + , m_category(metaboxScenario.getAttributeValue(OV_AttributeId_Scenario_Category)) + , m_version(metaboxScenario.getAttributeValue(OV_AttributeId_Scenario_Version)) + , m_stockItemName("") + , m_addedSoftwareVersion(metaboxScenario.getAttributeValue(OV_AttributeId_Scenario_AddedSoftwareVersion)) + , m_updatedSoftwareVersion(metaboxScenario.getAttributeValue(OV_AttributeId_Scenario_UpdatedSoftwareVersion)) + , m_metaboxID(metaboxScenario.getAttributeValue(OVP_AttributeId_Metabox_ID)) +{ + for (size_t scenarioInputIdx = 0; scenarioInputIdx < metaboxScenario.getInputCount(); ++scenarioInputIdx) + { + CString name; + CIdentifier typeID; + CIdentifier id; + + metaboxScenario.getInputType(scenarioInputIdx, typeID); + metaboxScenario.getInputName(scenarioInputIdx, name); + metaboxScenario.getInterfacorIdentifier(Kernel::EBoxInterfacorType::Input, scenarioInputIdx, id); + + m_inputs.push_back(io_stream_t(name, typeID, id)); + } + + for (size_t scenarioOutputIdx = 0; scenarioOutputIdx < metaboxScenario.getOutputCount(); ++scenarioOutputIdx) + { + CString name; + CIdentifier typeID; + CIdentifier id; + + metaboxScenario.getOutputType(scenarioOutputIdx, typeID); + metaboxScenario.getOutputName(scenarioOutputIdx, name); + metaboxScenario.getInterfacorIdentifier(Kernel::EBoxInterfacorType::Output, scenarioOutputIdx, id); + + m_outputs.push_back(io_stream_t(name, typeID, id)); + } + + for (size_t scenarioSettingIdx = 0; scenarioSettingIdx < metaboxScenario.getSettingCount(); ++scenarioSettingIdx) + { + CString name; + CIdentifier typeID; + CString defaultValue; + CIdentifier id; + + metaboxScenario.getSettingName(scenarioSettingIdx, name); + metaboxScenario.getSettingType(scenarioSettingIdx, typeID); + metaboxScenario.getSettingDefaultValue(scenarioSettingIdx, defaultValue); + metaboxScenario.getInterfacorIdentifier(Kernel::EBoxInterfacorType::Setting, scenarioSettingIdx, id); + + m_settings.push_back(setting_t(name, typeID, defaultValue, id)); + } +} + +bool CMetaboxObjectDesc::getBoxPrototype(Kernel::IBoxProto& prototype) const +{ + for (const auto& input : m_inputs) { prototype.addInput(input.m_name, input.m_typeID, input.m_id); } + for (const auto& output : m_outputs) { prototype.addOutput(output.m_name, output.m_typeID, output.m_id); } + for (const auto& setting : m_settings) { prototype.addSetting(setting.m_name, setting.m_typeID, setting.m_defaultValue, false, setting.m_id); } + return true; +} + +} // namespace Metabox +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/metabox/ovkCMetaboxObjectDesc.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/metabox/ovkCMetaboxObjectDesc.h new file mode 100755 index 0000000..3a0a5d7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/metabox/ovkCMetaboxObjectDesc.h @@ -0,0 +1,94 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +#include + +namespace OpenViBE { +namespace Metabox { + +/** + * \brief The CMetaboxObjectDesc virtual BoxAlgorithmDesc for metaboxes + * + * This class provides a virtual algorithm descriptor for metaboxes. Each metabox-scenario + * will result in one of these descriptors. The prototype is created from scenario inputs, + * outputs and settings. + * + * Variables such as name, author etc are pulled from scenario information. + */ +class CMetaboxObjectDesc final : virtual public IMetaboxObjectDesc +{ +public: + CMetaboxObjectDesc() { } + + CMetaboxObjectDesc(const CString& rMetaboxDescriptor, Kernel::IScenario& metaboxScenario); + void release() override { } + CString getMetaboxDescriptor() const override { return m_metaboxDesc; } + CString getName() const override { return m_name; } + CString getAuthorName() const override { return m_authorName; } + CString getAuthorCompanyName() const override { return m_authorCompanyName; } + CString getShortDescription() const override { return m_shortDesc; } + CString getDetailedDescription() const override { return m_detailedDesc; } + CString getCategory() const override { return m_category; } + CString getVersion() const override { return m_version; } + CString getStockItemName() const override { return m_stockItemName; } + CString getAddedSoftwareVersion() const override { return m_addedSoftwareVersion; } + CString getUpdatedSoftwareVersion() const override { return m_updatedSoftwareVersion; } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_Metabox; } + Plugins::IPluginObject* create() override { return nullptr; } + + // Handling of the virtual prototype + + // Since we have to construct a prototype on the fly, the special Metabox descriptor + // will also hold the information about the settings, inputs and outputs of the box + typedef struct SStream + { + SStream() : m_name(""), m_typeID(CIdentifier::undefined()), m_id(CIdentifier::undefined()) {} + + SStream(const CString& name, const CIdentifier& typeID, const CIdentifier& identifier) + : m_name(name), m_typeID(typeID), m_id(identifier) {} + + CString m_name; + CIdentifier m_typeID = CIdentifier::undefined(); + CIdentifier m_id = CIdentifier::undefined(); + } io_stream_t; + + typedef struct SSetting + { + SSetting() + : m_name(""), m_typeID(CIdentifier::undefined()), m_defaultValue(""), m_id(CIdentifier::undefined()) {} + + SSetting(const CString& name, const CIdentifier& typeID, const CString& value, const CIdentifier& id) + : m_name(name), m_typeID(typeID), m_defaultValue(value), m_id(id) { } + + CString m_name; + CIdentifier m_typeID = CIdentifier::undefined(); + CString m_defaultValue; + CIdentifier m_id = CIdentifier::undefined(); + } setting_t; + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override; + + _IsDerivedFromClass_Final_(IMetaboxObjectDesc, OVP_ClassId_BoxAlgorithm_MetaboxDesc) + +private: + CString m_metaboxDesc; + + CString m_name; + CString m_authorName; + CString m_authorCompanyName; + CString m_shortDesc; + CString m_detailedDesc; + CString m_category; + CString m_version; + CString m_stockItemName; + CString m_addedSoftwareVersion; + CString m_updatedSoftwareVersion; + CString m_metaboxID; + + std::vector m_inputs; + std::vector m_outputs; + std::vector m_settings; +}; +} // namespace Metabox +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCConfigurable.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCConfigurable.h new file mode 100644 index 0000000..f9d336a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCConfigurable.h @@ -0,0 +1,19 @@ +#pragma once + +#include "ovkTKernelObject.h" +#include "ovkTConfigurable.h" + +namespace OpenViBE { +namespace Kernel { +typedef TBaseConfigurable> configurable; + +class CConfigurable final : public configurable +{ +public: + + explicit CConfigurable(const IKernelContext& ctx) : TBaseConfigurable>(ctx) { } + + _IsDerivedFromClass_Final_(configurable, OVK_ClassId_Kernel_Configurable) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCKernelContext.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCKernelContext.cpp new file mode 100755 index 0000000..f1409ef --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCKernelContext.cpp @@ -0,0 +1,316 @@ +#include "ovkCKernelContext.h" +#include "ovkCKernelObjectFactory.h" +#include "ovkCTypeManager.h" + +#include + +#include "algorithm/ovkCAlgorithmManager.h" +#include "configuration/ovkCConfigurationManager.h" +#include "player/ovkCPlayerManager.h" +#include "plugins/ovkCPluginManager.h" +#include "metabox/ovkCMetaboxManager.h" +#include "scenario/ovkCScenarioManager.h" +#include "log/ovkCLogManager.h" +#include "log/ovkCLogListenerConsole.h" +#include "log/ovkCLogListenerFile.h" +#include "error/ovkCErrorManager.h" + +#include +#include +#include +#include +#include + +#include + +namespace OpenViBE { +namespace Kernel { + +CKernelContext::CKernelContext(const IKernelContext* masterKernelCtx, const CString& applicationName, const CString& configFile) + : m_masterKernelCtx(masterKernelCtx ? *masterKernelCtx : *this), m_algorithmManager(nullptr), m_configManager(nullptr), + m_kernelObjectFactory(nullptr), m_playerManager(nullptr), m_pluginManager(nullptr), m_metaboxManager(nullptr), m_scenarioManager(nullptr), + m_typeManager(nullptr), m_logManager(nullptr), m_errorManager(nullptr), m_applicationName(applicationName), m_configFile(configFile), + m_logListenerConsole(nullptr), m_logListenerFile(nullptr) {} + +CKernelContext::~CKernelContext() { this->uninitialize(); } + +bool CKernelContext::initialize(const char* const* tokenList, size_t nToken) +{ + std::map initializationTokens; + const auto tokens = tokenList; + while (tokens && nToken > 0) + { + const auto key = tokenList++; + const auto value = tokenList++; + nToken--; + initializationTokens[*key] = *value; + } + + m_errorManager.reset(new CErrorManager(m_masterKernelCtx)); + + m_kernelObjectFactory.reset(new CKernelObjectFactory(m_masterKernelCtx)); + + m_logManager.reset(new CLogManager(m_masterKernelCtx)); + m_logManager->activate(true); + + m_configManager.reset(new CConfigurationManager(m_masterKernelCtx)); + // We create the configuration manager very soon to be able to deactivate the console log listener + if (initializationTokens.count("Kernel_SilentConsole")) + { + m_configManager->createConfigurationToken("Kernel_SilentConsole", initializationTokens.at("Kernel_SilentConsole").c_str()); + } + + if (!m_configManager->expandAsBoolean("${Kernel_SilentConsole}", false)) + { + m_logListenerConsole.reset(new CLogListenerConsole(m_masterKernelCtx, m_applicationName)); + m_logListenerConsole->activate(false); + m_logListenerConsole->activate(LogLevel_Info, LogLevel_Last, true); + this->getLogManager().addListener(m_logListenerConsole.get()); + } + + + m_configManager->createConfigurationToken("ApplicationName", m_applicationName); + m_configManager->createConfigurationToken("Path_UserData", Directories::getUserDataDir()); + m_configManager->createConfigurationToken("Path_Log", Directories::getLogDir()); + m_configManager->createConfigurationToken("Path_Tmp", "${Path_UserData}/tmp"); + m_configManager->createConfigurationToken("Path_Lib", Directories::getLibDir()); + m_configManager->createConfigurationToken("Path_Bin", Directories::getBinDir()); + m_configManager->createConfigurationToken("Path_Data", Directories::getDataDir()); + +#if defined TARGET_OS_Windows + m_configManager->createConfigurationToken("OperatingSystem", "Windows"); +#elif defined TARGET_OS_Linux + m_configManager->createConfigurationToken("OperatingSystem", "Linux"); +#elif defined TARGET_OS_MacOS + m_configManager->createConfigurationToken("OperatingSystem", "MacOS"); +#else + m_configManager->createConfigurationToken("OperatingSystem", "Unknown"); +#endif + + m_configManager->createConfigurationToken("Kernel_PluginsPatternMacOS", "libopenvibe-plugins-*.dylib"); + m_configManager->createConfigurationToken("Kernel_PluginsPatternLinux", "libopenvibe-plugins-*.so"); + m_configManager->createConfigurationToken("Kernel_PluginsPatternWindows", "openvibe-plugins-*.dll"); + m_configManager->createConfigurationToken("Kernel_Plugins", "${Path_Lib}/${Kernel_PluginsPattern${OperatingSystem}}"); + + m_configManager->createConfigurationToken("Kernel_Metabox", "${Path_Data}/metaboxes/;${Path_UserData}/metaboxes/"); + + m_configManager->createConfigurationToken("Kernel_MainLogLevel", "Debug"); + m_configManager->createConfigurationToken("Kernel_ConsoleLogLevel", "Information"); + m_configManager->createConfigurationToken("Kernel_FileLogLevel", "Debug"); + m_configManager->createConfigurationToken("Kernel_PlayerFrequency", "128"); + // Add this two tokens to be used to know what documentation should be loaded + m_configManager->createConfigurationToken("Brand_Name", BRAND_NAME); + m_configManager->createConfigurationToken("Application_Name", OV_PROJECT_NAME); + m_configManager->createConfigurationToken("Application_Version", OV_VERSION_MAJOR "." OV_VERSION_MINOR "." OV_VERSION_PATCH); + + for (auto& token : initializationTokens) { m_configManager->addOrReplaceConfigurationToken(token.first.c_str(), token.second.c_str()); } + + this->getLogManager() << LogLevel_Info << "Adding kernel configuration file [" << m_configFile << "]\n"; + + OV_ERROR_UNLESS_KRF(m_configManager->addConfigurationFromFile(m_configFile), + "Problem parsing config file [" << m_configFile << "]", Kernel::ErrorType::Internal); + + CString pathTmp = m_configManager->expand("${Path_UserData}"); + FS::Files::createPath(pathTmp.toASCIIString()); + pathTmp = m_configManager->expand("${Path_Tmp}"); + FS::Files::createPath(pathTmp.toASCIIString()); + pathTmp = m_configManager->expand("${Path_Log}"); + FS::Files::createPath(pathTmp); + const CString logFile = pathTmp + "/openvibe-" + m_applicationName + ".log"; + + // We do this here to allow user to set the Path_Log in the .conf. The downside is that earlier log messages will not appear in the file log. + m_logListenerFile.reset(new CLogListenerFile(m_masterKernelCtx, m_applicationName, logFile)); + m_logListenerFile->activate(true); + this->getLogManager().addListener(m_logListenerFile.get()); + + const ELogLevel mainLogLevel = this->earlyGetLogLevel(m_configManager->expand("${Kernel_MainLogLevel}")); + const ELogLevel consoleLogLevel = this->earlyGetLogLevel(m_configManager->expand("${Kernel_ConsoleLogLevel}")); + const ELogLevel fileLogLevel = this->earlyGetLogLevel(m_configManager->expand("${Kernel_FileLogLevel}")); + + m_logManager->activate(false); + m_logManager->activate(mainLogLevel, LogLevel_Last, true); + m_logListenerFile->activate(false); + m_logListenerFile->activate(fileLogLevel, LogLevel_Last, true); + m_logListenerFile->configure(*m_configManager); + m_logListenerFile->configure(*m_configManager); + + if (m_logListenerConsole) + { + m_logListenerConsole->activate(false); + m_logListenerConsole->activate(consoleLogLevel, LogLevel_Last, true); + m_logListenerConsole->configure(*m_configManager); + } + + m_algorithmManager.reset(new CAlgorithmManager(m_masterKernelCtx)); + m_playerManager.reset(new CPlayerManager(m_masterKernelCtx)); + m_typeManager.reset(new CTypeManager(m_masterKernelCtx)); + + m_typeManager->registerType(OV_TypeId_Boolean, "Boolean"); + m_typeManager->registerType(OV_TypeId_Integer, "Integer"); + m_typeManager->registerType(OV_TypeId_Float, "Float"); + m_typeManager->registerType(OV_TypeId_String, "String"); + m_typeManager->registerType(OV_TypeId_Filename, "Filename"); + m_typeManager->registerType(OV_TypeId_Script, "Script"); + + m_typeManager->registerEnumerationType(OV_TypeId_Stimulation, "Stimulation"); + + m_typeManager->registerEnumerationType(OV_TypeId_MeasurementUnit, "Measurement unit"); + m_typeManager->registerEnumerationType(OV_TypeId_Factor, "Factor"); + + m_typeManager->registerEnumerationType(OV_TypeId_LogLevel, "Log level"); + m_typeManager->registerEnumerationEntry(OV_TypeId_LogLevel, "None", LogLevel_None); + m_typeManager->registerEnumerationEntry(OV_TypeId_LogLevel, "Debug", LogLevel_Debug); + m_typeManager->registerEnumerationEntry(OV_TypeId_LogLevel, "Benchmarking / Profiling", LogLevel_Benchmark); + m_typeManager->registerEnumerationEntry(OV_TypeId_LogLevel, "Trace", LogLevel_Trace); + m_typeManager->registerEnumerationEntry(OV_TypeId_LogLevel, "Information", LogLevel_Info); + m_typeManager->registerEnumerationEntry(OV_TypeId_LogLevel, "Warning", LogLevel_Warning); + m_typeManager->registerEnumerationEntry(OV_TypeId_LogLevel, "Important warning", LogLevel_ImportantWarning); + m_typeManager->registerEnumerationEntry(OV_TypeId_LogLevel, "Error", LogLevel_Error); + m_typeManager->registerEnumerationEntry(OV_TypeId_LogLevel, "Fatal error", LogLevel_Fatal); + + m_typeManager->registerStreamType(OV_TypeId_EBMLStream, "EBML stream", CIdentifier::undefined()); + m_typeManager->registerStreamType(OV_TypeId_ExperimentInfo, "Experiment information", OV_TypeId_EBMLStream); + m_typeManager->registerStreamType(OV_TypeId_Stimulations, "Stimulations", OV_TypeId_EBMLStream); + m_typeManager->registerStreamType(OV_TypeId_StreamedMatrix, "Streamed matrix", OV_TypeId_EBMLStream); + m_typeManager->registerStreamType(OV_TypeId_ChannelLocalisation, "Channel localisation", OV_TypeId_StreamedMatrix); + m_typeManager->registerStreamType(OV_TypeId_ChannelUnits, "Channel units", OV_TypeId_StreamedMatrix); + m_typeManager->registerStreamType(OV_TypeId_FeatureVector, "Feature vector", OV_TypeId_StreamedMatrix); + m_typeManager->registerStreamType(OV_TypeId_Signal, "Signal", OV_TypeId_StreamedMatrix); + m_typeManager->registerStreamType(OV_TypeId_Spectrum, "Spectrum", OV_TypeId_StreamedMatrix); + m_typeManager->registerStreamType(OV_TypeId_TimeFrequency, "Time-frequency", OV_TypeId_StreamedMatrix); + m_typeManager->registerStreamType(OV_TypeId_CovarianceMatrix, "Covariance Matrix", OV_TypeId_StreamedMatrix); + + + m_typeManager->registerType(OV_TypeId_Message, "Message"); + + m_scenarioManager.reset(new CScenarioManager(m_masterKernelCtx)); + m_pluginManager.reset(new CPluginManager(m_masterKernelCtx)); + m_metaboxManager.reset(new CMetaboxManager(m_masterKernelCtx)); + + return true; +} + +bool CKernelContext::uninitialize() +{ + // As releaseScenario() can call into Plugin Manager we have to clear the scenario manager + // before destroying the Plugin Manager. We can not destroy the Scenario Manager first + // before Plugin Manager destructor needs it. + CIdentifier scenarioID; + while ((scenarioID = m_scenarioManager->getNextScenarioIdentifier(CIdentifier::undefined())) != CIdentifier::undefined()) + { + m_scenarioManager->releaseScenario(scenarioID); + } + + CIdentifier algorithmIdentifier; + while ((algorithmIdentifier = m_algorithmManager->getNextAlgorithmIdentifier(CIdentifier::undefined())) != CIdentifier::undefined()) + { + m_algorithmManager->releaseAlgorithm(algorithmIdentifier); + } + + m_pluginManager.reset(); + m_metaboxManager.reset(); + m_scenarioManager.reset(); + m_typeManager.reset(); + m_playerManager.reset(); + m_algorithmManager.reset(); + m_configManager.reset(); + + this->getLogManager().removeListener(m_logListenerConsole.get()); + this->getLogManager().removeListener(m_logListenerFile.get()); + + m_logManager.reset(); + m_logListenerConsole.reset(); + m_logListenerFile.reset(); + + m_kernelObjectFactory.reset(); + + m_errorManager.reset(); + + return true; +} + +IAlgorithmManager& CKernelContext::getAlgorithmManager() const +{ + assert(m_algorithmManager); + return *m_algorithmManager; +} + +IConfigurationManager& CKernelContext::getConfigurationManager() const +{ + assert(m_configManager); + return *m_configManager; +} + +IKernelObjectFactory& CKernelContext::getKernelObjectFactory() const +{ + assert(m_kernelObjectFactory); + return *m_kernelObjectFactory; +} + +IPlayerManager& CKernelContext::getPlayerManager() const +{ + assert(m_playerManager); + return *m_playerManager; +} + +IPluginManager& CKernelContext::getPluginManager() const +{ + assert(m_pluginManager); + return *m_pluginManager; +} + +IMetaboxManager& CKernelContext::getMetaboxManager() const +{ + assert(m_metaboxManager); + return *m_metaboxManager; +} + + +IScenarioManager& CKernelContext::getScenarioManager() const +{ + assert(m_scenarioManager); + return *m_scenarioManager; +} + +ITypeManager& CKernelContext::getTypeManager() const +{ + assert(m_typeManager); + return *m_typeManager; +} + +ILogManager& CKernelContext::getLogManager() const +{ + assert(m_logManager); + return *m_logManager; +} + +IErrorManager& CKernelContext::getErrorManager() const +{ + assert(m_errorManager); + return *m_errorManager; +} + +ELogLevel CKernelContext::earlyGetLogLevel(const CString& rLogLevelName) +{ + assert(m_logManager); + + std::string value(rLogLevelName.toASCIIString()); + std::transform(value.begin(), value.end(), value.begin(), [](const char c) { return char(std::tolower(c)); }); + + if (value == "none") { return LogLevel_None; } + if (value == "debug") { return LogLevel_Debug; } + if (value == "benchmarking / profiling") { return LogLevel_Benchmark; } + if (value == "trace") { return LogLevel_Trace; } + if (value == "information") { return LogLevel_Info; } + if (value == "warning") { return LogLevel_Warning; } + if (value == "important warning") { return LogLevel_ImportantWarning; } + if (value == "error") { return LogLevel_Error; } + if (value == "fatal error") { return LogLevel_Fatal; } + + OV_WARNING("Invalid log level " << rLogLevelName << " specified in configuration file, falling back to " << CString("Debug"), (*m_logManager)); + + return LogLevel_Debug; +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCKernelContext.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCKernelContext.h new file mode 100755 index 0000000..eeaebe4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCKernelContext.h @@ -0,0 +1,116 @@ +#pragma once + +#include + +#include "ovkTKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +class CLogListenerConsole; +class CLogListenerFile; + +class CKernelContext final : public IKernelContext +{ +public: + + CKernelContext(const IKernelContext* masterKernelCtx, const CString& applicationName, const CString& configFile); + ~CKernelContext() override; + bool initialize(const char* const * tokenList, size_t nToken) override; + bool uninitialize() override; + IAlgorithmManager& getAlgorithmManager() const override; + IConfigurationManager& getConfigurationManager() const override; + IKernelObjectFactory& getKernelObjectFactory() const override; + IPlayerManager& getPlayerManager() const override; + IPluginManager& getPluginManager() const override; + IMetaboxManager& getMetaboxManager() const override; + IScenarioManager& getScenarioManager() const override; + ITypeManager& getTypeManager() const override; + ILogManager& getLogManager() const override; + IErrorManager& getErrorManager() const override; + + _IsDerivedFromClass_Final_(IKernelContext, OVK_ClassId_Kernel_KernelContext) + +protected: + + ELogLevel earlyGetLogLevel(const CString& rLogLevelName); + +private: + + const IKernelContext& m_masterKernelCtx; + + std::unique_ptr m_algorithmManager; + std::unique_ptr m_configManager; + std::unique_ptr m_kernelObjectFactory; + std::unique_ptr m_playerManager; + std::unique_ptr m_pluginManager; + std::unique_ptr m_metaboxManager; + std::unique_ptr m_scenarioManager; + std::unique_ptr m_typeManager; + std::unique_ptr m_logManager; + std::unique_ptr m_errorManager; + + CString m_applicationName; + CString m_configFile; + + std::unique_ptr m_logListenerConsole; + std::unique_ptr m_logListenerFile; + + CKernelContext() = delete; +}; + +class CKernelContextBridge final : public IKernelContext +{ +public: + + explicit CKernelContextBridge(const IKernelContext& ctx) : m_kernelCtx(ctx) { } + + bool initialize() { return true; } + bool uninitialize() override { return true; } + + void setAlgorithmManager(IAlgorithmManager* manager) { m_algorithmManager = manager; } + void setConfigurationManager(IConfigurationManager* manager) { m_configManager = manager; } + void setKernelObjectFactory(IKernelObjectFactory* kernelObjectFactory) { m_kernelObjectFactory = kernelObjectFactory; } + void setPlayerManager(IPlayerManager* manager) { m_playerManager = manager; } + void setPluginManager(IPluginManager* manager) { m_pluginManager = manager; } + void setMetaboxManager(IMetaboxManager* manager) { m_metaboxManager = manager; } + void setScenarioManager(IScenarioManager* manager) { m_scenarioManager = manager; } + void setTypeManager(ITypeManager* manager) { m_typeManager = manager; } + void setLogManager(ILogManager* manager) { m_logManager = manager; } + void setErrorManager(IErrorManager* manager) { m_errorManager = manager; } + + IAlgorithmManager& getAlgorithmManager() const override { return m_algorithmManager ? *m_algorithmManager : m_kernelCtx.getAlgorithmManager(); } + + IConfigurationManager& getConfigurationManager() const override { return m_configManager ? *m_configManager : m_kernelCtx.getConfigurationManager(); } + + IKernelObjectFactory& getKernelObjectFactory() const override + { + return m_kernelObjectFactory ? *m_kernelObjectFactory : m_kernelCtx.getKernelObjectFactory(); + } + + IPlayerManager& getPlayerManager() const override { return m_playerManager ? *m_playerManager : m_kernelCtx.getPlayerManager(); } + IPluginManager& getPluginManager() const override { return m_pluginManager ? *m_pluginManager : m_kernelCtx.getPluginManager(); } + IMetaboxManager& getMetaboxManager() const override { return m_metaboxManager ? *m_metaboxManager : m_kernelCtx.getMetaboxManager(); } + IScenarioManager& getScenarioManager() const override { return m_scenarioManager ? *m_scenarioManager : m_kernelCtx.getScenarioManager(); } + ITypeManager& getTypeManager() const override { return m_typeManager ? *m_typeManager : m_kernelCtx.getTypeManager(); } + ILogManager& getLogManager() const override { return m_logManager ? *m_logManager : m_kernelCtx.getLogManager(); } + IErrorManager& getErrorManager() const override { return m_errorManager ? *m_errorManager : m_kernelCtx.getErrorManager(); } + + _IsDerivedFromClass_Final_(IKernelContext, OVK_ClassId_Kernel_KernelContext) + +protected: + + const IKernelContext& m_kernelCtx; + + mutable IAlgorithmManager* m_algorithmManager = nullptr; + mutable IConfigurationManager* m_configManager = nullptr; + mutable IKernelObjectFactory* m_kernelObjectFactory = nullptr; + mutable IPlayerManager* m_playerManager = nullptr; + mutable IPluginManager* m_pluginManager = nullptr; + mutable IMetaboxManager* m_metaboxManager = nullptr; + mutable IScenarioManager* m_scenarioManager = nullptr; + mutable ITypeManager* m_typeManager = nullptr; + mutable ILogManager* m_logManager = nullptr; + mutable IErrorManager* m_errorManager = nullptr; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCKernelObjectFactory.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCKernelObjectFactory.cpp new file mode 100755 index 0000000..248ca11 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCKernelObjectFactory.cpp @@ -0,0 +1,55 @@ +#include "ovkCKernelObjectFactory.h" + +#include "ovkCConfigurable.h" + +#include "plugins/ovkCPluginModule.h" + +#include + +namespace OpenViBE { +namespace Kernel { + +#define create(rcid,cid,sptr,cl) \ + if(rcid==cid) \ + { \ + sptr=new cl(getKernelContext()); \ + if(sptr) { m_oCreatedObjects.push_back(sptr); } \ + } + +IObject* CKernelObjectFactory::createObject(const CIdentifier& classID) +{ + std::unique_lock lock(m_oMutex); + IObject* res = nullptr; + + create(classID, OV_ClassId_Kernel_Plugins_PluginModule, res, Kernel::CPluginModule); + create(classID, OV_ClassId_Kernel_Configurable, res, Kernel::CConfigurable); + + OV_ERROR_UNLESS_KRN(res, "Unable to allocate object with class id " << classID.str(), Kernel::ErrorType::BadAlloc); + + return res; +} + +bool CKernelObjectFactory::releaseObject(IObject* pObject) +{ + std::unique_lock lock(m_oMutex); + + if (!pObject) { return true; } + + const CIdentifier classID = pObject->getClassIdentifier(); + + const auto i = find(m_oCreatedObjects.begin(), m_oCreatedObjects.end(), pObject); + + OV_ERROR_UNLESS_KRF(i != m_oCreatedObjects.end(), + "Can not release object with final class id " << classID.str() << " - it is not owned by this fatory", + ErrorType::ResourceNotFound); + + m_oCreatedObjects.erase(i); + delete pObject; + + this->getLogManager() << LogLevel_Debug << "Released object with final class id " << classID << "\n"; + + return true; +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCKernelObjectFactory.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCKernelObjectFactory.h new file mode 100755 index 0000000..a2d6126 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCKernelObjectFactory.h @@ -0,0 +1,27 @@ +#pragma once + +#include "ovkTKernelObject.h" + +#include +#include + +namespace OpenViBE { +namespace Kernel { +class CKernelObjectFactory final : public TKernelObject +{ +public: + + explicit CKernelObjectFactory(const IKernelContext& ctx) : TKernelObject(ctx) {} + IObject* createObject(const CIdentifier& classID) override; + bool releaseObject(IObject* pObject) override; + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_KernelObjectFactory) + +protected: + + std::vector m_oCreatedObjects; + + std::mutex m_oMutex; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCObjectVisitorContext.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCObjectVisitorContext.cpp new file mode 100644 index 0000000..e99e39c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCObjectVisitorContext.cpp @@ -0,0 +1,16 @@ +#include "ovkCObjectVisitorContext.h" + +namespace OpenViBE { +namespace Kernel { + +CObjectVisitorContext::CObjectVisitorContext(const IKernelContext& ctx) : TKernelObject(ctx) {} +CObjectVisitorContext::~CObjectVisitorContext() {} + +IAlgorithmManager& CObjectVisitorContext::getAlgorithmManager() const { return TKernelObject::getAlgorithmManager(); } +IConfigurationManager& CObjectVisitorContext::getConfigurationManager() const { return TKernelObject::getConfigurationManager(); } +ITypeManager& CObjectVisitorContext::getTypeManager() const { return TKernelObject::getTypeManager(); } +ILogManager& CObjectVisitorContext::getLogManager() const { return TKernelObject::getLogManager(); } +IErrorManager& CObjectVisitorContext::getErrorManager() const { return TKernelObject::getErrorManager(); } + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCObjectVisitorContext.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCObjectVisitorContext.h new file mode 100644 index 0000000..188ffe0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCObjectVisitorContext.h @@ -0,0 +1,22 @@ +#pragma once + +#include "ovkTKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +class CObjectVisitorContext final : public TKernelObject +{ +public: + + explicit CObjectVisitorContext(const IKernelContext& ctx); + ~CObjectVisitorContext() override; + IAlgorithmManager& getAlgorithmManager() const override; + IConfigurationManager& getConfigurationManager() const override; + ITypeManager& getTypeManager() const override; + ILogManager& getLogManager() const override; + IErrorManager& getErrorManager() const override; + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_ObjectVisitorContext) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCParameter.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCParameter.h new file mode 100644 index 0000000..1b62070 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCParameter.h @@ -0,0 +1,85 @@ +#pragma once + +#include "ovkTKernelObject.h" +#include "ovkTParameter.h" + +#include + +namespace OpenViBE { +namespace Kernel { +#define _parameter_template_instance_simple_type_(_CName_, CType, IType, oClassId) \ + typedef TBaseParameter, IType> _Base_##_CName_; \ + class _CName_ : public _Base_##_CName_ \ + { \ + public: \ + _CName_(const IKernelContext& ctx, EParameterType eParameterType, const CIdentifier& subTypeID = CIdentifier::undefined()) \ + :TBaseParameter < TKernelObject < IParameter >, IType >(ctx, eParameterType, subTypeID) \ + { \ + m_defaultValue = 0; \ + memcpy(&m_value, &m_defaultValue, sizeof(IType)); \ + } \ + _IsDerivedFromClass_Final_(_Base_##_CName_, oClassId) \ + protected: \ + CType m_defaultValue; \ + }; + +#define _parameter_template_instance_object_(_CName_, CType, IType, oClassId) \ + typedef TBaseParameter, IType > _Base_##_CName_; \ + class _CName_ : public _Base_##_CName_ \ + { \ + public: \ + _CName_(const IKernelContext& ctx, EParameterType eParameterType) \ + :TBaseParameter < TKernelObject < IParameter >, IType >(ctx, eParameterType) \ + { \ + IType defaultValue=&m_defaultValue; \ + memcpy(&m_value, &defaultValue, sizeof(IType)); \ + } \ + _IsDerivedFromClass_Final_(_Base_##_CName_, oClassId) \ + protected: \ + CType m_defaultValue; \ + }; + +#define _parameter_template_instance_pointer_(_CName_, CType, IType, oClassId) \ + typedef TBaseParameter, IType > _Base_##_CName_; \ + class _CName_ : public _Base_##_CName_ \ + { \ + public: \ + _CName_(const IKernelContext& ctx, EParameterType eParameterType) \ + :TBaseParameter < TKernelObject < IParameter >, IType >(ctx, eParameterType) \ + { \ + m_defaultValue = nullptr; \ + IType defaultValue=&m_defaultValue; \ + memcpy(&m_value, &defaultValue, sizeof(IType)); \ + } \ + _IsDerivedFromClass_Final_(_Base_##_CName_, oClassId) \ + protected: \ + CType m_defaultValue; \ + }; + +_parameter_template_instance_simple_type_(CIntegerParameter, int64_t, int64_t, OVK_ClassId_Kernel_IntegerParameter) + +_parameter_template_instance_simple_type_(CUIntegerParameter, uint64_t, uint64_t, OVK_ClassId_Kernel_UIntegerParameter) + +_parameter_template_instance_simple_type_(CEnumerationParameter, uint64_t, uint64_t, OVK_ClassId_Kernel_EnumerationParameter) + +_parameter_template_instance_simple_type_(CBooleanParameter, bool, bool, OVK_ClassId_Kernel_BooleanParameter) + +_parameter_template_instance_simple_type_(CFloatParameter, double, double, OVK_ClassId_Kernel_FloatParameter) + +_parameter_template_instance_object_(CStringParameter, CString, CString*, OVK_ClassId_Kernel_StringParameter) + +_parameter_template_instance_object_(CIdentifierParameter, CIdentifier, CIdentifier*, OVK_ClassId_Kernel_IdentifierParameter) + +_parameter_template_instance_object_(CMatrixParameter, CMatrix, CMatrix*, OVK_ClassId_Kernel_MatrixParameter) + +_parameter_template_instance_object_(CStimulationSetParameter, CStimulationSet, IStimulationSet*, OVK_ClassId_Kernel_StimulationSetParameter) + +_parameter_template_instance_object_(CMemoryBufferParameter, CMemoryBuffer, IMemoryBuffer*, OVK_ClassId_Kernel_MemoryBufferParameter) + +_parameter_template_instance_object_(CObjectParameter, CNullObject, IObject*, OVK_ClassId_Kernel_ObjectParameter) + +_parameter_template_instance_pointer_(CPointerParameter, void*, void*, OVK_ClassId_Kernel_PointerParameter) + +#undef _instance_ +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCTypeManager.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCTypeManager.cpp new file mode 100755 index 0000000..694c0cd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCTypeManager.cpp @@ -0,0 +1,463 @@ +#include "ovkCTypeManager.h" + +#include "lepton/Lepton.h" + +#include +#include +#include +#include +#include + +#define OV_TRACE_K(message) this->getLogManager() << OpenViBE::Kernel::LogLevel_Trace << message << "\n"; +#define OV_DEBUG_K(message) this->getLogManager() << OpenViBE::Kernel::LogLevel_Debug << message << "\n"; +#define OV_DEBUG_UNLESS_K(expression, message) if (!(expression)) { OV_DEBUG_K(message); } + +namespace OpenViBE { +namespace Kernel { +namespace { +struct SAInfB +{ + bool operator()(const std::pair a, const std::pair& b) const { return a.second < b.second; } +}; +} // namespace + +// because std::tolower has multiple signatures, +// it can not be easily used in std::transform +// this workaround is taken from http://www.gcek.net/ref/books/sw/cpp/ticppv2/ +template +static TCharT ToLower(TCharT c) { return std::tolower(c); } + +CTypeManager::CTypeManager(const IKernelContext& ctx) + : TKernelObject(ctx) +{ + m_names[CIdentifier::undefined()] = "undefined"; + this->registerEnumerationType(OV_TypeId_BoxAlgorithmFlag, "BoxFlags"); +} + +CIdentifier CTypeManager::getNextTypeIdentifier(const CIdentifier& previousID) const +{ + std::unique_lock lock(m_mutex); + return getNextIdentifier(m_names, previousID); +} + +std::vector> CTypeManager::getSortedTypes() const +{ + std::vector> sorted; + + for (const auto& element : m_names) { sorted.push_back(std::pair(element.first, element.second)); } + std::sort(sorted.begin(), sorted.end(), SAInfB()); + + return sorted; +} + +bool CTypeManager::registerType(const CIdentifier& typeID, const CString& name) +{ + std::unique_lock lock(m_mutex); + + OV_ERROR_UNLESS_KRF(!isRegistered(typeID), "Trying to register type " << typeID.str() << " that already exists.", + ErrorType::BadArgument); + + OV_DEBUG_UNLESS_K(m_takenNames.find(name) == m_takenNames.end(), + "Trying to register type " << typeID << " with a name that already exists ( " << name << ")"); + + m_names[typeID] = name; + OV_TRACE_K("Registered type id " << typeID << " - " << name); + return true; +} + +bool CTypeManager::registerStreamType(const CIdentifier& typeID, const CString& name, const CIdentifier& parentTypeID) +{ + std::unique_lock lock(m_mutex); + + OV_ERROR_UNLESS_KRF(!isRegistered(typeID), "Trying to register stream type " << typeID.str() << " that already exists.", + ErrorType::BadArgument); + + OV_DEBUG_UNLESS_K(m_takenNames.find(name) == m_takenNames.end(), + "Trying to register stream type " << typeID << " with a name that already exists ( " << name << ")"); + + OV_ERROR_UNLESS_KRF(parentTypeID == CIdentifier::undefined() || isStream(parentTypeID), + "Trying to register an invalid stream type [" << name << "] " << typeID.str() << ", parent : " << parentTypeID.str() << ".", + ErrorType::BadArgument); + + m_names[typeID] = name; + m_takenNames.insert(name); + m_streams[typeID] = parentTypeID; + OV_TRACE_K("Registered stream type id " << typeID << "::" << parentTypeID << " - " << name); + return true; +} + +bool CTypeManager::registerEnumerationType(const CIdentifier& typeID, const CString& name) +{ + std::unique_lock lock(m_mutex); + + if (isRegistered(typeID)) + { + if (m_names[typeID] != name) + { + OV_ERROR_KRF( + "Trying to register enum type " << typeID.str() << " that already exists with different value (" << m_names[typeID] << " != " << name << + ")", + ErrorType::BadArgument); + } + OV_DEBUG_K("Trying to register enum type " << typeID.str() << " that already exists."); + } + + OV_DEBUG_UNLESS_K(m_takenNames.find(name) == m_takenNames.end(), + "Trying to register enum type " << typeID << " with a name that already exists ( " << name << ")"); + + m_names[typeID] = name; + m_takenNames.insert(name); + m_enumerations[typeID]; + OV_TRACE_K("Registered enumeration type id " << typeID << " - " << name); + return true; +} + +bool CTypeManager::registerEnumerationEntry(const CIdentifier& typeID, const CString& name, const uint64_t value) +{ + std::unique_lock lock(m_mutex); + + auto itEnumeration = m_enumerations.find(typeID); + + OV_ERROR_UNLESS_KRF(itEnumeration != m_enumerations.end(), "Enumeration type [" << typeID.str() << "] does not exist." << name, + ErrorType::BadArgument); + + const auto itElem = itEnumeration->second.find(value); + if (itElem != itEnumeration->second.end()) + { + if (std::string(itElem->second) != std::string(name)) + { + OV_WARNING_K( + "Enumeration type [" + typeID.str() + "] already has element [" + std::to_string(value) + "]. Value will be overriden : " + + itElem->second.toASCIIString() + " => " + name.toASCIIString()); + } + else { OV_DEBUG_K("Enumeration type [" << typeID.str() << "] already has element [" << value << "]."); } + } + + itEnumeration->second[value] = name; + return true; +} + +bool CTypeManager::registerBitMaskType(const CIdentifier& typeID, const CString& name) +{ + std::unique_lock lock(m_mutex); + + OV_ERROR_UNLESS_KRF(!isRegistered(typeID), "Trying to register bitmask type " << typeID.str() << " that already exists.", + ErrorType::BadArgument); + + OV_DEBUG_UNLESS_K(m_takenNames.find(name) == m_takenNames.end(), + "Trying to register bitmask type " << typeID << " with a name that already exists ( " << name << ")"); + + m_names[typeID] = name; + m_bitMasks[typeID]; + OV_TRACE_K("Registered bitmask type id " << typeID << " - " << name); + return true; +} + +bool CTypeManager::registerBitMaskEntry(const CIdentifier& typeID, const CString& name, const uint64_t value) +{ + std::unique_lock lock(m_mutex); + + auto itBitMask = m_bitMasks.find(typeID); + OV_ERROR_UNLESS_KRF(itBitMask != m_bitMasks.end(), "Bitmask type [" << typeID.str() << "] does not exist.", Kernel::ErrorType::BadArgument); + + const auto itElem = itBitMask->second.find(value); + if (itElem != itBitMask->second.end()) + { + if (std::string(itElem->second) != std::string(name)) + { + OV_WARNING_K( + "Bitmask type [" + typeID.str() + "] already has element [" + std::to_string(value) + "]. Value will be overriden : " + + itElem->second.toASCIIString() + " => " + name.toASCIIString()); + } + else { OV_DEBUG_K("Bitmask type [" << typeID.str() << "] already has element [" << value << "]."); } + } + + for (size_t nBit = 0, i = 0; i < 64; ++i) + { + if (value & (1LL << i)) + { + nBit++; + OV_ERROR_UNLESS_KRF(nBit <= 1, + "Discarded bitmask entry (" << m_names[typeID] << ":" << name << ") because value " << value << " contains more than one bit", + ErrorType::Overflow); + } + } + itBitMask->second[value] = name; + return true; +} + +bool CTypeManager::isRegistered(const CIdentifier& typeID) const +{ + std::unique_lock lock(m_mutex); + + return m_names.find(typeID) != m_names.end(); +} + +bool CTypeManager::isStream(const CIdentifier& typeID) const +{ + std::unique_lock lock(m_mutex); + return m_streams.find(typeID) != m_streams.end(); +} + +bool CTypeManager::isDerivedFromStream(const CIdentifier& typeID, const CIdentifier& parentTypeID) const +{ + std::unique_lock lock(m_mutex); + + auto it = m_streams.find(typeID); + const auto itParent = m_streams.find(parentTypeID); + if (it == m_streams.end() || itParent == m_streams.end()) { return false; } + while (it != m_streams.end()) + { + if (it->first == parentTypeID) { return true; } + it = m_streams.find(it->second); + } + return false; +} + +bool CTypeManager::isEnumeration(const CIdentifier& typeID) const +{ + std::unique_lock lock(m_mutex); + + return m_enumerations.find(typeID) != m_enumerations.end(); +} + +bool CTypeManager::isBitMask(const CIdentifier& typeID) const +{ + std::unique_lock lock(m_mutex); + + return m_bitMasks.find(typeID) != m_bitMasks.end(); +} + +CString CTypeManager::getTypeName(const CIdentifier& typeID) const +{ + std::unique_lock lock(m_mutex); + + if (!isRegistered(typeID)) { return CString(""); } + return m_names.find(typeID)->second; +} + +CIdentifier CTypeManager::getStreamParentType(const CIdentifier& typeID) const +{ + std::unique_lock lock(m_mutex); + + if (!isStream(typeID)) { return CIdentifier::undefined(); } + return m_streams.find(typeID)->second; +} + +size_t CTypeManager::getEnumerationEntryCount(const CIdentifier& typeID) const +{ + std::unique_lock lock(m_mutex); + + const auto itEnumeration = m_enumerations.find(typeID); + if (itEnumeration == m_enumerations.end()) { return 0; } + return itEnumeration->second.size(); +} + +bool CTypeManager::getEnumerationEntry(const CIdentifier& typeID, const uint64_t index, CString& name, uint64_t& value) const +{ + std::unique_lock lock(m_mutex); + + const auto it = m_enumerations.find(typeID); + if (it == m_enumerations.end()) { return false; } + + if (index >= it->second.size()) { return false; } + + auto itEntry = it->second.begin(); + for (size_t i = 0; i < index && itEntry != it->second.end(); i++, ++itEntry) { } + + value = itEntry->first; + name = itEntry->second; + return true; +} + +CString CTypeManager::getEnumerationEntryNameFromValue(const CIdentifier& typeID, const uint64_t value) const +{ + std::unique_lock lock(m_mutex); + + const auto it = m_enumerations.find(typeID); + if (it == m_enumerations.end()) { return ""; } + const auto itEntry = it->second.find(value); + if (itEntry == it->second.end()) { return ""; } + return it->second.find(value)->second; +} + +uint64_t CTypeManager::getEnumerationEntryValueFromName(const CIdentifier& typeID, const CString& name) const +{ + std::unique_lock lock(m_mutex); + + const auto it = m_enumerations.find(typeID); + if (it == m_enumerations.end()) { return OV_IncorrectStimulation; } + + // first looks at the exact std::string match + for (const auto& entry : it->second) { if (entry.second == name) { return entry.first; } } + + // then looks at the caseless std::string match + std::string nameLower = name.toASCIIString(); + std::transform(nameLower.begin(), nameLower.end(), nameLower.begin(), ToLower); + for (const auto& entry : it->second) + { + std::string tmp = entry.second.toASCIIString(); + std::transform(tmp.begin(), tmp.end(), tmp.begin(), ToLower); + if (tmp == nameLower) { return entry.first; } + } + + // then looks at the std::string being the value itself + try + { + const uint64_t value = std::stoull(name.toASCIIString()); + + if ((it->second.find(value) != it->second.end()) || + (typeID == OV_TypeId_Stimulation && this->getConfigurationManager().expandAsBoolean("Kernel_AllowUnregisteredNumericalStimulationIdentifiers"))) + { + return value; + } + } + catch (const std::exception&) { return OV_IncorrectStimulation; } + + return OV_IncorrectStimulation; +} + +size_t CTypeManager::getBitMaskEntryCount(const CIdentifier& typeID) const +{ + std::unique_lock lock(m_mutex); + + const auto itBitMask = m_bitMasks.find(typeID); + if (itBitMask == m_bitMasks.end()) { return 0; } + return itBitMask->second.size(); +} + +bool CTypeManager::getBitMaskEntry(const CIdentifier& typeID, const uint64_t index, CString& name, uint64_t& value) const +{ + std::unique_lock lock(m_mutex); + + const auto itBitMask = m_bitMasks.find(typeID); + if (itBitMask == m_bitMasks.end()) { return false; } + + if (index >= itBitMask->second.size()) { return false; } + + auto itBitMaskEntry = itBitMask->second.begin(); + for (size_t i = 0; i < index && itBitMaskEntry != itBitMask->second.end(); i++, ++itBitMaskEntry) { } + + value = itBitMaskEntry->first; + name = itBitMaskEntry->second; + return true; +} + +CString CTypeManager::getBitMaskEntryNameFromValue(const CIdentifier& typeID, const uint64_t value) const +{ + std::unique_lock lock(m_mutex); + + const auto itBitMask = m_bitMasks.find(typeID); + if (itBitMask == m_bitMasks.end()) { return ""; } + const auto itBitMaskEntry = itBitMask->second.find(value); + if (itBitMaskEntry == itBitMask->second.end()) { return ""; } + return itBitMask->second.find(value)->second; +} + +uint64_t CTypeManager::getBitMaskEntryValueFromName(const CIdentifier& typeID, const CString& name) const +{ + std::unique_lock lock(m_mutex); + + const auto itBitMask = m_bitMasks.find(typeID); + if (itBitMask == m_bitMasks.end()) { return 0xffffffffffffffffLL; } + + // first looks at the exact std::string match + for (const auto& mask : itBitMask->second) { if (mask.second == name) { return mask.first; } } + + // then looks at the caseless std::string match + std::string entryNameLower = name.toASCIIString(); + std::transform(entryNameLower.begin(), entryNameLower.end(), entryNameLower.begin(), ToLower); + for (const auto& mask : itBitMask->second) + { + std::string itEntryNameLower = mask.second.toASCIIString(); + std::transform(itEntryNameLower.begin(), itEntryNameLower.end(), itEntryNameLower.begin(), ToLower); + if (itEntryNameLower == entryNameLower) { return mask.first; } + } + + // then looks at the std::string being the value itself + try + { + const uint64_t value = std::stoll(name.toASCIIString()); + if (itBitMask->second.find(value) != itBitMask->second.end()) { return value; } + } + catch (const std::exception&) { return 0xffffffffffffffffLL; } + + return 0xffffffffffffffffLL; +} + +CString CTypeManager::getBitMaskEntryCompositionNameFromValue(const CIdentifier& typeID, const uint64_t value) const +{ + std::unique_lock lock(m_mutex); + + const auto itBitMask = m_bitMasks.find(typeID); + if (itBitMask == m_bitMasks.end()) { return ""; } + + std::string res; + for (size_t i = 0; i < 64; ++i) + { + if (value & (1LL << i)) + { + const auto itBitMaskEntry = itBitMask->second.find(value & (1LL << i)); + if (itBitMaskEntry == itBitMask->second.end()) { return ""; } + if (res.empty()) { res = itBitMaskEntry->second.toASCIIString(); } + else + { + res += std::string(1, OV_Value_EnumeratedStringSeparator); + res += itBitMaskEntry->second.toASCIIString(); + } + } + } + return CString(res.c_str()); +} + +uint64_t CTypeManager::getBitMaskEntryCompositionValueFromName(const CIdentifier& typeID, const CString& name) const +{ + std::unique_lock lock(m_mutex); + + const auto it = m_bitMasks.find(typeID); + if (it == m_bitMasks.end()) { return 0; } + + uint64_t res = 0; + const std::string entryCompositionName = name.toASCIIString(); + size_t i = 0; + size_t j = 0; + do + { + i = entryCompositionName.find(OV_Value_EnumeratedStringSeparator, i); + if (i == std::string::npos) { i = entryCompositionName.length(); } + + if (i != j) + { + std::string entryName; + entryName.assign(entryCompositionName, j, i - j); + + bool found = false; + for (const auto& mask : it->second) + { + if (mask.second == CString(entryName.c_str())) + { + res |= mask.first; + found = true; + } + } + + if (!found) { return 0; } + } + + i++; + j = i; + } while (i < entryCompositionName.length()); + + return res; +} + +bool CTypeManager::evaluateSettingValue(const CString value, double& result) const +{ + // parse and expression with no variables or functions + try { result = Lepton::Parser::parse(value.toASCIIString()).evaluate(); } + catch (...) { return false; } + return true; +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCTypeManager.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCTypeManager.h new file mode 100755 index 0000000..2a203e4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkCTypeManager.h @@ -0,0 +1,57 @@ +#pragma once + +#include "ovkTKernelObject.h" + +#include +#include +#include +#include + +namespace OpenViBE { +namespace Kernel { +class CTypeManager final : public TKernelObject +{ +public: + + explicit CTypeManager(const IKernelContext& ctx); + CIdentifier getNextTypeIdentifier(const CIdentifier& previousID) const override; + std::vector> getSortedTypes() const override; + bool registerType(const CIdentifier& typeID, const CString& name) override; + bool registerStreamType(const CIdentifier& typeID, const CString& name, const CIdentifier& parentTypeID) override; + bool registerEnumerationType(const CIdentifier& typeID, const CString& name) override; + bool registerEnumerationEntry(const CIdentifier& typeID, const CString& name, uint64_t value) override; + bool registerBitMaskType(const CIdentifier& typeID, const CString& name) override; + bool registerBitMaskEntry(const CIdentifier& typeID, const CString& name, uint64_t value) override; + bool isRegistered(const CIdentifier& typeID) const override; + bool isStream(const CIdentifier& typeID) const override; + bool isDerivedFromStream(const CIdentifier& typeID, const CIdentifier& parentTypeID) const override; + bool isEnumeration(const CIdentifier& typeID) const override; + bool isBitMask(const CIdentifier& typeID) const override; + CString getTypeName(const CIdentifier& typeID) const override; + CIdentifier getStreamParentType(const CIdentifier& typeID) const override; + size_t getEnumerationEntryCount(const CIdentifier& typeID) const override; + bool getEnumerationEntry(const CIdentifier& typeID, uint64_t index, CString& name, uint64_t& value) const override; + CString getEnumerationEntryNameFromValue(const CIdentifier& typeID, uint64_t value) const override; + uint64_t getEnumerationEntryValueFromName(const CIdentifier& typeID, const CString& name) const override; + size_t getBitMaskEntryCount(const CIdentifier& typeID) const override; + bool getBitMaskEntry(const CIdentifier& typeID, uint64_t index, CString& name, uint64_t& value) const override; + CString getBitMaskEntryNameFromValue(const CIdentifier& typeID, uint64_t value) const override; + uint64_t getBitMaskEntryValueFromName(const CIdentifier& typeID, const CString& name) const override; + CString getBitMaskEntryCompositionNameFromValue(const CIdentifier& typeID, uint64_t value) const override; + uint64_t getBitMaskEntryCompositionValueFromName(const CIdentifier& typeID, const CString& name) const override; + bool evaluateSettingValue(CString value, double& result) const override; + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_TypeManager) + +protected: + + std::map m_names; + std::set m_takenNames; + std::map> m_enumerations; + std::map> m_bitMasks; + std::map m_streams; + + mutable std::recursive_mutex m_mutex; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkTConfigurable.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkTConfigurable.h new file mode 100644 index 0000000..d97d000 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkTConfigurable.h @@ -0,0 +1,114 @@ +#pragma once + +#include "ovkTKernelObject.h" + +#include "ovkCParameter.h" + +#include + +namespace OpenViBE { +namespace Kernel { +class IParameter; + +template +class TBaseConfigurable : public TBase +{ +public: + + explicit TBaseConfigurable(const IKernelContext& ctx) : TBase(ctx) { } + + ~TBaseConfigurable() override + { + auto itParameter = m_parameters.begin(); + while (itParameter != m_parameters.end()) + { + // @FIXME is this really as intended, test the first, delete the second? + if (itParameter->second.first) + { + delete itParameter->second.second; + itParameter->second.second = nullptr; + } + ++itParameter; + } + } + + CIdentifier getNextParameterIdentifier(const CIdentifier& previousID) const override + { + return getNextIdentifier>(m_parameters, previousID); + } + + IParameter* getParameter(const CIdentifier& parameterID) override + { + const auto it = m_parameters.find(parameterID); + if (it == m_parameters.end()) { return nullptr; } + return it->second.second; + } + + bool setParameter(const CIdentifier& parameterID, IParameter& parameter) override + { + this->removeParameter(parameterID); + + m_parameters[parameterID] = std::pair(false, ¶meter); + + return true; + } + + IParameter* createParameter(const CIdentifier& parameterID, const EParameterType parameterType, const CIdentifier& subTypeID) override + { + const auto it = m_parameters.find(parameterID); + if (it != m_parameters.end()) { return nullptr; } + + IParameter* parameter = nullptr; + switch (parameterType) + { + case ParameterType_UInteger: parameter = new CUIntegerParameter(this->getKernelContext(), parameterType); + break; + case ParameterType_Integer: parameter = new CIntegerParameter(this->getKernelContext(), parameterType); + break; + case ParameterType_Enumeration: parameter = new CEnumerationParameter(this->getKernelContext(), parameterType, subTypeID); + break; + case ParameterType_Boolean: parameter = new CBooleanParameter(this->getKernelContext(), parameterType); + break; + case ParameterType_Float: parameter = new CFloatParameter(this->getKernelContext(), parameterType); + break; + case ParameterType_String: parameter = new CStringParameter(this->getKernelContext(), parameterType); + break; + case ParameterType_Identifier: parameter = new CIdentifierParameter(this->getKernelContext(), parameterType); + break; + case ParameterType_Matrix: parameter = new CMatrixParameter(this->getKernelContext(), parameterType); + break; + case ParameterType_StimulationSet: parameter = new CStimulationSetParameter(this->getKernelContext(), parameterType); + break; + case ParameterType_MemoryBuffer: parameter = new CMemoryBufferParameter(this->getKernelContext(), parameterType); + break; + case ParameterType_Object: parameter = new CObjectParameter(this->getKernelContext(), parameterType); + break; + case ParameterType_None: + case ParameterType_Pointer: parameter = new CPointerParameter(this->getKernelContext(), parameterType); + break; + } + + if (parameter != nullptr) { m_parameters[parameterID] = std::pair(true, parameter); } + + return parameter; + } + + bool removeParameter(const CIdentifier& rParameterIdentifier) override + { + auto itParameter = m_parameters.find(rParameterIdentifier); + if (itParameter == m_parameters.end()) { return false; } + + if (itParameter->second.first) { delete itParameter->second.second; } + m_parameters.erase(itParameter); + + return true; + } + + _IsDerivedFromClass_Final_(TBase, OVK_ClassId_Kernel_ConfigurableT) + +private: + + std::map> m_parameters; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkTKernelObject.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkTKernelObject.h new file mode 100755 index 0000000..e1c66a8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkTKernelObject.h @@ -0,0 +1,41 @@ +#pragma once + +#include "../ovk_base.h" + +#include + +namespace OpenViBE { +namespace Kernel { +template +class TKernelObject : public T +{ +public: + virtual ~TKernelObject() = default; + + explicit TKernelObject(const IKernelContext& ctx) : m_kernelCtx(ctx) { } + + TKernelObject(const TKernelObject&) = delete; + TKernelObject& operator=(const TKernelObject&) = delete; + + const IKernelContext& getKernelContext() const { return m_kernelCtx; } + virtual IAlgorithmManager& getAlgorithmManager() const { return m_kernelCtx.getAlgorithmManager(); } + virtual IConfigurationManager& getConfigurationManager() const { return m_kernelCtx.getConfigurationManager(); } + virtual IKernelObjectFactory& getKernelObjectFactory() const { return m_kernelCtx.getKernelObjectFactory(); } + virtual IPlayerManager& getPlayerManager() const { return m_kernelCtx.getPlayerManager(); } + virtual IPluginManager& getPluginManager() const { return m_kernelCtx.getPluginManager(); } + virtual IMetaboxManager& getMetaboxManager() const { return m_kernelCtx.getMetaboxManager(); } + virtual IScenarioManager& getScenarioManager() const { return m_kernelCtx.getScenarioManager(); } + virtual ITypeManager& getTypeManager() const { return m_kernelCtx.getTypeManager(); } + virtual ILogManager& getLogManager() const { return m_kernelCtx.getLogManager(); } + virtual IErrorManager& getErrorManager() const { return m_kernelCtx.getErrorManager(); } + + _IsDerivedFromClass_(T, OVK_ClassId_Kernel_KernelObjectT) + +private: + + const IKernelContext& m_kernelCtx; + + // TKernelObject(); +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkTParameter.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkTParameter.h new file mode 100644 index 0000000..875fe4b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/ovkTParameter.h @@ -0,0 +1,81 @@ +#pragma once + +#include "ovkTKernelObject.h" + +#include + +namespace OpenViBE { +namespace Kernel { +template +class TBaseParameter : public TBase +{ +public: + + TBaseParameter(const IKernelContext& ctx, const EParameterType type, const CIdentifier& subTypeID = CIdentifier::undefined()) + : TBase(ctx), m_valueRef(nullptr), m_value(0), m_parameterType(type), m_subTypeID(subTypeID) { } + + uint64_t getParameterSize() const override { return sizeof(TType); } + EParameterType getType() const override { return m_parameterType; } + CIdentifier getSubTypeIdentifier() const override { return m_subTypeID; } + + bool clearReferenceTarget() override + { + m_valueRef = NULL; + m_parameterRef = nullptr; + return true; + } + + bool getReferenceTarget(IParameter*& pParameterRef) const override + { + pParameterRef = m_parameterRef; + return true; + } + + bool setReferenceTarget(IParameter* pParameterRef) override + { + if (m_valueRef) { m_valueRef = NULL; } + m_parameterRef = pParameterRef; + return true; + } + + bool getReferenceTarget(void* pValue) const override + { + memcpy(&pValue, &m_valueRef, sizeof(TType*)); + return true; + } + + bool setReferenceTarget(const void* pValue) override + { + if (m_parameterRef) { m_parameterRef = nullptr; } + memcpy(&m_valueRef, &pValue, sizeof(TType*)); + return true; + } + + bool getValue(void* pValue) const override + { + if (m_parameterRef) { return m_parameterRef->getValue(pValue); } + if (m_valueRef) { memcpy(pValue, m_valueRef, sizeof(TType)); } + else { memcpy(pValue, &m_value, sizeof(TType)); } + return true; + } + + bool setValue(const void* pValue) override + { + if (m_parameterRef) { return m_parameterRef->setValue(pValue); } + if (m_valueRef) { memcpy(m_valueRef, pValue, sizeof(TType)); } + else { memcpy(&m_value, pValue, sizeof(TType)); } + return true; + } + + _IsDerivedFromClass_(TBase, OVK_ClassId_Kernel_ParameterT) + +protected: + + IParameter* m_parameterRef = nullptr; + TType* m_valueRef = nullptr; + TType m_value; + EParameterType m_parameterType; + CIdentifier m_subTypeID = CIdentifier::undefined(); +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxAlgorithmContext.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxAlgorithmContext.cpp new file mode 100644 index 0000000..8b9db1e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxAlgorithmContext.cpp @@ -0,0 +1,19 @@ +#include "ovkCBoxAlgorithmContext.h" +#include "ovkCPlayerContext.h" +#include "ovkCSimulatedBox.h" + +namespace OpenViBE { +namespace Kernel { + +CBoxAlgorithmCtx::CBoxAlgorithmCtx(const IKernelContext& ctx, CSimulatedBox* simulatedBox, const IBox* box) + : TKernelObject(ctx), m_pStaticBoxContext(box), m_pDynamicBoxContext(simulatedBox), m_oPlayerContext(ctx, simulatedBox) {} + + +bool CBoxAlgorithmCtx::markAlgorithmAsReadyToProcess() +{ + m_bReadyToProcess = true; + return true; +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxAlgorithmContext.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxAlgorithmContext.h new file mode 100644 index 0000000..f7690f6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxAlgorithmContext.h @@ -0,0 +1,35 @@ +#pragma once + +#include "../ovkTKernelObject.h" +#include "ovkCPlayerContext.h" + +namespace OpenViBE { +namespace Kernel { +class CSimulatedBox; + +class CBoxAlgorithmCtx final : public TKernelObject +{ +public: + + CBoxAlgorithmCtx(const IKernelContext& ctx, CSimulatedBox* simulatedBox, const IBox* box); + ~CBoxAlgorithmCtx() override {} + const IBox* getStaticBoxContext() override { return m_pStaticBoxContext; } + IBoxIO* getDynamicBoxContext() override { return m_pDynamicBoxContext; } + IPlayerContext* getPlayerContext() override { return &m_oPlayerContext; } + bool markAlgorithmAsReadyToProcess() override; + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Player_BoxAlgorithmContext) + + bool isAlgorithmReadyToProcess() const { return m_bReadyToProcess; } + +protected: + + const IBox* m_pStaticBoxContext = nullptr; + IBoxIO* m_pDynamicBoxContext = nullptr; + // here we prefer value type over reference/pointer + // in order to improve performance at runtime (no heap allocation) + CPlayerContext m_oPlayerContext; + bool m_bReadyToProcess = false; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxAlgorithmLogManager.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxAlgorithmLogManager.cpp new file mode 100644 index 0000000..f94911a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxAlgorithmLogManager.cpp @@ -0,0 +1,17 @@ +#include "ovkCPlayerContext.h" +#include "ovkCSimulatedBox.h" + +namespace OpenViBE { +namespace Kernel { + +void CBoxAlgorithmLogManager::log(const ELogLevel logLevel) +{ + CIdentifier boxId; + m_simulatedBox.getBoxIdentifier(boxId); + + m_logManager << logLevel << "At time " << CTime(m_playerCtx.getCurrentTime()) << " <" << LogColor_PushStateBit << LogColor_ForegroundBlue + << "Box algorithm" << LogColor_PopStateBit << "::" << boxId << " aka " << m_simulatedBox.getName() << "> "; +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxAlgorithmLogManager.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxAlgorithmLogManager.h new file mode 100644 index 0000000..a038c1e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxAlgorithmLogManager.h @@ -0,0 +1,52 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +namespace OpenViBE { +namespace Kernel { + +class CSimulatedBox; + +class CBoxAlgorithmLogManager final : public ILogManager +{ +public: + CBoxAlgorithmLogManager(const IPlayerContext& playerContext, ILogManager& logManager, CSimulatedBox& simulatedBox) + : m_playerCtx(playerContext), m_logManager(logManager), m_simulatedBox(simulatedBox) {} + + bool isActive(const ELogLevel level) override { return m_logManager.isActive(level); } + bool activate(const ELogLevel level, const bool active) override { return m_logManager.activate(level, active); } + + bool activate(const ELogLevel startLevel, const ELogLevel endLevel, const bool active) override + { + return m_logManager.activate(startLevel, endLevel, active); + } + + bool activate(const bool active) override { return m_logManager.activate(active); } + + bool addListener(ILogListener* listener) override { return m_logManager.addListener(listener); } + bool removeListener(ILogListener* listener) override { return m_logManager.removeListener(listener); } + + void log(const CTime value) override { m_logManager.log(value); } + void log(const uint64_t value) override { m_logManager.log(value); } + void log(const uint32_t value) override { m_logManager.log(value); } + void log(const int64_t value) override { m_logManager.log(value); } + void log(const int value) override { m_logManager.log(value); } + void log(const double value) override { m_logManager.log(value); } + void log(const bool value) override { m_logManager.log(value); } + void log(const CString& value) override { m_logManager.log(value); } + void log(const std::string& value) override { m_logManager.log(value); } + void log(const char* value) override { m_logManager.log(value); } + void log(const CIdentifier& value) override { m_logManager.log(value); } + void log(const ELogColor value) override { m_logManager.log(value); } + void log(const ELogLevel logLevel) override; + + CIdentifier getClassIdentifier() const override { return CIdentifier(); } + +private: + const IPlayerContext& m_playerCtx; + ILogManager& m_logManager; + CSimulatedBox& m_simulatedBox; +}; + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxSettingModifierVisitor.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxSettingModifierVisitor.cpp new file mode 100644 index 0000000..37c4552 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxSettingModifierVisitor.cpp @@ -0,0 +1,168 @@ +#include "ovkCBoxSettingModifierVisitor.h" + +#include "ovkCPlayer.h" + +#include +#include +#include "../../tools/ovk_setting_checker.h" + +#include +#include +#include + +#define OVD_AttributeId_SettingOverrideFilename OpenViBE::CIdentifier(0x8D21FF41, 0xDF6AFE7E) +#define OV_AttributeId_Box_Disabled OpenViBE::CIdentifier(0x341D3912, 0x1478DE86) + +namespace OpenViBE { +namespace Kernel { + +void CBoxSettingModifierVisitor::openChild(const char* name, const char** /*sAttributeName*/, const char** /*sAttributeValue*/, const size_t /*nAttribute*/) +{ + if (!m_IsParsingSettingOverride) { if (std::string(name) == std::string("OpenViBE-SettingsOverride")) { m_IsParsingSettingOverride = true; } } + else if (std::string(name) == std::string("SettingValue")) { m_IsParsingSettingValue = true; } + else { m_IsParsingSettingValue = false; } +} + +void CBoxSettingModifierVisitor::processChildData(const char* data) +{ + if (m_IsParsingSettingValue) + { + m_ObjectVisitorCtx->getLogManager() << LogLevel_Debug << "Using [" << data << "] as setting " << m_SettingIdx << "...\n"; + m_Box->setSettingValue(m_SettingIdx, data); + } +} + +void CBoxSettingModifierVisitor::closeChild() +{ + //We need to count it here because we need to take in account the empty value + if (m_IsParsingSettingValue) { m_SettingIdx++; } + m_IsParsingSettingValue = false; +} + +bool CBoxSettingModifierVisitor::processBegin(IObjectVisitorContext& visitorCtx, IBox& box) +{ + m_ObjectVisitorCtx = &visitorCtx; + + // checks if this box should override + // settings from external file + if (box.hasAttribute(OVD_AttributeId_SettingOverrideFilename)) + { + const CString settingOverrideFilename = box.getAttributeValue(OVD_AttributeId_SettingOverrideFilename); + CString settingOverrideFilenameFinal; + if (m_ConfigManager == nullptr) { settingOverrideFilenameFinal = visitorCtx.getConfigurationManager().expand(settingOverrideFilename); } + else { settingOverrideFilenameFinal = m_ConfigManager->expand(settingOverrideFilename); } + + // message + visitorCtx.getLogManager() << LogLevel_Trace << "Trying to override [" << box.getName() << "] box settings with file [" << + settingOverrideFilename << " which expands to " << settingOverrideFilenameFinal << "] !\n"; + + // creates XML reader + XML::IReader* reader = createReader(*this); + + // adds new box settings + m_Box = &box; + m_SettingIdx = 0; + m_IsParsingSettingValue = false; + m_IsParsingSettingOverride = false; + + auto cleanup = [&]() + { + // cleans up internal state + m_Box = nullptr; + m_SettingIdx = 0; + m_IsParsingSettingValue = false; + m_IsParsingSettingOverride = false; + + // releases XML reader + reader->release(); + reader = nullptr; + }; + + // 1. Open settings file (binary because read would conflict with tellg for text files) + // 2. Loop until end of file, reading it + // and sending what is read to the XML parser + // 3. Close the settings file + std::ifstream file; + FS::Files::openIFStream(file, settingOverrideFilenameFinal.toASCIIString(), std::ios::binary); + if (file.is_open()) + { + char buffer[1024]; + bool statusOk = true; + file.seekg(0, std::ios::end); + std::streamoff fileLen = file.tellg(); + file.seekg(0, std::ios::beg); + while (fileLen && statusOk) + { + // File length is always positive so this is safe + const std::streamoff bufferLen = (unsigned(fileLen) > sizeof(buffer) ? sizeof(buffer) : fileLen); + file.read(buffer, bufferLen); + fileLen -= bufferLen; + statusOk = reader->processData(buffer, size_t(bufferLen)); + } + file.close(); + + // message + if (m_SettingIdx == box.getSettingCount()) + { + visitorCtx.getLogManager() << LogLevel_Trace << "Overrode " << m_SettingIdx << " setting(s) with this configuration file...\n"; + + for (size_t i = 0; i < m_SettingIdx; ++i) + { + CString settingName = ""; + CString rawSettingvalue = ""; + + box.getSettingName(i, settingName); + box.getSettingValue(i, rawSettingvalue); + CString value = rawSettingvalue; + value = m_ConfigManager->expand(value); + CIdentifier settingType; + box.getSettingType(i, settingType); + if (!checkSettingValue(value, settingType, visitorCtx.getTypeManager())) + { + const auto settingTypeName = visitorCtx.getTypeManager().getTypeName(settingType); + cleanup(); + OV_ERROR("<" << box.getName() << "> The following value: [" << rawSettingvalue << "] expanded as [" << value + << "] given as setting is not a valid [" << settingTypeName << "] value.", + ErrorType::BadArgument, false, m_ObjectVisitorCtx->getErrorManager(), m_ObjectVisitorCtx->getLogManager()); + } + } + } + else + { + cleanup(); + OV_ERROR( + "Overrode " << m_SettingIdx << " setting(s) with configuration file [" << settingOverrideFilenameFinal << + "]. That does not match the box setting count " << box.getSettingCount(), + ErrorType::OutOfBound, false, m_ObjectVisitorCtx->getErrorManager(), m_ObjectVisitorCtx->getLogManager()); + } + } + else + { + if (box.hasAttribute(OV_AttributeId_Box_Disabled)) + { + // if the box is disabled do not stop the scenario execution when configuration fails + } + else + { + cleanup(); + OV_ERROR( + "Could not override [" << box.getName() << "] settings because configuration file [" << settingOverrideFilenameFinal << + "] could not be opened", + ErrorType::ResourceNotFound, false, m_ObjectVisitorCtx->getErrorManager(), m_ObjectVisitorCtx->getLogManager()); + } + } + + cleanup(); + } + + return true; +} + +bool CBoxSettingModifierVisitor::processEnd(IObjectVisitorContext& visitorCtx, IBox& /*box*/) +{ + m_ObjectVisitorCtx = &visitorCtx; + return true; +} + +} //namespace Kernel +} //namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxSettingModifierVisitor.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxSettingModifierVisitor.h new file mode 100644 index 0000000..f93cc2a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBoxSettingModifierVisitor.h @@ -0,0 +1,38 @@ +#pragma once + +#include "ovkCSimulatedBox.h" +#include "ovkCPlayer.h" + +#include +#include + +#include + +#define OVD_AttributeId_SettingOverrideFilename OpenViBE::CIdentifier(0x8D21FF41, 0xDF6AFE7E) + +namespace OpenViBE { +namespace Kernel { +class CBoxSettingModifierVisitor final : public IObjectVisitor, public XML::IReaderCallback +{ +public: + + explicit CBoxSettingModifierVisitor(IConfigurationManager* pConfigurationManager = nullptr) + : IObjectVisitor(), m_ConfigManager(pConfigurationManager) {} + + void openChild(const char* name, const char** sAttributeName, const char** sAttributeValue, const size_t nAttribute) override; + void processChildData(const char* data) override; + void closeChild() override; + bool processBegin(IObjectVisitorContext& visitorCtx, IBox& box) override; + bool processEnd(IObjectVisitorContext& visitorCtx, IBox& box) override; + + IObjectVisitorContext* m_ObjectVisitorCtx = nullptr; + IBox* m_Box = nullptr; + size_t m_SettingIdx = 0; + bool m_IsParsingSettingValue = false; + bool m_IsParsingSettingOverride = false; + IConfigurationManager* m_ConfigManager = nullptr; + + _IsDerivedFromClass_Final_(IObjectVisitor, CIdentifier::undefined()) +}; +} //namespace Kernel +} //namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBuffer.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBuffer.cpp new file mode 100644 index 0000000..c40772e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBuffer.cpp @@ -0,0 +1,20 @@ +#include "ovkCBuffer.h" + +namespace OpenViBE { +namespace Kernel { + +CBuffer::CBuffer(const CBuffer& buffer) +{ + this->CMemoryBuffer::setSize(buffer.getSize(), true); + memcpy(this->CMemoryBuffer::getDirectPointer(), buffer.getDirectPointer(), buffer.getSize()); +} + +CBuffer& CBuffer::operator=(const CBuffer& buffer) +{ + this->CMemoryBuffer::setSize(buffer.getSize(), true); + memcpy(this->CMemoryBuffer::getDirectPointer(), buffer.getDirectPointer(), buffer.getSize()); + return *this; +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBuffer.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBuffer.h new file mode 100644 index 0000000..c58ceb4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCBuffer.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +namespace OpenViBE { +namespace Kernel { +class CBuffer final : public CMemoryBuffer +{ +public: + + CBuffer() { } + explicit CBuffer(const CBuffer& buffer); + + CBuffer& operator=(const CBuffer& buffer); +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayer.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayer.cpp new file mode 100644 index 0000000..6840fdd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayer.cpp @@ -0,0 +1,356 @@ +#include "ovkCPlayer.h" +#include "ovkCSimulatedBox.h" +#include "ovkCScheduler.h" + +#include "../configuration/ovkCConfigurationManager.h" +#include "../scenario/ovkCScenarioManager.h" +#include "../scenario/ovkCScenarioSettingKeywordParserCallback.h" + +#include + +#include + +#include +#include +#include + +namespace OpenViBE { +namespace Kernel { + +const uint64_t SCHEDULER_DEFAULT_FREQUENCY = 128; +const uint64_t SCHEDULER_MAXIMUM_LOOPS_DURATION = (100LL << 22); /* 100/1024 seconds, approx 100ms */ + +//___________________________________________________________________// +// // + +CPlayer::CPlayer(const IKernelContext& ctx) + : TKernelObject(ctx), m_kernelCtxBridge(ctx), m_scheduler(m_kernelCtxBridge, *this) +{ + uint64_t schedulerFrequency = this->TKernelObject::getConfigurationManager().expandAsUInteger("${Kernel_PlayerFrequency}"); + if (schedulerFrequency == 0) + { + OV_WARNING_K(std::string("Invalid frequency configuration Kernel_PlayerFrequency = ") + + this->TKernelObject::getConfigurationManager().expand("${Kernel_PlayerFrequency}").toASCIIString() + " restored to default " + + std::to_string(SCHEDULER_DEFAULT_FREQUENCY)); + schedulerFrequency = SCHEDULER_DEFAULT_FREQUENCY; + } + else { TKernelObject::getLogManager() << LogLevel_Trace << "Player frequency set to " << schedulerFrequency << "\n"; } + m_scheduler.setFrequency(schedulerFrequency); +} + +CPlayer::~CPlayer() +{ + if (this->isHoldingResources()) { this->uninitialize(); } + + delete m_runtimeConfigManager; + delete m_runtimeScenarioManager; +} + +//___________________________________________________________________// +// // + +bool CPlayer::setScenario(const CIdentifier& scenarioID, const CNameValuePairList* localConfigurationTokens) +{ + OV_ERROR_UNLESS_KRF(!this->isHoldingResources(), "Trying to configure a player with non-empty resources", Kernel::ErrorType::BadCall); + + this->getLogManager() << LogLevel_Debug << "Player setScenario\n"; + + // Create a fresh runtime configuration manager which will handle scenario-specific + // configuration, such as the scenario settings and local settings (workspace) + + delete m_runtimeConfigManager; + m_runtimeConfigManager = new CConfigurationManager(this->getKernelContext(), &this->getKernelContext().getConfigurationManager()); + m_runtimeConfigManager->addConfigurationFromFile(this->getKernelContext().getConfigurationManager().expand("${Kernel_DelayedConfiguration}")); + IScenario& originalScenario = this->getScenarioManager().getScenario(scenarioID); + + delete m_runtimeScenarioManager; + m_runtimeScenarioManager = new CScenarioManager(this->getKernelContext()); + m_runtimeScenarioManager->cloneScenarioImportersAndExporters(this->getKernelContext().getScenarioManager()); + + OV_ERROR_UNLESS_KRF(m_runtimeScenarioManager->createScenario(m_runtimeScenarioID), + "Fail to create a scenario duplicate for the current runtime session", Kernel::ErrorType::BadResourceCreation); + + IScenario& runtimeScenario = m_runtimeScenarioManager->getScenario(m_runtimeScenarioID); + runtimeScenario.merge(originalScenario, nullptr, true, true); + + if (runtimeScenario.hasAttribute(OV_AttributeId_ScenarioFilename)) + { + const std::string filename = runtimeScenario.getAttributeValue(OV_AttributeId_ScenarioFilename).toASCIIString(); + std::string directoryName = "."; + m_runtimeConfigManager->createConfigurationToken("Player_ScenarioFilename", filename.c_str()); + + const size_t iDir = filename.rfind('/'); + if (iDir != std::string::npos) { directoryName = filename.substr(0, iDir); } + m_runtimeConfigManager->createConfigurationToken("Player_ScenarioDirectory", directoryName.c_str()); + m_runtimeConfigManager->createConfigurationToken("__volatile_ScenarioDir", directoryName.c_str()); + const std::string workspaceConfigurationFile = directoryName + "/" + std::string("openvibe-workspace.conf"); + this->getLogManager() << LogLevel_Trace << "Player adds workspace configuration file [" << workspaceConfigurationFile << + "] to runtime configuration manager\n"; + m_runtimeConfigManager->addConfigurationFromFile(CString(workspaceConfigurationFile.c_str())); + std::string scenarioConfigurationFile = directoryName + "/" + std::string("scenario.conf"); + this->getLogManager() << LogLevel_Trace << "Player adds scenario configuration file [" << scenarioConfigurationFile << + "] to runtime configuration manager\n"; + m_runtimeConfigManager->addConfigurationFromFile(CString(scenarioConfigurationFile.c_str())); + + const size_t ext = filename.rfind('.'); + if (ext != std::string::npos) + { + scenarioConfigurationFile = filename.substr(0, ext) + std::string(".conf"); + this->getLogManager() << LogLevel_Trace << "Player adds scenario configuration file [" << scenarioConfigurationFile << + "] to runtime configuration manager\n"; + m_runtimeConfigManager->addConfigurationFromFile(CString(scenarioConfigurationFile.c_str())); + } + } + + // Sets configuration tokens for this player + // Once every token file, applies the configuration tokens coming from an external application defining its own scenario specific tokens + if (localConfigurationTokens != nullptr) + { + this->getLogManager() << LogLevel_Trace << "Player setScenario: add local configuration token from map.\n"; + for (size_t i = 0; i < localConfigurationTokens->getSize(); ++i) + { + CString name; + CString value; + if (localConfigurationTokens->getValue(i, name, value)) + { + this->getLogManager() << LogLevel_Debug << "Player setScenario: add local configuration token: [" << name << "] = [" << value << "].\n"; + CIdentifier tokenID = m_runtimeConfigManager->lookUpConfigurationTokenIdentifier(name); + if (tokenID == CIdentifier::undefined()) { m_runtimeConfigManager->createConfigurationToken(name, value); } + else { m_runtimeConfigManager->setConfigurationTokenValue(tokenID, value); } + } + // This should not happen + else + { + this->getLogManager() << LogLevel_Trace << "Player setScenario: Could not acces to value of localConfigurationTokens at index " << i << + ".\n"; + } + } + } + + OV_ERROR_UNLESS_KRF(runtimeScenario.checkSettings(m_runtimeConfigManager), + "Checking settings failed for scenario duplicate instantiated for the current runtime session", Kernel::ErrorType::BadArgument); + + return m_scheduler.setScenario(m_runtimeScenarioID); +} + +IConfigurationManager& CPlayer::getRuntimeConfigurationManager() const { return *m_runtimeConfigManager; } +IScenarioManager& CPlayer::getRuntimeScenarioManager() const { return *m_runtimeScenarioManager; } +CIdentifier CPlayer::getRuntimeScenarioIdentifier() const { return m_runtimeScenarioID; } + +EPlayerReturnCodes CPlayer::initialize() +{ + OV_ERROR_UNLESS_K(!this->isHoldingResources(), "Trying to configure a player with non-empty resources", Kernel::ErrorType::BadCall, + EPlayerReturnCodes::Failed); + + this->getLogManager() << LogLevel_Trace << "Player initialized.\n"; + + m_fastForwardMaximumFactor = 0; + // At this point we've inserted the bridge as a stand-in for Kernel context to the local CConfigurationManager, but the manager in the bridge is still the + // 'global' one. Now lets change the config manager in the bridge to point to the local manager in order to load configurations into the local manager. + m_kernelCtxBridge.setConfigurationManager(m_runtimeConfigManager); + + const ESchedulerInitialization code = m_scheduler.initialize(); + + if (code == ESchedulerInitialization::Failed) { OV_ERROR_K("Failed to initialize player", Kernel::ErrorType::Internal, EPlayerReturnCodes::Failed); } + if (code == ESchedulerInitialization::BoxInitializationFailed) + { + OV_ERROR_K("Failed to initialize player", Kernel::ErrorType::Internal, EPlayerReturnCodes::BoxInitializationFailed); + } + + m_benchmarkChrono.reset(size_t(m_scheduler.getFrequency())); + + m_currentTimeToReach = 0; + m_lateness = 0; + m_innerLateness = 0; + + m_status = EPlayerStatus::Stop; + return EPlayerReturnCodes::Success; +} + +bool CPlayer::uninitialize() +{ + this->getLogManager() << LogLevel_Trace << "Player uninitialize\n"; + + m_scheduler.uninitialize(); + m_kernelCtxBridge.setConfigurationManager(nullptr); + + m_scenarioConfigFile = ""; + m_workspaceConfigFile = ""; + if (m_runtimeConfigManager != nullptr) + { + delete m_runtimeConfigManager; + m_runtimeConfigManager = nullptr; + } + + return true; +} + +bool CPlayer::stop() +{ + OV_ERROR_UNLESS_KRF(this->isHoldingResources(), "Trying to use an uninitialized player", Kernel::ErrorType::BadCall); + this->getLogManager() << LogLevel_Trace << "Player stop\n"; + m_status = EPlayerStatus::Stop; + return true; +} + +bool CPlayer::pause() +{ + OV_ERROR_UNLESS_KRF(this->isHoldingResources(), "Trying to use an uninitialized player", Kernel::ErrorType::BadCall); + this->getLogManager() << LogLevel_Trace << "Player pause\n"; + m_status = EPlayerStatus::Pause; + return true; +} + +bool CPlayer::step() +{ + OV_ERROR_UNLESS_KRF(this->isHoldingResources(), "Trying to use an uninitialized player", Kernel::ErrorType::BadCall); + this->getLogManager() << LogLevel_Trace << "Player step\n"; + m_status = EPlayerStatus::Step; + return true; +} + +bool CPlayer::play() +{ + OV_ERROR_UNLESS_KRF(this->isHoldingResources(), "Trying to use an uninitialized player", Kernel::ErrorType::BadCall); + this->getLogManager() << LogLevel_Trace << "Player play\n"; + m_status = EPlayerStatus::Play; + return true; +} + +bool CPlayer::forward() +{ + OV_ERROR_UNLESS_KRF(this->isHoldingResources(), "Trying to use an uninitialized player", Kernel::ErrorType::BadCall); + this->getLogManager() << LogLevel_Trace << "Player forward\n"; + m_status = EPlayerStatus::Forward; + return true; +} + +EPlayerStatus CPlayer::getStatus() const { return m_status; } + +bool CPlayer::setFastForwardMaximumFactor(const double fastForwardFactor) +{ + m_fastForwardMaximumFactor = (fastForwardFactor < 0 ? 0 : fastForwardFactor); + return true; +} + +double CPlayer::getFastForwardMaximumFactor() const { return m_fastForwardMaximumFactor; } +double CPlayer::getCPUUsage() const { return m_scheduler.getCPUUsage(); } +bool CPlayer::isHoldingResources() const { return m_scheduler.isHoldingResources(); } + +bool CPlayer::loop(const uint64_t elapsedTime, const uint64_t maximumTimeToReach) +{ + OV_ERROR_UNLESS_KRF(this->isHoldingResources(), "Trying to use an uninitialized player", Kernel::ErrorType::BadCall); + + if (m_status == EPlayerStatus::Stop) { return true; } + + bool hasTimeToReach = false; + switch (m_status) + { + // Calls a single controller loop and goes back to pause state + case EPlayerStatus::Step: + m_currentTimeToReach += CTime(m_scheduler.getFrequency(), 1LL).time(); + hasTimeToReach = true; + m_status = EPlayerStatus::Pause; + break; + + // Calls multiple controller loops + case EPlayerStatus::Forward: + // We can't know what m_currentTimeToReach should be in advance + // We will try to do as many scheduler loops as possible until + // SCHEDULER_MAXIMUM_LOOPS_DURATION seconds elapsed + if (m_fastForwardMaximumFactor != 0) + { + m_currentTimeToReach += uint64_t(m_fastForwardMaximumFactor * elapsedTime); + hasTimeToReach = true; + } + break; + + // Simply updates time according to delta time + case EPlayerStatus::Play: + m_currentTimeToReach += elapsedTime; + hasTimeToReach = true; + break; + + default: return true; + } + +#if defined CPlayer_Debug_Time +::printf("---\n"); +::printf("Factor : %lf\n", m_fastForwardMaximumFactor); +::printf("Current time : %llx\n", m_scheduler.getCurrentTime()); +::printf("Time to reach : %llx\n", m_currentTimeToReach); +#endif // CPlayer_Debug_Time + + const uint64_t schedulerStepDuration = m_scheduler.getStepDuration(); + const uint64_t tStart = System::Time::zgetTime(); + bool finished = false; + while (!finished) + { + const uint64_t nextSchedulerTime = m_scheduler.getCurrentTime() + schedulerStepDuration; + +#if defined CPlayer_Debug_Time +::printf(" Next time : %llx\n", nextSchedulerTime); +#endif // CPlayer_Debug_Time + if (m_status == EPlayerStatus::Stop) { finished = true; } + + if ((hasTimeToReach && (nextSchedulerTime > m_currentTimeToReach)) || ( + (m_status == EPlayerStatus::Forward || hasTimeToReach) && (m_scheduler.getCurrentTime() >= maximumTimeToReach))) + { + finished = true; +#if defined CPlayer_Debug_Time +::printf("Breaks because would get over time to reach\n"); +#endif // CPlayer_Debug_Time + } + else + { + if (hasTimeToReach) { m_innerLateness = (m_currentTimeToReach > nextSchedulerTime ? m_currentTimeToReach - nextSchedulerTime : 0); } + else { m_innerLateness = 0; } + + if (!m_scheduler.loop()) + { + m_status = EPlayerStatus::Stop; + this->getLogManager() << LogLevel_Error << "Scheduler loop failed.\n"; + return false; + } + +#if defined CPlayer_Debug_Time +::printf("Iterates (%f / %f - %s)\n", (m_scheduler.getCurrentTime()>>22)/1024., (maximumTimeToReach>>22)/1024., (m_status==EPlayerStatus::Forward?"true":"false")); +#endif // CPlayer_Debug_Time + } + if (System::Time::zgetTime() > tStart + SCHEDULER_MAXIMUM_LOOPS_DURATION) + { + finished = true; +#if defined CPlayer_Debug_Time +::printf("Breaks because of loop time out\n"); +#endif // CPlayer_Debug_Time + } + } + + if ((m_status == EPlayerStatus::Forward && m_currentTimeToReach > m_scheduler.getCurrentTime() + schedulerStepDuration) || !hasTimeToReach) + { + m_currentTimeToReach = m_scheduler.getCurrentTime(); + } + + uint64_t lateness; + if (m_currentTimeToReach > m_scheduler.getCurrentTime()) { lateness = m_currentTimeToReach - m_scheduler.getCurrentTime(); } + else { lateness = 0; } + +#if defined CPlayer_Debug_Time +::printf("Done -- New time to reach : %llx\n", m_currentTimeToReach); +#endif // CPlayer_Debug_Time + + const uint64_t latenessSec = lateness >> 32; + const uint64_t prevlatenessSec = m_lateness >> 32; + std::stringstream ss; + ss << "<" << LogColor_PushStateBit << LogColor_ForegroundBlue << "Player" << LogColor_PopStateBit << "::" << LogColor_PushStateBit + << LogColor_ForegroundBlue << "can not reach realtime" << LogColor_PopStateBit << "> " << latenessSec << " second(s) late...\n"; + OV_WARNING_UNLESS_K(latenessSec == prevlatenessSec, ss.str()); + + return true; +} + +uint64_t CPlayer::getCurrentSimulatedTime() const { return m_scheduler.getCurrentTime(); } +uint64_t CPlayer::getCurrentSimulatedLateness() const { return m_innerLateness; } + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayer.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayer.h new file mode 100644 index 0000000..ab4785c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayer.h @@ -0,0 +1,75 @@ +#pragma once + +#include "../ovkTKernelObject.h" +#include "ovkCScheduler.h" + +#include "../ovkCKernelContext.h" + +#include + +#include + +namespace OpenViBE { +namespace Kernel { +class CScenarioSettingKeywordParserCallback; + +class CPlayer final : public TKernelObject +{ +public: + + explicit CPlayer(const IKernelContext& ctx); + ~CPlayer() override; + bool setScenario(const CIdentifier& scenarioID, const CNameValuePairList* localConfigurationTokens) override; + IConfigurationManager& getRuntimeConfigurationManager() const override; + IScenarioManager& getRuntimeScenarioManager() const override; + CIdentifier getRuntimeScenarioIdentifier() const override; + + + bool isHoldingResources() const; + EPlayerReturnCodes initialize() override; + bool uninitialize() override; + bool stop() override; + bool pause() override; + bool step() override; + bool play() override; + bool forward() override; + EPlayerStatus getStatus() const override; + bool setFastForwardMaximumFactor(double fastForwardFactor) override; + double getFastForwardMaximumFactor() const override; + double getCPUUsage() const override; + bool loop(uint64_t elapsedTime, uint64_t maximumTimeToReach) override; + uint64_t getCurrentSimulatedTime() const override; + uint64_t getCurrentSimulatedLateness() const; + + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Player_Player) + +protected: + + CKernelContextBridge m_kernelCtxBridge; + IConfigurationManager* m_runtimeConfigManager = nullptr; + IScenarioManager* m_runtimeScenarioManager = nullptr; + CScenarioSettingKeywordParserCallback* m_scenarioSettingKeywordParserCB = nullptr; + + CScheduler m_scheduler; + + uint64_t m_currentTimeToReach = 0; + uint64_t m_lateness = 0; + uint64_t m_innerLateness = 0; + EPlayerStatus m_status = EPlayerStatus::Stop; + bool m_isInitializing = false; + double m_fastForwardMaximumFactor = 0; + + std::string m_scenarioConfigFile; + std::string m_workspaceConfigFile; + + // Stores the identifier of the scenario that is being played + CIdentifier m_scenarioID = CIdentifier::undefined(); + +private: + CIdentifier m_runtimeScenarioID = CIdentifier::undefined(); + + System::CChrono m_benchmarkChrono; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayerContext.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayerContext.cpp new file mode 100644 index 0000000..adc5f81 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayerContext.cpp @@ -0,0 +1,28 @@ +#include "ovkCPlayerContext.h" +#include "ovkCSimulatedBox.h" +#include "ovkCScheduler.h" +#include "ovkCPlayer.h" + +namespace OpenViBE { +namespace Kernel { + +CPlayerContext::CPlayerContext(const IKernelContext& ctx, CSimulatedBox* pSimulatedBox) + : TKernelObject(ctx), m_simulatedBox(*pSimulatedBox), m_pluginManager(ctx.getPluginManager()), + m_algorithmManager(ctx.getAlgorithmManager()), m_configManager(ctx.getConfigurationManager()), + m_logManager(ctx.getLogManager()), m_errorManager(ctx.getErrorManager()), m_scenarioManager(ctx.getScenarioManager()), + m_typeManager(ctx.getTypeManager()), m_boxLogManager(*this, m_logManager, m_simulatedBox) {} + +uint64_t CPlayerContext::getCurrentTime() const { return m_simulatedBox.getScheduler().getCurrentTime(); } +uint64_t CPlayerContext::getCurrentLateness() const { return m_simulatedBox.getScheduler().getCurrentLateness(); } +double CPlayerContext::getCurrentCPUUsage() const { return m_simulatedBox.getScheduler().getCPUUsage(); } +double CPlayerContext::getCurrentFastForwardMaximumFactor() const { return m_simulatedBox.getScheduler().getFastForwardMaximumFactor(); } + +bool CPlayerContext::stop() { return m_simulatedBox.getScheduler().getPlayer().stop(); } +bool CPlayerContext::pause() { return m_simulatedBox.getScheduler().getPlayer().pause(); } +bool CPlayerContext::play() { return m_simulatedBox.getScheduler().getPlayer().play(); } +bool CPlayerContext::forward() { return m_simulatedBox.getScheduler().getPlayer().forward(); } + +EPlayerStatus CPlayerContext::getStatus() const { return m_simulatedBox.getScheduler().getPlayer().getStatus(); } + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayerContext.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayerContext.h new file mode 100644 index 0000000..e961b97 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayerContext.h @@ -0,0 +1,53 @@ +#pragma once + +#include "ovkCBoxAlgorithmLogManager.h" +#include "../ovkTKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +class CSimulatedBox; + +class CPlayerContext final : public TKernelObject +{ +public: + + CPlayerContext(const IKernelContext& ctx, CSimulatedBox* pSimulatedBox); + ~CPlayerContext() override { } + + uint64_t getCurrentTime() const override; + uint64_t getCurrentLateness() const override; + double getCurrentCPUUsage() const override; + double getCurrentFastForwardMaximumFactor() const override; + + bool stop() override; + bool pause() override; + bool play() override; + bool forward() override; + EPlayerStatus getStatus() const override; + + IAlgorithmManager& getAlgorithmManager() const override { return m_algorithmManager; } + IConfigurationManager& getConfigurationManager() const override { return m_configManager; } + ILogManager& getLogManager() const override { return m_boxLogManager; } + IErrorManager& getErrorManager() const override { return m_errorManager; } + IScenarioManager& getScenarioManager() const override { return m_scenarioManager; } + ITypeManager& getTypeManager() const override { return m_typeManager; } + bool canCreatePluginObject(const CIdentifier& pluginID) const override { return m_pluginManager.canCreatePluginObject(pluginID); } + Plugins::IPluginObject* createPluginObject(const CIdentifier& pluginID) const override { return m_pluginManager.createPluginObject(pluginID); } + bool releasePluginObject(Plugins::IPluginObject* pluginObject) const override { return m_pluginManager.releasePluginObject(pluginObject); } + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Player_PlayerContext) + +private: + + CSimulatedBox& m_simulatedBox; + IPluginManager& m_pluginManager; + IAlgorithmManager& m_algorithmManager; + IConfigurationManager& m_configManager; + ILogManager& m_logManager; + IErrorManager& m_errorManager; + IScenarioManager& m_scenarioManager; + ITypeManager& m_typeManager; + mutable CBoxAlgorithmLogManager m_boxLogManager; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayerManager.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayerManager.cpp new file mode 100644 index 0000000..95d3441 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayerManager.cpp @@ -0,0 +1,57 @@ +#include "ovkCPlayerManager.h" +#include "ovkCPlayer.h" + +#include + +namespace OpenViBE { +namespace Kernel { + +bool CPlayerManager::createPlayer(CIdentifier& playerID) +{ + playerID = getUnusedIdentifier(); + m_players[playerID] = new CPlayer(getKernelContext()); + return true; +} + +bool CPlayerManager::releasePlayer(const CIdentifier& playerID) +{ + auto it = m_players.find(playerID); + + OV_ERROR_UNLESS_KRF(it != m_players.end(), "Player release failed, identifier :" << playerID.str(), Kernel::ErrorType::ResourceNotFound); + + delete it->second; + m_players.erase(it); + return true; +} + +IPlayer& CPlayerManager::getPlayer(const CIdentifier& playerID) +{ + const auto it = m_players.find(playerID); + + // use fatal here because the signature does not allow + // proper checking + OV_FATAL_UNLESS_K(it != m_players.end(), "Trying to retrieve non existing player with id " << playerID.str(), Kernel::ErrorType::ResourceNotFound); + + // use a fatal here because failing to meet this invariant + // means there is a bug in the manager implementation + OV_FATAL_UNLESS_K(it->second, "Null player found for id " << playerID.str(), Kernel::ErrorType::BadValue); + + return *it->second; +} + +CIdentifier CPlayerManager::getUnusedIdentifier() const +{ + uint64_t id = CIdentifier::random().id(); + CIdentifier res; + std::map::const_iterator i; + do + { + id++; + res = CIdentifier(id); + i = m_players.find(res); + } while (i != m_players.end() || res == CIdentifier::undefined()); + return res; +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayerManager.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayerManager.h new file mode 100644 index 0000000..493fc12 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCPlayerManager.h @@ -0,0 +1,30 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +#include + +namespace OpenViBE { +namespace Kernel { +class CPlayer; + +class CPlayerManager final : public TKernelObject +{ +public: + + explicit CPlayerManager(const IKernelContext& ctx) : TKernelObject(ctx) {} + bool createPlayer(CIdentifier& playerID) override; + bool releasePlayer(const CIdentifier& playerID) override; + IPlayer& getPlayer(const CIdentifier& playerID) override; + CIdentifier getNextPlayerIdentifier(const CIdentifier& previousID) const override { return getNextIdentifier(m_players, previousID); } + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Player_PlayerManager) + +protected: + + CIdentifier getUnusedIdentifier() const; + + std::map m_players; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCScheduler.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCScheduler.cpp new file mode 100755 index 0000000..ddddd84 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCScheduler.cpp @@ -0,0 +1,638 @@ +#include + +#include "ovkCScheduler.h" +#include "ovkCSimulatedBox.h" +#include "ovkCPlayer.h" +#include "../scenario/ovkCScenarioSettingKeywordParserCallback.h" +#include "ovkCBoxSettingModifierVisitor.h" + +#include + +#include + +#include +#include + +#if defined TARGET_OS_Windows +#define stricmp _stricmp +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + #include + #define stricmp strcasecmp +#else +// TODO +#endif + +#include + +namespace OpenViBE { +namespace Kernel { + +#define OVTK_Algorithm_ScenarioImporter_OutputParameterId_Scenario CIdentifier(0x29574C87, 0x7BA77780) +#define OVTK_Algorithm_ScenarioImporter_InputParameterId_MemoryBuffer CIdentifier(0x600463A3, 0x474B7F66) + +#define OV_AttributeId_Box_Disabled CIdentifier(0x341D3912, 0x1478DE86) + +CScheduler::CScheduler(const IKernelContext& ctx, CPlayer& player) + : TKernelObject(ctx), m_rPlayer(player), m_scenarioID(CIdentifier::undefined()) {} + +CScheduler::~CScheduler() { this->uninitialize(); } + +//___________________________________________________________________// +// // + +bool CScheduler::setScenario(const CIdentifier& scenarioID) +{ + this->getLogManager() << LogLevel_Trace << "Scheduler setScenario\n"; + + OV_ERROR_UNLESS_KRF(!this->isHoldingResources(), "Trying to configure a scheduler with non-empty resources", Kernel::ErrorType::BadCall); + + m_scenarioID = scenarioID; + + // We need to flatten the scenario here as the application using the scheduler needs time + // between the moment the visualisation tree is complete and the moment when boxes are initialized. + // The application needs to initialize necessary windows for the boxes to draw into. + m_scenario = &m_rPlayer.getRuntimeScenarioManager().getScenario(m_scenarioID); + + if (!this->flattenScenario()) + { + // error handling is performed within flattenScenario + return false; + } + + m_scenario = nullptr; + + return true; +} + +bool CScheduler::setFrequency(const uint64_t frequency) +{ + this->getLogManager() << LogLevel_Trace << "Scheduler setFrequency\n"; + + OV_ERROR_UNLESS_KRF(!this->isHoldingResources(), "Trying to configure a scheduler with non-empty resources", Kernel::ErrorType::BadCall); + + m_frequency = frequency; + m_stepDuration = (1LL << 32) / frequency; + return true; +} + +//___________________________________________________________________// +// // + +bool CScheduler::isHoldingResources() const { return !m_simulatedBoxes.empty(); } + +//___________________________________________________________________// +// // + +bool CScheduler::flattenScenario() +{ + OV_ERROR_UNLESS_KRF(m_scenario->applyLocalSettings(), "Failed to flatten scenario: applying local settings failed", Kernel::ErrorType::Internal); + + // We are going to find all metaboxes in the scenario and then push their contents to this one + // As the scenario itself can contain more metaboxes, we are going to repeat this process + // util there are no unhandled metaboxes left + bool hasFinishedHandlingMetaboxes = false; + + while (!hasFinishedHandlingMetaboxes) + { + // First find all the metaboxes in the scenario + std::vector scenarioMetaboxes; + + { + CIdentifier* listID = nullptr; + size_t nbElems = 0; + m_scenario->getBoxIdentifierList(&listID, &nbElems); + for (size_t i = 0; i < nbElems; ++i) + { + const CIdentifier boxID = listID[i]; + const IBox* box = m_scenario->getBoxDetails(boxID); + + if (box->getAlgorithmClassIdentifier() == OVP_ClassId_BoxAlgorithm_Metabox) + { + if (box->hasAttribute(OV_AttributeId_Box_Disabled)) // We only process this box if it is not disabled + { + m_scenario->removeBox(boxID); + } + else if (box->hasAttribute(OVP_AttributeId_Metabox_ID)) // We verify that the box actually has a backend scenario + { + CIdentifier metaboxId; + metaboxId.fromString(box->getAttributeValue(OVP_AttributeId_Metabox_ID)); + CString metaboxScenarioPath(this->getKernelContext().getMetaboxManager().getMetaboxFilePath(metaboxId)); + + if (FS::Files::fileExists(metaboxScenarioPath.toASCIIString())) + { + // If the scenario exists we will handle this metabox + scenarioMetaboxes.push_back(boxID); + } + else + { + // Non-utilisable metaboxes can be easily removed + OV_WARNING_K("The scenario for metabox [" << metaboxId.str() << "] is missing."); + m_scenario->removeBox(boxID); + } + } + else + { + OV_WARNING_K("The metabox [" << boxID << "] is missing its identifier field."); + m_scenario->removeBox(boxID); + } + } + } + m_scenario->releaseIdentifierList(listID); + } + + if (scenarioMetaboxes.empty()) { hasFinishedHandlingMetaboxes = true; } + + // Now load each of the found metaboxes, load the scenario that represents it + // Assign the settings from the box to the scenario + // Calculate new settings for each box inside this scenario (by expanding $var settings) + // Merge the scenario into this one + // Re-connect all links for the scenario + + for (const auto& boxID : scenarioMetaboxes) + { + IBox* box = m_scenario->getBoxDetails(boxID); + + // The box has an attribute with the metabox ID and config manager has a path to each metabox scenario + CString str = box->getAttributeValue(OVP_AttributeId_Metabox_ID); + CIdentifier metaboxId; + metaboxId.fromString(str); + CString metaboxScenarioPath(this->getKernelContext().getMetaboxManager().getMetaboxFilePath(metaboxId)); + + OV_ERROR_UNLESS_KRF(str != CString(""), "Failed to find metabox with id " << str, Kernel::ErrorType::ResourceNotFound); + + // We are going to copy the template scenario, flatten it and then copy all + // Note that copy constructor for IScenario does not exist + CIdentifier metaboxScenarioTemplateID; + + OV_ERROR_UNLESS_KRF( + m_rPlayer.getRuntimeScenarioManager().importScenarioFromFile(metaboxScenarioTemplateID, + OV_ScenarioImportContext_SchedulerMetaboxImport, metaboxScenarioPath), + "Failed to import the scenario file", Kernel::ErrorType::Internal); + + IScenario& metaboxScenarioInstance = m_rPlayer.getRuntimeScenarioManager().getScenario(metaboxScenarioTemplateID); + + OV_WARNING_UNLESS_K(metaboxScenarioInstance.hasAttribute(OV_AttributeId_Scenario_MetaboxHash), + "Box " << box->getName() << " [" << metaboxScenarioPath << "] has no computed hash"); + + OV_WARNING_UNLESS_K( + box->getAttributeValue(OV_AttributeId_Box_InitialPrototypeHashValue) == metaboxScenarioInstance.getAttributeValue( + OV_AttributeId_Scenario_MetaboxHash), + "Box " << box->getName() << " [" << str << "] should be updated"); + + metaboxScenarioInstance.addAttribute(OV_AttributeId_ScenarioFilename, metaboxScenarioPath); + + // Push down the settings from the box to the scenario + for (size_t idx = 0; idx < box->getSettingCount(); ++idx) + { + CString value; + CIdentifier id; + + box->getSettingValue(idx, value); + box->getInterfacorIdentifier(Setting, idx, id); + + if (id != CIdentifier::undefined()) { metaboxScenarioInstance.setSettingValue(id, value); } + else { metaboxScenarioInstance.setSettingValue(idx, value); } + } + + // Create settings with the path to the Metabox, + // these settings will be accessible from within the Metabox on runtime + std::string metaboxFilename = metaboxScenarioPath.toASCIIString(); + std::string metaboxDirectoryPath = "."; + metaboxScenarioInstance.addSetting("Player_MetaboxScenarioFilename", OV_TypeId_Filename, metaboxScenarioPath); + + const size_t lastSlashPos = metaboxFilename.rfind('/'); + if (lastSlashPos != std::string::npos) { metaboxDirectoryPath = metaboxFilename.substr(0, lastSlashPos); } + + metaboxScenarioInstance.addSetting("Player_MetaboxScenarioDirectory", OV_TypeId_Foldername, metaboxDirectoryPath.c_str()); + + // apply the settings within the loaded scenario + metaboxScenarioInstance.applyLocalSettings(); + + std::map correspondenceID; + class CScenarioMergeCallback : public IScenario::IScenarioMergeCallback + { + public: + explicit + CScenarioMergeCallback(std::map& rIdentifierCorrespondence) : m_correspondenceID(rIdentifierCorrespondence) { } + + void process(CIdentifier& originalID, CIdentifier& newId) override { m_correspondenceID[originalID] = newId; } + + private: + std::map& m_correspondenceID; + }; + + CScenarioMergeCallback scenarioMergeCB(correspondenceID); + + // Copy the boxes and the links from the template metabox scenario to this one + m_scenario->merge(metaboxScenarioInstance, &scenarioMergeCB, false, false); + + // Now reconnect all the pipes + + // Connect metabox inputs + { + CIdentifier* listID = nullptr; + size_t nbElems = 0; + m_scenario->getLinkIdentifierToBoxList(box->getIdentifier(), &listID, &nbElems); + for (size_t i = 0; i < nbElems; ++i) + { + ILink* link = m_scenario->getLinkDetails(listID[i]); + // Find out the target inside the metabox scenario + CIdentifier dstBoxID; + size_t dstBoxInputIdx = 0; + CIdentifier metaBoxInputID = link->getTargetBoxInputIdentifier(); + size_t metaBoxInputIdx = link->getTargetBoxInputIndex(); + + if (metaBoxInputID != CIdentifier::undefined()) { metaboxScenarioInstance.getInterfacorIndex(Input, metaBoxInputID, metaBoxInputIdx); } + OV_ERROR_UNLESS_KRF(metaBoxInputIdx != size_t(-1), "Failed to find metabox input with identifier " << metaBoxInputID.str(), + ErrorType::ResourceNotFound); + metaboxScenarioInstance.getScenarioInputLink(metaBoxInputIdx, dstBoxID, dstBoxInputIdx); + + // Now redirect the link to the newly created copy of the box in the scenario + CIdentifier dstBoxInputID = CIdentifier::undefined(); + if (dstBoxID != CIdentifier::undefined()) + { + m_scenario->getBoxDetails(correspondenceID[dstBoxID])->getInterfacorIdentifier(Input, dstBoxInputIdx, dstBoxInputID); + link->setTarget(correspondenceID[dstBoxID], dstBoxInputIdx, dstBoxInputID); + } + } + m_scenario->releaseIdentifierList(listID); + } + + // Connect metabox outputs + { + CIdentifier* listID = nullptr; + size_t nbElems = 0; + m_scenario->getLinkIdentifierFromBoxList(box->getIdentifier(), &listID, &nbElems); + for (size_t i = 0; i < nbElems; ++i) + { + ILink* link = m_scenario->getLinkDetails(listID[i]); + // Find out the Source inside the metabox scenario + CIdentifier srcBoxID; + size_t srcBoxOutputIdx = 0; + CIdentifier metaBoxOutputID = link->getSourceBoxOutputIdentifier(); + size_t metaBoxOutputIdx = link->getSourceBoxOutputIndex(); + + if (metaBoxOutputID != CIdentifier::undefined()) { metaboxScenarioInstance.getInterfacorIndex(Output, metaBoxOutputID, metaBoxOutputIdx); } + OV_ERROR_UNLESS_KRF(metaBoxOutputIdx != size_t(-1), + "Failed to find metabox input with identifier " << metaBoxOutputID.str(), Kernel::ErrorType::ResourceNotFound); + metaboxScenarioInstance.getScenarioOutputLink(metaBoxOutputIdx, srcBoxID, srcBoxOutputIdx); + + // Now redirect the link to the newly created copy of the box in the scenario + CIdentifier srcBoxOutputID = CIdentifier::undefined(); + if (srcBoxID != CIdentifier::undefined()) + { + m_scenario->getBoxDetails(correspondenceID[srcBoxID])->getInterfacorIdentifier(Output, srcBoxOutputIdx, srcBoxOutputID); + + link->setSource(correspondenceID[srcBoxID], srcBoxOutputIdx, srcBoxOutputID); + } + } + m_scenario->releaseIdentifierList(listID); + } + } + + // Remove processed metaboxes from the scenario + for (const CIdentifier& metaboxID : scenarioMetaboxes) { m_scenario->removeBox(metaboxID); } + } + + return true; +} + +ESchedulerInitialization CScheduler::initialize() +{ + this->getLogManager() << LogLevel_Trace << "Scheduler initialize\n"; + + OV_ERROR_UNLESS_K(!this->isHoldingResources(), "Trying to configure a scheduler with non-empty resources", Kernel::ErrorType::BadCall, + ESchedulerInitialization::Failed); + + m_scenario = &m_rPlayer.getRuntimeScenarioManager().getScenario(m_scenarioID); + + OV_ERROR_UNLESS_K(m_scenario, "Failed to find scenario with id " << m_scenarioID.str(), Kernel::ErrorType::ResourceNotFound, + ESchedulerInitialization::Failed); + + OV_ERROR_UNLESS_K(m_scenario->getNextBoxIdentifier(CIdentifier::undefined()) != CIdentifier::undefined(), + "Cannot initialize scheduler with an empty scenario", Kernel::ErrorType::BadCall, ESchedulerInitialization::Failed); + + CBoxSettingModifierVisitor boxSettingModifierVisitor(&this->getKernelContext().getConfigurationManager()); + + OV_ERROR_UNLESS_K(m_scenario->acceptVisitor(boxSettingModifierVisitor), "Failed to set box settings visitor for scenario with id " + << m_scenarioID.str(), Kernel::ErrorType::Internal, ESchedulerInitialization::Failed); + + + { + CIdentifier* listID = nullptr; + size_t nbElems = 0; + m_scenario->getBoxIdentifierList(&listID, &nbElems); + + // Create sets of x and y positions, note that C++ sets are always ordered + // We work with indexes rather than just positions because the positions are not bounded and can overflow + std::set xpositions; + std::set ypositions; + for (size_t i = 0; i < nbElems; ++i) + { + const IBox* box = m_scenario->getBoxDetails(listID[i]); + + if (box->hasAttribute(OV_AttributeId_Box_YCenterPosition)) + { + try + { + int y = std::stoi(box->getAttributeValue(OV_AttributeId_Box_YCenterPosition).toASCIIString()); + ypositions.insert(y); + } + catch (const std::exception&) + { + OV_WARNING_K( + "The Y position (" << box->getAttributeValue(OV_AttributeId_Box_YCenterPosition) << ") " << " in the Box " << listID[i] << + " is corrupted"); + } + } + if (box->hasAttribute(OV_AttributeId_Box_XCenterPosition)) + { + try + { + int x = std::stoi(box->getAttributeValue(OV_AttributeId_Box_XCenterPosition).toASCIIString()); + xpositions.insert(x); + } + catch (const std::exception&) + { + OV_WARNING_K( + "The X position (" << box->getAttributeValue(OV_AttributeId_Box_XCenterPosition) << ") " << " in the Box " << listID[i] << + " is corrupted"); + } + } + } + + for (size_t i = 0; i < nbElems; ++i) + { + const CIdentifier boxID = listID[i]; + const IBox* box = m_scenario->getBoxDetails(boxID); + OV_ERROR_UNLESS_K( + !m_scenario->hasOutdatedBox() || !this->getConfigurationManager().expandAsBoolean("${Kernel_AbortPlayerWhenBoxIsOutdated}", false), + "Box [" << box->getName() << "] with class identifier [" << boxID.str() << "] should be updated", + ErrorType::Internal, ESchedulerInitialization::Failed); + + OV_ERROR_UNLESS_K(box->getAlgorithmClassIdentifier() != OVP_ClassId_BoxAlgorithm_Metabox, + "Not expanded metabox with id [" << box->getAttributeValue(OVP_AttributeId_Metabox_ID) << "] detected in the scenario", + ErrorType::Internal, ESchedulerInitialization::Failed); + + const Plugins::IPluginObjectDesc* boxDesc = this->getPluginManager().getPluginObjectDescCreating(box->getAlgorithmClassIdentifier()); + + OV_ERROR_UNLESS_K( + !(box->hasAttribute(OV_AttributeId_Box_Disabled) && this->getConfigurationManager().expandAsBoolean("${Kernel_AbortPlayerWhenBoxIsDisabled}", + false)), + "Disabled box [" << box->getName() << "] with class identifier [" << boxID.str() << "] detected in the scenario", + ErrorType::Internal, ESchedulerInitialization::Failed); + + if (!box->hasAttribute(OV_AttributeId_Box_Disabled)) + { + OV_ERROR_UNLESS_K(boxDesc != nullptr, + "Failed to create runtime box [" << box->getName() << "] with class identifier [" << boxID.str() << "]", + ErrorType::BadResourceCreation, ESchedulerInitialization::Failed); + + CSimulatedBox* simulatedBox = new CSimulatedBox(this->getKernelContext(), *this); + simulatedBox->setScenarioIdentifier(m_scenarioID); + simulatedBox->setBoxIdentifier(boxID); + + + // Set priority so boxes execute in this order + // - boxes with positive priority attribute set in descending order + // - boxes in scenario from left to right and from top to bottom + // - boxes with negative priority set in descending order + int priority = 0; + try + { + if (box->hasAttribute(OV_AttributeId_Box_Priority)) + { + const int p = std::stoi(box->getAttributeValue(OV_AttributeId_Box_Priority).toASCIIString()); + + if (p < 0) { priority = -int((ypositions.size() << 15) + xpositions.size()) + p; } + else { priority = p; } + } + else if (box->hasAttribute(OV_AttributeId_Box_YCenterPosition) && box->hasAttribute(OV_AttributeId_Box_XCenterPosition)) + { + int x = std::stoi(box->getAttributeValue(OV_AttributeId_Box_XCenterPosition).toASCIIString()); + int y = std::stoi(box->getAttributeValue(OV_AttributeId_Box_YCenterPosition).toASCIIString()); + + const int xindex = int(std::distance(xpositions.begin(), xpositions.find(x))); + const int yindex = int(std::distance(ypositions.begin(), ypositions.find(y))); + priority = - ((yindex << 15) + xindex); + } + } + catch (const std::exception&) { priority = 0; } + + m_simulatedBoxes[std::make_pair(-priority, boxID)] = simulatedBox; + m_simulatedBoxChronos[boxID].reset(m_frequency); + } + } + m_scenario->releaseIdentifierList(listID); + } + + OV_ERROR_UNLESS_K(!m_simulatedBoxes.empty(), "Cannot initialize scheduler with an empty scenario", Kernel::ErrorType::BadCall, + ESchedulerInitialization::Failed); + + + bool boxInitialization = true; + for (auto it = m_simulatedBoxes.begin(); it != m_simulatedBoxes.end(); ++ + it) + { + if (auto simulatedBox = it->second) + { + this->getLogManager() << LogLevel_Trace << "Scheduled box : id = " << it->first.second << " priority = " << -it->first.first + << " name = " << simulatedBox->getName() << "\n"; + if (!translateException([&]() { return simulatedBox->initialize(); }, + std::bind(&CScheduler::handleException, this, simulatedBox, "Box initialization", std::placeholders::_1))) + { + boxInitialization = false; + + // return as soon as possible + // no need to keep on initializing boxes if a box failed to initialize + break; + } + } + } + + m_steps = 0; + m_currentTime = 0; + + m_oBenchmarkChrono.reset(m_frequency); + + return (boxInitialization ? ESchedulerInitialization::Success : ESchedulerInitialization::Failed); +} + +bool CScheduler::uninitialize() +{ + this->getLogManager() << LogLevel_Trace << "Scheduler uninitialize\n"; + + bool boxUninitialization = true; + for (auto it = m_simulatedBoxes.begin(); it != m_simulatedBoxes.end(); ++ + it) + { + if (auto simulatedBox = it->second) + { + if (!translateException([&]() { return simulatedBox->uninitialize(); }, + std::bind(&CScheduler::handleException, this, simulatedBox, "Box uninitialization", std::placeholders::_1))) + { + // do not break here because we want to try to + // at least uninitialize other resources properly + boxUninitialization = false; + } + } + } + + for (auto it = m_simulatedBoxes.begin(); it != m_simulatedBoxes.end(); ++it) { delete it->second; } + m_simulatedBoxes.clear(); + + m_scenario = nullptr; + + return boxUninitialization; +} + +//___________________________________________________________________// +// // + +bool CScheduler::loop() +{ + OV_ERROR_UNLESS_KRF(this->isHoldingResources(), "Trying to use an uninitialized scheduler", Kernel::ErrorType::BadCall); + + bool boxProcessing = true; + m_oBenchmarkChrono.stepIn(); + for (auto it = m_simulatedBoxes.begin(); it != m_simulatedBoxes.end(); ++ + it) + { + CSimulatedBox* simulatedBox = it->second; + + System::CChrono& simulatedBoxChrono = m_simulatedBoxChronos[it->first.second]; + + IBox* box = m_scenario->getBoxDetails(it->first.second); + + OV_ERROR_UNLESS_KRF(box, "Unable to get box details for box with id " << it->first.second.str(), Kernel::ErrorType::ResourceNotFound); + + simulatedBoxChrono.stepIn(); + + if (!translateException([&]() { return this->processBox(simulatedBox, it->first.second); }, + std::bind(&CScheduler::handleException, this, simulatedBox, "Box processing", std::placeholders::_1))) + { + boxProcessing = false; + + // break here because we do not want to keep on processing if one + // box fails + break; + } + + simulatedBoxChrono.stepOut(); + + if (simulatedBoxChrono.hasNewEstimation()) + { + //IBox* box=m_scenario->getBoxDetails(it->first.second); + box->addAttribute(OV_AttributeId_Box_ComputationTimeLastSecond, ""); + box->setAttributeValue(OV_AttributeId_Box_ComputationTimeLastSecond, CIdentifier(simulatedBoxChrono.getTotalStepInDuration()).toString()); + } + } + m_oBenchmarkChrono.stepOut(); + + if ((m_steps % m_frequency) == 0) + { + this->getLogManager() << LogLevel_Debug + << "<" << LogColor_PushStateBit << LogColor_ForegroundBlue << "Scheduler" << LogColor_PopStateBit + << "::" << LogColor_PushStateBit << LogColor_ForegroundBlue << "elapsed time" << LogColor_PopStateBit << "> " + << m_steps / m_frequency << "s\n"; + } + + if (m_oBenchmarkChrono.hasNewEstimation()) + { + this->getLogManager() << LogLevel_Benchmark + << "<" << LogColor_PushStateBit << LogColor_ForegroundBlue << "Scheduler" << LogColor_PopStateBit + << "::" << LogColor_PushStateBit << LogColor_ForegroundBlue << "processor use" << LogColor_PopStateBit << "> " + << m_oBenchmarkChrono.getStepInPercentage() << "%\n"; + } + + m_steps++; + + m_currentTime = m_steps * CTime(m_frequency, 1LL).time(); + + return boxProcessing; +} + +bool CScheduler::processBox(CSimulatedBox* simulatedBox, const CIdentifier& boxID) +{ + if (simulatedBox) + { + OV_ERROR_UNLESS_KRF(simulatedBox->processClock(), "Process clock failed for box with id " << boxID.str(), Kernel::ErrorType::Internal); + if (simulatedBox->isReadyToProcess()) + { + OV_ERROR_UNLESS_KRF(simulatedBox->process(), "Process failed for box with id " << boxID.str(), Kernel::ErrorType::Internal); + } + + //if the box is muted we still have to erase chunks that arrives at the input + std::map>& simulatedBoxInput = m_simulatedBoxInputs[boxID]; + for (auto it1 = simulatedBoxInput.begin(); it1 != simulatedBoxInput.end(); ++it1) + { + std::list& simulatedBoxInputChunkList = it1->second; + for (auto it2 = simulatedBoxInputChunkList.begin(); it2 != simulatedBoxInputChunkList.end(); ++it2) + { + OV_ERROR_UNLESS_KRF(simulatedBox->processInput(it1->first, *it2), + "Process failed for box with id " << boxID.str() << " on input " << it1->first, + ErrorType::Internal); + + if (simulatedBox->isReadyToProcess()) + { + OV_ERROR_UNLESS_KRF(simulatedBox->process(), "Process failed for box with id " << boxID.str(), Kernel::ErrorType::Internal); + } + } + simulatedBoxInputChunkList.clear(); + } + } + + return true; +} + +//___________________________________________________________________// +// // + +bool CScheduler::sendInput(const CChunk& chunk, const CIdentifier& boxId, const size_t index) +{ + IBox* box = m_scenario->getBoxDetails(boxId); + if (box->hasAttribute(OV_AttributeId_Box_Disabled)) { return true; } + OV_ERROR_UNLESS_KRF(box, "Tried to send data chunk with invalid box identifier " << boxId.str(), Kernel::ErrorType::ResourceNotFound); + + OV_ERROR_UNLESS_KRF(index < box->getInputCount(), + "Tried to send data chunk with invalid input index " << index << " for box identifier" << boxId.str(), + ErrorType::OutOfBound); + + auto it = m_simulatedBoxes.begin(); + while (it != m_simulatedBoxes.end() && it->first.second != boxId) { ++it; } + + OV_ERROR_UNLESS_KRF(it != m_simulatedBoxes.end(), + "Tried to send data chunk with invalid simulated box identifier " << boxId.str(), + ErrorType::ResourceNotFound); + CSimulatedBox* simulatedBox = it->second; + + // use a fatal here because failing to meet this invariant + // means there is a bug in the scheduler implementation + OV_FATAL_UNLESS_K(simulatedBox, "Null box found for id " << boxId.str(), Kernel::ErrorType::BadValue); + + // TODO: check if index does not overflow + + m_simulatedBoxInputs[boxId][index].push_back(chunk); + + return true; +} + +uint64_t CScheduler::getCurrentLateness() const { return m_rPlayer.getCurrentSimulatedLateness(); } +double CScheduler::getFastForwardMaximumFactor() const { return m_rPlayer.getFastForwardMaximumFactor(); } + +void CScheduler::handleException(const CSimulatedBox* box, const char* errorHint, const std::exception& exception) +{ + CIdentifier dstBoxID = CIdentifier::undefined(); + box->getBoxIdentifier(dstBoxID); + + box->getLogManager() << LogLevel_Error << "Exception caught in box\n"; + box->getLogManager() << LogLevel_Error << " [name:" << box->getName() << "]\n"; + box->getLogManager() << LogLevel_Error << " [class identifier:" << dstBoxID << "]\n"; + box->getLogManager() << LogLevel_Error << " [hint: " << (errorHint ? errorHint : "no hint") << "]\n"; + box->getLogManager() << LogLevel_Error << " [cause:" << exception.what() << "]\n"; + + OV_ERROR_KRV("Caught exception: " << exception.what(), Kernel::ErrorType::ExceptionCaught); +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCScheduler.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCScheduler.h new file mode 100644 index 0000000..efe4147 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCScheduler.h @@ -0,0 +1,66 @@ +#pragma once + +#include "../ovkTKernelObject.h" +#include +#include +#include + +namespace OpenViBE { +namespace Kernel { +enum class ESchedulerInitialization { Success, BoxInitializationFailed, Failed }; + +class CSimulatedBox; +class CChunk; +class CPlayer; + +class CScheduler final : public TKernelObject +{ +public: + + CScheduler(const IKernelContext& ctx, CPlayer& player); + ~CScheduler() override; + + bool setScenario(const CIdentifier& scenarioID); + bool setFrequency(uint64_t frequency); + + bool isHoldingResources() const; + + ESchedulerInitialization initialize(); + bool uninitialize(); + bool loop(); + + bool sendInput(const CChunk& chunk, const CIdentifier& boxId, size_t index); + uint64_t getCurrentTime() const { return m_currentTime; } + uint64_t getCurrentLateness() const; + uint64_t getFrequency() const { return m_frequency; } + uint64_t getStepDuration() const { return m_stepDuration; } + double getCPUUsage() const { return (const_cast(m_oBenchmarkChrono)).getStepInPercentage(); } + double getFastForwardMaximumFactor() const; + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Player_Scheduler) + + CPlayer& getPlayer() const { return m_rPlayer; } + +protected: + + CPlayer& m_rPlayer; + CIdentifier m_scenarioID = CIdentifier::undefined(); + IScenario* m_scenario = nullptr; + size_t m_steps = 0; + uint64_t m_frequency = 0; + uint64_t m_stepDuration = 0; + uint64_t m_currentTime = 0; + + std::map, CSimulatedBox*> m_simulatedBoxes; + std::map m_simulatedBoxChronos; + std::map>> m_simulatedBoxInputs; + +private: + + void handleException(const CSimulatedBox* box, const char* errorHint, const std::exception& exception); + bool processBox(CSimulatedBox* simulatedBox, const CIdentifier& boxID); + bool flattenScenario(); + System::CChrono m_oBenchmarkChrono; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCSimulatedBox.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCSimulatedBox.cpp new file mode 100644 index 0000000..2e96366 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCSimulatedBox.cpp @@ -0,0 +1,428 @@ +#include "ovkCSimulatedBox.h" +#include "ovkCPlayer.h" +#include "ovkCBoxAlgorithmContext.h" + +#include +#include +#include + +namespace OpenViBE { +namespace Kernel { + +#define OV_IncorrectTime 0xffffffffffffffffULL + +CSimulatedBox::CSimulatedBox(const IKernelContext& ctx, CScheduler& scheduler) + : TKernelObject(ctx), m_scheduler(scheduler), m_lastClockActivationDate(OV_IncorrectTime) {} + +CSimulatedBox::~CSimulatedBox() {} + +bool CSimulatedBox::setScenarioIdentifier(const CIdentifier& scenarioID) +{ + OV_ERROR_UNLESS_KRF(m_scheduler.getPlayer().getRuntimeScenarioManager().isScenario(scenarioID), + "Scenario with identifier " << scenarioID.str() << " does not exist", + ErrorType::ResourceNotFound); + + m_scenario = &m_scheduler.getPlayer().getRuntimeScenarioManager().getScenario(scenarioID); + return true; +} + +bool CSimulatedBox::getBoxIdentifier(CIdentifier& boxId) const +{ + OV_ERROR_UNLESS_KRF(m_box, "Simulated box not initialized", Kernel::ErrorType::BadCall); + + boxId = m_box->getIdentifier(); + return true; +} + +bool CSimulatedBox::setBoxIdentifier(const CIdentifier& boxId) +{ + OV_ERROR_UNLESS_KRF(m_scenario, "No scenario set", Kernel::ErrorType::BadCall); + + m_box = m_scenario->getBoxDetails(boxId); + return m_box != nullptr; +} + +bool CSimulatedBox::initialize() +{ + OV_ERROR_UNLESS_KRF(m_box, "Simulated box not initialized", Kernel::ErrorType::BadCall); + OV_ERROR_UNLESS_KRF(m_scenario, "No scenario set", Kernel::ErrorType::BadCall); + + m_chunkConsistencyChecking = this->getConfigurationManager().expandAsBoolean("${Kernel_CheckChunkConsistency}", true); + m_Inputs.resize(m_box->getInputCount()); + m_Outputs.resize(m_box->getOutputCount()); + m_CurrentOutputs.resize(m_box->getOutputCount()); + m_LastOutputStartTimes.resize(m_box->getOutputCount(), 0); + m_LastOutputEndTimes.resize(m_box->getOutputCount(), 0); + + m_lastClockActivationDate = OV_IncorrectTime; + m_clockFrequency = 0; + m_clockActivationStep = 0; + + m_boxAlgorithm = getPluginManager().createBoxAlgorithm(m_box->getAlgorithmClassIdentifier(), nullptr); + + OV_ERROR_UNLESS_KRF(m_boxAlgorithm, "Could not create box algorithm with class id " << m_box->getAlgorithmClassIdentifier().str(), + ErrorType::BadResourceCreation); + + { + CBoxAlgorithmCtx context(getKernelContext(), this, m_box); + { + OV_ERROR_UNLESS_KRF(m_boxAlgorithm->initialize(context), "Box algorithm <" << m_box->getName() << "> initialization failed", + Kernel::ErrorType::Internal); + } + } + + return true; +} + +bool CSimulatedBox::uninitialize() +{ + if (!m_boxAlgorithm) { return true; } + + { + CBoxAlgorithmCtx context(getKernelContext(), this, m_box); + { + OV_ERROR_UNLESS_KRF(m_boxAlgorithm->uninitialize(context), "Box algorithm <" << m_box->getName() << "> uninitialization failed", + ErrorType::Internal); + } + } + + getPluginManager().releasePluginObject(m_boxAlgorithm); + m_boxAlgorithm = nullptr; + + return true; +} + +bool CSimulatedBox::processClock() +{ + { + CBoxAlgorithmCtx context(getKernelContext(), this, m_box); + { + const uint64_t newFreq = m_boxAlgorithm->getClockFrequency(context); + if (newFreq == 0) + { + m_clockActivationStep = OV_IncorrectTime; + m_lastClockActivationDate = OV_IncorrectTime; + } + else + { + OV_ERROR_UNLESS_KRF(newFreq <= m_scheduler.getFrequency()<<32, + "Box " << m_box->getName() << " requested higher clock frequency (" + << newFreq << " == " << CTime(newFreq).toSeconds() << "hz) " << "than what the scheduler can handle (" + << (m_scheduler.getFrequency()<<32) << " == " << CTime(m_scheduler.getFrequency()<<32).toSeconds() << "hz)", + ErrorType::BadConfig); + + // note: 1LL should be left shifted 64 bits but this + // would result in an integer over shift (the one + // would exit). Thus the left shift of 63 bits + // and the left shift of 1 bit after the division + m_clockActivationStep = ((1ULL << 63) / newFreq) << 1; + } + m_clockFrequency = newFreq; + } + } + + if ((m_clockFrequency != 0) && (m_lastClockActivationDate == OV_IncorrectTime || m_scheduler.getCurrentTime() - m_lastClockActivationDate >= + m_clockActivationStep)) + { + CBoxAlgorithmCtx context(getKernelContext(), this, m_box); + { + if (m_lastClockActivationDate == OV_IncorrectTime) { m_lastClockActivationDate = m_scheduler.getCurrentTime(); } + else { m_lastClockActivationDate = m_lastClockActivationDate + m_clockActivationStep; } + + CMessageClock message; + message.setTime(m_lastClockActivationDate); + + OV_ERROR_UNLESS_KRF(m_boxAlgorithm->processClock(context, message), + "Box algorithm <" << m_box->getName() << "> processClock() function failed", Kernel::ErrorType::Internal); + + m_readyToProcess |= context.isAlgorithmReadyToProcess(); + } + } + + return true; +} + +bool CSimulatedBox::processInput(const size_t index, const CChunk& chunk) +{ + m_Inputs[index].push_back(chunk); + + { + CBoxAlgorithmCtx context(getKernelContext(), this, m_box); + { + OV_ERROR_UNLESS_KRF(m_boxAlgorithm->processInput(context, index), + "Box algorithm <" << m_box->getName() << "> processInput() function failed", Kernel::ErrorType::Internal); + } + m_readyToProcess |= context.isAlgorithmReadyToProcess(); + } + + return true; +} + +bool CSimulatedBox::process() +{ + if (!m_readyToProcess) { return true; } + { + CBoxAlgorithmCtx context(getKernelContext(), this, m_box); + { + OV_ERROR_UNLESS_KRF(m_boxAlgorithm->process(context), "Box algorithm <" << m_box->getName() << "> processInput function failed", + ErrorType::Internal); + } + } + + // perform output sending + { + CIdentifier* listID = nullptr; + size_t nbElems = 0; + m_scenario->getLinkIdentifierFromBoxList(m_box->getIdentifier(), &listID, &nbElems); + for (size_t i = 0; i < nbElems; ++i) + { + const ILink* link = m_scenario->getLinkDetails(listID[i]); + if (link) + { + CIdentifier dstBoxID = link->getTargetBoxIdentifier(); + const size_t dstBoxInputIdx = link->getTargetBoxInputIndex(); + + const size_t sourceOutputIdx = link->getSourceBoxOutputIndex(); + for (auto& chunk : m_Outputs[sourceOutputIdx]) { m_scheduler.sendInput(chunk, dstBoxID, dstBoxInputIdx); } + } + } + m_scenario->releaseIdentifierList(listID); + } + + // perform input cleaning + auto socketIterator = m_Inputs.begin(); + while (socketIterator != m_Inputs.end()) + { + auto inputChunkIterator = socketIterator->begin(); + while (inputChunkIterator != socketIterator->end()) + { + if (inputChunkIterator->isDeprecated()) { inputChunkIterator = socketIterator->erase(inputChunkIterator); } + else { ++inputChunkIterator; } + } + ++socketIterator; + } + + // flushes sent output chunks + for (auto& socket : m_Outputs) { socket.resize(0); } + + // discards waiting output chunks + for (const auto& chunk : m_CurrentOutputs) + { + OV_FATAL_UNLESS_K(chunk.getBuffer().getSize() == 0, "Output buffer filled but not marked as ready to send. Possible loss of data.", + ErrorType::Internal); + } + + m_readyToProcess = false; + + return true; +} + +bool CSimulatedBox::isReadyToProcess() const { return m_readyToProcess; } + +// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- +// - --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- - +// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- + +CString CSimulatedBox::getName() const { return m_box->getName(); } + +const IScenario& CSimulatedBox::getScenario() const { return *m_scenario; } + +// ________________________________________________________________________________________________________________ +// + +size_t CSimulatedBox::getInputChunkCount(const size_t index) const +{ + OV_ERROR_UNLESS_KRF(index < m_Inputs.size(), + "Input index = [" << index << "] is out of range (max index = [" << m_Inputs.size() - 1 << "])", + ErrorType::OutOfBound); + + return size_t(m_Inputs[index].size()); +} + +bool CSimulatedBox::getInputChunk(const size_t inputIdx, const size_t chunkIdx, uint64_t& startTime, uint64_t& endTime, size_t& size, + const uint8_t*& buffer) const +{ + OV_ERROR_UNLESS_KRF(inputIdx < m_Inputs.size(), + "Input index = [" << inputIdx << "] is out of range (max index = [" << m_Inputs.size() - 1 << "])", Kernel::ErrorType::OutOfBound); + + OV_ERROR_UNLESS_KRF(chunkIdx < m_Inputs[inputIdx].size(), + "Input chunk index = [" << chunkIdx << "] is out of range (max index = [" << m_Inputs[inputIdx].size() - 1 << "])", + ErrorType::OutOfBound); + + const CChunk& chunk = m_Inputs[inputIdx][chunkIdx]; + startTime = chunk.getStartTime(); + endTime = chunk.getEndTime(); + size = chunk.getBuffer().getSize(); + buffer = chunk.getBuffer().getDirectPointer(); + return true; +} + +const IMemoryBuffer* CSimulatedBox::getInputChunk(const size_t inputIdx, const size_t chunkIdx) const +{ + OV_ERROR_UNLESS_KRN(inputIdx < m_Inputs.size(), + "Input index = [" << inputIdx << "] is out of range (max index = [" << m_Inputs.size() - 1 << "])", + ErrorType::OutOfBound); + + OV_ERROR_UNLESS_KRN(chunkIdx < m_Inputs[inputIdx].size(), + "Input chunk index = [" << chunkIdx << "] is out of range (max index = [" << m_Inputs[inputIdx].size() - 1 << "])", + ErrorType::OutOfBound); + + return &(m_Inputs[inputIdx][chunkIdx]).getBuffer(); +} + +uint64_t CSimulatedBox::getInputChunkStartTime(const size_t inputIdx, const size_t chunkIdx) const +{ + OV_ERROR_UNLESS_KRZ(inputIdx < m_Inputs.size(), + "Input index = [" << inputIdx << "] is out of range (max index = [" << m_Inputs.size() - 1 << "])", + ErrorType::OutOfBound); + + OV_ERROR_UNLESS_KRZ(chunkIdx < m_Inputs[inputIdx].size(), + "Input chunk index = [" << chunkIdx << "] is out of range (max index = [" << m_Inputs[inputIdx].size() - 1 << "])", + ErrorType::OutOfBound); + + const CChunk& chunk = m_Inputs[inputIdx][chunkIdx]; + return chunk.getStartTime(); +} + +uint64_t CSimulatedBox::getInputChunkEndTime(const size_t inputIdx, const size_t chunkIdx) const +{ + OV_ERROR_UNLESS_KRZ(inputIdx < m_Inputs.size(), + "Input index = [" << inputIdx << "] is out of range (max index = [" << m_Inputs.size() - 1 << "])", + ErrorType::OutOfBound); + + OV_ERROR_UNLESS_KRZ(chunkIdx < m_Inputs[inputIdx].size(), + "Input chunk index = [" << chunkIdx << "] is out of range (max index = [" << m_Inputs[inputIdx].size() - 1 << "])", + ErrorType::OutOfBound); + + const CChunk& chunk = m_Inputs[inputIdx][chunkIdx]; + return chunk.getEndTime(); +} + +bool CSimulatedBox::markInputAsDeprecated(const size_t inputIdx, const size_t chunkIdx) +{ + OV_ERROR_UNLESS_KRZ(inputIdx < m_Inputs.size(), + "Input index = [" << inputIdx << "] is out of range (max index = [" << m_Inputs.size() - 1 << "])", + ErrorType::OutOfBound); + + OV_ERROR_UNLESS_KRZ(chunkIdx < m_Inputs[inputIdx].size(), + "Input chunk index = [" << chunkIdx << "] is out of range (max index = [" << m_Inputs[inputIdx].size() - 1 << "])", + ErrorType::OutOfBound); + + m_Inputs[inputIdx][chunkIdx].markAsDeprecated(true); + return true; +} + +// ________________________________________________________________________________________________________________ +// + +size_t CSimulatedBox::getOutputChunkSize(const size_t outputIdx) const +{ + OV_ERROR_UNLESS_KRZ(outputIdx < m_CurrentOutputs.size(), + "Output index = [" << outputIdx << "] is out of range (max index = [" << m_CurrentOutputs.size() - 1 << "])", + ErrorType::OutOfBound); + + return m_CurrentOutputs[outputIdx].getBuffer().getSize(); +} + +bool CSimulatedBox::setOutputChunkSize(const size_t outputIdx, const size_t size, const bool discard) +{ + OV_ERROR_UNLESS_KRF(outputIdx < m_CurrentOutputs.size(), + "Output index = [" << outputIdx << "] is out of range (max index = [" << m_CurrentOutputs.size() - 1 << "])", + ErrorType::OutOfBound); + + return m_CurrentOutputs[outputIdx].getBuffer().setSize(size, discard); +} + +uint8_t* CSimulatedBox::getOutputChunkBuffer(const size_t outputIdx) +{ + OV_ERROR_UNLESS_KRN(outputIdx < m_CurrentOutputs.size(), + "Output index = [" << outputIdx << "] is out of range (max index = [" << m_CurrentOutputs.size() - 1 << "])", + ErrorType::OutOfBound); + + return m_CurrentOutputs[outputIdx].getBuffer().getDirectPointer(); +} + +bool CSimulatedBox::appendOutputChunkData(const size_t outputIdx, const uint8_t* buffer, const size_t size) +{ + OV_ERROR_UNLESS_KRF(outputIdx < m_CurrentOutputs.size(), + "Output index = [" << outputIdx << "] is out of range (max index = [" << m_CurrentOutputs.size() - 1 << "])", + ErrorType::OutOfBound); + + return m_CurrentOutputs[outputIdx].getBuffer().append(buffer, size); +} + +IMemoryBuffer* CSimulatedBox::getOutputChunk(const size_t outputIdx) +{ + OV_ERROR_UNLESS_KRN(outputIdx < m_CurrentOutputs.size(), + "Output index = [" << outputIdx << "] is out of range (max index = [" << m_CurrentOutputs.size() - 1 << "])", + ErrorType::OutOfBound); + + return &m_CurrentOutputs[outputIdx].getBuffer(); +} + +bool CSimulatedBox::markOutputAsReadyToSend(const size_t outputIdx, const uint64_t startTime, const uint64_t endTime) +{ + OV_ERROR_UNLESS_KRF(outputIdx < m_CurrentOutputs.size(), + "Output index = [" << outputIdx << "] is out of range (max index = [" << m_CurrentOutputs.size() - 1 << "])", + ErrorType::OutOfBound); + + if (m_chunkConsistencyChecking) + { + bool isConsistent = true; + const char* specificMessage = nullptr; + + // checks chunks consistency + CIdentifier type; + m_box->getOutputType(outputIdx, type); + if (type == OV_TypeId_Stimulations) + { + if (m_LastOutputEndTimes[outputIdx] != startTime) + { + isConsistent = false; + specificMessage = "'Stimulations' streams should have continuously dated chunks"; + } + } + + if (m_LastOutputEndTimes[outputIdx] > endTime) + { + isConsistent = false; + specificMessage = "Current 'end time' can not be earlier than previous 'end time'"; + } + + if (m_LastOutputStartTimes[outputIdx] > startTime) + { + isConsistent = false; + specificMessage = "Current 'start time' can not be earlier than previous 'start time'"; + } + + if (!isConsistent) + { + this->getLogManager() << m_chunkConsistencyCheckingLogLevel << "Box <" << m_box->getName() << "> sends inconsistent chunk dates on output [" << + outputIdx << "] (current chunk dates are [" << startTime << "," << endTime << "] whereas previous chunk dates were [" << + m_LastOutputStartTimes[outputIdx] << "," << m_LastOutputEndTimes[outputIdx] << "])\n"; + if (specificMessage) { this->getLogManager() << m_chunkConsistencyCheckingLogLevel << specificMessage << "\n"; } + this->getLogManager() << m_chunkConsistencyCheckingLogLevel << "Please report to box author and attach your scenario\n"; + this->getLogManager() << LogLevel_Trace << "Previous warning can be disabled setting Kernel_CheckChunkConsistency to false\n"; + m_chunkConsistencyCheckingLogLevel = LogLevel_Trace; + } + + // sets last times + m_LastOutputStartTimes[outputIdx] = startTime; + m_LastOutputEndTimes[outputIdx] = endTime; + } + + // sets start and end time + m_CurrentOutputs[outputIdx].setStartTime(std::min(startTime, endTime)); + m_CurrentOutputs[outputIdx].setEndTime(std::max(startTime, endTime)); + + // copies chunk + m_Outputs[outputIdx].push_back(m_CurrentOutputs[outputIdx]); + + // resets chunk size + m_CurrentOutputs[outputIdx].getBuffer().setSize(0, true); + + return true; +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCSimulatedBox.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCSimulatedBox.h new file mode 100644 index 0000000..a102eaa --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/player/ovkCSimulatedBox.h @@ -0,0 +1,126 @@ +#pragma once + +#include "../ovkTKernelObject.h" +#include "ovkCBuffer.h" + +#include +#include +#include +#include + +namespace OpenViBE { +namespace Kernel { +class CScheduler; + +class CChunk +{ +public: + + CChunk() { } + + CChunk(const CChunk& chunk) : m_buffer(chunk.m_buffer), m_startTime(chunk.m_startTime), m_endTime(chunk.m_endTime) { } + + const CBuffer& getBuffer() const { return m_buffer; } + uint64_t getStartTime() const { return m_startTime; } + uint64_t getEndTime() const { return m_endTime; } + bool isDeprecated() const { return m_isDeprecated; } + CBuffer& getBuffer() { return m_buffer; } + + bool setStartTime(const uint64_t startTime) + { + m_startTime = startTime; + return true; + } + + bool setEndTime(const uint64_t endTime) + { + m_endTime = endTime; + return true; + } + + bool markAsDeprecated(const bool isDeprecated) + { + m_isDeprecated = isDeprecated; + return true; + } + +protected: + + CBuffer m_buffer; + uint64_t m_startTime = 0; + uint64_t m_endTime = 0; + bool m_isDeprecated = false; +}; + +class CSimulatedBox final : public TKernelObject +{ +public: + + CSimulatedBox(const IKernelContext& ctx, CScheduler& scheduler); + ~CSimulatedBox() override; + + bool setScenarioIdentifier(const CIdentifier& scenarioID); + bool getBoxIdentifier(CIdentifier& boxId) const; + bool setBoxIdentifier(const CIdentifier& boxId); + + bool initialize(); + bool uninitialize(); + + bool processClock(); + bool processInput(const size_t index, const CChunk& chunk); + bool process(); + bool isReadyToProcess() const; + + CString getName() const; + const IScenario& getScenario() const; + + /** \name IBoxIO inputs handling */ + //@{ + size_t getInputChunkCount(const size_t index) const override; + bool getInputChunk(const size_t inputIdx, const size_t chunkIdx, uint64_t& startTime, uint64_t& endTime, size_t& size, + const uint8_t*& buffer) const override; + const IMemoryBuffer* getInputChunk(const size_t inputIdx, const size_t chunkIdx) const override; + uint64_t getInputChunkStartTime(const size_t inputIdx, const size_t chunkIdx) const override; + uint64_t getInputChunkEndTime(const size_t inputIdx, const size_t chunkIdx) const override; + bool markInputAsDeprecated(const size_t inputIdx, const size_t chunkIdx) override; + //@} + + /** \name IBoxIO outputs handling */ + //@{ + size_t getOutputChunkSize(const size_t outputIdx) const override; + bool setOutputChunkSize(const size_t outputIdx, const size_t size, const bool discard = true) override; + uint8_t* getOutputChunkBuffer(const size_t outputIdx) override; + bool appendOutputChunkData(const size_t outputIdx, const uint8_t* buffer, const size_t size) override; + IMemoryBuffer* getOutputChunk(const size_t outputIdx) override; + bool markOutputAsReadyToSend(const size_t outputIdx, const uint64_t startTime, const uint64_t endTime) override; + //@} + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Player_SimulatedBox) + + CScheduler& getScheduler() const { return m_scheduler; } + +protected: + + bool m_readyToProcess = false; + bool m_chunkConsistencyChecking = false; + ELogLevel m_chunkConsistencyCheckingLogLevel = LogLevel_Warning; + + Plugins::IBoxAlgorithm* m_boxAlgorithm = nullptr; + const IScenario* m_scenario = nullptr; + const IBox* m_box = nullptr; + CScheduler& m_scheduler; + + uint64_t m_lastClockActivationDate = 0; + uint64_t m_clockFrequency = 0; + uint64_t m_clockActivationStep = 0; + +public: + + std::vector> m_Inputs; + std::vector> m_Outputs; + std::vector m_CurrentOutputs; + std::vector m_LastOutputStartTimes; + std::vector m_LastOutputEndTimes; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/plugins/ovkCPluginManager.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/plugins/ovkCPluginManager.cpp new file mode 100755 index 0000000..fc37de3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/plugins/ovkCPluginManager.cpp @@ -0,0 +1,411 @@ +#include "ovkCPluginManager.h" +#include "ovkCPluginModule.h" + +#include +#include + +#include +#include +#include +#include +#include + +#include "../../tools/ovkSBoxProto.h" + +namespace OpenViBE { +namespace Kernel { +class CPluginManagerEntryEnumeratorCallBack final : public TKernelObject, public FS::IEntryEnumeratorCallBack +{ +public: + + CPluginManagerEntryEnumeratorCallBack(const IKernelContext& ctx, std::vector& pluginModule, + std::map& pluginObjectDesc, bool& haveAllPluginsLoadedCorrectly) + : TKernelObject(ctx), m_rPluginManager(ctx.getPluginManager()), m_rPluginModule(pluginModule), + m_rPluginObjectDesc(pluginObjectDesc), m_HaveAllPluginsLoadedCorrectly(haveAllPluginsLoadedCorrectly) { } + + bool callback(FS::IEntryEnumerator::IEntry& entry, FS::IEntryEnumerator::IAttributes& /*attributes*/) override + { + for (auto& pluginModule : m_rPluginModule) + { + CString name; + if (!pluginModule->getFileName(name)) { return true; } + + if (FS::Files::equals(entry.getName(), name.toASCIIString())) + { + OV_WARNING_K(std::string("Module [") + entry.getName() + "] has already been loaded"); + return true; + } + } + + IPluginModule* module = new CPluginModule(this->getKernelContext()); + CString loadError; + if (!module->load(entry.getName(), &loadError)) + { + delete module; + OV_WARNING_K(std::string("File [") + entry.getName() + "] is not a plugin module (error:" + loadError.toASCIIString() + ")"); + m_HaveAllPluginsLoadedCorrectly = false; + return true; + } + + if (!module->initialize()) + { + module->uninitialize(); + module->unload(); + delete module; + OV_WARNING_K(std::string("Module [") + entry.getName() + "] did not initialize correctly"); + m_HaveAllPluginsLoadedCorrectly = false; + return true; + } + + bool pluginObjectDescAdded = false; + size_t index = 0; + size_t n = 0; + Plugins::IPluginObjectDesc* desc = nullptr; + while (module->getPluginObjectDescription(index, desc)) + { + bool found = false; + + for (const auto& pluginObjectDesc : m_rPluginObjectDesc) + { + if (pluginObjectDesc.first->getClassIdentifier() == desc->getClassIdentifier()) + { + OV_WARNING_K("Duplicate plugin object descriptor class identifier [" + pluginObjectDesc.first->getName() + + "] and [" + desc->getName() + "]... second one is ignored"); + found = true; + break; + } + } + + if (!found) + { + if (!pluginObjectDescAdded) + { + m_rPluginModule.push_back(module); + pluginObjectDescAdded = true; + } + m_rPluginObjectDesc[desc] = module; + n++; + } + index++; + desc = nullptr; + } + + OV_WARNING_UNLESS_K(pluginObjectDescAdded, + std::string("No 'plugin object descriptor' found from [") + entry.getName() + "] even if it looked like a plugin module\n"); + + this->getLogManager() << LogLevel_Info << "Added " << n << " plugin object descriptor(s) from [" << CString(entry.getName()) << "]\n"; + + return true; + } + + _IsDerivedFromClass_Final_(TKernelObject, CIdentifier::undefined()) + +protected: + + IPluginManager& m_rPluginManager; + std::vector& m_rPluginModule; + std::map& m_rPluginObjectDesc; + bool& m_HaveAllPluginsLoadedCorrectly; +}; + +CPluginManager::~CPluginManager() +{ + std::unique_lock lock(m_mutex); + + for (auto& pluginObjectVector : m_pluginObjects) + { + for (auto& pluginObject : pluginObjectVector.second) + { + OV_WARNING_K( + "Trying to release plugin object with class id " + pluginObject->getClassIdentifier().str() + " and plugin object descriptor " + + pluginObjectVector.first->getName().toASCIIString() + " at plugin manager destruction time"); + pluginObject->release(); + } + } + m_pluginObjects.clear(); + + for (auto& pluginObjectDesc : m_pluginObjectDescs) { pluginObjectDesc.first->release(); } + m_pluginObjectDescs.clear(); + + for (auto k = m_pluginModules.begin(); k != m_pluginModules.end(); ++k) + { + this->TKernelObject::getLogManager() << LogLevel_Trace << "Releasing plugin module with class id " << (*k)->getClassIdentifier() << + "\n"; + (*k)->uninitialize(); + delete (*k); + } + m_pluginModules.clear(); +} + +bool CPluginManager::addPluginsFromFiles(const CString& rFileNameWildCard) +{ + std::unique_lock lock(m_mutex); + + this->getLogManager() << LogLevel_Info << "Adding plugins from [" << rFileNameWildCard << "]\n"; + + bool res = true; + bool haveAllPluginsLoadedCorrectly = true; + CPluginManagerEntryEnumeratorCallBack cb(this->getKernelContext(), m_pluginModules, m_pluginObjectDescs, haveAllPluginsLoadedCorrectly); + FS::IEntryEnumerator* entryEnumerator = createEntryEnumerator(cb); + + std::stringstream ss(rFileNameWildCard.toASCIIString()); + std::string path; + + while (getline(ss, path, ';')) + { + res &= entryEnumerator->enumerate(path.c_str()); + if (!res) { break; } + } + + entryEnumerator->release(); + + // Just return res. Error handling is performed within CPluginManagerEntryEnumeratorCallBack. + return res && haveAllPluginsLoadedCorrectly; +} + +bool CPluginManager::registerPluginDesc(const Plugins::IPluginObjectDesc& rPluginObjectDesc) +{ + std::unique_lock lock(m_mutex); + + m_pluginObjectDescs[const_cast(&rPluginObjectDesc)] = nullptr; + return true; +} + +CIdentifier CPluginManager::getNextPluginObjectDescIdentifier(const CIdentifier& previousID) const +{ + std::unique_lock lock(m_mutex); + + bool foundPrevious = (previousID == CIdentifier::undefined()); + for (const auto& elem : m_pluginObjectDescs) + { + if (!foundPrevious) { if (elem.first->getClassIdentifier() == previousID) { foundPrevious = true; } } + else { return elem.first->getClassIdentifier(); } + } + return CIdentifier::undefined(); +} + +CIdentifier CPluginManager::getNextPluginObjectDescIdentifier(const CIdentifier& previousID, const CIdentifier& baseClassID) const +{ + std::unique_lock lock(m_mutex); + + bool foundPrevious = (previousID == CIdentifier::undefined()); + for (const auto& elem : m_pluginObjectDescs) + { + if (!foundPrevious) { if (elem.first->getClassIdentifier() == previousID) { foundPrevious = true; } } + else { if (elem.first->isDerivedFromClass(baseClassID)) { return elem.first->getClassIdentifier(); } } + } + return CIdentifier::undefined(); +} + +bool CPluginManager::canCreatePluginObject(const CIdentifier& classID) +{ + std::unique_lock lock(m_mutex); + + // this->getLogManager() << Kernel::LogLevel_Debug << "Searching if can build plugin object\n"; + + return std::any_of(m_pluginObjectDescs.begin(), m_pluginObjectDescs.end(), [classID](const std::pair& v) + { + return v.first->getCreatedClass() == classID; + }); +} + +const Plugins::IPluginObjectDesc* CPluginManager::getPluginObjectDesc(const CIdentifier& classID) const +{ + std::unique_lock lock(m_mutex); + + // this->getLogManager() << Kernel::LogLevel_Debug << "Searching plugin object descriptor\n"; + + for (auto& pluginObject : m_pluginObjectDescs) { if (pluginObject.first->getClassIdentifier() == classID) { return pluginObject.first; } } + + this->getLogManager() << LogLevel_Debug << "Plugin object descriptor class identifier " << classID << " not found\n"; + return nullptr; +} + +const Plugins::IPluginObjectDesc* CPluginManager::getPluginObjectDescCreating(const CIdentifier& classID) const +{ + std::unique_lock lock(m_mutex); + + // this->getLogManager() << Kernel::LogLevel_Debug << "Searching plugin object descriptor\n"; + + const auto elem = std::find_if(m_pluginObjectDescs.begin(), m_pluginObjectDescs.end(), + [classID](const std::pair& v) { return v.first->getCreatedClass() == classID; }); + if (elem != m_pluginObjectDescs.end()) { return elem->first; } + this->getLogManager() << LogLevel_Debug << "Plugin object descriptor class identifier " << classID << " not found\n"; + return nullptr; +} + +CIdentifier CPluginManager::getPluginObjectHashValue(const CIdentifier& classID) const +{ + // std::unique_lock lock(m_mutex); + + const Plugins::IPluginObjectDesc* pluginObjectDesc = this->getPluginObjectDescCreating(classID); + const Plugins::IBoxAlgorithmDesc* boxAlgorithmDesc = dynamic_cast(pluginObjectDesc); + if (boxAlgorithmDesc) + { + SBoxProto prototype(getKernelContext().getTypeManager()); + boxAlgorithmDesc->getBoxPrototype(prototype); + return prototype.m_hash; + } + return CIdentifier::undefined(); +} + +CIdentifier CPluginManager::getPluginObjectHashValue(const Plugins::IBoxAlgorithmDesc& boxAlgorithmDesc) const +{ + std::unique_lock lock(m_mutex); + + SBoxProto prototype(getKernelContext().getTypeManager()); + boxAlgorithmDesc.getBoxPrototype(prototype); + return prototype.m_hash; +} + +bool CPluginManager::isPluginObjectFlaggedAsDeprecated(const CIdentifier& classID) const +{ + // std::unique_lock lock(m_mutex); + + const Plugins::IPluginObjectDesc* pluginObjectDesc = this->getPluginObjectDescCreating(classID); + const Plugins::IBoxAlgorithmDesc* boxAlgorithmDesc = dynamic_cast(pluginObjectDesc); + if (boxAlgorithmDesc) + { + SBoxProto prototype(getKernelContext().getTypeManager()); + boxAlgorithmDesc->getBoxPrototype(prototype); + return prototype.m_isDeprecated; + } + return false; +} + +Plugins::IPluginObject* CPluginManager::createPluginObject(const CIdentifier& classID) +{ + return createPluginObjectT(classID, nullptr); +} + +bool CPluginManager::releasePluginObject(Plugins::IPluginObject* pluginObject) +{ + this->getLogManager() << LogLevel_Debug << "Releasing plugin object\n"; + + OV_ERROR_UNLESS_KRF(pluginObject, "Plugin object value is null", Kernel::ErrorType::BadProcessing); + + { + std::unique_lock lock(m_mutex); + + for (auto& elem : m_pluginObjects) + { + auto pluginObjectIt = std::find(elem.second.begin(), elem.second.end(), pluginObject); + if (pluginObjectIt != elem.second.end()) + { + elem.second.erase(pluginObjectIt); + pluginObject->release(); + return true; + } + } + } + + OV_ERROR_KRF("Plugin object has not been created by this plugin manager (class id was " << pluginObject->getClassIdentifier().str() << ")", + ErrorType::ResourceNotFound); +} + +Plugins::IAlgorithm* CPluginManager::createAlgorithm(const CIdentifier& classID, const Plugins::IAlgorithmDesc** algorithmDesc) +{ + return createPluginObjectT(classID, algorithmDesc); +} + +Plugins::IAlgorithm* CPluginManager::createAlgorithm(const Plugins::IAlgorithmDesc& algorithmDesc) +{ + Plugins::IAlgorithmDesc* desc = const_cast(&algorithmDesc); + Plugins::IPluginObject* pluginObject = desc->create(); + + OV_ERROR_UNLESS_KRN(pluginObject, + "Could not create plugin object from " << algorithmDesc.getName() << " plugin object descriptor", + ErrorType::BadResourceCreation); + + Plugins::IAlgorithmDesc* pluginObjectDescT = dynamic_cast(desc); + Plugins::IAlgorithm* pluginObjectT = dynamic_cast(pluginObject); + + OV_ERROR_UNLESS_KRN(pluginObjectDescT && pluginObjectT, + "Could not downcast plugin object and/or plugin object descriptor for " << algorithmDesc.getName() << " plugin object descriptor", + ErrorType::BadResourceCreation); + + { + std::unique_lock lock(m_mutex); + m_pluginObjects[pluginObjectDescT].push_back(pluginObjectT); + } + + return pluginObjectT; +} + +Plugins::IBoxAlgorithm* CPluginManager::createBoxAlgorithm(const CIdentifier& classID, const Plugins::IBoxAlgorithmDesc** boxAlgorithmDesc) +{ + return createPluginObjectT(classID, boxAlgorithmDesc); +} + +template +IPluginObjectT* CPluginManager::createPluginObjectT(const CIdentifier& classID, const IPluginObjectDescT** ppPluginObjectDescT) +{ + std::unique_lock lock(m_mutex); + + if (ppPluginObjectDescT) { *ppPluginObjectDescT = nullptr; } + + CIdentifier substitutionTokenID; + char substitutionTokenName[1024]; + const uint64_t srcClassID = classID.id(); + uint64_t dstClassID = srcClassID; + sprintf(substitutionTokenName, "Kernel_PluginSubstitution_%0" PRIx64, srcClassID); + if ((substitutionTokenID = this->getConfigurationManager().lookUpConfigurationTokenIdentifier(substitutionTokenName)) != + CIdentifier::undefined()) + { + CString value = this->getConfigurationManager().getConfigurationTokenValue(substitutionTokenID); + value = this->getConfigurationManager().expand(value); + + try { dstClassID = std::stoull(value.toASCIIString(), nullptr, 16); } + catch (const std::invalid_argument& exception) + { + OV_ERROR_KRN("Received exception while converting class identifier from string to number: " << exception.what(), Kernel::ErrorType::BadArgument); + } + catch (const std::out_of_range& exception) + { + OV_ERROR_KRN("Received exception while converting class identifier from string to number: " << exception.what(), Kernel::ErrorType::OutOfBound); + } + } + if (dstClassID != srcClassID) + { + this->getLogManager() << LogLevel_Trace << "Substituting plugin class identifier " << CIdentifier(srcClassID) << + " with new class identifier " << CIdentifier(dstClassID) << "\n"; + } + else + { + this->getLogManager() << LogLevel_Debug << "Not substitute plugin found for class identifier " << CIdentifier(srcClassID) << + " (configuration token name was " << CString(substitutionTokenName) << ")\n"; + } + + Plugins::IPluginObjectDesc* pod = nullptr; + for (auto i = m_pluginObjectDescs.begin(); i != m_pluginObjectDescs.end(); ++i) + { + if (i->first->getCreatedClass() == CIdentifier(dstClassID)) { pod = i->first; } + } + + OV_ERROR_UNLESS_KRN(pod, + "Did not find the plugin object descriptor with requested class identifier " << CIdentifier(srcClassID).str() << + " in registered plugin object descriptors", + ErrorType::BadResourceCreation); + + Plugins::IPluginObject* pluginObject = pod->create(); + + OV_ERROR_UNLESS_KRN(pluginObject, + "Could not create plugin object from " << pod->getName() << " plugin object descriptor", + ErrorType::BadResourceCreation); + + IPluginObjectDescT* pluginObjectDescT = dynamic_cast(pod); + IPluginObjectT* pluginObjectT = dynamic_cast(pluginObject); + + OV_ERROR_UNLESS_KRN(pluginObjectDescT && pluginObjectT, + "Could not downcast plugin object and/or plugin object descriptor for " << pod->getName() << " plugin object descriptor", + ErrorType::BadResourceCreation); + + if (ppPluginObjectDescT) { *ppPluginObjectDescT = pluginObjectDescT; } + + m_pluginObjects[pluginObjectDescT].push_back(pluginObjectT); + + return pluginObjectT; +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/plugins/ovkCPluginManager.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/plugins/ovkCPluginManager.h new file mode 100755 index 0000000..c621100 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/plugins/ovkCPluginManager.h @@ -0,0 +1,47 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +#include +#include +#include + +namespace OpenViBE { +namespace Kernel { +class CPluginManager final : public TKernelObject +{ +public: + + explicit CPluginManager(const IKernelContext& ctx) : TKernelObject(ctx) {} + ~CPluginManager() override; + bool addPluginsFromFiles(const CString& rFileNameWildCard) override; + bool registerPluginDesc(const Plugins::IPluginObjectDesc& rPluginObjectDesc) override; + CIdentifier getNextPluginObjectDescIdentifier(const CIdentifier& previousID) const override; + CIdentifier getNextPluginObjectDescIdentifier(const CIdentifier& previousID, const CIdentifier& baseClassID) const override; + bool canCreatePluginObject(const CIdentifier& classID) override; + const Plugins::IPluginObjectDesc* getPluginObjectDesc(const CIdentifier& classID) const override; + const Plugins::IPluginObjectDesc* getPluginObjectDescCreating(const CIdentifier& classID) const override; + CIdentifier getPluginObjectHashValue(const CIdentifier& classID) const override; + CIdentifier getPluginObjectHashValue(const Plugins::IBoxAlgorithmDesc& boxAlgorithmDesc) const override; + bool isPluginObjectFlaggedAsDeprecated(const CIdentifier& classID) const override; + Plugins::IPluginObject* createPluginObject(const CIdentifier& classID) override; + bool releasePluginObject(Plugins::IPluginObject* pluginObject) override; + Plugins::IAlgorithm* createAlgorithm(const CIdentifier& classID, const Plugins::IAlgorithmDesc** algorithmDesc) override; + Plugins::IAlgorithm* createAlgorithm(const Plugins::IAlgorithmDesc& algorithmDesc) override; + Plugins::IBoxAlgorithm* createBoxAlgorithm(const CIdentifier& classID, const Plugins::IBoxAlgorithmDesc** boxAlgorithmDesc) override; + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Plugins_PluginManager) + +protected: + + template + TPluginObject* createPluginObjectT(const CIdentifier& classID, const TPluginObjectDesc** ppPluginObjectDescT); + + std::vector m_pluginModules; + std::map m_pluginObjectDescs; + std::map> m_pluginObjects; + + mutable std::mutex m_mutex; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/plugins/ovkCPluginModule.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/plugins/ovkCPluginModule.cpp new file mode 100755 index 0000000..949991d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/plugins/ovkCPluginModule.cpp @@ -0,0 +1,336 @@ +#include "ovkCPluginModule.h" + +#include +#include + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + #include +#elif defined TARGET_OS_Windows +#include +#else +#endif + +namespace OpenViBE { +namespace Kernel { +class CPluginModuleBase : public TKernelObject +{ +public: + explicit CPluginModuleBase(const IKernelContext& ctx) + : TKernelObject(ctx), m_onInitializeCB(nullptr), m_onGetPluginObjectDescCB(nullptr), m_onUninitializeCB(nullptr) {} + + ~CPluginModuleBase() override { } + bool initialize() override; + bool getPluginObjectDescription(size_t index, Plugins::IPluginObjectDesc*& pluginObjectDesc) override; + bool uninitialize() override; + bool getFileName(CString& fileName) const override; + + _IsDerivedFromClass_Final_(TKernelObject, CIdentifier::undefined()) + +protected: + + virtual bool isOpen() const = 0; + + std::vector m_pluginObjectDescs; + CString m_filename; + bool m_gotDesc = false; + + bool (*m_onInitializeCB)(const IPluginModuleContext&); + bool (*m_onGetPluginObjectDescCB)(const IPluginModuleContext&, size_t, Plugins::IPluginObjectDesc*&); + bool (*m_onUninitializeCB)(const IPluginModuleContext&); +}; + +namespace { +class CPluginModuleContext final : public TKernelObject +{ +public: + + explicit CPluginModuleContext(const IKernelContext& ctx) + : TKernelObject(ctx), m_logManager(ctx.getLogManager()), m_typeManager(ctx.getTypeManager()), + m_scenarioManager(ctx.getScenarioManager()) { } + + ILogManager& getLogManager() const override { return m_logManager; } + ITypeManager& getTypeManager() const override { return m_typeManager; } + IScenarioManager& getScenarioManager() const override { return m_scenarioManager; } + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Plugins_PluginModuleContext) + +protected: + + ILogManager& m_logManager; + ITypeManager& m_typeManager; + IScenarioManager& m_scenarioManager; +}; +} // namespace + +bool CPluginModuleBase::initialize() +{ + if (!isOpen()) { return false; } + if (!m_onInitializeCB) { return true; } + return m_onInitializeCB(CPluginModuleContext(getKernelContext())); +} + +bool CPluginModuleBase::getPluginObjectDescription(const size_t index, Plugins::IPluginObjectDesc*& pluginObjectDesc) +{ + if (!m_gotDesc) + { + if (!isOpen() || !m_onGetPluginObjectDescCB) { return false; } + + size_t idx = 0; + Plugins::IPluginObjectDesc* pod = nullptr; + while (m_onGetPluginObjectDescCB(CPluginModuleContext(getKernelContext()), idx, pod)) + { + if (pod) { m_pluginObjectDescs.push_back(pod); } + idx++; + } + + m_gotDesc = true; + } + + if (index >= m_pluginObjectDescs.size()) + { + pluginObjectDesc = nullptr; + return false; + } + + pluginObjectDesc = m_pluginObjectDescs[index]; + return true; +} + +bool CPluginModuleBase::uninitialize() +{ + if (!isOpen()) { return false; } + if (!m_onUninitializeCB) { return true; } + return m_onUninitializeCB(CPluginModuleContext(getKernelContext())); +} + +bool CPluginModuleBase::getFileName(CString& fileName) const +{ + if (!isOpen()) { return false; } + fileName = m_filename; + return true; +} + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS +class CPluginModuleLinux : public CPluginModuleBase +{ +public: + + CPluginModuleLinux(const IKernelContext& ctx); + + virtual bool load(const CString& filename, CString* pError); + virtual bool unload(CString* pError); + virtual bool isOpen() const; + +protected: + + void* m_fileHandle; +}; + +#elif defined TARGET_OS_Windows +class CPluginModuleWindows final : public CPluginModuleBase +{ +public: + + explicit CPluginModuleWindows(const IKernelContext& ctx); + bool load(const CString& filename, CString* pError) override; + bool unload(CString* pError) override; + +protected: + bool isOpen() const override { return m_fileHandle != nullptr; } + + HMODULE m_fileHandle; + +private: + + static CString getLastErrorMessageString(); +}; + +#else +class CPluginModuleDummy : public CPluginModuleBase +{ +public: + + explicit CPluginModuleDummy(const IKernelContext& ctx); + + virtual bool load(const CString& filename, CString* pError); + virtual bool unload(CString* pError); + +protected: + + virtual bool isOpen() const; +}; +#endif + +// +//___________________________________________________________________// +// // + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + +CPluginModuleLinux::CPluginModuleLinux(const IKernelContext& ctx) :CPluginModuleBase(ctx),m_fileHandle(NULL) { } + +bool CPluginModuleLinux::load(const CString& filename, CString* pError) +{ + if(m_fileHandle) + { + if(pError) *pError="plugin module already loaded"; + return false; + } + + // m_fileHandle=dlopen(filename, RTLD_NOW|RTLD_LOCAL); +#if defined OV_LOCAL_SYMBOLS + m_fileHandle = dlopen(filename, RTLD_LAZY|RTLD_LOCAL); +#else + m_fileHandle = dlopen(filename, RTLD_LAZY|RTLD_GLOBAL); +#endif + if(!m_fileHandle) + { + if(pError) *pError=dlerror(); + return false; + } + + m_onInitializeCB=(bool (*)(const IPluginModuleContext&))dlsym(m_fileHandle, "onInitialize"); + m_onUninitializeCB=(bool (*)(const IPluginModuleContext&))dlsym(m_fileHandle, "onUninitialize"); + m_onGetPluginObjectDescCB=(bool (*)(const IPluginModuleContext&, size_t, Plugins::IPluginObjectDesc*&))dlsym(m_fileHandle, "onGetPluginObjectDescription"); + + if(!m_onGetPluginObjectDescCB) + { + if(pError) *pError=dlerror(); + + dlclose(m_fileHandle); + m_fileHandle=NULL; + m_onInitializeCB=NULL; + m_onUninitializeCB=NULL; + m_onGetPluginObjectDescCB=NULL; + return false; + } + + m_filename=filename; + return true; +} + +bool CPluginModuleLinux::unload(CString* error) +{ + if(!m_fileHandle) + { + if (error) { *error = "no plugin module currently loaded"; } + return false; + } + + dlclose(m_fileHandle); + m_fileHandle = NULL; + m_onInitializeCB = NULL; + m_onUninitializeCB = NULL; + m_onGetPluginObjectDescCB = NULL; + return true; +} + +bool CPluginModuleLinux::isOpen() const { return m_fileHandle != nullptr; } + +#elif defined TARGET_OS_Windows + +CPluginModuleWindows::CPluginModuleWindows(const IKernelContext& ctx) : CPluginModuleBase(ctx), m_fileHandle(nullptr) {} + +bool CPluginModuleWindows::load(const CString& filename, CString* pError) +{ + if (m_fileHandle) + { + if (pError) { *pError = "plugin module already loaded"; } + return false; + } + + m_fileHandle = LoadLibrary(filename); + if (!m_fileHandle) + { + if (pError) { *pError = this->getLastErrorMessageString(); } + return false; + } + + m_onInitializeCB = reinterpret_cast(GetProcAddress(m_fileHandle, "onInitialize")); + m_onUninitializeCB = reinterpret_cast(GetProcAddress(m_fileHandle, "onUninitialize")); + m_onGetPluginObjectDescCB = reinterpret_cast(GetProcAddress( + m_fileHandle, "onGetPluginObjectDescription")); + if (!m_onGetPluginObjectDescCB) + { + if (pError) { *pError = this->getLastErrorMessageString(); } + + FreeLibrary(m_fileHandle); + m_fileHandle = nullptr; + m_onInitializeCB = nullptr; + m_onGetPluginObjectDescCB = nullptr; + m_onUninitializeCB = nullptr; + return false; + } + + m_filename = filename; + return true; +} + +bool CPluginModuleWindows::unload(CString* pError) +{ + if (!m_fileHandle) + { + if (pError) { *pError = "no plugin module currently loaded"; } + return false; + } + + FreeLibrary(m_fileHandle); + m_fileHandle = nullptr; + m_onInitializeCB = nullptr; + m_onGetPluginObjectDescCB = nullptr; + m_onUninitializeCB = nullptr; + return true; +} + +CString CPluginModuleWindows::getLastErrorMessageString() +{ + CString res; + + char* buffer = nullptr; + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, GetLastError(), 0, + reinterpret_cast(&buffer), 0, nullptr); + if (buffer) + { + const size_t length = strlen(buffer); + for (size_t i = 0; i < length; ++i) { if (buffer[i] == '\n' || buffer[i] == '\r') { buffer[i] = ' '; } } + res = buffer; + } + LocalFree(LPVOID(buffer)); + + return res; +} + +#else + +#endif + +//___________________________________________________________________// +// // + +CPluginModule::CPluginModule(const IKernelContext& ctx) + : TKernelObject(ctx) +{ +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + m_impl=new CPluginModuleLinux(getKernelContext()); +#elif defined TARGET_OS_Windows + m_impl = new CPluginModuleWindows(getKernelContext()); +#else +#endif +} + +CPluginModule::~CPluginModule() { delete m_impl; } + +bool CPluginModule::load(const CString& filename, CString* error) { return !m_impl ? false : m_impl->load(filename, error); } +bool CPluginModule::unload(CString* error) { return !m_impl ? false : m_impl->unload(error); } +bool CPluginModule::initialize() { return !m_impl ? false : m_impl->initialize(); } + +bool CPluginModule::getPluginObjectDescription(const size_t index, Plugins::IPluginObjectDesc*& desc) +{ + return !m_impl ? false : m_impl->getPluginObjectDescription(index, desc); +} + +bool CPluginModule::uninitialize() { return !m_impl ? false : m_impl->uninitialize(); } +bool CPluginModule::getFileName(CString& rFileName) const { return !m_impl ? false : m_impl->getFileName(rFileName); } + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/plugins/ovkCPluginModule.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/plugins/ovkCPluginModule.h new file mode 100644 index 0000000..b52423f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/plugins/ovkCPluginModule.h @@ -0,0 +1,29 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +#include + +namespace OpenViBE { +namespace Kernel { +class CPluginModule final : public TKernelObject +{ +public: + + explicit CPluginModule(const IKernelContext& ctx); + ~CPluginModule() override; + bool load(const CString& filename, CString* error) override; + bool unload(CString* error) override; + bool getFileName(CString& rFileName) const override; + bool initialize() override; + bool getPluginObjectDescription(size_t index, Plugins::IPluginObjectDesc*& desc) override; + bool uninitialize() override; + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Plugins_PluginModule) + +protected: + + IPluginModule* m_impl = nullptr; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCBoxListenerContext.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCBoxListenerContext.h new file mode 100755 index 0000000..b537c8c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCBoxListenerContext.h @@ -0,0 +1,40 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +class CBoxListenerContext final : public TKernelObject +{ +public: + + CBoxListenerContext(const IKernelContext& ctx, IBox& box, const size_t index) + : TKernelObject(ctx), m_box(box), m_idx(index) { } + + IAlgorithmManager& getAlgorithmManager() const override { return this->getKernelContext().getAlgorithmManager(); } + IPlayerManager& getPlayerManager() const override { return this->getKernelContext().getPlayerManager(); } + IPluginManager& getPluginManager() const override { return this->getKernelContext().getPluginManager(); } + IMetaboxManager& getMetaboxManager() const override { return this->getKernelContext().getMetaboxManager(); } + IScenarioManager& getScenarioManager() const override { return this->getKernelContext().getScenarioManager(); } + ITypeManager& getTypeManager() const override { return this->getKernelContext().getTypeManager(); } + ILogManager& getLogManager() const override { return this->getKernelContext().getLogManager(); } + IErrorManager& getErrorManager() const override { return this->getKernelContext().getErrorManager(); } + IConfigurationManager& getConfigurationManager() const override { return this->getKernelContext().getConfigurationManager(); } + IBox& getBox() const override { return m_box; } + + IScenario& getScenario() const override + { + OV_FATAL("Getting scenario from box listener context is not yet implemented", Kernel::ErrorType::NotImplemented, this->getKernelContext().getLogManager()); + } + + size_t getIndex() const override { return m_idx; } + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Scenario_BoxListenerContext) + +private: + + IBox& m_box; + size_t m_idx = 0; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCBoxProto.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCBoxProto.cpp new file mode 100755 index 0000000..09a4e9a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCBoxProto.cpp @@ -0,0 +1,84 @@ +#include "ovkCBoxProto.h" + +namespace OpenViBE { +namespace Kernel { + +bool CBoxProto::addInput(const CString& name, const CIdentifier& typeID, const CIdentifier& id, const bool notify) +{ + if (!m_box.addInput(name, typeID, id, notify)) { return false; } + + const std::string tmp = std::to_string(m_box.getInputCount()); + const CString buffer(tmp.c_str()); + if (m_box.hasAttribute(OV_AttributeId_Box_InitialInputCount)) { m_box.setAttributeValue(OV_AttributeId_Box_InitialInputCount, buffer); } + else { m_box.addAttribute(OV_AttributeId_Box_InitialInputCount, buffer); } + + return true; +} + +bool CBoxProto::addOutput(const CString& name, const CIdentifier& typeID, const CIdentifier& id, const bool notify) +{ + if (!m_box.addOutput(name, typeID, id, notify)) { return false; } + + const std::string tmp = std::to_string(m_box.getOutputCount()); + const CString buffer(tmp.c_str()); + if (m_box.hasAttribute(OV_AttributeId_Box_InitialOutputCount)) { m_box.setAttributeValue(OV_AttributeId_Box_InitialOutputCount, buffer); } + else { m_box.addAttribute(OV_AttributeId_Box_InitialOutputCount, buffer); } + + return true; +} + +bool CBoxProto::addSetting(const CString& name, const CIdentifier& typeID, const CString& value, const bool modifiable, + const CIdentifier& id, const bool notify) +{ + if (!m_box.addSetting(name, typeID, value, size_t(-1), modifiable, id, notify)) { return false; } + + const std::string tmp = std::to_string(m_box.getSettingCount()); + const CString buffer(tmp.c_str()); + if (m_box.hasAttribute(OV_AttributeId_Box_InitialSettingCount)) { m_box.setAttributeValue(OV_AttributeId_Box_InitialSettingCount, buffer); } + else { m_box.addAttribute(OV_AttributeId_Box_InitialSettingCount, buffer); } + + return true; +} +/* +size_t CBoxProto::addSetting(const CString& name, const CIdentifier& typeID, const CString& sDefaultValue, const bool bModifiable) +{ + addSetting(name, typeID, sDefaultValue); + size_t lastSetting = m_box.getSettingCount(); + m_box.setSettingMod(lastSetting, bModifiable); + return true; +} +/*/ + +bool CBoxProto::addFlag(const EBoxFlag boxFlag) +{ + switch (boxFlag) + { + case BoxFlag_CanAddInput: m_box.addAttribute(OV_AttributeId_Box_FlagCanAddInput, ""); + break; + case BoxFlag_CanModifyInput: m_box.addAttribute(OV_AttributeId_Box_FlagCanModifyInput, ""); + break; + case BoxFlag_CanAddOutput: m_box.addAttribute(OV_AttributeId_Box_FlagCanAddOutput, ""); + break; + case BoxFlag_CanModifyOutput: m_box.addAttribute(OV_AttributeId_Box_FlagCanModifyOutput, ""); + break; + case BoxFlag_CanAddSetting: m_box.addAttribute(OV_AttributeId_Box_FlagCanAddSetting, ""); + break; + case BoxFlag_CanModifySetting: m_box.addAttribute(OV_AttributeId_Box_FlagCanModifySetting, ""); + break; + case BoxFlag_ManualUpdate: m_box.addAttribute(OV_AttributeId_Box_FlagNeedsManualUpdate, ""); + break; + case BoxFlag_IsDeprecated: break; + } + return true; +} + +bool CBoxProto::addFlag(const CIdentifier& flagID) +{ + const uint64_t value = getKernelContext().getTypeManager().getEnumerationEntryValueFromName(OV_TypeId_BoxAlgorithmFlag, flagID.toString()); + if (value == CIdentifier::undefined().id()) { return false; } + m_box.addAttribute(flagID, ""); + return true; +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCBoxProto.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCBoxProto.h new file mode 100755 index 0000000..505f588 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCBoxProto.h @@ -0,0 +1,35 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +class CBoxProto : public TKernelObject +{ +public: + + CBoxProto(const IKernelContext& ctx, IBox& box) : TKernelObject(ctx), m_box(box) {} + ~CBoxProto() override = default; + bool addInput(const CString& name, const CIdentifier& typeID, const CIdentifier& id = CIdentifier::undefined(), const bool notify = true) override; + bool addOutput(const CString& name, const CIdentifier& typeID, const CIdentifier& id = CIdentifier::undefined(), const bool notify = true) override; + + //virtual bool addSetting(const CString& name, const CIdentifier& typeID, const CString& value); + bool addSetting(const CString& name, const CIdentifier& typeID, const CString& value, + const bool modifiable = false, const CIdentifier& id = CIdentifier::undefined(), const bool notify = true) override; + bool addFlag(const EBoxFlag boxFlag) override; + bool addFlag(const CIdentifier& flagID) override; + bool addInputSupport(const CIdentifier& typeID) override { return m_box.addInputSupport(typeID); } + bool addOutputSupport(const CIdentifier& typeID) override { return m_box.addOutputSupport(typeID); } + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Scenario_BoxProto) + +protected: + + IBox& m_box; + +private: + + CBoxProto() = delete; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCBoxUpdater.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCBoxUpdater.cpp new file mode 100644 index 0000000..c2f899f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCBoxUpdater.cpp @@ -0,0 +1,296 @@ +#include "../ovkTKernelObject.h" + +#include "ovkCScenario.h" +#include "ovkCBoxUpdater.h" +#include "ovkTBox.hpp" + +namespace OpenViBE { +namespace Kernel { + +const std::array CBoxUpdater::UPDATABLE_ATTRIBUTES = { + OV_AttributeId_Box_InitialPrototypeHashValue, + OV_AttributeId_Box_InitialInputCount, + OV_AttributeId_Box_InitialOutputCount, + OV_AttributeId_Box_InitialSettingCount, + OV_AttributeId_Box_FlagCanAddInput, + OV_AttributeId_Box_FlagCanModifyInput, + OV_AttributeId_Box_FlagCanAddOutput, + OV_AttributeId_Box_FlagCanModifyOutput, + OV_AttributeId_Box_FlagCanAddSetting, + OV_AttributeId_Box_FlagCanModifySetting +}; + +CBoxUpdater::CBoxUpdater(CScenario& scenario, IBox* box) + : TKernelObject(scenario.getKernelContext()), m_scenario(&scenario), m_sourceBox(box) +{ + m_originalToUpdatedCorrespondence[Input] = std::map(); + m_originalToUpdatedCorrespondence[Output] = std::map(); + m_originalToUpdatedCorrespondence[Setting] = std::map(); +} + +CBoxUpdater::~CBoxUpdater() +{ + if (!m_kernelBox || !m_updatedBox) { return; } + + if (m_kernelBox->getAlgorithmClassIdentifier() != OVP_ClassId_BoxAlgorithm_Metabox) + { + // do not manage destruction of metaboxes (done by metabox manager) + delete m_kernelBox; + } + + delete m_updatedBox; +} + +bool CBoxUpdater::initialize() +{ + // initialize kernel box reference + if (m_sourceBox->getAlgorithmClassIdentifier() == OVP_ClassId_BoxAlgorithm_Metabox) + { + const CString metaboxID = m_sourceBox->getAttributeValue(OVP_AttributeId_Metabox_ID); + OV_ERROR_UNLESS_KRF(metaboxID != CString(""), "Failed to find metabox with id " << metaboxID, Kernel::ErrorType::BadCall); + + CIdentifier metaboxId; + metaboxId.fromString(metaboxID); + const CString path(this->getKernelContext().getMetaboxManager().getMetaboxFilePath(metaboxId)); + + OV_ERROR_UNLESS_KRF(path != CString(""), "Metabox scenario is not available for " << m_sourceBox->getName(), Kernel::ErrorType::BadCall); + + + // We are going to copy the template scenario, flatten it and then copy all + // Note that copy constructor for IScenario does not exist + CIdentifier templateID; + this->getKernelContext().getScenarioManager().importScenarioFromFile(templateID, OV_ScenarioImportContext_SchedulerMetaboxImport, path); + + CScenario* instance = dynamic_cast(&(this->getKernelContext().getScenarioManager().getScenario(templateID))); + instance->setAlgorithmClassIdentifier(OVP_ClassId_BoxAlgorithm_Metabox); + m_kernelBox = instance; + } + else + { + CBox* kernelBox = new CBox(m_scenario->getKernelContext()); + kernelBox->initializeFromAlgorithmClassIdentifierNoInit(m_sourceBox->getAlgorithmClassIdentifier()); + m_kernelBox = kernelBox; + } + + // initialize updated box + m_updatedBox = new CBox(m_scenario->getKernelContext()); + + m_updatedBox->setIdentifier(m_sourceBox->getIdentifier()); + m_updatedBox->setName(m_sourceBox->getName()); + + if (m_sourceBox->getAlgorithmClassIdentifier() == OVP_ClassId_BoxAlgorithm_Metabox) + { + m_updatedBox->setAttributeValue(OV_AttributeId_Box_InitialPrototypeHashValue, m_kernelBox->getAttributeValue(OV_AttributeId_Scenario_MetaboxHash)); + } + + // initialize updated box attribute to kernel ones + CIdentifier attributeIdentifier; + while ((attributeIdentifier = m_kernelBox->getNextAttributeIdentifier(attributeIdentifier)) != CIdentifier::undefined()) + { + CString attributeValue = m_kernelBox->getAttributeValue(attributeIdentifier); + m_updatedBox->addAttribute(attributeIdentifier, attributeValue); + } + + // initialize supported types to kernel ones + if (m_sourceBox->getAlgorithmClassIdentifier() != OVP_ClassId_BoxAlgorithm_Metabox) + { + m_updatedBox->setSupportTypeFromAlgorithmIdentifier(m_kernelBox->getAlgorithmClassIdentifier()); + } + // should not be done before adding IO elements so the box listener is never called + // updatedBox->setAlgorithmClassIdentifier(kernelBox->getAlgorithmClassIdentifier()); + m_initialized = true; + + m_isUpdateRequired = false; + + const bool isHashDifferent = m_scenario->isBoxOutdated(m_sourceBox->getIdentifier()); + + if (this->flaggedForManualUpdate()) + { + m_isUpdateRequired = isHashDifferent; + return true; + } + + if (isHashDifferent) + { + m_isUpdateRequired |= this->updateInterfacors(Input); + m_isUpdateRequired |= this->updateInterfacors(Output); + m_isUpdateRequired |= this->updateInterfacors(Setting); + m_isUpdateRequired |= this->checkForSupportedTypesToBeUpdated(); + m_isUpdateRequired |= this->checkForSupportedIOSAttributesToBeUpdated(); + } + + if (m_sourceBox->getAlgorithmClassIdentifier() == OVP_ClassId_BoxAlgorithm_Metabox) { m_isUpdateRequired |= isHashDifferent; } + + return true; +} + + +bool CBoxUpdater::checkForSupportedTypesToBeUpdated() const +{ + //check for supported inputs diff + for (auto& type : m_sourceBox->getInputSupportTypes()) { if (!m_kernelBox->hasInputSupport(type)) { return true; } } + for (auto& type : m_kernelBox->getInputSupportTypes()) { if (!m_sourceBox->hasInputSupport(type)) { return true; } } + + //check for supported outputs diff + for (auto& type : m_sourceBox->getOutputSupportTypes()) { if (!m_kernelBox->hasOutputSupport(type)) { return true; } } + for (auto& type : m_kernelBox->getOutputSupportTypes()) { if (!m_sourceBox->hasOutputSupport(type)) { return true; } } + return false; +} + +bool CBoxUpdater::checkForSupportedIOSAttributesToBeUpdated() const +{ + // check for attributes + for (auto& attr : UPDATABLE_ATTRIBUTES) + { + if ((m_sourceBox->hasAttribute(attr) && !m_kernelBox->hasAttribute(attr)) + || (!m_sourceBox->hasAttribute(attr) && m_kernelBox->hasAttribute(attr))) { return true; } + } + return false; +} + +bool CBoxUpdater::updateInterfacors(const EBoxInterfacorType interfacorType) +{ + std::vector interfacors; + + bool updated = false; + + // First add and optionally modify all requests from the Kernel prototype + size_t index = 0; + while (index < m_kernelBox->getInterfacorCount(interfacorType)) + { + CIdentifier kTypeIdentifier; + CIdentifier kIdentifier; + CString kName; + m_kernelBox->getInterfacorType(interfacorType, index, kTypeIdentifier); + m_kernelBox->getInterfacorIdentifier(interfacorType, index, kIdentifier); + m_kernelBox->getInterfacorName(interfacorType, index, kName); + + + InterfacorRequest request; + request.index = index; + request.identifier = kIdentifier; + request.name = kName; + request.typeID = kTypeIdentifier; + request.toBeRemoved = false; + + if (interfacorType == Setting) + { + CString defaultValue; + bool modifiable; + m_kernelBox->getSettingDefaultValue(index, defaultValue); + m_kernelBox->getSettingMod(index, modifiable); + request.defaultValue = defaultValue; + request.value = defaultValue; + request.modifiability = modifiable; + } + + auto indexInBox = getInterfacorIndex(interfacorType, *m_sourceBox, kTypeIdentifier, kIdentifier, kName); + if (indexInBox != size_t(-1)) + { + CIdentifier identifier; + CString name; + + m_sourceBox->getInterfacorIdentifier(interfacorType, indexInBox, identifier); + m_sourceBox->getInterfacorName(interfacorType, indexInBox, name); + updated |= (identifier == kIdentifier && name != kName) || (identifier != kIdentifier && name == kName); + + m_originalToUpdatedCorrespondence[interfacorType][indexInBox] = index; + + // For settings, we need to give them the value from the original box + if (interfacorType == Setting) + { + CString valueInBox; + m_sourceBox->getSettingValue(indexInBox, valueInBox); + request.value = valueInBox; + } + } + else + { + // try to modify the type in the kernel proto to adjust to the inputs + updated = true; + } + + interfacors.push_back(request); + + ++index; + } + + // Now go throught the inputs we have not yet associated and decide what to do with them + // As we currently only support boxes with fixed amount of inputs/outputs this always means that the + // I/O is redundant + index = 0; + while (index < m_sourceBox->getInterfacorCount(interfacorType)) + { + // Skip if the input was handled in the previous step + if (m_originalToUpdatedCorrespondence.at(interfacorType).find(index) != m_originalToUpdatedCorrespondence.at(interfacorType).end()) + { + ++index; + continue; + } + + CIdentifier sTypeIdentifier; + CIdentifier sIdentifier; + CString name; + m_sourceBox->getInterfacorType(interfacorType, index, sTypeIdentifier); + m_sourceBox->getInterfacorIdentifier(interfacorType, index, sIdentifier); + m_sourceBox->getInterfacorName(interfacorType, index, name); + + InterfacorRequest request; + request.index = index; + request.identifier = sIdentifier; + request.name = name; + request.typeID = sTypeIdentifier; + request.toBeRemoved = true; + + if (interfacorType == Setting) + { + CString defaultValue; + CString value; + bool modifiable; + m_sourceBox->getSettingDefaultValue(index, defaultValue); + m_sourceBox->getSettingValue(index, value); + m_sourceBox->getSettingMod(index, modifiable); + request.defaultValue = defaultValue; + request.value = value; + request.modifiability = modifiable; + } + + updated = true; + + interfacors.push_back(request); + + m_originalToUpdatedCorrespondence[interfacorType][index] = interfacors.size() - 1; + + ++index; + } + + for (auto& i : interfacors) + { + m_updatedBox->addInterfacor(interfacorType, i.name, i.typeID, i.identifier); + if (interfacorType == Setting) + { + const auto idx = m_updatedBox->getInterfacorCountIncludingDeprecated(Setting) - 1; + m_updatedBox->setSettingDefaultValue(idx, i.defaultValue); + m_updatedBox->setSettingValue(idx, i.value); + m_updatedBox->setSettingMod(idx, i.modifiability); + } + if (i.toBeRemoved) + { + m_updatedBox->setInterfacorDeprecatedStatus(interfacorType, m_updatedBox->getInterfacorCountIncludingDeprecated(interfacorType) - 1, true); + } + } + + return updated; +} + +size_t CBoxUpdater::getInterfacorIndex(const EBoxInterfacorType type, const IBox& box, const CIdentifier& typeID, const CIdentifier& id, const CString& name) +{ + size_t index = size_t(-1); + if (id != CIdentifier::undefined() && box.hasInterfacorWithIdentifier(type, id)) { box.getInterfacorIndex(type, id, index); } + else if (box.hasInterfacorWithNameAndType(type, name, typeID)) { box.getInterfacorIndex(type, name, index); } + + return index; +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCBoxUpdater.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCBoxUpdater.h new file mode 100644 index 0000000..14ea092 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCBoxUpdater.h @@ -0,0 +1,93 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +#include "ovkCScenario.h" + +#include +#include + +namespace OpenViBE { +namespace Kernel { +typedef struct _InterfacorRequest +{ + size_t index = size_t(-1); + CIdentifier identifier = CIdentifier::undefined(); + CIdentifier typeID = CIdentifier::undefined(); + CString name; + bool toBeRemoved; + + // only for settings + CString defaultValue; + bool modifiability = false; + CString value; +} InterfacorRequest; + +class CBoxUpdater final : public TKernelObject +{ +public: + + CBoxUpdater(CScenario& scenario, IBox* box); + ~CBoxUpdater() override; + + bool initialize(); + + const std::map& getOriginalToUpdatedInterfacorCorrespondence(const EBoxInterfacorType type) const + { + return m_originalToUpdatedCorrespondence.at(type); + } + + IBox& getUpdatedBox() const { return *m_updatedBox; } + + bool flaggedForManualUpdate() const + { + OV_FATAL_UNLESS_K(m_initialized, "Box Updater is not initialized", Kernel::ErrorType::BadCall); + + return m_kernelBox->hasAttribute(OV_AttributeId_Box_FlagNeedsManualUpdate) + || m_kernelBox->hasAttribute(OV_AttributeId_Box_FlagCanAddInput) + || m_kernelBox->hasAttribute(OV_AttributeId_Box_FlagCanModifyInput) + || m_kernelBox->hasAttribute(OV_AttributeId_Box_FlagCanAddOutput) + || m_kernelBox->hasAttribute(OV_AttributeId_Box_FlagCanModifyOutput) + || m_kernelBox->hasAttribute(OV_AttributeId_Box_FlagCanAddSetting) + || m_kernelBox->hasAttribute(OV_AttributeId_Box_FlagCanModifySetting); + } + + bool isUpdateRequired() const { return m_isUpdateRequired; } + + static const std::array UPDATABLE_ATTRIBUTES; + + _IsDerivedFromClass_Final_(TKernelObject, OV_ClassId_Kernel_Scenario_BoxUpdater) + +private: + + static size_t getInterfacorIndex(EBoxInterfacorType type, const IBox& box, const CIdentifier& typeID, const CIdentifier& id, const CString& name); + bool updateInterfacors(EBoxInterfacorType interfacorType); + + /** + * \brief Check if supported type have to be updated between the box to be updated and the kernel + * \return true when at least input or output supported types have to be updated + */ + bool checkForSupportedTypesToBeUpdated() const; + + /** + * \brief Check if supported inputs, outputs or settings attributes have to be updated between the box to be updated and the kernel + * \return true when at least input, output or settings attributes have to be updated + */ + bool checkForSupportedIOSAttributesToBeUpdated() const; + + // pointer to the parent scenario + CScenario* m_scenario = nullptr; + // pointer to the original box to be updated + IBox* m_sourceBox = nullptr; + // pointer to the kernel box + const IBox* m_kernelBox = nullptr; + // pointer to the updated box. This box will be used to update the prototype of the original box + IBox* m_updatedBox = nullptr; + // true when updater has been initialized + bool m_initialized = false; + + std::map> m_originalToUpdatedCorrespondence; + bool m_isUpdateRequired = false; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCComment.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCComment.cpp new file mode 100644 index 0000000..5c5f4ae --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCComment.cpp @@ -0,0 +1,55 @@ +#include "ovkCComment.h" +#include "ovkCScenario.h" + +#include "../ovkCObjectVisitorContext.h" + +namespace OpenViBE { +namespace Kernel { + +CComment::CComment(const IKernelContext& ctx, CScenario& rOwnerScenario) + : TAttributable>(ctx), m_rOwnerScenario(rOwnerScenario), m_text("") {} + +//___________________________________________________________________// +// // + +bool CComment::setIdentifier(const CIdentifier& id) +{ + if (m_id != CIdentifier::undefined() || id == CIdentifier::undefined()) { return false; } + m_id = id; + return true; +} + +bool CComment::setText(const CString& sText) +{ + m_text = sText; + return true; +} + +//___________________________________________________________________// +// // + +bool CComment::initializeFromExistingComment(const IComment& rExisitingComment) +{ + m_text = rExisitingComment.getText(); + + CIdentifier id = rExisitingComment.getNextAttributeIdentifier(CIdentifier::undefined()); + while (id != CIdentifier::undefined()) + { + addAttribute(id, rExisitingComment.getAttributeValue(id)); + id = rExisitingComment.getNextAttributeIdentifier(id); + } + + return true; +} + +//___________________________________________________________________// +// // + +bool CComment::acceptVisitor(IObjectVisitor& rObjectVisitor) +{ + CObjectVisitorContext context(getKernelContext()); + return rObjectVisitor.processBegin(context, *this) && rObjectVisitor.processEnd(context, *this); +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCComment.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCComment.h new file mode 100644 index 0000000..81033ce --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCComment.h @@ -0,0 +1,36 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +#include "ovkTAttributable.h" + +#include + +namespace OpenViBE { +namespace Kernel { +class CScenario; + +class CComment final : public TAttributable> +{ +public: + + CComment(const IKernelContext& ctx, CScenario& rOwnerScenario); + ~CComment() override {} + CIdentifier getIdentifier() const override { return m_id; } + CString getText() const override { return m_text; } + bool setIdentifier(const CIdentifier& id) override; + bool setText(const CString& sText) override; + bool initializeFromExistingComment(const IComment& rExisitingComment) override; + bool acceptVisitor(IObjectVisitor& rObjectVisitor) override; + + _IsDerivedFromClass_Final_(TAttributable>, OVK_ClassId_Kernel_Scenario_Comment) + +protected: + + CScenario& m_rOwnerScenario; + + CIdentifier m_id = CIdentifier::undefined(); + CString m_text; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCLink.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCLink.cpp new file mode 100644 index 0000000..defbb45 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCLink.cpp @@ -0,0 +1,76 @@ +#include "ovkCLink.h" +#include "ovkCScenario.h" + +#include "../ovkCObjectVisitorContext.h" + +namespace OpenViBE { +namespace Kernel { + +bool CLink::initializeFromExistingLink(const ILink& link) +{ + m_id = link.getIdentifier(); + m_srcBoxID = link.getSourceBoxIdentifier(); + m_dstBoxID = link.getTargetBoxIdentifier(); + m_srcBoxOutputID = link.getSourceBoxOutputIdentifier(); + m_dstBoxInputID = link.getTargetBoxInputIdentifier(); + m_srcOutputIdx = link.getSourceBoxOutputIndex(); + m_dstInputIdx = link.getTargetBoxInputIndex(); + return true; +} + + +//___________________________________________________________________// +// // + +bool CLink::setIdentifier(const CIdentifier& identifier) +{ + m_id = identifier; + return true; +} + +//___________________________________________________________________// +// // + +bool CLink::setSource(const CIdentifier& boxId, const size_t boxOutputIdx, const CIdentifier boxOutputID) +{ + m_srcBoxID = boxId; + m_srcOutputIdx = boxOutputIdx; + m_srcBoxOutputID = boxOutputID; + return true; +} + +bool CLink::setTarget(const CIdentifier& boxId, const size_t boxInputIdx, const CIdentifier boxInputID) +{ + m_dstBoxID = boxId; + m_dstInputIdx = boxInputIdx; + m_dstBoxInputID = boxInputID; + return true; +} + +bool CLink::getSource(CIdentifier& boxId, size_t& boxOutputIdx, CIdentifier& boxOutputID) const +{ + boxId = m_srcBoxID; + boxOutputIdx = m_srcOutputIdx; + boxOutputID = m_srcBoxOutputID; + return true; +} + +bool CLink::getTarget(CIdentifier& dstBoxID, size_t& boxInputIndex, CIdentifier& dstBoxInputID) const +{ + dstBoxID = m_dstBoxID; + boxInputIndex = m_dstInputIdx; + dstBoxInputID = m_dstBoxInputID; + return true; +} + +//___________________________________________________________________// +// // + +bool CLink::acceptVisitor(IObjectVisitor& visitor) +{ + CObjectVisitorContext context(getKernelContext()); + return visitor.processBegin(context, *this) && visitor.processEnd(context, *this); +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCLink.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCLink.h new file mode 100644 index 0000000..227347e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCLink.h @@ -0,0 +1,48 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +#include "ovkTAttributable.h" + +namespace OpenViBE { +namespace Kernel { +class CScenario; + +class CLink final : public TAttributable> +{ +public: + + CLink(const IKernelContext& ctx, CScenario& ownerScenario) : TAttributable>(ctx), m_ownerScenario(ownerScenario) {} + bool initializeFromExistingLink(const ILink& link) override; + bool setIdentifier(const CIdentifier& identifier) override; + CIdentifier getIdentifier() const override { return m_id; } + bool setSource(const CIdentifier& boxId, size_t boxOutputIdx, CIdentifier boxOutputID) override; + bool setTarget(const CIdentifier& boxId, size_t boxInputIdx, CIdentifier boxInputID) override; + + bool getSource(CIdentifier& boxId, size_t& boxOutputIdx, CIdentifier& boxOutputID) const override; + CIdentifier getSourceBoxIdentifier() const override { return m_srcBoxID; } + size_t getSourceBoxOutputIndex() const override { return m_srcOutputIdx; } + CIdentifier getSourceBoxOutputIdentifier() const override { return m_srcBoxOutputID; } + + bool getTarget(CIdentifier& dstBoxID, size_t& boxInputIndex, CIdentifier& dstBoxInputID) const override; + CIdentifier getTargetBoxIdentifier() const override { return m_dstBoxID; } + size_t getTargetBoxInputIndex() const override { return m_dstInputIdx; } + CIdentifier getTargetBoxInputIdentifier() const override { return m_dstBoxInputID; } + + bool acceptVisitor(IObjectVisitor& visitor) override; + + _IsDerivedFromClass_Final_(TAttributable>, OVK_ClassId_Kernel_Scenario_Link) + +protected: + + CScenario& m_ownerScenario; + CIdentifier m_id = CIdentifier::undefined(); + CIdentifier m_srcBoxID = CIdentifier::undefined(); + CIdentifier m_dstBoxID = CIdentifier::undefined(); + size_t m_srcOutputIdx = 0; + CIdentifier m_srcBoxOutputID = CIdentifier::undefined(); + size_t m_dstInputIdx = 0; + CIdentifier m_dstBoxInputID = CIdentifier::undefined(); +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCMetadata.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCMetadata.cpp new file mode 100644 index 0000000..0b8f145 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCMetadata.cpp @@ -0,0 +1,61 @@ +#include "../ovkTKernelObject.h" + +#include "ovkCMetadata.h" +#include "ovkCScenario.h" + +#include "../ovkCObjectVisitorContext.h" + +namespace OpenViBE { +namespace Kernel { + +bool CMetadata::setIdentifier(const CIdentifier& identifier) +{ + OV_ERROR_UNLESS_KRF(m_id == CIdentifier::undefined(), + "Metadata [" << m_id.str() << "] in scenario [" << m_ownerScenario.getIdentifier() << "] already has an identifier.", + ErrorType::BadCall); + + OV_ERROR_UNLESS_KRF(identifier != CIdentifier::undefined(), + "Attempted to assign undefined identifier to Metadata in scenario [" << m_ownerScenario.getIdentifier() << "].", + ErrorType::BadArgument); + + m_id = identifier; + return true; +} + +bool CMetadata::setType(const CIdentifier& typeID) +{ + OV_ERROR_UNLESS_KRF(typeID != CIdentifier::undefined(), + "Attempted to assign undefined typeID to Metadata [" << m_id.str() << "] in scenario [" << m_ownerScenario.getIdentifier() << "].", + ErrorType::BadArgument); + + m_type = typeID; + return true; +} + +bool CMetadata::setData(const CString& data) +{ + m_data = data; + return true; +} + +//___________________________________________________________________// +// // + +bool CMetadata::initializeFromExistingMetadata(const IMetadata& existingMetadata) +{ + m_data = existingMetadata.getData(); + m_type = existingMetadata.getType(); + return true; +} + +//___________________________________________________________________// +// // + +bool CMetadata::acceptVisitor(IObjectVisitor& objectVisitor) +{ + CObjectVisitorContext objectVisitorContext(this->getKernelContext()); + return objectVisitor.processBegin(objectVisitorContext, *this) && objectVisitor.processEnd(objectVisitorContext, *this); +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCMetadata.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCMetadata.h new file mode 100644 index 0000000..a5f0a77 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCMetadata.h @@ -0,0 +1,39 @@ +#pragma once + +#include +#include "../ovkTKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +class CScenario; + +class CMetadata final : public TKernelObject +{ +public: + + CMetadata(const IKernelContext& ctx, CScenario& ownerScenario) : TKernelObject(ctx), m_ownerScenario(ownerScenario), m_data("") {} + ~CMetadata() override {} + + CIdentifier getIdentifier() const override { return m_id; } + CIdentifier getType() const override { return m_type; } + CString getData() const override { return m_data; } + bool setIdentifier(const CIdentifier& identifier) override; + bool setType(const CIdentifier& typeID) override; + bool setData(const CString& data) override; + + bool initializeFromExistingMetadata(const IMetadata& existingMetadata) override; + + bool acceptVisitor(IObjectVisitor& objectVisitor) override; + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Scenario_Metadata) + +private: + + CScenario& m_ownerScenario; + + CIdentifier m_id = CIdentifier::undefined(); + CIdentifier m_type = CIdentifier::undefined(); + CString m_data; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenario.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenario.cpp new file mode 100755 index 0000000..2691857 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenario.cpp @@ -0,0 +1,1460 @@ +#include "ovkCScenario.h" +#include "ovkCScenarioSettingKeywordParserCallback.h" + +#include "ovkTBox.hpp" +#include "ovkCBoxUpdater.h" +#include "ovkCComment.h" +#include "ovkCMetadata.h" +#include "ovkCLink.h" + +#include "../ovkCObjectVisitorContext.h" +#include "../../tools/ovk_setting_checker.h" + +#include +#include +#include + +#define OV_AttributeId_Box_Disabled OpenViBE::CIdentifier(0x341D3912, 0x1478DE86) +#define OVD_AttributeId_SettingOverrideFilename OpenViBE::CIdentifier(0x8D21FF41, 0xDF6AFE7E) + +// The following is a hack, can be removed once there is a copy constructor for scenarios, boxes, etc +#include +//___________________________________________________________________// +// // +namespace OpenViBE { +namespace Kernel { + +namespace { +template +struct STestTrue +{ + bool operator()(typename std::map::const_iterator /*it*/) const { return true; } +}; + +struct STestEqSourceBox +{ + explicit STestEqSourceBox(const CIdentifier& boxId) : m_BoxId(boxId) { } + bool operator()(const std::map::const_iterator& it) const { return it->second->getSourceBoxIdentifier() == m_BoxId; } + const CIdentifier& m_BoxId; +}; + +struct STestEqSourceBoxOutput +{ + STestEqSourceBoxOutput(const CIdentifier& boxId, const size_t index) : m_BoxId(boxId), m_OutputIdx(index) { } + + bool operator()(const std::map::const_iterator& it) const + { + return it->second->getSourceBoxIdentifier() == m_BoxId && it->second->getSourceBoxOutputIndex() == m_OutputIdx; + } + + const CIdentifier& m_BoxId; + size_t m_OutputIdx; +}; + +struct STestEqTargetBox +{ + explicit STestEqTargetBox(const CIdentifier& boxId) : m_BoxId(boxId) { } + bool operator()(const std::map::const_iterator& it) const { return it->second->getTargetBoxIdentifier() == m_BoxId; } + const CIdentifier& m_BoxId; +}; + +struct STestEqTargetBoxInput +{ + STestEqTargetBoxInput(const CIdentifier& boxId, const size_t index) : m_BoxId(boxId), m_InputIdx(index) { } + + bool operator()(const std::map::const_iterator& it) const + { + return it->second->getTargetBoxIdentifier() == m_BoxId && it->second->getTargetBoxInputIndex() == m_InputIdx; + } + + const CIdentifier& m_BoxId; + size_t m_InputIdx; +}; + +template +CIdentifier getNextID(const std::map& elementMap, const CIdentifier& previousID, const TTest& testFunctor) +{ + typename std::map::const_iterator it; + + if (previousID == CIdentifier::undefined()) { it = elementMap.begin(); } + else + { + it = elementMap.find(previousID); + if (it == elementMap.end()) { return CIdentifier::undefined(); } + ++it; + } + + while (it != elementMap.end()) + { + if (testFunctor(it)) { return it->first; } + ++it; + } + + return CIdentifier::undefined(); +} + +/* +template +CIdentifier getNextID(const std::map& elementMap, const CIdentifier& previousID, const TTest& testFunctor) +{ + typename std::map::const_iterator it; + + if(previousID==CIdentifier::undefined()) + { + it=elementMap.begin(); + } + else + { + it=elementMap.find(previousID); + if(it==elementMap.end()) { return CIdentifier::undefined(); } + ++it; + } + + while(it!=elementMap.end()) + { + if(testFunctor(it)) { return it->first; } + ++it; + } + + return CIdentifier::undefined(); +} +*/ +} // namespace + +//___________________________________________________________________// +// // + +CScenario::CScenario(const IKernelContext& ctx, const CIdentifier& identifier) : TBox(ctx), m_firstMetadataID(CIdentifier::undefined()) +{ + // Some operations on boxes manipulate the owner scenario, for example removing inputs + // by default we set the scenario as owning itself to avoid segfaults + this->setOwnerScenario(this); + this->m_identifier = identifier; +} + +//___________________________________________________________________// +// // + +bool CScenario::clear() +{ + this->getLogManager() << LogLevel_Debug << "Clearing scenario\n"; + + for (auto& box : m_boxes) { delete box.second; } + m_boxes.clear(); + + for (auto& comment : m_comments) { delete comment.second; } + m_comments.clear(); + + for (auto& metadata : m_metadatas) { delete metadata.second; } + m_metadatas.clear(); + m_firstMetadataID = CIdentifier::undefined(); + m_nextMetadataID.clear(); + + for (auto& link : m_links) { delete link.second; } + m_links.clear(); + + m_outdatedBoxes.clear(); + + while (this->getSettingCount()) { this->removeSetting(0); } + while (this->getInputCount()) { this->removeScenarioInput(0); } + while (this->getOutputCount()) { this->removeScenarioOutput(0); } + + this->removeAllAttributes(); + + return true; +} + +bool CScenario::removeScenarioInput(const size_t index) +{ + OV_ERROR_UNLESS_KRF(index < this->getInputCount(), "Input index = [" << index << "] is out of range (max index = [" << (this->getInputCount() - 1) << "])", + ErrorType::OutOfBound); + + this->removeInput(index); + + // Remove the link within the scenario to this input + if (index < m_scenarioInputLinks.size()) { m_scenarioInputLinks.erase(m_scenarioInputLinks.begin() + index); } + + return true; +} + +bool CScenario::removeScenarioOutput(const size_t index) +{ + OV_ERROR_UNLESS_KRF(index < this->getOutputCount(), + "Output index = [" << index << "] is out of range (max index = [" << (this->getOutputCount() - 1) << "])", + Kernel::ErrorType::OutOfBound); + + this->removeOutput(index); + + // Remove the link within the scenario to this output + if (index < m_scenarioOutputLinks.size()) { m_scenarioOutputLinks.erase(m_scenarioOutputLinks.begin() + index); } + + return true; +} + +bool CScenario::merge(const IScenario& scenario, IScenarioMergeCallback* scenarioMergeCallback, const bool mergeSettings, const bool preserveIDs) +{ + std::map oldToNewIdMap; + + // Copy boxes + { + CIdentifier* listID = nullptr; + size_t nbElems = 0; + scenario.getBoxIdentifierList(&listID, &nbElems); + for (size_t i = 0; i < nbElems; ++i) + { + CIdentifier boxID = listID[i]; + const IBox* box = scenario.getBoxDetails(boxID); + CIdentifier newID; + CIdentifier suggestedNewID = preserveIDs ? box->getIdentifier() : CIdentifier::undefined(); + this->addBox(newID, *box, suggestedNewID); + oldToNewIdMap[boxID] = newID; + + if (scenarioMergeCallback) { scenarioMergeCallback->process(boxID, newID); } + } + scenario.releaseIdentifierList(listID); + } + + // Copy links + { + CIdentifier* listID = nullptr; + size_t nbElems = 0; + scenario.getLinkIdentifierList(&listID, &nbElems); + for (size_t i = 0; i < nbElems; ++i) + { + CIdentifier linkID = listID[i]; + const ILink* link = scenario.getLinkDetails(linkID); + CIdentifier newID; + this->connect(newID, oldToNewIdMap[link->getSourceBoxIdentifier()], + link->getSourceBoxOutputIndex(), oldToNewIdMap[link->getTargetBoxIdentifier()], + link->getTargetBoxInputIndex(), CIdentifier::undefined()); + + if (scenarioMergeCallback) { scenarioMergeCallback->process(linkID, newID); } + } + scenario.releaseIdentifierList(listID); + } + // Copy comments + + // Copy metadata + { + CIdentifier* listID = nullptr; + size_t nbElems = 0; + scenario.getMetadataIdentifierList(&listID, &nbElems); + for (size_t i = 0; i < nbElems; ++i) + { + CIdentifier metadataID = listID[i]; + const IMetadata* metadata = scenario.getMetadataDetails(metadataID); + CIdentifier newID; + CIdentifier suggestedNewID = preserveIDs ? metadataID : CIdentifier::undefined(); + this->addMetadata(newID, suggestedNewID); + IMetadata* newMetadata = this->getMetadataDetails(newID); + newMetadata->initializeFromExistingMetadata(*metadata); + } + scenario.releaseIdentifierList(listID); + } + + // Copy settings if requested + + const size_t previousSettingCount = this->getSettingCount(); + + if (mergeSettings) + { + for (size_t i = 0; i < scenario.getSettingCount(); ++i) + { + CIdentifier typeID; + CString name; + CString defaultValue; + CString value; + bool isModifiable; + CIdentifier id; + scenario.getSettingType(i, typeID); + scenario.getSettingName(i, name); + scenario.getSettingDefaultValue(i, defaultValue); + scenario.getSettingValue(i, value); + scenario.getSettingMod(i, isModifiable); + scenario.getInterfacorIdentifier(Setting, i, id); + + this->addSetting(name, typeID, defaultValue, size_t(-1), isModifiable, id, true); + this->setSettingValue(previousSettingCount + i, value); + } + + // In this case we also merge the attributes + CIdentifier attributeIdentifier; + while ((attributeIdentifier = scenario.getNextAttributeIdentifier(attributeIdentifier)) != CIdentifier::undefined()) + { + CString attributeValue = scenario.getAttributeValue(attributeIdentifier); + this->addAttribute(attributeIdentifier, attributeValue); + } + } + + return true; +} + +//___________________________________________________________________// +// // + +CIdentifier CScenario::getNextBoxIdentifier(const CIdentifier& previousID) const +{ + return getNextID>(m_boxes, previousID, STestTrue()); +} + +const IBox* CScenario::getBoxDetails(const CIdentifier& boxID) const +{ + const auto it = m_boxes.find(boxID); + OV_ERROR_UNLESS_KRN(it != m_boxes.end(), "Box [" << boxID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + return it->second; +} + +bool CScenario::isBox(const CIdentifier& boxID) const { return m_boxes.count(boxID) == 1; } + +IBox* CScenario::getBoxDetails(const CIdentifier& boxID) +{ + // this->getLogManager() << Kernel::LogLevel_Debug << "Getting box details from scenario\n"; + const auto it = m_boxes.find(boxID); + OV_ERROR_UNLESS_KRN(it != m_boxes.end(), "Box [" << boxID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + return it->second; +} + +bool CScenario::addBox(CIdentifier& boxID, const CIdentifier& suggestedBoxID) +{ + boxID = getUnusedIdentifier(suggestedBoxID); + CBox* box = new CBox(this->getKernelContext()); + box->setOwnerScenario(this); + box->setIdentifier(boxID); + + m_boxes[boxID] = box; + return true; +} + +bool CScenario::addBox(CIdentifier& boxID, const IBox& box, const CIdentifier& suggestedBoxID) +{ + if (!addBox(boxID, suggestedBoxID)) + { + // error is handled in addBox + return false; + } + + IBox* newBox = getBoxDetails(boxID); + if (!newBox) + { + // error is handled in getBoxDetails + return false; + } + + return newBox->initializeFromExistingBox(box); +} + +bool CScenario::addBox(CIdentifier& boxID, const CIdentifier& boxAlgorithmID, const CIdentifier& suggestedBoxID) +{ + if (!addBox(boxID, suggestedBoxID)) + { + // error is handled in addBox + return false; + } + + IBox* newBox = getBoxDetails(boxID); + if (!newBox) + { + // error is handled in getBoxDetails + return false; + } + + return newBox->initializeFromAlgorithmClassIdentifier(boxAlgorithmID); +} + +bool CScenario::addBox(CIdentifier& boxID, const Plugins::IBoxAlgorithmDesc& boxAlgorithmDesc, const CIdentifier& suggestedBoxID) +{ + if (!addBox(boxID, suggestedBoxID)) + { + // error is handled in addBox + return false; + } + + IBox* newBox = getBoxDetails(boxID); + if (!newBox) + { + // error is handled in getBoxDetails + return false; + } + + return dynamic_cast(newBox)->initializeFromBoxAlgorithmDesc(boxAlgorithmDesc); +} + +bool CScenario::removeBox(const CIdentifier& boxID) +{ + // Finds the box according to its identifier + auto itBox = m_boxes.find(boxID); + + OV_ERROR_UNLESS_KRF(itBox != m_boxes.end(), "Box [" << boxID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + + // Find all the links that are used by this box + auto itLink = m_links.begin(); + while (itLink != m_links.end()) + { + auto itLinkCurrent = itLink; + ++itLink; + + if (itLinkCurrent->second->getSourceBoxIdentifier() == boxID || itLinkCurrent->second->getTargetBoxIdentifier() == boxID) + { + // Deletes this link + delete itLinkCurrent->second; + + // Removes link from the link list + m_links.erase(itLinkCurrent); + } + } + + // Deletes the box itself + delete itBox->second; + + // Removes box from the box list + m_boxes.erase(itBox); + + return true; +} + +//___________________________________________________________________// + +CIdentifier CScenario::getNextCommentIdentifier(const CIdentifier& previousID) const +{ + return getNextID>(m_comments, previousID, STestTrue()); +} + +const IComment* CScenario::getCommentDetails(const CIdentifier& commentID) const +{ + const auto it = m_comments.find(commentID); + OV_ERROR_UNLESS_KRN(it != m_comments.end(), "Comment [" << commentID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + return it->second; +} + +bool CScenario::isComment(const CIdentifier& commentID) const { return m_comments.find(commentID) != m_comments.end(); } + +IComment* CScenario::getCommentDetails(const CIdentifier& commentID) +{ + const auto it = m_comments.find(commentID); + OV_ERROR_UNLESS_KRN(it != m_comments.end(), "Comment [" << commentID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + return it->second; +} + +bool CScenario::addComment(CIdentifier& commentID, const CIdentifier& suggestedCommentID) +{ + commentID = getUnusedIdentifier(suggestedCommentID); + CComment* newComment = new CComment(this->getKernelContext(), *this); + newComment->setIdentifier(commentID); + + m_comments[commentID] = newComment; + return true; +} + +bool CScenario::addComment(CIdentifier& commentID, const IComment& comment, const CIdentifier& suggestedCommentID) +{ + if (!addComment(commentID, suggestedCommentID)) + { + // error is handled in addComment above + return false; + } + + IComment* newComment = getCommentDetails(commentID); + if (!newComment) + { + // error is handled in getCommentDetails + return false; + } + + return newComment->initializeFromExistingComment(comment); +} + +bool CScenario::removeComment(const CIdentifier& commentID) +{ + // Finds the comment according to its identifier + auto it = m_comments.find(commentID); + OV_ERROR_UNLESS_KRF(it != m_comments.end(), "Comment [" << commentID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + delete it->second; // Deletes the comment itself + m_comments.erase(it); // Removes comment from the comment list + return true; +} + +CIdentifier CScenario::getNextMetadataIdentifier(const CIdentifier& previousID) const +{ + if (previousID == CIdentifier::undefined()) { return m_firstMetadataID; } + if (m_metadatas.count(previousID) == 0) { return CIdentifier::undefined(); } + return m_nextMetadataID.at(previousID); +} + +const IMetadata* CScenario::getMetadataDetails(const CIdentifier& metadataID) const +{ + const auto it = m_metadatas.find(metadataID); + OV_ERROR_UNLESS_KRN(it != m_metadatas.end(), "Metadata [" << metadataID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + return it->second; +} + +IMetadata* CScenario::getMetadataDetails(const CIdentifier& metadataID) +{ + const auto it = m_metadatas.find(metadataID); + OV_ERROR_UNLESS_KRN(it != m_metadatas.end(), "Metadata [" << metadataID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + return it->second; +} + +bool CScenario::isMetadata(const CIdentifier& metadataID) const { return m_metadatas.count(metadataID) > 0; } + +bool CScenario::addMetadata(CIdentifier& metadataID, const CIdentifier& suggestedMetadataID) +{ + metadataID = getUnusedIdentifier(suggestedMetadataID); + CMetadata* metadata = new CMetadata(this->getKernelContext(), *this); + metadata->setIdentifier(metadataID); + + m_nextMetadataID[metadataID] = m_firstMetadataID; + m_firstMetadataID = metadataID; + m_metadatas[metadataID] = metadata; + return true; +} + +bool CScenario::removeMetadata(const CIdentifier& metadataID) +{ + // Finds the comment according to its identifier + auto itMetadata = m_metadatas.find(metadataID); + + OV_ERROR_UNLESS_KRF(itMetadata != m_metadatas.end(), "Comment [" << metadataID.str() << "] is not part of the scenario", + Kernel::ErrorType::ResourceNotFound); + + // Deletes the metadata and remove it from the cache + delete itMetadata->second; + + m_metadatas.erase(itMetadata); + + if (metadataID == m_firstMetadataID) + { + m_firstMetadataID = m_nextMetadataID[m_firstMetadataID]; + m_nextMetadataID.erase(metadataID); + } + else + { + const auto previousID = std::find_if(m_nextMetadataID.begin(), m_nextMetadataID.end(), [metadataID](const std::pair& v) + { + return v.second == metadataID; + }); + + OV_FATAL_UNLESS_K(previousID != m_nextMetadataID.end(), "Removing metadata [" << metadataID << "] which is not in the cache ", + Kernel::ErrorType::Internal); + + m_nextMetadataID[previousID->first] = m_nextMetadataID[metadataID]; + m_nextMetadataID.erase(metadataID); + } + + return true; +} + +// Links + +CIdentifier CScenario::getNextLinkIdentifier(const CIdentifier& previousID) const +{ + return getNextID>(m_links, previousID, STestTrue()); +} + +CIdentifier CScenario::getNextLinkIdentifierFromBox(const CIdentifier& previousID, const CIdentifier& boxID) const +{ + return getNextID(m_links, previousID, STestEqSourceBox(boxID)); +} + +CIdentifier CScenario::getNextLinkIdentifierFromBoxOutput(const CIdentifier& previousID, const CIdentifier& boxID, const size_t index) const +{ + return getNextID(m_links, previousID, STestEqSourceBoxOutput(boxID, index)); +} + +CIdentifier CScenario::getNextLinkIdentifierToBox(const CIdentifier& previousID, const CIdentifier& boxID) const +{ + return getNextID(m_links, previousID, STestEqTargetBox(boxID)); +} + +CIdentifier CScenario::getNextLinkIdentifierToBoxInput(const CIdentifier& previousID, const CIdentifier& boxID, const size_t index) const +{ + return getNextID(m_links, previousID, STestEqTargetBoxInput(boxID, index)); +} + +bool CScenario::isLink(const CIdentifier& boxID) const +{ + const auto itLink = m_links.find(boxID); + return itLink != m_links.end(); +} + +bool CScenario::setHasIO(const bool hasIO) +{ + m_hasIO = hasIO; + return true; +} + +bool CScenario::hasIO() const { return m_hasIO; } + +bool CScenario::setScenarioInputLink(const size_t scenarioInputIdx, const CIdentifier& boxID, const size_t boxInputIdx) +{ + if (boxID != CIdentifier::undefined()) + { + OV_ERROR_UNLESS_KRF( + scenarioInputIdx < this->getInputCount(), + "Scenario Input index = [" << scenarioInputIdx << "] is out of range (max index = [" << (this->getInputCount() - 1) << "])", + ErrorType::OutOfBound); + + OV_ERROR_UNLESS_KRF( + this->isBox(boxID), + "Box [" << boxID.str() << "] is not part of the scenario", + ErrorType::ResourceNotFound); + + OV_ERROR_UNLESS_KRF( + boxInputIdx < this->getBoxDetails(boxID)->getInputCount(), + "Box Input index = [" << boxInputIdx << "] is out of range (max index = [" << (this->getBoxDetails(boxID)->getInputCount() - 1) << "])", + ErrorType::OutOfBound); + } + + if (scenarioInputIdx >= m_scenarioInputLinks.size()) { m_scenarioInputLinks.resize(this->getInputCount()); } + + // Remove any existing inputs connected to the target + for (size_t i = 0; i < m_scenarioInputLinks.size(); ++i) + { + CIdentifier id; + size_t index; + this->getScenarioInputLink(i, id, index); + + if (id == boxID && index == boxInputIdx) { this->removeScenarioInputLink(i, id, index); } + } + + // Remove any existing link to this input + for (auto& kv : m_links) + { + CIdentifier linkID = kv.first; + const CLink* link = kv.second; + if (link->getTargetBoxIdentifier() == boxID && link->getTargetBoxInputIndex() == boxInputIdx) { this->disconnect(linkID); } + } + + m_scenarioInputLinks[scenarioInputIdx] = std::make_pair(boxID, boxInputIdx); + return true; +} + +bool CScenario::setScenarioInputLink(const size_t scenarioInputIdx, const CIdentifier& boxID, const CIdentifier& boxInputID) +{ + size_t boxInputIdx = size_t(-1); + + if (boxID != CIdentifier::undefined()) + { + OV_ERROR_UNLESS_KRF(this->isBox(boxID), "Box [" << boxID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + this->getBoxDetails(boxID)->getInterfacorIndex(Input, boxInputID, boxInputIdx); + } + return this->setScenarioInputLink(scenarioInputIdx, boxID, boxInputIdx); +} + +bool CScenario::setScenarioOutputLink(const size_t scenarioOutputIdx, const CIdentifier& boxID, const size_t boxOutputIdx) +{ + if (boxID != CIdentifier::undefined()) + { + OV_ERROR_UNLESS_KRF(scenarioOutputIdx < this->getOutputCount(), + "Scenario output index = [" << scenarioOutputIdx << "] is out of range (max index = [" << (this->getOutputCount() - 1) << "])", + ErrorType::OutOfBound); + + OV_ERROR_UNLESS_KRF(this->isBox(boxID), + "Box [" << boxID.str() << "] is not part of the scenario", + ErrorType::ResourceNotFound); + + OV_ERROR_UNLESS_KRF(boxOutputIdx < this->getBoxDetails(boxID)->getOutputCount(), + "Box output index = [" << boxOutputIdx << "] is out of range (max index = [" << (this->getBoxDetails(boxID)->getOutputCount() - 1) + << "])", + ErrorType::OutOfBound); + } + + if (scenarioOutputIdx >= m_scenarioOutputLinks.size()) { m_scenarioOutputLinks.resize(this->getOutputCount()); } + + // Remove any existing outputs connected to the target + for (size_t i = 0; i < m_scenarioOutputLinks.size(); ++i) + { + CIdentifier id; + size_t index; + this->getScenarioOutputLink(i, id, index); + + if (id == boxID && index == boxOutputIdx) { this->removeScenarioOutputLink(i, id, index); } + } + + m_scenarioOutputLinks[scenarioOutputIdx] = std::make_pair(boxID, boxOutputIdx); + + return true; +} + +bool CScenario::setScenarioOutputLink(const size_t scenarioOutputIdx, const CIdentifier& boxID, const CIdentifier& boxOutputID) +{ + size_t boxOutputIdx = size_t(-1); + + if (boxID != CIdentifier::undefined()) + { + OV_ERROR_UNLESS_KRF(this->isBox(boxID), "Box [" << boxID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + this->getBoxDetails(boxID)->getInterfacorIndex(Output, boxOutputID, boxOutputIdx); + } + return this->setScenarioOutputLink(scenarioOutputIdx, boxID, boxOutputIdx); +} + +bool CScenario::getScenarioInputLink(const size_t scenarioInputIdx, CIdentifier& boxID, size_t& boxInputIdx) const +{ + OV_ERROR_UNLESS_KRF(scenarioInputIdx < this->getInputCount(), + "Scenario input index = [" << scenarioInputIdx << "] is out of range (max index = [" << (this->getInputCount() - 1) << "])", + ErrorType::OutOfBound); + + if (scenarioInputIdx >= m_scenarioInputLinks.size()) { m_scenarioInputLinks.resize(this->getInputCount()); } + + boxID = m_scenarioInputLinks[scenarioInputIdx].first; + boxInputIdx = m_scenarioInputLinks[scenarioInputIdx].second; + + return true; +} + +bool CScenario::getScenarioInputLink(const size_t scenarioInputIdx, CIdentifier& boxID, CIdentifier& boxOutputID) const +{ + size_t index; + boxOutputID = CIdentifier::undefined(); + + this->getScenarioInputLink(scenarioInputIdx, boxID, index); + + if (boxID != CIdentifier::undefined()) + { + if (m_boxes.find(boxID) != m_boxes.end()) { this->getBoxDetails(boxID)->getInterfacorIdentifier(Input, index, boxOutputID); } + } + + return true; +} + +bool CScenario::getScenarioOutputLink(const size_t scenarioOutputIdx, CIdentifier& boxID, size_t& boxOutputIdx) const +{ + OV_ERROR_UNLESS_KRF(scenarioOutputIdx < this->getOutputCount(), + "Scenario output index = [" << scenarioOutputIdx << "] is out of range (max index = [" << (this->getOutputCount() - 1) << "])", + ErrorType::OutOfBound); + + if (scenarioOutputIdx >= m_scenarioOutputLinks.size()) { m_scenarioOutputLinks.resize(this->getOutputCount()); } + + boxID = m_scenarioOutputLinks[scenarioOutputIdx].first; + boxOutputIdx = m_scenarioOutputLinks[scenarioOutputIdx].second; + + return true; +} + +bool CScenario::getScenarioOutputLink(const size_t scenarioOutputIdx, CIdentifier& boxID, CIdentifier& boxOutputID) const +{ + size_t index; + boxOutputID = CIdentifier::undefined(); + + this->getScenarioOutputLink(scenarioOutputIdx, boxID, index); + + if (boxID != CIdentifier::undefined()) + { + if (m_boxes.find(boxID) != m_boxes.end()) { this->getBoxDetails(boxID)->getInterfacorIdentifier(Output, index, boxOutputID); } + } + + return true; +} + +// Note: In current implementation only the scenarioInputIdx is necessary as it can only be connected to one input +// but to keep things simpler we give it all the info +bool CScenario::removeScenarioInputLink(const size_t scenarioInputIdx, const CIdentifier& boxID, const size_t boxInputIdx) +{ + if (boxID != CIdentifier::undefined()) + { + OV_ERROR_UNLESS_KRF(scenarioInputIdx < this->getInputCount(), + "Scenario Input index = [" << scenarioInputIdx << "] is out of range (max index = [" << (this->getInputCount() - 1) << "])", + ErrorType::OutOfBound); + + OV_ERROR_UNLESS_KRF(this->isBox(boxID), "Box [" << boxID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + + OV_ERROR_UNLESS_KRF(boxInputIdx < this->getBoxDetails(boxID)->getInputCount(), + "Box Input index = [" << boxInputIdx << "] is out of range (max index = [" << (this->getBoxDetails(boxID)->getInputCount() - 1) << + "])", + ErrorType::OutOfBound); + } + + // This should not happen either + if (scenarioInputIdx >= m_scenarioInputLinks.size()) { m_scenarioInputLinks.resize(this->getInputCount()); } + + m_scenarioInputLinks[scenarioInputIdx] = std::make_pair(CIdentifier::undefined(), 0); + return true; +} + +// Note: In current implementation only the scenarioOutputIdx is necessary as it can only be connected to one Output +// but to keep things simpler we give it all the info +bool CScenario::removeScenarioOutputLink(const size_t scenarioOutputIdx, const CIdentifier& boxID, const size_t boxOutputIdx) +{ + if (boxID != CIdentifier::undefined()) + { + OV_ERROR_UNLESS_KRF(scenarioOutputIdx < this->getOutputCount(), + "Scenario output index = [" << scenarioOutputIdx << "] is out of range (max index = [" << (this->getOutputCount() - 1) << "])", + ErrorType::OutOfBound); + + OV_ERROR_UNLESS_KRF(this->isBox(boxID), "Box [" << boxID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + + OV_ERROR_UNLESS_KRF(boxOutputIdx < this->getBoxDetails(boxID)->getOutputCount(), + "Box output index = [" << boxOutputIdx << "] is out of range (max index = [" << (this->getBoxDetails(boxID)->getOutputCount() - 1) + << "])", + ErrorType::OutOfBound); + } + + // This should not happen either + if (scenarioOutputIdx >= m_scenarioOutputLinks.size()) { m_scenarioOutputLinks.resize(this->getOutputCount()); } + + m_scenarioOutputLinks[scenarioOutputIdx] = std::make_pair(CIdentifier::undefined(), 0); + return true; +} + +const ILink* CScenario::getLinkDetails(const CIdentifier& linkID) const +{ + const auto it = m_links.find(linkID); + OV_ERROR_UNLESS_KRN(it != m_links.end(), "link [" << linkID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + return it->second; +} + +ILink* CScenario::getLinkDetails(const CIdentifier& linkID) +{ + const auto it = m_links.find(linkID); + OV_ERROR_UNLESS_KRN(it != m_links.end(), "Link [" << linkID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + return it->second; +} + +bool CScenario::connect(CIdentifier& linkID, const CIdentifier& srcBoxID, const size_t srcBoxOutputIdx, + const CIdentifier& dstBoxID, const size_t dstBoxInputIdx, const CIdentifier& suggestedLinkID) +{ + const auto itBox1 = m_boxes.find(srcBoxID); + const auto itBox2 = m_boxes.find(dstBoxID); + + OV_ERROR_UNLESS_KRF(itBox1 != m_boxes.end(), "Source Box [" << srcBoxID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + + OV_ERROR_UNLESS_KRF(itBox2 != m_boxes.end(), "Target Box [" << dstBoxID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + + CBox* srcBox = itBox1->second; + CBox* dstBox = itBox2->second; + + OV_ERROR_UNLESS_KRF(dstBoxInputIdx < dstBox->getInterfacorCountIncludingDeprecated(Input), + "Target box input index = [" << dstBoxInputIdx << "] is out of range (max index = [" << (dstBox->getInputCount() - 1) << "])", + ErrorType::OutOfBound); + + OV_ERROR_UNLESS_KRF(srcBoxOutputIdx < srcBox->getInterfacorCountIncludingDeprecated(Output), + "Source box output index = [" << srcBoxOutputIdx << "] is out of range (max index = [" << (srcBox->getOutputCount() - 1) << "])", + ErrorType::OutOfBound); + + // Looks for any connected link to this box input and removes it + auto itLink = m_links.begin(); + while (itLink != m_links.end()) + { + const auto itLinkCurrent = itLink; + ++itLink; + + CLink* link = itLinkCurrent->second; + if (link) + { + if (link->getTargetBoxIdentifier() == dstBoxID && link->getTargetBoxInputIndex() == dstBoxInputIdx) + { + delete link; + m_links.erase(itLinkCurrent); + } + } + } + + linkID = getUnusedIdentifier(suggestedLinkID); + + CLink* link = new CLink(this->getKernelContext(), *this); + CIdentifier srcBoxOutputID; + CIdentifier dstBoxInputID; + + this->getSourceBoxOutputIdentifier(srcBoxID, srcBoxOutputIdx, srcBoxOutputID); + this->getTargetBoxInputIdentifier(dstBoxID, dstBoxInputIdx, dstBoxInputID); + + link->setIdentifier(linkID); + link->setSource(srcBoxID, srcBoxOutputIdx, srcBoxOutputID); + link->setTarget(dstBoxID, dstBoxInputIdx, dstBoxInputID); + + m_links[link->getIdentifier()] = link; + + return true; +} + +bool CScenario::connect(CIdentifier& linkID, const CIdentifier& srcBoxID, const CIdentifier& srcBoxOutputID, + const CIdentifier& dstBoxID, const CIdentifier& dstBoxInputID, const CIdentifier& suggestedLinkID) +{ + size_t srcBoxOutputIdx; + size_t dstBoxInputIdx; + + this->getSourceBoxOutputIndex(srcBoxID, srcBoxOutputID, srcBoxOutputIdx); + this->getTargetBoxInputIndex(dstBoxID, dstBoxInputID, dstBoxInputIdx); + + return this->connect(linkID, srcBoxID, srcBoxOutputIdx, dstBoxID, dstBoxInputIdx, suggestedLinkID); +} + + +bool CScenario::disconnect(const CIdentifier& srcBoxID, const size_t srcBoxOutputIdx, const CIdentifier& dstBoxID, const size_t dstBoxInputIdx) +{ + // Looks for any link with the same signature + for (auto itLink = m_links.begin(); itLink != m_links.end(); ++itLink) + { + CLink* link = itLink->second; + if (link) + { + if (link->getTargetBoxIdentifier() == dstBoxID && link->getTargetBoxInputIndex() == dstBoxInputIdx) + { + if (link->getSourceBoxIdentifier() == srcBoxID && link->getSourceBoxOutputIndex() == srcBoxOutputIdx) + { + // Found a link, so removes it + delete link; + m_links.erase(itLink); + + return true; + } + } + } + } + + OV_ERROR_KRF("Link is not part of the scenario", Kernel::ErrorType::ResourceNotFound); +} + +bool CScenario::disconnect(const CIdentifier& srcBoxID, const CIdentifier& srcBoxOutputID, const CIdentifier& dstBoxID, const CIdentifier& dstBoxInputID) +{ + size_t srcBoxOutputIdx; + size_t dstBoxInputIdx; + + this->getSourceBoxOutputIndex(srcBoxID, srcBoxOutputID, srcBoxOutputIdx); + this->getTargetBoxInputIndex(dstBoxID, dstBoxInputID, dstBoxInputIdx); + + return this->disconnect(srcBoxID, srcBoxOutputIdx, dstBoxID, dstBoxInputIdx); +} + +bool CScenario::disconnect(const CIdentifier& linkID) +{ + // Finds the link according to its identifier + auto itLink = m_links.find(linkID); + + OV_ERROR_UNLESS_KRF(itLink != m_links.end(), "Link [" << linkID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + + // Deletes the link itself + delete itLink->second; + + // Removes link from the link list + m_links.erase(itLink); + + return true; +} + +//___________________________________________________________________// +// // + +bool CScenario::applyLocalSettings() +{ + for (auto& box : m_boxes) + { + // Expand all the variables inside the newly created scenario by replacing only the $var variables + CScenarioSettingKeywordParserCallback scenarioSettingKeywordParserCallback(*this); + this->getConfigurationManager().registerKeywordParser("var", scenarioSettingKeywordParserCallback); + + for (size_t settingIndex = 0; settingIndex < box.second->getSettingCount(); ++settingIndex) + { + CString settingName = ""; + CString settingValue = ""; + + box.second->getSettingName(settingIndex, settingName); + box.second->getSettingValue(settingIndex, settingValue); + + box.second->setSettingValue(settingIndex, this->getConfigurationManager().expandOnlyKeyword("var", settingValue, true)); + box.second->getSettingValue(settingIndex, settingValue); + + if (box.second->hasAttribute(OVD_AttributeId_SettingOverrideFilename)) + { + settingValue = box.second->getAttributeValue(OVD_AttributeId_SettingOverrideFilename); + box.second->setAttributeValue( + OVD_AttributeId_SettingOverrideFilename, this->getConfigurationManager().expandOnlyKeyword("var", settingValue, true)); + } + } + + this->getConfigurationManager().unregisterKeywordParser("var"); + } + return true; +} + +bool CScenario::isMetabox() +{ + // A scenario with inputs and/or outputs is a metabox + if (this->getInputCount() + this->getOutputCount() > 0) { return true; } + + // TODO_JL: Find a way to check for other conditions as well + + return false; +} + +//___________________________________________________________________// +// // + +bool CScenario::acceptVisitor(IObjectVisitor& objectVisitor) +{ + CObjectVisitorContext objectVisitorContext(getKernelContext()); + + if (!objectVisitor.processBegin(objectVisitorContext, *this)) { return false; } + for (auto& box : m_boxes) { if (!box.second->acceptVisitor(objectVisitor)) { return false; } } + for (auto& comment : m_comments) { if (!comment.second->acceptVisitor(objectVisitor)) { return false; } } + for (auto& link : m_links) { if (!link.second->acceptVisitor(objectVisitor)) { return false; } } + if (!objectVisitor.processEnd(objectVisitorContext, *this)) { return false; } + + return true; +} + +//___________________________________________________________________// +// // + +CIdentifier CScenario::getUnusedIdentifier(const CIdentifier& suggestedID) const +{ + uint64_t newID = (uint64_t(rand()) << 32) + uint64_t(rand()); + if (suggestedID != CIdentifier::undefined()) { newID = suggestedID.id() - 1; } + + CIdentifier result; + std::map::const_iterator itBox; + std::map::const_iterator itComment; + std::map::const_iterator itLink; + do + { + newID++; + result = CIdentifier(newID); + itBox = m_boxes.find(result); + itComment = m_comments.find(result); + itLink = m_links.find(result); + } while (itBox != m_boxes.end() || itComment != m_comments.end() || itLink != m_links.end() || result == CIdentifier::undefined()); + return result; +} + +bool CScenario::checkSettings(IConfigurationManager* configurationManager) +{ + for (auto& box : m_boxes) + { + if (!box.second->hasAttribute(OV_AttributeId_Box_Disabled)) + { + this->applyLocalSettings(); + // Expand all the variables inside the newly created scenario by replacing only the $var variables + CScenarioSettingKeywordParserCallback scenarioSettingKeywordParserCallback(*this); + this->getConfigurationManager().registerKeywordParser("var", scenarioSettingKeywordParserCallback); + + for (size_t settingIndex = 0; settingIndex < box.second->getSettingCount(); ++settingIndex) + { + CString settingName = ""; + CString rawSettingValue = ""; + CIdentifier typeID; + + if (box.second->hasAttribute(OVD_AttributeId_SettingOverrideFilename)) { return true; } + box.second->getSettingName(settingIndex, settingName); + box.second->getSettingValue(settingIndex, rawSettingValue); + box.second->getSettingType(settingIndex, typeID); + + CString settingValue = rawSettingValue; + if (configurationManager) { settingValue = configurationManager->expand(settingValue); } + else { settingValue = this->getConfigurationManager().expandOnlyKeyword("var", settingValue); } + + const auto settingTypeName = this->getTypeManager().getTypeName(typeID); + + OV_ERROR_UNLESS_KRF( + ::checkSettingValue(settingValue, typeID, this->getTypeManager()), + "<" << box.second->getName() << "> The following value: ["<< rawSettingValue <<"] expanded as ["<< settingValue << + "] given as setting is not a valid [" << settingTypeName << "] value.", + ErrorType::BadValue); + } + + this->getConfigurationManager().unregisterKeywordParser("var"); + } + } + return true; +} + + +//___________________________________________________________________// +// // + +CIdentifier CScenario::getNextOutdatedBoxIdentifier(const CIdentifier& previousID) const +{ + return getNextID, STestTrue>>(m_outdatedBoxes, previousID, STestTrue>()); +} + +bool CScenario::hasOutdatedBox() +{ + for (auto& box : m_boxes) { if (box.second->hasAttribute(OV_AttributeId_Box_ToBeUpdated)) { return true; } } + return false; +} + +bool CScenario::isBoxOutdated(const CIdentifier& boxId) +{ + IBox* box = getBoxDetails(boxId); + if (!box) { return false; } + CIdentifier boxHashCode1; + CIdentifier boxHashCode2; + if (box->getAlgorithmClassIdentifier() == OVP_ClassId_BoxAlgorithm_Metabox) + { + CIdentifier metaboxId; + metaboxId.fromString(box->getAttributeValue(OVP_AttributeId_Metabox_ID)); + boxHashCode1 = getKernelContext().getMetaboxManager().getMetaboxHash(metaboxId); + } + else { boxHashCode1 = this->getKernelContext().getPluginManager().getPluginObjectHashValue(box->getAlgorithmClassIdentifier()); } + + boxHashCode2.fromString(box->getAttributeValue(OV_AttributeId_Box_InitialPrototypeHashValue)); + + if (!(boxHashCode1 == CIdentifier::undefined() || boxHashCode1 == boxHashCode2)) { return true; } + + return false; +} + +bool CScenario::checkOutdatedBoxes() +{ + bool result = false; + + m_outdatedBoxes.clear(); + m_updatedBoxIOCorrespondence[Input] = std::map>(); + m_updatedBoxIOCorrespondence[Output] = std::map>(); + + for (auto& box : m_boxes) + { + // Do not attempt to update boxes which do not have existing box algorithm identifiers + auto boxAlgorithmClassID = box.second->getAlgorithmClassIdentifier(); + if (boxAlgorithmClassID != OVP_ClassId_BoxAlgorithm_Metabox + && !dynamic_cast(this->getKernelContext().getPluginManager().getPluginObjectDescCreating(boxAlgorithmClassID))) + { + continue; + } + + // Do not attempt to update metaboxes which do not have an associated scenario + if (boxAlgorithmClassID == OVP_ClassId_BoxAlgorithm_Metabox) + { + CString metaboxIdentifier = box.second->getAttributeValue(OVP_AttributeId_Metabox_ID); + if (metaboxIdentifier == CString("")) { continue; } + + CIdentifier metaboxId; + metaboxId.fromString(metaboxIdentifier); + CString metaboxScenarioPath(this->getKernelContext().getMetaboxManager().getMetaboxFilePath(metaboxId)); + + if (metaboxScenarioPath == CString("")) { continue; } + } + + // Box Updater instance which is in charge of create updated boxes and links + CBoxUpdater boxUpdater(*this, box.second); + + if (!boxUpdater.initialize()) + { + OV_WARNING_K("Could not check for update the box with id " << box.second->getIdentifier()); + continue; + } + + // exception for boxes that could not be automatically updated + if (boxUpdater.flaggedForManualUpdate()) + { + if (this->isBoxOutdated(box.second->getIdentifier())) + { + auto toBeUpdatedBox = std::make_shared(getKernelContext()); + toBeUpdatedBox->initializeFromAlgorithmClassIdentifierNoInit(boxAlgorithmClassID); + m_outdatedBoxes[box.second->getIdentifier()] = toBeUpdatedBox; + m_boxes[box.first]->setAttributeValue(OV_AttributeId_Box_ToBeUpdated, ""); + result = true; + } + continue; + } + + // collect updated boxes + if (boxUpdater.isUpdateRequired()) + { + m_updatedBoxIOCorrespondence[Input][box.second->getIdentifier()] = boxUpdater.getOriginalToUpdatedInterfacorCorrespondence(Input); + m_updatedBoxIOCorrespondence[Output][box.second->getIdentifier()] = boxUpdater.getOriginalToUpdatedInterfacorCorrespondence(Output); + // it is important to set box algorithm at + // last so the box listener is never called + boxUpdater.getUpdatedBox().setAlgorithmClassIdentifier(boxAlgorithmClassID); + // copy requested box into a new instance managed in scenario + auto newBox = std::make_shared(this->getKernelContext()); + newBox->initializeFromExistingBox(boxUpdater.getUpdatedBox()); + m_outdatedBoxes[box.second->getIdentifier()] = newBox; + m_boxes[box.first]->setAttributeValue(OV_AttributeId_Box_ToBeUpdated, ""); + result = true; + } + } + + return result; +} + + +template +void getIdentifierList(const std::map& elementMap, const TTest& testFunctor, CIdentifier** listID, size_t* size) +{ + *listID = new CIdentifier[elementMap.size()]; + + size_t index = 0; + for (auto it = elementMap.begin(); it != elementMap.end(); ++it) { if (testFunctor(it)) { (*listID)[index++] = it->first; } } + *size = index; +} + +void CScenario::getBoxIdentifierList(CIdentifier** listID, size_t* size) const +{ + getIdentifierList>(m_boxes, STestTrue(), listID, size); +} + +void CScenario::getCommentIdentifierList(CIdentifier** listID, size_t* size) const +{ + getIdentifierList>(m_comments, STestTrue(), listID, size); +} + +void CScenario::getMetadataIdentifierList(CIdentifier** listID, size_t* size) const +{ + getIdentifierList>(m_metadatas, STestTrue(), listID, size); +} + +void CScenario::getLinkIdentifierList(CIdentifier** listID, size_t* size) const +{ + getIdentifierList>(m_links, STestTrue(), listID, size); +} + +void CScenario::getLinkIdentifierFromBoxList(const CIdentifier& boxID, CIdentifier** listID, size_t* size) const +{ + getIdentifierList(m_links, STestEqSourceBox(boxID), listID, size); +} + +void CScenario::getLinkIdentifierFromBoxOutputList(const CIdentifier& boxID, const size_t index, CIdentifier** listID, size_t* size) const +{ + getIdentifierList(m_links, STestEqSourceBoxOutput(boxID, index), listID, size); +} + +void CScenario::getLinkIdentifierToBoxList(const CIdentifier& boxID, CIdentifier** listID, size_t* size) const +{ + getIdentifierList(m_links, STestEqTargetBox(boxID), listID, size); +} + +void CScenario::getLinkIdentifierToBoxInputList(const CIdentifier& boxID, const size_t index, CIdentifier** listID, size_t* size) const +{ + getIdentifierList(m_links, STestEqTargetBoxInput(boxID, index), listID, size); +} + +void CScenario::getOutdatedBoxIdentifierList(CIdentifier** listID, size_t* size) const +{ + getIdentifierList, STestTrue>>(m_outdatedBoxes, STestTrue>(), listID, size); +} + +void CScenario::releaseIdentifierList(CIdentifier* listID) const { delete[] listID; } + +bool CScenario::getSourceBoxOutputIndex(const CIdentifier& srcBoxID, const CIdentifier& srcBoxOutputID, size_t& srcBoxOutputIdx) +{ + const auto itSourceBox = m_boxes.find(srcBoxID); + OV_ERROR_UNLESS_KRF(itSourceBox != m_boxes.end(), "Source Box [" << srcBoxID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + m_boxes[srcBoxID]->getInterfacorIndex(Output, srcBoxOutputID, srcBoxOutputIdx); + return true; +} + +bool CScenario::getTargetBoxInputIndex(const CIdentifier& dstBoxID, const CIdentifier& dstBoxInputID, size_t& dstBoxInputIdx) +{ + const auto itTargetBox = m_boxes.find(dstBoxID); + OV_ERROR_UNLESS_KRF(itTargetBox != m_boxes.end(), "Target Box [" << dstBoxID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + m_boxes[dstBoxID]->getInterfacorIndex(Input, dstBoxInputID, dstBoxInputIdx); + return true; +} + +bool CScenario::getSourceBoxOutputIdentifier(const CIdentifier& srcBoxID, const size_t& srcBoxOutputIdx, CIdentifier& srcBoxOutputID) +{ + const auto itSourceBox = m_boxes.find(srcBoxID); + OV_ERROR_UNLESS_KRF(itSourceBox != m_boxes.end(), "Source Box [" << srcBoxID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + m_boxes[srcBoxID]->getInterfacorIdentifier(Output, srcBoxOutputIdx, srcBoxOutputID); + return true; +} + +bool CScenario::getTargetBoxInputIdentifier(const CIdentifier& dstBoxID, const size_t& dstBoxInputIdx, CIdentifier& dstBoxInputID) +{ + const auto itTargetBox = m_boxes.find(dstBoxID); + OV_ERROR_UNLESS_KRF(itTargetBox != m_boxes.end(), "Target Box [" << dstBoxID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + m_boxes[dstBoxID]->getInterfacorIdentifier(Input, dstBoxInputIdx, dstBoxInputID); + return true; +} +/** + * \brief Process to the update of the identified box. + * It consists in recreate the prototype of the box according to the updated reference box which is the box + * resulting of the add/pull requests to the kernel prototype. + * \param boxID the identifier of the box to be updated + * \return true when update has been done successfully + * \return false in case of failure + */ +bool CScenario::updateBox(const CIdentifier& boxID) +{ + // Check if box must be updated + const auto itSourceBox = m_boxes.find(boxID); + OV_ERROR_UNLESS_KRF(itSourceBox != m_boxes.end(), "Box [" << boxID.str() << "] is not part of the scenario", Kernel::ErrorType::ResourceNotFound); + + auto itUpdateBox = m_outdatedBoxes.find(boxID); + + if (itUpdateBox == m_outdatedBoxes.end()) + { + this->checkOutdatedBoxes(); + itUpdateBox = m_outdatedBoxes.find(boxID); + } + + OV_ERROR_UNLESS_KRF(itUpdateBox != m_outdatedBoxes.end(), "Box [" << boxID.str() << "] misses an updated version", Kernel::ErrorType::ResourceNotFound); + + + if (itUpdateBox->second->hasAttribute(OV_AttributeId_Box_FlagNeedsManualUpdate) + || itUpdateBox->second->hasAttribute(OV_AttributeId_Box_FlagCanAddInput) + || itUpdateBox->second->hasAttribute(OV_AttributeId_Box_FlagCanAddOutput) + || itUpdateBox->second->hasAttribute(OV_AttributeId_Box_FlagCanAddSetting) + || itUpdateBox->second->hasAttribute(OV_AttributeId_Box_FlagCanModifyInput) + || itUpdateBox->second->hasAttribute(OV_AttributeId_Box_FlagCanModifyOutput) + || itUpdateBox->second->hasAttribute(OV_AttributeId_Box_FlagCanModifySetting)) + { + OV_ERROR_KRF(m_boxes[boxID]->getName() << " must be manually updated. Its prototype is too complex.", Kernel::ErrorType::NotImplemented); + } + OV_ERROR_UNLESS_KRF(itUpdateBox != m_outdatedBoxes.end(), "Box [" << boxID.str() << "] does not have to be updated", Kernel::ErrorType::ResourceNotFound); + + // get all non-updatable attributes from the source box + std::map nonUpdatableAttributes; + { + CIdentifier attributeId = CIdentifier::undefined(); + while ((attributeId = itSourceBox->second->getNextAttributeIdentifier(attributeId)) != CIdentifier::undefined()) + { + const auto& updatableAttrs = CBoxUpdater::UPDATABLE_ATTRIBUTES; + if (std::find(updatableAttrs.cbegin(), updatableAttrs.cend(), attributeId) == updatableAttrs.cend()) + { + nonUpdatableAttributes[attributeId] = itSourceBox->second->getAttributeValue(attributeId); + } + } + } + + // gather links coming to and from the box + std::map>> links; + for (auto interfacorType : { Input, Output }) + { + links[interfacorType] = std::vector>(); + for (size_t index = 0; index < itUpdateBox->second->getInterfacorCountIncludingDeprecated(interfacorType); ++index) + { + CIdentifier* linkIdentifierList = nullptr; + size_t linkCount = 0; + if (interfacorType == Input) { this->getLinkIdentifierToBoxInputList(boxID, index, &linkIdentifierList, &linkCount); } + else if (interfacorType == Output) { this->getLinkIdentifierFromBoxOutputList(boxID, index, &linkIdentifierList, &linkCount); } + + for (size_t i = 0; i < linkCount; ++i) + { + auto link = std::make_shared(this->getKernelContext(), *this); + link->initializeFromExistingLink(*this->getLinkDetails(linkIdentifierList[i])); + if (this->getLinkDetails(linkIdentifierList[i])->hasAttribute(OV_AttributeId_Link_Invalid)) + { + link->addAttribute(OV_AttributeId_Link_Invalid, ""); + } + links[interfacorType].emplace_back(link); + } + + this->releaseIdentifierList(linkIdentifierList); + } + } + + OV_FATAL_UNLESS_K(this->removeBox(boxID), "Failed to remove redundant box", Kernel::ErrorType::Internal); + + CIdentifier updatedBoxIdentifier; + OV_FATAL_UNLESS_K(this->addBox(updatedBoxIdentifier, *(itUpdateBox->second.get()), boxID), "Failed to add box to the scenario", + Kernel::ErrorType::Internal); + OV_FATAL_UNLESS_K(updatedBoxIdentifier == boxID, "Updated box failed to initialize with same identifier", Kernel::ErrorType::Internal); + + auto updatedBox = this->getBoxDetails(boxID); + + for (const auto& attr : nonUpdatableAttributes) + { + if (attr.first == OV_AttributeId_Box_ToBeUpdated) { continue; } + if (updatedBox->hasAttribute(attr.first)) { updatedBox->setAttributeValue(attr.first, attr.second); } + else { updatedBox->addAttribute(attr.first, attr.second); } + } + + // Reconnect links + std::map> isInterfacorConnected; + isInterfacorConnected[Input] = std::set(); + isInterfacorConnected[Output] = std::set(); + for (auto& link : links[Input]) + { + CIdentifier newLinkIdentifier; + auto index = m_updatedBoxIOCorrespondence.at(Input).at(boxID).at(link->getTargetBoxInputIndex()); + this->connect(newLinkIdentifier, link->getSourceBoxIdentifier(), link->getSourceBoxOutputIndex(), boxID, index, link->getIdentifier()); + isInterfacorConnected[Input].insert(index); + if (link->hasAttribute(OV_AttributeId_Link_Invalid)) { this->getLinkDetails(newLinkIdentifier)->setAttributeValue(OV_AttributeId_Link_Invalid, ""); } + } + for (const auto& link : links[Output]) + { + CIdentifier newLinkIdentifier; + auto index = m_updatedBoxIOCorrespondence.at(Output).at(boxID).at(link->getSourceBoxOutputIndex()); + this->connect(newLinkIdentifier, boxID, index, link->getTargetBoxIdentifier(), link->getTargetBoxInputIndex(), link->getIdentifier()); + isInterfacorConnected[Output].insert(index); + if (link->hasAttribute(OV_AttributeId_Link_Invalid)) { this->getLinkDetails(newLinkIdentifier)->setAttributeValue(OV_AttributeId_Link_Invalid, ""); } + } + + // Cleanup the i/o that are redundant and disconnected + for (auto t : { Input, Output }) + { + size_t i = updatedBox->getInterfacorCountIncludingDeprecated(t); + while (i > 0) + { + --i; + bool isDeprecated; + updatedBox->getInterfacorDeprecatedStatus(t, i, isDeprecated); + if (isDeprecated && isInterfacorConnected.at(t).find(i) == isInterfacorConnected.at(t).end()) { updatedBox->removeInterfacor(t, i, true); } + } + } + + // Cleanup the settings that are redundant and have the same value as default + size_t settingIndex = updatedBox->getInterfacorCountIncludingDeprecated(Setting); + while (settingIndex > 0) + { + settingIndex--; + bool isDeprecated; + CString value; + CString defaultValue; + updatedBox->getInterfacorDeprecatedStatus(Setting, settingIndex, isDeprecated); + updatedBox->getSettingValue(settingIndex, value); + updatedBox->getSettingDefaultValue(settingIndex, defaultValue); + if (isDeprecated && value == defaultValue) { updatedBox->removeInterfacor(Setting, settingIndex, true); } + } + + + bool hasDeprecatedInterfacor = false; + for (auto t : { Setting, Input, Output }) + { + hasDeprecatedInterfacor |= (updatedBox->getInterfacorCount(t) != updatedBox->getInterfacorCountIncludingDeprecated(t)); + } + + if (hasDeprecatedInterfacor) + { + OV_WARNING_K(m_boxes[boxID]->getName() + << " box has not been fully updated. Deprecated Inputs, Outputs or Settings are pending.\n" + << " Please remove them before exporting scenario\n"); + this->getBoxDetails(boxID)->setAttributeValue(OV_AttributeId_Box_PendingDeprecatedInterfacors, ""); + } + else { this->getLogManager() << LogLevel_Info << m_boxes[boxID]->getName() << " box has been updated successfully\n"; } + + return true; +} + +bool CScenario::removeDeprecatedInterfacorsFromBox(const CIdentifier& boxID) +{ + // Check if box must be updated + IBox* box = getBoxDetails(boxID); + if (!box) { return false; } + + for (auto interfacorType : { Input, Output, Setting }) + { + const auto nInterfacor = box->getInterfacorCountIncludingDeprecated(interfacorType); + if (nInterfacor == 0) { continue; } + auto index = nInterfacor; + do + { + index--; + bool isDeprecated = false; + box->getInterfacorDeprecatedStatus(interfacorType, index, isDeprecated); + if (isDeprecated) { box->removeInterfacor(interfacorType, index); } + } while (index != 0); + } + + this->getLogManager() << LogLevel_Info << m_boxes[boxID]->getName() + << " Deprecated I/O and settings have been removed successfully\n"; + + box->removeAttribute(OV_AttributeId_Box_PendingDeprecatedInterfacors); + + return true; +} + +bool CScenario::containsBoxWithDeprecatedInterfacors() const +{ + for (const auto& box : m_boxes) + { + for (const auto interfacorType : { Input, Output, Setting }) + { + if (box.second->getInterfacorCountIncludingDeprecated(interfacorType) > box.second->getInterfacorCount(interfacorType)) { return true; } + } + } + return false; +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenario.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenario.h new file mode 100644 index 0000000..98ed6c0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenario.h @@ -0,0 +1,148 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +#include "ovkTBox.hpp" + +#include +#include +#include + +namespace OpenViBE { +namespace Kernel { +typedef TBox CBox; +class CComment; +class CMetadata; +class CLink; + +class CScenario final : public TBox +{ +public: + + CScenario(const IKernelContext& ctx, const CIdentifier& identifier); + ~CScenario() override { this->clear(); } + + bool clear() override; + bool merge(const IScenario& scenario, IScenarioMergeCallback* scenarioMergeCallback, bool mergeSettings, bool preserveIDs) override; + + CIdentifier getNextBoxIdentifier(const CIdentifier& previousID) const override; + bool isBox(const CIdentifier& boxID) const override; + const IBox* getBoxDetails(const CIdentifier& boxID) const override; + IBox* getBoxDetails(const CIdentifier& boxID) override; + bool addBox(CIdentifier& boxID, const CIdentifier& suggestedBoxID) override; + bool addBox(CIdentifier& boxID, const IBox& box, const CIdentifier& suggestedBoxID) override; + bool addBox(CIdentifier& boxID, const CIdentifier& boxAlgorithmID, const CIdentifier& suggestedBoxID) override; + bool addBox(CIdentifier& boxID, const Plugins::IBoxAlgorithmDesc& boxAlgorithmDesc, const CIdentifier& suggestedBoxID) override; + bool removeBox(const CIdentifier& boxID) override; + + CIdentifier getNextCommentIdentifier(const CIdentifier& previousID) const override; + bool isComment(const CIdentifier& commentID) const override; + const IComment* getCommentDetails(const CIdentifier& commentID) const override; + IComment* getCommentDetails(const CIdentifier& commentID) override; + bool addComment(CIdentifier& commentID, const CIdentifier& suggestedCommentID) override; + bool addComment(CIdentifier& commentID, const IComment& comment, const CIdentifier& suggestedCommentID) override; + bool removeComment(const CIdentifier& commentID) override; + + CIdentifier getNextMetadataIdentifier(const CIdentifier& previousID) const override; + bool isMetadata(const CIdentifier& metadataID) const override; + const IMetadata* getMetadataDetails(const CIdentifier& metadataID) const override; + IMetadata* getMetadataDetails(const CIdentifier& metadataID) override; + bool addMetadata(CIdentifier& metadataID, const CIdentifier& suggestedMetadataID) override; + bool removeMetadata(const CIdentifier& metadataID) override; + + CIdentifier getNextLinkIdentifier(const CIdentifier& previousID) const override; + + CIdentifier getNextLinkIdentifierFromBox(const CIdentifier& previousID, const CIdentifier& boxID) const override; + CIdentifier getNextLinkIdentifierFromBoxOutput(const CIdentifier& previousID, const CIdentifier& boxID, size_t index) const override; + CIdentifier getNextLinkIdentifierToBox(const CIdentifier& previousID, const CIdentifier& boxID) const override; + CIdentifier getNextLinkIdentifierToBoxInput(const CIdentifier& previousID, const CIdentifier& boxID, size_t index) const override; + bool isLink(const CIdentifier& boxID) const override; + + bool setHasIO(bool hasIO) override; + bool hasIO() const override; + bool setScenarioInputLink(size_t scenarioInputIdx, const CIdentifier& boxID, size_t boxInputIdx) override; + bool setScenarioInputLink(size_t scenarioInputIdx, const CIdentifier& boxID, const CIdentifier& boxInputID) override; + bool setScenarioOutputLink(size_t scenarioOutputIdx, const CIdentifier& boxID, size_t boxOutputIdx) override; + bool setScenarioOutputLink(size_t scenarioOutputIdx, const CIdentifier& boxID, const CIdentifier& boxOutputID) override; + bool getScenarioInputLink(size_t scenarioInputIdx, CIdentifier& boxID, size_t& boxInputIdx) const override; + bool getScenarioInputLink(size_t scenarioInputIdx, CIdentifier& boxID, CIdentifier& boxOutputID) const override; + bool getScenarioOutputLink(size_t scenarioOutputIdx, CIdentifier& boxID, size_t& boxOutputIdx) const override; + bool getScenarioOutputLink(size_t scenarioOutputIdx, CIdentifier& boxID, CIdentifier& boxOutputID) const override; + bool removeScenarioInputLink(size_t scenarioInputIdx, const CIdentifier& boxID, size_t boxInputIdx) override; + bool removeScenarioOutputLink(size_t scenarioOutputIdx, const CIdentifier& boxID, size_t boxOutputIdx) override; + + bool removeScenarioInput(size_t index) override; + bool removeScenarioOutput(size_t index) override; + + const ILink* getLinkDetails(const CIdentifier& linkID) const override; + ILink* getLinkDetails(const CIdentifier& linkID) override; + + bool connect(CIdentifier& linkID, const CIdentifier& srcBoxID, const size_t srcBoxOutputIdx, const CIdentifier& dstBoxID, + const size_t dstBoxInputIdx, const CIdentifier& suggestedLinkID) override; + bool connect(CIdentifier& linkID, const CIdentifier& srcBoxID, const CIdentifier& srcBoxOutputID, const CIdentifier& dstBoxID, + const CIdentifier& dstBoxInputID, const CIdentifier& suggestedLinkID) override; + bool disconnect(const CIdentifier& srcBoxID, size_t srcBoxOutputIdx, const CIdentifier& dstBoxID, size_t dstBoxInputIdx) override; + bool disconnect(const CIdentifier& srcBoxID, const CIdentifier& srcBoxOutputID, const CIdentifier& dstBoxID, const CIdentifier& dstBoxInputID) override; + bool disconnect(const CIdentifier& linkID) override; + + bool getSourceBoxOutputIndex(const CIdentifier& srcBoxID, const CIdentifier& srcBoxOutputID, size_t& srcBoxOutputIdx) override; + bool getTargetBoxInputIndex(const CIdentifier& dstBoxID, const CIdentifier& dstBoxInputID, size_t& dstBoxInputIdx) override; + bool getSourceBoxOutputIdentifier(const CIdentifier& srcBoxID, const size_t& srcBoxOutputIdx, CIdentifier& srcBoxOutputID) override; + bool getTargetBoxInputIdentifier(const CIdentifier& dstBoxID, const size_t& dstBoxInputIdx, CIdentifier& dstBoxInputID) override; + + bool applyLocalSettings() override; + bool checkSettings(IConfigurationManager* configurationManager) override; + + bool isBoxOutdated(const CIdentifier& boxId); + bool checkOutdatedBoxes() override; + bool hasOutdatedBox() override; + + CIdentifier getNextOutdatedBoxIdentifier(const CIdentifier& previousID) const override; + + bool isMetabox() override; + + void getBoxIdentifierList(CIdentifier** listID, size_t* size) const override; + void getCommentIdentifierList(CIdentifier** listID, size_t* size) const override; + void getMetadataIdentifierList(CIdentifier** listID, size_t* size) const override; + void getLinkIdentifierList(CIdentifier** listID, size_t* size) const override; + void getLinkIdentifierFromBoxList(const CIdentifier& boxID, CIdentifier** listID, size_t* size) const override; + void getLinkIdentifierFromBoxOutputList(const CIdentifier& boxID, size_t index, CIdentifier** listID, size_t* size) const override; + void getLinkIdentifierToBoxList(const CIdentifier& boxID, CIdentifier** listID, size_t* size) const override; + void getLinkIdentifierToBoxInputList(const CIdentifier& boxID, size_t index, CIdentifier** listID, size_t* size) const override; + void getOutdatedBoxIdentifierList(CIdentifier** listID, size_t* size) const override; + void releaseIdentifierList(CIdentifier* listID) const override; + + + bool acceptVisitor(IObjectVisitor& objectVisitor) override; + + bool updateBox(const CIdentifier& boxID) override; + + bool containsBoxWithDeprecatedInterfacors() const override; + + bool removeDeprecatedInterfacorsFromBox(const CIdentifier& boxID) override; + + _IsDerivedFromClass_Final_(TBox, OVK_ClassId_Kernel_Scenario_Scenario) + +private: + CIdentifier getUnusedIdentifier(const CIdentifier& suggestedID) const; + + std::map m_boxes; + std::map m_comments; + std::map m_metadatas; + std::map m_links; + std::map> m_outdatedBoxes; + std::map>> m_updatedBoxIOCorrespondence; + + + bool m_hasIO = false; + + mutable std::vector> m_scenarioInputLinks; + mutable std::vector> m_scenarioOutputLinks; + + // Helper members. These are used for quick lookup of next identifiers for the purpose + // of the getNextMetadataIdentifier function. + std::map m_nextMetadataID; + CIdentifier m_firstMetadataID = CIdentifier::undefined(); +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenarioManager.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenarioManager.cpp new file mode 100755 index 0000000..f09d342 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenarioManager.cpp @@ -0,0 +1,585 @@ +#include "ovkCScenarioManager.h" +#include "ovkCScenario.h" + +#include +#include +#include +#include +#include +#include "../../tools/ovkSBoxProto.h" + +namespace OpenViBE { +namespace Kernel { + +CScenarioManager::CScenarioManager(const IKernelContext& ctx) : TKernelObject(ctx) {} + +CScenarioManager::~CScenarioManager() { for (auto i = m_scenarios.begin(); i != m_scenarios.end(); ++i) { delete i->second; } } + +void CScenarioManager::cloneScenarioImportersAndExporters(const IScenarioManager& scenarioManager) +{ + CIdentifier importContextId = CIdentifier::undefined(); + // Copy the registered importers from the parent Scenario Manager + while ((importContextId = scenarioManager.getNextScenarioImportContext(importContextId)) != CIdentifier::undefined()) + { + CString fileNameExtension = ""; + while ((fileNameExtension = scenarioManager.getNextScenarioImporter(importContextId, fileNameExtension)) != CString("")) + { + CIdentifier algorithmId = scenarioManager.getScenarioImporterAlgorithmIdentifier(importContextId, fileNameExtension); + + this->registerScenarioImporter(importContextId, fileNameExtension, algorithmId); + } + } + + CIdentifier exportContextId = CIdentifier::undefined(); + while ((exportContextId = scenarioManager.getNextScenarioExportContext(exportContextId)) != CIdentifier::undefined()) + { + CString fileNameExtension = ""; + while ((fileNameExtension = scenarioManager.getNextScenarioExporter(exportContextId, fileNameExtension)) != CString("")) + { + CIdentifier algorithmId = scenarioManager.getScenarioExporterAlgorithmIdentifier(exportContextId, fileNameExtension); + + this->registerScenarioExporter(exportContextId, fileNameExtension, algorithmId); + } + } +} + +CIdentifier CScenarioManager::getNextScenarioIdentifier(const CIdentifier& previousID) const +{ + std::map::const_iterator itScenario; + + if (previousID == CIdentifier::undefined()) { itScenario = m_scenarios.begin(); } + else + { + itScenario = m_scenarios.find(previousID); + if (itScenario == m_scenarios.end()) { return CIdentifier::undefined(); } + ++itScenario; + } + + return itScenario != m_scenarios.end() ? itScenario->first : CIdentifier::undefined(); +} + +bool CScenarioManager::isScenario(const CIdentifier& scenarioID) const { return m_scenarios.find(scenarioID) != m_scenarios.end(); } + +bool CScenarioManager::createScenario(CIdentifier& scenarioID) +{ + //create scenario object + scenarioID = getUnusedIdentifier(); + CScenario* scenario = new CScenario(getKernelContext(), scenarioID); + m_scenarios[scenarioID] = scenario; + + return true; +} + +bool CScenarioManager::importScenario(CIdentifier& scenarioID, const IMemoryBuffer& iMemoryBuffer, const CIdentifier& scenarioImporterAlgorithmID) +{ + scenarioID = CIdentifier::undefined(); + + OV_ERROR_UNLESS_KRF(this->createScenario(scenarioID), "Error creating new scenario", Kernel::ErrorType::BadResourceCreation); + + const auto releaseScenario = [&]() + { + // use a fatal here because a release failure while creation succeeded + // means we are in an unexpected state + OV_FATAL_UNLESS_K(this->releaseScenario(scenarioID), "Releasing just created scenario failed for " << scenarioID.str(), + ErrorType::Internal); + scenarioID = CIdentifier::undefined(); + }; + + IScenario& newScenarioInstance = this->getScenario(scenarioID); + + if (!iMemoryBuffer.getSize()) + { + releaseScenario(); + OV_ERROR_KRF("Buffer containing scenario data is empty", Kernel::ErrorType::BadValue); + } + + CIdentifier importerInstanceIdentifier = this->getKernelContext().getAlgorithmManager().createAlgorithm(scenarioImporterAlgorithmID); + + if (importerInstanceIdentifier == CIdentifier::undefined()) + { + releaseScenario(); + OV_ERROR_KRF("Can not create the requested scenario importer", Kernel::ErrorType::BadResourceCreation); + } + + IAlgorithmProxy* importer = &this->getKernelContext().getAlgorithmManager().getAlgorithm(importerInstanceIdentifier); + + OV_FATAL_UNLESS_K( + importer, + "Importer with id " << importerInstanceIdentifier.str() << " not found although it has just been created", + ErrorType::ResourceNotFound); + + const auto releaseAlgorithm = [&]() + { + // use a fatal here because a release failure while creation succeeded + // means we are in an unexpected state + OV_FATAL_UNLESS_K( + this->getKernelContext().getAlgorithmManager().releaseAlgorithm(*importer), + "Releasing just created algorithm failed for " << importerInstanceIdentifier.str(), + ErrorType::Internal); + }; + + if (!importer->initialize()) + { + releaseScenario(); + releaseAlgorithm(); + OV_ERROR_KRF("Can not initialize the requested scenario importer", Kernel::ErrorType::Internal); + } + + IParameter* memoryBufferParameter = importer->getInputParameter(OV_Algorithm_ScenarioImporter_InputParameterId_MemoryBuffer); + IParameter* scenarioParameter = importer->getOutputParameter(OV_Algorithm_ScenarioImporter_OutputParameterId_Scenario); + + if (!(memoryBufferParameter && scenarioParameter)) + { + releaseScenario(); + releaseAlgorithm(); + + OV_ERROR_UNLESS_KRF( + memoryBufferParameter, + "The requested importer does not have a MemoryBuffer input parameter with scenarioID " << + OV_Algorithm_ScenarioImporter_InputParameterId_MemoryBuffer, + ErrorType::BadInput); + + OV_ERROR_UNLESS_KRF( + scenarioParameter, + "The requested importer does not have a Scenario output parameter with scenarioID " << OV_Algorithm_ScenarioImporter_OutputParameterId_Scenario, + ErrorType::BadOutput); + } + + + TParameterHandler memoryBufferParameterHandler(memoryBufferParameter); + TParameterHandler scenarioParameterHandler(scenarioParameter); + + memoryBufferParameterHandler = &iMemoryBuffer; + scenarioParameterHandler = &newScenarioInstance; + + if (!importer->process()) + { + releaseScenario(); + releaseAlgorithm(); + OV_ERROR_KRF("Can not process data using the requested scenario importer", Kernel::ErrorType::Internal); + } + + if (!importer->uninitialize()) + { + releaseScenario(); + releaseAlgorithm(); + OV_ERROR_KRF("Can not uninitialize the requested scenario importer", Kernel::ErrorType::Internal); + } + + releaseAlgorithm(); + + return true; +} + +bool CScenarioManager::importScenarioFromFile(CIdentifier& scenarioID, const CString& fileName, const CIdentifier& scenarioImporterAlgorithmID) +{ + scenarioID = CIdentifier::undefined(); + + CMemoryBuffer memoryBuffer; + + FILE* inputFile = FS::Files::open(fileName, "rb"); + + OV_ERROR_UNLESS_KRF( + inputFile, + "Can not open scenario file '" << fileName << "'", + ErrorType::BadFileRead); + + fseek(inputFile, 0, SEEK_END); + memoryBuffer.setSize(size_t(ftell(inputFile)), true); + fseek(inputFile, 0, SEEK_SET); + + if (fread(reinterpret_cast(memoryBuffer.getDirectPointer()), size_t(memoryBuffer.getSize()), 1, inputFile) != 1) + { + fclose(inputFile); + OV_ERROR_KRF("Problem reading scenario file '" << fileName << "'", Kernel::ErrorType::BadFileRead); + } + fclose(inputFile); + + return this->importScenario(scenarioID, memoryBuffer, scenarioImporterAlgorithmID); +} + +bool CScenarioManager::importScenarioFromFile(CIdentifier& scenarioID, const CIdentifier& importContext, const CString& fileName) +{ + OV_ERROR_UNLESS_KRF(m_importers.count(importContext), + "The import context " << importContext.str() << " has no associated importers", + ErrorType::Internal); + std::vector fileNameExtension; + fileNameExtension.resize(fileName.length() + 1); + FS::Files::getFilenameExtension(fileName.toASCIIString(), &fileNameExtension[0]); + OV_ERROR_UNLESS_KRF(m_importers[importContext].count(&fileNameExtension[0]), + "The import context " << importContext.str() << " has no associated importers for extension [" << &fileNameExtension[0] << "]", + ErrorType::Internal); + return this->importScenarioFromFile(scenarioID, fileName, m_importers[importContext][&fileNameExtension[0]]); +} + +bool CScenarioManager::registerScenarioImporter(const CIdentifier& importContext, const CString& fileNameExtension, + const CIdentifier& scenarioImporterAlgorithmIdentifier) +{ + if (!m_importers.count(importContext)) { m_importers[importContext] = std::map(); } + + OV_ERROR_UNLESS_KRF(!m_importers[importContext].count(fileNameExtension.toASCIIString()), + "The file name extension [" << fileNameExtension << "] already has an importer registered for context " << importContext.str(), + ErrorType::Internal); + + m_importers[importContext][fileNameExtension.toASCIIString()] = scenarioImporterAlgorithmIdentifier; + + return true; +} + +bool CScenarioManager::unregisterScenarioImporter(const CIdentifier& importContext, const CString& fileNameExtension) +{ + OV_ERROR_UNLESS_KRF(m_importers.count(importContext), + "The import context " << importContext.str() << " has no associated importers", + ErrorType::Internal); + OV_ERROR_UNLESS_KRF(m_importers[importContext].count(fileNameExtension.toASCIIString()), + "The import context " << importContext.str() << " has no associated importers for extension [" << fileNameExtension << "]", + ErrorType::Internal); + + auto& contextImporters = m_importers[importContext]; + + for (auto it = contextImporters.begin(); it != contextImporters.end();) + { + if (it->first == fileNameExtension.toASCIIString()) { it = contextImporters.erase(it); } + else { ++it; } + } + for (auto it = m_importers.begin(); it != m_importers.end();) + { + if (it->second.empty()) { it = m_importers.erase(it); } + else { ++it; } + } + return true; +} + +CIdentifier CScenarioManager::getNextScenarioImportContext(const CIdentifier& importContext) const +{ + if (m_importers.empty()) { return CIdentifier::undefined(); } + + if (importContext == CIdentifier::undefined()) { return m_importers.cbegin()->first; } + + auto current = m_importers.find(importContext); + if (current == m_importers.end() || ++current == m_importers.end()) { return CIdentifier::undefined(); } + + return current->first; +} + +CString CScenarioManager::getNextScenarioImporter(const CIdentifier& importContext, const CString& fileNameExtension) const +{ + if (m_importers.empty() || !m_importers.count(importContext)) { return ""; } + + const auto& scenarioImportContextMap = m_importers.at(importContext); + + if (fileNameExtension == CString("")) { return scenarioImportContextMap.cbegin()->first.c_str(); } + + auto current = scenarioImportContextMap.find(fileNameExtension.toASCIIString()); + if (current == scenarioImportContextMap.end() || ++current == scenarioImportContextMap.end()) { return ""; } + + return current->first.c_str(); +} + +CIdentifier CScenarioManager::getScenarioImporterAlgorithmIdentifier(const CIdentifier& importContext, const CString& fileNameExtension) const +{ + OV_ERROR_UNLESS_KRU( + !m_importers.empty() && m_importers.count(importContext) && m_importers.at(importContext).count(fileNameExtension.toASCIIString( + )), + "Scenario importer not found", + ErrorType::OutOfBound); + + return m_importers.at(importContext).at(fileNameExtension.toASCIIString()); +} + +bool CScenarioManager::exportScenario(IMemoryBuffer& oMemoryBuffer, const CIdentifier& scenarioID, + const CIdentifier& scenarioExporterAlgorithmID) const +{ + OV_ERROR_UNLESS_KRF( + m_scenarios.find(scenarioID) != m_scenarios.end(), + "Scenario with identifier " << scenarioID.str() << " does not exist.", + ErrorType::ResourceNotFound); + + // If the scenario is a metabox, we will save its prototype hash into an attribute of the scenario + // that way the standalone scheduler can check whether metaboxes included inside need updating. + IScenario& scenario = this->getScenario(scenarioID); + + + if (scenario.isMetabox()) + { + SBoxProto metaboxProto(getKernelContext().getTypeManager()); + + for (size_t scenarioInputIdx = 0; scenarioInputIdx < scenario.getInputCount(); ++scenarioInputIdx) + { + CIdentifier id; + CString name; + CIdentifier typeID; + + scenario.getInterfacorIdentifier(Input, scenarioInputIdx, id); + scenario.getInputType(scenarioInputIdx, typeID); + scenario.getInputName(scenarioInputIdx, name); + + metaboxProto.addInput(name, typeID, id, true); + } + + for (size_t scenarioOutputIdx = 0; scenarioOutputIdx < scenario.getOutputCount(); ++scenarioOutputIdx) + { + CIdentifier id; + CString name; + CIdentifier typeID; + + scenario.getInterfacorIdentifier(Output, scenarioOutputIdx, id); + scenario.getOutputType(scenarioOutputIdx, typeID); + scenario.getOutputName(scenarioOutputIdx, name); + + metaboxProto.addOutput(name, typeID, id, true); + } + + for (size_t scenarioSettingIdx = 0; scenarioSettingIdx < scenario.getSettingCount(); ++scenarioSettingIdx) + { + CString name; + CIdentifier typeID; + CString defaultValue; + CIdentifier id; + + scenario.getSettingName(scenarioSettingIdx, name); + scenario.getSettingType(scenarioSettingIdx, typeID); + scenario.getSettingDefaultValue(scenarioSettingIdx, defaultValue); + scenario.getInterfacorIdentifier(Setting, scenarioSettingIdx, id); + + metaboxProto.addSetting(name, typeID, defaultValue, false, id, true); + } + + if (scenario.hasAttribute(OV_AttributeId_Scenario_MetaboxHash)) + { + scenario.setAttributeValue(OV_AttributeId_Scenario_MetaboxHash, metaboxProto.m_hash.toString()); + } + else { scenario.addAttribute(OV_AttributeId_Scenario_MetaboxHash, metaboxProto.m_hash.toString()); } + } + + CIdentifier exporterInstanceIdentifier = this->getKernelContext().getAlgorithmManager().createAlgorithm(scenarioExporterAlgorithmID); + + OV_ERROR_UNLESS_KRF( + exporterInstanceIdentifier != CIdentifier::undefined(), + "Can not create the requested scenario exporter", + ErrorType::BadResourceCreation); + + IAlgorithmProxy* exporter = &this->getKernelContext().getAlgorithmManager().getAlgorithm(exporterInstanceIdentifier); + + OV_FATAL_UNLESS_K( + exporter, + "Exporter with id " << exporterInstanceIdentifier.str() << " not found although it has just been created", + ErrorType::ResourceNotFound); + + const auto releaseAlgorithm = [&]() + { + // use a fatal here because a release failure while creation succeeded + // means we are in an unexpected state + OV_FATAL_UNLESS_K( + this->getKernelContext().getAlgorithmManager().releaseAlgorithm(*exporter), + "Releasing just created algorithm failed for " << exporterInstanceIdentifier.str(), + ErrorType::Internal); + }; + + if (!exporter->initialize()) + { + releaseAlgorithm(); + OV_ERROR_KRF("Can not initialize the requested scenario exporter", Kernel::ErrorType::Internal); + } + + IParameter* scenarioParameter = exporter->getInputParameter(OV_Algorithm_ScenarioExporter_InputParameterId_Scenario); + IParameter* memoryBufferParameter = exporter->getOutputParameter(OV_Algorithm_ScenarioExporter_OutputParameterId_MemoryBuffer); + + if (!(memoryBufferParameter && scenarioParameter)) + { + releaseAlgorithm(); + + OV_ERROR_UNLESS_KRF( + scenarioParameter, + "The requested exporter does not have a Scenario input parameter with identifier " << OV_Algorithm_ScenarioExporter_InputParameterId_Scenario, + ErrorType::BadInput); + + OV_ERROR_UNLESS_KRF( + memoryBufferParameter, + "The requested exporter does not have a MemoryBuffer output parameter with identifier " << + OV_Algorithm_ScenarioExporter_OutputParameterId_MemoryBuffer, + ErrorType::BadOutput); + } + + TParameterHandler scenarioParameterHandler(scenarioParameter); + TParameterHandler memoryBufferParameterHandler(memoryBufferParameter); + + scenarioParameterHandler = &scenario; + memoryBufferParameterHandler = &oMemoryBuffer; + + if (!exporter->process()) + { + releaseAlgorithm(); + OV_ERROR_KRF("Can not process data using the requested scenario exporter", Kernel::ErrorType::Internal); + } + + if (!exporter->uninitialize()) + { + releaseAlgorithm(); + OV_ERROR_KRF("Can not uninitialize the requested scenario exporter", Kernel::ErrorType::Internal); + } + + releaseAlgorithm(); + return true; +} + +bool CScenarioManager::exportScenarioToFile(const CString& fileName, const CIdentifier& scenarioID, + const CIdentifier& scenarioExporterAlgorithmID) const +{ + IScenario& scenario = this->getScenario(scenarioID); + if (scenario.containsBoxWithDeprecatedInterfacors()) + { + OV_WARNING_K( + "Cannot export a scenario with pending deprecated I/O or Settings. Please remove them using the Designer." + ); + return false; + } + + CMemoryBuffer memoryBuffer; + this->exportScenario(memoryBuffer, scenarioID, scenarioExporterAlgorithmID); + + std::ofstream outputFileStream; + FS::Files::openOFStream(outputFileStream, fileName, std::ios::binary); + + OV_ERROR_UNLESS_KRF( + outputFileStream.good(), + "Failed to open file " << fileName, + ErrorType::BadFileRead); + + outputFileStream.write(reinterpret_cast(memoryBuffer.getDirectPointer()), long(memoryBuffer.getSize())); + outputFileStream.close(); + + return true; +} + +bool CScenarioManager::exportScenarioToFile(const CIdentifier& exportContext, const CString& fileName, const CIdentifier& scenarioID) +{ + OV_ERROR_UNLESS_KRF(m_exporters.count(exportContext), + "The export context " << exportContext.str() << " has no associated exporters", + ErrorType::Internal); + std::vector fileNameExtension; + fileNameExtension.resize(fileName.length() + 1); + FS::Files::getFilenameExtension(fileName.toASCIIString(), &fileNameExtension[0]); + OV_ERROR_UNLESS_KRF(m_exporters[exportContext].count(&fileNameExtension[0]), + "The export context " << exportContext.str() << " has no associated exporters for extension [" << &fileNameExtension[0] << "]", + ErrorType::Internal); + return this->exportScenarioToFile(fileName, scenarioID, m_exporters[exportContext][&fileNameExtension[0]]); +} + +bool CScenarioManager::registerScenarioExporter(const CIdentifier& exportContext, const CString& fileNameExtension, + const CIdentifier& scenarioExporterAlgorithmIdentifier) +{ + if (!m_exporters.count(exportContext)) { m_exporters[exportContext] = std::map(); } + + OV_ERROR_UNLESS_KRF(!m_exporters[exportContext].count(fileNameExtension.toASCIIString()), + "The file name extension [" << fileNameExtension << "] already has an exporter registered for context " << exportContext.str(), + ErrorType::Internal); + + m_exporters[exportContext][fileNameExtension.toASCIIString()] = scenarioExporterAlgorithmIdentifier; + + return true; +} + +bool CScenarioManager::unregisterScenarioExporter(const CIdentifier& exportContext, const CString& fileNameExtension) +{ + OV_ERROR_UNLESS_KRF(m_exporters.count(exportContext), + "The export context " << exportContext.str() << " has no associated exporters", + ErrorType::Internal); + OV_ERROR_UNLESS_KRF(m_exporters[exportContext].count(fileNameExtension.toASCIIString()), + "The export context " << exportContext.str() << " has no associated exporters for extension [" << fileNameExtension << "]", + ErrorType::Internal); + + auto& contextExporters = m_exporters[exportContext]; + + for (auto it = contextExporters.begin(); it != contextExporters.end();) + { + if (it->first.c_str() == fileNameExtension.toASCIIString()) { it = contextExporters.erase(it); } + else { ++it; } + } + for (auto it = m_exporters.begin(); it != m_exporters.end();) + { + if (it->second.empty()) { it = m_exporters.erase(it); } + else { ++it; } + } + return true; +} + +CIdentifier CScenarioManager::getNextScenarioExportContext(const CIdentifier& exportContext) const +{ + if (m_exporters.empty()) { return CIdentifier::undefined(); } + + if (exportContext == CIdentifier::undefined()) { return m_exporters.cbegin()->first; } + + auto current = m_exporters.find(exportContext); + if (current == m_exporters.end() || ++current == m_exporters.end()) { return CIdentifier::undefined(); } + + return current->first; +} + +CString CScenarioManager::getNextScenarioExporter(const CIdentifier& exportContext, const CString& fileNameExtension) const +{ + if (m_exporters.empty() || !m_exporters.count(exportContext)) { return ""; } + + const auto& scenarioExportContextMap = m_exporters.at(exportContext); + + if (fileNameExtension == CString("")) { return scenarioExportContextMap.cbegin()->first.c_str(); } + + auto current = scenarioExportContextMap.find(fileNameExtension.toASCIIString()); + if (current == scenarioExportContextMap.end() || ++current == scenarioExportContextMap.end()) { return ""; } + + return current->first.c_str(); +} + +CIdentifier CScenarioManager::getScenarioExporterAlgorithmIdentifier(const CIdentifier& exportContext, const CString& fileNameExtension) const +{ + OV_ERROR_UNLESS_KRU(!m_exporters.empty() && m_exporters.count(exportContext) && m_exporters.at(exportContext).count(fileNameExtension.toASCIIString()), + "Scenario importer not found", Kernel::ErrorType::OutOfBound); + + return m_exporters.at(exportContext).at(fileNameExtension.toASCIIString()); +} + +bool CScenarioManager::releaseScenario(const CIdentifier& scenarioID) +{ + const auto it = m_scenarios.find(scenarioID); + if (it == m_scenarios.end()) + { + // error is handled on a higher level + return false; + } + + CScenario* scenario = it->second; + delete scenario; + m_scenarios.erase(it); + + return true; +} + +IScenario& CScenarioManager::getScenario(const CIdentifier& scenarioID) +{ + const auto itScenario = m_scenarios.find(scenarioID); + + // If the call is wrongly handled, and falls in this condition then next instruction causes a crash... + // At least, here the abortion is handled! + OV_FATAL_UNLESS_K(itScenario != m_scenarios.end(), "Scenario " << scenarioID.str() << " does not exist !", Kernel::ErrorType::ResourceNotFound); + + return *itScenario->second; +} + +IScenario& CScenarioManager::getScenario(const CIdentifier& scenarioID) const { return const_cast(this)->getScenario(scenarioID); } + +CIdentifier CScenarioManager::getUnusedIdentifier() const +{ + uint64_t id = (uint64_t(rand()) << 32) + uint64_t(rand()); + CIdentifier res; + std::map::const_iterator i; + do + { + id++; + res = CIdentifier(id); + i = m_scenarios.find(res); + } while (i != m_scenarios.end() || res == CIdentifier::undefined()); + return res; +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenarioManager.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenarioManager.h new file mode 100644 index 0000000..63ff24c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenarioManager.h @@ -0,0 +1,58 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +#include + +namespace OpenViBE { +namespace Kernel { +class CScenario; + +class CScenarioManager final : public TKernelObject +{ +public: + + explicit CScenarioManager(const IKernelContext& ctx); + ~CScenarioManager() override; + void cloneScenarioImportersAndExporters(const IScenarioManager& scenarioManager) override; + CIdentifier getNextScenarioIdentifier(const CIdentifier& previousID) const override; + bool isScenario(const CIdentifier& scenarioID) const override; + bool createScenario(CIdentifier& scenarioID) override; + bool importScenario(CIdentifier& scenarioID, const IMemoryBuffer& iMemoryBuffer, const CIdentifier& scenarioImporterAlgorithmID) override; + bool importScenarioFromFile(CIdentifier& scenarioID, const CString& fileName, const CIdentifier& scenarioImporterAlgorithmID) override; + bool importScenarioFromFile(CIdentifier& scenarioID, const CIdentifier& importContext, const CString& fileName) override; + bool registerScenarioImporter(const CIdentifier& importContext, const CString& fileNameExtension, + const CIdentifier& scenarioImporterAlgorithmIdentifier) override; + bool unregisterScenarioImporter(const CIdentifier& importContext, const CString& fileNameExtension) override; + CIdentifier getNextScenarioImportContext(const CIdentifier& importContext) const override; + CString getNextScenarioImporter(const CIdentifier& importContext, const CString& fileNameExtension) const override; + CIdentifier getScenarioImporterAlgorithmIdentifier(const CIdentifier& importContext, const CString& fileNameExtension) const override; + bool exportScenario(IMemoryBuffer& oMemoryBuffer, const CIdentifier& scenarioID, const CIdentifier& scenarioExporterAlgorithmID) const override; + bool exportScenarioToFile(const CString& fileName, const CIdentifier& scenarioID, const CIdentifier& scenarioExporterAlgorithmID) const override; + bool exportScenarioToFile(const CIdentifier& exportContext, const CString& fileName, const CIdentifier& scenarioID) override; + bool registerScenarioExporter(const CIdentifier& exportContext, const CString& fileNameExtension, + const CIdentifier& scenarioExporterAlgorithmIdentifier) override; + bool unregisterScenarioExporter(const CIdentifier& exportContext, const CString& fileNameExtension) override; + CIdentifier getNextScenarioExportContext(const CIdentifier& exportContext) const override; + CString getNextScenarioExporter(const CIdentifier& exportContext, const CString& fileNameExtension) const override; + CIdentifier getScenarioExporterAlgorithmIdentifier(const CIdentifier& exportContext, const CString& fileNameExtension) const override; + bool releaseScenario(const CIdentifier& scenarioID) override; + IScenario& getScenario(const CIdentifier& scenarioID) override; + + _IsDerivedFromClass_Final_(TKernelObject, OVK_ClassId_Kernel_Scenario_ScenarioManager) + +protected: + + CIdentifier getUnusedIdentifier() const; + + std::map m_scenarios; +private: + /// Scenario Import Context -> File Name Extension -> Scenario Importer Identifier + std::map> m_importers; + /// Scenario Export Context -> File Name Extension -> Scenario Exporter Identifier + std::map> m_exporters; + + IScenario& getScenario(const CIdentifier& scenarioID) const; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenarioSettingKeywordParserCallback.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenarioSettingKeywordParserCallback.cpp new file mode 100644 index 0000000..7257be4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenarioSettingKeywordParserCallback.cpp @@ -0,0 +1,36 @@ +#include "ovkCScenarioSettingKeywordParserCallback.h" +#include + +#include + +namespace OpenViBE { +namespace Kernel { + +bool CScenarioSettingKeywordParserCallback::expand(const CString& rStringToExpand, CString& rExpandedString) const +{ + // In the case there is no value present we return an empty string + rExpandedString = ""; + + // Expand the scenario directory + if (rStringToExpand == CString("ScenarioDirectory")) + { + if (m_rScenario.hasAttribute(OV_AttributeId_ScenarioFilename)) + { + const std::string filename = m_rScenario.getAttributeValue(OV_AttributeId_ScenarioFilename).toASCIIString(); + const size_t iDir = filename.rfind('/'); + if (iDir != std::string::npos) { rExpandedString = CString(filename.substr(0, iDir).c_str()); } + } + return true; + } + // Expand settings from the scenario + if (m_rScenario.hasSettingWithName(rStringToExpand)) + { + m_rScenario.getSettingValue(rStringToExpand, rExpandedString); + return true; + } + + return false; +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenarioSettingKeywordParserCallback.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenarioSettingKeywordParserCallback.h new file mode 100644 index 0000000..0fde996 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkCScenarioSettingKeywordParserCallback.h @@ -0,0 +1,20 @@ +#pragma once + +#include + +namespace OpenViBE { +namespace Kernel { +class CScenarioSettingKeywordParserCallback final : public IConfigurationKeywordExpandCallback +{ +public: + explicit CScenarioSettingKeywordParserCallback(const IScenario& scenario) + : m_rScenario(scenario) {} + + ~CScenarioSettingKeywordParserCallback() override {} + bool expand(const CString& rStringToExpand, CString& rExpandedString) const override; + +private: + const IScenario& m_rScenario; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkTAttributable.h b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkTAttributable.h new file mode 100644 index 0000000..392f17a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkTAttributable.h @@ -0,0 +1,77 @@ +#pragma once + +#include "../../ovk_tools.h" + +#include + +#include + +namespace OpenViBE { +namespace Kernel { +template +class TAttributable : public T +{ +public: + + explicit TAttributable(const IKernelContext& ctx) : T(ctx) { } + + bool addAttribute(const CIdentifier& attributeID, const CString& sAttributeValue) override + { + const auto itAttribute = m_attributes.find(attributeID); + if (itAttribute != m_attributes.end()) { return false; } + m_attributes[attributeID] = sAttributeValue; + return true; + } + + bool removeAttribute(const CIdentifier& attributeID) override + { + const auto itAttribute = m_attributes.find(attributeID); + if (itAttribute == m_attributes.end()) { return false; } + m_attributes.erase(itAttribute); + return true; + } + + bool removeAllAttributes() override + { + m_attributes.clear(); + return true; + } + + CString getAttributeValue(const CIdentifier& attributeID) const override + { + const auto itAttribute = m_attributes.find(attributeID); + if (itAttribute == m_attributes.end()) { return CString(""); } + return itAttribute->second; + } + + bool setAttributeValue(const CIdentifier& attributeID, const CString& value) override + { + auto itAttribute = m_attributes.find(attributeID); + if (itAttribute == m_attributes.end()) + { + m_attributes[attributeID] = value; + return true; + } + itAttribute->second = value; + return true; + } + + bool hasAttribute(const CIdentifier& attributeID) const override + { + const auto itAttribute = m_attributes.find(attributeID); + if (itAttribute == m_attributes.end()) { return false; } + return true; + } + + bool hasAttributes() const override { return !m_attributes.empty(); } + + CIdentifier getNextAttributeIdentifier(const CIdentifier& previousID) const override { return getNextIdentifier(m_attributes, previousID); } + + _IsDerivedFromClass_(T, OVK_ClassId_Kernel_Scenario_AttributableT) + +protected: + + std::map m_attributes; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkTBox.hpp b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkTBox.hpp new file mode 100755 index 0000000..0955abd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/kernel/scenario/ovkTBox.hpp @@ -0,0 +1,1505 @@ +#pragma once + +#include "../ovkTKernelObject.h" + +#include "ovkTAttributable.h" +#include "ovkCBoxListenerContext.h" +#include "ovkCBoxProto.h" +#include +#include "../ovkCObjectVisitorContext.h" +#include +#include + +#include +#include +#include +#include +#include + +const std::map INTERFACOR_TYPE_TO_NAME = { + { OpenViBE::Kernel::EBoxInterfacorType::Setting, "Setting" }, + { OpenViBE::Kernel::EBoxInterfacorType::Input, "Input" }, + { OpenViBE::Kernel::EBoxInterfacorType::Output, "Output" } +}; +//This class is used to set up the restriction of a stream type for input and output. Each box comes with a +// decriptor that call functions describe in IBoxProto for intialize the CBox object. +// This implementation is derived from CBoxProto, to benefit from +// the implementation of the stream restriction mecanism but neutralizes all other initialization function. +class CBoxProtoRestriction final : public OpenViBE::Kernel::CBoxProto +{ +public: + + CBoxProtoRestriction(const OpenViBE::Kernel::IKernelContext& ctx, OpenViBE::Kernel::IBox& box): CBoxProto(ctx, box) {} + + bool addInput(const OpenViBE::CString& /*name*/, const OpenViBE::CIdentifier& /*typeID*/, + const OpenViBE::CIdentifier& /*identifier*/ = OpenViBE::CIdentifier::undefined(), const bool /*notify*/ = true) override { return true; } + + bool addOutput(const OpenViBE::CString& /*name*/, const OpenViBE::CIdentifier& /*typeID*/, + const OpenViBE::CIdentifier& /*identifier*/ = OpenViBE::CIdentifier::undefined(), const bool /*notify*/ = true) override { return true; } + + bool addSetting(const OpenViBE::CString& /*name*/, const OpenViBE::CIdentifier& /*typeID*/, const OpenViBE::CString& /*defaultValue*/, + const bool /*modifiable*/ = false, const OpenViBE::CIdentifier& /*identifier*/ = OpenViBE::CIdentifier::undefined(), + const bool /*notify*/ = true) override { return true; } + + bool addFlag(const OpenViBE::Kernel::EBoxFlag /*boxFlag*/) override { return true; } + bool addFlag(const OpenViBE::CIdentifier& /*identifier*/) override { return true; } +}; + +class CInterfacor +{ +public: + CInterfacor() { } + + CInterfacor(const CInterfacor& other) + : m_Name(other.m_Name), m_TypeID(other.m_TypeID), m_ID(other.m_ID), m_Deprecated(other.m_Deprecated) { } + + CInterfacor(const OpenViBE::CString& name, const OpenViBE::CIdentifier& idType, const OpenViBE::CIdentifier& id) + : m_Name(name), m_TypeID(idType), m_ID(id) {} + + OpenViBE::CString m_Name; + OpenViBE::CIdentifier m_TypeID = OpenViBE::CIdentifier::undefined(); + OpenViBE::CIdentifier m_ID = OpenViBE::CIdentifier::undefined(); + bool m_Deprecated = false; +}; + +class CInputOutput : public CInterfacor +{ +public: + CInputOutput() { } + CInputOutput(const CInputOutput& i) : CInterfacor(i) { this->m_Deprecated = false; } + CInputOutput(const OpenViBE::CString& name, const OpenViBE::CIdentifier& idType, const OpenViBE::CIdentifier& id) : CInterfacor(name, idType, id) { } +}; + +class CSetting : public CInterfacor +{ +public: + CSetting() { } + CSetting(const CSetting& s) : CInterfacor(s), m_DefaultValue(s.m_DefaultValue), m_Value(s.m_Value), m_Mod(s.m_Mod) { this->m_Deprecated = false; } + CSetting(const OpenViBE::CString& name, const OpenViBE::CIdentifier& idType, const OpenViBE::CIdentifier& id, const OpenViBE::CString& defaultValue, const bool modifiable) + : CInterfacor(name, idType, id), m_DefaultValue(defaultValue), m_Value(defaultValue), m_Mod(modifiable) { } + + OpenViBE::CString m_DefaultValue; + OpenViBE::CString m_Value; + bool m_Mod = false; +}; + + +namespace OpenViBE { +namespace Kernel { +template +class TBox : public TAttributable> +{ +public: + + explicit TBox(const IKernelContext& ctx) : TAttributable>(ctx), m_identifier(CIdentifier::undefined()), + m_algorithmClassID(CIdentifier::undefined()) + { + for (auto i : { Input, Output, Setting }) + { + m_interfacors[i] = std::vector>(); + m_interfacorIDToIdx[i] = std::map(); + m_interfacorNameToIdx[i] = std::map(); + } + } + + ~TBox() override + { + if (m_boxAlgorithmDesc && m_boxListener) + { + CBoxListenerContext ctx(this->getKernelContext(), *this, 0xffffffff); + m_boxListener->uninitialize(ctx); + m_boxAlgorithmDesc->releaseBoxListener(m_boxListener); + } + } + + void setOwnerScenario(IScenario* ownerScenario) { m_ownerScenario = ownerScenario; } + CIdentifier getIdentifier() const override { return m_identifier; } + CString getName() const override { return m_name; } + CIdentifier getAlgorithmClassIdentifier() const override { return m_algorithmClassID; } + + bool setIdentifier(const CIdentifier& identifier) override + { + OV_ERROR_UNLESS_KRF(m_identifier == CIdentifier::undefined(), "Trying to overwrite an already set indentifier", Kernel::ErrorType::BadCall); + OV_ERROR_UNLESS_KRF(identifier != CIdentifier::undefined(), "Trying to set an undefined identifier", Kernel::ErrorType::BadArgument); + + m_identifier = identifier; + this->notify(EBoxModification::IdentifierChanged); + + return true; + } + + bool setName(const CString& name) override + { + m_name = name; + this->notify(EBoxModification::NameChanged); + return true; + } + + bool setAlgorithmClassIdentifier(const CIdentifier& algorithmClassID) override + { + // We need to set the box algorithm identifier in any case. This is because OpenViBE should be able to load + // a scenario with non-existing boxes and save it without modifying them. + m_algorithmClassID = algorithmClassID; + + if (!(algorithmClassID == OVP_ClassId_BoxAlgorithm_Metabox || this + ->getKernelContext().getPluginManager().canCreatePluginObject(algorithmClassID))) + { + // OV_WARNING_K("Box algorithm descriptor not found " << algorithmClassID.str()); + return true; + } + + if (m_boxAlgorithmDesc && m_boxListener) + { + CBoxListenerContext context(this->getKernelContext(), *this, 0xffffffff); + m_boxListener->uninitialize(context); + m_boxAlgorithmDesc->releaseBoxListener(m_boxListener); + } + + const Plugins::IPluginObjectDesc* pluginObjectDesc = this->getKernelContext().getPluginManager().getPluginObjectDescCreating(algorithmClassID); + m_boxAlgorithmDesc = dynamic_cast(pluginObjectDesc); + + if (m_boxAlgorithmDesc) + { + m_boxListener = m_boxAlgorithmDesc->createBoxListener(); + if (m_boxListener) + { + CBoxListenerContext context(this->getKernelContext(), *this, 0xffffffff); + m_boxListener->initialize(context); + } + } + + if (algorithmClassID != OVP_ClassId_BoxAlgorithm_Metabox) + { + //We use the neutralized version of CBoxProto to just initialize the stream restriction mecanism + CBoxProtoRestriction oTempProto(this->getKernelContext(), *this); + m_boxAlgorithmDesc->getBoxPrototype(oTempProto); + } + + this->notify(EBoxModification::AlgorithmClassIdentifierChanged); + + return true; + } + + bool initializeFromAlgorithmClassIdentifier(const CIdentifier& algorithmClassID) override + { + if (!this->initializeFromAlgorithmClassIdentifierNoInit(algorithmClassID)) { return false; } + + this->notify(EBoxModification::Initialized); + this->notify(EBoxModification::DefaultInitialized); + return true; + } + + bool initializeFromAlgorithmClassIdentifierNoInit(const CIdentifier& algorithmClassID) + { + this->disableNotification(); + + const Plugins::IBoxAlgorithmDesc* desc = dynamic_cast(this + ->getKernelContext().getPluginManager(). + getPluginObjectDescCreating(algorithmClassID)); + if (!desc) + { + this->enableNotification(); + OV_ERROR_KRF("Algorithm descriptor not found " << algorithmClassID.str(), Kernel::ErrorType::ResourceNotFound); + } + + this->clearBox(); + this->setName(desc->getName()); + this->setAlgorithmClassIdentifier(algorithmClassID); + + CBoxProto proto(this->getKernelContext(), *this); + desc->getBoxPrototype(proto); + + if (this->hasAttribute(OV_AttributeId_Box_InitialPrototypeHashValue)) + { + this->setAttributeValue( + OV_AttributeId_Box_InitialPrototypeHashValue, this->getPluginManager().getPluginObjectHashValue(algorithmClassID).toString()); + } + else + { + this->addAttribute( + OV_AttributeId_Box_InitialPrototypeHashValue, this->getPluginManager().getPluginObjectHashValue(algorithmClassID).toString()); + } + + this->enableNotification(); + + return true; + } + + bool initializeFromBoxAlgorithmDesc(const Plugins::IBoxAlgorithmDesc& boxAlgorithmDesc) + { + this->clearBox(); + this->setName(boxAlgorithmDesc.getName()); + this->setAlgorithmClassIdentifier(boxAlgorithmDesc.getCreatedClassIdentifier()); + + CBoxProto boxProto(this->getKernelContext(), *this); + boxAlgorithmDesc.getBoxPrototype(boxProto); + + if (this->hasAttribute(OV_AttributeId_Box_InitialPrototypeHashValue)) + { + this->setAttributeValue( + OV_AttributeId_Box_InitialPrototypeHashValue, this->getPluginManager().getPluginObjectHashValue(boxAlgorithmDesc).toString()); + } + else + { + this->addAttribute( + OV_AttributeId_Box_InitialPrototypeHashValue, this->getPluginManager().getPluginObjectHashValue(boxAlgorithmDesc).toString()); + } + + this->enableNotification(); + + this->notify(EBoxModification::Initialized); + this->notify(EBoxModification::DefaultInitialized); + return true; + } + + bool initializeFromExistingBox(const IBox& rExistingBox) override + { + this->disableNotification(); + m_isObserverNotificationActive = false; + + this->clearBox(); + this->setName(rExistingBox.getName()); + this->setAlgorithmClassIdentifier(rExistingBox.getAlgorithmClassIdentifier()); + + for (const auto interfacorType : { Input, Output, Setting }) + { + for (size_t i = 0; i < rExistingBox.getInterfacorCountIncludingDeprecated(interfacorType); ++i) + { + CIdentifier identifier = CIdentifier::undefined(); + CIdentifier type = CIdentifier::undefined(); + CString name; + bool isDeprecated; + rExistingBox.getInterfacorIdentifier(interfacorType, i, identifier); + rExistingBox.getInterfacorType(interfacorType, i, type); + rExistingBox.getInterfacorName(interfacorType, i, name); + rExistingBox.getInterfacorDeprecatedStatus(interfacorType, i, isDeprecated); + this->addInterfacor(interfacorType, name, type, identifier, true); + this->setInterfacorDeprecatedStatus(interfacorType, i, isDeprecated); + + if (interfacorType == Setting) + { + CString value; + CString defaultValue; + bool isModifiable; + rExistingBox.getSettingValue(i, value); + rExistingBox.getSettingDefaultValue(i, defaultValue); + rExistingBox.getSettingMod(i, isModifiable); + this->setSettingDefaultValue(i, defaultValue); + this->setSettingValue(i, value); + this->setSettingMod(i, isModifiable); + if (isModifiable) { m_modifiableSettingIndexes.push_back(i); } + } + } + } + + CIdentifier id = rExistingBox.getNextAttributeIdentifier(CIdentifier::undefined()); + while (id != CIdentifier::undefined()) + { + this->addAttribute(id, rExistingBox.getAttributeValue(id)); + id = rExistingBox.getNextAttributeIdentifier(id); + } + + CIdentifier streamTypeID = CIdentifier::undefined(); + while ((streamTypeID = this->getKernelContext().getTypeManager().getNextTypeIdentifier(streamTypeID)) != + CIdentifier::undefined()) + { + if (this->getKernelContext().getTypeManager().isStream(streamTypeID)) + { + //First check if it is a stream + if (rExistingBox.hasInputSupport(streamTypeID)) { this->addInputSupport(streamTypeID); } + if (rExistingBox.hasOutputSupport(streamTypeID)) { this->addOutputSupport(streamTypeID); } + } + } + + this->enableNotification(); + + this->notify(EBoxModification::Initialized); + + return true; + } + + //___________________________________________________________________// + // // + + + bool addInterfacor(const EBoxInterfacorType interfacorType, const CString& newName, const CIdentifier& typeID, const CIdentifier& identifier, + const bool notify) override + { + switch (interfacorType) + { + case Input: + case Output: + OV_ERROR_UNLESS_KRF(this->getTypeManager().isStream(typeID), + "While adding " << INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " '" << newName << "' to box '" << this->getName() + << "', unknown stream type identifier " << typeID.str(), + ErrorType::BadArgument); + break; + case Setting: break; + default: break; + } + + const size_t position = size_t(m_interfacors[interfacorType].size()); + switch (interfacorType) + { + case Input: + case Output: + m_interfacors[interfacorType].push_back(std::make_shared(newName, typeID, identifier)); + break; + case Setting: + m_interfacors[interfacorType].push_back(std::make_shared(newName, typeID, identifier, "", false)); + break; + default: break; + } + + if (identifier != CIdentifier::undefined()) { m_interfacorIDToIdx[interfacorType][identifier] = position; } + + const CString uniqueName = this->getUnusedName(m_interfacorNameToIdx[interfacorType], newName); + + m_interfacors[interfacorType][position]->m_Name = uniqueName; + m_interfacorNameToIdx[interfacorType][uniqueName] = position; + + OV_ERROR_UNLESS_KRF(m_interfacorNameToIdx[interfacorType].size() == m_interfacors[interfacorType].size(), + "Box " << m_name << " has corrupted name map storage", Kernel::ErrorType::BadResourceCreation); + + if (notify) + { + auto newCount = this->getInterfacorCount(interfacorType) - 1; + switch (interfacorType) + { + case Input: + this->notify(EBoxModification::InputAdded, newCount); + break; + case Output: + this->notify(EBoxModification::OutputAdded, newCount); + break; + case Setting: + this->notify(EBoxModification::SettingAdded, newCount); + break; + default: break; + } + } + return true; + } + + bool removeInterfacor(const EBoxInterfacorType interfacorType, const size_t index, const bool shouldNotify = true) override + { + switch (interfacorType) + { + case Input: return this->removeInput(index, shouldNotify); + case Output: return this->removeOutput(index, shouldNotify); + case Setting: return this->removeSetting(index, shouldNotify); + default: return false; + } + } + + size_t getInterfacorCount(const EBoxInterfacorType interfacorType) const override + { + auto interfacors = m_interfacors.at(interfacorType); + return size_t(std::count_if(interfacors.begin(), interfacors.end(), [](const std::shared_ptr& i) { return !i->m_Deprecated; })); + } + + size_t getInterfacorCountIncludingDeprecated(const EBoxInterfacorType interfacorType) const override { return m_interfacors.at(interfacorType).size(); } + + bool getInterfacorIdentifier(const EBoxInterfacorType interfacorType, const size_t index, CIdentifier& identifier) const override + { + identifier = CIdentifier::undefined(); + OV_ERROR_UNLESS_KRF(index < m_interfacors.at(interfacorType).size(), + INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " index = [" << index << "] is out of range (max index = [" << m_interfacors. + at( + interfacorType).size() - 1 << "])", + ErrorType::OutOfBound); + + identifier = m_interfacors.at(interfacorType)[index]->m_ID; + return true; + } + + bool getInterfacorIndex(const EBoxInterfacorType interfacorType, const CIdentifier& identifier, size_t& index) const override + { + index = size_t(-1); + const auto it = m_interfacorIDToIdx.at(interfacorType).find(identifier); + OV_ERROR_UNLESS_KRF(it != m_interfacorIDToIdx.at(interfacorType).end(), + "Failed to find " << INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " with identifier " << identifier.str(), + ErrorType::ResourceNotFound); + + index = it->second; + return true; + } + + bool getInterfacorIndex(const EBoxInterfacorType interfacorType, const CString& name, size_t& index) const override + { + index = size_t(-1); + const auto it = m_interfacorNameToIdx.at(interfacorType).find(name); + OV_ERROR_UNLESS_KRF(it != m_interfacorNameToIdx.at(interfacorType).end(), + "Failed to find " << INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " with name " << name, Kernel::ErrorType::ResourceNotFound); + + index = it->second; + return true; + } + + bool getInterfacorType(const EBoxInterfacorType interfacorType, const size_t index, CIdentifier& typeID) const override + { + OV_ERROR_UNLESS_KRF(index < m_interfacors.at(interfacorType).size(), + INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " index = [" << index << "] is out of range (max index = [" + << m_interfacors.at(interfacorType).size() - 1 << "])", Kernel::ErrorType::OutOfBound); + + typeID = m_interfacors.at(interfacorType)[index]->m_TypeID; + return true; + } + + bool getInterfacorType(const EBoxInterfacorType interfacorType, const CIdentifier& identifier, CIdentifier& typeID) const override + { + const auto it = m_interfacorIDToIdx.at(interfacorType).find(identifier); + OV_ERROR_UNLESS_KRF(it != m_interfacorIDToIdx.at(interfacorType).end(), + "Failed to find " << INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " with id " << identifier.str(), + ErrorType::ResourceNotFound); + + return this->getInterfacorType(interfacorType, it->second, typeID); + } + + bool getInterfacorType(const EBoxInterfacorType interfacorType, const CString& name, CIdentifier& typeID) const override + { + const auto it = m_interfacorNameToIdx.at(interfacorType).find(name); + OV_ERROR_UNLESS_KRF(it != m_interfacorNameToIdx.at(interfacorType).end(), + "Failed to find " << INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " with name " << name, Kernel::ErrorType::ResourceNotFound); + + return this->getInterfacorType(interfacorType, it->second, typeID); + } + + + bool getInterfacorName(const EBoxInterfacorType interfacorType, const size_t index, CString& name) const override + { + OV_ERROR_UNLESS_KRF(index < m_interfacors.at(interfacorType).size(), + INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " index = [" << index << "] is out of range (max index = [" << m_interfacors. + at( + interfacorType).size() - 1 << "])", + ErrorType::OutOfBound); + + name = m_interfacors.at(interfacorType)[index]->m_Name; + return true; + } + + bool getInterfacorName(const EBoxInterfacorType interfacorType, const CIdentifier& identifier, CString& name) const override + { + const auto it = m_interfacorIDToIdx.at(interfacorType).find(identifier); + OV_ERROR_UNLESS_KRF(it != m_interfacorIDToIdx.at(interfacorType).end(), + "Failed to find " << INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " with id " << identifier.str(), + ErrorType::ResourceNotFound); + + return this->getInputName(it->second, name); + } + + bool getInterfacorDeprecatedStatus(const EBoxInterfacorType interfacorType, const size_t index, bool& value) const override + { + if (index >= m_interfacors.at(interfacorType).size()) { OV_WARNING_K("DUH"); } + OV_ERROR_UNLESS_KRF(index < m_interfacors.at(interfacorType).size(), + INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " index = [" << index << "] is out of range (max index = [" << m_interfacors. + at( + interfacorType).size() - 1 << "])", + ErrorType::OutOfBound); + + value = m_interfacors.at(interfacorType)[index]->m_Deprecated; + return true; + } + + bool getInterfacorDeprecatedStatus(const EBoxInterfacorType interfacorType, const CIdentifier& identifier, bool& value) const override + { + const auto it = m_interfacorIDToIdx.at(interfacorType).find(identifier); + OV_ERROR_UNLESS_KRF(it != m_interfacorIDToIdx.at(interfacorType).end(), + "Failed to find " << INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " with id " << identifier.str(), + ErrorType::ResourceNotFound); + + return this->getInterfacorDeprecatedStatus(interfacorType, it->second, value); + } + + bool hasInterfacorWithIdentifier(const EBoxInterfacorType interfacorType, const CIdentifier& identifier) const override + { + return m_interfacorIDToIdx.at(interfacorType).find(identifier) != m_interfacorIDToIdx.at(interfacorType).end(); + } + + bool hasInterfacorWithNameAndType(const EBoxInterfacorType interfacorType, const CString& name, const CIdentifier& /*typeID*/) const override + { + return m_interfacorNameToIdx.at(interfacorType).find(name) != m_interfacorNameToIdx.at(interfacorType).end(); + } + + bool hasInterfacorWithType(const EBoxInterfacorType interfacorType, const size_t index, const CIdentifier& typeID) const override + { + if (index < this->getInterfacorCount(interfacorType)) + { + CIdentifier type = CIdentifier::undefined(); + this->getInterfacorType(interfacorType, index, type); + return (type == typeID); + } + return false; + } + + + bool setInterfacorType(const EBoxInterfacorType interfacorType, const size_t index, const CIdentifier& typeID) override + { + switch (interfacorType) + { + case Input: + case Output: + OV_ERROR_UNLESS_KRF(this->getTypeManager().isStream(typeID), + "While changing box '" << this->getName() << "' " << INTERFACOR_TYPE_TO_NAME.at(interfacorType) << + " type, unknown stream type identifier " << typeID.str(), + ErrorType::BadArgument); + break; + case Setting: + break; + } + + OV_ERROR_UNLESS_KRF(index < m_interfacors.at(interfacorType).size(), + INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " index = [" << index << "] is out of range (max index = [" << m_interfacors. + at( + interfacorType).size() - 1 << "])", + ErrorType::OutOfBound); + + if (m_interfacors[interfacorType][index]->m_TypeID == typeID) { return true; } + + m_interfacors[interfacorType][index]->m_TypeID = typeID; + + switch (interfacorType) + { + case Input: + this->notify(EBoxModification::InputTypeChanged, index); + break; + case Output: + this->notify(EBoxModification::OutputTypeChanged, index); + break; + case Setting: + this->notify(EBoxModification::SettingTypeChanged, index); + this->notifySettingChange(SettingChange, int(index)); + break; + } + + return true; + } + + bool setInterfacorType(const EBoxInterfacorType interfacorType, const CIdentifier& identifier, const CIdentifier& typeID) override + { + const auto it = m_interfacorIDToIdx[interfacorType].find(identifier); + OV_ERROR_UNLESS_KRF(it != m_interfacorIDToIdx[interfacorType].end(), + "Failed to find " << INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " with id " << identifier.str(), + ErrorType::ResourceNotFound); + + return this->setInterfacorType(interfacorType, it->second, typeID); + } + + bool setInterfacorType(const EBoxInterfacorType interfacorType, const CString& name, const CIdentifier& typeID) override + { + const auto it = m_interfacorNameToIdx[interfacorType].find(name); + OV_ERROR_UNLESS_KRF(it != m_interfacorNameToIdx[interfacorType].end(), + "Failed to find " << INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " with name " << name, Kernel::ErrorType::ResourceNotFound); + + return this->setInterfacorType(interfacorType, it->second, typeID); + } + + + bool setInterfacorName(const EBoxInterfacorType interfacorType, const size_t index, const CString& newName) override + { + OV_ERROR_UNLESS_KRF(index < m_interfacors[interfacorType].size(), + INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " index = [" << index << "] is out of range (max index = [" << m_interfacors[ + interfacorType].size() - 1 << "])", + ErrorType::OutOfBound); + + if (m_interfacors[interfacorType][index]->m_Name == newName) + { + // no change, don't bother notifying + return true; + } + + // remove entry from name key map + const auto it = m_interfacorNameToIdx[interfacorType].find(m_interfacors[interfacorType][index]->m_Name); + OV_ERROR_UNLESS_KRF(it != m_interfacorNameToIdx[interfacorType].end(), + "Failed to find " << INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " with name " << m_interfacors[interfacorType][index]-> + m_Name, + ErrorType::ResourceNotFound); + m_interfacorNameToIdx[interfacorType].erase(it); + + // check for duplicated name key and update if necessary + const CString uniqueName = this->getUnusedName(m_interfacorNameToIdx[interfacorType], newName); + m_interfacorNameToIdx[interfacorType][uniqueName] = index; + m_interfacors[interfacorType][index]->m_Name = uniqueName; + + OV_ERROR_UNLESS_KRF(m_interfacorNameToIdx[interfacorType].size() == m_interfacors[interfacorType].size(), + "Box " << m_name << " has corrupted name map storage", Kernel::ErrorType::BadResourceCreation); + + switch (interfacorType) + { + case Input: + this->notify(EBoxModification::InputNameChanged, index); + break; + case Output: + this->notify(EBoxModification::OutputNameChanged, index); + break; + case Setting: + this->notify(EBoxModification::SettingNameChanged, index); + break; + } + + return true; + } + + bool setInterfacorName(const EBoxInterfacorType interfacorType, const CIdentifier& identifier, const CString& newName) override + { + const auto it = m_interfacorIDToIdx[interfacorType].find(identifier); + OV_ERROR_UNLESS_KRF(it != m_interfacorIDToIdx[interfacorType].end(), + "Failed to find " << INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " with id " << identifier.str(), + ErrorType::ResourceNotFound); + + return this->setInterfacorName(interfacorType, it->second, newName); + } + + bool setInterfacorDeprecatedStatus(const EBoxInterfacorType interfacorType, const size_t index, const bool newValue) override + { + OV_ERROR_UNLESS_KRF(index < m_interfacors[interfacorType].size(), + INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " index = [" << index << "] is out of range (max index = [" << m_interfacors[ + interfacorType].size() - 1 << "])", + ErrorType::OutOfBound); + + m_interfacors[interfacorType][index]->m_Deprecated = newValue; + + return true; + } + + bool setInterfacorDeprecatedStatus(const EBoxInterfacorType interfacorType, const CIdentifier& identifier, const bool newValue) override + { + const auto it = m_interfacorIDToIdx[interfacorType].find(identifier); + OV_ERROR_UNLESS_KRF(it != m_interfacorIDToIdx[interfacorType].end(), + "Failed to find " << INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " with id " << identifier.str(), + ErrorType::ResourceNotFound); + + return this->setInterfacorDeprecatedStatus(interfacorType, it->second, newValue); + } + + //___________________________________________________________________// + // // + + bool addInput(const CString& name, const CIdentifier& typeID, const CIdentifier& identifier, const bool notify) override + { + return this->addInterfacor(Input, name, typeID, identifier, notify); + } + + bool removeInput(const size_t index, const bool notify = true) override + { + OV_ERROR_UNLESS_KRF(index < m_interfacors[Input].size(), + "Input index = [" << index << "] is out of range (max index = [" << m_interfacors[Input].size() - 1 << "])", + ErrorType::OutOfBound); + { + CIdentifier* listID = nullptr; + size_t nbElems = 0; + m_ownerScenario->getLinkIdentifierToBoxInputList(m_identifier, index, &listID, &nbElems); + for (size_t i = 0; i < nbElems; ++i) { m_ownerScenario->disconnect(listID[i]); } + m_ownerScenario->releaseIdentifierList(listID); + } + + // $$$ + // The way the links are removed here + // is not correct because they are all + // collected and then all removed. In case + // the box listener callback on box removal, + // the nextcoming links would potentially be + // invalid + std::vector, std::pair>> links; + + { + CIdentifier* listID = nullptr; + size_t nbElems = 0; + m_ownerScenario->getLinkIdentifierToBoxList(m_identifier, &listID, &nbElems); + for (size_t i = 0; i < nbElems; ++i) + { + CIdentifier id = listID[i]; + ILink* link = m_ownerScenario->getLinkDetails(id); + if (link->getTargetBoxInputIndex() > index) + { + links.push_back(std::make_pair(std::make_pair(link->getSourceBoxIdentifier().id(), link->getSourceBoxOutputIndex()), + std::make_pair(link->getTargetBoxIdentifier().id(), link->getTargetBoxInputIndex()))); + + if (m_ownerScenario->isLink(id)) { m_ownerScenario->disconnect(id); } + } + } + m_ownerScenario->releaseIdentifierList(listID); + } + + // This reorganizes the parent's scenario links if this box is not actually a scenario itself + if (m_identifier != CIdentifier::undefined()) + { + std::vector>> scenarioLinks; + for (size_t scenarioInputIdx = 0; scenarioInputIdx < m_ownerScenario->getInterfacorCount(Input); ++scenarioInputIdx) + { + CIdentifier boxID = CIdentifier::undefined(); + size_t boxConnectorIdx = size_t(-1); + m_ownerScenario->getScenarioInputLink(scenarioInputIdx, boxID, boxConnectorIdx); + if (boxID == m_identifier) + { + if (boxConnectorIdx > index) { scenarioLinks.push_back(std::make_pair(scenarioInputIdx, std::make_pair(boxID.id(), boxConnectorIdx))); } + if (boxConnectorIdx >= index) { m_ownerScenario->removeScenarioInputLink(scenarioInputIdx, boxID, boxConnectorIdx); } + } + } + + // Reconnects scenario links + for (const auto& link : scenarioLinks) { m_ownerScenario->setScenarioInputLink(link.first, link.second.first, link.second.second - 1); } + } + + const CIdentifier toBeRemovedId = m_interfacors[Input][index]->m_ID; + CString toBeRemovedName = m_interfacors[Input][index]->m_Name; + + // Erases actual input + m_interfacors[Input].erase(m_interfacors[Input].begin() + index); + + // Reconnects box links + for (const auto& link : links) + { + CIdentifier newId = CIdentifier::undefined(); + m_ownerScenario->connect(newId, link.first.first, link.first.second, link.second.first, link.second.second - 1, CIdentifier::undefined()); + } + + // erase name key + const auto itName = m_interfacorNameToIdx[Input].find(toBeRemovedName); + OV_ERROR_UNLESS_KRF(itName != m_interfacorNameToIdx[Input].end(), "No input found with name " << toBeRemovedName, + ErrorType::ResourceNotFound); + m_interfacorNameToIdx[Input].erase(itName); + + // erase identifier key if defined + if (toBeRemovedId != CIdentifier::undefined()) + { + const auto itIdent = m_interfacorIDToIdx[Input].find(toBeRemovedId); + OV_ERROR_UNLESS_KRF(itIdent != m_interfacorIDToIdx[Input].end(), "No input found with id " << toBeRemovedId.str(), + ErrorType::ResourceNotFound); + m_interfacorIDToIdx[Input].erase(itIdent); + } + + if (notify) { this->notify(EBoxModification::InputRemoved, index); } + + return true; + } + + size_t getInputCount() const override { return this->getInterfacorCount(Input); } + bool getInputType(const size_t index, CIdentifier& typeID) const override { return this->getInterfacorType(Input, index, typeID); } + bool getInputName(const size_t index, CString& name) const override { return this->getInterfacorName(Input, index, name); } + + bool getInputName(const CIdentifier& rInputIdentifier, CString& name) const { return this->getInterfacorName(Input, rInputIdentifier, name); } + + bool setInputType(const size_t index, const CIdentifier& typeID) override { return this->setInterfacorType(Input, index, typeID); } + bool setInputName(const size_t index, const CString& name) override { return this->setInterfacorName(Input, index, name); } + + //___________________________________________________________________// + // // + + bool addOutput(const CString& name, const CIdentifier& typeID, const CIdentifier& identifier, const bool notify) override + { + return this->addInterfacor(Output, name, typeID, identifier, notify); + } + + bool removeOutput(const size_t index, const bool notify = true) override + { + OV_ERROR_UNLESS_KRF(index < m_interfacors[Output].size(), + "Output index = [" << index << "] is out of range (max index = [" << size_t(m_interfacors[Output].size() - 1) << "])", + ErrorType::OutOfBound); + + std::vector, std::pair>> links; + + if (m_ownerScenario) + { + CIdentifier* listID = nullptr; + size_t nbElems = 0; + + m_ownerScenario->getLinkIdentifierFromBoxOutputList(m_identifier, index, &listID, &nbElems); + for (size_t i = 0; i < nbElems; ++i) { m_ownerScenario->disconnect(listID[i]); } + m_ownerScenario->releaseIdentifierList(listID); + + // $$$ + // The way the links are removed here is not correct because they are all collected and then all removed. In case + // the box listener callback on box removal, the nextcoming links would potentially be invalid + { + listID = nullptr; + nbElems = 0; + m_ownerScenario->getLinkIdentifierFromBoxOutputList(m_identifier, index, &listID, &nbElems); + for (size_t i = 0; i < nbElems; ++i) + { + const CIdentifier& curID = listID[i]; + ILink* link = m_ownerScenario->getLinkDetails(curID); + if (link->getSourceBoxOutputIndex() > index) + { + links.push_back(std::make_pair(std::make_pair(link->getSourceBoxIdentifier().id(), link->getSourceBoxOutputIndex()), + std::make_pair(link->getTargetBoxIdentifier().id(), link->getTargetBoxInputIndex()))); + if (m_ownerScenario->isLink(curID)) { m_ownerScenario->disconnect(curID); } + } + } + m_ownerScenario->releaseIdentifierList(listID); + } + + // This reorganizes the parent's scenario links if this box is not actually a scenario + if (m_identifier != CIdentifier::undefined()) + { + std::vector>> scenarioLinks; + for (size_t scenarioOutputIdx = 0; scenarioOutputIdx < m_ownerScenario->getOutputCount(); ++scenarioOutputIdx) + { + CIdentifier boxID = CIdentifier::undefined(); + size_t boxConnectorIdx = size_t(-1); + m_ownerScenario->getScenarioOutputLink(scenarioOutputIdx, boxID, boxConnectorIdx); + if (boxID == m_identifier) + { + if (boxConnectorIdx > index) + { + scenarioLinks.push_back(std::make_pair(scenarioOutputIdx, std::make_pair(boxID.id(), boxConnectorIdx))); + } + if (boxConnectorIdx >= index) { m_ownerScenario->removeScenarioOutputLink(scenarioOutputIdx, boxID, boxConnectorIdx); } + } + } + + // Reconnects scenario links + for (const auto& link : scenarioLinks) { m_ownerScenario->setScenarioOutputLink(link.first, link.second.first, link.second.second - 1); } + } + } + const CIdentifier toBeRemovedId = m_interfacors.at(Output)[index]->m_ID; + CString toBeRemovedName = m_interfacors.at(Output)[index]->m_Name; + + // Erases actual output + m_interfacors[Output].erase(m_interfacors.at(Output).begin() + index); + + // Reconnects box links + if (m_ownerScenario) + { + for (const auto& link : links) + { + CIdentifier newId = CIdentifier::undefined(); + m_ownerScenario->connect(newId, link.first.first, link.first.second - 1, link.second.first, link.second.second, + CIdentifier::undefined()); + } + } + + + // erase name key + const auto itName = m_interfacorNameToIdx.at(Output).find(toBeRemovedName); + OV_ERROR_UNLESS_KRF(itName != m_interfacorNameToIdx.at(Output).end(), "No output found with name " << toBeRemovedName, + ErrorType::ResourceNotFound); + m_interfacorNameToIdx.at(Output).erase(itName); + + // erase identifier key if defined + if (toBeRemovedId != CIdentifier::undefined()) + { + const auto itIdent = m_interfacorIDToIdx.at(Output).find(toBeRemovedId); + OV_ERROR_UNLESS_KRF(itIdent != m_interfacorIDToIdx.at(Output).end(), "No output found with id " << toBeRemovedId.str(), + ErrorType::ResourceNotFound); + + m_interfacorIDToIdx.at(Output).erase(itIdent); + } + + if (notify) { this->notify(EBoxModification::OutputRemoved, index); } + + return true; + } + + size_t getOutputCount() const override { return this->getInterfacorCount(Output); } + bool getOutputType(const size_t index, CIdentifier& typeID) const override { return this->getInterfacorType(Output, index, typeID); } + bool getOutputName(const size_t index, CString& name) const override { return this->getInterfacorName(Output, index, name); } + bool setOutputType(const size_t index, const CIdentifier& typeID) override { return this->setInterfacorType(Output, index, typeID); } + bool setOutputName(const size_t index, const CString& name) override { return this->setInterfacorName(Output, index, name); } + + bool addInterfacorTypeSupport(const EBoxInterfacorType interfacorType, const CIdentifier& typeID) override + { + if (interfacorType == Input) { m_supportInputTypes.push_back(typeID); } + else if (interfacorType == Output) { m_supportOutputTypes.push_back(typeID); } + + return false; + } + + bool hasInterfacorTypeSupport(const EBoxInterfacorType interfacorType, const CIdentifier& typeID) const override + { + if (interfacorType == Input) + { + if (m_supportInputTypes.empty()) { return true; } + + for (size_t i = 0; i < m_supportInputTypes.size(); ++i) { if (m_supportInputTypes[i] == typeID) { return true; } } + } + else if (interfacorType == Output) + { + //If there is no type specify, we allow all + if (m_supportOutputTypes.empty()) { return true; } + + for (size_t i = 0; i < m_supportOutputTypes.size(); ++i) { if (m_supportOutputTypes[i] == typeID) { return true; } } + } + else + { + // Settings are always all supported, in a way + return true; + } + + return false; + } + + bool addInputSupport(const CIdentifier& typeID) override { return this->addInterfacorTypeSupport(Input, typeID); } + bool hasInputSupport(const CIdentifier& typeID) const override { return this->hasInterfacorTypeSupport(Input, typeID); } + bool addOutputSupport(const CIdentifier& typeID) override { return this->addInterfacorTypeSupport(Output, typeID); } + bool hasOutputSupport(const CIdentifier& typeID) const override { return this->hasInterfacorTypeSupport(Output, typeID); } + + bool setSupportTypeFromAlgorithmIdentifier(const CIdentifier& typeID) override + { + const Plugins::IPluginObjectDesc* pluginObjectDesc = this->getKernelContext().getPluginManager().getPluginObjectDescCreating(typeID); + const Plugins::IBoxAlgorithmDesc* boxAlgorithmDesc = dynamic_cast(pluginObjectDesc); + + OV_ERROR_UNLESS_KRF(boxAlgorithmDesc, "Tried to initialize with an unregistered algorithm", Kernel::ErrorType::Internal); + + //We use the neutralized version of CBoxProto to just initialize the stream restriction mecanism + CBoxProtoRestriction oTempProto(this->getKernelContext(), *this); + boxAlgorithmDesc->getBoxPrototype(oTempProto); + return true; + } + + std::vector getInputSupportTypes() const override { return m_supportInputTypes; } + std::vector getOutputSupportTypes() const override { return m_supportOutputTypes; } + void clearOutputSupportTypes() override { m_supportOutputTypes.clear(); } + void clearInputSupportTypes() override { m_supportInputTypes.clear(); } + +private: + CIdentifier getUnusedInterfacorIdentifier(const EBoxInterfacorType interfacorType, + const CIdentifier& suggestedIdentifier = CIdentifier::undefined()) const + { + uint64_t identifier = CIdentifier::random().id(); + if (suggestedIdentifier != CIdentifier::undefined()) { identifier = suggestedIdentifier.id(); } + + CIdentifier resultIdentifier = CIdentifier::undefined(); + std::map::const_iterator it; + do + { + resultIdentifier = CIdentifier(identifier); + it = m_interfacorIDToIdx.at(interfacorType).find(resultIdentifier); + identifier++; + } while (it != m_interfacorIDToIdx.at(interfacorType).end() || resultIdentifier == CIdentifier::undefined()); + return resultIdentifier; + } + +public: + + CIdentifier getUnusedSettingIdentifier(const CIdentifier& /*suggestedID*/ = CIdentifier::undefined()) const + { + return this->getUnusedInterfacorIdentifier(Setting); + } + + CIdentifier getUnusedInputIdentifier(const CIdentifier& /*suggestedID*/ = CIdentifier::undefined()) const + { + return this->getUnusedInterfacorIdentifier(Input); + } + + CIdentifier getUnusedOutputIdentifier(const CIdentifier& /*suggestedID*/ = CIdentifier::undefined()) const + { + return this->getUnusedInterfacorIdentifier(Output); + } + + bool addSetting(const CString& name, const CIdentifier& typeID, const CString& sDefaultValue, const size_t index, + const bool bModifiability, const CIdentifier& identifier, const bool notify) override + { + CString value(sDefaultValue); + if (this->getTypeManager().isEnumeration(typeID)) + { + if (this->getTypeManager().getEnumerationEntryValueFromName(typeID, sDefaultValue) == CIdentifier::undefined().id()) + { + if (this->getTypeManager().getEnumerationEntryCount(typeID) != 0) + { + // get value to the first enum entry + // and eventually correct this after + uint64_t v = 0; + this->getTypeManager().getEnumerationEntry(typeID, 0, value, v); + + // Find if the default value string actually is an identifier, otherwise just keep the zero index name as default. + CIdentifier defaultValueID = CIdentifier::undefined(); + defaultValueID.fromString(sDefaultValue); + + // Finally, if it is an identifier, then a name should be found + // from the type manager ! Otherwise value is left to the default. + const CString candidateValue = this->getTypeManager().getEnumerationEntryNameFromValue(typeID, defaultValueID.id()); + if (candidateValue != CString("")) { value = candidateValue; } + } + } + } + + CSetting s; + s.m_Name = name; + s.m_TypeID = typeID; + s.m_DefaultValue = value; + s.m_Value = value; + s.m_Mod = bModifiability; + s.m_ID = identifier; + + const size_t idx = index; + + + size_t insertLocation; + + if (index == size_t(-1) || index == size_t(m_interfacors[Setting].size())) + { + m_interfacors[Setting].push_back(std::make_shared(s)); + insertLocation = (size_t(m_interfacors[Setting].size())) - 1; + } + else + { + OV_ERROR_UNLESS_KRF(index <= m_interfacors[Setting].size(), + "Tried to push '" << name << "' to slot " << index << " with the array size being " << m_interfacors[Setting].size(), + ErrorType::OutOfBound); + + auto it = m_interfacors[Setting].begin(); + it += idx; + m_interfacors[Setting].insert(it, std::make_shared(s)); + insertLocation = index; + } + + if (s.m_ID != CIdentifier::undefined()) + { + // add access by CIdentifier key if defined so that size differs from m_settings + m_interfacorIDToIdx[Setting][s.m_ID] = insertLocation; + } + // add access by name key (always done so that synchronized with m_settings + const CString newName = this->getUnusedName(m_interfacorNameToIdx.at(Setting), s.m_Name); + m_interfacors[Setting][insertLocation]->m_Name = newName; + m_interfacorNameToIdx[Setting][newName] = insertLocation; + + OV_ERROR_UNLESS_KRF(m_interfacorNameToIdx.at(Setting).size() == m_interfacors[Setting].size(), + "Box " << m_name << " has corrupted name map storage", Kernel::ErrorType::BadResourceCreation); + + //if this setting is modifiable, keep its index + if (bModifiability) { m_modifiableSettingIndexes.push_back(idx); } + + this->getLogManager() << LogLevel_Debug + << "Pushed '" << m_interfacors.at(Setting)[insertLocation]->m_Name << "' : '" + << std::static_pointer_cast(m_interfacors.at(Setting)[insertLocation])->m_Value + << "' to slot " << insertLocation << " with the array size now " << m_interfacors.at(Setting).size() << "\n"; + + if (notify) + { + this->notify(EBoxModification::SettingAdded, insertLocation); + this->notifySettingChange(SettingAdd, int(insertLocation)); + } + + return true; + } + + bool removeSetting(const size_t index, const bool notify = true) override + { + auto it = m_interfacors[Setting].begin() + index; + OV_ERROR_UNLESS_KRF(it != m_interfacors[Setting].end(), "No setting found at index " << index, Kernel::ErrorType::ResourceNotFound); + + const CIdentifier toBeRemovedId = m_interfacors[Setting][index]->m_ID; + CString toBeRemovedName = m_interfacors[Setting][index]->m_Name; + + it = m_interfacors[Setting].erase(it); + + //update the modifiable setting indexes + for (auto it2 = m_modifiableSettingIndexes.begin(); it2 != m_modifiableSettingIndexes.end();) + { + if (*it2 == index) { it2 = m_modifiableSettingIndexes.erase(it2); } + else if (*it2 > index) + { + *it2 -= 1; + ++it2; + } + } + + // erase name key + const auto itName = m_interfacorNameToIdx.at(Setting).find(toBeRemovedName); + OV_ERROR_UNLESS_KRF(itName != m_interfacorNameToIdx.at(Setting).end(), "No setting found with name " << toBeRemovedName, + ErrorType::ResourceNotFound); + m_interfacorNameToIdx.at(Setting).erase(itName); + + // erase identifier key if defined + if (toBeRemovedId != CIdentifier::undefined()) + { + const auto itIdent = m_interfacorIDToIdx.at(Setting).find(toBeRemovedId); + OV_ERROR_UNLESS_KRF(itIdent != m_interfacorIDToIdx.at(Setting).end(), "No setting found with id " << toBeRemovedId.str(), + ErrorType::ResourceNotFound); + m_interfacorIDToIdx.at(Setting).erase(itIdent); + } + + if (notify) + { + this->notify(EBoxModification::SettingRemoved, index); + this->notifySettingChange(SettingDelete, int(index)); + } + + return true; + } + + size_t getSettingCount() const override { return this->getInterfacorCount(Setting); } + + bool hasSettingWithName(const CString& name) const override + { + return m_interfacorNameToIdx.at(Setting).find(name) != m_interfacorNameToIdx.at(Setting).end(); + } + + bool getSettingType(const size_t index, CIdentifier& typeID) const override { return this->getInterfacorType(Setting, index, typeID); } + + bool getSettingName(const size_t index, CString& name) const override { return this->getInterfacorName(Setting, index, name); } + + bool getSettingDefaultValue(const size_t index, CString& defaultValue) const override + { + OV_ERROR_UNLESS_KRF(index < m_interfacors.at(Setting).size(), + "Setting index = [" << index << "] is out of range (max index = [" << m_interfacors.at(Setting).size() - 1 << "])", + ErrorType::OutOfBound); + + defaultValue = std::static_pointer_cast(m_interfacors.at(Setting)[index])->m_DefaultValue; + return true; + } + + bool getSettingDefaultValue(const CIdentifier& identifier, CString& defaultValue) const override + { + const auto it = m_interfacorIDToIdx.at(Setting).find(identifier); + OV_ERROR_UNLESS_KRF(it != m_interfacorIDToIdx.at(Setting).end(), "Failed to find setting with id " << identifier.str(), + ErrorType::ResourceNotFound); + + return this->getSettingDefaultValue(it->second, defaultValue); + } + + bool getSettingDefaultValue(const CString& name, CString& defaultValue) const override + { + const auto it = m_interfacorNameToIdx.at(Setting).find(name); + OV_ERROR_UNLESS_KRF(it != m_interfacorNameToIdx.at(Setting).end(), "Failed to find setting with name " << name, + ErrorType::ResourceNotFound); + + return this->getSettingDefaultValue(it->second, defaultValue); + } + + bool getSettingValue(const size_t index, CString& value) const override + { + OV_ERROR_UNLESS_KRF(index < m_interfacors.at(Setting).size(), + "Setting index = [" << index << "] is out of range (max index = [" << m_interfacors.at(Setting).size() - 1 << "])", + ErrorType::OutOfBound); + + value = std::static_pointer_cast(m_interfacors.at(Setting)[index])->m_Value; + return true; + } + + bool getSettingValue(const CIdentifier& identifier, CString& value) const override + { + const auto it = m_interfacorIDToIdx.at(Setting).find(identifier); + OV_ERROR_UNLESS_KRF(it != m_interfacorIDToIdx.at(Setting).end(), "Failed to find setting with id " << identifier.str(), + ErrorType::ResourceNotFound); + + return this->getSettingValue(it->second, value); + } + + bool getSettingValue(const CString& name, CString& value) const override + { + const auto it = m_interfacorNameToIdx.at(Setting).find(name); + OV_ERROR_UNLESS_KRF(it != m_interfacorNameToIdx.at(Setting).end(), "Failed to find setting with name " << name, + ErrorType::ResourceNotFound); + + return this->getSettingValue(it->second, value); + } + + bool getSettingMod(const size_t index, bool& value) const override + { + OV_ERROR_UNLESS_KRF(index < m_interfacors.at(Setting).size(), + "Setting index = [" << index << "] is out of range (max index = [" << m_interfacors.at(Setting).size() - 1 << "])", + ErrorType::OutOfBound); + + value = std::static_pointer_cast(m_interfacors.at(Setting)[index])->m_Mod; + return true; + } + + bool getSettingMod(const CIdentifier& identifier, bool& value) const override + { + const auto it = m_interfacorIDToIdx.at(Setting).find(identifier); + OV_ERROR_UNLESS_KRF(it != m_interfacorIDToIdx.at(Setting).end(), + "Failed to find setting with id " << identifier.str(), Kernel::ErrorType::ResourceNotFound); + + return this->getSettingMod(it->second, value); + } + + bool getSettingMod(const CString& name, bool& value) const override + { + const auto it = m_interfacorNameToIdx.at(Setting).find(name); + OV_ERROR_UNLESS_KRF(it != m_interfacorNameToIdx.at(Setting).end(), + "Failed to find setting with name " << name, Kernel::ErrorType::ResourceNotFound); + + return this->getSettingMod(it->second, value); + } + + bool setSettingType(const size_t index, const CIdentifier& typeID) override { return this->setInterfacorType(Setting, index, typeID); } + + bool setSettingName(const size_t index, const CString& name) override { return this->setInterfacorName(Setting, index, name); } + + bool setSettingDefaultValue(const size_t index, const CString& defaultValue) override + { + OV_ERROR_UNLESS_KRF(index < m_interfacors.at(Setting).size(), + "Setting index = [" << index << "] is out of range (max index = [" << m_interfacors.at(Setting).size() - 1 << "])", + ErrorType::OutOfBound); + + std::static_pointer_cast(m_interfacors[Setting][index])->m_DefaultValue = defaultValue; + + this->notify(EBoxModification::SettingDefaultValueChanged, index); + + return true; + } + + bool setSettingDefaultValue(const CIdentifier& identifier, const CString& defaultValue) override + { + const auto it = m_interfacorIDToIdx.at(Setting).find(identifier); + OV_ERROR_UNLESS_KRF(it != m_interfacorIDToIdx.at(Setting).end(), "Failed to find setting with id " << identifier.str(), + ErrorType::ResourceNotFound); + + return this->setSettingDefaultValue(it->second, defaultValue); + } + + bool setSettingDefaultValue(const CString& name, const CString& defaultValue) override + { + const auto it = m_interfacorNameToIdx.at(Setting).find(name); + OV_ERROR_UNLESS_KRF(it != m_interfacorNameToIdx.at(Setting).end(), "Failed to find setting with name " << name, + ErrorType::ResourceNotFound); + return this->setSettingDefaultValue(it->second, defaultValue); + } + + bool setSettingValue(const size_t index, const CString& value, const bool notify = true) override + { + OV_ERROR_UNLESS_KRF(index < m_interfacors.at(Setting).size(), + "Setting index = [" << index << "] is out of range (max index = [" << m_interfacors.at(Setting).size() - 1 << "])", + ErrorType::OutOfBound); + + auto setting = std::static_pointer_cast(m_interfacors[Setting][index]); + if (setting->m_Value != value) + { + setting->m_Value = value; + + if (notify) + { + this->notify(EBoxModification::SettingValueChanged, index); + this->notifySettingChange(SettingValueUpdate, int(index)); + } + } + + return true; + } + + bool setSettingValue(const CIdentifier& identifier, const CString& value) override + { + const auto it = m_interfacorIDToIdx.at(Setting).find(identifier); + OV_ERROR_UNLESS_KRF(it != m_interfacorIDToIdx.at(Setting).end(), "Failed to find setting with id " << identifier.str(), + ErrorType::ResourceNotFound); + + return this->setSettingValue(it->second, value); + } + + bool setSettingValue(const CString& name, const CString& value) override + { + const auto it = m_interfacorNameToIdx.at(Setting).find(name); + OV_ERROR_UNLESS_KRF(it != m_interfacorNameToIdx.at(Setting).end(), "Failed to find setting with name " << name, Kernel::ErrorType::ResourceNotFound); + + return this->setSettingValue(it->second, value); + } + + bool setSettingMod(const size_t index, const bool value) override + { + OV_ERROR_UNLESS_KRF(index < m_interfacors.at(Setting).size(), + "Setting index = [" << index << "] is out of range (max index = [" << m_interfacors.at(Setting).size() - 1 << "])", + ErrorType::OutOfBound); + + std::static_pointer_cast(m_interfacors[Setting][index])->m_Mod = value; + + //this->notify(EBoxModification::SettingNameChanged, index); + return true; + } + + bool setSettingMod(const CString& name, const bool value) override + { + const auto it = m_interfacorNameToIdx.at(Setting).find(name); + OV_ERROR_UNLESS_KRF(it != m_interfacorNameToIdx.at(Setting).end(), "Failed to find setting with name " << name, + ErrorType::ResourceNotFound); + + return this->setSettingMod(it->second, value); + } + + bool setSettingMod(const CIdentifier& identifier, const bool value) override + { + const auto it = m_interfacorIDToIdx.at(Setting).find(identifier); + OV_ERROR_UNLESS_KRF(it != m_interfacorIDToIdx.at(Setting).end(), "Failed to find setting with id " << identifier.str(), + ErrorType::ResourceNotFound); + + return this->setSettingMod(it->second, value); + } + + bool swapInterfacors(const EBoxInterfacorType interfacorType, const size_t indexA, const size_t indexB) + { + OV_ERROR_UNLESS_KRF(indexA < m_interfacors.at(interfacorType).size(), + INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " index = [" << indexA << "] is out of range (max index = [" << m_interfacors. + at( + interfacorType).size() - 1 << "])", + ErrorType::OutOfBound); + OV_ERROR_UNLESS_KRF(indexB < m_interfacors.at(interfacorType).size(), + INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " index = [" << indexB << "] is out of range (max index = [" << m_interfacors. + at( + interfacorType).size() - 1 << "])", + ErrorType::OutOfBound); + + CString nameA; + CIdentifier identifierA = CIdentifier::undefined(); + CString nameB; + CIdentifier identifierB = CIdentifier::undefined(); + + this->getInterfacorName(interfacorType, indexA, nameA); + this->getInterfacorIdentifier(interfacorType, indexA, identifierA); + this->getInterfacorName(interfacorType, indexB, nameB); + this->getInterfacorIdentifier(interfacorType, indexB, identifierB); + + const auto itA = m_interfacors[interfacorType].begin() + indexA; + const auto itB = m_interfacors[interfacorType].begin() + indexB; + // swap settings + std::iter_swap(itA, itB); + // update associated maps + m_interfacorNameToIdx.at(interfacorType)[nameA] = indexB; + m_interfacorNameToIdx.at(interfacorType)[nameB] = indexA; + m_interfacorIDToIdx.at(interfacorType)[identifierA] = indexB; + m_interfacorIDToIdx.at(interfacorType)[identifierB] = indexA; + + return true; + } + + bool swapSettings(const size_t indexA, const size_t indexB) override { return this->swapInterfacors(Setting, indexA, indexB); } + bool swapInputs(const size_t indexA, const size_t indexB) override { return this->swapInterfacors(Input, indexA, indexB); } + bool swapOutputs(const size_t indexA, const size_t indexB) override { return this->swapInterfacors(Output, indexA, indexB); } + + void notifySettingChange(const EBoxEventMessageType eType, const int firstIdx = -1, const int secondIdx = -1) + { + if (m_isObserverNotificationActive) + { + BoxEventMessage event; + event.m_Type = eType; + event.m_FirstIdx = firstIdx; + event.m_SecondIdx = secondIdx; + + this->setChanged(); + this->notifyObservers(&event); + } + } + + bool hasModifiableSettings() const override + { + for (const auto& setting : m_interfacors.at(Setting)) { if (std::static_pointer_cast(setting)->m_Mod) { return true; } } + return false; + } + + size_t* getModifiableSettings(size_t& count) const override + { + size_t* res = nullptr; + count = m_modifiableSettingIndexes.size(); + return res; + } + + bool updateInterfacorIdentifier(const EBoxInterfacorType interfacorType, const size_t index, const CIdentifier& newID) override + { + OV_ERROR_UNLESS_KRF(index < m_interfacors.at(interfacorType).size(), + INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " index = [" << index << "] is out of range (max index = [" << m_interfacors. + at( + Setting).size() - 1 << "])", + ErrorType::OutOfBound); + + OV_ERROR_UNLESS_KRF(newID != CIdentifier::undefined(), INTERFACOR_TYPE_TO_NAME.at(interfacorType) << " identifier can not be undefined", + ErrorType::BadArgument); + + CIdentifier oldIdentifier = CIdentifier::undefined(); + this->getInterfacorIdentifier(interfacorType, index, oldIdentifier); + + if (oldIdentifier != newID) + { + // identifier key update is necessary + const auto it = m_interfacorIDToIdx.at(interfacorType).find(newID); + OV_ERROR_UNLESS_KRF(it == m_interfacorIDToIdx.at(interfacorType).end(), + "Conflict in " << INTERFACOR_TYPE_TO_NAME.at(interfacorType) << + " identifiers. An entity with the same identifier exists.", + ErrorType::ResourceNotFound); + m_interfacors[interfacorType][index]->m_ID = newID; + m_interfacorIDToIdx[interfacorType][newID] = index; + // remove the old identifier key + const auto itOld = m_interfacorIDToIdx[interfacorType].find(oldIdentifier); + if (itOld != m_interfacorIDToIdx[interfacorType].end()) { m_interfacorIDToIdx[interfacorType].erase(itOld); } + } + return true; + } + + //*/ + + bool acceptVisitor(IObjectVisitor& rObjectVisitor) override + { + CObjectVisitorContext context(this->getKernelContext()); + return rObjectVisitor.processBegin(context, *this) && rObjectVisitor.processEnd(context, *this); + } + +protected: + + void clearBox() + { + m_boxAlgorithmDesc = nullptr; + m_algorithmClassID = CIdentifier::undefined(); + m_name = ""; + m_interfacors[Input].clear(); + m_interfacors[Output].clear(); + m_interfacors[Setting].clear(); + m_interfacorIDToIdx[Input].clear(); + m_interfacorNameToIdx[Input].clear(); + m_interfacorIDToIdx[Output].clear(); + m_interfacorNameToIdx[Output].clear(); + m_interfacorIDToIdx.at(Setting).clear(); + m_interfacorNameToIdx.at(Setting).clear(); + + this->removeAllAttributes(); + } + + void enableNotification() { m_isNotificationActive = true; } + void disableNotification() { m_isNotificationActive = false; } + + void notify(const EBoxModification eBoxModificationType, const size_t index) + { + if (m_boxListener && !m_isNotifyingDesc && m_isNotificationActive) + { + CBoxListenerContext context(this->getKernelContext(), *this, index); + m_isNotifyingDesc = true; + m_boxListener->process(context, eBoxModificationType); + m_isNotifyingDesc = false; + } + } + + void notify(const EBoxModification boxModification) { this->notify(boxModification, 0xffffffff); } + + _IsDerivedFromClass_Final_(TAttributable>, OVK_ClassId_Kernel_Scenario_Box) + + CString getUnusedName(const std::map& nameToIndex, const CString& suggestedName) const + { + size_t idx = 1; + CString newName; + auto it = nameToIndex.find(suggestedName); + do + { + newName = suggestedName; + if (it != nameToIndex.end()) + { + newName += "(" + CString(std::to_string(idx).c_str()) + ")"; + it = nameToIndex.find(newName); + idx++; + } + } while (it != nameToIndex.end()); + return newName; + } + + IScenario* m_ownerScenario = nullptr; + const Plugins::IBoxAlgorithmDesc* m_boxAlgorithmDesc = nullptr; + Plugins::IBoxListener* m_boxListener = nullptr; + bool m_isNotifyingDesc = false; + bool m_isNotificationActive = true; + bool m_isObserverNotificationActive = true; + + CIdentifier m_identifier = CIdentifier::undefined(); + CIdentifier m_algorithmClassID = CIdentifier::undefined(); + CString m_name = "unnamed"; + + std::map> m_interfacorIDToIdx; + std::map> m_interfacorNameToIdx; + + //to avoid having to recheck every setting every time + //careful to update at each setting modification + std::vector m_modifiableSettingIndexes; + + std::vector m_supportInputTypes; + std::vector m_supportOutputTypes; +private: + std::map>> m_interfacors; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/ovk_base.h b/Masterarbeit/openvibe/sdk-master/kernel/src/ovk_base.h new file mode 100644 index 0000000..46ae94d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/ovk_base.h @@ -0,0 +1,4 @@ +#pragma once + +#include "ovk_defines.h" +#include "ovk_tools.h" diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/ovk_defines.h b/Masterarbeit/openvibe/sdk-master/kernel/src/ovk_defines.h new file mode 100755 index 0000000..d686dc9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/ovk_defines.h @@ -0,0 +1,114 @@ +#pragma once + +// Global Class Identifiers +//--------------------------------------------------------------------------------------------------- +#define OVK_ClassId_KernelDesc OpenViBE::CIdentifier(0x02F2D050, 0x25CD9EE5) + +// Kernel Class Identifiers +//--------------------------------------------------------------------------------------------------- +#define OVK_ClassId_Kernel_KernelObjectT OpenViBE::CIdentifier(0x672AE465, 0x60CB46D8) +#define OVK_ClassId_Kernel_KernelObjectFactory OpenViBE::CIdentifier(0x7D380DFA, 0x1B33AE2F) +#define OVK_ClassId_Kernel_KernelContext OpenViBE::CIdentifier(0x72D4050C, 0x543DDAD8) +#define OVK_ClassId_Kernel_TypeManager OpenViBE::CIdentifier(0x11D27788, 0x0602030A) + +#define OVK_ClassId_Kernel_Algorithm_AlgorithmProxy OpenViBE::CIdentifier(0x7C741F2F, 0x24314CFF) +#define OVK_ClassId_Kernel_Algorithm_AlgorithmContext OpenViBE::CIdentifier(0xBE3E7F65, 0x2752D79E) +#define OVK_ClassId_Kernel_Algorithm_AlgorithmManager OpenViBE::CIdentifier(0xA75B6AA8, 0xEE0A25A4) +#define OVK_ClassId_Kernel_Algorithm_AlgorithmProto OpenViBE::CIdentifier(0x3C83B501, 0xD5992078) + +#define OVK_ClassId_Kernel_Config_ConfigManager OpenViBE::CIdentifier(0xE483786B, 0xA464DD55) + +#define OVK_ClassId_Kernel_Log_LogManager OpenViBE::CIdentifier(0x1FE5CF01, 0x0B2B3748) +#define OVK_ClassId_Kernel_Log_LogListenerConsole OpenViBE::CIdentifier(0x1EEB056C, 0x373C17C7) +#define OVK_ClassId_Kernel_Log_LogListenerFile OpenViBE::CIdentifier(0x6A7FCB0C, 0xC847976D) +#define OVK_ClassId_Kernel_Log_LogListenerDebug OpenViBE::CIdentifier(0x45C1A72F, 0x647DE336) +#define OVK_ClassId_Kernel_Log_LogListenerNull OpenViBE::CIdentifier(0x1341E7E6, 0x2232EB75) + +#define OVK_ClassId_Kernel_Error_ErrorManager OpenViBE::CIdentifier(0xB4F8AA7C, 0x286FE5C6) +#define OVK_ClassId_Kernel_Error_Error OpenViBE::CIdentifier(0xA52EA1C9, 0xC14FC982) + +#define OVK_ClassId_Kernel_Plugins_PluginManager OpenViBE::CIdentifier(0x07DB32AD, 0x76FAD392) +#define OVK_ClassId_Kernel_Plugins_PluginModule OpenViBE::CIdentifier(0x34883FDB, 0x78B6D1E6) +#define OVK_ClassId_Kernel_Plugins_PluginModuleContext OpenViBE::CIdentifier(0x78071145, 0x308261A2) +#define OVK_ClassId_Kernel_Plugins_PluginObject OpenViBE::CIdentifier(0x718F6C0B, 0x368B2E6C) +#define OVK_ClassId_Kernel_Plugins_PluginObjectDesc OpenViBE::CIdentifier(0x65853ECE, 0x6E203E71) + +#define OVK_ClassId_Kernel_Metaboxes_MetaboxManager OpenViBE::CIdentifier(0x07DB34DA, 0xF67AD392) +#define OVK_ClassId_Kernel_Metaboxes_MetaboxObjectDesc OpenViBE::CIdentifier(0x100E6855, 0xFF905FEA) + +#define OVK_ClassId_Kernel_Player_BoxAlgorithmContext OpenViBE::CIdentifier(0x48078FB2, 0x1897AD5A) +#define OVK_ClassId_Kernel_Player_DynamicBoxContext OpenViBE::CIdentifier(0x18FC58E0, 0x505E97CD) +#define OVK_ClassId_Kernel_Player_MessageT OpenViBE::CIdentifier(0x42A56E80, 0x289CBB09) +#define OVK_ClassId_Kernel_Player_MessageClock OpenViBE::CIdentifier(0x3AA34472, 0x2B1F67CB) +#define OVK_ClassId_Kernel_Player_Player OpenViBE::CIdentifier(0x7C8777FF, 0x52CE89C2) +#define OVK_ClassId_Kernel_Player_PlayerContext OpenViBE::CIdentifier(0x76A544A0, 0x01F508ED) +#define OVK_ClassId_Kernel_Player_PlayerManager OpenViBE::CIdentifier(0x4A46A96D, 0x6D4957C5) +#define OVK_ClassId_Kernel_Player_SimulatedBox OpenViBE::CIdentifier(0x74D37E85, 0x73952B1D) +#define OVK_ClassId_Kernel_Player_StaticBoxContext OpenViBE::CIdentifier(0x59B7AE07, 0x4A6FE704) +#define OVK_ClassId_Kernel_Player_Scheduler OpenViBE::CIdentifier(0x39A9093F, 0x363DDB65) + +#define OVK_ClassId_Kernel_Scenario_AttributableT OpenViBE::CIdentifier(0x6F4071A4, 0x31183474) +#define OVK_ClassId_Kernel_Scenario_Box OpenViBE::CIdentifier(0x715A25DC, 0x5322E94C) +#define OVK_ClassId_Kernel_Scenario_BoxUpdater OpenViBE::CIdentifier(0x65E887AD, 0x25FA9EEF) +#define OVK_ClassId_Kernel_Scenario_Comment OpenViBE::CIdentifier(0xFD134BE1, 0x32BEC860) +#define OVK_ClassId_Kernel_Scenario_Metadata OpenViBE::CIdentifier(0xFC6AAE55, 0x7965FA25) +#define OVK_ClassId_Kernel_Scenario_BoxListenerContext OpenViBE::CIdentifier(0x6EBE7BA6, 0xF8C13ACA) +#define OVK_ClassId_Kernel_Scenario_BoxProto OpenViBE::CIdentifier(0x290EDACD, 0x6D08F87D) +#define OVK_ClassId_Kernel_Scenario_Link OpenViBE::CIdentifier(0x118EF337, 0x095F5A5E) + +#define OVK_ClassId_Kernel_Scenario_Scenario OpenViBE::CIdentifier(0x4215A6BF, 0x6F4E5F96) +#define OVK_ClassId_Kernel_Scenario_ScenarioManager OpenViBE::CIdentifier(0x5BB96551, 0x133303F9) +#define OVK_ClassId_Kernel_Scenario_ScenarioExporterContext OpenViBE::CIdentifier(0x78606B83, 0x5EB11EC9) +#define OVK_ClassId_Kernel_Scenario_ScenarioImporterContext OpenViBE::CIdentifier(0x17DC0F51, 0x795A3A7E) + +#define OVK_ClassId_Kernel_ObjectVisitorContext OpenViBE::CIdentifier(0x7F6010A3, 0x17F4F20A) + +// Tools Class Identifiers +//--------------------------------------------------------------------------------------------------- +#define OVK_ClassId_Tools_ScopeTester OpenViBE::CIdentifier(0x5978C732, 0x5903C7A2) +#define OVK_ClassId_Tools_KernelObjectFactoryHelper OpenViBE::CIdentifier(0x6059EA7C, 0x081FDAB5) +#define OVK_ClassId_Tools_BoxProxyT OpenViBE::CIdentifier(0x4DFDFCE4, 0x49EF078E) +#define OVK_ClassId_Tools_BoxIOProxyT OpenViBE::CIdentifier(0x25476613, 0x331633DA) + +#define OVK_ClassId_Kernel_Configurable OpenViBE::CIdentifier(0x1C1D34A4, 0x2EAB9FA1) +#define OVK_ClassId_Kernel_ConfigurableT OpenViBE::CIdentifier(0x6500E672, 0x7520EB07) +#define OVK_ClassId_Kernel_ParameterT OpenViBE::CIdentifier(0x6DF62060, 0x65A40A62) +#define OVK_ClassId_Kernel_UIntegerParameter OpenViBE::CIdentifier(0x665A47DC, 0x650630EE) +#define OVK_ClassId_Kernel_IntegerParameter OpenViBE::CIdentifier(0x52DA0F06, 0x45155D4F) +#define OVK_ClassId_Kernel_EnumerationParameter OpenViBE::CIdentifier(0x1825F2CA, 0x5589B8E2) +#define OVK_ClassId_Kernel_BooleanParameter OpenViBE::CIdentifier(0x4E79D376, 0x151D2473) +#define OVK_ClassId_Kernel_FloatParameter OpenViBE::CIdentifier(0x37B24229, 0x6A053984) +#define OVK_ClassId_Kernel_StringParameter OpenViBE::CIdentifier(0x4AA96293, 0x2B76B89C) +#define OVK_ClassId_Kernel_IdentifierParameter OpenViBE::CIdentifier(0x1C4D8B4C, 0x67CFF22B) +#define OVK_ClassId_Kernel_MatrixParameter OpenViBE::CIdentifier(0xB1C67A8B, 0xED6BD64D) +#define OVK_ClassId_Kernel_StimulationSetParameter OpenViBE::CIdentifier(0x758D94E1, 0x40F42B99) +#define OVK_ClassId_Kernel_MemoryBufferParameter OpenViBE::CIdentifier(0x8E21C24F, 0xD77B7E6D) +#define OVK_ClassId_Kernel_ObjectParameter OpenViBE::CIdentifier(0x5A9CB52C, 0x7F02D159) +#define OVK_ClassId_Kernel_PointerParameter OpenViBE::CIdentifier(0x29BDDFF0, 0x85B669E2) + +// API Definition +//--------------------------------------------------------------------------------------------------- +// Taken from +// - http://people.redhat.com/drepper/dsohowto.pdf +// - http://www.nedprod.com/programs/gccvisibility.html +#if defined OVK_Shared +#if defined TARGET_OS_Windows +#define OVK_API_Export __declspec(dllexport) +#define OVK_API_Import __declspec(dllimport) +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + #define OVK_API_Export __attribute__((visibility("default"))) + #define OVK_API_Import __attribute__((visibility("default"))) +#else + #define OVK_API_Export + #define OVK_API_Import +#endif +#else + #define OVK_API_Export + #define OVK_API_Import +#endif + +#if defined OVK_Exports +#define OVK_API OVK_API_Export +#else + #define OVK_API OVK_API_Import +#endif diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/ovk_main.cpp b/Masterarbeit/openvibe/sdk-master/kernel/src/ovk_main.cpp new file mode 100644 index 0000000..7f88d4c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/ovk_main.cpp @@ -0,0 +1,46 @@ +#include "kernel/ovkCKernelContext.h" + +#include +#include + +namespace OpenViBE { +namespace Kernel { +class CKernelDesc final : public IKernelDesc +{ +public: + IKernelContext* createKernel(const CString& rApplicationName, const CString& rConfigurationFilename) override + { + return new CKernelContext(nullptr, rApplicationName, rConfigurationFilename); + } + + IKernelContext* createKernel(const IKernelContext& masterKernelCtx, const CString& applicationName, const CString& configFilename) + override { return new CKernelContext(&masterKernelCtx, applicationName, configFilename); } + + void releaseKernel(IKernelContext* pKernelContext) override { delete pKernelContext; } + CString getName() const override { return "OpenViBE Kernel Implementation"; } + CString getAuthorName() const override { return "Yann Renard"; } + CString getAuthorCompanyName() const override { return "INRIA/IRISA"; } + CString getShortDescription() const override { return "OpenViBE Kernel Implementation"; } + CString getDetailedDescription() const override { return "OpenViBE Kernel Implementation"; } + CString getVersion() const override { return "0.5"; } + + _IsDerivedFromClass_Final_(IKernelDesc, OVK_ClassId_KernelDesc) +}; + +static CKernelDesc gKernelDesc; + +extern "C" { + +OVK_API bool onInitialize() { return true; } +OVK_API bool onUninitialize() { return true; } + +OVK_API bool onGetKernelDesc(IKernelDesc*& rpKernelDesc) +{ + rpKernelDesc = &gKernelDesc; + return true; +} + +} + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/ovk_tools.h b/Masterarbeit/openvibe/sdk-master/kernel/src/ovk_tools.h new file mode 100644 index 0000000..8d465b0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/ovk_tools.h @@ -0,0 +1,6 @@ +#pragma once + +#include "tools/ovkCKernelObjectFactoryHelper.h" +#include "tools/ovkCScopeTester.h" + +#include "tools/ovk_identifier_map_iterator.h" diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/tools/ovkCKernelObjectFactoryHelper.h b/Masterarbeit/openvibe/sdk-master/kernel/src/tools/ovkCKernelObjectFactoryHelper.h new file mode 100644 index 0000000..7f88827 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/tools/ovkCKernelObjectFactoryHelper.h @@ -0,0 +1,37 @@ +#pragma once + +#include + +namespace OpenViBE { +namespace Tools { +class CKernelObjectFactoryHelper final : public IObject +{ +public: + + explicit CKernelObjectFactoryHelper(Kernel::IKernelObjectFactory& rKernelObjectFactory) + : m_rKernelObjectFactory(rKernelObjectFactory) { } + + template + T createObject(const CIdentifier& classID) + { + IObject* obj = m_rKernelObjectFactory.createObject(classID); + T res = dynamic_cast(obj); + if (obj && !res) { m_rKernelObjectFactory.releaseObject(obj); } + return res; + } + + template + bool releaseObject(T tObject) { return m_rKernelObjectFactory.releaseObject(tObject); } + + _IsDerivedFromClass_Final_(IObject, OVK_ClassId_Tools_KernelObjectFactoryHelper) + +protected: + + Kernel::IKernelObjectFactory& m_rKernelObjectFactory; + +private: + + CKernelObjectFactoryHelper(); +}; +} // namespace Tools +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/tools/ovkCScopeTester.h b/Masterarbeit/openvibe/sdk-master/kernel/src/tools/ovkCScopeTester.h new file mode 100644 index 0000000..4fc1ae5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/tools/ovkCScopeTester.h @@ -0,0 +1,25 @@ +#pragma once + +#include "../ovk_base.h" + +#include + +namespace OpenViBE { +namespace Tools { +class CScopeTester final : public IObject +{ +public: + + CScopeTester(const Kernel::IKernelContext& ctx, const CString& prefix) + : m_prefix(prefix), m_kernelCtx(ctx) { m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "## CScopeTester [" << m_prefix << "] enter\n"; } + ~CScopeTester() override { m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "## CScopeTester [" << m_prefix << "] leave\n"; } + + _IsDerivedFromClass_Final_(IObject, OVK_ClassId_Tools_ScopeTester) + +protected: + + CString m_prefix; + const Kernel::IKernelContext& m_kernelCtx; +}; +} // namespace Tools +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/tools/ovkSBoxProto.h b/Masterarbeit/openvibe/sdk-master/kernel/src/tools/ovkSBoxProto.h new file mode 100755 index 0000000..8f87add --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/tools/ovkSBoxProto.h @@ -0,0 +1,155 @@ +#pragma once + +#include +#include + +namespace OpenViBE { +namespace Kernel { + +struct SBoxProto final : IBoxProto +{ + SBoxProto(ITypeManager& typeManager) : m_TypeManager(typeManager) { } + + bool addInput(const CString& /*name*/, const CIdentifier& typeID, const CIdentifier& id, const bool /*notify*/) override + { + uint64_t v = typeID.id(); + swap_byte(v, m_inputCountHash); + swap_byte(m_inputCountHash, 0x7936A0F3BD12D936LL); + m_hash = m_hash.id() ^ v; + if (id != CIdentifier::undefined()) + { + v = id.id(); + swap_byte(v, 0x2BD1D158F340014D); + m_hash = m_hash.id() ^ v; + } + return true; + } + + bool addOutput(const CString& /*name*/, const CIdentifier& typeID, const CIdentifier& id, const bool /*notify*/) override + { + uint64_t v = typeID.id(); + swap_byte(v, m_outputCountHash); + swap_byte(m_outputCountHash, 0xCBB66A5B893AA4E9LL); + m_hash = m_hash.id() ^ v; + if (id != CIdentifier::undefined()) + { + v = id.id(); + swap_byte(v, 0x87CA0F5EFC4FAC68); + m_hash = m_hash.id() ^ v; + } + return true; + } + + bool addSetting(const CString& /*name*/, const CIdentifier& typeID, const CString& /*defaultValue*/, const bool /*modifiable*/, const CIdentifier& id, + const bool /*notify*/) override + { + uint64_t v = typeID.id(); + swap_byte(v, m_settingCountHash); + swap_byte(m_settingCountHash, 0x3C87F3AAE9F8303BLL); + m_hash = m_hash.id() ^ v; + if (id != CIdentifier::undefined()) + { + v = id.id(); + swap_byte(v, 0x17185F7CDA63A9FA); + m_hash = m_hash.id() ^ v; + } + return true; + } + + bool addInputSupport(const CIdentifier& typeID) override + { + uint64_t v = typeID.id(); + swap_byte(v, m_outputCountHash); + swap_byte(m_outputCountHash, 0xCBB66A5B893AA4E9LL); + m_hash = m_hash.id() ^ v; + return true; + } + + bool addInputAndDerivedSupport(const CIdentifier& typeID) + { + uint64_t v = typeID.id(); + swap_byte(v, m_outputCountHash); + swap_byte(m_outputCountHash, 0xCBB66A5B893AA4E9LL); + m_hash = m_hash.id() ^ v; + return true; + } + + bool addOutputSupport(const CIdentifier& typeID) override + { + uint64_t v = typeID.id(); + swap_byte(v, m_outputCountHash); + swap_byte(m_outputCountHash, 0xCBB66A5B893AA4E9LL); + m_hash = m_hash.id() ^ v; + return true; + } + + bool addOutputAndDerivedSupport(const CIdentifier& typeID) + { + uint64_t v = typeID.id(); + swap_byte(v, m_outputCountHash); + swap_byte(m_outputCountHash, 0xCBB66A5B893AA4E9LL); + m_hash = m_hash.id() ^ v; + return true; + } + + bool addFlag(const EBoxFlag flag) override + { + switch (flag) + { + case BoxFlag_CanAddInput: m_hash = m_hash.id() ^ CIdentifier(0x07507AC8, 0xEB643ACE).id(); + break; + case BoxFlag_CanModifyInput: m_hash = m_hash.id() ^ CIdentifier(0x5C985376, 0x8D74CDB8).id(); + break; + case BoxFlag_CanAddOutput: m_hash = m_hash.id() ^ CIdentifier(0x58DEA69B, 0x12411365).id(); + break; + case BoxFlag_CanModifyOutput: m_hash = m_hash.id() ^ CIdentifier(0x6E162C01, 0xAC979F22).id(); + break; + case BoxFlag_CanAddSetting: m_hash = m_hash.id() ^ CIdentifier(0xFA7A50DC, 0x2140C013).id(); + break; + case BoxFlag_CanModifySetting: m_hash = m_hash.id() ^ CIdentifier(0x624D7661, 0xD8DDEA0A).id(); + break; + case BoxFlag_IsDeprecated: m_isDeprecated = true; + break; + default: + return false; + } + return true; + } + + bool addFlag(const CIdentifier& flagId) override + { + const uint64_t value = m_TypeManager.getEnumerationEntryValueFromName(OV_TypeId_BoxAlgorithmFlag, flagId.toString()); + if (value == CIdentifier::undefined().id()) { return false; } + // Flags do not modify internal hash + //m_hash=m_hash.id() ^ flagId.id(); + return true; + } + + void swap_byte(uint64_t& v, const uint64_t s) + { + uint8_t v2[sizeof(v)]; + uint8_t s2[sizeof(s)]; + System::Memory::hostToLittleEndian(v, v2); + System::Memory::hostToLittleEndian(s, s2); + for (size_t i = 0; i < sizeof(s); i += 2) + { + const size_t j = s2[i] % sizeof(v); + const size_t k = s2[i + 1] % sizeof(v); + const uint8_t t = v2[j]; + v2[j] = v2[k]; + v2[k] = t; + } + System::Memory::littleEndianToHost(v2, &v); + } + + _IsDerivedFromClass_Final_(IBoxProto, CIdentifier::undefined()) + + CIdentifier m_hash = CIdentifier::undefined(); + bool m_isDeprecated = false; + uint64_t m_inputCountHash = 0x64AC3CB54A35888CLL; + uint64_t m_outputCountHash = 0x21E0FAAFE5CAF1E1LL; + uint64_t m_settingCountHash = 0x6BDFB15B54B09F63LL; + ITypeManager& m_TypeManager; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/tools/ovk_identifier_map_iterator.h b/Masterarbeit/openvibe/sdk-master/kernel/src/tools/ovk_identifier_map_iterator.h new file mode 100644 index 0000000..31f3e74 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/tools/ovk_identifier_map_iterator.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +#include + +template +OpenViBE::CIdentifier getNextIdentifier(const std::map& map, const OpenViBE::CIdentifier& previousID) +{ + typename std::map::const_iterator it; + + if (previousID == OpenViBE::CIdentifier::undefined()) { it = map.begin(); } + else + { + it = map.find(previousID); + if (it == map.end()) { return OpenViBE::CIdentifier::undefined(); } + ++it; + } + + return it != map.end() ? it->first : OpenViBE::CIdentifier::undefined(); +} diff --git a/Masterarbeit/openvibe/sdk-master/kernel/src/tools/ovk_setting_checker.h b/Masterarbeit/openvibe/sdk-master/kernel/src/tools/ovk_setting_checker.h new file mode 100644 index 0000000..0fec4e8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/kernel/src/tools/ovk_setting_checker.h @@ -0,0 +1,55 @@ +#pragma once + +#include "lepton/Lepton.h" +#include "../ovk_base.h" + +#include +#include +#include +#include +#include + +// because std::tolower has multiple signatures, +// it can not be easily used in std::transform +// this workaround is taken from http://www.gcek.net/ref/books/sw/cpp/ticppv2/ +template +TCharT ToLower(TCharT c) { return std::tolower(c); } + +/** +* \brief Check the setting value (if the setting is numeric), +* test if it is a correct arithmetic expression, should be used after +* retrieving the value with "getSettingValue" +* \param value [in] : The value of setting to check +* \param typeID [in] : The type of setting to check +* \param typeManager [in] : +* \return \e true in case of success (numeric value is well formed). +* \return \e false in case of error. In such case, +* \c value remains unchanged. +*/ +inline bool checkSettingValue(const OpenViBE::CString& value, const OpenViBE::CIdentifier& typeID, const OpenViBE::Kernel::ITypeManager& typeManager) +{ + if (typeManager.isEnumeration(typeID)) + { + const auto enumerationEntryValue = typeManager.getEnumerationEntryValueFromName(typeID, value); + const auto enumerationEntryReversedName = typeManager.getEnumerationEntryNameFromValue(typeID, enumerationEntryValue); + // We need to compare the reversed name of the enumerations because some enumeration values actually use max int + // which is the same value as the guard value for incorrect stimulations + if (enumerationEntryValue == OV_IncorrectStimulation && enumerationEntryReversedName != value) { return false; } + } + else if (typeID == OV_TypeId_Float || typeID == OV_TypeId_Integer) + { + // If the token is a numeric value, it may be an arithmetic operation + // parse and expression with no variables or functions + try { Lepton::Parser::parse(value.toASCIIString()).evaluate(); } + catch (...) { return false; } + } + else if (typeID == OV_TypeId_Boolean) + { + std::string val = value.toASCIIString(); + std::transform(val.begin(), val.end(), val.begin(), ::ToLower); + + if (!(val == "true" || val == "on" || val == "1" || val == "false" || val == "off" || val == "0")) { return false; } + } + //TODO: else + return true; +} diff --git a/Masterarbeit/openvibe/sdk-master/modules/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/modules/CMakeLists.txt new file mode 100644 index 0000000..2587340 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/CMakeLists.txt @@ -0,0 +1,7 @@ +OV_SET_CUSTOM_DOCUMENTATION("ebml" "EBML parser and formater library" "src" "include") +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("MODULES") + +# Sort target into directories for better visualization in IDE +SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON) +SET(MODULES_FOLDER Modules) \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/modules/communication/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/modules/communication/CMakeLists.txt new file mode 100644 index 0000000..c11b672 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/communication/CMakeLists.txt @@ -0,0 +1,52 @@ +PROJECT(openvibe-module-communication) + +INCLUDE_DIRECTORIES("include/communication/") + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp include/*.h include/*.hpp) + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER} + COMPILE_FLAGS "-DCommunication_Shared -DCommunication_Exports") + +ADD_LIBRARY(${PROJECT_NAME}-static STATIC ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME}-static PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER} + COMPILE_FLAGS "-DCommunication_Static -DCommunication_Exports") + +IF(UNIX) + SET_TARGET_PROPERTIES(${PROJECT_NAME}-static PROPERTIES COMPILE_FLAGS "-fPIC") +ENDIF(UNIX) + +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEModuleSocket") + +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) +INSTALL(TARGETS ${PROJECT_NAME}-static + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY include/ DESTINATION ${DIST_INCLUDEDIR}) + +# Link the socket library to the static version of lib-communication + +SET(PROJECT_NAME ${PROJECT_NAME}-static) +SET(DYNAMIC_LINK_OPENVIBE_SDK false) +INCLUDE("FindOpenViBEModuleSocket") + + +#add_subdirectory(test) diff --git a/Masterarbeit/openvibe/sdk-master/modules/communication/include/communication/defines.h b/Masterarbeit/openvibe/sdk-master/modules/communication/include/communication/defines.h new file mode 100644 index 0000000..3c13ab6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/communication/include/communication/defines.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +#if defined Communication_Shared +# if defined TARGET_OS_Windows +# define Communication_API_Export __declspec(dllexport) +# define Communication_API_Import __declspec(dllimport) +# elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS +# define Communication_API_Export __attribute__((visibility("default"))) +# define Communication_API_Import __attribute__((visibility("default"))) +# else +# define Communication_API_Export +# define Communication_API_Import +# endif +#else +# define Communication_API_Export +# define Communication_API_Import +#endif + +#if defined Communication_Exports +# define Communication_API Communication_API_Export +#else +# define Communication_API Communication_API_Import +#endif diff --git a/Masterarbeit/openvibe/sdk-master/modules/communication/include/communication/ovCMessaging.h b/Masterarbeit/openvibe/sdk-master/modules/communication/include/communication/ovCMessaging.h new file mode 100644 index 0000000..e2b1722 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/communication/include/communication/ovCMessaging.h @@ -0,0 +1,323 @@ +#pragma once + +#include + +#include "defines.h" +#include "ovCMessagingProtocol.h" + +namespace Communication { +/** + * \brief The purpose of this class is to provide a communication protocol to exchange EBML between a client and a server. + */ +class Communication_API CMessaging +{ +public: + + /** + * \brief Library error codes + */ + enum ELibraryError + { + NoError = 0, + Socket_NotConnected = 1, + Socket_FailedToConnect = 2, + Socket_ReceiveBufferFail = 3, + Socket_SendBufferFail = 4, + Socket_NoIncomingClientConnection = 6, + Socket_NotReadyToSend = 7, + Socket_NoDataReceived = 8, + Socket_FailedCloseClientConnection = 10, + Socket_FailedToCloseConnection = 11, + Socket_FailedConnectClient = 12, + Socket_ClientAlreadyConnected = 13, + Deserialize_BufferTooSmall = 30, + Deserialize_Header = 31, + Deserialize_ProtocolVersionMessage = 32, + Deserialize_BoxDescriptionMessage = 33, + Deserialize_EBMLMessage = 34, + Deserialize_EndMessage = 35, + Deserialize_ErrorMessage = 36, + Deserialize_LogMessage = 37, + Deserialize_AuthenticationMessage = 38, + Deserialize_MessageTypeNotSupported = 39, + BoxDescriptionAlreadyReceived = 60, + BoxDescriptionNotReceived = 61, + BadAuthenticationReceived = 70, + NoAuthenticationReceived = 71, + ThreadJoinFailed = 80 + }; + + CMessaging(); + virtual ~CMessaging(); + + /** + * \brief Get the code of the last error produced by the API + * + * \retval Error code + */ + ELibraryError getLastError() const; + + /** + * \brief Give a short description of an error. + * + * \param error the error code + * + * \return Description of the error. + */ + static std::string getErrorString(ELibraryError error); + + /** + * \brief Check that the socket is connected. + * + * \retval True if the socket is connected. + * \retval False if the socket is not connected. + */ + bool isConnected() const; + + /** + * \brief Check that the synchronization is in error state. + * + * \retval True if the synchronization is in error state. + * \retval False if the synchronization is ok. + */ + bool isInErrorState() const; + + /** + * \brief Set the connection ID to a new value + * \param connectionID The connection Id to set + */ + void setConnectionID(const std::string& connectionID) const; + + /** + * \brief Check that a End message was received. + * + * \retval True if the end message from the client is received. + * \retval False if the end message from the client is not received. + */ + virtual bool isEndReceived(); + + /** + * \brief Get the time. + */ + virtual uint64_t getTime(); + +protected: + + /** + * \brief Push a message to the send buffer. + * The message will be really sent in the socket in the next synchronization. + * + * \param message The message to send. + * + * \retval True if it succeeds. + * \retval False if library is in error state. + */ + bool pushMessage(const Message& message) const; + + /** + * \brief Set the last error code. + * + * \param libraryError The error + * + * \sa getLastError + */ + void setLastError(ELibraryError libraryError) const; + + /** + * \brief Provide the connection to the base class to communicate. + * + * \param connection The connection + */ + void setConnection(Socket::IConnection* connection) const; + + /** + * \brief Start a thread that will push the outgoing data, pull and process the incoming data. + * This sync will be stopped in cases: + * - An error raised + * - stopSyncing() function was called. + * + * \retval True if it succeeds. + * \retval False if an error occured. + * + * \sa stopSyncing + */ + bool startSyncing(); + + /** + * \brief Request to stop the sync and stop the thread. + * + * \retval True if it succeeds. + * \retval False if an error occured. + * + * \sa startSyncing + */ + bool stopSyncing() const; + + /** + * @brief Get the oldest authentication message + * @param id[out] Identifier of the message + * @param connectionID[out] Connection Id + * @return true if a message was popped, false if the queue is empty + */ + virtual bool popAuthentication(uint64_t& id, std::string& connectionID); + + /** + * @brief Get the oldest box description message + * @param id[out] Identifier of the message + * @param boxDescription[out] Descriptor of the box + * @return true if a message was popped, false if the queue is empty + */ + virtual bool popBoxDescriptions(uint64_t& id, BoxDescriptionMessage& boxDescription); + + /** + * @brief popCommunicationProtocolVersion + * @param id[out] Identifier of the message + * @param majorVersion[out] major version of the protocol + * @param minorVersion[out] minor version of the protocol + * @return true if a message was popped, false if the queue is empty + */ + virtual bool popCommunicationProtocolVersion(uint64_t& id, uint8_t& majorVersion, uint8_t& minorVersion); + + /** + * @brief Pop the oldest EBML message from the queue + * @param id[out] Identifier of the message + * @param index[out] Input index to which the EBML should be directed + * @param startTime[out] Start time of the buffer + * @param endTime[out] End time of the buffer + * @param ebml[out] The encoded EBML buffer + * @return true if a message was popped, false if the queue is empty + */ + virtual bool popEBML(uint64_t& id, size_t& index, uint64_t& startTime, uint64_t& endTime, std::shared_ptr>& ebml); + + /** + * @brief Pop the oldest log message from the queue + * @param id[out] Identifier of the message + * @param type[out] Log level of the message + * @param message[out] Message text + * @return true if a message was popped, false if the queue is empty + */ + virtual bool popLog(uint64_t& id, ELogLevel& type, std::string& message); + + /** + * @brief Pop the oldest error message from the queue + * @param id[out] Identifier of the message + * @param type[out] Error code + * @param guiltyId[out] If of the sent message that caused this error + * @return true if a message was popped, false if the queue is empty + */ + virtual bool popError(uint64_t& id, EError& type, uint64_t& guiltyId); + + /** + * @brief Get the oldes End message + * @param id[out] Identifier of the message + * @return true if a message was popped, false if the queue is empty + */ + virtual bool popEnd(uint64_t& id); + + /** + * @brief Reset the library state. Stop sending and receiving buffers, disconnect + * and empty all buffers. + */ + void reset() const; + + /** + * \brief Checks if a sync message was received and reset it if it was. + * + * This method should be used in a busy loop to check if the other + * party has finished processing all of the data. + * + * From the external program standpoint this method will return true + * when the box has finished sending all of the data that has to be + * processed in one bulk. + * + * From the box standpoint, this means that the external program has + * finished processing and sending all of the data that the box has + * sent. + * + * \retval True if a sync message is received. + * \retval False if no sync message was received. + */ + virtual bool waitForSyncMessage(); + +private: + + /** + * \brief Receive all the available data from the socket and insert it in the rcv buffer. + * + * \retval True if it succeeds. + * \retval False if an error occured. + * Library errors: TODO + * + * \sa push + */ + bool pull() const; + + /** + * \brief Send all the data to the socket. + * + * \retval True if it succeeds. + * \retval False if an error occured. + * Library errors: + * - Socket_NotConnected + * + * + * \sa push + */ + bool push() const; + + /** + * \brief Process incoming data, unpack it and put messages in queues. + * It use processBuffer. + * + * \retval True if it succeeds. + * \retval False if an error occured. + * Library errors: Error from processBuffer + * + * \sa processBuffer + */ + bool processIncomingMessages() const; + + /** + * \brief Process buffer, pack it and put messages in queues. + * + * \param buffer Buffer with the incoming serialized data. + * \param[out] byteRead Number of bytes read and processed. + * + * \retval True if it succeeds. + * \retval False if an error occured. + * Library errors: + * - Deserialize_Header + * - Deserialize_AuthenticationMessage + * - Deserialize_ProtocolVersionMessage + * - Deserialize_BoxDescriptionMessage + * - Deserialize_EBMLMessage + * - Deserialize_LogMessage + * - Deserialize_ErrorMessage + * - Deserialize_MessageTypeNotSupported + * + * \sa processIncomingMessages + */ + bool processBuffer(const std::vector& buffer, size_t& byteRead) const; + + /** + * \brief Sync fucntion that is used in a thread to pull, push and process the incoming data. + * + * \retval True if it succeeds. + * \retval False if an error occured. + * Library errors: Errors from processIncomingMessages(), push() or pull() + * + * \sa pull + * \sa push + * \sa processIncomingMessages + */ + void sync() const; + +public: + static const uint8_t s_CommunicationProtocol_MajorVersion = 1; + static const uint8_t s_CommunicationProtocol_MinorVersion = 1; + +protected: + struct SMessagingImpl; + SMessagingImpl* impl = nullptr; +}; +} // namespace Communication diff --git a/Masterarbeit/openvibe/sdk-master/modules/communication/include/communication/ovCMessagingClient.h b/Masterarbeit/openvibe/sdk-master/modules/communication/include/communication/ovCMessagingClient.h new file mode 100644 index 0000000..54430c5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/communication/include/communication/ovCMessagingClient.h @@ -0,0 +1,218 @@ +#pragma once + +#include "defines.h" +#include "ovCMessaging.h" + +#include "socket/IConnectionClient.h" + +namespace Communication { +class Communication_API MessagingClient : public CMessaging +{ +public: + + /** + * \brief Default constructor. + */ + MessagingClient(); + + /** + * \brief Destructor. + */ + ~MessagingClient() override; + + /** + * \brief Connect to a server. + * + * \param uri URI of the server. + * \param port The port. + * + * \retval True if it succeeds. + * \retval False there is no available error. + * Library errors: + * - FailedToConnect + * - NotConnected + * - NotReadyToSend + * + * \sa close + */ + bool connect(const std::string& uri, const size_t port); + + /** + * \brief Closes the connection to the server. + * + * \retval True if it succeeds. + * \retval False there is no available error. + * Library errors: + * - NotConnected + * - FailedToCloseConnection + * + * \sa getLastError + */ + bool close() const; + + /** + * \brief Return the number of box information's parameters available. + * + * \return The number of parameters available. + * + * \sa getParameter + */ + size_t getParameterCount() const; + + /** + * \brief Return the number of box information's input available. + * + * \return The number of input available. + * + * \sa getInput + */ + size_t getInputCount() const; + + /** + * \brief Return the number of output of the box information, available. + * + * \return The number of output available. + * + * \sa getOutput + */ + size_t getOutputCount() const; + + /** + * \brief Get parameter information. + * + * \param i The index. + * \param[out] id The id + * \param[out] type The type (corresponding to the OpenViBE CIdentifier) + * \param[out] name Name + * \param[out] value Value (to convert accordinf to the type) + * + * \retval True if it succeeds. + * \retval False if the index is out of range. + */ + bool getParameter(size_t i, uint64_t& id, uint64_t& type, std::string& name, std::string& value) const; + + /** + * \brief Get input information. + * + * \param i The index. + * \param[out] id The id + * \param[out] type The type (corresponding to the OpenViBE CIdentifier) + * \param[out] name Name + * + * \retval True if it succeeds. + * \retval False if the index is out of range. + * + * \sa getInputCount + */ + bool getInput(size_t i, uint64_t& id, uint64_t& type, std::string& name) const; + + /** + * \brief Get input information. + * + * \param i The index. + * \param[out] id The id + * \param[out] type The type (corresponding to the OpenViBE CIdentifier) + * \param[out] name Name + * + * \retval True if it succeeds. + * \retval False if the index is out of range. + * + * \sa getOutputCount + */ + bool getOutput(size_t i, uint64_t& id, uint64_t& type, std::string& name) const; + + /** + * \brief Get the oldest error message, if available. + * + * \param packetId + * \param[out] type The error's type. + * \param[out] guiltyId Identifier of the guilty message + * + * \retval True if it succeeds. + * \retval False there is no available error. + */ + bool popError(uint64_t& packetId, EError& type, uint64_t& guiltyId) override; + + /** + * \brief Get the oldest EBML message, if available. + * + * \param packetId + * \param[out] index Box input index. + * \param[out] startTime The start time. + * \param[out] endTime The end time. + * \param[out] ebml The EBML vector. + * + * \retval True if it succeeds. + * \retval False there is no available error. + */ + bool popEBML(uint64_t& packetId, size_t& index, uint64_t& startTime, uint64_t& endTime, std::shared_ptr>& ebml) override; + + /** + * \brief Push a log message to the server. + * + * \param logLevel The log level. + * \param log The log string message. + * + * \retval True if it succeeds. + * \retval False there is no available error. + * Library errors: + * - NotConnected + * - NotReadyToSend + * + * \sa getLastError + */ + bool pushLog(ELogLevel logLevel, const std::string& log) const; + + /** + * \brief Pushes an ebml. + * + * \param index Index of the box output. + * \param startTime The start time. + * \param endTime The endtime. + * \param ebml The ebml vector. + * + * \retval True if it succeeds. + * \retval False there is no available error. + * Library errors: + * - NotConnected + * - NotReadyToSend + * + * \sa getLastError + */ + bool pushEBML(size_t index, uint64_t startTime, uint64_t endTime, const std::shared_ptr>& ebml) const; + + /** + * \brief Push Sync message to the server. + * + * \retval True if it succeeds. + * \retval False if the library is in error state. + */ + bool pushSync() const; + + /** + * \brief Check if a sync message is received. + * + * \retval True if a sync message is received. + * \retval False if no sync message was received. + */ + bool waitForSyncMessage() override; + +private: + + /** + * \brief Pushes an authentication message). + * + * \param connectionID The connection identifier. + * + * \retval True if it succeeds. + * \retval False there is no available error. + * Library errors: + * - NotConnected + * - NotReadyToSend + */ + bool pushAuthentication(const std::string& connectionID) const; + + Socket::IConnectionClient* m_Client = nullptr; + bool m_BoxDescriptionReceived = false; +}; +} // namespace Communication diff --git a/Masterarbeit/openvibe/sdk-master/modules/communication/include/communication/ovCMessagingProtocol.h b/Masterarbeit/openvibe/sdk-master/modules/communication/include/communication/ovCMessagingProtocol.h new file mode 100644 index 0000000..69c6f48 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/communication/include/communication/ovCMessagingProtocol.h @@ -0,0 +1,424 @@ +#pragma once + +#include "defines.h" + +#include +#include +#include +#include +#include + +namespace Communication { +/** + * \brief Log level used by the client to log information in the server side + */ +enum ELogLevel : uint8_t +{ + LogLevel_Info = 1, + LogLevel_Warning = 2, + LogLevel_Error = 3, + LogLevel_Fatal = 4, + LogLevel_Max = 5, + LogLevel_Unknown = 0xFF +}; + +/** + * \brief Values that represent errors. + */ +enum EError : uint16_t +{ + Error_AuthenticationFail = 1, + Error_AuthenticationRequested = 2, + Error_InvalidOutputIndex = 3, + Error_BadCommunicationProtocol = 4, + Error_InvalidEBML = 5, + Error_InvalidLogLevel = 6, + Error_InvalidMessageType = 7, + Error_BadMessage = 8, + Error_Max = 9, + Error_Unknown = 0xFF +}; + +/** + * \brief Message type + */ +enum EMessageType : uint8_t +{ + MessageType_Authentication = 0, + MessageType_ProtocolVersion = 1, + MessageType_BoxInformation = 2, + MessageType_EBML = 3, + MessageType_Log = 4, + MessageType_End = 5, + MessageType_Error = 6, + MessageType_Time = 7, + MessageType_Sync = 8, + MessageType_Max = 9, + + MessageType_Unknown = 0xFF, +}; + +/** + * \brief A packet part is a part of a packet compound by an Header and a Message. + */ +class Communication_API CPacketPart +{ +public: + + virtual ~CPacketPart() {} + + /** + * \brief Provide array of bytes that represent the object. + * + * \return A vector with the serialized information of the message that respect the communication protocol. + * + * \sa fromBytes + */ + virtual std::vector toBytes() const = 0; + + /** + * \brief Transform bytes vector into an object. + * + * \param buffer The buffer. + * \param [in,out] bufferIndex Zero-based index of the buffer. + * + * \retval True if it succeeds + * \retval False if it fails. + * + * \sa toBytes + */ + virtual bool fromBytes(const std::vector& buffer, size_t& bufferIndex) = 0; + + /** + * \brief Query if this object is valid. + * + * \retval True if it is valid. + * \retval False if it is invalid. + */ + bool isValid() const { return m_isValid; } + +protected: + bool m_isValid = false; +}; + +/** + * \brief A message is the second part of a packet after the header. + */ +class Message : public CPacketPart +{ +public: + virtual EMessageType getMessageType() const = 0; +}; + +/** + * \brief A header is associated to a message. It give information about the message, like the type and the size. + */ +class Header final : CPacketPart +{ +public: + Header(); + Header(EMessageType type, uint64_t id, size_t size); + std::vector toBytes() const override; + void setId(const uint64_t id) { m_id = id; } + uint64_t getId() const { return m_id; } + EMessageType getType() const { return m_type; } + size_t getSize() const { return m_size; } + bool fromBytes(const std::vector& buffer, size_t& bufferIndex) override; + +private: + EMessageType m_type; + uint64_t m_id = 0; + size_t m_size = 0; + + static const size_t TYPE_SIZE = sizeof(EMessageType); + static const size_t ID_SIZE = sizeof(uint64_t); + static const size_t SIZE_SIZE = sizeof(size_t); + static const size_t TYPE_INDEX = 0; + static const size_t ID_INDEX = TYPE_INDEX + TYPE_SIZE; + static const size_t SIZE_INDEX = ID_INDEX + ID_SIZE; + static const size_t MINIMUM_SIZE = TYPE_SIZE + ID_SIZE + SIZE_SIZE; +}; + +/** + * \brief Represent an Authentication message. + */ +class AuthenticationMessage final : public Message +{ +public: + AuthenticationMessage() { m_isValid = false; } + AuthenticationMessage(const std::string& connectionID) : m_connectionID(connectionID) { m_isValid = true; } + std::vector toBytes() const override; + bool fromBytes(const std::vector& buffer, size_t& bufferIndex) override; + EMessageType getMessageType() const override { return MessageType_Authentication; } + std::string getConnectionID() const { return m_connectionID; } + +private: + static const size_t SIZE_SIZE = sizeof(size_t); + static const size_t SIZE_INDEX = 0; + static const size_t CONNECTION_ID_INDEX = SIZE_INDEX + SIZE_SIZE; + static const size_t MINIMUM_SIZE = SIZE_SIZE; + + std::string m_connectionID; +}; + +/** + * \brief This message is used to inform the server or the client about the current communication protocol version used. + */ +class CommunicationProtocolVersionMessage final : public Message +{ +public: + + CommunicationProtocolVersionMessage() { m_isValid = false; } + + CommunicationProtocolVersionMessage(const uint8_t majorVersion, const uint8_t minorVersion) : m_minorVersion(minorVersion), m_majorVersion(majorVersion) + { + m_isValid = true; + } + + std::vector toBytes() const override; + bool fromBytes(const std::vector& buffer, size_t& bufferIndex) override; + EMessageType getMessageType() const override { return MessageType_ProtocolVersion; } + uint8_t getMajorVersion() const { return m_majorVersion; } + uint8_t getMinorVersion() const { return m_minorVersion; } + +private: + uint8_t m_minorVersion = 0; + uint8_t m_majorVersion = 0; + + static const size_t MAJOR_SIZE = sizeof(uint8_t); + static const size_t MINOR_SIZE = sizeof(uint8_t); + static const size_t MAJOR_INDEX = 0; + static const size_t MINOR_INDEX = MAJOR_INDEX + MAJOR_SIZE; + static const size_t MINIMUM_SIZE = MAJOR_SIZE + MINOR_SIZE; +}; + +/** + * \brief InputOutput class describes the input or output of a box. + */ +class InputOutput final : public CPacketPart +{ +public: + InputOutput(); + InputOutput(uint64_t id, size_t type, const std::string& name); + std::vector toBytes() const override; + bool fromBytes(const std::vector& buffer, size_t& bufferIndex) override; + uint64_t getId() const { return m_id; } + size_t getType() const { return m_type; } + std::string getName() const { return m_name; } + +private: + uint64_t m_id = 0; + size_t m_type = 0; + std::string m_name; + + static const size_t ID_SIZE = sizeof(uint64_t); + static const size_t TYPE_SIZE = sizeof(size_t); + static const size_t NAME_SIZE_SIZE = sizeof(size_t); + static const size_t ID_INDEX = 0; + static const size_t TYPE_INDEX = ID_INDEX + ID_SIZE; + static const size_t NAME_SIZE_INDEX = TYPE_INDEX + TYPE_SIZE; + static const size_t NAME_INDEX = NAME_SIZE_INDEX + NAME_SIZE_SIZE; + static const size_t MINIMUM_SIZE = ID_SIZE + TYPE_SIZE + NAME_SIZE_SIZE; +}; + +class Parameter final : public CPacketPart +{ +public: + Parameter(); + Parameter(uint64_t id, size_t type, const std::string& name, const std::string& value); + std::vector toBytes() const override; + bool fromBytes(const std::vector& buffer, size_t& bufferIndex) override; + + uint64_t getId() const { return m_id; } + size_t getType() const { return m_type; } + std::string getName() const { return m_name; } + std::string getValue() const { return m_value; } + +private: + uint64_t m_id = 0; + size_t m_type = 0; + std::string m_name; + std::string m_value; + + static const size_t ID_SIZE = sizeof(uint64_t); + static const size_t TYPE_SIZE = sizeof(size_t); + static const size_t NAME_SIZE_SIZE = sizeof(size_t); + static const size_t VALUE_SIZE_SIZE = sizeof(size_t); + static const size_t ID_INDEX = 0; + static const size_t TYPE_INDEX = ID_INDEX + ID_SIZE; + static const size_t NAME_SIZE_INDEX = TYPE_INDEX + TYPE_SIZE; + static const size_t VALUE_SIZE_INDEX = NAME_SIZE_INDEX + NAME_SIZE_SIZE; + static const size_t NAME_INDEX = VALUE_SIZE_INDEX + VALUE_SIZE_SIZE; + static const size_t MINIMUM_SIZE = ID_SIZE + TYPE_SIZE + NAME_SIZE_SIZE + VALUE_SIZE_SIZE; +}; + +/** + * \brief This message contains information about the box used in the NeuroRT pipeline. + * This message is sent by the server and received by the client. + */ +class BoxDescriptionMessage final : public Message +{ +public: + std::vector toBytes() const override; + bool fromBytes(const std::vector& buffer, size_t& bufferIndex) override; + EMessageType getMessageType() const override; + bool addInput(uint64_t id, size_t type, const std::string& name); + bool addOutput(uint64_t id, size_t type, const std::string& name); + bool addParameter(uint64_t id, size_t type, const std::string& name, const std::string& value); + + const std::vector* getInputs() const { return &m_inputs; } + const std::vector* getOutputs() const { return &m_outputs; } + const std::vector* getParameters() const { return &m_parameters; } + +private: + std::vector m_inputs; + std::vector m_outputs; + std::vector m_parameters; + + static const size_t N_INPUT_SIZE = sizeof(size_t); + static const size_t N_OUTPUT_SIZE = sizeof(size_t); + static const size_t N_PARAMETER_SIZE = sizeof(size_t); + static const size_t N_INPUT_INDEX = 0; + static const size_t N_OUTPUT_INDEX = N_INPUT_INDEX + N_INPUT_SIZE; + static const size_t N_PARAMETER_INDEX = N_OUTPUT_INDEX + N_OUTPUT_SIZE; + static const size_t MINIMUM_SIZE = N_INPUT_SIZE + N_OUTPUT_SIZE + N_PARAMETER_SIZE; +}; + +/** + * \brief Log message is a way to communicate information from the client to the server. + */ +class LogMessage final : public Message +{ +public: + LogMessage(); + LogMessage(ELogLevel type, const std::string& message); + std::vector toBytes() const override; + bool fromBytes(const std::vector& buffer, size_t& bufferIndex) override; + + EMessageType getMessageType() const override { return MessageType_Log; } + ELogLevel getType() const { return m_type; } + std::string getMessage() const { return m_message; } + +private: + ELogLevel m_type; + std::string m_message; + + static const size_t TYPE_SIZE = sizeof(ELogLevel); + static const size_t SIZE_SIZE = sizeof(size_t); + static const size_t TYPE_INDEX = 0; + static const size_t SIZE_INDEX = TYPE_INDEX + TYPE_SIZE; + static const size_t NAME_INDEX = SIZE_INDEX + SIZE_SIZE; + static const size_t MINIMUM_SIZE = TYPE_SIZE + SIZE_SIZE; +}; + +/** + * \brief EBML message is used to send EBML data. + */ +class EBMLMessage final : public Message +{ +public: + EBMLMessage(); + + EBMLMessage(size_t index, uint64_t startTime, uint64_t endTime, const std::shared_ptr>& ebml); + + std::vector toBytes() const override; + + bool fromBytes(const std::vector& buffer, size_t& bufferIndex) override; + + EMessageType getMessageType() const override { return MessageType_EBML; } + size_t getIndex() const { return m_ioIdx; } + uint64_t getStartTime() const { return m_startTime; } + uint64_t getEndTime() const { return m_endTime; } + std::shared_ptr> getEBML() const { return m_EBML; } + +private: + size_t m_ioIdx = 0; + uint64_t m_startTime = 0; + uint64_t m_endTime = 0; + + std::shared_ptr> m_EBML; + + static const size_t IO_INDEX_SIZE = sizeof(size_t); + static const size_t START_TIME_SIZE = sizeof(uint64_t); + static const size_t END_TIME_SIZE = sizeof(uint64_t); + static const size_t SIZE_SIZE = sizeof(size_t); + static const size_t IO_INDEX_INDEX = 0; + static const size_t START_TIME_INDEX = IO_INDEX_INDEX + IO_INDEX_SIZE; + static const size_t END_TIME_INDEX = START_TIME_INDEX + START_TIME_SIZE; + static const size_t SIZE_INDEX = END_TIME_INDEX + END_TIME_SIZE; + static const size_t EBML_INDEX = SIZE_INDEX + SIZE_SIZE; + static const size_t MINIMUM_SIZE = IO_INDEX_SIZE + START_TIME_SIZE + END_TIME_SIZE + SIZE_SIZE; +}; + +/** + * \brief Error message is used to alert the client that the server raise an error due to a message by the client. + */ +class ErrorMessage final : public Message +{ +public: + ErrorMessage() : m_type(Error_Unknown), m_guiltyId(std::numeric_limits::max()) {} + ErrorMessage(const EError error, const uint64_t guiltyId) : m_type(error), m_guiltyId(guiltyId) {} + + std::vector toBytes() const override; + bool fromBytes(const std::vector& buffer, size_t& bufferIndex) override; + + EMessageType getMessageType() const override { return MessageType_Error; } + EError getType() const { return m_type; } + uint64_t getGuiltyId() const { return m_guiltyId; } + +private: + EError m_type; + uint64_t m_guiltyId = 0; + + static const size_t TYPE_SIZE = sizeof(EError); + static const size_t GUILTY_ID_SIZE = sizeof(uint64_t); + static const size_t TYPE_INDEX = 0; + static const size_t GUILTY_ID_INDEX = TYPE_INDEX + TYPE_SIZE; + static const size_t MINIMUM_SIZE = GUILTY_ID_SIZE + TYPE_SIZE; +}; + +/** + * \brief End message can be sent by the server or/and by the client to inform that the processing is stopped and the connection will be closed. + */ +class EndMessage final : public Message +{ +public: + EndMessage() {} + std::vector toBytes() const override { return std::vector(); } + bool fromBytes(const std::vector& /*buffer*/, size_t& /*index*/) override { return false; } + EMessageType getMessageType() const override { return MessageType_End; } +}; + +/** + * \brief Time messages are only sent by the server to inform the client about the current time of the pipeline. + */ +class TimeMessage final : public Message +{ +public: + TimeMessage(const uint64_t time = 0) : m_time(time) {} + std::vector toBytes() const override; + bool fromBytes(const std::vector& buffer, size_t& bufferIndex) override; + + EMessageType getMessageType() const override { return MessageType_Time; } + uint64_t getTime() const { return m_time; } + +private: + uint64_t m_time = 0; + + static const size_t TIME_SIZE = sizeof(uint64_t); + static const size_t TIME_INDEX = 0; + static const size_t MINIMUM_SIZE = TIME_SIZE; +}; + +/** + * \brief Sync message can be sent by the server or/and by the client to inform that it's waiting the other part. + */ +class SyncMessage final : public Message +{ +public: + SyncMessage() {} + std::vector toBytes() const override { return std::vector(); } + bool fromBytes(const std::vector& /*buffer*/, size_t& /*index*/) override { return false; } + EMessageType getMessageType() const override { return MessageType_Sync; } +}; +} // namespace Communication diff --git a/Masterarbeit/openvibe/sdk-master/modules/communication/include/communication/ovCMessagingServer.h b/Masterarbeit/openvibe/sdk-master/modules/communication/include/communication/ovCMessagingServer.h new file mode 100644 index 0000000..768cc0e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/communication/include/communication/ovCMessagingServer.h @@ -0,0 +1,185 @@ +#pragma once + +#include "defines.h" +#include "ovCMessaging.h" + +#include "socket/IConnectionServer.h" + +namespace Communication { +class Communication_API MessagingServer : public CMessaging +{ +public: + + /** + * \brief Default constructor. + */ + MessagingServer() : CMessaging(), m_Server(Socket::createConnectionServer()) {} + + /** + * \brief Destructor. + */ + ~MessagingServer() override; + + /** + * \brief Start listening on the given port. + * + * \param port The port. + * + * \retval True if listenning + * \retval False if not. + * + * \sa close + */ + bool listen(const size_t port) const { return m_Server->listen(port); } + + /** + * \brief Close the connection + * * + * \retval True if it succeeds + * \retval False if it fails. + */ + bool close(); + + /** + * \brief Accepts one incoming connection. + * + * \retval True if it succeeds. + * \retval False if it fails. + */ + bool accept(); + + /** + * \brief Returns the port on the one the server is listening. + * This is useful if you set the port to '0'. + * \param port [out]: port on the one the server is listening + */ + bool getSocketPort(size_t& port) const { return m_Server->getSocketPort(port); } + + + /** + * \brief Adds a parameter in the Box Information. + * + * \param id The parameter's identifier. + * \param type The parameter's type. Use OpenViBE::CIdentifier. + * \param name The parameter's name. + * \param value The parameter's value. A string. + * + * \retval True if it succeeds. + * \retval False if an output with the given id already exists. + * + * \sa addInput + * \sa addOutput + */ + bool addParameter(uint64_t id, size_t type, const std::string& name, const std::string& value) const; + + /** + * \brief Adds an input in the box Information. + * + * \param id The input's identifier. + * \param type The input's type. Use OpenViBE::CIdentifier. + * \param name The input's name. + * + * \retval True if it succeeds. + * \retval False if an output with the given id already exists. + * + * \sa addParameter + * \sa addOutput + */ + bool addInput(uint64_t id, size_t type, const std::string& name) const; + + /** + * \brief Adds an output in the box information. + * + * \param id The output's identifier. + * \param type The output's type. Use OpenViBE::CIdentifier. + * \param name The output's name. + * + * \retval True if it succeeds. + * \retval False if an output with the given id already exists. + * + * \sa addParameter + * \sa addInput + */ + bool addOutput(uint64_t id, size_t type, const std::string& name) const; + + /** + * \brief Get the log message received from the client. + * + * \param[out] packetId Packet id + * \param[out] type Level of the log + * \param[out] message Log message + * + * \retval True if it succeeds. + * \retval False if the library is in error state. + */ + bool popLog(uint64_t& packetId, ELogLevel& type, std::string& message) override; + + /** + * \brief Get the EBML data received from the client. + * + * \param[out] packetId Packet id + * \param[out] index Output index + * \param[out] startTime Chunk time in OpenViBE 32:32 format + * \param[out] endTime Chunk time in OpenViBE 32:32 format + * \param[out] ebml EBML data + * + * \retval True if it succeeds. + * \retval False if the library is in error state. + */ + bool popEBML(uint64_t& packetId, size_t& index, uint64_t& startTime, uint64_t& endTime, std::shared_ptr>& ebml) override; + + /** + * \brief Push Error message to the client + * + * \param error Error code + * \param guiltyId Id of the received message that raised the error. + * + * \retval True if it succeeds. + * \retval False if the library is in error state. + */ + bool pushError(EError error, uint64_t guiltyId) const; + + /** + * \brief Push EBML message to the client + * + * \param index Index of the input. + * \param startTime Chunk time in OpenViBE 32:32 format + * \param endTime Chunk time in OpenViBE 32:32 format + * \param ebml EBML data + * + * \retval True if it succeeds. + * \retval False if the library is in error state. + */ + bool pushEBML(size_t index, uint64_t startTime, uint64_t endTime, const std::shared_ptr>& ebml) const; + + /** + * \brief Push Time message to the client + * + * \param time Time in OpenViBE 32:32 format + * + * \retval True if it succeeds. + * \retval False if the library is in error state. + */ + bool pushTime(uint64_t time) { return this->pushMessage(TimeMessage(time)); } + + /** + * \brief Push Sync message to the client + * + * \retval True if it succeeds. + * \retval False if the library is in error state. + */ + bool pushSync() { return this->pushMessage(SyncMessage()); } + + /** + * \brief Check if a sync message is received. + * + * \retval True if a sync message is received. + * \retval False if no sync message was received. + */ + bool waitForSyncMessage() override { return CMessaging::waitForSyncMessage(); } + +private: + Socket::IConnectionServer* m_Server = nullptr; //< Server connection + Socket::IConnection* m_Client = nullptr; +}; +} // namespace Communication diff --git a/Masterarbeit/openvibe/sdk-master/modules/communication/src/ovCMessaging.cpp b/Masterarbeit/openvibe/sdk-master/modules/communication/src/ovCMessaging.cpp new file mode 100644 index 0000000..0a541fc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/communication/src/ovCMessaging.cpp @@ -0,0 +1,494 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ovCMessaging.h" +#include "ovCMessagingImpl.hpp" + +namespace Communication { + +static const std::map ERRORS_STRING = +{ + { CMessaging::NoError, "No error" }, + { CMessaging::Socket_NotConnected, "Not connected" }, + { CMessaging::Socket_FailedToConnect, "Failed to connect" }, + { CMessaging::Socket_ReceiveBufferFail, "Failed to receive the buffer" }, + { CMessaging::Socket_SendBufferFail, "Failed to send the buffer" }, + { CMessaging::Socket_NoIncomingClientConnection, "No incoming client connection before the timeout" }, + { CMessaging::Socket_NotReadyToSend, "Socket not ready to send the buffer" }, + { CMessaging::Socket_NoDataReceived, "No data received by the socket" }, + { CMessaging::Socket_FailedCloseClientConnection, "Failed to close the client connection" }, + { CMessaging::Socket_FailedToCloseConnection, "Failed to close the server connection" }, + { CMessaging::Socket_FailedConnectClient, "Failed to connect the client" }, + { CMessaging::Socket_ClientAlreadyConnected, "A client is already connected" }, + { CMessaging::Deserialize_BufferTooSmall, "Buffer received is too small to be unpacked" }, + { CMessaging::Deserialize_Header, "Fail to unpack the buffer to a Header" }, + { CMessaging::Deserialize_ProtocolVersionMessage, "Fail to unpack Protocol Version message" }, + { CMessaging::Deserialize_BoxDescriptionMessage, "Fail to unpack Box description message" }, + { CMessaging::Deserialize_EBMLMessage, "Fail to unpack EBML message" }, + { CMessaging::Deserialize_EndMessage, "Fail to unpack End message" }, + { CMessaging::Deserialize_ErrorMessage, "Fail to unpack error message" }, + { CMessaging::Deserialize_LogMessage, "Fail to unpack log message" }, + { CMessaging::Deserialize_AuthenticationMessage, "Fail to unpack Authentication message" }, + { CMessaging::Deserialize_MessageTypeNotSupported, "Message type not supported" }, + { CMessaging::BoxDescriptionAlreadyReceived, "Box Description already received" }, + { CMessaging::BoxDescriptionNotReceived, "Box description not received" }, + { CMessaging::BadAuthenticationReceived, "Authentication received is invalid" }, + { CMessaging::NoAuthenticationReceived, "No authentication received before the timeout" }, + { CMessaging::ThreadJoinFailed, "Failed to terminate the thread" } +}; + +CMessaging::CMessaging() +{ + impl = new SMessagingImpl(); + impl->m_nMessage = 0; + impl->m_Connection = nullptr; + impl->m_LastLibraryError = NoError; + impl->m_IsStopRequested = false; + impl->m_IsInErrorState = false; + impl->m_IsEndMessageReceived = false; +} + +CMessaging::~CMessaging() +{ + this->reset(); + delete impl; +} + +void CMessaging::reset() const +{ + this->stopSyncing(); + + impl->m_nMessage = 0; + impl->m_IsInErrorState = false; + impl->m_IsStopRequested = false; + impl->m_LastLibraryError = NoError; + + std::queue>().swap(impl->m_IncomingAuthentications); + std::queue>().swap(impl->m_IncomingCommunicationProtocolVersions); + std::queue>().swap(impl->m_IncomingBoxDescriptions); + std::queue>().swap(impl->m_IncomingEBMLs); + std::queue>().swap(impl->m_IncomingLogs); + std::queue>().swap(impl->m_IncomingErrors); + + impl->m_RcvBuffer.clear(); + impl->m_SendBuffer.clear(); + impl->m_SendBuffer.reserve(impl->s_BufferSize); + + impl->m_Connection = nullptr; +} + +CMessaging::ELibraryError CMessaging::getLastError() const { return impl->m_LastLibraryError; } +void CMessaging::setLastError(const ELibraryError libraryError) const { impl->m_LastLibraryError = libraryError; } + +bool CMessaging::push() const +{ + if (!impl->m_SendBuffer.empty() && impl->m_Connection->isReadyToSend(1)) + { + std::lock_guard lock(impl->m_SendBufferMutex); + const uint_fast32_t result = impl->m_Connection->sendBufferBlocking(impl->m_SendBuffer.data(), impl->m_SendBuffer.size()); + + if (result == 0) + { + this->setLastError(Socket_SendBufferFail); + return false; + } + + impl->m_SendBuffer.clear(); + } + + return true; +} + +bool CMessaging::pull() const +{ + if (impl->m_Connection == nullptr) + { + this->setLastError(Socket_NotConnected); + return false; + } + + while (impl->m_Connection->isReadyToReceive(1)) + { + const uint_fast32_t bytesReceived = uint_fast32_t(impl->m_Connection->receiveBuffer(impl->m_TempRcvBuffer.data(), impl->m_TempRcvBuffer.size())); + + if (bytesReceived == 0) + { + this->setLastError(Socket_ReceiveBufferFail); + return false; + } + + impl->m_RcvBuffer.insert(impl->m_RcvBuffer.end(), impl->m_TempRcvBuffer.cbegin(), impl->m_TempRcvBuffer.cbegin() + int(bytesReceived)); + } + + return true; +} + +bool CMessaging::processIncomingMessages() const +{ + size_t byteRead = 0; + + while (!impl->m_RcvBuffer.empty()) + { + if (!this->processBuffer(impl->m_RcvBuffer, byteRead)) + { + impl->m_RcvBuffer.clear(); + // Error set in the function + return false; + } + + // If the processing succeed, we erase the buffer part processed. + if (byteRead != 0) { impl->m_RcvBuffer.erase(impl->m_RcvBuffer.begin(), impl->m_RcvBuffer.begin() + static_cast(byteRead)); } + else + { + // The processing succeed but the byte count read is 0 so more data is waited. + break; + } + } + + return true; +} + +bool CMessaging::processBuffer(const std::vector& buffer, size_t& byteRead) const +{ + byteRead = 0; + + if (buffer.empty()) { return true; } + + // First, we try to fromBytes the buffer to found header information + Header header; + + if (!header.fromBytes(buffer, byteRead)) + { + this->setLastError(Deserialize_Header); + byteRead = size_t(header.getSize()); + return false; + } + + if (buffer.size() < header.getSize()) + { + byteRead = 0; + return true; // Just wait for more data + } + + // Try to unpack the object according to the type given by the header. + switch (header.getType()) + { + case MessageType_Authentication: + { + AuthenticationMessage authentication; + + if (!authentication.fromBytes(buffer, byteRead)) + { + this->pushMessage(ErrorMessage(Error_BadMessage, header.getId())); + this->setLastError(Deserialize_AuthenticationMessage); + return false; + } + + std::lock_guard lock(impl->m_IncAuthMutex); + impl->m_IncomingAuthentications.emplace(header.getId(), authentication); + } + break; + + case MessageType_ProtocolVersion: + { + CommunicationProtocolVersionMessage communicationProtocolVersion; + + if (!communicationProtocolVersion.fromBytes(buffer, byteRead)) + { + this->pushMessage(ErrorMessage(Error_BadMessage, header.getId())); + this->setLastError(Deserialize_ProtocolVersionMessage); + return false; + } + + std::lock_guard lock(impl->m_IncCommProVerMutex); + impl->m_IncomingCommunicationProtocolVersions.emplace(header.getId(), communicationProtocolVersion); + } + break; + + case MessageType_BoxInformation: + { + BoxDescriptionMessage boxDescription; + + if (!boxDescription.fromBytes(buffer, byteRead)) + { + this->pushMessage(ErrorMessage(Error_BadMessage, header.getId())); + this->setLastError(Deserialize_BoxDescriptionMessage); + return false; + } + + std::lock_guard lock(impl->m_IncBoxDescriptionMutex); + impl->m_IncomingBoxDescriptions.emplace(header.getId(), boxDescription); + } + break; + + case MessageType_EBML: + { + EBMLMessage ebml; + + if (!ebml.fromBytes(buffer, byteRead)) + { + this->pushMessage(ErrorMessage(Error_BadMessage, header.getId())); + this->setLastError(Deserialize_EBMLMessage); + return false; + } + + if (ebml.getIndex() >= impl->m_BoxDesc.getOutputs()->size()) { this->pushMessage(ErrorMessage(Error_InvalidOutputIndex, header.getId())); } + + std::lock_guard lock(impl->m_IncEBMLMutex); + impl->m_IncomingEBMLs.emplace(header.getId(), ebml); + } + break; + + case MessageType_Log: + { + LogMessage log; + + if (!log.fromBytes(buffer, byteRead)) + { + this->pushMessage(ErrorMessage(Error_BadMessage, header.getId())); + this->setLastError(Deserialize_LogMessage); + return false; + } + + std::lock_guard lock(impl->m_IncLogMutex); + impl->m_IncomingLogs.emplace(header.getId(), log); + } + break; + + case MessageType_End: { impl->m_IsEndMessageReceived = true; } + break; + + case MessageType_Error: + { + ErrorMessage error; + + if (!error.fromBytes(buffer, byteRead)) + { + this->pushMessage(ErrorMessage(Error_BadMessage, header.getId())); + this->setLastError(Deserialize_ErrorMessage); + return false; + } + + std::lock_guard lock(impl->m_IncErrorsMutex); + impl->m_IncomingErrors.emplace(header.getId(), error); + } + break; + + case MessageType_Time: + { + TimeMessage timeMessage; + + if (!timeMessage.fromBytes(buffer, byteRead)) + { + this->pushMessage(ErrorMessage(Error_BadMessage, header.getId())); + this->setLastError(Deserialize_ErrorMessage); + return false; + } + + impl->m_Time = timeMessage.getTime(); + } + break; + + case MessageType_Sync: { impl->m_WasSyncMessageReceived = true; } + break; + + case MessageType_Unknown: + case MessageType_Max: + this->pushMessage(ErrorMessage(Error_InvalidMessageType, header.getId())); + this->setLastError(Deserialize_MessageTypeNotSupported); + return false; + } + + return true; +} + +bool CMessaging::isInErrorState() const { return impl->m_IsInErrorState.load(); } + +bool CMessaging::isEndReceived() { return impl->m_IsEndMessageReceived; } + +uint64_t CMessaging::getTime() { return impl->m_Time; } + +bool CMessaging::pushMessage(const Message& message) const +{ + if (this->isInErrorState()) { return false; } + + std::vector messageBuffer = message.toBytes(); + const Header header(message.getMessageType(), impl->m_nMessage++, messageBuffer.size()); + std::vector headerBuffer = header.toBytes(); + + std::lock_guard lock(impl->m_SendBufferMutex); + impl->m_SendBuffer.insert(impl->m_SendBuffer.end(), headerBuffer.begin(), headerBuffer.end()); + impl->m_SendBuffer.insert(impl->m_SendBuffer.end(), messageBuffer.begin(), messageBuffer.end()); + + return true; +} + +std::string CMessaging::getErrorString(const ELibraryError error) { return ERRORS_STRING.at(error); } + +bool CMessaging::isConnected() const +{ + if (impl->m_Connection == nullptr) { return false; } + + return impl->m_Connection->isConnected(); +} + +void CMessaging::sync() const +{ + while (true) + { + if (!this->push()) + { + impl->m_IsInErrorState = true; + break; + } + + if (!this->pull()) + { + impl->m_IsInErrorState = true; + break; + } + + if (!this->processIncomingMessages()) + { + impl->m_IsInErrorState = true; + break; + } + + + if (impl->m_IsStopRequested) + { + // Used to be sure to send the end message + this->pull(); + break; + } + } +} + +void CMessaging::setConnection(Socket::IConnection* connection) const { impl->m_Connection = connection; } + +bool CMessaging::startSyncing() +{ + impl->m_IsEndMessageReceived = false; + impl->m_SyncThread = std::thread(&CMessaging::sync, this); + impl->m_IsStopRequested = false; + return true; +} + +bool CMessaging::stopSyncing() const +{ + impl->m_IsStopRequested = true; + + if (impl->m_SyncThread.joinable()) { impl->m_SyncThread.join(); } + + return true; +} + +bool CMessaging::popAuthentication(uint64_t& id, std::string& connectionID) +{ + std::lock_guard lock(impl->m_IncAuthMutex); + + if (impl->m_IncomingAuthentications.empty()) { return false; } + + id = impl->m_IncomingAuthentications.front().first; + connectionID = impl->m_IncomingAuthentications.front().second.getConnectionID(); + impl->m_IncomingAuthentications.pop(); + return true; +} + +bool CMessaging::popBoxDescriptions(uint64_t& id, BoxDescriptionMessage& boxDescription) +{ + std::lock_guard lock(impl->m_IncBoxDescriptionMutex); + + if (impl->m_IncomingBoxDescriptions.empty()) { return false; } + + id = impl->m_IncomingBoxDescriptions.front().first; + boxDescription = impl->m_IncomingBoxDescriptions.front().second; + impl->m_IncomingBoxDescriptions.pop(); + + return true; +} + +bool CMessaging::popCommunicationProtocolVersion(uint64_t& id, uint8_t& majorVersion, uint8_t& minorVersion) +{ + std::lock_guard lock(impl->m_IncCommProVerMutex); + + if (impl->m_IncomingCommunicationProtocolVersions.empty()) { return false; } + + id = impl->m_IncomingCommunicationProtocolVersions.front().first; + majorVersion = impl->m_IncomingCommunicationProtocolVersions.front().second.getMajorVersion(); + minorVersion = impl->m_IncomingCommunicationProtocolVersions.front().second.getMinorVersion(); + impl->m_IncomingEBMLs.pop(); + return true; +} + +bool CMessaging::popLog(uint64_t& id, ELogLevel& type, std::string& message) +{ + std::lock_guard lock(impl->m_IncLogMutex); + + if (impl->m_IncomingLogs.empty()) { return false; } + + id = impl->m_IncomingLogs.front().first; + type = impl->m_IncomingLogs.front().second.getType(); + message = impl->m_IncomingLogs.front().second.getMessage(); + impl->m_IncomingLogs.pop(); + return true; +} + +bool CMessaging::popError(uint64_t& id, EError& type, uint64_t& guiltyId) +{ + std::lock_guard lock(impl->m_IncErrorsMutex); + + if (impl->m_IncomingErrors.empty()) { return false; } + + id = impl->m_IncomingErrors.front().first; + type = impl->m_IncomingErrors.front().second.getType(); + guiltyId = impl->m_IncomingErrors.front().second.getGuiltyId(); + + impl->m_IncomingErrors.pop(); + return true; +} + +bool CMessaging::popEBML(uint64_t& id, size_t& index, uint64_t& startTime, uint64_t& endTime, std::shared_ptr>& ebml) +{ + std::lock_guard lock(impl->m_IncEBMLMutex); + + if (impl->m_IncomingEBMLs.empty()) { return false; } + + id = impl->m_IncomingEBMLs.front().first; + index = impl->m_IncomingEBMLs.front().second.getIndex(); + startTime = impl->m_IncomingEBMLs.front().second.getStartTime(); + endTime = impl->m_IncomingEBMLs.front().second.getEndTime(); + ebml = impl->m_IncomingEBMLs.front().second.getEBML(); + impl->m_IncomingEBMLs.pop(); + return true; +} + +bool CMessaging::popEnd(uint64_t& id) +{ + std::lock_guard lock(impl->m_IncEndMutex); + + if (impl->m_IncomingEnds.empty()) { return false; } + + id = impl->m_IncomingEnds.front().first; + impl->m_IncomingEnds.pop(); + return true; +} + +void CMessaging::setConnectionID(const std::string& connectionID) const { impl->m_ConnectionID = connectionID; } + +bool CMessaging::waitForSyncMessage() +{ + if (impl->m_WasSyncMessageReceived) + { + impl->m_WasSyncMessageReceived = false; + return true; + } + return false; +} +} // namespace Communication diff --git a/Masterarbeit/openvibe/sdk-master/modules/communication/src/ovCMessagingClient.cpp b/Masterarbeit/openvibe/sdk-master/modules/communication/src/ovCMessagingClient.cpp new file mode 100644 index 0000000..aa18075 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/communication/src/ovCMessagingClient.cpp @@ -0,0 +1,172 @@ +#include "ovCMessagingClient.h" +#include "ovCMessagingImpl.hpp" + +namespace Communication { + +MessagingClient::MessagingClient() : CMessaging(), m_Client(Socket::createConnectionClient()) {} + +MessagingClient::~MessagingClient() +{ + this->close(); + m_Client->release(); +} + +bool MessagingClient::connect(const std::string& uri, const size_t port) +{ + this->reset(); + + if (!m_Client->connect(uri.c_str(), port)) + { + this->setLastError(Socket_FailedToConnect); + return false; + } + + this->setConnection(m_Client); + + // Once the connection is done, the client push an authentication message to the server + if (!this->pushAuthentication(impl->m_ConnectionID)) + { + // Error set in the function + const ELibraryError error = this->getLastError(); + this->close(); + this->setLastError(error); + return false; + } + + if (!this->startSyncing()) + { + this->close(); + return false; + } + + // To work, the client need to receive box information message. So we wait to receive the box information message. + // A timeout of 10 seconds is set. + const std::chrono::time_point startClock = std::chrono::system_clock::now(); + uint64_t packetId; + + while (std::chrono::duration_cast(std::chrono::system_clock::now() - startClock).count() < 10) + { + if (this->popBoxDescriptions(packetId, impl->m_BoxDesc)) + { + m_BoxDescriptionReceived = true; + break; + } + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } + + if (!m_BoxDescriptionReceived) + { + this->close(); + this->setLastError(BoxDescriptionNotReceived); + return false; + } + + return true; +} + +bool MessagingClient::close() const +{ + this->pushMessage(EndMessage()); + + this->stopSyncing(); + + if (m_Client != nullptr) + { + if (!m_Client->close()) + { + this->setLastError(Socket_FailedToCloseConnection); + return false; + } + } + + return true; +} + +size_t MessagingClient::getParameterCount() const +{ + if (!m_BoxDescriptionReceived) { return 0; } + return impl->m_BoxDesc.getParameters()->size(); +} + +size_t MessagingClient::getInputCount() const +{ + if (!m_BoxDescriptionReceived) { return 0; } + return impl->m_BoxDesc.getInputs()->size(); +} + +size_t MessagingClient::getOutputCount() const +{ + if (!m_BoxDescriptionReceived) { return 0; } + return impl->m_BoxDesc.getOutputs()->size(); +} + +bool MessagingClient::getParameter(const size_t i, uint64_t& id, uint64_t& type, std::string& name, std::string& value) const +{ + if (!m_BoxDescriptionReceived) { return false; } + + const std::vector* parameters = impl->m_BoxDesc.getParameters(); + + if (parameters->size() <= i) { return false; } + + id = parameters->at(i).getId(); + type = parameters->at(i).getType(); + name = parameters->at(i).getName(); + value = parameters->at(i).getValue(); + + return true; +} + +bool MessagingClient::getInput(const size_t i, uint64_t& id, uint64_t& type, std::string& name) const +{ + if (!m_BoxDescriptionReceived) { return false; } + + const std::vector* inputs = impl->m_BoxDesc.getInputs(); + + if (inputs->size() <= i) { return false; } + + id = inputs->at(i).getId(); + type = inputs->at(i).getType(); + name = inputs->at(i).getName(); + + return true; +} + +bool MessagingClient::getOutput(const size_t i, uint64_t& id, uint64_t& type, std::string& name) const +{ + if (!m_BoxDescriptionReceived) + { + const_cast(this)->setLastError(BoxDescriptionNotReceived); + return false; + } + + const std::vector* outputs = impl->m_BoxDesc.getOutputs(); + + if (outputs->size() <= i) { return false; } + + id = outputs->at(i).getId(); + type = outputs->at(i).getType(); + name = outputs->at(i).getName(); + + return true; +} + +bool MessagingClient::popError(uint64_t& packetId, EError& type, uint64_t& guiltyId) { return CMessaging::popError(packetId, type, guiltyId); } + +bool MessagingClient::popEBML(uint64_t& packetId, size_t& index, uint64_t& startTime, uint64_t& endTime, std::shared_ptr>& ebml) +{ + return CMessaging::popEBML(packetId, index, startTime, endTime, ebml); +} + +bool MessagingClient::pushAuthentication(const std::string& connectionID) const { return this->pushMessage(AuthenticationMessage(connectionID)); } +bool MessagingClient::pushLog(const ELogLevel logLevel, const std::string& log) const { return this->pushMessage(LogMessage(logLevel, log)); } + +bool MessagingClient::pushEBML(const size_t index, const uint64_t startTime, const uint64_t endTime, + const std::shared_ptr>& ebml) const +{ + return this->pushMessage(EBMLMessage(index, startTime, endTime, ebml)); +} + +bool MessagingClient::pushSync() const { return this->pushMessage(SyncMessage()); } +bool MessagingClient::waitForSyncMessage() { return CMessaging::waitForSyncMessage(); } + +} // namespace Communication diff --git a/Masterarbeit/openvibe/sdk-master/modules/communication/src/ovCMessagingImpl.hpp b/Masterarbeit/openvibe/sdk-master/modules/communication/src/ovCMessagingImpl.hpp new file mode 100644 index 0000000..2d73d33 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/communication/src/ovCMessagingImpl.hpp @@ -0,0 +1,65 @@ +#pragma once + +#include "ovCMessaging.h" +#include "ovCMessagingProtocol.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Communication { +struct CMessaging::SMessagingImpl +{ + std::string m_ConnectionID; + BoxDescriptionMessage m_BoxDesc; + std::atomic m_Time; + + uint64_t m_nMessage = 0; + + std::mutex m_IncAuthMutex; + std::queue> m_IncomingAuthentications; + + std::mutex m_IncCommProVerMutex; + std::queue> m_IncomingCommunicationProtocolVersions; + + std::mutex m_IncBoxDescriptionMutex; + std::queue> m_IncomingBoxDescriptions; + + std::mutex m_IncEBMLMutex; + std::queue> m_IncomingEBMLs; + + std::mutex m_IncLogMutex; + std::queue> m_IncomingLogs; + + std::mutex m_IncErrorsMutex; + std::queue> m_IncomingErrors; + + std::mutex m_IncEndMutex; + std::queue> m_IncomingEnds; + + static const size_t s_BufferSize = 1024 * 64; //< Empirical value + + std::vector m_RcvBuffer; + std::array m_TempRcvBuffer; + + std::mutex m_SendBufferMutex; + std::vector m_SendBuffer; + + Socket::IConnection* m_Connection = nullptr; + + mutable std::atomic m_LastLibraryError; + + std::thread m_SyncThread; + + std::atomic m_IsStopRequested; + std::atomic m_IsInErrorState; + std::atomic m_IsEndMessageReceived; + + std::atomic m_WasSyncMessageReceived; +}; +} // namespace Communication diff --git a/Masterarbeit/openvibe/sdk-master/modules/communication/src/ovCMessagingProtocol.cpp b/Masterarbeit/openvibe/sdk-master/modules/communication/src/ovCMessagingProtocol.cpp new file mode 100644 index 0000000..38f1980 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/communication/src/ovCMessagingProtocol.cpp @@ -0,0 +1,565 @@ +#include +#include +#include +#include + +#include "ovCMessaging.h" + +namespace Communication { + +/** + * \brief Copy a string to buffer + * + * \param [out] dest The buffer destination + * \param [out] bufferIndex The index of the buffer where the beginning of the string must be copied. + * \param value The string to copy. + * + * \retval True if it succeeds + * \retval False if it fails. + */ +static bool copyTobuffer(std::vector& dest, size_t& bufferIndex, const std::string& value) +{ + if (dest.size() < bufferIndex + value.size()) { return false; } + memcpy(dest.data() + bufferIndex, value.data(), value.size()); + bufferIndex += value.size(); + return true; +} + +/** + * \brief Copy a value to a buffer. + * + * \param [out] dest Destination for the. + * \param [out] bufferIndex Zero-based index of the buffer. + * \param value The value. + * + * \return True if it succeeds, false if it fails. + */ +template +static bool copyTobuffer(std::vector& dest, size_t& bufferIndex, const T& value) +{ + if (dest.size() < bufferIndex + sizeof(value)) { return false; } + memcpy(dest.data() + bufferIndex, &value, sizeof(value)); + bufferIndex += sizeof(value); + return true; +} + +template +static bool copyToVariable(const std::vector& src, const size_t bufferIndex, T& destVariable) +{ + if (src.size() < bufferIndex + sizeof(destVariable)) { return false; } + memcpy(&destVariable, src.data() + bufferIndex, sizeof(destVariable)); + return true; +} + +/** + * \brief Convert a buffer to a string + * + * \param src The buffer + * \param bufferIndex The index where to start the convertion. + * \param size The size of the string. + * \param [out] string The string. + * + * \retval True if it succeeds + * \retval False if it fails. + * + * \sa copyToVariable + */ +static bool copyToString(const std::vector& src, const size_t bufferIndex, const size_t size, std::string& string) +{ + if (src.size() < bufferIndex + size) { return false; } + + string = std::string(src.begin() + static_cast(bufferIndex), + src.begin() + static_cast(bufferIndex) + static_cast(size)); + + return true; +} + +/****************************************************************************** +* +* Header +* +******************************************************************************/ + +Header::Header() : m_type(MessageType_Unknown), m_id(std::numeric_limits::max()) { m_isValid = false; } +Header::Header(const EMessageType type, const uint64_t id, const size_t size) : m_type(type), m_id(id), m_size(size) { m_isValid = true; } + +std::vector Header::toBytes() const +{ + std::vector buffer(MINIMUM_SIZE); + size_t bufferIndex = 0; + + copyTobuffer(buffer, bufferIndex, m_type); + copyTobuffer(buffer, bufferIndex, m_id); + copyTobuffer(buffer, bufferIndex, m_size); + + return buffer; +} + +bool Header::fromBytes(const std::vector& buffer, size_t& bufferIndex) +{ + m_isValid = false; + + if (buffer.size() < bufferIndex + MINIMUM_SIZE) { return false; } + + uint8_t typeInt; + + if (!copyToVariable(buffer, bufferIndex + TYPE_INDEX, typeInt)) { return false; } + + if (typeInt >= MessageType_Max) { return false; } + + m_type = EMessageType(typeInt); + + if (!copyToVariable(buffer, bufferIndex + ID_INDEX, m_id)) { return false; } + if (!copyToVariable(buffer, bufferIndex + SIZE_INDEX, m_size)) { return false; } + + bufferIndex += MINIMUM_SIZE; + + m_isValid = true; + + return true; +} + +/****************************************************************************** +* +* Authentication +* +******************************************************************************/ + +std::vector AuthenticationMessage::toBytes() const +{ + std::vector buffer(MINIMUM_SIZE + m_connectionID.size()); + size_t bufferIndex = 0; + + const size_t size = m_connectionID.size(); + copyTobuffer(buffer, bufferIndex, size); + copyTobuffer(buffer, bufferIndex, m_connectionID); + + return buffer; +} + +bool AuthenticationMessage::fromBytes(const std::vector& buffer, size_t& bufferIndex) +{ + m_isValid = false; + if (buffer.size() < bufferIndex + MINIMUM_SIZE) { return false; } + + size_t passPhraseSize; + if (!copyToVariable(buffer, bufferIndex + SIZE_INDEX, passPhraseSize)) { return false; } + if (!copyToString(buffer, bufferIndex + CONNECTION_ID_INDEX, passPhraseSize, m_connectionID)) { return false; } + + m_isValid = true; + bufferIndex += MINIMUM_SIZE + passPhraseSize; + + return true; +} + + +/****************************************************************************** +* +* Communication protocol version +* +******************************************************************************/ + +std::vector CommunicationProtocolVersionMessage::toBytes() const +{ + std::vector buffer(MINIMUM_SIZE); + size_t bufferIndex = 0; + + copyTobuffer(buffer, bufferIndex, m_majorVersion); + copyTobuffer(buffer, bufferIndex, m_minorVersion); + + return buffer; +} + +bool CommunicationProtocolVersionMessage::fromBytes(const std::vector& buffer, size_t& bufferIndex) +{ + m_isValid = false; + + if (buffer.size() < bufferIndex + MINIMUM_SIZE) { return false; } + + if (!copyToVariable(buffer, bufferIndex + MAJOR_INDEX, m_majorVersion)) { return false; } + if (!copyToVariable(buffer, bufferIndex + MINOR_INDEX, m_minorVersion)) { return false; } + + m_isValid = true; + + bufferIndex += MINIMUM_SIZE; + + return true; +} + +/****************************************************************************** +* +* Inout and output +* +******************************************************************************/ + +InputOutput::InputOutput() + : m_id(std::numeric_limits::max()), m_type(std::numeric_limits::max()), m_name(std::string()) { m_isValid = false; } + +InputOutput::InputOutput(const uint64_t id, const size_t type, const std::string& name) : m_id(id), m_type(type), m_name(name) { m_isValid = true; } + +std::vector InputOutput::toBytes() const +{ + std::vector buffer(MINIMUM_SIZE + m_name.size()); + size_t bufferIndex = 0; + + copyTobuffer(buffer, bufferIndex, m_id); + copyTobuffer(buffer, bufferIndex, m_type); + copyTobuffer(buffer, bufferIndex, m_name.size()); + copyTobuffer(buffer, bufferIndex, m_name); + + return buffer; +} + +bool InputOutput::fromBytes(const std::vector& buffer, size_t& bufferIndex) +{ + m_isValid = false; + + if (buffer.size() < bufferIndex + MINIMUM_SIZE) { return false; } + + if (!copyToVariable(buffer, bufferIndex + ID_INDEX, m_id)) { return false; } + if (!copyToVariable(buffer, bufferIndex + TYPE_INDEX, m_type)) { return false; } + + size_t nameSize; + if (!copyToVariable(buffer, bufferIndex + NAME_SIZE_INDEX, nameSize)) { return false; } + if (!copyToString(buffer, bufferIndex + NAME_INDEX, nameSize, m_name)) { return false; } + + m_isValid = true; + + bufferIndex += MINIMUM_SIZE + nameSize; + + return true; +} + +/****************************************************************************** +* +* Parameter +* +******************************************************************************/ + +Parameter::Parameter() + : m_id(std::numeric_limits::max()), m_type(std::numeric_limits::max()), m_name(std::string()), m_value(std::string()) +{ + m_isValid = false; +} + +Parameter::Parameter(const uint64_t id, const size_t type, const std::string& name, const std::string& value) + : m_id(id), m_type(type), m_name(name), m_value(value) { m_isValid = true; } + +std::vector Parameter::toBytes() const +{ + std::vector buffer(MINIMUM_SIZE + m_name.size() + m_value.size()); + size_t bufferIndex = 0; + + copyTobuffer(buffer, bufferIndex, m_id); + copyTobuffer(buffer, bufferIndex, m_type); + copyTobuffer(buffer, bufferIndex, m_name.size()); + copyTobuffer(buffer, bufferIndex, m_value.size()); + copyTobuffer(buffer, bufferIndex, m_name); + copyTobuffer(buffer, bufferIndex, m_value); + + return buffer; +} + +bool Parameter::fromBytes(const std::vector& buffer, size_t& bufferIndex) +{ + m_isValid = false; + + if (buffer.size() < bufferIndex + MINIMUM_SIZE) { return false; } + + if (!copyToVariable(buffer, bufferIndex + ID_INDEX, m_id)) { return false; } + if (!copyToVariable(buffer, bufferIndex + TYPE_INDEX, m_type)) { return false; } + + size_t nameSize; + if (!copyToVariable(buffer, bufferIndex + NAME_SIZE_INDEX, nameSize)) { return false; } + + size_t valueSize; + if (!copyToVariable(buffer, bufferIndex + VALUE_SIZE_INDEX, valueSize)) { return false; } + if (!copyToString(buffer, bufferIndex + NAME_INDEX, nameSize, m_name)) { return false; } + if (!copyToString(buffer, bufferIndex + NAME_INDEX + nameSize, valueSize, m_value)) { return false; } + + bufferIndex += MINIMUM_SIZE + nameSize + valueSize; + + return true; +} + +/****************************************************************************** + * + * Box description + * + ******************************************************************************/ + +std::vector BoxDescriptionMessage::toBytes() const +{ + std::vector buffer(MINIMUM_SIZE); + size_t bufferIndex = 0; + + copyTobuffer(buffer, bufferIndex, m_inputs.size()); + copyTobuffer(buffer, bufferIndex, m_outputs.size()); + copyTobuffer(buffer, bufferIndex, m_parameters.size()); + + for (const InputOutput& input : m_inputs) + { + std::vector inputBuffer = input.toBytes(); + buffer.insert(buffer.end(), inputBuffer.begin(), inputBuffer.end()); + } + + for (const InputOutput& output : m_outputs) + { + std::vector outputBuffer = output.toBytes(); + buffer.insert(buffer.end(), outputBuffer.begin(), outputBuffer.end()); + } + + for (const Parameter& parameter : m_parameters) + { + std::vector parameterBuffer = parameter.toBytes(); + buffer.insert(buffer.end(), parameterBuffer.begin(), parameterBuffer.end()); + } + + return buffer; +} + +bool BoxDescriptionMessage::fromBytes(const std::vector& buffer, size_t& bufferIndex) +{ + m_isValid = false; + + if (buffer.size() < bufferIndex + MINIMUM_SIZE) { return false; } + + size_t inputCount; + size_t outputCount; + size_t parameterCount; + + if (!copyToVariable(buffer, bufferIndex + N_INPUT_INDEX, inputCount)) { return false; } + if (!copyToVariable(buffer, bufferIndex + N_OUTPUT_INDEX, outputCount)) { return false; } + if (!copyToVariable(buffer, bufferIndex + N_PARAMETER_INDEX, parameterCount)) { return false; } + + bufferIndex += MINIMUM_SIZE; + + m_inputs.clear(); + m_outputs.clear(); + m_parameters.clear(); + + for (size_t i = 0; i < inputCount; ++i) + { + InputOutput input; + if (!input.fromBytes(buffer, bufferIndex)) { return false; } + m_inputs.push_back(input); + } + + for (size_t i = 0; i < outputCount; ++i) + { + InputOutput output; + if (!output.fromBytes(buffer, bufferIndex)) { return false; } + m_outputs.push_back(output); + } + + for (size_t i = 0; i < parameterCount; ++i) + { + Parameter parameter; + if (!parameter.fromBytes(buffer, bufferIndex)) { return false; } + m_parameters.push_back(parameter); + } + + m_isValid = true; + + return true; +} + +EMessageType BoxDescriptionMessage::getMessageType() const { return MessageType_BoxInformation; } + +bool BoxDescriptionMessage::addInput(const uint64_t id, const size_t type, const std::string& name) +{ + const auto it = std::find_if(m_inputs.begin(), m_inputs.end(), [&id](const InputOutput& obj) { return obj.getId() == id; }); + if (it != m_inputs.end()) { return false; } + m_inputs.emplace_back(id, type, name); + return true; +} + +bool BoxDescriptionMessage::addOutput(const uint64_t id, const size_t type, const std::string& name) +{ + const auto it = std::find_if(m_outputs.begin(), m_outputs.end(), [&id](const InputOutput& obj) { return obj.getId() == id; }); + if (it != m_outputs.end()) { return false; } + m_outputs.emplace_back(id, type, name); + return true; +} + +bool BoxDescriptionMessage::addParameter(const uint64_t id, const size_t type, const std::string& name, const std::string& value) +{ + const auto it = std::find_if(m_parameters.begin(), m_parameters.end(), [&id](const Parameter& obj) { return obj.getId() == id; }); + if (it != m_parameters.end()) { return false; } + m_parameters.emplace_back(id, type, name, value); + return true; +} + +/****************************************************************************** +* +* Packet part +* +******************************************************************************/ + +/****************************************************************************** +* +* Log +* +******************************************************************************/ + +LogMessage::LogMessage() : m_type(LogLevel_Unknown) { m_isValid = false; } +LogMessage::LogMessage(const ELogLevel type, const std::string& message) : m_type(type), m_message(message) { m_isValid = true; } + +std::vector LogMessage::toBytes() const +{ + std::vector buffer(MINIMUM_SIZE + m_message.size()); + size_t bufferIndex = 0; + + copyTobuffer(buffer, bufferIndex, m_type); + copyTobuffer(buffer, bufferIndex, m_message.size()); + copyTobuffer(buffer, bufferIndex, m_message); + + return buffer; +} + +bool LogMessage::fromBytes(const std::vector& buffer, size_t& bufferIndex) +{ + m_isValid = false; + + if (buffer.size() < bufferIndex + MINIMUM_SIZE) { return false; } + + // Type + uint8_t typeInt; + + if (!copyToVariable(buffer, bufferIndex + TYPE_INDEX, typeInt)) { return false; } + + if (typeInt >= LogLevel_Max) { return false; } + + m_type = ELogLevel(typeInt); + + // Message size + size_t messageSize; + if (!copyToVariable(buffer, bufferIndex + SIZE_INDEX, messageSize)) { return false; } + if (!copyToString(buffer, bufferIndex + NAME_INDEX, messageSize, m_message)) { return false; } + + bufferIndex += MINIMUM_SIZE + messageSize; + + m_isValid = true; + + return true; +} + +/****************************************************************************** +* +* EBML +* +******************************************************************************/ + +EBMLMessage::EBMLMessage() + : m_ioIdx(std::numeric_limits::max()), m_startTime(std::numeric_limits::max()), + m_endTime(std::numeric_limits::max()) { m_isValid = false; } + +EBMLMessage::EBMLMessage(const size_t index, const uint64_t startTime, const uint64_t endTime, const std::shared_ptr>& ebml) + : m_ioIdx(index), m_startTime(startTime), m_endTime(endTime), m_EBML(ebml) { m_isValid = true; } + +std::vector EBMLMessage::toBytes() const +{ + if (!m_isValid) { return std::vector(); } + + std::vector buffer(MINIMUM_SIZE); + size_t bufferIndex = 0; + + copyTobuffer(buffer, bufferIndex, m_ioIdx); + copyTobuffer(buffer, bufferIndex, m_startTime); + copyTobuffer(buffer, bufferIndex, m_endTime); + copyTobuffer(buffer, bufferIndex, size_t(m_EBML->size())); + + if (!m_EBML->empty()) { buffer.insert(buffer.end(), m_EBML->begin(), m_EBML->end()); } + + return buffer; +} + +bool EBMLMessage::fromBytes(const std::vector& buffer, size_t& bufferIndex) +{ + m_isValid = false; + + if (buffer.size() < bufferIndex + MINIMUM_SIZE) { return false; } + + if (!copyToVariable(buffer, bufferIndex + IO_INDEX_INDEX, m_ioIdx)) { return false; } + if (!copyToVariable(buffer, bufferIndex + START_TIME_INDEX, m_startTime)) { return false; } + if (!copyToVariable(buffer, bufferIndex + END_TIME_INDEX, m_endTime)) { return false; } + + size_t EBMLsize; + if (!copyToVariable(buffer, bufferIndex + SIZE_INDEX, EBMLsize)) { return false; } + + if (buffer.size() < bufferIndex + EBML_INDEX + EBMLsize) { return false; } + + m_EBML.reset(new std::vector(buffer.begin() + static_cast(bufferIndex) + EBML_INDEX, + buffer.begin() + static_cast(bufferIndex) + EBML_INDEX + EBMLsize)); + + bufferIndex += MINIMUM_SIZE + EBMLsize; + + m_isValid = true; + + return true; +} + +/****************************************************************************** +* +* Error +* +******************************************************************************/ + +std::vector ErrorMessage::toBytes() const +{ + std::vector buffer(MINIMUM_SIZE); + size_t bufferIndex = 0; + + copyTobuffer(buffer, bufferIndex, m_type); + copyTobuffer(buffer, bufferIndex, m_guiltyId); + + return buffer; +} + +bool ErrorMessage::fromBytes(const std::vector& buffer, size_t& bufferIndex) +{ + m_isValid = false; + + if (buffer.size() < bufferIndex + MINIMUM_SIZE) { return false; } + + if (!copyToVariable(buffer, bufferIndex + TYPE_INDEX, m_type)) { return false; } + if (!copyToVariable(buffer, bufferIndex + GUILTY_ID_INDEX, m_guiltyId)) { return false; } + + bufferIndex += MINIMUM_SIZE; + + m_isValid = true; + + return true; +} + +/****************************************************************************** + * + * Time + * + ******************************************************************************/ + +std::vector TimeMessage::toBytes() const +{ + std::vector buffer(MINIMUM_SIZE); + size_t bufferIndex = 0; + + copyTobuffer(buffer, bufferIndex, m_time); + + return buffer; +} + +bool TimeMessage::fromBytes(const std::vector& buffer, size_t& bufferIndex) +{ + m_isValid = false; + + if (buffer.size() < bufferIndex + MINIMUM_SIZE) { return false; } + if (!copyToVariable(buffer, bufferIndex + TIME_INDEX, m_time)) { return false; } + + bufferIndex += MINIMUM_SIZE; + + m_isValid = true; + + return true; +} + +} // namespace Communication diff --git a/Masterarbeit/openvibe/sdk-master/modules/communication/src/ovCMessagingServer.cpp b/Masterarbeit/openvibe/sdk-master/modules/communication/src/ovCMessagingServer.cpp new file mode 100644 index 0000000..b361bf8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/communication/src/ovCMessagingServer.cpp @@ -0,0 +1,150 @@ +#include "ovCMessagingServer.h" +#include "ovCMessagingImpl.hpp" + +namespace Communication { + +MessagingServer::~MessagingServer() +{ + this->close(); + m_Server->release(); +} + + +bool MessagingServer::accept() +{ + this->reset(); + + if (this->isConnected()) + { + // A connection is already done to a client + this->setLastError(Socket_ClientAlreadyConnected); + return false; + } + + if (!m_Server->isReadyToReceive()) + { + this->setLastError(Socket_NoIncomingClientConnection); + return false; + } + + m_Client = m_Server->accept(); + + if (m_Client == nullptr) + { + this->setLastError(Socket_NoIncomingClientConnection); + return false; + } + + this->setConnection(m_Client); + + this->startSyncing(); + + if (!impl->m_ConnectionID.empty()) + { + // The server has to verify that the client is the one that is waited. So the server wait the authentication packet. + const std::chrono::time_point startClock = std::chrono::system_clock::now(); + + std::string connectionID; + uint64_t id = 0; + bool isAuthReceived = false; + + while (std::chrono::duration_cast(std::chrono::system_clock::now() - startClock).count() < 10) + { + if (this->popAuthentication(id, connectionID)) + { + isAuthReceived = true; + + if (connectionID != impl->m_ConnectionID) + { + this->pushError(Error_AuthenticationFail, id); + this->close(); + this->setLastError(BadAuthenticationReceived); + return false; + } + break; + } + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } + + if (!isAuthReceived) + { + this->pushError(Error_AuthenticationRequested, id); + this->close(); + this->setLastError(NoAuthenticationReceived); + return false; + } + } + + if (!this->pushMessage(CommunicationProtocolVersionMessage(s_CommunicationProtocol_MajorVersion, s_CommunicationProtocol_MinorVersion))) + { + // Error set in the function + const ELibraryError error = this->getLastError(); + this->close(); + this->setLastError(error); + return false; + } + + if (!this->pushMessage(impl->m_BoxDesc)) + { + // Error set in the function + const ELibraryError error = this->getLastError(); + this->close(); + this->setLastError(error); + return false; + } + + return true; +} + +bool MessagingServer::close() +{ + this->pushMessage(EndMessage()); + + this->stopSyncing(); + + bool errorRaised = false; + + if (m_Client != nullptr) + { + if (!m_Client->close()) + { + errorRaised = true; + this->setLastError(Socket_FailedToCloseConnection); + } + + m_Client->release(); + m_Client = nullptr; + } + + if (!m_Server->close()) + { + this->setLastError(Socket_FailedToCloseConnection); + errorRaised = true; + } + + return !errorRaised; +} + +bool MessagingServer::addParameter(const uint64_t id, const size_t type, const std::string& name, const std::string& value) const +{ + return impl->m_BoxDesc.addParameter(id, type, name, value); +} + +bool MessagingServer::addInput(const uint64_t id, const size_t type, const std::string& name) const { return impl->m_BoxDesc.addInput(id, type, name); } +bool MessagingServer::addOutput(const uint64_t id, const size_t type, const std::string& name) const { return impl->m_BoxDesc.addOutput(id, type, name); } +bool MessagingServer::popLog(uint64_t& packetId, ELogLevel& type, std::string& message) { return CMessaging::popLog(packetId, type, message); } + +bool MessagingServer::popEBML(uint64_t& packetId, size_t& index, uint64_t& startTime, uint64_t& endTime, std::shared_ptr>& ebml) +{ + return CMessaging::popEBML(packetId, index, startTime, endTime, ebml); +} + +bool MessagingServer::pushError(const EError error, const uint64_t guiltyId) const { return this->pushMessage(ErrorMessage(error, guiltyId)); } + +bool MessagingServer::pushEBML(const size_t index, const uint64_t startTime, const uint64_t endTime, + const std::shared_ptr>& ebml) const +{ + return this->pushMessage(EBMLMessage(index, startTime, endTime, ebml)); +} + +} // namespace Communication diff --git a/Masterarbeit/openvibe/sdk-master/modules/csv/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/modules/csv/CMakeLists.txt new file mode 100644 index 0000000..cafb373 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/csv/CMakeLists.txt @@ -0,0 +1,55 @@ +PROJECT(openvibe-module-csv) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp include/*.h src/*.hpp) +INCLUDE_DIRECTORIES(include/csv) +INCLUDE("FindSourceRCProperties") + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER} + COMPILE_FLAGS "-DCSV_Shared -DCSV_Exports") + +ADD_LIBRARY(${PROJECT_NAME}-static STATIC ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME}-static PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER} + COMPILE_FLAGS "-DCSV_Static -DCSV_Exports") + +IF(UNIX) + SET_TARGET_PROPERTIES(${PROJECT_NAME}-static PROPERTIES COMPILE_FLAGS "-fPIC") +ENDIF(UNIX) + +SET(DYNAMIC_LINK_OPENVIBE_MODULE_FS OFF) +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyBoost_FileSystem") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(TARGETS ${PROJECT_NAME}-static + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY include/ DESTINATION ${DIST_INCLUDEDIR} COMPONENT headers FILES_MATCHING PATTERN "*.h") diff --git a/Masterarbeit/openvibe/sdk-master/modules/csv/include/csv/defines.h b/Masterarbeit/openvibe/sdk-master/modules/csv/include/csv/defines.h new file mode 100644 index 0000000..f379a11 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/csv/include/csv/defines.h @@ -0,0 +1,23 @@ +#pragma once + +#if defined CSV_Shared +# if defined TARGET_OS_Windows +# define CSV_API_Export __declspec(dllexport) +# define CSV_API_Import __declspec(dllimport) +# elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS +# define CSV_API_Export __attribute__((visibility("default"))) +# define CSV_API_Import __attribute__((visibility("default"))) +# else +# define CSV_API_Export +# define CSV_API_Import +# endif +#else +# define CSV_API_Export +# define CSV_API_Import +#endif + +#if defined CSV_Exports +# define CSV_API CSV_API_Export +#else +# define CSV_API CSV_API_Import +#endif diff --git a/Masterarbeit/openvibe/sdk-master/modules/csv/include/csv/ovICSV.h b/Masterarbeit/openvibe/sdk-master/modules/csv/include/csv/ovICSV.h new file mode 100755 index 0000000..fd91028 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/csv/include/csv/ovICSV.h @@ -0,0 +1,380 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE SDK + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#pragma once + +#include "defines.h" + +#include +#include +#include +#include + +namespace OpenViBE { +namespace CSV { +struct SMatrixChunk +{ + double startTime; // in second + double endTime; // in second + std::vector matrix; + uint64_t epoch; + + SMatrixChunk(const double startTime, const double endTime, const std::vector& matrix, const uint64_t epoch) + : startTime(startTime), endTime(endTime), matrix(matrix), epoch(epoch) { } +}; + +struct SStimulationChunk +{ + uint64_t id; + double date; // in second + double duration; // in second + SStimulationChunk(const uint64_t id, const double date, const double duration) : id(id), date(date), duration(duration) { } +}; + +enum class EStreamType +{ + StreamedMatrix = 0, + FeatureVector = 1, + Signal = 2, + Spectrum = 3, + CovarianceMatrix = 4 +}; + +enum ELogErrorCodes +{ + LogErrorCodes_HeaderNotRead = -32, + LogErrorCodes_MissingData = -31, + LogErrorCodes_WrongParameters = -30, + LogErrorCodes_ErrorWhileWriting = -29, + LogErrorCodes_CantWriteHeader = -28, + LogErrorCodes_InvalidArgumentException = -27, + LogErrorCodes_OutOfRangeException = -26, + LogErrorCodes_DimensionCountZero = -25, + LogErrorCodes_WrongDimensionSize = -24, + LogErrorCodes_EmptyColumn = -23, + LogErrorCodes_StimulationSize = -22, + LogErrorCodes_InvalidStimulationArgument = -21, + LogErrorCodes_WrongSampleDate = -20, + LogErrorCodes_NegativeStimulation = -19, + LogErrorCodes_NotEnoughLines = -18, + LogErrorCodes_SampleNotEmpty = -17, + LogErrorCodes_WrongLineSize = -16, + LogErrorCodes_WrongHeader = -15, + LogErrorCodes_WrongInputType = -14, + LogErrorCodes_SetInfoOnce = -13, + LogErrorCodes_NoChannelsName = -12, + LogErrorCodes_DimensionSizeEmpty = -11, + LogErrorCodes_DimensionSizeZero = -10, + LogErrorCodes_MatrixEmpty = -9, + LogErrorCodes_WrongMatrixSize = -8, + LogErrorCodes_NoMatrixLabels = -7, + LogErrorCodes_NoSample = -6, + LogErrorCodes_DateError = -5, + LogErrorCodes_DurationError = -4, + LogErrorCodes_CantOpenFile = -3, + LogErrorCodes_NoFileDefined = -2, + LogErrorCodes_ErrorWhileClosing = -1, + LogErrorCodes_NoError = 0 +}; + +enum class EFileAccessMode +{ + Write, + Append, + Read +}; + +class CSV_API ICSVHandler +{ +public: + /** + * \brief Return the number of digit of float numbers in output file. + * + * \return size_t number of digits + */ + virtual size_t getOutputFloatPrecision() = 0; + + /** + * \brief Set the number of digits of float numbers in output file. + * + * \param precision number of digits + */ + virtual void setOutputFloatPrecision(const size_t precision) = 0; + + /** + * \brief Set the format type that will be written or read. + * + * \param typeID Could be Streamed Matrix, Signal, Covariance Matrix, etc ... + */ + virtual void setFormatType(const EStreamType typeID) = 0; + + /** + * \brief Return the format type + * + * \return EStreamType format type + */ + virtual EStreamType getFormatType() = 0; + + /** + * \brief Set the state of the LastMatrixOnly mode. + * + * \param isActivated bool setting it to true will activate the LastMatrixOnly mode, false will disable it. + */ + virtual void setLastMatrixOnlyMode(const bool isActivated) = 0; + + /** + * \brief Return the state of the LastMatrixOnly mode + * + * \retval true if LastMatrixOnly mode is activated + * \retval false if this is not (normal mode) + */ + virtual bool getLastMatrixOnlyMode() = 0; + + /** + * \brief Set informations to read or write signal data + * + * \param channelNames all channels names for the matrix + * \param sampling sampling frequency + * \param nSamplePerBuffer number of sample per buffer + * + * \retval true in case of success + * \retval false in case of incorrect or incomplete parameters + */ + virtual bool setSignalInformation(const std::vector& channelNames, size_t sampling, size_t nSamplePerBuffer) = 0; + + /** + * \brief Get signal information in file + * + * \param channelNames reference to fill with file channel names + * \param sampling sampling frequency + * \param nSamplePerBuffer number of sample per buffer + * + * \retval true in case of success + * \retval false in case of failure + */ + virtual bool getSignalInformation(std::vector& channelNames, size_t& sampling, size_t& nSamplePerBuffer) = 0; + + /** + * \brief Set informations to read or write spectrum data + * + * \param channelNames Channels names of the matrix + * \param frequencyAbscissa Frequencies abscissa of the measurements + * \param sampling Sampling rate of the original measurements + * + * \retval true in case of success + * \retval false in case of incorrect or incomplete parameters + */ + virtual bool setSpectrumInformation(const std::vector& channelNames, const std::vector& frequencyAbscissa, size_t sampling) = 0; + + /** + * \brief get spectrum information in file + * + * \param channelNames Channels names of the matrix + * \param frequencyAbscissa Frequencies abscissa of the measurements + * \param sampling Sampling rate of the original measurements + * + * \retval true in case of success + * \retval false in case of failure + */ + virtual bool getSpectrumInformation(std::vector& channelNames, std::vector& frequencyAbscissa, size_t& sampling) = 0; + + /** + * \brief Set informations to read or write vector data + * + * \param channelNames all channels names for the matrix + * + * \retval true in case of success + * \retval false in case of incorrect or incomplete parameters + */ + virtual bool setFeatureVectorInformation(const std::vector& channelNames) = 0; + + /** + * \brief Get feature vector information in file + * + * \param channelNames reference to fill with file channel names + * + * \retval true in case of success + * \retval false in case of failure + */ + virtual bool getFeatureVectorInformation(std::vector& channelNames) = 0; + + /** + * \brief Set informations to read or write streamed or covariance matrix data + * + * \param dimensionSizes size of each dimension + * \param labels all channels names for the matrix + * + * \retval true in case of success + * \retval false in case of incorrect or incomplete parameters + */ + virtual bool setStreamedMatrixInformation(const std::vector& dimensionSizes, const std::vector& labels) = 0; + + /** + * \brief Get streamed or covariance matrix information in file + * + * \param dimensionSizes + * \param labels reference to fill with file channel names + * + * \retval true in case of success + * \retval false in case of error + */ + virtual bool getStreamedMatrixInformation(std::vector& dimensionSizes, std::vector& labels) = 0; + + /** + * \brief Write the header if available in the file + * + * \retval true in case of writing header + * \retval false in case of already written header + */ + virtual bool writeHeaderToFile() = 0; + + /** + * \brief Write the matrix data in the opened file + * + * \retval true in case of success + * \return false in case of error while writing + */ + virtual bool writeDataToFile() = 0; + + /** + * \brief Write all the remaining data + * + * \retval true in case of sucess + * \retval false in case of error while writing + */ + virtual bool writeAllDataToFile() = 0; + + /** + * \brief Read samples and events on the specified number of chunks + * + * \param chunksToRead number of chunks to read + * \param samples structures reference to put the data in + * \param events reference to a vector of event structure to put the data in + * + * \retval true in case of sucess + * \retval false in case of error while writing + */ + virtual bool readSamplesAndEventsFromFile(size_t chunksToRead, std::vector& samples, std::vector& events) = 0; + + /** + * \brief Open file specified on parameter + * + * \param filename is the filename of the file to open + * \param mode + * + * \retval true in case of success + * \retval false in case of error while opening the file + */ + virtual bool openFile(const std::string& filename, EFileAccessMode mode) = 0; + + /** + * \brief close the opened file + * + * \retval true in case of sucess + * \retval false in case of error while closing + */ + virtual bool closeFile() = 0; + + /** + * \brief Add a sample of the data type + * + * \param sample is the sample to add + * + * \retval true in case of correct sample + * \retval false in case of empty or incorrect sample + */ + virtual bool addSample(const SMatrixChunk& sample) = 0; + + /** + * \brief Add a buffer (multiple samples) of the data type. + * + * \param samples to add + * + * \retval true in case of success + * \retval false in case of error in the added sample + */ + virtual bool addBuffer(const std::vector& samples) = 0; + + /** + * \brief Add an event + * + * \param code is the event identifier + * \param date in seconds (must be positive) + * \param duration in seconds (must be positive) + * + * \retval true in case of correct event + * \retval false in case of incorrect param + */ + virtual bool addEvent(uint64_t code, double date, double duration) = 0; + + /** + * \brief Add an event + * + * \param event is the event to add (with identifier, data and duration) + * + * \retval true in case of success + * \retval false in case of incorrect event + */ + virtual bool addEvent(const SStimulationChunk& event) = 0; + + /** + * \brief Set the time of the next stimulation + * + * \param date the date of the next stimulation + * + * \retval true in case of success + * \retval false in case of negative date + */ + virtual bool noEventsUntilDate(double date) = 0; + + /** + * \brief Return the error last log error. + * + * \return last log error code + */ + virtual ELogErrorCodes getLastLogError() = 0; + + /** + * \brief Return the error associated to the code in parameter. + * + * \param code error code + * + * \return error string + */ + static std::string getLogError(ELogErrorCodes code); + + /** + * \brief Return additionnal information on the error in certain cases + * + * \return string additionnal information + */ + virtual std::string getLastErrorString() = 0; + + virtual bool hasDataToRead() const = 0; +protected: + virtual ~ICSVHandler() {} +}; + +extern CSV_API ICSVHandler* createCSVHandler(); + +extern CSV_API void releaseCSVHandler(ICSVHandler* object); +} // namespace CSV +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/modules/csv/src/ovCCSV.cpp b/Masterarbeit/openvibe/sdk-master/modules/csv/src/ovCCSV.cpp new file mode 100755 index 0000000..a645624 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/csv/src/ovCCSV.cpp @@ -0,0 +1,1759 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE SDK + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS +#include +#include +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1900 +#define snprintf _snprintf +#else +#include //sprintf +#endif + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "ovCCSV.hpp" + +#include + +namespace OpenViBE { +namespace CSV { +static const size_t SIGNAL_EPOCH_COL_IDX = 1; +static const size_t TIME_COL_IDX = 0; +static const size_t END_TIME_COL_IDX = 1; +static const size_t N_PRE_DATA_COL = 2; // Number of columns before data (Time/Epoch) +static const size_t N_POST_DATA_COL = 3; // Number of columns after data (Events) + +//Separators +static const char SEPARATOR(','); +static const char DATA_SEPARATOR(':'); +static const char DIMENSION_SEPARATOR('x'); + +// Columns Names +static const std::string EVENT_ID_COL = "Event Id"; +static const std::string EVENT_DATE_COL = "Event Date"; +static const std::string EVENT_DURATION_COL = "Event Duration"; + +static const size_t CHAR_TO_READ = 1000; +//static const size_t MAXIMUM_FLOAT_DECIMAL = 32; + +static const char END_OF_LINE_CHAR('\n'); + +bool CCSVHandler::streamReader(std::istream& in, std::string& out, const char delimiter, std::string& bufferHistory) const +{ + // To improve the performance of the reading, we read a bunch a chars rather one char by one char. + // We keep the part of the readed stream, that is not used, in a buffer history. + std::vector buffer; + size_t lineBreakPos = std::string::npos; + + // We check that the delimiter is present in the buffer history + if (!bufferHistory.empty()) + { + buffer.push_back(std::move(bufferHistory)); + lineBreakPos = buffer.back().find_first_of(delimiter); + } + + // If it's not the case, we have to read the stream. + while (lineBreakPos == std::string::npos) + { + buffer.emplace_back(CHAR_TO_READ, '\0'); // Construct a string that will store the characters. + in.read(&buffer.back()[0], CHAR_TO_READ); // Read X chars by X chars + lineBreakPos = buffer.back().find_first_of(delimiter); + + // If it's the end of the file and no delimiter has been found... + if (in.gcount() != CHAR_TO_READ && lineBreakPos == std::string::npos) { break; } + } + + // There is no delimitor in the stream ... + if (lineBreakPos == std::string::npos) + { + // Save the rest of the data in the history + for_each(buffer.begin(), buffer.end(), [&bufferHistory](const std::string& s) { bufferHistory += s; }); + return false; + } + + // Keep the string part that following the delimiter in the buffer history for the next call. + bufferHistory = buffer.back().substr(lineBreakPos + 1); + + // And we remove this part from the last string because we will join them. + buffer.back().erase(lineBreakPos, buffer.back().size()); + + out.clear(); + out.reserve(std::accumulate(buffer.cbegin(), buffer.cend(), size_t(0), [](const size_t sumSize, const std::string& str) { return sumSize + str.size(); })); + + // Let's join the strings ! + for_each(buffer.begin(), buffer.end(), [&out](const std::string& s) { out += s; }); + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + // Check if we are looking for an end of line char and handle the CR/LF Windows/Linux cases. + if (delimiter == END_OF_LINE_CHAR && m_isCRLFEOL && !out.empty()) { out.pop_back(); } // Remove the carriage return char. +#endif + + return true; +} + +void CCSVHandler::split(const std::string& in, const char delimiter, std::vector& out) const +{ + std::stringstream stringStream(in); + std::string item; + out.reserve(m_nCol); + + std::string buffer; + + // Loop until the last delimiter + while (this->streamReader(stringStream, item, delimiter, buffer)) { out.push_back(item); } + + // Get the part after the last delimiter + if (this->streamReader(stringStream, item, '\0', buffer)) { out.push_back(item); } +} + +void CCSVHandler::setFormatType(const EStreamType typeID) +{ + m_inputTypeID = typeID; + m_hasInputType = true; +} + +bool CCSVHandler::setSignalInformation(const std::vector& channelNames, const size_t sampling, const size_t nSamplePerBuffer) +{ + if (m_inputTypeID != EStreamType::Signal) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_WrongInputType; + return false; + } + if (m_isSetInfoCalled) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_SetInfoOnce; + return false; + } + + m_isSetInfoCalled = true; + + if (channelNames.empty()) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_NoChannelsName; + return false; + } + + m_sampling = sampling; + m_dimLabels = channelNames; + m_nSamplePerBuffer = nSamplePerBuffer; + return true; +} + +bool CCSVHandler::getSignalInformation(std::vector& channelNames, size_t& sampling, size_t& nSamplePerBuffer) +{ + if (m_inputTypeID != EStreamType::Signal) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_WrongInputType; + return false; + } + + if (!this->parseHeader()) { return false; } + + if (m_dimLabels.empty()) + { + m_lastStringError = "No dimension labels, header reading may have failed"; + m_logError = LogErrorCodes_WrongHeader; + return false; + } + + if (m_sampling == 0) + { + m_lastStringError = "Sampling rate invalid"; + m_logError = LogErrorCodes_WrongHeader; + return false; + } + + if (m_nSamplePerBuffer == 0) + { + m_lastStringError = "Sample count per buffer is invalid"; + m_logError = LogErrorCodes_WrongHeader; + return false; + } + + channelNames = m_dimLabels; + sampling = m_sampling; + nSamplePerBuffer = m_nSamplePerBuffer; + return true; +} + +bool CCSVHandler::setSpectrumInformation(const std::vector& channelNames, const std::vector& frequencyAbscissa, const size_t sampling) +{ + if (m_inputTypeID != EStreamType::Spectrum) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_WrongInputType; + return false; + } + + if (m_isSetInfoCalled) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_SetInfoOnce; + return false; + } + + m_isSetInfoCalled = true; + + if (channelNames.empty()) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_NoChannelsName; + return false; + } + + m_dimLabels = channelNames; + m_dimSizes = { channelNames.size(), frequencyAbscissa.size() }; + m_frequencyAbscissa = frequencyAbscissa; + m_nSampleOriginal = sampling; + return true; +} + +bool CCSVHandler::getSpectrumInformation(std::vector& channelNames, std::vector& frequencyAbscissa, size_t& sampling) +{ + if (m_inputTypeID != EStreamType::Spectrum) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_WrongInputType; + return false; + } + + if (!this->parseHeader()) { return false; } + + if (m_dimLabels.empty()) + { + m_lastStringError = "No dimension labels, header reading may have failed"; + m_logError = LogErrorCodes_WrongHeader; + return false; + } + + if (m_frequencyAbscissa.empty()) + { + m_lastStringError = "No dimension labels, header reading may have failed"; + m_logError = LogErrorCodes_WrongHeader; + return false; + } + + if (m_nSamplePerBuffer == 0) + { + m_lastStringError = "Sample count per buffer is invalid"; + m_logError = LogErrorCodes_WrongHeader; + return false; + } + + channelNames = m_dimLabels; + frequencyAbscissa = m_frequencyAbscissa; + sampling = m_nSampleOriginal; + return true; +} + +bool CCSVHandler::setFeatureVectorInformation(const std::vector& channelNames) +{ + if (m_inputTypeID != EStreamType::FeatureVector) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_WrongInputType; + return false; + } + if (m_isSetInfoCalled) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_SetInfoOnce; + return false; + } + + m_isSetInfoCalled = true; + + if (channelNames.empty()) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_NoChannelsName; + return false; + } + + m_dimLabels = channelNames; + m_dimSizes = { channelNames.size() }; + m_nDim = 1; + return true; +} + +bool CCSVHandler::getFeatureVectorInformation(std::vector& channelNames) +{ + if (m_inputTypeID != EStreamType::FeatureVector) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_WrongInputType; + return false; + } + + if (!this->parseHeader()) { return false; } + + if (m_dimLabels.empty()) + { + m_lastStringError = "No dimension labels, header reading may have failed"; + m_logError = LogErrorCodes_WrongHeader; + return false; + } + + channelNames = m_dimLabels; + return true; +} + +bool CCSVHandler::setStreamedMatrixInformation(const std::vector& dimSizes, const std::vector& labels) +{ + if (m_isSetInfoCalled) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_SetInfoOnce; + return false; + } + + if (m_inputTypeID != EStreamType::StreamedMatrix && m_inputTypeID != EStreamType::CovarianceMatrix) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_WrongInputType; + return false; + } + + if (dimSizes.empty()) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_DimensionSizeEmpty; + return false; + } + + const size_t size = std::accumulate(dimSizes.begin(), dimSizes.end(), size_t(0)); + + if (size != labels.size()) + { + m_lastStringError = "dimension count is " + std::to_string(size) + " and labels count is " + std::to_string(labels.size()); + m_logError = LogErrorCodes_WrongDimensionSize; + return false; + } + + m_isSetInfoCalled = true; + m_dimSizes = dimSizes; + m_nDim = m_dimSizes.size(); + m_dimLabels = labels; + return true; +} + +bool CCSVHandler::getStreamedMatrixInformation(std::vector& dimSizes, std::vector& labels) +{ + if (m_inputTypeID != EStreamType::StreamedMatrix && m_inputTypeID != EStreamType::CovarianceMatrix) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_WrongInputType; + return false; + } + + if (!this->parseHeader()) { return false; } + + if (m_dimSizes.empty()) + { + m_lastStringError = "No dimension sizes, header reading may have failed"; + m_logError = LogErrorCodes_WrongHeader; + return false; + } + + if (m_dimLabels.empty()) + { + m_lastStringError = "No dimension labels, header reading may have failed"; + m_logError = LogErrorCodes_WrongHeader; + return false; + } + + dimSizes = m_dimSizes; + labels = m_dimLabels; + return true; +} + +bool CCSVHandler::openFile(const std::string& fileName, const EFileAccessMode mode) +{ + if (m_fs.is_open()) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_CantOpenFile; + return false; + } + + m_filename = fileName; + // This check that file can be written and create it if it does not exist + if (mode == EFileAccessMode::Write || mode == EFileAccessMode::Append) + { + FILE* file = FS::Files::open(m_filename.c_str(), "a"); + + if (!file) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_CantOpenFile; + return false; + } + + if (fclose(file) != 0) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_ErrorWhileClosing; + return false; + } + } + + try + { + switch (mode) + { + case EFileAccessMode::Write: + FS::Files::openFStream(m_fs, m_filename.c_str(), std::ios::out | std::ios::trunc); + break; + + case EFileAccessMode::Append: + FS::Files::openFStream(m_fs, m_filename.c_str(), std::ios::out | std::ios::app); + break; + + case EFileAccessMode::Read: + FS::Files::openFStream(m_fs, m_filename.c_str(), std::ios::in); + break; + } + } + catch (const std::ios_base::failure& fail) + { + m_lastStringError = "Error while opening file " + m_filename + ": " + fail.what(); + m_logError = LogErrorCodes_CantOpenFile; + return false; + } + + if (!m_fs.is_open()) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_CantOpenFile; + return false; + } + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + if (mode == EFileAccessMode::Read) + { + // Check if the end of line is CRLF + std::string stringBuffer, stringHistory; + + m_isCRLFEOL = false; + if(m_fs.peek() == std::ifstream::traits_type::eof()) { m_isCRLFEOL = true; } + else + { + if (!this->streamReader(m_fs, stringBuffer, '\n', stringHistory)) + { + this->closeFile(); + + m_lastStringError = "Error while opening file " + m_filename + ": " + "Fail to determine the file line ending."; + m_logError = LogErrorCodes_CantOpenFile; + return false; + } + + m_isCRLFEOL = *--stringBuffer.end() == '\r'; + } + } +#endif + + // Reset the read position + m_fs.clear(); + m_fs.seekg(0); + + m_isHeaderRead = false; + m_isFirstLineWritten = false; + m_isSetInfoCalled = false; + m_hasEpoch = false; + return true; +} + +bool CCSVHandler::readSamplesAndEventsFromFile(const size_t lineNb, std::vector& chunks, std::vector& stimulations) +{ + if (!m_hasDataToRead) { return false; } + + if (!m_isHeaderRead) + { + m_lastStringError = "Trying to read data without having read a header"; + m_logError = LogErrorCodes_HeaderNotRead; + return false; + } + + chunks.clear(); + + // Calculate the size of the matrix depending of the stream type + size_t matrixSize = size_t(m_nSamplePerBuffer); + + if (m_inputTypeID == EStreamType::Signal) + { + const size_t signalSize = size_t(m_nCol - (N_PRE_DATA_COL + N_POST_DATA_COL)); + matrixSize *= signalSize; + } + else if (m_inputTypeID == EStreamType::Spectrum) + { + const size_t spectrumSize = m_dimSizes[0] * m_dimSizes[1]; + matrixSize *= spectrumSize; + } + else { matrixSize = 0; } + + SMatrixChunk chunk(0, 0, std::vector(matrixSize), 0); + + while (chunks.size() < lineNb && m_hasDataToRead) + { + for (size_t lineIndex = 0; lineIndex < m_nSamplePerBuffer; lineIndex++) + { + std::string lineValue; + + if (!this->streamReader(m_fs, lineValue, END_OF_LINE_CHAR, m_bufferReadFileLine)) + { + if (lineIndex != 0) + { + m_lastStringError = "Chunk is not complete"; + m_logError = LogErrorCodes_MissingData; + return false; + } + // There is no more data to read + m_hasDataToRead = false; + return true; + } + + const size_t columnCount = std::count(lineValue.cbegin(), lineValue.cend(), ',') + 1; + + if (columnCount != m_nCol) + { + m_lastStringError = "There is " + std::to_string(columnCount) + " columns in the Header instead of " + std::to_string(m_nCol) + " on line " + + std::to_string(lineIndex + 1); + + m_logError = LogErrorCodes_WrongLineSize; + return false; + } + + // get Matrix chunk, LogError set in the function + if (!this->readSampleChunk(lineValue, chunk, lineIndex)) { return false; } + + // get stimulations chunk, LogError set in the function + if (!this->readStimulationChunk(lineValue, stimulations, lineIndex + 1)) { return false; } + } + + chunks.push_back(chunk); + } + + return true; +} + +bool CCSVHandler::writeHeaderToFile() +{ + if (!m_fs.is_open()) + { + m_lastStringError.clear(); + m_lastStringError = "File is not opened."; + m_logError = LogErrorCodes_NoFileDefined; + return false; + } + + if (m_isFirstLineWritten) + { + m_lastStringError = "Header already written."; + m_logError = LogErrorCodes_CantWriteHeader; + return false; + } + + // set header (in case of error, logError set in function) + const std::string header = this->createHeaderString(); + if (header.empty()) { return false; } + + m_isFirstLineWritten = true; + try { m_fs << header; } + catch (std::ios_base::failure& fail) + { + m_lastStringError = "Error occured while writing: "; + m_lastStringError += fail.what(); + m_logError = LogErrorCodes_ErrorWhileWriting; + return false; + } + + return true; +} + +bool CCSVHandler::writeDataToFile() +{ + if (!m_fs.is_open()) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_NoFileDefined; + return false; + } + + std::string csv; + + // set matrix (in case of error, logError set in the function) + if (!this->createCSVStringFromData(false, csv)) { return false; } + + try { m_fs << csv; } + catch (std::ios_base::failure& fail) + { + m_lastStringError = "Error occured while writing: "; + m_lastStringError += fail.what(); + m_logError = LogErrorCodes_ErrorWhileWriting; + return false; + } + + return true; +} + +bool CCSVHandler::writeAllDataToFile() +{ + std::string csv; + + // in case of error, logError set in the function + if (!createCSVStringFromData(true, csv)) { return false; } + + try { m_fs << csv; } + catch (std::ios_base::failure& fail) + { + m_lastStringError = "Error occured while writing: "; + m_lastStringError += fail.what(); + m_logError = LogErrorCodes_ErrorWhileWriting; + return false; + } + + return true; +} + +bool CCSVHandler::closeFile() +{ + m_stimulations.clear(); + m_chunks.clear(); + m_dimSizes.clear(); + m_dimLabels.clear(); + m_frequencyAbscissa.clear(); + m_nDim = 0; + m_nCol = 0; + m_sampling = 0; + m_hasInputType = false; + m_isFirstLineWritten = false; + m_isSetInfoCalled = false; + + try { m_fs.close(); } + catch (const std::ios_base::failure& fail) + { + m_lastStringError = "Error while closing file: "; + m_lastStringError += fail.what(); + m_logError = LogErrorCodes_ErrorWhileClosing; + return false; + } + + return true; +} + +bool CCSVHandler::addSample(const SMatrixChunk& sample) +{ + if (sample.matrix.empty()) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_MatrixEmpty; + return false; + } + + switch (m_inputTypeID) + { + case EStreamType::Signal: + if (sample.matrix.size() != m_dimLabels.size()) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_WrongMatrixSize; + return false; + } + break; + + case EStreamType::Spectrum: + if (sample.matrix.size() != (m_dimLabels.size() * m_frequencyAbscissa.size())) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_WrongMatrixSize; + return false; + } + break; + + default: + const size_t columnsToHave = std::accumulate(m_dimSizes.begin(), m_dimSizes.end(), 1U, std::multiplies()); + + if (sample.matrix.size() != columnsToHave) + { + m_lastStringError = "Matrix size is " + std::to_string(sample.matrix.size()) + " and size to have is " + std::to_string(columnsToHave); + m_logError = LogErrorCodes_WrongMatrixSize; + return false; + } + break; + } + + // Check timestamps + if (std::signbit(sample.startTime) || std::signbit(sample.endTime) || sample.endTime < sample.startTime) + { + m_lastStringError = "Sample start time [" + std::to_string(sample.startTime) + "] | end time [" + std::to_string(sample.endTime) + "]"; + m_logError = LogErrorCodes_WrongSampleDate; + return false; + } + + if (m_lastMatrixOnly && + (m_inputTypeID != EStreamType::Signal + || (!m_chunks.empty() && sample.epoch != m_chunks.back().epoch))) + { + m_chunks.clear(); + m_stimulations.erase(std::remove_if(m_stimulations.begin(), m_stimulations.end(), [&sample](const SStimulationChunk& chunk) + { + return chunk.date < sample.startTime; + }), + m_stimulations.end()); + } + + m_chunks.push_back(sample); + return true; +} + +bool CCSVHandler::addBuffer(const std::vector& samples) +{ + if (samples.empty()) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_NoSample; + return false; + } + + ELogErrorCodes error; + const size_t dimensionCount = m_dimLabels.size(); + + if (!std::all_of(samples.cbegin(), samples.cend(), [&error, dimensionCount](const SMatrixChunk& sample) + { + if (sample.matrix.empty()) + { + error = LogErrorCodes_MatrixEmpty; + return false; + } + + if (sample.matrix.size() != dimensionCount) + { + error = LogErrorCodes_WrongMatrixSize; + return false; + } + + // Check that the timestamps is good + if (std::signbit(sample.startTime) || std::signbit(sample.endTime) || sample.endTime < sample.startTime) + { + error = LogErrorCodes_WrongSampleDate; + return false; + } + + return true; + })) + { + m_logError = error; + return false; + } + + if (m_lastMatrixOnly) + { + if (m_inputTypeID == EStreamType::Signal) + { + const uint64_t lastEpoch = samples.back().epoch; + const auto rangeStart = std::find_if(samples.begin(), samples.end(), [&lastEpoch](const SMatrixChunk& s) { return s.epoch == lastEpoch; }); + + if (!m_chunks.empty() && m_chunks.front().epoch != lastEpoch) { m_chunks.clear(); } + + m_chunks.insert(m_chunks.end(), rangeStart, samples.end()); + const double curTime = m_chunks.front().startTime; + m_stimulations.erase(std::remove_if(m_stimulations.begin(), m_stimulations.end(), + [curTime](const SStimulationChunk& chunk) { return chunk.date < curTime; }), m_stimulations.end()); + } + else + { + m_chunks.clear(); + m_chunks.push_back(samples.back()); + const double curTime = m_chunks.front().startTime; + m_stimulations.erase(std::remove_if(m_stimulations.begin(), m_stimulations.end(), + [curTime](const SStimulationChunk& chunk) { return chunk.date < curTime; }), m_stimulations.end()); + } + } + else { m_chunks.insert(m_chunks.end(), samples.begin(), samples.end()); } + + return true; +} + +bool CCSVHandler::addEvent(uint64_t code, double date, double duration) +{ + if (std::signbit(date)) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_DateError; + return false; + } + + if (std::signbit(duration)) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_DurationError; + return false; + } + + m_stimulations.emplace_back(code, date, duration); + return true; +} + +bool CCSVHandler::addEvent(const SStimulationChunk& event) +{ + if (std::signbit(event.date)) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_DateError; + return false; + } + + if (std::signbit(event.duration)) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_DurationError; + return false; + } + + m_stimulations.push_back(event); + return true; +} + +bool CCSVHandler::noEventsUntilDate(const double date) +{ + if (std::signbit(date)) + { + m_lastStringError = "Date is negative: "; + m_lastStringError += std::to_string(date); + m_logError = LogErrorCodes_WrongSampleDate; + return false; + } + + m_noEventSince = date; + return true; +} + +std::string CCSVHandler::stimulationsToString(const std::vector& stimulationsToPrint) const +{ + if (stimulationsToPrint.empty()) { return std::string(2, SEPARATOR); } // Empty columns + + std::array stimulations; + + const auto itBegin = stimulationsToPrint.cbegin(); + const auto itEnd = stimulationsToPrint.cend(); + + if (itBegin != itEnd) + { + stimulations.at(0) = std::to_string(itBegin->id); + + std::stringstream ss; + ss.str(""); + ss.precision(m_oPrecision); + ss << std::fixed << itBegin->date; + stimulations.at(1) = ss.str(); + + ss.str(""); + ss << std::fixed << itBegin->duration; + stimulations.at(2) = ss.str(); + } + + for (auto it = itBegin + 1; it != itEnd; ++it) + { + stimulations.at(0) += std::string(1, DATA_SEPARATOR) + std::to_string(it->id); + std::stringstream ss; + ss.str(""); + ss.precision(m_oPrecision); + ss << std::fixed << it->date; + stimulations.at(1) += std::string(1, DATA_SEPARATOR) + ss.str(); + + ss.str(""); + ss << std::fixed << it->duration; + stimulations.at(2) += std::string(1, DATA_SEPARATOR) + ss.str(); + } + + return boost::algorithm::join(stimulations, std::string(1, SEPARATOR)); +} + +std::string CCSVHandler::createHeaderString() +{ + const std::string invalidHeader; + std::string header; + + const auto addColumn = [&](const std::string& columnLabel) + { + if (m_nCol != 0) { header += SEPARATOR; } + + header += columnLabel; + m_nCol++; + }; + + // add Time Header + switch (m_inputTypeID) + { + case EStreamType::Signal: + addColumn("Time" + std::string(1, DATA_SEPARATOR) + std::to_string(m_sampling) + "Hz"); + break; + + case EStreamType::Spectrum: + if (m_dimSizes.size() != 2) + { + m_lastStringError = "Channel names and number of frequency are needed to write time column"; + return invalidHeader; + } + + addColumn( + "Time" + std::string(1, DATA_SEPARATOR) + std::to_string(m_dimSizes[0]) + std::string(1, DIMENSION_SEPARATOR) + std::to_string(m_dimSizes[1]) + + std::string(1, DATA_SEPARATOR) + std::to_string(m_nSampleOriginal != 0 ? m_nSampleOriginal : m_dimSizes[0] * m_dimSizes[1])); + break; + + case EStreamType::CovarianceMatrix: + case EStreamType::StreamedMatrix: + case EStreamType::FeatureVector: + if (m_nDim == 0) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_DimensionCountZero; + return invalidHeader; + } + { + std::string timeColumn = "Time" + std::string(1, DATA_SEPARATOR); + + for (size_t index = 0; index < m_nDim; ++index) + { + timeColumn += std::to_string(m_dimSizes[index]); + if ((index + 1) < m_nDim) { timeColumn += std::string(1, DIMENSION_SEPARATOR); } + } + + addColumn(timeColumn); + } + break; + } + + // add Epoch Header to signal + switch (m_inputTypeID) + { + case EStreamType::Signal: + addColumn("Epoch"); + break; + + case EStreamType::Spectrum: + case EStreamType::StreamedMatrix: + case EStreamType::CovarianceMatrix: + case EStreamType::FeatureVector: + addColumn("End Time"); + break; + } + + // add matrix columns names + if (m_dimLabels.empty()) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_NoMatrixLabels; + return invalidHeader; + } + + switch (m_inputTypeID) + { + case EStreamType::Signal: + case EStreamType::FeatureVector: + for (const std::string& label : m_dimLabels) { addColumn(label); } + break; + + case EStreamType::CovarianceMatrix: + case EStreamType::StreamedMatrix: + { + const size_t matrixColumns = std::accumulate(m_dimSizes.begin(), m_dimSizes.end(), 1U, std::multiplies()); + + if (matrixColumns == 0) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_DimensionSizeZero; + return invalidHeader; + } + + std::vector position(m_nDim, 0); + m_nCol += matrixColumns; + + do + { + header += SEPARATOR; + size_t previousDimensionsSize = 0; + + for (size_t index = 0; index < position.size(); ++index) + { + header += m_dimLabels[previousDimensionsSize + position[index]]; + previousDimensionsSize += m_dimSizes[index]; + + if ((index + 1) < position.size()) { header += std::string(1, DATA_SEPARATOR); } + } + } while (this->increasePositionIndexes(position)); + } + break; + + case EStreamType::Spectrum: + for (const std::string& label : m_dimLabels) + { + for (double frequencyAbscissa : m_frequencyAbscissa) { addColumn(label + std::string(1, DATA_SEPARATOR) + std::to_string(frequencyAbscissa)); } + } + break; + } + + addColumn(EVENT_ID_COL); + addColumn(EVENT_DATE_COL); + addColumn(EVENT_DURATION_COL + "\n"); + return header; +} + +bool CCSVHandler::createCSVStringFromData(const bool canWriteAll, std::string& csv) +{ + // if chunks is empty, their is no more lines to write + if (m_chunks.empty()) { return true; } + + // if header isn't written, size of first line to write will be the reference + if (m_nCol == 0) + { + m_nCol = m_chunks.front().matrix.size(); + m_nCol += N_PRE_DATA_COL + N_POST_DATA_COL; // Will be set correctly with call to setFormatType + } + + // loop will add a line to the buffer while the last stimulation date registered is greater than the end of the current chunk or until their is an event + uint64_t linesWritten = 0; + + while (!m_chunks.empty() && (canWriteAll + || (m_stimulations.empty() && m_chunks.front().endTime <= m_noEventSince) + || (!m_stimulations.empty() && m_chunks.front().startTime <= m_stimulations.back().date)) + ) + { + // Signal data must be written as sampleCounterPerBuffer th lines; + if (m_inputTypeID == EStreamType::Signal && canWriteAll == false && linesWritten != 0 && linesWritten % m_nSamplePerBuffer == 0) { break; } + // check line size + + if ((m_inputTypeID == EStreamType::Signal || m_inputTypeID == EStreamType::Spectrum) + && (m_chunks.front().matrix.size() + N_PRE_DATA_COL + N_POST_DATA_COL) != m_nCol) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_WrongLineSize; + return false; + } + + if (m_inputTypeID == EStreamType::FeatureVector || m_inputTypeID == EStreamType::CovarianceMatrix || m_inputTypeID == EStreamType::StreamedMatrix) + { + size_t columnstoHave = std::accumulate(m_dimSizes.begin(), m_dimSizes.end(), 1U, std::multiplies()); + columnstoHave += N_PRE_DATA_COL + N_POST_DATA_COL; + + if (columnstoHave != m_nCol) + { + m_lastStringError = "Line size is " + std::to_string(columnstoHave) + " but must be " + std::to_string(m_nCol); + m_logError = LogErrorCodes_WrongLineSize; + return false; + } + } + + // Time and Epoch + const std::pair currentTime = { m_chunks.front().startTime, m_chunks.front().endTime }; + std::stringstream ss; + ss.str(""); + ss.precision(m_oPrecision); + ss << std::fixed << currentTime.first; + + csv += ss.str(); + + switch (m_inputTypeID) + { + case EStreamType::Spectrum: + case EStreamType::StreamedMatrix: + case EStreamType::CovarianceMatrix: + case EStreamType::FeatureVector: + ss.str(""); + ss << std::fixed << currentTime.second; + csv += std::string(1, SEPARATOR) + ss.str(); + break; + + case EStreamType::Signal: + csv += std::string(1, SEPARATOR) + std::to_string(m_chunks.front().epoch); + break; + } + + // Matrix + for (const double& value : m_chunks.front().matrix) + { + csv += SEPARATOR; + ss.str(""); + ss << std::fixed << value; + csv += ss.str(); + } + + m_chunks.pop_front(); + + csv += SEPARATOR; + + // Stimulations + if (!m_stimulations.empty()) + { + std::vector stimulationsToWrite; + + double stimulationTime = m_stimulations.front().date; + + while ((stimulationTime - currentTime.first) < (currentTime.second - currentTime.first)) + { + stimulationsToWrite.push_back(m_stimulations.front()); + m_stimulations.pop_front(); + + if (m_stimulations.empty()) { break; } + + stimulationTime = m_stimulations.front().date; + } + + csv += stimulationsToString(stimulationsToWrite); + } + else { csv += std::string(2, SEPARATOR); } + + csv += "\n"; + linesWritten++; + } + + return true; +} + +bool CCSVHandler::parseHeader() +{ + if (m_isHeaderRead) { return true; } + + std::string header; + m_fs.clear(); // Useful if the end of file is reached before. + m_fs.seekg(0); + + if (!this->streamReader(m_fs, header, END_OF_LINE_CHAR, m_bufferReadFileLine)) + { + m_lastStringError = "No header in the file or file empty"; + m_logError = LogErrorCodes_EmptyColumn; + return false; + } + + m_isHeaderRead = true; + + std::vector columns; + + this->split(header, SEPARATOR, columns); + + m_nCol = columns.size(); + + if (columns.empty()) + { + m_lastStringError = "No header in the file or file empty"; + m_logError = LogErrorCodes_EmptyColumn; + return false; + } + + for (const std::string& columnPart : columns) + { + if (columnPart.empty()) + { + m_lastStringError.clear(); + m_logError = LogErrorCodes_EmptyColumn; + return false; + } + } + + if (!m_hasInputType) + { + m_lastStringError = "Cannot read header without input type"; + m_logError = LogErrorCodes_WrongHeader; + return false; + } + + m_fs.clear(); // Useful if the end of file is reached before. + m_fs.seekg(header.size() + 2); // Go to the begin of the next line + m_bufferReadFileLine.clear(); + + switch (m_inputTypeID) + { + case EStreamType::Signal: + if (!this->parseSignalHeader(columns)) + { + m_logError = LogErrorCodes_WrongHeader; + return false; + } + break; + + case EStreamType::Spectrum: + if (!this->parseSpectrumHeader(columns)) + { + m_logError = LogErrorCodes_WrongHeader; + return false; + } + break; + + case EStreamType::StreamedMatrix: + case EStreamType::CovarianceMatrix: + case EStreamType::FeatureVector: + if (!this->parseMatrixHeader(columns)) + { + m_logError = LogErrorCodes_WrongHeader; + return false; + } + break; + } + + m_fs.clear(); // Useful if the end of file is reached before. + m_fs.seekg(header.size() + 2); // Go to the begin of the next line + m_bufferReadFileLine.clear(); + + // check stimulations + if (columns.cend()[-int(N_POST_DATA_COL)] != EVENT_ID_COL + || columns.cend()[-int(N_PRE_DATA_COL)] != EVENT_DATE_COL + || columns.back() != EVENT_DURATION_COL) + { + m_lastStringError = "Three last column must be \"Even Id\", \"Event Date\" and \"Event Duration\""; + m_logError = LogErrorCodes_WrongHeader; + return false; + } + + m_nCol = columns.size(); + + return true; +} + +bool CCSVHandler::parseSignalHeader(const std::vector& header) +{ + //check time + if (header[TIME_COL_IDX].substr(0, 5) != "Time:" + || header[TIME_COL_IDX].substr(header[TIME_COL_IDX].size() - 2) != "Hz" + || header[TIME_COL_IDX].size() <= 7) + { + m_lastStringError = "First column (" + header[TIME_COL_IDX] + ") is not well formed"; + return false; + } + + // get sampling rate + try { m_sampling = std::stoul(header[TIME_COL_IDX].substr(5, header[TIME_COL_IDX].size() - 3)); } + catch (const std::exception& ia) + { + m_lastStringError = "On entry \"" + header[0].substr(5, header[0].size() - 3) + "\", exception have been thrown: "; + m_lastStringError += ia.what(); + return false; + } + + // check epoch + if (header[SIGNAL_EPOCH_COL_IDX] != "Epoch") + { + m_lastStringError = "Second column (" + header[SIGNAL_EPOCH_COL_IDX] + ") must be Epoch column"; + return false; + } + + // get dimension labels + for (size_t index = N_PRE_DATA_COL; index < header.size() - N_POST_DATA_COL; ++index) { m_dimLabels.push_back(header[index]); } + + if (!this->calculateSampleCountPerBuffer()) { return false; } // m_LastErrorString set in the function, m_LogError set outside the function + + return true; +} + +bool CCSVHandler::parseSpectrumHeader(const std::vector& header) +{ + m_dimSizes.clear(); + // check time column + std::string buffer; + std::istringstream iss(header[TIME_COL_IDX]); + + std::string bufferTemp; + + if (!this->streamReader(iss, buffer, DATA_SEPARATOR, bufferTemp)) + { + m_lastStringError = "First column (" + header[TIME_COL_IDX] + ") is empty"; + return false; + } + + if (buffer != "Time") + { + m_lastStringError = "First column (" + header[TIME_COL_IDX] + + ") is not well formed, must have \"Time\" written before the first inqternal data separator (\':\' as default)"; + return false; + } + + const auto getNextElem = [&](size_t& resultvar, const char separator, const char* missingString) + { + this->streamReader(iss, buffer, separator, bufferTemp); + + if (buffer.empty()) { m_lastStringError = "First column (" + header[TIME_COL_IDX] + ") is not well formed, missing " + missingString; } + + try { resultvar = std::stoul(buffer); } + catch (std::exception& e) + { + m_lastStringError = "On entry \"" + buffer + "\", exception have been thrown: "; + m_lastStringError += e.what(); + return false; + } + + return true; + }; + + size_t dimensionSize = 0; + + if (!getNextElem(dimensionSize, DIMENSION_SEPARATOR, "channels number")) { return false; } + + m_dimSizes.push_back(dimensionSize); + + if (!getNextElem(dimensionSize, DATA_SEPARATOR, "number frequencies per channel")) { return false; } + + m_dimSizes.push_back(dimensionSize); + + if (!getNextElem(m_nSampleOriginal, '\0', "original number of samples")) { return false; } + + if (m_dimSizes[0] == 0 || m_dimSizes[1] == 0) + { + m_lastStringError = "Dimension size must be only positive"; + return false; + } + + //check Time End column + if (header[END_TIME_COL_IDX] != "End Time") + { + m_lastStringError = "Second column (" + header[END_TIME_COL_IDX] + ") must be End Time Column"; + return false; + } + + // add every new label + + std::string channelLabel; + m_dimLabels.clear(); + + for (size_t labelCounter = 0; labelCounter < m_dimSizes[0]; labelCounter++) + { + double lastFrequency = 0.0; + + for (size_t labelSizeCounter = 0; labelSizeCounter < m_dimSizes[1]; labelSizeCounter++) + { + std::string dimensionData; + // get channel name and check that it's the same one for all the frequency dimension size + std::vector spectrumChannel; + this->split(header.at((labelCounter * m_dimSizes[1]) + labelSizeCounter + N_PRE_DATA_COL), DATA_SEPARATOR, spectrumChannel); + + if (spectrumChannel.size() != 2) + { + m_lastStringError = "Spectrum channel is invalid: " + header.at((labelCounter * m_dimSizes[1]) + labelSizeCounter + N_PRE_DATA_COL); + return false; + } + + dimensionData = spectrumChannel[0]; + + if (labelSizeCounter == 0) + { + channelLabel = dimensionData; + m_dimLabels.push_back(channelLabel); + } + else if (channelLabel != dimensionData) + { + m_lastStringError = "Channel name must be the same during " + std::to_string(m_dimSizes[1]) + + " columns (number of frequencies per channel)"; + return false; + } + + // get all frequency and check that they're the same for all labels + dimensionData = spectrumChannel[1]; + + if (labelCounter == 0) + { + double frequency; + + try { frequency = std::stod(dimensionData); } + catch (const std::exception& e) + { + m_lastStringError = "On entry \"" + dimensionData + "\", exception have been thrown: "; + m_lastStringError += e.what(); + return false; + } + + m_frequencyAbscissa.push_back(frequency); + } + else + { + double frequency; + + try { frequency = std::stod(dimensionData); } + catch (const std::exception& e) + { + m_lastStringError = "On entry \"" + dimensionData + "\", exception have been thrown: "; + m_lastStringError += e.what(); + return false; + } + + if (labelSizeCounter == 0) { lastFrequency = frequency; } + else if (frequency < lastFrequency) + { + m_lastStringError = "Frequencies must be in ascending order"; + return false; + } + + if (!(std::fabs(frequency - m_frequencyAbscissa[labelSizeCounter]) < std::numeric_limits::epsilon())) + { + m_lastStringError = "Channels must have the same frequency bands"; + return false; + } + } + } + } + + m_nSamplePerBuffer = 1; + return true; +} + +bool CCSVHandler::parseMatrixHeader(const std::vector& header) +{ + // check time column + std::istringstream iss(header[TIME_COL_IDX]); + std::string linePart; + // check Time is written + + std::string bufferTemp; + + if (!this->streamReader(iss, linePart, DATA_SEPARATOR, bufferTemp)) + { + m_lastStringError = "First column is empty"; + return false; + } + if (linePart != "Time") + { + m_lastStringError = "First column " + header[TIME_COL_IDX] + " is not well formed"; + return false; + } + + linePart = header[TIME_COL_IDX].substr(5); + + m_dimSizes.clear(); + std::vector dimensionParts; + this->split(linePart, DIMENSION_SEPARATOR, dimensionParts); + m_nDim = 0; + + for (const std::string& dimensionSize : dimensionParts) + { + size_t size = 0; + + try { size = std::stoul(dimensionSize); } + catch (std::exception& e) + { + m_lastStringError = "Error on a dimension size, exception have been thrown: "; + m_lastStringError += e.what(); + return false; + } + + if (size == 0) + { + m_lastStringError = "A dimension size must be strictly positive"; + return false; + } + + m_dimSizes.push_back(size); + m_nDim++; + } + + if (m_nDim == 0) + { + m_lastStringError = "First column must indicate at least one dimension size"; + return false; + } + + // check columnLabels number according to dimension sizes + const size_t matrixColumnCount = std::accumulate(m_dimSizes.begin(), m_dimSizes.end(), 1, std::multiplies()); + + if ((matrixColumnCount + N_PRE_DATA_COL + N_POST_DATA_COL) != header.size()) + { + m_lastStringError = "Every line must have " + std::to_string(matrixColumnCount + N_PRE_DATA_COL + N_POST_DATA_COL) + " columnLabels"; + return false; + } + + // it saves labels for each dimensions + std::vector> labelsInDimensions(m_nDim); + + // check if labels are already filled or if it's a reset (labels are empty before being set, but empty labels are accepted) + std::vector> filledLabel(m_nDim); + + for (size_t index = 0; index < m_dimSizes.size(); ++index) + { + labelsInDimensions[index].resize(m_dimSizes[index]); + filledLabel[index].resize(m_dimSizes[index], false); + } + + // corresponding to the position in the multi multidimensional matrix (as exemple the third label of the second dimension will be positionsInDimensions[1] = 2) + std::vector positionsInDimensions(m_nDim, 0); + size_t columnIndex = 0; + + // we will visit each column containing matrix labels + do + { + std::vector columnLabels; + + // get all column part + this->split(header[columnIndex + N_PRE_DATA_COL], DATA_SEPARATOR, columnLabels); + + if (columnLabels.size() != m_nDim) + { + m_lastStringError = "On column " + std::to_string(columnIndex + N_PRE_DATA_COL) + "(" + header[columnIndex + N_PRE_DATA_COL] + + "), there is " + std::to_string(columnLabels.size()) + " label instead of " + std::to_string(m_nDim); + m_logError = LogErrorCodes_WrongHeader; + return false; + } + + // check column labels one per one + for (size_t dimensionIndex = 0; dimensionIndex < columnLabels.size(); dimensionIndex++) + { + const size_t positionInCurrentDimension = positionsInDimensions[dimensionIndex]; + + if (columnLabels[dimensionIndex].empty()) + { + // if saved label is empty, mark it as saved (even if it is already) + if (labelsInDimensions[dimensionIndex][positionInCurrentDimension].empty()) { filledLabel[dimensionIndex][positionInCurrentDimension] = true; } + // else,there is an error, it means that label is already set + else + { + m_lastStringError = "Error at column " + std::to_string(columnIndex + 1) + + " for the label \"" + columnLabels[dimensionIndex] + + "\" in dimension " + std::to_string(dimensionIndex + 1) + + " is trying to reset label to \"" + columnLabels[dimensionIndex] + + "\" that have been already set to \"" + labelsInDimensions[dimensionIndex][positionInCurrentDimension] + + "\""; + m_logError = LogErrorCodes_WrongHeader; + return false; + } + } + else + { + // if label is already set, check that it'st the same, if it's not, there is an error + if (labelsInDimensions[dimensionIndex][positionInCurrentDimension] != columnLabels[dimensionIndex] + && filledLabel[dimensionIndex][positionInCurrentDimension]) + { + m_lastStringError = "Error at column " + std::to_string(columnIndex + 1) + " for the label \"" + columnLabels[dimensionIndex] + + "\" in dimension " + std::to_string(dimensionIndex + 1) + " is trying to reset label to \"" + columnLabels[ + dimensionIndex] + + "\" that have been already set to \"" + labelsInDimensions[dimensionIndex][positionInCurrentDimension] + "\""; + m_logError = LogErrorCodes_WrongHeader; + return false; + } + // if label isn't set, set it + if (!(filledLabel[dimensionIndex][positionInCurrentDimension])) + { + labelsInDimensions[dimensionIndex][positionInCurrentDimension] = columnLabels[dimensionIndex]; + filledLabel[dimensionIndex][positionInCurrentDimension] = true; + } + } + } + + columnIndex++; + } while (increasePositionIndexes(positionsInDimensions)); + + for (const std::vector& dimensionIndex : labelsInDimensions) + { + m_dimLabels.insert(m_dimLabels.end(), dimensionIndex.begin(), dimensionIndex.end()); + } + + m_nSamplePerBuffer = 1; + + return true; +} + +bool CCSVHandler::readSampleChunk(const std::string& line, SMatrixChunk& sample, const size_t lineNb) +{ + const auto firstColumn = std::find(line.cbegin(), line.cend(), SEPARATOR); + const auto secondColumn = std::find(firstColumn + 1, line.cend(), SEPARATOR); + + if (lineNb % m_nSamplePerBuffer == 0) + { + if (!boost::spirit::qi::parse(line.cbegin(), firstColumn, boost::spirit::qi::double_, sample.startTime)) + { + m_lastStringError = "Invalid value for the start time. Error on line " + std::to_string(lineNb); + m_logError = LogErrorCodes_InvalidArgumentException; + return false; + } + } + + if (m_inputTypeID == EStreamType::Signal) + { + if (!boost::spirit::qi::parse(firstColumn + 1, secondColumn, boost::spirit::qi::ulong_long, sample.epoch)) + { + m_lastStringError = "Invalid value for the epoch. Error on line " + std::to_string(lineNb); + m_logError = LogErrorCodes_InvalidArgumentException; + return false; + } + + sample.endTime = sample.startTime + (double(m_nSamplePerBuffer) / double(m_sampling)); + } + else + { + sample.epoch = std::numeric_limits::max(); + + if (!boost::spirit::qi::parse(firstColumn + 1, secondColumn, boost::spirit::qi::double_, sample.endTime)) + { + m_lastStringError = "Invalid value for the end time. Error on line " + std::to_string(lineNb); + m_logError = LogErrorCodes_InvalidArgumentException; + return false; + } + } + + const size_t eventDurationCol = line.find_last_of(SEPARATOR); + const size_t eventDateCol = line.find_last_of(SEPARATOR, eventDurationCol - 1); + const size_t eventIdCol = line.find_last_of(SEPARATOR, eventDateCol - 1); + + std::vector colMatrix; + + boost::spirit::qi::phrase_parse(secondColumn + 1, line.cbegin() + eventIdCol, boost::spirit::qi::double_ % SEPARATOR, boost::spirit::ascii::space, + colMatrix); + + if (colMatrix.size() != m_nCol - N_POST_DATA_COL - N_PRE_DATA_COL) + { + m_lastStringError = "Invalid number of channel. Error on line " + std::to_string(lineNb); + m_logError = LogErrorCodes_InvalidArgumentException; + return false; + } + + if (m_inputTypeID == EStreamType::Signal) + { + for (size_t index = 0; index < m_dimLabels.size(); ++index) { sample.matrix[(index * m_nSamplePerBuffer) + lineNb] = colMatrix[index]; } + } + else if (m_inputTypeID == EStreamType::Spectrum) + { + for (size_t index = 0; index < colMatrix.size(); ++index) { sample.matrix[(index * m_nSamplePerBuffer) + lineNb] = colMatrix[index]; } + } + else + { + sample.matrix.clear(); + std::move(colMatrix.begin(), colMatrix.end(), std::back_inserter(sample.matrix)); + } + + return true; +} + +bool CCSVHandler::readStimulationChunk(const std::string& line, std::vector& stimulations, const size_t /*lineNb*/) +{ + const size_t eventDurationCol = line.find_last_of(SEPARATOR); + const size_t eventDateCol = line.find_last_of(SEPARATOR, eventDurationCol - 1); + const size_t eventIdCol = line.find_last_of(SEPARATOR, eventDateCol - 1); + + std::vector stimIDs; + // pick all time identifiers for the current time + boost::spirit::qi::phrase_parse(line.cbegin() + eventIdCol + 1, line.cbegin() + eventDateCol, boost::spirit::qi::ulong_long % DATA_SEPARATOR, + boost::spirit::ascii::space, stimIDs); + + std::vector stimDates; + // pick all time identifiers for the current time + boost::spirit::qi::phrase_parse(line.cbegin() + eventDateCol + 1, line.cbegin() + eventDurationCol, boost::spirit::qi::double_ % DATA_SEPARATOR, + boost::spirit::ascii::space, stimDates); + + std::vector stimDurations; + // pick all time identifiers for the current time + boost::spirit::qi::phrase_parse(line.cbegin() + eventDurationCol + 1, line.cend(), boost::spirit::qi::double_ % DATA_SEPARATOR, boost::spirit::ascii::space, + stimDurations); + + if (stimIDs.size() != stimDates.size() || stimIDs.size() != stimDurations.size()) + { + m_lastStringError = "There is " + std::to_string(stimIDs.size()) + " identifiers, " + std::to_string(stimDates.size()) + " dates, and " + std:: + to_string(stimDurations.size()) + " durations"; + m_logError = LogErrorCodes_StimulationSize; + return false; + } + + for (size_t index = 0; index < stimIDs.size(); ++index) { stimulations.emplace_back(stimIDs[index], stimDates[index], stimDurations[index]); } + + return true; +} + +bool CCSVHandler::increasePositionIndexes(std::vector& position) +{ + position.back()++; + + for (size_t counter = 1; counter <= position.size(); ++counter) + { + const size_t index = position.size() - counter; + + if ((position[index] + 1) > m_dimSizes[index]) + { + if (index != 0) + { + position[index] = 0; + position[index - 1]++; + } + else if ((position[index] + 1) > m_dimSizes[index]) { return false; } + } + } + return true; +} + +bool CCSVHandler::calculateSampleCountPerBuffer() +{ + // get samples per buffer + std::vector lineParts({ "", "0" }); + size_t nSample = 0; + + std::string bufferTemp; + + while (lineParts[SIGNAL_EPOCH_COL_IDX] == "0") + { + std::string line; + + if (!this->streamReader(m_fs, line, END_OF_LINE_CHAR, bufferTemp)) + { + // protect against nSample--, no need here + nSample++; + break; + } + + lineParts.clear(); + this->split(line, SEPARATOR, lineParts); + + if (lineParts.size() != size_t(m_nCol)) + { + m_lastStringError = "File may be corrupt, can't found sample count per buffer"; + return false; + } + + nSample++; + } + + // assume that we might read too far + nSample--; + + if (nSample == 0) + { + m_lastStringError = "File contain no data to get sample count per buffer, or is corrupted"; + return false; + } + + m_nSamplePerBuffer = nSample; + return true; +} + + +CSV_API ICSVHandler* createCSVHandler() { return new CCSVHandler(); } + +CSV_API void releaseCSVHandler(ICSVHandler* object) { delete dynamic_cast(object); } + +} // namespace CSV +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/modules/csv/src/ovCCSV.hpp b/Masterarbeit/openvibe/sdk-master/modules/csv/src/ovCCSV.hpp new file mode 100755 index 0000000..c09e29b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/csv/src/ovCCSV.hpp @@ -0,0 +1,355 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE SDK + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#pragma once + +#include + +#include +#include +#include + +namespace OpenViBE { +namespace CSV { +class CCSVHandler final : public ICSVHandler +{ +public: + /** + * \brief Set lib value to default + */ + CCSVHandler() : m_inputTypeID(EStreamType::StreamedMatrix), m_dimSizes({}) {} + + /** + * \brief Close the file if it is open. + */ + ~CCSVHandler() override { this->closeFile(); } + + /** + * \brief Get the floating point precision used to write float values. + * + * \return the Floating point precision. + */ + size_t getOutputFloatPrecision() override { return m_oPrecision; } + + /** + * \brief Set the floating point precision used to write float values. + * + * \param precision the floating point precision. + */ + void setOutputFloatPrecision(const size_t precision) override { m_oPrecision = precision; } + + void setFormatType(const EStreamType typeID) override; + EStreamType getFormatType() override { return m_inputTypeID; } + + void setLastMatrixOnlyMode(const bool isActivated) override { m_lastMatrixOnly = isActivated; } + bool getLastMatrixOnlyMode() override { return m_lastMatrixOnly; } + + bool setSignalInformation(const std::vector& channelNames, size_t sampling, size_t nSamplePerBuffer) override; + bool getSignalInformation(std::vector& channelNames, size_t& sampling, size_t& nSamplePerBuffer) override; + + bool setSpectrumInformation(const std::vector& channelNames, const std::vector& frequencyAbscissa, size_t sampling) override; + bool getSpectrumInformation(std::vector& channelNames, std::vector& frequencyAbscissa, size_t& sampling) override; + + bool setFeatureVectorInformation(const std::vector& channelNames) override; + bool getFeatureVectorInformation(std::vector& channelNames) override; + + bool setStreamedMatrixInformation(const std::vector& dimSizes, const std::vector& labels) override; + bool getStreamedMatrixInformation(std::vector& dimSizes, std::vector& labels) override; + + /** + * \brief Write the header to the file + * + * \retval True in case of success. + * \retval False in case of error. + */ + bool writeHeaderToFile() override; + + /** + * \brief Write current available data to the file until the last stimulation or if you set that it will not have new event before a date. + * + * \retval True in case of success. + * \retval False in case of error. + * + * \sa noEventsUntilDate + */ + bool writeDataToFile() override; + + /** + * \brief Write current available data to the file. + * + * \retval True in case of success. + * \retval False in case of error. + */ + bool writeAllDataToFile() override; + + /** + * \brief Read samples and stimulations. + * + * \param lineNb Maximum number of lines to read. If there is no more data in the file, the number of lines read can be lower. + * \param chunks[out] Valid chunks read. + * \param stimulations[out] Valid stimulations read. + * + * \retval True in case of success, even if the number of lines is different than the lineNb parameter. + * \retval False in case of error. + */ + bool readSamplesAndEventsFromFile(size_t lineNb, std::vector& chunks, std::vector& stimulations) override; + + /** + * \brief Open a OV CSV file. + * + * \retval True in case of success. + * \retval False in case of error. + */ + bool openFile(const std::string& fileName, EFileAccessMode mode) override; + + /** + * \brief Close the opened file. + * + * \retval True in case of success. + * \retval False in case of error. + */ + bool closeFile() override; + + /** + * \brief Add a single sample. + * + * \retval True in case of success. + * \retval False in case of error. + */ + bool addSample(const SMatrixChunk& sample) override; + + /** + * \brief Add several samples. + * + * \retval True in case of success. + * \retval False in case of error. + */ + bool addBuffer(const std::vector& samples) override; + + /** + * \brief Add a single stimulation. + * + * \retval True in case of success. + * \retval False in case of error. + */ + bool addEvent(uint64_t code, double date, double duration) override; + + /** + * \brief Add several stimulations. + * + * \retval True in case of success. + * \retval False in case of error. + */ + bool addEvent(const SStimulationChunk& event) override; + + /** + * \brief Guarantee that will not have new event before a date. + * This information is used to allow the library to write all the chunks available, before this date, to a file. + * + * \retval True in case of success. + * \retval False in case of error. + * + * \sa writeDataToFile + */ + bool noEventsUntilDate(double date) override; + + ELogErrorCodes getLastLogError() override { return m_logError; } + + std::string getLastErrorString() override { return m_lastStringError; } + + /** + * \brief Check if there is still data to read in the file. + * + * \retval True if there is still data to read in the file. + * \retval False if there is no more data to read in the file. + */ + bool hasDataToRead() const override { return m_hasDataToRead; } + +private: + /** + * \brief Split a string into a vector of strings. + * + * \param in String to split. + * \param delimiter Delimitor. + * \param out[out] Vector of string. + */ + void split(const std::string& in, char delimiter, std::vector& out) const; + + /** + * \brief Create a string with stimulations to add in the buffer. + * + * \param stimulationsToPrint stimulations to put into the buffer + * + * \return string with stimulations to write + */ + std::string stimulationsToString(const std::vector& stimulationsToPrint) const; + + /** + * \brief Create a string representation of the header data. + * + * \retval true Header data as it should be written in the file + * \retval "" in case of error + */ + std::string createHeaderString(); + + /** + * \brief Set the buffer in function of data saved. + * + * \param canWriteAll true if it must write all lines, false if it write only the next buffer + * \param csv The CSV string. + * + * \retval true in case of success + * \retval false in case of wrong data sent + */ + bool createCSVStringFromData(bool canWriteAll, std::string& csv); + + /** + * \brief Parsing header to read data. + * + * \retval true in case of correct header + * \retval false in case of incorrect header + */ + bool parseHeader(); + + /** + * \brief Parsing header to read signal data. + * + * \param header[out] + * + * \retval true in case of correct header + * \retval false in case of incorrect header + */ + bool parseSignalHeader(const std::vector& header); + + /** + * \brief Parsing header to read Spectrum data. + * + * \param header[out] + * + * \retval true in case of correct header + * \retval false in case of incorrect header + */ + bool parseSpectrumHeader(const std::vector& header); + + /** + * \brief Parsing header to read matrix data (Streamed Matrix, Covariance matrix and Feature Vector). + * + * \param header[out] + * + * \retval true in case of correct header + * \retval false in case of incorrect header + */ + bool parseMatrixHeader(const std::vector& header); + + /** + * \brief Read line data concerning time, epoch and matrix. + * + * \param line line to read + * \param sample[out] reference to stock data in + * \param lineNb index of the read line + * + * \retval true in case of success + * \retval false in case of error (as letters instead of numbers) + */ + bool readSampleChunk(const std::string& line, SMatrixChunk& sample, size_t lineNb); + + /** + * \brief Read line data conerning stimulations. + * + * \param line the line to read + * \param stimulations[out] vector to stock stimulations in (identifier, date and duration) + * \param lineNb the line actually reading + * + * \retval true in case of success + * \retval false in case of error (as letters instead of numbers) + */ + bool readStimulationChunk(const std::string& line, std::vector& stimulations, size_t lineNb); + + /** + * \brief Update position into the matrix while reading or writing. + * + * \param position[out] is the position into the matrix + * + * \retval true in case of success + * \retval false in case of browse matrix + */ + bool increasePositionIndexes(std::vector& position); + + /** + * \brief Read lines of the first epoch to found sample count per buffer. + * + * \retval true in case of success + * \retval false in case of error + */ + bool calculateSampleCountPerBuffer(); + + /** + * \brief Read a stream until a delimiter and provide the string before the delimiter. + * + * \param in The stream to read. + * \param out The string before the next delimitor. + * \param delimiter The delimiter . + * \param bufferHistory + */ + bool streamReader(std::istream& in, std::string& out, char delimiter, std::string& bufferHistory) const; + + std::fstream m_fs; + std::string m_filename; + std::deque m_chunks; + std::deque m_stimulations; + ELogErrorCodes m_logError = LogErrorCodes_NoError; + std::string m_lastStringError = ""; + + EStreamType m_inputTypeID; + + typedef std::istream& GetLine(std::istream& in, std::string& out, char delimiter); + size_t m_nDim = 0; + std::vector m_dimSizes; + std::vector m_dimLabels; + size_t m_nSamplePerBuffer = 0; + double m_noEventSince = 0; + + std::vector m_frequencyAbscissa; + + size_t m_sampling = 0; + size_t m_nCol = 0; + + bool m_hasInputType = false; + bool m_isFirstLineWritten = false; + bool m_isHeaderRead = false; + bool m_isSetInfoCalled = false; + bool m_hasEpoch = false; + + size_t m_nSampleOriginal = 0; + size_t m_oPrecision = 10; + + bool m_lastMatrixOnly = false; + + std::string m_bufferReadFileLine; // Buffer used to store unused read chars. + + bool m_hasDataToRead = true; + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + bool m_isCRLFEOL = false; // Is a CRLF end of line +#endif +}; +} // namespace CSV +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/modules/csv/src/ovICSV.cpp b/Masterarbeit/openvibe/sdk-master/modules/csv/src/ovICSV.cpp new file mode 100644 index 0000000..a022cd7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/csv/src/ovICSV.cpp @@ -0,0 +1,50 @@ +#include + +#include + +namespace OpenViBE { +namespace CSV { + +static const std::map ERROR_MAP = +{ + { LogErrorCodes_ErrorWhileClosing, "Error while closing the file" }, + { LogErrorCodes_NoFileDefined, "No file defined yet" }, + { LogErrorCodes_CantOpenFile, "Could not open the file" }, + { LogErrorCodes_DurationError, "The duration can't be negative" }, + { LogErrorCodes_DateError, "The date can't be negative" }, + { LogErrorCodes_NoSample, "Their is no sample to add" }, + { LogErrorCodes_NoMatrixLabels, "No matrix labels" }, + { LogErrorCodes_WrongMatrixSize, "Matrix size is different from the initial size" }, + { LogErrorCodes_MatrixEmpty, "A matrix of the buffer is empty" }, + { LogErrorCodes_DimensionSizeZero, "Dimensions can not have size equal to 0" }, + { LogErrorCodes_DimensionSizeEmpty, "Dimension sizes vector is empty" }, + { LogErrorCodes_NoChannelsName, "No channel names in the vector" }, + { LogErrorCodes_SetInfoOnce, "The setTypeInformation function should be called only once" }, + { LogErrorCodes_WrongInputType, "Wrong input type" }, + { LogErrorCodes_WrongHeader, "Error in the header of the file" }, + { LogErrorCodes_WrongLineSize, "There is a difference between the current line size and the size that it should have" }, + { LogErrorCodes_SampleNotEmpty, "Matrix must be empty to store in results of reading" }, + { LogErrorCodes_NotEnoughLines, "Can't reach the line in parameter, not enough lines in the file" }, + { LogErrorCodes_NegativeStimulation, "Stimulations cannot have negatives values" }, + { LogErrorCodes_WrongSampleDate, "Sample dates must be correct (greater than or equal to zero, and start date less than end date)" }, + { LogErrorCodes_InvalidStimulationArgument, "Wrong stimulation entry" }, + { LogErrorCodes_StimulationSize, "Some stimulation(s) has/have incomplete parameter(s)" }, + { LogErrorCodes_EmptyColumn, "A column of the file is empty" }, + { LogErrorCodes_WrongDimensionSize, "Size of dimension sizes vector must be equal to the number of dimensions" }, + { LogErrorCodes_DimensionCountZero, "Number of dimension must be at least 1" }, + { LogErrorCodes_OutOfRangeException, "Convertion from string to number is impossible : string is out of range" }, + { LogErrorCodes_InvalidArgumentException, "An invalid argument exeption have been thrown" }, + { LogErrorCodes_CantWriteHeader, "Can not write header, data already began to be written or header already written" }, + { LogErrorCodes_ErrorWhileWriting, "Error occured while trying to write" }, + { LogErrorCodes_WrongParameters, "Error with (one of )the parameter(s)" }, + { LogErrorCodes_MissingData, "Missing data in file, file may be corrupted" } +}; + +std::string ICSVHandler::getLogError(const ELogErrorCodes code) +{ + if (ERROR_MAP.count(code) != 0) { return ERROR_MAP.at(code); } + return "Unknow error"; +} + +} // namespace CSV +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/modules/date/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/modules/date/CMakeLists.txt new file mode 100644 index 0000000..fd402d0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/date/CMakeLists.txt @@ -0,0 +1,64 @@ +PROJECT(openvibe-module-date) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +SET(SRC_FILES + include/date/defines.h + include/date/DateParser.h + src/DateParser.cpp + ) + +IF(WIN32) + LIST(APPEND SRC_FILES + "include/date/WindowsDateParser.h" + "src/WindowsDateParser.cpp" + ) +ENDIF() + +INCLUDE_DIRECTORIES(include/date) +INCLUDE("FindSourceRCProperties") + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER} + COMPILE_FLAGS "-DDate_Shared -DDate_Exports") + +ADD_LIBRARY(${PROJECT_NAME}-static STATIC ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME}-static PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER} + COMPILE_FLAGS "-DDate_Static -DDate_Exports") + +IF(UNIX) + SET_TARGET_PROPERTIES(${PROJECT_NAME}-static PROPERTIES COMPILE_FLAGS "-fPIC") +ENDIF(UNIX) + +INCLUDE("FindOpenViBECommon") +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyExpat") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) +INSTALL(TARGETS ${PROJECT_NAME}-static + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY include/ DESTINATION ${DIST_INCLUDEDIR} FILES_MATCHING PATTERN "*.h" PATTERN) diff --git a/Masterarbeit/openvibe/sdk-master/modules/date/include/date/DateParser.h b/Masterarbeit/openvibe/sdk-master/modules/date/include/date/DateParser.h new file mode 100644 index 0000000..4fcaec0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/date/include/date/DateParser.h @@ -0,0 +1,24 @@ +#pragma once +#include "defines.h" +#if defined TARGET_OS_Windows +#include "WindowsDateParser.h" +#else +#include +#endif + +namespace DateParser { +class Date_API CDateParser +{ +public: + /** + * \brief parse a string representing a date along a format given by a char*, and store it in a tm struct + * \param sStringToParse: the string to parse + * \param sDateFormat: the string that gives the format of the date to parse, example "%Y-%m-%d %H:%M" + * \param tmParsed: time parsed + */ + static char* strpTime(const char* sStringToParse, const char* sDateFormat, struct tm* tmParsed); + +private: + CDateParser() = default; +}; +} // namespace DateParser diff --git a/Masterarbeit/openvibe/sdk-master/modules/date/include/date/WindowsDateParser.h b/Masterarbeit/openvibe/sdk-master/modules/date/include/date/WindowsDateParser.h new file mode 100644 index 0000000..bd0f06c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/date/include/date/WindowsDateParser.h @@ -0,0 +1,7 @@ +#pragma once +#include "defines.h" +#include + +namespace DateParser { +extern Date_API char* windowsStrptime(const char* buf, const char* fmt, struct tm* tmParsed); +} // namespace DateParser diff --git a/Masterarbeit/openvibe/sdk-master/modules/date/include/date/defines.h b/Masterarbeit/openvibe/sdk-master/modules/date/include/date/defines.h new file mode 100644 index 0000000..6e73fe7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/date/include/date/defines.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +#if defined Date_Shared +# if defined TARGET_OS_Windows +# define Date_API_Export __declspec(dllexport) +# define Date_API_Import __declspec(dllimport) +# elif defined TARGET_OS_Linux +# define Date_API_Export __attribute__((visibility("default"))) +# define Date_API_Import __attribute__((visibility("default"))) +# else +# define Date_API_Export +# define Date_API_Import +# endif +#else +# define Date_API_Export +# define Date_API_Import +#endif + +#if defined Date_Exports +# define Date_API Date_API_Export +#else +# define Date_API Date_API_Import +#endif diff --git a/Masterarbeit/openvibe/sdk-master/modules/date/src/DateParser.cpp b/Masterarbeit/openvibe/sdk-master/modules/date/src/DateParser.cpp new file mode 100644 index 0000000..3717293 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/date/src/DateParser.cpp @@ -0,0 +1,14 @@ +#include "DateParser.h" + +namespace DateParser { + +char* CDateParser::strpTime(const char* sStringToParse, const char* sDateFormat, struct tm* tmParsed) +{ +#if defined TARGET_OS_Windows + return windowsStrptime(sStringToParse, sDateFormat, tmParsed); +#else + return strptime(sStringToParse, sDateFormat, tmParsed); +#endif +} + +} // namespace DateParser diff --git a/Masterarbeit/openvibe/sdk-master/modules/date/src/WindowsDateParser.cpp b/Masterarbeit/openvibe/sdk-master/modules/date/src/WindowsDateParser.cpp new file mode 100644 index 0000000..748300c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/date/src/WindowsDateParser.cpp @@ -0,0 +1,357 @@ +/* $Id$ */ +/* $NetBSD: windowsStrptime.c,v 1.18 1999/04/29 02:58:30 tv Exp $ */ + +/*- +* Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. +* All rights reserved. +* +* This code was contributed to The NetBSD Foundation by Klaus Klein. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* 1. Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* 2. Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* 3. All advertising materials mentioning features or use of this software +* must display the following acknowledgement: +* This product includes software developed by the NetBSD +* Foundation, Inc. and its contributors. +* 4. Neither the name of The NetBSD Foundation nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#if defined TARGET_OS_Windows +#include +#include "WindowsDateParser.h" + +namespace DateParser { + +/* +* We do not implement alternate representations. However, we always +* check whether a given modifier is allowed for a certain conversion. +*/ +#define ALT_E 0x01 +#define ALT_O 0x02 +#define LEGAL_ALT(x) if (alt_format & ~(x)) { return 0; } + +#define EPOCH_YEAR 1970 +#define SECSPERHOUR 3600 +#define SECSPERDAY 86400 +#define TM_YEAR_BASE 1900 + +static int ConvNum(const char** buf, int* dest, const int llim, const int ulim); + +static const std::array DAY = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; +static const std::array AB_DAY = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; +static const std::array MON = { + "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" +}; +static const std::array AB_MON = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; +static const std::array AM_PM = { "AM", "PM" }; + + +Date_API char* DateParser::windowsStrptime(const char* buf, const char* fmt, struct tm* tmParsed) +{ + char c; + const char* bp; + size_t len = 0; + int i, split_year = 0; + + bp = buf; + + while ((c = *fmt) != '\0') + { + /* Clear `alternate' modifier prior to new conversion. */ + int alt_format = 0; + + /* Eat up white-space. */ + if (isspace(c)) + { + while (isspace(*bp)) { bp++; } + fmt++; + continue; + } + + if ((c = *fmt++) != '%') { goto literal; } + + + again: switch (c = *fmt++) + { + case '%': /* "%%" is converted to "%". */ + literal : + if (c != *bp++) { return (nullptr); } + break; + + /* + * "Alternative" modifiers. Just set the appropriate flag + * and start over again. + */ + case 'E': /* "%E?" alternative conversion modifier. */ + LEGAL_ALT(0); + alt_format |= ALT_E; + goto again; + + case 'O': /* "%O?" alternative conversion modifier. */ + LEGAL_ALT(0); + alt_format |= ALT_O; + goto again; + + /* + * "Complex" conversion rules, implemented through recursion. + */ + case 'c': /* Date and time, using the locale's format. */ + LEGAL_ALT(ALT_E); + if (!((bp = windowsStrptime(bp, "%x %X", tmParsed)))) { return nullptr; } + break; + + case 'D': /* The date as "%m/%d/%y". */ + LEGAL_ALT(0); + if (!((bp = windowsStrptime(bp, "%m/%d/%y", tmParsed)))) { return nullptr; } + break; + + case 'R': /* The time as "%H:%M". */ + LEGAL_ALT(0); + if (!((bp = windowsStrptime(bp, "%H:%M", tmParsed)))) { return nullptr; } + break; + + case 'r': /* The time in 12-hour clock representation. */ + LEGAL_ALT(0); + if (!((bp = windowsStrptime(bp, "%I:%M:%S %p", tmParsed)))) { return nullptr; } + break; + + case 'T': /* The time as "%H:%M:%S". */ + LEGAL_ALT(0); + if (!((bp = windowsStrptime(bp, "%H:%M:%S", tmParsed)))) { return nullptr; } + break; + + case 'X': /* The time, using the locale's format. */ + LEGAL_ALT(ALT_E); + if (!((bp = windowsStrptime(bp, "%H:%M:%S", tmParsed)))) { return nullptr; } + break; + + case 'x': /* The date, using the locale's format. */ + LEGAL_ALT(ALT_E); + if (!((bp = windowsStrptime(bp, "%m/%d/%y", tmParsed)))) { return nullptr; } + break; + + /* + * "Elementary" conversion rules. + */ + case 'A': /* The day of week, using the locale's form. */ + case 'a': + LEGAL_ALT(0); + for (i = 0; i < 7; ++i) + { + /* Full name. */ + len = DAY[i].size(); + if (strncmp(DAY[i].c_str(), bp, len) == 0) { break; } + + /* Abbreviated name. */ + len = AB_DAY[i].size(); + if (strncmp(AB_DAY[i].c_str(), bp, len) == 0) { break; } + } + + /* Nothing matched. */ + if (i == 7) { return nullptr; } + + tmParsed->tm_wday = i; + bp += len; + break; + + case 'B': /* The month, using the locale's form. */ + case 'b': + case 'h': + LEGAL_ALT(0); + for (i = 0; i < 12; ++i) + { + /* Full name. */ + len = MON[i].size(); + if (strncmp(MON[i].c_str(), bp, len) == 0) { break; } + + /* Abbreviated name. */ + len = AB_MON[i].size(); + if (strncmp(AB_MON[i].c_str(), bp, len) == 0) { break; } + } + + /* Nothing matched. */ + if (i == 12) { return (nullptr); } + + tmParsed->tm_mon = i; + bp += len; + break; + + case 'C': /* The century number. */ + LEGAL_ALT(ALT_E); + if (!(ConvNum(&bp, &i, 0, 99))) { return (nullptr); } + + if (split_year) { tmParsed->tm_year = (tmParsed->tm_year % 100) + (i * 100); } + else + { + tmParsed->tm_year = i * 100; + split_year = 1; + } + break; + + case 'd': /* The day of month. */ + case 'e': + LEGAL_ALT(ALT_O); + if (!(ConvNum(&bp, &tmParsed->tm_mday, 1, 31))) { return (nullptr); } + break; + + case 'k': /* The hour (24-hour clock representation). */ + LEGAL_ALT(0); + /* FALLTHROUGH */ + case 'H': + LEGAL_ALT(ALT_O); + if (!(ConvNum(&bp, &tmParsed->tm_hour, 0, 23))) { return (nullptr); } + break; + + case 'l': /* The hour (12-hour clock representation). */ + LEGAL_ALT(0); + /* FALLTHROUGH */ + case 'I': + LEGAL_ALT(ALT_O); + if (!(ConvNum(&bp, &tmParsed->tm_hour, 1, 12))) { return (nullptr); } + if (tmParsed->tm_hour == 12) { tmParsed->tm_hour = 0; } + break; + + case 'j': /* The day of year. */ + LEGAL_ALT(0); + if (!(ConvNum(&bp, &i, 1, 366))) { return (nullptr); } + tmParsed->tm_yday = i - 1; + break; + + case 'M': /* The minute. */ + LEGAL_ALT(ALT_O); + if (!(ConvNum(&bp, &tmParsed->tm_min, 0, 59))) { return (nullptr); } + break; + + case 'm': /* The month. */ + LEGAL_ALT(ALT_O); + if (!(ConvNum(&bp, &i, 1, 12))) { return (nullptr); } + tmParsed->tm_mon = i - 1; + break; + + case 'p': /* The locale's equivalent of AM/PM. */ + LEGAL_ALT(0); + /* AM? */ + if (strcmp(AM_PM[0].c_str(), bp) == 0) + { + if (tmParsed->tm_hour > 11) { return (nullptr); } + bp += AM_PM[0].size(); + break; + } + /* PM? */ + if (strcmp(AM_PM[1].c_str(), bp) == 0) + { + if (tmParsed->tm_hour > 11) { return (nullptr); } + tmParsed->tm_hour += 12; + bp += AM_PM[1].size(); + break; + } + + /* Nothing matched. */ + return nullptr; + + case 'S': /* The seconds. */ + LEGAL_ALT(ALT_O); + if (!(ConvNum(&bp, &tmParsed->tm_sec, 0, 61))) { return (nullptr); } + break; + + case 'U': /* The week of year, beginning on sunday. */ + case 'W': /* The week of year, beginning on monday. */ + LEGAL_ALT(ALT_O); + /* + * XXX This is bogus, as we can not assume any valid + * information present in the tm structure at this + * point to calculate a real value, so just check the + * range for now. + */ + if (!(ConvNum(&bp, &i, 0, 53))) { return (nullptr); } + break; + + case 'w': /* The day of week, beginning on sunday. */ + LEGAL_ALT(ALT_O); + if (!(ConvNum(&bp, &tmParsed->tm_wday, 0, 6))) { return (nullptr); } + break; + + case 'Y': /* The year. */ + LEGAL_ALT(ALT_E); + if (!(ConvNum(&bp, &i, 0, 9999))) { return (nullptr); } + + tmParsed->tm_year = i - TM_YEAR_BASE; + break; + + case 'y': /* The year within 100 years of the epoch. */ + LEGAL_ALT(ALT_E | ALT_O); + if (!(ConvNum(&bp, &i, 0, 99))) { return (nullptr); } + + if (split_year) + { + tmParsed->tm_year = ((tmParsed->tm_year / 100) * 100) + i; + break; + } + split_year = 1; + if (i <= 68) { tmParsed->tm_year = i + 2000 - TM_YEAR_BASE; } + else { tmParsed->tm_year = i + 1900 - TM_YEAR_BASE; } + break; + + /* + * Miscellaneous conversions. + */ + case 'n': /* Any kind of white-space. */ + case 't': + LEGAL_ALT(0); + while (isspace(*bp)) { bp++; } + break; + + + default: return nullptr; /* Unknown/unsupported conversion. */ + } + } + + /* LINTED functional specification */ + return const_cast(bp); +} + + +static int ConvNum(const char** buf, int* dest, const int llim, const int ulim) +{ + int result = 0; + + /* The limit also determines the number of valid digits. */ + int rulim = ulim; + + if (**buf < '0' || **buf > '9') { return (0); } + + do + { + result *= 10; + result += *(*buf)++ - '0'; + rulim /= 10; + } while ((result * 10 <= ulim) && rulim && **buf >= '0' && **buf <= '9'); + + if (result < llim || result > ulim) { return 0; } + + *dest = result; + return 1; +} + +} // namespace DateParser +#endif diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/modules/ebml/CMakeLists.txt new file mode 100644 index 0000000..2b73e98 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/CMakeLists.txt @@ -0,0 +1,51 @@ +PROJECT(openvibe-module-ebml) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl include/*.h) +INCLUDE_DIRECTORIES(include) +INCLUDE("FindSourceRCProperties") + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER} + COMPILE_FLAGS "-DEBML_Shared -DEBML_Exports") + +ADD_LIBRARY(${PROJECT_NAME}-static STATIC ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME}-static PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER} + COMPILE_FLAGS "-DEBML_Static -DEBML_Exports") + +IF(UNIX) + SET_TARGET_PROPERTIES(${PROJECT_NAME}-static PROPERTIES COMPILE_FLAGS "-fPIC") +ENDIF(UNIX) + +INCLUDE("FindOpenViBECommon") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) +INSTALL(TARGETS ${PROJECT_NAME}-static + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) +INSTALL(DIRECTORY include/ DESTINATION ${DIST_INCLUDEDIR} FILES_MATCHING PATTERN "*.h") diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/FormatingEBMLStreams.dox b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/FormatingEBMLStreams.dox new file mode 100644 index 0000000..2edc692 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/FormatingEBMLStreams.dox @@ -0,0 +1,95 @@ +/** + * \page Doc_FormatingEBMLStreams Formating EBML streams + * + * \section Doc_FormatingEBMLStreams_Introduction Introduction + * + * This page tries to teach how a user of this library should use + * the writing functions in order to build and format an EBML + * stream correctly. For those who don't know what EBML is, + * it is basically a binary XML created and used by the matroska + * developpers. The libmatroska is based on the libebml + * implementation of these guys. Fore more details, please read + * the \ref Doc_WhatIsEBML page first and eventually visit the + * EBML web page at http://ebml.sourceforge.net/ + * + * \section Doc_FormatingEBMLStreams_Concept Concepts + * + * The idea of this formating library is to transform the data + * provided by the user application into EBML buffers. Those EBML + * buffers are then given to a user callback object which know + * what to do with the computed data (maybe write it to a file, + * send it on a socket, log it in a console, whatever...) + * + * The library is divided into three main components : + * - The writer itself that does the formating stuff + * - An implementation of the callback object (the implementation + * is left to the user application developper) + * - An optionnal helper object that knows more on the + * content of the EBML stream. + * + * Here comes the organisation of the different modules and how + * data go from one to another. Note that the user application + * and the user callback object may share some information so the + * callback object communicates with the application itself. + * + * \image html ebml_formating_concept.png "Concept" + * + * Here comes the UML class diagram, presenting the main classes + * involved in the presented behavior. + * + * \image html ebml_formating_class.png "Class Diagram" + * + * See EBML::IWriter, EBML::IWriterCallback and EBML::IWriterHelper + * for more details on each of these classes. + * + * \section Doc_FormatingEBMLStreams_SampleCode Sample code + * + * In this section, a sample of user application code is presented + * that opens several child nodes and dumps the created stream + * into a file for later use. This file can be parsed using + * the sample code of the page named \ref Doc_ParsingEBMLStreams + * + * The callback object implementation looks something like this : + * + * \code + * class CWriterCallback : public EBML::IWriterCallback + * { + * public: + * CWriterCallback(char* filename) { m_file=fopen(filename, "wb"); } + * virtual ~CWriterCallback() { if(m_file) fclose(m_file); } + * virtual void write(const void* buffer, const size_t size) { if(m_file) fwrite(buffer, size, 1, m_file); } + * FILE* m_file; + * }; + * \endcode + * + * Then in the user application code, we can write the + * initialisation this way : + * + * \code + * CWriterCallback oCallback("test.ebml"); + * EBML::IWriter* pWriter=EBML::createWriter(oCallback); + * EBML::IWriterHelper* pWriterHelper=EBML::createWriterHelper(); + * pWriterHelper->connect(pWriter); + * \endcode + * + * The use of the EBML writer looks something like this : + * + * \code + * pWriterHelper->openChild(EBML_Identifier_Header); + * pWriterHelper->openChild(EBML_Identifier_DocType); + * pWriterHelper->setStr("EBML basic sample"); + * pWriterHelper->closeChild(); + * pWriterHelper->openChild(EBML_Identifier_DocTypeVersion); + * pWriterHelper->setUInt(1); + * pWriterHelper->closeChild(); + * pWriterHelper->closeChild(); + * \endcode + * + * Finally, we have to release the objects and to clean memory : + * + * \code + * pWriterHelper->disconnect(); + * pWriterHelper->release(); + * pWriter->release(); + * \endcode + */ diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ParsingEBMLStreams.dox b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ParsingEBMLStreams.dox new file mode 100644 index 0000000..e47fc50 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ParsingEBMLStreams.dox @@ -0,0 +1,129 @@ +/** + * \page Doc_ParsingEBMLStreams Parsing EBML streams + * + * \section Doc_ParsingEBMLStreams_Introduction Introduction + * + * This page tries to teach how a user of this library should use + * the reading functions in order to read and parse an EBML + * stream correctly. For those who don't know what EBML is, + * it is basically a binary XML created and used by the matroska + * developpers. The libmatroska is based on the libebml + * implementation of these guys. Fore more details, please read + * the \ref Doc_WhatIsEBML page first and eventually visit the + * EBML web page at http://ebml.sourceforge.net/ + * + * \section Doc_ParsingEBMLStreams_Concept Concepts + * + * The idea of this parsing library is to transform the stream + * data provided by the user application into understandable + * EBML interpreted commands. Once the EBML nodes are found and + * parsed, they are sent to a callback object that should know + * what to do with them. + * + * The design of the parsing interface is closed to the one of + * \c eXpat, an XML parser library (see http://expat.sourceforge.net + * for more details on \c eXpat). Using such interface allows light + * code and on-the-fly parsing, that means the parser does not + * need to have all the data ready before starting the parsing + * process... The data can arrive while the parsing is beeing + * done. + * + * It is the responsability of the user application to read + * the EBML stream from a file, a socket, a user input or + * whatever, and then to send this to the parser... + * + * At least, the callback object may use a reader helper that + * knows how to read standard EBML types such as integers, + * floats, strings etc... + * + * The library is divided into three main components : + * - The reader itself that does the parsing stuffs + * - An implementation of the callback object (the implementation + * is left to the user application developper) + * - An optionnal helper object that knows more on the + * content of the EBML stream. + * + * Here comes the organisation of the different modules and how + * data go from one to another. Note that the user application + * and the user callback object may share some information so the + * callback object communicates with the application itself. + * + * \image html ebml_parsing_concept.png "Concept" + * + * Here comes the UML class diagram, presenting the main classes + * involved in the presented behavior. + * + * \image html ebml_parsing_class.png "Class Diagram" + * + * See EBML::IReader, EBML::IReaderCallback and EBML::IReaderHelper + * for more details on each of these classes. + * + * \section Doc_ParsingEBMLStreams_SampleCode Sample code + * + * In this section, a sample of user application code is presented + * that parses the sample file created in the page named : + * \ref Doc_FormatingEBMLStreams + * + * The parsed value are printed in the console. + * + * The callback object looks something like this : + * + * \code + * class CReaderCallback : public EBML::IReaderCallback + * { + * public: + * CReaderCallback() + * { + * m_helper=EBML::createReaderHelper(); + * } + * virtual ~CReaderCallback() + * { + * if(m_helper) m_helper->release(); + * } + * virtual bool isMasterChild(const EBML::CIdentifier& identifier) + * { + * if(identifier==EBML_Identifier_Header) return true; + * if(identifier==EBML_Identifier_DocType) return true; + * if(identifier==EBML_Identifier_DocTypeVersion) return true; + * return false; + * } + * virtual void openChild(const EBML::CIdentifier& identifier) + * { + * m_oCurrent=identifier; + * } + * virtual void processChildData(const void* buffer, const size_t size) + * { + * if(m_oCurrent==EBML_Identifier_DocType) + * std::cout << "Doc type:" << m_helper->getStr(buffer, size) << std::endl; + * if(m_oCurrent==EBML_Identifier_DocTypeVersion) + * std::cout << "Dox type version:" << m_helper->getUInt(buffer, size) << std::endl; + * } + * virtual void closeChild() + * { + * } + * EBML::IReaderHelper* m_helper; + * }; + * \endcode + * + * Then in the user application code, we can write the + * initialisation this way : + * + * \code + * CReaderCallback oCallback; + * EBML::IReader* pReader=EBML::createReader(oCallback); + * \endcode + * + * Now suppose the user application got some data from the file + * in a \c buffer of size \c size ; it is sent to the + * parser this way : + * + * \code + * pReader->processData(buffer, size); + * \endcode + * + * Finally, don't forget to release the object and to clean memory : + * + * \code + * pReader->release(); + * \endcode + */ diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/WhatIsEBML.dox b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/WhatIsEBML.dox new file mode 100644 index 0000000..e276df6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/WhatIsEBML.dox @@ -0,0 +1,15 @@ +/** + * \page Doc_WhatIsEBML What is EBML + * + * This page tries to explain what EBML is and why it is usefull. + * + * - see http://ebml.sourceforge.net/ for more details + * - see http://ebml.sourceforge.net/specs/ for specifications + * - see http://www.matroska.org/technical/specs/ for even more details + * + * - check libebml for a sample implementation of EBML + * - check libmatroska for a sample of library using libebml + * and a concrete use of EBML + * + * \todo Write more documentation on what EBML is + */ diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_formating_class.dia b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_formating_class.dia new file mode 100644 index 0000000..15b2600 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_formating_class.dia differ diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_formating_class.png b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_formating_class.png new file mode 100644 index 0000000..48bcda6 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_formating_class.png differ diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_formating_concept.dia b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_formating_concept.dia new file mode 100644 index 0000000..d3d126b Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_formating_concept.dia differ diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_formating_concept.png b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_formating_concept.png new file mode 100644 index 0000000..5e0ba21 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_formating_concept.png differ diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_parsing_class.dia b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_parsing_class.dia new file mode 100644 index 0000000..71bcd48 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_parsing_class.dia differ diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_parsing_class.png b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_parsing_class.png new file mode 100644 index 0000000..3f078dd Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_parsing_class.png differ diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_parsing_concept.dia b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_parsing_concept.dia new file mode 100644 index 0000000..295bc99 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_parsing_concept.dia differ diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_parsing_concept.png b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_parsing_concept.png new file mode 100644 index 0000000..a119fe1 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/modules/ebml/doc/ebml_parsing_concept.png differ diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/CIdentifier.h b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/CIdentifier.h new file mode 100644 index 0000000..82ae5b5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/CIdentifier.h @@ -0,0 +1,151 @@ +#pragma once + +#include "defines.h" +#include + +namespace EBML { +/** + * \class CIdentifier + * \author Yann Renard (INRIA/IRISA) + * \date 2006-08-07 + * \brief Base class to work with EBML identifiers + * + * This class is used in order to work on EBML identifier. + * It handles 64 bits values for now, but could easily be + * changed to handle bigger values if needed. + * + * Be sure to look at http://ebml.sourceforge.net/specs/ in + * order to understand what an identifier is and how it works + */ +class EBML_API CIdentifier +{ +public: + + /** \name Constructors */ + //@{ + + /** + * \brief Basic constructor + * + * Initializes the identifier to 0. + */ + CIdentifier() : m_id(ULLONG_MAX) {} + /** + * \brief Integer based constructor + * \param id [in] : The value to use + * + * Initializes the identifier to the given 64 bits value. + */ + CIdentifier(const uint64_t id) : m_id(id) {} + /** + * \brief 32 bits integer based constructor + * \param id1 [in] : the first part of the identifier + * \param id2 [in] : the second part of the identifier + * + * Builds up the 64 bits identifier given its two 32 bits + * components. + */ + CIdentifier(const size_t id1, const size_t id2) : m_id((uint64_t(id1) << 32) + id2) {} + /** + * \brief Copy constructor + * \param id [in] : The source identifier to use + * + * Initializes this identifier to the same value as + * the given source identifier. + */ + CIdentifier(const CIdentifier& id) : m_id(id.m_id) {} + + //@} + /** \name Operators */ + //@{ + + /** + * \brief Copy operator + * \param id [in] : The source identifier to copy from + * \return a const reference on this identifier + * + * Initializes this identifier to the same value as + * the given source identifier. + */ + const CIdentifier& operator=(const CIdentifier& id); + + /** + * \brief Equality comparison operator + * \param id1 [in] : The first identifier to compare + * \param id2 [in] : The second identifier to compare + * \return \e true when the identifiers are equal, \e false + * when they are different. + * + * This function compares the two 64 bits values. + */ + friend EBML_API bool operator==(const CIdentifier& id1, const CIdentifier& id2); + /** + * \brief Difference comparison operator + * \param id1 [in] : The first identifier to compare + * \param id2 [in] : The second identifier to compare + * \return \e true when the identifiers are different, \e false + * when they are equal. + * + * This function compares the two 64 bits values. + */ + friend EBML_API bool operator!=(const CIdentifier& id1, const CIdentifier& id2); + /** + * \brief Ordering comparison operator + * \param id1 [in] : The first identifier to compare + * \param id2 [in] : The second identifier to compare + * \return \e true when the first identifier is lesser or equal + * to the second identifier, \e false in other cases. + * + * This function compares the two 64 bits values. + */ + friend EBML_API bool operator<=(const CIdentifier& id1, const CIdentifier& id2); + /** + * \brief Ordering comparison operator + * \param id1 [in] : The first identifier to compare + * \param id2 [in] : The second identifier to compare + * \return \e true when the first identifier is greater or equal + * to the second identifier, \e false in other cases. + * + * This function compares the two 64 bits values. + */ + friend EBML_API bool operator>=(const CIdentifier& id1, const CIdentifier& id2); + /** + * \brief Ordering comparison operator + * \param id1 [in] : The first identifier to compare + * \param id2 [in] : The second identifier to compare + * \return \e true when the first identifier is lesser and not equal + * to the second identifier, \e false in other cases. + * + * This function compares the two 64 bits values. + */ + friend EBML_API bool operator<(const CIdentifier& id1, const CIdentifier& id2); + /** + * \brief Ordering comparison operator + * \param id1 [in] : The first identifier to compare + * \param id2 [in] : The second identifier to compare + * \return \e true when the first identifier is greater and not equal + * to the second identifier, \e false in other cases. + * + * This function compares the two 64 bits values. + */ + friend EBML_API bool operator>(const CIdentifier& id1, const CIdentifier& id2); + + /** + * \brief Cast operator + * \return \e the 64 bits value contained by this identifier. + */ + operator uint64_t() const { return this->id(); } + + /** + * \brief Conversion to 64 bits uint32_t (should be used instead of the cast) + * \return \e the 64 bits value contained by this identifier. + */ + uint64_t id() const { return m_id; } + + //@} + +protected: + + uint64_t m_id = 0; ///< The 64 bits value of this identifier +}; +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/CReader.h b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/CReader.h new file mode 100644 index 0000000..87ce802 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/CReader.h @@ -0,0 +1,25 @@ +#pragma once + +#include "IReader.h" + +namespace EBML { +class EBML_API CReader final : public IReader +{ +public: + + explicit CReader(IReaderCallback& callback); + ~CReader() override; + bool processData(const void* buffer, const size_t size) override; + CIdentifier getCurrentNodeID() const override; + size_t getCurrentNodeSize() const override; + void release() override; + +protected: + + IReader* m_impl = nullptr; + +private: + + CReader() = delete; +}; +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/CReaderHelper.h b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/CReaderHelper.h new file mode 100644 index 0000000..d1fd0c4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/CReaderHelper.h @@ -0,0 +1,22 @@ +#pragma once + +#include "IReaderHelper.h" + +namespace EBML { +class EBML_API CReaderHelper final : public IReaderHelper +{ +public: + + CReaderHelper(); + ~CReaderHelper() override; + uint64_t getUInt(const void* buffer, const size_t size) override; + int64_t getInt(const void* buffer, const size_t size) override; + double getDouble(const void* buffer, const size_t size) override; + const char* getStr(const void* buffer, const size_t size) override; + void release() override; + +protected: + + IReaderHelper* m_impl = nullptr; +}; +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/CWriter.h b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/CWriter.h new file mode 100644 index 0000000..7a6fb88 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/CWriter.h @@ -0,0 +1,25 @@ +#pragma once + +#include "IWriter.h" + +namespace EBML { +class EBML_API CWriter final : public IWriter +{ +public: + + explicit CWriter(IWriterCallback& callback); + ~CWriter() override; + bool openChild(const CIdentifier& identifier) override; + bool setChildData(const void* buffer, const size_t size) override; + bool closeChild() override; + void release() override; + +protected: + + IWriter* m_impl = nullptr; + +private: + + CWriter() = delete; +}; +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/CWriterHelper.h b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/CWriterHelper.h new file mode 100644 index 0000000..2974efa --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/CWriterHelper.h @@ -0,0 +1,28 @@ +#pragma once + +#include "IWriterHelper.h" + +namespace EBML { +class EBML_API CWriterHelper final : public IWriterHelper +{ +public: + + CWriterHelper(); + ~CWriterHelper() override; + bool connect(IWriter* writer) override; + bool disconnect() override; + bool openChild(const CIdentifier& identifier) override; + bool closeChild() override; + bool setInt(const int64_t value) override; + bool setUInt(const uint64_t value) override; + bool setFloat(const float value) override; + bool setDouble(const double value) override; + bool setBinary(const void* buffer, const size_t size) override; + bool setStr(const char* value) override; + void release() override { } + +protected: + + IWriterHelper* m_impl = nullptr; +}; +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/IReader.h b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/IReader.h new file mode 100644 index 0000000..fa48d32 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/IReader.h @@ -0,0 +1,135 @@ +#pragma once + +#include "CIdentifier.h" +#include // fix Unix compatibility + +namespace EBML { +/** + * \class IReaderCallback + * \author Yann Renard (INRIA/IRISA) + * \date 2006-08-07 + * \brief Callback class to use when parsing the EBML stream + * + * This class is to be overloaded by the user in order to get rid of the parsing events. It will be notified + * by the EBML::IReader object of what is found in the stream. + * + * \sa EBML::IReader + */ +class EBML_API IReaderCallback +{ +public: + + /** + * \brief Virtual destructor + */ + virtual ~IReaderCallback() { } + /** + * \brief Kind of child querry + * \param id [in] : The id which type has to be known + * \return \e true when the node is a master node + * \return \e false when it is a simple child node. + * + * When called by the reader, this function should tell it whether the node identified by \c id is a master + * node (has child) or not (has data). For that, it has to return \e true when the node should have children, and \e false in other cases. + */ + virtual bool isMasterChild(const CIdentifier& id) = 0; + /** + * \brief Informs the callback object a new node parsing is starting + * \param id [in] : The idenfier of the newly parsing node + * + * This is called to notify the callback object that the parser has started a new EBML node parsing. This EBML + * node is identified by \c id. After this call will follow whether a new \c openChild if this node is + * a master one, whher a processData if this node is a simple child one. + */ + virtual void openChild(const CIdentifier& id) = 0; + /** + * \brief Gives the callback object the data associated with the currently opened child node + * \param buffer [in] : The buffer corresponding to the current simple child node + * \param size [in] : The buffer size in bytes + * + * This function is called when the data reading is terminated for a simple child node and so the callback + * object can process it. Whether the callback object knows how to process the data, whether it requests + * a reader helper object to do the work... See EBML::IReaderHelper for more details on that subject. + */ + virtual void processChildData(const void* buffer, const size_t size) = 0; + /** + * \brief Informs the callback object the current node parsing is terminated + * + * This function tells the callback object the current node parsing is terminated. Thus the parsing continues for the + * top level node, whether opening a new child or closing itself and so on... + */ + virtual void closeChild() = 0; +}; + +class EBML_API IReaderCallBack : public IReaderCallback { }; + +/** + * \class IReader + * \author Yann Renard (INRIA/IRISA) + * \date 2006-08-07 + * \brief EBML processing class + * + * This class should be used in order to parse an EBML stream. It should be given a callback object that can handle the + * content of the stream. The parser itself as no understanding of what is included in the EBML structure. + * + * The parsing interface looks like the eXpat XML parser, allowing on-the-fly parsing. See http://expat.sourceforge.net for more details. + * + * To create instances of this class, the user has to call EBML::createReader. To delete instances of this class, the user has to call EBML::IReader::release. + * + * Be sure to look at http://ebml.sourceforge.net/specs/ in order to understand what EBML is and how it should be used. + */ +class EBML_API IReader +{ +public: + + /** + * \brief Processes a chunk of data + * \param buffer [in] : The buffer of data to process + * \param size [in] : The buffer size in bytes + * \return \e true when data processing was ok + * \return \e false in other cases. + * + * This function has to be called as soon as the stream reader (file, socket, whatever) has data. Those data + * are sent to the parser and parsing for this chunk is started immediatly. The callback object is called + * according to the EBML structure contained in the chunk and the previously parsed chunks. See + * EBML::IReaderCallback for more details on the callback object. + */ + virtual bool processData(const void* buffer, const size_t size) = 0; + /** + * \brief Gets the identifier of the current node + * \return the identifier of the current node + */ + virtual CIdentifier getCurrentNodeID() const = 0; + /** + * \brief Gets the size of the current node + * \return the size of the current node + */ + virtual size_t getCurrentNodeSize() const = 0; + /** + * \brief Tells this object it won't be used anymore + * + * Instances of this class can not be instanciated another way than calling \c createReader. They can + * not be deleted either because the destructor is. protected. The library knows how to create and + * delete an instance of this class... Calling \c release will simply delete this instance and + * handle necessary cleanings when needed. + * + * The current object is invalid after calling this function. It can not be used anymore. + */ + virtual void release() = 0; + +protected: + + /** + * \brief Virtual destructor - should be overloaded + */ + virtual ~IReader() { } +}; + +/** + * \brief Instanciation function for EBML reader objects + * \param callback [in] : The callback object the reader should use + * \return a pointer to the created instance on success. + * \return \c NULL when something went wrong. + */ +extern EBML_API IReader* createReader(IReaderCallback& callback); +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/IReaderHelper.h b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/IReaderHelper.h new file mode 100644 index 0000000..b97d213 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/IReaderHelper.h @@ -0,0 +1,93 @@ +#pragma once + +#include "IReader.h" + +namespace EBML { +/** + * \class IReaderHelper + * \author Yann Renard (INRIA/IRISA) + * \date 2006-08-07 + * \brief Helper to read basic EBML types + * + * This class may be used by a IReaderCallback instance + * in order to correctly parse simple types defined in the + * EBML description such as integers, floats, strings etc... + * + * A similar class exists to help formating process... + * See EBML::IWriterHelper for more details. + * + * Be sure to look at http://ebml.sourceforge.net/specs/ in + * order to understand what EBML is and how it should be used. + * + * \todo long double reading implementation + * \todo date reading implementation + * \todo utf8 string reading implementation + */ +class EBML_API IReaderHelper +{ +public: + + /** + * \name Standard EBML value reading + * \param buffer [in] : The buffer containing data + * \param size [in] : The buffer size in bytes + * \return The value contained in the buffer + * + * Be sure to look at http://ebml.sourceforge.net/specs/ in + * order to understand standard EBML types. + */ + //@{ + /** + * \brief Gets an unsigned integer from the given buffer + */ + virtual uint64_t getUInt(const void* buffer, const size_t size) = 0; + /** + * \brief Gets a signed integer from the given buffer + */ + virtual int64_t getInt(const void* buffer, const size_t size) = 0; + /** + * \brief Gets a float from the given buffer + */ + virtual double getDouble(const void* buffer, const size_t size) = 0; + // virtual ??? getFloat80FromChildData(const void* buffer, const size_t size)=0; + // virtual ??? getDateFromChildData(const void* buffer, const size_t size)=0; + /** + * \brief Gets an ASCII string from the given buffer + * \warning The returned value is not permanent. It should be + * copied immediatly somewhere else by the caller. + */ + virtual const char* getStr(const void* buffer, const size_t size) = 0; + // virtual ??? getUTF8StringFromChildData(const void* buffer, const size_t size)=0; + //@} + + /** + * \brief Tells this object it won't be used anymore + * + * Instances of this class can not be instanciated + * another way than calling \c createReaderHelper. They + * can not be deleted either because the destructor is. + * protected. The library knows how to create and + * delete an instance of this class... Calling + * \c release will simply delete this instance and + * handle necessary cleanings when needed. + * + * The current object is invalid after calling this + * function. It can not be used anymore. + */ + virtual void release() = 0; + +protected: + + /** + * \brief Virtual destructor - should be overloaded + */ + virtual ~IReaderHelper() { } +}; + +/** + * \brief Instanciation function for EBML reader helper objects + * \return a pointer to the created instance on success. + * \return \c NULL when something went wrong. + */ +extern EBML_API IReaderHelper* createReaderHelper(); +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/IWriter.h b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/IWriter.h new file mode 100644 index 0000000..2dc5577 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/IWriter.h @@ -0,0 +1,127 @@ +#pragma once + +#include "CIdentifier.h" +#include // fix Unix compatibility + +namespace EBML { +/** + * \class IWriterCallback + * \author Yann Renard (INRIA/IRISA) + * \date 2006-08-07 + * \brief Callback class to use when creating the EBML stream + * + * This class is to be overloaded by the user in order to get rid of the stream writing events. It will be + * notified by the EBML::IWriter object of what is to be written in the stream while the user sends information to the writer. + * + * \sa EBML::IWriter + */ +class EBML_API IWriterCallback +{ +public: + + /** + * \brief Virtual destructor + */ + virtual ~IWriterCallback() { } + /** + * \brief Gives the callback object a new stream chunk + * \param buffer [in] : The buffer to write in the stream + * \param size [in] : The buffer size in bytes + * + * This function tells the callback object new data are ready to send in the EBML stream. This function + * may be called while the user sends data to the writer. + */ + virtual void write(const void* buffer, const size_t size) = 0; +}; + +class EBML_API IWriterCallBack : public IWriterCallback { }; + +/** + * \class IWriter + * \author Yann Renard (INRIA/IRISA) + * \date 2006-08-07 + * \brief EBML formating class + * + * This class is used in order to format datas using EBML specifications. It gives a minimalistic interface to + * allow creating new EBML nodes, and to insert data in simple child nodes. + * + * Basic usage of this class consists in : + * + * - Create child node + * - Gives information about the node : + * - Whether created node is master node (Goto 1) + * - Whether created node is simple child node (set data for this child node) + * - Close opened node + * + * The EBML::IWriterHelper class could be used in order to send EBML standard data such as integers, floats, strings, etc... + * + * To create instances of this class, the user has to call EBML::createWriter. To delete instances of this class, the user has to call EBML::IWriter::release. + * + * Be sure to look at http://ebml.sourceforge.net/specs/ in order to understand what EBML is and how it should be used. + */ +class EBML_API IWriter +{ +public: + + /** + * \brief Starts a new child node + * \param identifier [in] : The identifier of the new child node + * \return \e true on success. + * \return \e false on error. + * + * This function is called when the user wants to add a child node to the currently opened master node. + * A node containing data can not have child so if \c setChildData has been called before, this function returns \e false. + * + * Once the node has been opened, it should be closed calling \c closeChild. + */ + virtual bool openChild(const CIdentifier& identifier) = 0; + /** + * \brief Sets data for simple child node + * \param buffer [in] : The buffer to set as child data + * \param size [in] : The buffer size in bytes + * \return \e true on success. + * \return \e false on error. + * + * This function is called by the user for setting data in the currently opened simple child node. + * If the currently opened node has children, it is a master node so it can't receive data. In such case, the function returns \e false. However, + * it the currently opened node already has data, it returns \e false too. + */ + virtual bool setChildData(const void* buffer, const size_t size) = 0; + /** + * \brief Closes currently opened child node + * \return \e true on success. + * \return \e false on error. + * + * This function is called when the user wants to close a child node. The node should have received + * either child nodes or data depending if it is a master node or a simple child node. + */ + virtual bool closeChild() = 0; + /** + * \brief Tells this object it won't be used anymore + * + * Instances of this class can not be instanciated another way than calling \c createWriter. They can + * not be deleted either because the destructor is. protected. The library knows how to create and + * delete an instance of this class... Calling \c release will simply delete this instance and + * handle necessary cleanings when needed. + * + * The current object is invalid after calling this + * function. It can not be used anymore. + */ + virtual void release() = 0; + +protected: + + /** + * \brief Virtual destructor - should be overloaded + */ + virtual ~IWriter() { } +}; + +/** + * \brief Instanciation function for EBML writer objects + * \param callback [in] : The callback object the writer should use + * \return a pointer to the created instance on success. + * \return \c NULL when something went wrong. + */ +extern EBML_API IWriter* createWriter(IWriterCallback& callback); +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/IWriterHelper.h b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/IWriterHelper.h new file mode 100644 index 0000000..66110cb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/IWriterHelper.h @@ -0,0 +1,176 @@ +#pragma once + +#include "IWriter.h" + +namespace EBML { +/** + * \class IWriterHelper + * \author Yann Renard (INRIA/IRISA) + * \date 2006-08-07 + * \brief Helper to write basic EBML types + * + * This class may be used by the user in order to correctly + * format simple types defined in the EBML description such + * as integers, floats, strings etc... It directly uses the + * EBML::IWriter connected instance so one could simply + * use the helper in order to write his EBML stream. + * + * A similar class exists to help parsing process... + * See EBML::IReaderHelper for more details. + * + * Be sure to look at http://ebml.sourceforge.net/specs/ in + * order to understand what EBML is and how it should be used. + * + * \todo long double formating implementation + * \todo date formating implementation + * \todo utf8 string formating implementation + */ +class EBML_API IWriterHelper +{ +public: + + /** \name Writer connection */ + //@{ + /** + * \brief Connects an EBML writer to this helper + * \param writer [in] : The writer to connect + * \return \e true on success. + * \return \e false on error. + * + * This function gives the helper a handle to the writer + * to use in order to forward requests. Thus, when the + * user calls a helper function, the call is forwarded + * to the correct writer that effictively does the work. + * The aim of this helper is simply to transform standard + * EBML types into bytes buffers. + * + * Once a writer is connected, it could be disconnected + * thanks to the \c disconnect function. It must be done + * before calling \c connect again. + */ + virtual bool connect(IWriter* writer) = 0; + /** + * \brief Disconnects the currently connected EBML writer + * \return \e true on success. + * \return \e false on error. + * + * This function should be called to release the EBML + * writer handle. The helper instance may then be used + * with another EBML writer instance calling \c connect + * again. + */ + virtual bool disconnect() = 0; + //@} + + /** \name Writer binding functions */ + //@{ + /** + * \brief Child opening binding + * \param identifier [in] : The identifier of the new child node + * \return \e true on success. + * \return \e false on error. + * + * This function simply forwards the call to the + * corresponding EBML::IWriter function. See + * EBML::IWriter::openChild for more details. + */ + virtual bool openChild(const CIdentifier& identifier) = 0; + /** + * \brief Child closing binding + * \return \e true on success. + * \return \e false on error. + * + * This function simply forwards the call to the + * corresponding EBML::IWriter function. See + * EBML::IWriter::closeChild for more details. + */ + virtual bool closeChild() = 0; + //@} + + /** + * \name Standard EBML formating + * \brief EBML::IWriter::setChildData replacement + * \return \e true on success. + * \return \e false on error. + * + * Those functions should be used in place of the + * basic EBML::IWriter::setChildData function. They + * format standard EBML types into corresponding + * buffers and then send those built buffers to + * the writer using the EBML::IWriter::setChildData + * function. + */ + //@{ + /** + * \brief Sets a signed integer as child data + * \param value [in] : The integer value to set + */ + virtual bool setInt(const int64_t value) = 0; + /** + * \brief Sets an unsigned integer as child data + * \param value [in] : The integer value to set + */ + virtual bool setUInt(const uint64_t value) = 0; + /** + * \brief Sets a 32 bits float value as child data + * \param value [in] : The 32 bits float value to set + */ + virtual bool setFloat(const float value) = 0; + /** + * \brief Sets a 64 bits float value as child data + * \param value [in] : The 64 bits float value to set + */ + virtual bool setDouble(const double value) = 0; + // virtual bool setFloat80AsChildData( ??? value)=0; + // virtual bool setDateAsChildData( ??? value)=0; + /** + * \brief Sets a buffer as child data + * \param buffer [in] : The buffer to send to the writer + * \param size [in] : The buffer size in bytes + * \note This function simply calls the basic + * EBML::IWriter::setChildData function with the + * same two parameters. + */ + virtual bool setBinary(const void* buffer, const size_t size) = 0; + /** + * \brief Sets an ASCII string as child data + * \param value [in] : The ASCII string value to set + */ + virtual bool setStr(const char* value) = 0; + // virtual bool setUTF8StringAsChildData( ??? value)=0; + //@} + + /** + * \brief Tells this object it won't be used anymore + * + * Instances of this class can not be instanciated + * another way than calling \c createWriterHelper. They + * can not be deleted either because the destructor is. + * protected. The library knows how to create and + * delete an instance of this class... Calling + * \c release will simply delete this instance and + * handle necessary cleanings when needed. + * + * The current object is invalid after calling this + * function. It can not be used anymore. + * + * \warning Releasing this obbject does not release the + * connected writer instance ! + */ + virtual void release() = 0; + +protected: + + /** + * \brief Virtual destructor - should be overloaded + */ + virtual ~IWriterHelper() { } +}; + +/** + * \brief Instanciation function for EBML writer helper objects + * \return a pointer to the created instance on success. + * \return \c NULL when something went wrong. + */ +extern EBML_API IWriterHelper* createWriterHelper(); +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/TReaderCallbackProxy.h b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/TReaderCallbackProxy.h new file mode 100644 index 0000000..835e3b2 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/TReaderCallbackProxy.h @@ -0,0 +1,81 @@ +#pragma once + +#include "IReader.h" + +namespace EBML { + +// ________________________________________________________________________________________________________________ +// + +template +class TReaderCallbackProxy1 final : public IReaderCallback +{ +public: + TReaderCallbackProxy1(TOwnerClass& ownerObject, bool (TOwnerClass::*mfpIsMasterChild)(const CIdentifier& identifier), + void (TOwnerClass::*mfpOpenChild)(const CIdentifier& identifier), + void (TOwnerClass::*mfpProcessChildData)(const void* buffer, const size_t size), void (TOwnerClass::*mfpCloseChild)()) + : m_ownerObject(ownerObject), m_mfpIsMasterChild(mfpIsMasterChild), m_mfpOpenChild(mfpOpenChild), m_mfpProcessChildData(mfpProcessChildData), + m_mfpCloseChild(mfpCloseChild) { } + + bool isMasterChild(const CIdentifier& identifier) override + { + if (m_mfpIsMasterChild) { return (m_ownerObject.*m_mfpIsMasterChild)(identifier); } + return false; + } + + void openChild(const CIdentifier& identifier) override { if (m_mfpOpenChild) { (m_ownerObject.*m_mfpOpenChild)(identifier); } } + + void processChildData(const void* buffer, const size_t size) override + { + if (m_mfpProcessChildData) { (m_ownerObject.*m_mfpProcessChildData)(buffer, size); } + } + + void closeChild() override { if (m_mfpCloseChild) { (m_ownerObject.*m_mfpCloseChild)(); } } + +protected: + TOwnerClass& m_ownerObject; + bool (TOwnerClass::*m_mfpIsMasterChild)(const CIdentifier& identifier); + void (TOwnerClass::*m_mfpOpenChild)(const CIdentifier& identifier); + void (TOwnerClass::*m_mfpProcessChildData)(const void* buffer, size_t size); + void (TOwnerClass::*m_mfpCloseChild)(); +}; + +// ________________________________________________________________________________________________________________ +// + +template +class TReaderCallbackProxy2 final : public IReaderCallback +{ +public: + TReaderCallbackProxy2(TOwnerClass& ownerObject) + : m_ownerObject(ownerObject), m_mfpIsMasterChild(TMfpIsMasterChild), m_mfpOpenChild(TMfpOpenChild), m_mfpProcessChildData(TMfpProcessChildData), + m_mfpCloseChild(TMfpCloseChild) { } + + bool isMasterChild(const CIdentifier& identifier) override + { + if (m_mfpIsMasterChild) { return (m_ownerObject.*m_mfpIsMasterChild)(identifier); } + return false; + } + + void openChild(const CIdentifier& identifier) override { if (m_mfpOpenChild) { (m_ownerObject.*m_mfpOpenChild)(identifier); } } + + void processChildData(const void* buffer, const size_t size) override + { + if (m_mfpProcessChildData) { (m_ownerObject.*m_mfpProcessChildData)(buffer, size); } + } + + void closeChild() override { if (m_mfpCloseChild) { (m_ownerObject.*m_mfpCloseChild)(); } } + +protected: + TOwnerClass& m_ownerObject; + bool (TOwnerClass::*m_mfpIsMasterChild)(const CIdentifier& identifier); + void (TOwnerClass::*m_mfpOpenChild)(const CIdentifier& identifier); + void (TOwnerClass::*m_mfpProcessChildData)(const void* buffer, size_t size); + void (TOwnerClass::*m_mfpCloseChild)(); +}; + +// ________________________________________________________________________________________________________________ +// +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/TWriterCallbackProxy.h b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/TWriterCallbackProxy.h new file mode 100644 index 0000000..38ca9f3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/TWriterCallbackProxy.h @@ -0,0 +1,42 @@ +#pragma once + +#include "IWriter.h" + +namespace EBML { + +// ________________________________________________________________________________________________________________ +// + +template +class TWriterCallbackProxy1 final : public IWriterCallback +{ +public: + TWriterCallbackProxy1(TOwnerClass& ownerObject, void (TOwnerClass::*mfpWrite)(const void* buffer, size_t size)) + : m_ownerObject(ownerObject), m_mfpWrite(mfpWrite) { } + + void write(const void* buffer, const size_t size) override { if (m_mfpWrite) { (m_ownerObject.*m_mfpWrite)(buffer, size); } } + +protected: + TOwnerClass& m_ownerObject; + void (TOwnerClass::*m_mfpWrite)(const void* buffer, size_t size); +}; + +// ________________________________________________________________________________________________________________ +// + +template +class TWriterCallbackProxy2 final : public IWriterCallback +{ +public: + TWriterCallbackProxy2(TOwnerClass& ownerObject) : m_ownerObject(ownerObject), m_mfpWrite(TMfpWrite) { } + + void write(const void* buffer, const size_t size) override { if (m_mfpWrite) { (m_ownerObject.*m_mfpWrite)(buffer, size); } } + +protected: + TOwnerClass& m_ownerObject; + void (TOwnerClass::*m_mfpWrite)(const void* buffer, size_t size); +}; + +// ________________________________________________________________________________________________________________ +// +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/defines.h b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/defines.h new file mode 100644 index 0000000..c296f1b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/include/ebml/defines.h @@ -0,0 +1,117 @@ +/** + * \file defines.h + * \author Yann Renard (INRIA/IRISA) + * \date 2006-08-07 + * \brief Contains basic type definitions and EBML standard identifiers + */ + +#pragma once + +#include +#include // For Unix Compatibility +#include + +//___________________________________________________________________// +// // +// EBML Standard identifiers definitions // +//___________________________________________________________________// +// // + +/** + * \name EBML standard identifiers definitions + * + * Be sure to look at http://ebml.sourceforge.net/specs/ to + * have more information on EBML and its standard identifiers. + */ + +//@{ + +/** + * EBML Header. + * This is a master node. + * It contains several information about the ebml stream. + */ +#define EBML_Identifier_Header EBML::CIdentifier(0x0A45DFA3) +/** + * EBML Version. + * This is a child node of type \c integer. + * It contains the EBML version. + */ +#define EBML_Identifier_EBMLVersion EBML::CIdentifier(0x0286) +/** + * EBML Read Version. + * This is a child node of type \c integer. + * Indicates the EBML version a parser has to support to read this file + */ +#define EBML_Identifier_EBMLReadVersion EBML::CIdentifier(0x02F7) +/** + * EBML Identifier Length. + * This is a child node of type \c integer. + * Indicates the parser the maximum number of bytes an identifier + * can have. + */ +#define EBML_Identifier_EBMLIdLength EBML::CIdentifier(0x02F2) +/** + * EBML Size Length. + * This is a child node of type \c integer. + * Indicates the paser the maximum number of bytes a node + * can have. + */ +#define EBML_Identifier_EBMLSizeLength EBML::CIdentifier(0x02F3) +/** + * EBML Document Type. + * This is a child node of type \c string. + * Indicates the parser the kind of document being parsed. + */ +#define EBML_Identifier_DocType EBML::CIdentifier(0x0282) +/** + * EBML Document Type Version. + * This is a child node of type \c integer. + * Indicates the parser the specification version of the document + * being parsed. + */ +#define EBML_Identifier_DocTypeVersion EBML::CIdentifier(0x0287) +/** + * EBML Document Type Read Version. + * This is a child node of type \c integer. + * Indicates the parser the version of the reader to use in order + * to understand the document content. + */ +#define EBML_Identifier_DocTypeReadVersion EBML::CIdentifier(0x0285) +/** + * EBML Void. + * This is a child node of type \c binary. + * Indicates an ununderstandable chunk of data to skip. + */ +#define EBML_Identifier_Void EBML::CIdentifier(0x6C) +/** + * EBML CRC32. + * This is a child node of type \c binary. + * This is a CRC32 checksum of the content between this CRC32 + * and the last one. + */ +#define EBML_Identifier_CRC32 EBML::CIdentifier(0x02FE) + +//@} + +#if defined EBML_Shared +# if defined TARGET_OS_Windows +# define EBML_API_Export __declspec(dllexport) +# define EBML_API_Import __declspec(dllimport) +# elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS +# define EBML_API_Export __attribute__((visibility("default"))) +# define EBML_API_Import __attribute__((visibility("default"))) +# else +# define EBML_API_Export +# define EBML_API_Import +# endif +#else +# define EBML_API_Export +# define EBML_API_Import +#endif + +#if defined EBML_Exports +# define EBML_API EBML_API_Export +#else +# define EBML_API EBML_API_Import +#endif diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/src/CIdentifier.cpp b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/CIdentifier.cpp new file mode 100644 index 0000000..7ac68ee --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/CIdentifier.cpp @@ -0,0 +1,17 @@ +#include "ebml/CIdentifier.h" + +namespace EBML { + +const CIdentifier& CIdentifier::operator=(const CIdentifier& id) +{ + m_id = id.m_id; + return *this; +} + +bool operator==(const CIdentifier& id1, const CIdentifier& id2) { return id1.m_id == id2.m_id; } +bool operator!=(const CIdentifier& id1, const CIdentifier& id2) { return id1.m_id != id2.m_id; } +bool operator<=(const CIdentifier& id1, const CIdentifier& id2) { return id1.m_id <= id2.m_id; } +bool operator>=(const CIdentifier& id1, const CIdentifier& id2) { return id1.m_id >= id2.m_id; } +bool operator<(const CIdentifier& id1, const CIdentifier& id2) { return id1.m_id < id2.m_id; } +bool operator>(const CIdentifier& id1, const CIdentifier& id2) { return id1.m_id > id2.m_id; } +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/src/CReader.cpp b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/CReader.cpp new file mode 100644 index 0000000..8da2cad --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/CReader.cpp @@ -0,0 +1,14 @@ +#include "ebml/CReader.h" + +namespace EBML { + +CReader::CReader(IReaderCallback& callback) { m_impl = createReader(callback); } +CReader::~CReader() { m_impl->release(); } + +bool CReader::processData(const void* buffer, const size_t size) { return m_impl->processData(buffer, size); } +CIdentifier CReader::getCurrentNodeID() const { return m_impl->getCurrentNodeID(); } +size_t CReader::getCurrentNodeSize() const { return m_impl->getCurrentNodeSize(); } + +void CReader::release() {} + +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/src/CReaderHelper.cpp b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/CReaderHelper.cpp new file mode 100644 index 0000000..b13ea27 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/CReaderHelper.cpp @@ -0,0 +1,15 @@ +#include "ebml/CReaderHelper.h" + +namespace EBML { + +CReaderHelper::CReaderHelper() { m_impl = createReaderHelper(); } +CReaderHelper::~CReaderHelper() { m_impl->release(); } + +uint64_t CReaderHelper::getUInt(const void* buffer, const size_t size) { return m_impl->getUInt(buffer, size); } +int64_t CReaderHelper::getInt(const void* buffer, const size_t size) { return m_impl->getInt(buffer, size); } +double CReaderHelper::getDouble(const void* buffer, const size_t size) { return m_impl->getDouble(buffer, size); } +const char* CReaderHelper::getStr(const void* buffer, const size_t size) { return m_impl->getStr(buffer, size); } + +void CReaderHelper::release() {} + +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/src/CWriter.cpp b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/CWriter.cpp new file mode 100644 index 0000000..14d3389 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/CWriter.cpp @@ -0,0 +1,14 @@ +#include "ebml/CWriter.h" + +namespace EBML { + +CWriter::CWriter(IWriterCallback& callback) { m_impl = createWriter(callback); } +CWriter::~CWriter() { m_impl->release(); } + +bool CWriter::openChild(const CIdentifier& identifier) { return m_impl->openChild(identifier); } +bool CWriter::setChildData(const void* buffer, const size_t size) { return m_impl->setChildData(buffer, size); } +bool CWriter::closeChild() { return m_impl->closeChild(); } + +void CWriter::release() {} + +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/src/CWriterHelper.cpp b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/CWriterHelper.cpp new file mode 100644 index 0000000..67d2a26 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/CWriterHelper.cpp @@ -0,0 +1,21 @@ +#include "ebml/CWriterHelper.h" + +namespace EBML { + +CWriterHelper::CWriterHelper() { m_impl = createWriterHelper(); } +CWriterHelper::~CWriterHelper() { m_impl->release(); } + +bool CWriterHelper::connect(IWriter* writer) { return m_impl->connect(writer); } +bool CWriterHelper::disconnect() { return m_impl->disconnect(); } + +bool CWriterHelper::openChild(const CIdentifier& identifier) { return m_impl->openChild(identifier); } +bool CWriterHelper::closeChild() { return m_impl->closeChild(); } + +bool CWriterHelper::setInt(const int64_t value) { return m_impl->setInt(value); } +bool CWriterHelper::setUInt(const uint64_t value) { return m_impl->setUInt(value); } +bool CWriterHelper::setFloat(const float value) { return m_impl->setFloat(value); } +bool CWriterHelper::setDouble(const double value) { return m_impl->setDouble(value); } +bool CWriterHelper::setBinary(const void* buffer, const size_t size) { return m_impl->setBinary(buffer, size); } +bool CWriterHelper::setStr(const char* value) { return m_impl->setStr(value); } + +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/src/IReader.cpp b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/IReader.cpp new file mode 100644 index 0000000..cfd6612 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/IReader.cpp @@ -0,0 +1,357 @@ +#include "ebml/IReader.h" +#include + +#include +#include +#include + +#if 0 +#define _Debug_ _is_in_debug_mode_(m_totalBytes) +static bool _is_in_debug_mode_(uint64_t value) +{ + static int i=0; + // bool result=i++>5500000; + bool result=value>29605500; + if (result) std::cout << "Arround " << value << std::endl; + return result; + +} +#else +#define _Debug_ false +#endif + +// ________________________________________________________________________________________________________________ +// + +inline bool needsTwoBytesToGetCodedSizeLength(const unsigned char* buffer) { return buffer[0] == 0; } + +inline size_t getCodedSizeLength(const unsigned char* buffer) +{ + if (buffer[0] >> 7) { return 1; } + if (buffer[0] >> 6) { return 2; } + if (buffer[0] >> 5) { return 3; } + if (buffer[0] >> 4) { return 4; } + if (buffer[0] >> 3) { return 5; } + if (buffer[0] >> 2) { return 6; } + if (buffer[0] >> 1) { return 7; } + if (buffer[0]) { return 8; } + if (buffer[1] >> 7) { return 9; } + return 10; +} + +inline uint64_t getValue(unsigned char* buffer) +{ + uint64_t result = 0; + const size_t length = getCodedSizeLength(buffer); + size_t ithBit = length; + for (size_t i = 0; i < length; ++i) + { + result = (result << 8) + (buffer[i]); + result &= ~(ithBit > 0 && ithBit <= 8 ? (1 << (8 - ithBit)) : 0); + ithBit -= 8; + } + return result; +} + +// ________________________________________________________________________________________________________________ +// + +namespace EBML { +namespace { +class CReaderNode +{ +public: + CReaderNode(const CIdentifier& identifier, CReaderNode* parentNode) : m_ParentNode(parentNode), m_Id(identifier) { } + +private: + CReaderNode() = delete; + +public: + + CReaderNode* m_ParentNode = nullptr; + CIdentifier m_Id; + size_t m_ContentSize = 0; + size_t m_ReadContentSize = 0; + unsigned char* m_Buffer = nullptr; +}; +} // namespace +} // namespace EBML + +// ________________________________________________________________________________________________________________ +// + +namespace EBML { +namespace { +class CReader final : public IReader +{ +public: + + explicit CReader(IReaderCallback& callback) : m_readerCB(callback) { } + ~CReader() override; + bool processData(const void* buffer, const size_t size) override; + CIdentifier getCurrentNodeID() const override; + size_t getCurrentNodeSize() const override; + void release() override; + +protected: + + enum EStatus + { + FillingIdentifier, + FillingContentSize, + FillingContent, + }; + + IReaderCallback& m_readerCB; + CReaderNode* m_currentNode = nullptr; + size_t m_pendingSize = 0; + size_t m_nPending = 0; + unsigned char* m_pending = nullptr; + EStatus m_status = FillingIdentifier; + EStatus m_lastStatus = FillingIdentifier; + CIdentifier m_currentID = 0; + size_t m_currentContentSize = 0; + size_t m_totalBytes = 0; +}; +} // namespace + +// ________________________________________________________________________________________________________________ +// + +CReader::~CReader() +{ + delete [] m_pending; + while (m_currentNode) + { + CReaderNode* parentNode = m_currentNode->m_ParentNode; + delete m_currentNode; + m_currentNode = parentNode; + } +} + +bool CReader::processData(const void* buffer, const size_t size) +{ + m_totalBytes += size; + + if (_Debug_) + { + std::cout << "Received " << size << " byte(s) new buffer :"; + for (int i = 0; i < int(size) /* && i<4*/; ++i) { printf("[%02X]", ((unsigned char*)buffer)[i]); } + std::cout << "...\n"; + } + + if (!buffer || !size) { return true; } + + unsigned char* tmpBuffer = (unsigned char*)buffer; + size_t currentSize = size; + bool finished = false; + while (!finished) + { + size_t processedPendingBytes = 0; + size_t processedBytes = 0; + m_lastStatus = m_status; + + if (_Debug_ && m_nPending) + { + std::cout << m_nPending << " byte(s) pending : "; + for (int i = 0; i < int(m_nPending); ++i) { printf("[%02X]", m_pending[i]); } + std::cout << "\n"; + } + + // Processes data + switch (m_status) + { + case FillingIdentifier: + case FillingContentSize: + { + if (needsTwoBytesToGetCodedSizeLength(m_nPending ? m_pending : tmpBuffer)) + { + if (m_nPending + currentSize < 2) + { + finished = true; + break; + } + + if (m_nPending == 1) + { + // assumes (currentSize != 0) because (m_nPending + currentSize >= 2) and (m_nPending == 1) + m_pending[1] = tmpBuffer[0]; + tmpBuffer++; + m_nPending++; + currentSize--; + } + } + + const size_t length = getCodedSizeLength(m_nPending ? m_pending : tmpBuffer); + if (length > currentSize + m_nPending) { finished = true; } + else + { + unsigned char* encodedBuffer = new unsigned char[length]; + const size_t pendingBytesToCopy = (length > m_nPending ? m_nPending : length); + memcpy(encodedBuffer, m_pending, size_t(pendingBytesToCopy)); + memcpy(encodedBuffer + pendingBytesToCopy, tmpBuffer, size_t(length - pendingBytesToCopy)); + const uint64_t value = getValue(encodedBuffer); + delete [] encodedBuffer; + processedPendingBytes = pendingBytesToCopy; + processedBytes = length; + + switch (m_status) + { + case FillingIdentifier: + { + m_currentID = value; + m_status = FillingContentSize; + if (_Debug_) + { + printf("Found identifier 0x%llX - Changing status to FillingContentSize...\n", static_cast(m_currentID)); + } + } + break; + + case FillingContentSize: + { + m_currentContentSize = value; + if (m_readerCB.isMasterChild(m_currentID)) + { + m_status = FillingIdentifier; + if (_Debug_) + { + std::cout << "Found content size " << m_currentContentSize << " of master node - Changing status to FillingIdentifier...\n"; + } + } + else + { + m_status = FillingContent; + if (_Debug_) + { + std::cout << "Found content size " << m_currentContentSize << + " of *non* master node - Changing status to FillingContent...\n"; + } + } + } + break; + + case FillingContent: + // Should never happen - avoids the warning + break; + } + } + } + break; + + case FillingContent: + { + if (m_currentNode->m_ContentSize == 0) + { + m_status = FillingIdentifier; + if (_Debug_) + { + std::cout << "Finished with " << m_currentNode->m_ContentSize << " byte(s) content - Changing status to FillingIdentifier...\n"; + } + m_readerCB.processChildData(nullptr, 0); + } + else + { + if (m_currentNode->m_ReadContentSize == 0 && m_currentNode->m_ContentSize <= currentSize) + { + m_status = FillingIdentifier; + + processedBytes = m_currentNode->m_ContentSize; + if (_Debug_) + { + std::cout << "Optimized processing of " << m_currentNode->m_ContentSize << + " byte(s) content - Changing status to FillingIdentifier...\n"; + } + m_readerCB.processChildData(tmpBuffer, m_currentNode->m_ContentSize); + } + else + { + if (m_currentNode->m_ContentSize - m_currentNode->m_ReadContentSize > currentSize) + { + memcpy(m_currentNode->m_Buffer + m_currentNode->m_ReadContentSize, tmpBuffer, size_t(currentSize)); + processedBytes = currentSize; + finished = true; + } + else + { + memcpy(m_currentNode->m_Buffer + m_currentNode->m_ReadContentSize, tmpBuffer, + size_t(m_currentNode->m_ContentSize - m_currentNode->m_ReadContentSize)); + processedBytes = m_currentNode->m_ContentSize - m_currentNode->m_ReadContentSize; + + m_status = FillingIdentifier; + if (_Debug_) + { + std::cout << "Finished with " << m_currentNode->m_ContentSize << " byte(s) content - Changing status to FillingIdentifier...\n"; + } + m_readerCB.processChildData(m_currentNode->m_Buffer, m_currentNode->m_ContentSize); + } + } + } + } + break; + } + + // Updates buffer pointer and size + const size_t processedBytesInBuffer = processedBytes - processedPendingBytes; + tmpBuffer += processedBytesInBuffer; + currentSize -= processedBytesInBuffer; + m_nPending -= processedPendingBytes; + + // Updates read size + CReaderNode* node = m_currentNode; + while (node) + { + node->m_ReadContentSize += processedBytes; + node = node->m_ParentNode; + } + + // Creates new node when needed + if (m_status != FillingContentSize && m_lastStatus == FillingContentSize) + { + m_currentNode = new CReaderNode(m_currentID, m_currentNode); + m_currentNode->m_ContentSize = m_currentContentSize; + m_currentNode->m_Buffer = new unsigned char[m_currentContentSize]; + m_readerCB.openChild(m_currentNode->m_Id); + } + else + { + // Closes finished nodes + while (m_currentNode && (m_currentNode->m_ContentSize == m_currentNode->m_ReadContentSize || m_currentNode->m_ContentSize == 0)) + { + m_readerCB.closeChild(); + CReaderNode* parent = m_currentNode->m_ParentNode; + delete [] m_currentNode->m_Buffer; + delete m_currentNode; + m_currentNode = parent; + } + } + } + + // Updates pending data + if (m_nPending + currentSize > m_pendingSize) + { + unsigned char* pending = new unsigned char[m_nPending + currentSize + 1 + ]; // Ugly hack, reserve 1 more byte on pending data so we are sure we can insert this additional pending byte when only one byte is pending and two bytes are needed for decoding identifier and/or buffer size + memcpy(pending, m_pending, m_nPending); + delete [] m_pending; + m_pending = pending; + m_pendingSize = m_nPending + currentSize; + } + memcpy(m_pending + m_nPending, tmpBuffer, currentSize); + m_nPending += currentSize; + + if (_Debug_) { std::cout << "\n"; } + return true; +} + +CIdentifier CReader::getCurrentNodeID() const { return m_currentNode ? m_currentNode->m_Id : CIdentifier(); } +size_t CReader::getCurrentNodeSize() const { return m_currentNode ? m_currentNode->m_ContentSize : 0; } + +void CReader::release() { delete this; } + +// ________________________________________________________________________________________________________________ +// + +EBML_API IReader* createReader(IReaderCallback& callback) { return new CReader(callback); } + +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/src/IReaderHelper.cpp b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/IReaderHelper.cpp new file mode 100644 index 0000000..3c9be7f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/IReaderHelper.cpp @@ -0,0 +1,85 @@ +#include "ebml/IReaderHelper.h" + +#include +#include + +namespace EBML { +namespace { +class CReaderHelper final : public IReaderHelper +{ +public: + CReaderHelper() { } + uint64_t getUInt(const void* buffer, const size_t size) override; + int64_t getInt(const void* buffer, const size_t size) override; + double getDouble(const void* buffer, const size_t size) override; + const char* getStr(const void* buffer, const size_t size) override; + void release() override; + + std::string m_Str; +}; +} // namespace + +uint64_t CReaderHelper::getUInt(const void* buffer, const size_t size) +{ + uint64_t result = 0; + for (size_t i = 0; i < size; ++i) + { + result <<= 8; + result |= reinterpret_cast(buffer)[i]; + } + return result; +} + +int64_t CReaderHelper::getInt(const void* buffer, const size_t size) +{ + int64_t result = 0; + if (size != 0 && reinterpret_cast(buffer)[0] & 0x80) { result = -1; } + + for (size_t i = 0; i < size; ++i) + { + result <<= 8; + result |= reinterpret_cast(buffer)[i]; + } + return result; +} + +double CReaderHelper::getDouble(const void* buffer, const size_t size) +{ + switch (size) + { + case 4: + { + float res; + uint32_t data; + data = uint32_t(getUInt(buffer, size)); + memcpy(&res, &data, sizeof(res)); + return double(res); + } + + case 8: + { + double res; + uint64_t data; + data = getUInt(buffer, size); + memcpy(&res, &data, sizeof(res)); + return res; + } + + case 0: + case 10: + default: return 0.0; + } +} + +const char* CReaderHelper::getStr(const void* buffer, const size_t size) +{ + if (size) { m_Str.assign(reinterpret_cast(buffer), size_t(size)); } + else { m_Str = ""; } + return m_Str.c_str(); +} + +void CReaderHelper::release() { delete this; } + +EBML_API IReaderHelper* createReaderHelper() { return new CReaderHelper(); } + +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/src/IWriter.cpp b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/IWriter.cpp new file mode 100644 index 0000000..008e855 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/IWriter.cpp @@ -0,0 +1,214 @@ +#include "ebml/IWriter.h" + +#include +#include + +inline size_t getCodedSizeLength(const uint64_t value) +{ + if (value < 0x000000000000007fLL) { return 1; } + if (value < 0x0000000000003fffLL) { return 2; } + if (value < 0x00000000001fffffLL) { return 3; } + if (value < 0x000000000fffffffLL) { return 4; } + if (value < 0x00000007ffffffffLL) { return 5; } + if (value < 0x000003ffffffffffLL) { return 6; } + if (value < 0x0001ffffffffffffLL) { return 7; } + if (value < 0x00ffffffffffffffLL) { return 8; } + if (value < 0x7fffffffffffffffLL) { return 9; } + return 10; +} + +inline bool getCodedBuffer(const uint64_t value, unsigned char* buffer, size_t* size) +{ + const size_t length = getCodedSizeLength(value); + + if (length > *size) { return false; } + + size_t bit = length; + for (size_t i = 0; i < length; ++i) + { + const size_t byteShift = length - i - 1; + size_t byte = (byteShift >= 8 ? 0 : static_cast((value >> (byteShift * 8)) & 0xff)); + byte |= (bit > 0 && bit <= 8 ? (1 << (8 - bit)) : 0); + bit -= 8; + + buffer[i] = static_cast(byte); + } + + *size = length; + return true; +} + +// ________________________________________________________________________________________________________________ +// + +namespace EBML { +namespace { +class CWriterNode final +{ +public: + + CWriterNode(const CIdentifier& identifier, CWriterNode* parentNode) : m_ID(identifier), m_ParentNode(parentNode) {} + ~CWriterNode(); + void process(IWriterCallback& callback); + +protected: + + size_t getTotalContentSize(bool identifierAndSize); + +private: + + CWriterNode() = delete; + +public: + + CIdentifier m_ID; + CWriterNode* m_ParentNode = nullptr; + size_t m_BufferLength = 0; + unsigned char* m_Buffer = nullptr; + bool m_Buffered = false; + std::vector m_Childrens; +}; +} // namespace + +// ________________________________________________________________________________________________________________ +// + +CWriterNode::~CWriterNode() +{ + for (auto i = m_Childrens.begin(); i != m_Childrens.end(); ++i) { delete (*i); } + + if (m_Buffer) + { + delete [] m_Buffer; + m_Buffer = nullptr; + } +} + +void CWriterNode::process(IWriterCallback& callback) +{ + unsigned char id[10]; + unsigned char pContentSize[10]; + size_t contentSizeLength = sizeof(pContentSize); + size_t identifierLength = sizeof(id); + const size_t contentSize = getTotalContentSize(false); + + if (!getCodedBuffer(contentSize, pContentSize, &contentSizeLength)) { } // SHOULD NEVER HAPPEN + if (!getCodedBuffer(m_ID, id, &identifierLength)) { } // SHOULD NEVER HAPPEN + + callback.write(id, identifierLength); + callback.write(pContentSize, contentSizeLength); + + if (m_Childrens.empty()) { callback.write(m_Buffer, m_BufferLength); } + else { for (auto i = m_Childrens.begin(); i != m_Childrens.end(); ++i) { (*i)->process(callback); } } +} + +size_t CWriterNode::getTotalContentSize(const bool identifierAndSize) +{ + size_t contentSize = 0; + if (m_Childrens.empty()) { contentSize = m_BufferLength; } + else { for (auto i = m_Childrens.begin(); i != m_Childrens.end(); ++i) { contentSize += (*i)->getTotalContentSize(true); } } + + size_t res = contentSize; + if (identifierAndSize) + { + res += getCodedSizeLength(m_ID); + res += getCodedSizeLength(contentSize); + } + + return res; +} + +// ________________________________________________________________________________________________________________ +// + +namespace { +class CWriter final : public IWriter +{ +public: + + explicit CWriter(IWriterCallback& callback) : m_callback(callback) {} + bool openChild(const CIdentifier& identifier) override; + bool setChildData(const void* buffer, const size_t size) override; + bool closeChild() override; + void release() override; + +protected: + + CWriterNode* m_node = nullptr; + IWriterCallback& m_callback; + +private: + CWriter() = delete; +}; +} // namespace + +// ________________________________________________________________________________________________________________ +// + +bool CWriter::openChild(const CIdentifier& identifier) +{ + if (m_node) { if (m_node->m_Buffered) { return false; } } + + CWriterNode* pResult = new CWriterNode(identifier, m_node); + if (m_node) { m_node->m_Childrens.push_back(pResult); } + m_node = pResult; + return true; +} + +bool CWriter::setChildData(const void* buffer, const size_t size) +{ + if (!m_node) { return false; } + + if (!m_node->m_Childrens.empty()) { return false; } + + unsigned char* bufferCopy = nullptr; + if (size) + { + if (!buffer) { return false; } + bufferCopy = new unsigned char[size]; + if (!bufferCopy) { return false; } + memcpy(bufferCopy, buffer, size); + } + + delete [] m_node->m_Buffer; + + m_node->m_BufferLength = size; + m_node->m_Buffer = bufferCopy; + m_node->m_Buffered = true; + return true; +} + +bool CWriter::closeChild() +{ + if (!m_node) { return false; } + + if ((!m_node->m_Buffered) && (m_node->m_Childrens.empty())) + { + m_node->m_BufferLength = 0; + m_node->m_Buffer = nullptr; + m_node->m_Buffered = true; + } + + CWriterNode* parent = m_node->m_ParentNode; + if (!parent) + { + m_node->process(m_callback); + delete m_node; + } + + m_node = parent; + return true; +} + +void CWriter::release() +{ + while (m_node) { closeChild(); } + delete this; +} + +// ________________________________________________________________________________________________________________ +// + +EBML_API IWriter* createWriter(IWriterCallback& callback) { return new CWriter(callback); } + +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/ebml/src/IWriterHelper.cpp b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/IWriterHelper.cpp new file mode 100644 index 0000000..cdd304d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/ebml/src/IWriterHelper.cpp @@ -0,0 +1,129 @@ +#include "ebml/IWriterHelper.h" +#include "ebml/IWriter.h" + +#include +#include + +namespace EBML { +namespace { +class CWriterHelper final : public IWriterHelper +{ +public: + + CWriterHelper() { } + bool connect(IWriter* writer) override; + bool disconnect() override; + bool openChild(const CIdentifier& identifier) override; + bool closeChild() override; + bool setInt(const int64_t value) override; + bool setUInt(const uint64_t value) override; + bool setFloat(const float value) override; + bool setDouble(const double value) override; + bool setBinary(const void* buffer, const size_t size) override; + bool setStr(const char* value) override; + void release() override; + +protected: + + IWriter* m_writer = nullptr; +}; +} // namespace + +bool CWriterHelper::connect(IWriter* writer) +{ + m_writer = writer; + return m_writer ? true : false; +} + +bool CWriterHelper::disconnect() +{ + if (!m_writer) { return false; } + m_writer = nullptr; + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CWriterHelper::openChild(const CIdentifier& identifier) { return m_writer ? m_writer->openChild(identifier) : false; } + +bool CWriterHelper::closeChild() { return m_writer ? m_writer->closeChild() : false; } + +// ________________________________________________________________________________________________________________ +// + +bool CWriterHelper::setInt(const int64_t value) +{ + unsigned char buffer[8]; + + size_t size = 8; + if (value == 0x00000000000000LL) { size = 0; } + else if (value >= -0x00000000000080LL && value <= 0x0000000000007fLL) { size = 1; } + else if (value >= -0x00000000008000LL && value <= 0x00000000007fffLL) { size = 2; } + else if (value >= -0x00000000800000LL && value <= 0x000000007fffffLL) { size = 3; } + else if (value >= -0x00000080000000LL && value <= 0x0000007fffffffLL) { size = 4; } + else if (value >= -0x00008000000000LL && value <= 0x00007fffffffffLL) { size = 5; } + else if (value >= -0x00800000000000LL && value <= 0x007fffffffffffLL) { size = 6; } + else if (value >= -0x80000000000000LL && value <= 0x7fffffffffffffLL) { size = 7; } + //else { size = 8; } + + for (size_t i = 0; i < size; ++i) { buffer[size - i - 1] = static_cast((value >> (i * 8)) & 0xff); } + + return m_writer->setChildData(buffer, size); +} + +bool CWriterHelper::setUInt(const uint64_t value) +{ + size_t size = 8; + unsigned char buffer[8]; + + if (value == 0x000000000000000LL) { size = 0; } + else if (value < 0x000000000000100LL) { size = 1; } + else if (value < 0x000000000010000LL) { size = 2; } + else if (value < 0x000000001000000LL) { size = 3; } + else if (value < 0x000000100000000LL) { size = 4; } + else if (value < 0x000010000000000LL) { size = 5; } + else if (value < 0x001000000000000LL) { size = 6; } + else if (value < 0x100000000000000LL) { size = 7; } + + for (size_t i = 0; i < size; ++i) { buffer[size - i - 1] = static_cast((value >> (i * 8)) & 0xff); } + + return m_writer->setChildData(buffer, size); +} + +bool CWriterHelper::setFloat(const float value) +{ + uint32_t res; + unsigned char buffer[8]; + memcpy(&res, &value, sizeof(value)); + + const size_t size = (value != 0 ? 4 : 0); + for (size_t i = 0; i < size; ++i) { buffer[size - i - 1] = static_cast((res >> (i * 8)) & 0xff); } + return m_writer->setChildData(buffer, size); +} + +bool CWriterHelper::setDouble(const double value) +{ + uint64_t res; + unsigned char buffer[8]; + memcpy(&res, &value, sizeof(value)); + const size_t size = (value != 0 ? 8 : 0); + for (size_t i = 0; i < size; ++i) { buffer[size - i - 1] = static_cast((res >> (i * 8)) & 0xff); } + return m_writer->setChildData(buffer, size); +} + +bool CWriterHelper::setBinary(const void* buffer, const size_t size) { return m_writer->setChildData(buffer, size); } + +bool CWriterHelper::setStr(const char* value) { return m_writer->setChildData(value, strlen(value)); } + +// ________________________________________________________________________________________________________________ +// + +void CWriterHelper::release() { delete this; } + +// ________________________________________________________________________________________________________________ +// + +EBML_API IWriterHelper* createWriterHelper() { return new CWriterHelper(); } + +} // namespace EBML diff --git a/Masterarbeit/openvibe/sdk-master/modules/fs/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/modules/fs/CMakeLists.txt new file mode 100755 index 0000000..ced4761 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/fs/CMakeLists.txt @@ -0,0 +1,52 @@ +PROJECT(openvibe-module-fs) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl include/*.h) +INCLUDE_DIRECTORIES(include/fs) +INCLUDE("FindSourceRCProperties") + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER} + COMPILE_FLAGS "-DFS_Shared -DFS_Exports") + +ADD_LIBRARY(${PROJECT_NAME}-static STATIC ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME}-static PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER} + COMPILE_FLAGS "-DFS_Static -DFS_Exports") + +IF(UNIX) + SET_TARGET_PROPERTIES(${PROJECT_NAME}-static PROPERTIES COMPILE_FLAGS "-fPIC") +ENDIF() + +INCLUDE("FindOpenViBECommon") +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyBoost_FileSystem") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) +INSTALL(TARGETS ${PROJECT_NAME}-static + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) +INSTALL(DIRECTORY include/ DESTINATION ${DIST_INCLUDEDIR} FILES_MATCHING PATTERN "*.h") diff --git a/Masterarbeit/openvibe/sdk-master/modules/fs/include/fs/Files.h b/Masterarbeit/openvibe/sdk-master/modules/fs/include/fs/Files.h new file mode 100644 index 0000000..ac851f8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/fs/include/fs/Files.h @@ -0,0 +1,62 @@ +#pragma once + +#include "defines.h" +#include +#include + +namespace FS { +class FS_API Files +{ +public: + static FILE* open(const char* file, const char* mode); + static FILE* popen(const char* file, const char* mode); + static void openOFStream(std::ofstream& stream, const char* file, std::ios_base::openmode mode = std::ios_base::out); + static void openIFStream(std::ifstream& stream, const char* file, std::ios_base::openmode mode = std::ios_base::in); + static void openFStream(std::fstream& stream, const char* file, std::ios_base::openmode mode); + + static bool equals(const char* pFile1, const char* pFile2); + static bool fileExists(const char* pathToCheck); + static bool directoryExists(const char* pathToCheck); + // Creates all components of a path to the filesystem + static bool createPath(const char* path); + // Creates all components of a path to the filesystem except the last part (i.e. for paths including a filename in the end) + static bool createParentPath(const char* path); + // Returns a path omitting the last part of it (essentially boost::filesystem::parent_path). Output sParentPath needs to be pre-allocated. + static bool getParentPath(const char* path, char* parentPath); + static bool getParentPath(const char* path, char* parentPath, size_t size); + + /** + * \brief Fills filename as a component of a path + * \param path [in]: input path + * \param filename [out]: file name, needs to be pre-allocated + * + * (essentially boost::filesystem::filename) + * \return Success status + */ + static bool getFilename(const char* path, char* filename); + static bool getFilename(const char* path, char* filename, size_t size); + + /** + * \brief Fills filename as a component of a path without the extension + * \param path [in]: input path + * \param filename [out]: file name without extension, needs to be pre-allocated + * + * (essentially boost::filesystem::filename) + * \return Success status + */ + static bool getFilenameWithoutExtension(const char* path, char* filename); + static bool getFilenameWithoutExtension(const char* path, char* filename, size_t size); + // Returns the extension component of a path + static bool getFilenameExtension(const char* path, char* fileNameExtension); + static bool getFilenameExtension(const char* path, char* extension, size_t size); + + static bool copyFile(const char* srcFile, const char* dstPath); + static bool copyDirectory(const char* srcDir, const char* dstDir); + + static bool remove(const char* path); + static bool removeAll(const char* path); +private: + + Files() = delete; +}; +} // namespace FS diff --git a/Masterarbeit/openvibe/sdk-master/modules/fs/include/fs/IEntryEnumerator.h b/Masterarbeit/openvibe/sdk-master/modules/fs/include/fs/IEntryEnumerator.h new file mode 100644 index 0000000..d9fb25d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/fs/include/fs/IEntryEnumerator.h @@ -0,0 +1,54 @@ +#pragma once + +#include "defines.h" +#include +#include // size_t for unix + +namespace FS { +class IEntryEnumeratorCallBack; + +class FS_API IEntryEnumerator +{ +public: + + class FS_API IAttributes + { + public: + virtual bool isFile() = 0; + virtual bool isDirectory() = 0; + virtual bool isSymbolicLink() = 0; + + virtual bool isArchive() = 0; + virtual bool isReadOnly() = 0; + virtual bool isHidden() = 0; + virtual bool isSystem() = 0; + virtual bool isExecutable() = 0; + + virtual size_t getSize() = 0; + protected: + virtual ~IAttributes() {} + }; + + class FS_API IEntry + { + public: + virtual const char* getName() = 0; + protected: + virtual ~IEntry() {} + }; + + virtual bool enumerate(const char* sWildcard, bool bRecursive = false) = 0; + virtual void release() = 0; +protected: + virtual ~IEntryEnumerator() { } +}; + +class FS_API IEntryEnumeratorCallBack +{ +public: + virtual bool callback(IEntryEnumerator::IEntry& rEntry, IEntryEnumerator::IAttributes& rAttributes) = 0; + virtual ~IEntryEnumeratorCallBack() { } +}; + +extern FS_API IEntryEnumerator* createEntryEnumerator(IEntryEnumeratorCallBack& rCallBack); +} // namespace FS diff --git a/Masterarbeit/openvibe/sdk-master/modules/fs/include/fs/defines.h b/Masterarbeit/openvibe/sdk-master/modules/fs/include/fs/defines.h new file mode 100644 index 0000000..c17653f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/fs/include/fs/defines.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +#if defined FS_Shared +# if defined TARGET_OS_Windows +# define FS_API_Export __declspec(dllexport) +# define FS_API_Import __declspec(dllimport) +# elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS +# define FS_API_Export __attribute__((visibility("default"))) +# define FS_API_Import __attribute__((visibility("default"))) +# else +# define FS_API_Export +# define FS_API_Import +# endif +#else +# define FS_API_Export +# define FS_API_Import +#endif + +#if defined FS_Exports +# define FS_API FS_API_Export +#else +# define FS_API FS_API_Import +#endif diff --git a/Masterarbeit/openvibe/sdk-master/modules/fs/src/Files.cpp b/Masterarbeit/openvibe/sdk-master/modules/fs/src/Files.cpp new file mode 100644 index 0000000..5ce9a1e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/fs/src/Files.cpp @@ -0,0 +1,391 @@ +#include "Files.h" + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + #include // For fopen + #include //For access(). + #include + #include // For stat(). + #include +#elif defined TARGET_OS_Windows +#include "m_ConverterUtf8.h" +#include +#else +#endif + +#include +#include +#include +#include +#include + +namespace FS { + +// * 2006-08-30 YRD - Portability note : using namespace FS confuses windows platform SDK because it defines itself a 'boolean' type. Thus the following define to force the use of FS::boolean ! + +#if defined TARGET_HAS_Boost && BOOST_VERSION / 100 % 1000 >= 55 +/** + * \brief Makes a recursive copy of source folder to target folder. + * Operation can fail in several cases: + * - target path exists + * - bad permission rights + * \param source the source folder path + * \param target the destination folder path + * \return true if succeeded + * \return false if failed + */ +bool recursiveCopy(const boost::filesystem::path& source, const boost::filesystem::path& target) +{ + if (exists(target)) { return false; } + + if (is_directory(source)) + { + if (!create_directories(target)) { return false; } + for (boost::filesystem::directory_entry& item : boost::filesystem::directory_iterator(source)) + { + // boost::filesystem::path overlods '/' operator ! + if (!recursiveCopy(item.path(), target / item.path().filename())) { return false; } + } + } + else if (is_regular_file(source)) + { + try { copy(source, target); } + catch (...) { return false; } + } + else { return false; } + return true; +} +#endif + + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + + +FILE* Files::open(const char* file, const char* mode) +{ + FILE* fHandle = fopen(file, mode); + return fHandle; +} + +FILE* Files::popen(const char* file, const char* mode) +{ + FILE* fHandle = ::popen(file, mode); + return fHandle; +} + +void Files::openOFStream(std::ofstream& stream, const char* file, std::ios_base::openmode mode) { stream.open(file, mode); } +void Files::openIFStream(std::ifstream& stream, const char* file, std::ios_base::openmode mode) { stream.open(file, mode); } +void Files::openFStream(std::fstream& stream, const char* file, std::ios_base::openmode mode) { stream.open(file, mode); } + +#elif defined TARGET_OS_Windows + + +FILE* Files::open(const char* file, const char* mode) +{ + FILE* fHandle; + + try + { + const std::wstring utf16FileName = Common::Converter::Utf8ToUtf16(file); + const std::wstring utf16Mode = Common::Converter::Utf8ToUtf16(mode); + + fHandle = _wfopen(utf16FileName.c_str(), utf16Mode.c_str()); + } + catch (const std::logic_error&) { fHandle = fopen(file, mode); } + + return fHandle; +} + +FILE* Files::popen(const char* file, const char* mode) +{ + FILE* fHandle; + + try + { + const std::wstring utf16FileName = Common::Converter::Utf8ToUtf16(file); + const std::wstring utf16Mode = Common::Converter::Utf8ToUtf16(mode); + + fHandle = _wpopen(utf16FileName.c_str(), utf16Mode.c_str()); + } + catch (const std::logic_error&) { fHandle = popen(file, mode); } + + return fHandle; +} + +template +void openStream(T& stream, const char* file, std::ios_base::openmode mode) +{ + try + { + const std::wstring utf16FileName = Common::Converter::Utf8ToUtf16(file); + stream.open(utf16FileName.c_str(), mode); + } + catch (const std::logic_error&) { stream.open(file, mode); } +} + +void Files::openOFStream(std::ofstream& stream, const char* file, const std::ios_base::openmode mode) { openStream(stream, file, mode); } +void Files::openIFStream(std::ifstream& stream, const char* file, const std::ios_base::openmode mode) { openStream(stream, file, mode); } +void Files::openFStream(std::fstream& stream, const char* file, const std::ios_base::openmode mode) { openStream(stream, file, mode); } + +#endif + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + +bool Files::equals(const char* pFile1, const char* pFile2) +{ + bool res=true; + if(pFile1 && pFile2) + { + struct stat stat1; + struct stat stat2; + bool bStat1=!stat(pFile1, &stat1); + bool bStat2=!stat(pFile2, &stat2); + + if(!bStat1 && !bStat2) { res=true; } + else if(bStat1 && bStat2) + { + res= + (stat1.st_dev==stat2.st_dev)&& + (stat1.st_ino==stat2.st_ino)&& + (stat1.st_size==stat2.st_size)&& + (stat1.st_mtime==stat2.st_mtime); + } + else { res=false; } + } + return res; +} + +#elif defined TARGET_OS_Windows + +bool Files::equals(const char* pFile1, const char* pFile2) +{ + bool res = true; + if (pFile1 && pFile2) + { + const HANDLE handle1 = ::CreateFile(pFile1, 0, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, nullptr); + const HANDLE handle2 = ::CreateFile(pFile2, 0, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, nullptr); + if (handle1 && handle2) + { + BY_HANDLE_FILE_INFORMATION stat1; + BY_HANDLE_FILE_INFORMATION stat2; + const BOOL bStat1 = GetFileInformationByHandle(handle1, &stat1); + const BOOL bStat2 = GetFileInformationByHandle(handle2, &stat2); + if (!bStat1 && !bStat2) { res = true; } + else if (bStat1 && bStat2) + { + res = (stat1.dwVolumeSerialNumber == stat2.dwVolumeSerialNumber) && (stat1.nFileIndexHigh == stat2.nFileIndexHigh) + && (stat1.nFileIndexLow == stat2.nFileIndexLow) && (stat1.nFileSizeHigh == stat2.nFileSizeHigh) + && (stat1.nFileSizeLow == stat2.nFileSizeLow) && (stat1.ftLastWriteTime.dwHighDateTime == stat2.ftLastWriteTime.dwHighDateTime) + && (stat1.ftLastWriteTime.dwLowDateTime == stat2.ftLastWriteTime.dwLowDateTime); + } + else { res = false; } + CloseHandle(handle1); + CloseHandle(handle2); + } + else + { + if (handle1) { CloseHandle(handle1); } + if (handle2) { CloseHandle(handle2); } + } + } + return res; +} + +#else + +#endif + +bool Files::fileExists(const char* pathToCheck) +{ + if (!pathToCheck) { return false; } + FILE* fp = open(pathToCheck, "r"); + if (!fp) { return false; } + fclose(fp); + return true; +} + +bool Files::directoryExists(const char* pathToCheck) +{ + if (!pathToCheck) { return false; } +#if defined TARGET_OS_Windows + const std::wstring pathUTF16 = Common::Converter::Utf8ToUtf16(pathToCheck); + const DWORD ftyp = GetFileAttributesW(pathUTF16.c_str()); + if (ftyp == INVALID_FILE_ATTRIBUTES) { return false; } + if (ftyp & FILE_ATTRIBUTE_DIRECTORY) { return true; } +#endif +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + if ( access( pathToCheck, 0 ) == 0 ) + { + struct stat status; + stat( pathToCheck, &status ); + + if ( status.st_mode & S_IFDIR ) { return true; } + } +#endif + return false; +} + +bool Files::createPath(const char* path) +{ + if (strcmp(path, "") == 0) { return false; } +#if defined TARGET_OS_Windows + std::wstring pathUTF16 = Common::Converter::Utf8ToUtf16(path); + create_directories(boost::filesystem::wpath(pathUTF16)); + return is_directory(boost::filesystem::wpath(pathUTF16)); +#else + return boost::filesystem::create_directories(boost::filesystem::path(path)); +#endif +} + +bool Files::createParentPath(const char* path) +{ + if (strcmp(path, "") == 0) { return false; } +#if defined TARGET_OS_Windows + std::wstring pathUTF16 = Common::Converter::Utf8ToUtf16(path); + return create_directories(boost::filesystem::wpath(pathUTF16).parent_path()); +#else + return boost::filesystem::create_directories(boost::filesystem::path(path).parent_path()); +#endif +} + +bool Files::getParentPath(const char* path, char* parentPath) +{ + if (!path || !parentPath) { return false; } + strcpy(parentPath, boost::filesystem::path(path).parent_path().string().c_str()); + return true; +} + +bool Files::getParentPath(const char* path, char* parentPath, const size_t size) +{ + if (!path || !parentPath) { return false; } + strncpy(parentPath, boost::filesystem::path(path).parent_path().string().c_str(), size); + return true; +} + +bool Files::getFilename(const char* path, char* filename) +{ + if (!path || !filename) { return false; } + strcpy(filename, boost::filesystem::path(path).filename().string().c_str()); + return true; +} + +bool Files::getFilename(const char* path, char* filename, const size_t size) +{ + if (!path || !filename) { return false; } + strncpy(filename, boost::filesystem::path(path).filename().string().c_str(), size); + return true; +} + +bool Files::getFilenameWithoutExtension(const char* path, char* filename) +{ + if (!path || !filename) { return false; } + strcpy(filename, boost::filesystem::path(path).filename().replace_extension("").string().c_str()); + return true; +} + +bool Files::getFilenameWithoutExtension(const char* path, char* filename, const size_t size) +{ + if (!path || !filename) { return false; } + strncpy(filename, boost::filesystem::path(path).filename().replace_extension("").string().c_str(), size); + return true; +} + +bool Files::getFilenameExtension(const char* path, char* fileNameExtension) +{ + if (!path || !fileNameExtension) { return false; } + strcpy(fileNameExtension, boost::filesystem::path(path).extension().string().c_str()); + return true; +} + +bool Files::getFilenameExtension(const char* path, char* extension, const size_t size) +{ + if (!path || !extension) { return false; } + strncpy(extension, boost::filesystem::path(path).extension().string().c_str(), size); + return true; +} + +bool Files::remove(const char* path) +{ + if (fileExists(path) || directoryExists(path)) + { +#if defined TARGET_OS_Windows + const std::wstring pathUTF16 = Common::Converter::Utf8ToUtf16(path); + return boost::filesystem::remove(boost::filesystem::wpath(pathUTF16.c_str())); +#else + return boost::filesystem::remove(boost::filesystem::path(path)); +#endif + } + return true; +} + +bool Files::removeAll(const char* path) +{ + if (fileExists(path) || directoryExists(path)) + { +#if defined TARGET_OS_Windows + const std::wstring pathUTF16 = Common::Converter::Utf8ToUtf16(path); + return (remove_all(boost::filesystem::wpath(pathUTF16.c_str())) != 0); +#else + return (boost::filesystem::remove_all(boost::filesystem::path(path)) != 0); +#endif + } + return true; +} + + +// old boost compliance +// manage cases here + +#if defined TARGET_HAS_Boost && BOOST_VERSION / 100 % 1000 >= 55 + +bool Files::copyFile(const char* srcFile, const char* dstPath) +{ + if (!srcFile || !dstPath) { return false; } +#if defined TARGET_OS_Windows + std::wstring pathSourceUTF16 = Common::Converter::Utf8ToUtf16(srcFile); + std::wstring pathDestinationUTF16 = Common::Converter::Utf8ToUtf16(dstPath); + boost::filesystem::copy_file(pathSourceUTF16, pathDestinationUTF16); +#else + boost::filesystem::copy_file(srcFile, dstPath); +#endif + return true; +} + +bool Files::copyDirectory(const char* srcDir, const char* dstDir) +{ + if (!srcDir || !dstDir) { return false; } +#if defined TARGET_OS_Windows + const std::wstring pathSourceUTF16 = Common::Converter::Utf8ToUtf16(srcDir); + const std::wstring pathTargetUTF16 = Common::Converter::Utf8ToUtf16(dstDir); + const boost::filesystem::path source = boost::filesystem::wpath(pathSourceUTF16.c_str()); + const boost::filesystem::path target = boost::filesystem::wpath(pathTargetUTF16.c_str()); +#else + boost::filesystem::path source = srcDir; + boost::filesystem::path target = dstDir; +#endif + return recursiveCopy(source, target); +} + +#elif defined TARGET_OS_Windows + +#error OpenViBE requires at least boost 1.55 to compile on Windows + +#else +// ugly hack for old boost on linux ... +bool Files::copyFile(const char* srcFile, const char* dstPath) +{ + if(!srcFile || !dstPath || FS::Files::fileExists(dstPath)) { return false; } + std::string command = std::string("cp '") + srcFile + "' '" + dstPath+"'"; + return (std::system(command.c_str()) != -1); +} + +bool Files::copyDirectory(const char* srcDir, const char* dstDir) +{ + + if(!srcDir || !srcDir || FS::Files::directoryExists(dstDir)) { return false; } + std::string command = std::string("cp -r '") + srcDir + "' '" + dstDir+"'"; + return (std::system(command.c_str()) != -1); +} +#endif +} // namespace FS diff --git a/Masterarbeit/openvibe/sdk-master/modules/fs/src/IEntryEnumerator.cpp b/Masterarbeit/openvibe/sdk-master/modules/fs/src/IEntryEnumerator.cpp new file mode 100755 index 0000000..d88f8c2 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/fs/src/IEntryEnumerator.cpp @@ -0,0 +1,277 @@ +#include "IEntryEnumerator.h" + +#include +#include +#include + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + #include + #include +#elif defined TARGET_OS_Windows +#ifndef UNICODE +#define UNICODE +#endif +#include +#include +#include +#else +#endif + +#include + +namespace FS { +class CEntry final : public IEntryEnumerator::IEntry +{ +public: + + explicit CEntry(const std::string& name) : m_Name(name) {} + const char* getName() override { return m_Name.c_str(); } + + std::string m_Name; +}; + +class CAttributes final : public IEntryEnumerator::IAttributes +{ +public: + + CAttributes() {} + ~CAttributes() override {} + bool isFile() override { return m_IsFile; } + bool isDirectory() override { return m_IsDirectory; } + bool isSymbolicLink() override { return m_IsSymbolicLink; } + bool isArchive() override { return m_IsArchive; } + bool isReadOnly() override { return m_IsReadOnly; } + bool isHidden() override { return m_IsHidden; } + bool isSystem() override { return m_IsSystem; } + bool isExecutable() override { return m_IsExecutable; } + size_t getSize() override { return m_Size; } + + bool m_IsFile = false; + bool m_IsDirectory = false; + bool m_IsSymbolicLink = false; + bool m_IsArchive = false; + bool m_IsReadOnly = false; + bool m_IsHidden = false; + bool m_IsSystem = false; + bool m_IsExecutable = false; + size_t m_Size = 0; +}; + +class CEntryEnumerator : public IEntryEnumerator +{ +public: + explicit CEntryEnumerator(IEntryEnumeratorCallBack& rEntryEnumeratorCallBack) : m_entryEnumeratorCB(rEntryEnumeratorCallBack) {} + void release() override { delete this; } +protected: + IEntryEnumeratorCallBack& m_entryEnumeratorCB; +}; + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + class CEntryEnumeratorLinux final : public CEntryEnumerator + { + public: + CEntryEnumeratorLinux(IEntryEnumeratorCallBack& rEntryEnumeratorCallBack) : CEntryEnumerator(rEntryEnumeratorCallBack) { } + virtual bool enumerate(const char* sWildCard, bool bRecursive=false); + }; + +#elif defined TARGET_OS_Windows +class CEntryEnumeratorWindows final : public CEntryEnumerator +{ +public: + explicit CEntryEnumeratorWindows(IEntryEnumeratorCallBack& rEntryEnumeratorCallBack) : CEntryEnumerator(rEntryEnumeratorCallBack) {} + bool enumerate(const char* sWildCard, bool bRecursive = false) override; +}; + +#else + class CEntryEnumeratorDummy : public CEntryEnumerator + { + public: + explicit CEntryEnumeratorDummy(IEntryEnumeratorCallBack& rEntryEnumeratorCallBack) : CEntryEnumerator(rEntryEnumeratorCallBack) { } + virtual bool enumerate(const char* sWildCard, bool bRecursive=false) { return !sWildCard ? false : true; } + }; + +#endif + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + +bool CEntryEnumeratorLinux::enumerate(const char* sWildCard, bool bRecursive) +{ + if(!sWildCard) { return false; } + + glob_t globStruc; + memset(&globStruc, GLOB_NOSORT, sizeof(globStruc)); + + // Glob can retrn + switch (glob(sWildCard, 0, nullptr, &globStruc)) + { + case GLOB_NOSPACE: + case GLOB_ABORTED: + return false; + break; + case GLOB_NOMATCH: + return true; + break; + default: + break; + } + + if(globStruc.gl_pathc<=0) + { + // Nothing found + return true; + } + + size_t i=0; + bool finished=false; + while(!finished) + { + if(i foldersToEnumerate; + foldersToEnumerate.push(path); + + // if we need to recurse over subfolders, let's fetch all subfolders in foldersToEnumerate + if (bRecursive) + { + std::stack temporaryFolderSearchStack; + temporaryFolderSearchStack.push(path); + std::wstring currentSearchPath; + while (! temporaryFolderSearchStack.empty()) + { + currentSearchPath = temporaryFolderSearchStack.top(); + temporaryFolderSearchStack.pop(); + + WIN32_FIND_DATA findData; + HANDLE fileHandle; + fileHandle = FindFirstFile((currentSearchPath + L"*").c_str(), &findData); + if (fileHandle != INVALID_HANDLE_VALUE) + { + bool finished = false; + while (!finished) + { + if (std::wstring(findData.cFileName) != L"." && std::wstring(findData.cFileName) != L"..") + { + if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + foldersToEnumerate.push(currentSearchPath + findData.cFileName + L"/"); + temporaryFolderSearchStack.push(currentSearchPath + findData.cFileName + L"/"); + } + } + + if (!FindNextFile(fileHandle, &findData)) { finished = true; } + } + FindClose(fileHandle); + } + } + } + std::wstring_convert> converter; + + std::wstring currentPath; + while (! foldersToEnumerate.empty()) + { + currentPath = foldersToEnumerate.top(); + foldersToEnumerate.pop(); + + WIN32_FIND_DATA findData; + HANDLE fileHandle; + fileHandle = FindFirstFile((currentPath + extendedWildCardFilename).c_str(), &findData); + + if (fileHandle != INVALID_HANDLE_VALUE) + { + bool finished = false; + while (!finished) + { + std::string entryName = converter.to_bytes(currentPath + findData.cFileName); + CEntry entry(entryName); + CAttributes attributes; + + attributes.m_IsDirectory = (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? true : false; + attributes.m_IsFile = (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? false : true; + attributes.m_IsSymbolicLink = false; + + attributes.m_IsArchive = (findData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE) ? true : false; + attributes.m_IsReadOnly = (findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? true : false; + attributes.m_IsHidden = (findData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ? true : false; + attributes.m_IsSystem = (findData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) ? true : false; + attributes.m_IsExecutable = false; // TODO + + attributes.m_Size = (findData.nFileSizeHigh << 16) + findData.nFileSizeLow; + + // Sends to callback + if (!m_entryEnumeratorCB.callback(entry, attributes)) { finished = true; } + + if (!FindNextFile(fileHandle, &findData)) { finished = true; } + } + FindClose(fileHandle); + } + } + + return true; +} + +#endif + +FS_API IEntryEnumerator* createEntryEnumerator(IEntryEnumeratorCallBack& rCallBack) +{ +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + IEntryEnumerator* res = new CEntryEnumeratorLinux(rCallBack); +#elif defined TARGET_OS_Windows + IEntryEnumerator* res = new CEntryEnumeratorWindows(rCallBack); +#else + IEntryEnumerator* res = new CEntryEnumeratorDummy(rCallBack); +#endif + return res; +} + +} // namespace FS diff --git a/Masterarbeit/openvibe/sdk-master/modules/socket/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/modules/socket/CMakeLists.txt new file mode 100644 index 0000000..a59f530 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/socket/CMakeLists.txt @@ -0,0 +1,73 @@ +PROJECT(openvibe-module-socket) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl include/*.h include/*.hpp) +INCLUDE_DIRECTORIES(include/socket) +INCLUDE("FindSourceRCProperties") + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER} + COMPILE_FLAGS "-DSocket_Shared -DSocket_Exports") + +ADD_LIBRARY(${PROJECT_NAME}-static STATIC ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME}-static PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER} + COMPILE_FLAGS "-DSocket_Static -DSocket_Exports") + +IF(UNIX) + SET_PROPERTY(TARGET ${PROJECT_NAME}-static APPEND_STRING PROPERTY COMPILE_FLAGS " -fPIC") +ELSEIF(WIN32) +# SET_PROPERTY(TARGET ${PROJECT_NAME}-static APPEND_STRING PROPERTY COMPILE_FLAGS " /SAFESEH:NO") +# SET_PROPERTY(TARGET ${PROJECT_NAME} APPEND_STRING PROPERTY COMPILE_FLAGS " /SAFESEH:NO") +ENDIF() + +INCLUDE("FindOpenViBECommon") + +#INCLUDE("FindThirdPartyTVicPort") + +# --------------------------------- +# Finds standard library winsock +# Adds library to target +# Adds include path +# --------------------------------- +IF(WIN32) + INCLUDE("OvSetWindowsSDKPath") + FIND_LIBRARY(LIB_STANDARD_MODULE_WINSOCK ws2_32 ${OV_MS_SDK_PATH}/lib) + IF(LIB_STANDARD_MODULE_WINSOCK) + MESSAGE(STATUS " Found ws2_32...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_WINSOCK}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME}-static ${LIB_STANDARD_MODULE_WINSOCK}) + ELSE(LIB_STANDARD_MODULE_WINSOCK) + MESSAGE(STATUS " FAILED to find ws2_32...") + ENDIF(LIB_STANDARD_MODULE_WINSOCK) +ENDIF(WIN32) + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) +INSTALL(TARGETS ${PROJECT_NAME}-static + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY include/ DESTINATION ${DIST_INCLUDEDIR} FILES_MATCHING PATTERN "*.h") diff --git a/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnection.h b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnection.h new file mode 100644 index 0000000..bb85e38 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnection.h @@ -0,0 +1,34 @@ +#pragma once + +#include "defines.h" +#include // For Unix Compatibility + +namespace Socket { +class Socket_API IConnection +{ +protected: + + virtual bool open() = 0; + +public: + + virtual bool close() = 0; + + virtual bool isReadyToSend(const size_t timeOut = 0) const = 0; + virtual bool isReadyToReceive(const size_t timeOut = 0) const = 0; + + virtual size_t sendBuffer(const void* buffer, const size_t size) = 0; + virtual size_t receiveBuffer(void* buffer, const size_t size) = 0; + + virtual bool sendBufferBlocking(const void* buffer, const size_t size) = 0; + virtual bool receiveBufferBlocking(void* buffer, const size_t size) = 0; + + virtual bool isConnected() const = 0; + + virtual void release() = 0; + +protected: + + virtual ~IConnection() = default; +}; +} // namespace Socket diff --git a/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionBluetooth.h b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionBluetooth.h new file mode 100644 index 0000000..c162e8b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionBluetooth.h @@ -0,0 +1,90 @@ +#pragma once + +#include "IConnection.h" + +#include +#include + +namespace Socket { +class Socket_API IConnectionBluetooth : public IConnection +{ +public: + + /** + * \brief Connect to the bluetooth device. + * \param[in] address the MAC address of the Bluetooth device. + * \return If the function succeeds, the return value is true, else false. + */ + virtual bool connect(const uint64_t address) = 0; + + /** + * \brief Return the input serial pending byte count. + * \return The number of pending byte. + */ + virtual size_t getPendingByteCount() = 0; + + /** + * \brief Flush the input serial buffer. + * \return If the function succeeds, the return value is true, else false. + */ + virtual const char* getLastError() const = 0; + + /** + * \brief Clear the last error registered. + */ + virtual void clearError() = 0; + + /** + * \brief List the paired bluetooth devices: Name and Bluetooth MAC address. + * + * \param[out] nPairedDevices the Bluetooth devices count. + * \param[out] names an array of Bluetooth names. + * \param[out] addresses an array of Bluetooth addresses. + * + * \return If the function succeeds, the return value is true, else false. + */ + virtual bool listPairedBluetoothDevices(size_t* nPairedDevices, char** names, uint64_t** addresses) = 0; + + /** + * \brief Convert string MAC Bluetooth address to hexadecimal. + * \param[out] straddr string MAC Bluetooth address. + * \param[out] btaddr hexadecimal MAC Bluetooth address. + * \retval true in case of success. + * \retval false in case of failure: if the address does not match: %02x:%02x:%02x:%02x:%02x:%02x + */ + static bool string2BluetoothAddress(const char* straddr, uint64_t* btaddr) + { + std::array aaddr = { 0, 0, 0, 0, 0, 0 }; + + const int value = sscanf(straddr, "%02x:%02x:%02x:%02x:%02x:%02x", &aaddr[0], &aaddr[1], &aaddr[2], &aaddr[3], &aaddr[4], &aaddr[5]); + + if (value != 6) { return false; } + + *btaddr = 0; + + for (size_t i = 0; i < 6; ++i) + { + const uint64_t tmpaddr = static_cast(aaddr[i] & 0xff); + *btaddr = (*btaddr << 8) + tmpaddr; + } + + return true; + } + + +protected: + +#if defined TARGET_OS_Windows + + static const unsigned char WIN_SOCKET_MAJOR_VERSION = 2; // Winsock major version to use + static const unsigned char WIN_SOCKET_MINOR_VERSION = 2; // Winsock minor version to use + + static bool m_isWinsockInitialized; + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + +#endif +}; + +extern Socket_API IConnectionBluetooth* createConnectionBluetooth(); +} // namespace Socket diff --git a/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionClient.h b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionClient.h new file mode 100644 index 0000000..0615571 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionClient.h @@ -0,0 +1,14 @@ +#pragma once + +#include "IConnection.h" + +namespace Socket { +class Socket_API IConnectionClient : public IConnection +{ +public: + + virtual bool connect(const char* serverName, const size_t serverPort, const size_t timeOut = 0xffffffff) = 0; +}; + +extern Socket_API IConnectionClient* createConnectionClient(); +} // namespace Socket diff --git a/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionParallel.h b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionParallel.h new file mode 100644 index 0000000..5566a7e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionParallel.h @@ -0,0 +1,41 @@ +#pragma once + +#include "IConnection.h" +#include + +#if defined TARGET_OS_Windows +#include +#endif + +namespace Socket { +/** + * \brief The IConnectionParallel class provides the possibility to communicate with a parallel port. + * On Windows, you must have TVicPort library installed (available for free: http://entechtaiwan.com/dev/port/index.shtm). + */ +class Socket_API IConnectionParallel : public IConnection +{ +public: + + virtual bool connect(const unsigned short port) = 0; + + virtual std::string getLastError() = 0; + +protected: + +#if defined TARGET_OS_Windows + typedef bool (CALLBACK * port_open_t)(); + typedef void (CALLBACK * port_close_t)(); + typedef bool (CALLBACK * port_is_driver_opened_t)(); + typedef bool (CALLBACK * port_write_t)(unsigned short, unsigned char); + + HMODULE m_port = nullptr; + + port_open_t m_portOpen = nullptr; + port_close_t m_portClose = nullptr; + port_is_driver_opened_t m_isDriverOpened = nullptr; + port_write_t m_portWrite = nullptr; +#endif +}; + +extern Socket_API IConnectionParallel* createConnectionParallel(); +} // namespace Socket diff --git a/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionSerial.h b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionSerial.h new file mode 100644 index 0000000..26dc1bd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionSerial.h @@ -0,0 +1,54 @@ +#pragma once + +#include "IConnection.h" +#include + +namespace Socket { +class Socket_API IConnectionSerial : public IConnection +{ +public: + + virtual bool connect(const char* url, const size_t baudRate) = 0; + + /** + * \brief Return the input serial pending byte count. + * \return The number of pending byte. + */ + virtual size_t getPendingByteCount() = 0; + + /** + * \brief Flush the input serial buffer. + * \return If the function succeeds, the return value is true, else false. + */ + virtual bool flush() = 0; + + /** + * \brief Flush the input serial buffer. + * \return If the function succeeds, the return value is true, else false. + */ + virtual const char* getLastError() = 0; + + /** + * \brief Checks if an error raised. + * \return True if the m_LastError is not empty, else false. + */ + virtual bool isErrorRaised() = 0; + + /** + * \brief Clear the last error registered. + */ + virtual void clearError() = 0; + + /** + * \brief Set tiemouts for read and write function. + * \param timeout [in] Timeout in deciseconds. + * \return True if succeed, else false. + */ + virtual bool setTimeouts(const size_t timeout) = 0; + +protected: + void saveLastError(); +}; + +extern Socket_API IConnectionSerial* createConnectionSerial(); +} // namespace Socket diff --git a/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionSerialDelegate.h b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionSerialDelegate.h new file mode 100644 index 0000000..df41f53 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionSerialDelegate.h @@ -0,0 +1,34 @@ +#pragma once + +#include "TConnectionDelegate.h" +#include "IConnectionSerial.h" + +namespace Socket { +struct Socket_API SConnectionSerialDelegate +{ + SConnectionDelegate connectionDelegate; + bool (*fpConnect)(void*, const char*, const size_t); + size_t (*fpGetPendingByteCount)(void*); + bool (*fpFlush)(void*); + const char* (*fpGetLastError)(void*); + void (*fpSaveLastError)(void*); + // TODO for Android compatibility + //bool(*fpIsErrorRaised)(void*); + //void(*fpClearError)(void*); + //bool(*fSetTimeouts)(void*, const size_t decisecondsTimeout); +}; + +class Socket_API IConnectionSerialDelegate : public TConnectionDelegate +{ +public: + IConnectionSerialDelegate(const SConnectionSerialDelegate connectionSerialDelegate) + : TConnectionDelegate(connectionSerialDelegate.connectionDelegate) { } + + ~IConnectionSerialDelegate() override { } + +protected: + SConnectionSerialDelegate m_connectionSerialDelegate; +}; + +extern Socket_API IConnectionSerialDelegate* createConnectionSerialDelegate(SConnectionSerialDelegate connectionSerialDelegate); +} // namespace Socket diff --git a/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionServer.h b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionServer.h new file mode 100644 index 0000000..0a74299 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/IConnectionServer.h @@ -0,0 +1,29 @@ +#pragma once + +#include "IConnection.h" + +namespace Socket { +class Socket_API IConnectionServer : public IConnection +{ +public: + + /* + * \brief Places a socket in a listening state on the specified port. + * \param port [in]: port on the one the socket should listen. + * when set to '0', the socket wil start on + * an available port. + */ + virtual bool listen(const size_t port) = 0; + + virtual IConnection* accept() = 0; + + /* + * \brief Returns the port on the one the server is listening. + * This is useful if you set the port to '0'. + * \param port [out]: port on the one the server is listening + */ + virtual bool getSocketPort(size_t& port) = 0; +}; + +extern Socket_API IConnectionServer* createConnectionServer(); +} // namespace Socket diff --git a/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/TConnectionDelegate.h b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/TConnectionDelegate.h new file mode 100644 index 0000000..5884947 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/TConnectionDelegate.h @@ -0,0 +1,54 @@ +#pragma once + +#include "IConnection.h" + +namespace Socket { +struct SConnectionDelegate +{ + void* data; + bool (*fpOpen)(void*); + bool (*fpClose)(void*); + bool (*fpIsReadyToSend)(void*, size_t); + bool (*fpIsReadyToReceive)(void*, size_t); + size_t (*fpSendBuffer)(void*, const void*, size_t); + size_t (*fpReceiveBuffer)(void*, void*, size_t); + bool (*fpSendBufferBlocking)(void*, const void*, size_t); + bool (*fpReceiveBufferBlocking)(void*, void*, size_t); + bool (*fpIsConnected)(void*); + bool (*fpRelease)(void*); +}; + +template +class Socket_API TConnectionDelegate : public T +{ +public: + TConnectionDelegate(const SConnectionDelegate connectionDelegate) : m_connectionDelegate(connectionDelegate) { } + + virtual bool close() { return m_connectionDelegate.fpClose(m_connectionDelegate.data); } + + virtual bool isReadyToSend(const size_t timeOut) const { return m_connectionDelegate.fpIsReadyToSend(m_connectionDelegate.data, timeOut); } + virtual bool isReadyToReceive(const size_t timeOut) const { return m_connectionDelegate.fpIsReadyToReceive(m_connectionDelegate.data, timeOut); } + + virtual size_t sendBuffer(const void* buffer, const size_t size) { return m_connectionDelegate.fpSendBuffer(m_connectionDelegate.data, buffer, size); } + virtual size_t receiveBuffer(void* buffer, const size_t size) { return m_connectionDelegate.fpReceiveBuffer(m_connectionDelegate.data, buffer, size); } + + virtual bool sendBufferBlocking(const void* buffer, const size_t size) + { + return m_connectionDelegate.fpSendBufferBlocking(m_connectionDelegate.data, buffer, size); + } + virtual bool receiveBufferBlocking(void* buffer, const size_t bufferSize) + { + return m_connectionDelegate.fpReceiveBufferBlocking(m_connectionDelegate.data, buffer, bufferSize); + } + + virtual bool isConnected() const { return m_connectionDelegate.fpIsConnected(m_connectionDelegate.data); } + + virtual void release() { m_connectionDelegate.fpRelease(m_connectionDelegate.data); } + + virtual ~TConnectionDelegate() { } +protected: + virtual bool open() { return m_connectionDelegate.fpOpen(m_connectionDelegate.data); } + + SConnectionDelegate m_connectionDelegate; +}; +} // namespace Socket diff --git a/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/defines.h b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/defines.h new file mode 100644 index 0000000..3c89902 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/socket/include/socket/defines.h @@ -0,0 +1,28 @@ +#pragma once + +#include + +// Taken from +// - http://people.redhat.com/drepper/dsohowto.pdf +// - http://www.nedprod.com/programs/gccvisibility.html +#if defined Socket_Shared +# if defined TARGET_OS_Windows +# define Socket_API_Export __declspec(dllexport) +# define Socket_API_Import __declspec(dllimport) +# elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS +# define Socket_API_Export __attribute__((visibility("default"))) +# define Socket_API_Import __attribute__((visibility("default"))) +# else +# define Socket_API_Export +# define Socket_API_Import +# endif +#else +# define Socket_API_Export +# define Socket_API_Import +#endif + +#if defined Socket_Exports +# define Socket_API Socket_API_Export +#else +# define Socket_API Socket_API_Import +#endif diff --git a/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnection.inl b/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnection.inl new file mode 100644 index 0000000..7e50b7a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnection.inl @@ -0,0 +1,194 @@ +#pragma once +#include "IConnection.h" + +#include + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + #include + #include + #include + // #include + // #include + #include + #include + // #include + #include + +#if defined TARGET_OS_MacOS + #define Socket_SendFlags 0 + #define Socket_ReceiveFlags 0 +#else + #define Socket_SendFlags MSG_NOSIGNAL + #define Socket_ReceiveFlags MSG_NOSIGNAL +#endif +#elif defined TARGET_OS_Windows +#include +#include + +#define Socket_SendFlags 0 +#define Socket_ReceiveFlags 0 +#else + +#endif + +namespace Socket { +static bool FD_ISSET_PROXY(const int fd, fd_set* set) { return FD_ISSET(fd, set) ? true : false; } + +template +class TConnection : public T +{ +public: + + TConnection() : m_socket(-1) + { +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS +#elif defined TARGET_OS_Windows + const int versionHigh = 2; + const int versionLow = 0; + const WORD winsockVersion = MAKEWORD(versionHigh, versionLow); + WSADATA wsaData; + WSAStartup(winsockVersion, &wsaData); +#else +#endif + } + + explicit TConnection(const int socket) : m_socket(socket) + { +#if defined TARGET_OS_Windows + const int versionHigh = 2; + const int versionLow = 0; + const WORD winsockVersion = MAKEWORD(versionHigh, versionLow); + WSADATA wsaData; + WSAStartup(winsockVersion, &wsaData); +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS +#else +#endif + } + + virtual ~TConnection() + { +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS +#elif defined TARGET_OS_Windows + WSACleanup(); +#else +#endif + } + +protected: + + virtual bool open() + { + if (isConnected()) { return false; } + + m_socket = int(socket(AF_INET, SOCK_STREAM, 0)); + if (m_socket == size_t(-1)) { return false; } + + return true; + } + +public: + + virtual bool close() + { + if (!isConnected()) { return false; } + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + ::shutdown(m_socket, SHUT_RDWR); + ::close(m_socket); +#elif defined TARGET_OS_Windows + shutdown(m_socket, SD_BOTH); + closesocket(m_socket); +#else +#endif + + m_socket = -1; + return true; + } + + virtual bool isReadyToSend(const size_t timeOut = 0) const + { + if (!isConnected()) { return false; } + + struct timeval timeVal; + timeVal.tv_sec = int(timeOut / 1000); + timeVal.tv_usec = int((timeOut - timeVal.tv_sec * 1000) * 1000); + + fd_set writeFileDesc; + FD_ZERO(&writeFileDesc); + FD_SET(m_socket, &writeFileDesc); + + if (select(int(m_socket + 1), nullptr, &writeFileDesc, nullptr, &timeVal) < 0) { return false; } + if (!FD_ISSET_PROXY(int(m_socket), &writeFileDesc)) { return false; } + return true; + } + + virtual bool isReadyToReceive(const size_t timeOut = 0) const + { + if (!isConnected()) { return false; } + + struct timeval timeVal; + timeVal.tv_sec = int(timeOut / 1000); + timeVal.tv_usec = int((timeOut - timeVal.tv_sec * 1000) * 1000); + + fd_set readFileDesc; + FD_ZERO(&readFileDesc); + FD_SET(m_socket, &readFileDesc); + + if (select(int(m_socket + 1), &readFileDesc, nullptr, nullptr, &timeVal) < 0) { return false; } + if (!(FD_ISSET_PROXY(int(m_socket), &readFileDesc))) { return false; } + return true; + } + + virtual size_t sendBuffer(const void* buffer, const size_t size) + { + if (!isConnected()) { return 0; } + const int res = send(m_socket, static_cast(buffer), int(size), Socket_SendFlags); + if (size != 0 && res <= 0) { close(); } + return res <= 0 ? 0 : size_t(res); + } + + virtual size_t receiveBuffer(void* buffer, const size_t size) + { + if (!isConnected() || !size) { return 0; } + const int res = recv(m_socket, static_cast(buffer), int(size), Socket_ReceiveFlags); + if (size != 0 && res <= 0) { close(); } + return res <= 0 ? 0 : size_t(res); + } + + virtual bool sendBufferBlocking(const void* buffer, const size_t size) + { + size_t leftBytes = size; + const char* tmpBuffer = static_cast(buffer); + do + { + leftBytes -= sendBuffer(tmpBuffer + size - leftBytes, leftBytes); + if (!isConnected()) { return false; } + } while (leftBytes != 0); + return true; + } + + virtual bool receiveBufferBlocking(void* buffer, const size_t size) + { + size_t leftBytes = size; + char* tmpBuffer = static_cast(buffer); + do + { + leftBytes -= receiveBuffer(tmpBuffer + size - leftBytes, leftBytes); + if (!isConnected()) { return false; } + } while (leftBytes != 0); + return true; + } + + virtual bool isConnected() const { return m_socket != size_t(-1); } + + virtual void release() + { + if (isConnected()) { close(); } + delete this; + } + +protected: + + size_t m_socket; +}; +} // namespace Socket diff --git a/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionBluetooth.cpp b/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionBluetooth.cpp new file mode 100644 index 0000000..9bbdfdb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionBluetooth.cpp @@ -0,0 +1,442 @@ +#include "IConnectionBluetooth.h" + +#if defined TARGET_OS_Windows +#define WIN32_LEAN_AND_MEAN +#define UNICODE +#include +#include +#include +#include +#include +#include +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + #include + #include + #include + #include + #include + + #include + #include + #include +#else + #error "Unsupported platform" +#endif + +#include +#include +#include + +namespace Socket { +class CConnectionBluetooth final : public IConnectionBluetooth +{ +public: + +#if defined TARGET_OS_Windows + CConnectionBluetooth() : m_Socket(INVALID_SOCKET) { } +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + CConnectionBluetooth() : m_LastError() { } +#endif + +#if defined TARGET_OS_Windows + bool initialize() + { + WSADATA wsaData; + + // Ask for Winsock version. + if (_WINSOCK2API_::WSAStartup(MAKEWORD(WIN_SOCKET_MAJOR_VERSION, WIN_SOCKET_MINOR_VERSION), &wsaData) != 0) + { + m_LastError = "Failed to start Winsock " + std::to_string(WIN_SOCKET_MAJOR_VERSION) + "." + std::to_string(WIN_SOCKET_MINOR_VERSION) + ": " + this-> + getLastErrorFormated(); + return false; + } + + // Confirm that the WinSock DLL supports version requested. + // Note that if the DLL supports versions greater than the version requested, in addition to the version requested, it will still return the version requested in wVersion. + if (LOBYTE(wsaData.wVersion) != WIN_SOCKET_MAJOR_VERSION || HIBYTE(wsaData.wVersion) != WIN_SOCKET_MINOR_VERSION) + { + m_LastError = "Could not find a usable version of Winsock.dll."; + _WINSOCK2API_::WSACleanup(); + return false; + } + return true; + } +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + bool initialize() { return false; } +#endif + + bool open() override { return false; } + + bool close() override + { + if (!this->isConnected()) + { + m_LastError = "Bluetooth device is not connected."; + return false; + } + +#if defined TARGET_OS_Windows + + bool isSuccess = true; + if (m_Socket != INVALID_SOCKET) + { + // shutdown the connection since no more data will be sent or received + if (_WINSOCK2API_::shutdown(m_Socket, SD_BOTH) == SOCKET_ERROR) + { + m_LastError = "Failed to shutdown the bluetooth socket:" + this->getLastErrorFormated(); + isSuccess = false; + } + + if (_WINSOCK2API_::closesocket(m_Socket) == SOCKET_ERROR) + { + m_LastError = "Failed to close the bluetooth socket:" + this->getLastErrorFormated(); + isSuccess = false; + } + + if (_WINSOCK2API_::WSACleanup() == SOCKET_ERROR) + { + m_LastError = "Failed to cleanup the bluetooth socket:" + this->getLastErrorFormated(); + isSuccess = false; + } + + m_Socket = INVALID_SOCKET; + } + + return isSuccess; + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + return false; +#endif + } + + bool isReadyToSend(const size_t /*timeOut*/) const override { return this->isConnected(); } + + bool isReadyToReceive(const size_t /*timeOut*/) const override + { + if (!this->isConnected()) { return false; } + +#if defined TARGET_OS_Windows + unsigned long nPendingBytes = 0; + + if (_WINSOCK2API_::ioctlsocket(m_Socket, FIONREAD, &nPendingBytes) == SOCKET_ERROR) + { + //m_LastError = "Failed to get the pending bytes count: " + this->getLastErrorFormated(); + return false; + } + + return nPendingBytes != 0; + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + return false; +#endif + } + + size_t getPendingByteCount() override + { + if (!this->isConnected()) + { + m_LastError = "Bluetooth device not connected."; + return 0; + } + +#if defined TARGET_OS_Windows + + unsigned long nPendingBytes = 0; + + if (_WINSOCK2API_::ioctlsocket(m_Socket, FIONREAD, &nPendingBytes) == SOCKET_ERROR) + { + m_LastError = "Failed to get the pending bytes count: " + this->getLastErrorFormated(); + return 0; + } + + return nPendingBytes; + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + return 0; +#endif + } + + size_t sendBuffer(const void* buffer, const size_t size) override + { + if (!this->isConnected()) + { + m_LastError = "Bluetooth device is not connected."; + return 0; + } + +#if defined TARGET_OS_Windows + + const int nBytesSent = _WINSOCK2API_::send(m_Socket, reinterpret_cast(buffer), int(size), 0); + + if (nBytesSent == SOCKET_ERROR) + { + m_LastError = "Failed to write on the bluetooth port: " + getLastErrorFormated(); + this->close(); + return 0; + } + + return size_t(nBytesSent); + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + return 0; +#endif + } + + size_t receiveBuffer(void* buffer, const size_t size) override + { + if (!this->isConnected()) + { + m_LastError = "Bluetooth device is not connected."; + return 0; + } + +#if defined TARGET_OS_Windows + + + const int nBytesReceived = _WINSOCK2API_::recv(m_Socket, static_cast(buffer), int(size), 0); + + if (nBytesReceived == SOCKET_ERROR) + { + m_LastError = "Failed to receive data from bluetooth: " + getLastErrorFormated(); + + this->close(); + return 0; + } + + return size_t(nBytesReceived); + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + return 0; +#endif + } + + bool sendBufferBlocking(const void* buffer, const size_t size) override + { + if (!this->isConnected()) + { + m_LastError = "Bluetooth device is not connected."; + return false; + } + + const char* p = reinterpret_cast(buffer); + size_t bytesLeft = size; + + while (bytesLeft != 0 && this->isConnected()) + { + bytesLeft -= this->sendBuffer(p + size - bytesLeft, bytesLeft); + + if (this->isErrorRaised()) { return false; } + } + + return bytesLeft == 0; + } + + bool receiveBufferBlocking(void* buffer, const size_t size) override + { + if (!this->isConnected()) + { + m_LastError = "Bluetooth device is not connected."; + return false; + } + + char* p = reinterpret_cast(buffer); + size_t bytesLeft = size; + + while (bytesLeft != 0 && this->isConnected()) + { + bytesLeft -= this->receiveBuffer(p + size - bytesLeft, bytesLeft); + + if (this->isErrorRaised()) { return false; } + } + + return bytesLeft == 0; + } + + bool isConnected() const override + { +#if defined TARGET_OS_Windows + + return m_Socket != INVALID_SOCKET; + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + return false; +#endif + } + + void release() override { delete this; } + + bool connect(const uint64_t u64BluetoothAddress) override + { + m_LastError.clear(); + + if (this->isConnected()) + { + m_LastError = "Bluetooth device is already connected"; + return false; + } + +#if defined TARGET_OS_Windows + + if (!this->initialize()) { return false; } + + m_Socket = _WINSOCK2API_::socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM); + + if (m_Socket == INVALID_SOCKET) + { + m_LastError = "Failed to create bluetooth socket: " + getLastErrorFormated(); + _WINSOCK2API_::WSACleanup(); + return false; + } + + SOCKADDR_BTH sockAddressBlutoothServer; + sockAddressBlutoothServer.btAddr = u64BluetoothAddress; + sockAddressBlutoothServer.addressFamily = AF_BTH; + sockAddressBlutoothServer.serviceClassId = RFCOMM_PROTOCOL_UUID; + sockAddressBlutoothServer.port = BT_PORT_ANY; + + if (_WINSOCK2API_::connect(m_Socket, reinterpret_cast(&sockAddressBlutoothServer), sizeof(SOCKADDR_BTH)) == SOCKET_ERROR) + { + m_LastError = "Failed to connect the socket to the bluetooth address [" + std::to_string(sockAddressBlutoothServer.btAddr) + "]: " + + getLastErrorFormated(); + + _WINSOCK2API_::closesocket(m_Socket); // Returned code not checked. + _WINSOCK2API_::WSACleanup(); // Returned code not checked. + + m_Socket = INVALID_SOCKET; + return false; + } + + return true; + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + return false; +#endif + } + + bool isErrorRaised() const { return !m_LastError.empty(); } + + const char* getLastError() const override { return m_LastError.c_str(); } + + static std::string getLastErrorFormated() + { +#if defined TARGET_OS_Windows + + LPTSTR text; + const DWORD errCode = GetLastError(); + + const size_t size = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | // use system message tables to retrieve error text + FORMAT_MESSAGE_ALLOCATE_BUFFER | // allocate buffer on local heap for error text + FORMAT_MESSAGE_IGNORE_INSERTS, // Important! will fail otherwise, since we're not (and CANNOT) pass insertion parameters + nullptr, // unused with FORMAT_MESSAGE_FROM_SYSTEM + errCode, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), + LPTSTR(&text), // output + 0, // minimum size for output buffer + nullptr); + + // Converts std::wstring to std::string and returns it. + const std::wstring message(text, size); + LocalFree(text); + std::wstring_convert, wchar_t> converter; + return converter.to_bytes(message); + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + return ""; +#endif + } + + void clearError() override { m_LastError.clear(); } + + bool listPairedBluetoothDevices(size_t* nPairedBluetoothDevices, char** names, uint64_t** addresses) override + { + std::vector devicesNames; + std::vector devicesAddresses; + +#if defined TARGET_OS_Windows + + HANDLE handle; + WSAQUERYSET wsaQuerySet; + + memset((void*)&wsaQuerySet, 0, sizeof(wsaQuerySet)); + wsaQuerySet.dwSize = sizeof(wsaQuerySet); + wsaQuerySet.dwNameSpace = NS_BTH; + wsaQuerySet.lpcsaBuffer = nullptr; + + if (_WINSOCK2API_::WSALookupServiceBegin(&wsaQuerySet, LUP_CONTAINERS | LUP_RETURN_NAME | LUP_RETURN_ADDR, &handle) == SOCKET_ERROR) + { + m_LastError = "Failed to start the Bluetooth lookup service: " + getLastErrorFormated(); + return false; + } + + char buffer[5000]; + const LPWSAQUERYSET wsaQuerySetW = LPWSAQUERYSET(buffer); + DWORD size = sizeof(buffer); + + memset((void*)wsaQuerySetW, 0, sizeof(WSAQUERYSET)); + wsaQuerySetW->dwSize = sizeof(WSAQUERYSET); + wsaQuerySetW->dwNameSpace = NS_BTH; + wsaQuerySetW->lpBlob = nullptr; + + bool lookup = true; + + while (lookup) + { + // Check next bluetooth device + const int res = _WINSOCK2API_::WSALookupServiceNext(handle, LUP_RETURN_NAME | LUP_RETURN_ADDR, &size, wsaQuerySetW); + + if (res == SOCKET_ERROR) + { + // If it is a "real" error, we trace it and return false. + if (_WINSOCK2API_::WSAGetLastError() != WSA_E_NO_MORE) + { + m_LastError = "Lookup service next operation failed: " + getLastErrorFormated(); + return false; + } + + // Else, it is because there is no more Bluetooth devices available. + lookup = false; + break; + } + // Get bluetooth MAC address and name + devicesAddresses.push_back(reinterpret_cast(wsaQuerySetW->lpcsaBuffer->RemoteAddr.lpSockaddr)->btAddr); + + std::wstring_convert, wchar_t> converterX; + devicesNames.push_back(converterX.to_bytes(wsaQuerySetW->lpszServiceInstanceName)); + } + + if (_WINSOCK2API_::WSALookupServiceEnd(handle) == SOCKET_ERROR) + { + m_LastError = "Failed to stop the Bluetooth lookup service: " + getLastErrorFormated(); + return false; + } + + *nPairedBluetoothDevices = devicesAddresses.size(); + names = new char*[*nPairedBluetoothDevices]; + + for (size_t i = 0; i < *nPairedBluetoothDevices; ++i) + { + names[i] = new char[devicesNames[i].size() + 1]; + std::strcpy(names[i], devicesNames[i].c_str()); + } + + addresses = new uint64_t*[*nPairedBluetoothDevices]; + + return true; + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + return false; +#endif + } + + std::string m_LastError; + +#if defined TARGET_OS_Windows + + SOCKET m_Socket; + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + +#endif +}; + +IConnectionBluetooth* createConnectionBluetooth() { return new CConnectionBluetooth(); } +} // namespace Socket diff --git a/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionClient.cpp b/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionClient.cpp new file mode 100644 index 0000000..cd52140 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionClient.cpp @@ -0,0 +1,171 @@ +#include "IConnection.h" +#include "IConnectionClient.h" +#include "IConnection.inl" + +#include +#include +#include +#include + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + #include + #include + #include + #include +#elif defined TARGET_OS_Windows +#include + +#include +#else +#endif + +namespace Socket { +class CConnectionClient final : public TConnection +{ +public: + + bool connect(const char* sServerName, const size_t serverPort, const size_t timeOut) override + { + if (!open()) { return false; } + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + long value; + // Sets non blocking + if((value = ::fcntl(m_socket, F_GETFL, nullptr)) < 0) + { + close(); + return false; + } + value|=O_NONBLOCK; + if(::fcntl(m_socket, F_SETFL, value)<0) + { + close(); + return false; + } + + // Looks up host name + struct hostent* serverHostEntry = gethostbyname(sServerName); + if(!serverHostEntry) + { + close(); + return false; + } + +#elif defined TARGET_OS_Windows + + // Sets non blocking + unsigned long mode = 1; + ioctlsocket(m_socket, FIONBIO, &mode); + + struct addrinfo hints; + ZeroMemory(&hints, sizeof(hints)); + hints.ai_family = AF_INET; + PADDRINFOA addr; + if (getaddrinfo(sServerName, nullptr, &hints, &addr) != 0) + { + close(); + return false; + } + const auto sockaddrIPV4 = reinterpret_cast(addr->ai_addr); + +#endif + + // Connects + struct sockaddr_in serverAddress; + memset(&serverAddress, 0, sizeof(serverAddress)); + serverAddress.sin_family = AF_INET; + serverAddress.sin_port = htons(static_cast(serverPort)); +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + serverAddress.sin_addr=*((struct in_addr*)serverHostEntry->h_addr); +#elif defined TARGET_OS_Windows + serverAddress.sin_addr = sockaddrIPV4->sin_addr; + freeaddrinfo(addr); +#endif + errno = 0; + if (::connect(m_socket, reinterpret_cast(&serverAddress), sizeof(struct sockaddr_in)) < 0) + { + bool inProgress; + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + inProgress = (errno==EINPROGRESS); +#elif defined TARGET_OS_Windows + inProgress = (WSAGetLastError() == WSAEINPROGRESS || WSAGetLastError() == WSAEWOULDBLOCK); +#else + inProgress = false; +#endif + + if (inProgress) + { + const int t = (timeOut == 0xffffffff) ? 125 : int(timeOut); + // Performs time out + + struct timeval timeVal; + timeVal.tv_sec = (t / 1000); + timeVal.tv_usec = ((t - timeVal.tv_sec * 1000) * 1000); + + fd_set writeFileDesc; + FD_ZERO(&writeFileDesc); + FD_SET(m_socket, &writeFileDesc); + + if (select(int(m_socket + 1), nullptr, &writeFileDesc, nullptr, &timeVal) < 0) + { + close(); + return false; + } + if (!FD_ISSET_PROXY(int(m_socket), &writeFileDesc)) + { + close(); + return false; + } + + // Checks error status + int option = 0; +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + socklen_t length = sizeof(option); + ::getsockopt(m_socket, SOL_SOCKET, SO_ERROR, (void*)(&option), &length); +#elif defined TARGET_OS_Windows + int length = sizeof(option); + getsockopt(m_socket, SOL_SOCKET, SO_ERROR, reinterpret_cast(&option), &length); +#endif + if (option != 0) + { + close(); + return false; + } + } + else + { + close(); + return false; + } + } + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + + // Sets back to blocking + if((value=::fcntl(m_socket, F_GETFL, nullptr))<0) + { + close(); + return false; + } + value&=~O_NONBLOCK; + if(::fcntl(m_socket, F_SETFL, value)<0) + { + close(); + return false; + } + +#elif defined TARGET_OS_Windows + + // Sets back to blocking + mode = 0; + ioctlsocket(m_socket, FIONBIO, &mode); + +#endif + + return true; + } +}; + +IConnectionClient* createConnectionClient() { return new CConnectionClient(); } +} // namespace Socket diff --git a/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionParallel.cpp b/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionParallel.cpp new file mode 100644 index 0000000..3ecce99 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionParallel.cpp @@ -0,0 +1,261 @@ +#include "IConnectionParallel.h" + +#if defined TARGET_OS_Windows +#define WIN32_LEAN_AND_MEAN +#include +#include +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS +#include +#include +#include +#include +#include +#include +#else +#error "Unsupported platform" +#endif + +#if defined TARGET_OS_Linux && !defined TARGET_OS_Android +#include +#include +#endif + +#include + +namespace Socket { +class CConnectionParallel final : public IConnectionParallel +{ +protected: + unsigned short m_portNumber; + std::string m_lastError; +public: + + CConnectionParallel() + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + :m_file(0) +#endif + { +#if defined TARGET_OS_Windows + + m_portNumber = 0; + m_port = LoadLibrary(TEXT("TVicPort.dll")); + + if (m_port != nullptr) + { + m_isDriverOpened = port_is_driver_opened_t(GetProcAddress(m_port, "IsDriverOpened")); + m_portOpen = port_open_t(GetProcAddress(m_port, "OpenTVicPort")); + m_portClose = port_close_t(GetProcAddress(m_port, "CloseTVicPort")); + m_portWrite = port_write_t(GetProcAddress(m_port, "WritePort")); + + if (!m_isDriverOpened || !m_portOpen || !m_portClose || !m_portWrite) + { + m_lastError = "Cannot load function from TVicPort.dll: " + this->getLastErrorFormated(); + this->release(); + } + } + else { m_lastError = "Cannot found or open TVicPort.dll: " + this->getLastErrorFormated(); } +#endif + } + + bool open() override + { + // Should never be used + return false; + } + + bool close() override + { +#if defined TARGET_OS_Windows + + if (m_port != nullptr) + { + if (m_isDriverOpened()) + { + m_portNumber = 0; + m_portClose(); + return true; + } + m_lastError = "Cannot close the TVicPort library because it is not opened."; + return false; + } + return false; + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + + return false; + + /*if (ioctl(fd, PPRELEASE) < 0) { return false; } + + if (close(m_file) < 0) { return false; } + else + { + m_file = -1; + }*/ +#endif + } + + bool isReadyToSend(const size_t /*timeOut*/ = 0) const override { return this->isConnected(); } + bool isReadyToReceive(const size_t /*timeOut*/ = 0) const override { return this->isConnected(); } + size_t getPendingByteCount() const { return (this->isConnected() ? 0 : 1); } + + size_t sendBuffer(const void* buffer, const size_t size = 8) override + { + if (!this->isConnected()) { return 0; } + +#if defined TARGET_OS_Windows + const uint8_t value = *(static_cast(buffer)); + + m_portWrite(m_portNumber, value); + return size; + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + + return 0; + + /*if (ioctl(m_file, PPWDATA, &value) < 0) { return size; }*/ + +#endif + } + + size_t receiveBuffer(void* /*buffer*/, const size_t /*size*/ = 8) override + { + if (!this->isConnected()) { return 0; } + +#if defined TARGET_OS_Windows + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + + /* + unsigned char valin; + int dirin=1; + int dirout=0; + + if (ioctl (fd, PPDATADIR, &dirin) < 0) { return 0; } + if (ioctl(fd, PPRDATA, &valin) < 0) { return 0; } + + int res = ::read(m_file, buffer, size); + if(res < 0) + { + this->close(); + return 0; + } + + return res; + */ + +#endif + return 0; + } + + bool sendBufferBlocking(const void* buffer, const size_t size) override + { + const char* p = reinterpret_cast(buffer); + size_t bytesLeft = size; + + while (bytesLeft != 0 && this->isConnected()) { bytesLeft -= this->sendBuffer(p + size - bytesLeft, bytesLeft); } + + return this->isConnected(); + } + + bool receiveBufferBlocking(void* buffer, const size_t size) override + { + char* p = reinterpret_cast(buffer); + size_t bytesLeft = size; + + while (bytesLeft != 0 && this->isConnected()) { bytesLeft -= this->receiveBuffer(p + size - bytesLeft, bytesLeft); } + + return this->isConnected(); + } + +#if defined TARGET_OS_Windows + bool isConnected() const override { return m_portNumber != 0; } +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + bool isConnected() const override { return m_file != 0; } +#endif + + void release() override + { +#if defined TARGET_OS_Windows + if (m_port != nullptr && !FreeLibrary(m_port)) { m_lastError = getLastErrorFormated(); } +#endif + delete this; + } + + bool connect(const unsigned short portNumber) override + { + if (this->isConnected()) { return false; } + +#if defined TARGET_OS_Windows + if (m_port != nullptr) + { + if (m_portOpen()) + { + m_lastError = "No error"; + m_portNumber = portNumber; + return true; + } + m_lastError = "Cannot open the TVic library"; + m_portNumber = 0; + return false; + } + m_lastError = "TVicPort library is not loaded."; + return false; + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + + return false; + + /* + std::string url = "/dev/parport" + std::to_string(portNumber); + if ((m_file = open(url.c_str() , O_RDWR)) < 0) + { + this->close(); + return false; + } + else + { + if (ioctl(m_file, PPCLAIM) < 0) + { + this->close(); + return false; + } + } + */ + +#endif + } + + std::string getLastError() override { return m_lastError; } + + std::string getLastErrorFormated() + { +#if defined TARGET_OS_Windows + + LPTSTR errorText; + const DWORD error = GetLastError(); + + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM // use system message tables to retrieve error text + | FORMAT_MESSAGE_ALLOCATE_BUFFER // allocate buffer on local heap for error text + | FORMAT_MESSAGE_IGNORE_INSERTS, // Important! will fail otherwise, since we're not (and CANNOT) pass insertion parameters + nullptr, // unused with FORMAT_MESSAGE_FROM_SYSTEM + error, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + LPTSTR(&errorText), // output + 0, // minimum size for output buffer + nullptr); // arguments - see note + + return errorText + std::to_string(static_cast(error)); + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + return "Not implemented."; +#endif + } + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + int m_file; +#endif +}; + +IConnectionParallel* createConnectionParallel() { return new CConnectionParallel(); } +} // namespace Socket diff --git a/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionSerial.cpp b/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionSerial.cpp new file mode 100755 index 0000000..deb5332 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionSerial.cpp @@ -0,0 +1,475 @@ +#include "IConnectionSerial.h" + +#if defined TARGET_OS_Windows +#define WIN32_LEAN_AND_MEAN +#include +#include +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS +#include +#include +#include +#include +#include + +#include +#include +#include +#else +#error "Unsupported platform" +#endif + +#include +#include + +#if defined TARGET_OS_Linux +// Good resources at http://www.tldp.org/HOWTO/html_single/Serial-HOWTO/ +#endif + +namespace Socket { +class CConnectionSerial final : public IConnectionSerial +{ +public: + +#if defined TARGET_OS_Windows + CConnectionSerial() : m_file(nullptr) { } +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + CConnectionSerial() : m_file(0) { } +#endif + + + bool open() override { return false; } // Should never be used + + bool close() override + { +#if defined TARGET_OS_Windows + + if (m_file != nullptr) + { + if (!CloseHandle(m_file)) + { + m_LastError = "Failed to close the serial port:" + this->getLastErrorFormated(); + m_file = nullptr; + return false; + } + + m_file = nullptr; + } + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + + if(m_file != -1) + { + ::close(m_file); + m_file=-1; + } + +#endif + + return true; + } + + +#if defined TARGET_OS_Windows + + bool isReadyToSend(const size_t /*timeOut*/) const override + { + if (!this->isConnected()) { return false; } + return true; + } +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + + bool isReadyToSend(const size_t timeOut) const override + { + if (!this->isConnected()) { return false; } + fd_set fileDescSet; + struct timeval time; + time.tv_sec = timeOut/1000; + time.tv_usec = (timeOut%1000)*1000; + + FD_ZERO(&fileDescSet); + FD_SET(m_file, &fileDescSet); + + if(!::select(m_file + 1, nullptr, &fileDescSet, nullptr, &time)) { return false; } + + if(FD_ISSET(m_file, &fileDescSet)) { return true; } + return false; + } + +#endif + +#if defined TARGET_OS_Windows + bool isReadyToReceive(const size_t /*timeOut*/) const override + { + if (!this->isConnected()) { return false; } + struct _COMSTAT status; + DWORD state; + + if (ClearCommError(m_file, &state, &status) != 0) { return status.cbInQue != 0; } + return false; + } +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + bool isReadyToReceive(const size_t timeOut) const override + { + if (!this->isConnected()) { return false; } + fd_set fileDescSet; + struct timeval time; + time.tv_sec=timeOut/1000; + time.tv_usec=(timeOut%1000)*1000; + + FD_ZERO(&fileDescSet); + FD_SET(m_file, &fileDescSet); + + if(!::select(m_file+1, &fileDescSet, nullptr, nullptr, &time)) { return false; } + + if(FD_ISSET(m_file, &fileDescSet)) { return true; } + return false; + } +#endif + + size_t getPendingByteCount() override + { + if (!this->isConnected()) + { + m_LastError = "Serial port not connected."; + return 0; + } + +#if defined TARGET_OS_Windows + + struct _COMSTAT status; + DWORD state; + + if (ClearCommError(m_file, &state, &status) == 0) + { + m_LastError = "Failed to clear the serial port communication error: " + this->getLastErrorFormated(); + return 0; + } + return status.cbInQue; + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + + int byteCount=0; + if(-1 == ::ioctl(m_file, FIONREAD, &byteCount)) + { + m_LastError = "Failed to querry pending bytes in ioctl"; + return 0; + } + return byteCount; + +#endif + } + + bool flush() override + { + if (!this->isConnected()) + { + m_LastError = "Serial port not connected."; + return false; + } + +#if defined TARGET_OS_Windows + if (!FlushFileBuffers(m_file)) + { + m_LastError = "Failed to flush serial port buffer: " + this->getLastErrorFormated(); + return false; + } + return true; +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + if(-1 == ::tcdrain(m_file)) + { + m_LastError = "Could not flush connection in tcdrain"; + return false; + } + return true; +#else + return false; +#endif + } + + size_t sendBuffer(const void* buffer, const size_t size) override + { + if (!this->isConnected()) + { + m_LastError = "Serial port not connected."; + return 0; + } + +#if defined TARGET_OS_Windows + DWORD written = 0; + + if (!WriteFile(m_file, buffer, DWORD(size), &written, nullptr)) + { + m_LastError = "Failed to write on serial port: " + this->getLastErrorFormated(); + this->close(); + return 0; + } + + if (written == 0) + { + m_LastError = "Serial port timeout when trying to write."; + this->close(); + return 0; + } + + return written; + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + + int res = ::write(m_file, buffer, size); + if(res < 0) + { + m_LastError = "Could not write on connection"; + this->close(); + return 0; + } + + return res; +#else + return 0; +#endif + } + + size_t receiveBuffer(void* buffer, const size_t size) override + { + if (!this->isConnected()) + { + m_LastError = "Serial port not connected."; + return 0; + } + +#if defined TARGET_OS_Windows + + DWORD read = 0; + + if (!ReadFile(m_file, buffer, DWORD(size), &read, nullptr)) + { + m_LastError = "Failed to read on serial port: " + this->getLastErrorFormated(); + this->close(); + return 0; + } + + if (read == 0) + { + m_LastError = "Serial port timeout when trying to read."; + this->close(); + return 0; + } + + return read; + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + + int res = ::read(m_file, buffer, size); + if (res < 0) + { + m_LastError = "Could not read from connection"; + this->close(); + return 0; + } + + return res; +#else + return 0; +#endif + } + + bool sendBufferBlocking(const void* buffer, const size_t size) override + { + const char* p = reinterpret_cast(buffer); + size_t bytesLeft = size; + + while (bytesLeft != 0 && this->isConnected()) + { + bytesLeft -= this->sendBuffer(p + size - bytesLeft, bytesLeft); + if (this->isErrorRaised()) { return false; } + } + + return bytesLeft == 0; + } + + bool receiveBufferBlocking(void* buffer, const size_t size) override + { + char* p = reinterpret_cast(buffer); + size_t bytesLeft = size; + + while (bytesLeft != 0 && this->isConnected()) + { + bytesLeft -= this->receiveBuffer(p + size - bytesLeft, bytesLeft); + if (this->isErrorRaised()) { return false; } + } + return bytesLeft == 0; + } + + bool isConnected() const override + { +#if defined TARGET_OS_Windows + return ((m_file != nullptr) && (m_file != INVALID_HANDLE_VALUE)); +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + return m_file != 0; +#endif + } + + void release() override { delete this; } + + bool connect(const char* sURL, const size_t baudrate) override + { + m_LastError.clear(); + + if (this->isConnected()) + { + m_LastError = "Serial port already connected"; + return false; + } + +#if defined TARGET_OS_Windows + + m_file = ::CreateFile(sURL, GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); + + if (m_file == INVALID_HANDLE_VALUE || m_file == nullptr) + { + m_LastError = "Failed to open serial port: " + this->getLastErrorFormated(); + m_file = nullptr; + return false; + } + + DCB dcb = { 0 }; + + if (!GetCommState(m_file, &dcb)) + { + m_LastError = "Failed to get communication state: " + this->getLastErrorFormated(); + this->close(); + return false; + } + + dcb.DCBlength = sizeof(dcb); + dcb.BaudRate = DWORD(baudrate); + dcb.ByteSize = 8; + dcb.Parity = NOPARITY; + dcb.StopBits = ONESTOPBIT; + + ClearCommError(m_file, nullptr, nullptr); + + if (!SetCommState(m_file, &dcb)) + { + m_LastError = "Could not set communication state: " + this->getLastErrorFormated(); + this->close(); + return false; + } + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + + /* $$$ BAUD RATE PARAMETER IS NOT CONSIDERED ON LINUX, MIGHT BE NECESSARY TO CHANGE THIS $$$ */ + assert(baudrate == 230400); + if ((m_file = ::open(sURL, O_RDWR)) == -1) + { + m_LastError = "Failed to open serial port."; + return false; + } + + struct termios terminalAtt; + if(::tcgetattr(m_file, &terminalAtt)!=0) + { + m_LastError = "Could not get terminal attributes in tcgetattr"; + this->close(); + return false; + } + + terminalAtt.c_cflag = B230400 | CS8 | CLOCAL | CREAD; + terminalAtt.c_iflag = 0; + terminalAtt.c_oflag = OPOST | ONLCR; + terminalAtt.c_lflag = 0; + + if (::tcsetattr(m_file, TCSAFLUSH, &terminalAtt) != 0) + { + m_LastError = "Could not set terminal attributes in tcgetattr"; + this->close(); + return false; + } +#endif + return true; + } + + bool setTimeouts(const size_t decisecondsTimeout) override + { + if (!this->isConnected()) { return false; } + +#if defined TARGET_OS_Windows + + COMMTIMEOUTS timeouts; + + if (!GetCommTimeouts(m_file, &timeouts)) + { + m_LastError = "Could not get communication timeouts: " + this->getLastErrorFormated(); + this->close(); + return false; + } + + timeouts.ReadTotalTimeoutConstant = decisecondsTimeout * 100; // Deciseconds to milliseconds + timeouts.WriteTotalTimeoutConstant = decisecondsTimeout * 100; // Deciseconds to milliseconds + + if (!SetCommTimeouts(m_file, &timeouts)) + { + m_LastError = "Could not set communication timeouts: " + this->getLastErrorFormated(); + this->close(); + return false; + } + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + + struct termios terminalAtt; + if(::tcgetattr(m_file, &terminalAtt)!=0) + { + m_LastError = "Could not get terminal attributes in tcgetattr"; + this->close(); + return false; + } + + terminalAtt.c_cc[VTIME] = decisecondsTimeout; + + if (::tcsetattr(m_file, TCSAFLUSH, &terminalAtt) != 0) + { + m_LastError = "Could not set terminal attributes in tcgetattr"; + this->close(); + return false; + } + +#endif + return true; + } + + const char* getLastError() override { return m_LastError.c_str(); } + + static std::string getLastErrorFormated() + { +#if defined TARGET_OS_Windows + LPTSTR errorText; + const DWORD error = GetLastError(); + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | // use system message tables to retrieve error text + FORMAT_MESSAGE_ALLOCATE_BUFFER | // allocate buffer on local heap for error text + FORMAT_MESSAGE_IGNORE_INSERTS, // Important! will fail otherwise, since we're not (and CANNOT) pass insertion parameters + nullptr, // unused with FORMAT_MESSAGE_FROM_SYSTEM + error, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + LPTSTR(&errorText), // output + 0, // minimum size for output buffer + nullptr); // arguments - see note + return errorText; +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + return ""; // TODO +#endif + } + + bool isErrorRaised() override { return !m_LastError.empty(); } + void clearError() override { m_LastError.clear(); } + + std::string m_LastError; + +#if defined TARGET_OS_Windows + void* m_file; +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + int m_file; +#endif +}; + +IConnectionSerial* createConnectionSerial() { return new CConnectionSerial(); } +} // namespace Socket diff --git a/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionSerialDelegate.cpp b/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionSerialDelegate.cpp new file mode 100644 index 0000000..dfd9b75 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionSerialDelegate.cpp @@ -0,0 +1,36 @@ +#include "IConnectionSerialDelegate.h" + +namespace Socket { +class CConnectionSerialDelegate final : public IConnectionSerialDelegate +{ +public: + explicit CConnectionSerialDelegate(const SConnectionSerialDelegate connectionSerialDelegate) : IConnectionSerialDelegate(connectionSerialDelegate) + { + m_connectionSerialDelegate = connectionSerialDelegate; + } + + ~CConnectionSerialDelegate() override { } + + bool connect(const char* url, const size_t baudRate) override + { + return m_connectionSerialDelegate.fpConnect(m_connectionSerialDelegate.connectionDelegate.data, url, baudRate); + } + + size_t getPendingByteCount() override { return m_connectionSerialDelegate.fpGetPendingByteCount(m_connectionSerialDelegate.connectionDelegate.data); } + + bool flush() override { return m_connectionSerialDelegate.fpFlush(m_connectionSerialDelegate.connectionDelegate.data); } + + const char* getLastError() override { return m_connectionSerialDelegate.fpGetLastError(m_connectionSerialDelegate.connectionDelegate.data); } + + bool isErrorRaised() + override { return false; } // return m_connectionSerialDelegate.fpIsErrorRaised(m_connectionSerialDelegate.connectionDelegate.data); + void clearError() override { } // return m_connectionSerialDelegate.fpClearError(m_connectionSerialDelegate.connectionDelegate.data); + bool setTimeouts(const size_t /*timeout*/) + override { return true; } // return m_connectionSerialDelegate.fpSetTimeouts(m_connectionSerialDelegate.connectionDelegate.data, decisecondsTimeout); +}; + +IConnectionSerialDelegate* createConnectionSerialDelegate(const SConnectionSerialDelegate connectionSerialDelegate) +{ + return new CConnectionSerialDelegate(connectionSerialDelegate); +} +} // namespace Socket diff --git a/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionServer.cpp b/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionServer.cpp new file mode 100644 index 0000000..443c9e6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/socket/src/IConnectionServer.cpp @@ -0,0 +1,112 @@ +#include "IConnection.h" +#include "IConnectionServer.h" +#include "IConnection.inl" + +#include +#include + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + #include + #include + #include + #include +#elif defined TARGET_OS_Windows +#else +#endif + +namespace Socket { +class CConnectionServer final : public TConnection +{ +public: + + bool listen(const size_t port) override + { + if (!open()) { return false; } + + int reuseAddress = 1; +#if defined TARGET_OS_Windows + setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&reuseAddress), sizeof(reuseAddress)); +#else + ::setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR, &reuseAddress, sizeof(reuseAddress)); +#endif + + struct sockaddr_in localHostAddress; + memset(&localHostAddress, 0, sizeof(localHostAddress)); + localHostAddress.sin_family = AF_INET; + localHostAddress.sin_port = htons(static_cast(port)); + localHostAddress.sin_addr.s_addr = htonl(INADDR_ANY); + + if (bind(m_socket, reinterpret_cast(&localHostAddress), sizeof(localHostAddress)) == -1) + { + /* + switch(errno) + { + case EBADF: std::cout << "EBADF" << std::endl; break; + case ENOTSOCK: std::cout << "ENOTSOCK" << std::endl; break; + case EADDRINUSE: std::cout << "EADDRINUSE" << std::endl; break; + case EINVAL: std::cout << "EINVAL" << std::endl; break; + case EROFS: std::cout << "EROFS" << std::endl; break; + case EFAULT: std::cout << "EFAULT" << std::endl; break; + case ENAMETOOLONG: std::cout << "ENAMETOOLONG" << std::endl; break; + case ENOENT: std::cout << "ENOENT" << std::endl; break; + case ENOMEM: std::cout << "ENOMEM" << std::endl; break; + case ENOTDIR: std::cout << "ENOTDIR" << std::endl; break; + case EACCES: std::cout << "EACCES" << std::endl; break; + case ELOOP: std::cout << "ELOOP" << std::endl; break; + default: std::cout << "Bind_unknown" << std::endl; + } + */ + return false; + } + + if (::listen(m_socket, 32) == -1) + { + /* + switch(errno) + { + case EADDRINUSE: std::cout << "EADDRINUSE" << std::endl; break; + case EBADF: std::cout << "EBADF" << std::endl; break; + case ENOTSOCK: std::cout << "ENOTSOCK" << std::endl; break; + case EOPNOTSUPP: std::cout << "EOPNOTSUPP" << std::endl; break; + default: std::cout << "Listen_unknown" << std::endl; + } + */ + return false; + } + + return true; + } + + IConnection* accept() override + { + struct sockaddr_in clientAddress; +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + socklen_t clientAddressSize = sizeof(clientAddress); +#elif defined TARGET_OS_Windows + int clientAddressSize = sizeof(clientAddress); +#else +#endif + const int clientSocket = int(::accept(m_socket, reinterpret_cast(&clientAddress), &clientAddressSize)); + if (clientSocket == -1) { return nullptr; } + return new TConnection(int(clientSocket)); + } + + bool getSocketPort(size_t& port) override + { + struct sockaddr_in socketInfo; + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + socklen_t socketInfoLength = sizeof(socketInfo); +#elif defined TARGET_OS_Windows + int socketInfoLength = sizeof(socketInfo); +#endif + + if (getsockname(m_socket, reinterpret_cast(&socketInfo), &socketInfoLength) == -1) { return false; } + + port = size_t(ntohs(socketInfo.sin_port)); + return true; + } +}; + +IConnectionServer* createConnectionServer() { return new CConnectionServer(); } +} // namespace Socket diff --git a/Masterarbeit/openvibe/sdk-master/modules/system/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/modules/system/CMakeLists.txt new file mode 100755 index 0000000..8c6aa79 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/system/CMakeLists.txt @@ -0,0 +1,109 @@ +PROJECT(openvibe-module-system) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +SET(SRC_FILES + include/system/defines.h + include/system/ovCChrono.h + include/system/ovCMath.h + include/system/ovCMemory.h + include/system/ovCTime.h + include/system/ovCDynamicModule.h + src/ovCChrono.cpp + src/ovCMath.cpp + src/ovCMemory.cpp + src/ovCTime.cpp + src/ovCDynamicModule.cpp + ) + +IF(WIN32) + LIST(APPEND SRC_FILES + "include/system/WindowsUtilities.h" + "src/WindowsUtilities.cpp" + ) +ENDIF() + +INCLUDE_DIRECTORIES(include) +INCLUDE("FindSourceRCProperties") + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER} + COMPILE_FLAGS "-DSystem_Shared -DSystem_Exports") + +ADD_LIBRARY(${PROJECT_NAME}-static STATIC ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME}-static PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER} + COMPILE_FLAGS "-DSystem_Static -DSystem_Exports") + +IF(UNIX) + SET_TARGET_PROPERTIES(${PROJECT_NAME}-static PROPERTIES COMPILE_FLAGS "-fPIC") +ENDIF() + +INCLUDE("FindOpenViBECommon") + +IF(WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "19.0") + INCLUDE("FindThirdPartyBoost") + OV_LINK_BOOST_LIB("system" ${OV_WIN32_BOOST_VERSION}) + OV_LINK_BOOST_LIB("thread" ${OV_WIN32_BOOST_VERSION}) + INCLUDE("FindThirdPartyBoost_Chrono") +ENDIF() + + + +# --------------------------------- +# Finds standard library winmm +# Adds library to target +# Adds include path +# --------------------------------- +IF(WIN32) + INCLUDE("OvSetWindowsSDKPath") + + FIND_LIBRARY(LIB_STANDARD_MODULE_WINMM winmm ${OV_MS_SDK_PATH}/lib) + + IF(LIB_STANDARD_MODULE_WINMM) + MESSAGE(STATUS " Found winmm...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_WINMM}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME}-static ${LIB_STANDARD_MODULE_WINMM}) + ELSE(LIB_STANDARD_MODULE_WINMM) + MESSAGE(STATUS " FAILED to find winmm...") + ENDIF(LIB_STANDARD_MODULE_WINMM) + + FIND_LIBRARY(LIB_STANDARD_MODULE_DBGHELP dbghelp ${OV_MS_SDK_PATH}/lib) + + IF(LIB_STANDARD_MODULE_DBGHELP) + MESSAGE(STATUS " Found dbghelp...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_DBGHELP}) + TARGET_LINK_LIBRARIES(${PROJECT_NAME}-static ${LIB_STANDARD_MODULE_DBGHELP}) + ELSE(LIB_STANDARD_MODULE_DBGHELP) + MESSAGE(STATUS " FAILED to find dbghelp...") + ENDIF(LIB_STANDARD_MODULE_DBGHELP) +ELSE() + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${CMAKE_DL_LIBS}) +ENDIF() + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) +INSTALL(TARGETS ${PROJECT_NAME}-static + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) +INSTALL(DIRECTORY include/ DESTINATION ${DIST_INCLUDEDIR} FILES_MATCHING PATTERN "*.h") diff --git a/Masterarbeit/openvibe/sdk-master/modules/system/include/system/WindowsUtilities.h b/Masterarbeit/openvibe/sdk-master/modules/system/include/system/WindowsUtilities.h new file mode 100644 index 0000000..925db5e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/system/include/system/WindowsUtilities.h @@ -0,0 +1,31 @@ +#pragma once + +#include "defines.h" +#if defined TARGET_OS_Windows +#include + +namespace System { +class System_API WindowsUtilities +{ +public: + // Load a library in a matter compliant with non-ascii path + // returns the eventual error code + static void* utf16CompliantLoadLibrary(const char* path, HANDLE file = nullptr, DWORD flags = LOAD_WITH_ALTERED_SEARCH_PATH); + + static BOOL utf16CompliantSetEnvironmentVariable(const char* name, const char* value); + + // Load a library in a matter compliant with non-ascii path + // returns the eventual error code + static BOOL utf16CompliantCreateProcess(char* applicationName, char* commandLine, LPSECURITY_ATTRIBUTES processAttributes, + LPSECURITY_ATTRIBUTES threadAttributes, BOOL inheritHandles, DWORD creationFlags, LPVOID environment, + char* currentDirectory, LPSTARTUPINFO startupInfo, LPPROCESS_INFORMATION processInformation); + + // Load a library in a matter compliant with non-ascii path + // returns the eventual error code + static HINSTANCE utf16CompliantShellExecute(HWND hwnd, LPCTSTR operation, LPCTSTR file, LPCTSTR parameters, LPCTSTR directory, INT nShowCmd); +private: + WindowsUtilities() = delete; +}; +} // namespace System + +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/sdk-master/modules/system/include/system/defines.h b/Masterarbeit/openvibe/sdk-master/modules/system/include/system/defines.h new file mode 100644 index 0000000..fd84d26 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/system/include/system/defines.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +#if defined System_Shared +# if defined TARGET_OS_Windows +# define System_API_Export __declspec(dllexport) +# define System_API_Import __declspec(dllimport) +# elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS +# define System_API_Export __attribute__((visibility("default"))) +# define System_API_Import __attribute__((visibility("default"))) +# else +# define System_API_Export +# define System_API_Import +# endif +#else +# define System_API_Export +# define System_API_Import +#endif + +#if defined System_Exports +# define System_API System_API_Export +#else +# define System_API System_API_Import +#endif diff --git a/Masterarbeit/openvibe/sdk-master/modules/system/include/system/ovCChrono.h b/Masterarbeit/openvibe/sdk-master/modules/system/include/system/ovCChrono.h new file mode 100644 index 0000000..9ee96c8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/system/include/system/ovCChrono.h @@ -0,0 +1,40 @@ +#pragma once + +#include "defines.h" +#include // fix Unix compatibility + +namespace System { +class System_API CChrono final +{ +public: + + CChrono() { } + ~CChrono(); + + bool reset(size_t nStep); + + bool stepIn(); + bool stepOut(); + + uint64_t getTotalStepInDuration() const; + uint64_t getTotalStepOutDuration() const; + uint64_t getAverageStepInDuration() const; + uint64_t getAverageStepOutDuration() const; + double getStepInPercentage() const; + double getStepOutPercentage() const; + + bool hasNewEstimation() const { return m_hasNewEstimation; } + +private: + + uint64_t* m_stepInTime = nullptr; + uint64_t* m_stepOutTime = nullptr; + size_t m_nStep = 0; + size_t m_stepIdx = 0; + bool m_isInStep = false; + bool m_hasNewEstimation = false; + + uint64_t m_totalStepInTime = 0; + uint64_t m_totalStepOutTime = 0; +}; +} // namespace System diff --git a/Masterarbeit/openvibe/sdk-master/modules/system/include/system/ovCDynamicModule.h b/Masterarbeit/openvibe/sdk-master/modules/system/include/system/ovCDynamicModule.h new file mode 100644 index 0000000..4197418 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/system/include/system/ovCDynamicModule.h @@ -0,0 +1,264 @@ +#pragma once + +#include "defines.h" + +#if defined TARGET_OS_Windows +#include +#include +#elif defined TARGET_OS_Linux + #include +#elif defined TARGET_OS_MacOS + #include +#endif + +#include + +namespace System { +class CDynamicModuleSymbolLoader; // forward declare to make function declaration possible + +class System_API CDynamicModule final +{ +public: + enum ELogErrorCodes : size_t + { + LogErrorCodes_NoError = 0, + LogErrorCodes_ModuleAlreadyLoaded = 1, + LogErrorCodes_NoModuleLoaded = 2, + LogErrorCodes_FilenameEmpty = 3, + LogErrorCodes_FolderPathInvalid = 4, + LogErrorCodes_RegistryQueryFailed = 5, + LogErrorCodes_UnloadModuleFailed = 6, + LogErrorCodes_FailToLoadModule = 7, + LogErrorCodes_InvalidSymbol = 8, + LogErrorCodes_EnvironmentVariableInvalid = 9, + LogErrorCodes_ModuleNotFound = 10 + }; + + CDynamicModule(); + ~CDynamicModule(); + + /** + * \brief Load module from a path. + * + * \param modulePath + * \param symbolNameCheck Symbol to check if it is present in the module. It is optionnal and is nullptr by default. + * + * \retval true If the module loaded successfully. + * \retval false If module loading failed. + */ + bool loadFromPath(const char* modulePath, const char* symbolNameCheck = nullptr); + +#if defined TARGET_OS_Windows + /** + * \brief Load existing module that was already loaded by the process. + * + * \param modulePath The path to the module. + * \param symbolNameCheck Symbol to check if it is present in the module. It is optionnal and is nullptr by default. + * + * \retval true If the module loaded successfully. + * \retval false If module loading failed. + */ + bool loadFromExisting(const char* modulePath, const char* symbolNameCheck = nullptr); + /** + * \brief Load module from known path. Windows only. + * + * \param standardPath A CSIDL value that identifies the folder whose path is to be retrieved. + * Only real folders are valid. If a virtual folder is specified, this function fails. + * You can force creation of a folder by combining the folder's CSIDL with CSIDL_FLAG_CREATE. + * \param modulePath Path of the module to load. + * \param symbolNameCheck Symbol to check if it is present in the module. It is optional and is nullptr by default. + * + * \retval true If the module loaded successfully. + * \retval false If module loading failed. + */ + bool loadFromKnownPath(int standardPath, const char* modulePath, const char* symbolNameCheck = nullptr); + + /** + * \brief Load module from Windows environment. Windows only. + * + * \param environmentPath Environment path. + * \param modulePath Module file path. + * \param symbolNameCheck Symbol to check if it is present in the module. It is optionnal and is nullptr by default. + * + * \retval true If the module loaded successfully. + * \retval false If module loading failed. + */ + bool loadFromEnvironment(const char* environmentPath, const char* modulePath, const char* symbolNameCheck = nullptr); + + /** + * \brief Load module from the registry. Windows only. + * + * \param key Registry key. Check https://msdn.microsoft.com/en-us/library/windows/desktop/ms724836 + * \param registryPath Registry path. + * \param registryKeyName Key name. + * \param samDesired A mask that specifies the desired access rights to the key to be opened. + * The function fails if the security descriptor of the key does not permit the requested access for the calling process + * Check https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms724878 + * \param modulePath sModulePath Module path. + * \param symbolNameCheck Symbol to check if it is present in the module. It is optionnal and is nullptr by default. + * + * \retval true If the module loaded successfully. + * \retval false If module loading failed. + */ + bool loadFromRegistry(HKEY key, const char* registryPath, const char* registryKeyName, REGSAM samDesired, const char* modulePath, + const char* symbolNameCheck = nullptr); + + /** + * \brief Check the module architecture. Windows only. + * The architecture type of the computer. An image file can only be run on the specified computer or a system that emulates the specified computer. + * This member can be one of the following values. + * - x86: 0x014c + * - x64: 0x8664 + * - ia64: 0x0200 + * + * \param filePath Module file path + * \param architecture Architecture code + * + * \retval true If the module architecture is equal to the architecture parameter. + * \retval false If the module is unequal to the architecture parameter. + */ + static bool isModuleCompatible(const char* filePath, int architecture); +#endif + + // -------------------------------------- + + /** + * \brief Unload the module. If setShouldFreeModule(false) is called, the unload() has no effect. + * + * \retval true In case of success. + * \retval false In case of failure. + * + * \sa setShouldFreeModule + * \sa isLoaded + */ + bool unload(); + + /** + * \brief Check if the module is loaded. + * + * \retval true If the module is loaded. + * \retval false If no module are loaded. + * + * \sa unload + * \sa setShouldFreeModule + */ + bool isLoaded() const { return m_Handle != nullptr; } + + /** + * \brief Get the filename of the module. + * + * \return the file name of the module. + */ + const char* getFilename() const { return m_Filename; } + + /** + * \brief Should be used to avoid the warning "Missing dll" when loading acquisition server + * This can happen when the loaded library needs a second library that is not detected. + * + * \param errorMode + */ + void setDynamicModuleErrorMode(const size_t errorMode) { m_ErrorMode = errorMode; } + + /** + * \brief Set if the module should, or not, be free. By default the module will be free. + * + * \param shouldFreeModule Set to true to free the module when unload is called. False otherwise. + * + * \sa unload + */ + void setShouldFreeModule(const bool shouldFreeModule) { m_ShouldFreeModule = shouldFreeModule; } + + /** + * \brief Get the last error code. + * + * \return The error code. + */ + size_t getLastError() const; + + /** + * \brief Get the error message corresponding to the error code. + * + * \param errorCode The error code. + * + * \return the message corresponding to the error code. + */ + static const char* getErrorString(size_t errorCode); + + /** + * \brief Get the detailed error + * + * \return A string with detailed information about the last error. + */ + const char* getErrorDetails() const; + +private: + void* m_Handle = nullptr; + +#if defined TARGET_OS_Windows + char m_Filename[MAX_PATH]; +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + char m_Filename[PATH_MAX]; +#endif + + size_t m_ErrorMode = 0; + bool m_ShouldFreeModule = true; + typedef void (*symbol_t)(); + + char m_ErrorDetails[1024]; + mutable ELogErrorCodes m_ErrorCode; + + static const size_t m_ErrorModeNull = 0xffffffff; + + friend class CDynamicModuleSymbolLoader; + /** + * \brief Set the error code and details. + * + * \param errorCode Error code. + * \param details Detailed string error. + */ + void setError(ELogErrorCodes errorCode, const std::string& details = std::string()); + + /** + * \brief Get a symbol from the module. + * + * \param symbolName Symbol name. + * + * \return The symbol. + */ + symbol_t getSymbolGeneric(const char* symbolName) const; + +#ifdef TARGET_OS_Windows + /** + * \brief Get the image file headers. Windows only. + * + * \param filename The file path. + * \param headers [out] The header. + * + * \retval true In case of success. + * \retval false In case of failure. + */ + static bool getImageFileHeaders(const char* filename, IMAGE_NT_HEADERS& headers); +#endif +}; + +class CDynamicModuleSymbolLoader +{ +public: + /** + * \brief Get a symbol from the module. + * + * \param dynamicModule + * \param symbolName The symbol name. + * \param symbol [out] The symbol. + * + * \retval true If the symbol exists. + * \retval false If the symbol does not exist. + */ + template + static bool getSymbol(CDynamicModule& dynamicModule, const char* symbolName, T* symbol) + { + *symbol = reinterpret_cast(dynamicModule.getSymbolGeneric(symbolName)); + return *symbol != nullptr; + } +}; +} // namespace System diff --git a/Masterarbeit/openvibe/sdk-master/modules/system/include/system/ovCMath.h b/Masterarbeit/openvibe/sdk-master/modules/system/include/system/ovCMath.h new file mode 100644 index 0000000..fba4d23 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/system/include/system/ovCMath.h @@ -0,0 +1,24 @@ +#pragma once + +#include "defines.h" + +#include +#include // fix Unix compatibility + +namespace System { +class System_API Math +{ +public: + + static bool initializeRandomMachine(size_t randomSeed); + + static size_t randomI(); + // returns a value in [0,upperLimit( -- i.e. upperLimit not included in range + static size_t randomWithCeiling(const size_t upperLimit); + static double random0To1(); + static uint64_t random(); + +private: + Math() = delete; +}; +} // namespace System diff --git a/Masterarbeit/openvibe/sdk-master/modules/system/include/system/ovCMemory.h b/Masterarbeit/openvibe/sdk-master/modules/system/include/system/ovCMemory.h new file mode 100644 index 0000000..b23acbf --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/system/include/system/ovCMemory.h @@ -0,0 +1,52 @@ +#pragma once + +#include "defines.h" +#include // fix Unix compatibility + +namespace System { +class System_API Memory +{ +public: + + static bool hostToLittleEndian(uint16_t value, uint8_t* buffer); + static bool hostToLittleEndian(uint32_t value, uint8_t* buffer); + static bool hostToLittleEndian(uint64_t value, uint8_t* buffer); + static bool hostToLittleEndian(int16_t value, uint8_t* buffer); + static bool hostToLittleEndian(int value, uint8_t* buffer); + static bool hostToLittleEndian(int64_t value, uint8_t* buffer); + static bool hostToLittleEndian(float value, uint8_t* buffer); + static bool hostToLittleEndian(double value, uint8_t* buffer); + static bool hostToLittleEndian(long double value, uint8_t* buffer); + static bool hostToBigEndian(uint16_t value, uint8_t* buffer); + static bool hostToBigEndian(uint32_t value, uint8_t* buffer); + static bool hostToBigEndian(uint64_t value, uint8_t* buffer); + static bool hostToBigEndian(int16_t value, uint8_t* buffer); + static bool hostToBigEndian(int value, uint8_t* buffer); + static bool hostToBigEndian(int64_t value, uint8_t* buffer); + static bool hostToBigEndian(float value, uint8_t* buffer); + static bool hostToBigEndian(double value, uint8_t* buffer); + static bool hostToBigEndian(long double value, uint8_t* buffer); + + static bool littleEndianToHost(const uint8_t* buffer, uint16_t* value); + static bool littleEndianToHost(const uint8_t* buffer, uint32_t* value); + static bool littleEndianToHost(const uint8_t* buffer, uint64_t* value); + static bool littleEndianToHost(const uint8_t* buffer, int16_t* value); + static bool littleEndianToHost(const uint8_t* buffer, int* value); + static bool littleEndianToHost(const uint8_t* buffer, int64_t* value); + static bool littleEndianToHost(const uint8_t* buffer, float* value); + static bool littleEndianToHost(const uint8_t* buffer, double* value); + static bool littleEndianToHost(const uint8_t* buffer, long double* value); + static bool bigEndianToHost(const uint8_t* buffer, uint16_t* value); + static bool bigEndianToHost(const uint8_t* buffer, uint32_t* value); + static bool bigEndianToHost(const uint8_t* buffer, uint64_t* value); + static bool bigEndianToHost(const uint8_t* buffer, int16_t* value); + static bool bigEndianToHost(const uint8_t* buffer, int* value); + static bool bigEndianToHost(const uint8_t* buffer, int64_t* value); + static bool bigEndianToHost(const uint8_t* buffer, float* value); + static bool bigEndianToHost(const uint8_t* buffer, double* value); + static bool bigEndianToHost(const uint8_t* buffer, long double* value); + +private: + Memory() = delete; +}; +} // namespace System diff --git a/Masterarbeit/openvibe/sdk-master/modules/system/include/system/ovCTime.h b/Masterarbeit/openvibe/sdk-master/modules/system/include/system/ovCTime.h new file mode 100644 index 0000000..6e3fdb7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/system/include/system/ovCTime.h @@ -0,0 +1,72 @@ +#pragma once + +#include "defines.h" +#include // For Unix Compatibility + +namespace System { +/** + * \class Time + * \brief Static functions to handle time within the framework + * + */ +class System_API Time +{ +public: + + /** + * \brief Make the calling thread sleep + * \param milliSeconds : sleep duration in ms + * \return Always true + */ + static bool sleep(const size_t milliSeconds); + + /** + * \brief Make the calling thread sleep + * \param seconds : sleep duration in fixed point 32:32 seconds + * \return Always true + */ + static bool zsleep(const uint64_t seconds); + + /** + * \brief Retrieve time in ms (turn the 32:32 fixed point seconds to milliseconds). + * \return Elapsed time in ms since the first call to this function or zgetTime functions + */ + static uint32_t getTime() { return uint32_t((zgetTime() * 1000) >> 32); } + + /** + * \brief Retrieve time in fixed point 32:32 seconds + * \return Elapsed time since the first call to the zgetTime functions or getTime. + */ + static uint64_t zgetTime() { return zgetTimeRaw(true); } + + /** + * \brief Retrieve time in fixed point 32:32 seconds + * \param sinceFirstCall: If sinceFirstCall is true, returns the time since the first call to the zgetTime function or getTime. + * Otherwise, returns time since epoch of the clock. + * \return Elapsed time + */ + static uint64_t zgetTimeRaw(bool sinceFirstCall = true); + + /** + * \brief Check if the internal clock used by the framework is steady + * \return True if the clock is steady, false otherwise + * \note This is a theoretical check that queries the internal + * clock implementation for available services + */ + static bool isClockSteady(); + + /** + * \brief Check if the internal clock used by the framework has + * a resolution higher than the required one + * \param milliSeconds : Expected clock resolution (period between ticks) in ms (must be non-zero value) + * \return True if the clock meets the requirements, false otherwise + * \note This is a theoretical check that queries the internal + * clock implementation for available services + */ + static bool checkResolution(const size_t milliSeconds); + +private: + + Time() = delete; +}; +} // namespace System diff --git a/Masterarbeit/openvibe/sdk-master/modules/system/src/WindowsUtilities.cpp b/Masterarbeit/openvibe/sdk-master/modules/system/src/WindowsUtilities.cpp new file mode 100644 index 0000000..bf5b63a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/system/src/WindowsUtilities.cpp @@ -0,0 +1,41 @@ +#include "system/WindowsUtilities.h" +#if defined TARGET_OS_Windows +#include "m_ConverterUtf8.h" +#include + +#ifndef UNICODE +#define UNICODE +#endif + +namespace System { + +// Load a library in a matter compliant with non-ascii path +// returns the eventual error code +void* WindowsUtilities::utf16CompliantLoadLibrary(const char* path, const HANDLE file, const DWORD flags) +{ + //const HMODULE hModule = ::LoadLibraryEx(path, file, flags); // LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR|LOAD_LIBRARY_DEFAULT_DIRS); + return ::LoadLibraryEx(path, file, flags); // LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR|LOAD_LIBRARY_DEFAULT_DIRS); +} + +BOOL WindowsUtilities::utf16CompliantSetEnvironmentVariable(const char* name, const char* value) { return SetEnvironmentVariable(name, value); } + +// Load a library in a matter compliant with non-ascii path +// returns the eventual error code +BOOL WindowsUtilities::utf16CompliantCreateProcess(char* applicationName, char* commandLine, LPSECURITY_ATTRIBUTES processAttributes, + LPSECURITY_ATTRIBUTES threadAttributes, const BOOL inheritHandles, const DWORD creationFlags, + LPVOID environment, char* currentDirectory, LPSTARTUPINFO startupInfo, + LPPROCESS_INFORMATION processInformation) +{ + return CreateProcess(applicationName, const_cast(commandLine), processAttributes, threadAttributes, + inheritHandles, creationFlags, environment, currentDirectory, startupInfo, processInformation); +} + +// Load a library in a matter compliant with non-ascii path +// returns the eventual error code +HINSTANCE WindowsUtilities::utf16CompliantShellExecute(HWND hwnd, LPCTSTR operation, LPCTSTR file, LPCTSTR parameters, LPCTSTR directory, const INT nShowCmd) +{ + return ShellExecute(hwnd, operation, file, parameters, directory, nShowCmd); +} + +} // namespace System +#endif // TARGET_OS_Windows diff --git a/Masterarbeit/openvibe/sdk-master/modules/system/src/ovCChrono.cpp b/Masterarbeit/openvibe/sdk-master/modules/system/src/ovCChrono.cpp new file mode 100644 index 0000000..b578254 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/system/src/ovCChrono.cpp @@ -0,0 +1,101 @@ +#include "system/ovCChrono.h" +#include "system/ovCTime.h" + +namespace System { + +CChrono::~CChrono() +{ + delete [] m_stepInTime; + delete [] m_stepOutTime; +} + +bool CChrono::reset(const size_t nStep) +{ + if (!nStep) { return false; } + + uint64_t* stepInTime = new uint64_t[nStep + 1]; + uint64_t* stepOutTime = new uint64_t[nStep + 1]; + if (!stepInTime || !stepOutTime) + { + delete [] stepInTime; + delete [] stepOutTime; + return false; + } + + for (size_t i = 0; i <= nStep; ++i) + { + stepInTime[i] = 0; + stepOutTime[i] = 0; + } + + delete [] m_stepInTime; + delete [] m_stepOutTime; + m_stepInTime = stepInTime; + m_stepOutTime = stepOutTime; + + m_nStep = nStep; + m_stepIdx = 0; + m_isInStep = false; + m_hasNewEstimation = false; + + m_totalStepInTime = 0; + m_totalStepOutTime = 0; + + return true; +} + +bool CChrono::stepIn() +{ + if (m_isInStep || !m_nStep) { return false; } + + m_isInStep = !m_isInStep; + + m_stepInTime[m_stepIdx] = Time::zgetTime(); + if (m_stepIdx == m_nStep) + { + m_totalStepInTime = 0; + m_totalStepOutTime = 0; + for (size_t i = 0; i < m_nStep; ++i) + { + m_totalStepInTime += m_stepOutTime[i] - m_stepInTime[i]; + m_totalStepOutTime += m_stepInTime[i + 1] - m_stepOutTime[i]; + } + m_stepInTime[0] = m_stepInTime[m_nStep]; + m_stepIdx = 0; + m_hasNewEstimation = true; + } + else { m_hasNewEstimation = false; } + + return true; +} + +bool CChrono::stepOut() +{ + if (!m_isInStep || !m_nStep) { return false; } + + m_isInStep = !m_isInStep; + + m_stepOutTime[m_stepIdx] = Time::zgetTime(); + m_stepIdx++; + + return true; +} + +uint64_t CChrono::getTotalStepInDuration() const { return m_totalStepInTime; } +uint64_t CChrono::getTotalStepOutDuration() const { return m_totalStepOutTime; } +uint64_t CChrono::getAverageStepInDuration() const { return m_nStep ? this->getTotalStepInDuration() / m_nStep : 0; } +uint64_t CChrono::getAverageStepOutDuration() const { return m_nStep ? this->getTotalStepOutDuration() / m_nStep : 0; } + +double CChrono::getStepInPercentage() const +{ + const uint64_t totalStepDuration = (this->getTotalStepInDuration() + this->getTotalStepOutDuration()); + return totalStepDuration ? (this->getTotalStepInDuration() * 100.0) / totalStepDuration : 0; +} + +double CChrono::getStepOutPercentage() const +{ + const uint64_t totalStepDuration = (this->getTotalStepOutDuration() + this->getTotalStepInDuration()); + return totalStepDuration ? (this->getTotalStepOutDuration() * 100.0) / totalStepDuration : 0; +} + +} // namespace System diff --git a/Masterarbeit/openvibe/sdk-master/modules/system/src/ovCDynamicModule.cpp b/Masterarbeit/openvibe/sdk-master/modules/system/src/ovCDynamicModule.cpp new file mode 100644 index 0000000..ec7db7f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/system/src/ovCDynamicModule.cpp @@ -0,0 +1,396 @@ +#include "system/ovCDynamicModule.h" + +#if defined TARGET_OS_Windows +#include // Allowed to use utf8_to_utf16 function for os that use utf16 +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + #include +#endif + +#include +#include +#include + +namespace System { + +static const std::map ERROR_MAP = +{ + { CDynamicModule::LogErrorCodes_ModuleAlreadyLoaded, "A module is already loaded." }, + { CDynamicModule::LogErrorCodes_NoModuleLoaded, "No module loaded." }, + { CDynamicModule::LogErrorCodes_FilenameEmpty, "The filename is empty." }, + { CDynamicModule::LogErrorCodes_FolderPathInvalid, "The folder path is invalid." }, + { CDynamicModule::LogErrorCodes_RegistryQueryFailed, "The registry query is invalid." }, + { CDynamicModule::LogErrorCodes_UnloadModuleFailed, "Fail to unload the module." }, + { CDynamicModule::LogErrorCodes_FailToLoadModule, "Fail to load the module." }, + { CDynamicModule::LogErrorCodes_InvalidSymbol, "The symbol is invalid." }, + { CDynamicModule::LogErrorCodes_ModuleNotFound, "Module not found." } +}; + +#if defined TARGET_OS_Windows +static std::vector split(char* str, const char* delim) +{ + char* token = strtok(str, delim); + + std::vector result; + + while (token != nullptr) + { + result.push_back(token); + token = strtok(nullptr, delim); + } + + return result; +} + +static std::string formatWindowsError(const DWORD code) +{ + LPTSTR text; + + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | // use system message tables to retrieve error text + FORMAT_MESSAGE_ALLOCATE_BUFFER | // allocate buffer on local heap for error text + FORMAT_MESSAGE_IGNORE_INSERTS, // Important! will fail otherwise, since we're not (and CANNOT) pass insertion parameters + nullptr, // unused with FORMAT_MESSAGE_FROM_SYSTEM + code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + LPTSTR(&text), // output + 0, // minimum size for output buffer + nullptr + ); // arguments - see note + + return std::string(text); +} +#endif + +const char* CDynamicModule::getErrorString(size_t errorCode) +{ + if (ERROR_MAP.count(ELogErrorCodes(errorCode)) == 0) { return "Invalid error code"; } + return ERROR_MAP.at(ELogErrorCodes(errorCode)).c_str(); +} + +const char* CDynamicModule::getErrorDetails() const { return &m_ErrorDetails[0]; } +size_t CDynamicModule::getLastError() const { return m_ErrorCode; } + +CDynamicModule::CDynamicModule() + : m_ErrorMode(m_ErrorModeNull), m_ErrorCode(LogErrorCodes_NoError) +{ + strcpy(m_ErrorDetails, ""); + strcpy(m_Filename, ""); +} + +CDynamicModule::~CDynamicModule() {} + +// -------------------------------------- + +#if defined TARGET_OS_Windows +bool CDynamicModule::loadFromExisting(const char* modulePath, const char* symbolNameCheck) +{ + if (m_Handle) + { + this->setError(LogErrorCodes_ModuleAlreadyLoaded, "Module [" + std::string(m_Filename) + "] is already loaded"); + return false; + } + + m_Handle = ::GetModuleHandle(modulePath); + + if (m_Handle == nullptr) + { + this->setError(LogErrorCodes_FailToLoadModule, "Windows error: " + formatWindowsError(GetLastError())); + return false; + } + + if (symbolNameCheck != nullptr) + { + if (GetProcAddress(HMODULE(m_Handle), symbolNameCheck) == nullptr) + { + this->unload(); + this->setError(LogErrorCodes_InvalidSymbol, "Windows error: " + formatWindowsError(GetLastError())); + return false; + } + } + + strcpy(m_Filename, modulePath); + + return true; +} +#endif + +bool CDynamicModule::loadFromPath(const char* modulePath, const char* symbolNameCheck) +{ + if (m_Handle) + { + this->setError(LogErrorCodes_ModuleAlreadyLoaded, "Module [" + std::string(m_Filename) + "] is already loaded"); + return false; + } + + // Verify empty filename + if (modulePath == nullptr || (modulePath != nullptr && modulePath[0] == '\0')) + { + this->setError(LogErrorCodes_FilenameEmpty); + return false; + } + +#if defined TARGET_OS_Windows + + if (m_ErrorMode == m_ErrorModeNull) + { + const UINT mode = SetErrorMode(UINT(m_ErrorModeNull)); + SetErrorMode(mode); + } + else { SetErrorMode(UINT(m_ErrorMode)); } + + m_Handle = WindowsUtilities::utf16CompliantLoadLibrary(modulePath, nullptr, LOAD_WITH_ALTERED_SEARCH_PATH); + + if (m_Handle == nullptr) + { + this->setError(LogErrorCodes_FailToLoadModule, "Fail to load [" + std::string(modulePath) + "]. Windows error:" + formatWindowsError(GetLastError())); + return false; + } + + if (symbolNameCheck != nullptr) + { + if (GetProcAddress(HMODULE(m_Handle), symbolNameCheck) == nullptr) + { + this->unload(); + this->setError(LogErrorCodes_InvalidSymbol, + "Symbol invalid: [" + std::string(symbolNameCheck) + "]. Windows error: " + formatWindowsError(GetLastError())); + return false; + } + } +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + m_Handle = ::dlopen(modulePath, RTLD_LAZY|RTLD_GLOBAL); + + if (m_Handle == nullptr) + { + this->setError(LogErrorCodes_FailToLoadModule); + return false; + } + + if(symbolNameCheck != nullptr) + { + if(::dlsym(m_Handle, symbolNameCheck) == nullptr) + { + char* error = ::dlerror(); + + if(error) { this->setError(LogErrorCodes_InvalidSymbol, "Error: " + std::string(error)); } + else { this->setError(LogErrorCodes_InvalidSymbol); } + + ::dlclose(m_Handle); + m_Handle = NULL; + + return false; + } + } +#endif + + strcpy(m_Filename, modulePath); + + return true; +} + +#if defined TARGET_OS_Windows +bool CDynamicModule::loadFromKnownPath(const int standardPath, const char* modulePath, const char* symbolNameCheck) +{ + if (m_Handle) + { + this->setError(LogErrorCodes_ModuleAlreadyLoaded, "Module [" + std::string(m_Filename) + "] is already loaded"); + return false; + } + + char dllPath[MAX_PATH]; + + const HRESULT result = ::SHGetFolderPath(nullptr, standardPath, nullptr, SHGFP_TYPE_CURRENT, dllPath); + + if (result != S_OK) + { + this->setError(LogErrorCodes_FolderPathInvalid, "Windows error code: " + std::to_string(result)); + return false; + } + + strcat(dllPath, "\\"); + strcat(dllPath, modulePath); + return loadFromPath(dllPath, symbolNameCheck); // Error set in the loadFromPath function +} + +bool CDynamicModule::loadFromEnvironment(const char* environmentPath, const char* modulePath, const char* symbolNameCheck) +{ + if (m_Handle) + { + this->setError(LogErrorCodes_ModuleAlreadyLoaded, "Module [" + std::string(m_Filename) + "] is already loaded"); + return false; + } + + char* str = getenv(environmentPath); + + if (str == nullptr) + { + this->setError(LogErrorCodes_EnvironmentVariableInvalid); + return false; + } + + std::vector paths = split(str, ";"); + + for (const std::string& path : paths) { if (loadFromPath((path + "\\" + modulePath).c_str(), symbolNameCheck)) { return true; } } + + this->setError(LogErrorCodes_ModuleNotFound); + return false; +} + +bool CDynamicModule::loadFromRegistry(HKEY key, const char* registryPath, const char* registryKeyName, REGSAM samDesired, const char* modulePath, + const char* symbolNameCheck) +{ + char dllPath[MAX_PATH]; + DWORD size = sizeof(dllPath); + dllPath[0] = '\0'; + + HKEY lKey = nullptr; + + LONG result = RegOpenKeyEx(key, TEXT(registryPath), NULL, samDesired, &lKey); + + if (result != ERROR_SUCCESS) + { + this->setError(LogErrorCodes_RegistryQueryFailed, "Fail to open registry key. Windows error code: " + std::to_string(result)); + RegCloseKey(lKey); + return false; + } + + result = ::RegQueryValueEx(lKey, registryKeyName, nullptr, nullptr, reinterpret_cast(dllPath), &size); + + if (result == ERROR_SUCCESS) + { + strcat(dllPath, modulePath); + return loadFromPath(dllPath, symbolNameCheck); // Error set in the loadFromPath function + } + this->setError(LogErrorCodes_RegistryQueryFailed, "Fail to query registry value. Windows error code: " + std::to_string(result)); + return false; +} + +bool CDynamicModule::isModuleCompatible(const char* filePath, const int architecture) +{ + IMAGE_NT_HEADERS headers; + if (!getImageFileHeaders(filePath, headers)) { return false; } // Error set in the getImageFileHeaders function + return headers.FileHeader.Machine == architecture; +} +#endif + +// -------------------------------------- + +bool CDynamicModule::unload() +{ + if (!m_Handle) + { + this->setError(LogErrorCodes_NoModuleLoaded); + return false; + } + + // If the flag m_shouldFreeModule, set to true per default, is set to false, + // the module is not unloaded. + // This flag was first set for Enobio3G driver which dll freezes when unloaded + if (!m_ShouldFreeModule) { return true; } + +#if defined TARGET_OS_Windows + if (::FreeModule(reinterpret_cast(m_Handle)) == 0) + { + this->setError(LogErrorCodes_UnloadModuleFailed, "Windows error code: " + formatWindowsError(GetLastError())); + return false; + } +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + if(::dlclose(m_Handle) != 0) + { + char* error = ::dlerror(); + if(error) { this->setError(LogErrorCodes_UnloadModuleFailed, "Error: " + std::string(error)); } + else { this->setError(LogErrorCodes_UnloadModuleFailed); } + return false; + } +#else +#endif + + strcpy(m_Filename, ""); + m_Handle = nullptr; + + return true; +} + +CDynamicModule::symbol_t CDynamicModule::getSymbolGeneric(const char* symbolName) const +{ + symbol_t res = nullptr; + + if (!m_Handle) + { + m_ErrorCode = LogErrorCodes_NoModuleLoaded; + return res; + } + + if (m_Handle) + { +#if defined TARGET_OS_Windows + res = symbol_t(GetProcAddress(reinterpret_cast(m_Handle), symbolName)); + + if (!res) + { + m_ErrorCode = LogErrorCodes_InvalidSymbol; + return res; + } + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS + res = (CDynamicModule::symbol_t)::dlsym(m_Handle, symbolName); + + if (!res) + { + m_ErrorCode = LogErrorCodes_InvalidSymbol; + return res; + } +#else +#endif + } + + return res; +} + +#ifdef TARGET_OS_Windows +bool CDynamicModule::getImageFileHeaders(const char* filename, IMAGE_NT_HEADERS& headers) +{ + const HANDLE fileHandle = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); + + if (fileHandle == INVALID_HANDLE_VALUE) { return false; } + + const HANDLE imageHandle = CreateFileMapping(fileHandle, nullptr, PAGE_READONLY, 0, 0, nullptr); + + if (imageHandle == nullptr) + { + CloseHandle(fileHandle); + return false; + } + + void* imagePtr = MapViewOfFile(imageHandle, FILE_MAP_READ, 0, 0, 0); + + if (imagePtr == nullptr) + { + CloseHandle(imageHandle); + CloseHandle(fileHandle); + return false; + } + + const PIMAGE_NT_HEADERS headersPtr = ImageNtHeader(imagePtr); + + if (headersPtr == nullptr) + { + UnmapViewOfFile(imagePtr); + CloseHandle(imageHandle); + CloseHandle(fileHandle); + return false; + } + + headers = *headersPtr; + + UnmapViewOfFile(imagePtr); + CloseHandle(imageHandle); + CloseHandle(fileHandle); + + return true; +} +#endif + +void CDynamicModule::setError(const ELogErrorCodes errorCode, const std::string& details) +{ + m_ErrorCode = errorCode; + strcpy(m_ErrorDetails, details.c_str()); +} +} // namespace System diff --git a/Masterarbeit/openvibe/sdk-master/modules/system/src/ovCMath.cpp b/Masterarbeit/openvibe/sdk-master/modules/system/src/ovCMath.cpp new file mode 100644 index 0000000..1d0e791 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/system/src/ovCMath.cpp @@ -0,0 +1,69 @@ +/** + * + * @fixme This class could benefit from a serious overhaul, e.g. using randomness from some established library or C11. + * + * - Here Linear Congruential Generator is re-implemented to avoid third-party dependencies messing the up the rand() state. + * This happened before when we used the global srand() / rand(). It made hard to make repeatable experiments on some + * platforms. The generated randomness from the introduced home-made class is not super but it should be sufficient for + * OpenViBE's present use-cases. + * + * Other notes + * + * - Due to generative process, values generated above L_RAND_MAX may not be dense (verify) + * - randomIWithCeiling() may not be dense either + * + */ +#include "system/ovCMath.h" +#include +#include + +namespace System { + +class RandomGenerator +{ + size_t m_nextValue = 0; + +public: + static const size_t L_RAND_MAX = 2147483647; // (2^32)/2-1 == 2147483647 (0x7FFFFFFF) + + explicit RandomGenerator(const size_t seed = 1) : m_nextValue(seed) {} + + int rand() + { + // Pretty much C99 convention and parameters for a Linear Congruential Generator + m_nextValue = (m_nextValue * 1103515245 + 12345) & L_RAND_MAX; + return int(m_nextValue); + } + + void setSeed(const size_t seed) { m_nextValue = seed; } + + size_t getSeed() const { return m_nextValue; } +}; + +// Should be only accessed via Math:: calls defined below +static RandomGenerator randomGenerator; + +bool Math::initializeRandomMachine(const size_t randomSeed) +{ + randomGenerator.setSeed(size_t(randomSeed)); + + // For safety, we install also the C++ basic random engine (it might be useg by dependencies, old code, etc) + srand(uint32_t(randomSeed)); + + return true; +} + +size_t Math::randomI() { return size_t(random()); } +size_t Math::randomWithCeiling(const size_t upperLimit) { return size_t(random0To1() * double(upperLimit)); } +double Math::random0To1() { return double(randomGenerator.rand()) / double(RandomGenerator::L_RAND_MAX); } + +uint64_t Math::random() +{ + const uint64_t r1 = randomGenerator.rand(); + const uint64_t r2 = randomGenerator.rand(); + const uint64_t r3 = randomGenerator.rand(); + const uint64_t r4 = randomGenerator.rand(); + return (r1 << 24) ^ (r2 << 16) ^ (r3 << 8) ^ (r4); +} + +} // namespace System diff --git a/Masterarbeit/openvibe/sdk-master/modules/system/src/ovCMemory.cpp b/Masterarbeit/openvibe/sdk-master/modules/system/src/ovCMemory.cpp new file mode 100644 index 0000000..4685d86 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/system/src/ovCMemory.cpp @@ -0,0 +1,169 @@ +#include "system/ovCMemory.h" + +#include + +namespace System { + +// ________________________________________________________________________________________________________________ +// +template +bool BigEndianToHost(const uint8_t* buffer, T* value) +{ + if (!buffer || !value) { return false; } + memset(value, 0, sizeof(T)); + for (size_t i = 0; i < sizeof(T); ++i) { ((uint8_t*)value)[i] = buffer[sizeof(T) - 1 - i]; } + return true; +} + +template +bool LittleEndianToHost(const uint8_t* buffer, T* value) +{ + if (!buffer || !value) { return false; } + memset(value, 0, sizeof(T)); + for (size_t i = 0; i < sizeof(T); ++i) { ((uint8_t*)value)[i] = buffer[i]; } + return true; +} + +template +bool HostToBigEndian(const T& value, uint8_t* buffer) +{ + if (!buffer) { return false; } + memset(buffer, 0, sizeof(T)); + for (size_t i = 0; i < sizeof(T); ++i) { buffer[i] = ((uint8_t*)&value)[sizeof(T) - 1 - i]; } + return true; +} + +template +bool HostToLittleEndian(const T& value, uint8_t* buffer) +{ + if (!buffer) { return false; } + for (size_t i = 0; i < sizeof(T); ++i) { buffer[i] = uint8_t((value >> (i * 8)) & 0xff); } + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool Memory::hostToLittleEndian(const uint16_t value, uint8_t* buffer) { return HostToLittleEndian(value, buffer); } +bool Memory::hostToLittleEndian(const uint32_t value, uint8_t* buffer) { return HostToLittleEndian(value, buffer); } +bool Memory::hostToLittleEndian(const uint64_t value, uint8_t* buffer) { return HostToLittleEndian(value, buffer); } +bool Memory::hostToLittleEndian(const int16_t value, uint8_t* buffer) { return HostToLittleEndian(value, buffer); } +bool Memory::hostToLittleEndian(const int value, uint8_t* buffer) { return HostToLittleEndian(value, buffer); } +bool Memory::hostToLittleEndian(const int64_t value, uint8_t* buffer) { return HostToLittleEndian(value, buffer); } + +bool Memory::hostToLittleEndian(const float value, uint8_t* buffer) +{ + uint32_t tmp; + memcpy(&tmp, &value, sizeof(tmp)); + return hostToLittleEndian(tmp, buffer); +} + +bool Memory::hostToLittleEndian(const double value, uint8_t* buffer) +{ + uint64_t tmp; + memcpy(&tmp, &value, sizeof(tmp)); + return hostToLittleEndian(tmp, buffer); +} + +bool Memory::hostToLittleEndian(const long double /*value*/, uint8_t* /*buffer*/) +{ + // $$$ TODO + return false; +} + + +// ________________________________________________________________________________________________________________ +// + +bool Memory::hostToBigEndian(const uint16_t value, uint8_t* buffer) { return HostToBigEndian(value, buffer); } +bool Memory::hostToBigEndian(const uint32_t value, uint8_t* buffer) { return HostToBigEndian(value, buffer); } +bool Memory::hostToBigEndian(const uint64_t value, uint8_t* buffer) { return HostToBigEndian(value, buffer); } +bool Memory::hostToBigEndian(const int16_t value, uint8_t* buffer) { return HostToBigEndian(value, buffer); } +bool Memory::hostToBigEndian(const int value, uint8_t* buffer) { return HostToBigEndian(value, buffer); } +bool Memory::hostToBigEndian(const int64_t value, uint8_t* buffer) { return HostToBigEndian(value, buffer); } + +bool Memory::hostToBigEndian(const float value, uint8_t* buffer) +{ + uint32_t tmp; + memcpy(&tmp, &value, sizeof(tmp)); + return hostToBigEndian(tmp, buffer); +} + +bool Memory::hostToBigEndian(const double value, uint8_t* buffer) +{ + uint64_t tmp; + memcpy(&tmp, &value, sizeof(tmp)); + return hostToBigEndian(tmp, buffer); +} + +bool Memory::hostToBigEndian(const long double /*value*/, uint8_t* /*buffer*/) +{ + // $$$ TODO + return false; +} + +// ________________________________________________________________________________________________________________ +// + +bool Memory::littleEndianToHost(const uint8_t* buffer, uint16_t* value) { return LittleEndianToHost(buffer, value); } +bool Memory::littleEndianToHost(const uint8_t* buffer, uint32_t* value) { return LittleEndianToHost(buffer, value); } +bool Memory::littleEndianToHost(const uint8_t* buffer, uint64_t* value) { return LittleEndianToHost(buffer, value); } +bool Memory::littleEndianToHost(const uint8_t* buffer, int16_t* value) { return LittleEndianToHost(buffer, value); } +bool Memory::littleEndianToHost(const uint8_t* buffer, int* value) { return LittleEndianToHost(buffer, value); } +bool Memory::littleEndianToHost(const uint8_t* buffer, int64_t* value) { return LittleEndianToHost(buffer, value); } + +bool Memory::littleEndianToHost(const uint8_t* buffer, float* value) +{ + uint32_t tmp; + const bool b = LittleEndianToHost(buffer, &tmp); + memcpy(value, &tmp, sizeof(float)); + return b; +} + +bool Memory::littleEndianToHost(const uint8_t* buffer, double* value) +{ + uint64_t tmp; + const bool b = LittleEndianToHost(buffer, &tmp); + memcpy(value, &tmp, sizeof(double)); + return b; +} + +bool Memory::littleEndianToHost(const uint8_t* /*buffer*/, long double* /*value*/) +{ + // $$$ TODO + return false; +} + +// ________________________________________________________________________________________________________________ +// + +bool Memory::bigEndianToHost(const uint8_t* buffer, uint16_t* value) { return BigEndianToHost(buffer, value); } +bool Memory::bigEndianToHost(const uint8_t* buffer, uint32_t* value) { return BigEndianToHost(buffer, value); } +bool Memory::bigEndianToHost(const uint8_t* buffer, uint64_t* value) { return BigEndianToHost(buffer, value); } +bool Memory::bigEndianToHost(const uint8_t* buffer, int16_t* value) { return BigEndianToHost(buffer, value); } +bool Memory::bigEndianToHost(const uint8_t* buffer, int* value) { return BigEndianToHost(buffer, value); } +bool Memory::bigEndianToHost(const uint8_t* buffer, int64_t* value) { return BigEndianToHost(buffer, value); } + +bool Memory::bigEndianToHost(const uint8_t* buffer, float* value) +{ + uint32_t tmp; + const bool b = BigEndianToHost(buffer, &tmp); + memcpy(value, &tmp, sizeof(float)); + return b; +} + +bool Memory::bigEndianToHost(const uint8_t* buffer, double* value) +{ + uint64_t tmp; + const bool b = BigEndianToHost(buffer, &tmp); + memcpy(value, &tmp, sizeof(double)); + return b; +} + +bool Memory::bigEndianToHost(const uint8_t* /*buffer*/, long double* /*value*/) +{ + // $$$ TODO + return false; +} + +} // namespace System diff --git a/Masterarbeit/openvibe/sdk-master/modules/system/src/ovCTime.cpp b/Masterarbeit/openvibe/sdk-master/modules/system/src/ovCTime.cpp new file mode 100644 index 0000000..a2227ac --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/system/src/ovCTime.cpp @@ -0,0 +1,92 @@ +#include "system/ovCTime.h" + +#include +#include + +// \warning On Windows, avoid "using namespace System;" here as it may cause confusion with stuff coming from windows/boost +// \note Support of C++11 steady clock: +// - From GCC 4.8.1 +// - From Visual Studio 2015 (therefore a strategy is needed to handle Visual Studio 2013 version) + +// time handling strategy selection +// \note With officialy supported compilers and required boost version +// it should never fallback in a OV_USE_SYSTEM case +#if (defined(_MSC_VER) && _MSC_VER <= 1800 && defined(TARGET_HAS_Boost_Chrono)) + +#include + +#ifdef BOOST_CHRONO_HAS_CLOCK_STEADY + +#include +#include +namespace Timelib = boost; + +#else +#error "Please use OpenViBE recommended version of Boost" +#endif // BOOST_CHRONO_HAS_CLOCK_STEADY + +#else // defined(_MSC_VER) && _MSC_VER <= 1800 && defined(TARGET_HAS_Boost_Chrono) + +#include +#include +namespace Timelib = std; + +#endif // defined(_MSC_VER) && _MSC_VER <= 1800 && defined(TARGET_HAS_Boost_Chrono) + +using internal_clock = Timelib::chrono::steady_clock; +// using internal_clock = chrono::high_resolution_clock; + +namespace System { + +bool Time::sleep(const size_t milliSeconds) +{ + Timelib::this_thread::sleep_for(Timelib::chrono::milliseconds(milliSeconds)); + return true; +} + +bool Time::zsleep(const uint64_t seconds) +{ + const uint32_t s = uint32_t(seconds >> 32); + // zero the seconds with 0xFFFFFFFF, multiply to get the rest as fixed point microsec, then grab them (now in the 32 msbs) + const uint64_t ms = ((seconds & 0xFFFFFFFFLL) * 1000000LL) >> 32; + + const Timelib::chrono::microseconds duration = Timelib::chrono::seconds(s) + Timelib::chrono::microseconds(ms); + Timelib::this_thread::sleep_for(duration); + + return true; +} + +uint64_t Time::zgetTimeRaw(const bool sinceFirstCall) +{ + static bool initialized = false; + static internal_clock::time_point start; + + if (!initialized) + { + start = internal_clock::now(); + initialized = true; + } + + const internal_clock::time_point now = internal_clock::now(); + const internal_clock::duration elapsed = (sinceFirstCall ? now - start : now.time_since_epoch()); + const Timelib::chrono::microseconds elapsedMs = Timelib::chrono::duration_cast(elapsed); + + const uint64_t microsPerSecond = 1000ULL * 1000ULL; + const uint64_t seconds = uint64_t(elapsedMs.count() / microsPerSecond); + const uint64_t fraction = uint64_t(elapsedMs.count() % microsPerSecond); + + // below in fraction part, scale [0,microsPerSecond-1] to 32bit integer range + const uint64_t res = (seconds << 32) + fraction * (0xFFFFFFFFLL / (microsPerSecond - 1)); + return res; +} + +bool Time::isClockSteady() { return internal_clock::is_steady; } + +bool Time::checkResolution(const size_t milliSeconds) +{ + assert(milliSeconds != 0); + const auto resolution = double(internal_clock::period::num) / internal_clock::period::den; + return (size_t(std::ceil(resolution * 1000)) <= milliSeconds); +} + +} // namespace System diff --git a/Masterarbeit/openvibe/sdk-master/modules/xml/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/modules/xml/CMakeLists.txt new file mode 100644 index 0000000..e05b74c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/xml/CMakeLists.txt @@ -0,0 +1,53 @@ +PROJECT(openvibe-module-xml) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl include/*.h) +INCLUDE_DIRECTORIES(include/xml) +INCLUDE("FindSourceRCProperties") + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER} + COMPILE_FLAGS "-DXML_Shared -DXML_Exports") + +ADD_LIBRARY(${PROJECT_NAME}-static STATIC ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME}-static PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${MODULES_FOLDER} + COMPILE_FLAGS "-DXML_Static -DXML_Exports") + +IF(UNIX) + SET_TARGET_PROPERTIES(${PROJECT_NAME}-static PROPERTIES COMPILE_FLAGS "-fPIC") +ENDIF(UNIX) + +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyExpat") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) +INSTALL(TARGETS ${PROJECT_NAME}-static + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY include/ DESTINATION ${DIST_INCLUDEDIR} FILES_MATCHING PATTERN "*.h") diff --git a/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/IReader.h b/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/IReader.h new file mode 100644 index 0000000..d9c1ffa --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/IReader.h @@ -0,0 +1,28 @@ +#pragma once + +#include "defines.h" +#include // fix Unix compatibility + +namespace XML { +class XML_API IReaderCallback +{ +public: + virtual ~IReaderCallback() { } + virtual void openChild(const char* name, const char** attributeName, const char** attributeValue, const size_t nAttribute) = 0; + virtual void processChildData(const char* data) = 0; + virtual void closeChild() = 0; +}; + +class XML_API IReaderCallBack : public IReaderCallback { }; + +class XML_API IReader +{ +public: + virtual bool processData(const void* buffer, const size_t size) = 0; + virtual void release() = 0; +protected: + virtual ~IReader() { } +}; + +extern XML_API IReader* createReader(IReaderCallback& callback); +} // namespace XML diff --git a/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/IWriter.h b/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/IWriter.h new file mode 100644 index 0000000..56607b0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/IWriter.h @@ -0,0 +1,28 @@ +#pragma once + +#include "defines.h" + +namespace XML { +class XML_API IWriterCallback +{ +public: + virtual ~IWriterCallback() { } + virtual void write(const char* sString) = 0; +}; + +class XML_API IWriterCallBack : public IWriterCallback { }; + +class XML_API IWriter +{ +public: + virtual bool openChild(const char* name) = 0; + virtual bool setAttribute(const char* name, const char* value) = 0; + virtual bool setChildData(const char* data) = 0; + virtual bool closeChild() = 0; + virtual void release() = 0; +protected: + virtual ~IWriter() { } +}; + +extern XML_API IWriter* createWriter(IWriterCallback& callback); +} // namespace XML diff --git a/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/IXMLHandler.h b/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/IXMLHandler.h new file mode 100644 index 0000000..c6fc25c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/IXMLHandler.h @@ -0,0 +1,60 @@ +#pragma once + +#include "defines.h" +#include "IXMLNode.h" +#include +#include // fix Unix compatibility + +namespace XML { +/** + * @class IXMLHandler + * @author Serrière Guillaume (INRIA/Loria) + * @brief This class is design to help about XML manipulation. + * @sa XML + */ +class XML_API IXMLHandler +{ +public: + /** + * @brief Release the handler. + */ + virtual void release() = 0; + + //Parsing + /** + * @brief Parse file points by sPath and return the root name of the document. + * @param path [in] : Path to the File + * @return The root node of the document, or NULL if there is an error. + */ + virtual IXMLNode* parseFile(const char* path) = 0; + + /** + * @brief Parse the string sString on uiSize caracters and return the root name of the document. + * @param str [in] : String which contains the XML + * @param size [in] : Size of the part to analyze + * @return The root node of the parse part, or NULL if there is an error. + */ + virtual IXMLNode* parseString(const char* str, const size_t& size) = 0; + + //XML extraction + /** + * @brief Write the XML corresponding to the node rNode in the file points by sPath. If the file exists + * it will be erase. + * @param node [in] : The node to write. + * @param path [in] : The path to the file. + * @return True on success, false otherwise. + */ + virtual bool writeXMLInFile(const IXMLNode& node, const char* path) const = 0; + + /** + * @brief Get the description of the last error that ocurred + * @return A string object containing the error description + */ + virtual std::string getLastErrorString() const = 0; + +protected: + virtual ~IXMLHandler() { } +}; + +extern XML_API IXMLHandler* createXMLHandler(); +} // namespace XML diff --git a/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/IXMLNode.h b/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/IXMLNode.h new file mode 100644 index 0000000..3ed25ff --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/IXMLNode.h @@ -0,0 +1,110 @@ +#pragma once + +#include "defines.h" +#include +#include // fix Unix compatibility + +namespace XML { +/** + * @class IXMLNode + * @author Serrière Guillaume (INRIA/Loria) + * @brief Symbolize a node in a XML tree structure. + * @sa XML + */ +class XML_API IXMLNode +{ +public: + virtual void release() = 0; + + virtual const char* getName() const = 0; + + //Attribute + /** + * @brief Add the attribute name with value + * value to the node. + * @param name [in] : Name of the attribute + * @param value [in] : Value of the attribute + * @return true in success, false otherwise + */ + virtual bool addAttribute(const char* name, const char* value) = 0; + + /** + * @brief Indicate if an attribute exists or not. + * @param name [in] : Name of the attribute + * @return true if attribute exists, false otherwise + */ + virtual bool hasAttribute(const char* name) const = 0; + + /** + * @brief Return the value of an attribute. + * @param name [in] : Name of the attribute + * @return Value of the attribute + */ + virtual const char* getAttribute(const char* name) const = 0; + + //PCDATA + /** + * @brief Set the PCDATA of the node. + * @param data [in] : Value of the PCDATA + */ + virtual void setPCData(const char* data) = 0; + + /** + * @brief Apppend a string to the current PCDATA of the node + * @param data [in] : Value of teh PCDATA to append + */ + virtual void appendPCData(const char* data) = 0; + + /** + * @brief Return the PCDATA of the node. + * @return Value of PCDATA + */ + virtual const char* getPCData() const = 0; + + //Child + /** + * @brief Add a node child of the + * @param node [in] : The Node that will became the new child + */ + virtual void addChild(IXMLNode* node) = 0; + + /** + * @brief Return the ith child of the node. + * @param index [in] : index of the child. + * @return The ith child of the node. + */ + virtual IXMLNode* getChild(const size_t index) const = 0; + + /** + * @brief Return the first child with the name name. + * @param name [in]] : Name of th child + * @return The first child of the node which name is name. + */ + virtual IXMLNode* getChildByName(const char* name) const = 0; + + /** + * @brief Return the amount of child the node has. + * @return Amount of child. + */ + virtual size_t getChildCount() const = 0; + + //XML generation + /** + * @brief Return a string which contains the XML of the node. The string is dynamically instantiate so + * it requires to be free. + * @param depth [in] : Amount of indentation + * @return XML string describing the node and its childs. + */ + virtual char* getXML(const size_t depth = 0) const = 0; + +protected: + virtual ~IXMLNode() {} +}; + +/** + * @brief Create a new node with the name name. The node is created dynamically and requires to be free. + * @param name [in] : Name of the node + * @return New node + */ +extern XML_API IXMLNode* createNode(const char* name); +} // namespace XML diff --git a/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/TReaderCallbackProxy.h b/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/TReaderCallbackProxy.h new file mode 100644 index 0000000..c2d82b8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/TReaderCallbackProxy.h @@ -0,0 +1,60 @@ +#pragma once + +#include "IReader.h" + +namespace XML { + +// ________________________________________________________________________________________________________________ +// + +template +class TReaderCallbackProxy1 final : public IReaderCallback +{ +public: + TReaderCallbackProxy1(TOwnerClass& ownerObject, + void (TOwnerClass::*mfpOpenChild)(const char* name, const char** attributeName, const char** attributeValue, size_t nAttribute), + void (TOwnerClass::*mfpProcessChildData)(const char* data), void (TOwnerClass::*mfpCloseChild)()) + : m_ownerObject(ownerObject), m_mfpOpenChild(mfpOpenChild), m_mfpProcessChildData(mfpProcessChildData), m_mfpCloseChild(mfpCloseChild) { } + + void openChild(const char* name, const char** attributeName, const char** attributeValue, const size_t nAttribute) override + { + if (m_mfpOpenChild) { m_ownerObject.m_mfpOpenChild(name, attributeName, attributeValue, nAttribute); } + } + + void processChildData(const char* data) override { if (m_mfpProcessChildData) { m_ownerObject.m_mfpProcessChildData(data); } } + void closeChild() override { if (m_mfpCloseChild) { m_ownerObject.m_mfpCloseChild(); } } + +protected: + TOwnerClass& m_ownerObject; + void (TOwnerClass::*m_mfpOpenChild)(const char* name, const char** attributeName, const char** attributeValue, size_t nAttribute); + void (TOwnerClass::*m_mfpProcessChildData)(const char* data); + void (TOwnerClass::*m_mfpCloseChild)(); +}; + +// ________________________________________________________________________________________________________________ +// + +template +class TReaderCallbackProxy2 final : public IReaderCallback +{ +public: + TReaderCallbackProxy2(TOwnerClass ownerObject) + : m_ownerObject(ownerObject), m_mfpOpenChild(TMfpOpenChild), m_mfpProcessChildData(TMfpProcessChildData), m_mfpCloseChild(mfpCloseChild) { } + + void openChild(const char* name, const char** attributeName, const char** attributeValue, const size_t nAttribute) override + { + if (TMfpOpenChild) { m_ownerObject.mfpOpenChild(name, attributeName, attributeValue, nAttribute); } + } + + void processChildData(const char* data) override { if (TMfpProcessChildData) { m_ownerObject.mfpProcessChildData(data); } } + void closeChild() override { if (mfpCloseChild) { m_ownerObject.mfpCloseChild(); } } + +protected: + TOwnerClass& m_ownerObject; + void (TOwnerClass::*m_mfpOpenChild)(const char* name, const char** attributeName, const char** attributeValue, size_t nAttribute); + void (TOwnerClass::*m_mfpProcessChildData)(const char* data); + void (TOwnerClass::*m_mfpCloseChild)(); +}; +} // namespace XML diff --git a/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/TWriterCallbackProxy.h b/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/TWriterCallbackProxy.h new file mode 100644 index 0000000..ccda02a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/TWriterCallbackProxy.h @@ -0,0 +1,42 @@ +#pragma once + +#include "IWriter.h" + +namespace XML { + +// ________________________________________________________________________________________________________________ +// + +template +class TWriterCallbackProxy1 final : public IWriterCallback +{ +public: + TWriterCallbackProxy1(TOwnerClass& ownerObject, void (TOwnerClass::*mfpWrite)(const char* str)) + : m_ownerObject(ownerObject), m_mfpWrite(mfpWrite) { } + + void write(const char* str) override { if (m_mfpWrite) { m_ownerObject.m_mfpWrite(str); } } + +protected: + TOwnerClass& m_ownerObject; + void (TOwnerClass::*m_mfpWrite)(const char* str); +}; + +// ________________________________________________________________________________________________________________ +// + +template +class TWriterCallbackProxy2 final : public IWriterCallback +{ +public: + TWriterCallbackProxy2(TOwnerClass ownerObject) : m_ownerObject(ownerObject), m_mfpWrite(TMfpWrite) { } + + void write(const char* str) override { if (TMfpWrite) { m_ownerObject.mfpWrite(str); } } + +protected: + TOwnerClass& m_ownerObject; + void (TOwnerClass::*m_mfpWrite)(const char* str); +}; + +// ________________________________________________________________________________________________________________ +// +} // namespace XML diff --git a/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/defines.h b/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/defines.h new file mode 100644 index 0000000..1c6ed98 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/xml/include/xml/defines.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +#if defined XML_Shared +# if defined TARGET_OS_Windows +# define XML_API_Export __declspec(dllexport) +# define XML_API_Import __declspec(dllimport) +# elif defined TARGET_OS_Linux +# define XML_API_Export __attribute__((visibility("default"))) +# define XML_API_Import __attribute__((visibility("default"))) +# else +# define XML_API_Export +# define XML_API_Import +# endif +#else +# define XML_API_Export +# define XML_API_Import +#endif + +#if defined XML_Exports +# define XML_API XML_API_Export +#else +# define XML_API XML_API_Import +#endif diff --git a/Masterarbeit/openvibe/sdk-master/modules/xml/src/IReader.cpp b/Masterarbeit/openvibe/sdk-master/modules/xml/src/IReader.cpp new file mode 100644 index 0000000..5affce5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/xml/src/IReader.cpp @@ -0,0 +1,105 @@ +#include "IReader.h" + +#include +#include +#include + +namespace XML { +class CReader final : public IReader +{ +public: + explicit CReader(IReaderCallback& callback); + bool processData(const void* buffer, const size_t size) override; + void release() override; + + void openChild(const char* name, const char** sAttributeName, const char** sAttributeValue, const size_t nAttribute); + void processChildData(const char* data); + void closeChild(); + +protected: + + IReaderCallback& m_callback; + XML_Parser m_pXMLParser; + std::string m_data; +}; + +static void XMLCALL ExpatXMLStart(void* data, const char* element, const char** attribute); +static void XMLCALL ExpatXMLEnd(void* data, const char* element); +static void XMLCALL ExpatXMLData(void* data, const char* value, int length); + +CReader::CReader(IReaderCallback& callback) : m_callback(callback), m_pXMLParser(nullptr) +{ + m_pXMLParser = XML_ParserCreate(nullptr); + XML_SetElementHandler(m_pXMLParser, ExpatXMLStart, ExpatXMLEnd); + XML_SetCharacterDataHandler(m_pXMLParser, ExpatXMLData); + XML_SetUserData(m_pXMLParser, this); +} + +bool CReader::processData(const void* buffer, const size_t size) +{ + // $$$ TODO take 64bits size into consideration + const XML_Status status = XML_Parse(m_pXMLParser, static_cast(buffer), static_cast(size), false); + if (status != XML_STATUS_OK) + { + const XML_Error error = XML_GetErrorCode(m_pXMLParser); + // Although printf() is not too elegant, this component has no context to use e.g. LogManager -> printf() is better than a silent fail. + std::cout << "processData(): expat error " << error << " on the line " << XML_GetCurrentLineNumber(m_pXMLParser) << " of the input .xml\n"; + } + + return (status == XML_STATUS_OK); +} + +void CReader::release() +{ + XML_ParserFree(m_pXMLParser); + delete this; +} + +void CReader::openChild(const char* name, const char** sAttributeName, const char** sAttributeValue, const size_t nAttribute) +{ + m_callback.openChild(name, sAttributeName, sAttributeValue, nAttribute); + m_data = ""; +} + +void CReader::processChildData(const char* data) { m_data += data; } + +void CReader::closeChild() +{ + if (m_data.size() != 0) { m_callback.processChildData(m_data.c_str()); } + m_data = ""; + m_callback.closeChild(); +} + +XML_API IReader* createReader(IReaderCallback& callback) { return new CReader(callback); } + +static void XMLCALL ExpatXMLStart(void* data, const char* element, const char** attribute) +{ + size_t nAttribute = 0; + while (attribute[nAttribute++]) { } + nAttribute >>= 1; + + // $$$ TODO take 64bits size into consideration + const char** name = new const char*[nAttribute]; + const char** value = new const char*[nAttribute]; + + for (size_t i = 0; i < nAttribute; ++i) + { + name[i] = attribute[(i << 1)]; + value[i] = attribute[(i << 1) + 1]; + } + + static_cast(data)->openChild(element, name, value, nAttribute); + + delete [] name; + delete [] value; +} + +static void XMLCALL ExpatXMLEnd(void* data, const char* /*element*/) { static_cast(data)->closeChild(); } + +static void XMLCALL ExpatXMLData(void* data, const char* value, const int length) +{ + const std::string str(value, length); + static_cast(data)->processChildData(str.c_str()); +} + +} // namespace XML diff --git a/Masterarbeit/openvibe/sdk-master/modules/xml/src/IWriter.cpp b/Masterarbeit/openvibe/sdk-master/modules/xml/src/IWriter.cpp new file mode 100644 index 0000000..52ec565 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/xml/src/IWriter.cpp @@ -0,0 +1,129 @@ +#include "IWriter.h" + +#include +#include + +namespace XML { +class CWriter final : public IWriter +{ +public: + explicit CWriter(IWriterCallback& callback) : m_callback(callback) {} + bool openChild(const char* name) override; + bool setChildData(const char* data) override; + bool setAttribute(const char* name, const char* value) override; + bool closeChild() override; + void release() override; + +private: + static void sanitize(std::string& str, bool escapeQuotes = true); + +protected: + IWriterCallback& m_callback; + std::stack m_nodes; + bool m_hasChild = false; + bool m_hasData = false; + bool m_hasClosedOpeningNode = true; +}; + +bool CWriter::openChild(const char* name) +{ + if (name == nullptr) { return false; } + + if (m_hasData) { return false; } + + if (!m_hasClosedOpeningNode) + { + m_callback.write(">"); + m_hasClosedOpeningNode = true; + } + + const std::string indent(m_nodes.size(), '\t'); + const std::string res = (!m_nodes.empty() ? std::string("\n") : std::string("")) + indent + "<" + name; + m_callback.write(res.c_str()); + m_nodes.push(name); + m_hasChild = false; + m_hasData = false; + m_hasClosedOpeningNode = false; + return true; +} + +bool CWriter::setChildData(const char* data) +{ + if (data == nullptr) { return false; } + + if (m_hasChild) { return false; } + + if (!m_hasClosedOpeningNode) + { + m_callback.write(">"); + m_hasClosedOpeningNode = true; + } + + std::string str(data); + this->sanitize(str, false); + + m_callback.write(str.c_str()); + m_hasChild = false; + m_hasData = true; + return true; +} + +bool CWriter::setAttribute(const char* name, const char* value) +{ + if (name == nullptr || value == nullptr || m_hasChild || m_hasData || m_hasClosedOpeningNode) { return false; } + + std::string str(value); + this->sanitize(str); + + const std::string res = std::string(" ") + name + "=\"" + str + "\""; + m_callback.write(res.c_str()); + return true; +} + +bool CWriter::closeChild() +{ + if (m_nodes.empty()) { return false; } + + if (!m_hasClosedOpeningNode) + { + m_callback.write(">"); + m_hasClosedOpeningNode = true; + } + + const std::string indent(m_nodes.size() - 1, '\t'); + const std::string res = ((m_hasData || !m_hasChild) ? std::string("") : std::string("\n") + indent) + ""; + m_callback.write(res.c_str()); + m_nodes.pop(); + m_hasChild = true; + m_hasData = false; + return true; +} + +void CWriter::release() +{ + while (!m_nodes.empty()) { closeChild(); } + delete this; +} + +void CWriter::sanitize(std::string& str, const bool escapeQuotes) +{ + std::string::size_type i; + if (str.length() != 0) + { + // mandatory, this one should be the first because the other ones add & symbols + for (i = str.find("&", 0); i != std::string::npos; i = str.find("&", i + 1)) { str.replace(i, 1, "&"); } + for (i = str.find('<', 0); i != std::string::npos; i = str.find('<', i + 1)) { str.replace(i, 1, "<"); } + for (i = str.find('>', 0); i != std::string::npos; i = str.find('>', i + 1)) { str.replace(i, 1, ">"); } + + // Quotes need only be escaped in attributes + if (escapeQuotes) + { + for (i = str.find('\'', 0); i != std::string::npos; i = str.find('\'', i + 1)) { str.replace(i, 1, "'"); } + for (i = str.find('\"', 0); i != std::string::npos; i = str.find('\"', i + 1)) { str.replace(i, 1, """); } + } + } +} + +XML_API IWriter* createWriter(IWriterCallback& callback) { return new CWriter(callback); } + +} // namespace XML diff --git a/Masterarbeit/openvibe/sdk-master/modules/xml/src/IXMLHandler.cpp b/Masterarbeit/openvibe/sdk-master/modules/xml/src/IXMLHandler.cpp new file mode 100644 index 0000000..b73daf0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/xml/src/IXMLHandler.cpp @@ -0,0 +1,205 @@ +#include "IXMLHandler.h" + +#include +#include +#include +#include +#include +#include + +namespace XML { +class IXMLHandlerImpl final : public IXMLHandler +{ +public: + void release() override; + IXMLHandlerImpl(); + + //Parsing + IXMLNode* parseFile(const char* sPath) override; + IXMLNode* parseString(const char* str, const size_t& size) override; + + //XML extraction + bool writeXMLInFile(const IXMLNode& rNode, const char* sPath) const override; + + //Error handling + std::string getLastErrorString() const override; + + //Internal function for parsing + void openChild(const char* name, const char** sAttributeName, const char** sAttributeValue, const size_t nAttribute); + void processChildData(const char* data); + void closeChild(); + + std::stringstream& getErrorStringStream() const; + +protected: + ~IXMLHandlerImpl() override; + +private: + XML_Parser m_pXMLParser; + std::stack m_oNodeStack; + IXMLNode* m_pRootNode; + mutable std::stringstream m_ssErrorStringStream; +}; + +//Callback for expat +static void XMLCALL ExpatXMLStart(void* pData, const char* element, const char** attribute); +static void XMLCALL ExpatXMLEnd(void* data, const char* element); +static void XMLCALL ExpatXMLData(void* data, const char* value, int length); + +IXMLHandlerImpl::~IXMLHandlerImpl() +{ + XML_ParserFree(m_pXMLParser); + while (!m_oNodeStack.empty()) + { + IXMLNode* node = m_oNodeStack.top(); + node->release(); + m_oNodeStack.pop(); + } +} + +void IXMLHandlerImpl::release() { delete this; } + + +IXMLHandlerImpl::IXMLHandlerImpl(): m_pXMLParser(nullptr), m_pRootNode(nullptr) +{ + m_pXMLParser = XML_ParserCreate(nullptr); + XML_SetElementHandler(m_pXMLParser, ExpatXMLStart, ExpatXMLEnd); + XML_SetCharacterDataHandler(m_pXMLParser, ExpatXMLData); + XML_SetUserData(m_pXMLParser, this); +} + +IXMLNode* IXMLHandlerImpl::parseFile(const char* sPath) +{ + std::ifstream file; + FS::Files::openIFStream(file, sPath, std::ios::binary); + if (file.is_open()) + { + //Compute size + file.seekg(0, std::ios::end); + const size_t fileLen = size_t(file.tellg()); + file.seekg(0, std::ios::beg); + + //Read the file + char* buffer = new char[fileLen]; + file.read(buffer, fileLen); + file.close(); + + //Start the parsing with the other function + IXMLNode* res = parseString(buffer, fileLen); + + delete[] buffer; + return res; + } + this->getErrorStringStream() << "Error : unable to open the file" << sPath << "." << std::endl; + return nullptr; +} + +IXMLNode* IXMLHandlerImpl::parseString(const char* str, const size_t& size) +{ + m_pRootNode = nullptr; + const XML_Status status = XML_Parse(m_pXMLParser, str, int(size), false); + + //We delete what is still in the stack + while (!m_oNodeStack.empty()) + { + // std::cout << "Warning : the file has been parsed but some tags are not closed. The file is probably not well-formed." << std::endl; + IXMLNode* node = m_oNodeStack.top(); + node->release(); + m_oNodeStack.pop(); + } + if (status != XML_STATUS_OK) + { + const XML_Error code = XML_GetErrorCode(m_pXMLParser); + // Although printf() is not too elegant, this component has no context to use e.g. LogManager -> printf() is better than a silent fail. + this->getErrorStringStream() << "processData(): expat error " << code << " on the line " << XML_GetCurrentLineNumber(m_pXMLParser) << + " of the input .xml\n"; + return nullptr; + } + return m_pRootNode; +} + +bool IXMLHandlerImpl::writeXMLInFile(const IXMLNode& rNode, const char* sPath) const +{ + std::ofstream file; + FS::Files::openOFStream(file, sPath, std::ios::binary); + if (file.is_open()) + { + char* xml = rNode.getXML(); + file.write(xml, strlen(xml)); + file.close(); + free(xml); + return true; + } + this->getErrorStringStream() << "Error : unable to open the file " << sPath << "." << std::endl; + return false; +} + +void IXMLHandlerImpl::openChild(const char* name, const char** sAttributeName, const char** sAttributeValue, const size_t nAttribute) +{ + IXMLNode* node = createNode(name); + for (size_t i = 0; i < nAttribute; ++i) { node->addAttribute(sAttributeName[i], sAttributeValue[i]); } + m_oNodeStack.push(node); +} + +void IXMLHandlerImpl::processChildData(const char* data) +{ + IXMLNode* node = m_oNodeStack.top(); + node->appendPCData(data); +} + +void IXMLHandlerImpl::closeChild() +{ + IXMLNode* node = m_oNodeStack.top(); + m_oNodeStack.pop(); + //If the stack is empty this means that node is the root + if (m_oNodeStack.empty()) { m_pRootNode = node; } + else + {//If node, that means that the node if + IXMLNode* parentNode = m_oNodeStack.top(); + parentNode->addChild(node); + } +} + +std::stringstream& IXMLHandlerImpl::getErrorStringStream() const +{ + // empty the string contents and clear the error flags + m_ssErrorStringStream.str(""); + m_ssErrorStringStream.clear(); + return m_ssErrorStringStream; +} + +std::string IXMLHandlerImpl::getLastErrorString() const { return m_ssErrorStringStream.str(); } + +static void XMLCALL ExpatXMLStart(void* pData, const char* element, const char** attribute) +{ + size_t nAttribute = 0; + while (attribute[nAttribute++]) { } + nAttribute >>= 1; + + // $$$ TODO take 64bits size into consideration + const char** name = new const char*[size_t(nAttribute)]; + const char** value = new const char*[size_t(nAttribute)]; + + for (size_t i = 0; i < nAttribute; ++i) + { + name[i] = attribute[(i << 1)]; + value[i] = attribute[(i << 1) + 1]; + } + + static_cast(pData)->openChild(element, name, value, nAttribute); + + delete [] name; + delete [] value; +} + +static void XMLCALL ExpatXMLEnd(void* data, const char* /*element*/) { static_cast(data)->closeChild(); } + +static void XMLCALL ExpatXMLData(void* data, const char* value, const int length) +{ + const std::string str(value, length); + static_cast(data)->processChildData(str.c_str()); +} + +OV_API IXMLHandler* createXMLHandler() { return new IXMLHandlerImpl(); } + +} // namespace XML diff --git a/Masterarbeit/openvibe/sdk-master/modules/xml/src/IXMLNode.cpp b/Masterarbeit/openvibe/sdk-master/modules/xml/src/IXMLNode.cpp new file mode 100644 index 0000000..c4877c5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/modules/xml/src/IXMLNode.cpp @@ -0,0 +1,160 @@ +#include "IXMLNode.h" + +#include +#include +#include +#include +#include + +//This is to remove the warning on windows about strdup +#if defined TARGET_OS_Windows +#define strdup _strdup +#endif + +namespace XML { +class IXMLNodeImpl final : public IXMLNode +{ +public: + explicit IXMLNodeImpl(const char* name) : m_name(name) {} + const char* getName() const override { return m_name.c_str(); } + void release() override { delete this; } + + //Attribute + bool addAttribute(const char* name, const char* value) override; + bool hasAttribute(const char* name) const override { return m_attibutes.count(name) != 0; } + const char* getAttribute(const char* name) const override; + + //PCDATA + void setPCData(const char* data) override; + void appendPCData(const char* data) override; + const char* getPCData() const override { return m_pcData.c_str(); } + + //Child + void addChild(IXMLNode* node) override { m_nodes.push_back(node); } + IXMLNode* getChild(const size_t index) const override { return m_nodes[index]; } + IXMLNode* getChildByName(const char* name) const override; + size_t getChildCount() const override; + + //XMl generation + char* getXML(const size_t depth = 0) const override; + +protected: + ~IXMLNodeImpl() override { for (size_t i = 0; i < getChildCount(); ++i) { getChild(i)->release(); } } + +private: + static std::string sanitize(const std::string& str); + static void applyIndentation(std::string& str, const size_t depth); + + + std::vector m_nodes; + std::map m_attibutes; + std::string m_name = ""; + std::string m_pcData = ""; + bool m_hasPCData = false; +}; + + +bool IXMLNodeImpl::addAttribute(const char* name, const char* value) +{ + m_attibutes[name] = value; + return true; +} + +const char* IXMLNodeImpl::getAttribute(const char* name) const +{ + const char* res = nullptr; + const std::string str(name); + + const auto it = m_attibutes.find(str); + if (it != m_attibutes.end()) { res = (*it).second.c_str(); } + + return res; +} + +void IXMLNodeImpl::setPCData(const char* data) +{ + m_pcData = data; + m_hasPCData = true; +} + +void IXMLNodeImpl::appendPCData(const char* data) +{ + m_pcData += data; + m_hasPCData = true; +} + +IXMLNode* IXMLNodeImpl::getChildByName(const char* name) const +{ + for (auto it = m_nodes.begin(); it != m_nodes.end(); ++it) + { + IXMLNode* node = static_cast(*it); + if (strcmp(node->getName(), name) == 0) { return node; } + } + return nullptr; +} + +size_t IXMLNodeImpl::getChildCount() const { return m_nodes.size(); } + +std::string IXMLNodeImpl::sanitize(const std::string& str) +{ + std::string::size_type i; + std::string res(str); + if (res.length() != 0) + { + // mandatory, this one should be the first because the other ones add & symbols + for (i = res.find('&', 0); i != std::string::npos; i = res.find('&', i + 1)) { res.replace(i, 1, "&"); } + // other escape sequences + for (i = res.find('\"', 0); i != std::string::npos; i = res.find('\"', i + 1)) { res.replace(i, 1, """); } + for (i = res.find('<', 0); i != std::string::npos; i = res.find('<', i + 1)) { res.replace(i, 1, "<"); } + for (i = res.find('>', 0); i != std::string::npos; i = res.find('>', i + 1)) { res.replace(i, 1, ">"); } + } + return res; +} + +void IXMLNodeImpl::applyIndentation(std::string& str, const size_t depth) +{ + const std::string indent(depth, '\t'); + str.append(indent); +} + +char* IXMLNodeImpl::getXML(const size_t depth) const +{ + std::string str; + applyIndentation(str, depth); + str += "<" + m_name; + + //Add attributes if we have some + if (!m_attibutes.empty()) + { + for (auto it = m_attibutes.begin(); it != m_attibutes.end(); ++it) { str += " " + it->first + "=\"" + sanitize(it->second) + "\""; } + } + //If we have nothing else to print let's close the node and return + if (!m_hasPCData && m_nodes.empty()) + { + str += "/>"; + return ::strdup(str.c_str()); + } + + str += ">"; + + if (m_hasPCData) { str = str + sanitize(m_pcData); } + + for (auto it = m_nodes.begin(); it != m_nodes.end(); ++it) + { + IXMLNode* node = static_cast(*it); + str += std::string("\n") + node->getXML(depth + 1); + } + + if (!m_nodes.empty()) + { + str = str + "\n"; + applyIndentation(str, depth); + } + str = str + ""; + + return ::strdup(str.c_str()); +} + +OV_API IXMLNode* createNode(const char* name) { return new IXMLNodeImpl(name); } + +} // namespace XML diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/openvibe/CMakeLists.txt new file mode 100644 index 0000000..71b829a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/CMakeLists.txt @@ -0,0 +1,67 @@ +PROJECT(openvibe) +OV_ADD_THIS_TO_PROJECT_LIST() + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl include/*.h include/*.hpp) +INCLUDE_DIRECTORIES(include/openvibe) +INCLUDE("FindSourceRCProperties") + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${KERNEL_FOLDER} + COMPILE_FLAGS "-DOV_Exports -DOV_Shared") + +INCLUDE("FindOpenViBECommon") + +# --------------------------------- +# Finds standard library dl +# Adds library to target +# Adds include path +# --------------------------------- +IF(UNIX) + FIND_LIBRARY(LIB_STANDARD_MODULE_DL dl) + IF(LIB_STANDARD_MODULE_DL) + MESSAGE(STATUS " Found dl...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_DL}) + ELSE(LIB_STANDARD_MODULE_PTHREAD) + MESSAGE(STATUS " FAILED to find dl...") + ENDIF(LIB_STANDARD_MODULE_DL) +ENDIF(UNIX) + +# --------------------------------- +# Finds standard library pthread +# Adds library to target +# Adds include path +# --------------------------------- +IF(UNIX) + FIND_LIBRARY(LIB_STANDARD_MODULE_PTHREAD pthread) + IF(LIB_STANDARD_MODULE_PTHREAD) + MESSAGE(STATUS " Found pthread...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_PTHREAD}) + ELSE(LIB_STANDARD_MODULE_PTHREAD) + MESSAGE(STATUS " FAILED to find pthread...") + ENDIF(LIB_STANDARD_MODULE_PTHREAD) +ENDIF(UNIX) + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY include/ DESTINATION ${DIST_INCLUDEDIR} FILES_MATCHING PATTERN "*.h") +INSTALL(DIRECTORY include/ DESTINATION ${DIST_INCLUDEDIR} FILES_MATCHING PATTERN "*.hpp") diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/doc/Groups.dox b/Masterarbeit/openvibe/sdk-master/openvibe/doc/Groups.dox new file mode 100644 index 0000000..190d048 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/doc/Groups.dox @@ -0,0 +1,55 @@ +/** + * \defgroup Group_Base Base framework + */ + +/** + * \defgroup Group_Kernel Kernel components + */ + +/** + * \defgroup Group_Algorithm Algorithms management + * \ingroup Group_Kernel + */ + +/** + * \defgroup Group_Config Configuration management + * \ingroup Group_Kernel + */ + +/** + * \defgroup Group_Log Log and traces + * \ingroup Group_Kernel + */ + +/** + * \defgroup Group_Error Error management + * \ingroup Group_Error + */ + +/** + * \defgroup Group_Player Scenario playback + * \ingroup Group_Kernel + */ + +/** + * \defgroup Group_Plugins Plugins management + * \ingroup Group_Kernel + */ + +/** + * \defgroup Group_Scenario Scenario management + * \ingroup Group_Kernel + */ + +/** + * \defgroup Group_Visualisation Visuals and displays + * \ingroup Group_Kernel + */ + +/** + * \defgroup Group_Extend Extension mechanism + */ + +/** + * \defgroup Group_Helper Outside world helpers + */ diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/doc/Namespaces.dox b/Masterarbeit/openvibe/sdk-master/openvibe/doc/Namespaces.dox new file mode 100644 index 0000000..690d36a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/doc/Namespaces.dox @@ -0,0 +1,32 @@ +/** + * \namespace OpenViBE + * \author Yann Renard (INRIA/IRISA) + * \date 2006-06 + * \brief Main OpenViBE namespace + * + * All the classes defined in the OpenViBE platform are included in + * this namespace, including kernel and plugins. + */ + +/** + * \namespace OpenViBE::Kernel + * \author Yann Renard (INRIA/IRISA) + * \date 2006-06 + * \brief Kernel specifications of the OpenViBE platform + * + * This OpenViBE subnamespace contains the specifications of + * the kernel classes. Those classes are overloaded by the kernel + * developpers to implement a complete kernel. + */ + +/** + * \namespace OpenViBE::Plugins + * \author Yann Renard (INRIA/IRISA) + * \date 2006-06 + * \brief Plugins specifications of the OpenViBE platform + * + * This OpenViBE subnamespace contains the specifications of + * the plugin classes. Those classes should be used by the + * kernel in order to extend the capabilities of the platform. + * These classes are overloaded by the plugin developpers. + */ diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/CIdentifier.hpp b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/CIdentifier.hpp new file mode 100644 index 0000000..2d17abf --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/CIdentifier.hpp @@ -0,0 +1,220 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CIdentifier.hpp +/// \brief Globally used identification class. +/// \author Yann Renard (INRIA/IRISA) & Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 16/06/2006. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- +#pragma once + +#include "ov_defines.h" +#include +#include +#include "ovCString.h" + +namespace OpenViBE { + +/// Globally used identification class.\n +/// +/// This class is the basic class to use in order to identify objects in the OpenViBE platform.\n +/// It can be used for class identification, for object identification and any user needed identification process.\n +/// +/// The identification of the OpenViBE platform is based on 64 bits integers.\n +/// +/// This class is heavily used in the OpenViBE::IObject class.\n +/// Also, the OpenViBE specification gives serveral already defined class identifiers the developer should know of.\n +/// For this, let you have a look to the documentation of defines.hpp ! +/// +/// +/// +class OV_API CIdentifier +{ +public: + //-------------------------------------------------- + //------------ Constructor / Destructor ------------ + //-------------------------------------------------- + + /// Default constructor.\n Builds up the 64 bits identifier initialized to undefined. + CIdentifier() : m_id(std::numeric_limits::max()) {} + + /// 32 bits integer based constructor.\n Builds up the 64 bits identifier given its two 32 bits components. + /// The first part of the identifier. + /// The second part of the identifier. + CIdentifier(const size_t id1, const size_t id2) : m_id((uint64_t(id1) << 32) + id2) {} + + /// 64 bits integer based constructor. + /// The identifier. + CIdentifier(const uint64_t id) : m_id(id) {} + + /// string based constructor. + /// The string with identifier. + /// If string is invalid undefined ID is set. + explicit CIdentifier(const std::string& str) { if (!fromString(CString(str.c_str()))) { m_id = std::numeric_limits::max(); } } + + /// Copy constructor.\n Builds up the 64 bits identifier exacly the same as given identifier parameter. + /// the identifier to initialize this identifier from. + CIdentifier(const CIdentifier& id) : m_id(id.m_id) {} + + /// Undefined Identifier (the same as default constructor). + /// Identifier define as undefined. + static CIdentifier undefined() { return CIdentifier(std::numeric_limits::max()); } + + //-------------------------------------------------- + //------------------- Operators -------------------- + //-------------------------------------------------- + + /// Copy Assignment Operator. + /// The identifier. + /// Himself. + CIdentifier& operator=(const CIdentifier& id); + + /// Increments this identifier by 1. + /// Himself. + /// + /// If this identifier is , it is not incremented.\n + /// If this idenfitier is not , it can not become after being incremented. + CIdentifier& operator++(); + + /// Decrements this identifier by 1. + /// Himself. + /// If this identifier is \c CIdentifier::undefined(), it is not decremented.\n + /// If this idenfitier is not \c CIdentifier::undefined(), it can not become \c CIdentifier::undefined() after being decremented. + CIdentifier& operator--(); + + /// "Equal" test operator. + /// The identifier to compare. + /// true if equals, false otherwise. + bool operator==(const CIdentifier& id) const { return m_id == id.id(); } + + /// "Difference" test operator. + /// The identifier to compare. + /// true if different, false otherwise. + bool operator!=(const CIdentifier& id) const { return m_id != id.id(); } + + /// "Less than" test operator. + /// The identifier to compare. + /// true if less than the test, false otherwise. + bool operator<(const CIdentifier& id) const { return m_id < id.id(); } + + /// "Greater than" test operator. + /// The identifier to compare. + /// true if greater than the test, false otherwise. + bool operator>(const CIdentifier& id) const { return m_id > id.id(); } + + /// "Less or equal than" test operator. + /// The identifier to compare. + /// true if less or equal than the test, false otherwise. + bool operator<=(const CIdentifier& id) const { return m_id <= id.id(); } + + /// "Greater or equal than" test operator. + /// The identifier to compare. + /// true if greater or equal than the test, false otherwise. + bool operator>=(const CIdentifier& id) const { return m_id >= id.id(); } + + //---------- With Template ---------- + /// Copy Assignment Operator for integral all types. + /// The identifier. + /// Himself. + /// Template function must be define in header to keep the template system in extern program. + template ::value, T>::type> + CIdentifier& operator=(const T id) + { + m_id = id; + return *this; + } + + /// "Equal" test operator for integral all types. + /// The identifier to compare. + /// true if equals, false otherwise. + template ::value, T>::type> + bool operator==(const T id) const { return m_id == id; } + + /// "Difference" test operator for integral all types. + /// The identifier to compare. + /// true if different, false otherwise. + template ::value, T>::type> + bool operator!=(const T id) const { return m_id != id; } + + /// "Less than" test operator for integral all types. + /// The identifier to compare. + /// true if less than the test, false otherwise. + template ::value, T>::type> + bool operator<(const T id) const { return m_id < id; } + + /// "Greater than" test operator for integral all types. + /// The identifier to compare. + /// true if greater than the test, false otherwise. + template ::value, T>::type> + bool operator>(const T id) const { return m_id > id; } + + /// "Less or equal than" test operator for integral all types. + /// The identifier to compare. + /// true if less or equal than the test, false otherwise. + template ::value, T>::type> + bool operator<=(const T id) const { return m_id <= id; } + + /// "Greater or equal than" test operator for integral all types. + /// The identifier to compare. + /// true if greater or equal than the test, false otherwise. + template ::value, T>::type> + bool operator>=(const T id) const { return m_id >= id; } + + //-------------------------------------------------- + //---------------------- Misc ---------------------- + //-------------------------------------------------- + + /// Converts this identifier into a string. + /// if the str is in hexadecimal with two uint32 number or in decimal mode with only one uint64 number. + /// This identifier represented as a std::string. + std::string str(const bool hexa = true) const; + + /// Converts this identifier into an OpenViBE string. + /// This identifier represented as an OpenViBE string. + /// Avoid this, this function keep previous compatibility with CString. + CString toString() const { return CString(str().c_str()); } + + /// Reads a a string to extract this identifier. + /// the string to convert. + /// true in case of success, false otherwise. + /// Must be changed with std::string when possible. For now it keeps compatibility with CString. + bool fromString(const CString& str); + + /// Get the ID. + /// The unsigned integer identifier. + /// Use this function with care, identifiers should not be considered as integers. + /// Actually, the internal 64 bits representation may change, resulting in code port needs if you use this function. + uint64_t id() const { return m_id; } + + /// Get the ID. + /// The unsigned integer identifier. + /// Use this function with care, identifiers should not be considered as integers. + /// Actually, the internal 64 bits representation may change, resulting in code port needs if you use this function. + /// Avoid this, this function keep previous compatibility with heavy name. + uint64_t toUInteger() const { return m_id; } + + /// Creates a random identifier. + /// A random identifier. + /// The returned identifier can not be \c CIdentifier::undefined(). + static CIdentifier random(); + + /// Override the ostream operator. + /// The ostream. + /// The object. + /// Return the modified ostream. + friend std::ostream& operator<<(std::ostream& os, const CIdentifier& obj) + { + os << obj.str(); + return os; + } + +protected: + + uint64_t m_id = 0; ///< the 64 bit identifier value +}; +} // namespace OpenViBE + +/// Avoid this, #define is replace by constexpr for modern compiler and undefined is set in CIdentifier Class. +#define OV_UndefinedIdentifier OpenViBE::CIdentifier::undefined() diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/CMatrix.hpp b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/CMatrix.hpp new file mode 100644 index 0000000..4d35baa --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/CMatrix.hpp @@ -0,0 +1,300 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CMatrix.hpp +/// \brief Basic standalone OpenViBE matrix implementation. +/// \author Yann Renard (INRIA/IRISA) & Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 21/11/2007. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- +#pragma once + +#include "ovIObject.h" +#include + +namespace OpenViBE { + +/// OpenViBE Matrix Class. +class OV_API CMatrix final : public IObject +{ +public: + + //-------------------------------------------------- + //------------ Constructor / Destructor ------------ + //-------------------------------------------------- + /// Default constructor. + CMatrix() { initVector(); } + + /// Constructor for 1D matrix with initial dimensions. + /// The length of vector. + explicit CMatrix(const size_t dim) { resize(dim); } + + /// Constructor for 2D matrix with initial dimensions. + /// The first dimension size. + /// The second dimension size. If it's 0, the matrix is a Row vector. + explicit CMatrix(const size_t dim1, const size_t dim2) { resize(dim1, dim2); } + + /// Copy Constructor. + /// the matrix to copy. + CMatrix(const CMatrix& m) { copy(m); } + + /// Default destructor. + ~CMatrix() override { clear(); } + + //-------------------------------------------------- + //----------------- Getter/Setter ------------------ + //-------------------------------------------------- + /// Gets the number of dimension. + /// THe number of dimension. + size_t getDimensionCount() const { return m_dimSizes->size(); } + + /// Gets the size of the dimension index. + /// The dimension. + /// the size of the selected dimension. + size_t getDimensionSize(const size_t index) const { return (index >= m_dimSizes->size()) ? 0 : m_dimSizes->at(index); } + + /// Gets the label of the selected index in selected dimensions. + /// The dimension concerned. + /// The index on this dimension. + /// The label. + /// It's a const char* object to keep previous compatibility with CString, intended to be replace by std::string. + const char* getDimensionLabel(const size_t dim, const size_t idx) const + { + return (dim >= m_dimSizes->size() || idx >= m_dimSizes->at(dim)) ? "" : m_dimLabels->at(dim)[idx].c_str(); + } + + /// Const Buffer Accessor. + /// The buffer. + const double* getBuffer() const { return m_buffer; } + + /// Buffer Accessor. + /// The buffer. + double* getBuffer() + { + if (!m_buffer) { initBuffer(); } // Initialize buffer if needed + return m_buffer; + } + + /// Get the number of element in buffer. + /// The number of element. + size_t getSize() const + { + if (!m_buffer || m_size == 0) { initBuffer(); } // Initialize buffer if needed + return m_size; + } + + /// Get the number of element in buffer. + /// keep previous compatibility with heavy name. Avoid to used it, intended to be removed. + size_t getBufferElementCount() const { return getSize(); } + + + /// Get the dimension's sizes vector. + /// The member . + std::vector* getSizes() const { return m_dimSizes; } + + /// Get the dimension's labels vector. + /// The member . + std::vector>* getLabels() const { return m_dimLabels; } + + /// Set the number of dimensions. + /// The number of dimensions. + bool setDimensionCount(const size_t count) const; + + /// Set the size of the selected dimension. + /// The selected dimension. + /// The new size. + bool setDimensionSize(const size_t dim, const size_t size) const; + + /// Set the label of the index in the selected dimension. + /// The dimension concerned. + /// The index concerned. + /// The Label to set. + bool setDimensionLabel(const size_t dim, const size_t idx, const std::string& label) const; + + /// Set the label of the index in the selected dimension (keep previous compatibility with char* for CString). + /// keep previous compatibility with heavy name. Avoid to used it, intended to be removed. + bool setDimensionLabel(const size_t dim, const size_t idx, const char* label) const { return setDimensionLabel(dim, idx, std::string(label)); } + + //-------------------------------------------------- + //------------------- Operators -------------------- + //-------------------------------------------------- + + /// Copy Assignment Operator. + /// The matrix to copy. + /// Himself. + CMatrix& operator=(const CMatrix& m) + { + copy(m); + return *this; + } + + /// Override the egal operator. + /// The second object. + /// True if the two are equals. + bool operator==(const CMatrix& obj) const { return isAlmostEqual(obj); } + + /// Overload of const operator []. + /// The index. + /// Const Reference of the object. + const double& operator [](const size_t index) const { return this->getBuffer()[index]; } + + /// Overload of operator []. + /// The index. + /// Reference of the object. + double& operator [](const size_t index) { return this->getBuffer()[index]; } + + //-------------------------------------------------- + //---------------------- Misc ---------------------- + //-------------------------------------------------- + + /// Determines if the buffer contains NaN or Ininity. + /// Check if NaN is in buffer or not. + /// Check if Ininity is in buffer or not. + /// true if buffer is valid doesn't have NaN or Ininity value, false otherwise. + bool isBufferValid(const bool checkNaN = true, const bool checkInf = true) const; + + /// Determines if the size and the labels of the matrix are equals. + /// The matrix to compare. + /// The check labels or not. + /// true if description is equal, false otherwise. + bool isDescriptionEqual(const CMatrix& m, const bool checkLabels = true) const; + + /// Determines if the buffer is exactly the same. + /// The matrix to compare. + /// true if buffer is equal, false otherwise. + bool isBufferEqual(const CMatrix& m) const; + + /// Determines if the buffer is almost equals. + /// The matrix to compare. + /// Tolerance for the difference. + /// true if buffer is equal, false otherwise. + /// We use it to avo�d double precision problems. + bool isBufferAlmostEqual(const CMatrix& m, const double epsilon = OV_EPSILON) const; + + /// Determines if the two (Description & Buffer is exactly the same. + /// The matrix to compare. + /// True if the two are exactly the same. + bool isEqual(const CMatrix& m) const { return isDescriptionEqual(m) && isBufferEqual(m); } + + /// Determines if the two (Description & Buffer) is almost equal. + /// The matrix to compare. + /// Tolerance for the difference. + /// True if the two are exactly the same. + /// We use it to avo�d double precision problems. + bool isAlmostEqual(const CMatrix& m, const double epsilon = OV_EPSILON) const { return isDescriptionEqual(m) && isBufferAlmostEqual(m, epsilon); } + + + /// Resize 1D matrix and set matrix value to 0. + /// The length of vector. + void resize(const size_t dim) { resize(std::vector{ dim }); } + + /// Resize 2D matrix and set matrix value to 0. + /// The first dimension. + /// The second dimension. + void resize(const size_t dim1, const size_t dim2) { resize(std::vector{ dim1, dim2 }); } + + /// Resize ND matrix with given sizes and set matrix value to 0. + /// The sizes of dimensions. + void resize(const std::vector& sizes); + + /// Delete all pointer and reset size to 0 and init vector pointer. + void clean(); + + /// Copy matrix to this instance. + /// The matrix to copy. + void copy(const CMatrix& m); + + /// Copy the size and the labels of matrix to this instance. + /// The matrix to copy. + void copyDescription(const CMatrix& m); + + /// Copy the content of matrix to this instance. + /// The matrix to copy. + void copyContent(const CMatrix& m) const; + + /// Set all element of the buffer to 0. + void resetBuffer() const; + + /// Set all labels to "". + void resetLabels() const { for (auto& dim : *m_dimLabels) { for (auto& l : dim) { l = ""; } } } + + /// Set all dimension labels are set from 1 to Dim Size. + void setNumLabels() const; + + /// Save to the text file. + /// The filename. + /// true if succeed, false otherwise. + bool toTextFile(const std::string& filename) const; + + /// Load from the text file. + /// The filename. + /// true if succeed, false otherwise. + bool fromTextFile(const std::string& filename); + + /// Fill matrix from string. + /// The string with the matrix. + /// caracter before the line (by default nothing). + /// caracter when the line start (by default nothing). + /// separator between value (by default tabulation). + /// caracter when the line finish (by default nothing). + /// true if succeed, false otherwise. + bool bufferFromString(const std::string& in, const std::string& before = "", const std::string& start = "", + const std::string& sep = "\t", const std::string& end = "") const; + + /// Display the matrix. + /// caracter before the line (by default nothing). + /// caracter when the line start (by default nothing). + /// separator between value (by default tabulation). + /// caracter when the line finish (by default nothing). + /// the Matrix. + /// Display works for 2D and 1D matrix respectively in table format or a row. + std::string bufferToString(const std::string& before = "", const std::string& start = "", const std::string& sep = "\t", const std::string& end = "") const; + + /// Display the Labels. + /// caracter before the line (by default nothing). + /// caracter when the line start (by default nothing). + /// separator between value (by default tabulation). + /// caracter when the line finish (by default nothing). + /// the Labels. + std::string labelsToString(const std::string& before = "", const std::string& start = "", const std::string& sep = "\t", const std::string& end = "") const; + + /// Override the ostream operator. + /// The ostream. + /// The object. + /// Return the modified ostream. + friend std::ostream& operator<<(std::ostream& os, const CMatrix& obj) + { + os << obj.bufferToString(); + return os; + } + + _IsDerivedFromClass_Final_(IObject, OV_ClassId_Matrix) + +private: + /// Init Buffer and number of element. + void initBuffer() const; + + /// Initialize vector pointer. + void initVector(); + + /// Delete Buffer pointer and reset size to 0. + void clearBuffer() const; + + /// Delete vector pointer. + void clearVector(); + + /// Delete all pointer and reset size to 0. + /// Be carefull with this, must use a new constructor or resize function to allocate all pointers. + void clear(); + + mutable double* m_buffer = nullptr; ///< The matrix buffer. + mutable size_t m_size = 0; ///< The number of element. + + std::vector* m_dimSizes = nullptr; ///< Size of all dimensions (pointer to avoid export warning C4251) + std::vector>* m_dimLabels = nullptr; ///< Labels of all dimensions (pointer to avoid export warning C4251) +}; + +typedef CMatrix IMatrix; // Keep previous compatibility. Avoid to used it, intended to be removed. + +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/CTime.hpp b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/CTime.hpp new file mode 100644 index 0000000..d1472b9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/CTime.hpp @@ -0,0 +1,194 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CTime.hpp +/// \brief Time Class for OpenViBE. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 04/05/2020. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "ov_defines.h" +#include +#include +#include + +namespace OpenViBE { +/// This class is the basic class to use to compute and display time in the OpenViBE platform.\n +/// The time in the OpenViBE platform is based on 64 bits integers. +class OV_API CTime +{ +public: + + //-------------------------------------------------- + //------------ Constructor / Destructor ------------ + //-------------------------------------------------- + + /// Default constructor. + CTime() = default; + + /// 64 bits integer based constructor. + /// The original time in uint64_t. + /// the template is used to avoid the ambiguity with the double constructor. + template ::value, T>::type> + explicit CTime(const T time) : m_time(time) {} + + /// Constructor with time in seconds. + /// The time in seconds. + explicit CTime(const double seconds) : m_time(seconds >= 0.0 ? uint64_t(seconds * double(1LL << 32)) : 0) {} + + /// Copy constructor. + /// The original time. + CTime(const CTime& time) : m_time(time.m_time) {} + + /// Constructor sampling and sample count to time. + /// The sampling frequency. + /// The sample count. + /// It assumes, if you indicate a sampling with 0 return max. + CTime(const uint64_t sampling, const uint64_t sampleCount) + : m_time(sampling == 0 ? std::numeric_limits::max() : (sampleCount << 32) / sampling) { } + + /// Default Destructor. + ~CTime() = default; + + /// Maximum value for the time. + static CTime max() { return CTime(std::numeric_limits::max()); } + + /// Minimum value for the time. + static CTime min() { return CTime(std::numeric_limits::min()); } + + //-------------------------------------------------- + //------------------ Conversions ------------------- + //-------------------------------------------------- + + /// Given a fixed point time and the sampling rate, returns the number of samples obtained. + /// The sampling rate of the signal. + /// Sample count corresponding to the time with this sampling. + uint64_t toSampleCount(const uint64_t sampling) const { return (sampling == 0 ? std::numeric_limits::max() : (m_time + 1) * sampling - 1) >> 32; } + + /// Get the time in seconds. + /// Regular floating point time in seconds. + double toSeconds() const { return m_time / double(1LL << 32); } + + /// Ceil the time. \n + /// - 1LL << 32 corresponds to 1 followed by 32 0 so the maximum of an int of 32bit + 1 (\f$ 2^{32} \f$). + /// - 0xFFFFFFFFLL << 32 corresponds to 32 1 followed by 32 0 (we see 8 character because 4 bit is used by Hexadecimal characters). + /// - (m_time & (0xFFFFFFFFLL << 32)) corresponds to all bits after the position 31 for the member followed by 32 0. + /// + /// So this formula, place all bits in position 0 to 31 to 0, + /// next add 1 at position 32 (so add \f$ 2^{32} \f$), of course this last operation can modify other bits. + /// The time ceiled. + CTime ceil() const { return CTime(uint64_t(((m_time << 32) > 0) ? ((m_time & (0xFFFFFFFFLL << 32)) + (1LL << 32)) : m_time)); } + + /// Display the time in second and/or in hexa. + /// the time. + std::string str(const bool inSecond = true, const bool inHexa = false) const; + + /// Get the time. + /// the time. + uint64_t time() const { return m_time; } + + //-------------------------------------------------- + //------------------- Operators -------------------- + //-------------------------------------------------- + + /// Copy Assignment Operator. + /// The time. + /// himself. + CTime& operator=(const CTime& time); + + /// Copy Assignment Operator. + /// The time. + /// himself. + CTime& operator=(uint64_t time); + + /// Add Assignment Operator. + /// The time to add. + /// himself. + CTime& operator+=(const CTime& time); + + /// Substract Assignment Operator. + /// The time to remove. + /// himself. + CTime& operator-=(const CTime& time); + + /// "Equal" test operator. + /// The time to compare. + /// true if equals, false otherwise. + bool operator==(const CTime& time) const { return m_time == time.m_time; } + + /// "Difference" test operator. + /// The time to compare. + /// true if different, false otherwise. + bool operator!=(const CTime& time) const { return m_time != time.m_time; } + + /// "Less than" test operator. + /// The time to compare. + /// true if less than the test, false otherwise. + bool operator<(const CTime& time) const { return m_time < time.m_time; } + + /// "Greater than" test operator. + /// The time to compare. + /// true if greater than the test, false otherwise. + bool operator>(const CTime& time) const { return m_time > time.m_time; } + + /// "Less or equal than" test operator. + /// The time to compare. + /// true if less or equal than, false otherwise. + bool operator<=(const CTime& time) const { return m_time <= time.m_time; } + + /// "Greater or equal than" test operator. + /// The time to compare. + /// true if greater or equal than the test, false otherwise. + bool operator>=(const CTime& time) const { return m_time >= time.m_time; } + + + /// Implements the operator uint64_t. + /// The result of the operator. + explicit operator uint64_t() const { return m_time; } + + /// Implements the const operator uint64_t. + /// The result of the operator. + explicit operator const uint64_t() const { return m_time; } + + //-------------------------------------------------- + //--- friends (must be in header files for link) --- + //-------------------------------------------------- + + /// Override the ostream operator. + /// The ostream. + /// The object. + /// Return the modified ostream. + friend std::ostream& operator<<(std::ostream& os, const CTime& obj) + { + os << obj.str(); + return os; + } + + /// Addition Operator. + /// The fisrt time. + /// The second time. + /// the result of the operation. + friend CTime operator+(CTime left, const CTime& right) + { + left += right; + return left; + } + + /// Substract Operator. + /// The fisrt time. + /// The second time. + /// the result of the operation. + friend CTime operator-(CTime left, const CTime& right) + { + left -= right; + return left; + } + +protected: + uint64_t m_time = 0; ///< the 64 bit time value +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/algorithm/ovIAlgorithmContext.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/algorithm/ovIAlgorithmContext.h new file mode 100644 index 0000000..9bad7ce --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/algorithm/ovIAlgorithmContext.h @@ -0,0 +1,128 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +class IParameter; + +/** + * \class IAlgorithmContext + * \author Yann Renard (INRIA/IRISA) + * \date 2007-11-06 + * \brief Exectution context for algorithm objects + * \ingroup Group_Algorithm + * \ingroup Group_Kernel + * \ingroup Group_Extend + * \sa Plugins::IAlgorithm + */ +class OV_API IAlgorithmContext : public IKernelObject +{ +public: + + /** + * \brief Gets a reference on the current configuration manager + * \return a reference on the configuration manager + * + * \warning The algorithm should not use this reference after it + * has finished its work, it could be deprecated. + */ + virtual IConfigurationManager& getConfigurationManager() const = 0; + /** + * \brief Gets a reference on the current algorithm manager + * \return a reference on the algorithm manager + * + * \warning The algorithm should not use this reference after it + * has finished its work, it could be deprecated. + */ + virtual IAlgorithmManager& getAlgorithmManager() const = 0; + /** + * \brief Gets a reference on the current log manager + * \return a reference on the current log manager + * + * \warning The algorithm should not use this reference after it + * has finished its work, it could be deprecated. + */ + virtual ILogManager& getLogManager() const = 0; + /** + * \brief Gets a reference on the current error manager + * \return a reference on the current error manager + * + * \warning The algorithm should not use this reference after it + * has finished its work, it could be deprecated. + */ + virtual IErrorManager& getErrorManager() const = 0; + /** + * \brief Gets a reference on the current type manager + * \return a reference on the current type manager + */ + virtual ITypeManager& getTypeManager() const = 0; + + /** \name Input parameters */ + //@{ + + /** + * \brief Gets next input parameter identifier given the previous input parameter + * \param prevInputParameterID [in] : the previous input parameter + * \return the next input parameter identifier if existing. + * \return \c CIdentifier::undefined() if the previous was the last input parameter identifier. + * \note Passing \c CIdentifier::undefined() as \c prevInputParameterID will + * cause this function to return the firs input parameter identifier. + */ + virtual CIdentifier getNextInputParameterIdentifier(const CIdentifier& prevInputParameterID) const = 0; + /** + * \brief Gets the parameter details of a specific input parameter + * \param id [in] : the identifier of the parameter which details should be returned + * \return the parameter pointer that corresponds to the provided identifier. + * \return \c NULL in case of error. + */ + virtual IParameter* getInputParameter(const CIdentifier& id) = 0; + + //@} + /** \name Output parameters */ + //@{ + + /** + * \brief Gets next output parameter identifier given the previous output parameter + * \param prevOutputParameterID [in] : the previous output parameter + * \return the next output parameter identifier if existing. + * \return \c CIdentifier::undefined() if the previous was the last output parameter identifier. + * \note Passing \c CIdentifier::undefined() as \c prevOutputParameterID will + * cause this function to return the firs output parameter identifier. + */ + virtual CIdentifier getNextOutputParameterIdentifier(const CIdentifier& prevOutputParameterID) const = 0; + /** + * \brief Gets the parameter details of a specific output parameter + * \param id [in] : the identifier of the parameter which details should be returned + * \return the parameter pointer that corresponds to the provided identifier. + * \return \c NULL in case of error. + */ + virtual IParameter* getOutputParameter(const CIdentifier& id) = 0; + + //@} + /** \name Trigger management */ + //@{ + + /** + * \brief Tests whether an input trigger is activated or not. + * \param id [in] : the identifier of the input trigger which activation status should be returned + * \return \e true if the provided trigger is currently active. + * \return \e false if the provided trigger is not currently active or does not exist. + */ + virtual bool isInputTriggerActive(const CIdentifier& id) const = 0; + /** + * \brief Activates an output trigger before calling the processing function. + * \param id [in] : the identifier of the output to activate + * \param state [in]: the new trigger state this output trigger should take + * (\e true for active, \e false for inactive) + * \return \e true in case the state was correctly changed. + * \return \e false in case the state was not changed or the provided trigger identifier does not exist. + */ + virtual bool activateOutputTrigger(const CIdentifier& id, const bool state) = 0; + + //@} + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Algorithm_AlgorithmContext) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/algorithm/ovIAlgorithmManager.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/algorithm/ovIAlgorithmManager.h new file mode 100644 index 0000000..9d4ee7a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/algorithm/ovIAlgorithmManager.h @@ -0,0 +1,79 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Plugins { +class IAlgorithmDesc; +} // namespace Plugins + +namespace Kernel { +class IAlgorithmProxy; + +/** + * \class IAlgorithmManager + * \author Yann Renard (INRIA/IRISA) + * \date 2007-11-06 + * \brief Manager for all kind of plugin algorithms + * \ingroup Group_Algorithm + * \ingroup Group_Kernel + * \sa Plugins::IAlgorithm + */ +class OV_API IAlgorithmManager : public IKernelObject +{ +public: + + /** + * \brief Creates a new algorithm + * \param algorithmClassID [out] : the class identifier of + * the newly created algorithm + * \return \e true in case of success. + * \return \e CIdentifier::undefined() in case of error. + */ + virtual CIdentifier createAlgorithm(const CIdentifier& algorithmClassID) = 0; + /** + * \brief Creates a new algorithm + * \param algorithmDesc [in] : the algorithm descriptor of + * the algorithm to create + * \return \e identifier of the created algorithm + * \return \e CIdentifier::undefined() + */ + virtual CIdentifier createAlgorithm(const Plugins::IAlgorithmDesc& algorithmDesc) = 0; + + /** + * \brief Releases an existing algorithm + * \param id [in] : the existing algorithm identifier + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool releaseAlgorithm(const CIdentifier& id) = 0; + /** + * \brief Releases an existing algorithm + * \param algorithm [in] : the existing algorithm + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool releaseAlgorithm(IAlgorithmProxy& algorithm) = 0; + /** + * \brief Gets details on a specific algorithm + * \param id [in] : the algorithm identifier which details should be returned + * \return the corresponding algorithm reference. + * \warning Calling this function with a bad identifier causes a crash + */ + virtual IAlgorithmProxy& getAlgorithm(const CIdentifier& id) = 0; + /** + * \brief Gets next algorithm identifier + * \param previousID [in] : The identifier + * for the preceeding algorithm + * \return The identifier of the next algorithm in case of success. + * \return \c CIdentifier::undefined() on error. + * \note Giving \c CIdentifier::undefined() as \c previousID + * will cause this function to return the first algorithm + * identifier. + */ + virtual CIdentifier getNextAlgorithmIdentifier(const CIdentifier& previousID) const = 0; + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Algorithm_AlgorithmManager) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/algorithm/ovIAlgorithmProto.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/algorithm/ovIAlgorithmProto.h new file mode 100644 index 0000000..1d998db --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/algorithm/ovIAlgorithmProto.h @@ -0,0 +1,66 @@ +#pragma once + +#include "../ovIConfigurable.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class IAlgorithmProto + * \brief Prototype interface for algorithm + * \author Yann Renard (INRIA/IRISA) + * \date 2007-11-21 + * \ingroup Group_Algorithm + * \ingroup Group_Kernel + * \ingroup Group_Extend + * \sa Plugins::IAlgorithm + * \sa Plugins::IAlgorithmDesc + */ +class OV_API IAlgorithmProto : public IKernelObject +{ +public: + + /** + * \brief Adds an input parameter + * \param id [in] : the identifier for this parameter + * \param name [in] : the name for this parameter + * \param type [in] : the type for this parameter + * \param subTypeID [in] : the optional sub type of this parameter (e.g. for enumerations) + * \return \e true in case of success. + * \return \e false in case of error. + * \sa IParameter + */ + virtual bool addInputParameter(const CIdentifier& id, const CString& name, EParameterType type, + const CIdentifier& subTypeID = CIdentifier::undefined()) = 0; + /** + * \brief Adds an output parameter + * \param id [in] : the identifier for this parameter + * \param name [in] : the name for this parameter + * \param type [in] : the type for this parameter + * \param subTypeID [in] : the optional sub type of this parameter (e.g. for enumerations) + * \return \e true in case of success. + * \return \e false in case of error. + * \sa IParameter + */ + virtual bool addOutputParameter(const CIdentifier& id, const CString& name, EParameterType type, + const CIdentifier& subTypeID = CIdentifier::undefined()) = 0; + /** + * \brief Adds an input trigger + * \param id [in] : the identifier for this trigger + * \param name [in] : the name for this trigger + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool addInputTrigger(const CIdentifier& id, const CString& name) = 0; + /** + * \brief Adds an output trigger + * \param id [in] : the identifier for this trigger + * \param name [in] : the name for this trigger + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool addOutputTrigger(const CIdentifier& id, const CString& name) = 0; + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Algorithm_AlgorithmProto) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/algorithm/ovIAlgorithmProxy.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/algorithm/ovIAlgorithmProxy.h new file mode 100644 index 0000000..68bdb85 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/algorithm/ovIAlgorithmProxy.h @@ -0,0 +1,180 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +class IParameter; + +/** + * \class IAlgorithmProxy + * \brief Application interface to an algorithm plugin + * \author Yann Renard (INRIA/IRISA) + * \date 2007-11-21 + * \ingroup Group_Algorithm + * \ingroup Group_Kernel + * \sa Plugins::IAlgorithm + * + * This class is an easier to user interface to an IAlgorihtm instanciated + * object. Its purpose is to automatically handle input / output trigger + * activation and to help in calling processing methods. + */ +class OV_API IAlgorithmProxy : public IKernelObject +{ +public: + + /** \name Input parameters */ + //@{ + + /** + * \brief Gets next input parameter identifier given the previous input parameter + * \param previousID [in] : the previous input parameter + * \return the next input parameter identifier if existing. + * \return \c CIdentifier::undefined() if the previous was the last input parameter identifier. + * \note Passing \c CIdentifier::undefined() as \c previousID will + * cause this function to return the first input parameter identifier. + */ + virtual CIdentifier getNextInputParameterIdentifier(const CIdentifier& previousID) const = 0; + /** + * \brief Gets the name of a specific input parameter + * \param id [in] : the identifier of the parameter which name should be returned + * \return The name of the specified input parameter on success + * \return En empty string on error + */ + virtual CString getInputParameterName(const CIdentifier& id) const = 0; + /** + * \brief Gets the parameter details of a specific input parameter + * \param id [in] : the identifier of the parameter which details should be returned + * \return the parameter pointer that corresponds to the provided id. + * \return \c NULL in case of error. + */ + virtual IParameter* getInputParameter(const CIdentifier& id) = 0; + + //@} + /** \name Output parameters */ + //@{ + + /** + * \brief Gets next output parameter identifier given the previous output parameter + * \param previousID [in] : the previous output parameter + * \return the next output parameter identifier if existing. + * \return \c CIdentifier::undefined() if the previous was the last output parameter identifier. + * \note Passing \c CIdentifier::undefined() as \c previousID will + * cause this function to return the first output parameter identifier. + */ + virtual CIdentifier getNextOutputParameterIdentifier(const CIdentifier& previousID) const = 0; + /** + * \brief Gets the name of a specific input parameter + * \param id [in] : the identifier of the parameter which name should be returned + * \return The name of the specified input parameter on success + * \return En empty string on error + */ + virtual CString getOutputParameterName(const CIdentifier& id) const = 0; + /** + * \brief Gets the parameter details of a specific output parameter + * \param id [in] : the identifier of the parameter which details should be returned + * \return the parameter pointer that corresponds to the provided id. + * \return \c NULL in case of error. + */ + virtual IParameter* getOutputParameter(const CIdentifier& id) = 0; + + //@} + /** \name Trigger management */ + //@{ + + /** + * \brief Gets next output trigger identifier given the previous output trigger + * \param previousID [in] : the previous output trigger + * \return the next output trigger identifier if existing. + * \return \c CIdentifier::undefined() if the previous was the last output trigger identifier. + * \note Passing \c CIdentifier::undefined() as \c previousID will + * cause this function to return the first output trigger identifier. + */ + virtual CIdentifier getNextOutputTriggerIdentifier(const CIdentifier& previousID) const = 0; + /** + * \brief Gets the name of a specific output trigger + * \param id [in] : the identifier of the trigger which name should be returned + * \return The name of the specified output trigger on success + * \return En empty string on error + */ + virtual CString getOutputTriggerName(const CIdentifier& id) const = 0; + /** + * \brief Tests whether an output trigger is activated or not. + * \param id [in] : the identifier of the output trigger which activation status should be returned + * \return \e true if the provided trigger is currently active. + * \return \e false if the provided trigger is not currently active or does not exist. + */ + virtual bool isOutputTriggerActive(const CIdentifier& id) const = 0; + + /** + * \brief Gets next input trigger identifier given the previous input trigger + * \param previousID [in] : the previous input trigger + * \return the next input trigger identifier if existing. + * \return \c CIdentifier::undefined() if the previous was the last input trigger identifier. + * \note Passing \c CIdentifier::undefined() as \c previousID will + * cause this function to return the first input trigger identifier. + */ + virtual CIdentifier getNextInputTriggerIdentifier(const CIdentifier& previousID) const = 0; + /** + * \brief Gets the name of a specific input trigger + * \param id [in] : the identifier of the trigger which name should be returned + * \return The name of the specified input trigger on success + * \return En empty string on error + */ + virtual CString getInputTriggerName(const CIdentifier& id) const = 0; + /** + * \brief Activates an input trigger before calling the processing function. + * \param id [in] : the identifier of the input to activate + * \param state [in]: the new trigger state this input trigger should take (\e true for active, \e false for inactive) + * \return \e true in case the state was correctly changed. + * \return \e false in case the state was not changed or the provided trigger id does not exist. + */ + virtual bool activateInputTrigger(const CIdentifier& id, bool state) = 0; + + //@} + /** \name Algorithm functions */ + //@{ + + /** + * \brief Initializes the algorithm + * \return \e true in case of success. + * \return \e false in case of error. + * \note The algorithm context is managed internally + * \pre The algorithm is not yet initialized + */ + virtual bool initialize() = 0; + /** + * \brief Uninitializes the algorithm + * \return \e true in case of success. + * \return \e false in case of error. + * \note The algorithm context is managed internally + * \pre The algorithm is initialized + */ + virtual bool uninitialize() = 0; + /** + * \brief Calls the processing method of the algorithm + * \return \e true in case of success. + * \return \e false in case of error. + * \note The algorithm context is managed internally + * \pre The algorithm is initialized + */ + virtual bool process() = 0; + /** + * \brief Activates an input trigger and immediatly calls the processing method + * \param id [in] : the identifier of the input trigger to activate + * \return \e true in case of success. + * \return \e false in case the trigger does not exist or the processing did not succeed. + * \note The algorithm context is managed internally + * \pre The algorithm is initialized + */ + virtual bool process(const CIdentifier& id) = 0; + + + virtual bool isAlgorithmDerivedFrom(const CIdentifier& classID) = 0; + + //@} + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Algorithm_AlgorithmProxy) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/configuration/ovIConfigurationKeywordExpandCallback.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/configuration/ovIConfigurationKeywordExpandCallback.h new file mode 100644 index 0000000..e4b8b19 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/configuration/ovIConfigurationKeywordExpandCallback.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +namespace OpenViBE { +class CString; + +namespace Kernel { +/** + * \class IConfigurationKeywordExpandCallback + * \author Jozef Legeny (Mensia Technologies) + * \date 2014-05-06 + * \brief Callback used for overriding a keyword in IConfigurationManager + * \ingroup Group_Config + * \ingroup Group_Kernel + */ +class OV_API IConfigurationKeywordExpandCallback +{ +public: + + virtual ~IConfigurationKeywordExpandCallback() {} + virtual bool expand(const CString& in, CString& out) const = 0; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/configuration/ovIConfigurationManager.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/configuration/ovIConfigurationManager.h new file mode 100644 index 0000000..3a44ba3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/configuration/ovIConfigurationManager.h @@ -0,0 +1,253 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +class IConfigurationKeywordExpandCallback; + +/** + * \class IConfigurationManager + * \author Yann Renard (INRIA/IRISA) + * \date 2008-11-05 + * \brief Manager for all kind of configuration + * \ingroup Group_Config + * \ingroup Group_Kernel + */ +class OV_API IConfigurationManager : public IKernelObject +{ +public: + + /** + * \brief Clears the content of this configuration manager + */ + virtual void clear() = 0; + + /** + * \brief Parses a configuration file and adds its content as token configuration + * \param filenameWildCard [in] : a wildcard of the files to parse & add + * \return \e true in case of success + * \return \e false in case of error + * \note In case the wildcard matches several filenames, it is up to this + * configuration manager to choose the order it parses the files in. + * \sa IConfigurationManager::createConfigurationToken + */ + virtual bool addConfigurationFromFile(const CString& filenameWildCard) = 0; + + /** + * \brief Creates a new configuration token in this configuration manager + * \param name [in] : the name of the configuration token + * \param value [in] the value of the configuration token + * \return the identifier of the newly created token in case of success + * \return \c CIdentifier::undefined() in case of error + * \sa IConfigurationManager::releaseConfigurationToken + * \sa IConfigurationManager::createConfigurationToken + */ + virtual CIdentifier createConfigurationToken(const CString& name, const CString& value) = 0; + /** + * \brief Removes an existing configuration token + * \param id [in] : the identifier of the token to remove + * \return \e true in case of success + * \return \e false in case of error + * \sa IConfigurationManager::addConfigurationFromFile + * \sa IConfigurationManager::createConfigurationToken + */ + virtual bool releaseConfigurationToken(const CIdentifier& id) = 0; + /** + * \brief Iterates on the existing configuration tokens of this configuration manager + * \param prevConfigTokenID [in] : the identifier of the token to start the iteration from + * \return the identifier of the next configuration token in case of success + * \return \c CIdentifier::undefined() in case there is no more token to iterate on + * + * Typicall use of this function is : + * \code + * CIdentifier tokenID = CIdentifier::undefined(); // defaults to CIdentifier::undefined() + * while((tokenID=configManager->getNextConfigurationTokenIdentifier(tokenID)) != CIdentifier::undefined()) + * { + * // do some stuff with current token identified with tokenID + * } + * \endcode + */ + virtual CIdentifier getNextConfigurationTokenIdentifier(const CIdentifier& prevConfigTokenID) const = 0; + + /** + * \brief Gets a token's name from its id + * \param id [in] : the token id which name should be returned + * \return the name of the token in case of success + * \return an empty string in case of error + * \sa IConfigurationManager::getConfigurationTokenValue + */ + virtual CString getConfigurationTokenName(const CIdentifier& id) const = 0; + /** + * \brief Gets a token's value from its id + * \param id [in] : the token id which value should be returned + * \return the value (unexapanded) of the token in case of success + * \return an empty string in case of error + * \sa IConfigurationManager::getConfigurationTokenName + * \sa IConfigurationManager::expand and others + * \note the returned value is not expanded by this configuration manager ; only the + * value that was passed at creation time is returned. If you want to expand + * things, please use IConfigurationManager::expand + */ + virtual CString getConfigurationTokenValue(const CIdentifier& id) const = 0; + + /** + * \brief Changes the name of an exisiting token + * \param id [in] : the identifier of the token which name should be changed + * \param name [in] : the new name of the configuration token + * \return \e true in case of success + * \return \e false in case of error + * \note it is not valid to add a token using this function + * \sa IConfigurationManager::createConfigurationToken + * \sa IConfigurationManager::addConfigurationFromFile + * \sa IConfigurationManager::setConfigurationTokenValue + */ + virtual bool setConfigurationTokenName(const CIdentifier& id, const CString& name) = 0; + /** + * \brief Changes the value of an exisiting token + * \param id [in] : the identifier of the token which value should be changed + * \param value [in] : the new value of the configuration token + * \return \e true in case of success + * \return \e false in case of error + * \note it is not valid to add a token using this function + * \sa IConfigurationManager::createConfigurationToken + * \sa IConfigurationManager::addConfigurationFromFile + * \sa IConfigurationManager::setConfigurationTokenName + */ + virtual bool setConfigurationTokenValue(const CIdentifier& id, const CString& value) = 0; + + /** + * \brief Adds a token or replaces the value of a token. + * \param name [in] : the name of the token which value should be changed + * \param value [in] : the new value of the configuration token + * \return \e true in case of success + * \return \e false in case of error + * \note new tokens can be added with this function + * \note this call is not recursive + * \sa IConfigurationManager::createConfigurationToken + * \sa IConfigurationManager::addConfigurationFromFile + * \sa IConfigurationManager::setConfigurationTokenName + */ + virtual bool addOrReplaceConfigurationToken(const CString& name, const CString& value) = 0; + + /** + * \brief Searches the identifier of a token with a given name + * \param name [in] : the name of the token which identifier should be found + * \param recursive [in] : when set to true, asks this configuration manager to propagate + * the request to parent configuration manager (if any). + * \return the identifier of the token with the actual name in case of success + * \return \c CIdentifier::undefined() in case of error + * \note if \c recursive is set to \e true then the returned identifier should + * not be considered as the identifier of an existing token in this configuration manager + * as it may have been returned from a parent configuration manager. Instead, one must consider + * the returned identifier as a kind of boolean value : such token actually exists or such + * token does not exist. + */ + virtual CIdentifier lookUpConfigurationTokenIdentifier(const CString& name, bool recursive = false) const = 0; + /** + * \brief Searches the value of a token with a given name + * \param name [in] : the name of the token which value should be found + * \return the value of the token with the actual name in case of success + * \note This function differs of \c getConfigurationTokenName in the sense that it + * recursively requests a token value to parent configuration managers until it + * finds one (if any). It also differs from the \c expand function in the sense that + * it takes a token name as input but does not expand its value when it finds it. + */ + virtual CString lookUpConfigurationTokenValue(const CString& name) const = 0; + + + /** + * \brief Adds a new parser for special variables + * \param keyword [in] : keyword to overload + * \param callback [in] : handler for the keyword + * \return true in case of success + * \note This parser provides a function that will handle expanding of + * tokens like $keyword{sometext}. "sometext" will be passed to the + * callback; + */ + virtual bool registerKeywordParser(const CString& keyword, const IConfigurationKeywordExpandCallback& callback) = 0; + + /** + * \brief Removes the keyword parser for a given keyword + * \param keyword [in] : keyword of the parser to remove + * \return true in case of success + */ + virtual bool unregisterKeywordParser(const CString& keyword) = 0; + + /** + * \brief Removes the keyword parser for a given keyword + * \param callback [in] : handler for the keyword + * \return true in case of success + */ + virtual bool unregisterKeywordParser(const IConfigurationKeywordExpandCallback& callback) = 0; + + /** + * \brief Expands a string to an expanded string based on its use of configuration tokens + * \param expression [in] : the string that you want to expan + * \return the expanded string + * \sa IConfigurationManager::expandAsFloat + * \sa IConfigurationManager::expandAsInteger + * \sa IConfigurationManager::expandAsUInteger + * \sa IConfigurationManager::expandAsBoolean + * \sa IConfigurationManager::expandAsEnumerationEntryValue + * + * Typical use of this function is : + * \code + * configManager->expand("${TokenName}") + * \endcode + */ + virtual CString expand(const CString& expression) const = 0; + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Config_ConfigManager) + + virtual CString expandOnlyKeyword(const CString& keyword, const CString& expression, bool preserveBackslashes = false) const = 0; + /** + * \brief Expands a string to a floating point value based on its use of configuration tokens + * \param in [in] : the string that you want to expand + * \param fallbackValue [in] : a fall back value to return in case the expanded + * string can not be parsed as a floating point value + * \return the expanded value + * \sa IConfigurationManager::expand + */ + virtual double expandAsFloat(const CString& in, double fallbackValue = 0) const = 0; + /** + * \brief Expands a string to an integer value based on its use of configuration tokens + * \param in [in] : the string that you want to expand + * \param fallbackValue [in] : a fall back value to return in case the expanded + * string can not be parsed as an integer value + * \return the expanded value + * \sa IConfigurationManager::expand + */ + virtual int64_t expandAsInteger(const CString& in, int64_t fallbackValue = 0) const = 0; + /** + * \brief Expands a string to an unsigned integer value based on its use of configuration tokens + * \param in [in] : the string that you want to expand + * \param fallbackValue [in] : a fall back value to return in case the expanded + * string can not be parsed as an unsigned integer value + * \return the expanded value + * \sa IConfigurationManager::expand + */ + virtual uint64_t expandAsUInteger(const CString& in, uint64_t fallbackValue = 0) const = 0; + /** + * \brief Expands a string to a boolean value based on its use of configuration tokens + * \param in [in] : the string that you want to expand + * \param fallbackValue [in] : a fall back value to return in case the expanded + * string can not be parsed as a boolean value + * \return the expanded value + * \sa IConfigurationManager::expand + */ + virtual bool expandAsBoolean(const CString& in, bool fallbackValue = true) const = 0; + /** + * \brief Expands a string to an enumeration entry value based on its use of configuration tokens + * \param in [in] : the string that you want to expand + * \param enumerationTypeID [in] : the enumeration type to use + * \param fallbackValue [in] : a fall back value to return in case the expanded + * string can not be parsed as an enumeration entry value + * \return the expanded value + * \sa IConfigurationManager::expand + * \sa ITypeManager + */ + virtual uint64_t expandAsEnumerationEntryValue(const CString& in, const CIdentifier& enumerationTypeID, uint64_t fallbackValue = 0) const = 0; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/error/ovErrorType.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/error/ovErrorType.h new file mode 100644 index 0000000..7ab355f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/error/ovErrorType.h @@ -0,0 +1,72 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +namespace OpenViBE { +namespace Kernel { +/** + * \class ErrorType + * \author Charles Garraud (Inria) + * \date 2016-07-13 + * \brief List of error types + * \ingroup Group_Error + * \ingroup Group_Kernel + */ +enum class ErrorType +{ + // Misc + NoErrorFound = 0, ///< Used when no error occurs */ + Unknown = 1, ///< Unknown error */ + Internal = 2, ///< Used mainly for high-level errors generated by low-level errors */ + NotImplemented = 3, ///< Used when the body of an API call is not yet implemented */ + ExceptionCaught = 4, ///< Used to report an error related to a c++ expection caught in the system */ + BadCall = 5, ///< Used when an API call is incompatible with the current state */ + BadProcessing = 6, ///< Used when a processing/computation failed */ + BadVersion = 7, ///< Used for plugin or api version mismatch */ + // Value setting + BadValue = 10, ///< Used when an entity is given an invalid value */ + BadArgument = 11, ///< Used when a function is fed with invalid arguments */ + BadCast = 12, ///< Used when a cast failed */ + OutOfBound = 13, ///< Used for out of range value (specific case of BadValue/BadArguments) */ + Overflow = 14, ///< Used to report arithmetic overflow */ + BadParsing = 15, ///< Used to report data parsing error */ + // Alloc + BadAlloc = 20, ///< Used when an allocation failed */ + OutOfMemory = 21, ///< Used when the system is running out of memory (specific case of BadAlloc) */ + // Resource + ResourceNotFound = 30, ///< Used to report that a resource (logical or physical) was not found */ + BadResourceCreation = 31, ///< Used to report that a resource (logical or physical) could not be created */ + // IO + BadFileRead = 40, ///< Used when opening a file failed */ + BadFileWrite = 41, ///< Used when writing to a file failed */ + BadFileParsing = 42, ///< Used when reading succeeded but parsing of data within the file failed */ + BadNetworkConnection = 43, ///< Used when network connection failed */ + BadXMLSchemaValidation = 44, ///< Used when validation of xml files against xsd schema fails */ + // Config + BadConfig = 50, ///< Used when a given configuration state is erroneous */ + BadInput = 51, ///< Used when an input (box, algorithm) is missing, empty or has a wrong value */ + BadOutput = 52, ///< Used when an output (box, algorithm) is missing, empty or has a wrong value */ + BadTrigger = 53, ///< Used when an algorithm trigger has a wrong value */ + BadSetting = 54 ///< Used when a box setting has a wrong value */ +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/error/ovIError.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/error/ovIError.h new file mode 100644 index 0000000..762432f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/error/ovIError.h @@ -0,0 +1,81 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class IError + * \author Charles Garraud (Inria) + * \date 2016-07-12 + * \brief Interface for Kernel error implementation + * \ingroup Group_Error + * \ingroup Group_Kernel + * + * IError interface aims at providing information about an error + * occurring in the framework. One specific concept here is the + * notion of nested errors. In a call stack, it can be + * interesting to catch a n-1 level error and enhance it instead + * of rethrowing it directy unchanged. In this case, we say + * the level n-1 error is nested into the level n error. + */ +class OV_API IError : public IKernelObject +{ +public: + + IError() {} + ~IError() override {} + IError(const IError&) = delete; + IError& operator=(const IError&) = delete; + + /** + * \brief Retrieve error description + */ + virtual const char* getErrorString() const = 0; + + /** + * \brief Retrieve error location + * \return the error location with file:line format + */ + virtual const char* getErrorLocation() const = 0; + + /** + * \brief Retrieve error type + */ + virtual ErrorType getErrorType() const = 0; + + /** + * \brief Retrieve nested error + * \return the nested error if there is one, nullptr otherwise + * + * \warning The error keeps the ownership of the nested error. + * Therefore the API consumer is not responsible for its + * life cycle/management + */ + virtual const IError* getNestedError() const = 0; + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Error_Error) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/error/ovIErrorManager.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/error/ovIErrorManager.h new file mode 100644 index 0000000..2422bc4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/error/ovIErrorManager.h @@ -0,0 +1,115 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +#include "../ovIKernelObject.h" +#include "ovErrorType.h" + +namespace OpenViBE { +namespace Kernel { +class IError; + +/** + * \class IErrorManager + * \author Charles Garraud (Inria) + * \date 2016-07-12 + * \brief Interface for Kernel error handler implementation + * \ingroup Group_Error + * \ingroup Group_Kernel + * + * This manager is reponsible for handling errors in the framework. + * Errors in the framework are considered as not acceptable behavior + * that can be detected and handled by the system. The concept of error + * is thus independant of warning or fatal crashes that must be handled + * separately. + */ +class OV_API IErrorManager : public IKernelObject +{ +public: + + /** + * \brief Push error to the manager + * \param type the error type + * \param description a self-explanatory description message + * + * Errors already added to the manager will be nested in the + * newly added error. + */ + virtual void pushError(ErrorType type, const char* description) = 0; + + /** + * \brief Push error with location information to the manager + * \param type the error type + * \param description a self-explanatory description of the error + * \param filename the source file where the error was detected + * \param line the line number where the error was detected + * + * Errors already added to the manager will be nested in the + * newly added error. + */ + virtual void pushErrorAtLocation(ErrorType type, const char* description, const char* filename, size_t line) = 0; + + /** + * \brief Release manager errors + * + * Release last error added to the manager and potentially + * all the nested errors recursively. + * + * \warning After this call, do not use pointers to IError retrieved + * before. It will lead to unexpected behavior mostly due + * to dangling pointers. + */ + virtual void releaseErrors() = 0; + + /** + * \brief Check for existing errors in the manager + * \return true if manager contains errors, false otherwise + */ + virtual bool hasError() const = 0; + + /** + * \brief Get last error added to the manager + * \return the error if manager contains errors, nullptr otherwise + * + * \warning The manager keeps the ownership of IError instances. + * Therefore the API consumer is not responsible for their + * life cycle/management and must use releaseErrors to + * release them. + */ + virtual const IError* getLastError() const = 0; + + /** + * \brief Get description of last error added to the manager + * \return the description if manager contains errors, empty string otherwise + */ + virtual const char* getLastErrorString() const = 0; + + /** + * \brief Get type of last error added to the manager + * \return the type if manager contains error, NoErrorFound otherwise + */ + virtual ErrorType getLastErrorType() const = 0; + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Error_ErrorManager) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/log/ovILogListener.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/log/ovILogListener.h new file mode 100644 index 0000000..7f1355b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/log/ovILogListener.h @@ -0,0 +1,241 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { + +/// Log Levels. +enum ELogLevel +{ + LogLevel_First, + LogLevel_None, + LogLevel_Debug, + LogLevel_Benchmark, + LogLevel_Trace, + LogLevel_Info, + LogLevel_Warning, + LogLevel_ImportantWarning, + LogLevel_Error, + LogLevel_Fatal, + LogLevel_Last, +}; + +inline std::string toString(const ELogLevel level) +{ + switch (level) + { + case LogLevel_First: return "[ FIRST ] "; + case LogLevel_None: return "[ NONE ] "; + case LogLevel_Debug: return "[ DEBUG ] "; + case LogLevel_Benchmark: return "[ BENCH ] "; + case LogLevel_Trace: return "[ TRACE ] "; + case LogLevel_Info: return "[ INF ] "; + case LogLevel_Warning: return "[WARNING] "; + case LogLevel_ImportantWarning: return "[WARNING] "; + case LogLevel_Error: return "[ ERROR ] "; + case LogLevel_Fatal: return "[ FATAL ] "; + case LogLevel_Last: return "[ LAST ] "; + default: return "[UNKNOWN] "; + } +} + +/// Log colors. +enum ELogColor +{ + LogColor_ForegroundColorRedBit = 0x00000001, + LogColor_ForegroundColorGreenBit = 0x00000002, + LogColor_ForegroundColorBlueBit = 0x00000004, + LogColor_ForegroundColorBit = 0x00000008, + LogColor_ForegroundLightStateBit = 0x00000010, + LogColor_ForegroundLightBit = 0x00000020, + LogColor_ForegroundBlinkStateBit = 0x00000040, + LogColor_ForegroundBlinkBit = 0x00000080, + LogColor_ForegroundBoldStateBit = 0x00000100, + LogColor_ForegroundBoldBit = 0x00000200, + LogColor_ForegroundUnderlineStateBit = 0x00000400, + LogColor_ForegroundUnderlineBit = 0x00000800, + + LogColor_BackgroundColorRedBit = 0x00001000, + LogColor_BackgroundColorGreenBit = 0x00002000, + LogColor_BackgroundColorBlueBit = 0x00004000, + LogColor_BackgroundColorBit = 0x00008000, + LogColor_BackgroundLightStateBit = 0x00010000, + LogColor_BackgroundLightBit = 0x00020000, + LogColor_BackgroundBlinkStateBit = 0x00040000, + LogColor_BackgroundBlinkBit = 0x00080000, + + LogColor_ForegroundBit = 0x00100000, + LogColor_BackgroundBit = 0x00200000, + LogColor_PushStateBit = 0x00400000, + LogColor_PopStateBit = 0x00800000, + LogColor_ResetBit = 0x08000000, + + LogColor_Default = 0x00000000, + + LogColor_ForegroundBlack = 0x00100008, + LogColor_ForegroundRed = 0x00100009, + LogColor_ForegroundGreen = 0x0010000A, + LogColor_ForegroundYellow = 0x0010000B, + LogColor_ForegroundBlue = 0x0010000C, + LogColor_ForegroundMagenta = 0x0010000D, + LogColor_ForegroundCyan = 0x0010000E, + LogColor_ForegroundWhite = 0x0010000F, + LogColor_ForegroundLightOff = 0x00100020, + LogColor_ForegroundLightOn = 0x00100030, + LogColor_ForegroundBlinkOff = 0x00100080, + LogColor_ForegroundBlinkOn = 0x001000C0, + LogColor_ForegroundBoldOff = 0x00100200, + LogColor_ForegroundBoldOn = 0x00100300, + LogColor_ForegroundUnderlineOff = 0x00100800, + LogColor_ForegroundUnderlineOn = 0x00100C00, + + LogColor_BackgroundBlack = 0x00208000, + LogColor_BackgroundRed = 0x00209000, + LogColor_BackgroundGreen = 0x0020A000, + LogColor_BackgroundYellow = 0x0020B000, + LogColor_BackgroundBlue = 0x0020C000, + LogColor_BackgroundMagenta = 0x0020D000, + LogColor_BackgroundCyan = 0x0020E000, + LogColor_BackgroundWhite = 0x0020F000, + LogColor_BackgroundLightOff = 0x00220000, + LogColor_BackgroundLightOn = 0x00230000, + LogColor_BackgroundBlinkOff = 0x00280000, + LogColor_BackgroundBlinkOn = 0x002C0000, +}; + +/** + * \class ILogListener + * \brief Log manager's listener interface + * \author Yann Renard (INRIA/IRISA) + * \date 2006-06-03 + * \ingroup Group_Log + * \ingroup Group_Kernel + * + * The log listener is derived and implemented such as it can + * effectively process the log action. It could do it in a + * file, in a notification area, or whatever fits your needs. + * Objects to log are sent to it thanks to the log manager + * after a listener has been registered to it. + */ +class OV_API ILogListener : public IKernelObject +{ +public: + + /** \name Log level activation */ + //@{ + + /** + * \brief Tests whether a log level is active or not + * \param level [in] : the log level which has to be tested + * \return \e true if this log level is active. + * \return \e false if this log level is not active. + */ + virtual bool isActive(const ELogLevel level) = 0; + /** + * \brief Changes the activation status of a specific log level + * \param level [in] : the log level which status has to be changed + * \param active [in] : a boolean telling whether this level should be active or not + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool activate(const ELogLevel level, const bool active) = 0; + /** + * \brief Changes the activation status of a specific range of log level + * \param startLogLevel [in] : the first log level which status has to be changed + * \param endLogLevel [in] : the last log level which status has to be changed + * \param active [in] : a boolean telling whether these levels should be active or not + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool activate(const ELogLevel startLogLevel, const ELogLevel endLogLevel, const bool active) = 0; + /** + * \brief Changes the activation status of all log levels at once + * \param active [in] : a boolean telling whether the levels should be active or not + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool activate(const bool active) = 0; + + //@} + /** \name Logging function */ + //@{ + + /** + * \brief Logs a formatted time value (64 bits unsigned integer) + * \param value [in] : the value that should be logged + */ + virtual void log(const CTime value) = 0; + /** + * \brief Logs a 64 bits unsigned integer + * \param value [in] : the value that should be logged + */ + virtual void log(const uint64_t value) = 0; + /** + * \brief Logs a 32 bits unsigned integer + * \param value [in] : the value that should be logged + */ + virtual void log(const uint32_t value) = 0; + /** + * \brief Logs a 64 bits signed integer + * \param value [in] : the value that should be logged + */ + virtual void log(const int64_t value) = 0; + /** + * \brief Logs a 32 bits signed integer + * \param value [in] : the value that should be logged + */ + virtual void log(const int value) = 0; + /** + * \brief Logs a 64 bits floating point value + * \param value [in] : the value that should be logged + */ + virtual void log(const double value) = 0; + /** + * \brief Logs a boolean value + * \param value [in] : the value that should be logged + */ + virtual void log(const bool value) = 0; + /** + * \brief Logs an identifier value + * \param value [in] : the value that should be logged + */ + virtual void log(const CIdentifier& value) = 0; + /** + * \brief Logs an OpenViBE string value + * \param value [in] : the value that should be logged + */ + virtual void log(const CString& value) = 0; + /** + * \brief Logs a string + * \param value [in] : the value that should be logged + */ + virtual void log(const std::string& value) = 0; + /** + * \brief Logs an ASCII string value + * \param value [in] : the value that should be logged + */ + virtual void log(const char* value) = 0; + + //@} + /** \name Manipulators */ + //@{ + + /** + * \brief Changes the log level + * \param level [in] : the new log level + */ + virtual void log(const ELogLevel level) = 0; + /** + * \brief Changes the log color + * \param color [in] : the new log color + */ + virtual void log(const ELogColor color) = 0; + + //@} + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Log_LogListener) +}; + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/log/ovILogManager.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/log/ovILogManager.h new file mode 100644 index 0000000..ee221bb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/log/ovILogManager.h @@ -0,0 +1,58 @@ +#pragma once + +#include "ovILogListener.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class ILogManager + * \brief Log manager + * \author Yann Renard (INRIA/IRISA) + * \date 2006-06-03 + * \ingroup Group_Log + * \ingroup Group_Kernel + * + * The log manager is responsible for keeping a trace of all the messages the application could send as debug output. Such information is not + * useful most of the cases but could become crucial in some cases. Thus there are different levels of activation for the log manager + * to work. The log manager forwards each log request to its registered log listeners that effectively do the log the way they want + * (be it a status window, a console, a file, whatever). See ILogListener for more details. + */ +class OV_API ILogManager : public ILogListener +{ +public: + + /** + * \brief Registers a new log listener + * \param listener [in] : the new listener to register + * \return \e true in case of success. \e false in case of error. + */ + virtual bool addListener(ILogListener* listener) = 0; + /** + * \brief Removes a registered listener + * \param listener [in] : the listener to unregister + * \return \e true in case of success. \e false in case of error. + */ + virtual bool removeListener(ILogListener* listener) = 0; + + _IsDerivedFromClass_(ILogListener, OV_ClassId_Kernel_Log_LogManager) +}; + +/** + * \brief Stream output operator + * \param logManager [in] : the log manager that takes the object + * \param object [in] : the object to log + * \return The log manager itself + * \sa ILogManager + * + * This function helps in logging different objects thanks to the + * stream operator. The log manager can almost be used as any std + * ostream object. + */ +template +ILogManager& operator <<(ILogManager& logManager, const T& object) +{ + logManager.log(object); + return logManager; +} +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/metabox/ovIMetaboxManager.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/metabox/ovIMetaboxManager.h new file mode 100755 index 0000000..4f2e2ac --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/metabox/ovIMetaboxManager.h @@ -0,0 +1,93 @@ +#pragma once + +#include "../ovIKernelObject.h" +#include "../../metaboxes/ovIMetaboxObjectDesc.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class IMetaboxManager + * \brief Metabox manager + * \author Thierry Gaugry (INRIA/Mensia) + * \date 2017-04-12 + * \ingroup Group_Metabox + * \ingroup Group_Kernel + * + * The metabox manager is in charge of loading/unloading metaboxes + * modules (defined in OV_ScenarioImportContext_OnLoadMetaboxImport import context) + * containing OpenViBE metaboxes. + * It also provides functions in order to list metabox descriptors, + * create or release metabox objects... + */ +class OV_API IMetaboxManager : public IKernelObject +{ +public: + + /** \name Metabox modules/descriptors management */ + //@{ + + /** + * \brief Loads new metaboxes module file(s) + * \param[in] fileNameWildCard : a wild card with the file(s) to search metaboxes in + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool addMetaboxesFromFiles(const CString& fileNameWildCard) = 0; + + /** + * \brief Gets next metabox object descriptor identifier + * \param[in] previousID : The identifier + * for the preceeding metabox object descriptor + * \return The identifier of the next metabox object descriptor in case of success. + * \retval \c CIdentifier::undefined() on error. + * \note Giving \c CIdentifier::undefined() as \c previousID + * will cause this function to return the first metabox object + * descriptor identifier. + */ + virtual CIdentifier getNextMetaboxObjectDescIdentifier(const CIdentifier& previousID) const = 0; + + /** + * \brief Gets details on a specific metabox object descriptor + * \param[in] id : the metabox object descriptor identifier which details should be returned + * \return the corresponding metabox object descriptor pointer. + */ + virtual const Plugins::IPluginObjectDesc* getMetaboxObjectDesc(const CIdentifier& id) const = 0; + + /** + * \brief Sets details on a specific metabox object descriptor + * \param[in] id : the metabox object descriptor identifier + * \param[in] desc : the metabox object descriptor + */ + virtual void setMetaboxObjectDesc(const CIdentifier& id, Plugins::IPluginObjectDesc* desc) = 0; + + + /** + * \brief Gets the path of the scenario of a specific metabox + * \param[in] id : the metabox object descriptor identifier which path should be returned + * \return the path to the scenario file of the metabox. + */ + virtual CString getMetaboxFilePath(const CIdentifier& id) const = 0; + /** + * \brief Sets the path of the scenario of a specific metabox + * \param[in] id : the metabox object descriptor identifier + * \param[in] filePath : the metabox scenario path + */ + virtual void setMetaboxFilePath(const CIdentifier& id, const CString& filePath) = 0; + + /** + * \brief Gets the hash of the metabox + * \param[in] id : the metabox object descriptor identifier which hash should be returned + * \return the hash of the metabox. + */ + virtual CIdentifier getMetaboxHash(const CIdentifier& id) const = 0; + /** + * \brief Sets the hash of the metabox + * \param[in] id : the metabox object descriptor identifier + * \param[in] hash : the metabox hash + */ + virtual void setMetaboxHash(const CIdentifier& id, const CIdentifier& hash) = 0; + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Metabox_MetaboxManager) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIConfigurable.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIConfigurable.h new file mode 100644 index 0000000..b31546c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIConfigurable.h @@ -0,0 +1,113 @@ +#pragma once + +#include "ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +class IParameter; + +/** + * \brief Parameter type enumeration for a configurable object + * \sa IConfigurable + * \sa IParameter + */ +enum EParameterType +{ + ParameterType_None, ///< No parameter + ParameterType_Integer, ///< Integer parameter, 64bit + ParameterType_UInteger, ///< Unsigned integer parameter, 64bit + ParameterType_Enumeration, ///< Enumeration integer parameter + ParameterType_Boolean, ///< Boolean parameter + ParameterType_Float, ///< Float parameter, 64bit + ParameterType_String, ///< String parameter + ParameterType_Identifier, ///< Identifier parameter + ParameterType_Matrix, ///< Matrix pointer parameter + ParameterType_StimulationSet, ///< Stimulation set pointer parameter + ParameterType_MemoryBuffer, ///< Memory buffer pointer parameter + ParameterType_Object, ///< Object pointer parameter + ParameterType_Pointer, ///< Raw pointer parameter +}; + +/** + * \class IConfigurable + * \brief Configurable object interface + * \author Yann Renard (INRIA/IRISA) + * \date 2007-11-21 + * \sa IParameter + * \ingroup Group_Kernel + * + * An instance of this class is able to self create several type of parameters + * in order to be used by external code. The parameter handling is very abstract + * but its use is made easier thanks to the parameter handler. See IParameter and + * TParameterHandler for more details. + */ +class OV_API IConfigurable : public IKernelObject +{ +public: + + /** + * \brief Enumerates parameter identifiers for this configurable. + * \param previousID [in] : the identifier which next identifier has to be returned + * \return the parameter identifier following the provided parameter identifier. + * \note if \c previousID is \e CIdentifier::undefined() , the first parameter identifier is returned + * \note getting \e CIdentifier::undefined() has result means there are no more identifier after \c previousID + * + * Sample code to iterate on parameter identifiers : + * + * \code + * IConfigurable* configurable= // ... + * CIdentifier currentID=CIdentifier::undefined(); + * while((currentID=configurable->getNextParameterIdentifier(currentID))!=CIdentifier::undefined()) + * { + * IParameter* parameter=configurable->getParameter(currentID); + * // ... + * } + * \endcode + */ + virtual CIdentifier getNextParameterIdentifier(const CIdentifier& previousID) const = 0; + + /** + * \brief Gets a specific parameter given its id + * \param id [in] : the identifier of the parameter to get + * \return a pointer to the corresponding parameter in case of success. + * \return \c NULL in case of error. + */ + virtual IParameter* getParameter(const CIdentifier& id) = 0; + /** + * \brief Replaces the parameter with a client handled object + * \param id [in] : the identifier of the parameter to replace + * \param parameter [in] : the parameter object to put in place of the old parameter + * \return \e true in case of success. + * \return \e false in case of error. + * \note The parameter should have been created before and should exist. + * \note Even if a new paramter is affected to a configurable, the memory management + * of this parameter remains to the responsability of the client code. Thus + * none of \c removeParameter nor configurable destruction will release + * this parameter object. The caller should take care of this when needed. + */ + virtual bool setParameter(const CIdentifier& id, IParameter& parameter) = 0; + /** + * \brief Creates a new parameter of a specific type + * \param id [in] : the parameter id which has to be created + * \param type [in] : the type of this parameter + * \param subTypeID [in] : the optional sub type of this parameter (e.g. for enumerations) + * \sa EParameterType + * \sa IParameter + * + * This function creates a new parameter with its associated object. + */ + virtual IParameter* createParameter(const CIdentifier& id, const EParameterType type, const CIdentifier& subTypeID = CIdentifier::undefined()) = 0; + /** + * \brief Removes an existing parameter + * \param id [in] : the identifier of the parameter to remove + * \return \e true in case of success + * \return \e false in case of error + * \note if the parameter object is not released if it was replaced by a custom + * parameter object thanks to \c setParameter function. + */ + virtual bool removeParameter(const CIdentifier& id) = 0; + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Configurable) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIKernelContext.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIKernelContext.h new file mode 100755 index 0000000..e18c01a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIKernelContext.h @@ -0,0 +1,105 @@ +#pragma once + +#include "ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +class IAlgorithmManager; +class IConfigurationManager; +class IKernelObjectFactory; +class IPlayerManager; +class IPluginManager; +class IMetaboxManager; +class IScenarioManager; +class ITypeManager; +class ILogManager; +class IErrorManager; + +/** + * \class IKernelContext + * \brief Kernel context interface, gives access to each manager the kernel owns + * \author Yann Renard (INRIA/IRISA) + * \date 2007-10-24 + * + * This class simply provides access to each manager the kernel owns. This is the top + * level object that can be used by a custom OpenViBE application and this is the common + * object all kernel object have in order to access all the functionnalities. + * + * See each manager's own documentation for more detail on a specific manager goal and usage. + */ +class OV_API IKernelContext : public IKernelObject +{ +public: + + /** + * \brief Initializes the kernel context + * \return \e true in case of success + * \return \e false in case of error + */ + virtual bool initialize(const char* const* /*tokenList*/ = nullptr, size_t /*tokenCount*/ = 0) { return true; } + /** + * \brief Uninitializes the kernel context + * \return \e true in case of success + * \return \e false in case of error + */ + virtual bool uninitialize() { return true; } + + /** + * \brief Gets a reference on the kernel's algorithm manager + * \return a reference on the kernel's algorithm manager + */ + virtual IAlgorithmManager& getAlgorithmManager() const = 0; + /** + * \brief Gets a reference on the kernel's configuration manager + * \return a reference on the kernel's configuration manager + */ + virtual IConfigurationManager& getConfigurationManager() const = 0; + /** + * \brief Gets a reference on the kernel's player manager + * \return a reference on the kernel's player manager + */ + virtual IPlayerManager& getPlayerManager() const = 0; + /** + * \brief Gets a reference on the kernel's plugin manager + * \return a reference on the kernel's plugin manager + */ + virtual IPluginManager& getPluginManager() const = 0; + /** + * \brief Gets a reference on the kernel's metabox manager + * \return a reference on the kernel's metabox manager + */ + virtual IMetaboxManager& getMetaboxManager() const = 0; + /** + * \brief Gets a reference on the kernel's object factory + * \return a reference on the kernel's object factory + */ + virtual IKernelObjectFactory& getKernelObjectFactory() const = 0; + /** + * \brief Gets a reference on the kernel's scenario manager + * \return a reference on the kernel's scenario manager + */ + virtual IScenarioManager& getScenarioManager() const = 0; + /** + * \brief Gets a reference on the kernel's type manager + * \return a reference on the kernel's type manager + */ + virtual ITypeManager& getTypeManager() const = 0; + /** + * \brief Gets a reference on the kernel's log manager + * \return a reference on the kernel's log manager + */ + virtual ILogManager& getLogManager() const = 0; + /** + * \brief Gets a reference on the kernel's error manager + * \return a reference on the kernel's error manager + */ + virtual IErrorManager& getErrorManager() const = 0; + + + // backward compatibility + virtual IKernelObjectFactory& getObjectFactory() const { return getKernelObjectFactory(); } + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_KernelContext) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIKernelDesc.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIKernelDesc.h new file mode 100644 index 0000000..d5e9bfe --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIKernelDesc.h @@ -0,0 +1,113 @@ +#pragma once + +#include "ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +class IKernelContext; + +/** + * \class IKernelDesc + * \brief A kernel description + * \author Yann Renard (INRIA/IRISA) + * \date 2006-09-26 + * \ingroup Group_Kernel + * + * This interface is implemented to provide information on a specific kernel + * implementation and to create instances of this specific kernel implementation. + */ +class OV_API IKernelDesc : public IKernelObject +{ +public: + + /** \name Creation process */ + //@{ + + /** + * \brief Creates the kernel itself + * \param applicationName [in] : the name of the application requesting kernel creation + * (an configuration token will be created so the configuration + * file can be tweaked according to the targeted application) + * \param configFilename [in] : a bootstrap configuration file + * \return the created kernel. + * + * This method creates the kernel itself and returns it. + */ + virtual IKernelContext* createKernel(const CString& applicationName, const CString& configFilename) = 0; + /** + * \brief Creates the kernel itself and make it sub kernel of a master kernel + * \param masterKernel [in] : the master kernel + * \param applicationName [in] : the name of the application requesting kernel creation + * (an configuration token will be created so the configuration + * file can be tweaked according to the targeted application) + * \param configFilename [in] : a bootstrap configuration file + * \return the created kernel. + * + * This method creates the kernel itself and returns it. + */ + virtual IKernelContext* createKernel(const IKernelContext& masterKernel, const CString& applicationName, + const CString& configFilename) = 0; + /** + * \brief Releases the kernel itself + * \param kernel [in] : the kernel to release + * + * This method releases an existing kernel. + */ + virtual void releaseKernel(IKernelContext* kernel) = 0; + + //@} + /** \name Textual plugin object description and information */ + //@{ + + /** + * \brief Gets the plugin name + * \return The plugin name. + * + * Default implementation simply returns empty string. + */ + virtual CString getName() const { return CString("no name"); } + /** + * \brief Gets the author name for this plugin + * \return The author name for this plugin. + * + * Default implementation simply returns empty string. + */ + virtual CString getAuthorName() const { return CString("unknown"); } + /** + * \brief Gets the author company name for this plugin + * \return The author company name for this plugin. + * + * Default implementation simply returns empty string. + */ + virtual CString getAuthorCompanyName() const { return CString("unknown"); } + /** + * \brief Gets a short description of the plugin + * \return A short description of the plugin. + * + * Default implementation simply returns empty string. + */ + virtual CString getShortDescription() const { return CString(""); } + /** + * \brief Gets a detailed description of the plugin + * \return A detailed description of the plugin. + * + * Default implementation simply returns empty string. + * + * \note You can use std::endl to have the description + * on several lines when needed. + */ + virtual CString getDetailedDescription() const { return CString(""); } + /** + * \brief Gets the version of the plugin + * \return the version of the plugin. + * + * Default implementation simply returns empty string. + */ + virtual CString getVersion() const { return CString("unknown"); } + + //@} + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_KernelDesc) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIKernelObject.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIKernelObject.h new file mode 100644 index 0000000..19c4204 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIKernelObject.h @@ -0,0 +1,21 @@ +#pragma once + +#include "../ovIObject.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class IKernelObject + * \brief Base class for all kernel objects + * \author Yann Renard (INRIA/IRISA) + * \date 2006-09-26 + * \ingroup Group_Kernel + */ +class OV_API IKernelObject : public IObject +{ +public: + + _IsDerivedFromClass_(IObject, OV_ClassId_Kernel_KernelObject) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIKernelObjectFactory.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIKernelObjectFactory.h new file mode 100644 index 0000000..2efa755 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIKernelObjectFactory.h @@ -0,0 +1,41 @@ +#pragma once + +#include "ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class IKernelObjectFactory + * \brief Kernel object factory, creates all kernel objects + * \author Yann Renard (INRIA/IRISA) + * \date 2006-09-26 + * \ingroup Group_Kernel + * + * This class allows to create kernel objects as needed. + * + * \todo should it be removed ? + */ +class OV_API IKernelObjectFactory : public IKernelObject +{ +public: + + /** + * \brief Creates a new kernel object givent its class identifier + * \param classID [in] : the class identifier of the object to create + * \return a pointer on the created object in case of success. + * \return \c NULL in case of error. + */ + virtual IObject* createObject(const CIdentifier& classID) = 0; + /** + * \brief Releases an object created by this factory + * \param obj [in] : the object to release + * \return \e true in case of success. + * \return \e false in case of error. + * \note The factory should have created the object in order to release it. + */ + virtual bool releaseObject(IObject* obj) = 0; + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_KernelObjectFactory) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIObjectVisitorContext.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIObjectVisitorContext.h new file mode 100644 index 0000000..db62e16 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIObjectVisitorContext.h @@ -0,0 +1,47 @@ +#pragma once + +#include "ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class IObjectVisitorContext + * \author Yann Renard (INRIA/IRISA) + * \date 2008-02-01 + * \brief Exectution context for visitor objects + * \ingroup Group_Kernel + */ +class OV_API IObjectVisitorContext : public IKernelObject +{ +public: + + /** + * \brief Gets a reference on the current algorithm manager + * \return a reference on the current algorithm manager + */ + virtual IAlgorithmManager& getAlgorithmManager() const = 0; + /** + * \brief Gets a reference on the current configuration manager + * \return a reference on the current configuration manager + */ + virtual IConfigurationManager& getConfigurationManager() const = 0; + /** + * \brief Gets a reference on the current type manager + * \return a reference on the current type manager + */ + virtual ITypeManager& getTypeManager() const = 0; + /** + * \brief Gets a reference on the current log manager + * \return a reference on the current log manager + */ + virtual ILogManager& getLogManager() const = 0; + /** + * \brief Gets a reference on the current error manager + * \return a reference on the current error manager + */ + virtual IErrorManager& getErrorManager() const = 0; + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_ObjectVisitorContext) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIParameter.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIParameter.h new file mode 100644 index 0000000..d1ebc24 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovIParameter.h @@ -0,0 +1,141 @@ +#pragma once + +#include "ovIKernelObject.h" +#include "ovIConfigurable.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class IParameter + * \brief Generic parameter handler for configurable objects + * \author Yann Renard (INRIA/IRISA) + * \date 2007-11-21 + * \ingroup Group_Kernel + * \sa IConfigurable + * \sa EParameterType + * \sa TParameterHandler + * + * Instances of this interface encapsulate a specific type of object as a + * so called "parameter". The idea behind this parameter interface is to allow + * to override the parameter content directly pointing to another parameter + * or another value. In order to be as generic as possible, this interface + * uses \c void* pointers in conjunction with data size values. It can be + * hard/tricky to understand for unexperienced developers. Thus I recommend + * the use of the TParameterHandler object which dramatically eases the use + * of the IParameter interface. + */ +class OV_API IParameter : public IKernelObject +{ +public: + + /** \name information */ + //@{ + + /** + * \brief Gets the size of this parameter's content + * \return the size of this parameter's content. + */ + virtual uint64_t getParameterSize() const { return 0; } + /** + * \brief Gets the type of this parameter's content + * \return the type of this parameter's content. + */ + virtual EParameterType getType() const { return ParameterType_None; } + /** + * \brief Gets the sub type of this parameter's content (e.g. for enumeration) + * \return the sub type of this parameter's content (e.g. for enumeration). + */ + virtual CIdentifier getSubTypeIdentifier() const { return CIdentifier::undefined(); } + + //@} + /** \name Reinitialization */ + //@{ + + /** + * \brief Clears all reference targets for this paramter + * \return \e true in case of success. + * \return \e false in case of error. + * \sa getReferenceTarget + * \sa setReferenceTarget + */ + virtual bool clearReferenceTarget() { return false; } + + //@} + /** \name Reference target management */ + //@{ + + /** + * \brief Gets the parameter reference target + * \param value [out] : a pointer to the reference target parameter if existing, \c NULL if not + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool getReferenceTarget(IParameter*& value) const { return false; } + /** + * \brief Sets the parameter reference target for this parameter + * \param value [in] : the new reference target to use + * \return \e true in case of success. + * \return \e false in case of error. + * \note Setting \c NULL simply removes the parameter reference target + * \warning calling this function overrives previous value reference target ! + * + * After this function has been called, any call to \c getValue or \c setValue will be + * directly redirected to the specified reference target parameter. The internal value + * handled by this parameter won't be affected anymore until the reference target is + * cleared. + */ + virtual bool setReferenceTarget(IParameter* value) { return false; } + /** + * \brief Gets the value reference target + * \param value [out] : a pointer to the value target parameter if existing, \c NULL if not + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool getReferenceTarget(void* value) const { return false; } + /** + * \brief Sets the value reference target for this parameter + * \param value [in] : the new reference target to use + * \return \e true in case of success. + * \return \e false in case of error. + * \note Setting \c NULL simply removes the value reference target + * \warning calling this function overrives previous parameter reference target ! + * + * After this function has been called, any call to \c getValue or \c setValue will be + * directly redirected to the specified value reference target. The internal value + * handled by this parameter won't be affected anymore until the reference target is + * cleared. + */ + virtual bool setReferenceTarget(const void* value) { return false; } + + //@} + /** \name Value access */ + //@{ + + /** + * \brief Gets the value for this parameter + * \param value [out] : a pointer to where the value should be copied + * \return \e true in case of success. + * \return \e false in case of error. + * \note the function assumes enough memory has been allocated in \c value to + * copy the value itself. + * \note if a parameter or value reference target has been created, then + * either this target's \c getValue is automatically called, either + * the value target is directly copied + * \sa getParameterSize + */ + virtual bool getValue(void* value) const { return false; } + /** + * \brief Sets the value for this parameter + * \param value [in] : a pointer from where the value should be copied + * \return \e true in case of success. + * \return \e false in case of error. + * \sa getParameterSize + */ + virtual bool setValue(const void* value) { return false; } + + //@} + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Parameter) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovITypeManager.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovITypeManager.h new file mode 100644 index 0000000..ed40119 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovITypeManager.h @@ -0,0 +1,289 @@ +#pragma once + +#include "ovIKernelObject.h" +#include + +namespace OpenViBE { +namespace Kernel { +/** + * \class ITypeManager + * \brief Type manager, provides information on platform's handled types, parameters, streams etc... + * \author Yann Renard (INRIA/IRISA) + * \date 2007-03-14 + * + * This manager concentrates all information about types in the OpenViBE + * platform. Any non-standard type should be declared in the type identifier + * by the kernel or the plugins in order to be used. Registered types range + * from box settings to streams, eventually including inter-type auto casts. + * + * See the different functions for more details. + */ +class OV_API ITypeManager : public IKernelObject +{ +public: + + /** \name Type registration */ + //@{ + + /** + * \brief Gets next type identifier + * \param previousID [in] : The identifier + * for the preceeding type + * \return The identifier of the next type in case of success. + * \return \c CIdentifier::undefined() on error. + * \note Giving \c CIdentifier::undefined() as \c previousID + * will cause this function to return the first type + * identifier. + */ + virtual CIdentifier getNextTypeIdentifier(const CIdentifier& previousID) const = 0; + + /** + * \brief Get a sorted vector of pairs of registered types identifiers associated to types names, + * sorted by type name in increasing alphabetical order. + * \return the sorted vector + */ + virtual std::vector> getSortedTypes() const = 0; + + /** + * \brief Registers a new simple type of data + * \param typeID [in] : the identifier for this type + * \param name [in] : the name for this type + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool registerType(const CIdentifier& typeID, const CString& name) = 0; + /** + * \brief Registers a new communication stream type + * \param typeID [in] : the identifier for this type + * \param name [in] : the name for this type + * \param parentTypeID [in] : the parent stream type identifier + * \return \e true in case of success. + * \return \e false in case of error. + * + * Stream types are organized as a hierarchy, meaning that any + * derived stream should at least contain the parent stream content, + * plus other informations. This will be used by applications in order + * to determine what stream is compatible with what other stream and + * to allow box connections or not. + */ + virtual bool registerStreamType(const CIdentifier& typeID, const CString& name, const CIdentifier& parentTypeID) = 0; + /** + * \brief Registers a new enumeration type + * \param typeID [in] : the type identifier for this type + * \param name [in] : the name for this type + * \return \e true in case of success. + * \return \e false in case of error. + * \sa registerEnumerationEntry + * + * An enumeration should have several possible values. + * This values have to be created thanks to \c registerEnumerationEntry + */ + virtual bool registerEnumerationType(const CIdentifier& typeID, const CString& name) = 0; + /** + * \brief Registers a new enumeration value for a given enumeration type + * \param typeID [in] : the type identifier of the enumeration which new entry has to be registered + * \param name [in] : the name of the entry to register + * \param value [in] : the value of the entry to register + * \return \e true in case of success. + * \return \e false in case of error. + * \note the enumeration has to be registered + * \sa registerEnumerationType + */ + virtual bool registerEnumerationEntry(const CIdentifier& typeID, const CString& name, uint64_t value) = 0; + + /** + * \brief Registers a new bitmask type + * \param typeID [in] : the type identifier for this type + * \param name [in] : the name for this type + * \return \e true in case of success. + * \return \e false in case of error. + * \sa registerBitMaskEntry + * + * A bitmask should have several possible values. + * This values have to be created thanks to \c registerBitMaskEntry + */ + virtual bool registerBitMaskType(const CIdentifier& typeID, const CString& name) = 0; + /** + * \brief Registers a new bitmask value for a given bitmask type + * \param typeID [in] : the type identifier of the bitmask which new entry has to be registered + * \param name [in] : the name of the entry to register + * \param value [in] : the value of the entry to register + * \return \e true in case of success. + * \return \e false in case of error. + * \note the bitmask has to be registered + * \sa registerBitMaskType + */ + virtual bool registerBitMaskEntry(const CIdentifier& typeID, const CString& name, uint64_t value) = 0; + + //@} + /** \name Registration verification */ + //@{ + + /** + * \brief Tests if a specific type has been registered + * \param typeID [in] : the type identifier which registration has to be tested + * \return \e true if the specified type has been registered. + * \return \e false if the specified type has not been registered. + */ + virtual bool isRegistered(const CIdentifier& typeID) const = 0; + /** + * \brief Tests if a specific type has been registered and is a stream + * \param typeID [in] : the type identifier which registration has to be tested + * \return \e true if the specified type has been registered is a stream. + * \return \e false if the specified type has not been registered or is not a stream. + */ + virtual bool isStream(const CIdentifier& typeID) const = 0; + /** + * \brief Tests is a specific type has been registered, is a stream and is derived from another registered stream type + * \param typeID [in] : the type identifier which registration and derivation has to be tested + * \param parentTypeID [in] : the type identifier of the supposed parent stream + * \return \e true in case \c typeID is registered as a stream type and derived from \c parentTypeID + * \return \e false in case \c parentTypeID is not registered + * \return \e false in case \c parentTypeID is not a stream + * \return \e false in case \c typeID is not registered + * \return \e false in case \c typeID is not a stream + * \return \e false in case \c typeID is not derived from parentTypeID + * \note The derivation can be indirect (\c typeID can derive an + * intermediate stream type which derives \c parentTypeID) + */ + virtual bool isDerivedFromStream(const CIdentifier& typeID, const CIdentifier& parentTypeID) const = 0; + /** + * \brief Tests if a specific type has been registered and is an enumeration + * \param typeID [in] : the type identifier which registration has to be tested + * \return \e true if the specified type has been registered and is an enumeration. + * \return \e false if the specified type has not been registered or is not an enumeration. + */ + virtual bool isEnumeration(const CIdentifier& typeID) const = 0; + /** + * \brief Tests if a specific type has been registered and is a bitmask + * \param typeID [in] : the type identifier which registration has to be tested + * \return \e true if the specified type has been registered and is a bitmask. + * \return \e false if the specified type has not been registered or is not a bitmask. + */ + virtual bool isBitMask(const CIdentifier& typeID) const = 0; + + //@} + /** \name Type identification */ + //@{ + + /** + * \brief Gets the name of a specified type + * \param typeID [in] : the type identifier which name should be returned + * \return the name of the speficied type. + */ + virtual CString getTypeName(const CIdentifier& typeID) const = 0; + /** + * \brief Gets the parent stream type for a stream type + * \param typeID [in] : the stream type identifier which parent stream type be returned + * \return the parent stream type on success. + * \return \c CIdentifier::undefined() on error. + * \note The specified type identifier has to be a stream type. + */ + virtual CIdentifier getStreamParentType(const CIdentifier& typeID) const = 0; + + //@} + /** \name Enumeration entry accessors */ + //@{ + + /** + * \brief Gets the number of enumeration entry for an enumeration type + * \param typeID [in] : the enumeration type identifier + * \return the number of entry for this enumeration type. + */ + virtual size_t getEnumerationEntryCount(const CIdentifier& typeID) const = 0; + /** + * \brief Gets details for a specific enumeration type entry + * \param typeID [in] : the enumeration type identifier + * \param index [in] : the index of the entry which details should be returned + * \param name [out] : the name of the specified entry + * \param value [out] : the value of the speficied entry + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool getEnumerationEntry(const CIdentifier& typeID, uint64_t index, CString& name, uint64_t& value) const = 0; + /** + * \brief Converts an enumeration entry value to an enumeration entry name + * \param typeID [in] : the enumeration type identifier + * \param value [in] : the enumeration entry value + * \return the enumeration entry name corresponding to the specified value. + * \warning on error, an empty string is returned. + */ + virtual CString getEnumerationEntryNameFromValue(const CIdentifier& typeID, uint64_t value) const = 0; + /** + * \brief Converts an enumeration entry name to an enumeration entry value + * \param typeID [in] : the enumeration type identifier + * \param name [in] : the enumeration entry name + * \return the enumeration entry value corresponding to the specified name. + * \warning on error, \c 0xffffffffffffffffLL is returned. + */ + virtual uint64_t getEnumerationEntryValueFromName(const CIdentifier& typeID, const CString& name) const = 0; + + //@} + /** \name Bitmask entry accessors */ + //@{ + + /** + * \brief Gets the number of bitmask entry for a bitmask type + * \param typeID [in] : the bitmask type identifier + * \return the number of entry for this bitmask type. + */ + virtual size_t getBitMaskEntryCount(const CIdentifier& typeID) const = 0; + /** + * \brief Gets details for a specific bitmask type entry + * \param typeID [in] : the bitmask type identifier + * \param index [in] : the index of the entry which details should be returned + * \param name [out] : the name of the specified entry + * \param value [out] : the value of the speficied entry + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool getBitMaskEntry(const CIdentifier& typeID, uint64_t index, CString& name, uint64_t& value) const = 0; + /** + * \brief Converts a bitmask entry value to a bitmask entry name + * \param typeID [in] : the bitmask type identifier + * \param value [in] : the bitmask entry value + * \return the bitmask entry name corresponding to the specified value. + * \warning on error, an empty string is returned. + */ + virtual CString getBitMaskEntryNameFromValue(const CIdentifier& typeID, uint64_t value) const = 0; + /** + * \brief Converts a bitmask entry name to a bitmask entry value + * \param typeID [in] : the bitmask type identifier + * \param name [in] : the bitmask entry name + * \return the bitmask entry value corresponding to the specified name. + * \warning on error, \c 0xffffffffffffffffLL is returned. + */ + virtual uint64_t getBitMaskEntryValueFromName(const CIdentifier& typeID, const CString& name) const = 0; + /** + * \brief Computes the textual value of a composition of numerical entries + * \param typeID [in] : the bitmask type identifier + * \param value [in] : the composition of numerical entries + * \return the bitmask entry composition name. + * \warning on error, an empty string is returned. + */ + virtual CString getBitMaskEntryCompositionNameFromValue(const CIdentifier& typeID, uint64_t value) const = 0; + /** + * \brief Computes the integer value of a composition of textual entries + * \param typeID [in] : the bitmask type identifier + * \param name [in] : the composition of textual entries + * \return the bitmask entry composition value. + * \warning on error, \c 0x0000000000000000LL is returned. + */ + virtual uint64_t getBitMaskEntryCompositionValueFromName(const CIdentifier& typeID, const CString& name) const = 0; + + /** + * \brief Evaluate the string arithmetic expression value + * to a numeric value as a float + * \param value [in] : arithmetic expression to evaluate + * \param result [out] : result of evaluation + * \return true if the arithmetic evaluation succeeded, + * \return false if the arithmetic expression is incorrect + */ + virtual bool evaluateSettingValue(CString value, double& result) const = 0; + + //@} + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_TypeManager) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovTParameterHandler.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovTParameterHandler.h new file mode 100644 index 0000000..c9f63c1 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/ovTParameterHandler.h @@ -0,0 +1,215 @@ +#pragma once + +#include "ovIParameter.h" +#include "ovIConfigurable.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class TParameterHandler + * \brief Helper class in order to manipulate IParameter and IParameter values natively + * \author Yann Renard (INRIA/IRISA) + * \date 2007-11-21 + * \ingroup Group_Kernel + * \ingroup Group_Helper + * \sa IParameter + * \sa EParameterType + * + * The purpose for this template is to help user code to manipulate + * IParameter abstract class and it's associated value. Client code + * should probably use this template better than IParameter directly. + * The template argument is the handled data type : + * - for \c ParameterType_Integer : \c int64_t + * - for \c ParameterType_UInteger : \c uint64_t + * - for \c ParameterType_Boolean : \c bool + * - for \c ParameterType_Float : \c double + * - for \c ParameterType_String : \c CString + * - for \c ParameterType_Identifier : \c CIdentifier + * - for \c ParameterType_Matrix : \c CMatrix* + * - for \c ParameterType_StimulationSet : \c IStimulationSet* + * - for \c ParameterType_MemoryBuffer : \c IMemoryBuffer* + * - for \c ParameterType_Object : \c IObject* + * - for \c ParameterType_Pointer : \c uint8_t* + * + * The idea is to connect the handler to the corresponding IParameter object + * thanks to the \c initialize function. Then the provided interface translates + * handled object native operation to generic IParameter operations automatically. + * Moreover, the handler is able to provide the handled object's interface thanks + * to an automatic cast operator. + */ +template +class TParameterHandler +{ +public: + + /** \name Construction */ + //@{ + + /** + * \brief Default construction, does nothing + */ + TParameterHandler() { } + + /** + * \brief IParameter based construction + * \param parameter [in] : the parameter to use for the initialization + * + * This constructor considers the parameter handler to be + * connected to the provided parameter. This is equivalent to + * using the default constructor and call the initialize function + * with the provided IParameter pointer. + */ + TParameterHandler(IParameter* parameter) : m_parameter(parameter) { } + + //@} + /** \name Initialization */ + //@{ + + /** + * \brief Connects this parameter handler to a concrete IParameter pointer + * \param parameter [in] : the concrete parameter to connect to (it can not be \c NULL ) + * \return \e true in case of success. + * \return \e false in case of error. + * + * Future calls to this handler will be redirected to the + * concrete parameter object. + */ + bool initialize(IParameter* parameter) + { + if (m_parameter || !parameter) { return false; } + + m_parameter = parameter; + return true; + } + + /** + * \brief Disconnects this parameter handler from its concrete IParameter pointer + * \return \e true in case of success. + * \return \e false in case of error. + * + * This handler won't be usable until \c initialize is called successfully again. + */ + bool uninitialize() + { + if (!m_parameter) { return false; } + m_parameter = nullptr; + return true; + } + + /** + * \brief Checks whether this handler is connected to a concrete IParameter or not + * \return \e true if this handler is connected to a concrete IParameter, \e false if not + */ + bool exists() const { return m_parameter != nullptr; } + + //@{ + /** \name Transparent operators */ + //@{ + + /** + * \brief Handled object type cast + * \return The handled object itself + * + * This cast operator allows the handler to be used as if it was the handled + * object itself. For example, an unsigned integer parameter handler is usable + * in arithmetic operations : + * + * \code + * // parameter will directly be used as if it is an unsigned integer + * TParameterHandler parameter ( ... ); + * uint64_t a= ...; + * uint64_t c=a*parameter+parameter; + * \endcode + */ + operator T() const + { + if (!m_parameter) { throw; } + T t; + m_parameter->getValue(&t); + return t; + } + /** + * \brief Handled object type member access operator + * \return The handled object itself for access operation + * + * This operator allows the handler to be used as if it was the handled + * object itself. For example, a matrix parameter handler is usable + * as if it was a matrix pointer : + * + * \code + * // parameter will directly be used as if it is a matrix pointer + * TParameterHandler parameter ( ... ); + * parameter->setDimensionCount(2); + * \endcode + */ + T operator ->() const + { + if (!m_parameter) { throw; } + T t; + m_parameter->getValue(&t); + return t; + } + /** + * \brief Affectation operator + * \return This handler itself + * + * This operator allows to affect handled object type values to the + * handled object itself. For example, an unsigned integer parameter + * handler can be affected this way : + * + * \code + * // the affectation of parameter will directly go to its handled unsigned integer + * TParameterHandler parameter ( ... ); + * parameter = 1; + * \endcode + */ + TParameterHandler& operator=(const T& t) + { + if (!m_parameter) { throw; } + m_parameter->setValue(&t); + return *this; + } + + //@} + /** \name Reference target management */ + //@{ + + /** + * \brief Clears all reference targets + * \return \e true in case of success. + * \return \e false in case of error. + */ + bool clearReferenceTarget() const { return m_parameter ? m_parameter->clearReferenceTarget() : false; } + /** + * \brief Sets a new reference target + * \param rParameterHandler [in] : a parameter handler of the same type as this parameter handler + * \return \e true in case of success. + * \return \e false in case of error. + */ + bool setReferenceTarget(TParameterHandler& rParameterHandler) + { + return m_parameter && rParameterHandler.m_parameter ? m_parameter->setReferenceTarget(rParameterHandler.m_parameter) : false; + } + /** + * \brief Sets a new reference target + * \param pParameter [in] : a parameter to use as reference target + * \return \e true in case of success. + * \return \e false in case of error. + */ + bool setReferenceTarget(IParameter* pParameter) const { return m_parameter && pParameter ? m_parameter->setReferenceTarget(pParameter) : false; } + /** + * \brief Sets a new reference target + * \param t [in] : a value to use as reference target + * \return \e true in case of success. + * \return \e false in case of error. + */ + bool setReferenceTarget(T& t) { return m_parameter ? m_parameter->setReferenceTarget(&t) : false; } + + //@} + +protected: + + IParameter* m_parameter = nullptr; ///< Handled parameter +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/player/CMessageClock.hpp b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/player/CMessageClock.hpp new file mode 100644 index 0000000..288b992 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/player/CMessageClock.hpp @@ -0,0 +1,35 @@ +#pragma once +#include "../../CIdentifier.hpp" + +namespace OpenViBE { +namespace Kernel { +/** + * \class CMessageClock + * \author Yann Renard (INRIA/IRISA) + * \date 2006-05-30 + * \brief Clock message + * \ingroup Group_Player + * \ingroup Group_Kernel + * \todo This class can be suppress, The only time, this class is used is with processClock. In this function, only getTime() is used some times. + * We must verify if this time is the same as getPlayerContext().getCurrentTime(). If it's true we can suppress completly this class. + * remark : In this case we modify the API for plugin + */ +class OV_API CMessageClock +{ +public: + CMessageClock() = default; + + CIdentifier getIdentifier() const { return m_id; } + uint64_t getTime() const { return m_time; } + + void setIdentifier(const CIdentifier& id) { m_id = id; } + void setTime(const uint64_t time) { m_time = time; } +protected: + CIdentifier m_id = CIdentifier::undefined(); + uint64_t m_time = 0; +}; + +typedef CMessageClock IMessageClock; + +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/player/ovIBoxAlgorithmContext.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/player/ovIBoxAlgorithmContext.h new file mode 100644 index 0000000..1f871e9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/player/ovIBoxAlgorithmContext.h @@ -0,0 +1,86 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +class IBox; +class IBoxIO; +class IPlayerContext; + +/** + * \class IBoxAlgorithmContext + * \author Yann Renard (INRIA/IRISA) + * \date 2006-07-07 + * \brief Specific context to use for box algorithm plugins + * \ingroup Group_Player + * \ingroup Group_Kernel + * \ingroup Group_Extend + * + * This 'context' is given by the player to an algorithm plugin + * so it has all the necessary tools to work. This algorithm + * context mainly consists in getting other contexts which + * could be defined and used more generically (such as the + * box interface or a global player interface for example). + * + * \sa IBoxAlgorithm + * \sa IPlayerContext + */ +class OV_API IBoxAlgorithmContext : public IKernelObject +{ +public: + + /** + * \brief Gets the static context of the box corresponding to the algorithm + * \return A pointer on the corresponding context + * + * The returned context can be used by the algorithm to + * access the box' prototype. + * + * \warning The algorithm should not use this reference after it + * has finished its work, it could be deprecated. + * \sa IBoxAlgorithmContext::getDynamicBoxContext + */ + virtual const IBox* getStaticBoxContext() = 0; + /** + * \brief Gets the dynamic context of the box corresponding to the algorithm + * \return A pointer on the corresponding context + * + * The returned context can be used by the algorithm to + * access the box' inputs, outputs and settings. + * + * \warning The algorithm should not use this reference after it + * has finished its work, it could be deprecated. + * \sa IBoxAlgorithmContext::getStaticBoxContext + */ + virtual IBoxIO* getDynamicBoxContext() = 0; + /** + * \brief Gets the player context + * \return A pointer on the player context + * + * The returned context can be used by the algorithm to + * access the player functionnalities. + * + * \warning The algorithm should not use this reference after it + * has finished its work, it could be deprecated. + */ + virtual IPlayerContext* getPlayerContext() = 0; + + /** + * \brief Marks the algorithm as 'ready to process' so its process function is called by the kernel + * \return \e true in case of success. + * \return \e false when an error occurs. + * + * This function should be called by the algorithm itself + * after receiving a message so the kernel knows it is + * ready to process some data... As soon as the kernel + * knows the algorithm is ready, the \c process function + * is called so the algorithm does its work and produces + * its outputs. + */ + virtual bool markAlgorithmAsReadyToProcess() = 0; + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Player_BoxAlgorithmContext) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/player/ovIPlayer.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/player/ovIPlayer.h new file mode 100644 index 0000000..41b6ca0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/player/ovIPlayer.h @@ -0,0 +1,196 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +class IScenario; +class IConfigurationManager; + +enum class EPlayerStatus { Stop, Pause, Step, Play, Forward }; + +enum class EPlayerReturnCodes { Success, Failed, BoxInitializationFailed }; + +inline std::string toString(const EPlayerStatus status) +{ + switch (status) + { + case EPlayerStatus::Stop: return "Stop"; + case EPlayerStatus::Pause: return "Pause"; + case EPlayerStatus::Step: return "Step"; + case EPlayerStatus::Play: return "Play"; + case EPlayerStatus::Forward: return "Forward"; + default: return "Invalid Status"; + } +} + +inline std::string toString(const EPlayerReturnCodes code) +{ + switch (code) + { + case EPlayerReturnCodes::Success: return "Success"; + case EPlayerReturnCodes::Failed: return "Failed"; + case EPlayerReturnCodes::BoxInitializationFailed: return "Box Initialization Failed"; + default: return "Invalid Code"; + } +} + +/** + * \class IPlayer + * \author Yann Renard (INRIA/IRISA) + * \date 2006-09-26 + * \brief The main player class + * \ingroup Group_Player + * \ingroup Group_Kernel + * + * A player is responsible for the playback of a specific scenario. + * This player scenario is provided at initialisation stage and should + * not be changed until the player terminates. The player idea of calling + * a "play" function forces the use of threads in order to avoid CPU locking. + * Thus we prefer the idea of having a "short-time" function that is to be + * called repeatedly until the player terminates. This is the role of the + * \c IPlayer::loop function, that should be called repeatedly by the outside + * application. + * + * \todo Refactor this base class to propose an interface + * more OpenViBE compliant (use IDs, intialize/unitialize + * pairs etc...) + */ +class OV_API IPlayer : public IKernelObject +{ +public: + + /** + * \brief Attaches a scenario to this player + * \param id [in] : the scenario identifier to attach to this player. The scenario itself is found from the scenario manager. + * \param localConfigTokens [in] : An optional map that contains configuration tokens to add. + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setScenario(const CIdentifier& id, const CNameValuePairList* localConfigTokens = nullptr) = 0; + + /** + * \brief returns a reference to the runtime configuration manager + * \return a reference to the runtime configuration manager + * + * When initialized, a player creates a runtime configuration manager + * which will be used for scenario and runtime related specific configuration. + * The use of this features includes the loading of a delayed configuration file + * for instance. The reference should be valid up to the duration of the player itself. + * + * \sa IConfigurationManager + */ + virtual IConfigurationManager& getRuntimeConfigurationManager() const = 0; + + /** + * \brief returns a reference to the runtime scenario manager + * \return a reference to the runtime scenario manager + * + * When a scenario is loaded, a copy is made and stored in the + * runtime scenario manager. This function allows getting the + * runtime scenario manager that contains the current executed scenario. + * + * \sa IScenarioManager + */ + virtual IScenarioManager& getRuntimeScenarioManager() const = 0; + + /** + * \brief returns the cidentifier of the associated runtime scenario + * \return the cidentifier of the associated runtime scenario + * + * When initialized, a player copy the scenario in the runtime configuration manager + * this method allows getting the identifier of said copied scenario + * + * \sa CIdentifier + */ + virtual CIdentifier getRuntimeScenarioIdentifier() const = 0; + + /** + * \brief Initializes this player + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual EPlayerReturnCodes initialize() = 0; + /** + * \brief Uninitializes this player + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool uninitialize() = 0; + + /** + * \brief Stops player execution + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool stop() = 0; + /** + * \brief Pauses player execution + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool pause() = 0; + /** + * \brief Executes one more step and pauses + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool step() = 0; + /** + * \brief Makes player run normal speed + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool play() = 0; + /** + * \brief Makes player run as fast as possible + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool forward() = 0; + /** + * \brief Gets current player status + * \return current player status + */ + virtual EPlayerStatus getStatus() const = 0; + + /** + * \brief Sets maximum fast forward factor coefficient + * \param factor : the maximum speed multiplier to be applied when playing in EPlayerStatus::Forward mode + * \return \e true in case of success. + * \return \e false in case of error. + * \note If a negative value is passed, it is turned back to 0 + * \note It the fast forward factor is 0, it tells the player to go as fast as possible + */ + virtual bool setFastForwardMaximumFactor(double factor) = 0; + /** + * \brief Gets the maximum fast forward factor coefficient + * \return The maximum fast forward factor coefficient. + */ + virtual double getFastForwardMaximumFactor() const = 0; + + /** + * \brief Gets an estimate of the actual time ratio spent in the player's loop + * \return the amount of time spent in the player's loop (given in percentage) + */ + virtual double getCPUUsage() const = 0; + + /** + * \brief "short time" function to be called repeatedly by the outstide application + * \param elapsedTime [in] : real elapsed time given in seconds 32:32 + * \param maximumTimeToReach [in] : maximum time to reach given in seconds 32:32 + * \return \e true if the execution went successfully. + * \return \e false in case their was a problem or the execution terminated. + * + * The \e maximumTimeToReach parameter guarantees that the player does not + * run beyond the specified time when ran in fast forward mode. It defaults + * to \c uint64_t(-1) which represents the largest OpenViBE time. + */ + virtual bool loop(uint64_t elapsedTime, uint64_t maximumTimeToReach = uint64_t(-1)) = 0; + + virtual uint64_t getCurrentSimulatedTime() const = 0; + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Player_Player) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/player/ovIPlayerContext.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/player/ovIPlayerContext.h new file mode 100644 index 0000000..8e5a7ca --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/player/ovIPlayerContext.h @@ -0,0 +1,155 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Plugins { +class IPluginObject; +} // namespace Plugins + +namespace Kernel { +class IConfigurationManager; +class ILogManager; +class IScenarioManager; + +/** + * \class IPlayerContext + * \author Yann Renard (INRIA/IRISA) + * \date 2006-07-07 + * \brief Player interface for plugin objects + * \ingroup Group_Player + * \ingroup Group_Kernel + * + * Instances of this class are given to plugin object + * so they can communicate with the platform kernel, + * providing services such as message sending etc... + */ +class OV_API IPlayerContext : public IKernelObject +{ +public: + + /** \name Time management */ + //@{ + + /** + * \brief Gets the current player time + * \return the current player time. + * \note The time value is fixed point 32:32 representated in seconds + */ + virtual uint64_t getCurrentTime() const = 0; + /** + * \brief Gets the current player lateness + * \return the current player lateness + * \note The lateness is fixed point 32:32 representated in seconds + */ + virtual uint64_t getCurrentLateness() const = 0; + /** + * \brief Gets the current CPU use for the running processing unit + * \return the current CPU use + */ + virtual double getCurrentCPUUsage() const = 0; + /** + * \brief Gets the current fast forward factor to be used when the getStatus states the player runs in fast forward mode + * \return the current fast forward factor + */ + virtual double getCurrentFastForwardMaximumFactor() const = 0; + + //@} + /** \name Player control */ + //@{ + + /** + * \brief Stops player execution + * \return \e true in case of success. + * \return \e false in case of error. + * \warning Once the player is stopped, there's no way to restart it + */ + virtual bool stop() = 0; + /** + * \brief Pauses player execution + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool pause() = 0; + /** + * \brief Makes player run normal speed + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool play() = 0; + /** + * \brief Makes player run as fast as possible + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool forward() = 0; + /** + * \brief Gets current player status + * \return current player status + */ + virtual EPlayerStatus getStatus() const = 0; + + //@} + /** \name Give access to some managers */ + //@{ + + /** + * \brief Gets the current player's configuration manager + * \return The current player's configuration manager + * + * \warning The plugin object should not use this reference after it + * has finished its work, it could be deprecated. + */ + virtual IConfigurationManager& getConfigurationManager() const = 0; + /** + * \brief Gets the current player's algorithm manager + * \return The current player's algorithm manager + * + * \warning The plugin object should not use this reference after it + * has finished its work, it could be deprecated. + */ + virtual IAlgorithmManager& getAlgorithmManager() const = 0; + /** + * \brief Gets the current player's log manager + * \return The current player's log manager + * + * \warning The plugin object should not use this reference after it + * has finished its work, it could be deprecated. + */ + virtual ILogManager& getLogManager() const = 0; + /** + * \brief Gets the current player's error manager + * \return The current player's error manager + * + * \warning The plugin object should not use this reference after it + * has finished its work, it could be deprecated. + */ + virtual IErrorManager& getErrorManager() const = 0; + + /** + * \brief Gets the current player's scenario manager + * \return The current player's scenario manager + * + * \warning The plugin object should not use this reference after it + * has finished its work, it could be deprecated. + */ + virtual IScenarioManager& getScenarioManager() const = 0; + /** + * \brief Gets the current player's type manager + * \return The current player's type manager + * + * \warning The plugin object should not use this reference after it + * has finished its work, it could be deprecated. + */ + virtual ITypeManager& getTypeManager() const = 0; + + virtual bool canCreatePluginObject(const CIdentifier& pluginID) const = 0; + virtual Plugins::IPluginObject* createPluginObject(const CIdentifier& pluginID) const = 0; + virtual bool releasePluginObject(Plugins::IPluginObject* pluginObject) const = 0; + + //@} + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Player_PlayerContext) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/player/ovIPlayerManager.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/player/ovIPlayerManager.h new file mode 100644 index 0000000..223c7f2 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/player/ovIPlayerManager.h @@ -0,0 +1,65 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +class IPlayer; + +/** + * \class IPlayerManager + * \author Yann Renard (INRIA/IRISA) + * \date 2006-07-21 + * \brief The manager responsible for scenario playback + * \ingroup Group_Player + * \ingroup Group_Kernel + * + * The player manager is responsible for creating the different player + * instances. Each player is responsible for the playback of a specific + * scenario. + */ +class OV_API IPlayerManager : public IKernelObject +{ +public: + + /** + * \brief Creates a new player + * \param id [out] : the identifier of the created player + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool createPlayer(CIdentifier& id) = 0; + /** + * \brief Releases a specific player + * \param id [in] : the identifier of the player to release + * \return \e true in case of success. + * \return \e false in case of error. + * + * Releasing a player means the player instance won't be used any more, + * thus the player manager can release any allocated resource / memory + * for this player. + */ + virtual bool releasePlayer(const CIdentifier& id) = 0; + /** + * \brief Gets a specific player instance, provided its identifier + * \param id [in] : the identifier of the player instance to return + * \return A reference on the player instance + * \warning Using a non player identifier will cause a crash + */ + virtual IPlayer& getPlayer(const CIdentifier& id) = 0; + /** + * \brief Gets next player identifier + * \param previousID [in] : The identifier + * for the preceeding player + * \return The identifier of the next player in case of success. + * \return \c CIdentifier::undefined() on error. + * \note Giving \c CIdentifier::undefined() as \c previousID + * will cause this function to return the first player + * identifier. + */ + virtual CIdentifier getNextPlayerIdentifier(const CIdentifier& previousID) const = 0; + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Player_PlayerManager) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/plugins/ovIPluginManager.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/plugins/ovIPluginManager.h new file mode 100755 index 0000000..e2d96c6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/plugins/ovIPluginManager.h @@ -0,0 +1,197 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Plugins { +class IPluginObject; +class IPluginObjectDesc; + +class IBoxAlgorithm; +class IBoxAlgorithmDesc; + +class IAlgorithm; +class IAlgorithmDesc; +} // namespace Plugins + +namespace Kernel { +// class IPluginModule; + +/** + * \class IPluginManager + * \brief Log manager + * \author Yann Renard (INRIA/IRISA) + * \date 2006-09-26 + * \ingroup Group_Plugins + * \ingroup Group_Kernel + * + * The plugin manager is in charge of loading/unloading plugin + * modules (ie DLL/so files) containing OpenViBE plugins. + * It also provides functions in order to list plugin descriptors, + * create or release plugin objects... + */ +class OV_API IPluginManager : public IKernelObject +{ +public: + + /** \name Plugin modules/descriptors management */ + //@{ + + /** + * \brief Loads new DLL/so plugin module file(s) + * \param fileNameWildCard [in] : a wild card with the file(s) to search plugins in + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool addPluginsFromFiles(const CString& fileNameWildCard) = 0; + /** + * \brief Registers a plugin object descriptor + * \param desc [in] : the actual plugin object descriptor to register + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool registerPluginDesc(const Plugins::IPluginObjectDesc& desc) = 0; + /** + * \brief Gets next plugin object descriptor identifier + * \param previousID [in] : The identifier + * for the preceeding plugin object descriptor + * \return The identifier of the next plugin object descriptor in case of success. + * \return \c CIdentifier::undefined() on error. + * \note Giving \c CIdentifier::undefined() as \c previousID + * will cause this function to return the first plugin object + * descriptor identifier. + */ + virtual CIdentifier getNextPluginObjectDescIdentifier(const CIdentifier& previousID) const = 0; + /** + * \brief Gets next plugin object descriptor identifier given a base class identifier + * \param previousID [in] : The identifier + * for the preceeding plugin object descriptor + * \param baseClassID [in] : the class the plugin object descriptor should derive from + * \return The identifier of the next plugin object descriptor in case of success. + * \return \c CIdentifier::undefined() on error. + * \note Giving \c CIdentifier::undefined() as \c previousID + * will cause this function to return the first plugin object + * descriptor identifier. + */ + virtual CIdentifier getNextPluginObjectDescIdentifier(const CIdentifier& previousID, const CIdentifier& baseClassID) const = 0; + /** + * \brief Checks if a plugin object can be created or not + * \param classID [in] : the class identifier a descriptor should be able to create + * \return \e true in case this manager is able to create a plugin object with the provided class identifier. + * \return \e false in other case. + */ + virtual bool canCreatePluginObject(const CIdentifier& classID) = 0; + /** + * \brief Gets details on a specific plugin object descriptor + * \param id [in] : the plugin object descriptor id which details should be returned + * \return the corresponding plugin object descriptor pointer. + * \sa getNextPluginObjectDescIdentifier + */ + virtual const Plugins::IPluginObjectDesc* getPluginObjectDesc(const CIdentifier& id) const = 0; + /** + * \brief Gets details on a specific plugin object descriptor given the class identifier it should create + * \param classID [in] : the plugin object class identifier of the descriptor which details should be returned + * \return the corresponding plugin object descriptor pointer. + * \sa canCreatePluginObject + */ + virtual const Plugins::IPluginObjectDesc* getPluginObjectDescCreating(const CIdentifier& classID) const = 0; + + //@} + /** \name Plugin lifetime management */ + //@{ + + /** + * \brief Gets a hash value for a given plugin + * \param classID [in] : the class identifier of the plugin which hash value + * has to be returned + * \return a hash code for the corresponding plugin object + * + * This function can be used to compute a has code of the described plugin object + * If this hash code differs from session to session, it means that the plugin + * descriptor changed in some way. + * + * \note The method used to compute the hash code is specific to the class + * of plugin that is considered (for example, for box algorithms, the + * hash code is based on what IBoxProto receives at + * description stage) + */ + virtual CIdentifier getPluginObjectHashValue(const CIdentifier& classID) const = 0; + + virtual CIdentifier getPluginObjectHashValue(const Plugins::IBoxAlgorithmDesc& boxAlgorithmDesc) const = 0; + /** + * \brief Gets a hint whether a plugin is deprecated or not + * \param classID [in] : the class identifier of the plugin which deprecation should be returned + * \return \e true in case the plugin is deprecated + * \return \e false in case the plugin is not deprecated + * + * If this function returns \e true, this means that the considered + * plugin is still valid and functionnal but that it will + * be removed soon or later. Code relying on this plugin + * should consider any alternative available to avoid future problems. + */ + virtual bool isPluginObjectFlaggedAsDeprecated(const CIdentifier& classID) const = 0; + + //@} + /** \name Plugin creation and destruction */ + //@{ + + /** + * \brief Creates a new plugin object given its class identifier + * \param classID [in] : the class identifier of the plugin object to create + * \return a pointer on the newly created plugin object. + * \return \c NULL in case of error. + * \sa releasePluginObject + */ + virtual Plugins::IPluginObject* createPluginObject(const CIdentifier& classID) = 0; + /** + * \brief Tells the plugin manager a plugin object won't be ever used + * \param pluginObject [in] : the plugin object to release + * \return \e true in case of success. + * \return \e false in case of error. + * + * The client code should not call any function of the plugin object after this + * call has been made. However, the plugin manager is free to release allocated memory + * and resources for this plugin object. + */ + virtual bool releasePluginObject(Plugins::IPluginObject* pluginObject) = 0; + + //@{ + /**\name Helpers */ + //@{ + + /** + * \brief Creates a new algorithm given its class identifier and eventually returns the associated descriptor + * \param classID [in] : the class identifier of the algorithm to create + * \param desc [out] : a pointer where to store the descriptor information + * \return The newly created algorithm in case of success. + * \return \c NULL in case of error. + * + * This function is a helper for the use of \c createPluginObject and co. + */ + virtual Plugins::IAlgorithm* createAlgorithm(const CIdentifier& classID, const Plugins::IAlgorithmDesc** desc) = 0; + /** + * \brief Creates a new algorithm given a descriptor + * \param desc [in] : the class descriptor of the algorithm to create + * \return The newly created algorithm in case of success. + * \return \c NULL in case of error. + * + * This function is a helper for the use of \c createPluginObject and co. + */ + virtual Plugins::IAlgorithm* createAlgorithm(const Plugins::IAlgorithmDesc& desc) = 0; + /** + * \brief Creates a new box algorithm given its class identifier and eventually returns the associated descriptor + * \param classID [in] : the class identifier of the box algorithm to create + * \param desc [out] : a pointer where to store the descriptor information + * \return The newly created box algorithm in case of success. + * \return \c NULL in case of error. + * + * This function is a helper for the use of \c createPluginObject and co. + */ + virtual Plugins::IBoxAlgorithm* createBoxAlgorithm(const CIdentifier& classID, const Plugins::IBoxAlgorithmDesc** desc) = 0; + + //@} + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Plugins_PluginManager) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/plugins/ovIPluginModule.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/plugins/ovIPluginModule.h new file mode 100644 index 0000000..6b10b55 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/plugins/ovIPluginModule.h @@ -0,0 +1,89 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Plugins { +class IPluginObjectDesc; +} // namespace Plugins + +namespace Kernel { +/** + * \class IPluginModule + * \brief Plugin module + * \author Yann Renard (INRIA/IRISA) + * \date 2006-09-26 + * \ingroup Group_Plugins + * \ingroup Group_Kernel + * + * Each plugin module is exactly responsible for one module + * (ie DLL/so file) containing OpenViBE plugins. It is + * able to load/unload this file and to enumerate each of + * its plugin object descriptor. + */ +class OV_API IPluginModule : public IKernelObject +{ +public: + + /** + * \brief Tries to load a file as an OpenViBE module + * \param name [in] : the name of the file to try to load + * \param error [out] : an optional output string containing the error on load failure + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool load(const CString& name, CString* error = nullptr) = 0; + /** + * \brief Tries to unload the loaded OpenViBE module + * \param error [out] : an optional output string containing the error on unload failure + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool unload(CString* error = nullptr) = 0; + /** + * \brief Gets the current filename associated with this plugin module + * \param fileName [out] : the filename of this plugin module + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool getFileName(CString& fileName) const = 0; + /** + * \brief Initializes this plugin module + * \return \e true in case of success. + * \return \e false in case of error. + * + * This function calls the onInitialize main function of the plugin module. + */ + virtual bool initialize() = 0; + /** + * \brief Gets a specific plugin object descriptor + * \param index [in] : the index of the plugin object descriptor to get + * \param desc [out] : a pointer on the associated plugin object descriptor + * \return \e true in case of success. + * \return \e false in case of error. + * + * This function should be called with \c index ranging from 0 to + * the number of plugin object descriptor - 1. The number of plugin object + * descriptor is known as soon as this function returns \e false meaning + * there are no more descriptors to return. + * + * This function calls the onGetPluginObjectDescription main function of the plugin module. + * + * \note \c desc can be \c NULL even if the function returned \e true + * \note \c desc IS \c NULL if the function returned \e false + * \note It is ok to call this function several times for a same index. + */ + virtual bool getPluginObjectDescription(size_t index, Plugins::IPluginObjectDesc*& desc) = 0; + /** + * \brief Uninitializes this plugin module + * \return \e true in case of success. + * \return \e false in case of error. + * + * This function calls the onUninitialize main function of the plugin module. + */ + virtual bool uninitialize() = 0; + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Plugins_PluginModule) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/plugins/ovIPluginModuleContext.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/plugins/ovIPluginModuleContext.h new file mode 100644 index 0000000..eab1d6d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/plugins/ovIPluginModuleContext.h @@ -0,0 +1,55 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +class ILogManager; +class ITypeManager; +class IScenarioManager; +class IErrorManager; +class IConfigurationManager; + +/** + * \class IPluginModuleContext + * \brief Plugin context + * \author Yann Renard (INRIA/IRISA) + * \date 2007-06-20 + * \ingroup Group_Plugins + * \ingroup Group_Kernel + * \ingroup Group_Extend + */ +class OV_API IPluginModuleContext : public IKernelObject +{ +public: + + /** + * \brief Gets the current scenario manager + * \return a reference on the current scenario manager + */ + virtual IScenarioManager& getScenarioManager() const = 0; + /** + * \brief Gets the current type manager + * \return a reference on the current type manager + */ + virtual ITypeManager& getTypeManager() const = 0; + /** + * \brief Gets the current log manager + * \return a reference on the current log manager + */ + virtual ILogManager& getLogManager() const = 0; + /** + * \brief Gets the current error manager + * \return a reference on the current error manager + */ + virtual IErrorManager& getErrorManager() const = 0; + /** + * \brief Gets the current configuration manager + * \return a reference on the current configuration manager + */ + virtual IConfigurationManager& getConfigurationManager() const = 0; + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Plugins_PluginModuleContext) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIAlgorithmScenarioExporter.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIAlgorithmScenarioExporter.h new file mode 100644 index 0000000..14bddf2 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIAlgorithmScenarioExporter.h @@ -0,0 +1,38 @@ +#pragma once + +#include "../../plugins/ovIAlgorithm.h" +#include "../../plugins/ovIAlgorithmDesc.h" +#include "../algorithm/ovIAlgorithmProto.h" +#include "../../ovIMemoryBuffer.h" + +#define OV_Algorithm_ScenarioExporter_InputParameterId_Scenario OpenViBE::CIdentifier(0x5B9C0D54, 0x04BA2957) +#define OV_Algorithm_ScenarioExporter_OutputParameterId_MemoryBuffer OpenViBE::CIdentifier(0x64030633, 0x419E3A33) + +namespace OpenViBE { +namespace Plugins { +class OV_API IAlgorithmScenarioExporter : public IAlgorithm +{ +public: + virtual bool exportStart(IMemoryBuffer& buffer, const CIdentifier& id) = 0; + virtual bool exportIdentifier(IMemoryBuffer& buffer, const CIdentifier& id, const CIdentifier& value) = 0; + virtual bool exportString(IMemoryBuffer& buffer, const CIdentifier& id, const CString& value) = 0; + virtual bool exportUInteger(IMemoryBuffer& buffer, const CIdentifier& id, uint64_t value) = 0; + virtual bool exportStop(IMemoryBuffer& buffer) = 0; + + _IsDerivedFromClass_(IAlgorithm, CIdentifier::undefined()) +}; + +class OV_API IAlgorithmScenarioExporterDesc : public IAlgorithmDesc +{ +public: + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OV_Algorithm_ScenarioExporter_InputParameterId_Scenario, "Scenario", Kernel::ParameterType_Object); + prototype.addOutputParameter(OV_Algorithm_ScenarioExporter_OutputParameterId_MemoryBuffer, "Memory buffer", Kernel::ParameterType_MemoryBuffer); + return true; + } + + _IsDerivedFromClass_(IAlgorithmDesc, CIdentifier::undefined()) +}; +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIAlgorithmScenarioImporter.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIAlgorithmScenarioImporter.h new file mode 100644 index 0000000..dc4e1b3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIAlgorithmScenarioImporter.h @@ -0,0 +1,43 @@ +#pragma once + +#include "../../plugins/ovIAlgorithm.h" +#include "../../plugins/ovIAlgorithmDesc.h" +#include "../algorithm/ovIAlgorithmProto.h" +#include "../../ovIMemoryBuffer.h" + +#define OV_Algorithm_ScenarioImporter_OutputParameterId_Scenario OpenViBE::CIdentifier(0x29574C87, 0x7BA77780) +#define OV_Algorithm_ScenarioImporter_InputParameterId_MemoryBuffer OpenViBE::CIdentifier(0x600463A3, 0x474B7F66) + +namespace OpenViBE { +namespace Plugins { +class OV_API IAlgorithmScenarioImporterContext : public IObject +{ +public: + + virtual bool processStart(const CIdentifier& id) = 0; + virtual bool processIdentifier(const CIdentifier& id, const CIdentifier& value) = 0; + virtual bool processString(const CIdentifier& id, const CString& value) = 0; + virtual bool processUInteger(const CIdentifier& id, uint64_t value) = 0; + virtual bool processStop() = 0; + + _IsDerivedFromClass_(IObject, CIdentifier::undefined()) +}; + +class OV_API IAlgorithmScenarioImporter : public IAlgorithm +{ +public: + virtual bool import(IAlgorithmScenarioImporterContext& ctx, const IMemoryBuffer& buffer) = 0; +}; + + +class OV_API IAlgorithmScenarioImporterDesc : public IAlgorithmDesc +{ + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addOutputParameter(OV_Algorithm_ScenarioImporter_OutputParameterId_Scenario, "Scenario", Kernel::ParameterType_Object); + prototype.addInputParameter(OV_Algorithm_ScenarioImporter_InputParameterId_MemoryBuffer, "Memory buffer", Kernel::ParameterType_MemoryBuffer); + return true; + } +}; +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIAttributable.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIAttributable.h new file mode 100644 index 0000000..a7041f9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIAttributable.h @@ -0,0 +1,34 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class IAttributable + * \author Yann Renard (IRISA/INRIA) + * \date 2006-12-07 + * \brief + * \ingroup Group_Scenario + * \ingroup Group_Kernel + */ +class OV_API IAttributable : public IKernelObject +{ +public: + + virtual bool addAttribute(const CIdentifier& id, const CString& value) = 0; + virtual bool removeAttribute(const CIdentifier& id) = 0; + virtual bool removeAllAttributes() = 0; + + virtual CString getAttributeValue(const CIdentifier& id) const = 0; + virtual bool setAttributeValue(const CIdentifier& id, const CString& value) = 0; + + virtual bool hasAttribute(const CIdentifier& id) const = 0; + virtual bool hasAttributes() const = 0; + + virtual CIdentifier getNextAttributeIdentifier(const CIdentifier& previousID) const = 0; + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Scenario_Attributable) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIBox.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIBox.h new file mode 100644 index 0000000..4e58ef2 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIBox.h @@ -0,0 +1,671 @@ +#pragma once + +#include "ovIAttributable.h" +#include "../../ovCObservable.h" + +#include + +namespace OpenViBE { +namespace Kernel { +enum EBoxEventMessageType { SettingValueUpdate, SettingChange, SettingDelete, SettingAdd, SettingsReorder, SettingsAllChange }; + +enum EBoxInterfacorType { Setting, Input, Output }; + +class OV_API BoxEventMessage +{ +public: + EBoxEventMessageType m_Type; + int m_FirstIdx = 0; + int m_SecondIdx = 0; +}; + +/** + * \class IBox + * \author Yann Renard (IRISA/INRIA) + * \date 2006-08-16 + * \brief Complete OpenViBE box interface + * \ingroup Group_Scenario + * \ingroup Group_Kernel + * + * This interface can be used in order to fully describe an + * OpenViBE black box. It describes its identification values, + * its inputs, its outputs and its settings. + */ +class OV_API IBox : public IAttributable, public CObservable +{ +public: + + /** \name Box naming and identification */ + //@{ + + /** + * \brief Gets the identifier of this box + * \return The identifier of this OpenViBE box. + */ + virtual CIdentifier getIdentifier() const = 0; + /** + * \brief Gets the display name of this box + * \return The name of this OpenViBE box. + */ + virtual CString getName() const = 0; + /** + * \brief Gets the algorithm class identifier + * \return This box' algorithm class identifier + */ + virtual CIdentifier getAlgorithmClassIdentifier() const = 0; + /** + * \brief Changes the identifier of this box + * \param id [in] : The new id + * this box should take. + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setIdentifier(const CIdentifier& id) = 0; + /** + * \brief Renames this box + * \param name [in] : The name this box should take + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setName(const CString& name) = 0; + /** + * \brief Changes the algorithm identifier of this box + * \param id [in] : The new algorithm + * identifier this box should take. + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setAlgorithmClassIdentifier(const CIdentifier& id) = 0; + + + /** + * \brief Requests for a suggested id. If it is already used in the box or + * if it is CIdentifier::undefined(), a news random one is proposed uniq in the scope of settings. + * \param id [in] : the requested id + * \return the proposed id + */ + virtual CIdentifier getUnusedSettingIdentifier(const CIdentifier& id = CIdentifier::undefined()) const = 0; + + /** + * \brief Requests for a suggested id. If it is already used in the box or + * if it is CIdentifier::undefined(), a news random one is proposed uniq in the scope of the inputs + * of the given map object. + * \param id [in] : the requested id + * \return the proposed id + */ + virtual CIdentifier getUnusedInputIdentifier(const CIdentifier& id = CIdentifier::undefined()) const = 0; + + /** + * \brief Requests for a suggested id. If it is already used in the box or + * if it is CIdentifier::undefined(), a news random one is proposed uniq in the scope of the outputs + * of the given map object. + * \param id [in] : the requested id + * \return the proposed id + */ + virtual CIdentifier getUnusedOutputIdentifier(const CIdentifier& id = CIdentifier::undefined()) const = 0; + + //@} + /** \name Initialisation from prototypes etc... */ + //@{ + + /** + * \brief Initializes the box from box algorithm descriptor + * \param id [in] : The new algorithm + * identifier this box should take. + * \return \e true in case of success. + * \return \e false in case of error. + * + * Resets the box and initializes its input/output/settings + * according to the box algorithm descriptor + */ + virtual bool initializeFromAlgorithmClassIdentifier(const CIdentifier& id) = 0; + /** + * \brief Initializes the box from an already existing box + * \param existingBox [in] : The existing box. + * \return \e true in case of success. + * \return \e false in case of error. + * + * Resets the box and initializes its input/output/settings + * according to the existing box. + */ + virtual bool initializeFromExistingBox(const IBox& existingBox) = 0; + + + virtual bool addInterfacor(const EBoxInterfacorType type, const CString& name, const CIdentifier& typeID, const CIdentifier& id, + const bool notify = true) = 0; + virtual bool removeInterfacor(const EBoxInterfacorType type, const size_t index, const bool notify = true) = 0; + + virtual size_t getInterfacorCount(const EBoxInterfacorType type) const = 0; + virtual size_t getInterfacorCountIncludingDeprecated(const EBoxInterfacorType type) const = 0; + + virtual bool getInterfacorIdentifier(const EBoxInterfacorType type, const size_t index, CIdentifier& id) const = 0; + + virtual bool getInterfacorIndex(const EBoxInterfacorType type, const CIdentifier& id, size_t& index) const = 0; + virtual bool getInterfacorIndex(const EBoxInterfacorType type, const CString& name, size_t& index) const = 0; + + virtual bool getInterfacorType(const EBoxInterfacorType type, const size_t index, CIdentifier& typeID) const = 0; + virtual bool getInterfacorType(const EBoxInterfacorType type, const CIdentifier& id, CIdentifier& typeID) const = 0; + virtual bool getInterfacorType(const EBoxInterfacorType type, const CString& name, CIdentifier& typeID) const = 0; + + virtual bool getInterfacorName(const EBoxInterfacorType type, const size_t index, CString& name) const = 0; + virtual bool getInterfacorName(const EBoxInterfacorType type, const CIdentifier& id, CString& name) const = 0; + + virtual bool getInterfacorDeprecatedStatus(const EBoxInterfacorType type, const size_t index, bool& value) const = 0; + virtual bool getInterfacorDeprecatedStatus(const EBoxInterfacorType type, const CIdentifier& id, bool& value) const = 0; + + virtual bool hasInterfacorWithIdentifier(const EBoxInterfacorType type, const CIdentifier& id) const = 0; + virtual bool hasInterfacorWithType(const EBoxInterfacorType type, const size_t index, const CIdentifier& typeID) const = 0; + virtual bool hasInterfacorWithNameAndType(const EBoxInterfacorType type, const CString& name, const CIdentifier& typeID) const = 0; + + virtual bool setInterfacorType(const EBoxInterfacorType type, const size_t index, const CIdentifier& typeID) = 0; + virtual bool setInterfacorType(const EBoxInterfacorType type, const CIdentifier& id, const CIdentifier& typeID) = 0; + virtual bool setInterfacorType(const EBoxInterfacorType type, const CString& name, const CIdentifier& typeID) = 0; + + virtual bool setInterfacorName(const EBoxInterfacorType type, const size_t index, const CString& name) = 0; + virtual bool setInterfacorName(const EBoxInterfacorType type, const CIdentifier& id, const CString& name) = 0; + + virtual bool setInterfacorDeprecatedStatus(const EBoxInterfacorType type, const size_t index, const bool value) = 0; + virtual bool setInterfacorDeprecatedStatus(const EBoxInterfacorType type, const CIdentifier& id, const bool value) = 0; + + virtual bool updateInterfacorIdentifier(const EBoxInterfacorType type, const size_t index, const CIdentifier& id) = 0; + + virtual bool addInterfacorTypeSupport(const EBoxInterfacorType type, const CIdentifier& typeID) = 0; + virtual bool hasInterfacorTypeSupport(const EBoxInterfacorType type, const CIdentifier& typeID) const = 0; + //@} + /** \name Input management */ + //@{ + + /** + * \brief Adds an input to this box + * \param name [in] : The input name + * \param typeID [in] : The + * input type id + * \param id [in] : The input id + * \param notify: if true, activate notification callback (true by default) + * \return \e true in case of success. + * \return \e false in case of error. + * + * The input is always added after the last + * already existing input. + */ + virtual bool addInput(const CString& name, const CIdentifier& typeID, const CIdentifier& id = CIdentifier::undefined(), const bool notify = true) = 0; + + /** + * \brief Removes an input for this box + * \param index [in] : The index + * of the input to be removed + * \param notify manage notify. Is enabled by default + * \return \e true in case of success. + * \return \e false in case of error. + * + * Inputs coming after the removed input + * have their indices changing after this, + * they all decrease by 1. + */ + virtual bool removeInput(const size_t index, const bool notify = true) = 0; + + /** + * \brief Gets the number of inputs for this box + * \return The number of inputs for this box. + */ + virtual size_t getInputCount() const = 0; + + /** + * \brief Gets an input type identifier by index + * \param index [in] : The input index + * \param typeID [out] : The type identifier + * \return \e true in case of success. + * \return \e false in case of error. In such case, + * \c typeID remains unchanged. + */ + virtual bool getInputType(const size_t index, CIdentifier& typeID) const = 0; + + /** + * \brief Gets an input name by index + * \param index [in] : The input index + * \param name [out] : The name of this input + * \return \e true in case of success. + * \return \e false in case of error. In such case, + * \c name remains unchanged. + */ + virtual bool getInputName(const size_t index, CString& name) const = 0; + + /** + * \brief Sets an input type identifier by index + * \param index [in] : The input index + * \param typeID [in] : The type identifier + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setInputType(const size_t index, const CIdentifier& typeID) = 0; + + /** + * \brief Sets an input name by index + * \param index [in] : The input index + * \param name [in] : The name of this input + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setInputName(const size_t index, const CString& name) = 0; + + //@} + /** \name Output management */ + //@{ + + /** + * \brief Adds an output to this box + * \param name [in] : The output name + * \param typeID [in] : The + * output type idenfitier + * \param id [in] : The output id + * \param notify: if true, activate notification callback (true by default) + * \return \e true in case of success. + * \return \e false in case of error. + * + * The output is always added after the last + * already existing output. + */ + virtual bool addOutput(const CString& name, const CIdentifier& typeID, const CIdentifier& id = CIdentifier::undefined(), + const bool notify = true) = 0; + + /** + * \brief Removes an output for this box + * \param index [in] : The index + * of the output to remove + * \param notify manage notify. Is enabled by default + * \return \e true in case of success. + * \return \e false in case of error. + * + * Outputs coming after the removed output + * have their indices changing after this, + * they all decrease by 1. + */ + virtual bool removeOutput(const size_t index, const bool notify = true) = 0; + /** + * \brief Gets the number of outputs for this box + * \return The number of outputs for this box. + */ + virtual size_t getOutputCount() const = 0; + + /** + * \brief Gets an output type identifier by index + * \param index [in] : The output index + * \param typeID [out] : The type identifier + * \return \e true in case of success. + * \return \e false in case of error. In such case, + * \c typeID remains unchanged. + */ + virtual bool getOutputType(const size_t index, CIdentifier& typeID) const = 0; + + /** + * \brief Gets an output name by index + * \param index [in] : The output index + * \param name [out] : The name of this output + * \return \e true in case of success. + * \return \e false in case of error. In such case, + * \c name remains unchanged. + */ + virtual bool getOutputName(const size_t index, CString& name) const = 0; + + /** + * \brief Sets an output type identifier by index + * \param index [in] : The output index + * \param typeID [in] : The type identifier + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setOutputType(const size_t index, const CIdentifier& typeID) = 0; + + /** + * \brief Sets an output name by index + * \param index [in] : The output index + * \param name [in] : The name of this output + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setOutputName(const size_t index, const CString& name) = 0; + + //@} + /** \name Setting management */ + //@{ + + /** + * \brief Adds a setting to this box + * \param name [in] : The setting name + * \param typeID [in] : The + * setting type id + * \param value [in] : The default + * value for this setting + * \param index [in] : The index where to + * add the setting + * \param modifiability [in] : true if modifiable setting + * \param id [in] : The setting id + * \param notify: if true, activate notification callback (true by default) + * + * \return \e true in case of success. + * \return \e false in case of error. + * + * The setting is added to the index required. + * The default value -1 means that the setting + * will be add to the end. + */ + virtual bool addSetting(const CString& name, const CIdentifier& typeID, const CString& value, const size_t index = size_t(-1), + const bool modifiability = false, + const CIdentifier& id = CIdentifier::undefined(), const bool notify = true) = 0; + + /** + * \brief Removes a setting for this box + * \param index [in] : The index + * of the setting to remove + * \param notify manage notify. Is enabled by default + * \return \e true in case of success. + * \return \e false in case of error. + * + * Settings coming after the removed setting + * have their indices changing after this, + * they all decrease by 1. + */ + virtual bool removeSetting(const size_t index, const bool notify = true) = 0; + /** + * \brief Gets the number of settings for this box + * \return The number of settings for this box. + */ + virtual size_t getSettingCount() const = 0; + + /** + * \brief checks if a setting with a given name is present + * \param name [in] : Name of the setting + * \return true if setting is present, false otherwise + */ + virtual bool hasSettingWithName(const CString& name) const = 0; + + /** + * \brief Gets a setting type by index + * \param index [in] : The setting index + * \param typeID [out] : The type identifier + * \return \e true in case of success. + * \return \e false in case of error. In such case, \c typeID remains unchanged. + */ + virtual bool getSettingType(const size_t index, CIdentifier& typeID) const = 0; + + /** + * \brief Gets a setting name by index + * \param index [in] : The setting index + * \param name [out] : The name of this setting + * \return \e true in case of success. + * \return \e false in case of error. In such case, \c name remains unchanged. + */ + virtual bool getSettingName(const size_t index, CString& name) const = 0; + + /** + * \brief Gets the default setting value by index + * \param index [in] : The setting index + * \param value [out] : The default value + * \return \e true in case of success. + * \return \e false in case of error. In such case, \c value remains unchanged. + */ + virtual bool getSettingDefaultValue(const size_t index, CString& value) const = 0; + + /** + * \brief Gets the default setting value by id + * \param id [in] : The setting id + * \param value [out] : The default value + * \return \e true in case of success. + * \return \e false in case of error. In such case, \c value remains unchanged. + */ + virtual bool getSettingDefaultValue(const CIdentifier& id, CString& value) const = 0; + + /** + * \brief Gets the default setting value by name + * \param name [in] : The setting name + * \param defaultValue [out] : The default value + * \return \e true in case of success. + * \return \e false in case of error. In such case, \c defaultValue remains unchanged. + */ + virtual bool getSettingDefaultValue(const CString& name, CString& defaultValue) const = 0; + + /** + * \brief Gets the setting value by index + * \param index [in] : The setting index + * \param value [out] : The value + * \return \e true in case of success. + * \return \e false in case of error. In such case, \c value remains unchanged. + */ + virtual bool getSettingValue(const size_t index, CString& value) const = 0; + + /** + * \brief Gets the setting value by id + * \param id [in] : The setting id + * \param value [out] : The value + * \return \e true in case of success. + * \return \e false in case of error. In such case, \c value remains unchanged. + */ + virtual bool getSettingValue(const CIdentifier& id, CString& value) const = 0; + + /** + * \brief Gets the setting value by name + * \param name [in] : The setting name + * \param value [out] : The value + * \return \e true in case of success. + * \return \e false in case of error. In such case, + * \c value remains unchanged. + */ + virtual bool getSettingValue(const CString& name, CString& value) const = 0; + + /** + * \brief Sets a setting type identifier by index + * \param index [in] : The setting index + * \param typeID [in] : The type identifier + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setSettingType(const size_t index, const CIdentifier& typeID) = 0; + + /** + * \brief Sets a setting name by index + * \param index [in] : The setting index + * \param name [in] : The name of this setting + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setSettingName(const size_t index, const CString& name) = 0; + + /** + * \brief Sets the default setting value by index + * \param index [in] : The setting index + * \param value [in] : The default value + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setSettingDefaultValue(const size_t index, const CString& value) = 0; + + /** + * \brief Sets the default setting value by id + * \param id [in] : The setting id + * \param value [in] : The default value + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setSettingDefaultValue(const CIdentifier& id, const CString& value) = 0; + + /** + * \brief Sets the default setting value by name + * \param name [in] : The setting name + * \param value [in] : The default value + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setSettingDefaultValue(const CString& name, const CString& value) = 0; + + /** + * \brief Sets the setting value by index + * \param index [in] : The setting index + * \param value [in] : The value + * \param notify : allow notification + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setSettingValue(const size_t index, const CString& value, const bool notify = true) = 0; + + /** + * \brief Sets the setting value by id + * \param id [in] : The setting id + * \param value [in] : The value + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setSettingValue(const CIdentifier& id, const CString& value) = 0; + + /** + * \brief Sets the setting value by name + * \param name [in] : The setting name + * \param value [in] : The value + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setSettingValue(const CString& name, const CString& value) = 0; + + /** + * \brief Gets the setting modifiability by index + * \param index [in] : The setting index + * \param value [out] : The value + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool getSettingMod(const size_t index, bool& value) const = 0; + + /** + * \brief Gets the setting modifiability by id + * \param id [in] : The setting id + * \param value [out] : The value + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool getSettingMod(const CIdentifier& id, bool& value) const = 0; + + /** + * \brief Gets the setting modifiability by name + * \param name [in] : The setting name + * \param value [out] : The value + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool getSettingMod(const CString& name, bool& value) const = 0; + + /** + * \brief Sets the setting modifiability by index + * \param index [in] : The setting index + * \param value [in] : The value + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setSettingMod(const size_t index, const bool value) = 0; + + /** + * \brief Sets the setting modifiability by id + * \param id [in] : The setting id + * \param value [in] : The value + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setSettingMod(const CIdentifier& id, const bool value) = 0; + + /** + * \brief Sets the setting modifiability by name + * \param name [in] : The setting name + * \param value [in] : The value + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setSettingMod(const CString& name, const bool value) = 0; + + virtual bool swapSettings(const size_t indexA, const size_t indexB) = 0; + virtual bool swapInputs(const size_t indexA, const size_t indexB) = 0; + virtual bool swapOutputs(const size_t indexA, const size_t indexB) = 0; + /** + * \brief Inform if the box possess a modifiable interface + * \return \e true if it does. + * \return \e false otherwise. + */ + virtual bool hasModifiableSettings() const = 0; + + + virtual size_t* getModifiableSettings(size_t& count) const = 0; + + + //@} + + + /** \name Input/Output management */ + //@{ + /** + * \brief Marks this type as supported by inputs + * \param typeID [in] : The type identifier + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool addInputSupport(const CIdentifier& typeID) = 0; + + /** + * \brief Indicates if a type is support by inputs + * \param typeID [in] : The type identifier + * \return \e true if type is support. + * \return \e false if type isn't support. + */ + virtual bool hasInputSupport(const CIdentifier& typeID) const = 0; + + /** + * \brief Marks this type as supported by outputs + * \param typeID [in] : The type identifier + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool addOutputSupport(const CIdentifier& typeID) = 0; + + /** + * \brief Indicates if a type is support by outputs + * \param typeID [in] : The type identifier + * \return \e true if type is support. + * \return \e false if type isn't support. + */ + virtual bool hasOutputSupport(const CIdentifier& typeID) const = 0; + //@} + + /** + * \brief Set the supported stream type for input and output according + * to the restriction of the algorithm whose identifier is given in parameter. + * \param typeID [in] : identifier of the algorithm + * \return \e true in case of success. + * \return \e false in case of error. + * \note The supported stream list is not reset. + */ + virtual bool setSupportTypeFromAlgorithmIdentifier(const CIdentifier& typeID) = 0; + + /** + * \brief Get a vector of input supported types + * \return the vector of input supported types + */ + virtual std::vector getInputSupportTypes() const = 0; + + /** + * \brief Get a vector of output supported types + * \return the vector of output supported types + */ + virtual std::vector getOutputSupportTypes() const = 0; + + /** + * \brief clear output supported types list + */ + virtual void clearOutputSupportTypes() = 0; + + /** + * \brief clear input supported types list + */ + virtual void clearInputSupportTypes() = 0; + + _IsDerivedFromClass_(IAttributable, OV_ClassId_Kernel_Scenario_Box) +}; + +typedef IBox IStaticBoxContext; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIBoxIO.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIBoxIO.h new file mode 100644 index 0000000..40a069d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIBoxIO.h @@ -0,0 +1,190 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class IBoxIO + * \author Yann Renard (INRIA/IRISA) + * \date 2006-06-21 + * \brief Main OpenViBE box interface to communicate with the kernel + * \ingroup Group_Scenario + * \ingroup Group_Kernel + * + * This context allows the object which uses it to check + * inputs states, read them, write outputs while being + * in a dynamic context (used by player). + */ +class OV_API IBoxIO : public IKernelObject +{ +public: + + /** \name Accessing the input chunks informations */ + //@{ + + /** + * \brief Gets the number of pending chunks for an input + * \param index [in] : the input to work on. + * \return The number of pending chunks for an input + */ + virtual size_t getInputChunkCount(const size_t index) const = 0; + /** + * \brief Gets an input chunk and its time validity. + * \param inputIdx [in] : the index of the desired input. + * \param chunkIdx [in] : the index of the desired chunk in this input. + * \param startTime [out] : the time which the chunk starts at + * \param endTime [out] : the time which the chunk ends at + * \param size [out] : the chunk buffer size in bytes + * \param buffer [out] : the chunk data itself + * \return \e true in case of success. + * \return \e false in case of error. + * \warning When returning \e false, none of the value + * \c startTime, \c endTime, \c size nor + * \c buffer are defined. + * \warning The chunks are ordered like they arrived + * to the box, this means chunk 0 arrived + * before chunk 1, that arrived before + * chunk 2 and so on... + * \note Both time value are given in fixed point 32:32 seconds + * \sa getInputChunkCount + * \sa markInputAsDeprecated + */ + virtual bool getInputChunk(const size_t inputIdx, const size_t chunkIdx, uint64_t& startTime, uint64_t& endTime, size_t& size, + const uint8_t*& buffer) const = 0; + /** + * \brief Gets an input chunk. + * \param inputIdx [in] : the index of the desired input. + * \param chunkIdx [in] : the index of the desired + * chunk in this input. + * \return The memory buffer for the specified chunk. + * \return \c NULL in case of error. + * \warning The chunks are ordered like they arrived + * to the box, this means chunk 0 arrived + * before chunk 1, that arrived before + * chunk 2 and so on... + * \sa getInputChunkCount + * \sa markInputAsDeprecated + */ + virtual const IMemoryBuffer* getInputChunk(const size_t inputIdx, const size_t chunkIdx) const = 0; + /** + * \brief Gets an input chunk start time. + * \param inputIdx [in] : the index of the desired input. + * \param chunkIdx [in] : the index of the desired + * chunk in this input. + * \return The input chunk start time. + * \return \c 0 is returned in case of error. + * \note Both time value are given in fixed point 32:32 seconds + * \sa getInputChunkCount + * \sa markInputAsDeprecated + */ + virtual uint64_t getInputChunkStartTime(const size_t inputIdx, const size_t chunkIdx) const = 0; + /** + * \brief Gets an input chunk end time. + * \param inputIdx [in] : the index of the desired input. + * \param chunkIdx [in] : the index of the desired + * chunk in this input. + * \return The input chunk end time. + * \return \c 0 is returned in case of error. + * \note Both time value are given in fixed point 32:32 seconds + * \sa getInputChunkCount + * \sa markInputAsDeprecated + */ + virtual uint64_t getInputChunkEndTime(const size_t inputIdx, const size_t chunkIdx) const = 0; + /** + * \brief Marks an input chunk as deprecated + * \param inputIdx [in] : the index of the desired input. + * \param chunkIdx [in] : the index of the chunk to mark. + * \return \e true in case of success. + * \return \e false in case of error. + * \warning The chunks are ordered like they arrived + * to the box, this means chunk 0 arrived + * before chunk 1, that arrived before + * chunk 2 and so on... + * + * This function discards a chunk when it's been read + * and processed. This allows the kernel to know a chunk + * has been treated successfully and will not be used + * any more so it can be removed from memory. + * + * \sa getInputChunkCount + * \sa releaseChunk + */ + virtual bool markInputAsDeprecated(const size_t inputIdx, const size_t chunkIdx) = 0; + + //@} + /** \name Accessing the output chunks information */ + //@{ + + /** + * \brief Gets the output chunk size + * \param index [in] : the index of the output to work on + * \return The output chunk size in bytes + */ + virtual size_t getOutputChunkSize(const size_t index) const = 0; + /** + * \brief Sets an output chunk size + * \param index [in] : the index of the output to work on + * \param size [in] : the new size of the output chunk + * \param discard [in] : tells if existing buffer should be discarded or not + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setOutputChunkSize(const size_t index, const size_t size, const bool discard = true) = 0; + /** + * \brief Gets a pointer to the current output chunk buffer + * \param index [in] : the index of the output to work on + * \return A pointer to the current output chunk buffer + * \warning The returned pointer may change if the caller resizes the chunk buffer using \c setChunkSize ! + */ + virtual uint8_t* getOutputChunkBuffer(const size_t index) = 0; + /** + * \brief Appends data to the output chunk + * \param index [in] : the index of the output to work on + * \param buffer [in] : the buffer to append to the current buffer + * \param size [in] : the size of the appended buffer + * \return \e true in case of success. + * \return \e false in case of error. + * \warning This function resizes the chunk size calling \c setOutputChunkSize and then appends data doing a copy. + */ + virtual bool appendOutputChunkData(const size_t index, const uint8_t* buffer, const size_t size) = 0; + /** + * \brief Gets an output chunk. + * \param index [in] : the index of the desired output. + * \return The output chunk memory buffer for the specified output. + * \return \c NULL in case of error. + * \sa markOutputAsReadyToSend + */ + virtual IMemoryBuffer* getOutputChunk(const size_t index) = 0; + /** + * \brief Marks output buffer as 'ready to send' + * \param index [in] : the index of the output to work on + * \param startTime [in] : the start time for + * the related buffer. + * \param endTime [in] : the end time for the + * related buffer. + * \return \e true in case of success. + * \return \e false in case of error. + * + * The output chunk should first be filled. For + * that, one will have to get a reference on it + * thanks to the getChunkBuffer or the + * appendOutputChunkData methods ! The + * player will then know the buffer can be sent. + * + * When called, the function flushes the output + * chunk. Thus, after the call, the chunk size + * is turned to 0 and the output is ready for + * a new chunk when necessary... + * + * \note Both time value are given in fixed point 32:32 seconds + * \sa getChunk + */ + virtual bool markOutputAsReadyToSend(const size_t index, const uint64_t startTime, const uint64_t endTime) = 0; + + //@} + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Scenario_BoxIO) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIBoxListenerContext.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIBoxListenerContext.h new file mode 100755 index 0000000..b09da79 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIBoxListenerContext.h @@ -0,0 +1,96 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class IBoxListenerContext + * \author Yann Renard (INRIA/IRISA) + * \date 2007-11-06 + * \brief Exectution context for box algorithm descriptors + * \ingroup Group_Kernel + * \ingroup Group_Extend + * \sa Plugins::IBoxAlgorithmDesc + * \sa Plugins::IBoxAlgorithm + */ +class OV_API IBoxListenerContext : public IKernelObject +{ +public: + + /** \name Manager accessors */ + //@{ + + /** + * \brief Gets a reference on the current algorithm manager + * \return a reference on the current algorithm manager + */ + virtual IAlgorithmManager& getAlgorithmManager() const = 0; + /** + * \brief Gets a reference on the current player manager + * \return a reference on the current player manager + */ + virtual IPlayerManager& getPlayerManager() const = 0; + /** + * \brief Gets a reference on the current plugin manager + * \return a reference on the current plugin manager + */ + virtual IPluginManager& getPluginManager() const = 0; + /** + * \brief Gets a reference on the current metabox manager + * \return a reference on the current metabox manager + */ + virtual IMetaboxManager& getMetaboxManager() const = 0; + /** + * \brief Gets a reference on the current scenario manager + * \return a reference on the current scenario manager + */ + virtual IScenarioManager& getScenarioManager() const = 0; + /** + * \brief Gets a reference on the current type manager + * \return a reference on the current type manager + */ + virtual ITypeManager& getTypeManager() const = 0; + /** + * \brief Gets a reference on the current log manager + * \return a reference on the current log manager + */ + virtual ILogManager& getLogManager() const = 0; + /** + * \brief Gets a reference on the current error manager + * \return a reference on the current error manager + */ + virtual IErrorManager& getErrorManager() const = 0; + + /** + * \brief Gets a reference on the current configuration manager + * \return a reference on the current configuration manager + */ + virtual IConfigurationManager& getConfigurationManager() const = 0; + + //@} + /** \name Box specific stuffs */ + + /** + * \brief Gets a reference to the considered box + * \return a reference to the considered box + */ + virtual IBox& getBox() const = 0; + /** + * \brief Gets a reference to the scenario owning the considered box + * \return a reference to the scenario owning the considered box + */ + virtual IScenario& getScenario() const = 0; + /** + * \brief Gets the index of the concerned callback message + * \return the index of the concerned callback message in case it makes sense + * \return \c 0xffffffff in case it does not make any sense + */ + virtual size_t getIndex() const = 0; + + //@} + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Scenario_BoxListenerContext) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIBoxProto.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIBoxProto.h new file mode 100755 index 0000000..e1d3414 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIBoxProto.h @@ -0,0 +1,112 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \brief This enum lists all the flags a box can be have + * \sa IBoxProto::addFlag + */ +enum EBoxFlag +{ + BoxFlag_CanAddInput, + BoxFlag_CanModifyInput, + BoxFlag_CanAddOutput, + BoxFlag_CanModifyOutput, + BoxFlag_CanAddSetting, + BoxFlag_CanModifySetting, + BoxFlag_IsDeprecated, + BoxFlag_ManualUpdate +}; + +/** + * \class IBoxProto + * \author Yann Renard (INRIA/IRISA) + * \date 2006-07-05 + * \brief OpenViBE box prototype + * \ingroup Group_Scenario + * \ingroup Group_Kernel + * \ingroup Group_Extend + * + * This class is used by a plugin algorithm descriptor + * to let the OpenViBE platform know what an algorithm + * box looks like. It declares several things, like + * it input types, output types and settings. + * + * \sa IBoxAlgorithmDesc + */ +class OV_API IBoxProto : public IKernelObject +{ +public: + + /** + * \brief Adds an input to the box + * \param name [in] : the name of the input to add + * \param typeID [in] : the type of the input + * \param id [in] : The input id + * \param notify [in]: if true, activate notification callback (true by default) + * \return true if successful + */ + virtual bool addInput(const CString& name, const CIdentifier& typeID, const CIdentifier& id = CIdentifier::undefined(), const bool notify = true) = 0; + + /** + * \brief Adds an output to the box + * \param name [in] : the name of the output to add + * \param typeID [in] : the type of the output + * \param id [in] : The output id + * \param notify [in]: if true, activate notification callback (true by default) + * \return true if successful + */ + virtual bool addOutput(const CString& name, const CIdentifier& typeID, const CIdentifier& id = CIdentifier::undefined(), + const bool notify = true) = 0; + + /** + * \brief Add an setting to the box + * \param name [in] : the name of the setting to add + * \param typeID [in] : the type of the setting + * \param value [in] : the default value of this + * setting (used to initialize the box itself) + * \param modifiable [in] : true if modifiable setting + * \param id [in] : The setting id + * \param notify [in]: if true, activate notification callback (true by default) + * \return true if successful + */ + virtual bool addSetting(const CString& name, const CIdentifier& typeID, const CString& value, const bool modifiable = false, + const CIdentifier& id = CIdentifier::undefined(), + const bool notify = true) = 0; + /** + * \brief Adds a flag to the box + * \param flag [in] : the flag to add to the box + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool addFlag(const EBoxFlag flag) = 0; + + /** + * \brief Adds a flag to the box + * \param flagID [in] : the flag to add to the box + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool addFlag(const CIdentifier& flagID) = 0; + + /** + * \brief Adds a new type supported by inputs of the box + * \param typeID [in] : The type identifier + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool addInputSupport(const CIdentifier& typeID) = 0; + /** + * \brief Adds a new type supported by outputs of the box + * \param typeID [in] : The type identifier + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool addOutputSupport(const CIdentifier& typeID) = 0; + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Scenario_BoxProto) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIComment.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIComment.h new file mode 100644 index 0000000..054c5ed --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIComment.h @@ -0,0 +1,74 @@ +#pragma once + +#include "ovIAttributable.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class IComment + * \author Yann Renard INRIA + * \date 2010-04-27 + * \brief A comment class for scenarios + * \ingroup Group_Scenario + * \ingroup Group_Kernel + * + * This interface can be used in order to fully describe an + * OpenViBE comment in order to help the understanding of a + * given scenario. + */ +class OV_API IComment : public IAttributable +{ +public: + + /** \name Comment naming and identification */ + //@{ + + /** + * \brief Gets the identifier of this comment + * \return The identifier of this OpenViBE comment. + */ + virtual CIdentifier getIdentifier() const = 0; + /** + * \brief Gets the display name of this comment + * \return The name of this OpenViBE comment. + */ + virtual CString getText() const = 0; + /** + * \brief Changes the identifier of this comment + * \param id [in] : The new id + * this comment should take. + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setIdentifier(const CIdentifier& id) = 0; + /** + * \brief Changes the text of this comment + * \param text [in] : The text this comment should contain + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setText(const CString& text) = 0; + + //@} + /** \name Initialisation from prototypes etc... */ + //@{ + + /** + * \brief Initializes the comment from an already existing comment + * \param comment [in] : The existing box. + * \return \e true in case of success. + * \return \e false in case of error. + * + * Resets the comment and initializes its text/attributes + * according to the existing comment. + */ + virtual bool initializeFromExistingComment(const IComment& comment) = 0; + + //@} + + _IsDerivedFromClass_(IAttributable, OV_ClassId_Kernel_Scenario_Comment) +}; + +typedef IComment static_comment_context_t; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovILink.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovILink.h new file mode 100644 index 0000000..889d4bd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovILink.h @@ -0,0 +1,121 @@ +#pragma once + +#include "ovIAttributable.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class ILink + * \author Yann Renard (IRISA/INRIA) + * \date 2006-08-16 + * \brief Link information between OpenViBE box + * \ingroup Group_Scenario + * \ingroup Group_Kernel + * + * This class collects informations between OpenViBE + * boxes : box identifiers and input / output indices. + */ +class OV_API ILink : public IAttributable +{ +public: + + /** \name Identification */ + //@{ + + /** + * \brief Initialize link from existing link by copying members + * \param link the existing link + * @return true + */ + virtual bool initializeFromExistingLink(const ILink& link) = 0; + + /** + * \brief Changes this link's id + * \param id [in] : The new id this link should have + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setIdentifier(const CIdentifier& id) = 0; + /** + * \brief Gets the identifier of this link + * \return The identifier of this link. + */ + virtual CIdentifier getIdentifier() const = 0; + + //@} + /** \name Source / Target management */ + //@{ + + /** + * \brief Sets the source of this link + * \param boxID [in] : The identifier of the source box + * \param boxOutputIdx [in] : The index of the output to use on the source box + * \param boxOutputID [in] : The identifier of the output to use on the source box + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setSource(const CIdentifier& boxID, size_t boxOutputIdx, CIdentifier boxOutputID) = 0; + /** + * \brief Sets the target of this link + * \param boxID [in] : The identifier of the target box + * \param boxInputIdx [in] : The index of the input to use on the target box + * \param boxInputID [in] : The identifier of the input to use on the target box + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setTarget(const CIdentifier& boxID, size_t boxInputIdx, CIdentifier boxInputID) = 0; + /** + * \brief Gets the source information for this link + * \param boxID [out] : The identifier of the source box + * \param boxOutputIdx [out] : The output index of the source box + * \param boxOutputID [out] : The output identifier of the target box + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool getSource(CIdentifier& boxID, size_t& boxOutputIdx, CIdentifier& boxOutputID) const = 0; + /** + * \brief Gets the source box identifier for this link + * \return the source box identifier for thit link + */ + virtual CIdentifier getSourceBoxIdentifier() const = 0; + /** + * \brief Gets the source box output index for this link + * \return the source box output index for this link + */ + virtual size_t getSourceBoxOutputIndex() const = 0; + /** + * \brief Gets the source box output index for this link + * \return the source box output index for this link + */ + virtual CIdentifier getSourceBoxOutputIdentifier() const = 0; + /** + * \brief Gets the target information for this link + * \param boxID [out] : The identifier of the target box + * \param boxInputIdx [out] : The input index of the target box + * \param boxInputID [out] : The input identifier of the target box + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool getTarget(CIdentifier& boxID, size_t& boxInputIdx, CIdentifier& boxInputID) const = 0; + /** + * \brief Gets the target box identifier for this link + * \return the target box identifier for this link + */ + virtual CIdentifier getTargetBoxIdentifier() const = 0; + /** + * \brief Gets the target box input index for this link + * \return the target box input index for this link + */ + virtual size_t getTargetBoxInputIndex() const = 0; + /** + * \brief Gets the target box input identifier for this link + * \return the target box input identifier for this link + */ + virtual CIdentifier getTargetBoxInputIdentifier() const = 0; + + //@} + + _IsDerivedFromClass_(IAttributable, OV_ClassId_Kernel_Scenario_Link) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIMetadata.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIMetadata.h new file mode 100644 index 0000000..fec2aaf --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIMetadata.h @@ -0,0 +1,75 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class IMetadata + * \author Jozef Legeny + * \date 2016-10-11 + * \brief Metadata class for scenarios + * + * Scenario can contain string metadata for the purpose of being used by applications. Each piece of metadata is identified by a (unique) Identifier + * and a (non-unique) Type. Applications can create metadata in scenarios and should not modify metadata with types they do not understand. + * + * \ingroup Group_Scenario + * \ingroup Group_Kernel + */ +class OV_API IMetadata : public IKernelObject +{ +public: + + /** + * \return The identifier of this scenario metadata. + */ + virtual CIdentifier getIdentifier() const = 0; + + /** + * \return The type of this scenario metadata + */ + virtual CIdentifier getType() const = 0; + + /** + * \return The enclosed metadata + */ + virtual CString getData() const = 0; + + /** + * \brief Change the identifier of this metadata + * \param[in] id The new id + * \retval true in case of success. + * \retval false in case of error. + */ + virtual bool setIdentifier(const CIdentifier& id) = 0; + + /** + * \brief Change the identifier of this metadata + * \param[in] id The new id + * \retval true in case of success. + * \retval false in case of error. + */ + virtual bool setType(const CIdentifier& id) = 0; + + /** + * \brief Change the enclosed data + * \param[in] data The text this comment should contain + * \retval true in case of success. + * \retval false in case of error. + */ + virtual bool setData(const CString& data) = 0; + + /** + * \brief Initializes the metadata from an already existing metadata + * \param[in] metadata The existing metadata + * \retval true in case of success. + * \retval false in case of error. + * + * Resets the metadata and initializes its text/attributes according to the existing object. + */ + virtual bool initializeFromExistingMetadata(const IMetadata& metadata) = 0; + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Scenario_Metadata) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIScenario.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIScenario.h new file mode 100644 index 0000000..9cda9b3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIScenario.h @@ -0,0 +1,536 @@ +#pragma once + +#include "ovIBox.h" + +namespace OpenViBE { +class IMemoryBuffer; + +namespace Plugins { +class IBoxAlgorithmDesc; +} // namespace Plugins + +namespace Kernel { +class ILink; +class IComment; +class IMetadata; +class IConfigurationManager; + +/** + * \class IScenario + * \author Yann Renard (IRISA/INRIA) + * \date 2006-08-16 + * \brief A static OpenViBE scenario + * \ingroup Group_Scenario + * \ingroup Group_Kernel + * + * This class is a static scenario description. + * It is used to manipulate an OpenViBE + * box/connection collection... + * + * \todo Add meta information for this scenario + */ +class OV_API IScenario : public IBox +{ +public: + class IScenarioMergeCallback + { + public: + virtual void process(CIdentifier& originalID, CIdentifier& newID) = 0; + virtual ~IScenarioMergeCallback() = default; + }; + + /** \name General purpose functions */ + //@{ + + /** + * \brief Clears the scenario + * \retval true In case of success. + * \retval false In case of error. + */ + virtual bool clear() = 0; + + /** + * \brief Merges this scenario with an other existing scenario + * \param scenario A reference to the scenario to merge this scenario with + * \param scenarioMergeCallback A callback that will be called for each merged element and will be passed the old and new identifiers + * \param mergeSettings When true, the settings from the source scenario will also be merged + * \param preserveIDs When true, the element identifiers from the source scenario will be preserved. + * \retval true In case of success + * \retval false In case of error + * \note The \c bPreservedIdentifiers setting is only reliable when the destination scenario is empty. As an identifier can only be + * preserved when the destination scenario does not contain any elements which use it. In general, this parameter should only be set + * to true when cloning a scenario. + */ + virtual bool merge(const IScenario& scenario, IScenarioMergeCallback* scenarioMergeCallback, bool mergeSettings, bool preserveIDs) = 0; + + //@} + /** \name Box management */ + //@{ + + /** + * \brief Gets next box identifier + * \param previousID The identifier + * for the preceeding box + * \return The identifier of the next box in case of success. + * \retval CIdentifier::undefined() on error. + * \note Giving \c CIdentifier::undefined() as \c previousID + * will cause this function to return the first box + * identifier. + */ + virtual CIdentifier getNextBoxIdentifier(const CIdentifier& previousID) const = 0; + + /** + * \brief Tests whether a given identifier is a box or not + * \param boxID the identifier to test + * \retval true if the identified object is a box + * \retval false if the identified object is not a box + * \note Requesting a bad identifier returns \e false + */ + virtual bool isBox(const CIdentifier& boxID) const = 0; + + /** + * \brief Gets the details for a specific box + * \param boxID The identifier of the box which details should be sent. + * \return The box details + */ + virtual const IBox* getBoxDetails(const CIdentifier& boxID) const = 0; + + /// \copydoc getBoxDetails(const CIdentifier&)const + virtual IBox* getBoxDetails(const CIdentifier& boxID) = 0; + + /** + * \brief Adds a new box in the scenario + * \param[out] boxID The identifier of the created box + * \param suggestedBoxID A suggestion for the new box identifier. If this specific identifier is not + * yet used, this scenario might use it. If the identifier is already used or \c CIdentifier::undefined() is passed, + * then a random unused identifier will be used. + * \retval true In case of success. + * \retval false In case of error. In such case, \c boxID remains unchanged. + * \note This produces an empty and unconfigured box! + */ + virtual bool addBox(CIdentifier& boxID, const CIdentifier& suggestedBoxID) = 0; + /** + * \brief Adds a new box in the scenario based on an existing box + * \param[out] boxID The identifier of the created box + * \param box The box to copy in this scenario + * \param suggestedBoxID a suggestion for the new box identifier. If this specific identifier is not + * yet used, this scenario might use it. If the identifier is already used or \c CIdentifier::undefined() is passed, + * then a random unused identifier will be used. + * \retval true In case of success. + * \retval false In case of error. In such case, \c boxID remains unchanged. + */ + virtual bool addBox(CIdentifier& boxID, const IBox& box, const CIdentifier& suggestedBoxID) = 0; + /** + * \brief Adds a new box in the scenario + * \param[out] boxID The identifier of the created box + * \param boxAlgorithmClassID The class identifier of the algorithm for this box + * \param suggestedBoxID a suggestion for the new box identifier. If this specific identifier is not + * yet used, this scenario might use it. If the identifier is already used or \c CIdentifier::undefined() is passed, + * then a random unused identifier will be used. + * \retval true In case of success. + * \retval false In case of error. In such case, \c boxID remains unchanged. + * \note This function prepares the box according to its algorithm class identifier ! + */ + virtual bool addBox(CIdentifier& boxID, const CIdentifier& boxAlgorithmClassID, const CIdentifier& suggestedBoxID) = 0; + + // TODO_JL: Doc + virtual bool addBox(CIdentifier& boxID, const Plugins::IBoxAlgorithmDesc& boxAlgorithmDesc, const CIdentifier& suggestedBoxID) = 0; + + /** + * \brief Removes a box of the scenario + * \param boxID The box identifier + * \retval true In case of success. + * \retval false In case of error. + * \note Each link related to this box is also removed + */ + virtual bool removeBox(const CIdentifier& boxID) = 0; + + //@} + /** \name Connection management */ + //@{ + + /** + * \brief Gets next link identifier + * \param previousID The identifier for the preceeding link + * \return The identifier of the next link in case of success. + * \retval CIdentifier::undefined() on error. + * \note Giving \c CIdentifier::undefined() as \c previousID will cause this function to return the first link identifier. + */ + virtual CIdentifier getNextLinkIdentifier(const CIdentifier& previousID) const = 0; + + /** + * \brief Gets next link identifier from fixed box + * \param previousID The identifier for the preceeding link + * \param boxID The box identifier which the link should end to + * \return The identifier of the next link in case of success. + * \retval CIdentifier::undefined() on error. + * \note Giving \c CIdentifier::undefined() as \c previousID will cause this function to return the first link identifier. + */ + virtual CIdentifier getNextLinkIdentifierFromBox(const CIdentifier& previousID, const CIdentifier& boxID) const = 0; + + /** + * \brief Gets next link identifier from fixed box output + * \param previousID The identifier for the preceeding link + * \param boxID The box identifier which the link should end to + * \param outputIdx The input index which the link should end to + * \return The identifier of the next link in case of success. + * \retval CIdentifier::undefined() on error. + * \note Giving \c CIdentifier::undefined() as \c previousID will cause this function to return the first link identifier. + */ + virtual CIdentifier getNextLinkIdentifierFromBoxOutput(const CIdentifier& previousID, const CIdentifier& boxID, size_t outputIdx) const = 0; + + /** + * \brief Gets next link identifier from fixed box + * \param previousID The identifier for the preceeding link + * \param boxID The box identifier which the link should start from + * \return The identifier of the next link in case of success. + * \retval CIdentifier::undefined() on error. + * \note Giving \c CIdentifier::undefined() as \c previousID will cause this function to return the first link identifier. + */ + virtual CIdentifier getNextLinkIdentifierToBox(const CIdentifier& previousID, const CIdentifier& boxID) const = 0; + + /** + * \brief Gets next link identifier from fixed box input + * \param previousID The identifier for the preceeding link + * \param boxID The box identifier which the link should start from + * \param index The input index which the link should start from + * \return The identifier of the next link in case of success. + * \retval CIdentifier::undefined() on error. + * \note Giving \c CIdentifier::undefined() as \c previousID will cause this function to return the first link identifier. + */ + virtual CIdentifier getNextLinkIdentifierToBoxInput(const CIdentifier& previousID, const CIdentifier& boxID, size_t index) const = 0; + + /** + * \brief Tests whether a given id is a link or not + * \param id the id to test + * \retval true if the identified object is a link + * \retval false if the identified object is not a link + * \note Requesting a bad id returns \e false + */ + virtual bool isLink(const CIdentifier& id) const = 0; + + /** + * \brief Gets the details for a specific link + * \param id The identifier of the link which details should be sent. + * \return The link details + */ + virtual const ILink* getLinkDetails(const CIdentifier& id) const = 0; + + /// \copydoc getLinkDetails(const CIdentifier&)const + virtual ILink* getLinkDetails(const CIdentifier& id) = 0; + + /** + * \brief Creates a connection between two boxes + * \param[out] linkID The created link identifier. + * \param srcBoxID The source box identifier + * \param srcBoxOutputIdx The output index for the given source box + * \param dstBoxID The target box identifier + * \param dstBoxInputIndex The input index for the given target box + * \param suggestedLinkID a suggestion for the new link identifier. If this specific identifier is not + * yet used, this scenario might use it. If the identifier is already used or \c CIdentifier::undefined() is passed, + * then a random unused identifier will be used. + * \retval true In case of success. + * \retval false In case of error. In such case, \c linkID remains unchanged. + */ + virtual bool connect(CIdentifier& linkID, const CIdentifier& srcBoxID, const size_t srcBoxOutputIdx, + const CIdentifier& dstBoxID, const size_t dstBoxInputIndex, const CIdentifier& suggestedLinkID) = 0; + + /** + * \brief Creates a connection between two boxes + * \param[out] linkID The created link identifier. + * \param srcBoxID The source box identifier + * \param srcBoxOutputID The output identifier for the given source box + * \param dstBoxID The target box identifier + * \param dstBoxInputID The input identifier for the given target box + * \param suggestedLinkID a suggestion for the new link identifier. If this specific identifier is not + * yet used, this scenario might use it. If the identifier is already used or \c CIdentifier::undefined() is passed, + * then a random unused identifier will be used. + * \retval true In case of success. + * \retval false In case of error. In such case, \c linkID remains unchanged. + */ + virtual bool connect(CIdentifier& linkID, const CIdentifier& srcBoxID, const CIdentifier& srcBoxOutputID, + const CIdentifier& dstBoxID, const CIdentifier& dstBoxInputID, const CIdentifier& suggestedLinkID) = 0; + + /** + * \brief Deletes a connection between two boxes + * \param srcBoxID The source box identifier + * \param srcBoxOutputIdx The output index for the given source box + * \param dstBoxID The target box identifier + * \param dstBoxInputIdx The input index for the given target box + * \retval true In case of success. + * \retval false In case of error. + */ + virtual bool disconnect(const CIdentifier& srcBoxID, size_t srcBoxOutputIdx, const CIdentifier& dstBoxID, size_t dstBoxInputIdx) = 0; + + /** + * \brief Deletes a connection between two boxes + * \param srcBoxID The source box identifier + * \param srcBoxOutputID The output identifier for the given source box + * \param dstBoxID The target box identifier + * \param dstBoxInputID The input identifier for the given target box + * \retval true In case of success. + * \retval false In case of error. + */ + virtual bool disconnect(const CIdentifier& srcBoxID, const CIdentifier& srcBoxOutputID, const CIdentifier& dstBoxID, + const CIdentifier& dstBoxInputID) = 0; + + /** + * \brief Deletes a connection between two boxes + * \param[out] linkID The identifier for the link to be deleted + * \retval true In case of success. + * \retval false In case of error. + */ + virtual bool disconnect(const CIdentifier& linkID) = 0; + + /** + * \brief Get the output index of a source, for a specific box + * \param[in] srcBoxID The source box identifier + * \param[in] srcBoxOutputID The output identifier for the given source box + * \param[out] srcBoxOutputIdx The output index for the given source box + * \retval true in case of success. + */ + virtual bool getSourceBoxOutputIndex(const CIdentifier& srcBoxID, const CIdentifier& srcBoxOutputID, size_t& srcBoxOutputIdx) = 0; + + /** + * \brief Get the input index of a target, for a specific box + * \param[in] dstBoxID The target box identifier + * \param[in] dstBoxInputID The input identifier for the given target box + * \param[out] dstBoxInputIdx The input index for the given target box + * \retval true in case of success. + */ + virtual bool getTargetBoxInputIndex(const CIdentifier& dstBoxID, const CIdentifier& dstBoxInputID, size_t& dstBoxInputIdx) = 0; + + /** + * \brief Get the output identifier of a source, for a specific box + * \param srcBoxID The source box identifier + * \param srcBoxOutputIdx The output index for the given source box + * \param srcBoxOutputID The output identifier for the given source box + * \retval true in case of success. + */ + virtual bool getSourceBoxOutputIdentifier(const CIdentifier& srcBoxID, const size_t& srcBoxOutputIdx, CIdentifier& srcBoxOutputID) = 0; + + /** + * \brief Get the input identifier of a target, for a specific box + * \param dstBoxID The target box identifier + * \param dstBoxInputIdx The input index for the given target box + * \param dstBoxInputID The input identifier for the given target box + * \retval true in case of success. + */ + virtual bool getTargetBoxInputIdentifier(const CIdentifier& dstBoxID, const size_t& dstBoxInputIdx, CIdentifier& dstBoxInputID) = 0; + + //@} + /** \name Scenario Input/Output and MetaBox management */ + //@{ + + virtual bool setHasIO(bool hasIO) = 0; + virtual bool hasIO() const = 0; + + virtual bool setScenarioInputLink(size_t scenarioInputIdx, const CIdentifier& boxID, size_t boxInputIdx) = 0; + virtual bool setScenarioInputLink(size_t scenarioInputIdx, const CIdentifier& boxID, const CIdentifier& boxInputID) = 0; + virtual bool setScenarioOutputLink(size_t scenarioOutputIdx, const CIdentifier& boxID, size_t boxOutputIdx) = 0; + virtual bool setScenarioOutputLink(size_t scenarioOutputIdx, const CIdentifier& boxID, const CIdentifier& boxOutputID) = 0; + + virtual bool getScenarioInputLink(size_t scenarioInputIdx, CIdentifier& boxID, size_t& boxInputIdx) const = 0; + virtual bool getScenarioInputLink(size_t scenarioInputIdx, CIdentifier& boxID, CIdentifier& boxInputID) const = 0; + virtual bool getScenarioOutputLink(size_t scenarioOutputIdx, CIdentifier& boxID, size_t& boxOutputIdx) const = 0; + virtual bool getScenarioOutputLink(size_t scenarioOutputIdx, CIdentifier& boxID, CIdentifier& boxOutputID) const = 0; + + virtual bool removeScenarioInputLink(size_t scenarioInputIdx, const CIdentifier& boxID, size_t boxInputIdx) = 0; + virtual bool removeScenarioOutputLink(size_t scenarioOutputIdx, const CIdentifier& boxID, size_t boxOutputIdx) = 0; + + virtual bool removeScenarioInput(size_t index) = 0; + virtual bool removeScenarioOutput(size_t outputIdx) = 0; + + //@} + /** \name Comment management */ + //@{ + + /** + * \brief Gets next comment identifier + * \param previousID The identifier for the preceeding comment + * \return The identifier of the next comment in case of success. + * \retval CIdentifier::undefined() on error. + * \note Giving \c CIdentifier::undefined() as \c previousID will cause this function to return the first comment identifier. + */ + virtual CIdentifier getNextCommentIdentifier(const CIdentifier& previousID) const = 0; + + /** + * \brief Tests whether a given identifier is a comment or not + * \param commentID the identifier to test + * \retval true if the identified object is a comment + * \retval false if the identified object is not a comment + * \note Requesting a bad identifier returns \e false + */ + virtual bool isComment(const CIdentifier& commentID) const = 0; + + /** + * \brief Gets the details for a specific comment + * \param commentID The identifier of the comment which details should be sent. + * \return The comment details + */ + virtual const IComment* getCommentDetails(const CIdentifier& commentID) const = 0; + + /// \copydoc getCommentDetails(const CIdentifier&)const + virtual IComment* getCommentDetails(const CIdentifier& commentID) = 0; + + /** + * \brief Adds a new comment in the scenario + * \param[out] commentID The identifier of the created comment + * \param suggestedCommentID a suggestion for the new comment identifier. If this specific identifier is not + * yet used, this scenario might use it. If the identifier is already used or \c CIdentifier::undefined() is passed, + * then a random unused identifier will be used. + * \retval true In case of success. + * \retval false In case of error. In such case, \c commentID remains unchanged. + * \note This produces an empty and unconfigured comment! + */ + virtual bool addComment(CIdentifier& commentID, const CIdentifier& suggestedCommentID) = 0; + + /** + * \brief Adds a new comment in the scenario based on an existing comment + * \param[out] commentID The identifier of the created comment + * \param comment the comment to copy in this scenario + * \param suggestedCommentID a suggestion for the new comment identifier. If this specific identifier is not + * yet used, this scenario might use it. If the identifier is already used or \c CIdentifier::undefined() is passed, + * then a random unused identifier will be used. + * \retval true In case of success. + * \retval false In case of error. In such case, \c commentID remains unchanged. + */ + virtual bool addComment(CIdentifier& commentID, const IComment& comment, const CIdentifier& suggestedCommentID) = 0; + /** + * \brief Removes a comment of the scenario + * \param commentID The comment identifier + * \retval true In case of success. + * \retval false In case of error. + */ + virtual bool removeComment(const CIdentifier& commentID) = 0; + + //@} + /** \name Metadata management */ + //@{ + + /** + * \brief Get next metadata identifier in regards to another + * \param previousID The identifier of the metadata + * \retval CIdentifier::undefined() In case when metadata with the \c previousID is not present + * \retval CIdentifier::undefined() In case when metadata with the \c previousID is last in the scenario + * \return The identifier of the next metadata + * \note Giving \c CIdentifier::undefined() as \c previousID will cause this function to return the first metadata identifier. + */ + virtual CIdentifier getNextMetadataIdentifier(const CIdentifier& previousID) const = 0; + + /** + * \param metadataID The identifier to test + * \retval true If the identified object is metadata + * \retval false If the identified object is not metadata or when the identifier is not present in the scenario + */ + virtual bool isMetadata(const CIdentifier& metadataID) const = 0; + + + /** + * \param metadataID The identifier of a metadata + * \return Pointer to object containing metadata details + */ + virtual const IMetadata* getMetadataDetails(const CIdentifier& metadataID) const = 0; + + /// \copydoc getMetadataDetails(const CIdentifier&)const + virtual IMetadata* getMetadataDetails(const CIdentifier& metadataID) = 0; + + /** + * \brief Add new metadata in the scenario + * \param[out] metadataID The identifier of the newly created metadata + * \param suggestedMetadataID A suggestion for the new identifier. If the identifier is already used or \c CIdentifier::undefined() is passed, + * then a random unused identifier will be used. + * \retval true In case of success. + * \retval false In case of error. In this case, \c metadataID remains unchanged. + * \note This method creates an empty metadata. + */ + virtual bool addMetadata(CIdentifier& metadataID, const CIdentifier& suggestedMetadataID) = 0; + + /** + * \brief Remove metadata from the scenario + * \param metadataID The metadata identifier + * \retval true In case of success. + * \retval false In case of error. + */ + virtual bool removeMetadata(const CIdentifier& metadataID) = 0; + //@} + + /** + * \brief replaces settings of each box by its locally expanded version only expands the $var{} tokens, it leaves others as is + */ + virtual bool applyLocalSettings() = 0; + + /** + * \brief Check settings before playing scenario, if the settings are not suitable, stop scenario + * and launch a console warning. Only check numeric values in the beginning + * \param configManager: local configuration manager that can contain the definition of local scenario settings + */ + virtual bool checkSettings(IConfigurationManager* configManager) = 0; + + /** + * \brief Check if boxes in scenario need to be updated. Feed an map of updates boxes instances with the identifiers + * of outdated boxes + * \return true if at least one box needs to updated + */ + virtual bool checkOutdatedBoxes() = 0; + + /** + * \brief Gets identifier of next outdated box + * \param previousID The identifier for the preceeding outdated box + * \return The identifier of the next box that needs updates in case of success. + * \retval CIdentifier::undefined() on error. + * \note Giving \c CIdentifier::undefined() as \c previousID will cause this function to return the first processing unit identifier. + * \note Warning: You need to call at least once the function "checkOutdatedBoxes", before calling this function + */ + virtual CIdentifier getNextOutdatedBoxIdentifier(const CIdentifier& previousID) const = 0; + + /** + * \brief Indicates if at least one box in scenario need to be updated. + * \return true if at least one box needs to updated + * \note Warning: You need to call at least once the function "checkOutdatedBoxes", before calling this function + */ + virtual bool hasOutdatedBox() = 0; + + /** + * \brief Update the prototypes of the box identified by the given identifier. + * \param boxID + * \retval true in case of success + * \retval false in case of error + */ + virtual bool updateBox(const CIdentifier& boxID) = 0; + + /** + * \brief Remove deprecated interfacors from the box identified by the given identifier. + * \param boxID Id of the box to clean up + * \retval true in case of success + * \retval false if the box does not exist + */ + virtual bool removeDeprecatedInterfacorsFromBox(const CIdentifier& boxID) = 0; + + /** + * \brief Check if scenario contains a box with a deprecated interfacor due to an incomplete update + * \retval true if a box in the scenario has a deprecated interfacor + * \retval false if no box in the scenario contains a deprecated interfacor + */ + virtual bool containsBoxWithDeprecatedInterfacors() const = 0; + + /** + * \return true if the scenario is actually a metabox + */ + virtual bool isMetabox() = 0; + + virtual void getBoxIdentifierList(CIdentifier** listID, size_t* size) const = 0; + virtual void getCommentIdentifierList(CIdentifier** listID, size_t* size) const = 0; + virtual void getMetadataIdentifierList(CIdentifier** listID, size_t* size) const = 0; + virtual void getLinkIdentifierList(CIdentifier** listID, size_t* size) const = 0; + virtual void getLinkIdentifierFromBoxList(const CIdentifier& boxID, CIdentifier** listID, size_t* size) const = 0; + virtual void getLinkIdentifierFromBoxOutputList(const CIdentifier& boxID, size_t outputIdx, CIdentifier** listID, size_t* size) const = 0; + virtual void getLinkIdentifierToBoxList(const CIdentifier& boxID, CIdentifier** listID, size_t* size) const = 0; + virtual void getLinkIdentifierToBoxInputList(const CIdentifier& boxID, size_t inputIdx, CIdentifier** listID, size_t* size) const = 0; + virtual void getOutdatedBoxIdentifierList(CIdentifier** listID, size_t* size) const = 0; + virtual void releaseIdentifierList(CIdentifier* listID) const = 0; + + _IsDerivedFromClass_(IBox, OV_ClassId_Kernel_Scenario_Scenario) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIScenarioManager.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIScenarioManager.h new file mode 100644 index 0000000..ad7fc89 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/scenario/ovIScenarioManager.h @@ -0,0 +1,153 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +class IMemoryBuffer; + +namespace Kernel { +class IScenario; + +/** + * \class IScenarioManager + * \author Yann Renard (IRISA/INRIA) + * \date 2006-10-05 + * \brief The scenario manager + * \ingroup Group_Scenario + * \ingroup Group_Kernel + * + * This manager is responsible to organize and handle + * all the scenarios of the kernel. + */ +class OV_API IScenarioManager : public IKernelObject +{ +public: + + /** + * \brief Gets next scenario identifier + * \param previousID [in] : The identifier + * for the preceeding scenario + * \return The identifier of the next scenario in case of success. + * \return \c CIdentifier::undefined() on error. + * \note Giving \c CIdentifier::undefined() as \c previousID + * will cause this function to return the first scenario + * identifier. + */ + virtual CIdentifier getNextScenarioIdentifier(const CIdentifier& previousID) const = 0; + + virtual bool isScenario(const CIdentifier& scenarioID) const = 0; + /** + * \brief Creates a new scenario + * \param scenarioID [out] : the identifier of + * the newly created scenario + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool createScenario(CIdentifier& scenarioID) = 0; + + /** + * @brief Import a scenario from a memory buffer and insert it in the scenario manager + * @param[out] newScenarioID New identifier of the imported scenario + * @param buffer Buffer to import the scenario from + * @param scenarioImporterAlgorithmID The importer algorithm to use + * @retval true In case of success + * @retval false In case of failure + */ + virtual bool importScenario(CIdentifier& newScenarioID, const IMemoryBuffer& buffer, const CIdentifier& scenarioImporterAlgorithmID) = 0; + + /** + * @brief Import a scenario from a file and insert it in the scenario manager + * @param[out] newScenarioID New identifier of the imported scenario + * @param fileName File to import the scenario from + * @param scenarioImporterAlgorithmID The importer algorithm to use + * @retval true In case of success + * @retval false In case of failure + */ + virtual bool importScenarioFromFile(CIdentifier& newScenarioID, const CString& fileName, const CIdentifier& scenarioImporterAlgorithmID) = 0; + + /** + * @brief Export a scenario to a memory buffer + * @param[out] buffer Buffer to be filled with the serialized scenario + * @param scenarioID Scenario to export + * @param scenarioExporterAlgorithmID Exporter to use + * @retval true In case of success + * @retval false In case of failure + */ + virtual bool exportScenario(IMemoryBuffer& buffer, const CIdentifier& scenarioID, const CIdentifier& scenarioExporterAlgorithmID) const = 0; + + /** + * @brief Export a scenario to a file + * @param fileName File to which export the scenario + * @param scenarioID Scenario to export + * @param scenarioExporterAlgorithmID Exporter to use + * @retval true In case of success + * @retval false In case of failure + */ + virtual bool exportScenarioToFile(const CString& fileName, const CIdentifier& scenarioID, const CIdentifier& scenarioExporterAlgorithmID) const = 0; + + /** + * \brief Releases an existing scenario + * \param id [in] : the existing scenario identifier + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool releaseScenario(const CIdentifier& id) = 0; + /** + * \brief Gets details on a specific scenario + * \param id [in] : the scenario identifier which details should be returned + * \return the corresponding scenario reference. + * \warning Calling this function with a bad identifier causes a crash + */ + virtual IScenario& getScenario(const CIdentifier& id) = 0; + + + /** @{ + * @name Scenario Importers and Exporters + * + * Scenario importers and exporters permit the Kernel to load and save scenarios from and to files + * without having the client to explicitly specify the algorithm identifier for export. + * + * Both are represented by a data structure that associates a Context with one or more File Name Extensions, + * each of the Context/Extension pair has then an Algorithm Identifier associated. This enables the kernel + * to use a different importer for different uses. + * + * For example, in authoring mode one does not need to load the complete scenario, just the descriptor components. + * + * Importers and exporters can be registered directly by plugins declaring new algorithms. + */ + + + /** + * @brief Copies all scenario importers and exporters declarations from a scenarioManager to the current one. + * @param scenarioManager The manager to copy the importers from. + */ + virtual void cloneScenarioImportersAndExporters(const IScenarioManager& scenarioManager) = 0; + + virtual bool importScenarioFromFile(CIdentifier& newScenarioID, const CIdentifier& importContext, const CString& fileName) = 0; + + virtual bool registerScenarioImporter(const CIdentifier& importContext, const CString& fileNameExtension, + const CIdentifier& scenarioImporterAlgorithmID) = 0; + + virtual bool unregisterScenarioImporter(const CIdentifier& importContext, const CString& fileNameExtension) = 0; + + virtual CIdentifier getNextScenarioImportContext(const CIdentifier& importContext) const = 0; + virtual CString getNextScenarioImporter(const CIdentifier& importContext, const CString& fileNameExtension) const = 0; + virtual CIdentifier getScenarioImporterAlgorithmIdentifier(const CIdentifier& importContext, const CString& fileNameExtension) const = 0; + + virtual bool exportScenarioToFile(const CIdentifier& exportContext, const CString& fileName, const CIdentifier& scenarioID) = 0; + + virtual bool registerScenarioExporter(const CIdentifier& exportContext, const CString& fileNameExtension, + const CIdentifier& scenarioExporterAlgorithmID) = 0; + + virtual bool unregisterScenarioExporter(const CIdentifier& exportContext, const CString& fileNameExtension) = 0; + + virtual CIdentifier getNextScenarioExportContext(const CIdentifier& exportContext) const = 0; + virtual CString getNextScenarioExporter(const CIdentifier& exportContext, const CString& fileNameExtension) const = 0; + virtual CIdentifier getScenarioExporterAlgorithmIdentifier(const CIdentifier& exportContext, const CString& fileNameExtension) const = 0; + + /** @} */ + + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Scenario_ScenarioManager) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/server/ovIServerExtensionContext.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/server/ovIServerExtensionContext.h new file mode 100644 index 0000000..9c61de6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/server/ovIServerExtensionContext.h @@ -0,0 +1,29 @@ +#pragma once + +#include "../ovIKernelObject.h" +#include "../log/ovILogManager.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class IServerExtensionContext + * \author Jozef Legeny (Inria) + * \date 2013-06-12 + * \brief Static context of a Server Extension object + * \ingroup Group_Server + * \ingroup Group_Kernel + * \ingroup Group_Extend + * \sa Plugins::IServerExtension + */ +class OV_API IServerExtensionContext : public IKernelObject +{ +public: + + /** + * \brief Gets a reference on the current log manager + * \return a reference on the current log manager + */ + virtual ILogManager& getLogManager() = 0; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/server/ovIServerExtensionDynamicContext.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/server/ovIServerExtensionDynamicContext.h new file mode 100644 index 0000000..62b3ffd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/server/ovIServerExtensionDynamicContext.h @@ -0,0 +1,36 @@ +#pragma once + +#include "../ovIKernelObject.h" + +namespace OpenViBE { +class IStimulationSet; + +namespace Kernel { + +/** + * \class IServerExtensionDynamicContext + * \author Jozef Legeny (Inria) + * \date 2013-06-12 + * \brief Dynamic context of a Server Extension object + * \ingroup Group_Server + * \ingroup Group_Kernel + * \ingroup Group_Extend + * + * This class contains accessors to data structures made available by + * the driver running in the Acquisition Server during the acquisition. + * + * \sa Plugins::IServerExtension + */ + +class OV_API IServerExtensionDynamicContext : public IKernelObject +{ +public: + virtual size_t getChannelCount() = 0; + virtual size_t getSampleCountPerSentBlock() = 0; + virtual double* getBuffer() = 0; + virtual uint64_t getStimulationSetStartTime() = 0; + virtual uint64_t getStimulationSetEndTime() = 0; + virtual IStimulationSet& getStimulationSet() = 0; +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/server/ovIServerExtensionProto.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/server/ovIServerExtensionProto.h new file mode 100644 index 0000000..33d2d82 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/kernel/server/ovIServerExtensionProto.h @@ -0,0 +1,25 @@ +#pragma once + +#include "../ovIConfigurable.h" + +namespace OpenViBE { +namespace Kernel { +/** + * \class IServerExtensionProto + * \brief Prototype interface for a server extension + * \author Jozef Legeny (Inria) + * \ingroup Group_Server + * \ingroup Group_Kernel + * \ingroup Group_Extend + * \sa Plugins::IServerExtension + * \sa Plugins::IServerExtensionDesc + */ + +class OV_API IServerExtensionProto : public IKernelObject +{ +public: + virtual size_t addSetting(const CString& name, const CIdentifier& typeID, const CString& value) = 0; + _IsDerivedFromClass_(IKernelObject, OV_ClassId_Kernel_Server_ServerExtensionProto) +}; +} // namespace Kernel +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/metaboxes/ovIMetaboxObjectDesc.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/metaboxes/ovIMetaboxObjectDesc.h new file mode 100755 index 0000000..3cc5018 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/metaboxes/ovIMetaboxObjectDesc.h @@ -0,0 +1,15 @@ +#pragma once + +#include "../plugins/ovIBoxAlgorithmDesc.h" + +namespace OpenViBE { +namespace Metabox { +class OV_API IMetaboxObjectDesc : virtual public Plugins::IBoxAlgorithmDesc +{ +public: + virtual CString getMetaboxDescriptor() const = 0; + + _IsDerivedFromClass_(Plugins::IBoxAlgorithmDesc, OV_ClassId_Metaboxes_MetaboxObjectDesc) +}; +} // namespace Metabox +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovAssert.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovAssert.h new file mode 100644 index 0000000..51feb72 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovAssert.h @@ -0,0 +1,344 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +#include + +#include "CIdentifier.hpp" + +namespace OpenViBE { +typedef std::ostringstream ErrorStream; +} + +/** + * \author Charles Garraud (Inria) + * \date 2016-07-20 + * \brief Utility macros used to wrap framework behavior in response to: + * * Warning + * * Error + * * Fatal error + * + * A warning should be triggered to warn the api consumer about an + * expected and important event that is not a fault. + * + * An error should be triggered when a failure occurs. A failure is a + * faulty expected event that alter the correct behavior of the framework. + * + * Most OpenViBE API functions communicates a failure occurrence through + * their return value (false boolean, null pointer, bad identifier...). + * + * A fatal event should be triggered when failure impacting the sanity of + * the system occurs and it is impossible to recover from it. + */ + +// internal use +#define convertErrorTypeToString(type) #type + +/** + * \def OV_WARNING_LOG(message, logManager) + * + * Log a warning \a message using the provided \a logManager. + * Should not be used directly (use OV_WARNING* instead) + */ +#define OV_WARNING_LOG(message, logManager) do { logManager << OpenViBE::Kernel::LogLevel_Warning << message << "\n"; } while(0) + +/** + * \def OV_WARNING(message, logManager) + * + * Use this macro to trigger a warning. \a message is a warning message and + * \a logManager a logger used to log this message. + */ +#define OV_WARNING(message, logManager) OV_WARNING_LOG(message, logManager) + +/** + * \def OV_WARNING_UNLESS(expression, message, logManager) + * \see OV_WARNING(message, logManager) + * + * Use this macro to trigger a warning unless the condition expressed by + * \a expression is true. + */ +#define OV_WARNING_UNLESS(expression, message, logManager) do { if (!(expression)) { OV_WARNING(message, logManager); } } while(0) + +/** + * \def OV_WARNING_K(message) + * \see OV_WARNING(message, logManager) + * + * Shorthand for warning macro launched by objects that have direct + * access to kernel logger through this->getLogManager(). + * + * Suffix K stands for Kernel. + */ +#define OV_WARNING_K(message) OV_WARNING(message, this->getLogManager()) + +/** + * \def OV_WARNING_UNLESS_K(expression, message) + * \see OV_WARNING_UNLESS(expression, message, logManager) + * + * Shorthand for warning macro launched by objects that have direct + * access to kernel logger through this->getLogManager(). + * + * Suffix K stands for Kernel. + */ +#define OV_WARNING_UNLESS_K(expression, message) OV_WARNING_UNLESS(expression, message, this->getLogManager()) + +#if defined OV_DISPLAY_ERROR_LOCATION +# define OV_ERROR_LOG_LOCATION(file, line) ", {Error location} : {" << file << "::" << line << "}" +#else +# define OV_ERROR_LOG_LOCATION(file, line) "" +#endif +/** + * \def OV_ERROR_LOG(description, type, file, line, logManager) + * + * Log an error using the provided \a logManager. + * Should not be used directly (use OV_ERROR* instead) + */ +#define OV_ERROR_LOG(description, type, file, line, logManager) \ +do { \ + logManager << OpenViBE::Kernel::LogLevel_Error << "{Error description} : {" << description \ + << "}, {Error type} : {" << convertErrorTypeToString(type) << " (code " \ + << size_t((type)) << ")}" << OV_ERROR_LOG_LOCATION(file, line) << "\n"; \ +} while(0) + +/** + * \def OV_ERROR(description, type, returnValue, errorManager, logManager) + * + * Low-level macro used to handle an error. The error is described by its + * \a description and \a type. The generated block of code is returning a + * value defined by \a returnValue. Error handling is performed with + * the given \a errorManager and \a logManager. + * + * Use this in very specific cases. Prefer the use of higher level macros + * instead. + */ +#define OV_ERROR(description, type, returnValue, errorManager, logManager) \ +do { \ + errorManager.pushErrorAtLocation(type, static_cast(OpenViBE::ErrorStream() << description).str().c_str(), __FILE__, __LINE__ ); \ + OV_ERROR_LOG(description, type, __FILE__, __LINE__ , logManager); \ + return returnValue; \ +} while (0) + +/** + * \def OV_ERROR_UNLESS(expression, description, type, returnValue, errorManager, logManager) + * \see OV_ERROR(description, type, returnValue, errorManager, logManager) + * + * Low-level macro used to handle an error unless the condition expressed by + * \a expression is true. + * + * Use this in very specific cases. Prefer the use of higher level macros + * instead. + */ +#define OV_ERROR_UNLESS(expression, description, type, returnValue, errorManager, logManager) \ +do { if (!(expression)) { OV_ERROR(description, type, returnValue, errorManager, logManager); } } while(0) + +/** + * \def OV_ERROR_K(description, type, returnValue) + * \see OV_ERROR(description, type, returnValue, errorManager, logManager) + * + * Shorthand for error macro launched by objects that have direct + * access to kernel logger and error managers through this->getLogManager() + * and this->getErrorManager(). + * + * Suffix K stands for Kernel. + */ +#define OV_ERROR_K(description, type, returnValue) OV_ERROR(description, type, returnValue, this->getErrorManager(), this->getLogManager()) + +/** + * \def OV_ERROR_KRF(description, type) + * \see OV_ERROR(description, type, returnValue, errorManager, logManager) + * + * Shorthand for error macro that returns false and launched by objects + * that have direct access to kernel logger and error managers through this->getLogManager() + * and this->getErrorManager(). + * + * Suffix KRF stands for Kernel Return False. + */ +#define OV_ERROR_KRF(description, type) OV_ERROR(description, type, false, this->getErrorManager(), this->getLogManager()) + +/** + * \def OV_ERROR_KRZ(description, type) + * \see OV_ERROR(description, type, returnValue, errorManager, logManager) + * + * Shorthand for error macro that returns zero and launched by objects + * that have direct access to kernel logger and error managers through this->getLogManager() + * and this->getErrorManager(). + * + * Suffix KRZ stands for Kernel Return Zero. + */ +#define OV_ERROR_KRZ(description, type) OV_ERROR(description, type, 0, this->getErrorManager(), this->getLogManager()) + +/** + * \def OV_ERROR_KRO(description, type) + * \see OV_ERROR(description, type, returnValue, errorManager, logManager) + * + * Shorthand for error macro that returns CIdentifier::undefined() and launched by objects + * that have direct access to kernel logger and error managers through this->getLogManager() + * and this->getErrorManager(). + * + * Suffix KRU stands for Kernel Return Undefined. + */ +#define OV_ERROR_KRU(description, type) OV_ERROR(description, type, CIdentifier::undefined(), this->getErrorManager(), this->getLogManager()) + +/** + * \def OV_ERROR_KRV(description, type) + * \see OV_ERROR(description, type, returnValue, errorManager, logManager) + * + * Shorthand for error macro that returns nothing and launched by objects + * that have direct access to kernel logger and error managers through this->getLogManager() + * and this->getErrorManager(). + * + * Suffix KRV stands for Kernel Return Void. + */ +#define OV_ERROR_KRV(description, type) OV_ERROR(description, type, void(), this->getErrorManager(), this->getLogManager()) + +/** + * \def OV_ERROR_KRN(description, type) + * \see OV_ERROR(description, type, returnValue, errorManager, logManager) + * + * Shorthand for error macro that returns nullptr and launched by objects + * that have direct access to kernel logger and error managers through this->getLogManager() + * and this->getErrorManager(). + * + * Suffix KRN stands for Kernel Return Null. + */ +#define OV_ERROR_KRN(description, type) OV_ERROR(description, type, nullptr, this->getErrorManager(), this->getLogManager()) + +/** + * \def OV_ERROR_UNLESS_K(expression, description, type, returnValue) + * \see OV_ERROR_UNLESS(expression, description, type, returnValue, errorManager, logManager) + * + * Shorthand for conditional error macro launched by objects that have direct + * access to kernel logger and error managers through this->getLogManager() + * and this->getErrorManager(). + * + * Suffix K stands for Kernel. + */ +#define OV_ERROR_UNLESS_K(expression, description, type, returnValue) OV_ERROR_UNLESS(expression, description, type, returnValue, this->getErrorManager(), this->getLogManager()) + +/** + * \def OV_ERROR_UNLESS_KRF(expression, description, type) + * \see OV_ERROR_UNLESS(expression, description, type, returnValue, errorManager, logManager) + * + * Shorthand for conditional error macro that returns false and + * launched by objects that have direct access to kernel logger and error + * managers through this->getLogManager() and this->getErrorManager(). + * + * Suffix KRF stands for Kernel Return False. + */ +#define OV_ERROR_UNLESS_KRF(expression, description, type) OV_ERROR_UNLESS(expression, description, type, false, this->getErrorManager(), this->getLogManager()) + +/** + * \def OV_ERROR_UNLESS_KRZ(expression, description, type) + * \see OV_ERROR_UNLESS(expression, description, type, returnValue, errorManager, logManager) + * + * Shorthand for conditional error macro that returns zero and + * launched by objects that have direct access to kernel logger and error + * managers through this->getLogManager() and this->getErrorManager(). + * + * Suffix KRZ stands for Kernel Return Zero. + */ +#define OV_ERROR_UNLESS_KRZ(expression, description, type) OV_ERROR_UNLESS(expression, description, type, 0, this->getErrorManager(), this->getLogManager()) + +/** + * \def OV_ERROR_UNLESS_KRU(expression, description, type) + * \see OV_ERROR_UNLESS(expression, description, type, returnValue, errorManager, logManager) + * + * Shorthand for conditional error macro that returns CIdentifier::undefined() and + * launched by objects that have direct access to kernel logger and error + * managers through this->getLogManager() and this->getErrorManager(). + * + * Suffix KRU stands for Kernel Return Undefined. + */ +#define OV_ERROR_UNLESS_KRU(expression, description, type) OV_ERROR_UNLESS(expression, description, type, CIdentifier::undefined(), this->getErrorManager(), this->getLogManager()) + +/** + * \def OV_ERROR_UNLESS_KRV(expression, description, type) + * \see OV_ERROR_UNLESS(expression, description, type, returnValue, errorManager, logManager) + * + * Shorthand for conditional error macro that returns void() and + * launched by objects that have direct access to kernel logger and error + * managers through this->getLogManager() and this->getErrorManager(). + * + * Suffix KRV stands for Kernel Return Void. + */ +#define OV_ERROR_UNLESS_KRV(expression, description, type) OV_ERROR_UNLESS(expression, description, type, void() , this->getErrorManager(), this->getLogManager()) + +/** + * \def OV_ERROR_UNLESS_KRN(expression, description, type) + * \see OV_ERROR_UNLESS(expression, description, type, returnValue, errorManager, logManager) + * + * Shorthand for conditional error macro that returns nullptr and + * launched by objects that have direct access to kernel logger and error + * managers through this->getLogManager() and this->getErrorManager(). + * + * Suffix KRN stands for Kernel Return Null. + */ +#define OV_ERROR_UNLESS_KRN(expression, description, type) OV_ERROR_UNLESS(expression, description, type, nullptr, this->getErrorManager(), this->getLogManager()) + +#if defined OV_DISPLAY_ERROR_LOCATION +#define OV_FATAL_LOG_LOCATION ", {Error location} : {" << __FILE__ << "::" << __LINE__ << "}" +#else +#define OV_FATAL_LOG_LOCATION "" +#endif + +/** + * \def OV_FATAL(description, type, logManager) + * + * Use this macro to handle fatal error described by its \a description + * and \a type. \a logManager it the logger used to log the fatal message. + */ +#define OV_FATAL(description, type, logManager) \ +do { \ + logManager << OpenViBE::Kernel::LogLevel_Fatal << "{Error description} : {" << description << "}, {Error type} : {" \ + << convertErrorTypeToString(type) << " (code " << size_t((type)) << ")}" << OV_FATAL_LOG_LOCATION << "\n"; \ + std::abort(); \ +} while(0) + +/** + * \def OV_FATAL_UNLESS(expression, description, type, logManager) + * \see OV_FATAL(description, type, logManager) + * + * Use this macro to handle fatal errors unless the condition expressed by + * \a expression is true. + */ +#define OV_FATAL_UNLESS(expression, description, type, logManager) do { if (!(expression)) { OV_FATAL(description, type, logManager); } } while(0) + +/** + * \def OV_FATAL_K(description, type) + * \see OV_FATAL(description, type, logManager) + * + * Shorthand for fatal macro launched by objects that have direct + * access to kernel logger through this->getLogManager(). + * + * Suffix K stands for Kernel. + */ +#define OV_FATAL_K(description, type) OV_FATAL(description, type, this->getLogManager()) + +/** + * \def OV_FATAL_UNLESS_K(description, type) + * \see OV_FATAL(expression, description, type) + * + * Shorthand for fatal conditional macro launched by objects that have direct + * access to kernel logger through this->getLogManager(). + * + * Suffix K stands for Kernel. + */ +#define OV_FATAL_UNLESS_K(expression, description, type) OV_FATAL_UNLESS(expression, description, type, this->getLogManager()) diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCKernelLoader.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCKernelLoader.h new file mode 100644 index 0000000..652e17e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCKernelLoader.h @@ -0,0 +1,24 @@ +#pragma once + +#include "ovIKernelLoader.h" + +namespace OpenViBE { +class OV_API CKernelLoader final : public IKernelLoader +{ +public: + + CKernelLoader(); + ~CKernelLoader() override; + bool load(const CString& filename, CString* error = nullptr) override; + bool unload(CString* error = nullptr) override; + bool initialize() override; + bool getKernelDesc(Kernel::IKernelDesc*& desc) override; + bool uninitialize() override; + + _IsDerivedFromClass_Final_(IKernelLoader, OV_ClassId_KernelLoaderBridge) + +private: + + IKernelLoader* m_impl = nullptr; ///< Internal implementation +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCMemoryBuffer.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCMemoryBuffer.h new file mode 100644 index 0000000..7efa14b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCMemoryBuffer.h @@ -0,0 +1,69 @@ +#pragma once + +#include "ovIMemoryBuffer.h" + +namespace OpenViBE { +/** + * \class CMemoryBuffer + * \author Yann Renard (INRIA/IRISA) + * \date 2007-11-21 + * \brief Basic standalone OpenViBE memory buffer implementation + * \ingroup Group_Base + * + * This class offers a basic standalone impementation of the IMemoryBuffer + * interface. This class can be directly instanciated and used. + * + * Instances of this class use an internal implementation of the IMemoryBuffer + * interface and redirect their calls to this implementation. + */ + +class OV_API CMemoryBuffer : public IMemoryBuffer +{ +public: + + /** \name Constructors */ + //@{ + + /** + * \brief Default constructor + * + * This constructor builds the internal implementation of this memory buffer. + */ + CMemoryBuffer(); + /** + * \brief Copy constructor + * + * This constructor builds the internal implementation of this memory buffer and initializes it + * with the actual parameter of the constructor as a copy. + */ + CMemoryBuffer(const IMemoryBuffer& buffer); + /** + * \brief Copy constructor + * + * This constructor builds the internal implementation of this memory buffer and initializes it + * with the actual parameter of the constructor as a copy. + */ + CMemoryBuffer(const uint8_t* buffer, size_t size); + /** + * \brief Destructor + * + * The internal implementation is released. + */ + ~CMemoryBuffer() override; + + //@} + bool reserve(const size_t size) override; + bool setSize(const size_t size, const bool discard) override; + size_t getSize() const override; + uint8_t* getDirectPointer() override; + const uint8_t* getDirectPointer() const override; + bool append(const uint8_t* buffer, const size_t size) override; + bool append(const IMemoryBuffer& buffer) override; + + _IsDerivedFromClass_Final_(IMemoryBuffer, OV_ClassId_MemoryBufferBridge) + +protected: + + IMemoryBuffer* m_impl = nullptr; ///< Internal implementation +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCNameValuePairList.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCNameValuePairList.h new file mode 100644 index 0000000..c127b62 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCNameValuePairList.h @@ -0,0 +1,139 @@ +#pragma once + +#include "ov_defines.h" + +namespace OpenViBE { + +typedef struct CNameValuePairListImpl CNameValuePairListImpl; + +/** + * \class CNameValuePairList + * \author Vincent Delannoy (INRIA/IRISA) + * \date 2008-07 + * \brief This class handles a list of name/value pairs. + * It handles a (hidden) map associating string keys to string values. + * \ingroup Group_Base + * + * This class avoids the need to include stl's map header file in the C++ interface, + * thus preventing potential compile/link errors when dynamically loading modules. + * + * \note Implementation based on std::map + */ +class OV_API CNameValuePairList final +{ +public: + + /** \name Constructor / Destructor */ + //@{ + + /** + * \brief Default constructor + * + * Initializes the list. + */ + CNameValuePairList(); + /** + * \brief Copy constructor + * \param pairs [in] : The list to copy + * + * Copies the contents of \c pairs into the new list. + */ + CNameValuePairList(const CNameValuePairList& pairs); + /** + * \brief Destructor + * + * The destructor releases the std::map implementation ! + */ + ~CNameValuePairList(); + + //@} + /** \name Operators */ + //@{ + + /** + * \brief Affectation operator (copy) + * \param pairs [in] : The list to copy + * \return This list. + */ + CNameValuePairList& operator=(const CNameValuePairList& pairs); + //@} + + /** + * \brief Insert a name/value pair + * \param [in] name Name to add to the list + * \param [in] value Value to associate with the name + * \return True if pair could be inserted, false otherwise + */ + bool setValue(const CString& name, const CString& value) const; + + /** + * \brief Insert a name/value pair + * \param [in] name Name to add to the list + * \param [in] value Value to associate with the name + * \return True if pair could be inserted, false otherwise + */ + bool setValue(const CString& name, const char* value) const; + + /** + * \brief Insert a name/value pair where value is a double + * \param [in] name Name to add to the list + * \param [in] value Float64 value to associate with the name + * \return True if pair could be inserted, false otherwise + */ + bool setValue(const CString& name, const double& value) const; + + /** + * \brief Insert a name/value pair where value is a boolean + * \param [in] name Name to add to the list + * \param [in] value Boolean value to associate with the name + * \return True if pair could be inserted, false otherwise + */ + bool setValue(const CString& name, bool value) const; + + /** + * \brief Retrieve a value from the list + * \param [in] name Name whose value is to be retrieved + * \param [out] value Value to be retrieved from the list + * \return True if value could be retrieved, false otherwise + */ + bool getValue(const CString& name, CString& value) const; + + /** + * \brief Retrieve a double value from the list + * \param [in] name Name whose value is to be retrieved + * \param [out] value Float64 value to be retrieved + * \return True if a double value could be retrieved, false otherwise + */ + bool getValue(const CString& name, double& value) const; + + /** + * \brief Retrieve a boolean value from the list + * In the current implementation a value evaluates to true if its string + * equals "1" and to false if it equals "0". + * \param name + * \param value String to evaluate + * \return True if string evaluates to a boolean, false otherwise + */ + bool getValue(const CString& name, bool& value) const; + + /** + * \brief Retrieve a value from the list + * \param [in] index Index whose value is to be retrieved + * \param [out] name Name of the value stored in rIndex + * \param [out] value Value stored in rIndex + * \return True if value could be retrieved, false otherwise + */ + bool getValue(const size_t index, CString& name, CString& value) const; + + + /** + * \brief Retrieve the number of stored elements + * \return the number of stored elements + */ + size_t getSize() const; + +protected: + + CNameValuePairListImpl* m_impl = nullptr; ///< The list implementation +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCObservable.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCObservable.h new file mode 100644 index 0000000..feca38d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCObservable.h @@ -0,0 +1,70 @@ +#pragma once + +#include "ovIObserver.h" +#include "ov_defines.h" + +namespace OpenViBE { +class IObserver; + +/** +* \class CObservable +* \author Guillaume Serrière (Inria/Loria) +* \date 2014-11-7 +* \brief OpenViBE Observable class +* +* This class furnished all mecanisms to handle the Observable part of the Observer/Observable +* pattern implementation of OpenViBE. +*/ +class OV_API CObservable +{ +public: + CObservable(); + virtual ~CObservable(); + + /** + * \brief Add the observer give in parameter in the list of observers of the object. + * \param o [in] : the observer to add + * \note A same observer can be add multiple time. + */ + virtual void addObserver(IObserver* o); + + /** + * \brief Remove the observer give in parameter from the list of observers of the object. Only the first + * occurence of the observer will be remove from the list. + * \param o [in] : the observer to remove + */ + virtual void deleteObserver(IObserver* o); + +protected: + /** + * \brief This function is used to indicate when the notification need to reach the observers. If this function + * is not called before notifyObserver, the notification will be ignore. + * + * \note The "changed" state will be reverted after each call to clearChanged and notifyObservers. + */ + virtual void setChanged() { m_hasChanged = true; } + + /** + * \brief Revert the effect of setChanged. + */ + virtual void clearChanged() { m_hasChanged = false; } + + /** + * \brief Indicate if some change have been made. + * \return \e true if setChanged have been called this the last clearChanged/notifyObservers call. + * \return \e false in other case. + */ + virtual bool hasChanged() { return m_hasChanged; } + + /** + * \brief Notify all registered observers. + * \param data [in] : a pointer to data that will be send to observers. + */ + virtual void notifyObservers(void* data = nullptr); + +private: + struct SObserverList; + SObserverList* m_observers = nullptr; + bool m_hasChanged = false; +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCStimulationSet.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCStimulationSet.h new file mode 100644 index 0000000..0b9875e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCStimulationSet.h @@ -0,0 +1,68 @@ +#pragma once + +#include "ovIStimulationSet.h" + +namespace OpenViBE { +/** + * \class CStimulationSet + * \author Yann Renard (INRIA/IRISA) + * \date 2007-11-21 + * \brief Basic standalone OpenViBE stimulation set implementation + * \ingroup Group_Base + * + * This class offers a basic standalone impementation of the IStimulationSet + * interface. This class can be directly instanciated and used. + * + * Instances of this class use an internal implementation of the IStimulationSet + * interface and redirect their calls to this implementation. + */ +class OV_API CStimulationSet final : public IStimulationSet +{ +public: + + /** \name Constructors */ + //@{ + + /** + * \brief Default constructor + * + * This constructor builds the internal implementation of this stimulation set. + */ + CStimulationSet(); + /** + * \brief Destructor + * + * The internal implementation is released. + */ + ~CStimulationSet() override { delete m_stimSet; } + + //@} + void clear() override { m_stimSet->clear(); } + size_t getStimulationCount() const override { return m_stimSet->getStimulationCount(); } + uint64_t getStimulationIdentifier(const size_t index) const override { return m_stimSet->getStimulationIdentifier(index); } + uint64_t getStimulationDate(const size_t index) const override { return m_stimSet->getStimulationDate(index); } + uint64_t getStimulationDuration(const size_t index) const override { return m_stimSet->getStimulationDuration(index); } + bool setStimulationCount(const size_t n) override { return m_stimSet->setStimulationCount(n); } + bool setStimulationIdentifier(const size_t index, const uint64_t id) override { return m_stimSet->setStimulationIdentifier(index, id); } + bool setStimulationDate(const size_t index, const uint64_t date) override { return m_stimSet->setStimulationDate(index, date); } + bool setStimulationDuration(const size_t index, const uint64_t duration) override { return m_stimSet->setStimulationDuration(index, duration); } + + size_t appendStimulation(const uint64_t id, const uint64_t date, const uint64_t duration) override + { + return m_stimSet->appendStimulation(id, date, duration); + } + + size_t insertStimulation(const size_t index, const uint64_t id, const uint64_t date, const uint64_t duration) override + { + return m_stimSet->insertStimulation(index, id, date, duration); + } + + bool removeStimulation(const size_t index) override { return m_stimSet->removeStimulation(index); } + + _IsDerivedFromClass_Final_(IStimulationSet, OV_ClassId_StimulationSetBridge) + +private: + + IStimulationSet* m_stimSet = nullptr; ///< Internal implementation +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCString.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCString.h new file mode 100755 index 0000000..0a9f697 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovCString.h @@ -0,0 +1,155 @@ +#pragma once + +#include "ov_defines.h" + +#include + +namespace OpenViBE { +typedef struct SStringImpl SStringImpl; + +/** + * \class CString + * \author Yann Renard (INRIA/IRISA) + * \date 2006-08-10 + * \brief String class to avoid std::string in the interface + * \ingroup Group_Base + * + * This class helps avoiding std::string being present in exposed + * C++ interface, eventually resulting in compile/link errors when + * dynamically loading modules. + * + * \note The implementation uses std::string of course :) + */ +class OV_API CString final +{ +public: + + /** \name Constructor / Destructor */ + //@{ + + /** + * \brief Default constructor + * + * Initializes the string to an empty string. + */ + CString(); + /** + * \brief Copy constructor + * \param str [in] : The string to copy + * + * Copies the content of \c str into the new string. + */ + CString(const CString& str); + /** + * \brief Constructor based on ASCII strings + * \param str [in] : The string to copy + * + * Copies the content of \c str into the new string. + */ + CString(const char* str); + /** + * \brief Destructor + * + * The destructor releases the std::string implementation ! + */ + ~CString(); + + //@} + /** \name Operators */ + //@{ + + /** + * \brief ASCII string cast operator + * \return The string formatted as standard ASCII string used in C. + * + * The implementation simply calls \c c_str(). + */ + operator const char*() const; + /** + * \brief Affectation operator (copy) + * \param str [in] : The string to copy + * \return This string. + */ + CString& operator=(const CString& str); + + /** + * \brief Addition assignment operator + * \param str [in] : The string to append + * \return This string. + */ + CString& operator+=(const CString& str); + + /** + * \brief Addition operator + * \param str1 [in] : The first part of the resulting string + * \param str2 [in] : The second part of the resulting string + * \return The concatenation of \c str1 and \c str2. + */ + friend OV_API CString operator+(const CString& str1, const CString& str2); + /** + * \brief Equality comparison operator + * \param str1 [in] : The first part of the resulting string + * \param str2 [in] : The second part of the resulting string + * \return \e true is \c str1 is exactly str2. + * \return \e false in other case. + * \note This is case sensitive ! + */ + friend OV_API bool operator==(const CString& str1, const CString& str2); + /** + * \brief Inequality comparison operator + * \param str1 [in] : The first part of the resulting string + * \param str2 [in] : The second part of the resulting string + * \return \e false is \c str1 is exactly str2. + * \return \e true in other case. + * \note This is case sensitive ! + */ + friend OV_API bool operator!=(const CString& str1, const CString& str2); + + /** + * \brief Array subscription operator + * \param idx [in] : Index in the array + */ + char& operator[](size_t idx) const; + + /** + * \brief Order comparison operator (necessary to use CString as a key in a stl map) + * \param str1 [in] : The first part of the resulting string + * \param str2 [in] : The second part of the resulting string + * \return \e false is \c str1 is exactly str2. + * \return \e true in other case. + * \note This is case sensitive ! + */ + friend OV_API bool operator<(const CString& str1, const CString& str2); + //@} + + /** + * \brief Initializes this string from another OpenViBE string + * \param str [in] : the OpenViBE string to initialize this string from + * \return \e true in case of success. + * \return \e false in case of error. + */ + bool set(const CString& str) const; + /** + * \brief Initializes this string from an ANSI/ASCII string + * \param str [in] : the ANSI/ASCII string to initialize this string from + * \return \e true in case of success. + * \return \e false in case of error. + */ + bool set(const char* str) const; + /** + * \brief Converts this string to an ANSI/ASCII string + * \return the ANSI/ASCII converted string. + */ + const char* toASCIIString() const; + + /** + * \brief Returns length of the string + * \return Length of the string + */ + size_t length() const; + +protected: + + SStringImpl* m_impl = nullptr; ///< The string implementation +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovExceptionHandler.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovExceptionHandler.h new file mode 100644 index 0000000..698afa1 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovExceptionHandler.h @@ -0,0 +1,60 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ +#pragma once + +#include +#include +#include +#include + +namespace OpenViBE { +using ExceptionHandlerType = std::function; + +/** + * \brief Invokes code and potentially translates exceptions to boolean + * + * \tparam TCallback callable type (e.g. functor) with TCallback() returning boolean + * + * \param callable code that must be guarded against exceptions + * \param handler callback that handles the exception + * \return false either if callable() returns false or an exception + * occurs, true otherwise + * + * \details This method is a specific exception-to-boolean translation + * method. If an exception is caught, it is handled by calling + * the provided exception handler. + */ +template ::type>::value>::type* = nullptr> +bool translateException(TCallback&& callable, const ExceptionHandlerType& handler) +{ + try { return callable(); } + catch (const std::exception& exception) + { + handler(exception); + return false; + } + catch (...) + { + handler(std::runtime_error("unknown exception")); + return false; + } +} +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIKernelLoader.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIKernelLoader.h new file mode 100644 index 0000000..b7c1d41 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIKernelLoader.h @@ -0,0 +1,74 @@ +#pragma once + +#include "ovIObject.h" + +namespace OpenViBE { +namespace Kernel { +class IKernelDesc; +} // namespace Kernel + +/** + * \class IKernelLoader + * \author Yann Renard (INRIA/IRISA) + * \date 2006-09-26 + * \brief This class allows an OpenViBE application to load a kernel module. + * + * This class allows an OpenViBE application to load a kernel module. + * The application should first load the DLL/so file and initialize it. + * Then it is able to get a kernel descriptor and to build its own kernel + * to use. The kernel DLL/so file should be freed thanks to the unintialization + * and unload methods. + * + * \sa Kernel::IKernel + * \sa Kernel::IKernelDesc + * + */ +class OV_API IKernelLoader : public IObject +{ +public: + + /** + * \brief Loads a kernel DLL/so file + * \param filename [in] : the filename to load + * \param error [out] : an optional error string to get when loading fails + * \return \e true on success. + * \return \e false on error. + */ + virtual bool load(const CString& filename, CString* error = nullptr) = 0; + /** + * \brief Unloads a loaded kernel DLL/so file + * \return \e true on success. + * \return \e false on error. + * \warning \c load must have been called successfully before calling \c unload + */ + virtual bool unload(CString* error = nullptr) = 0; + /** + * \brief Requests the kernel DLL/so file to self initialize + * \return \e true on success. + * \return \e false on error. + * \warning \c load must have been called successfully before calling \c initialize + * + * Calling this function results in calling the \c onInitialize global function of + * the kernel DLL/so file. See section \ref Doc_CreatingNewKernel to get a full description + * of how a kernel is loaded / used. + */ + virtual bool initialize() = 0; + /** + * \brief Gets the kernel description of the loaded kernel DLL/so file + * \param desc [out] : a pointer to the kernel description + * \return \e true on success. + * \return \e false on error. + * \warning both \c load and \c initialize must have been called successfully before calling \c getKernelDesc + */ + virtual bool getKernelDesc(Kernel::IKernelDesc*& desc) = 0; + /** + * \brief Uninitializes a loaded and initialized kernel DLL/so file + * \return \e true on success. + * \return \e false on error. + * \warning both \c load and \c initialize must have been called successfully before calling \c getKernelDesc + */ + virtual bool uninitialize() = 0; + + _IsDerivedFromClass_(IObject, OV_ClassId_KernelLoader) +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIMemoryBuffer.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIMemoryBuffer.h new file mode 100644 index 0000000..c740b8c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIMemoryBuffer.h @@ -0,0 +1,88 @@ +#pragma once + +#include "ovIObject.h" + +namespace OpenViBE { +/** + * \class IMemoryBuffer + * \author Yann Renard (INRIA/IRISA) + * \date 2007-11-21 + * \brief Basic OpenViBE memory buffer interface + * + * This interface offers functionalities to basically manipulate a raw memory buffer. + * It allows the buffer to be resized and manipulated easily with no care of allocation + * reallocation. Implementations for this interface may provide optimisations for such + * operations. + * + * OpenViBE provides an standalone implementation of this interface in CMemoryBuffer + */ +class OV_API IMemoryBuffer : public IObject +{ +public: + + /** + * \brief Reserves some memory for this memory buffer + * \param size [in] : the amount of memory to reserve + * \return \e true in case of success. + * \return \e false in case of error. + * + * This function reserves some memory space for later use. This does not + * affect the actual size of the buffer but allows later calls to \c append + * not to reallocate the whole buffer. + * + * \note if \c size is lower than the actual buffer size + * then \e true is returned and nothing is done. + */ + virtual bool reserve(const size_t size) = 0; + /** + * \brief Changes the size of this memory buffer + * \param size [in] : the new size to give to the buffer + * \param discard [in] : tells the reallocation process whether it should presever currently stored data or not + * \return \e true in case of success. + * \return \e false in case of error. + * \note On error, the buffer is left unchanged. + * \note If the new size if lower than the current size and \c discard is true, the + * buffer is simply truncated to the \c size first bytes. + * \sa getSize + */ + virtual bool setSize(const size_t size, const bool discard) = 0; + /** + * \brief Gets the current size of this memory buffer + * \return the current size of this memory buffer + * \sa setSize + */ + virtual size_t getSize() const = 0; + /** + * \brief Gets a direct pointer to the byte array for read/write access + * \return a direct pointer to the byte array for read/write access + * \sa getSize + */ + virtual uint8_t* getDirectPointer() = 0; + /** + * \brief Gets a direct pointer to the byte array for read access + * \return a direct pointer to the byte array for read access + * \sa getSize + */ + virtual const uint8_t* getDirectPointer() const = 0; + /** + * \brief Appends data to this memory buffer + * \param buffer [in] : the buffer containing data that should be appended + * \param size [in] : the buffer size that should be appended + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool append(const uint8_t* buffer, const size_t size) = 0; + /** + * \brief Appends data to this memory buffer + * \param buffer [in] : the memory buffer containing data that should be appended + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool append(const IMemoryBuffer& buffer) { return this->append(buffer.getDirectPointer(), buffer.getSize()); } + + _IsDerivedFromClass_(IObject, OV_ClassId_MemoryBuffer) + + const uint8_t& operator [](const size_t index) const { return this->getDirectPointer()[index]; } + uint8_t& operator [](const size_t index) { return this->getDirectPointer()[index]; } +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIObject.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIObject.h new file mode 100644 index 0000000..29c5122 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIObject.h @@ -0,0 +1,88 @@ +#pragma once + +#include "ov_defines.h" +#include "CIdentifier.hpp" + +namespace OpenViBE { +class IObjectVisitor; + +namespace Kernel { +class CKernelObjectFactory; +} // namespace Kernel + +#define _IsDerivedFromClass_(_SuperClassName_,_ClassIdentifier_) \ + bool isDerivedFromClass( const OpenViBE::CIdentifier& classId) const override { return ((classId==(_ClassIdentifier_)) || _SuperClassName_::isDerivedFromClass(classId)); } + +#define _IsDerivedFromClass_Final_(_SuperClassName_,_ClassIdentifier_) \ + _IsDerivedFromClass_(_SuperClassName_,_ClassIdentifier_) \ + OpenViBE::CIdentifier getClassIdentifier() const override { return _ClassIdentifier_; } + +/** + * \class IObject + * \author Yann Renard (INRIA/IRISA) + * \date 2006-06-16 + * \brief Base class for all the OpenViBE platform objects + * + * Most of the complex objects existing in the OpenViBE platform should derive this base interface. Thus, several operations can + * be performed in order to work on the object. The most important may be the isDerivedFromClass method that allows the caller to + * know it the object has specific interface implementation and if the object could finally be casted in this interface or subclass. + * Several interfaces are provided in the OpenViBE specficiation but custom class could also be created. It is the responsability + * of the developer to notify the user of what interfaces are implemented in a concrete class. + * + * See isDerivedFromClass to have a sample of how this function + * could be used. + */ +class OV_API IObject +{ +public: + + friend class Kernel::CKernelObjectFactory; + + /** \name Class identification */ + //@{ + + /** + * \brief Returns the final class identifier of the concrete class + * \return The class identifier of this object. + * + * This method should return the class identifier of the concrete instanciated class. + */ + virtual CIdentifier getClassIdentifier() const = 0; + /** + * \brief Checks if this object is compatible with a class identifier + * \param classId [in] : the class identifier you want to test this object compatibility with + * \return \e true if this object si compatible with the given class identifier (this means the concrete class + * overloads the class with given class identifier) and \e false when this object is not compatible. + * + * This method should be used to check object compatibility with super classes and interfaces. For any concrete class + * instance derived from IObject, one can check if plugin functions are implemented and so on... see + * Plugins::IPluginObject for an example... + */ + virtual bool isDerivedFromClass(const CIdentifier& classId) const { return (classId == OV_ClassId_Object); } + + //@} + /** \name Visiting processes */ + //@{ + + /** + * \brief Requests this object to accept a visitor + * \param visitor [in] : the visitor reference which should act on this object + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool acceptVisitor(IObjectVisitor& visitor) { return true; } + + //@} + +protected: + + virtual ~IObject() { } +}; + +class CNullObject final : public IObject +{ +public: + + _IsDerivedFromClass_Final_(IObject, OV_ClassId_Object) +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIObjectVisitor.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIObjectVisitor.h new file mode 100644 index 0000000..3d659ae --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIObjectVisitor.h @@ -0,0 +1,34 @@ +#pragma once + +#include "ovIObject.h" + +namespace OpenViBE { +namespace Kernel { +class IObjectVisitorContext; + +class IBox; +class IComment; +class IMetadata; +class ILink; +class IScenario; +} // namespace kernel + +class OV_API IObjectVisitor : public IObject +{ +public: + + virtual bool processBegin(Kernel::IObjectVisitorContext& /*visitorCtx*/, Kernel::IBox& /*box*/) { return true; } + virtual bool processBegin(Kernel::IObjectVisitorContext& /*visitorCtx*/, Kernel::IComment& /*comment*/) { return true; } + virtual bool processBegin(Kernel::IObjectVisitorContext& /*visitorCtx*/, Kernel::IMetadata& /*metadata*/) { return true; } + virtual bool processBegin(Kernel::IObjectVisitorContext& /*visitorCtx*/, Kernel::ILink& /*link*/) { return true; } + virtual bool processBegin(Kernel::IObjectVisitorContext& /*visitorCtx*/, Kernel::IScenario& /*scenario*/) { return true; } + + virtual bool processEnd(Kernel::IObjectVisitorContext& /*visitorCtx*/, Kernel::IBox& /*box*/) { return true; } + virtual bool processEnd(Kernel::IObjectVisitorContext& /*visitorCtx*/, Kernel::IComment& /*comment*/) { return true; } + virtual bool processEnd(Kernel::IObjectVisitorContext& /*visitorCtx*/, Kernel::IMetadata& /*metadata*/) { return true; } + virtual bool processEnd(Kernel::IObjectVisitorContext& /*visitorCtx*/, Kernel::ILink& /*link*/) { return true; } + virtual bool processEnd(Kernel::IObjectVisitorContext& /*visitorCtx*/, Kernel::IScenario& /*scenario*/) { return true; } + + _IsDerivedFromClass_(IObject, OV_ClassId_ObjectVisitor) +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIObserver.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIObserver.h new file mode 100644 index 0000000..56177a3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIObserver.h @@ -0,0 +1,30 @@ +#pragma once + +#include "ovCObservable.h" +#include "ov_defines.h" + +namespace OpenViBE { +class CObservable; + +/** + * \class IObserver + * \author Guillaume Serrière (Inria/Loria) + * \date 2014-11-7 + * \brief OpenViBE Observer interface + * + * This interface is used in the Observer/Observable pattern + * implementation in OpenViBE. + */ +class IObserver +{ +public: + virtual ~IObserver() = default; + + /** + * \brief Function called by the observed object when a notification is done. + * \param o [in] : the object which do the notification. + * \param data [in] : a pointer to data give by the observed object during the notification. + */ + virtual void update(CObservable& o, void* data) = 0; +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIStimulationSet.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIStimulationSet.h new file mode 100644 index 0000000..1ab73fa --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ovIStimulationSet.h @@ -0,0 +1,119 @@ +#pragma once + +#include "ovIObject.h" + +namespace OpenViBE { +/** + * \class IStimulationSet + * \author Yann Renard (INRIA/IRISA) + * \date 2007-11-21 + * \brief Basic OpenViBE stimulation set interface + * + * This interface offers functionalities to handle a collection of OpenViBE stimulations. + * This collection basicaly consists in a list of stimulation information. Each stimulation + * has three information : an identifier, a date and a duration. + * + * OpenViBE provides an standalone implementation of this interface in CStimulationSet + */ + +class OV_API IStimulationSet : public IObject +{ +public: + + /** + * \brief Clears this stimulation set removing every existing stimulation + */ + virtual void clear() = 0; + /** + * \brief Gets the number of stimulations contained in this stimulation set + * \return the number of stimulations contained in this stimulation set. + */ + virtual size_t getStimulationCount() const = 0; + /** + * \brief Gets the identifier of a specific stimulation in this stimulation set + * \param index [in] : the index of the stimulation which identifier has to be returned + * \return the identifier for the specified stimulation. + */ + virtual uint64_t getStimulationIdentifier(const size_t index) const = 0; + /** + * \brief Gets the date of a specific stimulation in this stimulation set + * \param index [in] : the index of the stimulation which date has to be returned + * \return the date for the specified stimulation. + * \note the returned date is relative to the beginning of this stimulation set + * \note dates and durations are returned in seconds fixed point 32:32. Refer to \Doc_TimeManagement for more details + */ + virtual uint64_t getStimulationDate(const size_t index) const = 0; + /** + * \brief Gets the duration of a specific stimulation in this stimulation set + * \param index [in] : the index of the stimulation which duration has to be returned + * \return the duration for the specified stimulation. + * \note dates and durations are returned in seconds fixed point 32:32. Refer to \Doc_TimeManagement for more details + */ + virtual uint64_t getStimulationDuration(const size_t index) const = 0; + /** + * \brief Changes the stimulation count in this stimulation set + * \param n [in] : the new number of stimulations + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setStimulationCount(const size_t n) = 0; + /** + * \brief Changes the identifier of a specific stimulation in this stimulation set + * \param index [in] : the index of the stimulation which id should be changed + * \param id [in] : the new id for the specified stimulation + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setStimulationIdentifier(const size_t index, const uint64_t id) = 0; + /** + * \brief Changes the date of a specific stimulation in this stimulation set + * \param index [in] : the index of the stimulation which date should be changed + * \param date [in] : the new date for the specified stimulation + * \return \e true in case of success. + * \return \e false in case of error. + * \note dates and durations are returned in seconds fixed point 32:32. Refer to \Doc_TimeManagement for more details + */ + virtual bool setStimulationDate(const size_t index, const uint64_t date) = 0; + /** + * \brief Changes the duration of a specific stimulation in this stimulation set + * \param index [in] : the index of the stimulation which duration should be changed + * \param duration [in] : the new duration for the specified stimulation + * \return \e true in case of success. + * \return \e false in case of error. + * \note the returned date is relative to the beginning of this stimulation set + * \note dates and durations are returned in seconds fixed point 32:32. Refer to \Doc_TimeManagement for more details + */ + virtual bool setStimulationDuration(const size_t index, const uint64_t duration) = 0; + /** + * \brief Appends a stimulation to this stimulation set + * \param id [in] : the identifier of the stimulation to append + * \param date [in] : the date of the stimulation + * \param duration [in] : the duration of the stimulation + * \return the index of the appended stimulation in this stimulation set + */ + virtual size_t appendStimulation(const uint64_t id, const uint64_t date, const uint64_t duration) = 0; + /** + * \brief Inserts a stimulation to this stimulation set + * \param index [in] : the index of the stimulation to insert + * \param id [in] : the identifier of the stimulation + * \param date [in] : the date of the stimulation + * \param duration [in] : the duration of the stimulation + * \return \e true in case of success + * \return \e false in case of error + * \warning stimulation indexing change after call to this function : + * following stimulation(s) get one more indexed. + */ + virtual size_t insertStimulation(const size_t index, const uint64_t id, const uint64_t date, const uint64_t duration) = 0; + /** + * \brief Removes a stimulation from this stimulation set + * \param index [in] : the index of the stimulation to remove + * \return \e true in case of success + * \return \e false in case of error + * \warning stimulation indexing change after call to this function : + * following stimulation(s) get one less indexed. + */ + virtual bool removeStimulation(const size_t index) = 0; + + _IsDerivedFromClass_(IObject, OV_ClassId_StimulationSet) +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ov_all.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ov_all.h new file mode 100755 index 0000000..3ee2dc8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ov_all.h @@ -0,0 +1,146 @@ +#pragma once + +#include + +//___________________________________________________________________// +// // +// Basic includes // +//___________________________________________________________________// +// // + +#include "ov_defines.h" +#include "ov_directories.h" + +#include "CIdentifier.hpp" +#include "CTime.hpp" +#include "ovCString.h" +#include "ovCNameValuePairList.h" + +#include "CMatrix.hpp" + +#include "ovIStimulationSet.h" +#include "ovCStimulationSet.h" + +#include "ovIMemoryBuffer.h" +#include "ovCMemoryBuffer.h" + +#include "ovIObject.h" +#include "ovIObjectVisitor.h" +#include "ovIKernelLoader.h" +#include "ovCKernelLoader.h" + +#include "ovIObserver.h" +#include "ovCObservable.h" + +#include "ovAssert.h" + +//___________________________________________________________________// +// // +// Kernel includes // +//___________________________________________________________________// +// // + +#include "kernel/ovIKernelContext.h" +#include "kernel/ovIKernelDesc.h" +#include "kernel/ovIKernelObject.h" +#include "kernel/ovIKernelObjectFactory.h" + +#include "kernel/ovITypeManager.h" +#include "kernel/ovIParameter.h" +#include "kernel/ovIConfigurable.h" +#include "kernel/ovIObjectVisitorContext.h" +#include "kernel/ovTParameterHandler.h" + +#include "kernel/algorithm/ovIAlgorithmContext.h" +#include "kernel/algorithm/ovIAlgorithmManager.h" +#include "kernel/algorithm/ovIAlgorithmProto.h" +#include "kernel/algorithm/ovIAlgorithmProxy.h" + +#include "kernel/configuration/ovIConfigurationManager.h" +#include "kernel/configuration/ovIConfigurationKeywordExpandCallback.h" + +#include "kernel/log/ovILogManager.h" +#include "kernel/log/ovILogListener.h" + +#include "kernel/error/ovIErrorManager.h" +#include "kernel/error/ovIError.h" +#include "kernel/error/ovErrorType.h" + +#include "kernel/player/ovIBoxAlgorithmContext.h" +#include "kernel/player/CMessageClock.hpp" +#include "kernel/player/ovIPlayer.h" +#include "kernel/player/ovIPlayerContext.h" +#include "kernel/player/ovIPlayerManager.h" + +#include "kernel/plugins/ovIPluginManager.h" +#include "kernel/plugins/ovIPluginModule.h" +#include "kernel/plugins/ovIPluginModuleContext.h" + +#include "kernel/metabox/ovIMetaboxManager.h" + +#include "kernel/scenario/ovIAttributable.h" +#include "kernel/scenario/ovIBox.h" +#include "kernel/scenario/ovIBoxIO.h" +#include "kernel/scenario/ovIBoxListenerContext.h" +#include "kernel/scenario/ovIBoxProto.h" +#include "kernel/scenario/ovIComment.h" +#include "kernel/scenario/ovIMetadata.h" +#include "kernel/scenario/ovILink.h" +#include "kernel/scenario/ovIScenario.h" +#include "kernel/scenario/ovIScenarioManager.h" +#include "kernel/scenario/ovIAlgorithmScenarioImporter.h" +#include "kernel/scenario/ovIAlgorithmScenarioExporter.h" + +//___________________________________________________________________// +// // +// Plugins includes // +//___________________________________________________________________// +// // + +#include "plugins/ovIPluginObject.h" +#include "plugins/ovIPluginObjectDesc.h" + +#include "plugins/ovIAlgorithm.h" +#include "plugins/ovIAlgorithmDesc.h" + +#include "plugins/ovIBoxAlgorithm.h" +#include "plugins/ovIBoxAlgorithmDesc.h" + +namespace OpenViBE { +namespace Plugins { +// Backward compatibility +typedef Kernel::IBox IStaticBoxContext; +typedef Kernel::IBoxIO IDynamicBoxContext; +} // namespace Plugins +} // namespace OpenViBE + +//___________________________________________________________________// +// // +// Plugins includes // +//___________________________________________________________________// +// // + +#define OVP_Declare_Begin() \ + static std::vector> g_descriptors; \ + extern "C" \ + { \ + OVP_API bool onInitialize(const OpenViBE::Kernel::IPluginModuleContext& context) \ + { + +#define OVP_Declare_New(Class) g_descriptors.emplace_back(new Class); + +#define OVP_Declare_End() \ + return true; \ + } \ + OVP_API bool onUninitialize(const OpenViBE::Kernel::IPluginModuleContext& context) { return true; } \ + OVP_API bool onGetPluginObjectDescription(const OpenViBE::Kernel::IPluginModuleContext& context, size_t index, OpenViBE::Plugins::IPluginObjectDesc*& pluginObjectDesc) \ + { \ + if(index>=g_descriptors.size()) \ + { \ + pluginObjectDesc=NULL; \ + return false; \ + } \ + pluginObjectDesc=g_descriptors[index].get(); \ + return true; \ + } \ + } diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ov_defines.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ov_defines.h new file mode 100755 index 0000000..0d8475e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ov_defines.h @@ -0,0 +1,202 @@ +#pragma once + +#include + +// Global Class Identifiers +//--------------------------------------------------------------------------------------------------- +#define OV_ClassId_Object OpenViBE::CIdentifier(0x327B23C6, 0x6B8B4567) +#define OV_ClassId_ObjectVisitor OpenViBE::CIdentifier(0x1ED722DC, 0x00BDA996) +#define OV_ClassId_KernelLoader OpenViBE::CIdentifier(0x1930F64B, 0x6F689236) +#define OV_ClassId_KernelLoaderBridge OpenViBE::CIdentifier(0xFD705391, 0xA3078789) + +// Kernel Class Identifiers +//--------------------------------------------------------------------------------------------------- +#define OV_ClassId_Kernel_KernelContext OpenViBE::CIdentifier(0x1AFF3D5A, 0x77F610EE) +#define OV_ClassId_Kernel_KernelDesc OpenViBE::CIdentifier(0x5410291E, 0x2FEF6B81) +#define OV_ClassId_Kernel_KernelObject OpenViBE::CIdentifier(0x69BAE694, 0x163C8B2D) +#define OV_ClassId_Kernel_KernelObjectFactory OpenViBE::CIdentifier(0x04D88707, 0x21F2F456) +#define OV_ClassId_Kernel_TypeManager OpenViBE::CIdentifier(0x3E800821, 0x5D1DE74E) +#define OV_ClassId_Kernel_Parameter OpenViBE::CIdentifier(0xF980A924, 0x696E2BC8) +#define OV_ClassId_Kernel_Configurable OpenViBE::CIdentifier(0x52CEA963, 0x210D78D8) +#define OV_ClassId_Kernel_ObjectVisitorContext OpenViBE::CIdentifier(0x84326BA5, 0xB0E630D8) + +#define OV_ClassId_Kernel_Algorithm_AlgorithmContext OpenViBE::CIdentifier(0x6DAC2B49, 0xF424D47B) +#define OV_ClassId_Kernel_Algorithm_AlgorithmManager OpenViBE::CIdentifier(0x2596C3E4, 0xB2D91D95) +#define OV_ClassId_Kernel_Algorithm_AlgorithmProto OpenViBE::CIdentifier(0x06DF986C, 0x39B795CC) +#define OV_ClassId_Kernel_Algorithm_AlgorithmProxy OpenViBE::CIdentifier(0xE015C4C5, 0x479C3D46) + +#define OV_ClassId_Kernel_Config_ConfigManager OpenViBE::CIdentifier(0xA5267456, 0xE58CC0E9) + +#define OV_ClassId_Kernel_Log_LogManager OpenViBE::CIdentifier(0x22990B50, 0x571010D4) +#define OV_ClassId_Kernel_Log_LogListener OpenViBE::CIdentifier(0x766B92CB, 0x33B01B15) + +#define OV_ClassId_Kernel_Error_ErrorManager OpenViBE::CIdentifier(0x34F53481, 0x8838301F) +#define OV_ClassId_Kernel_Error_Error OpenViBE::CIdentifier(0x7E013D8C, 0x35E27990) + +#define OV_ClassId_Kernel_Player_BoxAlgorithmContext OpenViBE::CIdentifier(0x275F4BB8, 0x49E08D24) +#define OV_ClassId_Kernel_Player_Message OpenViBE::CIdentifier(0x64DCCE4E, 0x530CA785) +#define OV_ClassId_Kernel_Player_MessageClock OpenViBE::CIdentifier(0x58AE3092, 0x0C3371A7) +#define OV_ClassId_Kernel_Player_Player OpenViBE::CIdentifier(0x790A8CC5, 0x1439C776) +#define OV_ClassId_Kernel_Player_PlayerContext OpenViBE::CIdentifier(0x1F8D3E14, 0x73A4DB1F) +#define OV_ClassId_Kernel_Player_PlayerManager OpenViBE::CIdentifier(0x2A49A89B, 0x78843238) +#define OV_ClassId_Kernel_Plugins_PluginModule OpenViBE::CIdentifier(0x74EAC344, 0x375C88EC) +#define OV_ClassId_Kernel_Plugins_PluginModuleContext OpenViBE::CIdentifier(0x624A6E5B, 0x52228CEA) +#define OV_ClassId_Kernel_Plugins_PluginManager OpenViBE::CIdentifier(0x690ED3AC, 0x2D0702F0) +#define OV_ClassId_Kernel_Metabox_MetaboxManager OpenViBE::CIdentifier(0x1431A3AC, 0x2D01431A) +#define OV_ClassId_Kernel_Scenario_Attributable OpenViBE::CIdentifier(0x61B64E38, 0x0B36B4E8) +#define OV_ClassId_Kernel_Scenario_Box OpenViBE::CIdentifier(0x41209015, 0x1183237A) +#define OV_ClassId_Kernel_Scenario_BoxUpdater OpenViBE::CIdentifier(0xA58236FA, 0x12337FAE) +#define OV_ClassId_Kernel_Scenario_BoxIO OpenViBE::CIdentifier(0x110AAB4F, 0x157CBEF1) +#define OV_ClassId_Kernel_Scenario_BoxListenerContext OpenViBE::CIdentifier(0xB4344A89, 0xC5044324) +#define OV_ClassId_Kernel_Scenario_BoxProto OpenViBE::CIdentifier(0x169ED1C1, 0x639C5957) +#define OV_ClassId_Kernel_Scenario_Comment OpenViBE::CIdentifier(0x13597D48, 0xB7268440) +#define OV_ClassId_Kernel_Scenario_Metadata OpenViBE::CIdentifier(0x2D26542A, 0xC08B01D3) +#define OV_ClassId_Kernel_Scenario_Link OpenViBE::CIdentifier(0x38F6E10D, 0x6BA2721A) +#define OV_ClassId_Kernel_Scenario_Scenario OpenViBE::CIdentifier(0x6EED456C, 0x2FC6F03A) +#define OV_ClassId_Kernel_Scenario_ScenarioImporterContext OpenViBE::CIdentifier(0x734C0B6A, 0x7EFEBBC8) +#define OV_ClassId_Kernel_Scenario_ScenarioExporterContext OpenViBE::CIdentifier(0x583A5B71, 0x2C06662D) +#define OV_ClassId_Kernel_Scenario_ScenarioManager OpenViBE::CIdentifier(0x67F31911, 0x3FA45C02) + +#define OV_ClassId_Kernel_Server_ServerExtensionProto OpenViBE::CIdentifier(0x93A6ECFB, 0x1199459F) + +// Plugin Class Identifiers +//--------------------------------------------------------------------------------------------------- +#define OV_ClassId_Plugins_PluginObject OpenViBE::CIdentifier(0x1356510D, 0x6B6532DF) +#define OV_ClassId_Plugins_PluginObjectDesc OpenViBE::CIdentifier(0x100E6855, 0x7C1CA212) + +#define OV_ClassId_Plugins_Algorithm OpenViBE::CIdentifier(0x4C4499C7, 0xBD7F16C9) +#define OV_ClassId_Plugins_AlgorithmDesc OpenViBE::CIdentifier(0xBB9BAE23, 0x8C81D56E) + +#define OV_ClassId_Plugins_BoxAlgorithm OpenViBE::CIdentifier(0x2A910204, 0x57E55735) +#define OV_ClassId_Plugins_BoxAlgorithmDesc OpenViBE::CIdentifier(0x2C4ECAD0, 0x19607084) +#define OV_ClassId_Plugins_BoxListener OpenViBE::CIdentifier(0xCC0CE0A3, 0x4684AEED) + +#define OV_ClassId_Plugins_ScenarioImporter OpenViBE::CIdentifier(0x6BF28385, 0x77F8D9A1) +#define OV_ClassId_Plugins_ScenarioImporterDesc OpenViBE::CIdentifier(0x05146C29, 0x283B5BB8) + +#define OV_ClassId_Plugins_ScenarioExporter OpenViBE::CIdentifier(0x6C54A6C9, 0x174982CD) +#define OV_ClassId_Plugins_ScenarioExporterDesc OpenViBE::CIdentifier(0x13B1BD52, 0x06AB7557) + +#define OV_ClassId_Plugins_ServerExtension OpenViBE::CIdentifier(0x85558278, 0x285A3E06) +#define OV_ClassId_Plugins_ServerExtensionDesc OpenViBE::CIdentifier(0x187ADACA, 0x6DD8C6FA) + +// Metabox Class Identifiers +//--------------------------------------------------------------------------------------------------- +#define OV_ClassId_Metaboxes_MetaboxObjectDesc OpenViBE::CIdentifier(0x100E6855, 0xFF905FEA) + +//--------------------------------------------------------------------------------------------------- +#define OV_ClassId_Matrix OpenViBE::CIdentifier(0x65AA951D, 0x73EE781E) +#define OV_ClassId_MatrixBridge OpenViBE::CIdentifier(0x4331378D, 0x5A1E0A69) +#define OV_ClassId_MatrixImpl OpenViBE::CIdentifier(0x2F59C42E, 0x54166A96) + +#define OV_ClassId_StimulationSet OpenViBE::CIdentifier(0x691473DE, 0x2EE37ABD) +#define OV_ClassId_StimulationSetBridge OpenViBE::CIdentifier(0x39F81801, 0x2491BF81) +#define OV_ClassId_StimulationSetImpl OpenViBE::CIdentifier(0x1649669C, 0x25B89AD7) + +#define OV_ClassId_MemoryBuffer OpenViBE::CIdentifier(0xADF318BB, 0xB728A579) +#define OV_ClassId_MemoryBufferBridge OpenViBE::CIdentifier(0xFD84704B, 0xA9E61735) +#define OV_ClassId_MemoryBufferImpl OpenViBE::CIdentifier(0x51551D5C, 0x80B34EEE) + +// Box attributes +//--------------------------------------------------------------------------------------------------- +#define OV_AttributeId_Scenario_Name OpenViBE::CIdentifier(0x9F5C4075, 0x4A0D3666) +#define OV_AttributeId_Scenario_Author OpenViBE::CIdentifier(0x790D75B8, 0x3BB90C33) +#define OV_AttributeId_Scenario_Company OpenViBE::CIdentifier(0xF8034A49, 0x8B3F37CC) +#define OV_AttributeId_Scenario_ShortDescription OpenViBE::CIdentifier(0x84009D7C, 0x3C4E763B) +#define OV_AttributeId_Scenario_DetailedDescription OpenViBE::CIdentifier(0x7A3A1558, 0xF12C63C2) +#define OV_AttributeId_Scenario_Category OpenViBE::CIdentifier(0xF6B2E3FA, 0x7BD43926) +#define OV_AttributeId_Scenario_Version OpenViBE::CIdentifier(0x8C1FC55B, 0x7B433DC2) +#define OV_AttributeId_Scenario_DocumentationPage OpenViBE::CIdentifier(0xF36A1567, 0xD13C53DA) +#define OV_AttributeId_Scenario_AddedSoftwareVersion OpenViBE::CIdentifier(0x079D1F09, 0x667C7871) +#define OV_AttributeId_Scenario_UpdatedSoftwareVersion OpenViBE::CIdentifier(0x60BC58AB, 0x7A1B4D83) +#define OV_AttributeId_Scenario_MetaboxHash OpenViBE::CIdentifier(0x20C6D158, 0xFE90AADD) + +#define OV_AttributeId_Box_XCenterPosition OpenViBE::CIdentifier(0x207C9054, 0x3C841B63) +#define OV_AttributeId_Box_YCenterPosition OpenViBE::CIdentifier(0x1FA7A38F, 0x54EDBE0B) +#define OV_AttributeId_Box_XSize OpenViBE::CIdentifier(0xAD100179, 0xA3C984AB) +#define OV_AttributeId_Box_YSize OpenViBE::CIdentifier(0x1FA963F5, 0x1A638CD4) + +#define OV_AttributeId_Box_SettingOverrideFilename OpenViBE::CIdentifier(0x8D21FF41, 0xDF6AFE7E) +#define OV_AttributeId_Box_InitialPrototypeHashValue OpenViBE::CIdentifier(0x4E7B798A, 0x183BEAFB) +#define OV_AttributeId_Box_ComputationTimeLastSecond OpenViBE::CIdentifier(0xC46B3D00, 0x3E0454E1) +#define OV_AttributeId_Box_Priority OpenViBE::CIdentifier(0xAC367A9C, 0x2DA95ABE) +#define OV_AttributeId_Box_InitialInputCount OpenViBE::CIdentifier(0xCFAD85B0, 0x7C6D841C) +#define OV_AttributeId_Box_InitialOutputCount OpenViBE::CIdentifier(0xC80CE8AF, 0xF699F813) +#define OV_AttributeId_Box_InitialSettingCount OpenViBE::CIdentifier(0xCE18836A, 0x9C0EB403) +#define OV_AttributeId_Box_ToBeUpdated OpenViBE::CIdentifier(0xC9526A77, 0x5EAF81A6) +#define OV_AttributeId_Box_PendingDeprecatedInterfacors OpenViBE::CIdentifier(0xAB422730, 0x56414F32) + +#define OV_AttributeId_Box_FlagCanAddInput OpenViBE::CIdentifier(0xFBA64161, 0x65304E21) +#define OV_AttributeId_Box_FlagCanModifyInput OpenViBE::CIdentifier(0x527AD68D, 0x16D746A0) +#define OV_AttributeId_Box_FlagCanAddOutput OpenViBE::CIdentifier(0x17EE7C08, 0x94C14893) +#define OV_AttributeId_Box_FlagCanModifyOutput OpenViBE::CIdentifier(0x30A4E5C9, 0x83502953) +#define OV_AttributeId_Box_FlagCanAddSetting OpenViBE::CIdentifier(0x61D11811, 0x71E65362) +#define OV_AttributeId_Box_FlagCanModifySetting OpenViBE::CIdentifier(0xF191C1C8, 0xA0123976) +#define OV_AttributeId_Box_FlagNeedsManualUpdate OpenViBE::CIdentifier(0xA456EFD1, 0x27661FCB) + +#define OV_AttributeId_Box_DocumentationCommand OpenViBE::CIdentifier(0x7BEC744D, 0x227C19EC) +#define OV_AttributeId_Box_DocumentationURLBase OpenViBE::CIdentifier(0x3E470D64, 0x376E7860) +#define OV_AttributeId_Box_DocumentationURL OpenViBE::CIdentifier(0x01EE14DB, 0x256B2E69) + +#define OV_AttributeId_Box_Muted OpenViBE::CIdentifier(0xC73E83EC, 0xF855C5BC) + +#define OV_AttributeId_Comment_XCenterPosition OpenViBE::CIdentifier(0x473D9A43, 0x97FC0A97) +#define OV_AttributeId_Comment_YCenterPosition OpenViBE::CIdentifier(0x7234B86B, 0x2B8651A5) +// #define OV_AttributeId_Comment_XSize OpenViBE::CIdentifier(0xE680C753, 0x605306E0) +// #define OV_AttributeId_Comment_YSize OpenViBE::CIdentifier(0x6E73BAD9, 0x92143DB3) + +#define OV_AttributeId_Link_XSrc OpenViBE::CIdentifier(0x358AE8B5, 0x0F8BACD1) +#define OV_AttributeId_Link_YSrc OpenViBE::CIdentifier(0x1B32C44C, 0x1905E0E9) +#define OV_AttributeId_Link_XDst OpenViBE::CIdentifier(0x6267B5C5, 0x676E3E42) +#define OV_AttributeId_Link_YDst OpenViBE::CIdentifier(0x3F0A3B27, 0x570913D2) +#define OV_AttributeId_Link_Invalid OpenViBE::CIdentifier(0x5699FEAA, 0xF45DC988) + +#define OVP_ClassId_BoxAlgorithm_Metabox OpenViBE::CIdentifier(0xFE420CB6, 0x5F2BA4C3) +#define OVP_ClassId_BoxAlgorithm_MetaboxDesc OpenViBE::CIdentifier(0xA87F133C, 0x1E6B6543) +#define OVP_AttributeId_Metabox_ID OpenViBE::CIdentifier(0x198DD621, 0xAB7F153F) +#define OV_AttributeId_ScenarioFilename OpenViBE::CIdentifier(0x4C536D0A, 0xB23DC545) + +// Unused Class Identifiers +//--------------------------------------------------------------------------------------------------- +#define OV_TypeId_Boolean OpenViBE::CIdentifier(0x2CDB2F0B, 0x12F231EA) +#define OV_TypeId_Integer OpenViBE::CIdentifier(0x007DEEF9, 0x2F3E95C6) +#define OV_TypeId_Float OpenViBE::CIdentifier(0x512A166F, 0x5C3EF83F) +#define OV_TypeId_String OpenViBE::CIdentifier(0x79A9EDEB, 0x245D83FC) +#define OV_TypeId_Filename OpenViBE::CIdentifier(0x330306DD, 0x74A95F98) +#define OV_TypeId_Foldername OpenViBE::CIdentifier(0x43A26C8E, 0x0A8172B6) +#define OV_TypeId_Script OpenViBE::CIdentifier(0xB0D0DB45, 0x49CBC34A) +#define OV_TypeId_Stimulation OpenViBE::CIdentifier(0x2C132D6E, 0x44AB0D97) +#define OV_TypeId_LogLevel OpenViBE::CIdentifier(0xA88B3667, 0x0871638C) + +#define OV_TypeId_EBMLStream OpenViBE::CIdentifier(0x434F6587, 0x2EFD2B7E) +#define OV_TypeId_ExperimentInfo OpenViBE::CIdentifier(0x403488E7, 0x565D70B6) +#define OV_TypeId_ExperimentationInformation OpenViBE::CIdentifier(0x403488E7, 0x565D70B6) // deprecated, kept for compatibility +#define OV_TypeId_Stimulations OpenViBE::CIdentifier(0x6F752DD0, 0x082A321E) +#define OV_TypeId_StreamedMatrix OpenViBE::CIdentifier(0x544A003E, 0x6DCBA5F6) +#define OV_TypeId_ChannelLocalisation OpenViBE::CIdentifier(0x013DF452, 0xA3A8879A) +#define OV_TypeId_ChannelUnits OpenViBE::CIdentifier(0x6AB26B81, 0x0F8C02F3) +#define OV_TypeId_FeatureVector OpenViBE::CIdentifier(0x17341935, 0x152FF448) +#define OV_TypeId_Signal OpenViBE::CIdentifier(0x5BA36127, 0x195FEAE1) +#define OV_TypeId_Spectrum OpenViBE::CIdentifier(0x1F261C0A, 0x593BF6BD) +#define OV_TypeId_CovarianceMatrix OpenViBE::CIdentifier(0x897F844E, 0xB7958255) +#define OV_TypeId_TimeFrequency OpenViBE::CIdentifier(0x5A90816B, 0xFF2AFF72) + + +#define OV_TypeId_Message OpenViBE::CIdentifier(0x0A261C0A, 0xBD3BF6BD) + +#define OV_TypeId_MeasurementUnit OpenViBE::CIdentifier(0x2F3563A4, 0x571E194D) +#define OV_TypeId_Factor OpenViBE::CIdentifier(0x501F79FA, 0x7E1F6680) +#define OV_TypeId_BoxAlgorithmFlag OpenViBE::CIdentifier(0xF1A6F1A6, 0xF1A6F1A6) + +#define OV_IncorrectStimulation 0xffffffffffffffffull + +// Several other defined values +//--------------------------------------------------------------------------------------------------- +#define OV_Value_EnumeratedStringSeparator ';' +#define OV_Value_RangeStringSeparator ':' +// Importer contexts + +#define OV_ScenarioImportContext_SchedulerMetaboxImport OpenViBE::CIdentifier(0xDDBDD59F, 0xE8C76702) +#define OV_ScenarioImportContext_OnLoadMetaboxImport OpenViBE::CIdentifier(0xED48480A, 0x9F6DBAA7) + +#define OV_EPSILON 0.000001 // 10^{-6} diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ov_directories.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ov_directories.h new file mode 100644 index 0000000..b244902 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ov_directories.h @@ -0,0 +1,23 @@ +#pragma once + +#include "ov_directories_string.h" +#include "ovCString.h" + +namespace OpenViBE { +class Directories +{ + // The functions in this file should be only used in bootstrapping circumstances where Configuration Manager (Kernel Context) is not available. + // With access to Configuration Manager, the paths should be fetched using tokens such as ${Path_UserData}. Note that in such a case changing the environment variable later may no longer be affected in the token value. + + // @NOTE These functions may not be thread-safe +public: + Directories() = delete; + static CString getDistRootDir() { return StringDirectories::getDistRootDir().c_str(); } + static CString getBinDir() { return StringDirectories::getBinDir().c_str(); } + static CString getDataDir() { return StringDirectories::getDataDir().c_str(); } + static CString getLibDir() { return StringDirectories::getLibDir().c_str(); } + static CString getUserHomeDir() { return StringDirectories::getUserHomeDir().c_str(); } + static CString getUserDataDir() { return StringDirectories::getUserDataDir().c_str(); } + static CString getLogDir() { return StringDirectories::getLogDir().c_str(); } +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ov_directories_string.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ov_directories_string.h new file mode 100644 index 0000000..6965636 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/ov_directories_string.h @@ -0,0 +1,152 @@ +#pragma once + +#include // For getenv() +#include + +#if defined TARGET_OS_Windows +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX +#define NOMINMAX +#endif +#include +#include "m_ConverterUtf8.h" +#include +#elif defined TARGET_OS_Linux +#include +#include +#elif defined TARGET_OS_MacOS +#include +#endif + +namespace OpenViBE { +class StringDirectories +{ +public: + StringDirectories() = delete; + +#ifdef OV_USE_CMAKE_DEFAULT_PATHS + static std::string getDistRootDir() { return pathFromEnv("OV_PATH_ROOT", OV_CMAKE_PATH_ROOT); } +#else + static std::string getDistRootDir() { return pathFromEnv("OV_PATH_ROOT", guessRootDir().c_str()); } +#endif + + static std::string getBinDir() { return pathFromEnvOrExtendedRoot("OV_PATH_BIN", "/bin", OV_CMAKE_PATH_BIN); } + static std::string getDataDir() { return pathFromEnvOrExtendedRoot("OV_PATH_DATA", "/share/openvibe", OV_CMAKE_PATH_DATA); } + +#if defined TARGET_OS_Windows + static std::string getLibDir() { return pathFromEnvOrExtendedRoot("OV_PATH_LIB", "/bin", OV_CMAKE_PATH_BIN); } + static std::string getUserHomeDir() { return pathFromEnv("USERPROFILE", "openvibe-user"); } + static std::string getUserDataDir() { return (pathFromEnv("APPDATA", "openvibe-user") + "/" + OV_CONFIG_SUBDIR); } + + static std::string getAllUsersDataDir() + { + std::string path = pathFromEnv("PROGRAMDATA", ""); // first chance: Win7 and higher + if (path.empty()) { path = pathFromEnv("ALLUSERSPROFILE", ""); } // second chance: WinXP + if (path.empty()) { path = "openvibe-user"; } // fallback + return path + "/" + OV_CONFIG_SUBDIR; + } +#else + static std::string getLibDir() { return pathFromEnvOrExtendedRoot("OV_PATH_LIB", "/lib", OV_CMAKE_PATH_LIB); } + static std::string getUserHomeDir() { return pathFromEnv("HOME", "openvibe-user"); } + static std::string getUserDataDir() { return (getUserHomeDir() + "/.config/" + OV_CONFIG_SUBDIR); } + static std::string getAllUsersDataDir() { return (getUserHomeDir() + "/.config/" + OV_CONFIG_SUBDIR); } +#endif + + static std::string getLogDir() { return getUserDataDir() + "/log"; } + +private: + + // Used to convert \ in paths to /, we need this because \ is a special character for .conf token parsing + static std::string convertPath(const std::string& strIn) + { + std::string out(strIn); + const size_t len = strIn.length(); + for (size_t i = 0; i < len; ++i) { if (strIn[i] == '\\') { out[i] = '/'; } } + return out; + } + + /// Try to guess the root directory by assuming that any program that uses the kernel is in the bin + /// subdirectory of the dist folder. + static std::string guessRootDir() + { + static std::string rootDir; + if (!rootDir.empty()) { return rootDir; } + + std::string fullpath; +#if defined TARGET_OS_Windows + // Unlike GetEnvironmentVariableW, this function can not return the length of the actual path + const std::unique_ptr utf16value(new wchar_t[1024]); + GetModuleFileNameW(nullptr, utf16value.get(), 1024); + const int multiByteSize = WideCharToMultiByte(CP_UTF8, 0, utf16value.get(), -1, nullptr, 0, nullptr, nullptr); + if (multiByteSize == 0) + { + // There are no sensible values to return if the above call fails and the program will not be + // able to run in any case. + std::abort(); + } + const std::unique_ptr utf8Value(new char[size_t(multiByteSize)]); + if (WideCharToMultiByte(CP_UTF8, 0, utf16value.get(), -1, utf8Value.get(), multiByteSize, nullptr, nullptr) == 0) { std::abort(); } + + fullpath = convertPath(utf8Value.get()); +#elif defined TARGET_OS_Linux + char path[2048]; + memset(path, 0, sizeof(path)); // readlink does not produce 0 terminated strings + readlink("/proc/self/exe", path, sizeof(path)); + fullpath = std::string(path); +#elif defined TARGET_OS_MacOS + size_t size = 0; + _NSGetExecutablePath(nullptr, &size); + std::unique_ptr path(new char[size + 1]); + + if (_NSGetExecutablePath(path.get(), &size) != 0) { std::abort(); } + + fullpath = std::string(path.get()); +#endif + const auto slashBeforeLast = fullpath.find_last_of('/', fullpath.find_last_of('/') - 1); + rootDir = fullpath.substr(0, slashBeforeLast); + return rootDir; + } + + // Returns ENV variable value or sDefaultPath if the variable doesn't exist. The path is converted with each \ to /. + static std::string pathFromEnv(const char* sEnvVar, const char* sDefaultPath) + { +#if defined TARGET_OS_Windows + // Using std::getenv on Windows yields UTF7 strings which do not work with the Utf8ToUtf16 function + // as this seems to be the only place where we actually get UTF7, let's get it as UTF16 by default + const DWORD wideBufferSize = GetEnvironmentVariableW(Common::Converter::Utf8ToUtf16(sEnvVar).c_str(), nullptr, 0); + if (wideBufferSize == 0) { return convertPath(sDefaultPath); } + const std::unique_ptr utf16value(new wchar_t[wideBufferSize]); + GetEnvironmentVariableW(Common::Converter::Utf8ToUtf16(sEnvVar).c_str(), utf16value.get(), wideBufferSize); + + const int multiByteSize = WideCharToMultiByte(CP_UTF8, 0, utf16value.get(), -1, nullptr, 0, nullptr, nullptr); + if (multiByteSize == 0) { return convertPath(sDefaultPath); } + const std::unique_ptr utf8Value(new char[size_t(multiByteSize)]); + if (WideCharToMultiByte(CP_UTF8, 0, utf16value.get(), -1, utf8Value.get(), multiByteSize, nullptr, nullptr) == 0) { return convertPath(sDefaultPath); } + + const char* pathPtr = utf8Value.get(); +#else + const char * pathPtr = std::getenv(sEnvVar); +#endif + const std::string path = (pathPtr ? pathPtr : sDefaultPath); + return convertPath(path); + } + + // Returns ENV variable if it is defined, otherwise it extends the ROOT variable if it exists, finally returns a default path + static std::string pathFromEnvOrExtendedRoot(const char* envVar, const char* rootPostfix, const char* defaultPath) + { + if (std::getenv(envVar)) { return pathFromEnv(envVar, defaultPath); } + if (std::getenv("OV_PATH_ROOT")) + { + // the default case for this one is wrong but it should never happen + return pathFromEnv("OV_PATH_ROOT", "") + rootPostfix; + } +#ifdef OV_USE_CMAKE_DEFAULT_PATHS + return convertPath(defaultPath); +#else + return guessRootDir() + rootPostfix; +#endif + } +}; +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIAlgorithm.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIAlgorithm.h new file mode 100644 index 0000000..6f85b5b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIAlgorithm.h @@ -0,0 +1,66 @@ +#pragma once + +#include "ovIPluginObject.h" + +namespace OpenViBE { +namespace Kernel { +class IAlgorithmContext; +} // namespace Kernel + +namespace Plugins { +/** + * \class IAlgorithm + * \author Yann Renard (INRIA/IRISA) + * \date 2007-11-06 + * \brief Abstract algorithm, base element of OpenViBE processing objects + * \ingroup Group_Extend + * + * This class should be derived by any plugin that is related + * to data processing. It basically has a parameterable interface + * contained in the IAlgorithmContext object. This interface + * stores several typed parameters which can be modified either by + * outside world in order to provide input paramters to this algorithm + * or by this algorithm itself in order to produce output parameters. + * + * This is the heart of the extension mechanism of the + * OpenViBE platform. + * + * \sa Kernel::IAlgorithmDesc + * \sa Kernel::IAlgorithmContext + * + * \todo details about building new plugins + */ +class OV_API IAlgorithm : public IPluginObject +{ +public: + + /** + * \brief Initializes this algorithm + * \param ctx [in] : the execution context for this algorithm + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool initialize(Kernel::IAlgorithmContext& ctx) { return true; } + /** + * \brief Unitializes this algorithm + * \param ctx [in] : the extecution context for this algorithm + * \return \e true in case of success. + * \return \e false in case of error. + * \exception this method must be noexcept + */ + virtual bool uninitialize(Kernel::IAlgorithmContext& ctx) { return true; } + /** + * \brief Effectively executes this algorithm + * \param ctx [in] : the extecution context for this algorithm + * \return \e true in case of success. + * \return \e false in case of error. + * + * When called, this function should get its "input" parameters, do stuffs with them + * and finally produce "output" parameters. + */ + virtual bool process(Kernel::IAlgorithmContext& ctx) = 0; + + _IsDerivedFromClass_(IPluginObject, OV_ClassId_Plugins_Algorithm) +}; +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIAlgorithmDesc.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIAlgorithmDesc.h new file mode 100644 index 0000000..dbb10dc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIAlgorithmDesc.h @@ -0,0 +1,44 @@ +#pragma once + +#include "ovIPluginObjectDesc.h" +#include "../kernel/algorithm/ovIAlgorithmProto.h" + +namespace OpenViBE { +namespace Plugins { +/** + * \class IAlgorithmDesc + * \author Yann Renard (INRIA/IRISA) + * \date 2007-11-06 + * \brief Algorithm plugin descriptor + * \ingroup Group_Extend + * + * This class should be derived by any plugin developer in + * order to describe a specific OpenViBE algorithm. + * + * \sa IAlgorithm + * + * \todo details about building new plugins + */ +class OV_API IAlgorithmDesc : public IPluginObjectDesc +{ +public: + + /** + * \brief Gets the prototype for this algorithm + * \param prototype [out] : the prototype to fill + * \return \e true in case of success \e false in other cases. + * + * When this function is called by the OpenViBE + * platform, the plugin descriptor should fill in + * the structure to let the OpenViBE platform know + * what the algorithm should look like + * (inputs/outputs/triggers). + * + * \sa IAlgorithmProto + */ + virtual bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const = 0; + + _IsDerivedFromClass_(IPluginObjectDesc, OV_ClassId_Plugins_AlgorithmDesc) +}; +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIBoxAlgorithm.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIBoxAlgorithm.h new file mode 100644 index 0000000..202a2bc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIBoxAlgorithm.h @@ -0,0 +1,224 @@ +#pragma once + +#include "ovIPluginObject.h" + +namespace OpenViBE { +namespace Kernel { + +/** + * \brief This enum lists all the way a box can be modified + * \sa Plugins::IBoxListener::process + */ +enum class EBoxModification +{ + Initialized, DefaultInitialized, + NameChanged, IdentifierChanged, AlgorithmClassIdentifierChanged, + InputConnected, InputDisconnected, InputAdded, InputRemoved, InputTypeChanged, InputNameChanged, + OutputConnected, OutputDisconnected, OutputAdded, OutputRemoved, OutputTypeChanged, OutputNameChanged, + SettingAdded, SettingRemoved, SettingTypeChanged, SettingNameChanged, SettingDefaultValueChanged, SettingValueChanged +}; +} // namespace Kernel + + +namespace Kernel { +class IBoxAlgorithmContext; +class IBoxListenerContext; +} + +namespace Plugins { +/** + * \class IBoxAlgorithm + * \author Yann Renard (INRIA/IRISA) + * \date 2006-06-19 + * \brief Algorithm to create/process/transform OpenViBE data + * \ingroup Group_Extend + * + * This class should be derived by any plugin that is related + * to data processing. It can be data acquisition/production + * from an hardware device or from a file. It can be data + * processing/transforming, moving time information into + * frequency space for example. It can be data classification + * generating discrete classification events better than + * continuous data flow. + * + * This is the heart of the extension mechanism of the + * OpenViBE platform. + * + * \sa Kernel::IBoxAlgorithmDesc + * + * \todo details about building new plugins + */ +class OV_API IBoxAlgorithm : public IPluginObject +{ +public: + + /** \name Behavioral configuration */ + //@{ + + /** + * \brief Gets the clock frequency to call this algorithm + * \param ctx [in] : The current box state + * \return The clock frequency to call this algorithm + * \note Default implementation returns 0 + * + * This function is used for algorithms that are triggered on + * clock signals. The frequency is given in Hz, with 32:32 fixed + * point representation thus returning \c (1<<32) will make the + * algorithm to be called every second, returning \c (100<<32) + * will make the algorithm being called 100 times a second, + * returning \c (1<<31) will make the algorithm be called once + * every two seconds and so on... + * + * \note Returning 0 means the algorithm should not be + * clock activated. + * + * \sa processClock + */ + virtual uint64_t getClockFrequency(Kernel::IBoxAlgorithmContext& ctx) { return 0; } + + //@} + /** \name Initialization / Uninitialization */ + //@{ + + /** + * \brief Prepares plugin object + * \param ctx [in] : the plugin object context + * \return \e true when this object successfully initialized + * or \e false if it didn't succeed to initialize. + * \note Default implementation simply returns \e true. + * + * After a successful initialization, the caller knows + * the object can safely be used... On failure, this object + * should be ready to be uninitialized and then released. + * + * \sa uninitialize + */ + virtual bool initialize(Kernel::IBoxAlgorithmContext& ctx) { return true; } + /** + * \brief Unprepares the object so it can be deleted + * \param ctx [in] : the plugin object context + * \return \e true when this object sucessfully uninitialized or \e false if didn't succeed to uninitialize. + * \exception this method must be noexcept + * \note Default implementation simply returns \e true. + * + * If this function returns \e false, it means it could not + * uninitialize the object members correctly. Thus, the + * object won't be released and none of its method will + * be called anymore for security. Note that this results + * in memory leaks. This is why this method should return + * \e true as often as possible. + * + * \sa initialize + */ + virtual bool uninitialize(Kernel::IBoxAlgorithmContext& ctx) { return true; } + + //@} + /** \name Several event processing callbacks */ + //@{ + + /** + * \brief Reaction to a clock tick + * \param ctx [in] : the box algorithm context to use + * \param msg [in] : the clock message the box received + * \return \e true when the message is processed. + * \return \e false when the message is not processed. + * \note Default implementation returns \e false + * + * This function is called by the OpenViBE kernel when + * it has sent clock messages. Clock messages are used for + * processes that should be executed regularly and which + * can not be triggered thanks to their inputs (for example + * acquisition modules). They also can be used for example + * when viewing inputs on smaller range than what input + * sends periodically, thus needing a moving + * 'viewed-window' on lastly received data. + * + * \sa Kernel::IBoxAlgorithmContext + * \sa getClockFrequency + */ + virtual bool processClock(Kernel::IBoxAlgorithmContext& ctx, Kernel::CMessageClock& msg) { return false; } + /** + * \brief Reaction to an input update + * \param ctx [in] : the box algorithm context to use + * \param index [in] : the index of the input which has ben updated + * \return \e true when the message is processed. + * \return \e false when the message is not processed. + * \note Default implementation returns \e false + * + * This function is called by the OpenViBE kernel each + * time an input of this box is updated. This allows the + * algorithm to decide to call the process function and + * eventually to the received data. + * + * \sa Kernel::IBoxAlgorithmContext + */ + virtual bool processInput(Kernel::IBoxAlgorithmContext& ctx, const size_t index) { return false; } + + //@} + /** \name Algorithm processing */ + //@{ + + /** + * \brief Processing function + * \param ctx [in] : the box algorithm context to use + * \return \e true on success, \e false when something went wrong. + * + * This function is used to process the arrived data and + * eventually generate results. See OpenViBE global + * architecture to understand how the commponents interact + * and how an OpenViBE box works internally. + * + * The processing function may use the provided context + * in order to read its inputs and write its outputs... + * Also it could use the provided context to send + * messages/events to other boxes. Finally, it may use + * the provided context in order to perform rendering + * tasks ! + * + * \sa Kernel::IBoxAlgorithmContext + */ + virtual bool process(Kernel::IBoxAlgorithmContext& ctx) = 0; + + //@} + + _IsDerivedFromClass_(IPluginObject, OV_ClassId_Plugins_BoxAlgorithm) +}; + +class OV_API IBoxListener : public IPluginObject +{ +public: + ~IBoxListener() override { } + void release() override { } + + virtual bool initialize(Kernel::IBoxListenerContext& /*boxListenerCtx*/) { return true; } + virtual bool uninitialize(Kernel::IBoxListenerContext& /*boxListenerCtx*/) { return true; } + + /** \name Box modifications callbacks */ + //@{ + + /** + * \brief This callback is called when the box is modified in some way + * \return \e true in case of success. + * \return \e false in case of error. + * \param boxListenerCtx [in] : the box listener context + * containing the description of the box + * \param boxModificationType [in] : the type of modification + * applied to the box + * + * This function is called as soon as a modification is done + * on the box which this listener is attached to. The box listener + * is then allowed to examine and check box status validity + * and to adpat the box itself according to this validity. + * + * \sa IBoxProto + * \sa IBoxListenerContext + * \sa EBoxModification + */ + virtual bool process(Kernel::IBoxListenerContext& boxListenerCtx, const Kernel::EBoxModification boxModificationType) = 0; + + //@} + + _IsDerivedFromClass_(IPluginObject, OV_ClassId_Plugins_BoxListener) +}; +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIBoxAlgorithmDesc.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIBoxAlgorithmDesc.h new file mode 100644 index 0000000..4f49fab --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIBoxAlgorithmDesc.h @@ -0,0 +1,101 @@ +#pragma once + +#include "ovIPluginObjectDesc.h" + +namespace OpenViBE { +namespace Kernel { +class IBoxProto; +class IBoxAlgorithmContext; +} //namespace Kernel + +namespace Plugins { +class IBoxListener; + +/** + * \class IBoxAlgorithmDesc + * \author Yann Renard (INRIA/IRISA) + * \date 2006-06-19 + * \brief Box algorithm plugin descriptor + * \ingroup Group_Extend + * + * This class should be derived by any plugin developer in + * order to describe a specific OpenViBE box algorithm. + * + * \sa IBoxAlgorithm + * + * \todo details about building new plugins + */ +class OV_API IBoxAlgorithmDesc : public IPluginObjectDesc +{ +public: + + /** \name Box prototype and description */ + //@{ + + /** + * \brief Gets the box prototype for this algorithm + * \param prototype [out] : the box prototype to fill + * \return \e true in case of success \e false in other cases. + * + * When this function is called by the OpenViBE + * platform, the plugin descriptor should fill in + * the structure to let the OpenViBE platform know + * what the corresponding box should look like + * (inputs/outputs/settings). + * + * \sa IBoxProto + */ + virtual bool getBoxPrototype(Kernel::IBoxProto& prototype) const = 0; + /** + * \brief Gets the stock item to display with this algorithm + * \return The stock item to display with this algorithm. + * + * This item name will be used by the GUI to display + * a symbol to the algorithm list so a user can quickly + * find them in the list. + * + * Default implementation returns empty string. If + * the item can not be found by name, or an empty string + * is returned, a default item will be displayed. + * + * \deprecated This method was used when visualisation was handled + * within the Kernel. This is kept for backward compatibility. Such features + * should now be handled at application level. + * + */ + virtual CString getStockItemName() const { return CString(""); } + + //@{ + /** \name Box modification monitoring */ + //@{ + + /** + * \brief Creates a new box listener + * \return a new box listener + * + * This function is called by the kernel when a box instance + * is created if any modification flag is set in its prototype. + * This box listener will be notified each time the box is modified. + * + * \sa Kernel::IBoxProto + * \sa IBoxListener + */ + virtual IBoxListener* createBoxListener() const { return nullptr; } + /** + * \brief Releases an existing box listener + * \param listener [in] : the box listener to release + * + * This function is called by the kernel as soon as it knows + * a box listener won't be used any more. In case this descriptor + * allocated some memory for this box listener, this memory + * can be freed safely, no more call will be done on this + * box listener. + */ + virtual void releaseBoxListener(IBoxListener* listener) const { } + + //@} + + _IsDerivedFromClass_(IPluginObjectDesc, OV_ClassId_Plugins_BoxAlgorithmDesc) +}; +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIPluginObject.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIPluginObject.h new file mode 100644 index 0000000..be29ae1 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIPluginObject.h @@ -0,0 +1,53 @@ +#pragma once + +#include "../ovIObject.h" + +namespace OpenViBE { +namespace Plugins { +/** + * \class IPluginObject + * \author Yann Renard (INRIA/IRISA) + * \date 2006-06-19 + * \brief Base class for plugin object + * \ingroup Group_Extend + * + * This class is the base class for all the concrete plugin + * classes that extend the OpenViBE platform. It comes with + * several basic functions each plugin should have in order + * to work in the OpenViBE platform. + * + * Each plugin class comes with a plugin descriptor class + * (which you can write deriving the IPluginObjectDesc + * interface). + * + * \sa IBoxAlgorithm + * \sa IScenarioImporter + * \sa IScenarioExporter + * \sa IPluginObjectDesc + * + * \todo details about building new plugins + */ +class OV_API IPluginObject : public IObject +{ +public: + + /** \name Memory management */ + //@{ + + /** + * \brief Informs the plugin object it won't be used anymore + * + * This is called by the OpenViBE platform to inform + * the plugin object it is not useful anymore. The plugin + * can chose whether to delete itself or to stay in + * memory until it decides is is ok to be deleted. + * However, the OpenViBE platform will not call any + * of the plugin functions after release is called. + */ + virtual void release() = 0; + + //@} + _IsDerivedFromClass_(IObject, OV_ClassId_Plugins_PluginObject) +}; +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIPluginObjectDesc.h b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIPluginObjectDesc.h new file mode 100644 index 0000000..4536da8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/include/openvibe/plugins/ovIPluginObjectDesc.h @@ -0,0 +1,163 @@ +#pragma once + +#include "../ovIObject.h" + +namespace OpenViBE { +namespace Plugins { +/// Functionality enumeration in order to know what a plugin is capable of +enum class EPluginFunctionality { Undefined, Processing, Visualization }; + +class IPluginObject; + +/** + * \class IPluginObjectDesc + * \author Yann Renard (INRIA/IRISA) + * \date 2006-06-19 + * \brief Base class for plugin descriptor + * \ingroup Group_Extend + * + * This class is the base class for all the plugin description classes. + * It contains basic functions that could be used for each plugin description. + * Derived plugin descriptions will be used as a prototype of what they can create. + * + * \sa IBoxAlgorithmDesc + * \sa IScenarioImporterDesc + * \sa IScenarioExporterDesc + * \sa IPluginObject + * + * \todo details about building new plugins + */ +class OV_API IPluginObjectDesc : public IObject +{ +public: + /** \name Memory management */ + //@{ + + /** + * \brief Informs the plugin description it won't be used any more + * + * This is called by the OpenViBE platform to inform the plugin description it is not useful anymore. + * The plugin can chose whether to delete itself or to stay in memory until it decides it is ok to be deleted. + * However, the OpenViBE platform will not call any of the plugin functions after release is called. + */ + virtual void release() = 0; + + //@} + /** \name Creation process */ + //@{ + + /** + * \brief Gives a tip on what this plugin descriptor is able to create + * + * This may inform the OpenViBE platform about what kind of plugin can be created using this plugin descriptor. + * It should return the concrete class identifier of the plugin object itself. + */ + virtual CIdentifier getCreatedClass() const = 0; + virtual CIdentifier getCreatedClassIdentifier() const { return this->getCreatedClass(); } + /** + * \brief Creates the plugin object itself + * \return the created object. + * + * This method creates the plugin object itself and returns it with the lowest level interface. + * The OpenVIBE platform then uses the IObject::isDerivedFromClass method to use the plugin correctly. + */ + virtual IPluginObject* create() = 0; + + //@} + /** \name Textual plugin object description and information */ + //@{ + + /** + * \brief Gets the plugin name + * \return The plugin name. + * + * Default implementation simply returns empty string. + */ + virtual CString getName() const { return CString("no name"); } + /** + * \brief Gets the author name for this plugin + * \return The author name for this plugin. + * + * Default implementation simply returns "no name". + */ + virtual CString getAuthorName() const { return CString("unknown"); } + /** + * \brief Gets the author company name for this plugin + * \return The author company name for this plugin. + * + * Default implementation simply returns "unknown". + */ + virtual CString getAuthorCompanyName() const { return CString("unknown"); } + /** + * \brief Gets a short description of the plugin + * \return A short description of the plugin. + * + * Default implementation simply returns "unknown". + */ + virtual CString getShortDescription() const { return CString(""); } + /** + * \brief Gets a detailed description of the plugin + * \return A detailed description of the plugin. + * + * Default implementation simply returns empty string. + * + * \note You can use std::endl to have the description on several lines when needed. + */ + virtual CString getDetailedDescription() const { return CString(""); } + /** + * \brief Gets a basic category of the plugin + * \return the category tokens of the plugin + * + * The tokens should be separated with '/' characters in order to create sub categories. + * + * Default implementation returns "unknown". + */ + virtual CString getCategory() const { return CString("unknown"); } + /** + * \brief Gets the version of the plugin + * \return the version of the plugin. + * + * Default implementation simply returns "unknown". + */ + virtual CString getVersion() const { return CString("unknown"); } + /** + * \brief Gets the component in which the plugin is defined + * + * OpenViBE SDK is used to build platforms that are composed of several components. + * Each component can come with its own set of plugins, and has its own version. + * The \ref getAddedSoftwareVersion and \ref getUpdatedSoftwareVersion will return versions of the component in which the plugin belongs. + * + * \return a string identifier of the component + * \retval "unknown" if not redefined + */ + virtual CString getSoftwareComponent() const { return CString("unknown"); } + /** + * \brief Gets the version of the software in the one the plugin was added + * \return the version of the software in the one the plugin was added. + * \retval "unknown" if not redefined + * + * \sa getSoftwareComponent + */ + virtual CString getAddedSoftwareVersion() const { return CString("unknown"); } + /** + * \brief Gets the version of the software in the one the plugin was last updated + * \return the version of the software in the one the plugin was last updated + * \retval "unknown" if not redefined + * + * \sa getSoftwareComponent + */ + virtual CString getUpdatedSoftwareVersion() const { return CString("unknown"); } + /** + * \brief Tests whether the plugin has a given functionality + * \param functionality [in] : functionality of interest + * \return \e true in case plugin has this functionality. + * \return \e false otherwise. + */ + virtual bool hasFunctionality(const EPluginFunctionality functionality) const { return false; } + + //@} + + _IsDerivedFromClass_(IObject, OV_ClassId_Plugins_PluginObjectDesc) +}; +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/src/CIdentifier.cpp b/Masterarbeit/openvibe/sdk-master/openvibe/src/CIdentifier.cpp new file mode 100644 index 0000000..e0f47d5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/src/CIdentifier.cpp @@ -0,0 +1,80 @@ +#include "CIdentifier.hpp" + +#include +#include +#include +#include + +namespace OpenViBE { + +//-------------------------------------------------------------------------------- +CIdentifier& CIdentifier::operator=(const CIdentifier& id) +{ + m_id = id.m_id; + return *this; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +CIdentifier& CIdentifier::operator++() +{ + if (m_id != std::numeric_limits::max()) + { + m_id++; + if (m_id == std::numeric_limits::max()) { m_id = 0; } + } + return *this; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +CIdentifier& CIdentifier::operator--() +{ + if (m_id != std::numeric_limits::max()) + { + m_id--; + if (m_id == std::numeric_limits::max()) { m_id = std::numeric_limits::max() - 1; } + } + return *this; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +std::string CIdentifier::str(const bool hexa) const +{ + const uint32_t id1 = uint32_t(m_id >> 32); + const uint32_t id2 = uint32_t(m_id); + if (hexa) + { + std::stringstream ss; + ss.fill('0'); + ss << "(0x" << std::setw(8) << std::hex << id1 << ", 0x" << std::setw(8) << std::hex << id2 << ")"; + return ss.str(); + } + return std::to_string(m_id); +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CIdentifier::fromString(const CString& str) +{ + const char* buffer = str.toASCIIString(); + uint32_t id1; + uint32_t id2; + if (sscanf(buffer, "(0x%x, 0x%x)", &id1, &id2) != 2) { return false; } + m_id = (uint64_t(id1) << 32) + id2; + return true; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +CIdentifier CIdentifier::random() +{ + std::random_device rd; + std::default_random_engine rng(rd()); + std::uniform_int_distribution uni(0, std::numeric_limits::max() - 1); // This exclude CIdentifier::undefined() value no const on unix system + return CIdentifier(uni(rng)); +} +//-------------------------------------------------------------------------------- + +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/src/CMatrix.cpp b/Masterarbeit/openvibe/sdk-master/openvibe/src/CMatrix.cpp new file mode 100644 index 0000000..c74926c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/src/CMatrix.cpp @@ -0,0 +1,414 @@ +#include "CMatrix.hpp" + +#include +#include +#include +#include +#include +#include + +namespace OpenViBE { + +//-------------------------------------------------------------------------------- +static std::string trim(const std::string& in, const bool space = true, const bool comment = true) +{ + if (in.empty()) { return ""; } + std::string res(in); + if (comment) + { + const std::string comments("#"); + const size_t start = res.find_first_of(comments); + if (start != std::string::npos) { res.erase(start); } // delete from start until the end + } + if (space) + { + const std::string spaces(" \t\f\v\n\r"); + const size_t start = res.find_first_not_of(spaces); + const size_t end = res.find_last_not_of(spaces); + if (start == std::string::npos) { return ""; } + //if (end == std::string::npos) { return ""; } // uselesss same as previous + res = res.substr(start, end + 1); // end + 1 to include the last non space caracter + } + return res; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +static bool getCleanLine(std::ifstream& file, std::string& line) +{ + if (std::getline(file, line)) + { + line = trim(line); + return true; + } + return false; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------- +//----------------- Getter/Setter ------------------ +//-------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CMatrix::setDimensionCount(const size_t count) const +{ + if (count == 0) { return false; } // If dimension number is 0, make nothing + clearBuffer(); // Reset Buffer pointer + m_dimSizes->resize(count); + m_dimLabels->resize(count); + return true; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CMatrix::setDimensionSize(const size_t dim, const size_t size) const +{ + if (dim >= m_dimSizes->size()) { return false; }// If out of dimension make nothing + clearBuffer(); // Reset Buffer pointer + m_dimSizes->at(dim) = size; + m_dimLabels->at(dim).resize(size); + return true; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CMatrix::setDimensionLabel(const size_t dim, const size_t idx, const std::string& label) const +{ + if (dim >= m_dimLabels->size() || idx >= m_dimLabels->at(dim).size()) { return false; } + m_dimLabels->at(dim)[idx] = label; + return true; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------- +//---------------------- Misc ---------------------- +//-------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CMatrix::isBufferValid(const bool checkNaN, const bool checkInf) const +{ + for (size_t i = 0; i < m_size; ++i) { if ((checkNaN && std::isnan(m_buffer[i])) || (checkInf && std::isinf(m_buffer[i]))) { return false; } } + return true; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CMatrix::isDescriptionEqual(const CMatrix& m, const bool checkLabels) const +{ + if (getDimensionCount() != m.getDimensionCount()) { return false; } + for (size_t i = 0; i < getDimensionCount(); ++i) { if (getDimensionSize(i) != m.getDimensionSize(i)) { return false; } } + + if (checkLabels) + { + for (size_t i = 0; i < getDimensionCount(); ++i) + { + for (size_t j = 0; j < getDimensionSize(i); ++j) + { + // I use directly vectors to avoid conversion in char* (conversion is here to keep previous compability) + if (m_dimLabels->at(i)[j] != m.m_dimLabels->at(i)[j]) { return false; } + } + } + } + return true; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CMatrix::isBufferEqual(const CMatrix& m) const +{ + if (getSize() != m.getSize()) { return false; } + return std::equal(m_buffer, m_buffer + m_size, m.getBuffer()); +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CMatrix::isBufferAlmostEqual(const CMatrix& m, const double epsilon) const +{ + if (getSize() != m.getSize()) { return false; } + const double *a = getBuffer(), *b = m.getBuffer(); + for (size_t i = 0; i < getSize(); ++i, ++a, ++b) { if (std::fabs(*a - *b) >= std::fabs(epsilon)) { return false; } } + return true; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +void CMatrix::resize(const std::vector& sizes) +{ + clean(); // Delete all pointer and initialize vector pointer + setDimensionCount(sizes.size()); + for (size_t i = 0; i < sizes.size(); ++i) { setDimensionSize(i, sizes[i]); } + resetBuffer(); // Initialise buffer with 0 always (if size don't change too) +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +void CMatrix::clean() +{ + clearBuffer(); + initVector(); +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +void CMatrix::copy(const CMatrix& m) +{ + if (this == &m) { return; } + copyDescription(m); + copyContent(m); +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +void CMatrix::copyDescription(const CMatrix& m) +{ + if (this == &m) { return; } + clear(); + m_dimSizes = new std::vector(*m.m_dimSizes); // Copy sizes + m_dimLabels = new std::vector>(*m.m_dimLabels); // Copy Labels + resetBuffer(); // Reset buffer +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +void CMatrix::copyContent(const CMatrix& m) const +{ + if (this == &m) { return; } + initBuffer(); + if (m_buffer && m.getSize() == getSize()) { std::copy_n(m.getBuffer(), getSize(), m_buffer); } +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +void CMatrix::resetBuffer() const +{ + if (!m_buffer) { initBuffer(); } + if (m_buffer) { std::fill_n(m_buffer, m_size, 0); } +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +void CMatrix::setNumLabels() const { for (auto& dim : *m_dimLabels) { for (size_t i = 0; i < dim.size(); ++i) { dim[i] = std::to_string(i + 1); } } } +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CMatrix::toTextFile(const std::string& filename) const +{ + std::ofstream file; + file.open(filename, std::ios_base::out | std::ios_base::trunc); + if (!file.is_open()) { return false; } + + //----- Save ----- + // Labels + // [ + // [ "label 1 dim 1" "label 2 dim 1" ..."label m dim 1" ] + // [ "label 1 dim 2" "label 2 dim 2" ..."label m dim 2" ] + // ... + // [ "label 1 dim n" "label 2 dim n" ..."label m dim n" ] + // ] + file << "[" << std::endl; + file << labelsToString("\t", "[ ", " ", "]"); + file << "]" << std::endl; + + // Matrix + // 2D size (m,n) + // [ + // [ (0,0) (0,1) ... (0,n) ] + // [ (1,0) (1,1) ... (1,n) ] + // ... + // [ (m,0) (m,1) ... (m,n) ] + // ] + // 1D + // [ + // [ (0) (1) ... (n) ] + // ] + file << "[" << std::endl; + file << bufferToString("\t", "[ ", " ", "]"); + file << "]" << std::endl; + + file.close(); + return true; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CMatrix::fromTextFile(const std::string& filename) +{ + //---------- Setup ---------- + std::ifstream file; + file.open(filename); + + if (!file.is_open()) { return false; } + + // clean object + clean(); + + //---------- Labels ---------- + bool done = false; + std::string line; + while (!done && getCleanLine(file, line)) + { + if (line.empty() || line == "[") { continue; } + if (line == "]") { done = true; } + else + { + std::vector labels; + size_t n1 = line.find('\"'); + while (n1 != std::string::npos) + { + line = line.substr(n1 + 1); // We remove all until the " + const size_t n2 = line.find('\"'); // Find the end of the label + if (n2 == std::string::npos) { return false; } // We found a " but not the second + labels.push_back(line.substr(0, n2)); // We add the label to the list + n1 = line.find('\"', n2 + 1); // We search after the " of the label. + } + if (labels.empty()) { return false; } + m_dimLabels->push_back(labels); // We add a dimension with the labels + } + } + + // resize matrix (don't use resize functions to avoid delete actual labels + m_dimSizes->resize(m_dimLabels->size()); + for (size_t i = 0; i < m_dimSizes->size(); ++i) { m_dimSizes->at(i) = m_dimLabels->at(i).size(); } + initBuffer(); // allocate buffer + + //---------- Matrix ---------- + line = ""; + while (line.empty()) { getCleanLine(file, line); } // remove comment and space before and after. + if (line != "[") { return false; } // If next line isn't a mtrix opening + + std::stringstream ss; // cumulate matrix to a stringstream + while (getCleanLine(file, line) && line != "]") { if (!line.empty()) { ss << line << std::endl; } } + return bufferFromString(ss.str(), "\t", "[ ", " ", "]"); // use stringstream to parse the matrix +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +bool CMatrix::bufferFromString(const std::string& in, const std::string& before, const std::string& start, const std::string& sep, const std::string& end) const +{ + if (in.empty()) { return false; } + initBuffer(); // allocate buffer (in case of) + const size_t startskip = trim(before + start).size(); // Size before first value for each line with remove space and comment + const size_t endskip = trim(sep + end).size(); // size after last value for each line with remove space and comment + size_t d = 0, idx = 0; // Current Dimension and Current index + size_t n1 = 0, n2 = in.find('\n'); // Line delimiter + + while (n2 != std::string::npos && n1 + startskip <= n2 - endskip) + { + const size_t i = idx; // keep actual idx + std::istringstream ss(in.substr(n1 + startskip, n2 - endskip)); // We remove the begining and ending of the line + double v; + while (ss >> v) + { + m_buffer[idx++] = v; // Add to buffer and increment idx + ss.ignore(sep.size()); // Ignore separator between value + } + if (getDimensionCount() == 1 && idx != getDimensionSize(0)) { return false; } + if (getDimensionCount() == 2 && idx - i != getDimensionSize(1)) { return false; } + d++; // increment dimension + n1 = n2 + 1; // Beginning of new line + n2 = in.find('\n', n1); // Ending of new line (we have allways a \n at the end) + } + // We check if we have completly fill the buffer + return idx == m_size; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +std::string CMatrix::bufferToString(const std::string& before, const std::string& start, const std::string& sep, const std::string& end) const +{ + if (!m_buffer) { resetBuffer(); } + std::stringstream ss; + ss.precision(10); + if (getDimensionCount() == 2) + { + size_t i = 0; + for (size_t row = 0; row < getDimensionSize(0); ++row) + { + ss << before << start; + for (size_t col = 0; col < getDimensionSize(1); ++col) { ss << m_buffer[i++] << sep; } + ss << end << std::endl; + } + } + else + { + ss << before << start; + for (size_t i = 0; i < m_size; ++i) { ss << m_buffer[i] << sep; } + ss << end << std::endl; + } + return ss.str(); +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +std::string CMatrix::labelsToString(const std::string& before, const std::string& start, const std::string& sep, const std::string& end) const +{ + std::stringstream ss; + for (const auto& dimension : *m_dimLabels) + { + ss << before << start; + for (const auto& label : dimension) { ss << "\"" << label << "\"" << sep; } + ss << end << std::endl; + } + return ss.str(); +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +void CMatrix::initBuffer() const +{ + if (m_buffer || m_dimSizes->empty()) { return; } + + m_size = 1; + for (const auto& s : *m_dimSizes) { m_size *= s; } + + if (m_size != 0) { m_buffer = new double[m_size]; } + if (!m_buffer) { m_size = 0; } +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +void CMatrix::initVector() +{ + clearVector(); + m_dimSizes = new std::vector; + m_dimLabels = new std::vector>; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +void CMatrix::clearBuffer() const +{ + if (m_buffer) + { + delete[] m_buffer; + m_buffer = nullptr; + } + m_size = 0; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +void CMatrix::clearVector() +{ + if (m_dimSizes) + { + delete m_dimSizes; + m_dimSizes = nullptr; + } + if (m_dimLabels) + { + delete m_dimLabels; + m_dimLabels = nullptr; + } +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +void CMatrix::clear() +{ + clearBuffer(); + clearVector(); +} +//-------------------------------------------------------------------------------- + +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/src/CTime.cpp b/Masterarbeit/openvibe/sdk-master/openvibe/src/CTime.cpp new file mode 100644 index 0000000..9ceb74a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/src/CTime.cpp @@ -0,0 +1,54 @@ +#include "CTime.hpp" + +#include +#include + +namespace OpenViBE { + +//-------------------------------------------------------------------------------- +CTime& CTime::operator=(const CTime& time) +{ + m_time = time.m_time; + return *this; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +CTime& CTime::operator=(const uint64_t time) +{ + m_time = time; + return *this; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +CTime& CTime::operator+=(const CTime& time) +{ + m_time += time.m_time; + return *this; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +CTime& CTime::operator-=(const CTime& time) +{ + m_time -= time.m_time; + return *this; +} +//-------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------- +std::string CTime::str(const bool inSecond, const bool inHexa) const +{ + std::stringstream res; + // Precision for 3 after dot and fixed to force 0 display to have always 3 after precision + if (inSecond) { res << std::setprecision(3) << std::fixed << toSeconds() << " sec"; } + else { res << m_time; } + + // Force to have 16 number and 0 for empty number (space character by default) + if (inHexa) { res << " (0x" << std::setfill('0') << std::setw(16) << std::hex << m_time << ")"; } + return res.str(); +} +//-------------------------------------------------------------------------------- + +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCKernelLoader.cpp b/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCKernelLoader.cpp new file mode 100755 index 0000000..cdd7c90 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCKernelLoader.cpp @@ -0,0 +1,243 @@ +#include "ovCKernelLoader.h" + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS +#include +#elif defined TARGET_OS_Windows +#include +#else +#endif + +#include +#include + +namespace OpenViBE { +class CKernelLoaderBase : public IKernelLoader +{ +public: + + CKernelLoaderBase() { } + bool initialize() override; + bool getKernelDesc(Kernel::IKernelDesc*& desc) override; + bool uninitialize() override; + virtual void release(); + + _IsDerivedFromClass_Final_(IKernelLoader, CIdentifier::undefined()) + + virtual bool isOpen() = 0; + +protected: + + CString m_filename; + bool (*m_onInitializeCB)() = nullptr; + bool (*m_onUninitializeCB)() = nullptr; + bool (*m_onGetKernelDescCB)(Kernel::IKernelDesc*&) = nullptr; +}; + +//___________________________________________________________________// +// // + +bool CKernelLoaderBase::initialize() +{ + if (!isOpen()) { return false; } + if (!m_onInitializeCB) { return true; } + return m_onInitializeCB(); +} + +bool CKernelLoaderBase::getKernelDesc(Kernel::IKernelDesc*& desc) +{ + if (!isOpen() || !m_onGetKernelDescCB) { return false; } + return m_onGetKernelDescCB(desc); +} + +bool CKernelLoaderBase::uninitialize() +{ + if (!isOpen()) { return false; } + if (!m_onUninitializeCB) { return true; } + return m_onUninitializeCB(); +} + +void CKernelLoaderBase::release() { delete this; } + +//___________________________________________________________________// +// // + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + class CKernelLoaderLinux : public CKernelLoaderBase + { + public: + + CKernelLoaderLinux() : m_fileHandle(NULL) { } + + bool load(const CString& filename, CString* error) override; + bool unload(CString* error) override; + + protected: + + bool isOpen() override{ return m_fileHandle != nullptr; } + + void* m_fileHandle; + }; + +#elif defined TARGET_OS_Windows +class CKernelLoaderWindows final : public CKernelLoaderBase +{ +public: + CKernelLoaderWindows() : m_fileHandle(nullptr) { } + bool load(const CString& filename, CString* error) override; + bool unload(CString* error) override; + +protected: + bool isOpen() override { return m_fileHandle != nullptr; } + + HMODULE m_fileHandle; +}; + +#else + +#endif + +//___________________________________________________________________// +// // + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + +bool CKernelLoaderLinux::load(const CString& filename, CString* error) +{ + if(m_fileHandle) + { + if(error) *error="kernel already loaded"; + return false; + } + + // m_fileHandle=dlopen(filename, RTLD_NOW|RTLD_LOCAL); + m_fileHandle=dlopen(filename, RTLD_LAZY|RTLD_GLOBAL); + if(!m_fileHandle) + { + if(error) *error=dlerror(); + return false; + } + + m_onInitializeCB=(bool (*)())dlsym(m_fileHandle, "onInitialize"); + m_onUninitializeCB=(bool (*)())dlsym(m_fileHandle, "onUninitialize"); + m_onGetKernelDescCB=(bool (*)(Kernel::IKernelDesc*&))dlsym(m_fileHandle, "onGetKernelDesc"); + if(!m_onGetKernelDescCB) + { + if(error) *error=dlerror(); + + dlclose(m_fileHandle); + m_fileHandle=NULL; + m_onInitializeCB=NULL; + m_onGetKernelDescCB=NULL; + m_onUninitializeCB=NULL; + return false; + } + return true; +} + +bool CKernelLoaderLinux::unload(CString* error) +{ + if(!m_fileHandle) + { + if(error) *error="no kernel currently loaded"; + return false; + } + dlclose(m_fileHandle); + m_fileHandle=NULL; + m_onInitializeCB=NULL; + m_onGetKernelDescCB=NULL; + m_onUninitializeCB=NULL; + return true; +} + +#elif defined TARGET_OS_Windows + +bool CKernelLoaderWindows::load(const CString& filename, CString* error) +{ + if (m_fileHandle) + { + if (error) { *error = "kernel already loaded"; } + return false; + } + + m_fileHandle = LoadLibrary(filename); + if (!m_fileHandle) + { + if (error) + { + LPVOID buffer = nullptr; + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, GetLastError(), + 0, // Default language + LPTSTR(&buffer), 0, nullptr); + *error = (char*)buffer; + LocalFree(buffer); + } + return false; + } + + m_onInitializeCB = (bool (*)())GetProcAddress(m_fileHandle, "onInitialize"); + m_onUninitializeCB = (bool (*)())GetProcAddress(m_fileHandle, "onUninitialize"); + m_onGetKernelDescCB = (bool (*)(Kernel::IKernelDesc*&))GetProcAddress(m_fileHandle, "onGetKernelDesc"); + if (!m_onGetKernelDescCB) + { + if (error) + { + LPVOID buffer = nullptr; + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, GetLastError(), + 0, // Default language + LPTSTR(&buffer), 0, nullptr); + *error = (char*)buffer; + LocalFree(buffer); + } + + FreeLibrary(m_fileHandle); + m_fileHandle = nullptr; + m_onInitializeCB = nullptr; + m_onGetKernelDescCB = nullptr; + m_onUninitializeCB = nullptr; + return false; + } + return true; +} + +bool CKernelLoaderWindows::unload(CString* error) +{ + if (!m_fileHandle) + { + if (error) { *error = "no kernel currently loaded"; } + return false; + } + FreeLibrary(m_fileHandle); + m_fileHandle = nullptr; + m_onInitializeCB = nullptr; + m_onGetKernelDescCB = nullptr; + m_onUninitializeCB = nullptr; + + return true; +} + +#else + +#endif + +//___________________________________________________________________// +// // + +CKernelLoader::CKernelLoader() +{ +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + m_impl = new CKernelLoaderLinux(); +#elif defined TARGET_OS_Windows + m_impl = new CKernelLoaderWindows(); +#else +#endif +} + +CKernelLoader::~CKernelLoader() { delete m_impl; } + +bool CKernelLoader::load(const CString& filename, CString* error) { return m_impl ? m_impl->load(filename, error) : false; } +bool CKernelLoader::unload(CString* error) { return m_impl ? m_impl->unload(error) : false; } +bool CKernelLoader::initialize() { return m_impl ? m_impl->initialize() : false; } +bool CKernelLoader::getKernelDesc(Kernel::IKernelDesc*& desc) { return m_impl ? m_impl->getKernelDesc(desc) : false; } +bool CKernelLoader::uninitialize() { return m_impl ? m_impl->uninitialize() : false; } + +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCMemoryBuffer.cpp b/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCMemoryBuffer.cpp new file mode 100644 index 0000000..2818293 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCMemoryBuffer.cpp @@ -0,0 +1,148 @@ +#include "ovCMemoryBuffer.h" + +#include // memcpy + +namespace OpenViBE { +namespace { +class CMemoryBufferImpl final : public IMemoryBuffer +{ +public: + + CMemoryBufferImpl() {} + explicit CMemoryBufferImpl(const IMemoryBuffer& buffer); + CMemoryBufferImpl(const uint8_t* buffer, size_t size); + ~CMemoryBufferImpl() override; + bool reserve(const size_t size) override; + bool setSize(const size_t size, const bool discard) override; + size_t getSize() const override { return m_size; } + uint8_t* getDirectPointer() override { return m_buffer; } + const uint8_t* getDirectPointer() const override { return m_buffer; } + bool append(const uint8_t* buffer, const size_t size) override; + bool append(const IMemoryBuffer& buffer) override; + + _IsDerivedFromClass_Final_(IMemoryBuffer, OV_ClassId_MemoryBufferImpl) + +protected: + + uint8_t* m_buffer = nullptr; + size_t m_size = 0; + size_t m_allocatedSize = 0; +}; +} // namespace + +// ________________________________________________________________________________________________________________ +// + +CMemoryBufferImpl::CMemoryBufferImpl(const IMemoryBuffer& buffer) +{ + m_buffer = new uint8_t[size_t(buffer.getSize() + 1)]; // $$$ + if (m_buffer) + { + m_size = buffer.getSize(); + m_allocatedSize = buffer.getSize(); + if (buffer.getDirectPointer()) + { + memcpy(m_buffer, buffer.getDirectPointer(), size_t(m_size)); // $$$ + } + m_buffer[m_allocatedSize] = 0; + } +} + +CMemoryBufferImpl::CMemoryBufferImpl(const uint8_t* buffer, const size_t size) +{ + m_buffer = new uint8_t[size_t(size + 1)]; // $$$ + if (m_buffer) + { + m_size = size; + m_allocatedSize = size; + if (buffer) + { + memcpy(m_buffer, buffer, size_t(m_size)); // $$$ + } + m_buffer[m_allocatedSize] = 0; + } +} + +CMemoryBufferImpl::~CMemoryBufferImpl() +{ + if (m_buffer) + { + delete [] m_buffer; + m_buffer = nullptr; + } +} + +bool CMemoryBufferImpl::reserve(const size_t size) +{ + if (size > m_allocatedSize) + { + uint8_t* buffer = m_buffer; + m_buffer = new uint8_t[size_t(size + 1)]; // $$$ + if (!m_buffer) { return false; } + memcpy(m_buffer, buffer, size_t(m_size)); // $$$ + + delete [] buffer; + m_allocatedSize = size; + m_buffer[m_allocatedSize] = 0; + } + return true; +} + +bool CMemoryBufferImpl::setSize(const size_t size, const bool discard) +{ + if (size > m_allocatedSize) + { + uint8_t* buffer = m_buffer; + m_buffer = new uint8_t[size_t(size + 1)]; // $$$ + if (!m_buffer) { return false; } + if (!discard) { memcpy(m_buffer, buffer, size_t(m_size)); } // $$$ + delete [] buffer; + m_allocatedSize = size; + m_buffer[m_allocatedSize] = 0; + } + m_size = size; + return true; +} + +bool CMemoryBufferImpl::append(const uint8_t* buffer, const size_t size) +{ + if (size != 0) + { + const size_t bufferSizeBackup = m_size; + if (!this->setSize(m_size + size, false)) { return false; } + memcpy(m_buffer + bufferSizeBackup, buffer, size_t(size)); + } + return true; +} + +bool CMemoryBufferImpl::append(const IMemoryBuffer& buffer) +{ + if (buffer.getSize() != 0) + { + const size_t size = m_size; + if (!this->setSize(m_size + buffer.getSize(), false)) { return false; } + memcpy(m_buffer + size, buffer.getDirectPointer(), size_t(buffer.getSize())); + } + return true; +} + +// ________________________________________________________________________________________________________________ +// + +CMemoryBuffer::CMemoryBuffer() { m_impl = new CMemoryBufferImpl(); } +CMemoryBuffer::CMemoryBuffer(const IMemoryBuffer& buffer) { m_impl = new CMemoryBufferImpl(buffer); } +CMemoryBuffer::CMemoryBuffer(const uint8_t* buffer, const size_t size) { m_impl = new CMemoryBufferImpl(buffer, size); } +CMemoryBuffer::~CMemoryBuffer() { delete m_impl; } + +bool CMemoryBuffer::reserve(const size_t size) { return m_impl->reserve(size); } + +bool CMemoryBuffer::setSize(const size_t size, const bool discard) { return m_impl->setSize(size, discard); } +size_t CMemoryBuffer::getSize() const { return m_impl->getSize(); } + +uint8_t* CMemoryBuffer::getDirectPointer() { return m_impl->getDirectPointer(); } +const uint8_t* CMemoryBuffer::getDirectPointer() const { return m_impl->getDirectPointer(); } + +bool CMemoryBuffer::append(const uint8_t* buffer, const size_t size) { return m_impl->append(buffer, size); } +bool CMemoryBuffer::append(const IMemoryBuffer& buffer) { return m_impl->append(buffer); } + +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCNameValuePairList.cpp b/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCNameValuePairList.cpp new file mode 100644 index 0000000..c537e56 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCNameValuePairList.cpp @@ -0,0 +1,104 @@ +#include "ovCString.h" +#include "ovCNameValuePairList.h" + +#include +#include +#include + +namespace OpenViBE { + +struct CNameValuePairListImpl +{ + std::map m_Map; +}; + +CNameValuePairList::CNameValuePairList() { m_impl = new CNameValuePairListImpl(); } + +CNameValuePairList::CNameValuePairList(const CNameValuePairList& pairs) +{ + m_impl = new CNameValuePairListImpl(); + m_impl->m_Map = pairs.m_impl->m_Map; +} + +CNameValuePairList::~CNameValuePairList() { delete m_impl; } + +CNameValuePairList& CNameValuePairList::operator=(const CNameValuePairList& pairs) +{ + m_impl->m_Map = pairs.m_impl->m_Map; + return *this; +} + +bool CNameValuePairList::setValue(const CString& name, const CString& value) const +{ + m_impl->m_Map[name] = value; + return true; +} + +bool CNameValuePairList::setValue(const CString& name, const char* value) const +{ + if (value == nullptr) { return false; } + m_impl->m_Map[name] = value; + return true; +} + +bool CNameValuePairList::setValue(const CString& name, const double& value) const +{ + m_impl->m_Map[name] = std::to_string(value).c_str(); + return true; +} + +bool CNameValuePairList::setValue(const CString& name, const bool value) const +{ + m_impl->m_Map[name] = value ? "1" : "0"; + return true; +} + +bool CNameValuePairList::getValue(const CString& name, CString& value) const +{ + if (m_impl->m_Map.find(name) == m_impl->m_Map.end()) { return false; } + value = m_impl->m_Map[name]; + return true; +} + +bool CNameValuePairList::getValue(const CString& name, double& value) const +{ + if (m_impl->m_Map.find(name) == m_impl->m_Map.end()) { return false; } + double temp; + + try { temp = std::stod(m_impl->m_Map[name].toASCIIString()); } + catch (const std::exception&) { return false; } + + value = temp; + return true; +} + +bool CNameValuePairList::getValue(const CString& name, bool& value) const +{ + if (m_impl->m_Map.find(name) == m_impl->m_Map.end()) { return false; } + const CString str = m_impl->m_Map[name]; + if (str == CString("0") || str == CString("FALSE") || str == CString("false")) + { + value = false; + return true; + } + if (str == CString("1") || str == CString("TRUE") || str == CString("true")) + { + value = true; + return true; + } + return false; +} + +bool CNameValuePairList::getValue(const size_t index, CString& name, CString& value) const +{ + if (index >= this->getSize()) { return false; } + auto it = m_impl->m_Map.begin(); + std::advance(it, index); + name = it->first; + value = it->second; + return true; +} + +size_t CNameValuePairList::getSize() const { return m_impl->m_Map.size(); } + +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCObservable.cpp b/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCObservable.cpp new file mode 100644 index 0000000..95b6b92 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCObservable.cpp @@ -0,0 +1,42 @@ +#include "ovIObserver.h" +#include "ovCObservable.h" + +#include "ov_defines.h" +#include +#include + +namespace OpenViBE { + +struct CObservable::SObserverList +{ + std::vector m_Vector; +}; + +CObservable::CObservable() { m_observers = new SObserverList(); } +CObservable::~CObservable() { delete m_observers; } + +void CObservable::addObserver(IObserver* o) { m_observers->m_Vector.push_back(o); } + +void CObservable::deleteObserver(IObserver* o) +{ + for (auto it = m_observers->m_Vector.begin(); it != m_observers->m_Vector.end(); ++it) + { + if ((*it) == o) + { + m_observers->m_Vector.erase(it); + //We only suppress the first occurence, no need to continue + return; + } + } +} + +void CObservable::notifyObservers(void* data) +{ + if (m_hasChanged) + { + for (auto it = m_observers->m_Vector.begin(); it != m_observers->m_Vector.end(); ++it) { static_cast(*it)->update(*this, data); } + m_hasChanged = false; + } +} + +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCStimulationSet.cpp b/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCStimulationSet.cpp new file mode 100755 index 0000000..5b16063 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCStimulationSet.cpp @@ -0,0 +1,98 @@ +#include "ovCStimulationSet.h" + +#include + +namespace OpenViBE { +namespace { +class CStimulation +{ +public: + + CStimulation() { } + + CStimulation(const uint64_t id, const uint64_t date, const uint64_t duration) + : m_Id(id), m_Date(date), m_Duration(duration) { } + + uint64_t m_Id = 0; + uint64_t m_Date = 0; + uint64_t m_Duration = 0; +}; + +class CStimulationSetImpl final : public IStimulationSet +{ +public: + void clear() override { m_stimulations.clear(); } + size_t getStimulationCount() const override { return m_stimulations.size(); } + uint64_t getStimulationIdentifier(const size_t index) const override { return m_stimulations[index].m_Id; } + uint64_t getStimulationDate(const size_t index) const override { return m_stimulations[index].m_Date; } + uint64_t getStimulationDuration(const size_t index) const override { return m_stimulations[index].m_Duration; } + bool setStimulationCount(const size_t n) override; + bool setStimulationIdentifier(const size_t index, const uint64_t id) override; + bool setStimulationDate(const size_t index, const uint64_t date) override; + bool setStimulationDuration(const size_t index, const uint64_t duration) override; + size_t appendStimulation(const uint64_t id, const uint64_t date, const uint64_t duration) override; + size_t insertStimulation(const size_t index, const uint64_t id, const uint64_t date, const uint64_t duration) override; + bool removeStimulation(const size_t index) override; + + _IsDerivedFromClass_Final_(IStimulationSet, OV_ClassId_StimulationSetImpl) + +private: + + std::vector m_stimulations; +}; +} // namespace + +// ________________________________________________________________________________________________________________ +// + +bool CStimulationSetImpl::setStimulationCount(const size_t n) +{ + m_stimulations.resize(size_t(n)); + return true; +} + +bool CStimulationSetImpl::setStimulationIdentifier(const size_t index, const uint64_t id) +{ + m_stimulations[size_t(index)].m_Id = id; + return true; +} + +bool CStimulationSetImpl::setStimulationDate(const size_t index, const uint64_t date) +{ + m_stimulations[size_t(index)].m_Date = date; + return true; +} + +bool CStimulationSetImpl::setStimulationDuration(const size_t index, const uint64_t duration) +{ + m_stimulations[size_t(index)].m_Duration = duration; + return true; +} + +size_t CStimulationSetImpl::appendStimulation(const uint64_t id, const uint64_t date, const uint64_t duration) +{ + m_stimulations.push_back(CStimulation(id, date, duration)); + return m_stimulations.size() - 1; +} + +size_t CStimulationSetImpl::insertStimulation(const size_t index, const uint64_t id, const uint64_t date, const uint64_t duration) +{ + if (index > m_stimulations.size()) { return false; } + if (index == m_stimulations.size()) { m_stimulations.push_back(CStimulation(id, date, duration)); } + else { m_stimulations.insert(m_stimulations.begin() + size_t(index), CStimulation(id, date, duration)); } + return true; +} + +bool CStimulationSetImpl::removeStimulation(const size_t index) +{ + if (index >= m_stimulations.size()) { return false; } + m_stimulations.erase(m_stimulations.begin() + size_t(index)); + return true; +} + +// ________________________________________________________________________________________________________________ +// + +CStimulationSet::CStimulationSet() { m_stimSet = new CStimulationSetImpl(); } + +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCString.cpp b/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCString.cpp new file mode 100755 index 0000000..de4365d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/src/ovCString.cpp @@ -0,0 +1,71 @@ +#include "ovCString.h" + +#include + +namespace OpenViBE { + +struct SStringImpl +{ + std::string m_Value; +}; + +CString::CString() { m_impl = new SStringImpl(); } + +CString::CString(const CString& str) +{ + m_impl = new SStringImpl(); + m_impl->m_Value = str.m_impl->m_Value; +} + +CString::CString(const char* str) +{ + m_impl = new SStringImpl(); + if (str) { m_impl->m_Value = str; } +} + +CString::~CString() { delete m_impl; } +CString::operator const char*() const { return m_impl->m_Value.c_str(); } + +CString& CString::operator=(const CString& str) +{ + m_impl->m_Value = str.m_impl->m_Value; + return *this; +} + +CString& CString::operator+=(const CString& str) +{ + m_impl->m_Value += str.m_impl->m_Value; + return *this; +} + +char& CString::operator[](const size_t idx) const { return m_impl->m_Value[idx]; } + +CString operator+(const CString& str1, const CString& str2) +{ + std::string res; + res = str1.m_impl->m_Value + str2.m_impl->m_Value; + return res.c_str(); +} + +bool operator==(const CString& str1, const CString& str2) { return (str1.m_impl->m_Value) == (str2.m_impl->m_Value); } +bool operator!=(const CString& str1, const CString& str2) { return (str1.m_impl->m_Value) != (str2.m_impl->m_Value); } +bool operator<(const CString& str1, const CString& str2) { return (str1.m_impl->m_Value) < (str2.m_impl->m_Value); } + +bool CString::set(const CString& str) const +{ + m_impl->m_Value = str.m_impl->m_Value; + return true; +} + +bool CString::set(const char* str) const +{ + if (str) { m_impl->m_Value = str; } + else { m_impl->m_Value = ""; } + return true; +} + +const char* CString::toASCIIString() const { return m_impl->m_Value.c_str(); } + +size_t CString::length() const { return m_impl->m_Value.length(); } + +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/openvibe/src/ov_main.cpp b/Masterarbeit/openvibe/sdk-master/openvibe/src/ov_main.cpp new file mode 100644 index 0000000..826fb53 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/openvibe/src/ov_main.cpp @@ -0,0 +1 @@ +#include "ov_all.h" diff --git a/Masterarbeit/openvibe/sdk-master/plugins/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/plugins/CMakeLists.txt new file mode 100644 index 0000000..63294b2 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/CMakeLists.txt @@ -0,0 +1 @@ +OV_ADD_PROJECTS("PLUGINS") diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/plugins/processing/CMakeLists.txt new file mode 100644 index 0000000..fbefac3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/CMakeLists.txt @@ -0,0 +1,2 @@ +# Add all the subdirs as projects of the named branch +OV_ADD_PROJECTS("PLUGINS_PROCESSING") diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/CMakeLists.txt new file mode 100644 index 0000000..f20ee40 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/CMakeLists.txt @@ -0,0 +1,40 @@ +PROJECT(openvibe-plugins-sdk-classification) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl) +INCLUDE("FindSourceRCProperties") +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindOpenViBEModuleXML") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindThirdPartyEigen") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture, compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials) diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/box-tutorials/classification-0-training.xml b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/box-tutorials/classification-0-training.xml new file mode 100644 index 0000000..45289fb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/box-tutorials/classification-0-training.xml @@ -0,0 +1,1898 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x000001b3, 0x00001dd9) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004b1b63) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000019ca, 0x00002a82) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004df769) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003577, 0x00001a8d) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 20 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Train + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 224 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x003b34f4) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004173, 0x000028f8) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + (x+1)*10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x009ba89e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000049ab, 0x00001b71) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 0.95;0;0;0; 0;1;0;0; 0;0;0.95;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0058ecc3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005062, 0x000009d6) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Path_UserData}/classification-training-tutorial-model.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 480 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0177ec55) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000054b6, 0x00003d05) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004eb2dc) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005607, 0x00006ea5) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0059275b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005aec, 0x00002f62) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0; 0;0.95;0;0; 0;0;0.95;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0053c12c) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005af8, 0x000040b0) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + (0x5ba36127, 0x195feae1) + Input 3 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000e6f86) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005af8, 0x000040b1) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + (0x5ba36127, 0x195feae1) + Input 3 + + + (0x5ba36127, 0x195feae1) + Input 4 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000e6f86) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005cfa, 0x0000014c) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0044155d) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005e9c, 0x00002191) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0041a891) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000657c, 0x000068d9) + Signal display + (0x0055be5f, 0x087bdd12) + + + (0x5ba36127, 0x195feae1) + Data + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x6ab26b81, 0x0f8c02f3) + Channel Units + + + + + (0x5de046a6, 0x086340aa) + Display Mode + Scan + Scan + false + + + (0x33a30739, 0x00d5299b) + Auto vertical scale + Per channel + Global + false + + + (0x512a166f, 0x5c3ef83f) + Scale refresh interval (secs) + 5 + 5 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Scale + 100 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Vertical Offset + 0 + 0 + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Bottom ruler + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Left ruler + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Multiview + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 624 + + + (0x4e7b798a, 0x183beafb) + (0x92c056a7, 0x2dc71aff) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00007ed4, 0x000021e0) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0049066c) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007f24, 0x00000510) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 0.95;0;0;0; 0;0.95;0;0; 0;0;1;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x008d044f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x30dd9510, 0x56d43899) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + rand(1) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x30dd9510, 0x56d4389a) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + rand(1) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x30dd9510, 0x56d4389b) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + rand(1) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 416 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x30dd9510, 0x56d4389c) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + rand(1) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5f3d3b70, 0x223fa5b7) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 64 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + + + (0x000004ff, 0x000042bf) + + (0x00007ed4, 0x000021e0) + 0 + + + (0x00005af8, 0x000040b0) + 1 + + + + (0x00001143, 0x000051f2) + + (0x000019ca, 0x00002a82) + 0 + + + (0x00005e9c, 0x00002191) + 0 + + + + (0x00002239, 0x00002157) + + (0x00004173, 0x000028f8) + 0 + + + (0x00007f24, 0x00000510) + 0 + + + + (0x0000253c, 0x000007cd) + + (0x00005062, 0x000009d6) + 0 + + + (0x00005607, 0x00006ea5) + 0 + + + + (0x0000273b, 0x00000178) + + (0x000001b3, 0x00001dd9) + 0 + + + (0x00005062, 0x000009d6) + 3 + + + + (0x000027ec, 0x0000135b) + + (0x000049ab, 0x00001b71) + 0 + + + (0x00007ed4, 0x000021e0) + 0 + + + + (0x00003694, 0x00005707) + + (0x00004173, 0x000028f8) + 0 + + + (0x00005aec, 0x00002f62) + 0 + + + + (0x00003c2d, 0x00002d75) + + (0x000054b6, 0x00003d05) + 0 + + + (0x000001b3, 0x00001dd9) + 0 + + + + (0x000042ca, 0x000075d8) + + (0x00004173, 0x000028f8) + 0 + + + (0x000049ab, 0x00001b71) + 0 + + + + (0x000046df, 0x00001885) + + (0x00003577, 0x00001a8d) + 0 + + + (0x00005062, 0x000009d6) + 0 + + + + (0x00004c87, 0x00007596) + + (0x00005af8, 0x000040b0) + 0 + + + (0x0000657c, 0x000068d9) + 0 + + + + (0x00005629, 0x00007bae) + + (0x000019ca, 0x00002a82) + 0 + + + (0x00005af8, 0x000040b0) + 0 + + + + (0x00005666, 0x00003b1b) + + (0x000054b6, 0x00003d05) + 0 + + + (0x00005af8, 0x000040b0) + 2 + + + + (0x00005c2d, 0x00006b3b) + + (0x00007f24, 0x00000510) + 0 + + + (0x000054b6, 0x00003d05) + 0 + + + + (0x000064ed, 0x000069e4) + + (0x00005e9c, 0x00002191) + 0 + + + (0x00005062, 0x000009d6) + 1 + + + + (0x000067a1, 0x0000014b) + + (0x00007ed4, 0x000021e0) + 0 + + + (0x00005cfa, 0x0000014c) + 0 + + + + (0x00006a54, 0x000050d8) + + (0x00005aec, 0x00002f62) + 0 + + + (0x000019ca, 0x00002a82) + 0 + + + + (0x00006c65, 0x00004be9) + + (0x00005cfa, 0x0000014c) + 0 + + + (0x00005062, 0x000009d6) + 2 + + + + (0x05c243f1, 0x21be2f85) + + (0x5f3d3b70, 0x223fa5b7) + 0 + + + (0x30dd9510, 0x56d4389c) + 0 + + + + (0x0c7c501f, 0x7244b23a) + + (0x5f3d3b70, 0x223fa5b7) + 0 + + + (0x30dd9510, 0x56d4389a) + 0 + + + + (0x0f1ec427, 0x6c89b897) + + (0x30dd9510, 0x56d43899) + 0 + + + (0x00005af8, 0x000040b1) + 0 + + + + (0x1c82652d, 0x2c73e35e) + + (0x30dd9510, 0x56d4389b) + 0 + + + (0x00005af8, 0x000040b1) + 2 + + + + (0x1f3847fc, 0x37d3b791) + + (0x30dd9510, 0x56d4389a) + 0 + + + (0x00005af8, 0x000040b1) + 1 + + + + (0x36d2d033, 0x73c7eb1b) + + (0x30dd9510, 0x56d4389c) + 0 + + + (0x00005af8, 0x000040b1) + 3 + + + + (0x570fd06b, 0x1d86d5f6) + + (0x5f3d3b70, 0x223fa5b7) + 0 + + + (0x30dd9510, 0x56d43899) + 0 + + + + (0x6a8657b0, 0x5340ffaa) + + (0x00005af8, 0x000040b1) + 0 + + + (0x00004173, 0x000028f8) + 0 + + + + (0x7f9f698a, 0x5fd08230) + + (0x5f3d3b70, 0x223fa5b7) + 0 + + + (0x30dd9510, 0x56d4389b) + 0 + + + + + + (0x0000019a, 0x000047dc) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 912 + + + (0x7234b86b, 0x2b8651a5) + -96 + + + + + (0x00000509, 0x00005a61) + <b>Signal Display</b> can be used to view the data. +Note that the data the classifier gets has 4 +dimensions, whereas for display purposes the +signals are catenated in a way that channels 0-3 are +the data for the first stream, 4-7 for the second one +and so on. + + + (0x473d9a43, 0x97fc0a97) + 896.000000 + + + (0x7234b86b, 0x2b8651a5) + 512.000000 + + + + + (0x00000853, 0x000052d8) + Applying 4x4 matrix multiplication three times by <b>Spatial +Filter</b> is used to generate data for 3 classes. For each +class i, dimension i is the most prominent. Others are +damped, except dimension 4, which is considered pure noise. + +<b>Signal average</b> boxes turn each chunk of signal into one +example to classify. It increases the stability of the features. + +The role of the classifier training is to discover the +decision rule that can tell the 3 streams apart. Note +that if the coefficients 0.95 in the spatial filters are set to 0, +a good classification rule is really simple: class = i iff x(i)>0 +(and ignore dimension 4). However, with 0.95, a perfect +classification is not possible as there is overlap in the classes. + +You can change the matrixes and explore how it affects +the obtained cross-validation accuracies while changing +the classifiers and the multiclass strategies. + + + (0x473d9a43, 0x97fc0a97) + 896 + + + (0x7234b86b, 0x2b8651a5) + 288 + + + + + (0x00006c3f, 0x000058d1) + 4 channel noise x from Uniform Random (0,1) +generator is amplified to range (x+1)*10. + + + (0x473d9a43, 0x97fc0a97) + 896 + + + (0x7234b86b, 0x2b8651a5) + 80 + + + + + (0x00007e15, 0x00005a2d) + <b>Timeout</b> box controls how much training data is used. + +After training, the <b>Classifier trainer</b> saves the classifier +in a file which could then in principle be loaded by a +<b>classifier processor</b> box to classify future data. + +Finally, the scenario stops after the classifier has been saved. + + + (0x473d9a43, 0x97fc0a97) + 896 + + + (0x7234b86b, 0x2b8651a5) + 656 + + + + + + + (0x05377d7e, 0x41751bb3) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x0000657c, 0x000068d9)","childCount":0,"identifier":"(0x00004d60, 0x00006b24)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3}] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x7b814cca, 0x271df6dd) + 475 + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Classification training example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/box-tutorials/classification-1-testing.xml b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/box-tutorials/classification-1-testing.xml new file mode 100644 index 0000000..006a381 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/box-tutorials/classification-1-testing.xml @@ -0,0 +1,2281 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x000001b3, 0x00001dd9) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001b7409) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000a83, 0x00006fd7) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 560 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b16ab9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000d0c, 0x00002cda) + Confusion Matrix + (0x1ab625da, 0x3b2502ce) + + + (0x6f752dd0, 0x082a321e) + Targets + + + (0x6f752dd0, 0x082a321e) + Classification results + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Percentages + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Sums + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 + OVTK_GDF_Artifact_EOG_Large + OVTK_StimulationId_Label_03 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0x05cf579a, 0x80d8b480) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00de8e03) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001838, 0x00000241) + Matrix Display + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 672 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006eaeb9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000019ca, 0x00002a82) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002b6629) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004173, 0x000028f8) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + (x+1)*10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0044b986) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000049ab, 0x00001b71) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 0.95;0;0;0; 0;1;0;0; 0;0;0.95;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001ba8c1) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000054b6, 0x00003d05) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001eadd9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005aec, 0x00002f62) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0; 0;0.95;0;0; 0;0;0.95;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002e76f6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005af8, 0x000040b1) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + (0x5ba36127, 0x195feae1) + Input 3 + + + (0x5ba36127, 0x195feae1) + Input 4 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000e6f86) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005cfa, 0x0000014c) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001b5c9d) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005d66, 0x00004901) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x5ba36127, 0x195feae1) + Output + + + (0x5ba36127, 0x195feae1) + Output(1) + + + (0x0057b549, 0x42c7fb5a) + (0x5ba36127, 0x195feae1) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00005dbd, 0x00001d0e) + Streamed matrix multiplexer + (0x7a12298b, 0x785f4d42) + + + (0x17341935, 0x152ff448) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + (0x17341935, 0x152ff448) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Multiplexed streamed matrix + + + + + (0x1fa7a38f, 0x54edbe0b) + 480 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x4badfdff, 0xc35004a3) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005e9c, 0x00002191) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 416 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002b71e5) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006d1e, 0x000040ce) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007474, 0x00002f72) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Path_UserData}/classification-training-tutorial-model.xml + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 544 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00007ed4, 0x000021e0) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001a83ea) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007f24, 0x00000510) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 0.95;0;0;0; 0;0.95;0;0; 0;0;1;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001ad00b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x30dd9510, 0x56d43899) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + rand(1) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x30dd9510, 0x56d4389a) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + rand(1) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x30dd9510, 0x56d4389b) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + rand(1) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x30dd9510, 0x56d4389c) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + rand(1) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -48 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5f3d3b70, 0x223fa5b7) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 64 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -128 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x6a29ad99, 0x3c8a4871) + Stimulation multiplexer + (0x07db4efa, 0x472b0938) + + + (0x6f752dd0, 0x082a321e) + Input stimulations 1 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 2 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 3 + + + + + (0x6f752dd0, 0x082a321e) + Multiplexed stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x4e7b798a, 0x183beafb) + (0xe7af82cd, 0x14edb4d4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x7c42038e, 0x43110e61) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 48 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7c42038e, 0x43110e62) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 11 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7c42038e, 0x43110e63) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 21 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7c42038e, 0x43110e64) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 31 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 64 + + + (0x207c9054, 0x3c841b63) + 560 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00001143, 0x000051f2) + + (0x000019ca, 0x00002a82) + 0 + + + (0x00005e9c, 0x00002191) + 0 + + + + (0x00001451, 0x00007588) + + (0x00004173, 0x000028f8) + 0 + + + (0x00005d66, 0x00004901) + 1 + + + + (0x000027ec, 0x0000135b) + + (0x000049ab, 0x00001b71) + 0 + + + (0x00007ed4, 0x000021e0) + 0 + + + + (0x0000355f, 0x000010f0) + + (0x00005d66, 0x00004901) + (0x0057b549, 0x42c7fb5a) + + + (0x00007f24, 0x00000510) + 0 + + + + (0x00003c2d, 0x00002d75) + + (0x000054b6, 0x00003d05) + 0 + + + (0x000001b3, 0x00001dd9) + 0 + + + + (0x0000426f, 0x00006d4a) + + (0x00000d0c, 0x00002cda) + 0 + + + (0x00001838, 0x00000241) + 0 + + + + (0x00005214, 0x00003c09) + + (0x00007474, 0x00002f72) + 0 + + + (0x00000d0c, 0x00002cda) + 1 + + + + (0x00005901, 0x00000e23) + + (0x6a29ad99, 0x3c8a4871) + 0 + + + (0x00006d1e, 0x000040ce) + 0 + + + + (0x00005c2d, 0x00006b3b) + + (0x00007f24, 0x00000510) + 0 + + + (0x000054b6, 0x00003d05) + 0 + + + + (0x00006018, 0x00001d2f) + + (0x00006d1e, 0x000040ce) + 0 + + + (0x00000d0c, 0x00002cda) + 0 + + + + (0x000066ec, 0x00002b54) + + (0x6a29ad99, 0x3c8a4871) + 0 + + + (0x00005d66, 0x00004901) + 0 + + + + (0x000067a1, 0x0000014b) + + (0x00007ed4, 0x000021e0) + 0 + + + (0x00005cfa, 0x0000014c) + 0 + + + + (0x00006a54, 0x000050d8) + + (0x00005aec, 0x00002f62) + 0 + + + (0x000019ca, 0x00002a82) + 0 + + + + (0x0000703d, 0x00006064) + + (0x00005cfa, 0x0000014c) + 0 + + + (0x00005dbd, 0x00001d0e) + 1 + + + + (0x00007056, 0x00006a05) + + (0x00005dbd, 0x00001d0e) + 0 + + + (0x00007474, 0x00002f72) + 0 + + + + (0x00007663, 0x00005363) + + (0x000001b3, 0x00001dd9) + 0 + + + (0x00005dbd, 0x00001d0e) + 2 + + + + (0x0000798c, 0x00002a82) + + (0x00005d66, 0x00004901) + 1 + + + (0x000049ab, 0x00001b71) + 0 + + + + (0x00007b85, 0x0000418f) + + (0x00005e9c, 0x00002191) + 0 + + + (0x00005dbd, 0x00001d0e) + 0 + + + + (0x00007eb7, 0x000028ed) + + (0x00005d66, 0x00004901) + 0 + + + (0x00005aec, 0x00002f62) + 0 + + + + (0x05c243f1, 0x21be2f85) + + (0x5f3d3b70, 0x223fa5b7) + 0 + + + (0x30dd9510, 0x56d4389c) + 0 + + + + (0x05d32be4, 0x675166ec) + + (0x7c42038e, 0x43110e61) + 0 + + + (0x6a29ad99, 0x3c8a4871) + 0 + + + + (0x0c7c501f, 0x7244b23a) + + (0x5f3d3b70, 0x223fa5b7) + 0 + + + (0x30dd9510, 0x56d4389a) + 0 + + + + (0x0f1ec427, 0x6c89b897) + + (0x30dd9510, 0x56d43899) + 0 + + + (0x00005af8, 0x000040b1) + 0 + + + + (0x1c82652d, 0x2c73e35e) + + (0x30dd9510, 0x56d4389b) + 0 + + + (0x00005af8, 0x000040b1) + 2 + + + + (0x1f3847fc, 0x37d3b791) + + (0x30dd9510, 0x56d4389a) + 0 + + + (0x00005af8, 0x000040b1) + 1 + + + + (0x36d2d033, 0x73c7eb1b) + + (0x30dd9510, 0x56d4389c) + 0 + + + (0x00005af8, 0x000040b1) + 3 + + + + (0x3e28726c, 0x2e57831e) + + (0x00005af8, 0x000040b1) + 0 + + + (0x00004173, 0x000028f8) + 0 + + + + (0x42faa2c0, 0x5e57f59e) + + (0x7c42038e, 0x43110e63) + 0 + + + (0x6a29ad99, 0x3c8a4871) + 2 + + + + (0x4b786080, 0x674f91a4) + + (0x7c42038e, 0x43110e64) + 0 + + + (0x00000a83, 0x00006fd7) + 0 + + + + (0x570fd06b, 0x1d86d5f6) + + (0x5f3d3b70, 0x223fa5b7) + 0 + + + (0x30dd9510, 0x56d43899) + 0 + + + + (0x7ee007f7, 0x5e9463fa) + + (0x7c42038e, 0x43110e62) + 0 + + + (0x6a29ad99, 0x3c8a4871) + 1 + + + + (0x7f9f698a, 0x5fd08230) + + (0x5f3d3b70, 0x223fa5b7) + 0 + + + (0x30dd9510, 0x56d4389b) + 0 + + + + + + (0x0000019a, 0x000047dc) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 400 + + + (0x7234b86b, 0x2b8651a5) + -192 + + + + + (0x000050ff, 0x000054cc) + The <b>lua stimulator</b> generates a timeline +specifying 10 seconds of data from each class. +The stimuli control stream switch, which routes +the uniform random data to class-specific +transformations. + + + (0x473d9a43, 0x97fc0a97) + 784.000000 + + + (0x7234b86b, 0x2b8651a5) + 304.000000 + + + + + (0x00005918, 0x00002cab) + The classification accuracy is measured +by the <b>Confusion Matrix</b> box. + +When the classification is good, +the accuracies on the diagonal +are the highest. + +The 'No Target available' warning is normal, +it means that in the scenario, the confusion +matrix gets some predictions from the classifier +before it has received the corresponding target +from the lua chain. + + + (0x473d9a43, 0x97fc0a97) + 752.000000 + + + (0x7234b86b, 0x2b8651a5) + 800.000000 + + + + + (0x00006c3f, 0x000058d1) + This is a test scenario corresponding to +<b>classification-0-training.xml</b> + +Please run the training scenario first. + +Fresh data is drawn from the same distribution +that was used in the training and is sent +to the classifier. + +Note that since the data is freshly sampled, +it was never used in training. Hence, the accuracy +estimate should be unbiased in this scenario. + + + (0x473d9a43, 0x97fc0a97) + 784 + + + (0x7234b86b, 0x2b8651a5) + 128 + + + + + + + (0x11f491f3, 0x047d65a5) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00001838, 0x00000241)","childCount":0,"identifier":"(0x1a61c725, 0x408aeb5c)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3}] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x7b814cca, 0x271df6dd) + 475 + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Classification testing example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/box-tutorials/classification-2-incremental.cfg b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/box-tutorials/classification-2-incremental.cfg new file mode 100644 index 0000000..67c4400 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/box-tutorials/classification-2-incremental.cfg @@ -0,0 +1,28 @@ + + Native + Linear Discrimimant Analysis (LDA) + + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_03 + + + + 0 1 2 + + + 1.334008e+002 1.260394e+002 1.328885e+002 1.490076e+002 + -3956.51 + + + 1.312276e+002 1.289672e+002 1.329751e+002 1.494476e+002 + -3975.31 + + + 1.313580e+002 1.262441e+002 1.355423e+002 1.492769e+002 + -3972.21 + + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/box-tutorials/classification-2-incremental.xml b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/box-tutorials/classification-2-incremental.xml new file mode 100644 index 0000000..282a89f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/box-tutorials/classification-2-incremental.xml @@ -0,0 +1,3241 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x000001b3, 0x00001dd9) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00302844) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000a83, 0x00006fd8) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Pause + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b16ab9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000d0c, 0x00002cda) + Confusion Matrix + (0x1ab625da, 0x3b2502ce) + + + (0x6f752dd0, 0x082a321e) + Targets + + + (0x6f752dd0, 0x082a321e) + Classification results + + + + + (0x544a003e, 0x6dcba5f6) + Confusion Matrix + + + + + (0x2cdb2f0b, 0x12f231ea) + Percentages + true + true + false + + + (0x2cdb2f0b, 0x12f231ea) + Sums + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 + OVTK_GDF_Artifact_EOG_Large + OVTK_StimulationId_Label_03 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 704 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0x05cf579a, 0x80d8b480) + + + (0x61d11811, 0x71e65362) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x029ebee3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00001838, 0x00000241) + Matrix Display + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 768 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00bcabb6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000019ca, 0x00002a82) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002bfe51) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00001f59, 0x00002c7a) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 2.0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Train + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005ac723) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x0000382f, 0x00002565) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + ${Player_ScenarioDirectory}/classification-2-incremental.cfg + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x008705e9) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004173, 0x000028f8) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + (x+1)*10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004da571) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000049ab, 0x00001b71) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 0.95;0;0;0; 0;1;0;0; 0;0;0.95;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0046eb98) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000053c9, 0x000018f6) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + ${Player_ScenarioDirectory}/classification-2-incremental.cfg + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 0 + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + true + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x007af194) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000054b6, 0x00003d05) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0034e495) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005aec, 0x00002f62) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0; 0;0.95;0;0; 0;0;0.95;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00321433) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00005af8, 0x000040b1) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + (0x5ba36127, 0x195feae1) + Input 3 + + + (0x5ba36127, 0x195feae1) + Input 4 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000e6f86) + + + (0xc73e83ec, 0xf855c5bc) + true + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005cfa, 0x0000014c) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0045112b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005d66, 0x00004901) + Stream Switch + (0x556a2c32, 0x61df49fc) + + + (0x6f752dd0, 0x082a321e) + Triggers + + + (0x5ba36127, 0x195feae1) + Matrix + + + + + (0x5ba36127, 0x195feae1) + Output + + + (0x5ba36127, 0x195feae1) + Output(1) + + + (0x0057b549, 0x42c7fb5a) + (0x5ba36127, 0x195feae1) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Default to output 1 + false + false + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 1 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 2 + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Switch stim for output 3 + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x545d0657, 0x3d7c83bd) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00005dbd, 0x00001d0e) + Streamed matrix multiplexer + (0x7a12298b, 0x785f4d42) + + + (0x17341935, 0x152ff448) + Input stream 1 + + + (0x17341935, 0x152ff448) + Input stream 2 + + + (0x17341935, 0x152ff448) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Multiplexed streamed matrix + + + + + (0x1fa7a38f, 0x54edbe0b) + 560 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x4badfdff, 0xc35004a3) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00350d8d) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005e9c, 0x00002191) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002bac54) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006d1e, 0x000040ce) + Identity + (0x5dffe431, 0x35215c50) + + + (0x6f752dd0, 0x082a321e) + Input stream + + + + + (0x6f752dd0, 0x082a321e) + Output stream + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 656 + + + (0x207c9054, 0x3c841b63) + 160 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa8ffe2a3, 0x27038f03) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00007ed4, 0x000021e0) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004ea14d) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007f24, 0x00000510) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 0.95;0;0;0; 0;0.95;0;0; 0;0;1;0; 0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 496 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002bac56) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x30dd9510, 0x56d43899) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + rand(1) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -64 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x30dd9510, 0x56d4389a) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + rand(1) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -64 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x30dd9510, 0x56d4389b) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + rand(1) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -64 + + + (0x207c9054, 0x3c841b63) + 400 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x30dd9510, 0x56d4389c) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + rand(1) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -64 + + + (0x207c9054, 0x3c841b63) + 480 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x5f3d3b70, 0x223fa5b7) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 64 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -144 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x6a29ad99, 0x3c8a4871) + Stimulation multiplexer + (0x07db4efa, 0x472b0938) + + + (0x6f752dd0, 0x082a321e) + Input stimulations 1 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 2 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 3 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 4 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 5 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 6 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 7 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 8 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 9 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 10 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 11 + + + (0x6f752dd0, 0x082a321e) + Input stimulations 12 + + + + + (0x6f752dd0, 0x082a321e) + Multiplexed stimulations + + + + + (0x1fa7a38f, 0x54edbe0b) + 144 + + + (0x207c9054, 0x3c841b63) + 160 + + + (0x4e7b798a, 0x183beafb) + (0xe7af82cd, 0x14edb4d4) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x7c42038e, 0x43110e61) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 64 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7c42038e, 0x43110e62) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 5 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x207c9054, 0x3c841b63) + 80 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7c42038e, 0x43110e63) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 9 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7c42038e, 0x43110e64) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 48 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7c42038e, 0x43110e65) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 13 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x207c9054, 0x3c841b63) + 112 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7c42038e, 0x43110e66) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 17 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 128 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7c42038e, 0x43110e67) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 21 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x207c9054, 0x3c841b63) + 144 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7c42038e, 0x43110e68) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 25 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 160 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7c42038e, 0x43110e69) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 29 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x207c9054, 0x3c841b63) + 176 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7c42038e, 0x43110e6a) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 33 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -16 + + + (0x207c9054, 0x3c841b63) + 192 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7c42038e, 0x43110e6b) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 37 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_03 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x207c9054, 0x3c841b63) + 208 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7c42038e, 0x43110e6c) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 41 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_02 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x207c9054, 0x3c841b63) + 224 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x7c42038e, 0x43110e6d) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 45 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_01 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x000009a1, 0x0000507c) + + (0x00001f59, 0x00002c7a) + 0 + + + (0x000053c9, 0x000018f6) + 0 + + + + (0x00001143, 0x000051f2) + + (0x000019ca, 0x00002a82) + 0 + + + (0x00005e9c, 0x00002191) + 0 + + + + (0x00001383, 0x000076af) + + (0x000001b3, 0x00001dd9) + 0 + + + (0x000053c9, 0x000018f6) + 3 + + + + (0x00001dc8, 0x000062ac) + + (0x00005d66, 0x00004901) + (0x0057b549, 0x42c7fb5a) + + + (0x00007f24, 0x00000510) + 0 + + + + (0x0000266b, 0x00006b13) + + (0x00004173, 0x000028f8) + 0 + + + (0x00005d66, 0x00004901) + 1 + + + + (0x000027ec, 0x0000135b) + + (0x000049ab, 0x00001b71) + 0 + + + (0x00007ed4, 0x000021e0) + 0 + + + + (0x00003c2d, 0x00002d75) + + (0x000054b6, 0x00003d05) + 0 + + + (0x000001b3, 0x00001dd9) + 0 + + + + (0x00004220, 0x000035cd) + + (0x6a29ad99, 0x3c8a4871) + 0 + + + (0x00006d1e, 0x000040ce) + 0 + + + + (0x0000423a, 0x000015f3) + + (0x00005d66, 0x00004901) + 1 + + + (0x000049ab, 0x00001b71) + 0 + + + + (0x0000426f, 0x00006d4a) + + (0x00000d0c, 0x00002cda) + 0 + + + (0x00001838, 0x00000241) + 0 + + + + (0x00004aba, 0x00005544) + + (0x00005e9c, 0x00002191) + 0 + + + (0x000053c9, 0x000018f6) + 1 + + + + (0x00005c2d, 0x00006b3b) + + (0x00007f24, 0x00000510) + 0 + + + (0x000054b6, 0x00003d05) + 0 + + + + (0x0000618c, 0x00003377) + + (0x6a29ad99, 0x3c8a4871) + 0 + + + (0x00005d66, 0x00004901) + 0 + + + + (0x000067a1, 0x0000014b) + + (0x00007ed4, 0x000021e0) + 0 + + + (0x00005cfa, 0x0000014c) + 0 + + + + (0x000067fc, 0x00003ac0) + + (0x00006d1e, 0x000040ce) + 0 + + + (0x00000d0c, 0x00002cda) + 0 + + + + (0x00006a54, 0x000050d8) + + (0x00005aec, 0x00002f62) + 0 + + + (0x000019ca, 0x00002a82) + 0 + + + + (0x00006d39, 0x000070cf) + + (0x00005dbd, 0x00001d0e) + 0 + + + (0x0000382f, 0x00002565) + 0 + + + + (0x0000703d, 0x00006064) + + (0x00005cfa, 0x0000014c) + 0 + + + (0x00005dbd, 0x00001d0e) + 1 + + + + (0x000070b2, 0x000042a6) + + (0x00005d66, 0x00004901) + 0 + + + (0x00005aec, 0x00002f62) + 0 + + + + (0x0000748a, 0x00007a4c) + + (0x00005cfa, 0x0000014c) + 0 + + + (0x000053c9, 0x000018f6) + 2 + + + + (0x00007663, 0x00005363) + + (0x000001b3, 0x00001dd9) + 0 + + + (0x00005dbd, 0x00001d0e) + 2 + + + + (0x00007881, 0x00007f08) + + (0x0000382f, 0x00002565) + 0 + + + (0x00000d0c, 0x00002cda) + 1 + + + + (0x00007b85, 0x0000418f) + + (0x00005e9c, 0x00002191) + 0 + + + (0x00005dbd, 0x00001d0e) + 0 + + + + (0x00007df8, 0x000073d0) + + (0x000053c9, 0x000018f6) + 0 + + + (0x0000382f, 0x00002565) + 1 + + + + (0x042ebe23, 0x7ccfcea4) + + (0x7c42038e, 0x43110e6d) + 0 + + + (0x6a29ad99, 0x3c8a4871) + 11 + + + + (0x05c243f1, 0x21be2f85) + + (0x5f3d3b70, 0x223fa5b7) + 0 + + + (0x30dd9510, 0x56d4389c) + 0 + + + + (0x05d32be4, 0x675166ec) + + (0x7c42038e, 0x43110e61) + 0 + + + (0x6a29ad99, 0x3c8a4871) + 0 + + + + (0x070c9256, 0x29aeb7f6) + + (0x7c42038e, 0x43110e6b) + 0 + + + (0x6a29ad99, 0x3c8a4871) + 9 + + + + (0x0c7c501f, 0x7244b23a) + + (0x5f3d3b70, 0x223fa5b7) + 0 + + + (0x30dd9510, 0x56d4389a) + 0 + + + + (0x0f1ec427, 0x6c89b897) + + (0x30dd9510, 0x56d43899) + 0 + + + (0x00005af8, 0x000040b1) + 0 + + + + (0x1c82652d, 0x2c73e35e) + + (0x30dd9510, 0x56d4389b) + 0 + + + (0x00005af8, 0x000040b1) + 2 + + + + (0x1f3847fc, 0x37d3b791) + + (0x30dd9510, 0x56d4389a) + 0 + + + (0x00005af8, 0x000040b1) + 1 + + + + (0x20e93f4d, 0x12e7e030) + + (0x7c42038e, 0x43110e66) + 0 + + + (0x6a29ad99, 0x3c8a4871) + 4 + + + + (0x2d3c969e, 0x1abf5222) + + (0x7c42038e, 0x43110e6c) + 0 + + + (0x6a29ad99, 0x3c8a4871) + 10 + + + + (0x36d2d033, 0x73c7eb1b) + + (0x30dd9510, 0x56d4389c) + 0 + + + (0x00005af8, 0x000040b1) + 3 + + + + (0x42faa2c0, 0x5e57f59e) + + (0x7c42038e, 0x43110e63) + 0 + + + (0x6a29ad99, 0x3c8a4871) + 2 + + + + (0x4b786080, 0x674f91a4) + + (0x7c42038e, 0x43110e64) + 0 + + + (0x00000a83, 0x00006fd8) + 0 + + + + (0x4becb922, 0x696f6c03) + + (0x7c42038e, 0x43110e65) + 0 + + + (0x6a29ad99, 0x3c8a4871) + 3 + + + + (0x568c6537, 0x554491b3) + + (0x7c42038e, 0x43110e67) + 0 + + + (0x6a29ad99, 0x3c8a4871) + 5 + + + + (0x570fd06b, 0x1d86d5f6) + + (0x5f3d3b70, 0x223fa5b7) + 0 + + + (0x30dd9510, 0x56d43899) + 0 + + + + (0x59a5663d, 0x32def35b) + + (0x7c42038e, 0x43110e6a) + 0 + + + (0x6a29ad99, 0x3c8a4871) + 8 + + + + (0x59d687d5, 0x3d86980d) + + (0x7c42038e, 0x43110e69) + 0 + + + (0x6a29ad99, 0x3c8a4871) + 7 + + + + (0x5fede73f, 0x11dca814) + + (0x7c42038e, 0x43110e68) + 0 + + + (0x6a29ad99, 0x3c8a4871) + 6 + + + + (0x79ad83ca, 0x538570e2) + + (0x00005af8, 0x000040b1) + 0 + + + (0x00004173, 0x000028f8) + 0 + + + + (0x7ee007f7, 0x5e9463fa) + + (0x7c42038e, 0x43110e62) + 0 + + + (0x6a29ad99, 0x3c8a4871) + 1 + + + + (0x7f9f698a, 0x5fd08230) + + (0x5f3d3b70, 0x223fa5b7) + 0 + + + (0x30dd9510, 0x56d4389b) + 0 + + + + + + (0x0000019a, 0x000047dc) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 400 + + + (0x7234b86b, 0x2b8651a5) + -160 + + + + + (0x000024f4, 0x0000386b) + The Clock Stimulator tells the +Classifier Trainer to estimate a +new classifier every 2s with all +the so-far accumulted data. + + + (0x473d9a43, 0x97fc0a97) + 928 + + + (0x7234b86b, 0x2b8651a5) + 432 + + + + + (0x000050ff, 0x000054cc) + The <b>lua stimulator</b> generates a timeline +specifying 4 seconds of data from each class, +the sources alternating during 48 sec. + +The stimuli in the timeline control stream switch, +which routes the uniform random data to class-specific +transformations. + + + (0x473d9a43, 0x97fc0a97) + 784.000000 + + + (0x7234b86b, 0x2b8651a5) + 304.000000 + + + + + (0x00005918, 0x00002cab) + The classification accuracy is measured +by the <b>Confusion Matrix</b> box. + +When the classification is good, +the accuracies on the diagonal +are the highest. + +The 'No Target available' warning is normal, +it means that in the scenario, the confusion +matrix gets some predictions from the classifier +before it has received the corresponding target +from the lua chain. + + + (0x473d9a43, 0x97fc0a97) + 752 + + + (0x7234b86b, 0x2b8651a5) + 704 + + + + + (0x00006c3f, 0x000058d1) + This is a test scenario illustrating +basic incremental online learning. + +Data is classified with the learned model, +and the model is repeatedly updated during +the session. + +Note that the classifier in principle +shouldn't be used with the data that +has been used for its estimation +(overfitting). Here when the 'reload model' +is received by the processor, the previous +classifier has - verify - already processed +all the features received so far. + + + (0x473d9a43, 0x97fc0a97) + 784 + + + (0x7234b86b, 0x2b8651a5) + 112 + + + + + + + (0x688ddfdf, 0x0576629f) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00001838, 0x00000241)","childCount":0,"identifier":"(0x78c3f1c6, 0x3a0a8e17)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3}] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x7b814cca, 0x271df6dd) + 475 + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Classification testing example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/Doc_BoxAlgorithm_ClassifierProcessor.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/Doc_BoxAlgorithm_ClassifierProcessor.dox-part new file mode 100644 index 0000000..4ee4c17 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/Doc_BoxAlgorithm_ClassifierProcessor.dox-part @@ -0,0 +1,90 @@ +/** + * \page BoxAlgorithm_ClassifierProcessor Classifier processor +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClassifierProcessor_Description| +The Classifier Processor box is a generic box for classifying data (feature vectors). +It works in conjunction with the \ref Doc_BoxAlgorithm_ClassifierTrainer box. +This box' role is to expose a generic interface to the rest of the BCI pipeline. The +vectors to classify are forwarded to an algorithm or a structure of algorithms depending on what is +described in the loaded configuration file. The behavior is simple: at initialization phase, the classification +structure is initialized and its configuration is loaded from the configuration file. Then each time this box +receives a new feature vector, it is forwarded to the classification algorithm that classifies it. The box gets the algorithm +status and the actual class value and translates this information to its output. The predicted class is sent out in +the form of a stimulation and the algorithm status is sent in the form a streamed matrix. The stimulation can be generically +interpreted by the rest of the pipeline but it is important to understand that each classification algorithm is +free to report whatever it wants in its "status matrix". Consequently, the use of this output stream will be +dependent on the chosen classification algorithm. For example, the LDA classifier sends the hyperplane distance +value as its status. + * |OVP_DocEnd_BoxAlgorithm_ClassifierProcessor_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClassifierProcessor_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ClassifierProcessor_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ClassifierProcessor_Input1| +This input should be connected to the feature vector stream to classify. Each time a new feature vector arrives, +a classification process will be triggered. Consequently, a classification stimulation will be sent on the +first output of this box. + * |OVP_DocEnd_BoxAlgorithm_ClassifierProcessor_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClassifierProcessor_Outputs| + * |OVP_DocEnd_BoxAlgorithm_ClassifierProcessor_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_ClassifierProcessor_Output1| +This output will contain the classification stimulations. Each time a new feature vector arrives to this box, +a new classification process is triggered, resulting in the generation of the corresponding class stimulation. + * |OVP_DocEnd_BoxAlgorithm_ClassifierProcessor_Output1| + + * |OVP_DocBegin_BoxAlgorithm_ClassifierProcessor_Output2| +This output reflects the classification algorithm status in the form of a matrix of value. This output will contain one or several distances +to an hyperplane if the classifier provide it. If not, the matrix will have 0 dimension. The format of this output directly depend on +the classification algorithm and of the strategy used by the processor box. + * |OVP_DocEnd_BoxAlgorithm_ClassifierProcessor_Output2| + * + * |OVP_DocBegin_BoxAlgorithm_ClassifierProcessor_Output3| +This output reflects the classification algorithm status in the form of a matrix of value. This output will contains one or several probabilities +for a data to be on a class if the classifier provide it. If not, the matrix will have 0 dimension. The format of this output directly depend on +the classification algorithm and of the strategy used by the processor box. + * |OVP_DocEnd_BoxAlgorithm_ClassifierProcessor_Output2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClassifierProcessor_Settings| + * |OVP_DocEnd_BoxAlgorithm_ClassifierProcessor_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ClassifierProcessor_Setting1| +This setting points to the configuration file of the box generated by the +\ref Doc_BoxAlgorithm_ClassifierTrainer box. Its syntax depends on the selected algorithm. + * |OVP_DocEnd_BoxAlgorithm_ClassifierProcessor_Setting1| + +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClassifierProcessor_Examples| +This box is used in BCI pipelines in order to classify cerebral activity states. For a detailed scenario using this +box and its associated \ref Doc_BoxAlgorithm_ClassifierTrainer, please see the motor imagary +BCI scenario in the sample scenarios. + * |OVP_DocEnd_BoxAlgorithm_ClassifierProcessor_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClassifierProcessor_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_ClassifierProcessor_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/Doc_BoxAlgorithm_ClassifierTrainer.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/Doc_BoxAlgorithm_ClassifierTrainer.dox-part new file mode 100644 index 0000000..160d9a4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/Doc_BoxAlgorithm_ClassifierTrainer.dox-part @@ -0,0 +1,285 @@ +/** + * \page BoxAlgorithm_ClassifierTrainer Classifier trainer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Description| +The Classifier Trainer box is a generic box for training models to classify input data. +It works in conjunction with the \ref Doc_BoxAlgorithm_ClassifierProcessor box. +This box' role is to expose a generic interface to the rest of the BCI pipelines. The box +will generate an internal structure according to the multiclass strategy and the learning +algorithm selected. + +The behavior is simple, the box collects a number of feature vectors. Those feature vectors +are labelled depending on the input they arrive on. When a specific stimulation arrives, a training +process is triggered. This process can take some time so this box should be used offline. Depending on the +settings you enter, you will be able to perform a k-fold test to estimate the accuracy of the learned +classifier. When this training stimulation is received, the box generates a configuration file that will +be usable online by the \ref Doc_BoxAlgorithm_ClassifierProcessor box. +Finally, the box outputs a particular stimulation (OVTK_StimulationId_TrainCompleted) +on its output, that can be used to trigger further treatments in the scenario. + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Inputs| +This box can have a variable number of inputs. If you need more than two classes, feel free to add more +inputs and to use a proper strategy/classifier combination to handle more than two classes. + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Input1| +The first input receives a stimulation stream. Only one stimulation of this stream is important, the one +that triggers the training process. When this stimulation is received, all the feature vectors are labelled +and sent to the classification algorithm. The training is triggered and executed. Then the classification +algorithm generates a configuration file that will be used online by the \ref Doc_BoxAlgorithm_ClassifierProcessor box. + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Input1| + + * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Input2| +This input receives the feature vector for the first class. + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Input2| + + * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Input3| +This input receives the feature vector for the second class. + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Input3| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Outputs| + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Output1| +The stimulation OVTK_StimulationId_TrainCompleted is raised on this output when the classifier trainer has finished its job. + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Output1| + +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Settings| +The number of settings of this box can vary depending on the classification algorithm you choose. Such algorithm +could have specific input OpenViBE::Kernel::IParameter objects (see \ref OpenViBE::Kernel::IAlgorithmProxy for details). If +the type of those parameters is simple enough to be handled in the GUI, then additional settings will be added to this box. +After switching a strategy or a classifier, you will have to close and re-open the settings configuration dialog to see the parameters of the new classifier. Supported parameter types are : Integers, Floats, Enumerations, Booleans. The documentation for those +parameters can not be done in this page because it is impossible to know at this time what classifier thus what hyper +parameters you will have available. This will depend on the classification algorihtms that are be implemented in OpenViBE. + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Settings| + * + * * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Setting1| +The stimulation that triggers the training process and save the learned classifier to disk. + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Setting1| + * + * * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Setting2| +This setting points to the configuration file where to save the result of the training for later online use. This +configuration file is used by the \ref Doc_BoxAlgorithm_ClassifierProcessor box. Its syntax +depends on the selected algorithm. + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Setting3| +This setting is the strategy to use. You can choose any registered \c OVTK_TypeId_ClassificationStrategy +strategy you want. + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Setting3| + * + * * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Setting4| +This is the stimulation to send when the classifier algorithm detects a class-1 feature vector + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Setting4| + * + * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Setting5| +This is the stimulation to send when the classifier algorithm detects a class-2 feature vector + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Setting6| +This setting is the classifier to use. You can choose any registered \c OVTK_TypeId_ClassifierAlgorithm +algorithm you want. + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Setting6| + + + + * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Setting10| +If you want to perform a k-fold test, you should enter something else than 0 or 1 here. A k-fold test generally gives +a better estimate of the classifiers accuracy than naive testing with the training data. The classifier may overfit +the training data, and get a good accuracy with the observed data, but not be able to generalize to unseen data. +In cross-validation, the idea is to divide the set of feature vectors in a number of partitions. The classification algorithm +is trained on some of the partitions and its accuracy is tested on the others. However, the classifier produced by the box is +the classifier trained with the whole data. The cross-validation is only an error estimation tool, it does not affect +the resulting model. See the miscellaneous section for details on how the k-fold test is done in this box, and possible +caveats about the cross-validation procedure. + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Setting10| + + * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Setting11| +If the number of class labels is unbalanced, the classifiers tend to be biased towards the majority labels. +This option can be used to resample the dataset to feature all classes equally. + +The algorithm first looks how many examples there are in the majority class. Lets say this is n. Then, if class k has m examples, +it will random sample n-m examples with replacement from class k, appending them to the dataset. This will be done for each class. +In the end, each class will have n examples and all except the majority class will have some duplicate training vectors. +This can be seen as a technique to weight the importance of examples for such classifiers that do not support setting example weights +or class weight prior, and can in general be attempted with arbitrary learning algorithms. + +Enabling this option may make sense if the box is used for incremental learning, where all classes may not be equally represented +in the training data obtained so far, even if the design itself is balanced. Note that enabling this will make the cross-validation +results optimistic. In most conditions, the feature should be disabled. + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Setting11| + +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Examples| +This box is used in BCI pipelines in order to classify cerebral activity states. For a detailed scenario using this +box and its associated \ref Doc_BoxAlgorithm_ClassifierProcessor, please see the motor imagary +BCI scenario in the sample scenarios. An even more simple tutorial with artificial data +is available in the box-tutorials/ folder. + + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClassifierTrainer_Miscellaneous| + +The box supports various multiclass strategies and classifiers as plugins. + +\par Available strategy: +Strategy refers to how feature vectors are routed to one or more classifiers, which possibly can handle only 2 classes themselves. + +\par Native +Use the classifier training algorithm without a pairwise strategy. All the data is passed to a single classifier trainer. + +\par One Vs All +Use a pairwise strategy which consists of training each class against all the others, creating n classifiers for n classes. + +\par One vs One +Use a airwise strategy which trains one classifier for each pair of classes. Then we use a decision startegy to extract the most likely class. There are three differents decision strategy: +\li Voting: method based on a simple majority voting process +\li HT: method described in: Hastie, Trevor; Tibshirani, Robert. Classification by pairwise coupling. The Annals of Statistics 26 (1998), no. 2, 451--471 +\li PKPD: method describe in: Price, S. Knerr, L. Personnaz, and G. Dreyfus. Pairwise neural network classifiers with probabilistic outputs. In G. Tesauro, D. Touretzky, and T. Leen (eds.) +Advances in Neural Information Processing Systems 7 (NIPS-94), pp. 1109-1116. MIT Press, 1995. +You cannot use every algorithm with every decision strategy, but the interface will restain the choice according to your selection. + + + +\par Available classifiers: + +\par Support Vector Machine (SVM) +A well-known classifier supporting non-linear classification via kernels. The implementation is based on LIBSVM 2.91, which is included in the OpenViBE source tree. The parameters exposed in the GUI correspond to LIBSVM parameters. For more information on LIBSVM, see here. +\par +This algorithm provides only probabilities. + +\par Linear Discriminant Analysis (LDA) + A simple and fast linear classifier. For description, see any major textbook on Machine Learning or Statistics (e.g. Duda, Hart & Stork, or Hastie, Tibshirani & Friedman). This algorithm can be used with a regularized covariance matrix + according to a method proposed by Ledoit & Wolf: "A Well-Conditioned Estimator for Large-Dimensional Covariance Matrices", 2004. + The Linear Discriminant Analysis has the following options. + \par + \li Use shrinkage: Use a classic or a regularized covariance matrix. + \li Shrinkage: A value s between [0,1] sets a linear weight between dataCov and priorCov. I.e. cov=(1-s)*dataCov+s*priorCov. + Value <0 is used to auto-estimate the shrinking coefficient (default). If var(x) is a vector of empirical variances of all data dimensions, priorCov is a + diagonal matrix with a single value mean(var(x)) pasted on its diagonal. Used only if use shrinkage is checked. +\li Force diagonal cov (DDA): This sets the nondiagonal entries of the covariance matrices to zero. Used only if Use shrinkage is checked. +\par +Note that setting shrinkage to 0 should get you the regular LDA behavior. If you additionally force the covariance to be diagonal, you should get a model resembling the Naive Bayes classifier. +\par +This algorithm provides both hyperplane distance and probabilities. + +\par Multilayer Perceptron (MLP) +A classifier algorithm which relies on an artificial neural network (Laurent Bougrain. Practical introduction to artificial neural networks. IFAC symposium on automation in Mining, Mineral and Metal Processing - +MMM'04, Sep 2004, Nancy, France, 6 p, 2004.). In OpenViBE, the MLP is a 2-layer neural network. The hyperbolic tangent is the activation function of the +neurons inside the hidden layer. The network is trained using the backpropagation of the gradient. During the training, 80% of the training set is used to compute the gradient, +and 20% is used to validate the new model. The different weights and biases are updated only once per iteration (just before the validation). A coefficient alpha (learning coefficient) is used to moderate the importance of +the modification of weights and biases to avoid oscillations. The learning stops when the difference of the error per element (computed during validation) of two consecutive iterations is under the value epsilon given as a parameter. +\par +\li Number of neurons in hidden layer: number of neurons that will be used in the hidden layer. +\li Learning stop condition : the epsilon value used to stop the learning +\li Learning coefficient: a coefficient which influence the speed of learning. The smaller the coefficient is, the longer the learning will take, the more chance you will have to get a good solution. +\par +Note that feature vectors are normalized between -1 and 1 (using the min/max of the training set) to avoid saturation of the hyperbolic tangent. +\par +This algorithm provides both hyperplane distance (identity of output layer) and probabilites (softmax function on output layer). + +\par Cross Validation + +In this section, we will detail how the k-fold test is implemented in this box. For the k-fold test to be performed, you +have to choose more than 1 partition in the related settings. Suppose you chose \c n partitions. Then when trigger stimulation +is received, the feature vector set is splitted in \c n consecutive segments. The classification algorithm is trained on +\c n-1 of those segments and tested on the last one. This is performed for each segment. + +For example, suppose you have 5 partitions of feature vectors (\c FVs) +\verbatim ++------+ +------+ +------+ +------+ +------+ +| FVs1 | | FVs2 | | FVs3 | | FVs4 | | FVs5 | ++------+ +------+ +------+ +------+ +------+ +\endverbatim +For the first training, a feature vector set is built form the \c FVs2, \c FVs3, \c FVs4, \c FVs5. The classifier algorithm +is trained on this feature vector set. Then the classifier is tested on the \c FVs1 : +\verbatim ++------+ +---------------------------------+ +| FVs1 | | Training Feature Vector Set 1 | ++------+ +---------------------------------+ +\endverbatim +Then, a feature vector set is built form the \c FVs1, \c FVs3, \c FVs4, \c FVs5. The classifier algorithm +is trained on this feature vector set. Then the classifier is tested on the \c FVs2 : +\verbatim ++-------+ +------+ +------------------------+ +| Train | | FVs2 | | ing Feat. Vector Set 2 | ++-------+ +------+ +------------------------+ +\endverbatim +The same process if performed on all the partitions : +\verbatim ++---------------+ +------+ +---------------+ +|Training Featur| | FVs3 | |e Vector Set 3 | ++---------------+ +------+ +---------------+ ++------------------------+ +------+ +------+ +|Training Feature Vector | | FVs4 | |Set 4 | ++------------------------+ +------+ +------+ ++---------------------------------+ +------+ +| Training Feature Vector Set 5 | | FVs5 | ++---------------------------------+ +------+ +\endverbatim + +Important things to consider : +- The more partitions you have, the more feature vectors you have in your training sets... and the less examples +you'll have to test on. This means that the result of the test will probably be less reliable. + +In conclusion, be careful when choosing this k-fold test setting. Typical value range from 4 partitions (train on 75% of the feature vectors and +test on 25% - 4 times) to 10 partitions (train on 90% of the feature vectors and test on 10% - 10 times). + +Note that the cross-validation performed by the classifier trainer box in OpenViBE may be optimistic. +The cross-validation computation is working as it should, but it cannot take into account what happens outside +the classifier trainer box. In OpenViBE scenarios, there may be e.g. time overlap from epoching, feature +vectors drawn from the same epoch ending up in the same cross-validation partition, and (supervised) +preprocessing such as CSP or xDAWN potentially overfitting the data before its given to the classifier trainer. +Such situations are not compatible with the theoretical assumption that the feature vectors are +independent and identically distributed (the typical iid assumption in machine learning) across +train and test. To do cross-validation controlling for such issues, we have provided +a more advanced cross-validation tutorial as part of the OpenViBE web documentation. + +\par Confusion Matrices + +At the end of the training, the box will print one or two confusion matrices, depending if cross-validation +was used: one matrix for the cross-validation, the other for the training data. Each matrix will contain true +class as rows, and predicted class as columns. The diagonal describes the percentage of correct predictions per class. +Although the matrix can be optimistic (see above section about the cross-validation), it may give useful +diagnostic information. For example, if the accuracy is very skewed towards one class, this may indicate +a problem if the design is supposed to be balanced. The problem may originate e.g. from the original data +source, the signal processing chains for the different classes, or the classifier learning algorithm. These need +then to be investigated. Also, if very low accuracies are observed in these matrices, it may give reason +to suspect that prediction accuracies on fresh data might be likewise lacking -- or worse. + +\par Incremental Learning + +The box can also be used for simple incremental (online) learning. To achieve this, simply send the box the training +stimulation and it will train a classifier with all the data it has received so far. You can give it more +feature vectors later, and trigger the learning again by sending another stimulation. Likewise, the corresponding +classifier processor box can be made to load new classifiers during playback. With classifiers like LDA, +this practice is usually feasible when the data is reasonably sized (as in basic motor imagery). + + * |OVP_DocEnd_BoxAlgorithm_ClassifierTrainer_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/Doc_BoxAlgorithm_VotingClassifier.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/Doc_BoxAlgorithm_VotingClassifier.dox-part new file mode 100644 index 0000000..5a4c96a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/Doc_BoxAlgorithm_VotingClassifier.dox-part @@ -0,0 +1,112 @@ +/** + * \page BoxAlgorithm_VotingClassifier Voting Classifier +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_VotingClassifier_Description| +The purpose of this simple classifier is to choose between multiple two class classifiers which +one mostly fits a condition. For example imagine \c n states. Each of those states can be either active +or inactive. Additionally, imagine you want only one active state at a time. Then you can have \c n +two-class classifiers telling for each state if it is active or not, and a following voting classifier +that chooses which of those states is the most active. + * |OVP_DocEnd_BoxAlgorithm_VotingClassifier_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_VotingClassifier_Inputs| +You can add as many inputs as you need depending on the number of preceeding states. + +The inputs of this classifier can be changed to either streamed matrix of stimulations. + +In the case you choose stimulations, each active stimulation gives a point +to the preceeding state. Both an inactive and a reject stimulation gives no point. +Any other stimulation is ignored. +After a number of repetitions, the state with the best score is chosen. + +In the case you choose streamed matrix, the matrix must have only one +element. This element is used as a score coefficient (in place of the simple 1-0 of the previous +case). After a number of repetitions, the state with the best score is chosen. + * |OVP_DocEnd_BoxAlgorithm_VotingClassifier_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_VotingClassifier_Input1| +Input stream for the first state. + * |OVP_DocEnd_BoxAlgorithm_VotingClassifier_Input1| + + * |OVP_DocBegin_BoxAlgorithm_VotingClassifier_Input2| +Input stream for the second state. + * |OVP_DocEnd_BoxAlgorithm_VotingClassifier_Input2| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_VotingClassifier_Outputs| + * |OVP_DocEnd_BoxAlgorithm_VotingClassifier_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_VotingClassifier_Output1| +This output sends a new stimulation as soon as the classifier received the correct number of votes +from the preceeding states. The output stimulation is based on the 5th setting of the box. First +state being selected would send exactly this stimulation. Second state would send this +stimulation + 1 etc. + * |OVP_DocEnd_BoxAlgorithm_VotingClassifier_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_VotingClassifier_Settings| + * |OVP_DocEnd_BoxAlgorithm_VotingClassifier_Settings| + + * |OVP_DocBegin_BoxAlgorithm_VotingClassifier_Setting1| +This setting tells the box how many votes it needs before choosing. If the box uses stimulations, +it must receive either the target or non target stimulation to consider a state has been voted. +Additionaly, the box waits each state to be voted the correct number of times to take a decision. + * |OVP_DocEnd_BoxAlgorithm_VotingClassifier_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_VotingClassifier_Setting2| +If the box uses stimulations, this settings tells what stimulation reflects that the state is active. + * |OVP_DocEnd_BoxAlgorithm_VotingClassifier_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_VotingClassifier_Setting3| +If the box uses stimulations, this settings tells what stimulation reflects that the state is inactive. + * |OVP_DocEnd_BoxAlgorithm_VotingClassifier_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_VotingClassifier_Setting4| +In case no choice can be made (for example, there are more than one state with the highest score), the +voting classifier can choose to reject the vote and send a specific stimulation for this. This is more +likely to happen when the box works on stimulation better than streamed matrix. You can force this box +to choose using the 6th setting. + * |OVP_DocEnd_BoxAlgorithm_VotingClassifier_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_VotingClassifier_Setting5| +This stimulation is used as a basis for the stimulations to send when a state is selected. First +state being selected would send exactly this stimulation. Second state would send this +stimulation + 1 etc. + * |OVP_DocEnd_BoxAlgorithm_VotingClassifier_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_VotingClassifier_Setting6| +This setting can force the box to choose a state even if more than one state have the highest score. +In such case, there won't be any rejection. The way the box decides between the ex-aequo candidates +is undefined. + * |OVP_DocEnd_BoxAlgorithm_VotingClassifier_Setting6| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_VotingClassifier_Examples| +This box is used in the P300 speller and the P300 magic card BCIs. Please see those +scenarios in the sample openvibe-scenarios. + * |OVP_DocEnd_BoxAlgorithm_VotingClassifier_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_VotingClassifier_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_VotingClassifier_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/Doc_BoxAlgorithm_ClassifierProcessor.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/Doc_BoxAlgorithm_ClassifierProcessor.rst new file mode 100644 index 0000000..34f4baa --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/Doc_BoxAlgorithm_ClassifierProcessor.rst @@ -0,0 +1,101 @@ +.. _Doc_BoxAlgorithm_ClassifierProcessor: + +Classifier processor +==================== + +.. container:: attribution + + :Author: + Yann Renard, Guillaume Serriere + :Company: + INRIA/IRISA + +.. image:: images/Doc_BoxAlgorithm_ClassifierProcessor.png + +Classifies incoming feature vectors using a previously learned classifier. + +The *Classifier Processor* box is a generic box for classifying data (feature vectors). +It works in conjunction with the :ref:`Doc_BoxAlgorithm_ClassifierTrainer` box. +This box' role is to expose a generic interface to the rest of the BCI pipeline. The +vectors to classify are forwarded to an algorithm or a structure of algorithms depending on what is +described in the loaded configuration file. The behavior is simple: at initialization phase, the classification +structure is initialized and its configuration is loaded from the configuration file. Then each time this box +receives a new feature vector, it is forwarded to the classification algorithm that classifies it. The box gets the algorithm +status and the actual class value and translates this information to its output. The predicted class is sent out in +the form of a stimulation and the algorithm status is sent in the form a streamed matrix. The stimulation can be generically +interpreted by the rest of the pipeline but it is important to understand that each classification algorithm is +free to report whatever it wants in its "status matrix". Consequently, the use of this output stream will be +dependent on the chosen classification algorithm. For example, the LDA classifier sends the hyperplane distance +value as its status. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Features", "Feature vector" + "Commands", "Stimulations" + +Features +~~~~~~~~ + +This input should be connected to the feature vector stream to classify. Each time a new feature vector arrives, +a classification process will be triggered. Consequently, a classification stimulation will be sent on the +first output of this box. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Labels", "Stimulations" + "Hyperplane distance", "Streamed matrix" + "Probability values", "Streamed matrix" + +Labels +~~~~~~ + +This output will contain the classification stimulations. Each time a new feature vector arrives to this box, +a new classification process is triggered, resulting in the generation of the corresponding class stimulation. + +Hyperplane distance +~~~~~~~~~~~~~~~~~~~ + +This output reflects the classification algorithm status in the form of a matrix of value. This output will contain one or several distances +to an hyperplane if the classifier provide it. If not, the matrix will have 0 dimension. The format of this output directly depend on +the classification algorithm and of the strategy used by the processor box. + +Probability values +~~~~~~~~~~~~~~~~~~ + +This output reflects the classification algorithm status in the form of a matrix of value. This output will contains one or several probabilities +for a data to be on a class if the classifier provide it. If not, the matrix will have 0 dimension. The format of this output directly depend on +the classification algorithm and of the strategy used by the processor box. + +.. _Doc_BoxAlgorithm_ClassifierProcessor_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Filename to load configuration from", "Filename", "" + +Filename to load configuration from +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This setting points to the configuration file of the box generated by the +:ref:`Doc_BoxAlgorithm_ClassifierTrainer` box. Its syntax depends on the selected algorithm. + +.. _Doc_BoxAlgorithm_ClassifierProcessor_Examples: + +Examples +-------- + +This box is used in BCI pipelines in order to classify cerebral activity states. For a detailed scenario using this +box and its associated :ref:`Doc_BoxAlgorithm_ClassifierTrainer`, please see the **motor imagary** +BCI scenario in the sample scenarios. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/Doc_BoxAlgorithm_ClassifierTrainer.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/Doc_BoxAlgorithm_ClassifierTrainer.rst new file mode 100644 index 0000000..a028452 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/Doc_BoxAlgorithm_ClassifierTrainer.rst @@ -0,0 +1,321 @@ +.. _Doc_BoxAlgorithm_ClassifierTrainer: + +Classifier trainer +================== + +.. container:: attribution + + :Author: + Yann Renard, Guillaume Serriere + :Company: + INRIA/IRISA + +.. image:: images/Doc_BoxAlgorithm_ClassifierTrainer.png + +Performs classifier training with cross-validation -based error estimation + +The *Classifier Trainer* box is a generic box for training models to classify input data. +It works in conjunction with the :ref:`Doc_BoxAlgorithm_ClassifierProcessor` box. +This box' role is to expose a generic interface to the rest of the BCI pipelines. The box +will generate an internal structure according to the multiclass strategy and the learning +algorithm selected. + +The behavior is simple, the box collects a number of feature vectors. Those feature vectors +are labelled depending on the input they arrive on. When a specific stimulation arrives, a training +process is triggered. This process can take some time so this box should be used offline. Depending on the +settings you enter, you will be able to perform a k-fold test to estimate the accuracy of the learned +classifier. When this training stimulation is received, the box generates a configuration file that will +be usable online by the :ref:`Doc_BoxAlgorithm_ClassifierProcessor` box. +Finally, the box outputs a particular stimulation (OVTK_StimulationId_TrainCompleted) +on its output, that can be used to trigger further treatments in the scenario. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Stimulations", "Stimulations" + "Features for class 1", "Feature vector" + "Features for class 2", "Feature vector" + +This box can have a variable number of inputs. If you need more than two classes, feel free to add more +inputs and to use a proper strategy/classifier combination to handle more than two classes. + +Stimulations +~~~~~~~~~~~~ + +The first input receives a stimulation stream. Only one stimulation of this stream is important, the one +that triggers the training process. When this stimulation is received, all the feature vectors are labelled +and sent to the classification algorithm. The training is triggered and executed. Then the classification +algorithm generates a configuration file that will be used online by the :ref:`Doc_BoxAlgorithm_ClassifierProcessor` box. + +Features for class 1 +~~~~~~~~~~~~~~~~~~~~ + +This input receives the feature vector for the first class. + +Features for class 2 +~~~~~~~~~~~~~~~~~~~~ + +This input receives the feature vector for the second class. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Train-completed Flag", "Stimulations" + +Train-completed Flag +~~~~~~~~~~~~~~~~~~~~ + +The stimulation OVTK_StimulationId_TrainCompleted is raised on this output when the classifier trainer has finished its job. + +.. _Doc_BoxAlgorithm_ClassifierTrainer_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Train trigger", "Stimulation", "OVTK_StimulationId_Train" + "Filename to save configuration to", "Filename", "${Path_UserData}/my-classifier.xml" + "Multiclass strategy to apply", "Classification strategy", "Native" + "Class 1 label", "Stimulation", "OVTK_StimulationId_Label_01" + "Class 2 label", "Stimulation", "OVTK_StimulationId_Label_02" + "Algorithm to use", "Classification algorithm", "Linear Discrimimant Analysis (LDA)" + "Use shrinkage", "Boolean", "false" + "Shrinkage coefficient (-1 == auto)", "Float", "-1.000000" + "Shrinkage: Force diagonal cov (DDA)", "Boolean", "false" + "Number of partitions for k-fold cross-validation test", "Integer", "10" + "Balance classes", "Boolean", "false" + +The number of settings of this box can vary depending on the classification algorithm you choose. Such algorithm +could have specific input OpenViBE::Kernel::IParameter objects (see OpenViBE::Kernel::IAlgorithmProxy for details). If +the type of those parameters is simple enough to be handled in the GUI, then additional settings will be added to this box. +**After switching a strategy or a classifier, you will have to close and re-open the settings configuration dialog to see the parameters of the new classifier.** Supported parameter types are : Integers, Floats, Enumerations, Booleans. The documentation for those +parameters can not be done in this page because it is impossible to know at this time what classifier thus what hyper +parameters you will have available. This will depend on the classification algorihtms that are be implemented in OpenViBE. + +Train trigger +~~~~~~~~~~~~~ + +The stimulation that triggers the training process and save the learned classifier to disk. + +Filename to save configuration to +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This setting points to the configuration file where to save the result of the training for later online use. This +configuration file is used by the :ref:`Doc_BoxAlgorithm_ClassifierProcessor` box. Its syntax +depends on the selected algorithm. + +Multiclass strategy to apply +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This setting is the strategy to use. You can choose any registered ``OVTK_TypeId_ClassificationStrategy`` +strategy you want. + +Class 1 label +~~~~~~~~~~~~~ + +This is the stimulation to send when the classifier algorithm detects a class-1 feature vector + +Class 2 label +~~~~~~~~~~~~~ + +This is the stimulation to send when the classifier algorithm detects a class-2 feature vector + +Algorithm to use +~~~~~~~~~~~~~~~~ + +This setting is the classifier to use. You can choose any registered ``OVTK_TypeId_ClassifierAlgorithm`` +algorithm you want. + +Number of partitions for k-fold cross-validation test +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you want to perform a k-fold test, you should enter something else than 0 or 1 here. A k-fold test generally gives +a better estimate of the classifiers accuracy than naive testing with the training data. The classifier may overfit +the training data, and get a good accuracy with the observed data, but not be able to generalize to unseen data. +In cross-validation, the idea is to divide the set of feature vectors in a number of partitions. The classification algorithm +is trained on some of the partitions and its accuracy is tested on the others. However, the classifier produced by the box is +the classifier trained with the whole data. The cross-validation is only an error estimation tool, it does not affect +the resulting model. See the miscellaneous section for details on how the k-fold test is done in this box, and possible +caveats about the cross-validation procedure. + +Balance classes +~~~~~~~~~~~~~~~ + +If the number of class labels is unbalanced, the classifiers tend to be biased towards the majority labels. +This option can be used to resample the dataset to feature all classes equally. + +The algorithm first looks how many examples there are in the majority class. Lets say this is n. Then, if class k has m examples, +it will random sample n-m examples with replacement from class k, appending them to the dataset. This will be done for each class. +In the end, each class will have n examples and all except the majority class will have some duplicate training vectors. +This can be seen as a technique to weight the importance of examples for such classifiers that do not support setting example weights +or class weight prior, and can in general be attempted with arbitrary learning algorithms. + +Enabling this option may make sense if the box is used for incremental learning, where all classes may not be equally represented +in the training data obtained so far, even if the design itself is balanced. Note that enabling this will make the cross-validation +results optimistic. In most conditions, the feature should be disabled. + +.. _Doc_BoxAlgorithm_ClassifierTrainer_Examples: + +Examples +-------- + +This box is used in BCI pipelines in order to classify cerebral activity states. For a detailed scenario using this +box and its associated :ref:`Doc_BoxAlgorithm_ClassifierProcessor`, please see the **motor imagary** +BCI scenario in the sample scenarios. An even more simple tutorial with artificial data +is available in the **box-tutorials/** folder. + +.. _Doc_BoxAlgorithm_ClassifierTrainer_Miscellaneous: + +Miscellaneous +------------- + +The box supports various multiclass strategies and classifiers as plugins. + +\par Available strategy: +Strategy refers to how feature vectors are routed to one or more classifiers, which possibly can handle only 2 classes themselves. + +\par Native +Use the classifier training algorithm without a pairwise strategy. All the data is passed to a single classifier trainer. + +\par One Vs All +Use a pairwise strategy which consists of training each class against all the others, creating n classifiers for n classes. + +\par One vs One +Use a airwise strategy which trains one classifier for each pair of classes. Then we use a decision startegy to extract the most likely class. There are three differents decision strategy: +\li Voting: method based on a simple majority voting process +\li HT: method described in: Hastie, Trevor ; Tibshirani, Robert. Classification by pairwise coupling. The Annals of Statistics 26 (1998), no. 2, 451--471 +\li PKPD: method describe in: Price, S. Knerr, L. Personnaz, and G. Dreyfus. Pairwise neural network classifiers with probabilistic outputs. In G. Tesauro, D. Touretzky, and T. Leen (eds.) +Advances in Neural Information Processing Systems 7 (NIPS-94), pp. 1109-1116. MIT Press, 1995. +You cannot use every algorithm with every decision strategy, but the interface will restain the choice according to your selection. + +\par Available classifiers: + +\par Support Vector Machine (SVM) +A well-known classifier supporting non-linear classification via kernels. The implementation is based on LIBSVM 2.91, which is included in the OpenViBE source tree. The parameters exposed in the GUI correspond to LIBSVM parameters. For more information on LIBSVM, see here. +\par +This algorithm provides only probabilities. + +\par Linear Discriminant Analysis (LDA) +A simple and fast linear classifier. For description, see any major textbook on Machine Learning or Statistics (e.g. Duda, Hart & Stork, or Hastie, Tibshirani & Friedman). This algorithm can be used with a regularized covariance matrix +according to a method proposed by Ledoit & Wolf: "A Well-Conditioned Estimator for Large-Dimensional Covariance Matrices", 2004. +The Linear Discriminant Analysis has the following options. +\par +\li Use shrinkage: Use a classic or a regularized covariance matrix. +\li Shrinkage: A value s between [0,1] sets a linear weight between dataCov and priorCov. I.e. cov=(1-s)\*dataCov+s\*priorCov. +Value <0 is used to auto-estimate the shrinking coefficient (default). If var(x) is a vector of empirical variances of all data dimensions, priorCov is a +diagonal matrix with a single value mean(var(x)) pasted on its diagonal. Used only if use shrinkage is checked. +\li Force diagonal cov (DDA): This sets the nondiagonal entries of the covariance matrices to zero. Used only if Use shrinkage is checked. +\par +Note that setting shrinkage to 0 should get you the regular LDA behavior. If you additionally force the covariance to be diagonal, you should get a model resembling the Naive Bayes classifier. +\par +This algorithm provides both hyperplane distance and probabilities. + +\par Multilayer Perceptron (MLP) +A classifier algorithm which relies on an artificial neural network (Laurent Bougrain. Practical introduction to artificial neural networks. IFAC symposium on automation in Mining, Mineral and Metal Processing - +MMM'04, Sep 2004, Nancy, France, 6 p, 2004.). In OpenViBE, the MLP is a 2-layer neural network. The hyperbolic tangent is the activation function of the +neurons inside the hidden layer. The network is trained using the backpropagation of the gradient. During the training, 80% of the training set is used to compute the gradient, +and 20% is used to validate the new model. The different weights and biases are updated only once per iteration (just before the validation). A coefficient alpha (learning coefficient) is used to moderate the importance of +the modification of weights and biases to avoid oscillations. The learning stops when the difference of the error per element (computed during validation) of two consecutive iterations is under the value epsilon given as a parameter. +\par +\li Number of neurons in hidden layer: number of neurons that will be used in the hidden layer. +\li Learning stop condition : the epsilon value used to stop the learning +\li Learning coefficient: a coefficient which influence the speed of learning. The smaller the coefficient is, the longer the learning will take, the more chance you will have to get a good solution. +\par +Note that feature vectors are normalized between -1 and 1 (using the min/max of the training set) to avoid saturation of the hyperbolic tangent. +\par +This algorithm provides both hyperplane distance (identity of output layer) and probabilites (softmax function on output layer). + +\par Cross Validation + +In this section, we will detail how the k-fold test is implemented in this box. For the k-fold test to be performed, you +have to choose more than 1 partition in the related settings. Suppose you chose ``n`` partitions. Then when trigger stimulation +is received, the feature vector set is splitted in ``n`` consecutive segments. The classification algorithm is trained on +``n-1`` of those segments and tested on the last one. This is performed for each segment. + +For example, suppose you have 5 partitions of feature vectors (``FVs)`` + +.. code:: + + +------+ +------+ +------+ +------+ +------+ + | FVs1 | | FVs2 | | FVs3 | | FVs4 | | FVs5 | + +------+ +------+ +------+ +------+ +------+ + +For the first training, a feature vector set is built form the ``FVs2,`` ``FVs3,`` ``FVs4,`` ``FVs5.`` The classifier algorithm +is trained on this feature vector set. Then the classifier is tested on the ``FVs1`` : + +.. code:: + + +------+ +---------------------------------+ + | FVs1 | | Training Feature Vector Set 1 | + +------+ +---------------------------------+ + +Then, a feature vector set is built form the ``FVs1,`` ``FVs3,`` ``FVs4,`` ``FVs5.`` The classifier algorithm +is trained on this feature vector set. Then the classifier is tested on the ``FVs2`` : + +.. code:: + + +-------+ +------+ +------------------------+ + | Train | | FVs2 | | ing Feat. Vector Set 2 | + +-------+ +------+ +------------------------+ + +The same process if performed on all the partitions : + +.. code:: + + +---------------+ +------+ +---------------+ + |Training Featur| | FVs3 | |e Vector Set 3 | + +---------------+ +------+ +---------------+ + +------------------------+ +------+ +------+ + |Training Feature Vector | | FVs4 | |Set 4 | + +------------------------+ +------+ +------+ + +---------------------------------+ +------+ + | Training Feature Vector Set 5 | | FVs5 | + +---------------------------------+ +------+ + +Important things to consider : + +- The more partitions you have, the more feature vectors you have in your training sets... and the less examples + +you'll have to test on. This means that the result of the test will probably be less reliable. + +In conclusion, be careful when choosing this k-fold test setting. Typical value range from 4 partitions (train on 75% of the feature vectors and +test on 25% - 4 times) to 10 partitions (train on 90% of the feature vectors and test on 10% - 10 times). + +Note that the cross-validation performed by the classifier trainer box in OpenViBE may be optimistic. +The cross-validation computation is working as it should, but it cannot take into account what happens outside +the classifier trainer box. In OpenViBE scenarios, there may be e.g. time overlap from epoching, feature +vectors drawn from the same epoch ending up in the same cross-validation partition, and (supervised) +preprocessing such as CSP or xDAWN potentially overfitting the data before its given to the classifier trainer. +Such situations are not compatible with the theoretical assumption that the feature vectors are +independent and identically distributed (the typical iid assumption in machine learning) across +train and test. To do cross-validation controlling for such issues, we have provided +a more advanced cross-validation tutorial as part of the OpenViBE web documentation. + +\par Confusion Matrices + +At the end of the training, the box will print one or two confusion matrices, depending if cross-validation +was used: one matrix for the cross-validation, the other for the training data. Each matrix will contain true +class as rows, and predicted class as columns. The diagonal describes the percentage of correct predictions per class. +Although the matrix can be optimistic (see above section about the cross-validation), it may give useful +diagnostic information. For example, if the accuracy is very skewed towards one class, this may indicate +a problem if the design is supposed to be balanced. The problem may originate e.g. from the original data +source, the signal processing chains for the different classes, or the classifier learning algorithm. These need +then to be investigated. Also, if very low accuracies are observed in these matrices, it may give reason +to suspect that prediction accuracies on fresh data might be likewise lacking -- or worse. + +\par Incremental Learning + +The box can also be used for simple incremental (online) learning. To achieve this, simply send the box the training +stimulation and it will train a classifier with all the data it has received so far. You can give it more +feature vectors later, and trigger the learning again by sending another stimulation. Likewise, the corresponding +classifier processor box can be made to load new classifiers during playback. With classifiers like LDA, +this practice is usually feasible when the data is reasonably sized (as in basic motor imagery). + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/Doc_BoxAlgorithm_VotingClassifier.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/Doc_BoxAlgorithm_VotingClassifier.rst new file mode 100644 index 0000000..5228b7e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/Doc_BoxAlgorithm_VotingClassifier.rst @@ -0,0 +1,132 @@ +.. _Doc_BoxAlgorithm_VotingClassifier: + +Voting Classifier +================= + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA + +.. image:: images/Doc_BoxAlgorithm_VotingClassifier.png + +Each classifier used as input is assumed to have its own two-class output stream. Mainly designed for P300 scenario use. + +The purpose of this simple classifier is to choose between multiple two class classifiers which +one mostly fits a condition. For example imagine ``n`` states. Each of those states can be either active +or inactive. Additionally, imagine you want only one active state at a time. Then you can have ``n`` +two-class classifiers telling for each state if it is active or not, and a following voting classifier +that chooses which of those states is the *most active*. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Classification result 1", "Stimulations" + "Classification result 2", "Stimulations" + +You can add as many inputs as you need depending on the number of preceeding states. + +The inputs of this classifier can be changed to either streamed matrix of stimulations. + +In the case you choose stimulations, each active stimulation gives a point +to the preceeding state. Both an inactive and a reject stimulation gives no point. +Any other stimulation is ignored. +After a number of repetitions, the state with the best score is chosen. + +In the case you choose streamed matrix, the matrix must have only one +element. This element is used as a score coefficient (in place of the simple 1-0 of the previous +case). After a number of repetitions, the state with the best score is chosen. + +Classification result 1 +~~~~~~~~~~~~~~~~~~~~~~~ + +Input stream for the first state. + +Classification result 2 +~~~~~~~~~~~~~~~~~~~~~~~ + +Input stream for the second state. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Classification choice", "Stimulations" + +Classification choice +~~~~~~~~~~~~~~~~~~~~~ + +This output sends a new stimulation as soon as the classifier received the correct number of votes +from the preceeding states. The output stimulation is based on the 5th setting of the box. First +state being selected would send exactly this stimulation. Second state would send this +stimulation + 1 etc. + +.. _Doc_BoxAlgorithm_VotingClassifier_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Number of repetitions", "Integer", "12" + "Target class label", "Stimulation", "OVTK_StimulationId_Target" + "Non target class label", "Stimulation", "OVTK_StimulationId_NonTarget" + "Reject class label", "Stimulation", "OVTK_StimulationId_Label_00" + "Result class label base", "Stimulation", "OVTK_StimulationId_Label_01" + "Choose one if ex-aequo", "Boolean", "false" + +Number of repetitions +~~~~~~~~~~~~~~~~~~~~~ + +This setting tells the box how many votes it needs before choosing. If the box uses stimulations, +it must receive either the target or non target stimulation to consider a state has been voted. +Additionaly, the box waits each state to be voted the correct number of times to take a decision. + +Target class label +~~~~~~~~~~~~~~~~~~ + +If the box uses stimulations, this settings tells what stimulation reflects that the state is active. + +Non target class label +~~~~~~~~~~~~~~~~~~~~~~ + +If the box uses stimulations, this settings tells what stimulation reflects that the state is inactive. + +Reject class label +~~~~~~~~~~~~~~~~~~ + +In case no choice can be made (for example, there are more than one state with the highest score), the +voting classifier can choose to reject the vote and send a specific stimulation for this. This is more +likely to happen when the box works on stimulation better than streamed matrix. You can force this box +to choose using the 6th setting. + +Result class label base +~~~~~~~~~~~~~~~~~~~~~~~ + +This stimulation is used as a basis for the stimulations to send when a state is selected. First +state being selected would send exactly this stimulation. Second state would send this +stimulation + 1 etc. + +Choose one if ex-aequo +~~~~~~~~~~~~~~~~~~~~~~ + +This setting can force the box to choose a state even if more than one state have the highest score. +In such case, there won't be any rejection. The way the box decides between the ex-aequo candidates +is undefined. + +.. _Doc_BoxAlgorithm_VotingClassifier_Examples: + +Examples +-------- + +This box is used in the *P300 speller* and the *P300 magic card* BCIs. Please see those +scenarios in the sample *openvibe-scenarios*. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/images/Doc_BoxAlgorithm_ClassifierProcessor.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/images/Doc_BoxAlgorithm_ClassifierProcessor.png new file mode 100644 index 0000000..6ce4aa8 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/images/Doc_BoxAlgorithm_ClassifierProcessor.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/images/Doc_BoxAlgorithm_ClassifierTrainer.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/images/Doc_BoxAlgorithm_ClassifierTrainer.png new file mode 100644 index 0000000..936a75d Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/images/Doc_BoxAlgorithm_ClassifierTrainer.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/images/Doc_BoxAlgorithm_VotingClassifier.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/images/Doc_BoxAlgorithm_VotingClassifier.png new file mode 100644 index 0000000..ec7bc23 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/doc/boxes/images/Doc_BoxAlgorithm_VotingClassifier.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierLDA.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierLDA.cpp new file mode 100644 index 0000000..ba7eb16 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierLDA.cpp @@ -0,0 +1,423 @@ +#include "ovpCAlgorithmClassifierLDA.h" + +#if defined TARGET_HAS_ThirdPartyEIGEN + +#include +#include +#include + +#include + +#include + +#include "../algorithms/ovpCAlgorithmConditionedCovariance.h" + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + +static const char* const TYPE_NODE_NAME = "LDA"; +static const char* const CLASSES_NODE_NAME = "Classes"; +//static const char* const COEFFICIENTS_NODE_NAME = "Weights"; +//static const char* const BIAS_DISTANCE_NODE_NAME = "Bias-distance"; +//static const char* const COEFFICIENT_PROBABILITY_NODE_NAME = "Coefficient-probability"; +static const char* const COMPUTATION_HELPERS_CONFIGURATION_NODE = "Class-config-list"; +static const char* const LDA_CONFIG_FILE_VERSION_ATTRIBUTE_NAME = "version"; + +extern const char* const CLASSIFIER_ROOT; + +int LDAClassificationCompare(CMatrix& first, CMatrix& second) +{ + //We first need to find the best classification of each. + double* buffer = first.getBuffer(); + const double maxFirst = *(std::max_element(buffer, buffer + first.getBufferElementCount())); + + buffer = second.getBuffer(); + const double maxSecond = *(std::max_element(buffer, buffer + second.getBufferElementCount())); + + //Then we just compared them + if (OVFloatEqual(maxFirst, maxSecond)) { return 0; } + if (maxFirst > maxSecond) { return -1; } + return 1; +} + + +#define LDA_DEBUG 0 +#if LDA_DEBUG +void CAlgorithmClassifierLDA::dumpMatrix(ILogManager &rMgr, const MatrixXdRowMajor &mat, const CString &desc) +{ + rMgr << Kernel::LogLevel_Info << desc << "\n"; + for (int i = 0 ; i < mat.rows() ; i++) + { + rMgr << Kernel::LogLevel_Info << "Row " << i << ": "; + for (int j = 0 ; j < mat.cols() ; j++) { rMgr << mat(i,j) << " "; } + rMgr << "\n"; + } +} +#else +void CAlgorithmClassifierLDA::dumpMatrix(Kernel::ILogManager& /* rMgr */, const MatrixXdRowMajor& /*mat*/, const CString& /*desc*/) { } +#endif + +bool CAlgorithmClassifierLDA::initialize() +{ + // Initialize the Conditioned Covariance Matrix algorithm + m_covAlgorithm = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_ConditionedCovariance)); + + OV_ERROR_UNLESS_KRF(m_covAlgorithm->initialize(), "Failed to initialize covariance algorithm", Kernel::ErrorType::Internal); + + // This is the weight parameter local to this module and automatically exposed to the GUI. Its redirected to the corresponding parameter of the cov alg. + Kernel::TParameterHandler ip_shrinkage(this->getInputParameter(OVP_Algorithm_ClassifierLDA_InputParameterId_Shrinkage)); + ip_shrinkage.setReferenceTarget(m_covAlgorithm->getInputParameter(OVP_Algorithm_ConditionedCovariance_InputParameterId_Shrinkage)); + + Kernel::TParameterHandler ip_diagonalCov(this->getInputParameter(OVP_Algorithm_ClassifierLDA_InputParameterId_DiagonalCov)); + ip_diagonalCov = false; + + Kernel::TParameterHandler op_configuration(this->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Config)); + op_configuration = nullptr; + + return CAlgorithmClassifier::initialize(); +} + +bool CAlgorithmClassifierLDA::uninitialize() +{ + OV_ERROR_UNLESS_KRF(m_covAlgorithm->uninitialize(), "Failed to uninitialize covariance algorithm", Kernel::ErrorType::Internal); + + this->getAlgorithmManager().releaseAlgorithm(*m_covAlgorithm); + + return CAlgorithmClassifier::uninitialize(); +} + +bool CAlgorithmClassifierLDA::train(const Toolkit::IFeatureVectorSet& dataset) +{ + OV_ERROR_UNLESS_KRF(this->initializeExtraParameterMechanism(), "Failed to unitialize extra parameters", Kernel::ErrorType::Internal); + + //We need to clear list because a instance of this class should support more that one training. + m_labels.clear(); + m_discriminantFunctions.clear(); + + const bool useShrinkage = this->getBooleanParameter(OVP_Algorithm_ClassifierLDA_InputParameterId_UseShrinkage); + + bool diagonalCov; + if (useShrinkage) + { + this->getDoubleParameter(OVP_Algorithm_ClassifierLDA_InputParameterId_Shrinkage); + diagonalCov = this->getBooleanParameter(OVP_Algorithm_ClassifierLDA_InputParameterId_DiagonalCov); + } + else + { + //If we don't use shrinkage we need to set lambda to 0. + Kernel::TParameterHandler ip_shrinkage(this->getInputParameter(OVP_Algorithm_ClassifierLDA_InputParameterId_Shrinkage)); + ip_shrinkage = 0.0; + + Kernel::TParameterHandler ip_diagonalCov(this->getInputParameter(OVP_Algorithm_ClassifierLDA_InputParameterId_DiagonalCov)); + ip_diagonalCov = false; + diagonalCov = false; + } + + OV_ERROR_UNLESS_KRF(this->uninitializeExtraParameterMechanism(), "Failed to ininitialize extra parameters", Kernel::ErrorType::Internal); + + // IO to the covariance alg + Kernel::TParameterHandler op_mean(m_covAlgorithm->getOutputParameter(OVP_Algorithm_ConditionedCovariance_OutputParameterId_Mean)); + Kernel::TParameterHandler op_covMatrix(m_covAlgorithm->getOutputParameter(OVP_Algorithm_ConditionedCovariance_OutputParameterId_CovarianceMatrix)); + Kernel::TParameterHandler ip_dataset(m_covAlgorithm->getInputParameter(OVP_Algorithm_ConditionedCovariance_InputParameterId_FeatureVectorSet)); + + const size_t nRows = dataset.getFeatureVectorCount(); + const size_t nCols = (nRows > 0 ? dataset[0].getSize() : 0); + this->getLogManager() << Kernel::LogLevel_Debug << "Feature set input dims [" << dataset.getFeatureVectorCount() << "x" << nCols << "]\n"; + + OV_ERROR_UNLESS_KRF(nRows != 0 && nCols != 0, "Input data has a zero-size dimension, dims = [" << nRows << "x" << nCols << "]", + Kernel::ErrorType::BadInput); + + // The max amount of classes to be expected + Kernel::TParameterHandler ip_pNClasses(this->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_NClasses)); + m_nClasses = size_t(ip_pNClasses); + + // Count the classes actually present + std::vector nClasses; + nClasses.resize(m_nClasses); + + for (size_t i = 0; i < dataset.getFeatureVectorCount(); ++i) + { + size_t classIdx = size_t(dataset[i].getLabel()); + nClasses[classIdx]++; + } + + // Get class labels + for (size_t i = 0; i < m_nClasses; ++i) + { + m_labels.push_back(i); + m_discriminantFunctions.push_back(CAlgorithmLDADiscriminantFunction()); + } + + // Per-class means and a global covariance are used to form the LDA model + std::vector classMeans(m_nClasses); + Eigen::MatrixXd globalCov = Eigen::MatrixXd::Zero(nCols, nCols); + + // We need the means per class + for (size_t classIdx = 0; classIdx < m_nClasses; classIdx++) + { + if (nClasses[classIdx] > 0) + { + // const double label = m_labels[l_classIdx]; + const size_t examplesInClass = nClasses[classIdx]; + + // Copy all the data of the class to a matrix + CMatrix classData; + classData.resize(examplesInClass, nCols); + double* buffer = classData.getBuffer(); + for (size_t i = 0; i < nRows; ++i) + { + if (dataset[i].getLabel() == classIdx) + { + memcpy(buffer, dataset[i].getBuffer(), nCols * sizeof(double)); + buffer += nCols; + } + } + + // Get the mean out of it + Eigen::Map dataMapper(classData.getBuffer(), examplesInClass, nCols); + const Eigen::MatrixXd classMean = dataMapper.colwise().mean().transpose(); + classMeans[classIdx] = classMean; + } + else + { + Eigen::MatrixXd tmp; + tmp.resize(nCols, 1); + tmp.setZero(); + classMeans[classIdx] = tmp; + } + } + + // We need a global covariance, use the regularized cov algorithm + { + ip_dataset->resize(nRows, nCols); + double* buffer = ip_dataset->getBuffer(); + + // Insert all data as the input of the cov algorithm + for (size_t i = 0; i < nRows; ++i) + { + memcpy(buffer, dataset[i].getBuffer(), nCols * sizeof(double)); + buffer += nCols; + } + + // Compute cov + if (!m_covAlgorithm->process()) { OV_ERROR_KRF("Global covariance computation failed", Kernel::ErrorType::Internal); } + + // Get the results from the cov algorithm + Eigen::Map covMapper(op_covMatrix->getBuffer(), nCols, nCols); + globalCov = covMapper; + } + + //dumpMatrix(this->getLogManager(), mean[l_classIdx], "Mean"); + //dumpMatrix(this->getLogManager(), globalCov, "Shrinked cov"); + + if (diagonalCov) + { + for (size_t i = 0; i < nCols; ++i) + { + for (size_t j = i + 1; j < nCols; ++j) + { + globalCov(i, j) = 0.0; + globalCov(j, i) = 0.0; + } + } + } + + // Get the pseudoinverse of the global cov using eigen decomposition for self-adjoint matrices + const double tolerance = 1e-10; + Eigen::SelfAdjointEigenSolver solver; + solver.compute(globalCov); + Eigen::VectorXd eigenValues = solver.eigenvalues(); + for (size_t i = 0; i < nCols; ++i) { if (eigenValues(i) >= tolerance) { eigenValues(i) = 1.0 / eigenValues(i); } } + const Eigen::MatrixXd globalCovInv = solver.eigenvectors() * eigenValues.asDiagonal() * solver.eigenvectors().inverse(); + + // const MatrixXd globalCovInv = globalCov.inverse(); + //We send the bias and the weight of each class to ComputationHelper + for (size_t i = 0; i < getClassCount(); ++i) + { + const double examplesInClass = nClasses[i]; + if (examplesInClass > 0) + { + const size_t totalExamples = dataset.getFeatureVectorCount(); + + // This formula e.g. in Hastie, Tibshirani & Friedman: "Elements...", 2nd ed., p. 109 + const Eigen::VectorXd weigth = (globalCovInv * classMeans[i]); + const Eigen::MatrixXd inter = -0.5 * classMeans[i].transpose() * globalCovInv * classMeans[i]; + const double bias = inter(0, 0) + std::log(examplesInClass / totalExamples); + + this->getLogManager() << Kernel::LogLevel_Debug << "Bias for " << i << " is " << bias << ", from " << examplesInClass / totalExamples + << ", " << examplesInClass << "/" << totalExamples << ", int = " << inter(0, 0) << "\n"; + // dumpMatrix(this->getLogManager(), perClassMeans[i], "Means"); + + m_discriminantFunctions[i].setWeight(weigth); + m_discriminantFunctions[i].setBias(bias); + } + else { this->getLogManager() << Kernel::LogLevel_Debug << "Class " << i << " has no examples\n"; } + } + + // Hack for classes with zero examples, give them valid models but such that will always lose + size_t nonZeroClassIdx = 0; + for (size_t i = 0; i < getClassCount(); ++i) + { + if (nClasses[i] > 0) + { + nonZeroClassIdx = i; + break; + } + } + for (size_t i = 0; i < getClassCount(); ++i) + { + if (nClasses[i] == 0) + { + m_discriminantFunctions[i].setWeight(m_discriminantFunctions[nonZeroClassIdx].getWeight()); + m_discriminantFunctions[i].setBias(m_discriminantFunctions[nonZeroClassIdx].getBias() - 1.0); // Will always lose to the orig + } + } + + m_nCols = nCols; + + // Debug output + //dumpMatrix(this->getLogManager(), globalCov, "Global cov"); + //dumpMatrix(this->getLogManager(), eigenValues, "Eigenvalues"); + //dumpMatrix(this->getLogManager(), eigenSolver.eigenvectors(), "Eigenvectors"); + //dumpMatrix(this->getLogManager(), globalCovInv, "Global cov inverse"); + //dumpMatrix(this->getLogManager(), m_coefficients, "Hyperplane weights"); + + return true; +} + +bool CAlgorithmClassifierLDA::classify(const Toolkit::IFeatureVector& sample, double& classId, Toolkit::IVector& distance, Toolkit::IVector& probability) +{ + OV_ERROR_UNLESS_KRF(!m_discriminantFunctions.empty(), "LDA discriminant function list is empty", Kernel::ErrorType::BadConfig); + + OV_ERROR_UNLESS_KRF(sample.getSize() == m_discriminantFunctions[0].getNWeight(), + "Classifier expected " << m_discriminantFunctions[0].getNWeight() << " features, got " << sample.getSize(), + Kernel::ErrorType::BadInput); + + const Eigen::Map featureVec(const_cast(sample.getBuffer()), sample.getSize()); + const Eigen::VectorXd weights = featureVec; + const size_t nClass = getClassCount(); + + std::vector buffer(nClass); + std::vector probabBuffer(nClass); + //We ask for all computation helper to give the corresponding class value + for (size_t i = 0; i < nClass; ++i) { buffer[i] = m_discriminantFunctions[i].getValue(weights); } + + //p(Ck | x) = exp(ak) / sum[j](exp (aj)) + // with aj = (Weight for class j).transpose() * x + (Bias for class j) + + //Exponential can lead to nan results, so we reduce the computation and instead compute + // p(Ck | x) = 1 / sum[j](exp(aj - ak)) + + //All ak are given by computation helper + errno = 0; + for (size_t i = 0; i < nClass; ++i) + { + double expSum = 0.; + for (size_t j = 0; j < nClass; ++j) { expSum += exp(buffer[j] - buffer[i]); } + probabBuffer[i] = 1 / expSum; + // std::cout << "p " << i << " = " << probabilityValue[i] << ", v=" << valueArray[i] << ", " << errno << "\n"; + } + + //Then we just find the highest probability and take it as a result + const size_t classIdx = size_t(std::distance(buffer.begin(), std::max_element(buffer.begin(), buffer.end()))); + + distance.setSize(nClass); + probability.setSize(nClass); + + for (size_t i = 0; i < nClass; ++i) + { + distance[i] = buffer[i]; + probability[i] = probabBuffer[i]; + } + + classId = m_labels[classIdx]; + + return true; +} + +XML::IXMLNode* CAlgorithmClassifierLDA::saveConfig() +{ + XML::IXMLNode* algorithmNode = XML::createNode(TYPE_NODE_NAME); + algorithmNode->addAttribute(LDA_CONFIG_FILE_VERSION_ATTRIBUTE_NAME, "1"); + + // Write the classifier to an .xml + std::stringstream classes; + + for (size_t i = 0; i < getClassCount(); ++i) { classes << m_labels[i] << " "; } + + //Only new version should be recorded so we don't need to test + XML::IXMLNode* helpersConfig = XML::createNode(COMPUTATION_HELPERS_CONFIGURATION_NODE); + for (size_t i = 0; i < m_discriminantFunctions.size(); ++i) { helpersConfig->addChild(m_discriminantFunctions[i].getConfiguration()); } + + XML::IXMLNode* tmpNode = XML::createNode(CLASSES_NODE_NAME); + tmpNode->setPCData(classes.str().c_str()); + algorithmNode->addChild(tmpNode); + algorithmNode->addChild(helpersConfig); + + return algorithmNode; +} + + +//Extract a double from the PCDATA of a node +double getFloatFromNode(XML::IXMLNode* pNode) +{ + std::stringstream ss(pNode->getPCData()); + double res; + ss >> res; + return res; +} + +bool CAlgorithmClassifierLDA::loadConfig(XML::IXMLNode* configNode) +{ + OV_ERROR_UNLESS_KRF(configNode->hasAttribute(LDA_CONFIG_FILE_VERSION_ATTRIBUTE_NAME), + "Invalid model: model trained with an obsolete version of LDA", Kernel::ErrorType::BadConfig); + + m_labels.clear(); + m_discriminantFunctions.clear(); + + XML::IXMLNode* tmpNode = configNode->getChildByName(CLASSES_NODE_NAME); + + OV_ERROR_UNLESS_KRF(tmpNode != nullptr, "Failed to retrieve xml node", Kernel::ErrorType::BadParsing); + + loadClassesFromNode(tmpNode); + + + //We send corresponding data to the computation helper + XML::IXMLNode* configsNode = configNode->getChildByName(COMPUTATION_HELPERS_CONFIGURATION_NODE); + + for (size_t i = 0; i < configsNode->getChildCount(); ++i) + { + m_discriminantFunctions.push_back(CAlgorithmLDADiscriminantFunction()); + m_discriminantFunctions[i].loadConfig(configsNode->getChild(i)); + } + + return true; +} + +void CAlgorithmClassifierLDA::loadClassesFromNode(XML::IXMLNode* node) +{ + std::stringstream ss(node->getPCData()); + double value; + while (ss >> value) { m_labels.push_back(value); } + m_nClasses = m_labels.size(); +} + +//Load the weight vector +void CAlgorithmClassifierLDA::loadCoefsFromNode(XML::IXMLNode* node) +{ + std::stringstream ss(node->getPCData()); + + std::vector coefs; + double value; + while (ss >> value) { coefs.push_back(value); } + + m_weights.resize(1, coefs.size()); + m_nCols = coefs.size(); + for (size_t i = 0; i < coefs.size(); ++i) { m_weights(0, i) = coefs[i]; } +} + +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyEIGEN diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierLDA.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierLDA.h new file mode 100644 index 0000000..219ca8c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierLDA.h @@ -0,0 +1,98 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyEIGEN + +#include "../ovp_defines.h" +#include "ovpCAlgorithmLDADiscriminantFunction.h" +#include +#include + +#include + +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { +class CAlgorithmLDADiscriminantFunction; + +int LDAClassificationCompare(CMatrix& first, CMatrix& second); + +typedef Eigen::Matrix MatrixXdRowMajor; + +class CAlgorithmClassifierLDA final : public Toolkit::CAlgorithmClassifier +{ +public: + bool initialize() override; + bool uninitialize() override; + bool train(const Toolkit::IFeatureVectorSet& dataset) override; + bool classify(const Toolkit::IFeatureVector& sample, double& classId, Toolkit::IVector& distance, Toolkit::IVector& probability) override; + XML::IXMLNode* saveConfig() override; + bool loadConfig(XML::IXMLNode* configNode) override; + size_t getNProbabilities() override { return m_discriminantFunctions.size(); } + size_t getNDistances() override { return m_discriminantFunctions.size(); } + + _IsDerivedFromClass_Final_(CAlgorithmClassifier, OVP_ClassId_Algorithm_ClassifierLDA) + +protected: + // Debug method. Prints the matrix to the logManager. May be disabled in implementation. + static void dumpMatrix(Kernel::ILogManager& pMgr, const MatrixXdRowMajor& mat, const CString& desc); + + std::vector m_labels; + std::vector m_discriminantFunctions; + + Eigen::MatrixXd m_coefficients; + Eigen::MatrixXd m_weights; + double m_biasDistance = 0; + double m_w0 = 0; + + size_t m_nCols = 0; + size_t m_nClasses = 0; + + Kernel::IAlgorithmProxy* m_covAlgorithm = nullptr; + +private: + void loadClassesFromNode(XML::IXMLNode* node); + void loadCoefsFromNode(XML::IXMLNode* node); + + size_t getClassCount() const { return m_nClasses; } +}; + +class CAlgorithmClassifierLDADesc final : public Toolkit::CAlgorithmClassifierDesc +{ +public: + void release() override { } + CString getName() const override { return CString("LDA Classifier"); } + CString getAuthorName() const override { return CString("Jussi T. Lindgren / Guillaume Serrière"); } + CString getAuthorCompanyName() const override { return CString("Inria / Loria"); } + CString getShortDescription() const override { return CString("Estimates LDA using regularized or classic covariances"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString(""); } + CString getVersion() const override { return CString("2.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_ClassifierLDA; } + IPluginObject* create() override { return new CAlgorithmClassifierLDA; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_ClassifierLDA_InputParameterId_UseShrinkage, "Use shrinkage", Kernel::ParameterType_Boolean); + prototype.addInputParameter(OVP_Algorithm_ClassifierLDA_InputParameterId_DiagonalCov, "Shrinkage: Force diagonal cov (DDA)", + Kernel::ParameterType_Boolean); + prototype.addInputParameter(OVP_Algorithm_ClassifierLDA_InputParameterId_Shrinkage, "Shrinkage coefficient (-1 == auto)", Kernel::ParameterType_Float); + + CAlgorithmClassifierDesc::getAlgorithmPrototype(prototype); + return true; + } + + _IsDerivedFromClass_Final_(CAlgorithmClassifierDesc, OVP_ClassId_Algorithm_ClassifierLDADesc) +}; +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE + + +#endif // TARGET_HAS_ThirdPartyEIGEN diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierNULL.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierNULL.cpp new file mode 100644 index 0000000..e2395fe --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierNULL.cpp @@ -0,0 +1,60 @@ +#include "ovpCAlgorithmClassifierNULL.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + + +bool CAlgorithmClassifierNULL::initialize() +{ + Kernel::TParameterHandler ip_bParameter1(this->getInputParameter(OVP_Algorithm_ClassifierNULL_InputParameterId_Parameter1)); + Kernel::TParameterHandler ip_Parameter2(this->getInputParameter(OVP_Algorithm_ClassifierNULL_InputParameterId_Parameter2)); + Kernel::TParameterHandler ip_parameter3(this->getInputParameter(OVP_Algorithm_ClassifierNULL_InputParameterId_Parameter3)); + + ip_bParameter1 = true; + ip_Parameter2 = 3.141592654; + ip_parameter3 = OVTK_StimulationId_Label_00; + + Kernel::TParameterHandler op_configuration(this->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Config)); + op_configuration = nullptr; + + return CAlgorithmClassifier::initialize(); +} + +bool CAlgorithmClassifierNULL::train(const Toolkit::IFeatureVectorSet& /*featureVectorSet*/) +{ + Kernel::TParameterHandler ip_bParameter1(this->getInputParameter(OVP_Algorithm_ClassifierNULL_InputParameterId_Parameter1)); + Kernel::TParameterHandler ip_Parameter2(this->getInputParameter(OVP_Algorithm_ClassifierNULL_InputParameterId_Parameter2)); + Kernel::TParameterHandler ip_parameter3(this->getInputParameter(OVP_Algorithm_ClassifierNULL_InputParameterId_Parameter3)); + + OV_WARNING_K("Parameter 1 : " << ip_bParameter1); + OV_WARNING_K("Parameter 2 : " << ip_Parameter2); + OV_WARNING_K("Parameter 3 : " << ip_parameter3); + + return true; +} + +bool CAlgorithmClassifierNULL::classify(const Toolkit::IFeatureVector& /*featureVector*/, double& classId, Toolkit::IVector& distance, Toolkit::IVector& probability) +{ + classId = 1 + (rand() % 3); + + distance.setSize(1); + probability.setSize(1); + if (classId == 1) + { + distance[0] = -1; + probability[0] = 1; + } + else + { + distance[0] = 1; + probability[0] = 0; + } + return true; +} +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierNULL.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierNULL.h new file mode 100644 index 0000000..3619eb9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierNULL.h @@ -0,0 +1,59 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { +class CAlgorithmClassifierNULL final : public Toolkit::CAlgorithmClassifier +{ +public: + + CAlgorithmClassifierNULL() { } + bool initialize() override; + bool train(const Toolkit::IFeatureVectorSet& featureVectorSet) override; + bool classify(const Toolkit::IFeatureVector& featureVector, double& classId, Toolkit::IVector& distance, Toolkit::IVector& probability) override; + XML::IXMLNode* saveConfig() override { return nullptr; } + bool loadConfig(XML::IXMLNode* /*configurationNode*/) override { return true; } + size_t getNProbabilities() override { return 1; } + size_t getNDistances() override { return 1; } + + _IsDerivedFromClass_Final_(CAlgorithmClassifier, OVP_ClassId_Algorithm_ClassifierNULL) +}; + +class CAlgorithmClassifierNULLDesc final : public Toolkit::CAlgorithmClassifierDesc +{ +public: + void release() override { } + CString getName() const override { return CString("NULL Classifier (does nothing)"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Samples"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_ClassifierNULL; } + IPluginObject* create() override { return new CAlgorithmClassifierNULL; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CAlgorithmClassifierDesc::getAlgorithmPrototype(prototype); + prototype.addInputParameter(OVP_Algorithm_ClassifierNULL_InputParameterId_Parameter1, "Parameter 1", Kernel::ParameterType_Boolean); + prototype.addInputParameter(OVP_Algorithm_ClassifierNULL_InputParameterId_Parameter2, "Parameter 2", Kernel::ParameterType_Float); + prototype.addInputParameter(OVP_Algorithm_ClassifierNULL_InputParameterId_Parameter3, "Parameter 3", Kernel::ParameterType_Enumeration, + OV_TypeId_Stimulation); + return true; + } + + _IsDerivedFromClass_Final_(CAlgorithmClassifierDesc, OVP_ClassId_Algorithm_ClassifierNULLDesc) +}; +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierOneVsAll.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierOneVsAll.cpp new file mode 100755 index 0000000..57e0cbd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierOneVsAll.cpp @@ -0,0 +1,317 @@ +#include "ovpCAlgorithmClassifierOneVsAll.h" + +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + +static const char* const TYPE_NODE_NAME = "OneVsAll"; +static const char* const SUB_CLASSIFIER_IDENTIFIER_NODE_NAME = "SubClassifierIdentifier"; +static const char* const ALGORITHM_ID_ATTRIBUTE = "algorithm-id"; +static const char* const SUB_CLASSIFIER_COUNT_NODE_NAME = "SubClassifierCount"; +static const char* const SUB_CLASSIFIERS_NODE_NAME = "SubClassifiers"; +//static const char* const SUB_CLASSIFIER_NODE_NAME = "SubClassifier"; + +typedef std::pair CIMatrixPointerPair; +typedef std::pair CClassifierOutput; + +bool CAlgorithmClassifierOneVsAll::initialize() +{ + Kernel::TParameterHandler op_Config(this->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Config)); + op_Config = nullptr; + + return CAlgorithmPairingStrategy::initialize(); +} + +bool CAlgorithmClassifierOneVsAll::uninitialize() +{ + while (!m_subClassifiers.empty()) { this->removeClassifierAtBack(); } + return CAlgorithmPairingStrategy::uninitialize(); +} + +bool CAlgorithmClassifierOneVsAll::train(const Toolkit::IFeatureVectorSet& dataset) +{ + const size_t nClass = m_subClassifiers.size(); + std::map classLabels; + + for (size_t i = 0; i < dataset.getFeatureVectorCount(); ++i) + { + if (!classLabels.count(dataset[i].getLabel())) { classLabels[dataset[i].getLabel()] = 0; } + classLabels[dataset[i].getLabel()]++; + } + + OV_ERROR_UNLESS_KRF(classLabels.size() == nClass, + "Invalid samples count for [" << classLabels.size() << "] classes (expected samples for " << nClass << " classes)", + Kernel::ErrorType::BadConfig); + + //We set the CMatrix fo the first classifier + const size_t size = dataset[0].getSize(); + Kernel::TParameterHandler reference(m_subClassifiers[0]->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_FeatureVectorSet)); + reference->resize(dataset.getFeatureVectorCount(), size + 1); + + double* buffer = reference->getBuffer(); + for (size_t j = 0; j < dataset.getFeatureVectorCount(); ++j) + { + memcpy(buffer, dataset[j].getBuffer(), size * sizeof(double)); + //We let the space for the label + buffer += (size + 1); + } + + //And then we just change adapt the label for each feature vector but we don't copy them anymore + for (size_t c = 0; c < m_subClassifiers.size(); ++c) + { + Kernel::TParameterHandler ip_dataset(m_subClassifiers[c]->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_FeatureVectorSet)); + ip_dataset = static_cast(reference); + + buffer = ip_dataset->getBuffer(); + for (size_t j = 0; j < dataset.getFeatureVectorCount(); ++j) + { + //Modify the class of each featureVector + const double classLabel = dataset[j].getLabel(); + if (size_t(classLabel) == c) { buffer[size] = 0; } + else { buffer[size] = 1; } + buffer += (size + 1); + } + + m_subClassifiers[c]->process(OVTK_Algorithm_Classifier_InputTriggerId_Train); + } + return true; +} + +bool CAlgorithmClassifierOneVsAll::classify(const Toolkit::IFeatureVector& sample, double& classId, Toolkit::IVector& distance, Toolkit::IVector& probability) +{ + std::vector classification; + + const size_t size = sample.getSize(); + + for (size_t i = 0; i < m_subClassifiers.size(); ++i) + { + Kernel::IAlgorithmProxy* subClassifier = this->m_subClassifiers[i]; + Kernel::TParameterHandler ip_sample(subClassifier->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_FeatureVector)); + Kernel::TParameterHandler op_class(subClassifier->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Class)); + Kernel::TParameterHandler op_values(subClassifier->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_ClassificationValues)); + Kernel::TParameterHandler op_probabilities(subClassifier->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_ProbabilityValues)); + ip_sample->resize(size); + + double* buffer = ip_sample->getBuffer(); + memcpy(buffer, sample.getBuffer(), size * sizeof(double)); + subClassifier->process(OVTK_Algorithm_Classifier_InputTriggerId_Classify); + + CMatrix* probabilities = static_cast(op_probabilities); + //If the algorithm give a probability we take it, instead we take the first value + if (probabilities->getDimensionCount() != 0) { classification.push_back(CClassifierOutput(double(op_class), probabilities)); } + else { classification.push_back(CClassifierOutput(double(op_class), static_cast(op_values))); } + this->getLogManager() << Kernel::LogLevel_Debug << i << " " << double(op_class) << " " << double((*op_probabilities)[0]) << " " << double( + (*op_probabilities)[1]) << "\n"; + } + + //Now, we determine the best classification + CClassifierOutput best = CClassifierOutput(-1.0, static_cast(nullptr)); + classId = -1; + + for (size_t i = 0; i < classification.size(); ++i) + { + CClassifierOutput& tmp = classification[i]; + if (int(tmp.first) == 0) // Predicts its "own" class, class=0 + { + if (best.second == nullptr) + { + best = tmp; + classId = double(i); + } + else + { + if ((*m_fAlgorithmComparison)((*best.second), *(tmp.second)) > 0) + { + best = tmp; + classId = double(i); + } + } + } + } + + //If no one recognize the class, let's take the more relevant + if (int(classId) == -1) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Unable to find a class in first instance\n"; + for (size_t nClassification = 0; nClassification < classification.size(); ++nClassification) + { + CClassifierOutput& tmp = classification[nClassification]; + if (best.second == nullptr) + { + best = tmp; + classId = (double(nClassification)); + } + else + { + //We take the one that is the least like the second class + if ((*m_fAlgorithmComparison)((*best.second), *(tmp.second)) < 0) + { + best = tmp; + classId = nClassification; + } + } + } + } + + OV_ERROR_UNLESS_KRF(best.second != nullptr, "Unable to find a class for feature vector", Kernel::ErrorType::BadProcessing); + + // Now that we made the calculation, we send the corresponding data + + // For distances we just send the distance vector of the winner + Kernel::IAlgorithmProxy* winner = this->m_subClassifiers[size_t(classId)]; + Kernel::TParameterHandler op_winnerValues(winner->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_ClassificationValues)); + CMatrix* tmpMatrix = static_cast(op_winnerValues); + distance.setSize(tmpMatrix->getBufferElementCount()); + memcpy(distance.getBuffer(), tmpMatrix->getBuffer(), tmpMatrix->getBufferElementCount() * sizeof(double)); + + // We take the probabilities of the single class winning from each of the sub classifiers and normalize them + double sum = 0; + probability.setSize(m_subClassifiers.size()); + for (size_t i = 0; i < m_subClassifiers.size(); ++i) + { + Kernel::TParameterHandler op_Probabilities(m_subClassifiers[i]->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_ProbabilityValues)); + probability[i] = op_Probabilities->getBuffer()[0]; + sum += probability[i]; + } + + for (size_t i = 0; i < probability.getSize(); ++i) { probability[i] /= sum; } + + return true; +} + +bool CAlgorithmClassifierOneVsAll::addNewClassifierAtBack() +{ + const CIdentifier subClassifierAlgorithm = this->getAlgorithmManager().createAlgorithm(this->m_subClassifierAlgorithmID); + + OV_ERROR_UNLESS_KRF(subClassifierAlgorithm != CIdentifier::undefined(), + "Invalid classifier identifier [" << this->m_subClassifierAlgorithmID.str() << "]", Kernel::ErrorType::BadConfig); + + Kernel::IAlgorithmProxy* subClassifier = &this->getAlgorithmManager().getAlgorithm(subClassifierAlgorithm); + subClassifier->initialize(); + + Kernel::TParameterHandler ip_nClasses(subClassifier->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_NClasses)); + ip_nClasses = 2; + + //Set a references to the extra parameters input of the pairing strategy + Kernel::TParameterHandler*> ip_params(subClassifier->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_ExtraParameter)); + ip_params.setReferenceTarget(this->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_ExtraParameter)); + + this->m_subClassifiers.push_back(subClassifier); + + return true; +} + +void CAlgorithmClassifierOneVsAll::removeClassifierAtBack() +{ + Kernel::IAlgorithmProxy* subClassifier = m_subClassifiers.back(); + subClassifier->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*subClassifier); + this->m_subClassifiers.pop_back(); +} + +bool CAlgorithmClassifierOneVsAll::designArchitecture(const CIdentifier& id, const size_t nClass) +{ + if (!this->setSubClassifierIdentifier(id)) { return false; } + for (size_t i = 0; i < nClass; ++i) { if (!this->addNewClassifierAtBack()) { return false; } } + return true; +} + +XML::IXMLNode* CAlgorithmClassifierOneVsAll::getClassifierConfig(Kernel::IAlgorithmProxy* classifier) +{ + Kernel::TParameterHandler op_config(classifier->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Config)); + classifier->process(OVTK_Algorithm_Classifier_InputTriggerId_SaveConfig); + XML::IXMLNode* res = op_config; + return res; +} + +XML::IXMLNode* CAlgorithmClassifierOneVsAll::saveConfig() +{ + XML::IXMLNode* oneVsAllNode = XML::createNode(TYPE_NODE_NAME); + + XML::IXMLNode* tempNode = XML::createNode(SUB_CLASSIFIER_IDENTIFIER_NODE_NAME); + tempNode->addAttribute(ALGORITHM_ID_ATTRIBUTE, this->m_subClassifierAlgorithmID.str().c_str()); + tempNode->setPCData( + this->getTypeManager().getEnumerationEntryNameFromValue(OVTK_TypeId_ClassificationAlgorithm, m_subClassifierAlgorithmID.id()).toASCIIString()); + oneVsAllNode->addChild(tempNode); + + tempNode = XML::createNode(SUB_CLASSIFIER_COUNT_NODE_NAME); + tempNode->setPCData(std::to_string(getClassCount()).c_str()); + oneVsAllNode->addChild(tempNode); + + XML::IXMLNode* subClassifersNode = XML::createNode(SUB_CLASSIFIERS_NODE_NAME); + + //We now add configuration of each subclassifiers + for (size_t i = 0; i < m_subClassifiers.size(); ++i) { subClassifersNode->addChild(getClassifierConfig(m_subClassifiers[i])); } + oneVsAllNode->addChild(subClassifersNode); + + return oneVsAllNode; +} + +bool CAlgorithmClassifierOneVsAll::loadConfig(XML::IXMLNode* configNode) +{ + XML::IXMLNode* tempNode = configNode->getChildByName(SUB_CLASSIFIER_IDENTIFIER_NODE_NAME); + CIdentifier id; + id.fromString(tempNode->getAttribute(ALGORITHM_ID_ATTRIBUTE)); + if (m_subClassifierAlgorithmID != id) + { + while (!m_subClassifiers.empty()) { this->removeClassifierAtBack(); } + if (!this->setSubClassifierIdentifier(id)) + { + //if the sub classifier doesn't have comparison function it is an error + return false; + } + } + + tempNode = configNode->getChildByName(SUB_CLASSIFIER_COUNT_NODE_NAME); + std::stringstream countData(tempNode->getPCData()); + uint64_t nClass; + countData >> nClass; + + while (nClass != getClassCount()) + { + if (nClass < getClassCount()) { this->removeClassifierAtBack(); } + else { if (!this->addNewClassifierAtBack()) { return false; } } + } + + return loadSubClassifierConfig(configNode->getChildByName(SUB_CLASSIFIERS_NODE_NAME)); +} + +size_t CAlgorithmClassifierOneVsAll::getNDistances() +{ + Kernel::TParameterHandler op_distances(m_subClassifiers[0]->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_ClassificationValues)); + return op_distances->getDimensionSize(0); +} + +bool CAlgorithmClassifierOneVsAll::loadSubClassifierConfig(XML::IXMLNode* node) +{ + for (size_t i = 0; i < node->getChildCount(); ++i) + { + XML::IXMLNode* subClassifierNode = node->getChild(i); + Kernel::TParameterHandler ip_config(m_subClassifiers[i]->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_Config)); + ip_config = subClassifierNode; + + OV_ERROR_UNLESS_KRF(m_subClassifiers[i]->process(OVTK_Algorithm_Classifier_InputTriggerId_LoadConfig), + "Unable to load the configuration of the classifier " << i + 1, Kernel::ErrorType::Internal); + } + return true; +} + +bool CAlgorithmClassifierOneVsAll::setSubClassifierIdentifier(const CIdentifier& id) +{ + m_subClassifierAlgorithmID = id; + m_fAlgorithmComparison = Toolkit::getClassificationComparisonFunction(id); + + OV_ERROR_UNLESS_KRF(m_fAlgorithmComparison != nullptr, + "No comparison function found for classifier [" << m_subClassifierAlgorithmID.str() << "]", Kernel::ErrorType::ResourceNotFound); + + return true; +} + +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierOneVsAll.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierOneVsAll.h new file mode 100644 index 0000000..84764df --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierOneVsAll.h @@ -0,0 +1,70 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { +class CAlgorithmClassifierOneVsAll final : public Toolkit::CAlgorithmPairingStrategy +{ +public: + bool initialize() override; + bool uninitialize() override; + bool train(const Toolkit::IFeatureVectorSet& dataset) override; + bool classify(const Toolkit::IFeatureVector& sample, double& classId, Toolkit::IVector& distance, Toolkit::IVector& probability) override; + bool designArchitecture(const CIdentifier& id, const size_t nClass) override; + XML::IXMLNode* saveConfig() override; + bool loadConfig(XML::IXMLNode* configNode) override; + size_t getNProbabilities() override { return m_subClassifiers.size(); } + size_t getNDistances() override; + + _IsDerivedFromClass_Final_(Toolkit::CAlgorithmPairingStrategy, OVP_ClassId_Algorithm_ClassifierOneVsAll) + + +private: + static XML::IXMLNode* getClassifierConfig(Kernel::IAlgorithmProxy* classifier); + bool addNewClassifierAtBack(); + void removeClassifierAtBack(); + bool setSubClassifierIdentifier(const CIdentifier& id); + size_t getClassCount() const { return m_subClassifiers.size(); } + + bool loadSubClassifierConfig(XML::IXMLNode* node); + + std::vector m_subClassifiers; + fClassifierComparison m_fAlgorithmComparison = nullptr; +}; + +class CAlgorithmClassifierOneVsAllDesc final : public Toolkit::CAlgorithmPairingStrategyDesc +{ +public: + void release() override { } + CString getName() const override { return CString("OneVsAll pairing classifier"); } + CString getAuthorName() const override { return CString("Guillaume Serriere"); } + CString getAuthorCompanyName() const override { return CString("INRIA/Loria"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString(""); } + CString getVersion() const override { return CString("0.1"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_ClassifierOneVsAll; } + IPluginObject* create() override { return new CAlgorithmClassifierOneVsAll; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CAlgorithmPairingStrategyDesc::getAlgorithmPrototype(prototype); + return true; + } + + _IsDerivedFromClass_Final_(CAlgorithmPairingStrategyDesc, OVP_ClassId_Algorithm_ClassifierOneVsAllDesc) +}; +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierOneVsOne.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierOneVsOne.cpp new file mode 100755 index 0000000..187b564 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierOneVsOne.cpp @@ -0,0 +1,437 @@ +#include "ovpCAlgorithmClassifierOneVsOne.h" +#include "ovpCAlgorithmPairwiseDecision.h" + +#include +#include +#include +#include +#include + +extern const char* const CLASSIFIER_ROOT; + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + +static const char* const TYPE_NODE_NAME = "OneVsOne"; +static const char* const SUB_CLASSIFIER_IDENTIFIER_NODE_NAME = "SubClassifierIdentifier"; +static const char* const PAIRWISE_DECISION_NAME = "PairwiseDecision"; +static const char* const ALGORITHM_ID_ATTRIBUTE = "algorithm-id"; +static const char* const SUB_CLASSIFIER_COUNT_NODE_NAME = "SubClassifierCount"; +static const char* const SUB_CLASSIFIERS_NODE_NAME = "SubClassifiers"; +static const char* const SUB_CLASSIFIER_NODE_NAME = "SubClassifier"; +static const char* const FIRST_CLASS_ATRRIBUTE_NAME = "first-class"; +static const char* const SECOND_CLASS_ATTRIBUTE_NAME = "second-class"; + +//This map is used to record the decision strategies available for each algorithm +//std::map g_oDecisionMap; + +bool CAlgorithmClassifierOneVsOne::initialize() +{ + Kernel::TParameterHandler op_configuration(this->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Config)); + op_configuration = nullptr; + + Kernel::TParameterHandler ip_pPairwise(this->getInputParameter(OVP_Algorithm_OneVsOneStrategy_InputParameterId_DecisionType)); + ip_pPairwise = CIdentifier::undefined().id(); + + m_decisionStrategyAlgorithm = nullptr; + m_pairwiseDecisionID = CIdentifier::undefined(); + + return CAlgorithmPairingStrategy::initialize(); +} + +bool CAlgorithmClassifierOneVsOne::uninitialize() +{ + if (m_decisionStrategyAlgorithm != nullptr) + { + m_decisionStrategyAlgorithm->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_decisionStrategyAlgorithm); + m_decisionStrategyAlgorithm = nullptr; + } + + for (auto& kv : m_subClassifiers) + { + Kernel::IAlgorithmProxy* subClassifier = kv.second; + subClassifier->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*subClassifier); + } + this->m_subClassifiers.clear(); + + return CAlgorithmPairingStrategy::uninitialize(); +} + + +bool CAlgorithmClassifierOneVsOne::train(const Toolkit::IFeatureVectorSet& dataset) +{ + Kernel::TParameterHandler ip_nClasses(this->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_NClasses)); + m_nClasses = size_t(ip_nClasses); + + m_nSubClassifiers = m_nClasses * (m_nClasses - 1) / 2; + + createSubClassifiers(); + + //Create the decision strategy + OV_ERROR_UNLESS_KRF(this->initializeExtraParameterMechanism(), "Failed to initialize extra parameters", Kernel::ErrorType::Internal); + + m_pairwiseDecisionID = this->getEnumerationParameter( + OVP_Algorithm_OneVsOneStrategy_InputParameterId_DecisionType, OVP_TypeId_ClassificationPairwiseStrategy); + + OV_ERROR_UNLESS_KRF(m_pairwiseDecisionID != CIdentifier::undefined(), + "Invalid pairwise decision strategy [" << OVP_TypeId_ClassificationPairwiseStrategy.str() << "]", + Kernel::ErrorType::BadConfig); + + if (m_decisionStrategyAlgorithm != nullptr) + { + m_decisionStrategyAlgorithm->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_decisionStrategyAlgorithm); + m_decisionStrategyAlgorithm = nullptr; + } + m_decisionStrategyAlgorithm = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(m_pairwiseDecisionID)); + + OV_ERROR_UNLESS_KRF(m_decisionStrategyAlgorithm->initialize(), "Failed to unitialize decision strategy algorithm", Kernel::ErrorType::Internal); + + Kernel::TParameterHandler ip_classificationAlgorithm( + m_decisionStrategyAlgorithm->getInputParameter(OVP_Algorithm_Classifier_Pairwise_InputParameterId_AlgorithmIdentifier)); + ip_classificationAlgorithm = &m_subClassifierAlgorithmID; + Kernel::TParameterHandler ip_classCount(m_decisionStrategyAlgorithm->getInputParameter(OVP_Algorithm_Classifier_Pairwise_InputParameter_ClassCount)); + ip_classCount = m_nClasses; + + OV_ERROR_UNLESS_KRF(m_decisionStrategyAlgorithm->process(OVP_Algorithm_Classifier_Pairwise_InputTriggerId_Parameterize), + "Failed to run decision strategy algorithm", Kernel::ErrorType::Internal); + + OV_ERROR_UNLESS_KRF(this->uninitializeExtraParameterMechanism(), "Failed to uninitialize extra parameters", Kernel::ErrorType::Internal); + + //Calculate the amount of sample for each class + std::map classLabels; + for (size_t i = 0; i < dataset.getFeatureVectorCount(); ++i) + { + if (!classLabels.count(dataset[i].getLabel())) { classLabels[dataset[i].getLabel()] = 0; } + classLabels[dataset[i].getLabel()]++; + } + + OV_ERROR_UNLESS_KRF( + classLabels.size() == m_nClasses, + "There are samples for " << classLabels.size() << " classes but expected samples for " << m_nClasses << " classes.", + Kernel::ErrorType::BadConfig); + + //Now we create the corresponding repartition set + Kernel::TParameterHandler ip_pRepartitionSet = m_decisionStrategyAlgorithm->getInputParameter( + OVP_Algorithm_Classifier_Pairwise_InputParameterId_SetRepartition); + ip_pRepartitionSet->resize(m_nClasses); + + const size_t size = dataset[0].getSize(); + //Now let's train each classifier + for (size_t i = 0; i < m_nClasses; ++i) + { + ip_pRepartitionSet->getBuffer()[i] = double(classLabels[double(i)]); + + for (size_t j = i + 1; j < m_nClasses; ++j) + { + const size_t nFeature = classLabels[double(i)] + classLabels[double(j)]; + Kernel::IAlgorithmProxy* subClassifier = m_subClassifiers[std::pair(i, j)]; + + Kernel::TParameterHandler ip_dataset(subClassifier->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_FeatureVectorSet)); + ip_dataset->resize(nFeature, size + 1); + + double* buffer = ip_dataset->getBuffer(); + for (size_t k = 0; k < dataset.getFeatureVectorCount(); ++k) + { + const double tmp = dataset[k].getLabel(); + if (tmp == double(i) || tmp == double(j)) + { + memcpy(buffer, dataset[k].getBuffer(), size * sizeof(double)); + + buffer[size] = size_t(tmp) == i ? 0 : 1; + buffer += (size + 1); + } + } + + OV_ERROR_UNLESS_KRF( + subClassifier->process(OVTK_Algorithm_Classifier_InputTriggerId_Train), + "Failed to train subclassifier [1st class = " << i << ", 2nd class = " << j << "]", + Kernel::ErrorType::Internal); + } + } + return true; +} + +bool CAlgorithmClassifierOneVsOne::classify(const Toolkit::IFeatureVector& sample, double& classId, Toolkit::IVector& distance, Toolkit::IVector& probability) +{ + OV_ERROR_UNLESS_KRF(m_decisionStrategyAlgorithm, "No decision strategy algorithm set", Kernel::ErrorType::BadConfig); + + const size_t size = sample.getSize(); + std::vector classificationList; + + Kernel::TParameterHandler ip_proba = m_decisionStrategyAlgorithm->getInputParameter(OVP_Algorithm_Classifier_InputParameter_ProbabilityMatrix); + CMatrix* matrix = static_cast(ip_proba); + + matrix->resize(m_nClasses, m_nClasses); + + for (size_t i = 0; i < matrix->getBufferElementCount(); ++i) { matrix->getBuffer()[i] = 0.0; } + + //Let's generate the matrix of confidence score + for (size_t i = 0; i < m_nClasses; ++i) + { + for (size_t j = i + 1; j < m_nClasses; ++j) + { + Kernel::IAlgorithmProxy* tmp = m_subClassifiers[std::pair(i, j)]; + Kernel::TParameterHandler ip_sample(tmp->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_FeatureVector)); + Kernel::TParameterHandler op_values(tmp->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_ProbabilityValues)); + Kernel::TParameterHandler op_label(tmp->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Class)); + ip_sample->resize(size); + + double* buffer = ip_sample->getBuffer(); + memcpy(buffer, sample.getBuffer(), size * sizeof(double)); + tmp->process(OVTK_Algorithm_Classifier_InputTriggerId_Classify); + + classification_info_t classificationInfo = { double(i), double(j), op_label, op_values }; + classificationList.push_back(classificationInfo); + } + } + + // for (size_t i =0 ; i < nClass ; ++i ) + // { + // for (size_t j = 0; j < nClass ; ++j) { std::cout << matrix->getBuffer()[i*nClass + j] << " " ; } + // std::cout << std::endl; + // } + // std::cout << std::endl; + + Kernel::TParameterHandler*> ip_infos( + m_decisionStrategyAlgorithm->getInputParameter(OVP_Algorithm_Classifier_Pairwise_InputParameter_ClassificationOutputs)); + ip_infos = &classificationList; + + //Then ask to the strategy to make the decision + OV_ERROR_UNLESS_KRF(m_decisionStrategyAlgorithm->process(OVP_Algorithm_Classifier_Pairwise_InputTriggerId_Compute), "Failed to compute decision strategy", + Kernel::ErrorType::Internal); + + Kernel::TParameterHandler op_proba = m_decisionStrategyAlgorithm->getOutputParameter( + OVP_Algorithm_Classifier_OutputParameter_ProbabilityVector); + double maxProb = -1; + int selectedClassIdx = -1; + + distance.setSize(0); + probability.setSize(m_nClasses); + + //We just have to take the most relevant now. + for (size_t i = 0; i < m_nClasses; ++i) + { + const double tmp = op_proba->getBuffer()[i]; + if (tmp > maxProb) + { + selectedClassIdx = i; + maxProb = tmp; + } + probability[i] = tmp; + } + + classId = double(selectedClassIdx); + return true; +} + +bool CAlgorithmClassifierOneVsOne::createSubClassifiers() +{ + // Clear any previous ones + for (auto& kv : m_subClassifiers) + { + Kernel::IAlgorithmProxy* subClassifier = kv.second; + subClassifier->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*subClassifier); + } + this->m_subClassifiers.clear(); + + //Now let's instantiate all the sub classifiers + for (size_t firstClass = 0; firstClass < m_nClasses; ++firstClass) + { + for (size_t secondClass = firstClass + 1; secondClass < m_nClasses; ++secondClass) + { + const CIdentifier subClassifierAlgorithm = this->getAlgorithmManager().createAlgorithm(this->m_subClassifierAlgorithmID); + + OV_ERROR_UNLESS_KRF( + subClassifierAlgorithm != CIdentifier::undefined(), + "Unable to instantiate classifier for class [" << this->m_subClassifierAlgorithmID.str() << "]", + Kernel::ErrorType::BadConfig); + + Kernel::IAlgorithmProxy* subClassifier = &this->getAlgorithmManager().getAlgorithm(subClassifierAlgorithm); + subClassifier->initialize(); + + Kernel::TParameterHandler ip_pNClasses(subClassifier->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_NClasses)); + ip_pNClasses = 2; + + //Set a references to the extra parameters input of the pairing strategy + Kernel::TParameterHandler*> ip_params( + subClassifier->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_ExtraParameter)); + ip_params.setReferenceTarget(this->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_ExtraParameter)); + + m_subClassifiers[std::pair(firstClass, secondClass)] = subClassifier; + } + } + return true; +} + +bool CAlgorithmClassifierOneVsOne::designArchitecture(const CIdentifier& id, const size_t classCount) +{ + if (!setSubClassifierIdentifier(id)) { return false; } + m_nClasses = classCount; + return true; +} + +XML::IXMLNode* CAlgorithmClassifierOneVsOne::getClassifierConfig(const double firstClass, const double secondClass, Kernel::IAlgorithmProxy* subClassifier) +{ + XML::IXMLNode* res = XML::createNode(SUB_CLASSIFIER_NODE_NAME); + + std::stringstream ssFirstClass, ssSecondClass; + ssFirstClass << firstClass; + ssSecondClass << secondClass; + res->addAttribute(FIRST_CLASS_ATRRIBUTE_NAME, ssFirstClass.str().c_str()); + res->addAttribute(SECOND_CLASS_ATTRIBUTE_NAME, ssSecondClass.str().c_str()); + + Kernel::TParameterHandler op_config(subClassifier->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Config)); + subClassifier->process(OVTK_Algorithm_Classifier_InputTriggerId_SaveConfig); + res->addChild(static_cast(op_config)); + + return res; +} + +XML::IXMLNode* CAlgorithmClassifierOneVsOne::getPairwiseDecisionConfiguration() const +{ + if (!m_decisionStrategyAlgorithm) { return nullptr; } + + XML::IXMLNode* tmp = XML::createNode(PAIRWISE_DECISION_NAME); + + Kernel::TParameterHandler op_config(m_decisionStrategyAlgorithm->getOutputParameter(OVP_Algorithm_Classifier_Pairwise_OutputParameterId_Config)); + m_decisionStrategyAlgorithm->process(OVP_Algorithm_Classifier_Pairwise_InputTriggerId_SaveConfig); + tmp->addChild(static_cast(op_config)); + + tmp->addAttribute(ALGORITHM_ID_ATTRIBUTE, m_pairwiseDecisionID.str().c_str()); + + return tmp; +} + +XML::IXMLNode* CAlgorithmClassifierOneVsOne::saveConfig() +{ + std::stringstream nClassifier; + nClassifier << m_nSubClassifiers; + + XML::IXMLNode* oneVsOneNode = XML::createNode(TYPE_NODE_NAME); + + XML::IXMLNode* tmp = XML::createNode(SUB_CLASSIFIER_IDENTIFIER_NODE_NAME); + tmp->addAttribute(ALGORITHM_ID_ATTRIBUTE, this->m_subClassifierAlgorithmID.str().c_str()); + tmp->setPCData( + this->getTypeManager().getEnumerationEntryNameFromValue(OVTK_TypeId_ClassificationAlgorithm, m_subClassifierAlgorithmID.id()). + toASCIIString()); + oneVsOneNode->addChild(tmp); + + tmp = XML::createNode(SUB_CLASSIFIER_COUNT_NODE_NAME); + tmp->setPCData(nClassifier.str().c_str()); + oneVsOneNode->addChild(tmp); + + oneVsOneNode->addChild(this->getPairwiseDecisionConfiguration()); + + XML::IXMLNode* subClassifersNode = XML::createNode(SUB_CLASSIFIERS_NODE_NAME); + + for (auto& kv : m_subClassifiers) { subClassifersNode->addChild(getClassifierConfig(kv.first.first, kv.first.second, kv.second)); } + oneVsOneNode->addChild(subClassifersNode); + + return oneVsOneNode; +} + +bool CAlgorithmClassifierOneVsOne::loadConfig(XML::IXMLNode* configNode) +{ + XML::IXMLNode* tempNode = configNode->getChildByName(SUB_CLASSIFIER_IDENTIFIER_NODE_NAME); + + CIdentifier algorithmID; + algorithmID.fromString(tempNode->getAttribute(ALGORITHM_ID_ATTRIBUTE)); + + if (!this->setSubClassifierIdentifier(algorithmID)) + { + //if the sub classifier doesn't have comparison function it is an error + return false; + } + + tempNode = configNode->getChildByName(PAIRWISE_DECISION_NAME); + CIdentifier pairwiseID; + pairwiseID.fromString(tempNode->getAttribute(ALGORITHM_ID_ATTRIBUTE)); + if (pairwiseID != m_pairwiseDecisionID) + { + if (m_decisionStrategyAlgorithm != nullptr) + { + m_decisionStrategyAlgorithm->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_decisionStrategyAlgorithm); + m_decisionStrategyAlgorithm = nullptr; + } + m_pairwiseDecisionID = pairwiseID; + m_decisionStrategyAlgorithm = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(m_pairwiseDecisionID)); + m_decisionStrategyAlgorithm->initialize(); + } + Kernel::TParameterHandler ip_config(m_decisionStrategyAlgorithm->getInputParameter(OVP_Algorithm_Classifier_Pairwise_InputParameterId_Config)); + ip_config = tempNode->getChild(0); + + Kernel::TParameterHandler ip_algorithm( + m_decisionStrategyAlgorithm->getInputParameter(OVP_Algorithm_Classifier_Pairwise_InputParameterId_AlgorithmIdentifier)); + ip_algorithm = &algorithmID; + + tempNode = configNode->getChildByName(SUB_CLASSIFIER_COUNT_NODE_NAME); + std::stringstream ss(tempNode->getPCData()); + ss >> m_nSubClassifiers; + + // Invert the class count from subCls = numClass*(numClass-1)/2. + const size_t deltaCarre = 1 + 8 * m_nSubClassifiers; + m_nClasses = size_t((1 + sqrt(double(deltaCarre))) / 2); + + Kernel::TParameterHandler ip_classCount(m_decisionStrategyAlgorithm->getInputParameter(OVP_Algorithm_Classifier_Pairwise_InputParameter_ClassCount)); + ip_classCount = m_nClasses; + + OV_ERROR_UNLESS_KRF(m_decisionStrategyAlgorithm->process(OVP_Algorithm_Classifier_Pairwise_InputTriggerId_LoadConfig), + "Loading decision strategy configuration failed", Kernel::ErrorType::Internal); + + OV_ERROR_UNLESS_KRF(m_decisionStrategyAlgorithm->process(OVP_Algorithm_Classifier_Pairwise_InputTriggerId_Parameterize), + "Parameterizing decision strategy failed", Kernel::ErrorType::Internal); + + return loadSubClassifierConfig(configNode->getChildByName(SUB_CLASSIFIERS_NODE_NAME)); +} + +bool CAlgorithmClassifierOneVsOne::loadSubClassifierConfig(XML::IXMLNode* node) +{ + createSubClassifiers(); + + for (size_t i = 0; i < node->getChildCount(); ++i) + { + double firstClass, secondClass; + + //Now we have to restore class indexes + XML::IXMLNode* subClassifierNode = node->getChild(i); + std::stringstream ss1(subClassifierNode->getAttribute(FIRST_CLASS_ATRRIBUTE_NAME)); + ss1 >> firstClass; + std::stringstream ss2(subClassifierNode->getAttribute(SECOND_CLASS_ATTRIBUTE_NAME)); + ss2 >> secondClass; + + Kernel::IAlgorithmProxy* subClassifier = m_subClassifiers[std::make_pair(size_t(firstClass), size_t(secondClass))]; + + Kernel::TParameterHandler ip_config(subClassifier->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_Config)); + ip_config = subClassifierNode->getChild(0); + + OV_ERROR_UNLESS_KRF(subClassifier->process(OVTK_Algorithm_Classifier_InputTriggerId_LoadConfig), + "Unable to load the configuration for the sub-classifier " << i + 1, Kernel::ErrorType::Internal); + } + + OV_ERROR_UNLESS_KRF(m_subClassifiers.size() == m_nSubClassifiers, + "Invalid number of loaded classifiers [" << m_subClassifiers.size() << "] (expected = " << m_nSubClassifiers << ")", + Kernel::ErrorType::Internal); + + return true; +} + +bool CAlgorithmClassifierOneVsOne::setSubClassifierIdentifier(const CIdentifier& id) +{ + m_subClassifierAlgorithmID = id; + m_algorithmComparison = Toolkit::getClassificationComparisonFunction(id); + + OV_ERROR_UNLESS_KRF(m_algorithmComparison != nullptr, "No comparison function found for classifier " << m_subClassifierAlgorithmID.str(), + Kernel::ErrorType::ResourceNotFound); + + return true; +} + +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierOneVsOne.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierOneVsOne.h new file mode 100755 index 0000000..47192b8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierOneVsOne.h @@ -0,0 +1,96 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { +//The aim of this structure is to record informations returned by the sub-classifier. They will be used by +// pairwise decision algorithms to compute probability vector. +// Should be use only by OneVsOne and pairwise decision algorithm +typedef struct +{ + double firstClass; + double secondClass; + double classLabel; + //This output is probabilist + CMatrix* classificationValue; +} classification_info_t; + + +class CAlgorithmClassifierOneVsOne final : public Toolkit::CAlgorithmPairingStrategy +{ +public: + bool initialize() override; + bool uninitialize() override; + bool train(const Toolkit::IFeatureVectorSet& dataset) override; + bool classify(const Toolkit::IFeatureVector& sample, double& classId, Toolkit::IVector& distance, Toolkit::IVector& probability) override; + bool designArchitecture(const CIdentifier& id, const size_t classCount) override; + XML::IXMLNode* saveConfig() override; + bool loadConfig(XML::IXMLNode* configNode) override; + size_t getNProbabilities() override { return m_nClasses; } + size_t getNDistances() override { return 0; } + + _IsDerivedFromClass_Final_(Toolkit::CAlgorithmPairingStrategy, OVP_ClassId_Algorithm_ClassifierOneVsOne) + +protected: + + bool createSubClassifiers(); + +private: + size_t m_nClasses = 0; + size_t m_nSubClassifiers = 0; + + std::map, Kernel::IAlgorithmProxy*> m_subClassifiers; + fClassifierComparison m_algorithmComparison = nullptr; + + Kernel::IAlgorithmProxy* m_decisionStrategyAlgorithm = nullptr; + CIdentifier m_pairwiseDecisionID = CIdentifier::undefined(); + + static XML::IXMLNode* getClassifierConfig(double firstClass, double secondClass, Kernel::IAlgorithmProxy* subClassifier); + XML::IXMLNode* getPairwiseDecisionConfiguration() const; + + // size_t getClassCount() const; + + bool loadSubClassifierConfig(XML::IXMLNode* node); + + // SSubClassifierDescriptor& getSubClassifierDescriptor(const size_t FirstClass, const size_t SecondClass); + bool setSubClassifierIdentifier(const CIdentifier& id); +}; + +class CAlgorithmClassifierOneVsOneDesc final : public Toolkit::CAlgorithmPairingStrategyDesc +{ +public: + void release() override { } + CString getName() const override { return CString("OneVsOne pairing classifier"); } + CString getAuthorName() const override { return CString("Guillaume Serriere"); } + CString getAuthorCompanyName() const override { return CString("INRIA/Loria"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString(""); } + CString getVersion() const override { return CString("0.2"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_ClassifierOneVsOne; } + IPluginObject* create() override { return new CAlgorithmClassifierOneVsOne; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CAlgorithmPairingStrategyDesc::getAlgorithmPrototype(prototype); + prototype.addInputParameter(OVP_Algorithm_OneVsOneStrategy_InputParameterId_DecisionType, "Pairwise Decision Strategy", + Kernel::ParameterType_Enumeration, OVP_TypeId_ClassificationPairwiseStrategy); + return true; + } + + _IsDerivedFromClass_Final_(CAlgorithmPairingStrategyDesc, OVP_ClassId_Algorithm_ClassifierOneVsOneDesc) +}; +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmConditionedCovariance.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmConditionedCovariance.cpp new file mode 100644 index 0000000..02e012d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmConditionedCovariance.cpp @@ -0,0 +1,124 @@ +#include "ovpCAlgorithmConditionedCovariance.h" + +/* + * This implementation is based on the matlab code corresponding to + * + * Ledoit & Wolf: "A Well-Conditioned Estimator for Large-Dimensional Covariance Matrices", 2004. + * + */ +#if defined TARGET_HAS_ThirdPartyEIGEN +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + +#define COV_DEBUG 0 +#if COV_DEBUG +void CAlgorithmConditionedCovariance::dumpMatrix(Kernel::ILogManager &mgr, const MatrixXdRowMajor &mat, const CString &desc) +{ + mgr << Kernel::LogLevel_Info << desc << "\n"; + for (int i = 0 ; i < mat.rows() ; i++) + { + mgr << Kernel::LogLevel_Info << "Row " << i << ": "; + for (int j = 0 ; j < mat.cols() ; j++) { mgr << mat(i,j) << " "; } + mgr << "\n"; + } +} +#else +void CAlgorithmConditionedCovariance::dumpMatrix(Kernel::ILogManager& /* mgr */, const MatrixXdRowMajor& /*mat*/, const CString& /*desc*/) { } +#endif + +bool CAlgorithmConditionedCovariance::initialize() +{ + // Default value setting + Kernel::TParameterHandler ip_shrinkage(getInputParameter(OVP_Algorithm_ConditionedCovariance_InputParameterId_Shrinkage)); + ip_shrinkage = -1.0; + + return true; +} + +bool CAlgorithmConditionedCovariance::process() +{ + // Set up the IO + const Kernel::TParameterHandler ip_shrinkage(getInputParameter(OVP_Algorithm_ConditionedCovariance_InputParameterId_Shrinkage)); + const Kernel::TParameterHandler ip_sample(getInputParameter(OVP_Algorithm_ConditionedCovariance_InputParameterId_FeatureVectorSet)); + Kernel::TParameterHandler op_mean(getOutputParameter(OVP_Algorithm_ConditionedCovariance_OutputParameterId_Mean)); + Kernel::TParameterHandler op_covMatrix(getOutputParameter(OVP_Algorithm_ConditionedCovariance_OutputParameterId_CovarianceMatrix)); + double shrinkage = ip_shrinkage; + + OV_ERROR_UNLESS_KRF(shrinkage <= 1.0, "Invalid shrinkage value " << shrinkage << "(expected value <= 1.0)", Kernel::ErrorType::BadConfig); + + + OV_ERROR_UNLESS_KRF(ip_sample->getDimensionCount() == 2, + "Invalid dimension count for vector set " << ip_sample->getDimensionCount() << "(expected value = 2)", Kernel::ErrorType::BadInput); + + const size_t nRows = ip_sample->getDimensionSize(0); + const size_t nCols = ip_sample->getDimensionSize(1); + + OV_ERROR_UNLESS_KRF(nRows >= 1 && nCols >= 1, "Invalid input matrix [" << nRows << "x" << nCols << "] (expected at least 1x1 size)", + Kernel::ErrorType::BadInput); + + const double* buffer = ip_sample->getBuffer(); + + + OV_ERROR_UNLESS_KRF(buffer, "Invalid NULL feature set buffer", Kernel::ErrorType::BadInput); + + // Set the output buffers so we can write the results to them without copy + op_mean->resize(1, nCols); + op_covMatrix->resize(nCols, nCols); + + // Insert our data into an Eigen matrix. As Eigen doesn't have const double* constructor, we cast away the const. + const Eigen::Map dataMatrix(const_cast(buffer), nRows, nCols); + + // Estimate the data center and center the data + Eigen::Map dataMean(op_mean->getBuffer(), 1, nCols); + dataMean = dataMatrix.colwise().mean(); + const MatrixXdRowMajor dataCentered = dataMatrix.rowwise() - dataMean.row(0); + + // Compute the sample cov matrix + const Eigen::MatrixXd sampleCov = (dataCentered.transpose() * dataCentered) * (1 / double(nRows)); + + // Compute the prior cov matrix + Eigen::MatrixXd priorCov = Eigen::MatrixXd::Zero(nCols, nCols); + priorCov.diagonal().setConstant(sampleCov.diagonal().mean()); + + // Compute shrinkage coefficient if its not given + if (shrinkage < 0) + { + const Eigen::MatrixXd dataSquared = dataCentered.cwiseProduct(dataCentered); + const Eigen::MatrixXd phiMat = (dataSquared.transpose() * dataSquared) / double(nRows) - sampleCov.cwiseAbs2(); + + const double phi = phiMat.sum(); + const double gamma = (sampleCov - priorCov).squaredNorm(); // Frobenius norm + const double kappa = phi / gamma; + + shrinkage = std::max(0, std::min(1, kappa / double(nRows))); + + this->getLogManager() << Kernel::LogLevel_Debug << "Phi " << phi << " Gamma " << gamma << " kappa " << kappa << "\n"; + this->getLogManager() << Kernel::LogLevel_Debug << "Estimated shrinkage weight to be " << shrinkage << "\n"; + + dumpMatrix(this->getLogManager(), phiMat, "PhiMat"); + } + else { this->getLogManager() << Kernel::LogLevel_Debug << "Using user-provided shrinkage weight " << shrinkage << "\n"; } + + // Use the output as a buffer to avoid copying + Eigen::Map oCov(op_covMatrix->getBuffer(), nCols, nCols); + + // Mix the prior and the sample estimates according to the shrinkage parameter + oCov = shrinkage * priorCov + (1.0 - shrinkage) * sampleCov; + + // Debug block + dumpMatrix(this->getLogManager(), dataMean, "DataMean"); + dumpMatrix(this->getLogManager(), sampleCov, "Sample cov"); + dumpMatrix(this->getLogManager(), priorCov, "Prior cov"); + dumpMatrix(this->getLogManager(), oCov, "Output cov"); + + return true; +} + +#endif // TARGET_HAS_ThirdPartyEIGEN + +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmConditionedCovariance.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmConditionedCovariance.h new file mode 100644 index 0000000..b80bd4d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmConditionedCovariance.h @@ -0,0 +1,73 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyEIGEN + +#include "../ovp_defines.h" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { +class CAlgorithmConditionedCovariance final : virtual public Toolkit::TAlgorithm +{ + typedef Eigen::Matrix MatrixXdRowMajor; + +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override { return true; } + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_ConditionedCovariance) + +protected: + // Debug method. Prints the matrix to the logManager. May be disabled in implementation. + static void dumpMatrix(Kernel::ILogManager& mgr, const MatrixXdRowMajor& mat, const CString& desc); +}; + +class CAlgorithmConditionedCovarianceDesc final : virtual public IAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Conditioned Covariance"); } + CString getAuthorName() const override { return CString("Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Computes covariance with shrinkage."); } + + CString getDetailedDescription() const override + { + return CString( + "Shrinkage: {<0 = auto-estimate, [0,1] balance between prior and sample cov}. The conditioned covariance matrix may allow better accuracies with models that rely on inverting the cov matrix, in cases where the regular cov matrix is close to singular."); + } + + CString getCategory() const override { return CString(""); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_ConditionedCovariance; } + IPluginObject* create() override { return new CAlgorithmConditionedCovariance; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_ConditionedCovariance_InputParameterId_Shrinkage, "Shrinkage (-1 == auto)", Kernel::ParameterType_Float); + prototype.addInputParameter(OVP_Algorithm_ConditionedCovariance_InputParameterId_FeatureVectorSet, "Feature vectors", Kernel::ParameterType_Matrix); + + // The algorithm returns these outputs + prototype.addOutputParameter(OVP_Algorithm_ConditionedCovariance_OutputParameterId_Mean, "Mean vector", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_ConditionedCovariance_OutputParameterId_CovarianceMatrix, "Covariance matrix", Kernel::ParameterType_Matrix); + + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_ConditionedCovarianceDesc) +}; +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE + + +#endif // TARGET_HAS_ThirdPartyEIGEN diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmLDADiscriminantFunction.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmLDADiscriminantFunction.cpp new file mode 100644 index 0000000..1c84202 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmLDADiscriminantFunction.cpp @@ -0,0 +1,61 @@ +#include "ovpCAlgorithmLDADiscriminantFunction.h" +#if defined TARGET_HAS_ThirdPartyEIGEN + +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + +static const char* const BASE_NODE_NAME = "Class-config"; +static const char* const WEIGHT_NODE_NAME = "Weights"; +static const char* const BIAS_NODE_NAME = "Bias"; + +bool CAlgorithmLDADiscriminantFunction::loadConfig(const XML::IXMLNode* configuration) +{ + std::stringstream bias(configuration->getChildByName(BIAS_NODE_NAME)->getPCData()); + bias >> m_bias; + + std::stringstream data(configuration->getChildByName(WEIGHT_NODE_NAME)->getPCData()); + std::vector coefficients; + while (!data.eof()) + { + double value; + data >> value; + coefficients.push_back(value); + } + + m_weight.resize(coefficients.size()); + for (size_t i = 0; i < coefficients.size(); ++i) { m_weight(i, 0) = coefficients[i]; } + return true; +} + +XML::IXMLNode* CAlgorithmLDADiscriminantFunction::getConfiguration() +{ + XML::IXMLNode* rootNode = XML::createNode(BASE_NODE_NAME); + + std::stringstream weigths, bias; + + weigths << std::scientific; + for (int i = 0; i < m_weight.size(); ++i) { weigths << " " << m_weight(i, 0); } + + bias << m_bias; + + XML::IXMLNode* tempNode = XML::createNode(WEIGHT_NODE_NAME); + tempNode->setPCData(weigths.str().c_str()); + rootNode->addChild(tempNode); + + tempNode = XML::createNode(BIAS_NODE_NAME); + tempNode->setPCData(bias.str().c_str()); + rootNode->addChild(tempNode); + + return rootNode; +} + +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE +#endif diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmLDADiscriminantFunction.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmLDADiscriminantFunction.h new file mode 100644 index 0000000..1b8789d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmLDADiscriminantFunction.h @@ -0,0 +1,44 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyEIGEN + +#include "../ovp_defines.h" +#include + +#include + +#include "ovpCAlgorithmClassifierLDA.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { +//The purpose of this class is to compute the "membership" of a vector +class CAlgorithmLDADiscriminantFunction +{ +public: + CAlgorithmLDADiscriminantFunction() {} + + void setWeight(const Eigen::VectorXd& weigth) { m_weight = weigth; } + void setBias(const double bias) { m_bias = bias; } + + //Return the class membership of the feature vector + double getValue(const Eigen::VectorXd& featureVector) { return (m_weight.transpose() * featureVector)(0) + m_bias; } + size_t getNWeight() const { return m_weight.size(); } + + + bool loadConfig(const XML::IXMLNode* configuration); + XML::IXMLNode* getConfiguration(); + + const Eigen::VectorXd& getWeight() const { return m_weight; } + double getBias() const { return m_bias; } + +private: + double m_bias = 0; + Eigen::VectorXd m_weight; +}; +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE + +#endif diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecision.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecision.cpp new file mode 100644 index 0000000..714e0b6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecision.cpp @@ -0,0 +1,45 @@ +#include "ovpCAlgorithmPairwiseDecision.h" + +#include +namespace OpenViBE { +namespace Plugins { +namespace Classification { + + +bool CAlgorithmPairwiseDecision::process() +{ + // @note there is essentially no test that these are called in correct order. Caller be careful! + if (this->isInputTriggerActive(OVP_Algorithm_Classifier_Pairwise_InputTriggerId_Compute)) + { + Kernel::TParameterHandler*> ip_classifications = this->getInputParameter( + OVP_Algorithm_Classifier_Pairwise_InputParameter_ClassificationOutputs); + Kernel::TParameterHandler op_probability = this->getOutputParameter(OVP_Algorithm_Classifier_OutputParameter_ProbabilityVector); + return this->compute(*static_cast*>(ip_classifications), static_cast(op_probability)); + } + if (this->isInputTriggerActive(OVP_Algorithm_Classifier_Pairwise_InputTriggerId_SaveConfig)) + { + Kernel::TParameterHandler op_configuration(this->getOutputParameter(OVP_Algorithm_Classifier_Pairwise_OutputParameterId_Config)); + XML::IXMLNode* tmp = this->saveConfig(); + + OV_ERROR_UNLESS_KRF(tmp != nullptr, "Invalid NULL xml node returned while saving configuration", Kernel::ErrorType::Internal); + + op_configuration = tmp; + return true; + } + if (this->isInputTriggerActive(OVP_Algorithm_Classifier_Pairwise_InputTriggerId_LoadConfig)) + { + Kernel::TParameterHandler op_config(this->getInputParameter(OVP_Algorithm_Classifier_Pairwise_InputParameterId_Config)); + XML::IXMLNode* tmp = static_cast(op_config); + + OV_ERROR_UNLESS_KRF(tmp != nullptr, "Invalid NULL xml node to load configuration in", Kernel::ErrorType::BadInput); + + return this->loadConfig(*tmp); + } + if (this->isInputTriggerActive(OVP_Algorithm_Classifier_Pairwise_InputTriggerId_Parameterize)) { return this->parameterize(); } + + return true; +} + +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecision.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecision.h new file mode 100644 index 0000000..226265c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecision.h @@ -0,0 +1,62 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include +#include "ovpCAlgorithmClassifierOneVsOne.h" + +namespace OpenViBE { +namespace Plugins { +namespace Classification { +/** + * @brief The CAlgorithmPairwiseDecision class + * This is the default class for every decision usable with the One Vs One pairwise strategy. + */ +class CAlgorithmPairwiseDecision : virtual public Toolkit::TAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override = 0; + bool uninitialize() override = 0; + + virtual bool parameterize() = 0; + + virtual bool compute(std::vector& classifications, CMatrix* probabilities) = 0; + virtual XML::IXMLNode* saveConfig() = 0; + virtual bool loadConfig(XML::IXMLNode& node) = 0; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_PairwiseDecision) +}; + +class CAlgorithmPairwiseDecisionDesc : virtual public IAlgorithmDesc +{ +public: + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_Classifier_InputParameter_ProbabilityMatrix, "Probability Matrix", Kernel::ParameterType_Matrix); + prototype.addInputParameter(OVP_Algorithm_Classifier_Pairwise_InputParameterId_Config, "Configuration node", Kernel::ParameterType_Pointer); + prototype.addInputParameter(OVP_Algorithm_Classifier_Pairwise_InputParameterId_SetRepartition, "Set repartition", Kernel::ParameterType_Matrix); + prototype.addInputParameter( + OVP_Algorithm_Classifier_Pairwise_InputParameterId_AlgorithmIdentifier, "Classification Algorithm", Kernel::ParameterType_Identifier); + prototype.addInputParameter( + OVP_Algorithm_Classifier_Pairwise_InputParameter_ClassificationOutputs, "Classification Outputs", Kernel::ParameterType_Pointer); + prototype.addInputParameter(OVP_Algorithm_Classifier_Pairwise_InputParameter_ClassCount, "Class Count", Kernel::ParameterType_UInteger); + + prototype.addOutputParameter(OVP_Algorithm_Classifier_OutputParameter_ProbabilityVector, "Probability Vector", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_Classifier_Pairwise_OutputParameterId_Config, "Configuration node", Kernel::ParameterType_Pointer); + + prototype.addInputTrigger(OVP_Algorithm_Classifier_Pairwise_InputTriggerId_Compute, "Compute"); + prototype.addInputTrigger(OVP_Algorithm_Classifier_Pairwise_InputTriggerId_Parameterize, "Parametrize"); + prototype.addInputTrigger(OVP_Algorithm_Classifier_Pairwise_InputTriggerId_SaveConfig, "Save configuration"); + prototype.addInputTrigger(OVP_Algorithm_Classifier_Pairwise_InputTriggerId_LoadConfig, "Load configuration"); + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_PairwiseDecisionDesc) +}; +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecisionHT.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecisionHT.cpp new file mode 100644 index 0000000..1ac1db5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecisionHT.cpp @@ -0,0 +1,188 @@ +#define HT_DEBUG 0 + +#define ALPHA_DELTA 0.01 +#include "ovpCAlgorithmPairwiseDecisionHT.h" + +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + +static const char* const TYPE_NODE_NAME = "PairwiseDecision_HT"; +static const char* const REPARTITION_NODE_NAME = "Repartition"; + +bool CAlgorithmPairwiseDecisionHT::parameterize() +{ + Kernel::TParameterHandler ip_nClass(this->getInputParameter(OVP_Algorithm_Classifier_Pairwise_InputParameter_ClassCount)); + m_nClass = size_t(ip_nClass); + + OV_ERROR_UNLESS_KRF(m_nClass >= 2, "Pairwise decision HT algorithm needs at least 2 classes [" << m_nClass << "] found", Kernel::ErrorType::BadInput); + + return true; +} + + +bool CAlgorithmPairwiseDecisionHT::compute(std::vector& classifications, CMatrix* probabilities) +{ + OV_ERROR_UNLESS_KRF(m_nClass >= 2, "Pairwise decision HT algorithm needs at least 2 classes [" << m_nClass << "] found", Kernel::ErrorType::BadConfig); + + Kernel::TParameterHandler ip_Repartition = this->getInputParameter(OVP_Algorithm_Classifier_Pairwise_InputParameterId_SetRepartition); + std::vector probability(m_nClass * m_nClass); + + //First we set the diagonal to 0 + for (size_t i = 0; i < m_nClass; ++i) { probability[i * m_nClass + i] = 0.; } + +#if HT_DEBUG + for (size_t i = 0 ; i< m_nClass ; ++i){ + + for (size_t j = 0 ; jgetBuffer(); + probability[firstIdx * m_nClass + secondIdx] = values[0]; + probability[secondIdx * m_nClass + firstIdx] = 1 - values[0]; + } + + std::vector p(m_nClass); + std::vector> mu(m_nClass); + size_t amountSample = 0; + + for (size_t i = 0; i < m_nClass; ++i) { mu[i].resize(m_nClass); } + for (size_t i = 0; i < m_nClass; ++i) { amountSample += size_t(ip_Repartition->getBuffer()[i]); } + for (size_t i = 0; i < m_nClass; ++i) { p[i] = ip_Repartition->getBuffer()[i] / amountSample; } + + for (size_t i = 0; i < m_nClass; ++i) + { + for (size_t j = 0; j < m_nClass; ++j) + { + if (i != j) { mu[i][j] = p[i] / (p[i] + p[j]); } + else { mu[i][i] = 0; } + } + } + +#if HT_DEBUG + std::cout << "Initial probability and Mu" << std::endl; + for (size_t i = 0 ; i < m_nClass ; ++i) { std::cout << p[i] << " "; } + std::cout << std::endl << std::endl; + + for (size_t i = 0 ; i< m_nClass ; ++i) + { + for (size_t j = 0 ; jgetBuffer()[j]); + + firstSum += temp * probability[index * m_nClass + j]; + secondSum += temp * mu[index][j]; + } + } + + const double alpha = (secondSum != 0) ? firstSum / secondSum : 1; + + for (size_t j = 0; j < m_nClass; ++j) + { + if (j != index) + { + mu[index][j] = (alpha * mu[index][j]) / (alpha * mu[index][j] + mu[j][index]); + mu[j][index] = 1 - mu[index][j]; + } + } + + p[index] *= alpha; + if (alpha > 1 - ALPHA_DELTA && alpha < 1 + ALPHA_DELTA) { ++consecutiveAlpha; } + else { consecutiveAlpha = 0; } + index = (index + 1) % m_nClass; + +#if HT_DEBUG + std::cout << "Intermediate probability, MU and alpha" << std::endl << alpha << std::endl; + for (size_t i = 0 ; i< m_nClass ; ++i) { std::cout << p[i] << " "; } + std::cout << std::endl << std::endl; + + for (size_t i = 0 ; i< m_nClass ; ++i) + { + for (size_t j = 0 ; jresize(m_nClass); + for (size_t i = 0; i < m_nClass; ++i) { probabilities->getBuffer()[i] = p[i]; } + return true; +} + +XML::IXMLNode* CAlgorithmPairwiseDecisionHT::saveConfig() +{ + XML::IXMLNode* node = XML::createNode(TYPE_NODE_NAME); + + Kernel::TParameterHandler ip_repartition = this->getInputParameter(OVP_Algorithm_Classifier_Pairwise_InputParameterId_SetRepartition); + const size_t nClass = ip_repartition->getDimensionSize(0); + + std::stringstream ss; + for (size_t i = 0; i < nClass; ++i) { ss << ip_repartition->getBuffer()[i] << " "; } + XML::IXMLNode* repartition = XML::createNode(REPARTITION_NODE_NAME); + repartition->setPCData(ss.str().c_str()); + node->addChild(repartition); + + return node; +} + +bool CAlgorithmPairwiseDecisionHT::loadConfig(XML::IXMLNode& node) +{ + std::stringstream ss(node.getChildByName(REPARTITION_NODE_NAME)->getPCData()); + Kernel::TParameterHandler ip_repartition = this->getInputParameter(OVP_Algorithm_Classifier_Pairwise_InputParameterId_SetRepartition); + + + std::vector repartition; + while (!ss.eof()) + { + size_t value; + ss >> value; + repartition.push_back(value); + } + + ip_repartition->resize(repartition.size()); + for (size_t i = 0; i < repartition.size(); ++i) { ip_repartition->getBuffer()[i] = repartition[i]; } + return true; +} + +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecisionHT.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecisionHT.h new file mode 100644 index 0000000..bee10f9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecisionHT.h @@ -0,0 +1,71 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include "ovpCAlgorithmPairwiseDecision.h" + +namespace OpenViBE { +namespace Plugins { +namespace Classification { +/** + * @brief The CAlgorithmPairwiseDecisionHT class is a decision strategy for the One Vs One pairwise decision that implement the + * method describe in the article Hastie, Trevor; Tibshirani, Robert. Classification by pairwise coupling. The Annals of Statistics 26 (1998), no. 2, 451--471 + * + * Probability required + */ +class CAlgorithmPairwiseDecisionHT final : virtual public CAlgorithmPairwiseDecision +{ +public: + + CAlgorithmPairwiseDecisionHT() { } + void release() override { delete this; } + bool initialize() override { return true; } + bool uninitialize() override { return true; } + bool parameterize() override; + bool compute(std::vector& classifications, CMatrix* probabilities) override; + XML::IXMLNode* saveConfig() override; + bool loadConfig(XML::IXMLNode& node) override; + + _IsDerivedFromClass_Final_(CAlgorithmPairwiseDecision, OVP_ClassId_Algorithm_PairwiseDecision_HT) + +private: + size_t m_nClass = 0; +}; + +class CAlgorithmPairwiseDecisionHTDesc final : virtual public CAlgorithmPairwiseDecisionDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Pairwise decision strategy based on HT"); } + CString getAuthorName() const override { return CString("Serrière Guillaume"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("."); } + + CString getDetailedDescription() const override + { + return CString("This method is based on the method describe in the article " + "Hastie, Trevor; Tibshirani, Robert. Classification by pairwise coupling." + "The Annals of Statistics 26 (1998), no. 2, 451--471"); + } + + CString getCategory() const override { return CString(""); } + CString getVersion() const override { return CString("0.1"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_PairwiseDecision_HT; } + IPluginObject* create() override { return new CAlgorithmPairwiseDecisionHT; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CAlgorithmPairwiseDecisionDesc::getAlgorithmPrototype(prototype); + return true; + } + + _IsDerivedFromClass_Final_(CAlgorithmPairwiseDecisionDesc, OVP_ClassId_Algorithm_PairwiseDecision_HTDesc) +}; +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecisionVoting.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecisionVoting.cpp new file mode 100644 index 0000000..e0f766d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecisionVoting.cpp @@ -0,0 +1,68 @@ +#define VOTING_DEBUG 0 +#include "ovpCAlgorithmPairwiseDecisionVoting.h" + +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + +static const char* const TYPE_NODE_NAME = "PairwiseDecision_Voting"; + +bool CAlgorithmPairwiseDecisionVoting::parameterize() +{ + Kernel::TParameterHandler ip_nClass(this->getInputParameter(OVP_Algorithm_Classifier_Pairwise_InputParameter_ClassCount)); + m_nClass = size_t(ip_nClass); + + OV_ERROR_UNLESS_KRF(m_nClass >= 2, "Pairwise decision Voting algorithm needs at least 2 classes [" << m_nClass << "] found", Kernel::ErrorType::BadInput); + + return true; +} + +bool CAlgorithmPairwiseDecisionVoting::compute(std::vector& classifications, CMatrix* probabilities) +{ + OV_ERROR_UNLESS_KRF(m_nClass >= 2, "Pairwise decision Voting algorithm needs at least 2 classes [" << m_nClass << "] found", Kernel::ErrorType::BadInput); + +#if VOTING_DEBUG + std::cout << classifications.size() << std::endl; + + for (size_t i = 0 ; i < classifications.size() ; ++i) + { + std::cout << classifications[i].firstClass << " " << classifications[i].secondClass << std::endl; + std::cout << classifications[i].classLabel << std::endl; + } +#endif + + std::vector win(m_nClass); + for (size_t i = 0; i < m_nClass; ++i) { win[i] = 0; } + + for (size_t i = 0; i < classifications.size(); ++i) + { + classification_info_t& temp = classifications[i]; + if (temp.classLabel == 0) { ++(win[size_t(temp.firstClass)]); } + else { ++(win[size_t(temp.secondClass)]); } + } + +#if VOTING_DEBUG + for (size_t i = 0; i < m_nClass ; ++i) { std::cout << (double(win[i])/ classifications.size() << " "; } + std::cout << std::endl; +#endif + + probabilities->resize(m_nClass); + + for (size_t i = 0; i < m_nClass; ++i) { probabilities->getBuffer()[i] = double(win[i]) / classifications.size(); } + + return true; +} + +XML::IXMLNode* CAlgorithmPairwiseDecisionVoting::saveConfig() +{ + XML::IXMLNode* node = XML::createNode(TYPE_NODE_NAME); + return node; +} + +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecisionVoting.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecisionVoting.h new file mode 100644 index 0000000..2cdeceb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseDecisionVoting.h @@ -0,0 +1,65 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include "ovpCAlgorithmPairwiseDecision.h" + +namespace OpenViBE { +namespace Plugins { +namespace Classification { +/** + * @brief The CAlgorithmPairwiseDecisionVoting class + * This strategy relies on a basic voting system. If class A beats class B, class A win 1 point and B 0 point. At the end, the vector of + * probability is composed by the normalized score of each class. + * + * Probability required. + */ +class CAlgorithmPairwiseDecisionVoting final : virtual public CAlgorithmPairwiseDecision +{ +public: + + CAlgorithmPairwiseDecisionVoting() { } + void release() override { delete this; } + bool initialize() override { return true; } + bool uninitialize() override { return true; } + bool parameterize() override; + bool compute(std::vector& classifications, CMatrix* probabilities) override; + XML::IXMLNode* saveConfig() override; + bool loadConfig(XML::IXMLNode& /*node*/) override { return true; } + + _IsDerivedFromClass_Final_(CAlgorithmPairwiseDecision, OVP_ClassId_Algorithm_PairwiseDecision_Voting) + +private: + size_t m_nClass = 0; +}; + +class CAlgorithmPairwiseDecisionVotingDesc final : virtual public CAlgorithmPairwiseDecisionDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Pairwise decision strategy based on Voting"); } + CString getAuthorName() const override { return CString("Serrière Guillaume"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("."); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString(""); } + CString getVersion() const override { return CString("0.1"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_PairwiseDecision_Voting; } + IPluginObject* create() override { return new CAlgorithmPairwiseDecisionVoting; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CAlgorithmPairwiseDecisionDesc::getAlgorithmPrototype(prototype); + return true; + } + + _IsDerivedFromClass_Final_(CAlgorithmPairwiseDecisionDesc, OVP_ClassId_Algorithm_PairwiseDecision_VotingDesc) +}; +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseStrategyPKPD.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseStrategyPKPD.cpp new file mode 100644 index 0000000..b1a827d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseStrategyPKPD.cpp @@ -0,0 +1,85 @@ +#define PKPD_DEBUG 0 +#include "ovpCAlgorithmPairwiseStrategyPKPD.h" +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + +static const char* const TYPE_NODE_NAME = "PairwiseDecision_PKDP"; + +bool CAlgorithmPairwiseStrategyPKPD::parameterize() +{ + Kernel::TParameterHandler ip_nClass(this->getInputParameter(OVP_Algorithm_Classifier_Pairwise_InputParameter_ClassCount)); + m_nClass = size_t(ip_nClass); + + OV_ERROR_UNLESS_KRF(m_nClass >= 2, "Pairwise decision PKPD algorithm needs at least 2 classes [" << m_nClass << "] found", Kernel::ErrorType::BadInput); + + return true; +} + +bool CAlgorithmPairwiseStrategyPKPD::compute(std::vector& classifications, CMatrix* probabilities) +{ + OV_ERROR_UNLESS_KRF(m_nClass >= 2, "Pairwise decision PKPD algorithm needs at least 2 classes [" << m_nClass << "] found", Kernel::ErrorType::BadInput); + + std::vector matrix(m_nClass * m_nClass); + + //First we set the diagonal to 0 + for (size_t i = 0; i < m_nClass; ++i) { matrix[i * m_nClass + i] = 0.; } + + for (size_t i = 0; i < classifications.size(); ++i) + { + classification_info_t& temp = classifications[i]; + const size_t firstIdx = size_t(temp.firstClass); + const size_t secondIdx = size_t(temp.secondClass); + const double* values = temp.classificationValue->getBuffer(); + matrix[firstIdx * m_nClass + secondIdx] = values[0]; + matrix[secondIdx * m_nClass + firstIdx] = 1 - values[0]; + } + +#if PKPD_DEBUG + for (size_t i = 0 ; i < m_nClass ; ++i) + { + for (size_t j = 0 ; j < m_nClass ; ++j) { std::cout << matrix[i * m_nClass + j] << " "; } + std::cout << std::endl; + } +#endif + + std::vector probVector(m_nClass); + double sum = 0; + for (size_t classIdx = 0; classIdx < m_nClass; ++classIdx) + { + double tmpSum = 0; + for (size_t secondClass = 0; secondClass < m_nClass; ++secondClass) + { + if (secondClass != classIdx) { tmpSum += 1 / matrix[m_nClass * classIdx + secondClass]; } + } + probVector[classIdx] = 1 / (tmpSum - (m_nClass - 2)); + sum += probVector[classIdx]; + } + + for (size_t i = 0; i < m_nClass; ++i) { probVector[i] /= sum; } + +#if PKPD_DEBUG + for (size_t i = 0; i < m_nClass ; ++i) { std::cout << probVector[i] << " "; } + std::cout << std::endl; +#endif + + probabilities->resize(m_nClass); + + for (size_t i = 0; i < m_nClass; ++i) { probabilities->getBuffer()[i] = probVector[i]; } + + return true; +} + +XML::IXMLNode* CAlgorithmPairwiseStrategyPKPD::saveConfig() +{ + XML::IXMLNode* node = XML::createNode(TYPE_NODE_NAME); + return node; +} + +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseStrategyPKPD.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseStrategyPKPD.h new file mode 100644 index 0000000..b29c722 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/algorithms/ovpCAlgorithmPairwiseStrategyPKPD.h @@ -0,0 +1,73 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include "ovpCAlgorithmPairwiseDecision.h" + +namespace OpenViBE { +namespace Plugins { +namespace Classification { +/** + * @brief The CAlgorithmPairwiseStrategyPKPD class + * This strategy relies on the algorithm describe in the article . Price, S. Knerr, L. Personnaz, and G. Dreyfus. + * Pairwise neural network classifiers with probabilistic outputs. In G. Tesauro, D. Touretzky, and T. Leen (eds.) + * Advances in Neural Information Processing Systems 7 (NIPS-94), pp. 1109-1116. MIT Press, 1995. + */ +class CAlgorithmPairwiseStrategyPKPD final : virtual public CAlgorithmPairwiseDecision +{ +public: + + CAlgorithmPairwiseStrategyPKPD() { } + void release() override { delete this; } + bool initialize() override { return true; } + bool uninitialize() override { return true; } + bool parameterize() override; + bool compute(std::vector& classifications, CMatrix* probabilities) override; + XML::IXMLNode* saveConfig() override; + bool loadConfig(XML::IXMLNode& /*node*/) override { return true; } + + _IsDerivedFromClass_Final_(CAlgorithmPairwiseDecision, OVP_ClassId_Algorithm_PairwiseStrategy_PKPD) + +private: + size_t m_nClass = 0; +}; + +class CAlgorithmPairwiseStrategyPKPDDesc final : virtual public CAlgorithmPairwiseDecisionDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Pairwise decision strategy based on PKPD"); } + CString getAuthorName() const override { return CString("Serrière Guillaume"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("."); } + + CString getDetailedDescription() const override + { + return CString("Price, S. Knerr, L. Personnaz, and G. Dreyfus." + "Pairwise neural network classifiers with probabilistic outputs." + " In G. Tesauro, D. Touretzky, and T. Leen (eds.)" + "Advances in Neural Information Processing Systems 7 (NIPS-94), pp." + " 1109-1116. MIT Press, 1995."); + } + + CString getCategory() const override { return CString(""); } + CString getVersion() const override { return CString("0.1"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_PairwiseStrategy_PKPD; } + IPluginObject* create() override { return new CAlgorithmPairwiseStrategyPKPD; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CAlgorithmPairwiseDecisionDesc::getAlgorithmPrototype(prototype); + return true; + } + + _IsDerivedFromClass_Final_(CAlgorithmPairwiseDecisionDesc, OVP_ClassId_Algorithm_PairwiseStrategy_PKPDDesc) +}; +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierProcessor.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierProcessor.cpp new file mode 100644 index 0000000..93cd900 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierProcessor.cpp @@ -0,0 +1,247 @@ +#include "ovpCBoxAlgorithmClassifierProcessor.h" + +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + +bool CBoxAlgorithmClassifierProcessor::loadClassifier(const char* filename) +{ + if (m_classifier) + { + m_classifier->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_classifier); + m_classifier = nullptr; + } + + XML::IXMLHandler* handler = XML::createXMLHandler(); + XML::IXMLNode* rootNode = handler->parseFile(filename); + + OV_ERROR_UNLESS_KRF(rootNode, "Unable to get xml root node from file at " << filename, Kernel::ErrorType::BadParsing); + + m_stimulations.clear(); + + // Check the version of the file + OV_ERROR_UNLESS_KRF(rootNode->hasAttribute(FORMAT_VERSION_ATTRIBUTE_NAME), "Configuration file [" << filename << "] has no version information", + Kernel::ErrorType::ResourceNotFound); + + std::stringstream data(rootNode->getAttribute(FORMAT_VERSION_ATTRIBUTE_NAME)); + size_t version; + data >> version; + + OV_WARNING_UNLESS_K(version <= OVP_Classification_BoxTrainerFormatVersion, + "Classifier configuration in [" << filename << "] saved using a newer version: saved version = [" << version + << "] vs current version = [" << OVP_Classification_BoxTrainerFormatVersion << "]"); + + OV_ERROR_UNLESS_KRF(version >= OVP_Classification_BoxTrainerFormatVersionRequired, + "Classifier configuration in [" << filename << "] saved using an obsolete version [" << version << "] (minimum expected version = " + << OVP_Classification_BoxTrainerFormatVersionRequired << ")", Kernel::ErrorType::BadVersion); + + CIdentifier algorithmClassID = CIdentifier::undefined(); + + XML::IXMLNode* tmp = rootNode->getChildByName(STRATEGY_NODE_NAME); + + OV_ERROR_UNLESS_KRF(tmp, "Configuration file [" << filename << "] has no node " << STRATEGY_NODE_NAME, Kernel::ErrorType::BadParsing); + + algorithmClassID.fromString(tmp->getAttribute(IDENTIFIER_ATTRIBUTE_NAME)); + + //If the Identifier is undefined, that means we need to load a native algorithm + if (algorithmClassID == CIdentifier::undefined()) + { + tmp = rootNode->getChildByName(ALGORITHM_NODE_NAME); + + OV_ERROR_UNLESS_KRF(tmp, "Configuration file [" << filename << "] has no node " << ALGORITHM_NODE_NAME, Kernel::ErrorType::BadParsing); + + algorithmClassID.fromString(tmp->getAttribute(IDENTIFIER_ATTRIBUTE_NAME)); + + //If the algorithm is still unknown, that means that we face an error + OV_ERROR_UNLESS_KRF(algorithmClassID != CIdentifier::undefined(), "No classifier retrieved from configuration file [" << filename << "]", + Kernel::ErrorType::BadConfig); + } + + //Now loading all stimulations output + XML::IXMLNode* stimNode = rootNode->getChildByName(STIMULATIONS_NODE_NAME); + + OV_ERROR_UNLESS_KRF(stimNode, "Configuration file [" << filename << "] has no node " << STIMULATIONS_NODE_NAME, Kernel::ErrorType::BadParsing); + + //Now load every stimulation and store them in the map with the right class id + for (size_t i = 0; i < stimNode->getChildCount(); ++i) + { + tmp = stimNode->getChild(i); + + OV_ERROR_UNLESS_KRF(tmp, "Invalid NULL child node " << i << " for node [" << STIMULATIONS_NODE_NAME << "]", Kernel::ErrorType::BadParsing); + + CString name(tmp->getPCData()); + + double classID; + const char* att = tmp->getAttribute(IDENTIFIER_ATTRIBUTE_NAME); + + OV_ERROR_UNLESS_KRF(att, "Invalid child node " << i << " for node [" << STIMULATIONS_NODE_NAME << "]: attribute [" + << IDENTIFIER_ATTRIBUTE_NAME << "] not found", Kernel::ErrorType::BadParsing); + + std::stringstream ss(att); + ss >> classID; + m_stimulations[classID] = this->getTypeManager().getEnumerationEntryValueFromName(OV_TypeId_Stimulation, name); + } + + const CIdentifier id = this->getAlgorithmManager().createAlgorithm(algorithmClassID); + + OV_ERROR_UNLESS_KRF(id != CIdentifier::undefined(), + "Invalid classifier algorithm with id [" << algorithmClassID.str() << "] in configuration file [" << filename << "]", + Kernel::ErrorType::BadConfig); + + m_classifier = &this->getAlgorithmManager().getAlgorithm(id); + m_classifier->initialize(); + + // Connect the params to the new classifier + + Kernel::TParameterHandler ip_sample = m_classifier->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_FeatureVector); + ip_sample.setReferenceTarget(m_sampleDecoder.getOutputMatrix()); + + m_hyperplanesEncoder.getInputMatrix(). + setReferenceTarget(m_classifier->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_ClassificationValues)); + m_probabilitiesEncoder.getInputMatrix().setReferenceTarget(m_classifier->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_ProbabilityValues)); + // note: labelsencoder cannot be directly bound here as the classifier returns a float, but we need to output a stimulation + + Kernel::TParameterHandler ip_classificationConfig(m_classifier->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_Config)); + ip_classificationConfig = rootNode->getChildByName(CLASSIFIER_ROOT)->getChild(0); + + OV_ERROR_UNLESS_KRF(m_classifier->process(OVTK_Algorithm_Classifier_InputTriggerId_LoadConfig), + "Loading configuration failed for subclassifier [" << id.str() << "]", Kernel::ErrorType::Internal); + + rootNode->release(); + handler->release(); + + return true; +} + +bool CBoxAlgorithmClassifierProcessor::initialize() +{ + m_classifier = nullptr; + + //First of all, let's get the XML file for configuration + const CString configFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + OV_ERROR_UNLESS_KRF(configFilename != CString(""), "Invalid empty configuration file name", Kernel::ErrorType::BadConfig); + + m_sampleDecoder.initialize(*this, 0); + m_stimDecoder.initialize(*this, 1); + + m_labelsEncoder.initialize(*this, 0); + m_hyperplanesEncoder.initialize(*this, 1); + m_probabilitiesEncoder.initialize(*this, 2); + + return loadClassifier(configFilename.toASCIIString()); +} + +bool CBoxAlgorithmClassifierProcessor::uninitialize() +{ + if (m_classifier) + { + m_classifier->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_classifier); + m_classifier = nullptr; + } + + m_probabilitiesEncoder.uninitialize(); + m_hyperplanesEncoder.uninitialize(); + m_labelsEncoder.uninitialize(); + + m_stimDecoder.uninitialize(); + m_sampleDecoder.uninitialize(); + + return true; +} + +bool CBoxAlgorithmClassifierProcessor::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmClassifierProcessor::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + // Check if we have a command first + for (size_t i = 0; i < boxContext.getInputChunkCount(1); ++i) + { + m_stimDecoder.decode(i); + if (m_stimDecoder.isHeaderReceived()) { } + if (m_stimDecoder.isBufferReceived()) + { + for (size_t j = 0; j < m_stimDecoder.getOutputStimulationSet()->getStimulationCount(); ++j) + { + if (m_stimDecoder.getOutputStimulationSet()->getStimulationIdentifier(j) == OVTK_StimulationId_TrainCompleted) + { + CString configFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + if (!loadClassifier(configFilename.toASCIIString())) { return false; } + } + } + } + if (m_stimDecoder.isEndReceived()) { } + } + + // Classify data + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + const uint64_t startTime = boxContext.getInputChunkStartTime(0, i); + const uint64_t endTime = boxContext.getInputChunkEndTime(0, i); + + m_sampleDecoder.decode(i); + if (m_sampleDecoder.isHeaderReceived()) + { + m_labelsEncoder.encodeHeader(); + m_hyperplanesEncoder.encodeHeader(); + m_probabilitiesEncoder.encodeHeader(); + + boxContext.markOutputAsReadyToSend(0, startTime, endTime); + boxContext.markOutputAsReadyToSend(1, startTime, endTime); + boxContext.markOutputAsReadyToSend(2, startTime, endTime); + } + if (m_sampleDecoder.isBufferReceived()) + { + OV_ERROR_UNLESS_KRF(m_classifier->process(OVTK_Algorithm_Classifier_InputTriggerId_Classify) + && m_classifier->isOutputTriggerActive(OVTK_Algorithm_Classifier_OutputTriggerId_Success), + "Classification failed", Kernel::ErrorType::Internal); + + Kernel::TParameterHandler op_classificationState(m_classifier->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Class)); + + IStimulationSet* set = m_labelsEncoder.getInputStimulationSet(); + + set->setStimulationCount(1); + set->setStimulationIdentifier(0, m_stimulations[op_classificationState]); + set->setStimulationDate(0, endTime); + set->setStimulationDuration(0, 0); + + m_labelsEncoder.encodeBuffer(); + m_hyperplanesEncoder.encodeBuffer(); + m_probabilitiesEncoder.encodeBuffer(); + + boxContext.markOutputAsReadyToSend(0, startTime, endTime); + boxContext.markOutputAsReadyToSend(1, startTime, endTime); + boxContext.markOutputAsReadyToSend(2, startTime, endTime); + } + + if (m_sampleDecoder.isEndReceived()) + { + m_labelsEncoder.encodeEnd(); + m_hyperplanesEncoder.encodeEnd(); + m_probabilitiesEncoder.encodeEnd(); + + boxContext.markOutputAsReadyToSend(0, startTime, endTime); + boxContext.markOutputAsReadyToSend(1, startTime, endTime); + boxContext.markOutputAsReadyToSend(2, startTime, endTime); + } + } + + return true; +} + +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierProcessor.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierProcessor.h new file mode 100644 index 0000000..feff3de --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierProcessor.h @@ -0,0 +1,78 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { +class CBoxAlgorithmClassifierProcessor final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_ClassifierProcessor) + +protected: + bool loadClassifier(const char* filename); + +private: + + Toolkit::TFeatureVectorDecoder m_sampleDecoder; + Toolkit::TStimulationDecoder m_stimDecoder; + Toolkit::TStimulationEncoder m_labelsEncoder; + Toolkit::TStreamedMatrixEncoder m_hyperplanesEncoder; + Toolkit::TStreamedMatrixEncoder m_probabilitiesEncoder; + + Kernel::IAlgorithmProxy* m_classifier = nullptr; + + std::map m_stimulations; +}; + +class CBoxAlgorithmClassifierProcessorDesc final : virtual public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Classifier processor"); } + CString getAuthorName() const override { return CString("Yann Renard, Guillaume Serriere"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Generic classification, relying on several box algorithms"); } + + CString getDetailedDescription() const override { return CString("Classifies incoming feature vectors using a previously learned classifier."); } + + CString getCategory() const override { return CString("Classification"); } + CString getVersion() const override { return CString("2.1"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.1.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ClassifierProcessor; } + IPluginObject* create() override { return new CBoxAlgorithmClassifierProcessor; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Features", OV_TypeId_FeatureVector); + prototype.addInput("Commands", OV_TypeId_Stimulations); + prototype.addOutput("Labels", OV_TypeId_Stimulations); + prototype.addOutput("Hyperplane distance", OV_TypeId_StreamedMatrix); + prototype.addOutput("Probability values", OV_TypeId_StreamedMatrix); + + //We load everything in the save filed + prototype.addSetting("Filename to load configuration from", OV_TypeId_Filename, ""); + return true; + } + + // virtual IBoxListener* createBoxListener() const { return new CBoxAlgorithmCommonClassifierListener(5); } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ClassifierProcessorDesc) +}; +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierTrainer.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierTrainer.cpp new file mode 100644 index 0000000..42bc24e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierTrainer.cpp @@ -0,0 +1,590 @@ +#include "ovpCBoxAlgorithmClassifierTrainer.h" +#include + +#include +#include + +#include +#include +#include + +#include + +#include // setw +//This needs to reachable from outside +const char* const CLASSIFIER_ROOT = "OpenViBE-Classifier"; +const char* const FORMAT_VERSION_ATTRIBUTE_NAME = "FormatVersion"; +const char* const CREATOR_ATTRIBUTE_NAME = "Creator"; +const char* const CREATOR_VERSION_ATTRIBUTE_NAME = "CreatorVersion"; +const char* const IDENTIFIER_ATTRIBUTE_NAME = "class-id"; +const char* const STRATEGY_NODE_NAME = "Strategy-Identifier"; +const char* const ALGORITHM_NODE_NAME = "Algorithm-Identifier"; +const char* const STIMULATIONS_NODE_NAME = "Stimulations"; +const char* const REJECTED_CLASS_NODE_NAME = "Rejected-Class"; +const char* const CLASS_STIMULATION_NODE_NAME = "Class-Stimulation"; +const char* const CLASSIFICATION_BOX_ROOT = "OpenViBE-Classifier-Box"; + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + +bool CBoxAlgorithmClassifierTrainer::initialize() +{ + m_classifier = nullptr; + m_parameter = nullptr; + + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + //As we add some parameter in the middle of "static" parameters, we cannot rely on settings index. + m_parameter = new std::map(); + for (size_t i = 0; i < boxContext.getSettingCount(); ++i) + { + CString name; + boxContext.getSettingName(i, name); + const CString value = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i); + (*m_parameter)[name] = value; + } + + bool isPairing = false; + + const CString configFilename(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2)); + + OV_ERROR_UNLESS_KRF(configFilename != CString(""), "Invalid empty configuration filename", Kernel::ErrorType::BadSetting); + + CIdentifier classifierAlgorithmClassID; + + const CIdentifier strategyClassID = this->getTypeManager().getEnumerationEntryValueFromName( + OVTK_TypeId_ClassificationStrategy, (*m_parameter)[MULTICLASS_STRATEGY_SETTING_NAME]); + classifierAlgorithmClassID = this->getTypeManager().getEnumerationEntryValueFromName( + OVTK_TypeId_ClassificationAlgorithm, (*m_parameter)[ALGORITHM_SETTING_NAME]); + + if (strategyClassID == CIdentifier::undefined()) + { + //That means that we want to use a classical algorithm so just let's create it + const CIdentifier classifierAlgorithmID = this->getAlgorithmManager().createAlgorithm(classifierAlgorithmClassID); + + OV_ERROR_UNLESS_KRF(classifierAlgorithmID != CIdentifier::undefined(), + "Unable to instantiate classifier for class [" << classifierAlgorithmID.str() << "]", Kernel::ErrorType::BadConfig); + + m_classifier = &this->getAlgorithmManager().getAlgorithm(classifierAlgorithmID); + m_classifier->initialize(); + } + else + { + isPairing = true; + m_classifier = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(strategyClassID)); + m_classifier->initialize(); + } + m_trainStimulation = this->getTypeManager().getEnumerationEntryValueFromName(OV_TypeId_Stimulation, (*m_parameter)[TRAIN_TRIGGER_SETTING_NAME]); + + const int64_t nPartition = this->getConfigurationManager().expandAsInteger((*m_parameter)[FOLD_SETTING_NAME]); + + OV_ERROR_UNLESS_KRF(nPartition >= 0, "Invalid partition count [" << nPartition << "] (expected value >= 0)", Kernel::ErrorType::BadSetting); + + m_nPartition = uint64_t(nPartition); + + m_stimDecoder.initialize(*this, 0); + for (size_t i = 1; i < boxContext.getInputCount(); ++i) + { + m_sampleDecoder.push_back(new Toolkit::TFeatureVectorDecoder()); + m_sampleDecoder.back()->initialize(*this, i); + } + + //We link the parameters to the extra parameters input parameter to transmit them + Kernel::TParameterHandler*> ip_parameter( + m_classifier->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_ExtraParameter)); + ip_parameter = m_parameter; + + m_encoder.initialize(*this, 0); + + m_nFeatures.clear(); + + OV_ERROR_UNLESS_KRF(boxContext.getInputCount() >= 2, "Invalid input count [" << boxContext.getInputCount() << "] (at least 2 input expected)", + Kernel::ErrorType::BadSetting); + + // Provide the number of classes to the classifier + const size_t nClass = boxContext.getInputCount() - 1; + Kernel::TParameterHandler ip_nClasses(m_classifier->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_NClasses)); + ip_nClasses = nClass; + + //If we have to deal with a pairing strategy we have to pass argument + if (isPairing) + { + Kernel::TParameterHandler ip_classId( + m_classifier->getInputParameter(OVTK_Algorithm_PairingStrategy_InputParameterId_SubClassifierAlgorithm)); + ip_classId = &classifierAlgorithmClassID; + + OV_ERROR_UNLESS_KRF(m_classifier->process(OVTK_Algorithm_PairingStrategy_InputTriggerId_DesignArchitecture), "Failed to design architecture", + Kernel::ErrorType::Internal); + } + + return true; +} + +bool CBoxAlgorithmClassifierTrainer::uninitialize() +{ + m_stimDecoder.uninitialize(); + m_encoder.uninitialize(); + + if (m_classifier) + { + m_classifier->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_classifier); + } + + for (size_t i = 0; i < m_sampleDecoder.size(); ++i) + { + m_sampleDecoder[i]->uninitialize(); + delete m_sampleDecoder[i]; + } + m_sampleDecoder.clear(); + + m_encoder.uninitialize(); + m_stimDecoder.uninitialize(); + + for (size_t i = 0; i < m_datasets.size(); ++i) + { + delete m_datasets[i].sampleMatrix; + m_datasets[i].sampleMatrix = nullptr; + } + m_datasets.clear(); + + if (m_parameter) + { + delete m_parameter; + m_parameter = nullptr; + } + + // @fixme who frees this? freeing here -> crash + /* + if(m_pExtraParameter != nullptr) + { + delete m_pExtraParameter; + m_pExtraParameter = NULL; + } + */ + + return true; +} + +bool CBoxAlgorithmClassifierTrainer::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +// Find the most likely class and resample the dataset so that each class is as likely +bool CBoxAlgorithmClassifierTrainer::balanceDataset() +{ + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + const size_t nClass = boxContext.getInputCount() - 1; + + this->getLogManager() << Kernel::LogLevel_Info << "Balancing dataset...\n"; + + // Collect index set of feature vectors per class + std::vector> classIndexes; + classIndexes.resize(nClass); + for (size_t i = 0; i < m_datasets.size(); ++i) { classIndexes[m_datasets[i].inputIdx].push_back(i); } + + // Count how many vectors the largest class has + size_t nMax = 0; + for (size_t i = 0; i < nClass; ++i) { nMax = std::max(nMax, classIndexes[i].size()); } + + m_balancedDatasets.clear(); + + // Pad those classes with resampled examples (sampling with replacement) that have fewer examples than the largest class + for (size_t i = 0; i < nClass; ++i) + { + const size_t examplesInClass = classIndexes[i].size(); + const size_t paddingNeeded = nMax - examplesInClass; + if (examplesInClass == 0) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Cannot resample class " << i << ", 0 examples\n"; + continue; + } + if (paddingNeeded > 0) { this->getLogManager() << Kernel::LogLevel_Debug << "Padding class " << i << " with " << paddingNeeded << " examples\n"; } + + // Copy all the examples first to a temporary array so we don't mess with the original data. + // This is not too bad as instead of data, we copy the pointer. m_datasets owns the data pointer. + const std::vector& thisClassesIndexes = classIndexes[i]; + for (size_t j = 0; j < examplesInClass; ++j) { m_balancedDatasets.push_back(m_datasets[thisClassesIndexes[j]]); } + + for (size_t j = 0; j < paddingNeeded; ++j) + { + const size_t sampledIndex = System::Math::randomWithCeiling(examplesInClass); + const sample_t& sourceVector = m_datasets[thisClassesIndexes[sampledIndex]]; + m_balancedDatasets.push_back(sourceVector); + } + } + + return true; +} + +bool CBoxAlgorithmClassifierTrainer::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + bool startTrain = false; + + // Parses stimulations + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_stimDecoder.decode(i); + + if (m_stimDecoder.isHeaderReceived()) + { + m_encoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, 0, 0); + } + if (m_stimDecoder.isBufferReceived()) + { + const IStimulationSet* iStimulationSet = m_stimDecoder.getOutputStimulationSet(); + IStimulationSet* oStimulationSet = m_encoder.getInputStimulationSet(); + oStimulationSet->clear(); + + for (size_t j = 0; j < iStimulationSet->getStimulationCount(); ++j) + { + if (iStimulationSet->getStimulationIdentifier(j) == m_trainStimulation) + { + startTrain = true; + const uint64_t id = this->getTypeManager().getEnumerationEntryValueFromName(OV_TypeId_Stimulation, "OVTK_StimulationId_TrainCompleted"); + oStimulationSet->appendStimulation(id, iStimulationSet->getStimulationDate(j), 0); + } + } + m_encoder.encodeBuffer(); + + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + if (m_stimDecoder.isEndReceived()) + { + m_encoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + + // Parses feature vectors + for (size_t i = 1; i < nInput; ++i) + { + for (size_t j = 0; j < boxContext.getInputChunkCount(i); ++j) + { + m_sampleDecoder[i - 1]->decode(j); + + if (m_sampleDecoder[i - 1]->isHeaderReceived()) { } + if (m_sampleDecoder[i - 1]->isBufferReceived()) + { + const CMatrix* sampleMatrix = m_sampleDecoder[i - 1]->getOutputMatrix(); + + sample_t sample; + sample.sampleMatrix = new CMatrix(); + sample.startTime = boxContext.getInputChunkStartTime(i, j); + sample.endTime = boxContext.getInputChunkEndTime(i, j); + sample.inputIdx = i - 1; + + sample.sampleMatrix->copy(*sampleMatrix); + m_datasets.push_back(sample); + m_nFeatures[i]++; + } + if (m_sampleDecoder[i - 1]->isEndReceived()) { } + } + } + + // On train stimulation reception, build up the labelled feature vector set matrix and go on training + if (startTrain) + { + OV_ERROR_UNLESS_KRF(m_datasets.size() >= m_nPartition, + "Received fewer examples (" << m_datasets.size() << ") than specified partition count (" << m_nPartition << ")", + Kernel::ErrorType::BadInput); + + OV_ERROR_UNLESS_KRF(!m_datasets.empty(), "No training example received", Kernel::ErrorType::BadInput); + + this->getLogManager() << Kernel::LogLevel_Info << "Received train stimulation. Data dim is [" << m_datasets.size() << "x" + << m_datasets[0].sampleMatrix->getBufferElementCount() << "]\n"; + for (size_t i = 1; i < nInput; ++i) + { + this->getLogManager() << Kernel::LogLevel_Info << "For information, we have " << m_nFeatures[i] << " feature vector(s) for input " << i << "\n"; + } + + const bool balancedDataset = this->getConfigurationManager().expandAsBoolean((*m_parameter)[BALANCE_SETTING_NAME]); + if (balancedDataset) { balanceDataset(); } + + const std::vector& actualDataset = (balancedDataset ? m_balancedDatasets : m_datasets); + + std::vector partitionAccuracies(m_nPartition); + + const bool randomizeVectorOrder = this->getConfigurationManager().expandAsBoolean("${Plugin_Classification_RandomizeKFoldTestData}", false); + + // create a vector used for mapping feature vectors (initialize it as v[i] = i) + std::vector featurePermutation; + for (size_t i = 0; i < actualDataset.size(); ++i) { featurePermutation.push_back(i); } + + // randomize the vector if necessary + if (randomizeVectorOrder) + { + this->getLogManager() << Kernel::LogLevel_Info << "Randomizing the feature vector set\n"; + random_shuffle(featurePermutation.begin(), featurePermutation.end(), System::Math::randomWithCeiling); + } + + const size_t nClass = nInput - 1; + CMatrix confusion(nClass, nClass); + + if (m_nPartition >= 2) + { + double partitionAccuracy = 0; + double finalAccuracy = 0; + + this->getLogManager() << Kernel::LogLevel_Info << "k-fold test could take quite a long time, be patient\n"; + for (size_t i = 0; i < m_nPartition; ++i) + { + const size_t startIdx = size_t(((i) * actualDataset.size()) / m_nPartition); + const size_t stopIdx = size_t(((i + 1) * actualDataset.size()) / m_nPartition); + + this->getLogManager() << Kernel::LogLevel_Trace << "Training on partition " << i << " (feature vectors " << startIdx << " to " << + stopIdx - 1 << ")...\n"; + + OV_ERROR_UNLESS_KRF(this->train(actualDataset, featurePermutation, startIdx, stopIdx), "Training failed: bailing out (from xval)", + Kernel::ErrorType::Internal); + + partitionAccuracy = this->getAccuracy(actualDataset, featurePermutation, startIdx, stopIdx, confusion); + partitionAccuracies[i] = partitionAccuracy; + finalAccuracy += partitionAccuracy; + + this->getLogManager() << Kernel::LogLevel_Info << "Finished with partition " << i + 1 << " / " << m_nPartition << " (performance : " + << partitionAccuracy << "%)\n"; + } + + const double mean = finalAccuracy / m_nPartition; + double deviation = 0; + + for (size_t i = 0; i < m_nPartition; ++i) + { + const double diff = partitionAccuracies[i] - mean; + deviation += diff * diff; + } + deviation = sqrt(deviation / m_nPartition); + + this->getLogManager() << Kernel::LogLevel_Info << "Cross-validation test accuracy is " << mean << "% (sigma = " << deviation << "%)\n"; + + printConfusionMatrix(confusion); + } + else + { + this->getLogManager() << Kernel::LogLevel_Info << "Training without cross-validation.\n"; + this->getLogManager() << Kernel::LogLevel_Info << "*** Reported training set accuracy will be optimistic ***\n"; + } + + + this->getLogManager() << Kernel::LogLevel_Trace << "Training final classifier on the whole set...\n"; + + OV_ERROR_UNLESS_KRF(this->train(actualDataset, featurePermutation, 0, 0), + "Training failed: bailing out (from whole set training)", Kernel::ErrorType::Internal); + + confusion.resetBuffer(); + const double accuracy = this->getAccuracy(actualDataset, featurePermutation, 0, actualDataset.size(), confusion); + + this->getLogManager() << Kernel::LogLevel_Info << "Training set accuracy is " << accuracy << "% (optimistic)\n"; + + printConfusionMatrix(confusion); + + OV_ERROR_UNLESS_KRF(this->saveConfig(), "Failed to save configuration", Kernel::ErrorType::Internal); + } + + return true; +} + +bool CBoxAlgorithmClassifierTrainer::train(const std::vector& dataset, const std::vector& permutation, const size_t startIdx, + const size_t stopIdx) +{ + OV_ERROR_UNLESS_KRF(stopIdx - startIdx != 1, "Invalid indexes: stopIdx - trainIndex = 1", Kernel::ErrorType::BadArgument); + + const size_t nSample = dataset.size() - (stopIdx - startIdx); + const size_t nFeature = dataset[0].sampleMatrix->getBufferElementCount(); + + Kernel::TParameterHandler ip_sample(m_classifier->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_FeatureVectorSet)); + + ip_sample->resize(nSample, nFeature + 1); + + double* buffer = ip_sample->getBuffer(); + for (size_t j = 0; j < dataset.size() - (stopIdx - startIdx); ++j) + { + const size_t k = permutation[(j < startIdx ? j : j + (stopIdx - startIdx))]; + const double classId = double(dataset[k].inputIdx); + memcpy(buffer, dataset[k].sampleMatrix->getBuffer(), nFeature * sizeof(double)); + + buffer[nFeature] = classId; + buffer += (nFeature + 1); + } + + OV_ERROR_UNLESS_KRF(m_classifier->process(OVTK_Algorithm_Classifier_InputTriggerId_Train), "Training failed", Kernel::ErrorType::Internal); + + Kernel::TParameterHandler op_configuration(m_classifier->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Config)); + XML::IXMLNode* node = static_cast(op_configuration); + + if (node != nullptr) { node->release(); } + op_configuration = nullptr; + + return m_classifier->process(OVTK_Algorithm_Classifier_InputTriggerId_SaveConfig); +} + +// Note that this function is incremental for confusionMatrix and can be called many times; so we don't clear the matrix +double CBoxAlgorithmClassifierTrainer::getAccuracy(const std::vector& dataset, const std::vector& permutation, + const size_t startIdx, const size_t stopIdx, CMatrix& confusionMatrix) +{ + OV_ERROR_UNLESS_KRF(stopIdx != startIdx, "Invalid indexes: start index equals stop index", Kernel::ErrorType::BadArgument); + + const size_t nFeature = dataset[0].sampleMatrix->getBufferElementCount(); + + Kernel::TParameterHandler op_config(m_classifier->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Config)); + XML::IXMLNode* node = op_config;//Requested for affectation + Kernel::TParameterHandler ip_config(m_classifier->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_Config)); + ip_config = node; + + m_classifier->process(OVTK_Algorithm_Classifier_InputTriggerId_LoadConfig); + + Kernel::TParameterHandler ip_sample(m_classifier->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_FeatureVector)); + Kernel::TParameterHandler op_classificationState(m_classifier->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Class)); + ip_sample->resize(nFeature); + + size_t nSuccess = 0; + + for (size_t j = startIdx; j < stopIdx; ++j) + { + const size_t k = permutation[j]; + + double* buffer = ip_sample->getBuffer(); + const double correctValue = double(dataset[k].inputIdx); + + this->getLogManager() << Kernel::LogLevel_Debug << "Try to recognize " << correctValue << "\n"; + + memcpy(buffer, dataset[k].sampleMatrix->getBuffer(), nFeature * sizeof(double)); + + m_classifier->process(OVTK_Algorithm_Classifier_InputTriggerId_Classify); + + const double predictedValue = op_classificationState; + + this->getLogManager() << Kernel::LogLevel_Debug << "Recognize " << predictedValue << "\n"; + + if (predictedValue == correctValue) { nSuccess++; } + + if (predictedValue < confusionMatrix.getDimensionSize(0) && correctValue < confusionMatrix.getDimensionSize(0)) + { + double* buf = confusionMatrix.getBuffer(); + buf[size_t(correctValue) * confusionMatrix.getDimensionSize(1) + size_t(predictedValue)] += 1.0; + } + else { std::cout << "error\n"; } + } + + return double((nSuccess * 100.0) / (stopIdx - startIdx)); +} + +bool CBoxAlgorithmClassifierTrainer::printConfusionMatrix(const CMatrix& oMatrix) +{ + OV_ERROR_UNLESS_KRF(oMatrix.getDimensionCount() == 2 && oMatrix.getDimensionSize(0) == oMatrix.getDimensionSize(1), + "Invalid confution matrix [dim count = " << oMatrix.getDimensionCount() << ", dim size 0 = " + << oMatrix.getDimensionSize(0) << ", dim size 1 = "<< oMatrix.getDimensionSize(1) << "] (expected 2 dimensions with same size)", + Kernel::ErrorType::BadArgument); + + const size_t rows = oMatrix.getDimensionSize(0); + + if (rows > 10 && !this->getConfigurationManager().expandAsBoolean("${Plugin_Classification_ForceConfusionMatrixPrint}")) + { + this->getLogManager() << Kernel::LogLevel_Info << + "Over 10 classes, not printing the confusion matrix. If needed, override with setting Plugin_Classification_ForceConfusionMatrixPrint token to true.\n"; + return true; + } + + CMatrix tmp(oMatrix), rowSum(rows); + + for (size_t i = 0; i < rows; ++i) + { + const size_t idx = i * rows; + for (size_t j = 0; j < rows; ++j) { rowSum[i] += tmp[idx + j]; } + for (size_t j = 0; j < rows; ++j) { tmp[idx + j] /= rowSum[i]; } + } + + std::stringstream ss; + ss << std::fixed; + + ss << " Cls vs cls "; + for (size_t i = 0; i < rows; ++i) { ss << std::setw(6) << (i + 1); } + this->getLogManager() << Kernel::LogLevel_Info << ss.str() << "\n"; + + ss.precision(1); + for (size_t i = 0; i < rows; ++i) + { + ss.str(""); + ss << " Target " << std::setw(2) << (i + 1) << ": "; + for (size_t j = 0; j < rows; ++j) { ss << std::setw(6) << tmp[i * rows + j] * 100; } + this->getLogManager() << Kernel::LogLevel_Info << ss.str() << " %, " << size_t(rowSum[i]) << " examples\n"; + } + + return true; +} + +bool CBoxAlgorithmClassifierTrainer::saveConfig() +{ + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + + Kernel::TParameterHandler op_config(m_classifier->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Config)); + XML::IXMLNode* algorithmConfigNode = XML::createNode(CLASSIFIER_ROOT); + algorithmConfigNode->addChild(static_cast(op_config)); + + XML::IXMLHandler* handler = XML::createXMLHandler(); + const CString configurationFilename(this->getConfigurationManager().expand((*m_parameter)[FILENAME_SETTING_NAME])); + + XML::IXMLNode* root = XML::createNode(CLASSIFICATION_BOX_ROOT); + std::stringstream version; + version << OVP_Classification_BoxTrainerFormatVersion; + root->addAttribute(FORMAT_VERSION_ATTRIBUTE_NAME, version.str().c_str()); + + const auto cleanup = [&]() + { + handler->release(); + root->release(); + op_config = nullptr; + }; + root->addAttribute(CREATOR_ATTRIBUTE_NAME, this->getConfigurationManager().expand("${Application_Name}")); + root->addAttribute(CREATOR_VERSION_ATTRIBUTE_NAME, this->getConfigurationManager().expand("${Application_Version}")); + + XML::IXMLNode* tempNode = XML::createNode(STRATEGY_NODE_NAME); + const CIdentifier strategyClassId = this->getTypeManager().getEnumerationEntryValueFromName( + OVTK_TypeId_ClassificationStrategy, (*m_parameter)[MULTICLASS_STRATEGY_SETTING_NAME]); + tempNode->addAttribute(IDENTIFIER_ATTRIBUTE_NAME, strategyClassId.str().c_str()); + tempNode->setPCData((*m_parameter)[MULTICLASS_STRATEGY_SETTING_NAME].toASCIIString()); + root->addChild(tempNode); + + tempNode = XML::createNode(ALGORITHM_NODE_NAME); + const CIdentifier classifierClassId = this->getTypeManager().getEnumerationEntryValueFromName( + OVTK_TypeId_ClassificationAlgorithm, (*m_parameter)[ALGORITHM_SETTING_NAME]); + tempNode->addAttribute(IDENTIFIER_ATTRIBUTE_NAME, classifierClassId.str().c_str()); + tempNode->setPCData((*m_parameter)[ALGORITHM_SETTING_NAME].toASCIIString()); + root->addChild(tempNode); + + + XML::IXMLNode* stimulationsNode = XML::createNode(STIMULATIONS_NODE_NAME); + + for (size_t i = 1; i < boxContext.getInputCount(); ++i) + { + const std::string name = "Class " + std::to_string(i) + " label"; + const std::string id = std::to_string(i - 1); + tempNode = XML::createNode(CLASS_STIMULATION_NODE_NAME); + tempNode->addAttribute(IDENTIFIER_ATTRIBUTE_NAME, id.c_str()); + tempNode->setPCData((*m_parameter)[name.c_str()].toASCIIString()); + stimulationsNode->addChild(tempNode); + } + root->addChild(stimulationsNode); + + root->addChild(algorithmConfigNode); + + if (!handler->writeXMLInFile(*root, configurationFilename.toASCIIString())) + { + cleanup(); + OV_ERROR_KRF("Failed saving configuration to file [" << configurationFilename << "]", Kernel::ErrorType::BadFileWrite); + } + + cleanup(); + return true; +} + +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierTrainer.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierTrainer.h new file mode 100644 index 0000000..e567f7b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmClassifierTrainer.h @@ -0,0 +1,131 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include "ovpCBoxAlgorithmCommonClassifierListener.inl" + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + +const char* const TRAIN_TRIGGER_SETTING_NAME = "Train trigger"; +const char* const FILENAME_SETTING_NAME = "Filename to save configuration to"; +const char* const MULTICLASS_STRATEGY_SETTING_NAME = "Multiclass strategy to apply"; +const char* const ALGORITHM_SETTING_NAME = "Algorithm to use"; +const char* const FOLD_SETTING_NAME = "Number of partitions for k-fold cross-validation test"; +const char* const BALANCE_SETTING_NAME = "Balance classes"; + +class CBoxAlgorithmClassifierTrainer final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_ClassifierTrainer) + +protected: + + typedef struct + { + CMatrix* sampleMatrix; + uint64_t startTime; + uint64_t endTime; + size_t inputIdx; + } sample_t; + + bool train(const std::vector& dataset, const std::vector& permutation, size_t startIdx, size_t stopIdx); + double getAccuracy(const std::vector& dataset, const std::vector& permutation, size_t startIdx, size_t stopIdx, CMatrix& confusionMatrix); + bool printConfusionMatrix(const CMatrix& oMatrix); + bool balanceDataset(); + +private: + bool saveConfig(); + +protected: + + std::map m_nFeatures; + + Kernel::IAlgorithmProxy* m_classifier = nullptr; + uint64_t m_trainStimulation = 0; + size_t m_nPartition = 0; + + Toolkit::TStimulationDecoder m_stimDecoder; + std::vector*> m_sampleDecoder; + + Toolkit::TStimulationEncoder m_encoder; + + std::map* m_parameter = nullptr; + + std::vector m_datasets; + std::vector m_balancedDatasets; +}; + +class CBoxAlgorithmClassifierTrainerDesc final : virtual public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Classifier trainer"); } + CString getAuthorName() const override { return CString("Yann Renard, Guillaume Serriere"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + + CString getShortDescription() const override { return CString("Generic classifier trainer, relying on several box algorithms"); } + + CString getDetailedDescription() const override { return CString("Performs classifier training with cross-validation -based error estimation"); } + + CString getCategory() const override { return CString("Classification"); } + CString getVersion() const override { return CString("2.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.1.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ClassifierTrainer; } + IPluginObject* create() override { return new CBoxAlgorithmClassifierTrainer; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Stimulations", OV_TypeId_Stimulations); + prototype.addInput("Features for class 1", OV_TypeId_FeatureVector); + prototype.addInput("Features for class 2", OV_TypeId_FeatureVector); + + prototype.addOutput("Train-completed Flag", OV_TypeId_Stimulations); + + prototype.addSetting(TRAIN_TRIGGER_SETTING_NAME, OV_TypeId_Stimulation, "OVTK_StimulationId_Train"); + prototype.addSetting(FILENAME_SETTING_NAME, OV_TypeId_Filename, "${Path_UserData}/my-classifier.xml"); + + prototype.addSetting(MULTICLASS_STRATEGY_SETTING_NAME, OVTK_TypeId_ClassificationStrategy, "Native"); + //Pairing startegy argument + //Class label + + prototype.addSetting(ALGORITHM_SETTING_NAME, OVTK_TypeId_ClassificationAlgorithm, "Linear Discrimimant Analysis (LDA)"); + //Argument of algorithm + + prototype.addSetting(FOLD_SETTING_NAME, OV_TypeId_Integer, "10"); + prototype.addSetting(BALANCE_SETTING_NAME, OV_TypeId_Boolean, "false"); + + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + + // prototype.addFlag(Kernel::BoxFlag_ManualUpdate); + return true; + } + + IBoxListener* createBoxListener() const override + { + const size_t nCommonSetting = 6; + return new CBoxAlgorithmCommonClassifierListener(nCommonSetting); + } + + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ClassifierTrainerDesc) +}; +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmCommonClassifierListener.inl b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmCommonClassifierListener.inl new file mode 100755 index 0000000..42d9beb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmCommonClassifierListener.inl @@ -0,0 +1,375 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include +#include +#include +#include + +//#define OV_DEBUG_CLASSIFIER_LISTENER + +#ifdef OV_DEBUG_CLASSIFIER_LISTENER +#define DEBUG_PRINT(x) x +#else +#define DEBUG_PRINT(x) +#endif + +namespace OpenViBE { +namespace Plugins { +namespace Classification { +class CBoxAlgorithmCommonClassifierListener final : public Toolkit::TBoxListener +{ +public: + + explicit CBoxAlgorithmCommonClassifierListener(const size_t customSettingBase) : m_customSettingBase(customSettingBase) { } + + bool initialize() override + { + //Even if everything should have been set in constructor, we still set everything in initialize (in case of) + m_classifierClassID = CIdentifier::undefined(); + m_classifier = nullptr; + + //CIdentifier::undefined() is already use for the native, We initialize to an unused identifier in the strategy list + m_strategyClassID = 0x0; + m_strategy = nullptr; + + //This value means that we need to calculate it + m_strategyAmountSettings = -1; + return true; + } + + bool uninitialize() override + { + if (m_classifier) + { + m_classifier->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_classifier); + m_classifier = nullptr; + } + if (m_strategy) + { + m_strategy->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_strategy); + m_strategy = nullptr; + } + return true; + } + + bool initializedStrategy(Kernel::IBox& box) + { + CString name; + box.getSettingName(getStrategyIndex() + 1, name); + if (name == CString(PAIRWISE_STRATEGY_ENUMERATION_NAME)) { m_strategyAmountSettings = 1; } + else { m_strategyAmountSettings = 0; } + return true; + } + + //virtual bool onAlgorithmClassIdentifierChanged(Kernel::IBox &box) + //{ + //this->initializedStrategy(box); + //return true; + //} + + int getStrategySettingsCount(Kernel::IBox& box) + { + if (m_strategyAmountSettings < 0) { initializedStrategy(box); } //The value have never been initialized + return m_strategyAmountSettings; + } + + static bool onInputAddedOrRemoved(Kernel::IBox& box) + { + box.setInputType(0, OV_TypeId_Stimulations); + box.setInputName(0, "Stimulations"); + for (size_t i = 1; i < box.getInputCount(); ++i) + { + box.setInputName(i, ("Features for class " + std::to_string(i)).c_str()); + box.setInputType(i, OV_TypeId_FeatureVector); + } + return true; + } + + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + //index represent the number of the class (because of rejected offset) + const std::string name = "Class " + std::to_string(index) + " label"; + std::stringstream stim; + stim.fill('0'); + stim << "OVTK_StimulationId_Label_" << std::setw(2) << index; + box.addSetting(name.c_str(), OV_TypeId_Stimulation, stim.str().c_str(), 3 - 1 + getStrategySettingsCount(box) + index); + + //Rename input + return onInputAddedOrRemoved(box); + } + + bool onInputRemoved(Kernel::IBox& box, const size_t index) override + { + //First remove the removed input from settings + box.removeSetting(3 - 1 + getStrategySettingsCount(box) + index); + + //Then rename the remains inputs in settings + for (size_t i = 1; i < box.getInputCount(); ++i) + { + const std::string name = "Class " + std::to_string(i) + " label"; + box.setSettingName(3 - 1 + getStrategySettingsCount(box) + i, name.c_str()); + } + + //Then rename input + return onInputAddedOrRemoved(box); + } + + bool onInitialized(Kernel::IBox& box) override + { + //We need to know if the box is already initialized (can be called after a restore state) + CString strategyName; + box.getSettingName(getStrategyIndex() + 2, strategyName);//this one is a class label + const std::string settingName(strategyName.toASCIIString()); + + if (settingName.find("Class ") == std::string::npos)//We haven't initialized the box so let's do it + { + //Now added Settings for classes + for (size_t i = 1; i < box.getInputCount(); ++i) + { + const std::string name = "Class " + std::to_string(i) + " label"; + std::stringstream stim; + stim.fill('0'); + stim << "OVTK_StimulationId_Label_" << std::setw(2) << i; + box.addSetting(name.c_str(), OV_TypeId_Stimulation, stim.str().c_str(), 3 - 1 + getStrategySettingsCount(box) + i); + DEBUG_PRINT(std::cout << "Add setting (type D) " << buffer << " " << stimulation << "\n";) + } + return this->onAlgorithmClassifierChanged(box); + } + return true; + //return this->onAlgorithmClassifierChanged(box); + } + + //Return the index of the combo box used to select the strategy (native/ OnevsOne...) + static size_t getStrategyIndex() { return 2; } + + //Return the index of the combo box used to select the classification algorithm + size_t getClassifierIndex(Kernel::IBox& box) { return getStrategySettingsCount(box) + 3 + box.getInputCount() - 1; } + + bool onSettingValueChanged(Kernel::IBox& box, const size_t index) override + { + if (index == getClassifierIndex(box)) { return this->onAlgorithmClassifierChanged(box); } + if (index == getStrategyIndex()) { return this->onStrategyChanged(box); } + return true; + } + + + bool updateDecision(Kernel::IBox& box) + { + const size_t i = getStrategyIndex() + 1; + if (m_strategyClassID == OVP_ClassId_Algorithm_ClassifierOneVsOne) + { + CString classifierName = "Unknown"; + box.getSettingValue(getClassifierIndex(box), classifierName); + const CIdentifier typeID = this->getTypeManager().getEnumerationEntryValueFromName( + OVP_TypeId_OneVsOne_DecisionAlgorithms, classifierName); + + OV_ERROR_UNLESS_KRF(typeID != CIdentifier::undefined(), + "Unable to find Pairwise Decision for the algorithm [" << m_classifierClassID.str() << "] (" << classifierName << ")", + Kernel::ErrorType::BadConfig); + + Kernel::IParameter* param = m_strategy->getInputParameter(OVP_Algorithm_OneVsOneStrategy_InputParameterId_DecisionType); + Kernel::TParameterHandler ip_parameter(param); + + const CString entry = this->getTypeManager().getTypeName(typeID); + uint64_t value = ip_parameter; + uint64_t idx; + CString name; + + box.getSettingValue(i, name); + + const uint64_t oldID = this->getTypeManager().getEnumerationEntryValueFromName(typeID, name); + //The previous strategy does not exists in the new enum, let's switch to the default value (the first) + if (oldID == CIdentifier::undefined().id()) { idx = 0; } + else { idx = oldID; } + + this->getTypeManager().getEnumerationEntry(typeID, idx, name, value); + ip_parameter = value; + + box.setSettingType(i, typeID); + box.setSettingName(i, entry); + box.setSettingValue(i, name); + } + return true; + } + + bool onStrategyChanged(Kernel::IBox& box) + { + CString name; + + box.getSettingValue(getStrategyIndex(), name); + + const CIdentifier id = this->getTypeManager().getEnumerationEntryValueFromName( + OVTK_TypeId_ClassificationStrategy, name); + if (id != m_strategyClassID) + { + if (m_strategy) + { + m_strategy->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_strategy); + m_strategy = nullptr; + m_strategyClassID = CIdentifier::undefined(); + } + if (id != CIdentifier::undefined()) + { + m_strategy = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(id)); + m_strategy->initialize(); + m_strategyClassID = id; + } + + for (size_t i = getStrategyIndex() + getStrategySettingsCount(box); i > getStrategyIndex(); --i) + { + DEBUG_PRINT(std::cout << "Remove pairing strategy setting at idx " << i-1 << "\n";) + box.removeSetting(i); + } + m_strategyAmountSettings = 0; + } + else { return true; } //If we don't change the strategy we just have to return + + if (m_strategy) + { + box.getSettingValue(getClassifierIndex(box), name); + const size_t i = getStrategyIndex() + 1; + if (m_strategyClassID == OVP_ClassId_Algorithm_ClassifierOneVsOne) + { + const CIdentifier typeID = this->getTypeManager().getEnumerationEntryValueFromName( + OVP_TypeId_OneVsOne_DecisionAlgorithms, name); + OV_ERROR_UNLESS_KRF(typeID != CIdentifier::undefined(), + "Unable to find Pairwise Decision for the algorithm [" << m_classifierClassID.str() << "]", + Kernel::ErrorType::BadConfig); + + //As we just switch to this strategy, we take the default value set in the strategy to initialize the value + Kernel::IParameter* param = m_strategy->getInputParameter(OVP_Algorithm_OneVsOneStrategy_InputParameterId_DecisionType); + const Kernel::TParameterHandler ip_param(param); + const uint64_t value = ip_param; + name = this->getTypeManager().getEnumerationEntryNameFromValue(typeID, value); + + const CString paramName = this->getTypeManager().getTypeName(typeID); + + DEBUG_PRINT(std::cout << "Adding setting (case C) " << paramName << " : '" << name << "' to index " << i << "\n";) + box.addSetting(paramName, typeID, name, i); + + m_strategyAmountSettings = 1; + } + } + + return true; + } + + bool onAlgorithmClassifierChanged(Kernel::IBox& box) + { + CString name; + box.getSettingValue(getClassifierIndex(box), name); + CIdentifier id = this->getTypeManager().getEnumerationEntryValueFromName(OVTK_TypeId_ClassificationAlgorithm, name); + if (id != m_classifierClassID) + { + if (m_classifier) + { + m_classifier->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_classifier); + m_classifier = nullptr; + m_classifierClassID = CIdentifier::undefined(); + } + if (id != CIdentifier::undefined()) + { + m_classifier = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(id)); + m_classifier->initialize(); + m_classifierClassID = id; + } + + //Disable the graphical refresh to avoid abusive redraw (not really a problem) + while (box.getSettingCount() >= m_customSettingBase + box.getInputCount() + getStrategySettingsCount(box)) + { + box.removeSetting(getClassifierIndex(box) + 1); + } + } + else { return true; }//If we don't change the algorithm we just have to return + + if (m_classifier) + { + size_t i = getClassifierIndex(box) + 1; + while ((id = m_classifier->getNextInputParameterIdentifier(id)) != CIdentifier::undefined()) + { + if ((id != OVTK_Algorithm_Classifier_InputParameterId_FeatureVector) + && (id != OVTK_Algorithm_Classifier_InputParameterId_FeatureVectorSet) + && (id != OVTK_Algorithm_Classifier_InputParameterId_Config) + && (id != OVTK_Algorithm_Classifier_InputParameterId_NClasses) + && (id != OVTK_Algorithm_Classifier_InputParameterId_ExtraParameter)) + { + CIdentifier typeID; + CString paramName = m_classifier->getInputParameterName(id); + Kernel::IParameter* param = m_classifier->getInputParameter(id); + Kernel::TParameterHandler ip_iParameter(param); + Kernel::TParameterHandler ip_uiParameter(param); + Kernel::TParameterHandler ip_dParameter(param); + Kernel::TParameterHandler ip_bParameter(param); + Kernel::TParameterHandler ip_sParameter(param); + std::string buffer; + bool valid = true; + switch (param->getType()) + { + case Kernel::ParameterType_Enumeration: + buffer = this->getTypeManager().getEnumerationEntryNameFromValue(param->getSubTypeIdentifier(), ip_uiParameter).toASCIIString(); + typeID = param->getSubTypeIdentifier(); + break; + + case Kernel::ParameterType_Integer: + case Kernel::ParameterType_UInteger: + buffer = std::to_string(int64_t(ip_iParameter)); + typeID = OV_TypeId_Integer; + break; + + case Kernel::ParameterType_Boolean: + buffer = (bool(ip_bParameter)) ? "true" : "false"; + typeID = OV_TypeId_Boolean; + break; + + case Kernel::ParameterType_Float: + buffer = std::to_string(double(ip_dParameter)); + typeID = OV_TypeId_Float; + break; + case Kernel::ParameterType_String: + buffer = static_cast(ip_sParameter)->toASCIIString(); + typeID = OV_TypeId_String; + break; + default: + std::cout << "Invalid parameter type " << param->getType() << "\n"; + valid = false; + break; + } + + if (valid) + { + // @FIXME argh, the -2 is a hard coding that the classifier trainer has 2 settings after the classifier setting... ouch + DEBUG_PRINT(std::cout << "Adding setting (case A) " << paramName << " : " << buffer << " to slot " + << box.getSettingCount() - 2 << "\n";) + box.addSetting(paramName, typeID, buffer.c_str(), box.getSettingCount() - 2); + i++; + } + } + } + } + // This changes the pairwise strategy decision voting type of the box settings allowing + // designer to list the correct choices in the combo box. + updateDecision(box); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) + +protected: + + CIdentifier m_classifierClassID = CIdentifier::undefined(); + CIdentifier m_strategyClassID = + 0x0; // CIdentifier::undefined() is already use, We initialize to an unused identifier in the strategy list + Kernel::IAlgorithmProxy* m_classifier = nullptr; + Kernel::IAlgorithmProxy* m_strategy = nullptr; + const size_t m_customSettingBase = 0; + int m_strategyAmountSettings = -1; +}; +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmVotingClassifier.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmVotingClassifier.cpp new file mode 100644 index 0000000..9e4d7c6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmVotingClassifier.cpp @@ -0,0 +1,198 @@ +#include "ovpCBoxAlgorithmVotingClassifier.h" + +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + +bool CBoxAlgorithmVotingClassifier::initialize() +{ + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + + m_classificationChoiceEncoder.initialize(*this, 0); + + CIdentifier typeID; + boxContext.getInputType(0, typeID); + m_matrixBased = (typeID == OV_TypeId_StreamedMatrix); + + for (size_t i = 0; i < boxContext.getInputCount(); ++i) + { + input_t& input = m_results[i]; + if (m_matrixBased) + { + auto* decoder = new Toolkit::TStreamedMatrixDecoder(); + decoder->initialize(*this, i); + input.decoder = decoder; + input.op_matrix = decoder->getOutputMatrix(); + input.twoValueInput = false; + } + else + { + auto* decoder = new Toolkit::TStimulationDecoder(); + decoder->initialize(*this, i); + input.decoder = decoder; + input.op_stimSet = decoder->getOutputStimulationSet(); + input.twoValueInput = false; + } + } + + m_nRepetitions = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_targetClassLabel = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_nonTargetClassLabel = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + m_rejectClassLabel = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + m_resultClassLabelBase = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + m_chooseOneIfExAequo = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5); + + m_lastTime = 0; + + m_classificationChoiceEncoder.encodeHeader(); + this->getDynamicBoxContext().markOutputAsReadyToSend(0, m_lastTime, this->getPlayerContext().getCurrentTime()); + + return true; +} + +bool CBoxAlgorithmVotingClassifier::uninitialize() +{ + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + for (size_t i = 0; i < nInput; ++i) + { + input_t& input = m_results[i]; + input.decoder->uninitialize(); + delete input.decoder; + } + + m_classificationChoiceEncoder.uninitialize(); + + return true; +} + +bool CBoxAlgorithmVotingClassifier::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmVotingClassifier::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + bool canChoose = true; + + for (size_t i = 0; i < nInput; ++i) + { + input_t& input = m_results[i]; + for (size_t j = 0; j < boxContext.getInputChunkCount(i); ++j) + { + input.decoder->decode(j); + + if (input.decoder->isHeaderReceived()) + { + if (m_matrixBased) + { + if (input.op_matrix->getBufferElementCount() != 1) + { + OV_ERROR_UNLESS_KRF(input.op_matrix->getBufferElementCount() == 2, + "Invalid input matrix with [" << input.op_matrix->getBufferElementCount() << "] (expected values must be 1 or 2)", + Kernel::ErrorType::BadInput); + + this->getLogManager() << Kernel::LogLevel_Debug << + "Input got two dimensions, the value use for the vote will be the difference between the two values\n"; + input.twoValueInput = true; + } + } + } + if (input.decoder->isBufferReceived()) + { + if (m_matrixBased) + { + double value; + if (input.twoValueInput) { value = input.op_matrix->getBuffer()[1] - input.op_matrix->getBuffer()[0]; } + else { value = input.op_matrix->getBuffer()[0]; } + input.scores.push_back(std::pair(-value, boxContext.getInputChunkEndTime(i, j))); + } + else + { + for (size_t k = 0; k < input.op_stimSet->getStimulationCount(); ++k) + { + const uint64_t id = input.op_stimSet->getStimulationIdentifier(k); + if (id == m_targetClassLabel || id == m_nonTargetClassLabel || id == m_rejectClassLabel) + { + input.scores.push_back(std::pair(id == m_targetClassLabel ? 1 : 0, input.op_stimSet->getStimulationDate(k))); + } + } + } + } + if (input.decoder->isEndReceived()) + { + m_classificationChoiceEncoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, m_lastTime, this->getPlayerContext().getCurrentTime()); + } + } + + if (input.scores.size() < m_nRepetitions) { canChoose = false; } + } + + if (canChoose) + { + double score = -1E100; + uint64_t classLabel = m_rejectClassLabel; + uint64_t time = 0; + + std::map scores; + for (size_t i = 0; i < nInput; ++i) + { + input_t& input = m_results[i]; + scores[i] = 0; + for (size_t j = 0; j < m_nRepetitions; ++j) { scores[i] += input.scores[j].first; } + + if (scores[i] > score) + { + score = scores[i]; + classLabel = m_resultClassLabelBase + i; + time = input.scores[size_t(m_nRepetitions - 1)].second; + } + else if (scores[i] == score) + { + if (!m_chooseOneIfExAequo) + { + score = scores[i]; + classLabel = m_rejectClassLabel; + time = input.scores[size_t(m_nRepetitions - 1)].second; + } + } + + input.scores.erase(input.scores.begin(), input.scores.begin() + int(m_nRepetitions)); + + this->getLogManager() << Kernel::LogLevel_Debug << "Input " << i << " got score " << scores[i] << "\n"; + } + + if (classLabel != m_rejectClassLabel) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Chosen " << this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, classLabel) + << " with score " << score << "\n"; + } + else + { + this->getLogManager() << Kernel::LogLevel_Debug << "Chosen rejection " + << this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, classLabel) << "\n"; + } + m_classificationChoiceEncoder.getInputStimulationSet()->clear(); + m_classificationChoiceEncoder.getInputStimulationSet()->appendStimulation(classLabel, time, 0); + + m_classificationChoiceEncoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, m_lastTime, time); + m_lastTime = time; + } + + return true; +} + +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmVotingClassifier.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmVotingClassifier.h new file mode 100644 index 0000000..dceaca8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmVotingClassifier.h @@ -0,0 +1,135 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Classification { +class CBoxAlgorithmVotingClassifier final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_VotingClassifier) + +protected: + + size_t m_nRepetitions = 0; + size_t m_targetClassLabel = 0; + size_t m_nonTargetClassLabel = 0; + size_t m_rejectClassLabel = 0; + size_t m_resultClassLabelBase = 0; + bool m_chooseOneIfExAequo = false; + +private: + + typedef struct + { + Toolkit::TDecoder* decoder = nullptr; + Kernel::TParameterHandler op_stimSet; + Kernel::TParameterHandler op_matrix; + bool twoValueInput; + std::vector> scores; + } input_t; + + std::map m_results; + + Toolkit::TStimulationEncoder m_classificationChoiceEncoder; + Kernel::TParameterHandler ip_classificationChoiceStimSet; + + uint64_t m_lastTime = 0; + bool m_matrixBased = false; +}; + +class CBoxAlgorithmVotingClassifierListener final : public Toolkit::TBoxListener +{ +public: + + CBoxAlgorithmVotingClassifierListener() : m_inputTypeID(OV_TypeId_Stimulations) { } + + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier id = CIdentifier::undefined(); + box.getInputType(index, id); + if (id == OV_TypeId_Stimulations || id == OV_TypeId_StreamedMatrix) + { + m_inputTypeID = id; + for (size_t i = 0; i < box.getInputCount(); ++i) { box.setInputType(i, m_inputTypeID); } + } + else { box.setInputType(index, m_inputTypeID); } + return true; + } + + bool onInputAdded(Kernel::IBox& box, const size_t /*index*/) override + { + for (size_t i = 0; i < box.getInputCount(); ++i) + { + box.setInputType(i, m_inputTypeID); + box.setInputName(i, ("Classification result " + std::to_string(i)).c_str()); + } + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) + +protected: + + CIdentifier m_inputTypeID = CIdentifier::undefined(); +}; + +class CBoxAlgorithmVotingClassifierDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Voting Classifier"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Majority voting classifier. Returns the chosen class."); } + + CString getDetailedDescription() const override + { + return CString( + "Each classifier used as input is assumed to have its own two-class output stream. Mainly designed for P300 scenario use."); + } + + CString getCategory() const override { return CString("Classification"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_VotingClassifier; } + IPluginObject* create() override { return new CBoxAlgorithmVotingClassifier; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Classification result 1", OV_TypeId_Stimulations); + prototype.addInput("Classification result 2", OV_TypeId_Stimulations); + prototype.addOutput("Classification choice", OV_TypeId_Stimulations); + prototype.addSetting("Number of repetitions", OV_TypeId_Integer, "12"); + prototype.addSetting("Target class label", OV_TypeId_Stimulation, "OVTK_StimulationId_Target"); + prototype.addSetting("Non target class label", OV_TypeId_Stimulation, "OVTK_StimulationId_NonTarget"); + prototype.addSetting("Reject class label", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00"); + prototype.addSetting("Result class label base", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_01"); + prototype.addSetting("Choose one if ex-aequo", OV_TypeId_Boolean, "false"); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + return true; + } + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmVotingClassifierListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_VotingClassifierDesc) +}; +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/ovp_defines.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/ovp_defines.h new file mode 100755 index 0000000..cf928e7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/ovp_defines.h @@ -0,0 +1,83 @@ +#pragma once + +#define OVP_Classification_BoxTrainerFormatVersion 4 +#define OVP_Classification_BoxTrainerFormatVersionRequired 4 + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#define OVP_TypeId_ClassificationPairwiseStrategy OpenViBE::CIdentifier(0x0DD51C74, 0x3C4E74C9) +#define OVP_TypeId_OneVsOne_DecisionAlgorithms OpenViBE::CIdentifier(0xDEC1510, 0xDEC1510) + +#define OVP_ClassId_Algorithm_ClassifierLDA OpenViBE::CIdentifier(0x2BA17A3C, 0x1BD46D84) +#define OVP_ClassId_Algorithm_ClassifierLDA_DecisionAvailable OpenViBE::CIdentifier(0x79146976, 0xD7F01A25) +#define OVP_ClassId_Algorithm_ClassifierLDADesc OpenViBE::CIdentifier(0x78FE2929, 0x644945B4) +#define OVP_ClassId_Algorithm_ClassifierNULL OpenViBE::CIdentifier(0x043D09AB, 0xCB5E4859) +#define OVP_ClassId_Algorithm_ClassifierNULLDesc OpenViBE::CIdentifier(0x3B365233, 0x812C47DD) +#define OVP_ClassId_Algorithm_ClassifierOneVsOne OpenViBE::CIdentifier(0x638C2F90, 0xEAE10226) +#define OVP_ClassId_Algorithm_ClassifierOneVsOneDesc OpenViBE::CIdentifier(0xE78E7CDB, 0x369AA9EF) +#define OVP_ClassId_Algorithm_ClassifierOneVsAll OpenViBE::CIdentifier(0xD7183FC6, 0xBD74F297) +#define OVP_ClassId_Algorithm_ClassifierOneVsAllDesc OpenViBE::CIdentifier(0xD42D5449, 0x7A28DDB0) +#define OVP_ClassId_Algorithm_ConditionedCovariance OpenViBE::CIdentifier(0x0F3B77A6, 0x0301518A) +#define OVP_ClassId_Algorithm_ConditionedCovarianceDesc OpenViBE::CIdentifier(0x18D15C41, 0x70545A66) +#define OVP_ClassId_Algorithm_PairwiseDecision OpenViBE::CIdentifier(0x26EF6DDA, 0xF137053C) +#define OVP_ClassId_Algorithm_PairwiseDecisionDesc OpenViBE::CIdentifier(0x191EB02A, 0x6866214A) +#define OVP_ClassId_Algorithm_PairwiseDecision_HT OpenViBE::CIdentifier(0xD24F7F19, 0xA744FAD2) +#define OVP_ClassId_Algorithm_PairwiseDecision_HTDesc OpenViBE::CIdentifier(0xE837F5C0, 0xF65C1341) +#define OVP_ClassId_Algorithm_PairwiseDecision_Voting OpenViBE::CIdentifier(0xA111B830, 0x4679BAFD) +#define OVP_ClassId_Algorithm_PairwiseDecision_VotingDesc OpenViBE::CIdentifier(0xAC5A39E8, 0x3A57822A) +#define OVP_ClassId_Algorithm_PairwiseStrategy_PKPD OpenViBE::CIdentifier(0x26EF6DDA, 0xF137053C) +#define OVP_ClassId_Algorithm_PairwiseStrategy_PKPDDesc OpenViBE::CIdentifier(0x191EB02A, 0x6866214A) +#define OVP_ClassId_BoxAlgorithm_ClassifierProcessor OpenViBE::CIdentifier(0x5FE23D17, 0x95B0452C) +#define OVP_ClassId_BoxAlgorithm_ClassifierProcessorDesc OpenViBE::CIdentifier(0x29B66B00, 0xB4683D49) +#define OVP_ClassId_BoxAlgorithm_ClassifierTrainer OpenViBE::CIdentifier(0xF3DAE8A8, 0x3B444154) +#define OVP_ClassId_BoxAlgorithm_ClassifierTrainerDesc OpenViBE::CIdentifier(0xFE277C91, 0x1593B824) +#define OVP_ClassId_BoxAlgorithm_VotingClassifier OpenViBE::CIdentifier(0xFAF62C2B, 0x0B75D1B3) +#define OVP_ClassId_BoxAlgorithm_VotingClassifierDesc OpenViBE::CIdentifier(0x97E3CCC5, 0xAC353ED2) + +#define OVP_Algorithm_ClassifierLDA_InputParameterId_UseShrinkage OpenViBE::CIdentifier(0x01357534, 0x028312A0) +#define OVP_Algorithm_ClassifierLDA_InputParameterId_Shrinkage OpenViBE::CIdentifier(0x01357534, 0x028312A1) +#define OVP_Algorithm_ClassifierLDA_InputParameterId_DiagonalCov OpenViBE::CIdentifier(0x067E45C5, 0x15285CC7) +#define OVP_Algorithm_ClassifierNULL_InputParameterId_Parameter1 OpenViBE::CIdentifier(0x6DA99952, 0x7E72C143) +#define OVP_Algorithm_ClassifierNULL_InputParameterId_Parameter2 OpenViBE::CIdentifier(0xEAC5694A, 0x56CFEF02) +#define OVP_Algorithm_ClassifierNULL_InputParameterId_Parameter3 OpenViBE::CIdentifier(0x72F6222D, 0x375BAE2C) +#define OVP_Algorithm_OneVsOneStrategy_InputParameterId_DecisionType OpenViBE::CIdentifier(0x0C347BBA, 0x180577F9) +#define OVP_Algorithm_ConditionedCovariance_InputParameterId_Shrinkage OpenViBE::CIdentifier(0x54B90EA7, 0x600A4ACC) +#define OVP_Algorithm_ConditionedCovariance_InputParameterId_FeatureVectorSet OpenViBE::CIdentifier(0x2CF30E42, 0x051F3996) +#define OVP_Algorithm_ConditionedCovariance_OutputParameterId_Mean OpenViBE::CIdentifier(0x0C671FB7, 0x550B01B3) +#define OVP_Algorithm_ConditionedCovariance_OutputParameterId_CovarianceMatrix OpenViBE::CIdentifier(0x19F07FB4, 0x084E273B) +#define OVP_Algorithm_Classifier_InputParameter_ProbabilityMatrix OpenViBE::CIdentifier(0xF48D35AD, 0xB8EFF834) +#define OVP_Algorithm_Classifier_Pairwise_InputParameterId_Config OpenViBE::CIdentifier(0x10EBAC09, 0x80926A63) +#define OVP_Algorithm_Classifier_Pairwise_InputParameterId_AlgorithmIdentifier OpenViBE::CIdentifier(0xBE71BE18, 0x82A0E017) +#define OVP_Algorithm_Classifier_Pairwise_InputParameterId_SetRepartition OpenViBE::CIdentifier(0xBE71BE18, 0x82A0E018) +#define OVP_Algorithm_Classifier_Pairwise_InputParameter_ClassificationOutputs OpenViBE::CIdentifier(0xBE71BE18, 0x82A0E019) +#define OVP_Algorithm_Classifier_Pairwise_InputParameter_ClassCount OpenViBE::CIdentifier(0xBE71BE18, 0x82A0E01A) +#define OVP_Algorithm_Classifier_OutputParameter_ProbabilityVector OpenViBE::CIdentifier(0x883599FE, 0x2FDB32FF) +#define OVP_Algorithm_Classifier_Pairwise_OutputParameterId_Config OpenViBE::CIdentifier(0x69F05A61, 0x25C94515) +#define OVP_Algorithm_Classifier_Pairwise_InputTriggerId_Train OpenViBE::CIdentifier(0x32219D21, 0xD3BE6105) +#define OVP_Algorithm_Classifier_Pairwise_InputTriggerId_Parameterize OpenViBE::CIdentifier(0x32219D21, 0xD3BE6106) +#define OVP_Algorithm_Classifier_Pairwise_InputTriggerId_Compute OpenViBE::CIdentifier(0x3637344B, 0x05D03D7E) +#define OVP_Algorithm_Classifier_Pairwise_InputTriggerId_SaveConfig OpenViBE::CIdentifier(0xF19574AD, 0x024045A7) +#define OVP_Algorithm_Classifier_Pairwise_InputTriggerId_LoadConfig OpenViBE::CIdentifier(0x97AF6C6C, 0x670A12E6) + +extern const char* const FORMAT_VERSION_ATTRIBUTE_NAME; +extern const char* const IDENTIFIER_ATTRIBUTE_NAME; + +extern const char* const STRATEGY_NODE_NAME; +extern const char* const ALGORITHM_NODE_NAME; +extern const char* const STIMULATIONS_NODE_NAME; +extern const char* const REJECTED_CLASS_NODE_NAME; +extern const char* const CLASS_STIMULATION_NODE_NAME; + +extern const char* const CLASSIFICATION_BOX_ROOT; +extern const char* const CLASSIFIER_ROOT; + +extern const char* const PAIRWISE_STRATEGY_ENUMERATION_NAME; + +extern const char* const MLP_EVALUATION_FUNCTION_NAME; +extern const char* const MLP_TRANSFERT_FUNCTION_NAME; + +bool OVFloatEqual(double first, double second); diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/ovp_main.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/ovp_main.cpp new file mode 100755 index 0000000..385f9c6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/classification/src/ovp_main.cpp @@ -0,0 +1,90 @@ +#include + +#include "ovp_defines.h" +#include "toolkit/algorithms/classification/ovtkCAlgorithmPairingStrategy.h" //For comparision mecanism + +#include "algorithms/ovpCAlgorithmClassifierNULL.h" +#include "algorithms/ovpCAlgorithmClassifierOneVsAll.h" +#include "algorithms/ovpCAlgorithmClassifierOneVsOne.h" + +#include "algorithms/ovpCAlgorithmPairwiseDecision.h" +#include "algorithms/ovpCAlgorithmPairwiseStrategyPKPD.h" +#include "algorithms/ovpCAlgorithmPairwiseDecisionVoting.h" +#include "algorithms/ovpCAlgorithmPairwiseDecisionHT.h" + +#include "box-algorithms/ovpCBoxAlgorithmVotingClassifier.h" +#include "box-algorithms/ovpCBoxAlgorithmClassifierTrainer.h" +#include "box-algorithms/ovpCBoxAlgorithmClassifierProcessor.h" + +#if defined TARGET_HAS_ThirdPartyEIGEN +#include "algorithms/ovpCAlgorithmConditionedCovariance.h" +#include "algorithms/ovpCAlgorithmClassifierLDA.h" +#endif // TARGET_HAS_ThirdPartyEIGEN + +#include + +const char* const PAIRWISE_STRATEGY_ENUMERATION_NAME = "Pairwise Decision Strategy"; + +namespace OpenViBE { +namespace Plugins { +namespace Classification { + + +OVP_Declare_Begin() + context.getTypeManager().registerEnumerationEntry(OVTK_TypeId_ClassificationStrategy, "Native", CIdentifier::undefined().id()); + context.getTypeManager().registerEnumerationEntry(OVTK_TypeId_ClassificationStrategy, "OneVsAll", OVP_ClassId_Algorithm_ClassifierOneVsAll.id()); + context.getTypeManager().registerEnumerationEntry(OVTK_TypeId_ClassificationStrategy, "OneVsOne", OVP_ClassId_Algorithm_ClassifierOneVsOne.id()); + + // context.getTypeManager().registerEnumerationEntry(OVTK_TypeId_ClassificationAlgorithm, "NULL Classifier (does nothing)",OVP_ClassId_Algorithm_ClassifierNULL.id()); + // OVP_Declare_New(CAlgorithmClassifierNULLDesc); + + + OVP_Declare_New(CBoxAlgorithmVotingClassifierDesc); + OVP_Declare_New(CBoxAlgorithmClassifierTrainerDesc); + OVP_Declare_New(CBoxAlgorithmClassifierProcessorDesc); + + OVP_Declare_New(CAlgorithmClassifierOneVsAllDesc); + OVP_Declare_New(CAlgorithmClassifierOneVsOneDesc); + + // Functions related to deciding winner in OneVsOne multiclass decision strategy + context.getTypeManager().registerEnumerationType(OVP_TypeId_ClassificationPairwiseStrategy, PAIRWISE_STRATEGY_ENUMERATION_NAME); + + OVP_Declare_New(CAlgorithmPairwiseStrategyPKPDDesc); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_ClassificationPairwiseStrategy, "PKPD", OVP_ClassId_Algorithm_PairwiseStrategy_PKPD.id()); + OVP_Declare_New(CAlgorithmPairwiseDecisionVotingDesc); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_ClassificationPairwiseStrategy, "Voting", OVP_ClassId_Algorithm_PairwiseDecision_Voting.id()); + OVP_Declare_New(CAlgorithmPairwiseDecisionHTDesc); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_ClassificationPairwiseStrategy, "HT", OVP_ClassId_Algorithm_PairwiseDecision_HT.id()); + +#if defined TARGET_HAS_ThirdPartyEIGEN + OVP_Declare_New(CAlgorithmConditionedCovarianceDesc); + + context.getTypeManager().registerEnumerationEntry(OVTK_TypeId_ClassificationAlgorithm, "Linear Discrimimant Analysis (LDA)", + OVP_ClassId_Algorithm_ClassifierLDA.id()); + Toolkit::registerClassificationComparisonFunction(OVP_ClassId_Algorithm_ClassifierLDA, LDAClassificationCompare); + OVP_Declare_New(CAlgorithmClassifierLDADesc); + context.getTypeManager().registerEnumerationType(OVP_ClassId_Algorithm_ClassifierLDA_DecisionAvailable, PAIRWISE_STRATEGY_ENUMERATION_NAME); + context.getTypeManager().registerEnumerationEntry( + OVP_ClassId_Algorithm_ClassifierLDA_DecisionAvailable, "PKPD", OVP_ClassId_Algorithm_PairwiseStrategy_PKPD.id()); + context.getTypeManager().registerEnumerationEntry( + OVP_ClassId_Algorithm_ClassifierLDA_DecisionAvailable, "Voting", OVP_ClassId_Algorithm_PairwiseDecision_Voting.id()); + context.getTypeManager().registerEnumerationEntry( + OVP_ClassId_Algorithm_ClassifierLDA_DecisionAvailable, "HT", OVP_ClassId_Algorithm_PairwiseDecision_HT.id()); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_OneVsOne_DecisionAlgorithms, "One vs One Decision Algorithms"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_OneVsOne_DecisionAlgorithms, "Linear Discrimimant Analysis (LDA)", + OVP_ClassId_Algorithm_ClassifierLDA_DecisionAvailable.id()); + +#endif // TARGET_HAS_ThirdPartyEIGEN + +OVP_Declare_End() + +} // namespace Classification +} // namespace Plugins +} // namespace OpenViBE + +bool OVFloatEqual(const double first, const double second) +{ + const double epsilon = 0.000001; + return epsilon > fabs(first - second); +} diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/CMakeLists.txt new file mode 100644 index 0000000..dea9375 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/CMakeLists.txt @@ -0,0 +1,38 @@ +PROJECT(openvibe-plugins-sdk-data-generation) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl) +INCLUDE("FindSourceRCProperties") +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleXML") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials) diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/box-tutorials/time-signal.xml b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/box-tutorials/time-signal.xml new file mode 100644 index 0000000..c6b274e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/box-tutorials/time-signal.xml @@ -0,0 +1,192 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x000015f6, 0x00002e14) + Matrix Display + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:100,100,100; 100:100,100,100 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 0 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x5f3d3b70, 0x223fa5b7) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 8 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + -80 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + + + (0x00004fef, 0x00006a19) + + (0x5f3d3b70, 0x223fa5b7) + 0 + + + (0x000015f6, 0x00002e14) + 0 + + + + + + (0x0000019a, 0x000047dc) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 704 + + + (0x7234b86b, 0x2b8651a5) + -80 + + + + + + + (0x05377d7e, 0x41751bb3) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x000015f6, 0x00002e14)","childCount":0,"identifier":"(0x000055e3, 0x0000746e)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3}] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x7b814cca, 0x271df6dd) + 475 + + + (0x8c1fc55b, 0x7b433dc2) + 1.0 + + + (0x9f5c4075, 0x4a0d3666) + Classification training example + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + box-tutorials + + + (0xf8034a49, 0x8b3f37cc) + Inria + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/doc/Doc_BoxAlgorithm_TimeSignal.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/doc/Doc_BoxAlgorithm_TimeSignal.dox-part new file mode 100644 index 0000000..6153e84 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/doc/Doc_BoxAlgorithm_TimeSignal.dox-part @@ -0,0 +1,61 @@ +/** + * \page BoxAlgorithm_TimeSignal Time signal +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TimeSignal_Description| + * This box generates a linear signal on a single channel. + * The box can be used in order to test some processings on a specific + * signal when no data is available. Each sample value of the generated + * signal exactly equals to time in second. + * |OVP_DocEnd_BoxAlgorithm_TimeSignal_Description| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TimeSignal_Outputs| + * |OVP_DocEnd_BoxAlgorithm_TimeSignal_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_TimeSignal_Output1| + * This output contains the generated signal. + * |OVP_DocEnd_BoxAlgorithm_TimeSignal_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TimeSignal_Settings| + * |OVP_DocEnd_BoxAlgorithm_TimeSignal_Settings| + + * |OVP_DocBegin_BoxAlgorithm_TimeSignal_Setting1| + * The first setting indicates the samling frequency of the produced signal in Hz. + * |OVP_DocEnd_BoxAlgorithm_TimeSignal_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_TimeSignal_Setting2| + * The last setting indicates how many sample will be sent for each output chunk. + * |OVP_DocEnd_BoxAlgorithm_TimeSignal_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TimeSignal_Examples| + * In order to illustrate this case, just drag'n drop a \ref Doc_BoxAlgorithm_SignalDisplay + * box on the scenario and connect its input to a sinus oscillator box. You will be able to + * see the generated signal. + * + * For better use of this box, consider using an additional \ref Doc_BoxAlgorithm_SimpleDSP + * box. Put whatever function you like in this box configuration and visualize it with the + * \ref Doc_BoxAlgorithm_SignalDisplay. + * |OVP_DocEnd_BoxAlgorithm_TimeSignal_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TimeSignal_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_TimeSignal_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/doc/boxes/Doc_BoxAlgorithm_TimeSignal.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/doc/boxes/Doc_BoxAlgorithm_TimeSignal.rst new file mode 100644 index 0000000..21420ef --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/doc/boxes/Doc_BoxAlgorithm_TimeSignal.rst @@ -0,0 +1,66 @@ +.. _Doc_BoxAlgorithm_TimeSignal: + +Time signal +=========== + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA/IRISA + +.. image:: images/Doc_BoxAlgorithm_TimeSignal.png + +This box generates a linear signal on a single channel. +The box can be used in order to test some processings on a specific +signal when no data is available. Each sample value of the generated +signal exactly equals to time in second. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Generated signal", "Signal" + +Generated signal +~~~~~~~~~~~~~~~~ + +This output contains the generated signal. + +.. _Doc_BoxAlgorithm_TimeSignal_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Sampling frequency", "Integer", "512" + "Generated epoch sample count", "Integer", "32" + +Sampling frequency +~~~~~~~~~~~~~~~~~~ + +The first setting indicates the samling frequency of the produced signal in Hz. + +Generated epoch sample count +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The last setting indicates how many sample will be sent for each output chunk. + +.. _Doc_BoxAlgorithm_TimeSignal_Examples: + +Examples +-------- + +In order to illustrate this case, just drag'n drop a :ref:`Doc_BoxAlgorithm_ContinuousOscilloscope` +box on the scenario and connect its input to a sinus oscillator box. You will be able to +see the generated signal. + +For better use of this box, consider using an additional :ref:`Doc_BoxAlgorithm_SimpleDSP` +box. Put whatever function you like in this box configuration and visualize it with the +:ref:`Doc_BoxAlgorithm_ContinuousOscilloscope`. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/doc/boxes/images/Doc_BoxAlgorithm_TimeSignal.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/doc/boxes/images/Doc_BoxAlgorithm_TimeSignal.png new file mode 100644 index 0000000..98abb6e Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/doc/boxes/images/Doc_BoxAlgorithm_TimeSignal.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmTimeSignalGenerator.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmTimeSignalGenerator.cpp new file mode 100644 index 0000000..24b3ff3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmTimeSignalGenerator.cpp @@ -0,0 +1,78 @@ +#include "ovpCBoxAlgorithmTimeSignalGenerator.h" + +namespace OpenViBE { +namespace Plugins { +namespace DataGeneration { + +bool CBoxAlgorithmTimeSignalGenerator::initialize() +{ + m_encoder.initialize(*this, 0); + + // Parses box settings to try connecting to server + m_sampling = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_nGeneratedEpochSample = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_headerSent = false; + + m_nSentSample = 0; + + return true; +} + +bool CBoxAlgorithmTimeSignalGenerator::uninitialize() +{ + m_encoder.uninitialize(); + return true; +} + +bool CBoxAlgorithmTimeSignalGenerator::processClock(Kernel::CMessageClock& /*msg*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmTimeSignalGenerator::process() +{ + Kernel::IBoxIO* boxContext = getBoxAlgorithmContext()->getDynamicBoxContext(); + + if (!m_headerSent) + { + m_encoder.getInputSamplingRate() = m_sampling; + + CMatrix* matrix = m_encoder.getInputMatrix(); + + matrix->resize(1, m_nGeneratedEpochSample); + matrix->setDimensionLabel(0, 0, "Time signal"); + + m_encoder.encodeHeader(); + + m_headerSent = true; + + boxContext->markOutputAsReadyToSend(0, 0, 0); + } + else + { + // Create sample chunks up until the next step (current time + 1/128) but do not overshoot it + // This way we will always create the correct number of samples for frequencies that are above 128Hz + const uint64_t nextStepDate = CTime(uint64_t(this->getPlayerContext().getCurrentTime() + (1ULL << 25))).toSampleCount(m_sampling); + while (m_nSentSample + m_nGeneratedEpochSample < nextStepDate) + { + double* buffer = m_encoder.getInputMatrix()->getBuffer(); + + for (size_t i = 0; i < m_nGeneratedEpochSample; ++i) { buffer[i] = (i + m_nSentSample) / double(m_sampling); } + + m_encoder.encodeBuffer(); + + const uint64_t tStart = CTime(m_sampling, m_nSentSample).time(); + m_nSentSample += m_nGeneratedEpochSample; + const uint64_t tEnd = CTime(m_sampling, m_nSentSample).time(); + + boxContext->markOutputAsReadyToSend(0, tStart, tEnd); + } + } + + return true; +} + +} // namespace DataGeneration +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmTimeSignalGenerator.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmTimeSignalGenerator.h new file mode 100644 index 0000000..07056f0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/src/box-algorithms/ovpCBoxAlgorithmTimeSignalGenerator.h @@ -0,0 +1,70 @@ +#pragma once + +#include "../ovp_defines.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace DataGeneration { +class CBoxAlgorithmTimeSignalGenerator final : public Toolkit::TBoxAlgorithm +{ +public: + + CBoxAlgorithmTimeSignalGenerator() {} + void release() override { delete this; } + + uint64_t getClockFrequency() override { return 128LL << 32; } + + bool initialize() override; + bool uninitialize() override; + + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_TimeSignalGenerator) + +protected: + + Toolkit::TSignalEncoder m_encoder; + + bool m_headerSent = false; + size_t m_sampling = 0; + size_t m_nGeneratedEpochSample = 0; + size_t m_nSentSample = 0; +}; + +class CBoxAlgorithmTimeSignalGeneratorDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + CString getName() const override { return CString("Time signal"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Simple time signal generator (for use with DSP)"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Data generation"); } + CString getVersion() const override { return CString("1.1"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.4.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_TimeSignalGenerator; } + IPluginObject* create() override { return new CBoxAlgorithmTimeSignalGenerator(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addOutput("Generated signal", OV_TypeId_Signal); + + prototype.addSetting("Sampling frequency", OV_TypeId_Integer, "512"); + prototype.addSetting("Generated epoch sample count", OV_TypeId_Integer, "32"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_TimeSignalGeneratorDesc) +}; +} // namespace DataGeneration +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/src/ovp_defines.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/src/ovp_defines.h new file mode 100644 index 0000000..e4e5a41 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/src/ovp_defines.h @@ -0,0 +1,11 @@ +#pragma once + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + + +#define OVP_ClassId_BoxAlgorithm_TimeSignalGenerator OpenViBE::CIdentifier(0x28A5E7FF, 0x530095DE) +#define OVP_ClassId_BoxAlgorithm_TimeSignalGeneratorDesc OpenViBE::CIdentifier(0x57AD8655, 0x1966B4DC) diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/src/ovp_main.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/src/ovp_main.cpp new file mode 100644 index 0000000..d9174cc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/data-generation/src/ovp_main.cpp @@ -0,0 +1,7 @@ +#include "ovp_defines.h" + +#include "box-algorithms/ovpCBoxAlgorithmTimeSignalGenerator.h" + +OVP_Declare_Begin() + OVP_Declare_New(OpenViBE::Plugins::DataGeneration::CBoxAlgorithmTimeSignalGeneratorDesc); +OVP_Declare_End() diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/CMakeLists.txt new file mode 100644 index 0000000..cc13fca --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/CMakeLists.txt @@ -0,0 +1,36 @@ +PROJECT(openvibe-plugins-sdk-feature-extraction) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials) diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/box-tutorials/feature-aggregator.xml b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/box-tutorials/feature-aggregator.xml new file mode 100644 index 0000000..81d3130 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/box-tutorials/feature-aggregator.xml @@ -0,0 +1,360 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x000001b3, 0x00001dd9) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x004294b2, 0xfe7e8a08) + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 384 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004b1b63) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003622, 0x0000376c) + Matrix Display + (0x54f0796d, 0x3ede2cc0) + + + (0x544a003e, 0x6dcba5f6) + Matrix + + + + + (0x3d3c7c7f, 0xef0e7129) + Color gradient + 0:2,36,58; 50:100,100,100; 100:83,17,20 + 0:2,36,58; 50:100,100,100; 100:83,17,20 + false + + + (0x007deef9, 0x2f3e95c6) + Steps + 100 + 100 + false + + + (0x2cdb2f0b, 0x12f231ea) + Symetric min/max + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Real time min/max + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 736 + + + (0x4e7b798a, 0x183beafb) + (0x4ff49bdb, 0x9dcf6788) + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00003ad0, 0x00003967) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x+10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 320 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00003dc7, 0x0000468d) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 256 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 688 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00003dc7, 0x0000468e) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 256 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 4 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 784 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + + + (0x00000587, 0x00007793) + + (0x000001b3, 0x00001dd9) + 0 + + + (0x00003622, 0x0000376c) + 0 + + + + (0x000016f7, 0x00005cd1) + + (0x00003ad0, 0x00003967) + 0 + + + (0x000001b3, 0x00001dd9) + (0x004294b2, 0xfe7e8a08) + + + + (0x00004b52, 0x00001eef) + + (0x00003dc7, 0x0000468d) + 0 + + + (0x000001b3, 0x00001dd9) + 0 + + + + (0x0000778e, 0x00002620) + + (0x00003dc7, 0x0000468e) + 0 + + + (0x00003ad0, 0x00003967) + 0 + + + + + + (0x0000019a, 0x000047dc) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 736 + + + (0x7234b86b, 0x2b8651a5) + 160 + + + + + + + (0x00004cc5, 0x0000007c) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x000050a5, 0x00005401)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0x00003622, 0x0000376c)","childCount":0,"identifier":"(0x00006730, 0x000037b5)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00006ebd, 0x00002449)","index":0,"name":"Default tab","parentIdentifier":"(0x000050a5, 0x00005401)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000055d0, 0x0000606d)","index":0,"name":"Empty","parentIdentifier":"(0x00006ebd, 0x00002449)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/doc/Doc_BoxAlgorithm_FeatureAggregator.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/doc/Doc_BoxAlgorithm_FeatureAggregator.dox-part new file mode 100644 index 0000000..c354ef6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/doc/Doc_BoxAlgorithm_FeatureAggregator.dox-part @@ -0,0 +1,52 @@ +/** + * \page BoxAlgorithm_FeatureAggregator Feature aggregator +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeatureAggregator_Description| + * This plugins aggregates the features it receives on its inputs + * into a feature vector that can be used for classification. + * |OVP_DocEnd_BoxAlgorithm_FeatureAggregator_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeatureAggregator_Inputs| + * |OVP_DocEnd_BoxAlgorithm_FeatureAggregator_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_FeatureAggregator_Input1| + * A stream of matrices containing features. + * |OVP_DocEnd_BoxAlgorithm_FeatureAggregator_Input1| + + * |OVP_DocBegin_BoxAlgorithm_FeatureAggregator_Input2| + * A stream of matrices containing features. + * |OVP_DocEnd_BoxAlgorithm_FeatureAggregator_Input2| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeatureAggregator_Outputs| + * |OVP_DocEnd_BoxAlgorithm_FeatureAggregator_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_FeatureAggregator_Output1| + * A stream of feature vectors made by aggregating incoming features. + * |OVP_DocEnd_BoxAlgorithm_FeatureAggregator_Output1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeatureAggregator_Examples| + * |OVP_DocEnd_BoxAlgorithm_FeatureAggregator_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FeatureAggregator_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_FeatureAggregator_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/doc/boxes/Doc_BoxAlgorithm_FeatureAggregator.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/doc/boxes/Doc_BoxAlgorithm_FeatureAggregator.rst new file mode 100644 index 0000000..4caca5d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/doc/boxes/Doc_BoxAlgorithm_FeatureAggregator.rst @@ -0,0 +1,45 @@ +.. _Doc_BoxAlgorithm_FeatureAggregator: + +Feature aggregator +================== + +.. container:: attribution + + :Author: + Bruno Renier + :Company: + INRIA/IRISA + +.. image:: images/Doc_BoxAlgorithm_FeatureAggregator.png + +Each chunk of input will be catenated into one feature vector. + +This plugins aggregates the features it receives on its inputs +into a feature vector that can be used for classification. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input stream 1", "Streamed matrix" + +Input stream 1 +~~~~~~~~~~~~~~ + +A stream of matrices containing features. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Feature vector stream", "Feature vector" + +Feature vector stream +~~~~~~~~~~~~~~~~~~~~~ + +A stream of feature vectors made by aggregating incoming features. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/doc/boxes/images/Doc_BoxAlgorithm_FeatureAggregator.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/doc/boxes/images/Doc_BoxAlgorithm_FeatureAggregator.png new file mode 100644 index 0000000..a07da76 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/doc/boxes/images/Doc_BoxAlgorithm_FeatureAggregator.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/src/box-algorithms/ovpCBoxAlgorithmFeatureAggregator.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/src/box-algorithms/ovpCBoxAlgorithmFeatureAggregator.cpp new file mode 100644 index 0000000..cc4ff7b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/src/box-algorithms/ovpCBoxAlgorithmFeatureAggregator.cpp @@ -0,0 +1,154 @@ +#include "ovpCBoxAlgorithmFeatureAggregator.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace FeatureExtraction { +bool CBoxAlgorithmFeatureAggregator::initialize() +{ + m_nInput = getBoxAlgorithmContext()->getStaticBoxContext()->getInputCount(); + + // Prepares decoders + for (size_t i = 0; i < m_nInput; ++i) + { + Toolkit::TStreamedMatrixDecoder* streamedMatrixDecoder = new Toolkit::TStreamedMatrixDecoder(); + m_decoder.push_back(streamedMatrixDecoder); + m_decoder.back()->initialize(*this, i); + } + m_encoder = new Toolkit::TFeatureVectorEncoder; + m_encoder->initialize(*this, 0); + + //resizes everything as needed + m_iBufferSizes.resize(m_nInput); + m_dimSize.resize(m_nInput); + m_featureNames.resize(m_nInput); + + m_headerSent = false; + + return true; +} + +bool CBoxAlgorithmFeatureAggregator::uninitialize() +{ + for (size_t i = 0; i < m_nInput; ++i) + { + if (m_decoder.back()) + { + m_decoder.back()->uninitialize(); + delete m_decoder.back(); + m_decoder.pop_back(); + } + } + + if (m_encoder) + { + m_encoder->uninitialize(); + delete m_encoder; + } + + return true; +} + +bool CBoxAlgorithmFeatureAggregator::processInput(const size_t index) +{ + Kernel::IBoxIO* boxIO = getBoxAlgorithmContext()->getDynamicBoxContext(); + + size_t lastBufferChunkSize; + const uint8_t* lastBuffer; + + size_t bufferChunkSize; + const uint8_t* buffer; + + //gets the first buffer from the concerned input + boxIO->getInputChunk(index, 0, m_lastChunkStartTime, m_lastChunkEndTime, lastBufferChunkSize, lastBuffer); + + uint64_t tStart = 0, tEnd = 0; + + bool readyToProcess = true; + + //checks every input's first chunk's dates + for (size_t i = 0; i < m_nInput && readyToProcess; ++i) + { + if (boxIO->getInputChunkCount(i) != 0) + { + boxIO->getInputChunk(i, 0, tStart, tEnd, bufferChunkSize, buffer); + //if the first buffers don't have the same starting/ending dates, stop + if (tStart != m_lastChunkStartTime || tEnd != m_lastChunkEndTime) { readyToProcess = false; } + + //checks for problems, buffer lengths differents... + if (tEnd - tStart != m_lastChunkEndTime - m_lastChunkStartTime) + { + //marks everything as deprecated and sends a error + for (size_t input = 0; input < m_nInput; ++input) + { + for (size_t chunk = 0; chunk < boxIO->getInputChunkCount(input); ++chunk) { boxIO->markInputAsDeprecated(input, chunk); } + } + + //readyToProcess = false; + OV_ERROR_KRF("Invalid incoming input chunks: duration differs between chunks", Kernel::ErrorType::BadInput); + } + } + else { readyToProcess = false; } + } + + //If there is one buffer of the same time period per input, process + if (readyToProcess) { getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); } + + return true; +} + +bool CBoxAlgorithmFeatureAggregator::process() +{ + const Kernel::IBox* boxContext = getBoxAlgorithmContext()->getStaticBoxContext(); + Kernel::IBoxIO* boxIO = getBoxAlgorithmContext()->getDynamicBoxContext(); + + CMatrix* oMatrix = m_encoder->getInputMatrix(); + std::vector bufferElements; + size_t totalBufferSize = 0; + bool bufferReceived = false; + + for (size_t input = 0; input < boxContext->getInputCount(); ++input) + { + m_decoder[input]->decode(0); + //* + if ((m_decoder[input]->isHeaderReceived()) && !m_headerSent) + { + //getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Warning << "header " << input << "\n"; + CMatrix* iMatrix = m_decoder[input]->getOutputMatrix(); + totalBufferSize += iMatrix->getBufferElementCount(); + if (input == boxContext->getInputCount() - 1) + { + oMatrix->resize(totalBufferSize); + + for (size_t i = 0; i < totalBufferSize; ++i) { oMatrix->setDimensionLabel(0, i, ("Feature " + std::to_string(i + 1)).c_str()); } + + m_encoder->encodeHeader(); + boxIO->markOutputAsReadyToSend(0, m_lastChunkStartTime, m_lastChunkEndTime); + m_headerSent = true; + } + } + //*/ + if (m_decoder[input]->isBufferReceived()) + { + bufferReceived = true; + CMatrix* iMatrix = m_decoder[input]->getOutputMatrix(); + const size_t size = iMatrix->getBufferElementCount(); + + double* buffer = iMatrix->getBuffer(); + for (size_t i = 0; i < size; ++i) { bufferElements.push_back(buffer[i]); } + } + } + + if (m_headerSent && bufferReceived) + { + double* oBuffer = oMatrix->getBuffer(); + for (size_t i = 0; i < bufferElements.size(); ++i) { oBuffer[i] = bufferElements[i]; } + m_encoder->encodeBuffer(); + boxIO->markOutputAsReadyToSend(0, m_lastChunkStartTime, m_lastChunkEndTime); + } + + return true; +} +} // namespace FeatureExtraction +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/src/box-algorithms/ovpCBoxAlgorithmFeatureAggregator.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/src/box-algorithms/ovpCBoxAlgorithmFeatureAggregator.h new file mode 100644 index 0000000..8484ffc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/src/box-algorithms/ovpCBoxAlgorithmFeatureAggregator.h @@ -0,0 +1,115 @@ +#pragma once + +#include "../ovp_defines.h" + +#include +#include + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FeatureExtraction { +/** + * Main plugin class of the feature aggregator plugins. + * Aggregates the features received in a feature vector then outputs it. + * */ +class CBoxAlgorithmFeatureAggregator final : public Toolkit::TBoxAlgorithm +{ +public: + + CBoxAlgorithmFeatureAggregator() { } + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_FeatureAggregator) + +protected: + //codecs + Toolkit::TFeatureVectorEncoder* m_encoder = nullptr; + std::vector*> m_decoder; + + // contains the labels for each dimension for each input + std::vector>> m_featureNames; + + // contains the dimension size for each dimension of each input + std::vector> m_dimSize; + + // contains the input buffer's total size for each input + std::vector m_iBufferSizes; + + //start time and end time of the last arrived chunk + uint64_t m_lastChunkStartTime = 0; + uint64_t m_lastChunkEndTime = 0; + + // number of inputs + size_t m_nInput = 0; + + bool m_headerSent = false; +}; + +class CBoxAlgorithmFeatureAggregatorListener final : public Toolkit::TBoxListener +{ +public: + + bool check(Kernel::IBox& box) const + { + for (size_t i = 0; i < box.getInputCount(); ++i) + { + box.setInputName(i, ("Input stream " + std::to_string(i + 1)).c_str()); + box.setInputType(i, OV_TypeId_StreamedMatrix); + } + + return true; + } + + bool onInputRemoved(Kernel::IBox& box, const size_t /*index*/) override { return this->check(box); } + bool onInputAdded(Kernel::IBox& box, const size_t /*index*/) override { return this->check(box); } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +/** +* Plugin's description +*/ +class CBoxAlgorithmFeatureAggregatorDesc final : public IBoxAlgorithmDesc +{ +public: + CString getName() const override { return CString("Feature aggregator"); } + CString getAuthorName() const override { return CString("Bruno Renier"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Aggregates input to feature vectors"); } + + CString getDetailedDescription() const override { return CString("Each chunk of input will be catenated into one feature vector."); } + + CString getCategory() const override { return CString("Feature extraction"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + void release() override { } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_FeatureAggregator; } + IPluginObject* create() override { return new CBoxAlgorithmFeatureAggregator(); } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmFeatureAggregatorListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input stream 1", OV_TypeId_StreamedMatrix); + // prototype.addInput("Input stream 2", OV_TypeId_StreamedMatrix); + prototype.addOutput("Feature vector stream", OV_TypeId_FeatureVector); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_FeatureAggregatorDesc) +}; +} // namespace FeatureExtraction +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/src/ovp_defines.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/src/ovp_defines.h new file mode 100644 index 0000000..5aec63e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/src/ovp_defines.h @@ -0,0 +1,6 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_FeatureAggregator OpenViBE::CIdentifier(0x00682417, 0x453635F9) +#define OVP_ClassId_BoxAlgorithm_FeatureAggregatorDesc OpenViBE::CIdentifier(0x00B5B638, 0x25821BAF) diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/src/ovp_main.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/src/ovp_main.cpp new file mode 100644 index 0000000..1dca03d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/feature-extraction/src/ovp_main.cpp @@ -0,0 +1,15 @@ +#include "ovp_defines.h" + +#include "box-algorithms/ovpCBoxAlgorithmFeatureAggregator.h" + +namespace OpenViBE { +namespace Plugins { +namespace FeatureExtraction { + +OVP_Declare_Begin() + OVP_Declare_New(CBoxAlgorithmFeatureAggregatorDesc); +OVP_Declare_End() + +} // namespace FeatureExtraction +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/CMakeLists.txt new file mode 100755 index 0000000..1c29722 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/CMakeLists.txt @@ -0,0 +1,51 @@ +PROJECT(openvibe-plugins-sdk-file-io) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.c src/*.h src/*.hpp src/*.inl) +LIST(REMOVE_ITEM SRC_FILES + src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileReader.cpp + src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileWriter.cpp + src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileReader.h + src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileWriter.h) +INCLUDE("FindSourceRCProperties") +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleCSV") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleXML") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyXerces") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) +INSTALL(DIRECTORY signals DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) +INSTALL(DIRECTORY electrode_sets DESTINATION ${DIST_DATADIR}/openvibe/) + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/box-tutorials/generic-stream-reader.mxs b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/box-tutorials/generic-stream-reader.mxs new file mode 100644 index 0000000..ed60455 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/box-tutorials/generic-stream-reader.mxs @@ -0,0 +1,367 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00004a40, 0x0000585c) + Continuous Oscilloscope + (0x0842bcd1, 0xd53c1c89) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.01 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x35390ab5, 0x7b926078) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00006ffa, 0x000071a0) + Temporal Filter + (0xb4f9d042, 0x9d79f2e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x2f2c606c, 0x8512ed68) + Filter Method + Butterworth + Butterworth + false + + + (0xfa20178e, 0x4cba62e9) + Filter Type + Band Pass + Band Pass + false + + + (0x007deef9, 0x2f3e95c6) + Filter Order + 4 + 4 + false + + + (0x512a166f, 0x5c3ef83f) + Low Cut-off Frequency (Hz) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + High Cut-off Frequency (Hz) + 40 + 100 + false + + + (0x512a166f, 0x5c3ef83f) + Band Pass Ripple (dB) + 0.5 + 0.5 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 128 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0x27a4ceec, 0x876d6384) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x557489da, 0x7f18ab2b) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + ${Path_Data}/scenarios/signals/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00b124ce) + + + + + + + (0x0000003a, 0x0000396d) + + (0x557489da, 0x7f18ab2b) + 2 + + + (0x00004a40, 0x0000585c) + 1 + + + + (0x00001785, 0x00002d8f) + + (0x00006ffa, 0x000071a0) + 0 + + + (0x00004a40, 0x0000585c) + 0 + + + + (0x000045ee, 0x000074b2) + + (0x557489da, 0x7f18ab2b) + 1 + + + (0x00006ffa, 0x000071a0) + 0 + + + + + + (0x0000761e, 0x00005eae) + The <i>Temporal Filter</i> enables +us to center data around 0 by removing +low frequencies. + + + (0x473d9a43, 0x97fc0a97) + 592 + + + (0x7234b86b, 0x2b8651a5) + 144 + + + + + (0x0afa52e5, 0x7e02009b) + The <i>Continuous Oscilloscope</i> box displays +the content of the file. + +You might need to <b>right click and drag up or down</b> +in order to zoom to the signal. + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + 256 + + + + + (0x3198ee95, 0x3397262b) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 480 + + + (0x7234b86b, 0x2b8651a5) + 384 + + + + + (0x52401569, 0x4c3a5e29) + The <i><b>Generic Stream Reader</b></i> box +reads an <i>OpenViBE</i> file from disk and sends +its content to the following box. +The <i>OpenViBE</i> file format can store any +stream of the NeuroRT platform. + + + (0x473d9a43, 0x97fc0a97) + 608 + + + (0x7234b86b, 0x2b8651a5) + 48 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00004a40, 0x0000585c)","childCount":0,"identifier":"(0x00005da3, 0x00007534)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x0509f2db, 0x6d6aaba8)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x748521de, 0x4b35cf59)","index":0,"name":"Default tab","parentIdentifier":"(0x0509f2db, 0x6d6aaba8)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x06d9aa6d, 0x7f11c5f6)","index":0,"name":"Empty","parentIdentifier":"(0x748521de, 0x4b35cf59)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_CSVFileReader.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_CSVFileReader.dox-part new file mode 100644 index 0000000..381e64f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_CSVFileReader.dox-part @@ -0,0 +1,60 @@ +/** + * \page BoxAlgorithm_CSVFileReader CSV File Reader +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Description| +This box reads a Comma Separated Values (CSV) text file. The file must be written using a specific +OpenViBE convention. The format is described in detail in \ref Doc_BoxAlgorithm_CSVFileWriter + +The file can contain two streams, one for matrix-type data and one for stimulations. + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Description| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Outputs| + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Output1| +This output can carry Signal, Streamed Matrix, Covariance, Spectrum and Feature Vector data. + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Output1| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Output2| +This output will contain stimulations read from the file. + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Output2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Settings| + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Settings| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Setting1| +Path of the CSV file to read. + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Examples| + +Example of a scenario using the CSV Reader box to read a signal file and display it using an Oscilloscope. + + \image html csv-file-reader-example.png "Reading a CSV file" + \image latex csv-file-reader-example.png "Reading a CSV file" width=8cm + + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileReader_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_CSVFileReader_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_CSVFileWriter.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_CSVFileWriter.dox-part new file mode 100644 index 0000000..227f003 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_CSVFileWriter.dox-part @@ -0,0 +1,151 @@ +/** + * \page BoxAlgorithm_CSVFileWriter CSV File Writer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Description| +This box writes incoming time series along with a stimulation stream into a text file using the +Comma Separated Values format conforming to the RFC 4180 format. + +The header of the CSV file contains some additional information that enables additional features +during subsequent reading. This format is described in the \ref Doc_BoxAlgorithm_CSVFileWriter_Miscellaneous +section. + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Inputs| + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Input1| +Time series input, this can be either a Signal, Streamed Matrix, Spectrum, Covariance Matrix or Feature Vector stream. + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Input1| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Input2| +Stimulations to be written alongside the signal. + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Input2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Settings| + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Settings| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Setting1| +Path of the CSV file to be written. + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Setting2| +Precision, in number of decimal digits, of the resulting data. For longer data the precision can significantly impact the file size. + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Setting3| +By default this box will overwrite data in the file if it exists. If this setting is set to true, the box will append data to the file instead. If the file is empty a header will be added as well. It is up to the user to ensure herself that the data written is of the same type and dimensions. + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Setting4| +If this setting is activated, only the last received matrix will be written to the file. This can be used, for example, with cumulative average box. + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Setting4| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Examples| + +Example of writing a spectrum into a CSV file: + + \image html csv-file-writer-example.png "Writing a CSV file" + \image latex csv-file-writer-example.png "Writing a CSV file" width=8cm + + + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSVFileWriter_Miscellaneous| + +The CSV Format + +## Example file containing Signal data and Stimulations + +Signal file sampled at 8Hz, with epochs of 0.5s length. Note that the timestamps do not have an end time which is implicit. + +In this example each x represents an arbitrary floating point value. The header contains the following rows: + +- Time:8Hz - contains the timestamp of each sample, this label also encodes the original sampling rate +- Epoch - contains the number of the epoch in which each sample is contained, this allows encoding even overlapping signal +- O1, O2, Pz, P3, P4 - channels containing EEG data +- Event Id - contains a colon separated list of StimulationIds +- Event Date - contains the same number of timestamps +- Event Duration - is constructed in the same manner as Event Date + +\code{.unparsed} +Time:8Hz,Epoch,O1,O2,Pz,P3,P4,Event Id,Event Date,Event Duration +0.00000,0,x,x,x,x,x,,, +0.12500,0,x,x,x,x,x,,, +0.25000,0,x,x,x,x,x,32000:32010,0.25000:0.25000,0:0 +0.37500,0,x,x,x,x,x,,, +0.50000,1,x,x,x,x,x,,, +0.62500,1,x,x,x,x,x,,, +0.75000,1,x,x,x,x,x,35000,0.75250,0 +0.87500,1,x,x,x,x,x,,, +\endcode + +## Example file containing a three dimensional matrix + +This example file contains 2x2x2 matrices produced every 0.125 seconds and spanning one second. + +The labels for this matrix are: + +- for first dimension "LA", "LB" +- for second dimension "1", "2" +- for third dimension "X", "Y" + +\code{.unparsed} +Time:2x2x2,End Time,LA:1:X,LA:1:Y,LA:2:X,LA:2:Y,LB:1:X,...,LB:2:Y,Event Id,Event Date,Event Duration +0.00000,1.00000,x,x,x,x,x,...,x,,, +0.12500,1.12500,x,x,x,x,x,...,x,,, +0.25000,1.25000,x,x,x,x,x,...,x,,, +0.37500,1.37500,x,x,x,x,x,...,x,,, +0.50000,1.50000,x,x,x,x,x,...,x,,, +0.62500,1.62500,x,x,x,x,x,...,x,,, +0.75000,1.75000,x,x,x,x,x,...,x,,, +0.87500,1.62500,x,x,x,x,x,...,x,,, +1.00000,2.00000,x,x,x,x,x,...,x,,, +1.12500,2.12500,x,x,x,x,x,...,x,,, +\endcode + +\note +A label can be an empty string. If second dimension had an empty label then the first column would have label "LA::X", if it were the third dimension the column would have label "LA:1:" + + +## Example file containing a spectrum + +Spectrum file with 2 channels, 128Hz signal and spectra calculated on periods of 1 second every 0.125 seconds. The last element in the Time column (128) represents the original sampling rate. + +\code{.unparsed} +Time:2x64:128,End Time,O1:0,O1:1.015873,...,O1:64,O2:0,...,O2:64,Event Id,Event Date,Event Duration +0.00000,1.00000,x,x,...,x,x,...,x,,, +0.12500,1.12500,x,x,...,x,x,...,x,,, +0.25000,1.25000,x,x,...,x,x,...,x,,, +0.37500,1.37500,x,x,...,x,x,...,x,,, +0.50000,1.50000,x,x,...,x,x,...,x,,, +0.62500,1.62500,x,x,...,x,x,...,x,,, +0.75000,1.75000,x,x,...,x,x,...,x,,, +0.87500,1.87500,x,x,...,x,x,...,x,,, +1.00000,2.00000,x,x,...,x,x,...,x,,, +1.12500,2.12500,x,x,...,x,x,...,x,,, +\endcode + + + + * |OVP_DocEnd_BoxAlgorithm_CSVFileWriter_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_ElectrodeLocalisationFileReader.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_ElectrodeLocalisationFileReader.dox-part new file mode 100644 index 0000000..3fc05ea --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_ElectrodeLocalisationFileReader.dox-part @@ -0,0 +1,57 @@ +/** + * \page BoxAlgorithm_ElectrodeLocalisationFileReader Electrode localisation file reader +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ElectrodeLocalisationFileReader_Description| + * This box loads files holding the normalized coordinates of an electrode set. + * |OVP_DocEnd_BoxAlgorithm_ElectrodeLocalisationFileReader_Description| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ElectrodeLocalisationFileReader_Outputs| + * |OVP_DocEnd_BoxAlgorithm_ElectrodeLocalisationFileReader_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_ElectrodeLocalisationFileReader_Output1| + * The output channel localization information. + * |OVP_DocEnd_BoxAlgorithm_ElectrodeLocalisationFileReader_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ElectrodeLocalisationFileReader_Settings| + * |OVP_DocEnd_BoxAlgorithm_ElectrodeLocalisationFileReader_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ElectrodeLocalisationFileReader_Setting1| + * The normalized coordinates file. + * |OVP_DocEnd_BoxAlgorithm_ElectrodeLocalisationFileReader_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ElectrodeLocalisationFileReader_Examples| + * A default electrode set should be included in your BRAND_NAME distribution. Look for + * it in the share/electrode_sets directory of the source tree of this plugin. + * It comes as a \ref Doc_MatrixFileFormat "text file" which is quite self explanatory, + * open it in a text editor to edit it. Electrode names are specified in the header + * section of the matrix, while actual coordinates are stored in the buffer section. + * |OVP_DocEnd_BoxAlgorithm_ElectrodeLocalisationFileReader_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ElectrodeLocalisationFileReader_Miscellaneous| + * The coordinates loaded by this box are sent once only (static coordinates, e.g. EEG), as + * opposed to regularly (dynamic coordinates, e.g. MEG). + * The supported file format is the \ref Doc_MatrixFileFormat "BRAND_NAME matrix" file format. + * Electrode coordinates must be normalized cartesian coordinates in the following frame + * of reference : X right, Y front and Z up. + * |OVP_DocEnd_BoxAlgorithm_ElectrodeLocalisationFileReader_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_GenericStreamReader.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_GenericStreamReader.dox-part new file mode 100644 index 0000000..a4eab9b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_GenericStreamReader.dox-part @@ -0,0 +1,56 @@ +/** + * \page BoxAlgorithm_GenericStreamReader Generic stream reader +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GenericStreamReader_Description| +This box is able to read any file saved with the \ref Doc_BoxAlgorithm_GenericStreamWriter box. +It is interesting to notice that such file can contain a variable number of streams. Therefore, +the user is able to add and modify any output he wants on the box. The box does not supposes +anything on the streams contained in the file during authoring in the designer. The streams of +the file are mapped to created output at runtime in an "intelligent way" depending on there types. + * |OVP_DocEnd_BoxAlgorithm_GenericStreamReader_Description| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GenericStreamReader_Outputs| +This box can have as many output you want depending on the content of the file. + * |OVP_DocEnd_BoxAlgorithm_GenericStreamReader_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_GenericStreamReader_Output1| +This is the default output. + * |OVP_DocEnd_BoxAlgorithm_GenericStreamReader_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GenericStreamReader_Settings| + * |OVP_DocEnd_BoxAlgorithm_GenericStreamReader_Settings| + + * |OVP_DocBegin_BoxAlgorithm_GenericStreamReader_Setting1| +This setting points to the file to read. This file may contain a variable number of multiplexed +streams. Those streams will be mapped to corresponding outputs at runtime. The mapping is done in +an "intelligent way" because it reorders the streams contained in the file to match the types of +the outputs. If a stream from the file does not find a matching output, a warning is launched. +If an output does not find a matching stream from the file, a warning is also launched. + * |OVP_DocEnd_BoxAlgorithm_GenericStreamReader_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GenericStreamReader_Examples| + * |OVP_DocEnd_BoxAlgorithm_GenericStreamReader_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GenericStreamReader_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_GenericStreamReader_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_GenericStreamWriter.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_GenericStreamWriter.dox-part new file mode 100644 index 0000000..80cc97a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/Doc_BoxAlgorithm_GenericStreamWriter.dox-part @@ -0,0 +1,60 @@ +/** + * \page BoxAlgorithm_GenericStreamWriter Generic stream writer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GenericStreamWriter_Description| +This box is able to dump any OpenViBE stream into a binary file. In the cacse where this box +would have multiple inputs, the streams would be multiplexed in the file. Such file can +be read back with the \ref Doc_BoxAlgorithm_GenericStreamReader + * |OVP_DocEnd_BoxAlgorithm_GenericStreamWriter_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GenericStreamWriter_Inputs| +You can add any input you want to this box depending on the number of streams you want to dump. +In the cacse where this box would have multiple inputs, the streams would be multiplexed in the file. + * |OVP_DocEnd_BoxAlgorithm_GenericStreamWriter_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_GenericStreamWriter_Input1| +The default input. + +Note: it important to correctly configure the type of the inputs. That information will be +used by the \ref Doc_BoxAlgorithm_GenericStreamReader to map the contained streams to its outputs. + * |OVP_DocEnd_BoxAlgorithm_GenericStreamWriter_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GenericStreamWriter_Settings| + * |OVP_DocEnd_BoxAlgorithm_GenericStreamWriter_Settings| + + * |OVP_DocBegin_BoxAlgorithm_GenericStreamWriter_Setting1| +This setting points to the file to write the streams to. + * |OVP_DocEnd_BoxAlgorithm_GenericStreamWriter_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_GenericStreamWriter_Setting2| +Thanks to this setting, you can use compression on each input stream. This means that the basic +structure of the file remains uncompressed but that each stream inside this structure is compressed. +Note: this is not implemented at the moment. + * |OVP_DocEnd_BoxAlgorithm_GenericStreamWriter_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GenericStreamWriter_Examples| + * |OVP_DocEnd_BoxAlgorithm_GenericStreamWriter_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_GenericStreamWriter_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_GenericStreamWriter_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/Doc_BoxAlgorithm_CSVFileReader.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/Doc_BoxAlgorithm_CSVFileReader.rst new file mode 100644 index 0000000..387f050 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/Doc_BoxAlgorithm_CSVFileReader.rst @@ -0,0 +1,66 @@ +.. _Doc_BoxAlgorithm_CSVFileReader: + +CSV File Reader +=============== + +.. container:: attribution + + :Author: + Victor Herlin + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_CSVFileReader.png + +This box reads a Comma Separated Values (CSV) text file. The file must be written using a specific +OpenViBE convention. The format is described in detail in :ref:`Doc_BoxAlgorithm_CSVFileWriter` + +The file can contain two streams, one for matrix-type data and one for stimulations. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output stream", "Signal" + "Output stimulation", "Stimulations" + +Output stream +~~~~~~~~~~~~~ + +This output can carry Signal, Streamed Matrix, Covariance, Spectrum and Feature Vector data. + +Output stimulation +~~~~~~~~~~~~~~~~~~ + +This output will contain stimulations read from the file. + +.. _Doc_BoxAlgorithm_CSVFileReader_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Filename", "Filename", "" + +Filename +~~~~~~~~ + +Path of the CSV file to read. + +.. _Doc_BoxAlgorithm_CSVFileReader_Examples: + +Examples +-------- + +Example of a scenario using the CSV Reader box to read a signal file and display it using an Oscilloscope. + +.. figure:: images/csv-file-reader-example.png + :alt: Reading a CSV file + :align: center + + Reading a CSV file + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/Doc_BoxAlgorithm_CSVFileWriter.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/Doc_BoxAlgorithm_CSVFileWriter.rst new file mode 100644 index 0000000..5a14f27 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/Doc_BoxAlgorithm_CSVFileWriter.rst @@ -0,0 +1,175 @@ +.. _Doc_BoxAlgorithm_CSVFileWriter: + +CSV File Writer +=============== + +.. container:: attribution + + :Author: + Victor Herlin + :Company: + Mensia Technologies SA + + +.. image:: images/Doc_BoxAlgorithm_CSVFileWriter.png + +This box writes incoming time series along with a stimulation stream into a text file using the +Comma Separated Values format conforming to the RFC 4180 format. + +The header of the CSV file contains some additional information that enables additional features +during subsequent reading. This format is described in the :ref:`Doc_BoxAlgorithm_CSVFileWriter_Miscellaneous` +section. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input stream", "Signal" + "Stimulations stream", "Stimulations" + +Input stream +~~~~~~~~~~~~ + +Time series input, this can be either a Signal, Streamed Matrix, Spectrum, Covariance Matrix or Feature Vector stream. + +Stimulations stream +~~~~~~~~~~~~~~~~~~~ + +Stimulations to be written alongside the signal. + +.. _Doc_BoxAlgorithm_CSVFileWriter_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Filename", "Filename", "" + "Precision", "Integer", "10" + "Append data", "Boolean", "false" + "Only last matrix", "Boolean", "false" + +Filename +~~~~~~~~ + +Path of the CSV file to be written. + + +- Default value : [ *record-[$core{date}-$core{time}].csv* ] + + +Precision +~~~~~~~~~ + +Precision, in number of decimal digits, of the resulting data. For longer data the precision can significantly impact the file size. + +Append data +~~~~~~~~~~~ + +By default this box will overwrite data in the file if it exists. If this setting is set to true, the box will append data to the file instead. If the file is empty a header will be added as well. It is up to the user to ensure herself that the data written is of the same type and dimensions. + +Only last matrix +~~~~~~~~~~~~~~~~ + +If this setting is activated, only the last received matrix will be written to the file. This can be used, for example, with cumulative average box. + +.. _Doc_BoxAlgorithm_CSVFileWriter_Examples: + +Examples +-------- + +Example of writing a spectrum into a CSV file: + +.. figure:: images/csv-file-writer-example.png + :alt: Writing a CSV file + :align: center + + Writing a CSV file + +.. _Doc_BoxAlgorithm_CSVFileWriter_Miscellaneous: + +Miscellaneous +------------- + +The CSV Format + +## Example file containing Signal data and Stimulations + +Signal file sampled at 8Hz, with epochs of 0.5s length. Note that the timestamps do not have an end time which is implicit. + +In this example each x represents an arbitrary floating point value. The header contains the following rows: + + +- Time:8Hz - contains the timestamp of each sample, this label also encodes the original sampling rate +- Epoch - contains the number of the epoch in which each sample is contained, this allows encoding even overlapping signal +- O1, O2, Pz, P3, P4 - channels containing EEG data +- Event Id - contains a colon separated list of StimulationIds +- Event Date - contains the same number of timestamps +- Event Duration - is constructed in the same manner as Event Date + + + +.. code:: + + Time:8Hz,Epoch,O1,O2,Pz,P3,P4,Event Id,Event Date,Event Duration + 0.00000,0,x,x,x,x,x,,, + 0.12500,0,x,x,x,x,x,,, + 0.25000,0,x,x,x,x,x,32000:32010,0.25000:0.25000,0:0 + 0.37500,0,x,x,x,x,x,,, + 0.50000,1,x,x,x,x,x,,, + 0.62500,1,x,x,x,x,x,,, + 0.75000,1,x,x,x,x,x,35000,0.75250,0 + 0.87500,1,x,x,x,x,x,,, + +## Example file containing a three dimensional matrix + +This example file contains 2x2x2 matrices produced every 0.125 seconds and spanning one second. + +The labels for this matrix are: + + +- for first dimension "LA", "LB" +- for second dimension "1", "2" +- for third dimension "X", "Y" + + + +.. code:: + + Time:2x2x2,End Time,LA:1:X,LA:1:Y,LA:2:X,LA:2:Y,LB:1:X,...,LB:2:Y,Event Id,Event Date,Event Duration + 0.00000,1.00000,x,x,x,x,x,...,x,,, + 0.12500,1.12500,x,x,x,x,x,...,x,,, + 0.25000,1.25000,x,x,x,x,x,...,x,,, + 0.37500,1.37500,x,x,x,x,x,...,x,,, + 0.50000,1.50000,x,x,x,x,x,...,x,,, + 0.62500,1.62500,x,x,x,x,x,...,x,,, + 0.75000,1.75000,x,x,x,x,x,...,x,,, + 0.87500,1.62500,x,x,x,x,x,...,x,,, + 1.00000,2.00000,x,x,x,x,x,...,x,,, + 1.12500,2.12500,x,x,x,x,x,...,x,,, + +\note +A label can be an empty string. If second dimension had an empty label then the first column would have label "LA::X", if it were the third dimension the column would have label "LA:1:" + +## Example file containing a spectrum + +Spectrum file with 2 channels, 128Hz signal and spectra calculated on periods of 1 second every 0.125 seconds. The last element in the Time column (128) represents the original sampling rate. + + +.. code:: + + Time:2x64:128,End Time,O1:0,O1:1.015873,...,O1:64,O2:0,...,O2:64,Event Id,Event Date,Event Duration + 0.00000,1.00000,x,x,...,x,x,...,x,,, + 0.12500,1.12500,x,x,...,x,x,...,x,,, + 0.25000,1.25000,x,x,...,x,x,...,x,,, + 0.37500,1.37500,x,x,...,x,x,...,x,,, + 0.50000,1.50000,x,x,...,x,x,...,x,,, + 0.62500,1.62500,x,x,...,x,x,...,x,,, + 0.75000,1.75000,x,x,...,x,x,...,x,,, + 0.87500,1.87500,x,x,...,x,x,...,x,,, + 1.00000,2.00000,x,x,...,x,x,...,x,,, + 1.12500,2.12500,x,x,...,x,x,...,x,,, + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/Doc_BoxAlgorithm_ElectrodeLocalisationFileReader.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/Doc_BoxAlgorithm_ElectrodeLocalisationFileReader.rst new file mode 100644 index 0000000..49953da --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/Doc_BoxAlgorithm_ElectrodeLocalisationFileReader.rst @@ -0,0 +1,66 @@ +.. _Doc_BoxAlgorithm_ElectrodeLocalisationFileReader: + +Electrode localisation file reader +================================== + +.. container:: attribution + + :Author: + Vincent Delannoy + :Company: + INRIA/IRISA + +.. image:: images/Doc_BoxAlgorithm_ElectrodeLocalisationFileReader.png + +This box loads files holding the normalized coordinates of an electrode set. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Channel localisation", "Channel localisation" + +Channel localisation +~~~~~~~~~~~~~~~~~~~~ + +The output channel localization information. + +.. _Doc_BoxAlgorithm_ElectrodeLocalisationFileReader_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Filename", "Filename", "" + +Filename +~~~~~~~~ + +The normalized coordinates file. + +.. _Doc_BoxAlgorithm_ElectrodeLocalisationFileReader_Examples: + +Examples +-------- + +A default electrode set should be included in your NeuroRT distribution. Look for +it in the ``share/electrode_sets`` directory of the source tree of this plugin. +It comes as a :ref:`Doc_MatrixFileFormat` "text file" which is quite self explanatory, +open it in a text editor to edit it. Electrode names are specified in the header +section of the matrix, while actual coordinates are stored in the buffer section. + +.. _Doc_BoxAlgorithm_ElectrodeLocalisationFileReader_Miscellaneous: + +Miscellaneous +------------- + +The coordinates loaded by this box are sent once only (static coordinates, e.g. EEG), as +opposed to regularly (dynamic coordinates, e.g. MEG). +The supported file format is the :ref:`Doc_MatrixFileFormat` "NeuroRT matrix" file format. +Electrode coordinates must be normalized cartesian coordinates in the following frame +of reference : X right, Y front and Z up. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/Doc_BoxAlgorithm_GenericStreamReader.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/Doc_BoxAlgorithm_GenericStreamReader.rst new file mode 100644 index 0000000..f7e1d9b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/Doc_BoxAlgorithm_GenericStreamReader.rst @@ -0,0 +1,57 @@ +.. _Doc_BoxAlgorithm_GenericStreamReader: + +Generic stream reader +===================== + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA + +.. image:: images/Doc_BoxAlgorithm_GenericStreamReader.png + +Generic Stream Writer box can be used to store data in the format read by this box + +This box is able to read any file saved with the :ref:`Doc_BoxAlgorithm_GenericStreamWriter` box. +It is interesting to notice that such file can contain a variable number of streams. Therefore, +the user is able to add and modify any output he wants on the box. The box does not supposes +anything on the streams contained in the file during authoring in the designer. The streams of +the file are mapped to created output at runtime in an "intelligent way" depending on there types. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output Signal", "Signal" + "Output Stimulations", "Stimulations" + +This box can have as many output you want depending on the content of the file. + +Output Signal +~~~~~~~~~~~~~ + +This is the default output. + +.. _Doc_BoxAlgorithm_GenericStreamReader_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Filename", "Filename", "" + +Filename +~~~~~~~~ + +This setting points to the file to read. This file may contain a variable number of multiplexed +streams. Those streams will be mapped to corresponding outputs at runtime. The mapping is done in +an "intelligent way" because it reorders the streams contained in the file to match the types of +the outputs. If a stream from the file does not find a matching output, a warning is launched. +If an output does not find a matching stream from the file, a warning is also launched. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/Doc_BoxAlgorithm_GenericStreamWriter.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/Doc_BoxAlgorithm_GenericStreamWriter.rst new file mode 100644 index 0000000..0795465 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/Doc_BoxAlgorithm_GenericStreamWriter.rst @@ -0,0 +1,65 @@ +.. _Doc_BoxAlgorithm_GenericStreamWriter: + +Generic stream writer +===================== + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA + +.. image:: images/Doc_BoxAlgorithm_GenericStreamWriter.png + +This box is able to dump any OpenViBE stream into a binary file. In the cacse where this box +would have multiple inputs, the streams would be multiplexed in the file. Such file can +be read back with the :ref:`Doc_BoxAlgorithm_GenericStreamReader` + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input Signal", "Signal" + "Input Stimulations", "Stimulations" + +You can add any input you want to this box depending on the number of streams you want to dump. +In the cacse where this box would have multiple inputs, the streams would be multiplexed in the file. + +Input Signal +~~~~~~~~~~~~ + +The default input. + +**Note: it important to correctly configure the type of the inputs**. That information will be +used by the :ref:`Doc_BoxAlgorithm_GenericStreamReader` to map the contained streams to its outputs. + +.. _Doc_BoxAlgorithm_GenericStreamWriter_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Filename", "Filename", "" + "Use compression", "Boolean", "false" + +Filename +~~~~~~~~ + +This setting points to the file to write the streams to. + + +- Default value : [ *record-[$core{date}-$core{time}].ov* ] + + +Use compression +~~~~~~~~~~~~~~~ + +Thanks to this setting, you can use compression on each input stream. This means that the basic +structure of the file remains uncompressed but that each stream inside this structure is compressed. +**Note: this is not implemented at the moment**. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_CSVFileReader.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_CSVFileReader.png new file mode 100644 index 0000000..1d95535 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_CSVFileReader.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_CSVFileReaderDeprecated.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_CSVFileReaderDeprecated.png new file mode 100644 index 0000000..a0abe3c Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_CSVFileReaderDeprecated.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_CSVFileWriter.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_CSVFileWriter.png new file mode 100644 index 0000000..3214a0d Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_CSVFileWriter.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_CSVFileWriterDeprecated.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_CSVFileWriterDeprecated.png new file mode 100644 index 0000000..c486af4 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_CSVFileWriterDeprecated.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_ElectrodeLocalisationFileReader.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_ElectrodeLocalisationFileReader.png new file mode 100644 index 0000000..287f358 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_ElectrodeLocalisationFileReader.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_GenericStreamReader.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_GenericStreamReader.png new file mode 100644 index 0000000..b35e729 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_GenericStreamReader.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_GenericStreamWriter.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_GenericStreamWriter.png new file mode 100644 index 0000000..81ee90d Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_GenericStreamWriter.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_SignalConcatenation.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_SignalConcatenation.png new file mode 100644 index 0000000..646c464 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/Doc_BoxAlgorithm_SignalConcatenation.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/csv-file-reader-example.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/csv-file-reader-example.png new file mode 100644 index 0000000..65295fe Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/csv-file-reader-example.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/csv-file-writer-example.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/csv-file-writer-example.png new file mode 100644 index 0000000..bbbeb20 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/boxes/images/csv-file-writer-example.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/csv-file-reader-example.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/csv-file-reader-example.png new file mode 100644 index 0000000..65295fe Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/csv-file-reader-example.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/csv-file-writer-example.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/csv-file-writer-example.png new file mode 100644 index 0000000..bbbeb20 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/doc/csv-file-writer-example.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/electrode_sets/electrode_set_standard_cartesian.txt b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/electrode_sets/electrode_set_standard_cartesian.txt new file mode 100644 index 0000000..63c1269 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/electrode_sets/electrode_set_standard_cartesian.txt @@ -0,0 +1,697 @@ +[ + ["LPA" "RPA" "Nz" "Fp1" "Fpz" "Fp2" "AF9" "AF7" "AF5" "AF3" "AF1" "AFz" "AF2" "AF4" "AF6" "AF8" "AF10" "F9" "F7" "F5" "F3" "F1" "Fz" "F2" "F4" "F6" "F8" "F10" "FT9" "FT7" "FC5" "FC3" "FC1" "FCz" "FC2" "FC4" "FC6" "FT8" "FT10" "T9" "T7" "C5" "C3" "C1" "Cz" "C2" "C4" "C6" "T8" "T10" "TP9" "TP7" "CP5" "CP3" "CP1" "CPz" "CP2" "CP4" "CP6" "TP8" "TP10" "P9" "P7" "P5" "P3" "P1" "Pz" "P2" "P4" "P6" "P8" "P10" "PO9" "PO7" "PO5" "PO3" "PO1" "POz" "PO2" "PO4" "PO6" "PO8" "PO10" "O1" "Oz" "O2" "I1" "Iz" "I2" "AFp9h" "AFp7h" "AFp5h" "AFp3h" "AFp1h" "AFp2h" "AFp4h" "AFp6h" "AFp8h" "AFp10h" "AFF9h" "AFF7h" "AFF5h" "AFF3h" "AFF1h" "AFF2h" "AFF4h" "AFF6h" "AFF8h" "AFF10h" "FFT9h" "FFT7h" "FFC5h" "FFC3h" "FFC1h" "FFC2h" "FFC4h" "FFC6h" "FFT8h" "FFT10h" "FTT9h" "FTT7h" "FCC5h" "FCC3h" "FCC1h" "FCC2h" "FCC4h" "FCC6h" "FTT8h" "FTT10h" "TTP9h" "TTP7h" "CCP5h" "CCP3h" "CCP1h" "CCP2h" "CCP4h" "CCP6h" "TTP8h" "TTP10h" "TPP9h" "TPP7h" "CPP5h" "CPP3h" "CPP1h" "CPP2h" "CPP4h" "CPP6h" "TPP8h" "TPP10h" "PPO9h" "PPO7h" "PPO5h" "PPO3h" "PPO1h" "PPO2h" "PPO4h" "PPO6h" "PPO8h" "PPO10h" "POO9h" "POO7h" "POO5h" "POO3h" "POO1h" "POO2h" "POO4h" "POO6h" "POO8h" "POO10h" "OI1h" "OI2h" "Fp1h" "Fp2h" "AF9h" "AF7h" "AF5h" "AF3h" "AF1h" "AF2h" "AF4h" "AF6h" "AF8h" "AF10h" "F9h" "F7h" "F5h" "F3h" "F1h" "F2h" "F4h" "F6h" "F8h" "F10h" "FT9h" "FT7h" "FC5h" "FC3h" "FC1h" "FC2h" "FC4h" "FC6h" "FT8h" "FT10h" "T9h" "T7h" "C5h" "C3h" "C1h" "C2h" "C4h" "C6h" "T8h" "T10h" "TP9h" "TP7h" "CP5h" "CP3h" "CP1h" "CP2h" "CP4h" "CP6h" "TP8h" "TP10h" "P9h" "P7h" "P5h" "P3h" "P1h" "P2h" "P4h" "P6h" "P8h" "P10h" "PO9h" "PO7h" "PO5h" "PO3h" "PO1h" "PO2h" "PO4h" "PO6h" "PO8h" "PO10h" "O1h" "O2h" "I1h" "I2h" "AFp9" "AFp7" "AFp5" "AFp3" "AFp1" "AFpz" "AFp2" "AFp4" "AFp6" "AFp8" "AFp10" "AFF9" "AFF7" "AFF5" "AFF3" "AFF1" "AFFz" "AFF2" "AFF4" "AFF6" "AFF8" "AFF10" "FFT9" "FFT7" "FFC5" "FFC3" "FFC1" "FFCz" "FFC2" "FFC4" "FFC6" "FFT8" "FFT10" "FTT9" "FTT7" "FCC5" "FCC3" "FCC1" "FCCz" "FCC2" "FCC4" "FCC6" "FTT8" "FTT10" "TTP9" "TTP7" "CCP5" "CCP3" "CCP1" "CCPz" "CCP2" "CCP4" "CCP6" "TTP8" "TTP10" "TPP9" "TPP7" "CPP5" "CPP3" "CPP1" "CPPz" "CPP2" "CPP4" "CPP6" "TPP8" "TPP10" "PPO9" "PPO7" "PPO5" "PPO3" "PPO1" "PPOz" "PPO2" "PPO4" "PPO6" "PPO8" "PPO10" "POO9" "POO7" "POO5" "POO3" "POO1" "POOz" "POO2" "POO4" "POO6" "POO8" "POO10" "OI1" "OIz" "OI2" "T3" "T5" "T4" "T6" "O9" "O10" "AFF11h" "F11" "FFT11h" "FT11" "TP11" "TPP11h" "P11" "PPO11h" "PO11" "POO11h" "I11" "OI11h" "Iz" "IIz" "OI12h" "I12" "POO12h" "PO12" "PPO12h" "P12" "TPP12h" "TP12" "FT12" "FFT12h" "F12" "AFF12h" "EGI-GES300-256-1" "EGI-GES300-256-2" "EGI-GES300-256-3" "EGI-GES300-256-4" "EGI-GES300-256-5" "EGI-GES300-256-6" "EGI-GES300-256-7" "EGI-GES300-256-8" "EGI-GES300-256-9" "EGI-GES300-256-10" "EGI-GES300-256-11" "EGI-GES300-256-12" "EGI-GES300-256-13" "EGI-GES300-256-14" "EGI-GES300-256-15" "EGI-GES300-256-16" "EGI-GES300-256-17" "EGI-GES300-256-18" "EGI-GES300-256-19" "EGI-GES300-256-20" "EGI-GES300-256-21" "EGI-GES300-256-22" "EGI-GES300-256-23" "EGI-GES300-256-24" "EGI-GES300-256-25" "EGI-GES300-256-26" "EGI-GES300-256-27" "EGI-GES300-256-28" "EGI-GES300-256-29" "EGI-GES300-256-30" "EGI-GES300-256-31" "EGI-GES300-256-32" "EGI-GES300-256-33" "EGI-GES300-256-34" "EGI-GES300-256-35" "EGI-GES300-256-36" "EGI-GES300-256-37" "EGI-GES300-256-38" "EGI-GES300-256-39" "EGI-GES300-256-40" "EGI-GES300-256-41" "EGI-GES300-256-42" "EGI-GES300-256-43" "EGI-GES300-256-44" "EGI-GES300-256-45" "EGI-GES300-256-46" "EGI-GES300-256-47" "EGI-GES300-256-48" "EGI-GES300-256-49" "EGI-GES300-256-50" "EGI-GES300-256-51" "EGI-GES300-256-52" "EGI-GES300-256-53" "EGI-GES300-256-54" "EGI-GES300-256-55" "EGI-GES300-256-56" "EGI-GES300-256-57" "EGI-GES300-256-58" "EGI-GES300-256-59" "EGI-GES300-256-60" "EGI-GES300-256-61" "EGI-GES300-256-62" "EGI-GES300-256-63" "EGI-GES300-256-64" "EGI-GES300-256-65" "EGI-GES300-256-66" "EGI-GES300-256-67" "EGI-GES300-256-68" "EGI-GES300-256-69" "EGI-GES300-256-70" "EGI-GES300-256-71" "EGI-GES300-256-72" "EGI-GES300-256-73" "EGI-GES300-256-74" "EGI-GES300-256-75" "EGI-GES300-256-76" "EGI-GES300-256-77" "EGI-GES300-256-78" "EGI-GES300-256-79" "EGI-GES300-256-80" "EGI-GES300-256-81" "EGI-GES300-256-82" "EGI-GES300-256-83" "EGI-GES300-256-84" "EGI-GES300-256-85" "EGI-GES300-256-86" "EGI-GES300-256-87" "EGI-GES300-256-88" "EGI-GES300-256-89" "EGI-GES300-256-90" "EGI-GES300-256-91" "EGI-GES300-256-92" "EGI-GES300-256-93" "EGI-GES300-256-94" "EGI-GES300-256-95" "EGI-GES300-256-96" "EGI-GES300-256-97" "EGI-GES300-256-98" "EGI-GES300-256-99" "EGI-GES300-256-100" "EGI-GES300-256-101" "EGI-GES300-256-102" "EGI-GES300-256-103" "EGI-GES300-256-104" "EGI-GES300-256-105" "EGI-GES300-256-106" "EGI-GES300-256-107" "EGI-GES300-256-108" "EGI-GES300-256-109" "EGI-GES300-256-110" "EGI-GES300-256-111" "EGI-GES300-256-112" "EGI-GES300-256-113" "EGI-GES300-256-114" "EGI-GES300-256-115" "EGI-GES300-256-116" "EGI-GES300-256-117" "EGI-GES300-256-118" "EGI-GES300-256-119" "EGI-GES300-256-120" "EGI-GES300-256-121" "EGI-GES300-256-122" "EGI-GES300-256-123" "EGI-GES300-256-124" "EGI-GES300-256-125" "EGI-GES300-256-126" "EGI-GES300-256-127" "EGI-GES300-256-128" "EGI-GES300-256-129" "EGI-GES300-256-130" "EGI-GES300-256-131" "EGI-GES300-256-132" "EGI-GES300-256-133" "EGI-GES300-256-134" "EGI-GES300-256-135" "EGI-GES300-256-136" "EGI-GES300-256-137" "EGI-GES300-256-138" "EGI-GES300-256-139" "EGI-GES300-256-140" "EGI-GES300-256-141" "EGI-GES300-256-142" "EGI-GES300-256-143" "EGI-GES300-256-144" "EGI-GES300-256-145" "EGI-GES300-256-146" "EGI-GES300-256-147" "EGI-GES300-256-148" "EGI-GES300-256-149" "EGI-GES300-256-150" "EGI-GES300-256-151" "EGI-GES300-256-152" "EGI-GES300-256-153" "EGI-GES300-256-154" "EGI-GES300-256-155" "EGI-GES300-256-156" "EGI-GES300-256-157" "EGI-GES300-256-158" "EGI-GES300-256-159" "EGI-GES300-256-160" "EGI-GES300-256-161" "EGI-GES300-256-162" "EGI-GES300-256-163" "EGI-GES300-256-164" "EGI-GES300-256-165" "EGI-GES300-256-166" "EGI-GES300-256-167" "EGI-GES300-256-168" "EGI-GES300-256-169" "EGI-GES300-256-170" "EGI-GES300-256-171" "EGI-GES300-256-172" "EGI-GES300-256-173" "EGI-GES300-256-174" "EGI-GES300-256-175" "EGI-GES300-256-176" "EGI-GES300-256-177" "EGI-GES300-256-178" "EGI-GES300-256-179" "EGI-GES300-256-180" "EGI-GES300-256-181" "EGI-GES300-256-182" "EGI-GES300-256-183" "EGI-GES300-256-184" "EGI-GES300-256-185" "EGI-GES300-256-186" "EGI-GES300-256-187" "EGI-GES300-256-188" "EGI-GES300-256-189" "EGI-GES300-256-190" "EGI-GES300-256-191" "EGI-GES300-256-192" "EGI-GES300-256-193" "EGI-GES300-256-194" "EGI-GES300-256-195" "EGI-GES300-256-196" "EGI-GES300-256-197" "EGI-GES300-256-198" "EGI-GES300-256-199" "EGI-GES300-256-200" "EGI-GES300-256-201" "EGI-GES300-256-202" "EGI-GES300-256-203" "EGI-GES300-256-204" "EGI-GES300-256-205" "EGI-GES300-256-206" "EGI-GES300-256-207" "EGI-GES300-256-208" "EGI-GES300-256-209" "EGI-GES300-256-210" "EGI-GES300-256-211" "EGI-GES300-256-212" "EGI-GES300-256-213" "EGI-GES300-256-214" "EGI-GES300-256-215" "EGI-GES300-256-216" "EGI-GES300-256-217" "EGI-GES300-256-218" "EGI-GES300-256-219" "EGI-GES300-256-220" "EGI-GES300-256-221" "EGI-GES300-256-222" "EGI-GES300-256-223" "EGI-GES300-256-224" "EGI-GES300-256-225" "EGI-GES300-256-226" "EGI-GES300-256-227" "EGI-GES300-256-228" "EGI-GES300-256-229" "EGI-GES300-256-230" "EGI-GES300-256-231" "EGI-GES300-256-232" "EGI-GES300-256-233" "EGI-GES300-256-234" "EGI-GES300-256-235" "EGI-GES300-256-236" "EGI-GES300-256-237" "EGI-GES300-256-238" "EGI-GES300-256-239" "EGI-GES300-256-240" "EGI-GES300-256-241" "EGI-GES300-256-242" "EGI-GES300-256-243" "EGI-GES300-256-244" "EGI-GES300-256-245" "EGI-GES300-256-246" "EGI-GES300-256-247" "EGI-GES300-256-248" "EGI-GES300-256-249" "EGI-GES300-256-250" "EGI-GES300-256-251" "EGI-GES300-256-252" "EGI-GES300-256-253" "EGI-GES300-256-254" "EGI-GES300-256-255" "EGI-GES300-256-256" "EGI-GES300-64-1" "EGI-GES300-64-2" "EGI-GES300-64-3" "EGI-GES300-64-4" "EGI-GES300-64-5" "EGI-GES300-64-6" "EGI-GES300-64-7" "EGI-GES300-64-8" "EGI-GES300-64-9" "EGI-GES300-64-10" "EGI-GES300-64-11" "EGI-GES300-64-12" "EGI-GES300-64-13" "EGI-GES300-64-14" "EGI-GES300-64-15" "EGI-GES300-64-16" "EGI-GES300-64-17" "EGI-GES300-64-18" "EGI-GES300-64-19" "EGI-GES300-64-20" "EGI-GES300-64-21" "EGI-GES300-64-22" "EGI-GES300-64-23" "EGI-GES300-64-24" "EGI-GES300-64-25" "EGI-GES300-64-26" "EGI-GES300-64-27" "EGI-GES300-64-28" "EGI-GES300-64-29" "EGI-GES300-64-30" "EGI-GES300-64-31" "EGI-GES300-64-32" "EGI-GES300-64-33" "EGI-GES300-64-34" "EGI-GES300-64-35" "EGI-GES300-64-36" "EGI-GES300-64-37" "EGI-GES300-64-38" "EGI-GES300-64-39" "EGI-GES300-64-40" "EGI-GES300-64-41" "EGI-GES300-64-42" "EGI-GES300-64-43" "EGI-GES300-64-44" "EGI-GES300-64-45" "EGI-GES300-64-46" "EGI-GES300-64-47" "EGI-GES300-64-48" "EGI-GES300-64-49" "EGI-GES300-64-50" "EGI-GES300-64-51" "EGI-GES300-64-52" "EGI-GES300-64-53" "EGI-GES300-64-54" "EGI-GES300-64-55" "EGI-GES300-64-56" "EGI-GES300-64-57" "EGI-GES300-64-58" "EGI-GES300-64-59" "EGI-GES300-64-60" "EGI-GES300-64-61" "EGI-GES300-64-62" "EGI-GES300-64-63" "EGI-GES300-64-64"] + ["x" "y" "z" ] +] + +[ [ 0.0000 0.9237 -0.3826 ] ] +[ [ 0.0000 -0.9237 -0.3826 ] ] +[ [ 0.9230 0.0000 -0.3824 ] ] +[ [ 0.9511 0.3090 0.0001 ] ] +[ [ 1.0000 -0.0000 0.0001 ] ] +[ [ 0.9511 -0.3091 0.0000 ] ] +[ [ 0.7467 0.5425 -0.3825 ] ] +[ [ 0.8090 0.5878 0.0000 ] ] +[ [ 0.8553 0.4926 0.1552 ] ] +[ [ 0.8920 0.3554 0.2782 ] ] +[ [ 0.9150 0.1857 0.3558 ] ] +[ [ 0.9230 0.0000 0.3824 ] ] +[ [ 0.9150 -0.1857 0.3558 ] ] +[ [ 0.8919 -0.3553 0.2783 ] ] +[ [ 0.8553 -0.4926 0.1552 ] ] +[ [ 0.8090 -0.5878 0.0000 ] ] +[ [ 0.7467 -0.5425 -0.3825 ] ] +[ [ 0.5430 0.7472 -0.3826 ] ] +[ [ 0.5878 0.8090 0.0000 ] ] +[ [ 0.6343 0.7210 0.2764 ] ] +[ [ 0.6726 0.5399 0.5043 ] ] +[ [ 0.6979 0.2888 0.6542 ] ] +[ [ 0.7067 0.0000 0.7067 ] ] +[ [ 0.6979 -0.2888 0.6542 ] ] +[ [ 0.6726 -0.5399 0.5043 ] ] +[ [ 0.6343 -0.7210 0.2764 ] ] +[ [ 0.5878 -0.8090 0.0000 ] ] +[ [ 0.5429 -0.7472 -0.3826 ] ] +[ [ 0.2852 0.8777 -0.3826 ] ] +[ [ 0.3090 0.9511 0.0000 ] ] +[ [ 0.3373 0.8709 0.3549 ] ] +[ [ 0.3612 0.6638 0.6545 ] ] +[ [ 0.3770 0.3581 0.8532 ] ] +[ [ 0.3826 0.0000 0.9233 ] ] +[ [ 0.3770 -0.3581 0.8532 ] ] +[ [ 0.3612 -0.6638 0.6545 ] ] +[ [ 0.3373 -0.8709 0.3549 ] ] +[ [ 0.3090 -0.9511 0.0000 ] ] +[ [ 0.2852 -0.8777 -0.3826 ] ] +[ [ -0.0001 0.9237 -0.3826 ] ] +[ [ 0.0000 1.0000 0.0000 ] ] +[ [ 0.0001 0.9237 0.3826 ] ] +[ [ 0.0001 0.7066 0.7066 ] ] +[ [ 0.0002 0.3824 0.9231 ] ] +[ [ 0.0002 0.0000 1.0000 ] ] +[ [ 0.0001 -0.3824 0.9231 ] ] +[ [ 0.0001 -0.7066 0.7066 ] ] +[ [ 0.0001 -0.9237 0.3826 ] ] +[ [ 0.0000 -1.0000 0.0000 ] ] +[ [ 0.0000 -0.9237 -0.3826 ] ] +[ [ -0.2852 0.8777 -0.3826 ] ] +[ [ -0.3090 0.9511 -0.0001 ] ] +[ [ -0.3372 0.8712 0.3552 ] ] +[ [ -0.3609 0.6635 0.6543 ] ] +[ [ -0.3767 0.3580 0.8534 ] ] +[ [ -0.3822 0.0000 0.9231 ] ] +[ [ -0.3767 -0.3580 0.8534 ] ] +[ [ -0.3608 -0.6635 0.6543 ] ] +[ [ -0.3372 -0.8712 0.3552 ] ] +[ [ -0.3090 -0.9511 -0.0001 ] ] +[ [ -0.2853 -0.8777 -0.3826 ] ] +[ [ -0.5429 0.7472 -0.3826 ] ] +[ [ -0.5878 0.8090 -0.0001 ] ] +[ [ -0.6342 0.7211 0.2764 ] ] +[ [ -0.6724 0.5401 0.5045 ] ] +[ [ -0.6975 0.2889 0.6545 ] ] +[ [ -0.7063 0.0000 0.7065 ] ] +[ [ -0.6975 -0.2889 0.6545 ] ] +[ [ -0.6724 -0.5401 0.5045 ] ] +[ [ -0.6342 -0.7211 0.2764 ] ] +[ [ -0.5878 -0.8090 -0.0001 ] ] +[ [ -0.5429 -0.7472 -0.3826 ] ] +[ [ -0.7467 0.5425 -0.3825 ] ] +[ [ -0.8090 0.5878 0.0000 ] ] +[ [ -0.8553 0.4929 0.1555 ] ] +[ [ -0.8918 0.3549 0.2776 ] ] +[ [ -0.9151 0.1858 0.3559 ] ] +[ [ -0.9230 -0.0000 0.3824 ] ] +[ [ -0.9151 -0.1859 0.3559 ] ] +[ [ -0.8918 -0.3549 0.2776 ] ] +[ [ -0.8553 -0.4929 0.1555 ] ] +[ [ -0.8090 -0.5878 0.0000 ] ] +[ [ -0.7467 -0.5425 -0.3825 ] ] +[ [ -0.9511 0.3090 0.0000 ] ] +[ [ -1.0000 0.0000 0.0000 ] ] +[ [ -0.9511 -0.3090 0.0000 ] ] +[ [ -0.8785 0.2854 -0.3824 ] ] +[ [ -0.9230 0.0000 -0.3823 ] ] +[ [ -0.8785 -0.2854 -0.3824 ] ] +[ [ 0.8732 0.4449 -0.1949 ] ] +[ [ 0.9105 0.4093 0.0428 ] ] +[ [ 0.9438 0.3079 0.1159 ] ] +[ [ 0.9669 0.1910 0.1666 ] ] +[ [ 0.9785 0.0647 0.1919 ] ] +[ [ 0.9785 -0.0647 0.1919 ] ] +[ [ 0.9669 -0.1910 0.1666 ] ] +[ [ 0.9438 -0.3079 0.1159 ] ] +[ [ 0.9105 -0.4093 0.0428 ] ] +[ [ 0.8732 -0.4449 -0.1949 ] ] +[ [ 0.6929 0.6929 -0.1949 ] ] +[ [ 0.7325 0.6697 0.1137 ] ] +[ [ 0.7777 0.5417 0.3163 ] ] +[ [ 0.8111 0.3520 0.4658 ] ] +[ [ 0.8289 0.1220 0.5452 ] ] +[ [ 0.8289 -0.1220 0.5452 ] ] +[ [ 0.8111 -0.3520 0.4658 ] ] +[ [ 0.7777 -0.5417 0.3163 ] ] +[ [ 0.7325 -0.6697 0.1138 ] ] +[ [ 0.6929 -0.6929 -0.1949 ] ] +[ [ 0.4448 0.8730 -0.1950 ] ] +[ [ 0.4741 0.8642 0.1647 ] ] +[ [ 0.5107 0.7218 0.4651 ] ] +[ [ 0.5384 0.4782 0.6925 ] ] +[ [ 0.5533 0.1672 0.8148 ] ] +[ [ 0.5533 -0.1672 0.8148 ] ] +[ [ 0.5384 -0.4782 0.6925 ] ] +[ [ 0.5107 -0.7218 0.4651 ] ] +[ [ 0.4741 -0.8642 0.1647 ] ] +[ [ 0.4448 -0.8730 -0.1950 ] ] +[ [ 0.1533 0.9678 -0.1950 ] ] +[ [ 0.1640 0.9669 0.1915 ] ] +[ [ 0.1779 0.8184 0.5448 ] ] +[ [ 0.1887 0.5466 0.8154 ] ] +[ [ 0.1944 0.1919 0.9615 ] ] +[ [ 0.1944 -0.1919 0.9615 ] ] +[ [ 0.1887 -0.5466 0.8154 ] ] +[ [ 0.1779 -0.8184 0.5448 ] ] +[ [ 0.1640 -0.9669 0.1915 ] ] +[ [ 0.1533 -0.9678 -0.1950 ] ] +[ [ -0.1532 0.9678 -0.1950 ] ] +[ [ -0.1639 0.9669 0.1915 ] ] +[ [ -0.1778 0.8185 0.5449 ] ] +[ [ -0.1883 0.5465 0.8153 ] ] +[ [ -0.1940 0.1918 0.9611 ] ] +[ [ -0.1940 -0.1918 0.9611 ] ] +[ [ -0.1884 -0.5465 0.8153 ] ] +[ [ -0.1778 -0.8185 0.5449 ] ] +[ [ -0.1639 -0.9669 0.1915 ] ] +[ [ -0.1533 -0.9678 -0.1950 ] ] +[ [ -0.4448 0.8731 -0.1950 ] ] +[ [ -0.4740 0.8639 0.1646 ] ] +[ [ -0.5106 0.7220 0.4653 ] ] +[ [ -0.5384 0.4786 0.6933 ] ] +[ [ -0.5532 0.1673 0.8155 ] ] +[ [ -0.5532 -0.1673 0.8155 ] ] +[ [ -0.5384 -0.4786 0.6933 ] ] +[ [ -0.5106 -0.7220 0.4653 ] ] +[ [ -0.4740 -0.8638 0.1646 ] ] +[ [ -0.4449 -0.8731 -0.1950 ] ] +[ [ -0.6928 0.6928 -0.1950 ] ] +[ [ -0.7324 0.6700 0.1139 ] ] +[ [ -0.7776 0.5420 0.3167 ] ] +[ [ -0.8108 0.3520 0.4659 ] ] +[ [ -0.8284 0.1220 0.5453 ] ] +[ [ -0.8284 -0.1220 0.5453 ] ] +[ [ -0.8108 -0.3519 0.4659 ] ] +[ [ -0.7775 -0.5421 0.3167 ] ] +[ [ -0.7324 -0.6700 0.1139 ] ] +[ [ -0.6928 -0.6928 -0.1950 ] ] +[ [ -0.8730 0.4448 -0.1950 ] ] +[ [ -0.9106 0.4097 0.0430 ] ] +[ [ -0.9438 0.3080 0.1160 ] ] +[ [ -0.9665 0.1908 0.1657 ] ] +[ [ -0.9783 0.0647 0.1918 ] ] +[ [ -0.9783 -0.0647 0.1918 ] ] +[ [ -0.9665 -0.1908 0.1657 ] ] +[ [ -0.9438 -0.3080 0.1160 ] ] +[ [ -0.9106 -0.4097 0.0430 ] ] +[ [ -0.8730 -0.4448 -0.1950 ] ] +[ [ -0.9679 0.1533 -0.1950 ] ] +[ [ -0.9679 -0.1533 -0.1950 ] ] +[ [ 0.9877 0.1564 0.0001 ] ] +[ [ 0.9877 -0.1564 0.0001 ] ] +[ [ 0.7928 0.5759 -0.1949 ] ] +[ [ 0.8332 0.5463 0.0810 ] ] +[ [ 0.8750 0.4284 0.2213 ] ] +[ [ 0.9053 0.2735 0.3231 ] ] +[ [ 0.9211 0.0939 0.3758 ] ] +[ [ 0.9210 -0.0939 0.3758 ] ] +[ [ 0.9053 -0.2735 0.3231 ] ] +[ [ 0.8750 -0.4284 0.2212 ] ] +[ [ 0.8332 -0.5463 0.0810 ] ] +[ [ 0.7927 -0.5759 -0.1949 ] ] +[ [ 0.5761 0.7929 -0.1949 ] ] +[ [ 0.6117 0.7772 0.1420 ] ] +[ [ 0.6549 0.6412 0.3987 ] ] +[ [ 0.6872 0.4214 0.5906 ] ] +[ [ 0.7045 0.1468 0.6933 ] ] +[ [ 0.7045 -0.1468 0.6933 ] ] +[ [ 0.6872 -0.4214 0.5906 ] ] +[ [ 0.6549 -0.6412 0.3987 ] ] +[ [ 0.6117 -0.7772 0.1420 ] ] +[ [ 0.5761 -0.7929 -0.1949 ] ] +[ [ 0.3027 0.9317 -0.1950 ] ] +[ [ 0.3235 0.9280 0.1813 ] ] +[ [ 0.3500 0.7817 0.5146 ] ] +[ [ 0.3703 0.5207 0.7687 ] ] +[ [ 0.3811 0.1824 0.9054 ] ] +[ [ 0.3811 -0.1824 0.9054 ] ] +[ [ 0.3703 -0.5207 0.7687 ] ] +[ [ 0.3500 -0.7817 0.5146 ] ] +[ [ 0.3235 -0.9280 0.1813 ] ] +[ [ 0.3028 -0.9317 -0.1950 ] ] +[ [ 0.0000 0.9801 -0.1950 ] ] +[ [ 0.0000 0.9801 0.1949 ] ] +[ [ 0.0001 0.8311 0.5552 ] ] +[ [ 0.0002 0.5550 0.8306 ] ] +[ [ 0.0001 0.1950 0.9801 ] ] +[ [ 0.0002 -0.1950 0.9801 ] ] +[ [ 0.0002 -0.5550 0.8306 ] ] +[ [ 0.0001 -0.8311 0.5552 ] ] +[ [ 0.0000 -0.9801 0.1949 ] ] +[ [ 0.0000 -0.9801 -0.1950 ] ] +[ [ -0.3028 0.9319 -0.1949 ] ] +[ [ -0.3234 0.9278 0.1813 ] ] +[ [ -0.3498 0.7818 0.5148 ] ] +[ [ -0.3699 0.5206 0.7688 ] ] +[ [ -0.3808 0.1825 0.9059 ] ] +[ [ -0.3808 -0.1825 0.9059 ] ] +[ [ -0.3699 -0.5206 0.7688 ] ] +[ [ -0.3498 -0.7818 0.5148 ] ] +[ [ -0.3234 -0.9278 0.1813 ] ] +[ [ -0.3028 -0.9319 -0.1949 ] ] +[ [ -0.5761 0.7929 -0.1950 ] ] +[ [ -0.6116 0.7771 0.1420 ] ] +[ [ -0.6546 0.6411 0.3985 ] ] +[ [ -0.6869 0.4217 0.5912 ] ] +[ [ -0.7041 0.1469 0.6934 ] ] +[ [ -0.7041 -0.1469 0.6934 ] ] +[ [ -0.6870 -0.4216 0.5912 ] ] +[ [ -0.6546 -0.6411 0.3985 ] ] +[ [ -0.6116 -0.7771 0.1420 ] ] +[ [ -0.5761 -0.7929 -0.1950 ] ] +[ [ -0.7926 0.5759 -0.1950 ] ] +[ [ -0.8331 0.5459 0.0809 ] ] +[ [ -0.8752 0.4292 0.2219 ] ] +[ [ -0.9054 0.2737 0.3233 ] ] +[ [ -0.9210 0.0939 0.3757 ] ] +[ [ -0.9210 -0.0940 0.3757 ] ] +[ [ -0.9054 -0.2737 0.3233 ] ] +[ [ -0.8752 -0.4292 0.2219 ] ] +[ [ -0.8331 -0.5459 0.0809 ] ] +[ [ -0.7926 -0.5758 -0.1950 ] ] +[ [ -0.9877 0.1564 0.0000 ] ] +[ [ -0.9877 -0.1564 0.0000 ] ] +[ [ -0.9118 0.1444 -0.3824 ] ] +[ [ -0.9118 -0.1444 -0.3824 ] ] +[ [ 0.8225 0.4190 -0.3825 ] ] +[ [ 0.8910 0.4540 0.0000 ] ] +[ [ 0.9282 0.3606 0.0817 ] ] +[ [ 0.9565 0.2508 0.1438 ] ] +[ [ 0.9743 0.1287 0.1828 ] ] +[ [ 0.9799 -0.0000 0.1949 ] ] +[ [ 0.9743 -0.1287 0.1828 ] ] +[ [ 0.9565 -0.2508 0.1437 ] ] +[ [ 0.9282 -0.3606 0.0817 ] ] +[ [ 0.8910 -0.4540 0.0000 ] ] +[ [ 0.8225 -0.4191 -0.3825 ] ] +[ [ 0.6527 0.6527 -0.3825 ] ] +[ [ 0.7071 0.7071 0.0000 ] ] +[ [ 0.7564 0.6149 0.2206 ] ] +[ [ 0.7962 0.4535 0.3990 ] ] +[ [ 0.8221 0.2404 0.5148 ] ] +[ [ 0.8312 0.0000 0.5554 ] ] +[ [ 0.8221 -0.2404 0.5148 ] ] +[ [ 0.7962 -0.4535 0.3990 ] ] +[ [ 0.7564 -0.6149 0.2206 ] ] +[ [ 0.7071 -0.7071 0.0000 ] ] +[ [ 0.6527 -0.6527 -0.3825 ] ] +[ [ 0.4192 0.8226 -0.3826 ] ] +[ [ 0.4540 0.8910 0.0000 ] ] +[ [ 0.4932 0.8072 0.3215 ] ] +[ [ 0.5260 0.6110 0.5905 ] ] +[ [ 0.5477 0.3286 0.7685 ] ] +[ [ 0.5553 0.0000 0.8310 ] ] +[ [ 0.5477 -0.3286 0.7685 ] ] +[ [ 0.5260 -0.6110 0.5905 ] ] +[ [ 0.4932 -0.8072 0.3216 ] ] +[ [ 0.4540 -0.8910 0.0000 ] ] +[ [ 0.4192 -0.8226 -0.3826 ] ] +[ [ 0.1444 0.9119 -0.3826 ] ] +[ [ 0.1565 0.9877 0.0000 ] ] +[ [ 0.1713 0.9099 0.3754 ] ] +[ [ 0.1838 0.6957 0.6933 ] ] +[ [ 0.1922 0.3764 0.9059 ] ] +[ [ 0.1951 0.0000 0.9804 ] ] +[ [ 0.1922 -0.3764 0.9059 ] ] +[ [ 0.1838 -0.6957 0.6933 ] ] +[ [ 0.1713 -0.9099 0.3754 ] ] +[ [ 0.1564 -0.9877 0.0000 ] ] +[ [ 0.1444 -0.9119 -0.3826 ] ] +[ [ -0.1444 0.9117 -0.3826 ] ] +[ [ -0.1564 0.9877 -0.0001 ] ] +[ [ -0.1711 0.9100 0.3754 ] ] +[ [ -0.1836 0.6959 0.6936 ] ] +[ [ -0.1918 0.3763 0.9056 ] ] +[ [ -0.1948 0.0000 0.9800 ] ] +[ [ -0.1919 -0.3763 0.9056 ] ] +[ [ -0.1836 -0.6959 0.6936 ] ] +[ [ -0.1711 -0.9100 0.3754 ] ] +[ [ -0.1564 -0.9877 -0.0001 ] ] +[ [ -0.1444 -0.9117 -0.3826 ] ] +[ [ -0.4191 0.8225 -0.3826 ] ] +[ [ -0.4540 0.8910 -0.0001 ] ] +[ [ -0.4931 0.8073 0.3216 ] ] +[ [ -0.5259 0.6109 0.5904 ] ] +[ [ -0.5476 0.3285 0.7685 ] ] +[ [ -0.5551 0.0000 0.8311 ] ] +[ [ -0.5475 -0.3286 0.7685 ] ] +[ [ -0.5258 -0.6109 0.5904 ] ] +[ [ -0.4931 -0.8073 0.3216 ] ] +[ [ -0.4540 -0.8910 -0.0001 ] ] +[ [ -0.4191 -0.8225 -0.3826 ] ] +[ [ -0.6529 0.6529 -0.3825 ] ] +[ [ -0.7071 0.7071 0.0000 ] ] +[ [ -0.7561 0.6147 0.2205 ] ] +[ [ -0.7960 0.4537 0.3995 ] ] +[ [ -0.8218 0.2405 0.5152 ] ] +[ [ -0.8306 0.0000 0.5551 ] ] +[ [ -0.8218 -0.2405 0.5152 ] ] +[ [ -0.7960 -0.4537 0.3995 ] ] +[ [ -0.7562 -0.6147 0.2205 ] ] +[ [ -0.7071 -0.7071 0.0000 ] ] +[ [ -0.6529 -0.6529 -0.3825 ] ] +[ [ -0.8228 0.4191 -0.3824 ] ] +[ [ -0.8910 0.4540 0.0000 ] ] +[ [ -0.9283 0.3608 0.0818 ] ] +[ [ -0.9567 0.2511 0.1442 ] ] +[ [ -0.9739 0.1285 0.1822 ] ] +[ [ -0.9797 -0.0000 0.1949 ] ] +[ [ -0.9739 -0.1286 0.1822 ] ] +[ [ -0.9567 -0.2511 0.1442 ] ] +[ [ -0.9283 -0.3608 0.0818 ] ] +[ [ -0.8910 -0.4540 0.0000 ] ] +[ [ -0.8228 -0.4191 -0.3824 ] ] +[ [ -0.9322 0.3029 -0.1949 ] ] +[ [ -0.9799 0.0000 -0.1949 ] ] +[ [ -0.9322 -0.3029 -0.1949 ] ] +[ [ 0.0000 1.0000 0.0000 ] ] +[ [ -0.5878 0.8090 -0.0001 ] ] +[ [ 0.0000 -1.0000 0.0000 ] ] +[ [ -0.5878 -0.8090 -0.0001 ] ] +[ [ -0.8818 0.2865 -0.3746 ] ] +[ [ -0.8818 -0.2865 -0.3746 ] ] +[ [ 0.5862 0.5862 -0.5592 ] ] +[ [ 0.4156 0.5721 -0.7071 ] ] +[ [ 0.3764 0.7387 -0.5592 ] ] +[ [ 0.2185 0.6725 -0.7071 ] ] +[ [ -0.2185 0.6725 -0.7071 ] ] +[ [ -0.3764 0.7387 -0.5592 ] ] +[ [ -0.4156 0.5721 -0.7071 ] ] +[ [ -0.5862 0.5862 -0.5592 ] ] +[ [ -0.5721 0.4156 -0.7071 ] ] +[ [ -0.7387 0.3764 -0.5592 ] ] +[ [ -0.6725 0.2185 -0.7071 ] ] +[ [ -0.8188 0.1297 -0.5592 ] ] +[ [ -0.9272 0.0000 -0.3746 ] ] +[ [ -0.7071 0.0000 -0.7071 ] ] +[ [ -0.8188 -0.1297 -0.5592 ] ] +[ [ -0.6725 -0.2185 -0.7071 ] ] +[ [ -0.7387 -0.3764 -0.5592 ] ] +[ [ -0.5721 -0.4156 -0.7071 ] ] +[ [ -0.5862 -0.5862 -0.5592 ] ] +[ [ -0.4156 -0.5721 -0.7071 ] ] +[ [ -0.3764 -0.7387 -0.5592 ] ] +[ [ -0.2185 -0.6725 -0.7071 ] ] +[ [ 0.2185 -0.6725 -0.7071 ] ] +[ [ 0.3764 -0.7387 -0.5592 ] ] +[ [ 0.4156 -0.5721 -0.7071 ] ] +[ [ 0.5862 -0.5862 -0.5592 ] ] + +[ [0.493036 -0.845192 -0.206315 ] ] +[ [0.597512 -0.801748 -0.013434 ] ] +[ [0.679881 -0.712459 0.173681 ] ] +[ [0.724358 -0.594140 0.349718 ] ] +[ [0.709707 -0.455275 0.537625 ] ] +[ [0.640037 -0.295728 0.709152 ] ] +[ [0.522688 -0.157829 0.837787 ] ] +[ [0.371126 -0.000000 0.928582 ] ] +[ [0.156055 0.157588 0.975096 ] ] +[ [0.677071 -0.721919 -0.142855 ] ] +[ [0.778948 -0.625885 0.038831 ] ] +[ [0.843449 -0.479905 0.241425 ] ] +[ [0.844860 -0.325172 0.424823 ] ] +[ [0.783190 -0.157748 0.601440 ] ] +[ [0.672968 -0.000000 0.739672 ] ] +[ [0.522688 0.157829 0.837787 ] ] +[ [0.298673 0.311852 0.901966 ] ] +[ [0.864664 -0.495241 -0.084216 ] ] +[ [0.931822 -0.353641 0.081521 ] ] +[ [0.945029 -0.176918 0.274991 ] ] +[ [0.891074 -0.000000 0.453859 ] ] +[ [0.783190 0.157748 0.601440 ] ] +[ [0.640037 0.295728 0.709152 ] ] +[ [0.438015 0.440370 0.783720 ] ] +[ [0.983602 -0.170758 -0.058041 ] ] +[ [0.995357 -0.000000 0.096253 ] ] +[ [0.945029 0.176918 0.274991 ] ] +[ [0.844860 0.325172 0.424823 ] ] +[ [0.709707 0.455275 0.537625 ] ] +[ [0.536716 0.571978 0.620304 ] ] +[ [0.980650 -0.000000 -0.195768 ] ] +[ [0.983602 0.170758 -0.058041 ] ] +[ [0.931822 0.353641 0.081521 ] ] +[ [0.843449 0.479905 0.241425 ] ] +[ [0.724358 0.594140 0.349718 ] ] +[ [0.608789 0.641926 0.466162 ] ] +[ [0.864664 0.495241 -0.084216 ] ] +[ [0.778948 0.625885 0.038831 ] ] +[ [0.679881 0.712459 0.173681 ] ] +[ [0.568276 0.760136 0.315049 ] ] +[ [0.464888 0.750251 0.470110 ] ] +[ [0.367843 0.684587 0.629311 ] ] +[ [0.252165 0.603000 0.756838 ] ] +[ [0.107650 0.471076 0.875499 ] ] +[ [-0.061439 0.266249 0.961944 ] ] +[ [0.677071 0.721919 -0.142855 ] ] +[ [0.597512 0.801748 -0.013434 ] ] +[ [0.497066 0.858682 0.124862 ] ] +[ [0.393944 0.875684 0.279257 ] ] +[ [0.292585 0.841828 0.453563 ] ] +[ [0.184702 0.770569 0.610007 ] ] +[ [0.057486 0.673822 0.736654 ] ] +[ [-0.112557 0.484806 0.867349 ] ] +[ [0.493036 0.845192 -0.206315 ] ] +[ [0.410305 0.910038 -0.058990 ] ] +[ [0.307136 0.946394 0.100034 ] ] +[ [0.213934 0.939006 0.269259 ] ] +[ [0.122917 0.892969 0.433011 ] ] +[ [0.005479 0.810665 0.585484 ] ] +[ [-0.151736 0.673901 0.723072 ] ] +[ [0.283596 0.928270 -0.240599 ] ] +[ [0.195835 0.977467 -0.078784 ] ] +[ [0.113086 0.989155 0.093727 ] ] +[ [0.036218 0.965298 0.258629 ] ] +[ [-0.050974 0.904182 0.424095 ] ] +[ [-0.175716 0.815924 0.550810 ] ] +[ [0.155380 0.910235 -0.383834 ] ] +[ [0.099090 0.965936 -0.239058 ] ] +[ [0.006833 0.995513 -0.094374 ] ] +[ [-0.070625 0.994185 0.081287 ] ] +[ [-0.134731 0.957487 0.255081 ] ] +[ [-0.206393 0.895163 0.395077 ] ] +[ [0.062318 0.850387 -0.522455 ] ] +[ [-0.175349 0.980312 -0.090784 ] ] +[ [-0.254293 0.961376 0.105313 ] ] +[ [-0.319869 0.905566 0.278630 ] ] +[ [-0.342699 0.822209 0.454455 ] ] +[ [-0.357299 0.695961 0.622877 ] ] +[ [-0.339292 0.522737 0.782066 ] ] +[ [-0.293276 0.293857 0.909746 ] ] +[ [-0.195468 -0.000000 0.980710 ] ] +[ [-0.040626 0.780264 -0.624129 ] ] +[ [-0.329113 0.920352 -0.211276 ] ] +[ [-0.347579 0.936334 -0.049671 ] ] +[ [-0.440340 0.885907 0.145839 ] ] +[ [-0.484620 0.807838 0.335473 ] ] +[ [-0.508099 0.681838 0.526243 ] ] +[ [-0.502783 0.513679 0.695229 ] ] +[ [-0.475193 0.296291 0.828495 ] ] +[ [-0.373892 -0.000000 0.927472 ] ] +[ [-0.145039 0.703789 -0.695446 ] ] +[ [-0.244216 0.765895 -0.594780 ] ] +[ [-0.361419 0.808718 -0.464061 ] ] +[ [-0.406290 0.850872 -0.333084 ] ] +[ [-0.468307 0.864784 -0.181210 ] ] +[ [-0.543989 0.839033 0.009979 ] ] +[ [-0.623733 0.755698 0.199693 ] ] +[ [-0.650544 0.652514 0.388610 ] ] +[ [-0.658233 0.490190 0.571352 ] ] +[ [-0.625431 0.283066 0.727124 ] ] +[ [-0.707115 -0.000000 0.707098 ] ] +[ [-0.305164 0.673556 -0.673199 ] ] +[ [-0.398662 0.713612 -0.576043 ] ] +[ [-0.512372 0.737894 -0.439304 ] ] +[ [-0.554919 0.772286 -0.309255 ] ] +[ [-0.641865 0.754437 -0.137239 ] ] +[ [-0.736460 0.674873 0.046615 ] ] +[ [-0.794904 0.557165 0.240198 ] ] +[ [-0.800356 0.421883 0.425964 ] ] +[ [-0.772064 0.231981 0.591694 ] ] +[ [-0.469292 0.603952 -0.644210 ] ] +[ [-0.559860 0.619536 -0.550211 ] ] +[ [-0.672202 0.618047 -0.407630 ] ] +[ [-0.701375 0.656479 -0.277685 ] ] +[ [-0.838981 0.534000 -0.104671 ] ] +[ [-0.907198 0.412317 0.083592 ] ] +[ [-0.927233 0.258836 0.270634 ] ] +[ [-0.889324 0.147390 0.432873 ] ] +[ [-0.827443 -0.000000 0.561550 ] ] +[ [-0.587617 0.507623 -0.630100 ] ] +[ [-0.690009 0.492157 -0.530726 ] ] +[ [-0.804255 0.449289 -0.388989 ] ] +[ [-0.903322 0.383343 -0.192502 ] ] +[ [-0.955698 0.287189 -0.064524 ] ] +[ [-0.985598 0.136690 0.099565 ] ] +[ [-0.962053 -0.000000 0.272863 ] ] +[ [-0.889324 -0.147390 0.432873 ] ] +[ [-0.772064 -0.231981 0.591694 ] ] +[ [-0.625431 -0.283066 0.727124 ] ] +[ [-0.475193 -0.296291 0.828495 ] ] +[ [-0.293276 -0.293857 0.909746 ] ] +[ [-0.061439 -0.266249 0.961944 ] ] +[ [-0.715066 0.382047 -0.585424 ] ] +[ [-0.798298 0.321096 -0.509526 ] ] +[ [-0.906494 0.255313 -0.336281 ] ] +[ [-0.965956 0.122179 -0.228039 ] ] +[ [-0.995511 -0.000000 -0.094641 ] ] +[ [-0.985598 -0.136690 0.099565 ] ] +[ [-0.927233 -0.258836 0.270634 ] ] +[ [-0.800356 -0.421883 0.425964 ] ] +[ [-0.658233 -0.490190 0.571352 ] ] +[ [-0.502783 -0.513679 0.695229 ] ] +[ [-0.339292 -0.522737 0.782066 ] ] +[ [-0.112557 -0.484806 0.867349 ] ] +[ [-0.778916 0.211076 -0.590539 ] ] +[ [-0.855097 0.126131 -0.502892 ] ] +[ [-0.923115 -0.000000 -0.384524 ] ] +[ [-0.965956 -0.122179 -0.228039 ] ] +[ [-0.955698 -0.287189 -0.064524 ] ] +[ [-0.907198 -0.412317 0.083592 ] ] +[ [-0.794904 -0.557165 0.240198 ] ] +[ [-0.650544 -0.652514 0.388610 ] ] +[ [-0.508099 -0.681838 0.526243 ] ] +[ [-0.357299 -0.695961 0.622877 ] ] +[ [-0.151736 -0.673901 0.723072 ] ] +[ [-0.855097 -0.126131 -0.502892 ] ] +[ [-0.906494 -0.255313 -0.336281 ] ] +[ [-0.903322 -0.383343 -0.192502 ] ] +[ [-0.838981 -0.534000 -0.104671 ] ] +[ [-0.736460 -0.674873 0.046615 ] ] +[ [-0.623733 -0.755698 0.199693 ] ] +[ [-0.484620 -0.807838 0.335473 ] ] +[ [-0.342699 -0.822209 0.454455 ] ] +[ [-0.175716 -0.815924 0.550810 ] ] +[ [-0.778916 -0.211076 -0.590539 ] ] +[ [-0.798298 -0.321096 -0.509526 ] ] +[ [-0.804255 -0.449289 -0.388989 ] ] +[ [-0.701375 -0.656479 -0.277685 ] ] +[ [-0.641865 -0.754437 -0.137239 ] ] +[ [-0.543989 -0.839033 0.009979 ] ] +[ [-0.440340 -0.885907 0.145839 ] ] +[ [-0.319869 -0.905566 0.278630 ] ] +[ [-0.206393 -0.895163 0.395077 ] ] +[ [-0.715066 -0.382047 -0.585424 ] ] +[ [-0.690009 -0.492157 -0.530726 ] ] +[ [-0.672202 -0.618047 -0.407630 ] ] +[ [-0.554919 -0.772286 -0.309255 ] ] +[ [-0.468307 -0.864784 -0.181210 ] ] +[ [-0.347579 -0.936334 -0.049671 ] ] +[ [-0.254293 -0.961376 0.105313 ] ] +[ [-0.134731 -0.957487 0.255081 ] ] +[ [-0.050974 -0.904182 0.424095 ] ] +[ [0.005479 -0.810665 0.585484 ] ] +[ [0.057486 -0.673822 0.736654 ] ] +[ [0.107650 -0.471076 0.875499 ] ] +[ [0.156055 -0.157588 0.975096 ] ] +[ [-0.587617 -0.507623 -0.630100 ] ] +[ [-0.559860 -0.619536 -0.550211 ] ] +[ [-0.512372 -0.737894 -0.439304 ] ] +[ [-0.406290 -0.850872 -0.333084 ] ] +[ [-0.329113 -0.920352 -0.211276 ] ] +[ [-0.175349 -0.980312 -0.090784 ] ] +[ [-0.070625 -0.994185 0.081287 ] ] +[ [0.036218 -0.965298 0.258629 ] ] +[ [0.122917 -0.892969 0.433011 ] ] +[ [0.184702 -0.770569 0.610007 ] ] +[ [0.252165 -0.603000 0.756838 ] ] +[ [0.298673 -0.311852 0.901966 ] ] +[ [-0.469292 -0.603952 -0.644210 ] ] +[ [-0.398662 -0.713612 -0.576043 ] ] +[ [-0.361419 -0.808718 -0.464061 ] ] +[ [0.006833 -0.995513 -0.094374 ] ] +[ [0.113086 -0.989155 0.093727 ] ] +[ [0.213934 -0.939006 0.269259 ] ] +[ [0.292585 -0.841828 0.453563 ] ] +[ [0.367843 -0.684587 0.629311 ] ] +[ [0.438015 -0.440370 0.783720 ] ] +[ [-0.305164 -0.673556 -0.673199 ] ] +[ [-0.244216 -0.765895 -0.594780 ] ] +[ [0.099090 -0.965936 -0.239058 ] ] +[ [0.195835 -0.977467 -0.078784 ] ] +[ [0.307136 -0.946394 0.100034 ] ] +[ [0.393944 -0.875684 0.279257 ] ] +[ [0.464888 -0.750251 0.470110 ] ] +[ [0.536716 -0.571978 0.620304 ] ] +[ [-0.145039 -0.703789 -0.695446 ] ] +[ [-0.040626 -0.780264 -0.624129 ] ] +[ [0.062318 -0.850387 -0.522455 ] ] +[ [0.155380 -0.910235 -0.383834 ] ] +[ [0.283596 -0.928270 -0.240599 ] ] +[ [0.410305 -0.910038 -0.058990 ] ] +[ [0.497066 -0.858682 0.124862 ] ] +[ [0.568276 -0.760136 0.315049 ] ] +[ [0.608789 -0.641926 0.466162 ] ] +[ [0.281392 -0.875696 -0.392396 ] ] +[ [0.406826 -0.813413 -0.415754 ] ] +[ [0.207525 -0.822538 -0.529495 ] ] +[ [0.106439 -0.766941 -0.632828 ] ] +[ [-0.010819 -0.694960 -0.718967 ] ] +[ [0.486435 -0.725452 -0.486929 ] ] +[ [0.328944 -0.759181 -0.561641 ] ] +[ [0.238562 -0.723446 -0.647854 ] ] +[ [0.120291 -0.678108 -0.725052 ] ] +[ [0.574161 -0.619910 -0.534838 ] ] +[ [0.430480 -0.673544 -0.600854 ] ] +[ [0.337571 -0.653161 -0.677810 ] ] +[ [0.235131 -0.614410 -0.753136 ] ] +[ [0.660877 -0.499438 -0.560181 ] ] +[ [0.478986 -0.574758 -0.663495 ] ] +[ [0.384784 -0.573859 -0.722929 ] ] +[ [0.660877 0.499438 -0.560181 ] ] +[ [0.478986 0.574758 -0.663495 ] ] +[ [0.384784 0.573859 -0.722929 ] ] +[ [0.574161 0.619910 -0.534838 ] ] +[ [0.430480 0.673544 -0.600854 ] ] +[ [0.337571 0.653161 -0.677810 ] ] +[ [0.235131 0.614410 -0.753136 ] ] +[ [0.486435 0.725452 -0.486929 ] ] +[ [0.328944 0.759181 -0.561641 ] ] +[ [0.238562 0.723446 -0.647854 ] ] +[ [0.120291 0.678108 -0.725052 ] ] +[ [0.406826 0.813413 -0.415754 ] ] +[ [0.281392 0.875696 -0.392396 ] ] +[ [0.207525 0.822538 -0.529495 ] ] +[ [0.106439 0.766941 -0.632828 ] ] +[ [-0.010819 0.694960 -0.718967 ] ] + +[ [ 0.5429 -0.7472 -0.3826 ] ] +[ [ 0.8919 -0.3553 0.2783 ] ] +[ [ 0.6979 -0.2888 0.6542 ] ] +[ [ 0.3826 0.0000 0.9233 ] ] +[ [ 0.9511 -0.3091 0.0000 ] ] +[ [ 0.7067 0.0000 0.7067 ] ] +[ [ 0.3770 0.3581 0.8532 ] ] +[ [ 0.9230 0.0000 0.3824 ] ] +[ [ 0.6979 0.2888 0.6542 ] ] +[ [ 0.9511 0.3090 0.0001 ] ] +[ [ 0.8919 0.3553 0.2783 ] ] +[ [ 0.6726 0.5399 0.5043 ] ] +[ [ 0.6343 0.7210 0.2764 ] ] +[ [ 0.3373 0.8709 0.3549 ] ] +[ [ 0.3612 0.6638 0.6545 ] ] +[ [ 0.0002 0.3824 0.9231 ] ] +[ [ 0.5429 0.7472 -0.3826 ] ] +[ [ 0.5878 0.8090 0.0000 ] ] +[ [ 0.3090 0.9511 0.0000 ] ] +[ [ 0.0001 0.7066 0.7066 ] ] +[ [ -0.3767 0.3580 0.8534 ] ] +[ [ 0.0001 0.9237 0.3826 ] ] +[ [ -0.0001 0.9237 -0.3826 ] ] +[ [ 0.0000 1.0000 0.0000 ] ] +[ [ -0.3090 0.9511 -0.0001 ] ] +[ [-0.206393 0.895163 0.395077 ] ] +[ [ -0.6342 0.7211 0.2764 ] ] +[ [ -0.6724 0.5401 0.5045 ] ] +[ [ -0.2852 0.8777 -0.3826 ] ] +[ [ -0.5878 0.8090 -0.0001 ] ] +[ [ -0.6975 0.2889 0.6545 ] ] +[ [ -0.5429 0.7472 -0.3826 ] ] +[ [ -0.8918 0.3549 0.2776 ] ] +[ [ -0.7063 0.0000 0.7065 ] ] +[ [ -0.9511 0.3090 0.0000 ] ] +[ [-0.827443 -0.000000 0.561550 ] ] +[ [ -1.0000 0.0000 0.0000 ] ] +[ [ -0.8918 -0.3549 0.2776 ] ] +[ [ -0.9511 -0.3090 0.0000 ] ] +[ [ -0.6975 -0.2889 0.6545 ] ] +[ [ -0.3767 -0.3580 0.8534 ] ] +[ [ -0.6724 -0.5401 0.5045 ] ] +[ [ -0.5429 -0.7472 -0.3826 ] ] +[ [ -0.5878 -0.8090 -0.0001 ] ] +[ [ -0.6342 -0.7211 0.2764 ] ] +[ [-0.206393 -0.895163 0.395077 ] ] +[ [ -0.2852 -0.8777 -0.3826 ] ] +[ [ -0.3090 -0.9511 -0.0001 ] ] +[ [ 0.0001 -0.9237 0.3826 ] ] +[ [ 0.0001 -0.7066 0.7066 ] ] +[ [ 0.0002 -0.3824 0.9231 ] ] +[ [ 0.0000 -1.0000 0.0000 ] ] +[ [ 0.3612 -0.6638 0.6545 ] ] +[ [ 0.3770 -0.3581 0.8532 ] ] +[ [ -0.0001 -0.9237 -0.3826 ] ] +[ [ 0.3090 -0.9511 0.0000 ] ] +[ [ 0.3373 -0.8709 0.3549 ] ] +[ [ 0.5878 -0.8090 0.0000 ] ] +[ [ 0.6343 -0.7210 0.2764 ] ] +[ [ 0.6726 -0.5399 0.5043 ] ] +[ [ 0.486435 -0.725452 -0.486929 ] ] +[ [ 0.660877 -0.499438 -0.560181 ] ] +[ [ 0.660877 0.499438 -0.560181 ] ] +[ [ 0.486435 0.725452 -0.486929 ] ] diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/electrode_sets/electrode_set_standard_spherical.txt b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/electrode_sets/electrode_set_standard_spherical.txt new file mode 100644 index 0000000..233055a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/electrode_sets/electrode_set_standard_spherical.txt @@ -0,0 +1,232 @@ +[ + [ "O1" "O2" "T5" "P7" "P3" "Pz" "P4" "T6" "P8" "T3" "T7" "C3" "Cz" "C4" "T4" "T8" "F7" "F3" "Fz" "F4" "F8" "Fp1" "Fp2" "P5" "P1" "P2" "P6" "C5" "C1" "C2" "C6" "F5" "F1" "F2" "F6" "M1" "M2" "Oz" "POz" "CPz" "FCz" "FFz" "Fpz" "FC1" "FC2" "CP1" "CP2" "FC3" "FC4" "CP3" "CP4" "FT3" "FT4" "TP3" "TP4" "P'1" "P'2" "Nz" "I1" "Iz" "I2" "FF3" "TP5" "OT5" "IT1" "IT2" "IP1" "IPz" "IP2" "M'1" "M'2" "TP7" "TP8" "Nez" "F3z" "F4z" ] + ["theta" "phi" ] +] +[ + [90 252 ] +] +[ + [90 288 ] +] +[ + [90 216 ] +] +[ + [63.1 223.1 ] +] +[ + [63.1 223.1 ] +] +[ + [45 270 ] +] +[ + [63.1 316.9 ] +] +[ + [90 324 ] +] +[ + [90 324 ] +] +[ + [90 180 ] +] +[ + [90 180 ] +] +[ + [45 180 ] +] +[ + [0 0 ] +] +[ + [45 0 ] +] +[ + [90 0 ] +] +[ + [90 0 ] +] +[ + [90 144 ] +] +[ + [63.1 136.9 ] +] +[ + [45 90 ] +] +[ + [63.1 43.1 ] +] +[ + [90 36 ] +] +[ + [90 108 ] +] +[ + [90 72 ] +] +[ + [76.5 219.3 ] +] +[ + [51.7 243.7 ] +] +[ + [51.7 296.3 ] +] +[ + [76.5 320.7 ] +] +[ + [67.5 180 ] +] +[ + [22.5 180 ] +] +[ + [22.5 0 ] +] +[ + [67.5 0 ] +] +[ + [76.5 140.7 ] +] +[ + [51.7 116.3 ] +] +[ + [51.7 63.7 ] +] +[ + [76.5 39.3 ] +] +[ + [120 215.6 ] +] +[ + [120 324.4 ] +] +[ + [90 270 ] +] +[ + [67.5 270 ] +] +[ + [22.5 270 ] +] +[ + [22.5 90 ] +] +[ + [67.5 90 ] +] +[ + [90 90 ] +] +[ + [31.5 136.9 ] +] +[ + [31.5 43.1 ] +] +[ + [31.5 223.1 ] +] +[ + [31.5 316.9 ] +] +[ + [52.1 155.8 ] +] +[ + [52.1 24.2 ] +] +[ + [52.1 204.2 ] +] +[ + [52.1 335.8 ] +] +[ + [75.6 159.7 ] +] +[ + [75.6 20.3 ] +] +[ + [75.6 200.3 ] +] +[ + [75.6 339.7 ] +] +[ + [52 241.3 ] +] +[ + [52 298.7 ] +] +[ + [112.5 90 ] +] +[ + [120 234.4 ] +] +[ + [112.5 270 ] +] +[ + [120 305.6 ] +] +[ + [33.2 135.6 ] +] +[ + [66.5 201.2 ] +] +[ + [77.4 241.8 ] +] +[ + [102.6 241.8 ] +] +[ + [102.6 298.2 ] +] +[ + [87.6 247 ] +] +[ + [78.8 270 ] +] +[ + [87.6 293 ] +] +[ + [105.4 203 ] +] +[ + [105.4 337 ] +] +[ + [90 198 ] +] +[ + [90 342 ] +] +[ + [118.1 90 ] +] +[ + [63.4 113 ] +] +[ + [63.4 67 ] +] diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/signals/bci-motor-imagery.ov b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/signals/bci-motor-imagery.ov new file mode 100644 index 0000000..be8311a Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/signals/bci-motor-imagery.ov differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/ovpCAlgorithmOVMatrixFileReader.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/ovpCAlgorithmOVMatrixFileReader.cpp new file mode 100644 index 0000000..a3b484a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/ovpCAlgorithmOVMatrixFileReader.cpp @@ -0,0 +1,31 @@ +#include "ovpCAlgorithmOVMatrixFileReader.h" + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +bool CAlgorithmOVMatrixFileReader::initialize() +{ + ip_sFilename.initialize(getInputParameter(OVP_Algorithm_OVMatrixFileReader_InputParameterId_Filename)); + op_pMatrix.initialize(getOutputParameter(OVP_Algorithm_OVMatrixFileReader_OutputParameterId_Matrix)); + return true; +} + +bool CAlgorithmOVMatrixFileReader::uninitialize() +{ + op_pMatrix.uninitialize(); + ip_sFilename.uninitialize(); + return true; +} + +bool CAlgorithmOVMatrixFileReader::process() +{ + OV_ERROR_UNLESS_KRF(Toolkit::Matrix::loadFromTextFile(*op_pMatrix, ip_sFilename->toASCIIString()), + "Reading matrix file " << *ip_sFilename << " failed", Kernel::ErrorType::BadFileRead); + + return true; +} + +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/ovpCAlgorithmOVMatrixFileReader.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/ovpCAlgorithmOVMatrixFileReader.h new file mode 100644 index 0000000..c4bf4ef --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/ovpCAlgorithmOVMatrixFileReader.h @@ -0,0 +1,54 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +class CAlgorithmOVMatrixFileReader final : public Toolkit::TAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_OVMatrixFileReader) + +protected: + + Kernel::TParameterHandler ip_sFilename; + Kernel::TParameterHandler op_pMatrix; +}; + +class CAlgorithmOVMatrixFileReaderDesc final : public IAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("OpenViBE Matrix file reader"); } + CString getAuthorName() const override { return CString("Vincent Delannoy"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("File reading and writing"); } + CString getVersion() const override { return CString("1.1"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_OVMatrixFileReader; } + IPluginObject* create() override { return new CAlgorithmOVMatrixFileReader; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_OVMatrixFileReader_InputParameterId_Filename, "Filename", Kernel::ParameterType_String); + prototype.addOutputParameter(OVP_Algorithm_OVMatrixFileReader_OutputParameterId_Matrix, "Matrix", Kernel::ParameterType_Matrix); + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_OVMatrixFileReaderDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/ovpCAlgorithmOVMatrixFileWriter.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/ovpCAlgorithmOVMatrixFileWriter.cpp new file mode 100644 index 0000000..719424b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/ovpCAlgorithmOVMatrixFileWriter.cpp @@ -0,0 +1,31 @@ +#include "ovpCAlgorithmOVMatrixFileWriter.h" + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +bool CAlgorithmOVMatrixFileWriter::initialize() +{ + ip_sFilename.initialize(getInputParameter(OVP_Algorithm_OVMatrixFileWriter_InputParameterId_Filename)); + ip_pMatrix.initialize(getInputParameter(OVP_Algorithm_OVMatrixFileWriter_InputParameterId_Matrix)); + return true; +} + +bool CAlgorithmOVMatrixFileWriter::uninitialize() +{ + ip_sFilename.uninitialize(); + ip_pMatrix.uninitialize(); + return true; +} + +bool CAlgorithmOVMatrixFileWriter::process() +{ + OV_ERROR_UNLESS_KRF(Toolkit::Matrix::saveToTextFile(*ip_pMatrix, ip_sFilename->toASCIIString()), + "Writing matrix file " << *ip_sFilename << " failed", Kernel::ErrorType::BadFileWrite); + + return true; +} + +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/ovpCAlgorithmOVMatrixFileWriter.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/ovpCAlgorithmOVMatrixFileWriter.h new file mode 100644 index 0000000..629185e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/ovpCAlgorithmOVMatrixFileWriter.h @@ -0,0 +1,54 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +class CAlgorithmOVMatrixFileWriter final : public Toolkit::TAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_OVMatrixFileWriter) + +protected: + + Kernel::TParameterHandler ip_sFilename; + Kernel::TParameterHandler ip_pMatrix; +}; + +class CAlgorithmOVMatrixFileWriterDesc final : public IAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("OpenViBE Matrix file writer"); } + CString getAuthorName() const override { return CString("Vincent Delannoy"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("File reading and writing"); } + CString getVersion() const override { return CString("1.1"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_OVMatrixFileWriter; } + IPluginObject* create() override { return new CAlgorithmOVMatrixFileWriter; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_OVMatrixFileWriter_InputParameterId_Filename, "Filename", Kernel::ParameterType_String); + prototype.addInputParameter(OVP_Algorithm_OVMatrixFileWriter_InputParameterId_Matrix, "Matrix", Kernel::ParameterType_Matrix); + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_OVMatrixFileWriterDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/xml-scenario/ovpCAlgorithmXMLScenarioExporter.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/xml-scenario/ovpCAlgorithmXMLScenarioExporter.cpp new file mode 100755 index 0000000..e2d5545 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/xml-scenario/ovpCAlgorithmXMLScenarioExporter.cpp @@ -0,0 +1,161 @@ +#include +#include +#include "ovpCAlgorithmXMLScenarioExporter.h" + +//___________________________________________________________________// +// // + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +//___________________________________________________________________// +// // + +CAlgorithmXMLScenarioExporter::CAlgorithmXMLScenarioExporter() { m_writer = createWriter(*this); } +CAlgorithmXMLScenarioExporter::~CAlgorithmXMLScenarioExporter() { m_writer->release(); } + +void CAlgorithmXMLScenarioExporter::write(const char* str) { m_pMemoryBuffer->append(reinterpret_cast(str), strlen(str)); } + +bool CAlgorithmXMLScenarioExporter::exportStart(IMemoryBuffer& memoryBuffer, const CIdentifier& id) +{ + m_pMemoryBuffer = &memoryBuffer; + + CString name; + + if (id == OVTK_Algorithm_ScenarioExporter_NodeId_OpenViBEScenario) { name = "OpenViBE-Scenario"; } + + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Settings) { name = "Settings"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting) { name = "Setting"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_ID) { name = "Identifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_TypeID) { name = "TypeIdentifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_Name) { name = "Name"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_DefaultValue) { name = "DefaultValue"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_Value) { name = "Value"; } + + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Inputs) { name = "Inputs"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input) { name = "Input"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_ID) { name = "Identifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_TypeID) { name = "TypeIdentifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_Name) { name = "Name"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_LinkedBoxID) { name = "LinkedBoxIdentifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_LinkedBoxInputIdx) { name = "LinkedBoxInputIndex"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_LinkedBoxInputID) { name = "LinkedBoxInputIdentifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Outputs) { name = "Outputs"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output) { name = "Output"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_ID) { name = "Identifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_TypeID) { name = "TypeIdentifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_Name) { name = "Name"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_LinkedBoxID) { name = "LinkedBoxIdentifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_LinkedBoxOutputIdx) { name = "LinkedBoxOutputIndex"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_LinkedBoxOutputID) { name = "LinkedBoxOutputIdentifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_FormatVersion) { name = "FormatVersion"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Creator) { name = "Creator"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_CreatorVersion) { name = "CreatorVersion"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Boxes) { name = "Boxes"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box) { name = "Box"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_ID) { name = "Identifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Name) { name = "Name"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_AlgorithmClassIdD) { name = "AlgorithmClassIdentifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Inputs) { name = "Inputs"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input) { name = "Input"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input_ID) { name = "Identifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input_TypeID) { name = "TypeIdentifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input_Name) { name = "Name"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Outputs) { name = "Outputs"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output) { name = "Output"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output_ID) { name = "Identifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output_TypeID) { name = "TypeIdentifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output_Name) { name = "Name"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Settings) { name = "Settings"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting) { name = "Setting"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_ID) { name = "Identifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_TypeID) { name = "TypeIdentifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_Name) { name = "Name"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_DefaultValue) { name = "DefaultValue"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_Value) { name = "Value"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_Modifiability) { name = "Modifiability"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Attributes) { name = "Attributes"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Attribute) { name = "Attribute"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Attribute_ID) { name = "Identifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Attribute_Value) { name = "Value"; } + + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Comments) { name = "Comments"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Comment) { name = "Comment"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Comment_ID) { name = "Identifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Text) { name = "Text"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Attributes) { name = "Attributes"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Attribute) { name = "Attribute"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Attribute_ID) { name = "Identifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Attribute_Value) { name = "Value"; } + + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Metadata) { name = "Metadata"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry) { name = "Entry"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry_ID) { name = "Identifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry_Type) { name = "Type"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry_Data) { name = "Data"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Links) { name = "Links"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Link) { name = "Link"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Link_ID) { name = "Identifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source) { name = "Source"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source_BoxID) { name = "BoxIdentifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source_BoxOutputIdx) { name = "BoxOutputIndex"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source_BoxOutputID) { name = "BoxOutputIdentifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target) { name = "Target"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target_BoxID) { name = "BoxIdentifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target_BoxInputIdx) { name = "BoxInputIndex"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target_BoxInputID) { name = "BoxInputIdentifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Attributes) { name = "Attributes"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Attribute) { name = "Attribute"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Attribute_ID) { name = "Identifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Attribute_Value) { name = "Value"; } + + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Attributes) { name = "Attributes"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Attribute) { name = "Attribute"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Attribute_ID) { name = "Identifier"; } + else if (id == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Attribute_Value) { name = "Value"; } + // + else { OV_ERROR_KRF("(start) Unexpected node identifier " << id.str(), Kernel::ErrorType::BadArgument); } + + m_writer->openChild(name.toASCIIString()); + + return true; +} + +bool CAlgorithmXMLScenarioExporter::exportIdentifier(IMemoryBuffer& memoryBuffer, const CIdentifier& id, const CIdentifier& value) +{ + m_pMemoryBuffer = &memoryBuffer; + OV_ERROR_UNLESS_KRF(this->exportStart(memoryBuffer, id), "Exporting identifier failed", Kernel::ErrorType::Internal); + m_writer->setChildData(value.str().c_str()); + this->exportStop(memoryBuffer); + return true; +} + +bool CAlgorithmXMLScenarioExporter::exportString(IMemoryBuffer& memoryBuffer, const CIdentifier& id, const CString& value) +{ + m_pMemoryBuffer = &memoryBuffer; + OV_ERROR_UNLESS_KRF(this->exportStart(memoryBuffer, id), "Exporting string failed", Kernel::ErrorType::Internal); + m_writer->setChildData(value.toASCIIString()); + this->exportStop(memoryBuffer); + return true; +} + +bool CAlgorithmXMLScenarioExporter::exportUInteger(IMemoryBuffer& memoryBuffer, const CIdentifier& id, const uint64_t value) +{ + m_pMemoryBuffer = &memoryBuffer; + OV_ERROR_UNLESS_KRF(this->exportStart(memoryBuffer, id), "Exporting uint failed", Kernel::ErrorType::Internal); + m_writer->setChildData(std::to_string(value).c_str()); + this->exportStop(memoryBuffer); + return true; +} + +bool CAlgorithmXMLScenarioExporter::exportStop(IMemoryBuffer& memoryBuffer) +{ + m_pMemoryBuffer = &memoryBuffer; + m_writer->closeChild(); + return true; +} + +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/xml-scenario/ovpCAlgorithmXMLScenarioExporter.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/xml-scenario/ovpCAlgorithmXMLScenarioExporter.h new file mode 100644 index 0000000..4b6257e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/xml-scenario/ovpCAlgorithmXMLScenarioExporter.h @@ -0,0 +1,57 @@ +#pragma once + +#include "../../ovp_defines.h" + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +class CAlgorithmXMLScenarioExporter final : public Toolkit::CAlgorithmScenarioExporter, public XML::IWriterCallback +{ +public: + + CAlgorithmXMLScenarioExporter(); + ~CAlgorithmXMLScenarioExporter() override; + bool exportStart(IMemoryBuffer& memoryBuffer, const CIdentifier& id) override; + bool exportIdentifier(IMemoryBuffer& memoryBuffer, const CIdentifier& id, const CIdentifier& value) override; + bool exportString(IMemoryBuffer& memoryBuffer, const CIdentifier& id, const CString& value) override; + bool exportUInteger(IMemoryBuffer& memoryBuffer, const CIdentifier& id, uint64_t value) override; + bool exportStop(IMemoryBuffer& memoryBuffer) override; + + _IsDerivedFromClass_Final_(Toolkit::CAlgorithmScenarioExporter, OVP_ClassId_Algorithm_XMLScenarioExporter) + +protected: + void write(const char* str) override; // XML::IWriterCallback + + XML::IWriter* m_writer = nullptr; + IMemoryBuffer* m_pMemoryBuffer = nullptr; +}; + +class CAlgorithmXMLScenarioExporterDesc final : public Toolkit::CAlgorithmScenarioExporterDesc +{ +public: + void release() override { } + CString getName() const override { return CString("XML Scenario exporter"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("A sample XML scenario exporter"); } + + CString getDetailedDescription() const override { return CString("This scenario exporter uses simple XML format to output the scenario"); } + + CString getCategory() const override { return CString("File reading and writing/XML Scenario"); } + CString getVersion() const override { return CString("1.0"); } + // virtual CString getFileExtension() const { return CString("xml;XML"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_XMLScenarioExporter; } + IPluginObject* create() override { return new CAlgorithmXMLScenarioExporter(); } + + _IsDerivedFromClass_Final_(Toolkit::CAlgorithmScenarioExporterDesc, OVP_ClassId_Algorithm_XMLScenarioExporterDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/xml-scenario/ovpCAlgorithmXMLScenarioImporter.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/xml-scenario/ovpCAlgorithmXMLScenarioImporter.cpp new file mode 100644 index 0000000..cc84b40 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/xml-scenario/ovpCAlgorithmXMLScenarioImporter.cpp @@ -0,0 +1,469 @@ +#include "ovpCAlgorithmXMLScenarioImporter.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +XERCES_CPP_NAMESPACE_USE + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +namespace { +class _AutoBind_ +{ +public: + explicit _AutoBind_(const std::string& value) : m_value(value) { } + operator CString() const { return CString(m_value.c_str()); } + + operator CIdentifier() const + { + CIdentifier res; + res.fromString(m_value.c_str()); + return res; + } + + operator size_t() { return atoi(m_value.c_str()); } +protected: + const std::string& m_value; +}; + +std::string xercesToString(const XMLCh* xercesString) +{ + const std::unique_ptr charArray(XMLString::transcode(xercesString)); + return std::string(charArray.get()); +} + +class CErrorHandler final : public HandlerBase +{ +public: + + explicit CErrorHandler(Kernel::IAlgorithmContext& algorithmCtx) + : m_algorithmContext(algorithmCtx) { } + + void fatalError(const SAXParseException& exception) override { this->error(exception); } + + void error(const SAXParseException& exception) override + { + // we just issue a trace here because the calling method + // implements a fallback mechanism and we don't want to populate + // the error manager if the importer returns gracefully. + m_algorithmContext.getLogManager() << Kernel::LogLevel_Trace << "Failed to validate xml: error [" << xercesToString(exception.getMessage()) + << "], line number [" << size_t(exception.getLineNumber()) << "]" << "\n"; + } + + void warning(const SAXParseException& exception) override + { + OV_WARNING("Warning while validating xml: warning [" << xercesToString(exception.getMessage()) << "], line number [" + << size_t(exception.getLineNumber()) << "]", m_algorithmContext.getLogManager()); + } + +private: + Kernel::IAlgorithmContext& m_algorithmContext; +}; +} //namespace + +CAlgorithmXMLScenarioImporter::CAlgorithmXMLScenarioImporter() { m_reader = createReader(*this); } +CAlgorithmXMLScenarioImporter::~CAlgorithmXMLScenarioImporter() { m_reader->release(); } + +void CAlgorithmXMLScenarioImporter::openChild(const char* name, const char** /*attributeName*/, const char** /*attributeValue*/, const size_t /*nAttribute*/) +{ + m_nodes.push(name); + + std::string& top = m_nodes.top(); + + if (top == "OpenViBE-Scenario" && m_status == EParsingStatus::Nothing) + { + m_status = EParsingStatus::Scenario; + m_ctx->processStart(OVTK_Algorithm_ScenarioExporter_NodeId_OpenViBEScenario); + } + else if (top == "Attribute" && m_status == EParsingStatus::Scenario) + { + m_status = EParsingStatus::ScenarioAttribute; + m_ctx->processStart(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Attribute); + } + else if (top == "Setting" && m_status == EParsingStatus::Scenario) + { + m_status = EParsingStatus::ScenarioSetting; + m_ctx->processStart(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting); + } + else if (top == "Input" && m_status == EParsingStatus::Scenario) + { + m_status = EParsingStatus::ScenarioInput; + m_ctx->processStart(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input); + } + else if (top == "Output" && m_status == EParsingStatus::Scenario) + { + m_status = EParsingStatus::ScenarioOutput; + m_ctx->processStart(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output); + } + + else if (top == "Box" && m_status == EParsingStatus::Scenario) + { + m_status = EParsingStatus::Box; + m_ctx->processStart(OVTK_Algorithm_ScenarioExporter_NodeId_Box); + } + else if (top == "Input" && m_status == EParsingStatus::Box) + { + m_status = EParsingStatus::BoxInput; + m_ctx->processStart(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input); + } + else if (top == "Output" && m_status == EParsingStatus::Box) + { + m_status = EParsingStatus::BoxOutput; + m_ctx->processStart(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output); + } + else if (top == "Setting" && m_status == EParsingStatus::Box) + { + m_status = EParsingStatus::BoxSetting; + m_ctx->processStart(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting); + } + else if (top == "Attribute" && m_status == EParsingStatus::Box) + { + m_status = EParsingStatus::BoxAttribute; + m_ctx->processStart(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Attribute); + } + + else if (top == "Comment" && m_status == EParsingStatus::Scenario) + { + m_status = EParsingStatus::Comment; + m_ctx->processStart(OVTK_Algorithm_ScenarioExporter_NodeId_Comment); + } + else if (top == "Attribute" && m_status == EParsingStatus::Comment) + { + m_status = EParsingStatus::CommentAttribute; + m_ctx->processStart(OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Attribute); + } + + else if (top == "Entry" && m_status == EParsingStatus::Scenario) + { + m_status = EParsingStatus::MetadataEntry; + m_ctx->processStart(OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry); + } + + else if (top == "Link" && m_status == EParsingStatus::Scenario) + { + m_status = EParsingStatus::Link; + m_ctx->processStart(OVTK_Algorithm_ScenarioExporter_NodeId_Link); + } + else if (top == "Source" && m_status == EParsingStatus::Link) + { + m_status = EParsingStatus::LinkSource; + m_ctx->processStart(OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source); + } + else if (top == "Target" && m_status == EParsingStatus::Link) + { + m_status = EParsingStatus::LinkTarget; + m_ctx->processStart(OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target); + } + else if (top == "Attribute" && m_status == EParsingStatus::Link) + { + m_status = EParsingStatus::LinkAttribute; + m_ctx->processStart(OVTK_Algorithm_ScenarioExporter_NodeId_Link_Attribute); + } +} + +void CAlgorithmXMLScenarioImporter::processChildData(const char* data) +{ + std::string& top = m_nodes.top(); + + switch (m_status) + { + case EParsingStatus::Box: + if (top == "Identifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Box_ID, _AutoBind_(data)); } + if (top == "AlgorithmClassIdentifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Box_AlgorithmClassIdD, _AutoBind_(data)); } + if (top == "Name") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Name, _AutoBind_(data)); } + break; + case EParsingStatus::BoxInput: + if (top == "Identifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input_ID, _AutoBind_(data)); } + if (top == "TypeIdentifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input_TypeID, _AutoBind_(data)); } + if (top == "Name") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input_Name, _AutoBind_(data)); } + break; + case EParsingStatus::BoxOutput: + if (top == "Identifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output_ID, _AutoBind_(data)); } + if (top == "TypeIdentifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output_TypeID, _AutoBind_(data)); } + if (top == "Name") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output_Name, _AutoBind_(data)); } + break; + case EParsingStatus::BoxSetting: + if (top == "Identifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_ID, _AutoBind_(data)); } + if (top == "TypeIdentifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_TypeID, _AutoBind_(data)); } + if (top == "Name") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_Name, _AutoBind_(data)); } + if (top == "DefaultValue") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_DefaultValue, _AutoBind_(data)); } + if (top == "Value") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_Value, _AutoBind_(data)); } + if (top == "Modifiability") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_Modifiability, _AutoBind_(data)); } + break; + case EParsingStatus::BoxAttribute: + if (top == "Identifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Attribute_ID, _AutoBind_(data)); } + if (top == "Value") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_Box_Attribute_Value, _AutoBind_(data)); } + break; + + case EParsingStatus::Comment: + if (top == "Identifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Comment_ID, _AutoBind_(data)); } + if (top == "Text") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Text, _AutoBind_(data)); } + break; + + case EParsingStatus::MetadataEntry: + if (top == "Identifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry_ID, _AutoBind_(data)); } + if (top == "Type") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry_Type, _AutoBind_(data)); } + if (top == "Data") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry_Data, _AutoBind_(data)); } + break; + + case EParsingStatus::CommentAttribute: + if (top == "Identifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Attribute_ID, _AutoBind_(data)); } + if (top == "Value") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Attribute_Value, _AutoBind_(data)); } + break; + + case EParsingStatus::Link: + if (top == "Identifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Link_ID, _AutoBind_(data)); } + break; + case EParsingStatus::LinkSource: + if (top == "BoxIdentifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source_BoxID, _AutoBind_(data)); } + if (top == "BoxOutputIndex") { m_ctx->processUInteger(OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source_BoxOutputIdx, _AutoBind_(data)); } + if (top == "BoxOutputIdentifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source_BoxOutputID, _AutoBind_(data)); } + break; + case EParsingStatus::LinkTarget: + if (top == "BoxIdentifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target_BoxID, _AutoBind_(data)); } + if (top == "BoxInputIndex") { m_ctx->processUInteger(OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target_BoxInputIdx, _AutoBind_(data)); } + if (top == "BoxInputIdentifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target_BoxInputID, _AutoBind_(data)); } + break; + case EParsingStatus::LinkAttribute: + if (top == "Identifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Link_Attribute_ID, _AutoBind_(data)); } + if (top == "Value") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_Link_Attribute_Value, _AutoBind_(data)); } + break; + + case EParsingStatus::ScenarioSetting: + if (top == "Identifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_ID, _AutoBind_(data)); } + if (top == "TypeIdentifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_TypeID, _AutoBind_(data)); } + if (top == "Name") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_Name, _AutoBind_(data)); } + if (top == "DefaultValue") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_DefaultValue, _AutoBind_(data)); } + if (top == "Value") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_Value, _AutoBind_(data)); } + break; + + case EParsingStatus::ScenarioInput: + if (top == "Identifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_ID, _AutoBind_(data)); } + if (top == "TypeIdentifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_TypeID, _AutoBind_(data)); } + if (top == "Name") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_Name, _AutoBind_(data)); } + if (top == "LinkedBoxIdentifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_LinkedBoxID, _AutoBind_(data)); } + if (top == "LinkedBoxInputIndex") + { + m_ctx->processUInteger(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_LinkedBoxInputIdx, _AutoBind_(data)); + } + if (top == "LinkedBoxInputIdentifier") + { + m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_LinkedBoxInputID, _AutoBind_(data)); + } + break; + + case EParsingStatus::ScenarioOutput: + if (top == "Identifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_ID, _AutoBind_(data)); } + if (top == "TypeIdentifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_TypeID, _AutoBind_(data)); } + if (top == "Name") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_Name, _AutoBind_(data)); } + if (top == "LinkedBoxIdentifier") + { + m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_LinkedBoxID, _AutoBind_(data)); + } + if (top == "LinkedBoxOutputIndex") + { + m_ctx->processUInteger(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_LinkedBoxOutputIdx, _AutoBind_(data)); + } + if (top == "LinkedBoxOutputIdentifier") + { + m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_LinkedBoxOutputID, _AutoBind_(data)); + } + break; + + case EParsingStatus::ScenarioAttribute: + if (top == "Identifier") { m_ctx->processIdentifier(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Attribute_ID, _AutoBind_(data)); } + if (top == "Value") { m_ctx->processString(OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Attribute_Value, _AutoBind_(data)); } + break; + default: break; + } +} + +void CAlgorithmXMLScenarioImporter::closeChild() +{ + std::string& top = m_nodes.top(); + + if (top == "OpenViBE-Scenario" && m_status == EParsingStatus::Scenario) + { + m_status = EParsingStatus::Nothing; + m_ctx->processStop(); + } + else if (top == "Setting" && m_status == EParsingStatus::ScenarioSetting) + { + m_status = EParsingStatus::Scenario; + m_ctx->processStop(); + } + else if (top == "Input" && m_status == EParsingStatus::ScenarioInput) + { + m_status = EParsingStatus::Scenario; + m_ctx->processStop(); + } + else if (top == "Output" && m_status == EParsingStatus::ScenarioOutput) + { + m_status = EParsingStatus::Scenario; + m_ctx->processStop(); + } + else if (top == "Attribute" && m_status == EParsingStatus::ScenarioAttribute) + { + m_status = EParsingStatus::Scenario; + m_ctx->processStop(); + } + + else if (top == "Box" && m_status == EParsingStatus::Box) + { + m_status = EParsingStatus::Scenario; + m_ctx->processStop(); + } + else if (top == "Input" && m_status == EParsingStatus::BoxInput) + { + m_status = EParsingStatus::Box; + m_ctx->processStop(); + } + + else if (top == "Output" && m_status == EParsingStatus::BoxOutput) + { + m_status = EParsingStatus::Box; + m_ctx->processStop(); + } + else if (top == "Setting" && m_status == EParsingStatus::BoxSetting) + { + m_status = EParsingStatus::Box; + m_ctx->processStop(); + } + else if (top == "Attribute" && m_status == EParsingStatus::BoxAttribute) + { + m_status = EParsingStatus::Box; + m_ctx->processStop(); + } + + else if (top == "Comment" && m_status == EParsingStatus::Comment) + { + m_status = EParsingStatus::Scenario; + m_ctx->processStop(); + } + else if (top == "Attribute" && m_status == EParsingStatus::CommentAttribute) + { + m_status = EParsingStatus::Comment; + m_ctx->processStop(); + } + + else if (top == "Entry" && m_status == EParsingStatus::MetadataEntry) + { + m_status = EParsingStatus::Scenario; + m_ctx->processStop(); + } + + else if (top == "Link" && m_status == EParsingStatus::Link) + { + m_status = EParsingStatus::Scenario; + m_ctx->processStop(); + } + else if (top == "Source" && m_status == EParsingStatus::LinkSource) + { + m_status = EParsingStatus::Link; + m_ctx->processStop(); + } + else if (top == "Target" && m_status == EParsingStatus::LinkTarget) + { + m_status = EParsingStatus::Link; + m_ctx->processStop(); + } + else if (top == "Attribute" && m_status == EParsingStatus::LinkAttribute) + { + m_status = EParsingStatus::Link; + m_ctx->processStop(); + } + + m_nodes.pop(); +} + +bool CAlgorithmXMLScenarioImporter::validateXML(const unsigned char* buffer, const size_t size) +{ + // implementation of the fallback mechanism + + // error manager is used to differentiate errors from invalid xml + this->getErrorManager().releaseErrors(); + + if (this->validateXMLAgainstSchema((Directories::getDataDir() + "/kernel/openvibe-scenario-v2.xsd"), buffer, size)) { return true; } + if (this->getErrorManager().hasError()) + { + // this is not a validation error thus we return directly + return false; + } + + if (this->validateXMLAgainstSchema((Directories::getDataDir() + "/kernel/openvibe-scenario-v1.xsd"), buffer, size)) + { + this->getLogManager() << Kernel::LogLevel_Trace << + "Importing scenario with legacy format: v1 scenario might be deprecated in the future so upgrade to v2 format when possible\n"; + return true; + } + if (this->getErrorManager().hasError()) + { + // this is not a validation error thus we return directly + return false; + } + + if (this->validateXMLAgainstSchema((Directories::getDataDir() + "/kernel/openvibe-scenario-legacy.xsd"), buffer, size)) + { + OV_WARNING_K("Importing scenario with legacy format: legacy scenario might be deprecated in the future so upgrade to v2 format when possible"); + return true; + } + if (this->getErrorManager().hasError()) + { + // this is not a validation error thus we return directly + return false; + } + + OV_ERROR_KRF("Failed to validate scenario against XSD schemas", Kernel::ErrorType::BadXMLSchemaValidation); +} + +bool CAlgorithmXMLScenarioImporter::validateXMLAgainstSchema(const char* validationSchema, const unsigned char* buffer, const size_t size) +{ + this->getLogManager() << Kernel::LogLevel_Trace << "Validating XML against schema [" << validationSchema << "]\n"; + + size_t errorCount; + XMLPlatformUtils::Initialize(); + + { // scope the content here to ensure unique_ptr contents are destroyed before the call to XMLPlatformUtils::Terminate(); + const std::unique_ptr xercesBuffer(new MemBufInputSource(buffer, size, "xml memory buffer")); + + std::unique_ptr parser(new XercesDOMParser()); + parser->setValidationScheme(XercesDOMParser::Val_Always); + parser->setDoNamespaces(true); + parser->setDoSchema(true); + parser->setValidationConstraintFatal(true); + parser->setValidationSchemaFullChecking(true); + parser->setExternalNoNamespaceSchemaLocation(validationSchema); + + const std::unique_ptr errorHandler(new CErrorHandler(this->getAlgorithmContext())); + parser->setErrorHandler(errorHandler.get()); + + parser->parse(*xercesBuffer); + errorCount = parser->getErrorCount(); + } + + XMLPlatformUtils::Terminate(); + + return (errorCount == 0); +} + +bool CAlgorithmXMLScenarioImporter::import(IAlgorithmScenarioImporterContext& rContext, const IMemoryBuffer& memoryBuffer) +{ + m_ctx = &rContext; + if (!this->validateXML(memoryBuffer.getDirectPointer(), memoryBuffer.getSize())) { return false; } // error handling is handled in validateXML + return m_reader->processData(memoryBuffer.getDirectPointer(), memoryBuffer.getSize()); +} + +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/xml-scenario/ovpCAlgorithmXMLScenarioImporter.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/xml-scenario/ovpCAlgorithmXMLScenarioImporter.h new file mode 100644 index 0000000..fa1ad38 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/algorithms/xml-scenario/ovpCAlgorithmXMLScenarioImporter.h @@ -0,0 +1,71 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +class CAlgorithmXMLScenarioImporter final : public Toolkit::CAlgorithmScenarioImporter, public XML::IReaderCallback +{ +public: + + CAlgorithmXMLScenarioImporter(); + ~CAlgorithmXMLScenarioImporter() override; + bool import(IAlgorithmScenarioImporterContext& rContext, const IMemoryBuffer& memoryBuffer) override; + void openChild(const char* name, const char** attributeName, const char** sAttributeValue, const size_t nAttribute) + override; // XML::IReaderCallback + void processChildData(const char* data) override; // XML::IReaderCallback + void closeChild() override; // XML::IReaderCallback + + _IsDerivedFromClass_Final_(Toolkit::CAlgorithmScenarioImporter, OVP_ClassId_Algorithm_XMLScenarioImporter) + +protected: + enum class EParsingStatus + { + Nothing, + Scenario, ScenarioAttribute, ScenarioInput, ScenarioOutput, ScenarioSetting, + Box, BoxInput, BoxOutput, BoxSetting, BoxAttribute, + Comment, CommentAttribute, + MetadataEntry, + Link, LinkSource, LinkTarget, LinkAttribute + }; + + bool validateXML(const unsigned char* buffer, size_t size); + bool validateXMLAgainstSchema(const char* validationSchema, const unsigned char* buffer, size_t size); + + IAlgorithmScenarioImporterContext* m_ctx = nullptr; + EParsingStatus m_status = EParsingStatus::Nothing; + XML::IReader* m_reader = nullptr; + std::stack m_nodes; +}; + +class CAlgorithmXMLScenarioImporterDesc final : public Toolkit::CAlgorithmScenarioImporterDesc +{ +public: + void release() override { } + CString getName() const override { return CString("XML Scenario importer"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("A sample XML scenario importer"); } + + CString getDetailedDescription() const override { return CString("This scenario importer uses simple XML format to input the scenario"); } + + CString getCategory() const override { return CString("Samples"); } + CString getVersion() const override { return CString("1.0"); } + // virtual CString getFileExtension() const { return CString("xml;XML"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_XMLScenarioImporter; } + IPluginObject* create() override { return new CAlgorithmXMLScenarioImporter(); } + + _IsDerivedFromClass_Final_(Toolkit::CAlgorithmScenarioImporterDesc, OVP_ClassId_Algorithm_XMLScenarioImporterDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileReader.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileReader.cpp new file mode 100755 index 0000000..9b09b56 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileReader.cpp @@ -0,0 +1,572 @@ +#include "ovpCBoxAlgorithmCSVFileReader.h" +#include +#include +#include +#include +#include // std::ceil() on Linux + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +namespace { +std::vector split(const std::string& sString, const std::string& c) +{ + std::vector result; + size_t i = 0; + size_t j; + while ((j = sString.find(c, i)) != std::string::npos) + { + result.push_back(std::string(sString, i, j - i)); + i = j + c.size(); + } + //the last element without the \n character + result.push_back(std::string(sString, i, sString.size() - 1 - i)); + + return result; +} + +void clearMatrix(std::vector>& vMatrix) +{ + for (size_t i = 0; i < vMatrix.size(); ++i) { vMatrix[i].clear(); } + vMatrix.clear(); +} +} // namespace + +bool CBoxAlgorithmCSVFileReader::initialize() +{ + m_sampling = 0; + m_encoder = nullptr; + + this->getStaticBoxContext().getOutputType(0, m_typeID); + + m_filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + const CString token = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_separator = token.toASCIIString(); + m_doNotUseFileTime = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + m_samplesPerBuffer = 1; + if (m_typeID == OV_TypeId_ChannelLocalisation) { m_channelsPerBuffer = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); } + else if (m_typeID != OV_TypeId_Stimulations && m_typeID != OV_TypeId_Spectrum) + { + m_samplesPerBuffer = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + } + + m_nextTime = 0.; + + m_startTime = 0; + m_endTime = 0; + + return true; +} + +bool CBoxAlgorithmCSVFileReader::uninitialize() +{ + if (m_file) + { + fclose(m_file); + m_file = nullptr; + } + if (m_encoder) + { + m_encoder->uninitialize(); + delete m_encoder; + m_encoder = nullptr; + } + return true; +} + +bool CBoxAlgorithmCSVFileReader::initializeFile() +{ + //open file, we don't open as binary as that gives us \r\n on Windows as line-endings and leaves a dangling char after split. CSV files should be text. + m_file = fopen(m_filename.toASCIIString(), "r"); + + OV_ERROR_UNLESS_KRF(m_file, "Error opening file [" << m_filename << "] for reading", Kernel::ErrorType::BadFileRead); + + // simulate RAII through closure + const auto releaseResources = [&]() + { + fclose(m_file); + m_file = nullptr; + }; + + //read the header + char line[BUFFER_LEN]; + char* result = fgets(line, BUFFER_LEN, m_file); + if (nullptr == result) + { + releaseResources(); + OV_ERROR_KRF("Error reading data from file", Kernel::ErrorType::BadParsing); + } + + m_headerFiles = split(std::string(line), m_separator); + m_nCol = m_headerFiles.size(); + + if (m_typeID == OV_TypeId_ChannelLocalisation) + { + m_encoder = new Toolkit::TChannelLocalisationEncoder(*this, 0); + //number of column without the column contains the dynamic parameter + //m_nCol-=1; + m_realProcess = &CBoxAlgorithmCSVFileReader::processChannelLocalisation; + } + else if (m_typeID == OV_TypeId_FeatureVector) + { + m_encoder = new Toolkit::TFeatureVectorEncoder(*this, 0); + m_realProcess = &CBoxAlgorithmCSVFileReader::processFeatureVector; + m_samplesPerBuffer = 1; + } + else if (m_typeID == OV_TypeId_Spectrum) + { + m_encoder = new Toolkit::TSpectrumEncoder(*this, 0); + m_realProcess = &CBoxAlgorithmCSVFileReader::processSpectrum; + + //number of column without columns contains min max frequency bands parameters + m_nCol -= 2; + } + else if (m_typeID == OV_TypeId_Signal) + { + m_encoder = new Toolkit::TSignalEncoder(*this, 0); + m_realProcess = &CBoxAlgorithmCSVFileReader::processSignal; + + //find the sampling rate + result = fgets(line, BUFFER_LEN, m_file); + + if (nullptr == result) + { + releaseResources(); + OV_ERROR_KRF("Error reading sampling rate from file", Kernel::ErrorType::BadParsing); + } + + std::vector parsed = split(std::string(line), m_separator); + + if ((m_nCol - 1) >= parsed.size()) + { + releaseResources(); + OV_ERROR_KRF("Error reading columns (not enough columns found) from file", Kernel::ErrorType::BadParsing); + } + + const double sampling = double(atof(parsed[m_nCol - 1].c_str())); + if (ceil(sampling) != sampling) + { + releaseResources(); + OV_ERROR_KRF("Invalid fractional sampling rate (" << sampling << ") in file", Kernel::ErrorType::BadValue); + } + + m_sampling = uint64_t(sampling); + + if (m_sampling == 0) + { + releaseResources(); + OV_ERROR_KRF("Invalid NULL sampling rate in file", Kernel::ErrorType::BadValue); + } + + // Skip the header + rewind(m_file); + result = fgets(line, BUFFER_LEN, m_file); + if (nullptr == result) + { + releaseResources(); + OV_ERROR_KRF("Error reading data from file", Kernel::ErrorType::BadParsing); + } + + //number of column without the column contains the sampling rate parameters + m_nCol -= 1; + } + else if (m_typeID == OV_TypeId_StreamedMatrix) + { + m_encoder = new Toolkit::TStreamedMatrixEncoder(*this, 0); + m_realProcess = &CBoxAlgorithmCSVFileReader::processStreamedMatrix; + } + else if (m_typeID == OV_TypeId_Stimulations) + { + m_encoder = new Toolkit::TStimulationEncoder(*this, 0); + m_realProcess = &CBoxAlgorithmCSVFileReader::processStimulation; + } + else + { + releaseResources(); + OV_ERROR_KRF("Invalid input type identifier " << this->getTypeManager().getTypeName(m_typeID) << " in file ", Kernel::ErrorType::BadValue); + } + + return true; +} + +bool CBoxAlgorithmCSVFileReader::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmCSVFileReader::process() +{ + if (m_file == nullptr) { OV_ERROR_UNLESS_KRF(initializeFile(), "Error reading data from csv file " << m_filename, Kernel::ErrorType::Internal); } + //line buffer + char line[BUFFER_LEN]; + const double currentTime = CTime(getPlayerContext().getCurrentTime()).toSeconds(); + + //if no line was read, read the first data line. + if (m_lastLineSplits.empty()) + { + //next line + size_t nSamples = 0; + while (!feof(m_file) && nSamples < m_samplesPerBuffer && fgets(line, BUFFER_LEN, m_file) != nullptr) + { + m_lastLineSplits = split(std::string(line), m_separator); + + nSamples++; + + if (m_typeID != OV_TypeId_Stimulations + && m_typeID != OV_TypeId_Spectrum + && m_typeID != OV_TypeId_ChannelLocalisation) { m_dataMatrices.push_back(m_lastLineSplits); } + } + if ((m_typeID == OV_TypeId_StreamedMatrix || m_typeID == OV_TypeId_Signal) + && feof(m_file) && nSamples < m_samplesPerBuffer) + { + // Last chunk will be partial, zero the whole output matrix... + CMatrix* iMatrix = static_cast*>(m_encoder)->getInputMatrix(); + iMatrix->resetBuffer(); + } + } + + bool somethingToSend = (!m_lastLineSplits.empty()) && atof(m_lastLineSplits[0].c_str()) < currentTime; + somethingToSend |= (m_typeID == OV_TypeId_Stimulations); // we always send a stim chunk, even if empty + + if (m_typeID == OV_TypeId_Stimulations || m_typeID == OV_TypeId_ChannelLocalisation || m_typeID == OV_TypeId_Spectrum) + { + while (!m_lastLineSplits.empty() && atof(m_lastLineSplits[0].c_str()) < currentTime) + { + m_dataMatrices.push_back(m_lastLineSplits); + + somethingToSend = true; + + if (!feof(m_file) && fgets(line, BUFFER_LEN, m_file) != nullptr) { m_lastLineSplits = split(std::string(line), m_separator); } + else { m_lastLineSplits.clear(); } + } + } + + //convert data to the good output type + + if (somethingToSend) + { + // Encode the data + OV_ERROR_UNLESS_KRF((this->*m_realProcess)(), "Error encoding data from csv file " << m_filename << " into the right output format", + Kernel::ErrorType::Internal); + + //for the stimulation, the line contents in m_vLastLineSplit isn't processed. + if (m_typeID != OV_TypeId_Stimulations && m_typeID != OV_TypeId_Spectrum && m_typeID != OV_TypeId_ChannelLocalisation) { m_lastLineSplits.clear(); } + + //clear the Data Matrix. + clearMatrix(m_dataMatrices); + } + return true; +} + +bool CBoxAlgorithmCSVFileReader::processStreamedMatrix() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + CMatrix* iMatrix = static_cast*>(m_encoder)->getInputMatrix(); + + //Header + if (!m_headerSent) + { + iMatrix->resize(m_nCol - 1, m_samplesPerBuffer); + + for (size_t i = 1; i < m_nCol; ++i) { iMatrix->setDimensionLabel(0, i - 1, m_headerFiles[i].c_str()); } + m_encoder->encodeHeader(); + m_headerSent = true; + + boxContext.markOutputAsReadyToSend(0, 0, 0); + } + + OV_ERROR_UNLESS_KRF(convertVectorDataToMatrix(iMatrix), "Error converting vector data to streamed matrix", Kernel::ErrorType::Internal); + + m_encoder->encodeBuffer(); + + if (m_doNotUseFileTime) + { + m_startTime = m_endTime; + m_endTime = this->getPlayerContext().getCurrentTime(); + } + else + { + m_startTime = CTime(atof(m_dataMatrices[0][0].c_str())).time(); + m_endTime = CTime(atof(m_dataMatrices.back()[0].c_str())).time(); + } + + boxContext.markOutputAsReadyToSend(0, m_startTime, m_endTime); + + return true; +} + +bool CBoxAlgorithmCSVFileReader::processStimulation() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + //Header + if (!m_headerSent) + { + m_encoder->encodeHeader(); + m_headerSent = true; + + boxContext.markOutputAsReadyToSend(0, 0, 0); + } + + IStimulationSet* ip_stimSet = static_cast*>(m_encoder)->getInputStimulationSet(); + ip_stimSet->clear(); + + for (size_t i = 0; i < m_dataMatrices.size(); ++i) + { + OV_ERROR_UNLESS_KRF(m_dataMatrices[i].size() == 3, "Invalid data row length: must be 3 for stimulation date, index and duration", + Kernel::ErrorType::BadParsing); + + const uint64_t date = CTime(atof(m_dataMatrices[i][0].c_str())).time(); + const uint64_t id = uint64_t(atof(m_dataMatrices[i][1].c_str())); + const uint64_t duration = CTime(atof(m_dataMatrices[i][2].c_str())).time(); + + ip_stimSet->appendStimulation(id, date, duration); + } + + m_encoder->encodeBuffer(); + + // Never use file time + m_startTime = m_endTime; + m_endTime = this->getPlayerContext().getCurrentTime(); + + boxContext.markOutputAsReadyToSend(0, m_startTime, m_endTime); + + return true; +} + +bool CBoxAlgorithmCSVFileReader::processSignal() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + CMatrix* iMatrix = static_cast*>(m_encoder)->getInputMatrix(); + + //Header + if (!m_headerSent) + { + // This is the first chunk, find out the start time from the file + // (to keep time chunks continuous, start time is previous end time, hence set end time) + if (!m_doNotUseFileTime) { m_endTime = CTime(atof(m_dataMatrices[0][0].c_str())).time(); } + + iMatrix->resize(m_nCol - 1, m_samplesPerBuffer); + + for (size_t i = 1; i < m_nCol; ++i) { iMatrix->setDimensionLabel(0, i - 1, m_headerFiles[i].c_str()); } + + static_cast*>(m_encoder)->getInputSamplingRate() = m_sampling; + + m_encoder->encodeHeader(); + m_headerSent = true; + + this->getDynamicBoxContext().markOutputAsReadyToSend(0, 0, 0); + } + + OV_ERROR_UNLESS_KRF(convertVectorDataToMatrix(iMatrix), "Error converting vector data to signal", Kernel::ErrorType::Internal); + + // this->getLogManager() << Kernel::LogLevel_Info << "Cols from header " << m_nCol << "\n"; + // this->getLogManager() << Kernel::LogLevel_Info << "InMatrix " << (m_dataMatrices.size() > 0 ? m_dataMatrices[0].size() : 0) << " outMatrix " << iMatrix->getDimensionSize(0) << "\n"; + + m_encoder->encodeBuffer(); + + if (m_doNotUseFileTime) + { + // We use time dictated by the sampling rate + m_startTime = m_endTime; // previous time end is current time start + m_endTime = m_startTime + CTime(m_sampling, m_samplesPerBuffer).time(); + } + else + { + // We use time suggested by the last sample of the chunk + m_startTime = CTime(atof(m_dataMatrices[0][0].c_str())).time(); + m_endTime = CTime(atof(m_dataMatrices.back()[0].c_str())).time(); + } + + boxContext.markOutputAsReadyToSend(0, m_startTime, m_endTime); + + return true; +} + +bool CBoxAlgorithmCSVFileReader::processChannelLocalisation() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + CMatrix* iMatrix = static_cast*>(m_encoder)->getInputMatrix(); + + if (!m_headerSent) + { + iMatrix->resize(m_nCol - 1, m_samplesPerBuffer); + + for (size_t i = 1; i < m_nCol; ++i) { iMatrix->setDimensionLabel(0, i - 1, m_headerFiles[i].c_str()); } + + static_cast*>(m_encoder)->getInputDynamic() = false; + //atoi(m_dataMatrices[0][m_nCol].c_str()); + + m_encoder->encodeHeader(); + + boxContext.markOutputAsReadyToSend(0, 0, 0); + + m_headerSent = true; + } + + std::vector> channelBloc; + for (size_t i = 0; i < m_dataMatrices.size(); ++i) { channelBloc.push_back(m_dataMatrices[i]); } + + //clear matrix + clearMatrix(m_dataMatrices); + + for (size_t i = 0; i < channelBloc.size(); ++i) + { + m_dataMatrices.push_back(channelBloc[i]); + + //send the current bloc if the next data hasn't the same date + if (i >= channelBloc.size() - 1 || channelBloc[(i + 1)][0] != m_dataMatrices[0][0]) + { + OV_ERROR_UNLESS_KRF(convertVectorDataToMatrix(iMatrix), "Error converting vector data to channel localisation", Kernel::ErrorType::Internal); + + m_encoder->encodeBuffer(); + const uint64_t date = CTime(atof(m_dataMatrices[0][0].c_str())).time(); + boxContext.markOutputAsReadyToSend(0, date, date); + + //clear matrix + clearMatrix(m_dataMatrices); + } + } + + //clear matrix + clearMatrix(channelBloc); + + return true; +} + +bool CBoxAlgorithmCSVFileReader::processFeatureVector() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + CMatrix* matrix = static_cast*>(m_encoder)->getInputMatrix(); + + //Header + if (!m_headerSent) + { + // in this case we need to transpose it + CMatrix* iMatrix = static_cast*>(m_encoder)->getInputMatrix(); + + iMatrix->resize(m_nCol - 1); + + for (size_t i = 1; i < m_nCol; ++i) { iMatrix->setDimensionLabel(0, i - 1, m_headerFiles[i].c_str()); } + + m_encoder->encodeHeader(); + + boxContext.markOutputAsReadyToSend(0, 0, 0); + + m_headerSent = true; + } + + // Each vector has to be sent separately + for (size_t i = 0; i < m_dataMatrices.size(); ++i) + { + OV_ERROR_UNLESS_KRF(m_dataMatrices[i].size() == m_nCol, + "Unexpected number of elements" << "(got " << uint64_t(m_dataMatrices[i].size()) << ", expected " << m_nCol << ")", + Kernel::ErrorType::BadParsing); + + for (size_t j = 0; j < m_nCol - 1; ++j) { matrix->getBuffer()[j] = atof(m_dataMatrices[i][j + 1].c_str()); } + + m_encoder->encodeBuffer(); + + const uint64_t date = CTime(atof(m_dataMatrices[i][0].c_str())).time(); + boxContext.markOutputAsReadyToSend(0, date, date); + } + + clearMatrix(m_dataMatrices); + + return true; +} + +bool CBoxAlgorithmCSVFileReader::processSpectrum() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + CMatrix* iMatrix = static_cast*>(m_encoder)->getInputMatrix(); + CMatrix* iFrequencyAbscissa = static_cast*>(m_encoder)->getInputFrequencyAbscissa(); + + //Header + if (!m_headerSent) + { + iMatrix->resize(m_nCol - 1, m_dataMatrices.size()); + + for (size_t i = 1; i < m_nCol; ++i) { iMatrix->setDimensionLabel(0, i - 1, m_headerFiles[i].c_str()); } + iFrequencyAbscissa->resize(m_dataMatrices.size()); + if (m_dataMatrices.size() > 1) + { + for (size_t i = 0; i < m_dataMatrices.size(); ++i) + { + const double curFrequencyAbscissa = std::stod(m_dataMatrices[i][m_nCol]) + double(i) / (m_dataMatrices.size() - 1) + * (std::stod(m_dataMatrices[i][m_nCol + 1]) - std::stod(m_dataMatrices[i][m_nCol])); + iFrequencyAbscissa->getBuffer()[i] = curFrequencyAbscissa; + + std::stringstream label; + label << curFrequencyAbscissa; + iFrequencyAbscissa->setDimensionLabel(0, i, label.str().c_str()); + } + } + else { iFrequencyAbscissa->getBuffer()[0] = 0; } + + static_cast*>(m_encoder)->getInputSamplingRate() = uint64_t( + m_dataMatrices.size() / (stod(m_dataMatrices[m_dataMatrices.size() - 1][m_nCol]) - stod(m_dataMatrices[0][m_nCol]))); + m_headerSent = true; + m_encoder->encodeHeader(); + + boxContext.markOutputAsReadyToSend(0, 0, 0); + } + + std::vector> spectrumBloc; + for (size_t i = 0; i < m_dataMatrices.size(); ++i) { spectrumBloc.push_back(m_dataMatrices[i]); } + + //clear matrix + clearMatrix(m_dataMatrices); + + for (size_t i = 0; i < spectrumBloc.size(); ++i) + { + m_dataMatrices.push_back(spectrumBloc[i]); + //send the current bloc if the next data hasn't the same date + if (i >= spectrumBloc.size() - 1 || spectrumBloc[i + 1][0] != m_dataMatrices[0][0]) + { + OV_ERROR_UNLESS_KRF(convertVectorDataToMatrix(iMatrix), "Error converting vector data to spectrum", Kernel::ErrorType::Internal); + + m_encoder->encodeBuffer(); + const uint64_t date = CTime(std::stod(m_dataMatrices[0][0])).time(); + boxContext.markOutputAsReadyToSend(0, date - 1, date); + + //clear matrix + clearMatrix(m_dataMatrices); + } + } + + //clear matrix + clearMatrix(spectrumBloc); + return true; +} + +bool CBoxAlgorithmCSVFileReader::convertVectorDataToMatrix(CMatrix* matrix) +{ + // note: Chunk size shouldn't change after encoding header, do not mess with it here, even if the input has different size + + // We accept partial data, but not buffer overruns ... + OV_ERROR_UNLESS_KRF(matrix->getDimensionSize(1) >= m_dataMatrices.size() && matrix->getDimensionSize(0) >= (m_nCol-1), + "Matrix size incompatibility, data suggests " << m_nCol-1 << "x" << m_dataMatrices.size() + << ", expected at most " << matrix->getDimensionSize(0) << "x" << matrix->getDimensionSize(0), Kernel::ErrorType::Overflow); + + std::stringstream ss; + for (size_t i = 0; i < m_dataMatrices.size(); ++i) + { + ss << "at time (" << m_dataMatrices[i][0].c_str() << "):"; + for (size_t j = 0; j < m_nCol - 1; ++j) + { + matrix->getBuffer()[j * matrix->getDimensionSize(1) + i] = std::stod(m_dataMatrices[i][j + 1]); + ss << matrix->getBuffer()[j * matrix->getDimensionSize(1) + i] << ";"; + } + ss << "\n"; + } + getLogManager() << Kernel::LogLevel_Debug << "Matrix:\n" << ss.str(); + getLogManager() << Kernel::LogLevel_Debug << "Matrix:\n" << ss.str(); + + return true; +} + +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileReader.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileReader.h new file mode 100755 index 0000000..36f0043 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileReader.h @@ -0,0 +1,155 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +class CBoxAlgorithmCSVFileReader final : public Toolkit::TBoxAlgorithm +{ +public: + + CBoxAlgorithmCSVFileReader() {} + void release() override { delete this; } + uint64_t getClockFrequency() override { return 128LL << 32; } // the box clock frequency + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + bool processStreamedMatrix(); + bool processStimulation(); + bool processSignal(); + bool processChannelLocalisation(); + bool processFeatureVector(); + bool processSpectrum(); + bool convertVectorDataToMatrix(CMatrix* matrix); + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_CSVFileReader) + + +protected: + bool initializeFile(); + + FILE* m_file = nullptr; + std::string m_separator; + bool m_doNotUseFileTime = false; + CString m_filename; + + CIdentifier m_typeID = CIdentifier::undefined(); + size_t m_nCol = 0; + size_t m_sampling = 0; + size_t m_samplesPerBuffer = 0; + size_t m_channelsPerBuffer = 0; + + bool (CBoxAlgorithmCSVFileReader::*m_realProcess)() = nullptr; + + Toolkit::TEncoder* m_encoder = nullptr; + + bool m_headerSent = false; + std::vector m_lastLineSplits; + std::vector m_headerFiles; + std::vector> m_dataMatrices; + + double m_nextTime = 0; + + uint64_t m_startTime = 0; + uint64_t m_endTime = 0; + + static const size_t BUFFER_LEN = 16384; // Side-effect: a maximum allowed length for a line of a CSV file +}; + +class CBoxAlgorithmCSVFileReaderListener final : public Toolkit::TBoxListener +{ +public: + bool onOutputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getOutputType(index, typeID); + if (typeID == OV_TypeId_Spectrum) + { + box.setSettingName(3, "Unused parameter"); + box.setSettingValue(3, "0"); + } + else if (typeID == OV_TypeId_ChannelLocalisation) + { + box.setSettingName(3, "Channels number"); + box.setSettingValue(3, "32"); + } + else if (typeID == OV_TypeId_FeatureVector) + { + box.setSettingName(3, "Unused parameter"); + box.setSettingValue(3, "0"); + } + else if (typeID == OV_TypeId_StreamedMatrix) + { + box.setSettingName(3, "Samples per buffer"); + box.setSettingValue(3, "32"); + } + else if (typeID == OV_TypeId_Stimulations) + { + box.setSettingName(3, "Unused parameter"); + box.setSettingValue(3, "0"); + } + else + { + box.setOutputType(index, OV_TypeId_Signal); + box.setSettingName(3, "Samples per buffer"); + box.setSettingValue(3, "32"); + + OV_ERROR_KRF("Unsupported stream type " << typeID.str(), Kernel::ErrorType::BadOutput); + } + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmCSVFileReaderDesc final : virtual public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("CSV File Reader (Deprecated)"); } + CString getAuthorName() const override { return CString("Baptiste Payan"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Read signal in a CSV (text based) file"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("File reading and writing/CSV"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_CSVFileReader; } + IPluginObject* create() override { return new CBoxAlgorithmCSVFileReader; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmCSVFileReaderListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addOutput("Output stream", OV_TypeId_Signal); + prototype.addSetting("Filename", OV_TypeId_Filename, ""); + prototype.addSetting("Column separator", OV_TypeId_String, ";"); + prototype.addSetting("Don't use the file time",OV_TypeId_Boolean, "false"); + prototype.addSetting("Samples per buffer", OV_TypeId_Integer, "32"); + + prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + + prototype.addOutputSupport(OV_TypeId_StreamedMatrix); + prototype.addOutputSupport(OV_TypeId_FeatureVector); + prototype.addOutputSupport(OV_TypeId_ChannelLocalisation); + prototype.addOutputSupport(OV_TypeId_Signal); + prototype.addOutputSupport(OV_TypeId_Spectrum); + prototype.addOutputSupport(OV_TypeId_Stimulations); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_CSVFileReaderDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileWriter.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileWriter.cpp new file mode 100755 index 0000000..90652c7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileWriter.cpp @@ -0,0 +1,258 @@ +#include "ovpCBoxAlgorithmCSVFileWriter.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +bool CBoxAlgorithmCSVFileWriter::initialize() +{ + this->getStaticBoxContext().getInputType(0, m_typeID); + + m_separator = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + if (this->getTypeManager().isDerivedFromStream(m_typeID, OV_TypeId_StreamedMatrix)) + { + if (m_typeID == OV_TypeId_Signal) + { + m_decoder = new Toolkit::TSignalDecoder(); + m_decoder->initialize(*this, 0); + } + //else if(m_typeID==OV_TypeId_Spectrum) + //{ + // m_decoder=new Toolkit::TSpectrumDecoder < CBoxAlgorithmCSVFileWriter >(); + // m_decoder->initialize(*this,0); + //} + else if (m_typeID == OV_TypeId_FeatureVector) + { + m_decoder = new Toolkit::TFeatureVectorDecoder(); + m_decoder->initialize(*this, 0); + } + else + { + if (m_typeID != OV_TypeId_StreamedMatrix) + { + this->getLogManager() << Kernel::LogLevel_Info << "Input is a type derived from matrix that the box doesn't recognize, decoding as Streamed Matrix\n"; + } + m_decoder = new Toolkit::TStreamedMatrixDecoder(); + m_decoder->initialize(*this, 0); + } + m_realProcess = &CBoxAlgorithmCSVFileWriter::processStreamedMatrix; + } + else if (m_typeID == OV_TypeId_Stimulations) + { + m_decoder = new Toolkit::TStimulationDecoder(); + m_decoder->initialize(*this, 0); + m_realProcess = &CBoxAlgorithmCSVFileWriter::processStimulation; + } + else { OV_ERROR_KRF("Invalid input type identifier " << this->getTypeManager().getTypeName(m_typeID), Kernel::ErrorType::BadInput); } + + m_nSample = 0; + + m_firstBuffer = true; + m_headerReceived = false; + + return true; +} + +bool CBoxAlgorithmCSVFileWriter::uninitialize() +{ + if (m_fileStream.is_open()) { m_fileStream.close(); } + + if (m_decoder) + { + m_decoder->uninitialize(); + delete m_decoder; + } + + return true; +} + +bool CBoxAlgorithmCSVFileWriter::initializeFile() +{ + const CString filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + const uint64_t precision = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + + m_fileStream.open(filename.toASCIIString(), std::ios::trunc); + + OV_ERROR_UNLESS_KRF(m_fileStream.is_open(), "Error opening file [" << filename << "] for writing", Kernel::ErrorType::BadFileWrite); + + m_fileStream << std::scientific; + m_fileStream.precision(std::streamsize(precision)); + + return true; +} + +bool CBoxAlgorithmCSVFileWriter::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmCSVFileWriter::process() +{ + if (!m_fileStream.is_open()) { if (!initializeFile()) { return false; } } + return (this->*m_realProcess)(); +} + +bool CBoxAlgorithmCSVFileWriter::processStreamedMatrix() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + const uint64_t tStart = boxContext.getInputChunkStartTime(0, i); + const uint64_t tEnd = boxContext.getInputChunkEndTime(0, i); + + m_decoder->decode(i); + + if (m_decoder->isHeaderReceived()) + { + if (!m_headerReceived) + { + m_headerReceived = true; + + const CMatrix* matrix = static_cast*>(m_decoder)->getOutputMatrix(); + + OV_ERROR_UNLESS_KRF(matrix->getDimensionCount() == 1 || matrix->getDimensionCount() == 2, + "Invalid input matrix: must have 1 or 2 dimensions", Kernel::ErrorType::BadInput); + + if (matrix->getDimensionCount() == 1 || m_typeID == OV_TypeId_FeatureVector) + { + // The matrix is a vector, make a matrix to represent it. This [n X 1] will get written as a single row due to transpose later + m_oMatrix.resize(matrix->getDimensionSize(0), 1); + for (size_t j = 0; j < matrix->getDimensionSize(0); ++j) { m_oMatrix.setDimensionLabel(0, j, matrix->getDimensionLabel(0, j)); } + } + else + { + // As-is + m_oMatrix.copyDescription(*matrix); + } + // std::cout<<&m_Matrix<<" "<<&op_pMatrix<<"\n"; + m_fileStream << "Time (s)"; + for (size_t c = 0; c < m_oMatrix.getDimensionSize(0); ++c) + { + std::string label(m_oMatrix.getDimensionLabel(0, c)); + while (label.length() > 0 && label[label.length() - 1] == ' ') { label.erase(label.length() - 1); } + m_fileStream << m_separator.toASCIIString() << label; + } + + if (m_typeID == OV_TypeId_Signal) { m_fileStream << m_separator.toASCIIString() << "Sampling Rate"; } + else if (m_typeID == OV_TypeId_Spectrum) + { + m_fileStream << m_separator << "Min frequency band"; + m_fileStream << m_separator << "Max frequency band"; + } + else { } + + m_fileStream << "\n"; + } + else { OV_ERROR_KRF("Multiple streamed matrix headers received", Kernel::ErrorType::BadInput); } + } + if (m_decoder->isBufferReceived()) + { + const CMatrix* matrix = static_cast*>(m_decoder)->getOutputMatrix(); + + const size_t nChannel = m_oMatrix.getDimensionSize(0); + const size_t nSample = m_oMatrix.getDimensionSize(1); + + //this->getLogManager() << Kernel::LogLevel_Info << " dimsIn " << matrix->getDimensionSize(0) << "," << matrix->getDimensionSize(1) << "\n"; + //this->getLogManager() << Kernel::LogLevel_Info << " dimsBuf " << m_oMatrix.getDimensionSize(0) << "," << m_oMatrix.getDimensionSize(1) << "\n"; + + for (size_t s = 0; s < nSample; ++s) + { + if (m_typeID == OV_TypeId_StreamedMatrix || m_typeID == OV_TypeId_FeatureVector) { m_fileStream << CTime(tStart).toSeconds(); } + else if (m_typeID == OV_TypeId_Signal) + { + const uint64_t frequency = static_cast*>(m_decoder)-> + getOutputSamplingRate(); + const uint64_t timeOfNthSample = CTime(frequency, s).time(); // assuming chunk start is 0 + const uint64_t sampleTime = tStart + timeOfNthSample; + + m_fileStream << CTime(sampleTime).toSeconds(); + } + else if (m_typeID == OV_TypeId_Spectrum) { m_fileStream << CTime(tEnd).toSeconds(); } + for (size_t c = 0; c < nChannel; ++c) { m_fileStream << m_separator.toASCIIString() << matrix->getBuffer()[c * nSample + s]; } + + if (m_firstBuffer) + { + if (m_typeID == OV_TypeId_Signal) + { + const uint64_t frequency = static_cast*>(m_decoder)-> + getOutputSamplingRate(); + + m_fileStream << m_separator.toASCIIString() << uint64_t(frequency); + + m_firstBuffer = false; + } + else if (m_typeID == OV_TypeId_Spectrum) + { + // This should not be supported anymore + // This is not the correct formula + const CMatrix* freq = static_cast*>(m_decoder)-> + getOutputFrequencyAbscissa(); + const double half = s > 0 ? (freq->getBuffer()[s] - freq->getBuffer()[s - 1]) / 2.0 + : (freq->getBuffer()[s + 1] - freq->getBuffer()[s]) / 2.0; + m_fileStream << m_separator.toASCIIString() << (freq->getBuffer()[s] - half); + m_fileStream << m_separator.toASCIIString() << (freq->getBuffer()[s] + half); + } + else { } + } + else + { + if (m_typeID == OV_TypeId_Signal) { m_fileStream << m_separator.toASCIIString(); } + else if (m_typeID == OV_TypeId_Spectrum) { m_fileStream << m_separator.toASCIIString() << m_separator.toASCIIString(); } + else { } + } + + m_fileStream << "\n"; + } + m_nSample += nSample; + + m_firstBuffer = false; + } + if (m_decoder->isEndReceived()) { } + boxContext.markInputAsDeprecated(0, i); + } + + return true; +} + +bool CBoxAlgorithmCSVFileWriter::processStimulation() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_decoder->decode(i); + if (m_decoder->isHeaderReceived()) + { + if (!m_headerReceived) + { + m_headerReceived = true; + m_fileStream << "Time (s)" << m_separator.toASCIIString() << "Identifier" << m_separator.toASCIIString() << "Duration\n"; + } + else { OV_ERROR_KRF("Multiple stimulation headers received", Kernel::ErrorType::BadInput); } + } + if (m_decoder->isBufferReceived()) + { + const IStimulationSet* stimSet = static_cast*>(m_decoder)-> + getOutputStimulationSet(); + for (size_t j = 0; j < stimSet->getStimulationCount(); ++j) + { + m_fileStream << CTime(stimSet->getStimulationDate(j)).toSeconds() << m_separator.toASCIIString() + << stimSet->getStimulationIdentifier(j) << m_separator.toASCIIString() + << CTime(stimSet->getStimulationDuration(j)).toSeconds() << "\n"; + } + } + if (m_decoder->isEndReceived()) { } + boxContext.markInputAsDeprecated(0, i); + } + + return true; +} + +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileWriter.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileWriter.h new file mode 100755 index 0000000..9811368 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmCSVFileWriter.h @@ -0,0 +1,96 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +class CBoxAlgorithmCSVFileWriter final : public Toolkit::TBoxAlgorithm +{ +public: + + CBoxAlgorithmCSVFileWriter() { } + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + bool processStreamedMatrix(); + bool processStimulation(); + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_CSVFileWriter) + + +protected: + bool initializeFile(); + + std::ofstream m_fileStream; + + CString m_separator; + CIdentifier m_typeID = CIdentifier::undefined(); + bool m_firstBuffer = false; + bool (CBoxAlgorithmCSVFileWriter::*m_realProcess)() = nullptr; + + Toolkit::TDecoder* m_decoder = nullptr; + CMatrix m_oMatrix; // This represents the properties of the input, no data + + uint64_t m_nSample = 0; + + bool m_headerReceived = false; +}; + +class CBoxAlgorithmCSVFileWriterListener final : public Toolkit::TBoxListener +{ +public: + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmCSVFileWriterDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("CSV File Writer (Deprecated)"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Writes signal in a CSV (text based) file"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("File reading and writing/CSV"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_CSVFileWriter; } + IPluginObject* create() override { return new CBoxAlgorithmCSVFileWriter; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmCSVFileWriterListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input stream", OV_TypeId_Signal); + prototype.addSetting("Filename", OV_TypeId_Filename, "record-[$core{date}-$core{time}].csv"); + prototype.addSetting("Column separator", OV_TypeId_String, ";"); + prototype.addSetting("Precision", OV_TypeId_Integer, "10"); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + prototype.addInputSupport(OV_TypeId_Spectrum); + prototype.addInputSupport(OV_TypeId_Stimulations); + prototype.addInputSupport(OV_TypeId_FeatureVector); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_CSVFileWriterDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmOVCSVFileReader.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmOVCSVFileReader.cpp new file mode 100755 index 0000000..a8df219 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmOVCSVFileReader.cpp @@ -0,0 +1,311 @@ +#include "ovpCBoxAlgorithmOVCSVFileReader.h" +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +bool CBoxAlgorithmOVCSVFileReader::initialize() +{ + m_sampling = 0; + m_isHeaderSent = false; + m_isStimulationHeaderSent = false; + + this->getStaticBoxContext().getOutputType(0, m_typeID); + + const CString filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + OV_ERROR_UNLESS_KRF(m_readerLib->openFile(filename.toASCIIString(), CSV::EFileAccessMode::Read), + (CSV::ICSVHandler::getLogError(m_readerLib->getLastLogError()) + (m_readerLib->getLastErrorString().empty() ? "" : ". Details: " + + m_readerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + + m_nSamplePerBuffer = 1; + + if (m_typeID == OV_TypeId_Signal) + { + m_algorithmEncoder = new Toolkit::TSignalEncoder(*this, 0); + m_readerLib->setFormatType(CSV::EStreamType::Signal); + } + else if (m_typeID == OV_TypeId_StreamedMatrix || m_typeID == OV_TypeId_CovarianceMatrix) + { + m_algorithmEncoder = new Toolkit::TStreamedMatrixEncoder(*this, 0); + m_readerLib->setFormatType(CSV::EStreamType::StreamedMatrix); + } + else if (m_typeID == OV_TypeId_FeatureVector) + { + m_algorithmEncoder = new Toolkit::TFeatureVectorEncoder(*this, 0); + m_readerLib->setFormatType(CSV::EStreamType::FeatureVector); + } + else if (m_typeID == OV_TypeId_Spectrum) + { + m_algorithmEncoder = new Toolkit::TSpectrumEncoder(*this, 0); + m_readerLib->setFormatType(CSV::EStreamType::Spectrum); + } + else { OV_ERROR_KRF("Output is a type derived from matrix that the box doesn't recognize support", Kernel::ErrorType::BadInput); } + + OV_ERROR_UNLESS_KRF(m_stimEncoder.initialize(*this, 1), "Error during stimulation encoder initialize", Kernel::ErrorType::Internal); + + const char* msg = (CSV::ICSVHandler::getLogError(m_readerLib->getLastLogError()) + (m_readerLib->getLastErrorString().empty() ? "" + : ". Details: " + m_readerLib->getLastErrorString())).c_str(); + if (m_typeID == OV_TypeId_Signal) + { + OV_ERROR_UNLESS_KRF(m_readerLib->getSignalInformation(m_channelNames, m_sampling, m_nSamplePerBuffer), msg, Kernel::ErrorType::Internal); + } + else if (m_typeID == OV_TypeId_StreamedMatrix || m_typeID == OV_TypeId_CovarianceMatrix) + { + OV_ERROR_UNLESS_KRF(m_readerLib->getStreamedMatrixInformation(m_dimSizes, m_channelNames), msg, Kernel::ErrorType::Internal); + } + else if (m_typeID == OV_TypeId_FeatureVector) + { + OV_ERROR_UNLESS_KRF(m_readerLib->getFeatureVectorInformation(m_channelNames), msg, Kernel::ErrorType::Internal); + } + else if (m_typeID == OV_TypeId_Spectrum) + { + OV_ERROR_UNLESS_KRF(m_readerLib->getSpectrumInformation(m_channelNames, m_frequencyAbscissa, m_sampling), msg, Kernel::ErrorType::Internal); + } + + return true; +} + +bool CBoxAlgorithmOVCSVFileReader::uninitialize() +{ + m_channelNames.clear(); + m_dimSizes.clear(); + m_frequencyAbscissa.clear(); + + m_algorithmEncoder.uninitialize(); + + OV_ERROR_UNLESS_KRF(m_stimEncoder.uninitialize(), "Failed to uninitialize stimulation encoder", Kernel::ErrorType::Internal); + + return true; +} + +bool CBoxAlgorithmOVCSVFileReader::processClock(Kernel::CMessageClock& /*msg*/) +{ + OV_ERROR_UNLESS_KRF(getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(), "Failed to mark clock algorithm as ready to process", + Kernel::ErrorType::Internal); + return true; +} + +bool CBoxAlgorithmOVCSVFileReader::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + CMatrix* matrix = m_algorithmEncoder.getInputMatrix(); + + // encode Header if not already encoded + if (!m_isHeaderSent) + { + if (m_typeID == OV_TypeId_Signal) + { + matrix->resize(m_channelNames.size(), m_nSamplePerBuffer); + size_t index = 0; + + for (const std::string& channelName : m_channelNames) + { + OV_FATAL_UNLESS_K(matrix->setDimensionLabel(0, index++, channelName.c_str()), "Failed to set dimension label", Kernel::ErrorType::Internal); + } + + m_algorithmEncoder.getInputSamplingRate() = m_sampling; + } + else if (m_typeID == OV_TypeId_StreamedMatrix || m_typeID == OV_TypeId_CovarianceMatrix) + { + OV_FATAL_UNLESS_K(matrix->setDimensionCount(m_dimSizes.size()), "Failed to set dimension count", Kernel::ErrorType::Internal); + size_t prevDimSize = 0; + + for (size_t d1 = 0; d1 < m_dimSizes.size(); ++d1) + { + OV_FATAL_UNLESS_K(matrix->setDimensionSize(d1, m_dimSizes[d1]), "Failed to set dimension size " << d1 + 1, Kernel::ErrorType::Internal); + + for (size_t d2 = 0; d2 < m_dimSizes[d1]; ++d2) + { + OV_FATAL_UNLESS_K(matrix->setDimensionLabel(d1, d2, m_channelNames[prevDimSize + d2].c_str()), "Failed to set dimension label", + Kernel::ErrorType::Internal); + } + + prevDimSize += m_dimSizes[d1]; + } + } + else if (m_typeID == OV_TypeId_FeatureVector) + { + matrix->resize(m_channelNames.size()); + + size_t index = 0; + for (const std::string& channelName : m_channelNames) + { + OV_FATAL_UNLESS_K(matrix->setDimensionLabel(0, index++, channelName.c_str()), "Failed to set dimension label", Kernel::ErrorType::Internal); + } + } + else if (m_typeID == OV_TypeId_Spectrum) + { + CMatrix* frequencyAbscissaMatrix = m_algorithmEncoder.getInputFrequencyAbcissa(); + + matrix->resize(m_channelNames.size(), m_frequencyAbscissa.size()); + frequencyAbscissaMatrix->resize(m_frequencyAbscissa.size()); + + size_t index = 0; + for (const std::string& channelName : m_channelNames) + { + OV_FATAL_UNLESS_K(matrix->setDimensionLabel(0, index++, channelName.c_str()), "Failed to set dimension label", Kernel::ErrorType::Internal); + } + + index = 0; + for (const double& frequencyAbscissaValue : m_frequencyAbscissa) + { + frequencyAbscissaMatrix->getBuffer()[index] = frequencyAbscissaValue; + OV_FATAL_UNLESS_K(matrix->setDimensionLabel(1, index++, std::to_string(frequencyAbscissaValue).c_str()), "Failed to set dimension label", + Kernel::ErrorType::Internal); + } + + m_algorithmEncoder.getInputSamplingRate() = m_sampling; + } + + OV_ERROR_UNLESS_KRF(m_algorithmEncoder.encodeHeader(), "Failed to encode signal header", Kernel::ErrorType::Internal); + + m_isHeaderSent = true; + OV_ERROR_UNLESS_KRF(boxContext.markOutputAsReadyToSend(0, 0, 0), "Failed to mark signal header as ready to send", Kernel::ErrorType::Internal); + } + + const double currentTime = CTime(this->getPlayerContext().getCurrentTime()).toSeconds(); + + if (!m_readerLib->hasDataToRead() && m_savedChunks.empty()) { return true; } + + // Fill the chunk buffer if there is no enough data. + if ((m_savedChunks.empty() || m_savedChunks.back().startTime < currentTime) && m_readerLib->hasDataToRead()) + { + do + { + std::vector matrixChunk; + std::vector stimulationChunk; + + OV_ERROR_UNLESS_KRF(m_readerLib->readSamplesAndEventsFromFile(1, matrixChunk, stimulationChunk), + (CSV::ICSVHandler::getLogError(m_readerLib->getLastLogError()) + (m_readerLib->getLastErrorString().empty() ? "" : ". Details: " + + m_readerLib->getLastErrorString())).c_str(), + Kernel::ErrorType::Internal); + + m_savedChunks.insert(m_savedChunks.end(), matrixChunk.begin(), matrixChunk.end()); + m_savedStimulations.insert(m_savedStimulations.end(), stimulationChunk.begin(), stimulationChunk.end()); + } while (!m_savedChunks.empty() && m_savedChunks.back().startTime < currentTime && m_readerLib->hasDataToRead()); + } + + if (!m_savedChunks.empty()) + { + const double chunkStartTime = m_savedChunks.cbegin()->startTime; + const double chunkEndTime = m_savedChunks.back().endTime; + + // send stimulations chunk even if there is no stimulations, chunks have to be continued + OV_ERROR_UNLESS_KRF(this->processStimulation(chunkStartTime, chunkEndTime), "Error during stimulation process", Kernel::ErrorType::Internal); + + size_t chunksToRemove = 0; + + for (const CSV::SMatrixChunk& chunk : m_savedChunks) + { + if (currentTime > chunk.startTime) + { + // move read matrix into buffer to encode + std::move(chunk.matrix.begin(), chunk.matrix.end(), matrix->getBuffer()); + + OV_ERROR_UNLESS_KRF(m_algorithmEncoder.encodeBuffer(), "Failed to encode signal buffer", Kernel::ErrorType::Internal); + + OV_ERROR_UNLESS_KRF( + boxContext.markOutputAsReadyToSend(0, CTime(chunk.startTime).time(), CTime(chunk.endTime).time()), + "Failed to mark signal output as ready to send", + Kernel::ErrorType::Internal); + + chunksToRemove++; + } + else { break; } + } + + // If there is no more data to send, we push the end. + if (m_savedChunks.size() == chunksToRemove && !m_readerLib->hasDataToRead()) + { + OV_ERROR_UNLESS_KRF(m_algorithmEncoder.encodeEnd(), "Failed to encode end.", Kernel::ErrorType::Internal); + + OV_ERROR_UNLESS_KRF( + boxContext.markOutputAsReadyToSend(0, CTime(m_savedChunks.back().startTime).time(), CTime(m_savedChunks.back().endTime).time()), + "Failed to mark signal output as ready to send", Kernel::ErrorType::Internal); + } + + if (chunksToRemove != 0) { m_savedChunks.erase(m_savedChunks.begin(), m_savedChunks.begin() + chunksToRemove); } + } + + return true; +} + +bool CBoxAlgorithmOVCSVFileReader::processStimulation(const double startTime, const double endTime) +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + if (!m_isStimulationHeaderSent) + { + OV_ERROR_UNLESS_KRF(m_stimEncoder.encodeHeader(), "Failed to encode stimulation header", Kernel::ErrorType::Internal); + m_isStimulationHeaderSent = true; + + OV_ERROR_UNLESS_KRF(boxContext.markOutputAsReadyToSend(1, 0, 0), "Failed to mark stimulation header as ready to send", Kernel::ErrorType::Internal); + } + + IStimulationSet* stimulationSet = m_stimEncoder.getInputStimulationSet(); + stimulationSet->clear(); + + const uint64_t stimulationChunkStartTime = m_lastStimulationDate; + const uint64_t currentTime = getPlayerContext().getCurrentTime(); + + if (m_savedStimulations.empty()) + { + if (currentTime > m_lastStimulationDate) + { + m_lastStimulationDate = currentTime; + + OV_ERROR_UNLESS_KRF(m_stimEncoder.encodeBuffer(), "Failed to encode stimulation buffer", Kernel::ErrorType::Internal); + + OV_ERROR_UNLESS_KRF(boxContext.markOutputAsReadyToSend(1, stimulationChunkStartTime, currentTime), + "Failed to mark stimulation output as ready to send", Kernel::ErrorType::Internal); + } + } + else + { + auto it = m_savedStimulations.begin(); + + for (; it != m_savedStimulations.end(); ++it) + { + const double stimulationDate = it->date; + + if (startTime <= stimulationDate && stimulationDate <= endTime) + { + stimulationSet->appendStimulation(it->id, CTime(it->date).time(), CTime(it->duration).time()); + m_lastStimulationDate = CTime(it->date).time(); + } + else + { + const std::string message = "The stimulation is not synced with the stream and will be ignored: [Value: " + + std::to_string(it->id) + " | Date: " + std::to_string(it->date) + + " | Duration: " + std::to_string(it->duration) + "]"; + + OV_WARNING_K(message.c_str()); + } + } + + if (it != m_savedStimulations.begin()) { m_savedStimulations.erase(m_savedStimulations.begin(), it); } + + + OV_ERROR_UNLESS_KRF(m_stimEncoder.encodeBuffer(), "Failed to encode stimulation buffer", Kernel::ErrorType::Internal); + + OV_ERROR_UNLESS_KRF(boxContext.markOutputAsReadyToSend(1, stimulationChunkStartTime, m_lastStimulationDate), + "Failed to mark stimulation output as ready to send", Kernel::ErrorType::Internal); + + // If there is no more data to send, we push the end. + if (m_savedStimulations.empty() && !m_readerLib->hasDataToRead()) + { + OV_ERROR_UNLESS_KRF(m_algorithmEncoder.encodeEnd(), "Failed to encode end.", Kernel::ErrorType::Internal); + + OV_ERROR_UNLESS_KRF(boxContext.markOutputAsReadyToSend(1, stimulationChunkStartTime, currentTime), + "Failed to mark signal output as ready to send", Kernel::ErrorType::Internal); + } + } + + return true; +} + +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmOVCSVFileReader.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmOVCSVFileReader.h new file mode 100755 index 0000000..0e7dd2b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmOVCSVFileReader.h @@ -0,0 +1,117 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +#include +#include + +#include "csv/ovICSV.h" + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +class CBoxAlgorithmOVCSVFileReader final : public Toolkit::TBoxAlgorithm +{ +public: + + CBoxAlgorithmOVCSVFileReader() : m_readerLib(CSV::createCSVHandler(), CSV::releaseCSVHandler) { } + void release() override { delete this; } + uint64_t getClockFrequency() override { return 128LL << 32; } + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_OVCSVFileReader) + +private: + bool processStimulation(double startTime, double endTime); + + std::unique_ptr m_readerLib; + + Toolkit::TGenericEncoder m_algorithmEncoder; + Toolkit::TStimulationEncoder m_stimEncoder; + + std::deque m_savedChunks; + std::deque m_savedStimulations; + + uint64_t m_lastStimulationDate = 0; + + CIdentifier m_typeID = CIdentifier::undefined(); + std::vector m_channelNames; + std::vector m_dimSizes; + size_t m_sampling = 0; + size_t m_nSamplePerBuffer = 0; + + bool m_isHeaderSent = false; + bool m_isStimulationHeaderSent = false; + std::vector m_frequencyAbscissa; +}; + +class CBoxAlgorithmOVCSVFileReaderListener final : public Toolkit::TBoxListener +{ +public: + bool onOutputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getOutputType(index, typeID); + + if (index == 0 && typeID == OV_TypeId_Stimulations) + { + OV_ERROR_UNLESS_KRF(box.setOutputType(index, OV_TypeId_Signal), "Failed to reset output type to signal", Kernel::ErrorType::Internal); + } + else if (index == 1 && typeID != OV_TypeId_Stimulations) + { + OV_ERROR_UNLESS_KRF(box.setOutputType(index, OV_TypeId_Stimulations), "Failed to reset output type to stimulations", Kernel::ErrorType::Internal); + } + else if (index > 1) { OV_ERROR_UNLESS_KRF(false, "The index of the output does not exist", Kernel::ErrorType::Internal); } + + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmOVCSVFileReaderDesc final : virtual public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("CSV File Reader"); } + CString getAuthorName() const override { return CString("Victor Herlin"); } + CString getAuthorCompanyName() const override { return CString("Mensia Technologies SA"); } + CString getShortDescription() const override { return CString("Read signal in a CSV (text based) file"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("File reading and writing/CSV"); } + CString getVersion() const override { return CString("1.1"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.1.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.3.3"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_OVCSVFileReader; } + IPluginObject* create() override { return new CBoxAlgorithmOVCSVFileReader; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmOVCSVFileReaderListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& BoxAlgorithmPrototype) const override + { + BoxAlgorithmPrototype.addOutput("Output stream", OV_TypeId_Signal); + BoxAlgorithmPrototype.addOutput("Output stimulation", OV_TypeId_Stimulations); + BoxAlgorithmPrototype.addSetting("Filename", OV_TypeId_Filename, ""); + + BoxAlgorithmPrototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + + BoxAlgorithmPrototype.addOutputSupport(OV_TypeId_Signal); + BoxAlgorithmPrototype.addOutputSupport(OV_TypeId_Spectrum); + BoxAlgorithmPrototype.addOutputSupport(OV_TypeId_FeatureVector); + BoxAlgorithmPrototype.addOutputSupport(OV_TypeId_StreamedMatrix); + BoxAlgorithmPrototype.addOutputSupport(OV_TypeId_CovarianceMatrix); + BoxAlgorithmPrototype.addOutputSupport(OV_TypeId_Stimulations); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_OVCSVFileReaderDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmOVCSVFileWriter.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmOVCSVFileWriter.cpp new file mode 100755 index 0000000..4271f16 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmOVCSVFileWriter.cpp @@ -0,0 +1,337 @@ +#include "ovpCBoxAlgorithmOVCSVFileWriter.h" + +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +CBoxAlgorithmOVCSVFileWriter::CBoxAlgorithmOVCSVFileWriter() + : m_writerLib(CSV::createCSVHandler(), CSV::releaseCSVHandler) {} + +bool CBoxAlgorithmOVCSVFileWriter::initialize() +{ + m_isFileOpen = false; + m_epoch = 0; + OV_ERROR_UNLESS_KRF(this->getStaticBoxContext().getInputType(0, m_typeID), "Error while getting input type", Kernel::ErrorType::Internal); + + if (m_typeID == OV_TypeId_Signal) + { + m_writerLib->setFormatType(CSV::EStreamType::Signal); + m_streamDecoder = new Toolkit::TSignalDecoder(*this, 0); + } + else if (m_typeID == OV_TypeId_StreamedMatrix || m_typeID == OV_TypeId_CovarianceMatrix) + { + m_writerLib->setFormatType(CSV::EStreamType::StreamedMatrix); + m_streamDecoder = new Toolkit::TStreamedMatrixDecoder(*this, 0); + } + else if (m_typeID == OV_TypeId_FeatureVector) + { + m_writerLib->setFormatType(CSV::EStreamType::FeatureVector); + m_streamDecoder = new Toolkit::TFeatureVectorDecoder(*this, 0); + } + else if (m_typeID == OV_TypeId_Spectrum) + { + m_writerLib->setFormatType(CSV::EStreamType::Spectrum); + m_streamDecoder = new Toolkit::TSpectrumDecoder(*this, 0); + } + else { OV_ERROR_KRF("Input is a type derived from matrix that the box doesn't recognize", Kernel::ErrorType::BadInput); } + + OV_ERROR_UNLESS_KRF(m_stimDecoder.initialize(*this, 1), "Error while stimulation decoder initialization", Kernel::ErrorType::Internal); + + + const CString filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_writerLib->setOutputFloatPrecision(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1)); + m_appendData = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + m_lastMatrixOnly = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + m_writerLib->setLastMatrixOnlyMode(m_lastMatrixOnly); + + if (!m_appendData) + { + OV_ERROR_UNLESS_KRF(m_writerLib->openFile(filename.toASCIIString(), CSV::EFileAccessMode::Write), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? "" : + "Details: " + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + m_writeHeader = true; + } + else + { + FILE* file = FS::Files::open(filename, "r"); + + if (file) + { + fseek(file, 0, SEEK_END); + m_writeHeader = ftell(file) == 0; + fclose(file); + } + + OV_ERROR_UNLESS_KRF(m_writerLib->openFile(filename.toASCIIString(), CSV::EFileAccessMode::Append), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? "" : + "Details: " + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + } + + m_isHeaderReceived = false; + + return true; +} + +bool CBoxAlgorithmOVCSVFileWriter::uninitialize() +{ + m_streamDecoder.uninitialize(); + m_stimDecoder.uninitialize(); + + OV_ERROR_UNLESS_KRF(m_writerLib->noEventsUntilDate(std::numeric_limits::max()), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? "" : "Details: " + + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + + OV_ERROR_UNLESS_KRF(m_writerLib->writeAllDataToFile(), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? "" : "Details: " + + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + + OV_ERROR_UNLESS_KRF(m_writerLib->closeFile(), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? "" : "Details: " + + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + + return true; +} + +bool CBoxAlgorithmOVCSVFileWriter::processInput(const size_t /*index*/) +{ + OV_ERROR_UNLESS_KRF(getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(), "Error while marking algorithm as ready to process", Kernel::ErrorType::Internal); + return true; +} + +bool CBoxAlgorithmOVCSVFileWriter::process() +{ + OV_ERROR_UNLESS_KRF(this->processStreamedMatrix(), "Error have been thrown during streamed matrix process", Kernel::ErrorType::Internal); + OV_ERROR_UNLESS_KRF(this->processStimulation(), "Error have been thrown during stimulation process", Kernel::ErrorType::Internal); + + // write into the library + if (!m_lastMatrixOnly) + { + OV_ERROR_UNLESS_KRF(m_writerLib->writeDataToFile(), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? "" : + "Details: " + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + } + + return true; +} + +bool CBoxAlgorithmOVCSVFileWriter::processStreamedMatrix() +{ + Kernel::IBoxIO& dynamicBoxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < dynamicBoxContext.getInputChunkCount(0); ++i) + { + OV_ERROR_UNLESS_KRF(m_streamDecoder.decode(i), "Failed to decode chunk", Kernel::ErrorType::Internal); + + // represents the properties of the input, no data + const CMatrix* matrix = m_streamDecoder.getOutputMatrix(); + + if (m_streamDecoder.isHeaderReceived()) + { + OV_ERROR_UNLESS_KRF(!m_isHeaderReceived, "Multiple streamed matrix headers received", Kernel::ErrorType::BadInput); + m_isHeaderReceived = true; + + if (m_typeID == OV_TypeId_Signal) + { + OV_ERROR_UNLESS_KRF(m_streamDecoder.getOutputSamplingRate() != 0, "Sampling rate can not be 0", Kernel::ErrorType::BadInput); + std::vector dimensionLabels; + + for (size_t j = 0; j < matrix->getDimensionSize(0); ++j) { dimensionLabels.push_back(matrix->getDimensionLabel(0, j)); } + + OV_ERROR_UNLESS_KRF( + m_writerLib->setSignalInformation(dimensionLabels, m_streamDecoder.getOutputSamplingRate(), matrix->getDimensionSize(1)), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? "" : "Details: " + + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + + if (m_writeHeader) + { + OV_ERROR_UNLESS_KRF(m_writerLib->writeHeaderToFile(), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? + "" : "Details: " + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + } + } + else if (m_typeID == OV_TypeId_StreamedMatrix || m_typeID == OV_TypeId_CovarianceMatrix) + { + std::vector dimensionLabels; + std::vector dimensionSizes; + + for (size_t d1 = 0; d1 < matrix->getDimensionCount(); ++d1) + { + dimensionSizes.push_back(matrix->getDimensionSize(d1)); + + for (size_t d2 = 0; d2 < matrix->getDimensionSize(d1); ++d2) { dimensionLabels.push_back(matrix->getDimensionLabel(d1, d2)); } + } + + OV_ERROR_UNLESS_KRF(m_writerLib->setStreamedMatrixInformation(dimensionSizes, dimensionLabels), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? "" : + "Details: " + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + + if (m_writeHeader) + { + OV_ERROR_UNLESS_KRF(m_writerLib->writeHeaderToFile(), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? + "" : "Details: " + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + } + } + else if (m_typeID == OV_TypeId_FeatureVector) + { + std::vector channelsLabels; + + for (size_t j = 0; j < matrix->getDimensionSize(0); ++j) { channelsLabels.push_back(matrix->getDimensionLabel(0, j)); } + + OV_ERROR_UNLESS_KRF(m_writerLib->setFeatureVectorInformation(channelsLabels), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? "" : + "Details: " + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + + if (m_writeHeader) + { + OV_ERROR_UNLESS_KRF(m_writerLib->writeHeaderToFile(), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? + "" : "Details: " + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + } + } + else if (m_typeID == OV_TypeId_Spectrum) + { + const CMatrix* frequencyAbscissaMatrix = m_streamDecoder.getOutputFrequencyAbcissa(); + std::vector channelsLabels; + std::vector frequencyAbscissa; + + for (size_t j = 0; j < matrix->getDimensionSize(0); ++j) { channelsLabels.push_back(matrix->getDimensionLabel(0, j)); } + + for (size_t j = 0; j < frequencyAbscissaMatrix->getDimensionSize(0); ++j) + { + frequencyAbscissa.push_back(frequencyAbscissaMatrix->getBuffer()[j]); + } + + OV_ERROR_UNLESS_KRF(m_writerLib->setSpectrumInformation(channelsLabels, frequencyAbscissa, m_streamDecoder.getOutputSamplingRate()), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? "" : + "Details: " + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + + if (m_writeHeader) + { + OV_ERROR_UNLESS_KRF(m_writerLib->writeHeaderToFile(), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? + "" : "Details: " + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + } + } + } + + if (m_streamDecoder.isBufferReceived()) + { + const CMatrix* imatrix = m_streamDecoder.getOutputMatrix(); + + if (m_typeID == OV_TypeId_Signal) + { + const uint64_t sampling = m_streamDecoder.getOutputSamplingRate(); + const uint64_t chunkStartTime = dynamicBoxContext.getInputChunkStartTime(0, i); + const size_t nChannel = matrix->getDimensionSize(0); + const size_t nSample = matrix->getDimensionSize(1); + + for (size_t sampleIndex = 0; sampleIndex < nSample; ++sampleIndex) + { + std::vector matrixValues; + // get starting and ending time + + const uint64_t timeOfNthSample = CTime(sampling, sampleIndex).time(); // assuming chunk start is 0 + const uint64_t sampleTime = chunkStartTime + timeOfNthSample; + const double startTime = CTime(sampleTime).toSeconds(); + const uint64_t timeOfNthAndOneSample = CTime(sampling, sampleIndex + 1).time(); + const double endTime = CTime(chunkStartTime + timeOfNthAndOneSample).toSeconds(); + + // get matrix values + for (size_t channelIndex = 0; channelIndex < nChannel; ++channelIndex) + { + matrixValues.push_back(imatrix->getBuffer()[channelIndex * nSample + sampleIndex]); + } + + // add sample to the library + OV_ERROR_UNLESS_KRF(m_writerLib->addSample({ startTime, endTime, matrixValues, m_epoch }), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? + "" : "Details: " + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + } + } + else if (m_typeID == OV_TypeId_StreamedMatrix || m_typeID == OV_TypeId_CovarianceMatrix) + { + const double startTime = CTime(dynamicBoxContext.getInputChunkStartTime(0, i)).toSeconds(); + const double endTime = CTime(dynamicBoxContext.getInputChunkEndTime(0, i)).toSeconds(); + const std::vector streamedMatrixValues(matrix->getBuffer(), matrix->getBuffer() + matrix->getBufferElementCount()); + + OV_ERROR_UNLESS_KRF(m_writerLib->addSample({ startTime, endTime, streamedMatrixValues, m_epoch }), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? "" : + "Details: " + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + } + else if (m_typeID == OV_TypeId_FeatureVector) + { + const double startTime = CTime(dynamicBoxContext.getInputChunkStartTime(0, i)).toSeconds(); + const double endTime = CTime(dynamicBoxContext.getInputChunkEndTime(0, i)).toSeconds(); + const CMatrix* zmatrix = m_streamDecoder.getOutputMatrix(); + + const std::vector streamedMatrixValues(zmatrix->getBuffer(), zmatrix->getBuffer() + zmatrix->getBufferElementCount()); + + OV_ERROR_UNLESS_KRF(m_writerLib->addSample({ startTime, endTime, streamedMatrixValues, m_epoch }), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? "" : + "Details: " + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + } + else if (m_typeID == OV_TypeId_Spectrum) + { + const double startTime = CTime(dynamicBoxContext.getInputChunkStartTime(0, i)).toSeconds(); + const double endTime = CTime(dynamicBoxContext.getInputChunkEndTime(0, i)).toSeconds(); + const std::vector streamedMatrixValues(matrix->getBuffer(), matrix->getBuffer() + matrix->getBufferElementCount()); + + OV_ERROR_UNLESS_KRF(m_writerLib->addSample({ startTime, endTime, streamedMatrixValues, m_epoch }), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? "" : + "Details: " + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + } + + m_epoch++; + } + + OV_ERROR_UNLESS_KRF(dynamicBoxContext.markInputAsDeprecated(0, i), "Fail to mark input as deprecated", Kernel::ErrorType::Internal); + } + + return true; +} + +bool CBoxAlgorithmOVCSVFileWriter::processStimulation() +{ + Kernel::IBoxIO& dynamicBoxContext = this->getDynamicBoxContext(); + + // add every stimulation received + for (size_t i = 0; i < dynamicBoxContext.getInputChunkCount(1); ++i) + { + OV_ERROR_UNLESS_KRF(m_stimDecoder.decode(i), "Failed to decode stimulation chunk", Kernel::ErrorType::Internal); + + if (m_stimDecoder.isBufferReceived()) + { + const IStimulationSet* stimulationSet = m_stimDecoder.getOutputStimulationSet(); + // for each stimulation, get its informations + + for (size_t j = 0; j < stimulationSet->getStimulationCount(); ++j) + { + OV_ERROR_UNLESS_KRF(m_writerLib->addEvent({ stimulationSet->getStimulationIdentifier(j), + CTime(stimulationSet->getStimulationDate(j)).toSeconds(), + CTime(stimulationSet->getStimulationDuration(j)).toSeconds() }), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? "" : + "Details: " + m_writerLib->getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + } + + // set NoEventUntilDate to prevent time that will be empty of stimulations until the end of the last chunk + OV_ERROR_UNLESS_KRF( + m_writerLib->noEventsUntilDate(CTime(dynamicBoxContext.getInputChunkEndTime(1, (dynamicBoxContext.getInputChunkCount(1) - 1))).toSeconds()), + (CSV::ICSVHandler::getLogError(m_writerLib->getLastLogError()) + (m_writerLib->getLastErrorString().empty() ? "" : "Details: " + m_writerLib-> + getLastErrorString())).c_str(), Kernel::ErrorType::Internal); + } + + OV_ERROR_UNLESS_KRF(dynamicBoxContext.markInputAsDeprecated(1, i), "Failed to mark stimulations input as deprecated", Kernel::ErrorType::Internal); + } + + return true; +} + +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmOVCSVFileWriter.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmOVCSVFileWriter.h new file mode 100755 index 0000000..59da2a6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/csv/ovpCBoxAlgorithmOVCSVFileWriter.h @@ -0,0 +1,113 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +#include +#include + +#include "csv/ovICSV.h" + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +class CBoxAlgorithmOVCSVFileWriter final : public Toolkit::TBoxAlgorithm +{ +public: + + CBoxAlgorithmOVCSVFileWriter(); + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_OVCSVFileWriter) + +private: + bool processStreamedMatrix(); + bool processStimulation(); + + std::unique_ptr m_writerLib; + + CIdentifier m_typeID = CIdentifier::undefined(); + + Toolkit::TGenericDecoder m_streamDecoder; + Toolkit::TStimulationDecoder m_stimDecoder; + + uint64_t m_epoch = 0; + + bool m_isHeaderReceived = false; + bool m_isFileOpen = false; + bool m_appendData = false; + bool m_lastMatrixOnly = false; + bool m_writeHeader = true; +}; + +class CBoxAlgorithmOVCSVFileWriterListener final : public Toolkit::TBoxListener +{ +public: + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + if (index == 1) + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(1, typeID); + if (typeID != OV_TypeId_Stimulations) + { + box.setInputType(1, OV_TypeId_Stimulations); + return true; + } + } + + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmOVCSVFileWriterDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("CSV File Writer"); } + CString getAuthorName() const override { return CString("Victor Herlin"); } + CString getAuthorCompanyName() const override { return CString("Mensia Technologies SA"); } + CString getShortDescription() const override { return CString("Writes signal in a CSV (text based) file"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("File reading and writing/CSV"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.1.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.1.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_OVCSVFileWriter; } + IPluginObject* create() override { return new CBoxAlgorithmOVCSVFileWriter; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmOVCSVFileWriterListener; } + void releaseBoxListener(IBoxListener* boxListener) const override { delete boxListener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input stream", OV_TypeId_Signal); + prototype.addInput("Stimulations stream", OV_TypeId_Stimulations); + prototype.addSetting("Filename", OV_TypeId_Filename, "record-[$core{date}-$core{time}].csv"); + prototype.addSetting("Precision", OV_TypeId_Integer, "10"); + prototype.addSetting("Append data", OV_TypeId_Boolean, "false"); + prototype.addSetting("Only last matrix", OV_TypeId_Boolean, "false"); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + prototype.addInputSupport(OV_TypeId_Spectrum); + prototype.addInputSupport(OV_TypeId_FeatureVector); + prototype.addInputSupport(OV_TypeId_CovarianceMatrix); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_OVCSVFileWriterDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/openvibe/ovpCBoxAlgorithmGenericStreamReader.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/openvibe/ovpCBoxAlgorithmGenericStreamReader.cpp new file mode 100755 index 0000000..7e435bd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/openvibe/ovpCBoxAlgorithmGenericStreamReader.cpp @@ -0,0 +1,268 @@ +#include "ovpCBoxAlgorithmGenericStreamReader.h" + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +CBoxAlgorithmGenericStreamReader::CBoxAlgorithmGenericStreamReader() : m_reader(*this) {} +uint64_t CBoxAlgorithmGenericStreamReader::getClockFrequency() { return 128LL << 32; } // the box clock frequency + +bool CBoxAlgorithmGenericStreamReader::initialize() +{ + m_filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_pending = false; + m_streamIdxToOutputIdxs.clear(); + m_streamIdxToTypeIDs.clear(); + + return true; +} + +bool CBoxAlgorithmGenericStreamReader::uninitialize() +{ + if (m_file) + { + fclose(m_file); + m_file = nullptr; + } + + return true; +} + +bool CBoxAlgorithmGenericStreamReader::initializeFile() +{ + m_file = FS::Files::open(m_filename.toASCIIString(), "rb"); + + OV_ERROR_UNLESS_KRF(m_file, "Error opening file [" << m_filename << "] for reading", Kernel::ErrorType::BadFileRead); + + return true; +} + +bool CBoxAlgorithmGenericStreamReader::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} + +bool CBoxAlgorithmGenericStreamReader::process() +{ + if (m_file == nullptr) { if (!initializeFile()) { return false; } } + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getOutputCount(); + const uint64_t time = this->getPlayerContext().getCurrentTime(); + bool finished = false; + + while (!finished && (!feof(m_file) || m_pending)) + { + if (m_pending) + { + if (m_endTime <= time) + { + OV_ERROR_UNLESS_KRF(m_outputIdx < nInput, + "Stream index " << m_outputIdx << " can not be output from this box because it does not have enough outputs", + Kernel::ErrorType::BadOutput); + + boxContext.getOutputChunk(m_outputIdx)->append(m_pendingChunk); + boxContext.markOutputAsReadyToSend(m_outputIdx, m_startTime, m_endTime); + m_pending = false; + } + else { finished = true; } + } + else + { + bool justStarted = true; + while (!feof(m_file) && m_reader.getCurrentNodeID() == EBML::CIdentifier()) + { + uint8_t byte; + const size_t s = fread(&byte, sizeof(uint8_t), 1, m_file); + + OV_ERROR_UNLESS_KRF(s == 1 || justStarted, "Unexpected EOF in " << m_filename, Kernel::ErrorType::BadParsing); + + m_reader.processData(&byte, sizeof(byte)); + justStarted = false; + } + if (!feof(m_file) && m_reader.getCurrentNodeSize() != 0) + { + m_swap.setSize(m_reader.getCurrentNodeSize(), true); + const size_t s = size_t(fread(m_swap.getDirectPointer(), sizeof(uint8_t), size_t(m_swap.getSize()), m_file)); + + OV_ERROR_UNLESS_KRF(s == m_swap.getSize(), "Unexpected EOF in " << m_filename, Kernel::ErrorType::BadParsing); + + m_pendingChunk.setSize(0, true); + m_startTime = std::numeric_limits::max(); + m_endTime = std::numeric_limits::max(); + m_outputIdx = std::numeric_limits::max(); + + m_reader.processData(m_swap.getDirectPointer(), m_swap.getSize()); + } + } + } + + return true; +} + +bool CBoxAlgorithmGenericStreamReader::isMasterChild(const EBML::CIdentifier& identifier) +{ + if (identifier == EBML_Identifier_Header) { return true; } + if (identifier == OVP_NodeId_OpenViBEStream_Header) { return true; } + if (identifier == OVP_NodeId_OpenViBEStream_Header_Compression) { return false; } + if (identifier == OVP_NodeId_OpenViBEStream_Header_StreamType) { return false; } + if (identifier == OVP_NodeId_OpenViBEStream_Buffer) { return true; } + if (identifier == OVP_NodeId_OpenViBEStream_Buffer_StreamIndex) { return false; } + if (identifier == OVP_NodeId_OpenViBEStream_Buffer_StartTime) { return false; } + if (identifier == OVP_NodeId_OpenViBEStream_Buffer_EndTime) { return false; } + if (identifier == OVP_NodeId_OpenViBEStream_Buffer_Content) { return false; } + return false; +} + +void CBoxAlgorithmGenericStreamReader::openChild(const EBML::CIdentifier& identifier) +{ + m_nodes.push(identifier); + + EBML::CIdentifier& top = m_nodes.top(); + + if (top == EBML_Identifier_Header) { m_hasEBMLHeader = true; } + if (top == OVP_NodeId_OpenViBEStream_Header) + { + if (!m_hasEBMLHeader) + { + this->getLogManager() << Kernel::LogLevel_Info << "The file " << m_filename << " uses an outdated (but still compatible) version of the .ov file format\n"; + } + } + if (top == OVP_NodeId_OpenViBEStream_Header) + { + m_streamIdxToOutputIdxs.clear(); + m_streamIdxToTypeIDs.clear(); + } +} + +void CBoxAlgorithmGenericStreamReader::processChildData(const void* buffer, const size_t size) +{ + EBML::CIdentifier& top = m_nodes.top(); + + // Uncomment this when ebml version will be used + //if(top == EBML_Identifier_EBMLVersion) { const uint64_t versionNumber=(uint64_t)m_readerHelper.getUInt(buffer, size); } + + if (top == OVP_NodeId_OpenViBEStream_Header_Compression) + { + if (m_readerHelper.getUInt(buffer, size) != 0) { OV_WARNING_K("Impossible to use compression as it is not yet implemented"); } + } + if (top == OVP_NodeId_OpenViBEStream_Header_StreamType) { m_streamIdxToTypeIDs[m_streamIdxToTypeIDs.size()] = m_readerHelper.getUInt(buffer, size); } + + if (top == OVP_NodeId_OpenViBEStream_Buffer_StreamIndex) + { + const size_t streamIdx = size_t(m_readerHelper.getUInt(buffer, size)); + if (m_streamIdxToTypeIDs.find(streamIdx) != m_streamIdxToTypeIDs.end()) { m_outputIdx = m_streamIdxToOutputIdxs[streamIdx]; } + } + if (top == OVP_NodeId_OpenViBEStream_Buffer_StartTime) { m_startTime = m_readerHelper.getUInt(buffer, size); } + if (top == OVP_NodeId_OpenViBEStream_Buffer_EndTime) { m_endTime = m_readerHelper.getUInt(buffer, size); } + if (top == OVP_NodeId_OpenViBEStream_Buffer_Content) + { + m_pendingChunk.setSize(0, true); + m_pendingChunk.append(reinterpret_cast(buffer), size); + } +} + +void CBoxAlgorithmGenericStreamReader::closeChild() +{ + EBML::CIdentifier& top = m_nodes.top(); + + if (top == OVP_NodeId_OpenViBEStream_Header) + { + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + + std::map outputIndexToStreamIdx; + + bool lostStreams = false; + bool lastOutputs = false; + + // Go on each stream of the file + for (auto it = m_streamIdxToTypeIDs.begin(); it != m_streamIdxToTypeIDs.end(); ++it) + { + CIdentifier typeID; + size_t index = std::numeric_limits::max(); + + // Find the first box output with this type that has no file stream connected + for (size_t i = 0; i < boxContext.getOutputCount() && index == std::numeric_limits::max(); ++i) + { + if (boxContext.getOutputType(i, typeID)) + { + if (outputIndexToStreamIdx.find(i) == outputIndexToStreamIdx.end()) + { + if (typeID == it->second) + { + //const CString typeName = this->getTypeManager().getTypeName(it->second); + index = i; + } + } + } + } + + // In case no suitable output was found, see if we can downcast some type + for (size_t i = 0; i < boxContext.getOutputCount() && index == std::numeric_limits::max(); ++i) + { + if (boxContext.getOutputType(i, typeID)) + { + if (outputIndexToStreamIdx.find(i) == outputIndexToStreamIdx.end()) + { + if (this->getTypeManager().isDerivedFromStream(it->second, typeID)) + { + const CString srcTypeName = this->getTypeManager().getTypeName(it->second); + const CString dstTypeName = this->getTypeManager().getTypeName(typeID); + this->getLogManager() << Kernel::LogLevel_Info << "Note: downcasting output " << i + 1 << " from " << srcTypeName + << " to " << dstTypeName << ", as there is no exactly type-matching output connector.\n"; + index = i; + } + } + } + } + + // In case it was not found + if (index == std::numeric_limits::max()) + { + CString typeName = this->getTypeManager().getTypeName(it->second); + + OV_WARNING_K("No free output connector for stream " << it->first << " of type " << it->second << " (" << typeName << ")"); + + m_streamIdxToOutputIdxs[it->first] = std::numeric_limits::max(); + lostStreams = true; + } + else + { + m_streamIdxToOutputIdxs[it->first] = index; + outputIndexToStreamIdx[index] = it->first; + } + } + + // Warns for output with no stream connected to them + for (size_t i = 0; i < boxContext.getOutputCount(); ++i) + { + if (outputIndexToStreamIdx.find(i) == outputIndexToStreamIdx.end()) + { + OV_WARNING_K("No stream candidate in file for output " << i+1); + lastOutputs = true; + } + } + + // When both outputs and streams were lost, there most probably was a damn mistake + OV_ERROR_UNLESS_KRV(!lastOutputs || !lostStreams, "Invalid configuration: missing output for stream(s) and missing stream for output(s)", + Kernel::ErrorType::BadConfig); + } + + if (top == OVP_NodeId_OpenViBEStream_Buffer) + { + m_pending = ((m_outputIdx != std::numeric_limits::max()) && + (m_startTime != std::numeric_limits::max()) && + (m_endTime != std::numeric_limits::max())); + } + + m_nodes.pop(); +} + +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/openvibe/ovpCBoxAlgorithmGenericStreamReader.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/openvibe/ovpCBoxAlgorithmGenericStreamReader.h new file mode 100644 index 0000000..7d702d9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/openvibe/ovpCBoxAlgorithmGenericStreamReader.h @@ -0,0 +1,135 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +#include +#include + +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +class CBoxAlgorithmGenericStreamReader final : public Toolkit::TBoxAlgorithm, public EBML::IReaderCallback +{ +public: + + CBoxAlgorithmGenericStreamReader(); + void release() override { delete this; } + uint64_t getClockFrequency() override; + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_GenericStreamReader) + + +protected: + + CString m_filename; + + EBML::CReader m_reader; + EBML::CReaderHelper m_readerHelper; + + CMemoryBuffer m_swap; + CMemoryBuffer m_pendingChunk; + uint64_t m_startTime = 0; + uint64_t m_endTime = 0; + size_t m_outputIdx = 0; + bool m_pending = false; + bool m_hasEBMLHeader = false; + + FILE* m_file = nullptr; + std::stack m_nodes; + std::map m_streamIdxToOutputIdxs; + std::map m_streamIdxToTypeIDs; + +private: + bool initializeFile(); + bool isMasterChild(const EBML::CIdentifier& identifier) override; + void openChild(const EBML::CIdentifier& identifier) override; + void processChildData(const void* buffer, const size_t size) override; + void closeChild() override; +}; + +class CBoxAlgorithmGenericStreamReaderListener final : public Toolkit::TBoxListener +{ +public: + + bool check(Kernel::IBox& box) const + { + for (size_t i = 0; i < box.getOutputCount(); ++i) { box.setOutputName(i, ("Output stream " + std::to_string(i + 1)).c_str()); } + return true; + } + + bool onDefaultInitialized(Kernel::IBox& box) override + { + box.setOutputName(0, "Output Signal"); + box.setOutputType(0, OV_TypeId_Signal); + box.addOutput("Output Stimulations", OV_TypeId_Stimulations); + return true; + } + + bool onOutputAdded(Kernel::IBox& box, const size_t index) override + { + box.setOutputType(index, OV_TypeId_EBMLStream); + this->check(box); + return true; + } + + bool onOutputRemoved(Kernel::IBox& box, const size_t /*index*/) override + { + this->check(box); + return true; + } + + bool onOutputTypeChanged(Kernel::IBox& box, const size_t /*index*/) override + { + this->check(box); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmGenericStreamReaderDesc final : virtual public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Generic stream reader"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Reads OpenViBE streams saved in the .ov format"); } + + CString getDetailedDescription() const override { return CString("Generic Stream Writer box can be used to store data in the format read by this box"); } + + CString getCategory() const override { return CString("File reading and writing/OpenViBE"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_GenericStreamReader; } + IPluginObject* create() override { return new CBoxAlgorithmGenericStreamReader; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmGenericStreamReaderListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addOutput("Output stream 1", OV_TypeId_EBMLStream); + prototype.addSetting("Filename", OV_TypeId_Filename, ""); + prototype.addFlag(Kernel::BoxFlag_CanAddOutput); + prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_GenericStreamReaderDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/openvibe/ovpCBoxAlgorithmGenericStreamWriter.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/openvibe/ovpCBoxAlgorithmGenericStreamWriter.cpp new file mode 100644 index 0000000..b0894bc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/openvibe/ovpCBoxAlgorithmGenericStreamWriter.cpp @@ -0,0 +1,127 @@ +#include "ovpCBoxAlgorithmGenericStreamWriter.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +CBoxAlgorithmGenericStreamWriter::CBoxAlgorithmGenericStreamWriter() : m_writer(*this) {} + +bool CBoxAlgorithmGenericStreamWriter::initialize() +{ + m_filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + const bool compression = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + if (compression) { OV_WARNING_K("Impossible to use compression as it is not yet implemented"); } + + return true; +} + +bool CBoxAlgorithmGenericStreamWriter::uninitialize() +{ + if (m_file.is_open()) { m_file.close(); } + return true; +} + +bool CBoxAlgorithmGenericStreamWriter::generateFileHeader() +{ + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + + m_swap.setSize(0, true); + + m_writerHelper.connect(&m_writer); + + m_writerHelper.openChild(EBML_Identifier_Header); + m_writerHelper.openChild(EBML_Identifier_DocType); + m_writerHelper.setStr("OpenViBE_Stream_File"); + m_writerHelper.closeChild(); + + m_writerHelper.openChild(EBML_Identifier_EBMLVersion); + m_writerHelper.setUInt(1); + m_writerHelper.closeChild(); + + m_writerHelper.openChild(EBML_Identifier_EBMLIdLength); + m_writerHelper.setUInt(10); + m_writerHelper.closeChild(); + m_writerHelper.closeChild(); + + m_writerHelper.openChild(OVP_NodeId_OpenViBEStream_Header); + m_writerHelper.openChild(OVP_NodeId_OpenViBEStream_Header_Compression); + m_writerHelper.setUInt(0 /* compression flag */); + m_writerHelper.closeChild(); + for (size_t i = 0; i < boxContext.getInputCount(); ++i) + { + CIdentifier id; + boxContext.getInputType(i, id); + + m_writerHelper.openChild(OVP_NodeId_OpenViBEStream_Header_StreamType); + m_writerHelper.setUInt(id.id()); + m_writerHelper.closeChild(); + } + m_writerHelper.closeChild(); + m_writerHelper.disconnect(); + + FS::Files::openOFStream(m_file, m_filename.toASCIIString(), std::ios::binary | std::ios::trunc); + + OV_ERROR_UNLESS_KRF(m_file.good(), "Error opening file [" << m_filename << "] for writing", Kernel::ErrorType::BadFileWrite); + + m_file.write(reinterpret_cast(m_swap.getDirectPointer()), std::streamsize(m_swap.getSize())); + + m_isHeaderGenerate = true; + return true; +} + +bool CBoxAlgorithmGenericStreamWriter::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmGenericStreamWriter::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + if (!m_isHeaderGenerate) { if (!generateFileHeader()) { return false; } } + + m_swap.setSize(0, true); + + for (size_t i = 0; i < nInput; ++i) + { + for (size_t j = 0; j < boxContext.getInputChunkCount(i); ++j) + { + m_writerHelper.connect(&m_writer); + m_writerHelper.openChild(OVP_NodeId_OpenViBEStream_Buffer); + m_writerHelper.openChild(OVP_NodeId_OpenViBEStream_Buffer_StreamIndex); + m_writerHelper.setUInt(i); + m_writerHelper.closeChild(); + m_writerHelper.openChild(OVP_NodeId_OpenViBEStream_Buffer_StartTime); + m_writerHelper.setUInt(boxContext.getInputChunkStartTime(i, j)); + m_writerHelper.closeChild(); + m_writerHelper.openChild(OVP_NodeId_OpenViBEStream_Buffer_EndTime); + m_writerHelper.setUInt(boxContext.getInputChunkEndTime(i, j)); + m_writerHelper.closeChild(); + m_writerHelper.openChild(OVP_NodeId_OpenViBEStream_Buffer_Content); + m_writerHelper.setBinary(boxContext.getInputChunk(i, j)->getDirectPointer(), boxContext.getInputChunk(i, j)->getSize()); + m_writerHelper.closeChild(); + m_writerHelper.closeChild(); + m_writerHelper.disconnect(); + boxContext.markInputAsDeprecated(i, j); + } + } + + if (m_swap.getSize() != 0) + { + m_file.write(reinterpret_cast(m_swap.getDirectPointer()), std::streamsize(m_swap.getSize())); + OV_ERROR_UNLESS_KRF(m_file.good(), "Error opening file [" << m_filename << "] for writing", Kernel::ErrorType::BadFileWrite); + } + + return true; +} + +void CBoxAlgorithmGenericStreamWriter::write(const void* buffer, const size_t size) { m_swap.append(reinterpret_cast(buffer), size); } + +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/openvibe/ovpCBoxAlgorithmGenericStreamWriter.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/openvibe/ovpCBoxAlgorithmGenericStreamWriter.h new file mode 100644 index 0000000..325ed0e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/openvibe/ovpCBoxAlgorithmGenericStreamWriter.h @@ -0,0 +1,125 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +#include +#include + +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +class CBoxAlgorithmGenericStreamWriter final : public Toolkit::TBoxAlgorithm, public EBML::IWriterCallback +{ +public: + + CBoxAlgorithmGenericStreamWriter(); + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + bool generateFileHeader(); + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_GenericStreamWriter) + +protected: + + bool m_isHeaderGenerate = false; + CString m_filename; + EBML::CWriter m_writer; + EBML::CWriterHelper m_writerHelper; + +private: + void write(const void* buffer, const size_t size) override; + + CMemoryBuffer m_swap; + std::ofstream m_file; +}; + +class CBoxAlgorithmGenericStreamWriterListener final : public Toolkit::TBoxListener +{ +public: + + //it seems the only purpose of the check was to give a name when adding an input + //without it, the input configuration dialog display random characters in the name field + //the check is unnecessary when removing/changing inputs and on already named inputs + bool check(Kernel::IBox& box) + { + const size_t i = box.getInputCount() - 1; + //only check last input (we assume previous inputs have benn named, how could they not?) + box.setInputName(i, ("Input stream " + std::to_string(i + 1)).c_str()); + //for (i=0; icheck(box); + return true; + } + + bool onInputRemoved(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + //this->check(box); + return true; + } + + bool onInputTypeChanged(Kernel::IBox& /*box*/, const size_t /*index*/) override + { + //this->check(box); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmGenericStreamWriterDesc final : virtual public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Generic stream writer"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Writes any number of streams into an .ov file"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("File reading and writing/OpenViBE"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_GenericStreamWriter; } + IPluginObject* create() override { return new CBoxAlgorithmGenericStreamWriter; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmGenericStreamWriterListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input stream 1", OV_TypeId_EBMLStream); + prototype.addSetting("Filename", OV_TypeId_Filename, "record-[$core{date}-$core{time}].ov"); + prototype.addSetting("Use compression", OV_TypeId_Boolean, "false"); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_GenericStreamWriterDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmElectrodeLocalizationFileReader.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmElectrodeLocalizationFileReader.cpp new file mode 100644 index 0000000..0ce1602 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmElectrodeLocalizationFileReader.cpp @@ -0,0 +1,125 @@ +#include "ovpCBoxAlgorithmElectrodeLocalizationFileReader.h" + +#include "../algorithms/ovpCAlgorithmOVMatrixFileReader.h" + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +uint64_t CBoxAlgorithmElectrodeLocalisationFileReader::getClockFrequency() { return uint64_t(1LL) << 32; } + +bool CBoxAlgorithmElectrodeLocalisationFileReader::initialize() +{ + m_headerSent = false; + m_bufferSent = false; + + // Creates algorithms + m_pOVMatrixFileReader = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_OVMatrixFileReader)); + m_encoder = new Toolkit::TChannelLocalisationEncoder; + m_pOVMatrixFileReader->initialize(); + m_encoder->initialize(*this, 0); + + //* + // OVMatrix file reader parameters + Kernel::TParameterHandler ip_sFilename(m_pOVMatrixFileReader->getInputParameter(OVP_Algorithm_OVMatrixFileReader_InputParameterId_Filename)); + /* + Kernel::TParameterHandler op_pMatrix(m_pOVMatrixFileReader->getOutputParameter(OVP_Algorithm_OVMatrixFileReader_OutputParameterId_Matrix)); + // Channel localisation parameters + Kernel::TParameterHandler ip_bDynamic(m_encoder->getInputParameter(OVP_GD_Algorithm_ChannelLocalisationEncoder_InputParameterId_Dynamic)); + Kernel::TParameterHandler ip_pMatrix(m_encoder->getInputParameter(OVP_GD_Algorithm_ChannelLocalisationEncoder_InputParameterId_Matrix)); + + // Configure parameters + + ip_bDynamic = false; + ip_pMatrix.setReferenceTarget(op_pMatrix); + //*/ + + m_encoder->getInputDynamic() = false; + + // Configures settings according to box + m_filename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + *ip_sFilename = m_filename; + + return true; +} + +bool CBoxAlgorithmElectrodeLocalisationFileReader::uninitialize() +{ + //m_pOVMatrixFileReader->process(OVP_Algorithm_OVMatrixFileReader_InputTriggerId_Close); + + + m_pOVMatrixFileReader->uninitialize(); + getAlgorithmManager().releaseAlgorithm(*m_pOVMatrixFileReader); + + if (m_encoder) + { + m_encoder->uninitialize(); + delete m_encoder; + } + + return true; +} + +bool CBoxAlgorithmElectrodeLocalisationFileReader::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmElectrodeLocalisationFileReader::process() +{ + if (m_headerSent == true && m_bufferSent == true) { return true; } + + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + // Channel localisation stream encoder parameters + Kernel::TParameterHandler op_pMatrix(m_pOVMatrixFileReader->getOutputParameter(OVP_Algorithm_OVMatrixFileReader_OutputParameterId_Matrix)); + + m_pOVMatrixFileReader->process(/*OVP_Algorithm_OVMatrixFileReader_InputTriggerId_Next*/); + + //ensure matrix is 2 dimensional and that dimension sizes are correct + OV_ERROR_UNLESS_KRF(op_pMatrix->getDimensionCount() == 2 && op_pMatrix->getDimensionSize(1) == 3, + "Wrong format for electrode localisation matrix loaded from file " << m_filename, Kernel::ErrorType::BadParsing); + + if (m_headerSent == false) + { + // Connects parameters to memory buffer + //op_channelLocalisationMemoryBuffer = boxContext.getOutputChunk(0); + + //open file and load matrix dimensions + // m_pOVMatrixFileReader->process(OVP_Algorithm_BrainampFileReader_InputTriggerId_Open); + + // Produces header + CMatrix* iMatrix = m_encoder->getInputMatrix(); + iMatrix->copy(*op_pMatrix); + + m_encoder->encodeHeader(); + + // Sends header + boxContext.markOutputAsReadyToSend(0, 0, 0); + + m_headerSent = true; + } + + if (m_bufferSent == false /*&& + m_pOVMatrixFileReader->isOutputTriggerActive(OVP_Algorithm_OVMatrixFileReader_OutputTriggerId_DataProduced)*/) + { + // Connects parameters to memory buffer + CMatrix* iMatrix = m_encoder->getInputMatrix(); + iMatrix->copy(*op_pMatrix); + + // Produces buffer + m_encoder->encodeBuffer(); + + // Sends buffer + boxContext.markOutputAsReadyToSend(0, 0/*op_CurrentStartTime*/, 0/*op_CurrentEndTime*/); + + m_bufferSent = true; + } + + return true; +} + +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmElectrodeLocalizationFileReader.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmElectrodeLocalizationFileReader.h new file mode 100644 index 0000000..314d54f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmElectrodeLocalizationFileReader.h @@ -0,0 +1,66 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { +class CBoxAlgorithmElectrodeLocalisationFileReader final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + uint64_t getClockFrequency() override; + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_ElectrodeLocalisationFileReader) + +protected: + + Kernel::IAlgorithmProxy* m_pOVMatrixFileReader = nullptr; + Toolkit::TChannelLocalisationEncoder* m_encoder = nullptr; + + CString m_filename; + bool m_headerSent = false; + bool m_bufferSent = false; +}; + +class CBoxAlgorithmElectrodeLocalisationFileReaderDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Electrode localisation file reader"); } + CString getAuthorName() const override { return CString("Vincent Delannoy"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + + CString getShortDescription() const override { return CString("Loads files containing the normalized coordinates of an electrode set"); } + + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("File reading and writing/OpenViBE"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ElectrodeLocalisationFileReader; } + IPluginObject* create() override { return new CBoxAlgorithmElectrodeLocalisationFileReader; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + // Adds box outputs + prototype.addOutput("Channel localisation", OV_TypeId_ChannelLocalisation); + + // Adds settings + prototype.addSetting("Filename", OV_TypeId_Filename, ""); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ElectrodeLocalisationFileReaderDesc) +}; +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/ovp_defines.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/ovp_defines.h new file mode 100644 index 0000000..1870b27 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/ovp_defines.h @@ -0,0 +1,56 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_Algorithm_OVMatrixFileReader OpenViBE::CIdentifier(0x10661A33, 0x0B0F44A7) +#define OVP_ClassId_Algorithm_OVMatrixFileReaderDesc OpenViBE::CIdentifier(0x0E873B5E, 0x0A287FCB) +#define OVP_ClassId_Algorithm_OVMatrixFileWriter OpenViBE::CIdentifier(0x739158FC, 0x1E8240CC) +#define OVP_ClassId_Algorithm_OVMatrixFileWriterDesc OpenViBE::CIdentifier(0x44CF6DD0, 0x329D47F9) +#define OVP_ClassId_Algorithm_XMLScenarioExporter OpenViBE::CIdentifier(0x53693531, 0xB136CF3F) +#define OVP_ClassId_Algorithm_XMLScenarioExporterDesc OpenViBE::CIdentifier(0x9709C9FA, 0xF126F74E) +#define OVP_ClassId_Algorithm_XMLScenarioImporter OpenViBE::CIdentifier(0xE80C3EA2, 0x149C4A05) +#define OVP_ClassId_Algorithm_XMLScenarioImporterDesc OpenViBE::CIdentifier(0xFF25D456, 0x721FCC57) +#define OVP_ClassId_BoxAlgorithm_CSVFileReaderDesc OpenViBE::CIdentifier(0x193F22E9, 0x26A67233) +#define OVP_ClassId_BoxAlgorithm_CSVFileReader OpenViBE::CIdentifier(0x641D0717, 0x02884107) +#define OVP_ClassId_BoxAlgorithm_CSVFileWriter OpenViBE::CIdentifier(0x2C9312F1, 0x2D6613E5) +#define OVP_ClassId_BoxAlgorithm_CSVFileWriterDesc OpenViBE::CIdentifier(0x65075FF7, 0x2B555E97) +#define OVP_ClassId_BoxAlgorithm_ElectrodeLocalisationFileReader OpenViBE::CIdentifier(0x40704155, 0x19C50E8F) +#define OVP_ClassId_BoxAlgorithm_ElectrodeLocalisationFileReaderDesc OpenViBE::CIdentifier(0x4796613F, 0x653A48D5) +#define OVP_ClassId_BoxAlgorithm_GenericStreamReader OpenViBE::CIdentifier(0x6468099F, 0x0370095A) +#define OVP_ClassId_BoxAlgorithm_GenericStreamReaderDesc OpenViBE::CIdentifier(0x1F1E3A53, 0x6CA07237) +#define OVP_ClassId_BoxAlgorithm_GenericStreamWriter OpenViBE::CIdentifier(0x09C92218, 0x7C1216F8) +#define OVP_ClassId_BoxAlgorithm_GenericStreamWriterDesc OpenViBE::CIdentifier(0x50AB506A, 0x54804437) +#define OVP_ClassId_BoxAlgorithm_OVCSVFileReader OpenViBE::CIdentifier(0x336A3D9A, 0x753F1BA4) +#define OVP_ClassId_BoxAlgorithm_OVCSVFileReaderDesc OpenViBE::CIdentifier(0x584E1948, 0x65E91650) +#define OVP_ClassId_BoxAlgorithm_OVCSVFileWriter OpenViBE::CIdentifier(0x428375E8, 0x325F2DB9) +#define OVP_ClassId_BoxAlgorithm_OVCSVFileWriterDesc OpenViBE::CIdentifier(0x4B5C1D8F, 0x570E45FD) + +// Type definitions +//--------------------------------------------------------------------------------------------------- +#define OVP_NodeId_OpenViBEStream_Header EBML::CIdentifier(0xF59505AB, 0x3684C8D8) +#define OVP_NodeId_OpenViBEStream_Header_Compression EBML::CIdentifier(0x40358769, 0x166380D1) +#define OVP_NodeId_OpenViBEStream_Header_StreamType EBML::CIdentifier(0x732EC1D1, 0xFE904087) +#define OVP_NodeId_OpenViBEStream_Header_ChannelType OVP_NodeId_OpenViBEStream_Header_StreamType // deprecated old name +#define OVP_NodeId_OpenViBEStream_Buffer EBML::CIdentifier(0x2E60AD18, 0x87A29BDF) +#define OVP_NodeId_OpenViBEStream_Buffer_StreamIndex EBML::CIdentifier(0x30A56D8A, 0xB9C12238) +#define OVP_NodeId_OpenViBEStream_Buffer_ChannelIndex OVP_NodeId_OpenViBEStream_Buffer_StreamIndex // deprecated old name +#define OVP_NodeId_OpenViBEStream_Buffer_StartTime EBML::CIdentifier(0x093E6A0A, 0xC5A9467B) +#define OVP_NodeId_OpenViBEStream_Buffer_EndTime EBML::CIdentifier(0x8B5CCCD9, 0xC5024F29) +#define OVP_NodeId_OpenViBEStream_Buffer_Content EBML::CIdentifier(0x8D4B0BE8, 0x7051265C) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + + +#define OVP_Algorithm_OVMatrixFileReader_InputParameterId_Filename OpenViBE::CIdentifier(0x28F87B29, 0x0B09737E) +#define OVP_Algorithm_OVMatrixFileReader_OutputParameterId_Matrix OpenViBE::CIdentifier(0x2F9521E0, 0x027D789F) +#define OVP_Algorithm_OVMatrixFileReader_InputTriggerId_Open OpenViBE::CIdentifier(0x2F996376, 0x2A942485) +#define OVP_Algorithm_OVMatrixFileReader_InputTriggerId_Load OpenViBE::CIdentifier(0x22841807, 0x102D681C) +#define OVP_Algorithm_OVMatrixFileReader_InputTriggerId_Close OpenViBE::CIdentifier(0x7FDE77DA, 0x384A0B3D) +#define OVP_Algorithm_OVMatrixFileReader_OutputTriggerId_Error OpenViBE::CIdentifier(0x6D4F2F4B, 0x05EC6CB9) +#define OVP_Algorithm_OVMatrixFileReader_OutputTriggerId_DataProduced OpenViBE::CIdentifier(0x76F46051, 0x003B6FE8) +#define OVP_Algorithm_OVMatrixFileWriter_InputParameterId_Filename OpenViBE::CIdentifier(0x330D2D0B, 0x175271E6) +#define OVP_Algorithm_OVMatrixFileWriter_InputParameterId_Matrix OpenViBE::CIdentifier(0x6F6402EE, 0x493044F3) diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/ovp_main.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/ovp_main.cpp new file mode 100644 index 0000000..1e3ef42 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/file-io/src/ovp_main.cpp @@ -0,0 +1,52 @@ +#include "ovp_defines.h" + +#include "algorithms/ovpCAlgorithmOVMatrixFileReader.h" +#include "algorithms/ovpCAlgorithmOVMatrixFileWriter.h" + +#include "algorithms/xml-scenario/ovpCAlgorithmXMLScenarioExporter.h" +#include "algorithms/xml-scenario/ovpCAlgorithmXMLScenarioImporter.h" + +#include "box-algorithms/csv/ovpCBoxAlgorithmCSVFileWriter.h" +#include "box-algorithms/csv/ovpCBoxAlgorithmCSVFileReader.h" + +#include "box-algorithms/openvibe/ovpCBoxAlgorithmGenericStreamReader.h" +#include "box-algorithms/openvibe/ovpCBoxAlgorithmGenericStreamWriter.h" + +#include "box-algorithms/ovpCBoxAlgorithmElectrodeLocalizationFileReader.h" + +#include "box-algorithms/csv/ovpCBoxAlgorithmOVCSVFileWriter.h" +#include "box-algorithms/csv/ovpCBoxAlgorithmOVCSVFileReader.h" + +namespace OpenViBE { +namespace Plugins { +namespace FileIO { + +OVP_Declare_Begin() + OVP_Declare_New(CAlgorithmOVMatrixFileReaderDesc) + OVP_Declare_New(CAlgorithmOVMatrixFileWriterDesc) + + OVP_Declare_New(CAlgorithmXMLScenarioExporterDesc) + OVP_Declare_New(CAlgorithmXMLScenarioImporterDesc) + + OVP_Declare_New(CBoxAlgorithmCSVFileWriterDesc) + OVP_Declare_New(CBoxAlgorithmCSVFileReaderDesc) + + OVP_Declare_New(CBoxAlgorithmGenericStreamReaderDesc) + OVP_Declare_New(CBoxAlgorithmGenericStreamWriterDesc) + + OVP_Declare_New(CBoxAlgorithmElectrodeLocalisationFileReaderDesc) + + OVP_Declare_New(CBoxAlgorithmOVCSVFileWriterDesc) + OVP_Declare_New(CBoxAlgorithmOVCSVFileReaderDesc) + + context.getScenarioManager().registerScenarioImporter(OV_ScenarioImportContext_SchedulerMetaboxImport, ".mxb", OVP_ClassId_Algorithm_XMLScenarioImporter); + context.getScenarioManager().registerScenarioImporter(OV_ScenarioImportContext_SchedulerMetaboxImport, ".xml", OVP_ClassId_Algorithm_XMLScenarioImporter); + context.getConfigurationManager().createConfigurationToken("ScenarioFileNameExtension.xml", "OpenViBE XML Scenario"); + context.getConfigurationManager().createConfigurationToken("ScenarioFileNameExtension.mxs", "Mensia XML Scenario"); + context.getConfigurationManager().createConfigurationToken("ScenarioFileNameExtension.mxb", "Mensia XML Component"); + +OVP_Declare_End() + +} // namespace FileIO +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/CMakeLists.txt new file mode 100644 index 0000000..e5276a2 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/CMakeLists.txt @@ -0,0 +1,44 @@ +PROJECT(openvibe-plugins-sdk-signal-processing) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl) +INCLUDE("FindSourceDependencyWavelib") +INCLUDE("FindSourceRCProperties") +INCLUDE("FindSourceDependencyDSPFilters") +INCLUDE("FindSourceDependencyR8Brain") +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindThirdPartyBoost") +INCLUDE("FindThirdPartyEigen") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials) + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/box-tutorials/channel-selector.mxs b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/box-tutorials/channel-selector.mxs new file mode 100644 index 0000000..41a7e68 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/box-tutorials/channel-selector.mxs @@ -0,0 +1,472 @@ + + 1 + OpenVIBE + 0.2.99 + + + + + + (0x0000478e, 0x000023b0) + Continuous Oscilloscope - All Channels + (0x0842bcd1, 0xd53c1c89) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 176 + + + (0x4e7b798a, 0x183beafb) + (0x35390ab5, 0x7b926078) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000478e, 0x000023b1) + Continuous Oscilloscope - 1st and 4th + (0x0842bcd1, 0xd53c1c89) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 0.1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x4e7b798a, 0x183beafb) + (0x35390ab5, 0x7b926078) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2fd52ae0, 0x1b328bca) + Sinus oscillator + (0x7e33bdb8, 0x68194a4a) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 304 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00f4f93b) + + + + + (0x7f7581af, 0x105dc85a) + Channel Selector + (0x361722e8, 0x311574e8) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x79a9edeb, 0x245d83fc) + Channel List + - + 1;4 + false + + + (0x3bcf9e67, 0x0c23994d) + Action + Select + Select + false + + + (0x666f25e9, 0x3e5738d6) + Channel Matching Method + Smart + Smart + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 192 + + + (0x207c9054, 0x3c841b63) + 368 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x277826e1, 0xa30a3bd0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00001b0a, 0x0000298c) + + (0x2fd52ae0, 0x1b328bca) + 0 + + + (0x0000478e, 0x000023b0) + 0 + + + + (0x0000411f, 0x00002266) + + (0x7f7581af, 0x105dc85a) + 0 + + + (0x0000478e, 0x000023b1) + 0 + + + + (0x0aedc529, 0x0f063868) + + (0x2fd52ae0, 0x1b328bca) + 0 + + + (0x7f7581af, 0x105dc85a) + 0 + + + + + + (0x13d53040, 0x7cf98040) + The <i><b>Channel Selector</b></i> box takes only +the <b>first</b> and <b>fourth</b> channel + + + (0x473d9a43, 0x97fc0a97) + 608 + + + (0x7234b86b, 0x2b8651a5) + 192 + + + + + (0x36543bdd, 0x0ac76412) + Finally, the right <i>Continuous Oscilloscope</i> box +displays the 2 selected channels + + + (0x473d9a43, 0x97fc0a97) + 624 + + + (0x7234b86b, 0x2b8651a5) + 272 + + + + + (0x3ce87297, 0x1174114b) + Those 4 channels are displayed in the left +<i>Continuous Oscilloscope</i> box + + + (0x473d9a43, 0x97fc0a97) + 608 + + + (0x7234b86b, 0x2b8651a5) + 112 + + + + + (0x49fe67ab, 0x300e3f94) + The <i>Sinus Oscillator</i> box generates +a 4 channels sinusoidal signal + + + (0x473d9a43, 0x97fc0a97) + 592 + + + (0x7234b86b, 0x2b8651a5) + 32 + + + + + (0x5d643115, 0x6ebb4527) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 464 + + + (0x7234b86b, 0x2b8651a5) + 352 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":678,"identifier":"(0x02b6d4f0, 0x103dc3fd)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":950},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x1722ecef, 0x1695d0b2)","index":0,"name":"Default tab","parentIdentifier":"(0x02b6d4f0, 0x103dc3fd)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":463,"identifier":"(0x00004bd5, 0x00001389)","index":0,"maxDividerPosition":930,"name":"Horizontal split","parentIdentifier":"(0x1722ecef, 0x1695d0b2)","type":5},{"boxIdentifier":"(0x0000478e, 0x000023b0)","childCount":0,"identifier":"(0x00002c70, 0x000006ef)","index":0,"parentIdentifier":"(0x00004bd5, 0x00001389)","type":3},{"boxIdentifier":"(0x0000478e, 0x000023b1)","childCount":0,"identifier":"(0x000048d3, 0x0000443a)","index":1,"parentIdentifier":"(0x00004bd5, 0x00001389)","type":3}] + + + + + (0x4c536d0a, 0xb23dc545) + channel-selector.mxs + + + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/box-tutorials/crop.mxs b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/box-tutorials/crop.mxs new file mode 100644 index 0000000..7fdff0f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/box-tutorials/crop.mxs @@ -0,0 +1,418 @@ + + 1 + OpenVIBE + 0.0.0 + + + + + + (0x00004a0e, 0x000044ab) + Continuous Oscilloscope + (0x0842bcd1, 0xd53c1c89) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0x35390ab5, 0x7b926078) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x4ad3afd2, 0x3cf93093) + Crop + (0x7f1a3002, 0x358117ba) + + + (0x5ba36127, 0x195feae1) + Input matrix + + + + + (0x5ba36127, 0x195feae1) + Output matrix + + + + + (0xd0643f9e, 0x8e35fe0a) + Crop method + Min + Min/Max + false + + + (0x512a166f, 0x5c3ef83f) + Min crop value + -1 + -3.000000 + false + + + (0x512a166f, 0x5c3ef83f) + Max crop value + 1 + 3.000000 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x1b151919, 0x63b9f9c9) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005c9c00) + + + + + (0x4b232ee3, 0x159c74d0) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + 4 * cos(X) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x6863e8d2, 0x76896199) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00903800) + + + + + + + (0x0000194d, 0x000013f5) + + (0x4ad3afd2, 0x3cf93093) + 0 + + + (0x00004a0e, 0x000044ab) + 0 + + + + (0x1a54d7bc, 0x42e57ef8) + + (0x4b232ee3, 0x159c74d0) + 0 + + + (0x4ad3afd2, 0x3cf93093) + 0 + + + + (0x773bfbdd, 0x2c7c62c3) + + (0x6863e8d2, 0x76896199) + 0 + + + (0x4b232ee3, 0x159c74d0) + 0 + + + + + + (0x04e5dcb5, 0x41e96bdc) + The <i><b>Crop</b></i> box cuts the signal +to a minimum of <b>-3</b> and a maximum of +<b>+3</b>. If the signal gets lower to the minimum +or higher to the maximum, the sample value is simply +replaced by the actual minimum or the actual maximum. + + + (0x473d9a43, 0x97fc0a97) + 576 + + + (0x7234b86b, 0x2b8651a5) + 240 + + + + + (0x0805b331, 0x060a1464) + Finally, the <i>Signal Display</i> box +displays the result. + + + (0x473d9a43, 0x97fc0a97) + 576 + + + (0x7234b86b, 0x2b8651a5) + 336 + + + + + (0x0a045ab2, 0x18722620) + The <i>Time Signal</i> box generates +a 1 channel linear signal (<i>f(t)=t</i>) + + + (0x473d9a43, 0x97fc0a97) + 576 + + + (0x7234b86b, 0x2b8651a5) + 48 + + + + + (0x162eb70d, 0x78070223) + The <i>Simple DSP</i> box applies a simple +function to each sample. This function is +<i>4 * cos(X)</i> so the output signal is a +sinusoid in the [-4 +4] range. + + + (0x473d9a43, 0x97fc0a97) + 576 + + + (0x7234b86b, 0x2b8651a5) + 128 + + + + + (0x5d5ce761, 0x1cd484d6) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 480 + + + (0x7234b86b, 0x2b8651a5) + 400 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00004a0e, 0x000044ab)","childCount":0,"identifier":"(0x000020ad, 0x000032d0)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x57071613, 0x5293bfef)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x38bf53e5, 0x226f5320)","index":0,"name":"Default tab","parentIdentifier":"(0x57071613, 0x5293bfef)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x5a0201c7, 0x2a9c34e2)","index":0,"name":"Empty","parentIdentifier":"(0x38bf53e5, 0x226f5320)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/box-tutorials/simple-dsp.mxs b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/box-tutorials/simple-dsp.mxs new file mode 100644 index 0000000..dcfc97e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/box-tutorials/simple-dsp.mxs @@ -0,0 +1,1942 @@ + + 1 + OpenVIBE + 0.0.0 + + + (0x0000007b, 0x00006015) + y = cos(x) /(x+1) * 20 + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + cos(x)/(x+1) * 20 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x1fa963f5, 0x1a638cd4) + 49 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 126 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000004f0, 0x00002045) + y = cos(x) + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + cos(X) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x1fa963f5, 0x1a638cd4) + 49 + + + (0x207c9054, 0x3c841b63) + 768 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 63 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000e99, 0x000033ce) + y = sin(x) + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(X) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x1fa963f5, 0x1a638cd4) + 49 + + + (0x207c9054, 0x3c841b63) + 912 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 61 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000134c, 0x00005174) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004fd2ab) + + + + + (0x000013a6, 0x00004f67) + y = x + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x1fa963f5, 0x1a638cd4) + 49 + + + (0x207c9054, 0x3c841b63) + 96 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 61 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000183a, 0x00001fb5) + y = x³ + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + pow(x,3) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208 + + + (0x1fa963f5, 0x1a638cd4) + 49 + + + (0x207c9054, 0x3c841b63) + 192 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 61 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001af6, 0x00003a73) + DSP: b/a + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + b/a + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x1fa963f5, 0x1a638cd4) + 49 + + + (0x207c9054, 0x3c841b63) + 928 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 61 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00004ec9, 0x00005101) + Display: y = x + (0x0842bcd1, 0xd53c1c89) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x1fa963f5, 0x1a638cd4) + 49 + + + (0x207c9054, 0x3c841b63) + 64 + + + (0x4e7b798a, 0x183beafb) + (0x35390ab5, 0x7b926078) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 116 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004ec9, 0x00005102) + Display: y = x³ + (0x0842bcd1, 0xd53c1c89) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x1fa963f5, 0x1a638cd4) + 49 + + + (0x207c9054, 0x3c841b63) + 192 + + + (0x4e7b798a, 0x183beafb) + (0x35390ab5, 0x7b926078) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 116 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004ec9, 0x00005103) + Display: y = cos(x)/(x+1) * 20 + (0x0842bcd1, 0xd53c1c89) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 100 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x1fa963f5, 0x1a638cd4) + 49 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x35390ab5, 0x7b926078) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 168 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004ec9, 0x00005104) + Display: y = cos(x) + (0x0842bcd1, 0xd53c1c89) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x1fa963f5, 0x1a638cd4) + 49 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x4e7b798a, 0x183beafb) + (0x35390ab5, 0x7b926078) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 116 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004ec9, 0x00005105) + Display: y = sin(x) + (0x0842bcd1, 0xd53c1c89) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224 + + + (0x1fa963f5, 0x1a638cd4) + 49 + + + (0x207c9054, 0x3c841b63) + 1056 + + + (0x4e7b798a, 0x183beafb) + (0x35390ab5, 0x7b926078) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 116 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004ec9, 0x00005106) + Display: y = MAX(cos(x), sin(x)) + (0x0842bcd1, 0xd53c1c89) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x1fa963f5, 0x1a638cd4) + 49 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x4e7b798a, 0x183beafb) + (0x35390ab5, 0x7b926078) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 179 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004ec9, 0x00005107) + Display: y = sin(x)/cos(x) + (0x0842bcd1, 0xd53c1c89) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x1fa963f5, 0x1a638cd4) + 49 + + + (0x207c9054, 0x3c841b63) + 928 + + + (0x4e7b798a, 0x183beafb) + (0x35390ab5, 0x7b926078) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 143 + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x000052a1, 0x00005411) + DSP: a > b ? a : b + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + a>b?a:b + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 336 + + + (0x1fa963f5, 0x1a638cd4) + 49 + + + (0x207c9054, 0x3c841b63) + 752 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 99 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x0000068d, 0x00005448) + + (0x000013a6, 0x00004f67) + 0 + + + (0x00004ec9, 0x00005101) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 239 + + + (0x358ae8b5, 0x0f8bacd1) + 96 + + + (0x3f0a3b27, 0x570913d2) + 275 + + + (0x6267b5c5, 0x676e3e42) + 56 + + + + + (0x000011f1, 0x00003a30) + + (0x00000e99, 0x000033ce) + 0 + + + (0x00004ec9, 0x00005105) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 207 + + + (0x358ae8b5, 0x0f8bacd1) + 912 + + + (0x3f0a3b27, 0x570913d2) + 195 + + + (0x6267b5c5, 0x676e3e42) + 1048 + + + + + (0x00001c5e, 0x000061dd) + + (0x0000183a, 0x00001fb5) + 0 + + + (0x00004ec9, 0x00005102) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 239 + + + (0x358ae8b5, 0x0f8bacd1) + 192 + + + (0x3f0a3b27, 0x570913d2) + 275 + + + (0x6267b5c5, 0x676e3e42) + 184 + + + + + (0x0000214e, 0x0000342e) + + (0x0000134c, 0x00005174) + 0 + + + (0x00000e99, 0x000033ce) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 115 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 147 + + + (0x6267b5c5, 0x676e3e42) + 912 + + + + + (0x00002734, 0x000072b2) + + (0x000004f0, 0x00002045) + 0 + + + (0x00004ec9, 0x00005104) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 207 + + + (0x358ae8b5, 0x0f8bacd1) + 768 + + + (0x3f0a3b27, 0x570913d2) + 227 + + + (0x6267b5c5, 0x676e3e42) + 536 + + + + + (0x000032c1, 0x00006af9) + + (0x0000134c, 0x00005174) + 0 + + + (0x000004f0, 0x00002045) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 115 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 147 + + + (0x6267b5c5, 0x676e3e42) + 768 + + + + + (0x0000387c, 0x0000579d) + + (0x000004f0, 0x00002045) + 0 + + + (0x000052a1, 0x00005411) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 207 + + + (0x358ae8b5, 0x0f8bacd1) + 768 + + + (0x3f0a3b27, 0x570913d2) + 307 + + + (0x6267b5c5, 0x676e3e42) + 744 + + + + + (0x00004bcd, 0x0000198d) + + (0x0000134c, 0x00005174) + 0 + + + (0x0000007b, 0x00006015) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 115 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 179 + + + (0x6267b5c5, 0x676e3e42) + 336 + + + + + (0x00004d59, 0x00005943) + + (0x0000134c, 0x00005174) + 0 + + + (0x0000183a, 0x00001fb5) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 115 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 179 + + + (0x6267b5c5, 0x676e3e42) + 192 + + + + + (0x0000504c, 0x00005ab1) + + (0x00000e99, 0x000033ce) + 0 + + + (0x000052a1, 0x00005411) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 207 + + + (0x358ae8b5, 0x0f8bacd1) + 912 + + + (0x3f0a3b27, 0x570913d2) + 307 + + + (0x6267b5c5, 0x676e3e42) + 759 + + + + + (0x00005bc7, 0x00000def) + + (0x00001af6, 0x00003a73) + 0 + + + (0x00004ec9, 0x00005107) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 367 + + + (0x358ae8b5, 0x0f8bacd1) + 928 + + + (0x3f0a3b27, 0x570913d2) + 419 + + + (0x6267b5c5, 0x676e3e42) + 920 + + + + + (0x00005d3d, 0x000072b2) + + (0x00000e99, 0x000033ce) + 0 + + + (0x00001af6, 0x00003a73) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 207 + + + (0x358ae8b5, 0x0f8bacd1) + 912 + + + (0x3f0a3b27, 0x570913d2) + 307 + + + (0x6267b5c5, 0x676e3e42) + 935 + + + + + (0x00005d98, 0x0000772f) + + (0x000052a1, 0x00005411) + 0 + + + (0x00004ec9, 0x00005106) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 367 + + + (0x358ae8b5, 0x0f8bacd1) + 752 + + + (0x3f0a3b27, 0x570913d2) + 419 + + + (0x6267b5c5, 0x676e3e42) + 744 + + + + + (0x00007299, 0x00005ae8) + + (0x0000134c, 0x00005174) + 0 + + + (0x000013a6, 0x00004f67) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 115 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 179 + + + (0x6267b5c5, 0x676e3e42) + 96 + + + + + (0x00007987, 0x00007021) + + (0x000004f0, 0x00002045) + 0 + + + (0x00001af6, 0x00003a73) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 207 + + + (0x358ae8b5, 0x0f8bacd1) + 768 + + + (0x3f0a3b27, 0x570913d2) + 307 + + + (0x6267b5c5, 0x676e3e42) + 920 + + + + + (0x00007cae, 0x000067d9) + + (0x0000007b, 0x00006015) + 0 + + + (0x00004ec9, 0x00005103) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 239 + + + (0x358ae8b5, 0x0f8bacd1) + 336 + + + (0x3f0a3b27, 0x570913d2) + 275 + + + (0x6267b5c5, 0x676e3e42) + 328 + + + + + + + (0x000008ff, 0x000031d9) + You can use the letter 'X' (or 'x') + for the first input. + +You can use <b>up to 16 inputs</b>. +If you are using more than 1 input +You have to use the letters <b>a</b> to <b>p</b> +for inputs 1 to 16 respectively. + + + (0x473d9a43, 0x97fc0a97) + 1088 + + + (0x7234b86b, 0x2b8651a5) + 336 + + + + + (0x000020ad, 0x000032d0) + Example simple DSPs using only one input signal +to perform mathematical operations + + + (0x473d9a43, 0x97fc0a97) + 224 + + + (0x7234b86b, 0x2b8651a5) + 368 + + + + + (0x00002cd5, 0x000004b1) + The <i>Time signal</i> is a sample box +that generates a constant increasing signal + + + (0x473d9a43, 0x97fc0a97) + 544 + + + (0x7234b86b, 0x2b8651a5) + 48 + + + + + (0x00004a0e, 0x000044ab) + <i>if-then-else</i> clause +can be achieved using +<b><i>COND ? output-true : output-false</i></b> + + + (0x473d9a43, 0x97fc0a97) + 560 + + + (0x7234b86b, 0x2b8651a5) + 336 + + + + + (0x00004b9d, 0x00000915) + The <b><i>Simple DSP</i></b> box performs +simple computations on input matrix +These computations can be <b>logical</b> or +<b>arithmetical</b>. + + + (0x473d9a43, 0x97fc0a97) + 544 + + + (0x7234b86b, 0x2b8651a5) + -48 + + + + + (0x000065ca, 0x00001928) + You can browse each box' documentation by selecting the box and pressing <b>F1</b> + + + (0x473d9a43, 0x97fc0a97) + 544 + + + (0x7234b86b, 0x2b8651a5) + 512 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":3,"height":655,"identifier":"(0x000073b1, 0x00002780)","index":0,"name":"Simple DSP Tutorial","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1115},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000031ad, 0x00004908)","index":0,"name":"Polynomial","parentIdentifier":"(0x000073b1, 0x00002780)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00007cf9, 0x0000288f)","index":1,"name":"Trigonometric","parentIdentifier":"(0x000073b1, 0x00002780)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003001, 0x00004366)","index":2,"name":"Compound","parentIdentifier":"(0x000073b1, 0x00002780)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":545,"identifier":"(0x0000037d, 0x0000518e)","index":0,"maxDividerPosition":1095,"name":"Horizontal split","parentIdentifier":"(0x000031ad, 0x00004908)","type":5},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":399,"identifier":"(0x00007871, 0x00002897)","index":0,"maxDividerPosition":610,"name":"Vertical split","parentIdentifier":"(0x00007cf9, 0x0000288f)","type":4},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":303,"identifier":"(0x00003022, 0x00005977)","index":0,"maxDividerPosition":610,"name":"Vertical split","parentIdentifier":"(0x00003001, 0x00004366)","type":4},{"boxIdentifier":"(0x00004ec9, 0x00005101)","childCount":0,"identifier":"(0x00006b56, 0x00004614)","index":0,"parentIdentifier":"(0x0000037d, 0x0000518e)","type":3},{"boxIdentifier":"(0x00004ec9, 0x00005102)","childCount":0,"identifier":"(0x00000cdd, 0x0000534a)","index":1,"parentIdentifier":"(0x0000037d, 0x0000518e)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":537,"identifier":"(0x00005868, 0x00004ede)","index":0,"maxDividerPosition":1079,"name":"Horizontal split","parentIdentifier":"(0x00007871, 0x00002897)","type":5},{"boxIdentifier":"(0x00004ec9, 0x00005103)","childCount":0,"identifier":"(0x0000335d, 0x00004277)","index":1,"parentIdentifier":"(0x00007871, 0x00002897)","type":3},{"boxIdentifier":"(0x00004ec9, 0x00005106)","childCount":0,"identifier":"(0x00004dcf, 0x00004355)","index":0,"parentIdentifier":"(0x00003022, 0x00005977)","type":3},{"boxIdentifier":"(0x00004ec9, 0x00005107)","childCount":0,"identifier":"(0x00005aa2, 0x00001c4e)","index":1,"parentIdentifier":"(0x00003022, 0x00005977)","type":3},{"boxIdentifier":"(0x00004ec9, 0x00005105)","childCount":0,"identifier":"(0x00005471, 0x000071ff)","index":0,"parentIdentifier":"(0x00005868, 0x00004ede)","type":3},{"boxIdentifier":"(0x00004ec9, 0x00005104)","childCount":0,"identifier":"(0x00002641, 0x00002c3c)","index":1,"parentIdentifier":"(0x00005868, 0x00004ede)","type":3}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ChannelRename.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ChannelRename.dox-part new file mode 100644 index 0000000..ffc7f25 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ChannelRename.dox-part @@ -0,0 +1,66 @@ +/** + * \page BoxAlgorithm_ChannelRename Channel Rename +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ChannelRename_Description| + * This box renames the input channels with whatever name the author wants. The names + * should be separated by a semi-column ';' + * |OVP_DocEnd_BoxAlgorithm_ChannelRename_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ChannelRename_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ChannelRename_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ChannelRename_Input1| + * The input matrix which channels should be renamed. The type of this input can be changed to + * signal or spectrum depending on what kind of stream channel to rename. + * |OVP_DocEnd_BoxAlgorithm_ChannelRename_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ChannelRename_Outputs| + * |OVP_DocEnd_BoxAlgorithm_ChannelRename_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_ChannelRename_Output1| + * The output matrix with renamed channels. The type of this output can be changed to + * signal or spectrum depending on what kind of stream channel to rename. + * |OVP_DocEnd_BoxAlgorithm_ChannelRename_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ChannelRename_Settings| + * |OVP_DocEnd_BoxAlgorithm_ChannelRename_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ChannelRename_Setting1| + * A semi-colon separated list of new channel names. + * |OVP_DocEnd_BoxAlgorithm_ChannelRename_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ChannelRename_Examples| + * Suppose you compute the delta, alpha and beta band power at location Cz and merge the three + * streams in a single stream. The resulting stream will handle three channels all named Cz. For + * convenience, it could be useful to rename those channels Delta, Alpha and Beta respectively. + * In order to achieve this, use a \ref Doc_BoxAlgorithm_ChannelRename with the following setting + * value : "Delta;Alpha;Beta" + * |OVP_DocEnd_BoxAlgorithm_ChannelRename_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ChannelRename_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_ChannelRename_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ChannelSelector.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ChannelSelector.dox-part new file mode 100644 index 0000000..25293a3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ChannelSelector.dox-part @@ -0,0 +1,83 @@ +/** + * \page BoxAlgorithm_ChannelSelector Channel Selector +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ChannelSelector_Description| + * This box allows to restrict outgoing signal data to a subset of incoming data based on a list of channels. + * Channels may be identified by their index, their name (the case matters), or a mix of both. Additionally, + * the channels can be rejected instead of being selected. + * The name of the box displayed in the designer is the channel list (first setting). It allows the user to see directly if the box configuration is correct. + * However, should the user chose to rename the box manually, further change in the configuration won't be reflected in the name, except if the name is set + * back to its default value. + * |OVP_DocEnd_BoxAlgorithm_ChannelSelector_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ChannelSelector_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ChannelSelector_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ChannelSelector_Input1| + * The input matrix which channels should be selected or rejected. The type of this input can be changed to + * Signal, Spectrum or Streamed matrix depending on what kind of stream channel to select. + * |OVP_DocEnd_BoxAlgorithm_ChannelSelector_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ChannelSelector_Outputs| + * |OVP_DocEnd_BoxAlgorithm_ChannelSelector_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_ChannelSelector_Output1| + * The output matrix with selected or preserved channels. The type of this output can be changed to + * signal or spectrum depending on what kind of stream channel to select. + * |OVP_DocEnd_BoxAlgorithm_ChannelSelector_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ChannelSelector_Settings| + * |OVP_DocEnd_BoxAlgorithm_ChannelSelector_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ChannelSelector_Setting1| + * A semi colon separated list of channel identifiers. You can use the index of the channel or the name of the + * channel. Also, ranges can be selected specifying first channel identifier, followed by a colon, followed by + * the second channel identifier. + * |OVP_DocEnd_BoxAlgorithm_ChannelSelector_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_ChannelSelector_Setting2| + * The action to perform on the identifier channel, be : + * - \c select, + * - \c reject, + * - \c select \c EEG, selecting all EEG channels using their names. In this case, Channel List is no more considered. + * |OVP_DocEnd_BoxAlgorithm_ChannelSelector_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_ChannelSelector_Setting3| + * The kind of identification for channel list. + * - \c Smart let the box try to detect if the channel identifier is an index or a name + * - \c Name forces the channel identifiers to be considered as channel names. This can be useful if channel names are numbers. + * - \c Index forces the channel identifiers to be considered as channel indices. This can be useful if channel names are numbers. + * |OVP_DocEnd_BoxAlgorithm_ChannelSelector_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ChannelSelector_Examples| + * Suppose you want to select the first 8 channels of an input stream, plus you want the Cz electrode and the last 3 channels. + * You would then use the following string : [1:8;Cz;-3:-1]. + * |OVP_DocEnd_BoxAlgorithm_ChannelSelector_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ChannelSelector_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_ChannelSelector_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_CommonAverageReference.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_CommonAverageReference.dox-part new file mode 100644 index 0000000..480c983 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_CommonAverageReference.dox-part @@ -0,0 +1,62 @@ +/** + * \page BoxAlgorithm_CommonAverageReferenceFilter Common average reference filter +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CommonAverageReferenceFilter_Description| + +Re-referencing the signal to common average reference consists in subtracting +to each sample the average value of the samples of all electrodes at this time + + * |OVP_DocEnd_BoxAlgorithm_CommonAverageReferenceFilter_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CommonAverageReferenceFilter_Inputs| + * |OVP_DocEnd_BoxAlgorithm_CommonAverageReferenceFilter_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_CommonAverageReferenceFilter_Input1| + +The input signals, to be re-referenced to common average reference + + * |OVP_DocEnd_BoxAlgorithm_CommonAverageReferenceFilter_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CommonAverageReferenceFilter_Outputs| + * |OVP_DocEnd_BoxAlgorithm_CommonAverageReferenceFilter_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_CommonAverageReferenceFilter_Output1| + +the output is equal to the input signals re-referenced to common average reference + + * |OVP_DocEnd_BoxAlgorithm_CommonAverageReferenceFilter_Output1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CommonAverageReferenceFilter_Examples| + +Connect the "Signal" output of the "Acquisition client" box to this "Common Average Reference" (CAR), then +use the output signal for your BCI or any other applications. The CAR is a spatial filter +commonly employed in EEG-based BCI. This can reduce the noise which is present globally over all electrodes. + + * |OVP_DocEnd_BoxAlgorithm_CommonAverageReferenceFilter_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CommonAverageReferenceFilter_Miscellaneous| + +the input EEG signals should be recorded with more than one electrode, otherwise this box is useless. + + * |OVP_DocEnd_BoxAlgorithm_CommonAverageReferenceFilter_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ContinuousWaveletAnalysis.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ContinuousWaveletAnalysis.dox-part new file mode 100644 index 0000000..d0c6f0a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ContinuousWaveletAnalysis.dox-part @@ -0,0 +1,147 @@ +/** + * \page BoxAlgorithm_ContinuousWaveletAnalysis Continuous Wavelet Analysis +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousWaveletAnalysis_Description| + + The Continuous Wavelet Transform (CWT) provides a Time-Frequency representation of an input signal, using Morlet, Paul or derivative of Gaussian wavelets. + + Considering an input signal \f$ X \in \mathbb{R}^{C \times N} \f$, composed of \f$ C \f$ channels and \f$ N \f$ temporal samples, + this plugin computes the CWT of this signal \f$ \Phi \in \mathbb{C}^{C \times F \times N} \f$, composed of \f$ C \f$ channels, \f$ F \f$ scales and \f$ N \f$ temporal samples. + For the \f$ c^{ \text{th} } \f$ channel, the \f$ f^{ \text{th} } \f$ scale \f$ s_f \f$ and the \f$ n^{ \text{th} } \f$ sample, the Time-Frequency representation is defined as: + \f[ \Phi (c,f,n) = \sum_{n'=0}^{N-1} X(c,n') \ \psi^{*} \left( \frac{(n-n') \delta t}{s_f} \right) \ , \f] + where \f$ \psi \f$ is the normalized wavelet, \f$ (.)^{*} \f$ is the complex conjugate and \f$ \delta t \f$ is the sampling period. + + Using the inverse relation between wavelet scale \f$ s_f \f$ and Fourier frequency \f$ \text{freq}_f \f$, output is finally defined as: + \f[ \Phi(c,f,n) = \Phi_r(c,f,n) + \mathsf{i} \times \Phi_i(c,f,n) = \left| \Phi(c,f,n) \right| \times e^{\mathsf{i} \arg(\Phi(c,f,n))} \ , \f] + with \f$ \mathsf{i} \f$ being the imaginary unit. + + Output can be visualized with a \ref Doc_BoxAlgorithm_InstantBitmap3DStream. + + * |OVP_DocEnd_BoxAlgorithm_ContinuousWaveletAnalysis_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousWaveletAnalysis_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ContinuousWaveletAnalysis_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousWaveletAnalysis_Input1| + + An input multichannel signal \f$ X \in \mathbb{R}^{C \times N} \f$, composed of \f$ C \f$ channels and \f$ N \f$ temporal samples. + + * |OVP_DocEnd_BoxAlgorithm_ContinuousWaveletAnalysis_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousWaveletAnalysis_Outputs| + * |OVP_DocEnd_BoxAlgorithm_ContinuousWaveletAnalysis_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousWaveletAnalysis_Output1| + + An output spectral amplitude (absolute value) \f$ \left| \Phi \right| \in \mathbb{R}^{C \times F \times N} \f$. + + * |OVP_DocEnd_BoxAlgorithm_ContinuousWaveletAnalysis_Output1| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousWaveletAnalysis_Output2| + + An output spectral phase \f$ \arg(\Phi) \in \mathbb{R}^{C \times F \times N} \f$, in radians. + + * |OVP_DocEnd_BoxAlgorithm_ContinuousWaveletAnalysis_Output2| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousWaveletAnalysis_Output3| + + An output real part of the spectrum \f$ \Phi_r \in \mathbb{R}^{C \times F \times N} \f$. + + * |OVP_DocEnd_BoxAlgorithm_ContinuousWaveletAnalysis_Output3| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousWaveletAnalysis_Output4| + + An output imaginary part of the spectrum \f$ \Phi_i \in \mathbb{R}^{C \times F \times N} \f$. + + * |OVP_DocEnd_BoxAlgorithm_ContinuousWaveletAnalysis_Output4| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousWaveletAnalysis_Settings| + * |OVP_DocEnd_BoxAlgorithm_ContinuousWaveletAnalysis_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousWaveletAnalysis_Setting1| + + This setting defines the type of the wavelet: + + - Morlet: + + \f[ \psi_0 (n) = \pi^{1/4} e^{\mathsf{i} \omega_0 n} e^{-n^2 / 2} \ , \f] + + - Paul: + + \f[ \psi_0 (n) = \frac{2^m \mathsf{i}^m m!}{\sqrt{\pi(2m)!}} (1-\mathsf{i} n)^{-(m+1)} \ , \f] + + - derivative of Gaussian: + + \f[ \psi_0 (n) = \frac{(-1)^{m+1}}{\sqrt{\Gamma(m+\frac{1}{2})}} \frac{d^m}{d n^m} (e^{-n^2 / 2}) \ . \f] + + \n + + * |OVP_DocEnd_BoxAlgorithm_ContinuousWaveletAnalysis_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousWaveletAnalysis_Setting2| + + This setting defines the wavelet parameter: + + - Morlet wavelet: nondimensional frequency \f$ \omega_0 \f$, real positive parameter value. Values between 4.0 and 6.0 are typically used. + + - Paul wavelet: order \f$ m \f$, positive integer values inferior to 20. Default value is 4. + + - Derivative of Gaussian wavelet: derivative \f$ m \f$, positive even integer values. Value 2 gives the Marr or Mexican hat wavelet. + + \n + + * |OVP_DocEnd_BoxAlgorithm_ContinuousWaveletAnalysis_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousWaveletAnalysis_Setting3| + + This setting defines the number of frequencies \f$ F \f$ of the CWT. + + * |OVP_DocEnd_BoxAlgorithm_ContinuousWaveletAnalysis_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousWaveletAnalysis_Setting4| + + This setting defines the highest frequency \f$ \text{freq}_F \f$ of the CWT. + + * |OVP_DocEnd_BoxAlgorithm_ContinuousWaveletAnalysis_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_ContinuousWaveletAnalysis_Setting5| + + This setting is related to the frequency non-linear spacing of the CWT. + + * |OVP_DocEnd_BoxAlgorithm_ContinuousWaveletAnalysis_Setting5| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousWaveletAnalysis_Examples| + * |OVP_DocEnd_BoxAlgorithm_ContinuousWaveletAnalysis_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ContinuousWaveletAnalysis_Miscellaneous| + + Reference: + + C Torrence and GP Compo, A Practical Guide to Wavelet Analysis, Bulletin of the American Meteorological Society, vol. 79, pp. 61–78, 1998 + + * |OVP_DocEnd_BoxAlgorithm_ContinuousWaveletAnalysis_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Crop.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Crop.dox-part new file mode 100644 index 0000000..b3040ce --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Crop.dox-part @@ -0,0 +1,66 @@ +/** + * \page BoxAlgorithm_Crop Crop +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Crop_Description| + This box allows to set minimum and/or maximum thresholds to incoming data. Values lying outside the allowed range are cropped to it. + * |OVP_DocEnd_BoxAlgorithm_Crop_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Crop_Inputs| + * |OVP_DocEnd_BoxAlgorithm_Crop_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_Crop_Input1| + * |OVP_DocEnd_BoxAlgorithm_Crop_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Crop_Outputs| + * |OVP_DocEnd_BoxAlgorithm_Crop_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_Crop_Output1| + * |OVP_DocEnd_BoxAlgorithm_Crop_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Crop_Settings| + * |OVP_DocEnd_BoxAlgorithm_Crop_Settings| + + * |OVP_DocBegin_BoxAlgorithm_Crop_Setting1| +Method to use to crop incoming data. A minimum and/or a maximum threshold(s) may be defined. + * |OVP_DocEnd_BoxAlgorithm_Crop_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_Crop_Setting2| +Minimum threshold. + * |OVP_DocEnd_BoxAlgorithm_Crop_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_Crop_Setting3| +Maximum threshold. + * |OVP_DocEnd_BoxAlgorithm_Crop_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Crop_Examples| + * |OVP_DocEnd_BoxAlgorithm_Crop_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Crop_Miscellaneous| + Note : the type of input data may be changed. Allowed types include streamed matrix, feature vector, signal and spectrum. + * |OVP_DocEnd_BoxAlgorithm_Crop_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_EpochAverage.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_EpochAverage.dox-part new file mode 100644 index 0000000..4c14837 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_EpochAverage.dox-part @@ -0,0 +1,171 @@ +/** + * \page BoxAlgorithm_EpochAverage Epoch average +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EpochAverage_Description| + * This box offers several methods of averaging for epoched streams. + * |OVP_DocEnd_BoxAlgorithm_EpochAverage_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EpochAverage_Inputs| + * The input type of this box can be changed. Its type must be derived of + * type \ref Doc_Streams_StreamedMatrix in order to be parsed by the input + * reader. If the author changes the input type, the output type will + * be changed the same way. + * |OVP_DocEnd_BoxAlgorithm_EpochAverage_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_EpochAverage_Input1| + * This input receives the input streamed matrix to average. + * |OVP_DocEnd_BoxAlgorithm_EpochAverage_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EpochAverage_Outputs| + * The output type of this box can be changed. Its type must be derived of + * type \ref Doc_Streams_StreamedMatrix in order for the writer to format + * the output chunks. If the author changes the output type, the input + * type will be changed the same way. + * |OVP_DocEnd_BoxAlgorithm_EpochAverage_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_EpochAverage_Output1| + * This output sends the averaged streamed matrix. Averaging method is done + * according to the box settings. + * |OVP_DocEnd_BoxAlgorithm_EpochAverage_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EpochAverage_Settings| + * |OVP_DocEnd_BoxAlgorithm_EpochAverage_Settings| + + * |OVP_DocBegin_BoxAlgorithm_EpochAverage_Setting1| + * This setting gives the method to use in order to average the input + * matrices. It can be of two types : + * - Moving average : in this case, the averaging is done at + * every input reception on the last few buffers, starting as soon + * as enough input has been received. + * - Moving average (Immediate) : in this case, the averaging is done at + * every input reception on the last few buffers, starting immediately. When + * the number of received buffer is lower than the wished number of epochs, the + * average is computed on this very few number of input buffers. + * - Epoch block average : in this case, the averaging + * is done on a number of epochs (see next setting). Once this exact + * number of input is received, the average is computed and output. + * - Cumulative average : in this case, the averaging + * is done on an infinite number of epochs starting from the first + * received buffer to the last received buffer. This can be \b very + * memory consuming ! + * |OVP_DocEnd_BoxAlgorithm_EpochAverage_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_EpochAverage_Setting2| + * This setting tells the box how much buffer it should use in order to + * compute the average. + * |OVP_DocEnd_BoxAlgorithm_EpochAverage_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EpochAverage_Examples| + * Let's study two cases. First, suppose you have such box with + * Epoch block average set and four epochs. + * The input stream is as follows : +\verbatim ++----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +| I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I8 | | I9 | ... ++----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +\endverbatim + * The output stream will look like this : +\verbatim + +----+ +----+ + | O1 | | O2 | ... + +----+ +----+ +\endverbatim + * where \c O1 is the average of \c I1, \c I2, \c I3 and \c I4 and + * where \c O2 is the average of \c I5, \c I6, \c I7 and \c I8. + * + * Now consider the case where you configured this box with + * Moving average and four epochs. Given the + * same input stream : +\verbatim ++----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +| I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I8 | | I9 | ... ++----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +\endverbatim + * The output stream will look like this : +\verbatim + +----+ +----+ +----+ +----+ +----+ +----+ + | O1 | | O2 | | O3 | | O4 | | O5 | | O6 | ... + +----+ +----+ +----+ +----+ +----+ +----+ +\endverbatim + * where : + * - \c O1 is the average of \c I1, \c I2, \c I3 and \c I4 + * - \c O2 is the average of \c I2, \c I3, \c I4 and \c I5 + * - \c O3 is the average of \c I3, \c I4, \c I5 and \c I6 + * - \c O4 is the average of \c I4, \c I5, \c I6 and \c I7 + * - etc... + * + * Again consider the case where you configured this box with + * Moving average (Immediate) and four epochs. Given the + * same input stream : +\verbatim ++----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +| I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I8 | | I9 | ... ++----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +\endverbatim + * The output stream will look like this : +\verbatim ++----+ +----+ +----+ +----+ +----+ +----+ +| O1 | | O2 | | O3 | | O4 | | O5 | | O6 | ... ++----+ +----+ +----+ +----+ +----+ +----+ +\endverbatim + * where : + * - \c O1 is exactly \c I1 + * - \c O2 is the average of \c I1 and \c I2 + * - \c O3 is the average of \c I1, \c I2 and \c I3 + * - \c O4 is the average of \c I1, \c I2, \c I3 and \c I4 + * - \c O5 is the average of \c I2, \c I3, \c I4 and \c I5 + * - \c O6 is the average of \c I3, \c I4, \c I5 and \c I6 + * - etc... + * + * Finally consider the case where you configured this box with + * Cumulative average and four epochs. Given the + * same input stream : +\verbatim ++----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +| I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I8 | | I9 | ... ++----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +\endverbatim + * The output stream will look like this : +\verbatim ++----+ +----+ +----+ +----+ +----+ +----+ +| O1 | | O2 | | O3 | | O4 | | O5 | | O6 | ... ++----+ +----+ +----+ +----+ +----+ +----+ +\endverbatim + * where : + * - \c O1 is exactly \c I1 + * - \c O2 is the average of \c I1 and \c I2 + * - \c O3 is the average of \c I1, \c I2 and \c I3 + * - \c O4 is the average of \c I1, \c I2, \c I3 and \c I4 + * - \c O5 is the average of \c I1, \c I2, \c I3, \c I4, and \c I5 + * - \c O6 is the average of \c I1, \c I2, \c I3, \c I4, \c I5, and \c I6 + * - etc... + + * |OVP_DocEnd_BoxAlgorithm_EpochAverage_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EpochAverage_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_EpochAverage_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_FrequencyBandSelector.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_FrequencyBandSelector.dox-part new file mode 100644 index 0000000..19d72d8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_FrequencyBandSelector.dox-part @@ -0,0 +1,64 @@ +/** + * \page BoxAlgorithm_FrequencyBandSelector Frequency Band Selector +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FrequencyBandSelector_Description| + * This box selects a subset of a spectrum matrix, turning all un selected frequency + * band to 0. + * |OVP_DocEnd_BoxAlgorithm_FrequencyBandSelector_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FrequencyBandSelector_Inputs| + * |OVP_DocEnd_BoxAlgorithm_FrequencyBandSelector_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_FrequencyBandSelector_Input1| + * The input spectrum to select from. + * |OVP_DocEnd_BoxAlgorithm_FrequencyBandSelector_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FrequencyBandSelector_Outputs| + * |OVP_DocEnd_BoxAlgorithm_FrequencyBandSelector_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_FrequencyBandSelector_Output1| + * The modified spectrum with unselected bands turned to 0 + * |OVP_DocEnd_BoxAlgorithm_FrequencyBandSelector_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FrequencyBandSelector_Settings| + * |OVP_DocEnd_BoxAlgorithm_FrequencyBandSelector_Settings| + + * |OVP_DocBegin_BoxAlgorithm_FrequencyBandSelector_Setting1| + * The range of frequencies you want to select. + * |OVP_DocEnd_BoxAlgorithm_FrequencyBandSelector_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FrequencyBandSelector_Examples| + * Suppose you have a full band spectrum and that you want to work on alpha band. You can use + * a \ref Doc_BoxAlgorithm_FrequencyBandSelector box to select this band for later processing + * with the following setting : "8:12". Now suppose you want to work on two bands, for instance + * Alpha and the 16-24Hz subset of Beta, you should use the following setting value : "8:12[SEMICOLON]16:24" + * with [SEMICOLON] replaced by the actual semicolon charater. + * |OVP_DocEnd_BoxAlgorithm_FrequencyBandSelector_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_FrequencyBandSelector_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_FrequencyBandSelector_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Identity.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Identity.dox-part new file mode 100644 index 0000000..58b8739 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Identity.dox-part @@ -0,0 +1,55 @@ +/** + * \page BoxAlgorithm_Identity Identity +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Identity_Description| + * This box simply duplicates inputs to corresponding outputs in a similar way + * |OVP_DocEnd_BoxAlgorithm_Identity_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Identity_Inputs| + * This box can have any number of input of any type. Each input has a corresponding + * output with the same type. Incoming chunks are simply duplicated to the corresponding output. + * |OVP_DocEnd_BoxAlgorithm_Identity_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_Identity_Input1| + * The default input for this box. + * |OVP_DocEnd_BoxAlgorithm_Identity_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Identity_Outputs| + * This box can have any number of output of any type. Each output has a corresponding + * input with the same type. Incoming chunks are simply duplicated to the corresponding output. + * |OVP_DocEnd_BoxAlgorithm_Identity_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_Identity_Output1| + * The default output for this box. + * |OVP_DocEnd_BoxAlgorithm_Identity_Output1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Identity_Examples| + * This box could be used in order to quickly switch between acquisition or file reading mode. + * At the very top of the scenario, you would put an identity box with four connectors of type + * \ref Doc_Streams_ExperimentInfo, \ref Doc_Streams_Signal, \ref Doc_Streams_Stimulation and + * \ref Doc_Streams_ChannelLocalisation. + * |OVP_DocEnd_BoxAlgorithm_Identity_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Identity_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_Identity_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ReferenceChannel.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ReferenceChannel.dox-part new file mode 100644 index 0000000..6f3725d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ReferenceChannel.dox-part @@ -0,0 +1,60 @@ +/** + * \page BoxAlgorithm_ReferenceChannel Reference channel +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ReferenceChannel_Description| + * This plugin subtracts the values of the samples from a reference + * channel from the other channels' samples. + * |OVP_DocEnd_BoxAlgorithm_ReferenceChannel_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ReferenceChannel_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ReferenceChannel_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ReferenceChannel_Input1| + * The input signal. + * |OVP_DocEnd_BoxAlgorithm_ReferenceChannel_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ReferenceChannel_Outputs| + * |OVP_DocEnd_BoxAlgorithm_ReferenceChannel_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_ReferenceChannel_Output1| + * The resulting signal. + * |OVP_DocEnd_BoxAlgorithm_ReferenceChannel_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ReferenceChannel_Settings| + * |OVP_DocEnd_BoxAlgorithm_ReferenceChannel_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ReferenceChannel_Setting1| + * Index of the reference channel in the input stream. + * |OVP_DocEnd_BoxAlgorithm_ReferenceChannel_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ReferenceChannel_Examples| + * |OVP_DocEnd_BoxAlgorithm_ReferenceChannel_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ReferenceChannel_Miscellaneous| + * The reference channel is kept in the resulting signal. + * |OVP_DocEnd_BoxAlgorithm_ReferenceChannel_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_RegularizedCSPTrainer.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_RegularizedCSPTrainer.dox-part new file mode 100644 index 0000000..4fb36df --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_RegularizedCSPTrainer.dox-part @@ -0,0 +1,146 @@ +/** + * \page BoxAlgorithm_RegularizedCSPTrainer Shrinkage CSP Trainer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_RegularizedCSPTrainer_Description| + + The box estimates a filter bank of spatial filters using Common Spatial Patterns (CSP) algorithm. The algorithm tries to find a linear transform of the data that + makes the signal conditions (or classes) more distinct, when the data is projected to the matrix of the filters found by the algorithm (i.e. s=Wx, where we + assume x is the signal sample, W is the discovered filter bank, and s a lower-dimensional representation of the sample). The spatial filters are constructed + for two conditions to maximize the variance of the signals of the first condition while at the same time minimizing it for the second condition. + If signal variance contains discriminatory information, CSP filters can be useful in classification situations where designing spatial filter masks + such as Laplacians manually is cumbersome or when it is believed that a filter optimized to the current data/user would produce better + results than using an one-size-fits all filter. + + In principle CSP can be useful in experiments where there is discriminative information in the variance (or power) of the signal conditions, + for example motor imagery or SSVEP. + + The box implements some of the methods described e.g. by Lotte & Guan [1]. Especially, it + allows using the methods called "CSP with Diagonal Loading" and "CSP with Tikhonov Regularization" in the paper. In the approach of + the paper, the filters for condition 1 are found by eigenvector decomposition of inv(Sigma1+rho*I)*Sigma2, where Sigma1 and Sigma2 are + empirical covariance matrices for the two conditions, rho the amount of Tikhonov regularization and I an identity matrix. For condition 2, + the formula is the same with the sigmas swapped. The matrices Sigma1 and Sigma2 may be optionally shrunk towards diagonal matrices. + + In situations with more than two conditions, the box implements a one-vs-all approach, where each class gives a Sigma1 in turn, with the + covariances of the other classes combined with a class frequency weighted average to obtain Sigma2. Hence, for k classes, k pairings + are estimated, and out of each pair, a requested amount of filters is selected separately. This results in k times the amount of filters + requested in total. + + To avoid caching the whole dataset in the box, the algorithm tries to estimate the required covariances incrementally. The box supports + a few different incremental ways to compute the covariances. The 'block average' approach takes an average of all the covariances of the incoming + signal chunks, an approach described in [2], whereas the incremental (per sample) method aims to implement Youngs & Cramer + algorithm as described in [3]. Which one gives better results may depend on the situation -- however, + taking an average of covariance matrices is not your usual textbook method for computing covariance over the whole data. + + Finally, the box also presents an option to try to compensate for the effect of changes in the average signal power over time. This is + can be done by enabling 'Trace Normalization' setting. When trace normalization is enabled, each data chunks contribution to + the covariance gets divided by its trace. See miscellaneous notes for details. + + * |OVP_DocEnd_BoxAlgorithm_RegularizedCSPTrainer_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_RegularizedCSPTrainer_Inputs| + * |OVP_DocEnd_BoxAlgorithm_RegularizedCSPTrainer_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_RegularizedCSPTrainer_Input1| + This stimulus input is needed to indicate the end of a recording session (or end of file). It triggers the training/computation of the CSP filters. + * |OVP_DocEnd_BoxAlgorithm_RegularizedCSPTrainer_Input1| + + * |OVP_DocBegin_BoxAlgorithm_RegularizedCSPTrainer_Input2| + This input expects epoched data for the first condition (e.g. epochs for left hand motor imagery). + * |OVP_DocEnd_BoxAlgorithm_RegularizedCSPTrainer_Input2| + + * |OVP_DocBegin_BoxAlgorithm_RegularizedCSPTrainer_Input3| + This input expects epoched data for the second condition (e.g. epochs for right hand motor imagery). + * |OVP_DocEnd_BoxAlgorithm_RegularizedCSPTrainer_Input3| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_RegularizedCSPTrainer_Outputs| + * |OVP_DocEnd_BoxAlgorithm_RegularizedCSPTrainer_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_RegularizedCSPTrainer_Output1| + The CSP Trainer outputs the stimulation OVTK_StimulationId_TrainCompleted when the training process was successful. No output is produced if the process failed. + * |OVP_DocEnd_BoxAlgorithm_RegularizedCSPTrainer_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_RegularizedCSPTrainer_Settings| + + * |OVP_DocEnd_BoxAlgorithm_RegularizedCSPTrainer_Settings| + + * |OVP_DocBegin_BoxAlgorithm_RegularizedCSPTrainer_Setting1| + The stimulus identifier denoting the end of a recording session or end of file, e.g. OVTK_GDF_End_Of_Session or OVTK_StimulationId_ExperimentStop. + * |OVP_DocEnd_BoxAlgorithm_RegularizedCSPTrainer_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_RegularizedCSPTrainer_Setting2| + The path and filename of the configuration file in which the computed spatial filters are saved. + * |OVP_DocEnd_BoxAlgorithm_RegularizedCSPTrainer_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_RegularizedCSPTrainer_Setting3| + How many spatial filters should be selected per class. + * |OVP_DocEnd_BoxAlgorithm_RegularizedCSPTrainer_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_RegularizedCSPTrainer_Setting4| +If true, the file written will be a box configuration override especially for the spatial filter box. Otherwise, it will be an ASCII matrix. + * |OVP_DocEnd_BoxAlgorithm_RegularizedCSPTrainer_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_RegularizedCSPTrainer_Setting5| + Method to update the covariances + * |OVP_DocEnd_BoxAlgorithm_RegularizedCSPTrainer_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_RegularizedCSPTrainer_Setting6| + Is trace normalization done when appending the per-chunk covariances? + * |OVP_DocEnd_BoxAlgorithm_RegularizedCSPTrainer_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_RegularizedCSPTrainer_Setting7| + The amount of shrinkage, between 0 and 1. It interpolates between the covariance matrices and the diagonal matrix. + * |OVP_DocEnd_BoxAlgorithm_RegularizedCSPTrainer_Setting7| + + * |OVP_DocBegin_BoxAlgorithm_RegularizedCSPTrainer_Setting8| + The amount of Tikhonov regularization, bigger signifies more. This equals parameter rho in the description above. If 0, the method behaves approximately as a regular CSP. + * |OVP_DocEnd_BoxAlgorithm_RegularizedCSPTrainer_Setting8| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_RegularizedCSPTrainer_Miscellaneous| + The suitable amount of regularization may depend on the variance of the data. You may need to try different values to find the one that suits your situation best. + Before the CSP training, it may be useful to temporally filter the input data to remove bands which are believed to have no relevant discriminative information. + + Note that the usage of the CSP filters before classification training can make the cross-validation results optimistic, unless strictly non-overlapping parts of the data were used to train the CSP and the classifier (disjoint sets for each). + + The trace normalization can be found in the literature [2]. The idea is to normalize the scale of each chunk in order to + compensate for a possible signal power drift over time during the EEG recording, making each chunks' covariance contribute + similarly to the aggregate regardless of the current chunks average power. + + To get the "CSP with Diagonal Loading" of Lotte & Guan paper [1], set shrinkage to a positive value and Tikhonov to 0. To get the + "CSP with Tikhonov regularization", do the opposite. You can also try a mixture of the two. Note that the Guan & Lotte paper does not appear to use trace normalization. + + To get the CSP resembling the one in the Muller-Gerkin paper, set Trace Normalization to True and the Covariance method to Chunk Average, with no regularization. Then, feed the algorithm each trial as a separate chunk (with Stimulation based epoching box). This is also the classic OV way of computing the CSP. + + Once the spatial filters are computed and saved, you can load and apply the filters with the \ref Doc_BoxAlgorithm_SpatialFilter "Spatial Filter" box. + + + References + + 1) Lotte & Guan: "Regularizing common spatial patterns to Improve BCI Designs: Unified Theory and New Algorithms", 2011. + + 2) Muller-Gerkin & al., "Designing optimal spatial filters for single-trial EEG classification in a movement task", 1999. + + 3) Chan, Golub & Leveq, "Updating formulae and a pairwise algorithm for computing sample variances", 1979. + + + * |OVP_DocEnd_BoxAlgorithm_RegularizedCSPTrainer_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SignalAverage.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SignalAverage.dox-part new file mode 100644 index 0000000..1952853 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SignalAverage.dox-part @@ -0,0 +1,51 @@ +/** + * \page BoxAlgorithm_SignalAverage Signal average +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalAverage_Description| + * This plugin computes the average of each incoming sample + * buffer and outputs the resulting signal. + * |OVP_DocEnd_BoxAlgorithm_SignalAverage_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalAverage_Inputs| + * |OVP_DocEnd_BoxAlgorithm_SignalAverage_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_SignalAverage_Input1| + * The input signal. + * |OVP_DocEnd_BoxAlgorithm_SignalAverage_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalAverage_Outputs| + * |OVP_DocEnd_BoxAlgorithm_SignalAverage_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_SignalAverage_Output1| + * Signal containing the averages of the input sample buffers. + * |OVP_DocEnd_BoxAlgorithm_SignalAverage_Output1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalAverage_Examples| + * |OVP_DocEnd_BoxAlgorithm_SignalAverage_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalAverage_Miscellaneous| + * The output signal's sample count per channel per buffer is one, + * since a buffer contains the averages (per channel) of the values + * of an input buffer. + * |OVP_DocEnd_BoxAlgorithm_SignalAverage_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SignalDecimation.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SignalDecimation.dox-part new file mode 100644 index 0000000..5977705 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SignalDecimation.dox-part @@ -0,0 +1,73 @@ +/** + * \page BoxAlgorithm_SignalDecimation Signal Decimation +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDecimation_Description| +This box reduces the sampling frequency of an input signal the easy way. +It is different of the existing \ref Doc_BoxAlgorithm_Downsampling box in the sense +that there is no pre-filtering and that you can not choose an arbitrary sampling +frequency. Thus you will have to pre-filter the input signal with the +\ref Doc_BoxAlgorithm_TemporalFilter box for example. The new sampling frequency +will be an exact divider of the source signal sampling frequency. For instance, if your +input sampling frequency is 1000Hz, you are allowed to divide that frequency by 2 or 4 +but you can't divide it by 3. See section \ref Doc_BoxAlgorithm_SignalDecimation_Examples +for a detailed example of what can be done. + * |OVP_DocEnd_BoxAlgorithm_SignalDecimation_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDecimation_Inputs| + * |OVP_DocEnd_BoxAlgorithm_SignalDecimation_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_SignalDecimation_Input1| +The input signal. + * |OVP_DocEnd_BoxAlgorithm_SignalDecimation_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDecimation_Outputs| + * |OVP_DocEnd_BoxAlgorithm_SignalDecimation_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_SignalDecimation_Output1| +The decimated signal. + * |OVP_DocEnd_BoxAlgorithm_SignalDecimation_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDecimation_Settings| + * |OVP_DocEnd_BoxAlgorithm_SignalDecimation_Settings| + + * |OVP_DocBegin_BoxAlgorithm_SignalDecimation_Setting1| +The sampling rate divider. At each chunk reception, 1 sample among n of the input signal will be +sent to the output signal. + * |OVP_DocEnd_BoxAlgorithm_SignalDecimation_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDecimation_Examples| +Suppose you have a signal with a sampling rate of 1000Hz streamed with 32 samples per buffer +that you want to downsample to 100Hz. Downsampling this signal to 100Hz will require that you +low-pass filter the signal to at most 50Hz to avoid bad results. Additionally, +Changing the epoch sizes using a the +\ref Doc_BoxAlgorithm_TimeBasedEpoching box and configuring it e.g. for epochs of 0.1s every +0.1s will cause this box to output 10 samples sized buffers. + * |OVP_DocEnd_BoxAlgorithm_SignalDecimation_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalDecimation_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_SignalDecimation_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SignalResampling.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SignalResampling.dox-part new file mode 100644 index 0000000..0d3f9ef --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SignalResampling.dox-part @@ -0,0 +1,81 @@ +/** + * \page BoxAlgorithm_SignalResampling Signal Resampling +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalResampling_Description| + + This plugin can apply a downsampling or an upsampling, to/from any sampling frequency, including non-integer sampling rate conversion. + The signal is low-pass filtered with a FIR filter to avoid spectral aliasing, using a sinc function-based fractional delay filter bank. + + If the sampling rate is badly conditioned, this plugin can induce latency. + + * |OVP_DocEnd_BoxAlgorithm_SignalResampling_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalResampling_Inputs| + * |OVP_DocEnd_BoxAlgorithm_SignalResampling_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_SignalResampling_Input1| + + An input multichannel signal \f$ X \in \mathbb{R}^{C \times N_1} \f$, composed of \f$ C \f$ channels and \f$ N_1 \f$ temporal samples, at the sampling frequency \f$ F_1 \f$. + + * |OVP_DocEnd_BoxAlgorithm_SignalResampling_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalResampling_Outputs| + * |OVP_DocEnd_BoxAlgorithm_SignalResampling_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_SignalResampling_Output1| + + An output multichannel signal \f$ Y \in \mathbb{R}^{C \times N_2} \f$, composed of \f$ C \f$ channels and \f$ N_2 \f$ temporal samples, at the sampling frequency \f$ F_2 \f$. + + * |OVP_DocEnd_BoxAlgorithm_SignalResampling_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalResampling_Settings| + * |OVP_DocEnd_BoxAlgorithm_SignalResampling_Settings| + + * |OVP_DocBegin_BoxAlgorithm_SignalResampling_Setting1| + + New sampling frequency \f$ F_2 > 0 \f$. No processing is applied if \f$ F_2 = F_1 \f$. + + * |OVP_DocEnd_BoxAlgorithm_SignalResampling_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_SignalResampling_Setting2| + + Number of temporal samples \f$ N_2 > 0 \f$ per resampled buffer. + + * |OVP_DocEnd_BoxAlgorithm_SignalResampling_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_SignalResampling_Setting3| + + Low-pass filtering activation, to avoid spectral aliasing. + + * |OVP_DocEnd_BoxAlgorithm_SignalResampling_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalResampling_Examples| + * |OVP_DocEnd_BoxAlgorithm_SignalResampling_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalResampling_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_SignalResampling_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SimpleDSP.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SimpleDSP.dox-part new file mode 100644 index 0000000..4ee0e4f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SimpleDSP.dox-part @@ -0,0 +1,171 @@ +/** + * \page BoxAlgorithm_SimpleDSP Simple DSP +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SimpleDSP_Description| + * This plugin is used to apply a mathematical formulae to each sample of an incoming signal and output + * the resulting signal. It thus acts as a simple DSP. + * + * The author may add up to 15 additional inputs. + * In such circumstances, each input would be identified + * by a letter from \e A to \e P. + * + * Also the type of the inputs could be changed to any + * streamed matrix derived type. Thus you can process + * signal, spectrum or feature vector if you need. + * |OVP_DocEnd_BoxAlgorithm_SimpleDSP_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SimpleDSP_Inputs| + You can use from 1 to 16 inputs. + * |OVP_DocEnd_BoxAlgorithm_SimpleDSP_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_SimpleDSP_Input1| + * Input signal + * |OVP_DocEnd_BoxAlgorithm_SimpleDSP_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SimpleDSP_Outputs| + * |OVP_DocEnd_BoxAlgorithm_SimpleDSP_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_SimpleDSP_Output1| + * Filtered signal. + * |OVP_DocEnd_BoxAlgorithm_SimpleDSP_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SimpleDSP_Settings| + * |OVP_DocEnd_BoxAlgorithm_SimpleDSP_Settings| + + * |OVP_DocBegin_BoxAlgorithm_SimpleDSP_Setting1| + * Formula to apply to incoming data (identified as 'X'). See \ref Doc_BoxAlgorithm_SimpleDSP_Miscellaneous for more details. + * |OVP_DocEnd_BoxAlgorithm_SimpleDSP_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SimpleDSP_Examples| + * Let's consider that we want to compute the natural logarithm of the absolute value + * of the input signal plus one. We just have to type the equation like that : + * \code + * log(abs(X) + 1) + * \endcode + * + * Another example : if you want to sum the cosinus of X minus Pi with its sinus plus Pi, + * you can enter this equation : + * \code + * cos(X - M_PI) + sin(X + M_PI) + * \endcode + * |OVP_DocEnd_BoxAlgorithm_SimpleDSP_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SimpleDSP_Miscellaneous| + * The equation can use at most 16 variables, for 16 input signals. + * The variable names are the 16 first letters of the alphabet, i.e. 'a' (or 'A') to 'p' (or 'P') matches inputs 1 to 16. + * \b NB : The first input variable can be named 'x' or 'X'. + * + * Here is a list of supported functions/operators : + * + * - Operators + * - + + * - - + * - * + * - / + * + * - Unary functions + * - abs + * - acos + * - asin + * - atan + * - ceil + * - cos + * - exp + * - floor + * - log + * - log10 + * - sin + * - sqrt + * - tan + * + * - Binary function + * - pow + * + * - Comparison operators + * - > + * - >= + * - < + * - <= + * - == + * - = (equivalent to ==) + * - != + * - <> (equivalent to !=) + * + * - Boolean operators + * - & as \e and + * - && also as \e and + * - | as \e or + * - || also as \e or + * - ! as \e not + * - ~ as \e xor + * - ^ also as \e xor + * + * - ternary operator + * - ? : + * + * There are also a few defined constants : + * + * - M_PI + * - M_PI_2 + * - M_PI_4 + * - M_1_PI + * - M_2_PI + * - M_2_SQRTPI + * - M_SQRT2 + * - M_SQRT1_2 + * - M_E + * - M_LOG2E + * - M_LOG10E + * - M_LN2 + * - M_LN10 + * + * (note : their meaning is the same as the constants of the same name in math.c) + * + * Furthermore, the equation parser is totally case-insensitive. So you can write "COS(m_pi+x)" or "cos(M_PI+X)", it doesn't matter. + * + * Don't worry about the whitespaces and blank characters, they are automatically skipped by the equation parser. + * That means, for instance, that both "X+1" and "X + 1" work. + * + * This plugin implements basic constant folding. That means that when the plugin analyses the equation, + * if it can compute some parts of it before compilation, it will. For now, it does not support rational + * equations simplification. + * |OVP_DocEnd_BoxAlgorithm_SimpleDSP_Miscellaneous| + */ + +/* + Since the equation is translated into a set of function calls, it is quite slower than it would be if the equation was directly compiled into machine code. Consequently, the plugin uses a number of "built-in" simple equations, which will achieve significantly faster execution times. + + Those equations are : + - X (identity) + - X*X or pow(X,2) + - X + Constant + - X - Constant + - X * Constant + - X / Constant + - Unaryfunction(X), where Unaryfunction is any of the previously introduced unary functions. +*/ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SpatialFilter.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SpatialFilter.dox-part new file mode 100644 index 0000000..036c5dc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SpatialFilter.dox-part @@ -0,0 +1,117 @@ +/** + * \page BoxAlgorithm_SpatialFilter Spatial filter +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpatialFilter_Description| + * The spatial filter generates a number of output channels from another number of input + * channels, each output channel being a linear combination of the input channels. + * For example, lets say ICj is the jth input channel, OCk is the + * kth output channel, and Sjk is the coefficient for the jth input + * channel and kth output channel in the Spatial filter matrix. + * + * Then the output channels are computed this way : + * OCk = Sum on j ( Sjk * ICj ) + * |OVP_DocEnd_BoxAlgorithm_SpatialFilter_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpatialFilter_Inputs| + * |OVP_DocEnd_BoxAlgorithm_SpatialFilter_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_SpatialFilter_Input1| + * This input contains the input channels to mix. + * |OVP_DocEnd_BoxAlgorithm_SpatialFilter_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpatialFilter_Outputs| + * |OVP_DocEnd_BoxAlgorithm_SpatialFilter_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_SpatialFilter_Output1| + * This output contains the generated channels, mixed from the input channels. + * |OVP_DocEnd_BoxAlgorithm_SpatialFilter_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpatialFilter_Settings| + * |OVP_DocEnd_BoxAlgorithm_SpatialFilter_Settings| + + * |OVP_DocBegin_BoxAlgorithm_SpatialFilter_Setting1| + * This setting contains a flat view of the spatial filter matrix. The coefficient orders is as follows : + * all the coefficients for the first output followed by all the coefficients for the second output and so on.. + * |OVP_DocEnd_BoxAlgorithm_SpatialFilter_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_SpatialFilter_Setting2| + * Number of output channels to generate + * |OVP_DocEnd_BoxAlgorithm_SpatialFilter_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_SpatialFilter_Setting3| + * Number of input channels to compute from + * |OVP_DocEnd_BoxAlgorithm_SpatialFilter_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_SpatialFilter_Setting4| + * Filter matrix. You can alternatively provide the filter coefficients as an ASCII file. + * |OVP_DocEnd_BoxAlgorithm_SpatialFilter_Setting4| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpatialFilter_Examples| + * Let's consider the following example : + * - Input channels list: C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 (10 channels) + * - Spatial filter coefficients: 4 0 -1 0 -1 -1 0 0 -1 0 0 4 0 -1 0 0 -1 -1 0 -1 (20 values) + * - Number of output channels: 2 + * - Number of input channels: 10 + * + * The output channels becomes : + * \code + * OC1 = 4 * C3 + 0 * C4 + (-1) * FC3 + 0 * FC4 + (-1) * C5 + (-1) * C1 + 0 * C2 + 0 * C6 + (-1) * CP3 + 0 * CP4 + * = 4 * C3 - FC3 - C5 - C1 - CP3 + * + * OC2 = 0 * C3 + 4 * C4 + 0 * FC3 + (-1) * FC4 + 0 * C5 + 0 * C1 + (-1) * C2 + (-1) * C6 + 0 * CP3 + (-1) * CP4 + * = 4 * C4 - FC4 - C2 - C6 - CP4 + * \endcode + * + * This is basically a Surface Laplacian around C4 and C5. + * + * |OVP_DocEnd_BoxAlgorithm_SpatialFilter_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpatialFilter_Miscellaneous| + * + * For large filters, it is somewhat faster to provide the matrix in an ASCII file than having the coefficients in scenario.xml directly. + * If a file is used, the filter size is read from the file and the other parameters of the box are ignored. + * + * To provide the filter matrix as a file, the format is the same as is used for storing electrode localizations. E.g. for 3x3 identity matrix, the file would be + * + * \code + * [ + * [ "row1" "row2" "row3" ] + * [ "col1" "col2" "col3" ] + * ] + * [ + * [ 1 0 0 ] + * ] + * [ + * [ 0 1 0 ] + * ] + * [ + * [ 0 0 1 ] + * ] + * \endcode + * + * |OVP_DocEnd_BoxAlgorithm_SpatialFilter_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SpectralAnalysis.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SpectralAnalysis.dox-part new file mode 100644 index 0000000..fe9a4cf --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SpectralAnalysis.dox-part @@ -0,0 +1,125 @@ +/** + * \page BoxAlgorithm_SpectralAnalysis Spectral analysis +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysis_Description| + + The Spectral Analysis box performs spectrum computations on incoming signals and possible outputs include the spectrum amplitude (the power of the signal in a number of frequency bands), as well as its phase, real part and imaginary part. + Output computations may be enabled/disabled from the settings dialogue box. The analysis is performed using a Fast Fourier Transform . + Do not forget to apply a \ref Doc_BoxAlgorithm_Windowing step before spectral analysis. + + Considering an input signal \f$ X \in \mathbb{R}^{C \times N} \f$, composed of \f$ C \f$ channels and \f$ N \f$ temporal samples, this plugin computes the spectrum of this signal \f$ \Phi \in \mathbb{C}^{C \times F} \f$, composed of \f$ C \f$ channels and \f$ F \f$ frequencies. + Input signal being real, the spectrum exhibits conjugate symmetry: consequently, only half of the spectrum is returned with \f$ F = \left\lfloor N/2 \right\rfloor + 1 \f$. + For the \f$ c^{ \text{th} } \f$ channel and the \f$ f^{ \text{th} } \f$ frequency, the spectrum is defined as: + \f[ \Phi(c,f) = \Phi_r(c,f) + \mathsf{i} \times \Phi_i(c,f) = \left| \Phi(c,f) \right| \times e^{\mathsf{i} \arg(\Phi(c,f))} \f] + with \f$ \mathsf{i} \f$ being the imaginary unit. + + Using these notations, for the \f$ c^{ \text{th} } \f$ channel, the Parseval's Theorem gives: + \f[ \sum_{n=0}^{N-1} \left| X(c,n) \right|^2 = \frac{1}{N} \sum_{f=0}^{F-1} \left| \Phi(c,f) \right|^2 \f] + with \f$ \left| \Phi(c,f) \right|^2 = \Phi_r(c,f)^2 + \Phi_i(c,f)^2 \f$. + + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysis_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysis_Inputs| + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysis_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysis_Input1| + + An input multichannel signal \f$ X \in \mathbb{R}^{C \times N} \f$, composed of \f$ C \f$ channels and \f$ N \f$ temporal samples. + + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysis_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysis_Outputs| + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysis_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysis_Output1| + + An output spectral amplitude (absolute value) \f$ \left| \Phi \right| \in \mathbb{R}^{C \times F} \f$. + + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysis_Output1| + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysis_Output2| + + An output spectral phase \f$ \arg(\Phi) \in \mathbb{R}^{C \times F} \f$, in radians. + + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysis_Output2| + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysis_Output3| + + An output real part of the spectrum \f$ \Phi_r \in \mathbb{R}^{C \times F} \f$. + + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysis_Output3| + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysis_Output4| + + An output imaginary part of the spectrum \f$ \Phi_i \in \mathbb{R}^{C \times F} \f$. + + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysis_Output4| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysis_Settings| + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysis_Settings| + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysis_Setting1| + + Activate or not the Amplitude output. + + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysis_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysis_Setting2| + + Activate or not the Phase output. + + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysis_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysis_Setting3| + + Activate or not the Real Part output. + + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysis_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysis_Setting4| + + Activate or not the Imaginary Part output. + + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysis_Setting4| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysis_Examples| +Practical example : visualising the power spectrum of a signal. + + Let's use a Signal Oscillator box to generator sinusoidal signals on one channel. Next we add a Spectral Analysis box and connect boxes together. We make sure the 'Amplitude' of the signal is computed by checking the appropriate setting in the settings dialog box (see image below). Finally, we connect the 'Amplitude' output connector of the Spectral Analysis box to the input connector of a Power Spectrum Display box. The player may now be launched to visualize the power spectrum of the signal. + + \image html spectralanalysis_online.png "Visualising the power spectrum of sinusoidal signals." + \image latex spectralanalysis_online.png "Visualising the power spectrum of sinusoidal signals." width=8cm + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysis_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectralAnalysis_Miscellaneous| + + To verify the Parseval's Theorem, in version 1.1, spectra have been multiplied by \f$ \sqrt{2} \f$ with respect the previous version 1.0. + DC bin and Nyquist bin (when \f$ N \f$ is even) are not concerned by this correction. + + * |OVP_DocEnd_BoxAlgorithm_SpectralAnalysis_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SpectrumAverage.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SpectrumAverage.dox-part new file mode 100644 index 0000000..3667e66 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_SpectrumAverage.dox-part @@ -0,0 +1,68 @@ +/** + * \page BoxAlgorithm_SpectrumAverage Spectrum Average +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectrumAverage_Description| + * This box can be used in conjunction with the \ref Doc_BoxAlgorithm_SpectralAnalysis and + * the \ref Doc_BoxAlgorithm_FrequencyBandSelector boxes in order to compute a power in specific + * frequency bands of a spectrum. The output is a column matrix giving a single value for each + * channel : the actual average power of the spectrum. You can may want to use these values + * with the \ref Doc_BoxAlgorithm_SimpleDSP to get ratios. + * |OVP_DocEnd_BoxAlgorithm_SpectrumAverage_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectrumAverage_Inputs| + * |OVP_DocEnd_BoxAlgorithm_SpectrumAverage_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_SpectrumAverage_Input1| + * This input should connect to a spectrum stream, either filtered with the + * \ref Doc_BoxAlgorithm_FrequencyBandSelector box or not. + * |OVP_DocEnd_BoxAlgorithm_SpectrumAverage_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectrumAverage_Outputs| + * |OVP_DocEnd_BoxAlgorithm_SpectrumAverage_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_SpectrumAverage_Output1| + * The output is a column matrix giving a single value for each + * channel : the actual average power of the spectrum. + * |OVP_DocEnd_BoxAlgorithm_SpectrumAverage_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectrumAverage_Settings| + * |OVP_DocEnd_BoxAlgorithm_SpectrumAverage_Settings| + + * |OVP_DocBegin_BoxAlgorithm_SpectrumAverage_Setting1| + * The \ref Doc_BoxAlgorithm_FrequencyBandSelector outputs a spectrum with + * all initial frequency band represented. The bands that were not selected + * just have a 0 instead of their value. Consequently, you can use this settings + * to tell the box if the 0s contained in the spectrum should be part of the + * mean or not. + * |OVP_DocEnd_BoxAlgorithm_SpectrumAverage_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectrumAverage_Examples| + * |OVP_DocEnd_BoxAlgorithm_SpectrumAverage_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SpectrumAverage_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_SpectrumAverage_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_StimulationBasedEpoching.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_StimulationBasedEpoching.dox-part new file mode 100644 index 0000000..b170fb8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_StimulationBasedEpoching.dox-part @@ -0,0 +1,207 @@ +/** + * \page BoxAlgorithm_StimulationBasedEpoching Stimulation based epoching +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationBasedEpoching_Description| + The aim of this box it to select some signal near a specific event. The event + is sent to the box in the form of an OpenViBE Stimulation. The author can + configure the duration of the selected signal and the offset of this selection + as regarding to the stimulation. For instance, it is possible to start the selection + a few hundreds of milliseconds after the event, or even a few hundreds of + milliseconds before the event. + * |OVP_DocEnd_BoxAlgorithm_StimulationBasedEpoching_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationBasedEpoching_Inputs| + * |OVP_DocEnd_BoxAlgorithm_StimulationBasedEpoching_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_StimulationBasedEpoching_Input1| + This input should receive the signal that contains the epoch to extract. + It is possible to pass either continuous signal or discontinuous signal. + However, it is good to know how it is expected to work before trying to + connect discontinuous signal. + * |OVP_DocEnd_BoxAlgorithm_StimulationBasedEpoching_Input1| + + * |OVP_DocBegin_BoxAlgorithm_StimulationBasedEpoching_Input2| + This input should receive the stimulation that triggers a new + epoching. Any stimulation other than the one specified in the settings + will be silently ignored. + * |OVP_DocEnd_BoxAlgorithm_StimulationBasedEpoching_Input2| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationBasedEpoching_Outputs| + * |OVP_DocEnd_BoxAlgorithm_StimulationBasedEpoching_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_StimulationBasedEpoching_Output1| + This output will send the selected epochs of signal. This output + stream is discontinuous by design meaning that successive epochs are + not connected in time. It is possible to later re-epoch the output + signals if needed. + * |OVP_DocEnd_BoxAlgorithm_StimulationBasedEpoching_Output1| + + * |OVP_DocBegin_BoxAlgorithm_StimulationBasedEpoching_Output2| + This output sends a stimulation at the beginning of the selected epoch. + This output is deprecated and should not be used anymore. + * |OVP_DocEnd_BoxAlgorithm_StimulationBasedEpoching_Output2| + +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationBasedEpoching_Settings| + * |OVP_DocEnd_BoxAlgorithm_StimulationBasedEpoching_Settings| + + * |OVP_DocBegin_BoxAlgorithm_StimulationBasedEpoching_Setting1| + This setting defines the duration of the selected epoch (in seconds). For instance, + if you want to select 600ms of signal, you should enter 0.6 + * |OVP_DocEnd_BoxAlgorithm_StimulationBasedEpoching_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_StimulationBasedEpoching_Setting2| + This setting defines the offset of the epoch as against the stimulation date. + This is where the selection starts. If this offset is greater than 0, then + the signal selection starts after the actual stimulation. If this + offset is less than 0, then the signal selection starts before the actual + stimulation. Refer to \ref Doc_BoxAlgorithm_StimulationBasedEpoching_Miscellaneous for + more detailed examples + * |OVP_DocEnd_BoxAlgorithm_StimulationBasedEpoching_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_StimulationBasedEpoching_Setting3| + This setting defines the stimulation identifier which should trigger + a new epoching. Each time this stimulation is received, a new epocher + starts and a new epoch should be sent. + * |OVP_DocEnd_BoxAlgorithm_StimulationBasedEpoching_Setting3| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationBasedEpoching_Examples| + In the case of motor imagery, the user is usually instructed to imagine + either left or right hand movement. This mental task typically runs for + 5 seconds. So selecting the signal block related to the imagination + of left hand movement can be done with this box using the following + parameters : + - duration : 5 seconds + - offset : 0 second + - stimulation : OVTK_GDF_Left + + In case you'd want to avoid the first half second (because it could + reflect a phase where the user is starting to perform the task) + and wand to avoir the last half second (because it could reflect a phase + where the user is exhausted and does not perform the taks optimally), then + you could use the following parameters : + - duration : 4 seconds + - offset : 0.5 seconds + - stimulation : OVTK_GDF_Left + * |OVP_DocEnd_BoxAlgorithm_StimulationBasedEpoching_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationBasedEpoching_Miscellaneous| +1. Continuous signal + +Suppose that we want to grab 1 second of signal following a specific stimulation code. +Suppose that the actual stimulation happens at t=3.5 and t=6. Then the following figure +illustrate how epochs will be built. (Ix represents the xth input epoch and +Ox represents the xth output epoch) + +\verbatim + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +input = | I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I7 | | I9 | ... + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ + +----+ +----+ +output = | O1 | | O2 | ... + +----+ +----+ + +time = 1 2 3 4 5 6 7 8 9 +stim = ^ ^ +\endverbatim + +Suppose that we want to grab 3 seconds of signal beginning 1 second before a specific stimulation code. +Suppose that the actual stimulation happens at t=1.5 and t=6. Then the following figure +illustrate how epochs will be built. (Ix represents the xth input epoch and +Ox represents the xth output epoch) + +\verbatim + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +input = | I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I7 | | I9 | ... + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ + +------------------+ +------------------+ +output = | O1 | | O2 | ... + +------------------+ +------------------+ + +time = 1 2 3 4 5 6 7 8 9 +stim = ^ ^ +\endverbatim + +Overlapping epochs would also work as defined on the following example... +Suppose that we want to grab 3 seconds of signal beginning 1 second before a specific stimulation code. +Suppose that the actual stimulation happens at t=1.5, t=2 and t=6. Then the following figure +illustrate how epochs will be built. (Ix represents the xth input epoch and +Ox represents the xth output epoch) + +\verbatim + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +input = | I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I7 | | I9 | ... + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ + +------------------+ +------------------+ + | O1 | | O3 | +output = +------------------+ +------------------+ .... + +------------------+ + | O2 | + +------------------+ + +time = 1 2 3 4 5 6 7 8 9 +stim = ^ ^ ^ +\endverbatim + +2. Discontinuous signal + +The case where input signal is not continuous (for instance, the signal has already been epoched with +either a \ref Doc_BoxAlgorithm_StimulationBasedEpoching or a \ref Doc_BoxAlgorithm_TimeBasedEpoching box) +can be tricky... Indeed, it is not possible to join input epochs correctly. The epoching only consists +in signal extraction from an individual input chunk. + +For instance, suppose the following input signal (Ix represents the xth input epoch) : + +\verbatim + +------------------+ +------------------+ +----- +input = | I1 | | I2 | | ... + +------------------+ +------------------+ +----- +time = 1 2 3 4 5 6 7 8 9 +\endverbatim + +Suppose that we want to grab 1 second of signal following a specific stimulation code. +Suppose that the actual stimulation happens at t=1, t=2, t=4.5 and t=6.5. Then the following figure +illustrate how epochs will be built. (Ix represents the xth input epoch and +Ox represents the xth output epoch) + +\verbatim + +------------------+ +------------------+ +----- +input = | I1 | | I2 | | ... + +------------------+ +------------------+ +----- + +----+ +----+ +----+ +output = | O1 | | O2 | | O3 | ... + +----+ +----+ +----+ + +time = 1 2 3 4 5 6 7 8 9 +stim = ^ ^ ^ ^ +\endverbatim + +In this case, note that the last stimulation at t=6.5 can not generate a valid epoch. Indeed, the input +signal does not cover the time period from t=6.5 to t=7.5 so no epoch should be generated. + * |OVP_DocEnd_BoxAlgorithm_StimulationBasedEpoching_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_TemporalFilter.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_TemporalFilter.dox-part new file mode 100644 index 0000000..f6d0fde --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_TemporalFilter.dox-part @@ -0,0 +1,83 @@ +/** + * \page BoxAlgorithm_TemporalFilter Temporal Filter +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Description| + This plugin is used to filter the input signal. This plugin allows the selection of the kinf of filter (Butterworth, Chebyshev, Yule-Walker), + the kind of filter (low-pass, high-pass, band-pass, band-stop), the low or/and the high edge of the filter, and the passband ripple for the Chebyshev filter. + * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Inputs| + * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Input1| + The input signal. + * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Outputs| + * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Output1| + The filtered signal. + * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Settings| + * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Settings| + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Setting1| + Select the name of filter between Butterworth, Chebyshev and Yule-Walker. + * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Setting2| + Select the kind of filter between low-pass, high-pass, band-pass, band-stop. + * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Setting3| + Order \f$ n \f$ of the filter, with \f$ n \geq 1 \f$. + * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Setting4| + Low cut-off frequency \f$ f_1 > 0 \f$ for high-pass, band-pass and band-stop filters (not used with low-pass filter). + Low cut-off frequency can not be above Nyquist-Shannon criteria (half of the sampling rate). + * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Setting5| + High cut-off frequency \f$ f_2 > 0 \f$ for low-pass, band-pass and band-stop filters (not used with high-pass filter). For band-pass and band-stop filters, \f$ f_1 < f_2 \f$. + High cut-off frequency can not be above Nyquist-Shannon criteria (half of the sampling rate). + * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Setting6| + If Chebyshev filter is selected, pass band ripple in dB is a necessary information. + * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Setting6| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Examples| + Let's consider our input signal is very noisy (50 Hz). + To filter this signal, select a Low pass Butterworth filter of 4th order and High Edge equal to 30 Hz for example. + * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TemporalFilter_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_TemporalFilter_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_TimeBasedEpoching.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_TimeBasedEpoching.dox-part new file mode 100644 index 0000000..28adbde --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_TimeBasedEpoching.dox-part @@ -0,0 +1,87 @@ +/** + * \page BoxAlgorithm_TimeBasedEpoching Time based epoching +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TimeBasedEpoching_Description| + * The time based epoching box generates 'epochs', i.e. signal 'slices' which length is configurable, as is the time offset between two consecutive epochs. This box has one input and one output connectors, both of which are of 'signal' type. This box is essential to other signal processing boxes when the size of data blocks being forwarded to them is not significant enough. + * |OVP_DocEnd_BoxAlgorithm_TimeBasedEpoching_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TimeBasedEpoching_Inputs| + * |OVP_DocEnd_BoxAlgorithm_TimeBasedEpoching_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_TimeBasedEpoching_Input1| + * Input signal #1. + * |OVP_DocEnd_BoxAlgorithm_TimeBasedEpoching_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TimeBasedEpoching_Outputs| + * |OVP_DocEnd_BoxAlgorithm_TimeBasedEpoching_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_TimeBasedEpoching_Output1| + * Epoched signal #1. + * |OVP_DocEnd_BoxAlgorithm_TimeBasedEpoching_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TimeBasedEpoching_Settings| + * |OVP_DocEnd_BoxAlgorithm_TimeBasedEpoching_Settings| + + * |OVP_DocBegin_BoxAlgorithm_TimeBasedEpoching_Setting1| + * Length of epoched signal #1 + * |OVP_DocEnd_BoxAlgorithm_TimeBasedEpoching_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_TimeBasedEpoching_Setting2| + * Time interval between two consecutive epochs for signal #1 + * |OVP_DocEnd_BoxAlgorithm_TimeBasedEpoching_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TimeBasedEpoching_Examples| +Practical example : apply time based epoching to compute the power spectrum of a signal + + For the spectral analysis to work properly, signal data must come in chunks big enough for the analysis to be meaningful. Let's see how the time-based epoching box can help to improve the power spectrum computation of a signal. + + First, we add a Signal Oscillator box to a scenario, connect it to a Spectral Analysis box, and connect the Amplitude output connector to the + input of a Power Spectrum Display box. Let's use default Sinus Oscillator settings (512Hz sampling frequency, data blocks size of 32 samples) and + make sure the Amplitude setting is enabled in the Spectral Analysis box. Now we can launch the player : the power spectrum is very coarse. + This is because the Sinus Oscillator generates small data blocks (32/512 = 1/16th of a second per block) compared to the periods of sinusoids making up the signal. The spectral analysis yields very coarse results when working on such blocks (see image below). + + \image html timebasedepoching_1.png "Coarse power spectrum computation due to small data blocks." + \image latex timebasedepoching_1.png "Coarse power spectrum computation due to small data blocks." width = 10cm + + One way to correct this problem is to increase the data blocks size. Let's send bigger blocks by setting their size to 512 samples. When launching the player again, the power spectrum should be much finer than before, since the spectral analysis works on blocks representing 1 second of signal. However, notice how the spectrum is only refreshed at 1Hz now. This solution is not satisfactory. + + \image html timebasedepoching_2.png "Finer power spectrum computation by sending bigger chunks." + \image latex timebasedepoching_2.png "Finer power spectrum computation by sending bigger chunks." width=10cm + + Now we insert a Time based epoching box before the Spectral Analysis. We reset the Sinus Oscillator settings to 512 samples a second and blocks of 32 samples. Let's now setup the epoching box : we are going to generate epochs of 1 second every 1/16th of a second. Now let's launch the player again : the power spectrum is refined and updated regularly. + + \image html timebasedepoching_3.png "Epoching 1-second chunks to refine spectrum computations" + \image latex timebasedepoching_3.png "Epoching 1-second chunks to refine spectrum computations" width=10cm + + The stimulation based epoching box is similar to time based epoching, only it generates epochs when a given stimulation is received. Thus, the box has two input connectors : one for signals and another for stimulations. Settings include epoch size, epoch offset (delay when epoching should start after the target stimulation is received), and stimulation identifier. + + * |OVP_DocEnd_BoxAlgorithm_TimeBasedEpoching_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_TimeBasedEpoching_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_TimeBasedEpoching_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Windowing.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Windowing.dox-part new file mode 100644 index 0000000..50a06b6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_Windowing.dox-part @@ -0,0 +1,62 @@ +/** + * \page BoxAlgorithm_Windowing Windowing +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Windowing_Description| + * This plugin is used to apply a window to the input signal. + * This plugin allows the selection of the kind of window + * (None, Hamming, Hanning, Hann, Blackman, Triangular, Square Root). + * |OVP_DocEnd_BoxAlgorithm_Windowing_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Windowing_Inputs| + * |OVP_DocEnd_BoxAlgorithm_Windowing_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_Windowing_Input1| + * |OVP_DocEnd_BoxAlgorithm_Windowing_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Windowing_Outputs| + * |OVP_DocEnd_BoxAlgorithm_Windowing_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_Windowing_Output1| + * |OVP_DocEnd_BoxAlgorithm_Windowing_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Windowing_Settings| + * |OVP_DocEnd_BoxAlgorithm_Windowing_Settings| + + * |OVP_DocBegin_BoxAlgorithm_Windowing_Setting1| + * Select the name of window between: None(equivalent to a rectangular window), Hamming, Hann, Hanning (equivalent to Hann window), Blackman, + * Triangular and Square Root. + * |OVP_DocEnd_BoxAlgorithm_Windowing_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Windowing_Examples| + * Let's consider our input signal. + * To prevent rebound in spectrum analysis due to the square root + * windowing, select a Hanning window for example. + * |OVP_DocEnd_BoxAlgorithm_Windowing_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Windowing_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_Windowing_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_XDAWNTrainer.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_XDAWNTrainer.dox-part new file mode 100644 index 0000000..a7f6204 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_XDAWNTrainer.dox-part @@ -0,0 +1,96 @@ +/** + * \page BoxAlgorithm_XDAWNTrainer xDAWN Trainer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainer_Description| + * This box can be used in order to compute a spatial filter in order to enhance the + * detection of evoked response potentials. In order to compute such filter, this box + * needs to receive the whole contain of a session on the first hand, and a succession + * of evoked response potentials on the other hand. It then computes the averaged evoked + * response potential computes the spatial filter that makes this averaged potential + * appear in the whole signal. This can be used e.g. for better P300 signal detection. + * + * It is important to consider the fact that this box will have best results for a + * reasonably big number of input channels, possibly all over the scalp (areas where + * the evoked response potential can not be seen will be naturally used as references + * to reduce noise). The spatial filter results in space reduction to only keep significant + * chanels for later detection. Consider using at least 4 times more input channels than + * the number of output channels you want. For example, reducing 16 electrodes to 3 channels + * for P300 detection is OK. + * + * For more details about xDAWN, see Rivet et al. 2009 + * or in case this links disapears, this website. + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainer_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainer_Inputs| + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainer_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainer_Input1| + * This input receives the exepriment stimulations. As soon as the "train" + * stimulation is received, the spatial filter is computed. + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainer_Input1| + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainer_Input2| + * This input should receive the whole signal of the session. + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainer_Input2| + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainer_Input3| + * This input should receive the multiple evoked response potentials. + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainer_Input3| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Outputs| + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_CSPSpatialFilterTrainer_Output1| + The xDAWN Trainer outputs the stimulation OVTK_StimulationId_TrainCompleted when the training process was successfull. No output is produced if the process failed. + * |OVP_DocEnd_BoxAlgorithm_CSPSpatialFilterTrainer_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainer_Settings| + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainer_Settings| + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainer_Setting1| + * This setting contains the stimulation to use to trigger the training process. + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainer_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainer_Setting2| + * This setting tells the box what configuration file to generate. This configuration file can + * be used to set the correct values of a \ref Doc_BoxAlgorithm_SpatialFilter box. + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainer_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainer_Setting3| + * This setting tells how many dimension should be kept out of the spatial filter. + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainer_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainer_Setting4| + * If true, the file written will be a box configuration override especially for a spatial filter box. Otherwise, it will be an ASCII matrix. + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainer_Setting4| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainer_Examples| + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainer_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_XDAWNTrainer_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_XDAWNTrainer_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ZeroCrossingDetector.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ZeroCrossingDetector.dox-part new file mode 100644 index 0000000..fb203db --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_ZeroCrossingDetector.dox-part @@ -0,0 +1,100 @@ +/** + * \page BoxAlgorithm_ZeroCrossingDetector Zero-Crossing Detector +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ZeroCrossingDetector_Description| + + Using an hysteresis thresholding, this box detects the zero-crossings of the input, operating on all channels. + + * |OVP_DocEnd_BoxAlgorithm_ZeroCrossingDetector_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ZeroCrossingDetector_Inputs| + * |OVP_DocEnd_BoxAlgorithm_ZeroCrossingDetector_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_ZeroCrossingDetector_Input1| + + The input signal \f$ X \in \mathbb{R}^{C \times N} \f$, composed of \f$ C \f$ sensors and \f$ N \f$ samples. + + * |OVP_DocEnd_BoxAlgorithm_ZeroCrossingDetector_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ZeroCrossingDetector_Outputs| + * |OVP_DocEnd_BoxAlgorithm_ZeroCrossingDetector_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_ZeroCrossingDetector_Output1| + + Zero-crossing signal \f$ Z \in \mathbb{R}^{C \times N} \f$, composed of \f$ C \f$ sensors and \f$ N \f$ samples. + It is defined as 1 for positive zero-crossings (negative-to-positive), -1 for negatives ones (positive-to-negative), 0 otherwise. + + * |OVP_DocEnd_BoxAlgorithm_ZeroCrossingDetector_Output1| + + * |OVP_DocBegin_BoxAlgorithm_ZeroCrossingDetector_Output2| + + For all channels, stimulations mark positive and negatives zero-crossings. + + * |OVP_DocEnd_BoxAlgorithm_ZeroCrossingDetector_Output2| + + * |OVP_DocBegin_BoxAlgorithm_ZeroCrossingDetector_Output3| + + For each channel, the rythm of negative-to-positive zero-crossings is computed in events per min. + + * |OVP_DocEnd_BoxAlgorithm_ZeroCrossingDetector_Output3| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ZeroCrossingDetector_Settings| + * |OVP_DocEnd_BoxAlgorithm_ZeroCrossingDetector_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ZeroCrossingDetector_Setting1| + + This setting defines the value \f$ t \f$ of the hysteresis threshold, to provide a robust detection. + + \image html ZeroCrossingDetector_thresholding.png "Difference between naive and hysteresis sign thresholding" + \image latex ZeroCrossingDetector_thresholding.png "Difference between naive and hysteresis sign thresholding" width=\textwidth + + * |OVP_DocEnd_BoxAlgorithm_ZeroCrossingDetector_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_ZeroCrossingDetector_Setting2| + + This setting defines the length of the time window for the rythm estimation. + + * |OVP_DocEnd_BoxAlgorithm_ZeroCrossingDetector_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_ZeroCrossingDetector_Setting3| + + This setting defines the stimulation id for negative-to-positive crossings. + + * |OVP_DocEnd_BoxAlgorithm_ZeroCrossingDetector_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_ZeroCrossingDetector_Setting4| + + This setting defines the stimulation id for positive-to-negative crossings. + + * |OVP_DocEnd_BoxAlgorithm_ZeroCrossingDetector_Setting4| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ZeroCrossingDetector_Examples| + * |OVP_DocEnd_BoxAlgorithm_ZeroCrossingDetector_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ZeroCrossingDetector_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_ZeroCrossingDetector_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_ChannelRename.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_ChannelRename.rst new file mode 100644 index 0000000..1b30f97 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_ChannelRename.rst @@ -0,0 +1,71 @@ +.. _Doc_BoxAlgorithm_ChannelRename: + +Channel Rename +============== + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA + +.. image:: images/Doc_BoxAlgorithm_ChannelRename.png + +This box renames the input channels with whatever name the author wants. The names +should be separated by a semi-colon ';'. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input matrix", "Signal" + +Input matrix +~~~~~~~~~~~~ + +The input matrix which channels should be renamed. The type of this input can be changed to +signal or spectrum depending on what kind of stream channel to rename. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output matrix", "Signal" + +Output matrix +~~~~~~~~~~~~~ + +The output matrix with renamed channels. The type of this output can be changed to +signal or spectrum depending on what kind of stream channel to rename. + +.. _Doc_BoxAlgorithm_ChannelRename_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "New channel names", "String", "Channel 1;Channel 2" + +New channel names +~~~~~~~~~~~~~~~~~ + +A semi-colon separated list of new channel names. + +.. _Doc_BoxAlgorithm_ChannelRename_Examples: + +Examples +-------- + +Suppose you compute the delta, alpha and beta band power at location Cz and merge the three +streams in a single stream. The resulting stream will handle three channels all named Cz. For +convenience, it could be useful to rename those channels Delta, Alpha and Beta respectively. +In order to achieve this, use a :ref:`Doc_BoxAlgorithm_ChannelRename` with the following setting +value : "Delta;Alpha;Beta" + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_ChannelSelector.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_ChannelSelector.rst new file mode 100644 index 0000000..9266392 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_ChannelSelector.rst @@ -0,0 +1,100 @@ +.. _Doc_BoxAlgorithm_ChannelSelector: + +Channel Selector +================ + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA + +.. image:: images/Doc_BoxAlgorithm_ChannelSelector.png + +Selection can be based on channel name (case-sensitive) or index starting from 0 + +This box allows to restrict outgoing signal data to a subset of incoming data based on a list of channels. +Channels may be identified by their index, their name (the case matters), or a mix of both. Additionally, +the channels can be rejected instead of being selected. +The name of the box displayed in the designer is the channel list (first setting). It allows the user to see directly if the box configuration is correct. +However, should the user chose to rename the box manually, further change in the configuration won't be reflected in the name, except if the name is set +back to its default value. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input signal", "Signal" + +Input signal +~~~~~~~~~~~~ + +The input matrix which channels should be selected or rejected. The type of this input can be changed to +Signal, Spectrum or Streamed matrix depending on what kind of stream channel to select. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output signal", "Signal" + +Output signal +~~~~~~~~~~~~~ + +The output matrix with selected or preserved channels. The type of this output can be changed to +signal or spectrum depending on what kind of stream channel to select. + +.. _Doc_BoxAlgorithm_ChannelSelector_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Channel List", "String", ":" + "Action", "Selection method", "Select" + "Channel Matching Method", "Match method", "Smart" + +Channel List +~~~~~~~~~~~~ + +A semi colon separated list of channel identifiers. You can use the index of the channel or the name of the +channel. Also, ranges can be selected specifying first channel identifier, followed by a colon, followed by +the second channel identifier. + +Action +~~~~~~ + +The action to perform on the identifier channel, be : + +- ``select,`` +- ``reject,`` +- ``select`` ``EEG,`` selecting all EEG channels using their names. In this case, Channel List is no more considered. + + + +Channel Matching Method +~~~~~~~~~~~~~~~~~~~~~~~ + +The kind of identification for channel list. + +- ``Smart`` let the box try to detect if the channel identifier is an index or a name +- ``Name`` forces the channel identifiers to be considered as channel names. This can be useful if channel names are numbers. +- ``Index`` forces the channel identifiers to be considered as channel indices. This can be useful if channel names are numbers. + + + +.. _Doc_BoxAlgorithm_ChannelSelector_Examples: + +Examples +-------- + +Suppose you want to select the first 8 channels of an input stream, plus you want the Cz electrode and the last 3 channels. +You would then use the following string : [1:8;Cz;-3:-1]. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_CommonAverageReference.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_CommonAverageReference.rst new file mode 100644 index 0000000..50edd10 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_CommonAverageReference.rst @@ -0,0 +1,33 @@ +.. _Doc_BoxAlgorithm_CommonAverageReference: + +Common Average Reference +======================== + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA + + +.. image:: images/Doc_BoxAlgorithm_CommonAverageReference.png + +Re-referencing the signal to common average reference consists in subtracting from each sample the average value of the samples of all electrodes at this time + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input signal", "Signal" + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output signal", "Signal" + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_ContinuousWaveletAnalysis.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_ContinuousWaveletAnalysis.rst new file mode 100644 index 0000000..401145f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_ContinuousWaveletAnalysis.rst @@ -0,0 +1,159 @@ +.. _Doc_BoxAlgorithm_ContinuousWaveletAnalysis: + +Continuous Wavelet Analysis +=========================== + +.. container:: attribution + + :Author: + Quentin Barthelemy + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_ContinuousWaveletAnalysis.png + +Performs a Time-Frequency Analysis using Continuous Wavelet Transform. + +The Continuous Wavelet Transform (CWT) provides a Time-Frequency representation of an input signal, using Morlet, Paul or derivative of Gaussian wavelets. + +Considering an input signal :math:`X \in \mathbb{R}^{C \times N}`, composed of :math:`C` channels and :math:`N` temporal samples, +this plugin computes the CWT of this signal :math:`\Phi \in \mathbb{C}^{C \times F \times N}`, composed of :math:`C` channels, :math:`F` scales and :math:`N` temporal samples. +For the :math:`c^{ \text{th} }` channel, the :math:`f^{ \text{th} }` scale :math:`s_f` and the :math:`n^{ \text{th} }` sample, the Time-Frequency representation is defined as: + +:math:`\Phi (c,f,n) = \sum_{n'=0}^{N-1} X(c,n') \ \psi^{*} \left( \frac{(n-n') \delta t}{s_f} \right)`, + +where :math:`\psi` is the normalized wavelet, :math:`(.)^{*}` is the complex conjugate and :math:`\delta t` is the sampling period. + +Using the inverse relation between wavelet scale :math:`s_f` and Fourier frequency :math:`\text{freq}_f`, output is finally defined as: + +:math:`\Phi(c,f,n) = \Phi_r(c,f,n) + \mathsf{i} \times \Phi_i(c,f,n) = \left| \Phi(c,f,n) \right| \times e^{\mathsf{i} \arg(\Phi(c,f,n))}`, + +with :math:`\mathsf{i}` being the imaginary unit. + +Output can be visualized with a :ref:`Doc_BoxAlgorithm_InstantBitmap3DStream`. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input signal", "Signal" + +Input signal +~~~~~~~~~~~~ + +An input multichannel signal :math:`X \in \mathbb{R}^{C \times N}`, composed of :math:`C` channels and :math:`N` temporal samples. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Amplitude", "Time-frequency" + "Phase", "Time-frequency" + "Real Part", "Time-frequency" + "Imaginary Part", "Time-frequency" + +Amplitude +~~~~~~~~~ + +An output spectral amplitude (absolute value) :math:`\left| \Phi \right| \in \mathbb{R}^{C \times F \times N}`. + +Phase +~~~~~ + +An output spectral phase :math:`\arg(\Phi) \in \mathbb{R}^{C \times F \times N}`, in radians. + +Real Part +~~~~~~~~~ + +An output real part of the spectrum :math:`\Phi_r \in \mathbb{R}^{C \times F \times N}`. + +Imaginary Part +~~~~~~~~~~~~~~ + +An output imaginary part of the spectrum :math:`\Phi_i \in \mathbb{R}^{C \times F \times N}`. + +.. _Doc_BoxAlgorithm_ContinuousWaveletAnalysis_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Wavelet type", "Continuous Wavelet Type", "Morlet wavelet" + "Wavelet parameter", "Float", "4" + "Number of frequencies", "Integer", "60" + "Highest frequency", "Float", "35" + "Frequency spacing", "Float", "12.5" + +Wavelet type +~~~~~~~~~~~~ + +This setting defines the type of the wavelet: + + +- Morlet: + + +:math:`\psi_0 (n) = \pi^{1/4} e^{\mathsf{i} \omega_0 n} e^{-n^2 / 2}` + + +- Paul: + + +:math:`\psi_0 (n) = \frac{2^m \mathsf{i}^m m!}{\sqrt{\pi(2m)!}} (1-\mathsf{i} n)^{-(m+1)}` + + +- derivative of Gaussian: + + +:math:`\psi_0 (n) = \frac{(-1)^{m+1}}{\sqrt{\Gamma(m+\frac{1}{2})}} \frac{d^m}{d n^m} (e^{-n^2 / 2})` + + +Wavelet parameter +~~~~~~~~~~~~~~~~~ + +This setting defines the wavelet parameter: + + +- Morlet wavelet: nondimensional frequency :math:`\omega_0`, real positive parameter value. Values between 4.0 and 6.0 are typically used. + + + +- Paul wavelet: order :math:`m`, positive integer values inferior to 20. Default value is 4. + + + +- Derivative of Gaussian wavelet: derivative :math:`m`, positive even integer values. Value 2 gives the Marr or Mexican hat wavelet. + + +\n + +Number of frequencies +~~~~~~~~~~~~~~~~~~~~~ + +This setting defines the number of frequencies :math:`F` of the CWT. + +Highest frequency +~~~~~~~~~~~~~~~~~ + +This setting defines the highest frequency :math:`\text{freq}_F` of the CWT. + +Frequency spacing +~~~~~~~~~~~~~~~~~ + +This setting is related to the frequency non-linear spacing of the CWT. + +.. _Doc_BoxAlgorithm_ContinuousWaveletAnalysis_Miscellaneous: + +Miscellaneous +------------- + +Reference: + +C Torrence and GP Compo, *A Practical Guide to Wavelet Analysis*, Bulletin of the American Meteorological Society, vol. 79, pp. 61–78, 1998 + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_Crop.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_Crop.rst new file mode 100644 index 0000000..e9fa6e3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_Crop.rst @@ -0,0 +1,68 @@ +.. _Doc_BoxAlgorithm_Crop: + +Crop +==== + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA/IRISA + +.. image:: images/Doc_BoxAlgorithm_Crop.png + +Minimum or maximum or both limits can be specified + +This box allows to set minimum and/or maximum thresholds to incoming data. Values lying outside the allowed range are cropped to it. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input matrix", "Streamed matrix" + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output matrix", "Streamed matrix" + +.. _Doc_BoxAlgorithm_Crop_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Crop method", "Crop method", "Min/Max" + "Min crop value", "Float", "-1" + "Max crop value", "Float", "1" + +Crop method +~~~~~~~~~~~ + +Method to use to crop incoming data. A minimum and/or a maximum threshold(s) may be defined. + +Min crop value +~~~~~~~~~~~~~~ + +Minimum threshold. + +Max crop value +~~~~~~~~~~~~~~ + +Maximum threshold. + +.. _Doc_BoxAlgorithm_Crop_Miscellaneous: + +Miscellaneous +------------- + +Note : the type of input data may be changed. Allowed types include streamed matrix, feature vector, signal and spectrum. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_EpochAverage.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_EpochAverage.rst new file mode 100644 index 0000000..ff26f9d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_EpochAverage.rst @@ -0,0 +1,212 @@ +.. _Doc_BoxAlgorithm_EpochAverage: + +Epoch average +============= + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA/IRISA + +.. image:: images/Doc_BoxAlgorithm_EpochAverage.png + +This box can average matrices of different types including signal, spectrum or feature vectors + +This box offers several methods of averaging for epoched streams. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input epochs", "Streamed matrix" + +The input type of this box can be changed. Its type must be derived of +type :ref:`Doc_Streams_StreamedMatrix` in order to be parsed by the input +reader. If the author changes the input type, the output type will +be changed the same way. + +Input epochs +~~~~~~~~~~~~ + +This input receives the input streamed matrix to average. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Averaged epochs", "Streamed matrix" + +The output type of this box can be changed. Its type must be derived of +type :ref:`Doc_Streams_StreamedMatrix` in order for the writer to format +the output chunks. If the author changes the output type, the input +type will be changed the same way. + +Averaged epochs +~~~~~~~~~~~~~~~ + +This output sends the averaged streamed matrix. Averaging method is done +according to the box settings. + +.. _Doc_BoxAlgorithm_EpochAverage_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Averaging type", "Epoch Average method", "Moving epoch average" + "Epoch count", "Integer", "4" + +Averaging type +~~~~~~~~~~~~~~ + +This setting gives the method to use in order to average the input +matrices. It can be of two types : + +- *Moving average* : in this case, the averaging is done at + +every input reception on the last few buffers, starting as soon +as enough input has been received. + +- *Moving average (Immediate)* : in this case, the averaging is done at + +every input reception on the last few buffers, starting immediately. When +the number of received buffer is lower than the wished number of epochs, the +average is computed on this very few number of input buffers. + +- *Epoch block average* : in this case, the averaging + +is done on a number of epochs (see next setting). Once this exact +number of input is received, the average is computed and output. + +- *Cumulative average* : in this case, the averaging + +is done on an infinite number of epochs starting from the first +received buffer to the last received buffer. This can be **very** +memory consuming ! + +Epoch count +~~~~~~~~~~~ + +This setting tells the box how much buffer it should use in order to +compute the average. + +.. _Doc_BoxAlgorithm_EpochAverage_Examples: + +Examples +-------- + +Let's study two cases. First, suppose you have such box with +*Epoch block average* set and *four* epochs. +The input stream is as follows : + +.. code:: + + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ + | I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I8 | | I9 | ... + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ + +The output stream will look like this : + +.. code:: + + +----+ +----+ + | O1 | | O2 | ... + +----+ +----+ + +where ``O1`` is the average of ``I1,`` ``I2,`` ``I3`` and ``I4`` and +where ``O2`` is the average of ``I5,`` ``I6,`` ``I7`` and ``I8.`` + +Now consider the case where you configured this box with +*Moving average* and *four* epochs. Given the +same input stream : + +.. code:: + + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ + | I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I8 | | I9 | ... + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ + +The output stream will look like this : + +.. code:: + + +----+ +----+ +----+ +----+ +----+ +----+ + | O1 | | O2 | | O3 | | O4 | | O5 | | O6 | ... + +----+ +----+ +----+ +----+ +----+ +----+ + +where : + +- ``O1`` is the average of ``I1,`` ``I2,`` ``I3`` and ``I4`` +- ``O2`` is the average of ``I2,`` ``I3,`` ``I4`` and ``I5`` +- ``O3`` is the average of ``I3,`` ``I4,`` ``I5`` and ``I6`` +- ``O4`` is the average of ``I4,`` ``I5,`` ``I6`` and ``I7`` +- etc... + + +Again consider the case where you configured this box with +*Moving average (Immediate)* and *four* epochs. Given the +same input stream : + +.. code:: + + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ + | I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I8 | | I9 | ... + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ + +The output stream will look like this : + +.. code:: + + +----+ +----+ +----+ +----+ +----+ +----+ + | O1 | | O2 | | O3 | | O4 | | O5 | | O6 | ... + +----+ +----+ +----+ +----+ +----+ +----+ + +where : + +- ``O1`` is exactly ``I1`` +- ``O2`` is the average of ``I1`` and ``I2`` +- ``O3`` is the average of ``I1,`` ``I2`` and ``I3`` +- ``O4`` is the average of ``I1,`` ``I2,`` ``I3`` and ``I4`` +- ``O5`` is the average of ``I2,`` ``I3,`` ``I4`` and ``I5`` +- ``O6`` is the average of ``I3,`` ``I4,`` ``I5`` and ``I6`` +- etc... + + +Finally consider the case where you configured this box with +*Cumulative average* and *four* epochs. Given the +same input stream : + +.. code:: + + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ + | I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I8 | | I9 | ... + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ + +The output stream will look like this : + +.. code:: + + +----+ +----+ +----+ +----+ +----+ +----+ + | O1 | | O2 | | O3 | | O4 | | O5 | | O6 | ... + +----+ +----+ +----+ +----+ +----+ +----+ + +where : + +- ``O1`` is exactly ``I1`` +- ``O2`` is the average of ``I1`` and ``I2`` +- ``O3`` is the average of ``I1,`` ``I2`` and ``I3`` +- ``O4`` is the average of ``I1,`` ``I2,`` ``I3`` and ``I4`` +- ``O5`` is the average of ``I1,`` ``I2,`` ``I3,`` ``I4,`` and ``I5`` +- ``O6`` is the average of ``I1,`` ``I2,`` ``I3,`` ``I4,`` ``I5,`` and ``I6`` +- etc... + + + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_FrequencyBandSelector.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_FrequencyBandSelector.rst new file mode 100644 index 0000000..df1ea84 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_FrequencyBandSelector.rst @@ -0,0 +1,69 @@ +.. _Doc_BoxAlgorithm_FrequencyBandSelector: + +Frequency Band Selector +======================= + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA + +.. image:: images/Doc_BoxAlgorithm_FrequencyBandSelector.png + +This box selects a subset of a spectrum matrix, turning all un selected frequency +band to 0. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input spectrum", "Spectrum" + +Input spectrum +~~~~~~~~~~~~~~ + +The input spectrum to select from. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output spectrum", "Spectrum" + +Output spectrum +~~~~~~~~~~~~~~~ + +The modified spectrum with unselected bands turned to 0 + +.. _Doc_BoxAlgorithm_FrequencyBandSelector_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Frequencies to select", "String", "8:12;16:24" + +Frequencies to select +~~~~~~~~~~~~~~~~~~~~~ + +The range of frequencies you want to select. + +.. _Doc_BoxAlgorithm_FrequencyBandSelector_Examples: + +Examples +-------- + +Suppose you have a full band spectrum and that you want to work on alpha band. You can use +a :ref:`Doc_BoxAlgorithm_FrequencyBandSelector` box to select this band for later processing +with the following setting : "8:12". Now suppose you want to work on two bands, for instance +Alpha and the 16-24Hz subset of Beta, you should use the following setting value : "8:12[SEMICOLON]16:24" +with [SEMICOLON] replaced by the actual semicolon charater. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_Identity.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_Identity.rst new file mode 100644 index 0000000..ff50a79 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_Identity.rst @@ -0,0 +1,60 @@ +.. _Doc_BoxAlgorithm_Identity: + +Identity +======== + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA/IRISA + +.. image:: images/Doc_BoxAlgorithm_Identity.png + +This simply duplicates intput on its output + +This box simply duplicates inputs to corresponding outputs in a similar way + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input stream", "Signal" + +This box can have any number of input of any type. Each input has a corresponding +output with the same type. Incoming chunks are simply duplicated to the corresponding output. + +Input stream +~~~~~~~~~~~~ + +The default input for this box. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output stream", "Signal" + +This box can have any number of output of any type. Each output has a corresponding +input with the same type. Incoming chunks are simply duplicated to the corresponding output. + +Output stream +~~~~~~~~~~~~~ + +The default output for this box. + +.. _Doc_BoxAlgorithm_Identity_Examples: + +Examples +-------- + +This box could be used in order to quickly switch between acquisition or file reading mode. +At the very top of the scenario, you would put an identity box with four connectors of type +:ref:`Doc_Streams_ExperimentInfo`, :ref:`Doc_Streams_Signal`, :ref:`Doc_Streams_Stimulation` and +:ref:`Doc_Streams_ChannelLocalization`. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_ReferenceChannel.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_ReferenceChannel.rst new file mode 100644 index 0000000..d5a98ea --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_ReferenceChannel.rst @@ -0,0 +1,68 @@ +.. _Doc_BoxAlgorithm_ReferenceChannel: + +Reference Channel +================= + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA + +.. image:: images/Doc_BoxAlgorithm_ReferenceChannel.png + +Reference channel must be specified as a parameter for the box + +This plugin subtracts the values of the samples from a reference +channel from the other channels' samples. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input signal", "Signal" + +Input signal +~~~~~~~~~~~~ + +The input signal. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output signal", "Signal" + +Output signal +~~~~~~~~~~~~~ + +The resulting signal. + +.. _Doc_BoxAlgorithm_ReferenceChannel_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Channel", "String", "Ref_Nose" + "Channel Matching Method", "Match method", "Smart" + +Channel +~~~~~~~ + +Index of the reference channel in the input stream. + +.. _Doc_BoxAlgorithm_ReferenceChannel_Miscellaneous: + +Miscellaneous +------------- + +The reference channel is kept in the resulting signal. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_RegularizedCSPTrainer.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_RegularizedCSPTrainer.rst new file mode 100644 index 0000000..8168b19 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_RegularizedCSPTrainer.rst @@ -0,0 +1,170 @@ +.. _Doc_BoxAlgorithm_RegularizedCSPTrainer: + +Regularized CSP Trainer +======================= + +.. container:: attribution + + :Author: + Jussi T. Lindgren + :Company: + Inria + +.. image:: images/Doc_BoxAlgorithm_RegularizedCSPTrainer.png + +The box estimates a filter bank of spatial filters using Common Spatial Patterns (CSP) algorithm. The algorithm tries to find a linear transform of the data that +makes the signal conditions (or classes) more distinct, when the data is projected to the matrix of the filters found by the algorithm (i.e. s=Wx, where we +assume x is the signal sample, W is the discovered filter bank, and s a lower-dimensional representation of the sample). The spatial filters are constructed +for two conditions to maximize the variance of the signals of the first condition while at the same time minimizing it for the second condition. +If signal variance contains discriminatory information, CSP filters can be useful in classification situations where designing spatial filter masks +such as Laplacians manually is cumbersome or when it is believed that a filter optimized to the current data/user would produce better +results than using an one-size-fits all filter. + +In principle CSP can be useful in experiments where there is discriminative information in the variance (or power) of the signal conditions, +for example motor imagery or SSVEP. + +The box implements some of the methods described e.g. by Lotte & Guan [1]. Especially, it +allows using the methods called "CSP with Diagonal Loading" and "CSP with Tikhonov Regularization" in the paper. In the approach of +the paper, the filters for condition 1 are found by eigenvector decomposition of inv(Sigma1+rho\*I)\*Sigma2, where Sigma1 and Sigma2 are +empirical covariance matrices for the two conditions, rho the amount of Tikhonov regularization and I an identity matrix. For condition 2, +the formula is the same with the sigmas swapped. The matrices Sigma1 and Sigma2 may be optionally shrunk towards diagonal matrices. + +In situations with more than two conditions, the box implements a one-vs-all approach, where each class gives a Sigma1 in turn, with the +covariances of the other classes combined with a class frequency weighted average to obtain Sigma2. Hence, for k classes, k pairings +are estimated, and out of each pair, a requested amount of filters is selected separately. This results in k times the amount of filters +requested in total. + +To avoid caching the whole dataset in the box, the algorithm tries to estimate the required covariances incrementally. The box supports +a few different incremental ways to compute the covariances. The 'block average' approach takes an average of all the covariances of the incoming +signal chunks, an approach described in [2], whereas the incremental (per sample) method aims to implement Youngs & Cramer +algorithm as described in [3]. Which one gives better results may depend on the situation -- however, +taking an average of covariance matrices is not your usual textbook method for computing covariance over the whole data. + +Finally, the box also presents an option to try to compensate for the effect of changes in the average signal power over time. This is +can be done by enabling 'Trace Normalization' setting. When trace normalization is enabled, each data chunks contribution to +the covariance gets divided by its trace. See miscellaneous notes for details. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Stimulations", "Stimulations" + "Signal condition 1", "Signal" + "Signal condition 2", "Signal" + +Stimulations +~~~~~~~~~~~~ + +This stimulus input is needed to indicate the end of a recording session (or end of file). It triggers the training/computation of the CSP filters. + +Signal condition 1 +~~~~~~~~~~~~~~~~~~ + +This input expects epoched data for the first condition (e.g. epochs for left hand motor imagery). + +Signal condition 2 +~~~~~~~~~~~~~~~~~~ + +This input expects epoched data for the second condition (e.g. epochs for right hand motor imagery). + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Train-completed Flag", "Stimulations" + +Train-completed Flag +~~~~~~~~~~~~~~~~~~~~ + +The CSP Trainer outputs the stimulation **OVTK_StimulationId_TrainCompleted** when the training process was successful. No output is produced if the process failed. + +.. _Doc_BoxAlgorithm_RegularizedCSPTrainer_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Train Trigger", "Stimulation", "OVTK_GDF_End_Of_Session" + "Spatial filter configuration", "Filename", "" + "Filters per condition", "Integer", "2" + "Save filters as box config", "Boolean", "false" + "Covariance update", "Update method", "Chunk average" + "Trace normalization", "Boolean", "false" + "Shrinkage coefficient", "Float", "0.0" + "Tikhonov coefficient", "Float", "0.0" + +Train Trigger +~~~~~~~~~~~~~ + +The stimulus identifier denoting the end of a recording session or end of file, e.g. OVTK_GDF_End_Of_Session or OVTK_StimulationId_ExperimentStop. + +Spatial filter configuration +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The path and filename of the configuration file in which the computed spatial filters are saved. + +Filters per condition +~~~~~~~~~~~~~~~~~~~~~ + +How many spatial filters should be selected per class. + +Save filters as box config +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If true, the file written will be a box configuration override especially for the spatial filter box. Otherwise, it will be an ASCII matrix. + +Covariance update +~~~~~~~~~~~~~~~~~ + +Method to update the covariances + +Trace normalization +~~~~~~~~~~~~~~~~~~~ + +Is trace normalization done when appending the per-chunk covariances? + +Shrinkage coefficient +~~~~~~~~~~~~~~~~~~~~~ + +The amount of shrinkage, between 0 and 1. It interpolates between the covariance matrices and the diagonal matrix. + +Tikhonov coefficient +~~~~~~~~~~~~~~~~~~~~ + +The amount of Tikhonov regularization, bigger signifies more. This equals parameter rho in the description above. If 0, the method behaves approximately as a regular CSP. + +.. _Doc_BoxAlgorithm_RegularizedCSPTrainer_Miscellaneous: + +Miscellaneous +------------- + +The suitable amount of regularization may depend on the variance of the data. You may need to try different values to find the one that suits your situation best. +Before the CSP training, it may be useful to temporally filter the input data to remove bands which are believed to have no relevant discriminative information. + +Note that the usage of the CSP filters before classification training can make the cross-validation results optimistic, unless strictly non-overlapping parts of the data were used to train the CSP and the classifier (disjoint sets for each). + +The trace normalization can be found in the literature [2]. The idea is to normalize the scale of each chunk in order to +compensate for a possible signal power drift over time during the EEG recording, making each chunks' covariance contribute +similarly to the aggregate regardless of the current chunks average power. + +To get the "CSP with Diagonal Loading" of Lotte & Guan paper [1], set shrinkage to a positive value and Tikhonov to 0. To get the +"CSP with Tikhonov regularization", do the opposite. You can also try a mixture of the two. Note that the Guan & Lotte paper does not appear to use trace normalization. + +To get the CSP resembling the one in the Muller-Gerkin paper, set Trace Normalization to True and the Covariance method to Chunk Average, with no regularization. Then, feed the algorithm each trial as a separate chunk (with Stimulation based epoching box). This is also the classic OV way of computing the CSP. + +Once the spatial filters are computed and saved, you can load and apply the filters with the :ref:`Doc_BoxAlgorithm_SpatialFilter` "Spatial Filter" box. + +References + +1) Lotte & Guan: "Regularizing common spatial patterns to Improve BCI Designs: Unified Theory and New Algorithms", 2011. + +2) Muller-Gerkin & al., "Designing optimal spatial filters for single-trial EEG classification in a movement task", 1999. + +3) Chan, Golub & Leveq, "Updating formulae and a pairwise algorithm for computing sample variances", 1979. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SignalAverage.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SignalAverage.rst new file mode 100644 index 0000000..c41372a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SignalAverage.rst @@ -0,0 +1,52 @@ +.. _Doc_BoxAlgorithm_SignalAverage: + +Signal average +============== + +.. container:: attribution + + :Author: + Bruno Renier + :Company: + INRIA/IRISA + +.. image:: images/Doc_BoxAlgorithm_SignalAverage.png + +This plugin computes the average of each incoming sample +buffer and outputs the resulting signal. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input signal", "Signal" + +Input signal +~~~~~~~~~~~~ + +The input signal. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Filtered signal", "Signal" + +Filtered signal +~~~~~~~~~~~~~~~ + +Signal containing the averages of the input sample buffers. + +.. _Doc_BoxAlgorithm_SignalAverage_Miscellaneous: + +Miscellaneous +------------- + +The output signal's sample count per channel per buffer is one, +since a buffer contains the averages (per channel) of the values +of an input buffer. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SignalDecimation.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SignalDecimation.rst new file mode 100644 index 0000000..53f278a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SignalDecimation.rst @@ -0,0 +1,80 @@ +.. _Doc_BoxAlgorithm_SignalDecimation: + +Signal Decimation +================= + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA + +.. image:: images/Doc_BoxAlgorithm_SignalDecimation.png + +No pre filtering applied - Number of samples per block have to be a multiple of the decimation factor + +This box reduces the sampling frequency of an input signal *the easy way*. +It is different of the existing :ref:`Doc_BoxAlgorithm_SignalResampling` box in the sense +that there is no pre-filtering and that you can not choose an arbitrary sampling +frequency. Thus you will have to pre-filter the input signal with the +:ref:`Doc_BoxAlgorithm_TemporalFilter` box for example. The new sampling frequency +will be an exact divider of the source signal sampling frequency. For instance, if your +input sampling frequency is 1000Hz, you are allowed to divide that frequency by 2 or 4 +but you can't divide it by 3. See section :ref:`Doc_BoxAlgorithm_SignalDecimation_Examples` +for a detailed example of what can be done. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input signal", "Signal" + +Input signal +~~~~~~~~~~~~ + +The input signal. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output signal", "Signal" + +Output signal +~~~~~~~~~~~~~ + +The decimated signal. + +.. _Doc_BoxAlgorithm_SignalDecimation_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Decimation factor", "Integer", "8" + +Decimation factor +~~~~~~~~~~~~~~~~~ + +The sampling rate divider. At each chunk reception, 1 sample among n of the input signal will be +sent to the output signal. + +.. _Doc_BoxAlgorithm_SignalDecimation_Examples: + +Examples +-------- + +Suppose you have a signal with a sampling rate of 1000Hz streamed with 32 samples per buffer +that you want to downsample to 100Hz. Downsampling this signal to 100Hz will require that you +low-pass filter the signal to at most 50Hz to avoid bad results. Additionally, +Changing the epoch sizes using a the +:ref:`Doc_BoxAlgorithm_TimeBasedEpoching` box and configuring it e.g. for epochs of 0.1s every +0.1s will cause this box to output 10 samples sized buffers. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SignalResampling.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SignalResampling.rst new file mode 100644 index 0000000..8c7d315 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SignalResampling.rst @@ -0,0 +1,74 @@ +.. _Doc_BoxAlgorithm_SignalResampling: + +Signal Resampling +================= + +.. container:: attribution + + :Author: + Quentin Barthelemy + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_SignalResampling.png + +The input signal is resampled, down-sampled or up-sampled, at a chosen sampling frequency and then re-epoched. + +This plugin can apply a downsampling or an upsampling, to/from any sampling frequency, including non-integer sampling rate conversion. +The signal is low-pass filtered with a FIR filter to avoid spectral aliasing, using a sinc function-based fractional delay filter bank. + +If the sampling rate is badly conditioned, this plugin can induce latency. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input signal", "Signal" + +Input signal +~~~~~~~~~~~~ + +An input multichannel signal :math:`X \in \mathbb{R}^{C \times N_1}`, composed of :math:`C` channels and :math:`N_1` temporal samples, at the sampling frequency :math:`F_1`. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output signal", "Signal" + +Output signal +~~~~~~~~~~~~~ + +An output multichannel signal :math:`Y \in \mathbb{R}^{C \times N_2}`, composed of :math:`C` channels and :math:`N_2` temporal samples, at the sampling frequency :math:`F_2`. + +.. _Doc_BoxAlgorithm_SignalResampling_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "New Sampling Frequency", "Integer", "128" + "Sample Count Per Buffer", "Integer", "8" + "Low Pass Filter Signal Before Downsampling", "Boolean", "true" + +New Sampling Frequency +~~~~~~~~~~~~~~~~~~~~~~ + +New sampling frequency :math:`F_2 > 0`. No processing is applied if :math:`F_2 = F_1`. + +Sample Count Per Buffer +~~~~~~~~~~~~~~~~~~~~~~~ + +Number of temporal samples :math:`N_2 > 0` per resampled buffer. + +Low Pass Filter Signal Before Downsampling +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Low-pass filtering activation, to avoid spectral aliasing. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SimpleDSP.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SimpleDSP.rst new file mode 100644 index 0000000..143cd23 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SimpleDSP.rst @@ -0,0 +1,176 @@ +.. _Doc_BoxAlgorithm_SimpleDSP: + +Simple DSP +========== + +.. container:: attribution + + :Author: + Bruno Renier / Yann Renard + :Company: + INRIA / IRISA + +.. image:: images/Doc_BoxAlgorithm_SimpleDSP.png + +This plugin is used to apply a mathematical formulae to each sample of an incoming signal and output +the resulting signal. It thus acts as a simple DSP. + +The author may add up to 15 additional inputs. +In such circumstances, each input would be identified +by a letter from \e A to \e P. + +Also the type of the inputs could be changed to any +streamed matrix derived type. Thus you can process +signal, spectrum or feature vector if you need. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input - A", "Signal" + +You can use from 1 to 16 inputs. + +Input - A +~~~~~~~~~ + +Input signal + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output", "Signal" + +Output +~~~~~~ + +Filtered signal. + +.. _Doc_BoxAlgorithm_SimpleDSP_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Equation", "String", "x" + +Equation +~~~~~~~~ + +Formula to apply to incoming data (identified as 'X'). See :ref:`Doc_BoxAlgorithm_SimpleDSP_Miscellaneous` for more details. + +.. _Doc_BoxAlgorithm_SimpleDSP_Examples: + +Examples +-------- + +Let's consider that we want to compute the natural logarithm of the absolute value +of the input signal plus one. We just have to type the equation like that : + +.. code:: + + log(abs(X) + 1) + +Another example : if you want to sum the cosinus of X minus Pi with its sinus plus Pi, +you can enter this equation : + +.. code:: + + cos(X - M_PI) + sin(X + M_PI) + +.. _Doc_BoxAlgorithm_SimpleDSP_Miscellaneous: + +Miscellaneous +------------- + +The equation can use at most 16 variables, for 16 input signals. +The variable names are the 16 first letters of the alphabet, i.e. 'a' (or 'A') to 'p' (or 'P') matches inputs 1 to 16. +**NB** : The first input variable can be named 'x' or 'X'. + +Here is a list of supported functions/operators : + + +- Operators: + - ``+`` + - ``-`` + - ``*`` + - ``/`` + +- Unary functions + - ``abs`` (absolute value) + - ``acos`` (arc cosinus, requires n in the range [-1:1], result ranged in [0:M_PI]) + - ``asin`` (arc sinus, requires n in the range [-1:1], result ranged in [-M_PI_2:M_PI_2]) + - ``atan`` (arc tangent, requires n in the range [-1:1], result ranged in [-M_PI_2:M_PI_2]) + - ``ceil`` (upper-bound rounding) + - ``cos`` (cosinus, n in radians, result ranged in [-1:1]) + - ``exp`` (exponential) + - ``floor`` (lower-bound rounding) + - ``log`` (natural logarithm, requires n>0) + - ``log10`` (decimal logarithm, requires n>0) + - ``rand`` (pseudo-random, result ranged in [0:n]) + - ``sin`` (sinus, n in radians, result ranged in [-1:1]) + - ``sqrt`` (square root, requires n>=0) + - ``tan`` (tangent, n in radians, result ranged in [-1:1]) + +- Binary function + - ``pow`` (power) + +- Comparison operators + - ``>`` + - ``>=`` + - ``<`` + - ``<=`` + - ``==`` + - ``=`` (equivalent to ==) + - ``!=`` + - ``<>`` (equivalent to !=) + +- Boolean operators + - ``&`` as \e and + - ``&&`` also as \e and + - ``|`` as \e or + - ``||`` also as \e or + - ``!`` as \e not + - ``~`` as \e xor + - ``^`` also as \e xor + +- ternary operator + - ``? :`` + + +There are also a few defined constants : + + +- ``M_PI`` +- ``M_PI_2`` +- ``M_PI_4`` +- ``M_1_PI`` +- ``M_2_PI`` +- ``M_2_SQRTPI`` +- ``M_SQRT2`` +- ``M_SQRT1_2`` +- ``M_E`` +- ``M_LOG2E`` +- ``M_LOG10E`` +- ``M_LN2`` +- ``M_LN10`` + + +(note : their meaning is the same as the constants of the same name in math.c) + +Furthermore, the equation parser is totally case-insensitive. So you can write ``COS(m_pi+x)`` or ``cos(M_PI+X)``, it doesn't matter. + +Don't worry about the whitespaces and blank characters, they are automatically skipped by the equation parser. +That means, for instance, that both ``X+1`` and ``X + 1`` work. + +This plugin implements basic constant folding. That means that when the plugin analyses the equation, +if it can compute some parts of it before compilation, it will. For now, it does not support rational +equations simplification. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SpatialFilter.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SpatialFilter.rst new file mode 100644 index 0000000..179841c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SpatialFilter.rst @@ -0,0 +1,131 @@ +.. _Doc_BoxAlgorithm_SpatialFilter: + +Spatial Filter +============== + +.. container:: attribution + + :Author: + Yann Renard, Jussi T. Lindgren + :Company: + Inria + +.. image:: images/Doc_BoxAlgorithm_SpatialFilter.png + +The applied coefficient matrix must be specified as a box parameter. The filter processes each sample independently of the past samples. + +The spatial filter generates a number of output channels from another number of input +channels, each output channel being a linear combination of the input channels. + +For example, lets say :math:`IC_j` is the :math:`j` th input channel, :math:`OC_k` is the +:math:`k` th output channel, and :math:`S_{jk}` is the coefficient for the :math:`j` th input +channel and :math:`k` th output channel in the Spatial filter matrix. + +Then the output channels are computed this way : +:math:`OC_k = \sum_j S_{jk} * IC_j`. + + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input Signal", "Signal" + +Input Signal +~~~~~~~~~~~~ + +This input contains the input channels to mix. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output Signal", "Signal" + +Output Signal +~~~~~~~~~~~~~ + +This output contains the generated channels, mixed from the input channels. + +.. _Doc_BoxAlgorithm_SpatialFilter_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Spatial Filter Coefficients", "String", "1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1" + "Number of Output Channels", "Integer", "4" + "Number of Input Channels", "Integer", "4" + "Filter matrix file", "Filename", "" + +Spatial Filter Coefficients +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This setting contains a flat view of the spatial filter matrix. The coefficient orders is as follows : +all the coefficients for the first output followed by all the coefficients for the second output and so on.. + +Number of Output Channels +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Number of output channels to generate + +Number of Input Channels +~~~~~~~~~~~~~~~~~~~~~~~~ + +Number of input channels to compute from + +Filter matrix file +~~~~~~~~~~~~~~~~~~ + +Filter matrix. You can alternatively provide the filter coefficients as an ASCII file. + +.. _Doc_BoxAlgorithm_SpatialFilter_Examples: + +Examples +-------- + +Let's consider the following example : + +- Input channels list: C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4 (10 channels) + +- Spatial filter coefficients: 4 0 -1 0 -1 -1 0 0 -1 0 0 4 0 -1 0 0 -1 -1 0 -1 (20 values) +- Number of output channels: 2 +- Number of input channels: 10 + + +The output channels becomes : + +.. code:: + + OC1 = 4 * C3 + 0 * C4 + (-1) * FC3 + 0 * FC4 + (-1) * C5 + (-1) * C1 + 0 * C2 + 0 * C6 + (-1) * CP3 + 0 * CP4 + = 4 * C3 - FC3 - C5 - C1 - CP3 + + OC2 = 0 * C3 + 4 * C4 + 0 * FC3 + (-1) * FC4 + 0 * C5 + 0 * C1 + (-1) * C2 + (-1) * C6 + 0 * CP3 + (-1) * CP4 + = 4 * C4 - FC4 - C2 - C6 - CP4 + +This is basically a Surface Laplacian around C4 and C5. + +.. _Doc_BoxAlgorithm_SpatialFilter_Miscellaneous: + +Miscellaneous +------------- + +For large filters, it is somewhat faster to provide the matrix in an ASCII file than having the coefficients in scenario.xml directly. +If a file is used, the filter size is read from the file and the other parameters of the box are ignored. + +To provide the filter matrix as a file, the format is the same as is used for storing electrode localizations. E.g. for 3x3 identity matrix, the file would be + + +.. code:: + + [ [ "row1" "row2" "row3" ] [ "col1" "col2" "col3" ] ] + [ [ 1 0 0 ] ] + [ [ 0 1 0 ] ] + [ [ 0 0 1 ] ] + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SpectralAnalysis.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SpectralAnalysis.rst new file mode 100644 index 0000000..f4e8b56 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SpectralAnalysis.rst @@ -0,0 +1,131 @@ +.. _Doc_BoxAlgorithm_SpectralAnalysis: + +Spectral Analysis +================= + +.. container:: attribution + + :Author: + Laurent Bonnet / Quentin Barthelemy + :Company: + Mensia Technologies SA + + +.. image:: images/Doc_BoxAlgorithm_SpectralAnalysis.png + +Performs a Spectral Analysis using FFT. + +The Spectral Analysis box performs spectrum computations on incoming signals and possible outputs include the spectrum amplitude (the power of the signal in a number of frequency bands), as well as its phase, real part and imaginary part. +Output computations may be enabled/disabled from the settings dialogue box. The analysis is performed using a **Fast Fourier Transform**. +Do not forget to apply a :ref:`Doc_BoxAlgorithm_Windowing` step before spectral analysis. + +Considering an input signal :math:`X \in \mathbb{R}^{C \times N}`, composed of :math:`C` channels and :math:`N` temporal samples, this plugin computes the spectrum of this signal :math:`\Phi \in \mathbb{C}^{C \times F}`, composed of :math:`C` channels and :math:`F` frequencies. +Input signal being real, the spectrum exhibits conjugate symmetry: consequently, only half of the spectrum is returned with :math:`F = \left\lfloor N/2 \right\rfloor + 1`. +For the :math:`c^{ \text{th} }` channel and the :math:`f^{ \text{th} }` frequency, the spectrum is defined as: +:math:`\Phi(c,f) = \Phi_r(c,f) + \mathsf{i} \times \Phi_i(c,f) = \left| \Phi(c,f) \right| \times e^{\mathsf{i} \arg(\Phi(c,f))}` +with :math:`\mathsf{i}` being the imaginary unit. + +Using these notations, for the :math:`c^{ \text{th} }` channel, the Parseval's Theorem gives: +:math:`\sum_{n=0}^{N-1} \left| X(c,n) \right|^2 = \frac{1}{N} \sum_{f=0}^{F-1} \left| \Phi(c,f) \right|^2` +with :math:`\left| \Phi(c,f) \right|^2 = \Phi_r(c,f)^2 + \Phi_i(c,f)^2`. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input signal", "Signal" + +Input signal +~~~~~~~~~~~~ + +An input multichannel signal :math:`X \in \mathbb{R}^{C \times N}`, composed of :math:`C` channels and :math:`N` temporal samples. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Amplitude", "Spectrum" + "Phase", "Spectrum" + "Real Part", "Spectrum" + "Imaginary Part", "Spectrum" + +Amplitude +~~~~~~~~~ + +An output spectral amplitude (absolute value) :math:`\left| \Phi \right| \in \mathbb{R}^{C \times F}`. + +Phase +~~~~~ + +An output spectral phase :math:`\arg(\Phi) \in \mathbb{R}^{C \times F}`, in radians. + +Real Part +~~~~~~~~~ + +An output real part of the spectrum :math:`\Phi_r \in \mathbb{R}^{C \times F}`. + +Imaginary Part +~~~~~~~~~~~~~~ + +An output imaginary part of the spectrum :math:`\Phi_i \in \mathbb{R}^{C \times F}`. + +.. _Doc_BoxAlgorithm_SpectralAnalysis_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Amplitude", "Boolean", "true" + "Phase", "Boolean", "false" + "Real Part", "Boolean", "false" + "Imaginary Part", "Boolean", "false" + +Amplitude +~~~~~~~~~ + +Activate or not the Amplitude output. + +Phase +~~~~~ + +Activate or not the Phase output. + +Real Part +~~~~~~~~~ + +Activate or not the Real Part output. + +Imaginary Part +~~~~~~~~~~~~~~ + +Activate or not the Imaginary Part output. + +.. _Doc_BoxAlgorithm_SpectralAnalysis_Examples: + +Examples +-------- + +Practical example : visualising the power spectrum of a signal. + +Let's use a Signal Oscillator box to generator sinusoidal signals on one channel. Next we add a Spectral Analysis box and connect boxes together. We make sure the 'Amplitude' of the signal is computed by checking the appropriate setting in the settings dialog box (see image below). Finally, we connect the 'Amplitude' output connector of the Spectral Analysis box to the input connector of a Power Spectrum Display box. The player may now be launched to visualize the power spectrum of the signal. + +.. figure:: images/spectralanalysis_online.png + :alt: Visualising the power spectrum of sinusoidal signals. + :align: center + + Visualising the power spectrum of sinusoidal signals. + +.. _Doc_BoxAlgorithm_SpectralAnalysis_Miscellaneous: + +Miscellaneous +------------- + +To verify the Parseval's Theorem, in version 1.1, spectra have been multiplied by :math:`\sqrt{2}` with respect the previous version 1.0. +DC bin and Nyquist bin (when :math:`N` is even) are not concerned by this correction. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SpectrumAverage.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SpectrumAverage.rst new file mode 100644 index 0000000..f1dd0fd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_SpectrumAverage.rst @@ -0,0 +1,67 @@ +.. _Doc_BoxAlgorithm_SpectrumAverage: + +Spectrum Average +================ + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA + +.. image:: images/Doc_BoxAlgorithm_SpectrumAverage.png + +This box can be used in conjunction with the :ref:`Doc_BoxAlgorithm_SpectralAnalysis` and +the :ref:`Doc_BoxAlgorithm_FrequencyBandSelector` boxes in order to compute a power in specific +frequency bands of a spectrum. The output is a column matrix giving a single value for each +channel : the actual average power of the spectrum. You can may want to use these values +with the :ref:`Doc_BoxAlgorithm_SimpleDSP` to get ratios. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Spectrum", "Spectrum" + +Spectrum +~~~~~~~~ + +This input should connect to a spectrum stream, either filtered with the +:ref:`Doc_BoxAlgorithm_FrequencyBandSelector` box or not. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Spectrum average", "Streamed matrix" + +Spectrum average +~~~~~~~~~~~~~~~~ + +The output is a column matrix giving a single value for each +channel : the actual average power of the spectrum. + +.. _Doc_BoxAlgorithm_SpectrumAverage_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Considers zeros", "Boolean", "false" + +Considers zeros +~~~~~~~~~~~~~~~ + +The :ref:`Doc_BoxAlgorithm_FrequencyBandSelector` outputs a spectrum with +all initial frequency band represented. The bands that were not selected +just have a 0 instead of their value. Consequently, you can use this settings +to tell the box if the 0s contained in the spectrum should be part of the +mean or not. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_StimulationBasedEpoching.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_StimulationBasedEpoching.rst new file mode 100644 index 0000000..addddc1 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_StimulationBasedEpoching.rst @@ -0,0 +1,229 @@ +.. _Doc_BoxAlgorithm_StimulationBasedEpoching: + +Stimulation based epoching +========================== + +.. container:: attribution + + :Author: + Jozef Legeny + :Company: + Mensia Technologies + +.. image:: images/Doc_BoxAlgorithm_StimulationBasedEpoching.png + +Slices signal into chunks of a desired length following a stimulation event. + +The aim of this box it to select some signal near a specific event. The event +is sent to the box in the form of an OpenViBE Stimulation. The author can +configure the duration of the selected signal and the offset of this selection +as regarding to the stimulation. For instance, it is possible to start the selection +a few hundreds of milliseconds *after* the event, or even a few hundreds of +milliseconds *before* the event. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input signal", "Signal" + "Input stimulations", "Stimulations" + +Input signal +~~~~~~~~~~~~ + +This input should receive the signal that contains the epoch to extract. +It is possible to pass either continuous signal or discontinuous signal. +However, it is good to know how it is expected to work before trying to +connect discontinuous signal. + +Input stimulations +~~~~~~~~~~~~~~~~~~ + +This input should receive the stimulation that triggers a new +epoching. Any stimulation other than the one specified in the settings +will be silently ignored. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Epoched signal", "Signal" + +Epoched signal +~~~~~~~~~~~~~~ + +This output will send the selected epochs of signal. This output +stream is discontinuous by design meaning that successive epochs are +not connected in time. It is possible to later re-epoch the output +signals if needed. + +.. _Doc_BoxAlgorithm_StimulationBasedEpoching_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Epoch duration (in sec)", "Float", "1" + "Epoch offset (in sec)", "Float", "0.5" + "Stimulation to epoch from", "Stimulation", "OVTK_StimulationId_Label_00" + +Epoch duration (in sec) +~~~~~~~~~~~~~~~~~~~~~~~ + +This setting defines the duration of the selected epoch (in seconds). For instance, +if you want to select 600ms of signal, you should enter 0.6 + +Epoch offset (in sec) +~~~~~~~~~~~~~~~~~~~~~ + +This setting defines the offset of the epoch as against the stimulation date. +This is where the selection starts. If this offset is greater than 0, then +the signal selection starts *after* the actual stimulation. If this +offset is less than 0, then the signal selection starts *before* the actual +stimulation. Refer to :ref:`Doc_BoxAlgorithm_StimulationBasedEpoching_Miscellaneous` for +more detailed examples + +Stimulation to epoch from +~~~~~~~~~~~~~~~~~~~~~~~~~ + +This setting defines the stimulation identifier which should trigger +a new epoching. Each time this stimulation is received, a new epocher +starts and a new epoch should be sent. + +.. _Doc_BoxAlgorithm_StimulationBasedEpoching_Examples: + +Examples +-------- + +In the case of motor imagery, the user is usually instructed to imagine +either left or right hand movement. This mental task typically runs for +5 seconds. So selecting the signal block related to the imagination +of left hand movement can be done with this box using the following +parameters : + +- duration : 5 seconds +- offset : 0 second +- stimulation : OVTK_GDF_Left + + +In case you'd want to avoid the first half second (because it could +reflect a phase where the user is *starting* to perform the task) +and wand to avoir the last half second (because it could reflect a phase +where the user is exhausted and does not perform the taks optimally), then +you could use the following parameters : + +- duration : 4 seconds +- offset : 0.5 seconds +- stimulation : OVTK_GDF_Left + + + +.. _Doc_BoxAlgorithm_StimulationBasedEpoching_Miscellaneous: + +Miscellaneous +------------- + +**1. Continuous signal** + +Suppose that we want to grab 1 second of signal following a specific stimulation code. +Suppose that the actual stimulation happens at *t=3.5* and *t=6*. Then the following figure +illustrate how epochs will be built. (*Ix* represents the x*th* input epoch and +*Ox* represents the x*th* output epoch) + + +.. code:: + + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ + input = | I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I7 | | I9 | ... + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ + +----+ +----+ + output = | O1 | | O2 | ... + +----+ +----+ + + time = 1 2 3 4 5 6 7 8 9 + stim = ^ ^ + +Suppose that we want to grab 3 seconds of signal beginning 1 second before a specific stimulation code. +Suppose that the actual stimulation happens at *t=1.5* and *t=6*. Then the following figure +illustrate how epochs will be built. (*Ix* represents the x*th* input epoch and +*Ox* represents the x*th* output epoch) + + +.. code:: + + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ + input = | I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I7 | | I9 | ... + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ + +------------------+ +------------------+ + output = | O1 | | O2 | ... + +------------------+ +------------------+ + + time = 1 2 3 4 5 6 7 8 9 + stim = ^ ^ + +Overlapping epochs would also work as defined on the following example... +Suppose that we want to grab 3 seconds of signal beginning 1 second before a specific stimulation code. +Suppose that the actual stimulation happens at *t=1.5*, *t=2* and *t=6*. Then the following figure +illustrate how epochs will be built. (*Ix* represents the x*th* input epoch and +*Ox* represents the x*th* output epoch) + + +.. code:: + + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ + input = | I1 | | I2 | | I3 | | I4 | | I5 | | I6 | | I7 | | I7 | | I9 | ... + +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ +----+ + +------------------+ +------------------+ + | O1 | | O3 | + output = +------------------+ +------------------+ .... + +------------------+ + | O2 | + +------------------+ + + time = 1 2 3 4 5 6 7 8 9 + stim = ^ ^ ^ + +**2. Discontinuous signal** + +The case where input signal is not continuous (for instance, the signal has already been epoched with +either a :ref:`Doc_BoxAlgorithm_StimulationBasedEpoching` or a :ref:`Doc_BoxAlgorithm_TimeBasedEpoching` box) +can be tricky... Indeed, it is not possible to join input epochs correctly. The epoching only consists +in signal extraction from an individual input chunk. + +For instance, suppose the following input signal (*Ix* represents the x*th* input epoch) : + + +.. code:: + + +------------------+ +------------------+ +----- + input = | I1 | | I2 | | ... + +------------------+ +------------------+ +----- + time = 1 2 3 4 5 6 7 8 9 + +Suppose that we want to grab 1 second of signal following a specific stimulation code. +Suppose that the actual stimulation happens at *t=1*, *t=2*, *t=4.5* and *t=6.5*. Then the following figure +illustrate how epochs will be built. (*Ix* represents the x*th* input epoch and +*Ox* represents the x*th* output epoch) + + +.. code:: + + +------------------+ +------------------+ +----- + input = | I1 | | I2 | | ... + +------------------+ +------------------+ +----- + +----+ +----+ +----+ + output = | O1 | | O2 | | O3 | ... + +----+ +----+ +----+ + + time = 1 2 3 4 5 6 7 8 9 + stim = ^ ^ ^ ^ + +In this case, note that the last stimulation at *t=6.5* can not generate a valid epoch. Indeed, the input +signal does not cover the time period from *t=6.5* to *t=7.5* so no epoch should be generated. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_TemporalFilter.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_TemporalFilter.rst new file mode 100644 index 0000000..2062792 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_TemporalFilter.rst @@ -0,0 +1,110 @@ +.. _Doc_BoxAlgorithm_TemporalFilter: + +Temporal Filter +=============== + +.. container:: attribution + + :Author: + Yann Renard & Laurent Bonnet + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_TemporalFilter.png + +Applies a temporal filter, based on various one-way IIR filter designs, to the input stream. + +This plugin is used to filter the input signal. This plugin allows the selection of the kinf of filter (Butterworth, Chebyshev, Yule-Walker), +the kind of filter (low-pass, high-pass, band-pass, band-stop), the low or/and the high edge of the filter, and the passband ripple for the Chebyshev filter. + +The algorithm used for this filter comes from an external library dsp-filters (https://github.com/vinniefalco/DSPFilters). + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input signal", "Signal" + +Input signal +~~~~~~~~~~~~ + +The input signal. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output signal", "Signal" + +Output signal +~~~~~~~~~~~~~ + +The filtered signal. + +.. _Doc_BoxAlgorithm_TemporalFilter_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Filter Method", "Filter method", "Butterworth" + "Filter Type", "Filter type", "Band Pass" + "Filter Order", "Integer", "4" + "Low Cut-off Frequency (Hz)", "Float", "1" + "High Cut-off Frequency (Hz)", "Float", "40" + "Band Pass Ripple (dB)", "Float", "0.5" + +Filter Method +~~~~~~~~~~~~~ + +Select the name of filter between Butterworth, Chebyshev and Yule-Walker. + +Filter Type +~~~~~~~~~~~ + +Select the kind of filter between low-pass, high-pass, band-pass, band-stop. + +The Temporal Filter applies a DC removal for Band-Pass and High-Pass filters. +This DC is estimated as the first value of the first chunk. + +Filter Order +~~~~~~~~~~~~ + +Order :math:`n` of the filter, with :math:`n \geq 1`. + +Low Cut-off Frequency (Hz) +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Low cut-off frequency :math:`f_1 > 0` for high-pass, band-pass and band-stop filters (not used with low-pass filter). +Low cut-off frequency can not be above Nyquist-Shannon criteria (half of the sampling rate). + +High Cut-off Frequency (Hz) +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +High cut-off frequency :math:`f_2 > 0` for low-pass, band-pass and band-stop filters (not used with high-pass filter). For band-pass and band-stop filters, :math:`f_1 < f_2`. +High cut-off frequency can not be above Nyquist-Shannon criteria (half of the sampling rate). + +Band Pass Ripple (dB) +~~~~~~~~~~~~~~~~~~~~~ + +If Chebyshev filter is selected, pass band ripple in dB is a necessary information. + +.. _Doc_BoxAlgorithm_TemporalFilter_Examples: + +Examples +-------- + +Let's consider our input signal is very noisy (50 Hz). +To filter this signal, select a Low pass Butterworth filter of 4th order and High Edge equal to 30 Hz for example. + +Miscellaneous +------------- + +The Temporal Filter bow does not behave properly on some limit cases: when using a low cut frequency or with a high +filter order, in these cases we advise to remove the first seconds of the processed signal from your process. diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_TimeBasedEpoching.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_TimeBasedEpoching.rst new file mode 100644 index 0000000..f9239cb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_TimeBasedEpoching.rst @@ -0,0 +1,103 @@ +.. _Doc_BoxAlgorithm_TimeBasedEpoching: + +Time based epoching +=================== + +.. container:: attribution + + :Author: + Quentin Barthelemy + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_TimeBasedEpoching.png + +Interval can be used to control the overlap of epochs + +The time based epoching box generates 'epochs', i.e. signal 'slices' which length is configurable, as is the time offset between two consecutive epochs. This box has one input and one output connectors, both of which are of 'signal' type. This box is essential to other signal processing boxes when the size of data blocks being forwarded to them is not significant enough. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input signal", "Signal" + +Input signal +~~~~~~~~~~~~ + +Input signal #1. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Epoched signal", "Signal" + +Epoched signal +~~~~~~~~~~~~~~ + +Epoched signal #1. + +.. _Doc_BoxAlgorithm_TimeBasedEpoching_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Epoch duration (in sec)", "Float", "1" + "Epoch intervals (in sec)", "Float", "0.5" + +Epoch duration (in sec) +~~~~~~~~~~~~~~~~~~~~~~~ + +Length of epoched signal #1 + +Epoch intervals (in sec) +~~~~~~~~~~~~~~~~~~~~~~~~ + +Time interval between two consecutive epochs for signal #1 + +.. _Doc_BoxAlgorithm_TimeBasedEpoching_Examples: + +Examples +-------- + +Practical example : apply time based epoching to compute the power spectrum of a signal + +For the spectral analysis to work properly, signal data must come in chunks big enough for the analysis to be meaningful. Let's see how the time-based epoching box can help to improve the power spectrum computation of a signal. + +First, we add a Signal Oscillator box to a scenario, connect it to a Spectral Analysis box, and connect the Amplitude output connector to the +input of a Power Spectrum Display box. Let's use default Sinus Oscillator settings (512Hz sampling frequency, data blocks size of 32 samples) and +make sure the Amplitude setting is enabled in the Spectral Analysis box. Now we can launch the player : the power spectrum is very coarse. +This is because the Sinus Oscillator generates small data blocks (32/512 = 1/16th of a second per block) compared to the periods of sinusoids making up the signal. The spectral analysis yields very coarse results when working on such blocks (see image below). + +.. figure:: images/timebasedepoching_1.png + :alt: Coarse power spectrum computation due to small data blocks. + :align: center + + Coarse power spectrum computation due to small data blocks. + +One way to correct this problem is to increase the data blocks size. Let's send bigger blocks by setting their size to 512 samples. When launching the player again, the power spectrum should be much finer than before, since the spectral analysis works on blocks representing 1 second of signal. However, notice how the spectrum is only refreshed at 1Hz now. This solution is not satisfactory. + +.. figure:: images/timebasedepoching_2.png + :alt: Finer power spectrum computation by sending bigger chunks. + :align: center + + Finer power spectrum computation by sending bigger chunks. + +Now we insert a Time based epoching box before the Spectral Analysis. We reset the Sinus Oscillator settings to 512 samples a second and blocks of 32 samples. Let's now setup the epoching box : we are going to generate epochs of 1 second every 1/16th of a second. Now let's launch the player again : the power spectrum is refined and updated regularly. + +.. figure:: images/timebasedepoching_3.png + :alt: Epoching 1-second chunks to refine spectrum computations + :align: center + + Epoching 1-second chunks to refine spectrum computations + +The stimulation based epoching box is similar to time based epoching, only it generates epochs when a given stimulation is received. Thus, the box has two input connectors : one for signals and another for stimulations. Settings include epoch size, epoch offset (delay when epoching should start after the target stimulation is received), and stimulation identifier. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_Windowing.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_Windowing.rst new file mode 100644 index 0000000..7239486 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_Windowing.rst @@ -0,0 +1,62 @@ +.. _Doc_BoxAlgorithm_Windowing: + +Windowing +========= + +.. container:: attribution + + :Author: + Laurent Bonnet + :Company: + Mensia Technologies SA + + +.. image:: images/Doc_BoxAlgorithm_Windowing.png + +Applies a windowing function to the signal. + +This plugin is used to apply a window to the input signal. +This plugin allows the selection of the kind of window +(None, Hamming, Hanning, Hann, Blackman, Triangular, Square Root). + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input signal", "Signal" + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output signal", "Signal" + +.. _Doc_BoxAlgorithm_Windowing_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Window method", "Window method", "Hamming" + +Window method +~~~~~~~~~~~~~ + +Select the name of window between: None(equivalent to a rectangular window), Hamming, Hanning, Hann, Blackman, +Triangular and Square Root. + +.. _Doc_BoxAlgorithm_Windowing_Examples: + +Examples +-------- + +Let's consider our input signal. +To prevent rebound in spectrum analysis due to the square root +windowing, select a Hanning window for example. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_XDAWNTrainer.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_XDAWNTrainer.rst new file mode 100644 index 0000000..805f79b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_XDAWNTrainer.rst @@ -0,0 +1,102 @@ +.. _Doc_BoxAlgorithm_XDAWNTrainer: + +xDAWN Trainer +============= + +.. container:: attribution + + :Author: + Yann Renard + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_XDAWNTrainer.png + +Trains spatial filters that best highlight Evoked Response Potentials (ERP) such as P300 + +This box can be used in order to compute a spatial filter in order to enhance the +detection of evoked response potentials. In order to compute such filter, this box +needs to receive the whole contain of a session on the first hand, and a succession +of evoked response potentials on the other hand. It then computes the averaged evoked +response potential computes the spatial filter that makes this averaged potential +appear in the whole signal. This can be used e.g. for better P300 signal detection. + +It is important to consider the fact that this box will have best results for a +reasonably big number of input channels, possibly all over the scalp (areas where +the evoked response potential can not be seen will be naturally used as references +to reduce noise). The spatial filter results in space reduction to only keep significant +chanels for later detection. Consider using at least 4 times more input channels than +the number of output channels you want. For example, reducing 16 electrodes to 3 channels +for P300 detection is OK. + +For more details about xDAWN, see Rivet et al. 2009 +or in case this links disapears, this website. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Stimulations", "Stimulations" + "Session signal", "Signal" + "Evoked potential epochs", "Signal" + +Stimulations +~~~~~~~~~~~~ + +This input receives the exepriment stimulations. As soon as the "train" +stimulation is received, the spatial filter is computed. + +Session signal +~~~~~~~~~~~~~~ + +This input should receive the whole signal of the session. + +Evoked potential epochs +~~~~~~~~~~~~~~~~~~~~~~~ + +This input should receive the multiple evoked response potentials. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Train-completed Flag", "Stimulations" + +.. _Doc_BoxAlgorithm_XDAWNTrainer_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Train stimulation", "Stimulation", "OVTK_StimulationId_Train" + "Spatial filter configuration", "Filename", "" + "Filter dimension", "Integer", "4" + "Save as box config", "Boolean", "true" + +Train stimulation +~~~~~~~~~~~~~~~~~ + +This setting contains the stimulation to use to trigger the training process. + +Spatial filter configuration +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This setting tells the box what configuration file to generate. This configuration file can +be used to set the correct values of a :ref:`Doc_BoxAlgorithm_SpatialFilter` box. + +Filter dimension +~~~~~~~~~~~~~~~~ + +This setting tells how many dimension should be kept out of the spatial filter. + +Save as box config +~~~~~~~~~~~~~~~~~~ + +If true, the file written will be a box configuration override especially for a spatial filter box. Otherwise, it will be an ASCII matrix. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_ZeroCrossingDetector.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_ZeroCrossingDetector.rst new file mode 100644 index 0000000..d4d1e87 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/Doc_BoxAlgorithm_ZeroCrossingDetector.rst @@ -0,0 +1,96 @@ +.. _Doc_BoxAlgorithm_ZeroCrossingDetector: + +Zero-Crossing Detector +====================== + +.. container:: attribution + + :Author: + Quentin Barthelemy + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_ZeroCrossingDetector.png + +Detects zero-crossings of the signal for each channel, with 1 for positive zero-crossings (negative-to-positive), -1 for negatives ones (positive-to-negative), 0 otherwise. For all channels, stimulations mark positive and negatives zero-crossings. For each channel, the rythm is computed in events per min. + +Using an hysteresis thresholding, this box detects the zero-crossings of the input, operating on all channels. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input signal", "Signal" + +Input signal +~~~~~~~~~~~~ + +The input signal :math:`X \in \mathbb{R}^{C \times N}`, composed of :math:`C` sensors and :math:`N` samples. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Zero-crossing signal", "Signal" + "Zero-crossing stimulations", "Stimulations" + "Events rythm (per min)", "Streamed matrix" + +Zero-crossing signal +~~~~~~~~~~~~~~~~~~~~ + +Zero-crossing signal :math:`Z \in \mathbb{R}^{C \times N}`, composed of :math:`C` sensors and :math:`N` samples. +It is defined as 1 for positive zero-crossings (negative-to-positive), -1 for negatives ones (positive-to-negative), 0 otherwise. + +Zero-crossing stimulations +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +For all channels, stimulations mark positive and negatives zero-crossings. + +Events rythm (per min) +~~~~~~~~~~~~~~~~~~~~~~ + +For each channel, the rythm of negative-to-positive zero-crossings is computed in events per min. + +.. _Doc_BoxAlgorithm_ZeroCrossingDetector_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Hysteresis threshold", "Float", "0.01" + "Rythm estimation window (in sec)", "Float", "10" + "Negative-to-positive stimulation", "Stimulation", "OVTK_StimulationId_ThresholdPassed_Positive" + "Positive-to-negative stimulation", "Stimulation", "OVTK_StimulationId_ThresholdPassed_Negative" + +Hysteresis threshold +~~~~~~~~~~~~~~~~~~~~ + +This setting defines the value :math:`t` of the hysteresis threshold, to provide a robust detection. + +.. figure:: images/ZeroCrossingDetector_thresholding.png + :alt: Difference between naive and hysteresis sign thresholding + :align: center + + Difference between naive and hysteresis sign thresholding + +Rythm estimation window (in sec) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This setting defines the length of the time window for the rythm estimation. + +Negative-to-positive stimulation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This setting defines the stimulation id for negative-to-positive crossings. + +Positive-to-negative stimulation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This setting defines the stimulation id for positive-to-negative crossings. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_ChannelRename.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_ChannelRename.png new file mode 100644 index 0000000..8e182bd Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_ChannelRename.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_ChannelSelector.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_ChannelSelector.png new file mode 100644 index 0000000..73ecd63 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_ChannelSelector.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_CommonAverageReference.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_CommonAverageReference.png new file mode 100644 index 0000000..2cea6fa Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_CommonAverageReference.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_ContinuousWaveletAnalysis.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_ContinuousWaveletAnalysis.png new file mode 100644 index 0000000..288c551 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_ContinuousWaveletAnalysis.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_Crop.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_Crop.png new file mode 100644 index 0000000..26e18a5 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_Crop.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_EpochAverage.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_EpochAverage.png new file mode 100644 index 0000000..051ef3c Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_EpochAverage.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_FrequencyBandSelector.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_FrequencyBandSelector.png new file mode 100644 index 0000000..e5b20c2 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_FrequencyBandSelector.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_Identity.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_Identity.png new file mode 100644 index 0000000..4feef50 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_Identity.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_ReferenceChannel.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_ReferenceChannel.png new file mode 100644 index 0000000..db44ca2 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_ReferenceChannel.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_RegularizedCSPTrainer.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_RegularizedCSPTrainer.png new file mode 100644 index 0000000..93f1fc2 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_RegularizedCSPTrainer.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SignalAverage.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SignalAverage.png new file mode 100644 index 0000000..cab1b1a Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SignalAverage.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SignalDecimation.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SignalDecimation.png new file mode 100644 index 0000000..ecb513d Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SignalDecimation.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SignalResampling.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SignalResampling.png new file mode 100644 index 0000000..be71703 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SignalResampling.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SimpleDSP.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SimpleDSP.png new file mode 100644 index 0000000..d04d2cc Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SimpleDSP.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SpatialFilter.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SpatialFilter.png new file mode 100644 index 0000000..db78a8b Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SpatialFilter.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SpectralAnalysis.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SpectralAnalysis.png new file mode 100644 index 0000000..c02a284 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SpectralAnalysis.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SpectrumAverage.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SpectrumAverage.png new file mode 100644 index 0000000..3bb3ef5 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_SpectrumAverage.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_StimulationBasedEpoching.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_StimulationBasedEpoching.png new file mode 100644 index 0000000..15ff3bd Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_StimulationBasedEpoching.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_TemporalFilter.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_TemporalFilter.png new file mode 100644 index 0000000..341d50c Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_TemporalFilter.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_TimeBasedEpoching.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_TimeBasedEpoching.png new file mode 100644 index 0000000..5c6127c Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_TimeBasedEpoching.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_Windowing.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_Windowing.png new file mode 100644 index 0000000..385cf75 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_Windowing.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_XDAWNTrainer.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_XDAWNTrainer.png new file mode 100644 index 0000000..357ec19 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_XDAWNTrainer.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_ZeroCrossingDetector.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_ZeroCrossingDetector.png new file mode 100644 index 0000000..a6317bf Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/Doc_BoxAlgorithm_ZeroCrossingDetector.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/ZeroCrossingDetector_thresholding.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/ZeroCrossingDetector_thresholding.png new file mode 100644 index 0000000..77ba959 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/ZeroCrossingDetector_thresholding.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/spectralanalysis_online.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/spectralanalysis_online.png new file mode 100644 index 0000000..12dc1e3 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/spectralanalysis_online.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/timebasedepoching_1.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/timebasedepoching_1.png new file mode 100644 index 0000000..dd67e34 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/timebasedepoching_1.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/timebasedepoching_2.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/timebasedepoching_2.png new file mode 100644 index 0000000..9cf5a33 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/timebasedepoching_2.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/timebasedepoching_3.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/timebasedepoching_3.png new file mode 100644 index 0000000..9facd3d Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/boxes/images/timebasedepoching_3.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/spectralanalysis_online.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/spectralanalysis_online.png new file mode 100644 index 0000000..12dc1e3 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/spectralanalysis_online.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/timebasedepoching_1.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/timebasedepoching_1.png new file mode 100644 index 0000000..dd67e34 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/timebasedepoching_1.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/timebasedepoching_2.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/timebasedepoching_2.png new file mode 100644 index 0000000..9cf5a33 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/timebasedepoching_2.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/timebasedepoching_3.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/timebasedepoching_3.png new file mode 100644 index 0000000..9facd3d Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/doc/timebasedepoching_3.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmMatrixAverage.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmMatrixAverage.cpp new file mode 100644 index 0000000..3fcc2db --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmMatrixAverage.cpp @@ -0,0 +1,193 @@ +#include "ovpCAlgorithmMatrixAverage.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +// ________________________________________________________________________________________________________________ +// + +bool CAlgorithmMatrixAverage::initialize() +{ + ip_averagingMethod.initialize(getInputParameter(OVP_Algorithm_MatrixAverage_InputParameterId_AveragingMethod)); + ip_matrixCount.initialize(getInputParameter(OVP_Algorithm_MatrixAverage_InputParameterId_MatrixCount)); + ip_matrix.initialize(getInputParameter(OVP_Algorithm_MatrixAverage_InputParameterId_Matrix)); + op_averagedMatrix.initialize(getOutputParameter(OVP_Algorithm_MatrixAverage_OutputParameterId_AveragedMatrix)); + + m_nAverageSamples = 0; + + return true; +} + +bool CAlgorithmMatrixAverage::uninitialize() +{ + for (auto it = m_history.begin(); it != m_history.end(); ++it) { delete *it; } + m_history.clear(); + + op_averagedMatrix.uninitialize(); + ip_matrix.uninitialize(); + ip_matrixCount.uninitialize(); + ip_averagingMethod.uninitialize(); + + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CAlgorithmMatrixAverage::process() +{ + CMatrix* iMatrix = ip_matrix; + CMatrix* oMatrix = op_averagedMatrix; + + bool shouldPerformAverage = false; + + if (this->isInputTriggerActive(OVP_Algorithm_MatrixAverage_InputTriggerId_Reset)) + { + for (auto it = m_history.begin(); it != m_history.end(); ++it) { delete*it; } + + m_history.clear(); + + oMatrix->copyDescription(*iMatrix); + } + + if (this->isInputTriggerActive(OVP_Algorithm_MatrixAverage_InputTriggerId_FeedMatrix)) + { + if (ip_averagingMethod == uint64_t(EEpochAverageMethod::Moving)) + { + CMatrix* swapMatrix; + + if (m_history.size() >= ip_matrixCount) + { + swapMatrix = m_history.front(); + m_history.pop_front(); + } + else + { + swapMatrix = new CMatrix(); + swapMatrix->copyDescription(*iMatrix); + } + + swapMatrix->copyContent(*iMatrix); + + m_history.push_back(swapMatrix); + shouldPerformAverage = (m_history.size() == ip_matrixCount); + } + else if (ip_averagingMethod == uint64_t(EEpochAverageMethod::MovingImmediate)) + { + CMatrix* swapMatrix; + + if (m_history.size() >= ip_matrixCount) + { + swapMatrix = m_history.front(); + m_history.pop_front(); + } + else + { + swapMatrix = new CMatrix(); + swapMatrix->copyDescription(*iMatrix); + } + + swapMatrix->copyContent(*iMatrix); + + m_history.push_back(swapMatrix); + shouldPerformAverage = (!m_history.empty()); + } + else if (ip_averagingMethod == uint64_t(EEpochAverageMethod::Block)) + { + CMatrix* swapMatrix = new CMatrix(); + + if (m_history.size() >= ip_matrixCount) + { + for (auto it = m_history.begin(); it != m_history.end(); ++it) { delete *it; } + m_history.clear(); + } + + swapMatrix->copy(*iMatrix); + + m_history.push_back(swapMatrix); + shouldPerformAverage = (m_history.size() == ip_matrixCount); + } + else if (ip_averagingMethod == uint64_t(EEpochAverageMethod::Cumulative)) + { + m_history.push_back(iMatrix); + shouldPerformAverage = true; + } + else { shouldPerformAverage = false; } + } + + if (shouldPerformAverage) + { + oMatrix->resetBuffer(); + + if (ip_averagingMethod == uint64_t(EEpochAverageMethod::Cumulative)) + { + CMatrix* matrix = m_history.at(0); + + m_nAverageSamples++; + + if (m_nAverageSamples == 1) // If it's the first matrix, the average is the first matrix + { + double* buffer = matrix->getBuffer(); + const size_t size = matrix->getBufferElementCount(); + + m_averageMatrices.clear(); + m_averageMatrices.insert(m_averageMatrices.begin(), buffer, buffer + size); + } + else + { + if (matrix->getBufferElementCount() != m_averageMatrices.size()) { return false; } + + const double n = double(m_nAverageSamples); + + double* iBuffer = matrix->getBuffer(); + + for (double& value : m_averageMatrices) + { + // calculate cumulative mean as + // mean{k} = mean{k-1} + (new_value - mean{k-1}) / k + // which is a recurrence equivalent to mean{k] = mean{k-1} * (k-1)/k + new_value/k + // but more numerically stable + value += (*iBuffer - value) / n; + iBuffer++; + } + } + + double* oBuffer = oMatrix->getBuffer(); + + for (const double& value : m_averageMatrices) + { + *oBuffer = double(value); + oBuffer++; + } + + m_history.clear(); + } + else + { + const size_t n = oMatrix->getBufferElementCount(); + const double scale = 1. / m_history.size(); + + for (CMatrix* matrix : m_history) + { + double* oBuffer = oMatrix->getBuffer(); + double* iBuffer = matrix->getBuffer(); + + for (size_t i = 0; i < n; ++i) + { + *oBuffer += *iBuffer * scale; + oBuffer++; + iBuffer++; + } + } + } + + this->activateOutputTrigger(OVP_Algorithm_MatrixAverage_OutputTriggerId_AveragePerformed, true); + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmMatrixAverage.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmMatrixAverage.h new file mode 100644 index 0000000..4594491 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmMatrixAverage.h @@ -0,0 +1,73 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CAlgorithmMatrixAverage final : public Toolkit::TAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_MatrixAverage) + +protected: + + Kernel::TParameterHandler ip_averagingMethod; + Kernel::TParameterHandler ip_matrixCount; + Kernel::TParameterHandler ip_matrix; + Kernel::TParameterHandler op_averagedMatrix; + + std::deque m_history; + std::vector m_averageMatrices; + size_t m_nAverageSamples = 0; +}; + +class CAlgorithmMatrixAverageDesc final : public IAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Matrix average"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Signal processing/Averaging"); } + CString getVersion() const override { return CString("1.1"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_MatrixAverage; } + IPluginObject* create() override { return new CAlgorithmMatrixAverage(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_MatrixAverage_InputParameterId_Matrix, "Matrix", Kernel::ParameterType_Matrix); + prototype.addInputParameter(OVP_Algorithm_MatrixAverage_InputParameterId_MatrixCount, "Matrix count", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_MatrixAverage_InputParameterId_AveragingMethod, "Averaging Method", Kernel::ParameterType_UInteger); + + prototype.addOutputParameter(OVP_Algorithm_MatrixAverage_OutputParameterId_AveragedMatrix, "Averaged matrix", Kernel::ParameterType_Matrix); + + prototype.addInputTrigger(OVP_Algorithm_MatrixAverage_InputTriggerId_Reset, "Reset"); + prototype.addInputTrigger(OVP_Algorithm_MatrixAverage_InputTriggerId_FeedMatrix, "Feed matrix"); + prototype.addInputTrigger(OVP_Algorithm_MatrixAverage_InputTriggerId_ForceAverage, "Force average"); + + prototype.addOutputTrigger(OVP_Algorithm_MatrixAverage_OutputTriggerId_AveragePerformed, "Average performed"); + + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_MatrixAverageDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmOnlineCovariance.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmOnlineCovariance.cpp new file mode 100644 index 0000000..35c17a9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmOnlineCovariance.cpp @@ -0,0 +1,277 @@ +#if defined TARGET_HAS_ThirdPartyEIGEN + +#include "ovpCAlgorithmOnlineCovariance.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +#define COV_DEBUG 0 +#if COV_DEBUG +void CAlgorithmOnlineCovariance::dumpMatrix(Kernel::ILogManager &rMgr, const MatrixXdRowMajor &mat, const CString &desc) +{ + rMgr << Kernel::LogLevel_Info << desc << "\n"; + for (int i = 0 ; i < mat.rows() ; i++) + { + rMgr << Kernel::LogLevel_Info << "Row " << i << ": "; + for (int j = 0 ; j < mat.cols() ; j++) { rMgr << mat(i,j) << " "; } + rMgr << "\n"; + } +} +#else +void CAlgorithmOnlineCovariance::dumpMatrix(Kernel::ILogManager& /* mgr */, const MatrixXdRowMajor& /*mat*/, const CString& /*desc*/) { } +#endif + +bool CAlgorithmOnlineCovariance::initialize() +{ + m_n = 0; + return true; +} + +bool CAlgorithmOnlineCovariance::uninitialize() { return true; } + +bool CAlgorithmOnlineCovariance::process() +{ + // Note: The input parameters must have been set by the caller by now + const Kernel::TParameterHandler ip_Shrinkage(getInputParameter(OVP_Algorithm_OnlineCovariance_InputParameterId_Shrinkage)); + const Kernel::TParameterHandler ip_TraceNormalization(getInputParameter(OVP_Algorithm_OnlineCovariance_InputParameterId_TraceNormalization)); + const Kernel::TParameterHandler ip_UpdateMethod(getInputParameter(OVP_Algorithm_OnlineCovariance_InputParameterId_UpdateMethod)); + const Kernel::TParameterHandler ip_FeatureVectorSet(getInputParameter(OVP_Algorithm_OnlineCovariance_InputParameterId_InputVectors)); + Kernel::TParameterHandler op_Mean(getOutputParameter(OVP_Algorithm_OnlineCovariance_OutputParameterId_Mean)); + Kernel::TParameterHandler op_CovarianceMatrix(getOutputParameter(OVP_Algorithm_OnlineCovariance_OutputParameterId_CovarianceMatrix)); + + if (isInputTriggerActive(OVP_Algorithm_OnlineCovariance_Process_Reset)) + { + OV_ERROR_UNLESS_KRF(ip_Shrinkage >= 0.0 && ip_Shrinkage <= 1.0, "Invalid shrinkage parameter (expected value between 0 and 1)", Kernel::ErrorType::BadInput); + + OV_ERROR_UNLESS_KRF(ip_FeatureVectorSet->getDimensionCount() == 2, + "Invalid feature vector with " << ip_FeatureVectorSet->getDimensionCount() << " dimensions (expected dim = 2)", + Kernel::ErrorType::BadInput); + + const size_t nRows = ip_FeatureVectorSet->getDimensionSize(0); + const size_t nCols = ip_FeatureVectorSet->getDimensionSize(1); + + OV_ERROR_UNLESS_KRF(nRows >= 1 && nCols >= 1, "Invalid input matrix [" << nRows << "x" << nCols << "(minimum expected = 1x1)", Kernel::ErrorType::BadInput); + + this->getLogManager() << Kernel::LogLevel_Debug << "Using shrinkage coeff " << ip_Shrinkage << " ...\n"; + this->getLogManager() << Kernel::LogLevel_Debug << "Trace normalization is " << (ip_TraceNormalization ? "[on]" : "[off]") << "\n"; + this->getLogManager() << Kernel::LogLevel_Debug << "Using update method " << getTypeManager().getEnumerationEntryNameFromValue( + OVP_TypeId_OnlineCovariance_UpdateMethod, ip_UpdateMethod) << "\n"; + + // Set the output buffers + op_Mean->resize(1, nCols); + op_CovarianceMatrix->resize(nCols, nCols); + + // These keep track of the non-normalized incremental estimates + m_mean.resize(1, nCols); + m_mean.setZero(); + m_cov.resize(nCols, nCols); + m_cov.setZero(); + + m_n = 0; + } + + if (isInputTriggerActive(OVP_Algorithm_OnlineCovariance_Process_Update)) + { + const size_t nRows = ip_FeatureVectorSet->getDimensionSize(0); + const size_t nCols = ip_FeatureVectorSet->getDimensionSize(1); + + const double* buffer = ip_FeatureVectorSet->getBuffer(); + + OV_ERROR_UNLESS_KRF(buffer, "Input buffer is NULL", Kernel::ErrorType::BadInput); + + // Cast our data into an Eigen matrix. As Eigen doesn't have const double* constructor, we cast away the const. + const Eigen::Map sampleChunk(const_cast(buffer), nRows, nCols); + + // Update the mean & cov estimates + + if (ip_UpdateMethod == uint64_t(EUpdateMethod::ChunkAverage)) + { + // 'Average of per-chunk covariance matrices'. This might not be a proper cov over + // the dataset, but seems occasionally produce nicely smoothed results when used for CSP. + + const Eigen::MatrixXd chunkMean = sampleChunk.colwise().mean(); + const Eigen::MatrixXd chunkCentered = sampleChunk.rowwise() - chunkMean.row(0); + + Eigen::MatrixXd chunkCov = (1.0 / double(nRows)) * chunkCentered.transpose() * chunkCentered; + + if (ip_TraceNormalization) + { + // This normalization can be seen e.g. Muller-Gerkin & al., 1999. Presumably the idea is to normalize the + // scale of each chunk in order to compensate for possible signal power drift over time during the EEG recording, + // making each chunks' covariance contribute similarly to the average regardless of + // the current average power. Such a normalization could also be implemented in its own + // box and not done here. + + chunkCov = chunkCov / chunkCov.trace(); + } + + m_mean += chunkMean; + m_cov += chunkCov; + + m_n++; + + // dumpMatrix(this->getLogManager(), sampleChunk, "SampleChunk"); + // dumpMatrix(this->getLogManager(), sampleCenteredMean, "SampleCenteredMean"); + } + else if (ip_UpdateMethod == uint64_t(EUpdateMethod::Incremental)) + { + // Incremental sample-per-sample cov updating. + // It should be implementing the Youngs & Cramer algorithm as described in + // Chan, Golub, Leveq, "Updating formulae and a pairwise algorithm...", 1979 + + size_t start = 0; + if (m_n == 0) + { + m_mean = sampleChunk.row(0); + start = 1; + m_n = 1; + } + + Eigen::MatrixXd chunkContribution; + chunkContribution.resizeLike(m_cov); + chunkContribution.setZero(); + + for (size_t i = start; i < nRows; ++i) + { + m_mean += sampleChunk.row(i); + + const Eigen::MatrixXd diff = (m_n + 1.0) * sampleChunk.row(i) - m_mean; + const Eigen::MatrixXd outerProd = diff.transpose() * diff; + + chunkContribution += 1.0 / (m_n * (m_n + 1.0)) * outerProd; + + m_n++; + } + + if (ip_TraceNormalization) { chunkContribution = chunkContribution / chunkContribution.trace(); } + + m_cov += chunkContribution; + + // dumpMatrix(this->getLogManager(), sampleChunk, "Sample"); + } +#if 0 + else if(method == 2) + { + // Increment sample counts + const size_t countBefore = m_n; + const size_t countChunk = nRows; + const size_t countAfter = countBefore + countChunk; + const MatrixXd sampleSum = sampleChunk.colwise().sum(); + + // Center the chunk + const MatrixXd sampleCentered = sampleChunk.rowwise() - sampleSum.row(0)*(1.0/(double)countChunk); + + const MatrixXd sampleCoMoment = (sampleCentered.transpose() * sampleCentered); + + m_cov = m_cov + sampleCoMoment; + + if(countBefore>0) + { + const MatrixXd meanDifference = (countChunk/(double)countBefore) * m_mean - sampleSum; + const MatrixXd meanDiffOuterProduct = meanDifference.transpose()*meanDifference; + + m_cov += meanDiffOuterProduct*countBefore/(countChunk*countAfter); + } + + m_mean = m_mean + sampleSum; + + m_n = countAfter; + } + else + { + // Increment sample counts + const size_t countBefore = m_n; + const size_t countChunk = nRows; + const size_t countAfter = countBefore + countChunk; + + // Insert our data into an Eigen matrix. As Eigen doesn't have const double* constructor, we cast away the const. + const Map dataMatrix(const_cast(buffer),nRows,nCols); + + // Estimate the current sample means + const MatrixXdRowMajor sampleMean = dataMatrix.colwise().mean(); + + // Center the current data with the previous(!) mean + const MatrixXdRowMajor sampleCentered = dataMatrix.rowwise() - m_mean.row(0); + + // Estimate the current covariance + const MatrixXd sampleCov = (sampleCentered.transpose() * sampleCentered) * (1.0/(double)nRows); + + // fixme: recheck the weights ... + + // Update the global mean and cov + if(countBefore>0) + { + m_mean = ( m_mean*countBefore + sampleMean*nRows) / (double)countAfter; + m_cov = ( m_cov*countBefore + sampleCov*(countBefore/(double)countAfter) ) / (double)countAfter; + } + else + { + m_mean = sampleMean; + m_cov = sampleCov; + } + + + m_n = countAfter; + } +#endif + else { OV_ERROR_KRF("Unknown update method [" << CIdentifier(ip_UpdateMethod).str() << "]", Kernel::ErrorType::BadSetting); } + } + + // Give output with regularization (mix prior + cov)? + if (isInputTriggerActive(OVP_Algorithm_OnlineCovariance_Process_GetCov)) + { + const size_t nCols = ip_FeatureVectorSet->getDimensionSize(1); + + OV_ERROR_UNLESS_KRF(m_n > 0, "No sample to compute covariance", Kernel::ErrorType::BadConfig); + + // Converters to CMatrix + Eigen::Map outputMean(op_Mean->getBuffer(), 1, nCols); + Eigen::Map outputCov(op_CovarianceMatrix->getBuffer(), nCols, nCols); + + // The shrinkage parameter pulls the covariance matrix towards diagonal covariance + Eigen::MatrixXd priorCov; + priorCov.resizeLike(m_cov); + priorCov.setIdentity(); + + // Mix the prior and the sample estimates according to the shrinkage parameter. We scale by 1/n to normalize + outputMean = m_mean / double(m_n); + outputCov = ip_Shrinkage * priorCov + (1.0 - ip_Shrinkage) * (m_cov / double(m_n)); + + // Debug block + dumpMatrix(this->getLogManager(), outputMean, "Data mean"); + dumpMatrix(this->getLogManager(), m_cov / double(m_n), "Data cov"); + dumpMatrix(this->getLogManager(), ip_Shrinkage * priorCov, "Prior cov"); + dumpMatrix(this->getLogManager(), outputCov, "Output cov"); + } + + // Give just the output with no shrinkage? + if (isInputTriggerActive(OVP_Algorithm_OnlineCovariance_Process_GetCovRaw)) + { + const size_t nCols = ip_FeatureVectorSet->getDimensionSize(1); + + OV_ERROR_UNLESS_KRF(m_n > 0, "No sample to compute covariance", Kernel::ErrorType::BadConfig); + + // Converters to CMatrix + Eigen::Map outputMean(op_Mean->getBuffer(), 1, nCols); + Eigen::Map outputCov(op_CovarianceMatrix->getBuffer(), nCols, nCols); + + // We scale by 1/n to normalize + outputMean = m_mean / double(m_n); + outputCov = m_cov / double(m_n); + + // Debug block + dumpMatrix(this->getLogManager(), outputMean, "Data mean"); + dumpMatrix(this->getLogManager(), outputCov, "Data Cov"); + } + + return true; +} + +#endif // TARGET_HAS_ThirdPartyEIGEN + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmOnlineCovariance.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmOnlineCovariance.h new file mode 100644 index 0000000..d42dc4c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/algorithms/basic/ovpCAlgorithmOnlineCovariance.h @@ -0,0 +1,89 @@ +/* + * + * Incremental covariance estimators with shrinkage + * + */ +#pragma once + +#if defined TARGET_HAS_ThirdPartyEIGEN + +#include "../../ovp_defines.h" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CAlgorithmOnlineCovariance final : virtual public Toolkit::TAlgorithm +{ + typedef Eigen::Matrix MatrixXdRowMajor; + +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_OnlineCovariance) + +protected: + // Debug method. Prints the matrix to the logManager. May be disabled in implementation. + static void dumpMatrix(Kernel::ILogManager& mgr, const MatrixXdRowMajor& mat, const CString& desc); + + // These are non-normalized estimates for the corresp. statistics + Eigen::MatrixXd m_cov; + Eigen::MatrixXd m_mean; + + // The divisor for the above estimates to do the normalization + uint64_t m_n = 0; +}; + +class CAlgorithmOnlineCovarianceDesc final : virtual public IAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Online Covariance"); } + CString getAuthorName() const override { return CString("Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Incrementally computes covariance with shrinkage."); } + + CString getDetailedDescription() const override { return CString("Regularized covariance output is computed as (diag*shrink + cov)"); } + + CString getCategory() const override { return CString(""); } + CString getVersion() const override { return CString("0.5"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_OnlineCovariance; } + IPluginObject* create() override { return new CAlgorithmOnlineCovariance; } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_OnlineCovariance_InputParameterId_Shrinkage, "Shrinkage", Kernel::ParameterType_Float); + prototype.addInputParameter(OVP_Algorithm_OnlineCovariance_InputParameterId_InputVectors, "Input vectors", Kernel::ParameterType_Matrix); + prototype.addInputParameter(OVP_Algorithm_OnlineCovariance_InputParameterId_UpdateMethod, "Cov update method", Kernel::ParameterType_Enumeration, + OVP_TypeId_OnlineCovariance_UpdateMethod); + prototype.addInputParameter(OVP_Algorithm_OnlineCovariance_InputParameterId_TraceNormalization, "Trace normalization", Kernel::ParameterType_Boolean); + + // The algorithm returns these outputs + prototype.addOutputParameter(OVP_Algorithm_OnlineCovariance_OutputParameterId_Mean, "Mean vector", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_OnlineCovariance_OutputParameterId_CovarianceMatrix, "Covariance matrix", Kernel::ParameterType_Matrix); + + prototype.addInputTrigger(OVP_Algorithm_OnlineCovariance_Process_Reset, "Reset the algorithm"); + prototype.addInputTrigger(OVP_Algorithm_OnlineCovariance_Process_Update, "Append a chunk of data"); + prototype.addInputTrigger(OVP_Algorithm_OnlineCovariance_Process_GetCov, "Get the current regularized covariance matrix & mean"); + prototype.addInputTrigger(OVP_Algorithm_OnlineCovariance_Process_GetCovRaw, "Get the current covariance matrix & mean"); + + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_OnlineCovarianceDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE + + +#endif // TARGET_HAS_ThirdPartyEIGEN diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelRename.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelRename.cpp new file mode 100644 index 0000000..03e04b0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelRename.cpp @@ -0,0 +1,93 @@ +#include "ovpCBoxAlgorithmChannelRename.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmChannelRename::initialize() +{ + std::vector tokens; + const CString setting = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + const size_t nToken = split(setting, Toolkit::String::TSplitCallback>(tokens), OV_Value_EnumeratedStringSeparator); + + m_names.clear(); + for (size_t i = 0; i < nToken; ++i) { m_names.push_back(tokens[i].toASCIIString()); } + + this->getStaticBoxContext().getOutputType(0, m_typeID); + + if (m_typeID == OV_TypeId_Signal) + { + m_decoder = new Toolkit::TSignalDecoder(*this, 0); + m_encoder = new Toolkit::TSignalEncoder(*this, 0); + } + else if (m_typeID == OV_TypeId_StreamedMatrix || m_typeID == OV_TypeId_CovarianceMatrix || m_typeID == OV_TypeId_TimeFrequency) + { + m_decoder = new Toolkit::TStreamedMatrixDecoder(*this, 0); + m_encoder = new Toolkit::TStreamedMatrixEncoder(*this, 0); + } + else if (m_typeID == OV_TypeId_Spectrum) + { + m_decoder = new Toolkit::TSpectrumDecoder(*this, 0); + m_encoder = new Toolkit::TSpectrumEncoder(*this, 0); + } + else { OV_ERROR_KRF("Incompatible stream type", Kernel::ErrorType::BadConfig); } + + ip_Matrix = m_encoder.getInputMatrix(); + op_Matrix = m_decoder.getOutputMatrix(); + + m_encoder.getInputMatrix().setReferenceTarget(m_decoder.getOutputMatrix()); + + if (m_typeID == OV_TypeId_Signal) { m_encoder.getInputSamplingRate().setReferenceTarget(m_decoder.getOutputSamplingRate()); } + + if (m_typeID == OV_TypeId_Spectrum) + { + m_encoder.getInputSamplingRate().setReferenceTarget(m_decoder.getOutputSamplingRate()); + m_encoder.getInputFrequencyAbcissa().setReferenceTarget(m_decoder.getOutputFrequencyAbcissa()); + } + + return true; +} + +bool CBoxAlgorithmChannelRename::uninitialize() +{ + m_decoder.uninitialize(); + m_encoder.uninitialize(); + + return true; +} + +bool CBoxAlgorithmChannelRename::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmChannelRename::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t chunk = 0; chunk < boxContext.getInputChunkCount(0); ++chunk) + { + m_decoder.decode(chunk); + if (m_decoder.isHeaderReceived()) + { + ip_Matrix->copyDescription(*op_Matrix); + for (size_t channel = 0; channel < ip_Matrix->getDimensionSize(0) && channel < m_names.size(); ++channel) + { + ip_Matrix->setDimensionLabel(0, channel, m_names[channel].c_str()); + } + m_encoder.encodeHeader(); + } + if (m_decoder.isBufferReceived()) { m_encoder.encodeBuffer(); } + if (m_decoder.isEndReceived()) { m_encoder.encodeEnd(); } + + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, chunk), boxContext.getInputChunkEndTime(0, chunk)); + boxContext.markInputAsDeprecated(0, chunk); + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelRename.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelRename.h new file mode 100644 index 0000000..723dc5b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelRename.h @@ -0,0 +1,106 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmChannelRename final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_ChannelRename) + +protected: + + Toolkit::TGenericDecoder m_decoder; + Toolkit::TGenericEncoder m_encoder; + + CIdentifier m_typeID = CIdentifier::undefined(); + + Kernel::TParameterHandler ip_Matrix; + Kernel::TParameterHandler op_Matrix; + + std::vector m_names; +}; + +class CBoxAlgorithmChannelRenameListener final : public Toolkit::TBoxListener +{ +public: + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(index, typeID); + box.setOutputType(index, typeID); + return true; + } + + bool onOutputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getOutputType(index, typeID); + box.setInputType(index, typeID); + return true; + } + + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmChannelRenameDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Channel Rename"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Renames channels of different types of streamed matrices"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Signal processing/Channels"); } + CString getVersion() const override { return CString("1.1"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("1.1.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ChannelRename; } + IPluginObject* create() override { return new CBoxAlgorithmChannelRename; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmChannelRenameListener; } + void releaseBoxListener(IBoxListener* boxListener) const override { delete boxListener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input matrix", OV_TypeId_Signal); + prototype.addOutput("Output matrix", OV_TypeId_Signal); + prototype.addSetting("New channel names", OV_TypeId_String, "Channel 1;Channel 2"); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_Spectrum); + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + prototype.addInputSupport(OV_TypeId_TimeFrequency); + prototype.addInputSupport(OV_TypeId_CovarianceMatrix); + + prototype.addOutputSupport(OV_TypeId_Signal); + prototype.addOutputSupport(OV_TypeId_Spectrum); + prototype.addOutputSupport(OV_TypeId_StreamedMatrix); + prototype.addOutputSupport(OV_TypeId_TimeFrequency); + prototype.addOutputSupport(OV_TypeId_CovarianceMatrix); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ChannelRenameDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelSelector.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelSelector.cpp new file mode 100755 index 0000000..0bf3c49 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelSelector.cpp @@ -0,0 +1,292 @@ +#include "ovpCBoxAlgorithmChannelSelector.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + + +namespace { +size_t FindChannel(const CMatrix& matrix, const CString& channel, const EMatchMethod matchMethod, const size_t start = 0) +{ + size_t result = std::numeric_limits::max(); + const size_t nChannel = matrix.getDimensionSize(0); + + if (matchMethod == EMatchMethod::Name) + { + for (size_t i = start; i < matrix.getDimensionSize(0); ++i) + { + if (Toolkit::String::isAlmostEqual(matrix.getDimensionLabel(0, i), channel, false)) { result = i; } + } + } + else if (matchMethod == EMatchMethod::Index) + { + try + { + const int value = std::stoi(channel.toASCIIString()); + + if (value < 0) + { + size_t idx = size_t(- value - 1); // => makes it 0-indexed ! + if (idx < nChannel) + { + idx = nChannel - idx - 1; // => reverses index + if (start <= idx) { result = idx; } + } + } + if (value > 0) + { + const size_t index = size_t(value - 1); // => makes it 0-indexed ! + if (index < nChannel) { if (start <= index) { result = index; } } + } + } + catch (const std::exception&) + { + // catch block intentionnaly left blank + } + } + else if (matchMethod == EMatchMethod::Smart) + { + if (result == std::numeric_limits::max()) { result = FindChannel(matrix, channel, EMatchMethod::Name, start); } + if (result == std::numeric_limits::max()) { result = FindChannel(matrix, channel, EMatchMethod::Index, start); } + } + + return result; +} +} // namespace + +bool CBoxAlgorithmChannelSelector::initialize() +{ + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + + CIdentifier typeID; + boxContext.getOutputType(0, typeID); + + m_decoder = nullptr; + m_encoder = nullptr; + + if (typeID == OV_TypeId_Signal) + { + auto* encoder = new Toolkit::TSignalEncoder; + auto* decoder = new Toolkit::TSignalDecoder; + encoder->initialize(*this, 0); + decoder->initialize(*this, 0); + encoder->getInputSamplingRate().setReferenceTarget(decoder->getOutputSamplingRate()); + m_decoder = decoder; + m_encoder = encoder; + m_iMatrix = decoder->getOutputMatrix(); + m_oMatrix = encoder->getInputMatrix(); + } + else if (typeID == OV_TypeId_Spectrum) + { + auto* encoder = new Toolkit::TSpectrumEncoder; + auto* decoder = new Toolkit::TSpectrumDecoder; + encoder->initialize(*this, 0); + decoder->initialize(*this, 0); + encoder->getInputFrequencyAbscissa().setReferenceTarget(decoder->getOutputFrequencyAbscissa()); + encoder->getInputSamplingRate().setReferenceTarget(decoder->getOutputSamplingRate()); + + m_decoder = decoder; + m_encoder = encoder; + m_iMatrix = decoder->getOutputMatrix(); + m_oMatrix = encoder->getInputMatrix(); + } + else if (typeID == OV_TypeId_StreamedMatrix) + { + auto* encoder = new Toolkit::TStreamedMatrixEncoder; + auto* decoder = new Toolkit::TStreamedMatrixDecoder; + encoder->initialize(*this, 0); + decoder->initialize(*this, 0); + m_decoder = decoder; + m_encoder = encoder; + m_iMatrix = decoder->getOutputMatrix(); + m_oMatrix = encoder->getInputMatrix(); + } + else { OV_ERROR_KRF("Invalid input type [" << typeID.str() << "]", Kernel::ErrorType::BadInput); } + + m_vLookup.clear(); + return true; +} + +bool CBoxAlgorithmChannelSelector::uninitialize() +{ + if (m_decoder) + { + m_decoder->uninitialize(); + delete m_decoder; + } + if (m_encoder) + { + m_encoder->uninitialize(); + delete m_encoder; + } + + return true; +} + +bool CBoxAlgorithmChannelSelector::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmChannelSelector::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_decoder->decode(i); + if (m_decoder->isHeaderReceived()) + { + CString settingValue = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + const ESelectionMethod selectionMethod = ESelectionMethod(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1))); + const EMatchMethod matchMethod = EMatchMethod(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2))); + + if (selectionMethod == ESelectionMethod::Select_EEG) + { + // ______________________________________________________________________________________________________________________________________________________ + // + // Collects channels with names corresponding to EEG + // ______________________________________________________________________________________________________________________________________________________ + // + + CString eegChannelNames = this->getConfigurationManager().expand("${Box_ChannelSelector_EEGChannelNames}"); + + std::vector token; + const size_t nToken = split(eegChannelNames, Toolkit::String::TSplitCallback>(token), + OV_Value_EnumeratedStringSeparator); + + for (size_t j = 0; j < m_iMatrix->getDimensionSize(0); ++j) + { + for (size_t k = 0; k < nToken; ++k) + { + if (Toolkit::String::isAlmostEqual(m_iMatrix->getDimensionLabel(0, j), token[k], false)) { m_vLookup.push_back(j); } + } + } + } + else + { + // ______________________________________________________________________________________________________________________________________________________ + // + // Splits the channel list in order to build up the look up table + // The look up table is later used to fill in the matrix content + // ______________________________________________________________________________________________________________________________________________________ + // + + std::vector tokens; + const size_t nToken = split(settingValue, Toolkit::String::TSplitCallback>(tokens), + OV_Value_EnumeratedStringSeparator); + for (size_t j = 0; j < nToken; ++j) + { + std::vector subTokens; + + // Checks if the token is a range + if (split(tokens[j], Toolkit::String::TSplitCallback>(subTokens), + OV_Value_RangeStringSeparator) == 2) + { + // Finds the first & second part of the range (only index based) + size_t startIdx = FindChannel(*m_iMatrix, subTokens[0], EMatchMethod::Index); + size_t endIdx = FindChannel(*m_iMatrix, subTokens[1], EMatchMethod::Index); + + // When first or second part is not found but associated token is empty, don't consider this as an error + if (startIdx == std::numeric_limits::max() && subTokens[0] == CString("")) { startIdx = 0; } + if (endIdx == std::numeric_limits::max() && subTokens[1] == CString("")) { endIdx = m_iMatrix->getDimensionSize(0) - 1; } + + // After these corections, if either first or second token were not found, or if start index is greater than start index, consider this an error and invalid range + OV_ERROR_UNLESS_KRF( + startIdx != std::numeric_limits::max() && endIdx != std::numeric_limits::max() && startIdx <= endIdx, + "Invalid channel range [" << tokens[j] << "] - splitted as [" << subTokens[0] << "][" << subTokens[1] << "]", + Kernel::ErrorType::BadSetting); + + // The range is valid so selects all the channels in this range + this->getLogManager() << Kernel::LogLevel_Debug << "For range [" << tokens[j] << "] :\n"; + for (size_t k = startIdx; k <= endIdx; ++k) + { + m_vLookup.push_back(k); + this->getLogManager() << Kernel::LogLevel_Debug << " Selected channel [" << k + 1 << "]\n"; + } + } + else + { + // This is not a range, so we can consider the whole token as a single token name + size_t found = false; + size_t index = std::numeric_limits::max(); + + // Looks for all the channels with this name + while ((index = FindChannel(*m_iMatrix, tokens[j], matchMethod, index + 1)) != std::numeric_limits::max()) + { + found = true; + m_vLookup.push_back(index); + this->getLogManager() << Kernel::LogLevel_Debug << "Selected channel [" << index + 1 << "]\n"; + } + + OV_ERROR_UNLESS_KRF(found, "Invalid channel [" << tokens[j] << "]", Kernel::ErrorType::BadSetting); + } + } + + // ______________________________________________________________________________________________________________________________________________________ + // + // When selection method is set to reject + // We have to revert the selection building up a new look up table and replacing the old one + // ______________________________________________________________________________________________________________________________________________________ + // + + if (selectionMethod == ESelectionMethod::Reject) + { + std::vector inversedLookup; + for (size_t j = 0; j < m_iMatrix->getDimensionSize(0); ++j) + { + bool selected = false; + for (size_t k = 0; k < m_vLookup.size(); ++k) { selected |= (m_vLookup[k] == j); } + if (!selected) { inversedLookup.push_back(j); } + } + m_vLookup = inversedLookup; + } + } + + // ______________________________________________________________________________________________________________________________________________________ + // + // Now we have the exact topology of the output matrix :) + // ______________________________________________________________________________________________________________________________________________________ + // + + OV_ERROR_UNLESS_KRF(!m_vLookup.empty(), "No channel selected", Kernel::ErrorType::BadConfig); + + m_oMatrix->resize(m_vLookup.size(), m_iMatrix->getDimensionSize(1)); + for (size_t j = 0; j < m_vLookup.size(); ++j) + { + if (m_vLookup[j] < m_iMatrix->getDimensionSize(0)) { m_oMatrix->setDimensionLabel(0, j, m_iMatrix->getDimensionLabel(0, m_vLookup[j])); } + else { m_oMatrix->setDimensionLabel(0, j, "Missing channel"); } + } + for (size_t j = 0; j < m_iMatrix->getDimensionSize(1); ++j) { m_oMatrix->setDimensionLabel(1, j, m_iMatrix->getDimensionLabel(1, j)); } + + m_encoder->encodeHeader(); + } + + if (m_decoder->isBufferReceived()) + { + // ______________________________________________________________________________________________________________________________________________________ + // + // When a buffer is received, just copy the channel content depending on the look up table + // ______________________________________________________________________________________________________________________________________________________ + // + + const size_t nSample = m_oMatrix->getDimensionSize(1); + for (size_t j = 0; j < m_vLookup.size(); ++j) + { + if (m_vLookup[j] < m_iMatrix->getDimensionSize(0)) + { + memcpy(m_oMatrix->getBuffer() + j * nSample, m_iMatrix->getBuffer() + m_vLookup[j] * nSample, nSample * sizeof(double)); + } + } + m_encoder->encodeBuffer(); + } + if (m_decoder->isEndReceived()) { m_encoder->encodeEnd(); } + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelSelector.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelSelector.h new file mode 100644 index 0000000..1f6b694 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmChannelSelector.h @@ -0,0 +1,160 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmChannelSelector final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_ChannelSelector) + +protected: + + Toolkit::TDecoder* m_decoder = nullptr; + Toolkit::TEncoder* m_encoder = nullptr; + + CMatrix* m_iMatrix = nullptr; + CMatrix* m_oMatrix = nullptr; + + std::vector m_vLookup; +}; + +class CBoxAlgorithmChannelSelectorListener final : public Toolkit::TBoxListener +{ +public: + bool onOutputTypeChanged(Kernel::IBox& box, const size_t /*index*/) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getOutputType(0, typeID); + if (typeID == OV_TypeId_Signal || typeID == OV_TypeId_Spectrum || typeID == OV_TypeId_StreamedMatrix) + { + box.setInputType(0, typeID); + return true; + } + box.getInputType(0, typeID); + box.setOutputType(0, typeID); + OV_ERROR_KRF("Invalid output type [" << typeID.str() << "] (expected Signal, Spectrum or Streamed Matrix)", Kernel::ErrorType::BadOutput); + } + + bool onInputTypeChanged(Kernel::IBox& box, const size_t /*index*/) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(0, typeID); + if (typeID == OV_TypeId_Signal || typeID == OV_TypeId_Spectrum || typeID == OV_TypeId_StreamedMatrix) + { + box.setOutputType(0, typeID); + return true; + } + box.getOutputType(0, typeID); + box.setInputType(0, typeID); + + OV_ERROR_KRF("Invalid input type [" << typeID.str() << "] (expected Signal, Spectrum or Streamed Matrix)", Kernel::ErrorType::BadInput); + } + + bool onSettingValueChanged(Kernel::IBox& box, const size_t index) override + { + //we are only interested in the setting 0 and the type changes (select or reject) + if ((index == 0 || index == 1) && (!m_hasUserSetName)) + { + CString channels; + box.getSettingValue(0, channels); + + CString method; + CIdentifier enumID = CIdentifier::undefined(); + box.getSettingValue(1, method); + box.getSettingType(1, enumID); + + const ESelectionMethod methodID = ESelectionMethod(this->getTypeManager().getEnumerationEntryValueFromName(enumID, method)); + + if (methodID == ESelectionMethod::Reject) { channels = CString("!") + channels; } + box.setName(channels); + } + return true; + } + + bool onNameChanged(Kernel::IBox& box) override + //when user set box name manually + { + if (m_hasUserSetName) + { + const CString rename = box.getName(); + if (rename == CString("Channel Selector")) + {//default name, we switch back to default behaviour + m_hasUserSetName = false; + } + } + else { m_hasUserSetName = true; } + return true; + } + + bool initialize() override + { + m_hasUserSetName = false;//need to initialize this value + return true; + } + +private: + bool m_hasUserSetName = false; + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmChannelSelectorDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Channel Selector"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Select a subset of signal channels"); } + + CString getDetailedDescription() const override { return CString("Selection can be based on channel name (case-sensitive) or index starting from 0"); } + + CString getCategory() const override { return CString("Signal processing/Channels"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ChannelSelector; } + IPluginObject* create() override { return new CBoxAlgorithmChannelSelector; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmChannelSelectorListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addOutput("Output signal", OV_TypeId_Signal); + prototype.addSetting("Channel List", OV_TypeId_String, ":"); + prototype.addSetting("Action", OVP_TypeId_SelectionMethod, "Select"); + prototype.addSetting("Channel Matching Method", OVP_TypeId_MatchMethod, "Smart"); + + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_Spectrum); + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + + prototype.addOutputSupport(OV_TypeId_Signal); + prototype.addOutputSupport(OV_TypeId_Spectrum); + prototype.addOutputSupport(OV_TypeId_StreamedMatrix); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ChannelSelectorDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmCrop.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmCrop.cpp new file mode 100755 index 0000000..1db0d01 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmCrop.cpp @@ -0,0 +1,128 @@ +#include "ovpCBoxAlgorithmCrop.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmCrop::initialize() +{ + CIdentifier inputTypeID; + getStaticBoxContext().getInputType(0, inputTypeID); + + if (inputTypeID == OV_TypeId_StreamedMatrix) + { + m_decoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixDecoder)); + m_encoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder)); + } + else if (inputTypeID == OV_TypeId_FeatureVector) + { + m_decoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorDecoder)); + m_encoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorEncoder)); + } + else if (inputTypeID == OV_TypeId_Signal) + { + m_decoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalDecoder)); + m_encoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + } + else if (inputTypeID == OV_TypeId_Spectrum) + { + m_decoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumDecoder)); + m_encoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumEncoder)); + } + else { return false; } + m_decoder->initialize(); + m_encoder->initialize(); + + if (inputTypeID == OV_TypeId_StreamedMatrix) { } + else if (inputTypeID == OV_TypeId_FeatureVector) { } + else if (inputTypeID == OV_TypeId_Signal) + { + m_encoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + } + else if (inputTypeID == OV_TypeId_Spectrum) + { + m_encoder->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_FrequencyAbscissa)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_FrequencyAbscissa)); + m_encoder->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_Sampling)); + } + + m_matrix = new CMatrix(); + Kernel::TParameterHandler(m_encoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)).setReferenceTarget(m_matrix); + Kernel::TParameterHandler(m_decoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)).setReferenceTarget(m_matrix); + + m_cropMethod = ECropMethod(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0))); + m_minCropValue = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_maxCropValue = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + + OV_ERROR_UNLESS_KRF(m_minCropValue < m_maxCropValue, + "Invalid crop values: minimum crop value [" << m_minCropValue << "] should be lower than the maximum crop value [" + << m_maxCropValue << "]", Kernel::ErrorType::BadSetting); + + return true; +} + +bool CBoxAlgorithmCrop::uninitialize() +{ + delete m_matrix; + + m_encoder->uninitialize(); + m_decoder->uninitialize(); + + getAlgorithmManager().releaseAlgorithm(*m_encoder); + getAlgorithmManager().releaseAlgorithm(*m_decoder); + + return true; +} + +bool CBoxAlgorithmCrop::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmCrop::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + Kernel::TParameterHandler iHandle( + m_decoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_InputParameterId_MemoryBufferToDecode)); + Kernel::TParameterHandler oHandle(m_encoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + iHandle = boxContext.getInputChunk(0, i); + oHandle = boxContext.getOutputChunk(0); + + m_decoder->process(); + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedHeader)) + { + m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedBuffer)) + { + double* buffer = m_matrix->getBuffer(); + for (size_t j = 0; j < m_matrix->getBufferElementCount(); j++, buffer++) + { + if (*buffer < m_minCropValue && (m_cropMethod == ECropMethod::Min || m_cropMethod == ECropMethod::MinMax)) { *buffer = m_minCropValue; } + if (*buffer > m_maxCropValue && (m_cropMethod == ECropMethod::Max || m_cropMethod == ECropMethod::MinMax)) { *buffer = m_maxCropValue; } + } + m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedEnd)) + { + m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + boxContext.markInputAsDeprecated(0, i); + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmCrop.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmCrop.h new file mode 100644 index 0000000..56e2483 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmCrop.h @@ -0,0 +1,98 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmCrop final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_Crop) + +protected: + + CMatrix* m_matrix = nullptr; + Kernel::IAlgorithmProxy* m_decoder = nullptr; + Kernel::IAlgorithmProxy* m_encoder = nullptr; + double m_minCropValue = 0; + double m_maxCropValue = 0; + ECropMethod m_cropMethod = ECropMethod::MinMax; +}; + +class CBoxAlgorithmCropListener final : public Toolkit::TBoxListener +{ +public: + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(index, typeID); + box.setOutputType(index, typeID); + return true; + } + + bool onOutputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getOutputType(index, typeID); + box.setInputType(index, typeID); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmCropDesc final : virtual public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Crop"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Truncates signal values to a specified range"); } + CString getDetailedDescription() const override { return CString("Minimum or maximum or both limits can be specified"); } + CString getCategory() const override { return CString("Signal processing/Basic"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_Crop; } + IPluginObject* create() override { return new CBoxAlgorithmCrop; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmCropListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input matrix", OV_TypeId_StreamedMatrix); + prototype.addOutput("Output matrix", OV_TypeId_StreamedMatrix); + prototype.addSetting("Crop method", OVP_TypeId_CropMethod, "MinMax"); + prototype.addSetting("Min crop value", OV_TypeId_Float, "-1"); + prototype.addSetting("Max crop value", OV_TypeId_Float, "1"); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_Spectrum); + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + prototype.addInputSupport(OV_TypeId_FeatureVector); + + prototype.addOutputSupport(OV_TypeId_Signal); + prototype.addOutputSupport(OV_TypeId_Spectrum); + prototype.addOutputSupport(OV_TypeId_StreamedMatrix); + prototype.addOutputSupport(OV_TypeId_FeatureVector); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_CropDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmEpochAverage.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmEpochAverage.cpp new file mode 100755 index 0000000..10aba78 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmEpochAverage.cpp @@ -0,0 +1,146 @@ +#include "ovpCBoxAlgorithmEpochAverage.h" + +#include "../../algorithms/basic/ovpCAlgorithmMatrixAverage.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmEpochAverage::initialize() +{ + CIdentifier inputTypeId; + getStaticBoxContext().getInputType(0, inputTypeId); + if (inputTypeId == OV_TypeId_StreamedMatrix || inputTypeId == OV_TypeId_TimeFrequency) + { + m_decoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixDecoder)); + m_encoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder)); + } + else if (inputTypeId == OV_TypeId_FeatureVector) + { + m_decoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorDecoder)); + m_encoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorEncoder)); + } + else if (inputTypeId == OV_TypeId_Signal) + { + m_decoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalDecoder)); + m_encoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + } + else if (inputTypeId == OV_TypeId_Spectrum) + { + m_decoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumDecoder)); + m_encoder = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumEncoder)); + } + else { return false; } + m_decoder->initialize(); + m_encoder->initialize(); + + m_matrixAverage = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_MatrixAverage)); + m_matrixAverage->initialize(); + + if (inputTypeId == OV_TypeId_StreamedMatrix) { } + else if (inputTypeId == OV_TypeId_FeatureVector) { } + else if (inputTypeId == OV_TypeId_Signal) + { + m_encoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + } + else if (inputTypeId == OV_TypeId_Spectrum) + { + m_encoder->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_FrequencyAbscissa)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_FrequencyAbscissa)); + m_encoder->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_Sampling)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_Sampling)); + } + + ip_averagingMethod.initialize(m_matrixAverage->getInputParameter(OVP_Algorithm_MatrixAverage_InputParameterId_AveragingMethod)); + ip_matrixCount.initialize(m_matrixAverage->getInputParameter(OVP_Algorithm_MatrixAverage_InputParameterId_MatrixCount)); + + ip_averagingMethod = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)); + ip_matrixCount = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1)); + + m_matrixAverage->getInputParameter(OVP_Algorithm_MatrixAverage_InputParameterId_Matrix)->setReferenceTarget( + m_decoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + m_encoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)->setReferenceTarget( + m_matrixAverage->getOutputParameter(OVP_Algorithm_MatrixAverage_OutputParameterId_AveragedMatrix)); + + OV_ERROR_UNLESS_KRF(ip_matrixCount > 0, "Invalid number of epochs (expected value > 0)", Kernel::ErrorType::BadSetting); + + return true; +} + +bool CBoxAlgorithmEpochAverage::uninitialize() +{ + CIdentifier inputTypeID; + getStaticBoxContext().getInputType(0, inputTypeID); + if (inputTypeID == OV_TypeId_StreamedMatrix || inputTypeID == OV_TypeId_FeatureVector || inputTypeID == OV_TypeId_Signal || + inputTypeID == OV_TypeId_Spectrum) + { + ip_averagingMethod.uninitialize(); + ip_matrixCount.uninitialize(); + + m_matrixAverage->uninitialize(); + m_encoder->uninitialize(); + m_decoder->uninitialize(); + + getAlgorithmManager().releaseAlgorithm(*m_matrixAverage); + getAlgorithmManager().releaseAlgorithm(*m_encoder); + getAlgorithmManager().releaseAlgorithm(*m_decoder); + } + + return true; +} + +bool CBoxAlgorithmEpochAverage::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmEpochAverage::process() +{ + Kernel::IBoxIO& boxContext = getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + for (size_t i = 0; i < nInput; ++i) + { + for (size_t j = 0; j < boxContext.getInputChunkCount(i); ++j) + { + Kernel::TParameterHandler iMemoryBufferHandle( + m_decoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_InputParameterId_MemoryBufferToDecode)); + Kernel::TParameterHandler oMemoryBufferHandle( + m_encoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + iMemoryBufferHandle = boxContext.getInputChunk(i, j); + oMemoryBufferHandle = boxContext.getOutputChunk(i); + + m_decoder->process(); + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedHeader)) + { + m_matrixAverage->process(OVP_Algorithm_MatrixAverage_InputTriggerId_Reset); + m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader); + boxContext.markOutputAsReadyToSend(i, boxContext.getInputChunkStartTime(i, j), boxContext.getInputChunkEndTime(i, j)); + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedBuffer)) + { + m_matrixAverage->process(OVP_Algorithm_MatrixAverage_InputTriggerId_FeedMatrix); + if (m_matrixAverage->isOutputTriggerActive(OVP_Algorithm_MatrixAverage_OutputTriggerId_AveragePerformed)) + { + m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(i, boxContext.getInputChunkStartTime(i, j), boxContext.getInputChunkEndTime(i, j)); + } + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedEnd)) + { + m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd); + boxContext.markOutputAsReadyToSend(i, boxContext.getInputChunkStartTime(i, j), boxContext.getInputChunkEndTime(i, j)); + } + + boxContext.markInputAsDeprecated(i, j); + } + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmEpochAverage.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmEpochAverage.h new file mode 100644 index 0000000..845657a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmEpochAverage.h @@ -0,0 +1,104 @@ +#pragma once + +#include "../../ovp_defines.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmEpochAverage final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_EpochAverage) + +protected: + + Kernel::IAlgorithmProxy* m_decoder = nullptr; + Kernel::IAlgorithmProxy* m_encoder = nullptr; + Kernel::IAlgorithmProxy* m_matrixAverage = nullptr; + + Kernel::TParameterHandler ip_matrixCount; + Kernel::TParameterHandler ip_averagingMethod; +}; + +class CBoxAlgorithmEpochAverageListener final : public Toolkit::TBoxListener +{ +public: + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(index, typeID); + box.setOutputType(index, typeID); + return true; + } + + bool onOutputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getOutputType(index, typeID); + box.setInputType(index, typeID); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmEpochAverageDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Epoch average"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + + CString getShortDescription() const override { return CString("Averages matrices among time, this can be used to enhance ERPs"); } + + CString getDetailedDescription() const override + { + return CString("This box can average matrices of different types including signal, spectrum or feature vectors"); + } + + CString getCategory() const override { return CString("Signal processing/Averaging"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_EpochAverage; } + IPluginObject* create() override { return new CBoxAlgorithmEpochAverage(); } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmEpochAverageListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input epochs", OV_TypeId_StreamedMatrix); + prototype.addOutput("Averaged epochs", OV_TypeId_StreamedMatrix); + prototype.addSetting("Averaging type", OVP_TypeId_EpochAverageMethod, "Moving epoch average"); + prototype.addSetting("Epoch count", OV_TypeId_Integer, "4"); + prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_Spectrum); + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + prototype.addInputSupport(OV_TypeId_FeatureVector); + prototype.addInputSupport(OV_TypeId_TimeFrequency); + + prototype.addOutputSupport(OV_TypeId_Signal); + prototype.addOutputSupport(OV_TypeId_Spectrum); + prototype.addOutputSupport(OV_TypeId_StreamedMatrix); + prototype.addOutputSupport(OV_TypeId_FeatureVector); + prototype.addOutputSupport(OV_TypeId_TimeFrequency); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_EpochAverageDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmIdentity.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmIdentity.cpp new file mode 100644 index 0000000..2db6ef7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmIdentity.cpp @@ -0,0 +1,40 @@ +#include "ovpCBoxAlgorithmIdentity.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +void CBoxAlgorithmIdentity::release() { delete this; } + +bool CBoxAlgorithmIdentity::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmIdentity::process() +{ + Kernel::IBoxIO* boxContext = getBoxAlgorithmContext()->getDynamicBoxContext(); + const size_t nInput = getBoxAlgorithmContext()->getStaticBoxContext()->getInputCount(); + uint64_t tStart = 0; + uint64_t tEnd = 0; + size_t size = 0; + const uint8_t* buffer = nullptr; + + for (size_t i = 0; i < nInput; ++i) + { + for (size_t j = 0; j < boxContext->getInputChunkCount(i); ++j) + { + boxContext->getInputChunk(i, j, tStart, tEnd, size, buffer); + boxContext->appendOutputChunkData(i, buffer, size); + boxContext->markOutputAsReadyToSend(i, tStart, tEnd); + boxContext->markInputAsDeprecated(i, j); + } + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmIdentity.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmIdentity.h new file mode 100644 index 0000000..d783de4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmIdentity.h @@ -0,0 +1,121 @@ +#pragma once + +#include "../../ovp_defines.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmIdentity final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_Identity) +}; + +class CBoxAlgorithmIdentityListener final : public Toolkit::TBoxListener +{ +public: + + static bool check(Kernel::IBox& box) + { + size_t i; + for (i = 0; i < box.getInputCount(); ++i) { box.setInputName(i, ("Input stream " + std::to_string(i + 1)).c_str()); } + for (i = 0; i < box.getOutputCount(); ++i) { box.setOutputName(i, ("Output stream " + std::to_string(i + 1)).c_str()); } + return true; + } + + bool onDefaultInitialized(Kernel::IBox& box) override + { + box.setInputType(0, OV_TypeId_Signal); + box.setOutputType(0, OV_TypeId_Signal); + return true; + } + + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + box.setInputType(index, OV_TypeId_Signal); + box.addOutput("", OV_TypeId_Signal, box.getUnusedInputIdentifier()); + check(box); + return true; + } + + bool onInputRemoved(Kernel::IBox& box, const size_t index) override + { + box.removeOutput(index); + check(box); + return true; + } + + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(index, typeID); + box.setOutputType(index, typeID); + return true; + } + + bool onOutputAdded(Kernel::IBox& box, const size_t index) override + { + box.setOutputType(index, OV_TypeId_Signal); + box.addInput("", OV_TypeId_Signal, box.getUnusedOutputIdentifier()); + check(box); + return true; + } + + bool onOutputRemoved(Kernel::IBox& box, const size_t index) override + { + box.removeInput(index); + check(box); + return true; + } + + bool onOutputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getOutputType(index, typeID); + box.setInputType(index, typeID); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmIdentityDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Identity"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Duplicates input to output"); } + CString getDetailedDescription() const override { return CString("This simply duplicates intput on its output"); } + CString getCategory() const override { return CString("Signal processing/Basic"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_Identity; } + IPluginObject* create() override { return new CBoxAlgorithmIdentity(); } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmIdentityListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input stream", OV_TypeId_Signal); + prototype.addOutput("Output stream", OV_TypeId_Signal); + prototype.addFlag(Kernel::BoxFlag_CanAddOutput); + prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_IdentityDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmReferenceChannel.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmReferenceChannel.cpp new file mode 100644 index 0000000..ec4c849 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmReferenceChannel.cpp @@ -0,0 +1,132 @@ +#include "ovpCBoxAlgorithmReferenceChannel.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +namespace { +size_t FindChannel(const CMatrix& matrix, const CString& channel, const EMatchMethod matchMethod, const size_t start = 0) +{ + size_t res = std::numeric_limits::max(); + + if (matchMethod == EMatchMethod::Name) + { + for (size_t i = start; i < matrix.getDimensionSize(0); ++i) + { + if (Toolkit::String::isAlmostEqual(matrix.getDimensionLabel(0, i), channel, false)) { res = i; } + } + } + else if (matchMethod == EMatchMethod::Index) + { + try + { + size_t value = std::stoul(channel.toASCIIString()); + value--; // => makes it 0-indexed ! + + if (start <= size_t(value) && size_t(value) < matrix.getDimensionSize(0)) { res = size_t(value); } + } + catch (const std::exception&) + { + // catch block intentionnaly left blank + } + } + else if (matchMethod == EMatchMethod::Smart) + { + if (res == std::numeric_limits::max()) { res = FindChannel(matrix, channel, EMatchMethod::Name, start); } + if (res == std::numeric_limits::max()) { res = FindChannel(matrix, channel, EMatchMethod::Index, start); } + } + + return res; +} +} // namespace + +bool CBoxAlgorithmReferenceChannel::initialize() +{ + m_decoder.initialize(*this, 0); + m_encoder.initialize(*this, 0); + m_encoder.getInputSamplingRate().setReferenceTarget(m_decoder.getOutputSamplingRate()); + return true; +} + +bool CBoxAlgorithmReferenceChannel::uninitialize() +{ + m_decoder.uninitialize(); + m_encoder.uninitialize(); + return true; +} + +bool CBoxAlgorithmReferenceChannel::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmReferenceChannel::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_decoder.decode(i); + if (m_decoder.isHeaderReceived()) + { + CMatrix& iMatrix = *m_decoder.getOutputMatrix(); + CMatrix& oMatrix = *m_encoder.getInputMatrix(); + + OV_ERROR_UNLESS_KRF(iMatrix.getDimensionSize(0) >= 2, + "Invalid input matrix with [" << iMatrix.getDimensionSize(0) << "] channels (expected channels >= 2)", Kernel::ErrorType::BadInput); + + CString channel = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + const EMatchMethod method = EMatchMethod(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1))); + + m_referenceChannelIdx = FindChannel(iMatrix, channel, method, 0); + + OV_ERROR_UNLESS_KRF(m_referenceChannelIdx != std::numeric_limits::max(), "Invalid channel [" << channel << "]: channel not found", + Kernel::ErrorType::BadSetting); + + if (FindChannel(*m_decoder.getOutputMatrix(), channel, method, m_referenceChannelIdx + 1) != std::numeric_limits::max()) + { + OV_WARNING_K("Multiple channels match for setting [" << channel << "]. Selecting [" << m_referenceChannelIdx << "]"); + } + + oMatrix.resize(iMatrix.getDimensionSize(0) - 1, iMatrix.getDimensionSize(1)); + for (size_t j = 0, k = 0; j < iMatrix.getDimensionSize(0); ++j) + { + if (j != m_referenceChannelIdx) { oMatrix.setDimensionLabel(0, k++, iMatrix.getDimensionLabel(0, j)); } + } + + m_encoder.encodeHeader(); + } + if (m_decoder.isBufferReceived()) + { + CMatrix& iMatrix = *m_decoder.getOutputMatrix(); + CMatrix& oMatrix = *m_encoder.getInputMatrix(); + double* iBuffer = iMatrix.getBuffer(); + double* oBuffer = oMatrix.getBuffer(); + double* refBuffer = iMatrix.getBuffer() + m_referenceChannelIdx * iMatrix.getDimensionSize(1); + const size_t nChannel = iMatrix.getDimensionSize(0); + const size_t nSample = iMatrix.getDimensionSize(1); + for (size_t j = 0; j < nChannel; ++j) + { + if (j != m_referenceChannelIdx) + { + for (size_t k = 0; k < nSample; ++k) { oBuffer[k] = iBuffer[k] - refBuffer[k]; } + oBuffer += nSample; + } + iBuffer += nSample; + } + + m_encoder.encodeBuffer(); + } + if (m_decoder.isEndReceived()) { m_encoder.encodeEnd(); } + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmReferenceChannel.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmReferenceChannel.h new file mode 100644 index 0000000..61abccb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmReferenceChannel.h @@ -0,0 +1,62 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmReferenceChannel final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_ReferenceChannel) + +protected: + + Toolkit::TSignalDecoder m_decoder; + Toolkit::TSignalEncoder m_encoder; + size_t m_referenceChannelIdx = 0; +}; + +class CBoxAlgorithmReferenceChannelDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Reference Channel"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + + CString getShortDescription() const override { return CString("Subtracts the value of the reference channel from all other channels"); } + + CString getDetailedDescription() const override { return CString("Reference channel must be specified as a parameter for the box"); } + + CString getCategory() const override { return CString("Signal processing/Channels"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ReferenceChannel; } + IPluginObject* create() override { return new CBoxAlgorithmReferenceChannel; } + // virtual IBoxListener* createBoxListener() const { return new CBoxAlgorithmReferenceChannelListener; } + // virtual void releaseBoxListener(IBoxListener* listener) const { delete listener; } + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addOutput("Output signal", OV_TypeId_Signal); + prototype.addSetting("Channel", OV_TypeId_String, "Ref_Nose"); + prototype.addSetting("Channel Matching Method", OVP_TypeId_MatchMethod, "Smart"); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ReferenceChannelDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmSignalDecimation.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmSignalDecimation.cpp new file mode 100644 index 0000000..74746ce --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmSignalDecimation.cpp @@ -0,0 +1,188 @@ +#include "ovpCBoxAlgorithmSignalDecimation.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmSignalDecimation::initialize() +{ + m_decoder = nullptr; + m_encoder = nullptr; + + m_decimationFactor = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + OV_ERROR_UNLESS_KRF(m_decimationFactor > 1, "Invalid decimation factor [" << m_decimationFactor << "] (expected value > 1)", + Kernel::ErrorType::BadSetting); + + m_decoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalDecoder)); + m_decoder->initialize(); + + ip_buffer.initialize(m_decoder->getInputParameter(OVP_GD_Algorithm_SignalDecoder_InputParameterId_MemoryBufferToDecode)); + op_pMatrix.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Matrix)); + op_sampling.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + + m_encoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + m_encoder->initialize(); + + ip_sampling.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)); + ip_pMatrix.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Matrix)); + op_buffer.initialize(m_encoder->getOutputParameter(OVP_GD_Algorithm_SignalEncoder_OutputParameterId_EncodedMemoryBuffer)); + + m_nChannel = 0; + m_iSampleIdx = 0; + m_iNSamplePerBlock = 0; + m_oSampling = 0; + m_oSampleIdx = 0; + m_oNSamplePerBlock = 0; + + m_nTotalSample = 0; + m_startTimeBase = 0; + m_lastStartTime = 0; + m_lastEndTime = 0; + + return true; +} + +bool CBoxAlgorithmSignalDecimation::uninitialize() +{ + op_buffer.uninitialize(); + ip_pMatrix.uninitialize(); + ip_sampling.uninitialize(); + + if (m_encoder) + { + m_encoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_encoder); + m_encoder = nullptr; + } + + op_sampling.uninitialize(); + op_pMatrix.uninitialize(); + ip_buffer.uninitialize(); + + if (m_decoder) + { + m_decoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_decoder); + m_decoder = nullptr; + } + + return true; +} + +bool CBoxAlgorithmSignalDecimation::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmSignalDecimation::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + ip_buffer = boxContext.getInputChunk(0, i); + op_buffer = boxContext.getOutputChunk(0); + + const uint64_t tStart = boxContext.getInputChunkStartTime(0, i); + const uint64_t tEnd = boxContext.getInputChunkEndTime(0, i); + + if (tStart != m_lastEndTime) + { + m_startTimeBase = tStart; + m_iSampleIdx = 0; + m_oSampleIdx = 0; + m_nTotalSample = 0; + } + + m_lastStartTime = tStart; + m_lastEndTime = tEnd; + + m_decoder->process(); + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedHeader)) + { + m_iSampleIdx = 0; + m_iNSamplePerBlock = op_pMatrix->getDimensionSize(1); + m_iSampling = op_sampling; + + OV_ERROR_UNLESS_KRF(m_iSampling%m_decimationFactor == 0, + "Failed to decimate: input sampling frequency [" << m_iSampling << "] not multiple of decimation factor [" << + m_decimationFactor << "]", Kernel::ErrorType::BadSetting); + + m_oSampleIdx = 0; + m_oNSamplePerBlock = size_t(m_iNSamplePerBlock / m_decimationFactor); + m_oNSamplePerBlock = (m_oNSamplePerBlock ? m_oNSamplePerBlock : 1); + m_oSampling = op_sampling / m_decimationFactor; + + OV_ERROR_UNLESS_KRF(m_oSampling != 0, "Failed to decimate: output sampling frequency is 0", Kernel::ErrorType::BadOutput); + + m_nChannel = op_pMatrix->getDimensionSize(0); + m_nTotalSample = 0; + + ip_pMatrix->copyDescription(*op_pMatrix); + ip_pMatrix->setDimensionSize(1, m_oNSamplePerBlock); + ip_sampling = m_oSampling; + m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeHeader); + ip_pMatrix->resetBuffer(); + + boxContext.markOutputAsReadyToSend(0, tStart, tStart); // $$$ supposes we have one node per chunk + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedBuffer)) + { + double* iBuffer = op_pMatrix->getBuffer(); + double* oBuffer = ip_pMatrix->getBuffer() + m_oSampleIdx; + + for (size_t j = 0; j < m_iNSamplePerBlock; ++j) + { + double* iBufferTmp = iBuffer; + double* oBufferTmp = oBuffer; + for (size_t k = 0; k < m_nChannel; ++k) + { + *oBufferTmp += *iBufferTmp; + oBufferTmp += m_oNSamplePerBlock; + iBufferTmp += m_iNSamplePerBlock; + } + + m_iSampleIdx++; + if (m_iSampleIdx == m_decimationFactor) + { + m_iSampleIdx = 0; + oBufferTmp = oBuffer; + for (size_t k = 0; k < m_nChannel; ++k) + { + *oBufferTmp /= m_decimationFactor; + oBufferTmp += m_oNSamplePerBlock; + } + + oBuffer++; + m_oSampleIdx++; + if (m_oSampleIdx == m_oNSamplePerBlock) + { + oBuffer = ip_pMatrix->getBuffer(); + m_oSampleIdx = 0; + m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeBuffer); + const uint64_t tStartSample = m_startTimeBase + CTime(m_oSampling, m_nTotalSample).time(); + const uint64_t tEndSample = m_startTimeBase + CTime(m_oSampling, m_nTotalSample + m_oNSamplePerBlock).time(); + boxContext.markOutputAsReadyToSend(0, tStartSample, tEndSample); + m_nTotalSample += m_oNSamplePerBlock; + + ip_pMatrix->resetBuffer(); + } + } + + iBuffer++; + } + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedEnd)) + { + m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeEnd); + boxContext.markOutputAsReadyToSend(0, tStart, tStart); // $$$ supposes we have one node per chunk + } + + boxContext.markInputAsDeprecated(0, i); + } + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmSignalDecimation.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmSignalDecimation.h new file mode 100644 index 0000000..84aef69 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmSignalDecimation.h @@ -0,0 +1,83 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmSignalDecimation final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_SignalDecimation) + +protected: + + size_t m_decimationFactor = 0; + size_t m_nChannel = 0; + size_t m_iSampleIdx = 0; + size_t m_iNSamplePerBlock = 0; + size_t m_iSampling = 0; + size_t m_oSampleIdx = 0; + size_t m_oNSamplePerBlock = 0; + size_t m_oSampling = 0; + + size_t m_nTotalSample = 0; + uint64_t m_startTimeBase = 0; + uint64_t m_lastStartTime = 0; + uint64_t m_lastEndTime = 0; + + Kernel::IAlgorithmProxy* m_decoder = nullptr; + Kernel::TParameterHandler ip_buffer; + Kernel::TParameterHandler op_pMatrix; + Kernel::TParameterHandler op_sampling; + + Kernel::IAlgorithmProxy* m_encoder = nullptr; + Kernel::TParameterHandler ip_sampling; + Kernel::TParameterHandler ip_pMatrix; + Kernel::TParameterHandler op_buffer; +}; + +class CBoxAlgorithmSignalDecimationDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Signal Decimation"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + + CString getShortDescription() const override { return CString("Reduces the sampling frequency to a divider of the original sampling frequency"); } + + CString getDetailedDescription() const override + { + return CString("No pre filtering applied - Number of samples per block have to be a multiple of the decimation factor"); + } + + CString getCategory() const override { return CString("Signal processing/Temporal Filtering"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_SignalDecimation; } + IPluginObject* create() override { return new CBoxAlgorithmSignalDecimation; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addOutput("Output signal", OV_TypeId_Signal); + prototype.addSetting("Decimation factor", OV_TypeId_Integer, "8"); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_SignalDecimationDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmZeroCrossingDetector.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmZeroCrossingDetector.cpp new file mode 100644 index 0000000..fcf1ef0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmZeroCrossingDetector.cpp @@ -0,0 +1,215 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE SDK + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include "ovpCBoxAlgorithmZeroCrossingDetector.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmZeroCrossingDetector::initialize() +{ + m_encoder1.initialize(*this, 1); + m_encoder2.initialize(*this, 2); + + m_hysteresis = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_windowTimeD = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + OV_ERROR_UNLESS_KRF(m_windowTimeD > 0, "Invalid negative number for window length", Kernel::ErrorType::BadSetting); + + m_stimId1 = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + m_stimId2 = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + + CIdentifier typeID; + this->getStaticBoxContext().getInputType(0, typeID); + + if (typeID == OV_TypeId_Signal) + { + Toolkit::TSignalDecoder* decoder = new Toolkit::TSignalDecoder(*this, 0); + Toolkit::TSignalEncoder* encoder = new Toolkit::TSignalEncoder(*this, 0); + encoder->getInputSamplingRate().setReferenceTarget(decoder->getOutputSamplingRate()); + m_decoder = decoder; + m_encoder0 = encoder; + } + else if (typeID == OV_TypeId_StreamedMatrix) + { + Toolkit::TStreamedMatrixDecoder* decoder = new Toolkit::TStreamedMatrixDecoder(*this, 0); + Toolkit::TStreamedMatrixEncoder* encoder = new Toolkit::TStreamedMatrixEncoder(*this, 0); + m_decoder = decoder; + m_encoder0 = encoder; + } + else { OV_ERROR_KRF("Invalid input type [" << typeID.str() << "]", Kernel::ErrorType::BadInput); } + + return true; +} + +bool CBoxAlgorithmZeroCrossingDetector::uninitialize() +{ + m_encoder0.uninitialize(); + m_encoder1.uninitialize(); + m_encoder2.uninitialize(); + m_decoder.uninitialize(); + return true; +} + +bool CBoxAlgorithmZeroCrossingDetector::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmZeroCrossingDetector::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + size_t j, k; + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_decoder.decode(i); + m_encoder1.getInputStimulationSet()->clear(); + + const size_t nChannel = m_decoder.getOutputMatrix()->getDimensionSize(0); + const size_t nSample = m_decoder.getOutputMatrix()->getDimensionSize(1); + + if (m_decoder.isHeaderReceived()) + { + m_encoder0.getInputMatrix()->copyDescription(*m_decoder.getOutputMatrix()); + CMatrix* o2Matrix = m_encoder2.getInputMatrix(); + o2Matrix->resize(nChannel, nSample); + + m_signals.clear(); + m_signals.resize(nChannel, 0); + m_states.clear(); + m_states.resize(nChannel); + + m_chunks.clear(); + m_chunks.resize(nChannel); + m_samples.clear(); + m_samples.resize(nChannel); + + m_nChunk = 0; + + m_encoder0.encodeHeader(); + m_encoder1.encodeHeader(); + m_encoder2.encodeHeader(); + } + if (m_decoder.isBufferReceived()) + { + if (m_nChunk == 0) + { + m_sampling = nSample * size_t((1LL << 32) / (boxContext.getInputChunkEndTime(0, i) - boxContext.getInputChunkStartTime(0, i))); + m_windowTime = size_t(m_windowTimeD * m_sampling); + } + + double* iBuffer = m_decoder.getOutputMatrix()->getBuffer(); + double* oBuffer0 = m_encoder0.getInputMatrix()->getBuffer(); + double* oBuffer2 = m_encoder2.getInputMatrix()->getBuffer(); + + // ZC detector, with hysteresis + std::vector signals(nSample + 1, 0); + + for (j = 0; j < nChannel; ++j) + { + // signal, with the last sample of the previous chunk + signals[0] = m_signals[j]; + for (k = 0; k < nSample; ++k) { signals[k + 1] = iBuffer[k + j * nSample]; } + m_signals[j] = signals.back(); + + if (m_nChunk == 0) { m_states[j] = (signals[1] >= 0) ? 1 : -1; } + + for (k = 0; k < nSample; ++k) + { + uint64_t stimulationDate; + if (m_sampling > 0) { stimulationDate = boxContext.getInputChunkStartTime(0, i) + CTime(m_sampling, k).time(); } + else if (nSample == 1) { stimulationDate = boxContext.getInputChunkEndTime(0, i); } + else + { + OV_ERROR_KRF("Can only process chunks with sampling rate larger or equal to 1 or chunks with exactly one sample.", + Kernel::ErrorType::OutOfBound); + } + + if ((m_states[j] == 1) && (signals[k] > -m_hysteresis) && (signals[k + 1] < -m_hysteresis)) + { + // negative ZC : positive-to-negative + oBuffer0[k + j * nSample] = -1; + m_encoder1.getInputStimulationSet()->appendStimulation(m_stimId2, stimulationDate, 0); + m_states[j] = -1; + } + else if ((m_states[j] == -1) && (signals[k] < m_hysteresis) && (signals[k + 1] > m_hysteresis)) + { + // positive ZC : negative-to-positive + oBuffer0[k + j * nSample] = 1; + m_encoder1.getInputStimulationSet()->appendStimulation(m_stimId1, stimulationDate, 0); + m_states[j] = 1; + + // for the rythm estimation + m_chunks[j].push_back(m_nChunk); + m_samples[j].push_back(k); + } + else { oBuffer0[k + j * nSample] = 0; } + } + } + + // rythm estimation, in events per min + for (j = 0; j < nChannel; ++j) + { + int compt = 0; + + // supression of peaks older than m_windowTime by decreasing indices, to avoid overflow + for (size_t index = m_chunks[j].size(); index >= 1; index--) + { + const size_t kk = index - 1; + if (((m_nChunk + 1) * nSample - (m_samples[j][kk] + m_chunks[j][kk] * nSample)) < m_windowTime) { compt += 1; } + else + { + m_samples[j].erase(m_samples[j].begin() + kk); + m_chunks[j].erase(m_chunks[j].begin() + kk); + } + } + + for (k = 0; k < nSample; ++k) { oBuffer2[k + j * nSample] = 60.0 * compt / m_windowTimeD; } + } + + m_nChunk++; + + m_encoder0.encodeBuffer(); + m_encoder1.encodeBuffer(); + m_encoder2.encodeBuffer(); + } + if (m_decoder.isEndReceived()) + { + m_encoder0.encodeEnd(); + m_encoder1.encodeEnd(); + m_encoder2.encodeEnd(); + } + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + boxContext.markOutputAsReadyToSend(1, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + boxContext.markOutputAsReadyToSend(2, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmZeroCrossingDetector.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmZeroCrossingDetector.h new file mode 100644 index 0000000..f7054a6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmZeroCrossingDetector.h @@ -0,0 +1,168 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE SDK + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmZeroCrossingDetector final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_ZeroCrossingDetector) + +protected: + + Toolkit::TGenericDecoder m_decoder; + Toolkit::TGenericEncoder m_encoder0; + Toolkit::TStimulationEncoder m_encoder1; + Toolkit::TStreamedMatrixEncoder m_encoder2; + + std::vector m_signals; + std::vector m_states; + double m_hysteresis = 0; + uint64_t m_nChunk = 0; + + size_t m_sampling = 0; + double m_windowTimeD = 0; + size_t m_windowTime = 0; + std::vector> m_chunks; + std::vector> m_samples; + + uint64_t m_stimId1 = 0; + uint64_t m_stimId2 = 0; +}; + +class CBoxAlgorithmZeroCrossingDetectorListener final : public Toolkit::TBoxListener +{ +public: + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(index, typeID); + return onConnectorTypeChanged(box, index, typeID, false); + } + + bool onOutputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getOutputType(index, typeID); + return onConnectorTypeChanged(box, index, typeID, true); + } + + static bool onConnectorTypeChanged(Kernel::IBox& box, const size_t index, const CIdentifier& typeID, const bool outputChanged) + { + if (index == 0) + { + if (typeID == OV_TypeId_Signal) + { + box.setInputType(0, OV_TypeId_Signal); + box.setOutputType(0, OV_TypeId_Signal); + } + else if (typeID == OV_TypeId_StreamedMatrix) + { + box.setInputType(0, OV_TypeId_StreamedMatrix); + box.setOutputType(0, OV_TypeId_StreamedMatrix); + } + else + { + // Invalid i/o type identifier + CIdentifier originalTypeID = CIdentifier::undefined(); + if (outputChanged) + { + // Restores output + box.getInputType(0, originalTypeID); + box.setOutputType(0, originalTypeID); + } + else + { + // Restores input + box.getOutputType(0, originalTypeID); + box.setInputType(0, originalTypeID); + } + } + } + if (index == 1) { box.setOutputType(1, OV_TypeId_Stimulations); } + if (index == 2) { box.setOutputType(2, OV_TypeId_StreamedMatrix); } + + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmZeroCrossingDetectorDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Zero-Crossing Detector"); } + CString getAuthorName() const override { return CString("Quentin Barthelemy"); } + CString getAuthorCompanyName() const override { return CString("Mensia Technologies SA"); } + CString getShortDescription() const override { return CString("Detects zero-crossings of the signal"); } + + CString getDetailedDescription() const override + { + return CString( + "Detects zero-crossings of the signal for each channel, with 1 for positive zero-crossings (negative-to-positive), -1 for negatives ones (positive-to-negative), 0 otherwise. For all channels, stimulations mark positive and negatives zero-crossings. For each channel, the rythm is computed in events per min."); + } + + CString getCategory() const override { return CString("Signal processing/Temporal Filtering"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ZeroCrossingDetector; } + IPluginObject* create() override { return new CBoxAlgorithmZeroCrossingDetector; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmZeroCrossingDetectorListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addOutput("Zero-crossing signal", OV_TypeId_Signal); + prototype.addOutput("Zero-crossing stimulations", OV_TypeId_Stimulations); + prototype.addOutput("Events rythm (per min)", OV_TypeId_StreamedMatrix); + prototype.addSetting("Hysteresis threshold", OV_TypeId_Float, "0.01"); + prototype.addSetting("Rythm estimation window (in sec)", OV_TypeId_Float, "10"); + prototype.addSetting("Negative-to-positive stimulation", OV_TypeId_Stimulation, "OVTK_StimulationId_ThresholdPassed_Positive"); + prototype.addSetting("Positive-to-negative stimulation", OV_TypeId_Stimulation, "OVTK_StimulationId_ThresholdPassed_Negative"); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ZeroCrossingDetectorDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmStimulationBasedEpoching.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmStimulationBasedEpoching.cpp new file mode 100755 index 0000000..038840b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmStimulationBasedEpoching.cpp @@ -0,0 +1,253 @@ +#include +#include + +#include "ovpCBoxAlgorithmStimulationBasedEpoching.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +static const int INPUT_SIGNAL_IDX = 0; +static const int INPUT_STIMULATIONS_IDX = 1; +static const int OUTPUT_SIGNAL_IDX = 0; + +bool CBoxAlgorithmStimulationBasedEpoching::initialize() +{ + m_epochDurationInSeconds = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + const double epochOffset = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_stimulationID = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + + m_epochDuration = CTime(m_epochDurationInSeconds).time(); + + const int epochOffsetSign = (epochOffset > 0) - (epochOffset < 0); + m_epochOffset = epochOffsetSign * int64_t(CTime(std::fabs(epochOffset)).time()); + + m_lastReceivedStimulationDate = 0; + m_lastStimulationChunkStartTime = 0; + m_lastSignalChunkEndTime = 0; + + m_signalDecoder.initialize(*this, 0); + m_stimDecoder.initialize(*this, 1); + + m_encoder.initialize(*this, 0); + + m_encoder.getInputSamplingRate().setReferenceTarget(m_signalDecoder.getOutputSamplingRate()); + m_nChannel = 0; + m_sampling = 0; + + m_cachedChunks.clear(); + + OV_ERROR_UNLESS_KRF(m_epochDurationInSeconds > 0, + "Epocher setting is invalid. Duration (= " << m_epochDurationInSeconds << ") must have a strictly positive value.", + Kernel::ErrorType::Internal); + + return true; +} + +bool CBoxAlgorithmStimulationBasedEpoching::uninitialize() +{ + m_signalDecoder.uninitialize(); + m_encoder.uninitialize(); + m_stimDecoder.uninitialize(); + m_cachedChunks.clear(); + return true; +} + +bool CBoxAlgorithmStimulationBasedEpoching::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} + +bool CBoxAlgorithmStimulationBasedEpoching::process() +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + + for (size_t chunk = 0; chunk < boxCtx.getInputChunkCount(INPUT_SIGNAL_IDX); ++chunk) + { + OV_ERROR_UNLESS_KRF(m_signalDecoder.decode(chunk), "Failed to decode chunk", Kernel::ErrorType::Internal); + CMatrix* iMatrix = m_signalDecoder.getOutputMatrix(); + uint64_t iChunkStartTime = boxCtx.getInputChunkStartTime(INPUT_SIGNAL_IDX, chunk); + uint64_t iChunkEndTime = boxCtx.getInputChunkEndTime(INPUT_SIGNAL_IDX, chunk); + + if (m_signalDecoder.isHeaderReceived()) + { + CMatrix* oMatrix = m_encoder.getInputMatrix(); + + m_nChannel = iMatrix->getDimensionSize(0); + m_nSamplePerInputBuffer = iMatrix->getDimensionSize(1); + + m_sampling = m_signalDecoder.getOutputSamplingRate(); + OV_ERROR_UNLESS_KRZ(m_sampling, Kernel::LogLevel_Error << "Input sampling frequency is equal to 0. Plugin can not process.", + Kernel::ErrorType::Internal); + + m_nSampleCountOutputEpoch = size_t(CTime(m_epochDurationInSeconds).toSampleCount(m_sampling)); + + oMatrix->resize(m_nChannel, m_nSampleCountOutputEpoch); + + for (size_t channel = 0; channel < m_nChannel; ++channel) { oMatrix->setDimensionLabel(0, channel, iMatrix->getDimensionLabel(0, channel)); } + m_encoder.encodeHeader(); + boxCtx.markOutputAsReadyToSend(OUTPUT_SIGNAL_IDX, 0, 0); + } + + if (m_signalDecoder.isBufferReceived()) + { + OV_ERROR_UNLESS_KRF((iChunkStartTime >= m_lastSignalChunkEndTime), "Stimulation Based Epoching can not work on overlapping signal", + Kernel::ErrorType::Internal); + // Cache the signal data + m_cachedChunks.emplace_back(iChunkStartTime, iChunkEndTime, new CMatrix()); + m_cachedChunks.back().matrix->copy(*iMatrix); + + m_lastSignalChunkEndTime = iChunkEndTime; + } + + if (m_signalDecoder.isEndReceived()) + { + m_encoder.encodeEnd(); + boxCtx.markOutputAsReadyToSend(OUTPUT_SIGNAL_IDX, iChunkStartTime, iChunkEndTime); + } + } + + for (size_t chunk = 0; chunk < boxCtx.getInputChunkCount(INPUT_STIMULATIONS_IDX); ++chunk) + { + m_stimDecoder.decode(chunk); + // We only handle buffers and ignore stimulation headers and ends + if (m_stimDecoder.isBufferReceived()) + { + for (size_t stimulation = 0; stimulation < m_stimDecoder.getOutputStimulationSet()->getStimulationCount(); ++stimulation) + { + if (m_stimDecoder.getOutputStimulationSet()->getStimulationIdentifier(stimulation) == m_stimulationID) + { + // Stimulations are put into cache, we ignore stimulations that would produce output chunks with negative start date (after applying the offset) + uint64_t date = m_stimDecoder.getOutputStimulationSet()->getStimulationDate(stimulation); + if (date < m_lastReceivedStimulationDate) + { + OV_WARNING_K( + "Skipping stimulation (received at date " << CTime(date) << ") that predates an already received stimulation (at date " + << CTime(m_lastReceivedStimulationDate) << ")"); + } + else if (int64_t(date) + m_epochOffset >= 0) + { + m_receivedStimulations.push_back(date); + m_lastReceivedStimulationDate = date; + } + } + m_lastStimulationChunkStartTime = boxCtx.getInputChunkEndTime(INPUT_STIMULATIONS_IDX, chunk); + } + } + } + + // Process the received stimulations + uint64_t lastProcessedStimDate = 0; + + for (const auto& stimDate : m_receivedStimulations) + { + const uint64_t epochStartTime = uint64_t(int64_t(stimDate) + m_epochOffset); + + // No cache available + if (m_cachedChunks.empty()) { break; } + // During normal functioning only chunks that will no longer be useful are deprecated, this is to avoid failure in case of a bug + if (m_cachedChunks.front().startTime > epochStartTime) + { + OV_WARNING_K("Skipped creating an epoch on a timespan with no signal. The input signal probably contains non-contiguous chunks."); + break; + } + + // We only process stimulations for which we have received enough signal to create an epoch + if (m_lastSignalChunkEndTime >= epochStartTime + m_epochDuration) + { + auto* oBuffer = m_encoder.getInputMatrix()->getBuffer(); + size_t oBufferIdx = 0; + size_t idx = 0; + + auto tStart = m_cachedChunks[idx].startTime; + auto tEnd = m_cachedChunks[idx].endTime; + + // Find the first chunk that contains data interesting for the sent epoch + while (tStart > epochStartTime || tEnd < epochStartTime) + { + idx += 1; + if (idx == m_cachedChunks.size()) { break; } + tStart = m_cachedChunks[idx].startTime; + tEnd = m_cachedChunks[idx].endTime; + } + + // If we have found a chunk that contains samples in the current epoch + if (idx != m_cachedChunks.size()) + { + uint64_t iBufferIdx = CTime(epochStartTime - tStart).toSampleCount(m_sampling); + + while (oBufferIdx < m_nSampleCountOutputEpoch) + { + const auto oTime = epochStartTime + CTime(m_sampling, oBufferIdx).time(); + + // If we handle non-dyadic sampling rates then we do not have a guarantee that all chunks will be + // dated with exact values. We add a bit of wiggle room around the incoming chunks to consider + // whether a sample is in them or not. This wiggle room will be of half of the sample duration + // on each side. + const uint64_t timeTolerance = CTime(m_sampling, 1).time() / 2; + if (iBufferIdx == m_nSamplePerInputBuffer) + { + // advance to beginning of the next cached chunk + idx += 1; + if (idx == m_cachedChunks.size()) { break; } + tStart = m_cachedChunks[idx].startTime; + tEnd = m_cachedChunks[idx].endTime; + iBufferIdx = 0; + + // Case of non-consecutive chunks + if (tStart > oTime + timeTolerance) { break; } + } + else if (tStart <= oTime + timeTolerance && oTime <= tEnd + timeTolerance) + { + const auto& iBuffer = m_cachedChunks[idx].matrix->getBuffer(); + for (size_t channel = 0; channel < m_nChannel; ++channel) + { + oBuffer[channel * m_nSampleCountOutputEpoch + oBufferIdx] = iBuffer[channel * m_nSamplePerInputBuffer + iBufferIdx]; + } + oBufferIdx += 1; + iBufferIdx += 1; + } + else { OV_ERROR_KRF("Can not construct the output chunk due to internal error", Kernel::ErrorType::Internal); } + } + } + + // If the epoch is not complete (due to holes in signal) + if (oBufferIdx == m_nSampleCountOutputEpoch) + { + m_encoder.encodeBuffer(); + boxCtx.markOutputAsReadyToSend(OUTPUT_SIGNAL_IDX, epochStartTime, epochStartTime + m_epochDuration); + } + else { OV_WARNING_K("Skipped creating an epoch on a timespan with no signal. The input signal probably contains non-contiguous chunks."); } + + lastProcessedStimDate = stimDate; + } + // We only process stimulations for which we have received enough signal to create an epoch + // No more complete epochs can be constructed + else { break; } + } + + // Remove all stimulations for which the epochs have been constructed and sent + m_receivedStimulations.erase(std::remove_if(m_receivedStimulations.begin(), m_receivedStimulations.end(), + [&lastProcessedStimDate](const uint64_t& stimulationDate) { return stimulationDate <= lastProcessedStimDate; }), + m_receivedStimulations.end()); + + // Deprecate cached chunks which will no longer be used because they are too far back in history compared to received stimulations + const uint64_t lastUsefulChunkEndTime = m_receivedStimulations.empty() ? m_lastStimulationChunkStartTime : m_receivedStimulations.front(); + + auto cutoffTime = int64_t(lastUsefulChunkEndTime) + m_epochOffset; + if (cutoffTime > 0) + { + m_cachedChunks.erase(std::remove_if(m_cachedChunks.begin(), m_cachedChunks.end(), [cutoffTime](const SCachedChunk& chunk) + { + return chunk.endTime < uint64_t(cutoffTime); + }), m_cachedChunks.end()); + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmStimulationBasedEpoching.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmStimulationBasedEpoching.h new file mode 100755 index 0000000..916f717 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmStimulationBasedEpoching.h @@ -0,0 +1,110 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +class CBoxAlgorithmStimulationBasedEpoching final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_StimulationBasedEpoching) + +private: + Toolkit::TSignalDecoder m_signalDecoder; + Toolkit::TStimulationDecoder m_stimDecoder; + Toolkit::TSignalEncoder m_encoder; + + uint64_t m_stimulationID = 0; + double m_epochDurationInSeconds = 0; + uint64_t m_epochDuration = 0; + int64_t m_epochOffset = 0; + + // Input matrix parameters + size_t m_sampling = 0; + size_t m_nSamplePerInputBuffer = 0; + + // Output matrix dimensions + size_t m_nChannel = 0; + size_t m_nSampleCountOutputEpoch = 0; + + uint64_t m_lastSignalChunkEndTime = 0; + uint64_t m_lastStimulationChunkStartTime = 0; + uint64_t m_lastReceivedStimulationDate = 0; + + std::deque m_receivedStimulations; + + struct SCachedChunk + { + SCachedChunk(const uint64_t startTime, const uint64_t endTime, CMatrix* matrix) + : startTime(startTime), endTime(endTime), matrix(matrix) {} + + SCachedChunk& operator=(SCachedChunk&& other) + { + this->startTime = other.startTime; + this->endTime = other.endTime; + this->matrix = std::move(other.matrix); + return *this; + } + + uint64_t startTime; + uint64_t endTime; + std::unique_ptr matrix; + }; + + std::deque m_cachedChunks; +}; + +class CBoxAlgorithmStimulationBasedEpochingDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return "Stimulation based epoching"; } + CString getAuthorName() const override { return "Jozef Legeny"; } + CString getAuthorCompanyName() const override { return "Mensia Technologies"; } + + CString getShortDescription() const override { return "Slices signal into chunks of a desired length following a stimulation event."; } + + CString getDetailedDescription() const override { return "Slices signal into chunks of a desired length following a stimulation event."; } + + CString getCategory() const override { return "Signal processing/Epoching"; } + CString getVersion() const override { return "2.0"; } + CString getSoftwareComponent() const override { return "openvibe-sdk"; } + CString getAddedSoftwareVersion() const override { return "0.0.0"; } + CString getUpdatedSoftwareVersion() const override { return "0.1.0"; } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_StimulationBasedEpoching; } + IPluginObject* create() override { return new CBoxAlgorithmStimulationBasedEpoching; } + CString getStockItemName() const override { return "gtk-cut"; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addInput("Input stimulations", OV_TypeId_Stimulations); + + prototype.addOutput("Epoched signal", OV_TypeId_Signal); + + prototype.addSetting("Epoch duration (in sec)", OV_TypeId_Float, "1"); + prototype.addSetting("Epoch offset (in sec)", OV_TypeId_Float, "0.5"); + prototype.addSetting("Stimulation to epoch from", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_StimulationBasedEpochingDesc) +}; + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmTimeBasedEpoching.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmTimeBasedEpoching.cpp new file mode 100755 index 0000000..72a907b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmTimeBasedEpoching.cpp @@ -0,0 +1,167 @@ +#include "ovpCBoxAlgorithmTimeBasedEpoching.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmTimeBasedEpoching::initialize() +{ + m_duration = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_interval = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + OV_ERROR_UNLESS_KRF(m_duration>0 && m_interval>0, + "Epocher settings are invalid (duration:" << m_duration << "|interval:" + << m_interval << "). These parameters should be strictly positive.", Kernel::ErrorType::Internal); + + m_decoder.initialize(*this, 0); + m_encoder.initialize(*this, 0); + m_encoder.getInputSamplingRate().setReferenceTarget(m_decoder.getOutputSamplingRate()); + + return true; +} + +bool CBoxAlgorithmTimeBasedEpoching::uninitialize() +{ + m_decoder.uninitialize(); + m_encoder.uninitialize(); + + return true; +} + +bool CBoxAlgorithmTimeBasedEpoching::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmTimeBasedEpoching::process() +{ + IDynamicBoxContext& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + OV_ERROR_UNLESS_KRF(m_decoder.decode(i), "Failed to decode chunk", Kernel::ErrorType::Internal); + + CMatrix* iMatrix = m_decoder.getOutputMatrix(); + CMatrix* oMatrix = m_encoder.getInputMatrix(); + + const size_t nChannel = iMatrix->getDimensionSize(0); + const size_t nISample = iMatrix->getDimensionSize(1); + + if (m_decoder.isHeaderReceived()) + { + m_lastInputEndTime = 0; + m_oSampleIdx = 0; + m_oChunkIdx = 0; + m_referenceTime = 0; + + m_sampling = m_decoder.getOutputSamplingRate(); + OV_ERROR_UNLESS_KRZ(m_sampling, "Input sampling frequency is equal to 0. Plugin can not process.", Kernel::ErrorType::Internal); + + m_oNSample = size_t(m_duration * m_sampling); // sample count per output epoch + m_oNSampleBetweenEpoch = size_t(m_interval * m_sampling); + + OV_ERROR_UNLESS_KRF(m_oNSample>0 && m_oNSampleBetweenEpoch>0, + "Input sampling frequency is [" << m_sampling << "]. This is too low in order to produce epochs of [" + << m_duration << "] seconds with an interval of [" << m_interval << "] seconds.", Kernel::ErrorType::Internal); + + oMatrix->resize(nChannel, m_oNSample); + for (size_t c = 0; c < nChannel; ++c) { oMatrix->setDimensionLabel(0, c, iMatrix->getDimensionLabel(0, c)); } + + m_encoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, 0, 0); + } + if (m_decoder.isBufferReceived()) + { + const uint64_t iTStart = boxContext.getInputChunkStartTime(0, i); + const uint64_t iTEnd = boxContext.getInputChunkEndTime(0, i); + + if (m_lastInputEndTime != iTStart) + { + // reset + m_referenceTime = iTStart; // reference time = start time of the first chunk of the continuous stream of chunks + m_oSampleIdx = 0; + m_oChunkIdx = 0; + } + + m_lastInputEndTime = iTEnd; + + // ********************************** + // + // Epoching + // + // ********************************** + + double* iBuffer = iMatrix->getBuffer(); + double* oBuffer = oMatrix->getBuffer(); + + size_t sampleProcessed = 0; + + // Iterates on bytes to process + while (sampleProcessed != nISample) + { + if (m_oSampleIdx < m_oNSample) // Some samples should be filled + { + // Copies samples to buffer + const size_t sampleToFill = std::min(m_oNSample - m_oSampleIdx, nISample - sampleProcessed); + for (size_t c = 0; c < nChannel; ++c) + { + memcpy(oBuffer + c * m_oNSample + m_oSampleIdx, iBuffer + c * nISample + sampleProcessed, sampleToFill * sizeof(double)); + } + m_oSampleIdx += sampleToFill; + sampleProcessed += sampleToFill; + + if (m_oSampleIdx == m_oNSample) // An epoch has been totally filled ! + { + // Calculates start and end time of output + const uint64_t oTStart = m_referenceTime + CTime(m_sampling, m_oChunkIdx * m_oNSampleBetweenEpoch).time(); + const uint64_t oTEnd = m_referenceTime + CTime(m_sampling, m_oChunkIdx * m_oNSampleBetweenEpoch + m_oNSample).time(); + m_oChunkIdx++; + + // Writes epoch + m_encoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, oTStart, oTEnd); + + if (m_oNSampleBetweenEpoch < m_oNSample) + { + // Shifts samples for next epoch when overlap + const size_t samplesToSave = m_oNSample - m_oNSampleBetweenEpoch; + for (size_t c = 0; c < nChannel; ++c) + { + memmove(oBuffer + c * m_oNSample, oBuffer + c * m_oNSample + m_oNSample - samplesToSave, samplesToSave * sizeof(double)); + } + + // The counter can be reset + m_oSampleIdx = samplesToSave; + } + } + } + else + { + // The next few samples are useless: the stream of chunks is not continuous, we can remove the samples before the discontinuity + const size_t sampleToSkip = std::min(m_oNSampleBetweenEpoch - m_oSampleIdx, nISample - sampleProcessed); + m_oSampleIdx += sampleToSkip; + sampleProcessed += sampleToSkip; + + if (m_oSampleIdx == m_oNSampleBetweenEpoch) + { + // The counter can be reset + m_oSampleIdx = 0; + } + } + } + } + if (m_decoder.isEndReceived()) + { + m_encoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + + return true; +} +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmTimeBasedEpoching.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmTimeBasedEpoching.h new file mode 100755 index 0000000..16c1595 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/epoching/ovpCBoxAlgorithmTimeBasedEpoching.h @@ -0,0 +1,71 @@ +#pragma once + +#include "../../ovp_defines.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmTimeBasedEpoching final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_TimeBasedEpoching) + +private: + + Toolkit::TSignalDecoder m_decoder; + Toolkit::TSignalEncoder m_encoder; + + double m_duration = 0; + double m_interval = 0; + + size_t m_sampling = 0; + size_t m_oNSample = 0; + size_t m_oNSampleBetweenEpoch = 0; + size_t m_oSampleIdx = 0; + size_t m_oChunkIdx = 0; + uint64_t m_lastInputEndTime = 0; + uint64_t m_referenceTime = 0; +}; + +class CBoxAlgorithmTimeBasedEpochingDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Time based epoching"); } + CString getAuthorName() const override { return CString("Quentin Barthelemy"); } + CString getAuthorCompanyName() const override { return CString("Mensia Technologies SA"); } + + CString getShortDescription() const override { return CString("Generates signal 'slices' or 'blocks' having a specified duration and interval"); } + + CString getDetailedDescription() const override { return CString("Interval can be used to control the overlap of epochs"); } + CString getCategory() const override { return CString("Signal processing/Epoching"); } + CString getVersion() const override { return CString("2.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CString getStockItemName() const override { return CString("gtk-cut"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_TimeBasedEpoching; } + IPluginObject* create() override { return new CBoxAlgorithmTimeBasedEpoching(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addOutput("Epoched signal", OV_TypeId_Signal); + prototype.addSetting("Epoch duration (in sec)", OV_TypeId_Float, "1"); + prototype.addSetting("Epoch intervals (in sec)", OV_TypeId_Float, "0.5"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_TimeBasedEpochingDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmCommonAverageReference.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmCommonAverageReference.cpp new file mode 100644 index 0000000..a2ef7be --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmCommonAverageReference.cpp @@ -0,0 +1,103 @@ +#include "ovpCBoxAlgorithmCommonAverageReference.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmCommonAverageReference::initialize() +{ + m_decoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalDecoder)); + m_decoder->initialize(); + + ip_buffer.initialize(m_decoder->getInputParameter(OVP_GD_Algorithm_SignalDecoder_InputParameterId_MemoryBufferToDecode)); + op_matrix.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Matrix)); + op_sampling.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + + m_encoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + m_encoder->initialize(); + + ip_matrix.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Matrix)); + ip_sampling.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)); + op_buffer.initialize(m_encoder->getOutputParameter(OVP_GD_Algorithm_SignalEncoder_OutputParameterId_EncodedMemoryBuffer)); + + op_matrix = &m_oMatrix; + ip_matrix = &m_oMatrix; + ip_sampling.setReferenceTarget(op_sampling); + + return true; +} + +bool CBoxAlgorithmCommonAverageReference::uninitialize() +{ + op_buffer.uninitialize(); + ip_sampling.uninitialize(); + ip_matrix.uninitialize(); + m_encoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_encoder); + + op_sampling.uninitialize(); + op_matrix.uninitialize(); + ip_buffer.uninitialize(); + m_decoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_decoder); + + return true; +} + +bool CBoxAlgorithmCommonAverageReference::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmCommonAverageReference::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + ip_buffer = boxContext.getInputChunk(0, i); + op_buffer = boxContext.getOutputChunk(0); + + m_decoder->process(); + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedHeader)) + { + m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeHeader); + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedBuffer)) + { + const size_t nChannel = m_oMatrix.getDimensionSize(0), nSample = m_oMatrix.getDimensionSize(1); + for (size_t j = 0; j < nSample; ++j) + { + double* buffer = m_oMatrix.getBuffer() + j; + double sum = 0; + for (size_t c = nChannel; c != 0; c--) + { + sum += *buffer; + buffer += nSample; + } + const double mean = sum / nChannel; + for (size_t c = nChannel; c != 0; c--) + { + buffer -= nSample; + *buffer -= mean; + } + } + + m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeBuffer); + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedEnd)) + { + m_encoder->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeEnd); + } + + boxContext.markInputAsDeprecated(0, i); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmCommonAverageReference.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmCommonAverageReference.h new file mode 100644 index 0000000..47752b5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmCommonAverageReference.h @@ -0,0 +1,70 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmCommonAverageReference final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_CommonAverageReference) + +protected: + + Kernel::IAlgorithmProxy* m_decoder = nullptr; + Kernel::TParameterHandler ip_buffer; + Kernel::TParameterHandler op_matrix; + Kernel::TParameterHandler op_sampling; + + Kernel::IAlgorithmProxy* m_encoder = nullptr; + Kernel::TParameterHandler ip_matrix; + Kernel::TParameterHandler ip_sampling; + Kernel::TParameterHandler op_buffer; + + CMatrix m_oMatrix; +}; + +class CBoxAlgorithmCommonAverageReferenceDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Common Average Reference"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Re-reference the signal to common average reference"); } + + CString getDetailedDescription() const override + { + return CString( + "Re-referencing the signal to common average reference consists in subtracting from each sample the average value of the samples of all electrodes at this time"); + } + + CString getCategory() const override { return CString("Signal processing/Spatial Filtering"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_CommonAverageReference; } + IPluginObject* create() override { return new CBoxAlgorithmCommonAverageReference; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addOutput("Output signal", OV_TypeId_Signal); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_CommonAverageReferenceDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmRegularizedCSPTrainer.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmRegularizedCSPTrainer.cpp new file mode 100755 index 0000000..f93ab7f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmRegularizedCSPTrainer.cpp @@ -0,0 +1,393 @@ +#if defined TARGET_HAS_ThirdPartyEIGEN + +#include "ovpCBoxAlgorithmRegularizedCSPTrainer.h" + +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +// typedef Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > MatrixXdRowMajor; + +bool CBoxAlgorithmRegularizedCSPTrainer::initialize() +{ + m_stimDecoder.initialize(*this, 0); + m_encoder.initialize(*this, 0); + + m_nClasses = this->getStaticBoxContext().getInputCount() - 1; + + m_covProxies.resize(m_nClasses); + + m_stimID = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_configFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_filtersPerClass = size_t(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2))); + m_saveAsBoxConf = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + + OV_ERROR_UNLESS_KRF(m_filtersPerClass > 0, // && m_filtersPerClass%2 == 0, + "Invalid filter dimension number [" << m_filtersPerClass << "] (expected value > 0)", // even ? + Kernel::ErrorType::BadSetting); + + m_hasBeenInitialized = true; + + m_signalDecoders.resize(m_nClasses); + for (size_t i = 0; i < m_nClasses; ++i) + { + m_signalDecoders[i].initialize(*this, i + 1); + + const CIdentifier covAlgId = this->getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_OnlineCovariance); + OV_ERROR_UNLESS_KRF(covAlgId != CIdentifier::undefined(), "Failed to create online covariance algorithm", Kernel::ErrorType::BadResourceCreation); + + m_covProxies[i].cov = &this->getAlgorithmManager().getAlgorithm(covAlgId); + OV_ERROR_UNLESS_KRF(m_covProxies[i].cov->initialize(), "Failed to initialize online covariance algorithm", Kernel::ErrorType::Internal); + + // Set the params of the cov algorithm + Kernel::TParameterHandler updateMethod(m_covProxies[i].cov->getInputParameter(OVP_Algorithm_OnlineCovariance_InputParameterId_UpdateMethod)); + Kernel::TParameterHandler traceNormalization(m_covProxies[i].cov->getInputParameter(OVP_Algorithm_OnlineCovariance_InputParameterId_TraceNormalization)); + Kernel::TParameterHandler shrinkage(m_covProxies[i].cov->getInputParameter(OVP_Algorithm_OnlineCovariance_InputParameterId_Shrinkage)); + + updateMethod = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + traceNormalization = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5); + shrinkage = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 6); + } + + m_tikhonov = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 7); + + OV_ERROR_UNLESS_KRF(m_configFilename != CString(""), "Output filename is required in box configuration", Kernel::ErrorType::BadSetting); + + return true; +} + +bool CBoxAlgorithmRegularizedCSPTrainer::uninitialize() +{ + m_stimDecoder.uninitialize(); + m_encoder.uninitialize(); + + if (m_hasBeenInitialized) + { + for (size_t i = 0; i < m_nClasses; ++i) + { + m_signalDecoders[i].uninitialize(); + if (m_covProxies[i].cov) + { + m_covProxies[i].cov->uninitialize(); + getAlgorithmManager().releaseAlgorithm(*m_covProxies[i].cov); + } + } + } + m_covProxies.clear(); + + return true; +} + +bool CBoxAlgorithmRegularizedCSPTrainer::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmRegularizedCSPTrainer::updateCov(const size_t index) +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + SIncrementalCovarianceProxy& curCovProxy(m_covProxies[index]); + for (size_t i = 0; i < boxCtx.getInputChunkCount(index + 1); ++i) + { + auto* decoder = &m_signalDecoders[index]; + const CMatrix* matrix = decoder->getOutputMatrix(); + + decoder->decode(i); + if (decoder->isHeaderReceived()) + { + Kernel::TParameterHandler features(curCovProxy.cov->getInputParameter(OVP_Algorithm_OnlineCovariance_InputParameterId_InputVectors)); + + features->resize(matrix->getDimensionSize(1), matrix->getDimensionSize(0)); + + OV_ERROR_UNLESS_KRF(m_filtersPerClass <= matrix->getDimensionSize(0), + "Invalid CSP filter dimension of [" << m_filtersPerClass << "] for stream " << i+1 << + " (expected value must be less than input channel count ["<< matrix->getDimensionSize(1) <<"])", + Kernel::ErrorType::BadSetting); + + curCovProxy.cov->activateInputTrigger(OVP_Algorithm_OnlineCovariance_Process_Reset, true); + + OV_ERROR_UNLESS_KRF(curCovProxy.cov->process(), "Failed to parametrize covariance algorithm", Kernel::ErrorType::Internal); + } + if (decoder->isBufferReceived()) + { + Kernel::TParameterHandler features(curCovProxy.cov->getInputParameter(OVP_Algorithm_OnlineCovariance_InputParameterId_InputVectors)); + + // transpose data + const size_t nChannels = matrix->getDimensionSize(0); + const size_t nSamples = matrix->getDimensionSize(1); + + const Eigen::Map inputMapper(const_cast(matrix->getBuffer()), nChannels, nSamples); + Eigen::Map outputMapper(features->getBuffer(), nSamples, nChannels); + outputMapper = inputMapper.transpose(); + + curCovProxy.cov->activateInputTrigger(OVP_Algorithm_OnlineCovariance_Process_Update, true); + curCovProxy.cov->process(); + + curCovProxy.nBuffers++; + curCovProxy.nSamples += nSamples; + } + // if (decoder->isEndReceived()) { } // nop + } + return true; +} + +// +// Returns a sample-weighted average of given covariance matrices that does not include the cov of SkipIndex +// +// @todo error handling is a bit scarce +// +// @note This will recompute the weights on every call, but given how small amount of +// computations we're speaking of, there's not much point in optimizing. +// +bool CBoxAlgorithmRegularizedCSPTrainer::outclassCovAverage(const size_t skipIndex, const std::vector& cov, Eigen::MatrixXd& covAvg) +{ + if (cov.empty() || skipIndex >= cov.size()) { return false; } + + std::vector classWeights; + uint64_t totalOutclassSamples = 0; + + // Compute the total number of samples + for (size_t i = 0; i < m_nClasses; ++i) { if (i != skipIndex) { totalOutclassSamples += m_covProxies[i].nSamples; } } + + // Compute weigths for averaging + classWeights.resize(m_nClasses); + for (size_t i = 0; i < m_nClasses; ++i) + { + classWeights[i] = i == skipIndex ? 0 : m_covProxies[i].nSamples / double(totalOutclassSamples); + this->getLogManager() << Kernel::LogLevel_Debug << "Condition " << i + 1 << " averaging weight = " << classWeights[i] << "\n"; + } + + // Average the covs + covAvg.resizeLike(cov[0]); + covAvg.setZero(); + for (size_t i = 0; i < m_nClasses; ++i) { covAvg += (classWeights[i] * cov[i]); } + + return true; +} + +bool CBoxAlgorithmRegularizedCSPTrainer::computeCSP(const std::vector& cov, std::vector& sortedEigenVectors, + std::vector& sortedEigenValues) +{ + this->getLogManager() << Kernel::LogLevel_Info << "Compute CSP Begin\n"; + // We wouldn't need to store all this -- they are kept for debugging purposes + std::vector eigenValues(m_nClasses); + std::vector eigenVectors(m_nClasses), covInv(m_nClasses), covProd(m_nClasses); + Eigen::MatrixXd tikhonov, outclassCov; + tikhonov.resizeLike(cov[0]); + tikhonov.setIdentity(); + tikhonov *= m_tikhonov; + + sortedEigenVectors.resize(m_nClasses); + sortedEigenValues.resize(m_nClasses); + + // To get the CSP filters, we compute two sets of eigenvectors, eig(inv(sigma2+tikhonov)*sigma1) and eig(inv(sigma1+tikhonov)*sigma2 + // and pick the ones corresponding to the largest eigenvalues as spatial filters [following Lotte & Guan 2011]. Assumes the shrink + // of the sigmas (if its used) has been performed inside the cov computation algorithm. + + Eigen::EigenSolver solver; + + for (size_t c = 0; c < m_nClasses; ++c) + { + try { covInv[c] = (cov[c] + tikhonov).inverse(); } + catch (...) { OV_ERROR_KRF("Inversion failed for condition [" << c + 1 << "]", Kernel::ErrorType::BadProcessing); } + + // Compute covariance in all the classes except 'classIndex'. + OV_ERROR_UNLESS_KRF(outclassCovAverage(c, cov, outclassCov), "Outclass cov computation failed for condition [" << c + 1 << "]", + Kernel::ErrorType::BadProcessing); + + covProd[c] = covInv[c] * outclassCov; + + try { solver.compute(covProd[c]); } + catch (...) { OV_ERROR_KRF("EigenSolver failed for condition [" << c + 1 << "]", Kernel::ErrorType::BadProcessing); } + + eigenValues[c] = solver.eigenvalues().real(); + eigenVectors[c] = solver.eigenvectors().real(); + + // Sort the vectors -_- + std::vector> indexes; + indexes.reserve(eigenValues[c].size()); + for (int i = 0; i < eigenValues[c].size(); ++i) { indexes.emplace_back(std::make_pair((eigenValues[c])[i], i)); } + sort(indexes.begin(), indexes.end(), std::greater>()); + + sortedEigenValues[c].resizeLike(eigenValues[c]); + sortedEigenVectors[c].resizeLike(eigenVectors[c]); + + for (int i = 0; i < eigenValues[c].size(); ++i) + { + sortedEigenValues[c][i] = eigenValues[c][indexes[i].second]; + //@todo @FIXME This fonction work sometimes randomly + sortedEigenVectors[c].col(i) = eigenVectors[c].col(indexes[i].second); + } + } + return true; +} + +bool CBoxAlgorithmRegularizedCSPTrainer::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + bool shouldTrain = false; + uint64_t date = 0, startTime = 0, endTime = 0; + + // Handle input stimulations + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_stimDecoder.decode(i); + if (m_stimDecoder.isHeaderReceived()) + { + m_encoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + if (m_stimDecoder.isBufferReceived()) + { + const Kernel::TParameterHandler stimSet(m_stimDecoder.getOutputStimulationSet()); + for (size_t j = 0; j < stimSet->getStimulationCount(); ++j) + { + if (stimSet->getStimulationIdentifier(j) == m_stimID) + { + date = stimSet->getStimulationDate(stimSet->getStimulationCount() - 1); + startTime = boxContext.getInputChunkStartTime(0, i); + endTime = boxContext.getInputChunkEndTime(0, i); + shouldTrain = true; + break; + } + } + } + if (m_stimDecoder.isEndReceived()) { m_encoder.encodeEnd(); } + } + + // Update all covs with the current data chunks (if any) + for (size_t i = 0; i < m_nClasses; ++i) { if (!updateCov(i)) { return false; } } + + if (shouldTrain) + { + this->getLogManager() << Kernel::LogLevel_Info << "Received train stimulation - be patient\n"; + + const CMatrix* input = m_signalDecoders[0].getOutputMatrix(); + const size_t nChannels = input->getDimensionSize(0); + + this->getLogManager() << Kernel::LogLevel_Debug << "Computing eigen vector decomposition...\n"; + + // Get out the covariances + std::vector cov(m_nClasses); + + for (size_t i = 0; i < m_nClasses; ++i) + { + OV_ERROR_UNLESS_KRF(m_covProxies[i].nSamples >= 2, + "Invalid sample count of [" < 2)", + Kernel::ErrorType::BadProcessing); + + Kernel::TParameterHandler op_cov(m_covProxies[i].cov->getOutputParameter(OVP_Algorithm_OnlineCovariance_OutputParameterId_CovarianceMatrix)); + + // Get regularized cov + m_covProxies[i].cov->activateInputTrigger(OVP_Algorithm_OnlineCovariance_Process_GetCov, true); + OV_ERROR_UNLESS_KRF(m_covProxies[i].cov->process(), "Failed to retrieve regularized covariance", Kernel::ErrorType::Internal); + + const Eigen::Map covMapper(op_cov->getBuffer(), nChannels, nChannels); + cov[i] = covMapper; + + // Get vanilla cov + m_covProxies[i].cov->activateInputTrigger(OVP_Algorithm_OnlineCovariance_Process_GetCovRaw, true); + OV_ERROR_UNLESS_KRF(m_covProxies[i].cov->process(), "Failed to retrieve vanilla covariance", Kernel::ErrorType::Internal); + } + + // Sanity check + for (size_t i = 1; i < m_nClasses; ++i) + { + OV_ERROR_UNLESS_KRF(cov[i-1].rows() == cov[i].rows() && cov[i-1].cols() == cov[i].cols(), + "Mismatch between the number of channel in both input streams", Kernel::ErrorType::BadValue); + } + + this->getLogManager() << Kernel::LogLevel_Info << "Data covariance dims are [" << cov[0].rows() << "x" << cov[0].cols() + << "]. Number of samples per condition : \n"; + for (size_t i = 0; i < m_nClasses; ++i) + { + this->getLogManager() << Kernel::LogLevel_Info << " cond " << i + 1 << " = " << m_covProxies[i].nBuffers + << " chunks, sized " << input->getDimensionSize(1) << " -> " << m_covProxies[i].nSamples << " samples\n"; + // this->getLogManager() << Kernel::LogLevel_Info << "Using shrinkage coeff " << m_Shrinkage << " ...\n"; + } + + // Compute the actual CSP using the obtained covariance matrices + std::vector sortedVectors; + std::vector sortedValues; + OV_ERROR_UNLESS_KRF(computeCSP(cov, sortedVectors, sortedValues), "Failure when computing CSP", Kernel::ErrorType::BadProcessing); + + // Create a CMatrix mapper that can spool the filters to a file + CMatrix selectedVectors; + selectedVectors.resize(m_filtersPerClass * m_nClasses, nChannels); + + Eigen::Map selectedVectorsMapper(selectedVectors.getBuffer(), m_filtersPerClass * m_nClasses, nChannels); + + for (size_t c = 0; c < m_nClasses; ++c) + { + selectedVectorsMapper.block(c * m_filtersPerClass, 0, m_filtersPerClass, nChannels) = sortedVectors[c].block(0, 0, nChannels, m_filtersPerClass). + transpose(); + + this->getLogManager() << Kernel::LogLevel_Info << "The " << m_filtersPerClass << " filter(s) for cond " << c + 1 << " cover " + << 100.0 * sortedValues[c].head(m_filtersPerClass).sum() / sortedValues[c].sum() << "% of corresp. eigenvalues\n"; + } + + if (m_saveAsBoxConf) + { + std::ofstream file; + file.open(m_configFilename.toASCIIString(), std::ofstream::binary); + OV_ERROR_UNLESS_KRF(file.is_open(), "Failed to open file located at [" << m_configFilename << "]", Kernel::ErrorType::BadFileRead); + + file << "\n"; + file << "\t"; + const size_t n = m_filtersPerClass * m_nClasses * nChannels; + for (size_t i = 0; i < n; ++i) { file << std::scientific << selectedVectors.getBuffer()[i]; } + file << "\n"; + file << "\t" << m_filtersPerClass * m_nClasses << "\n"; + file << "\t" << nChannels << "\n"; + file << "\t\n"; + file << "\n"; + + file.close(); + } + else + { + for (size_t i = 0; i < selectedVectors.getDimensionSize(0); ++i) + { + std::stringstream label; + label << "Cond " << i / m_filtersPerClass + 1 << " filter " << i % m_filtersPerClass + 1; + selectedVectors.setDimensionLabel(0, i, label.str().c_str()); + } + + OV_ERROR_UNLESS_KRF(Toolkit::Matrix::saveToTextFile(selectedVectors, m_configFilename, 10), + "Failed to save file to location [" << m_configFilename << "]", + Kernel::ErrorType::BadFileWrite); + } + + this->getLogManager() << Kernel::LogLevel_Info << "Regularized CSP Spatial filter trained successfully.\n"; + + // Clean data, so if there's a new train stimulation, we'll start again. + // @note possibly this should be a parameter in the future to allow incremental training + for (auto& c : m_covProxies) + { + c.cov->activateInputTrigger(OVP_Algorithm_OnlineCovariance_Process_Reset, true); + c.nSamples = 0; + c.nBuffers = 0; + } + + m_encoder.getInputStimulationSet()->clear(); + m_encoder.getInputStimulationSet()->appendStimulation(OVTK_StimulationId_TrainCompleted, date, 0); + m_encoder.encodeBuffer(); + + boxContext.markOutputAsReadyToSend(0, startTime, endTime); + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyEIGEN diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmRegularizedCSPTrainer.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmRegularizedCSPTrainer.h new file mode 100755 index 0000000..7e404d6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmRegularizedCSPTrainer.h @@ -0,0 +1,123 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyEIGEN + +#include "../../ovp_defines.h" +#include +#include + +#include "../../algorithms/basic/ovpCAlgorithmOnlineCovariance.h" + +#include + +typedef Eigen::Matrix MatrixXdRowMajor; + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmRegularizedCSPTrainer final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + +protected: + + bool updateCov(size_t index); + bool outclassCovAverage(size_t skipIndex, const std::vector& cov, Eigen::MatrixXd& covAvg); + bool computeCSP(const std::vector& cov, std::vector& sortedEigenVectors, + std::vector& sortedEigenValues); + + Toolkit::TStimulationDecoder m_stimDecoder; + std::vector> m_signalDecoders; + Toolkit::TStimulationEncoder m_encoder; + + uint64_t m_stimID = 0; + CString m_configFilename; + size_t m_filtersPerClass = 0; + bool m_saveAsBoxConf = false; + bool m_hasBeenInitialized = false; + + double m_tikhonov = 0.0; + + struct SIncrementalCovarianceProxy + { + Kernel::IAlgorithmProxy* cov = nullptr; + size_t nBuffers = 0; + size_t nSamples = 0; + }; + + std::vector m_covProxies; + + size_t m_nClasses = 0; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_RegularizedCSPTrainer) +}; + +class CBoxAlgorithmRegularizedCSPTrainerListener final : public Toolkit::TBoxListener +{ +public: + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + box.setInputName(index, ("Signal condition " + std::to_string(index)).c_str()); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmRegularizedCSPTrainerDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Regularized CSP Trainer"); } + CString getAuthorName() const override { return CString("Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Computes Common Spatial Pattern filters with regularization"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Signal processing/Filtering"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_RegularizedCSPTrainer; } + IPluginObject* create() override { return new CBoxAlgorithmRegularizedCSPTrainer; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmRegularizedCSPTrainerListener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Stimulations", OV_TypeId_Stimulations); + prototype.addInput("Signal condition 1", OV_TypeId_Signal); + prototype.addInput("Signal condition 2", OV_TypeId_Signal); + + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + + prototype.addSetting("Train Trigger", OV_TypeId_Stimulation, "OVTK_GDF_End_Of_Session"); + prototype.addSetting("Spatial filter configuration", OV_TypeId_Filename, ""); + prototype.addSetting("Filters per condition", OV_TypeId_Integer, "2"); + prototype.addSetting("Save filters as box config", OV_TypeId_Boolean, "false"); + + // Params of the cov algorithm; would be better to poll the params from the algorithm, however this is not straightforward to do + prototype.addSetting("Covariance update", OVP_TypeId_OnlineCovariance_UpdateMethod, "Chunk average"); + prototype.addSetting("Trace normalization", OV_TypeId_Boolean, "false"); + prototype.addSetting("Shrinkage coefficient", OV_TypeId_Float, "0.0"); + prototype.addSetting("Tikhonov coefficient", OV_TypeId_Float, "0.0"); + + prototype.addOutput("Train-completed Flag", OV_TypeId_Stimulations); + + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_RegularizedCSPTrainerDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyEIGEN diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmSpatialFilter.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmSpatialFilter.cpp new file mode 100755 index 0000000..367f077 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmSpatialFilter.cpp @@ -0,0 +1,250 @@ +#include "ovpCBoxAlgorithmSpatialFilter.h" + +#include +#include + +#if defined TARGET_HAS_ThirdPartyEIGEN +#include +typedef Eigen::Matrix MatrixXdRowMajor; +#endif + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +size_t CBoxAlgorithmSpatialFilter::loadCoefs(const CString& coefs, const char c1, const char c2, const size_t nRows, const size_t nCols) +{ + // Count the number of entries + // @Note To avoid doing a ton of subsequent memory allocations (very slow on Windows debug builds), we first count the number of entries in the vector. If the file format had specified the vector dimension, we wouldn't have to do this step. + size_t count = 0; + const char* ptr = coefs.toASCIIString(); + while (*ptr != 0) + { + // Skip separator characters + while (*ptr == c1 || *ptr == c2) { ptr++; } + if (*ptr == 0) { break; } + // Ok, we have reached something that is not NULL or separator, assume its a number + count++; + // Skip the normal characters + while (*ptr != c1 && *ptr != c2 && *ptr != 0) { ptr++; } + } + + OV_ERROR_UNLESS_KRZ(count == nRows*nCols, "Invalid computed coefficients count [" << count << "] (expected " << nRows * nCols << " coefficients)", + Kernel::ErrorType::BadProcessing); + + // Resize in one step for efficiency. + m_filterBank.resize(nRows, nCols); + + double* filter = m_filterBank.getBuffer(); + + // Ok, convert to floats + ptr = coefs.toASCIIString(); + size_t idx = 0; + while (*ptr != 0) + { + const size_t size = 1024; + char buffer[size]; + // Skip separator characters + while (*ptr == c1 || *ptr == c2) { ptr++; } + if (*ptr == 0) { break; } + // Copy the normal characters, don't exceed buffer size + size_t i = 0; + while (*ptr != c1 && *ptr != c2 && *ptr != 0) + { + if (i < size - 1) { buffer[i++] = *ptr; } + else { break; } + ptr++; + } + buffer[i] = 0; + + OV_ERROR_UNLESS_KRZ(idx < count, "Invalid parsed coefficient number [" << idx << "] (expected maximium " << count << " coefficients)", + Kernel::ErrorType::BadProcessing); + + // Finally, convert + try { filter[idx] = std::stod(buffer); } + catch (const std::exception&) + { + const size_t row = idx / nRows + 1; + const size_t col = idx % nRows + 1; + + OV_ERROR_KRZ("Failed to parse coefficient number [" << idx << "] at matrix positions [" << row << "," << col << "]", Kernel::ErrorType::BadProcessing); + } + + idx++; + } + + return idx; +} + +bool CBoxAlgorithmSpatialFilter::initialize() +{ + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + + m_decoder = nullptr; + m_encoder = nullptr; + + CIdentifier id; + boxContext.getInputType(0, id); + + if (id == OV_TypeId_StreamedMatrix) + { + m_decoder = new Toolkit::TStreamedMatrixDecoder(*this, 0); + m_encoder = new Toolkit::TStreamedMatrixEncoder(*this, 0); + } + else if (id == OV_TypeId_Signal) + { + m_decoder = new Toolkit::TSignalDecoder(*this, 0); + m_encoder = new Toolkit::TSignalEncoder(*this, 0); + + static_cast*>(m_encoder)->getInputSamplingRate().setReferenceTarget( + static_cast*>(m_decoder)->getOutputSamplingRate()); + } + else if (id == OV_TypeId_Spectrum) + { + m_decoder = new Toolkit::TSpectrumDecoder(*this, 0); + m_encoder = new Toolkit::TSpectrumEncoder(*this, 0); + + static_cast*>(m_encoder)->getInputFrequencyAbscissa().setReferenceTarget( + static_cast*>(m_decoder)->getOutputFrequencyAbscissa()); + static_cast*>(m_encoder)->getInputSamplingRate().setReferenceTarget( + static_cast*>(m_decoder)->getOutputSamplingRate()); + } + else { OV_ERROR_KRF("Invalid input stream type [" << id.str() << "]", Kernel::ErrorType::BadInput); } + + // If we have a filter file, use dimensions and coefficients from that. Otherwise, use box config params. + const CString filterFile = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + if (filterFile != CString("")) + { + OV_ERROR_UNLESS_KRF(Toolkit::Matrix::loadFromTextFile(m_filterBank, filterFile), + "Failed to load filter parameters from file at location [" << filterFile << "]", Kernel::ErrorType::BadFileRead); + + OV_ERROR_UNLESS_KRF(m_filterBank.getDimensionCount() == 2, + "Invalid filter matrix in file " << filterFile << ": found [" << m_filterBank.getDimensionCount() << + "] dimensions (expected 2 dimension)", Kernel::ErrorType::BadConfig); + +#if defined(DEBUG) + Toolkit::Matrix::saveToTextFile(m_filterBank, this->getConfigurationManager().expand("${Path_UserData}/spatialfilter_debug.txt")); +#endif + } + else + { + const CString coefs = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + // The double cast is needed until FSettingValueAutoCast supports size_t. + const size_t nOChannels = size_t(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1))); + const size_t nIChannels = size_t(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2))); + const size_t nCoefs = loadCoefs(coefs, ' ', OV_Value_EnumeratedStringSeparator, nOChannels, nIChannels); + + OV_ERROR_UNLESS_KRF(nCoefs == nOChannels * nIChannels, + "Invalid number of coefficients [" << nCoefs << "] (expected "<< nOChannels * nIChannels + << " coefficients)", Kernel::ErrorType::BadConfig); + +#if defined(DEBUG) + Toolkit::Matrix::saveToTextFile(m_filterBank, this->getConfigurationManager().expand("${Path_UserData}/spatialfilter_debug.txt")); +#endif + } + + return true; +} + +bool CBoxAlgorithmSpatialFilter::uninitialize() +{ + if (m_decoder) + { + m_decoder->uninitialize(); + delete m_decoder; + m_decoder = nullptr; + } + + if (m_encoder) + { + m_encoder->uninitialize(); + delete m_encoder; + m_encoder = nullptr; + } + + return true; +} + +bool CBoxAlgorithmSpatialFilter::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmSpatialFilter::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_decoder->decode(i); + if (m_decoder->isHeaderReceived()) + { + // we can treat them all as matrix decoders as they all inherit from it + const CMatrix* iMatrix = (static_cast*>(m_decoder))->getOutputMatrix(); + + const size_t nChannelIn = iMatrix->getDimensionSize(0); + const size_t nSampleIn = iMatrix->getDimensionSize(1); + + OV_ERROR_UNLESS_KRF(nChannelIn != 0 && nSampleIn != 0, + "Invalid matrix size with zero dimension on input [" << nChannelIn << " x " << nSampleIn << "]", + Kernel::ErrorType::BadConfig); + + const size_t nChannelFilterIn = m_filterBank.getDimensionSize(1); + const size_t nChannelFilterOut = m_filterBank.getDimensionSize(0); + + OV_ERROR_UNLESS_KRF(nChannelIn == nChannelFilterIn, + "Invalid input channel count [" << nChannelIn << "] (expected " << nChannelFilterIn << " channel count)", + Kernel::ErrorType::BadConfig); + + CMatrix* oMatrix = static_cast*>(m_encoder)->getInputMatrix(); + oMatrix->resize(nChannelFilterOut, nSampleIn); + + // Name channels + for (size_t j = 0; j < oMatrix->getDimensionSize(0); ++j) { oMatrix->setDimensionLabel(0, j, ("sFiltered " + std::to_string(j)).c_str()); } + + m_encoder->encodeHeader(); + } + if (m_decoder->isBufferReceived()) + { + const CMatrix* iMatrix = static_cast*>(m_decoder)->getOutputMatrix(); + CMatrix* oMatrix = static_cast*>(m_encoder)->getInputMatrix(); + + const double* in = iMatrix->getBuffer(); + double* out = oMatrix->getBuffer(); + const size_t nChannelIn = iMatrix->getDimensionSize(0); + const size_t nChannelOut = oMatrix->getDimensionSize(0); + const size_t nSample = iMatrix->getDimensionSize(1); + +#if defined TARGET_HAS_ThirdPartyEIGEN + //@TODO check this part we only create matrix ? + const Eigen::Map inMapper(const_cast(in), nChannelIn, nSample); + const Eigen::Map filterMapper(m_filterBank.getBuffer(), m_filterBank.getDimensionSize(0), m_filterBank.getDimensionSize(1)); + Eigen::Map outMapper(out, nChannelOut, nSample); + outMapper = filterMapper * inMapper; +#else + const double* filter = m_filterBank.getBuffer(); + + memset(out, 0, nSample*nChannelOut*sizeof(double)); + + for (size_t j = 0; j < nChannelOut; ++j) + { + for (size_t k = 0; k < nChannelIn; ++k) + { + for (size_t l = 0; l < nSample; ++l) { out[j*nSample+l] += filter[j * nChannelIn + k] * in[k * nSample + l]; } + } + } +#endif + m_encoder->encodeBuffer(); + } + if (m_decoder->isEndReceived()) { m_encoder->encodeEnd(); } + + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmSpatialFilter.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmSpatialFilter.h new file mode 100644 index 0000000..3cabdcd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmSpatialFilter.h @@ -0,0 +1,107 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmSpatialFilter final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_SpatialFilter) + +protected: + + Toolkit::TDecoder* m_decoder = nullptr; + Toolkit::TEncoder* m_encoder = nullptr; + + CMatrix m_filterBank; + +private: + // Loads the m_vCoefficient vector (representing a matrix) from the given string. c1 and c2 are separator characters between floats. + size_t loadCoefs(const CString& coefs, char c1, char c2, size_t nRows, size_t nCols); +}; + +class CBoxAlgorithmSpatialFilterListener final : public Toolkit::TBoxListener +{ +public: + bool onInputTypeChanged(Kernel::IBox& box, const size_t /*index*/) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(0, typeID); + box.setOutputType(0, typeID); + return true; + } + + bool onOutputTypeChanged(Kernel::IBox& box, const size_t /*index*/) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getOutputType(0, typeID); + box.setInputType(0, typeID); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmSpatialFilterDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Spatial Filter"); } + CString getAuthorName() const override { return CString("Yann Renard, Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + + CString getShortDescription() const override { return CString("Maps M inputs to N outputs by multiplying the each input vector with a matrix"); } + + CString getDetailedDescription() const override + { + return CString( + "The applied coefficient matrix must be specified as a box parameter. The filter processes each sample independently of the past samples."); + } + + CString getCategory() const override { return CString("Signal processing/Filtering"); } + CString getVersion() const override { return CString("1.1"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.1.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_SpatialFilter; } + IPluginObject* create() override { return new CBoxAlgorithmSpatialFilter; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmSpatialFilterListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input Signal", OV_TypeId_Signal); + prototype.addOutput("Output Signal", OV_TypeId_Signal); + prototype.addSetting("Spatial Filter Coefficients", OV_TypeId_String, "1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1"); + prototype.addSetting("Number of Output Channels", OV_TypeId_Integer, "4"); + prototype.addSetting("Number of Input Channels", OV_TypeId_Integer, "4"); + prototype.addSetting("Filter matrix file", OV_TypeId_Filename, ""); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + prototype.addInputSupport(OV_TypeId_Spectrum); + prototype.addInputSupport(OV_TypeId_Signal); + + prototype.addOutputSupport(OV_TypeId_StreamedMatrix); + prototype.addOutputSupport(OV_TypeId_Spectrum); + prototype.addOutputSupport(OV_TypeId_Signal); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_SpatialFilterDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmTemporalFilter.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmTemporalFilter.cpp new file mode 100644 index 0000000..3581f45 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/filters/ovpCBoxAlgorithmTemporalFilter.cpp @@ -0,0 +1,333 @@ +#include "ovpCBoxAlgorithmTemporalFilter.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +namespace { +typedef Dsp::SmoothedFilterDesign, 1, Dsp::DirectFormII> CButterworthBandPass; +typedef Dsp::SmoothedFilterDesign, 1, Dsp::DirectFormII> CButterworthBandStop; +typedef Dsp::SmoothedFilterDesign, 1, Dsp::DirectFormII> CButterworthHighPass; +typedef Dsp::SmoothedFilterDesign, 1, Dsp::DirectFormII> CButterworthLowPass; + +std::shared_ptr createButterworthFilter(const EFilterType type, const size_t nSmooth) +{ + switch (type) + { + case EFilterType::BandPass: return std::static_pointer_cast(std::make_shared(int(nSmooth))); + case EFilterType::BandStop: return std::static_pointer_cast(std::make_shared(int(nSmooth))); + case EFilterType::HighPass: return std::static_pointer_cast(std::make_shared(int(nSmooth))); + case EFilterType::LowPass: return std::static_pointer_cast(std::make_shared(int(nSmooth))); + default: return nullptr; + } +} + +bool getButterworthParameters(Dsp::Params& parameters, const size_t frequency, const EFilterType type, const size_t order, + const double lowCut, const double highCut, const double /*ripple*/) +{ + parameters[0] = double(frequency); + parameters[1] = double(order); + switch (type) + { + case EFilterType::BandPass: + case EFilterType::BandStop: + parameters[2] = .5 * (highCut + lowCut); + parameters[3] = 1. * (highCut - lowCut); + break; + case EFilterType::HighPass: + parameters[2] = lowCut; + break; + case EFilterType::LowPass: + parameters[2] = highCut; + break; + default: + return false; + } + return true; +} + +/* +typedef Dsp::SmoothedFilterDesign, 1, Dsp::DirectFormII> CChebyshevBandPass; +typedef Dsp::SmoothedFilterDesign, 1, Dsp::DirectFormII> CChebyshevBandStop; +typedef Dsp::SmoothedFilterDesign, 1, Dsp::DirectFormII> CChebyshevHighPass; +typedef Dsp::SmoothedFilterDesign, 1, Dsp::DirectFormII> CChebyshevLowPass; + std::shared_ptr < Dsp::Filter > createChebishevFilter(size_t type, size_t nSmooth) + { + switch(type) + { + case EFilterType::BandPass: return std::shared_ptr < Dsp::Filter >(new CChebyshevBandPass(int(nSmooth))); + case EFilterType::BandStop: return std::shared_ptr < Dsp::Filter >(new CChebyshevBandStop(int(nSmooth))); + case EFilterType::HighPass: return std::shared_ptr < Dsp::Filter >(new CChebyshevHighPass(int(nSmooth))); + case EFilterType::LowPass: return std::shared_ptr < Dsp::Filter >(new CChebyshevLowPass(int(nSmooth))); + default: + break; + } + return NULL; + } + + bool getChebishevParameters(Dsp::Params& params, size_t type, size_t sampling, size_t order, double lowCut, double highCut, double ripple) + { + params[0]=int(sampling); + params[1]=int(order); + switch(type) + { + case EFilterType::BandPass: + case EFilterType::BandStop: + params[2]=.5*(highCut+lowCut); + params[3]=1.*(highCut-lowCut); + params[4]=ripple; + break; + case EFilterType::HighPass: + params[2]=highCut; // TO CHECK : lowCut ? + params[3]=ripple; + break; + case EFilterType::LowPass: + params[2]=highCut; + params[3]=lowCut; // TO CHECK : ripple ? + break; + default: + return false; + } + return true; + } + */ + +typedef bool (*fpGetParameters_t)(Dsp::Params& params, size_t sampling, EFilterType type, size_t order, double lowCut, double highCut, double ripple); +typedef std::shared_ptr (*fpCreateFilter_t)(EFilterType type, size_t nSmooth); +} // namespace + +bool CBoxAlgorithmTemporalFilter::initialize() +{ + m_method = EFilterMethod(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0))); // cast Needed for x32 + m_type = EFilterType(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1))); // cast Needed for x32 + const int64_t order = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + m_lowCut = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + m_highCut = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + + OV_ERROR_UNLESS_KRF(order >= 1, "Invalid filter order [" << order << "] (expected value >= 1)", Kernel::ErrorType::BadSetting); + + m_order = size_t(order); + + if (m_type == EFilterType::LowPass) + { + OV_ERROR_UNLESS_KRF(m_highCut > 0, "Invalid high cut-off frequency [" << m_highCut << "] (expected value > 0)", Kernel::ErrorType::BadSetting); + } + else if (m_type == EFilterType::HighPass) + { + OV_ERROR_UNLESS_KRF(m_lowCut > 0, "Invalid low cut-off frequency [" << m_lowCut << "] (expected value > 0)", Kernel::ErrorType::BadSetting); + } + else if (m_type == EFilterType::BandPass || m_type == EFilterType::BandStop) + { + OV_ERROR_UNLESS_KRF(m_lowCut >= 0, "Invalid low cut-off frequency [" << m_lowCut << "] (expected value >= 0)", Kernel::ErrorType::BadSetting); + OV_ERROR_UNLESS_KRF(m_highCut > 0, "Invalid high cut-off frequency [" << m_highCut << "] (expected value > 0)", Kernel::ErrorType::BadSetting); + OV_ERROR_UNLESS_KRF(m_highCut > m_lowCut, + "Invalid cut-off frequencies [" << m_lowCut << "," << m_highCut << "] (expected low frequency < high frequency)", + Kernel::ErrorType::BadSetting); + } + else { OV_ERROR_KRF("Invalid filter type", Kernel::ErrorType::BadSetting); } + + m_decoder.initialize(*this, 0); + m_encoder.initialize(*this, 0); + + m_encoder.getInputSamplingRate().setReferenceTarget(m_decoder.getOutputSamplingRate()); + m_encoder.getInputMatrix().setReferenceTarget(m_decoder.getOutputMatrix()); + + return true; +} + +bool CBoxAlgorithmTemporalFilter::uninitialize() +{ + m_decoder.uninitialize(); + m_encoder.uninitialize(); + + return true; +} + +bool CBoxAlgorithmTemporalFilter::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmTemporalFilter::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + size_t j; + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_decoder.decode(i); + + const size_t nChannel = m_decoder.getOutputMatrix()->getDimensionSize(0); + const size_t nSample = m_decoder.getOutputMatrix()->getDimensionSize(1); + + if (m_decoder.isHeaderReceived()) + { + if (m_type != EFilterType::LowPass) // verification for high-pass, band-pass and band-stop filters + { + OV_ERROR_UNLESS_KRF(m_lowCut <= m_decoder.getOutputSamplingRate()*.5, + "Invalid low cut-off frequency [" << m_lowCut << "] (expected value must meet nyquist criteria for sampling rate " + << m_decoder.getOutputSamplingRate() << ")", Kernel::ErrorType::BadConfig); + } + if (m_type != EFilterType::HighPass) // verification for low-pass, band-pass and band-stop filters + { + OV_ERROR_UNLESS_KRF(m_highCut <= m_decoder.getOutputSamplingRate()*.5, + "Invalid high cut-off frequency [" << m_highCut << "] (expected value must meet nyquist criteria for sampling rate " + << m_decoder.getOutputSamplingRate() << ")", Kernel::ErrorType::BadConfig); + } + + m_filters.clear(); + //m_vFilter2.clear(); + + fpGetParameters_t fpGetParameters; + fpCreateFilter_t fpCreateFilter; + if (m_method == EFilterMethod::Butterworth) // Butterworth + { + fpGetParameters = getButterworthParameters; + fpCreateFilter = createButterworthFilter; + } + else if (m_method == EFilterMethod::Chebyshev) // Chebyshev + { + OV_ERROR_KRF("Chebyshev method not implemented", Kernel::ErrorType::NotImplemented); + //fpGetParameters = getChebishevParameters; + //fpCreateFilter = createChebishevFilter; + } + else if (m_method == EFilterMethod::YuleWalker) // YuleWalker + { + OV_ERROR_KRF("YuleWalker method not implemented", Kernel::ErrorType::NotImplemented); + //fpGetParameters = getYuleWalkerParameters; + //fpCreateFilter = createYuleWalkerFilter; + } + else { OV_ERROR_KRF("Invalid filter method", Kernel::ErrorType::BadSetting); } + + if (m_type == EFilterType::HighPass) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Low cut frequency of the High pass filter : " << m_lowCut << "Hz\n"; + } + if (m_type == EFilterType::LowPass) + { + this->getLogManager() << Kernel::LogLevel_Debug << "High cut frequency of the Low pass filter : " << m_highCut << "Hz\n"; + } + + const size_t frequency = m_decoder.getOutputSamplingRate(); + const size_t nSmooth = 100 * frequency; + Dsp::Params params; + (*fpGetParameters)(params, frequency, m_type, m_order, m_lowCut, m_highCut, m_ripple); + + for (j = 0; j < nChannel; ++j) + { + std::shared_ptr filter = (*fpCreateFilter)(m_type, nSmooth); + filter->setParams(params); + m_filters.push_back(filter); + /*std::shared_ptr < Dsp::Filter > filter2=(*fpCreateFilter)(m_type, nSmoothingSample); + l_pFilter2->setParams(filterParameters); + m_vFilter2.push_back(filter2);*/ + } + + m_encoder.encodeHeader(); + } + if (m_decoder.isBufferReceived()) + { + double* buffer = m_decoder.getOutputMatrix()->getBuffer(); + + //"french cook" to reduce transient for bandpass and highpass filters + if (m_firstSamples.empty()) + { + m_firstSamples.resize(nChannel, 0); //initialization to 0 + if (m_type == EFilterType::BandPass || m_type == EFilterType::HighPass) + { + for (j = 0; j < nChannel; ++j) + { + m_firstSamples[j] = buffer[j * nSample]; //first value of the signal = DC offset + } + } + } + + for (j = 0; j < nChannel; ++j) + { + //for bandpass and highpass filters, suppression of the value m_firstSamples = DC offset + //otherwise, no treatment, since m_firstSamples = 0 + for (size_t k = 0; k < nSample; ++k) { buffer[k] -= m_firstSamples[j]; } + + if (m_filters[j]) { m_filters[j]->process(int(nSample), &buffer); } + buffer += nSample; + } + m_encoder.encodeBuffer(); + } + if (m_decoder.isEndReceived()) { m_encoder.encodeEnd(); } + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + return true; +} + +/* +//zero-phase filtering, with two different filters +void CBoxAlgorithmTemporalFilter::filtfilt2(std::shared_ptr < Dsp::Filter > pFilter1, std::shared_ptr < Dsp::Filter > pFilter2, size_t SampleCount, double* buffer) +{ + size_t j; + + //1rst filtering + pFilter1->process(SampleCount, &buffer); + + //reversal of the buffer + for (j=0; jprocess(SampleCount, &buffer); + + //reversal of the buffer + for (j=0; jgetPoleZeros().size()-1), SampleCount/2 ); + std::vector tmp; + tmp.resize(SampleCount+2*transientLength); + + for (j=0; j +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmTemporalFilter final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_TemporalFilter) + +protected: + + Toolkit::TSignalDecoder m_decoder; + Toolkit::TSignalEncoder m_encoder; + + + EFilterMethod m_method = EFilterMethod::Butterworth; + EFilterType m_type = EFilterType::BandPass; + size_t m_order = 0; + + double m_lowCut = 0; + double m_highCut = 0; + double m_ripple = 0; // for Chebyshev + + std::vector> m_filters; + //std::vector < std::shared_ptr < Dsp::Filter > > m_filters; + + std::vector m_firstSamples; +}; + +class CBoxAlgorithmTemporalFilterDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Temporal Filter"); } + CString getAuthorName() const override { return CString("Yann Renard & Laurent Bonnet"); } + CString getAuthorCompanyName() const override { return CString("Mensia Technologies SA"); } + + CString getShortDescription() const override { return CString("Temporal filtering based on various one-way IIR filter designs"); } + + CString getDetailedDescription() const override + { + return CString("Applies a temporal filter, based on various one-way IIR filter designs, to the input stream."); + } + + CString getCategory() const override { return CString("Signal processing/Temporal Filtering"); } + CString getVersion() const override { return CString("1.1"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_TemporalFilter; } + IPluginObject* create() override { return new CBoxAlgorithmTemporalFilter; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addOutput("Output signal", OV_TypeId_Signal); + prototype.addSetting("Filter Method", OVP_TypeId_FilterMethod, "Butterworth"); + prototype.addSetting("Filter Type", OVP_TypeId_FilterType, "Band Pass"); + prototype.addSetting("Filter Order", OV_TypeId_Integer, "4"); + prototype.addSetting("Low Cut-off Frequency (Hz)", OV_TypeId_Float, "1"); + prototype.addSetting("High Cut-off Frequency (Hz)", OV_TypeId_Float, "40"); + prototype.addSetting("Band Pass Ripple (dB)", OV_TypeId_Float, "0.5"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_TemporalFilterDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSignalAverage.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSignalAverage.cpp new file mode 100644 index 0000000..a06d0e7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSignalAverage.cpp @@ -0,0 +1,96 @@ +#include "ovpCBoxAlgorithmSignalAverage.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +void CBoxAlgorithmSignalAverage::computeAverage() +{ + const double* input = m_decoder.getOutputMatrix()->getBuffer(); + double* output = m_encoder.getInputMatrix()->getBuffer(); + + const size_t nChannel = m_decoder.getOutputMatrix()->getDimensionSize(0); + const size_t nSample = m_decoder.getOutputMatrix()->getDimensionSize(1); + + //computes and stores the average for each channel + for (size_t c = 0; c < nChannel; ++c) + { + double sum = 0; + for (size_t i = 0; i < nSample; ++i) { sum += input[(c * nSample) + i]; } + output[c] = sum / nSample; + } +} + + +bool CBoxAlgorithmSignalAverage::initialize() +{ + m_decoder.initialize(*this, 0); + m_encoder.initialize(*this, 0); + return true; +} + +bool CBoxAlgorithmSignalAverage::uninitialize() +{ + m_encoder.uninitialize(); + m_decoder.uninitialize(); + return true; +} + +bool CBoxAlgorithmSignalAverage::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmSignalAverage::process() +{ + IDynamicBoxContext* boxContext = getBoxAlgorithmContext()->getDynamicBoxContext(); + + // Process input data + for (size_t i = 0; i < boxContext->getInputChunkCount(0); ++i) + { + m_decoder.decode(i); + + if (m_decoder.isHeaderReceived()) + { + // Construct the properties of the output stream + const CMatrix* iMatrix = m_decoder.getOutputMatrix(); + CMatrix* oMatrix = m_encoder.getInputMatrix(); + + // Sampling rate will be decimated in the output + const uint64_t iSampling = m_decoder.getOutputSamplingRate(); + const size_t iSampleCount = iMatrix->getDimensionSize(1); + const uint64_t newSampling = uint64_t(ceil(double(iSampling) / double(iSampleCount))); + + m_encoder.getInputSamplingRate() = newSampling; + + // We keep the number of channels, but the output chunk size will be 1 + oMatrix->resize(iMatrix->getDimensionSize(0), 1); + + for (size_t j = 0; j < oMatrix->getDimensionSize(0); ++j) { oMatrix->setDimensionLabel(0, j, iMatrix->getDimensionLabel(0, j)); } + + m_encoder.encodeHeader(); + getBoxAlgorithmContext()->getDynamicBoxContext()->markOutputAsReadyToSend(0, 0, 0); + } + + if (m_decoder.isBufferReceived()) + { + const uint64_t tStart = boxContext->getInputChunkStartTime(0, i); + const uint64_t tEnd = boxContext->getInputChunkEndTime(0, i); + + computeAverage(); + + m_encoder.encodeBuffer(); + getBoxAlgorithmContext()->getDynamicBoxContext()->markOutputAsReadyToSend(0, tStart, tEnd); + } + // if (m_decoder.isEndReceived()) { } // NOP + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSignalAverage.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSignalAverage.h new file mode 100644 index 0000000..46c683b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSignalAverage.h @@ -0,0 +1,66 @@ +#pragma once + +#include "../ovp_defines.h" +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +/** +*/ +class CBoxAlgorithmSignalAverage final : public Toolkit::TBoxAlgorithm +{ +public: + + CBoxAlgorithmSignalAverage() {} + void release() override {} + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_SignalAverage) + +protected: + void computeAverage(); + + // Needed to read the input and write the output + Toolkit::TSignalDecoder m_decoder; + Toolkit::TSignalEncoder m_encoder; +}; + +/** +* Description of the channel selection plugin +*/ +class CSignalAverageDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Signal average"); } + CString getAuthorName() const override { return CString("Bruno Renier"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Computes the average of each input buffer."); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Signal processing/Averaging"); } + CString getVersion() const override { return CString("0.5"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_SignalAverage; } + IPluginObject* create() override { return new CBoxAlgorithmSignalAverage(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addOutput("Filtered signal", OV_TypeId_Signal); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_SignalAverageDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSimpleDSP.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSimpleDSP.cpp new file mode 100755 index 0000000..7c2a5bd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSimpleDSP.cpp @@ -0,0 +1,232 @@ +#include "ovpCBoxAlgorithmSimpleDSP.h" + +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmSimpleDSP::initialize() +{ + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + + m_variables = new double*[boxContext.getInputCount()]; + + OV_ERROR_UNLESS_KRF(m_variables, "Failed to allocate arrays of floats for [" << boxContext.getInputCount() << "] inputs", Kernel::ErrorType::BadAlloc); + + const CString equation = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_parser = new CEquationParser(*this, m_variables, boxContext.getInputCount()); + + OV_ERROR_UNLESS_KRF(m_parser, "Failed to create equation parser", Kernel::ErrorType::BadAlloc); + + OV_ERROR_UNLESS_KRF(m_parser->compileEquation(equation.toASCIIString()), "Failed to compile equation [" << equation << "]", Kernel::ErrorType::Internal); + + m_equationType = m_parser->getTreeCategory(); + m_equationParam = m_parser->getTreeParameter(); + + CIdentifier streamType; + boxContext.getOutputType(0, streamType); + + OV_ERROR_UNLESS_KRF(this->getTypeManager().isDerivedFromStream(streamType, OV_TypeId_StreamedMatrix), + "Invalid output stream [" << streamType.str() << "] (expected stream must derive from OV_TypeId_StreamedMatrix)", Kernel::ErrorType::Internal); + + if (streamType == OV_TypeId_StreamedMatrix) + { + m_encoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder)); + m_encoder->initialize(); + for (size_t i = 0; i < boxContext.getInputCount(); ++i) + { + Kernel::IAlgorithmProxy* decoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixDecoder)); + decoder->initialize(); + m_decoders.push_back(decoder); + } + } + else if (streamType == OV_TypeId_FeatureVector) + { + m_encoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorEncoder)); + m_encoder->initialize(); + for (size_t i = 0; i < boxContext.getInputCount(); ++i) + { + Kernel::IAlgorithmProxy* decoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorDecoder)); + decoder->initialize(); + m_decoders.push_back(decoder); + } + } + else if (streamType == OV_TypeId_Signal) + { + m_encoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + m_encoder->initialize(); + for (size_t i = 0; i < boxContext.getInputCount(); ++i) + { + Kernel::IAlgorithmProxy* decoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalDecoder)); + decoder->initialize(); + Kernel::TParameterHandler ip_sampling(m_encoder->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)); + Kernel::TParameterHandler op_sampling(decoder->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + ip_sampling.setReferenceTarget(op_sampling); + m_decoders.push_back(decoder); + } + } + else if (streamType == OV_TypeId_Spectrum) + { + m_encoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumEncoder)); + m_encoder->initialize(); + for (size_t i = 0; i < boxContext.getInputCount(); ++i) + { + Kernel::IAlgorithmProxy* decoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumDecoder)); + decoder->initialize(); + Kernel::TParameterHandler op_CenterBands(m_encoder->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_FrequencyAbscissa)); + Kernel::TParameterHandler ip_CenterBands(decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_FrequencyAbscissa)); + ip_CenterBands.setReferenceTarget(op_CenterBands); + decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_Sampling)->setReferenceTarget( + m_encoder->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_Sampling)); + m_decoders.push_back(decoder); + } + } + else + { + OV_ERROR_KRF("Type [name=" << this->getTypeManager().getTypeName(streamType) << ":id=" << streamType.str() << "] not yet implemented", + Kernel::ErrorType::NotImplemented); + } + + m_checkDates = this->getConfigurationManager().expandAsBoolean("${Plugin_SignalProcessing_SimpleDSP_CheckChunkDates}", true); + this->getLogManager() << Kernel::LogLevel_Trace << (m_checkDates ? "Checking chunk dates..." : "Not checking chunk dates !") << "\n"; + + return true; +} + +bool CBoxAlgorithmSimpleDSP::uninitialize() +{ + for (auto& d : m_decoders) + { + d->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*d); + } + m_decoders.clear(); + + if (m_encoder) + { + m_encoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_encoder); + m_encoder = nullptr; + } + + delete m_parser; + m_parser = nullptr; + + delete [] m_variables; + m_variables = nullptr; + + return true; +} + +bool CBoxAlgorithmSimpleDSP::processInput(const size_t /*index*/) +{ + IDynamicBoxContext& boxContext = this->getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + if (boxContext.getInputChunkCount(0) == 0) { return true; } + + const uint64_t tStart = boxContext.getInputChunkStartTime(0, 0); + const uint64_t tEnd = boxContext.getInputChunkEndTime(0, 0); + for (size_t i = 1; i < nInput; ++i) + { + if (boxContext.getInputChunkCount(i) == 0) { return true; } + if (m_checkDates) + { + OV_ERROR_UNLESS_KRF(tStart == boxContext.getInputChunkStartTime(i, 0) || tEnd == boxContext.getInputChunkEndTime(i, 0), + "Invalid chunk dates (disable this error check by setting Plugin_SignalProcessing_SimpleDSP_CheckChunkDates to false)", + Kernel::ErrorType::BadInput); + } + } + + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} + +bool CBoxAlgorithmSimpleDSP::process() +{ + IDynamicBoxContext& boxContext = this->getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + size_t nHeader = 0; + size_t nBuffer = 0; + size_t nEnd = 0; + + Kernel::TParameterHandler ip_matrix(m_encoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)); + Kernel::TParameterHandler op_buffer(m_encoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + + m_matrices.clear(); + + op_buffer = boxContext.getOutputChunk(0); + for (size_t i = 0; i < nInput; ++i) + { + Kernel::TParameterHandler ip_buffer( + m_decoders[i]->getInputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_InputParameterId_MemoryBufferToDecode)); + Kernel::TParameterHandler op_matrix(m_decoders[i]->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + ip_buffer = boxContext.getInputChunk(i, 0); + m_decoders[i]->process(); + if (m_decoders[i]->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedHeader)) + { + if (i != 0) + { + OV_ERROR_UNLESS_KRF(m_matrices[0]->getBufferElementCount() == op_matrix->getBufferElementCount(), + "Invalid matrix dimension [" << m_matrices[0]->getBufferElementCount() << "] (expected value = " + << op_matrix->getBufferElementCount() <<")", Kernel::ErrorType::BadValue); + } + nHeader++; + } + if (m_decoders[i]->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedBuffer)) { nBuffer++; } + if (m_decoders[i]->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedEnd)) { nEnd++; } + m_matrices.push_back(op_matrix); + boxContext.markInputAsDeprecated(i, 0); + } + + OV_ERROR_UNLESS_KRF((!nHeader || nHeader == nInput) && (!nBuffer || nBuffer == nInput) && (!nEnd || nEnd == nInput), + "Invalid stream structure", Kernel::ErrorType::BadValue); + + if (nHeader) + { + ip_matrix->copyDescription(*m_matrices[0]); + m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader); + } + if (nBuffer) + { + this->evaluate(); + m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer); + } + if (nEnd) { m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd); } + + if (nHeader || nBuffer || nEnd) { boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, 0), boxContext.getInputChunkEndTime(0, 0)); } + + return true; +} + +void CBoxAlgorithmSimpleDSP::evaluate() +{ + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + + for (size_t i = 0; i < boxContext.getInputCount(); ++i) { m_variables[i] = m_matrices[i]->getBuffer(); } + + Kernel::TParameterHandler ip_pMatrix(m_encoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)); + double* buffer = ip_pMatrix->getBuffer(); + double* bufferEnd = ip_pMatrix->getBuffer() + ip_pMatrix->getBufferElementCount(); + + while (buffer != bufferEnd) + { + *buffer = m_parser->executeEquation(); + for (size_t i = 0; i < boxContext.getInputCount(); ++i) { m_variables[i]++; } + buffer++; + } +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSimpleDSP.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSimpleDSP.h new file mode 100644 index 0000000..9d7396a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmSimpleDSP.h @@ -0,0 +1,122 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include "../ovpCSimpleDSP/ovpCEquationParser.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmSimpleDSP final : public Toolkit::TBoxAlgorithm +{ +public: + + CBoxAlgorithmSimpleDSP() { } + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + void evaluate(); + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_SimpleDSP) + +protected: + std::vector m_decoders; + Kernel::IAlgorithmProxy* m_encoder = nullptr; + std::vector m_matrices; + + CEquationParser* m_parser = nullptr; + + uint64_t m_equationType = OP_USERDEF; + double m_equationParam = 0; + double** m_variables = nullptr; + + bool m_checkDates = false; +}; + +class CBoxAlgorithmSimpleDSPListener final : public Toolkit::TBoxListener +{ +public: + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + char name[1024]; + sprintf(name, "Input - %c", char('A' + index)); + CIdentifier typeID = CIdentifier::undefined(); + box.getOutputType(0, typeID); + box.setInputType(index, typeID); + box.setInputName(index, name); + return true; + } + + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(index, typeID); + box.setOutputType(0, typeID); + for (size_t i = 0; i < box.getInputCount(); ++i) { box.setInputType(i, typeID); } + return true; + } + + bool onOutputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getOutputType(index, typeID); + box.setOutputType(0, typeID); + for (size_t i = 0; i < box.getInputCount(); ++i) { box.setInputType(i, typeID); } + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmSimpleDSPDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Simple DSP"); } + CString getAuthorName() const override { return CString("Bruno Renier / Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA / IRISA"); } + CString getShortDescription() const override { return CString("Apply mathematical formulaes to matrices."); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Signal processing/Basic"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_SimpleDSP; } + IPluginObject* create() override { return new CBoxAlgorithmSimpleDSP(); } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmSimpleDSPListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input - A", OV_TypeId_Signal); + prototype.addOutput("Output", OV_TypeId_Signal); + prototype.addSetting("Equation", OV_TypeId_String, "x"); + + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + prototype.addInputSupport(OV_TypeId_FeatureVector); + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_Spectrum); + + prototype.addOutputSupport(OV_TypeId_StreamedMatrix); + prototype.addOutputSupport(OV_TypeId_FeatureVector); + prototype.addOutputSupport(OV_TypeId_Signal); + prototype.addOutputSupport(OV_TypeId_Spectrum); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_SimpleDSPDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmWindowing.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmWindowing.cpp new file mode 100755 index 0000000..2f1e703 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmWindowing.cpp @@ -0,0 +1,137 @@ +#define _USE_MATH_DEFINES +#include + +#include "ovpCBoxAlgorithmWindowing.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmWindowing::initialize() +{ + //reads the plugin settings + m_windowMethod = EWindowMethod(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0))); + + if (m_windowMethod != EWindowMethod::None && m_windowMethod != EWindowMethod::Hamming && m_windowMethod != EWindowMethod::Hanning + && m_windowMethod != EWindowMethod::Hann && m_windowMethod != EWindowMethod::Blackman && m_windowMethod != EWindowMethod::Triangular + && m_windowMethod != EWindowMethod::SquareRoot) { OV_ERROR_KRF("No valid windowing method set.\n", Kernel::ErrorType::BadSetting); } + + m_decoder.initialize(*this, 0); + m_encoder.initialize(*this, 0); + m_encoder.getInputMatrix().setReferenceTarget(m_decoder.getOutputMatrix()); + m_encoder.getInputSamplingRate().setReferenceTarget(m_decoder.getOutputSamplingRate()); + + return true; +} + +bool CBoxAlgorithmWindowing::uninitialize() +{ + m_decoder.uninitialize(); + m_encoder.uninitialize(); + + return true; +} + +bool CBoxAlgorithmWindowing::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmWindowing::process() +{ + Kernel::IBoxIO* boxContext = getBoxAlgorithmContext()->getDynamicBoxContext(); + + // Process input data + for (size_t i = 0; i < boxContext->getInputChunkCount(0); ++i) + { + const uint64_t startTime = boxContext->getInputChunkStartTime(0, i); + const uint64_t endTime = boxContext->getInputChunkEndTime(0, i); + + m_decoder.decode(i); + CMatrix* matrix = m_decoder.getOutputMatrix(); + + if (m_decoder.isHeaderReceived()) + { + /* + * Depending on the Window method, we compute the coefficient vector + * To be applied on each channel. + */ + m_windowCoefs.resize(matrix->getDimensionSize(1)); + const size_t n = m_windowCoefs.size(); + + if (m_windowMethod == EWindowMethod::Hamming) + { + for (size_t k = 0; k < n; ++k) { m_windowCoefs[k] = 0.54 - 0.46 * cos(2. * M_PI * double(k) / (double(n) - 1.)); } + } + else if (m_windowMethod == EWindowMethod::Hann || m_windowMethod == EWindowMethod::Hanning) + { + for (size_t k = 0; k < n; ++k) { m_windowCoefs[k] = 0.5 * (1. - cos(2. * M_PI * double(k) / (double(n) - 1.))); } + } + else if (m_windowMethod == EWindowMethod::Blackman) + { + for (size_t k = 0; k < n; ++k) + { + m_windowCoefs[k] = 0.42 - 0.5 * cos(2. * M_PI * double(k) / (double(n) - 1.)) + 0.08 * cos(4. * M_PI * double(k) / (double(n) - 1.)); + } + } + else if (m_windowMethod == EWindowMethod::Triangular) + { + /* from MATLAB implementation, as ITPP documentation seems to be flawed */ + for (size_t k = 1; k <= (n + 1) / 2; ++k) + { + if (n % 2 == 1) { m_windowCoefs[k - 1] = double((2. * double(k)) / (double(n) + 1.)); } + else { m_windowCoefs[k - 1] = double((2. * double(k) - 1.) / double(n)); } + } + + for (size_t k = n / 2 + 1; k <= n; ++k) + { + if (n % 2 == 1) { m_windowCoefs[k - 1] = double(2. - (2. * double(k)) / (double(n) + 1.)); } + else { m_windowCoefs[k - 1] = double(2. - (2. * double(k) - 1.) / double(n)); } + } + } + else if (m_windowMethod == EWindowMethod::SquareRoot) + { + for (size_t k = 1; k <= (n + 1) / 2; ++k) + { + if (n % 2 == 1) { m_windowCoefs[k - 1] = sqrt(2. * double(k) / (double(n) + 1.)); } + else { m_windowCoefs[k - 1] = sqrt((2. * double(k) - 1.) / double(n)); } + } + + for (size_t k = n / 2 + 1; k <= n; ++k) + { + if (n % 2 == 1) { m_windowCoefs[k - 1] = sqrt(2. - (2. * double(k)) / (double(n) + 1.)); } + else { m_windowCoefs[k - 1] = sqrt(2. - (2. * double(k) - 1.) / double(n)); } + } + } + else if (m_windowMethod == EWindowMethod::None) { for (size_t k = 0; k < n; ++k) { m_windowCoefs[k] = 1; } } + else { OV_ERROR_KRF("The windows method chosen is not supported.\n", Kernel::ErrorType::BadSetting); } + + m_encoder.encodeHeader(); + } + + if (m_decoder.isBufferReceived()) + { + /* We filter each channel with the window function */ + for (size_t j = 0; j < matrix->getDimensionSize(0); ++j) // channels + { + for (size_t k = 0; k < matrix->getDimensionSize(1); ++k) // samples + { + matrix->getBuffer()[j * matrix->getDimensionSize(1) + k] *= m_windowCoefs[k]; + } + } + + m_encoder.encodeBuffer(); + } + + if (m_decoder.isEndReceived()) { m_encoder.encodeEnd(); } + + boxContext->markOutputAsReadyToSend(0, startTime, endTime); + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmWindowing.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmWindowing.h new file mode 100644 index 0000000..970caa7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmWindowing.h @@ -0,0 +1,60 @@ +#pragma once + +#include "../ovp_defines.h" +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmWindowing final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_Windowing) + +protected: + Toolkit::TSignalDecoder m_decoder; + Toolkit::TSignalEncoder m_encoder; + + EWindowMethod m_windowMethod = EWindowMethod::None; + std::vector m_windowCoefs; +}; + +class CBoxAlgorithmWindowingDesc final : virtual public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Windowing"); } + CString getAuthorName() const override { return CString("Laurent Bonnet"); } + CString getAuthorCompanyName() const override { return CString("Mensia Technologies SA"); } + CString getShortDescription() const override { return CString("Applies a windowing function to the signal."); } + CString getDetailedDescription() const override { return CString("Applies a windowing function to the signal."); } + CString getCategory() const override { return CString("Signal processing/Temporal Filtering"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CString getStockItemName() const override { return CString("gtk-execute"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Windowing; } + IPluginObject* create() override { return new CBoxAlgorithmWindowing(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addOutput("Output signal", OV_TypeId_Signal); + prototype.addSetting("Window method", OVP_TypeId_WindowMethod, "Hamming"); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_WindowingDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmXDAWNTrainer.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmXDAWNTrainer.cpp new file mode 100755 index 0000000..64b3da7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmXDAWNTrainer.cpp @@ -0,0 +1,282 @@ +#include "ovpCBoxAlgorithmXDAWNTrainer.h" + +#include "fs/Files.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +CBoxAlgorithmXDAWNTrainer::CBoxAlgorithmXDAWNTrainer() {} + +bool CBoxAlgorithmXDAWNTrainer::initialize() +{ + m_trainStimulationID = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_filterFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + OV_ERROR_UNLESS_KRF(m_filterFilename.length() != 0, "The filter filename is empty.\n", Kernel::ErrorType::BadSetting); + + if (FS::Files::fileExists(m_filterFilename)) + { + FILE* file = FS::Files::open(m_filterFilename, "wt"); + + OV_ERROR_UNLESS_KRF(file != nullptr, "The filter file exists but cannot be used.\n", Kernel::ErrorType::BadFileRead); + + fclose(file); + } + + const int filterDimension = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + + OV_ERROR_UNLESS_KRF(filterDimension > 0, "The dimension of the filter must be strictly positive.\n", Kernel::ErrorType::OutOfBound); + + m_filterDim = size_t(filterDimension); + + m_saveAsBoxConfig = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + + + m_stimDecoder.initialize(*this, 0); + m_signalDecoder[0].initialize(*this, 1); + m_signalDecoder[1].initialize(*this, 2); + m_stimEncoder.initialize(*this, 0); + + return true; +} + +bool CBoxAlgorithmXDAWNTrainer::uninitialize() +{ + m_stimDecoder.uninitialize(); + m_signalDecoder[0].uninitialize(); + m_signalDecoder[1].uninitialize(); + m_stimEncoder.uninitialize(); + + return true; +} + +bool CBoxAlgorithmXDAWNTrainer::processInput(const size_t index) +{ + if (index == 0) { this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); } + + return true; +} + +bool CBoxAlgorithmXDAWNTrainer::process() +{ + Kernel::IBoxIO& dynamicBoxContext = this->getDynamicBoxContext(); + + bool train = false; + + for (size_t i = 0; i < dynamicBoxContext.getInputChunkCount(0); ++i) + { + m_stimEncoder.getInputStimulationSet()->clear(); + m_stimDecoder.decode(i); + + if (m_stimDecoder.isHeaderReceived()) { m_stimEncoder.encodeHeader(); } + if (m_stimDecoder.isBufferReceived()) + { + for (size_t j = 0; j < m_stimDecoder.getOutputStimulationSet()->getStimulationCount(); ++j) + { + const uint64_t stimulationId = m_stimDecoder.getOutputStimulationSet()->getStimulationIdentifier(j); + + if (stimulationId == m_trainStimulationID) + { + train = true; + + m_stimEncoder.getInputStimulationSet()->appendStimulation( + OVTK_StimulationId_TrainCompleted, m_stimDecoder.getOutputStimulationSet()->getStimulationDate(j), 0); + } + } + + m_stimEncoder.encodeBuffer(); + } + if (m_stimDecoder.isEndReceived()) { m_stimEncoder.encodeEnd(); } + + dynamicBoxContext.markOutputAsReadyToSend(0, dynamicBoxContext.getInputChunkStartTime(0, i), dynamicBoxContext.getInputChunkEndTime(0, i)); + } + + if (train) + { + std::vector erpSampleIndexes; + std::array X; // X[0] is session matrix, X[1] is averaged ERP + std::array C; // Covariance matrices + std::array n; + size_t nChannel = 0; + + this->getLogManager() << Kernel::LogLevel_Info << "Received train stimulation...\n"; + + // Decodes input signals + + for (size_t j = 0; j < 2; ++j) + { + n[j] = 0; + + for (size_t i = 0; i < dynamicBoxContext.getInputChunkCount(j + 1); ++i) + { + Toolkit::TSignalDecoder& decoder = m_signalDecoder[j]; + decoder.decode(i); + + CMatrix* matrix = decoder.getOutputMatrix(); + nChannel = matrix->getDimensionSize(0); + const size_t nSample = matrix->getDimensionSize(1); + const size_t sampling = size_t(decoder.getOutputSamplingRate()); + + if (decoder.isHeaderReceived()) + { + OV_ERROR_UNLESS_KRF(sampling > 0, "Input sampling frequency is equal to 0. Plugin can not process.\n", Kernel::ErrorType::OutOfBound); + OV_ERROR_UNLESS_KRF(nChannel > 0, "For condition " << j + 1 << " got no channel in signal stream.\n", Kernel::ErrorType::OutOfBound); + OV_ERROR_UNLESS_KRF(nSample > 0, "For condition " << j + 1 << " got no samples in signal stream.\n", Kernel::ErrorType::OutOfBound); + OV_ERROR_UNLESS_KRF(m_filterDim <= nChannel, "The filter dimension must not be superior than the channel count.\n", Kernel::ErrorType::OutOfBound); + + if (!n[0]) // Initialize signal buffer (X[0]) only when receiving input signal header. + { + X[j].resize(nChannel, (dynamicBoxContext.getInputChunkCount(j + 1) - 1) * nSample); + } + else // otherwise, only ERP averaging buffer (X[1]) is reset + { + X[j] = Eigen::MatrixXd::Zero(nChannel, nSample); + } + } + + if (decoder.isBufferReceived()) + { + Eigen::MatrixXd A = Eigen::Map>( + matrix->getBuffer(), nChannel, nSample); + + switch (j) + { + case 0: // Session + X[j].block(0, n[j] * A.cols(), A.rows(), A.cols()) = A; + break; + + case 1: // ERP + X[j] = X[j] + A; // Computes sumed ERP + + // $$$ Assumes continuous session signal starting at date 0 + { + size_t ERPSampleIndex = size_t(((dynamicBoxContext.getInputChunkStartTime(j + 1, i) >> 16) * sampling) >> 16); + erpSampleIndexes.push_back(ERPSampleIndex); + } + break; + + default: + break; + } + + n[j]++; + } + +#if 0 + if (decoder.isEndReceived()) + { + } +#endif + } + + OV_ERROR_UNLESS_KRF(n[j] != 0, "Did not have input signal for condition " << j + 1 << "\n", Kernel::ErrorType::BadValue); + + switch (j) + { + case 0: // Session + break; + + case 1: // ERP + X[j] = X[j] / double(n[j]); // Averages ERP + break; + + default: + break; + } + } + + // We need equal number of channels + OV_ERROR_UNLESS_KRF(X[0].rows() == X[1].rows(), + "Dimension mismatch, first input had " << size_t(X[0].rows()) << " channels while second input had " << size_t(X[1].rows()) << + " channels\n", + Kernel::ErrorType::BadValue); + + // Grabs usefull values + + const size_t sampleCountSession = X[0].cols(); + const size_t sampleCountERP = X[1].cols(); + + // Now we compute matrix D + + const Eigen::MatrixXd DI = Eigen::MatrixXd::Identity(sampleCountERP, sampleCountERP); + Eigen::MatrixXd D = Eigen::MatrixXd::Zero(sampleCountERP, sampleCountSession); + + for (size_t sampleIndex : erpSampleIndexes) { D.block(0, sampleIndex, sampleCountERP, sampleCountERP) += DI; } + + // Computes covariance matrices + + C[0] = X[0] * X[0].transpose(); + C[1] = /*Y * Y.transpose();*/ X[1] * /* D.transpose() * */ (D * D.transpose()).fullPivLu().inverse() /* * D */ * X[1].transpose(); + + // Solves generalized eigen decomposition + + const Eigen::GeneralizedSelfAdjointEigenSolver eigenSolver(C[0].selfadjointView(), C[1].selfadjointView()); + + if (eigenSolver.info() != Eigen::Success) + { + const enum Eigen::ComputationInfo error = eigenSolver.info(); + const char* errorMessage = "unknown"; + + switch (error) + { + case Eigen::NumericalIssue: errorMessage = "Numerical issue"; + break; + case Eigen::NoConvergence: errorMessage = "No convergence"; + break; + // case Eigen::InvalidInput: errorMessage="Invalid input"; break; // FIXME + default: break; + } + + OV_ERROR_KRF("Could not solve generalized eigen decomposition, got error[" << CString(errorMessage) << "]\n", + Kernel::ErrorType::BadProcessing); + } + + // Create a CMatrix mapper that can spool the filters to a file + + CMatrix eigenVectors; + eigenVectors.resize(m_filterDim, nChannel); + + Eigen::Map vectorsMapper(eigenVectors.getBuffer(), m_filterDim, nChannel); + + vectorsMapper.block(0, 0, m_filterDim, nChannel) = eigenSolver.eigenvectors().block(0, 0, nChannel, m_filterDim).transpose(); + + // Saves filters + + FILE* file = FS::Files::open(m_filterFilename.toASCIIString(), "wt"); + + OV_ERROR_UNLESS_KRF(file != nullptr, "Could not open file [" << m_filterFilename << "] for writing.\n", Kernel::ErrorType::BadFileWrite); + + if (m_saveAsBoxConfig) + { + fprintf(file, "\n"); + fprintf(file, "\t"); + + for (size_t i = 0; i < eigenVectors.getBufferElementCount(); ++i) { fprintf(file, "%e ", eigenVectors.getBuffer()[i]); } + + fprintf(file, "\n"); + fprintf(file, "\t%zu\n", m_filterDim); + fprintf(file, "\t%zu\n", nChannel); + fprintf(file, "\t\n"); + fprintf(file, ""); + } + else + { + OV_ERROR_UNLESS_KRF(Toolkit::Matrix::saveToTextFile(eigenVectors, m_filterFilename), + "Unable to save to [" << m_filterFilename << "]\n", Kernel::ErrorType::BadFileWrite); + } + + OV_WARNING_UNLESS_K(fclose(file) == 0, "Could not close file[" << m_filterFilename << "].\n"); + + this->getLogManager() << Kernel::LogLevel_Info << "Training finished and saved to [" << m_filterFilename << "]!\n"; + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmXDAWNTrainer.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmXDAWNTrainer.h new file mode 100755 index 0000000..9fd49ff --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmXDAWNTrainer.h @@ -0,0 +1,82 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include +#include + +typedef Eigen::Matrix MatrixXdRowMajor; + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmXDAWNTrainer final : public Toolkit::TBoxAlgorithm +{ +public: + CBoxAlgorithmXDAWNTrainer(); + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_InriaXDAWNTrainer) + +protected: + + Toolkit::TStimulationDecoder m_stimDecoder; + std::array, 2> m_signalDecoder; + Toolkit::TStimulationEncoder m_stimEncoder; + + uint64_t m_trainStimulationID = 0; + CString m_filterFilename; + size_t m_filterDim = 0; + bool m_saveAsBoxConfig = false; +}; + +class CBoxAlgorithmXDAWNTrainerDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override {} + CString getName() const override { return CString("xDAWN Trainer"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("Mensia Technologies SA"); } + + CString getShortDescription() const override { return CString("Trains spatial filters that best highlight Evoked Response Potentials (ERP) such as P300"); } + + CString getDetailedDescription() const override + { + return CString("Trains spatial filters that best highlight Evoked Response Potentials (ERP) such as P300"); + } + + CString getCategory() const override { return CString("Signal processing/Spatial Filtering"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CString getStockItemName() const override { return CString("gtk-zoom-100"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_InriaXDAWNTrainer; } + IPluginObject* create() override { return new CBoxAlgorithmXDAWNTrainer; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Stimulations", OV_TypeId_Stimulations); + prototype.addInput("Session signal", OV_TypeId_Signal); + prototype.addInput("Evoked potential epochs", OV_TypeId_Signal); + + prototype.addOutput("Train-completed Flag", OV_TypeId_Stimulations); + + prototype.addSetting("Train stimulation", OV_TypeId_Stimulation, "OVTK_StimulationId_Train"); + prototype.addSetting("Spatial filter configuration", OV_TypeId_Filename, ""); + prototype.addSetting("Filter dimension", OV_TypeId_Integer, "4"); + prototype.addSetting("Save as box config", OV_TypeId_Boolean, "true"); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_InriaXDAWNTrainerDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/resampling/ovpCBoxAlgorithmSignalResampling.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/resampling/ovpCBoxAlgorithmSignalResampling.cpp new file mode 100644 index 0000000..a68ad59 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/resampling/ovpCBoxAlgorithmSignalResampling.cpp @@ -0,0 +1,187 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE SDK + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include "ovpCBoxAlgorithmSignalResampling.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +namespace SigProSTD { +template ::value>::type* = nullptr, + typename std::enable_if::value>::type* = nullptr> +T gcd(T a, T b) +{ + T t; + + if (a > b) // ensure b > a + { + t = b; + b = a; + a = t; + } + + while (b != 0) + { + t = a % b; + a = b; + b = t; + } + + return a; +} +} // namespace SigProSTD + +bool CBoxAlgorithmSignalResampling::initialize() +{ + m_decoder.initialize(*this, 0); + m_encoder.initialize(*this, 0); + + const int64_t oSampling = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), OVP_ClassId_BoxAlgorithm_SignalResampling_SettingId_NewSampling); + const int64_t nOutSample = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), OVP_ClassId_BoxAlgorithm_SignalResampling_SettingId_SampleCountPerBuffer); + + OV_ERROR_UNLESS_KRF(oSampling > 0, "Invalid output sampling rate [" << oSampling << "] (expected value > 0)", Kernel::ErrorType::BadSetting); + OV_ERROR_UNLESS_KRF(nOutSample > 0, "Invalid sample count per buffer [" << nOutSample << "] (expected value > 0)", Kernel::ErrorType::BadSetting); + + m_oSampling = size_t(oSampling); + m_oNSample = size_t(nOutSample); + + m_nFractionalDelayFilterSample = 6; + m_transitionBandPercent = 45; + m_stopBandAttenuation = 49; + + m_iSampling = 0; + + m_encoder.getInputSamplingRate() = uint64_t(m_oSampling); + + return true; +} + +bool CBoxAlgorithmSignalResampling::uninitialize() +{ + m_decoder.uninitialize(); + m_encoder.uninitialize(); + return true; +} + +bool CBoxAlgorithmSignalResampling::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmSignalResampling::process() +{ + m_boxContext = &this->getDynamicBoxContext(); + + for (size_t i = 0; i < m_boxContext->getInputChunkCount(0); ++i) + { + m_decoder.decode(i); + + CMatrix* iMatrix = m_decoder.getOutputMatrix(); + CMatrix* oMatrix = m_encoder.getInputMatrix(); + + const size_t nChannel = iMatrix->getDimensionSize(0); + const size_t nSample = iMatrix->getDimensionSize(1); + + if (m_decoder.isHeaderReceived()) + { + m_iSampling = size_t(m_decoder.getOutputSamplingRate()); + + OV_ERROR_UNLESS_KRF(m_iSampling > 0, "Invalid input sampling rate [" << m_iSampling << "] (expected value > 0)", Kernel::ErrorType::BadInput); + + this->getLogManager() << Kernel::LogLevel_Info << "Resampling from [" << m_iSampling << "] Hz to [" << m_oSampling << "] Hz.\n"; + + double src = 1.0 * m_oSampling / m_iSampling; + const size_t gcd = size_t(SigProSTD::gcd(m_iSampling, m_oSampling)); + size_t factorUpsampling = m_oSampling / gcd; + size_t factorDownsampling = m_iSampling / gcd; + if (src <= 0.5 || src > 1.0) + { + this->getLogManager() << Kernel::LogLevel_Info << "Sampling rate conversion [" << src << "] : upsampling by a factor of [" << factorUpsampling + << "], low-pass filtering, and downsampling by a factor of [" << factorDownsampling << "].\n"; + } + else + { + OV_WARNING_K("Sampling rate conversion [" << src << "] : upsampling by a factor of [" << factorUpsampling + << "], low-pass filtering, and downsampling by a factor of [" << factorDownsampling << "]"); + } + + m_resampler.setFractionalDelayFilterSampleCount(m_nFractionalDelayFilterSample); + m_resampler.setTransitionBand(m_transitionBandPercent); + m_resampler.setStopBandAttenuation(m_stopBandAttenuation); + m_resampler.reset(nChannel, m_iSampling, m_oSampling); + + double builtInLatency = m_resampler.getBuiltInLatency(); + if (builtInLatency <= 0.15) { this->getLogManager() << Kernel::LogLevel_Trace << "Latency induced by the resampling is [" << builtInLatency << "] s.\n"; } + else if (0.15 < builtInLatency && builtInLatency <= 0.5) + { + this->getLogManager() << Kernel::LogLevel_Info << "Latency induced by the resampling is [" << builtInLatency << "] s.\n"; + } + else if (0.5 < builtInLatency) { OV_WARNING_K("Latency induced by the resampling is [" << builtInLatency << "] s."); } + + oMatrix->copyDescription(*iMatrix); + oMatrix->setDimensionSize(1, m_oNSample); + + m_oTotalSample = 0; + + m_encoder.encodeHeader(); + m_boxContext->markOutputAsReadyToSend(0, 0, 0); + } + if (m_decoder.isBufferReceived()) + { + // re-sampling sample-wise via a callback + m_resampler.resample(*this, iMatrix->getBuffer(), nSample); + //this->getLogManager() << Kernel::LogLevel_Info << "count = " << count << ".\n"; + // encoding made in the callback (see next function) + } + if (m_decoder.isEndReceived()) + { + m_encoder.encodeEnd(); + m_boxContext->markOutputAsReadyToSend(0, (uint64_t((m_oTotalSample % m_oNSample) << 32) / m_oSampling), + (uint64_t((m_oTotalSample % m_oNSample) << 32) / m_oSampling)); + } + } + + return true; +} + +void CBoxAlgorithmSignalResampling::processResampler(const double* sample, const size_t nChannel) const +{ + double* buffer = m_encoder.getInputMatrix()->getBuffer(); + const uint64_t oSampleIdx = m_oTotalSample % m_oNSample; + + for (size_t j = 0; j < nChannel; ++j) { buffer[j * m_oNSample + oSampleIdx] = sample[j]; } + m_oTotalSample++; + + if ((m_oTotalSample % m_oNSample) == 0) + { + m_encoder.encodeBuffer(); + m_boxContext->markOutputAsReadyToSend(0, (uint64_t((m_oTotalSample - m_oNSample) << 32) / m_oSampling), + (uint64_t((m_oTotalSample) << 32) / m_oSampling)); + } +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/resampling/ovpCBoxAlgorithmSignalResampling.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/resampling/ovpCBoxAlgorithmSignalResampling.h new file mode 100644 index 0000000..0787767 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/resampling/ovpCBoxAlgorithmSignalResampling.h @@ -0,0 +1,113 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE SDK + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#pragma once + +#include "../../ovp_defines.h" +#include +#include +#include "ovCResampler.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +typedef Common::Resampler::CResamplerSd CResampler; + +class CBoxAlgorithmSignalResampling final : public Toolkit::TBoxAlgorithm, CResampler::ICallback +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + // implementation for TResampler::ICallback + void processResampler(const double* sample, const size_t nChannel) const override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_SignalResampling) + +protected: + + Toolkit::TSignalDecoder m_decoder; + mutable Toolkit::TSignalEncoder m_encoder; + + size_t m_oSampling = 0; + size_t m_oNSample = 0; + + int m_nFractionalDelayFilterSample = 0; + double m_transitionBandPercent = 0; + double m_stopBandAttenuation = 0; + + size_t m_iSampling = 0; + mutable uint64_t m_oTotalSample = 0; + CResampler m_resampler; + Kernel::IBoxIO* m_boxContext = nullptr; +}; + +class CBoxAlgorithmSignalResamplingDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Signal Resampling"); } + CString getAuthorName() const override { return CString("Quentin Barthelemy"); } + CString getAuthorCompanyName() const override { return CString("Mensia Technologies SA"); } + + CString getShortDescription() const override { return CString("Resamples and re-epochs input signal to chosen sampling frequency"); } + + CString getDetailedDescription() const override + { + return CString("The input signal is resampled, down-sampled or up-sampled, at a chosen sampling frequency and then re-epoched."); + } + + CString getCategory() const override { return CString("Signal processing/Temporal Filtering"); } + CString getVersion() const override { return CString("2.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_SignalResampling; } + IPluginObject* create() override { return new CBoxAlgorithmSignalResampling; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + prototype.addOutput("Output signal", OV_TypeId_Signal); + prototype.addSetting("New Sampling Frequency", OV_TypeId_Integer, "128", false, + OVP_ClassId_BoxAlgorithm_SignalResampling_SettingId_NewSampling); + prototype.addSetting("Sample Count Per Buffer", OV_TypeId_Integer, "8", false, + OVP_ClassId_BoxAlgorithm_SignalResampling_SettingId_SampleCountPerBuffer); + prototype.addSetting("Low Pass Filter Signal Before Downsampling", OV_TypeId_Boolean, "true", false, + OVP_ClassId_BoxAlgorithm_SignalResampling_SettingId_LowPassFilterSignalFlag); // displayed for backward compatibility, but never used + + //prototype.addSetting("New Sampling Frequency",OV_TypeId_Integer,"128"); + //prototype.addSetting("Sample Count Per Buffer",OV_TypeId_Integer,"8"); + //prototype.addSetting("Low Pass Filter Signal Before Downsampling", OV_TypeId_Boolean, "true"); // displayed for backward compatibility, but never used + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_SignalResamplingDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmContinuousWaveletAnalysis.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmContinuousWaveletAnalysis.cpp new file mode 100644 index 0000000..bb46066 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmContinuousWaveletAnalysis.cpp @@ -0,0 +1,256 @@ +#define _USE_MATH_DEFINES +#include + +#include "ovpCBoxAlgorithmContinuousWaveletAnalysis.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +namespace SigProSTD { +double WaveletFourierFactor(const char* type, const double param) +{ + double factor = -1; + if (strcmp(type, "morlet") == 0) { factor = 4.0 * M_PI / (param + std::sqrt(2 + param * param)); } + else if (strcmp(type, "paul") == 0) { factor = 4.0 * M_PI / (2 * param + 1); } + else if (strcmp(type, "dog") == 0) { factor = 2.0 * M_PI / std::sqrt(param + 0.5); } + return factor; +} + +double WaveletScale2Period(const char* type, const double param, const double scale) { return WaveletFourierFactor(type, param) * scale; } +double WaveletScale2Freq(const char* type, const double param, const double scale) { return 1.0 / (WaveletFourierFactor(type, param) * scale); } +double WaveletFreq2Scale(const char* type, const double param, const double frequency) { return 1.0 / (WaveletFourierFactor(type, param) * frequency); } +} // namespace SigProSTD + +bool CBoxAlgorithmContinuousWaveletAnalysis::initialize() +{ + m_decoder.initialize(*this, 0); + for (size_t i = 0; i < 4; ++i) { m_encoders[i].initialize(*this, i); } + + const EContinuousWaveletType type = EContinuousWaveletType(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0))); + m_waveletParam = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_nScaleJ = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + m_highestFreq = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + const double frequencySpacing = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + + if (type == EContinuousWaveletType::Morlet) + { + m_waveletType = "morlet"; + + if (m_waveletParam < 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Morlet wavelet parameter should be positive.\n"; + return false; + } + } + else if (type == EContinuousWaveletType::Paul) + { + m_waveletType = "paul"; + + if (m_waveletParam <= 0 || m_waveletParam > 20) + { + this->getLogManager() << Kernel::LogLevel_Error << "Paul wavelet parameter should be included in ]0,20].\n"; + return false; + } + if (std::ceil(m_waveletParam) != m_waveletParam) + { + this->getLogManager() << Kernel::LogLevel_Error << "Paul wavelet parameter should be an integer.\n"; + return false; + } + } + else if (type == EContinuousWaveletType::DOG) + { + m_waveletType = "dog"; + + if (m_waveletParam <= 0 || size_t(m_waveletParam) % 2 == 1) + { + this->getLogManager() << Kernel::LogLevel_Error << "Derivative of Gaussian wavelet parameter should be strictly positive and even.\n"; + return false; + } + if (std::ceil(m_waveletParam) != m_waveletParam) + { + this->getLogManager() << Kernel::LogLevel_Error << "Derivative of Gaussian wavelet parameter should be an integer.\n"; + return false; + } + } + else + { + this->getLogManager() << Kernel::LogLevel_Error << "Unknown wavelet type.\n"; + return false; + } + + if (m_nScaleJ <= 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Number of frequencies can not be negative.\n"; + return false; + } + if (m_highestFreq <= 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Highest frequency can not be negative.\n"; + return false; + } + if (frequencySpacing <= 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Frequency spacing can not be negative.\n"; + return false; + } + + m_smallestScaleS0 = SigProSTD::WaveletFreq2Scale(m_waveletType, m_waveletParam, m_highestFreq); + m_scaleSpacingDj = SigProSTD::WaveletFreq2Scale(m_waveletType, m_waveletParam, frequencySpacing); + + m_scaleType = "pow"; + m_scalePowerBaseA0 = 2; // base of power if ScaleType = "pow" + + return true; +} + +bool CBoxAlgorithmContinuousWaveletAnalysis::uninitialize() +{ + m_decoder.uninitialize(); + for (auto& e : m_encoders) { e.uninitialize(); } + + cwt_free(m_waveletTransform); + m_waveletTransform = nullptr; + + return true; +} + +bool CBoxAlgorithmContinuousWaveletAnalysis::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +/*The following algorithm is taken from: +Wavelib library, https://github.com/rafat/wavelib + +A Practical Guide to Wavelet Analysis, 1998 +C Torrence, and GP Compo*/ + +bool CBoxAlgorithmContinuousWaveletAnalysis::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + m_decoder.decode(i); + CMatrix* iMatrix = m_decoder.getOutputMatrix(); + size_t nChannel = iMatrix->getDimensionSize(0); + size_t nSample = iMatrix->getDimensionSize(1); + + if (m_decoder.isHeaderReceived()) + { + size_t sampling = m_decoder.getOutputSamplingRate(); + this->getLogManager() << Kernel::LogLevel_Trace << "Input signal is [" << nChannel << " x " << nSample << "] @ " << sampling << "Hz.\n"; + if (sampling == 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Input sampling frequency is equal to 0. Plugin can not process.\n"; + return false; + } + m_samplingPeriodDt = 1.0 / sampling; + + if (m_highestFreq > 0.5 * sampling) + { + this->getLogManager() << Kernel::LogLevel_Error << "Highest frequency (" << m_highestFreq << + " Hz) is above Nyquist criterion (sampling rate is " + << sampling << " Hz), can not proceed!\n"; + return false; + } + + const int nScaleLimit = int(std::log2(nSample * m_samplingPeriodDt / m_smallestScaleS0) / m_scaleSpacingDj); // Eq.(10) + if (int(m_nScaleJ) > nScaleLimit) + { + this->getLogManager() << Kernel::LogLevel_Error << "Frequency count [" << m_nScaleJ << "] is superior to the limit [" << nScaleLimit << "].\n"; + return false; + } + + // initialize CWT + m_waveletTransform = cwt_init(const_cast(m_waveletType), m_waveletParam, int(nSample), m_samplingPeriodDt, int(m_nScaleJ)); + if (!m_waveletTransform) + { + this->getLogManager() << Kernel::LogLevel_Error << "Error during CWT initialization.\n"; + return false; + } + + // define scales of CWT + if (setCWTScales(m_waveletTransform, m_smallestScaleS0, m_scaleSpacingDj, const_cast(m_scaleType), m_scalePowerBaseA0) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Error during CWT scales definition.\n"; + return false; + } + //cwt_summary(m_waveletTransform); // FOR DEBUG + + for (size_t j = 0; j < 4; ++j) + { + CMatrix* oMatrix = m_encoders[j].getInputMatrix(); + oMatrix->resize({ nChannel, m_nScaleJ, nSample }); + + for (size_t c = 0; c < nChannel; ++c) { oMatrix->setDimensionLabel(0, c, iMatrix->getDimensionLabel(0, c)); } + for (size_t scaleIndex = 0; scaleIndex < m_nScaleJ; ++scaleIndex) + { + const double scaleValue = m_waveletTransform->scale[scaleIndex]; + const double frequencyValue = SigProSTD::WaveletScale2Freq(m_waveletType, m_waveletParam, scaleValue); + + std::string frequencyString = std::to_string(frequencyValue); + oMatrix->setDimensionLabel(1, scaleIndex, frequencyString.c_str()); + } + for (size_t sampleIdx = 0; sampleIdx < nSample; ++sampleIdx) + { + std::string sampleString = std::to_string(sampleIdx * m_samplingPeriodDt); + oMatrix->setDimensionLabel(2, sampleIdx, sampleString.c_str()); + } + m_encoders[j].encodeHeader(); + } + } + if (m_decoder.isBufferReceived()) + { + double* ibuffer = iMatrix->getBuffer(); + double* oAmplitudeBuffer = m_encoders[0].getInputMatrix()->getBuffer(); + double* oPhaseBuffer = m_encoders[1].getInputMatrix()->getBuffer(); + double* oRealPartBuffer = m_encoders[2].getInputMatrix()->getBuffer(); + double* oImagPartBuffer = m_encoders[3].getInputMatrix()->getBuffer(); + + for (size_t c = 0; c < nChannel; ++c) + { + // compute CWT + if (cwt(m_waveletTransform, ibuffer) != 0) + { + this->getLogManager() << Kernel::LogLevel_Error << "Error during CWT computation.\n"; + return false; + } + + // format of m_waveletTransform->output: dimensions = m_nScaleJ * nSample, stored in row major format + for (size_t scaleIdx = 0; scaleIdx < m_nScaleJ; ++scaleIdx) + { + for (size_t sampleIdx = 0; sampleIdx < nSample; ++sampleIdx) + { + const double real = m_waveletTransform->output[sampleIdx + scaleIdx * nSample].re; + const double imag = m_waveletTransform->output[sampleIdx + scaleIdx * nSample].im; + const size_t outputIdx = sampleIdx + (m_nScaleJ - scaleIdx - 1) * nSample + c * nSample * m_nScaleJ; // t+f*T+c*T*F + + oAmplitudeBuffer[outputIdx] = std::sqrt(real * real + imag * imag); + oPhaseBuffer[outputIdx] = std::atan2(imag, real); + oRealPartBuffer[outputIdx] = real; + oImagPartBuffer[outputIdx] = imag; + } + } + ibuffer += nSample; + } + + for (auto& e : m_encoders) { e.encodeBuffer(); } + } + if (m_decoder.isEndReceived()) { for (auto& e : m_encoders) { e.encodeEnd(); } } + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + boxContext.markOutputAsReadyToSend(1, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + boxContext.markOutputAsReadyToSend(2, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + boxContext.markOutputAsReadyToSend(3, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmContinuousWaveletAnalysis.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmContinuousWaveletAnalysis.h new file mode 100644 index 0000000..a2247f5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmContinuousWaveletAnalysis.h @@ -0,0 +1,82 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmContinuousWaveletAnalysis final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_ContinuousWaveletAnalysis) + +protected: + + Toolkit::TSignalDecoder m_decoder; + std::array, 4> m_encoders; + + const char* m_waveletType = nullptr; + double m_waveletParam = 0; + size_t m_nScaleJ = 0; + double m_highestFreq = 0; + double m_smallestScaleS0 = 0; + double m_scaleSpacingDj = 0; + + const char* m_scaleType = nullptr; + int m_scalePowerBaseA0 = 0; + double m_samplingPeriodDt = 0; + cwt_object m_waveletTransform = nullptr; +}; + +class CBoxAlgorithmContinuousWaveletAnalysisDesc final : virtual public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Continuous Wavelet Analysis"); } + CString getAuthorName() const override { return CString("Quentin Barthelemy"); } + CString getAuthorCompanyName() const override { return CString("Mensia Technologies SA"); } + CString getShortDescription() const override { return CString("Performs a Time-Frequency Analysis using CWT."); } + + CString getDetailedDescription() const override { return CString("Performs a Time-Frequency Analysis using Continuous Wavelet Transform."); } + + CString getCategory() const override { return CString("Signal processing/Spectral Analysis"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("1.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("1.0.0"); } + CString getStockItemName() const override { return CString("gtk-execute"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_ContinuousWaveletAnalysis; } + IPluginObject* create() override { return new CBoxAlgorithmContinuousWaveletAnalysis(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + + prototype.addOutput("Amplitude", OV_TypeId_TimeFrequency); + prototype.addOutput("Phase", OV_TypeId_TimeFrequency); + prototype.addOutput("Real Part", OV_TypeId_TimeFrequency); + prototype.addOutput("Imaginary Part", OV_TypeId_TimeFrequency); + + prototype.addSetting("Wavelet type", OVP_TypeId_ContinuousWaveletType, "Morlet wavelet"); + prototype.addSetting("Wavelet parameter", OV_TypeId_Float, "4"); + prototype.addSetting("Number of frequencies", OV_TypeId_Integer, "60"); + prototype.addSetting("Highest frequency", OV_TypeId_Float, "35"); + prototype.addSetting("Frequency spacing", OV_TypeId_Float, "12.5"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_ContinuousWaveletAnalysisDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmFrequencyBandSelector.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmFrequencyBandSelector.cpp new file mode 100755 index 0000000..6366f13 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmFrequencyBandSelector.cpp @@ -0,0 +1,169 @@ +#include "ovpCBoxAlgorithmFrequencyBandSelector.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +#include +#include + +namespace { +std::vector split(const std::string& str, const char c) +{ + std::vector result; + size_t i = 0; + while (i < str.length()) + { + size_t j = i; + while (j < str.length() && str[j] != c) { j++; } + if (i != j) { result.push_back(std::string(str, i, j - i)); } + i = j + 1; + } + return result; +} +} // namespace + +bool CBoxAlgorithmFrequencyBandSelector::initialize() +{ + const CString settingValue = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + std::vector setting = split(settingValue.toASCIIString(), OV_Value_EnumeratedStringSeparator); + bool hadError = false; + CString errorMsg; + m_selecteds.clear(); + for (auto it = setting.begin(); it != setting.end(); ++it) + { + bool good = true; + std::vector settingRange = split(*it, OV_Value_RangeStringSeparator); + if (settingRange.size() == 1) + { + try + { + double value = std::stod(settingRange[0]); + m_selecteds.push_back(std::pair(value, value)); + } + catch (const std::exception&) { good = false; } + } + else if (settingRange.size() == 2) + { + try + { + double low = std::stod(settingRange[0]); + double high = std::stod(settingRange[1]); + m_selecteds.push_back(std::pair(std::min(low, high), std::max(low, high))); + } + catch (const std::exception&) { good = false; } + } + + if (!good) + { + errorMsg = CString("Invalid frequency band [") + it->c_str() + "]"; + hadError = true; + } + } + + m_decoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumDecoder)); + m_decoder->initialize(); + + ip_buffer.initialize(m_decoder->getInputParameter(OVP_GD_Algorithm_SpectrumDecoder_InputParameterId_MemoryBufferToDecode)); + op_matrix.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_Matrix)); + op_bands.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_FrequencyAbscissa)); + + m_encoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumEncoder)); + m_encoder->initialize(); + + ip_matrix.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_Matrix)); + ip_frequencyAbscissa.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_FrequencyAbscissa)); + op_buffer.initialize(m_encoder->getOutputParameter(OVP_GD_Algorithm_SpectrumEncoder_OutputParameterId_EncodedMemoryBuffer)); + + ip_frequencyAbscissa.setReferenceTarget(op_bands); + m_encoder->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_Sampling) + ->setReferenceTarget(m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_Sampling)); + + ip_matrix = &m_oMatrix; + op_matrix = &m_oMatrix; + + OV_ERROR_UNLESS_KRF(!hadError || !m_selecteds.empty(), errorMsg, Kernel::ErrorType::BadSetting); + + return true; +} + +bool CBoxAlgorithmFrequencyBandSelector::uninitialize() +{ + op_buffer.uninitialize(); + ip_frequencyAbscissa.uninitialize(); + ip_matrix.uninitialize(); + + m_encoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_encoder); + m_encoder = nullptr; + + op_bands.uninitialize(); + op_matrix.uninitialize(); + ip_buffer.uninitialize(); + + m_decoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_decoder); + m_decoder = nullptr; + + return true; +} + +bool CBoxAlgorithmFrequencyBandSelector::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmFrequencyBandSelector::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + ip_buffer = boxContext.getInputChunk(0, i); + op_buffer = boxContext.getOutputChunk(0); + m_decoder->process(); + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SpectrumDecoder_OutputTriggerId_ReceivedHeader)) + { + m_selectionFactors.clear(); + for (size_t j = 0; j < ip_frequencyAbscissa->getDimensionSize(0); ++j) + { + double frequencyAbscissa = ip_frequencyAbscissa->getBuffer()[j]; + const bool selected = std::any_of(m_selecteds.begin(), m_selecteds.end(), [frequencyAbscissa](const BandRange& currentBandRange) + { + return currentBandRange.first <= frequencyAbscissa && frequencyAbscissa <= currentBandRange.second; + }); + m_selectionFactors.push_back(selected ? 1. : 0.); + } + + m_encoder->process(OVP_GD_Algorithm_SpectrumEncoder_InputTriggerId_EncodeHeader); + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SpectrumDecoder_OutputTriggerId_ReceivedBuffer)) + { + size_t offset = 0; + for (size_t j = 0; j < m_oMatrix.getDimensionSize(0); ++j) + { + for (size_t k = 0; k < m_oMatrix.getDimensionSize(1); ++k) + { + m_oMatrix.getBuffer()[offset] = m_selectionFactors[k] * m_oMatrix.getBuffer()[offset]; + offset++; + } + } + + m_encoder->process(OVP_GD_Algorithm_SpectrumEncoder_InputTriggerId_EncodeBuffer); + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SpectrumDecoder_OutputTriggerId_ReceivedEnd)) + { + m_encoder->process(OVP_GD_Algorithm_SpectrumEncoder_InputTriggerId_EncodeEnd); + } + + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + boxContext.markInputAsDeprecated(0, i); + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmFrequencyBandSelector.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmFrequencyBandSelector.h new file mode 100755 index 0000000..0c13572 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmFrequencyBandSelector.h @@ -0,0 +1,81 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +typedef std::pair BandRange; + +class CBoxAlgorithmFrequencyBandSelector final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_FrequencyBandSelector) + +protected: + + Kernel::IAlgorithmProxy* m_decoder = nullptr; + Kernel::TParameterHandler ip_buffer; + Kernel::TParameterHandler op_matrix; + Kernel::TParameterHandler op_bands; + + Kernel::IAlgorithmProxy* m_encoder = nullptr; + Kernel::TParameterHandler ip_matrix; + Kernel::TParameterHandler ip_frequencyAbscissa; + Kernel::TParameterHandler op_buffer; + + CMatrix m_oMatrix; + std::vector m_selecteds; + std::vector m_selectionFactors; +}; + +class CBoxAlgorithmFrequencyBandSelectorDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Frequency Band Selector"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + + CString getShortDescription() const override + { + return CString( + "Preserves some spectrum coefficients and puts the others to zero depending on a list of frequencies / frequency bands to select"); + } + + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Signal processing/Spectral Analysis"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_FrequencyBandSelector; } + IPluginObject* create() override { return new CBoxAlgorithmFrequencyBandSelector; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input spectrum", OV_TypeId_Spectrum); + prototype.addOutput("Output spectrum", OV_TypeId_Spectrum); + prototype.addSetting("Frequencies to select", OV_TypeId_String, "8:12;16:24"); + // @fixme Use OV_Value_RangeStringSeparator / OV_Value_EnumeratedStringSeparator tokens above + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_FrequencyBandSelectorDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectralAnalysis.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectralAnalysis.cpp new file mode 100755 index 0000000..efd7870 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectralAnalysis.cpp @@ -0,0 +1,240 @@ +#include "ovpCBoxAlgorithmSpectralAnalysis.h" + +#include +// additional Eigen module +#include + +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +static double amplitude(const size_t channelIdx, const size_t fftIdx, const Eigen::MatrixXcd& matrix) +{ + return sqrt(matrix(channelIdx, fftIdx).real() * matrix(channelIdx, fftIdx).real() + matrix(channelIdx, fftIdx).imag() * matrix(channelIdx, fftIdx).imag()); +} + +static double phase(const size_t channelIdx, const size_t fftIdx, const Eigen::MatrixXcd& matrix) +{ + return atan2(matrix(channelIdx, fftIdx).imag(), matrix(channelIdx, fftIdx).real()); +} + +static double realPart(const size_t channelIdx, const size_t fftIdx, const Eigen::MatrixXcd& matrix) { return matrix(channelIdx, fftIdx).real(); } + +static double imaginaryPart(const size_t channelIdx, const size_t fftIdx, const Eigen::MatrixXcd& matrix) { return matrix(channelIdx, fftIdx).imag(); } + +bool CBoxAlgorithmSpectralAnalysis::initialize() +{ + m_decoder.initialize(*this, 0); + + m_frequencyAbscissa = new CMatrix(); + + // Amplitude + m_spectrumEncoders.push_back(new Toolkit::TSpectrumEncoder(*this, 0)); + m_isSpectrumEncoderActive.push_back(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)); + + // Phase + m_spectrumEncoders.push_back(new Toolkit::TSpectrumEncoder(*this, 1)); + m_isSpectrumEncoderActive.push_back(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1)); + + //Real Part + m_spectrumEncoders.push_back(new Toolkit::TSpectrumEncoder(*this, 2)); + m_isSpectrumEncoderActive.push_back(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2)); + + // Imaginary part + m_spectrumEncoders.push_back(new Toolkit::TSpectrumEncoder(*this, 3)); + m_isSpectrumEncoderActive.push_back(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3)); + + for (auto& curEncoder : m_spectrumEncoders) + { + curEncoder->getInputFrequencyAbscissa().setReferenceTarget(m_frequencyAbscissa); + curEncoder->getInputSamplingRate().setReferenceTarget(m_decoder.getOutputSamplingRate()); + } + + this->getLogManager() << Kernel::LogLevel_Trace << "Spectral components selected : [ " + << (m_isSpectrumEncoderActive[0] ? CString("AMP ") : "") << (m_isSpectrumEncoderActive[1] ? CString("PHASE ") : "") + << (m_isSpectrumEncoderActive[2] ? CString("REAL ") : "") << (m_isSpectrumEncoderActive[3] ? CString("IMG ") : "") << "]\n"; + + return true; +} + +bool CBoxAlgorithmSpectralAnalysis::uninitialize() +{ + for (size_t i = 0; i < m_spectrumEncoders.size(); ++i) + { + m_spectrumEncoders[i]->uninitialize(); + delete m_spectrumEncoders[i]; + } + + m_spectrumEncoders.clear(); + + m_decoder.uninitialize(); + return true; +} + +bool CBoxAlgorithmSpectralAnalysis::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmSpectralAnalysis::process() +{ + Kernel::IBoxIO* boxContext = getBoxAlgorithmContext()->getDynamicBoxContext(); + + // Process input data + for (size_t i = 0; i < boxContext->getInputChunkCount(0); ++i) + { + const uint64_t startTime = boxContext->getInputChunkStartTime(0, i); + const uint64_t endTime = boxContext->getInputChunkEndTime(0, i); + + m_decoder.decode(i); + CMatrix* matrix = m_decoder.getOutputMatrix(); + + if (m_decoder.isHeaderReceived()) + { + m_nChannel = matrix->getDimensionSize(0); + m_nSample = matrix->getDimensionSize(1); + + OV_ERROR_UNLESS_KRF(m_nSample > 1, "Input sample count lower or equal to 1 is not supported by the box.", Kernel::ErrorType::BadInput); + + m_sampling = size_t(m_decoder.getOutputSamplingRate()); + + OV_ERROR_UNLESS_KRF(m_sampling > 0, "Invalid sampling rate [" << m_sampling << "] (expected value > 0)", Kernel::ErrorType::BadInput); + + // size of the spectrum + m_sizeFFT = m_nSample / 2 + 1; + + // Constructing the frequency band description matrix, same for every possible output (and given through reference target mechanism) + m_frequencyAbscissa->resize(m_sizeFFT); // FFTSize frequency abscissa + + // Frequency values + for (size_t frequencyAbscissaIdx = 0; frequencyAbscissaIdx < m_sizeFFT; ++frequencyAbscissaIdx) + { + m_frequencyAbscissa->getBuffer()[frequencyAbscissaIdx] = frequencyAbscissaIdx * (double(m_sampling) / m_nSample); + } + + // All spectra share the same header structure + for (size_t encoderIdx = 0; encoderIdx < m_spectrumEncoders.size(); ++encoderIdx) + { + // We build the chunk only if the encoder is activated + if (m_isSpectrumEncoderActive[encoderIdx]) + { + // Spectrum matrix + CMatrix* spectrum = m_spectrumEncoders[encoderIdx]->getInputMatrix(); + spectrum->resize(m_nChannel, m_sizeFFT); + + // Spectrum channel names + for (size_t j = 0; j < m_nChannel; ++j) { spectrum->setDimensionLabel(0, j, matrix->getDimensionLabel(0, j)); } + + // We also name the spectrum bands "Abscissa" + for (size_t j = 0; j < m_sizeFFT; ++j) { spectrum->setDimensionLabel(1, j, std::to_string(m_frequencyAbscissa->getBuffer()[j]).c_str()); } + + m_spectrumEncoders[encoderIdx]->encodeHeader(); + boxContext->markOutputAsReadyToSend(encoderIdx, startTime, endTime); + } + } + } + + if (m_decoder.isBufferReceived()) + { + // Compute the FFT + Eigen::FFT eigenFFT; + eigenFFT.SetFlag(eigenFFT.HalfSpectrum); // REAL signal => spectrum with conjugate symmetry + + // This matrix will contain the channels spectra (COMPLEX values, RowMajor for copy into openvibe matrix) + Eigen::MatrixXcd spectra = Eigen::MatrixXcd::Zero(m_nChannel, m_sizeFFT); + + for (size_t j = 0; j < m_nChannel; ++j) + { + Eigen::VectorXd samples = Eigen::VectorXd::Zero(m_nSample); + + for (size_t k = 0; k < m_nSample; ++k) { samples(k) = matrix->getBuffer()[j * m_nSample + k]; } + + Eigen::VectorXcd spectrum; // initialization useless: EigenFFT resizes spectrum in function .fwd() + + // EigenFFT + eigenFFT.fwd(spectrum, samples); + + // return of a mirror spectrum of size 2*m_sizeFFT: so we take only the first m_sizeFFT values + spectra.row(j) = spectrum; + } + + // multiplication by sqrt(2), since half spectrum has been removed + if (m_nSample % 2 == 0) + { + // even case : DC and Nyquist bins are not concerned + spectra.block(0, 1, m_nChannel, m_sizeFFT - 2) *= std::sqrt(2); + } + else + { + // odd case : DC bin is not concerned + spectra.block(0, 1, m_nChannel, m_sizeFFT - 1) *= std::sqrt(2); + } + + for (size_t encoderIdx = 0; encoderIdx < m_spectrumEncoders.size(); ++encoderIdx) + { + // We build the chunk only if the encoder is activated + if (m_isSpectrumEncoderActive[encoderIdx]) + { + std::function processResult; + + switch (encoderIdx) + { + case 0: + processResult = amplitude; + break; + + case 1: + processResult = phase; + break; + + case 2: + processResult = realPart; + break; + + case 3: + processResult = imaginaryPart; + break; + + default: + OV_ERROR_KRF("Invalid decoder output.\n", Kernel::ErrorType::BadProcessing); + } + + CMatrix* spectrum = m_spectrumEncoders[encoderIdx]->getInputMatrix(); + + for (size_t j = 0; j < m_nChannel; ++j) + { + for (size_t k = 0; k < m_sizeFFT; ++k) { spectrum->getBuffer()[j * m_sizeFFT + k] = processResult(j, k, spectra); } + } + + m_spectrumEncoders[encoderIdx]->encodeBuffer(); + boxContext->markOutputAsReadyToSend(encoderIdx, startTime, endTime); + } + } + } + + if (m_decoder.isEndReceived()) + { + for (size_t encoderIdx = 0; encoderIdx < m_spectrumEncoders.size(); ++encoderIdx) + { + // We build the chunk only if the encoder is activated + if (m_isSpectrumEncoderActive[encoderIdx]) + { + m_spectrumEncoders[encoderIdx]->encodeEnd(); + boxContext->markOutputAsReadyToSend(encoderIdx, startTime, endTime); + } + } + } + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectralAnalysis.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectralAnalysis.h new file mode 100755 index 0000000..bba4c63 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectralAnalysis.h @@ -0,0 +1,74 @@ +#pragma once + +#include "../../ovp_defines.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmSpectralAnalysis final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_SpectralAnalysis) + +protected: + Toolkit::TSignalDecoder m_decoder; + + std::vector*> m_spectrumEncoders; + std::vector m_isSpectrumEncoderActive; + + size_t m_nChannel = 0; + size_t m_nSample = 0; + size_t m_sampling = 0; + + size_t m_sizeFFT = 0; + + CMatrix* m_frequencyAbscissa = nullptr; +}; + +class CBoxAlgorithmSpectralAnalysisDesc final : virtual public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Spectral Analysis"); } + CString getAuthorName() const override { return CString("Laurent Bonnet / Quentin Barthelemy"); } + CString getAuthorCompanyName() const override { return CString("Mensia Technologies SA"); } + CString getShortDescription() const override { return CString("Performs a Spectral Analysis using FFT."); } + CString getDetailedDescription() const override { return CString("Performs a Spectral Analysis using FFT."); } + CString getCategory() const override { return CString("Signal processing/Spectral Analysis"); } + CString getVersion() const override { return CString("1.2"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.1.0"); } + CString getStockItemName() const override { return CString("gtk-execute"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_SpectralAnalysis; } + IPluginObject* create() override { return new CBoxAlgorithmSpectralAnalysis(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input signal", OV_TypeId_Signal); + + prototype.addOutput("Amplitude", OV_TypeId_Spectrum); + prototype.addOutput("Phase", OV_TypeId_Spectrum); + prototype.addOutput("Real Part", OV_TypeId_Spectrum); + prototype.addOutput("Imaginary Part", OV_TypeId_Spectrum); + + prototype.addSetting("Amplitude", OV_TypeId_Boolean, "true"); + prototype.addSetting("Phase", OV_TypeId_Boolean, "false"); + prototype.addSetting("Real Part", OV_TypeId_Boolean, "false"); + prototype.addSetting("Imaginary Part", OV_TypeId_Boolean, "false"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_SpectralAnalysisDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectrumAverage.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectrumAverage.cpp new file mode 100644 index 0000000..32783c8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectrumAverage.cpp @@ -0,0 +1,105 @@ +#include "ovpCBoxAlgorithmSpectrumAverage.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmSpectrumAverage::initialize() +{ + m_bZeroCare = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + m_decoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumDecoder)); + m_decoder->initialize(); + + m_encoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder)); + m_encoder->initialize(); + + ip_buffer.initialize(m_decoder->getInputParameter(OVP_GD_Algorithm_SpectrumDecoder_InputParameterId_MemoryBufferToDecode)); + op_matrix.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_Matrix)); + ip_matrix.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)); + op_buffer.initialize(m_encoder->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + + return true; +} + +bool CBoxAlgorithmSpectrumAverage::uninitialize() +{ + ip_matrix.uninitialize(); + op_matrix.uninitialize(); + + if (m_encoder) + { + m_encoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_encoder); + m_encoder = nullptr; + } + + if (m_decoder) + { + m_decoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_decoder); + m_decoder = nullptr; + } + + return true; +} + +bool CBoxAlgorithmSpectrumAverage::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmSpectrumAverage::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + ip_buffer = boxContext.getInputChunk(0, i); + op_buffer = boxContext.getOutputChunk(0); + + m_decoder->process(); + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SpectrumDecoder_OutputTriggerId_ReceivedHeader)) + { + ip_matrix->copyDescription(*op_matrix); + ip_matrix->setDimensionSize(1, 1); + + m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader); + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SpectrumDecoder_OutputTriggerId_ReceivedBuffer)) + { + double* iMatrix = ip_matrix->getBuffer(); + double* oMatrix = op_matrix->getBuffer(); + const size_t nChannel = op_matrix->getDimensionSize(0); + const size_t nBand = op_matrix->getDimensionSize(1); + for (size_t j = 0; j < nChannel; ++j) + { + double mean = 0; + size_t n = 0; + for (size_t k = 0; k < nBand; ++k) + { + mean += *oMatrix; + n += (m_bZeroCare || *oMatrix != 0) ? 1 : 0; + oMatrix++; + } + *iMatrix = (n == 0 ? 0 : mean / n); + iMatrix++; + } + m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer); + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_SpectrumDecoder_OutputTriggerId_ReceivedEnd)) + { + m_encoder->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd); + } + + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + boxContext.markInputAsDeprecated(0, i); + } + + return true; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectrumAverage.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectrumAverage.h new file mode 100644 index 0000000..fda8873 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectrumAverage.h @@ -0,0 +1,73 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +class CBoxAlgorithmSpectrumAverage final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + + // virtual uint64_t getClockFrequency(); + bool initialize() override; + bool uninitialize() override; + // virtual bool processClock(Kernel::CMessageClock& msg); + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_SpectrumAverage) + +protected: + + bool m_bZeroCare = false; + + Kernel::IAlgorithmProxy* m_decoder = nullptr; + Kernel::IAlgorithmProxy* m_encoder = nullptr; + + Kernel::TParameterHandler ip_matrix; + Kernel::TParameterHandler op_matrix; + + Kernel::TParameterHandler ip_buffer; + Kernel::TParameterHandler op_buffer; + + std::vector m_selectedIndices; +}; + +class CBoxAlgorithmSpectrumAverageDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Spectrum Average"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + + CString getShortDescription() const override { return CString("Computes the average of all the frequency band powers for a spectrum"); } + + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Signal processing/Spectral Analysis"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_SpectrumAverage; } + IPluginObject* create() override { return new CBoxAlgorithmSpectrumAverage; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Spectrum", OV_TypeId_Spectrum); + prototype.addOutput("Spectrum average", OV_TypeId_StreamedMatrix); + prototype.addSetting("Considers zeros", OV_TypeId_Boolean, "false"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_SpectrumAverageDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCAbstractTree.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCAbstractTree.cpp new file mode 100644 index 0000000..525a9c1 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCAbstractTree.cpp @@ -0,0 +1,460 @@ +#include "ovpCAbstractTree.h" + +#include +#include +#include + +//#define CABSTRACTTREE_DEBUG + +void CAbstractTree::simplifyTree() +{ + bool change = true; + + //while stability hasn't been reached + while (change) + { + CAbstractTreeNode* node = m_root; + + //tries to simplify the tree. + change = m_root->simplify(node); + + //if the root node has changed + if (node != m_root) + { + //delete the old one + delete m_root; + m_root = node; + } + } +} + +// Dirty hack to avoid GCC 4.3 crash at compilation time +static void ClearChildren(std::vector& children) { for (size_t i = 0; i < children.size(); ++i) { delete children[i]; } } + +CAbstractTreeParentNode::~CAbstractTreeParentNode() +{ + // Dirty hack to avoid GCC 4.3 crash at compilation time + ClearChildren(m_Children); +} + +void CAbstractTreeParentNode::levelOperators() +{ + const size_t nChildren = m_Children.size(); + + std::vector newChildren; + + //for all the node's children + for (size_t i = 0; i < nChildren; ++i) + { + CAbstractTreeNode* child = m_Children[i]; + + //recursively try to level the childs' operators + child->levelOperators(); + + //if the child is a terminal node + if (child->isTerminal()) + { + //add it to the children list + newChildren.push_back(child); + } + else + { + //else it's a parent node + CAbstractTreeParentNode* childParentNode = reinterpret_cast(child); + + //if the child and the current node have the same id + if (m_ID == childParentNode->getOperatorIdentifier()) + { + switch (m_ID) + { + //check if it is the ID of the + or * operators + case OP_ADD: + case OP_MUL: + + //if it is, we can group the child's children with the current node's children + newChildren.insert(newChildren.end(), childParentNode->getChildren().begin(), childParentNode->getChildren().end()); + + //we don't want it to destroy its old children + childParentNode->getChildren().clear(); + + //we no longer need this child + delete childParentNode; + childParentNode = nullptr; + + break; + + default: + //this kind of node isn't an associative one, so keep the child + newChildren.push_back(child); + break; + } + } + else { newChildren.push_back(child); } + } + } + + m_Children = newChildren; + + //for + or * + if (isAssociative()) + { + //if the node is associative/commutative, reorder the children + sort(m_Children.begin(), m_Children.end(), CAbstractTreeNodeOrderingFunction()); + } +} + +bool CAbstractTreeParentNode::simplify(CAbstractTreeNode*& node) +{ + //result boolean, true if a child has changed + bool hasChanged = false; + + //true if a child has changed + bool childrenChanged = true; + + //number of children of this node + const size_t nChildren = m_Children.size(); + + //while the children aren't stable + while (childrenChanged) + { + childrenChanged = false; + + //try to simplify all the children + for (size_t i = 0; i < nChildren; ++i) + { + CAbstractTreeNode* child = m_Children[i]; + childrenChanged = child->simplify(child); + + //if there has been a change, actualize hasChanged + hasChanged |= childrenChanged; + + //if the child has become a new node + if (m_Children[i] != child) + { + //delete the old one and replace it + delete m_Children[i]; + m_Children[i] = child; + } + } + } + + //unary operator + if (nChildren == 1) + { + //if we can already compute the result + if (m_Children[0]->isConstant()) + { + const double value = reinterpret_cast(m_Children[0])->getValue(); + switch (m_ID) + { + case OP_NEG: node = new CAbstractTreeValueNode(-value); + break; + case OP_ABS: node = new CAbstractTreeValueNode(abs(value)); + break; + case OP_ACOS: node = new CAbstractTreeValueNode(acos(value)); + break; + case OP_ASIN: node = new CAbstractTreeValueNode(asin(value)); + break; + case OP_ATAN: node = new CAbstractTreeValueNode(atan(value)); + break; + case OP_CEIL: node = new CAbstractTreeValueNode(ceil(value)); + break; + case OP_COS: node = new CAbstractTreeValueNode(cos(value)); + break; + case OP_EXP: node = new CAbstractTreeValueNode(exp(value)); + break; + case OP_FLOOR: node = new CAbstractTreeValueNode(floor(value)); + break; + case OP_LOG: node = new CAbstractTreeValueNode(log(value)); + break; + case OP_LOG10: node = new CAbstractTreeValueNode(log10(value)); + break; + case OP_RAND: node = new CAbstractTreeValueNode(rand() * value / RAND_MAX); + break; + case OP_SIN: node = new CAbstractTreeValueNode(sin(value)); + break; + case OP_SQRT: node = new CAbstractTreeValueNode(sqrt(value)); + break; + case OP_TAN: node = new CAbstractTreeValueNode(tan(value)); + break; + default: break; + } + hasChanged = true; + } + } + //binary operator not associative + else if (nChildren == 2 && !isAssociative()) + { + //if we can already compute the result + if (m_Children[0]->isConstant() && m_Children[1]->isConstant()) + { + switch (m_ID) + { + case OP_DIV: + { + const double total = reinterpret_cast(m_Children[0])->getValue() + / reinterpret_cast(m_Children[1])->getValue(); + + //delete the old value nodes + delete m_Children[0]; + m_Children[0] = nullptr; + delete m_Children[1]; + m_Children[1] = nullptr; + + node = new CAbstractTreeValueNode(total); + hasChanged = true; + + break; + } + case OP_POW: + { + const double total = pow(reinterpret_cast(m_Children[0])->getValue(), + reinterpret_cast(m_Children[1])->getValue()); + + //delete the old value nodes + delete m_Children[0]; + m_Children[0] = nullptr; + delete m_Children[1]; + m_Children[1] = nullptr; + + node = new CAbstractTreeValueNode(total); + hasChanged = true; + break; + } + default: break; + } + } + + //test special cases (X/1), ..., simplify + else if (m_ID == OP_DIV) + { + if (!m_Children[0]->isConstant() && m_Children[1]->isConstant()) + { + if (reinterpret_cast(m_Children[1])->getValue() == 1) + { + node = m_Children[0]; + m_Children.clear(); + hasChanged = true; + } + } + } + } + //if the node is an associative operation node, there are at least two children and at least two are constants + else if (nChildren >= 2 && isAssociative()) + { + //For commutative nodes + //The order of the children may have changed due to previous child simplification + sort(m_Children.begin(), m_Children.end(), CAbstractTreeNodeOrderingFunction()); + + //the new children if there are changes + std::vector newChildren; + + //iterator on the children + size_t i = 0; + double total = 0; + + switch (m_ID) + { + case OP_ADD: + total = 0; + + //add the values of all the constant children + for (i = 0; i < nChildren && m_Children[i]->isConstant(); ++i) + { + total += reinterpret_cast(m_Children[i])->getValue(); + + //delete the old value nodes + delete m_Children[i]; + m_Children[i] = nullptr; + } + break; + + case OP_MUL: + total = 1; + //multiply the values of all the constant children + for (i = 0; i < nChildren && m_Children[i]->isConstant(); ++i) + { + total *= reinterpret_cast(m_Children[i])->getValue(); + + //delete the old value nodes + delete m_Children[i]; + m_Children[i] = nullptr; + } + break; + default: break; + } + + //if there were only value nodes, we can replace the current parent node by a value node + if (i == nChildren) + { + node = new CAbstractTreeValueNode(total); + hasChanged = true; + // cout< 1) + { + //adds the new result node to the list + newChildren.push_back(new CAbstractTreeValueNode(total)); + + //adds the other remaining children + for (; i < nChildren; ++i) { newChildren.push_back(m_Children[i]); } + //we keep this node, but modify its children + m_Children = newChildren; + + hasChanged = true; + } + else if (i == 1) + { + //nothing changed + if ((total == 0 && m_ID == OP_ADD) || + (total == 1 && m_ID == OP_MUL)) + { + if (nChildren - i == 1) + { + node = m_Children[i]; + m_Children.clear(); + } + else + { + //don't keep the valueNode + //adds the other remaining children + for (; i < nChildren; ++i) { newChildren.push_back(m_Children[i]); } + + //we keep this node, but modify its children + m_Children = newChildren; + } + hasChanged = true; + } + else if (total == 0 && m_ID == OP_MUL) + { + //kill this node and replace it by a 0 node + node = new CAbstractTreeValueNode(0); + hasChanged = true; + } + else + { + //undo changes + m_Children[0] = new CAbstractTreeValueNode(total); + } + } + } + + return hasChanged; +} + +void CAbstractTreeParentNode::useNegationOperator() +{ + const size_t nChildren = m_Children.size(); + + //try to use the negation operator in all the children + for (size_t i = 0; i < nChildren; ++i) + { + CAbstractTreeNode* child = m_Children[i]; + child->useNegationOperator(); + } + + //replace (/ Something -1) by (NEG Something) + if (m_ID == OP_DIV) + { + if (m_Children[1]->isConstant()) + { + if (reinterpret_cast(m_Children[1])->getValue() == -1) + { + m_ID = OP_NEG; + m_Children.pop_back(); + } + } + } + //replace (* -1 ...) by (NEG (* ...)) + else if (m_ID == OP_MUL) + { + if (m_Children[0]->isConstant()) + { + if (reinterpret_cast(m_Children[0])->getValue() == -1) + { + m_ID = OP_NEG; + m_IsAssociative = false; + + //if there were just two children : replace (* -1 Sth) by (NEG Sth) + if (nChildren == 2) + { + m_Children[0] = m_Children[1]; + m_Children.pop_back(); + } + //>2 there were more than two children + else + { + CAbstractTreeParentNode* newOperatorNode = new CAbstractTreeParentNode(OP_MUL, true); + + for (size_t i = 1; i < nChildren; ++i) { newOperatorNode->addChild(m_Children[i]); } + + m_Children.clear(); + m_Children.push_back(newOperatorNode); + } + } + } + } +} + +void CAbstractTree::generateCode(CEquationParser& parser) { m_root->generateCode(parser); } + +void CAbstractTreeParentNode::generateCode(CEquationParser& parser) +{ + const size_t nChildren = m_Children.size(); + parser.push_op(m_ID); + for (size_t i = 0; i < nChildren; ++i) { m_Children[i]->generateCode(parser); } +} + +void CAbstractTreeValueNode::generateCode(CEquationParser& parser) { parser.push_value(m_value); } + +void CAbstractTreeVariableNode::generateCode(CEquationParser& parser) { parser.push_var(m_index); } + +void CAbstractTree::recognizeSpecialTree(uint64_t& treeId, double& parameter) +{ + //default + treeId = OP_USERDEF; + parameter = 0; + + //the root node is a value node or variable node + if (m_root->isTerminal()) + { + //if it is a variable node + if (!m_root->isConstant()) { treeId = OP_NONE; } + return; + } + + CAbstractTreeParentNode* parent = reinterpret_cast(m_root); + + std::vector& children = parent->getChildren(); + const size_t nChildren = children.size(); + const uint64_t nodeId = parent->getOperatorIdentifier(); + + //unary operator/function + if (nChildren == 1) { if (children[0]->isTerminal() && !children[0]->isConstant()) { treeId = nodeId; } } + //binary + else if (nChildren == 2) + { + std::array isVariable; + isVariable[0] = children[0]->isTerminal() && !children[0]->isConstant(); + isVariable[1] = children[1]->isTerminal() && !children[1]->isConstant(); + + //(* X X) + if (nodeId == OP_MUL && isVariable[0] && isVariable[1]) { treeId = OP_X2; } + //pow(X,2) + else if (nodeId == OP_POW && isVariable[0] && children[1]->isConstant()) { treeId = OP_X2; } + //(+ Cst X) or (* Cst X) + else if (parent->isAssociative() && children[0]->isConstant() && isVariable[1]) + { + treeId = nodeId; + parameter = reinterpret_cast(children[0])->getValue(); + } + // (/ X Cst) + else if (nodeId == OP_DIV && isVariable[0] && children[1]->isConstant()) + { + treeId = OP_DIV; + parameter = reinterpret_cast(children[1])->getValue(); + } + } + //else do nothing +} diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCAbstractTree.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCAbstractTree.h new file mode 100644 index 0000000..0cba7d4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCAbstractTree.h @@ -0,0 +1,406 @@ +#pragma once + +#include "../ovp_defines.h" + +#include "ovpCEquationParserGrammar.h" +#include "ovpCEquationParser.h" + +#include +#include + +#include + +#include +#include + +class CEquationParser; + +/** +* Abstract class for an AST tree node +* +*/ +class CAbstractTreeNode +{ +protected: + + //! True if this is a terminal node + bool m_isTerminal = false; + //! True if this node contains a constant value + bool m_isConstant = false; + +public: + + CAbstractTreeNode(const bool bTerminal, const bool bIsConstant) : m_isTerminal(bTerminal), m_isConstant(bIsConstant) { } + + //! virtual destructor + virtual ~CAbstractTreeNode() { } + + /** + * Used to know if this node is a leaf. + * \return True if the node is a leaf. + */ + virtual bool isTerminal() const { return m_isTerminal; } + + /** + * Used to know if this node is a constant value node. + * \return True if the node is a constant value node. + */ + virtual bool isConstant() const { return m_isConstant; } + + //! Prints the node to stdout. + virtual void print(OpenViBE::Kernel::ILogManager& rLogManager) = 0; + + /** + * Used to simplify this node (and its children if any). + * \param pModifiedNode Reference to a pointer to modify if the + * current node object is to be destroyed and replaced. This pointer + * will contain the address of the new node. + */ + virtual bool simplify(CAbstractTreeNode*& pModifiedNode) = 0; + + /** + * Part of the process of simplification. + * Levels recursively the associative operators nodes. + */ + virtual void levelOperators() = 0; + + /** + * Changes the tree so it uses the NEG operator whenever it is possible. + * (ie replaces (* -1 X) by (NEG X) + */ + virtual void useNegationOperator() = 0; + + /** + * Generates the set of function calls needed to do the desired computation. + * \param oParser The parser containing the function pointers stack and function contexts stack. + */ + virtual void generateCode(CEquationParser& oParser) = 0; +}; + +/** +* A tree's parent node (has children). +* +*/ +class CAbstractTreeParentNode : public CAbstractTreeNode +{ +public: + + //! Children of this node + std::vector m_Children; + + //! The node operator's identifier + uint64_t m_ID = 0; + + //! True if the node is "associative" + bool m_IsAssociative = false; + + //Constructors + CAbstractTreeParentNode(const uint64_t nodeId, const bool isAssociative = false) + : CAbstractTreeNode(false, false), m_ID(nodeId), m_IsAssociative(isAssociative) { } + + CAbstractTreeParentNode(const uint64_t nodeId, CAbstractTreeNode* child, const bool isAssociative = false) + : CAbstractTreeNode(false, false), m_ID(nodeId), m_IsAssociative(isAssociative) { m_Children.push_back(child); } + + CAbstractTreeParentNode(const uint64_t nodeId, CAbstractTreeNode* leftChild, CAbstractTreeNode* rightChild, const bool isAssociative = false) + : CAbstractTreeNode(false, false), m_ID(nodeId), m_IsAssociative(isAssociative) + { + m_Children.push_back(leftChild); + m_Children.push_back(rightChild); + } + + CAbstractTreeParentNode(const uint64_t nodeId, CAbstractTreeNode* testChild, CAbstractTreeNode* ifChild, CAbstractTreeNode* thenChild, + const bool isAssociative = false) + : CAbstractTreeNode(false, false), m_ID(nodeId), m_IsAssociative(isAssociative) + { + m_Children.push_back(testChild); + m_Children.push_back(ifChild); + m_Children.push_back(thenChild); + } + + /** + * Returns the node's operator identifier. + * \return The operator identifier + */ + uint64_t getOperatorIdentifier() const { return m_ID; } + + /** + * Used to know if the node is an associative node. + * \return True if the node is an associative one. + */ + bool isAssociative() const { return m_IsAssociative; } + + /** + * Returns the vector of children of the node. + * \return A reference to the vector of children. + */ + virtual std::vector& getChildren() { return m_Children; } + + /** + * Adds a child to this node. + * \param child The child to add. + */ + virtual void addChild(CAbstractTreeNode* child) { m_Children.push_back(child); } + + //! Destructor. + ~CAbstractTreeParentNode() override; + + //! Debug function, prints the node and its children (prefix notation) + void print(OpenViBE::Kernel::ILogManager& logManager) override + { + std::string op; + switch (m_ID) + { + case OP_NEG: op = "-"; + break; + case OP_ADD: op = "+"; + break; + case OP_SUB: op = "-"; + break; + case OP_MUL: op = "*"; + break; + case OP_DIV: op = "/"; + break; + + case OP_ABS: op = "abs"; + break; + case OP_ACOS: op = "cos"; + break; + case OP_ASIN: op = "sin"; + break; + case OP_ATAN: op = "atan"; + break; + case OP_CEIL: op = "ceil"; + break; + case OP_COS: op = "cos"; + break; + case OP_EXP: op = "exp"; + break; + case OP_FLOOR: op = "floor"; + break; + case OP_LOG: op = "log"; + break; + case OP_LOG10: op = "log10"; + break; + case OP_POW: op = "pow"; + break; + case OP_RAND: op = "rand"; + break; + case OP_SIN: op = "sin"; + break; + case OP_SQRT: op = "sqrt"; + break; + case OP_TAN: op = "tan"; + break; + + case OP_IF_THEN_ELSE: op = "?:"; + break; + + case OP_CMP_L: op = "<"; + break; + case OP_CMP_G: op = ">"; + break; + case OP_CMP_LE: op = "<="; + break; + case OP_CMP_GE: op = ">="; + break; + case OP_CMP_E: op = "=="; + break; + case OP_CMP_NE: op = "!="; + break; + + case OP_BOOL_AND: op = "&"; + break; + case OP_BOOL_OR: op = "|"; + break; + case OP_BOOL_NOT: op = "!"; + break; + case OP_BOOL_XOR: op = "^"; + break; + + case OP_USERDEF: op = "UserDefined"; + break; + case OP_NONE: op = "None"; + break; + case OP_X2: op = "X^2"; + break; + + default: op = "UnknownOp"; + break; + } + + logManager << "(" << op << " "; + for (size_t i = 0; i < m_Children.size(); ++i) + { + if (m_Children[i] == nullptr) { } + else { m_Children[i]->print(logManager); } + logManager << " "; + } + logManager << ")"; + } + + bool simplify(CAbstractTreeNode*& node) override; + void levelOperators() override; + void useNegationOperator() override; + void generateCode(CEquationParser& parser) override; +}; + +/** + * Class for terminal nodes containing a single value. + * + */ +class CAbstractTreeValueNode : public CAbstractTreeNode +{ +protected: + + //! Value associated with the node. + double m_value = 0; + +public: + + explicit CAbstractTreeValueNode(const double value) : CAbstractTreeNode(true, true), m_value(value) {} + + //! Destructor + ~CAbstractTreeValueNode() override { } + + /** + * Used to set the value of the node. + * \param value The node's new value. + */ + void setValue(const double value) { m_value = value; } + + /** + * Used to know the value of the node. + * \return The node's value. + */ + double getValue() const { return m_value; } + + void print(OpenViBE::Kernel::ILogManager& logManager) override { logManager << m_value; } + + bool simplify(CAbstractTreeNode*& modifiedNode) override + { + modifiedNode = this; + return false; + } + + void levelOperators() override { } + void useNegationOperator() override { } + void generateCode(CEquationParser& parser) override; +}; + +/** + * Class for terminal nodes referencing a variable. + */ +class CAbstractTreeVariableNode : public CAbstractTreeNode +{ +public: + + explicit CAbstractTreeVariableNode(const size_t index) : CAbstractTreeNode(true, false), m_index(index) { } + + ~CAbstractTreeVariableNode() override { } + + void print(OpenViBE::Kernel::ILogManager& logManager) override + { + char name[2]; + name[0] = char('a' + m_index); + name[1] = 0; + logManager << name; + } + + bool simplify(CAbstractTreeNode*& modifiedNode) override + { + modifiedNode = this; + return false; + } + + void levelOperators() override { } + void useNegationOperator() override { } + void generateCode(CEquationParser& parser) override; + +protected: + + size_t m_index = 0; +}; + +/** +* Main class for the AST. +* Contains the root of the tree. +*/ +class CAbstractTree +{ +protected: + + //! the root of the AST tree. + CAbstractTreeNode* m_root = nullptr; + +public: + + //! Constructor + explicit CAbstractTree(CAbstractTreeNode* root) : m_root(root) { } + + //! Destructor + ~CAbstractTree() { delete m_root; } + + //! Prints the whole tree. + void printTree(OpenViBE::Kernel::ILogManager& logManager) const { m_root->print(logManager); } + + /** + * Used to simplify the tree. + */ + void simplifyTree(); + + /** + * Part of the process of simplification. + * Levels recursively the associative operators nodes. + */ + void levelOperators() const { m_root->levelOperators(); } + + /** + * Changes the tree so it uses the NEG operator whenever it is possible. + * (ie replaces (* -1 X) by (NEG X) + */ + void useNegationOperator() const { m_root->useNegationOperator(); } + + /** + * Generates the set of function calls needed to do the desired computation. + * \param parser The parser containing the function pointers stack and function contexts stack. + */ + void generateCode(CEquationParser& parser); + + /** + * Tries to recognize simple tree structures (X*X, X*Cste, X+Cste,...) + * \param treeId The identifier of the tree (OP_USERDEF for non special tree). + * \param parameter The optional parameter if it is a special tree. + */ + void recognizeSpecialTree(uint64_t& treeId, double& parameter); +}; + +/** +* Functor used to compare two nodes. +* The order is as follow : Constants, Variables, ParentNodes +*/ +struct CAbstractTreeNodeOrderingFunction +{ + bool operator()(CAbstractTreeNode* const & pFirstNode, CAbstractTreeNode* const & pSecondNode) const + { +#if 0 + if( (pFirstNode->isConstant()) || + (pFirstNode->isTerminal() && !pSecondNode->isConstant()) || + (!pFirstNode->isTerminal() && !pSecondNode->isTerminal())) { return true; } + else { return false; } +#else + + // Check isConstant flag + if (pFirstNode->isConstant() && !pSecondNode->isConstant()) { return true; } + if (!pFirstNode->isConstant() && pSecondNode->isConstant()) { return false; } + + // Check isTerminal flag + if (pFirstNode->isTerminal() && !pSecondNode->isTerminal()) { return true; } + if (!pFirstNode->isTerminal() && pSecondNode->isTerminal()) { return false; } + + // At this point, isTerminal and isConstant are the same for both value + // Order is not important any more, we just compare the pointer values + // so to have strict ordering function + return pFirstNode < pSecondNode; +#endif + } +}; diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCEquationParser.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCEquationParser.cpp new file mode 100644 index 0000000..2549661 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCEquationParser.cpp @@ -0,0 +1,420 @@ +#include "ovpCEquationParser.h" + +#include +#include +#include +#include +#include +#include +#include + +#define _EQ_PARSER_DEBUG_LOG_(level, message) m_parentPlugin.getLogManager() << level << message << "\n"; +#define _EQ_PARSER_DEBUG_PRINT_TREE_(level) { m_parentPlugin.getLogManager() << level; m_tree->printTree(m_parentPlugin.getLogManager()); m_parentPlugin.getLogManager() << "\n"; } + +// because std::tolower has multiple signatures, +// it can not be easily used in std::transform +// this workaround is taken from http://www.gcek.net/ref/books/sw/cpp/ticppv2/ +template +static T ToLower(T c) { return std::tolower(c); } + +// BOOST::Ast should be able to remove spaces / tabs etc but +// unfortunately, it seems it does not work correcly in some +// cases so I add this sanitizer function to clear the Simple DSP +// equation before sending it to BOOST::Ast +static std::string FindAndReplace(std::string s, const std::string& f, const std::string& r) +{ + size_t i; + while ((i = s.find(f)) != std::string::npos) { s.replace(i, f.length(), r); } + return s; +} + +std::array CEquationParser::m_functionTable = +{ + &op_neg, &op_add, &op_sub, &op_mul, &op_div, + &op_abs, &op_acos, &op_asin, &op_atan, + &op_ceil, &op_cos, &op_exp, &op_floor, + &op_log, &op_log10, &op_power, &op_rand, &op_sin, + &op_sqrt, &op_tan, + &op_if_then_else, + &op_cmp_lower, + &op_cmp_greater, + &op_cmp_lower_equal, + &op_cmp_greater_equal, + &op_cmp_equal, + &op_cmp_not_equal, + &op_bool_and, + &op_bool_or, + &op_bool_not, + &op_bool_xor, +}; + +CEquationParser::~CEquationParser() +{ + delete[] m_functionListBase; + delete[] m_functionContextListBase; + delete[] m_stack; + delete m_tree; +} + +bool CEquationParser::compileEquation(const char* equation) +{ + // BOOST::Ast should be able to remove spaces / tabs etc but + // unfortunately, it seems it does not work correcly in some + // cases so I add this sanitizer function to clear the Simple DSP + // equation before sending it to BOOST::Ast + std::string str(equation); + str = FindAndReplace(str, " ", ""); + str = FindAndReplace(str, "\t", ""); + str = FindAndReplace(str, "\n", ""); + + //parses the equation + _EQ_PARSER_DEBUG_LOG_(OpenViBE::Kernel::LogLevel_Trace, "Parsing equation [" << str << "]..."); + const boost::spirit::classic::tree_parse_info<> info = ast_parse(str.c_str(), m_grammar >> boost::spirit::classic::end_p, boost::spirit::classic::space_p); + + //If the parsing was successful + if (info.full) + { + //creates the AST + _EQ_PARSER_DEBUG_LOG_(OpenViBE::Kernel::LogLevel_Trace, "Creating abstract tree..."); + createAbstractTree(info); + _EQ_PARSER_DEBUG_PRINT_TREE_(OpenViBE::Kernel::LogLevel_Debug); + +#if 0 + //CONSTANT FOLDING + //levels the associative/commutative operators (+ and *) + _EQ_PARSER_DEBUG_LOG_(OpenViBE::Kernel::LogLevel_Trace, "Leveling tree..."); + m_tree->levelOperators(); + _EQ_PARSER_DEBUG_PRINT_TREE_(OpenViBE::Kernel::LogLevel_Debug); + + //simplifies the AST + _EQ_PARSER_DEBUG_LOG_(OpenViBE::Kernel::LogLevel_Trace, "Simplifying tree..."); + m_tree->simplifyTree(); + _EQ_PARSER_DEBUG_PRINT_TREE_(OpenViBE::Kernel::LogLevel_Debug); + + //tries to replace nodes to use the NEG operator and reduce complexity + _EQ_PARSER_DEBUG_LOG_(OpenViBE::Kernel::LogLevel_Trace, "Generating bytecode..."); + m_tree->useNegationOperator(); + _EQ_PARSER_DEBUG_PRINT_TREE_(OpenViBE::Kernel::LogLevel_Debug); + + //Detects if it is a special tree (updates m_treeCategory and m_treeParameter) + _EQ_PARSER_DEBUG_LOG_(OpenViBE::Kernel::LogLevel_Trace, "Recognizing special tree..."); + m_tree->recognizeSpecialTree(m_treeCategory, m_treeParameter); + _EQ_PARSER_DEBUG_PRINT_TREE_(OpenViBE::Kernel::LogLevel_Debug); + + //Unrecognize special tree + _EQ_PARSER_DEBUG_LOG_("Unrecognizing special tree..."); + m_treeCategory = OP_USERDEF; + _EQ_PARSER_DEBUG_PRINT_TREE_(OpenViBE::Kernel::LogLevel_Debug); +#endif + + //If it is not a special tree, we need to generate some code to reach the result + if (m_treeCategory == OP_USERDEF) + { + //allocates the function stack + m_functionList = new functionPointer[m_functionStackSize]; + m_functionListBase = m_functionList; + + //Allocates the function context stack + m_functionContextList = new UFunctionContext[m_functionContextStackSize]; + m_functionContextListBase = m_functionContextList; + m_stack = new double[m_stackSize]; + + //generates the code + m_tree->generateCode(*this); + + //computes the number of steps to get to the result + m_nOperations = m_functionList - m_functionListBase; + } + + return true; + } + std::string error; + const size_t pos = str.find(info.stop); + if (pos != std::string::npos) + { + for (size_t i = 0; i < pos; ++i) { error += " "; } + error += "^--Here\n"; + } + + OV_ERROR("Failed parsing equation \n[" << equation << "]\n " << error, OpenViBE::Kernel::ErrorType::BadParsing, false, + m_parentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getErrorManager(), + m_parentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager()); +} + +void CEquationParser::createAbstractTree(boost::spirit::classic::tree_parse_info<> oInfo) { m_tree = new CAbstractTree(createNode(oInfo.trees.begin())); } + +CAbstractTreeNode* CEquationParser::createNode(iter_t const& i) const +{ + if (i->value.id() == SEquationGrammar::expressionID) + { + if (*i->value.begin() == '+') + { + return new CAbstractTreeParentNode(OP_ADD, createNode(i->children.begin()), createNode(i->children.begin() + 1), true); + } + //replaces (- X Y) by (+ X (-Y)) (in fact (+ X (* -1 Y)) ) + if (*i->value.begin() == '-') + { + return new CAbstractTreeParentNode(OP_ADD, createNode(i->children.begin()), + new CAbstractTreeParentNode(OP_MUL, new CAbstractTreeValueNode(-1), createNode(i->children.begin() + 1), true), + true); + } + } + else if (i->value.id() == SEquationGrammar::termID) + { + if (*i->value.begin() == '*') + { + return new CAbstractTreeParentNode(OP_MUL, createNode(i->children.begin()), createNode(i->children.begin() + 1), true); + } + if (*i->value.begin() == '/') { return new CAbstractTreeParentNode(OP_DIV, createNode(i->children.begin()), createNode(i->children.begin() + 1)); } + } + else if (i->value.id() == SEquationGrammar::factorID) + { + if (*i->value.begin() == '-') + { + // -X => (* -1 X), useful to simplify the tree later + return new CAbstractTreeParentNode(OP_MUL, new CAbstractTreeValueNode(-1), createNode(i->children.begin()), true); + } + if (*i->value.begin() == '+') { return createNode(i->children.begin()); } + } + else if (i->value.id() == SEquationGrammar::realID) + { + const std::string value(i->value.begin(), i->value.end()); + return new CAbstractTreeValueNode(strtod(value.c_str(), nullptr)); + } + else if (i->value.id() == SEquationGrammar::variableID) + { + size_t idx = 0; + std::string value(i->value.begin(), i->value.end()); + if (value != "x" && value != "X") + { + if (value[0] >= 'a' && value[0] <= 'z') { idx = value[0] - 'a'; } + if (value[0] >= 'A' && value[0] <= 'Z') { idx = value[0] - 'A'; } + } + + if (idx >= m_nVariable) + { + OV_WARNING("Missing input " << idx+1 << " (referenced with variable [" << value << "])", + m_parentPlugin.getBoxAlgorithmContext()->getPlayerContext()->getLogManager()); + return new CAbstractTreeValueNode(0); + } + return new CAbstractTreeVariableNode(idx); + } + else if (i->value.id() == SEquationGrammar::constantID) + { + std::string value(i->value.begin(), i->value.end()); + + //converts the string to lowercase + std::transform(value.begin(), value.end(), value.begin(), ::ToLower); + + //creates a new value node from the value looked up in the constant's symbols table + return new CAbstractTreeValueNode(*find(mathConstant_p, value.c_str())); + } + else if (i->value.id() == SEquationGrammar::functionID) + { + std::string value(i->value.begin(), i->value.end()); + uint64_t* functionID; + + //converts the string to lowercase + std::transform(value.begin(), value.end(), value.begin(), ::ToLower); + + //gets the function's Id from the unary function's symbols table + if ((functionID = find(unaryFunction_p, value.c_str())) != nullptr) + { + return new CAbstractTreeParentNode(*functionID, createNode(i->children.begin()), false); + } + //gets the function's Id from the binary function's symbols table + if ((functionID = find(binaryFunction_p, value.c_str())) != nullptr) + { + return new CAbstractTreeParentNode(*functionID, createNode(i->children.begin()), createNode(i->children.begin() + 1), false); + } + } + else if (i->value.id() == SEquationGrammar::ifthenID) + { + return new CAbstractTreeParentNode(OP_IF_THEN_ELSE, createNode(i->children.begin()), createNode(i->children.begin() + 1), + createNode(i->children.begin() + 2), false); + } + else if (i->value.id() == SEquationGrammar::comparisonID) + { + std::string value(i->value.begin(), i->value.end()); + uint64_t* functionID; + + //converts the string to lowercase + std::transform(value.begin(), value.end(), value.begin(), ::ToLower); + + //gets the function's Id from the comparison function's symbols table + if ((functionID = find(comparison1Function_p, value.c_str())) != nullptr) + { + return new CAbstractTreeParentNode(*functionID, createNode(i->children.begin()), createNode(i->children.begin() + 1), false); + } + //gets the function's Id from the comparison function's symbols table + if ((functionID = find(comparison2Function_p, value.c_str())) != nullptr) + { + return new CAbstractTreeParentNode(*functionID, createNode(i->children.begin()), createNode(i->children.begin() + 1), false); + } + } + else if (i->value.id() == SEquationGrammar::booleanID) + { + std::string value(i->value.begin(), i->value.end()); + uint64_t* functionID; + + //converts the string to lowercase + std::transform(value.begin(), value.end(), value.begin(), ::ToLower); + + //gets the function's Id from the binary boolean function's symbols table + if ((functionID = find(binaryBoolean1Function_p, value.c_str())) != nullptr) + { + return new CAbstractTreeParentNode(*functionID, createNode(i->children.begin()), createNode(i->children.begin() + 1), false); + } + //gets the function's Id from the binary boolean function's symbols table + if ((functionID = find(binaryBoolean2Function_p, value.c_str())) != nullptr) + { + return new CAbstractTreeParentNode(*functionID, createNode(i->children.begin()), createNode(i->children.begin() + 1), false); + } + //gets the function's Id from the binary boolean function's symbols table + if ((functionID = find(binaryBoolean3Function_p, value.c_str())) != nullptr) + { + return new CAbstractTreeParentNode(*functionID, createNode(i->children.begin()), createNode(i->children.begin() + 1), false); + } + //gets the function's Id from the binary boolean function's symbols table + if ((functionID = find(unaryBooleanFunction_p, value.c_str())) != nullptr) + { + return new CAbstractTreeParentNode(*functionID, createNode(i->children.begin()), false); + } + } + + return nullptr; +} + +void CEquationParser::push_value(const double value) +{ + *(m_functionList++) = op_loadVal; + (*(m_functionContextList++)).direct_value = value; +} + +void CEquationParser::push_var(const size_t index) +{ + *(m_functionList++) = op_loadVar; + (*(m_functionContextList++)).indirect_value = &m_variable[index]; +} + +void CEquationParser::push_op(const size_t op) +{ + *(m_functionList++) = m_functionTable[op]; + (*(m_functionContextList++)).indirect_value = nullptr; +} + +// Functions called by our "pseudo - VM" + +void CEquationParser::op_neg(double*& stack, UFunctionContext& /*ctx*/) { *stack = - (*stack); } + +void CEquationParser::op_add(double*& stack, UFunctionContext& /*ctx*/) +{ + stack--; + *(stack) = *(stack + 1) + *(stack); +} + +void CEquationParser::op_sub(double*& stack, UFunctionContext& /*ctx*/) +{ + stack--; + *(stack) = *(stack + 1) - *(stack); +} + +void CEquationParser::op_mul(double*& stack, UFunctionContext& /*ctx*/) +{ + stack--; + *(stack) = *(stack + 1) * *(stack); +} + +void CEquationParser::op_div(double*& stack, UFunctionContext& /*ctx*/) +{ + stack--; + *(stack) = *(stack + 1) / *(stack); +} + +void CEquationParser::op_power(double*& stack, UFunctionContext& /*ctx*/) +{ + stack--; + *stack = pow(*(stack + 1), *(stack)); +} + +void CEquationParser::op_abs(double*& stack, UFunctionContext& /*ctx*/) { *stack = fabs(*(stack)); } +void CEquationParser::op_acos(double*& stack, UFunctionContext& /*ctx*/) { *stack = acos(*(stack)); } +void CEquationParser::op_asin(double*& stack, UFunctionContext& /*ctx*/) { *stack = asin(*(stack)); } +void CEquationParser::op_atan(double*& stack, UFunctionContext& /*ctx*/) { *stack = atan(*(stack)); } +void CEquationParser::op_ceil(double*& stack, UFunctionContext& /*ctx*/) { *stack = ceil(*(stack)); } +void CEquationParser::op_cos(double*& stack, UFunctionContext& /*ctx*/) { *stack = cos(*(stack)); } +void CEquationParser::op_exp(double*& stack, UFunctionContext& /*ctx*/) { *stack = exp(*(stack)); } +void CEquationParser::op_floor(double*& stack, UFunctionContext& /*ctx*/) { *stack = floor(*(stack)); } +void CEquationParser::op_log(double*& stack, UFunctionContext& /*ctx*/) { *stack = log(*(stack)); } +void CEquationParser::op_log10(double*& stack, UFunctionContext& /*ctx*/) { *stack = log10(*(stack)); } +void CEquationParser::op_rand(double*& stack, UFunctionContext& /*ctx*/) { *stack = rand() * *(stack) / RAND_MAX; } +void CEquationParser::op_sin(double*& stack, UFunctionContext& /*ctx*/) { *stack = sin(*(stack)); } +void CEquationParser::op_sqrt(double*& stack, UFunctionContext& /*ctx*/) { *stack = sqrt(*(stack)); } +void CEquationParser::op_tan(double*& stack, UFunctionContext& /*ctx*/) { *stack = tan(*(stack)); } + +void CEquationParser::op_if_then_else(double*& stack, UFunctionContext& /*ctx*/) +{ + stack--; + stack--; + if (*(stack + 2)) { *stack = *(stack + 1); } + // else { *stack = *stack; } +} + +void CEquationParser::op_cmp_lower(double*& stack, UFunctionContext& /*ctx*/) +{ + stack--; + stack[0] = (stack[1] < stack[0] ? 1 : 0); +} + +void CEquationParser::op_cmp_greater(double*& stack, UFunctionContext& /*ctx*/) +{ + stack--; + stack[0] = (stack[1] > stack[0] ? 1 : 0); +} + +void CEquationParser::op_cmp_lower_equal(double*& stack, UFunctionContext& /*ctx*/) +{ + stack--; + stack[0] = (stack[1] <= stack[0] ? 1 : 0); +} + +void CEquationParser::op_cmp_greater_equal(double*& stack, UFunctionContext& /*ctx*/) +{ + stack--; + stack[0] = (stack[1] >= stack[0] ? 1 : 0); +} + +void CEquationParser::op_cmp_equal(double*& stack, UFunctionContext& /*ctx*/) +{ + stack--; + stack[0] = (stack[1] == stack[0] ? 1 : 0); +} + +void CEquationParser::op_cmp_not_equal(double*& stack, UFunctionContext& /*ctx*/) +{ + stack--; + stack[0] = (stack[1] != stack[0] ? 1 : 0); +} + +void CEquationParser::op_bool_and(double*& stack, UFunctionContext& /*ctx*/) +{ + stack--; + stack[0] = (stack[1] != 0 && stack[0] != 0 ? 1 : 0); +} + +void CEquationParser::op_bool_or(double*& stack, UFunctionContext& /*ctx*/) +{ + stack--; + stack[0] = (stack[1] != 0 || stack[0] != 0 ? 1 : 0); +} + +void CEquationParser::op_bool_not(double*& stack, UFunctionContext& /*ctx*/) { stack[0] = stack[0] != 0 ? 0 : 1; } + +void CEquationParser::op_bool_xor(double*& stack, UFunctionContext& /*ctx*/) +{ + stack--; + stack[0] = (stack[1] != stack[0] ? 1 : 0); +} + +void CEquationParser::op_loadVal(double*& stack, UFunctionContext& ctx) { *(++stack) = ctx.direct_value; } +void CEquationParser::op_loadVar(double*& stack, UFunctionContext& ctx) { *(++stack) = **(ctx.indirect_value); } diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCEquationParser.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCEquationParser.h new file mode 100644 index 0000000..5735641 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCEquationParser.h @@ -0,0 +1,196 @@ +#pragma once + +#include "../ovp_defines.h" + +#include "ovpCEquationParserGrammar.h" +#include "ovpCAbstractTree.h" + +#include + +#include + +#include +#include + +typedef char const* iterator_t; +typedef boost::spirit::classic::tree_match parse_tree_match_t; +typedef parse_tree_match_t::tree_iterator iter_t; + +class CAbstractTree; +class CAbstractTreeNode; + +/** +* Used to store the optional parameter of the function used by the pseudo-VM. +* +*/ +union UFunctionContext +{ + double direct_value = 0; //if the parameter if a value (push_val) + double** indirect_value; //if it is a pointer to a value (push_var) +}; + +//! Type of the functions in the function stack generated from the equation. +typedef void (*functionPointer)(double*& stack, UFunctionContext& oContext); + +class CEquationParser +{ +protected: + + //! The AST produced by the parsing of the equation + CAbstractTree* m_tree = nullptr; + + //! Grammar to use + SEquationGrammar m_grammar; + + //! Pointer to the data referenced by X in the equation + double** m_variable = nullptr; + //! Number of accessible variables + size_t m_nVariable = 0; + + //! Size of the "function stack" (where the sucessive function pointers are stored) + const size_t m_functionStackSize = 1024; + //! Pointer to the top of the function stack + functionPointer* m_functionList = nullptr; + //! Pointer to the base of the function stack + functionPointer* m_functionListBase = nullptr; + + //! Size of the "function context stack" (where the sucessive function context are stored) + const size_t m_functionContextStackSize = 1024; + //! Pointer to the top of the function context stack + UFunctionContext* m_functionContextList = nullptr; + //! Pointer to the base of the function context stack + UFunctionContext* m_functionContextListBase = nullptr; + + //! Size of the "local" stack + const size_t m_stackSize = 1024; + //! Pointer to the top of the "local" stack + double* m_stack = nullptr; + + //! Number of pointers/contexts in the function/context stacks (same for both) + size_t m_nOperations = 0; + + //! Table of function pointers + static std::array m_functionTable; + + //! Category of the tree (OP_USERDEF or Special tree) + size_t m_treeCategory = OP_USERDEF; + //! Optional parameter in case of a special tree + double m_treeParameter = 0; + + OpenViBE::Toolkit::TBoxAlgorithm& m_parentPlugin; + +public: + + /** + * Constructor. + * \param plugin + * \param variable Pointer to the data known as X in the equation. + * \param nVariable + */ + CEquationParser(OpenViBE::Toolkit::TBoxAlgorithm& plugin, double** variable, const size_t nVariable) + : m_variable(variable), m_nVariable(nVariable), m_parentPlugin(plugin) {} + + //! Destructor. + ~CEquationParser(); + +#if 0 + void setVariable(double * pVariable){ m_pVariable=pVariable; } +#endif + + /** + * Compiles the given equation, and generates the successive function calls to achieve the + * same result if needed (depends on m_treeCategory). + * \param equation The equation to use. + */ + bool compileEquation(const char* equation); + + void push_value(double value); + void push_var(size_t index); + void push_op(size_t op); + + /** + * Returns the tree's category. + * \return The tree's category. + */ + size_t getTreeCategory() const { return m_treeCategory; } + + /** + * Returns the optional parameter. + * \return The optional parameter. + */ + double getTreeParameter() const { return m_treeParameter; } + + /** + * Executes the successive function calls from the function stack and returns + * the result. + * \return The result of the equation applied to the value referenced by X. + */ + double executeEquation() + { + functionPointer* currentFunction = m_functionList - 1; + functionPointer* lastFunctionPointer = currentFunction - m_nOperations; + + UFunctionContext* currentFunctionContext = m_functionContextList - 1; + + //while there are function pointers + while (currentFunction != lastFunctionPointer) + { + //calls the function with the current function context + (*currentFunction)(m_stack, *currentFunctionContext); + + //updates the stack pointers + currentFunction--; + currentFunctionContext--; + } + + //pop and return the result + return *(m_stack--); + } + +private: + + void createAbstractTree(boost::spirit::classic::tree_parse_info<> oInfo); + CAbstractTreeNode* createNode(iter_t const& i) const; + +public: + + static void op_neg(double*& stack, UFunctionContext& ctx); + static void op_add(double*& stack, UFunctionContext& ctx); + static void op_div(double*& stack, UFunctionContext& ctx); + static void op_sub(double*& stack, UFunctionContext& ctx); + static void op_mul(double*& stack, UFunctionContext& ctx); + + static void op_power(double*& stack, UFunctionContext& ctx); + + static void op_abs(double*& stack, UFunctionContext& ctx); + static void op_acos(double*& stack, UFunctionContext& ctx); + static void op_asin(double*& stack, UFunctionContext& ctx); + static void op_atan(double*& stack, UFunctionContext& ctx); + static void op_ceil(double*& stack, UFunctionContext& ctx); + static void op_cos(double*& stack, UFunctionContext& ctx); + static void op_exp(double*& stack, UFunctionContext& ctx); + static void op_floor(double*& stack, UFunctionContext& ctx); + static void op_log(double*& stack, UFunctionContext& ctx); + static void op_log10(double*& stack, UFunctionContext& ctx); + static void op_rand(double*& stack, UFunctionContext& ctx); + static void op_sin(double*& stack, UFunctionContext& ctx); + static void op_sqrt(double*& stack, UFunctionContext& ctx); + static void op_tan(double*& stack, UFunctionContext& ctx); + + static void op_if_then_else(double*& stack, UFunctionContext& ctx); + + static void op_cmp_lower(double*& stack, UFunctionContext& ctx); + static void op_cmp_greater(double*& stack, UFunctionContext& ctx); + static void op_cmp_lower_equal(double*& stack, UFunctionContext& ctx); + static void op_cmp_greater_equal(double*& stack, UFunctionContext& ctx); + static void op_cmp_equal(double*& stack, UFunctionContext& ctx); + static void op_cmp_not_equal(double*& stack, UFunctionContext& ctx); + + static void op_bool_and(double*& stack, UFunctionContext& ctx); + static void op_bool_or(double*& stack, UFunctionContext& ctx); + static void op_bool_not(double*& stack, UFunctionContext& ctx); + static void op_bool_xor(double*& stack, UFunctionContext& ctx); + + static void op_loadVal(double*& stack, UFunctionContext& ctx); + static void op_loadVar(double*& stack, UFunctionContext& ctx); +}; diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCEquationParserGrammar.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCEquationParserGrammar.h new file mode 100644 index 0000000..29ba580 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovpCSimpleDSP/ovpCEquationParserGrammar.h @@ -0,0 +1,336 @@ +#pragma once + +#include "../ovp_defines.h" + +#include + +#include +#include + +/** +* Enum of parent nodes identifiers. +*/ +enum EByteCodes +{ + OP_NEG, + OP_ADD, + OP_SUB, + OP_MUL, + OP_DIV, + + OP_ABS, + OP_ACOS, + OP_ASIN, + OP_ATAN, + OP_CEIL, + OP_COS, + OP_EXP, + OP_FLOOR, + OP_LOG, + OP_LOG10, + OP_POW, + OP_RAND, + OP_SIN, + OP_SQRT, + OP_TAN, + + OP_IF_THEN_ELSE, + + OP_CMP_L, + OP_CMP_G, + OP_CMP_LE, + OP_CMP_GE, + OP_CMP_E, + OP_CMP_NE, + + OP_BOOL_AND, + OP_BOOL_OR, + OP_BOOL_NOT, + OP_BOOL_XOR, + + //used for special tree recognition + + //The equation is not a special one + OP_USERDEF, + //Identity + OP_NONE, + //X*X + OP_X2 +}; + +enum EVariables +{ + OP_VAR_X=0, + OP_VAR_A, + OP_VAR_B, + OP_VAR_C, + OP_VAR_D, + OP_VAR_E, + OP_VAR_F, + OP_VAR_G, + OP_VAR_H, + OP_VAR_I, + OP_VAR_J, + OP_VAR_K, + OP_VAR_L, + OP_VAR_M, + OP_VAR_N, + OP_VAR_O, + OP_VAR_P, +}; + +/** +* Symbols table for unary functions. +* +*/ + +struct SUnaryFunctionSymbols : boost::spirit::classic::symbols +{ + SUnaryFunctionSymbols() + { + add + ("abs", OP_ABS) + ("acos", OP_ACOS) + ("asin", OP_ASIN) + ("atan", OP_ATAN) + ("ceil", OP_CEIL) + ("cos", OP_COS) + ("exp", OP_EXP) + ("floor", OP_FLOOR) + ("log", OP_LOG) + ("log10", OP_LOG10) + ("rand", OP_RAND) + ("sin", OP_SIN) + ("sqrt", OP_SQRT) + ("tan", OP_TAN); + } +}; + +/** +* Symbols table for binary functions. +* +*/ +struct SBinaryFunctionSymbols : boost::spirit::classic::symbols +{ + SBinaryFunctionSymbols() + { + add + ("pow", OP_POW); + } +}; + +/** +* Symbol tables for unary boolean operators +* +*/ +struct SUnaryBooleanFunctionSymbols : boost::spirit::classic::symbols +{ + SUnaryBooleanFunctionSymbols() + { + add + ("!", OP_BOOL_NOT); + } +}; + +/** +* Symbol tables for binary boolean operators +* +*/ +struct SBinaryBoolean1FunctionSymbols : boost::spirit::classic::symbols +{ + SBinaryBoolean1FunctionSymbols() + { + add + ("&&", OP_BOOL_AND) + ("&", OP_BOOL_AND); + } +}; + +/** +* Symbol tables for binary boolean operators +* +*/ +struct SBinaryBoolean2FunctionSymbols : boost::spirit::classic::symbols +{ + SBinaryBoolean2FunctionSymbols() + { + add + ("~", OP_BOOL_XOR) + ("^", OP_BOOL_XOR); + } +}; + +/** +* Symbol tables for binary boolean operators +* +*/ +struct SBinaryBoolean3FunctionSymbols : boost::spirit::classic::symbols +{ + SBinaryBoolean3FunctionSymbols() + { + add + ("||", OP_BOOL_OR) + ("|", OP_BOOL_OR); + } +}; + +/** +* Symbols table for comparison 1 functions. +* +*/ +struct SComparison1FunctionSymbols : boost::spirit::classic::symbols +{ + SComparison1FunctionSymbols() + { + add + ("<", OP_CMP_L) + (">", OP_CMP_G) + ("<=", OP_CMP_LE) + (">=", OP_CMP_GE); + } +}; + +/** +* Symbols table for comparison 2 functions. +* +*/ +struct SComparison2FunctionSymbols : boost::spirit::classic::symbols +{ + SComparison2FunctionSymbols() + { + add + ("==", OP_CMP_E) + ("!=", OP_CMP_NE) + ("<>", OP_CMP_NE); + } +}; + +/** +* Symbols table for mathematical constants. +* +*/ +struct SMathConstantSymbols : boost::spirit::classic::symbols +{ + SMathConstantSymbols() + { + add + ("m_pi", 3.14159265358979323846) + ("m_pi_2", 1.57079632679489661923) + ("m_pi_4", 0.78539816339744830962) + ("m_1_pi", 0.31830988618379067154) + ("m_2_pi", 0.63661977236758134308) + ("m_2_sqrt", 1.12837916709551257390) + ("m_sqrt2", 1.41421356237309504880) + ("m_sqrt1_2", 0.70710678118654752440) + ("m_e", 2.7182818284590452354) + ("m_log2e", 1.4426950408889634074) + ("m_log10e", 0.43429448190325182765) + ("m_ln", 0.69314718055994530942) + ("m_ln10", 2.30258509299404568402); + } +}; + +/** +* Symbols table for variables. +* +*/ +struct SVariableSymbols : boost::spirit::classic::symbols +{ + SVariableSymbols() + { + add + ("x", OP_VAR_X) + ("a", OP_VAR_A) + ("b", OP_VAR_B) + ("c", OP_VAR_C) + ("d", OP_VAR_D) + ("e", OP_VAR_E) + ("f", OP_VAR_F) + ("g", OP_VAR_G) + ("h", OP_VAR_H) + ("i", OP_VAR_I) + ("j", OP_VAR_J) + ("k", OP_VAR_K) + ("l", OP_VAR_L) + ("m", OP_VAR_M) + ("n", OP_VAR_N) + ("o", OP_VAR_O) + ("p", OP_VAR_P); + } +}; + +static SUnaryFunctionSymbols unaryFunction_p; +static SBinaryFunctionSymbols binaryFunction_p; +static SUnaryBooleanFunctionSymbols unaryBooleanFunction_p; +static SBinaryBoolean1FunctionSymbols binaryBoolean1Function_p; +static SBinaryBoolean2FunctionSymbols binaryBoolean2Function_p; +static SBinaryBoolean3FunctionSymbols binaryBoolean3Function_p; +static SComparison1FunctionSymbols comparison1Function_p; +static SComparison2FunctionSymbols comparison2Function_p; +static SMathConstantSymbols mathConstant_p; +static SVariableSymbols variable_p; + +/** +* The parser's grammar. +*/ +struct SEquationGrammar : boost::spirit::classic::grammar +{ + static const int realID = 1; + static const int variableID = 2; + static const int functionID = 3; + static const int constantID = 4; + static const int factorID = 6; + static const int termID = 7; + static const int expressionID = 8; + static const int ifthenID = 9; + static const int comparisonID = 10; + static const int booleanID = 11; + + template + struct definition + { + explicit definition(SEquationGrammar const& /*grammar*/) + { + using namespace boost::spirit::classic; + real = leaf_node_d[real_p]; + variable = leaf_node_d[as_lower_d[variable_p]]; + constant = leaf_node_d[as_lower_d[mathConstant_p]]; + + function = (root_node_d[as_lower_d[unaryFunction_p]] >> no_node_d[ch_p('(')] >> ifthen >> no_node_d[ch_p(')')]) + | (root_node_d[as_lower_d[binaryFunction_p]] >> no_node_d[ch_p('(')] >> infix_node_d[(ifthen >> ',' >> ifthen)] >> no_node_d[ch_p(')')]); + + factor = (function | constant | variable | real) | inner_node_d['(' >> expression >> ')'] + | inner_node_d['(' >> ifthen >> ')'] | (root_node_d[ch_p('-')] >> factor) | (root_node_d[ch_p('+')] >> factor); + + boolean = (root_node_d[unaryBooleanFunction_p] >> factor) | factor; + term = boolean >> *((root_node_d[ch_p('*')] >> boolean) | (root_node_d[ch_p('/')] >> boolean)); + expression = term >> *((root_node_d[ch_p('+')] >> term) | (root_node_d[ch_p('-')] >> term)); + comparison1 = (expression >> root_node_d[comparison1Function_p] >> expression) | expression; + comparison2 = (comparison1 >> root_node_d[comparison2Function_p] >> comparison1) | comparison1; + boolean1 = (comparison2 >> root_node_d[binaryBoolean1Function_p] >> comparison2) | comparison2; + boolean2 = (boolean1 >> root_node_d[binaryBoolean2Function_p] >> boolean1) | boolean1; + boolean3 = (boolean2 >> root_node_d[binaryBoolean3Function_p] >> boolean2) | boolean2; + ifthen = (boolean3 >> root_node_d[ch_p('?')] >> boolean3 >> no_node_d[ch_p(':')] >> boolean3) | boolean3; + } + + boost::spirit::classic::rule, boost::spirit::classic::parser_tag> boolean; + boost::spirit::classic::rule, boost::spirit::classic::parser_tag> boolean1; + boost::spirit::classic::rule, boost::spirit::classic::parser_tag> boolean2; + boost::spirit::classic::rule, boost::spirit::classic::parser_tag> boolean3; + boost::spirit::classic::rule, boost::spirit::classic::parser_tag> comparison1; + boost::spirit::classic::rule, boost::spirit::classic::parser_tag> comparison2; + boost::spirit::classic::rule, boost::spirit::classic::parser_tag> ifthen; + boost::spirit::classic::rule, boost::spirit::classic::parser_tag> expression; + boost::spirit::classic::rule, boost::spirit::classic::parser_tag> term; + boost::spirit::classic::rule, boost::spirit::classic::parser_tag> factor; + boost::spirit::classic::rule, boost::spirit::classic::parser_tag> real; + boost::spirit::classic::rule, boost::spirit::classic::parser_tag> variable; + boost::spirit::classic::rule, boost::spirit::classic::parser_tag> function; + boost::spirit::classic::rule, boost::spirit::classic::parser_tag> constant; + + boost::spirit::classic::rule, boost::spirit::classic::parser_tag> const& start() const + { + return ifthen; + } + }; +}; diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovp_defines.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovp_defines.h new file mode 100644 index 0000000..030a252 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovp_defines.h @@ -0,0 +1,117 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_Algorithm_MatrixAverage OpenViBE::CIdentifier(0x5E5A6C1C, 0x6F6BEB03) +#define OVP_ClassId_Algorithm_MatrixAverageDesc OpenViBE::CIdentifier(0x1992881F, 0xC938C0F2) +#define OVP_ClassId_Algorithm_OnlineCovariance OpenViBE::CIdentifier(0x5ADD4F8E, 0x005D29C1) +#define OVP_ClassId_Algorithm_OnlineCovarianceDesc OpenViBE::CIdentifier(0x00CD2DEA, 0x4C000CEB) +#define OVP_ClassId_BoxAlgorithm_ChannelRename OpenViBE::CIdentifier(0x1FE50479, 0x39040F40) +#define OVP_ClassId_BoxAlgorithm_ChannelRenameDesc OpenViBE::CIdentifier(0x20EA1F00, 0x7AED5645) +#define OVP_ClassId_BoxAlgorithm_ChannelSelector OpenViBE::CIdentifier(0x361722E8, 0x311574E8) +#define OVP_ClassId_BoxAlgorithm_ChannelSelectorDesc OpenViBE::CIdentifier(0x67633C1C, 0x0D610CD8) +#define OVP_ClassId_BoxAlgorithm_CommonAverageReference OpenViBE::CIdentifier(0x009C0CE3, 0x6BDF71C3) +#define OVP_ClassId_BoxAlgorithm_CommonAverageReferenceDesc OpenViBE::CIdentifier(0x0033EAF8, 0x09C65E4E) +#define OVP_ClassId_ContinuousWaveletAnalysis OpenViBE::CIdentifier(0x0A43133D, 0x6EAF25A7) +#define OVP_ClassId_ContinuousWaveletAnalysisDesc OpenViBE::CIdentifier(0x5B397A82, 0x76AE6F81) +#define OVP_ClassId_BoxAlgorithm_Crop OpenViBE::CIdentifier(0x7F1A3002, 0x358117BA) +#define OVP_ClassId_BoxAlgorithm_CropDesc OpenViBE::CIdentifier(0x64D619D7, 0x26CC42C9) +#define OVP_ClassId_BoxAlgorithm_EpochAverage OpenViBE::CIdentifier(0x21283D9F, 0xE76FF640) +#define OVP_ClassId_BoxAlgorithm_EpochAverageDesc OpenViBE::CIdentifier(0x95F5F43E, 0xBE629D82) +#define OVP_ClassId_BoxAlgorithm_FrequencyBandSelector OpenViBE::CIdentifier(0x140C19C6, 0x4E6E187B) +#define OVP_ClassId_BoxAlgorithm_FrequencyBandSelectorDesc OpenViBE::CIdentifier(0x13462C56, 0x794E3C07) +#define OVP_ClassId_BoxAlgorithm_Identity OpenViBE::CIdentifier(0x5DFFE431, 0x35215C50) +#define OVP_ClassId_BoxAlgorithm_IdentityDesc OpenViBE::CIdentifier(0x54743810, 0x6A1A88CC) +#define OVP_ClassId_BoxAlgorithm_ReferenceChannel OpenViBE::CIdentifier(0x444721AD, 0x78342CF5) +#define OVP_ClassId_BoxAlgorithm_ReferenceChannelDesc OpenViBE::CIdentifier(0x42856103, 0x45B125AD) +#define OVP_ClassId_BoxAlgorithm_RegularizedCSPTrainer OpenViBE::CIdentifier(0x2EC14CC0, 0x428C48BD) +#define OVP_ClassId_BoxAlgorithm_RegularizedCSPTrainerDesc OpenViBE::CIdentifier(0x02205F54, 0x733C51EE) +#define OVP_ClassId_BoxAlgorithm_SignalAverage OpenViBE::CIdentifier(0x00642C4D, 0x5DF7E50A) +#define OVP_ClassId_BoxAlgorithm_SignalAverageDesc OpenViBE::CIdentifier(0x007CDCE9, 0x16034F77) +#define OVP_ClassId_BoxAlgorithm_SignalDecimation OpenViBE::CIdentifier(0x012F4BEA, 0x3BE37C66) +#define OVP_ClassId_BoxAlgorithm_SignalDecimationDesc OpenViBE::CIdentifier(0x1C5F1356, 0x1E685777) +#define OVP_ClassId_BoxAlgorithm_SignalResampling OpenViBE::CIdentifier(0x0E923A5E, 0xDA474058) +#define OVP_ClassId_BoxAlgorithm_SignalResamplingDesc OpenViBE::CIdentifier(0xA675A433, 0xC6690920) +#define OVP_ClassId_BoxAlgorithm_SimpleDSP OpenViBE::CIdentifier(0x00E26FA1, 0x1DBAB1B2) +#define OVP_ClassId_BoxAlgorithm_SimpleDSPDesc OpenViBE::CIdentifier(0x00C44BFE, 0x76C9269E) +#define OVP_ClassId_BoxAlgorithm_SpatialFilter OpenViBE::CIdentifier(0xDD332C6C, 0x195B4FD4) +#define OVP_ClassId_BoxAlgorithm_SpatialFilterDesc OpenViBE::CIdentifier(0x72A01C92, 0xF8C1FA24) +#define OVP_ClassId_SpectralAnalysis OpenViBE::CIdentifier(0x84218FF8, 0xA87E7995) +#define OVP_ClassId_SpectralAnalysisDesc OpenViBE::CIdentifier(0x0051E63C, 0x68E83AD1) +#define OVP_ClassId_BoxAlgorithm_SpectrumAverage OpenViBE::CIdentifier(0x0C092665, 0x61B82641) +#define OVP_ClassId_BoxAlgorithm_SpectrumAverageDesc OpenViBE::CIdentifier(0x24663D96, 0x71EA7295) +#define OVP_ClassId_BoxAlgorithm_StimulationBasedEpoching OpenViBE::CIdentifier(0x426163D1, 0x324237B0) +#define OVP_ClassId_BoxAlgorithm_StimulationBasedEpochingDesc OpenViBE::CIdentifier(0x4F60616D, 0x468E0A8C) +#define OVP_ClassId_BoxAlgorithm_TemporalFilter OpenViBE::CIdentifier(0xB4F9D042, 0x9D79F2E5) +#define OVP_ClassId_BoxAlgorithm_TemporalFilterDesc OpenViBE::CIdentifier(0x7BF6BA62, 0xAF829A37) +#define OVP_ClassId_BoxAlgorithm_TimeBasedEpoching OpenViBE::CIdentifier(0x00777FA0, 0x5DC3F560) +#define OVP_ClassId_BoxAlgorithm_TimeBasedEpochingDesc OpenViBE::CIdentifier(0x00ABDABE, 0x41381683) +#define OVP_ClassId_Windowing OpenViBE::CIdentifier(0x002034AE, 0x6509FD8F) +#define OVP_ClassId_WindowingDesc OpenViBE::CIdentifier(0x602CF89F, 0x65BA6DA0) +#define OVP_ClassId_BoxAlgorithm_InriaXDAWNTrainer OpenViBE::CIdentifier(0x27542F6E, 0x14AA3548) +#define OVP_ClassId_BoxAlgorithm_InriaXDAWNTrainerDesc OpenViBE::CIdentifier(0x128A6013, 0x370B5C2C) +#define OVP_ClassId_BoxAlgorithm_ZeroCrossingDetector OpenViBE::CIdentifier(0x0016663F, 0x096A46A6) +#define OVP_ClassId_BoxAlgorithm_ZeroCrossingDetectorDesc OpenViBE::CIdentifier(0x63AA73A7, 0x1F0419A2) + +// Type definitions +//--------------------------------------------------------------------------------------------------- +// Filter method identifiers from OpenViBE 0.14.0 +#define OVP_TypeId_FilterMethod OpenViBE::CIdentifier(0x2F2C606C, 0x8512ED68) +#define OVP_TypeId_FilterType OpenViBE::CIdentifier(0xFA20178E, 0x4CBA62E9) +#define OVP_TypeId_OnlineCovariance_UpdateMethod OpenViBE::CIdentifier(0x59E83F33, 0x592F1DD0) +#define OVP_TypeId_EpochAverageMethod OpenViBE::CIdentifier(0x6530BDB1, 0xD057BBFE) +#define OVP_TypeId_ContinuousWaveletType OpenViBE::CIdentifier(0x09177469, 0x52404583) +#define OVP_TypeId_CropMethod OpenViBE::CIdentifier(0xD0643F9E, 0x8E35FE0A) +#define OVP_TypeId_SelectionMethod OpenViBE::CIdentifier(0x3BCF9E67, 0x0C23994D) +#define OVP_TypeId_MatchMethod OpenViBE::CIdentifier(0x666F25E9, 0x3E5738D6) +#define OVP_TypeId_WindowMethod OpenViBE::CIdentifier(0x0A430FE4, 0x4F318280) +#include + +enum class EFilterMethod { Butterworth, Chebyshev, YuleWalker }; + +enum class EFilterType { LowPass, BandPass, HighPass, BandStop }; + +enum class EUpdateMethod { ChunkAverage, Incremental }; + +enum class EEpochAverageMethod { Moving, MovingImmediate, Block, Cumulative }; + +enum class EContinuousWaveletType { Morlet, Paul, DOG }; + +enum class ECropMethod { Min, Max, MinMax }; + +enum class ESelectionMethod { Select, Reject, Select_EEG }; + +enum class EMatchMethod { Name, Index, Smart }; + +enum class EWindowMethod { None, Hamming, Hanning, Hann, Blackman, Triangular, SquareRoot }; + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#define OVP_Value_CoupledStringSeparator '-' +//#define OVP_Value_AllSelection '*' + +#define OVP_Algorithm_MatrixAverage_InputParameterId_Matrix OpenViBE::CIdentifier(0x913E9C3B, 0x8A62F5E3) +#define OVP_Algorithm_MatrixAverage_InputParameterId_MatrixCount OpenViBE::CIdentifier(0x08563191, 0xE78BB265) +#define OVP_Algorithm_MatrixAverage_InputParameterId_AveragingMethod OpenViBE::CIdentifier(0xE63CD759, 0xB6ECF6B7) +#define OVP_Algorithm_MatrixAverage_OutputParameterId_AveragedMatrix OpenViBE::CIdentifier(0x03CE5AE5, 0xBD9031E0) +#define OVP_Algorithm_MatrixAverage_InputTriggerId_Reset OpenViBE::CIdentifier(0x670EC053, 0xADFE3F5C) +#define OVP_Algorithm_MatrixAverage_InputTriggerId_FeedMatrix OpenViBE::CIdentifier(0x50B6EE87, 0xDC42E660) +#define OVP_Algorithm_MatrixAverage_InputTriggerId_ForceAverage OpenViBE::CIdentifier(0xBF597839, 0xCD6039F0) +#define OVP_Algorithm_MatrixAverage_OutputTriggerId_AveragePerformed OpenViBE::CIdentifier(0x2BFF029B, 0xD932A613) +#define OVP_Algorithm_OnlineCovariance_InputParameterId_Shrinkage OpenViBE::CIdentifier(0x16577C7B, 0x4E056BF7) +#define OVP_Algorithm_OnlineCovariance_InputParameterId_InputVectors OpenViBE::CIdentifier(0x47E55F81, 0x27A519C4) +#define OVP_Algorithm_OnlineCovariance_InputParameterId_UpdateMethod OpenViBE::CIdentifier(0x1C4F444F, 0x3CA213E2) +#define OVP_Algorithm_OnlineCovariance_InputParameterId_TraceNormalization OpenViBE::CIdentifier(0x269D5E63, 0x3B6D486E) +#define OVP_Algorithm_OnlineCovariance_OutputParameterId_Mean OpenViBE::CIdentifier(0x3F1F50A3, 0x05504D0E) +#define OVP_Algorithm_OnlineCovariance_OutputParameterId_CovarianceMatrix OpenViBE::CIdentifier(0x203A5472, 0x67C5324C) +#define OVP_Algorithm_OnlineCovariance_Process_Reset OpenViBE::CIdentifier(0x4C1C510C, 0x3CF56E7C) // to reset estimates to 0 +#define OVP_Algorithm_OnlineCovariance_Process_Update OpenViBE::CIdentifier(0x72BF2277, 0x2974747B) // update estimates with a new chunk of data +#define OVP_Algorithm_OnlineCovariance_Process_GetCov OpenViBE::CIdentifier(0x2BBC4A91, 0x27050CFD) // also returns the mean estimate +#define OVP_Algorithm_OnlineCovariance_Process_GetCovRaw OpenViBE::CIdentifier(0x0915148C, 0x5F792B2A) // also returns the mean estimate +#define OVP_ClassId_BoxAlgorithm_SignalResampling_SettingId_NewSampling OpenViBE::CIdentifier(0x158A8EFD, 0xAA894F86) +#define OVP_ClassId_BoxAlgorithm_SignalResampling_SettingId_SampleCountPerBuffer OpenViBE::CIdentifier(0x588783F3, 0x8E8DCF86) +#define OVP_ClassId_BoxAlgorithm_SignalResampling_SettingId_LowPassFilterSignalFlag OpenViBE::CIdentifier(0xAFDD8EFD, 0x23EF94F6) diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovp_main.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovp_main.cpp new file mode 100755 index 0000000..e46f521 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/signal-processing/src/ovp_main.cpp @@ -0,0 +1,134 @@ +#include "algorithms/basic/ovpCAlgorithmMatrixAverage.h" + +#include "box-algorithms/basic/ovpCBoxAlgorithmIdentity.h" +#include "box-algorithms/basic/ovpCBoxAlgorithmChannelRename.h" +#include "box-algorithms/basic/ovpCBoxAlgorithmChannelSelector.h" +#include "box-algorithms/basic/ovpCBoxAlgorithmEpochAverage.h" +#include "box-algorithms/basic/ovpCBoxAlgorithmCrop.h" +#include "box-algorithms/basic/ovpCBoxAlgorithmSignalDecimation.h" +#include "box-algorithms/basic/ovpCBoxAlgorithmReferenceChannel.h" +#include "box-algorithms/basic/ovpCBoxAlgorithmZeroCrossingDetector.h" +#include "box-algorithms/epoching/ovpCBoxAlgorithmStimulationBasedEpoching.h" +#include "box-algorithms/epoching/ovpCBoxAlgorithmTimeBasedEpoching.h" +#include "box-algorithms/filters/ovpCBoxAlgorithmCommonAverageReference.h" +#include "box-algorithms/filters/ovpCBoxAlgorithmSpatialFilter.h" +#include "box-algorithms/filters/ovpCBoxAlgorithmTemporalFilter.h" + +#include "box-algorithms/filters/ovpCBoxAlgorithmRegularizedCSPTrainer.h" +#include "algorithms/basic/ovpCAlgorithmOnlineCovariance.h" + +#include "box-algorithms/spectral-analysis/ovpCBoxAlgorithmContinuousWaveletAnalysis.h" +#include "box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectralAnalysis.h" +#include "box-algorithms/spectral-analysis/ovpCBoxAlgorithmFrequencyBandSelector.h" +#include "box-algorithms/spectral-analysis/ovpCBoxAlgorithmSpectrumAverage.h" + +#include "box-algorithms/resampling/ovpCBoxAlgorithmSignalResampling.h" + +#include "box-algorithms/ovpCBoxAlgorithmSimpleDSP.h" +#include "box-algorithms/ovpCBoxAlgorithmSignalAverage.h" +#include "box-algorithms/ovpCBoxAlgorithmWindowing.h" +#include "box-algorithms/ovpCBoxAlgorithmXDAWNTrainer.h" + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +OVP_Declare_Begin() + context.getTypeManager().registerEnumerationType(OVP_TypeId_EpochAverageMethod, "Epoch Average method"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_EpochAverageMethod, "Moving epoch average", size_t(EEpochAverageMethod::Moving)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_EpochAverageMethod, "Moving epoch average (Immediate)", + size_t(EEpochAverageMethod::MovingImmediate)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_EpochAverageMethod, "Epoch block average", size_t(EEpochAverageMethod::Block)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_EpochAverageMethod, "Cumulative average", size_t(EEpochAverageMethod::Cumulative)); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_CropMethod, "Crop method"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_CropMethod, "Min", size_t(ECropMethod::Min)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_CropMethod, "Max", size_t(ECropMethod::Max)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_CropMethod, "Min/Max", size_t(ECropMethod::MinMax)); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_SelectionMethod, "Selection method"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SelectionMethod, "Select", size_t(ESelectionMethod::Select)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SelectionMethod, "Reject", size_t(ESelectionMethod::Reject)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SelectionMethod, "Select EEG", size_t(ESelectionMethod::Select_EEG)); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_MatchMethod, "Match method"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_MatchMethod, "Name", size_t(EMatchMethod::Name)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_MatchMethod, "Index", size_t(EMatchMethod::Index)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_MatchMethod, "Smart", size_t(EMatchMethod::Smart)); + + + // Temporal filter + context.getTypeManager().registerEnumerationType(OVP_TypeId_FilterMethod, "Filter method"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterMethod, "Butterworth", size_t(EFilterMethod::Butterworth)); + // context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterMethod, "Chebishev", size_t(EFilterMethod::Chebyshev)); + // context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterMethod, "Yule Walked", size_t(EFilterMethod::YuleWalker)); + + context.getTypeManager().registerEnumerationType(OVP_TypeId_FilterType, "Filter type"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterType, "Low Pass", size_t(EFilterType::LowPass)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterType, "High Pass", size_t(EFilterType::HighPass)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterType, "Band Pass", size_t(EFilterType::BandPass)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_FilterType, "Band Stop", size_t(EFilterType::BandStop)); + + OVP_Declare_New(CAlgorithmMatrixAverageDesc) + + OVP_Declare_New(CBoxAlgorithmIdentityDesc); + OVP_Declare_New(CBoxAlgorithmTimeBasedEpochingDesc); + OVP_Declare_New(CBoxAlgorithmChannelRenameDesc) + OVP_Declare_New(CBoxAlgorithmChannelSelectorDesc) + OVP_Declare_New(CBoxAlgorithmReferenceChannelDesc) + OVP_Declare_New(CBoxAlgorithmEpochAverageDesc) + OVP_Declare_New(CBoxAlgorithmCropDesc) + OVP_Declare_New(CBoxAlgorithmSignalDecimationDesc) + OVP_Declare_New(CBoxAlgorithmZeroCrossingDetectorDesc) + OVP_Declare_New(CBoxAlgorithmStimulationBasedEpochingDesc) + OVP_Declare_New(CBoxAlgorithmCommonAverageReferenceDesc) + + OVP_Declare_New(CBoxAlgorithmSpatialFilterDesc) + OVP_Declare_New(CBoxAlgorithmTemporalFilterDesc) + +#if defined TARGET_HAS_ThirdPartyEIGEN + context.getTypeManager().registerEnumerationType(OVP_TypeId_OnlineCovariance_UpdateMethod, "Update method"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_OnlineCovariance_UpdateMethod, "Chunk average", size_t(EUpdateMethod::ChunkAverage)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_OnlineCovariance_UpdateMethod, "Per sample", size_t(EUpdateMethod::Incremental)); + + OVP_Declare_New(CBoxAlgorithmRegularizedCSPTrainerDesc) + OVP_Declare_New(CAlgorithmOnlineCovarianceDesc) + +#endif + +#if defined TARGET_HAS_R8BRAIN + OVP_Declare_New(CBoxAlgorithmSignalResamplingDesc) +#endif + + OVP_Declare_New(CBoxAlgorithmSimpleDSPDesc) + OVP_Declare_New(CSignalAverageDesc) + + // Wavelet Type + context.getTypeManager().registerEnumerationType(OVP_TypeId_ContinuousWaveletType, "Continuous Wavelet Type"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_ContinuousWaveletType, "Morlet wavelet", size_t(EContinuousWaveletType::Morlet)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_ContinuousWaveletType, "Paul wavelet", size_t(EContinuousWaveletType::Paul)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_ContinuousWaveletType, "Derivative of Gaussian wavelet", size_t(EContinuousWaveletType::DOG)); + + OVP_Declare_New(CBoxAlgorithmContinuousWaveletAnalysisDesc); + + OVP_Declare_New(CBoxAlgorithmFrequencyBandSelectorDesc) + OVP_Declare_New(CBoxAlgorithmSpectrumAverageDesc) + + OVP_Declare_New(CBoxAlgorithmSpectralAnalysisDesc); + OVP_Declare_New(CBoxAlgorithmWindowingDesc); + context.getTypeManager().registerEnumerationType(OVP_TypeId_WindowMethod, "Window method"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WindowMethod, "None", size_t(EWindowMethod::None)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WindowMethod, "Hamming", size_t(EWindowMethod::Hamming)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WindowMethod, "Hanning", size_t(EWindowMethod::Hanning)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WindowMethod, "Hann", size_t(EWindowMethod::Hann)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WindowMethod, "Blackman", size_t(EWindowMethod::Blackman)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WindowMethod, "Triangular", size_t(EWindowMethod::Triangular)); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_WindowMethod, "Square root", size_t(EWindowMethod::SquareRoot)); + + OVP_Declare_New(CBoxAlgorithmXDAWNTrainerDesc); + +OVP_Declare_End() + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/CMakeLists.txt new file mode 100755 index 0000000..67b603c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/CMakeLists.txt @@ -0,0 +1,54 @@ +PROJECT(openvibe-plugins-sdk-stimulation) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl) +INCLUDE("FindSourceRCProperties") +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindThirdPartyBoost") + +# --------------------------------- +# Finds standard library winmm +# Adds library to target +# Adds include path +# --------------------------------- +IF(WIN32) + FIND_LIBRARY(LIB_STANDARD_MODULE_WINMM winmm) + IF(LIB_STANDARD_MODULE_WINMM) + MESSAGE(STATUS " Found winmm...") + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_WINMM}) + ELSE(LIB_STANDARD_MODULE_WINMM) + MESSAGE(STATUS " FAILED to find winmm...") + ENDIF(LIB_STANDARD_MODULE_WINMM) +ENDIF(WIN32) + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_ClockStimulator.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_ClockStimulator.dox-part new file mode 100644 index 0000000..f937f0d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_ClockStimulator.dox-part @@ -0,0 +1,68 @@ +/** + * \page BoxAlgorithm_ClockStimulator Clock stimulator +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClockStimulator_Description| + * This box produces stimulations at specific times depending on + * its configuration. The stimulation interval is fixed. + * + * It is important to underline that this box runs as fast as possible + * thus producting empty \ref Doc_Streams_Stimulation chunks when needed. + * |OVP_DocEnd_BoxAlgorithm_ClockStimulator_Description| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClockStimulator_Outputs| + * |OVP_DocEnd_BoxAlgorithm_ClockStimulator_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_ClockStimulator_Output1| + * This output contains the generated stimulation stream. + * |OVP_DocEnd_BoxAlgorithm_ClockStimulator_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClockStimulator_Settings| + * |OVP_DocEnd_BoxAlgorithm_ClockStimulator_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ClockStimulator_Setting1| + * The first setting \f$ i \f$ informs the box how often it should produce stimulations, with \f$ i > 0 \f$. + * |OVP_DocEnd_BoxAlgorithm_ClockStimulator_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_ClockStimulator_Setting2| + * The second setting gives the stimulation code to trigger. + * |OVP_DocEnd_BoxAlgorithm_ClockStimulator_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClockStimulator_Examples| + * In the designer, drag'n drop a \ref Dox_BoxAlgorithm_StimulationListener + * and connect it to a clock stimulator box. Configure it to your preferred + * active log level, press start and see what happens. + * + * The output should like this : +\verbatim +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 4294967296 (0x100000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 8589934592 (0x200000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 12884901888 (0x300000000) and duration 0 (0x0) +... +\endverbatim + * |OVP_DocEnd_BoxAlgorithm_ClockStimulator_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ClockStimulator_Miscellaneous| + * Notice that no stimulation is sent a time 0. The first stimulation to be sent + * has the inter stimulation duration as date. + * |OVP_DocEnd_BoxAlgorithm_ClockStimulator_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_PlayerController.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_PlayerController.dox-part new file mode 100644 index 0000000..51dca4d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_PlayerController.dox-part @@ -0,0 +1,41 @@ +/** + * \page BoxAlgorithm_PlayerController Player Controller +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_PlayerController_Description| + * |OVP_DocEnd_BoxAlgorithm_PlayerController_Description| + +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_PlayerController_Settings| + * |OVP_DocEnd_BoxAlgorithm_PlayerController_Settings| + * + * |OVP_DocBegin_BoxAlgorithm_PlayerController_Setting1| + * Input stimulation to react to + * |OVP_DocEnd_BoxAlgorithm_PlayerController_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_PlayerController_Setting2| + * Scenario player action to perform when stimulation is received. The options are 'forward', 'pause', 'play' and 'stop'. + * |OVP_DocEnd_BoxAlgorithm_PlayerController_Setting2| + +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_PlayerController_Examples| + * |OVP_DocEnd_BoxAlgorithm_PlayerController_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_PlayerController_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_PlayerController_Miscellaneous| +*/ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_StimulationMultiplexer.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_StimulationMultiplexer.dox-part new file mode 100644 index 0000000..931e9c1 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_StimulationMultiplexer.dox-part @@ -0,0 +1,93 @@ +/** + * \page BoxAlgorithm_StimulationMultiplexer Stimulation multiplexer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationMultiplexer_Description| + * The Stimulation multiplexer box algorithm merges several stimulation streams + * into one stimulation stream. The contained stimulations are ordered + * according to their start date. Thus each time all the input have chunks + * covering a period of time, a new output chunk is sent. This box may eventually + * produce output chunk reflecting a different duration depending on the inputs. + * |OVP_DocEnd_BoxAlgorithm_StimulationMultiplexer_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationMultiplexer_Inputs| + * This box can receive as many input as necessary. All the inputs + * will be of type \ref Doc_Streams_Stimulation in order to + * be parsed by this the reader. Every input have to be connected + * for this box to work correctly + * |OVP_DocEnd_BoxAlgorithm_StimulationMultiplexer_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_StimulationMultiplexer_Input1| + * This is the first default input of this box. + * |OVP_DocEnd_BoxAlgorithm_StimulationMultiplexer_Input1| + + * |OVP_DocBegin_BoxAlgorithm_StimulationMultiplexer_Input2| + * This is the second default input of this box. + * |OVP_DocEnd_BoxAlgorithm_StimulationMultiplexer_Input2| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationMultiplexer_Outputs| + * |OVP_DocEnd_BoxAlgorithm_StimulationMultiplexer_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_StimulationMultiplexer_Output1| + * The output of this box is a new \ref Doc_Streams_Stimulation + * that contains all the stimulation of respective inputs. The + * input streams are multiplexed in a single stream ordering the + * stimulations according to their starting time. + * |OVP_DocEnd_BoxAlgorithm_StimulationMultiplexer_Output1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationMultiplexer_Examples| + * To illustrate this box, just drag'n drop a \ref Doc_BoxAlgorithm_KeyboardStimulator, + * a \ref Doc_BoxAlgorithm_ClockStimulator and a \ref Doc_BoxAlgorithm_StimulationListener + * box. Connect the two stimulation generators to your stimulation + * multiplexer and connect the output of the stimulation multiplexer + * to the stimulation listener. Leave the default parameters for all + * of those boxes, except the clock stimulator which you'll configure + * with an \e OVTK_StimulationId_Beep stimulation. Now pres 'start'. + * + * You should see something like this : +\verbatim +... +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33282 (0x8202)[OVTK_StimulationId_Beep] at date 4294967296 (0x100000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 8187281408 (0x1e8000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33282 (0x8202)[OVTK_StimulationId_Beep] at date 8589934592 (0x200000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 8992587776 (0x218000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33026 (0x8102)[OVTK_StimulationId_Label_02] at date 12213813248 (0x2d8000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33282 (0x8202)[OVTK_StimulationId_Beep] at date 12884901888 (0x300000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33282 (0x8202)[OVTK_StimulationId_Beep] at date 17179869184 (0x400000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 18924699648 (0x468000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33282 (0x8202)[OVTK_StimulationId_Beep] at date 21474836480 (0x500000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33027 (0x8103)[OVTK_StimulationId_Label_03] at date 23756537856 (0x588000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 24561844224 (0x5b8000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33282 (0x8202)[OVTK_StimulationId_Beep] at date 25769803776 (0x600000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33282 (0x8202)[OVTK_StimulationId_Beep] at date 30064771072 (0x700000000) and duration 0 (0x0) +... +\endverbatim + * In this session, I pressed \e z, \e z and \e a successively, causing + * an \e OVTK_StimulationId_Label_0x stimulation to be sent at key pressed + * time, and an \e OVTK_StimulationId_Label_00 stimulation to be sent at key + * release time. Inserted in those stimulations are several \e OVTK_StimulationId_Beep + * stimulations coming from the clock stimulator. + * |OVP_DocEnd_BoxAlgorithm_StimulationMultiplexer_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationMultiplexer_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_StimulationMultiplexer_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_StimulationVoter.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_StimulationVoter.dox-part new file mode 100644 index 0000000..c8bfd6e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_StimulationVoter.dox-part @@ -0,0 +1,86 @@ +/** + * \page BoxAlgorithm_StimulationVoter Stimulation Voter +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationVoter_Description| +This box reads all the incoming stimuli a stimulus channel and returns the stimulus ID with the highest number of occurrences. Some constraints can be specified as box parameters. + * |OVP_DocEnd_BoxAlgorithm_StimulationVoter_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationVoter_Inputs| +Collects the stimuli from a single input. To use several inputs, combine them first with Stimulation Multiplexer. + * |OVP_DocEnd_BoxAlgorithm_StimulationVoter_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_StimulationVoter_Input1| +Input stream, can include any stimuli. + * |OVP_DocEnd_BoxAlgorithm_StimulationVoter_Input1| + +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationVoter_Outputs| + * |OVP_DocEnd_BoxAlgorithm_StimulationVoter_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_StimulationVoter_Output1| +The output sends a new stimulation as soon as the most frequent stimulus type passes the criteria specified by the box parameters. + * |OVP_DocEnd_BoxAlgorithm_StimulationVoter_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationVoter_Settings| + * |OVP_DocEnd_BoxAlgorithm_StimulationVoter_Settings| + + * |OVP_DocBegin_BoxAlgorithm_StimulationVoter_Setting1| +Minimum number of incoming stimulus required to be inside the time window to carry out a vote. + * |OVP_DocEnd_BoxAlgorithm_StimulationVoter_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_StimulationVoter_Setting2| +The length of the time window. Stimuli are discarded after they drop outside the time window. + * |OVP_DocEnd_BoxAlgorithm_StimulationVoter_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_StimulationVoter_Setting3| +You can specify that stimuli can either vote as long as they remain inside the time window, + or that they are discarded after they participate in a single successful vote. + * |OVP_DocEnd_BoxAlgorithm_StimulationVoter_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_StimulationVoter_Setting4| +The output stimulus can be tagged with either the time of vote, the time of the last occurrence of the winning stimulus type, or the time of the last stimulus that participated in the vote. + * |OVP_DocEnd_BoxAlgorithm_StimulationVoter_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_StimulationVoter_Setting5| +Specifies the class interpreted as the 'rejected' class. + * |OVP_DocEnd_BoxAlgorithm_StimulationVoter_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_StimulationVoter_Setting6| +If set to 'no', 'rejected' class never wins the votes and is never returned as output. + * |OVP_DocEnd_BoxAlgorithm_StimulationVoter_Setting6| + + +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationVoter_Examples| + Possible usages include aggregating classifier outputs by making a majority vote over them. + * |OVP_DocEnd_BoxAlgorithm_StimulationVoter_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationVoter_Miscellaneous| + This algorithm is similar to the Voting Classifier but it allows more parameters. Also, all stimulus available at time step t are used to carry out the vote at time step t. On the other hand, Stimulation Voter only supports input streams of type Stimulus. + * |OVP_DocEnd_BoxAlgorithm_StimulationVoter_Miscellaneous| + */ + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_Timeout.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_Timeout.dox-part new file mode 100644 index 0000000..b44a6c4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/Doc_BoxAlgorithm_Timeout.dox-part @@ -0,0 +1,63 @@ +/** + * \page BoxAlgorithm_Timeout Timeout +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Description| +This box will send a stimulation on its output after it stops receiving an input. The user +can set a duration to wait before considering the output inactive. + * |OVP_DocEnd_BoxAlgorithm_Timeout_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Inputs| + * |OVP_DocEnd_BoxAlgorithm_Timeout_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Input1| +Streamed Matrix input to be monitored. + * |OVP_DocEnd_BoxAlgorithm_Timeout_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Outputs| + * |OVP_DocEnd_BoxAlgorithm_Timeout_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Output1| +Output stimulation. One stimulation will be sent after the timeout is reached. + * |OVP_DocEnd_BoxAlgorithm_Timeout_Output1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Settings| + * |OVP_DocEnd_BoxAlgorithm_Timeout_Settings| + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Setting1| +Timeout value. Duration (in seconds) to wait after the last received chunk before the input is considered inactive. + * |OVP_DocEnd_BoxAlgorithm_Timeout_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Setting2| +Sitmulation ID to send. + * |OVP_DocEnd_BoxAlgorithm_Timeout_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Examples| + * |OVP_DocEnd_BoxAlgorithm_Timeout_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_Timeout_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_Timeout_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_ClockStimulator.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_ClockStimulator.rst new file mode 100644 index 0000000..bede568 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_ClockStimulator.rst @@ -0,0 +1,82 @@ +.. _Doc_BoxAlgorithm_ClockStimulator: + +Clock stimulator +================ + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA/IRISA + +.. image:: images/Doc_BoxAlgorithm_ClockStimulator.png + +Triggers stimulation at fixed frequency + +This box produces stimulations at specific times depending on +its configuration. The stimulation interval is fixed. + +It is important to underline that this box runs as fast as possible +thus producing empty :ref:`Doc_Streams_Stimulation` chunks when needed. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Generated stimulations", "Stimulations" + +Generated stimulations +~~~~~~~~~~~~~~~~~~~~~~ + +This output contains the generated stimulation stream. + +.. _Doc_BoxAlgorithm_ClockStimulator_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Interstimulation interval (in sec)", "Float", "1.0" + "Stimulation", "Stimulation", "OVTK_StimulationId_Label_00" + +Interstimulation interval (in sec) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The first setting :math:`i` informs the box how often it should produce stimulations, with :math:`i > 0`. + +Stimulation +~~~~~~~~~~~ + +The second setting gives the stimulation code to trigger. + +.. _Doc_BoxAlgorithm_ClockStimulator_Examples: + +Examples +-------- + +In the designer, drag'n drop a :ref:`Doc_BoxAlgorithm_StimulationListener` +and connect it to a clock stimulator box. Configure it to your preferred +active log level, press start and see what happens. + +The output should like this : + +.. code:: + + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 4294967296 (0x100000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 8589934592 (0x200000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 12884901888 (0x300000000) and duration 0 (0x0) + ... + +.. _Doc_BoxAlgorithm_ClockStimulator_Miscellaneous: + +Miscellaneous +------------- + +Notice that no stimulation is sent a time 0. The first stimulation to be sent +has the inter stimulation duration as date. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_PlayerController.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_PlayerController.rst new file mode 100644 index 0000000..7ccdf80 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_PlayerController.rst @@ -0,0 +1,57 @@ +.. _Doc_BoxAlgorithm_PlayerController: + +Player Controller +================= + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA + + +.. image:: images/Doc_BoxAlgorithm_PlayerController.png + +This box can execute one of these actions on the current player instance on a trigger: + +- Play +- Fast Forward +- Pause +- Stop + +The box triggers upon receiving a specific stimulation on the Stimulations +input. + +Due to the nature of the triggers, Play and Fast Forward actions can only be +used while the player is actually playing or in fast forward. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Stimulations", "Stimulations" + +.. _Doc_BoxAlgorithm_PlayerController_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Stimulation name", "Stimulation", "OVTK_StimulationId_Label_00" + "Action to perform", "Player Action", "Pause" + +Stimulation name +~~~~~~~~~~~~~~~~ + +Input stimulation to react to + +Action to perform +~~~~~~~~~~~~~~~~~ + +Scenario player action to perform when stimulation is received. The options are 'forward', 'pause', 'play' and 'stop'. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_StimulationMultiplexer.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_StimulationMultiplexer.rst new file mode 100644 index 0000000..24c33a5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_StimulationMultiplexer.rst @@ -0,0 +1,102 @@ +.. _Doc_BoxAlgorithm_StimulationMultiplexer: + +Stimulation multiplexer +======================= + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA/IRISA + + +.. image:: images/Doc_BoxAlgorithm_StimulationMultiplexer.png + +The stimulations are ordered according to their start date. Thus each time all the input have chunks covering a period of time, a new output chunk is sent. This box may eventually produce output chunk reflecting a different duration depending on the inputs. + +The Stimulation multiplexer box algorithm merges several stimulation streams +into one stimulation stream. The contained stimulations are ordered +according to their start date. Thus each time all the input have chunks +covering a period of time, a new output chunk is sent. This box may eventually +produce output chunk reflecting a different duration depending on the inputs. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input stimulations 1", "Stimulations" + "Input stimulations 2", "Stimulations" + +This box can receive as many input as necessary. All the inputs +will be of type :ref:`Doc_Streams_Stimulation` in order to +be parsed by this the reader. Every input have to be connected +for this box to work correctly + +Input stimulations 1 +~~~~~~~~~~~~~~~~~~~~ + +This is the first default input of this box. + +Input stimulations 2 +~~~~~~~~~~~~~~~~~~~~ + +This is the second default input of this box. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Multiplexed stimulations", "Stimulations" + +Multiplexed stimulations +~~~~~~~~~~~~~~~~~~~~~~~~ + +The output of this box is a new :ref:`Doc_Streams_Stimulation` +that contains all the stimulation of respective inputs. The +input streams are multiplexed in a single stream ordering the +stimulations according to their starting time. + +.. _Doc_BoxAlgorithm_StimulationMultiplexer_Examples: + +Examples +-------- + +To illustrate this box, just drag'n drop a :ref:`Doc_BoxAlgorithm_KeyboardStimulator`, +a :ref:`Doc_BoxAlgorithm_ClockStimulator` and a :ref:`Doc_BoxAlgorithm_StimulationListener` +box. Connect the two stimulation generators to your stimulation +multiplexer and connect the output of the stimulation multiplexer +to the stimulation listener. Leave the default parameters for all +of those boxes, except the clock stimulator which you'll configure +with an \e OVTK_StimulationId_Beep stimulation. Now pres 'start'. + +You should see something like this : + +.. code:: + + ... + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33282 (0x8202)[OVTK_StimulationId_Beep] at date 4294967296 (0x100000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 8187281408 (0x1e8000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33282 (0x8202)[OVTK_StimulationId_Beep] at date 8589934592 (0x200000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 8992587776 (0x218000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33026 (0x8102)[OVTK_StimulationId_Label_02] at date 12213813248 (0x2d8000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33282 (0x8202)[OVTK_StimulationId_Beep] at date 12884901888 (0x300000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33282 (0x8202)[OVTK_StimulationId_Beep] at date 17179869184 (0x400000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 18924699648 (0x468000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33282 (0x8202)[OVTK_StimulationId_Beep] at date 21474836480 (0x500000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33027 (0x8103)[OVTK_StimulationId_Label_03] at date 23756537856 (0x588000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 24561844224 (0x5b8000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33282 (0x8202)[OVTK_StimulationId_Beep] at date 25769803776 (0x600000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33282 (0x8202)[OVTK_StimulationId_Beep] at date 30064771072 (0x700000000) and duration 0 (0x0) + ... + +In this session, I pressed \e z, \e z and \e a successively, causing +an \e OVTK_StimulationId_Label_0x stimulation to be sent at key pressed +time, and an \e OVTK_StimulationId_Label_00 stimulation to be sent at key +release time. Inserted in those stimulations are several \e OVTK_StimulationId_Beep +stimulations coming from the clock stimulator. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_StimulationVoter.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_StimulationVoter.rst new file mode 100644 index 0000000..3e72cd1 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_StimulationVoter.rst @@ -0,0 +1,107 @@ +.. _Doc_BoxAlgorithm_StimulationVoter: + +Stimulation Voter +================= + +.. container:: attribution + + :Author: + Jussi T. Lindgren + :Company: + Inria + +.. image:: images/Doc_BoxAlgorithm_StimulationVoter.png + +Votes the most frequent stimulus ID in a given time window. Outputs the winning stimulus type. Several options are possible. To process multiple inputs, use Stimulation Multiplexer first. + +This box reads all the incoming stimuli a stimulus channel and returns the stimulus ID with the highest number of occurrences. Some constraints can be specified as box parameters. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Stimulus input", "Stimulations" + +Collects the stimuli from a single input. To use several inputs, combine them first with Stimulation Multiplexer. + +Stimulus input +~~~~~~~~~~~~~~ + +Input stream, can include any stimuli. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Selected stimulus", "Stimulations" + +Selected stimulus +~~~~~~~~~~~~~~~~~ + +The output sends a new stimulation as soon as the most frequent stimulus type passes the criteria specified by the box parameters. + +.. _Doc_BoxAlgorithm_StimulationVoter_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Number of stimuli required for vote", "Integer", "4" + "Time window (secs)", "Float", "2" + "Clear votes", "Clear votes", "After output" + "Output timestamp", "Output time", "Time of last voting stimulus" + "Reject class label", "Stimulation", "OVTK_StimulationId_Label_00" + "Reject class can win", "Reject can win", "No" + +Number of stimuli required for vote +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Minimum number of incoming stimulus required to be inside the time window to carry out a vote. + +Time window (secs) +~~~~~~~~~~~~~~~~~~ + +The length of the time window. Stimuli are discarded after they drop outside the time window. + +Clear votes +~~~~~~~~~~~ + +You can specify that stimuli can either vote as long as they remain inside the time window, +or that they are discarded after they participate in a single successful vote. + +Output timestamp +~~~~~~~~~~~~~~~~ + +The output stimulus can be tagged with either the time of vote, the time of the last occurrence of the winning stimulus type, or the time of the last stimulus that participated in the vote. + +Reject class label +~~~~~~~~~~~~~~~~~~ + +Specifies the class interpreted as the 'rejected' class. + +Reject class can win +~~~~~~~~~~~~~~~~~~~~ + +If set to 'no', 'rejected' class never wins the votes and is never returned as output. + +.. _Doc_BoxAlgorithm_StimulationVoter_Examples: + +Examples +-------- + +Possible usages include aggregating classifier outputs by making a majority vote over them. + +.. _Doc_BoxAlgorithm_StimulationVoter_Miscellaneous: + +Miscellaneous +------------- + +This algorithm is similar to the Voting Classifier but it allows more parameters. Also, all stimulus available at +time step *t* are used to carry out the vote at time step *t*. On the other hand, Stimulation Voter only supports input streams of type Stimulus. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_StreamEndDetector.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_StreamEndDetector.rst new file mode 100644 index 0000000..e0f951f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_StreamEndDetector.rst @@ -0,0 +1,72 @@ +.. _Doc_BoxAlgorithm_StreamEndDetector: + +Stream End Detector +=================== + +.. container:: attribution + + :Author: + Jozef Legeny + :Company: + Mensia Technologies + + +This box waits until it receives an End chunk in the incoming stream and sends +a stimulation once it receives it. + + +.. _Doc_BoxAlgorithm_StreamEndDetector_Inputs: + +Inputs +------ + +This box receives a single input of arbitrary type derived from EBML. It does +not do any specific decoding. + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "EBML Stream", "EBML stream" + + +.. _Doc_BoxAlgorithm_StreamEndDetector_Outputs: + +Outputs +------- + +This box will output a single stimulation after receiving the End chunk. Before +outputting the stimulation, the stream will contain empty chunks in sync with +the input stream. + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output Stimulations", "Stimulations" + + +.. _Doc_BoxAlgorithm_StreamEndDetector_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Stimulation name", "Stimulation", "OVTK_StimulationId_Label_00" + +.. _Doc_BoxAlgorithm_StreamEndDetector_Setting_1: + +Stimulation name +~~~~~~~~~~~~~~~~ + +Name or identifier of the stimulation to be sent by this box. + +.. _Doc_BoxAlgorithm_StreamEndDetector_Examples: + +Examples +-------- + +It can be combined with :ref:`Doc_BoxAlgorithm_PlayerController` to stop a +scenario on file end. + + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_Timeout.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_Timeout.rst new file mode 100644 index 0000000..8d67c5a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/Doc_BoxAlgorithm_Timeout.rst @@ -0,0 +1,66 @@ +.. _Doc_BoxAlgorithm_Timeout: + +Timeout +======= + +.. container:: attribution + + :Author: + Jozef Legény + :Company: + Inria + +.. image:: images/Doc_BoxAlgorithm_Timeout.png + +Sends a stimulation after a period of time without receiving signal. Useful for stopping scenarios after hardware disconnection. + +This box will send a stimulation on its output after it stops receiving an input. The user +can set a duration to wait before considering the output inactive. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input Stream", "Streamed matrix" + +Input Stream +~~~~~~~~~~~~ + +Streamed Matrix input to be monitored. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output Stimulations", "Stimulations" + +Output Stimulations +~~~~~~~~~~~~~~~~~~~ + +Output stimulation. One stimulation will be sent after the timeout is reached. + +.. _Doc_BoxAlgorithm_Timeout_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Timeout delay", "Integer", "5" + "Output Stimulation", "Stimulation", "OVTK_StimulationId_Label_00" + +Timeout delay +~~~~~~~~~~~~~ + +Timeout value. Duration (in seconds) to wait after the last received chunk before the input is considered inactive. + +Output Stimulation +~~~~~~~~~~~~~~~~~~ + +Sitmulation ID to send. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/images/Doc_BoxAlgorithm_ClockStimulator.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/images/Doc_BoxAlgorithm_ClockStimulator.png new file mode 100644 index 0000000..a9e15ef Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/images/Doc_BoxAlgorithm_ClockStimulator.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/images/Doc_BoxAlgorithm_PlayerController.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/images/Doc_BoxAlgorithm_PlayerController.png new file mode 100644 index 0000000..8d34ffc Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/images/Doc_BoxAlgorithm_PlayerController.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/images/Doc_BoxAlgorithm_StimulationMultiplexer.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/images/Doc_BoxAlgorithm_StimulationMultiplexer.png new file mode 100644 index 0000000..e78d2d9 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/images/Doc_BoxAlgorithm_StimulationMultiplexer.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/images/Doc_BoxAlgorithm_StimulationVoter.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/images/Doc_BoxAlgorithm_StimulationVoter.png new file mode 100644 index 0000000..4e838d8 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/images/Doc_BoxAlgorithm_StimulationVoter.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/images/Doc_BoxAlgorithm_Timeout.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/images/Doc_BoxAlgorithm_Timeout.png new file mode 100644 index 0000000..1441578 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/doc/boxes/images/Doc_BoxAlgorithm_Timeout.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmClockStimulator.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmClockStimulator.cpp new file mode 100644 index 0000000..4364da0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmClockStimulator.cpp @@ -0,0 +1,74 @@ +#include "ovpCBoxAlgorithmClockStimulator.h" + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + +bool CBoxAlgorithmClockStimulator::initialize() +{ + const double interstimulationInterval = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + const double minInterstimulationInterval = 0.0001; + OV_ERROR_UNLESS_KRF(!(interstimulationInterval < minInterstimulationInterval), + "Invalid stimulation interval [" << interstimulationInterval << "] (expected value > " << minInterstimulationInterval << ")", + Kernel::ErrorType::BadSetting); + + m_stimulationInterval = interstimulationInterval; + m_nSentStimulation = 0; + + m_stimulationID = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + m_lastStimulationDate = 0; + m_lastEndTime = 0; + + m_encoder.initialize(*this, 0); + + return true; +} + +bool CBoxAlgorithmClockStimulator::uninitialize() +{ + m_encoder.uninitialize(); + return true; +} + +bool CBoxAlgorithmClockStimulator::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmClockStimulator::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + const uint64_t currentTime = getPlayerContext().getCurrentTime(); + + CStimulationSet stimulationSet; + stimulationSet.setStimulationCount(0); + + while (CTime(double(m_nSentStimulation + 1) * m_stimulationInterval).time() < currentTime) + { + m_nSentStimulation += 1; + m_lastStimulationDate = CTime(double(m_nSentStimulation) * m_stimulationInterval).time(); + stimulationSet.appendStimulation(m_stimulationID, m_lastStimulationDate, 0); + } + + if (currentTime == 0) + { + m_encoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, m_lastEndTime, m_lastEndTime); + } + m_encoder.getInputStimulationSet() = &stimulationSet; + + m_encoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, m_lastEndTime, currentTime); + + m_lastEndTime = currentTime; + + return true; +} + +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmClockStimulator.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmClockStimulator.h new file mode 100644 index 0000000..29bdcc5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmClockStimulator.h @@ -0,0 +1,62 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { +class CBoxAlgorithmClockStimulator final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + uint64_t getClockFrequency() override { return (1LL << 32) * 32; } + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_ClockStimulator) + +protected: + + Toolkit::TStimulationEncoder m_encoder; + uint64_t m_stimulationID = 0; + uint64_t m_lastStimulationDate = 0; + uint64_t m_lastEndTime = 0; + + uint64_t m_nSentStimulation = 0; + double m_stimulationInterval = 0; +}; + +class CBoxAlgorithmClockStimulatorDesc final : virtual public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Clock stimulator"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Periodic stimulation generator"); } + CString getDetailedDescription() const override { return CString("Triggers stimulation at fixed frequency"); } + CString getCategory() const override { return CString("Stimulation"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ClockStimulator; } + IPluginObject* create() override { return new CBoxAlgorithmClockStimulator; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addOutput("Generated stimulations", OV_TypeId_Stimulations); + prototype.addSetting("Interstimulation interval (in sec)", OV_TypeId_Float, "1.0"); + prototype.addSetting("Stimulation", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00"); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ClockStimulatorDesc) +}; +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmPlayerController.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmPlayerController.cpp new file mode 100644 index 0000000..57cc254 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmPlayerController.cpp @@ -0,0 +1,84 @@ +#include "ovpCBoxAlgorithmPlayerController.h" + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + +bool CBoxAlgorithmPlayerController::initialize() +{ + m_stimulationID = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_actionID = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + m_decoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_decoder->initialize(); + + ip_buffer.initialize(m_decoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + op_stimulationSet.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + + return true; +} + +bool CBoxAlgorithmPlayerController::uninitialize() +{ + op_stimulationSet.uninitialize(); + ip_buffer.uninitialize(); + + if (m_decoder) + { + m_decoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_decoder); + m_decoder = nullptr; + } + + return true; +} + +bool CBoxAlgorithmPlayerController::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmPlayerController::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) + { + ip_buffer = boxContext.getInputChunk(0, i); + m_decoder->process(); + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) { } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + IStimulationSet* stimSet = op_stimulationSet; + for (size_t j = 0; j < stimSet->getStimulationCount(); ++j) + { + if (stimSet->getStimulationIdentifier(j) == m_stimulationID) + { + this->getLogManager() << Kernel::LogLevel_Trace << "Received stimulation [" + << this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, m_stimulationID) << "] causing action [" + << this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_PlayerAction, m_actionID) << "]\n"; + + bool res = false; + if (m_actionID == OV_TypeId_PlayerAction_Play.id()) { res = this->getPlayerContext().play(); } + if (m_actionID == OV_TypeId_PlayerAction_Stop.id()) { res = this->getPlayerContext().stop(); } + if (m_actionID == OV_TypeId_PlayerAction_Pause.id()) { res = this->getPlayerContext().pause(); } + if (m_actionID == OV_TypeId_PlayerAction_Forward.id()) { res = this->getPlayerContext().forward(); } + + OV_ERROR_UNLESS_KRF(res, "Failed to request player action [" + << this->getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_PlayerAction, m_actionID) << "]", + Kernel::ErrorType::BadConfig); + } + } + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd)) { } + + boxContext.markInputAsDeprecated(0, i); + } + + return true; +} + +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmPlayerController.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmPlayerController.h new file mode 100644 index 0000000..906dd78 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmPlayerController.h @@ -0,0 +1,63 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { +class CBoxAlgorithmPlayerController final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_PlayerController) + +protected: + + Kernel::IAlgorithmProxy* m_decoder = nullptr; + Kernel::TParameterHandler ip_buffer; + Kernel::TParameterHandler op_stimulationSet; + + uint64_t m_stimulationID = 0; + uint64_t m_actionID = 0; +}; + +class CBoxAlgorithmPlayerControllerDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Player Controller"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Controls the player execution"); } + + CString getDetailedDescription() const override { return CString("Add some settings to configure the way you want to control the player"); } + + CString getCategory() const override { return CString("Stimulation"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_PlayerController; } + IPluginObject* create() override { return new CBoxAlgorithmPlayerController; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Stimulations", OV_TypeId_Stimulations); + prototype.addSetting("Stimulation name", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00"); + prototype.addSetting("Action to perform", OV_TypeId_PlayerAction, OV_TypeId_PlayerAction_Pause.toString()); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_PlayerControllerDesc) +}; +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationMultiplexer.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationMultiplexer.cpp new file mode 100644 index 0000000..ded4ced --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationMultiplexer.cpp @@ -0,0 +1,112 @@ +#include "ovpCBoxAlgorithmStimulationMultiplexer.h" + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + + +bool CBoxAlgorithmStimulationMultiplexer::initialize() +{ + const Kernel::IBox& staticBoxContext = this->getStaticBoxContext(); + + m_decoders.resize(staticBoxContext.getInputCount()); + size_t index = 0; + for (auto& stimulationDecoder : m_decoders) + { + stimulationDecoder.initialize(*this, index); + index += 1; + } + + m_encoder.initialize(*this, 0); + + m_decoderEndTimes = std::vector(staticBoxContext.getInputCount(), 0ULL); + + m_lastStartTime = 0; + m_lastEndTime = 0; + m_wasHeaderSent = false; + + return true; +} + +bool CBoxAlgorithmStimulationMultiplexer::uninitialize() +{ + for (auto& stimulationDecoder : m_decoders) { stimulationDecoder.uninitialize(); } + + m_encoder.uninitialize(); + + return true; +} + +bool CBoxAlgorithmStimulationMultiplexer::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmStimulationMultiplexer::process() +{ + const Kernel::IBox& staticBoxContext = this->getStaticBoxContext(); + Kernel::IBoxIO& dynamicBoxContext = this->getDynamicBoxContext(); + + if (!m_wasHeaderSent) + { + m_encoder.encodeHeader(); + dynamicBoxContext.markOutputAsReadyToSend(0, m_lastEndTime, m_lastEndTime); + m_wasHeaderSent = true; + } + + uint64_t earliestReceivedChunkEndTime = 0xffffffffffffffffULL; + + for (size_t input = 0; input < staticBoxContext.getInputCount(); ++input) + { + for (size_t chunk = 0; chunk < dynamicBoxContext.getInputChunkCount(input); ++chunk) + { + m_decoders[input].decode(chunk); + + if (m_decoders[input].isBufferReceived()) + { + for (size_t stimulation = 0; stimulation < m_decoders[input].getOutputStimulationSet()->getStimulationCount(); ++stimulation) + { + m_stimulations.insert(std::make_pair(m_decoders[input].getOutputStimulationSet()->getStimulationDate(stimulation), + std::make_tuple( + m_decoders[input].getOutputStimulationSet()->getStimulationIdentifier(stimulation), + m_decoders[input].getOutputStimulationSet()->getStimulationDate(stimulation), + m_decoders[input].getOutputStimulationSet()->getStimulationDuration(stimulation)))); + } + } + + m_decoderEndTimes[input] = dynamicBoxContext.getInputChunkEndTime(input, chunk); + } + + if (earliestReceivedChunkEndTime > m_decoderEndTimes[input]) { earliestReceivedChunkEndTime = m_decoderEndTimes[input]; } + } + + if (earliestReceivedChunkEndTime >= m_lastEndTime) + { + m_encoder.getInputStimulationSet()->clear(); + + for (auto stimulation = m_stimulations.begin(); stimulation != m_stimulations.end();) + { + if (stimulation->first < earliestReceivedChunkEndTime) + { + m_encoder.getInputStimulationSet()->appendStimulation(std::get<0>(stimulation->second), std::get<1>(stimulation->second), + std::get<2>(stimulation->second)); + stimulation = m_stimulations.erase(stimulation); + } + else { ++stimulation; } + } + + m_encoder.encodeBuffer(); + + dynamicBoxContext.markOutputAsReadyToSend(0, m_lastEndTime, earliestReceivedChunkEndTime); + + m_lastStartTime = m_lastEndTime; + m_lastEndTime = earliestReceivedChunkEndTime; + } + + return true; +} + +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationMultiplexer.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationMultiplexer.h new file mode 100644 index 0000000..921a462 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationMultiplexer.h @@ -0,0 +1,103 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { +class CBoxAlgorithmStimulationMultiplexer final : public Toolkit::TBoxAlgorithm +{ +public: + + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_StimulationMultiplexer) + +private: + + std::vector> m_decoders; + Toolkit::TStimulationEncoder m_encoder; + + std::vector m_decoderEndTimes; + + uint64_t m_lastStartTime = 0; + uint64_t m_lastEndTime = 0; + bool m_wasHeaderSent = false; + + std::multimap> m_stimulations; +}; + +class CBoxAlgorithmStimulationMultiplexerListener final : public Toolkit::TBoxListener +{ +public: + + bool check(Kernel::IBox& box) const + { + for (size_t input = 0; input < box.getInputCount(); ++input) + { + box.setInputName(input, ("Input stimulations " + std::to_string(input + 1)).c_str()); + box.setInputType(input, OV_TypeId_Stimulations); + } + + return true; + } + + bool onInputRemoved(Kernel::IBox& box, const size_t /*index*/) override { return this->check(box); } + bool onInputAdded(Kernel::IBox& box, const size_t /*index*/) override { return this->check(box); } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmStimulationMultiplexerDesc final : public IBoxAlgorithmDesc +{ +public: + + void release() override { } + + CString getName() const override { return CString("Stimulation multiplexer"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Merges several stimulation streams into one."); } + + CString getDetailedDescription() const override + { + return CString( + "The stimulations are ordered according to their start date. Thus each time all the input have chunks covering a period of time, a new output chunk is sent. This box may eventually produce output chunk reflecting a different duration depending on the inputs."); + } + + CString getCategory() const override { return CString("Streaming"); } + CString getVersion() const override { return CString("1.1"); } + CString getStockItemName() const override { return CString("gtk-sort-ascending"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_StimulationMultiplexer; } + IPluginObject* create() override { return new CBoxAlgorithmStimulationMultiplexer; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmStimulationMultiplexerListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input stimulations 1", OV_TypeId_Stimulations); + prototype.addInput("Input stimulations 2", OV_TypeId_Stimulations); + prototype.addOutput("Multiplexed stimulations", OV_TypeId_Stimulations); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addInputSupport(OV_TypeId_Stimulations); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_StimulationMultiplexerDesc) +}; +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationVoter.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationVoter.cpp new file mode 100644 index 0000000..9438dc1 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationVoter.cpp @@ -0,0 +1,209 @@ +#include "ovpCBoxAlgorithmStimulationVoter.h" + +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + +bool CBoxAlgorithmStimulationVoter::initialize() +{ + const Kernel::IBox& boxContext = this->getStaticBoxContext(); + + OV_ERROR_UNLESS_KRF(boxContext.getInputCount() == 1, "Invalid number of inputs [" << boxContext.getInputCount() << "] (expected 1 single input)", + Kernel::ErrorType::BadInput); + + CIdentifier typeID; + boxContext.getInputType(0, typeID); + + OV_ERROR_UNLESS_KRF(typeID == OV_TypeId_Stimulations, "Invalid input type [" << typeID.str() << "] (expected OV_TypeId_Stimulations type)", + Kernel::ErrorType::BadInput); + + m_encoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationEncoder)); + m_encoder->initialize(); + + m_decoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_decoder->initialize(); + + ip_buffer.initialize(m_decoder->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + op_stimulationSet.initialize(m_decoder->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + + m_minimumVotes = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_timeWindow = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_clearVotes = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2)); + m_outputDateMode = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3)); + m_rejectClassLabel = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + m_rejectClassCanWin = uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5)); + + this->getLogManager() << Kernel::LogLevel_Debug << "Vote clear mode " << m_clearVotes << ", timestamp at " << m_outputDateMode << ", reject mode " << + m_rejectClassCanWin << "\n"; + + m_latestStimulusDate = 0; + m_lastTime = 0; + + m_oStimulusDeque.clear(); + + return true; +} + +bool CBoxAlgorithmStimulationVoter::uninitialize() +{ + m_decoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_decoder); + + m_encoder->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_encoder); + + return true; +} + +bool CBoxAlgorithmStimulationVoter::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmStimulationVoter::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + Kernel::TParameterHandler ip_stimSet(m_encoder->getInputParameter(OVP_GD_Algorithm_StimulationEncoder_InputParameterId_StimulationSet)); + Kernel::TParameterHandler op_buffer(m_encoder->getOutputParameter(OVP_GD_Algorithm_StimulationEncoder_OutputParameterId_EncodedMemoryBuffer)); + op_buffer = boxContext.getOutputChunk(0); + + // Push the stimulations to a queue + bool newStimulus = false; + for (size_t j = 0; j < boxContext.getInputChunkCount(0); ++j) + { + ip_buffer = boxContext.getInputChunk(0, j); + m_decoder->process(); + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader)) { } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer)) + { + for (size_t k = 0; k < op_stimulationSet->getStimulationCount(); ++k) + { + uint64_t stimulationId = op_stimulationSet->getStimulationIdentifier(k); + uint64_t stimulationDate = op_stimulationSet->getStimulationDate(k); + m_latestStimulusDate = std::max(m_latestStimulusDate, stimulationDate); + if (CTime(m_latestStimulusDate - stimulationDate).toSeconds() <= m_timeWindow) + { + // Stimulus is fresh, append + m_oStimulusDeque.push_back(std::pair(stimulationId, stimulationDate)); + newStimulus = true; + } + } + } + if (m_decoder->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd)) { } + boxContext.markInputAsDeprecated(0, j); + } + + if (m_oStimulusDeque.empty() || !newStimulus) { return true; } + + // Always clear too old votes that have slipped off the time window. The time window is relative to the time of the latest stimulus received. + while (!m_oStimulusDeque.empty()) + { + const uint64_t frontDate = m_oStimulusDeque.front().second; + if (CTime(m_latestStimulusDate - frontDate).toSeconds() > m_timeWindow) + { + // Drop it + m_oStimulusDeque.pop_front(); + } + else + { + // Assume stimuli are received in time order. Since the stimulus at the head wasn't too old, the rest aren't either + break; + } + } + + this->getLogManager() << Kernel::LogLevel_Debug << "Queue size is " << m_oStimulusDeque.size() << "\n"; + + if (m_oStimulusDeque.size() < m_minimumVotes) + { + // Not enough stimuli to vote + return true; + } + + std::map lastSeen; // The last occurrence of each type in time + std::map votes; // Histogram of votes + + // Make a histogram of the votes + for (const auto& stim : m_oStimulusDeque) + { + const uint64_t type = stim.first; + const uint64_t date = stim.second; + + votes[type]++; + lastSeen[type] = std::max(lastSeen[type], date); + // Never pop here, only pop on expiration + } + + // Find the winner + uint64_t resultClassLabel = m_rejectClassLabel; + size_t maxVotes = 0; + + for (const auto& vote : votes) + { + const uint64_t type = vote.first; + const size_t nVotes = vote.second; // can not be zero by construction above + + if (m_rejectClassCanWin == OVP_TypeId_Voting_RejectClass_CanWin_No && type == m_rejectClassLabel) + { + // Reject class never wins + continue; + } + + if (nVotes > maxVotes) + { + resultClassLabel = type; + maxVotes = nVotes; + } + else if (nVotes == maxVotes) + { + // Break ties arbitrarily + if (System::Math::random0To1() > 0.5) + { + resultClassLabel = type; + maxVotes = nVotes; + } + } + } + + if (m_lastTime == 0) + { + m_encoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeHeader); + boxContext.markOutputAsReadyToSend(0, m_lastTime, m_lastTime); + } + + if (m_rejectClassCanWin == OVP_TypeId_Voting_RejectClass_CanWin_No && resultClassLabel == m_rejectClassLabel) + { + this->getLogManager() << Kernel::LogLevel_Debug << "Winning class " << resultClassLabel << " was 'rejected' with " << maxVotes << "votes. Dropped.\n"; + } + else + { + const uint64_t currentTime = getPlayerContext().getCurrentTime(); + + uint64_t timeStamp; + if (m_outputDateMode == OVP_TypeId_Voting_OutputTime_Vote) { timeStamp = currentTime; } + else if (m_outputDateMode == OVP_TypeId_Voting_OutputTime_Winner) { timeStamp = lastSeen[resultClassLabel]; } + else { timeStamp = m_latestStimulusDate; } + + this->getLogManager() << Kernel::LogLevel_Debug << "Appending winning stimulus " << resultClassLabel << " at " << timeStamp << " (" << maxVotes << " votes)\n"; + + ip_stimSet->setStimulationCount(0); + ip_stimSet->appendStimulation(resultClassLabel, timeStamp, 0); + m_encoder->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeBuffer); + boxContext.markOutputAsReadyToSend(0, m_lastTime, currentTime); + m_lastTime = currentTime; + + if (m_clearVotes == OVP_TypeId_Voting_ClearVotes_AfterOutput) { m_oStimulusDeque.clear(); } + } + + return true; +} + +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationVoter.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationVoter.h new file mode 100644 index 0000000..a9b6f0e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStimulationVoter.h @@ -0,0 +1,104 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { +class CBoxAlgorithmStimulationVoter final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_StimulationVoter) + +protected: + + uint64_t m_minimumVotes = 0; + double m_timeWindow = 0; + uint64_t m_rejectClassLabel = 0; + CIdentifier m_clearVotes = CIdentifier::undefined(); + CIdentifier m_outputDateMode = CIdentifier::undefined(); + CIdentifier m_rejectClassCanWin = CIdentifier::undefined(); + +private: + + Kernel::IAlgorithmProxy* m_encoder = nullptr; + Kernel::IAlgorithmProxy* m_decoder = nullptr; + Kernel::TParameterHandler ip_buffer; + Kernel::TParameterHandler op_stimulationSet; + + std::deque> m_oStimulusDeque; // + + uint64_t m_latestStimulusDate = 0; + uint64_t m_lastTime = 0; +}; + + +class CBoxAlgorithmStimulationVoterListener final : public Toolkit::TBoxListener +{ +public: + + CBoxAlgorithmStimulationVoterListener() : m_inputTypeID(OV_TypeId_Stimulations) { } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) + +protected: + + CIdentifier m_inputTypeID = CIdentifier::undefined(); +}; + +class CBoxAlgorithmStimulationVoterDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Stimulation Voter"); } + CString getAuthorName() const override { return CString("Jussi T. Lindgren"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Performs majority vote on the input stimuli"); } + + CString getDetailedDescription() const override + { + return CString( + "Votes the most frequent stimulus ID in a given time window. Outputs the winning stimulus type. Several options are possible. To process multiple inputs, use Stimulation Multiplexer first."); + } + + CString getCategory() const override { return CString("Streaming"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_StimulationVoter; } + IPluginObject* create() override { return new CBoxAlgorithmStimulationVoter; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Stimulus input", OV_TypeId_Stimulations); + prototype.addOutput("Selected stimulus", OV_TypeId_Stimulations); + prototype.addSetting("Number of stimuli required for vote", OV_TypeId_Integer, "4"); + prototype.addSetting("Time window (secs)", OV_TypeId_Float, "2"); + prototype.addSetting("Clear votes", OVP_TypeId_Voting_ClearVotes, "After output"); + prototype.addSetting("Output timestamp", OVP_TypeId_Voting_OutputTime, "Time of last voting stimulus"); + prototype.addSetting("Reject class label", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00"); + prototype.addSetting("Reject class can win", OVP_TypeId_Voting_RejectClass_CanWin, "No"); + + return true; + } + + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmStimulationVoterListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_StimulationVoterDesc) +}; +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStreamEndDetector.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStreamEndDetector.cpp new file mode 100644 index 0000000..efdd394 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStreamEndDetector.cpp @@ -0,0 +1,100 @@ +#include "ovpCBoxAlgorithmStreamEndDetector.h" + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + +bool CBoxAlgorithmStreamEndDetector::initialize() +{ + m_stimulationID = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), settingStimulationNameID()); + + OV_FATAL_UNLESS_K(this->getStaticBoxContext().getInterfacorIndex(Kernel::EBoxInterfacorType::Input, inputEBMLId(), m_inputEBMLIdx), + "Box does not have input with identifier " << inputEBMLId(), Kernel::ErrorType::Internal); + OV_FATAL_UNLESS_K(this->getStaticBoxContext().getInterfacorIndex(Kernel::EBoxInterfacorType::Output, outputStimulationsID(), m_outputStimulationsIdx), + "Box does not have output with identifier " << outputStimulationsID(), Kernel::ErrorType::Internal); + + m_decoder.initialize(*this, m_inputEBMLIdx); + m_encoder.initialize(*this, m_outputStimulationsIdx); + + m_isHeaderSent = false; + m_endDate = 0; + m_currentChunkEndDate = 0; + m_endState = EEndState::WaitingForEnd; + m_previousTime = 0; + + return true; +} + +bool CBoxAlgorithmStreamEndDetector::uninitialize() +{ + m_decoder.uninitialize(); + m_encoder.uninitialize(); + + return true; +} + +bool CBoxAlgorithmStreamEndDetector::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmStreamEndDetector::process() +{ + Kernel::IBoxIO& dynamicBoxContext = this->getDynamicBoxContext(); + + for (size_t chunk = 0; chunk < dynamicBoxContext.getInputChunkCount(m_inputEBMLIdx); ++chunk) + { + OV_ERROR_UNLESS_KRF(m_decoder.decode(chunk), "Failed to decode chunk", Kernel::ErrorType::Internal); + + // We can not receive anything before this date anymore, thus we can send an empty stream + m_currentChunkEndDate = dynamicBoxContext.getInputChunkStartTime(m_inputEBMLIdx, chunk); + if (m_decoder.isEndReceived()) + { + m_endState = EEndState::EndReceived; + m_endDate = dynamicBoxContext.getInputChunkEndTime(m_inputEBMLIdx, chunk); + // As this is the last chunk, we make it so it ends at the same time as the received End chunk + m_currentChunkEndDate = dynamicBoxContext.getInputChunkEndTime(m_inputEBMLIdx, chunk); + } + } + + if (!m_isHeaderSent) + { + m_encoder.encodeHeader(); + this->getDynamicBoxContext().markOutputAsReadyToSend(0, 0, 0); + m_isHeaderSent = true; + } + + IStimulationSet* stimulationSet = m_encoder.getInputStimulationSet(); + stimulationSet->clear(); + + + // If the timeout is reached we send the stimulation on the output 0 + if (m_endState == EEndState::EndReceived) + { + stimulationSet->appendStimulation(m_stimulationID, m_endDate, 0); + m_endState = EEndState::StimulationSent; + } + + if (m_endState != EEndState::Finished && (m_endState == EEndState::StimulationSent || m_previousTime != m_currentChunkEndDate)) + { + // we need to send an empty chunk even if there's no stim + m_encoder.encodeBuffer(); + this->getDynamicBoxContext().markOutputAsReadyToSend(0, m_previousTime, m_currentChunkEndDate); + } + + m_previousTime = m_currentChunkEndDate; + + if (m_endState == EEndState::StimulationSent) + { + m_encoder.encodeEnd(); + this->getDynamicBoxContext().markOutputAsReadyToSend(0, m_previousTime, m_previousTime); + m_endState = EEndState::Finished; + } + + return true; +} + +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStreamEndDetector.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStreamEndDetector.h new file mode 100644 index 0000000..b8b7c74 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmStreamEndDetector.h @@ -0,0 +1,81 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { +class CBoxAlgorithmStreamEndDetector final : public Toolkit::TBoxAlgorithm +{ +public: + static CIdentifier inputEBMLId() { return CIdentifier(0x0, 0x1); } + static CIdentifier outputStimulationsID() { return CIdentifier(0x1, 0x1); } + static CIdentifier settingStimulationNameID() { return CIdentifier(0x2, 0x1); } + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_StreamEndDetector) + +protected: + + Toolkit::TStreamStructureDecoder m_decoder; + Toolkit::TStimulationEncoder m_encoder; + + uint64_t m_stimulationID = 0; + uint64_t m_actionID = 0; + +private: + enum class EEndState + { + WaitingForEnd, + EndReceived, + StimulationSent, + Finished + }; + + uint64_t m_endDate = 0; + uint64_t m_currentChunkEndDate = 0; + uint64_t m_previousTime = 0; + size_t m_inputEBMLIdx = 0; + size_t m_outputStimulationsIdx = 0; + bool m_isHeaderSent = false; + EEndState m_endState = EEndState::WaitingForEnd; +}; + +class CBoxAlgorithmStreamEndDetectorDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Stream End Detector"); } + CString getAuthorName() const override { return CString("Jozef Legeny"); } + CString getAuthorCompanyName() const override { return CString("Mensia Technologies"); } + CString getShortDescription() const override { return CString("Sends a stimulation upon receiving an End chunk"); } + CString getDetailedDescription() const override { return CString("Sends a stimulation upon receiving an End chunk"); } + CString getCategory() const override { return CString("Stimulation"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("2.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_StreamEndDetector; } + IPluginObject* create() override { return new CBoxAlgorithmStreamEndDetector; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("EBML Stream", OV_TypeId_EBMLStream, CBoxAlgorithmStreamEndDetector::inputEBMLId()); + prototype.addOutput("Output Stimulations", OV_TypeId_Stimulations, CBoxAlgorithmStreamEndDetector::outputStimulationsID()); + prototype.addSetting("Stimulation name", OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00", false, + CBoxAlgorithmStreamEndDetector::settingStimulationNameID()); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_StreamEndDetectorDesc) +}; +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmTimeout.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmTimeout.cpp new file mode 100644 index 0000000..8a7bf45 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmTimeout.cpp @@ -0,0 +1,106 @@ +#include "ovpCBoxAlgorithmTimeout.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + +bool CBoxAlgorithmTimeout::initialize() +{ + m_timeoutState = ETimeoutState::No; + + m_encoder.initialize(*this, 0); + + const double timeout = double(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)); + OV_ERROR_UNLESS_KRF(timeout > 0, "Timeout delay value must be positive and non-zero", Kernel::ErrorType::BadSetting); + OV_ERROR_UNLESS_KRF(timeout == std::floor(timeout), "Timeout delay value is not an integer", Kernel::ErrorType::BadSetting); + + m_timeout = uint64_t(timeout) << 32; + m_stimulationToSend = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + m_lastTimePolled = 0; + m_previousTime = 0; + m_isHeaderSent = false; + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmTimeout::uninitialize() +{ + m_encoder.uninitialize(); + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmTimeout::processClock(Kernel::CMessageClock& /*msg*/) +{ + // if there was nothing received on the input for a period of time we raise the + // timeout flag and let the box send a stimulation + if (m_timeoutState == ETimeoutState::No && getPlayerContext().getCurrentTime() > m_lastTimePolled + m_timeout) + { + this->getLogManager() << Kernel::LogLevel_Trace << "Timeout reached at time " << CTime(this->getPlayerContext().getCurrentTime()) << "\n"; + m_timeoutState = ETimeoutState::Occurred; + } + + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} +/*******************************************************************************/ + +uint64_t CBoxAlgorithmTimeout::getClockFrequency() { return 16LL << 32; } // the box clock frequency +/*******************************************************************************/ + +bool CBoxAlgorithmTimeout::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + // every time we receive input we store the last kernel time + m_lastTimePolled = this->getPlayerContext().getCurrentTime(); + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmTimeout::process() +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + + // Discard input data + for (size_t i = 0; i < boxCtx.getInputChunkCount(0); ++i) { boxCtx.markInputAsDeprecated(0, i); } + + // Encoding the header + if (!m_isHeaderSent) + { + m_encoder.encodeHeader(); + this->getDynamicBoxContext().markOutputAsReadyToSend(0, 0, 0); + m_isHeaderSent = true; + } + + IStimulationSet* stimSet = m_encoder.getInputStimulationSet(); + stimSet->clear(); + + const uint64_t date = this->getPlayerContext().getCurrentTime(); + + // If the timeout is reached we send the stimulation on the output 0 + if (m_timeoutState == ETimeoutState::Occurred) + { + stimSet->appendStimulation(m_stimulationToSend, date, 0); + m_timeoutState = ETimeoutState::Sent; + } + + // we need to send an empty chunk even if there's no stim + m_encoder.encodeBuffer(); + this->getDynamicBoxContext().markOutputAsReadyToSend(0, m_previousTime, date); + + m_previousTime = date; + + return true; +} + +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmTimeout.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmTimeout.h new file mode 100644 index 0000000..c986ae8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/box-algorithms/ovpCBoxAlgorithmTimeout.h @@ -0,0 +1,92 @@ +#pragma once + +#include "../ovp_defines.h" + +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + +/** + * \class CBoxAlgorithmTimeout + * \author Jozef Legény (Inria) + * \date Thu Mar 21 14:40:23 2013 + * \brief The class CBoxAlgorithmTimeout describes the box Timeout. + * + */ +class CBoxAlgorithmTimeout final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool processInput(const size_t index) override; + uint64_t getClockFrequency() override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_Timeout) + +protected: + Toolkit::TStimulationEncoder m_encoder; + +private: + enum class ETimeoutState { No, Occurred, Sent }; + + ETimeoutState m_timeoutState = ETimeoutState::No; + bool m_isHeaderSent = false; + + uint64_t m_timeout = 0; + uint64_t m_lastTimePolled = 0; + uint64_t m_previousTime = 0; + uint64_t m_stimulationToSend = 0; +}; + +/** + * \class CBoxAlgorithmTimeoutDesc + * \author Jozef Legény (Inria) + * \date Thu Mar 21 14:40:23 2013 + * \brief Descriptor of the box Timeout. + * + */ +class CBoxAlgorithmTimeoutDesc final : virtual public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return "Timeout"; } + CString getAuthorName() const override { return "Jozef Legény"; } + CString getAuthorCompanyName() const override { return "Inria"; } + CString getShortDescription() const override { return "Sends a stimulation after a period of time without receiving signal"; } + CString getDetailedDescription() const override + { + return "Sends a stimulation after a period of time without receiving signal. Useful for stopping scenarios after hardware disconnection."; + } + + CString getCategory() const override { return "Stimulation"; } + CString getVersion() const override { return "1.1"; } + CString getSoftwareComponent() const override { return "openvibe-sdk"; } + CString getAddedSoftwareVersion() const override { return "0.0.0"; } + CString getUpdatedSoftwareVersion() const override { return "0.0.0"; } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_Timeout; } + IPluginObject* create() override { return new CBoxAlgorithmTimeout; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input Stream",OV_TypeId_StreamedMatrix); + + prototype.addOutput("Output Stimulations",OV_TypeId_Stimulations); + + prototype.addSetting("Timeout delay",OV_TypeId_Integer, "5"); + prototype.addSetting("Output Stimulation",OV_TypeId_Stimulation, "OVTK_StimulationId_Label_00"); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_TimeoutDesc) +}; + +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/ovp_defines.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/ovp_defines.h new file mode 100644 index 0000000..72f3320 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/ovp_defines.h @@ -0,0 +1,41 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_ClockStimulator OpenViBE::CIdentifier(0x4F756D3F, 0x29FF0B96) +#define OVP_ClassId_BoxAlgorithm_ClockStimulatorDesc OpenViBE::CIdentifier(0x4FD067E9, 0x740D2AF0) +#define OVP_ClassId_BoxAlgorithm_PlayerController OpenViBE::CIdentifier(0x5F426DCE, 0x08456E13) +#define OVP_ClassId_BoxAlgorithm_PlayerControllerDesc OpenViBE::CIdentifier(0x2E4142D7, 0x3F957E25) +#define OVP_ClassId_BoxAlgorithm_StimulationMultiplexer OpenViBE::CIdentifier(0x07DB4EFA, 0x472B0938) +#define OVP_ClassId_BoxAlgorithm_StimulationMultiplexerDesc OpenViBE::CIdentifier(0x79EF4E4D, 0x178F09E6) +#define OVP_ClassId_BoxAlgorithm_StimulationVoter OpenViBE::CIdentifier(0x2BBD61FC, 0x041A4EDB) +#define OVP_ClassId_BoxAlgorithm_StimulationVoterDesc OpenViBE::CIdentifier(0x1C36287C, 0x6F143FBF) +#define OVP_ClassId_BoxAlgorithm_StreamEndDetector OpenViBE::CIdentifier(0x44F2725A, 0x8E922233) +#define OVP_ClassId_BoxAlgorithm_StreamEndDetectorDesc OpenViBE::CIdentifier(0x6DD8B6EA, 0xC581B3FC) +#define OVP_ClassId_BoxAlgorithm_Timeout OpenViBE::CIdentifier(0x24FCD292, 0x5C8F6AA8) +#define OVP_ClassId_BoxAlgorithm_TimeoutDesc OpenViBE::CIdentifier(0xB3D90844, 0x79A4CF6D) + +// Type definitions +//--------------------------------------------------------------------------------------------------- +#define OVP_TypeId_Voting_ClearVotes OpenViBE::CIdentifier(0x17AE30F8, 0x40B57661) +#define OVP_TypeId_Voting_ClearVotes_AfterOutput OpenViBE::CIdentifier(0x7FA81A20, 0x484023F9) +#define OVP_TypeId_Voting_ClearVotes_WhenExpires OpenViBE::CIdentifier(0x02766639, 0x00B155B4) +#define OVP_TypeId_Voting_OutputTime OpenViBE::CIdentifier(0x48583E8F, 0x47F22462) +#define OVP_TypeId_Voting_OutputTime_Vote OpenViBE::CIdentifier(0x2F37507F, 0x00C06761) +#define OVP_TypeId_Voting_OutputTime_Winner OpenViBE::CIdentifier(0x72416689, 0x17673658) +#define OVP_TypeId_Voting_OutputTime_Last OpenViBE::CIdentifier(0x4F2830DB, 0x716C2930) +#define OVP_TypeId_Voting_RejectClass_CanWin OpenViBE::CIdentifier(0x442F2F14, 0x7A17336C) +#define OVP_TypeId_Voting_RejectClass_CanWin_Yes OpenViBE::CIdentifier(0x40011974, 0x54BB3C71) +#define OVP_TypeId_Voting_RejectClass_CanWin_No OpenViBE::CIdentifier(0x275B746A, 0x480B302C) + +#define OV_TypeId_PlayerAction OpenViBE::CIdentifier(0xCC14D8D6, 0xF27ECB73) +#define OV_TypeId_PlayerAction_Play OpenViBE::CIdentifier(0x6BD7E1B3, 0x85E75066) +#define OV_TypeId_PlayerAction_Stop OpenViBE::CIdentifier(0x8A72885E, 0xD537A9A4) +#define OV_TypeId_PlayerAction_Pause OpenViBE::CIdentifier(0xD2FA4573, 0xE7F1D11D) +#define OV_TypeId_PlayerAction_Forward OpenViBE::CIdentifier(0xE43E9888, 0x33A361ED) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/ovp_main.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/ovp_main.cpp new file mode 100644 index 0000000..30ae97f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stimulation/src/ovp_main.cpp @@ -0,0 +1,46 @@ +#include "ovp_defines.h" + +#include "box-algorithms/ovpCBoxAlgorithmClockStimulator.h" +#include "box-algorithms/ovpCBoxAlgorithmPlayerController.h" + +#include "box-algorithms/ovpCBoxAlgorithmStimulationMultiplexer.h" +#include "box-algorithms/ovpCBoxAlgorithmStimulationVoter.h" + +#include "box-algorithms/ovpCBoxAlgorithmStreamEndDetector.h" +#include "box-algorithms/ovpCBoxAlgorithmTimeout.h" + +namespace OpenViBE { +namespace Plugins { +namespace Stimulation { + +OVP_Declare_Begin() + context.getTypeManager().registerEnumerationType(OV_TypeId_PlayerAction, "Player Action"); + context.getTypeManager().registerEnumerationEntry(OV_TypeId_PlayerAction, "Play", OV_TypeId_PlayerAction_Play.id()); + context.getTypeManager().registerEnumerationEntry(OV_TypeId_PlayerAction, "Stop", OV_TypeId_PlayerAction_Stop.id()); + context.getTypeManager().registerEnumerationEntry(OV_TypeId_PlayerAction, "Pause", OV_TypeId_PlayerAction_Pause.id()); + context.getTypeManager().registerEnumerationEntry(OV_TypeId_PlayerAction, "Forward", OV_TypeId_PlayerAction_Forward.id()); + + OVP_Declare_New(CBoxAlgorithmClockStimulatorDesc); + OVP_Declare_New(CBoxAlgorithmPlayerControllerDesc); + OVP_Declare_New(CBoxAlgorithmStimulationMultiplexerDesc); + + OVP_Declare_New(CBoxAlgorithmStreamEndDetectorDesc); + OVP_Declare_New(CBoxAlgorithmTimeoutDesc); + + OVP_Declare_New(CBoxAlgorithmStimulationVoterDesc); + context.getTypeManager().registerEnumerationType(OVP_TypeId_Voting_ClearVotes, "Clear votes"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Voting_ClearVotes, "When expires", OVP_TypeId_Voting_ClearVotes_WhenExpires.id()); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Voting_ClearVotes, "After output", OVP_TypeId_Voting_ClearVotes_AfterOutput.id()); + context.getTypeManager().registerEnumerationType(OVP_TypeId_Voting_OutputTime, "Output time"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Voting_OutputTime, "Time of voting", OVP_TypeId_Voting_OutputTime_Vote.id()); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Voting_OutputTime, "Time of last winning stimulus", OVP_TypeId_Voting_OutputTime_Winner.id()); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Voting_OutputTime, "Time of last voting stimulus", OVP_TypeId_Voting_OutputTime_Last.id()); + context.getTypeManager().registerEnumerationType(OVP_TypeId_Voting_RejectClass_CanWin, "Reject can win"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Voting_RejectClass_CanWin, "Yes", OVP_TypeId_Voting_RejectClass_CanWin_Yes.id()); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_Voting_RejectClass_CanWin, "No", OVP_TypeId_Voting_RejectClass_CanWin_No.id()); + +OVP_Declare_End() + +} // namespace Stimulation +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/CMakeLists.txt new file mode 100644 index 0000000..314a318 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/CMakeLists.txt @@ -0,0 +1,37 @@ +PROJECT(openvibe-plugins-sdk-stream-codecs) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl) +INCLUDE("FindSourceRCProperties") +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCAcquisitionDecoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCAcquisitionDecoder.cpp new file mode 100644 index 0000000..50fe290 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCAcquisitionDecoder.cpp @@ -0,0 +1,144 @@ +#include "ovpCAcquisitionDecoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +CAcquisitionDecoder::CAcquisitionDecoder() {} + +// ________________________________________________________________________________________________________________ +// + +bool CAcquisitionDecoder::initialize() +{ + CEBMLBaseDecoder::initialize(); + + op_bufferDuration.initialize(getOutputParameter(OVP_Algorithm_AcquisitionDecoder_OutputParameterId_BufferDuration)); + op_experimentInfoStream.initialize(getOutputParameter(OVP_Algorithm_AcquisitionDecoder_OutputParameterId_ExperimentInfoStream)); + op_signalStream.initialize(getOutputParameter(OVP_Algorithm_AcquisitionDecoder_OutputParameterId_SignalStream)); + op_stimulationStream.initialize(getOutputParameter(OVP_Algorithm_AcquisitionDecoder_OutputParameterId_StimulationStream)); + op_channelLocalisationStream.initialize(getOutputParameter(OVP_Algorithm_AcquisitionDecoder_OutputParameterId_ChannelLocalisationStream)); + op_channelUnitsStream.initialize(getOutputParameter(OVP_Algorithm_AcquisitionDecoder_OutputParameterId_ChannelUnitsStream)); + + return true; +} + +bool CAcquisitionDecoder::uninitialize() +{ + op_channelUnitsStream.uninitialize(); + op_channelLocalisationStream.uninitialize(); + op_stimulationStream.uninitialize(); + op_signalStream.uninitialize(); + op_experimentInfoStream.uninitialize(); + op_bufferDuration.uninitialize(); + + CEBMLBaseDecoder::uninitialize(); + + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CAcquisitionDecoder::isMasterChild(const EBML::CIdentifier& identifier) +{ + if (identifier == OVTK_NodeId_Acquisition_Header_BufferDuration) { return false; } + if (identifier == OVTK_NodeId_Acquisition_Header_ExperimentInfo) { return false; } + if (identifier == OVTK_NodeId_Acquisition_Header_Signal) { return false; } + if (identifier == OVTK_NodeId_Acquisition_Header_Stimulation) { return false; } + if (identifier == OVTK_NodeId_Acquisition_Header_ChannelLocalisation) { return false; } + if (identifier == OVTK_NodeId_Acquisition_Header_ChannelUnits) { return false; } + if (identifier == OVTK_NodeId_Acquisition_Buffer_ExperimentInfo) { return false; } + if (identifier == OVTK_NodeId_Acquisition_Buffer_Signal) { return false; } + if (identifier == OVTK_NodeId_Acquisition_Buffer_Stimulation) { return false; } + if (identifier == OVTK_NodeId_Acquisition_Buffer_ChannelLocalisation) { return false; } + if (identifier == OVTK_NodeId_Acquisition_Buffer_ChannelUnits) { return false; } + return CEBMLBaseDecoder::isMasterChild(identifier); +} + +void CAcquisitionDecoder::openChild(const EBML::CIdentifier& identifier) +{ + m_nodes.push(identifier); + + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Acquisition_Header_BufferDuration) + || (top == OVTK_NodeId_Acquisition_Header_ExperimentInfo) + || (top == OVTK_NodeId_Acquisition_Header_Signal) + || (top == OVTK_NodeId_Acquisition_Header_Stimulation) + || (top == OVTK_NodeId_Acquisition_Header_ChannelLocalisation) + || (top == OVTK_NodeId_Acquisition_Header_ChannelUnits) + || (top == OVTK_NodeId_Acquisition_Buffer_ExperimentInfo) + || (top == OVTK_NodeId_Acquisition_Buffer_Signal) + || (top == OVTK_NodeId_Acquisition_Buffer_Stimulation) + || (top == OVTK_NodeId_Acquisition_Buffer_ChannelLocalisation) + || (top == OVTK_NodeId_Acquisition_Buffer_ChannelUnits) + ) { } + else { CEBMLBaseDecoder::openChild(identifier); } +} + +void CAcquisitionDecoder::processChildData(const void* buffer, const size_t size) +{ + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Acquisition_Header_BufferDuration) + || (top == OVTK_NodeId_Acquisition_Header_ExperimentInfo) + || (top == OVTK_NodeId_Acquisition_Header_Signal) + || (top == OVTK_NodeId_Acquisition_Header_Stimulation) + || (top == OVTK_NodeId_Acquisition_Header_ChannelLocalisation) + || (top == OVTK_NodeId_Acquisition_Header_ChannelUnits) + || (top == OVTK_NodeId_Acquisition_Buffer_ExperimentInfo) + || (top == OVTK_NodeId_Acquisition_Buffer_Signal) + || (top == OVTK_NodeId_Acquisition_Buffer_Stimulation) + || (top == OVTK_NodeId_Acquisition_Buffer_ChannelLocalisation) + || (top == OVTK_NodeId_Acquisition_Buffer_ChannelUnits) + ) + { + if (top == OVTK_NodeId_Acquisition_Header_BufferDuration) { op_bufferDuration = m_readerHelper->getUInt(buffer, size); } + if (top == OVTK_NodeId_Acquisition_Header_ExperimentInfo) { appendMemoryBuffer(op_experimentInfoStream, buffer, size); } + if (top == OVTK_NodeId_Acquisition_Header_Signal) { appendMemoryBuffer(op_signalStream, buffer, size); } + if (top == OVTK_NodeId_Acquisition_Header_Stimulation) { appendMemoryBuffer(op_stimulationStream, buffer, size); } + if (top == OVTK_NodeId_Acquisition_Header_ChannelLocalisation) { appendMemoryBuffer(op_channelLocalisationStream, buffer, size); } + if (top == OVTK_NodeId_Acquisition_Header_ChannelUnits) { appendMemoryBuffer(op_channelUnitsStream, buffer, size); } + if (top == OVTK_NodeId_Acquisition_Buffer_ExperimentInfo) { appendMemoryBuffer(op_experimentInfoStream, buffer, size); } + if (top == OVTK_NodeId_Acquisition_Buffer_Signal) { appendMemoryBuffer(op_signalStream, buffer, size); } + if (top == OVTK_NodeId_Acquisition_Buffer_Stimulation) { appendMemoryBuffer(op_stimulationStream, buffer, size); } + if (top == OVTK_NodeId_Acquisition_Buffer_ChannelLocalisation) { appendMemoryBuffer(op_channelLocalisationStream, buffer, size); } + if (top == OVTK_NodeId_Acquisition_Buffer_ChannelUnits) { appendMemoryBuffer(op_channelUnitsStream, buffer, size); } + } + else { CEBMLBaseDecoder::processChildData(buffer, size); } +} + +void CAcquisitionDecoder::closeChild() +{ + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Acquisition_Header_BufferDuration) + || (top == OVTK_NodeId_Acquisition_Header_ExperimentInfo) + || (top == OVTK_NodeId_Acquisition_Header_Signal) + || (top == OVTK_NodeId_Acquisition_Header_Stimulation) + || (top == OVTK_NodeId_Acquisition_Header_ChannelLocalisation) + || (top == OVTK_NodeId_Acquisition_Header_ChannelUnits) + || (top == OVTK_NodeId_Acquisition_Buffer_ExperimentInfo) + || (top == OVTK_NodeId_Acquisition_Buffer_Signal) + || (top == OVTK_NodeId_Acquisition_Buffer_Stimulation) + || (top == OVTK_NodeId_Acquisition_Buffer_ChannelLocalisation) + || (top == OVTK_NodeId_Acquisition_Buffer_ChannelUnits) + ) { } + else { CEBMLBaseDecoder::closeChild(); } + + m_nodes.pop(); +} + +void CAcquisitionDecoder::appendMemoryBuffer(IMemoryBuffer* memoryBuffer, const void* buffer, const size_t size) +{ + if (memoryBuffer) + { + const size_t currentBufferSize = memoryBuffer->getSize(); + memoryBuffer->setSize(currentBufferSize + size, false); + memcpy(memoryBuffer->getDirectPointer() + currentBufferSize, buffer, size); + } +} +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCAcquisitionDecoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCAcquisitionDecoder.h new file mode 100644 index 0000000..26a0355 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCAcquisitionDecoder.h @@ -0,0 +1,82 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCEBMLBaseDecoder.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CAcquisitionDecoder final : public CEBMLBaseDecoder +{ +public: + + CAcquisitionDecoder(); + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseDecoder, OVP_ClassId_Algorithm_AcquisitionDecoder) + + // ebml callbacks + bool isMasterChild(const EBML::CIdentifier& identifier) override; + void openChild(const EBML::CIdentifier& identifier) override; + void processChildData(const void* buffer, const size_t size) override; + void closeChild() override; + +protected: + + static void appendMemoryBuffer(IMemoryBuffer* memoryBuffer, const void* buffer, size_t size); + + Kernel::TParameterHandler op_bufferDuration; + Kernel::TParameterHandler op_experimentInfoStream; + Kernel::TParameterHandler op_signalStream; + Kernel::TParameterHandler op_stimulationStream; + Kernel::TParameterHandler op_channelLocalisationStream; + Kernel::TParameterHandler op_channelUnitsStream; + +private: + + std::stack m_nodes; +}; + +class CAcquisitionDecoderDesc final : public CEBMLBaseDecoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Acquisition stream decoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Decoders"); } + CString getVersion() const override { return CString("1.1"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_AcquisitionDecoder; } + IPluginObject* create() override { return new CAcquisitionDecoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CEBMLBaseDecoderDesc::getAlgorithmPrototype(prototype); + + prototype.addOutputParameter(OVP_Algorithm_AcquisitionDecoder_OutputParameterId_BufferDuration, "Buffer duration", Kernel::ParameterType_UInteger); + prototype.addOutputParameter(OVP_Algorithm_AcquisitionDecoder_OutputParameterId_ExperimentInfoStream, "Experiment information stream", + Kernel::ParameterType_MemoryBuffer); + prototype.addOutputParameter(OVP_Algorithm_AcquisitionDecoder_OutputParameterId_SignalStream, "Signal stream", Kernel::ParameterType_MemoryBuffer); + prototype.addOutputParameter(OVP_Algorithm_AcquisitionDecoder_OutputParameterId_StimulationStream, "Stimulation stream", + Kernel::ParameterType_MemoryBuffer); + prototype.addOutputParameter(OVP_Algorithm_AcquisitionDecoder_OutputParameterId_ChannelLocalisationStream, "Channel localisation stream", + Kernel::ParameterType_MemoryBuffer); + prototype.addOutputParameter(OVP_Algorithm_AcquisitionDecoder_OutputParameterId_ChannelUnitsStream, "Channel units stream", + Kernel::ParameterType_MemoryBuffer); + + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseDecoderDesc, OVP_ClassId_Algorithm_AcquisitionDecoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCChannelLocalisationDecoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCChannelLocalisationDecoder.cpp new file mode 100644 index 0000000..b4bcb77 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCChannelLocalisationDecoder.cpp @@ -0,0 +1,67 @@ +#include "ovpCChannelLocalisationDecoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +// ________________________________________________________________________________________________________________ +// + +bool CChannelLocalisationDecoder::initialize() +{ + CStreamedMatrixDecoder::initialize(); + op_bDynamic.initialize(getOutputParameter(OVP_Algorithm_ChannelLocalisationDecoder_OutputParameterId_Dynamic)); + return true; +} + +bool CChannelLocalisationDecoder::uninitialize() +{ + op_bDynamic.uninitialize(); + CStreamedMatrixDecoder::uninitialize(); + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CChannelLocalisationDecoder::isMasterChild(const EBML::CIdentifier& identifier) +{ + if (identifier == OVTK_NodeId_Header_ChannelLocalisation) { return true; } + if (identifier == OVTK_NodeId_Header_ChannelLocalisation_Dynamic) { return false; } + return CStreamedMatrixDecoder::isMasterChild(identifier); +} + +void CChannelLocalisationDecoder::openChild(const EBML::CIdentifier& identifier) +{ + m_nodes.push(identifier); + + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Header_ChannelLocalisation) || (top == OVTK_NodeId_Header_ChannelLocalisation_Dynamic)) { } + else { CStreamedMatrixDecoder::openChild(identifier); } +} + +void CChannelLocalisationDecoder::processChildData(const void* buffer, const size_t size) +{ + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Header_ChannelLocalisation) || (top == OVTK_NodeId_Header_ChannelLocalisation_Dynamic)) + { + if (top == OVTK_NodeId_Header_ChannelLocalisation_Dynamic) { op_bDynamic = (m_readerHelper->getUInt(buffer, size) ? true : false); } + } + else { CStreamedMatrixDecoder::processChildData(buffer, size); } +} + +void CChannelLocalisationDecoder::closeChild() +{ + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Header_ChannelLocalisation) || (top == OVTK_NodeId_Header_ChannelLocalisation_Dynamic)) { } + else { CStreamedMatrixDecoder::closeChild(); } + + m_nodes.pop(); +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCChannelLocalisationDecoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCChannelLocalisationDecoder.h new file mode 100644 index 0000000..27725d7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCChannelLocalisationDecoder.h @@ -0,0 +1,64 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCStreamedMatrixDecoder.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CChannelLocalisationDecoder final : public CStreamedMatrixDecoder +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixDecoder, OVP_ClassId_Algorithm_ChannelLocalisationDecoder) + + // ebml callbacks + bool isMasterChild(const EBML::CIdentifier& identifier) override; + void openChild(const EBML::CIdentifier& identifier) override; + void processChildData(const void* buffer, const size_t size) override; + void closeChild() override; + +protected: + + Kernel::TParameterHandler op_bDynamic; + +private: + + std::stack m_nodes; +}; + +class CChannelLocalisationDecoderDesc final : public CStreamedMatrixDecoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Channel localisation stream decoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Decoders"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_ChannelLocalisationDecoder; } + IPluginObject* create() override { return new CChannelLocalisationDecoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CStreamedMatrixDecoderDesc::getAlgorithmPrototype(prototype); + + prototype.addOutputParameter(OVP_Algorithm_ChannelLocalisationDecoder_OutputParameterId_Dynamic, "Dynamic", Kernel::ParameterType_Boolean); + + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixDecoderDesc, OVP_ClassId_Algorithm_ChannelLocalisationDecoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCChannelUnitsDecoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCChannelUnitsDecoder.cpp new file mode 100644 index 0000000..93c9d5e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCChannelUnitsDecoder.cpp @@ -0,0 +1,81 @@ +#include "ovpCChannelUnitsDecoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +// ________________________________________________________________________________________________________________ +// + +bool CChannelUnitsDecoder::initialize() +{ + CStreamedMatrixDecoder::initialize(); + op_bDynamic.initialize(getOutputParameter(OVP_Algorithm_ChannelUnitsDecoder_OutputParameterId_Dynamic)); + return true; +} + +bool CChannelUnitsDecoder::uninitialize() +{ + op_bDynamic.uninitialize(); + CStreamedMatrixDecoder::uninitialize(); + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CChannelUnitsDecoder::isMasterChild(const EBML::CIdentifier& identifier) +{ + if (identifier == OVTK_NodeId_Header_ChannelUnits) { return true; } + if (identifier == OVTK_NodeId_Header_ChannelUnits_Dynamic) { return false; } + return CStreamedMatrixDecoder::isMasterChild(identifier); +} + +void CChannelUnitsDecoder::openChild(const EBML::CIdentifier& identifier) +{ + m_nodes.push(identifier); + + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Header_ChannelUnits) + || (top == OVTK_NodeId_Header_ChannelUnits_Dynamic) + ) { } + else { CStreamedMatrixDecoder::openChild(identifier); } +} + +void CChannelUnitsDecoder::processChildData(const void* buffer, const size_t size) +{ + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Header_ChannelUnits) + || (top == OVTK_NodeId_Header_ChannelUnits_Dynamic) + ) + { + if (top == OVTK_NodeId_Header_ChannelUnits_Dynamic) { op_bDynamic = (m_readerHelper->getUInt(buffer, size) ? true : false); } + + //if(top==OVTK_NodeId_Header_ChannelUnits_MeasurementUnit_Unit) op_pMeasurementUnits->getBuffer()[m_unitIdx*2 ]=m_readerHelper->getDouble(buffer, size); + //if(top==OVTK_NodeId_Header_ChannelUnits_MeasurementUnit_Factor) op_pMeasurementUnits->getBuffer()[m_unitIdx*2+1]=m_readerHelper->getDouble(buffer, size); + } + else { CStreamedMatrixDecoder::processChildData(buffer, size); } +} + +void CChannelUnitsDecoder::closeChild() +{ + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Header_ChannelUnits) + || (top == OVTK_NodeId_Header_ChannelUnits_Dynamic) + ) + { + //if(top==OVTK_NodeId_Header_ChannelUnits_MeasurementUnit) + //{ + // m_unitIdx++; + //} + } + else { CStreamedMatrixDecoder::closeChild(); } + + m_nodes.pop(); +} +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCChannelUnitsDecoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCChannelUnitsDecoder.h new file mode 100644 index 0000000..2f9edb5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCChannelUnitsDecoder.h @@ -0,0 +1,65 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCStreamedMatrixDecoder.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CChannelUnitsDecoder final : public CStreamedMatrixDecoder +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixDecoder, OVP_ClassId_Algorithm_ChannelUnitsDecoder) + + // ebml callbacks + bool isMasterChild(const EBML::CIdentifier& identifier) override; + void openChild(const EBML::CIdentifier& identifier) override; + void processChildData(const void* buffer, const size_t size) override; + void closeChild() override; + +protected: + + Kernel::TParameterHandler op_bDynamic; + +private: + + std::stack m_nodes; + // size_t m_unitIdx = 0; +}; + +class CChannelUnitsDecoderDesc final : public CStreamedMatrixDecoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Channel units stream decoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Decoders"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_ChannelUnitsDecoder; } + IPluginObject* create() override { return new CChannelUnitsDecoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CStreamedMatrixDecoderDesc::getAlgorithmPrototype(prototype); + + prototype.addOutputParameter(OVP_Algorithm_ChannelUnitsDecoder_OutputParameterId_Dynamic, "Dynamic", Kernel::ParameterType_Boolean); + + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixDecoderDesc, OVP_ClassId_Algorithm_ChannelUnitsDecoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCEBMLBaseDecoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCEBMLBaseDecoder.cpp new file mode 100644 index 0000000..ca7ff48 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCEBMLBaseDecoder.cpp @@ -0,0 +1,67 @@ +#include "ovpCEBMLBaseDecoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +CEBMLBaseDecoder::CEBMLBaseDecoder() + : m_callbackProxy(*this, &CEBMLBaseDecoder::isMasterChild, &CEBMLBaseDecoder::openChild, &CEBMLBaseDecoder::processChildData, + &CEBMLBaseDecoder::closeChild) {} + +// ________________________________________________________________________________________________________________ +// + +bool CEBMLBaseDecoder::initialize() +{ + ip_bufferToDecode.initialize(getInputParameter(OVP_Algorithm_EBMLDecoder_InputParameterId_MemoryBufferToDecode)); + m_readerHelper = EBML::createReaderHelper(); + m_reader = createReader(m_callbackProxy); + + return true; +} + +bool CEBMLBaseDecoder::uninitialize() +{ + m_reader->release(); + m_reader = nullptr; + + m_readerHelper->release(); + m_readerHelper = nullptr; + + ip_bufferToDecode.uninitialize(); + + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CEBMLBaseDecoder::process() +{ + m_reader->processData(ip_bufferToDecode->getDirectPointer(), ip_bufferToDecode->getSize()); + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CEBMLBaseDecoder::isMasterChild(const EBML::CIdentifier& identifier) +{ + if (identifier == OVTK_NodeId_Header) { return true; } + if (identifier == OVTK_NodeId_Header_StreamVersion) { return false; } + if (identifier == OVTK_NodeId_Header_StreamType) { return false; } + if (identifier == OVTK_NodeId_Buffer) { return true; } + if (identifier == OVTK_NodeId_End) { return true; } + return false; +} + +void CEBMLBaseDecoder::openChild(const EBML::CIdentifier& identifier) +{ + if (identifier == OVTK_NodeId_Header) { activateOutputTrigger(OVP_Algorithm_EBMLDecoder_OutputTriggerId_ReceivedHeader, true); } + if (identifier == OVTK_NodeId_Buffer) { activateOutputTrigger(OVP_Algorithm_EBMLDecoder_OutputTriggerId_ReceivedBuffer, true); } + if (identifier == OVTK_NodeId_End) { activateOutputTrigger(OVP_Algorithm_EBMLDecoder_OutputTriggerId_ReceivedEnd, true); } +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCEBMLBaseDecoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCEBMLBaseDecoder.h new file mode 100644 index 0000000..63ca120 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCEBMLBaseDecoder.h @@ -0,0 +1,60 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CEBMLBaseDecoder : public Toolkit::TAlgorithm +{ +public: + + CEBMLBaseDecoder(); + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_EBMLBaseDecoder) + + // ebml callbacks + virtual bool isMasterChild(const EBML::CIdentifier& identifier); + virtual void openChild(const EBML::CIdentifier& identifier); + virtual void processChildData(const void* /*buffer*/, const size_t /*size*/) { } + virtual void closeChild() { } + +protected: + + EBML::IReaderHelper* m_readerHelper = nullptr; + EBML::IReader* m_reader = nullptr; + EBML::TReaderCallbackProxy1 m_callbackProxy; + + Kernel::TParameterHandler ip_bufferToDecode; +}; + +class CEBMLBaseDecoderDesc : public IAlgorithmDesc +{ +public: + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVP_Algorithm_EBMLDecoder_InputParameterId_MemoryBufferToDecode, "Memory buffer to decode", + Kernel::ParameterType_MemoryBuffer); + + prototype.addOutputTrigger(OVP_Algorithm_EBMLDecoder_OutputTriggerId_ReceivedHeader, "Received header"); + prototype.addOutputTrigger(OVP_Algorithm_EBMLDecoder_OutputTriggerId_ReceivedBuffer, "Received buffer"); + prototype.addOutputTrigger(OVP_Algorithm_EBMLDecoder_OutputTriggerId_ReceivedEnd, "Received end"); + + return true; + } + + _IsDerivedFromClass_(IAlgorithmDesc, OVP_ClassId_Algorithm_EBMLBaseDecoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCExperimentInfoDecoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCExperimentInfoDecoder.cpp new file mode 100644 index 0000000..f73ce3a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCExperimentInfoDecoder.cpp @@ -0,0 +1,151 @@ +#include "ovpCExperimentInfoDecoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +CExperimentInfoDecoder::CExperimentInfoDecoder() {} + +// ________________________________________________________________________________________________________________ +// + +bool CExperimentInfoDecoder::initialize() +{ + CEBMLBaseDecoder::initialize(); + + op_ExperimentID.initialize(getOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_ExperimentID)); + op_experimentDate.initialize(getOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_ExperimentDate)); + op_subjectID.initialize(getOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectID)); + op_subjectName.initialize(getOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectName)); + op_subjectAge.initialize(getOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectAge)); + op_subjectGender.initialize(getOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectGender)); + op_LaboratoryID.initialize(getOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_LaboratoryID)); + op_pLaboratoryName.initialize(getOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_LaboratoryName)); + op_TechnicianID.initialize(getOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_TechnicianID)); + op_pTechnicianName.initialize(getOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_TechnicianName)); + + return true; +} + +bool CExperimentInfoDecoder::uninitialize() +{ + op_pTechnicianName.uninitialize(); + op_TechnicianID.uninitialize(); + op_pLaboratoryName.uninitialize(); + op_LaboratoryID.uninitialize(); + op_subjectGender.uninitialize(); + op_subjectAge.uninitialize(); + op_subjectName.uninitialize(); + op_subjectID.uninitialize(); + op_experimentDate.uninitialize(); + op_ExperimentID.uninitialize(); + + CEBMLBaseDecoder::uninitialize(); + + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CExperimentInfoDecoder::isMasterChild(const EBML::CIdentifier& identifier) +{ + if (identifier == OVTK_NodeId_Header_ExperimentInfo) { return true; } + if (identifier == OVTK_NodeId_Header_ExperimentInfo_Experiment) { return true; } + if (identifier == OVTK_NodeId_Header_ExperimentInfo_Experiment_ID) { return false; } + if (identifier == OVTK_NodeId_Header_ExperimentInfo_Experiment_Date) { return false; } + if (identifier == OVTK_NodeId_Header_ExperimentInfo_Subject) { return true; } + if (identifier == OVTK_NodeId_Header_ExperimentInfo_Subject_ID) { return false; } + if (identifier == OVTK_NodeId_Header_ExperimentInfo_Subject_Name) { return false; } + if (identifier == OVTK_NodeId_Header_ExperimentInfo_Subject_Age) { return false; } + if (identifier == OVTK_NodeId_Header_ExperimentInfo_Subject_Gender) { return false; } + if (identifier == OVTK_NodeId_Header_ExperimentInfo_Context) { return true; } + if (identifier == OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryID) { return false; } + if (identifier == OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryName) { return false; } + if (identifier == OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianID) { return false; } + if (identifier == OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianName) { return false; } + return CEBMLBaseDecoder::isMasterChild(identifier); +} + +void CExperimentInfoDecoder::openChild(const EBML::CIdentifier& identifier) +{ + m_nodes.push(identifier); + + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Header_ExperimentInfo) + || (top == OVTK_NodeId_Header_ExperimentInfo_Experiment) + || (top == OVTK_NodeId_Header_ExperimentInfo_Experiment_ID) + || (top == OVTK_NodeId_Header_ExperimentInfo_Experiment_Date) + || (top == OVTK_NodeId_Header_ExperimentInfo_Subject) + || (top == OVTK_NodeId_Header_ExperimentInfo_Subject_ID) + || (top == OVTK_NodeId_Header_ExperimentInfo_Subject_Name) + || (top == OVTK_NodeId_Header_ExperimentInfo_Subject_Age) + || (top == OVTK_NodeId_Header_ExperimentInfo_Subject_Gender) + || (top == OVTK_NodeId_Header_ExperimentInfo_Context) + || (top == OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryID) + || (top == OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryName) + || (top == OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianID) + || (top == OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianName)) { } + else { CEBMLBaseDecoder::openChild(identifier); } +} + +void CExperimentInfoDecoder::processChildData(const void* buffer, const size_t size) +{ + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Header_ExperimentInfo) + || (top == OVTK_NodeId_Header_ExperimentInfo_Experiment) + || (top == OVTK_NodeId_Header_ExperimentInfo_Experiment_ID) + || (top == OVTK_NodeId_Header_ExperimentInfo_Experiment_Date) + || (top == OVTK_NodeId_Header_ExperimentInfo_Subject) + || (top == OVTK_NodeId_Header_ExperimentInfo_Subject_ID) + || (top == OVTK_NodeId_Header_ExperimentInfo_Subject_Name) + || (top == OVTK_NodeId_Header_ExperimentInfo_Subject_Age) + || (top == OVTK_NodeId_Header_ExperimentInfo_Subject_Gender) + || (top == OVTK_NodeId_Header_ExperimentInfo_Context) + || (top == OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryID) + || (top == OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryName) + || (top == OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianID) + || (top == OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianName)) + { + if (top == OVTK_NodeId_Header_ExperimentInfo_Experiment_ID) { op_ExperimentID = m_readerHelper->getUInt(buffer, size); } + if (top == OVTK_NodeId_Header_ExperimentInfo_Experiment_Date) { op_experimentDate->set(m_readerHelper->getStr(buffer, size)); } + if (top == OVTK_NodeId_Header_ExperimentInfo_Subject_ID) { op_subjectID = m_readerHelper->getUInt(buffer, size); } + if (top == OVTK_NodeId_Header_ExperimentInfo_Subject_Name) { op_subjectName->set(m_readerHelper->getStr(buffer, size)); } + if (top == OVTK_NodeId_Header_ExperimentInfo_Subject_Age) { op_subjectAge = m_readerHelper->getUInt(buffer, size); } + if (top == OVTK_NodeId_Header_ExperimentInfo_Subject_Gender) { op_subjectGender = m_readerHelper->getUInt(buffer, size); } + if (top == OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryID) { op_LaboratoryID = m_readerHelper->getUInt(buffer, size); } + if (top == OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryName) { op_pLaboratoryName->set(m_readerHelper->getStr(buffer, size)); } + if (top == OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianID) { op_TechnicianID = m_readerHelper->getUInt(buffer, size); } + if (top == OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianName) { op_pTechnicianName->set(m_readerHelper->getStr(buffer, size)); } + } + else { CEBMLBaseDecoder::processChildData(buffer, size); } +} + +void CExperimentInfoDecoder::closeChild() +{ + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Header_ExperimentInfo) + || (top == OVTK_NodeId_Header_ExperimentInfo_Experiment) + || (top == OVTK_NodeId_Header_ExperimentInfo_Experiment_ID) + || (top == OVTK_NodeId_Header_ExperimentInfo_Experiment_Date) + || (top == OVTK_NodeId_Header_ExperimentInfo_Subject) + || (top == OVTK_NodeId_Header_ExperimentInfo_Subject_ID) + || (top == OVTK_NodeId_Header_ExperimentInfo_Subject_Name) + || (top == OVTK_NodeId_Header_ExperimentInfo_Subject_Age) + || (top == OVTK_NodeId_Header_ExperimentInfo_Subject_Gender) + || (top == OVTK_NodeId_Header_ExperimentInfo_Context) + || (top == OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryID) + || (top == OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryName) + || (top == OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianID) + || (top == OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianName)) { } + else { CEBMLBaseDecoder::closeChild(); } + + m_nodes.pop(); +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCExperimentInfoDecoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCExperimentInfoDecoder.h new file mode 100644 index 0000000..da8d648 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCExperimentInfoDecoder.h @@ -0,0 +1,89 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCEBMLBaseDecoder.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CExperimentInfoDecoder final : public CEBMLBaseDecoder +{ +public: + + CExperimentInfoDecoder(); + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseDecoder, OVP_ClassId_Algorithm_ExperimentInfoDecoder) + + // ebml callbacks + bool isMasterChild(const EBML::CIdentifier& identifier) override; + void openChild(const EBML::CIdentifier& identifier) override; + void processChildData(const void* buffer, const size_t size) override; + void closeChild() override; + +protected: + + Kernel::TParameterHandler op_ExperimentID; + Kernel::TParameterHandler op_experimentDate; + + Kernel::TParameterHandler op_subjectID; + Kernel::TParameterHandler op_subjectName; + Kernel::TParameterHandler op_subjectAge; + Kernel::TParameterHandler op_subjectGender; + + Kernel::TParameterHandler op_LaboratoryID; + Kernel::TParameterHandler op_pLaboratoryName; + Kernel::TParameterHandler op_TechnicianID; + Kernel::TParameterHandler op_pTechnicianName; + +private: + + std::stack m_nodes; +}; + +class CExperimentInfoDecoderDesc final : public CEBMLBaseDecoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Experiment information stream decoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Decoders"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_ExperimentInfoDecoder; } + IPluginObject* create() override { return new CExperimentInfoDecoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CEBMLBaseDecoderDesc::getAlgorithmPrototype(prototype); + + prototype.addOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_ExperimentID, "Experiment identifier", + Kernel::ParameterType_UInteger); + prototype.addOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_ExperimentDate, "Experiment date", Kernel::ParameterType_String); + prototype.addOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectID, "Subject identifier", Kernel::ParameterType_UInteger); + prototype.addOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectName, "Subject name", Kernel::ParameterType_String); + prototype.addOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectAge, "Subject age", Kernel::ParameterType_UInteger); + prototype.addOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectGender, "Subject gender", Kernel::ParameterType_UInteger); + prototype.addOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_LaboratoryID, "Laboratory identifier", + Kernel::ParameterType_UInteger); + prototype.addOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_LaboratoryName, "Laboratory name", Kernel::ParameterType_String); + prototype.addOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_TechnicianID, "Technician identifier", + Kernel::ParameterType_UInteger); + prototype.addOutputParameter(OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_TechnicianName, "Technician name", Kernel::ParameterType_String); + + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseDecoderDesc, OVP_ClassId_Algorithm_ExperimentInfoDecoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCFeatureVectorDecoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCFeatureVectorDecoder.cpp new file mode 100644 index 0000000..4a46b62 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCFeatureVectorDecoder.cpp @@ -0,0 +1,28 @@ +#include "ovpCFeatureVectorDecoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + + +void CFeatureVectorDecoder::openChild(const EBML::CIdentifier& identifier) +{ + m_oTop = identifier; + CStreamedMatrixDecoder::openChild(identifier); +} + +void CFeatureVectorDecoder::processChildData(const void* buffer, const size_t size) +{ + // Check for conforming dimension count, then pass to matrix decoder + if (m_oTop == OVTK_NodeId_Header_StreamedMatrix_DimensionCount) + { + const size_t nDim = size_t(m_readerHelper->getUInt(buffer, size)); + OV_ERROR_UNLESS_KRV(nDim == 1, "Invalid feature vector: found " << nDim << " dimensions, 1 expected", Kernel::ErrorType::BadInput); + } + + CStreamedMatrixDecoder::processChildData(buffer, size); +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCFeatureVectorDecoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCFeatureVectorDecoder.h new file mode 100644 index 0000000..adc779b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCFeatureVectorDecoder.h @@ -0,0 +1,50 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCStreamedMatrixDecoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CFeatureVectorDecoder final : public CStreamedMatrixDecoder +{ +public: + void release() override { delete this; } + void openChild(const EBML::CIdentifier& identifier) override; + void processChildData(const void* buffer, const size_t size) override; + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixDecoder, OVP_ClassId_Algorithm_FeatureVectorDecoder) + +private: + + EBML::CIdentifier m_oTop; +}; + +class CFeatureVectorDecoderDesc final : public CStreamedMatrixDecoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Feature vector stream decoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Decoders"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_FeatureVectorDecoder; } + IPluginObject* create() override { return new CFeatureVectorDecoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CStreamedMatrixDecoderDesc::getAlgorithmPrototype(prototype); + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixDecoderDesc, OVP_ClassId_Algorithm_FeatureVectorDecoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCSignalDecoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCSignalDecoder.cpp new file mode 100644 index 0000000..65db5ec --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCSignalDecoder.cpp @@ -0,0 +1,67 @@ +#include "ovpCSignalDecoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +// ________________________________________________________________________________________________________________ +// + +bool CSignalDecoder::initialize() +{ + CStreamedMatrixDecoder::initialize(); + op_sampling.initialize(getOutputParameter(OVP_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + return true; +} + +bool CSignalDecoder::uninitialize() +{ + op_sampling.uninitialize(); + CStreamedMatrixDecoder::uninitialize(); + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CSignalDecoder::isMasterChild(const EBML::CIdentifier& identifier) +{ + if (identifier == OVTK_NodeId_Header_Signal) { return true; } + if (identifier == OVTK_NodeId_Header_Signal_Sampling) { return false; } + return CStreamedMatrixDecoder::isMasterChild(identifier); +} + +void CSignalDecoder::openChild(const EBML::CIdentifier& identifier) +{ + m_nodes.push(identifier); + + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Header_Signal) || (top == OVTK_NodeId_Header_Signal_Sampling)) { } + else { CStreamedMatrixDecoder::openChild(identifier); } +} + +void CSignalDecoder::processChildData(const void* buffer, const size_t size) +{ + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Header_Signal) || (top == OVTK_NodeId_Header_Signal_Sampling)) + { + if (top == OVTK_NodeId_Header_Signal_Sampling) { op_sampling = m_readerHelper->getUInt(buffer, size); } + } + else { CStreamedMatrixDecoder::processChildData(buffer, size); } +} + +void CSignalDecoder::closeChild() +{ + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Header_Signal) || (top == OVTK_NodeId_Header_Signal_Sampling)) { } + else { CStreamedMatrixDecoder::closeChild(); } + + m_nodes.pop(); +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCSignalDecoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCSignalDecoder.h new file mode 100644 index 0000000..6630766 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCSignalDecoder.h @@ -0,0 +1,62 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCStreamedMatrixDecoder.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CSignalDecoder final : public CStreamedMatrixDecoder +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixDecoder, OVP_ClassId_Algorithm_SignalDecoder) + + // ebml callbacks + bool isMasterChild(const EBML::CIdentifier& identifier) override; + void openChild(const EBML::CIdentifier& identifier) override; + void processChildData(const void* buffer, const size_t size) override; + void closeChild() override; + +protected: + + Kernel::TParameterHandler op_sampling; + +private: + + std::stack m_nodes; +}; + +class CSignalDecoderDesc final : public CStreamedMatrixDecoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Signal stream decoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Decoders"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_SignalDecoder; } + IPluginObject* create() override { return new CSignalDecoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CStreamedMatrixDecoderDesc::getAlgorithmPrototype(prototype); + prototype.addOutputParameter(OVP_Algorithm_SignalDecoder_OutputParameterId_Sampling, "Sampling rate", Kernel::ParameterType_UInteger); + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixDecoderDesc, OVP_ClassId_Algorithm_SignalDecoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCSpectrumDecoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCSpectrumDecoder.cpp new file mode 100755 index 0000000..40244e7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCSpectrumDecoder.cpp @@ -0,0 +1,102 @@ +#include "ovpCSpectrumDecoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +// ________________________________________________________________________________________________________________ +// + +bool CSpectrumDecoder::initialize() +{ + CStreamedMatrixDecoder::initialize(); + op_frequencyAbscissa.initialize(getOutputParameter(OVP_Algorithm_SpectrumDecoder_OutputParameterId_FrequencyAbscissa)); + op_sampling.initialize(getOutputParameter(OVP_Algorithm_SpectrumDecoder_OutputParameterId_Sampling)); + return true; +} + +bool CSpectrumDecoder::uninitialize() +{ + op_frequencyAbscissa.uninitialize(); + op_sampling.uninitialize(); + CStreamedMatrixDecoder::uninitialize(); + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CSpectrumDecoder::isMasterChild(const EBML::CIdentifier& identifier) +{ + if (identifier == OVTK_NodeId_Header_Spectrum) { return true; } + if (identifier == OVTK_NodeId_Header_Spectrum_FrequencyBand_Deprecated) { return true; } + if (identifier == OVTK_NodeId_Header_Spectrum_FrequencyBand_Start_Deprecated) { return false; } + if (identifier == OVTK_NodeId_Header_Spectrum_FrequencyBand_Stop_Deprecated) { return false; } + if (identifier == OVTK_NodeId_Header_Spectrum_FrequencyAbscissa) { return false; } + if (identifier == OVTK_NodeId_Header_Spectrum_Sampling) { return false; } + return CStreamedMatrixDecoder::isMasterChild(identifier); +} + +void CSpectrumDecoder::openChild(const EBML::CIdentifier& identifier) +{ + m_nodes.push(identifier); + + EBML::CIdentifier& top = m_nodes.top(); + + if (top == OVTK_NodeId_Header_Spectrum) + { + op_frequencyAbscissa->resize(op_pMatrix->getDimensionSize(1)); + m_frequencyBandIdx = 0; + } + else if (top == OVTK_NodeId_Header_Spectrum_FrequencyAbscissa) { } + else { CStreamedMatrixDecoder::openChild(identifier); } +} + +void CSpectrumDecoder::processChildData(const void* buffer, const size_t size) +{ + EBML::CIdentifier& top = m_nodes.top(); + if ((top == OVTK_NodeId_Header_Spectrum) || (top == OVTK_NodeId_Header_Spectrum_FrequencyBand_Deprecated)) { } + else if (top == OVTK_NodeId_Header_Spectrum_FrequencyBand_Start_Deprecated) { m_lowerFreq = m_readerHelper->getDouble(buffer, size); } + else if (top == OVTK_NodeId_Header_Spectrum_FrequencyBand_Stop_Deprecated) + { + const double upperFreq = m_readerHelper->getDouble(buffer, size); + double curFrequencyAbscissa = 0; + if (op_frequencyAbscissa->getDimensionSize(0) > 1) + { + // In the old format, frequencies were separated into bins with lower and upper bounds. + // These were calculated as lowerFreq = frequencyIndex/frequencyCount, upperFreq = (frequencyIndex + 1)/frequencyCount, with 0 based indexes. + // This formula reverses the calculation and puts the 'middle' frequency into the right place + curFrequencyAbscissa = m_lowerFreq + double(m_frequencyBandIdx) / (op_frequencyAbscissa->getDimensionSize(0) - 1) * (upperFreq - m_lowerFreq); + } + op_frequencyAbscissa->getBuffer()[m_frequencyBandIdx] = curFrequencyAbscissa; + std::ostringstream s; + s << std::setprecision(10); + s << curFrequencyAbscissa; + op_pMatrix->setDimensionLabel(1, m_frequencyBandIdx, s.str().c_str()); + + op_sampling = uint64_t((m_frequencyBandIdx + 1) * (upperFreq - op_frequencyAbscissa->getBuffer()[0])); + } + else if (top == OVTK_NodeId_Header_Spectrum_FrequencyAbscissa) + { + op_frequencyAbscissa->getBuffer()[m_frequencyBandIdx] = m_readerHelper->getDouble(buffer, size); + } + else if (top == OVTK_NodeId_Header_Spectrum_Sampling) { op_sampling = m_readerHelper->getUInt(buffer, size); } + else { CStreamedMatrixDecoder::processChildData(buffer, size); } +} + +void CSpectrumDecoder::closeChild() +{ + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Header_Spectrum) + || (top == OVTK_NodeId_Header_Spectrum_FrequencyBand_Start_Deprecated) + || (top == OVTK_NodeId_Header_Spectrum_FrequencyBand_Stop_Deprecated)) { } + else if ((top == OVTK_NodeId_Header_Spectrum_FrequencyBand_Deprecated) || (top == OVTK_NodeId_Header_Spectrum_FrequencyAbscissa)) { m_frequencyBandIdx++; } + else { CStreamedMatrixDecoder::closeChild(); } + + m_nodes.pop(); +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCSpectrumDecoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCSpectrumDecoder.h new file mode 100755 index 0000000..2ea48a0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCSpectrumDecoder.h @@ -0,0 +1,72 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCStreamedMatrixDecoder.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CSpectrumDecoder final : public CStreamedMatrixDecoder +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixDecoder, OVP_ClassId_Algorithm_SpectrumDecoder) + + // ebml callbacks + bool isMasterChild(const EBML::CIdentifier& identifier) override; + void openChild(const EBML::CIdentifier& identifier) override; + void processChildData(const void* buffer, const size_t size) override; + void closeChild() override; + +protected: + + Kernel::TParameterHandler op_frequencyAbscissa; + Kernel::TParameterHandler op_sampling; + + +private: + + std::stack m_nodes; + + size_t m_frequencyBandIdx = 0; + + // Value of the current lower frequency of the band. Only used to read old spectrum format. + double m_lowerFreq = 0; +}; + +class CSpectrumDecoderDesc final : public CStreamedMatrixDecoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Spectrum stream decoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Decodes the Spectrum type streams."); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Decoders"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.1.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_SpectrumDecoder; } + IPluginObject* create() override { return new CSpectrumDecoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CStreamedMatrixDecoderDesc::getAlgorithmPrototype(prototype); + + prototype.addOutputParameter(OVP_Algorithm_SpectrumDecoder_OutputParameterId_FrequencyAbscissa, "Frequency abscissa", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVP_Algorithm_SpectrumDecoder_OutputParameterId_Sampling, "Sampling rate", Kernel::ParameterType_UInteger); + + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixDecoderDesc, OVP_ClassId_Algorithm_SpectrumDecoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStimulationDecoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStimulationDecoder.cpp new file mode 100644 index 0000000..fea72b3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStimulationDecoder.cpp @@ -0,0 +1,102 @@ +#include "ovpCStimulationDecoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +// ________________________________________________________________________________________________________________ +// + +bool CStimulationDecoder::initialize() +{ + CEBMLBaseDecoder::initialize(); + op_stimulationSet.initialize(getOutputParameter(OVP_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + return true; +} + +bool CStimulationDecoder::uninitialize() +{ + op_stimulationSet.uninitialize(); + CEBMLBaseDecoder::uninitialize(); + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CStimulationDecoder::isMasterChild(const EBML::CIdentifier& identifier) +{ + if (identifier == OVTK_NodeId_Buffer_Stimulation) { return true; } + if (identifier == OVTK_NodeId_Buffer_Stimulation_NumberOfStimulations) { return false; } + if (identifier == OVTK_NodeId_Buffer_Stimulation_Stimulation) { return true; } + if (identifier == OVTK_NodeId_Buffer_Stimulation_Stimulation_ID) { return false; } + if (identifier == OVTK_NodeId_Buffer_Stimulation_Stimulation_Date) { return false; } + if (identifier == OVTK_NodeId_Buffer_Stimulation_Stimulation_Duration) { return false; } + return CEBMLBaseDecoder::isMasterChild(identifier); +} + +void CStimulationDecoder::openChild(const EBML::CIdentifier& identifier) +{ + m_nodes.push(identifier); + + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Buffer_Stimulation) + || (top == OVTK_NodeId_Buffer_Stimulation_NumberOfStimulations) + || (top == OVTK_NodeId_Buffer_Stimulation_Stimulation) + || (top == OVTK_NodeId_Buffer_Stimulation_Stimulation_ID) + || (top == OVTK_NodeId_Buffer_Stimulation_Stimulation_Date) + || (top == OVTK_NodeId_Buffer_Stimulation_Stimulation_Duration)) { } + else { CEBMLBaseDecoder::openChild(identifier); } +} + +void CStimulationDecoder::processChildData(const void* buffer, const size_t size) +{ + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Buffer_Stimulation) + || (top == OVTK_NodeId_Buffer_Stimulation_NumberOfStimulations) + || (top == OVTK_NodeId_Buffer_Stimulation_Stimulation) + || (top == OVTK_NodeId_Buffer_Stimulation_Stimulation_ID) + || (top == OVTK_NodeId_Buffer_Stimulation_Stimulation_Date) + || (top == OVTK_NodeId_Buffer_Stimulation_Stimulation_Duration)) + { + if (top == OVTK_NodeId_Buffer_Stimulation_NumberOfStimulations) + { + op_stimulationSet->setStimulationCount(m_readerHelper->getUInt(buffer, size)); + m_stimulationIdx = 0; + } + if (top == OVTK_NodeId_Buffer_Stimulation_Stimulation_ID) + { + op_stimulationSet->setStimulationIdentifier(m_stimulationIdx, m_readerHelper->getUInt(buffer, size)); + } + if (top == OVTK_NodeId_Buffer_Stimulation_Stimulation_Date) + { + op_stimulationSet->setStimulationDate(m_stimulationIdx, m_readerHelper->getUInt(buffer, size)); + } + if (top == OVTK_NodeId_Buffer_Stimulation_Stimulation_Duration) + { + op_stimulationSet->setStimulationDuration(m_stimulationIdx, m_readerHelper->getUInt(buffer, size)); + } + } + else { CEBMLBaseDecoder::processChildData(buffer, size); } +} + +void CStimulationDecoder::closeChild() +{ + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Buffer_Stimulation) + || (top == OVTK_NodeId_Buffer_Stimulation_NumberOfStimulations) + || (top == OVTK_NodeId_Buffer_Stimulation_Stimulation) + || (top == OVTK_NodeId_Buffer_Stimulation_Stimulation_ID) + || (top == OVTK_NodeId_Buffer_Stimulation_Stimulation_Date) + || (top == OVTK_NodeId_Buffer_Stimulation_Stimulation_Duration)) { if (top == OVTK_NodeId_Buffer_Stimulation_Stimulation) { m_stimulationIdx++; } } + else { CEBMLBaseDecoder::closeChild(); } + + m_nodes.pop(); +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStimulationDecoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStimulationDecoder.h new file mode 100644 index 0000000..80114b0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStimulationDecoder.h @@ -0,0 +1,66 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCEBMLBaseDecoder.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CStimulationDecoder final : public CEBMLBaseDecoder +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseDecoder, OVP_ClassId_Algorithm_StimulationDecoder) + + // ebml callbacks + bool isMasterChild(const EBML::CIdentifier& identifier) override; + void openChild(const EBML::CIdentifier& identifier) override; + void processChildData(const void* buffer, const size_t size) override; + void closeChild() override; + +protected: + + Kernel::TParameterHandler op_stimulationSet; + +private: + + std::stack m_nodes; + + size_t m_stimulationIdx = 0; + CStimulationSet m_stimSet; +}; + +class CStimulationDecoderDesc final : public CEBMLBaseDecoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Stimulation stream decoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Decoders"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_StimulationDecoder; } + IPluginObject* create() override { return new CStimulationDecoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CEBMLBaseDecoderDesc::getAlgorithmPrototype(prototype); + prototype.addOutputParameter(OVP_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet, "Stimulation set", + Kernel::ParameterType_StimulationSet); + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseDecoderDesc, OVP_ClassId_Algorithm_StimulationDecoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStreamStructureDecoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStreamStructureDecoder.cpp new file mode 100644 index 0000000..2210b0c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStreamStructureDecoder.cpp @@ -0,0 +1,34 @@ +#include "ovpCStreamStructureDecoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +CStreamStructureDecoder::CStreamStructureDecoder() {} + +// ________________________________________________________________________________________________________________ +// + +bool CStreamStructureDecoder::initialize() +{ + CEBMLBaseDecoder::initialize(); + return true; +} + +bool CStreamStructureDecoder::uninitialize() +{ + CEBMLBaseDecoder::uninitialize(); + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CStreamStructureDecoder::isMasterChild(const EBML::CIdentifier& identifier) { return CEBMLBaseDecoder::isMasterChild(identifier); } +void CStreamStructureDecoder::openChild(const EBML::CIdentifier& identifier) { CEBMLBaseDecoder::openChild(identifier); } +void CStreamStructureDecoder::processChildData(const void* buffer, const size_t size) { CEBMLBaseDecoder::processChildData(buffer, size); } +void CStreamStructureDecoder::closeChild() { CEBMLBaseDecoder::closeChild(); } + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStreamStructureDecoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStreamStructureDecoder.h new file mode 100644 index 0000000..23c14f3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStreamStructureDecoder.h @@ -0,0 +1,54 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCEBMLBaseDecoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CStreamStructureDecoder final : public CEBMLBaseDecoder +{ +public: + + CStreamStructureDecoder(); + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseDecoder, OVP_ClassId_Algorithm_StreamStructureDecoder) + + // ebml callbacks + bool isMasterChild(const EBML::CIdentifier& identifier) override; + void openChild(const EBML::CIdentifier& identifier) override; + void processChildData(const void* buffer, const size_t size) override; + void closeChild() override; +}; + +class CStreamStructureDecoderDesc final : public CEBMLBaseDecoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Stream Structure Decoder"); } + CString getAuthorName() const override { return CString("Jozef Legeny"); } + CString getAuthorCompanyName() const override { return CString("Mensia Technologies"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Decoders"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("2.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_StreamStructureDecoder; } + IPluginObject* create() override { return new CStreamStructureDecoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CEBMLBaseDecoderDesc::getAlgorithmPrototype(prototype); + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseDecoderDesc, OVP_ClassId_Algorithm_StreamStructureDecoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStreamedMatrixDecoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStreamedMatrixDecoder.cpp new file mode 100644 index 0000000..09f4d3e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStreamedMatrixDecoder.cpp @@ -0,0 +1,160 @@ +#include "ovpCStreamedMatrixDecoder.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +namespace { +// removes pre and post spaces, tabs and carriage returns +void trim(char* dst, const char* src1, const char* src2) +{ + if (!src1 || *src1 == '\0') { dst[0] = '\0'; } + if (!src2) { src2 = src1 + strlen(src1) - 1; } + while (src1 < src2 && (*src1 == ' ' || *src1 == '\t' || *src1 == '\r' || *src1 == '\n')) { src1++; } + while (src1 < src2 && (*src2 == ' ' || *src2 == '\t' || *src2 == '\r' || *src2 == '\n')) { src2--; } + src2++; + strncpy(dst, src1, src2 - src1); + dst[src2 - src1] = '\0'; +} +} // namespace + +// ________________________________________________________________________________________________________________ +// + +bool CStreamedMatrixDecoder::initialize() +{ + CEBMLBaseDecoder::initialize(); + op_pMatrix.initialize(getOutputParameter(OVP_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + return true; +} + +bool CStreamedMatrixDecoder::uninitialize() +{ + op_pMatrix.uninitialize(); + CEBMLBaseDecoder::uninitialize(); + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CStreamedMatrixDecoder::isMasterChild(const EBML::CIdentifier& id) +{ + if (id == OVTK_NodeId_Header_StreamedMatrix) { return true; } + if (id == OVTK_NodeId_Header_StreamedMatrix_Dimension) { return true; } + if (id == OVTK_NodeId_Header_StreamedMatrix_DimensionCount) { return false; } + if (id == OVTK_NodeId_Header_StreamedMatrix_Dimension_Size) { return false; } + if (id == OVTK_NodeId_Header_StreamedMatrix_Dimension_Label) { return false; } + if (id == OVTK_NodeId_Buffer_StreamedMatrix) { return true; } + if (id == OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer) { return false; } + return CEBMLBaseDecoder::isMasterChild(id); +} + +void CStreamedMatrixDecoder::openChild(const EBML::CIdentifier& id) +{ + m_nodes.push(id); + + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Header_StreamedMatrix) + || (top == OVTK_NodeId_Header_StreamedMatrix_Dimension) + || (top == OVTK_NodeId_Header_StreamedMatrix_DimensionCount) + || (top == OVTK_NodeId_Header_StreamedMatrix_Dimension_Size) + || (top == OVTK_NodeId_Header_StreamedMatrix_Dimension_Label) + || (top == OVTK_NodeId_Buffer_StreamedMatrix) + || (top == OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer)) + { + if (top == OVTK_NodeId_Header_StreamedMatrix && m_status == EParsingStatus::Nothing) + { + m_status = EParsingStatus::Header; + m_dimensionIdx = 0; + } + else if (top == OVTK_NodeId_Header_StreamedMatrix_Dimension && m_status == EParsingStatus::Header) + { + m_status = EParsingStatus::Dimension; + m_dimensionEntryIdx = 0; + } + else if (top == OVTK_NodeId_Buffer_StreamedMatrix && m_status == EParsingStatus::Nothing) { m_status = EParsingStatus::Buffer; } + } + else { CEBMLBaseDecoder::openChild(id); } +} + +void CStreamedMatrixDecoder::processChildData(const void* buffer, const size_t size) +{ + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Header_StreamedMatrix) + || (top == OVTK_NodeId_Header_StreamedMatrix_Dimension) + || (top == OVTK_NodeId_Header_StreamedMatrix_DimensionCount) + || (top == OVTK_NodeId_Header_StreamedMatrix_Dimension_Size) + || (top == OVTK_NodeId_Header_StreamedMatrix_Dimension_Label) + || (top == OVTK_NodeId_Buffer_StreamedMatrix) + || (top == OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer)) + { + switch (m_status) + { + case EParsingStatus::Header: + if (top == OVTK_NodeId_Header_StreamedMatrix_DimensionCount) { op_pMatrix->setDimensionCount(size_t(m_readerHelper->getUInt(buffer, size))); } + break; + + case EParsingStatus::Dimension: + if (top == OVTK_NodeId_Header_StreamedMatrix_Dimension_Size) + { + op_pMatrix->setDimensionSize(m_dimensionIdx, size_t(m_readerHelper->getUInt(buffer, size))); + } + if (top == OVTK_NodeId_Header_StreamedMatrix_Dimension_Label) + { + char label[1024]; + trim(label, m_readerHelper->getStr(buffer, size), nullptr); + op_pMatrix->setDimensionLabel(m_dimensionIdx, m_dimensionEntryIdx++, label); + } + break; + + case EParsingStatus::Buffer: + if (top == OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer) { memcpy(op_pMatrix->getBuffer(), buffer, m_size * sizeof(double)); } + break; + default: break; + } + } + else { CEBMLBaseDecoder::processChildData(buffer, size); } +} + +void CStreamedMatrixDecoder::closeChild() +{ + EBML::CIdentifier& top = m_nodes.top(); + + if ((top == OVTK_NodeId_Header_StreamedMatrix) + || (top == OVTK_NodeId_Header_StreamedMatrix_Dimension) + || (top == OVTK_NodeId_Header_StreamedMatrix_DimensionCount) + || (top == OVTK_NodeId_Header_StreamedMatrix_Dimension_Size) + || (top == OVTK_NodeId_Header_StreamedMatrix_Dimension_Label) + || (top == OVTK_NodeId_Buffer_StreamedMatrix) + || (top == OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer)) + { + if (top == OVTK_NodeId_Buffer_StreamedMatrix && m_status == EParsingStatus::Buffer) { m_status = EParsingStatus::Nothing; } + else if (top == OVTK_NodeId_Header_StreamedMatrix_Dimension && m_status == EParsingStatus::Dimension) + { + m_status = EParsingStatus::Header; + m_dimensionIdx++; + } + else if (top == OVTK_NodeId_Header_StreamedMatrix && m_status == EParsingStatus::Header) + { + m_status = EParsingStatus::Nothing; + + if (op_pMatrix->getDimensionCount() == 0) { m_size = 0; } + else + { + m_size = 1; + for (size_t i = 0; i < op_pMatrix->getDimensionCount(); ++i) { m_size *= op_pMatrix->getDimensionSize(i); } + } + } + } + else { CEBMLBaseDecoder::closeChild(); } + + m_nodes.pop(); +} +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStreamedMatrixDecoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStreamedMatrixDecoder.h new file mode 100644 index 0000000..95440e8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/decoders/ovpCStreamedMatrixDecoder.h @@ -0,0 +1,72 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCEBMLBaseDecoder.h" +#include + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CStreamedMatrixDecoder : public CEBMLBaseDecoder +{ +public: + + CStreamedMatrixDecoder() { } + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseDecoder, OVP_ClassId_Algorithm_StreamedMatrixDecoder) + + // ebml callbacks + bool isMasterChild(const EBML::CIdentifier& id) override; + void openChild(const EBML::CIdentifier& id) override; + void processChildData(const void* buffer, const size_t size) override; + void closeChild() override; + +protected: + + Kernel::TParameterHandler op_pMatrix; + +private: + + enum class EParsingStatus { Nothing, Header, Buffer, Dimension }; + + std::stack m_nodes; + + EParsingStatus m_status = EParsingStatus::Nothing; + size_t m_dimensionIdx = 0; + size_t m_dimensionEntryIdx = 0; + // size_t mdimensionEntryIdxUnit = 0; + size_t m_size = 0; +}; + +class CStreamedMatrixDecoderDesc : public CEBMLBaseDecoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Streamed matrix stream decoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Decoders"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_StreamedMatrixDecoder; } + IPluginObject* create() override { return new CStreamedMatrixDecoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CEBMLBaseDecoderDesc::getAlgorithmPrototype(prototype); + prototype.addOutputParameter(OVP_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix, "Matrix", Kernel::ParameterType_Matrix); + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseDecoderDesc, OVP_ClassId_Algorithm_StreamedMatrixDecoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCAcquisitionEncoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCAcquisitionEncoder.cpp new file mode 100644 index 0000000..f71017a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCAcquisitionEncoder.cpp @@ -0,0 +1,85 @@ +#include "ovpCAcquisitionEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +bool CAcquisitionEncoder::initialize() +{ + CEBMLBaseEncoder::initialize(); + + ip_bufferDuration.initialize(getInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_BufferDuration)); + ip_experimentInfoStream.initialize(getInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_ExperimentInfoStream)); + ip_signalStream.initialize(getInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_SignalStream)); + ip_stimulationStream.initialize(getInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_StimulationStream)); + ip_channelLocalisationStream.initialize(getInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_ChannelLocalisationStream)); + ip_channelUnitsStream.initialize(getInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_ChannelUnitsStream)); + + return true; +} + +bool CAcquisitionEncoder::uninitialize() +{ + ip_channelUnitsStream.uninitialize(); + ip_channelLocalisationStream.uninitialize(); + ip_stimulationStream.uninitialize(); + ip_signalStream.uninitialize(); + ip_experimentInfoStream.uninitialize(); + ip_bufferDuration.uninitialize(); + + CEBMLBaseEncoder::uninitialize(); + + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CAcquisitionEncoder::processHeader() +{ + m_writerHelper->openChild(OVTK_NodeId_Acquisition_Header_BufferDuration); + m_writerHelper->setUInt(ip_bufferDuration); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Acquisition_Header_ExperimentInfo); + m_writerHelper->setBinary(ip_experimentInfoStream->getDirectPointer(), ip_experimentInfoStream->getSize()); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Acquisition_Header_Signal); + m_writerHelper->setBinary(ip_signalStream->getDirectPointer(), ip_signalStream->getSize()); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Acquisition_Header_Stimulation); + m_writerHelper->setBinary(ip_stimulationStream->getDirectPointer(), ip_stimulationStream->getSize()); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Acquisition_Header_ChannelLocalisation); + m_writerHelper->setBinary(ip_channelLocalisationStream->getDirectPointer(), ip_channelLocalisationStream->getSize()); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Acquisition_Header_ChannelUnits); + m_writerHelper->setBinary(ip_channelUnitsStream->getDirectPointer(), ip_channelUnitsStream->getSize()); + m_writerHelper->closeChild(); + + return true; +} + +bool CAcquisitionEncoder::processBuffer() +{ + m_writerHelper->openChild(OVTK_NodeId_Acquisition_Buffer_ExperimentInfo); + m_writerHelper->setBinary(ip_experimentInfoStream->getDirectPointer(), ip_experimentInfoStream->getSize()); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Acquisition_Buffer_Signal); + m_writerHelper->setBinary(ip_signalStream->getDirectPointer(), ip_signalStream->getSize()); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Acquisition_Buffer_Stimulation); + m_writerHelper->setBinary(ip_stimulationStream->getDirectPointer(), ip_stimulationStream->getSize()); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Acquisition_Buffer_ChannelLocalisation); + m_writerHelper->setBinary(ip_channelLocalisationStream->getDirectPointer(), ip_channelLocalisationStream->getSize()); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Acquisition_Buffer_ChannelUnits); + m_writerHelper->setBinary(ip_channelUnitsStream->getDirectPointer(), ip_channelUnitsStream->getSize()); + m_writerHelper->closeChild(); + + return true; +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCAcquisitionEncoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCAcquisitionEncoder.h new file mode 100644 index 0000000..526a311 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCAcquisitionEncoder.h @@ -0,0 +1,69 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCEBMLBaseEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CAcquisitionEncoder final : public CEBMLBaseEncoder +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processHeader() override; + bool processBuffer() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseEncoder, OVP_ClassId_Algorithm_AcquisitionEncoder) + +protected: + + Kernel::TParameterHandler ip_bufferDuration; + Kernel::TParameterHandler ip_experimentInfoStream; + Kernel::TParameterHandler ip_signalStream; + Kernel::TParameterHandler ip_stimulationStream; + Kernel::TParameterHandler ip_channelLocalisationStream; + Kernel::TParameterHandler ip_channelUnitsStream; +}; + +class CAcquisitionEncoderDesc final : public CEBMLBaseEncoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Acquisition stream encoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Encoders"); } + CString getVersion() const override { return CString("1.1"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_AcquisitionEncoder; } + IPluginObject* create() override { return new CAcquisitionEncoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CEBMLBaseEncoderDesc::getAlgorithmPrototype(prototype); + + prototype.addInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_BufferDuration, "Buffer duration", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_ExperimentInfoStream, "Experiment information stream", + Kernel::ParameterType_MemoryBuffer); + prototype.addInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_SignalStream, "Signal stream", Kernel::ParameterType_MemoryBuffer); + prototype.addInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_StimulationStream, "Stimulation stream", + Kernel::ParameterType_MemoryBuffer); + prototype.addInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_ChannelLocalisationStream, "Channel localisation stream", + Kernel::ParameterType_MemoryBuffer); + prototype.addInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_ChannelUnitsStream, "Channel units stream", + Kernel::ParameterType_MemoryBuffer); + + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseEncoderDesc, OVP_ClassId_Algorithm_AcquisitionEncoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCChannelLocalisationEncoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCChannelLocalisationEncoder.cpp new file mode 100644 index 0000000..d6acf43 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCChannelLocalisationEncoder.cpp @@ -0,0 +1,39 @@ +#include "ovpCChannelLocalisationEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +bool CChannelLocalisationEncoder::initialize() +{ + CStreamedMatrixEncoder::initialize(); + ip_bDynamic.initialize(getInputParameter(OVP_Algorithm_ChannelLocalisationEncoder_InputParameterId_Dynamic)); + return true; +} + +bool CChannelLocalisationEncoder::uninitialize() +{ + ip_bDynamic.uninitialize(); + CStreamedMatrixEncoder::uninitialize(); + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CChannelLocalisationEncoder::processHeader() +{ + CStreamedMatrixEncoder::processHeader(); + + m_writerHelper->openChild(OVTK_NodeId_Header_ChannelLocalisation); + m_writerHelper->openChild(OVTK_NodeId_Header_ChannelLocalisation_Dynamic); + m_writerHelper->setUInt(ip_bDynamic ? 1 : 0); + m_writerHelper->closeChild(); + m_writerHelper->closeChild(); + + return true; +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCChannelLocalisationEncoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCChannelLocalisationEncoder.h new file mode 100644 index 0000000..fdee02e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCChannelLocalisationEncoder.h @@ -0,0 +1,55 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCStreamedMatrixEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CChannelLocalisationEncoder final : public CStreamedMatrixEncoder +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processHeader() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixEncoder, OVP_ClassId_Algorithm_ChannelLocalisationEncoder) + +protected: + + Kernel::TParameterHandler ip_bDynamic; +}; + + +class CChannelLocalisationEncoderDesc final : public CStreamedMatrixEncoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Channel localisation stream encoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Encoders"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_ChannelLocalisationEncoder; } + IPluginObject* create() override { return new CChannelLocalisationEncoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CStreamedMatrixEncoderDesc::getAlgorithmPrototype(prototype); + + prototype.addInputParameter(OVP_Algorithm_ChannelLocalisationEncoder_InputParameterId_Dynamic, "Dynamic", Kernel::ParameterType_Boolean); + + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixEncoderDesc, OVP_ClassId_Algorithm_ChannelLocalisationEncoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCChannelUnitsEncoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCChannelUnitsEncoder.cpp new file mode 100644 index 0000000..ffd6fae --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCChannelUnitsEncoder.cpp @@ -0,0 +1,39 @@ +#include "ovpCChannelUnitsEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +bool CChannelUnitsEncoder::initialize() +{ + CStreamedMatrixEncoder::initialize(); + ip_bDynamic.initialize(getInputParameter(OVP_Algorithm_ChannelUnitsEncoder_InputParameterId_Dynamic)); + return true; +} + +bool CChannelUnitsEncoder::uninitialize() +{ + ip_bDynamic.uninitialize(); + CStreamedMatrixEncoder::uninitialize(); + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CChannelUnitsEncoder::processHeader() +{ + CStreamedMatrixEncoder::processHeader(); + + m_writerHelper->openChild(OVTK_NodeId_Header_ChannelUnits); + m_writerHelper->openChild(OVTK_NodeId_Header_ChannelUnits_Dynamic); + m_writerHelper->setUInt(ip_bDynamic ? 1 : 0); + m_writerHelper->closeChild(); + m_writerHelper->closeChild(); + + return true; +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCChannelUnitsEncoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCChannelUnitsEncoder.h new file mode 100644 index 0000000..641dc75 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCChannelUnitsEncoder.h @@ -0,0 +1,56 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCStreamedMatrixEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CChannelUnitsEncoder final : public CStreamedMatrixEncoder +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processHeader() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixEncoder, OVP_ClassId_Algorithm_ChannelUnitsEncoder) + +protected: + + Kernel::TParameterHandler ip_bDynamic; +}; + + +class CChannelUnitsEncoderDesc final : public CStreamedMatrixEncoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Channel units stream encoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Encoders"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_ChannelUnitsEncoder; } + IPluginObject* create() override { return new CChannelUnitsEncoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CStreamedMatrixEncoderDesc::getAlgorithmPrototype(prototype); + + prototype.addInputParameter(OVP_Algorithm_ChannelUnitsEncoder_InputParameterId_Dynamic, "Dynamic", Kernel::ParameterType_Boolean); + // prototype.addInputParameter(OVP_Algorithm_ChannelUnitsEncoder_InputParameterId_MeasurementUnits, "Measurement units", Kernel::ParameterType_Matrix); + + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixEncoderDesc, OVP_ClassId_Algorithm_ChannelUnitsEncoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCEBMLBaseEncoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCEBMLBaseEncoder.cpp new file mode 100644 index 0000000..ef27c17 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCEBMLBaseEncoder.cpp @@ -0,0 +1,84 @@ +#include "ovpCEBMLBaseEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +// ________________________________________________________________________________________________________________ +// + +bool CEBMLBaseEncoder::initialize() +{ + op_buffer.initialize(getOutputParameter(OVP_Algorithm_EBMLEncoder_OutputParameterId_EncodedMemoryBuffer)); + + m_writer = createWriter(m_callbackProxy); + m_writerHelper = EBML::createWriterHelper(); + m_writerHelper->connect(m_writer); + + return true; +} + +bool CEBMLBaseEncoder::uninitialize() +{ + m_writerHelper->disconnect(); + m_writerHelper->release(); + m_writerHelper = nullptr; + + m_writer->release(); + m_writer = nullptr; + + op_buffer.uninitialize(); + + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CEBMLBaseEncoder::process() +{ + if (isInputTriggerActive(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeHeader)) + { + m_writerHelper->openChild(OVTK_NodeId_Header); + m_writerHelper->openChild(OVTK_NodeId_Header_StreamType); + m_writerHelper->setUInt(0); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Header_StreamVersion); + m_writerHelper->setUInt(0); + m_writerHelper->closeChild(); + this->processHeader(); + m_writerHelper->closeChild(); + activateOutputTrigger(OVP_Algorithm_EBMLEncoder_OutputTriggerId_MemoryBufferUpdated, true); + } + + if (isInputTriggerActive(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeBuffer)) + { + m_writerHelper->openChild(OVTK_NodeId_Buffer); + this->processBuffer(); + m_writerHelper->closeChild(); + activateOutputTrigger(OVP_Algorithm_EBMLEncoder_OutputTriggerId_MemoryBufferUpdated, true); + } + + if (isInputTriggerActive(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeEnd)) + { + m_writerHelper->openChild(OVTK_NodeId_End); + this->processEnd(); + m_writerHelper->closeChild(); + activateOutputTrigger(OVP_Algorithm_EBMLEncoder_OutputTriggerId_MemoryBufferUpdated, true); + } + + return true; +} + +// ________________________________________________________________________________________________________________ +// + +void CEBMLBaseEncoder::write(const void* buffer, const size_t size) +{ + const size_t currentBufferSize = op_buffer->getSize(); + op_buffer->setSize(currentBufferSize + size, false); + memcpy(op_buffer->getDirectPointer() + currentBufferSize, buffer, size); +} +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCEBMLBaseEncoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCEBMLBaseEncoder.h new file mode 100644 index 0000000..e04cfa3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCEBMLBaseEncoder.h @@ -0,0 +1,59 @@ +#pragma once + +#include "../../ovp_defines.h" +#include +#include + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CEBMLBaseEncoder : public Toolkit::TAlgorithm +{ +public: + + CEBMLBaseEncoder() : m_callbackProxy(*this, &CEBMLBaseEncoder::write) {} + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool process() override; + virtual bool processHeader() { return true; } + virtual bool processBuffer() { return true; } + virtual bool processEnd() { return true; } + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_EBMLBaseEncoder) + + // ebml callbacks + virtual void write(const void* buffer, size_t size); + +protected: + + Kernel::TParameterHandler op_buffer; + + EBML::IWriterHelper* m_writerHelper = nullptr; + EBML::IWriter* m_writer = nullptr; + EBML::TWriterCallbackProxy1 m_callbackProxy; +}; + +class CEBMLBaseEncoderDesc : public IAlgorithmDesc +{ +public: + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addOutputParameter(OVP_Algorithm_EBMLEncoder_OutputParameterId_EncodedMemoryBuffer, "Encoded memory buffer", + Kernel::ParameterType_MemoryBuffer); + prototype.addInputTrigger(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeHeader, "Encode header"); + prototype.addInputTrigger(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeBuffer, "Encode buffer"); + prototype.addInputTrigger(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeEnd, "Encode end"); + + return true; + } + + _IsDerivedFromClass_(IAlgorithmDesc, OVP_ClassId_Algorithm_EBMLBaseEncoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCExperimentInfoEncoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCExperimentInfoEncoder.cpp new file mode 100644 index 0000000..4cc620d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCExperimentInfoEncoder.cpp @@ -0,0 +1,92 @@ +#include "ovpCExperimentInfoEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +bool CExperimentInfoEncoder::initialize() +{ + CEBMLBaseEncoder::initialize(); + + ip_ExperimentID.initialize(getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_ExperimentID)); + ip_experimentDate.initialize(getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_ExperimentDate)); + ip_subjectID.initialize(getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectID)); + ip_subjectName.initialize(getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectName)); + ip_subjectAge.initialize(getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectAge)); + ip_subjectGender.initialize(getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectGender)); + ip_LaboratoryID.initialize(getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_LaboratoryID)); + ip_pLaboratoryName.initialize(getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_LaboratoryName)); + ip_TechnicianID.initialize(getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_TechnicianID)); + ip_pTechnicianName.initialize(getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_TechnicianName)); + + return true; +} + +bool CExperimentInfoEncoder::uninitialize() +{ + ip_pTechnicianName.uninitialize(); + ip_TechnicianID.uninitialize(); + ip_pLaboratoryName.uninitialize(); + ip_LaboratoryID.uninitialize(); + ip_subjectGender.uninitialize(); + ip_subjectAge.uninitialize(); + ip_subjectName.uninitialize(); + ip_subjectID.uninitialize(); + ip_experimentDate.uninitialize(); + ip_ExperimentID.uninitialize(); + + CEBMLBaseEncoder::uninitialize(); + + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CExperimentInfoEncoder::processHeader() +{ + m_writerHelper->openChild(OVTK_NodeId_Header_ExperimentInfo); + m_writerHelper->openChild(OVTK_NodeId_Header_ExperimentInfo_Experiment); + m_writerHelper->openChild(OVTK_NodeId_Header_ExperimentInfo_Experiment_ID); + m_writerHelper->setUInt(ip_ExperimentID); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Header_ExperimentInfo_Experiment_Date); + m_writerHelper->setStr(ip_experimentDate->toASCIIString()); + m_writerHelper->closeChild(); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Header_ExperimentInfo_Subject); + m_writerHelper->openChild(OVTK_NodeId_Header_ExperimentInfo_Subject_ID); + m_writerHelper->setUInt(ip_subjectID); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Header_ExperimentInfo_Subject_Name); + m_writerHelper->setStr(ip_subjectName->toASCIIString()); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Header_ExperimentInfo_Subject_Age); + m_writerHelper->setUInt(ip_subjectAge); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Header_ExperimentInfo_Subject_Gender); + m_writerHelper->setUInt(ip_subjectGender); + m_writerHelper->closeChild(); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Header_ExperimentInfo_Context); + m_writerHelper->openChild(OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryID); + m_writerHelper->setUInt(ip_LaboratoryID); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryName); + m_writerHelper->setStr(ip_pLaboratoryName->toASCIIString()); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianID); + m_writerHelper->setUInt(ip_TechnicianID); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianName); + m_writerHelper->setStr(ip_pTechnicianName->toASCIIString()); + m_writerHelper->closeChild(); + m_writerHelper->closeChild(); + m_writerHelper->closeChild(); + + return true; +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCExperimentInfoEncoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCExperimentInfoEncoder.h new file mode 100644 index 0000000..92d9f96 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCExperimentInfoEncoder.h @@ -0,0 +1,74 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCEBMLBaseEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CExperimentInfoEncoder final : public CEBMLBaseEncoder +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processHeader() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseEncoder, OVP_ClassId_Algorithm_ExperimentInfoEncoder) + +protected: + + Kernel::TParameterHandler ip_ExperimentID; + Kernel::TParameterHandler ip_experimentDate; + + Kernel::TParameterHandler ip_subjectID; + Kernel::TParameterHandler ip_subjectName; + Kernel::TParameterHandler ip_subjectAge; + Kernel::TParameterHandler ip_subjectGender; + + Kernel::TParameterHandler ip_LaboratoryID; + Kernel::TParameterHandler ip_pLaboratoryName; + Kernel::TParameterHandler ip_TechnicianID; + Kernel::TParameterHandler ip_pTechnicianName; +}; + +class CExperimentInfoEncoderDesc final : public CEBMLBaseEncoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Experiment information stream encoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Encoders"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_ExperimentInfoEncoder; } + IPluginObject* create() override { return new CExperimentInfoEncoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CEBMLBaseEncoderDesc::getAlgorithmPrototype(prototype); + + prototype.addInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_ExperimentID, "Experiment identifier", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_ExperimentDate, "Experiment date", Kernel::ParameterType_String); + prototype.addInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectID, "Subject identifier", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectName, "Subject name", Kernel::ParameterType_String); + prototype.addInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectAge, "Subject age", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectGender, "Subject gender", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_LaboratoryID, "Laboratory identifier", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_LaboratoryName, "Laboratory name", Kernel::ParameterType_String); + prototype.addInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_TechnicianID, "Technician identifier", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_TechnicianName, "Technician name", Kernel::ParameterType_String); + + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseEncoderDesc, OVP_ClassId_Algorithm_ExperimentInfoEncoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCFeatureVectorEncoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCFeatureVectorEncoder.cpp new file mode 100644 index 0000000..0fc1b29 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCFeatureVectorEncoder.cpp @@ -0,0 +1,19 @@ +#include "ovpCFeatureVectorEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +bool CFeatureVectorEncoder::processHeader() +{ + OV_ERROR_UNLESS_KRF(ip_pMatrix->getDimensionCount() == 1, "Invalid feature vector: found " << ip_pMatrix->getDimensionCount() << " dimensions, 1 expected", + Kernel::ErrorType::BadInput); + + CStreamedMatrixEncoder::processHeader(); + + return true; +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCFeatureVectorEncoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCFeatureVectorEncoder.h new file mode 100644 index 0000000..9d0e610 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCFeatureVectorEncoder.h @@ -0,0 +1,45 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCStreamedMatrixEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CFeatureVectorEncoder final : public CStreamedMatrixEncoder +{ +public: + void release() override { delete this; } + bool processHeader() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixEncoder, OVP_ClassId_Algorithm_FeatureVectorEncoder) +}; + +class CFeatureVectorEncoderDesc final : public CStreamedMatrixEncoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Feature vector stream encoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Encoders"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_FeatureVectorEncoder; } + IPluginObject* create() override { return new CFeatureVectorEncoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CStreamedMatrixEncoderDesc::getAlgorithmPrototype(prototype); + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixEncoderDesc, OVP_ClassId_Algorithm_FeatureVectorEncoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCMasterAcquisitionEncoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCMasterAcquisitionEncoder.cpp new file mode 100644 index 0000000..0f6a54b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCMasterAcquisitionEncoder.cpp @@ -0,0 +1,231 @@ +#include "ovpCMasterAcquisitionEncoder.h" +#include "../../algorithms/encoders/ovpCAcquisitionEncoder.h" +#include "../../algorithms/encoders/ovpCExperimentInfoEncoder.h" +#include "../../algorithms/encoders/ovpCSignalEncoder.h" +#include "../../algorithms/encoders/ovpCStimulationEncoder.h" +#include "../../algorithms/encoders/ovpCChannelLocalisationEncoder.h" +#include "../../algorithms/encoders/ovpCChannelUnitsEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +bool CMasterAcquisitionEncoder::initialize() +{ + // Manages sub-algorithms + + m_acquisitionStreamEncoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_AcquisitionEncoder)); + m_experimentInfoStreamEncoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_ExperimentInfoEncoder)); + m_signalStreamEncoder = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_SignalEncoder)); + m_stimulationStreamEncoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_StimulationEncoder)); + m_channelLocalisationStreamEncoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_ChannelLocalisationEncoder)); + m_channelUnitsStreamEncoder = &this->getAlgorithmManager().getAlgorithm( + this->getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_ChannelUnitsEncoder)); + + m_acquisitionStreamEncoder->initialize(); + m_experimentInfoStreamEncoder->initialize(); + m_signalStreamEncoder->initialize(); + m_stimulationStreamEncoder->initialize(); + m_channelLocalisationStreamEncoder->initialize(); + m_channelUnitsStreamEncoder->initialize(); + + // Declares parameter handlers for this algorithm + + Kernel::TParameterHandler ip_subjectID(this->getInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectID)); + Kernel::TParameterHandler ip_subjectAge(this->getInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectAge)); + Kernel::TParameterHandler ip_subjectGender(this->getInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectGender)); + Kernel::TParameterHandler ip_pMatrix(this->getInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SignalMatrix)); + Kernel::TParameterHandler ip_sampling(this->getInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SignalSampling)); + Kernel::TParameterHandler ip_stimSet(this->getInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_StimulationSet)); + Kernel::TParameterHandler ip_bufferDuration(this->getInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_BufferDuration)); + Kernel::TParameterHandler op_buffer(this->getOutputParameter(OVP_Algorithm_EBMLEncoder_OutputParameterId_EncodedMemoryBuffer)); + Kernel::TParameterHandler ip_channelLocalisationMaster( + this->getInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_ChannelLocalisation)); + Kernel::TParameterHandler ip_channelUnitsMaster(this->getInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_ChannelUnits)); + + // Declares parameter handlers for sub-algorithm acquisition + + Kernel::TParameterHandler ip_pAcquisitionChannelUnitsMemoryBuffer( + m_acquisitionStreamEncoder->getInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_ChannelUnitsStream)); + Kernel::TParameterHandler ip_pAcquisitionChannelLocalisationMemoryBuffer( + m_acquisitionStreamEncoder->getInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_ChannelLocalisationStream)); + Kernel::TParameterHandler ip_pAcquisitionExperimentInfoMemoryBuffer( + m_acquisitionStreamEncoder->getInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_ExperimentInfoStream)); + Kernel::TParameterHandler ip_pAcquisitionSignalMemoryBuffer( + m_acquisitionStreamEncoder->getInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_SignalStream)); + Kernel::TParameterHandler ip_pAcquisitionStimulationMemoryBuffer( + m_acquisitionStreamEncoder->getInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_StimulationStream)); + Kernel::TParameterHandler ip_AcquisitionBufferDuration( + m_acquisitionStreamEncoder->getInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_BufferDuration)); + Kernel::TParameterHandler op_pAcquisitionMemoryBuffer( + m_acquisitionStreamEncoder->getOutputParameter(OVP_Algorithm_EBMLEncoder_OutputParameterId_EncodedMemoryBuffer)); + + // Declares parameter handlers for sub-algorithm experiment information + + // Kernel::TParameterHandler ip_ExperimentInfoExperimentID(m_experimentInfoStreamEncoder->getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_ExperimentID)); + // Kernel::TParameterHandler ip_experimentInfoExperimentDate(m_experimentInfoStreamEncoder->getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_ExperimentDate)); + Kernel::TParameterHandler ip_ExperimentInfoSubjectID( + m_experimentInfoStreamEncoder->getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectID)); + // Kernel::TParameterHandler< CString*> ip_experimentInfoSubjectName(m_experimentInfoStreamEncoder->getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectName)); + Kernel::TParameterHandler ip_ExperimentInfoSubjectAge( + m_experimentInfoStreamEncoder->getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectAge)); + Kernel::TParameterHandler ip_ExperimentInfoSubjectGender( + m_experimentInfoStreamEncoder->getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectGender)); + // Kernel::TParameterHandler ip_ExperimentInfoLaboratoryID(m_experimentInfoStreamEncoder->getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_LaboratoryID)); + // Kernel::TParameterHandler ip_experimentInfoLaboratoryName(m_experimentInfoStreamEncoder->getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_LaboratoryName)); + // Kernel::TParameterHandler ip_ExperimentInfoTechnicianID(m_experimentInfoStreamEncoder->getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_TechnicianID)); + // Kernel::TParameterHandler ip_experimentInfoTehnicianName(m_experimentInfoStreamEncoder->getInputParameter(OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_TechnicianName)); + Kernel::TParameterHandler op_experimentInfoMemoryBuffer( + m_experimentInfoStreamEncoder->getOutputParameter(OVP_Algorithm_EBMLEncoder_OutputParameterId_EncodedMemoryBuffer)); + + // Declares parameter handlers for sub-algorithm signal + + Kernel::TParameterHandler ip_matrix(m_signalStreamEncoder->getInputParameter(OVP_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)); + Kernel::TParameterHandler ip_signalSamplingRate(m_signalStreamEncoder->getInputParameter(OVP_Algorithm_SignalEncoder_InputParameterId_Sampling)); + Kernel::TParameterHandler op_signalMemoryBuffer( + m_signalStreamEncoder->getOutputParameter(OVP_Algorithm_EBMLEncoder_OutputParameterId_EncodedMemoryBuffer)); + + // Declares parameter handlers for sub-algorithm stimulation + + Kernel::TParameterHandler ip_stimulationStimulationSet( + m_stimulationStreamEncoder->getInputParameter(OVP_Algorithm_StimulationEncoder_InputParameterId_StimulationSet)); + Kernel::TParameterHandler op_stimulationMemoryBuffer( + m_stimulationStreamEncoder->getOutputParameter(OVP_Algorithm_EBMLEncoder_OutputParameterId_EncodedMemoryBuffer)); + + Kernel::TParameterHandler ip_channelLocalisation( + m_channelLocalisationStreamEncoder->getInputParameter(OVP_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)); + Kernel::TParameterHandler op_channelLocalisationMemoryBuffer( + m_channelLocalisationStreamEncoder->getOutputParameter(OVP_Algorithm_EBMLEncoder_OutputParameterId_EncodedMemoryBuffer)); + + Kernel::TParameterHandler ip_pUnits(m_channelUnitsStreamEncoder->getInputParameter(OVP_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)); + Kernel::TParameterHandler op_channelUnitsMemoryBuffer( + m_channelUnitsStreamEncoder->getOutputParameter(OVP_Algorithm_EBMLEncoder_OutputParameterId_EncodedMemoryBuffer)); + + + // Manage parameter connection / referencing | this algorithm to sub algorithm + + ip_ExperimentInfoSubjectID.setReferenceTarget(ip_subjectID); + ip_ExperimentInfoSubjectAge.setReferenceTarget(ip_subjectAge); + ip_ExperimentInfoSubjectGender.setReferenceTarget(ip_subjectGender); + ip_matrix.setReferenceTarget(ip_pMatrix); + ip_signalSamplingRate.setReferenceTarget(ip_sampling); + ip_stimulationStimulationSet.setReferenceTarget(ip_stimSet); + ip_AcquisitionBufferDuration.setReferenceTarget(ip_bufferDuration); + op_buffer.setReferenceTarget(op_pAcquisitionMemoryBuffer); + ip_channelLocalisationMaster.setReferenceTarget(ip_channelLocalisation); + ip_channelUnitsMaster.setReferenceTarget(ip_pUnits); + + // Manage parameter connection / referencing | sub-algorithm to sub algorithm + + ip_pAcquisitionExperimentInfoMemoryBuffer.setReferenceTarget(op_experimentInfoMemoryBuffer); + ip_pAcquisitionSignalMemoryBuffer.setReferenceTarget(op_signalMemoryBuffer); + ip_pAcquisitionStimulationMemoryBuffer.setReferenceTarget(op_stimulationMemoryBuffer); + ip_pAcquisitionChannelLocalisationMemoryBuffer.setReferenceTarget(op_channelLocalisationMemoryBuffer); + ip_pAcquisitionChannelUnitsMemoryBuffer.setReferenceTarget(op_channelUnitsMemoryBuffer); + + return true; +} + +bool CMasterAcquisitionEncoder::uninitialize() +{ + m_channelUnitsStreamEncoder->uninitialize(); + m_channelLocalisationStreamEncoder->uninitialize(); + m_stimulationStreamEncoder->uninitialize(); + m_signalStreamEncoder->uninitialize(); + m_experimentInfoStreamEncoder->uninitialize(); + m_acquisitionStreamEncoder->uninitialize(); + + this->getAlgorithmManager().releaseAlgorithm(*m_channelUnitsStreamEncoder); + this->getAlgorithmManager().releaseAlgorithm(*m_channelLocalisationStreamEncoder); + this->getAlgorithmManager().releaseAlgorithm(*m_stimulationStreamEncoder); + this->getAlgorithmManager().releaseAlgorithm(*m_signalStreamEncoder); + this->getAlgorithmManager().releaseAlgorithm(*m_experimentInfoStreamEncoder); + this->getAlgorithmManager().releaseAlgorithm(*m_acquisitionStreamEncoder); + + return true; +} + +bool CMasterAcquisitionEncoder::process() +{ + Kernel::TParameterHandler ip_pAcquisitionChannelUnitsMemoryBuffer( + m_acquisitionStreamEncoder->getInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_ChannelUnitsStream)); + Kernel::TParameterHandler ip_pAcquisitionChannelLocalisationMemoryBuffer( + m_acquisitionStreamEncoder->getInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_ChannelLocalisationStream)); + Kernel::TParameterHandler ip_pAcquisitionExperimentInfoMemoryBuffer( + m_acquisitionStreamEncoder->getInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_ExperimentInfoStream)); + Kernel::TParameterHandler ip_pAcquisitionSignalMemoryBuffer( + m_acquisitionStreamEncoder->getInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_SignalStream)); + Kernel::TParameterHandler ip_pAcquisitionStimulationMemoryBuffer( + m_acquisitionStreamEncoder->getInputParameter(OVP_Algorithm_AcquisitionEncoder_InputParameterId_StimulationStream)); + // Kernel::TParameterHandler < IMemoryBuffer* > op_pAcquisitionMemoryBuffer(m_acquisitionStreamEncoder->getOutputParameter(OVP_Algorithm_EBMLEncoder_OutputParameterId_EncodedMemoryBuffer)); + + if (this->isInputTriggerActive(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeHeader)) + { + ip_pAcquisitionChannelUnitsMemoryBuffer->setSize(0, true); + ip_pAcquisitionChannelLocalisationMemoryBuffer->setSize(0, true); + ip_pAcquisitionExperimentInfoMemoryBuffer->setSize(0, true); + ip_pAcquisitionSignalMemoryBuffer->setSize(0, true); + ip_pAcquisitionStimulationMemoryBuffer->setSize(0, true); + // op_pAcquisitionMemoryBuffer->setSize(0, true); + + m_channelLocalisationStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeHeader); + m_channelUnitsStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeHeader); + m_stimulationStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeHeader); + m_signalStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeHeader); + m_experimentInfoStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeHeader); + m_acquisitionStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeHeader); + } + if (this->isInputTriggerActive(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeBuffer)) + { + ip_pAcquisitionChannelUnitsMemoryBuffer->setSize(0, true); + ip_pAcquisitionChannelLocalisationMemoryBuffer->setSize(0, true); + ip_pAcquisitionExperimentInfoMemoryBuffer->setSize(0, true); + ip_pAcquisitionSignalMemoryBuffer->setSize(0, true); + ip_pAcquisitionStimulationMemoryBuffer->setSize(0, true); + // op_pAcquisitionMemoryBuffer->setSize(0, true); + + // For these streams, we only send the buffer if there is something to send + const Kernel::TParameterHandler + ip_bEncodeUnitData(this->getInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_EncodeChannelUnitData)); + if (ip_bEncodeUnitData) + { + // this->getLogManager() << Kernel::LogLevel_Info << "Encoding units " << ip_pUnits->getBufferElementCount() << "\n"; + m_channelUnitsStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeBuffer); + } + + const Kernel::TParameterHandler ip_encodeChannelLocalisationData( + this->getInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_EncodeChannelLocalisationData)); + if (ip_encodeChannelLocalisationData) { m_channelLocalisationStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeBuffer); } + + m_stimulationStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeBuffer); + m_signalStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeBuffer); + m_experimentInfoStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeBuffer); + m_acquisitionStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeBuffer); + } + if (this->isInputTriggerActive(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeEnd)) + { + ip_pAcquisitionChannelUnitsMemoryBuffer->setSize(0, true); + ip_pAcquisitionChannelLocalisationMemoryBuffer->setSize(0, true); + ip_pAcquisitionExperimentInfoMemoryBuffer->setSize(0, true); + ip_pAcquisitionSignalMemoryBuffer->setSize(0, true); + ip_pAcquisitionStimulationMemoryBuffer->setSize(0, true); + // op_pAcquisitionMemoryBuffer->setSize(0, true); + + m_channelUnitsStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeEnd); + m_channelLocalisationStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeEnd); + m_stimulationStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeEnd); + m_signalStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeEnd); + m_experimentInfoStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeEnd); + m_acquisitionStreamEncoder->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeEnd); + } + + return true; +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCMasterAcquisitionEncoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCMasterAcquisitionEncoder.h new file mode 100644 index 0000000..7b06109 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCMasterAcquisitionEncoder.h @@ -0,0 +1,79 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCEBMLBaseEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CMasterAcquisitionEncoder final : public Toolkit::TAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TAlgorithm, OVP_ClassId_Algorithm_MasterAcquisitionEncoder) + +protected: + + Kernel::IAlgorithmProxy* m_acquisitionStreamEncoder = nullptr; + Kernel::IAlgorithmProxy* m_experimentInfoStreamEncoder = nullptr; + Kernel::IAlgorithmProxy* m_signalStreamEncoder = nullptr; + Kernel::IAlgorithmProxy* m_stimulationStreamEncoder = nullptr; + Kernel::IAlgorithmProxy* m_channelLocalisationStreamEncoder = nullptr; + Kernel::IAlgorithmProxy* m_channelUnitsStreamEncoder = nullptr; +}; + +class CMasterAcquisitionEncoderDesc final : public IAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Master acquisition stream encoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Encoders"); } + CString getVersion() const override { return CString("1.1"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_MasterAcquisitionEncoder; } + IPluginObject* create() override { return new CMasterAcquisitionEncoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputTrigger(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeHeader, "Encode header"); + prototype.addInputTrigger(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeBuffer, "Encode buffer"); + prototype.addInputTrigger(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeEnd, "Encode end"); + + prototype.addInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectID, "Subject identifier", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectAge, "Subject age", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectGender, "Subject gender", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SignalMatrix, "Signal matrix", Kernel::ParameterType_Matrix); + prototype.addInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SignalSampling, "Signal sampling rate", + Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_StimulationSet, "Stimulation set", + Kernel::ParameterType_StimulationSet); + prototype.addInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_BufferDuration, "Buffer duration", Kernel::ParameterType_UInteger); + prototype.addInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_ChannelLocalisation, "Channel localisation", + Kernel::ParameterType_Matrix); + prototype.addInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_ChannelUnits, "Channel units", Kernel::ParameterType_Matrix); + prototype.addInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_EncodeChannelLocalisationData, "Encode channel localisation data", + Kernel::ParameterType_Boolean); + prototype.addInputParameter(OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_EncodeChannelUnitData, "Encode channel unit data", + Kernel::ParameterType_Boolean); + + prototype.addOutputParameter(OVP_Algorithm_EBMLEncoder_OutputParameterId_EncodedMemoryBuffer, "Encoded memory buffer", + Kernel::ParameterType_MemoryBuffer); + + return true; + } + + _IsDerivedFromClass_Final_(IAlgorithmDesc, OVP_ClassId_Algorithm_MasterAcquisitionEncoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCSignalEncoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCSignalEncoder.cpp new file mode 100644 index 0000000..cbf9658 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCSignalEncoder.cpp @@ -0,0 +1,39 @@ +#include "ovpCSignalEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +bool CSignalEncoder::initialize() +{ + CStreamedMatrixEncoder::initialize(); + ip_sampling.initialize(getInputParameter(OVP_Algorithm_SignalEncoder_InputParameterId_Sampling)); + return true; +} + +bool CSignalEncoder::uninitialize() +{ + ip_sampling.uninitialize(); + CStreamedMatrixEncoder::uninitialize(); + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CSignalEncoder::processHeader() +{ + m_writerHelper->openChild(OVTK_NodeId_Header_Signal); + m_writerHelper->openChild(OVTK_NodeId_Header_Signal_Sampling); + m_writerHelper->setUInt(ip_sampling); + m_writerHelper->closeChild(); + m_writerHelper->closeChild(); + + CStreamedMatrixEncoder::processHeader(); + + return true; +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCSignalEncoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCSignalEncoder.h new file mode 100644 index 0000000..4777430 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCSignalEncoder.h @@ -0,0 +1,53 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCStreamedMatrixEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CSignalEncoder final : public CStreamedMatrixEncoder +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processHeader() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixEncoder, OVP_ClassId_Algorithm_SignalEncoder) + +protected: + + Kernel::TParameterHandler ip_sampling; +}; + + +class CSignalEncoderDesc final : public CStreamedMatrixEncoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Signal stream encoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Encoders"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_SignalEncoder; } + IPluginObject* create() override { return new CSignalEncoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CStreamedMatrixEncoderDesc::getAlgorithmPrototype(prototype); + prototype.addInputParameter(OVP_Algorithm_SignalEncoder_InputParameterId_Sampling, "Sampling rate", Kernel::ParameterType_UInteger); + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixEncoderDesc, OVP_ClassId_Algorithm_SignalEncoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCSpectrumEncoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCSpectrumEncoder.cpp new file mode 100755 index 0000000..e9ec14b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCSpectrumEncoder.cpp @@ -0,0 +1,53 @@ +#include "ovpCSpectrumEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +bool CSpectrumEncoder::initialize() +{ + CStreamedMatrixEncoder::initialize(); + ip_frequencyAbscissa.initialize(getInputParameter(OVP_Algorithm_SpectrumEncoder_InputParameterId_FrequencyAbscissa)); + ip_sampling.initialize(getInputParameter(OVP_Algorithm_SpectrumEncoder_InputParameterId_Sampling)); + return true; +} + +bool CSpectrumEncoder::uninitialize() +{ + ip_frequencyAbscissa.uninitialize(); + ip_sampling.uninitialize(); + + CStreamedMatrixEncoder::uninitialize(); + + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CSpectrumEncoder::processHeader() +{ + // ip_frequencyAbscissa dimension count should be 1 + // ip_frequencyAbscissa dimension size 0 should be the same as streamed matrix dimension size 1 + + CMatrix* frequencyAbscissa = ip_frequencyAbscissa; + const uint64_t sampling = ip_sampling; + CStreamedMatrixEncoder::processHeader(); + m_writerHelper->openChild(OVTK_NodeId_Header_Spectrum); + m_writerHelper->openChild(OVTK_NodeId_Header_Spectrum_Sampling); + m_writerHelper->setUInt(sampling); + m_writerHelper->closeChild(); + for (size_t i = 0; i < frequencyAbscissa->getDimensionSize(0); ++i) + { + m_writerHelper->openChild(OVTK_NodeId_Header_Spectrum_FrequencyAbscissa); + m_writerHelper->setDouble(frequencyAbscissa->getBuffer()[i]); + m_writerHelper->closeChild(); + } + m_writerHelper->closeChild(); + + return true; +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCSpectrumEncoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCSpectrumEncoder.h new file mode 100755 index 0000000..c15e4f0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCSpectrumEncoder.h @@ -0,0 +1,55 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCStreamedMatrixEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CSpectrumEncoder final : public CStreamedMatrixEncoder +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processHeader() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixEncoder, OVP_ClassId_Algorithm_SpectrumEncoder) + +protected: + Kernel::TParameterHandler ip_frequencyAbscissa; + Kernel::TParameterHandler ip_sampling; +}; + +class CSpectrumEncoderDesc final : public CStreamedMatrixEncoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Spectrum stream encoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Encodes a Spectrum stream."); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Encoders"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.1.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_SpectrumEncoder; } + IPluginObject* create() override { return new CSpectrumEncoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CStreamedMatrixEncoderDesc::getAlgorithmPrototype(prototype); + + prototype.addInputParameter(OVP_Algorithm_SpectrumEncoder_InputParameterId_FrequencyAbscissa, "Frequency abscissa", Kernel::ParameterType_Matrix); + prototype.addInputParameter(OVP_Algorithm_SpectrumEncoder_InputParameterId_Sampling, "Sampling rate", Kernel::ParameterType_UInteger); + + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CStreamedMatrixEncoderDesc, OVP_ClassId_Algorithm_SpectrumEncoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStimulationEncoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStimulationEncoder.cpp new file mode 100644 index 0000000..a8b3c48 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStimulationEncoder.cpp @@ -0,0 +1,53 @@ +#include "ovpCStimulationEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +bool CStimulationEncoder::initialize() +{ + CEBMLBaseEncoder::initialize(); + ip_stimSet.initialize(getInputParameter(OVP_Algorithm_StimulationEncoder_InputParameterId_StimulationSet)); + return true; +} + +bool CStimulationEncoder::uninitialize() +{ + ip_stimSet.uninitialize(); + CEBMLBaseEncoder::uninitialize(); + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CStimulationEncoder::processBuffer() +{ + IStimulationSet* stimulationSet = ip_stimSet; + + m_writerHelper->openChild(OVTK_NodeId_Buffer_Stimulation); + m_writerHelper->openChild(OVTK_NodeId_Buffer_Stimulation_NumberOfStimulations); + m_writerHelper->setUInt(stimulationSet->getStimulationCount()); + m_writerHelper->closeChild(); + for (size_t i = 0; i < stimulationSet->getStimulationCount(); ++i) + { + m_writerHelper->openChild(OVTK_NodeId_Buffer_Stimulation_Stimulation); + m_writerHelper->openChild(OVTK_NodeId_Buffer_Stimulation_Stimulation_ID); + m_writerHelper->setUInt(stimulationSet->getStimulationIdentifier(i)); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Buffer_Stimulation_Stimulation_Date); + m_writerHelper->setUInt(stimulationSet->getStimulationDate(i)); + m_writerHelper->closeChild(); + m_writerHelper->openChild(OVTK_NodeId_Buffer_Stimulation_Stimulation_Duration); + m_writerHelper->setUInt(stimulationSet->getStimulationDuration(i)); + m_writerHelper->closeChild(); + m_writerHelper->closeChild(); + } + m_writerHelper->closeChild(); + + return true; +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStimulationEncoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStimulationEncoder.h new file mode 100644 index 0000000..d03f960 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStimulationEncoder.h @@ -0,0 +1,52 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCEBMLBaseEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CStimulationEncoder final : public CEBMLBaseEncoder +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processBuffer() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseEncoder, OVP_ClassId_Algorithm_StimulationEncoder) + +protected: + + Kernel::TParameterHandler ip_stimSet; +}; + +class CStimulationEncoderDesc final : public CEBMLBaseEncoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Stimulation stream encoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Encoders"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_StimulationEncoder; } + IPluginObject* create() override { return new CStimulationEncoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CEBMLBaseEncoderDesc::getAlgorithmPrototype(prototype); + prototype.addInputParameter(OVP_Algorithm_StimulationEncoder_InputParameterId_StimulationSet, "Stimulation set", Kernel::ParameterType_StimulationSet); + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseEncoderDesc, OVP_ClassId_Algorithm_StimulationEncoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStreamedMatrixEncoder.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStreamedMatrixEncoder.cpp new file mode 100644 index 0000000..8aa910c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStreamedMatrixEncoder.cpp @@ -0,0 +1,79 @@ +#include "ovpCStreamedMatrixEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +bool CStreamedMatrixEncoder::initialize() +{ + CEBMLBaseEncoder::initialize(); + ip_pMatrix.initialize(getInputParameter(OVP_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)); + m_size = 0; + return true; +} + +bool CStreamedMatrixEncoder::uninitialize() +{ + ip_pMatrix.uninitialize(); + CEBMLBaseEncoder::uninitialize(); + return true; +} + +// ________________________________________________________________________________________________________________ +// + +bool CStreamedMatrixEncoder::processHeader() +{ + CMatrix* matrix = ip_pMatrix; + size_t j; + + m_size = (matrix->getDimensionCount() == 0 ? 0 : 1); + + m_writerHelper->openChild(OVTK_NodeId_Header_StreamedMatrix); + m_writerHelper->openChild(OVTK_NodeId_Header_StreamedMatrix_DimensionCount); + m_writerHelper->setUInt(matrix->getDimensionCount()); + m_writerHelper->closeChild(); + for (size_t i = 0; i < matrix->getDimensionCount(); ++i) + { + m_size *= matrix->getDimensionSize(i); + m_writerHelper->openChild(OVTK_NodeId_Header_StreamedMatrix_Dimension); + m_writerHelper->openChild(OVTK_NodeId_Header_StreamedMatrix_Dimension_Size); + m_writerHelper->setUInt(matrix->getDimensionSize(i)); + m_writerHelper->closeChild(); + bool shouldSendLabels = false; + for (j = 0; j < matrix->getDimensionSize(i) && !shouldSendLabels; ++j) + { + if (matrix->getDimensionLabel(i, j) != nullptr && matrix->getDimensionLabel(i, j)[0] != '\0') { shouldSendLabels = true; } + } + if (shouldSendLabels) + { + for (j = 0; j < matrix->getDimensionSize(i); ++j) + { + m_writerHelper->openChild(OVTK_NodeId_Header_StreamedMatrix_Dimension_Label); + m_writerHelper->setStr(matrix->getDimensionLabel(i, j)); + m_writerHelper->closeChild(); + } + } + m_writerHelper->closeChild(); + } + m_writerHelper->closeChild(); + + return true; +} + +bool CStreamedMatrixEncoder::processBuffer() +{ + CMatrix* matrix = ip_pMatrix; + + m_writerHelper->openChild(OVTK_NodeId_Buffer_StreamedMatrix); + m_writerHelper->openChild(OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer); + m_writerHelper->setBinary(matrix->getBuffer(), m_size * sizeof(double)); + m_writerHelper->closeChild(); + m_writerHelper->closeChild(); + + return true; +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStreamedMatrixEncoder.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStreamedMatrixEncoder.h new file mode 100644 index 0000000..78da927 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/algorithms/encoders/ovpCStreamedMatrixEncoder.h @@ -0,0 +1,57 @@ +#pragma once + +#include "../../ovp_defines.h" +#include "ovpCEBMLBaseEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CStreamedMatrixEncoder : public CEBMLBaseEncoder +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processHeader() override; + bool processBuffer() override; + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseEncoder, OVP_ClassId_Algorithm_StreamedMatrixEncoder) + +protected: + + Kernel::TParameterHandler ip_pMatrix; + +private: + + size_t m_size = 0; +}; + +class CStreamedMatrixEncoderDesc : public CEBMLBaseEncoderDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Streamed matrix stream encoder"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString(""); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Stream codecs/Encoders"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_Algorithm_StreamedMatrixEncoder; } + IPluginObject* create() override { return new CStreamedMatrixEncoder(); } + + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CEBMLBaseEncoderDesc::getAlgorithmPrototype(prototype); + prototype.addInputParameter(OVP_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix, "Matrix", Kernel::ParameterType_Matrix); + return true; + } + + _IsDerivedFromClass_Final_(StreamCodecs::CEBMLBaseEncoderDesc, OVP_ClassId_Algorithm_StreamedMatrixEncoderDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/box-algorithms/ovpCDecoderAlgorithmTest.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/box-algorithms/ovpCDecoderAlgorithmTest.cpp new file mode 100755 index 0000000..6252ed5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/box-algorithms/ovpCDecoderAlgorithmTest.cpp @@ -0,0 +1,131 @@ +#include "ovpCDecoderAlgorithmTest.h" + +#include "../algorithms/decoders/ovpCExperimentInfoDecoder.h" +#include "../algorithms/decoders/ovpCFeatureVectorDecoder.h" +#include "../algorithms/decoders/ovpCSignalDecoder.h" +#include "../algorithms/decoders/ovpCSpectrumDecoder.h" +#include "../algorithms/decoders/ovpCStimulationDecoder.h" +#include "../algorithms/decoders/ovpCChannelLocalisationDecoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +static std::stringstream print(CMatrix& matrix) +{ + std::stringstream ss; + ss << "Matrix :\n"; + ss << " | Dimension count : " << matrix.getDimensionCount() << "\n"; + for (size_t i = 0; i < matrix.getDimensionCount(); ++i) + { + ss << " | Dimension size " << i << " : " << matrix.getDimensionSize(i) << "\n"; + for (size_t j = 0; j < matrix.getDimensionSize(i); ++j) + { + ss << " | Dimension label " << i << " " << j << " : " << matrix.getDimensionLabel(i, j) << "\n"; + } + } + return ss; +} + +static std::stringstream print(IStimulationSet& stimSet) +{ + std::stringstream ss; + ss << "Stimulation set :\n"; + ss << " | Number of elements : " << stimSet.getStimulationCount() << "\n"; + for (size_t i = 0; i < stimSet.getStimulationCount(); ++i) + { + ss << " | Stimulation " << i << " : " + << "id = " << stimSet.getStimulationIdentifier(i) << " " + << "date = " << stimSet.getStimulationDate(i) << " " + << "duration = " << stimSet.getStimulationDuration(i) << "\n"; + } + return ss; +} + +bool CDecoderAlgorithmTest::initialize() +{ + m_decoder[0] = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_ExperimentInfoDecoder)); + m_decoder[1] = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_FeatureVectorDecoder)); + m_decoder[2] = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_SignalDecoder)); + m_decoder[3] = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_SpectrumDecoder)); + m_decoder[4] = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_StimulationDecoder)); + m_decoder[5] = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_StreamedMatrixDecoder)); + m_decoder[6] = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_ChannelLocalisationDecoder)); + + for (size_t i = 0; i < 7; ++i) + { + m_decoder[i]->initialize(); + ip_buffer[i].initialize(m_decoder[i]->getInputParameter(OVP_Algorithm_EBMLDecoder_InputParameterId_MemoryBufferToDecode)); + } + + return true; +} + +bool CDecoderAlgorithmTest::uninitialize() +{ + for (size_t i = 0; i < 7; ++i) + { + ip_buffer[i].uninitialize(); + m_decoder[i]->uninitialize(); + getAlgorithmManager().releaseAlgorithm(*m_decoder[i]); + m_decoder[i] = nullptr; + } + + return true; +} + +bool CDecoderAlgorithmTest::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CDecoderAlgorithmTest::process() +{ + Kernel::IBoxIO& boxContext = getDynamicBoxContext(); + const size_t nInput = getStaticBoxContext().getInputCount(); + + for (size_t i = 0; i < nInput; ++i) + { + for (size_t j = 0; j < boxContext.getInputChunkCount(i); ++j) + { + ip_buffer[i] = boxContext.getInputChunk(i, j); + m_decoder[i]->process(); + + if (m_decoder[i]->isOutputTriggerActive(OVP_Algorithm_EBMLDecoder_OutputTriggerId_ReceivedHeader)) + { + { + Kernel::TParameterHandler handler(m_decoder[i]->getOutputParameter(OVP_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + if (handler.exists()) { OV_WARNING_K(print(*handler).str()); } + } + + { + Kernel::TParameterHandler handler(m_decoder[i]->getOutputParameter(OVP_Algorithm_SpectrumDecoder_OutputParameterId_FrequencyAbscissa)); + if (handler.exists()) { OV_WARNING_K(print(*handler).str()); } + } + + { + Kernel::TParameterHandler handler(m_decoder[i]->getOutputParameter(OVP_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + if (handler.exists()) { OV_WARNING_K(handler); } + } + } + + if (m_decoder[i]->isOutputTriggerActive(OVP_Algorithm_EBMLDecoder_OutputTriggerId_ReceivedBuffer)) + { + { + Kernel::TParameterHandler + handler(m_decoder[i]->getOutputParameter(OVP_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + if (handler.exists()) { getLogManager() << Kernel::LogLevel_Warning << print(*handler).str() << "\n"; } + } + } + + boxContext.markInputAsDeprecated(i, j); + } + } + + return true; +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/box-algorithms/ovpCDecoderAlgorithmTest.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/box-algorithms/ovpCDecoderAlgorithmTest.h new file mode 100644 index 0000000..3be261e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/box-algorithms/ovpCDecoderAlgorithmTest.h @@ -0,0 +1,66 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CDecoderAlgorithmTest final : public Toolkit::TBoxAlgorithm +{ +public: + + CDecoderAlgorithmTest() { } + ~CDecoderAlgorithmTest() override { } + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_DecoderAlgorithmTest) + +protected: + + std::array m_decoder; + std::array, 7> ip_buffer; +}; + +class CDecoderAlgorithmTestDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Decoder algorithm test"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + + CString getShortDescription() const override { return CString("Decodes various types of streams and outputs some of the content parameters the log"); } + + CString getDetailedDescription() const override + { + return CString("Note: Warnings are normal as the algorithm polls the decoders for structures they may not contain."); + } + + CString getCategory() const override { return CString("Tests/Algorithms"); } + CString getVersion() const override { return CString("1.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_DecoderAlgorithmTest; } + IPluginObject* create() override { return new CDecoderAlgorithmTest(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Experiment information", OV_TypeId_ExperimentInfo); + prototype.addInput("Feature vector", OV_TypeId_FeatureVector); + prototype.addInput("Signal", OV_TypeId_Signal); + prototype.addInput("Spectrum", OV_TypeId_Spectrum); + prototype.addInput("Stimulation", OV_TypeId_Stimulations); + prototype.addInput("Streamed matrix", OV_TypeId_StreamedMatrix); + prototype.addInput("Channel localisation", OV_TypeId_ChannelLocalisation); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_DecoderAlgorithmTestDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/box-algorithms/ovpCEncoderAlgorithmTest.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/box-algorithms/ovpCEncoderAlgorithmTest.cpp new file mode 100755 index 0000000..c3d104a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/box-algorithms/ovpCEncoderAlgorithmTest.cpp @@ -0,0 +1,126 @@ +#include "ovpCEncoderAlgorithmTest.h" + +#include "../algorithms/encoders/ovpCExperimentInfoEncoder.h" +#include "../algorithms/encoders/ovpCFeatureVectorEncoder.h" +#include "../algorithms/encoders/ovpCSignalEncoder.h" +#include "../algorithms/encoders/ovpCSpectrumEncoder.h" +#include "../algorithms/encoders/ovpCStimulationEncoder.h" +#include "../algorithms/encoders/ovpCChannelLocalisationEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +bool CEncoderAlgorithmTest::initialize() +{ + m_encoders[0] = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_ExperimentInfoEncoder)); + m_encoders[1] = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_FeatureVectorEncoder)); + m_encoders[2] = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_SignalEncoder)); + m_encoders[3] = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_SpectrumEncoder)); + m_encoders[4] = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_StimulationEncoder)); + m_encoders[5] = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_StreamedMatrixEncoder)); + m_encoders[6] = &getAlgorithmManager().getAlgorithm(getAlgorithmManager().createAlgorithm(OVP_ClassId_Algorithm_ChannelLocalisationEncoder)); + + for (size_t i = 0; i < 7; ++i) + { + m_encoders[i]->initialize(); + op_buffer[i].initialize(m_encoders[i]->getOutputParameter(OVP_Algorithm_EBMLEncoder_OutputParameterId_EncodedMemoryBuffer)); + } + + m_matrix1 = new CMatrix(); + m_matrix1->resize(16, 16); + + m_matrix2 = new CMatrix(); + m_matrix2->resize(16); + + m_matrix3 = new CMatrix(); + m_matrix3->resize(4, 3); + m_matrix3->setDimensionLabel(0, 0, "C3"); + m_matrix3->setDimensionLabel(0, 1, "Cz"); + m_matrix3->setDimensionLabel(0, 2, "C4"); + m_matrix3->setDimensionLabel(0, 3, "Pz"); + m_matrix3->setDimensionLabel(1, 0, "x"); + m_matrix3->setDimensionLabel(1, 1, "y"); + m_matrix3->setDimensionLabel(1, 2, "z"); + + m_stimSet = new CStimulationSet(); + + size_t frequency = 16; + + m_encoders[1]->getInputParameter(OVP_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)->setValue(&m_matrix1); + m_encoders[2]->getInputParameter(OVP_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)->setValue(&m_matrix1); + m_encoders[2]->getInputParameter(OVP_Algorithm_SignalEncoder_InputParameterId_Sampling)->setValue(&frequency); + m_encoders[3]->getInputParameter(OVP_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)->setValue(&m_matrix1); + m_encoders[3]->getInputParameter(OVP_Algorithm_SpectrumEncoder_InputParameterId_FrequencyAbscissa)->setValue(&m_matrix2); + m_encoders[4]->getInputParameter(OVP_Algorithm_StimulationEncoder_InputParameterId_StimulationSet)->setValue(&m_stimSet); + m_encoders[5]->getInputParameter(OVP_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)->setValue(&m_matrix2); + m_encoders[6]->getInputParameter(OVP_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)->setValue(&m_matrix3); + + m_hasSentHeader = false; + m_startTime = 0; + m_endTime = 0; + + return true; +} + +bool CEncoderAlgorithmTest::uninitialize() +{ + delete m_stimSet; + delete m_matrix3; + delete m_matrix2; + delete m_matrix1; + + for (size_t i = 0; i < 7; ++i) + { + op_buffer[i].uninitialize(); + m_encoders[i]->uninitialize(); + getAlgorithmManager().releaseAlgorithm(*m_encoders[i]); + m_encoders[i] = nullptr; + } + + return true; +} + +bool CEncoderAlgorithmTest::processClock(Kernel::CMessageClock& /*msg*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CEncoderAlgorithmTest::process() +{ + Kernel::IBoxIO& boxContext = getDynamicBoxContext(); + Kernel::IPlayerContext& playerContext = getPlayerContext(); + const size_t nInput = getStaticBoxContext().getOutputCount(); + + if (!m_hasSentHeader) + { + m_startTime = 0; + m_endTime = 0; + for (size_t i = 0; i < nInput; ++i) + { + op_buffer[i] = boxContext.getOutputChunk(i); + m_encoders[i]->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeHeader); + } + m_hasSentHeader = true; + } + else + { + for (size_t i = 0; i < nInput; ++i) + { + op_buffer[i] = boxContext.getOutputChunk(i); + m_encoders[i]->process(OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeBuffer); + } + } + + for (size_t i = 0; i < nInput; ++i) { boxContext.markOutputAsReadyToSend(i, m_startTime, m_endTime); } + + m_startTime = m_endTime; + m_endTime = playerContext.getCurrentTime(); + + return true; +} + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/box-algorithms/ovpCEncoderAlgorithmTest.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/box-algorithms/ovpCEncoderAlgorithmTest.h new file mode 100644 index 0000000..60d6e8f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/box-algorithms/ovpCEncoderAlgorithmTest.h @@ -0,0 +1,68 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { +class CEncoderAlgorithmTest : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + uint64_t getClockFrequency() override { return 1LL << 32; } + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_EncoderAlgorithmTest) + +protected: + + std::array m_encoders; + std::array, 7> op_buffer; + + bool m_hasSentHeader = false; + uint64_t m_startTime = 0; + uint64_t m_endTime = 0; + + CMatrix* m_matrix1 = nullptr; + CMatrix* m_matrix2 = nullptr; + CMatrix* m_matrix3 = nullptr; + CStimulationSet* m_stimSet = nullptr; +}; + +class CEncoderAlgorithmTestDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Encoder algorithm test"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Setups various streams and outputs them"); } + CString getDetailedDescription() const override { return CString("Note: Data sent in the streams does not change over time"); } + CString getCategory() const override { return CString("Tests/Algorithms"); } + CString getVersion() const override { return CString("1.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_EncoderAlgorithmTest; } + IPluginObject* create() override { return new CEncoderAlgorithmTest(); } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addOutput("Experiment information", OV_TypeId_ExperimentInfo); + prototype.addOutput("Feature vector", OV_TypeId_FeatureVector); + prototype.addOutput("Signal", OV_TypeId_Signal); + prototype.addOutput("Spectrum", OV_TypeId_Spectrum); + prototype.addOutput("Stimulation", OV_TypeId_Stimulations); + prototype.addOutput("Streamed matrix", OV_TypeId_StreamedMatrix); + prototype.addOutput("Channel localisation", OV_TypeId_ChannelLocalisation); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_EncoderAlgorithmTestDesc) +}; +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/ovp_defines.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/ovp_defines.h new file mode 100644 index 0000000..5ed314e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/ovp_defines.h @@ -0,0 +1,143 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_Algorithm_AcquisitionDecoder OpenViBE::CIdentifier(0x1E0812B7, 0x3F686DD4) +#define OVP_ClassId_Algorithm_AcquisitionDecoderDesc OpenViBE::CIdentifier(0xA01599B0, 0x7F51631A) +#define OVP_Algorithm_AcquisitionDecoder_OutputParameterId_BufferDuration OpenViBE::CIdentifier(0x7527D6E5, 0xB7A70339) +#define OVP_Algorithm_AcquisitionDecoder_OutputParameterId_ExperimentInfoStream OpenViBE::CIdentifier(0xA7F1D539, 0xEC708539) +#define OVP_Algorithm_AcquisitionDecoder_OutputParameterId_SignalStream OpenViBE::CIdentifier(0x42C0D7BD, 0xBBCEA3F3) +#define OVP_Algorithm_AcquisitionDecoder_OutputParameterId_StimulationStream OpenViBE::CIdentifier(0x08FC3C12, 0x86A07BF7) +#define OVP_Algorithm_AcquisitionDecoder_OutputParameterId_ChannelLocalisationStream OpenViBE::CIdentifier(0x4EB92F81, 0x6ECDA6B9) +#define OVP_Algorithm_AcquisitionDecoder_OutputParameterId_ChannelUnitsStream OpenViBE::CIdentifier(0x11B93981, 0x6E5DA9B0) + +#define OVP_ClassId_Algorithm_AcquisitionEncoder OpenViBE::CIdentifier(0xF9FD2FB5, 0xDF0B3B2C) +#define OVP_ClassId_Algorithm_AcquisitionEncoderDesc OpenViBE::CIdentifier(0xE3E0D9EB, 0x4D4EBA00) +#define OVP_Algorithm_AcquisitionEncoder_InputParameterId_BufferDuration OpenViBE::CIdentifier(0xAFA07097, 0x1145B59B) +#define OVP_Algorithm_AcquisitionEncoder_InputParameterId_ExperimentInfoStream OpenViBE::CIdentifier(0x38755128, 0xCB0C908A) +#define OVP_Algorithm_AcquisitionEncoder_InputParameterId_SignalStream OpenViBE::CIdentifier(0x4ED9D929, 0x6DF5B2B6) +#define OVP_Algorithm_AcquisitionEncoder_InputParameterId_StimulationStream OpenViBE::CIdentifier(0xCDE202AD, 0xF4864EC9) +#define OVP_Algorithm_AcquisitionEncoder_InputParameterId_ChannelLocalisationStream OpenViBE::CIdentifier(0x2CF786E5, 0x520714A1) +#define OVP_Algorithm_AcquisitionEncoder_InputParameterId_ChannelUnitsStream OpenViBE::CIdentifier(0x25DD84B4, 0x528524CA) + +#define OVP_ClassId_Algorithm_ChannelLocalisationDecoder OpenViBE::CIdentifier(0x8222F065, 0xB05D35CF) +#define OVP_ClassId_Algorithm_ChannelLocalisationDecoderDesc OpenViBE::CIdentifier(0x713A29FD, 0xA5A95E2C) +#define OVP_Algorithm_ChannelLocalisationDecoder_OutputParameterId_Dynamic OpenViBE::CIdentifier(0xD20991FD, 0xA3153651) + +#define OVP_ClassId_Algorithm_ChannelUnitsDecoder OpenViBE::CIdentifier(0x5F973DDF, 0x4A582DAF) +#define OVP_ClassId_Algorithm_ChannelUnitsDecoderDesc OpenViBE::CIdentifier(0x2D59257D, 0x3B1915DA) +#define OVP_Algorithm_ChannelUnitsDecoder_OutputParameterId_Dynamic OpenViBE::CIdentifier(0x31CF1C7A, 0x17475323) + +#define OVP_ClassId_Algorithm_ChannelUnitsEncoder OpenViBE::CIdentifier(0x2CA034FD, 0x5C051E86) +#define OVP_ClassId_Algorithm_ChannelUnitsEncoderDesc OpenViBE::CIdentifier(0x08696DFC, 0x6D415262) +#define OVP_Algorithm_ChannelUnitsEncoder_InputParameterId_Dynamic OpenViBE::CIdentifier(0x615F03B9, 0x4F6A320A) + +#define OVP_ClassId_BoxAlgorithm_DecoderAlgorithmTest OpenViBE::CIdentifier(0x3C2EF355, 0xFE495C3D) +#define OVP_ClassId_BoxAlgorithm_DecoderAlgorithmTestDesc OpenViBE::CIdentifier(0xE5176EB9, 0xD6E47D7F) + +#define OVP_ClassId_Algorithm_EBMLBaseDecoder OpenViBE::CIdentifier(0xFD30C96D, 0x8245A8F8) +#define OVP_ClassId_Algorithm_EBMLBaseDecoderDesc OpenViBE::CIdentifier(0x4F701AC9, 0xDFBE912E) +#define OVP_Algorithm_EBMLDecoder_InputParameterId_MemoryBufferToDecode OpenViBE::CIdentifier(0x2F98EA3C, 0xFB0BE096) +#define OVP_Algorithm_EBMLDecoder_OutputTriggerId_ReceivedHeader OpenViBE::CIdentifier(0x815234BF, 0xAABAE5F2) +#define OVP_Algorithm_EBMLDecoder_OutputTriggerId_ReceivedBuffer OpenViBE::CIdentifier(0xAA2738BF, 0xF7FE9FC3) +#define OVP_Algorithm_EBMLDecoder_OutputTriggerId_ReceivedEnd OpenViBE::CIdentifier(0xC4AA114C, 0x628C2D77) + +#define OVP_ClassId_Algorithm_EBMLBaseEncoder OpenViBE::CIdentifier(0x4272C178, 0x3FE84927) +#define OVP_ClassId_Algorithm_EBMLBaseEncoderDesc OpenViBE::CIdentifier(0x47A9E701, 0x7C57BF3C) +#define OVP_Algorithm_EBMLEncoder_OutputParameterId_EncodedMemoryBuffer OpenViBE::CIdentifier(0xA3D8B171, 0xF8734734) +#define OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeHeader OpenViBE::CIdentifier(0x878EAF60, 0xF9D5303F) +#define OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeBuffer OpenViBE::CIdentifier(0x1B7076FD, 0x449BC70A) +#define OVP_Algorithm_EBMLEncoder_InputTriggerId_EncodeEnd OpenViBE::CIdentifier(0x3FC23508, 0x806753D8) +#define OVP_Algorithm_EBMLEncoder_OutputTriggerId_MemoryBufferUpdated OpenViBE::CIdentifier(0xD46C7462, 0xD3407E5F) + +#define OVP_ClassId_Algorithm_ExperimentInfoDecoder OpenViBE::CIdentifier(0x6FA7D52B, 0x80E2ABD6) +#define OVP_ClassId_Algorithm_ExperimentInfoDecoderDesc OpenViBE::CIdentifier(0x0F37CA61, 0x8A77F44E) +#define OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_ExperimentID OpenViBE::CIdentifier(0x40259641, 0x478C73DE) +#define OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_ExperimentDate OpenViBE::CIdentifier(0xBC0266A2, 0x9C2935F1) +#define OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectID OpenViBE::CIdentifier(0x97C5D20D, 0x203E65B3) +#define OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectName OpenViBE::CIdentifier(0x3D3826EA, 0xE8883815) +#define OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectAge OpenViBE::CIdentifier(0xC36C6B08, 0x5227380A) +#define OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectGender OpenViBE::CIdentifier(0x7D5059E8, 0xE4D8B38D) +#define OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_LaboratoryID OpenViBE::CIdentifier(0xE761D3D4, 0x44BA1EBF) +#define OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_LaboratoryName OpenViBE::CIdentifier(0x5CA80FA5, 0x774F01CB) +#define OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_TechnicianID OpenViBE::CIdentifier(0xC8ECFBBC, 0x0DCDA310) +#define OVP_Algorithm_ExperimentInfoDecoder_OutputParameterId_TechnicianName OpenViBE::CIdentifier(0xB8A94B68, 0x389393D9) + +#define OVP_ClassId_BoxAlgorithm_EncoderAlgorithmTest OpenViBE::CIdentifier(0x87D18C62, 0xF2DAF779) +#define OVP_ClassId_BoxAlgorithm_EncoderAlgorithmTestDesc OpenViBE::CIdentifier(0x95E27325, 0x6893A519) + +#define OVP_ClassId_Algorithm_ExperimentInfoEncoder OpenViBE::CIdentifier(0x56B354FE, 0xBF175468) +#define OVP_ClassId_Algorithm_ExperimentInfoEncoderDesc OpenViBE::CIdentifier(0x8CC2C754, 0x61665FDA) +#define OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_ExperimentID OpenViBE::CIdentifier(0x40259641, 0x478C73DE) +#define OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_ExperimentDate OpenViBE::CIdentifier(0xBC0266A2, 0x9C2935F1) +#define OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectID OpenViBE::CIdentifier(0x97C5D20D, 0x203E65B3) +#define OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectName OpenViBE::CIdentifier(0x3D3826EA, 0xE8883815) +#define OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectAge OpenViBE::CIdentifier(0xC36C6B08, 0x5227380A) +#define OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectGender OpenViBE::CIdentifier(0x7D5059E8, 0xE4D8B38D) +#define OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_LaboratoryID OpenViBE::CIdentifier(0xE761D3D4, 0x44BA1EBF) +#define OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_LaboratoryName OpenViBE::CIdentifier(0x5CA80FA5, 0x774F01CB) +#define OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_TechnicianID OpenViBE::CIdentifier(0xC8ECFBBC, 0x0DCDA310) +#define OVP_Algorithm_ExperimentInfoEncoder_InputParameterId_TechnicianName OpenViBE::CIdentifier(0xB8A94B68, 0x389393D9) + +#define OVP_ClassId_Algorithm_FeatureVectorDecoder OpenViBE::CIdentifier(0xC2689ECC, 0x43B335C1) +#define OVP_ClassId_Algorithm_FeatureVectorDecoderDesc OpenViBE::CIdentifier(0xAB0AE561, 0xF181E34F) + +#define OVP_ClassId_Algorithm_FeatureVectorEncoder OpenViBE::CIdentifier(0x7EBE049D, 0xF777A602) +#define OVP_ClassId_Algorithm_FeatureVectorEncoderDesc OpenViBE::CIdentifier(0xC249527B, 0x89EE1996) + +#define OVP_ClassId_Algorithm_MasterAcquisitionEncoder OpenViBE::CIdentifier(0x2D15E00B, 0x51414EB6) +#define OVP_ClassId_Algorithm_MasterAcquisitionEncoderDesc OpenViBE::CIdentifier(0xE6EC841D, 0x9E75A8FB) +#define OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectID OpenViBE::CIdentifier(0xD5BB5231, 0x59389B72) +#define OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectAge OpenViBE::CIdentifier(0x9EF355E4, 0xC8531112) +#define OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectGender OpenViBE::CIdentifier(0xA9056AE3, 0x57FE6AF0) +#define OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SignalMatrix OpenViBE::CIdentifier(0xE9AC8077, 0xE369A51D) +#define OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_SignalSampling OpenViBE::CIdentifier(0xB84AD0CA, 0x4F316DD3) +#define OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_StimulationSet OpenViBE::CIdentifier(0x5B728D37, 0xFD088887) +#define OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_BufferDuration OpenViBE::CIdentifier(0xE1FC7385, 0x586A4F3F) +#define OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_ChannelLocalisation OpenViBE::CIdentifier(0x227E13F0, 0x206B44F9) +#define OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_ChannelUnits OpenViBE::CIdentifier(0x740060C2, 0x7D2B4F57) + +#define OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_EncodeChannelLocalisationData OpenViBE::CIdentifier(0x26EE1F81, 0x3DB00D5D) +#define OVP_Algorithm_MasterAcquisitionEncoder_InputParameterId_EncodeChannelUnitData OpenViBE::CIdentifier(0x19DC533C, 0x56301D0B) + +#define OVP_ClassId_Algorithm_SignalDecoder OpenViBE::CIdentifier(0x7237C149, 0x0CA66DA7) +#define OVP_ClassId_Algorithm_SignalDecoderDesc OpenViBE::CIdentifier(0xF1547D89, 0x49FFD0C2) +#define OVP_Algorithm_SignalDecoder_OutputParameterId_Sampling OpenViBE::CIdentifier(0x363D8D79, 0xEEFB912C) + +#define OVP_ClassId_Algorithm_SignalEncoder OpenViBE::CIdentifier(0xC488AD3C, 0xEB2E36BF) +#define OVP_ClassId_Algorithm_SignalEncoderDesc OpenViBE::CIdentifier(0x90AC1E0F, 0x01518200) +#define OVP_Algorithm_SignalEncoder_InputParameterId_Sampling OpenViBE::CIdentifier(0x998710FF, 0x2C5CCA82) + +#define OVP_ClassId_Algorithm_SpectrumDecoder OpenViBE::CIdentifier(0x128202DB, 0x449FC7A6) +#define OVP_ClassId_Algorithm_SpectrumDecoderDesc OpenViBE::CIdentifier(0x54D18EE8, 0x5DBD913A) +#define OVP_Algorithm_SpectrumDecoder_OutputParameterId_FrequencyAbscissa OpenViBE::CIdentifier(0x14A572E4, 0x5C405C8E) +#define OVP_Algorithm_SpectrumDecoder_OutputParameterId_Sampling OpenViBE::CIdentifier(0x68442C12, 0x0D9A46DE) + + +#define OVP_ClassId_Algorithm_SpectrumEncoder OpenViBE::CIdentifier(0xB3E252DB, 0xC3214498) +#define OVP_ClassId_Algorithm_SpectrumEncoderDesc OpenViBE::CIdentifier(0xD6182973, 0x122CE114) +#define OVP_Algorithm_SpectrumEncoder_InputParameterId_FrequencyAbscissa OpenViBE::CIdentifier(0x05C91BD6, 0x2D8C4083) +#define OVP_Algorithm_SpectrumEncoder_InputParameterId_Sampling OpenViBE::CIdentifier(0x02D25E1B, 0x76A1019B) + +#define OVP_ClassId_Algorithm_StimulationDecoder OpenViBE::CIdentifier(0xC8807F2B, 0x0813C5B1) +#define OVP_ClassId_Algorithm_StimulationDecoderDesc OpenViBE::CIdentifier(0x391A615B, 0x71CD888A) +#define OVP_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet OpenViBE::CIdentifier(0xF46D0C19, 0x47306BEA) + +#define OVP_ClassId_Algorithm_StimulationEncoder OpenViBE::CIdentifier(0x6E86F7D5, 0xA4668108) +#define OVP_ClassId_Algorithm_StimulationEncoderDesc OpenViBE::CIdentifier(0x9B994B50, 0x52C3F06A) +#define OVP_Algorithm_StimulationEncoder_InputParameterId_StimulationSet OpenViBE::CIdentifier(0x8565254C, 0x3A49268E) + +#define OVP_ClassId_Algorithm_StreamedMatrixDecoder OpenViBE::CIdentifier(0x7359D0DB, 0x91784B21) +#define OVP_ClassId_Algorithm_StreamedMatrixDecoderDesc OpenViBE::CIdentifier(0x384529D5, 0xD8E0A728) +#define OVP_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix OpenViBE::CIdentifier(0x79EF3123, 0x35E3EA4D) + +#define OVP_ClassId_Algorithm_StreamedMatrixEncoder OpenViBE::CIdentifier(0x5CB32C71, 0x576F00A6) +#define OVP_ClassId_Algorithm_StreamedMatrixEncoderDesc OpenViBE::CIdentifier(0xEEEFE060, 0x646EE8AB) +#define OVP_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix OpenViBE::CIdentifier(0xA3E9E5B0, 0xAE756303) + +#define OVP_ClassId_Algorithm_StreamStructureDecoder OpenViBE::CIdentifier(0xA7EF3E8B, 0x4CF70B74) +#define OVP_ClassId_Algorithm_StreamStructureDecoderDesc OpenViBE::CIdentifier(0x2E361099, 0xCBE828A7) + +#define OVP_ClassId_Algorithm_ChannelLocalisationEncoder OpenViBE::CIdentifier(0xC4AA738A, 0x2368C0EA) +#define OVP_ClassId_Algorithm_ChannelLocalisationEncoderDesc OpenViBE::CIdentifier(0x3F7B49A3, 0x2B8F861A) +#define OVP_Algorithm_ChannelLocalisationEncoder_InputParameterId_Dynamic OpenViBE::CIdentifier(0xCF5DD4F8, 0xC2FF2878) diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/ovp_main.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/ovp_main.cpp new file mode 100644 index 0000000..634b2dc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/stream-codecs/src/ovp_main.cpp @@ -0,0 +1,56 @@ +#include "algorithms/decoders/ovpCAcquisitionDecoder.h" +#include "algorithms/decoders/ovpCStreamStructureDecoder.h" +#include "algorithms/decoders/ovpCExperimentInfoDecoder.h" +#include "algorithms/decoders/ovpCChannelLocalisationDecoder.h" +#include "algorithms/decoders/ovpCChannelUnitsDecoder.h" +#include "algorithms/decoders/ovpCFeatureVectorDecoder.h" +#include "algorithms/decoders/ovpCSignalDecoder.h" +#include "algorithms/decoders/ovpCSpectrumDecoder.h" +#include "algorithms/decoders/ovpCStimulationDecoder.h" +#include "algorithms/decoders/ovpCStreamedMatrixDecoder.h" +// #include "algorithms/decoders/ovpCMasterAcquisitionDecoder.h" + +#include "algorithms/encoders/ovpCAcquisitionEncoder.h" +#include "algorithms/encoders/ovpCExperimentInfoEncoder.h" +#include "algorithms/encoders/ovpCChannelLocalisationEncoder.h" +#include "algorithms/encoders/ovpCChannelUnitsEncoder.h" +#include "algorithms/encoders/ovpCFeatureVectorEncoder.h" +#include "algorithms/encoders/ovpCSignalEncoder.h" +#include "algorithms/encoders/ovpCSpectrumEncoder.h" +#include "algorithms/encoders/ovpCStimulationEncoder.h" +#include "algorithms/encoders/ovpCStreamedMatrixEncoder.h" +#include "algorithms/encoders/ovpCMasterAcquisitionEncoder.h" + +namespace OpenViBE { +namespace Plugins { +namespace StreamCodecs { + +OVP_Declare_Begin() + OVP_Declare_New(CAcquisitionDecoderDesc) + OVP_Declare_New(CStreamStructureDecoderDesc); + OVP_Declare_New(CExperimentInfoDecoderDesc) + OVP_Declare_New(CChannelLocalisationDecoderDesc) + OVP_Declare_New(CChannelUnitsDecoderDesc) + OVP_Declare_New(CFeatureVectorDecoderDesc) + OVP_Declare_New(CSignalDecoderDesc) + OVP_Declare_New(CSpectrumDecoderDesc) + OVP_Declare_New(CStimulationDecoderDesc) + OVP_Declare_New(CStreamedMatrixDecoderDesc) + // OVP_Declare_New(CMasterAcquisitionDecoderDesc); + + OVP_Declare_New(CAcquisitionEncoderDesc) + OVP_Declare_New(CExperimentInfoEncoderDesc) + OVP_Declare_New(CChannelLocalisationEncoderDesc) + OVP_Declare_New(CChannelUnitsEncoderDesc) + OVP_Declare_New(CFeatureVectorEncoderDesc) + OVP_Declare_New(CSignalEncoderDesc) + OVP_Declare_New(CSpectrumEncoderDesc) + OVP_Declare_New(CStimulationEncoderDesc) + OVP_Declare_New(CStreamedMatrixEncoderDesc) + OVP_Declare_New(CMasterAcquisitionEncoderDesc); + +OVP_Declare_End() + +} // namespace StreamCodecs +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/CMakeLists.txt new file mode 100644 index 0000000..e7cafbe --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/CMakeLists.txt @@ -0,0 +1,36 @@ +PROJECT(openvibe-plugins-sdk-streaming) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl) +INCLUDE("FindSourceRCProperties") +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/box-tutorials/signal-merger.mxs b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/box-tutorials/signal-merger.mxs new file mode 100644 index 0000000..0f8acd6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/box-tutorials/signal-merger.mxs @@ -0,0 +1,315 @@ + + 1 + OpenVIBE + 0.0.0 + + + + + + (0x00000d77, 0x0000139e) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000476b, 0x0000666f) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 336 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00004baf, 0x0000758e) + Continuous Oscilloscope + (0x0842bcd1, 0xd53c1c89) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x207c9054, 0x3c841b63) + 240 + + + (0x4e7b798a, 0x183beafb) + (0x35390ab5, 0x7b926078) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00007293, 0x00000949) + Sinus oscillator + (0x7e33bdb8, 0x68194a4a) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Channel count + 4 + 2 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 112 + + + (0x207c9054, 0x3c841b63) + 160 + + + (0x4e7b798a, 0x183beafb) + (0x0b214ed8, 0x1f9ad83a) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + + + + + (0x00002404, 0x00007988) + + (0x00007293, 0x00000949) + 0 + + + (0x00000d77, 0x0000139e) + 0 + + + + (0x00005602, 0x000039b9) + + (0x0000476b, 0x0000666f) + 0 + + + (0x00000d77, 0x0000139e) + 1 + + + + (0x00007f7d, 0x0000105b) + + (0x00000d77, 0x0000139e) + 0 + + + (0x00004baf, 0x0000758e) + 0 + + + + + + + (0x0000775c, 0x000078ff) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x00004baf, 0x0000758e)","childCount":0,"identifier":"(0x000040b5, 0x00003ea5)","index":0,"parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x00007db6, 0x00005d30)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000010e4, 0x00001956)","index":0,"name":"Default tab","parentIdentifier":"(0x00007db6, 0x00005d30)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x00004cdd, 0x00003e61)","index":0,"name":"Empty","parentIdentifier":"(0x000010e4, 0x00001956)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/Doc_BoxAlgorithm_SignalMerger.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/Doc_BoxAlgorithm_SignalMerger.dox-part new file mode 100644 index 0000000..30782dc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/Doc_BoxAlgorithm_SignalMerger.dox-part @@ -0,0 +1,66 @@ +/** + * \page BoxAlgorithm_SignalMerger Signal Merger +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalMerger_Description| + * This box merges several input streams in a single output stream. For instance, + * if this box has two inputs with 8 channels each, the output will contain 16 channels. + * + * It important to note that the input streams must have the same structure. That is + * same sampling rate, same number of samples per buffer, and similar chunks dates. + * + * The output channel order is as follows : + * - n channels from input 1 (in the same order as in input 1) + * - m channels from input 2 + * - ... + * - p channels from input N + * + * Such box has initially been proposed by Matthieu Goyat and Guillaume Lio but it + * has been completely reimplemented in march 2011 because of unpredictable behaviors in + * some conditions. + * |OVP_DocEnd_BoxAlgorithm_SignalMerger_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalMerger_Inputs| + * This box can receive as many inputs as necessary. + * |OVP_DocEnd_BoxAlgorithm_SignalMerger_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_SignalMerger_Input1| + * The first input stream. + * |OVP_DocEnd_BoxAlgorithm_SignalMerger_Input1| + + * |OVP_DocBegin_BoxAlgorithm_SignalMerger_Input2| + * The second input stream. + * |OVP_DocEnd_BoxAlgorithm_SignalMerger_Input2| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalMerger_Outputs| + * |OVP_DocEnd_BoxAlgorithm_SignalMerger_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_SignalMerger_Output1| + * The output stream contains all the channels grabbed from the different input streams. + * |OVP_DocEnd_BoxAlgorithm_SignalMerger_Output1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalMerger_Examples| + * |OVP_DocEnd_BoxAlgorithm_SignalMerger_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_SignalMerger_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_SignalMerger_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/Doc_BoxAlgorithm_StreamedMatrixMultiplexer.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/Doc_BoxAlgorithm_StreamedMatrixMultiplexer.dox-part new file mode 100644 index 0000000..b7ab95e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/Doc_BoxAlgorithm_StreamedMatrixMultiplexer.dox-part @@ -0,0 +1,64 @@ +/** + * \page BoxAlgorithm_StreamedMatrixMultiplexer Streamed matrix multiplexer +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StreamedMatrixMultiplexer_Description| + * This box multiplexes streamed matrix stream on a low level basis (at the EBML stream level actually). + * This means the box sorts the different buffers received from its inputs and sends all of them + * on its output. For correct results, this supposes the inputs have "homogeneous content" in the sense that + * they should have e.g. the same number of channels, in the same order, the same number of samples per buffer etc... + * + * This box is usually used after an epoching related split in the pipeline, when you want to process the signals + * in a similar manner for a similar purpose. This actually joins the pipelines in only one, dropping the need + * to edit and execute similar boxes. + * + * \b Warning: this box is usually misused and used in place of a \ref Doc_BoxAlgorithm_SignalMerger box. + * Please consider reading this documentation twice, and maybe read the \ref Doc_BoxAlgorithm_SignalMerger + * documentation once again as well :) + * |OVP_DocEnd_BoxAlgorithm_StreamedMatrixMultiplexer_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StreamedMatrixMultiplexer_Inputs| + * You can add as many input as you want. + * |OVP_DocEnd_BoxAlgorithm_StreamedMatrixMultiplexer_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_StreamedMatrixMultiplexer_Input1| + * The first input stream. + * |OVP_DocEnd_BoxAlgorithm_StreamedMatrixMultiplexer_Input1| + + * |OVP_DocBegin_BoxAlgorithm_StreamedMatrixMultiplexer_Input2| + * The second input stream. + * |OVP_DocEnd_BoxAlgorithm_StreamedMatrixMultiplexer_Input2| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StreamedMatrixMultiplexer_Outputs| + * |OVP_DocEnd_BoxAlgorithm_StreamedMatrixMultiplexer_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_StreamedMatrixMultiplexer_Output1| + * The output stream takes the header of the first stream and then sends buffers of the + * different input streams in a sorted way. + * |OVP_DocEnd_BoxAlgorithm_StreamedMatrixMultiplexer_Output1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StreamedMatrixMultiplexer_Examples| + * |OVP_DocEnd_BoxAlgorithm_StreamedMatrixMultiplexer_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StreamedMatrixMultiplexer_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_StreamedMatrixMultiplexer_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/boxes/Doc_BoxAlgorithm_SignalMerger.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/boxes/Doc_BoxAlgorithm_SignalMerger.rst new file mode 100644 index 0000000..37b29cb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/boxes/Doc_BoxAlgorithm_SignalMerger.rst @@ -0,0 +1,66 @@ +.. _Doc_BoxAlgorithm_SignalMerger: + +Signal Merger +============= + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA + +.. image:: images/Doc_BoxAlgorithm_SignalMerger.png + +This box merges several input streams in a single output stream. For instance, +if this box has two inputs with 8 channels each, the output will contain 16 channels. + +It important to note that the input streams must have the same structure. That is +same sampling rate, same number of samples per buffer, and similar chunks dates. + +The output channel order is as follows : + +- n channels from input 1 (in the same order as in input 1) +- m channels from input 2 +- ... +- p channels from input N + + +Such box has initially been proposed by Matthieu Goyat and Guillaume Lio but it +has been completely reimplemented in march 2011 because of unpredictable behaviors in +some conditions. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input 1", "Signal" + "Input 2", "Signal" + +This box can receive as many inputs as necessary. + +Input 1 +~~~~~~~ + +The first input stream. + +Input 2 +~~~~~~~ + +The second input stream. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Merged", "Signal" + +Merged +~~~~~~ + +The output stream contains all the channels grabbed from the different input streams. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/boxes/Doc_BoxAlgorithm_StreamedMatrixMultiplexer.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/boxes/Doc_BoxAlgorithm_StreamedMatrixMultiplexer.rst new file mode 100644 index 0000000..408895f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/boxes/Doc_BoxAlgorithm_StreamedMatrixMultiplexer.rst @@ -0,0 +1,62 @@ +.. _Doc_BoxAlgorithm_StreamedMatrixMultiplexer: + +Streamed matrix multiplexer +=========================== + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA/IRISA + +.. image:: images/Doc_BoxAlgorithm_StreamedMatrixMultiplexer.png + +This box multiplexes streamed matrix stream on a low level basis (at the EBML stream level actually). +This means the box sorts the different buffers received from its inputs and sends all of them +on its output. For correct results, this supposes the inputs have "homogeneous content" in the sense that +they should have e.g. the same number of channels, in the same order, the same number of samples per buffer etc... + +This box is usually used after an epoching related split in the pipeline, when you want to process the signals +in a similar manner for a similar purpose. This actually joins the pipelines in only one, dropping the need +to edit and execute similar boxes. + +**Warning:** this box is usually misused and used in place of a :ref:`Doc_BoxAlgorithm_SignalMerger` box. +Please consider reading this documentation twice, and maybe read the :ref:`Doc_BoxAlgorithm_SignalMerger` +documentation once again as well :) + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Input stream 1", "Streamed matrix" + "Input stream 2", "Streamed matrix" + +You can add as many input as you want. + +Input stream 1 +~~~~~~~~~~~~~~ + +The first input stream. + +Input stream 2 +~~~~~~~~~~~~~~ + +The second input stream. + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Multiplexed streamed matrix", "Streamed matrix" + +Multiplexed streamed matrix +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The output stream takes the header of the first stream and then sends buffers of the +different input streams in a sorted way. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/boxes/images/Doc_BoxAlgorithm_SignalMerger.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/boxes/images/Doc_BoxAlgorithm_SignalMerger.png new file mode 100644 index 0000000..6aa4446 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/boxes/images/Doc_BoxAlgorithm_SignalMerger.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/boxes/images/Doc_BoxAlgorithm_StreamedMatrixMultiplexer.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/boxes/images/Doc_BoxAlgorithm_StreamedMatrixMultiplexer.png new file mode 100644 index 0000000..fa0d960 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/doc/boxes/images/Doc_BoxAlgorithm_StreamedMatrixMultiplexer.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmSignalMerger.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmSignalMerger.cpp new file mode 100644 index 0000000..666b1e4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmSignalMerger.cpp @@ -0,0 +1,178 @@ +#include "ovpCBoxAlgorithmSignalMerger.h" + +namespace OpenViBE { +namespace Plugins { +namespace Streaming { + +bool CBoxAlgorithmSignalMerger::initialize() +{ + const size_t nInput = this->getStaticBoxContext().getInputCount(); + for (size_t i = 0; i < nInput; ++i) { m_decoders.push_back(new Toolkit::TSignalDecoder(*this, i)); } + m_encoder = new Toolkit::TSignalEncoder(*this, 0); + return true; +} + +bool CBoxAlgorithmSignalMerger::uninitialize() +{ + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + m_encoder->uninitialize(); + delete m_encoder; + + for (size_t i = 0; i < nInput; ++i) + { + m_decoders[i]->uninitialize(); + delete m_decoders[i]; + } + m_decoders.clear(); + + return true; +} + +bool CBoxAlgorithmSignalMerger::processInput(const size_t index) +{ + IDynamicBoxContext& boxContext = this->getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + if (boxContext.getInputChunkCount(0) == 0) { return true; } + + const uint64_t tStart = boxContext.getInputChunkStartTime(0, 0); + const uint64_t tEnd = boxContext.getInputChunkEndTime(0, 0); + for (size_t i = 1; i < nInput; ++i) + { + if (boxContext.getInputChunkCount(i) == 0) { return true; } + + OV_ERROR_UNLESS_KRF(tStart == boxContext.getInputChunkStartTime(i, 0), + "Invalid start time [" << boxContext.getInputChunkStartTime(i, 0) << "] on input [" << i + << "] (expected value must match start time on input 0 [" << tStart << "])", + Kernel::ErrorType::BadInput); + + OV_ERROR_UNLESS_KRF(tEnd == boxContext.getInputChunkEndTime(i, 0), + "Invalid end time [" << boxContext.getInputChunkEndTime(i, 0) << "] on input [" << i + << "] (expected value must match end time on input 0 [" << tEnd << "])", + Kernel::ErrorType::BadInput); + } + + if (index == nInput - 1) + { + for (size_t i = 1; i < nInput; ++i) + { + OV_ERROR_UNLESS_KRF(boxContext.getInputChunkCount(0) >= boxContext.getInputChunkCount(i), + "Invalid input chunk count [" << boxContext.getInputChunkCount(i) << "] on input [" << i + << "] (expected value must be <= to chunk count on input 0 [" << boxContext.getInputChunkCount(0) << "])", + Kernel::ErrorType::BadInput); + } + } + + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmSignalMerger::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + size_t nChunk = boxContext.getInputChunkCount(0); + + for (size_t input = 1; input < nInput; ++input) { if (boxContext.getInputChunkCount(input) < nChunk) { nChunk = boxContext.getInputChunkCount(input); } } + + for (size_t c = 0; c < nChunk; ++c) + { + size_t nSamplePerBlock = 0; + size_t nChannel = 0; + size_t nHeader = 0; + size_t nBuffer = 0; + size_t nEnd = 0; + + for (size_t i = 0; i < nInput; ++i) + { + m_decoders[i]->decode(c); + + const CMatrix* op_matrix = m_decoders[i]->getOutputMatrix(); + if (m_decoders[i]->isHeaderReceived()) + { + nHeader++; + if (i == 0) + { + nSamplePerBlock = op_matrix->getDimensionSize(1); + nChannel = op_matrix->getDimensionSize(0); + } + else + { + // Check that properties agree + OV_ERROR_UNLESS_KRF(nSamplePerBlock == op_matrix->getDimensionSize(1), + "Output matrix dimension [" << op_matrix->getDimensionSize(1) << "] on input [" << i + << "] must match sample count per block [" << nSamplePerBlock << "]", + Kernel::ErrorType::BadInput); + + OV_ERROR_UNLESS_KRF(m_decoders[0]->getOutputSamplingRate() == m_decoders[i]->getOutputSamplingRate(), + "Output sampling rate [" << m_decoders[i]->getOutputSamplingRate() << "] on input [" << i + << "] must match the sampling rate on input 0 [" << m_decoders[0]->getOutputSamplingRate() << "]", + Kernel::ErrorType::BadInput); + + nChannel += op_matrix->getDimensionSize(0); + } + } + if (m_decoders[i]->isBufferReceived()) { nBuffer++; } + if (m_decoders[i]->isEndReceived()) { nEnd++; } + } + + OV_ERROR_UNLESS_KRF(!nHeader || nHeader == nInput, "Received [" << nHeader << "] headers for [" << nInput << "] declared inputs", Kernel::ErrorType::BadInput); + OV_ERROR_UNLESS_KRF(!nBuffer || nBuffer == nInput, "Received [" << nBuffer << "] buffers for [" << nInput << "] declared inputs", Kernel::ErrorType::BadInput); + OV_ERROR_UNLESS_KRF(!nEnd || nEnd == nInput, "Received [" << nEnd << "] ends for [" << nInput << "] declared inputs", Kernel::ErrorType::BadInput); + + if (nHeader) + { + // We have received headers from all inputs + CMatrix* ip_matrix = m_encoder->getInputMatrix(); + + ip_matrix->resize(nChannel, nSamplePerBlock); + for (size_t i = 0, k = 0; i < nInput; ++i) + { + const CMatrix* op_matrix = m_decoders[i]->getOutputMatrix(); + for (size_t j = 0; j < op_matrix->getDimensionSize(0); j++, k++) { ip_matrix->setDimensionLabel(0, k, op_matrix->getDimensionLabel(0, j)); } + } + const uint64_t sampling = m_decoders[0]->getOutputSamplingRate(); + m_encoder->getInputSamplingRate() = sampling; + + this->getLogManager() << Kernel::LogLevel_Debug << "Setting sampling rate to " << sampling << "\n"; + + m_encoder->encodeHeader(); + + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, c), boxContext.getInputChunkEndTime(0, c)); + } + + if (nBuffer) + { + // We have received one buffer from each input + CMatrix* ip_matrix = m_encoder->getInputMatrix(); + + nSamplePerBlock = ip_matrix->getDimensionSize(1); + + for (size_t i = 0, k = 0; i < nInput; ++i) + { + CMatrix* op_matrix = m_decoders[i]->getOutputMatrix(); + for (size_t j = 0; j < op_matrix->getDimensionSize(0); j++, k++) + { + memcpy(ip_matrix->getBuffer() + k * nSamplePerBlock, op_matrix->getBuffer() + j * nSamplePerBlock, nSamplePerBlock * sizeof(double)); + } + } + m_encoder->encodeBuffer(); + + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, c), boxContext.getInputChunkEndTime(0, c)); + } + + if (nEnd) + { + // We have received one end from each input + m_encoder->encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, c), boxContext.getInputChunkEndTime(0, c)); + } + } + + return true; +} +} // namespace Streaming +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmSignalMerger.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmSignalMerger.h new file mode 100644 index 0000000..24a97f3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmSignalMerger.h @@ -0,0 +1,74 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Streaming { +class CBoxAlgorithmSignalMerger final : public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_SignalMerger) + +protected: + + std::vector*> m_decoders; + Toolkit::TSignalEncoder* m_encoder = nullptr; +}; + +class CBoxAlgorithmSignalMergerListener final : public Toolkit::TBoxListener +{ +public: + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + box.setInputName(index, ("Input " + std::to_string(index + 1)).c_str()); + box.setInputType(index, OV_TypeId_Signal); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmSignalMergerDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Signal Merger"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA"); } + CString getShortDescription() const override { return CString("Merges several input streams into a single output stream"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Streaming"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_SignalMerger; } + IPluginObject* create() override { return new CBoxAlgorithmSignalMerger; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmSignalMergerListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input 1", OV_TypeId_Signal); + prototype.addInput("Input 2", OV_TypeId_Signal); + prototype.addOutput("Merged", OV_TypeId_Signal); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_SignalMergerDesc) +}; +} // namespace Streaming +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmStreamedMatrixMultiplexer.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmStreamedMatrixMultiplexer.cpp new file mode 100644 index 0000000..74d6223 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmStreamedMatrixMultiplexer.cpp @@ -0,0 +1,64 @@ +#include "ovpCBoxAlgorithmStreamedMatrixMultiplexer.h" + +namespace OpenViBE { +namespace Plugins { +namespace Streaming { + +bool CBoxAlgorithmStreamedMatrixMultiplexer::initialize() +{ + m_lastStartTime = 0; + m_lastEndTime = 0; + m_headerSent = false; + + return true; +} + +bool CBoxAlgorithmStreamedMatrixMultiplexer::uninitialize() { return true; } + +bool CBoxAlgorithmStreamedMatrixMultiplexer::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmStreamedMatrixMultiplexer::process() +{ + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + for (size_t i = 0; i < nInput; ++i) + { + for (size_t j = 0; j < boxContext.getInputChunkCount(i); ++j) + { + const IMemoryBuffer* iBuffer = boxContext.getInputChunk(i, j); + const uint64_t tStart = boxContext.getInputChunkStartTime(i, j); + const uint64_t tEnd = boxContext.getInputChunkEndTime(i, j); + + if ((!m_headerSent && tStart == tEnd) || (m_headerSent && tStart != tEnd)) + { + IMemoryBuffer* oBuffer = boxContext.getOutputChunk(0); + oBuffer->setSize(iBuffer->getSize(), true); + + memcpy(oBuffer->getDirectPointer(), iBuffer->getDirectPointer(), iBuffer->getSize()); + + OV_ERROR_UNLESS_KRF(tStart >= m_lastStartTime && tEnd >= m_lastEndTime, + "Invalid chunk times with start = [" << tStart << "] and end = [" << tEnd << "] while last chunk has start = [" << + m_lastStartTime << "] and end = [" << m_lastEndTime << "]", + Kernel::ErrorType::BadInput); + + m_lastStartTime = tStart; + m_lastEndTime = tEnd; + + boxContext.markOutputAsReadyToSend(0, tStart, tEnd); + m_headerSent = true; + } + + boxContext.markInputAsDeprecated(i, j); + } + } + + return true; +} +} // namespace Streaming +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmStreamedMatrixMultiplexer.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmStreamedMatrixMultiplexer.h new file mode 100644 index 0000000..4699986 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/box-algorithms/ovpCBoxAlgorithmStreamedMatrixMultiplexer.h @@ -0,0 +1,138 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Streaming { +class CBoxAlgorithmStreamedMatrixMultiplexer final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_StreamedMatrixMultiplexer) + +protected: + + uint64_t m_lastStartTime = 0; + uint64_t m_lastEndTime = 0; + bool m_headerSent = false; +}; + +class CBoxAlgorithmStreamedMatrixMultiplexerListener final : public Toolkit::TBoxListener +{ +public: + + bool check(Kernel::IBox& box) const + { + for (size_t i = 0; i < box.getInputCount(); ++i) { box.setInputName(i, ("Input stream " + std::to_string(i + 1)).c_str()); } + return true; + } + + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getOutputType(0, typeID); + box.setInputType(index, typeID); + return this->check(box); + } + + bool onInputRemoved(Kernel::IBox& box, const size_t /*index*/) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getOutputType(0, typeID); + + while (box.getInputCount() < 2) { box.addInput("", typeID); } + + return this->check(box); + } + + bool onInputTypeChanged(Kernel::IBox& box, const size_t index) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(index, typeID); + + if (this->getTypeManager().isDerivedFromStream(typeID, OV_TypeId_StreamedMatrix)) + { + for (size_t i = 0; i < box.getInputCount(); ++i) { box.setInputType(i, typeID); } + + box.setOutputType(0, typeID); + } + else + { + box.getOutputType(0, typeID); + box.setInputType(index, typeID); + } + + return true; + } + + bool onOutputTypeChanged(Kernel::IBox& box, const size_t /*index*/) override + { + CIdentifier typeID = CIdentifier::undefined(); + box.getOutputType(0, typeID); + + if (this->getTypeManager().isDerivedFromStream(typeID, OV_TypeId_StreamedMatrix)) + { + for (size_t i = 0; i < box.getInputCount(); ++i) { box.setInputType(i, typeID); } + } + else + { + box.getInputType(0, typeID); + box.setOutputType(0, typeID); + } + + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmStreamedMatrixMultiplexerDesc final : virtual public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return CString("Streamed matrix multiplexer"); } + CString getAuthorName() const override { return CString("Yann Renard"); } + CString getAuthorCompanyName() const override { return CString("INRIA/IRISA"); } + CString getShortDescription() const override { return CString("Multiplexes streamed matrix buffers in a new stream"); } + CString getDetailedDescription() const override { return CString(""); } + CString getCategory() const override { return CString("Streaming"); } + CString getVersion() const override { return CString("1.0"); } + CString getSoftwareComponent() const override { return CString("openvibe-sdk"); } + CString getAddedSoftwareVersion() const override { return CString("0.0.0"); } + CString getUpdatedSoftwareVersion() const override { return CString("0.0.0"); } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_StreamedMatrixMultiplexer; } + IPluginObject* create() override { return new CBoxAlgorithmStreamedMatrixMultiplexer; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmStreamedMatrixMultiplexerListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Input stream 1", OV_TypeId_StreamedMatrix); + prototype.addInput("Input stream 2", OV_TypeId_StreamedMatrix); + prototype.addOutput("Multiplexed streamed matrix", OV_TypeId_StreamedMatrix); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyInput); + prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + + prototype.addInputSupport(OV_TypeId_StreamedMatrix); + prototype.addInputSupport(OV_TypeId_ChannelLocalisation); + prototype.addInputSupport(OV_TypeId_FeatureVector); + prototype.addInputSupport(OV_TypeId_Signal); + prototype.addInputSupport(OV_TypeId_Spectrum); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_StreamedMatrixMultiplexerDesc) +}; +} // namespace Streaming +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/ovp_defines.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/ovp_defines.h new file mode 100644 index 0000000..cc0d2ba --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/ovp_defines.h @@ -0,0 +1,14 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_SignalMerger OpenViBE::CIdentifier(0x4BF9326F, 0x75603102) +#define OVP_ClassId_BoxAlgorithm_SignalMergerDesc OpenViBE::CIdentifier(0x7A684C44, 0x23BA70A5) +#define OVP_ClassId_BoxAlgorithm_StreamedMatrixMultiplexer OpenViBE::CIdentifier(0x7A12298B, 0x785F4D42) +#define OVP_ClassId_BoxAlgorithm_StreamedMatrixMultiplexerDesc OpenViBE::CIdentifier(0x0B420425, 0x3F602DE7) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/ovp_main.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/ovp_main.cpp new file mode 100644 index 0000000..b9ebc8f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/streaming/src/ovp_main.cpp @@ -0,0 +1,19 @@ +#include "ovp_defines.h" + +#include "box-algorithms/ovpCBoxAlgorithmStreamedMatrixMultiplexer.h" +#include "box-algorithms/ovpCBoxAlgorithmSignalMerger.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Streaming { + +OVP_Declare_Begin() + OVP_Declare_New(CBoxAlgorithmStreamedMatrixMultiplexerDesc); + OVP_Declare_New(CBoxAlgorithmSignalMergerDesc); +OVP_Declare_End() + +} // namespace Streaming +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/CMakeLists.txt new file mode 100644 index 0000000..57b8db1 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/CMakeLists.txt @@ -0,0 +1,42 @@ +PROJECT(openvibe-plugins-sdk-tools) + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl) +INCLUDE("FindSourceRCProperties") +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRC_FILES}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleSystem") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindOpenViBEModuleSocket") +INCLUDE("FindOpenViBEModuleCommunication") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/plugins/tools) +INSTALL(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/box-tutorials/external-processing-filter.mxs b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/box-tutorials/external-processing-filter.mxs new file mode 100644 index 0000000..b79e1b6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/box-tutorials/external-processing-filter.mxs @@ -0,0 +1,520 @@ + + 1 + OpenVIBE + 0.4.99 + + + + + + (0x14bf05c0, 0x09128ae5) + External Processing + (0x15422959, 0x16304449) + + + (0x5ba36127, 0x195feae1) + New input + + + (0x6f752dd0, 0x082a321e) + New input + + + + + (0x5ba36127, 0x195feae1) + New output + + + (0x6f752dd0, 0x082a321e) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Launch third party program + true + true + false + + + (0x330306dd, 0x74a95f98) + Executable path + + ${Path_Bin}/sdk-examples-communication-client-filter + false + + + (0x79a9edeb, 0x245d83fc) + Arguments + + + false + + + (0x007deef9, 0x2f3e95c6) + Port + 59595 + 0 + false + + + (0x2cdb2f0b, 0x12f231ea) + Automatic connection identifier + true + true + false + + + (0x79a9edeb, 0x245d83fc) + Custom connection identifier + + + false + + + (0x007deef9, 0x2f3e95c6) + Incoming connection timeout + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Generator + false + false + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x6410533a, 0x11ff9fa8) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 8 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x1b8eb320, 0x35920803) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x207c9054, 0x3c841b63) + 464 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x2b2c676e, 0x1f9f8ed4) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(x) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96 + + + (0x207c9054, 0x3c841b63) + 464 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x6a37098c, 0x4353fccf) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 1.0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x6db580a4, 0x2710c742) + Continuous Oscilloscope + (0x0842bcd1, 0xd53c1c89) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 528 + + + (0x4e7b798a, 0x183beafb) + (0x35390ab5, 0x7b926078) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + + + (0x47d63853, 0x410bf5fe) + + (0x14bf05c0, 0x09128ae5) + 1 + + + (0x6db580a4, 0x2710c742) + 1 + + + + (0x4c81cafe, 0x0de678a1) + + (0x1b8eb320, 0x35920803) + 0 + + + (0x2b2c676e, 0x1f9f8ed4) + 0 + + + + (0x5135bc4a, 0x1edcc7ee) + + (0x14bf05c0, 0x09128ae5) + 0 + + + (0x6db580a4, 0x2710c742) + 0 + + + + (0x58190761, 0x23a1c7ca) + + (0x2b2c676e, 0x1f9f8ed4) + 0 + + + (0x14bf05c0, 0x09128ae5) + 0 + + + + (0x63ab5412, 0x051c9cde) + + (0x6a37098c, 0x4353fccf) + 0 + + + (0x14bf05c0, 0x09128ae5) + 1 + + + + + + (0x09b97cf8, 0x27678b7b) + Illustration of the usage of the <b>External Processing Box</b>. + +This box launches an external program and connects to it via TCP/IP. + +This particular example uses the example program given with the OpenViBE SDK, +it will take any number of inputs and echo them on respective outputs. + + + (0x473d9a43, 0x97fc0a97) + 160 + + + (0x7234b86b, 0x2b8651a5) + 80 + + + + + (0x1fbd3f8e, 0x02fc93b2) + Important options the box takes are: + +<b>Launch Third Party Program</b> - OpenViBE will start the +external program by itself if this setting is true. + +<b>Executable Path</b> - Program to launch. The path can +be an absolute path to a program, or a name of a program +in system PATH. + +<b>Arguments</b> - Arguments to pass to the external program. + +<b>Port</b> - The port through which the program will communicate +with openvibe. If the program is launched by OpenViBE this port will +be automatically passed to it using argument <tt>--port &lt;port&gt;</tt> +If the port is set to 0, an available one will be chosen automatically. + +<b>Generator</b> - Should be set to true if the box does not need to +process data synchronously. This usually means that it does not have +any inputs. + + + (0x473d9a43, 0x97fc0a97) + 160 + + + (0x7234b86b, 0x2b8651a5) + 352 + + + + + + + (0x205c8363, 0x19b5e92f) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0x6db580a4, 0x2710c742)","childCount":0,"identifier":"(0x3e899070, 0x3969c924)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x51e57212, 0x2ea425c0)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x1aaa3685, 0x1ce16371)","index":0,"name":"Default tab","parentIdentifier":"(0x51e57212, 0x2ea425c0)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x11475ce0, 0x64227efd)","index":0,"name":"Empty","parentIdentifier":"(0x1aaa3685, 0x1ce16371)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/box-tutorials/external-processing-generator.mxs b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/box-tutorials/external-processing-generator.mxs new file mode 100644 index 0000000..f32797b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/box-tutorials/external-processing-generator.mxs @@ -0,0 +1,608 @@ + + 1 + OpenVIBE + 0.4.99 + + + + + + (0x14bf05c0, 0x09128ae5) + External Processing + (0x15422959, 0x16304449) + + + (0x5ba36127, 0x195feae1) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Launch third party program + true + true + false + + + (0x330306dd, 0x74a95f98) + Executable path + + ${Path_Bin}/sdk-examples-communication-client-generator + false + + + (0x79a9edeb, 0x245d83fc) + Arguments + + + false + + + (0x007deef9, 0x2f3e95c6) + Port + 59595 + 0 + false + + + (0x2cdb2f0b, 0x12f231ea) + Automatic connection identifier + true + true + false + + + (0x79a9edeb, 0x245d83fc) + Custom connection identifier + + + false + + + (0x007deef9, 0x2f3e95c6) + Incoming connection timeout + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Generator + false + true + false + + + (0x007deef9, 0x2f3e95c6) + Channel Count + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling Rate + 128 + 128 + false + + + (0x007deef9, 0x2f3e95c6) + Samples Per Buffer + 16 + 16 + false + + + (0x007deef9, 0x2f3e95c6) + Amount of Samples to Generate + 512 + 512 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 512 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x6410533a, 0x11ff9fa8) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 8 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x14bf05c0, 0x09128ae6) + External Processing + (0x15422959, 0x16304449) + + + (0x5ba36127, 0x195feae1) + New output + + + + + (0x2cdb2f0b, 0x12f231ea) + Launch third party program + true + true + false + + + (0x330306dd, 0x74a95f98) + Executable path + + ${Path_Bin}/sdk-examples-communication-client-generator + false + + + (0x79a9edeb, 0x245d83fc) + Arguments + + + false + + + (0x007deef9, 0x2f3e95c6) + Port + 59595 + 0 + false + + + (0x2cdb2f0b, 0x12f231ea) + Automatic connection identifier + true + true + false + + + (0x79a9edeb, 0x245d83fc) + Custom connection identifier + + + false + + + (0x007deef9, 0x2f3e95c6) + Incoming connection timeout + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Generator + false + true + false + + + (0x007deef9, 0x2f3e95c6) + Channel Count + 4 + 5 + false + + + (0x007deef9, 0x2f3e95c6) + Sampling Rate + 128 + 128 + false + + + (0x007deef9, 0x2f3e95c6) + Samples Per Buffer + 16 + 16 + false + + + (0x007deef9, 0x2f3e95c6) + Amount of Samples to Generate + 512 + 512 + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x6410533a, 0x11ff9fa8) + + + (0x527ad68d, 0x16d746a0) + + + + (0x61d11811, 0x71e65362) + + + + (0xce18836a, 0x9c0eb403) + 8 + + + (0xf191c1c8, 0xa0123976) + + + + (0xfba64161, 0x65304e21) + + + + + + (0x6db580a4, 0x2710c742) + 4 Channels + (0x0842bcd1, 0xd53c1c89) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 512 + + + (0x4e7b798a, 0x183beafb) + (0x35390ab5, 0x7b926078) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x6db580a4, 0x2710c743) + 5 Channels + (0x0842bcd1, 0xd53c1c89) + + + (0x5ba36127, 0x195feae1) + Matrix + + + (0x6f752dd0, 0x082a321e) + Markers + + + + + (0x330306dd, 0x74a95f98) + Channel Localisation + ${AdvancedViz_ChannelLocalisation} + ${AdvancedViz_ChannelLocalisation} + false + + + (0x8f02e3f6, 0xffb00f4b) + Temporal Coherence + Time Locked + Time Locked + false + + + (0x512a166f, 0x5c3ef83f) + Time Scale + 20 + 20 + false + + + (0x007deef9, 0x2f3e95c6) + Matrix Count + 50 + 50 + false + + + (0x2cdb2f0b, 0x12f231ea) + Positive Data Only ? + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Gain + 1 + 1 + false + + + (0x79a9edeb, 0x245d83fc) + Caption + + + false + + + (0x512a166f, 0x5c3ef83f) + Translucency + 1 + 1 + false + + + (0x7f45a2a9, 0x7db12219) + Color + ${AdvancedViz_DefaultColor} + ${AdvancedViz_DefaultColor} + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240 + + + (0x207c9054, 0x3c841b63) + 720 + + + (0x4e7b798a, 0x183beafb) + (0x35390ab5, 0x7b926078) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 9 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + + + (0x5135bc4a, 0x1edcc7ee) + + (0x14bf05c0, 0x09128ae5) + 0 + + + (0x6db580a4, 0x2710c742) + 0 + + + + (0x5135bc4a, 0x1edcc7ef) + + (0x14bf05c0, 0x09128ae6) + 0 + + + (0x6db580a4, 0x2710c743) + 0 + + + + + + (0x020f409a, 0x2e82d6c9) + The generator example program can take the following settings: + + +<b>Channel Count</b> +<b>Sampling Rate</b> +<b>Samples Per Buffer</b> +<b>Samples To Generate</b> - The program will stop after this many samples + + + + (0x473d9a43, 0x97fc0a97) + 640 + + + (0x7234b86b, 0x2b8651a5) + 400 + + + + + (0x09b97cf8, 0x27678b7b) + Illustration of the usage of the <b>External Processing Box</b>. + +This box launches an external program and connects to it via TCP/IP. + +This particular example uses the <b>generator</b> example program given with the OpenViBE SDK. + +It will generate several sinus signals with a custom sampling rate and epoching. + +Optionally it can stop generating samples after a period of time. + + + (0x473d9a43, 0x97fc0a97) + 144 + + + (0x7234b86b, 0x2b8651a5) + 80 + + + + + (0x1fbd3f8e, 0x02fc93b2) + Important options the box takes are: + +<b>Launch Third Party Program</b> - OpenViBE will start the +external program by itself if this setting is true. + +<b>Executable Path</b> - Program to launch. The path can +be an absolute path to a program, or a name of a program +in system PATH. + +<b>Arguments</b> - Arguments to pass to the external program. + +<b>Port</b> - The port through which the program will communicate +with openvibe. If the program is launched by OpenViBE this port will +be automatically passed to it using argument <tt>--port &lt;port&gt;</tt> +If the port is set to 0, an available one will be chosen automatically. + +<b>Generator</b> - Should be set to true if the box does not need to +process data synchronously. This usually means that it does not have +any inputs. In this scenario this is the case! + + + (0x473d9a43, 0x97fc0a97) + 192 + + + (0x7234b86b, 0x2b8651a5) + 368 + + + + + + + (0x205c8363, 0x19b5e92f) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":490,"identifier":"(0x51e57212, 0x2ea425c0)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":791},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x1aaa3685, 0x1ce16371)","index":0,"name":"Default tab","parentIdentifier":"(0x51e57212, 0x2ea425c0)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":383,"identifier":"(0x3def082e, 0x180223c7)","index":0,"maxDividerPosition":771,"name":"Horizontal split","parentIdentifier":"(0x1aaa3685, 0x1ce16371)","type":5},{"boxIdentifier":"(0x6db580a4, 0x2710c742)","childCount":0,"identifier":"(0x3e899070, 0x3969c924)","index":0,"parentIdentifier":"(0x3def082e, 0x180223c7)","type":3},{"boxIdentifier":"(0x6db580a4, 0x2710c743)","childCount":0,"identifier":"(0x4de25e08, 0x488b872b)","index":1,"parentIdentifier":"(0x3def082e, 0x180223c7)","type":3}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_EBMLStreamSpy.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_EBMLStreamSpy.dox-part new file mode 100644 index 0000000..b218307 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_EBMLStreamSpy.dox-part @@ -0,0 +1,192 @@ +/** + * \page BoxAlgorithm_EBMLStreamSpy EBML stream spy +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EBMLStreamSpy_Description| + * The purpose of this box is to spy an EBML stream and decode + * its structure to the log manager. In order to do so, the box + * has to know a list of expected EBML node identifiers and EBML + * node types. If you don't know what EBML is, you should check + * the \ref Doc_WhatIsEBML page. The list of expected node + * identifiers and types is collected from a configuration file. + * Also, the author is able to chose which log level to use + * in order to output the information. + * + * Such box is mostly usefull for debug purpose. It allows + * a developper to check what arrives to a box in a human + * readable way. + * |OVP_DocEnd_BoxAlgorithm_EBMLStreamSpy_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EBMLStreamSpy_Inputs| + * This box can receive as many input as necessary. All the inputs + * will be of type \ref Doc_Streams_EBMLStream in order to + * be parsed by this the reader. + * |OVP_DocEnd_BoxAlgorithm_EBMLStreamSpy_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_EBMLStreamSpy_Input1| + * This is the default input of this box. + * |OVP_DocEnd_BoxAlgorithm_EBMLStreamSpy_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EBMLStreamSpy_Settings| + * |OVP_DocEnd_BoxAlgorithm_EBMLStreamSpy_Settings| + + * |OVP_DocBegin_BoxAlgorithm_EBMLStreamSpy_Setting1| + * This first setting indicates where to find the configuration file. + * The box comes with a default configuration file containing all the + * default node identifiers of BRAND_NAME. You should extend this + * configuration in order to add your own EBML nodes in case you + * have created new EBML stream types. + * |OVP_DocEnd_BoxAlgorithm_EBMLStreamSpy_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_EBMLStreamSpy_Setting2| + * This second settings indicates what log level will be used to + * print the EBML stream structure. + * |OVP_DocEnd_BoxAlgorithm_EBMLStreamSpy_Setting2| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EBMLStreamSpy_Examples| + * As an example, we could connect an EBML stream spy to a sinus + * oscillator. Leave the default sinus oscillator settings to their + * default, except the sample count per buffer can be set to 8 for the + * example. Chose an appropriate log level for the EBML stream spy and + * press 'start'. You will probably notice that a lot of text is sent + * to the log manager, making the use of this box difficult in real time. + * Once again, consider it as a debugging box. + * + * The output should look like this : +\verbatim +[ INF ] +[ INF ] For input Spied EBML stream 1 of type EBML stream : +[ INF ] For chunk [id:0 (0x0)] at [time:(0x00000000, 0x00000000),(0x00000000, 0x00000000)] +[ INF ] Opened EBML node [id:(0x002b395f, 0x108adfae)]-[name:OVTK_NodeId_Header] +[ INF ] Opened EBML node [id:(0x00cdd0f7, 0x46b0278d)]-[name:OVTK_NodeId_Header_StreamType]-[type:uinteger]-[value:0 (0x0)] +[ INF ] Opened EBML node [id:(0x006f5a08, 0x7796ebc5)]-[name:OVTK_NodeId_Header_StreamVersion]-[type:uinteger]-[value:0 (0x0)] +[ INF ] Opened EBML node [id:(0x007855de, 0x3748d375)]-[name:OVTK_NodeId_Header_Signal] +[ INF ] Opened EBML node [id:(0x00141c43, 0x0c37006b)]-[name:OVTK_NodeId_Header_Signal_Sampling]-[type:uinteger]-[value:512 (0x200)] +[ INF ] Opened EBML node [id:(0x0072f560, 0x7ed2cbed)]-[name:OVTK_NodeId_Header_StreamedMatrix] +[ INF ] Opened EBML node [id:(0x003febd4, 0x2725d428)]-[name:OVTK_NodeId_Header_StreamedMatrix_DimensionCount]-[type:uinteger]-[value:2 (0x2)] +[ INF ] Opened EBML node [id:(0x0000e3c0, 0x3a7d5141)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension] +[ INF ] Opened EBML node [id:(0x001302f7, 0x36d8438a)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Size]-[type:uinteger]-[value:4 (0x4)] +[ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:Channel 0] +[ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:Channel 1] +[ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:Channel 2] +[ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:Channel 3] +[ INF ] Opened EBML node [id:(0x0000e3c0, 0x3a7d5141)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension] +[ INF ] Opened EBML node [id:(0x001302f7, 0x36d8438a)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Size]-[type:uinteger]-[value:8 (0x8)] +[ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:] +[ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:] +[ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:] +[ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:] +[ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:] +[ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:] +[ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:] +[ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:] +[ INF ] +[ INF ] +[ INF ] For input Spied EBML stream 1 of type EBML stream : +[ INF ] For chunk [id:0 (0x0)] at [time:(0x00000000, 0x00000000),(0x00000000, 0x04000000)] +[ INF ] Opened EBML node [id:(0x00cf2101, 0x02375310)]-[name:OVTK_NodeId_Buffer] +[ INF ] Opened EBML node [id:(0x00120663, 0x08fbc165)]-[name:OVTK_NodeId_Buffer_StreamedMatrix] +[ INF ] Opened EBML node [id:(0x00b18c10, 0x427d098c)]-[name:OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer]-[type:binary]-[bytes:256 (0x100)] +[ INF ] +[ INF ] +[ INF ] For input Spied EBML stream 1 of type EBML stream : +[ INF ] For chunk [id:0 (0x0)] at [time:(0x00000000, 0x04000000),(0x00000000, 0x08000000)] +[ INF ] Opened EBML node [id:(0x00cf2101, 0x02375310)]-[name:OVTK_NodeId_Buffer] +[ INF ] Opened EBML node [id:(0x00120663, 0x08fbc165)]-[name:OVTK_NodeId_Buffer_StreamedMatrix] +[ INF ] Opened EBML node [id:(0x00b18c10, 0x427d098c)]-[name:OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer]-[type:binary]-[bytes:256 (0x100)] +[ INF ] +[ INF ] +[ INF ] For input Spied EBML stream 1 of type EBML stream : +[ INF ] For chunk [id:0 (0x0)] at [time:(0x00000000, 0x08000000),(0x00000000, 0x0c000000)] +[ INF ] Opened EBML node [id:(0x00cf2101, 0x02375310)]-[name:OVTK_NodeId_Buffer] +[ INF ] Opened EBML node [id:(0x00120663, 0x08fbc165)]-[name:OVTK_NodeId_Buffer_StreamedMatrix] +[ INF ] Opened EBML node [id:(0x00b18c10, 0x427d098c)]-[name:OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer]-[type:binary]-[bytes:256 (0x100)] +[ INF ] +... +\endverbatim + * + * Now let's try to understand what is produced. First we notice a clear + * separation between the different chunk the box receives. In each chunk, we + * have an EBML hierarchy with the different nodes. Here we analyse a signal + * stream so we have a header followed by multiple buffers. + * + * Concerning the header, we can focuse on the signal header part and + * the streamed matrix header part. In the first one, we can see that the sampling + * rate node appears as an integer with value 512 (the default sinus oscillator + * sampling frequency). The second one contains the description of the streamed + * matrix. The matrix has two dimensions (electrodes and sample count per buffer). + * The first dimension has a size of 4 (the default sinus oscillator channel count) + * and each of this channel has a label (channel 0-3). Finally, the second dimension + * has a size of 8 (the sample count per buffer you manually put in the sinus + * oscillator configuration) and the samples themselves do not have a name. + * + * Now looking at the buffer, we only have the streamed matrix part (signal + * stream do not produce signal specific buffer). The buffer content can not + * be displayed in the console (it could be a huge amount of binary non human + * readable data, so it is not relevant to print it). But you have an information + * of the size of this buffer. 256 is exactly the number of channels (4) multiplied + * by the number of samples per buffer (8) multiplied by the size of a single sample + * (8 because a sample is coded on a 64 bits float). + * + * When familiar with EBML and OpenViBE streams, this box is a strong tool + * to analyze what is sent from a box to another. + * |OVP_DocEnd_BoxAlgorithm_EBMLStreamSpy_Examples| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_EBMLStreamSpy_Miscellaneous| + * The syntax of the configuration file is simple. Each line of the file + * should contain 3 fields. The first field is the name of the EBML node + * that should be printed in the log manager (this is human readable). + * The second field is the EBML node identifier. The last field is the node + * type. Several types are supported : + * - \e master : this means that this node does not have data attached but has + * several children. Any non master node is a leaf, so can contain data. + * - \e integer : this means that this node contains a signed integer value + * - \e uinteger : this means that this node contains an unsigned integer value + * - \e string : this means that this node contains an ASCII string value + * - \e float : this means that this node contains a floating point value + * - \e binary : this means that this node contains a raw buffer of elements. + * In such case, only the size of the buffer is printed. The content of the + * buffer is not printed. + * + * Any node identifier found in the stream and not present in the configuration + * file will be considered of type \e unknown and treated as if it was a \e binary + * node. + * + * Following is a part of the sample configuration file to illustrate the syntax : +\verbatim +... + +OVTK_NodeId_Header_StreamedMatrix EBML::CIdentifier(0x0072F560, 0x7ED2CBED) master +OVTK_NodeId_Header_StreamedMatrix_DimensionCount EBML::CIdentifier(0x003FEBD4, 0x2725D428) uinteger +OVTK_NodeId_Header_StreamedMatrix_Dimension EBML::CIdentifier(0x0000E3C0, 0x3A7D5141) master +OVTK_NodeId_Header_StreamedMatrix_Dimension_Size EBML::CIdentifier(0x001302F7, 0x36D8438A) uinteger +OVTK_NodeId_Header_StreamedMatrix_Dimension_Label EBML::CIdentifier(0x00153E40, 0x190227E0) string +OVTK_NodeId_Buffer_StreamedMatrix EBML::CIdentifier(0x00120663, 0x08FBC165) master +OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer EBML::CIdentifier(0x00B18C10, 0x427D098C) binary + +OVTK_NodeId_Header_Signal EBML::CIdentifier(0x007855DE, 0x3748D375) master +OVTK_NodeId_Header_Signal_Sampling EBML::CIdentifier(0x00141C43, 0x0C37006B) uinteger + +... +\endverbatim + * |OVP_DocEnd_BoxAlgorithm_EBMLStreamSpy_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_ExternalProcessing.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_ExternalProcessing.dox-part new file mode 100644 index 0000000..d291fcb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_ExternalProcessing.dox-part @@ -0,0 +1,109 @@ +/** + * \page BoxAlgorithm_ExternalProcessing External Processing +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ExternalProcessing_Description| + This box allows to externalize data processing into an external program. It sends EBML data in chunks + according to a specified protocol, the external application must respond with an EBML response following + this same protocol. + + A SDK for C++ and Python 3 (Python NeuroRT Box) are provided in order to simplify the development of + external boxes. + + This box can work in two modes, either it launches the external program itself, or it will wait for client + connections during the initialize step. + + * |OVP_DocEnd_BoxAlgorithm_ExternalProcessing_Description| + +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ExternalProcessing_Settings| + + The External Processing box has several settings. The first eight parameters are reserved for the + box. Any additional parameters will be passed to the external program. + + * |OVP_DocEnd_BoxAlgorithm_ExternalProcessing_Settings| + + * |OVP_DocBegin_BoxAlgorithm_ExternalProcessing_Setting1| + If true, the box will attempt to start the external program automatically. If this setting is false, then the box will stop + during the initialize step and wait for the external program to connect during the time speficied by the Connection Timeout setting. + * |OVP_DocEnd_BoxAlgorithm_ExternalProcessing_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_ExternalProcessing_Setting2| + Path to the executable to run. This parameter is only used if the first parameter is activated. + + Example: OpenViBE SDK comes with two example programs, one can be found in ${Path_Bin}/sdk-examples-communication-client-filter + Example: In the case you want to run a Python script on Windows, the program you are running is python, e.g: C:/Python35/python.exe + * |OVP_DocEnd_BoxAlgorithm_ExternalProcessing_Setting2| + + * |OVP_DocBegin_BoxAlgorithm_ExternalProcessing_Setting3| + Arguments passed to the third party program, if any are necessary. This parameter is only used if the first parameter is activated. + + This parameter will be given to the third party program as is, thus it is necessary to quote any arguments that contain spaces. + + Example: In the case you want to run a Python script on Windows, the parameter is the absolute path to the script that you want to run, e.g.: "C:/MyProject/myprogram.py" or "-m mylibrary.mymodule.mybox". + + * |OVP_DocEnd_BoxAlgorithm_ExternalProcessing_Setting3| + + * |OVP_DocBegin_BoxAlgorithm_ExternalProcessing_Setting4| + The TCP port that the box is listening. It must be in the range 49152-65535 or it can be 0, in which case the port will be chosen + automatically. + + The box acts as a Socket server and the external program as a client. If you have several External Processing boxes in the same scenario + each has to work on a different port. + + An argument, with the value of the port, will be given to the third party program (after the Arguments parameter ) as: --port PORT + + This means that your external program must accept the --port parameter and use it to connect to this box. + * |OVP_DocEnd_BoxAlgorithm_ExternalProcessing_Setting4| + + * |OVP_DocBegin_BoxAlgorithm_ExternalProcessing_Setting5| + Whether or not to generate of a connection identifier for the connection. See the next setting for explanation. + * |OVP_DocEnd_BoxAlgorithm_ExternalProcessing_Setting5| + + * |OVP_DocBegin_BoxAlgorithm_ExternalProcessing_Setting6| + This argument will be passed to the external program as a command line parameter: `--connection-id CONNECTIONID` and will be communicated to your + program through the protocol as well. You should check that the two are matching in order to avoid a clash if two boxes would be using the same + port. + + We advise you to use an automatic identifier generation in production. Choose your custom connection identifier is however necessary when running + the external program explicitly. + * |OVP_DocEnd_BoxAlgorithm_ExternalProcessing_Setting6| + + * |OVP_DocBegin_BoxAlgorithm_ExternalProcessing_Setting7| + A timeout, in seconds, for the incoming connection acceptance. + * |OVP_DocEnd_BoxAlgorithm_ExternalProcessing_Setting7| + + * |OVP_DocBegin_BoxAlgorithm_ExternalProcessing_Setting8| + This setting changes how often the box will process data. Each data processing requires that the box will + wait until it has received a response from the external program. Too many of these synchronisations can + induce a severe performance penalty. + + If the box is a generator, then it will wait for the external program on each step. If the scenario is + played in real-time, then the box will poll the external program at 16Hz. If the scenario is in fast-forward + the refresh frequency of this box is 1Hz. + + If this setting is set to false, the box will send all data it receives into the external program and wait + until it processes it and sends it back. + * |OVP_DocEnd_BoxAlgorithm_ExternalProcessing_Setting8| +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_ExternalProcessing_Miscellaneous| +This box requires synchronization with the external program in order to process data correctly and in order. +As the synchronization is a relatively slow process with regards to the duration of one update cycle (62ms) it +is better to try to limit the number of chunks that are send between the box and the client application. + +If you find that your scenario is too slow, try using time based epoching in front of it to make chunks of data +larger. + * |OVP_DocEnd_BoxAlgorithm_ExternalProcessing_Miscellaneous| + +*/ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_MatrixValidityChecker.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_MatrixValidityChecker.dox-part new file mode 100644 index 0000000..799a4c2 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_MatrixValidityChecker.dox-part @@ -0,0 +1,47 @@ +/** + * \page BoxAlgorithm_MatrixValidityChecker Matrix validity checker +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixValidityChecker_Description| + Ensures values stored in a matrix are valid, i.e. regular floating point values as opposed to NaN (not a number) or infinite. + * |OVP_DocEnd_BoxAlgorithm_MatrixValidityChecker_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixValidityChecker_Inputs| + * |OVP_DocEnd_BoxAlgorithm_MatrixValidityChecker_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_MatrixValidityChecker_Input1| + * |OVP_DocEnd_BoxAlgorithm_MatrixValidityChecker_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixValidityChecker_Settings| + * |OVP_DocEnd_BoxAlgorithm_MatrixValidityChecker_Settings| + + * |OVP_DocBegin_BoxAlgorithm_MatrixValidityChecker_Setting1| + Log level of messages to be printed whenever Nan or infinite values are found in input matrix. + * |OVP_DocEnd_BoxAlgorithm_MatrixValidityChecker_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixValidityChecker_Examples| + * |OVP_DocEnd_BoxAlgorithm_MatrixValidityChecker_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_MatrixValidityChecker_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_MatrixValidityChecker_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_StimulationListener.dox-part b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_StimulationListener.dox-part new file mode 100644 index 0000000..1c822b8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/Doc_BoxAlgorithm_StimulationListener.dox-part @@ -0,0 +1,103 @@ +/** + * \page BoxAlgorithm_StimulationListener Stimulation listener +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationListener_Description| + * The stimulation listener is a debugging purpose box, with + * the same idea as the \ref Doc_BoxAlgorithm_EBMLStreamSpy box + * but dedicated to stimulation streams. The idea is to dramatically + * reduce the log verbosity so the output may be followed realtime + * if necessary. + * |OVP_DocEnd_BoxAlgorithm_StimulationListener_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationListener_Inputs| + * This box can receive as many input as necessary. All the inputs + * will be of type \ref Doc_Streams_Stimulation in order to + * be parsed by this the reader. + * |OVP_DocEnd_BoxAlgorithm_StimulationListener_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_StimulationListener_Input1| + * This is the default input of this box. + * |OVP_DocEnd_BoxAlgorithm_StimulationListener_Input1| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationListener_Settings| + * |OVP_DocEnd_BoxAlgorithm_StimulationListener_Settings| + + * |OVP_DocBegin_BoxAlgorithm_StimulationListener_Setting1| + * This setting indicates what log level will be used to + * print the the received stimulations. + * |OVP_DocEnd_BoxAlgorithm_StimulationListener_Setting1| +__________________________________________________________________ + +Examples description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationListener_Examples| + * As an example, we could connect a clock stimulator to a + * stimulation listener. Leave the default settings of the + * clock stimulator, so it sends an \e OVTK_StimulationId_Label_00 + * stimulation every second. Now chose an appropriate log level + * for the stimulation listener and press 'start'. If you're + * familiar to what \ref Doc_BoxAlgorithm_EBMLStreamSpy produces, + * you may feel more confortable with what is produced here for + * stimulations. + * + * The output should look like this : +\verbatim +... +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 4294967296 (0x100000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 8589934592 (0x200000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 12884901888 (0x300000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 17179869184 (0x400000000) and duration 0 (0x0) +... +\endverbatim + * + * Now let's try to understand what is produced. Each line represents + * received stimulation. The input index which received the stimulation + * is printed. Then follow the stimulation code, its date and its duration. + * The stimulation name is retrieved from the type manager when correctly + * registered. Here, you can see that an \e OVTK_StimulationId_Label_00 is + * received every second. + * + * More tests could be done with another clock stimulator with different + * timings and stimulation codes. You will want to add inputs to the stimulation + * listener box in order to get proper results. For example with one more box + * sending \e OVTK_StimulationId_Label_01 every half second, the output would + * look like this : +\verbatim +... +[ INF ] For input 1 (0x1) with name Stimulation stream 2 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 2147483648 (0x80000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 4294967296 (0x100000000) and duration 0 (0x0) +[ INF ] For input 1 (0x1) with name Stimulation stream 2 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 4294967296 (0x100000000) and duration 0 (0x0) +[ INF ] For input 1 (0x1) with name Stimulation stream 2 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 6442450944 (0x180000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 8589934592 (0x200000000) and duration 0 (0x0) +[ INF ] For input 1 (0x1) with name Stimulation stream 2 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 8589934592 (0x200000000) and duration 0 (0x0) +[ INF ] For input 1 (0x1) with name Stimulation stream 2 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 10737418240 (0x280000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 12884901888 (0x300000000) and duration 0 (0x0) +[ INF ] For input 1 (0x1) with name Stimulation stream 2 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 12884901888 (0x300000000) and duration 0 (0x0) +[ INF ] For input 1 (0x1) with name Stimulation stream 2 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 15032385536 (0x380000000) and duration 0 (0x0) +[ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 17179869184 (0x400000000) and duration 0 (0x0) +[ INF ] For input 1 (0x1) with name Stimulation stream 2 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 17179869184 (0x400000000) and duration 0 (0x0) +... +\endverbatim + * |OVP_DocEnd_BoxAlgorithm_StimulationListener_Examples| + +__________________________________________________________________ + +Miscellaneous description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_StimulationListener_Miscellaneous| + * |OVP_DocEnd_BoxAlgorithm_StimulationListener_Miscellaneous| + */ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/Doc_BoxAlgorithm_EBMLStreamSpy.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/Doc_BoxAlgorithm_EBMLStreamSpy.rst new file mode 100644 index 0000000..4554913 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/Doc_BoxAlgorithm_EBMLStreamSpy.rst @@ -0,0 +1,214 @@ +.. _Doc_BoxAlgorithm_EBMLStreamSpy: + +EBML stream spy +=============== + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA/IRISA + +.. image:: images/Doc_BoxAlgorithm_EBMLStreamSpy.png + +This sample EBML stream analyzer prints the EBML tree structure to the console + +The purpose of this box is to spy an EBML stream and decode its structure to +the log manager. In order to do so, the box has to know a list of expected EBML +node identifiers and EBML node types. If you don't know what EBML is, you +should check the `EBML Documentation +`_ page. The list of +expected node identifiers and types is collected from a configuration file. +Also, the author is able to chose which log level to use in order to output the +information. + +Such box is mostly useful for debug purpose. It allows +a developper to check what arrives to a box in a human +readable way. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Spied EBML stream 1", "EBML stream" + +This box can receive as many input as necessary. All the inputs +will be of type :ref:`Doc_Streams_EBML` in order to +be parsed by this the reader. + +Spied EBML stream 1 +~~~~~~~~~~~~~~~~~~~ + +This is the default input of this box. + +.. _Doc_BoxAlgorithm_EBMLStreamSpy_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "EBML nodes description", "Filename", "${Path_Data}/plugins/tools/config-ebml-stream-spy.txt" + "Log level to use", "Log level", "Information" + "Expand binary blocks", "Boolean", "false" + "Number of values in expanded blocks", "Integer", "4" + +EBML nodes description +~~~~~~~~~~~~~~~~~~~~~~ + +This first setting indicates where to find the configuration file. +The box comes with a default configuration file containing all the +default node identifiers of NeuroRT. You should extend this +configuration in order to add your own EBML nodes in case you +have created new EBML stream types. + +Log level to use +~~~~~~~~~~~~~~~~ + +This second settings indicates what log level will be used to +print the EBML stream structure. + +.. _Doc_BoxAlgorithm_EBMLStreamSpy_Examples: + +Examples +-------- + +As an example, we could connect an EBML stream spy to a sinus +oscillator. Leave the default sinus oscillator settings to their +default, except the sample count per buffer can be set to 8 for the +example. Chose an appropriate log level for the EBML stream spy and +press 'start'. You will probably notice that a lot of text is sent +to the log manager, making the use of this box difficult in real time. +Once again, consider it as a debugging box. + +The output should look like this : + +.. code:: + + [ INF ] + [ INF ] For input Spied EBML stream 1 of type EBML stream : + [ INF ] For chunk [id:0 (0x0)] at [time:(0x00000000, 0x00000000),(0x00000000, 0x00000000)] + [ INF ] Opened EBML node [id:(0x002b395f, 0x108adfae)]-[name:OVTK_NodeId_Header] + [ INF ] Opened EBML node [id:(0x00cdd0f7, 0x46b0278d)]-[name:OVTK_NodeId_Header_StreamType]-[type:uinteger]-[value:0 (0x0)] + [ INF ] Opened EBML node [id:(0x006f5a08, 0x7796ebc5)]-[name:OVTK_NodeId_Header_StreamVersion]-[type:uinteger]-[value:0 (0x0)] + [ INF ] Opened EBML node [id:(0x007855de, 0x3748d375)]-[name:OVTK_NodeId_Header_Signal] + [ INF ] Opened EBML node [id:(0x00141c43, 0x0c37006b)]-[name:OVTK_NodeId_Header_Signal_Sampling]-[type:uinteger]-[value:512 (0x200)] + [ INF ] Opened EBML node [id:(0x0072f560, 0x7ed2cbed)]-[name:OVTK_NodeId_Header_StreamedMatrix] + [ INF ] Opened EBML node [id:(0x003febd4, 0x2725d428)]-[name:OVTK_NodeId_Header_StreamedMatrix_DimensionCount]-[type:uinteger]-[value:2 (0x2)] + [ INF ] Opened EBML node [id:(0x0000e3c0, 0x3a7d5141)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension] + [ INF ] Opened EBML node [id:(0x001302f7, 0x36d8438a)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Size]-[type:uinteger]-[value:4 (0x4)] + [ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:Channel 0] + [ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:Channel 1] + [ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:Channel 2] + [ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:Channel 3] + [ INF ] Opened EBML node [id:(0x0000e3c0, 0x3a7d5141)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension] + [ INF ] Opened EBML node [id:(0x001302f7, 0x36d8438a)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Size]-[type:uinteger]-[value:8 (0x8)] + [ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:] + [ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:] + [ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:] + [ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:] + [ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:] + [ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:] + [ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:] + [ INF ] Opened EBML node [id:(0x00153e40, 0x190227e0)]-[name:OVTK_NodeId_Header_StreamedMatrix_Dimension_Label]-[type:string]-[value:] + [ INF ] + [ INF ] + [ INF ] For input Spied EBML stream 1 of type EBML stream : + [ INF ] For chunk [id:0 (0x0)] at [time:(0x00000000, 0x00000000),(0x00000000, 0x04000000)] + [ INF ] Opened EBML node [id:(0x00cf2101, 0x02375310)]-[name:OVTK_NodeId_Buffer] + [ INF ] Opened EBML node [id:(0x00120663, 0x08fbc165)]-[name:OVTK_NodeId_Buffer_StreamedMatrix] + [ INF ] Opened EBML node [id:(0x00b18c10, 0x427d098c)]-[name:OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer]-[type:binary]-[bytes:256 (0x100)] + [ INF ] + [ INF ] + [ INF ] For input Spied EBML stream 1 of type EBML stream : + [ INF ] For chunk [id:0 (0x0)] at [time:(0x00000000, 0x04000000),(0x00000000, 0x08000000)] + [ INF ] Opened EBML node [id:(0x00cf2101, 0x02375310)]-[name:OVTK_NodeId_Buffer] + [ INF ] Opened EBML node [id:(0x00120663, 0x08fbc165)]-[name:OVTK_NodeId_Buffer_StreamedMatrix] + [ INF ] Opened EBML node [id:(0x00b18c10, 0x427d098c)]-[name:OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer]-[type:binary]-[bytes:256 (0x100)] + [ INF ] + [ INF ] + [ INF ] For input Spied EBML stream 1 of type EBML stream : + [ INF ] For chunk [id:0 (0x0)] at [time:(0x00000000, 0x08000000),(0x00000000, 0x0c000000)] + [ INF ] Opened EBML node [id:(0x00cf2101, 0x02375310)]-[name:OVTK_NodeId_Buffer] + [ INF ] Opened EBML node [id:(0x00120663, 0x08fbc165)]-[name:OVTK_NodeId_Buffer_StreamedMatrix] + [ INF ] Opened EBML node [id:(0x00b18c10, 0x427d098c)]-[name:OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer]-[type:binary]-[bytes:256 (0x100)] + [ INF ] + ... + +Now let's try to understand what is produced. First we notice a clear +separation between the different chunk the box receives. In each chunk, we +have an EBML hierarchy with the different nodes. Here we analyse a signal +stream so we have a header followed by multiple buffers. + +Concerning the header, we can focuse on the signal header part and +the streamed matrix header part. In the first one, we can see that the sampling +rate node appears as an integer with value 512 (the default sinus oscillator +sampling frequency). The second one contains the description of the streamed +matrix. The matrix has two dimensions (electrodes and sample count per buffer). +The first dimension has a size of 4 (the default sinus oscillator channel count) +and each of this channel has a label (channel 0-3). Finally, the second dimension +has a size of 8 (the sample count per buffer you manually put in the sinus +oscillator configuration) and the samples themselves do not have a name. + +Now looking at the buffer, we only have the streamed matrix part (signal +stream do not produce signal specific buffer). The buffer content can not +be displayed in the console (it could be a huge amount of binary non human +readable data, so it is not relevant to print it). But you have an information +of the size of this buffer. 256 is exactly the number of channels (4) multiplied +by the number of samples per buffer (8) multiplied by the size of a single sample +(8 because a sample is coded on a 64 bits float). + +When familiar with EBML and OpenViBE streams, this box is a strong tool +to analyze what is sent from a box to another. + +.. _Doc_BoxAlgorithm_EBMLStreamSpy_Miscellaneous: + +Miscellaneous +------------- + +The syntax of the configuration file is simple. Each line of the file +should contain 3 fields. The first field is the name of the EBML node +that should be printed in the log manager (this is human readable). +The second field is the EBML node identifier. The last field is the node +type. Several types are supported : + +- \e master : this means that this node does not have data attached but has + +several children. Any non master node is a leaf, so can contain data. + +- \e integer : this means that this node contains a signed integer value +- \e uinteger : this means that this node contains an unsigned integer value +- \e string : this means that this node contains an ASCII string value +- \e float : this means that this node contains a floating point value +- \e binary : this means that this node contains a raw buffer of elements. + +In such case, only the size of the buffer is printed. The content of the +buffer is not printed. + +Any node identifier found in the stream and not present in the configuration +file will be considered of type \e unknown and treated as if it was a \e binary +node. + +Following is a part of the sample configuration file to illustrate the syntax : + +.. code:: + + ... + + OVTK_NodeId_Header_StreamedMatrix EBML::CIdentifier(0x0072F560, 0x7ED2CBED) master + OVTK_NodeId_Header_StreamedMatrix_DimensionCount EBML::CIdentifier(0x003FEBD4, 0x2725D428) uinteger + OVTK_NodeId_Header_StreamedMatrix_Dimension EBML::CIdentifier(0x0000E3C0, 0x3A7D5141) master + OVTK_NodeId_Header_StreamedMatrix_Dimension_Size EBML::CIdentifier(0x001302F7, 0x36D8438A) uinteger + OVTK_NodeId_Header_StreamedMatrix_Dimension_Label EBML::CIdentifier(0x00153E40, 0x190227E0) string + OVTK_NodeId_Buffer_StreamedMatrix EBML::CIdentifier(0x00120663, 0x08FBC165) master + OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer EBML::CIdentifier(0x00B18C10, 0x427D098C) binary + + OVTK_NodeId_Header_Signal EBML::CIdentifier(0x007855DE, 0x3748D375) master + OVTK_NodeId_Header_Signal_Sampling EBML::CIdentifier(0x00141C43, 0x0C37006B) uinteger + + ... + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/Doc_BoxAlgorithm_ExternalProcessing.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/Doc_BoxAlgorithm_ExternalProcessing.rst new file mode 100644 index 0000000..d3231b2 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/Doc_BoxAlgorithm_ExternalProcessing.rst @@ -0,0 +1,150 @@ +.. _Doc_BoxAlgorithm_ExternalProcessing: + +External Processing +=================== + +.. container:: attribution + + :Author: + Alexis Placet + :Company: + Mensia Technologies SA + +.. image:: images/Doc_BoxAlgorithm_ExternalProcessing.png + +Launches an external program which can then process data. This box and the program communicate using TCP connection and a defined protocol. + +This box allows to externalize data processing into an external program. It sends EBML data in chunks +according to a specified protocol, the external application must respond with an EBML response following +this same protocol. + +A SDK for C++ and Python 3 (Python NeuroRT Box) are provided in order to simplify the development of +external boxes. + +This box can work in two modes, either it launches the external program itself, or it will wait for client +connections during the initialize step. + +.. _Doc_BoxAlgorithm_ExternalProcessing_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Launch third party program", "Boolean", "true" + "Executable path", "Filename", "" + "Arguments", "String", "" + "Port", "Integer", "0" + "Automatic connection identifier", "Boolean", "true" + "Custom connection identifier", "String", "" + "Incoming connection timeout", "Integer", "10" + "Generator", "Boolean", "false" + +The External Processing box has several settings. The first eight parameters are reserved for the +box. Any additional parameters will be passed to the external program. + +Launch third party program +~~~~~~~~~~~~~~~~~~~~~~~~~~ +If true, the box will attempt to start the external program automatically. +We advise to use this mode in production. + +If this setting is false, then the box will stop +during the initialize step and wait for the external program to connect during the time speficied by the Connection Timeout setting. +This mode is useful during development, since it allows to run the program manually and check the console. + + +Executable path +~~~~~~~~~~~~~~~ + +Path to the executable to run. This parameter is only used if the first parameter is activated. + +Example: OpenViBE SDK comes with two example programs, one can be found in ``${Path_Bin}/sdk-examples-communication-client-filter`` + +Example: In the case you want to run a Python script on Windows, the program you are running is python, e.g: ``C:/Python35/python.exe`` + +Arguments +~~~~~~~~~ + +Arguments passed to the third party program, if any are necessary. This parameter is only used if the first parameter is activated. + +This parameter will be given to the third party program as is, thus it is necessary to quote any arguments that contain spaces. + +Example: In the case you want to run a Python script on Windows, the parameter is the absolute path to the script that you want to run, e.g.: ``C:/MyProject/myprogram.py`` or ``-m mylibrary.mymodule.mybox``. + +Port +~~~~ + +The TCP port that the box is listening. It must be in the range 49152-65535 or it can be 0, in which case the port will be chosen +automatically. + +The box acts as a Socket server and the external program as a client. If you have several External Processing boxes in the same scenario +each has to work on a different port. + +We advise to use port ``0`` in production. + +An argument, with the value of the port, will be given to the third party program (after the Arguments parameter ) as: ``--port PORT`` + +This means that your external program must accept the ``--port`` parameter and use it to connect to this box. + +Automatic connection identifier +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Whether or not to generate of a connection identifier for the connection. See the next setting for explanation. + +Custom connection identifier +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This argument will be passed to the external program as a command line parameter: ``--connection-id CONNECTIONID`` and will be communicated to your +program through the protocol as well. You should check that the two are matching in order to avoid a clash if two boxes would be using the same +port. + +We advise you to use an automatic identifier generation in production. Choose your custom connection identifier is however necessary when running +the external program explicitly. + +Incoming connection timeout +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A timeout, in seconds, for the incoming connection acceptance. + +Generator +~~~~~~~~~ + +This setting changes how often the box will process data. Each data processing requires that the box will +wait until it has received a response from the external program. Too many of these synchronisations can +induce a severe performance penalty. + +If the box is a generator, then it will wait for the external program on each step. If the scenario is +played in real-time, then the box will poll the external program at 16Hz. If the scenario is in fast-forward +the refresh frequency of this box is 1Hz. + +If this setting is set to false, the box will send all data it receives into the external program and wait +until it processes it and sends it back. + +.. _Doc_BoxAlgorithm_ExternalProcessing_Miscellaneous: + +Miscellaneous +------------- + +Performances +~~~~~~~~~~~~ +This box requires synchronization with the external program in order to process data correctly and in order. +As the synchronization is a relatively slow process with regards to the duration of one update cycle (62ms) it +is better to try to limit the number of chunks that are send between the box and the client application. + +If you find that your scenario is too slow, try using time based epoching in front of it to make chunks of data +larger. + + +Development mode +~~~~~~~~~~~~~~~~ +While developing your program, you may want to run it in Debug mode in your environment. + +In order to run your program manually you should change the settings of the box: + * uncheck option ``Launch Third Party Program``, + * uncheck option ``Automatic connection identifier``, + * change the default port, for example to ``59595``, (make sure this is the default port used by your program) + * make sure the setting ``Incoming connection timeout`` will leave you enough time to run your program manually (default setting should be enough) + +Then, you can first run your scenario through NeuroRT Studio, and then run your program manually. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/Doc_BoxAlgorithm_MatrixValidityChecker.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/Doc_BoxAlgorithm_MatrixValidityChecker.rst new file mode 100644 index 0000000..2ab1f81 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/Doc_BoxAlgorithm_MatrixValidityChecker.rst @@ -0,0 +1,50 @@ +.. _Doc_BoxAlgorithm_MatrixValidityChecker: + +Matrix validity checker +======================= + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA/IRISA + +.. image:: images/Doc_BoxAlgorithm_MatrixValidityChecker.png + +This box is for debugging purposes and allows an author to check the validity of a streamed matrix and derived stream. This box can log a message, stop the player or interpolate data. + +Ensures values stored in a matrix are valid, i.e. regular floating point values as opposed to NaN (not a number) or infinite. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Stream 1", "Streamed matrix" + +Outputs +------- + +.. csv-table:: + :header: "Output Name", "Stream Type" + + "Output stream 1", "Streamed matrix" + +.. _Doc_BoxAlgorithm_MatrixValidityChecker_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Log level", "Log level", "Warning" + "Action to do", "Action to do", "Log warning" + +Log level +~~~~~~~~~ + +Log level of messages to be printed whenever Nan or infinite values are found in input matrix. + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/Doc_BoxAlgorithm_StimulationListener.rst b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/Doc_BoxAlgorithm_StimulationListener.rst new file mode 100644 index 0000000..a290151 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/Doc_BoxAlgorithm_StimulationListener.rst @@ -0,0 +1,110 @@ +.. _Doc_BoxAlgorithm_StimulationListener: + +Stimulation listener +==================== + +.. container:: attribution + + :Author: + Yann Renard + :Company: + INRIA/IRISA + +.. image:: images/Doc_BoxAlgorithm_StimulationListener.png + +Prints each received stimulationto the log using the log level specified in the box config. + +The stimulation listener is a debugging purpose box, with +the same idea as the :ref:`Doc_BoxAlgorithm_EBMLStreamSpy` box +but dedicated to stimulation streams. The idea is to dramatically +reduce the log verbosity so the output may be followed realtime +if necessary. + +Inputs +------ + +.. csv-table:: + :header: "Input Name", "Stream Type" + + "Stimulation stream 1", "Stimulations" + +This box can receive as many input as necessary. All the inputs +will be of type :ref:`Doc_Streams_Stimulation` in order to +be parsed by this the reader. + +Stimulation stream 1 +~~~~~~~~~~~~~~~~~~~~ + +This is the default input of this box. + +.. _Doc_BoxAlgorithm_StimulationListener_Settings: + +Settings +-------- + +.. csv-table:: + :header: "Setting Name", "Type", "Default Value" + + "Log level to use", "Log level", "Information" + +Log level to use +~~~~~~~~~~~~~~~~ + +This setting indicates what log level will be used to +print the the received stimulations. + +.. _Doc_BoxAlgorithm_StimulationListener_Examples: + +Examples +-------- + +As an example, we could connect a clock stimulator to a +stimulation listener. Leave the default settings of the +clock stimulator, so it sends an \e OVTK_StimulationId_Label_00 +stimulation every second. Now chose an appropriate log level +for the stimulation listener and press 'start'. If you're +familiar to what :ref:`Doc_BoxAlgorithm_EBMLStreamSpy` produces, +you may feel more confortable with what is produced here for +stimulations. + +The output should look like this : + +.. code:: + + ... + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 4294967296 (0x100000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 8589934592 (0x200000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 12884901888 (0x300000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 17179869184 (0x400000000) and duration 0 (0x0) + ... + +Now let's try to understand what is produced. Each line represents +received stimulation. The input index which received the stimulation +is printed. Then follow the stimulation code, its date and its duration. +The stimulation name is retrieved from the type manager when correctly +registered. Here, you can see that an \e OVTK_StimulationId_Label_00 is +received every second. + +More tests could be done with another clock stimulator with different +timings and stimulation codes. You will want to add inputs to the stimulation +listener box in order to get proper results. For example with one more box +sending \e OVTK_StimulationId_Label_01 every half second, the output would +look like this : + +.. code:: + + ... + [ INF ] For input 1 (0x1) with name Stimulation stream 2 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 2147483648 (0x80000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 4294967296 (0x100000000) and duration 0 (0x0) + [ INF ] For input 1 (0x1) with name Stimulation stream 2 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 4294967296 (0x100000000) and duration 0 (0x0) + [ INF ] For input 1 (0x1) with name Stimulation stream 2 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 6442450944 (0x180000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 8589934592 (0x200000000) and duration 0 (0x0) + [ INF ] For input 1 (0x1) with name Stimulation stream 2 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 8589934592 (0x200000000) and duration 0 (0x0) + [ INF ] For input 1 (0x1) with name Stimulation stream 2 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 10737418240 (0x280000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 12884901888 (0x300000000) and duration 0 (0x0) + [ INF ] For input 1 (0x1) with name Stimulation stream 2 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 12884901888 (0x300000000) and duration 0 (0x0) + [ INF ] For input 1 (0x1) with name Stimulation stream 2 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 15032385536 (0x380000000) and duration 0 (0x0) + [ INF ] For input 0 (0x0) with name Stimulation stream 1 got stimulation 33024 (0x8100)[OVTK_StimulationId_Label_00] at date 17179869184 (0x400000000) and duration 0 (0x0) + [ INF ] For input 1 (0x1) with name Stimulation stream 2 got stimulation 33025 (0x8101)[OVTK_StimulationId_Label_01] at date 17179869184 (0x400000000) and duration 0 (0x0) + ... + diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/images/Doc_BoxAlgorithm_EBMLStreamSpy.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/images/Doc_BoxAlgorithm_EBMLStreamSpy.png new file mode 100644 index 0000000..3e89abf Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/images/Doc_BoxAlgorithm_EBMLStreamSpy.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/images/Doc_BoxAlgorithm_ExternalProcessing.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/images/Doc_BoxAlgorithm_ExternalProcessing.png new file mode 100644 index 0000000..5c49576 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/images/Doc_BoxAlgorithm_ExternalProcessing.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/images/Doc_BoxAlgorithm_MatrixValidityChecker.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/images/Doc_BoxAlgorithm_MatrixValidityChecker.png new file mode 100644 index 0000000..8365d1b Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/images/Doc_BoxAlgorithm_MatrixValidityChecker.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/images/Doc_BoxAlgorithm_StimulationListener.png b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/images/Doc_BoxAlgorithm_StimulationListener.png new file mode 100644 index 0000000..20dac16 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/doc/boxes/images/Doc_BoxAlgorithm_StimulationListener.png differ diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/share/config-ebml-stream-spy.txt b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/share/config-ebml-stream-spy.txt new file mode 100644 index 0000000..ec9beff --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/share/config-ebml-stream-spy.txt @@ -0,0 +1,74 @@ +OVTK_NodeId_Acquisition_Header EBML::CIdentifier(0x00000000, 0x00004239) master +OVTK_NodeId_Acquisition_AcquisitionInfo EBML::CIdentifier(0x00000000, 0x00004240) master +OVTK_NodeId_Acquisition_ExperimentId EBML::CIdentifier(0x00000000, 0x00004241) uinteger +OVTK_NodeId_Acquisition_SubjectAge EBML::CIdentifier(0x00000000, 0x00004242) uinteger +OVTK_NodeId_Acquisition_SubjectGender EBML::CIdentifier(0x00000000, 0x00004243) uinteger +OVTK_NodeId_Acquisition_ChannelCount EBML::CIdentifier(0x00000000, 0x00004244) uinteger +OVTK_NodeId_Acquisition_SamplingFrequency EBML::CIdentifier(0x00000000, 0x00004245) uinteger +OVTK_NodeId_Acquisition_ChannelNames EBML::CIdentifier(0x00000000, 0x00004246) master +OVTK_NodeId_Acquisition_ChannelName EBML::CIdentifier(0x00000000, 0x00004247) string +OVTK_NodeId_Acquisition_GainFactors EBML::CIdentifier(0x00000000, 0x00004248) master +OVTK_NodeId_Acquisition_GainFactor EBML::CIdentifier(0x00000000, 0x00004249) float +OVTK_NodeId_Acquisition_ChannelLocations EBML::CIdentifier(0x00000000, 0x00004250) master +OVTK_NodeId_Acquisition_ChannelLocation EBML::CIdentifier(0x00000000, 0x00004251) binary(double) +OVTK_NodeId_Acquisition_Buffer EBML::CIdentifier(0x00000000, 0x0000005A) master +OVTK_NodeId_Acquisition_Samples EBML::CIdentifier(0x00000000, 0x0000005B) master +OVTK_NodeId_Acquisition_SamplesPerChannelCount EBML::CIdentifier(0x00000000, 0x0000005C) uinteger +OVTK_NodeId_Acquisition_SampleBlock EBML::CIdentifier(0x00000000, 0x0000005D) binary(float) +OVTK_NodeId_Acquisition_Stimulations EBML::CIdentifier(0x00000000, 0x00000060) master +OVTK_NodeId_Acquisition_StimulationsCount EBML::CIdentifier(0x00000000, 0x00000061) uinteger +OVTK_NodeId_Acquisition_Stimulation EBML::CIdentifier(0x00000000, 0x00000062) master +OVTK_NodeId_Acquisition_StimulationSampleIndex EBML::CIdentifier(0x00000000, 0x00000063) uinteger +OVTK_NodeId_Acquisition_StimulationIdentifier EBML::CIdentifier(0x00000000, 0x00000064) uinteger + +OVTK_NodeId_Header EBML::CIdentifier(0x002B395F, 0x108ADFAE) master +OVTK_NodeId_Header_StreamType EBML::CIdentifier(0x00CDD0F7, 0x46B0278D) uinteger +OVTK_NodeId_Header_StreamVersion EBML::CIdentifier(0x006F5A08, 0x7796EBC5) uinteger +OVTK_NodeId_Buffer EBML::CIdentifier(0x00CF2101, 0x02375310) master +OVTK_NodeId_End EBML::CIdentifier(0x00D9DDC3, 0x0B12873A) master + +OVTK_NodeId_Header_StreamedMatrix EBML::CIdentifier(0x0072F560, 0x7ED2CBED) master +OVTK_NodeId_Header_StreamedMatrix_DimensionCount EBML::CIdentifier(0x003FEBD4, 0x2725D428) uinteger +OVTK_NodeId_Header_StreamedMatrix_Dimension EBML::CIdentifier(0x0000E3C0, 0x3A7D5141) master +OVTK_NodeId_Header_StreamedMatrix_Dimension_Size EBML::CIdentifier(0x001302F7, 0x36D8438A) uinteger +OVTK_NodeId_Header_StreamedMatrix_Dimension_Label EBML::CIdentifier(0x00153E40, 0x190227E0) string +OVTK_NodeId_Buffer_StreamedMatrix EBML::CIdentifier(0x00120663, 0x08FBC165) master +OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer EBML::CIdentifier(0x00B18C10, 0x427D098C) binary(double) + +OVTK_NodeId_Header_Signal EBML::CIdentifier(0x007855DE, 0x3748D375) master +OVTK_NodeId_Header_Signal_Sampling EBML::CIdentifier(0x00141C43, 0x0C37006B) uinteger + +OVTK_NodeId_Header_Spectrum EBML::CIdentifier(0x00CCFA4B, 0x14F37D4D) master +OVTK_NodeId_Header_Spectrum_FrequencyBand_Deprecated EBML::CIdentifier(0x0010983C, 0x21F8BDE5) master +OVTK_NodeId_Header_Spectrum_FrequencyBand_Start_Deprecated EBML::CIdentifier(0x00AA5654, 0x2403A2CB) float +OVTK_NodeId_Header_Spectrum_FrequencyBand_Stop_Deprecated EBML::CIdentifier(0x00A44C82, 0x05BE50D5) float +OVTK_NodeId_Header_Spectrum_FrequencyAbscissa EBML::CIdentifier(0x00D7287D, 0x622A2BF5) float +OVTK_NodeId_Header_Spectrum_Sampling EBML::CIdentifier(0x006876E9, 0x1DCB0CA1) uinteger + +OVTK_NodeId_Buffer_Stimulation EBML::CIdentifier(0x006DEABE, 0x7FC05A20) master +OVTK_NodeId_Buffer_Stimulation_NumberOfStimulations EBML::CIdentifier(0x00BB790B, 0x2B8574D8) uinteger +OVTK_NodeId_Buffer_Stimulation_Stimulation EBML::CIdentifier(0x0016EAC6, 0x29FBCAA1) master +OVTK_NodeId_Buffer_Stimulation_Stimulation_ID EBML::CIdentifier(0x006FA5DB, 0x4BAC31E9) uinteger +OVTK_NodeId_Buffer_Stimulation_Stimulation_Date EBML::CIdentifier(0x00B866D8, 0x14DA5374) uinteger +OVTK_NodeId_Buffer_Stimulation_Stimulation_Duration EBML::CIdentifier(0x14EE055F, 0x87FBCC9C) uinteger +OVTK_NodeId_Header_ChannelUnits EBML::CIdentifier(0x17400C76, 0x16CF14C8) master +OVTK_NodeId_Header_ChannelUnits_Dynamic EBML::CIdentifier(0x7307023C, 0x7F754D2E) uinteger +OVTK_NodeId_Header_ChannelLocalisation EBML::CIdentifier(0xF2CFE60B, 0xEFD63E3B) master +OVTK_NodeId_Header_ChannelLocalisation_Dynamic EBML::CIdentifier(0x5338AF5C, 0x07C469C3) uinteger + +OVTK_NodeId_Header_ExperimentInfo EBML::CIdentifier(0x00746BA0, 0x115AE04D) master +OVTK_NodeId_Header_ExperimentInfo_Experiment EBML::CIdentifier(0x0011D6B7, 0x48F1AA39) master +OVTK_NodeId_Header_ExperimentInfo_Experiment_ID EBML::CIdentifier(0x006ACD74, 0x1C960C26) uinteger +OVTK_NodeId_Header_ExperimentInfo_Experiment_Date EBML::CIdentifier(0x002F8FB7, 0x6DA7552D) uinteger +OVTK_NodeId_Header_ExperimentInfo_Subject EBML::CIdentifier(0x003EC620, 0x333E0A94) master +OVTK_NodeId_Header_ExperimentInfo_Subject_ID EBML::CIdentifier(0x00D62974, 0x473D4AA5) uinteger +OVTK_NodeId_Header_ExperimentInfo_Subject_Name EBML::CIdentifier(0x0041FD0A, 0x6BCD9A99) string +OVTK_NodeId_Header_ExperimentInfo_Subject_Age EBML::CIdentifier(0x00DF7DD9, 0x33336C51) uinteger +OVTK_NodeId_Header_ExperimentInfo_Subject_Gender EBML::CIdentifier(0x0069BB84, 0x3FC8E149) uinteger +OVTK_NodeId_Header_ExperimentInfo_Context EBML::CIdentifier(0x0018C291, 0x7985DFDD) master +OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryID EBML::CIdentifier(0x003F11B9, 0x26D76D9C) uinteger +OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryName EBML::CIdentifier(0x00EB1F23, 0x51C23B83) string +OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianID EBML::CIdentifier(0x00874A7F, 0x60DC34C2) uinteger +OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianName EBML::CIdentifier(0x00C8C393, 0x31CE5B3E) string + +DummyEnd EBML::CIdentifier(0x00000000, 0x00000000) binary diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmEBMLStreamSpy.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmEBMLStreamSpy.cpp new file mode 100644 index 0000000..56f24e9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmEBMLStreamSpy.cpp @@ -0,0 +1,244 @@ +#include "ovpCBoxAlgorithmEBMLStreamSpy.h" + +#include +#include +#include + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Tools { + +bool CBoxAlgorithmEBMLStreamSpy::initialize() +{ + const Kernel::IBox& boxCtx = getStaticBoxContext(); + + m_reader = createReader(*this); + m_helper = EBML::createReaderHelper(); + + bool expand; + const CString fileName = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + const uint64_t logLevel = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + if (boxCtx.getSettingCount() > 2) + { + expand = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + m_nExpandValues = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + } + else + { + expand = false; + m_nExpandValues = 4; + } + + m_logLevel = Kernel::ELogLevel(logLevel); + + std::ifstream file; + FS::Files::openIFStream(file, fileName); + while (file.good() && !file.eof()) + { + uint32_t id1; + uint32_t id2; + std::string identifier1; + std::string identifier2; + std::string name; + std::string type; + + file >> name; + file >> identifier1; + file >> identifier2; + file >> type; + + sscanf(identifier1.c_str(), "EBML::CIdentifier(0x%08x", &id1); + sscanf(identifier2.c_str(), "0x%08x)", &id2); + + if (!expand) + { + if ((type == "binary(long double)") || (type == "binary(double)") || (type == "binary(float)") + || (type == "binary(integer8)") || (type == "binary(integer16)") || (type == "binary(integer32)") + || (type == "binary(integer64)") || (type == "binary(uinteger8)") || (type == "binary(uinteger16)") + || (type == "binary(uinteger32)") || (type == "binary(uinteger64)")) { type = "binary"; } + } + + // std::cout << "[" << identifier1 << "][" << identifier2 << "]" << std::endl; + // printf("[EBML::CIdentifier(0x%08X,][0x%08X]\n", id1, id2); + // std::cout << EBML::CIdentifier(id1, id2) << std::endl; + + m_names[EBML::CIdentifier(id1, id2)] = name; + m_types[EBML::CIdentifier(id1, id2)] = type; + } + + return true; +} + +bool CBoxAlgorithmEBMLStreamSpy::uninitialize() +{ + m_helper->release(); + m_helper = nullptr; + + m_reader->release(); + m_reader = nullptr; + + return true; +} + +bool CBoxAlgorithmEBMLStreamSpy::isMasterChild(const EBML::CIdentifier& identifier) +{ + const auto n = m_names.find(identifier); + const auto t = m_types.find(identifier); + if (n != m_names.end() && t != m_types.end()) { return (t->second == "master"); } + return false; +} + +void CBoxAlgorithmEBMLStreamSpy::openChild(const EBML::CIdentifier& identifier) +{ + const auto n = m_names.find(identifier); + + getLogManager() << m_logLevel; + + for (size_t i = 0; i <= m_nodes.size(); ++i) { getLogManager() << " "; } + + getLogManager() << "Opened EBML node [id:" << identifier << "]-[name:" << (n != m_names.end() ? n->second : "unknown") << "]"; + + if (isMasterChild(identifier)) { getLogManager() << "\n"; } + + m_nodes.push(identifier); +} + +template +void CBoxAlgorithmEBMLStreamSpy::processBinaryBlock(const void* buffer, const size_t size) +{ + const size_t n = (size / sizeof(T)); + const T* buf = static_cast(buffer); + for (size_t i = 0; i < std::min(m_nExpandValues, n); ++i) { getLogManager() << (i == 0 ? "" : " ") << buf[i]; } + if (m_nExpandValues < n) { getLogManager() << " ..."; } +} + +void CBoxAlgorithmEBMLStreamSpy::processChildData(const void* buffer, const size_t size) +{ + const auto t = m_types.find(m_nodes.top()); + + if (t != m_types.end()) + { + if (t->second == "uinteger") { getLogManager() << "-[type:" << t->second << "]-[value:" << m_helper->getUInt(buffer, size) << "]"; } + else if (t->second == "integer") { getLogManager() << "-[type:" << t->second << "]-[value:" << m_helper->getInt(buffer, size) << "]"; } + else if (t->second == "float") { getLogManager() << "-[type:" << t->second << "]-[value:" << m_helper->getDouble(buffer, size) << "]"; } + else if (t->second == "string") { getLogManager() << "-[type:" << t->second << "]-[value:" << m_helper->getStr(buffer, size) << "]"; } + else if (t->second == "binary") { getLogManager() << "-[type:" << t->second << "]-[bytes:" << size << "]"; } + else if (t->second == "binary(double)") + { + getLogManager() << "-[type:" << t->second << "]-[values:"; + processBinaryBlock(buffer, size); + getLogManager() << "]"; + } + else if (t->second == "binary(float)") + { + getLogManager() << "-[type:" << t->second << "]-[values:"; + processBinaryBlock(buffer, size); + getLogManager() << "]"; + } + else if (t->second == "binary(integer8)") + { + getLogManager() << "-[type:" << t->second << "]-[values:"; + processBinaryBlock(buffer, size); + getLogManager() << "]"; + } + else if (t->second == "binary(integer16)") + { + getLogManager() << "-[type:" << t->second << "]-[values:"; + processBinaryBlock(buffer, size); + getLogManager() << "]"; + } + else if (t->second == "binary(integer32)") + { + getLogManager() << "-[type:" << t->second << "]-[values:"; + processBinaryBlock(buffer, size); + getLogManager() << "]"; + } + else if (t->second == "binary(integer64)") + { + getLogManager() << "-[type:" << t->second << "]-[values:"; + processBinaryBlock(buffer, size); + getLogManager() << "]"; + } + else if (t->second == "binary(uinteger8)") + { + getLogManager() << "-[type:" << t->second << "]-[values:"; + processBinaryBlock(buffer, size); + getLogManager() << "]"; + } + else if (t->second == "binary(uinteger16)") + { + getLogManager() << "-[type:" << t->second << "]-[values:"; + processBinaryBlock(buffer, size); + getLogManager() << "]"; + } + else if (t->second == "binary(uinteger32)") + { + getLogManager() << "-[type:" << t->second << "]-[values:"; + processBinaryBlock(buffer, size); + getLogManager() << "]"; + } + else if (t->second == "binary(uinteger64)") + { + getLogManager() << "-[type:" << t->second << "]-[values:"; + processBinaryBlock(buffer, size); + getLogManager() << "]"; + } + else { getLogManager() << "-[type:unknown]-[bytes:" << size << "]"; } + } + getLogManager() << "\n"; +} + +bool CBoxAlgorithmEBMLStreamSpy::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmEBMLStreamSpy::process() +{ + Kernel::IBoxIO& boxCtx = getDynamicBoxContext(); + const Kernel::IBox& staticBoxCtx = getStaticBoxContext(); + + uint64_t tStart = 0; + uint64_t tEnd = 0; + size_t size = 0; + const uint8_t* buffer = nullptr; + + getLogManager() << m_logLevel << "\n"; + + for (size_t i = 0; i < staticBoxCtx.getInputCount(); ++i) + { + if (boxCtx.getInputChunkCount(i)) + { + CString inputName; + staticBoxCtx.getInputName(i, inputName); + + CIdentifier inputType; + staticBoxCtx.getInputType(i, inputType); + + getLogManager() << m_logLevel << "For input " << inputName << " of type " << getTypeManager().getTypeName(inputType) << " :\n"; + + for (size_t j = 0; j < boxCtx.getInputChunkCount(i); ++j) + { + boxCtx.getInputChunk(i, j, tStart, tEnd, size, buffer); + boxCtx.markInputAsDeprecated(i, j); + + getLogManager() << m_logLevel << "For chunk [id:" << j << "] at [time:" << CIdentifier(tStart) << "," << CIdentifier(tEnd) + << " / " << CTime(tStart) << "," << CTime(tEnd) << "]\n"; + + m_reader->processData(buffer, size); + } + } + } + + getLogManager() << m_logLevel << "\n"; + + return true; +} + +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmEBMLStreamSpy.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmEBMLStreamSpy.h new file mode 100644 index 0000000..c35d4c6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmEBMLStreamSpy.h @@ -0,0 +1,106 @@ +#pragma once + +#include "../ovp_defines.h" + +#include +#include +#include + +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Tools { + +class CBoxAlgorithmEBMLStreamSpy final : public Toolkit::TBoxAlgorithm, virtual public EBML::IReaderCallback +{ +public: + + CBoxAlgorithmEBMLStreamSpy() { } + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool isMasterChild(const EBML::CIdentifier& identifier) override; + void openChild(const EBML::CIdentifier& identifier) override; + void processChildData(const void* buffer, const size_t size) override; + void closeChild() override { m_nodes.pop(); } + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_EBMLStreamSpy) + +protected: + + template + void processBinaryBlock(const void* buffer, size_t size); + + std::stack m_nodes; + std::map m_names; + std::map m_types; + size_t m_nExpandValues = 0; + Kernel::ELogLevel m_logLevel = Kernel::ELogLevel::LogLevel_None; + EBML::IReader* m_reader = nullptr; + EBML::IReaderHelper* m_helper = nullptr; +}; + +class CBoxAlgorithmEBMLStreamSpyListener final : public Toolkit::TBoxListener +{ +public: + + bool check(Kernel::IBox& box) const + { + for (size_t i = 0; i < box.getInputCount(); ++i) + { + box.setInputName(i, ("Spied EBML stream " + std::to_string(i + 1)).c_str()); + box.setInputType(i, OV_TypeId_EBMLStream); + } + + return true; + } + + bool onInputRemoved(Kernel::IBox& box, const size_t /*index*/) override { return this->check(box); } + bool onInputAdded(Kernel::IBox& box, const size_t /*index*/) override { return this->check(box); } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmEBMLStreamSpyDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return "EBML stream spy"; } + CString getAuthorName() const override { return "Yann Renard"; } + CString getAuthorCompanyName() const override { return "INRIA/IRISA"; } + CString getShortDescription() const override { return "EBML stream tree viewer"; } + + CString getDetailedDescription() const override { return "This sample EBML stream analyzer prints the EBML tree structure to the console"; } + + CString getCategory() const override { return "Tools"; } + CString getVersion() const override { return "1.0"; } + CString getSoftwareComponent() const override { return "openvibe-sdk"; } + CString getAddedSoftwareVersion() const override { return "0.0.0"; } + CString getUpdatedSoftwareVersion() const override { return "0.0.0"; } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_EBMLStreamSpy; } + IPluginObject* create() override { return new CBoxAlgorithmEBMLStreamSpy(); } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmEBMLStreamSpyListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Spied EBML stream 1", OV_TypeId_EBMLStream); + prototype.addSetting("EBML nodes description", OV_TypeId_Filename, "${Path_Data}/plugins/tools/config-ebml-stream-spy.txt"); + prototype.addSetting("Log level to use", OV_TypeId_LogLevel, "Information"); + prototype.addSetting("Expand binary blocks", OV_TypeId_Boolean, "false"); + prototype.addSetting("Number of values in expanded blocks", OV_TypeId_Integer, "4"); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_EBMLStreamSpyDesc) +}; + +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmExternalProcessing.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmExternalProcessing.cpp new file mode 100644 index 0000000..9cd801c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmExternalProcessing.cpp @@ -0,0 +1,609 @@ +#include "ovpCBoxAlgorithmExternalProcessing.h" + +#include +#include +#include +#include +#include +#include + +#ifdef TARGET_OS_Windows +#include +#include +#include +#else +#include +#include +#include +#include +#include +#include +extern char **environ; +#endif + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Tools { + +static Kernel::ELogLevel convertLogLevel(const Communication::ELogLevel level) +{ + switch (level) + { + case Communication::LogLevel_Info: return Kernel::LogLevel_Info; + case Communication::LogLevel_Warning: return Kernel::LogLevel_Warning; + case Communication::LogLevel_Error: return Kernel::LogLevel_Error; + case Communication::LogLevel_Fatal: return Kernel::LogLevel_Fatal; + case Communication::LogLevel_Max: + case Communication::LogLevel_Unknown: + default: return Kernel::LogLevel_Info; + } +} + +uint64_t CBoxAlgorithmExternalProcessing::getClockFrequency() +{ + if (m_isGenerator) + { + // We slow down the generator type boxes by default, in order to limit syncing + // In fast forward we limit the syncing even more by setting the frequency to 1Hz + if (this->getPlayerContext().getStatus() == Kernel::EPlayerStatus::Forward) { return 1LL << 32; } + return 16LL << 32; + } + return 128LL << 32; +} + +bool CBoxAlgorithmExternalProcessing::initialize() +{ + m_port = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); + + // Check that the port is not in the system range + OV_ERROR_UNLESS_KRF((m_port >= 49152 && m_port <= 65535) || (m_port == 0), + "Port [" << m_port << "] is invalid. It must be either 0 or a number in the range 49152-65535.", Kernel::ErrorType::BadConfig); + + // Settings + const Kernel::IBox& staticboxCtx = this->getStaticBoxContext(); + + for (size_t i = 8; i < staticboxCtx.getSettingCount(); ++i) + { + CString name; + staticboxCtx.getSettingName(i, name); + + CIdentifier type; + staticboxCtx.getSettingType(i, type); + + const CString value = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), i); + + OV_FATAL_UNLESS_K(m_messaging.addParameter(i, type.id(), name.toASCIIString(), value.toASCIIString()), + "Failed to add a parameter: " << i, Kernel::ErrorType::Internal); + } + + // Inputs + for (size_t i = 0; i < staticboxCtx.getInputCount(); ++i) + { + CIdentifier type; + staticboxCtx.getInputType(i, type); + + if (type == OV_TypeId_Stimulations) { m_decoders[i].initialize(*this, i); } + + CString name; + staticboxCtx.getInputName(i, name); + + OV_FATAL_UNLESS_K(m_messaging.addInput(i, type.id(), name.toASCIIString()), + "Failed to add an input: " << i, Kernel::ErrorType::Internal); + } + + // Outputs + for (size_t i = 0; i < staticboxCtx.getOutputCount(); ++i) + { + CIdentifier type; + staticboxCtx.getOutputType(i, type); + + CString name; + staticboxCtx.getOutputName(i, name); + + if (!m_messaging.addOutput(i, type.id(), name.toASCIIString())) + { + this->getLogManager() << Kernel::LogLevel_Error << "Failed to add an output: " << i << "\n"; + return false; + } + } + + const bool mustGenerateConnectionID = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 4); + + if (mustGenerateConnectionID) { m_connectionID = generateConnectionID(32); } + else + { + const CString connectionID = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 5); + m_connectionID = connectionID.toASCIIString(); + } + + OV_ERROR_UNLESS_KRF(m_messaging.listen(m_port), + "Could not listen to TCP port: " << m_port << ". This port may be already used by another service. Please try another one.", + Kernel::ErrorType::BadNetworkConnection); + + if (m_port == 0) + { + m_messaging.getSocketPort(m_port); + this->getLogManager() << Kernel::LogLevel_Info << "Box is now listening on TCP port [" << m_port << "].\n"; + } + + m_shouldLaunchProgram = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + + if (m_shouldLaunchProgram) + { + const CString programPath = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + const CString arguments = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); + + if (!launchThirdPartyProgram(programPath.toASCIIString(), arguments.toASCIIString())) + { + // Error message in the function + return false; + } + + this->getLogManager() << Kernel::LogLevel_Info << "Third party program [" << programPath.toASCIIString() << "] started.\n"; + } + + const auto startTime = System::Time::zgetTime(); + + bool clientConnected = false; + m_hasReceivedEndMessage = false; + + m_acceptTimeout = CTime(double(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 6))).time(); + m_isGenerator = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 7); + + while (System::Time::zgetTime() - startTime < m_acceptTimeout) + { + if (m_messaging.accept()) + { + clientConnected = true; + this->getLogManager() << Kernel::LogLevel_Info << "Client connected to the server.\n"; + break; + } + + const Communication::MessagingServer::ELibraryError error = m_messaging.getLastError(); + if (error == Communication::MessagingServer::ELibraryError::BadAuthenticationReceived) + { + OV_WARNING_K("A client sent a bad authentication."); + break; + } + if (error == Communication::MessagingServer::ELibraryError::NoAuthenticationReceived) { OV_WARNING_K("The client has not sent authentication."); } + } + + OV_ERROR_UNLESS_KRF(clientConnected, "No client connected before the timeout.", Kernel::ErrorType::Internal); + + + // Now synchronize once with the client so it can perform its initialize before + // the processing starts + m_messaging.pushSync(); + + + while (m_messaging.isConnected() && !m_messaging.waitForSyncMessage()) + { + if (!m_messaging.waitForSyncMessage()) { std::this_thread::sleep_for(std::chrono::milliseconds(1)); } + } + + m_syncTimeout = CTime(0.0625).time(); + m_lastSyncTime = System::Time::zgetTime(); + return true; +} + +bool CBoxAlgorithmExternalProcessing::uninitialize() +{ + for (auto& decoder : m_decoders) { decoder.second.uninitialize(); } + + if (!m_hasReceivedEndMessage) + { + const bool result = m_messaging.close(); + +#ifdef TARGET_OS_Windows + if (m_shouldLaunchProgram && m_extProcessId > 0) + { + DWORD exitCode; + + // Wait for external process to stop by himself, terminate it if necessary + const auto startTime = System::Time::zgetTime(); + while (System::Time::zgetTime() - startTime < m_acceptTimeout) + { + GetExitCodeProcess(HANDLE(m_extProcessId), &exitCode); + + if (exitCode != STILL_ACTIVE) { break; } + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } + + + if (exitCode == STILL_ACTIVE) + { + OV_ERROR_UNLESS_KRF(TerminateProcess(HANDLE(m_extProcessId), EXIT_FAILURE), "Failed to kill third party program.", + Kernel::ErrorType::Unknown); + } + else if (exitCode != 0) { OV_WARNING_K("Third party program [" << m_extProcessId << "] has terminated with exit code [" << int(exitCode) << "]"); } + } +#else + if (m_shouldLaunchProgram && m_extProcessId != 0) + { + int status; + pid_t pid = waitpid(m_extProcessId, &status, WNOHANG); + + // Wait for external process to stop by himself, terminate it after 10s + auto startTime = System::Time::zgetTime(); + while (pid == 0 && System::Time::zgetTime() - startTime < m_acceptTimeout) + { + // Check if the program has hung itself + pid = waitpid(m_extProcessId, &status, WNOHANG); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } + + if (pid != 0) + { + if (WIFEXITED(status)) { OV_WARNING_K("Third party program [" << m_extProcessId << "] has terminated with exit code [" << WEXITSTATUS(status) << "]"); } + else if (WIFSIGNALED(status)) { OV_WARNING_K("Third party program [" << m_extProcessId << "] killed by signal [" << WTERMSIG(status) << "]"); } + } + else + { + kill(m_extProcessId, SIGTERM); + waitpid(m_extProcessId, &status, 0); + this->getLogManager() << Kernel::LogLevel_Info << "Third party program [" << m_extProcessId << "] exited with status [" << WEXITSTATUS(status) << "]\n"; + } + } +#endif + return result; + } + + return true; +} + +bool CBoxAlgorithmExternalProcessing::processClock(Kernel::CMessageClock& /*msg*/) { return this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); } + +bool CBoxAlgorithmExternalProcessing::processInput(const size_t /*index*/) +{ + this->getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmExternalProcessing::process() +{ + if (m_messaging.isInErrorState()) + { + const std::string errorString = Communication::MessagingServer::getErrorString(m_messaging.getLastError()); + OV_ERROR_KRF("Error state connection: " << errorString << ".\n This may be due to a broken client connection.", + Kernel::ErrorType::BadNetworkConnection); + } + + if (m_hasReceivedEndMessage == false && m_messaging.isEndReceived() == true) + { + this->getLogManager() << Kernel::LogLevel_Info << "The third party program has ended the communication.\n"; + m_messaging.close(); + m_hasReceivedEndMessage = true; + } + + OV_ERROR_UNLESS_KRF(m_messaging.pushTime(this->getPlayerContext().getCurrentTime()), "Failed to push Time.", Kernel::ErrorType::BadNetworkConnection); + + const Kernel::IBox& staticboxCtx = this->getStaticBoxContext(); + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + + // Send input EBML to the client + + bool hasSentDataToClient = false; + + for (size_t i = 0; i < staticboxCtx.getInputCount(); ++i) + { + auto maybeStimulationDecoder = m_decoders.find(i); + for (size_t j = 0; j < boxCtx.getInputChunkCount(i); ++j) + { + if (!m_hasReceivedEndMessage) + { + uint64_t startTime = 0; + uint64_t endTime = 0; + size_t chunkSize = 0; + const uint8_t* chunkBuffer = nullptr; + + OV_FATAL_UNLESS_K(boxCtx.getInputChunk(i, j, startTime, endTime, chunkSize, chunkBuffer), + "Failed to get input chunk [" << i << "][" << j << "]", Kernel::ErrorType::Internal); + + std::shared_ptr> ebml(new std::vector(chunkBuffer, chunkBuffer + chunkSize)); + + // We only encode stimulation stream chunks if they contain stimulations + if (maybeStimulationDecoder != m_decoders.end()) + { + maybeStimulationDecoder->second.decode(j, false); // The input will be marked as deprecated later + + // Cache empty chunks, we will send them when a stimulation or a signal chunk arrives + if (maybeStimulationDecoder->second.getOutputStimulationSet()->getStimulationCount() == 0) + { + m_packetHistory.emplace(startTime, endTime, i, ebml); + OV_FATAL_UNLESS_K(boxCtx.markInputAsDeprecated(i, j), "Failed to mark input as deprecated", Kernel::ErrorType::Internal); + break; + } + } + + // Empty the history before to send useful data + while (!m_packetHistory.empty()) + { + OV_ERROR_UNLESS_KRF(m_messaging.pushEBML(m_packetHistory.front().index, m_packetHistory.front().startTime, m_packetHistory.front().endTime, + m_packetHistory.front().EBML), "Failed to push EBML.", Kernel::ErrorType::BadNetworkConnection); + + m_packetHistory.pop(); + } + + // Push the last EBML + OV_ERROR_UNLESS_KRF(m_messaging.pushEBML(i, startTime, endTime, ebml), "Failed to push EBML.", Kernel::ErrorType::BadNetworkConnection); + hasSentDataToClient = true; + } + + OV_FATAL_UNLESS_K(boxCtx.markInputAsDeprecated(i, j), "Failed to mark input as deprecated", Kernel::ErrorType::Internal); + } + } + + if (hasSentDataToClient || m_isGenerator || System::Time::zgetTime() - m_lastSyncTime > m_syncTimeout) + { + m_lastSyncTime = System::Time::zgetTime(); + // Here, we send a sync message to tell to the client that we have no more data to send. + // Generators do not have input data, so the box never has to send data to the external program + // and thus needs to perform syncing on each tick. + + OV_ERROR_UNLESS_KRF(m_messaging.pushSync(), "Failed to push sync message.", Kernel::ErrorType::BadNetworkConnection); + + if (!m_hasReceivedEndMessage) + { + this->log(); + + uint64_t packetId; + size_t index; + uint64_t startTime; + uint64_t endTime; + std::shared_ptr> ebml; + + bool receivedSync = false; + while (!receivedSync && !m_hasReceivedEndMessage && !m_messaging.isInErrorState() && m_messaging.isConnected()) + { + receivedSync = m_messaging.waitForSyncMessage(); + while (m_messaging.popEBML(packetId, index, startTime, endTime, ebml)) + { + OV_ERROR_UNLESS_KRF(boxCtx.appendOutputChunkData(index, ebml->data(), ebml->size()), + "Failed to append output chunk data.", Kernel::ErrorType::Internal); + + OV_ERROR_UNLESS_KRF(boxCtx.markOutputAsReadyToSend(index, startTime, endTime), + "Failed to mark output as ready to send.", Kernel::ErrorType::Internal); + } + if (!receivedSync) { std::this_thread::sleep_for(std::chrono::milliseconds(1)); } + } + } + } + + return true; +} + +std::string CBoxAlgorithmExternalProcessing::generateConnectionID(const size_t size) +{ + std::default_random_engine generator{ std::random_device()() }; + std::uniform_int_distribution uni(0, 34); + + std::string connectionID; + + for (size_t i = 0; i < size; ++i) + { + const char c = char(uni(generator)); + connectionID.push_back((c < 26) ? ('A' + c) : '1' + (c - 26)); + } + + return connectionID; +} + +static std::vector splitCommandLine(const std::string& cmdLine) +{ + std::vector list; + std::string arg; + bool escape = false; + enum { Idle, Arg, QuotedArg } state = Idle; + + for (const char c : cmdLine) + { + if (!escape && c == '\\') + { + escape = true; + continue; + } + + switch (state) + { + case Idle: + if (!escape && c == '"') + { + state = QuotedArg; +#if defined TARGET_OS_Windows + arg += c; +#endif + } + else if (escape || c != ' ') + { + arg += c; + state = Arg; + } + break; + + case Arg: + if (!escape && c == '"') + { + state = QuotedArg; +#if defined TARGET_OS_Windows + arg += c; +#endif + } + else if (escape || c != ' ') { arg += c; } + else + { + list.push_back(arg); + arg.clear(); + state = Idle; + } + break; + + case QuotedArg: + if (!escape && c == '"') + { + state = arg.empty() ? Idle : Arg; +#if defined TARGET_OS_Windows + arg += c; +#endif + } + else { arg += c; } + break; + } + + escape = false; + } + + if (!arg.empty()) { list.push_back(arg); } + + return list; +} + +char* strToChar(const std::string& s) +{ + char* c = new char[s.size() + 1]; + std::copy(s.begin(), s.end(), c); + return c; +} + +bool CBoxAlgorithmExternalProcessing::launchThirdPartyProgram(const std::string& programPath, const std::string& arguments) +{ + m_extProcessId = 0; + + const std::vector argumentsVector = splitCommandLine(arguments); + + std::vector programArguments = { programPath, "--connection-id", m_connectionID, "--port", std::to_string(m_port) }; + programArguments.insert(programArguments.begin() + 1, argumentsVector.cbegin(), argumentsVector.cend()); // Add the arguments after the program path. + std::vector argv; + + std::transform(programArguments.begin(), programArguments.end(), std::back_inserter(argv), strToChar); + + argv.push_back(nullptr); + +#ifdef TARGET_OS_Windows + // _spawnp on Windows has a special case for empty program + int status; + if (programPath.empty()) + { + status = -1; + _set_errno(ENOENT); + } + else { status = int(_spawnvp(_P_NOWAIT, programPath.c_str(), argv.data())); } + m_extProcessId = status; + // _P_DETACH, +#else + posix_spawn_file_actions_t fileAction; + int res = posix_spawn_file_actions_init(&fileAction); + OV_ERROR_UNLESS_KRF(res==0, "File action could not be initialized. Got error [" << res << "]", Kernel::ErrorType::BadCall); + res = posix_spawn_file_actions_addclose(&fileAction, STDOUT_FILENO); + OV_ERROR_UNLESS_KRF(res==0, "File action 'close' could not be added. Got error [" << res << "]", Kernel::ErrorType::BadCall); + + this->getLogManager() << Kernel::LogLevel_Info << "Run third party program [" << programPath << "] with arguments [" << arguments << "].\n"; + int status = posix_spawnp(&m_extProcessId, programPath.c_str(), &fileAction, nullptr, argv.data(), environ); + +#ifdef TARGET_OS_Linux + // On linux the glibc is bugged and posix_spawnp does not actually work as specified + // we have to check if the program did not exit immediately with a 127 error code + // for this we need to wait a bit because it could be that the process has not yet launched + + // wait until the process exists or if it has failed + + bool processExists = false; + bool processHasFailed = false; + while (!processExists && !processHasFailed) + { + System::Time::sleep(10); + processExists = (kill(m_extProcessId, 0) == 0); + + int childStatus; + pid_t pid = waitpid(m_extProcessId, &childStatus, WNOHANG); + + if (pid != 0) + { + // The process is dead + if (WIFEXITED(childStatus)) + { + // If the exit status is 0 this means that maybe we will actually succeed in launching the program + if (WEXITSTATUS(childStatus) != 0) + { + m_extProcessId = 0; + status = WEXITSTATUS(childStatus); + } + } + else + { + OV_WARNING_K("The third party process died"); + m_extProcessId = 0; + status = 1; + } + processHasFailed = true; + } + } + +#endif + +#endif + + for (size_t i = 0; i < argv.size() - 1; ++i) { delete[] argv[i]; } + +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS + if (status != 0) + { + const std::string errorMessage = "Failed to launch the program [" + programPath + "]: "; + m_extProcessId = 0; + OV_ERROR_KRF( errorMessage.c_str() << "[" << status << "]", Kernel::ErrorType::BadResourceCreation); + } +#else + if (status == -1) + { + std::string errorMessage = "Failed to launch the program [" + programPath + "]:"; + + switch (errno) + { + case E2BIG: + errorMessage += "Argument list exceeds 1024 bytes.\n"; + break; + + case EINVAL: + errorMessage += "Mode argument is invalid.\n"; + break; + + case ENOENT: + errorMessage += "File or path is not found.\n"; + break; + + case ENOEXEC: + errorMessage += "Specified file is not executable or has invalid executable-file format.\n"; + break; + + case ENOMEM: + errorMessage += "Not enough memory is available to execute the new process.\n"; + break; + + default: + errorMessage += "Unknown error.\n"; + break; + } + + OV_ERROR_KRF(errorMessage.c_str(), Kernel::ErrorType::BadResourceCreation); + } +#endif + + return true; +} + +void CBoxAlgorithmExternalProcessing::log() +{ + Communication::ELogLevel logLevel; + std::string logMessage; + uint64_t packetId; + + while (m_messaging.popLog(packetId, logLevel, logMessage)) + { + this->getLogManager() << convertLogLevel(logLevel) << "From third party program: " << logMessage << "\n"; + } +} + +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmExternalProcessing.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmExternalProcessing.h new file mode 100644 index 0000000..c5cf5fc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmExternalProcessing.h @@ -0,0 +1,143 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +#include + +#include +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Tools { +class CBoxAlgorithmExternalProcessing final : public Toolkit::TBoxAlgorithm +{ +public: + CBoxAlgorithmExternalProcessing() : m_acceptTimeout(10ULL << 32) {} + void release() override { delete this; } + uint64_t getClockFrequency() override; + bool initialize() override; + bool uninitialize() override; + bool processClock(Kernel::CMessageClock& msg) override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_ExternalProcessing) + +private: + + struct SPacket + { + uint64_t startTime; + uint64_t endTime; + size_t index; + std::shared_ptr> EBML; + + SPacket(const uint64_t startTime, const uint64_t endTime, const size_t index, const std::shared_ptr>& ebml) + : startTime(startTime), endTime(endTime), index(index), EBML(ebml) { } + }; + + /** + * \brief generate a connection identifier. + * + * \param size Size of the connection identifier. + * + * \return A string composed of size characters in the A-Z,0-9 range + */ + static std::string generateConnectionID(const size_t size); + + /** + * \brief Launch a third party program + * + * \param programPath Executable path + * \param arguments Arguments to pass to the program + * + * \retval true + * \retval false + */ + bool launchThirdPartyProgram(const std::string& programPath, const std::string& arguments); + + /** + * \brief Log in NeuroRT log from third party program + */ + void log(); + + Communication::MessagingServer m_messaging; + size_t m_port = 0; + std::string m_connectionID; + std::string m_programPath; + bool m_isGenerator = false; + + int m_extProcessId = 0; + + uint64_t m_acceptTimeout = 0; + bool m_shouldLaunchProgram = false; + bool m_hasReceivedEndMessage = false; + // Synchronization timeout, and save time of last synchronization + uint64_t m_syncTimeout = 0; + uint64_t m_lastSyncTime = 0; + + std::map> m_decoders; + std::queue m_packetHistory; +}; + +class CBoxAlgorithmExternalProcessingListener final : public Toolkit::TBoxListener +{ +public: + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmExternalProcessingDesc final : public IBoxAlgorithmDesc +{ +public: + void release() override {} + CString getName() const override { return "External Processing"; } + CString getAuthorName() const override { return "Alexis Placet"; } + CString getAuthorCompanyName() const override { return "Mensia Technologies SA"; } + CString getShortDescription() const override { return "This box can communicate via TCP with an other program."; } + + CString getDetailedDescription() const override + { + return "Launches an external program which can then processes data. This box and the program communicate using TCP connection and a defined protocol."; + } + + CString getCategory() const override { return "Scripting"; } + CString getVersion() const override { return "1.0"; } + CString getSoftwareComponent() const override { return "openvibe-sdk"; } + CString getAddedSoftwareVersion() const override { return "1.0.0"; } + CString getUpdatedSoftwareVersion() const override { return "1.0.0"; } + CString getStockItemName() const override { return "gtk-edit"; } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_ExternalProcessing; } + IPluginObject* create() override { return new CBoxAlgorithmExternalProcessing; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmExternalProcessingListener; } + void releaseBoxListener(IBoxListener* boxListener) const override { delete boxListener; } + + bool getBoxPrototype(Kernel::IBoxProto& boxAlgorithmPrototype) const override + { + boxAlgorithmPrototype.addSetting("Launch third party program", OV_TypeId_Boolean, "true"); // 0 + boxAlgorithmPrototype.addSetting("Executable path", OV_TypeId_Filename, ""); // 1 + boxAlgorithmPrototype.addSetting("Arguments", OV_TypeId_String, ""); // 2 + boxAlgorithmPrototype.addSetting("Port", OV_TypeId_Integer, "0"); // 3 + boxAlgorithmPrototype.addSetting("Automatic connection identifier", OV_TypeId_Boolean, "true"); // 4 + boxAlgorithmPrototype.addSetting("Custom connection identifier", OV_TypeId_String, ""); // 5 + boxAlgorithmPrototype.addSetting("Incoming connection timeout", OV_TypeId_Integer, "10"); // 6 + boxAlgorithmPrototype.addSetting("Generator", OV_TypeId_Boolean, "false"); // 7 + + boxAlgorithmPrototype.addFlag(Kernel::BoxFlag_CanAddInput); + boxAlgorithmPrototype.addFlag(Kernel::BoxFlag_CanModifyInput); + boxAlgorithmPrototype.addFlag(Kernel::BoxFlag_CanAddOutput); + boxAlgorithmPrototype.addFlag(Kernel::BoxFlag_CanModifyOutput); + boxAlgorithmPrototype.addFlag(Kernel::BoxFlag_CanAddSetting); + boxAlgorithmPrototype.addFlag(Kernel::BoxFlag_CanModifySetting); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_ExternalProcessingDesc) +}; +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmMatrixValidityChecker.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmMatrixValidityChecker.cpp new file mode 100644 index 0000000..47f42cd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmMatrixValidityChecker.cpp @@ -0,0 +1,171 @@ +#include "ovpCBoxAlgorithmMatrixValidityChecker.h" + +#include + +namespace OpenViBE { +namespace Plugins { +namespace Tools { + +bool CBoxAlgorithmMatrixValidityChecker::initialize() +{ + const Kernel::IBox& boxCtx = this->getStaticBoxContext(); + + uint64_t logLevel = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_logLevel = Kernel::ELogLevel(logLevel); + m_validityCheckerType = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + if (boxCtx.getSettingCount() == 1 + ) { m_validityCheckerType = OVP_TypeId_ValidityCheckerType_LogWarning.id(); } // note that for boxes with one setting, we fallback to the old behavior + + OV_ERROR_UNLESS_KRF(boxCtx.getSettingCount() <= 1 || boxCtx.getInputCount() == boxCtx.getOutputCount(), + "Invalid input count [" << boxCtx.getInputCount() << "] (expected same value as output count [" << boxCtx.getOutputCount() << + "])", + Kernel::ErrorType::BadConfig); + + m_decoders.resize(boxCtx.getInputCount()); + m_encoders.resize(boxCtx.getInputCount()); + for (size_t i = 0; i < boxCtx.getInputCount(); ++i) + { + m_decoders[i].initialize(*this, i); + m_encoders[i].initialize(*this, i); + m_encoders[i].getInputMatrix().setReferenceTarget(m_decoders[i].getOutputMatrix()); + } + + m_lastValidSamples.clear(); + m_lastValidSamples.resize(boxCtx.getInputCount()); + m_nTotalInterpolatedSample.clear(); + m_nTotalInterpolatedSample.resize(boxCtx.getInputCount()); + m_nTotalInterpolatedChunk.clear(); + m_nTotalInterpolatedChunk.resize(boxCtx.getInputCount()); + + return true; +} + +bool CBoxAlgorithmMatrixValidityChecker::uninitialize() +{ + const size_t nInput = this->getStaticBoxContext().getInputCount(); + for (size_t i = 0; i < nInput; ++i) + { + m_decoders[i].uninitialize(); + m_encoders[i].uninitialize(); + } + m_decoders.clear(); + m_encoders.clear(); + + return true; +} + +bool CBoxAlgorithmMatrixValidityChecker::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmMatrixValidityChecker::process() +{ + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + const size_t nSetting = this->getStaticBoxContext().getSettingCount(); + + for (size_t i = 0; i < nInput; ++i) + { + for (size_t j = 0; j < boxCtx.getInputChunkCount(i); ++j) + { + m_decoders[i].decode(j); + CMatrix* matrix = m_decoders[i].getOutputMatrix(); + + if (m_decoders[i].isHeaderReceived()) + { + if (nSetting > 1) { m_encoders[i].encodeHeader(); } + + if (m_validityCheckerType == OVP_TypeId_ValidityCheckerType_Interpolate.id()) + { + m_nTotalInterpolatedSample[i] = 0; + m_nTotalInterpolatedChunk[i] = 0; + // for each channel, save of the last valid sample + m_lastValidSamples[i].resize(matrix->getDimensionSize(0)); + } + } + if (m_decoders[i].isBufferReceived()) + { + // log warning + if (m_validityCheckerType == OVP_TypeId_ValidityCheckerType_LogWarning.id()) + { + if (!matrix->isBufferValid()) + { + getLogManager() << m_logLevel << "Matrix on input " << i << " either contains NAN or Infinity between " << + CTime(boxCtx.getInputChunkStartTime(i, j)) << " and " << CTime(boxCtx.getInputChunkEndTime(i, j)) << ".\n"; + } + } + // stop player + else if (m_validityCheckerType == OVP_TypeId_ValidityCheckerType_StopPlayer.id()) + { + if (!matrix->isBufferValid()) + { + this->getPlayerContext().stop(); + OV_ERROR_KRF( + "Invalid matrix content on input [" << i << "]: either contains NAN or Infinity between [" << CTime(boxCtx. + getInputChunkStartTime(i, j)) << "] and [" << CTime(boxCtx.getInputChunkEndTime(i, j)) << "]", + Kernel::ErrorType::BadInput); + } + } + // interpolate + else if (m_validityCheckerType == OVP_TypeId_ValidityCheckerType_Interpolate.id()) + { + const size_t nChannel = matrix->getDimensionSize(0); + const size_t nSample = matrix->getDimensionSize(1); + double* buffer = matrix->getBuffer(); + size_t nInterpolatedSample = 0; + + for (size_t k = 0; k < nChannel; ++k) + { + for (size_t l = 0; l < nSample; ++l) + { + if (std::isnan(buffer[l + k * nSample]) || std::isinf(buffer[l + k * nSample])) + { + // interpolation : order 0 (easiest for online interpolation) + buffer[l + k * nSample] = m_lastValidSamples[i][k]; + nInterpolatedSample++; + } + else + { + // save of the last valid sample of channel k + m_lastValidSamples[i][k] = buffer[l + k * nSample]; + } + } + } + m_nTotalInterpolatedSample[i] += nInterpolatedSample; + + // log management + if (nInterpolatedSample > 0 && m_nTotalInterpolatedSample[i] == nInterpolatedSample) // beginning of interpolation + { + getLogManager() << m_logLevel << "Matrix on input " << i << " either contains NAN or Infinity from " << CTime( + boxCtx.getInputChunkStartTime(i, j)) << ": interpolation is enable.\n"; + } + if (nInterpolatedSample > 0) // update of ChunkCount during interpolation + { + m_nTotalInterpolatedChunk[i]++; + } + if (nInterpolatedSample == 0 && m_nTotalInterpolatedSample[i] > 0) // end of interpolation + { + getLogManager() << m_logLevel << "Matrix on input " << i << " contained " << 100.0 * m_nTotalInterpolatedSample[i] / ( + m_nTotalInterpolatedChunk[i] * nSample * nChannel) << " % of NAN or Infinity. Interpolation disable from " << CTime( + boxCtx.getInputChunkStartTime(i, j)) << ".\n"; + m_nTotalInterpolatedSample[i] = 0; // reset + m_nTotalInterpolatedChunk[i] = 0; + } + } + else { OV_WARNING_K("Invalid action type [" << m_validityCheckerType << "]"); } + + if (nSetting > 1) { m_encoders[i].encodeBuffer(); } + } + if (m_decoders[i].isEndReceived()) { if (nSetting > 1) { m_encoders[i].encodeEnd(); } } + if (nSetting > 1) { boxCtx.markOutputAsReadyToSend(i, boxCtx.getInputChunkStartTime(i, j), boxCtx.getInputChunkEndTime(i, j)); } + } + } + + return true; +} + +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmMatrixValidityChecker.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmMatrixValidityChecker.h new file mode 100644 index 0000000..4df01d6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmMatrixValidityChecker.h @@ -0,0 +1,128 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Tools { +class CBoxAlgorithmMatrixValidityChecker final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_MatrixValidityChecker) + +protected: + + std::vector> m_decoders; + std::vector> m_encoders; + Kernel::ELogLevel m_logLevel = Kernel::ELogLevel::LogLevel_None; + uint64_t m_validityCheckerType = 0; + + std::vector m_nTotalInterpolatedSample; + std::vector m_nTotalInterpolatedChunk; + std::vector> m_lastValidSamples; +}; + +class CBoxAlgorithmMatrixValidityCheckerListener final : public Toolkit::TBoxListener +{ +public: + + bool check(Kernel::IBox& box) const + { + for (size_t i = 0; i < box.getInputCount(); ++i) + { + box.setInputName(i, ("Stream " + std::to_string(i + 1)).c_str()); + box.setInputType(i, OV_TypeId_StreamedMatrix); + } + for (size_t i = 0; i < box.getOutputCount(); ++i) + { + box.setOutputName(i, ("Output stream " + std::to_string(i + 1)).c_str()); + box.setInputType(i, OV_TypeId_StreamedMatrix); + } + + return true; + } + + bool onInputAdded(Kernel::IBox& box, const size_t index) override + { + box.setInputType(index, OV_TypeId_StreamedMatrix); + if (box.getSettingCount() > 1) { box.addOutput("", OV_TypeId_StreamedMatrix); } + this->check(box); + return true; + } + + bool onInputRemoved(Kernel::IBox& box, const size_t index) override + { + box.removeOutput(index); + this->check(box); + return true; + } + + bool onOutputAdded(Kernel::IBox& box, const size_t index) override + { + box.setOutputType(index, OV_TypeId_StreamedMatrix); + box.addInput("", OV_TypeId_StreamedMatrix); + this->check(box); + return true; + } + + bool onOutputRemoved(Kernel::IBox& box, const size_t index) override + { + box.removeInput(index); + this->check(box); + return true; + } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmMatrixValidityCheckerDesc final : virtual public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return "Matrix validity checker"; } + CString getAuthorName() const override { return "Yann Renard"; } + CString getAuthorCompanyName() const override { return "INRIA/IRISA"; } + + CString getShortDescription() const override { return "Checks if a matrix contains \"not a number\" or \"infinity\" elements"; } + + CString getDetailedDescription() const override + { + return + "This box is for debugging purposes and allows an author to check the validity of a streamed matrix and derived stream. This box can log a message, stop the player or interpolate data."; + } + + CString getCategory() const override { return "Tools"; } + CString getVersion() const override { return "1.0"; } + CString getSoftwareComponent() const override { return "openvibe-sdk"; } + CString getAddedSoftwareVersion() const override { return "0.0.0"; } + CString getUpdatedSoftwareVersion() const override { return "0.0.0"; } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_MatrixValidityChecker; } + IPluginObject* create() override { return new CBoxAlgorithmMatrixValidityChecker; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmMatrixValidityCheckerListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Stream 1", OV_TypeId_StreamedMatrix); + prototype.addOutput("Output stream 1", OV_TypeId_StreamedMatrix); + prototype.addSetting("Log level", OV_TypeId_LogLevel, "Warning"); + prototype.addSetting("Action to do", OVP_TypeId_ValidityCheckerType, OVP_TypeId_ValidityCheckerType_LogWarning.toString()); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + prototype.addFlag(Kernel::BoxFlag_CanAddOutput); + + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_MatrixValidityCheckerDesc) +}; +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmStimulationListener.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmStimulationListener.cpp new file mode 100644 index 0000000..c60a44b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmStimulationListener.cpp @@ -0,0 +1,80 @@ +#include "ovpCBoxAlgorithmStimulationListener.h" + +namespace OpenViBE { +namespace Plugins { +namespace Tools { + +bool CBoxAlgorithmStimulationListener::initialize() +{ + const size_t nInput = this->getStaticBoxContext().getInputCount(); + for (size_t i = 0; i < nInput; ++i) { m_stimulationDecoders.push_back(new Toolkit::TStimulationDecoder(*this, i)); } + + m_logLevel = Kernel::ELogLevel(uint64_t(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0))); + + return true; +} + +bool CBoxAlgorithmStimulationListener::uninitialize() +{ + const size_t nInput = this->getStaticBoxContext().getInputCount(); + for (size_t i = 0; i < nInput; ++i) + { + m_stimulationDecoders[i]->uninitialize(); + delete m_stimulationDecoders[i]; + } + m_stimulationDecoders.clear(); + + return true; +} + +bool CBoxAlgorithmStimulationListener::processInput(const size_t /*index*/) +{ + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; +} + +bool CBoxAlgorithmStimulationListener::process() +{ + const Kernel::IBox& staticboxCtx = this->getStaticBoxContext(); + Kernel::IBoxIO& boxCtx = this->getDynamicBoxContext(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + for (size_t i = 0; i < nInput; ++i) + { + for (size_t j = 0; j < boxCtx.getInputChunkCount(i); ++j) + { + m_stimulationDecoders[i]->decode(j); + if (m_stimulationDecoders[i]->isHeaderReceived()) { } + if (m_stimulationDecoders[i]->isBufferReceived()) + { + const IStimulationSet* stimSet = m_stimulationDecoders[i]->getOutputStimulationSet(); + + CString inputName; + staticboxCtx.getInputName(i, inputName); + for (size_t k = 0; k < stimSet->getStimulationCount(); ++k) + { + this->getLogManager() << m_logLevel + << "For input " << i << " with name " << inputName + << " got stimulation " << stimSet->getStimulationIdentifier(k) + << "[" << getTypeManager().getEnumerationEntryNameFromValue(OV_TypeId_Stimulation, stimSet->getStimulationIdentifier(k)) << "]" + << " at date " << CTime(stimSet->getStimulationDate(k)) + << " and duration " << CTime(stimSet->getStimulationDuration(k)) << "\n"; + + OV_WARNING_UNLESS_K( + stimSet->getStimulationDate(k) >= boxCtx.getInputChunkStartTime(i, j) + && stimSet->getStimulationDate(k) <= boxCtx.getInputChunkEndTime(i, j), + "Invalid out of range date [" << CTime(stimSet->getStimulationDate(k)) << "] (expected value between [" + << CTime(boxCtx.getInputChunkStartTime(i, j)) << "] and [" << CTime(boxCtx.getInputChunkEndTime(i, j)) << "])"); + } + } + if (m_stimulationDecoders[i]->isEndReceived()) { } + boxCtx.markInputAsDeprecated(i, j); + } + } + + return true; +} + +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmStimulationListener.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmStimulationListener.h new file mode 100644 index 0000000..765cded --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/box-algorithms/ovpCBoxAlgorithmStimulationListener.h @@ -0,0 +1,84 @@ +#pragma once + +#include "../ovp_defines.h" +#include +#include +#include + +namespace OpenViBE { +namespace Plugins { +namespace Tools { + +class CBoxAlgorithmStimulationListener final : virtual public Toolkit::TBoxAlgorithm +{ +public: + void release() override { delete this; } + bool initialize() override; + bool uninitialize() override; + bool processInput(const size_t index) override; + bool process() override; + + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_StimulationListener) + +protected: + + Kernel::ELogLevel m_logLevel = Kernel::LogLevel_None; + std::vector*> m_stimulationDecoders; +}; + +class CBoxAlgorithmStimulationListenerListener final : public Toolkit::TBoxListener +{ +public: + + bool check(Kernel::IBox& box) const + { + for (size_t i = 0; i < box.getInputCount(); ++i) + { + box.setInputName(i, ("Stimulation stream " + std::to_string(i + 1)).c_str()); + box.setInputType(i, OV_TypeId_Stimulations); + } + + return true; + } + + bool onInputRemoved(Kernel::IBox& box, const size_t /*index*/) override { return this->check(box); } + bool onInputAdded(Kernel::IBox& box, const size_t /*index*/) override { return this->check(box); } + + _IsDerivedFromClass_Final_(Toolkit::TBoxListener, CIdentifier::undefined()) +}; + +class CBoxAlgorithmStimulationListenerDesc final : virtual public IBoxAlgorithmDesc +{ +public: + void release() override { } + CString getName() const override { return "Stimulation listener"; } + CString getAuthorName() const override { return "Yann Renard"; } + CString getAuthorCompanyName() const override { return "INRIA/IRISA"; } + CString getShortDescription() const override { return "Prints stimulation codes in the log manager"; } + + CString getDetailedDescription() const override { return "Prints each received stimulationto the log using the log level specified in the box config."; } + + CString getCategory() const override { return "Tools"; } + CString getVersion() const override { return "1.0"; } + CString getSoftwareComponent() const override { return "openvibe-sdk"; } + CString getAddedSoftwareVersion() const override { return "0.0.0"; } + CString getUpdatedSoftwareVersion() const override { return "0.0.0"; } + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_StimulationListener; } + IPluginObject* create() override { return new CBoxAlgorithmStimulationListener; } + IBoxListener* createBoxListener() const override { return new CBoxAlgorithmStimulationListenerListener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Stimulation stream 1", OV_TypeId_Stimulations); + prototype.addSetting("Log level to use", OV_TypeId_LogLevel, "Information"); + prototype.addFlag(Kernel::BoxFlag_CanAddInput); + return true; + } + + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_StimulationListenerDesc) +}; + +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/ovp_defines.h b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/ovp_defines.h new file mode 100644 index 0000000..1c80fad --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/ovp_defines.h @@ -0,0 +1,23 @@ +#pragma once + +// Boxes +//--------------------------------------------------------------------------------------------------- +#define OVP_ClassId_BoxAlgorithm_EBMLStreamSpy OpenViBE::CIdentifier(0x0ED76695, 0x01A69CC3) +#define OVP_ClassId_BoxAlgorithm_EBMLStreamSpyDesc OpenViBE::CIdentifier(0x354A6864, 0x06BC570C) +#define OVP_ClassId_BoxAlgorithm_ExternalProcessing OpenViBE::CIdentifier(0x15422959, 0x16304449) +#define OVP_ClassId_BoxAlgorithm_ExternalProcessingDesc OpenViBE::CIdentifier(0x63386942, 0x61D42502) +#define OVP_ClassId_BoxAlgorithm_MatrixValidityChecker OpenViBE::CIdentifier(0x60210579, 0x6F7519B6) +#define OVP_ClassId_BoxAlgorithm_MatrixValidityCheckerDesc OpenViBE::CIdentifier(0x6AFC2671, 0x1D8C493C) +#define OVP_ClassId_BoxAlgorithm_StimulationListener OpenViBE::CIdentifier(0x65731E1D, 0x47DE5276) +#define OVP_ClassId_BoxAlgorithm_StimulationListenerDesc OpenViBE::CIdentifier(0x0EC013FD, 0x5DD23E44) + +// Global defines +//--------------------------------------------------------------------------------------------------- +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#define OVP_TypeId_ValidityCheckerType OpenViBE::CIdentifier(0x32EA493A, 0x11E56D82) +#define OVP_TypeId_ValidityCheckerType_LogWarning OpenViBE::CIdentifier(0x747A0F84, 0x1097253A) +#define OVP_TypeId_ValidityCheckerType_StopPlayer OpenViBE::CIdentifier(0x4EC06D50, 0x5B131CE2) +#define OVP_TypeId_ValidityCheckerType_Interpolate OpenViBE::CIdentifier(0x1DE96E02, 0x53767550) diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/ovp_main.cpp b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/ovp_main.cpp new file mode 100644 index 0000000..1355dc7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/src/ovp_main.cpp @@ -0,0 +1,27 @@ +#include "ovp_defines.h" + +#include "box-algorithms/ovpCBoxAlgorithmEBMLStreamSpy.h" +#include "box-algorithms/ovpCBoxAlgorithmStimulationListener.h" +#include "box-algorithms/ovpCBoxAlgorithmMatrixValidityChecker.h" +#include "box-algorithms/ovpCBoxAlgorithmExternalProcessing.h" + +namespace OpenViBE { +namespace Plugins { +namespace Tools { + +OVP_Declare_Begin() + // ValidityCheckerType: this type registration enables the choice between different action to do on an invalid stream + context.getTypeManager().registerEnumerationType(OVP_TypeId_ValidityCheckerType, "Action to do"); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_ValidityCheckerType, "Log warning", OVP_TypeId_ValidityCheckerType_LogWarning.id()); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_ValidityCheckerType, "Stop player", OVP_TypeId_ValidityCheckerType_StopPlayer.id()); + context.getTypeManager().registerEnumerationEntry(OVP_TypeId_ValidityCheckerType, "Interpolate", OVP_TypeId_ValidityCheckerType_Interpolate.id()); + + OVP_Declare_New(CBoxAlgorithmStimulationListenerDesc); + OVP_Declare_New(CBoxAlgorithmEBMLStreamSpyDesc); + OVP_Declare_New(CBoxAlgorithmMatrixValidityCheckerDesc); + OVP_Declare_New(CBoxAlgorithmExternalProcessingDesc); +OVP_Declare_End() + +} // namespace Tools +} // namespace Plugins +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/test/matrix-validity-ref.csv b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/test/matrix-validity-ref.csv new file mode 100644 index 0000000..f816183 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/test/matrix-validity-ref.csv @@ -0,0 +1,5 @@ +Time:1x1,End Time,Time signal:,Event Id,Event Date,Event Duration +0.0000000000,1.0000000000,-1.#IND000000,,, +1.0000000000,2.0000000000,-1.#IND000000,,, +2.0000000000,3.0000000000,-1.#INF000000,,, +3.0000000000,4.0000000000,0.0000000000,,, diff --git a/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/test/matrix-validity-test.xml b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/test/matrix-validity-test.xml new file mode 100644 index 0000000..ed6abf5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/plugins/processing/tools/test/matrix-validity-test.xml @@ -0,0 +1,421 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + (0x460057cc, 0xfaa7362d) + (0x79a9edeb, 0x245d83fc) + Test Name + matrix-validity + matrix-validity + + + + + + + (0x000003fa, 0x00002132) + Matrix validity checker + (0x60210579, 0x6f7519b6) + + + (0x544a003e, 0x6dcba5f6) + Stream 1 + + + + + (0x544a003e, 0x6dcba5f6) + Output stream 1 + + + + + (0xa88b3667, 0x0871638c) + Log level + Warning + Warning + false + + + (0x32ea493a, 0x11e56d82) + Action to do + Log warning + Log warning + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0xfa1061e7, 0x341aafb9) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00000d10, 0x00007eaa) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 1 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 1 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00003e6a, 0x00004b24) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x544a003e, 0x6dcba5f6) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + ${Player_ScenarioDirectory}/$var{Test Name}-output.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00004679, 0x000071fa) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 5 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 368 + + + (0x207c9054, 0x3c841b63) + 1104 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00004e4d, 0x000039e9) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + log(x-2) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 304 + + + (0x207c9054, 0x3c841b63) + 960 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000058a3, 0x00004604) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x207c9054, 0x3c841b63) + 1104 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00000c57, 0x00001eb3) + + (0x00004e4d, 0x000039e9) + 0 + + + (0x000003fa, 0x00002132) + 0 + + + + (0x0000337a, 0x0000449a) + + (0x00000d10, 0x00007eaa) + 0 + + + (0x00004e4d, 0x000039e9) + 0 + + + + (0x0000651e, 0x000040fc) + + (0x000003fa, 0x00002132) + 0 + + + (0x00003e6a, 0x00004b24) + 0 + + + + (0x00007567, 0x00000d11) + + (0x00004679, 0x000071fa) + 0 + + + (0x000058a3, 0x00004604) + 0 + + + + + + + (0x00003b78, 0x00006392) + (0x3bcce5d2, 0x43f2d968) + [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":320,"identifier":"(0x000011d8, 0x00001e90)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":480},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004896, 0x00003e2f)","index":0,"name":"Default tab","parentIdentifier":"(0x000011d8, 0x00001e90)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x000015cd, 0x00006b70)","index":0,"name":"Empty","parentIdentifier":"(0x00004896, 0x00003e2f)","type":0}] + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/scripts/AddOpenViBESDKComponents.cmake b/Masterarbeit/openvibe/sdk-master/scripts/AddOpenViBESDKComponents.cmake new file mode 100755 index 0000000..1d6fdc9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/AddOpenViBESDKComponents.cmake @@ -0,0 +1,219 @@ +# --------------------------------- +# Finds OpenViBE SDK binary distribution +# Adds library to target, include path and execute install commands +# Also add library specific compiler flags +# This should be used with a defined INCLUDED_OV_SDK_COMPONENTS variable in scope +# Value should be a list of libraries to include +# They are organized into groups, and group name can also be used to add all members of said group +# This include : +# ALL : will include groups BASE, ALLPLUGINS and ALLMODULES +# BASE : MAIN KERNEL +# ALLPLUGINS : CLASSIFICATION DATA_GENERATION FEATURE_EXTRACTION FILE_IO SIGNAL_PROCESSING STIMULATION STREAM_CODECS STREAMING TOOLS +# ALLMODULES : EBML SYSTEM FS SOCKET XML DATE CSV TOOLKIT +# --------------------------------- +option(DYNAMIC_LINK_OPENVIBE_SDK "Dynamically link OpenViBE SDK" ON) + + +if(NOT CMAKE_BUILD_TYPE AND CMAKE_GENERATOR MATCHES "Visual Studio*") + set(MULTI_BUILD TRUE) +elseif(CMAKE_BUILD_TYPE AND OV_PACKAGE) + set(SOLO_PACKAGE TRUE) +elseif(CMAKE_BUILD_TYPE) + set(SOLO_BUILD TRUE) +else() + message(FATAL_ERROR "Build should specify a type or use a multi-type generator (like Visual Studio)") +endif() + +include_directories(${OPENVIBE_SDK_PATH}/include/)# TODO ? + +if(DYNAMIC_LINK_OPENVIBE_SDK) + set(OPENVIBE_SDK_LINKING "") + set(LINKING_SUFFIX Shared) + add_definitions(-DOV_Shared) +else() + set(OPENVIBE_SDK_LINKING "-static") + set(LINKING_SUFFIX Static) +endif() + +if("${INCLUDED_OV_SDK_COMPONENTS}" STREQUAL "ALL") + list(REMOVE_ITEM INCLUDED_OV_SDK_COMPONENTS "ALL") + list(APPEND INCLUDED_OV_SDK_COMPONENTS BASE ALLPLUGINS ALLMODULES) +endif() + +if(BASE IN_LIST INCLUDED_OV_SDK_COMPONENTS) + list(REMOVE_ITEM INCLUDED_OV_SDK_COMPONENTS BASE) + list(APPEND INCLUDED_OV_SDK_COMPONENTS MAIN KERNEL) +endif() + +if(ALLPLUGINS IN_LIST INCLUDED_OV_SDK_COMPONENTS) + list(REMOVE_ITEM INCLUDED_OV_SDK_COMPONENTS ALLPLUGINS) + list(APPEND INCLUDED_OV_SDK_COMPONENTS CLASSIFICATION DATA_GENERATION FEATURE_EXTRACTION FILE_IO SIGNAL_PROCESSING STIMULATION STREAM_CODECS STREAMING TOOLS) +endif() + +if(ALLMODULES IN_LIST INCLUDED_OV_SDK_COMPONENTS) + list(REMOVE_ITEM INCLUDED_OV_SDK_COMPONENTS ALLMODULES) + list(APPEND INCLUDED_OV_SDK_COMPONENTS EBML SYSTEM FS SOCKET XML DATE CSV TOOLKIT COMMUNICATION) +endif() + +if(WIN32) + set(LIB_PREFIX "") + set(ORIG_LIB_DIR bin) + set(DEST_LIB_DIR ${DIST_BINDIR}) + set(LIB_EXT lib) + set(DLL_EXT dll) + set(EXE_EXT .exe) + if(MULTI_BUILD) # Replace with generator expression in CMake 3.5+ + foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} ) + string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU ) + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/bin/ DESTINATION ${DIST_BINDIR} CONFIGURATIONS ${OUTPUTCONFIG} FILES_MATCHING PATTERN "*cmd") + endforeach() + else() + install(DIRECTORY ${OPENVIBE_SDK_PATH}/bin/ DESTINATION ${DIST_BINDIR} FILES_MATCHING PATTERN "*cmd") + endif() +elseif(UNIX) + set(LIB_PREFIX lib) + set(ORIG_LIB_DIR lib) + set(DEST_LIB_DIR ${DIST_LIBDIR}) + if(DYNAMIC_LINK_OPENVIBE_SDK) + set(LIB_EXT "so") + if(APPLE) + set(LIB_EXT "dylib") + endif() + else() + set(LIB_EXT "a") + endif() + set(DLL_EXT "${LIB_EXT}*") + set(EXE_EXT "") +endif() + +function(add_component TOKEN MODULE_NAME) + if(${TOKEN} IN_LIST INCLUDED_OV_SDK_COMPONENTS) + target_link_libraries(${PROJECT_NAME} "${OPENVIBE_SDK_PATH}/lib/${LIB_PREFIX}${MODULE_NAME}${OPENVIBE_SDK_LINKING}.${LIB_EXT}") + if(MULTI_BUILD) # Replace with generator expression in CMake 3.5+ + foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} ) + string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU ) + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/${ORIG_LIB_DIR}/ DESTINATION ${DEST_LIB_DIR} CONFIGURATIONS ${OUTPUTCONFIG} FILES_MATCHING PATTERN "*${MODULE_NAME}*${DLL_EXT}") + endforeach() + else() + install(DIRECTORY ${OPENVIBE_SDK_PATH}/${ORIG_LIB_DIR}/ DESTINATION ${DEST_LIB_DIR} FILES_MATCHING PATTERN "*${MODULE_NAME}*${DLL_EXT}") + endif() + + set(FLAGS_LIST ${ARGV}) + list(REMOVE_AT FLAGS_LIST 0 1) # Remove mandatory args to get only optional args + foreach(COMPILE_FLAG IN LISTS FLAGS_LIST) + add_definitions(-D${COMPILE_FLAG}) + endforeach() + endif() +endfunction(add_component) + +function(add_plugin TOKEN MODULE_NAME) + if(${TOKEN} IN_LIST INCLUDED_OV_SDK_COMPONENTS) + if(MULTI_BUILD) # Replace with generator expression in CMake 3.5+ + foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} ) + string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU ) + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/${ORIG_LIB_DIR}/ DESTINATION ${DEST_LIB_DIR} CONFIGURATIONS ${OUTPUTCONFIG} FILES_MATCHING PATTERN "*${MODULE_NAME}*${DLL_EXT}") + endforeach() + else() + install(DIRECTORY ${OPENVIBE_SDK_PATH}/${ORIG_LIB_DIR}/ DESTINATION ${DEST_LIB_DIR} FILES_MATCHING PATTERN "*${MODULE_NAME}*${DLL_EXT}") + endif() + endif() +endfunction(add_plugin) + +add_component(MAIN "openvibe" "TARGET_HAS_OpenViBE") +add_component(KERNEL "openvibe-kernel") #TODO TARGET_HAS_ +add_component(TOOLKIT "openvibe-toolkit" "TARGET_HAS_OpenViBEToolkit" "OVTK_${LINKING_SUFFIX}") + +#modules +add_component(EBML "openvibe-module-ebml" "TARGET_HAS_EBML" "EBML_${LINKING_SUFFIX}") +add_component(SYSTEM "openvibe-module-system" "TARGET_HAS_System" "System_${LINKING_SUFFIX}") +add_component(FS "openvibe-module-fs" "TARGET_HAS_FS" "FS_${LINKING_SUFFIX}") +add_component(SOCKET "openvibe-module-socket" "TARGET_HAS_Socket" "Socket_${LINKING_SUFFIX}") +add_component(XML "openvibe-module-xml" "TARGET_HAS_XML" "XML_${LINKING_SUFFIX}") +add_component(CSV "openvibe-module-csv" "TARGET_HAS_CSV" "CSV_${LINKING_SUFFIX}") +add_component(DATE "openvibe-module-date" "TARGET_HAS_DATE" "DATE_${LINKING_SUFFIX}") +add_component(COMMUNICATION "openvibe-module-communication" "TARGET_HAS_COMMUNICATION" "COMMUNICATION_${LINKING_SUFFIX}") + +#plugins +add_plugin(CLASSIFICATION "openvibe-plugins-base-classification") +add_plugin(DATA_GENERATION "openvibe-plugins-base-data-generation") +add_plugin(FEATURE_EXTRACTION "openvibe-plugins-base-feature-extraction") +add_plugin(FILE_IO "openvibe-plugins-base-file-io") +add_plugin(SIGNAL_PROCESSING "openvibe-plugins-base-signal-processing") +add_plugin(STIMULATION "openvibe-plugins-base-stimulation") +add_plugin(STREAM_CODECS "openvibe-plugins-base-stream-codecs") +add_plugin(STREAMING "openvibe-plugins-base-streaming") +add_plugin(TOOLS "openvibe-plugins-base-tools") + +add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) + +# Install binary dependencies if requested +if(DEPENDENCIES IN_LIST INCLUDED_OV_SDK_COMPONENTS) + if(WIN32) + if(MULTI_BUILD) # Replace with generator expression in CMake 3.5+ + foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} ) + string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU ) + install(FILES + ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/bin/libexpat.dll + ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/bin/xerces-c_3_1.dll + ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/bin/xerces-c_3_1D.dll + DESTINATION ${DEST_LIB_DIR} CONFIGURATIONS ${OUTPUTCONFIG}) + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/include/ DESTINATION ${DIST_INCLUDEDIR} CONFIGURATIONS ${OUTPUTCONFIG}) + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/lib/ DESTINATION ${DIST_LIBDIR} CONFIGURATIONS ${OUTPUTCONFIG}) + endforeach() + else() + install(FILES + ${OPENVIBE_SDK_PATH}/bin/libexpat.dll + ${OPENVIBE_SDK_PATH}/bin/xerces-c_3_1.dll + ${OPENVIBE_SDK_PATH}/bin/xerces-c_3_1D.dll + DESTINATION ${DEST_LIB_DIR}) + install(DIRECTORY ${OPENVIBE_SDK_PATH}/include/ DESTINATION ${DIST_INCLUDEDIR}) + install(DIRECTORY ${OPENVIBE_SDK_PATH}/lib/ DESTINATION ${DIST_LIBDIR}) + endif() + endif() +endif() + +# Install applications if required +if(DEVELOPER_TOOLS IN_LIST INCLUDED_OV_SDK_COMPONENTS) + if(MULTI_BUILD) # Replace with generator expression in CMake 3.5+ + foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} ) + string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU ) + install(FILES + ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/bin/openvibe-id-generator${EXE_EXT} + ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/bin/openvibe-plugin-inspector${EXE_EXT} + DESTINATION ${DIST_BINDIR} CONFIGURATIONS ${OUTPUTCONFIG} FILE_PERMISSIONS OWNER_EXECUTE) + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/include/ DESTINATION ${DIST_INCLUDEDIR} CONFIGURATIONS ${OUTPUTCONFIG}) + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/lib/ DESTINATION ${DIST_BINDIR} CONFIGURATIONS ${OUTPUTCONFIG}) + endforeach() + else() + install(FILES + ${OPENVIBE_SDK_PATH}/bin/openvibe-id-generator${EXE_EXT} + ${OPENVIBE_SDK_PATH}/bin/openvibe-plugin-inspector${EXE_EXT} + DESTINATION ${DIST_BINDIR} PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ) + install(DIRECTORY ${OPENVIBE_SDK_PATH}/include/ DESTINATION ${DIST_INCLUDEDIR}) + install(DIRECTORY ${OPENVIBE_SDK_PATH}/lib/ DESTINATION ${DIST_BINDIR}) + endif() +endif() + +# if we link with the module socket in Static, we must link the project with the dependency on win32 +if(WIN32 AND SOCKET IN_LIST INCLUDED_OV_SDK_COMPONENTS AND NOT DYNAMIC_LINK_OPENVIBE_SDK) + include("FindThirdPartyWinsock2") + include("FindThirdPartyFTDI") +endif() + +if(MULTI_BUILD) # Replace with generator expression in CMake 3.5+ + foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} ) + string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU ) + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/share/ DESTINATION ${DIST_DATADIR} CONFIGURATIONS ${OUTPUTCONFIG}) + install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/bin/ + USE_SOURCE_PERMISSIONS + DESTINATION ${DIST_BINDIR} + CONFIGURATIONS ${OUTPUTCONFIG} + FILES_MATCHING PATTERN "*example*") + endforeach() +else() + install(DIRECTORY ${OPENVIBE_SDK_PATH}/share/ DESTINATION ${DIST_DATADIR}) + install(DIRECTORY ${OPENVIBE_SDK_PATH}/bin/ + USE_SOURCE_PERMISSIONS + DESTINATION ${DIST_BINDIR} + FILES_MATCHING PATTERN "*example*") +endif() diff --git a/Masterarbeit/openvibe/sdk-master/scripts/linux-dep-helpers/linux-compile-cmake.pl b/Masterarbeit/openvibe/sdk-master/scripts/linux-dep-helpers/linux-compile-cmake.pl new file mode 100755 index 0000000..9d120ae --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/linux-dep-helpers/linux-compile-cmake.pl @@ -0,0 +1,89 @@ +#!/usr/bin/perl + +# Intended to be run from linux-install_dependencies.pl which defines the dependencies_dir variable. +# +# Variables are wrt that parent scope +# + +use strict; +use warnings; +use Getopt::Long; + +use English; +use FindBin; +use File::Copy; +use File::Spec; + +# Version of CMake to install if needed (latest as of 08/2020) +my $version_major = 3; +my $version_minor = 18; +my $version_patch = 1; + +# Minimum version needed for the project. +# 3.12 for FindPython functionalities. +my $minimum_major = 3; +my $minimum_minor = 15; + +my $install_dir = $dependencies_dir; + +# Updating path with potentially installed cmake before looking for it. +if ("$dependencies_dir/cmake") { + print "Found cmake folder in deps\n"; + my $path = $ENV{'PATH'}; + $path = "$dependencies_dir/cmake/bin:$path"; + $ENV{'PATH'} = $path; + #system("PATH=$dependencies_dir/cmake/bin:$PATH") +} + +# Checking for CMake presence +my $major_found = 0; +my $minor_found = 0; + +if (`which cmake`) { + `cmake --version` =~ /.*(\d)\.(\d\d)\.*/; + + print "cmake version found: $1.$2\n"; + + $major_found = $1; + $minor_found = $2; +} + +# Minimum cmake version required for the project: 3.12 +if (int($major_found) < $minimum_major || int($minor_found) < $minimum_minor) { + + my $old_dir = Cwd::getcwd(); + + my $cmake_archive = "cmake-${version_major}.${version_minor}.${version_patch}.tar.gz"; + my $cmake_folder = "cmake-${version_major}.${version_minor}.${version_patch}"; + + print "CMake version too low. Installing newer one in $install_dir\n"; + + if (! -d $install_dir) { + mkdir($install_dir) or die("Failed to create directory [$install_dir]"); + } + + # Download + print "Downloading ${cmake_archive}\n"; + system("wget http://www.cmake.org/files/v${version_major}.${version_minor}/${cmake_archive}") == 0 + or die "Could not download the CMake sources - err $?"; + + # Extract + system("tar -xzf ${cmake_archive}") == 0 + or die ("Could not extract the CMake archive - err $?"); + + # Configure, compile and install + chdir $cmake_folder; + system("./configure --prefix=$install_dir/cmake") == 0 + or die("Failed to configure for cmake - err $?"); + system("make install") == 0 + or die ("Failed make install cmake - err $?"); + + # Go back to previous folder + chdir $old_dir; + + #Clear + system("rm -r ${cmake_archive} ${cmake_folder}") == 0 + or die ("Failed to clear after install - err $?"); + +} + diff --git a/Masterarbeit/openvibe/sdk-master/scripts/linux-dep-helpers/linux-compile-eigen.pl b/Masterarbeit/openvibe/sdk-master/scripts/linux-dep-helpers/linux-compile-eigen.pl new file mode 100755 index 0000000..0386908 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/linux-dep-helpers/linux-compile-eigen.pl @@ -0,0 +1,53 @@ +#!/usr/bin/perl + +# Intended to be run from linux-install_dependencies.pl +# +# Variables are wrt that parent scope +# + +# Installation of packages not available in the apt database or PPA +# Eigen installation +if (!$no_install && $distribution eq 'Ubuntu 16.04') { + # Install eigen 3.2.9 from source if it is not already + # This is because Ubuntu 16.04 has a beta version of the Eigen package by default + # and it does not work + if (-e "/usr/local/include/eigen3") { + print STDERR "Warning: eigen3 is already installed in /usr/local\n"; + } else { + my $old_dir = Cwd::getcwd(); + + my $eigen_build_folder = $dependencies_dir . "/eigen-build"; + my $eigen_extracted_folder = $eigen_build_folder . "/eigen-eigen-dc6cfdf9bcec"; + + if (! -e $dependencies_dir) { + mkdir($dependencies_dir) or die("Failed to create directory [$dependencies_dir]"); + } + if (! -e $eigen_build_folder) { + mkdir($eigen_build_folder) or die("Failed to create directory [$eigen_build_folder]"); + } + + chdir $eigen_build_folder; + + if (! -e "3.2.9.tar.bz2") { + system('wget "http://bitbucket.org/eigen/eigen/get/3.2.9.tar.bz2"'); + ($CHILD_ERROR != 0) and die ("Could not download the Eigen sources [$CHILD_ERROR]"); + } + if (! -e $eigen_extracted_folder) { + system('tar -xjf "3.2.9.tar.bz2"'); + ($CHILD_ERROR != 0) and die ("Could not extract the eigen archive"); + } + + chdir $eigen_extracted_folder; + mkdir $eigen_extracted_folder . "/build" or die ("Failed to create directory [$eigen_extracted_folder/build]"); + chdir $eigen_extracted_folder . "/build"; + + system("cmake .."); + ($CHILD_ERROR != 0) and die("Failed to run CMake for Eigen [$CHILD_ERROR]"); + + system("sudo make install"); + ($CHILD_ERROR != 0) and die("Failed install Eigen [$CHILD_ERROR]"); + + # Go back to the scripts folder + chdir $old_dir; + } +} diff --git a/Masterarbeit/openvibe/sdk-master/scripts/linux-dep-helpers/linux-compile-gtest.pl b/Masterarbeit/openvibe/sdk-master/scripts/linux-dep-helpers/linux-compile-gtest.pl new file mode 100755 index 0000000..e88fae5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/linux-dep-helpers/linux-compile-gtest.pl @@ -0,0 +1,36 @@ +#!/usr/bin/perl + +# Intended to be run from linux-install_dependencies.pl +# +# Variables are wrt that parent scope +# + +if (!$no_gtest) { + my $old_dir = Cwd::getcwd(); + + my $gtest_build_folder = $dependencies_dir . "/gtest-build"; + my $gtest_lib_folder = $dependencies_dir . "/libgtest/"; + if (! -e $dependencies_dir) { + mkdir($dependencies_dir) or die("Failed to create directory [$dependencies_dir]"); + } + if (! -e $gtest_build_folder) { + mkdir($gtest_build_folder) or die("Failed to create directory [$gtest_build_folder]"); + } + if (! -e $gtest_lib_folder) { + mkdir($gtest_lib_folder) or die("Failed to create directory [$gtest_lib_folder]"); + } + + # build gtest + chdir $gtest_build_folder; + system("cmake -GNinja /usr/src/gtest"); + system("ninja all"); + system("rm CMakeCache.txt"); + my @lib_files = glob "*.a"; + + foreach my $lib_cur (@lib_files) { + copy($lib_cur, $gtest_lib_folder) or die "Could not copy lib $lib_cur $!\n"; + } + chdir $old_dir; + +} + diff --git a/Masterarbeit/openvibe/sdk-master/scripts/linux-dep-helpers/linux-preinstall-python-repo.pl b/Masterarbeit/openvibe/sdk-master/scripts/linux-dep-helpers/linux-preinstall-python-repo.pl new file mode 100755 index 0000000..9f89d40 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/linux-dep-helpers/linux-preinstall-python-repo.pl @@ -0,0 +1,12 @@ +#!/usr/bin/perl + +# Intended to be run from linux-install_dependencies.pl +# +# Variables are wrt that parent scope +# + +if (!$no_install && $distribution eq 'Ubuntu 14.04') { + system('sudo add-apt-repository ppa:fkrull/deadsnakes'); + ($CHILD_ERROR != 0) and die("Adding PPA repository for Python 3.5 failed [$CHILD_ERROR]"); +} + diff --git a/Masterarbeit/openvibe/sdk-master/scripts/linux-dependencies-fedora.txt b/Masterarbeit/openvibe/sdk-master/scripts/linux-dependencies-fedora.txt new file mode 100644 index 0000000..31f0dba --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/linux-dependencies-fedora.txt @@ -0,0 +1,11 @@ +doxygen +make +gcc +gcc-c++ +expat-devel +openssl-devel +boost-devel +ninja-build +zziplib-devel +xerces-c-devel +gtest-devel diff --git a/Masterarbeit/openvibe/sdk-master/scripts/linux-dependencies-ubuntu1404.txt b/Masterarbeit/openvibe/sdk-master/scripts/linux-dependencies-ubuntu1404.txt new file mode 100644 index 0000000..d7c120a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/linux-dependencies-ubuntu1404.txt @@ -0,0 +1,16 @@ +doxygen +make +gcc +g++ +libexpat1-dev +libncurses5-dev +libeigen3-dev +libboost-dev +libboost-thread-dev +libboost-regex-dev +libboost-chrono-dev +libboost-filesystem1.54-dev +ninja-build +libzzip-dev +libxerces-c-dev +libgtest-dev diff --git a/Masterarbeit/openvibe/sdk-master/scripts/linux-dependencies-ubuntu16_plus.txt b/Masterarbeit/openvibe/sdk-master/scripts/linux-dependencies-ubuntu16_plus.txt new file mode 100644 index 0000000..6d269ce --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/linux-dependencies-ubuntu16_plus.txt @@ -0,0 +1,16 @@ +doxygen +make +gcc +g++ +libssl-dev +libexpat1-dev +libncurses5-dev +libboost-dev +libboost-thread-dev +libboost-regex-dev +libboost-chrono-dev +libboost-filesystem-dev +ninja-build +libzzip-dev +libxerces-c-dev +libgtest-dev diff --git a/Masterarbeit/openvibe/sdk-master/scripts/linux-install_dependencies.pl b/Masterarbeit/openvibe/sdk-master/scripts/linux-install_dependencies.pl new file mode 100755 index 0000000..c891d0b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/linux-install_dependencies.pl @@ -0,0 +1,201 @@ +#!/usr/bin/perl + +=pod +This script will install dependencies for OpenViBE SDK. + +The installer uses the native package manager. + +Currently supported Linux Distributions are: +- Ubuntu 14.04 LTS +- Ubuntu 16.04 LTS + +Operating on the specified manifest folder, + + 1) Carries out preliminary steps by running scripts matching + ^linux-preinstall-.*pl from linux-dep-helpers/ + 2) Installs packages from distro-specific files + (like linux-dependencies-ubuntu1404.txt) + 3) May compile/fetch packages with perl scripts matching + ^linux-compile-.*pl from linux-dep-helpers/ + +n.b. The script globs all .pl scripts present that match the prefixes. If you don't want some dependency, remove the corresponding script. + +=cut + +use strict; +use English; +use FindBin; +use File::Copy; +use File::Spec; +use Getopt::Long; + +sub usage { + print "$0 [-h][-y]\n"; + print "Install OpenViBE SDK build dependencies\n"; + print " Options:\n"; + print " -h: this help\n"; + print " -y: assume 'yes' to all prompts. Make it possible to run non-interactively.\n"; + print " --no-gtest: will not compile gtest if set.\n"; + print " --no-install: will not do any installation if set.\n"; + print " --dependencies-dir [folder]: path to the dependencies\n"; + print " --manifest-dir [folder]: path to the manifest files (default: scripts folder/linux-dep-helpers/)\n"; +}; + + +my $assume_yes = 0; +my $no_gtest = 0; +my $no_install = 0; +my $manifest_dir = "$FindBin::Bin"; +my $print_help = 0; +my $dependencies_dir = "$FindBin::Bin/../dependencies/"; + +GetOptions ( + "assume-yes" => \$assume_yes, + "y" => \$assume_yes, + "dependencies-dir=s" => \$dependencies_dir, + "manifest-dir=s" => \$manifest_dir, + "h" => \$print_help, + "help" => \$print_help, + "no-install" => \$no_install, + "no-gtest" => \$no_gtest) + or usage() and die("Error in command line arguments\n"); + +if($print_help) { + usage(); + exit(1); +} + +$dependencies_dir = File::Spec->rel2abs($dependencies_dir); +my $dependencies_arch_dir = "$dependencies_dir/arch"; +my $helper_script_dir = "$manifest_dir/linux-dep-helpers/"; + +if (! -e $dependencies_dir) { + mkdir($dependencies_dir) or die("Failed to create directory [$dependencies_dir]"); +} +if (! -e $dependencies_arch_dir) { + mkdir($dependencies_arch_dir) or die("Failed to create directory [$dependencies_arch_dir]"); +} + +# Check for the release version and set the update and install commands +my $unsupported_distribution = 'Unsupported'; +my $distribution = $unsupported_distribution; +my $update_packages_command = ''; +my $package_install_command = ''; +my $add_repository_command = ''; + +my $os_release = `cat /etc/os-release`; +# Check for NAME= and VERSION_ID= +# Take into account distros placing quotes around values +my ($lsb_distributor, $lsb_release) = ($os_release =~ m/NAME=["'\`]*([a-zA-Z]+).*VERSION_ID=["'\`]*([0-9.]+)/s); + +if ($lsb_distributor =~ 'Ubuntu') { + if (!$no_install) { + $update_packages_command = 'sudo apt-get update'; + if ($assume_yes) { + $package_install_command = 'sudo apt-get -y install'; + $add_repository_command = 'sudo add-apt-repository -y universe'; + } else { + $package_install_command = 'sudo apt-get install'; + $add_repository_command = 'sudo add-apt-repository universe'; + } + } + + if ($lsb_release =~ '14.04' + || $lsb_release =~ '16.04' + || $lsb_release =~ '18.04' + || $lsb_release =~ '19.10') { + $distribution = 'Ubuntu ' . $lsb_release; + } +} elsif ($lsb_distributor =~ 'Fedora') { + if (!$no_install) { + if ($assume_yes) { + $package_install_command = 'sudo dnf -y install'; + } else { + $package_install_command = 'sudo dnf install'; + } + } + $distribution = 'Fedora'; +} + +$distribution eq $unsupported_distribution and die('This distribution is unsupported'); + +print "Installing dependencies for: $distribution\n"; +print "Install command: $package_install_command\n"; +# Perform steps before installing packages +opendir(my $dir_handle, $helper_script_dir) or die("unable to open $helper_script_dir"); +while(my $filename = readdir($dir_handle)) { + if($filename =~ /^linux-preinstall.*pl/) { + open(my $pl_file_handle, '<', "$helper_script_dir/$filename") + or die "Unable to open file, $helper_script_dir/$filename"; + undef $/; + my $program = <$pl_file_handle>; + eval " $program "; warn $@ if $@; + } +} +closedir($dir_handle); + +# Create the list of packages to install + +my $pkg_file = ""; + +if ($distribution eq 'Ubuntu 14.04') { + $pkg_file = "$manifest_dir/linux-dependencies-ubuntu1404.txt"; +} elsif ($distribution =~ 'Ubuntu') { + $pkg_file = "$manifest_dir/linux-dependencies-ubuntu16_plus.txt"; +} elsif ($distribution eq 'Fedora') { + $pkg_file = "$manifest_dir/linux-dependencies-fedora.txt"; +} + +# Install actual packages +print "Opening package manifest file $pkg_file ...\n"; + +# read package list to memory +open(my $pkg_file_handle, '<:encoding(UTF-8)', $pkg_file) + or die "Unable to open file, $pkg_file"; + +my @packages = (); +local $INPUT_RECORD_SEPARATOR = "\n"; +for my $line (<$pkg_file_handle>) { + $line =~ s/\r?\n$//; + push @packages, $line; +} + +close($pkg_file_handle) or warn "Unable to close $pkg_file"; + +if (!$no_install) { + # Update package list + if ($add_repository_command) { + print "Updating package database...\n"; + system($add_repository_command); + ($CHILD_ERROR != 0) and die('Failed to add additional repositories'); + } + if ($update_packages_command) { + system($update_packages_command); + ($CHILD_ERROR != 0) and die('Failed to update the package databases'); + } + + # Install the packages + print "Will install following packages:\n"; + print (join ' ', @packages), "\n"; + + my $pkgs = (join ' ', @packages); + system("$package_install_command " . (join ' ', @packages)); + ($CHILD_ERROR != 0) and die('Failed to install the required packages'); +} + +# Obtain specific dependencies that we dont get from packages +opendir(my $dir_handle, $helper_script_dir) or die("unable to open $helper_script_dir"); +while(my $filename = readdir($dir_handle)) { + if($filename =~ /^linux-compile.*pl/) { + print "Running $helper_script_dir/$filename ...\n"; + open(my $pl_file_handle, '<', "$helper_script_dir/$filename") + or die "Unable to open file, $helper_script_dir/$filename"; + undef $/; + my $program = <$pl_file_handle>; + eval " $program "; warn $@ if $@; + } +} +closedir($dir_handle); + +print("OpenViBE SDK dependencies were successfully installed\n"); + diff --git a/Masterarbeit/openvibe/sdk-master/scripts/tests-data.txt b/Masterarbeit/openvibe/sdk-master/scripts/tests-data.txt new file mode 100644 index 0000000..9419ca0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/tests-data.txt @@ -0,0 +1,3 @@ +data/bci-motor-imagery.zip;test-input;2.0.0 +data/openvibe-classification-lda.zip;test-input;2.0.0 +data/openvibe-regularized-csp-2.0.0.zip;test-input;2.0.0 diff --git a/Masterarbeit/openvibe/sdk-master/scripts/unix-build b/Masterarbeit/openvibe/sdk-master/scripts/unix-build new file mode 100755 index 0000000..3f27263 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/unix-build @@ -0,0 +1,229 @@ +#!/bin/bash + +# This is the build script to configure and build OpenViBE on +# unix-based platform. + +# Functions definition + +function usage() +{ + echo "usage: ./unix-build [options]" + echo "" + echo "-h | --help : usage" + echo "-v | --verbose : verbose output at building step" + echo "--build-type : build type" + echo "--build-dir : build directory" + echo "--install-dir : binaries deployment directory" + echo "--dependencies-dir : directory where dependencies are located" + echo "--test-data-dir : test data directory" + echo "--make-package : a package will be created in build directory" + echo "--hide-error-location : do not display complete error locations" + echo "--userdata-subdir name of the userdata sub directory" + echo "--brand-name name of the brand to prefix titles and documentation" + echo "--build-unit : if set, unit tests will be built" + echo "--build-validation : if set, validation tests will be builts" + echo "--gtest-lib-dir : gtest libraries directory (default: \$\{dependencies_dir\}/libgtest)" + echo "--gtest-include-dir : gtest include directory (default: /usr/src/gtest/src)" + echo "--test-output-dir : test output files directory" + echo "--python-exec : path to python executable to use" +} + +# Script starting point + +# As options are not mandatory, set some default values for each target +# variables +ov_script_dir="$(readlink -m $(dirname $0))" +ov_build_type=Release +verbose=0 +package_option="FALSE" +display_error_location="ON" +BrandName=OpenViBE +ov_build_unit=0 +ov_build_validation=0 +gtest_include_dir="/usr/src/gtest/src" + +# Parse arguments +while [[ $# -gt 0 ]]; do + key="$1" + case $key in + -h | --help) + usage + exit + ;; + -v | --verbose) + verbose=1 + ;; + --build-type) + ov_build_type="$2" + shift + ;; + --build-dir) + ov_build_dir="$2" + shift + ;; + --install-dir) + ov_install_dir="$2" + shift + ;; + --dependencies-dir) + dependencies_dir_token="-DOV_CUSTOM_DEPENDENCIES_PATH=$2" + dependencies_dir=$2 + shift + ;; + --test-data-dir) + ov_test_data_dir_token="-DOVT_TEST_DATA_DIR=$2" + shift + ;; + --make-package) + package_option="TRUE" + display_error_location="OFF" + ;; + --hide-error-location) + display_error_location=OFF + ;; + --userdata-subdir) + UserDataSubdir="-DOV_CONFIG_SUBDIR=$2" + shift + ;; + --brand-name) + BrandName="$2" + shift + ;; + --build-unit) + ov_build_unit=1 + ;; + --build-validation) + ov_build_validation=1 + ;; + --gtest-lib-dir) + gtest_lib_dir_token="-DGTEST_LIBRARY=$2/libgtest.a" + gtest_mainlib_dir_token="-DGTEST_MAIN_LIBRARY=$2/libgtest_main.a" + shift + ;; + --gtest-include-dir) + gtest_include_dir="$2" + shift + ;; + --test-output-dir) + ov_cmake_test_output="$2" + shift + ;; + --python-exec) + python_exec="-DPYTHON_EXECUTABLE=$2" + shift;; + *) + echo "ERROR: Unknown parameter $key" + exit 1 + ;; + esac + shift # past argument or value +done + +# Check parameters validity +if [[ ${ov_build_type} != "Debug" ]] \ + && [[ ${ov_build_type} != "Release" ]] \ + && [[ ${ov_build_type} != "RelWithDebInfo" ]] +then + echo "ERROR: ${ov_build_type} not handled as build type" + exit 1 +fi + +# Update directories only if they point to the default one +if [[ ! -v ov_build_dir ]]; then + ov_build_dir="${ov_script_dir}/../../openvibe-sdk-build/build-${ov_build_type}" +fi + +if [[ ! -v ov_install_dir ]]; then + ov_install_dir="${ov_script_dir}/../../openvibe-sdk-build/dist-${ov_build_type}" +fi +if [[ ! -v ov_cmake_test_output ]]; then + ov_cmake_test_output="${ov_build_dir}/validation-test-output/" +fi + +echo "**************************************" +echo "Build with parameters:" +echo "[build-type] = ${ov_build_type}" +echo "[build-dir] = ${ov_build_dir}" +echo "[dependencies-dir token] = ${dependencies_dir_token}" +echo "[install-dir] = ${ov_install_dir}" +echo "[test data directory token] = ${ov_test_data_dir_token}" +echo "[test output files directory] = ${ov_cmake_test_output}" +echo "[build unit] = ${ov_build_unit}" +echo "[build validation] = ${ov_build_validation}" +echo "[brand name] = ${BrandName}" +echo "[user data subdirectory] = ${UserDataSubdir}" +echo "[display-error-location] = ${display_error_location}" +echo "**************************************" +echo "" +echo "" + +# Special configuration for MacOS +uname_string=$(uname) + +if [[ "$uname_string" == 'Darwin' ]]; then + export PKG_CONFIG_PATH="/opt/X11/lib/pkgconfig:$PKG_CONFIG_PATH" +fi + +# Create necessary directories +mkdir -p "${ov_build_dir}" &> /dev/null + +# Change directory to build directory as cmake has to be run from build +# directory +pushd "${ov_build_dir}" &> /dev/null + +echo "Generating build system files with cmake..." + +cmake ${ov_script_dir}/.. \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=${ov_build_type} \ + -DCMAKE_INSTALL_PREFIX=${ov_install_dir} \ + ${ov_test_data_dir_token} \ + ${dependencies_dir_token} \ + -DOV_PACKAGE=${package_option} \ + -DOV_DISPLAY_ERROR_LOCATION=${display_error_location} \ + -DBUILD_UNIT_TEST=${ov_build_unit} \ + -DBUILD_VALIDATION_TEST=${ov_build_validation} \ + -DGTEST_INCLUDE_DIR=${gtest_include_dir} \ + ${gtest_lib_dir_token} \ + ${gtest_mainlib_dir_token} \ + -DOVT_VALIDATION_TEST_OUTPUT_DIR=${ov_cmake_test_output} \ + ${UserDataSubdir} \ + -DBRAND_NAME=${BrandName} \ + ${python_exec} + +if [[ $? == 0 ]]; then + echo "Generation succeeded!" +else + echo "ERROR: Generation failed" + exit 1 +fi + +echo "Building project..." + +if [[ $verbose == 1 ]]; then + ninja -v install +else + ninja install +fi + +if [[ $? == 0 ]]; then + echo "Build succeeded!" +else + echo "ERROR: Build failed" + exit 1 +fi + + +if [[ ${package_option} == "TRUE" ]]; then + cmake --build . --target package + if [[ $? == 0 ]]; then + echo "Package succeeded!" + else + echo "ERROR: Package failed" + exit 1 + fi +fi + +popd &> /dev/null + +exit diff --git a/Masterarbeit/openvibe/sdk-master/scripts/unix-ctest-launcher.sh-base b/Masterarbeit/openvibe/sdk-master/scripts/unix-ctest-launcher.sh-base new file mode 100755 index 0000000..cc2e83c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/unix-ctest-launcher.sh-base @@ -0,0 +1,25 @@ +#!/bin/bash + +# Set path to OpenViBE shared libraries +uname_string=$(uname) + +export OV_PATH_ROOT="@DIST_BINDIR@/.." + +if [[ "$uname_string" == 'Darwin' ]]; then + export DYLD_LIBRARY_PATH="@DIST_LIBDIR@/:$DYLD_LIBRARY_PATH" +else + export LD_LIBRARY_PATH="@DIST_LIBDIR@/:$LD_LIBRARY_PATH" +fi + +# Execute ctest forwarding the arguments +if [ -d unit-test ]; then + pushd unit-test + ctest $@ + popd +fi + +if [ -d validation-test ]; then + pushd validation-test + ctest $@ + popd +fi diff --git a/Masterarbeit/openvibe/sdk-master/scripts/unix-get-dependencies.sh b/Masterarbeit/openvibe/sdk-master/scripts/unix-get-dependencies.sh new file mode 100755 index 0000000..9d94f9f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/unix-get-dependencies.sh @@ -0,0 +1,106 @@ +#! /bin/bash +## Get needed dependencies from cache or remote server and unzip into +## dest folder. +# + +DEPENDENCIES="./tests-data.txt" +CACHE_DIR="../dependencies/arch" +if [ ! -z $DEPENDENCY_CACHE ]; then + CACHE_DIR=$DEPENDENCY_CACHE +fi +OUTPUT_DIR="../dependencies" + +function usage () { + cat < : directory where dependencies are located" +} + +# variable inits +dependencies_dir="" + +# arg parsing +while [[ $# -gt 0 ]]; do + key="$1" + case $key in + -h | --help) + usage + exit 0 + ;; + -v | --verbose) + verbose=1 + ;; + --dependencies-dir) + dependencies_dir=$2 + shift + ;; + *) + echo "ERROR: Unknown parameter $key" + exit 1 + ;; + esac + shift # past argument or value +done + +if [ -z "$dependencies_dir" ] +then + echo "Missing --dependencies-dir" + usage +else + echo "unix-init-env: adding dependencies to path" + # Add to the front of PATH any needed dependency. + export PATH=$dependencies_dir/cmake/bin:$PATH +fi diff --git a/Masterarbeit/openvibe/sdk-master/scripts/windows-build-tools.txt b/Masterarbeit/openvibe/sdk-master/scripts/windows-build-tools.txt new file mode 100644 index 0000000..e4a7a94 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/windows-build-tools.txt @@ -0,0 +1,2 @@ +build/windows/cmake-3.18.0.zip;cmake;3.18.0 +build/windows/ninja-1.4.0.zip;ninja;1.4.0 diff --git a/Masterarbeit/openvibe/sdk-master/scripts/windows-build.cmd b/Masterarbeit/openvibe/sdk-master/scripts/windows-build.cmd new file mode 100755 index 0000000..f8fe51b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/windows-build.cmd @@ -0,0 +1,262 @@ +@echo off +setlocal EnableDelayedExpansion +setlocal enableextensions + +set BuildType=Release +set PauseCommand=pause +set RerunCmake=false +set PackageOption=FALSE +set BrandName=OpenViBE +set DisplayErrorLocation=ON +set DependenciesPath= +set init_env_cmd=windows-initialize-environment.cmd +set generator=-G"Ninja" +set builder=Ninja +set script_dir=%~dp0 +set PlatformTarget=x86 + +goto parameter_parse + +:print_help + echo Usage: %0 [options] + echo. + echo -h ^|--help usage + echo --no-pause will not pause during script execution + echo -d^|--debug build in debug mode + echo -r^|--release build in release mode + echo --make-package make packages at the end + echo --hide-error-location do not display complete error locations + echo --rerun-cmake force cmake rerun + echo --userdata-subdir [dirname] name of the userdata sub directory + echo --brand-name [brand name] name of the brand to prefix titles and documentation + echo --build-unit build unit tests + echo --build-validation build validation tests + + echo --build-dir [dirname] build directory + echo --install-dir [dirname] binaries deployment directory + echo --dependencies-dir [dirname] directory where dependencies are located + echo --test-data-dir [dirname] test data directory + echo --test-output-dir [dirname] test output files directory + echo --python-exec [path] path to the python executable to use + echo --vsproject Create visual studio project (.sln) + echo --vsbuild Create visual studio project (.sln) and compiles it + echo --platform-target [x86 or x64] Create a 32 or 64 bit. 32bit is the default + + echo. + exit /b + + +:parameter_parse + +if /i "%1" == "-h" ( + goto print_help +) else if /i "%1" == "--help" ( + goto print_help +) else if /i "%1" == "--no-pause" ( + set PauseCommand=echo "" + SHIFT + Goto parameter_parse +) else if /i "%1" == "-d" ( + set BuildType=Debug + SHIFT + Goto parameter_parse +) else if /i "%1" == "--debug" ( + set BuildType=Debug + SHIFT + Goto parameter_parse +) else if /i "%1" == "-r" ( + set BuildType=Release + SHIFT + Goto parameter_parse +) else if /i "%1" == "--release" ( + set BuildType=Release + SHIFT + Goto parameter_parse +) else if /i "%1" == "--make-package" ( + set PackageOption=TRUE + set DisplayErrorLocation=OFF + SHIFT + Goto parameter_parse +) else if /i "%1" == "--hide-error-location" ( + set DisplayErrorLocation=OFF + SHIFT + Goto parameter_parse +) else if /i "%1" == "--rerun-cmake" ( + set RerunCmake="true" + SHIFT + Goto parameter_parse +) else if /i "%1" == "--build-unit" ( + set ov_build_unit=true + SHIFT + Goto parameter_parse +) else if /i "%1" == "--build-validation" ( + set ov_build_validation=true + SHIFT + Goto parameter_parse +) else if /i "%1" == "--test-data-dir" ( + set ov_cmake_test_data="-DOVT_TEST_DATA_DIR=%2" + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1" == "--test-output-dir" ( + set ov_cmake_test_output="%2" + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1" == "--python-exec" ( + set python_exec="-DPYTHON_EXECUTABLE=%2" + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1" == "--userdata-subdir" ( + set UserDataSubdir="-DOV_CONFIG_SUBDIR=%2" + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1" == "--brand-name" ( + set BrandName="%2" + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--build-dir" ( + set build_dir=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--install-dir" ( + set install_dir=%2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--dependencies-dir" ( + set DependenciesPath="-DOV_CUSTOM_DEPENDENCIES_PATH=%2" + set init_env_cmd=windows-initialize-environment.cmd --dependencies-dir %2 + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--vsproject" ( + set vsgenerate=TRUE + set builder=None + SHIFT + Goto parameter_parse +) else if /i "%1"=="--vsbuild" ( + set vsgenerate=TRUE + set builder=Visual + SHIFT + Goto parameter_parse +) else if /i "%1"=="--platform-target" ( + set PlatformTarget=%2 + SHIFT + SHIFT + Goto parameter_parse +)else if not "%1" == "" ( + echo unrecognized option [%1] + Goto terminate_error +) + +if defined vsgenerate ( + echo Build type is set to: MultiType. +) else ( + echo Build type is set to: %BuildType%. +) + + +setlocal + +call %init_env_cmd% --platform-target %PlatformTarget% + +echo Compiler is: %VSCMake% + +if defined vsgenerate ( + if /i "%PlatformTarget%" == "x64" ( + set generator=-G"%VSCMake% Win64" -T "v120" + ) else ( + set generator=-G"%VSCMake%" -T "v120" + ) + if not defined build_dir ( + set build_dir=%script_dir%\..\..\openvibe-sdk-build\vs-project-%PlatformTarget% + ) + if not defined install_dir ( + set install_dir=%script_dir%\..\..\openvibe-sdk-build\dist-%PlatformTarget% + ) +) else ( + set build_type="-DCMAKE_BUILD_TYPE=%BuildType%" + if not defined build_dir ( + set build_dir=%script_dir%\..\..\openvibe-sdk-build\build-%BuildType%-%PlatformTarget% + ) + if not defined install_dir ( + set install_dir=%script_dir%\..\..\openvibe-sdk-build\dist-%BuildType%-%PlatformTarget% + ) +) +if not defined ov_cmake_test_output ( + set ov_cmake_test_output=%build_dir%\validation-test-output\ +) + +mkdir %build_dir% 2>NUL +pushd %build_dir% + +set CallCmake=false + +if not exist "%build_dir%\CMakeCache.txt" set CallCmake="true" +if %RerunCmake%=="true" set CallCmake="true" +if %CallCmake%=="true" ( + cmake %script_dir%\.. %generator% ^ + %build_type% ^ + -DCMAKE_INSTALL_PREFIX=%install_dir% ^ + -DOV_PACKAGE=%PackageOption% ^ + -DOV_DISPLAY_ERROR_LOCATION=%DisplayErrorLocation% ^ + -DBUILD_UNIT_TEST=%ov_build_unit% ^ + -DBUILD_VALIDATION_TEST=%ov_build_validation% ^ + %ov_cmake_test_data% ^ + -DBRAND_NAME=%BrandName% ^ + %UserDataSubdir% ^ + -DOVT_VALIDATION_TEST_OUTPUT_DIR=%ov_cmake_test_output% ^ + %python_exec% ^ + %DependenciesPath% +) + +if not "!ERRORLEVEL!" == "0" goto terminate_error +if !builder! == None ( + goto terminate_success +) else if !builder! == Ninja ( + ninja install + if not "!ERRORLEVEL!" == "0" goto terminate_error +) else if !builder! == Visual ( + if %PlatformTarget% == x86 ( + set msplatform=Win32 + ) else ( + set msplatform=%PlatformTarget% + ) + msbuild OpenVIBE.sln /p:Configuration=%BuildType% /p:Platform="!msplatform!" + if not "!ERRORLEVEL!" == "0" goto terminate_error + + cmake --build . --config %BuildType% --target install + if not "!ERRORLEVEL!" == "0" goto terminate_error + +) +if %PackageOption% == TRUE ( + cmake --build . --target package + if not "!ERRORLEVEL!" == "0" goto terminate_error +) + +goto terminate_success + +:terminate_error + +echo An error occured during building process ! + +%PauseCommand% + +goto terminate + +:terminate_success + +%PauseCommand% + +goto terminate + +:terminate + +popd + +endlocal diff --git a/Masterarbeit/openvibe/sdk-master/scripts/windows-ctest-launcher.cmd-base b/Masterarbeit/openvibe/sdk-master/scripts/windows-ctest-launcher.cmd-base new file mode 100755 index 0000000..89fabab --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/windows-ctest-launcher.cmd-base @@ -0,0 +1,30 @@ +@echo off + +setlocal + +REM Set test environment +set OV_PATH_ROOT=@DIST_BINDIR_ABSOLUTE@\.. +set "PATH=@DIST_BINDIR_ABSOLUTE@;@OV_CUSTOM_DEPENDENCIES_PATH@\cmake\bin\;%PATH%" + +if /i "%1" == "--python-dir" ( + set "PYTHONHOME=" + set "PYTHONPATH=" + set "PATH=%2;%PATH%" + for /f "tokens=2,* delims= " %%a in ("%*") do set remaining_args=%%b +) else ( + set remaining_args=%* +) + +IF EXIST unit-test\NUL ( + PUSHD unit-test + REM Execute ctest forwarding the arguments + ctest %remaining_args% + POPD +) +IF EXIST validation-test\NUL ( + PUSHD validation-test + REM Execute ctest forwarding the arguments + ctest %remaining_args% + POPD +) + diff --git a/Masterarbeit/openvibe/sdk-master/scripts/windows-dependencies-x64.txt b/Masterarbeit/openvibe/sdk-master/scripts/windows-dependencies-x64.txt new file mode 100644 index 0000000..917e8ff --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/windows-dependencies-x64.txt @@ -0,0 +1,7 @@ +build/windows/boost_1.58_x64_vc120_dev.zip;boost;1.58 +build/windows/eigen-3.3.7.zip;eigen;3.3.7 +build/windows/expat_2.1.0.1_x64_vc120_dev.zip;expat;2.1.0.1 +build/windows/gtest_1.7.0_x64_vc120_dev.zip;gtest;1.7.0 +build/windows/pthread_2.9.1_x64_vc120_dev.zip;pthread;2.9.1 +build/windows/xerces-c_3.1.3_x64_vc120_dev.zip;xerces-c;3.1.3 +build/windows/vcredist_x64_vc120.zip;vcredist;1.0 diff --git a/Masterarbeit/openvibe/sdk-master/scripts/windows-dependencies-x86.txt b/Masterarbeit/openvibe/sdk-master/scripts/windows-dependencies-x86.txt new file mode 100644 index 0000000..e99cf78 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/windows-dependencies-x86.txt @@ -0,0 +1,7 @@ +build/windows/boost_1.58_x86_vc120_dev.zip;boost;1.58 +build/windows/eigen-3.3.7.zip;eigen;3.3.7 +build/windows/expat_2.1.0.1_x86_vc120_dev.zip;expat;2.1.0.1 +build/windows/gtest_1.7.0_x86_vc120_dev.zip;gtest;1.7.0 +build/windows/pthread_2.9.1_x86_vc120_dev.zip;pthread;2.9.1 +build/windows/xerces-c_3.1.3_x86_vc120_dev.zip;xerces-c;3.1.3 +build/windows/vcredist_x86_vc120.zip;vcredist;1.0 diff --git a/Masterarbeit/openvibe/sdk-master/scripts/windows-generate-vs-project.cmd b/Masterarbeit/openvibe/sdk-master/scripts/windows-generate-vs-project.cmd new file mode 100644 index 0000000..52352ca --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/windows-generate-vs-project.cmd @@ -0,0 +1,3 @@ +@echo off + +call windows-build.cmd --vsproject %* diff --git a/Masterarbeit/openvibe/sdk-master/scripts/windows-get-dependencies.ps1 b/Masterarbeit/openvibe/sdk-master/scripts/windows-get-dependencies.ps1 new file mode 100644 index 0000000..ed7f08b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/windows-get-dependencies.ps1 @@ -0,0 +1,269 @@ +<# +.SYNOPSIS + This script aims at installing dependencies from a manifest file. +.DESCRIPTION + Script workflow is as follows: + - Check for a cache directory + - Parse input dependencies manifest + - Download dependencies if: (Currently does not download!) + * cache found but dependency not found in the cache + * cache not found (old archives are overwritten) + - Extract dependencies in destination folder (old dependencies are overwritten) if: + * dependencies were never unzipped + * the version of unzipped dependency is correct (read from manifest version file) + - write manifest version file, named after the manifest file name and suffixed with "-version", + it contains the version of lastly unzipped dependencies such as: + folder_to_unzip=version_number + +.PARAMETER dependencies_file + The manifest file containing the required archives to install. + + First line is the base URL of the dependencies, following lines are formatted as: + archive_name;folder_to_unzip;version_number + archive_name;folder_to_unzip;version_number + ... + + The `folder_to_unzip` can be the same for several dependencies, but in this case you have to make sure + that the archives share the same `version_number`. + If this is not the case an error will be thrown. + +.PARAMETER dest_dir + Optional: if unspecified then by default it will be set to $script_root\..\dependencies + Destination directory for extracted archives. Each archive found in the manifest file + is extracted in 'dest_dir\folder_to_unzip'. + + Note that if no cache is found, archives are also downloaded in 'dest_dir\arch'. +.PARAMETER cache_dir + Cache directory for extracted archives. Each archive found in the manifest file + is extracted from cache_dir to 'dest_dir\folder_to_unzip'. + +.NOTES + File Name : windows-get-dependencies.ps1 + Prerequisite : Tested with PS v4.0 on windows 10 pro. + + Environment variables will be used if set: + * PROXYPASS: Used to set credentials, should be formed as user:passwd + * ZIP_EXECUTABLE: should be set to the path to 7zip executable. If unset, script will try to read registry keys. +.LINK + Detailed specifications: + https://jira.mensiatech.com/confluence/pages/viewpage.action?spaceKey=CT&title=Dependency+management +.EXAMPLE + powershell.exe -NoExit -NoProfile -ExecutionPolicy Bypass -File \absolute\path\to\windows-get-dependencies.ps1 -manifest_file .\windows-dependencies.txt +.EXAMPLE + powershell.exe -NoExit -NoProfile -ExecutionPolicy Bypass -File \absolute\path\to\windows-get-dependencies.ps1 -manifest_file .\windows-dependencies.txt + -dest_dir \absolute\path\to\dep\ -cache_dir \absolute\path\to\cache +#> + +# +# script parameters +# +Param( +[parameter(Mandatory=$true)][ValidateScript({Test-Path $_ })][string]$manifest_file, +[parameter(Mandatory=$false)][string]$cache_dir, +[parameter(Mandatory=$false)][ValidateNotNullOrEmpty()][string]$dest_dir = ".\..\dependencies" +) + +$manifest_file = [System.IO.Path]::GetFullPath($manifest_file) +$dest_dir = [System.IO.Path]::GetFullPath($dest_dir) + +# +# input validation +# +Write-Host "===Input validation===" +if (Test-Path $dest_dir){ + Write-Host "Destination directory found" +} else { + Write-Host "Destination directory not found" + New-Item $dest_dir -itemtype directory | Out-Null + Write-Host "Created destination directory: " $dest_dir +} + +# if -cache_dir is specified, use its value, otherwise check if an environment variable exists +if($cache_dir) { + Write-Host "Cache directory provided by parameter: $cache_dir" +} elseif ($env:DEPENDENCY_CACHE -and (Test-Path $env:DEPENDENCY_CACHE)) { + Write-Host "Found cache directory: " ($env:DEPENDENCY_CACHE) + $cache_dir = $env:DEPENDENCY_CACHE +} else { + $cache_dir = $dest_dir + "\arch" + Write-Host "Found no cache directory. Set it to default value: $cache_dir" +} +if(-Not (Test-Path $cache_dir)) { + New-Item $cache_dir -itemtype directory | Out-Null + Write-Host "Created archive directory in destination: " $cache_dir +} +Write-Host "All archives will be downloaded in " $cache_dir +Write-Host "" + +Write-Host "Configure Web client" + +# Base URL of dependency server is read in environment variable +$Script:dependency_server = $env:URL + +$WebClient = New-Object System.Net.WebClient +if($env:PROXYPASS){ + $Username, $Password = $env:PROXYPASS.split(':',2) + Write-Host "Credentials are provided. Try to download from server with username [$Username]." + $WebClient.Credentials = New-Object System.Net.Networkcredential($Username, $Password) +} else { + Write-Host "Credentials were not provided. If your dependencies are not up-to-date, you won't be able to download new files." +} +Write-Host "" + +if ($env:ZIP_EXECUTABLE) { + $Script:7zip_executable=$env:ZIP_EXECUTABLE +} else { + Try { + $Script:7zip_executable=(Get-ItemProperty HKLM:\Software\7-Zip).Path + "\7z.exe" + } Catch { + Write-Host "7-Zip was not found in register keys. Install it will fasten unzip." + } +} +if ($Script:7zip_executable -and (Test-Path $Script:7zip_executable)) { + Write-Host "Found 7-Zip in registry keys. It will be used to unzip archives." +} else { + Write-Host "7-Zip was not found in register keys. Install it will quicken the unzipping." + $Script:7zip_executable="" +} + +Write-Host "===Parameters===" +Write-Host "Dependencies file = $manifest_file" +Write-Host "Destination directory = $dest_dir" +Write-Host "" + +# +# script variables +# + +# monitoring variables +$Script:extract_count = 0 +$Script:download_count = 0 +$Script:new_versions = @{} + +# +# script functions +# + +function ExpandZipFile($zip, $dest) +{ + Write-Host "Extract: [" $zip "] -> [" $dest "]" + $shell = New-Object -ComObject Shell.Application + + if ([string]::IsNullOrEmpty($Script:7zip_executable)){ + # create dest if it does not exists + if(-Not (Test-Path $dest)) { + New-Item $dest -itemtype directory | Out-Null + } + + $zip = $zip -replace "/", "\" + $folder = $shell.NameSpace("$zip") + + # Progress based on count is pretty dumb. However + # the sizes retrieved by $folder.GetDetailsOf($item, 2) + # or $item.Size are unreliable. At least, it allows the script + # user to see something is going on. + $count = 0 + $total_count = $folder.Items().Count + ForEach($item in $folder.Items()) { + + $item_name = $folder.GetDetailsOf($item, 0) + $percent_complete = [System.Math]::Floor(100 * $count / $total_count) + Write-Progress ` + -Status "Progress: $percent_complete%" ` + -Activity ("Extracting " + (Split-Path -Leaf $zip) + " to " + (Split-Path -Leaf $dest)) ` + -CurrentOperation "Copying $item_name (this can take a long time...)" ` + -PercentComplete $percent_complete + + # 0x14 = sum of options 4 (donnot display windows box) and 16 (answer yes to all) + $shell.Namespace("$dest").CopyHere($item, 0x14) + + $count++ + } + } else { + $7z_Arguments = @( + 'x' ## extract files with full paths + '-y' ## assume Yes on all queries + $zip ## archive path + "`"-o$dest`"" ## dest path + + ) + & $7zip_executable $7z_Arguments + } + $Script:extract_count++ + +} + +function InstallDeps($arch, $dir, $version) +{ + $zip = $Script:cache_dir + "\" + $arch + + if(-Not (Test-Path $zip)) { + if($Username -and $Script:dependency_server){ + $url = $Script:dependency_server + "/" + $arch + } else { + Write-Error "- Credentials or $Script:dependency_server are not specified, can not download dependency. " + Write-Error "- They have to be set through environment variables: PROXYPASS and URL." + exit + } + + Write-Host "Download: [" $url "] -> [" $zip "]." + $Script:WebClient.DownloadFile( $url, $zip ) + $Script:download_count++ + } + if(-Not (Test-Path $zip)) { + Write-Error "Archive [$zip] was not found in cache and could not be downloaded." + exit + } + + if(Test-Path $dest_dir\$dir-version.txt) { + $old_dep_version=$(Get-Content $dest_dir\$dir-version.txt) + } + if((Test-Path ($Script:dest_dir + "\" + $dir)) -and ($old_dep_version -eq $version)) { + Write-Host "No need to unzip dependency. Already at the good version: " $old_dep_version "." + } else { + Write-Host "Dependency version is not the good one: [" $old_dep_version "]. Should be " $version + if((Test-Path ($Script:dest_dir + "\" + $dir)) -and (-Not $Script:new_versions.ContainsKey($dir))) { + Remove-item ($Script:dest_dir + "\" + $dir) -Force -Recurse + } + ExpandZipFile $zip ($Script:dest_dir + "\" + $dir) + } + # Add new version to table + if($Script:new_versions.ContainsKey($dir)) { + # If (during this install process) an archive was already extracted to this folder and its version is + # not the same as new version, we raise an error + if($Script:new_versions[$dir] -ne $version) { + Write-Error "- Several dependencies are extracted in the same folder with different versions. + You have to make sure that they carry the same version." + exit + } + } else { + $Script:new_versions.Add($dir, $version) + } +} + +# +# core script +# + +Write-Host "" +Write-Host "===Installing dependencies===" + +$Script:timer = [System.Diagnostics.Stopwatch]::StartNew() +foreach ($dep in Get-Content $manifest_file) { + $arch, $dir, $version = $dep.split(';',3) + InstallDeps $arch $dir $version +} +$timer.Stop() + +Write-Host "Write token version files, to quicken next dependencies " +foreach ($new_version in $Script:new_versions.GetEnumerator()) { + $new_version.Value > $dest_dir\$($new_version.Key)-version.txt +} + +Write-Host "" +Write-Host "===Install Summary===" +Write-Host "State = Success" +Write-Host "Number of archives downloaded = $Script:download_count" +Write-Host "Number of archives extracted = $Script:extract_count" +Write-Host "Installation time = " $([string]::Format("{0:d2}h:{1:d2}mn:{2:d2}s", $timer.Elapsed.hours, $timer.Elapsed.minutes, $timer.Elapsed.seconds)) -nonewline +Write-Host "" diff --git a/Masterarbeit/openvibe/sdk-master/scripts/windows-initialize-environment.cmd b/Masterarbeit/openvibe/sdk-master/scripts/windows-initialize-environment.cmd new file mode 100644 index 0000000..9cb98ee --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/windows-initialize-environment.cmd @@ -0,0 +1,115 @@ +@echo off + +set PATH=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin;%PATH% +set "SCRIPT_PATH=%~dp0" + +:parameter_parse + +if /i "%1" == "--dependencies-dir" ( + set "PATH_DEPENDENCIES=%2" + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1" == "--platform-target" ( + if "%2"=="x64" ( + set PLATFORM=x64 + set VSPLATFORMGENERATOR=Win64 + ) else if "%2"=="x86" ( + set PLATFORM=x86 + set VSPLATFORMGENERATOR= + ) else ( + echo Unknown platform %2 target + Goto terminate + ) + SHIFT + SHIFT + + Goto parameter_parse +) else if not "%1" == "" ( + echo unrecognized option [%1] + Goto terminate_error +) + +if not defined PATH_DEPENDENCIES ( + if %PLATFORM%==x64 ( + SET "PATH_DEPENDENCIES=%SCRIPT_PATH%../dependencies_x64" + ) else ( + SET "PATH_DEPENDENCIES=%SCRIPT_PATH%../dependencies" + ) +) + +set PATH=%PATH_DEPENDENCIES%/boost/bin;%PATH% +set PATH=%PATH_DEPENDENCIES%/cmake/bin;%PATH% +set PATH=%PATH_DEPENDENCIES%/expat/bin;%PATH% +set PATH=%PATH_DEPENDENCIES%/ninja;%PATH% +set PATH=%PATH_DEPENDENCIES%/tvicport/bin;%PATH% +set PATH=%PATH_DEPENDENCIES%/vcredist;%PATH% +set PATH=%PATH_DEPENDENCIES%/zip;%PATH% +set PATH=%PATH_DEPENDENCIES%/xerces-c/lib;%PATH% + +REM ######################################################################################################################## + +REM # Set to 1 to skip new compilers. +if not defined SKIP_VS2017 ( + SET SKIP_VS2017=1 +) +if not defined SKIP_VS2015 ( + SET SKIP_VS2015=1 +) +if not defined SKIP_VS2013 ( + SET SKIP_VS2013=0 +) + +SET VSTOOLS= +SET VSCMake= +set VCVARSALLPATH=../../VC/vcvarsall.bat + +if %SKIP_VS2017% == 0 ( + set "VSTOOLS=%VS150COMNTOOLS%" + set VSCMake=Visual Studio 15 2017 +) else if %SKIP_VS2015% == 0 ( + echo Visual Studio 2017 detection skipped as requested + set "VSTOOLS=%VS140COMNTOOLS%" + set VSCMake=Visual Studio 14 2015 +) else ( + echo Visual Studio 2017 detection skipped as requested + echo Visual Studio 2015 detection skipped as requested + set "VSTOOLS=%VS120COMNTOOLS%" + set VSCMake=Visual Studio 12 2013 +) + +echo VStools: %VSTOOLS%, VSCMake: %VSCMake%. +if exist "!VSTOOLS!%VCVARSALLPATH%" ( + if %PlatformTarget% == x64 ( + if exist "!VSTOOLS!../../VC/bin/x64" ( + echo Found %VSCMake% tools: !VSTOOLS!%VCVARSALLPATH% %PlatformTarget% + call "!VSTOOLS!%VCVARSALLPATH%" %PlatformTarget% + ) else ( + echo Found %VSCMake% tools: !VSTOOLS!%VCVARSALLPATH% x86_amd64 + call "!VSTOOLS!%VCVARSALLPATH%" x86_amd64 + ) + ) else ( + echo Found %VSCMake% tools: !VSTOOLS!vsvars32.bat + call "!VSTOOLS!vsvars32.bat" + ) + goto terminate +) + +set VSCMake=!VSCMake! %VSPLATFORMGENERATOR% + +goto terminate_success + +:terminate_error + +echo An error occured during environment initializing ! + +pause +exit 1 + +REM ####################################################################################### +:terminate_success + +goto terminate + +REM ####################################################################################### +:terminate diff --git a/Masterarbeit/openvibe/sdk-master/scripts/windows-install-dependencies-all-x64.cmd b/Masterarbeit/openvibe/sdk-master/scripts/windows-install-dependencies-all-x64.cmd new file mode 100644 index 0000000..bc6a3b4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/windows-install-dependencies-all-x64.cmd @@ -0,0 +1,23 @@ +REM Install OV SDK dependencies +REM This script can be copied, renamed as `windows-install-dependencies-custom.cmd` +REM and updated with the right credentials in PROXYPASS, such as username:password +REM +@echo off + +echo Install all dependencies + +REM In order to download dependencies, PROXYPASS must be changed with appropriate credentials +REM set PROXYPASS=XXX:XXX +set URL=https://extranet.mensiatech.com/dependencies + +if not exist "..\dependencies_x64\arch\build\windows" ( mkdir "..\dependencies_x64\arch\build\windows" ) +if not exist "..\dependencies\arch\data" ( mkdir "..\dependencies\arch\data" ) + +REM Install build tools, CMake, Ninja, comment line if you already have an instance of CMake installed +powershell.exe -NoProfile -ExecutionPolicy Bypass -file "windows-get-dependencies.ps1" -manifest_file .\windows-build-tools.txt -dest_dir .\..\dependencies_x64 +REM Install OV SDK dependencies +powershell.exe -NoProfile -ExecutionPolicy Bypass -file "windows-get-dependencies.ps1" -manifest_file .\windows-dependencies-x64.txt -dest_dir .\..\dependencies_x64 +REM Retrieve test data +powershell.exe -NoProfile -ExecutionPolicy Bypass -file "windows-get-dependencies.ps1" -manifest_file .\tests-data.txt + +pause diff --git a/Masterarbeit/openvibe/sdk-master/scripts/windows-install-dependencies-all.cmd b/Masterarbeit/openvibe/sdk-master/scripts/windows-install-dependencies-all.cmd new file mode 100644 index 0000000..db09186 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/windows-install-dependencies-all.cmd @@ -0,0 +1,23 @@ +REM Install OV SDK dependencies +REM This script can be copied, renamed as `windows-install-dependencies-custom.cmd` +REM and updated with the right credentials in PROXYPASS, such as username:password +REM +@echo off + +echo Install all dependencies + +REM In order to download dependencies, PROXYPASS must be changed with appropriate credentials +REM set PROXYPASS=XXX:XXX +set URL=https://extranet.mensiatech.com/dependencies + +if not exist "..\dependencies\arch\build\windows" ( mkdir "..\dependencies\arch\build\windows" ) +if not exist "..\dependencies\arch\data" ( mkdir "..\dependencies\arch\data" ) + +REM Install build tools, CMake, Ninja, comment line if you already have an instance of CMake installed +powershell.exe -NoProfile -ExecutionPolicy Bypass -file "windows-get-dependencies.ps1" -manifest_file .\windows-build-tools.txt +REM Install OV SDK dependencies +powershell.exe -NoProfile -ExecutionPolicy Bypass -file "windows-get-dependencies.ps1" -manifest_file .\windows-dependencies-x86.txt +REM Retrieve test data +powershell.exe -NoProfile -ExecutionPolicy Bypass -file "windows-get-dependencies.ps1" -manifest_file .\tests-data.txt + +pause diff --git a/Masterarbeit/openvibe/sdk-master/scripts/windows-launch-visual-studio-debug.cmd b/Masterarbeit/openvibe/sdk-master/scripts/windows-launch-visual-studio-debug.cmd new file mode 100644 index 0000000..b54823d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/windows-launch-visual-studio-debug.cmd @@ -0,0 +1,3 @@ +@echo off + +call windows-launch-visual-studio.cmd --debug diff --git a/Masterarbeit/openvibe/sdk-master/scripts/windows-launch-visual-studio.cmd b/Masterarbeit/openvibe/sdk-master/scripts/windows-launch-visual-studio.cmd new file mode 100644 index 0000000..7ed6f84 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/scripts/windows-launch-visual-studio.cmd @@ -0,0 +1,64 @@ +@echo off +setlocal EnableDelayedExpansion +setlocal enableextensions + +pushd %~dp0\.. +set root_dir=%CD% +popd + +set VerboseOuptut=OFF +set PlatformTarget=x86 +set PATH_DEPENDENCIES= + +set BuildType=Release + +goto parameter_parse + +:print_help + echo Usage: windows-launch-visual-studio.cmd [--debug] [--dependencies-dir ^] + exit /b + +:parameter_parse +if /i "%1" == "--dependencies-dir" ( + set "PATH_DEPENDENCIES=%2" + SHIFT + SHIFT + Goto parameter_parse +) else if /i "%1"=="--debug" ( + set BuildType=Debug + SHIFT +) else if /i "%1" == "--platform-target" ( + if "%2"=="x64" ( + set PlatformTarget=%2 + SHIFT + SHIFT + + Goto parameter_parse + ) +) + + +call "windows-initialize-environment.cmd" --platform-target %PlatformTarget% + +SET "OV_PATH_ROOT=%root_dir%\..\openvibe-sdk-build\dist-%PlatformTarget%" +SET "PATH=%OV_PATH_ROOT%\bin;%PATH%" + +REM for visual studio express... +if not defined USE_EXPRESS ( + SET USE_EXPRESS=1 +) + +set SolutionPath=%root_dir%\..\openvibe-sdk-build\vs-project-%PlatformTarget%\OpenViBE.sln + +if %USE_EXPRESS% == 1 ( + echo Use %VSCMake% Express Edition + + if "%VSCMake%"=="Visual Studio 12 2013" ( + start /b "%VSINSTALLDIR%\Common7\IDE\WDExpress.exe" %SolutionPath% + ) else ( + "%VSINSTALLDIR%\Common7\IDE\VCExpress.exe" %SolutionPath% + ) +) else ( + echo Use %VSCMake% Community Edition + "%VSINSTALLDIR%\Common7\IDE\devenv.exe" %SolutionPath% +) diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/toolkit/CMakeLists.txt new file mode 100644 index 0000000..b6f7540 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/CMakeLists.txt @@ -0,0 +1,80 @@ +PROJECT(openvibe-toolkit) +OV_ADD_THIS_TO_PROJECT_LIST() + +SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OV_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OV_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + + +# Command to generate cpp compliant stimulation files from text file +# Creating output directories is mandatory as it is not handled by ADD_CUSTOM_COMMAND +FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/toolkit) +FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/src) +ADD_CUSTOM_COMMAND( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/include/toolkit/ovtk_stimulations.h ${CMAKE_CURRENT_BINARY_DIR}/src/ovtk_stimulations.cpp + DEPENDS openvibe-stimulation-generator ${CMAKE_CURRENT_SOURCE_DIR}/share/stimulation_list.txt + COMMAND openvibe-stimulation-generator + --cpp + ${CMAKE_CURRENT_SOURCE_DIR}/share/stimulation_list.txt + ${CMAKE_CURRENT_BINARY_DIR}/include/toolkit/ovtk_stimulations.h + ${CMAKE_CURRENT_BINARY_DIR}/src/ovtk_stimulations.cpp + COMMENT "Generating stimulation sources..." ) + +# ADD_CUSTOM_TARGET will automatically trigger the command defined above +# as it depends on its outputs +ADD_CUSTOM_TARGET(openvibe-generate-stimulation-file + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/include/toolkit/ovtk_stimulations.h ${CMAKE_CURRENT_BINARY_DIR}/src/ovtk_stimulations.cpp) + +FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl src/*.hpp include/*.h) +INCLUDE("FindSourceRCProperties") + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/toolkit/algorithms/scenario-io) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/toolkit/algorithms/classification) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/toolkit/deprecated/writer) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/toolkit/deprecated/reader) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/toolkit/training) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include/toolkit/tools) + +# add binary directory to includes as it contains generated stimulation header +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/include/) + +ADD_LIBRARY(${PROJECT_NAME} SHARED + ${SRC_FILES} + ${CMAKE_CURRENT_BINARY_DIR}/include/toolkit/ovtk_stimulations.h + ${CMAKE_CURRENT_BINARY_DIR}/src/ovtk_stimulations.cpp + ) +ADD_DEPENDENCIES(${PROJECT_NAME} openvibe-generate-stimulation-file) + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${KERNEL_FOLDER} + COMPILE_FLAGS "-DOVTK_Exports -DOVTK_Shared") + +# --------------------------------- +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEModuleEBML") +INCLUDE("FindOpenViBEModuleXML") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindThirdPartyBoost_FileSystem") + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ----------------------------- +# Install files +# ----------------------------- +INSTALL(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ ${CMAKE_CURRENT_BINARY_DIR}/include/ DESTINATION ${DIST_INCLUDEDIR} FILES_MATCHING PATTERN "*.h") +INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/toolkit PATTERN "*-base" EXCLUDE) + diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/classification/ovtkCAlgorithmClassifier.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/classification/ovtkCAlgorithmClassifier.h new file mode 100644 index 0000000..dcbd1cc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/classification/ovtkCAlgorithmClassifier.h @@ -0,0 +1,105 @@ +#pragma once + +#include +#include "../../ovtk_defines.h" +#include "../../ovtkIVector.h" +#include "../../ovtkIFeatureVector.h" +#include "../../ovtkIFeatureVectorSet.h" +#include "../ovtkTAlgorithm.h" + +#include + +#define OVTK_ClassId_Algorithm_Classifier OpenViBE::CIdentifier(0x3B910935, 0xE4DBACC4) +#define OVTK_ClassId_Algorithm_ClassifierDesc OpenViBE::CIdentifier(0xFDB84F2F, 0x2F5C510D) + +#define OVTK_Algorithm_Classifier_InputParameterId_FeatureVector OpenViBE::CIdentifier(0x6D69BF98, 0x1EB9EE66) // Single vector to classify +#define OVTK_Algorithm_Classifier_InputParameterId_FeatureVectorSet OpenViBE::CIdentifier(0x27C05927, 0x5DE9103A) // Training set +#define OVTK_Algorithm_Classifier_InputParameterId_Config OpenViBE::CIdentifier(0xA705428E, 0x5BB1CADD) // The model +#define OVTK_Algorithm_Classifier_InputParameterId_NClasses OpenViBE::CIdentifier(0x1B95825A, 0x24F2E949) +#define OVTK_Algorithm_Classifier_InputParameterId_ExtraParameter OpenViBE::CIdentifier(0x42AD6BE3, 0xF483DE3F) // Params specific to classifier type + +#define OVTK_Algorithm_Classifier_OutputParameterId_Class OpenViBE::CIdentifier(0x8A39A7EA, 0xF2EE45C4) +#define OVTK_Algorithm_Classifier_OutputParameterId_ClassificationValues OpenViBE::CIdentifier(0xDA77D7E4, 0x766B48EA) +#define OVTK_Algorithm_Classifier_OutputParameterId_ProbabilityValues OpenViBE::CIdentifier(0xDA77D7E4, 0x766B48EB) +#define OVTK_Algorithm_Classifier_OutputParameterId_Config OpenViBE::CIdentifier(0x30590936, 0x61CE5971) + +#define OVTK_Algorithm_Classifier_InputTriggerId_Train OpenViBE::CIdentifier(0x34684752, 0x78A46DE2) +#define OVTK_Algorithm_Classifier_InputTriggerId_Classify OpenViBE::CIdentifier(0x843A87D8, 0x566E85A1) +#define OVTK_Algorithm_Classifier_InputTriggerId_SaveConfig OpenViBE::CIdentifier(0x79750528, 0x6CC85FC1) +#define OVTK_Algorithm_Classifier_InputTriggerId_LoadConfig OpenViBE::CIdentifier(0xF346BBE0, 0xADAFC735) + +#define OVTK_Algorithm_Classifier_OutputTriggerId_Success OpenViBE::CIdentifier(0x24FAB755, 0x78868782) +#define OVTK_Algorithm_Classifier_OutputTriggerId_Failed OpenViBE::CIdentifier(0x6E72B255, 0x317FAA04) + +namespace OpenViBE { +namespace Toolkit { +class OVTK_API CAlgorithmClassifier : public TAlgorithm +{ +public: + bool initialize() override; + bool uninitialize() override; + void release() override { delete this; } + bool process() override; + + virtual bool train(const IFeatureVectorSet& featureVectorSet) = 0; + virtual bool classify(const IFeatureVector& featureVector, double& estimatedClass, IVector& distanceValue, IVector& probabilityValue) = 0; + + virtual XML::IXMLNode* saveConfig() = 0; + virtual bool loadConfig(XML::IXMLNode* configurationRoot) = 0; + + virtual size_t getNProbabilities() = 0; + virtual size_t getNDistances() = 0; + + _IsDerivedFromClass_(TAlgorithm, OVTK_ClassId_Algorithm_Classifier) + +protected: + bool initializeExtraParameterMechanism(); + bool uninitializeExtraParameterMechanism(); + + uint64_t getUInt64Parameter(const CIdentifier& parameterID); + int64_t getInt64Parameter(const CIdentifier& parameterID); + double getDoubleParameter(const CIdentifier& parameterID); + bool getBooleanParameter(const CIdentifier& parameterID); + CString* getCStringParameter(const CIdentifier& parameterID); + uint64_t getEnumerationParameter(const CIdentifier& parameterID, const CIdentifier& enumerationIdentifier); + +private: + CString& getParameterValue(const CIdentifier& parameterID) const; + static void setMatrixOutputDimension(Kernel::TParameterHandler& matrix, size_t length); + + Kernel::IAlgorithmProxy* m_AlgorithmProxy = nullptr; + void* m_ExtraParametersMap = nullptr; +}; + +class OVTK_API CAlgorithmClassifierDesc : public Plugins::IAlgorithmDesc +{ +public: + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& algorithmPrototype) const override + { + algorithmPrototype.addInputParameter(OVTK_Algorithm_Classifier_InputParameterId_FeatureVector, "Feature vector", Kernel::ParameterType_Matrix); + algorithmPrototype.addInputParameter(OVTK_Algorithm_Classifier_InputParameterId_FeatureVectorSet, "Feature vector set", Kernel::ParameterType_Matrix); + algorithmPrototype.addInputParameter(OVTK_Algorithm_Classifier_InputParameterId_Config, "Configuration", Kernel::ParameterType_Pointer); + algorithmPrototype.addInputParameter(OVTK_Algorithm_Classifier_InputParameterId_NClasses, "Number of classes", Kernel::ParameterType_UInteger); + algorithmPrototype.addInputParameter(OVTK_Algorithm_Classifier_InputParameterId_ExtraParameter, "Extra parameter", Kernel::ParameterType_Pointer); + + algorithmPrototype.addOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Class, "Class", Kernel::ParameterType_Float); + algorithmPrototype.addOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_ClassificationValues, "Hyperplane distance", Kernel::ParameterType_Matrix); + algorithmPrototype.addOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_ProbabilityValues, "Probability values", Kernel::ParameterType_Matrix); + algorithmPrototype.addOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Config, "Configuration", Kernel::ParameterType_Pointer); + + algorithmPrototype.addInputTrigger(OVTK_Algorithm_Classifier_InputTriggerId_Train, "Train"); + algorithmPrototype.addInputTrigger(OVTK_Algorithm_Classifier_InputTriggerId_Classify, "Classify"); + algorithmPrototype.addInputTrigger(OVTK_Algorithm_Classifier_InputTriggerId_LoadConfig, "Load configuration"); + algorithmPrototype.addInputTrigger(OVTK_Algorithm_Classifier_InputTriggerId_SaveConfig, "Save configuration"); + + algorithmPrototype.addOutputTrigger(OVTK_Algorithm_Classifier_OutputTriggerId_Success, "Success"); + algorithmPrototype.addOutputTrigger(OVTK_Algorithm_Classifier_OutputTriggerId_Failed, "Failed"); + + + return true; + } + + _IsDerivedFromClass_(Plugins::IAlgorithmDesc, OVTK_ClassId_Algorithm_ClassifierDesc) +}; +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/classification/ovtkCAlgorithmClassifierTrainer.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/classification/ovtkCAlgorithmClassifierTrainer.h new file mode 100644 index 0000000..557e88c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/classification/ovtkCAlgorithmClassifierTrainer.h @@ -0,0 +1,45 @@ +#pragma once + +#include "../ovtkTAlgorithm.h" +#include "../../ovtkIFeatureVectorSet.h" + +#define OVTK_ClassId_Algorithm_ClassifierTrainer OpenViBE::CIdentifier(0x5ABC21E6, 0x3C3D349B) +#define OVTK_ClassId_Algorithm_ClassifierTrainerDesc OpenViBE::CIdentifier(0x56DD6401, 0x07033341) +#define OVTK_Algorithm_ClassifierTrainer_InputParameterId_FeatureVectorSet OpenViBE::CIdentifier(0x27C05927, 0x5DE9103A) +#define OVTK_Algorithm_ClassifierTrainer_OutputParameterId_Config OpenViBE::CIdentifier(0x30590936, 0x61CE5971) +#define OVTK_Algorithm_ClassifierTrainer_InputTriggerId_Train OpenViBE::CIdentifier(0x34684752, 0x78A46DE2) +#define OVTK_Algorithm_ClassifierTrainer_InputTriggerId_SaveConfig OpenViBE::CIdentifier(0x79750528, 0x6CC85FC1) +#define OVTK_Algorithm_ClassifierTrainer_OutputTriggerId_Success OpenViBE::CIdentifier(0x7B8C0EFF, 0x26224D6B) +#define OVTK_Algorithm_ClassifierTrainer_OutputTriggerId_Failed OpenViBE::CIdentifier(0x31B97C83, 0x59015D0E) + +namespace OpenViBE { +namespace Toolkit { +class OVTK_API CAlgorithmClassifierTrainer : public TAlgorithm +{ +public: + void release() override { delete this; } + bool process() override; + virtual bool train(const IFeatureVectorSet& dataset) = 0; + virtual bool saveConfig(IMemoryBuffer& buffer) = 0; + + _IsDerivedFromClass_(TAlgorithm < Plugins::IAlgorithm >, OVTK_ClassId_Algorithm_ClassifierTrainer) +}; + +class OVTK_API CAlgorithmClassifierTrainerDesc : public Plugins::IAlgorithmDesc +{ +public: + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + prototype.addInputParameter(OVTK_Algorithm_ClassifierTrainer_InputParameterId_FeatureVectorSet, "Feature vector set", Kernel::ParameterType_Matrix); + prototype.addOutputParameter(OVTK_Algorithm_ClassifierTrainer_OutputParameterId_Config, "Configuration", Kernel::ParameterType_MemoryBuffer); + prototype.addInputTrigger(OVTK_Algorithm_ClassifierTrainer_InputTriggerId_Train, "Train"); + prototype.addInputTrigger(OVTK_Algorithm_ClassifierTrainer_InputTriggerId_SaveConfig, "Save configuration"); + prototype.addOutputTrigger(OVTK_Algorithm_ClassifierTrainer_OutputTriggerId_Success, "Success"); + prototype.addOutputTrigger(OVTK_Algorithm_ClassifierTrainer_OutputTriggerId_Failed, "Failed"); + return true; + } + + _IsDerivedFromClass_(Plugins::IAlgorithmDesc, OVTK_ClassId_Algorithm_ClassifierTrainerDesc) +}; +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/classification/ovtkCAlgorithmPairingStrategy.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/classification/ovtkCAlgorithmPairingStrategy.h new file mode 100644 index 0000000..9f87e8a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/classification/ovtkCAlgorithmPairingStrategy.h @@ -0,0 +1,60 @@ +#pragma once + +#include "../ovtkTAlgorithm.h" +#include "../../ovtkIVector.h" +#include "../../ovtkIFeatureVector.h" +#include "../../ovtkIFeatureVectorSet.h" +#include "ovtkCAlgorithmClassifier.h" + +#define OVTK_ClassId_Algorithm_PairingStrategy OpenViBE::CIdentifier(0xFD3CB444, 0x58F00765) +#define OVTK_ClassId_Algorithm_PairingStrategyDesc OpenViBE::CIdentifier(0x4341B8D6, 0xC65B7BBB) + +#define OVTK_Algorithm_PairingStrategy_InputParameterId_SubClassifierAlgorithm OpenViBE::CIdentifier(0xD9E60DF9, 0x20EC8FC9) +#define OVTK_Algorithm_PairingStrategy_InputTriggerId_DesignArchitecture OpenViBE::CIdentifier(0x784A9CDF, 0xA41C27F8) + +typedef int (*fClassifierComparison)(OpenViBE::CMatrix&, OpenViBE::CMatrix&); + +namespace OpenViBE { +namespace Toolkit { +extern OVTK_API void registerClassificationComparisonFunction(const CIdentifier& classID, fClassifierComparison comparision); +extern OVTK_API fClassifierComparison getClassificationComparisonFunction(const CIdentifier& classID); + + +class OVTK_API CAlgorithmPairingStrategy : public CAlgorithmClassifier +{ +public: + bool process() override; + void release() override { delete this; } + + virtual bool designArchitecture(const CIdentifier& id, const size_t nClass) = 0; + bool train(const IFeatureVectorSet& rFeatureVectorSet) override = 0; + bool classify(const IFeatureVector& rFeatureVector, double& classId, IVector& distance, IVector& probability) override = 0; + XML::IXMLNode* saveConfig() override = 0; + bool loadConfig(XML::IXMLNode* pConfiguratioNode) override = 0; + _IsDerivedFromClass_(CAlgorithmClassifier, OVTK_ClassId_Algorithm_PairingStrategy) + size_t getNProbabilities() override = 0; + size_t getNDistances() override = 0; + + +protected: + // std::vector m_classes; + //The vector will be use when the user will be able to specify class label + CIdentifier m_subClassifierAlgorithmID = CIdentifier::undefined(); +}; + +class OVTK_API CAlgorithmPairingStrategyDesc : public CAlgorithmClassifierDesc +{ +public: + bool getAlgorithmPrototype(Kernel::IAlgorithmProto& prototype) const override + { + CAlgorithmClassifierDesc::getAlgorithmPrototype(prototype); + prototype.addInputParameter( + OVTK_Algorithm_PairingStrategy_InputParameterId_SubClassifierAlgorithm, "Algorithm Identifier", Kernel::ParameterType_Identifier); + prototype.addInputTrigger(OVTK_Algorithm_PairingStrategy_InputTriggerId_DesignArchitecture, "Design Architecture"); + return true; + } + + _IsDerivedFromClass_(CAlgorithmClassifierDesc, OVTK_ClassId_Algorithm_PairingStrategyDesc) +}; +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/ovtkTAlgorithm.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/ovtkTAlgorithm.h new file mode 100644 index 0000000..9bd5b10 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/ovtkTAlgorithm.h @@ -0,0 +1,97 @@ +#pragma once + +#include "../ovtk_base.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TAlgorithm : public TAlgorithmParentClass +{ +public: + + TAlgorithm() { } + + bool initialize(Kernel::IAlgorithmContext& algorithmCtx) override + { + CScopedAlgorithm scopedAlgorithm(m_algorithmCtx, &algorithmCtx); + return initialize(); + } + + bool uninitialize(Kernel::IAlgorithmContext& algorithmCtx) override + { + CScopedAlgorithm scopedAlgorithm(m_algorithmCtx, &algorithmCtx); + return uninitialize(); + } + + bool process(Kernel::IAlgorithmContext& algorithmCtx) override + { + CScopedAlgorithm scopedAlgorithm(m_algorithmCtx, &algorithmCtx); + return process(); + } + + // ==================================================================================================================================== + + virtual bool initialize() { return true; } + virtual bool uninitialize() { return true; } + virtual bool process() = 0; + + // ==================================================================================================================================== + + virtual Kernel::IAlgorithmContext& getAlgorithmContext() + { + return *m_algorithmCtx; // should never be null + } + +protected: + + virtual Kernel::IConfigurationManager& getConfigurationManager() { return m_algorithmCtx->getConfigurationManager(); } // should never be null + virtual Kernel::IAlgorithmManager& getAlgorithmManager() { return m_algorithmCtx->getAlgorithmManager(); } // should never be null + virtual Kernel::ILogManager& getLogManager() { return m_algorithmCtx->getLogManager(); } // should never be null + virtual Kernel::IErrorManager& getErrorManager() { return m_algorithmCtx->getErrorManager(); } // should never be null + virtual Kernel::ITypeManager& getTypeManager() { return m_algorithmCtx->getTypeManager(); } // should never be null + + virtual CIdentifier getNextInputParameterIdentifier(const CIdentifier& rPreviousInputParameterIdentifier) const + { + return m_algorithmCtx->getNextInputParameterIdentifier(rPreviousInputParameterIdentifier); + } + + virtual Kernel::IParameter* getInputParameter(const CIdentifier& InputParameterID) { return m_algorithmCtx->getInputParameter(InputParameterID); } + + virtual CIdentifier getNextOutputParameterIdentifier(const CIdentifier& rPreviousOutputParameterIdentifier) const + { + return m_algorithmCtx->getNextOutputParameterIdentifier(rPreviousOutputParameterIdentifier); + } + + virtual Kernel::IParameter* getOutputParameter(const CIdentifier& outputParameterID) { return m_algorithmCtx->getOutputParameter(outputParameterID); } + + virtual bool isInputTriggerActive(const CIdentifier& inputTriggerID) const { return m_algorithmCtx->isInputTriggerActive(inputTriggerID); } + + virtual bool activateOutputTrigger(const CIdentifier& outputTriggerID, const bool bTriggerState) + { + return m_algorithmCtx->activateOutputTrigger(outputTriggerID, bTriggerState); + } + + // ==================================================================================================================================== + + _IsDerivedFromClass_(TAlgorithmParentClass, OVTK_ClassId_) + +private: + + class CScopedAlgorithm final + { + public: + + CScopedAlgorithm(Kernel::IAlgorithmContext*& algorithmCtxRef, Kernel::IAlgorithmContext* algorithmCtx) + : m_algorithmCtx(algorithmCtxRef) { m_algorithmCtx = algorithmCtx; } + + ~CScopedAlgorithm() { m_algorithmCtx = nullptr; } + + protected: + + Kernel::IAlgorithmContext*& m_algorithmCtx; + }; + + Kernel::IAlgorithmContext* m_algorithmCtx = nullptr; +}; +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/scenario-io/ovtkCAlgorithmScenarioExporter.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/scenario-io/ovtkCAlgorithmScenarioExporter.h new file mode 100644 index 0000000..a7c9c1d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/scenario-io/ovtkCAlgorithmScenarioExporter.h @@ -0,0 +1,29 @@ +#pragma once + +#include "../ovtkTAlgorithm.h" +#include "ovtk_scenario_io.h" + +#include + +#define OVTK_ClassId_Algorithm_ScenarioExporter OpenViBE::CIdentifier(0x7C281FEA, 0x40B66277) +#define OVTK_ClassId_Algorithm_ScenarioExporterDesc OpenViBE::CIdentifier(0x49A9778E, 0x7BB377F9) + +namespace OpenViBE { +namespace Toolkit { +class OVTK_API CAlgorithmScenarioExporter : public TAlgorithm +{ +public: + void release() override { delete this; } + bool process() override; + + _IsDerivedFromClass_Final_(TAlgorithm, OVTK_ClassId_Algorithm_ScenarioExporter) +}; + +class OVTK_API CAlgorithmScenarioExporterDesc : public Plugins::IAlgorithmScenarioExporterDesc +{ +public: + + _IsDerivedFromClass_(Plugins::IAlgorithmScenarioExporterDesc, OVTK_ClassId_Algorithm_ScenarioExporterDesc) +}; +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/scenario-io/ovtkCAlgorithmScenarioImporter.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/scenario-io/ovtkCAlgorithmScenarioImporter.h new file mode 100644 index 0000000..f448625 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/scenario-io/ovtkCAlgorithmScenarioImporter.h @@ -0,0 +1,28 @@ +#pragma once + +#include "../ovtkTAlgorithm.h" +#include "ovtk_scenario_io.h" +#include + +#define OVP_ClassId_Algorithm_ScenarioImporter OpenViBE::CIdentifier(0x1EE72169, 0x2BF146C1) +#define OVP_ClassId_Algorithm_ScenarioImporterDesc OpenViBE::CIdentifier(0x503C0DDE, 0x5D4C6CB2) + +namespace OpenViBE { +namespace Toolkit { +class OVTK_API CAlgorithmScenarioImporter : public TAlgorithm +{ +public: + void release() override { delete this; } + bool process() override; + + _IsDerivedFromClass_(TAlgorithm, OVP_ClassId_Algorithm_ScenarioImporter) +}; + +class OVTK_API CAlgorithmScenarioImporterDesc : public Plugins::IAlgorithmScenarioImporterDesc +{ +public: + + _IsDerivedFromClass_(Plugins::IAlgorithmScenarioImporterDesc, OVP_ClassId_Algorithm_ScenarioImporterDesc) +}; +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/scenario-io/ovtk_scenario_io.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/scenario-io/ovtk_scenario_io.h new file mode 100644 index 0000000..09cf6e2 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/algorithms/scenario-io/ovtk_scenario_io.h @@ -0,0 +1,99 @@ +#pragma once + +#define OVTK_Algorithm_ScenarioExporter_NodeId_OpenViBEScenario OpenViBE::CIdentifier(0x1CD93114, 0x6A544E8C) + +#define OVTK_Algorithm_ScenarioExporter_NodeId_FormatVersion OpenViBE::CIdentifier(0xB7818440, 0x928C3366) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Creator OpenViBE::CIdentifier(0x430C9234, 0x4825E245) +#define OVTK_Algorithm_ScenarioExporter_NodeId_CreatorVersion OpenViBE::CIdentifier(0x1B01311A, 0x2405842B) + +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Settings OpenViBE::CIdentifier(0x1B6A0E61, 0x34BC6357) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting OpenViBE::CIdentifier(0x54312696, 0x2FC005A4) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_ID OpenViBE::CIdentifier(0x1845EA8E, 0x424AC232) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_TypeID OpenViBE::CIdentifier(0x1881283E, 0x4E361232) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_Name OpenViBE::CIdentifier(0x444114FB, 0x0B4C574A) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_Value OpenViBE::CIdentifier(0x6D2B69EA, 0x74B95C99) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_DefaultValue OpenViBE::CIdentifier(0x29C51ACB, 0x494D5778) + + +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Inputs OpenViBE::CIdentifier(0x0D7B4C71, 0x3B6F537F) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input OpenViBE::CIdentifier(0x62275FDD, 0x1F1E57E0) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_ID OpenViBE::CIdentifier(0xFC45833A, 0xEE785EA2) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_TypeID OpenViBE::CIdentifier(0x2AFF56A1, 0x4D2D03E3) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_Name OpenViBE::CIdentifier(0x3CA137F2, 0x60CB338E) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_LinkedBoxID OpenViBE::CIdentifier(0x30780A0D, 0x03641BCC) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_LinkedBoxInputIdx OpenViBE::CIdentifier(0x413A5131, 0x7BFA1941) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_LinkedBoxInputID OpenViBE::CIdentifier(0x81AF5685, 0x188FEAD2) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Outputs OpenViBE::CIdentifier(0x3A4E3424, 0x3AD22EE5) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output OpenViBE::CIdentifier(0x4C481179, 0x0B4A1D5E) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_ID OpenViBE::CIdentifier(0x5366EAD8, 0xBB57B9AE) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_TypeID OpenViBE::CIdentifier(0x157E5B37, 0x142F4D94) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_Name OpenViBE::CIdentifier(0x2C6B06FD, 0x0973253F) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_LinkedBoxID OpenViBE::CIdentifier(0x1F790DDB, 0x2E0A002C) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_LinkedBoxOutputIdx OpenViBE::CIdentifier(0x53A515C8, 0x0B296360) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_LinkedBoxOutputID OpenViBE::CIdentifier(0xAC286F77, 0x18F7E33A) + + +#define OVTK_Algorithm_ScenarioExporter_NodeId_Boxes OpenViBE::CIdentifier(0x4BCB7EA2, 0x49B95B54) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box OpenViBE::CIdentifier(0xF7341CA6, 0x05DBB935) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_ID OpenViBE::CIdentifier(0x388E37B5, 0x3F471DB7) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Name OpenViBE::CIdentifier(0x5472B291, 0x51F94B43) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_AlgorithmClassIdD OpenViBE::CIdentifier(0x2CBBE45B, 0xD9385308) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Inputs OpenViBE::CIdentifier(0xB07E43FA, 0x3BFB5C41) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input OpenViBE::CIdentifier(0x7B149417, 0x39F0D7BC) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input_ID OpenViBE::CIdentifier(0x15FF57E3, 0xAD458EF2) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input_TypeID OpenViBE::CIdentifier(0xC7D436D2, 0x7C808FAD) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input_Name OpenViBE::CIdentifier(0xA65B1B6D, 0x70799D8F) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Outputs OpenViBE::CIdentifier(0xD5CBFF2C, 0x349EED80) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output OpenViBE::CIdentifier(0x8FE44764, 0xB6E9EEDE) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output_ID OpenViBE::CIdentifier(0x4538EF5A, 0xFA511347) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output_TypeID OpenViBE::CIdentifier(0x7C3CEAC8, 0x55E5B85F) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output_Name OpenViBE::CIdentifier(0x858B86C9, 0x8FDE0A88) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Settings OpenViBE::CIdentifier(0x456F426E, 0xD5F745C0) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting OpenViBE::CIdentifier(0x6D781687, 0xEC0697F0) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_ID OpenViBE::CIdentifier(0x45AF5442, 0xA46DA56B) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_TypeID OpenViBE::CIdentifier(0x4E025442, 0xF15A306B) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_Name OpenViBE::CIdentifier(0xF653238C, 0xCF13CC1E) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_DefaultValue OpenViBE::CIdentifier(0x22B803B1, 0xB99EB29C) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_Value OpenViBE::CIdentifier(0x4B157087, 0xA17AC752) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_Modifiability OpenViBE::CIdentifier(0x7F87A192, 0x16534D27) + +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Attributes OpenViBE::CIdentifier(0x5A512182, 0xEA975174) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Attribute OpenViBE::CIdentifier(0xAAE1C0BA, 0x0CCB4F6E) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Attribute_ID OpenViBE::CIdentifier(0xFDE975E7, 0x9EE828E5) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Box_Attribute_Value OpenViBE::CIdentifier(0x08700489, 0x15D4C296) + +#define OVTK_Algorithm_ScenarioExporter_NodeId_Comments OpenViBE::CIdentifier(0x05FFFB9C, 0x0D3F72B9) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Comment OpenViBE::CIdentifier(0x8A90B4C7, 0x1B1F91C8) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Comment_ID OpenViBE::CIdentifier(0x5D5AC202, 0x8A8A2049) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Text OpenViBE::CIdentifier(0xE1FBD2D0, 0x62644098) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Attributes OpenViBE::CIdentifier(0x03A34281, 0x49A94884) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Attribute OpenViBE::CIdentifier(0xD1BE5B9E, 0x290F273E) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Attribute_ID OpenViBE::CIdentifier(0x4A68A79B, 0x26590AC7) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Attribute_Value OpenViBE::CIdentifier(0x1762575C, 0x234FCEA9) + +#define OVTK_Algorithm_ScenarioExporter_NodeId_Metadata OpenViBE::CIdentifier(0x5BD6509C, 0x3F85473B) +#define OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry OpenViBE::CIdentifier(0x9C2950A7, 0x109E0B28) +#define OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry_ID OpenViBE::CIdentifier(0x85811583, 0x5242A4F3) +#define OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry_Type OpenViBE::CIdentifier(0x596E48C6, 0xE408F6EA) +#define OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry_Data OpenViBE::CIdentifier(0x95006E45, 0xA0E3D014) + +#define OVTK_Algorithm_ScenarioExporter_NodeId_Links OpenViBE::CIdentifier(0x5B4FF75F, 0x7FB1E0DA) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Link OpenViBE::CIdentifier(0x7E290F90, 0xEB62C398) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Link_ID OpenViBE::CIdentifier(0x51FEC159, 0x0958BF76) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source OpenViBE::CIdentifier(0xD7E0F55E, 0x576625E3) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source_BoxID OpenViBE::CIdentifier(0x49A048C0, 0x564E3FF3) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source_BoxOutputID OpenViBE::CIdentifier(0x458FAADC, 0xEED89711) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source_BoxOutputIdx OpenViBE::CIdentifier(0x6C4C2561, 0x0C128F04) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target OpenViBE::CIdentifier(0x231E8241, 0x89F06614) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target_BoxID OpenViBE::CIdentifier(0xDB6D995F, 0xE514B76A) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target_BoxInputID OpenViBE::CIdentifier(0x56899E5F, 0xA5D9C658) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target_BoxInputIdx OpenViBE::CIdentifier(0x2DEDF2E1, 0x76778F6B) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Link_Attributes OpenViBE::CIdentifier(0x3B3700A0, 0x51159BB0) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Link_Attribute OpenViBE::CIdentifier(0xA1487B45, 0x88C442B6) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Link_Attribute_ID OpenViBE::CIdentifier(0x03710320, 0x0A550AE0) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Link_Attribute_Value OpenViBE::CIdentifier(0x3831E536, 0x6E0C9282) + +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Attributes OpenViBE::CIdentifier(0x06B858A3, 0xE3F6B199) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Attribute OpenViBE::CIdentifier(0x195DF0C2, 0x01071746) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Attribute_ID OpenViBE::CIdentifier(0x66A99FF0, 0x402B6F19) +#define OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Attribute_Value OpenViBE::CIdentifier(0xA4795600, 0x31AFDFB1) diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/box-algorithms/ovtkTBoxAlgorithm.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/box-algorithms/ovtkTBoxAlgorithm.h new file mode 100755 index 0000000..a275100 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/box-algorithms/ovtkTBoxAlgorithm.h @@ -0,0 +1,363 @@ +#pragma once + +#include "../ovtk_base.h" +#include + +namespace OpenViBE { +namespace Toolkit { +template +class TBoxAlgorithm : public TBoxAlgorithmParentClass +{ +public: + + TBoxAlgorithm() { } + + // ==================================================================================================================================== + +private: + + virtual uint64_t getClockFrequency(Kernel::IBoxAlgorithmContext& ctx) + { + CScopedBoxAlgorithm scopedBoxAlgorithm(m_boxAlgorithmCtx, &ctx); + return getClockFrequency(); + } + + virtual bool initialize(Kernel::IBoxAlgorithmContext& ctx) + { + CScopedBoxAlgorithm scopedBoxAlgorithm(m_boxAlgorithmCtx, &ctx); + return initialize(); + } + + virtual bool uninitialize(Kernel::IBoxAlgorithmContext& ctx) + { + CScopedBoxAlgorithm scopedBoxAlgorithm(m_boxAlgorithmCtx, &ctx); + return uninitialize(); + } + + virtual bool processClock(Kernel::IBoxAlgorithmContext& ctx, Kernel::CMessageClock& msg) + { + CScopedBoxAlgorithm scopedBoxAlgorithm(m_boxAlgorithmCtx, &ctx); + return processClock(msg); + } + + virtual bool processInput(Kernel::IBoxAlgorithmContext& ctx, const size_t index) + { + CScopedBoxAlgorithm scopedBoxAlgorithm(m_boxAlgorithmCtx, &ctx); + return processInput(index); + } + + virtual bool process(Kernel::IBoxAlgorithmContext& ctx) + { + CScopedBoxAlgorithm oScopedBoxAlgorithm(m_boxAlgorithmCtx, &ctx); + return process(); + } + + // ==================================================================================================================================== + +public: + + virtual uint64_t getClockFrequency() { return 0; } + virtual bool initialize() { return true; } + virtual bool uninitialize() { return true; } + virtual bool processClock(Kernel::CMessageClock& /*msg*/) { return false; } + virtual bool processInput(const size_t /*index*/) { return false; } + virtual bool process() = 0; + + // ==================================================================================================================================== + + virtual Kernel::IBoxAlgorithmContext* getBoxAlgorithmContext() { return m_boxAlgorithmCtx; } + // virtual Kernel::IBoxAlgorithmContext& getBoxAlgorithmContext() { return *m_boxAlgorithmCtx; } this one should replace ! + virtual const Kernel::IBox& getStaticBoxContext() { return *m_boxAlgorithmCtx->getStaticBoxContext(); } + virtual Kernel::IBoxIO& getDynamicBoxContext() { return *m_boxAlgorithmCtx->getDynamicBoxContext(); } + virtual Kernel::IPlayerContext& getPlayerContext() { return *m_boxAlgorithmCtx->getPlayerContext(); } + + virtual Kernel::IAlgorithmManager& getAlgorithmManager() { return getPlayerContext().getAlgorithmManager(); } + virtual Kernel::IConfigurationManager& getConfigurationManager() { return getPlayerContext().getConfigurationManager(); } + virtual Kernel::ILogManager& getLogManager() { return getPlayerContext().getLogManager(); } + virtual Kernel::IErrorManager& getErrorManager() { return getPlayerContext().getErrorManager(); } + virtual Kernel::IScenarioManager& getScenarioManager() { return getPlayerContext().getScenarioManager(); } + virtual Kernel::ITypeManager& getTypeManager() { return getPlayerContext().getTypeManager(); } + + virtual bool canCreatePluginObject(const CIdentifier& pluginID) { return getPlayerContext().canCreatePluginObject(pluginID); } + + virtual Plugins::IPluginObject* createPluginObject(const CIdentifier& pluginID) { return getPlayerContext().createPluginObject(pluginID); } + + virtual bool releasePluginObject(Plugins::IPluginObject* pluginObject) { return getPlayerContext().releasePluginObject(pluginObject); } + + // ==================================================================================================================================== + + virtual void appendOutputChunkData(const size_t outputIdx, const void* buffer, const size_t size) + { + Kernel::IBoxAlgorithmContext* context = this->getBoxAlgorithmContext(); + if (context) + { + Kernel::IBoxIO* boxContext = context->getDynamicBoxContext(); + if (boxContext) { boxContext->appendOutputChunkData(outputIdx, static_cast(buffer), size); } + } + } + + template + void appendOutputChunkData(const void* buffer, const size_t size) { appendOutputChunkData(TOutputIdx, buffer, size); } + + _IsDerivedFromClass_(TBoxAlgorithmParentClass, OVTK_ClassId_) + +protected: + + class FSettingValueAutoCast + { + public: + FSettingValueAutoCast(Kernel::IBoxAlgorithmContext& ctx, const size_t index) + : m_logManager(ctx.getPlayerContext()->getLogManager()), + m_errorManager(ctx.getPlayerContext()->getErrorManager()), + m_typeManager(ctx.getPlayerContext()->getTypeManager()), + m_configManager(ctx.getPlayerContext()->getConfigurationManager()) + { + ctx.getStaticBoxContext()->getSettingValue(index, m_settingValue); + ctx.getStaticBoxContext()->getSettingType(index, m_settingType); + } + + FSettingValueAutoCast(Kernel::IBoxAlgorithmContext& ctx, const CString& name) + : m_logManager(ctx.getPlayerContext()->getLogManager()), + m_errorManager(ctx.getPlayerContext()->getErrorManager()), + m_typeManager(ctx.getPlayerContext()->getTypeManager()), + m_configManager(ctx.getPlayerContext()->getConfigurationManager()) + { + ctx.getStaticBoxContext()->getSettingValue(name, m_settingValue); + ctx.getStaticBoxContext()->getInterfacorType(Kernel::EBoxInterfacorType::Setting, name, m_settingType); + } + + FSettingValueAutoCast(Kernel::IBoxAlgorithmContext& ctx, const CIdentifier& identifier) + : m_logManager(ctx.getPlayerContext()->getLogManager()), + m_errorManager(ctx.getPlayerContext()->getErrorManager()), + m_typeManager(ctx.getPlayerContext()->getTypeManager()), + m_configManager(ctx.getPlayerContext()->getConfigurationManager()) + { + ctx.getStaticBoxContext()->getSettingValue(identifier, m_settingValue); + ctx.getStaticBoxContext()->getInterfacorType(Kernel::EBoxInterfacorType::Setting, identifier, m_settingType); + } + + operator uint32_t() const + { + double result; + const CString value = m_configManager.expand(m_settingValue); + + OV_ERROR_UNLESS(m_typeManager.evaluateSettingValue(value, result), + "Could not expand numeric expression [" << m_settingValue << "] to unsigned integer 32bits.", + Kernel::ErrorType::BadParsing, std::numeric_limits::max(), m_errorManager, m_logManager); + + return uint32_t(result); + } + + operator uint64_t() const + { + uint64_t stimId = std::numeric_limits::max(); + const CString value = m_configManager.expand(m_settingValue); + double result; + if (m_typeManager.isEnumeration(m_settingType)) + { + stimId = m_typeManager.getEnumerationEntryValueFromName(m_settingType, value); + + OV_ERROR_UNLESS(stimId != std::numeric_limits::max(), + "Did not find an enumeration value for [" << m_typeManager.getTypeName(m_settingType) << "] = [" << m_settingValue << + "]", + Kernel::ErrorType::BadParsing, std::numeric_limits::max(), m_errorManager, m_logManager); + } + else if (m_typeManager.evaluateSettingValue(value, result)) { return uint64_t(result); } + + // Seems like currently some plugins use FSettingValueAutoCast without knowing then setting type. + // In this case, to avoid to pollute the console with useless messages, throw a message only if the + // setting should be an integer. + OV_ERROR_UNLESS(stimId != std::numeric_limits::max() || m_settingType != OV_TypeId_Integer, + "Could not expand numeric expression [" << m_settingValue << "] to unsigned integer 64bits.", + Kernel::ErrorType::BadParsing, std::numeric_limits::max(), m_errorManager, m_logManager); + + return stimId; + } + + operator int() const + { + double res; + const CString value = m_configManager.expand(m_settingValue); + + OV_ERROR_UNLESS(m_typeManager.evaluateSettingValue(value, res), + "Could not expand numeric expression [" << m_settingValue << "] to integer 32bits.", + Kernel::ErrorType::BadParsing, std::numeric_limits::max(), m_errorManager, m_logManager); + + return int(res); + } + + operator int64_t() const + { + double res; + const CString value = m_configManager.expand(m_settingValue); + + OV_ERROR_UNLESS(m_typeManager.evaluateSettingValue(value, res), + "Could not expand numeric expression [" << m_settingValue << "] to integer 64bits.", + Kernel::ErrorType::BadParsing, std::numeric_limits::max(), m_errorManager, m_logManager); + + return int64_t(res); + } + + operator double() const + { + double res; + const CString value = m_configManager.expand(m_settingValue); + + OV_ERROR_UNLESS(m_typeManager.evaluateSettingValue(value, res), + "Could not expand numeric expression [" << m_settingValue << "] to double.", + Kernel::ErrorType::BadParsing, std::numeric_limits::max(), m_errorManager, m_logManager); + + return double(res); + } + + operator bool() const { return m_configManager.expandAsBoolean(m_settingValue); } + + operator CString() const { return m_configManager.expand(m_settingValue); } + + private: + Kernel::ILogManager& m_logManager; + Kernel::IErrorManager& m_errorManager; + Kernel::ITypeManager& m_typeManager; + Kernel::IConfigurationManager& m_configManager; + CString m_settingValue; + CIdentifier m_settingType = CIdentifier::undefined(); + }; + +private: + + class CScopedBoxAlgorithm final + { + public: + CScopedBoxAlgorithm(Kernel::IBoxAlgorithmContext*& ctxRef, Kernel::IBoxAlgorithmContext* ctx) + : m_boxAlgorithmCtx(ctxRef) { m_boxAlgorithmCtx = ctx; } + + ~CScopedBoxAlgorithm() { m_boxAlgorithmCtx = nullptr; } + + protected: + Kernel::IBoxAlgorithmContext*& m_boxAlgorithmCtx; + }; + + Kernel::IBoxAlgorithmContext* m_boxAlgorithmCtx = nullptr; +}; + +template +class TBoxListener : public TBoxListenerParentClass +{ +public: + + TBoxListener() { } + +private: + + virtual bool initialize(Kernel::IBoxListenerContext& ctx) + { + CScopedBoxListener scopedBoxListener(m_boxListenerCtx, &ctx); + return initialize(); + } + + virtual bool uninitialize(Kernel::IBoxListenerContext& ctx) + { + CScopedBoxListener scopedBoxListener(m_boxListenerCtx, &ctx); + return uninitialize(); + } + + virtual bool process(Kernel::IBoxListenerContext& ctx, const Kernel::EBoxModification eBoxModificationType) + { + CScopedBoxListener scopedBoxListener(m_boxListenerCtx, &ctx); + switch (eBoxModificationType) + { + case Kernel::EBoxModification::Initialized: return this->onInitialized(m_boxListenerCtx->getBox()); + case Kernel::EBoxModification::DefaultInitialized: return this->onDefaultInitialized(m_boxListenerCtx->getBox()); + case Kernel::EBoxModification::NameChanged: return this->onNameChanged(m_boxListenerCtx->getBox()); + case Kernel::EBoxModification::IdentifierChanged: return this->onIdentifierChanged(m_boxListenerCtx->getBox()); + case Kernel::EBoxModification::AlgorithmClassIdentifierChanged: return this->onAlgorithmClassIdentifierChanged(m_boxListenerCtx->getBox()); + case Kernel::EBoxModification::InputConnected: return this->onInputConnected(m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + case Kernel::EBoxModification::InputDisconnected: return this->onInputDisconnected(m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + case Kernel::EBoxModification::InputAdded: return this->onInputAdded(m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + case Kernel::EBoxModification::InputRemoved: return this->onInputRemoved(m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + case Kernel::EBoxModification::InputTypeChanged: return this->onInputTypeChanged(m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + case Kernel::EBoxModification::InputNameChanged: return this->onInputNameChanged(m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + case Kernel::EBoxModification::OutputConnected: return this->onOutputConnected(m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + case Kernel::EBoxModification::OutputDisconnected: return this->onOutputDisconnected(m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + case Kernel::EBoxModification::OutputAdded: return this->onOutputAdded(m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + case Kernel::EBoxModification::OutputRemoved: return this->onOutputRemoved(m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + case Kernel::EBoxModification::OutputTypeChanged: return this->onOutputTypeChanged(m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + case Kernel::EBoxModification::OutputNameChanged: return this->onOutputNameChanged(m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + case Kernel::EBoxModification::SettingAdded: return this->onSettingAdded(m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + case Kernel::EBoxModification::SettingRemoved: return this->onSettingRemoved(m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + case Kernel::EBoxModification::SettingTypeChanged: return this->onSettingTypeChanged(m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + case Kernel::EBoxModification::SettingNameChanged: return this->onSettingNameChanged(m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + case Kernel::EBoxModification::SettingDefaultValueChanged: return this->onSettingDefaultValueChanged( + m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + case Kernel::EBoxModification::SettingValueChanged: return this->onSettingValueChanged(m_boxListenerCtx->getBox(), m_boxListenerCtx->getIndex()); + default: OV_ERROR_KRF("Unhandled box modification type " << size_t(eBoxModificationType), Kernel::ErrorType::BadArgument); + } + //return false; + } + + // ==================================================================================================================================== + +public: + + virtual bool initialize() { return true; } + virtual bool uninitialize() { return true; } + virtual bool onInitialized(Kernel::IBox& /*box*/) { return true; } + virtual bool onDefaultInitialized(Kernel::IBox& /*box*/) { return true; } + virtual bool onNameChanged(Kernel::IBox& /*box*/) { return true; } + virtual bool onIdentifierChanged(Kernel::IBox& /*box*/) { return true; } + virtual bool onAlgorithmClassIdentifierChanged(Kernel::IBox& /*box*/) { return true; } + virtual bool onInputConnected(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + virtual bool onInputDisconnected(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + virtual bool onInputAdded(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + virtual bool onInputRemoved(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + virtual bool onInputTypeChanged(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + virtual bool onInputNameChanged(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + virtual bool onOutputConnected(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + virtual bool onOutputDisconnected(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + virtual bool onOutputAdded(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + virtual bool onOutputRemoved(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + virtual bool onOutputTypeChanged(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + virtual bool onOutputNameChanged(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + virtual bool onSettingAdded(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + virtual bool onSettingRemoved(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + virtual bool onSettingTypeChanged(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + virtual bool onSettingNameChanged(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + virtual bool onSettingDefaultValueChanged(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + virtual bool onSettingValueChanged(Kernel::IBox& /*box*/, const size_t /*index*/) { return true; } + + // ==================================================================================================================================== + + virtual Kernel::IAlgorithmManager& getAlgorithmManager() const { return m_boxListenerCtx->getAlgorithmManager(); } + virtual Kernel::IPlayerManager& getPlayerManager() const { return m_boxListenerCtx->getPlayerManager(); } + virtual Kernel::IPluginManager& getPluginManager() const { return m_boxListenerCtx->getPluginManager(); } + virtual Kernel::IMetaboxManager& getMetaboxManager() const { return m_boxListenerCtx->getMetaboxManager(); } + virtual Kernel::IScenarioManager& getScenarioManager() const { return m_boxListenerCtx->getScenarioManager(); } + virtual Kernel::ITypeManager& getTypeManager() const { return m_boxListenerCtx->getTypeManager(); } + virtual Kernel::ILogManager& getLogManager() const { return m_boxListenerCtx->getLogManager(); } + virtual Kernel::IErrorManager& getErrorManager() const { return m_boxListenerCtx->getErrorManager(); } + virtual Kernel::IConfigurationManager& getConfigurationManager() const { return m_boxListenerCtx->getConfigurationManager(); } + + virtual Kernel::IScenario& getScenario() const { return m_boxListenerCtx->getScenario(); } + + // ==================================================================================================================================== + + _IsDerivedFromClass_(TBoxListenerParentClass, OVTK_ClassId_) + +private: + + class CScopedBoxListener final + { + public: + CScopedBoxListener(Kernel::IBoxListenerContext*& ctxRef, Kernel::IBoxListenerContext* ctx) + : m_boxListenerCtx(ctxRef) { m_boxListenerCtx = ctx; } + + ~CScopedBoxListener() { m_boxListenerCtx = nullptr; } + + protected: + Kernel::IBoxListenerContext*& m_boxListenerCtx; + }; + + Kernel::IBoxListenerContext* m_boxListenerCtx = nullptr; +}; +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/box-algorithms/ovtkTTrainingBoxAlgorithm.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/box-algorithms/ovtkTTrainingBoxAlgorithm.h new file mode 100644 index 0000000..f72dce1 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/box-algorithms/ovtkTTrainingBoxAlgorithm.h @@ -0,0 +1,163 @@ +#pragma once + +#include +#include +#include + +#include "../training/ovtkISignalTrial.h" +#include "../training/ovtkISignalTrialSet.h" +#include "ovtkTBoxAlgorithm.h" + +namespace OpenViBE { +namespace Toolkit { + +template +class TTrainingBoxAlgorithm : public TBoxAlgorithm +{ +public: + + TTrainingBoxAlgorithm(); + virtual ~TTrainingBoxAlgorithm(); + + // Signal input reader callback + virtual void setChannelCount(const size_t count) { m_pendingSignal->setChannelCount(count); } + virtual void setChannelName(const size_t index, const char* name) { m_pendingSignal->setChannelName(index, name); } + virtual void setSampleCountPerBuffer(const size_t count) { m_nSamplePerBuffer = count; } + virtual void setSamplingRate(const size_t sampling) { m_pendingSignal->setSamplingRate(sampling); } + virtual void setSampleBuffer(const double* buffer); + + // Stimulation input reader callback + virtual void setStimulationCount(size_t /*count*/) {} + virtual void setStimulation(const size_t index, uint64_t identifier, uint64_t date); + + // What should be implemented by the derived class + virtual CIdentifier getStimulationIdentifierTrialStart() = 0; + virtual CIdentifier getStimulationIdentifierTrialEnd() = 0; + virtual CIdentifier getStimulationIdentifierTrialLabelRangeStart() = 0; + virtual CIdentifier getStimulationIdentifierTrialLabelRangeEnd() = 0; + virtual CIdentifier getStimulationIdentifierTrain() = 0; + virtual bool train(ISignalTrialSet& trialSet) = 0; + + _IsDerivedFromClass_(TBoxAlgorithm, OVTK_ClassId_) + +private: + + ISignalTrial* m_pendingSignal = nullptr; + + uint64_t m_trialStartTime = 0; + uint64_t m_trialEndTime = 0; + size_t m_nSamplePerBuffer = 0; + CIdentifier m_trialLabel = CIdentifier::undefined(); + + std::vector m_signalTrials; +}; + +// ________________________________________________________________________________________________________________ +// + +template +TTrainingBoxAlgorithm::TTrainingBoxAlgorithm() : m_trialStartTime(ULLONG_MAX), m_trialEndTime(ULLONG_MAX) +{ + m_pendingSignal = createSignalTrial(); +} + +template +TTrainingBoxAlgorithm::~TTrainingBoxAlgorithm() +{ + releaseSignalTrial(m_pendingSignal); + for (auto itSignalTrial = m_signalTrials.begin(); itSignalTrial != m_signalTrials.end(); ++itSignalTrial) { releaseSignalTrial(*itSignalTrial); } +} + +// ________________________________________________________________________________________________________________ +// +// Signal input reader callback +// ________________________________________________________________________________________________________________ +// + +template +void TTrainingBoxAlgorithm::setSampleBuffer(const double* buffer) +{ + insertBufferSamples(*m_pendingSignal, m_pendingSignal->getSampleCount(), m_nSamplePerBuffer, buffer, m_pendingSignal); + + this->getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Debug + << "Appended " << m_nSamplePerBuffer << " bytes resulting in " << (m_pendingSignal->getDuration() >> 32) << " seconds of signal\n"; +} + +// ________________________________________________________________________________________________________________ +// +// Stimulation input reader callback +// ________________________________________________________________________________________________________________ +// + +template +void TTrainingBoxAlgorithm::setStimulation(const size_t /*index*/, const uint64_t identifier, const uint64_t date) +{ + if (identifier == this->getStimulationIdentifierTrain()) + { + this->getBoxAlgorithmContext()->getPlayerContext()->getLogManager() + << Kernel::LogLevel_Trace + << "Constituting a signal trial set based on previous signal trials...\n"; + + ISignalTrialSet* signalTrialSet = createSignalTrialSet(); + for (auto it = m_signalTrials.begin(); it != m_signalTrials.end(); ++it) { signalTrialSet->addSignalTrial(**it); } + + this->getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Info << "Calling train function...\n"; + + this->train(*signalTrialSet); + + this->getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Trace + << "Training done... will clear signal trials and signal trial set now...\n"; + + for (auto it = m_signalTrials.begin(); it != m_signalTrials.end(); ++it) { releaseSignalTrial(*it); } + releaseSignalTrialSet(signalTrialSet); + m_signalTrials.clear(); + + this->getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Info << "Training phase finished !\n"; + } + else if (identifier == this->getStimulationIdentifierTrialStart()) + { + m_trialStartTime = date; + this->getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Trace + << "Saved trial start time " << CTime(m_trialStartTime) << "...\n"; + } + else if (identifier == this->getStimulationIdentifierTrialEnd()) + { + m_trialEndTime = date; + this->getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Trace + << "Saved trial end time " << CTime(m_trialEndTime) << "...\n"; + } + else if (this->getStimulationIdentifierTrialLabelRangeStart() <= CIdentifier(identifier) && CIdentifier(identifier) <= this-> + getStimulationIdentifierTrialLabelRangeEnd()) + { + m_trialLabel = identifier; + this->getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Trace + << "Labeled trial " << m_trialLabel << "...\n"; + } + else + { + this->getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Debug + << "Unhandled stimulation " << CIdentifier(identifier) << " at time " << CTime(date) << "\n"; + } + + if (m_trialEndTime != ULLONG_MAX && m_trialStartTime != ULLONG_MAX && m_trialEndTime > m_trialStartTime) + { + size_t nSample = size_t(((m_trialEndTime - m_trialStartTime) * m_pendingSignal->getSamplingRate()) >> 32); + + this->getBoxAlgorithmContext()->getPlayerContext()->getLogManager() << Kernel::LogLevel_Trace + << "Created trial " << CTime(m_trialStartTime) << "-" << CTime(m_trialEndTime) << " with " << nSample << " samples\n"; + + ISignalTrial* signalTrial = createSignalTrial(); + copyHeader(*signalTrial, m_pendingSignal); + selectTime(*signalTrial, m_trialStartTime, m_trialEndTime, m_pendingSignal); + signalTrial->setLabelIdentifier(m_trialLabel); + + m_signalTrials.push_back(signalTrial); + + m_trialStartTime = ULLONG_MAX; + m_trialEndTime = ULLONG_MAX; + m_trialLabel = CIdentifier::undefined(); + } +} + +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTAcquisitionDecoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTAcquisitionDecoder.h new file mode 100644 index 0000000..f72c59e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTAcquisitionDecoder.h @@ -0,0 +1,101 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "../../ovtk_base.h" + +#include "ovtkTStreamedMatrixDecoder.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TAcquisitionDecoderLocal : public T +{ +protected: + + Kernel::TParameterHandler op_bufferDuration; + Kernel::TParameterHandler op_experimentInfoStream; + Kernel::TParameterHandler op_signalStream; + Kernel::TParameterHandler op_stimulationStream; + Kernel::TParameterHandler op_channelLocalisationStream; + Kernel::TParameterHandler op_channelUnitsStream; + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_iBuffer; + + bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_AcquisitionDecoder)); + m_codec->initialize(); + + m_iBuffer.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_AcquisitionDecoder_InputParameterId_MemoryBufferToDecode)); + + op_bufferDuration.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_BufferDuration)); + op_experimentInfoStream.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_ExperimentInfoStream)); + op_signalStream.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_SignalStream)); + op_stimulationStream.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_StimulationStream)); + op_channelLocalisationStream.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_ChannelLocalisationStream)); + op_channelUnitsStream.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_AcquisitionDecoder_OutputParameterId_ChannelUnitsStream)); + + return true; + } + +public: + + using T::initialize; + + bool uninitialize() + { + if (m_boxAlgorithm == nullptr || m_codec == nullptr) { return false; } + + op_channelUnitsStream.uninitialize(); + op_channelLocalisationStream.uninitialize(); + op_stimulationStream.uninitialize(); + op_signalStream.uninitialize(); + op_experimentInfoStream.uninitialize(); + op_bufferDuration.uninitialize(); + + m_iBuffer.uninitialize(); + m_codec->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_codec); + m_boxAlgorithm = NULL; + + return true; + } + + Kernel::TParameterHandler& getBufferDuration() { return op_bufferDuration; } + Kernel::TParameterHandler& getExperimentInfoStream() { return op_experimentInfoStream; } + Kernel::TParameterHandler& getSignalStream() { return op_signalStream; } + Kernel::TParameterHandler& getStimulationStream() { return op_stimulationStream; } + Kernel::TParameterHandler& getChannelLocalisationStream() { return op_channelLocalisationStream; } + Kernel::TParameterHandler& getChannelUnitsStream() { return op_channelUnitsStream; } + + virtual bool isHeaderReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_AcquisitionDecoder_OutputTriggerId_ReceivedHeader); } + virtual bool isBufferReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_AcquisitionDecoder_OutputTriggerId_ReceivedBuffer); } + virtual bool isEndReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_AcquisitionDecoder_OutputTriggerId_ReceivedEnd); } +}; + +template +class TAcquisitionDecoder : public TAcquisitionDecoderLocal>> +{ + using TAcquisitionDecoderLocal>>::m_boxAlgorithm; + +public: + using TAcquisitionDecoderLocal>>::uninitialize; + + TAcquisitionDecoder() { } + + explicit TAcquisitionDecoder(T& boxAlgorithm) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm); + } + + virtual ~TAcquisitionDecoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTChannelLocalisationDecoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTChannelLocalisationDecoder.h new file mode 100644 index 0000000..9732978 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTChannelLocalisationDecoder.h @@ -0,0 +1,77 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "ovtkTStreamedMatrixDecoder.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TChannelLocalisationDecoderLocal : public T +{ +protected: + + Kernel::TParameterHandler m_oDynamic; + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_iBuffer; + using T::m_oMatrix; + + bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_ChannelLocalisationDecoder)); + m_codec->initialize(); + m_iBuffer.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_ChannelLocalisationDecoder_InputParameterId_MemoryBufferToDecode)); + m_oMatrix.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputParameterId_Matrix)); + m_oDynamic.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputParameterId_Dynamic)); + + return true; + } + +public: + using T::initialize; + + bool uninitialize() + { + if (m_boxAlgorithm == nullptr || m_codec == nullptr) { return false; } + + m_oDynamic.uninitialize(); + m_oMatrix.uninitialize(); + m_iBuffer.uninitialize(); + m_codec->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_codec); + m_boxAlgorithm = NULL; + + return true; + } + + Kernel::TParameterHandler& getOutputDynamic() { return m_oDynamic; } + + virtual bool isHeaderReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputTriggerId_ReceivedHeader); } + virtual bool isBufferReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputTriggerId_ReceivedBuffer); } + virtual bool isEndReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_ChannelLocalisationDecoder_OutputTriggerId_ReceivedEnd); } +}; + +template +class TChannelLocalisationDecoder : public TChannelLocalisationDecoderLocal>> +{ + using TChannelLocalisationDecoderLocal>>::m_boxAlgorithm; +public: + using TChannelLocalisationDecoderLocal>>::uninitialize; + + TChannelLocalisationDecoder() { } + + TChannelLocalisationDecoder(T& boxAlgorithm, size_t index) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm, index); + } + + virtual ~TChannelLocalisationDecoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTChannelUnitsDecoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTChannelUnitsDecoder.h new file mode 100644 index 0000000..2d78db7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTChannelUnitsDecoder.h @@ -0,0 +1,78 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "ovtkTStreamedMatrixDecoder.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TChannelUnitsDecoderLocal : public T +{ +protected: + + Kernel::TParameterHandler m_oDynamic; + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_iBuffer; + using T::m_oMatrix; + + bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_ChannelUnitsDecoder)); + m_codec->initialize(); + m_iBuffer.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_ChannelUnitsDecoder_InputParameterId_MemoryBufferToDecode)); + m_oMatrix.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_ChannelUnitsDecoder_OutputParameterId_Matrix)); + m_oDynamic.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_ChannelUnitsDecoder_OutputParameterId_Dynamic)); + + return true; + } + +public: + using T::initialize; + + bool uninitialize() + { + if (m_boxAlgorithm == nullptr || m_codec == nullptr) { return false; } + + m_oDynamic.uninitialize(); + m_oMatrix.uninitialize(); + + m_iBuffer.uninitialize(); + m_codec->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_codec); + m_boxAlgorithm = NULL; + + return true; + } + + Kernel::TParameterHandler& getOutputDynamic() { return m_oDynamic; } + + virtual bool isHeaderReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_ChannelUnitsDecoder_OutputTriggerId_ReceivedHeader); } + virtual bool isBufferReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_ChannelUnitsDecoder_OutputTriggerId_ReceivedBuffer); } + virtual bool isEndReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_ChannelUnitsDecoder_OutputTriggerId_ReceivedEnd); } +}; + +template +class TChannelUnitsDecoder : public TChannelUnitsDecoderLocal>> +{ + using TChannelUnitsDecoderLocal>>::m_boxAlgorithm; +public: + using TChannelUnitsDecoderLocal>>::uninitialize; + + TChannelUnitsDecoder() { } + + TChannelUnitsDecoder(T& boxAlgorithm, size_t index) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm, index); + } + + virtual ~TChannelUnitsDecoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTDecoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTDecoder.h new file mode 100644 index 0000000..c82c8c6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTDecoder.h @@ -0,0 +1,80 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "../../ovtk_base.h" + +#include "../ovtkTCodec.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TDecoderLocal : public T +{ +protected: + + Kernel::TParameterHandler m_iBuffer; + + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_connectorIdx; + + virtual void setInputChunk(const IMemoryBuffer* pInputChunkMemoryBuffer) { m_iBuffer = pInputChunkMemoryBuffer; } + + virtual Kernel::TParameterHandler& getInputMemoryBuffer() { return m_iBuffer; } + + virtual bool isOutputTriggerActive(const CIdentifier oTrigger) { return m_codec->isOutputTriggerActive(oTrigger); } + + virtual bool process(const CIdentifier& oTrigger) { return m_codec->process(oTrigger); } + virtual bool process() { return m_codec->process(); } + +public: + // We make visible the initialize methods of the superclass (should be TCodec), in the same scope (public) + using T::initialize; + + /* + This public function handles every aspects of the decoding process: + - fill the input memory buffer with a chunk + - decode it (specific for each decoder) + - mark input as deprecated + */ + virtual bool decode(const size_t chunkIdx, const bool markInputAsDeprecated = true) + { + this->setInputChunk(m_boxAlgorithm->getDynamicBoxContext().getInputChunk(m_connectorIdx, chunkIdx)); + if (! m_codec->process()) return false; + if (markInputAsDeprecated) m_boxAlgorithm->getDynamicBoxContext().markInputAsDeprecated(m_connectorIdx, chunkIdx); + return true; + } + + // We explicitly delete the decode function taking two integers as parameters + // in order to raise errors in plugins using the older API +#ifndef TARGET_OS_MacOS // Current clang has a bug which fails to link these + virtual bool decode(int, int) = delete; + virtual bool decode(size_t, size_t) = delete; +#endif + + // The functions that need to be specified by the decoders (specific Trigger ID) + virtual bool isHeaderReceived() = 0; + virtual bool isBufferReceived() = 0; + virtual bool isEndReceived() = 0; +}; + +/* +This class provides an access to the superclass TDecoder. +Use case : iterating over a vector of TDecoder, calling decode() each time. +You don't need to know which type of decoder is in the vector. +*/ +template +class TDecoder : public TDecoderLocal> +{ +public: + virtual ~TDecoder() { } +protected: + // constructor is protected, ensuring we can't instanciate a TDecoder + TDecoder() { } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTExperimentInfoDecoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTExperimentInfoDecoder.h new file mode 100644 index 0000000..4b81b9e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTExperimentInfoDecoder.h @@ -0,0 +1,120 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "../../ovtk_base.h" + +#include "ovtkTDecoder.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TExperimentInfoDecoderLocal : public T +{ +protected: + + Kernel::TParameterHandler m_experimentID; + Kernel::TParameterHandler m_experimentDate; + + Kernel::TParameterHandler m_subjectID; + Kernel::TParameterHandler m_subjectName; + Kernel::TParameterHandler m_subjectAge; + Kernel::TParameterHandler m_subjectGender; + + Kernel::TParameterHandler m_laboratoryID; + Kernel::TParameterHandler m_laboratoryName; + Kernel::TParameterHandler m_technicianID; + Kernel::TParameterHandler m_technicianName; + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_iBuffer; + + bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_ExperimentInfoDecoder)); + m_codec->initialize(); + + m_iBuffer.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_ExperimentInfoDecoder_InputParameterId_MemoryBufferToDecode)); + + m_experimentID.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_ExperimentID)); + m_experimentDate.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_ExperimentDate)); + + m_subjectID.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectID)); + m_subjectName.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectName)); + m_subjectAge.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectAge)); + m_subjectGender.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_SubjectGender)); + + m_laboratoryID.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_LaboratoryID)); + m_laboratoryName.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_LaboratoryName)); + m_technicianID.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_TechnicianID)); + m_technicianName.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_ExperimentInfoDecoder_OutputParameterId_TechnicianName)); + + return true; + } + +public: + using T::initialize; + + bool uninitialize() + { + if (m_boxAlgorithm == nullptr || m_codec == nullptr) { return false; } + + m_experimentID.uninitialize(); + m_experimentDate.uninitialize(); + m_subjectID.uninitialize(); + m_subjectName.uninitialize(); + m_subjectAge.uninitialize(); + m_subjectGender.uninitialize(); + m_laboratoryID.uninitialize(); + m_laboratoryName.uninitialize(); + m_technicianID.uninitialize(); + m_technicianName.uninitialize(); + + m_iBuffer.uninitialize(); + m_codec->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_codec); + m_boxAlgorithm = NULL; + + return true; + } + + Kernel::TParameterHandler& getOutputExperimentID() { return m_experimentID; } + Kernel::TParameterHandler& getOutputExperimentDate() { return m_experimentDate; } + Kernel::TParameterHandler& getOutputSubjectID() { return m_subjectID; } + Kernel::TParameterHandler& getOutputSubjectName() { return m_subjectName; } + Kernel::TParameterHandler& getOutputSubjectAge() { return m_subjectAge; } + Kernel::TParameterHandler& getOutputSubjectGender() { return m_subjectGender; } + Kernel::TParameterHandler& getOutputLaboratoryID() { return m_laboratoryID; } + Kernel::TParameterHandler& getOutputLaboratoryName() { return m_laboratoryName; } + Kernel::TParameterHandler& getOutputTechnicianID() { return m_technicianID; } + Kernel::TParameterHandler& getOutputTechnicianName() { return m_technicianName; } + + virtual bool isHeaderReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedHeader); } + virtual bool isBufferReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedBuffer); } + virtual bool isEndReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_ExperimentInfoDecoder_OutputTriggerId_ReceivedEnd); } +}; + +template +class TExperimentInfoDecoder : public TExperimentInfoDecoderLocal> +{ + using TExperimentInfoDecoderLocal>::m_boxAlgorithm; + +public: + using TExperimentInfoDecoderLocal>::uninitialize; + + TExperimentInfoDecoder() { } + + TExperimentInfoDecoder(T& boxAlgorithm, size_t index) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm, index); + } + + virtual ~TExperimentInfoDecoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTFeatureVectorDecoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTFeatureVectorDecoder.h new file mode 100644 index 0000000..074b6ab --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTFeatureVectorDecoder.h @@ -0,0 +1,61 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "../../ovtk_base.h" + +#include "ovtkTStreamedMatrixDecoder.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TFeatureVectorDecoderLocal : public T +{ +protected: + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_iBuffer; + using T::m_oMatrix; + + bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorDecoder)); + m_codec->initialize(); + m_iBuffer.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_FeatureVectorDecoder_InputParameterId_MemoryBufferToDecode)); + m_oMatrix.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_FeatureVectorDecoder_OutputParameterId_Matrix)); + + return true; + } + +public: + using T::initialize; + using T::uninitialize; + + virtual bool isHeaderReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_FeatureVectorDecoder_OutputTriggerId_ReceivedHeader); } + virtual bool isBufferReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_FeatureVectorDecoder_OutputTriggerId_ReceivedBuffer); } + virtual bool isEndReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_FeatureVectorDecoder_OutputTriggerId_ReceivedEnd); } +}; + +template +class TFeatureVectorDecoder : public TFeatureVectorDecoderLocal>> +{ + using TFeatureVectorDecoderLocal>>::m_boxAlgorithm; +public: + using TFeatureVectorDecoderLocal>>::uninitialize; + + TFeatureVectorDecoder() { } + + TFeatureVectorDecoder(T& boxAlgorithm, size_t index) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm, index); + } + + virtual ~TFeatureVectorDecoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTSignalDecoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTSignalDecoder.h new file mode 100644 index 0000000..3df5df8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTSignalDecoder.h @@ -0,0 +1,79 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "../../ovtk_base.h" + +#include "ovtkTStreamedMatrixDecoder.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TSignalDecoderLocal : public T +{ +protected: + + Kernel::TParameterHandler m_sampling; + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_iBuffer; + using T::m_oMatrix; + + bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalDecoder)); + m_codec->initialize(); + m_sampling.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Sampling)); + m_oMatrix.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_SignalDecoder_OutputParameterId_Matrix)); + m_iBuffer.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_SignalDecoder_InputParameterId_MemoryBufferToDecode)); + + return true; + } + +public: + using T::initialize; + + bool uninitialize() + { + if (m_boxAlgorithm == nullptr || m_codec == nullptr) { return false; } + + m_sampling.uninitialize(); + m_oMatrix.uninitialize(); + m_iBuffer.uninitialize(); + m_codec->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_codec); + m_boxAlgorithm = NULL; + + return true; + } + + Kernel::TParameterHandler& getOutputSamplingRate() { return m_sampling; } + + virtual bool isHeaderReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedHeader); } + virtual bool isBufferReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedBuffer); } + virtual bool isEndReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_SignalDecoder_OutputTriggerId_ReceivedEnd); } +}; + +template +class TSignalDecoder : public TSignalDecoderLocal>> +{ + using TSignalDecoderLocal>>::m_boxAlgorithm; +public: + using TSignalDecoderLocal>>::uninitialize; + + TSignalDecoder() { } + + TSignalDecoder(T& boxAlgorithm, size_t index) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm, index); + } + + virtual ~TSignalDecoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTSpectrumDecoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTSpectrumDecoder.h new file mode 100755 index 0000000..8739839 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTSpectrumDecoder.h @@ -0,0 +1,84 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "../../ovtk_base.h" + +#include "ovtkTStreamedMatrixDecoder.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TSpectrumDecoderLocal : public T +{ +protected: + + Kernel::TParameterHandler m_frequencyAbscissa; + Kernel::TParameterHandler m_sampling; + + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_iBuffer; + using T::m_oMatrix; + + bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumDecoder)); + m_codec->initialize(); + m_oMatrix.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_Matrix)); + m_frequencyAbscissa.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_FrequencyAbscissa)); + m_sampling.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_SpectrumDecoder_OutputParameterId_Sampling)); + m_iBuffer.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_SpectrumDecoder_InputParameterId_MemoryBufferToDecode)); + + return true; + } + +public: + using T::initialize; + + bool uninitialize() + { + if (m_boxAlgorithm == nullptr || m_codec == nullptr) { return false; } + + m_oMatrix.uninitialize(); + m_frequencyAbscissa.uninitialize(); + m_sampling.uninitialize(); + m_iBuffer.uninitialize(); + m_codec->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_codec); + m_boxAlgorithm = NULL; + + return true; + } + + Kernel::TParameterHandler& getOutputSamplingRate() { return m_sampling; } + Kernel::TParameterHandler& getOutputFrequencyAbscissa() { return m_frequencyAbscissa; } + + virtual bool isHeaderReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_SpectrumDecoder_OutputTriggerId_ReceivedHeader); } + virtual bool isBufferReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_SpectrumDecoder_OutputTriggerId_ReceivedBuffer); } + virtual bool isEndReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_SpectrumDecoder_OutputTriggerId_ReceivedEnd); } +}; + +template +class TSpectrumDecoder : public TSpectrumDecoderLocal>> +{ + using TSpectrumDecoderLocal>>::m_boxAlgorithm; +public: + using TSpectrumDecoderLocal>>::uninitialize; + + TSpectrumDecoder() { } + + TSpectrumDecoder(T& boxAlgorithm, size_t index) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm, index); + } + + virtual ~TSpectrumDecoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTStimulationStreamDecoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTStimulationStreamDecoder.h new file mode 100644 index 0000000..0e2a8ca --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTStimulationStreamDecoder.h @@ -0,0 +1,76 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "../../ovtk_base.h" + +#include "ovtkTDecoder.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TStimulationDecoderLocal : public T +{ +protected: + + Kernel::TParameterHandler m_oStimulationSet; + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_iBuffer; + + bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationDecoder)); + m_codec->initialize(); + m_oStimulationSet.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_StimulationDecoder_OutputParameterId_StimulationSet)); + m_iBuffer.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_StimulationDecoder_InputParameterId_MemoryBufferToDecode)); + + return true; + } + +public: + using T::initialize; + + bool uninitialize() + { + if (m_boxAlgorithm == nullptr || m_codec == nullptr) { return false; } + + m_oStimulationSet.uninitialize(); + m_iBuffer.uninitialize(); + m_codec->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_codec); + m_boxAlgorithm = NULL; + + return true; + } + + Kernel::TParameterHandler& getOutputStimulationSet() { return m_oStimulationSet; } + + virtual bool isHeaderReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedHeader); } + virtual bool isBufferReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedBuffer); } + virtual bool isEndReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_StimulationDecoder_OutputTriggerId_ReceivedEnd); } +}; + +template +class TStimulationDecoder : public TStimulationDecoderLocal> +{ + using TStimulationDecoderLocal>::m_boxAlgorithm; +public: + using TStimulationDecoderLocal>::uninitialize; + + TStimulationDecoder() { } + + TStimulationDecoder(T& boxAlgorithm, size_t index) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm, index); + } + + virtual ~TStimulationDecoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTStreamStructureDecoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTStreamStructureDecoder.h new file mode 100644 index 0000000..0bebdaf --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTStreamStructureDecoder.h @@ -0,0 +1,68 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "../../ovtk_base.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TStreamStructureDecoderLocal : public T +{ +protected: + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_iBuffer; + + bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamStructureDecoder)); + m_codec->initialize(); + m_iBuffer.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_StreamStructureDecoder_InputParameterId_MemoryBufferToDecode)); + + return true; + } + +public: + using T::initialize; + + bool uninitialize() + { + if (m_boxAlgorithm == nullptr || m_codec == nullptr) { return false; } + + m_iBuffer.uninitialize(); + m_codec->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_codec); + m_boxAlgorithm = NULL; + + return true; + } + + virtual bool isHeaderReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_StreamStructureDecoder_OutputTriggerId_ReceivedHeader); } + virtual bool isBufferReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_StreamStructureDecoder_OutputTriggerId_ReceivedBuffer); } + virtual bool isEndReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_StreamStructureDecoder_OutputTriggerId_ReceivedEnd); } +}; + +template +class TStreamStructureDecoder : public TStreamStructureDecoderLocal> +{ + using TStreamStructureDecoderLocal>::m_boxAlgorithm; +public: + using TStreamStructureDecoderLocal>::uninitialize; + + TStreamStructureDecoder() { } + + TStreamStructureDecoder(T& boxAlgorithm, size_t index) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm, index); + } + + virtual ~TStreamStructureDecoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTStreamedMatrixDecoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTStreamedMatrixDecoder.h new file mode 100644 index 0000000..0ef1c0d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/decoders/ovtkTStreamedMatrixDecoder.h @@ -0,0 +1,76 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "../../ovtk_base.h" + +#include "ovtkTDecoder.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TStreamedMatrixDecoderLocal : public T +{ +protected: + + Kernel::TParameterHandler m_oMatrix; + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_iBuffer; + + virtual bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixDecoder)); + m_codec->initialize(); + m_iBuffer.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_InputParameterId_MemoryBufferToDecode)); + m_oMatrix.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + + return true; + } + +public: + using T::initialize; + + virtual bool uninitialize() + { + if (m_boxAlgorithm == nullptr || m_codec == nullptr) { return false; } + + m_oMatrix.uninitialize(); + m_iBuffer.uninitialize(); + m_codec->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_codec); + m_boxAlgorithm = NULL; + + return true; + } + + virtual Kernel::TParameterHandler& getOutputMatrix() { return m_oMatrix; } + + virtual bool isHeaderReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedHeader); } + virtual bool isBufferReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedBuffer); } + virtual bool isEndReceived() { return m_codec->isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedEnd); } +}; + +template +class TStreamedMatrixDecoder : public TStreamedMatrixDecoderLocal> +{ + using TStreamedMatrixDecoderLocal>::m_boxAlgorithm; +public: + using TStreamedMatrixDecoderLocal>::uninitialize; + + TStreamedMatrixDecoder() { } + + TStreamedMatrixDecoder(T& boxAlgorithm, size_t index) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm, index); + } + + virtual ~TStreamedMatrixDecoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTChannelLocalisationEncoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTChannelLocalisationEncoder.h new file mode 100644 index 0000000..2fdd0cc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTChannelLocalisationEncoder.h @@ -0,0 +1,78 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "ovtkTStreamedMatrixEncoder.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TChannelLocalisationEncoderLocal : public T +{ +protected: + + Kernel::TParameterHandler m_iDynamic; + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_buffer; + using T::m_iMatrix; + + bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_ChannelLocalisationEncoder)); + m_codec->initialize(); + m_iMatrix.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_ChannelLocalisationEncoder_InputParameterId_Matrix)); + m_iDynamic.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_ChannelLocalisationEncoder_InputParameterId_Dynamic)); + m_buffer.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_ChannelLocalisationEncoder_OutputParameterId_EncodedMemoryBuffer)); + + return true; + } + +public: + using T::initialize; + + bool uninitialize() + { + if (m_boxAlgorithm == nullptr || m_codec == nullptr) { return false; } + + m_iMatrix.uninitialize(); + m_iDynamic.uninitialize(); + m_buffer.uninitialize(); + m_codec->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_codec); + m_boxAlgorithm = NULL; + + return true; + } + + Kernel::TParameterHandler& getInputDynamic() { return m_iDynamic; } + +protected: + bool encodeHeaderImpl() { return m_codec->process(OVP_GD_Algorithm_ChannelLocalisationEncoder_InputTriggerId_EncodeHeader); } + bool encodeBufferImpl() { return m_codec->process(OVP_GD_Algorithm_ChannelLocalisationEncoder_InputTriggerId_EncodeBuffer); } + bool encodeEndImpl() { return m_codec->process(OVP_GD_Algorithm_ChannelLocalisationEncoder_InputTriggerId_EncodeEnd); } +}; + +template +class TChannelLocalisationEncoder : public TChannelLocalisationEncoderLocal>> +{ + using TChannelLocalisationEncoderLocal>>::m_boxAlgorithm; +public: + using TChannelLocalisationEncoderLocal>>::uninitialize; + + TChannelLocalisationEncoder() { } + + TChannelLocalisationEncoder(T& boxAlgorithm, size_t index) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm, index); + } + + virtual ~TChannelLocalisationEncoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTChannelUnitsEncoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTChannelUnitsEncoder.h new file mode 100644 index 0000000..c1f52ed --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTChannelUnitsEncoder.h @@ -0,0 +1,79 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "ovtkTStreamedMatrixEncoder.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TChannelUnitsEncoderLocal : public T +{ +protected: + + Kernel::TParameterHandler m_iDynamic; + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_buffer; + using T::m_iMatrix; + + bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_ChannelUnitsEncoder)); + m_codec->initialize(); + m_iMatrix.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_ChannelUnitsEncoder_InputParameterId_Matrix)); + m_iDynamic.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_ChannelUnitsEncoder_InputParameterId_Dynamic)); + m_buffer.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_ChannelUnitsEncoder_OutputParameterId_EncodedMemoryBuffer)); + + return true; + } + +public: + using T::initialize; + + bool uninitialize() + { + if (m_boxAlgorithm == nullptr || m_codec == nullptr) { return false; } + + m_iMatrix.uninitialize(); + m_iDynamic.uninitialize(); + + m_buffer.uninitialize(); + m_codec->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_codec); + m_boxAlgorithm = NULL; + + return true; + } + + Kernel::TParameterHandler& getInputDynamic() { return m_iDynamic; } + +protected: + bool encodeHeaderImpl() { return m_codec->process(OVP_GD_Algorithm_ChannelUnitsEncoder_InputTriggerId_EncodeHeader); } + bool encodeBufferImpl() { return m_codec->process(OVP_GD_Algorithm_ChannelUnitsEncoder_InputTriggerId_EncodeBuffer); } + bool encodeEndImpl() { return m_codec->process(OVP_GD_Algorithm_ChannelUnitsEncoder_InputTriggerId_EncodeEnd); } +}; + +template +class TChannelUnitsEncoder : public TChannelUnitsEncoderLocal>> +{ + using TChannelUnitsEncoderLocal>>::m_boxAlgorithm; +public: + using TChannelUnitsEncoderLocal>>::uninitialize; + + TChannelUnitsEncoder() { } + + TChannelUnitsEncoder(T& boxAlgorithm, size_t index) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm, index); + } + + virtual ~TChannelUnitsEncoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTEncoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTEncoder.h new file mode 100644 index 0000000..7e8e74d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTEncoder.h @@ -0,0 +1,85 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "../../ovtk_base.h" + +#include "../ovtkTCodec.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TEncoderLocal : public T +{ +protected: + + Kernel::TParameterHandler m_buffer; + + using T::initialize; + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_connectorIdx; + + virtual void setOutputChunk(IMemoryBuffer* pOutputChunkMemoryBuffer) { m_buffer = pOutputChunkMemoryBuffer; } + + virtual Kernel::TParameterHandler& getOutputMemoryBuffer() { return m_buffer; } + + virtual bool isOutputTriggerActive(const CIdentifier oTrigger) { return m_codec->isOutputTriggerActive(oTrigger); } + + virtual bool process(const CIdentifier& oTrigger) { return m_codec->process(oTrigger); } + virtual bool process() { return m_codec->process(); } + + // The functions that need to be specified by the encoders (specific Trigger ID) + virtual bool encodeHeaderImpl() = 0; + virtual bool encodeBufferImpl() = 0; + virtual bool encodeEndImpl() = 0; + +public: + + /* + These public methods handle every aspect of the encoding process : + - prepare the output memory buffer with a chunk + - encode (specific for each encoder) + - mark output as ready to be sent has to be done manually, for accurate timing. + */ + + bool encodeHeader() + { + this->setOutputChunk(m_boxAlgorithm->getDynamicBoxContext().getOutputChunk(m_connectorIdx)); + if (!this->encodeHeaderImpl()) return false; + return true; + } + + bool encodeBuffer() + { + this->setOutputChunk(m_boxAlgorithm->getDynamicBoxContext().getOutputChunk(m_connectorIdx)); + if (!this->encodeBufferImpl()) return false; + return true; + } + + bool encodeEnd() + { + this->setOutputChunk(m_boxAlgorithm->getDynamicBoxContext().getOutputChunk(m_connectorIdx)); + if (!this->encodeEndImpl()) return false; + return true; + } +}; + +/* +This class provides an access to the superclass TEncoder. +Use case : iterating over a vector of TEncoder, calling encodeHeader() each time. +You don't need to know which type of encoder is in the vector. +*/ +template +class TEncoder : public TEncoderLocal> +{ +public: + virtual ~TEncoder() { } +protected: + // constructor is protected, ensuring we can't instanciate a TEncoder + TEncoder() { } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTExperimentInfoEncoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTExperimentInfoEncoder.h new file mode 100644 index 0000000..d719398 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTExperimentInfoEncoder.h @@ -0,0 +1,120 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "../../ovtk_base.h" + +#include "ovtkTEncoder.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TExperimentInfoEncoderLocal : public T +{ +protected: + + Kernel::TParameterHandler m_experimentID; + Kernel::TParameterHandler m_experimentDate; + + Kernel::TParameterHandler m_subjectID; + Kernel::TParameterHandler m_subjectName; + Kernel::TParameterHandler m_subjectAge; + Kernel::TParameterHandler m_subjectGender; + + Kernel::TParameterHandler m_laboratoryID; + Kernel::TParameterHandler m_laboratoryName; + Kernel::TParameterHandler m_technicianID; + Kernel::TParameterHandler m_technicianName; + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_buffer; + + bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_ExperimentInfoEncoder)); + m_codec->initialize(); + m_experimentID.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_ExperimentID)); + m_experimentDate.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_ExperimentDate)); + + m_subjectID.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectID)); + m_subjectName.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectName)); + m_subjectAge.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectAge)); + m_subjectGender.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_SubjectGender)); + + m_laboratoryID.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_LaboratoryID)); + m_laboratoryName.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_LaboratoryName)); + m_technicianID.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_TechnicianID)); + m_technicianName.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_ExperimentInfoEncoder_InputParameterId_TechnicianName)); + + m_buffer.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_ExperimentInfoEncoder_OutputParameterId_EncodedMemoryBuffer)); + + return true; + } + +public: + using T::initialize; + + bool uninitialize() + { + if (m_boxAlgorithm == nullptr || m_codec == nullptr) { return false; } + + m_experimentID.uninitialize(); + m_experimentDate.uninitialize(); + m_subjectID.uninitialize(); + m_subjectName.uninitialize(); + m_subjectAge.uninitialize(); + m_subjectGender.uninitialize(); + m_laboratoryID.uninitialize(); + m_laboratoryName.uninitialize(); + m_technicianID.uninitialize(); + m_technicianName.uninitialize(); + + m_buffer.uninitialize(); + m_codec->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_codec); + m_boxAlgorithm = NULL; + + return true; + } + + Kernel::TParameterHandler& getInputExperimentID() { return m_experimentID; } + Kernel::TParameterHandler& getInputExperimentDate() { return m_experimentDate; } + Kernel::TParameterHandler& getInputSubjectID() { return m_subjectID; } + Kernel::TParameterHandler& getInputSubjectName() { return m_subjectName; } + Kernel::TParameterHandler& getInputSubjectAge() { return m_subjectAge; } + Kernel::TParameterHandler& getInputSubjectGender() { return m_subjectGender; } + Kernel::TParameterHandler& getInputLaboratoryID() { return m_laboratoryID; } + Kernel::TParameterHandler& getInputLaboratoryName() { return m_laboratoryName; } + Kernel::TParameterHandler& getInputTechnicianID() { return m_technicianID; } + Kernel::TParameterHandler& getInputTechnicianName() { return m_technicianName; } + +protected: + bool encodeHeaderImpl() { return m_codec->process(OVP_GD_Algorithm_ExperimentInfoEncoder_InputTriggerId_EncodeHeader); } + bool encodeBufferImpl() { return m_codec->process(OVP_GD_Algorithm_ExperimentInfoEncoder_InputTriggerId_EncodeBuffer); } + bool encodeEndImpl() { return m_codec->process(OVP_GD_Algorithm_ExperimentInfoEncoder_InputTriggerId_EncodeEnd); } +}; + +template +class TExperimentInfoEncoder : public TExperimentInfoEncoderLocal> +{ + using TExperimentInfoEncoderLocal>::m_boxAlgorithm; + +public: + using TExperimentInfoEncoderLocal>::uninitialize; + + TExperimentInfoEncoder() { } + + TExperimentInfoEncoder(T& boxAlgorithm, size_t index) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm, index); + } + + virtual ~TExperimentInfoEncoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTFeatureVectorEncoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTFeatureVectorEncoder.h new file mode 100644 index 0000000..99b56fd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTFeatureVectorEncoder.h @@ -0,0 +1,63 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "../../ovtk_base.h" + +#include "ovtkTStreamedMatrixEncoder.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TFeatureVectorEncoderLocal : public T +{ +protected: + // the feature vector stream is just a streamed matrix with some constraint (dimension = 2). + // no specific parameter. + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_buffer; + using T::m_iMatrix; + + bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_FeatureVectorEncoder)); + m_codec->initialize(); + m_iMatrix.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_FeatureVectorEncoder_InputParameterId_Matrix)); + m_buffer.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_FeatureVectorEncoder_OutputParameterId_EncodedMemoryBuffer)); + + return true; + } + + bool encodeHeaderImpl() { return m_codec->process(OVP_GD_Algorithm_FeatureVectorEncoder_InputTriggerId_EncodeHeader); } + bool encodeBufferImpl() { return m_codec->process(OVP_GD_Algorithm_FeatureVectorEncoder_InputTriggerId_EncodeBuffer); } + bool encodeEndImpl() { return m_codec->process(OVP_GD_Algorithm_FeatureVectorEncoder_InputTriggerId_EncodeEnd); } + +public: + using T::initialize; + using T::uninitialize; +}; + +template +class TFeatureVectorEncoder : public TFeatureVectorEncoderLocal>> +{ + using TFeatureVectorEncoderLocal>>::m_boxAlgorithm; +public: + using TFeatureVectorEncoderLocal>>::uninitialize; + + TFeatureVectorEncoder() { } + + TFeatureVectorEncoder(T& boxAlgorithm, size_t index) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm, index); + } + + virtual ~TFeatureVectorEncoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTSignalEncoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTSignalEncoder.h new file mode 100644 index 0000000..56e2d26 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTSignalEncoder.h @@ -0,0 +1,89 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "../../ovtk_base.h" + +#include "ovtkTStreamedMatrixEncoder.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TSignalEncoderLocal : public T +{ +protected: + //The signal stream is a streamed matrix plus a sampling rate + Kernel::TParameterHandler m_iSampling; + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_buffer; + using T::m_iMatrix; + + bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SignalEncoder)); + m_codec->initialize(); + m_iMatrix.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Matrix)); + m_iSampling.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_SignalEncoder_InputParameterId_Sampling)); + m_buffer.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + + return true; + } + +public: + //again... we propagate initialize from upperclass. + using T::initialize; + + bool uninitialize() + { + if (m_boxAlgorithm == nullptr || m_codec == nullptr) { return false; } + + m_iMatrix.uninitialize(); + m_iSampling.uninitialize(); + m_buffer.uninitialize(); + m_codec->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_codec); + m_boxAlgorithm = NULL; + + return true; + } + + Kernel::TParameterHandler& getInputSamplingRate() { return m_iSampling; } + +protected: + + /* + The methods specific to the Signal encoder (overriding the TStreamedMatrixEncoderLocal implementations): + */ + bool encodeHeaderImpl() { return m_codec->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeHeader); } + bool encodeBufferImpl() { return m_codec->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeBuffer); } + bool encodeEndImpl() { return m_codec->process(OVP_GD_Algorithm_SignalEncoder_InputTriggerId_EncodeEnd); } +}; + +/* +The Signal encoder can be instanciated easily through this class. +You just need one template class : the box (T). +*/ +template +class TSignalEncoder : public TSignalEncoderLocal>> +{ + using TSignalEncoderLocal>>::m_boxAlgorithm; +public: + using TSignalEncoderLocal>>::uninitialize; + + TSignalEncoder() { } + + TSignalEncoder(T& boxAlgorithm, size_t index) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm, index); + } + + virtual ~TSignalEncoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTSpectrumEncoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTSpectrumEncoder.h new file mode 100755 index 0000000..67f6188 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTSpectrumEncoder.h @@ -0,0 +1,87 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "../../ovtk_base.h" +#include "ovtkTStreamedMatrixEncoder.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TSpectrumEncoderLocal : public T +{ +protected: + + Kernel::TParameterHandler m_iFrequencyAbscissa; + Kernel::TParameterHandler m_iSampling; + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_buffer; + using T::m_iMatrix; + + bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_SpectrumEncoder)); + m_codec->initialize(); + m_iMatrix.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_Matrix)); + m_iFrequencyAbscissa.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_FrequencyAbscissa)); + m_iSampling.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_SpectrumEncoder_InputParameterId_Sampling)); + m_buffer.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_SpectrumEncoder_OutputParameterId_EncodedMemoryBuffer)); + + + return true; + } + +public: + using T::initialize; + + bool uninitialize() + { + if (m_boxAlgorithm == nullptr || m_codec == nullptr) { return false; } + + m_iMatrix.uninitialize(); + m_iFrequencyAbscissa.uninitialize(); + m_iSampling.uninitialize(); + m_buffer.uninitialize(); + m_codec->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_codec); + m_boxAlgorithm = NULL; + + return true; + } + + Kernel::TParameterHandler& getInputSamplingRate() { return m_iSampling; } + Kernel::TParameterHandler& getInputFrequencyAbscissa() { return m_iFrequencyAbscissa; } + + size_t getInputFrequencyAbscissaCount() { return m_iFrequencyAbscissa->getDimensionSize(0); } + + +protected: + bool encodeHeaderImpl() { return m_codec->process(OVP_GD_Algorithm_SpectrumEncoder_InputTriggerId_EncodeHeader); } + bool encodeBufferImpl() { return m_codec->process(OVP_GD_Algorithm_SpectrumEncoder_InputTriggerId_EncodeBuffer); } + bool encodeEndImpl() { return m_codec->process(OVP_GD_Algorithm_SpectrumEncoder_InputTriggerId_EncodeEnd); } +}; + +template +class TSpectrumEncoder : public TSpectrumEncoderLocal>> +{ + using TSpectrumEncoderLocal>>::m_boxAlgorithm; +public: + using TSpectrumEncoderLocal>>::uninitialize; + + TSpectrumEncoder() { } + + TSpectrumEncoder(T& boxAlgorithm, size_t index) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm, index); + } + + virtual ~TSpectrumEncoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTStimulationStreamEncoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTStimulationStreamEncoder.h new file mode 100644 index 0000000..b78a31e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTStimulationStreamEncoder.h @@ -0,0 +1,77 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "../../ovtk_base.h" + +#include "ovtkTEncoder.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TStimulationEncoderLocal : public T +{ +protected: + + Kernel::TParameterHandler m_iStimulationSet; + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_buffer; + + bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StimulationEncoder)); + m_codec->initialize(); + m_iStimulationSet.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_StimulationEncoder_InputParameterId_StimulationSet)); + m_buffer.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_StimulationEncoder_OutputParameterId_EncodedMemoryBuffer)); + + return true; + } + +public: + using T::initialize; + + bool uninitialize() + { + if (m_boxAlgorithm == nullptr || m_codec == nullptr) { return false; } + + m_iStimulationSet.uninitialize(); + m_buffer.uninitialize(); + m_codec->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_codec); + m_boxAlgorithm = NULL; + + return true; + } + + Kernel::TParameterHandler& getInputStimulationSet() { return m_iStimulationSet; } + +protected: + bool encodeHeaderImpl() { return m_codec->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeHeader); } + bool encodeBufferImpl() { return m_codec->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeBuffer); } + bool encodeEndImpl() { return m_codec->process(OVP_GD_Algorithm_StimulationEncoder_InputTriggerId_EncodeEnd); } +}; + +template +class TStimulationEncoder : public TStimulationEncoderLocal> +{ + using TStimulationEncoderLocal>::m_boxAlgorithm; +public: + using TStimulationEncoderLocal>::uninitialize; + + TStimulationEncoder() { } + + TStimulationEncoder(T& boxAlgorithm, size_t index) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm, index); + } + + virtual ~TStimulationEncoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTStreamedMatrixEncoder.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTStreamedMatrixEncoder.h new file mode 100644 index 0000000..65194b3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/encoders/ovtkTStreamedMatrixEncoder.h @@ -0,0 +1,86 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "../../ovtk_base.h" + +#include "ovtkTEncoder.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TStreamedMatrixEncoderLocal : public T +{ +protected: + //specific attribute : a matrix handler + Kernel::TParameterHandler m_iMatrix; + + using T::m_codec; + using T::m_boxAlgorithm; + using T::m_buffer; + + bool initializeImpl() + { + m_codec = &m_boxAlgorithm->getAlgorithmManager().getAlgorithm( + m_boxAlgorithm->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder)); + m_codec->initialize(); + m_iMatrix.initialize(m_codec->getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)); + m_buffer.initialize(m_codec->getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + + return true; + } + +public: + // we propagate the visiblity of TCodec::initialize + using T::initialize; + + bool uninitialize() + { + if (m_boxAlgorithm == nullptr || m_codec == nullptr) { return false; } + + m_iMatrix.uninitialize(); + m_buffer.uninitialize(); + m_codec->uninitialize(); + m_boxAlgorithm->getAlgorithmManager().releaseAlgorithm(*m_codec); + m_boxAlgorithm = NULL; + + return true; + } + + Kernel::TParameterHandler& getInputMatrix() { return m_iMatrix; } + +protected: + + /* + The methods specific to the Streamed Matrix encoder : + */ + bool encodeHeaderImpl() { return m_codec->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader); } + bool encodeBufferImpl() { return m_codec->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeBuffer); } + bool encodeEndImpl() { return m_codec->process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeEnd); } +}; + +/* +This class provides an access to the Local class. +It makes a lot easier the declaration of a Streamed Matrix encoder, as you don't have to specify any more template than the Box class (T). +*/ +template +class TStreamedMatrixEncoder : public TStreamedMatrixEncoderLocal> +{ + using TStreamedMatrixEncoderLocal>::m_boxAlgorithm; +public: + using TStreamedMatrixEncoderLocal>::uninitialize; + + TStreamedMatrixEncoder() { } + + TStreamedMatrixEncoder(T& boxAlgorithm, size_t index) + { + m_boxAlgorithm = NULL; + this->initialize(boxAlgorithm, index); + } + + virtual ~TStreamedMatrixEncoder() { this->uninitialize(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/ovtkTCodec.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/ovtkTCodec.h new file mode 100644 index 0000000..8f7ac1a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/ovtkTCodec.h @@ -0,0 +1,107 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +#include "../ovtk_base.h" + +/* +Few words about the Codec Toolkit: +---------------------------------- +The Codec Toolkit gives a simple and easy way to use the Encoders and Decoders, which are the most frequently used algorithms when developing a plugin. +The Toolkit makes wide use of Templates, in a way that may seem complex for a reviewer. Complexity is not in the number of line of code, but in the architecture. +The comments will try to help, and you may find relevant information on the dedicated tutorial and online doc: +- http://openvibe.inria.fr/documentation/unstable/Doc_Tutorial_Developer_SignalProcessing_CodecToolkit.html +- http://openvibe.inria.fr/documentation/unstable/Doc_Tutorial_Developer_SignalProcessing_CodecToolkit_Ref.html + +Contact : +--------- +Laurent Bonnet, INRIA Rennes. +www.openvibe.inria.fr/forum +*/ + + +/* +The Template inheritance: +------------------------- + +The Codec Toolkit uses template inheritance. This means that every class in templated by its superclass, starting with the most basic class : TCodec. +This architecture allows the Toolkit developer to enhance it anywhere in the inheritance diagram. +Here is the inheritance architecture hidden behind the templates : + +Level 0 : TCodec + > Purely Abstract + > Contains the box pointer and the codec algorithm + > Implements the public initialize(T&) function + +Level 1 : TEncoderLocal TDecoderLocal + > Partial implementation + > Contains the input or output memory buffer, and high level public functions (to decode and encode) + > This level is accessible but not instanciable, through the TEncoder and TDecoder subclasses. + +Level 2 : T_XXX_DecoderLocal T_XXX_EncoderLocal + > Implementation Level, for each stream type (except Streamed Matrix subtypes) + > These local classes contains + > - The specific parameter handlers (e.g. a matrix for the Streamed Matrix codecs) + > - the specific implementations of each functions (init, uninit, isXXXreceived, encodeXXX) + > They are instanciable through their non-local subclasses (e.g. TStreamedMatrixDecoder) + +Level 3 : T_StreamedMatrixSubType_DecoderLocal T_StreamedMatrixSubType_EncoderLocal + > Implementation level of the Streamed Matrix subtypes (Feature Vector, Spectrum, Signal) + > They are instanciable through their non-local subclasses (e.g. TFeatureVectorDecoder) + +Please look at TDecoder, TEncoder, TStreamedMatrixEncoder and TSignalEncoder classes for more details. +The Codec Toolkit reference page may also be useful. + +GL&HF +*/ + +namespace OpenViBE { +namespace Toolkit { +template +class TCodec +{ +protected: + + // We will need the dynamic box context when trying to decode and encode, thus we keep a pointer on the underlying box. + T* m_boxAlgorithm = nullptr; + + // Every codec has an algorithm + Kernel::IAlgorithmProxy* m_codec = nullptr; + size_t m_connectorIdx = 0;//one codec per connector + +public: + TCodec() : m_boxAlgorithm(nullptr) { } + virtual ~TCodec() { } + + //The initialization need a reference to the underlying box + //it will certainly be called in the box in such manner : m_codec.initialize(*this); + bool initialize(T& boxAlgorithm, const size_t connectorIdx) + { + if (m_boxAlgorithm == nullptr) + { + m_boxAlgorithm = &boxAlgorithm; + m_connectorIdx = connectorIdx; //TODO : can we check the box static context and verify the requested connector exist? + } + else { return false; } + // we call the initialization process specific to each codec + return initializeImpl(); + } + + // As we need to properly uninit parameter handlers before anything else, we can't design a common uninit behavior + virtual bool uninitialize() = 0; + +protected: + + // Note that this method is NOT public. + virtual bool initializeImpl() = 0; + + // for easier access to algorithm functionnality, we redefine some functions: + virtual bool isOutputTriggerActive(const CIdentifier trigger) { return m_codec->isOutputTriggerActive(trigger); } + + virtual bool process(const CIdentifier& trigger) { return m_codec->process(trigger); } + virtual bool process() { return m_codec->process(); } +}; +} // namespace Toolkit +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/ovtkTGenericCodec.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/ovtkTGenericCodec.h new file mode 100644 index 0000000..5ccff3d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/codecs/ovtkTGenericCodec.h @@ -0,0 +1,318 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE SDK + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#pragma once + +#include + +#include + +#include "../ovtk_base.h" +#include "decoders/ovtkTStreamedMatrixDecoder.h" +#include "decoders/ovtkTSignalDecoder.h" +#include "decoders/ovtkTSpectrumDecoder.h" +#include "decoders/ovtkTFeatureVectorDecoder.h" + +#include "encoders/ovtkTStreamedMatrixEncoder.h" +#include "encoders/ovtkTSignalEncoder.h" +#include "encoders/ovtkTSpectrumEncoder.h" +#include "encoders/ovtkTFeatureVectorEncoder.h" + +namespace OpenViBE { +namespace Toolkit { + +// ______________________________________________________________________________________________________________________________________________________________________________ +// ______________________________________________________________________________________________________________________________________________________________________________ +// + +#define decoder_return_impl(what) \ + if(m_signalDecoder) { return m_signalDecoder->what; } \ + if(m_spectrumDecoder) { return m_spectrumDecoder->what; } \ + if(m_featureVectorDecoder) { return m_featureVectorDecoder->what; } \ + return m_streamedMatrixDecoder->what; + +template +class TGenericDecoder +{ +protected: + + void reset() + { + m_streamedMatrixDecoder = nullptr; + m_signalDecoder = nullptr; + m_spectrumDecoder = nullptr; + m_featureVectorDecoder = nullptr; + } + +public: + + TGenericDecoder() : m_streamedMatrixDecoder(nullptr), m_signalDecoder(nullptr), m_spectrumDecoder(nullptr), m_featureVectorDecoder(nullptr) + { + this->reset(); + } + + ~TGenericDecoder() { this->uninitialize(); } + + TGenericDecoder& operator=(TStreamedMatrixDecoder* decoder) + { + this->reset(); + m_streamedMatrixDecoder = decoder; + return *this; + } + + TGenericDecoder& operator=(TSignalDecoder* decoder) + { + this->reset(); + m_signalDecoder = decoder; + return *this; + } + + TGenericDecoder& operator=(TSpectrumDecoder* decoder) + { + this->reset(); + m_spectrumDecoder = decoder; + return *this; + } + + TGenericDecoder& operator=(TFeatureVectorDecoder* decoder) + { + this->reset(); + m_featureVectorDecoder = decoder; + return *this; + } + + void uninitialize() { this->reset(); } + + Kernel::TParameterHandler& getOutputMatrix() + { + decoder_return_impl(getOutputMatrix()); + } + + Kernel::TParameterHandler& getOutputSamplingRate() + { + if (m_signalDecoder) { return m_signalDecoder->getOutputSamplingRate(); } + return m_spectrumDecoder->getOutputSamplingRate(); + } + + Kernel::TParameterHandler& getOutputFrequencyAbcissa() { return m_spectrumDecoder->getOutputFrequencyAbscissa(); } + + bool decode(int, int) = delete; + bool decode(size_t, size_t) = delete; + + bool decode(const size_t chunkIdx, bool bMarkInputAsDeprecated = true) + { + decoder_return_impl(decode(chunkIdx, bMarkInputAsDeprecated)); + } + + bool isHeaderReceived() + { + decoder_return_impl(isHeaderReceived()); + } + + bool isBufferReceived() + { + decoder_return_impl(isBufferReceived()); + } + + bool isEndReceived() + { + decoder_return_impl(isEndReceived()); + } + +protected: + + TStreamedMatrixDecoder* m_streamedMatrixDecoder = nullptr; + TSignalDecoder* m_signalDecoder = nullptr; + TSpectrumDecoder* m_spectrumDecoder = nullptr; + TFeatureVectorDecoder* m_featureVectorDecoder = nullptr; +}; + +// ______________________________________________________________________________________________________________________________________________________________________________ +// ______________________________________________________________________________________________________________________________________________________________________________ +// + +#define encoder_return_impl(what) \ + if(m_signalEncoder) { return m_signalEncoder->what; } \ + if(m_spectrumEncoder) { return m_spectrumEncoder->what; } \ + if(m_featureVectorEncoder) { return m_featureVectorEncoder->what; } \ + return m_streamedMatrixDecoder->what; + +template +class TGenericEncoder +{ +protected: + + void reset() + { + m_streamedMatrixDecoder = nullptr; + m_signalEncoder = nullptr; + m_spectrumEncoder = nullptr; + m_featureVectorEncoder = nullptr; + } + +public: + + TGenericEncoder() : m_streamedMatrixDecoder(nullptr), m_signalEncoder(nullptr), m_spectrumEncoder(nullptr), m_featureVectorEncoder(nullptr) + { + this->reset(); + } + + ~TGenericEncoder() { this->uninitialize(); } + + TGenericEncoder& operator=(TStreamedMatrixEncoder* pEncoder) + { + this->reset(); + m_streamedMatrixDecoder = pEncoder; + return *this; + } + + TGenericEncoder& operator=(TSignalEncoder* pEncoder) + { + this->reset(); + m_signalEncoder = pEncoder; + return *this; + } + + TGenericEncoder& operator=(TSpectrumEncoder* pEncoder) + { + this->reset(); + m_spectrumEncoder = pEncoder; + return *this; + } + + TGenericEncoder& operator=(TFeatureVectorEncoder* pEncoder) + { + this->reset(); + m_featureVectorEncoder = pEncoder; + return *this; + } + + void uninitialize() { this->reset(); } + + Kernel::TParameterHandler& getInputMatrix() + { + encoder_return_impl(getInputMatrix()); + } + + Kernel::TParameterHandler& getInputSamplingRate() + { + if (m_signalEncoder) { return m_signalEncoder->getInputSamplingRate(); } + return m_spectrumEncoder->getInputSamplingRate(); + } + + Kernel::TParameterHandler& getInputFrequencyAbcissa() { return m_spectrumEncoder->getInputFrequencyAbscissa(); } + + bool encodeHeader() + { + encoder_return_impl(encodeHeader()); + } + + bool encodeBuffer() + { + encoder_return_impl(encodeBuffer()); + } + + bool encodeEnd() + { + encoder_return_impl(encodeEnd()); + } + +protected: + + TStreamedMatrixEncoder* m_streamedMatrixDecoder = nullptr; + TSignalEncoder* m_signalEncoder = nullptr; + TSpectrumEncoder* m_spectrumEncoder = nullptr; + TFeatureVectorEncoder* m_featureVectorEncoder = nullptr; +}; + +// ______________________________________________________________________________________________________________________________________________________________________________ +// ______________________________________________________________________________________________________________________________________________________________________________ +// + +template +class TGenericListener final : public T +{ +public: + + typedef enum + { + Type_None = 0x00000000, + Type_StreamedMatrix = 0x00000001, + Type_Signal = 0x00000002, + Type_Spectrum = 0x00000004, + Type_Covariance = 0x00000008, + Type_All = 0xffffffff + } EType; + + explicit TGenericListener(const size_t typeFlag = Type_All) + { + if (typeFlag & Type_StreamedMatrix) m_allowedTypeIDs[OV_TypeId_StreamedMatrix] = true; + if (typeFlag & Type_Signal) m_allowedTypeIDs[OV_TypeId_Signal] = true; + if (typeFlag & Type_Spectrum) m_allowedTypeIDs[OV_TypeId_Spectrum] = true; + if (typeFlag & Type_Covariance) m_allowedTypeIDs[OV_TypeId_CovarianceMatrix] = true; + } + + bool isValidInputType(const CIdentifier& typeID, size_t /*index*/) + { + return m_allowedTypeIDs[typeID]; + //return (typeID==OV_TypeId_Signal || typeID==OV_TypeId_Spectrum); + } + + virtual bool onInputTypeChanged(Kernel::IBox& box, const size_t index) + { + CIdentifier typeID = CIdentifier::undefined(); + box.getInputType(index, typeID); + if (this->isValidInputType(typeID, index)) { box.setOutputType(index, typeID); } + else + { + box.getOutputType(index, typeID); + box.setInputType(index, typeID); + } + return true; + } + + bool isValidOutputType(const CIdentifier& typeID, size_t /*index*/) + { + return m_allowedTypeIDs[typeID]; + //return (typeID==OV_TypeId_Signal || typeID==OV_TypeId_Spectrum); + } + + virtual bool onOutputTypeChanged(Kernel::IBox& box, const size_t index) + { + CIdentifier typeID = CIdentifier::undefined(); + box.getOutputType(index, typeID); + if (this->isValidOutputType(typeID, index)) { box.setInputType(index, typeID); } + else + { + box.getInputType(index, typeID); + box.setOutputType(index, typeID); + } + return true; + } + + _IsDerivedFromClass_Final_(T, CIdentifier::undefined()) + +private: + + std::map m_allowedTypeIDs; +}; +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtkIFeatureVector.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtkIFeatureVector.h new file mode 100644 index 0000000..724c806 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtkIFeatureVector.h @@ -0,0 +1,17 @@ +#pragma once + +#include "ovtkIVector.h" + +namespace OpenViBE { +namespace Toolkit { +class OVTK_API IFeatureVector : public IVector +{ +public: + + virtual double getLabel() const = 0; + virtual bool setLabel(const double label) = 0; + + _IsDerivedFromClass_(IVector, OVTK_ClassId_FeatureVector) +}; +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtkIFeatureVectorSet.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtkIFeatureVectorSet.h new file mode 100644 index 0000000..904e5fa --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtkIFeatureVectorSet.h @@ -0,0 +1,28 @@ +#pragma once + +#include "ovtk_base.h" + +namespace OpenViBE { +namespace Toolkit { +class IFeatureVector; + +class OVTK_API IFeatureVectorSet : public IObject +{ +public: + + virtual size_t getFeatureVectorCount() const = 0; + virtual bool setFeatureVectorCount(const size_t featureVector) = 0; + virtual bool addFeatureVector(const IFeatureVector& featureVector) = 0; + + virtual IFeatureVector& getFeatureVector(const size_t index) = 0; + virtual const IFeatureVector& getFeatureVector(const size_t index) const = 0; + virtual size_t getLabelCount() const = 0; + + _IsDerivedFromClass_(IObject, OVTK_ClassId_FeatureVectorSet) + + const IFeatureVector& operator [](const size_t index) const { return this->getFeatureVector(index); } + + IFeatureVector& operator [](const size_t index) { return this->getFeatureVector(index); } +}; +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtkIVector.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtkIVector.h new file mode 100644 index 0000000..86dda79 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtkIVector.h @@ -0,0 +1,24 @@ +#pragma once + +#include "ovtk_base.h" + +namespace OpenViBE { +namespace Toolkit { +class OVTK_API IVector : public IObject +{ +public: + + virtual uint32_t getSize() const = 0; + virtual bool setSize(const uint32_t size) = 0; + virtual double* getBuffer() = 0; + virtual const double* getBuffer() const = 0; + virtual const char* getElementLabel(const uint32_t index) const = 0; + virtual bool setElementLabel(const uint32_t index, const char* sElementLabel) = 0; + + _IsDerivedFromClass_(IObject, OVTK_ClassId_Vector) + + const double& operator [](const uint32_t index) const { return this->getBuffer()[index]; } + double& operator [](const uint32_t index) { return this->getBuffer()[index]; } +}; +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtk_all.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtk_all.h new file mode 100644 index 0000000..157f51f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtk_all.h @@ -0,0 +1,97 @@ +#pragma once + + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines + +//___________________________________________________________________// +// // +// Basic includes // +//___________________________________________________________________// +// // + +#include "ovtk_defines.h" + +//___________________________________________________________________// +// // +// Tools // +//___________________________________________________________________// +// // + +#include "tools/ovtkMatrix.h" +#include "tools/ovtkStimulationSet.h" +#include "tools/ovtkString.h" + +//___________________________________________________________________// +// // +// Codecs // +//___________________________________________________________________// +// // + +#include "codecs/ovtkTCodec.h" +#include "codecs/ovtkTGenericCodec.h" +#include "codecs/encoders/ovtkTEncoder.h" +#include "codecs/decoders/ovtkTDecoder.h" + +#include "codecs/decoders/ovtkTAcquisitionDecoder.h" + +#include "codecs/decoders/ovtkTStreamStructureDecoder.h" + +#include "codecs/encoders/ovtkTStimulationStreamEncoder.h" +#include "codecs/decoders/ovtkTStimulationStreamDecoder.h" + +#include "codecs/encoders/ovtkTStreamedMatrixEncoder.h" +#include "codecs/decoders/ovtkTStreamedMatrixDecoder.h" + +#include "codecs/encoders/ovtkTSignalEncoder.h" +#include "codecs/decoders/ovtkTSignalDecoder.h" + +#include "codecs/encoders/ovtkTChannelLocalisationEncoder.h" +#include "codecs/decoders/ovtkTChannelLocalisationDecoder.h" + +#include "codecs/encoders/ovtkTChannelUnitsEncoder.h" +#include "codecs/decoders/ovtkTChannelUnitsDecoder.h" + +#include "codecs/encoders/ovtkTExperimentInfoEncoder.h" +#include "codecs/decoders/ovtkTExperimentInfoDecoder.h" + +#include "codecs/encoders/ovtkTFeatureVectorEncoder.h" +#include "codecs/decoders/ovtkTFeatureVectorDecoder.h" + +#include "codecs/encoders/ovtkTSpectrumEncoder.h" +#include "codecs/decoders/ovtkTSpectrumDecoder.h" + +//___________________________________________________________________// +// // +// // +//___________________________________________________________________// +// // + +#include "ovtkIVector.h" +#include "ovtkIFeatureVector.h" +#include "ovtkIFeatureVectorSet.h" + +#include "box-algorithms/ovtkTBoxAlgorithm.h" + +#include "algorithms/ovtkTAlgorithm.h" +#include "algorithms/classification/ovtkCAlgorithmClassifier.h" +#include "algorithms/classification/ovtkCAlgorithmPairingStrategy.h" + +#include "algorithms/scenario-io/ovtkCAlgorithmScenarioImporter.h" +#include "algorithms/scenario-io/ovtkCAlgorithmScenarioExporter.h" + +//___________________________________________________________________// +// // +// // +//___________________________________________________________________// +// // + +namespace OpenViBE { +namespace Toolkit { +OVTK_API bool initialize(const Kernel::IKernelContext& ctx); +OVTK_API bool uninitialize(const Kernel::IKernelContext& ctx); + +bool initializeStimulationList(const Kernel::IKernelContext& ctx); +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtk_base.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtk_base.h new file mode 100644 index 0000000..9a867e4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtk_base.h @@ -0,0 +1,32 @@ +#pragma once + +#include "ovtk_defines.h" + +#include + +namespace EBML { +class IWriter; +class IWriterCallback; +class IWriterHelper; +class IReader; +class IReaderCallback; +class IReaderHelper; +} // namespace EBML + +namespace OpenViBE { +namespace Toolkit { +template +class TScopeHandle +{ +public: + + TScopeHandle(THandledType& rHandler, THandledType& rHandledValue) : m_handler(rHandler), m_lastHandledValue(rHandler) { m_handler = rHandledValue; } + ~TScopeHandle() { m_handler = m_lastHandledValue; } + +private: + + THandledType& m_handler; + THandledType m_lastHandledValue; +}; +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtk_defines.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtk_defines.h new file mode 100755 index 0000000..0b83c73 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/ovtk_defines.h @@ -0,0 +1,856 @@ +#pragma once + +#include + +//__________________________________________________________________// +// // +// OpenViBE toolkit input and output type identifiers // +//__________________________________________________________________// +// // + +#define OVTK_TypeId_Boolean OpenViBE::CIdentifier(0x2CDB2F0B, 0x12F231EA) +#define OVTK_TypeId_Integer OpenViBE::CIdentifier(0x007DEEF9, 0x2F3E95C6) +#define OVTK_TypeId_Float OpenViBE::CIdentifier(0x512A166F, 0x5C3EF83F) +#define OVTK_TypeId_String OpenViBE::CIdentifier(0x79A9EDEB, 0x245D83FC) +#define OVTK_TypeId_Filename OpenViBE::CIdentifier(0x330306DD, 0x74A95F98) +#define OVTK_TypeId_Stimulation OpenViBE::CIdentifier(0x2C132D6E, 0x44AB0D97) +#define OVTK_TypeId_GDF_Stimulation OpenViBE::CIdentifier(0xA538DBF0, 0xBC229750) + +#define OVTK_TypeId_ClassificationAlgorithm OpenViBE::CIdentifier(0xD765A736, 0xED708C65) +#define OVTK_TypeId_ClassificationStrategy OpenViBE::CIdentifier(0xBE9EBA5C, 0xA8415D37) + + +//__________________________________________________________________// +// // +// OpenViBE toolkit stream type identifiers // +//__________________________________________________________________// +// // + +#define OVTK_TypeId_EBMLStream OpenViBE::CIdentifier(0x434F6587, 0x2EFD2B7E) +#define OVTK_TypeId_ExperimentInfo OpenViBE::CIdentifier(0x403488E7, 0x565D70B6) +#define OVTK_TypeId_ExperimentationInformation OpenViBE::CIdentifier(0x403488E7, 0x565D70B6) // deprecated token, kept for compatibility, equal to the one above +#define OVTK_TypeId_Stimulations OpenViBE::CIdentifier(0x6F752DD0, 0x082A321E) +#define OVTK_TypeId_StreamedMatrix OpenViBE::CIdentifier(0x544A003E, 0x6DCBA5F6) +#define OVTK_TypeId_FeatureVector OpenViBE::CIdentifier(0x17341935, 0x152FF448) +#define OVTK_TypeId_Signal OpenViBE::CIdentifier(0x5BA36127, 0x195FEAE1) +#define OVTK_TypeId_Spectrum OpenViBE::CIdentifier(0x1F261C0A, 0x593BF6BD) +#define OVTK_TypeId_ChannelLocalisation OpenViBE::CIdentifier(0x013DF452, 0xA3A8879A) +#define OVTK_TypeId_ChannelUnits OpenViBE::CIdentifier(0x6AB26B81, 0x0F8C02F3) + + +//__________________________________________________________________// +// // +// ISO 5218 conformant sex identifiers // +//__________________________________________________________________// +// // + +// deprecated +#define OVTK_Value_Sex_Unknown 0 +#define OVTK_Value_Sex_Male 1 +#define OVTK_Value_Sex_Female 2 +#define OVTK_Value_Sex_NotSpecified 9 + +#define OVTK_Value_Gender_Unknown 0 +#define OVTK_Value_Gender_Male 1 +#define OVTK_Value_Gender_Female 2 +#define OVTK_Value_Gender_NotSpecified 9 + +//__________________________________________________________________// +// // +// OpenViBE toolkit stimulation identifiers // +//__________________________________________________________________// +// // + +#define OVTK_StimulationId_Label(i) 0x00008100|((i)&0xff) +#define OVTK_StimulationId_LabelStart 0x00008100 +#define OVTK_StimulationId_LabelEnd 0x000081ff + +// These are low-order stimulations that may be required for some legacy communication +// channels like parallel port handling only 1 byte codes. The name and number of these stimuli exactly matches. +#define OVTK_StimulationId_NumberStart 0x00000000 +#define OVTK_StimulationId_NumberEnd 0x000000ff + +#define OVTK_GDF_Condition(i) (i) + +#define OVTK_StimulationId_ThresholdPassed_Positive 0x00008209 +#define OVTK_StimulationId_ThresholdPassed_Negative 0x00008210 + +#define OVTK_StimulationId_NoArtifact 0x00008301 +#define OVTK_StimulationId_Artifact 0x00008302 + +//__________________________________________________________________// +// // +// Measurement units // +//__________________________________________________________________// +// // +// These units attempt to be compatible with those specified by Alois Schloegl in the BioSig project, see http://biosig.sf.net/ +// +// See also e.g. +// ISO/IEEE 11073-10101:2004, Health informatics - Point-of-care medical device communication - Part 10101: Nomenclature +// +// @TODO it would be better to read these from a database file (along with the symbols now specified in ovtk_main.cpp), +// however we still need the defines if we wish to provide compile-time token support. +// +// Note: Since these will be stored as double when transmitted by OpenViBE, they should not exceed the floats integer precision +// + +#define OVTK_UNIT_Unspecified 0 +#define OVTK_UNIT_Dimensionless 512 +#define OVTK_UNIT_10_2_Percent 544 +#define OVTK_UNIT_10_3_Parts_Per_Thousand 576 +#define OVTK_UNIT_10_6_Parts_Per_Million 608 +#define OVTK_UNIT_10_9_Parts_Per_Milliard 640 +#define OVTK_UNIT_10_12_Parts_Per_Billion 672 +#define OVTK_UNIT_10_18_Parts_Per_Trillion 704 +#define OVTK_UNIT_Angle_Degree 736 +#define OVTK_UNIT_Angle_Radian 768 +#define OVTK_UNIT_Grams_Per_Gram 800 +#define OVTK_UNIT_Grams_Per_Kilogram 832 +#define OVTK_UNIT_Moles_Per_Mole 864 +#define OVTK_UNIT_Litres_Per_Litre 896 +#define OVTK_UNIT_Cubic_Metres_Per_Cubic_Metre 928 +#define OVTK_UNIT_Cubic_Metres_Per_Cubic_Centimetre 960 +#define OVTK_UNIT_Volume_Percent 6240 +#define OVTK_UNIT_Ph 992 +#define OVTK_UNIT_Drop 1024 +#define OVTK_UNIT_Red_Blood_Cells 1056 +#define OVTK_UNIT_Beat 1088 +#define OVTK_UNIT_Breath 1120 +#define OVTK_UNIT_Cell 1152 +#define OVTK_UNIT_Cough 1184 +#define OVTK_UNIT_Sigh 1216 +#define OVTK_UNIT_Percent_Of_Packed_Cell_Volume 1248 +#define OVTK_UNIT_Metres 1280 +#define OVTK_UNIT_Yard 1312 +#define OVTK_UNIT_Foot 1344 +#define OVTK_UNIT_Inch 1376 +#define OVTK_UNIT_Litres_Per_Square_Metre 1408 +#define OVTK_UNIT_Per_Metre 1440 +#define OVTK_UNIT_Square_Metres 1472 +#define OVTK_UNIT_Square_Inch 1504 +#define OVTK_UNIT_Per_Square_Metre 1536 +#define OVTK_UNIT_Cubic_Metres 1568 +#define OVTK_UNIT_Litres 1600 +#define OVTK_UNIT_Litres_Per_Breath 1632 +#define OVTK_UNIT_Litres_Per_Beat 6112 +#define OVTK_UNIT_Per_Cubic_Metre 1664 +#define OVTK_UNIT_Per_Litre 1696 +#define OVTK_UNIT_Gram 1728 +#define OVTK_UNIT_Pound 1760 +#define OVTK_UNIT_Ounce 1792 +#define OVTK_UNIT_Per_Gram 1824 +#define OVTK_UNIT_Gram_Metre 1856 +#define OVTK_UNIT_Grams_Meter_Per_Square_Metre 1888 +#define OVTK_UNIT_Gram_Metre_Squared 1920 +#define OVTK_UNIT_Kilograms_Per_Square_Metre 1952 +#define OVTK_UNIT_Grams_Per_Cubic_Metre 1984 +#define OVTK_UNIT_Grams_Per_Cubic_Centimetre 2016 +#define OVTK_UNIT_Grams_Per_Litre 2048 +#define OVTK_UNIT_Grams_Per_Centilitre 2080 +#define OVTK_UNIT_Grams_Per_Decilitre 2112 +#define OVTK_UNIT_Grams_Per_Millilitre 2144 +#define OVTK_UNIT_Second 2176 +#define OVTK_UNIT_Minute 2208 +#define OVTK_UNIT_Hour 2240 +#define OVTK_UNIT_Day 2272 +#define OVTK_UNIT_Weeks 2304 +#define OVTK_UNIT_Months 2336 +#define OVTK_UNIT_Year 2368 +#define OVTK_UNIT_Time_Of_Day_Hh_Mm_Ss 2400 +#define OVTK_UNIT_Date_Yyyy_Mm_Dd 2432 +#define OVTK_UNIT_Per_Second 2464 +#define OVTK_UNIT_Hertz 2496 +#define OVTK_UNIT_Per_Minute 2528 +#define OVTK_UNIT_Per_Hour 2560 +#define OVTK_UNIT_Per_Day 2592 +#define OVTK_UNIT_Per_Week 2624 +#define OVTK_UNIT_Per_Month 2656 +#define OVTK_UNIT_Per_Year 2688 +#define OVTK_UNIT_Beat_Per_Minute 2720 +#define OVTK_UNIT_Puls_Per_Minute 2752 +#define OVTK_UNIT_Respirations_Per_Minute 2784 +#define OVTK_UNIT_Metres_Per_Second 2816 +#define OVTK_UNIT_Litres_Per_Minute_Per_Square_Meter 2848 +#define OVTK_UNIT_Square_Metres_Per_Second 2880 +#define OVTK_UNIT_Cubic_Metres_Per_Second 2912 +#define OVTK_UNIT_Cubic_Metres_Per_Minute 2944 +#define OVTK_UNIT_Cubic_Metres_Per_Hour 2976 +#define OVTK_UNIT_Cubic_Metres_Per_Day 3008 +#define OVTK_UNIT_Litres_Per_Second 3040 +#define OVTK_UNIT_Litres_Per_Minute 3072 +#define OVTK_UNIT_Litres_Per_Hour 3104 +#define OVTK_UNIT_Litres_Per_Day 3136 +#define OVTK_UNIT_Litres_Per_Kilogram 3168 +#define OVTK_UNIT_Cubic_Metres_Per_Kilogram 3200 +#define OVTK_UNIT_Meter_Per_Pascal_Second 3232 +#define OVTK_UNIT_Litre_Per_Min_Per_Millimetre_Of_Mercury 3264 +#define OVTK_UNIT_Grams_Per_Second 3296 +#define OVTK_UNIT_Grams_Per_Minute 3328 +#define OVTK_UNIT_Grams_Per_Hour 3360 +#define OVTK_UNIT_Grams_Per_Day 3392 +#define OVTK_UNIT_Grams_Per_Kilogram_Per_Second 3424 +#define OVTK_UNIT_Grams_Per_Kilogram_Per_Minute 3456 +#define OVTK_UNIT_Grams_Per_Kilogram_Per_Hour 3488 +#define OVTK_UNIT_Grams_Per_Kilogram_Per_Day 3520 +#define OVTK_UNIT_Grams_Per_Litre_Per_Second 3552 +#define OVTK_UNIT_Grams_Per_Litre_Per_Minute 3584 +#define OVTK_UNIT_Grams_Per_Litre_Per_Hour 3616 +#define OVTK_UNIT_Grams_Per_Litre_Per_Day 3648 +#define OVTK_UNIT_Grams_Per_Meter_Per_Second 3680 +#define OVTK_UNIT_Gram_Metres_Per_Second 3712 +#define OVTK_UNIT_Newton_Seconds 3744 +#define OVTK_UNIT_Newton 3776 +#define OVTK_UNIT_Dyne 3808 +#define OVTK_UNIT_Pascal 3840 +#define OVTK_UNIT_Millimetres_Of_Mercury 3872 +#define OVTK_UNIT_Centimetre_Of_Water 3904 +#define OVTK_UNIT_Bar 3936 +#define OVTK_UNIT_Joules 3968 +#define OVTK_UNIT_Electronvolts 4000 +#define OVTK_UNIT_Watts 4032 +#define OVTK_UNIT_Pascal_Second_Per_Cubic_Meter 4064 +#define OVTK_UNIT_Pascal_Second_Per_Litre 4096 +#define OVTK_UNIT_Dyne_Second_Per_Cm5 4128 +#define OVTK_UNIT_Litre_Per_Centimetre_Of_Water 5888 +#define OVTK_UNIT_Litre_Per_Millimetre_Of_Mercury 6272 +#define OVTK_UNIT_Litre_Per_Pascal 6304 +#define OVTK_UNIT_Centimetre_Of_Water_Per_Litre 6144 +#define OVTK_UNIT_Millimetre_Of_Mercury_Per_Litre 6336 +#define OVTK_UNIT_Pascal_Per_Litre 6368 +#define OVTK_UNIT_Amperes 4160 +#define OVTK_UNIT_Coulombs 4192 +#define OVTK_UNIT_Amperes_Hour 6080 +#define OVTK_UNIT_Amperes_Per_Metre 4224 +#define OVTK_UNIT_Volts 4256 +#define OVTK_UNIT_Ohms 4288 +#define OVTK_UNIT_Ohm_Metres 4320 +#define OVTK_UNIT_Farads 4352 +#define OVTK_UNIT_Kelvin 4384 +#define OVTK_UNIT_Degree_Celcius 6048 +#define OVTK_UNIT_Degree_Fahrenheit 4416 +#define OVTK_UNIT_Kelvins_Per_Watt 4448 +#define OVTK_UNIT_Candelas 4480 +#define OVTK_UNIT_Osmoles 4512 +#define OVTK_UNIT_Moles 4544 +#define OVTK_UNIT_Equivalent 4576 +#define OVTK_UNIT_Osmoles_Per_Litre 4608 +#define OVTK_UNIT_Moles_Per_Cubic_Centimetre 4640 +#define OVTK_UNIT_Moles_Per_Cubic_Metre 4672 +#define OVTK_UNIT_Moles_Per_Litre 4704 +#define OVTK_UNIT_Moles_Per_Millilitre 4736 +#define OVTK_UNIT_Equivalents_Per_Cubic_Centimetre 4768 +#define OVTK_UNIT_Equivalents_Per_Cubic_Metre 4800 +#define OVTK_UNIT_Equivalents_Per_Litre 4832 +#define OVTK_UNIT_Equivalents_Per_Millilitre 4864 +#define OVTK_UNIT_Osmoles_Per_Kilogram 4896 +#define OVTK_UNIT_Moles_Per_Kilogram 4928 +#define OVTK_UNIT_Moles_Per_Second 4960 +#define OVTK_UNIT_Moles_Per_Minute 4992 +#define OVTK_UNIT_Moles_Per_Hour 5024 +#define OVTK_UNIT_Moles_Per_Day 5056 +#define OVTK_UNIT_Equivalents_Per_Second 5088 +#define OVTK_UNIT_Equivalents_Per_Minute 5120 +#define OVTK_UNIT_Equivalents_Per_Hour 5152 +#define OVTK_UNIT_Equivalents_Per_Day 5184 +#define OVTK_UNIT_Moles_Per_Kilogram_Per_Second 5216 +#define OVTK_UNIT_Moles_Per_Kilogram_Per_Minute 5248 +#define OVTK_UNIT_Moles_Per_Kilogram_Per_Hour 5280 +#define OVTK_UNIT_Moles_Per_Kilogram_Per_Day 5312 +#define OVTK_UNIT_Equivalents_Per_Kilogram_Per_Second 5344 +#define OVTK_UNIT_Equivalents_Per_Kilogram_Per_Minute 5376 +#define OVTK_UNIT_Equivalents_Per_Kilogram_Per_Hour 5408 +#define OVTK_UNIT_Equivalents_Per_Kilogram_Per_Day 5440 +#define OVTK_UNIT_International_Unit 5472 +#define OVTK_UNIT_International_Units_Per_Cubic_Centimetre 5504 +#define OVTK_UNIT_International_Units_Per_Cubic_Meter 5536 +#define OVTK_UNIT_International_Units_Per_Litre 5568 +#define OVTK_UNIT_International_Units_Per_Millilitre 5600 +#define OVTK_UNIT_International_Units_Per_Second 5632 +#define OVTK_UNIT_International_Units_Per_Minute 5664 +#define OVTK_UNIT_International_Units_Per_Hour 5696 +#define OVTK_UNIT_International_Units_Per_Day 5728 +#define OVTK_UNIT_International_Units_Per_Kilogram_Per_Second 5760 +#define OVTK_UNIT_International_Units_Per_Kilogram_Per_Minute 5792 +#define OVTK_UNIT_International_Units_Per_Kilogram_Per_Hour 5824 +#define OVTK_UNIT_International_Units_Per_Kilogram_Per_Day 5856 +#define OVTK_UNIT_Centimetre_Of_Water_Per_Litre_Per_Second 5920 +#define OVTK_UNIT_Litre_Squared_Per_Second 5952 +#define OVTK_UNIT_Centimetre_Of_Water_Per_Percent 5984 +#define OVTK_UNIT_Dyne_Seconds_Per_Square_Meter_Per_Centimetre_To_The_Power_Of_5 6016 +#define OVTK_UNIT_Millimetres_Of_Mercury_Per_Percent 6176 +#define OVTK_UNIT_Pascal_Per_Percent 6208 +#define OVTK_UNIT_Relative_Power_Decibel 6432 +#define OVTK_UNIT_Meter_Per_Second_Squared 6624 +#define OVTK_UNIT_Radians_Per_Second_Squared 6656 +#define OVTK_UNIT_Foot_Per_Minute 6688 +#define OVTK_UNIT_Inch_Per_Minute 6720 +#define OVTK_UNIT_Step_Per_Minute 6752 +#define OVTK_UNIT_Kilocalories 6784 +#define OVTK_UNIT_Revolution_Per_Minute 6816 +#define OVTK_UNIT_V_Per_S 65152 +#define OVTK_UNIT_M_Per_M 65184 +#define OVTK_UNIT_Velocity_Kilometer_Per_Hour 65216 +#define OVTK_UNIT_Left_Stroke_Work_Index_Lswi 65248 +#define OVTK_UNIT_Indexed_Left_Cardiac_Work_Lcwi 65280 +#define OVTK_UNIT_Mhg_Per_S 65312 +#define OVTK_UNIT_Millimol_Per_Liter_X_Millimeter 65344 +#define OVTK_UNIT_Rotations_Per_Minute 65376 +#define OVTK_UNIT_Dyne_Seconds_Square_Meter_Per_Centimetre_To_The_Power_Of_5 65440 +#define OVTK_UNIT_Litres_Per_Square_Meter 65472 +#define OVTK_UNIT_Tesla 65504 + +// OpenViBE extensions, starting from 100001 +#define OVTK_UNIT_Degree_Per_Second 100001 + + +//__________________________________________________________________// +// // +// Measurement Factors // +//__________________________________________________________________// +// // +// These are the usual metric prefixes (also known as SI prefixes) +// +// The number of each prefix encodes the exponent in the 1e00 notation. +// +// OpenViBE enums are unsigned integers. Here we use the convention of ORring with 0x00010000 to denote the negative exponents. +// +// Note: Since these will be stored as double when transmitted by OpenViBE, they should not exceed the floats integer precision +// + +#define OVTK_FACTOR_Yotta 24 +#define OVTK_FACTOR_Zetta 21 +#define OVTK_FACTOR_Exa 18 +#define OVTK_FACTOR_Peta 15 +#define OVTK_FACTOR_Tera 12 +#define OVTK_FACTOR_Giga 9 +#define OVTK_FACTOR_Mega 6 +#define OVTK_FACTOR_Kilo 3 +#define OVTK_FACTOR_Hecto 2 +#define OVTK_FACTOR_Deca 1 +#define OVTK_FACTOR_Base 0 +#define OVTK_FACTOR_Deci (1 | 0x00010000) // 65537 +#define OVTK_FACTOR_Centi (2 | 0x00010000) // 65538 +#define OVTK_FACTOR_Milli (3 | 0x00010000) // 65539 +#define OVTK_FACTOR_Micro (6 | 0x00010000) // 65540 +#define OVTK_FACTOR_Nano (9 | 0x00010000) // 65541 +#define OVTK_FACTOR_Pico (12 | 0x00010000) // 65542 +#define OVTK_FACTOR_Femto (15 | 0x00010000) // 65543 +#define OVTK_FACTOR_Atto (18 | 0x00010000) // 65544 +#define OVTK_FACTOR_Zepto (21 | 0x00010000) // 65545 +#define OVTK_FACTOR_Yocto (24 | 0x00010000) // 65546 + +// Convert the factor code to a signer integer +#define OVTK_DECODE_FACTOR(factor) ( ((factor) & 0x00010000) ? -int((factor) & 0x0000FFFF) : int(factor) ) + +//__________________________________________________________________// +// // +// Acquisition stream node identifiers // +//__________________________________________________________________// +// // + +/* + * Acquisition stream description + * + * v1 july 2006 + * v2 march 2008 + * v3 november 2014 + * + * This is a multiplexed stream + * + * version 3 : + * ----------------------------------------------------------------- * + * OVTK_NodeId_Header + * OVTK_NodeId_Acquisition_Header_ExperimentInfo + * ... some experiment information stream header + * OVTK_NodeId_Acquisition_Header_Signal + * ... some signal stream header + * OVTK_NodeId_Acquisition_Header_Stimulation + * ... some stimulation stream header + * OVTK_NodeId_Acquisition_Header_ChannelLocalisation + * ... some channel localisation stream header + * OVTK_NodeId_Acquisition_Header_ChannelUnits + * ... some channel units stream header + * OVTK_NodeId_Buffer + * OVTK_NodeId_Acquisition_Buffer_ExperimentInfo + * ... some experiment information stream buffer + * OVTK_NodeId_Acquisition_Buffer_Signal + * ... some signal stream buffer + * OVTK_NodeId_Acquisition_Buffer_Stimulation + * ... some stimulation stream buffer + * OVTK_NodeId_Acquisition_Buffer_ChannelLocalisation + * ... some channel localisation stream buffer + * OVTK_NodeId_Acquisition_Buffer_ChannelUnits + * ... some channel units stream buffer + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer + * ... + */ + +#define OVTK_NodeId_Acquisition_Header_BufferDuration EBML::CIdentifier(0x00000000, 0x00000080) +#define OVTK_NodeId_Acquisition_Header_ExperimentInfo EBML::CIdentifier(0x00000000, 0x00000081) +#define OVTK_NodeId_Acquisition_Header_Signal EBML::CIdentifier(0x00000000, 0x00000082) +#define OVTK_NodeId_Acquisition_Header_Stimulation EBML::CIdentifier(0x00000000, 0x00000083) +#define OVTK_NodeId_Acquisition_Header_ChannelLocalisation EBML::CIdentifier(0x00000000, 0x00000084) +#define OVTK_NodeId_Acquisition_Header_ChannelUnits EBML::CIdentifier(0x00000000, 0x00000085) +#define OVTK_NodeId_Acquisition_Buffer_ExperimentInfo EBML::CIdentifier(0x00000000, 0x00000041) +#define OVTK_NodeId_Acquisition_Buffer_Signal EBML::CIdentifier(0x00000000, 0x00000042) +#define OVTK_NodeId_Acquisition_Buffer_Stimulation EBML::CIdentifier(0x00000000, 0x00000043) +#define OVTK_NodeId_Acquisition_Buffer_ChannelLocalisation EBML::CIdentifier(0x00000000, 0x00000044) +#define OVTK_NodeId_Acquisition_Buffer_ChannelUnits EBML::CIdentifier(0x00000000, 0x00000045) + +#define OVTK_NodeId_Acquisition_Header EBML::CIdentifier(0x00000000, 0x00004239) // deprecated +#define OVTK_NodeId_Acquisition_AcquisitionInfo EBML::CIdentifier(0x00000000, 0x00004240) // deprecated +#define OVTK_NodeId_Acquisition_ExperimentId EBML::CIdentifier(0x00000000, 0x00004241) // deprecated +#define OVTK_NodeId_Acquisition_SubjectAge EBML::CIdentifier(0x00000000, 0x00004242) // deprecated +#define OVTK_NodeId_Acquisition_SubjectGender EBML::CIdentifier(0x00000000, 0x00004243) // deprecated +#define OVTK_NodeId_Acquisition_ChannelCount EBML::CIdentifier(0x00000000, 0x00004244) // deprecated +#define OVTK_NodeId_Acquisition_Sampling EBML::CIdentifier(0x00000000, 0x00004245) // deprecated +#define OVTK_NodeId_Acquisition_ChannelNames EBML::CIdentifier(0x00000000, 0x00004246) // deprecated +#define OVTK_NodeId_Acquisition_ChannelName EBML::CIdentifier(0x00000000, 0x00004247) // deprecated +#define OVTK_NodeId_Acquisition_GainFactors EBML::CIdentifier(0x00000000, 0x00004248) // deprecated +#define OVTK_NodeId_Acquisition_GainFactor EBML::CIdentifier(0x00000000, 0x00004249) // deprecated +#define OVTK_NodeId_Acquisition_ChannelLocations EBML::CIdentifier(0x00000000, 0x00004250) // deprecated +#define OVTK_NodeId_Acquisition_ChannelLocation EBML::CIdentifier(0x00000000, 0x00004251) // deprecated +#define OVTK_NodeId_Acquisition_Buffer EBML::CIdentifier(0x00000000, 0x0000005A) // deprecated +#define OVTK_NodeId_Acquisition_Samples EBML::CIdentifier(0x00000000, 0x0000005B) // deprecated +#define OVTK_NodeId_Acquisition_SamplesPerChannelCount EBML::CIdentifier(0x00000000, 0x0000005C) // deprecated +#define OVTK_NodeId_Acquisition_SampleBlock EBML::CIdentifier(0x00000000, 0x0000005D) // deprecated +#define OVTK_NodeId_Acquisition_Stimulations EBML::CIdentifier(0x00000000, 0x00000060) // deprecated +#define OVTK_NodeId_Acquisition_StimulationsCount EBML::CIdentifier(0x00000000, 0x00000061) // deprecated +#define OVTK_NodeId_Acquisition_Stimulation EBML::CIdentifier(0x00000000, 0x00000062) // deprecated +#define OVTK_NodeId_Acquisition_StimulationSampleIndex EBML::CIdentifier(0x00000000, 0x00000063) // deprecated +#define OVTK_NodeId_Acquisition_StimulationIdentifier EBML::CIdentifier(0x00000000, 0x00000064) // deprecated +#define OVTK_NodeId_Acquisition_SubjectSex EBML::CIdentifier(0x00000000, 0x00004243) // deprecated + +//__________________________________________________________________// +// // +// Protocol hierarchy // +//__________________________________________________________________// +// // + +/* + * - Standard EBML stream + * - Experiment information + * - Stimulation + * - Streamed Matrix + * - Signal + * - Spectrum + * - Feature vector + * - Channel localisation + * - Channel units + */ + +//__________________________________________________________________// +// // +// Standard EBML stream node identifiers // +//__________________________________________________________________// +// // + +#define OVTK_NodeId_Header EBML::CIdentifier(0x002B395F, 0x108ADFAE) +#define OVTK_NodeId_Header_StreamType EBML::CIdentifier(0x00CDD0F7, 0x46B0278D) +#define OVTK_NodeId_Header_StreamVersion EBML::CIdentifier(0x006F5A08, 0x7796EBC5) +#define OVTK_NodeId_Buffer EBML::CIdentifier(0x00CF2101, 0x02375310) +#define OVTK_NodeId_End EBML::CIdentifier(0x00D9DDC3, 0x0B12873A) + +//__________________________________________________________________// +// // +// Streamed matrix stream node identifiers // +//__________________________________________________________________// +// // + +#define OVTK_NodeId_Header_StreamedMatrix EBML::CIdentifier(0x0072F560, 0x7ED2CBED) +#define OVTK_NodeId_Header_StreamedMatrix_DimensionCount EBML::CIdentifier(0x003FEBD4, 0x2725D428) +#define OVTK_NodeId_Header_StreamedMatrix_Dimension EBML::CIdentifier(0x0000E3C0, 0x3A7D5141) +#define OVTK_NodeId_Header_StreamedMatrix_Dimension_Size EBML::CIdentifier(0x001302F7, 0x36D8438A) +#define OVTK_NodeId_Header_StreamedMatrix_Dimension_Label EBML::CIdentifier(0x00153E40, 0x190227E0) +#define OVTK_NodeId_Buffer_StreamedMatrix EBML::CIdentifier(0x00120663, 0x08FBC165) +#define OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer EBML::CIdentifier(0x00B18C10, 0x427D098C) + +//__________________________________________________________________// +// // +// Signal stream node identifiers // +//__________________________________________________________________// +// // + +/* + * Signal stream description + * v1 november 6th 2006 + * v2 may 24th 2007 + * + * version 2 : + * ----------------------------------------------------------------- * + * OVTK_NodeId_Header + * OVTK_NodeId_Header_StreamType (integer:) + * OVTK_NodeId_Header_StreamVersion (integer:2) + * OVTK_NodeId_Header_Signal + * OVTK_NodeId_Header_Signal_Sampling (integer) + * OVTK_NodeId_Header_StreamedMatrix + * OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:2) + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:channel count) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 1 name) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 2 name) + * ... + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:number of samples per buffer) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string) + * ... + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * ... + * OVTK_NodeId_End + * ----------------------------------------------------------------- * + */ + +#define OVTK_NodeId_Header_Signal EBML::CIdentifier(0x007855DE, 0x3748D375) +#define OVTK_NodeId_Header_Signal_Sampling EBML::CIdentifier(0x00141C43, 0x0C37006B) + +//__________________________________________________________________// +// // +// Channel localisation stream node identifiers // +//__________________________________________________________________// +// // + +/* + * Channel localisation description + * v1 nov 04th 2008 + * + * version 1 : + * ----------------------------------------------------------------- * + * OVTK_NodeId_Header + * OVTK_NodeId_Header_StreamType (integer:) + * OVTK_NodeId_Header_StreamVersion (integer:2) + * OVTK_NodeId_Header_ChannelLocalisation + * OVTK_NodeId_Header_ChannelLocalisation_Dynamic (bool) + * OVTK_NodeId_Header_StreamedMatrix + * OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:2) + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:channel count) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 1 name) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 2 name) + * ... + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:3) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:x) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:y) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:z) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * ... + * OVTK_NodeId_End + * ----------------------------------------------------------------- * + */ + +#define OVTK_NodeId_Header_ChannelLocalisation EBML::CIdentifier(0xF2CFE60B, 0xEFD63E3B) +#define OVTK_NodeId_Header_ChannelLocalisation_Dynamic EBML::CIdentifier(0x5338AF5C, 0x07C469C3) + +/* + * Channel units description + * v1 nov 2014 + * + * version 1 : + * ----------------------------------------------------------------- * + * OVTK_NodeId_Header + * OVTK_NodeId_Header_StreamType (integer:) + * OVTK_NodeId_Header_StreamVersion (integer:1) + * OVTK_NodeId_Header_ChannelUnits + * OVTK_NodeId_Header_ChannelUnits_Dynamic (boolean) + * OVTK_NodeId_Header_StreamedMatrix + * OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:2) + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:channel count) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 1 name) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 2 name) + * ... + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:2) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:unit) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:factor) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * ... + * OVTK_NodeId_End + * ----------------------------------------------------------------- * + */ +#define OVTK_NodeId_Header_ChannelUnits EBML::CIdentifier(0x17400C76, 0x16CF14C8) +#define OVTK_NodeId_Header_ChannelUnits_Dynamic EBML::CIdentifier(0x7307023C, 0x7F754D2E) + +//__________________________________________________________________// +// // +// Stimulation stream node identifiers // +//__________________________________________________________________// +// // + +/* + * Stimulation stream description + * v1 november 6th 2006 + * v2 may 24th 2007 + * v3 ?? + * + * version 3 : + * ----------------------------------------------------------------- * + * OVTK_NodeId_Header + * OVTK_NodeId_Header_StreamType (integer:) + * OVTK_NodeId_Header_StreamVersion (integer:2) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_Stimulation + * OVTK_NodeId_Buffer_Stimulation_NumberOfStimulations (integer) + * OVTK_NodeId_Buffer_Stimulation_Stimulation + * OVTK_NodeId_Buffer_Stimulation_Stimulation_ID (integer) + * OVTK_NodeId_Buffer_Stimulation_Stimulation_Date (integer) + * OVTK_NodeId_Buffer_Stimulation_Stimulation_Duration (integer) + * OVTK_NodeId_Stimulation_Stimulation + * ... + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer + * ... + * OVTK_NodeId_End + * ----------------------------------------------------------------- * + */ + +#define OVTK_NodeId_Buffer_Stimulation EBML::CIdentifier(0x006DEABE, 0x7FC05A20) +#define OVTK_NodeId_Buffer_Stimulation_NumberOfStimulations EBML::CIdentifier(0x00BB790B, 0x2B8574D8) +#define OVTK_NodeId_Buffer_Stimulation_Stimulation EBML::CIdentifier(0x0016EAC6, 0x29FBCAA1) +#define OVTK_NodeId_Buffer_Stimulation_Stimulation_ID EBML::CIdentifier(0x006FA5DB, 0x4BAC31E9) +#define OVTK_NodeId_Buffer_Stimulation_Stimulation_Date EBML::CIdentifier(0x00B866D8, 0x14DA5374) +#define OVTK_NodeId_Buffer_Stimulation_Stimulation_Duration EBML::CIdentifier(0x14EE055F, 0x87FBCC9C) + +//__________________________________________________________________// +// // +// Experiment information node identifiers // +//__________________________________________________________________// +// // + +/* + * Experiment information stream description (fixed on november 6th 2006) + * + * version 1 : + * ----------------------------------------------------------------- * + * OVTK_NodeId_Header + * OVTK_NodeId_Header_StreamType (integer:) + * OVTK_NodeId_Header_StreamVersion (integer:1) + * OVTK_NodeId_Header_ExperimentInfo + * OVTK_NodeId_Header_ExperimentInfo_Experiment + * OVTK_NodeId_Header_ExperimentInfo_Experiment_ID (integer) + * OVTK_NodeId_Header_ExperimentInfo_Experiment_Date (date) + * OVTK_NodeId_Header_ExperimentInfo_Subject + * OVTK_NodeId_Header_ExperimentInfo_Subject_ID (integer) + * OVTK_NodeId_Header_ExperimentInfo_Subject_Name (string) + * OVTK_NodeId_Header_ExperimentInfo_Subject_Age (integer) + * OVTK_NodeId_Header_ExperimentInfo_Subject_Gender (integer) + * OVTK_NodeId_Header_ExperimentInfo_Context + * OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryID (integer) + * OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryName (string) + * OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianID (integer) + * OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianName (string) + * OVTK_NodeId_End + * ----------------------------------------------------------------- * + */ + +#define OVTK_NodeId_Header_ExperimentInfo EBML::CIdentifier(0x00746BA0, 0x115AE04D) +#define OVTK_NodeId_Header_ExperimentInfo_Experiment EBML::CIdentifier(0x0011D6B7, 0x48F1AA39) +#define OVTK_NodeId_Header_ExperimentInfo_Experiment_ID EBML::CIdentifier(0x006ACD74, 0x1C960C26) +#define OVTK_NodeId_Header_ExperimentInfo_Experiment_Date EBML::CIdentifier(0x002F8FB7, 0x6DA7552D) +#define OVTK_NodeId_Header_ExperimentInfo_Subject EBML::CIdentifier(0x003EC620, 0x333E0A94) +#define OVTK_NodeId_Header_ExperimentInfo_Subject_ID EBML::CIdentifier(0x00D62974, 0x473D4AA5) +#define OVTK_NodeId_Header_ExperimentInfo_Subject_Name EBML::CIdentifier(0x0041FD0A, 0x6BCD9A99) +#define OVTK_NodeId_Header_ExperimentInfo_Subject_Age EBML::CIdentifier(0x00DF7DD9, 0x33336C51) +#define OVTK_NodeId_Header_ExperimentInfo_Subject_Sex EBML::CIdentifier(0x0069BB84, 0x3FC8E149) /* for retro compat */ +#define OVTK_NodeId_Header_ExperimentInfo_Subject_Gender EBML::CIdentifier(0x0069BB84, 0x3FC8E149) +#define OVTK_NodeId_Header_ExperimentInfo_Context EBML::CIdentifier(0x0018C291, 0x7985DFDD) +#define OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryID EBML::CIdentifier(0x003F11B9, 0x26D76D9C) +#define OVTK_NodeId_Header_ExperimentInfo_Context_LaboratoryName EBML::CIdentifier(0x00EB1F23, 0x51C23B83) +#define OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianID EBML::CIdentifier(0x00874A7F, 0x60DC34C2) +#define OVTK_NodeId_Header_ExperimentInfo_Context_TechnicianName EBML::CIdentifier(0x00C8C393, 0x31CE5B3E) + +//__________________________________________________________________// +// // +// Feature vector stream node identifiers // +//__________________________________________________________________// +// // + +/* + * Feature vector stream description + * v1 may 24th 2007 + * + * version 1 : + * ----------------------------------------------------------------- * + * OVTK_NodeId_Header + * OVTK_NodeId_Header_StreamType (integer:) + * OVTK_NodeId_Header_StreamVersion (integer:1) + * OVTK_NodeId_Header_StreamedMatrix + * OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:1) + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:feature count) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:feature 1 name) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:feature 2 name) + * ... + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * ... + * OVTK_NodeId_End + * ----------------------------------------------------------------- * + */ + +//__________________________________________________________________// +// // +// Spectrum stream node identifiers // +//__________________________________________________________________// +// // + +/* + * Spectrum stream description + * v1 june 4th 2007 + * + * version 1 : + * ----------------------------------------------------------------- * + * OVTK_NodeId_Header + * OVTK_NodeId_Header_StreamType (integer:) + * OVTK_NodeId_Header_StreamVersion (integer:1) + * OVTK_NodeId_Header_StreamedMatrix + * OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:2) + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:channel count) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 1 name) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 2 name) + * ... + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:number of frequency band) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:frequency band 1 name) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:frequency band 2 name) + * ... + * OVTK_NodeId_Header_Spectrum + * OVTK_NodeId_Header_Spectrum_FrequencyBand + * OVTK_NodeId_Header_Spectrum_FrequencyBand_Start (double) + * OVTK_NodeId_Header_Spectrum_FrequencyBand_Stop (double) + * OVTK_NodeId_Header_Spectrum_FrequencyBand + * OVTK_NodeId_Header_Spectrum_FrequencyBand_Start (double) + * OVTK_NodeId_Header_Spectrum_FrequencyBand_Stop (double) + * ... + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * ... + * OVTK_NodeId_End + * ----------------------------------------------------------------- * + */ + +/* + * Spectrum stream description + * v2 january 27th 2017 + * + * version 2 : + * ----------------------------------------------------------------- * + * OVTK_NodeId_Header + * OVTK_NodeId_Header_StreamType (integer:) + * OVTK_NodeId_Header_StreamVersion (integer:1) + * OVTK_NodeId_Header_StreamedMatrix + * OVTK_NodeId_Header_StreamedMatrix_DimensionCount (integer:2) + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:channel count) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 1 name) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:channel 2 name) + * ... + * OVTK_NodeId_Header_StreamedMatrix_Dimension + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Size (integer:number of frequency) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:frequency 1 name) + * OVTK_NodeId_Header_StreamedMatrix_Dimension_Label (string:frequency 2 name) + * ... + * OVTK_NodeId_Header_Spectrum + * OVTK_NodeId_Header_Spectrum_Sampling (double) + * OVTK_NodeId_Header_Spectrum_FrequencyAbscissa (double) + * OVTK_NodeId_Header_Spectrum_FrequencyAbscissa (double) + * ... + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * OVTK_NodeId_Buffer + * OVTK_NodeId_Buffer_StreamedMatrix + * OVTK_NodeId_Buffer_StreamedMatrix_RawBuffer (array of double) + * ... + * OVTK_NodeId_End + * ----------------------------------------------------------------- * + */ +#define OVTK_NodeId_Header_Spectrum EBML::CIdentifier(0x00CCFA4B, 0x14F37D4D) +#define OVTK_NodeId_Header_Spectrum_FrequencyBand_Deprecated EBML::CIdentifier(0x0010983C, 0x21F8BDE5) +#define OVTK_NodeId_Header_Spectrum_FrequencyBand_Start_Deprecated EBML::CIdentifier(0x00AA5654, 0x2403A2CB) +#define OVTK_NodeId_Header_Spectrum_FrequencyBand_Stop_Deprecated EBML::CIdentifier(0x00A44C82, 0x05BE50D5) +#define OVTK_NodeId_Header_Spectrum_FrequencyAbscissa EBML::CIdentifier(0x00D7287D, 0x622A2BF5) +#define OVTK_NodeId_Header_Spectrum_Sampling EBML::CIdentifier(0x006876E9, 0x1DCB0CA1) + + +//__________________________________________________________________// +// // +// // +//__________________________________________________________________// +// // + +/* +#define OVTK_NodeId_ EBML::CIdentifier(0x0027615F, 0x2243F7B5) +#define OVTK_NodeId_ EBML::CIdentifier(0x00866CC6, 0x1EFE4BDC) +#define OVTK_NodeId_ EBML::CIdentifier(0x00C91900, 0x55E50FF0) +#define OVTK_NodeId_ EBML::CIdentifier(0x00E0E260, 0x646BF99E) +#define OVTK_NodeId_ EBML::CIdentifier(0x00DCE72C, 0x386A40C5) +#define OVTK_NodeId_ EBML::CIdentifier(0x00C520C6, 0x09AE98B5) +#define OVTK_NodeId_ EBML::CIdentifier(0x00F1CBCB, 0x56BD6821) +*/ +#define OVTK_ClassId_ OpenViBE::CIdentifier(0x00C6D56F, 0x30890D27) +#define OVTK_ClassId_Stimulation OpenViBE::CIdentifier(0xE4E131F0, 0xC6550E9E) +#define OVTK_ClassId_BaseAlgorithms_DataImporterT OpenViBE::CIdentifier(0xA6BB8664, 0xF1B9DE96) +#define OVTK_ClassId_BaseAlgorithms_DataExporterT OpenViBE::CIdentifier(0xA432362A, 0x5CD4F227) + +#define OVTK_ClassId_Vector OpenViBE::CIdentifier(0x5D113170, 0x941C8932) +#define OVTK_ClassId_FeatureVector OpenViBE::CIdentifier(0xF44A9CBD, 0x459DBA69) +#define OVTK_ClassId_FeatureVectorSet OpenViBE::CIdentifier(0x6D5FB77B, 0x5BDD0420) + + +//__________________________________________________________________// +// // +// API Definition // +//__________________________________________________________________// +// // + +// Taken from +// - http://people.redhat.com/drepper/dsohowto.pdf +// - http://www.nedprod.com/programs/gccvisibility.html +#if defined OVTK_Shared +#if defined TARGET_OS_Windows +#define OVTK_API_Export __declspec(dllexport) +#define OVTK_API_Import __declspec(dllimport) +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS +#define OVTK_API_Export __attribute__((visibility("default"))) +#define OVTK_API_Import __attribute__((visibility("default"))) +#else +#define OVTK_API_Export +#define OVTK_API_Import +#endif +#else +#define OVTK_API_Export +#define OVTK_API_Import +#endif + +#if defined OVTK_Exports +#define OVTK_API OVTK_API_Export +#else +#define OVTK_API OVTK_API_Import +#endif diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/tools/ovtkMatrix.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/tools/ovtkMatrix.h new file mode 100644 index 0000000..d468fc3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/tools/ovtkMatrix.h @@ -0,0 +1,32 @@ +#pragma once + +#include "../ovtk_base.h" + +namespace OpenViBE { +namespace Toolkit { +namespace Matrix { +// Can be used : CMatrix class behaviour is a little different but this function is never used (except in test). Avoid to used it, intended to be removed. +OVTK_API bool toString(const CMatrix& matrix, CString& str, const size_t precision = 6); +OVTK_API bool fromString(CMatrix& matrix, const CString& str); +OVTK_API bool saveToTextFile(const CMatrix& matrix, const CString& filename, const size_t precision = 6); +OVTK_API bool loadFromTextFile(CMatrix& matrix, const CString& filename); + +//@todo All is useless now. Avoid to used it, intended to be removed. +OVTK_API bool copy(CMatrix& dst, const CMatrix& src); +OVTK_API bool copyDescription(CMatrix& dst, const CMatrix& src); +OVTK_API bool copyContent(CMatrix& dst, const CMatrix& src); +OVTK_API bool clearContent(CMatrix& matrix); //(resetBuffer) +OVTK_API bool isDescriptionSimilar(const CMatrix& src1, const CMatrix& src2, bool checkLabels = true); //(isDescriptionEqual) +OVTK_API bool isContentSimilar(const CMatrix& src1, const CMatrix& src2); //(isBufferEqual) +OVTK_API bool isContentValid(const CMatrix& src, const bool checkNotANumber = true, const bool checkInfinity = true); //(isBufferValid) +} // namespace Matrix + +//@todo All is useless now. Avoid to used it, intended to be removed. +namespace MatrixManipulation { +inline bool copy(CMatrix& dst, const CMatrix& src) { return Matrix::copy(dst, src); } +inline bool copyDescription(CMatrix& dst, const CMatrix& src) { return Matrix::copyDescription(dst, src); } +inline bool copyContent(CMatrix& dst, const CMatrix& src) { return Matrix::copyContent(dst, src); } +inline bool clearContent(CMatrix& rMatrix) { return Matrix::clearContent(rMatrix); } +} // namespace MatrixManipulation +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/tools/ovtkStimulationSet.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/tools/ovtkStimulationSet.h new file mode 100644 index 0000000..c291d8f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/tools/ovtkStimulationSet.h @@ -0,0 +1,15 @@ +#pragma once + +#include "../ovtk_base.h" + +namespace OpenViBE { +namespace Toolkit { +namespace StimulationSet { +OVTK_API bool shift(IStimulationSet& stimSet, uint64_t timeShift); +OVTK_API bool copy(IStimulationSet& dst, const IStimulationSet& src, uint64_t timeShift = 0); +OVTK_API bool append(IStimulationSet& dst, const IStimulationSet& src, uint64_t timeShift = 0); +OVTK_API bool appendRange(IStimulationSet& dst, const IStimulationSet& src, uint64_t srcStartTime, uint64_t srcEndTime, uint64_t timeShift = 0); +OVTK_API bool removeRange(IStimulationSet& stimSet, uint64_t startTime, uint64_t endTime); +} // namespace StimulationSet +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/tools/ovtkString.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/tools/ovtkString.h new file mode 100644 index 0000000..f4c955e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/tools/ovtkString.h @@ -0,0 +1,36 @@ +#pragma once + +#include "../ovtk_base.h" + +namespace OpenViBE { +namespace Toolkit { +namespace String { +class OVTK_API ISplitCallback +{ +public: + virtual ~ISplitCallback() { } + virtual void beginSplit() const { } + virtual void endSplit() const { } + virtual void setToken(const char* token) const = 0; +}; + +template +class TSplitCallback final : public ISplitCallback +{ +public: + + explicit TSplitCallback(TContainer& tokenContainers) : m_tokenContainer(&tokenContainers) { } + + void setToken(const char* token) const override { m_tokenContainer->push_back(token); } + +protected: + + TContainer* m_tokenContainer = nullptr; +}; + +OVTK_API size_t split(const CString& str, const ISplitCallback& splitCB, uint8_t separator); +OVTK_API size_t split(const CString& str, const ISplitCallback& splitCB, uint8_t* separator, const size_t nSeparator); +OVTK_API bool isAlmostEqual(const CString& str1, const CString& str2, bool caseSensitive = true, bool removeStartSpaces = true, bool removeEndSpaces = true); +} // namespace String +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/training/ovtkISignalTrial.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/training/ovtkISignalTrial.h new file mode 100644 index 0000000..fc6dcad --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/training/ovtkISignalTrial.h @@ -0,0 +1,41 @@ +#pragma once + +#include "../ovtk_base.h" + +namespace OpenViBE { +namespace Toolkit { +class OVTK_API ISignalTrial : public IObject +{ +public: + + virtual bool setSamplingRate(size_t sampling) = 0; + virtual bool setChannelCount(size_t count) = 0; + virtual bool setChannelName(size_t index, const char* name) = 0; + virtual bool setLabelIdentifier(const CIdentifier& labelIdentifier) = 0; + virtual bool setSampleCount(size_t count, bool preserve) = 0; + + virtual size_t getSamplingRate() const = 0; + virtual size_t getChannelCount() const = 0; + virtual const char* getChannelName(const size_t index) const = 0; + virtual CIdentifier getLabelIdentifier() const = 0; + virtual size_t getSampleCount() const = 0; + virtual uint64_t getDuration() const = 0; + virtual double* getChannelSampleBuffer(size_t index) const = 0; + + _IsDerivedFromClass_(IObject, OVTK_ClassId_) +}; + +extern OVTK_API ISignalTrial* createSignalTrial(); +extern OVTK_API void releaseSignalTrial(ISignalTrial* trial); + +// operations +extern OVTK_API ISignalTrial& copyHeader(ISignalTrial& trial, const ISignalTrial* srcTrial = nullptr); +extern OVTK_API ISignalTrial& copy(ISignalTrial& trial, const ISignalTrial* srcTrial = nullptr); +extern OVTK_API ISignalTrial& selectSamples(ISignalTrial& trial, size_t sampleStart, size_t sampleEnd, const ISignalTrial* srcTrial = nullptr); +extern OVTK_API ISignalTrial& selectTime(ISignalTrial& trial, uint64_t timeStart, uint64_t timeEnd, const ISignalTrial* srcTrial = nullptr); +extern OVTK_API ISignalTrial& removeSamples(ISignalTrial& trial, size_t sampleStart, size_t sampleEnd, const ISignalTrial* srcTrial = nullptr); +extern OVTK_API ISignalTrial& removeTime(ISignalTrial& trial, uint64_t timeStart, uint64_t timeEnd, const ISignalTrial* srcTrial = nullptr); +extern OVTK_API ISignalTrial& insertBufferSamples(ISignalTrial& trial, size_t sampleStart, size_t nSample, const double* buffer, const ISignalTrial* srcTrial = nullptr); +extern OVTK_API ISignalTrial& insertBufferTime(ISignalTrial& trial, uint64_t timeStart, size_t nSample, const double* buffer, const ISignalTrial* srcTrial = nullptr); +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/training/ovtkISignalTrialSet.h b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/training/ovtkISignalTrialSet.h new file mode 100644 index 0000000..d5bf024 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/include/toolkit/training/ovtkISignalTrialSet.h @@ -0,0 +1,25 @@ +#pragma once + +#include "../ovtk_base.h" + +namespace OpenViBE { +namespace Toolkit { +class ISignalTrial; + +class OVTK_API ISignalTrialSet : public IObject +{ +public: + + virtual bool addSignalTrial(ISignalTrial& signalTrial) = 0; + virtual bool clear() = 0; + + virtual size_t getSignalTrialCount() const = 0; + virtual ISignalTrial& getSignalTrial(const size_t index) const = 0; + + _IsDerivedFromClass_(IObject, OVTK_ClassId_) +}; + +extern OVTK_API ISignalTrialSet* createSignalTrialSet(); +extern OVTK_API void releaseSignalTrialSet(ISignalTrialSet* signalTrialSet); +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/share/stimulation_list.txt b/Masterarbeit/openvibe/sdk-master/toolkit/share/stimulation_list.txt new file mode 100644 index 0000000..c1bca9f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/share/stimulation_list.txt @@ -0,0 +1,431 @@ + OVTK_StimulationId_ExperimentStart OVTK_StimulationId_ExperimentStart 0x00008001 + OVTK_StimulationId_ExperimentStop OVTK_StimulationId_ExperimentStop 0x00008002 + OVTK_StimulationId_SegmentStart OVTK_StimulationId_SegmentStart 0x00008003 + OVTK_StimulationId_SegmentStop OVTK_StimulationId_SegmentStop 0x00008004 + OVTK_StimulationId_TrialStart OVTK_StimulationId_TrialStart 0x00008005 + OVTK_StimulationId_TrialStop OVTK_StimulationId_TrialStop 0x00008006 + OVTK_StimulationId_BaselineStart OVTK_StimulationId_BaselineStart 0x00008007 + OVTK_StimulationId_BaselineStop OVTK_StimulationId_BaselineStop 0x00008008 + OVTK_StimulationId_RestStart OVTK_StimulationId_RestStart 0x00008009 + OVTK_StimulationId_RestStop OVTK_StimulationId_RestStop 0x0000800a + OVTK_StimulationId_VisualStimulationStart OVTK_StimulationId_VisualStimulationStart 0x0000800b + OVTK_StimulationId_VisualStimulationStop OVTK_StimulationId_VisualStimulationStop 0x0000800c + OVTK_StimulationId_VisualSteadyStateStimulationStart OVTK_StimulationId_VisualSteadyStateStimulationStart 0x00008010 + OVTK_StimulationId_VisualSteadyStateStimulationStop OVTK_StimulationId_VisualSteadyStateStimulationStop 0x00008011 + OVTK_StimulationId_Button1_Pressed OVTK_StimulationId_Button1_Pressed 0x00008012 + OVTK_StimulationId_Button1_Released OVTK_StimulationId_Button1_Released 0x00008013 + OVTK_StimulationId_Button2_Pressed OVTK_StimulationId_Button2_Pressed 0x00008014 + OVTK_StimulationId_Button2_Released OVTK_StimulationId_Button2_Released 0x00008015 + OVTK_StimulationId_Button3_Pressed OVTK_StimulationId_Button3_Pressed 0x00008016 + OVTK_StimulationId_Button3_Released OVTK_StimulationId_Button3_Released 0x00008017 + OVTK_StimulationId_Button4_Pressed OVTK_StimulationId_Button4_Pressed 0x00008018 + OVTK_StimulationId_Button4_Released OVTK_StimulationId_Button4_Released 0x00008019 + OVTK_StimulationId_Label_00 OVTK_StimulationId_Label_00 0x00008100 + OVTK_StimulationId_Label_01 OVTK_StimulationId_Label_01 0x00008101 + OVTK_StimulationId_Label_02 OVTK_StimulationId_Label_02 0x00008102 + OVTK_StimulationId_Label_03 OVTK_StimulationId_Label_03 0x00008103 + OVTK_StimulationId_Label_04 OVTK_StimulationId_Label_04 0x00008104 + OVTK_StimulationId_Label_05 OVTK_StimulationId_Label_05 0x00008105 + OVTK_StimulationId_Label_06 OVTK_StimulationId_Label_06 0x00008106 + OVTK_StimulationId_Label_07 OVTK_StimulationId_Label_07 0x00008107 + OVTK_StimulationId_Label_08 OVTK_StimulationId_Label_08 0x00008108 + OVTK_StimulationId_Label_09 OVTK_StimulationId_Label_09 0x00008109 + OVTK_StimulationId_Label_0A OVTK_StimulationId_Label_0A 0x0000810a + OVTK_StimulationId_Label_0B OVTK_StimulationId_Label_0B 0x0000810b + OVTK_StimulationId_Label_0C OVTK_StimulationId_Label_0C 0x0000810c + OVTK_StimulationId_Label_0D OVTK_StimulationId_Label_0D 0x0000810d + OVTK_StimulationId_Label_0E OVTK_StimulationId_Label_0E 0x0000810e + OVTK_StimulationId_Label_0F OVTK_StimulationId_Label_0F 0x0000810f + OVTK_StimulationId_Label_10 OVTK_StimulationId_Label_10 0x00008110 + OVTK_StimulationId_Label_11 OVTK_StimulationId_Label_11 0x00008111 + OVTK_StimulationId_Label_12 OVTK_StimulationId_Label_12 0x00008112 + OVTK_StimulationId_Label_13 OVTK_StimulationId_Label_13 0x00008113 + OVTK_StimulationId_Label_14 OVTK_StimulationId_Label_14 0x00008114 + OVTK_StimulationId_Label_15 OVTK_StimulationId_Label_15 0x00008115 + OVTK_StimulationId_Label_16 OVTK_StimulationId_Label_16 0x00008116 + OVTK_StimulationId_Label_17 OVTK_StimulationId_Label_17 0x00008117 + OVTK_StimulationId_Label_18 OVTK_StimulationId_Label_18 0x00008118 + OVTK_StimulationId_Label_19 OVTK_StimulationId_Label_19 0x00008119 + OVTK_StimulationId_Label_1A OVTK_StimulationId_Label_1A 0x0000811a + OVTK_StimulationId_Label_1B OVTK_StimulationId_Label_1B 0x0000811b + OVTK_StimulationId_Label_1C OVTK_StimulationId_Label_1C 0x0000811c + OVTK_StimulationId_Label_1D OVTK_StimulationId_Label_1D 0x0000811d + OVTK_StimulationId_Label_1E OVTK_StimulationId_Label_1E 0x0000811e + OVTK_StimulationId_Label_1F OVTK_StimulationId_Label_1F 0x0000811f + OVTK_StimulationId_Label_20 OVTK_StimulationId_Label_20 0x00008120 + OVTK_StimulationId_Label_21 OVTK_StimulationId_Label_21 0x00008121 + OVTK_StimulationId_Label_22 OVTK_StimulationId_Label_22 0x00008122 + OVTK_StimulationId_Label_23 OVTK_StimulationId_Label_23 0x00008123 + OVTK_StimulationId_Label_24 OVTK_StimulationId_Label_24 0x00008124 + OVTK_StimulationId_Label_25 OVTK_StimulationId_Label_25 0x00008125 + OVTK_StimulationId_Label_26 OVTK_StimulationId_Label_26 0x00008126 + OVTK_StimulationId_Label_27 OVTK_StimulationId_Label_27 0x00008127 + OVTK_StimulationId_Label_28 OVTK_StimulationId_Label_28 0x00008128 + OVTK_StimulationId_Label_29 OVTK_StimulationId_Label_29 0x00008129 + OVTK_StimulationId_Label_2A OVTK_StimulationId_Label_2A 0x0000812a + OVTK_StimulationId_Label_2B OVTK_StimulationId_Label_2B 0x0000812b + OVTK_StimulationId_Label_2C OVTK_StimulationId_Label_2C 0x0000812c + OVTK_StimulationId_Label_2D OVTK_StimulationId_Label_2D 0x0000812d + OVTK_StimulationId_Label_2E OVTK_StimulationId_Label_2E 0x0000812e + OVTK_StimulationId_Label_2F OVTK_StimulationId_Label_2F 0x0000812f + OVTK_StimulationId_Label_30 OVTK_StimulationId_Label_30 0x00008130 + OVTK_StimulationId_Label_31 OVTK_StimulationId_Label_31 0x00008131 + OVTK_StimulationId_Label_32 OVTK_StimulationId_Label_32 0x00008132 + OVTK_StimulationId_Label_33 OVTK_StimulationId_Label_33 0x00008133 + OVTK_StimulationId_Label_34 OVTK_StimulationId_Label_34 0x00008134 + OVTK_StimulationId_Label_35 OVTK_StimulationId_Label_35 0x00008135 + OVTK_StimulationId_Label_36 OVTK_StimulationId_Label_36 0x00008136 + OVTK_StimulationId_Label_37 OVTK_StimulationId_Label_37 0x00008137 + OVTK_StimulationId_Label_38 OVTK_StimulationId_Label_38 0x00008138 + OVTK_StimulationId_Label_39 OVTK_StimulationId_Label_39 0x00008139 + OVTK_StimulationId_Label_3A OVTK_StimulationId_Label_3A 0x0000813a + OVTK_StimulationId_Label_3B OVTK_StimulationId_Label_3B 0x0000813b + OVTK_StimulationId_Label_3C OVTK_StimulationId_Label_3C 0x0000813c + OVTK_StimulationId_Label_3D OVTK_StimulationId_Label_3D 0x0000813d + OVTK_StimulationId_Label_3E OVTK_StimulationId_Label_3E 0x0000813e + OVTK_StimulationId_Label_3F OVTK_StimulationId_Label_3F 0x0000813f + OVTK_StimulationId_Label_40 OVTK_StimulationId_Label_40 0x00008140 + OVTK_StimulationId_Label_41 OVTK_StimulationId_Label_41 0x00008141 + OVTK_StimulationId_Label_42 OVTK_StimulationId_Label_42 0x00008142 + OVTK_StimulationId_Label_43 OVTK_StimulationId_Label_43 0x00008143 + OVTK_StimulationId_Label_44 OVTK_StimulationId_Label_44 0x00008144 + OVTK_StimulationId_Label_45 OVTK_StimulationId_Label_45 0x00008145 + OVTK_StimulationId_Label_46 OVTK_StimulationId_Label_46 0x00008146 + OVTK_StimulationId_Label_47 OVTK_StimulationId_Label_47 0x00008147 + OVTK_StimulationId_Label_48 OVTK_StimulationId_Label_48 0x00008148 + OVTK_StimulationId_Label_49 OVTK_StimulationId_Label_49 0x00008149 + OVTK_StimulationId_Label_4A OVTK_StimulationId_Label_4A 0x0000814a + OVTK_StimulationId_Label_4B OVTK_StimulationId_Label_4B 0x0000814b + OVTK_StimulationId_Label_4C OVTK_StimulationId_Label_4C 0x0000814c + OVTK_StimulationId_Label_4D OVTK_StimulationId_Label_4D 0x0000814d + OVTK_StimulationId_Label_4E OVTK_StimulationId_Label_4E 0x0000814e + OVTK_StimulationId_Label_4F OVTK_StimulationId_Label_4F 0x0000814f + OVTK_StimulationId_Label_50 OVTK_StimulationId_Label_50 0x00008150 + OVTK_StimulationId_Label_51 OVTK_StimulationId_Label_51 0x00008151 + OVTK_StimulationId_Label_52 OVTK_StimulationId_Label_52 0x00008152 + OVTK_StimulationId_Label_53 OVTK_StimulationId_Label_53 0x00008153 + OVTK_StimulationId_Label_54 OVTK_StimulationId_Label_54 0x00008154 + OVTK_StimulationId_Label_55 OVTK_StimulationId_Label_55 0x00008155 + OVTK_StimulationId_Label_56 OVTK_StimulationId_Label_56 0x00008156 + OVTK_StimulationId_Label_57 OVTK_StimulationId_Label_57 0x00008157 + OVTK_StimulationId_Label_58 OVTK_StimulationId_Label_58 0x00008158 + OVTK_StimulationId_Label_59 OVTK_StimulationId_Label_59 0x00008159 + OVTK_StimulationId_Label_5A OVTK_StimulationId_Label_5A 0x0000815a + OVTK_StimulationId_Label_5B OVTK_StimulationId_Label_5B 0x0000815b + OVTK_StimulationId_Label_5C OVTK_StimulationId_Label_5C 0x0000815c + OVTK_StimulationId_Label_5D OVTK_StimulationId_Label_5D 0x0000815d + OVTK_StimulationId_Label_5E OVTK_StimulationId_Label_5E 0x0000815e + OVTK_StimulationId_Label_5F OVTK_StimulationId_Label_5F 0x0000815f + OVTK_StimulationId_Label_60 OVTK_StimulationId_Label_60 0x00008160 + OVTK_StimulationId_Label_61 OVTK_StimulationId_Label_61 0x00008161 + OVTK_StimulationId_Label_62 OVTK_StimulationId_Label_62 0x00008162 + OVTK_StimulationId_Label_63 OVTK_StimulationId_Label_63 0x00008163 + OVTK_StimulationId_Label_64 OVTK_StimulationId_Label_64 0x00008164 + OVTK_StimulationId_Label_65 OVTK_StimulationId_Label_65 0x00008165 + OVTK_StimulationId_Label_66 OVTK_StimulationId_Label_66 0x00008166 + OVTK_StimulationId_Label_67 OVTK_StimulationId_Label_67 0x00008167 + OVTK_StimulationId_Label_68 OVTK_StimulationId_Label_68 0x00008168 + OVTK_StimulationId_Label_69 OVTK_StimulationId_Label_69 0x00008169 + OVTK_StimulationId_Label_6A OVTK_StimulationId_Label_6A 0x0000816a + OVTK_StimulationId_Label_6B OVTK_StimulationId_Label_6B 0x0000816b + OVTK_StimulationId_Label_6C OVTK_StimulationId_Label_6C 0x0000816c + OVTK_StimulationId_Label_6D OVTK_StimulationId_Label_6D 0x0000816d + OVTK_StimulationId_Label_6E OVTK_StimulationId_Label_6E 0x0000816e + OVTK_StimulationId_Label_6F OVTK_StimulationId_Label_6F 0x0000816f + OVTK_StimulationId_Label_70 OVTK_StimulationId_Label_70 0x00008170 + OVTK_StimulationId_Label_71 OVTK_StimulationId_Label_71 0x00008171 + OVTK_StimulationId_Label_72 OVTK_StimulationId_Label_72 0x00008172 + OVTK_StimulationId_Label_73 OVTK_StimulationId_Label_73 0x00008173 + OVTK_StimulationId_Label_74 OVTK_StimulationId_Label_74 0x00008174 + OVTK_StimulationId_Label_75 OVTK_StimulationId_Label_75 0x00008175 + OVTK_StimulationId_Label_76 OVTK_StimulationId_Label_76 0x00008176 + OVTK_StimulationId_Label_77 OVTK_StimulationId_Label_77 0x00008177 + OVTK_StimulationId_Label_78 OVTK_StimulationId_Label_78 0x00008178 + OVTK_StimulationId_Label_79 OVTK_StimulationId_Label_79 0x00008179 + OVTK_StimulationId_Label_7A OVTK_StimulationId_Label_7A 0x0000817a + OVTK_StimulationId_Label_7B OVTK_StimulationId_Label_7B 0x0000817b + OVTK_StimulationId_Label_7C OVTK_StimulationId_Label_7C 0x0000817c + OVTK_StimulationId_Label_7D OVTK_StimulationId_Label_7D 0x0000817d + OVTK_StimulationId_Label_7E OVTK_StimulationId_Label_7E 0x0000817e + OVTK_StimulationId_Label_7F OVTK_StimulationId_Label_7F 0x0000817f + OVTK_StimulationId_Label_80 OVTK_StimulationId_Label_80 0x00008180 + OVTK_StimulationId_Label_81 OVTK_StimulationId_Label_81 0x00008181 + OVTK_StimulationId_Label_82 OVTK_StimulationId_Label_82 0x00008182 + OVTK_StimulationId_Label_83 OVTK_StimulationId_Label_83 0x00008183 + OVTK_StimulationId_Label_84 OVTK_StimulationId_Label_84 0x00008184 + OVTK_StimulationId_Label_85 OVTK_StimulationId_Label_85 0x00008185 + OVTK_StimulationId_Label_86 OVTK_StimulationId_Label_86 0x00008186 + OVTK_StimulationId_Label_87 OVTK_StimulationId_Label_87 0x00008187 + OVTK_StimulationId_Label_88 OVTK_StimulationId_Label_88 0x00008188 + OVTK_StimulationId_Label_89 OVTK_StimulationId_Label_89 0x00008189 + OVTK_StimulationId_Label_8A OVTK_StimulationId_Label_8A 0x0000818a + OVTK_StimulationId_Label_8B OVTK_StimulationId_Label_8B 0x0000818b + OVTK_StimulationId_Label_8C OVTK_StimulationId_Label_8C 0x0000818c + OVTK_StimulationId_Label_8D OVTK_StimulationId_Label_8D 0x0000818d + OVTK_StimulationId_Label_8E OVTK_StimulationId_Label_8E 0x0000818e + OVTK_StimulationId_Label_8F OVTK_StimulationId_Label_8F 0x0000818f + OVTK_StimulationId_Label_90 OVTK_StimulationId_Label_90 0x00008190 + OVTK_StimulationId_Label_91 OVTK_StimulationId_Label_91 0x00008191 + OVTK_StimulationId_Label_92 OVTK_StimulationId_Label_92 0x00008192 + OVTK_StimulationId_Label_93 OVTK_StimulationId_Label_93 0x00008193 + OVTK_StimulationId_Label_94 OVTK_StimulationId_Label_94 0x00008194 + OVTK_StimulationId_Label_95 OVTK_StimulationId_Label_95 0x00008195 + OVTK_StimulationId_Label_96 OVTK_StimulationId_Label_96 0x00008196 + OVTK_StimulationId_Label_97 OVTK_StimulationId_Label_97 0x00008197 + OVTK_StimulationId_Label_98 OVTK_StimulationId_Label_98 0x00008198 + OVTK_StimulationId_Label_99 OVTK_StimulationId_Label_99 0x00008199 + OVTK_StimulationId_Label_9A OVTK_StimulationId_Label_9A 0x0000819a + OVTK_StimulationId_Label_9B OVTK_StimulationId_Label_9B 0x0000819b + OVTK_StimulationId_Label_9C OVTK_StimulationId_Label_9C 0x0000819c + OVTK_StimulationId_Label_9D OVTK_StimulationId_Label_9D 0x0000819d + OVTK_StimulationId_Label_9E OVTK_StimulationId_Label_9E 0x0000819e + OVTK_StimulationId_Label_9F OVTK_StimulationId_Label_9F 0x0000819f + OVTK_StimulationId_Label_A0 OVTK_StimulationId_Label_A0 0x000081a0 + OVTK_StimulationId_Label_A1 OVTK_StimulationId_Label_A1 0x000081a1 + OVTK_StimulationId_Label_A2 OVTK_StimulationId_Label_A2 0x000081a2 + OVTK_StimulationId_Label_A3 OVTK_StimulationId_Label_A3 0x000081a3 + OVTK_StimulationId_Label_A4 OVTK_StimulationId_Label_A4 0x000081a4 + OVTK_StimulationId_Label_A5 OVTK_StimulationId_Label_A5 0x000081a5 + OVTK_StimulationId_Label_A6 OVTK_StimulationId_Label_A6 0x000081a6 + OVTK_StimulationId_Label_A7 OVTK_StimulationId_Label_A7 0x000081a7 + OVTK_StimulationId_Label_A8 OVTK_StimulationId_Label_A8 0x000081a8 + OVTK_StimulationId_Label_A9 OVTK_StimulationId_Label_A9 0x000081a9 + OVTK_StimulationId_Label_AA OVTK_StimulationId_Label_AA 0x000081aa + OVTK_StimulationId_Label_AB OVTK_StimulationId_Label_AB 0x000081ab + OVTK_StimulationId_Label_AC OVTK_StimulationId_Label_AC 0x000081ac + OVTK_StimulationId_Label_AD OVTK_StimulationId_Label_AD 0x000081ad + OVTK_StimulationId_Label_AE OVTK_StimulationId_Label_AE 0x000081ae + OVTK_StimulationId_Label_AF OVTK_StimulationId_Label_AF 0x000081af + OVTK_StimulationId_Label_B0 OVTK_StimulationId_Label_B0 0x000081b0 + OVTK_StimulationId_Label_B1 OVTK_StimulationId_Label_B1 0x000081b1 + OVTK_StimulationId_Label_B2 OVTK_StimulationId_Label_B2 0x000081b2 + OVTK_StimulationId_Label_B3 OVTK_StimulationId_Label_B3 0x000081b3 + OVTK_StimulationId_Label_B4 OVTK_StimulationId_Label_B4 0x000081b4 + OVTK_StimulationId_Label_B5 OVTK_StimulationId_Label_B5 0x000081b5 + OVTK_StimulationId_Label_B6 OVTK_StimulationId_Label_B6 0x000081b6 + OVTK_StimulationId_Label_B7 OVTK_StimulationId_Label_B7 0x000081b7 + OVTK_StimulationId_Label_B8 OVTK_StimulationId_Label_B8 0x000081b8 + OVTK_StimulationId_Label_B9 OVTK_StimulationId_Label_B9 0x000081b9 + OVTK_StimulationId_Label_BA OVTK_StimulationId_Label_BA 0x000081ba + OVTK_StimulationId_Label_BB OVTK_StimulationId_Label_BB 0x000081bb + OVTK_StimulationId_Label_BC OVTK_StimulationId_Label_BC 0x000081bc + OVTK_StimulationId_Label_BD OVTK_StimulationId_Label_BD 0x000081bd + OVTK_StimulationId_Label_BE OVTK_StimulationId_Label_BE 0x000081be + OVTK_StimulationId_Label_BF OVTK_StimulationId_Label_BF 0x000081bf + OVTK_StimulationId_Label_C0 OVTK_StimulationId_Label_C0 0x000081c0 + OVTK_StimulationId_Label_C1 OVTK_StimulationId_Label_C1 0x000081c1 + OVTK_StimulationId_Label_C2 OVTK_StimulationId_Label_C2 0x000081c2 + OVTK_StimulationId_Label_C3 OVTK_StimulationId_Label_C3 0x000081c3 + OVTK_StimulationId_Label_C4 OVTK_StimulationId_Label_C4 0x000081c4 + OVTK_StimulationId_Label_C5 OVTK_StimulationId_Label_C5 0x000081c5 + OVTK_StimulationId_Label_C6 OVTK_StimulationId_Label_C6 0x000081c6 + OVTK_StimulationId_Label_C7 OVTK_StimulationId_Label_C7 0x000081c7 + OVTK_StimulationId_Label_C8 OVTK_StimulationId_Label_C8 0x000081c8 + OVTK_StimulationId_Label_C9 OVTK_StimulationId_Label_C9 0x000081c9 + OVTK_StimulationId_Label_CA OVTK_StimulationId_Label_CA 0x000081ca + OVTK_StimulationId_Label_CB OVTK_StimulationId_Label_CB 0x000081cb + OVTK_StimulationId_Label_CC OVTK_StimulationId_Label_CC 0x000081cc + OVTK_StimulationId_Label_CD OVTK_StimulationId_Label_CD 0x000081cd + OVTK_StimulationId_Label_CE OVTK_StimulationId_Label_CE 0x000081ce + OVTK_StimulationId_Label_CF OVTK_StimulationId_Label_CF 0x000081cf + OVTK_StimulationId_Label_D0 OVTK_StimulationId_Label_D0 0x000081d0 + OVTK_StimulationId_Label_D1 OVTK_StimulationId_Label_D1 0x000081d1 + OVTK_StimulationId_Label_D2 OVTK_StimulationId_Label_D2 0x000081d2 + OVTK_StimulationId_Label_D3 OVTK_StimulationId_Label_D3 0x000081d3 + OVTK_StimulationId_Label_D4 OVTK_StimulationId_Label_D4 0x000081d4 + OVTK_StimulationId_Label_D5 OVTK_StimulationId_Label_D5 0x000081d5 + OVTK_StimulationId_Label_D6 OVTK_StimulationId_Label_D6 0x000081d6 + OVTK_StimulationId_Label_D7 OVTK_StimulationId_Label_D7 0x000081d7 + OVTK_StimulationId_Label_D8 OVTK_StimulationId_Label_D8 0x000081d8 + OVTK_StimulationId_Label_D9 OVTK_StimulationId_Label_D9 0x000081d9 + OVTK_StimulationId_Label_DA OVTK_StimulationId_Label_DA 0x000081da + OVTK_StimulationId_Label_DB OVTK_StimulationId_Label_DB 0x000081db + OVTK_StimulationId_Label_DC OVTK_StimulationId_Label_DC 0x000081dc + OVTK_StimulationId_Label_DD OVTK_StimulationId_Label_DD 0x000081dd + OVTK_StimulationId_Label_DE OVTK_StimulationId_Label_DE 0x000081de + OVTK_StimulationId_Label_DF OVTK_StimulationId_Label_DF 0x000081df + OVTK_StimulationId_Label_E0 OVTK_StimulationId_Label_E0 0x000081e0 + OVTK_StimulationId_Label_E1 OVTK_StimulationId_Label_E1 0x000081e1 + OVTK_StimulationId_Label_E2 OVTK_StimulationId_Label_E2 0x000081e2 + OVTK_StimulationId_Label_E3 OVTK_StimulationId_Label_E3 0x000081e3 + OVTK_StimulationId_Label_E4 OVTK_StimulationId_Label_E4 0x000081e4 + OVTK_StimulationId_Label_E5 OVTK_StimulationId_Label_E5 0x000081e5 + OVTK_StimulationId_Label_E6 OVTK_StimulationId_Label_E6 0x000081e6 + OVTK_StimulationId_Label_E7 OVTK_StimulationId_Label_E7 0x000081e7 + OVTK_StimulationId_Label_E8 OVTK_StimulationId_Label_E8 0x000081e8 + OVTK_StimulationId_Label_E9 OVTK_StimulationId_Label_E9 0x000081e9 + OVTK_StimulationId_Label_EA OVTK_StimulationId_Label_EA 0x000081ea + OVTK_StimulationId_Label_EB OVTK_StimulationId_Label_EB 0x000081eb + OVTK_StimulationId_Label_EC OVTK_StimulationId_Label_EC 0x000081ec + OVTK_StimulationId_Label_ED OVTK_StimulationId_Label_ED 0x000081ed + OVTK_StimulationId_Label_EE OVTK_StimulationId_Label_EE 0x000081ee + OVTK_StimulationId_Label_EF OVTK_StimulationId_Label_EF 0x000081ef + OVTK_StimulationId_Label_F0 OVTK_StimulationId_Label_F0 0x000081f0 + OVTK_StimulationId_Label_F1 OVTK_StimulationId_Label_F1 0x000081f1 + OVTK_StimulationId_Label_F2 OVTK_StimulationId_Label_F2 0x000081f2 + OVTK_StimulationId_Label_F3 OVTK_StimulationId_Label_F3 0x000081f3 + OVTK_StimulationId_Label_F4 OVTK_StimulationId_Label_F4 0x000081f4 + OVTK_StimulationId_Label_F5 OVTK_StimulationId_Label_F5 0x000081f5 + OVTK_StimulationId_Label_F6 OVTK_StimulationId_Label_F6 0x000081f6 + OVTK_StimulationId_Label_F7 OVTK_StimulationId_Label_F7 0x000081f7 + OVTK_StimulationId_Label_F8 OVTK_StimulationId_Label_F8 0x000081f8 + OVTK_StimulationId_Label_F9 OVTK_StimulationId_Label_F9 0x000081f9 + OVTK_StimulationId_Label_FA OVTK_StimulationId_Label_FA 0x000081fa + OVTK_StimulationId_Label_FB OVTK_StimulationId_Label_FB 0x000081fb + OVTK_StimulationId_Label_FC OVTK_StimulationId_Label_FC 0x000081fc + OVTK_StimulationId_Label_FD OVTK_StimulationId_Label_FD 0x000081fd + OVTK_StimulationId_Label_FE OVTK_StimulationId_Label_FE 0x000081fe + OVTK_StimulationId_Label_FF OVTK_StimulationId_Label_FF 0x000081ff + OVTK_StimulationId_Number_00 OVTK_StimulationId_Number_00 0x00000000 + OVTK_StimulationId_Number_01 OVTK_StimulationId_Number_01 0x00000001 + OVTK_StimulationId_Number_02 OVTK_StimulationId_Number_02 0x00000002 + OVTK_StimulationId_Number_03 OVTK_StimulationId_Number_03 0x00000003 + OVTK_StimulationId_Number_04 OVTK_StimulationId_Number_04 0x00000004 + OVTK_StimulationId_Number_05 OVTK_StimulationId_Number_05 0x00000005 + OVTK_StimulationId_Number_06 OVTK_StimulationId_Number_06 0x00000006 + OVTK_StimulationId_Number_07 OVTK_StimulationId_Number_07 0x00000007 + OVTK_StimulationId_Number_08 OVTK_StimulationId_Number_08 0x00000008 + OVTK_StimulationId_Number_09 OVTK_StimulationId_Number_09 0x00000009 + OVTK_StimulationId_Number_0A OVTK_StimulationId_Number_0A 0x0000000a + OVTK_StimulationId_Number_0B OVTK_StimulationId_Number_0B 0x0000000b + OVTK_StimulationId_Number_0C OVTK_StimulationId_Number_0C 0x0000000c + OVTK_StimulationId_Number_0D OVTK_StimulationId_Number_0D 0x0000000d + OVTK_StimulationId_Number_0E OVTK_StimulationId_Number_0E 0x0000000e + OVTK_StimulationId_Number_0F OVTK_StimulationId_Number_0F 0x0000000f + OVTK_StimulationId_Number_10 OVTK_StimulationId_Number_10 0x00000010 + OVTK_StimulationId_Number_11 OVTK_StimulationId_Number_11 0x00000011 + OVTK_StimulationId_Number_12 OVTK_StimulationId_Number_12 0x00000012 + OVTK_StimulationId_Number_13 OVTK_StimulationId_Number_13 0x00000013 + OVTK_StimulationId_Number_14 OVTK_StimulationId_Number_14 0x00000014 + OVTK_StimulationId_Number_15 OVTK_StimulationId_Number_15 0x00000015 + OVTK_StimulationId_Number_16 OVTK_StimulationId_Number_16 0x00000016 + OVTK_StimulationId_Number_17 OVTK_StimulationId_Number_17 0x00000017 + OVTK_StimulationId_Number_18 OVTK_StimulationId_Number_18 0x00000018 + OVTK_StimulationId_Number_19 OVTK_StimulationId_Number_19 0x00000019 + OVTK_StimulationId_Number_1A OVTK_StimulationId_Number_1A 0x0000001a + OVTK_StimulationId_Number_1B OVTK_StimulationId_Number_1B 0x0000001b + OVTK_StimulationId_Number_1C OVTK_StimulationId_Number_1C 0x0000001c + OVTK_StimulationId_Number_1D OVTK_StimulationId_Number_1D 0x0000001d + OVTK_StimulationId_Number_1E OVTK_StimulationId_Number_1E 0x0000001e + OVTK_StimulationId_Number_1F OVTK_StimulationId_Number_1F 0x0000001f + OVTK_StimulationId_Train OVTK_StimulationId_Train 0x00008201 + OVTK_StimulationId_Beep OVTK_StimulationId_Beep 0x00008202 + OVTK_StimulationId_DoubleBeep OVTK_StimulationId_DoubleBeep 0x00008203 + OVTK_StimulationId_EndOfFile OVTK_StimulationId_EndOfFile 0x00008204 + OVTK_StimulationId_Target OVTK_StimulationId_Target 0x00008205 + OVTK_StimulationId_NonTarget OVTK_StimulationId_NonTarget 0x00008206 + OVTK_StimulationId_TrainCompleted OVTK_StimulationId_TrainCompleted 0x00008207 + OVTK_StimulationId_Reset OVTK_StimulationId_Reset 0x00008208 + OVTK_StimulationId_ThresholdPassed_Positive OVTK_StimulationId_ThresholdPassed_Positive 0x00008209 + OVTK_StimulationId_ThresholdPassed_Negative OVTK_StimulationId_ThresholdPassed_Negative 0x00008210 + OVTK_StimulationId_NoArtifact OVTK_StimulationId_NoArtifact 0x00008301 + OVTK_StimulationId_Artifact OVTK_StimulationId_Artifact 0x00008302 + OVTK_StimulationId_RemovedSamples OVTK_StimulationId_RemovedSamples 0x00008310 + OVTK_StimulationId_AddedSamplesBegin OVTK_StimulationId_AddedSamplesBegin 0x00008311 + OVTK_StimulationId_AddedSamplesEnd OVTK_StimulationId_AddedSamplesEnd 0x00008312 + OVTK_GDF_Artifact_EOG_Large OVTK_GDF_Artifact_EOG_Large 0x101 + OVTK_GDF_Artifact_ECG OVTK_GDF_Artifact_ECG 0x102 + OVTK_GDF_Artifact_EMG OVTK_GDF_Artifact_EMG 0x103 + OVTK_GDF_Artifact_Movement OVTK_GDF_Artifact_Movement 0x104 + OVTK_GDF_Artifact_Failing_Electrode OVTK_GDF_Artifact_Failing_Electrode0x00008004 0x105 + OVTK_GDF_Artifact_Sweat OVTK_GDF_Artifact_Sweat 0x106 + OVTK_GDF_Artifact_50_60_Hz_Interference OVTK_GDF_Artifact_50_60_Hz_Interference 0x107 + OVTK_GDF_Artifact_Breathing OVTK_GDF_Artifact_Breathing 0x108 + OVTK_GDF_Artifact_Pulse OVTK_GDF_Artifact_Pulse 0x109 + OVTK_GDF_Artifact_EOG_Small OVTK_GDF_Artifact_EOG_Small 0x10A + OVTK_GDF_Calibration OVTK_GDF_Calibration 0x10F + OVTK_GDF_EEG_Sleep_Splindles OVTK_GDF_EEG_Sleep_Splindles 0x111 + OVTK_GDF_EEG_K_Complexes OVTK_GDF_EEG_K_Complexes 0x112 + OVTK_GDF_EEG_Saw_Tooth_Waves OVTK_GDF_EEG_Saw_Tooth_Waves 0x113 + OVTK_GDF_EEG_Idling_EEG_Eyes_Open OVTK_GDF_EEG_Idling_EEG_Eyes_Open 0x114 + OVTK_GDF_EEG_Idling_EEG_Eyes_Closed OVTK_GDF_EEG_Idling_EEG_Eyes_Closed 0x115 + OVTK_GDF_EEG_Spike OVTK_GDF_EEG_Spike 0x116 + OVTK_GDF_EEG_Seizure OVTK_GDF_EEG_Seizure 0x117 + OVTK_GDF_VEP OVTK_GDF_VEP 0x121 + OVTK_GDF_AEP OVTK_GDF_AEP 0x122 + OVTK_GDF_SEP OVTK_GDF_SEP 0x123 + OVTK_GDF_TMS OVTK_GDF_TMS 0x12F + OVTK_GDF_SSVEP OVTK_GDF_SSVEP 0x131 + OVTK_GDF_SSAEP OVTK_GDF_SSAEP 0x132 + OVTK_GDF_SSSEP OVTK_GDF_SSSEP 0x133 + OVTK_GDF_Start_Of_Trial OVTK_GDF_Start_Of_Trial 0x300 + OVTK_GDF_Left OVTK_GDF_Left 0x301 + OVTK_GDF_Right OVTK_GDF_Right 0x302 + OVTK_GDF_Foot OVTK_GDF_Foot 0x303 + OVTK_GDF_Tongue OVTK_GDF_Tongue 0x304 + OVTK_GDF_class5 OVTK_GDF_class5 0x305 + OVTK_GDF_Down OVTK_GDF_Down 0x306 + OVTK_GDF_class7 OVTK_GDF_class7 0x307 + OVTK_GDF_class8 OVTK_GDF_class8 0x308 + OVTK_GDF_class9 OVTK_GDF_class9 0x309 + OVTK_GDF_class10 OVTK_GDF_class10 0x30A + OVTK_GDF_class11 OVTK_GDF_class11 0x30B + OVTK_GDF_Up OVTK_GDF_Up 0x30C + OVTK_GDF_Feedback_Continuous OVTK_GDF_Feedback_Continuous 0x30D + OVTK_GDF_Feedback_Discrete OVTK_GDF_Feedback_Discrete 0x30E + OVTK_GDF_Cue_Unknown_Undefined OVTK_GDF_Cue_Unknown_Undefined 0x30F + OVTK_GDF_Beep OVTK_GDF_Beep 0x311 + OVTK_GDF_Cross_On_Screen OVTK_GDF_Cross_On_Screen 0x312 + OVTK_GDF_Flashing_Light OVTK_GDF_Flashing_Light 0x313 + OVTK_GDF_End_Of_Trial OVTK_GDF_End_Of_Trial 0x320 + OVTK_GDF_Correct OVTK_GDF_Correct 0x381 + OVTK_GDF_Incorrect OVTK_GDF_Incorrect 0x382 + OVTK_GDF_End_Of_Session OVTK_GDF_End_Of_Session 0x3F2 + OVTK_GDF_Rejection OVTK_GDF_Rejection 0x3FF + OVTK_GDF_OAHE OVTK_GDF_OAHE 0x401 + OVTK_GDF_RERA OVTK_GDF_RERA 0x402 + OVTK_GDF_CAHE OVTK_GDF_CAHE 0x403 + OVTK_GDF_CSB OVTK_GDF_CSB 0x404 + OVTK_GDF_Sleep_Hypoventilation OVTK_GDF_Sleep_Hypoventilation 0x405 + OVTK_GDF_Maximum_Inspiration OVTK_GDF_Maximum_Inspiration 0x40E + OVTK_GDF_Start_Of_Inspiration OVTK_GDF_Start_Of_Inspiration 0x40F + OVTK_GDF_Wake OVTK_GDF_Wake 0x410 + OVTK_GDF_Stage_1 OVTK_GDF_Stage_1 0x411 + OVTK_GDF_Stage_2 OVTK_GDF_Stage_2 0x412 + OVTK_GDF_Stage_3 OVTK_GDF_Stage_3 0x413 + OVTK_GDF_Stage_4 OVTK_GDF_Stage_4 0x414 + OVTK_GDF_REM OVTK_GDF_REM 0x415 + OVTK_GDF_Lights_On OVTK_GDF_Lights_On 0x420 + OVTK_GDF_Lights_Off OVTK_GDF_Lights_Off 0x8420 + OVTK_GDF_Eyes_Left OVTK_GDF_Eyes_Left 0x431 + OVTK_GDF_Eyes_Right OVTK_GDF_Eyes_Right 0x432 + OVTK_GDF_Eyes_Up OVTK_GDF_Eyes_Up 0x433 + OVTK_GDF_Eyes_Down OVTK_GDF_Eyes_Down 0x434 + OVTK_GDF_Horizontal_Eye_Movement OVTK_GDF_Horizontal_Eye_Movement 0x435 + OVTK_GDF_Vertical_Eye_Movement OVTK_GDF_Vertical_Eye_Movement 0x436 + OVTK_GDF_Rotation_Clockwise OVTK_GDF_Rotation_Clockwise 0x437 + OVTK_GDF_Rotation_Counterclockwise OVTK_GDF_Rotation_Counterclockwise 0x438 + OVTK_GDF_Eye_Blink OVTK_GDF_Eye_Blink 0x439 + OVTK_GDF_Left_Hand_Movement OVTK_GDF_Left_Hand_Movement 0x441 + OVTK_GDF_Right_Hand_Movement OVTK_GDF_Right_Hand_Movement 0x442 + OVTK_GDF_Head_Movement OVTK_GDF_Head_Movement 0x443 + OVTK_GDF_Tongue_Movement OVTK_GDF_Tongue_Movement 0x444 + OVTK_GDF_Swallowing OVTK_GDF_Swallowing 0x445 + OVTK_GDF_Biting OVTK_GDF_Biting 0x446 + OVTK_GDF_Foot_Movement OVTK_GDF_Foot_Movement 0x447 + OVTK_GDF_Foot_Right_Movement OVTK_GDF_Foot_Right_Movement 0x448 + OVTK_GDF_Arm_Movement OVTK_GDF_Arm_Movement 0x449 + OVTK_GDF_Arm_Right_Movement OVTK_GDF_Arm_Right_Movement 0x44A + OVTK_GDF_ECG_Fiducial_Point_QRS_Complex OVTK_GDF_ECG_Fiducial_Point_QRS_Complex 0x501 + OVTK_GDF_ECG_P_Wave OVTK_GDF_ECG_P_Wave 0x502 + OVTK_GDF_ECG_QRS_Complex OVTK_GDF_ECG_QRS_Complex 0x503 + OVTK_GDF_ECG_R_Point OVTK_GDF_ECG_R_Point 0x504 + OVTK_GDF_ECG_T_Wave OVTK_GDF_ECG_T_Wave 0x506 + OVTK_GDF_ECG_U_Wave OVTK_GDF_ECG_U_Wave 0x507 + OVTK_GDF_Start OVTK_GDF_Start 0x580 + OVTK_GDF_25_Watt OVTK_GDF_25_Watt 0x581 + OVTK_GDF_50_Watt OVTK_GDF_50_Watt 0x582 + OVTK_GDF_75_Watt OVTK_GDF_75_Watt 0x583 + OVTK_GDF_100_Watt OVTK_GDF_100_Watt 0x584 + OVTK_GDF_125_Watt OVTK_GDF_125_Watt 0x585 + OVTK_GDF_150_Watt OVTK_GDF_150_Watt 0x586 + OVTK_GDF_175_Watt OVTK_GDF_175_Watt 0x587 + OVTK_GDF_200_Watt OVTK_GDF_200_Watt 0x588 + OVTK_GDF_225_Watt OVTK_GDF_225_Watt 0x589 + OVTK_GDF_250_Watt OVTK_GDF_250_Watt 0x58A + OVTK_GDF_275_Watt OVTK_GDF_275_Watt 0x58B + OVTK_GDF_300_Watt OVTK_GDF_300_Watt 0x58C + OVTK_GDF_325_Watt OVTK_GDF_325_Watt 0x58D + OVTK_GDF_350_Watt OVTK_GDF_350_Watt 0x58E + OVTK_GDF_Start_Of_New_Segment OVTK_GDF_Start_Of_New_Segment 0x7FFE + OVTK_GDF_Non_Equidistant_Sampling_Value OVTK_GDF_Non_Equidistant_Sampling_Value 0x7FFF diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCAlgorithmClassifier.cpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCAlgorithmClassifier.cpp new file mode 100644 index 0000000..466e624 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCAlgorithmClassifier.cpp @@ -0,0 +1,198 @@ +#include "ovtkCAlgorithmClassifier.h" +#include "ovtkCFeatureVector.hpp" +#include "ovtkCFeatureVectorSet.hpp" +#include "ovtkCVector.hpp" + +#include +#include + +namespace OpenViBE { +namespace Toolkit { + +bool CAlgorithmClassifier::initialize() +{ + m_AlgorithmProxy = nullptr; + m_ExtraParametersMap = nullptr; + return true; +} + +bool CAlgorithmClassifier::uninitialize() +{ + if (m_AlgorithmProxy != nullptr) + { + m_AlgorithmProxy->uninitialize(); + this->getAlgorithmManager().releaseAlgorithm(*m_AlgorithmProxy); + m_AlgorithmProxy = nullptr; + } + return true; +} + +bool CAlgorithmClassifier::process() +{ + const Kernel::TParameterHandler ip_FeatureVector(this->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_FeatureVector)); + const Kernel::TParameterHandler ip_FeatureVectorSet(this->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_FeatureVectorSet)); + const Kernel::TParameterHandler ip_Config(this->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_Config)); + + Kernel::TParameterHandler op_EstimatedClass(this->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Class)); + Kernel::TParameterHandler op_ClassificationValues(this->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_ClassificationValues)); + Kernel::TParameterHandler op_ProbabilityValues(this->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_ProbabilityValues)); + Kernel::TParameterHandler op_Config(this->getOutputParameter(OVTK_Algorithm_Classifier_OutputParameterId_Config)); + + if (this->isInputTriggerActive(OVTK_Algorithm_Classifier_InputTriggerId_Train)) + { + CMatrix* featureVectorSet = ip_FeatureVectorSet; + if (!featureVectorSet) + { + this->activateOutputTrigger(OVTK_Algorithm_Classifier_OutputTriggerId_Failed, true); + OV_ERROR_KRF("Feature vector set is NULL", Kernel::ErrorType::BadInput); + } + const CFeatureVectorSet featureVectorSetAdapter(*featureVectorSet); + if (this->train(featureVectorSetAdapter)) { this->activateOutputTrigger(OVTK_Algorithm_Classifier_OutputTriggerId_Success, true); } + else + { + this->activateOutputTrigger(OVTK_Algorithm_Classifier_OutputTriggerId_Failed, true); + OV_ERROR_KRF("Training failed", Kernel::ErrorType::Internal); + } + } + + if (this->isInputTriggerActive(OVTK_Algorithm_Classifier_InputTriggerId_Classify)) + { + CMatrix* featureVector = ip_FeatureVector; + CMatrix* classificationValues = op_ClassificationValues; + CMatrix* probabilityValues = op_ProbabilityValues; + + if (!featureVector || !classificationValues || !probabilityValues) + { + this->activateOutputTrigger(OVTK_Algorithm_Classifier_OutputTriggerId_Failed, true); + OV_ERROR_KRF("Classifying failed", (!featureVector) ? Kernel::ErrorType::BadInput : Kernel::ErrorType::BadOutput); + } + double estimatedClass = 0; + const CFeatureVector featureVectorAdapter(*featureVector); + CVector classificationValuesAdapter(*classificationValues); + CVector probabilityValuesAdapter(*probabilityValues); + + if (this->classify(featureVectorAdapter, estimatedClass, classificationValuesAdapter, probabilityValuesAdapter)) + { + op_EstimatedClass = estimatedClass; + this->activateOutputTrigger(OVTK_Algorithm_Classifier_OutputTriggerId_Success, true); + } + else + { + this->activateOutputTrigger(OVTK_Algorithm_Classifier_OutputTriggerId_Failed, true); + OV_ERROR_KRF("Classifying failed", Kernel::ErrorType::Internal); + } + } + + if (this->isInputTriggerActive(OVTK_Algorithm_Classifier_InputTriggerId_SaveConfig)) + { + XML::IXMLNode* rootNode = this->saveConfig(); + op_Config = rootNode; + if (rootNode) { this->activateOutputTrigger(OVTK_Algorithm_Classifier_OutputTriggerId_Success, true); } + else + { + this->activateOutputTrigger(OVTK_Algorithm_Classifier_OutputTriggerId_Failed, true); + OV_ERROR_KRF("Saving configuration failed", Kernel::ErrorType::Internal); + } + } + + if (this->isInputTriggerActive(OVTK_Algorithm_Classifier_InputTriggerId_LoadConfig)) + { + XML::IXMLNode* rootNode = ip_Config; + if (!rootNode) + { + this->activateOutputTrigger(OVTK_Algorithm_Classifier_OutputTriggerId_Failed, true); + OV_ERROR_KRF("Configuration XML node is NULL", Kernel::ErrorType::BadInput); + } + if (this->loadConfig(rootNode)) + { + this->activateOutputTrigger(OVTK_Algorithm_Classifier_OutputTriggerId_Success, true); + //Now we need to parametrize the two output Matrix for values + setMatrixOutputDimension(op_ProbabilityValues, this->getNProbabilities()); + setMatrixOutputDimension(op_ClassificationValues, this->getNDistances()); + } + else + { + this->activateOutputTrigger(OVTK_Algorithm_Classifier_OutputTriggerId_Failed, true); + OV_ERROR_KRF("Loading configuration failed", Kernel::ErrorType::Internal); + } + } + + return true; +} + +bool CAlgorithmClassifier::initializeExtraParameterMechanism() +{ + const Kernel::TParameterHandler*> ip_ExtraParameter( + this->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_ExtraParameter)); + m_ExtraParametersMap = static_cast*>(ip_ExtraParameter); + + m_AlgorithmProxy = &this->getAlgorithmManager().getAlgorithm(this->getAlgorithmManager().createAlgorithm(this->getClassIdentifier())); + + OV_ERROR_UNLESS_KRF(m_AlgorithmProxy->initialize(), "Failed to initialize algorithm", Kernel::ErrorType::Internal); + + return true; +} + +bool CAlgorithmClassifier::uninitializeExtraParameterMechanism() +{ + OV_ERROR_UNLESS_KRF(m_AlgorithmProxy->uninitialize(), "Failed to uninitialize algorithm", Kernel::ErrorType::Internal); + + this->getAlgorithmManager().releaseAlgorithm(*m_AlgorithmProxy); + + m_AlgorithmProxy = nullptr; + m_ExtraParametersMap = nullptr; + return true; +} + +CString& CAlgorithmClassifier::getParameterValue(const CIdentifier& parameterID) const +{ + const CString parameterName = m_AlgorithmProxy->getInputParameterName(parameterID); + return (*static_cast*>(m_ExtraParametersMap))[parameterName]; +} + +void CAlgorithmClassifier::setMatrixOutputDimension(Kernel::TParameterHandler& matrix, const size_t length) { matrix->resize(length); } + +uint64_t CAlgorithmClassifier::getUInt64Parameter(const CIdentifier& parameterID) +{ + Kernel::TParameterHandler temp(getInputParameter(parameterID)); + temp = this->getAlgorithmContext().getConfigurationManager().expandAsUInteger(getParameterValue(parameterID)); + return uint64_t(temp); +} + +int64_t CAlgorithmClassifier::getInt64Parameter(const CIdentifier& parameterID) +{ + Kernel::TParameterHandler temp(getInputParameter(parameterID)); + temp = this->getAlgorithmContext().getConfigurationManager().expandAsInteger(getParameterValue(parameterID)); + return int64_t(temp); +} + +double CAlgorithmClassifier::getDoubleParameter(const CIdentifier& parameterID) +{ + Kernel::TParameterHandler temp(getInputParameter(parameterID)); + temp = this->getAlgorithmContext().getConfigurationManager().expandAsFloat(getParameterValue(parameterID)); + return double(temp); +} + +bool CAlgorithmClassifier::getBooleanParameter(const CIdentifier& parameterID) +{ + Kernel::TParameterHandler temp(getInputParameter(parameterID)); + temp = this->getAlgorithmContext().getConfigurationManager().expandAsBoolean(getParameterValue(parameterID)); + return bool(temp); +} + +CString* CAlgorithmClassifier::getCStringParameter(const CIdentifier& parameterID) +{ + Kernel::TParameterHandler temp(getInputParameter(parameterID)); + temp = &getParameterValue(parameterID); + return static_cast(temp); +} + +uint64_t CAlgorithmClassifier::getEnumerationParameter(const CIdentifier& parameterID, const CIdentifier& enumerationIdentifier) +{ + Kernel::TParameterHandler temp(getInputParameter(parameterID)); + temp = this->getTypeManager().getEnumerationEntryValueFromName(enumerationIdentifier, getParameterValue(parameterID)); + return uint64_t(temp); +} + +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCAlgorithmClassifierTrainer.cpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCAlgorithmClassifierTrainer.cpp new file mode 100644 index 0000000..5d95b5e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCAlgorithmClassifierTrainer.cpp @@ -0,0 +1,50 @@ +#include "ovtkCAlgorithmClassifierTrainer.h" +#include "ovtkCFeatureVectorSet.hpp" + +namespace OpenViBE { +namespace Toolkit { + +bool CAlgorithmClassifierTrainer::process() +{ + Kernel::TParameterHandler ip_featureVectorSet(this->getInputParameter(OVTK_Algorithm_ClassifierTrainer_InputParameterId_FeatureVectorSet)); + Kernel::TParameterHandler op_config(this->getOutputParameter(OVTK_Algorithm_ClassifierTrainer_OutputParameterId_Config)); + + if (this->isInputTriggerActive(OVTK_Algorithm_ClassifierTrainer_InputTriggerId_Train)) + { + CMatrix* featureVectorSet = ip_featureVectorSet; + if (!featureVectorSet) + { + this->activateOutputTrigger(OVTK_Algorithm_ClassifierTrainer_OutputTriggerId_Failed, true); + OV_ERROR_KRF("Feature vector set is NULL", Kernel::ErrorType::BadInput); + } + const CFeatureVectorSet featureVectorSetAdapter(*featureVectorSet); + if (this->train(featureVectorSetAdapter)) { this->activateOutputTrigger(OVTK_Algorithm_ClassifierTrainer_OutputTriggerId_Success, true); } + else + { + this->activateOutputTrigger(OVTK_Algorithm_ClassifierTrainer_OutputTriggerId_Failed, true); + OV_ERROR_KRF("Training failed", Kernel::ErrorType::Internal); + } + } + + if (this->isInputTriggerActive(OVTK_Algorithm_ClassifierTrainer_InputTriggerId_SaveConfig)) + { + IMemoryBuffer* config = op_config; + if (!config) + { + this->activateOutputTrigger(OVTK_Algorithm_ClassifierTrainer_OutputTriggerId_Failed, true); + OV_ERROR_KRF("Configuration memory buffer is NULL", Kernel::ErrorType::BadOutput); + } + config->setSize(0, true); + if (this->saveConfig(*config)) { this->activateOutputTrigger(OVTK_Algorithm_ClassifierTrainer_OutputTriggerId_Success, true); } + else + { + this->activateOutputTrigger(OVTK_Algorithm_ClassifierTrainer_OutputTriggerId_Failed, true); + OV_ERROR_KRF("Saving configuration failed", Kernel::ErrorType::Internal); + } + } + + return true; +} + +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCAlgorithmPairingStrategy.cpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCAlgorithmPairingStrategy.cpp new file mode 100644 index 0000000..000628b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCAlgorithmPairingStrategy.cpp @@ -0,0 +1,44 @@ +#include "ovtkCAlgorithmClassifier.h" +#include "ovtkCAlgorithmPairingStrategy.h" + +#include + +namespace OpenViBE { +namespace Toolkit { + +static std::map comparisionFunctions; + +void registerClassificationComparisonFunction(const CIdentifier& classID, const fClassifierComparison comparision) +{ + comparisionFunctions[classID.id()] = comparision; +} + +fClassifierComparison getClassificationComparisonFunction(const CIdentifier& classID) +{ + if (comparisionFunctions.count(classID.id()) == 0) { return nullptr; } + return comparisionFunctions[classID.id()]; +} + +bool CAlgorithmPairingStrategy::process() +{ + if (this->isInputTriggerActive(OVTK_Algorithm_PairingStrategy_InputTriggerId_DesignArchitecture)) + { + Kernel::TParameterHandler + ip_classifierID(this->getInputParameter(OVTK_Algorithm_PairingStrategy_InputParameterId_SubClassifierAlgorithm)); + Kernel::TParameterHandler ip_nClass(this->getInputParameter(OVTK_Algorithm_Classifier_InputParameterId_NClasses)); + + const uint64_t nClass = uint64_t(ip_nClass); + const CIdentifier classifierID = *static_cast(ip_classifierID); + if (this->designArchitecture(classifierID, size_t(nClass))) { this->activateOutputTrigger(OVTK_Algorithm_Classifier_OutputTriggerId_Success, true); } + else + { + this->activateOutputTrigger(OVTK_Algorithm_Classifier_OutputTriggerId_Failed, true); + OV_ERROR_KRF("Designing architecture failed", Kernel::ErrorType::Internal); + } + } + else { return CAlgorithmClassifier::process(); } + return true; +} + +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCFeatureVector.hpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCFeatureVector.hpp new file mode 100644 index 0000000..b52048b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCFeatureVector.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include "ovtkCVector.hpp" +#include "../../ovtkIFeatureVector.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TFeatureVector final : public TVector +{ +public: + + explicit TFeatureVector(CMatrix& rMatrix) : TVector(rMatrix) { } + + double getLabel() const override { return 0; } + bool setLabel(const double /*label*/) override { return false; } + + _IsDerivedFromClass_Final_(TVector, CIdentifier::undefined()) +}; + +typedef TFeatureVector CFeatureVector; +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCFeatureVectorSet.cpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCFeatureVectorSet.cpp new file mode 100644 index 0000000..cee8d36 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCFeatureVectorSet.cpp @@ -0,0 +1,31 @@ +#include "ovtkCFeatureVectorSet.hpp" + +namespace OpenViBE { +namespace Toolkit { + +CFeatureVectorSet::CFeatureVectorSet(const CMatrix& matrix) : m_matrix(matrix) +{ + if (matrix.getDimensionCount() != 2) { throw std::runtime_error("Fetaure vector set matrix must be 2 dimensions"); } + + for (size_t i = 0; i < matrix.getDimensionSize(0); ++i) + { + m_features[i].m_Matrix = &matrix; + m_features[i].m_DimensionIdx = i; + m_features[i].m_Size = matrix.getDimensionSize(1) - 1; + m_features[i].m_Buffer = matrix.getBuffer() + i * matrix.getDimensionSize(1); + } +} + +IFeatureVector& CFeatureVectorSet::getFeatureVector(const size_t index) { return m_features.find(index)->second; } + +const IFeatureVector& CFeatureVectorSet::getFeatureVector(const size_t index) const { return m_features.find(index)->second; } + +size_t CFeatureVectorSet::getLabelCount() const +{ + std::map labels; + for (auto it = m_features.begin(); it != m_features.end(); ++it) { labels[it->second.getLabel()] = true; } + return labels.size(); +} + +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCFeatureVectorSet.hpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCFeatureVectorSet.hpp new file mode 100644 index 0000000..30b7c4e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCFeatureVectorSet.hpp @@ -0,0 +1,52 @@ +#pragma once + +#include "../../ovtkIFeatureVector.h" +#include "../../ovtkIFeatureVectorSet.h" + +#include + +namespace OpenViBE { +namespace Toolkit { +class CInternalFeatureVector final : public IFeatureVector +{ +public: + + CInternalFeatureVector() { } + uint32_t getSize() const override { return m_Size; } + bool setSize(const uint32_t /*size*/) override { return false; } + double* getBuffer() override { return nullptr; } + const double* getBuffer() const override { return m_Buffer; } + const char* getElementLabel(const uint32_t index) const override { return m_Matrix->getDimensionLabel(m_DimensionIdx, index); } + bool setElementLabel(const uint32_t /*index*/, const char* /*elementLabel*/) override { return false; } + double getLabel() const override { return m_Buffer[m_Size]; } + bool setLabel(const double /*label*/) override { return false; } + + _IsDerivedFromClass_Final_(IFeatureVector, CIdentifier::undefined()) + + const CMatrix* m_Matrix = nullptr; + uint32_t m_DimensionIdx = 0; + uint32_t m_Size = 0; + const double* m_Buffer = nullptr; +}; + +class CFeatureVectorSet final : public IFeatureVectorSet +{ +public: + + explicit CFeatureVectorSet(const CMatrix& matrix); + size_t getFeatureVectorCount() const override { return m_matrix.getDimensionSize(0); } + bool setFeatureVectorCount(const size_t /*nFeatureVector*/) override { return false; } + bool addFeatureVector(const IFeatureVector& /*featureVector*/) override { return false; } + IFeatureVector& getFeatureVector(const size_t index) override; + const IFeatureVector& getFeatureVector(const size_t index) const override; + size_t getLabelCount() const override; + + _IsDerivedFromClass_Final_(IFeatureVectorSet, CIdentifier::undefined()) + +protected: + + const CMatrix& m_matrix; + std::map m_features; +}; +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCVector.hpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCVector.hpp new file mode 100644 index 0000000..b976f9f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/classification/ovtkCVector.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include "../../ovtk_base.h" +#include "../../ovtkIVector.h" + +namespace OpenViBE { +namespace Toolkit { +template +class TVector : public TParent +{ +public: + + explicit TVector(CMatrix& matrix) : m_matrix(matrix) { } + + uint32_t getSize() const override { return m_matrix.getBufferElementCount(); } + + bool setSize(const uint32_t size) override + { + m_matrix.resize(size); + return true; + } + + double* getBuffer() override { return m_matrix.getBuffer(); } + const double* getBuffer() const override { return m_matrix.getBuffer(); } + const char* getElementLabel(const uint32_t index) const override { return m_matrix.getDimensionLabel(0, index); } + + bool setElementLabel(const uint32_t index, const char* label) override + { + m_matrix.setDimensionLabel(0, index, label); + return true; + } + + _IsDerivedFromClass_Final_(TParent, CIdentifier::undefined()) + +protected: + + CMatrix& m_matrix; +}; + +typedef TVector CVector; +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/scenario-io/ovtkCAlgorithmScenarioExporter.cpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/scenario-io/ovtkCAlgorithmScenarioExporter.cpp new file mode 100644 index 0000000..eb6a81b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/scenario-io/ovtkCAlgorithmScenarioExporter.cpp @@ -0,0 +1,403 @@ +#include "ovtkCAlgorithmScenarioExporter.h" +#include +#include + +namespace OpenViBE { +namespace Toolkit { +namespace { +class CAlgorithmScenarioExporterHelper +{ + friend class CAlgorithmScenarioExporter; +public: + + CAlgorithmScenarioExporterHelper(Kernel::IAlgorithmContext& context, CAlgorithmScenarioExporter& parent); + bool exportBox(IMemoryBuffer& buffer, const Kernel::IBox& box) const; + bool exportComment(IMemoryBuffer& buffer, const Kernel::IComment& comment) const; + bool exportMetadata(IMemoryBuffer& buffer, const Kernel::IMetadata& metadata) const; + bool exportSetting(IMemoryBuffer& buffer, const Kernel::IScenario& scenario, const size_t index) const; + bool exportInput(IMemoryBuffer& buffer, const Kernel::IScenario& scenario, size_t index) const; + bool exportOutput(IMemoryBuffer& buffer, const Kernel::IScenario& scenario, size_t index) const; + bool exportLink(IMemoryBuffer& buffer, const Kernel::ILink& link) const; + void exportAttributes(const Kernel::IAttributable& attributable, IMemoryBuffer& buffer, const CIdentifier& idAttributes, + const CIdentifier& idAttribute, const CIdentifier& idAttributeID, const CIdentifier& idAttributeValue) const; + + +protected: + + Kernel::IAlgorithmContext& m_algorithmContext; + CAlgorithmScenarioExporter& m_parent; +}; +} // namespace + + +#define exportAttributesMacro(exporter, attributable, memoryBuffer, AttributableName) \ + do { \ + (exporter).exportAttributes(attributable, memoryBuffer, \ + OVTK_Algorithm_ScenarioExporter_NodeId_##AttributableName##_Attributes, \ + OVTK_Algorithm_ScenarioExporter_NodeId_##AttributableName##_Attribute, \ + OVTK_Algorithm_ScenarioExporter_NodeId_##AttributableName##_Attribute_ID, \ + OVTK_Algorithm_ScenarioExporter_NodeId_##AttributableName##_Attribute_Value); \ + } while (0) + +void CAlgorithmScenarioExporterHelper::exportAttributes(const Kernel::IAttributable& attributable, IMemoryBuffer& buffer, const CIdentifier& idAttributes, + const CIdentifier& idAttribute, const CIdentifier& idAttributeID, + const CIdentifier& idAttributeValue) const +{ + if (attributable.getNextAttributeIdentifier(CIdentifier::undefined()) != CIdentifier::undefined()) + { + CIdentifier attributeIdentifier; + m_parent.exportStart(buffer, idAttributes); + while ((attributeIdentifier = attributable.getNextAttributeIdentifier(attributeIdentifier)) != CIdentifier::undefined()) + { + // do not export attributes that are used only in the designer for bookkeeping + if ((attributeIdentifier != OV_AttributeId_Box_ToBeUpdated) && (attributeIdentifier != OV_AttributeId_Box_PendingDeprecatedInterfacors)) + { + m_parent.exportStart(buffer, idAttribute); + m_parent.exportIdentifier(buffer, idAttributeID, attributeIdentifier); + m_parent.exportString(buffer, idAttributeValue, attributable.getAttributeValue(attributeIdentifier)); + m_parent.exportStop(buffer); + } + } + m_parent.exportStop(buffer); + } +} + + +bool CAlgorithmScenarioExporter::process() +{ + const CAlgorithmScenarioExporterHelper helper(this->getAlgorithmContext(), *this); + CMemoryBuffer tmpBuffer; + + // preallocates 1 Mbytes + tmpBuffer.reserve(1024 * 1024); + + Kernel::TParameterHandler ip_scenario(this->getInputParameter(OV_Algorithm_ScenarioExporter_InputParameterId_Scenario)); + Kernel::IScenario* scenario = ip_scenario; + + OV_ERROR_UNLESS_KRF(scenario, "Input scenario is NULL", Kernel::ErrorType::BadInput); + + Kernel::TParameterHandler op_buffer(this->getOutputParameter(OV_Algorithm_ScenarioExporter_OutputParameterId_MemoryBuffer)); + IMemoryBuffer* buffer = op_buffer; + + OV_ERROR_UNLESS_KRF(buffer, "Output memory buffer is NULL", Kernel::ErrorType::BadOutput); + + this->exportStart(tmpBuffer, OVTK_Algorithm_ScenarioExporter_NodeId_OpenViBEScenario); + this->exportString(tmpBuffer, OVTK_Algorithm_ScenarioExporter_NodeId_FormatVersion, CString("2")); + this->exportString(tmpBuffer, OVTK_Algorithm_ScenarioExporter_NodeId_Creator, this->getConfigurationManager().expand("${Application_Name}")); + this->exportString(tmpBuffer, OVTK_Algorithm_ScenarioExporter_NodeId_CreatorVersion, this->getConfigurationManager().expand("${Application_Version}")); + this->exportStart(tmpBuffer, OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Settings); + for (size_t i = 0; i < scenario->getSettingCount(); ++i) { helper.exportSetting(tmpBuffer, *scenario, i); } + this->exportStop(tmpBuffer); + + this->exportStart(tmpBuffer, OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Inputs); + for (size_t i = 0; i < scenario->getInputCount(); ++i) { helper.exportInput(tmpBuffer, *scenario, i); } + this->exportStop(tmpBuffer); + + this->exportStart(tmpBuffer, OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Outputs); + for (size_t i = 0; i < scenario->getOutputCount(); ++i) { helper.exportOutput(tmpBuffer, *scenario, i); } + this->exportStop(tmpBuffer); + + this->exportStart(tmpBuffer, OVTK_Algorithm_ScenarioExporter_NodeId_Boxes); + { + CIdentifier* listID = nullptr; + size_t nbElems = 0; + scenario->getBoxIdentifierList(&listID, &nbElems); + for (size_t i = 0; i < nbElems; ++i) { helper.exportBox(tmpBuffer, *scenario->getBoxDetails(listID[i])); } + scenario->releaseIdentifierList(listID); + } + this->exportStop(tmpBuffer); + + this->exportStart(tmpBuffer, OVTK_Algorithm_ScenarioExporter_NodeId_Links); + { + CIdentifier* listID = nullptr; + size_t nbElems = 0; + scenario->getLinkIdentifierList(&listID, &nbElems); + for (size_t i = 0; i < nbElems; ++i) + { + const Kernel::ILink* link = scenario->getLinkDetails(listID[i]); + // do not export invalid links + if (!link->hasAttribute(OV_AttributeId_Link_Invalid)) { helper.exportLink(tmpBuffer, *link); } + } + scenario->releaseIdentifierList(listID); + } + this->exportStop(tmpBuffer); + + this->exportStart(tmpBuffer, OVTK_Algorithm_ScenarioExporter_NodeId_Comments); + { + CIdentifier* listID = nullptr; + size_t nbElems = 0; + scenario->getCommentIdentifierList(&listID, &nbElems); + for (size_t i = 0; i < nbElems; ++i) { helper.exportComment(tmpBuffer, *scenario->getCommentDetails(listID[i])); } + scenario->releaseIdentifierList(listID); + } + this->exportStop(tmpBuffer); + + this->exportStart(tmpBuffer, OVTK_Algorithm_ScenarioExporter_NodeId_Metadata); + { + CIdentifier* listID = nullptr; + size_t nbElems = 0; + scenario->getMetadataIdentifierList(&listID, &nbElems); + for (size_t i = 0; i < nbElems; ++i) { helper.exportMetadata(tmpBuffer, *scenario->getMetadataDetails(listID[i])); } + scenario->releaseIdentifierList(listID); + } + this->exportStop(tmpBuffer); + + exportAttributesMacro(helper, *scenario, tmpBuffer, Scenario); + + this->exportStop(tmpBuffer); + + buffer->setSize(0, true); + buffer->append(tmpBuffer); + + return true; +} + +CAlgorithmScenarioExporterHelper::CAlgorithmScenarioExporterHelper(Kernel::IAlgorithmContext& context, CAlgorithmScenarioExporter& parent) + : m_algorithmContext(context), m_parent(parent) {} + +bool CAlgorithmScenarioExporterHelper::exportBox(IMemoryBuffer& buffer, const Kernel::IBox& box) const +{ + m_parent.exportStart(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box); + m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_ID, box.getIdentifier()); + m_parent.exportString(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Name, box.getName()); + m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_AlgorithmClassIdD, box.getAlgorithmClassIdentifier()); + + if (box.getInputCount() != 0) + { + m_parent.exportStart(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Inputs); + for (size_t i = 0; i < box.getInputCount(); ++i) + { + CIdentifier inputID; + CIdentifier inputTypeID; + CString inputName; + box.getInputType(i, inputTypeID); + box.getInputName(i, inputName); + box.getInterfacorIdentifier(Kernel::Input, i, inputID); + + m_parent.exportStart(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input); + if (inputID != CIdentifier::undefined()) { m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input_ID, inputID); } + m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input_TypeID, inputTypeID); + m_parent.exportString(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input_Name, inputName); + m_parent.exportStop(buffer); + } + m_parent.exportStop(buffer); + } + + if (box.getOutputCount() != 0) + { + m_parent.exportStart(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Outputs); + for (size_t i = 0; i < box.getOutputCount(); ++i) + { + CIdentifier outputID; + CIdentifier outputTypeID; + CString outputName; + box.getOutputType(i, outputTypeID); + box.getOutputName(i, outputName); + box.getInterfacorIdentifier(Kernel::Output, i, outputID); + + m_parent.exportStart(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output); + if (outputID != CIdentifier::undefined()) { m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output_ID, outputID); } + m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output_TypeID, outputTypeID); + m_parent.exportString(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output_Name, outputName); + m_parent.exportStop(buffer); + } + m_parent.exportStop(buffer); + } + + if (box.getSettingCount() != 0) + { + m_parent.exportStart(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Settings); + for (size_t i = 0; i < box.getSettingCount(); ++i) + { + CIdentifier settingID; + CIdentifier settingTypeID; + CString settingName; + CString defaultValue; + CString value; + bool modifiability; + box.getInterfacorIdentifier(Kernel::Setting, i, settingID); + box.getSettingType(i, settingTypeID); + box.getSettingName(i, settingName); + box.getSettingDefaultValue(i, defaultValue); + box.getSettingValue(i, value); + box.getSettingMod(i, modifiability); + + CString str; + if (modifiability) { str = CString("true"); } + else { str = CString("false"); } + + m_parent.exportStart(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting); + if (settingID != CIdentifier::undefined()) // do not export identifier if not defined + { + m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_ID, settingID); + } + m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_TypeID, settingTypeID); + m_parent.exportString(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_Name, settingName); + m_parent.exportString(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_DefaultValue, defaultValue); + m_parent.exportString(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_Value, value); + m_parent.exportString(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_Modifiability, str); + m_parent.exportStop(buffer); + } + m_parent.exportStop(buffer); + } + + exportAttributesMacro((*this), box, buffer, Box); + + m_parent.exportStop(buffer); + + return true; +} + +bool CAlgorithmScenarioExporterHelper::exportComment(IMemoryBuffer& buffer, const Kernel::IComment& comment) const +{ + m_parent.exportStart(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Comment); + m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Comment_ID, comment.getIdentifier()); + m_parent.exportString(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Text, comment.getText()); + + exportAttributesMacro((*this), comment, buffer, Comment); + + m_parent.exportStop(buffer); + + return true; +} + +bool CAlgorithmScenarioExporterHelper::exportMetadata(IMemoryBuffer& buffer, const Kernel::IMetadata& metadata) const +{ + m_parent.exportStart(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry); + m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry_ID, metadata.getIdentifier()); + m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry_Type, metadata.getType()); + m_parent.exportString(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry_Data, metadata.getData()); + m_parent.exportStop(buffer); + return true; +} + +bool CAlgorithmScenarioExporterHelper::exportLink(IMemoryBuffer& buffer, const Kernel::ILink& link) const +{ + CIdentifier srcBoxID; + CIdentifier dstBoxID; + size_t srcBoxOutputIdx = size_t(-1); + size_t dstBoxInputIdx = size_t(-1); + CIdentifier srcBoxOutputID; + CIdentifier dstBoxInputID; + + link.getSource(srcBoxID, srcBoxOutputIdx, srcBoxOutputID); + link.getTarget(dstBoxID, dstBoxInputIdx, dstBoxInputID); + + m_parent.exportStart(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Link); + m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Link_ID, link.getIdentifier()); + m_parent.exportStart(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source); + m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source_BoxID, srcBoxID); + if (srcBoxOutputID != CIdentifier::undefined()) + { + m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source_BoxOutputID, srcBoxOutputID); + } + else { m_parent.exportUInteger(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source_BoxOutputIdx, srcBoxOutputIdx); } + m_parent.exportStop(buffer); + m_parent.exportStart(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target); + m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target_BoxID, dstBoxID); + if (dstBoxInputID != CIdentifier::undefined()) + { + m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target_BoxInputID, dstBoxInputID); + } + else { m_parent.exportUInteger(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target_BoxInputIdx, dstBoxInputIdx); } + m_parent.exportStop(buffer); + + exportAttributesMacro((*this), link, buffer, Link); + + m_parent.exportStop(buffer); + + return true; +} + +bool CAlgorithmScenarioExporterHelper::exportSetting(IMemoryBuffer& buffer, const Kernel::IScenario& scenario, const size_t index) const +{ + CIdentifier settingID; + CIdentifier settingTypeID; + CString settingName; + CString defaultValue; + CString value; + + + scenario.getSettingName(index, settingName); + scenario.getInterfacorIdentifier(Kernel::Setting, index, settingID); + scenario.getSettingType(index, settingTypeID); + scenario.getSettingValue(index, value); + scenario.getSettingDefaultValue(index, defaultValue); + + m_parent.exportStart(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting); + m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_ID, settingID); + m_parent.exportIdentifier(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_TypeID, settingTypeID); + m_parent.exportString(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_Name, settingName); + m_parent.exportString(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_DefaultValue, defaultValue); + m_parent.exportString(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_Value, value); + m_parent.exportStop(buffer); + + return true; +} + +bool CAlgorithmScenarioExporterHelper::exportInput(IMemoryBuffer& buffer, const Kernel::IScenario& scenario, const size_t index) const +{ + CIdentifier inputID; + CIdentifier inputTypeID; + CString inputName; + CIdentifier linkedBoxID; + size_t linkedBoxInputIdx; + CIdentifier linkedBoxInputID; + + scenario.getInterfacorIdentifier(Kernel::Input, index, inputID); + scenario.getInputType(index, inputTypeID); + scenario.getInputName(index, inputName); + scenario.getScenarioInputLink(index, linkedBoxID, linkedBoxInputIdx); + scenario.getScenarioInputLink(index, linkedBoxID, linkedBoxInputID); + + m_parent.exportStart(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input); + + m_parent.exportIdentifier(buffer,OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_ID, inputID); + m_parent.exportIdentifier(buffer,OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_TypeID, inputTypeID); + m_parent.exportString(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_Name, inputName); + m_parent.exportIdentifier(buffer,OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_LinkedBoxID, linkedBoxID); + if (linkedBoxInputID != CIdentifier::undefined()) + { + m_parent.exportIdentifier(buffer,OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_LinkedBoxInputID, linkedBoxInputID); + } + else { m_parent.exportUInteger(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_LinkedBoxInputIdx, uint64_t(linkedBoxInputIdx)); } + + m_parent.exportStop(buffer); + + return true; +} + +bool CAlgorithmScenarioExporterHelper::exportOutput(IMemoryBuffer& buffer, const Kernel::IScenario& scenario, const size_t index) const +{ + CIdentifier outputID; + CIdentifier outputTypeID; + CString outputName; + CIdentifier linkedBoxID; + size_t linkedBoxOutputIdx; + CIdentifier linkedBoxOutputID; + + scenario.getInterfacorIdentifier(Kernel::Output, index, outputID); + scenario.getOutputType(index, outputTypeID); + scenario.getOutputName(index, outputName); + scenario.getScenarioOutputLink(index, linkedBoxID, linkedBoxOutputIdx); + scenario.getScenarioOutputLink(index, linkedBoxID, linkedBoxOutputID); + + m_parent.exportStart(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output); + + m_parent.exportIdentifier(buffer,OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_ID, outputID); + m_parent.exportIdentifier(buffer,OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_TypeID, outputTypeID); + m_parent.exportString(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_Name, outputName); + m_parent.exportIdentifier(buffer,OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_LinkedBoxID, linkedBoxID); + if (linkedBoxOutputID != CIdentifier::undefined()) + { + m_parent.exportIdentifier(buffer,OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_LinkedBoxOutputID, linkedBoxOutputID); + } + else { m_parent.exportUInteger(buffer, OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_LinkedBoxOutputIdx, uint64_t(linkedBoxOutputIdx)); } + + m_parent.exportStop(buffer); + + return true; +} + +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/scenario-io/ovtkCAlgorithmScenarioImporter.cpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/scenario-io/ovtkCAlgorithmScenarioImporter.cpp new file mode 100644 index 0000000..03b6fea --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/algorithms/scenario-io/ovtkCAlgorithmScenarioImporter.cpp @@ -0,0 +1,509 @@ +#include "ovtkCAlgorithmScenarioImporter.h" + +#include +#include +#include +#include + +namespace OpenViBE { +namespace Toolkit { + +namespace { +typedef struct SScenarioInput +{ + CIdentifier id = CIdentifier::undefined(); + CIdentifier typeID = CIdentifier::undefined(); + CString name; + CIdentifier linkedBoxID = CIdentifier::undefined(); + size_t linkedBoxInputIdx = size_t(-1); + CIdentifier linkedBoxInputID = CIdentifier::undefined(); +} scenario_input_t; + +typedef struct SScenarioOutput +{ + CIdentifier id = CIdentifier::undefined(); + CIdentifier typeID = CIdentifier::undefined(); + CString name; + CIdentifier linkedBoxID = CIdentifier::undefined(); + size_t linkedBoxOutputIdx = size_t(-1); + CIdentifier linkedBoxOutputID = CIdentifier::undefined(); +} scenario_output_t; + +typedef struct SInput +{ + CIdentifier id = CIdentifier::undefined(); + CIdentifier typeID = CIdentifier::undefined(); + CString name; +} input_t; + +typedef struct SOutput +{ + CIdentifier id = CIdentifier::undefined(); + CIdentifier typeID = CIdentifier::undefined(); + CString name; +} output_t; + +typedef struct SSetting +{ + CIdentifier typeID = CIdentifier::undefined(); + CString name; + CString defaultValue; + CString value; + bool modifiability = false; + CIdentifier id = CIdentifier::undefined(); +} setting_t; + +typedef struct SAttribute +{ + CIdentifier id = CIdentifier::undefined(); + CString value; +} attribute_t; + +typedef struct SBox +{ + CIdentifier id = CIdentifier::undefined(); + CIdentifier algorithmClassID = CIdentifier::undefined(); + CString name; + std::vector inputs; + std::vector outputs; + std::vector settings; + std::vector attributes; +} box_t; + +typedef struct SComment +{ + CIdentifier id; + CString text; + std::vector attributes; +} comment_t; + +typedef struct SMetadata +{ + CIdentifier identifier; + CIdentifier type; + CString data; +} metadata_t; + +typedef struct SLinkSrc +{ + CIdentifier boxID; + size_t boxOutputIdx = size_t(-1); + CIdentifier boxOutputID = CIdentifier::undefined(); +} link_src_t; + +typedef struct SLinkDst +{ + CIdentifier boxID; + size_t boxInputIdx = size_t(-1); + CIdentifier boxInputID = CIdentifier::undefined(); +} link_dst_t; + +typedef struct SLink +{ + CIdentifier id; + link_src_t linkSrc; + link_dst_t linkDst; + std::vector attributes; +} link_t; + +typedef struct SScenario +{ + std::vector settings; + std::vector iScenarios; + std::vector oScenarios; + std::vector boxes; + std::vector comments; + std::vector metadata; + std::vector links; + std::vector attributes; +} scenario_t; +} // namespace + +class CAlgorithmScenarioImporterContext final : public Plugins::IAlgorithmScenarioImporterContext +{ +public: + + explicit CAlgorithmScenarioImporterContext(Kernel::IAlgorithmContext& algorithmCtx) : m_AlgorithmContext(algorithmCtx) { } + + bool processStart(const CIdentifier& identifier) override; + bool processIdentifier(const CIdentifier& identifier, const CIdentifier& value) override; + bool processString(const CIdentifier& identifier, const CString& value) override; + bool processUInteger(const CIdentifier& identifier, uint64_t value) override; + bool processStop() override { return true; } + + _IsDerivedFromClass_Final_(IAlgorithmScenarioImporterContext, CIdentifier::undefined()) + + Kernel::IAlgorithmContext& m_AlgorithmContext; + scenario_t m_SymbolicScenario; +}; + + +bool CAlgorithmScenarioImporter::process() +{ + Kernel::TParameterHandler op_scenario(this->getOutputParameter(OV_Algorithm_ScenarioImporter_OutputParameterId_Scenario)); + Kernel::IScenario* scenario = op_scenario; + + OV_ERROR_UNLESS_KRF(scenario, "Output scenario is NULL", Kernel::ErrorType::BadOutput); + + Kernel::TParameterHandler ip_buffer(this->getInputParameter(OV_Algorithm_ScenarioImporter_InputParameterId_MemoryBuffer)); + IMemoryBuffer* memoryBuffer = ip_buffer; + + OV_ERROR_UNLESS_KRF(memoryBuffer, "Input memory buffer is NULL", Kernel::ErrorType::BadInput); + + std::map boxIdMapping; + + CAlgorithmScenarioImporterContext context(this->getAlgorithmContext()); + + OV_ERROR_UNLESS_KRF(this->import(context, *memoryBuffer), "Import failed", Kernel::ErrorType::Internal); + + scenario_t& symbolicScenario = context.m_SymbolicScenario; + + // Now build the scenario according to what has been loaded + + for (auto s = symbolicScenario.settings.begin(); s != symbolicScenario.settings.end(); ++s) + { + CIdentifier settingID = s->id; + // compute identifier only if it does not exists + if (settingID == CIdentifier::undefined()) { settingID = scenario->getUnusedSettingIdentifier(); } + scenario->addSetting(s->name, s->typeID, s->defaultValue, size_t(-1), false, settingID); + scenario->setSettingValue(scenario->getSettingCount() - 1, s->value); + } + + + for (auto b = symbolicScenario.boxes.begin(); b != symbolicScenario.boxes.end(); ++b) + { + Kernel::IBox* box = nullptr; + CIdentifier newBoxID; + + scenario->addBox(newBoxID, b->id); + box = scenario->getBoxDetails(newBoxID); + if (box) + { + box->setName(b->name); + + for (auto i = b->inputs.begin(); i != b->inputs.end(); ++i) { box->addInput(i->name, i->typeID, i->id); } + + for (auto o = b->outputs.begin(); o != b->outputs.end(); ++o) { box->addOutput(o->name, o->typeID, o->id); } + for (auto s = b->settings.begin(); s != b->settings.end(); ++s) + { + const CIdentifier& type = s->typeID; + if (!this->getTypeManager().isRegistered(type) && !(this->getTypeManager().isEnumeration(type)) && (!this->getTypeManager().isBitMask(type))) + { + const std::string msg = std::string("The type of the setting ") + s->name.toASCIIString() + " (" + type.str() + ") from box " + + b->name.toASCIIString() + " cannot be recognized."; + + if (this->getConfigurationManager().expandAsBoolean("${Kernel_AbortScenarioImportOnUnknownSetting}", true)) + { + OV_ERROR_KRF(msg, Kernel::ErrorType::BadSetting); + } + OV_WARNING_K(msg); + } + + box->addSetting(s->name, s->typeID, s->defaultValue, size_t(-1), s->modifiability, s->id); + box->setSettingValue(box->getSettingCount() - 1, s->value); + } + for (auto a = b->attributes.begin(); a != b->attributes.end(); ++a) { box->addAttribute(a->id, a->value); } + + // it is important to set box algorithm at + // last so the box listener is never called + box->setAlgorithmClassIdentifier(b->algorithmClassID); + } + boxIdMapping[b->id] = newBoxID; + } + + for (auto c = symbolicScenario.comments.begin(); c != symbolicScenario.comments.end(); ++c) + { + Kernel::IComment* comment = nullptr; + CIdentifier newCommentID; + + scenario->addComment(newCommentID, c->id); + comment = scenario->getCommentDetails(newCommentID); + if (comment) + { + comment->setText(c->text); + + for (auto a = c->attributes.begin(); a != c->attributes.end(); ++a) { comment->addAttribute(a->id, a->value); } + } + } + + for (auto& symbolicMetadata : symbolicScenario.metadata) + { + CIdentifier newMetadataIdentifier; + scenario->addMetadata(newMetadataIdentifier, symbolicMetadata.identifier); + Kernel::IMetadata* metadata = scenario->getMetadataDetails(newMetadataIdentifier); + if (metadata) + { + metadata->setType(symbolicMetadata.type); + metadata->setData(symbolicMetadata.data); + } + } + + for (auto l = symbolicScenario.links.begin(); l != symbolicScenario.links.end(); ++l) + { + Kernel::ILink* link = nullptr; + CIdentifier newLinkID; + + size_t srcBoxOutputIdx = l->linkSrc.boxOutputIdx; + size_t dstBoxInputIdx = l->linkDst.boxInputIdx; + + CIdentifier srcBoxOutputID = l->linkSrc.boxOutputID; + CIdentifier dstBoxInputID = l->linkDst.boxInputID; + + if (srcBoxOutputID != CIdentifier::undefined()) { scenario->getSourceBoxOutputIndex(boxIdMapping[l->linkSrc.boxID], srcBoxOutputID, srcBoxOutputIdx); } + + OV_ERROR_UNLESS_KRF(srcBoxOutputIdx != size_t(-1), "Output index of the source box could not be found", Kernel::ErrorType::BadOutput); + + if (dstBoxInputID != CIdentifier::undefined()) { scenario->getTargetBoxInputIndex(boxIdMapping[l->linkDst.boxID], dstBoxInputID, dstBoxInputIdx); } + + OV_ERROR_UNLESS_KRF(dstBoxInputIdx != size_t(-1), "Input index of the target box could not be found", Kernel::ErrorType::BadOutput); + + scenario->connect(newLinkID, boxIdMapping[l->linkSrc.boxID], srcBoxOutputIdx, boxIdMapping[l->linkDst.boxID], dstBoxInputIdx, l->id); + + link = scenario->getLinkDetails(newLinkID); + if (link) { for (auto a = l->attributes.begin(); a != l->attributes.end(); ++a) { link->addAttribute(a->id, a->value); } } + } + + size_t scenarioInputIdx = 0; + for (auto symbolicScenarioInput : symbolicScenario.iScenarios) + { + CIdentifier scenarioInputID = symbolicScenarioInput.id; + // compute identifier only if it does not exists + if (scenarioInputID == CIdentifier::undefined()) { scenarioInputID = scenario->getUnusedInputIdentifier(); } + scenario->addInput(symbolicScenarioInput.name, symbolicScenarioInput.typeID, scenarioInputID); + if (symbolicScenarioInput.linkedBoxID != CIdentifier::undefined()) + { + // Only try to set scenario output links from boxes that actually exist + // This enables the usage of header-only importers + if (symbolicScenario.boxes.end() != std::find_if(symbolicScenario.boxes.begin(), symbolicScenario.boxes.end(), + [&symbolicScenarioInput](const box_t& box) { return box.id == symbolicScenarioInput.linkedBoxID; }) + ) + { + CIdentifier linkedBoxInputIdentifier = symbolicScenarioInput.linkedBoxInputID; + size_t linkedBoxInputIndex = symbolicScenarioInput.linkedBoxInputIdx; + + if (linkedBoxInputIdentifier != CIdentifier::undefined()) + { + scenario->getTargetBoxInputIndex(symbolicScenarioInput.linkedBoxID, linkedBoxInputIdentifier, linkedBoxInputIndex); + } + + OV_ERROR_UNLESS_KRF(linkedBoxInputIndex != size_t(-1), "Input index of the target box could not be found", + Kernel::ErrorType::BadOutput); + + scenario->setScenarioInputLink(scenarioInputIdx, symbolicScenarioInput.linkedBoxID, linkedBoxInputIndex); + } + } + scenarioInputIdx++; + } + + size_t scenarioOutputIdx = 0; + for (auto symbolicScenarioOutput : symbolicScenario.oScenarios) + { + CIdentifier scenarioOutputID = symbolicScenarioOutput.id; + // compute identifier only if it does not exists + if (scenarioOutputID == CIdentifier::undefined()) { scenarioOutputID = scenario->getUnusedOutputIdentifier(); } + scenario->addOutput(symbolicScenarioOutput.name, symbolicScenarioOutput.typeID, scenarioOutputID); + if (symbolicScenarioOutput.linkedBoxID != CIdentifier::undefined()) + { + // Only try to set scenario output links from boxes that actually exist + // This enables the usage of header-only importers + if (std::any_of(symbolicScenario.boxes.begin(), symbolicScenario.boxes.end(), [&symbolicScenarioOutput](const box_t& box) + { + return box.id == symbolicScenarioOutput.linkedBoxID; + })) + { + CIdentifier linkedBoxOutputIdentifier = symbolicScenarioOutput.linkedBoxOutputID; + size_t linkedBoxOutputIndex = symbolicScenarioOutput.linkedBoxOutputIdx; + + if (linkedBoxOutputIdentifier != CIdentifier::undefined()) + { + scenario->getSourceBoxOutputIndex(symbolicScenarioOutput.linkedBoxID, linkedBoxOutputIdentifier, linkedBoxOutputIndex); + } + + OV_ERROR_UNLESS_KRF(linkedBoxOutputIndex != size_t(-1), "Output index of the target box could not be found", + Kernel::ErrorType::BadOutput); + scenario->setScenarioOutputLink(scenarioOutputIdx, symbolicScenarioOutput.linkedBoxID, linkedBoxOutputIndex); + } + } + scenarioOutputIdx++; + } + + for (auto a = symbolicScenario.attributes.begin(); a != symbolicScenario.attributes.end(); ++a) { scenario->addAttribute(a->id, a->value); } + + if (scenario->checkOutdatedBoxes()) + { + CIdentifier* listID = nullptr; + size_t nbElems = 0; + scenario->getOutdatedBoxIdentifierList(&listID, &nbElems); + for (size_t i = 0; i < nbElems; ++i) + { + const Kernel::IBox* box = scenario->getBoxDetails(listID[i]); + OV_WARNING_K(std::string("Box ") + box->getName().toASCIIString() + " [" + box->getAlgorithmClassIdentifier().str() + "] should be updated"); + } + scenario->releaseIdentifierList(listID); + } + + return true; +} + +bool CAlgorithmScenarioImporterContext::processStart(const CIdentifier& identifier) +{ + if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_OpenViBEScenario) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Settings) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting) { m_SymbolicScenario.settings.push_back(setting_t()); } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Inputs) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input) { m_SymbolicScenario.iScenarios.push_back(scenario_input_t()); } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Outputs) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output) { m_SymbolicScenario.oScenarios.push_back(scenario_output_t()); } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Creator) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_CreatorVersion) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Attributes) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Attribute) { m_SymbolicScenario.attributes.push_back(attribute_t()); } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Attributes) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Attribute) { m_SymbolicScenario.boxes.back().attributes.push_back(attribute_t()); } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Attributes) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Attribute) { m_SymbolicScenario.links.back().attributes.push_back(attribute_t()); } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Boxes) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box) { m_SymbolicScenario.boxes.push_back(box_t()); } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Comments) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Comment) { m_SymbolicScenario.comments.push_back(comment_t()); } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Attributes) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Attribute) { m_SymbolicScenario.comments.back().attributes.push_back(attribute_t()); } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Metadata) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry) { m_SymbolicScenario.metadata.push_back(metadata_t()); } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Links) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Link) { m_SymbolicScenario.links.push_back(link_t()); } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Inputs) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input) { m_SymbolicScenario.boxes.back().inputs.push_back(input_t()); } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Outputs) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output) { m_SymbolicScenario.boxes.back().outputs.push_back(output_t()); } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Settings) { } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting) { m_SymbolicScenario.boxes.back().settings.push_back(setting_t()); } + // + else + { + OV_ERROR("(start) Unexpected node identifier " << identifier.str(), Kernel::ErrorType::BadArgument, false, + m_AlgorithmContext.getErrorManager(), m_AlgorithmContext.getLogManager()); + } + return true; +} + +bool CAlgorithmScenarioImporterContext::processIdentifier(const CIdentifier& identifier, const CIdentifier& value) +{ + if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_ID) { m_SymbolicScenario.settings.back().id = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_TypeID) { m_SymbolicScenario.settings.back().typeID = value; } + + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_ID) { m_SymbolicScenario.iScenarios.back().id = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_TypeID) { m_SymbolicScenario.iScenarios.back().typeID = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_LinkedBoxID) { m_SymbolicScenario.iScenarios.back().linkedBoxID = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_LinkedBoxInputID) + { + m_SymbolicScenario.iScenarios.back().linkedBoxInputID = value; + } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_ID) { m_SymbolicScenario.oScenarios.back().id = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_TypeID) { m_SymbolicScenario.oScenarios.back().typeID = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_LinkedBoxID) { m_SymbolicScenario.oScenarios.back().linkedBoxID = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_LinkedBoxOutputID) + { + m_SymbolicScenario.oScenarios.back().linkedBoxOutputID = value; + } + + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Attribute_ID) { m_SymbolicScenario.boxes.back().attributes.back().id = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_ID) { m_SymbolicScenario.boxes.back().id = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_AlgorithmClassIdD) { m_SymbolicScenario.boxes.back().algorithmClassID = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input_ID) { m_SymbolicScenario.boxes.back().inputs.back().id = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input_TypeID) { m_SymbolicScenario.boxes.back().inputs.back().typeID = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output_ID) { m_SymbolicScenario.boxes.back().outputs.back().id = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output_TypeID) { m_SymbolicScenario.boxes.back().outputs.back().typeID = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_ID) { m_SymbolicScenario.boxes.back().settings.back().id = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_TypeID) { m_SymbolicScenario.boxes.back().settings.back().typeID = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Comment_ID) { m_SymbolicScenario.comments.back().id = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Attribute_ID) { m_SymbolicScenario.comments.back().attributes.back().id = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry_ID) { m_SymbolicScenario.metadata.back().identifier = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry_Type) { m_SymbolicScenario.metadata.back().type = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Attribute_ID) { m_SymbolicScenario.links.back().attributes.back().id = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Link_ID) { m_SymbolicScenario.links.back().id = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source_BoxID) { m_SymbolicScenario.links.back().linkSrc.boxID = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source_BoxOutputID) { m_SymbolicScenario.links.back().linkSrc.boxOutputID = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target_BoxID) { m_SymbolicScenario.links.back().linkDst.boxID = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target_BoxInputID) { m_SymbolicScenario.links.back().linkDst.boxInputID = value; } + + + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Attribute_ID) { m_SymbolicScenario.attributes.back().id = value; } + else + { + OV_ERROR("(id) Unexpected node identifier " << identifier.str(), + Kernel::ErrorType::BadArgument, false, m_AlgorithmContext.getErrorManager(), m_AlgorithmContext.getLogManager()); + } + return true; +} + +bool CAlgorithmScenarioImporterContext::processString(const CIdentifier& identifier, const CString& value) +{ + if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Attribute_Value) { m_SymbolicScenario.boxes.back().attributes.back().value = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Name) { m_SymbolicScenario.boxes.back().name = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Input_Name) { m_SymbolicScenario.boxes.back().inputs.back().name = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Output_Name) { m_SymbolicScenario.boxes.back().outputs.back().name = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_Name) { m_SymbolicScenario.boxes.back().settings.back().name = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_DefaultValue) + { + m_SymbolicScenario.boxes.back().settings.back().defaultValue = value; + } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_Value) { m_SymbolicScenario.boxes.back().settings.back().value = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Box_Setting_Modifiability) + { + m_SymbolicScenario.boxes.back().settings.back().modifiability = (value == CString("true")) ? true : false; + } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Text) { m_SymbolicScenario.comments.back().text = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Comment_Attribute_Value) + { + m_SymbolicScenario.comments.back().attributes.back().value = value; + } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_MetadataEntry_Data) { m_SymbolicScenario.metadata.back().data = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Attribute_Value) { m_SymbolicScenario.links.back().attributes.back().value = value; } + + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Attribute_Value) { m_SymbolicScenario.attributes.back().value = value; } + + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_Name) { m_SymbolicScenario.settings.back().name = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_DefaultValue) { m_SymbolicScenario.settings.back().defaultValue = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Setting_Value) { m_SymbolicScenario.settings.back().value = value; } + + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_Name) { m_SymbolicScenario.iScenarios.back().name = value; } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_Name) { m_SymbolicScenario.oScenarios.back().name = value; } + + else + { + OV_ERROR("(string) Unexpected node identifier " << identifier.str(), Kernel::ErrorType::BadArgument, + false, m_AlgorithmContext.getErrorManager(), m_AlgorithmContext.getLogManager()); + } + return true; +} + +bool CAlgorithmScenarioImporterContext::processUInteger(const CIdentifier& identifier, const uint64_t value) +{ + if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Source_BoxOutputIdx) { m_SymbolicScenario.links.back().linkSrc.boxOutputIdx = size_t(value); } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Link_Target_BoxInputIdx) + { + m_SymbolicScenario.links.back().linkDst.boxInputIdx = size_t(value); + } + + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Input_LinkedBoxInputIdx) + { + m_SymbolicScenario.iScenarios.back().linkedBoxInputIdx = size_t(value); + } + else if (identifier == OVTK_Algorithm_ScenarioExporter_NodeId_Scenario_Output_LinkedBoxOutputIdx) + { + m_SymbolicScenario.oScenarios.back().linkedBoxOutputIdx = size_t(value); + } + + else + { + OV_ERROR("(uint) Unexpected node identifier " << identifier.str(), Kernel::ErrorType::BadArgument, false, + m_AlgorithmContext.getErrorManager(), m_AlgorithmContext.getLogManager()); + } + return true; +} + +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/ovtk_main.cpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/ovtk_main.cpp new file mode 100644 index 0000000..613db61 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/ovtk_main.cpp @@ -0,0 +1,261 @@ +#include "toolkit/ovtk_all.h" + +namespace OpenViBE { +namespace Toolkit { + +// ******************************************************************************************************************** +// * +// VIM Replace string to easily add enumeration values : * +// * +// :%s/#define \([A-Za-z0-9_]\+\).*/ typeManager.registerEnumerationEntry(OV_TypeId_Stimulation, "\1", \1);/g * +// * +// ******************************************************************************************************************** + +bool initialize(const Kernel::IKernelContext& ctx) +{ + Kernel::ITypeManager& typeManager = ctx.getTypeManager(); + + initializeStimulationList(ctx); + + // Register measurement units. See ovtk_defines.h for details. + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "?", OVTK_UNIT_Unspecified); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "-", OVTK_UNIT_Dimensionless); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "%", OVTK_UNIT_10_2_Percent); + // typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "percent", OVTK_UNIT_10_2_Percent); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "ppht", OVTK_UNIT_10_3_Parts_Per_Thousand); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "ppm", OVTK_UNIT_10_6_Parts_Per_Million); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "ppmd", OVTK_UNIT_10_9_Parts_Per_Milliard); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "ppb", OVTK_UNIT_10_12_Parts_Per_Billion); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "ppt", OVTK_UNIT_10_18_Parts_Per_Trillion); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "degree", OVTK_UNIT_Angle_Degree); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "rad", OVTK_UNIT_Angle_Radian); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g g-1", OVTK_UNIT_Grams_Per_Gram); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g kg-1", OVTK_UNIT_Grams_Per_Kilogram); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mol mol-1", OVTK_UNIT_Moles_Per_Mole); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "l l-1", OVTK_UNIT_Litres_Per_Litre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m m-3", OVTK_UNIT_Cubic_Metres_Per_Cubic_Metre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m cm-3", OVTK_UNIT_Cubic_Metres_Per_Cubic_Centimetre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "vol %", OVTK_UNIT_Volume_Percent); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "pH", OVTK_UNIT_Ph); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "drop", OVTK_UNIT_Drop); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "rbc", OVTK_UNIT_Red_Blood_Cells); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "beat", OVTK_UNIT_Beat); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "breath", OVTK_UNIT_Breath); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "cell", OVTK_UNIT_Cell); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "cough", OVTK_UNIT_Cough); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "sigh", OVTK_UNIT_Sigh); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "%PCV", OVTK_UNIT_Percent_Of_Packed_Cell_Volume); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m", OVTK_UNIT_Metres); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "yd", OVTK_UNIT_Yard); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "ft", OVTK_UNIT_Foot); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "in", OVTK_UNIT_Inch); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "lm-2", OVTK_UNIT_Litres_Per_Square_Metre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m-1", OVTK_UNIT_Per_Metre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m2", OVTK_UNIT_Square_Metres); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "in2", OVTK_UNIT_Square_Inch); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m-2", OVTK_UNIT_Per_Square_Metre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m3", OVTK_UNIT_Cubic_Metres); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "l", OVTK_UNIT_Litres); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "l_breath-1", OVTK_UNIT_Litres_Per_Breath); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "l_beat-1", OVTK_UNIT_Litres_Per_Beat); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m-3", OVTK_UNIT_Per_Cubic_Metre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "l-1", OVTK_UNIT_Per_Litre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g", OVTK_UNIT_Gram); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "lb", OVTK_UNIT_Pound); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "oz", OVTK_UNIT_Ounce); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g-1", OVTK_UNIT_Per_Gram); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "gm", OVTK_UNIT_Gram_Metre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g m m-2", OVTK_UNIT_Grams_Meter_Per_Square_Metre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "kg m2", OVTK_UNIT_Gram_Metre_Squared); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "kg m-2", OVTK_UNIT_Kilograms_Per_Square_Metre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g m-3", OVTK_UNIT_Grams_Per_Cubic_Metre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g cm-3", OVTK_UNIT_Grams_Per_Cubic_Centimetre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g l-1", OVTK_UNIT_Grams_Per_Litre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g cl-3", OVTK_UNIT_Grams_Per_Centilitre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g dl-3", OVTK_UNIT_Grams_Per_Decilitre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g ml-3", OVTK_UNIT_Grams_Per_Millilitre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "s", OVTK_UNIT_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "min", OVTK_UNIT_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "h", OVTK_UNIT_Hour); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "d", OVTK_UNIT_Day); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "weeks", OVTK_UNIT_Weeks); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mth", OVTK_UNIT_Months); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "y", OVTK_UNIT_Year); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "TOD", OVTK_UNIT_Time_Of_Day_Hh_Mm_Ss); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "DATE", OVTK_UNIT_Date_Yyyy_Mm_Dd); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "s-1", OVTK_UNIT_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "Hz", OVTK_UNIT_Hertz); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "min-1", OVTK_UNIT_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "h-1", OVTK_UNIT_Per_Hour); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "d-1", OVTK_UNIT_Per_Day); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "week-1", OVTK_UNIT_Per_Week); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mth-1", OVTK_UNIT_Per_Month); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "y-1", OVTK_UNIT_Per_Year); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "bpm", OVTK_UNIT_Beat_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "puls min-1", OVTK_UNIT_Puls_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "resp min-1", OVTK_UNIT_Respirations_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m s-1", OVTK_UNIT_Metres_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "l min-1 m-2", OVTK_UNIT_Litres_Per_Minute_Per_Square_Meter); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m2 s-1", OVTK_UNIT_Square_Metres_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m3 s-1", OVTK_UNIT_Cubic_Metres_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m3 min-1", OVTK_UNIT_Cubic_Metres_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m3 h-1", OVTK_UNIT_Cubic_Metres_Per_Hour); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m3 d-1", OVTK_UNIT_Cubic_Metres_Per_Day); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "l s-1", OVTK_UNIT_Litres_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "l min-1", OVTK_UNIT_Litres_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "l h-1", OVTK_UNIT_Litres_Per_Hour); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "l d-1", OVTK_UNIT_Litres_Per_Day); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "l kg-1", OVTK_UNIT_Litres_Per_Kilogram); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m3 kg-1", OVTK_UNIT_Cubic_Metres_Per_Kilogram); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m Pa-1s-1", OVTK_UNIT_Meter_Per_Pascal_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "l min-1 mmHG-1", OVTK_UNIT_Litre_Per_Min_Per_Millimetre_Of_Mercury); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g s-1", OVTK_UNIT_Grams_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g m-1", OVTK_UNIT_Grams_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g h-1", OVTK_UNIT_Grams_Per_Hour); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g d-1", OVTK_UNIT_Grams_Per_Day); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g kg-1 s-1", OVTK_UNIT_Grams_Per_Kilogram_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g kg-1 m-1", OVTK_UNIT_Grams_Per_Kilogram_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g kg-1 h-1", OVTK_UNIT_Grams_Per_Kilogram_Per_Hour); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g kg-1 d-1", OVTK_UNIT_Grams_Per_Kilogram_Per_Day); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g l-1_s-1", OVTK_UNIT_Grams_Per_Litre_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g l-1 m-1", OVTK_UNIT_Grams_Per_Litre_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g l-1 h-1", OVTK_UNIT_Grams_Per_Litre_Per_Hour); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g l-1 d-1", OVTK_UNIT_Grams_Per_Litre_Per_Day); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g m-1 s-1", OVTK_UNIT_Grams_Per_Meter_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "gm s-1", OVTK_UNIT_Gram_Metres_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "Ns", OVTK_UNIT_Newton_Seconds); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "N", OVTK_UNIT_Newton); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "dyn", OVTK_UNIT_Dyne); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "Pa", OVTK_UNIT_Pascal); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mmHg", OVTK_UNIT_Millimetres_Of_Mercury); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "cm H2O", OVTK_UNIT_Centimetre_Of_Water); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "bar", OVTK_UNIT_Bar); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "J", OVTK_UNIT_Joules); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "eV", OVTK_UNIT_Electronvolts); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "W", OVTK_UNIT_Watts); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "Pa_s_m-3", OVTK_UNIT_Pascal_Second_Per_Cubic_Meter); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "Pa_s_l-1", OVTK_UNIT_Pascal_Second_Per_Litre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "dyne s cm-5", OVTK_UNIT_Dyne_Second_Per_Cm5); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "l cmH2O-1", OVTK_UNIT_Litre_Per_Centimetre_Of_Water); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "l mmHg-1", OVTK_UNIT_Litre_Per_Millimetre_Of_Mercury); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "l Pa-1", OVTK_UNIT_Litre_Per_Pascal); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "cmH2O l-1", OVTK_UNIT_Centimetre_Of_Water_Per_Litre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mmHg l-1", OVTK_UNIT_Millimetre_Of_Mercury_Per_Litre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "Pa l-1", OVTK_UNIT_Pascal_Per_Litre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "A", OVTK_UNIT_Amperes); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "C", OVTK_UNIT_Coulombs); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "Ah", OVTK_UNIT_Amperes_Hour); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "A m-1", OVTK_UNIT_Amperes_Per_Metre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "V", OVTK_UNIT_Volts); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "Ohm", OVTK_UNIT_Ohms); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "Wm", OVTK_UNIT_Ohm_Metres); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "F", OVTK_UNIT_Farads); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "K", OVTK_UNIT_Kelvin); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "degC", OVTK_UNIT_Degree_Celcius); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "degF", OVTK_UNIT_Degree_Fahrenheit); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "K W-1", OVTK_UNIT_Kelvins_Per_Watt); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "cd", OVTK_UNIT_Candelas); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "osmole", OVTK_UNIT_Osmoles); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mol", OVTK_UNIT_Moles); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "eq", OVTK_UNIT_Equivalent); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "osmol l-1", OVTK_UNIT_Osmoles_Per_Litre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mol cm-3", OVTK_UNIT_Moles_Per_Cubic_Centimetre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mol m-3", OVTK_UNIT_Moles_Per_Cubic_Metre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mol l-1", OVTK_UNIT_Moles_Per_Litre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mol ml-1", OVTK_UNIT_Moles_Per_Millilitre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "eq cm-3", OVTK_UNIT_Equivalents_Per_Cubic_Centimetre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "eq m-3", OVTK_UNIT_Equivalents_Per_Cubic_Metre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "eq l-1", OVTK_UNIT_Equivalents_Per_Litre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "eq ml-1", OVTK_UNIT_Equivalents_Per_Millilitre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "osmol kg-1", OVTK_UNIT_Osmoles_Per_Kilogram); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mol kg-1", OVTK_UNIT_Moles_Per_Kilogram); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mol s-1", OVTK_UNIT_Moles_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mol min-1", OVTK_UNIT_Moles_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mol h-1", OVTK_UNIT_Moles_Per_Hour); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mol d-1", OVTK_UNIT_Moles_Per_Day); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "eq s-1", OVTK_UNIT_Equivalents_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "eq min-1", OVTK_UNIT_Equivalents_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "eq h-1", OVTK_UNIT_Equivalents_Per_Hour); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "eq d-1", OVTK_UNIT_Equivalents_Per_Day); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mol kg-1 s-1", OVTK_UNIT_Moles_Per_Kilogram_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mol kg-1 min-1", OVTK_UNIT_Moles_Per_Kilogram_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mol kg-1 h-1", OVTK_UNIT_Moles_Per_Kilogram_Per_Hour); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mol kg-1 d-1", OVTK_UNIT_Moles_Per_Kilogram_Per_Day); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "eq kg-1 s-1", OVTK_UNIT_Equivalents_Per_Kilogram_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "eq kg-1 min-1", OVTK_UNIT_Equivalents_Per_Kilogram_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "eq kg-1 h-1", OVTK_UNIT_Equivalents_Per_Kilogram_Per_Hour); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "eq kg-1 d-1", OVTK_UNIT_Equivalents_Per_Kilogram_Per_Day); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "i.u.", OVTK_UNIT_International_Unit); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "i.u. cm-3", OVTK_UNIT_International_Units_Per_Cubic_Centimetre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "i.u. m-3", OVTK_UNIT_International_Units_Per_Cubic_Meter); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "i.u. l-1", OVTK_UNIT_International_Units_Per_Litre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "i.u. ml-1", OVTK_UNIT_International_Units_Per_Millilitre); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "i.u. s-1", OVTK_UNIT_International_Units_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "i.u. min-1", OVTK_UNIT_International_Units_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "i.u. h-1", OVTK_UNIT_International_Units_Per_Hour); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "i.u. d-1", OVTK_UNIT_International_Units_Per_Day); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "i.u. kg-1_s-1", OVTK_UNIT_International_Units_Per_Kilogram_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "i.u. kg-1_min-1", OVTK_UNIT_International_Units_Per_Kilogram_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "i.u. kg-1_h-1", OVTK_UNIT_International_Units_Per_Kilogram_Per_Hour); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "i.u. kg-1_d-1", OVTK_UNIT_International_Units_Per_Kilogram_Per_Day); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "cmH2O l-1s-1", OVTK_UNIT_Centimetre_Of_Water_Per_Litre_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "l2s-1", OVTK_UNIT_Litre_Squared_Per_Second); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "cmH2O %-1", OVTK_UNIT_Centimetre_Of_Water_Per_Percent); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "dyne s m-2 cm-5", + OVTK_UNIT_Dyne_Seconds_Per_Square_Meter_Per_Centimetre_To_The_Power_Of_5); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mmHg %-1", OVTK_UNIT_Millimetres_Of_Mercury_Per_Percent); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "Pa %-1", OVTK_UNIT_Pascal_Per_Percent); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "B", OVTK_UNIT_Relative_Power_Decibel); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m s-2", OVTK_UNIT_Meter_Per_Second_Squared); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "rad s2-2", OVTK_UNIT_Radians_Per_Second_Squared); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "ft min-1", OVTK_UNIT_Foot_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "in min-1", OVTK_UNIT_Inch_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "step min-1", OVTK_UNIT_Step_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "kcal", OVTK_UNIT_Kilocalories); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "rpm", OVTK_UNIT_Revolution_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "V s-1", OVTK_UNIT_V_Per_S); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "m m-1", OVTK_UNIT_M_Per_M); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "km/h", OVTK_UNIT_Velocity_Kilometer_Per_Hour); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g_s-2", OVTK_UNIT_Left_Stroke_Work_Index_Lswi); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "g_s-3", OVTK_UNIT_Indexed_Left_Cardiac_Work_Lcwi); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mHg_s-1", OVTK_UNIT_Mhg_Per_S); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "mol l-1 mm", OVTK_UNIT_Millimol_Per_Liter_X_Millimeter); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "r.p.m", OVTK_UNIT_Rotations_Per_Minute); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "dyne*s*m*m cm-5", OVTK_UNIT_Dyne_Seconds_Square_Meter_Per_Centimetre_To_The_Power_Of_5); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "l m-2", OVTK_UNIT_Litres_Per_Square_Meter); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "T", OVTK_UNIT_Tesla); + typeManager.registerEnumerationEntry(OV_TypeId_MeasurementUnit, "deg/s", OVTK_UNIT_Degree_Per_Second); + + // Register measurement factors + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e+24", OVTK_FACTOR_Yotta); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e+21", OVTK_FACTOR_Zetta); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e+18", OVTK_FACTOR_Exa); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e+15", OVTK_FACTOR_Peta); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e+12", OVTK_FACTOR_Tera); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e+09", OVTK_FACTOR_Giga); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e+06", OVTK_FACTOR_Mega); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e+03", OVTK_FACTOR_Kilo); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e+02", OVTK_FACTOR_Hecto); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e+01", OVTK_FACTOR_Deca); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e+00", OVTK_FACTOR_Base); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e-01", OVTK_FACTOR_Deci); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e-02", OVTK_FACTOR_Centi); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e-03", OVTK_FACTOR_Milli); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e-06", OVTK_FACTOR_Micro); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e-09", OVTK_FACTOR_Nano); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e-12", OVTK_FACTOR_Pico); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e-15", OVTK_FACTOR_Femto); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e-18", OVTK_FACTOR_Atto); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e-21", OVTK_FACTOR_Zepto); + typeManager.registerEnumerationEntry(OV_TypeId_Factor, "1e-24", OVTK_FACTOR_Yocto); + + typeManager.registerEnumerationType(OVTK_TypeId_ClassificationAlgorithm, "Classification algorithm"); + typeManager.registerEnumerationType(OVTK_TypeId_ClassificationStrategy, "Classification strategy"); + + return true; +} + +bool uninitialize(const Kernel::IKernelContext& ctx) { return true; } + +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/tools/ovtkMatrix.cpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/tools/ovtkMatrix.cpp new file mode 100644 index 0000000..5ddcf0e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/tools/ovtkMatrix.cpp @@ -0,0 +1,417 @@ +#include "ovtkMatrix.h" + +#include + +#include +#include +#include +#include + +// for save/load +#include +#include +#include +#include // std::isspace +#include + +namespace OpenViBE { +namespace Toolkit { +namespace Matrix { + +enum class EParsingStatus { Nothing, ParsingHeader, ParsingHeaderDimension, ParsingHeaderLabel, ParsingBuffer, ParsingBufferValue }; + +// tokens in the ascii matrix format +const char CONSTANT_LEFT_SQUARE_BRACKET = '['; +const char CONSTANT_RIGHT_SQUARE_BRACKET = ']'; +const char CONSTANT_HASHTAG = '#'; +const char CONSTANT_DOUBLE_QUOTE = '"'; +const char CONSTANT_TAB = '\t'; +const char CONSTANT_CARRIAGE_RETURN = '\r'; +const char CONSTANT_EOL = '\n'; +const char CONSTANT_SPACE = ' '; + +bool fromString(CMatrix& matrix, const CString& str) +{ + std::stringstream buffer; + + buffer << str.toASCIIString(); + + const std::locale locale("C"); + //current string to parse + std::string what; + //current parsing status + EParsingStatus status = EParsingStatus::Nothing; + //current element index (incremented every time a value is stored in matrix) + size_t curElementIdx = 0; + //current dimension index + size_t curDimIdx = size_t(-1); + //vector keeping track of dimension sizes + std::vector dimSize; + //vector keeping track of number of values found in each dimension + std::vector nValue; + // Dim labels + std::vector labels; + //current quote-delimited string + std::string curString; + + do + { + //read current line + std::getline(buffer, what, CONSTANT_EOL); + + //is line empty? + if (what.length() == 0) { continue; } //skip it + + //output line to be parsed in debug level + // getLogManager() << Kernel::LogLevel_Debug << what << "\n"; + + //remove ending carriage return (if any) for windows / linux compatibility + if (what[what.length() - 1] == CONSTANT_CARRIAGE_RETURN) { what.erase(what.length() - 1, 1); } + + //start parsing current line + auto it = what.begin(); + + //parse current line + while (it != what.end()) + { + switch (status) + { + //initial parsing status + case EParsingStatus::Nothing: + + //comments starting + if (*it == CONSTANT_HASHTAG) { it = what.end() - 1; } // ignore rest of line by skipping to last character + //header starting + else if (*it == CONSTANT_LEFT_SQUARE_BRACKET) { status = EParsingStatus::ParsingHeader; } // update status + else if (!std::isspace(*it, locale)) { return false; } + break; + + //parse header + case EParsingStatus::ParsingHeader: + + //comments starting + if (*it == CONSTANT_HASHTAG) { it = what.end() - 1; } //ignore rest of line by skipping to last character + //new dimension opened + else if (*it == CONSTANT_LEFT_SQUARE_BRACKET) + { + dimSize.resize(dimSize.size() + 1); //increment dimension count + curDimIdx++; //update current dimension index + status = EParsingStatus::ParsingHeaderDimension; //update status + } + //finished parsing header + else if (*it == CONSTANT_RIGHT_SQUARE_BRACKET) + { + if (dimSize.empty()) { return false; } //ensure at least one dimension was found + matrix.resize(dimSize); //resize matrix + nValue.resize(matrix.getDimensionCount()); + + // set labels now that we know the matrix size + size_t idx = 0; + for (size_t i = 0; i < matrix.getDimensionCount(); ++i) + { + for (size_t j = 0; j < matrix.getDimensionSize(i); ++j) { matrix.setDimensionLabel(i, j, labels[idx++].c_str()); } + } + + //reset current dimension index + curDimIdx = size_t(-1); + //update status + status = EParsingStatus::ParsingBuffer; + } + else if (!std::isspace(*it, locale)) { return false; } + break; + + case EParsingStatus::ParsingHeaderDimension: + + //comments starting + if (*it == CONSTANT_HASHTAG) { it = what.end() - 1; } //ignore rest of line by skipping to last character + //new label found + else if (*it == CONSTANT_DOUBLE_QUOTE) + { + //new element found in current dimension + dimSize[curDimIdx]++; + //update status + status = EParsingStatus::ParsingHeaderLabel; + } + //finished parsing current dimension header + else if (*it == CONSTANT_RIGHT_SQUARE_BRACKET) { status = EParsingStatus::ParsingHeader; } //update status + else if (!std::isspace(*it, locale)) { return false; } + break; + + //look for end of label (first '"' char not preceded by the '\' escape char) + case EParsingStatus::ParsingHeaderLabel: + + //found '"' char not preceded by escape char : end of label reached + if (*it == CONSTANT_DOUBLE_QUOTE && *(it - 1) != '\\') + { + // We can only attach the label later after we know the size + labels.push_back(curString); + + // std::cout << " lab " << curDimensionIdx << " " << dimSize[curDimensionIdx]-1 << " : " << curString << "\n"; + + //clear current string + curString.erase(); + + //update status + status = EParsingStatus::ParsingHeaderDimension; + } + //otherwise, keep parsing current label + else { curString.append(1, *it); } + break; + + case EParsingStatus::ParsingBuffer: + + //comments starting + if (*it == CONSTANT_HASHTAG) { it = what.end() - 1; } //ignore rest of line by skipping to last character + //going down one dimension + else if (*it == CONSTANT_LEFT_SQUARE_BRACKET) + { + //update dimension index + curDimIdx++; + //ensure dimension count remains in allocated range + if (curDimIdx == matrix.getDimensionCount()) { return false; } + //ensure values count remains in allocated range + if (nValue[curDimIdx] == matrix.getDimensionSize(curDimIdx)) { return false; } + //increment values count for current dimension, if it is not the innermost + if (curDimIdx < matrix.getDimensionCount() - 1) { nValue[curDimIdx]++; } + } + //going up one dimension + else if (*it == CONSTANT_RIGHT_SQUARE_BRACKET) + { + //if we are not in innermost dimension + if (curDimIdx < matrix.getDimensionCount() - 1) + { + //ensure the right number of values was parsed in lower dimension + if (nValue[curDimIdx + 1] != matrix.getDimensionSize(curDimIdx + 1)) { return false; } + //reset values count of lower dimension to 0 + nValue[curDimIdx + 1] = 0; + } + //ensure dimension count is correct + else if (curDimIdx == size_t(-1)) { return false; } + + //go up one dimension + curDimIdx--; + } + //non whitespace character found + else if (!std::isspace(*it, locale)) + { + //if we are in innermost dimension, assume a value is starting here + if (curDimIdx == matrix.getDimensionCount() - 1) + { + //ensure values parsed so far in current dimension doesn't exceed current dimension size + if (nValue.back() == matrix.getDimensionSize(curDimIdx)) { return false; } + + //increment values count found in innermost dimension + nValue[curDimIdx]++; + + //append current character to current string + curString.append(1, *it); + + //update status + status = EParsingStatus::ParsingBufferValue; + } + else { return false; } + } + break; + + //look for end of value (first '"' char not preceded by the '\' escape char) + case EParsingStatus::ParsingBufferValue: + + //values end at first whitespace character or ']' character + if (std::isspace(*it, locale) == true || *it == CONSTANT_RIGHT_SQUARE_BRACKET) + { + //if dimension closing bracket is found + if (*it == CONSTANT_RIGHT_SQUARE_BRACKET) + { + //move back iterator by one character so that closing bracket is taken into account in EParsingStatus::ParsingBuffer case + --it; + } + + //retrieve value + errno = 0; + char* end; + const double value = strtod(curString.c_str(), &end); +#if defined TARGET_OS_Windows + //string couldn't be converted to a double + if (errno == ERANGE) { return false; } +#endif + //store value in matrix + (matrix.getBuffer())[curElementIdx] = value; + //update element index + curElementIdx++; + //reset current string + curString.erase(); + //update status + status = EParsingStatus::ParsingBuffer; + } + //otherwise, append current character to current string + else { curString.append(1, *it); } + break; + } // switch(status) + + //increment iterator + ++it; + } // while(it != what.end()) (read each character of current line) + } while (buffer.good()); //read each line in turn + + //If the file is empty or other (like directory) + if (nValue.empty()) { return false; } + //ensure the right number of values were parsed in first dimension + if (nValue[0] != matrix.getDimensionSize(0)) { return false; } + + return true; +} + +// A recursive helper function to spool matrix contents to a txt stringstream. +bool dumpMatrixBuffer(const CMatrix& matrix, std::stringstream& buffer, const size_t index1, size_t& index2) +{ + //are we in innermost dimension? + if (index1 == matrix.getDimensionCount() - 1) + { + //dimension start + for (size_t j = 0; j < index1; ++j) { buffer << CONSTANT_TAB; } + buffer << CONSTANT_LEFT_SQUARE_BRACKET; + + //dump current cell contents + for (size_t j = 0; j < matrix.getDimensionSize(index1); j++, index2++) { buffer << CONSTANT_SPACE << matrix.getBuffer()[index2]; } + + //dimension end + buffer << CONSTANT_SPACE << CONSTANT_RIGHT_SQUARE_BRACKET << CONSTANT_EOL; + } + else + { + //dump all entries in current dimension + for (size_t i = 0; i < matrix.getDimensionSize(index1); ++i) + { + //dimension start + for (size_t j = 0; j < index1; ++j) { buffer << CONSTANT_TAB; } + buffer << CONSTANT_LEFT_SQUARE_BRACKET << CONSTANT_EOL; + + dumpMatrixBuffer(matrix, buffer, index1 + 1, index2); + + //dimension end + for (size_t j = 0; j < index1; ++j) { buffer << CONSTANT_TAB; } + buffer << CONSTANT_RIGHT_SQUARE_BRACKET << CONSTANT_EOL; + } + } + + return true; +} + +bool toString(const CMatrix& matrix, CString& str, const size_t precision /* = 6 */) +{ + std::stringstream buffer; + + buffer << std::scientific; + buffer.precision(std::streamsize(precision)); + + // Dump header + + //header start + buffer << CONSTANT_LEFT_SQUARE_BRACKET << CONSTANT_EOL; + + //dump labels for each dimension + for (size_t i = 0; i < matrix.getDimensionCount(); ++i) + { + buffer << CONSTANT_TAB << CONSTANT_LEFT_SQUARE_BRACKET; + + for (size_t j = 0; j < matrix.getDimensionSize(i); ++j) + { + buffer << CONSTANT_SPACE << CONSTANT_DOUBLE_QUOTE << matrix.getDimensionLabel(i, j) << CONSTANT_DOUBLE_QUOTE; + } + + buffer << CONSTANT_SPACE << CONSTANT_RIGHT_SQUARE_BRACKET << CONSTANT_EOL; + } + + //header end + buffer << CONSTANT_RIGHT_SQUARE_BRACKET << CONSTANT_EOL; + + // Dump buffer using a recursive algorithm + size_t idx = 0; + dumpMatrixBuffer(matrix, buffer, 0, idx); + + str = buffer.str().c_str(); + + return true; +} + +bool loadFromTextFile(CMatrix& matrix, const CString& filename) +{ + std::ifstream dataFile; + FS::Files::openIFStream(dataFile, filename.toASCIIString(), std::ios_base::in); + if (!dataFile.is_open()) { return false; } + + std::stringstream buffer; + + buffer << dataFile.rdbuf(); + + const bool res = fromString(matrix, CString(buffer.str().c_str())); + + dataFile.close(); + + return res; +} + +bool saveToTextFile(const CMatrix& matrix, const CString& filename, const size_t precision /* = 6 */) +{ + std::ofstream dataFile; + FS::Files::openOFStream(dataFile, filename.toASCIIString(), std::ios_base::out | std::ios_base::trunc); + if (!dataFile.is_open()) { return false; } + + CString str; + + if (!toString(matrix, str, precision)) { return false; } + + dataFile << str.toASCIIString(); + dataFile.close(); + + return true; +} + + +bool copy(CMatrix& dst, const CMatrix& src) +{ + if (&dst == &src) { return true; } + dst.copy(src); + return true; +} + +bool copyDescription(CMatrix& dst, const CMatrix& src) +{ + if (&dst == &src) { return true; } + dst.copyDescription(src); + return true; +} + +bool copyContent(CMatrix& dst, const CMatrix& src) +{ + if (&dst == &src) { return true; } + const size_t nElementIn = src.getBufferElementCount(); + const size_t nElementOut = dst.getBufferElementCount(); + if (nElementOut != nElementIn) { return false; } + dst.copyContent(src); + return true; +} + +bool clearContent(CMatrix& matrix) +{ + matrix.resetBuffer(); + return true; +} + +bool isDescriptionSimilar(const CMatrix& src1, const CMatrix& src2, const bool checkLabels) +{ + if (&src1 == &src2) { return true; } + return src1.isDescriptionEqual(src2, checkLabels); +} + +bool isContentSimilar(const CMatrix& src1, const CMatrix& src2) +{ + if (&src1 == &src2) { return true; } + return src1.isBufferEqual(src2); +} + +bool isContentValid(const CMatrix& src, const bool checkNotANumber, const bool checkInfinity) { return src.isBufferValid(checkNotANumber, checkInfinity); } + +} // namespace Matrix +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/tools/ovtkStimulationSet.cpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/tools/ovtkStimulationSet.cpp new file mode 100644 index 0000000..81bb66e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/tools/ovtkStimulationSet.cpp @@ -0,0 +1,56 @@ +#include "ovtkStimulationSet.h" + +namespace OpenViBE { +namespace Toolkit { +namespace StimulationSet { + +bool shift(IStimulationSet& stimSet, const uint64_t timeShift) +{ + const size_t count = stimSet.getStimulationCount(); + for (size_t i = 0; i < count; ++i) { stimSet.setStimulationDate(i, stimSet.getStimulationDate(i) + timeShift); } + return true; +} + +bool copy(IStimulationSet& dst, const IStimulationSet& src, const uint64_t timeShift) +{ + dst.clear(); + return append(dst, src, timeShift); +} + +bool append(IStimulationSet& dst, const IStimulationSet& src, const uint64_t timeShift) +{ + const size_t count = src.getStimulationCount(); + for (size_t i = 0; i < count; ++i) + { + dst.appendStimulation(src.getStimulationIdentifier(i), src.getStimulationDate(i) + timeShift, src.getStimulationDuration(i)); + } + return true; +} + +bool appendRange(IStimulationSet& dst, const IStimulationSet& src, const uint64_t srcStartTime, const uint64_t srcEndTime, const uint64_t timeShift) +{ + const size_t count = src.getStimulationCount(); + for (size_t i = 0; i < count; ++i) + { + const uint64_t date = src.getStimulationDate(i); + if (srcStartTime <= date && date < srcEndTime) + { + dst.appendStimulation(src.getStimulationIdentifier(i), src.getStimulationDate(i) + timeShift, src.getStimulationDuration(i)); + } + } + return true; +} + +bool removeRange(IStimulationSet& stimSet, const uint64_t startTime, const uint64_t endTime) +{ + for (size_t i = 0; i < stimSet.getStimulationCount(); ++i) + { + const uint64_t date = stimSet.getStimulationDate(i); + if (startTime <= date && date < endTime) { stimSet.removeStimulation(i--); } + } + return true; +} + +} // namespace StimulationSet +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/tools/ovtkString.cpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/tools/ovtkString.cpp new file mode 100644 index 0000000..44e71f6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/tools/ovtkString.cpp @@ -0,0 +1,92 @@ +#include "ovtkString.h" + +#include + +#include +#include +#include +#include + +#include + +namespace OpenViBE { +namespace Toolkit { +namespace String { + +static bool isSeparator(const uint8_t value, const uint8_t* separator, const size_t nSeparator) +{ + for (size_t i = 0; i < nSeparator; ++i) { if (value == separator[i]) { return true; } } + return false; +} + +// because std::tolower has multiple signatures, +// it can not be easily used in std::transform +// this workaround is taken from http://www.gcek.net/ref/books/sw/cpp/ticppv2/ +template +static T ToLower(T c) { return std::tolower(c); } + +size_t split(const CString& str, const ISplitCallback& splitCB, uint8_t separator) { return split(str, splitCB, &separator, 1); } + +size_t split(const CString& str, const ISplitCallback& splitCB, uint8_t* separator, const size_t nSeparator) +{ + if (nSeparator == 0 || separator == nullptr) { return 0; } + + size_t n = 0; + std::string tmp(str.toASCIIString()); + size_t i = 0; + while (i < tmp.length()) + { + size_t j = i; + while (j < tmp.length() && !isSeparator(tmp[j], separator, nSeparator)) { j++; } + //if(i!=j) + { + splitCB.setToken(std::string(tmp, i, j - i).c_str()); + n++; + } + i = j + 1; + } + if (tmp.length() != 0 && isSeparator(tmp[tmp.length() - 1], separator, nSeparator)) + { + splitCB.setToken(""); + n++; + } + + return n; +} + + +bool isAlmostEqual(const CString& str1, const CString& str2, const bool caseSensitive, const bool removeStartSpaces, const bool removeEndSpaces) +{ + const char* str1Start = str1.toASCIIString(); + const char* str1End = str1Start + strlen(str1Start) - 1; + + const char* str2Start = str2.toASCIIString(); + const char* str2End = str2Start + strlen(str2Start) - 1; + + if (removeStartSpaces) + { + while (*str1Start == ' ') { str1Start++; } + while (*str2Start == ' ') { str2Start++; } + } + + if (removeEndSpaces) + { + while (str1Start < str1End && *str1End == ' ') { str1End--; } + while (str2Start < str2End && *str2End == ' ') { str2End--; } + } + + std::string tmp1(str1Start, str1End - str1Start + 1); + std::string tmp2(str2Start, str2End - str2Start + 1); + + if (!caseSensitive) + { + std::transform(tmp1.begin(), tmp1.end(), tmp1.begin(), ToLower); + std::transform(tmp2.begin(), tmp2.end(), tmp2.begin(), ToLower); + } + + return tmp1 == tmp2; +} + +} // namespace String +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/training/ovtkCSignalTrial.cpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/training/ovtkCSignalTrial.cpp new file mode 100644 index 0000000..01bf3ea --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/training/ovtkCSignalTrial.cpp @@ -0,0 +1,88 @@ +#include "ovtkCSignalTrial.hpp" + +namespace OpenViBE { +namespace Toolkit { + +bool CSignalTrial::setSamplingRate(const size_t sampling) +{ + m_sampling = sampling; + return m_sampling != 0; +} + +bool CSignalTrial::setChannelCount(const size_t count) +{ + size_t i; + for (i = 0; i < count; ++i) { if (m_channelSamples.find(i) == m_channelSamples.end()) { m_channelSamples[i] = new double[m_nSampleReserved]; } } + for (i = count; i < m_nChannel; ++i) + { + delete [] m_channelSamples[i]; + m_channelSamples.erase(m_channelSamples.find(i)); + } + + m_nChannel = count; + m_nSample = 0; + m_channelNames.clear(); + return m_nChannel != 0; +} + +bool CSignalTrial::setChannelName(const size_t index, const char* name) +{ + if (index < m_nChannel) + { + m_channelNames[index] = name; + return true; + } + return false; +} + +bool CSignalTrial::setLabelIdentifier(const CIdentifier& labelID) +{ + m_labelID = labelID; + return true; +} + +bool CSignalTrial::setSampleCount(const size_t count, const bool preserve) +{ + const size_t nSampleRounding = 0x00000fff; + + if (count > m_nSampleReserved) + { + const size_t nSampleReserved = (count + nSampleRounding + 1) & (~nSampleRounding); + for (auto it = m_channelSamples.begin(); it != m_channelSamples.end(); ++it) + { + double* sample = new double[nSampleReserved]; + if (preserve) { memcpy(sample, it->second, (count < m_nSample ? count : m_nSample) * sizeof(double)); } + delete [] it->second; + it->second = sample; + } + m_nSampleReserved = nSampleReserved; + } + m_nSample = count; + return true; +} + +// ________________________________________________________________________________________________________________ +// + +const char* CSignalTrial::getChannelName(const size_t index) const +{ + const auto it = m_channelNames.find(index); + if (it != m_channelNames.end()) { return it->second.c_str(); } + return ""; +} + +double* CSignalTrial::getChannelSampleBuffer(const size_t index) const +{ + const auto it = m_channelSamples.find(index); + if (it != m_channelSamples.end()) { return it->second; } + return nullptr; +} + +// ________________________________________________________________________________________________________________ +// + +ISignalTrial* createSignalTrial() { return new CSignalTrial(); } +void releaseSignalTrial(ISignalTrial* trial) { delete trial; } + +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/training/ovtkCSignalTrial.hpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/training/ovtkCSignalTrial.hpp new file mode 100644 index 0000000..27f7a27 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/training/ovtkCSignalTrial.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include "ovtkISignalTrial.h" + +#include +#include + +namespace OpenViBE { +namespace Toolkit { +class CSignalTrial final : public ISignalTrial +{ +public: + + CSignalTrial() {} + ~CSignalTrial() override { for (auto& s : m_channelSamples) { delete [] s.second; } } + bool setSamplingRate(size_t sampling) override; + bool setChannelCount(size_t count) override; + bool setChannelName(size_t index, const char* name) override; + bool setLabelIdentifier(const CIdentifier& labelID) override; + bool setSampleCount(size_t count, bool preserve) override; + size_t getSamplingRate() const override { return m_sampling; } + size_t getChannelCount() const override { return m_nChannel; } + const char* getChannelName(const size_t index) const override; + CIdentifier getLabelIdentifier() const override { return m_labelID; } + size_t getSampleCount() const override { return m_nSample; } + uint64_t getDuration() const override { return (m_sampling ? CTime(m_sampling, m_nSample).time() : 0); } + double* getChannelSampleBuffer(size_t index) const override; + + _IsDerivedFromClass_Final_(ISignalTrial, OVTK_ClassId_) + +protected: + + std::map m_channelNames; + std::map m_channelSamples; + size_t m_nChannel = 0; + size_t m_nSample = 0; + size_t m_nSampleReserved = 0; + size_t m_sampling = 0; + CIdentifier m_labelID = CIdentifier::undefined(); +}; +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/training/ovtkCSignalTrialSet.cpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/training/ovtkCSignalTrialSet.cpp new file mode 100644 index 0000000..19da887 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/training/ovtkCSignalTrialSet.cpp @@ -0,0 +1,22 @@ +#include "ovtkCSignalTrialSet.hpp" + +namespace OpenViBE { +namespace Toolkit { + +bool CSignalTrialSet::addSignalTrial(ISignalTrial& rSignalTrial) +{ + m_signalTrials.push_back(&rSignalTrial); + return true; +} + +bool CSignalTrialSet::clear() +{ + m_signalTrials.clear(); + return true; +} + +ISignalTrialSet* createSignalTrialSet() { return new CSignalTrialSet(); } +void releaseSignalTrialSet(ISignalTrialSet* signalTrialSet) { delete signalTrialSet; } + +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/training/ovtkCSignalTrialSet.hpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/training/ovtkCSignalTrialSet.hpp new file mode 100644 index 0000000..c86c462 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/training/ovtkCSignalTrialSet.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include "ovtkISignalTrialSet.h" + +#include + +namespace OpenViBE { +namespace Toolkit { +class CSignalTrialSet final : public ISignalTrialSet +{ +public: + bool addSignalTrial(ISignalTrial& rSignalTrial) override; + bool clear() override; + size_t getSignalTrialCount() const override { return m_signalTrials.size(); } + ISignalTrial& getSignalTrial(const size_t index) const override { return *m_signalTrials[index]; } + + _IsDerivedFromClass_Final_(ISignalTrialSet, OVTK_ClassId_) + +protected: + + mutable std::vector m_signalTrials; +}; + +extern OVTK_API ISignalTrialSet* createSignalTrialSet(); +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/toolkit/src/training/ovtkISignalTrial.cpp b/Masterarbeit/openvibe/sdk-master/toolkit/src/training/ovtkISignalTrial.cpp new file mode 100644 index 0000000..d39d5ba --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/toolkit/src/training/ovtkISignalTrial.cpp @@ -0,0 +1,127 @@ +#include "ovtkISignalTrial.h" + +namespace OpenViBE { +namespace Toolkit { + +ISignalTrial& copyHeader(ISignalTrial& trial, const ISignalTrial* srcTrial) +{ + if (srcTrial == nullptr) { srcTrial = &trial; } + + if (srcTrial != &trial) + { + const size_t nChannel = srcTrial->getChannelCount(); + trial.setChannelCount(nChannel); + for (size_t i = 0; i < nChannel; ++i) { trial.setChannelName(i, srcTrial->getChannelName(i)); } + trial.setSamplingRate(srcTrial->getSamplingRate()); + } + + return trial; +} + +ISignalTrial& copy(ISignalTrial& trial, const ISignalTrial* srcTrial) +{ + if (srcTrial == nullptr) { srcTrial = &trial; } + + // copyHeader(trial, srcTrial); + + if (srcTrial != &trial) + { + const size_t nChannel = srcTrial->getChannelCount(); + const size_t nSample = srcTrial->getSampleCount(); + trial.setSampleCount(nSample, false); + for (size_t i = 0; i < nChannel; ++i) { memcpy(trial.getChannelSampleBuffer(i), srcTrial->getChannelSampleBuffer(i), nSample * sizeof(double)); } + } + + return trial; +} + +ISignalTrial& selectSamples(ISignalTrial& trial, const size_t sampleStart, const size_t sampleEnd, const ISignalTrial* srcTrial) +{ + if (srcTrial == nullptr) { srcTrial = &trial; } + if (srcTrial == &trial) { return trial; } // $$$ NOT YET IMPLEMENTED + + // copyHeader(trial, srcTrial); + + const size_t nChannel = srcTrial->getChannelCount(); + const size_t nSample = sampleEnd - sampleStart; + + trial.setSampleCount(nSample, false); + for (size_t i = 0; i < nChannel; ++i) + { + memcpy(trial.getChannelSampleBuffer(i), srcTrial->getChannelSampleBuffer(i) + sampleStart, nSample * sizeof(double)); + } + + return trial; +} + +ISignalTrial& selectTime(ISignalTrial& trial, const uint64_t timeStart, const uint64_t timeEnd, const ISignalTrial* srcTrial) +{ + if (srcTrial == nullptr) { srcTrial = &trial; } + if (srcTrial == &trial) { return trial; } // $$$ NOT YET IMPLEMENTED + + const size_t sampleStart = size_t((timeStart * srcTrial->getSamplingRate()) >> 32); + const size_t sampleEnd = size_t((timeEnd * srcTrial->getSamplingRate()) >> 32); + return selectSamples(trial, sampleStart, sampleEnd, srcTrial); +} + +ISignalTrial& removeSamples(ISignalTrial& trial, const size_t sampleStart, const size_t sampleEnd, const ISignalTrial* srcTrial) +{ + if (srcTrial == nullptr) { srcTrial = &trial; } + if (srcTrial == &trial) { return trial; } // $$$ NOT YET IMPLEMENTED + + // copyHeader(trial, srcTrial); + + const size_t srcNChannel = srcTrial->getChannelCount(); + const size_t srcNSample = srcTrial->getSampleCount() - (sampleEnd - sampleStart); + + trial.setSampleCount(srcNSample, false); + for (size_t i = 0; i < srcNChannel; ++i) + { + memcpy(trial.getChannelSampleBuffer(i), srcTrial->getChannelSampleBuffer(i), sampleStart * sizeof(double)); + memcpy(trial.getChannelSampleBuffer(i) + sampleStart, srcTrial->getChannelSampleBuffer(i) + sampleEnd, (srcNSample - sampleStart) * sizeof(double)); + } + + return trial; +} + +ISignalTrial& removeTime(ISignalTrial& trial, const uint64_t timeStart, const uint64_t timeEnd, const ISignalTrial* srcTrial) +{ + if (srcTrial == nullptr) { srcTrial = &trial; } + if (srcTrial == &trial) { return trial; } // $$$ NOT YET IMPLEMENTED + + const size_t sampleStart = size_t((timeStart * srcTrial->getSamplingRate()) >> 32); + const size_t sampleEnd = size_t((timeEnd * srcTrial->getSamplingRate()) >> 32); + return removeSamples(trial, sampleStart, sampleEnd, srcTrial); +} + +ISignalTrial& insertBufferSamples(ISignalTrial& trial, const size_t sampleStart, const size_t nSample, const double* buffer, const ISignalTrial* srcTrial) +{ + if (srcTrial == nullptr) { srcTrial = &trial; } + + // copyHeader(trial, srcTrial); + + const size_t srcNChannel = srcTrial->getChannelCount(); + const size_t srcNSample = srcTrial->getSampleCount(); + + trial.setSampleCount(srcNSample + nSample, true); + for (size_t i = 0; i < srcNChannel; ++i) + { + if (&trial != srcTrial) { memcpy(trial.getChannelSampleBuffer(i), srcTrial->getChannelSampleBuffer(i), sampleStart * sizeof(double)); } + + memcpy(trial.getChannelSampleBuffer(i) + sampleStart + nSample, srcTrial->getChannelSampleBuffer(i), (srcNSample - sampleStart) * sizeof(double)); + memcpy(trial.getChannelSampleBuffer(i) + sampleStart, buffer + nSample * i, nSample * sizeof(double)); + } + + return trial; +} + +ISignalTrial& insertBufferTime(ISignalTrial& trial, const uint64_t timeStart, const size_t nSample, const double* buffer, const ISignalTrial* srcTrial) +{ + if (srcTrial == nullptr) { srcTrial = &trial; } + + const size_t sampleStart = size_t((timeStart * srcTrial->getSamplingRate()) >> 32); + return insertBufferSamples(trial, sampleStart, nSample, buffer, srcTrial); +} + +} // namespace Toolkit +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/unit-test/CMakeLists.txt new file mode 100755 index 0000000..8b27b9c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/CMakeLists.txt @@ -0,0 +1,112 @@ +PROJECT(OpenViBESDKTest) + +# ------------------ +# Project variables +# ------------------ + +SET(OVT_GLOBAL_VERSION_MAJOR 0) +SET(OVT_GLOBAL_VERSION_MINOR 1) +SET(OVT_GLOBAL_VERSION_PATCH 0) +SET(OVT_GLOBAL_VERSION_STRING "${OVT_GLOBAL_VERSION_MAJOR}.${OVT_GLOBAL_VERSION_MINOR}.${OVT_GLOBAL_VERSION_PATCH}") + +IF(NOT DEFINED OVT_TEST_DATA_DIR) + MESSAGE(FATAL_ERROR "Path to tests input data files is not set") +ENDIF() + +# --------------------- +# Project dependencies +# --------------------- + +# Add some search directory to module path +SET(OVT_CMAKE_DIR ${OV_BASE_DIR}/cmake-modules) +SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${OVT_CMAKE_DIR}) + +# Modify library prefixes and suffixes to comply to Windows or Linux naming +IF(WIN32) + SET(CMAKE_FIND_LIBRARY_PREFIXES "") + SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".dll") +ELSEIF(APPLE) + SET(CMAKE_FIND_LIBRARY_PREFIXES "lib") + SET(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib" ".a") +ELSE() + SET(CMAKE_FIND_LIBRARY_PREFIXES "lib") + SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a") +ENDIF() + +SET(GTEST_ROOT ${OV_CUSTOM_DEPENDENCIES_PATH}/${CMAKE_FIND_LIBRARY_PREFIXES}gtest) +FIND_PACKAGE(GTest REQUIRED) +INCLUDE_DIRECTORIES(${GTEST_INCLUDE_DIRS}) + +# -------------------- +# Test configuration +# -------------------- + +# On Windows and Linux, some environment setting scripts are needed to ease the testing process +SET(OVT_SCRIPT_DIR ${OV_BASE_BIN_DIR}/scripts) +IF(WIN32) + # Wrapper script that set the environment and launch ctest + # It is located at build directory root to be as close as possible as standard ctest use + CONFIGURE_FILE(${OV_BASE_DIR}/scripts/windows-ctest-launcher.cmd-base + ${OV_BASE_BIN_DIR}/ctest-launcher.cmd) +ELSEIF(UNIX) + # Wrapper script that set the environment and launch ctest + # It is located at build directory root to be as close as possible as standard ctest use + CONFIGURE_FILE(${OV_BASE_DIR}/scripts/unix-ctest-launcher.sh-base + ${OV_BASE_BIN_DIR}/ctest-launcher.sh) + +ENDIF() + +# ${PROJECT_BINARY_DIR}/Testing/Temporary is automatically created by CTest for log files +# We create a temporary subdir for our test that will be create before each test is run +# and removed afterwards (see CTestCustom.cmake.in) +SET(OVT_TEST_TEMPORARY_DIR ${OV_BASE_BIN_DIR}/Testing/Temporary/OVT/) + +# Create test data directory for big or binary files +FILE(MAKE_DIRECTORY ${OVT_TEST_DATA_DIR}) + +# Ctest custom options +CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/CTestCustom.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/CTestCustom.cmake @ONLY) + +# Memcheck configuration +IF(UNIX) + FIND_PROGRAM(MEMORYCHECK_COMMAND valgrind /usr/bin/valgrind) + FILE(TO_CMAKE_PATH "${CMAKE_SOURCE_DIR}/data/resources/valgrind.supp" MEMORYCHECK_SUPPRESSIONS_FILE) + SET(MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full --run-libc-freeres=no --show-possibly-lost=no" ) +ELSEIF(WIN32) + FIND_PROGRAM(MEMORYCHECK_COMMAND purify "C:/Program Files (x86)/") +ENDIF() + +# Timeout must be set first +SET (DART_TESTING_TIMEOUT 72000 CACHE STRING "Maximum time allowed before CTest will kill the test." FORCE) +INCLUDE(CTest) +ENABLE_TESTING() + +# Utility variable for subproject +SET(OVT_OPENVIBE_DATA ${CMAKE_CURRENT_BINARY_DIR}/data/openvibe) + +# ---------------------- +# CMake tree processing +# ---------------------- + +# Process tools first. +# Some important variables are defined within tools projects for their use by other +# projects as: +# - OVT_UNIT_TOOLKIT_INCLUDE_DIR +# - OVT_UNIT_TOOLKIT_TARGET_FILE +# - OVT_ACCURACY_TARGET_FILE +ADD_SUBDIRECTORY(unit-toolkit) + +INCLUDE_DIRECTORIES(${OVT_UNIT_TOOLKIT_INCLUDE_DIR}) + +# Process unit tests +# When adding a new test driver, driver directory must be added here +ADD_SUBDIRECTORY(ov-base) +ADD_SUBDIRECTORY(openvibe-module-csv) +ADD_SUBDIRECTORY(openvibe-module-fs) +ADD_SUBDIRECTORY(openvibe-module-ebml) +ADD_SUBDIRECTORY(openvibe-module-xml) +ADD_SUBDIRECTORY(openvibe-module-socket) +ADD_SUBDIRECTORY(openvibe-module-system) +ADD_SUBDIRECTORY(openvibe-toolkit) +ADD_SUBDIRECTORY(openvibe-kernel) +ADD_SUBDIRECTORY(openvibe-plugin-stream-codecs) diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/CTestCustom.cmake.in b/Masterarbeit/openvibe/sdk-master/unit-test/CTestCustom.cmake.in new file mode 100755 index 0000000..34feca0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/CTestCustom.cmake.in @@ -0,0 +1,63 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +# Define following options here: + +# CTEST_CUSTOM_ERROR_MATCH Regular expression for errors during build process +# CTEST_CUSTOM_ERROR_EXCEPTION Regular expression for error exceptions during build process +# CTEST_CUSTOM_WARNING_MATCH Regular expression for warnings during build process +# CTEST_CUSTOM_WARNING_EXCEPTION Regular expression for warning exception during build process +# CTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS Maximum number of errors to display +# CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS Maximum number of warnings to display +# CTEST_CUSTOM_TESTS_IGNORE List of tests to ignore during the Test stage +# CTEST_CUSTOM_MEMCHECK_IGNORE List of tests to ignore during the MemCheck stage +# CTEST_CUSTOM_PRE_TEST Command to execute before any tests are run during Test stage +# CTEST_CUSTOM_POST_TEST Command to execute after any tests are run during Test stage +# CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE Maximum size of passed test output +# CTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE Maximum size of failed test output +# CTEST_CUSTOM_PRE_MEMCHECK Command to execute before any tests are run during MemCheck stage +# CTEST_CUSTOM_POST_MEMCHECK Command to execute after any tests are run during MemCheck stage +# CTEST_CUSTOM_COVERAGE_EXCLUDE Regular expression for excluding files from coverage testing +# CTEST_CUSTOM_COVERAGE_GLOB Report on uncovered files matching this expression + +# ----------------------------- +# CTest variable customization +# ----------------------------- + +SET(CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE 100000) + +# Warning exception are used to remove warning +# linked with ctest generated files (test runner cpp files) +SET(CTEST_CUSTOM_WARNING_EXCEPTION + ${CTEST_CUSTOM_WARNING_EXCEPTION} + "warning C4996" + ) + + # Create unit test temporary dir +SET(CTEST_CUSTOM_PRE_TEST "@CMAKE_COMMAND@ -E make_directory @OVT_TEST_TEMPORARY_DIR@") + + # Remove unit test temporary dir +SET(CTEST_CUSTOM_POST_TEST "@CMAKE_COMMAND@ -E remove_directory @OVT_TEST_TEMPORARY_DIR@") + + + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/common/ovtKernelContext.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/common/ovtKernelContext.cpp new file mode 100755 index 0000000..4af84d8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/common/ovtKernelContext.cpp @@ -0,0 +1,90 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include + +#include "ovtKernelContext.h" + +namespace OpenViBE { +namespace Test { +bool ctx::initialize() +{ +#if defined TARGET_OS_Windows + const CString kernelFile = Directories::getLibDir() + "/openvibe-kernel.dll"; +#elif defined TARGET_OS_Linux + const CString kernelFile = Directories::getLibDir() + "/libopenvibe-kernel.so"; +#elif defined TARGET_OS_MacOS + const CString kernelFile = Directories::getLibDir() + "/libopenvibe-kernel.dylib"; +#endif + CString error; + + if (!m_KernelLoader.load(kernelFile, &error)) + { + std::cerr << "ERROR: impossible to load kernel from file located at: " << kernelFile << std::endl; + std::cerr << "ERROR: kernel error: " << error << std::endl; + return false; + } + + m_KernelLoader.initialize(); + + Kernel::IKernelDesc* kernelDesc{ nullptr }; + m_KernelLoader.getKernelDesc(kernelDesc); + + if (!kernelDesc) + { + std::cerr << "ERROR: impossible to retrieve kernel descriptor " << std::endl; + return false; + } + + const CString configFile = CString(Directories::getDataDir() + "/kernel/openvibe.conf"); + + Kernel::IKernelContext* ctx = kernelDesc->createKernel("test-kernel", configFile); + + if (!ctx) + { + std::cerr << "ERROR: impossible to create kernel context " << std::endl; + return false; + } + + ctx->initialize(); + + m_Context = ctx; + + return true; +} + +bool ctx::uninitialize() +{ + if (m_Context) + { + Kernel::IKernelDesc* kernelDesc{ nullptr }; + m_KernelLoader.getKernelDesc(kernelDesc); + kernelDesc->releaseKernel(m_Context); + m_Context = nullptr; + } + + m_KernelLoader.uninitialize(); + m_KernelLoader.unload(); + + return true; +} +} // namespace Test +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/common/ovtKernelContext.h b/Masterarbeit/openvibe/sdk-master/unit-test/common/ovtKernelContext.h new file mode 100755 index 0000000..0ee8ffb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/common/ovtKernelContext.h @@ -0,0 +1,48 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +#include + +#include + +namespace OpenViBE +{ + namespace Test + { + class ctx final + { + public: + ctx() = default; + ~ctx() = default; + + bool initialize(); + bool uninitialize(); + + Kernel::IKernelContext* operator->() { return m_Context; } + + private: + Kernel::IKernelContext* m_Context{nullptr}; + CKernelLoader m_KernelLoader; + }; + } // namespace Test +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/data/resources/valgrind.supp b/Masterarbeit/openvibe/sdk-master/unit-test/data/resources/valgrind.supp new file mode 100755 index 0000000..3aec8ea --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/data/resources/valgrind.supp @@ -0,0 +1,18 @@ +{ + + Memcheck:Leak + match-leak-kinds: definite + fun:malloc + obj:* + obj:* + obj:* + obj:* + fun:call_init.part.0 + fun:call_init + fun:_dl_init + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error +} \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-kernel/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-kernel/CMakeLists.txt new file mode 100755 index 0000000..1fdb9c9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-kernel/CMakeLists.txt @@ -0,0 +1,67 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +PROJECT(openvibe-kernel-test) + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ---------------------- +# Configure test target +# ---------------------- + +# Test that needs to called with parameters +SET(TEST_WITH_PARAM + urErrorManagerTest.cpp +) + +# Test that needs to called without parameters +SET(TEST_NO_PARAM +) + +# Create test sources list +# This macro auto-generate ${PROJECT_NAME}.cpp +# in the build tree. ${PROJECT_NAME}.cpp is +# the test driver called by ctest to run +# the different tests added to this target. +CREATE_TEST_SOURCELIST (Tests + ${PROJECT_NAME}.cpp + ${TEST_WITH_PARAM} + ${TEST_NO_PARAM} + ) + +ADD_EXECUTABLE(${PROJECT_NAME} ${Tests}) +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OVT_UNIT_TOOLKIT_LIB} ${GTEST_BOTH_LIBRARIES} ${OV_LIBS}) + +# Add test without parameter to driver +FOREACH(test ${TEST_NO_PARAM}) + GET_FILENAME_COMPONENT(TName ${test} NAME_WE) + ADD_TEST(NAME ${TName} COMMAND ${PROJECT_NAME} ${TName}) +ENDFOREACH() + +# Add test with parameter to driver +ADD_TEST(NAME urErrorManagerTest COMMAND ${PROJECT_NAME} urErrorManagerTest "${OVT_OPENVIBE_DATA}/kernel/openvibe.conf") diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-kernel/urErrorManagerTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-kernel/urErrorManagerTest.cpp new file mode 100755 index 0000000..444870e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-kernel/urErrorManagerTest.cpp @@ -0,0 +1,140 @@ +#include + +#include "gtest/gtest.h" + +#include "ovtAssert.h" +#include "ovtTestFixtureCommon.h" + +// DO NOT USE a global Test::ScopedTest variable here +// because it causes a bug due to plugins global descriptors beeing destroyed before the kernel context. +OpenViBE::Kernel::IKernelContext* context = nullptr; + +TEST(error_manager_test_case, test_init) +{ + // here we use assert because we want to fail directly + // in order to avoid a segfault + ASSERT_TRUE(context != nullptr); + + auto& errorManager = context->getErrorManager(); + + // check manager is correctly initialized + EXPECT_FALSE(errorManager.hasError()); + EXPECT_TRUE(errorManager.getLastError() == nullptr); + EXPECT_TRUE(std::string(errorManager.getLastErrorString()).empty()); + EXPECT_EQ(errorManager.getLastErrorType(), OpenViBE::Kernel::ErrorType::NoErrorFound); + + EXPECT_NO_THROW(errorManager.releaseErrors()); +} + +TEST(error_manager_test_case, test_push) +{ + // here we use assert because we want to fail directly + // in order to avoid a segfault + ASSERT_TRUE(context != nullptr); + + auto& errorManager = context->getErrorManager(); + + // push an error + errorManager.pushError(OpenViBE::Kernel::ErrorType::Overflow, "An integer overflow error occurred"); + + EXPECT_TRUE(errorManager.hasError()); + EXPECT_STREQ(errorManager.getLastErrorString(), "An integer overflow error occurred"); + EXPECT_EQ(errorManager.getLastErrorType(), OpenViBE::Kernel::ErrorType::Overflow); + + // test match error features returned direclty by manager match error features + auto error = errorManager.getLastError(); + + ASSERT_TRUE(error != nullptr); + EXPECT_STREQ(error->getErrorString(), "An integer overflow error occurred"); + EXPECT_EQ(error->getErrorType(), OpenViBE::Kernel::ErrorType::Overflow); + EXPECT_STREQ(error->getErrorLocation(), "NoLocationInfo:0"); + EXPECT_TRUE(error->getNestedError() == nullptr); + + // push another error + errorManager.pushErrorAtLocation(OpenViBE::Kernel::ErrorType::BadAlloc, "Memory allocation failed", "urErrorManagerTest.cpp", 64); + + // test top error has changed + EXPECT_STREQ(errorManager.getLastErrorString(), "Memory allocation failed"); + EXPECT_EQ(errorManager.getLastErrorType(), OpenViBE::Kernel::ErrorType::BadAlloc); + + error = errorManager.getLastError(); + ASSERT_TRUE(error != nullptr); + EXPECT_STREQ(error->getErrorString(), "Memory allocation failed"); + EXPECT_EQ(error->getErrorType(), OpenViBE::Kernel::ErrorType::BadAlloc); + EXPECT_STREQ(error->getErrorLocation(), "urErrorManagerTest.cpp:64"); + + auto nestedError = error->getNestedError(); + ASSERT_TRUE(nestedError != nullptr); + EXPECT_STREQ(nestedError->getErrorString(), "An integer overflow error occurred"); + EXPECT_EQ(nestedError->getErrorType(), OpenViBE::Kernel::ErrorType::Overflow); + EXPECT_STREQ(nestedError->getErrorLocation(), "NoLocationInfo:0"); + EXPECT_TRUE(nestedError->getNestedError() == nullptr); +} + +TEST(error_manager_test_case, test_release) +{ + // here we use assert because we want to fail directly + // in order to avoid a segfault + ASSERT_TRUE(context != nullptr); + + auto& errorManager = context->getErrorManager(); + errorManager.releaseErrors(); + + // check manager is correctly released + EXPECT_FALSE(errorManager.hasError()); + EXPECT_TRUE(errorManager.getLastError() == nullptr); + EXPECT_TRUE(std::string(errorManager.getLastErrorString()).empty()); + EXPECT_EQ(errorManager.getLastErrorType(), OpenViBE::Kernel::ErrorType::NoErrorFound); + + // add an error after release + errorManager.pushErrorAtLocation(OpenViBE::Kernel::ErrorType::ResourceNotFound, "File not found on system", "urErrorManagerTest.cpp", 93); + + EXPECT_TRUE(errorManager.hasError()); + EXPECT_STREQ(errorManager.getLastErrorString(), "File not found on system"); + EXPECT_EQ(errorManager.getLastErrorType(), OpenViBE::Kernel::ErrorType::ResourceNotFound); + + auto error = errorManager.getLastError(); + + ASSERT_TRUE(error != nullptr); + EXPECT_STREQ(error->getErrorString(), "File not found on system"); + EXPECT_EQ(error->getErrorType(), OpenViBE::Kernel::ErrorType::ResourceNotFound); + EXPECT_STREQ(error->getErrorLocation(), "urErrorManagerTest.cpp:93"); + EXPECT_TRUE(error->getNestedError() == nullptr); +} + +TEST(error_manager_test_case, test_stress_push) +{ + // here we use assert because we want to fail directly + // in order to avoid a segfault + ASSERT_TRUE(context != nullptr); + + auto& errorManager = context->getErrorManager(); + + errorManager.releaseErrors(); + const size_t expectedErrorCount = 10; + for (size_t i = 0; i < expectedErrorCount; ++i) { errorManager.pushError(OpenViBE::Kernel::ErrorType::Unknown, "Error"); } + + size_t errorCount = 0; + auto error = errorManager.getLastError(); + while (error) + { + errorCount++; + error = error->getNestedError(); + } + + EXPECT_EQ(errorCount, expectedErrorCount); +} + +int urErrorManagerTest(int argc, char* argv[]) +{ + OVT_ASSERT(argc >= 2, "Failure retrieve test parameters"); + + OpenViBE::Test::ScopedTest fixture; + fixture->setConfigFile(argv[1]); + + context = fixture->context; + + testing::InitGoogleTest(&argc, argv); + ::testing::GTEST_FLAG(filter) = "error_manager_test_case.*"; + return RUN_ALL_TESTS(); +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/CMakeLists.txt new file mode 100755 index 0000000..b2e6968 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/CMakeLists.txt @@ -0,0 +1,74 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +PROJECT(openvibe-module-csv-test) + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ---------------------- +# Configure test target +# ---------------------- + +# Test that needs to called with parameters +SET(TEST_WITH_PARAM + uoCSVWriterTest.cpp + uoCSVReaderTest.cpp +) + +# Test that needs to called without parameters +SET(TEST_NO_PARAM +) + +# Create test sources list +# This macro auto-generate ${PROJECT_NAME}.cpp +# in the build tree. ${PROJECT_NAME}.cpp is +# the test driver called by ctest to run +# the different tests added to this target. +CREATE_TEST_SOURCELIST (Tests + ${PROJECT_NAME}.cpp + ${TEST_WITH_PARAM} + ${TEST_NO_PARAM} + ) + +ADD_EXECUTABLE(${PROJECT_NAME} ${Tests}) + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBEModuleCSV") + +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) +# set(OV_MODULE_CSV "C:/gitdir/build/openvibe-sdk-debug/modules/csv/openvibe-module-csv") +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OVT_UNIT_TOOLKIT_LIB} ${GTEST_BOTH_LIBRARIES} ${OV_LIBS} ${OV_MODULE_CSV}) + +# Add test without parameter to driver +FOREACH(test ${TEST_NO_PARAM}) + GET_FILENAME_COMPONENT(TName ${test} NAME_WE) + ADD_TEST(NAME ${TName} COMMAND ${PROJECT_NAME} ${TName}) +ENDFOREACH() + +# Add test with parameter to driver +ADD_TEST(NAME uoCSVWriterTest COMMAND ${PROJECT_NAME} uoCSVWriterTest "${OVT_TEST_TEMPORARY_DIR}") +ADD_TEST(NAME uoCSVReaderTest COMMAND ${PROJECT_NAME} uoCSVReaderTest "${CMAKE_CURRENT_SOURCE_DIR}/data/") +#ADD_TEST(NAME uoCSVWriterTest COMMAND ${PROJECT_NAME} uoCSVWriter) +#ADD_TEST(NAME uoCSVReaderTest COMMAND ${PROJECT_NAME} uoCSVReader) diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/.gitattributes b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/.gitattributes new file mode 100755 index 0000000..0dde222 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/.gitattributes @@ -0,0 +1,2 @@ +testCSVSignalUNIXEndlines.csv eol=lf +testCSVSignalWindowsEndlines.csv eol=crlf diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVCovarMatrixReader01.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVCovarMatrixReader01.csv new file mode 100755 index 0000000..01c9b6b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVCovarMatrixReader01.csv @@ -0,0 +1,4 @@ +Time:2x2x5,End Time,X:X:Z1,X:X:Z2,X:X:Z3,X:X:Z4,X:X:Z5,X:Y:Z1,X:Y:Z2,X:Y:Z3,X:Y:Z4,X:Y:Z5,Y:X:Z1,Y:X:Z2,Y:X:Z3,Y:X:Z4,Y:X:Z5,Y:Y:Z1,Y:Y:Z2,Y:Y:Z3,Y:Y:Z4,Y:Y:Z5,Event Id,Event Date,Event Duration +0.0,1.0,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,,, +0.25,1.25,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,,, +0.5,1.5,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,,, diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVCovarMatrixTooManyLabels.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVCovarMatrixTooManyLabels.csv new file mode 100755 index 0000000..15876bf --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVCovarMatrixTooManyLabels.csv @@ -0,0 +1,11 @@ +Time:2x2x2,End Time,::,::,::,::,:::,::,::,::,Event Id,Event Date,Event Duration +0.00000,1.00000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +0.12500,1.12500,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +0.25000,1.25000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,32000:32010,0.25000:0.25000,0.0:0.0 +0.37500,1.37500,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +0.50000,1.50000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +0.62500,1.62500,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +0.75000,1.75000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,35000,0.80000,0.0 +0.87500,1.87500,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +1.00000,2.00000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +1.12500,2.00000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVCovarMatrixWriter01.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVCovarMatrixWriter01.csv new file mode 100755 index 0000000..a76f402 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVCovarMatrixWriter01.csv @@ -0,0 +1,51 @@ +Time:2x2x2,End Time,C1:C1:Matrix 1,C1:C1:Matrix 2,C1:C2:Matrix 1,C1:C2:Matrix 2,C2:C1:Matrix 1,C2:C1:Matrix 2,C2:C2:Matrix 1,C2:C2:Matrix 2,Event Id,Event Date,Event Duration +0.0000000000,1.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +1.0000000000,2.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +2.0000000000,3.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +3.0000000000,4.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +4.0000000000,5.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +5.0000000000,6.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +6.0000000000,7.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +7.0000000000,8.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +8.0000000000,9.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +9.0000000000,10.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +10.0000000000,11.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +11.0000000000,12.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +12.0000000000,13.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +13.0000000000,14.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +14.0000000000,15.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +15.0000000000,16.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +16.0000000000,17.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +17.0000000000,18.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +18.0000000000,19.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +19.0000000000,20.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +20.0000000000,21.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +21.0000000000,22.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +22.0000000000,23.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +23.0000000000,24.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +24.0000000000,25.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +25.0000000000,26.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +26.0000000000,27.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +27.0000000000,28.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +28.0000000000,29.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +29.0000000000,30.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +30.0000000000,31.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +31.0000000000,32.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +32.0000000000,33.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +33.0000000000,34.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +34.0000000000,35.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +35.0000000000,36.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +36.0000000000,37.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +37.0000000000,38.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +38.0000000000,39.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +39.0000000000,40.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +40.0000000000,41.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +41.0000000000,42.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +42.0000000000,43.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +43.0000000000,44.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +44.0000000000,45.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +45.0000000000,46.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +46.0000000000,47.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +47.0000000000,48.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +48.0000000000,49.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +49.0000000000,50.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVCovarMatrixWriter02.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVCovarMatrixWriter02.csv new file mode 100755 index 0000000..022328e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVCovarMatrixWriter02.csv @@ -0,0 +1,51 @@ +Time:2x2x2,End Time,::,::,::,::,::,::,::,::,Event Id,Event Date,Event Duration +0.0000000000,1.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +1.0000000000,2.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +2.0000000000,3.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +3.0000000000,4.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +4.0000000000,5.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +5.0000000000,6.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +6.0000000000,7.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +7.0000000000,8.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +8.0000000000,9.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +9.0000000000,10.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +10.0000000000,11.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +11.0000000000,12.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +12.0000000000,13.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +13.0000000000,14.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +14.0000000000,15.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +15.0000000000,16.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +16.0000000000,17.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +17.0000000000,18.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +18.0000000000,19.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +19.0000000000,20.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +20.0000000000,21.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +21.0000000000,22.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +22.0000000000,23.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +23.0000000000,24.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +24.0000000000,25.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +25.0000000000,26.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +26.0000000000,27.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +27.0000000000,28.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +28.0000000000,29.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +29.0000000000,30.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +30.0000000000,31.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +31.0000000000,32.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +32.0000000000,33.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +33.0000000000,34.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +34.0000000000,35.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +35.0000000000,36.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +36.0000000000,37.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +37.0000000000,38.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +38.0000000000,39.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +39.0000000000,40.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +40.0000000000,41.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +41.0000000000,42.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +42.0000000000,43.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +43.0000000000,44.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +44.0000000000,45.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +45.0000000000,46.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +46.0000000000,47.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +47.0000000000,48.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +48.0000000000,49.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +49.0000000000,50.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVCovarMatrixWriter04.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVCovarMatrixWriter04.csv new file mode 100755 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVCovarMatrixWrongHeader.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVCovarMatrixWrongHeader.csv new file mode 100755 index 0000000..f74fcbc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVCovarMatrixWrongHeader.csv @@ -0,0 +1,4 @@ +Time:2x3x5,End Time,X:X:Z1,X:X:Z2,X:X:Z3,X:X:Z4,X:X:Z5,X:Y:Z1,X:Y:Z2,X:Y:Z3,X:Y:Z4,X:Y:Z5,Y:X:Z1,Y:X:Z2,Y:X:Z3,Y:X:Z4,Y:X:Z5,Y:Y:Z1,Y:Y:Z2,Y:Y:Z3,Y:Y:Z4,Y:Y:Z5,Event Id,Event Date,Event Duration +0,1,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,,, +0.25,1.25,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,,, +0.5,1.5,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,,, diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVFeatureVectorWriter01.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVFeatureVectorWriter01.csv new file mode 100755 index 0000000..73b38dc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVFeatureVectorWriter01.csv @@ -0,0 +1,12 @@ +Time:3,End Time,F1,F2,F3,Event Id,Event Date,Event Duration +0.0000000000,1.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,,, +1.0000000000,2.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,,, +2.0000000000,3.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,,, +3.0000000000,4.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,,, +4.0000000000,5.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,,, +5.0000000000,6.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,,, +6.0000000000,7.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,35001,6.5000000000,1.0000000000 +7.0000000000,8.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,,, +8.0000000000,9.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,35001,8.5000000000,1.0000000000 +9.0000000000,10.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,,, +10.0000000000,11.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,35001,10.5000000000,1.0000000000 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVFeatureVectorWriter02.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVFeatureVectorWriter02.csv new file mode 100755 index 0000000..6628b5e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVFeatureVectorWriter02.csv @@ -0,0 +1 @@ +Time:3,End Time,,,,Event Id,Event Date,Event Duration diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVFeatureVectorWriter03.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVFeatureVectorWriter03.csv new file mode 100755 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixReader01.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixReader01.csv new file mode 100755 index 0000000..7d4548c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixReader01.csv @@ -0,0 +1,11 @@ +Time:2x2x2,End Time,::,::,::,::,::,::,::,::,Event Id,Event Date,Event Duration +0.00000,1.00000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +0.12500,1.12500,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +0.25000,1.25000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,32000:32010,0.25000:0.25000,0.0:0.0 +0.37500,1.37500,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +0.50000,1.50000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +0.62500,1.62500,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +0.75000,1.75000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,35000,0.80000,0.0 +0.87500,1.87500,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +1.00000,2.00000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +1.12500,2.00000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixTooManyLabels.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixTooManyLabels.csv new file mode 100755 index 0000000..15876bf --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixTooManyLabels.csv @@ -0,0 +1,11 @@ +Time:2x2x2,End Time,::,::,::,::,:::,::,::,::,Event Id,Event Date,Event Duration +0.00000,1.00000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +0.12500,1.12500,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +0.25000,1.25000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,32000:32010,0.25000:0.25000,0.0:0.0 +0.37500,1.37500,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +0.50000,1.50000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +0.62500,1.62500,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +0.75000,1.75000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,35000,0.80000,0.0 +0.87500,1.87500,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +1.00000,2.00000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, +1.12500,2.00000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,,, diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter01.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter01.csv new file mode 100755 index 0000000..eb044bd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter01.csv @@ -0,0 +1,12 @@ +Time:2x2x2,End Time,LA:1:X,LA:1:Y,LA:2:X,LA:2:Y,LB:1:X,LB:1:Y,LB:2:X,LB:2:Y,Event Id,Event Date,Event Duration +0.0000000000,1.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +1.0000000000,2.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +2.0000000000,3.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +3.0000000000,4.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +4.0000000000,5.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +5.0000000000,6.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +6.0000000000,7.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,35001,6.5000000000,1.0000000000 +7.0000000000,8.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +8.0000000000,9.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,35001,8.5000000000,1.0000000000 +9.0000000000,10.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +10.0000000000,11.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,35001,10.5000000000,1.0000000000 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter02.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter02.csv new file mode 100755 index 0000000..63b8923 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter02.csv @@ -0,0 +1,12 @@ +Time:2x2x2,End Time,::,::,::,::,::,::,::,::,Event Id,Event Date,Event Duration +0.0000000000,1.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +1.0000000000,2.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +2.0000000000,3.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +3.0000000000,4.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +4.0000000000,5.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +5.0000000000,6.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +6.0000000000,7.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,35001,6.5000000000,1.0000000000 +7.0000000000,8.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +8.0000000000,9.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,35001,8.5000000000,1.0000000000 +9.0000000000,10.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,,, +10.0000000000,11.0000000000,-20.2000000000,-15.1500000000,-10.1000000000,-5.0500000000,5.0500000000,10.1000000000,15.1500000000,20.2000000000,35001,10.5000000000,1.0000000000 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter03.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter03.csv new file mode 100755 index 0000000..daa2e30 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter03.csv @@ -0,0 +1,12 @@ +Time:1x4,End Time,L1:A,L1:B,L1:C,L1:D,Event Id,Event Date,Event Duration +0.0000000000,1.0000000000,-20.2000000000,-10.1000000000,10.1000000000,20.2000000000,,, +1.0000000000,2.0000000000,-20.2000000000,-10.1000000000,10.1000000000,20.2000000000,,, +2.0000000000,3.0000000000,-20.2000000000,-10.1000000000,10.1000000000,20.2000000000,,, +3.0000000000,4.0000000000,-20.2000000000,-10.1000000000,10.1000000000,20.2000000000,,, +4.0000000000,5.0000000000,-20.2000000000,-10.1000000000,10.1000000000,20.2000000000,,, +5.0000000000,6.0000000000,-20.2000000000,-10.1000000000,10.1000000000,20.2000000000,,, +6.0000000000,7.0000000000,-20.2000000000,-10.1000000000,10.1000000000,20.2000000000,35001,6.5000000000,1.0000000000 +7.0000000000,8.0000000000,-20.2000000000,-10.1000000000,10.1000000000,20.2000000000,,, +8.0000000000,9.0000000000,-20.2000000000,-10.1000000000,10.1000000000,20.2000000000,35001,8.5000000000,1.0000000000 +9.0000000000,10.0000000000,-20.2000000000,-10.1000000000,10.1000000000,20.2000000000,,, +10.0000000000,11.0000000000,-20.2000000000,-10.1000000000,10.1000000000,20.2000000000,35001,10.5000000000,1.0000000000 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter04.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter04.csv new file mode 100755 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter05.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter05.csv new file mode 100755 index 0000000..45b0400 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter05.csv @@ -0,0 +1,12 @@ +Time:6x8x2,End Time,L1:A1:X,L1:A1:Y,L1:B2:X,L1:B2:Y,L1:C3:X,L1:C3:Y,L1:D4:X,L1:D4:Y,L1:E5:X,L1:E5:Y,L1:F6:X,L1:F6:Y,L1:G7:X,L1:G7:Y,L1:H8:X,L1:H8:Y,L2:A1:X,L2:A1:Y,L2:B2:X,L2:B2:Y,L2:C3:X,L2:C3:Y,L2:D4:X,L2:D4:Y,L2:E5:X,L2:E5:Y,L2:F6:X,L2:F6:Y,L2:G7:X,L2:G7:Y,L2:H8:X,L2:H8:Y,L3:A1:X,L3:A1:Y,L3:B2:X,L3:B2:Y,L3:C3:X,L3:C3:Y,L3:D4:X,L3:D4:Y,L3:E5:X,L3:E5:Y,L3:F6:X,L3:F6:Y,L3:G7:X,L3:G7:Y,L3:H8:X,L3:H8:Y,L4:A1:X,L4:A1:Y,L4:B2:X,L4:B2:Y,L4:C3:X,L4:C3:Y,L4:D4:X,L4:D4:Y,L4:E5:X,L4:E5:Y,L4:F6:X,L4:F6:Y,L4:G7:X,L4:G7:Y,L4:H8:X,L4:H8:Y,L5:A1:X,L5:A1:Y,L5:B2:X,L5:B2:Y,L5:C3:X,L5:C3:Y,L5:D4:X,L5:D4:Y,L5:E5:X,L5:E5:Y,L5:F6:X,L5:F6:Y,L5:G7:X,L5:G7:Y,L5:H8:X,L5:H8:Y,L6:A1:X,L6:A1:Y,L6:B2:X,L6:B2:Y,L6:C3:X,L6:C3:Y,L6:D4:X,L6:D4:Y,L6:E5:X,L6:E5:Y,L6:F6:X,L6:F6:Y,L6:G7:X,L6:G7:Y,L6:H8:X,L6:H8:Y,Event Id,Event Date,Event Duration +0.0000000000,1.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,16.0000000000,17.0000000000,18.0000000000,19.0000000000,20.0000000000,21.0000000000,22.0000000000,23.0000000000,24.0000000000,25.0000000000,26.0000000000,27.0000000000,28.0000000000,29.0000000000,30.0000000000,31.0000000000,32.0000000000,33.0000000000,34.0000000000,35.0000000000,36.0000000000,37.0000000000,38.0000000000,39.0000000000,40.0000000000,41.0000000000,42.0000000000,43.0000000000,44.0000000000,45.0000000000,46.0000000000,47.0000000000,48.0000000000,49.0000000000,50.0000000000,51.0000000000,52.0000000000,53.0000000000,54.0000000000,55.0000000000,56.0000000000,57.0000000000,58.0000000000,59.0000000000,60.0000000000,61.0000000000,62.0000000000,63.0000000000,64.0000000000,65.0000000000,66.0000000000,67.0000000000,68.0000000000,69.0000000000,70.0000000000,71.0000000000,72.0000000000,73.0000000000,74.0000000000,75.0000000000,76.0000000000,77.0000000000,78.0000000000,79.0000000000,80.0000000000,81.0000000000,82.0000000000,83.0000000000,84.0000000000,85.0000000000,86.0000000000,87.0000000000,88.0000000000,89.0000000000,90.0000000000,91.0000000000,92.0000000000,93.0000000000,94.0000000000,95.0000000000,,, +1.0000000000,2.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,16.0000000000,17.0000000000,18.0000000000,19.0000000000,20.0000000000,21.0000000000,22.0000000000,23.0000000000,24.0000000000,25.0000000000,26.0000000000,27.0000000000,28.0000000000,29.0000000000,30.0000000000,31.0000000000,32.0000000000,33.0000000000,34.0000000000,35.0000000000,36.0000000000,37.0000000000,38.0000000000,39.0000000000,40.0000000000,41.0000000000,42.0000000000,43.0000000000,44.0000000000,45.0000000000,46.0000000000,47.0000000000,48.0000000000,49.0000000000,50.0000000000,51.0000000000,52.0000000000,53.0000000000,54.0000000000,55.0000000000,56.0000000000,57.0000000000,58.0000000000,59.0000000000,60.0000000000,61.0000000000,62.0000000000,63.0000000000,64.0000000000,65.0000000000,66.0000000000,67.0000000000,68.0000000000,69.0000000000,70.0000000000,71.0000000000,72.0000000000,73.0000000000,74.0000000000,75.0000000000,76.0000000000,77.0000000000,78.0000000000,79.0000000000,80.0000000000,81.0000000000,82.0000000000,83.0000000000,84.0000000000,85.0000000000,86.0000000000,87.0000000000,88.0000000000,89.0000000000,90.0000000000,91.0000000000,92.0000000000,93.0000000000,94.0000000000,95.0000000000,,, +2.0000000000,3.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,16.0000000000,17.0000000000,18.0000000000,19.0000000000,20.0000000000,21.0000000000,22.0000000000,23.0000000000,24.0000000000,25.0000000000,26.0000000000,27.0000000000,28.0000000000,29.0000000000,30.0000000000,31.0000000000,32.0000000000,33.0000000000,34.0000000000,35.0000000000,36.0000000000,37.0000000000,38.0000000000,39.0000000000,40.0000000000,41.0000000000,42.0000000000,43.0000000000,44.0000000000,45.0000000000,46.0000000000,47.0000000000,48.0000000000,49.0000000000,50.0000000000,51.0000000000,52.0000000000,53.0000000000,54.0000000000,55.0000000000,56.0000000000,57.0000000000,58.0000000000,59.0000000000,60.0000000000,61.0000000000,62.0000000000,63.0000000000,64.0000000000,65.0000000000,66.0000000000,67.0000000000,68.0000000000,69.0000000000,70.0000000000,71.0000000000,72.0000000000,73.0000000000,74.0000000000,75.0000000000,76.0000000000,77.0000000000,78.0000000000,79.0000000000,80.0000000000,81.0000000000,82.0000000000,83.0000000000,84.0000000000,85.0000000000,86.0000000000,87.0000000000,88.0000000000,89.0000000000,90.0000000000,91.0000000000,92.0000000000,93.0000000000,94.0000000000,95.0000000000,,, +3.0000000000,4.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,16.0000000000,17.0000000000,18.0000000000,19.0000000000,20.0000000000,21.0000000000,22.0000000000,23.0000000000,24.0000000000,25.0000000000,26.0000000000,27.0000000000,28.0000000000,29.0000000000,30.0000000000,31.0000000000,32.0000000000,33.0000000000,34.0000000000,35.0000000000,36.0000000000,37.0000000000,38.0000000000,39.0000000000,40.0000000000,41.0000000000,42.0000000000,43.0000000000,44.0000000000,45.0000000000,46.0000000000,47.0000000000,48.0000000000,49.0000000000,50.0000000000,51.0000000000,52.0000000000,53.0000000000,54.0000000000,55.0000000000,56.0000000000,57.0000000000,58.0000000000,59.0000000000,60.0000000000,61.0000000000,62.0000000000,63.0000000000,64.0000000000,65.0000000000,66.0000000000,67.0000000000,68.0000000000,69.0000000000,70.0000000000,71.0000000000,72.0000000000,73.0000000000,74.0000000000,75.0000000000,76.0000000000,77.0000000000,78.0000000000,79.0000000000,80.0000000000,81.0000000000,82.0000000000,83.0000000000,84.0000000000,85.0000000000,86.0000000000,87.0000000000,88.0000000000,89.0000000000,90.0000000000,91.0000000000,92.0000000000,93.0000000000,94.0000000000,95.0000000000,,, +4.0000000000,5.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,16.0000000000,17.0000000000,18.0000000000,19.0000000000,20.0000000000,21.0000000000,22.0000000000,23.0000000000,24.0000000000,25.0000000000,26.0000000000,27.0000000000,28.0000000000,29.0000000000,30.0000000000,31.0000000000,32.0000000000,33.0000000000,34.0000000000,35.0000000000,36.0000000000,37.0000000000,38.0000000000,39.0000000000,40.0000000000,41.0000000000,42.0000000000,43.0000000000,44.0000000000,45.0000000000,46.0000000000,47.0000000000,48.0000000000,49.0000000000,50.0000000000,51.0000000000,52.0000000000,53.0000000000,54.0000000000,55.0000000000,56.0000000000,57.0000000000,58.0000000000,59.0000000000,60.0000000000,61.0000000000,62.0000000000,63.0000000000,64.0000000000,65.0000000000,66.0000000000,67.0000000000,68.0000000000,69.0000000000,70.0000000000,71.0000000000,72.0000000000,73.0000000000,74.0000000000,75.0000000000,76.0000000000,77.0000000000,78.0000000000,79.0000000000,80.0000000000,81.0000000000,82.0000000000,83.0000000000,84.0000000000,85.0000000000,86.0000000000,87.0000000000,88.0000000000,89.0000000000,90.0000000000,91.0000000000,92.0000000000,93.0000000000,94.0000000000,95.0000000000,,, +5.0000000000,6.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,16.0000000000,17.0000000000,18.0000000000,19.0000000000,20.0000000000,21.0000000000,22.0000000000,23.0000000000,24.0000000000,25.0000000000,26.0000000000,27.0000000000,28.0000000000,29.0000000000,30.0000000000,31.0000000000,32.0000000000,33.0000000000,34.0000000000,35.0000000000,36.0000000000,37.0000000000,38.0000000000,39.0000000000,40.0000000000,41.0000000000,42.0000000000,43.0000000000,44.0000000000,45.0000000000,46.0000000000,47.0000000000,48.0000000000,49.0000000000,50.0000000000,51.0000000000,52.0000000000,53.0000000000,54.0000000000,55.0000000000,56.0000000000,57.0000000000,58.0000000000,59.0000000000,60.0000000000,61.0000000000,62.0000000000,63.0000000000,64.0000000000,65.0000000000,66.0000000000,67.0000000000,68.0000000000,69.0000000000,70.0000000000,71.0000000000,72.0000000000,73.0000000000,74.0000000000,75.0000000000,76.0000000000,77.0000000000,78.0000000000,79.0000000000,80.0000000000,81.0000000000,82.0000000000,83.0000000000,84.0000000000,85.0000000000,86.0000000000,87.0000000000,88.0000000000,89.0000000000,90.0000000000,91.0000000000,92.0000000000,93.0000000000,94.0000000000,95.0000000000,,, +6.0000000000,7.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,16.0000000000,17.0000000000,18.0000000000,19.0000000000,20.0000000000,21.0000000000,22.0000000000,23.0000000000,24.0000000000,25.0000000000,26.0000000000,27.0000000000,28.0000000000,29.0000000000,30.0000000000,31.0000000000,32.0000000000,33.0000000000,34.0000000000,35.0000000000,36.0000000000,37.0000000000,38.0000000000,39.0000000000,40.0000000000,41.0000000000,42.0000000000,43.0000000000,44.0000000000,45.0000000000,46.0000000000,47.0000000000,48.0000000000,49.0000000000,50.0000000000,51.0000000000,52.0000000000,53.0000000000,54.0000000000,55.0000000000,56.0000000000,57.0000000000,58.0000000000,59.0000000000,60.0000000000,61.0000000000,62.0000000000,63.0000000000,64.0000000000,65.0000000000,66.0000000000,67.0000000000,68.0000000000,69.0000000000,70.0000000000,71.0000000000,72.0000000000,73.0000000000,74.0000000000,75.0000000000,76.0000000000,77.0000000000,78.0000000000,79.0000000000,80.0000000000,81.0000000000,82.0000000000,83.0000000000,84.0000000000,85.0000000000,86.0000000000,87.0000000000,88.0000000000,89.0000000000,90.0000000000,91.0000000000,92.0000000000,93.0000000000,94.0000000000,95.0000000000,35001,6.5000000000,1.0000000000 +7.0000000000,8.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,16.0000000000,17.0000000000,18.0000000000,19.0000000000,20.0000000000,21.0000000000,22.0000000000,23.0000000000,24.0000000000,25.0000000000,26.0000000000,27.0000000000,28.0000000000,29.0000000000,30.0000000000,31.0000000000,32.0000000000,33.0000000000,34.0000000000,35.0000000000,36.0000000000,37.0000000000,38.0000000000,39.0000000000,40.0000000000,41.0000000000,42.0000000000,43.0000000000,44.0000000000,45.0000000000,46.0000000000,47.0000000000,48.0000000000,49.0000000000,50.0000000000,51.0000000000,52.0000000000,53.0000000000,54.0000000000,55.0000000000,56.0000000000,57.0000000000,58.0000000000,59.0000000000,60.0000000000,61.0000000000,62.0000000000,63.0000000000,64.0000000000,65.0000000000,66.0000000000,67.0000000000,68.0000000000,69.0000000000,70.0000000000,71.0000000000,72.0000000000,73.0000000000,74.0000000000,75.0000000000,76.0000000000,77.0000000000,78.0000000000,79.0000000000,80.0000000000,81.0000000000,82.0000000000,83.0000000000,84.0000000000,85.0000000000,86.0000000000,87.0000000000,88.0000000000,89.0000000000,90.0000000000,91.0000000000,92.0000000000,93.0000000000,94.0000000000,95.0000000000,,, +8.0000000000,9.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,16.0000000000,17.0000000000,18.0000000000,19.0000000000,20.0000000000,21.0000000000,22.0000000000,23.0000000000,24.0000000000,25.0000000000,26.0000000000,27.0000000000,28.0000000000,29.0000000000,30.0000000000,31.0000000000,32.0000000000,33.0000000000,34.0000000000,35.0000000000,36.0000000000,37.0000000000,38.0000000000,39.0000000000,40.0000000000,41.0000000000,42.0000000000,43.0000000000,44.0000000000,45.0000000000,46.0000000000,47.0000000000,48.0000000000,49.0000000000,50.0000000000,51.0000000000,52.0000000000,53.0000000000,54.0000000000,55.0000000000,56.0000000000,57.0000000000,58.0000000000,59.0000000000,60.0000000000,61.0000000000,62.0000000000,63.0000000000,64.0000000000,65.0000000000,66.0000000000,67.0000000000,68.0000000000,69.0000000000,70.0000000000,71.0000000000,72.0000000000,73.0000000000,74.0000000000,75.0000000000,76.0000000000,77.0000000000,78.0000000000,79.0000000000,80.0000000000,81.0000000000,82.0000000000,83.0000000000,84.0000000000,85.0000000000,86.0000000000,87.0000000000,88.0000000000,89.0000000000,90.0000000000,91.0000000000,92.0000000000,93.0000000000,94.0000000000,95.0000000000,35001,8.5000000000,1.0000000000 +9.0000000000,10.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,16.0000000000,17.0000000000,18.0000000000,19.0000000000,20.0000000000,21.0000000000,22.0000000000,23.0000000000,24.0000000000,25.0000000000,26.0000000000,27.0000000000,28.0000000000,29.0000000000,30.0000000000,31.0000000000,32.0000000000,33.0000000000,34.0000000000,35.0000000000,36.0000000000,37.0000000000,38.0000000000,39.0000000000,40.0000000000,41.0000000000,42.0000000000,43.0000000000,44.0000000000,45.0000000000,46.0000000000,47.0000000000,48.0000000000,49.0000000000,50.0000000000,51.0000000000,52.0000000000,53.0000000000,54.0000000000,55.0000000000,56.0000000000,57.0000000000,58.0000000000,59.0000000000,60.0000000000,61.0000000000,62.0000000000,63.0000000000,64.0000000000,65.0000000000,66.0000000000,67.0000000000,68.0000000000,69.0000000000,70.0000000000,71.0000000000,72.0000000000,73.0000000000,74.0000000000,75.0000000000,76.0000000000,77.0000000000,78.0000000000,79.0000000000,80.0000000000,81.0000000000,82.0000000000,83.0000000000,84.0000000000,85.0000000000,86.0000000000,87.0000000000,88.0000000000,89.0000000000,90.0000000000,91.0000000000,92.0000000000,93.0000000000,94.0000000000,95.0000000000,,, +10.0000000000,11.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,16.0000000000,17.0000000000,18.0000000000,19.0000000000,20.0000000000,21.0000000000,22.0000000000,23.0000000000,24.0000000000,25.0000000000,26.0000000000,27.0000000000,28.0000000000,29.0000000000,30.0000000000,31.0000000000,32.0000000000,33.0000000000,34.0000000000,35.0000000000,36.0000000000,37.0000000000,38.0000000000,39.0000000000,40.0000000000,41.0000000000,42.0000000000,43.0000000000,44.0000000000,45.0000000000,46.0000000000,47.0000000000,48.0000000000,49.0000000000,50.0000000000,51.0000000000,52.0000000000,53.0000000000,54.0000000000,55.0000000000,56.0000000000,57.0000000000,58.0000000000,59.0000000000,60.0000000000,61.0000000000,62.0000000000,63.0000000000,64.0000000000,65.0000000000,66.0000000000,67.0000000000,68.0000000000,69.0000000000,70.0000000000,71.0000000000,72.0000000000,73.0000000000,74.0000000000,75.0000000000,76.0000000000,77.0000000000,78.0000000000,79.0000000000,80.0000000000,81.0000000000,82.0000000000,83.0000000000,84.0000000000,85.0000000000,86.0000000000,87.0000000000,88.0000000000,89.0000000000,90.0000000000,91.0000000000,92.0000000000,93.0000000000,94.0000000000,95.0000000000,35001,10.5000000000,1.0000000000 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter06.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter06.csv new file mode 100755 index 0000000..e0a8004 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter06.csv @@ -0,0 +1,12 @@ +Time:4x1x4,End Time,L1:X:R1,L1:X:R2,L1:X:R3,L1:X:R4,L2:X:R1,L2:X:R2,L2:X:R3,L2:X:R4,L3:X:R1,L3:X:R2,L3:X:R3,L3:X:R4,L4:X:R1,L4:X:R2,L4:X:R3,L4:X:R4,Event Id,Event Date,Event Duration +0.0000000000,1.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,,, +1.0000000000,2.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,,, +2.0000000000,3.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,,, +3.0000000000,4.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,,, +4.0000000000,5.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,,, +5.0000000000,6.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,,, +6.0000000000,7.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,35001,6.5000000000,1.0000000000 +7.0000000000,8.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,,, +8.0000000000,9.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,35001,8.5000000000,1.0000000000 +9.0000000000,10.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,,, +10.0000000000,11.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,35001,10.5000000000,1.0000000000 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter07.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter07.csv new file mode 100755 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter08.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter08.csv new file mode 100755 index 0000000..a8ea051 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWriter08.csv @@ -0,0 +1,2 @@ +Time:2x2x2,End Time,LA:1:X,LA:1:Y,LA:2:X,LA:2:Y,LB:1:X,LB:1:Y,LB:2:X,LB:2:Y,Event Id,Event Date,Event Duration +49.0000000000,50.0000000000,49.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,,, diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWrongHeader.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWrongHeader.csv new file mode 100755 index 0000000..2fad20d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWrongHeader.csv @@ -0,0 +1 @@ +Time:2x2x2,End Time,::,::,::,::,:,::,::,::,Event Id,Event Date,Event Duration diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWrongStimulation.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWrongStimulation.csv new file mode 100755 index 0000000..d5352fd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVMatrixWrongStimulation.csv @@ -0,0 +1,2 @@ +Time:2x2x2,End Time,::,::,::,::,::,::,::,::,Event Id,Event Date,Event Duration +0.75000,1.75000,-20.20,-15.15,-10.10,-5.05,5.05,10.10,15.15,20.20,35000:32010,0.80000,0.0:0.0 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalEmptyFile.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalEmptyFile.csv new file mode 100755 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalReader01.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalReader01.csv new file mode 100755 index 0000000..7a0092b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalReader01.csv @@ -0,0 +1,14 @@ +Time:8Hz,Epoch,O1,O2,Pz,P1,P2,Event Id,Event Date,Event Duration +0.00000,0,-20.20,-10.10,0.0,10.10,20.20,,, +0.12500,0,-20.20,-10.10,0.0,10.10,20.20,,, +0.25000,0,-20.20,-10.10,0.0,10.10,20.20,32000:32010,0.25000:0.25000,0:0 +0.37500,0,-20.20,-10.10,0.0,10.10,20.20,,, +0.50000,1,-80.80,-40.40,0.0,40.40,80.80,,, +0.62500,1,-80.80,-40.40,0.0,40.40,80.80,,, +0.75000,1,-80.80,-40.40,0.0,40.40,80.80,35000,0.75250,0 +0.87500,1,-80.80,-40.40,0.0,40.40,80.80,,, +1.00000,2,-320.320,-160.160,0.0,160.160,320.320,,, +1.12500,2,-320.320,-160.160,0.0,160.160,320.320,,, +1.25000,2,-320.320,-160.160,0.0,160.160,320.320,,, +1.37500,2,-320.320,-160.160,0.0,160.160,320.320,,, + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalUNIXEndlines.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalUNIXEndlines.csv new file mode 100755 index 0000000..2160d30 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalUNIXEndlines.csv @@ -0,0 +1,161 @@ +Time:32Hz,Epoch,Time signal,Event Id,Event Date,Event Duration +0.0000000000,0,0.0000000000,,, +0.0312500000,0,0.0312500000,,, +0.0625000000,0,0.0625000000,,, +0.0937500000,0,0.0937500000,,, +0.1250000000,0,0.1250000000,,, +0.1562500000,0,0.1562500000,,, +0.1875000000,0,0.1875000000,,, +0.2187500000,0,0.2187500000,,, +0.2500000000,1,0.2500000000,,, +0.2812500000,1,0.2812500000,,, +0.3125000000,1,0.3125000000,,, +0.3437500000,1,0.3437500000,,, +0.3750000000,1,0.3750000000,,, +0.4062500000,1,0.4062500000,,, +0.4375000000,1,0.4375000000,,, +0.4687500000,1,0.4687500000,,, +0.5000000000,2,0.5000000000,,, +0.5312500000,2,0.5312500000,,, +0.5625000000,2,0.5625000000,,, +0.5937500000,2,0.5937500000,,, +0.6250000000,2,0.6250000000,,, +0.6562500000,2,0.6562500000,,, +0.6875000000,2,0.6875000000,,, +0.7187500000,2,0.7187500000,,, +0.7500000000,3,0.7500000000,,, +0.7812500000,3,0.7812500000,,, +0.8125000000,3,0.8125000000,,, +0.8437500000,3,0.8437500000,,, +0.8750000000,3,0.8750000000,,, +0.9062500000,3,0.9062500000,,, +0.9375000000,3,0.9375000000,,, +0.9687500000,3,0.9687500000,,, +1.0000000000,4,1.0000000000,33024,1.0000000000,0.0000000000 +1.0312500000,4,1.0312500000,,, +1.0625000000,4,1.0625000000,,, +1.0937500000,4,1.0937500000,,, +1.1250000000,4,1.1250000000,,, +1.1562500000,4,1.1562500000,,, +1.1875000000,4,1.1875000000,,, +1.2187500000,4,1.2187500000,,, +1.2500000000,5,1.2500000000,,, +1.2812500000,5,1.2812500000,,, +1.3125000000,5,1.3125000000,,, +1.3437500000,5,1.3437500000,,, +1.3750000000,5,1.3750000000,,, +1.4062500000,5,1.4062500000,,, +1.4375000000,5,1.4375000000,,, +1.4687500000,5,1.4687500000,,, +1.5000000000,6,1.5000000000,,, +1.5312500000,6,1.5312500000,,, +1.5625000000,6,1.5625000000,,, +1.5937500000,6,1.5937500000,,, +1.6250000000,6,1.6250000000,,, +1.6562500000,6,1.6562500000,,, +1.6875000000,6,1.6875000000,,, +1.7187500000,6,1.7187500000,,, +1.7500000000,7,1.7500000000,,, +1.7812500000,7,1.7812500000,,, +1.8125000000,7,1.8125000000,,, +1.8437500000,7,1.8437500000,,, +1.8750000000,7,1.8750000000,,, +1.9062500000,7,1.9062500000,,, +1.9375000000,7,1.9375000000,,, +1.9687500000,7,1.9687500000,,, +2.0000000000,8,2.0000000000,33024,2.0000000000,0.0000000000 +2.0312500000,8,2.0312500000,,, +2.0625000000,8,2.0625000000,,, +2.0937500000,8,2.0937500000,,, +2.1250000000,8,2.1250000000,,, +2.1562500000,8,2.1562500000,,, +2.1875000000,8,2.1875000000,,, +2.2187500000,8,2.2187500000,,, +2.2500000000,9,2.2500000000,,, +2.2812500000,9,2.2812500000,,, +2.3125000000,9,2.3125000000,,, +2.3437500000,9,2.3437500000,,, +2.3750000000,9,2.3750000000,,, +2.4062500000,9,2.4062500000,,, +2.4375000000,9,2.4375000000,,, +2.4687500000,9,2.4687500000,,, +2.5000000000,10,2.5000000000,,, +2.5312500000,10,2.5312500000,,, +2.5625000000,10,2.5625000000,,, +2.5937500000,10,2.5937500000,,, +2.6250000000,10,2.6250000000,,, +2.6562500000,10,2.6562500000,,, +2.6875000000,10,2.6875000000,,, +2.7187500000,10,2.7187500000,,, +2.7500000000,11,2.7500000000,,, +2.7812500000,11,2.7812500000,,, +2.8125000000,11,2.8125000000,,, +2.8437500000,11,2.8437500000,,, +2.8750000000,11,2.8750000000,,, +2.9062500000,11,2.9062500000,,, +2.9375000000,11,2.9375000000,,, +2.9687500000,11,2.9687500000,,, +3.0000000000,12,3.0000000000,33024,3.0000000000,0.0000000000 +3.0312500000,12,3.0312500000,,, +3.0625000000,12,3.0625000000,,, +3.0937500000,12,3.0937500000,,, +3.1250000000,12,3.1250000000,,, +3.1562500000,12,3.1562500000,,, +3.1875000000,12,3.1875000000,,, +3.2187500000,12,3.2187500000,,, +3.2500000000,13,3.2500000000,,, +3.2812500000,13,3.2812500000,,, +3.3125000000,13,3.3125000000,,, +3.3437500000,13,3.3437500000,,, +3.3750000000,13,3.3750000000,,, +3.4062500000,13,3.4062500000,,, +3.4375000000,13,3.4375000000,,, +3.4687500000,13,3.4687500000,,, +3.5000000000,14,3.5000000000,,, +3.5312500000,14,3.5312500000,,, +3.5625000000,14,3.5625000000,,, +3.5937500000,14,3.5937500000,,, +3.6250000000,14,3.6250000000,,, +3.6562500000,14,3.6562500000,,, +3.6875000000,14,3.6875000000,,, +3.7187500000,14,3.7187500000,,, +3.7500000000,15,3.7500000000,,, +3.7812500000,15,3.7812500000,,, +3.8125000000,15,3.8125000000,,, +3.8437500000,15,3.8437500000,,, +3.8750000000,15,3.8750000000,,, +3.9062500000,15,3.9062500000,,, +3.9375000000,15,3.9375000000,,, +3.9687500000,15,3.9687500000,,, +4.0000000000,16,4.0000000000,33024,4.0000000000,0.0000000000 +4.0312500000,16,4.0312500000,,, +4.0625000000,16,4.0625000000,,, +4.0937500000,16,4.0937500000,,, +4.1250000000,16,4.1250000000,,, +4.1562500000,16,4.1562500000,,, +4.1875000000,16,4.1875000000,,, +4.2187500000,16,4.2187500000,,, +4.2500000000,17,4.2500000000,,, +4.2812500000,17,4.2812500000,,, +4.3125000000,17,4.3125000000,,, +4.3437500000,17,4.3437500000,,, +4.3750000000,17,4.3750000000,,, +4.4062500000,17,4.4062500000,,, +4.4375000000,17,4.4375000000,,, +4.4687500000,17,4.4687500000,,, +4.5000000000,18,4.5000000000,,, +4.5312500000,18,4.5312500000,,, +4.5625000000,18,4.5625000000,,, +4.5937500000,18,4.5937500000,,, +4.6250000000,18,4.6250000000,,, +4.6562500000,18,4.6562500000,,, +4.6875000000,18,4.6875000000,,, +4.7187500000,18,4.7187500000,,, +4.7500000000,19,4.7500000000,,, +4.7812500000,19,4.7812500000,,, +4.8125000000,19,4.8125000000,,, +4.8437500000,19,4.8437500000,,, +4.8750000000,19,4.8750000000,,, +4.9062500000,19,4.9062500000,,, +4.9375000000,19,4.9375000000,,, +4.9687500000,19,4.9687500000,,, diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWindowsEndlines.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWindowsEndlines.csv new file mode 100755 index 0000000..2160d30 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWindowsEndlines.csv @@ -0,0 +1,161 @@ +Time:32Hz,Epoch,Time signal,Event Id,Event Date,Event Duration +0.0000000000,0,0.0000000000,,, +0.0312500000,0,0.0312500000,,, +0.0625000000,0,0.0625000000,,, +0.0937500000,0,0.0937500000,,, +0.1250000000,0,0.1250000000,,, +0.1562500000,0,0.1562500000,,, +0.1875000000,0,0.1875000000,,, +0.2187500000,0,0.2187500000,,, +0.2500000000,1,0.2500000000,,, +0.2812500000,1,0.2812500000,,, +0.3125000000,1,0.3125000000,,, +0.3437500000,1,0.3437500000,,, +0.3750000000,1,0.3750000000,,, +0.4062500000,1,0.4062500000,,, +0.4375000000,1,0.4375000000,,, +0.4687500000,1,0.4687500000,,, +0.5000000000,2,0.5000000000,,, +0.5312500000,2,0.5312500000,,, +0.5625000000,2,0.5625000000,,, +0.5937500000,2,0.5937500000,,, +0.6250000000,2,0.6250000000,,, +0.6562500000,2,0.6562500000,,, +0.6875000000,2,0.6875000000,,, +0.7187500000,2,0.7187500000,,, +0.7500000000,3,0.7500000000,,, +0.7812500000,3,0.7812500000,,, +0.8125000000,3,0.8125000000,,, +0.8437500000,3,0.8437500000,,, +0.8750000000,3,0.8750000000,,, +0.9062500000,3,0.9062500000,,, +0.9375000000,3,0.9375000000,,, +0.9687500000,3,0.9687500000,,, +1.0000000000,4,1.0000000000,33024,1.0000000000,0.0000000000 +1.0312500000,4,1.0312500000,,, +1.0625000000,4,1.0625000000,,, +1.0937500000,4,1.0937500000,,, +1.1250000000,4,1.1250000000,,, +1.1562500000,4,1.1562500000,,, +1.1875000000,4,1.1875000000,,, +1.2187500000,4,1.2187500000,,, +1.2500000000,5,1.2500000000,,, +1.2812500000,5,1.2812500000,,, +1.3125000000,5,1.3125000000,,, +1.3437500000,5,1.3437500000,,, +1.3750000000,5,1.3750000000,,, +1.4062500000,5,1.4062500000,,, +1.4375000000,5,1.4375000000,,, +1.4687500000,5,1.4687500000,,, +1.5000000000,6,1.5000000000,,, +1.5312500000,6,1.5312500000,,, +1.5625000000,6,1.5625000000,,, +1.5937500000,6,1.5937500000,,, +1.6250000000,6,1.6250000000,,, +1.6562500000,6,1.6562500000,,, +1.6875000000,6,1.6875000000,,, +1.7187500000,6,1.7187500000,,, +1.7500000000,7,1.7500000000,,, +1.7812500000,7,1.7812500000,,, +1.8125000000,7,1.8125000000,,, +1.8437500000,7,1.8437500000,,, +1.8750000000,7,1.8750000000,,, +1.9062500000,7,1.9062500000,,, +1.9375000000,7,1.9375000000,,, +1.9687500000,7,1.9687500000,,, +2.0000000000,8,2.0000000000,33024,2.0000000000,0.0000000000 +2.0312500000,8,2.0312500000,,, +2.0625000000,8,2.0625000000,,, +2.0937500000,8,2.0937500000,,, +2.1250000000,8,2.1250000000,,, +2.1562500000,8,2.1562500000,,, +2.1875000000,8,2.1875000000,,, +2.2187500000,8,2.2187500000,,, +2.2500000000,9,2.2500000000,,, +2.2812500000,9,2.2812500000,,, +2.3125000000,9,2.3125000000,,, +2.3437500000,9,2.3437500000,,, +2.3750000000,9,2.3750000000,,, +2.4062500000,9,2.4062500000,,, +2.4375000000,9,2.4375000000,,, +2.4687500000,9,2.4687500000,,, +2.5000000000,10,2.5000000000,,, +2.5312500000,10,2.5312500000,,, +2.5625000000,10,2.5625000000,,, +2.5937500000,10,2.5937500000,,, +2.6250000000,10,2.6250000000,,, +2.6562500000,10,2.6562500000,,, +2.6875000000,10,2.6875000000,,, +2.7187500000,10,2.7187500000,,, +2.7500000000,11,2.7500000000,,, +2.7812500000,11,2.7812500000,,, +2.8125000000,11,2.8125000000,,, +2.8437500000,11,2.8437500000,,, +2.8750000000,11,2.8750000000,,, +2.9062500000,11,2.9062500000,,, +2.9375000000,11,2.9375000000,,, +2.9687500000,11,2.9687500000,,, +3.0000000000,12,3.0000000000,33024,3.0000000000,0.0000000000 +3.0312500000,12,3.0312500000,,, +3.0625000000,12,3.0625000000,,, +3.0937500000,12,3.0937500000,,, +3.1250000000,12,3.1250000000,,, +3.1562500000,12,3.1562500000,,, +3.1875000000,12,3.1875000000,,, +3.2187500000,12,3.2187500000,,, +3.2500000000,13,3.2500000000,,, +3.2812500000,13,3.2812500000,,, +3.3125000000,13,3.3125000000,,, +3.3437500000,13,3.3437500000,,, +3.3750000000,13,3.3750000000,,, +3.4062500000,13,3.4062500000,,, +3.4375000000,13,3.4375000000,,, +3.4687500000,13,3.4687500000,,, +3.5000000000,14,3.5000000000,,, +3.5312500000,14,3.5312500000,,, +3.5625000000,14,3.5625000000,,, +3.5937500000,14,3.5937500000,,, +3.6250000000,14,3.6250000000,,, +3.6562500000,14,3.6562500000,,, +3.6875000000,14,3.6875000000,,, +3.7187500000,14,3.7187500000,,, +3.7500000000,15,3.7500000000,,, +3.7812500000,15,3.7812500000,,, +3.8125000000,15,3.8125000000,,, +3.8437500000,15,3.8437500000,,, +3.8750000000,15,3.8750000000,,, +3.9062500000,15,3.9062500000,,, +3.9375000000,15,3.9375000000,,, +3.9687500000,15,3.9687500000,,, +4.0000000000,16,4.0000000000,33024,4.0000000000,0.0000000000 +4.0312500000,16,4.0312500000,,, +4.0625000000,16,4.0625000000,,, +4.0937500000,16,4.0937500000,,, +4.1250000000,16,4.1250000000,,, +4.1562500000,16,4.1562500000,,, +4.1875000000,16,4.1875000000,,, +4.2187500000,16,4.2187500000,,, +4.2500000000,17,4.2500000000,,, +4.2812500000,17,4.2812500000,,, +4.3125000000,17,4.3125000000,,, +4.3437500000,17,4.3437500000,,, +4.3750000000,17,4.3750000000,,, +4.4062500000,17,4.4062500000,,, +4.4375000000,17,4.4375000000,,, +4.4687500000,17,4.4687500000,,, +4.5000000000,18,4.5000000000,,, +4.5312500000,18,4.5312500000,,, +4.5625000000,18,4.5625000000,,, +4.5937500000,18,4.5937500000,,, +4.6250000000,18,4.6250000000,,, +4.6562500000,18,4.6562500000,,, +4.6875000000,18,4.6875000000,,, +4.7187500000,18,4.7187500000,,, +4.7500000000,19,4.7500000000,,, +4.7812500000,19,4.7812500000,,, +4.8125000000,19,4.8125000000,,, +4.8437500000,19,4.8437500000,,, +4.8750000000,19,4.8750000000,,, +4.9062500000,19,4.9062500000,,, +4.9375000000,19,4.9375000000,,, +4.9687500000,19,4.9687500000,,, diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWriter01.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWriter01.csv new file mode 100755 index 0000000..fb116e3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWriter01.csv @@ -0,0 +1,8 @@ +Time:8Hz,Epoch,O1,O2,Pz,P1,P2,Event Id,Event Date,Event Duration +0.0000000000,0,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,,, +0.1250000000,0,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,,, +0.2500000000,0,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,35000,0.2500000000,0.0000000000 +0.3750000000,0,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,,, +0.5000000000,1,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,,, +0.6250000000,1,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,,, +0.7500000000,1,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,35000,0.7500000000,0.0000000000 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWriter02.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWriter02.csv new file mode 100755 index 0000000..3f2f1b7 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWriter02.csv @@ -0,0 +1,9 @@ +Time:8Hz,Epoch,O1,O2,Pz,P1,P2,Event Id,Event Date,Event Duration +0.0000000000,0,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,,, +0.1250000000,0,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,,, +0.2500000000,0,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,,, +0.3750000000,0,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,,, +0.5000000000,1,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,,, +0.6250000000,1,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,,, +0.7500000000,1,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,,, +0.8750000000,1,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,,, diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWriter05.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWriter05.csv new file mode 100755 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWriter06.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWriter06.csv new file mode 100755 index 0000000..d53d46a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWriter06.csv @@ -0,0 +1 @@ +Time:8Hz,Epoch,O1,O2,Pz,P1,P2,Event Id,Event Date,Event Duration diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWriter07.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWriter07.csv new file mode 100755 index 0000000..75d6c30 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWriter07.csv @@ -0,0 +1,801 @@ +Time:8Hz,Epoch,O1,O2,Pz,P1,P2,Event Id,Event Date,Event Duration +0.0000000000,0,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +0.1250000000,0,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +0.2500000000,0,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +0.3750000000,0,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +0.5000000000,1,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +0.6250000000,1,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +0.7500000000,1,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +0.8750000000,1,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +1.0000000000,2,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +1.1250000000,2,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +1.2500000000,2,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +1.3750000000,2,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +1.5000000000,3,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +1.6250000000,3,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +1.7500000000,3,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +1.8750000000,3,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +2.0000000000,4,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +2.1250000000,4,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +2.2500000000,4,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +2.3750000000,4,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +2.5000000000,5,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +2.6250000000,5,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +2.7500000000,5,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +2.8750000000,5,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +3.0000000000,6,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +3.1250000000,6,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +3.2500000000,6,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +3.3750000000,6,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +3.5000000000,7,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +3.6250000000,7,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +3.7500000000,7,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +3.8750000000,7,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +4.0000000000,8,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +4.1250000000,8,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +4.2500000000,8,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +4.3750000000,8,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +4.5000000000,9,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +4.6250000000,9,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +4.7500000000,9,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +4.8750000000,9,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +5.0000000000,10,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +5.1250000000,10,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +5.2500000000,10,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +5.3750000000,10,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +5.5000000000,11,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +5.6250000000,11,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +5.7500000000,11,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +5.8750000000,11,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +6.0000000000,12,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +6.1250000000,12,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +6.2500000000,12,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +6.3750000000,12,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +6.5000000000,13,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +6.6250000000,13,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +6.7500000000,13,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +6.8750000000,13,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +7.0000000000,14,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +7.1250000000,14,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +7.2500000000,14,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +7.3750000000,14,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +7.5000000000,15,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +7.6250000000,15,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +7.7500000000,15,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +7.8750000000,15,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +8.0000000000,16,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +8.1250000000,16,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +8.2500000000,16,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +8.3750000000,16,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +8.5000000000,17,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +8.6250000000,17,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +8.7500000000,17,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +8.8750000000,17,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +9.0000000000,18,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +9.1250000000,18,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +9.2500000000,18,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +9.3750000000,18,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +9.5000000000,19,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +9.6250000000,19,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +9.7500000000,19,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +9.8750000000,19,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +10.0000000000,20,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +10.1250000000,20,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +10.2500000000,20,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +10.3750000000,20,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +10.5000000000,21,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +10.6250000000,21,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +10.7500000000,21,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +10.8750000000,21,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +11.0000000000,22,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +11.1250000000,22,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +11.2500000000,22,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +11.3750000000,22,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +11.5000000000,23,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +11.6250000000,23,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +11.7500000000,23,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +11.8750000000,23,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +12.0000000000,24,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +12.1250000000,24,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +12.2500000000,24,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +12.3750000000,24,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +12.5000000000,25,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +12.6250000000,25,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +12.7500000000,25,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +12.8750000000,25,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +13.0000000000,26,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +13.1250000000,26,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +13.2500000000,26,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +13.3750000000,26,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +13.5000000000,27,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +13.6250000000,27,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +13.7500000000,27,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +13.8750000000,27,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +14.0000000000,28,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +14.1250000000,28,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +14.2500000000,28,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +14.3750000000,28,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +14.5000000000,29,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +14.6250000000,29,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +14.7500000000,29,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +14.8750000000,29,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +15.0000000000,30,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +15.1250000000,30,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +15.2500000000,30,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +15.3750000000,30,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +15.5000000000,31,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +15.6250000000,31,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +15.7500000000,31,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +15.8750000000,31,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +16.0000000000,32,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +16.1250000000,32,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +16.2500000000,32,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +16.3750000000,32,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +16.5000000000,33,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +16.6250000000,33,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +16.7500000000,33,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +16.8750000000,33,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +17.0000000000,34,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +17.1250000000,34,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +17.2500000000,34,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +17.3750000000,34,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +17.5000000000,35,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +17.6250000000,35,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +17.7500000000,35,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +17.8750000000,35,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +18.0000000000,36,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +18.1250000000,36,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +18.2500000000,36,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +18.3750000000,36,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +18.5000000000,37,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +18.6250000000,37,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +18.7500000000,37,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +18.8750000000,37,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +19.0000000000,38,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +19.1250000000,38,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +19.2500000000,38,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +19.3750000000,38,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +19.5000000000,39,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +19.6250000000,39,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +19.7500000000,39,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +19.8750000000,39,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +20.0000000000,40,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +20.1250000000,40,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +20.2500000000,40,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +20.3750000000,40,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +20.5000000000,41,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +20.6250000000,41,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +20.7500000000,41,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +20.8750000000,41,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +21.0000000000,42,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +21.1250000000,42,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +21.2500000000,42,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +21.3750000000,42,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +21.5000000000,43,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +21.6250000000,43,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +21.7500000000,43,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +21.8750000000,43,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +22.0000000000,44,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +22.1250000000,44,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +22.2500000000,44,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +22.3750000000,44,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +22.5000000000,45,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +22.6250000000,45,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +22.7500000000,45,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +22.8750000000,45,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +23.0000000000,46,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +23.1250000000,46,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +23.2500000000,46,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +23.3750000000,46,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +23.5000000000,47,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +23.6250000000,47,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +23.7500000000,47,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +23.8750000000,47,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +24.0000000000,48,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +24.1250000000,48,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +24.2500000000,48,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +24.3750000000,48,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +24.5000000000,49,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +24.6250000000,49,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +24.7500000000,49,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +24.8750000000,49,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +25.0000000000,50,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +25.1250000000,50,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +25.2500000000,50,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +25.3750000000,50,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +25.5000000000,51,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +25.6250000000,51,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +25.7500000000,51,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +25.8750000000,51,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +26.0000000000,52,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +26.1250000000,52,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +26.2500000000,52,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +26.3750000000,52,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +26.5000000000,53,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +26.6250000000,53,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +26.7500000000,53,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +26.8750000000,53,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +27.0000000000,54,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +27.1250000000,54,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +27.2500000000,54,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +27.3750000000,54,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +27.5000000000,55,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +27.6250000000,55,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +27.7500000000,55,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +27.8750000000,55,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +28.0000000000,56,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +28.1250000000,56,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +28.2500000000,56,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +28.3750000000,56,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +28.5000000000,57,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +28.6250000000,57,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +28.7500000000,57,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +28.8750000000,57,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +29.0000000000,58,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +29.1250000000,58,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +29.2500000000,58,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +29.3750000000,58,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +29.5000000000,59,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +29.6250000000,59,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +29.7500000000,59,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +29.8750000000,59,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +30.0000000000,60,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +30.1250000000,60,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +30.2500000000,60,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +30.3750000000,60,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +30.5000000000,61,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +30.6250000000,61,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +30.7500000000,61,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +30.8750000000,61,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +31.0000000000,62,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +31.1250000000,62,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +31.2500000000,62,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +31.3750000000,62,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +31.5000000000,63,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +31.6250000000,63,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +31.7500000000,63,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +31.8750000000,63,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +32.0000000000,64,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +32.1250000000,64,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +32.2500000000,64,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +32.3750000000,64,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +32.5000000000,65,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +32.6250000000,65,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +32.7500000000,65,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +32.8750000000,65,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +33.0000000000,66,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +33.1250000000,66,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +33.2500000000,66,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +33.3750000000,66,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +33.5000000000,67,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +33.6250000000,67,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +33.7500000000,67,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +33.8750000000,67,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +34.0000000000,68,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +34.1250000000,68,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +34.2500000000,68,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +34.3750000000,68,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +34.5000000000,69,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +34.6250000000,69,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +34.7500000000,69,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +34.8750000000,69,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +35.0000000000,70,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +35.1250000000,70,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +35.2500000000,70,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +35.3750000000,70,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +35.5000000000,71,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +35.6250000000,71,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +35.7500000000,71,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +35.8750000000,71,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +36.0000000000,72,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +36.1250000000,72,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +36.2500000000,72,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +36.3750000000,72,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +36.5000000000,73,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +36.6250000000,73,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +36.7500000000,73,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +36.8750000000,73,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +37.0000000000,74,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +37.1250000000,74,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +37.2500000000,74,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +37.3750000000,74,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +37.5000000000,75,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +37.6250000000,75,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +37.7500000000,75,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +37.8750000000,75,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +38.0000000000,76,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +38.1250000000,76,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +38.2500000000,76,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +38.3750000000,76,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +38.5000000000,77,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +38.6250000000,77,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +38.7500000000,77,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +38.8750000000,77,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +39.0000000000,78,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +39.1250000000,78,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +39.2500000000,78,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +39.3750000000,78,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +39.5000000000,79,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +39.6250000000,79,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +39.7500000000,79,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +39.8750000000,79,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +40.0000000000,80,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +40.1250000000,80,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +40.2500000000,80,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +40.3750000000,80,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +40.5000000000,81,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +40.6250000000,81,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +40.7500000000,81,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +40.8750000000,81,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +41.0000000000,82,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +41.1250000000,82,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +41.2500000000,82,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +41.3750000000,82,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +41.5000000000,83,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +41.6250000000,83,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +41.7500000000,83,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +41.8750000000,83,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +42.0000000000,84,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +42.1250000000,84,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +42.2500000000,84,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +42.3750000000,84,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +42.5000000000,85,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +42.6250000000,85,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +42.7500000000,85,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +42.8750000000,85,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +43.0000000000,86,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +43.1250000000,86,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +43.2500000000,86,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +43.3750000000,86,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +43.5000000000,87,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +43.6250000000,87,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +43.7500000000,87,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +43.8750000000,87,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +44.0000000000,88,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +44.1250000000,88,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +44.2500000000,88,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +44.3750000000,88,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +44.5000000000,89,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +44.6250000000,89,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +44.7500000000,89,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +44.8750000000,89,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +45.0000000000,90,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +45.1250000000,90,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +45.2500000000,90,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +45.3750000000,90,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +45.5000000000,91,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +45.6250000000,91,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +45.7500000000,91,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +45.8750000000,91,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +46.0000000000,92,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +46.1250000000,92,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +46.2500000000,92,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +46.3750000000,92,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +46.5000000000,93,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +46.6250000000,93,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +46.7500000000,93,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +46.8750000000,93,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +47.0000000000,94,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +47.1250000000,94,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +47.2500000000,94,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +47.3750000000,94,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +47.5000000000,95,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +47.6250000000,95,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +47.7500000000,95,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +47.8750000000,95,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +48.0000000000,96,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +48.1250000000,96,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +48.2500000000,96,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +48.3750000000,96,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +48.5000000000,97,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +48.6250000000,97,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +48.7500000000,97,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +48.8750000000,97,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +49.0000000000,98,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +49.1250000000,98,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +49.2500000000,98,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +49.3750000000,98,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +49.5000000000,99,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +49.6250000000,99,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +49.7500000000,99,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +49.8750000000,99,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +50.0000000000,100,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +50.1250000000,100,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +50.2500000000,100,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +50.3750000000,100,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +50.5000000000,101,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +50.6250000000,101,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +50.7500000000,101,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +50.8750000000,101,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +51.0000000000,102,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +51.1250000000,102,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +51.2500000000,102,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +51.3750000000,102,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +51.5000000000,103,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +51.6250000000,103,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +51.7500000000,103,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +51.8750000000,103,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +52.0000000000,104,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +52.1250000000,104,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +52.2500000000,104,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +52.3750000000,104,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +52.5000000000,105,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +52.6250000000,105,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +52.7500000000,105,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +52.8750000000,105,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +53.0000000000,106,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +53.1250000000,106,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +53.2500000000,106,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +53.3750000000,106,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +53.5000000000,107,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +53.6250000000,107,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +53.7500000000,107,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +53.8750000000,107,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +54.0000000000,108,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +54.1250000000,108,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +54.2500000000,108,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +54.3750000000,108,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +54.5000000000,109,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +54.6250000000,109,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +54.7500000000,109,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +54.8750000000,109,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +55.0000000000,110,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +55.1250000000,110,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +55.2500000000,110,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +55.3750000000,110,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +55.5000000000,111,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +55.6250000000,111,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +55.7500000000,111,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +55.8750000000,111,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +56.0000000000,112,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +56.1250000000,112,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +56.2500000000,112,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +56.3750000000,112,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +56.5000000000,113,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +56.6250000000,113,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +56.7500000000,113,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +56.8750000000,113,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +57.0000000000,114,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +57.1250000000,114,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +57.2500000000,114,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +57.3750000000,114,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +57.5000000000,115,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +57.6250000000,115,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +57.7500000000,115,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +57.8750000000,115,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +58.0000000000,116,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +58.1250000000,116,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +58.2500000000,116,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +58.3750000000,116,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +58.5000000000,117,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +58.6250000000,117,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +58.7500000000,117,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +58.8750000000,117,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +59.0000000000,118,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +59.1250000000,118,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +59.2500000000,118,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +59.3750000000,118,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +59.5000000000,119,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +59.6250000000,119,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +59.7500000000,119,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +59.8750000000,119,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +60.0000000000,120,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +60.1250000000,120,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +60.2500000000,120,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +60.3750000000,120,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +60.5000000000,121,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +60.6250000000,121,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +60.7500000000,121,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +60.8750000000,121,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +61.0000000000,122,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +61.1250000000,122,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +61.2500000000,122,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +61.3750000000,122,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +61.5000000000,123,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +61.6250000000,123,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +61.7500000000,123,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +61.8750000000,123,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +62.0000000000,124,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +62.1250000000,124,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +62.2500000000,124,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +62.3750000000,124,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +62.5000000000,125,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +62.6250000000,125,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +62.7500000000,125,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +62.8750000000,125,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +63.0000000000,126,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +63.1250000000,126,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +63.2500000000,126,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +63.3750000000,126,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +63.5000000000,127,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +63.6250000000,127,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +63.7500000000,127,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +63.8750000000,127,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +64.0000000000,128,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +64.1250000000,128,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +64.2500000000,128,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +64.3750000000,128,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +64.5000000000,129,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +64.6250000000,129,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +64.7500000000,129,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +64.8750000000,129,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +65.0000000000,130,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +65.1250000000,130,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +65.2500000000,130,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +65.3750000000,130,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +65.5000000000,131,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +65.6250000000,131,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +65.7500000000,131,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +65.8750000000,131,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +66.0000000000,132,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +66.1250000000,132,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +66.2500000000,132,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +66.3750000000,132,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +66.5000000000,133,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +66.6250000000,133,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +66.7500000000,133,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +66.8750000000,133,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +67.0000000000,134,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +67.1250000000,134,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +67.2500000000,134,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +67.3750000000,134,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +67.5000000000,135,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +67.6250000000,135,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +67.7500000000,135,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +67.8750000000,135,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +68.0000000000,136,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +68.1250000000,136,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +68.2500000000,136,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +68.3750000000,136,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +68.5000000000,137,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +68.6250000000,137,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +68.7500000000,137,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +68.8750000000,137,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +69.0000000000,138,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +69.1250000000,138,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +69.2500000000,138,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +69.3750000000,138,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +69.5000000000,139,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +69.6250000000,139,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +69.7500000000,139,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +69.8750000000,139,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +70.0000000000,140,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +70.1250000000,140,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +70.2500000000,140,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +70.3750000000,140,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +70.5000000000,141,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +70.6250000000,141,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +70.7500000000,141,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +70.8750000000,141,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +71.0000000000,142,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +71.1250000000,142,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +71.2500000000,142,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +71.3750000000,142,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +71.5000000000,143,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +71.6250000000,143,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +71.7500000000,143,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +71.8750000000,143,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +72.0000000000,144,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +72.1250000000,144,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +72.2500000000,144,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +72.3750000000,144,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +72.5000000000,145,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +72.6250000000,145,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +72.7500000000,145,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +72.8750000000,145,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +73.0000000000,146,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +73.1250000000,146,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +73.2500000000,146,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +73.3750000000,146,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +73.5000000000,147,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +73.6250000000,147,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +73.7500000000,147,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +73.8750000000,147,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +74.0000000000,148,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +74.1250000000,148,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +74.2500000000,148,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +74.3750000000,148,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +74.5000000000,149,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +74.6250000000,149,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +74.7500000000,149,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +74.8750000000,149,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +75.0000000000,150,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +75.1250000000,150,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +75.2500000000,150,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +75.3750000000,150,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +75.5000000000,151,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +75.6250000000,151,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +75.7500000000,151,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +75.8750000000,151,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +76.0000000000,152,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +76.1250000000,152,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +76.2500000000,152,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +76.3750000000,152,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +76.5000000000,153,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +76.6250000000,153,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +76.7500000000,153,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +76.8750000000,153,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +77.0000000000,154,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +77.1250000000,154,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +77.2500000000,154,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +77.3750000000,154,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +77.5000000000,155,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +77.6250000000,155,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +77.7500000000,155,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +77.8750000000,155,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +78.0000000000,156,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +78.1250000000,156,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +78.2500000000,156,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +78.3750000000,156,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +78.5000000000,157,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +78.6250000000,157,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +78.7500000000,157,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +78.8750000000,157,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +79.0000000000,158,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +79.1250000000,158,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +79.2500000000,158,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +79.3750000000,158,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +79.5000000000,159,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +79.6250000000,159,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +79.7500000000,159,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +79.8750000000,159,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +80.0000000000,160,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +80.1250000000,160,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +80.2500000000,160,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +80.3750000000,160,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +80.5000000000,161,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +80.6250000000,161,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +80.7500000000,161,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +80.8750000000,161,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +81.0000000000,162,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +81.1250000000,162,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +81.2500000000,162,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +81.3750000000,162,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +81.5000000000,163,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +81.6250000000,163,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +81.7500000000,163,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +81.8750000000,163,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +82.0000000000,164,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +82.1250000000,164,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +82.2500000000,164,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +82.3750000000,164,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +82.5000000000,165,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +82.6250000000,165,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +82.7500000000,165,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +82.8750000000,165,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +83.0000000000,166,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +83.1250000000,166,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +83.2500000000,166,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +83.3750000000,166,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +83.5000000000,167,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +83.6250000000,167,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +83.7500000000,167,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +83.8750000000,167,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +84.0000000000,168,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +84.1250000000,168,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +84.2500000000,168,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +84.3750000000,168,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +84.5000000000,169,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +84.6250000000,169,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +84.7500000000,169,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +84.8750000000,169,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +85.0000000000,170,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +85.1250000000,170,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +85.2500000000,170,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +85.3750000000,170,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +85.5000000000,171,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +85.6250000000,171,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +85.7500000000,171,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +85.8750000000,171,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +86.0000000000,172,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +86.1250000000,172,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +86.2500000000,172,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +86.3750000000,172,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +86.5000000000,173,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +86.6250000000,173,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +86.7500000000,173,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +86.8750000000,173,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +87.0000000000,174,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +87.1250000000,174,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +87.2500000000,174,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +87.3750000000,174,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +87.5000000000,175,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +87.6250000000,175,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +87.7500000000,175,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +87.8750000000,175,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +88.0000000000,176,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +88.1250000000,176,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +88.2500000000,176,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +88.3750000000,176,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +88.5000000000,177,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +88.6250000000,177,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +88.7500000000,177,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +88.8750000000,177,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +89.0000000000,178,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +89.1250000000,178,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +89.2500000000,178,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +89.3750000000,178,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +89.5000000000,179,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +89.6250000000,179,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +89.7500000000,179,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +89.8750000000,179,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +90.0000000000,180,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +90.1250000000,180,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +90.2500000000,180,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +90.3750000000,180,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +90.5000000000,181,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +90.6250000000,181,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +90.7500000000,181,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +90.8750000000,181,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +91.0000000000,182,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +91.1250000000,182,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +91.2500000000,182,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +91.3750000000,182,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +91.5000000000,183,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +91.6250000000,183,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +91.7500000000,183,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +91.8750000000,183,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +92.0000000000,184,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +92.1250000000,184,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +92.2500000000,184,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +92.3750000000,184,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +92.5000000000,185,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +92.6250000000,185,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +92.7500000000,185,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +92.8750000000,185,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +93.0000000000,186,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +93.1250000000,186,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +93.2500000000,186,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +93.3750000000,186,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +93.5000000000,187,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +93.6250000000,187,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +93.7500000000,187,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +93.8750000000,187,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +94.0000000000,188,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +94.1250000000,188,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +94.2500000000,188,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +94.3750000000,188,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +94.5000000000,189,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +94.6250000000,189,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +94.7500000000,189,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +94.8750000000,189,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +95.0000000000,190,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +95.1250000000,190,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +95.2500000000,190,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +95.3750000000,190,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +95.5000000000,191,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +95.6250000000,191,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +95.7500000000,191,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +95.8750000000,191,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +96.0000000000,192,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +96.1250000000,192,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +96.2500000000,192,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +96.3750000000,192,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +96.5000000000,193,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +96.6250000000,193,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +96.7500000000,193,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +96.8750000000,193,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +97.0000000000,194,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +97.1250000000,194,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +97.2500000000,194,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +97.3750000000,194,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +97.5000000000,195,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +97.6250000000,195,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +97.7500000000,195,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +97.8750000000,195,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +98.0000000000,196,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +98.1250000000,196,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +98.2500000000,196,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +98.3750000000,196,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +98.5000000000,197,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +98.6250000000,197,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +98.7500000000,197,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +98.8750000000,197,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +99.0000000000,198,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +99.1250000000,198,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +99.2500000000,198,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +99.3750000000,198,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +99.5000000000,199,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +99.6250000000,199,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +99.7500000000,199,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, +99.8750000000,199,-20.2000000000,-10.1000000000,0.0000000000,10.1000000000,20.2000000000,,, diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWriter08.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWriter08.csv new file mode 100755 index 0000000..ddd9033 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWriter08.csv @@ -0,0 +1,3 @@ +Time:8Hz,Epoch,O1,O2,Pz,P1,P2,Event Id,Event Date,Event Duration +1.0000000000,2,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,35000,1.0000000000,0.0000000000 +1.1250000000,2,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,,, diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWrongHeader.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWrongHeader.csv new file mode 100755 index 0000000..3b467cc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSignalWrongHeader.csv @@ -0,0 +1,11 @@ +Time:8Hz,O1,O2,Pz,P1,P2,Event Id,Event Date,Event Duration +0.00000,-20.20,-10.10,0.0,10.10,20.20,,, +0.12500,-20.20,-10.10,0.0,10.10,20.20,,, +0.25000,-20.20,-10.10,0.0,10.10,20.20,32000:32010,0.25000:1.00000,0:0 +0.37500,-20.20,-10.10,0.0,10.10,20.20,,, +0.50000,-20.20,-10.10,0.0,10.10,20.20,,, +0.62500,-20.20,-10.10,0.0,10.10,20.20,,, +0.75000,-20.20,-10.10,0.0,10.10,20.20,35000,0.75250,0 +0.87500,-20.20,-10.10,0.0,10.10,20.20,,, +1.00000,-20.20,-10.10,0.0,10.10,20.20,,, +1.12500,-20.20,-10.10,0.0,10.10,20.20,,, diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSpectrumReader01.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSpectrumReader01.csv new file mode 100755 index 0000000..0c323b6 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSpectrumReader01.csv @@ -0,0 +1,13 @@ +Time:2x64:128,End Time,O1:0,O1:1,O1:2,O1:3,O1:4,O1:5,O1:6,O1:7,O1:8,O1:9,O1:10,O1:11,O1:12,O1:13,O1:14,O1:15,O1:16,O1:17,O1:18,O1:19,O1:20,O1:21,O1:22,O1:23,O1:24,O1:25,O1:26,O1:27,O1:28,O1:29,O1:30,O1:31,O1:32,O1:33,O1:34,O1:35,O1:36,O1:37,O1:38,O1:39,O1:40,O1:41,O1:42,O1:43,O1:44,O1:45,O1:46,O1:47,O1:48,O1:49,O1:50,O1:51,O1:52,O1:53,O1:54,O1:55,O1:56,O1:57,O1:58,O1:59,O1:60,O1:61,O1:62,O1:63,O2:0,O2:1,O2:2,O2:3,O2:4,O2:5,O2:6,O2:7,O2:8,O2:9,O2:10,O2:11,O2:12,O2:13,O2:14,O2:15,O2:16,O2:17,O2:18,O2:19,O2:20,O2:21,O2:22,O2:23,O2:24,O2:25,O2:26,O2:27,O2:28,O2:29,O2:30,O2:31,O2:32,O2:33,O2:34,O2:35,O2:36,O2:37,O2:38,O2:39,O2:40,O2:41,O2:42,O2:43,O2:44,O2:45,O2:46,O2:47,O2:48,O2:49,O2:50,O2:51,O2:52,O2:53,O2:54,O2:55,O2:56,O2:57,O2:58,O2:59,O2:60,O2:61,O2:62,O2:63,Event Id,Event Date,Event Duration +0.00000,1.00000,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,,, +0.12500,1.12500,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,,, +0.25000,1.25000,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,,, +0.37500,1.37500,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,,, +0.50000,1.50000,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,,, +0.62500,1.62500,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,,, +0.75000,1.75000,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,,, +0.87500,1.87500,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,,, +1.00000,2.00000,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,,, +1.12500,2.12500,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,,, +1.25000,2.25000,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,,, +1.37500,2.37500,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,,, diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSpectrumWriter01.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSpectrumWriter01.csv new file mode 100755 index 0000000..e0500ef --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSpectrumWriter01.csv @@ -0,0 +1,3 @@ +Time:2x64:256,End Time,O1:0.000000,O1:1.000000,O1:2.000000,O1:3.000000,O1:4.000000,O1:5.000000,O1:6.000000,O1:7.000000,O1:8.000000,O1:9.000000,O1:10.000000,O1:11.000000,O1:12.000000,O1:13.000000,O1:14.000000,O1:15.000000,O1:16.000000,O1:17.000000,O1:18.000000,O1:19.000000,O1:20.000000,O1:21.000000,O1:22.000000,O1:23.000000,O1:24.000000,O1:25.000000,O1:26.000000,O1:27.000000,O1:28.000000,O1:29.000000,O1:30.000000,O1:31.000000,O1:32.000000,O1:33.000000,O1:34.000000,O1:35.000000,O1:36.000000,O1:37.000000,O1:38.000000,O1:39.000000,O1:40.000000,O1:41.000000,O1:42.000000,O1:43.000000,O1:44.000000,O1:45.000000,O1:46.000000,O1:47.000000,O1:48.000000,O1:49.000000,O1:50.000000,O1:51.000000,O1:52.000000,O1:53.000000,O1:54.000000,O1:55.000000,O1:56.000000,O1:57.000000,O1:58.000000,O1:59.000000,O1:60.000000,O1:61.000000,O1:62.000000,O1:63.000000,O2:0.000000,O2:1.000000,O2:2.000000,O2:3.000000,O2:4.000000,O2:5.000000,O2:6.000000,O2:7.000000,O2:8.000000,O2:9.000000,O2:10.000000,O2:11.000000,O2:12.000000,O2:13.000000,O2:14.000000,O2:15.000000,O2:16.000000,O2:17.000000,O2:18.000000,O2:19.000000,O2:20.000000,O2:21.000000,O2:22.000000,O2:23.000000,O2:24.000000,O2:25.000000,O2:26.000000,O2:27.000000,O2:28.000000,O2:29.000000,O2:30.000000,O2:31.000000,O2:32.000000,O2:33.000000,O2:34.000000,O2:35.000000,O2:36.000000,O2:37.000000,O2:38.000000,O2:39.000000,O2:40.000000,O2:41.000000,O2:42.000000,O2:43.000000,O2:44.000000,O2:45.000000,O2:46.000000,O2:47.000000,O2:48.000000,O2:49.000000,O2:50.000000,O2:51.000000,O2:52.000000,O2:53.000000,O2:54.000000,O2:55.000000,O2:56.000000,O2:57.000000,O2:58.000000,O2:59.000000,O2:60.000000,O2:61.000000,O2:62.000000,O2:63.000000,Event Id,Event Date,Event Duration +0.0000000000,1.0000000000,-64.0000000000,-63.0000000000,-62.0000000000,-61.0000000000,-60.0000000000,-59.0000000000,-58.0000000000,-57.0000000000,-56.0000000000,-55.0000000000,-54.0000000000,-53.0000000000,-52.0000000000,-51.0000000000,-50.0000000000,-49.0000000000,-48.0000000000,-47.0000000000,-46.0000000000,-45.0000000000,-44.0000000000,-43.0000000000,-42.0000000000,-41.0000000000,-40.0000000000,-39.0000000000,-38.0000000000,-37.0000000000,-36.0000000000,-35.0000000000,-34.0000000000,-33.0000000000,-32.0000000000,-31.0000000000,-30.0000000000,-29.0000000000,-28.0000000000,-27.0000000000,-26.0000000000,-25.0000000000,-24.0000000000,-23.0000000000,-22.0000000000,-21.0000000000,-20.0000000000,-19.0000000000,-18.0000000000,-17.0000000000,-16.0000000000,-15.0000000000,-14.0000000000,-13.0000000000,-12.0000000000,-11.0000000000,-10.0000000000,-9.0000000000,-8.0000000000,-7.0000000000,-6.0000000000,-5.0000000000,-4.0000000000,-3.0000000000,-2.0000000000,-1.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,16.0000000000,17.0000000000,18.0000000000,19.0000000000,20.0000000000,21.0000000000,22.0000000000,23.0000000000,24.0000000000,25.0000000000,26.0000000000,27.0000000000,28.0000000000,29.0000000000,30.0000000000,31.0000000000,32.0000000000,33.0000000000,34.0000000000,35.0000000000,36.0000000000,37.0000000000,38.0000000000,39.0000000000,40.0000000000,41.0000000000,42.0000000000,43.0000000000,44.0000000000,45.0000000000,46.0000000000,47.0000000000,48.0000000000,49.0000000000,50.0000000000,51.0000000000,52.0000000000,53.0000000000,54.0000000000,55.0000000000,56.0000000000,57.0000000000,58.0000000000,59.0000000000,60.0000000000,61.0000000000,62.0000000000,63.0000000000,35001:35001,0.5000000000:0.7500000000,1.0000000000:1.0000000000 +0.1250000000,1.1250000000,-64.0000000000,-63.0000000000,-62.0000000000,-61.0000000000,-60.0000000000,-59.0000000000,-58.0000000000,-57.0000000000,-56.0000000000,-55.0000000000,-54.0000000000,-53.0000000000,-52.0000000000,-51.0000000000,-50.0000000000,-49.0000000000,-48.0000000000,-47.0000000000,-46.0000000000,-45.0000000000,-44.0000000000,-43.0000000000,-42.0000000000,-41.0000000000,-40.0000000000,-39.0000000000,-38.0000000000,-37.0000000000,-36.0000000000,-35.0000000000,-34.0000000000,-33.0000000000,-32.0000000000,-31.0000000000,-30.0000000000,-29.0000000000,-28.0000000000,-27.0000000000,-26.0000000000,-25.0000000000,-24.0000000000,-23.0000000000,-22.0000000000,-21.0000000000,-20.0000000000,-19.0000000000,-18.0000000000,-17.0000000000,-16.0000000000,-15.0000000000,-14.0000000000,-13.0000000000,-12.0000000000,-11.0000000000,-10.0000000000,-9.0000000000,-8.0000000000,-7.0000000000,-6.0000000000,-5.0000000000,-4.0000000000,-3.0000000000,-2.0000000000,-1.0000000000,0.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,8.0000000000,9.0000000000,10.0000000000,11.0000000000,12.0000000000,13.0000000000,14.0000000000,15.0000000000,16.0000000000,17.0000000000,18.0000000000,19.0000000000,20.0000000000,21.0000000000,22.0000000000,23.0000000000,24.0000000000,25.0000000000,26.0000000000,27.0000000000,28.0000000000,29.0000000000,30.0000000000,31.0000000000,32.0000000000,33.0000000000,34.0000000000,35.0000000000,36.0000000000,37.0000000000,38.0000000000,39.0000000000,40.0000000000,41.0000000000,42.0000000000,43.0000000000,44.0000000000,45.0000000000,46.0000000000,47.0000000000,48.0000000000,49.0000000000,50.0000000000,51.0000000000,52.0000000000,53.0000000000,54.0000000000,55.0000000000,56.0000000000,57.0000000000,58.0000000000,59.0000000000,60.0000000000,61.0000000000,62.0000000000,63.0000000000,35001,1.0000000000,1.0000000000 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSpectrumWriter02.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSpectrumWriter02.csv new file mode 100755 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSpectrumWriter03.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSpectrumWriter03.csv new file mode 100755 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSpectrumWrongHeader.csv b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSpectrumWrongHeader.csv new file mode 100755 index 0000000..d53d46a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/data/testCSVSpectrumWrongHeader.csv @@ -0,0 +1 @@ +Time:8Hz,Epoch,O1,O2,Pz,P1,P2,Event Id,Event Date,Event Duration diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/uoCSVReaderTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/uoCSVReaderTest.cpp new file mode 100755 index 0000000..f90215b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/uoCSVReaderTest.cpp @@ -0,0 +1,416 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include +#include + +#include "gtest/gtest.h" + +#include "csv/ovICSV.h" + +struct SSignalFile +{ + std::vector m_ChannelNames; + size_t m_Sampling; + size_t m_nSamplePerBuffer; + std::vector, std::vector>> m_data; +}; + +namespace { +std::string dataDirectory = ""; + +const struct SSignalFile SIMPLE_SIGNAL_FILE = { + { "Time Signal" }, + 32, + 8, + { + { + { 0.00000, 0.25000 }, + { 0.00000, 0.03125, 0.06250, 0.09375, 0.125, 0.15625, 0.1875, 0.21875 } + }, + { + { 0.250000, 0.500000 }, + { 0.250000, 0.281250, 0.312500, 0.343750, 0.375000, 0.406250, 0.437500, 0.468750 } + }, + { + { 0.500000, 0.750000 }, + { 0.500000, 0.531250, 0.562500, 0.593750, 0.625000, 0.656250, 0.687500, 0.718750 } + }, + } +}; + +void compareChunks(const std::pair, std::vector>& expected, const OpenViBE::CSV::SMatrixChunk& actual) +{ + ASSERT_EQ(expected.first.first, actual.startTime); + ASSERT_EQ(expected.first.second, actual.endTime); + ASSERT_EQ(expected.second.size(), actual.matrix.size()); + for (size_t sample = 0; sample < expected.second.size(); ++sample) { ASSERT_EQ(expected.second[sample], actual.matrix[sample]); } +} +} // namespace + +TEST(CSV_Reader_Test_Case, signalReaderUNIXEndlines) +{ + OpenViBE::CSV::ICSVHandler* csv = OpenViBE::CSV::createCSVHandler(); + const std::string filepath = dataDirectory + "/testCSVSignalUNIXEndlines.csv"; + + ASSERT_TRUE(csv->openFile(filepath, OpenViBE::CSV::EFileAccessMode::Read)); + csv->setFormatType(OpenViBE::CSV::EStreamType::Signal); + std::vector channelNames; + size_t sampling; + size_t nSamplePerBuffer; + std::vector chunks; + std::vector stimulations; + + ASSERT_TRUE(csv->getSignalInformation(channelNames, sampling, nSamplePerBuffer)); + ASSERT_TRUE(csv->readSamplesAndEventsFromFile(1, chunks, stimulations)); + ASSERT_EQ(1, chunks.size()); + compareChunks(SIMPLE_SIGNAL_FILE.m_data[0], chunks[0]); + ASSERT_TRUE(csv->readSamplesAndEventsFromFile(2, chunks, stimulations)); + ASSERT_EQ(2, chunks.size()); + compareChunks(SIMPLE_SIGNAL_FILE.m_data[1], chunks[0]); + compareChunks(SIMPLE_SIGNAL_FILE.m_data[2], chunks[1]); + + ASSERT_TRUE(csv->closeFile()); + releaseCSVHandler(csv); +} + +TEST(CSV_Reader_Test_Case, signalReaderWindowsEndlines) +{ + OpenViBE::CSV::ICSVHandler* csv = OpenViBE::CSV::createCSVHandler(); + const std::string filepath = dataDirectory + "/testCSVSignalWindowsEndlines.csv"; + + ASSERT_TRUE(csv->openFile(filepath, OpenViBE::CSV::EFileAccessMode::Read)); + csv->setFormatType(OpenViBE::CSV::EStreamType::Signal); + std::vector channelNames; + size_t sampling; + size_t nSamplePerBuffer; + std::vector chunks; + std::vector stimulations; + + ASSERT_TRUE(csv->getSignalInformation(channelNames, sampling, nSamplePerBuffer)); + ASSERT_TRUE(csv->readSamplesAndEventsFromFile(1, chunks, stimulations)); + ASSERT_EQ(1, chunks.size()); + compareChunks(SIMPLE_SIGNAL_FILE.m_data[0], chunks[0]); + ASSERT_TRUE(csv->readSamplesAndEventsFromFile(2, chunks, stimulations)); + ASSERT_EQ(2, chunks.size()); + compareChunks(SIMPLE_SIGNAL_FILE.m_data[1], chunks[0]); + compareChunks(SIMPLE_SIGNAL_FILE.m_data[2], chunks[1]); + + ASSERT_TRUE(csv->closeFile()); + releaseCSVHandler(csv); +} + +TEST(CSV_Reader_Test_Case, signalReaderNormalGoodSignal) +{ + OpenViBE::CSV::ICSVHandler* signalReaderTest = OpenViBE::CSV::createCSVHandler(); + const std::string filepath = dataDirectory + "testCSVSignalReader01.csv"; + + ASSERT_TRUE(signalReaderTest->openFile(filepath, OpenViBE::CSV::EFileAccessMode::Read)); + signalReaderTest->setFormatType(OpenViBE::CSV::EStreamType::Signal); + std::vector chunks; + std::vector stimulations; + std::vector channelNames; + const std::vector expectedChannels = { "O1", "O2", "Pz", "P1", "P2" }; + size_t sampling; + size_t nSamplePerBuffer; + + ASSERT_TRUE(signalReaderTest->getSignalInformation(channelNames, sampling, nSamplePerBuffer)); + ASSERT_TRUE(signalReaderTest->readSamplesAndEventsFromFile(3, chunks, stimulations)); + ASSERT_EQ(chunks.size(), 3); + + ASSERT_TRUE(!chunks.empty()); + ASSERT_TRUE(!stimulations.empty()); + ASSERT_EQ(channelNames, expectedChannels); + ASSERT_EQ(sampling, 8U); + ASSERT_EQ(nSamplePerBuffer, 4); + ASSERT_TRUE(signalReaderTest->closeFile()); + releaseCSVHandler(signalReaderTest); +} + +TEST(CSV_Reader_Test_Case, signalReaderNotEnoughChunk) +{ + OpenViBE::CSV::ICSVHandler* signalReaderTest = OpenViBE::CSV::createCSVHandler(); + const std::string filepath = dataDirectory + "testCSVSignalReader01.csv"; + + ASSERT_TRUE(signalReaderTest->openFile(filepath, OpenViBE::CSV::EFileAccessMode::Read)); + signalReaderTest->setFormatType(OpenViBE::CSV::EStreamType::Signal); + std::vector chunks; + std::vector stimulations; + std::vector channelNames; + const std::vector expectedChannels = { "O1", "O2", "Pz", "P1", "P2" }; + size_t sampling; + size_t nSamplePerBuffer; + + ASSERT_TRUE(signalReaderTest->getSignalInformation(channelNames, sampling, nSamplePerBuffer)); + + ASSERT_TRUE(signalReaderTest->readSamplesAndEventsFromFile(3, chunks, stimulations)); + ASSERT_EQ(chunks.size(), size_t(3)); + ASSERT_EQ(stimulations.size(), size_t(3)); + ASSERT_EQ(channelNames, expectedChannels); + ASSERT_EQ(sampling, 8U); + ASSERT_EQ(nSamplePerBuffer, 4); + ASSERT_TRUE(signalReaderTest->closeFile()); + releaseCSVHandler(signalReaderTest); +} + +TEST(CSV_Reader_Test_Case, SignalReaderEmptyFile) +{ + OpenViBE::CSV::ICSVHandler* signalReaderTest = OpenViBE::CSV::createCSVHandler(); + const std::string filepath = dataDirectory + "testCSVSignalEmptyFile.csv"; + ASSERT_TRUE(signalReaderTest->openFile(filepath, OpenViBE::CSV::EFileAccessMode::Read)); + releaseCSVHandler(signalReaderTest); +} + +TEST(CSV_Reader_Test_Case, SignalReaderWrongHeader) +{ + OpenViBE::CSV::ICSVHandler* signalReaderTest = OpenViBE::CSV::createCSVHandler(); + const std::string filepath = dataDirectory + "testCSVSignalWrongHeader.csv"; + ASSERT_TRUE(signalReaderTest->openFile(filepath, OpenViBE::CSV::EFileAccessMode::Read)); + signalReaderTest->setFormatType(OpenViBE::CSV::EStreamType::Signal); + std::vector channelNames; + size_t sampling; + size_t nSamplePerBuffer; + ASSERT_FALSE(signalReaderTest->getSignalInformation(channelNames, sampling, nSamplePerBuffer)); + + ASSERT_TRUE(signalReaderTest->closeFile()); + releaseCSVHandler(signalReaderTest); +} + +TEST(CSV_Reader_Test_Case, spectrumReaderNormalGoodSignal) +{ + OpenViBE::CSV::ICSVHandler* spectrumReaderTest = OpenViBE::CSV::createCSVHandler(); + std::string filepath = dataDirectory + "testCSVSpectrumReader01.csv"; + ASSERT_TRUE(spectrumReaderTest->openFile(filepath, OpenViBE::CSV::EFileAccessMode::Read)); + spectrumReaderTest->setFormatType(OpenViBE::CSV::EStreamType::Spectrum); + std::vector chunks; + std::vector stimulations; + std::vector channelNames; + std::vector expectedChannels = { "O1", "O2" }; + std::vector expectedData(128); + std::iota(expectedData.begin(), expectedData.begin() + 64, 0); + std::iota(expectedData.begin() + 64, expectedData.end(), 0); + + std::vector frequencyAbscissa; + size_t originalSampling; + + ASSERT_TRUE(spectrumReaderTest->getSpectrumInformation(channelNames, frequencyAbscissa, originalSampling)); + + ASSERT_TRUE(spectrumReaderTest->readSamplesAndEventsFromFile(3, chunks, stimulations)); + ASSERT_EQ(chunks.size(), 3); + ASSERT_EQ(chunks[0].matrix, expectedData); + ASSERT_EQ(chunks[1].matrix, expectedData); + ASSERT_EQ(chunks[2].matrix, expectedData); + ASSERT_EQ(chunks[0].startTime, 0); + ASSERT_EQ(chunks[0].endTime, 1); + ASSERT_EQ(chunks[1].startTime, 0.125); + ASSERT_EQ(chunks[1].endTime, 1.125); + ASSERT_EQ(chunks[2].startTime, 0.25); + ASSERT_EQ(chunks[2].endTime, 1.25); + + ASSERT_TRUE(!chunks.empty()); + ASSERT_EQ(channelNames, expectedChannels); + ASSERT_EQ(originalSampling, 128); + ASSERT_TRUE(spectrumReaderTest->closeFile()); + releaseCSVHandler(spectrumReaderTest); +} + +TEST(CSV_Reader_Test_Case, spectrumReaderNotEnoughChunk) +{ + OpenViBE::CSV::ICSVHandler* spectrumReaderTest = OpenViBE::CSV::createCSVHandler(); + const std::string filepath = dataDirectory + "testCSVSpectrumReader01.csv"; + ASSERT_TRUE(spectrumReaderTest->openFile(filepath, OpenViBE::CSV::EFileAccessMode::Read)); + spectrumReaderTest->setFormatType(OpenViBE::CSV::EStreamType::Spectrum); + std::vector chunks; + std::vector stimulations; + std::vector channelNames; + const std::vector expectedChannels = { "O1", "O2" }; + std::vector frequencyAbscissa; + size_t originalSampling; + + ASSERT_TRUE(spectrumReaderTest->getSpectrumInformation(channelNames, frequencyAbscissa, originalSampling)); + + ASSERT_TRUE(spectrumReaderTest->readSamplesAndEventsFromFile(13, chunks, stimulations)); + ASSERT_NE(chunks.size(), 13); + + ASSERT_TRUE(!chunks.empty()); + ASSERT_EQ(channelNames, expectedChannels); + ASSERT_EQ(originalSampling, 128); + ASSERT_NE(4, chunks.size()); + ASSERT_TRUE(spectrumReaderTest->closeFile()); + releaseCSVHandler(spectrumReaderTest); +} + +TEST(CSV_Reader_Test_Case, spectrumReaderWrongHeader) +{ + OpenViBE::CSV::ICSVHandler* spectrumReaderTest = OpenViBE::CSV::createCSVHandler(); + const std::string filepath = dataDirectory + "testCSVSpectrumWrongHeader.csv"; + ASSERT_TRUE(spectrumReaderTest->openFile(filepath, OpenViBE::CSV::EFileAccessMode::Read)); + spectrumReaderTest->setFormatType(OpenViBE::CSV::EStreamType::Spectrum); + std::vector channelNames; + std::vector frequencyAbscissa; + size_t originalSampling; + ASSERT_FALSE(spectrumReaderTest->getSpectrumInformation(channelNames, frequencyAbscissa, originalSampling)); + + ASSERT_TRUE(spectrumReaderTest->closeFile()); + releaseCSVHandler(spectrumReaderTest); +} + +TEST(CSV_Reader_Test_Case, matrixReaderNormalGoodSignal) +{ + OpenViBE::CSV::ICSVHandler* matrixReaderTest = OpenViBE::CSV::createCSVHandler(); + const std::string filepath = dataDirectory + "testCSVMatrixReader01.csv"; + ASSERT_TRUE(matrixReaderTest->openFile(filepath, OpenViBE::CSV::EFileAccessMode::Read)); + matrixReaderTest->setFormatType(OpenViBE::CSV::EStreamType::StreamedMatrix); + + std::vector chunks; + std::vector stimulations; + std::vector dimensionSizes; + std::vector labels; + const std::vector expectedLabels = { "", "", "", "", "", "" }; + const std::vector goodDimensionsSizes = { 2, 2, 2 }; + + ASSERT_TRUE(matrixReaderTest->getStreamedMatrixInformation(dimensionSizes, labels)); + ASSERT_TRUE(matrixReaderTest->readSamplesAndEventsFromFile(10, chunks, stimulations)); + ASSERT_EQ(chunks.size(), 10); + + ASSERT_EQ(dimensionSizes, goodDimensionsSizes); + ASSERT_EQ(labels, expectedLabels); + + ASSERT_TRUE(matrixReaderTest->closeFile()); + releaseCSVHandler(matrixReaderTest); +} + + +TEST(CSV_Reader_Test_Case, matrixReaderWrongHeader) +{ + OpenViBE::CSV::ICSVHandler* matrixReaderTest = OpenViBE::CSV::createCSVHandler(); + const std::string filepath = dataDirectory + "testCSVMatrixWrongHeader.csv"; + ASSERT_TRUE(matrixReaderTest->openFile(filepath, OpenViBE::CSV::EFileAccessMode::Read)); + matrixReaderTest->setFormatType(OpenViBE::CSV::EStreamType::StreamedMatrix); + + std::vector dimensionSizes; + std::vector labels; + ASSERT_FALSE(matrixReaderTest->getStreamedMatrixInformation(dimensionSizes, labels)); + + ASSERT_TRUE(matrixReaderTest->closeFile()); + releaseCSVHandler(matrixReaderTest); +} + +TEST(CSV_Reader_Test_Case, matrixReaderTooManyLabels) +{ + OpenViBE::CSV::ICSVHandler* matrixReaderTest = OpenViBE::CSV::createCSVHandler(); + const std::string filepath = dataDirectory + "testCSVMatrixTooManyLabels.csv"; + ASSERT_TRUE(matrixReaderTest->openFile(filepath, OpenViBE::CSV::EFileAccessMode::Read)); + matrixReaderTest->setFormatType(OpenViBE::CSV::EStreamType::StreamedMatrix); + + std::vector dimensionSizes; + std::vector labels; + ASSERT_FALSE(matrixReaderTest->getStreamedMatrixInformation(dimensionSizes, labels)); + + ASSERT_TRUE(matrixReaderTest->closeFile()); + releaseCSVHandler(matrixReaderTest); +} + +TEST(CSV_Reader_Test_Case, matrixReaderWrongStimulation) +{ + OpenViBE::CSV::ICSVHandler* matrixReaderTest = OpenViBE::CSV::createCSVHandler(); + const std::string filepath = dataDirectory + "testCSVMatrixWrongStimulation.csv"; + ASSERT_TRUE(matrixReaderTest->openFile(filepath, OpenViBE::CSV::EFileAccessMode::Read)); + matrixReaderTest->setFormatType(OpenViBE::CSV::EStreamType::StreamedMatrix); + + std::vector dimensionSizes; + std::vector labels; + ASSERT_TRUE(matrixReaderTest->getStreamedMatrixInformation(dimensionSizes, labels)); + + std::vector chunks; + std::vector stimulations; + + ASSERT_FALSE(matrixReaderTest->readSamplesAndEventsFromFile(1, chunks, stimulations)); + + ASSERT_TRUE(matrixReaderTest->closeFile()); + releaseCSVHandler(matrixReaderTest); +} + + +TEST(CSV_Reader_Test_Case, covarianceMatrixReaderNormalGoodSignal) +{ + OpenViBE::CSV::ICSVHandler* matrixReaderTest = OpenViBE::CSV::createCSVHandler(); + const std::string filepath = dataDirectory + "testCSVCovarMatrixReader01.csv"; + ASSERT_TRUE(matrixReaderTest->openFile(filepath, OpenViBE::CSV::EFileAccessMode::Read)); + matrixReaderTest->setFormatType(OpenViBE::CSV::EStreamType::CovarianceMatrix); + + std::vector chunks; + std::vector stimulations; + std::vector dimensionSizes; + std::vector labels; + const std::vector expectedLabels = { "X", "Y", "X", "Y", "Z1", "Z2", "Z3", "Z4", "Z5" }; + const std::vector goodDimensionsSizes = { 2, 2, 5 }; + + ASSERT_TRUE(matrixReaderTest->getStreamedMatrixInformation(dimensionSizes, labels)); + ASSERT_TRUE(matrixReaderTest->readSamplesAndEventsFromFile(3, chunks, stimulations)) << matrixReaderTest->getLastLogError() << ".Details: " << + matrixReaderTest->getLastErrorString(); + ASSERT_EQ(chunks.size(), 3); + + ASSERT_EQ(dimensionSizes, goodDimensionsSizes); + ASSERT_EQ(labels, expectedLabels); + + ASSERT_TRUE(matrixReaderTest->closeFile()); + releaseCSVHandler(matrixReaderTest); +} + +TEST(CSV_Reader_Test_Case, covarianceMatrixReaderWrongHeader) +{ + OpenViBE::CSV::ICSVHandler* matrixReaderTest = OpenViBE::CSV::createCSVHandler(); + const std::string filepath = dataDirectory + "testCSVCovarMatrixWrongHeader.csv"; + ASSERT_TRUE(matrixReaderTest->openFile(filepath, OpenViBE::CSV::EFileAccessMode::Read)); + + matrixReaderTest->setFormatType(OpenViBE::CSV::EStreamType::CovarianceMatrix); + + std::vector dimensionSizes; + std::vector labels; + ASSERT_FALSE(matrixReaderTest->getStreamedMatrixInformation(dimensionSizes, labels)); + + ASSERT_TRUE(matrixReaderTest->closeFile()); + releaseCSVHandler(matrixReaderTest); +} + +TEST(CSV_Reader_Test_Case, covarianceMatrixReaderTooManyLabels) +{ + OpenViBE::CSV::ICSVHandler* matrixReaderTest = OpenViBE::CSV::createCSVHandler(); + const std::string filepath = dataDirectory + "testCSVCovarMatrixTooManyLabels.csv"; + ASSERT_TRUE(matrixReaderTest->openFile(filepath, OpenViBE::CSV::EFileAccessMode::Read)); + matrixReaderTest->setFormatType(OpenViBE::CSV::EStreamType::CovarianceMatrix); + + std::vector dimensionSizes; + std::vector labels; + ASSERT_FALSE(matrixReaderTest->getStreamedMatrixInformation(dimensionSizes, labels)); + + ASSERT_TRUE(matrixReaderTest->closeFile()); + releaseCSVHandler(matrixReaderTest); +} + +int uoCSVReaderTest(int argc, char* argv[]) +{ + if (argv[1] != nullptr) { dataDirectory = argv[1]; } + testing::InitGoogleTest(&argc, argv); + ::testing::GTEST_FLAG(filter) = "CSV_Reader_Test_Case.*"; + return RUN_ALL_TESTS(); +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/uoCSVWriterTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/uoCSVWriterTest.cpp new file mode 100755 index 0000000..52f9e8b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-csv/uoCSVWriterTest.cpp @@ -0,0 +1,595 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include "gtest/gtest.h" + +#include "csv/ovICSV.h" + +#include +#include +#include +#include + +static std::string directoryPath = ""; + +TEST(CSV_Writer_Test_Case, signalWriterNormalGoodSignal) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVSignalWriter01.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::Signal); + + ASSERT_TRUE(handler->setSignalInformation({ "O1", "O2", "Pz", "P1", "P2" }, 8, 8)); + + double index = 0.0; + while (index < 1.2) + { + const double epoch = index / 0.5; + ASSERT_TRUE(handler->addSample({ index, index + 0.125, { -10.10, -5.05, 0.00, 5.05, 10.10 }, size_t(epoch) })); + if (index == 0.25 || index == 0.75) { ASSERT_TRUE(handler->addEvent(35000, index, 0.0)); } + index += 0.125; + } + + ASSERT_TRUE(handler->writeHeaderToFile()); + ASSERT_TRUE(handler->writeDataToFile()); + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); +} + +TEST(CSV_Writer_Test_Case, signalWriterNoStimulations) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVSignalWriter02.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::Signal); + + ASSERT_TRUE(handler->setSignalInformation({ "O1", "O2", "Pz", "P1", "P2" }, 8, 8)); + ASSERT_TRUE(handler->noEventsUntilDate(2.0)); + + double index = 0.0; + while (index < 1.2) + { + const double epoch = index / 0.5; + ASSERT_TRUE(handler->addSample({ index, index + 0.125, { -10.10, -5.05, 0.00, 5.05, 10.10 }, size_t(epoch) })); + index += 0.125; + } + + ASSERT_TRUE(handler->writeHeaderToFile()); + ASSERT_TRUE(handler->writeDataToFile()); + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); +} + +TEST(CSV_Writer_Test_Case, signalWriterNoFileOpen) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + handler->setFormatType(OpenViBE::CSV::EStreamType::Signal); + ASSERT_TRUE(handler->setSignalInformation({ "O1", "O2", "Pz", "P1", "P2" }, 8, 8)); + + double index = 0.0; + while (index < 1.2) + { + const double epoch = index / 0.5; + ASSERT_TRUE(handler->addSample({ index, index + 0.125, { -10.10, -5.05, 0.00, 5.05, 10.10 }, size_t(epoch) })); + index += 0.125; + } + + ASSERT_FALSE(handler->writeHeaderToFile()); + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); +} + +TEST(CSV_Writer_Test_Case, signalWriterWrongInputType) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + handler->setFormatType(OpenViBE::CSV::EStreamType::Spectrum); + ASSERT_FALSE(handler->setSignalInformation({ "O1", "O2", "Pz", "P1", "P2" }, 8, 8)); + releaseCSVHandler(handler); +} + +TEST(CSV_Writer_Test_Case, signalWriterWrongMatrixSize) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVSignalWriter05.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::Signal); + ASSERT_TRUE(handler->setSignalInformation({ "O1", "O2", "Pz", "P1", "P2" }, 8, 8)); + ASSERT_FALSE(handler->addSample({ 0, 0.125, { -20.20, -10.10, -5.05, 5.05, 10.10, 20.20 }, 0 })); + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); +} + +// should have nothing in the file +TEST(CSV_Writer_Test_Case, signalWriterTonsOfSignalWithoutSetNoEventsUntilDate) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVSignalWriter06.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::Signal); + ASSERT_TRUE(handler->setSignalInformation({ "O1", "O2", "Pz", "P1", "P2" }, 8, 8)); + + double time = 0.0; + while (time < 100.0) + { + ASSERT_TRUE(handler->addSample({ time, time + 0.125, { -20.20, -10.10, 0.0, 10.10, 20.20 }, size_t(time / 0.125) })); + time += 0.125; + } + + ASSERT_TRUE(handler->writeHeaderToFile()); + ASSERT_TRUE(handler->writeDataToFile()); + releaseCSVHandler(handler); +} + +// file should be full +TEST(CSV_Writer_Test_Case, signalWriterTonsOfSignalWithSetNoEventsUntilDate) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVSignalWriter07.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::Signal); + ASSERT_TRUE(handler->setSignalInformation({ "O1", "O2", "Pz", "P1", "P2" }, 8, 8)); + ASSERT_TRUE(handler->noEventsUntilDate(100.001)); + + double time = 0.0; + while (time < 100.0) + { + ASSERT_TRUE(handler->addSample({ time, time + 0.125, { -20.20, -10.10, 0.0, 10.10, 20.20 }, size_t(time / 0.5) })); + time += 0.125; + } + + ASSERT_TRUE(handler->writeHeaderToFile()); + ASSERT_TRUE(handler->writeDataToFile()); + ASSERT_TRUE(handler->writeAllDataToFile()); + releaseCSVHandler(handler); +} + +TEST(CSV_Writer_Test_Case, signalWriterOnlyLastMatrix) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + handler->setLastMatrixOnlyMode(true); + const std::string filename = directoryPath + "testCSVSignalWriter08.csv"; + const std::string expectedFileContent( + "Time:8Hz,Epoch,O1,O2,Pz,P1,P2,Event Id,Event Date,Event Duration\n1.0000000000,2,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,35000,1.0000000000,0.0000000000\n1.1250000000,2,-10.1000000000,-5.0500000000,0.0000000000,5.0500000000,10.1000000000,,,\n"); + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::Signal); + + ASSERT_TRUE(handler->setSignalInformation({ "O1", "O2", "Pz", "P1", "P2" }, 8, 8)); + + double index = 0.0; + while (index < 1.2) + { + const double epoch = index / 0.5; + ASSERT_TRUE(handler->addSample({ index, index + 0.125, { -10.10, -5.05, 0.00, 5.05, 10.10 }, size_t(epoch) })); + if (index == 0.25 || index == 0.75 || index == 1.0) { ASSERT_TRUE(handler->addEvent(35000, index, 0.0)); } + index += 0.125; + } + + ASSERT_TRUE(handler->writeHeaderToFile()); + ASSERT_TRUE(handler->writeAllDataToFile()); + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); + + std::ifstream t(filename); + const std::string out((std::istreambuf_iterator(t)), std::istreambuf_iterator()); + + ASSERT_STREQ(out.c_str(), expectedFileContent.c_str()); +} + +TEST(CSV_Writer_Test_Case, spectrumWriterNormalGoodSignal) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVSpectrumWriter01.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::Spectrum); + + std::vector frequencyAbscissa(64); + std::iota(frequencyAbscissa.begin(), frequencyAbscissa.end(), 0.0); + + ASSERT_TRUE(handler->setSpectrumInformation({ "O1", "O2" }, frequencyAbscissa, 256)); + double time = 0; + for (size_t i = 0; i < 10; ++i) + { + const size_t epoch = i / 4; + std::vector sample(128); + std::iota(sample.begin(), sample.end(), -64); + + ASSERT_TRUE(handler->addSample({ time, time + 1.0, sample, epoch })); + + time += 0.125; + if (i == 5 || i == 3 || i == 7) { ASSERT_TRUE(handler->addEvent(35001, time, 1.0)); } + } + + ASSERT_TRUE(handler->writeHeaderToFile()); + ASSERT_TRUE(handler->writeDataToFile()); + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); +} + +TEST(CSV_Writer_Test_Case, spectrumWriterWrongInputType) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVSpectrumWriter02.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::Signal); + std::vector frequencyAbscissa(64); + std::iota(frequencyAbscissa.begin(), frequencyAbscissa.end(), 0.0); + + ASSERT_FALSE(handler->setSpectrumInformation({ "O1", "O2" }, frequencyAbscissa, 256)); + + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); +} + +TEST(CSV_Writer_Test_Case, spectrumWriterWrongMatrixSize) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVSpectrumWriter03.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::Spectrum); + std::vector frequencyAbscissa(64); + std::iota(frequencyAbscissa.begin(), frequencyAbscissa.end(), 0.0); + ASSERT_TRUE(handler->setSpectrumInformation({ "O1", "O2" }, frequencyAbscissa, 256)); + + ASSERT_FALSE(handler->addSample({ 0, 1, { -20.20, -10.10, 0.0, 10.10, 20.20 }, 0 })); + + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); +} + +TEST(CSV_Writer_Test_Case, matrixWriterNormalGoodSignal) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVMatrixWriter01.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::StreamedMatrix); + + ASSERT_TRUE(handler->setStreamedMatrixInformation({ 2, 2, 2 }, { "LA", "LB", "1", "2", "X", "Y" })); + + for (size_t i = 0; i < 50; ++i) + { + const size_t epoch = i / 10; + ASSERT_TRUE(handler->addSample({ double(i), double(i)+1.0, { -20.20, -15.15, -10.10, -5.05, 5.05, 10.10, 15.15, 20.20 }, epoch })); + + if (i == 5 || i == 3 || i == 7) { ASSERT_TRUE(handler->addEvent(35001, double(i)+3.5, 1.0)); } + } + + ASSERT_TRUE(handler->writeHeaderToFile()); + ASSERT_TRUE(handler->writeDataToFile()); + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); +} + +TEST(CSV_Writer_Test_Case, matrixWriterEmptyLabels) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVMatrixWriter02.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::StreamedMatrix); + + ASSERT_TRUE(handler->setStreamedMatrixInformation({ 2, 2, 2 }, { "", "", "", "", "", "" })); + + for (size_t i = 0; i < 50; ++i) + { + const size_t epoch = i / 10; + ASSERT_TRUE(handler->addSample({ double(i), double(i)+1.0, { -20.20, -15.15, -10.10, -5.05, 5.05, 10.10, 15.15, 20.20 }, epoch })); + + if (i == 5 || i == 3 || i == 7) { ASSERT_TRUE(handler->addEvent(35001, double(i)+3.5, 1.0)); } + } + + ASSERT_TRUE(handler->writeHeaderToFile()); + ASSERT_TRUE(handler->writeDataToFile()); + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); +} + +TEST(CSV_Writer_Test_Case, matrixWithDifferentsDimensionSizes) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVMatrixWriter03.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::StreamedMatrix); + + ASSERT_TRUE(handler->setStreamedMatrixInformation({ 1, 4 }, { "L1", "A", "B", "C", "D" })); + + for (size_t i = 0; i < 50; ++i) + { + const size_t epoch = i / 10; + ASSERT_TRUE(handler->addSample({ double(i), double(i)+1.0, { -20.20, -10.10, 10.10, 20.20 }, epoch })); + + if (i == 5 || i == 3 || i == 7) { ASSERT_TRUE(handler->addEvent(35001, double(i)+3.5, 1.0)); } + } + + ASSERT_TRUE(handler->writeHeaderToFile()); + ASSERT_TRUE(handler->writeDataToFile()); + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); +} + +TEST(CSV_Writer_Test_Case, matrixWriterWrongMatrixSize) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVMatrixWriter04.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::StreamedMatrix); + ASSERT_TRUE(handler->setStreamedMatrixInformation({ 2, 2, 2 }, { "", "", "", "", "", "" })); + + ASSERT_FALSE(handler->addSample({ 0, 1.0, { -25.25, -20.20, -15.15, -10.10, -5.05, 5.05, 10.10, 15.15, 20.20, 25.25 }, 0 })); + + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); +} + +TEST(CSV_Writer_Test_Case, matrixWithDifferentsDimensionSizes2) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVMatrixWriter05.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::StreamedMatrix); + + ASSERT_TRUE( + handler->setStreamedMatrixInformation({ 6, 8, 2 }, { "L1", "L2", "L3", "L4", "L5", "L6", "A1", "B2", "C3", "D4", "E5", "F6", "G7", "H8", "X", "Y" })); + + std::vector values(96); + std::iota(values.begin(), values.end(), 0.0); + + for (size_t i = 0; i < 50; ++i) + { + const size_t epoch = i / 10; + ASSERT_TRUE(handler->addSample({ double(i), double(i)+1.0, values, epoch })); + + if (i == 5 || i == 3 || i == 7) { ASSERT_TRUE(handler->addEvent(35001, double(i)+3.5, 1.0)); } + } + + ASSERT_TRUE(handler->writeHeaderToFile()); + ASSERT_TRUE(handler->writeDataToFile()); + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); +} + +TEST(CSV_Writer_Test_Case, matrixWithDifferentsDimensionSizes3) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVMatrixWriter06.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::StreamedMatrix); + + ASSERT_TRUE(handler->setStreamedMatrixInformation({ 4, 1, 4 }, { "L1", "L2", "L3", "L4", "X", "R1", "R2", "R3", "R4" })); + + std::vector values(16); + std::iota(values.begin(), values.end(), 0.0); + + for (size_t i = 0; i < 50; ++i) + { + const size_t epoch = i / 10; + ASSERT_TRUE(handler->addSample({ double(i), double(i)+1.0, values, epoch })); + + if (i == 5 || i == 3 || i == 7) { ASSERT_TRUE(handler->addEvent(35001, double(i)+3.5, 1.0)); } + } + + ASSERT_TRUE(handler->writeHeaderToFile()); + ASSERT_TRUE(handler->writeDataToFile()); + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); +} + +// As of 10/01/2017 (commit a11210cf1c3fd81bb52095c7c9c6006c760218a2), this is valid for +TEST(CSV_Writer_Test_Case, matrixWriterWithInvalidTime) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVMatrixWriter07.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::StreamedMatrix); + + ASSERT_TRUE(handler->setStreamedMatrixInformation({ 1, 1, 1 }, { "X", "Y", "Z" })); + + ASSERT_FALSE(handler->addSample({ 1.0, 0, { -20.20, -15.15, -10.10 }, 0 })); + ASSERT_FALSE(handler->addSample({ -1.0, 0, { -20.20, -15.15, -10.10 }, 1 })); + ASSERT_FALSE(handler->addSample({ -1.0, -0.5, { -20.20, -15.15, -10.10 }, 2 })); + ASSERT_FALSE(handler->addSample({ 1.0, -1.0, { -20.20, -15.15, -10.10 }, 3 })); + + ASSERT_TRUE(handler->closeFile()); + + releaseCSVHandler(handler); +} + +TEST(CSV_Writer_Test_Case, matrixWriterOnlyLastMatrix) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + handler->setLastMatrixOnlyMode(true); + const std::string filename = directoryPath + "testCSVMatrixWriter08.csv"; + const std::string expectedFileContent( + "Time:2x2x2,End Time,LA:1:X,LA:1:Y,LA:2:X,LA:2:Y,LB:1:X,LB:1:Y,LB:2:X,LB:2:Y,Event Id,Event Date,Event Duration\n49.0000000000,50.0000000000,49.0000000000,1.0000000000,2.0000000000,3.0000000000,4.0000000000,5.0000000000,6.0000000000,7.0000000000,,,\n"); + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::StreamedMatrix); + + ASSERT_TRUE(handler->setStreamedMatrixInformation({ 2, 2, 2 }, { "LA", "LB", "1", "2", "X", "Y" })); + ASSERT_TRUE(handler->writeHeaderToFile()); + + for (size_t i = 0; i < 50; ++i) + { + const size_t epoch = i / 10; + ASSERT_TRUE(handler->addSample({ double(i), double(i) + 1.0, { double(i), 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0 }, epoch })); + + if (i == 3 || i == 5 || i == 7) { ASSERT_TRUE(handler->addEvent(35001, double(i) + 3.5, 1.0)); } + } + + ASSERT_TRUE(handler->writeAllDataToFile()); + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); + + std::ifstream t(filename); + const std::string out((std::istreambuf_iterator(t)), std::istreambuf_iterator()); + + ASSERT_STREQ(out.c_str(), expectedFileContent.c_str()); +} + + +TEST(CSV_Writer_Test_Case, featureVectorNormalGoodSignal) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVFeatureVectorWriter01.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::FeatureVector); + + ASSERT_TRUE(handler->setFeatureVectorInformation({ "F1", "F2", "F3" })); + + for (size_t i = 0; i < 50; ++i) + { + const size_t epoch = i / 10; + ASSERT_TRUE(handler->addSample({ double(i), double(i)+1.0, { -20.20, -15.15, -10.10 }, epoch })); + + if (i == 5 || i == 3 || i == 7) { ASSERT_TRUE(handler->addEvent(35001, double(i)+3.5, 1.0)); } + } + + ASSERT_TRUE(handler->writeHeaderToFile()); + ASSERT_TRUE(handler->writeDataToFile()); + ASSERT_TRUE(handler->closeFile()); + + releaseCSVHandler(handler); +} + +TEST(CSV_Writer_Test_Case, featureVectorEmptyLabels) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVFeatureVectorWriter02.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::FeatureVector); + + ASSERT_TRUE(handler->setFeatureVectorInformation({ "", "", "" })); + + for (size_t i = 0; i < 50; ++i) + { + const size_t epoch = i / 10; + ASSERT_TRUE(handler->addSample({ double(i), double(i)+1.0, { -20.20, -15.15, -10.10 }, epoch })); + } + + ASSERT_TRUE(handler->writeHeaderToFile()); + ASSERT_TRUE(handler->writeDataToFile()); + ASSERT_TRUE(handler->closeFile()); + + releaseCSVHandler(handler); +} + +TEST(CSV_Writer_Test_Case, featureVectorWrongVectorSize) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVFeatureVectorWriter03.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::FeatureVector); + + ASSERT_TRUE(handler->setFeatureVectorInformation({ "F1", "F2", "F3" })); + + ASSERT_FALSE(handler->addSample({ 0, 1.0, { -20.20, -15.15, -10.10, 12 }, 0 })); + ASSERT_FALSE(handler->addSample({ 1.0, 2.0, { -20.20, -15.15 }, 1 })); + + ASSERT_TRUE(handler->closeFile()); + + releaseCSVHandler(handler); +} + + +TEST(CSV_Writer_Test_Case, covarianceMatrixWriterNormalGoodSignal) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVCovarMatrixWriter01.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::CovarianceMatrix); + + ASSERT_TRUE(handler->setStreamedMatrixInformation({ 2, 2, 2 }, { "C1", "C2", "C1", "C2", "Matrix 1", "Matrix 2" })); + + for (size_t i = 0; i < 50; ++i) + { + const size_t epoch = i / 10; + ASSERT_TRUE(handler->addSample({ double(i), double(i)+1.0, { -20.20, -15.15, -10.10, -5.05, 5.05, 10.10, 15.15, 20.20 }, epoch })); + } + handler->noEventsUntilDate(20.0); + + ASSERT_TRUE(handler->writeHeaderToFile()); + ASSERT_TRUE(handler->writeAllDataToFile()); + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); +} + +TEST(CSV_Writer_Test_Case, covarianceMatrixWriterEmptyLabels) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVCovarMatrixWriter02.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::CovarianceMatrix); + + ASSERT_TRUE(handler->setStreamedMatrixInformation({ 2, 2, 2 }, { "", "", "", "", "", "" })); + + for (size_t i = 0; i < 50; ++i) + { + const size_t epoch = i / 10; + ASSERT_TRUE(handler->addSample({ double(i), double(i)+1.0, { -20.20, -15.15, -10.10, -5.05, 5.05, 10.10, 15.15, 20.20 }, epoch })); + } + + ASSERT_TRUE(handler->writeHeaderToFile()); + ASSERT_TRUE(handler->writeAllDataToFile()); + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); +} + + +TEST(CSV_Writer_Test_Case, covarianceMatrixWriterWrongMatrixSize) +{ + OpenViBE::CSV::ICSVHandler* handler = OpenViBE::CSV::createCSVHandler(); + const std::string filename = directoryPath + "testCSVCovarMatrixWriter04.csv"; + + ASSERT_TRUE(handler->openFile(filename, OpenViBE::CSV::EFileAccessMode::Write)); + handler->setFormatType(OpenViBE::CSV::EStreamType::CovarianceMatrix); + ASSERT_TRUE(handler->setStreamedMatrixInformation({ 2, 2, 2 }, { "", "", "", "", "", "" })); + + ASSERT_FALSE(handler->addSample({ 0, 1.0, { -25.25, -20.20, -15.15, -10.10, -5.05, 5.05, 10.10, 15.15, 20.20, 25.25 }, 0 })); + + ASSERT_TRUE(handler->closeFile()); + releaseCSVHandler(handler); +} + + +int uoCSVWriterTest(int argc, char* argv[]) +{ + if (argv[1] != nullptr) { directoryPath = argv[1]; } + testing::InitGoogleTest(&argc, argv); + ::testing::GTEST_FLAG(filter) = "CSV_Writer_Test_Case.*"; + return RUN_ALL_TESTS(); +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-ebml/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-ebml/CMakeLists.txt new file mode 100755 index 0000000..b59a4eb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-ebml/CMakeLists.txt @@ -0,0 +1,70 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +PROJECT(openvibe-module-ebml-test) + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ---------------------- +# Configure test target +# ---------------------- + +# Test that needs to called with parameters +SET(TEST_WITH_PARAM + uoEBMLReaderTest.cpp + uoEBMLWriterTest.cpp +) + +# Test that needs to called without parameters +SET(TEST_NO_PARAM +) + +# Create test sources list +# This macro auto-generate ${PROJECT_NAME}.cpp +# in the build tree. ${PROJECT_NAME}.cpp is +# the test driver called by ctest to run +# the different tests added to this target. +CREATE_TEST_SOURCELIST (Tests + ${PROJECT_NAME}.cpp + ${TEST_WITH_PARAM} + ${TEST_NO_PARAM} +) + +ADD_EXECUTABLE(${PROJECT_NAME} ${Tests}) +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEModuleEBML") +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OVT_UNIT_TOOLKIT_LIB} ${OV_MODULE_EBML}) + +# Add test without parameter to driver +FOREACH(test ${TEST_NO_PARAM}) + GET_FILENAME_COMPONENT(TName ${test} NAME_WE) + ADD_TEST(NAME ${TName} COMMAND ${PROJECT_NAME} ${TName}) +ENDFOREACH() + +# Add test with parameter to driver +ADD_TEST(NAME uoEBMLReaderTest COMMAND ${PROJECT_NAME} uoEBMLReaderTest "${CMAKE_CURRENT_SOURCE_DIR}/data/" "${OVT_TEST_TEMPORARY_DIR}") +ADD_TEST(NAME uoEBMLWriterTest COMMAND ${PROJECT_NAME} uoEBMLWriterTest "${CMAKE_CURRENT_SOURCE_DIR}/data/" "${OVT_TEST_TEMPORARY_DIR}") \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-ebml/data/ref_data.ebml b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-ebml/data/ref_data.ebml new file mode 100755 index 0000000..19f0c35 Binary files /dev/null and b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-ebml/data/ref_data.ebml differ diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-ebml/data/ref_result.txt b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-ebml/data/ref_result.txt new file mode 100755 index 0000000..bb5fe75 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-ebml/data/ref_result.txt @@ -0,0 +1,408 @@ +testing with n=17 +Opening child node [0x000000000a45dfa3] + Opening child node [0x0000000000000282] + Got doc type : [matroska] + Node closed + Opening child node [0x0000000000000287] + Got doc type version : [0x0000000000000001] + Node closed + Opening child node [0x0000000000000285] + Got doc type read version : [0x000000000009fffc] + Node closed +Node closed +Opening child node [0x0000000000001234] + Got uinteger : [0x0000000000000000] +Node closed +Opening child node [0xffffffffffffffff] + Got uinteger : [0xff000000ff000000] +Node closed +Opening child node [0x0000000000004321] + Got double : [3.14159] +Node closed +Opening child node [0x0000000000008765] + Got float : [3.14159] +Node closed +testing with n=16 +Opening child node [0x000000000a45dfa3] + Opening child node [0x0000000000000282] + Got doc type : [matroska] + Node closed + Opening child node [0x0000000000000287] + Got doc type version : [0x0000000000000001] + Node closed + Opening child node [0x0000000000000285] + Got doc type read version : [0x000000000009fffc] + Node closed +Node closed +Opening child node [0x0000000000001234] + Got uinteger : [0x0000000000000000] +Node closed +Opening child node [0xffffffffffffffff] + Got uinteger : [0xff000000ff000000] +Node closed +Opening child node [0x0000000000004321] + Got double : [3.14159] +Node closed +Opening child node [0x0000000000008765] + Got float : [3.14159] +Node closed +testing with n=15 +Opening child node [0x000000000a45dfa3] + Opening child node [0x0000000000000282] + Got doc type : [matroska] + Node closed + Opening child node [0x0000000000000287] + Got doc type version : [0x0000000000000001] + Node closed + Opening child node [0x0000000000000285] + Got doc type read version : [0x000000000009fffc] + Node closed +Node closed +Opening child node [0x0000000000001234] + Got uinteger : [0x0000000000000000] +Node closed +Opening child node [0xffffffffffffffff] + Got uinteger : [0xff000000ff000000] +Node closed +Opening child node [0x0000000000004321] + Got double : [3.14159] +Node closed +Opening child node [0x0000000000008765] + Got float : [3.14159] +Node closed +testing with n=14 +Opening child node [0x000000000a45dfa3] + Opening child node [0x0000000000000282] + Got doc type : [matroska] + Node closed + Opening child node [0x0000000000000287] + Got doc type version : [0x0000000000000001] + Node closed + Opening child node [0x0000000000000285] + Got doc type read version : [0x000000000009fffc] + Node closed +Node closed +Opening child node [0x0000000000001234] + Got uinteger : [0x0000000000000000] +Node closed +Opening child node [0xffffffffffffffff] + Got uinteger : [0xff000000ff000000] +Node closed +Opening child node [0x0000000000004321] + Got double : [3.14159] +Node closed +Opening child node [0x0000000000008765] + Got float : [3.14159] +Node closed +testing with n=13 +Opening child node [0x000000000a45dfa3] + Opening child node [0x0000000000000282] + Got doc type : [matroska] + Node closed + Opening child node [0x0000000000000287] + Got doc type version : [0x0000000000000001] + Node closed + Opening child node [0x0000000000000285] + Got doc type read version : [0x000000000009fffc] + Node closed +Node closed +Opening child node [0x0000000000001234] + Got uinteger : [0x0000000000000000] +Node closed +Opening child node [0xffffffffffffffff] + Got uinteger : [0xff000000ff000000] +Node closed +Opening child node [0x0000000000004321] + Got double : [3.14159] +Node closed +Opening child node [0x0000000000008765] + Got float : [3.14159] +Node closed +testing with n=12 +Opening child node [0x000000000a45dfa3] + Opening child node [0x0000000000000282] + Got doc type : [matroska] + Node closed + Opening child node [0x0000000000000287] + Got doc type version : [0x0000000000000001] + Node closed + Opening child node [0x0000000000000285] + Got doc type read version : [0x000000000009fffc] + Node closed +Node closed +Opening child node [0x0000000000001234] + Got uinteger : [0x0000000000000000] +Node closed +Opening child node [0xffffffffffffffff] + Got uinteger : [0xff000000ff000000] +Node closed +Opening child node [0x0000000000004321] + Got double : [3.14159] +Node closed +Opening child node [0x0000000000008765] + Got float : [3.14159] +Node closed +testing with n=11 +Opening child node [0x000000000a45dfa3] + Opening child node [0x0000000000000282] + Got doc type : [matroska] + Node closed + Opening child node [0x0000000000000287] + Got doc type version : [0x0000000000000001] + Node closed + Opening child node [0x0000000000000285] + Got doc type read version : [0x000000000009fffc] + Node closed +Node closed +Opening child node [0x0000000000001234] + Got uinteger : [0x0000000000000000] +Node closed +Opening child node [0xffffffffffffffff] + Got uinteger : [0xff000000ff000000] +Node closed +Opening child node [0x0000000000004321] + Got double : [3.14159] +Node closed +Opening child node [0x0000000000008765] + Got float : [3.14159] +Node closed +testing with n=10 +Opening child node [0x000000000a45dfa3] + Opening child node [0x0000000000000282] + Got doc type : [matroska] + Node closed + Opening child node [0x0000000000000287] + Got doc type version : [0x0000000000000001] + Node closed + Opening child node [0x0000000000000285] + Got doc type read version : [0x000000000009fffc] + Node closed +Node closed +Opening child node [0x0000000000001234] + Got uinteger : [0x0000000000000000] +Node closed +Opening child node [0xffffffffffffffff] + Got uinteger : [0xff000000ff000000] +Node closed +Opening child node [0x0000000000004321] + Got double : [3.14159] +Node closed +Opening child node [0x0000000000008765] + Got float : [3.14159] +Node closed +testing with n=9 +Opening child node [0x000000000a45dfa3] + Opening child node [0x0000000000000282] + Got doc type : [matroska] + Node closed + Opening child node [0x0000000000000287] + Got doc type version : [0x0000000000000001] + Node closed + Opening child node [0x0000000000000285] + Got doc type read version : [0x000000000009fffc] + Node closed +Node closed +Opening child node [0x0000000000001234] + Got uinteger : [0x0000000000000000] +Node closed +Opening child node [0xffffffffffffffff] + Got uinteger : [0xff000000ff000000] +Node closed +Opening child node [0x0000000000004321] + Got double : [3.14159] +Node closed +Opening child node [0x0000000000008765] + Got float : [3.14159] +Node closed +testing with n=8 +Opening child node [0x000000000a45dfa3] + Opening child node [0x0000000000000282] + Got doc type : [matroska] + Node closed + Opening child node [0x0000000000000287] + Got doc type version : [0x0000000000000001] + Node closed + Opening child node [0x0000000000000285] + Got doc type read version : [0x000000000009fffc] + Node closed +Node closed +Opening child node [0x0000000000001234] + Got uinteger : [0x0000000000000000] +Node closed +Opening child node [0xffffffffffffffff] + Got uinteger : [0xff000000ff000000] +Node closed +Opening child node [0x0000000000004321] + Got double : [3.14159] +Node closed +Opening child node [0x0000000000008765] + Got float : [3.14159] +Node closed +testing with n=7 +Opening child node [0x000000000a45dfa3] + Opening child node [0x0000000000000282] + Got doc type : [matroska] + Node closed + Opening child node [0x0000000000000287] + Got doc type version : [0x0000000000000001] + Node closed + Opening child node [0x0000000000000285] + Got doc type read version : [0x000000000009fffc] + Node closed +Node closed +Opening child node [0x0000000000001234] + Got uinteger : [0x0000000000000000] +Node closed +Opening child node [0xffffffffffffffff] + Got uinteger : [0xff000000ff000000] +Node closed +Opening child node [0x0000000000004321] + Got double : [3.14159] +Node closed +Opening child node [0x0000000000008765] + Got float : [3.14159] +Node closed +testing with n=6 +Opening child node [0x000000000a45dfa3] + Opening child node [0x0000000000000282] + Got doc type : [matroska] + Node closed + Opening child node [0x0000000000000287] + Got doc type version : [0x0000000000000001] + Node closed + Opening child node [0x0000000000000285] + Got doc type read version : [0x000000000009fffc] + Node closed +Node closed +Opening child node [0x0000000000001234] + Got uinteger : [0x0000000000000000] +Node closed +Opening child node [0xffffffffffffffff] + Got uinteger : [0xff000000ff000000] +Node closed +Opening child node [0x0000000000004321] + Got double : [3.14159] +Node closed +Opening child node [0x0000000000008765] + Got float : [3.14159] +Node closed +testing with n=5 +Opening child node [0x000000000a45dfa3] + Opening child node [0x0000000000000282] + Got doc type : [matroska] + Node closed + Opening child node [0x0000000000000287] + Got doc type version : [0x0000000000000001] + Node closed + Opening child node [0x0000000000000285] + Got doc type read version : [0x000000000009fffc] + Node closed +Node closed +Opening child node [0x0000000000001234] + Got uinteger : [0x0000000000000000] +Node closed +Opening child node [0xffffffffffffffff] + Got uinteger : [0xff000000ff000000] +Node closed +Opening child node [0x0000000000004321] + Got double : [3.14159] +Node closed +Opening child node [0x0000000000008765] + Got float : [3.14159] +Node closed +testing with n=4 +Opening child node [0x000000000a45dfa3] + Opening child node [0x0000000000000282] + Got doc type : [matroska] + Node closed + Opening child node [0x0000000000000287] + Got doc type version : [0x0000000000000001] + Node closed + Opening child node [0x0000000000000285] + Got doc type read version : [0x000000000009fffc] + Node closed +Node closed +Opening child node [0x0000000000001234] + Got uinteger : [0x0000000000000000] +Node closed +Opening child node [0xffffffffffffffff] + Got uinteger : [0xff000000ff000000] +Node closed +Opening child node [0x0000000000004321] + Got double : [3.14159] +Node closed +Opening child node [0x0000000000008765] + Got float : [3.14159] +Node closed +testing with n=3 +Opening child node [0x000000000a45dfa3] + Opening child node [0x0000000000000282] + Got doc type : [matroska] + Node closed + Opening child node [0x0000000000000287] + Got doc type version : [0x0000000000000001] + Node closed + Opening child node [0x0000000000000285] + Got doc type read version : [0x000000000009fffc] + Node closed +Node closed +Opening child node [0x0000000000001234] + Got uinteger : [0x0000000000000000] +Node closed +Opening child node [0xffffffffffffffff] + Got uinteger : [0xff000000ff000000] +Node closed +Opening child node [0x0000000000004321] + Got double : [3.14159] +Node closed +Opening child node [0x0000000000008765] + Got float : [3.14159] +Node closed +testing with n=2 +Opening child node [0x000000000a45dfa3] + Opening child node [0x0000000000000282] + Got doc type : [matroska] + Node closed + Opening child node [0x0000000000000287] + Got doc type version : [0x0000000000000001] + Node closed + Opening child node [0x0000000000000285] + Got doc type read version : [0x000000000009fffc] + Node closed +Node closed +Opening child node [0x0000000000001234] + Got uinteger : [0x0000000000000000] +Node closed +Opening child node [0xffffffffffffffff] + Got uinteger : [0xff000000ff000000] +Node closed +Opening child node [0x0000000000004321] + Got double : [3.14159] +Node closed +Opening child node [0x0000000000008765] + Got float : [3.14159] +Node closed +testing with n=1 +Opening child node [0x000000000a45dfa3] + Opening child node [0x0000000000000282] + Got doc type : [matroska] + Node closed + Opening child node [0x0000000000000287] + Got doc type version : [0x0000000000000001] + Node closed + Opening child node [0x0000000000000285] + Got doc type read version : [0x000000000009fffc] + Node closed +Node closed +Opening child node [0x0000000000001234] + Got uinteger : [0x0000000000000000] +Node closed +Opening child node [0xffffffffffffffff] + Got uinteger : [0xff000000ff000000] +Node closed +Opening child node [0x0000000000004321] + Got double : [3.14159] +Node closed +Opening child node [0x0000000000008765] + Got float : [3.14159] +Node closed diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-ebml/uoEBMLReaderTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-ebml/uoEBMLReaderTest.cpp new file mode 100755 index 0000000..58d3cad --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-ebml/uoEBMLReaderTest.cpp @@ -0,0 +1,169 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include +#include +#include + +#include "ebml/IReader.h" +#include "ebml/CReader.h" +#include "ebml/CReaderHelper.h" + +#include "ovtAssert.h" + +std::ofstream g_OutputStream; + +class CReaderCallBack : public EBML::IReaderCallBack +{ +public: + CReaderCallBack() { } + + ~CReaderCallBack() override { } + + bool isMasterChild(const EBML::CIdentifier& identifier) override + { + if (identifier == EBML_Identifier_Header) { return true; } + if (identifier == EBML::CIdentifier(0xffff)) { return true; } + + return false; + } + + void openChild(const EBML::CIdentifier& identifier) override + { + m_CurrentID = identifier; + + for (int i = 0; i < m_Depth; ++i) { g_OutputStream << " "; } + g_OutputStream << "Opening child node [0x" << std::setw(16) << std::setfill('0') << std::hex << m_CurrentID << std::dec << "]\n"; + m_Depth++; + } + + void processChildData(const void* buffer, const size_t size) override + { + for (int i = 0; i < m_Depth; ++i) { g_OutputStream << " "; } + if (m_CurrentID == EBML_Identifier_DocType) { g_OutputStream << "Got doc type : [" << m_helper.getStr(buffer, size) << "]\n"; } + else if (m_CurrentID == EBML_Identifier_EBMLVersion) + { + g_OutputStream << "Got EBML version : [0x" << std::setw(16) << std::setfill('0') << std::hex << m_helper.getUInt(buffer, size) << std::dec << "]\n"; + } + else if (m_CurrentID == EBML_Identifier_EBMLIdLength) + { + g_OutputStream << "Got EBML ID length : [0x" << std::setw(16) << std::setfill('0') << std::hex << m_helper.getUInt(buffer, size) << std::dec << + "]\n"; + } + else if (m_CurrentID == EBML_Identifier_DocTypeVersion) + { + g_OutputStream << "Got doc type version : [0x" << std::setw(16) << std::setfill('0') << std::hex << m_helper.getUInt(buffer, size) << std::dec << + "]\n"; + } + else if (m_CurrentID == EBML_Identifier_DocTypeReadVersion) + { + g_OutputStream << "Got doc type read version : [0x" << std::setw(16) << std::setfill('0') << std::hex << m_helper.getUInt(buffer, size) << std::dec + << "]\n"; + } + else if (m_CurrentID == EBML::CIdentifier(0x1234)) + { + g_OutputStream << "Got uinteger : [0x" << std::setw(16) << std::setfill('0') << std::hex << m_helper.getUInt(buffer, size) << std::dec << "]\n"; + } + else if (m_CurrentID == EBML::CIdentifier(0xffffffffffffffffLL)) + { + g_OutputStream << "Got uinteger : [0x" << std::setw(16) << std::setfill('0') << std::hex << m_helper.getUInt(buffer, size) << std::dec << "]\n"; + } + else if (m_CurrentID == EBML::CIdentifier(0x4321)) { g_OutputStream << "Got double : [" << m_helper.getDouble(buffer, size) << "]\n"; } + else if (m_CurrentID == EBML::CIdentifier(0x8765)) { g_OutputStream << "Got float : [" << m_helper.getDouble(buffer, size) << "]\n"; } + else { g_OutputStream << "Got " << size << " data bytes, node id not known\n"; } + } + + void closeChild() override + { + m_Depth--; + for (int i = 0; i < m_Depth; ++i) { g_OutputStream << " "; } + g_OutputStream << "Node closed\n"; + } + +private: + + int m_Depth = 0; + + EBML::CReaderHelper m_helper; + EBML::CIdentifier m_CurrentID; +}; + +int uoEBMLReaderTest(int argc, char* argv[]) +{ + OVT_ASSERT(argc == 3, "Failure to retrieve tests arguments. Expecting: data_dir output_dir"); + + std::string dataFile = std::string(argv[1]) + "ref_data.ebml"; + std::string expectedFile = std::string(argv[1]) + "ref_result.txt"; + std::string outputFile = std::string(argv[2]) + "uoEBMLReaderTest.txt"; + + // The test parses a known ebml file, + // writes the results into a text file and compares the output + // text file to a reference text file. + + g_OutputStream.open(outputFile); + + + OVT_ASSERT(g_OutputStream.is_open(), "Failure to open output file for writing"); + + // parsing + for (size_t n = 17; n >= 1; n--) + { + CReaderCallBack callback; + EBML::CReader reader(callback); + + g_OutputStream << "testing with n=" << n << std::endl; + + FILE* file = fopen(dataFile.c_str(), "rb"); + + OVT_ASSERT(file != nullptr, "Failure to open data file for reading"); + + unsigned char* c = new unsigned char[n]; + size_t i = 0; + while (!feof(file)) + { + i = fread(c, 1, n * sizeof(unsigned char), file); + reader.processData(c, i); + } + delete[] c; + fclose(file); + } + g_OutputStream.close(); + // comparison part + std::ifstream generatedStream(outputFile); + std::ifstream expectedStream(expectedFile); + + OVT_ASSERT(generatedStream.is_open(), "Failure to open generated results for reading"); + OVT_ASSERT(expectedStream.is_open(), "Failure to open expected results for reading"); + + std::string generatedString; + std::string expectedString; + while (std::getline(expectedStream, expectedString)) + { + OVT_ASSERT(std::getline(generatedStream, generatedString), "Failure to retrieve a line to match"); + OVT_ASSERT_STREQ(expectedString, generatedString, "Failure to match expected line to generated line"); + } + + // last check to verify the expected file has no additional line + OVT_ASSERT(!std::getline(generatedStream, generatedString), "Failure to match expected file size and generated file size"); + + + return EXIT_SUCCESS; +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-ebml/uoEBMLWriterTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-ebml/uoEBMLWriterTest.cpp new file mode 100755 index 0000000..c31b789 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-ebml/uoEBMLWriterTest.cpp @@ -0,0 +1,140 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include +#include +#include + +#include "ebml/defines.h" +#include "ebml/IWriter.h" +#include "ebml/CWriterHelper.h" + +#include "ovtAssert.h" +#include + +#define OVP_NodeId_OpenViBEStream_Header EBML::CIdentifier(0xF59505AB, 0x3684C8D8) +#define OVP_NodeId_OpenViBEStream_Header_Compression EBML::CIdentifier(0x40358769, 0x166380D1) +#define OVP_NodeId_OpenViBEStream_Header_StreamType EBML::CIdentifier(0x732EC1D1, 0xFE904087) +#define OVP_NodeId_OpenViBEStream_Buffer EBML::CIdentifier(0x2E60AD18, 0x87A29BDF) +#define OVP_NodeId_OpenViBEStream_Buffer_StreamIndex EBML::CIdentifier(0x30A56D8A, 0xB9C12238) +#define OVP_NodeId_OpenViBEStream_Buffer_StartTime EBML::CIdentifier(0x093E6A0A, 0xC5A9467B) +#define OVP_NodeId_OpenViBEStream_Buffer_EndTime EBML::CIdentifier(0x8B5CCCD9, 0xC5024F29) +#define OVP_NodeId_OpenViBEStream_Buffer_Content EBML::CIdentifier(0x8D4B0BE8, 0x7051265C) + +#ifndef M_PI +#define M_PI 3.1415926535897932384626433832795 +#endif + +class CWriterCallBack : public EBML::IWriterCallBack +{ +public: + CWriterCallBack(const char* filename) { m_file = std::fopen(filename, "wb"); } + + ~CWriterCallBack() override { if (m_file) { std::fclose(m_file); } } // in case release is not called + + void write(const void* buffer, const size_t size) override { if (m_file) { std::fwrite(buffer, size_t(size), 1, m_file); } } + + // necessary thjor the test to close the stream and re-open it for inspection + void release() + { + std::fclose(m_file); + m_file = nullptr; + } + +private: + + std::FILE* m_file{ nullptr }; +}; + +int uoEBMLWriterTest(int argc, char* argv[]) +{ + OVT_ASSERT(argc == 3, "Failure to retrieve tests arguments. Expecting: data_dir output_dir"); + + const std::string expectedFile = std::string(argv[1]) + "ref_data.ebml"; + const std::string outputFile = std::string(argv[2]) + "uoEBMLWriterTest.ebml"; + + // The test serializes a known ebml sequence and compares the output + // to a reference. + + // serializing + CWriterCallBack callback(outputFile.c_str()); + + EBML::IWriter* writer = createWriter(callback); + EBML::CWriterHelper helper; + + helper.connect(writer); + + helper.openChild(EBML_Identifier_Header); + + helper.openChild(EBML_Identifier_DocType); + helper.setStr("matroska"); + helper.closeChild(); + + helper.openChild(EBML_Identifier_DocTypeVersion); + helper.setUInt(1); + helper.closeChild(); + + helper.openChild(EBML_Identifier_DocTypeReadVersion); + helper.setInt(655356); + helper.closeChild(); + + helper.closeChild(); + + helper.openChild(0x1234); + helper.setUInt(0); + helper.closeChild(); + + helper.openChild(0xffffffffffffffffLL); + helper.setUInt(0xff000000ff000000LL); + helper.closeChild(); + + helper.openChild(0x4321); + helper.setDouble(M_PI); + helper.closeChild(); + + helper.openChild(0x8765); + helper.setFloat(float(M_PI)); + helper.closeChild(); + writer->release(); + callback.release(); + + + // comparison part + std::ifstream generatedStream(outputFile, std::ios::binary); + std::ifstream expectedStream(expectedFile, std::ios::binary); + + OVT_ASSERT(generatedStream.is_open(), "Failure to open generated ebml stream for reading"); + OVT_ASSERT(expectedStream.is_open(), "Failure to open reference stream for reading"); + + char generatedChar; + char expectedChar; + + while (expectedStream.get(expectedChar)) + { + OVT_ASSERT(generatedStream.get(generatedChar), "Failure to retrieve a char to match"); + OVT_ASSERT(generatedChar == expectedChar, "Failure to match expected char to generated char"); + } + + // last check to verify the expected file has no additional line + OVT_ASSERT(!generatedStream.get(generatedChar), "Failure to match expected file size and generated file size"); + + return EXIT_SUCCESS; +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/CMakeLists.txt new file mode 100755 index 0000000..5b4ad2a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/CMakeLists.txt @@ -0,0 +1,89 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### +PROJECT(openvibe-module-fs-test-utf) +SET_BUILD_PLATFORM() + +ADD_EXECUTABLE(${PROJECT_NAME} uoFilesTestUTF.cpp) + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEModuleFS") +INCLUDE("FindThirdPartyBoost") +#INCLUDE("FindThirdPartyBoost_System") +INCLUDE("FindThirdPartyBoost_FileSystem") + +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) # Place project in folder unit-test (for some IDE) + +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${GTEST_BOTH_LIBRARIES}) + +ADD_DEFINITIONS("-DDATA_DIR=\"${CMAKE_CURRENT_SOURCE_DIR}/data\"") +ADD_DEFINITIONS("-DTMP_DIR=\"${OVT_TEST_TEMPORARY_DIR}\"") +ADD_TEST(NAME uoFSTestUTF COMMAND ${PROJECT_NAME}) + +PROJECT(openvibe-module-fs-test) + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ---------------------- +# Configure test target +# ---------------------- + +# Test that needs to called with parameters +SET(TEST_WITH_PARAM + uoEntryEnumeratorTest.cpp + uoFilesTest.cpp +) + +# Test that needs to called without parameters +SET(TEST_NO_PARAM +) + +# Create test sources list +# This macro auto-generate ${PROJECT_NAME}.cpp +# in the build tree. ${PROJECT_NAME}.cpp is +# the test driver called by ctest to run +# the different tests added to this target. +CREATE_TEST_SOURCELIST (Tests + ${PROJECT_NAME}.cpp + ${TEST_WITH_PARAM} + ${TEST_NO_PARAM} + ) + +ADD_EXECUTABLE(${PROJECT_NAME} ${Tests}) +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEModuleFS") +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OVT_UNIT_TOOLKIT_LIB} ${OV_MODULE_FS}) + +# Add test without parameter to driver +FOREACH(test ${TEST_NO_PARAM}) + GET_FILENAME_COMPONENT(TName ${test} NAME_WE) + ADD_TEST(NAME ${TName} COMMAND ${PROJECT_NAME} ${TName}) +ENDFOREACH() + +# Add test with parameter to driver +ADD_TEST(NAME uoEntryEnumeratorTest COMMAND ${PROJECT_NAME} uoEntryEnumeratorTest "${CMAKE_CURRENT_SOURCE_DIR}/data/") +ADD_TEST(NAME uoFilesTest COMMAND ${PROJECT_NAME} uoFilesTest "${OVT_TEST_TEMPORARY_DIR}") diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/data/test1.txt b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/data/test1.txt new file mode 100755 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/data/test2.txt b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/data/test2.txt new file mode 100755 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/data/toto.md b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/data/toto.md new file mode 100755 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/data/オッペンヴィベ/file.txt b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/data/オッペンヴィベ/file.txt new file mode 100644 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/data/オッペンヴィベ/日本語.txt b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/data/オッペンヴィベ/日本語.txt new file mode 100644 index 0000000..e69de29 diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/uoEntryEnumeratorTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/uoEntryEnumeratorTest.cpp new file mode 100755 index 0000000..d1d288d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/uoEntryEnumeratorTest.cpp @@ -0,0 +1,96 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include +#include + +#include + +#include "ovtAssert.h" + +class EntryEnumeratorCallBack final : public FS::IEntryEnumeratorCallBack +{ +public: + + bool callback(FS::IEntryEnumerator::IEntry& rEntry, FS::IEntryEnumerator::IAttributes& rAttributes) override + { + if (rAttributes.isFile()) { m_files.push_back(rEntry.getName()); } + return true; + } + + void release() { m_files.clear(); } + + std::vector m_files; +}; + +int uoEntryEnumeratorTest(int /*argc*/, char* argv[]) +{ + const std::string dataDirectory = argv[1]; + + EntryEnumeratorCallBack cb; + FS::IEntryEnumerator* enumerator = createEntryEnumerator(cb); + enumerator->enumerate((dataDirectory + "*.txt").c_str()); + + OVT_ASSERT(cb.m_files.size() == 2, "Failure to enumerate with wildcard prefix"); + + cb.release(); + + // test wildcard after + enumerator->enumerate((dataDirectory + "test*").c_str()); + + OVT_ASSERT(cb.m_files.size() == 2, "Failure to enumerate with wildcard suffix"); + + cb.release(); + + // test wildcard after + enumerator->enumerate((dataDirectory + "t*").c_str()); + + OVT_ASSERT(cb.m_files.size() == 3, "Failure to enumerate with single letter"); + + cb.release(); + + // test wildcard before and after + enumerator->enumerate((dataDirectory + "*oto*").c_str()); + + OVT_ASSERT(cb.m_files.size() == 1, "Failure to enumerate with englobing wildcards"); + OVT_ASSERT_STREQ(cb.m_files[0], std::string(dataDirectory + "toto.md"), "Failure to enumerate with englobing wildcards"); + + cb.release(); + + // test wildcard in middle + enumerator->enumerate((dataDirectory + "test1*xt").c_str()); + + OVT_ASSERT(cb.m_files.size() == 1, "Failure to enumerate with middle wildcard"); + OVT_ASSERT_STREQ(cb.m_files[0], std::string(dataDirectory + "test1.txt"), "Failure to enumerate with middle wildcard"); + + cb.release(); + + // error case: no wildcard + enumerator->enumerate((dataDirectory + "t").c_str()); + + OVT_ASSERT(cb.m_files.empty(), "Failure to enumerate with no wildcard"); + + cb.release(); + + enumerator->release(); + + return EXIT_SUCCESS; +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/uoFilesTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/uoFilesTest.cpp new file mode 100755 index 0000000..68a45cb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/uoFilesTest.cpp @@ -0,0 +1,127 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include + +#include + +#include "ovtAssert.h" +#include + +int uoFilesTest(int /*argc*/, char* argv[]) +{ + std::string outputDirectory = argv[1]; + + OVT_ASSERT(FS::Files::directoryExists(outputDirectory.c_str()), "Failure to find test data directory"); + + std::string testDir = outputDirectory + "uoFilesTest"; + std::string testFile = testDir + "/uoFilesTest.txt"; + + // test path creation + + FS::Files::createParentPath(testFile.c_str()); + OVT_ASSERT(FS::Files::directoryExists(testDir.c_str()), "Failure to create directory"); + OVT_ASSERT(!FS::Files::fileExists(testFile.c_str()), "Failure to create parent path only"); + + // test path retrieval methods + + char parentPathFromFile[1024]; + FS::Files::getParentPath(testFile.c_str(), parentPathFromFile); + OVT_ASSERT_STREQ(std::string(parentPathFromFile), testDir, "Failure to retrieve parent path from full path"); + + char parentPathFromDir[1024]; + FS::Files::getParentPath(testDir.c_str(), parentPathFromDir); + std::cout << parentPathFromDir << " " << outputDirectory << std::endl; + OVT_ASSERT_STREQ((std::string(parentPathFromDir) + "/"), outputDirectory, "Failure to retrieve parent path from path with no slash"); + + testDir += "/"; // adding a slash should now give testDir as parent + FS::Files::getParentPath(testDir.c_str(), parentPathFromDir); + OVT_ASSERT_STREQ((std::string(parentPathFromDir) + "/"), testDir, "Failure to retrieve parent path from path with slash"); + + char filename[256]; + FS::Files::getFilename(testFile.c_str(), filename); + OVT_ASSERT_STREQ(std::string(filename), std::string("uoFilesTest.txt"), "Failure to retrieve filename from full path"); + + FS::Files::getFilenameWithoutExtension(testFile.c_str(), filename); + OVT_ASSERT_STREQ(std::string(filename), std::string("uoFilesTest"), "Failure to retrieve filename with no extension from full path"); + + // test file creation and opening + + std::ofstream ostream; + FS::Files::openOFStream(ostream, testFile.c_str()); + OVT_ASSERT(FS::Files::fileExists(testFile.c_str()), "Failure to create file"); + OVT_ASSERT(ostream.is_open(), "Failure to open file"); + ostream.close(); + + std::string testFileInMissingnDir = testDir + "/newDir/uoFilesTest.txt"; + FS::Files::openOFStream(ostream, testFileInMissingnDir.c_str()); + OVT_ASSERT(!FS::Files::fileExists(testFileInMissingnDir.c_str()), "Failure to check for non-existing file"); + + std::ifstream istream; + FS::Files::openIFStream(istream, testFile.c_str()); + OVT_ASSERT(istream.is_open(), "Failure to open file in an input stream"); + istream.close(); + + std::fstream fstream; + FS::Files::openFStream(fstream, testFile.c_str(), std::ios_base::out); + OVT_ASSERT(fstream.is_open(), "Failure to open file in a generic stream"); + fstream.close(); + + auto file = FS::Files::open(testFile.c_str(), "r"); + OVT_ASSERT(file != nullptr, "Failure to open file in a FILE object"); + + file = FS::Files::open(testFileInMissingnDir.c_str(), "r"); + OVT_ASSERT(file == nullptr, "Failure to return NULL FILE object for non-existing file"); + + testDir = outputDirectory + "uoFilesTest2/long spaced/path"; + FS::Files::createPath(testDir.c_str()); + OVT_ASSERT(FS::Files::directoryExists(testDir.c_str()), "Failure to create directory with path containing spaces"); + + // test equality + + OVT_ASSERT(!FS::Files::equals(testFile.c_str(), testFileInMissingnDir.c_str()), "Failure to compare different files"); + OVT_ASSERT(FS::Files::equals(testFile.c_str(), testFile.c_str()), "Failure to compare same files"); + + + // test folder copy + + std::string testFile2 = outputDirectory + "uoFilesTest" + "/uoFilesTestChild/uoFilesTest.txt"; + std::string testTargetDir = outputDirectory + "uoFilesTestCopy"; + std::string testTargetFile1 = testTargetDir + "/uoFilesTest.txt"; + std::string testTargetFile2 = testTargetDir + "/uoFilesTestChild/uoFilesTest.txt"; + // create a subfolder with file + FS::Files::createParentPath(testFile2.c_str()); + std::ofstream ostream2; + FS::Files::openOFStream(ostream2, testFile2.c_str()); + OVT_ASSERT(FS::Files::fileExists(testFile2.c_str()), "Failure to create file in subfolder"); + OVT_ASSERT(ostream2.is_open(), "Failure to open file"); + ostream2.close(); + // copy folder + testDir = outputDirectory + "uoFilesTest"; + FS::Files::copyDirectory(testDir.c_str(), testTargetDir.c_str()); + OVT_ASSERT(FS::Files::directoryExists(testTargetDir.c_str()), "Failure in copying folder"); + OVT_ASSERT(FS::Files::fileExists(testTargetFile1.c_str()), "Failure in copying child files of the folder"); + OVT_ASSERT(FS::Files::fileExists(testTargetFile2.c_str()), "Failure in copying subfolder"); + // test folder copy on existing folder + OVT_ASSERT(!FS::Files::copyDirectory(testDir.c_str(), testTargetDir.c_str()), "Failure: Copy should not have been done if folder exits"); + + return EXIT_SUCCESS; +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/uoFilesTestUTF.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/uoFilesTestUTF.cpp new file mode 100644 index 0000000..931428f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-fs/uoFilesTestUTF.cpp @@ -0,0 +1,111 @@ +#include +#include +#include + +#include + +#include + +#define TEMP_OUTPUT_DIR TMP_DIR "/オッペンヴィベ" +#define TEMP_OUTPUT_DIR_COPY TMP_DIR "/オッペンヴィベ_Copy" +#define TEMP_OUTPUT_ASCII_FILE_PATH TEMP_OUTPUT_DIR "/file.txt" +#define TEMP_OUTPUT_UTF_FILE_PATH TEMP_OUTPUT_DIR "/日本語.txt" +#define TEMP_OUTPUT_UTF_FILE_PATH_COPY TEMP_OUTPUT_DIR_COPY "/日本語.txt" +#define TEMP_OUTPUT_ASCII_FILE_PATH_COPY TEMP_OUTPUT_DIR_COPY "/file.txt" + + +#define TEST_ASCII_FILE_PATH DATA_DIR "/オッペンヴィベ/file.txt" +#define TEST_UTF_FILE_PATH DATA_DIR "/オッペンヴィベ/日本語.txt" +#define TEST_ASCII_DIR DATA_DIR "/オッペンヴィベ" + + +TEST(FS_Files_Test_Directories_UTF, validateFileExists) +{ + ASSERT_TRUE(FS::Files::fileExists(TEST_ASCII_FILE_PATH)); + ASSERT_TRUE(FS::Files::fileExists(TEST_UTF_FILE_PATH)); + ASSERT_FALSE(FS::Files::fileExists(DATA_DIR "/オッペンヴィベ/file")); + ASSERT_FALSE(FS::Files::fileExists(DATA_DIR "/オッペンヴィベ/日本語")); +} + +TEST(FS_Files_Test_Directories_UTF, validateDirectoryExists) +{ + ASSERT_FALSE(FS::Files::directoryExists(DATA_DIR "/inexistent")); + ASSERT_TRUE(FS::Files::directoryExists(DATA_DIR "/オッペンヴィベ")); +} + +TEST(FS_Files_Test_Directories_UTF, validateGetParentPath) +{ + char parentPath[1024]; + ASSERT_TRUE(FS::Files::getParentPath(TEST_ASCII_FILE_PATH, parentPath)); + ASSERT_STREQ(DATA_DIR "/オッペンヴィベ", parentPath); +} + +TEST(FS_Files_Test_Directories_UTF, validateGetFileName) +{ + char fileName[1024]; + FS::Files::getFilename(TEST_ASCII_FILE_PATH, fileName); + ASSERT_STREQ("file.txt", fileName); + FS::Files::getFilename(TEST_UTF_FILE_PATH, fileName); + ASSERT_STREQ("日本語.txt", fileName); +} + +TEST(FS_Files_Test_Directories_UTF, validateGetFileNameWithoutExtension) +{ + char fileName[1024]; + FS::Files::getFilenameWithoutExtension(TEST_ASCII_FILE_PATH, fileName); + ASSERT_STREQ("file", fileName); + FS::Files::getFilenameWithoutExtension(TEST_UTF_FILE_PATH, fileName); + ASSERT_STREQ("日本語", fileName); +} + +TEST(FS_Files_Test_Directories_UTF, validateGetFileNameExtension) +{ + char extension[1024]; + FS::Files::getFilenameExtension(TEST_ASCII_FILE_PATH, extension); + ASSERT_STREQ(".txt", extension); + FS::Files::getFilenameExtension(TEST_UTF_FILE_PATH, extension); + ASSERT_STREQ(".txt", extension); +} + +TEST(FS_Files_Test_Directories_UTF, validateCreatePath) +{ + FS::Files::removeAll(TEMP_OUTPUT_DIR); + ASSERT_FALSE(FS::Files::directoryExists(TEMP_OUTPUT_DIR)); + ASSERT_TRUE(FS::Files::createPath(TEMP_OUTPUT_DIR)); + ASSERT_TRUE(FS::Files::directoryExists(TEMP_OUTPUT_DIR)); +} + +TEST(FS_Files_Test_Directories_UTF, validateCreateParentPath) +{ + FS::Files::removeAll(TEMP_OUTPUT_DIR); + ASSERT_FALSE(FS::Files::directoryExists(TEMP_OUTPUT_DIR)); + ASSERT_TRUE(FS::Files::createParentPath(TEMP_OUTPUT_DIR "/file.txt")); + ASSERT_TRUE(FS::Files::directoryExists(TEMP_OUTPUT_DIR)); +} + +#if BOOST_VERSION / 100 % 1000 >= 55 +TEST(FS_Files_Test_Directories_UTF, validateCopyFile) +{ + FS::Files::removeAll(TEMP_OUTPUT_ASCII_FILE_PATH); + FS::Files::createParentPath(TEMP_OUTPUT_ASCII_FILE_PATH); + + ASSERT_TRUE(FS::Files::copyFile(TEST_ASCII_FILE_PATH, TEMP_OUTPUT_ASCII_FILE_PATH)); + ASSERT_TRUE(FS::Files::fileExists(TEMP_OUTPUT_ASCII_FILE_PATH)); +} + +TEST(FS_Files_Test_Directories_UTF, validateCopyDirectory) +{ + ASSERT_TRUE(FS::Files::copyDirectory(TEST_ASCII_DIR, TEMP_OUTPUT_DIR_COPY)); + ASSERT_TRUE(FS::Files::fileExists(TEMP_OUTPUT_UTF_FILE_PATH_COPY)); + ASSERT_TRUE(FS::Files::fileExists(TEMP_OUTPUT_ASCII_FILE_PATH_COPY)); +} + +#endif + +int uoFSFilesTestUTF(int argc, char* argv[]) +{ + testing::InitGoogleTest(&argc, argv); + + ::testing::GTEST_FLAG(filter) = "FS_Files_Test_Directories_UTF.*"; + return RUN_ALL_TESTS(); +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-socket/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-socket/CMakeLists.txt new file mode 100755 index 0000000..088c055 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-socket/CMakeLists.txt @@ -0,0 +1,75 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +PROJECT(openvibe-module-socket-test) + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ---------------------- +# Configure test target +# ---------------------- + +# Test that needs to called with parameters +SET(TEST_WITH_PARAM + uoSocketClientServerBaseTest.cpp + uoSocketClientServerSyncCommunicationTest.cpp + uoSocketClientServerASyncCommunicationTest.cpp +) + +# Test that needs to called without parameters +SET(TEST_NO_PARAM +) + +# Create test sources list +# This macro auto-generate ${PROJECT_NAME}.cpp +# in the build tree. ${PROJECT_NAME}.cpp is +# the test driver called by ctest to run +# the different tests added to this target. +CREATE_TEST_SOURCELIST (Tests + ${PROJECT_NAME}.cpp + ${TEST_WITH_PARAM} + ${TEST_NO_PARAM} +) + +ADD_EXECUTABLE(${PROJECT_NAME} ${Tests}) +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEModuleSocket") +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OVT_UNIT_TOOLKIT_LIB} ${OV_MODULE_SOCKET}) + +# Add test without parameter to driver +FOREACH(test ${TEST_NO_PARAM}) + GET_FILENAME_COMPONENT(TName ${test} NAME_WE) + ADD_TEST(NAME ${TName} COMMAND ${PROJECT_NAME} ${TName}) +ENDFOREACH() + +# Add test with parameter to driver +SET(LOCALHOST "127.0.0.1") +SET(TEST_PORT "1024") +ADD_TEST(NAME uoSocketClientServerBaseTest COMMAND ${PROJECT_NAME} uoSocketClientServerBaseTest ${LOCALHOST} ${TEST_PORT}) +ADD_TEST(NAME uoSocketClientServerHostNameTest COMMAND ${PROJECT_NAME} uoSocketClientServerBaseTest "localhost" ${TEST_PORT}) +ADD_TEST(NAME uoSocketClientServerSyncCommunicationTest COMMAND ${PROJECT_NAME} uoSocketClientServerSyncCommunicationTest ${LOCALHOST} ${TEST_PORT} "1000") +ADD_TEST(NAME uoSocketClientServerASyncCommunicationTest COMMAND ${PROJECT_NAME} uoSocketClientServerASyncCommunicationTest ${LOCALHOST} ${TEST_PORT} "1000") diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-socket/uoSocketClientServerASyncCommunicationTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-socket/uoSocketClientServerASyncCommunicationTest.cpp new file mode 100755 index 0000000..ae431bf --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-socket/uoSocketClientServerASyncCommunicationTest.cpp @@ -0,0 +1,151 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include +#include +#include +#include +#include + +#include "socket/IConnection.h" +#include "socket/IConnectionClient.h" +#include "socket/IConnectionServer.h" + +#include "ovtAssert.h" + +namespace { +std::condition_variable gServerStartedCondVar; +std::mutex gServerStartedMutex; +std::vector gReceivedData; +bool gServerStarted = false; + +// server callback run from a child thread +void onServerListening(const int port, const size_t expectedPacketCount) +{ + gReceivedData.clear(); + + Socket::IConnection* clientConnection = nullptr; + + // create server + Socket::IConnectionServer* server = Socket::createConnectionServer(); + server->listen(port); + + // keep the scope braces here, as it ensures mutex is released + { + std::lock_guard lockOnServerStart(gServerStartedMutex); + gServerStarted = true; + } + + // notify main thread that the server is created so that it can connect a single client + gServerStartedCondVar.notify_one(); + + // loop until all packet are received + while (gReceivedData.size() < expectedPacketCount) + { + if (server->isReadyToReceive()) { clientConnection = server->accept(); } + + if (clientConnection && clientConnection->isReadyToReceive()) + { + size_t dataSize = 0; + size_t bytesToReceive = sizeof(dataSize); + size_t bytesReceived = 0; + char dataBuffer[32]; + + // first receive data size + while (bytesReceived < bytesToReceive) { bytesReceived += clientConnection->receiveBuffer(&dataSize, bytesToReceive - bytesReceived); } + + // then receive data + bytesToReceive = dataSize; + bytesReceived = 0; + + while (bytesReceived < bytesToReceive) { bytesReceived += clientConnection->receiveBuffer(dataBuffer, bytesToReceive - bytesReceived); } + + gReceivedData.push_back(std::string(dataBuffer, dataSize)); + } + } + + server->release(); +} + +void sendData(Socket::IConnectionClient* client, void* data, const size_t size) +{ + const size_t bytesToSend = size; + size_t bytesSent = 0; + + while (bytesSent < bytesToSend) { bytesSent += client->sendBuffer(data, bytesToSend - bytesSent); } +} +} // namespace + +int uoSocketClientServerASyncCommunicationTest(int argc, char* argv[]) +{ + OVT_ASSERT(argc == 4, "Failure to retrieve tests arguments. Expecting: server_name port_number packet_count"); + + const std::string serverName = argv[1]; + int portNumber = std::atoi(argv[2]); + size_t packetCount = size_t(std::atoi(argv[3])); + + // test asynchronous data transmission from a single client to server: + // - launch a server on a background thread + // - connect a single client + // - make client sending data + // - marke server receiving and storing data + // - join the thread and do the assertions on received data when no data race is possible + + // create client + Socket::IConnectionClient* client = Socket::createConnectionClient(); + + // launch server on background thread + std::thread serverThread(onServerListening, portNumber, packetCount); + + // wait until the server is started to connect clients + std::unique_lock lock(gServerStartedMutex); + gServerStartedCondVar.wait(lock, []() { return gServerStarted; }); + + client->connect(serverName.c_str(), portNumber); + + // transmit data + // transmission follows the protocol: data size transmission + data transmission + const std::string baseData = "Data packet index: "; + + for (size_t sendIndex = 0; sendIndex < packetCount; ++sendIndex) + { + std::string tmp = baseData + std::to_string(sendIndex); + size_t size = tmp.size(); + sendData(client, &size, sizeof(size)); + sendData(client, const_cast(tmp.c_str()), size); + } + + serverThread.join(); // wait until the end of the thread + + // release resources + client->close(); + client->release(); + + // do the assertion on the main thread + OVT_ASSERT(gReceivedData.size() == packetCount, "Failure to retrieve packet count"); + + for (size_t receivedIndex = 0; receivedIndex < packetCount; ++receivedIndex) + { + OVT_ASSERT_STREQ(gReceivedData[receivedIndex], (baseData + std::to_string(receivedIndex)), "Failure to retrieve packet"); + } + + return EXIT_SUCCESS; +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-socket/uoSocketClientServerBaseTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-socket/uoSocketClientServerBaseTest.cpp new file mode 100755 index 0000000..fb6f258 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-socket/uoSocketClientServerBaseTest.cpp @@ -0,0 +1,77 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include "socket/IConnection.h" +#include "socket/IConnectionClient.h" +#include "socket/IConnectionServer.h" + +#include "ovtAssert.h" + +int uoSocketClientServerBaseTest(int argc, char* argv[]) +{ + OVT_ASSERT(argc == 3, "Failure to retrieve tests arguments. Expecting: server_name port_number"); + + const std::string name = argv[1]; + char* end; + const size_t port = strtol(argv[2], &end, 10); + + // basic tests on server and clients + + Socket::IConnectionServer* server = Socket::createConnectionServer(); + Socket::IConnectionClient* client = Socket::createConnectionClient(); + + OVT_ASSERT(!server->isConnected(), "Failure to check for connection state before connection happens"); + OVT_ASSERT(server->listen(port) && server->isConnected(), "Failure to make socket listening for input connections"); + OVT_ASSERT(!server->listen(port), "Failure to generate connection error if the socket is already connected"); + OVT_ASSERT(!server->isReadyToReceive(), "Failure to check for readyness to receive when no client is connected"); + OVT_ASSERT(server->close() && !server->isConnected(), "Failure to close connection"); + OVT_ASSERT(!client->isConnected(), "Failure to check for connection state before connection happens"); + OVT_ASSERT(!client->connect(name.c_str(), port) && !client->isConnected(), "Failure to generate connection error due to no server currently running"); + OVT_ASSERT(server->listen(port), "Failure to make socket listening for input connections after a disconnection"); + OVT_ASSERT(!client->connect("bad_server_name", port) && !client->isConnected(), "Failure to generate connection error caused by wrong server name"); + OVT_ASSERT(!client->connect(name.c_str(), 0) && !client->isConnected(), "Failure to generate connection error caused by wrong port number"); + OVT_ASSERT(client->connect(name.c_str(), port) && client->isConnected(), "Failure to connect to server"); + OVT_ASSERT(client->close() && !client->isConnected(), "Failure to disconnect"); + + // Test method getSocketPort + + size_t guessedPort; + OVT_ASSERT(server->getSocketPort(guessedPort), "Failure to get socket informations"); + OVT_ASSERT(guessedPort == port, "Get Socket information should return server port."); + OVT_ASSERT(client->connect(name.c_str(), guessedPort) && client->isConnected(), "Failure to connect to server"); + OVT_ASSERT(client->close() && !client->isConnected(), "Failure to disconnect"); + OVT_ASSERT(server->close() && !server->isConnected(), "Failure to close connection"); + + // Test to connect using port 0 + + OVT_ASSERT(server->listen(0) && server->isConnected(), "Failure to make socket listening for input connections"); + OVT_ASSERT(server->getSocketPort(guessedPort), "Failure to get socket informations"); + OVT_ASSERT(client->connect(name.c_str(), guessedPort) && client->isConnected(), "Failure to connect to server"); + OVT_ASSERT(client->close() && !client->isConnected(), "Failure to disconnect"); + OVT_ASSERT(server->close() && !server->isConnected(), "Failure to close connection"); + + // Release ressources + + server->release(); + client->release(); + + return EXIT_SUCCESS; +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-socket/uoSocketClientServerSyncCommunicationTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-socket/uoSocketClientServerSyncCommunicationTest.cpp new file mode 100755 index 0000000..2ce1aff --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-socket/uoSocketClientServerSyncCommunicationTest.cpp @@ -0,0 +1,151 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include +#include +#include +#include +#include + +#include "socket/IConnection.h" +#include "socket/IConnectionClient.h" +#include "socket/IConnectionServer.h" + +#include "ovtAssert.h" + +namespace { +std::condition_variable gServerStartedCondVar; +std::mutex gServerStartedMutex; +std::condition_variable gClientConnectedCondVar; +std::mutex gClientConnectedMutex; +std::vector gReceivedData; +bool gServerStarted = false; +bool gClientConnected = false; + +// server callback run from a child thread +void onServerListening(const int port, const size_t packetCount) +{ + // only the server side modifies gReceivedData thus no need to handle race condition + gReceivedData.clear(); + + Socket::IConnection* clientConnection = nullptr; + + // create server + Socket::IConnectionServer* server = Socket::createConnectionServer(); + server->listen(port); + + // keep the scope braces here, as it ensures mutex is released + { + std::lock_guard lockOnServerStart(gServerStartedMutex); + gServerStarted = true; + } + + gServerStartedCondVar.notify_one(); + + // connect clients + while (!clientConnection) { if (server->isReadyToReceive()) { clientConnection = server->accept(); } } + + // keep the scope braces here, as it ensures mutex is released + { + std::lock_guard lockOnClientConnected(gClientConnectedMutex); + gClientConnected = true; + } + + gClientConnectedCondVar.notify_one(); + + while (gReceivedData.size() < packetCount) + { + if (clientConnection->isReadyToReceive()) + { + size_t dataSize = 0; + char dataBuffer[64]; + clientConnection->receiveBufferBlocking(&dataSize, sizeof(dataSize)); + clientConnection->receiveBufferBlocking(dataBuffer, dataSize); + gReceivedData.push_back(std::string(dataBuffer, dataSize)); + } + } + + server->release(); +} +} // namespace + +int uoSocketClientServerSyncCommunicationTest(int argc, char* argv[]) +{ + OVT_ASSERT(argc == 4, "Failure to retrieve tests arguments. Expecting: server_name port_number packet_count"); + + const std::string serverName = argv[1]; + char* end; + const size_t port = strtol(argv[2], &end, 10); + size_t packetCount = strtol(argv[3], &end, 10); + + // test synchronous data transmission from a single client to server: + // - launch a server on a background thread + // - connect single client + // - make client sending data + // - make server receiving and storing data + // - join the thread and do assertions on received data in the main thread + + // create a client + Socket::IConnectionClient* client = Socket::createConnectionClient(); + + // launch server on background thread + std::thread serverThread(onServerListening, port, packetCount); + + // wait until the server is started to connect client + std::unique_lock lockOnServerStart(gServerStartedMutex); + gServerStartedCondVar.wait(lockOnServerStart, []() { return gServerStarted; }); + + + client->connect(serverName.c_str(), port); + + // wait until the connection is made to transmit data + std::unique_lock lockOnClientConnected(gClientConnectedMutex); + gClientConnectedCondVar.wait(lockOnClientConnected, []() { return gClientConnected; }); + + // transmit data + // transmission follows the protocol: data size transmission + data transmission + const std::string baseData = "Data packet index: "; + + for (size_t sendIndex = 0; sendIndex < packetCount; ++sendIndex) + { + std::string dataString = baseData + std::to_string(sendIndex); + size_t dataSize = dataString.size(); + + client->sendBufferBlocking(&dataSize, sizeof(dataSize)); + client->sendBufferBlocking(dataString.c_str(), dataSize); + } + + serverThread.join(); // wait until the end of the thread + + // release resources + client->close(); + client->release(); + + // do the assertion on the main thread + OVT_ASSERT(gReceivedData.size() == packetCount, "Failure to retrieve packet count"); + + for (size_t receivedIndex = 0; receivedIndex < packetCount; ++receivedIndex) + { + OVT_ASSERT_STREQ(gReceivedData[receivedIndex], (baseData + std::to_string(receivedIndex)), "Failure to retrieve packet"); + } + + return EXIT_SUCCESS; +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-system/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-system/CMakeLists.txt new file mode 100755 index 0000000..cec604c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-system/CMakeLists.txt @@ -0,0 +1,68 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +PROJECT(openvibe-module-system-test) + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ---------------------- +# Configure test target +# ---------------------- + +# Test that needs to called with parameters +SET(TEST_WITH_PARAM +) + +# Test that needs to called without parameters +SET(TEST_NO_PARAM + uoTimeTest.cpp + uoDynamicModuleTest.cpp +) + +# Create test sources list +# This macro auto-generate ${PROJECT_NAME}.cpp +# in the build tree. ${PROJECT_NAME}.cpp is +# the test driver called by ctest to run +# the different tests added to this target. +CREATE_TEST_SOURCELIST (Tests + ${PROJECT_NAME}.cpp + ${TEST_WITH_PARAM} + ${TEST_NO_PARAM} +) + +ADD_EXECUTABLE(${PROJECT_NAME} ${Tests}) +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEModuleSystem") +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OVT_UNIT_TOOLKIT_LIB} ${OV_LIBS} ${GTEST_BOTH_LIBRARIES}) + +# Add test without parameter to driver +FOREACH(test ${TEST_NO_PARAM}) + GET_FILENAME_COMPONENT(TName ${test} NAME_WE) + ADD_TEST(NAME ${TName} COMMAND ${PROJECT_NAME} ${TName}) +ENDFOREACH() + +# Add test with parameter to driver diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-system/uoDynamicModuleTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-system/uoDynamicModuleTest.cpp new file mode 100755 index 0000000..7bfd85e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-system/uoDynamicModuleTest.cpp @@ -0,0 +1,360 @@ +/********************************************************************* + * Software License Agreement (AGPL-3 License) + * + * OpenViBE SDK Test Software + * Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 + * Copyright (C) Inria, 2015-2017,V1.0 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. + * If not, see . + */ + +#include "gtest/gtest.h" + +#include "system/ovCDynamicModule.h" + +#if defined TARGET_OS_Windows +#include +#endif + +#include + +namespace { +#if defined TARGET_OS_Windows +//const std::string LIB_PATH = OV_CMAKE_PATH_LIB; + +// Microsoft specific +const std::string EXISTING_MODULE_NAME = "NTDLL.dll"; + +std::string existingModulePath; + +#if defined _WIN64 +#define CSIDL_SYSTEM_PLATFORM CSIDL_SYSTEM +#else + #define CSIDL_SYSTEM_PLATFORM CSIDL_SYSTEMX86 +#endif + +std::string existingModulePathName; +const std::string NON_EXISTING_MODULE_NAME = "randomRandomRandom.dll"; +const std::string NON_EXISTING_SYMBOL = "nonExistingSymbol"; +const std::string EXISTING_ENVIRONMENT_PATH = "PATH"; +const std::string EXISTING_REGISTRY_MODULE_NAME = EXISTING_MODULE_NAME; +const std::string SYMBOL_NAME_NTDLL = "toupper"; + +const HKEY EXISTING_REGISTRY_KEY = HKEY_LOCAL_MACHINE; // 0x80000002 +const HKEY NON_EXISTING_REGISTRY_KEY = HKEY(ULONG_PTR(LONG(0x800000FF))); + +const std::string EXISTING_REGISTRY_PATH = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer"; // Present on all Windows versions +const std::string NON_EXISTING_REGISTRY_PATH = "SOFTWARE\\Random\\Random\\Random"; + +int (*toupperSymbol)(int c); +bool (*randomRandomRandomSymbol)(int number); + +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS +static const std::string EXISTING_SYMBOL = "createCSVLib"; +static const std::string NON_EXISTING_SYMBOL = "nonExistingSymbol"; +static const std::string LIB_PATH = OV_CMAKE_PATH_LIB; +static const std::string EXISTING_MODULE_NAME = "libopenvibe-module-csv.so"; +static const std::string existingModulePath = LIB_PATH + "/"; +static const std::string existingModulePathName = existingModulePath + EXISTING_MODULE_NAME; +static const std::string NON_EXISTING_MODULE_NAME = "randomRandomRandom.so"; +#endif +} // namespace + +#if defined TARGET_OS_Windows +TEST(DynamicModule_Test_Case, loadFromExistingSuccessNoSymbolCheck) +{ + System::CDynamicModule dynamicModule; + + ASSERT_TRUE(dynamicModule.loadFromExisting(EXISTING_MODULE_NAME.c_str())); + ASSERT_TRUE(dynamicModule.isLoaded()); + std::string moduleNameExpected = EXISTING_MODULE_NAME; + std::string moduleName = dynamicModule.getFilename(); + std::transform(moduleNameExpected.begin(), moduleNameExpected.end(), moduleNameExpected.begin(), tolower); + std::transform(moduleName.begin(), moduleName.end(), moduleName.begin(), tolower); + ASSERT_STREQ(moduleNameExpected.c_str(), moduleName.c_str()); + + ASSERT_TRUE(dynamicModule.unload()); +} +#endif + +#if defined TARGET_OS_Windows +TEST(DynamicModule_Test_Case, loadFromExistingFailNoSymbolCheck) +{ + System::CDynamicModule dynamicModule; + + ASSERT_FALSE(dynamicModule.loadFromExisting(NON_EXISTING_MODULE_NAME.c_str())); + ASSERT_EQ(System::CDynamicModule::LogErrorCodes_FailToLoadModule, dynamicModule.getLastError()); + ASSERT_FALSE(dynamicModule.isLoaded()); +} +#endif + +TEST(DynamicModule_Test_Case, loadFromPathSuccessNoSymbolCheck) +{ + System::CDynamicModule dynamicModule; + + ASSERT_TRUE(dynamicModule.loadFromPath(existingModulePathName.c_str())); + ASSERT_TRUE(dynamicModule.isLoaded()); + std::string moduleNameExpected = existingModulePathName; + std::string moduleName = dynamicModule.getFilename(); + std::transform(moduleNameExpected.begin(), moduleNameExpected.end(), moduleNameExpected.begin(), tolower); + std::transform(moduleName.begin(), moduleName.end(), moduleName.begin(), tolower); + ASSERT_STREQ(moduleNameExpected.c_str(), moduleName.c_str()); + + ASSERT_TRUE(dynamicModule.unload()); +} + +TEST(DynamicModule_Test_Case, loadFromPathFailNoSymbolCheck) +{ + System::CDynamicModule dynamicModule; + + ASSERT_FALSE(dynamicModule.loadFromPath(NON_EXISTING_MODULE_NAME.c_str())); + ASSERT_EQ(System::CDynamicModule::LogErrorCodes_FailToLoadModule, dynamicModule.getLastError()); + ASSERT_FALSE(dynamicModule.isLoaded()); +} + +#if defined TARGET_OS_Windows // Must be tested on Linux +TEST(DynamicModule_Test_Case, loadFromPathSuccessSymbolCheck) +{ + System::CDynamicModule dynamicModule; + + ASSERT_TRUE(dynamicModule.loadFromPath(existingModulePathName.c_str(), SYMBOL_NAME_NTDLL.c_str())); + ASSERT_TRUE(dynamicModule.isLoaded()); + std::string moduleNameExpected = existingModulePathName; + std::string moduleName = dynamicModule.getFilename(); + std::transform(moduleNameExpected.begin(), moduleNameExpected.end(), moduleNameExpected.begin(), tolower); + std::transform(moduleName.begin(), moduleName.end(), moduleName.begin(), tolower); + ASSERT_STREQ(moduleNameExpected.c_str(), moduleName.c_str()); + + ASSERT_TRUE(dynamicModule.unload()); +} +#endif + +TEST(DynamicModule_Test_Case, loadFromPathSymbolCheckFail) +{ + System::CDynamicModule dynamicModule; + + ASSERT_FALSE(dynamicModule.loadFromPath(existingModulePathName.c_str(), NON_EXISTING_SYMBOL.c_str())); + ASSERT_EQ(System::CDynamicModule::LogErrorCodes_InvalidSymbol, dynamicModule.getLastError()); + ASSERT_FALSE(dynamicModule.isLoaded()); +} + +#if defined TARGET_OS_Windows +TEST(DynamicModule_Test_Case, loadFromKnownPathSuccessNoSymbolCheck) +{ + System::CDynamicModule dynamicModule; + + ASSERT_TRUE(dynamicModule.loadFromKnownPath(CSIDL_SYSTEM_PLATFORM, EXISTING_MODULE_NAME.c_str())); + ASSERT_TRUE(dynamicModule.isLoaded()); + std::string moduleNameExpected = existingModulePathName; + std::string moduleName = dynamicModule.getFilename(); + std::transform(moduleNameExpected.begin(), moduleNameExpected.end(), moduleNameExpected.begin(), tolower); + std::transform(moduleName.begin(), moduleName.end(), moduleName.begin(), tolower); + ASSERT_STREQ(moduleNameExpected.c_str(), moduleName.c_str()); + + ASSERT_TRUE(System::CDynamicModuleSymbolLoader::getSymbol<>(dynamicModule, SYMBOL_NAME_NTDLL.c_str(), &toupperSymbol)); + + ASSERT_TRUE(dynamicModule.unload()); +} + +TEST(DynamicModule_Test_Case, loadFromKnownPathFailNoSymbolCheck) +{ + System::CDynamicModule dynamicModule; + + ASSERT_FALSE(dynamicModule.loadFromKnownPath(CSIDL_SYSTEM_PLATFORM, NON_EXISTING_MODULE_NAME.c_str())); + ASSERT_EQ(System::CDynamicModule::LogErrorCodes_FailToLoadModule, dynamicModule.getLastError()); + ASSERT_FALSE(dynamicModule.isLoaded()); +} +#endif + +#if defined TARGET_OS_Windows +TEST(DynamicModule_Test_Case, loadFromEnvironmentSuccessNoSymbolCheck) +{ + System::CDynamicModule dynamicModule; + + ASSERT_TRUE(dynamicModule.loadFromEnvironment(EXISTING_ENVIRONMENT_PATH.c_str(), EXISTING_MODULE_NAME.c_str())); + ASSERT_TRUE(dynamicModule.isLoaded()); + std::string moduleNameExpected = "C:\\WINDOWS\\system32\\ntdll.dll"; + std::string moduleName = dynamicModule.getFilename(); + std::transform(moduleNameExpected.begin(), moduleNameExpected.end(), moduleNameExpected.begin(), tolower); + std::transform(moduleName.begin(), moduleName.end(), moduleName.begin(), tolower); + ASSERT_STREQ(moduleNameExpected.c_str(), moduleName.c_str()); + ASSERT_TRUE(System::CDynamicModuleSymbolLoader::getSymbol<>(dynamicModule, SYMBOL_NAME_NTDLL.c_str(), &toupperSymbol)); + + ASSERT_TRUE(dynamicModule.unload()); +} + +TEST(DynamicModule_Test_Case, loadFromEnvironmentFailNoSymbolCheck) +{ + System::CDynamicModule dynamicModule; + + ASSERT_FALSE(dynamicModule.loadFromEnvironment(EXISTING_ENVIRONMENT_PATH.c_str(), NON_EXISTING_MODULE_NAME.c_str())); + ASSERT_EQ(System::CDynamicModule::LogErrorCodes_ModuleNotFound, dynamicModule.getLastError()); + ASSERT_FALSE(dynamicModule.isLoaded()); +} +#endif + +#if defined TARGET_OS_Windows +TEST(DynamicModule_Test_Case, loadFromRegistrySuccessNoSymbolCheck) +{ + System::CDynamicModule dynamicModule; + + ASSERT_TRUE( + dynamicModule.loadFromRegistry(EXISTING_REGISTRY_KEY, EXISTING_REGISTRY_PATH.c_str(), nullptr, KEY_READ | KEY_WOW64_64KEY, EXISTING_REGISTRY_MODULE_NAME + .c_str())); + ASSERT_TRUE(dynamicModule.isLoaded()); + std::string moduleNameExpected = EXISTING_MODULE_NAME; + std::string moduleName = dynamicModule.getFilename(); + std::transform(moduleNameExpected.begin(), moduleNameExpected.end(), moduleNameExpected.begin(), tolower); + std::transform(moduleName.begin(), moduleName.end(), moduleName.begin(), tolower); + ASSERT_STREQ(moduleNameExpected.c_str(), moduleName.c_str()); + + ASSERT_TRUE(System::CDynamicModuleSymbolLoader::getSymbol<>(dynamicModule, SYMBOL_NAME_NTDLL.c_str(), &toupperSymbol)); + + ASSERT_TRUE(dynamicModule.unload()); +} + +TEST(DynamicModule_Test_Case, loadFromRegistrySuccessSymbolCheck) +{ + System::CDynamicModule dynamicModule; + + ASSERT_TRUE( + dynamicModule.loadFromRegistry(EXISTING_REGISTRY_KEY, EXISTING_REGISTRY_PATH.c_str(), nullptr, KEY_READ | KEY_WOW64_64KEY, EXISTING_REGISTRY_MODULE_NAME + .c_str(), SYMBOL_NAME_NTDLL.c_str())); + ASSERT_TRUE(dynamicModule.isLoaded()); + std::string moduleNameExpected = EXISTING_MODULE_NAME; + std::string moduleName = dynamicModule.getFilename(); + std::transform(moduleNameExpected.begin(), moduleNameExpected.end(), moduleNameExpected.begin(), tolower); + std::transform(moduleName.begin(), moduleName.end(), moduleName.begin(), tolower); + ASSERT_STREQ(moduleNameExpected.c_str(), moduleName.c_str()); + + ASSERT_TRUE(System::CDynamicModuleSymbolLoader::getSymbol<>(dynamicModule, SYMBOL_NAME_NTDLL.c_str(), &toupperSymbol)); + + ASSERT_TRUE(dynamicModule.unload()); +} + +TEST(DynamicModule_Test_Case, loadFromRegistryFailNoSymbolCheck) +{ + System::CDynamicModule dynamicModule; + + ASSERT_FALSE( + dynamicModule.loadFromRegistry(NON_EXISTING_REGISTRY_KEY, EXISTING_REGISTRY_PATH.c_str(), nullptr, KEY_READ | KEY_WOW64_32KEY, + EXISTING_REGISTRY_MODULE_NAME.c_str())); + ASSERT_FALSE(dynamicModule.isLoaded()); + + ASSERT_FALSE( + dynamicModule.loadFromRegistry(EXISTING_REGISTRY_KEY, NON_EXISTING_REGISTRY_PATH.c_str(), nullptr, KEY_READ | KEY_WOW64_32KEY, + EXISTING_REGISTRY_MODULE_NAME.c_str())); + ASSERT_FALSE(dynamicModule.isLoaded()); + + ASSERT_FALSE( + dynamicModule.loadFromRegistry(NON_EXISTING_REGISTRY_KEY, EXISTING_REGISTRY_PATH.c_str(), nullptr, KEY_READ | KEY_WOW64_32KEY, + EXISTING_REGISTRY_MODULE_NAME.c_str())); + ASSERT_FALSE(dynamicModule.isLoaded()); +} +#endif + +#if defined TARGET_OS_Windows // Must be tested on Linux +TEST(DynamicModule_Test_Case, getSymbolSuccess) +{ + System::CDynamicModule dynamicModule; + + ASSERT_TRUE(dynamicModule.loadFromPath(existingModulePathName.c_str())); + ASSERT_TRUE(dynamicModule.isLoaded()); + std::string moduleNameExpected = existingModulePathName; + std::string moduleName = dynamicModule.getFilename(); + std::transform(moduleNameExpected.begin(), moduleNameExpected.end(), moduleNameExpected.begin(), tolower); + std::transform(moduleName.begin(), moduleName.end(), moduleName.begin(), tolower); + ASSERT_STREQ(moduleNameExpected.c_str(), moduleName.c_str()); + ASSERT_TRUE(System::CDynamicModuleSymbolLoader::getSymbol<>(dynamicModule, SYMBOL_NAME_NTDLL.c_str(), &toupperSymbol)); + + const char lowerCase = 'r'; + char upperCase = char(toupperSymbol(lowerCase)); + + ASSERT_EQ(upperCase, 'R'); + + ASSERT_TRUE(dynamicModule.unload()); +} + +TEST(DynamicModule_Test_Case, getSymbolFail) +{ + System::CDynamicModule dynamicModule; + + ASSERT_TRUE(dynamicModule.loadFromPath(existingModulePathName.c_str())); + ASSERT_TRUE(dynamicModule.isLoaded()); + std::string moduleNameExpected = existingModulePathName; + std::string moduleName = dynamicModule.getFilename(); + std::transform(moduleNameExpected.begin(), moduleNameExpected.end(), moduleNameExpected.begin(), tolower); + std::transform(moduleName.begin(), moduleName.end(), moduleName.begin(), tolower); + ASSERT_STREQ(moduleNameExpected.c_str(), moduleName.c_str()); + ASSERT_FALSE(System::CDynamicModuleSymbolLoader::getSymbol<>(dynamicModule, NON_EXISTING_SYMBOL.c_str(), &randomRandomRandomSymbol)); +} +#endif + +#if defined TARGET_OS_Windows +TEST(DynamicModule_Test_Case, isModulecompatibleSuccess) +{ +#if defined _WIN64 + ASSERT_FALSE(System::CDynamicModule::isModuleCompatible(existingModulePathName.c_str(), 0x014c)); // x86 + ASSERT_TRUE(System::CDynamicModule::isModuleCompatible(existingModulePathName.c_str(), 0x8664)); // x64 + ASSERT_FALSE(System::CDynamicModule::isModuleCompatible(existingModulePathName.c_str(), 0x0200)); // ia64 +#else + ASSERT_TRUE(System::CDynamicModule::isModuleCompatible(existingModulePathName.c_str(), 0x014c)); // x86 + ASSERT_FALSE(System::CDynamicModule::isModuleCompatible(existingModulePathName.c_str(), 0x8664)); // x64 + ASSERT_FALSE(System::CDynamicModule::isModuleCompatible(existingModulePathName.c_str(), 0x0200)); // ia64 +#endif +} +#endif + +#if defined TARGET_OS_Windows +TEST(DynamicModule_Test_Case, isModulecompatibleFail) +{ + System::CDynamicModule dynamicModule; + + ASSERT_FALSE(dynamicModule.loadFromPath(NON_EXISTING_MODULE_NAME.c_str())); + ASSERT_FALSE(dynamicModule.isLoaded()); +} +#endif + +TEST(DynamicModule_Test_Case, unloadSuccess) +{ + System::CDynamicModule dynamicModule; + + ASSERT_TRUE(dynamicModule.loadFromPath(existingModulePathName.c_str())); + ASSERT_TRUE(dynamicModule.unload()); +} + +TEST(DynamicModule_Test_Case, unloadFail) +{ + System::CDynamicModule dynamicModule; + + ASSERT_FALSE(dynamicModule.loadFromPath(NON_EXISTING_MODULE_NAME.c_str())); + ASSERT_FALSE(dynamicModule.isLoaded()); + ASSERT_FALSE(dynamicModule.unload()); +} + +int uoDynamicModuleTest(int argc, char* argv[]) +{ + testing::InitGoogleTest(&argc, argv); + +#if defined TARGET_OS_Windows + BOOL bIsWow64 = FALSE; + + if (!IsWow64Process(GetCurrentProcess(), &bIsWow64)) { return false; } + + existingModulePath = bIsWow64 ? "C:\\WINDOWS\\SysWOW64\\" : "C:\\WINDOWS\\system32\\"; + existingModulePathName = existingModulePath + EXISTING_MODULE_NAME; +#endif + + return RUN_ALL_TESTS(); +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-system/uoTimeTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-system/uoTimeTest.cpp new file mode 100755 index 0000000..df7c193 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-system/uoTimeTest.cpp @@ -0,0 +1,218 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include +#include +#include +#include +#include +#include + +#include "openvibe/CTime.hpp" +#include "system/ovCTime.h" + +#include "ovtAssert.h" + +// +// \note This test should be improved. Some improvements could be: +// - Compare clock results to gold standard +// - True testing of monotonic state +// - Stress tests on longer period +// + +// \brief Calibrate sleep function to estimate the extra time not spent at sleeping +uint64_t calibrateSleep(const size_t nSample, bool (*sleepFunction)(uint64_t), uint64_t (*timeFunction)()) +{ + uint64_t maxTime = 0; + for (size_t i = 0; i < nSample; ++i) + { + const uint64_t preTime = timeFunction(); + sleepFunction(0); + const uint64_t processingTime = timeFunction() - preTime; + + if (processingTime > maxTime) { maxTime = processingTime; } + } + + return maxTime; +} + +// \brief Record sleep function precision +std::vector testSleep(const std::vector& sleepTimes, bool (*sleepFunction)(uint64_t), uint64_t (*timeFunction)()) +{ + std::vector effectiveSleepTimes; + for (auto time : sleepTimes) + { + const uint64_t preTime = timeFunction(); + sleepFunction(time); + effectiveSleepTimes.push_back(timeFunction() - preTime); + } + + return effectiveSleepTimes; +} + +// \brief Return a warning count that is incremented when sleep function did not meet following requirements: +// - sleep enough time +// - sleep less than the expected time + delta +size_t assessSleepTestResult(const std::vector& expected, const std::vector& result, const uint64_t delta, const uint64_t epsilon) +{ + size_t warningCount = 0; + for (size_t i = 0; i < expected.size(); ++i) + { + if (result[i] + epsilon < expected[i] || result[i] > (expected[i] + delta + epsilon)) + { + std::cerr << "WARNING: Failure to sleep the right amount of time: [expected|result] = " + << OpenViBE::CTime(expected[i]) << "|" << OpenViBE::CTime(result[i]) << std::endl; + warningCount++; + } + } + + return warningCount; +} + +// \brief Record clock function data (spin test taken from OpenViBE). Return a tuple with: +// - bool = monotonic state +// - std::vector = all the cumulative steps +std::tuple> testClock(const uint64_t samplePeriod, const unsigned sampleCountGuess, uint64_t (*timeFunction)()) +{ + std::vector cumulativeSteps; + cumulativeSteps.reserve(sampleCountGuess); + + bool monotonic = true; + const uint64_t startTime = timeFunction(); + uint64_t nowTime = startTime; + uint64_t previousTime = nowTime; + + while (nowTime - startTime < samplePeriod) + { + nowTime = timeFunction(); + if (nowTime > previousTime) { cumulativeSteps.push_back(nowTime - previousTime); } + else if (nowTime < previousTime) + { + monotonic = false; + break; + } + previousTime = nowTime; + } + + return std::make_tuple(monotonic, cumulativeSteps); +} + +// \brief Compute jitter measurements for 32:32 time. Return a tuple with: +// - double = mean +// - double = max deviation from mean +// - double = RMSE +std::tuple assessTimeClock(const std::vector& measurements) +{ + double jitterMax = 0.0; + double jitterMSE = 0.0; + double mean = 0.0; + + // compute mean + for (auto& data : measurements) + { + // convert data + auto seconds = data >> 32; + auto microseconds = ((data & 0xFFFFFFFFLL) * 1000000LL) >> 32; + std::chrono::microseconds chronoData = std::chrono::seconds(seconds) + std::chrono::microseconds(microseconds); + + mean += double(chronoData.count()) / (1000 * measurements.size()); + } + + // compute deviations + for (auto& data : measurements) + { + // convert data + auto seconds = data >> 32; + auto microseconds = ((data & 0xFFFFFFFFLL) * 1000000LL) >> 32; + std::chrono::microseconds chronoData = std::chrono::seconds(seconds) + std::chrono::microseconds(microseconds); + + const double deviation = std::abs(double(chronoData.count()) / 1000 - mean); + jitterMSE += std::pow(deviation, 2) / measurements.size(); + + if (deviation - jitterMax > std::numeric_limits::epsilon()) { jitterMax = deviation; } + } + + return std::make_tuple(mean, jitterMax, std::sqrt(jitterMSE)); +} + +int uoTimeTest(int /*argc*/, char* /*argv*/[]) +{ + // This is a very theoretical test. But if it returns false, we can + // assume that a steady clock is not available on the test + // platform. If it returns true, it just means that the internal clock + // says it is steady... + OVT_ASSERT(System::Time::isClockSteady(), "Failure to retrieve a steady clock"); + + // Same as above. + // The test is set to 1ms at it is a requirement for OpenViBE clocks + OVT_ASSERT(System::Time::checkResolution(1), "Failure to check for resolution"); + + // A stress test to check no overflow happens + OVT_ASSERT(System::Time::checkResolution(std::numeric_limits::max()), "Failure to check for resolution"); + + // + // zSleep() function test + // + + const std::vector expectedSleepData = { + 0x80000000LL, 0x40000000LL, 0x20000000LL, 0x10000000LL, + 0x80000000LL, 0x40000000LL, 0x20000000LL, 0x10000000LL, + 0x08000000LL, 0x04000000LL, 0x02000000LL, 0x01000000LL, + 0x08000000LL, 0x04000000LL, 0x02000000LL, 0x01000000LL + }; + + // calibrate sleep function + const auto deltaTime = calibrateSleep(1000, System::Time::zsleep, System::Time::zgetTime); + + std::cout << "INFO: Delta time for zsleep calibration = " << OpenViBE::CTime(deltaTime) << std::endl; + + const auto resultSleepData = testSleep(expectedSleepData, System::Time::zsleep, System::Time::zgetTime); + + OVT_ASSERT(resultSleepData.size() == expectedSleepData.size(), "Failure to run zsleep tests"); + + const size_t warningCount = assessSleepTestResult(expectedSleepData, resultSleepData, deltaTime, OpenViBE::CTime(0.005).time()); + + // relax this threshold in case there is some recurrent problems + // according to the runtime environment + OVT_ASSERT(warningCount <= 2, "Failure to zsleep the right amount of time"); + + // + // zGetTime() function test + // + + // the sample count guess was found in an empiric way + auto resultGetTimeData = testClock(OpenViBE::CTime(0.5).time(), 500000, System::Time::zgetTime); + + OVT_ASSERT(std::get<0>(resultGetTimeData), "Failure in zgetTime() test: the clock is not monotonic"); + + auto clockMetrics = assessTimeClock(std::get<1>(resultGetTimeData)); + + std::cout << "INFO: Sample count for getTime() = " << std::get<1>(resultGetTimeData).size() << std::endl; + std::cout << "INFO: Mean step in ms for getTime() = " << std::get<0>(clockMetrics) << std::endl; + std::cout << "INFO: Max deviation in ms for getTime() = " << std::get<1>(clockMetrics) << std::endl; + std::cout << "INFO: RMSE in ms for getTime() = " << std::get<2>(clockMetrics) << std::endl; + + // We expect at least 1ms resolution + const double resolutionDelta = std::get<0>(clockMetrics) - 1; + OVT_ASSERT(resolutionDelta <= std::numeric_limits::epsilon(), "Failure in zgetTime() test: the clock resolution does not match requirements"); + + return EXIT_SUCCESS; +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/CMakeLists.txt new file mode 100755 index 0000000..585c8d4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/CMakeLists.txt @@ -0,0 +1,49 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +FUNCTION(SETUP_TEST) + SET_BUILD_PLATFORM() + + INCLUDE("FindOpenViBE") + INCLUDE("FindOpenViBECommon") + INCLUDE("FindOpenViBEModuleXML") + INCLUDE("FindOpenViBEModuleFS") + INCLUDE("FindThirdPartyBoost") + INCLUDE("FindThirdPartyBoost_FileSystem") + + SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) # Place project in folder unit-test (for some IDE) + + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${GTEST_BOTH_LIBRARIES}) + + # Add test with parameter to driver + ADD_DEFINITIONS("-DDATA_DIR=\"${CMAKE_CURRENT_SOURCE_DIR}/data\"") + ADD_DEFINITIONS("-DTEMP_DIR=\"${OVT_TEST_TEMPORARY_DIR}\"") +ENDFUNCTION() + +PROJECT(openvibe-module-xml-reader-test) +ADD_EXECUTABLE(${PROJECT_NAME} uoXMLReaderTest.cpp) +SETUP_TEST() +ADD_TEST(NAME uoXMLReaderTest COMMAND ${PROJECT_NAME}) + +PROJECT(openvibe-module-xml-writer-test) +ADD_EXECUTABLE(${PROJECT_NAME} uoXMLWriterTest.cpp) +SETUP_TEST() +ADD_TEST(NAME uoXMLWriterTest COMMAND ${PROJECT_NAME}) diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/data/Français/ref_data_fr.xml b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/data/Français/ref_data_fr.xml new file mode 100644 index 0000000..9048262 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/data/Français/ref_data_fr.xml @@ -0,0 +1,5 @@ + + Français 1 (àèáéîôïç) + Français 2 (àèáéîôïç) + Français 3 (àèáéîôïç) + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/data/NB SP/ref_data_nbsp.xml b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/data/NB SP/ref_data_nbsp.xml new file mode 100644 index 0000000..6665894 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/data/NB SP/ref_data_nbsp.xml @@ -0,0 +1,5 @@ + + NB SP 1 + NB SP 2 + NB SP 3 + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/data/ref_data.xml b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/data/ref_data.xml new file mode 100755 index 0000000..5812b54 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/data/ref_data.xml @@ -0,0 +1,11 @@ + + + child node data with more than 10 alphanumeric characters + + + + + + node data with special characters <>,;:!?./&"'(-_)=~#{[|`\^@]}/*-+ + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/data/日本語/ref_data_jp.xml b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/data/日本語/ref_data_jp.xml new file mode 100644 index 0000000..abc82fb --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/data/日本語/ref_data_jp.xml @@ -0,0 +1,5 @@ + + 日本語 1 + 日本語 2 + 日本語 3 + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/uoXMLReaderTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/uoXMLReaderTest.cpp new file mode 100755 index 0000000..f084745 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/uoXMLReaderTest.cpp @@ -0,0 +1,202 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include +#include +#include +#include +#include + +#include "xml/IReader.h" +#include "xml/IXMLHandler.h" +#include + +#include + +class CReaderCallBack final : public XML::IReaderCallBack +{ +public: + + struct SNode + { + std::string name; + std::string data; + std::map attributes; + std::vector> children; + std::shared_ptr parent{ nullptr }; + }; + + std::shared_ptr m_CurrentNode{ nullptr }; + +protected: + + void openChild(const char* name, const char** attributeName, const char** attributeValue, const size_t nAttribute) override + { + auto node = std::make_shared(); + + if (m_CurrentNode) + { + node->parent = m_CurrentNode; + m_CurrentNode->children.push_back(node); + } + + m_CurrentNode = node; + m_CurrentNode->name = name; + + for (size_t i = 0; i < nAttribute; ++i) { m_CurrentNode->attributes[attributeName[i]] = attributeValue[i]; } + } + + void processChildData(const char* data) override { m_CurrentNode->data = data; } + + void closeChild() override { if (m_CurrentNode->parent) { m_CurrentNode = m_CurrentNode->parent; } } +}; + +TEST(XML_Reader_Test_Case, validateReader) +{ + std::string dataFile = std::string(DATA_DIR) + "/ref_data.xml"; + + CReaderCallBack callback; + XML::IReader* xmlReader = createReader(callback); + + FILE* inputTestDataFile = fopen(dataFile.c_str(), "r"); + + ASSERT_NE(nullptr, inputTestDataFile); + + char dataBuffer[1024]; + while (!feof(inputTestDataFile)) + { + size_t length = std::fread(dataBuffer, 1, sizeof(dataBuffer), inputTestDataFile); + xmlReader->processData(dataBuffer, length); + } + std::fclose(inputTestDataFile); + + xmlReader->release(); + + // Analyze results + + auto rootNode = callback.m_CurrentNode; + + // Root node check + ASSERT_EQ("Document", rootNode->name); + ASSERT_EQ(1, rootNode->attributes.size()); + ASSERT_EQ("test_reference", rootNode->attributes["name"]); + + ASSERT_EQ(3, rootNode->children.size()); + + auto complexChild = rootNode->children[0]; + auto dataChild = rootNode->children[1]; + auto emptyChild = rootNode->children[2]; + + // Simple child with data check + ASSERT_EQ("NodeWithData", dataChild->name); + ASSERT_EQ("node data with special characters <>,;:!?./&\"'(-_)=~#{[|`\\^@]}/*-+", dataChild->data); + ASSERT_EQ(1, dataChild->attributes.size()); + ASSERT_EQ("hasData", dataChild->attributes["status"]); + + // Simple child with no data and multiple attributes check + ASSERT_EQ("NodeEmptyWithNumber666", emptyChild->name); + ASSERT_EQ(2, emptyChild->attributes.size()); + ASSERT_EQ("noData", emptyChild->attributes["status"]); + ASSERT_EQ("test", emptyChild->attributes["ref"]); + + // Complex child check + ASSERT_EQ("NodeWithChildren", complexChild->name); + ASSERT_TRUE(complexChild->attributes.empty()); + + ASSERT_EQ(3, complexChild->children.size()); + + dataChild = complexChild->children[0]; + emptyChild = complexChild->children[1]; + complexChild = complexChild->children[2]; + + ASSERT_EQ("ChildNodeWithData", dataChild->name); + ASSERT_EQ("child node data with more than 10 alphanumeric characters", dataChild->data); + ASSERT_EQ(0, dataChild->attributes.size()); + + ASSERT_EQ("ChildNodeEmpty", emptyChild->name); + ASSERT_TRUE(emptyChild->attributes.empty()); + + ASSERT_EQ("ChildNodeWithChildren", complexChild->name); + ASSERT_TRUE(complexChild->attributes.empty()); + ASSERT_EQ(1, complexChild->children.size()); +} + +TEST(XML_Reader_Test_Case, validateHandlerReadJapanese) +{ + const std::string dataFile = std::string(DATA_DIR) + "/日本語/ref_data_jp.xml"; + + XML::IXMLHandler* xmlHandler = XML::createXMLHandler(); + XML::IXMLNode* rootNode = xmlHandler->parseFile(dataFile.c_str()); + + ASSERT_NE(nullptr, rootNode); + ASSERT_EQ(std::string("Document"), rootNode->getName()); + ASSERT_TRUE(rootNode->hasAttribute("name")); + ASSERT_EQ(std::string("日本語"), rootNode->getAttribute("name")); + ASSERT_EQ(3, rootNode->getChildCount()); + + ASSERT_STREQ("日本語 1", rootNode->getChild(0)->getPCData()); + + xmlHandler->release(); +} + +TEST(XML_Reader_Test_Case, validateHandlerReadFrench) +{ + const std::string dataFile = std::string(DATA_DIR) + "/Français/ref_data_fr.xml"; + + XML::IXMLHandler* xmlHandler = XML::createXMLHandler(); + XML::IXMLNode* rootNode = xmlHandler->parseFile(dataFile.c_str()); + + ASSERT_NE(nullptr, rootNode); + ASSERT_EQ(std::string("Document"), rootNode->getName()); + ASSERT_TRUE(rootNode->hasAttribute("name")); + ASSERT_EQ(std::string("Français"), rootNode->getAttribute("name")); + ASSERT_EQ(3, rootNode->getChildCount()); + + ASSERT_STREQ("Français 1 (àèáéîôïç)", rootNode->getChild(0)->getPCData()); + + xmlHandler->release(); +} + +TEST(XML_Reader_Test_Case, validateHandlerReadNBSP) +{ + const std::string dataFile = std::string(DATA_DIR) + "/NB\xC2\xA0SP/ref_data_nbsp.xml"; + + XML::IXMLHandler* xmlHandler = XML::createXMLHandler(); + XML::IXMLNode* rootNode = xmlHandler->parseFile(dataFile.c_str()); + + ASSERT_NE(nullptr, rootNode); + ASSERT_EQ(std::string("Document"), rootNode->getName()); + ASSERT_TRUE(rootNode->hasAttribute("name")); + ASSERT_EQ(std::string("NB\xC2\xA0SP"), rootNode->getAttribute("name")); + ASSERT_EQ(3, rootNode->getChildCount()); + + ASSERT_STREQ("NB\xC2\xA0SP 1", rootNode->getChild(0)->getPCData()); + + xmlHandler->release(); +} + +int uoXMLReaderTest(int argc, char* argv[]) +{ + testing::InitGoogleTest(&argc, argv); + + ::testing::GTEST_FLAG(filter) = "XML_Reader_Test_Case.*"; + return RUN_ALL_TESTS(); +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/uoXMLWriterTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/uoXMLWriterTest.cpp new file mode 100755 index 0000000..c549e09 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-module-xml/uoXMLWriterTest.cpp @@ -0,0 +1,176 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include +#include +#include + +#include +#include + +#include + +#include +#include + +class CWriterCallBack : public XML::IWriterCallBack +{ +public: + + CWriterCallBack(const char* filename) { m_file = FS::Files::open(filename, "wb"); } + ~CWriterCallBack() override { if (m_file) { std::fclose(m_file); } } // in case release is not called + + void write(const char* outputData) override { if (m_file) { std::fputs(outputData, m_file); } } + + // necessary thjor the test to close the stream and re-open it for inspection + void release() + { + std::fclose(m_file); + m_file = nullptr; + } + +private: + + std::FILE* m_file{ nullptr }; +}; + +TEST(XML_Writer_Test_Case, validateWriter) +{ + std::string expectedFile = DATA_DIR "/ref_data.xml"; + std::string outputFile = TEMP_DIR "/uoXMLWriterTest.xml"; + + FS::Files::createPath(TEMP_DIR); + ASSERT_TRUE(FS::Files::directoryExists(TEMP_DIR)); + + FS::Files::removeAll(outputFile.c_str()); + ASSERT_FALSE(FS::Files::fileExists(outputFile.c_str())); + + // The test serializes a known xml sequence and compares the output + // to a reference. + + // serializing + CWriterCallBack callback(outputFile.c_str()); + + XML::IWriter* writer = createWriter(callback); + + writer->openChild("Document"); ///< Document Node + writer->setAttribute("name", "test_reference"); + + writer->openChild("NodeWithChildren"); ///< NodeWithChildren Node + + writer->openChild("ChildNodeWithData"); + writer->setChildData("child node data with more than 10 alphanumeric characters"); + writer->closeChild(); + + writer->openChild("ChildNodeEmpty"); + writer->closeChild(); + + writer->openChild("ChildNodeWithChildren"); + writer->openChild("ChildNodeEmpty"); + writer->closeChild(); + writer->closeChild(); + + writer->closeChild(); ///< NodeWithChildren END + + writer->openChild("NodeWithData"); + writer->setAttribute("status", "hasData"); + writer->setChildData("node data with special characters <>,;:!?./&\"'(-_)=~#{[|`\\^@]}/*-+"); + writer->closeChild(); + + writer->openChild("NodeEmptyWithNumber666"); + writer->setAttribute("status", "noData"); + writer->setAttribute("ref", "test"); + writer->closeChild(); + + writer->closeChild(); ///< Document Node END + + writer->release(); + callback.release(); + + // comparison part + std::ifstream generatedStream; + std::ifstream expectedStream; + + FS::Files::openIFStream(generatedStream, outputFile.c_str()); + FS::Files::openIFStream(expectedStream, expectedFile.c_str()); + + ASSERT_TRUE(generatedStream.is_open()); + ASSERT_TRUE(expectedStream.is_open()); + + std::string generatedString; + std::string expectedString; + + while (std::getline(expectedStream, expectedString)) + { + std::getline(generatedStream, generatedString); + ASSERT_EQ(expectedString, generatedString); + } + + // last check to verify the expected file has no additional line + std::getline(generatedStream, generatedString); +} + +TEST(XML_Writer_Test_Case, validateHandlerWriteToJapanesePath) +{ + std::string expectedFile = DATA_DIR "/日本語/ref_data_jp.xml"; + std::string outputFile = TEMP_DIR "/オッペンヴィベ/日本語.xml"; + + FS::Files::createPath(TEMP_DIR); + ASSERT_TRUE(FS::Files::directoryExists(TEMP_DIR)); + + FS::Files::removeAll(outputFile.c_str()); + ASSERT_FALSE(FS::Files::fileExists(outputFile.c_str())); + + XML::IXMLHandler* xmlHandler = XML::createXMLHandler(); + std::string testData = "日本語 1日本語 2日本語 3"; + XML::IXMLNode* rootNode = xmlHandler->parseString(testData.c_str(), testData.size()); + xmlHandler->writeXMLInFile(*rootNode, outputFile.c_str()); + + // comparison part + std::ifstream generatedStream; + std::ifstream expectedStream; + + FS::Files::openIFStream(generatedStream, outputFile.c_str()); + FS::Files::openIFStream(expectedStream, expectedFile.c_str()); + + ASSERT_TRUE(generatedStream.is_open()); + ASSERT_TRUE(expectedStream.is_open()); + + std::string generatedString; + std::string expectedString; + + while (std::getline(expectedStream, expectedString)) + { + std::getline(generatedStream, generatedString); + ASSERT_EQ(expectedString, generatedString); + } + + // last check to verify the expected file has no additional line + std::getline(generatedStream, generatedString); +} + +int uoXMLWriterTest(int argc, char* argv[]) +{ + testing::InitGoogleTest(&argc, argv); + + ::testing::GTEST_FLAG(filter) = "XML_Writer_Test_Case.*"; + return RUN_ALL_TESTS(); +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-plugin-stream-codecs/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-plugin-stream-codecs/CMakeLists.txt new file mode 100755 index 0000000..941aa18 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-plugin-stream-codecs/CMakeLists.txt @@ -0,0 +1,36 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + + +FUNCTION(SETUP_TEST) + SET_BUILD_PLATFORM() + + TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${GTEST_BOTH_LIBRARIES}) + + INCLUDE("FindOpenViBE") + INCLUDE("FindOpenViBECommon") +ENDFUNCTION() + +PROJECT(openvibe-plugin-stream-codecs-test) +ADD_EXECUTABLE(${PROJECT_NAME} uoStreamedMatrixTest.cpp ../common/ovtKernelContext.cpp) +SETUP_TEST() + +ADD_TEST(NAME uoStreamedMatrixTest COMMAND ${PROJECT_NAME}) diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-plugin-stream-codecs/uoStreamedMatrixTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-plugin-stream-codecs/uoStreamedMatrixTest.cpp new file mode 100755 index 0000000..09eef8d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-plugin-stream-codecs/uoStreamedMatrixTest.cpp @@ -0,0 +1,141 @@ +#include + +#include "gtest/gtest.h" + +#include "ovtAssert.h" + +#include "../common/ovtKernelContext.h" +#include + +#include + +namespace { +const char* kernelConfig = nullptr; + +class StreamedMatrixTest : public testing::Test +{ +protected: + + StreamedMatrixTest() { } + ~StreamedMatrixTest() override { } + + void SetUp() override + { + m_kernelCtx.initialize(); + m_kernelCtx->getPluginManager().addPluginsFromFiles(m_kernelCtx->getConfigurationManager().expand("${Path_Lib}/*openvibe-plugins-sdk-stream-codecs*")); + + m_decoderId = OpenViBE::CIdentifier::undefined(); + m_decoderId = m_kernelCtx->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixDecoder); + ASSERT_NE(OpenViBE::CIdentifier::undefined(), m_decoderId); + + m_encoderId = OpenViBE::CIdentifier::undefined(); + m_encoderId = m_kernelCtx->getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_StreamedMatrixEncoder); + ASSERT_NE(OpenViBE::CIdentifier::undefined(), m_encoderId); + } + + void TearDown() override + { + ASSERT_TRUE(m_kernelCtx->getAlgorithmManager().releaseAlgorithm(m_decoderId)); + m_decoderId = OpenViBE::CIdentifier::undefined(); + ASSERT_TRUE(m_kernelCtx->getAlgorithmManager().releaseAlgorithm(m_encoderId)); + m_encoderId = OpenViBE::CIdentifier::undefined(); + m_kernelCtx.uninitialize(); + } + + OpenViBE::CIdentifier m_decoderId; + OpenViBE::CIdentifier m_encoderId; + OpenViBE::Test::ctx m_kernelCtx; +}; + +TEST_F(StreamedMatrixTest, test_init) +{ + auto& decoder = m_kernelCtx->getAlgorithmManager().getAlgorithm(m_decoderId); + auto& encoder = m_kernelCtx->getAlgorithmManager().getAlgorithm(m_encoderId); + EXPECT_TRUE(decoder.initialize()); + EXPECT_TRUE(encoder.initialize()); + EXPECT_TRUE(decoder.uninitialize()); + EXPECT_TRUE(encoder.uninitialize()); +} + +TEST_F(StreamedMatrixTest, matrix_decoder_does_not_crash_when_given_an_empty_matrix) +{ + auto& encoder = m_kernelCtx->getAlgorithmManager().getAlgorithm(m_encoderId); + auto& decoder = m_kernelCtx->getAlgorithmManager().getAlgorithm(m_decoderId); + EXPECT_TRUE(encoder.initialize()); + EXPECT_TRUE(decoder.initialize()); + OpenViBE::CMatrix mat(0); + + OpenViBE::Kernel::TParameterHandler iMatrix( + encoder.getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)); + OpenViBE::Kernel::TParameterHandler oBuffer( + encoder.getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + OpenViBE::Kernel::TParameterHandler iBuffer( + decoder.getInputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_InputParameterId_MemoryBufferToDecode)); + OpenViBE::Kernel::TParameterHandler oMatrix( + decoder.getOutputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + + iMatrix = &mat; + iBuffer.setReferenceTarget(oBuffer); + + encoder.process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader); + decoder.process(); + + EXPECT_TRUE(decoder.isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedHeader)); + + EXPECT_EQ(mat.getDimensionCount(), oMatrix->getDimensionCount()); + + EXPECT_TRUE(encoder.uninitialize()); + EXPECT_TRUE(decoder.uninitialize()); +} + +TEST_F(StreamedMatrixTest, matrix_encoded_and_then_decoded_is_identical_to_original) +{ + auto& encoder = m_kernelCtx->getAlgorithmManager().getAlgorithm(m_encoderId); + auto& decoder = m_kernelCtx->getAlgorithmManager().getAlgorithm(m_decoderId); + EXPECT_TRUE(encoder.initialize()); + EXPECT_TRUE(decoder.initialize()); + OpenViBE::CMatrix mat(2, 3); + size_t elemCount = 1; + for (size_t dim = 0; dim < mat.getDimensionCount(); ++dim) + { + const auto size = mat.getDimensionSize(dim); + for (size_t entry = 0; entry < size; ++entry) + { + std::string label = std::to_string(dim) + ":" + std::to_string(entry); + mat.setDimensionLabel(0, 0, label.c_str()); + } + elemCount *= size; + } + for (size_t i = 0; i < elemCount; ++i) { mat.getBuffer()[i] = double(i); } + + OpenViBE::Kernel::TParameterHandler iMatrix( + encoder.getInputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_InputParameterId_Matrix)); + OpenViBE::Kernel::TParameterHandler oBuffer( + encoder.getOutputParameter(OVP_GD_Algorithm_StreamedMatrixEncoder_OutputParameterId_EncodedMemoryBuffer)); + OpenViBE::Kernel::TParameterHandler iBuffer( + decoder.getInputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_InputParameterId_MemoryBufferToDecode)); + OpenViBE::Kernel::TParameterHandler oMatrix( + decoder.getOutputParameter(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputParameterId_Matrix)); + + iMatrix = &mat; + iBuffer.setReferenceTarget(oBuffer); + + encoder.process(OVP_GD_Algorithm_StreamedMatrixEncoder_InputTriggerId_EncodeHeader); + decoder.process(); + + EXPECT_TRUE(decoder.isOutputTriggerActive(OVP_GD_Algorithm_StreamedMatrixDecoder_OutputTriggerId_ReceivedHeader)); + + EXPECT_EQ(mat.getDimensionCount(), oMatrix->getDimensionCount()); + + EXPECT_TRUE(encoder.uninitialize()); + EXPECT_TRUE(decoder.uninitialize()); +} +} // namespace + +int uoStreamedMatrixTest(int argc, char* argv[]) +{ + if (argc > 1) { kernelConfig = argv[1]; } + testing::InitGoogleTest(&argc, argv); + ::testing::GTEST_FLAG(filter) = "StreamedMatrixTest.*"; + return RUN_ALL_TESTS(); +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/CMakeLists.txt new file mode 100755 index 0000000..de034a2 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/CMakeLists.txt @@ -0,0 +1,77 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +# Base framework features tests +PROJECT(openvibe-toolkit-test) + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- +SET_BUILD_PLATFORM() + +# ---------------------- +# Configure test target +# ---------------------- + +# Test that needs to called with parameters +SET(TEST_WITH_PARAM + uoMatrixToolkitTest.cpp + urImportScenarioFromFileTest.cpp + urExportScenarioToFileTest.cpp + urValidateScenarioTest.cpp +) + +# Test that needs to called without parameters +SET(TEST_NO_PARAM +) + +# Create test sources list +# This macro auto-generate ${PROJECT_NAME}.cpp +# in the build tree. ${PROJECT_NAME}.cpp is +# the test driver called by ctest to run +# the different tests added to this target. +CREATE_TEST_SOURCELIST (Tests + ${PROJECT_NAME}.cpp + ${TEST_WITH_PARAM} + ${TEST_NO_PARAM} + ) + +ADD_EXECUTABLE(${PROJECT_NAME} ${Tests}) +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") +INCLUDE("FindOpenViBEModuleSystem") +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OVT_UNIT_TOOLKIT_LIB} ${GTEST_BOTH_LIBRARIES} ${OV_LIBS}) + +# Add test without parameter to driver +FOREACH(test ${TEST_NO_PARAM}) + GET_FILENAME_COMPONENT(TName ${test} NAME_WE) + ADD_TEST(NAME ${TName} COMMAND ${PROJECT_NAME} ${TName}) +ENDFOREACH() + +# Add test with parameter to driver +ADD_TEST(NAME uoMatrixToolkitTest COMMAND ${PROJECT_NAME} uoMatrixToolkitTest "${OVT_TEST_TEMPORARY_DIR}") +ADD_TEST(NAME urImportScenarioFromFileTest COMMAND ${PROJECT_NAME} urImportScenarioFromFileTest "${OVT_OPENVIBE_DATA}/kernel/openvibe.conf" "${CMAKE_CURRENT_SOURCE_DIR}/data/") +ADD_TEST(NAME urExportScenarioToFileTest COMMAND ${PROJECT_NAME} urExportScenarioToFileTest "${OVT_OPENVIBE_DATA}/kernel/openvibe.conf" "${OVT_TEST_TEMPORARY_DIR}") +ADD_TEST(NAME urValidateScenarioTest COMMAND ${PROJECT_NAME} urValidateScenarioTest "${OVT_OPENVIBE_DATA}/kernel/openvibe.conf" "${CMAKE_CURRENT_SOURCE_DIR}/data/") + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-attribute-dup-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-attribute-dup-id.mxs new file mode 100755 index 0000000..7e49663 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-attribute-dup-id.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-attribute-dup-value.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-attribute-dup-value.mxs new file mode 100755 index 0000000..9fcf9f9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-attribute-dup-value.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-attribute-missing-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-attribute-missing-id.mxs new file mode 100755 index 0000000..c498e8b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-attribute-missing-id.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-attribute-missing-value.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-attribute-missing-value.mxs new file mode 100755 index 0000000..8bb7371 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-attribute-missing-value.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-algo.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-algo.mxs new file mode 100755 index 0000000..f1eee01 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-algo.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-attributes.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-attributes.mxs new file mode 100755 index 0000000..296fa6e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-attributes.mxs @@ -0,0 +1,92 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-id.mxs new file mode 100755 index 0000000..b8479ff --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-id.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-inputs.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-inputs.mxs new file mode 100755 index 0000000..0bee029 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-inputs.mxs @@ -0,0 +1,92 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-name.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-name.mxs new file mode 100755 index 0000000..655da8f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-name.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-outputs.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-outputs.mxs new file mode 100755 index 0000000..7558c83 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-outputs.mxs @@ -0,0 +1,92 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-settings.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-settings.mxs new file mode 100755 index 0000000..d2b5067 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-dup-settings.mxs @@ -0,0 +1,92 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-missing-algo.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-missing-algo.mxs new file mode 100755 index 0000000..41979df --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-missing-algo.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-missing-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-missing-id.mxs new file mode 100755 index 0000000..5889df9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-missing-id.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-missing-name.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-missing-name.mxs new file mode 100755 index 0000000..ad32b0b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-box-missing-name.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-comment-dup-attributes.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-comment-dup-attributes.mxs new file mode 100755 index 0000000..0edd4da --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-comment-dup-attributes.mxs @@ -0,0 +1,94 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-comment-dup-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-comment-dup-id.mxs new file mode 100755 index 0000000..1d3e379 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-comment-dup-id.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-comment-dup-text.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-comment-dup-text.mxs new file mode 100755 index 0000000..6384e0c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-comment-dup-text.mxs @@ -0,0 +1,90 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + Text1 + Text1 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-comment-missing-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-comment-missing-id.mxs new file mode 100755 index 0000000..3309f84 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-comment-missing-id.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-comment-missing-text.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-comment-missing-text.mxs new file mode 100755 index 0000000..7c166ac --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-comment-missing-text.mxs @@ -0,0 +1,88 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-input-dup-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-input-dup-id.mxs new file mode 100755 index 0000000..686d4e8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-input-dup-id.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-input-dup-name.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-input-dup-name.mxs new file mode 100755 index 0000000..d246a32 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-input-dup-name.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-input-missing-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-input-missing-id.mxs new file mode 100755 index 0000000..40a090a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-input-missing-id.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-input-missing-name.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-input-missing-name.mxs new file mode 100755 index 0000000..d3a58bf --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-input-missing-name.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-dup-attributes.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-dup-attributes.mxs new file mode 100755 index 0000000..66f4d71 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-dup-attributes.mxs @@ -0,0 +1,94 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-dup-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-dup-id.mxs new file mode 100755 index 0000000..01050fd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-dup-id.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-dup-source.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-dup-source.mxs new file mode 100755 index 0000000..bcc22d0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-dup-source.mxs @@ -0,0 +1,94 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-dup-target.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-dup-target.mxs new file mode 100755 index 0000000..bfa8d24 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-dup-target.mxs @@ -0,0 +1,94 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-missing-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-missing-id.mxs new file mode 100755 index 0000000..1ea5d3f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-missing-id.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-missing-source.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-missing-source.mxs new file mode 100755 index 0000000..70075a0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-missing-source.mxs @@ -0,0 +1,86 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-missing-target.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-missing-target.mxs new file mode 100755 index 0000000..772f725 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-link-missing-target.mxs @@ -0,0 +1,86 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-output-dup-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-output-dup-id.mxs new file mode 100755 index 0000000..7e59a76 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-output-dup-id.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-output-dup-name.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-output-dup-name.mxs new file mode 100755 index 0000000..f8d4a5f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-output-dup-name.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-output-missing-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-output-missing-id.mxs new file mode 100755 index 0000000..66bf532 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-output-missing-id.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-output-missing-name.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-output-missing-name.mxs new file mode 100755 index 0000000..018e467 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-output-missing-name.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-attributes.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-attributes.mxs new file mode 100755 index 0000000..4d4bb1b --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-attributes.mxs @@ -0,0 +1,182 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-boxes.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-boxes.mxs new file mode 100755 index 0000000..e546a08 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-boxes.mxs @@ -0,0 +1,92 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-comments.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-comments.mxs new file mode 100755 index 0000000..e7076c3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-comments.mxs @@ -0,0 +1,92 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-creator.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-creator.mxs new file mode 100755 index 0000000..0fd814e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-creator.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + OpenVIBE2 + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-inputs.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-inputs.mxs new file mode 100755 index 0000000..0bee029 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-inputs.mxs @@ -0,0 +1,92 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-links.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-links.mxs new file mode 100755 index 0000000..d9e9851 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-links.mxs @@ -0,0 +1,92 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-outputs.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-outputs.mxs new file mode 100755 index 0000000..a6edcbe --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-outputs.mxs @@ -0,0 +1,92 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-settings.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-settings.mxs new file mode 100755 index 0000000..ad7665c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-settings.mxs @@ -0,0 +1,92 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-version.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-version.mxs new file mode 100755 index 0000000..3cd050c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-root-dup-version.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + 1.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-scenario-false-positive1.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-scenario-false-positive1.mxs new file mode 100755 index 0000000..5c5f476 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-scenario-false-positive1.mxs @@ -0,0 +1,2 @@ + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-scenario-false-positive2.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-scenario-false-positive2.mxs new file mode 100755 index 0000000..7b74d52 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-scenario-false-positive2.mxs @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-scenario-false-positive3.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-scenario-false-positive3.mxs new file mode 100755 index 0000000..a277cc5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-scenario-false-positive3.mxs @@ -0,0 +1,90 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-scenario-simple.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-scenario-simple.mxs new file mode 100755 index 0000000..753a12c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-scenario-simple.mxs @@ -0,0 +1,244 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + 100 + + + (0x512a166f, 0x5c3ef83f) + Float Setting + 3.14 + 2.0 + 2.1 + + + (0x79a9edeb, 0x245d83fc) + String Setting + Default string value + Modified string value + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + (0x4468da36, 0x3fce3251) + 0 + + + (0x544a003e, 0x6dcba5f6) + Disconnected Matrix Input + (0xffffffff, 0xffffffff) + 0 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + (0x66b53b19, 0x043b1afe) + 0 + + + (0x544a003e, 0x6dcba5f6) + Disconnected Matrix Output + (0xffffffff, 0xffffffff) + 0 + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Information + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + (0x207c9054, 0x3c841b63) + 352 + + + (0x4e7b798a, 0x183beafb) + (0xf451ad91, 0x14c75f86) + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 1.0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 80 + + + (0x207c9054, 0x3c841b63) + 464 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + (0x473d9a43, 0x97fc0a97) + 80 + + + (0x7234b86b, 0x2b8651a5) + 208 + + + + + (0x24da4aa1, 0x7759a2ee) + Content of a comment + + + (0x473d9a43, 0x97fc0a97) + 96 + + + (0x7234b86b, 0x2b8651a5) + 112 + + + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + (0x20c6d158, 0xfe90aadd) + (0xa201286e, 0x9bdd6498) + + + (0x60bc58ab, 0x7a1b4d83) + UPDATED SOFTWARE VERSION + + + (0x790d75b8, 0x3bb90c33) + AUTHOR NAME + + + (0x7a3a1558, 0xf12c63c2) + DETAILED DESCRIPTION + + + (0x84009d7c, 0x3c4e763b) + SHORT DESCRIPTION + + + (0x8c1fc55b, 0x7b433dc2) + SCENARIO VERSION + + + (0x9f5c4075, 0x4a0d3666) + SCENARIO NAME + + + (0xf36a1567, 0xd13c53da) + DOCUMENTATION PAGE + + + (0xf6b2e3fa, 0x7bd43926) + SCENARIO CATEGORY + + + (0xf8034a49, 0x8b3f37cc) + COMPANY NAME + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-bad-modif.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-bad-modif.mxs new file mode 100755 index 0000000..61bf718 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-bad-modif.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + False + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-dup-default.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-dup-default.mxs new file mode 100755 index 0000000..d13a9de --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-dup-default.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-dup-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-dup-id.mxs new file mode 100755 index 0000000..3f1229a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-dup-id.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-dup-modif.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-dup-modif.mxs new file mode 100755 index 0000000..83e1f25 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-dup-modif.mxs @@ -0,0 +1,92 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + 0 + false + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-dup-name.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-dup-name.mxs new file mode 100755 index 0000000..7f9c665 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-dup-name.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-dup-value.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-dup-value.mxs new file mode 100755 index 0000000..970455c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-dup-value.mxs @@ -0,0 +1,92 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + Info + Info + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-missing-default.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-missing-default.mxs new file mode 100755 index 0000000..c981c55 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-missing-default.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-missing-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-missing-id.mxs new file mode 100755 index 0000000..a5b243f --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-missing-id.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-missing-name.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-missing-name.mxs new file mode 100755 index 0000000..8681090 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-setting-missing-name.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-source-bad-index.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-source-bad-index.mxs new file mode 100755 index 0000000..bc8a3f4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-source-bad-index.mxs @@ -0,0 +1,90 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + toto + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-source-dup-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-source-dup-id.mxs new file mode 100755 index 0000000..61113a0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-source-dup-id.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-source-dup-index.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-source-dup-index.mxs new file mode 100755 index 0000000..0eeae1c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-source-dup-index.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-source-missing-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-source-missing-id.mxs new file mode 100755 index 0000000..ac01031 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-source-missing-id.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + 0 + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-source-missing-index.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-source-missing-index.mxs new file mode 100755 index 0000000..1fac908 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-source-missing-index.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + + + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-target-bad-index.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-target-bad-index.mxs new file mode 100755 index 0000000..29b1234 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-target-bad-index.mxs @@ -0,0 +1,90 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + toto + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-target-dup-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-target-dup-id.mxs new file mode 100755 index 0000000..501a5a4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-target-dup-id.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-target-dup-index.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-target-dup-index.mxs new file mode 100755 index 0000000..501a5a4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-target-dup-index.mxs @@ -0,0 +1,91 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + (0x4468da36, 0x3fce3251) + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-target-missing-id.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-target-missing-id.mxs new file mode 100755 index 0000000..2f30cae --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-target-missing-id.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + 1 + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-target-missing-index.mxs b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-target-missing-index.mxs new file mode 100755 index 0000000..af6a080 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/data/test-target-missing-index.mxs @@ -0,0 +1,89 @@ + + OpenVIBE + 0.0.0 + + + (0x007deef9, 0x2f3e95c6) + Integer Setting + 10 + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Input + + + + + (0x6f752dd0, 0x082a321e) + Stimulation Output + + + + + (0x4468da36, 0x3fce3251) + Stimulation listener + (0x65731e1d, 0x47de5276) + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 1 + + + (0x6f752dd0, 0x082a321e) + Stimulation stream 2 + + + + + (0xa88b3667, 0x0871638c) + Log level to use + Debug + + + + + (0x1fa7a38f, 0x54edbe0b) + 176 + + + + + (0x66b53b19, 0x043b1afe) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + + + (0x1dd7b2d2, 0x3c1d084d) + + (0x66b53b19, 0x043b1afe) + 0 + + + (0x4468da36, 0x3fce3251) + + + + + + (0x160bd469, 0x62a644ce) + This comment contains a newline +and unicode characters 日本語 + + + + + (0x079d1f09, 0x667c7871) + ADDED SOFTWARE VERSION + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/uoMatrixToolkitTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/uoMatrixToolkitTest.cpp new file mode 100755 index 0000000..2b5c3b2 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/uoMatrixToolkitTest.cpp @@ -0,0 +1,137 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include +#include + +#include + +#include "ovtAssert.h" + +static std::default_random_engine gen(777); +static std::uniform_real_distribution dist(0.0, 100.0); + +void fillMatrix(OpenViBE::CMatrix& matrix) +{ + for (size_t i = 0; i < matrix.getDimensionCount(); ++i) + { + for (size_t j = 0; j < matrix.getDimensionSize(i); ++j) + { + std::stringstream label; + label << "Label " << j + 1 << " of Dimension " << i + 1; + matrix.setDimensionLabel(i, j, label.str()); + } + } + + for (size_t i = 0; i < matrix.getBufferElementCount(); ++i) { matrix.getBuffer()[i] = dist(gen); } +} +bool testMatrix(OpenViBE::CMatrix& expectedMatrix, const std::string& textFile, const size_t precision = 6) +{ + const double threshold = 1.0 / std::pow(10.0, double(precision - 2)); + + fillMatrix(expectedMatrix); + + if (!OpenViBE::Toolkit::Matrix::saveToTextFile(expectedMatrix, textFile.c_str(), precision)) + { + std::cerr << "Error: saving matrix to file " << textFile << "\n"; + return false; + } + + OpenViBE::CMatrix resultMatrix; + + if (!OpenViBE::Toolkit::Matrix::loadFromTextFile(resultMatrix, textFile.c_str())) + { + std::cerr << "Error: loading matrix from file " << textFile << "\n"; + return false; + } + + if (!OpenViBE::Toolkit::Matrix::isDescriptionSimilar(expectedMatrix, resultMatrix)) + { + std::cerr << "Error: Descriptions differ between expected matrix and result matrix after save/load\n"; + return false; + } + + for (size_t i = 0; i < expectedMatrix.getBufferElementCount(); ++i) + { + const double error = std::fabs(expectedMatrix.getBuffer()[i] - resultMatrix.getBuffer()[i]); + + if (error > threshold) + { + std::cerr << "Error: Data differs at index " << i << ", error " << error << " (thresold = " << threshold << ")\n"; + return false; + } + } + + return true; +} + +int uoMatrixToolkitTest(int argc, char* argv[]) +{ + OVT_ASSERT(argc == 2, "Failure to retrieve tests arguments. Expecting: output_dir"); + + const std::string oMatrixFile = std::string(argv[1]) + "uoMatrixToolkitTest.txt"; + + OpenViBE::CMatrix source; + + source.resize(1); + OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [1; {0,1}]"); + + source.resize(5); + OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [1; {0,5}]"); + + source.resize(1, 1); + OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [2; {0,1},{1,1}]"); + + source.resize(1, 7); + OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [2; {0,1},{1,7}]"); + + source.resize(9, 1); + OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [2; {0,9},{1,1}]"); + + source.resize(2, 4); + OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [2; {0,2},{1,4}]"); + + source.resize(3, 15); + OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [2; {0,3},{1,15}]"); + + source.resize({ 1, 1, 1 }); + OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [3; {0,1},{1,1},{2,1}]"); + + source.resize({ 1, 1, 5 }); + OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [3; {0,1},{1,1},{2,5}]"); + + source.resize({ 2, 3, 6 }); + OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [3; {0,2},{1,3},{2,6}]"); + + source.resize({ 9, 5, 2, 3 }); + OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [4; {0,9},{1,5},{2,2},{3,3}]"); + + // special cases at boundaries + source.resize(0, 0); + OVT_ASSERT(testMatrix(source, oMatrixFile), "Failed to test matrix with parameters [dimension_count; dimension_size] = [2; {0,0},{1,0}]"); + + OpenViBE::CMatrix emptySource; + OVT_ASSERT(!testMatrix(emptySource, oMatrixFile), "Failed to test matrix with no parameter"); + + return EXIT_SUCCESS; +} + +//==========================End OF File============================== diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/urExportScenarioToFileTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/urExportScenarioToFileTest.cpp new file mode 100755 index 0000000..5bf0c89 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/urExportScenarioToFileTest.cpp @@ -0,0 +1,125 @@ +#include +#include +#include + +#include "ovtAssert.h" +#include "ovtTestFixtureCommon.h" + +int urImportScenarioFromFileTest(int argc, char* argv[]); + +#define OVP_ClassId_BoxAlgorithm_ClockStimulator CIdentifier(0x4F756D3F, 0x29FF0B96) +#define OVP_ClassId_BoxAlgorithm_ClockStimulatorDesc CIdentifier(0x4FD067E9, 0x740D2AF0) +#define OVP_ClassId_BoxAlgorithm_StimulationListener CIdentifier(0x65731E1D, 0x47DE5276) + +#include "urSimpleTestScenarioDefinition.h" + +int urExportScenarioToFileTest(const int argc, char* argv[]) +{ + const char* configFile = argv[1]; + const char* temporaryDirectory = argv[2]; + + { + Test::ScopedTest fixture(configFile); + + auto& context = fixture->context; + +#if defined TARGET_OS_Windows + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/openvibe-plugins-sdk-file-io*dll"); + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/openvibe-plugins-sdk-stimulation*dll"); + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/openvibe-plugins-sdk-tools*dll"); +#elif defined TARGET_OS_Linux + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/libopenvibe-plugins-sdk-file-io*so"); + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/libopenvibe-plugins-sdk-stimulation*so"); + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/libopenvibe-plugins-sdk-tools*so"); +#elif defined TARGET_OS_MacOS + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/libopenvibe-plugins-sdk-file-io*dylib"); + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/libopenvibe-plugins-sdk-stimulation*dylib"); + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/libopenvibe-plugins-sdk-tools*dylib"); +#endif + + CIdentifier emptyScenarioIdentifier; + context->getScenarioManager().createScenario(emptyScenarioIdentifier); + + CMemoryBuffer memoryBuffer; + OVT_ASSERT(context->getScenarioManager().exportScenario(memoryBuffer, emptyScenarioIdentifier, OVP_GD_ClassId_Algorithm_XMLScenarioExporter), + "Failed to export an empty scenario"); + OVT_ASSERT( + context->getScenarioManager().exportScenarioToFile((std::string(temporaryDirectory) + "/test-scenario-empty.mxs").c_str(), emptyScenarioIdentifier, + OVP_GD_ClassId_Algorithm_XMLScenarioExporter), "Failed to export an empty scenario to a file"); + + CIdentifier importedEmptyScenarioIdentifier; + OVT_ASSERT(context->getScenarioManager().importScenario(importedEmptyScenarioIdentifier, memoryBuffer, OVP_GD_ClassId_Algorithm_XMLScenarioImporter), + "Failed to import an empty exported buffer"); + + // Create a scenario to be imported by the importer test + CIdentifier simpleScenarioIdentifier; + context->getScenarioManager().createScenario(simpleScenarioIdentifier); + + Kernel::IScenario& scenario = context->getScenarioManager().getScenario(simpleScenarioIdentifier); + + // Test scenario attributes + for (auto& attribute : simpleScenarioAttributes) { scenario.addAttribute(std::get<0>(attribute), std::get<1>(attribute).c_str()); } + + size_t settingIndex = 0; + for (auto& setting : simpleScenarioSettings) + { + scenario.addSetting(std::get<1>(setting).c_str(), std::get<0>(setting), std::get<2>(setting).c_str()); + scenario.setSettingValue(settingIndex, std::get<3>(setting).c_str()); + settingIndex += 1; + } + + CIdentifier actualClockStimulatorBoxId; + scenario.addBox(actualClockStimulatorBoxId, OVP_ClassId_BoxAlgorithm_ClockStimulator, s_ClockStimulatorBoxId); + + CIdentifier actualStimulationListenerBoxId; + scenario.addBox(actualStimulationListenerBoxId, OVP_ClassId_BoxAlgorithm_StimulationListener, s_StimulationListenerBoxId); + + Kernel::IBox* stimulatorListenerBox = scenario.getBoxDetails(s_StimulationListenerBoxId); + stimulatorListenerBox->addInput("Stimulation stream 2", OV_TypeId_Stimulations); + + int scenarioInputIdx = 0; + for (auto& scenarioInput : simpleScenarioInputs) + { + scenario.addInput(std::get<1>(scenarioInput).c_str(), std::get<0>(scenarioInput)); + if (std::get<2>(scenarioInput) != CIdentifier::undefined()) + { + scenario.setScenarioInputLink(scenarioInputIdx, std::get<2>(scenarioInput), std::get<3>(scenarioInput)); + } + scenarioInputIdx += 1; + } + + int scenarioOutputIdx = 0; + for (auto& scenarioOutput : simpleScenarioOutputs) + { + scenario.addOutput(std::get<1>(scenarioOutput).c_str(), std::get<0>(scenarioOutput)); + if (std::get<2>(scenarioOutput) != CIdentifier::undefined()) + { + scenario.setScenarioOutputLink(scenarioOutputIdx, std::get<2>(scenarioOutput), std::get<3>(scenarioOutput)); + } + scenarioOutputIdx += 1; + } + + CIdentifier actualClockStimulatorToStimulationListenerLinkId; + scenario.connect(actualClockStimulatorToStimulationListenerLinkId, s_ClockStimulatorBoxId, 0, s_StimulationListenerBoxId, 1, + s_ClockStimulatorToStimulationListenerLinkId); + + CIdentifier actualSimpleCommentIdentifier; + scenario.addComment(actualSimpleCommentIdentifier, s_SimpleCommentId); + + Kernel::IComment* simpleComment = scenario.getCommentDetails(s_SimpleCommentId); + simpleComment->setText("Content of a comment"); + + CIdentifier actualUnicodeCommentIdentifier; + scenario.addComment(actualUnicodeCommentIdentifier, s_UnicodeCommentId); + + Kernel::IComment* unicodeComment = scenario.getCommentDetails(s_UnicodeCommentId); + unicodeComment->setText("This comment contains a newline\nand unicode characters 日本語"); + + + OVT_ASSERT( + context->getScenarioManager().exportScenarioToFile((std::string(temporaryDirectory) + "/" + s_SimpleScenarioFileName).c_str(), + simpleScenarioIdentifier, OVP_GD_ClassId_Algorithm_XMLScenarioExporter), "Failed to export a simple scenario"); + } + + return urImportScenarioFromFileTest(argc, argv); +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/urImportScenarioFromFileTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/urImportScenarioFromFileTest.cpp new file mode 100755 index 0000000..21b93af --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/urImportScenarioFromFileTest.cpp @@ -0,0 +1,168 @@ +#include +#include +#include +#include "ovtAssert.h" +#include "ovtTestFixtureCommon.h" +#include "urSimpleTestScenarioDefinition.h" + +#define to_cppstring(str) std::string(str.toASCIIString()) + +int urImportScenarioFromFileTest(int /*argc*/, char* argv[]) +{ + const char* configFile = argv[1]; + const char* dataDirectory = argv[2]; + + { + Test::ScopedTest fixture(configFile); + auto& context = fixture->context; + +#if defined TARGET_OS_Windows + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/openvibe-plugins-sdk-file-io*dll"); + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/openvibe-plugins-sdk-stimulation*dll"); + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/openvibe-plugins-sdk-tools*dll"); +#elif defined TARGET_OS_Linux + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/libopenvibe-plugins-sdk-file-io*so"); + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/libopenvibe-plugins-sdk-stimulation*so"); + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/libopenvibe-plugins-sdk-tools*so"); +#elif defined TARGET_OS_MacOS + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/libopenvibe-plugins-sdk-file-io*dylib"); + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/libopenvibe-plugins-sdk-stimulation*dylib"); + context->getPluginManager().addPluginsFromFiles(Directories::getLibDir() + "/libopenvibe-plugins-sdk-tools*dylib"); +#endif + + const std::string scenarioFilePath = std::string(dataDirectory) + "/" + s_SimpleScenarioFileName; + + CIdentifier scenarioID; + OVT_ASSERT(context->getScenarioManager().importScenarioFromFile(scenarioID, scenarioFilePath.c_str(), OVP_GD_ClassId_Algorithm_XMLScenarioImporter), + "Failed to import the scenario file"); + OVT_ASSERT(scenarioID != CIdentifier::undefined(), "Scenario importer failed to import the scenario but failed to report an error"); + + auto& scenario = context->getScenarioManager().getScenario(scenarioID); + + // Test scenario attributes + for (auto& attribute : simpleScenarioAttributes) + { + OVT_ASSERT_STREQ(to_cppstring(scenario.getAttributeValue(std::get<0>(attribute))), std::get<1>(attribute), "Badly imported scenario attribute"); + } + + // Test settings + OVT_ASSERT(scenario.getSettingCount() == simpleScenarioSettings.size(), "Imported scenario does not have the correct number of settings"); + + for (size_t settingIndex = 0; settingIndex < simpleScenarioSettings.size(); settingIndex += 1) + { + CIdentifier settingTypeId; + OVT_ASSERT(scenario.getSettingType(settingIndex, settingTypeId), "Cannot get setting type"); + OVT_ASSERT(settingTypeId == std::get<0>(simpleScenarioSettings[settingIndex]), "Setting has wrong type"); + + CString settingName; + OVT_ASSERT(scenario.getSettingName(settingIndex, settingName), "Cannot get setting name"); + OVT_ASSERT_STREQ(to_cppstring(settingName), std::get<1>(simpleScenarioSettings[settingIndex]), "Setting has wrong name"); + + CString settingDefaultValue; + OVT_ASSERT(scenario.getSettingDefaultValue(settingIndex, settingDefaultValue), "Cannot get setting default value"); + OVT_ASSERT_STREQ(to_cppstring(settingDefaultValue), std::get<2>(simpleScenarioSettings[settingIndex]), "Setting has wrong default value"); + + CString settingValue; + OVT_ASSERT(scenario.getSettingValue(settingIndex, settingValue), "Cannot get setting value"); + OVT_ASSERT_STREQ(to_cppstring(settingValue), std::get<3>(simpleScenarioSettings[settingIndex]), "Setting has wrong value"); + } + + // Test boxes + OVT_ASSERT(scenario.isBox(s_ClockStimulatorBoxId), "Imported scenario does not contain the Clock Stimulator Box"); + OVT_ASSERT(scenario.isBox(s_StimulationListenerBoxId), "Imported scenario does not contain the Stimulation Listener Box"); + + const Kernel::IBox* clockStimulatorBox = scenario.getBoxDetails(s_ClockStimulatorBoxId); + OVT_ASSERT_STREQ(to_cppstring(clockStimulatorBox->getName()), std::string("Clock stimulator"), "Badly imported Clock Stimulator name"); + + const Kernel::IBox* stimulationListenerBox = scenario.getBoxDetails(s_StimulationListenerBoxId); + OVT_ASSERT_STREQ(to_cppstring(stimulationListenerBox->getName()), std::string("Stimulation listener"), "Badly imported Stimulation Listener name"); + + // Test inputs + OVT_ASSERT(scenario.getInputCount() == simpleScenarioInputs.size(), "Imported scenario has wrong number of inputs"); + + for (size_t index = 0; index < simpleScenarioInputs.size(); index += 1) + { + CIdentifier inputTypeId; + OVT_ASSERT(scenario.getInputType(index, inputTypeId), "Cannot get input type"); + OVT_ASSERT(inputTypeId == std::get<0>(simpleScenarioInputs[index]), "Input has wrong type"); + + CString inputName; + OVT_ASSERT(scenario.getInputName(index, inputName), "Cannot get input name"); + OVT_ASSERT_STREQ(to_cppstring(inputName), std::get<1>(simpleScenarioInputs[index]), "Input has wrong name"); + + CIdentifier dstBoxID; + size_t dstBoxInputIdx; + CIdentifier dstBoxInputID = CIdentifier::undefined(); + OVT_ASSERT(scenario.getScenarioInputLink(index, dstBoxID, dstBoxInputIdx), "Cannot get scenario input details by index"); + OVT_ASSERT(scenario.getScenarioInputLink(index, dstBoxID, dstBoxInputID), "Cannot get scenario input details by identifier"); + OVT_ASSERT(dstBoxID == std::get<2>(simpleScenarioInputs[index]), "Scenario input is not connected to the correct box"); + OVT_ASSERT(dstBoxInputIdx == std::get<3>(simpleScenarioInputs[index]), "Scenario input is not connected to the correct box input"); + } + + // Test outputs + OVT_ASSERT(scenario.getOutputCount() == simpleScenarioOutputs.size(), "Imported scenario has wrong number of outputs"); + + for (size_t idx = 0; idx < simpleScenarioOutputs.size(); idx += 1) + { + CIdentifier outputTypeId; + OVT_ASSERT(scenario.getOutputType(idx, outputTypeId), "Cannot get output type"); + OVT_ASSERT(outputTypeId == std::get<0>(simpleScenarioOutputs[idx]), "Output has wrong type"); + + CString outputName; + OVT_ASSERT(scenario.getOutputName(idx, outputName), "Cannot get output name"); + OVT_ASSERT_STREQ(to_cppstring(outputName), std::get<1>(simpleScenarioOutputs[idx]), "Output has wrong name"); + + CIdentifier dstBoxID; + size_t dstBoxOutputIndex; + CIdentifier dstBoxOutputIdentifier = CIdentifier::undefined(); + OVT_ASSERT(scenario.getScenarioOutputLink(idx, dstBoxID, dstBoxOutputIndex), "Cannot get scenario output details by index"); + OVT_ASSERT(scenario.getScenarioOutputLink(idx, dstBoxID, dstBoxOutputIdentifier), "Cannot get scenario output details by identifier"); + OVT_ASSERT(dstBoxID == std::get<2>(simpleScenarioOutputs[idx]), "Scenario output is not connected to the correct box"); + OVT_ASSERT(dstBoxOutputIndex == std::get<3>(simpleScenarioOutputs[idx]), "Scenario output is not connected to the correct box output"); + } + + // Test links + OVT_ASSERT(scenario.isLink(s_ClockStimulatorToStimulationListenerLinkId), + "Imported scenario does not contain a link between the Clock Stimulator and Stimulation Listener boxes"); + + const Kernel::ILink* clockStimulatorToStimulationListenerLink = scenario.getLinkDetails(s_ClockStimulatorToStimulationListenerLinkId); + + CIdentifier linkSourceBoxId; + size_t linkSourceOutputIndex; + CIdentifier linkSourceOutputIdentifier; + OVT_ASSERT(clockStimulatorToStimulationListenerLink->getSource(linkSourceBoxId, linkSourceOutputIndex, linkSourceOutputIdentifier), + "Could not get link details"); + OVT_ASSERT(linkSourceBoxId == s_ClockStimulatorBoxId, + "The Clock Stimulator to Stimulation Listener link does not have the Clock Stimulator as the source"); + OVT_ASSERT(linkSourceOutputIndex == 0, + "The Clock Stimulator to Stimulation Listener link does not have the first output of Clock Stimulator as the output"); + + CIdentifier linkTargetBoxId; + size_t linkTargetInputIndex; + CIdentifier linkTargetInputIdentifier; + OVT_ASSERT(clockStimulatorToStimulationListenerLink->getTarget(linkTargetBoxId, linkTargetInputIndex, linkTargetInputIdentifier), + "Could not get link details"); + OVT_ASSERT(linkTargetBoxId == s_StimulationListenerBoxId, + "The Clock Stimulator to Stimulation Listener link does not have the Stimulation Listener as the target"); + OVT_ASSERT(linkTargetInputIndex == 1, + "The Clock Stimulator to Stimulation Listener link does not have the second input of Stimulation Listener as the input"); + + // Test comments + + OVT_ASSERT(scenario.isComment(s_SimpleCommentId), "Imported scenario does not contain the simple comment"); + OVT_ASSERT(scenario.isComment(s_UnicodeCommentId), "Imported scenario does not contain the comment containing unicode"); + + const Kernel::IComment* simpleComment = scenario.getCommentDetails(s_SimpleCommentId); + + const CString simpleCommentText = simpleComment->getText(); + OVT_ASSERT_STREQ(std::string("Content of a comment"), to_cppstring(simpleCommentText), "The imported scenario comment contains a wrong text"); + + const Kernel::IComment* unicodeComment = scenario.getCommentDetails(s_UnicodeCommentId); + + const CString unicodeCommentText = unicodeComment->getText(); + OVT_ASSERT_STREQ(std::string("This comment contains a newline\nand unicode characters 日本語"), to_cppstring(unicodeCommentText), + "The imported scenario comment contains a wrong text"); + } + + return EXIT_SUCCESS; +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/urSimpleTestScenarioDefinition.h b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/urSimpleTestScenarioDefinition.h new file mode 100755 index 0000000..34cd87d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/urSimpleTestScenarioDefinition.h @@ -0,0 +1,44 @@ +#include +#include +#include + +using namespace OpenViBE; + +static const auto s_SimpleScenarioFileName = std::string("test-scenario-simple.mxs"); +static const auto s_ClockStimulatorBoxId = CIdentifier(0x66b53b19, 0x043b1afe); +static const auto s_StimulationListenerBoxId = CIdentifier(0x4468da36, 0x3fce3251); +static const auto s_ClockStimulatorToStimulationListenerLinkId = CIdentifier(0x1dd7b2d2, 0x3c1d084d); +static const auto s_SimpleCommentId = CIdentifier(0x24da4aa1, 0x7759a2ee); +static const auto s_UnicodeCommentId = CIdentifier(0x160bd469, 0x62a644ce); + +static std::vector> simpleScenarioAttributes = { + std::make_tuple(OV_AttributeId_Scenario_Name, std::string("SCENARIO NAME")), + std::make_tuple(OV_AttributeId_Scenario_Author, std::string("AUTHOR NAME")), + std::make_tuple(OV_AttributeId_Scenario_Company, std::string("COMPANY NAME")), + std::make_tuple(OV_AttributeId_Scenario_ShortDescription, std::string("SHORT DESCRIPTION")), + std::make_tuple(OV_AttributeId_Scenario_DetailedDescription, std::string("DETAILED DESCRIPTION")), + std::make_tuple(OV_AttributeId_Scenario_Category, std::string("SCENARIO CATEGORY")), + std::make_tuple(OV_AttributeId_Scenario_Version, std::string("SCENARIO VERSION")), + std::make_tuple(OV_AttributeId_Scenario_DocumentationPage, std::string("DOCUMENTATION PAGE")), + std::make_tuple(OV_AttributeId_Scenario_AddedSoftwareVersion, std::string("ADDED SOFTWARE VERSION")), + std::make_tuple(OV_AttributeId_Scenario_UpdatedSoftwareVersion, std::string("UPDATED SOFTWARE VERSION")) +}; + +static std::vector> simpleScenarioSettings = { + std::make_tuple(OV_TypeId_Integer, "Integer Setting", "10", "100"), + std::make_tuple(OV_TypeId_Float, "Float Setting", "3.14", "2.0 + 2.1"), + std::make_tuple(OV_TypeId_String, "String Setting", "Default string value", "Modified string value") +}; + +static std::vector> simpleScenarioInputs = { + std::make_tuple(OV_TypeId_Stimulations, "Stimulation Input", s_StimulationListenerBoxId, 0), + std::make_tuple(OV_TypeId_StreamedMatrix, "Disconnected Matrix Input", CIdentifier::undefined(), 0), +}; + +static std::vector> simpleScenarioOutputs = { + std::make_tuple(OV_TypeId_Stimulations, "Stimulation Output", s_ClockStimulatorBoxId, 0), + std::make_tuple(OV_TypeId_StreamedMatrix, "Disconnected Matrix Output", CIdentifier::undefined(), 0), +}; + + + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/urValidateScenarioTest.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/urValidateScenarioTest.cpp new file mode 100755 index 0000000..4970115 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/openvibe-toolkit/urValidateScenarioTest.cpp @@ -0,0 +1,312 @@ +#include +#include + +#include "gtest/gtest.h" + +#include "ovtAssert.h" +#include "ovtTestFixtureCommon.h" + +#include +#include + +// DO NOT USE a global Test::ScopedTest variable here +// because it causes a bug due to plugins global descriptors beeing destroyed before +// the kernel context. +OpenViBE::Kernel::IKernelContext* context = nullptr; +std::string g_dataDirectory; + + +bool importScenarioFromFile(const char* filename) +{ + const std::string scenarioFilePath = std::string(g_dataDirectory) + "/" + filename; + + context->getErrorManager().releaseErrors(); + + OpenViBE::CIdentifier scenarioID; + if (context->getScenarioManager().importScenarioFromFile(scenarioID, scenarioFilePath.c_str(), OVP_GD_ClassId_Algorithm_XMLScenarioImporter)) + { + context->getScenarioManager().releaseScenario(scenarioID); + return true; + } + + return false; +} + +// should be called after importScenarioFromFile +bool checkForSchemaValidationError() +{ + auto& errorManager = context->getErrorManager(); + auto error = errorManager.getLastError(); + + while (error) + { + if (error->getErrorType() == OpenViBE::Kernel::ErrorType::BadXMLSchemaValidation) { return true; } + error = error->getNestedError(); + } + + return false; +} + + +TEST(validate_scenario_test_case, test_no_false_positive) +{ + const std::array files = { "test-scenario-false-positive1.mxs", "test-scenario-false-positive2.mxs", "test-scenario-false-positive3.mxs" }; + + // here we use assert because we want to fail directly + // in order to avoid a segfault + ASSERT_TRUE(context != nullptr); + + for (size_t i = 0; i < 3; ++i) { EXPECT_TRUE(importScenarioFromFile(files[i])); } +} + +TEST(validate_scenario_test_case, test_root) +{ + const std::array files = { + "test-root-dup-attributes.mxs", + "test-root-dup-boxes.mxs", + "test-root-dup-comments.mxs", + "test-root-dup-creator.mxs", + "test-root-dup-inputs.mxs", + "test-root-dup-links.mxs", + "test-root-dup-outputs.mxs", + "test-root-dup-settings.mxs", + "test-root-dup-version.mxs" + }; + + // here we use assert because we want to fail directly + // in order to avoid a segfault + ASSERT_TRUE(context != nullptr); + + for (size_t i = 0; i < 9; ++i) + { + EXPECT_FALSE(importScenarioFromFile(files[i])); + EXPECT_TRUE(checkForSchemaValidationError()); + } +} + +TEST(validate_scenario_test_case, test_attribute) +{ + const std::array files = { + "test-attribute-dup-id.mxs", + "test-attribute-dup-value.mxs", + "test-attribute-missing-id.mxs", + "test-attribute-missing-value.mxs" + }; + + // here we use assert because we want to fail directly + // in order to avoid a segfault + ASSERT_TRUE(context != nullptr); + + for (size_t i = 0; i < 4; ++i) + { + EXPECT_FALSE(importScenarioFromFile(files[i])); + EXPECT_TRUE(checkForSchemaValidationError()); + } +} + +TEST(validate_scenario_test_case, test_box) +{ + const std::array files = { + "test-box-dup-algo.mxs", + "test-box-dup-attributes.mxs", + "test-box-dup-id.mxs", + "test-box-dup-inputs.mxs", + "test-box-dup-name.mxs", + "test-box-dup-outputs.mxs", + "test-box-dup-settings.mxs", + "test-box-missing-algo.mxs", + "test-box-missing-id.mxs", + "test-box-missing-name.mxs" + }; + + // here we use assert because we want to fail directly + // in order to avoid a segfault + ASSERT_TRUE(context != nullptr); + + for (size_t i = 0; i < 10; ++i) + { + EXPECT_FALSE(importScenarioFromFile(files[i])); + EXPECT_TRUE(checkForSchemaValidationError()); + } +} + +TEST(validate_scenario_test_case, test_comment) +{ + const std::array files = { + "test-comment-dup-attributes.mxs", + "test-comment-dup-id.mxs", + "test-comment-dup-text.mxs", + "test-comment-missing-id.mxs", + "test-comment-missing-text.mxs" + }; + + // here we use assert because we want to fail directly + // in order to avoid a segfault + ASSERT_TRUE(context != nullptr); + + for (size_t i = 0; i < 5; ++i) + { + EXPECT_FALSE(importScenarioFromFile(files[i])); + EXPECT_TRUE(checkForSchemaValidationError()); + } +} + +TEST(validate_scenario_test_case, test_input) +{ + const std::array files = { + "test-input-dup-id.mxs", + "test-input-dup-name.mxs", + "test-input-missing-id.mxs", + "test-input-missing-name.mxs" + }; + + // here we use assert because we want to fail directly + // in order to avoid a segfault + ASSERT_TRUE(context != nullptr); + + for (size_t i = 0; i < 4; ++i) + { + EXPECT_FALSE(importScenarioFromFile(files[i])); + EXPECT_TRUE(checkForSchemaValidationError()); + } +} + +TEST(validate_scenario_test_case, test_link) +{ + const std::array files = { + "test-link-dup-attributes.mxs", + "test-link-dup-id.mxs", + "test-link-dup-source.mxs", + "test-link-dup-target.mxs", + "test-link-missing-id.mxs", + "test-link-missing-source.mxs", + "test-link-missing-target.mxs" + }; + + // here we use assert because we want to fail directly + // in order to avoid a segfault + ASSERT_TRUE(context != nullptr); + + for (size_t i = 0; i < 7; ++i) + { + EXPECT_FALSE(importScenarioFromFile(files[i])); + EXPECT_TRUE(checkForSchemaValidationError()); + } +} + +TEST(validate_scenario_test_case, test_output) +{ + const std::array files = { + "test-output-dup-id.mxs", + "test-output-dup-name.mxs", + "test-output-missing-id.mxs", + "test-output-missing-name.mxs" + }; + + // here we use assert because we want to fail directly + // in order to avoid a segfault + ASSERT_TRUE(context != nullptr); + + for (size_t i = 0; i < 4; ++i) + { + EXPECT_FALSE(importScenarioFromFile(files[i])); + EXPECT_TRUE(checkForSchemaValidationError()); + } +} + +TEST(validate_scenario_test_case, test_setting) +{ + const std::array files = { + "test-setting-bad-modif.mxs", + "test-setting-dup-default.mxs", + "test-setting-dup-id.mxs", + "test-setting-dup-modif.mxs", + "test-setting-dup-name.mxs", + "test-setting-dup-value.mxs", + "test-setting-missing-default.mxs", + "test-setting-missing-id.mxs", + "test-setting-missing-name.mxs" + }; + + // here we use assert because we want to fail directly + // in order to avoid a segfault + ASSERT_TRUE(context != nullptr); + + for (size_t i = 0; i < 9; ++i) + { + EXPECT_FALSE(importScenarioFromFile(files[i])); + EXPECT_TRUE(checkForSchemaValidationError()); + } +} + +TEST(validate_scenario_test_case, test_source) +{ + const std::array files = { + "test-source-bad-index.mxs", + "test-source-dup-id.mxs", + "test-source-dup-index.mxs", + "test-source-missing-id.mxs", + "test-source-missing-index.mxs" + }; + + // here we use assert because we want to fail directly + // in order to avoid a segfault + ASSERT_TRUE(context != nullptr); + + for (size_t i = 0; i < 5; ++i) + { + EXPECT_FALSE(importScenarioFromFile(files[i])); + EXPECT_TRUE(checkForSchemaValidationError()); + } +} + +TEST(validate_scenario_test_case, test_target) +{ + const std::array files = { + "test-target-bad-index.mxs", + "test-target-dup-id.mxs", + "test-target-dup-index.mxs", + "test-target-missing-id.mxs", + "test-target-missing-index.mxs" + + }; + + // here we use assert because we want to fail directly + // in order to avoid a segfault + ASSERT_TRUE(context != nullptr); + + for (size_t i = 0; i < 5; ++i) + { + EXPECT_FALSE(importScenarioFromFile(files[i])); + EXPECT_TRUE(checkForSchemaValidationError()); + } +} + +int urValidateScenarioTest(int argc, char* argv[]) +{ + OVT_ASSERT(argc >= 3, "Failure retrieve test parameters"); + + OpenViBE::Test::ScopedTest fixture; + fixture->setConfigFile(argv[1]); + + g_dataDirectory = argv[2]; + context = fixture->context; + +#if defined TARGET_OS_Windows + context->getPluginManager().addPluginsFromFiles(OpenViBE::Directories::getLibDir() + "/openvibe-plugins-sdk-file-io*dll"); + context->getPluginManager().addPluginsFromFiles(OpenViBE::Directories::getLibDir() + "/openvibe-plugins-sdk-stimulation*dll"); + context->getPluginManager().addPluginsFromFiles(OpenViBE::Directories::getLibDir() + "/openvibe-plugins-sdk-tools*dll"); +#elif defined TARGET_OS_Linux + context->getPluginManager().addPluginsFromFiles(OpenViBE::Directories::getLibDir() + "/libopenvibe-plugins-sdk-file-io*so"); + context->getPluginManager().addPluginsFromFiles(OpenViBE::Directories::getLibDir() + "/libopenvibe-plugins-sdk-stimulation*so"); + context->getPluginManager().addPluginsFromFiles(OpenViBE::Directories::getLibDir() + "/libopenvibe-plugins-sdk-tools*so"); +#elif defined TARGET_OS_MacOS + context->getPluginManager().addPluginsFromFiles(OpenViBE::Directories::getLibDir() + "/libopenvibe-plugins-sdk-file-io*dylib"); + context->getPluginManager().addPluginsFromFiles(OpenViBE::Directories::getLibDir() + "/libopenvibe-plugins-sdk-stimulation*dylib"); + context->getPluginManager().addPluginsFromFiles(OpenViBE::Directories::getLibDir() + "/libopenvibe-plugins-sdk-tools*dylib"); +#endif + + testing::InitGoogleTest(&argc, argv); + ::testing::GTEST_FLAG(filter) = "validate_scenario_test_case.*"; + return RUN_ALL_TESTS(); +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/CIdentifierTest.hpp b/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/CIdentifierTest.hpp new file mode 100644 index 0000000..c376724 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/CIdentifierTest.hpp @@ -0,0 +1,64 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CIdentifierTest.hpp +/// \brief Test Definitions for OpenViBE Identifier Class. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 23/06/2020. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include +#include + +#include "utils.hpp" + +//--------------------------------------------------------------------------------------------------- +TEST(CIdentifier_Tests, constructors) +{ + OpenViBE::CIdentifier id1, id2(10), id3(-1), id4(10, 10), id5("false string"), id6("(0x00000000, 0x0000000A)"); + const uint64_t undef = std::numeric_limits::max(); + + EXPECT_EQ(id1.id(), undef) << ErrorMsg("Default Constructor", id1.id(), undef); + EXPECT_EQ(id2.id(), 10) << ErrorMsg("Integer Constructor", id2.id(), 10); + EXPECT_EQ(id3.id(), undef) << ErrorMsg("Negative value Constructor", id3.id(), undef); + EXPECT_EQ(id4.id(), 42949672970) << ErrorMsg("Double ID Constructor", id4.id(), 42949672970); // 10 * 2^32 + 10 + EXPECT_EQ(id5.id(), undef) << ErrorMsg("False string Constructor", id5.id(), undef); + EXPECT_EQ(id6.id(), 10) << ErrorMsg("String Constructor", id6.id(), 10); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST(CIdentifier_Tests, operators) +{ + OpenViBE::CIdentifier id(10); + const OpenViBE::CIdentifier id2(10); + const uint64_t undef = std::numeric_limits::max(); + + id = 0; + EXPECT_EQ(id.id(), 0) << ErrorMsg("Assignement operator with unsigned", id.id(), 0); + id = OpenViBE::CIdentifier::undefined(); + EXPECT_EQ(id.id(), undef) << ErrorMsg("Assignement operator with CIdentifier", id.id(), undef); + + ++id; // No change if undef + EXPECT_EQ(id.id(), undef) << ErrorMsg("++ operator with undefined Identifier", id.id(), undef); + --id; // No change if undef + EXPECT_EQ(id.id(), undef) << ErrorMsg("-- operator with undefined Identifier", id.id(), undef); + + id = 0; + --id; // 0 became max - 1 + EXPECT_EQ(id.id(), undef - 1) << ErrorMsg("-- operator with Identifier 0", id.id(), undef - 1); + ++id; // max - 1 became 0 + EXPECT_EQ(id.id(), 0) << ErrorMsg("++ operator with Identifier 0", id.id(), undef - 1); + + id = 0; + EXPECT_TRUE(id<=id && id>=id && id < id2 && id2 > id) << ErrorMsg("Comparison Operator", id.id(), id2.id()); + + std::stringstream ss; + ss << id; + EXPECT_EQ(ss.str(), "(0x00000000, 0x00000000)") << ErrorMsg("ostream operator", ss.str(), "(0x00000000, 0x00000000)"); +} +//--------------------------------------------------------------------------------------------------- diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/CMakeLists.txt new file mode 100644 index 0000000..9a3a263 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/CMakeLists.txt @@ -0,0 +1,18 @@ +####################################################################### +# Software License Agreement : GNU Affero General Public License v3.0 +# https://choosealicense.com/licenses/agpl-3.0/ +####################################################################### + +PROJECT(ov-base-test) + +FILE(GLOB_RECURSE SRC_FILES *.cpp *.hpp) +ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES}) + +SET_BUILD_PLATFORM() # Default build Platform +INCLUDE("FindOpenViBE") # Find OpenViBE base includes and library +INCLUDE("FindOpenViBECommon") # Find OpenViBE Common includes and library +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) # Place project in folder unit-test (for some IDE) + +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${GTEST_BOTH_LIBRARIES}) # Add google Test + +ADD_TEST(NAME base COMMAND ${PROJECT_NAME}) diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/CMatrixTest.hpp b/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/CMatrixTest.hpp new file mode 100644 index 0000000..42c1e80 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/CMatrixTest.hpp @@ -0,0 +1,172 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CMatrixTest.hpp +/// \brief Test Definitions for OpenViBE Matrix Class. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 11/05/2020. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include +#include +#include "utils.hpp" + +//--------------------------------------------------------------------------------------------------- +class CMatrix_Tests : public testing::Test +{ +protected: + OpenViBE::CMatrix m_mat; + + void SetUp() override + { + m_mat.resize(1, 2); // one row two column buffer not init + m_mat.getBuffer()[0] = 10; // Buffer init with getBuffer and First element set + m_mat.getBuffer()[1] = 20; // Second Element set (buffer already init so refresh function not run) + m_mat.setDimensionLabel(0, 0, "dim0e0"); // Row label set + m_mat.setDimensionLabel(1, 0, "dim1e0"); // Column 1 Label set + m_mat.setDimensionLabel(1, 1, "dim1e1"); // Column 2 Label set + } +}; +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(CMatrix_Tests, Constructor) +{ + OpenViBE::CMatrix res; + ASSERT_EQ(0, res.getSize()) << "Default constructor doesn't have a size of 0."; + EXPECT_STREQ("", res.getDimensionLabel(0, 0)) << "Default constructor has no dimension so no label."; + + ASSERT_EQ(2, m_mat.getSize()) << "Setup Matrix doesn't have 2 values."; + ASSERT_EQ(2, m_mat.getDimensionCount()) << "Setup Matrix doesn't have 2 Dimensions."; + ASSERT_EQ(1, m_mat.getDimensionSize(0)) << "Setup Matrix doesn't have 1 Row."; + ASSERT_EQ(2, m_mat.getDimensionSize(1)) << "Setup Matrix doesn't have 2 Columns."; + EXPECT_TRUE(AlmostEqual(10, m_mat.getBuffer()[0])) << "Setup Matrix 1st value isn't 10."; + EXPECT_TRUE(AlmostEqual(20, m_mat.getBuffer()[1])) << "Setup Matrix 2nd value isn't 20."; + EXPECT_STREQ("dim0e0", m_mat.getDimensionLabel(0, 0)) << "Setup Matrix Row Label isn't dim0e0."; + EXPECT_STREQ("dim1e0", m_mat.getDimensionLabel(1, 0)) << "Setup Matrix 1st Column Label isn't dim1e0."; + EXPECT_STREQ("dim1e1", m_mat.getDimensionLabel(1, 1)) << "Setup Matrix 2nd Column Label isn't dim1e1."; + + EXPECT_TRUE(m_mat.isBufferValid()) << "Setup Matrix isn't valid"; + m_mat.getBuffer()[0] = std::numeric_limits::infinity(); + EXPECT_FALSE(m_mat.isBufferValid()) << "infinity isn't considered as invalid"; + m_mat.getBuffer()[0] = std::numeric_limits::quiet_NaN(); + EXPECT_FALSE(m_mat.isBufferValid()) << "Setup Matrix isn't valid"; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(CMatrix_Tests, Constructor_Copy) +{ + OpenViBE::CMatrix res(m_mat); + + EXPECT_TRUE(m_mat == res) << ErrorMsg("Copy Constructor", m_mat, res); + + res.getBuffer()[0] = 15; + res.getBuffer()[1] = 25; + res.setDimensionLabel(1, 0, "changed"); + + EXPECT_TRUE(AlmostEqual(10, m_mat.getBuffer()[0])) << "Setup Matrix 1st value isn't 10."; + EXPECT_TRUE(AlmostEqual(20, m_mat.getBuffer()[1])) << "Setup Matrix 2nd value isn't 20."; + EXPECT_STREQ("dim1e0", m_mat.getDimensionLabel(1, 0)) << "Setup Matrix 1st Column Label isn't dim1e0."; + EXPECT_TRUE(AlmostEqual(15, res.getBuffer()[0])) << "New Matrix 1st value isn't 15."; + EXPECT_TRUE(AlmostEqual(25, res.getBuffer()[1])) << "New Matrix 2nd value isn't 25."; + EXPECT_STREQ("changed", res.getDimensionLabel(1, 0)) << "New Matrix 1st Column Label isn't changed."; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(CMatrix_Tests, Constructor_copy_in_array_push) +{ + std::vector res; + res.push_back(m_mat); + res.push_back(m_mat); + + res[0].getBuffer()[0] = 15; + res[0].getBuffer()[1] = 25; + res[0].setDimensionLabel(1, 0, "changed"); + + EXPECT_TRUE(AlmostEqual(15, res[0].getBuffer()[0])) << "1st Matrix 1st value isn't 15."; + EXPECT_TRUE(AlmostEqual(25, res[0].getBuffer()[1])) << "1st Matrix 2nd value isn't 25."; + EXPECT_STREQ("changed", res[0].getDimensionLabel(1, 0)) << "1st Matrix 1st Column Label isn't changed."; + EXPECT_TRUE(AlmostEqual(10, res[1].getBuffer()[0])) << "2nd Matrix 1st value isn't 10."; + EXPECT_TRUE(AlmostEqual(20, res[1].getBuffer()[1])) << "2nd Matrix 2nd value isn't 20."; + EXPECT_STREQ("dim1e0", res[1].getDimensionLabel(1, 0)) << "2nd Matrix 1st Column Label isn't dim1e0."; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(CMatrix_Tests, Operators) +{ + OpenViBE::CMatrix res = m_mat; + + EXPECT_TRUE(m_mat.isDescriptionEqual(m_mat)) << ErrorMsg("equality description", m_mat, m_mat); + EXPECT_TRUE(m_mat.isBufferEqual(m_mat)) << ErrorMsg("equality buffer", m_mat, m_mat); + EXPECT_TRUE(m_mat.isBufferAlmostEqual(m_mat)) << ErrorMsg("Almost equality buffer", m_mat, m_mat); + EXPECT_TRUE(m_mat == m_mat) << ErrorMsg("equality operator", m_mat, m_mat); + EXPECT_TRUE(m_mat == res) << ErrorMsg("Copy assignement", m_mat, res); + + m_mat.getBuffer()[0] = 15; + m_mat.getBuffer()[1] = 25; + m_mat.setDimensionLabel(1, 0, "changed"); + + EXPECT_TRUE(AlmostEqual(15, m_mat.getBuffer()[0])) << "Setup Matrix 1st value isn't 15."; + EXPECT_TRUE(AlmostEqual(25, m_mat.getBuffer()[1])) << "Setup Matrix 2nd value isn't 25."; + EXPECT_STREQ("changed", m_mat.getDimensionLabel(1, 0)) << "Setup Matrix 1st Column Label isn't changed."; + EXPECT_TRUE(AlmostEqual(10, res.getBuffer()[0])) << "New Matrix 1st value isn't 10."; + EXPECT_TRUE(AlmostEqual(20, res.getBuffer()[1])) << "New Matrix 2nd value isn't 20."; + EXPECT_STREQ("dim1e0", res.getDimensionLabel(1, 0)) << "New Matrix 1st Column Label isn't dim1e0."; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(CMatrix_Tests, Resize) +{ + OpenViBE::CMatrix res(1, 2); + res.resetBuffer(); + res.setDimensionLabel(0, 0, "label"); + ASSERT_EQ(2, res.getDimensionCount()) << "Matrix doesn't have 2 Dimensions."; + ASSERT_EQ(1, res.getDimensionSize(0)) << "Matrix doesn't have 1 Row."; + ASSERT_EQ(2, res.getDimensionSize(1)) << "Matrix doesn't have 2 Columns."; + EXPECT_TRUE(AlmostEqual(0, res.getBuffer()[0])) << "Matrix 1st default value isn't 0 after resize."; + EXPECT_TRUE(AlmostEqual(0, res.getBuffer()[1])) << "Matrix 2nd default value isn't 0 after resize."; + EXPECT_STREQ("label", res.getDimensionLabel(0, 0)) << "Matrix Row Label isn't \"label\"."; + EXPECT_STREQ("", res.getDimensionLabel(1, 0)) << "Matrix 1st Col default Label isn't empty."; + EXPECT_STREQ("", res.getDimensionLabel(1, 1)) << "Matrix 2nd Col default Label isn't empty."; + + res.resize(2, 2); + res.setDimensionLabel(1, 1, "label"); + ASSERT_EQ(2, res.getDimensionCount()) << "Matrix doesn't have 2 Dimensions."; + ASSERT_EQ(2, res.getDimensionSize(0)) << "Matrix doesn't have 2 Row."; + ASSERT_EQ(2, res.getDimensionSize(1)) << "Matrix doesn't have 2 Columns."; + EXPECT_STREQ("", res.getDimensionLabel(0, 0)) << "Matrix 1st Row default Label isn't empty."; // The resize remove all previous label and size + EXPECT_STREQ("label", res.getDimensionLabel(1, 1)) << "Matrix 2nd Col Label isn't \"label\"."; + + res.resetLabels(); + EXPECT_STREQ("", res.getDimensionLabel(1, 1)) << "Matrix 2nd Col reseted Label isn't empty."; + + res.resize(2); + ASSERT_EQ(1, res.getDimensionCount()) << "Matrix doesn't have 1 Dimension."; + ASSERT_EQ(2, res.getDimensionSize(0)) << "Matrix doesn't have 2 Row."; +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST_F(CMatrix_Tests, Save_Load) +{ + OpenViBE::CMatrix res; + EXPECT_TRUE(m_mat.toTextFile("Save_2DMatrix-output.txt")) << "Error during Saving 2D Matrix : " << std::endl << m_mat << std::endl; + EXPECT_TRUE(res.fromTextFile("Save_2DMatrix-output.txt")) << "Error during Loading 2D Matrix : " << std::endl << res << std::endl; + EXPECT_TRUE(m_mat == res) << ErrorMsg("Save", m_mat, res); + + OpenViBE::CMatrix row(2); + row.getBuffer()[0] = -1; + row.getBuffer()[1] = -4.549746549678; + EXPECT_TRUE(row.toTextFile("Save_2DMatrix-output.txt")) << "Error during Saving 1D Matrix : " << std::endl << row << std::endl; + EXPECT_TRUE(res.fromTextFile("Save_2DMatrix-output.txt")) << "Error during Loading 1D Matrix : " << std::endl << res << std::endl; + EXPECT_TRUE(row == res) << ErrorMsg("Save", row, res); +} +//--------------------------------------------------------------------------------------------------- diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/CTimeTest.hpp b/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/CTimeTest.hpp new file mode 100644 index 0000000..e2d769d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/CTimeTest.hpp @@ -0,0 +1,188 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CMatrixTest.hpp +/// \brief Test Definitions for OpenViBE Matrix Class. +/// \author Thibaut Monseigne (Inria). +/// \version 1.0. +/// \date 11/05/2020. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include +#include +#include +#include + +#include "utils.hpp" + +//--------------------------------------------------------------------------------------------------- +namespace Dataset { + +const double HOUR = 60 * 60; +const double DAY = 24 * HOUR; +const double WEEK = 7 * DAY; +const double MONTH = 30 * DAY; +const double YEAR = 365 * DAY; + +/// time values to test in seconds +const std::vector SECONDS = +{ + 0, 0.001, 0.01, 0.1, 0.2, 0.25, 0.5, 1.0, 1.1, 1.5, 2, + 1.000001, 1.999, 1.999999, + 5, 10, 50, 100, 123.456789, 128.0, 500, 1000, 2500, 5000, + DAY, DAY + 0.03, DAY + 0.999, DAY + 1, + WEEK, WEEK + 0.03, WEEK + 0.999, WEEK + 1, + MONTH, MONTH + 0.03, MONTH + 0.999, MONTH + 1, + YEAR, YEAR + 0.03, YEAR + 0.999, YEAR + 1, +}; + +/// Time values to test in fixed point format. +const std::vector FIXED_POINT = +{ + 1LL << 8, 1LL << 16, 1L << 19, 1LL << 22, 1LL << 27, 1L << 30, 1LL << 32, 10LL << 32, 100LL << 32, 123LL << 32, 500LL << 32, 512LL << 32, 1000LL << 32, + 1024LL << 32, 2001LL << 32, 5000LL << 32 +}; + +/// Sampling rates to test. +const std::vector SAMPLINGS = { 100, 128, 512, 1000, 1024, 16000, 44100 }; + +/// Samples to test. +const std::vector SAMPLES = { 0, 1, 100, 128, 512, 1000, 1021, 1024, 5005, 12345, 59876, 100000, 717893, 1000001 }; + +/// Epoch durations to test. +const std::vector DURATIONS = { 0.01, 0.1, 0.2, 0.25, 0.5, 1.0, 1.1, 1.5, 2, 5, 10, 50, 100 }; + +/// We select 10-9 tolerance for seconds, being the best precision capacity of the CTime class. +const double TOLERANCE = 10e-9; +} // namespace Dataset +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST(CTime_Tests, constructor_time) +{ + for (auto ref : Dataset::FIXED_POINT) + { + const OpenViBE::CTime res(ref); + EXPECT_EQ(res.time(), ref) << ErrorMsg("Constructor with time", ref, res.time()); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST(CTime_Tests, constructor_seconds) +{ + // test construction & conversion second -> fixed point -> second + for (auto ref : Dataset::SECONDS) + { + const auto res = OpenViBE::CTime(ref).toSeconds(); + EXPECT_LT(std::abs(res - ref), Dataset::TOLERANCE) << ErrorMsg("Constructor with seconds and conversion to seconds", ref, res); + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST(CTime_Tests, constructor_sampling) +{ + // test construction & conversion sample -> time -> sample + for (auto sampling : Dataset::SAMPLINGS) + { + for (auto ref : Dataset::SAMPLES) + { + const auto res = OpenViBE::CTime(sampling, ref).toSampleCount(sampling); + EXPECT_EQ(ref, res) << ErrorMsg("Constructor with sampling and sample count and conversion to sample count", ref, res); + } + } + EXPECT_TRUE(OpenViBE::CTime(0, 1) == OpenViBE::CTime::max()) << ErrorMsg("Special Case if sampling = 0", + OpenViBE::CTime::max(), OpenViBE::CTime(0, 1)); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST(CTime_Tests, ceil) +{ + // Ceil Test + const OpenViBE::CTime t0 = OpenViBE::CTime().min().ceil(); + const OpenViBE::CTime t1 = OpenViBE::CTime().max().ceil(); + const OpenViBE::CTime t2 = OpenViBE::CTime(0xFEDCBA9876543210).ceil(); + const OpenViBE::CTime t3 = OpenViBE::CTime(0xFEDCBA9900000000); + + EXPECT_TRUE(t0 == t0) << ErrorMsg("ceil of Time Min (0)", t0, t0); + EXPECT_TRUE(t1 == t0) << ErrorMsg("ceil of Time Max (0xFFFFFFFFFFFFFFFF)", t0, t1); + EXPECT_TRUE(t2 == t3) << ErrorMsg("ceil of Time (0xFEDCBA9876543210)", t3, t2); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST(CTime_Tests, operators) +{ + // Operators Tests + const OpenViBE::CTime t0 = OpenViBE::CTime(1.0) + OpenViBE::CTime(1.0); + const OpenViBE::CTime t1 = OpenViBE::CTime(4.0) - OpenViBE::CTime(1.0); + const OpenViBE::CTime t2 = OpenViBE::CTime(1.0) - OpenViBE::CTime(4.0); + + const OpenViBE::CTime r0 = OpenViBE::CTime(2.0); + const OpenViBE::CTime r1 = OpenViBE::CTime(3.0); + // we remove 2 second from the max + // - We have -3 as result, with uint max = -1 so result is max - 2 + // and max seconds = 2^32 - 1 (0xFFFFFFFF) so result is max - 2 : 0xFFFFFFFD so in Fixed Point 0xFFFFFFFD00000000) + const OpenViBE::CTime r2 = OpenViBE::CTime(0xFFFFFFFD00000000); + + // Comparison + EXPECT_TRUE(r0 == r0) << ErrorMsg("ref == calc", t0, t0); + EXPECT_FALSE(r0 != r0) << ErrorMsg("!(ref != calc)", t1, t1); + EXPECT_TRUE(r0 < r1) << ErrorMsg("(ref < calc)", r0, r1); + EXPECT_TRUE(r0 <= r1) << ErrorMsg("(ref <= calc)", r0, r1); + EXPECT_TRUE(r1 > r0) << ErrorMsg("(ref > calc)", r1, r0); + EXPECT_TRUE(r1 >= r0) << ErrorMsg("(ref >= calc)", r1, r0); + + // Operation + EXPECT_TRUE(t0 == r0) << ErrorMsg("Addition result", r0, t0); + EXPECT_TRUE(t1 == r1) << ErrorMsg("Substract result", r1, t1); + EXPECT_TRUE(t2 == r2) << ErrorMsg("substract with negative result", r2, t2); + + // Str + EXPECT_EQ("1.000 sec (0x0000000100000000)", OpenViBE::CTime(1.0).str(true, true)); + EXPECT_EQ("1.000 sec", OpenViBE::CTime(1.0).str(true, false)); + EXPECT_EQ("4294967296 (0x0000000100000000)", OpenViBE::CTime(1.0).str(false, true)); + EXPECT_EQ("4294967296", OpenViBE::CTime(1.0).str(false, false)); +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST(CTime_Tests, conversion_chain) +{ + // test conversion time -> sample -> time + for (auto sampling : Dataset::SAMPLINGS) + { + for (auto seconds : Dataset::SECONDS) + { + auto tmp = OpenViBE::CTime(seconds).time(); + // If the sample count would overflow an uint64_t we skip the test + if (std::log2(sampling) + std::log2(tmp) >= 64) { continue; } + + const uint64_t compute = OpenViBE::CTime(sampling, OpenViBE::CTime(tmp).toSampleCount(sampling)).time(); + const uint64_t difference = uint64_t(std::abs(int64_t(compute) - int64_t(tmp))); + + EXPECT_LT(OpenViBE::CTime(difference).toSeconds(), (1.0 / double(sampling))) + << "Time difference too large between OV(" << seconds << ") and " + << "SCtoOV(" << sampling << ", OVtoSC(" << sampling << "," << tmp << "))"; + } + } +} +//--------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------- +TEST(CTime_Tests, legacy_epoching) +{ + // compare second -> time conversion to legacy method + for (auto duration : Dataset::DURATIONS) + { + const auto legacy = uint64_t(duration * (1LL << 32)); // Legacy code from stimulationBasedEpoching + const auto res = OpenViBE::CTime(duration).time(); + EXPECT_EQ(res, legacy) << ErrorMsg("Legacy Epoching for duration : " + std::to_string(duration), legacy, res); + } +} +//--------------------------------------------------------------------------------------------------- diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/main.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/main.cpp new file mode 100644 index 0000000..1ecef6e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/main.cpp @@ -0,0 +1,16 @@ +#include + +// ReSharper disable CppUnusedIncludeDirective +#include "CMatrixTest.hpp" +#include "CTimeTest.hpp" +#include "CIdentifierTest.hpp" + +int main(int argc, char* argv[]) +{ + try + { + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); + } + catch (std::exception&) { return 1; } +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/utils.hpp b/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/utils.hpp new file mode 100644 index 0000000..ceb3fed --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/ov-base/utils.hpp @@ -0,0 +1,87 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file utils.hpp +/// \brief Some constants and functions for google tests +/// \author Thibaut Monseigne (Inria). +/// \version 0.1. +/// \date 26/10/2018. +/// \copyright GNU Affero General Public License v3.0. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "openvibe/CIdentifier.hpp" +#include "openvibe/CTime.hpp" +#include + +#include +#include + +const std::string SEP = "\n====================\n"; + +//--------------------------------------------------------------------------------------------------- +/// Check if double are almost equals. +/// The first number. +/// The second number. +/// The tolerance. +/// true if almmost equals, false otherwise. +inline bool AlmostEqual(const double a, const double b, const double epsilon = OV_EPSILON) { return std::fabs(a - b) < std::fabs(epsilon); } + +//***************************************************************** +//********** Error Message Standardization for googltest ********** +//***************************************************************** +//--------------------------------------------------------------------------------------------------- +/// Error message for numeric value. +/// The name of the test. +/// The reference value. +/// The calculate value. +/// Error message. +/// Generic numeric type parameter. +template ::value, T>::type> +std::string ErrorMsg(const std::string& name, const T ref, const T calc) +{ + std::stringstream ss; + ss << SEP << name << " : Reference : " << ref << ", \tCompute : " << calc << SEP; + return ss.str(); +} + +//--------------------------------------------------------------------------------------------------- +/// Error message for string value. +/// +inline std::string ErrorMsg(const std::string& name, const std::string& ref, const std::string& calc) +{ + std::stringstream ss; + ss << SEP << name << " : Reference : " << ref << ", \tCompute : " << calc << SEP; + return ss.str(); +} + +//--------------------------------------------------------------------------------------------------- +/// Error message for CTime value. +/// +inline std::string ErrorMsg(const std::string& name, const OpenViBE::CTime& ref, const OpenViBE::CTime& calc) +{ + std::stringstream ss; + ss << SEP << name << " : Reference : " << ref.str(true, true) << ", \tCompute : " << calc.str(true, true) << SEP; + return ss.str(); +} + +//--------------------------------------------------------------------------------------------------- +/// Error message for CIdentifier value. +/// +inline std::string ErrorMsg(const std::string& name, const OpenViBE::CIdentifier& ref, const OpenViBE::CIdentifier& calc) +{ + std::stringstream ss; + ss << SEP << name << " : Reference : " << ref << ", \tCompute : " << calc << SEP; + return ss.str(); +} + +//--------------------------------------------------------------------------------------------------- +/// Error message for CIdentifier value. +/// +inline std::string ErrorMsg(const std::string& name, const OpenViBE::CMatrix& ref, const OpenViBE::CMatrix& calc) +{ + std::stringstream ss; + ss << SEP << name << " : " << std::endl << "********** Reference **********\n" << ref << std::endl << "********** Compute **********\n" << calc << SEP; + return ss.str(); +} diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/CMakeLists.txt new file mode 100755 index 0000000..8e7b7b8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/CMakeLists.txt @@ -0,0 +1,65 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +PROJECT(openvibe-test-unit-toolkit) + +# ------------------ +# Project variables +# ------------------ + +SET(PROJECT_VERSION_MAJOR ${OVT_GLOBAL_VERSION_MAJOR}) +SET(PROJECT_VERSION_MINOR ${OVT_GLOBAL_VERSION_MINOR}) +SET(PROJECT_VERSION_PATCH ${OVT_GLOBAL_VERSION_PATCH}) +SET(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +# --------------------------------- +# Target macros +# Defines target operating system, architecture and compiler +# --------------------------------- + +SET_BUILD_PLATFORM() + +# ---------------------- +# Generate target +# ---------------------- + +ADD_DEFINITIONS( -DPROJECT_VERSION="${PROJECT_VERSION}" ) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) +FILE(GLOB_RECURSE SRC_FILES src/*.cpp include/*.h) +ADD_LIBRARY(${PROJECT_NAME} ${SRC_FILES}) + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${TESTS_FOLDER}) + +INCLUDE("FindOpenViBE") +INCLUDE("FindOpenViBECommon") +INCLUDE("FindOpenViBEToolkit") + +# ------------- +# External Use +# ------------- + +# Target name used by other target for linking purpose +SET(OVT_UNIT_TOOLKIT_LIB ${PROJECT_NAME} PARENT_SCOPE) +SET(OVT_UNIT_TOOLKIT_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include PARENT_SCOPE) + diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/include/ovtAssert.h b/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/include/ovtAssert.h new file mode 100755 index 0000000..4277e8d --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/include/ovtAssert.h @@ -0,0 +1,88 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +#include + +namespace OpenViBE { +namespace Test { +void printError(const char* expression, const char* message, const char* file, const int line); +void printError(const char* expression, const std::string& message, const char* file, const int line); +void printError(const char* expression, const std::ostream& message, const char* file, const int line); +void printExpressionPair(const char* str1, const char* str2); +std::string buildExpressionFromPair(const char* str1, const char* str2); +} // namespace Test +} // namespace OpenViBE + +/** +* OVT_ASSERT_PRIV: Assess expression and +* return EXIT_FAILURE if expr is false +* - expr: expression to assess +* - origin: original assessed expression +* - msg: custom error message +* WARNING: SHOULD NOT BE USED DIRECTLY +*/ +#define OVT_ASSERT_PRIV(expr, origin, msg) \ +do { \ + if (!(expr)) \ + { \ + OpenViBE::Test::printError(#origin, (msg), __FILE__, __LINE__); \ + return EXIT_FAILURE; \ + } \ +} while (0) + +/** +* OVT_ASSERT: Assess simple expression +* - expr: expression to assess +* - msg: custom error message +*/ +#define OVT_ASSERT(expr, msg) OVT_ASSERT_PRIV((expr), (expr), (msg)) + +/** +* OVT_ASSERT_STR: Assess string equality +* - str1: reference string +* - str2: compared string +* - msg: custom error message +*/ +#define OVT_ASSERT_STREQ(str1, str2, msg) \ +do { \ + if (!((str1) == (str2))) \ + { \ + OpenViBE::Test::printError(OpenViBE::Test::buildExpressionFromPair(#str1, #str2).c_str(),(msg), __FILE__, __LINE__); \ + OpenViBE::Test::printExpressionPair((str1).c_str(),(str2).c_str());\ + return EXIT_FAILURE; \ + } \ +} while (0) + +/** +* OVT_ASSERT_EX: Assess expr throws an +* exception +* - expr: expression to assess +* - msg: custom error message +*/ +#define OVT_ASSERT_EX(expr, msg) \ +do { \ + bool hasTrown{ false }; \ + try { (expr); } \ + catch (...) { hasTrown = true; } \ + OVT_ASSERT_PRIV(hasTrown, (msg)); \ +} while (0) diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/include/ovtTestFixture.h b/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/include/ovtTestFixture.h new file mode 100755 index 0000000..c1c15dc --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/include/ovtTestFixture.h @@ -0,0 +1,81 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +#include + +namespace OpenViBE { +namespace Test { +/** +* \struct TestFixture +* \author cgarraud (INRIA) +* \date 2016-02-08 +* \brief Base abstract struct for test fixture +* +* A test fixture is used when an environment has to be set for a specific test. +* TestFixture implementation should not be used directly but through ScopedTest. +*/ +struct TestFixture +{ + virtual ~TestFixture() = default; + TestFixture() = default; + + /** + * \brief Setup resources for the test + */ + virtual void setUp() = 0; + + /** + * \brief Release resources + */ + virtual void tearDown() = 0; + +private: + + TestFixture& operator=(const TestFixture&) = delete; + TestFixture(const TestFixture&) = delete; +}; + +/** +* \struct ScopedTest +* \author cgarraud (INRIA) +* \date 2016-02-08 +* \brief Class used to ensure RAII when using TestFixture +* +* A scoped object is a wrapper around a test fixture used to +* ensure RAII when running tests. +*/ +template +struct ScopedTest +{ + template + explicit ScopedTest(TArgs&&... args) : fixture(new T(std::forward(args)...)) { fixture->setUp(); } + + ~ScopedTest() { fixture->tearDown(); } + + const T* operator->() const { return fixture.get(); } + T* operator->() { return fixture.get(); } + + std::unique_ptr fixture; +}; +} // namespace Test +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/include/ovtTestFixtureCommon.h b/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/include/ovtTestFixtureCommon.h new file mode 100755 index 0000000..c0d1cc8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/include/ovtTestFixtureCommon.h @@ -0,0 +1,50 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#pragma once + +#include + +#include + +#include "ovtTestFixture.h" + +// \note: This file contains fixture implementation shared by many unit tests +namespace OpenViBE { +namespace Test { +struct SKernelFixture final : TestFixture +{ + SKernelFixture() = default; + explicit SKernelFixture(const std::string& configFile) : m_configFile(configFile) { } + + void setConfigFile(const std::string& configFile) { m_configFile = configFile; } + + void setUp() override; + void tearDown() override; + + Kernel::IKernelContext* context{ nullptr }; + +private: + std::string m_configFile; + CKernelLoader m_kernelLoader; +}; +} // namespace Test +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/src/ovtAssert.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/src/ovtAssert.cpp new file mode 100755 index 0000000..5f668b5 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/src/ovtAssert.cpp @@ -0,0 +1,64 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include + +#include "ovtAssert.h" + +namespace OpenViBE { +namespace Test { +static void printErrorCore(const char* expression, const char* file, const int line) +{ + std::cerr << "Failed to evaluate: " << expression << std::endl; + std::cerr << "File = " << file << std::endl; + std::cerr << "Line = " << line << std::endl; +} + +void printError(const char* expression, const char* message, const char* file, const int line) +{ + printErrorCore(expression, file, line); + std::cerr << "Error message: " << message << std::endl; +} + +void printError(const char* expression, const std::string& message, const char* file, const int line) { printError(expression, message.c_str(), file, line); } + +void printError(const char* expression, const std::ostream& message, const char* file, const int line) +{ + printErrorCore(expression, file, line); + std::cerr << "Error message: " << message.rdbuf() << std::endl; +} + +void printExpressionPair(const char* str1, const char* str2) +{ + std::cerr << "Expression 1 is : " << str1 << std::endl; + std::cerr << "Expression 2 is : " << str2 << std::endl; +} + +std::string buildExpressionFromPair(const char* str1, const char* str2) +{ + std::string expression = "( " + std::string(str1); + expression += " = "; + expression += std::string(str2) + " )"; + + return expression; +} +} // namespace Test +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/src/ovtTestFixtureCommon.cpp b/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/src/ovtTestFixtureCommon.cpp new file mode 100755 index 0000000..e9ca1f9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/unit-test/unit-toolkit/src/ovtTestFixtureCommon.cpp @@ -0,0 +1,93 @@ +/********************************************************************* +* Software License Agreement (AGPL-3 License) +* +* OpenViBE SDK Test Software +* Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +* Copyright (C) Inria, 2015-2017,V1.0 +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. +* If not, see . +*/ + +#include + +#include + +#include "ovtTestFixtureCommon.h" + +namespace OpenViBE { +namespace Test { +void SKernelFixture::setUp() +{ +#if defined TARGET_OS_Windows + const CString kernelFile = Directories::getLibDir() + "/openvibe-kernel.dll"; +#elif defined TARGET_OS_Linux + const CString kernelFile = Directories::getLibDir() + "/libopenvibe-kernel.so"; +#elif defined TARGET_OS_MacOS + const CString kernelFile = Directories::getLibDir() + "/libopenvibe-kernel.dylib"; +#endif + CString error; + + if (!m_kernelLoader.load(kernelFile, &error)) + { + std::cerr << "ERROR: impossible to load kernel from file located at: " << kernelFile << std::endl; + std::cerr << "ERROR: kernel error: " << error << std::endl; + return; + } + + m_kernelLoader.initialize(); + + Kernel::IKernelDesc* kernelDesc = nullptr; + m_kernelLoader.getKernelDesc(kernelDesc); + + if (!kernelDesc) + { + std::cerr << "ERROR: impossible to retrieve kernel descriptor " << std::endl; + return; + } + + CString configFile; + + if (!m_configFile.empty()) { configFile = m_configFile.c_str(); } + else { configFile = CString(Directories::getDataDir() + "/kernel/openvibe.conf"); } + + + Kernel::IKernelContext* ctx = kernelDesc->createKernel("test-kernel", configFile); + + if (!ctx) + { + std::cerr << "ERROR: impossible to create kernel context " << std::endl; + return; + } + + ctx->initialize(); + Toolkit::initialize(*ctx); + context = ctx; +} + +void SKernelFixture::tearDown() +{ + if (context) + { + Toolkit::uninitialize(*context); + Kernel::IKernelDesc* kernelDesc = nullptr; + m_kernelLoader.getKernelDesc(kernelDesc); + kernelDesc->releaseKernel(context); + context = nullptr; + } + + m_kernelLoader.uninitialize(); + m_kernelLoader.unload(); +} +} // namespace Test +} // namespace OpenViBE diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/validation-test/CMakeLists.txt new file mode 100755 index 0000000..bdeafb8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/CMakeLists.txt @@ -0,0 +1,134 @@ +PROJECT(OpenViBESDKTest) + +# ------------------ +# Project variables +# ------------------ + +SET(OVT_GLOBAL_VERSION_MAJOR 0) +SET(OVT_GLOBAL_VERSION_MINOR 1) +SET(OVT_GLOBAL_VERSION_PATCH 0) +SET(OVT_GLOBAL_VERSION_STRING "${OVT_GLOBAL_VERSION_MAJOR}.${OVT_GLOBAL_VERSION_MINOR}.${OVT_GLOBAL_VERSION_PATCH}") + +IF(NOT DEFINED OVT_TEST_DATA_DIR) + MESSAGE(FATAL_ERROR "Path to tests input data files is not set") +ENDIF() + +# Set the test ouptut directory for output tests files storage +SET(OVT_VALIDATION_TEST_OUTPUT_DIR ${PROJECT_BINARY_DIR}/validation-test-output/ CACHE PATH "Path for the output result and configuration file create during test") + +# ---------------------- +# Project configuration +# ---------------------- + +# Add python tools path +SET(OVT_PYTHON_TOOL_DIR ${PROJECT_SOURCE_DIR}/python-toolkit/) + +# --------------------- +# Project dependencies +# --------------------- + +# Add some search directory to module path +SET(OVT_CMAKE_DIR ${OV_BASE_DIR}/cmake-modules) +SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${OVT_CMAKE_DIR}) + +# Modify library prefixes and suffixes to comply to Windows or Linux naming +IF(WIN32) + SET(CMAKE_FIND_LIBRARY_PREFIXES "") + SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".dll") +ELSEIF(APPLE) + SET(CMAKE_FIND_LIBRARY_PREFIXES "lib") + SET(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib" ".a") +ELSE() + SET(CMAKE_FIND_LIBRARY_PREFIXES "lib") + SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a") +ENDIF() + +# Find main dependency +if(DEFINED Python3_EXECUTABLE AND NOT DEFINED Python3_Interpreter_FOUND) + # Python exec was supplied through command line, just set it in the files and don't ask questions + set(Python3_Interpreter_FOUND TRUE) +else() + SET(Python_ADDITIONAL_VERSIONS 3.7) + FIND_PACKAGE(Python3 COMPONENTS Interpreter Development) +endif() + +if(NOT Python3_Interpreter_FOUND) + # This is likely a messed-up PYTHONPATH/HOME ISSUE + message(WARNING "Current PYTHONPATH likely not suitable for a Python 3 executable, \ +please check that the following values are plausible :\n\ + \$ENV{PYTHONPATH} = $ENV{PYTHONPATH}\n\ + \$ENV{PYTHONHOME} = $ENV{PYTHONHOME}\n\ +If the previous environement is inconsistent, please set it correctly \ +or directly give Python3 executable path at build time using \"--python-exec\"\n\ +These tests will be generated with a generic \"python\" call, please use the \"--python-dir\" \ +option of the launcher to set the path to a working python3 directory.") +else() + message(STATUS "Found Python3 at ${Python3_EXECUTABLE}") +endif() + +# -------------------- +# Test configuration +# -------------------- + +# On Windows and Linux, some environment setting scripts are needed to ease the testing process +SET(OVT_SCRIPT_DIR ${OV_BASE_BIN_DIR}/scripts) +IF(WIN32) + # Wrapper script that set the environment and launch ctest + # It is located at build directory root to be as close as possible as standard ctest use + CONFIGURE_FILE(${OV_BASE_DIR}/scripts/windows-ctest-launcher.cmd-base + ${OV_BASE_BIN_DIR}/ctest-launcher.cmd) +ELSEIF(UNIX) + # Wrapper script that set the environment and launch ctest + # It is located at build directory root to be as close as possible as standard ctest use + CONFIGURE_FILE(${OV_BASE_DIR}/scripts/unix-ctest-launcher.sh-base + ${OV_BASE_BIN_DIR}/ctest-launcher.sh) + +ENDIF() + +# ${PROJECT_BINARY_DIR}/Testing/Temporary is automatically created by CTest for log files +# We create a temporary subdir for our test that will be create before each test is run +# and removed afterwards (see CTestCustom.cmake.in) +SET(OVT_TEST_TEMPORARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/Testing/Temporary/OVT/) + +# Create test data directory for big or binary files +FILE(MAKE_DIRECTORY ${OVT_TEST_DATA_DIR}) + +# Ctest custom options +CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/CTestCustom.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/CTestCustom.cmake @ONLY) + +# Timeout must be set first +SET (DART_TESTING_TIMEOUT 72000 CACHE STRING "Maximum time allowed before CTest will kill the test." FORCE) +INCLUDE(CTest) +ENABLE_TESTING() + +# It might be useful to set some configuration token from cmake variable +CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/data/openvibe/openvibe.conf.in ${CMAKE_CURRENT_BINARY_DIR}/data/openvibe/openvibe.conf @ONLY) + +# Utility variable for subproject +SET(OVT_OPENVIBE_DATA ${CMAKE_CURRENT_BINARY_DIR}/data/openvibe) +if(DEFINED DIST_BINDIR_ABSOLUTE) + set(OVT_OPENVIBE_PLAYER ${DIST_BINDIR_ABSOLUTE}/openvibe-scenario-player${CMAKE_EXECUTABLE_SUFFIX}) +else() + set(OVT_OPENVIBE_PLAYER ${DIST_BINDIR}/openvibe-scenario-player${CMAKE_EXECUTABLE_SUFFIX}) +endif() + +IF(UNIX) + SET(OVT_OPENVIBE_PLAYER_LOG_FILE "$ENV{HOME}/.config/${OV_CONFIG_SUBDIR}/log/openvibe-scenario-player.log") +ELSEIF(WIN32) + SET(OVT_OPENVIBE_PLAYER_LOG_FILE "\"$ENV{APPDATA}/${OV_CONFIG_SUBDIR}/log/openvibe-scenario-player.log\"") +ENDIF() + +FILE(TO_CMAKE_PATH ${OVT_OPENVIBE_PLAYER_LOG_FILE} OVT_OPENVIBE_PLAYER_LOG_FILE) + +SET(OVT_VALIDATION_TOOLKIT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/python-toolkit) +# ---------------------- +# CMake tree processing +# ---------------------- + +# Process validation tests +# When adding a new set of validation tests, test directory must be added here +#ADD_SUBDIRECTORY(openvibe-file-io-csv) +ADD_SUBDIRECTORY(openvibe-file-io-openvibe) +ADD_SUBDIRECTORY(openvibe-stimulation-timeout) +ADD_SUBDIRECTORY(openvibe-regularized-csp) +ADD_SUBDIRECTORY(openvibe-classification-lda) diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/CTestCustom.cmake.in b/Masterarbeit/openvibe/sdk-master/validation-test/CTestCustom.cmake.in new file mode 100755 index 0000000..34feca0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/CTestCustom.cmake.in @@ -0,0 +1,63 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +# Define following options here: + +# CTEST_CUSTOM_ERROR_MATCH Regular expression for errors during build process +# CTEST_CUSTOM_ERROR_EXCEPTION Regular expression for error exceptions during build process +# CTEST_CUSTOM_WARNING_MATCH Regular expression for warnings during build process +# CTEST_CUSTOM_WARNING_EXCEPTION Regular expression for warning exception during build process +# CTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS Maximum number of errors to display +# CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS Maximum number of warnings to display +# CTEST_CUSTOM_TESTS_IGNORE List of tests to ignore during the Test stage +# CTEST_CUSTOM_MEMCHECK_IGNORE List of tests to ignore during the MemCheck stage +# CTEST_CUSTOM_PRE_TEST Command to execute before any tests are run during Test stage +# CTEST_CUSTOM_POST_TEST Command to execute after any tests are run during Test stage +# CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE Maximum size of passed test output +# CTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE Maximum size of failed test output +# CTEST_CUSTOM_PRE_MEMCHECK Command to execute before any tests are run during MemCheck stage +# CTEST_CUSTOM_POST_MEMCHECK Command to execute after any tests are run during MemCheck stage +# CTEST_CUSTOM_COVERAGE_EXCLUDE Regular expression for excluding files from coverage testing +# CTEST_CUSTOM_COVERAGE_GLOB Report on uncovered files matching this expression + +# ----------------------------- +# CTest variable customization +# ----------------------------- + +SET(CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE 100000) + +# Warning exception are used to remove warning +# linked with ctest generated files (test runner cpp files) +SET(CTEST_CUSTOM_WARNING_EXCEPTION + ${CTEST_CUSTOM_WARNING_EXCEPTION} + "warning C4996" + ) + + # Create unit test temporary dir +SET(CTEST_CUSTOM_PRE_TEST "@CMAKE_COMMAND@ -E make_directory @OVT_TEST_TEMPORARY_DIR@") + + # Remove unit test temporary dir +SET(CTEST_CUSTOM_POST_TEST "@CMAKE_COMMAND@ -E remove_directory @OVT_TEST_TEMPORARY_DIR@") + + + + + diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/data/openvibe/openvibe.conf.in b/Masterarbeit/openvibe/sdk-master/validation-test/data/openvibe/openvibe.conf.in new file mode 100755 index 0000000..8bd74e8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/data/openvibe/openvibe.conf.in @@ -0,0 +1,94 @@ +###################################################################################### +## OpenViBE configuration file +## +## - The file consists of a list of "token name = token value" +## - Whatever space / tabulation at the begining or end of a line is removed +## - Comments start with # +## - Lines ending with \ continue on the next line (all ending \ are removed) +## - On Windows, use / in paths as \ is reserved +## - You can use ${token name} in a token value +## - You can use $Environment{env name} in a token value to get an environment variable +###################################################################################### + +###################################################################################### +# OpenViBE configuration +##################################################################################### + +# Note: Path tokens are set by default to the respective installation dirs. Defining a token here will override the default value. +#Path_Root = .. +#Path_Bin = ${Path_Root}/bin +#Path_Lib = ${Path_Root}/lib +#Path_Data = ${Path_Root}/share/openvibe +#Path_Samples = ${Path_Data}/scenarios + +## By default, "Path_UserData" will point to $HOME/.config/openvibe on Linux, and to %APPDATA%/openvibe/ on Windows. +#Path_UserData = ${Path_Root}/openvibe-user +#Path_Log = ${Path_UserData}/log +#Path_Tmp = ${Path_UserData}/tmp + +##################################################################################### +# System Generalization +##################################################################################### + +Shell_ExtensionWindows = .cmd +Shell_ExtensionLinux = .sh +Shell_ExtensionMacOS = .sh +Shell_Extension = ${Shell_Extension${OperatingSystem}} + +Program_Launcher_PrefixWindows = openvibe- +Program_Launcher_PrefixLinux = openvibe- +Program_Launcher_PrefixMacOS = openvibe- +Program_Launcher_Prefix = ${Program_Launcher_Prefix${OperatingSystem}} + +External_Application_LauncherWindows = ${Path_Bin}/openvibe-external-application-launcher.cmd +External_Application_LauncherLinux = ${Path_Bin}/openvibe-external-application-launcher +External_Application_LauncherMacOS = ${Path_Bin}/openvibe-external-application-launcher +External_Application_Launcher = ${External_Application_Launcher${OperatingSystem}} + +VRPN_ExternalServerPort = 53883 + +##################################################################################### +# OpenViBE kernel configuration +##################################################################################### + +Kernel_PluginsPatternMacOS = ${Path_Lib}/libopenvibe-plugins-*.dylib +Kernel_PluginsPatternLinux = ${Path_Lib}/libopenvibe-plugins-*.so +Kernel_PluginsPatternWindows = ${Path_Bin}/openvibe-plugins-*.dll +Kernel_Plugins = ${Kernel_PluginsPattern${OperatingSystem}} +Kernel_MainLogLevel = Trace +Kernel_ConsoleLogLevel = Information +Kernel_ConsoleLogWithHexa = False +Kernel_ConsoleLogTimeInSecond = True +Kernel_ConsoleLogTimePrecision = 3 +Kernel_FileLogLevel = Debug +Kernel_FileLogWithHexa = True +Kernel_FileLogTimeInSecond = False +Kernel_FileLogTimePrecision = 3 +Kernel_PlayerFrequency = 128 +Kernel_DelayedConfiguration = ${Path_Data}/kernel/openvibe-delayed.conf +Kernel_AllowUnregisteredNumericalStimulationIdentifiers = false + +Kernel_ExtendedStimulationLabels = true + +Kernel_AbortPlayerWhenBoxIsOutdated = false +Kernel_AbortScenarioImportOnUnknownSetting = true + +##################################################################################### +# OpenViBE plugin configuration +##################################################################################### + +Plugin_Classification_RandomizeKFoldTestData = false +Box_ChannelSelector_EEGChannelNames = LPA;RPA;Nz;Fp1;Fpz;Fp2;AF9;AF7;AF5;AF3;AF1;AFz;AF2;AF4;AF6;AF8;AF10;F9;F7;F5;F3;F1;Fz;F2;F4;F6;F8;F10;FT9;FT7;FC5;FC3;FC1;FCz;FC2;FC4;FC6;FT8;FT10;T9;T7;C5;C3;C1;Cz;C2;C4;C6;T8;T10;TP9;TP7;CP5;CP3;CP1;CPz;CP2;CP4;CP6;TP8;TP10;P9;P7;P5;P3;P1;Pz;P2;P4;P6;P8;P10;PO9;PO7;PO5;PO3;PO1;POz;PO2;PO4;PO6;PO8;PO10;O1;Oz;O2;I1;Iz;I2;AFp9h;AFp7h;AFp5h;AFp3h;AFp1h;AFp2h;AFp4h;AFp6h;AFp8h;AFp10h;AFF9h;AFF7h;AFF5h;AFF3h;AFF1h;AFF2h;AFF4h;AFF6h;AFF8h;AFF10h;FFT9h;FFT7h;FFC5h;FFC3h;FFC1h;FFC2h;FFC4h;FFC6h;FFT8h;FFT10h;FTT9h;FTT7h;FCC5h;FCC3h;FCC1h;FCC2h;FCC4h;FCC6h;FTT8h;FTT10h;TTP9h;TTP7h;CCP5h;CCP3h;CCP1h;CCP2h;CCP4h;CCP6h;TTP8h;TTP10h;TPP9h;TPP7h;CPP5h;CPP3h;CPP1h;CPP2h;CPP4h;CPP6h;TPP8h;TPP10h;PPO9h;PPO7h;PPO5h;PPO3h;PPO1h;PPO2h;PPO4h;PPO6h;PPO8h;PPO10h;POO9h;POO7h;POO5h;POO3h;POO1h;POO2h;POO4h;POO6h;POO8h;POO10h;OI1h;OI2h;Fp1h;Fp2h;AF9h;AF7h;AF5h;AF3h;AF1h;AF2h;AF4h;AF6h;AF8h;AF10h;F9h;F7h;F5h;F3h;F1h;F2h;F4h;F6h;F8h;F10h;FT9h;FT7h;FC5h;FC3h;FC1h;FC2h;FC4h;FC6h;FT8h;FT10h;T9h;T7h;C5h;C3h;C1h;C2h;C4h;C6h;T8h;T10h;TP9h;TP7h;CP5h;CP3h;CP1h;CP2h;CP4h;CP6h;TP8h;TP10h;P9h;P7h;P5h;P3h;P1h;P2h;P4h;P6h;P8h;P10h;PO9h;PO7h;PO5h;PO3h;PO1h;PO2h;PO4h;PO6h;PO8h;PO10h;O1h;O2h;I1h;I2h;AFp9;AFp7;AFp5;AFp3;AFp1;AFpz;AFp2;AFp4;AFp6;AFp8;AFp10;AFF9;AFF7;AFF5;AFF3;AFF1;AFFz;AFF2;AFF4;AFF6;AFF8;AFF10;FFT9;FFT7;FFC5;FFC3;FFC1;FFCz;FFC2;FFC4;FFC6;FFT8;FFT10;FTT9;FTT7;FCC5;FCC3;FCC1;FCCz;FCC2;FCC4;FCC6;FTT8;FTT10;TTP9;TTP7;CCP5;CCP3;CCP1;CCPz;CCP2;CCP4;CCP6;TTP8;TTP10;TPP9;TPP7;CPP5;CPP3;CPP1;CPPz;CPP2;CPP4;CPP6;TPP8;TPP10;PPO9;PPO7;PPO5;PPO3;PPO1;PPOz;PPO2;PPO4;PPO6;PPO8;PPO10;POO9;POO7;POO5;POO3;POO1;POOz;POO2;POO4;POO6;POO8;POO10;OI1;OIz;OI2;T3;T5;T4;T6 +Box_ChannelSelector_FailOnInvalidSelection = true + +##################################################################################### +# Include custom configuration (from deprecated locations) +# Actual custom configuration below will override these, if its found. +##################################################################################### + +CustomConfigurationPrefixWindows = ${Path_UserData}/openvibe +CustomConfigurationPrefixLinux = ${Path_UserData}/openvibe +CustomConfigurationPrefixMacOS = ${Path_UserData}/openvibe +CustomConfigurationSuffixWindows = .conf +CustomConfigurationSuffixLinux = rc +CustomConfigurationSuffixMacOS = rc diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/CMakeLists.txt new file mode 100755 index 0000000..0ac8b94 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/CMakeLists.txt @@ -0,0 +1,95 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +PROJECT(openvibe-classification-lda) + +# ------------ +# Test naming +# ------------ + +# As IO test was part of original OpenViBE, prefix is set to vo (validation/open) +SET(TEST_PREFIX vo) +SET(TEST_MODULE Classification-LDA) + +# ------------------------- +# List of scenario to test +# ------------------------- + + +# Test scenario for Classification-LDA +SET(TEST_SCENARIOS +Native +Onevsall +#Onevsone-HT +Onevsone-PKPD +#Onevsone-Voting +) + +# Templates xml.in files +SET (LDA_TEST LDA) + +# ---------------------- +# Configure test target +# ---------------------- + +# This is just a way to have the test scripts available in the IDE +FILE(GLOB_RECURSE script_files ${CMAKE_CURRENT_SOURCE_DIR}/*.mxs ${CMAKE_CURRENT_SOURCE_DIR}/*.xml ${CMAKE_CURRENT_SOURCE_DIR}/*.xml.in) +ADD_CUSTOM_TARGET(${PROJECT_NAME} SOURCES ${script_files}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${VALIDATION_FOLDER}) + +# --------------------------- +# Add test to test to be run +# --------------------------- +FOREACH(SCENARIO ${TEST_SCENARIOS}) + + # Create test name complying to naming rules + SET(TEST_NAME ${TEST_PREFIX}${TEST_MODULE}-${SCENARIO}) + + # create scenario file + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/${LDA_TEST}-${SCENARIO}.xml.in" "${CMAKE_CURRENT_BINARY_DIR}/${LDA_TEST}-${SCENARIO}.xml" @ONLY) + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/${LDA_TEST}-Classification.xml.in" "${CMAKE_CURRENT_BINARY_DIR}/${LDA_TEST}-Classification-${SCENARIO}.xml" @ONLY) + + + # The test will compare files. It should be the same + ADD_TEST(NAME ${TEST_NAME} + COMMAND ${CMAKE_COMMAND} + -DUNQUOTE=1 + -DCMD1="${CMAKE_COMMAND} -E remove -f ${OVT_OPENVIBE_PLAYER_LOG_FILE}" + + # Launch the training scenario + -DCMD2="${OVT_OPENVIBE_PLAYER} --mode=x --max-time=2000 --play-mode=ff --config-file=${OVT_OPENVIBE_DATA}/openvibe.conf --scenario-file=${LDA_TEST}-${SCENARIO}.xml" + + # Launch python checking module + -DCMD3="${Python3_EXECUTABLE} ${OVT_VALIDATION_TOOLKIT_PATH}/accuracy.py ${OVT_OPENVIBE_PLAYER_LOG_FILE} Cross-validation 55" + + # Launch Classification scenario + -DCMD4="${OVT_OPENVIBE_PLAYER} --mode=x --max-time=2000 --play-mode=ff --config-file=${OVT_OPENVIBE_DATA}/openvibe.conf --scenario-file=${LDA_TEST}-Classification-${SCENARIO}.xml" + + # Launch python checking classification result + -DCMD5="${Python3_EXECUTABLE} ${OVT_VALIDATION_TOOLKIT_PATH}/classification.py ${OVT_TEST_TEMPORARY_DIR}/before-classification-${SCENARIO}.csv ${OVT_TEST_TEMPORARY_DIR}/after-classification-${SCENARIO}.csv ${OVT_TEST_DATA_DIR}/classificationreference-${SCENARIO}.txt" + + + + -P ${OVT_CMAKE_DIR}/OvtRunMultipleCommand.cmake + ) + SET_TESTS_PROPERTIES(${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OVT_OPENVIBE_PLAYER_LOG_FILE}) + +ENDFOREACH() diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Classification.xml.in b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Classification.xml.in new file mode 100755 index 0000000..4419ef0 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Classification.xml.in @@ -0,0 +1,974 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00000ad0, 0x00002727) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/class-matrix3.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 768.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0025dffa) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00001a52, 0x00005314) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x5ba36127, 0x195feae1) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + @OVT_TEST_TEMPORARY_DIR@/after-classification-@SCENARIO@.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 512 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 94 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00002e39, 0x00006c71) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x5ba36127, 0x195feae1) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + @OVT_TEST_TEMPORARY_DIR@/before-classification-@SCENARIO@.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 528 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 94 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0000491d, 0x00005a04) + Time signal + (0x28a5e7ff, 0x530095de) + + + (0x5ba36127, 0x195feae1) + Generated signal + + + + + (0x007deef9, 0x2f3e95c6) + Sampling frequency + 512 + 512 + false + + + (0x007deef9, 0x2f3e95c6) + Generated epoch sample count + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 448 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x4e7b798a, 0x183beafb) + (0x9e5ca01e, 0x30a4d8c3) + + + (0xad100179, 0xa3c984ab) + 72 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x0000550e, 0x00005dd5) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/class-matrix2.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 592.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00293cf3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x000076b8, 0x00005047) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 289.000000 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 272.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00c55e5b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00007876, 0x00004594) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x5ba36127, 0x195feae1) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/class-matrix1.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 400.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 136 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x006e0def) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x05295ef4, 0x5f18e7d2) + Classifier processor + (0x5fe23d17, 0x95b0452c) + + + (0x17341935, 0x152ff448) + Features + + + (0x6f752dd0, 0x082a321e) + Commands + + + + + (0x6f752dd0, 0x082a321e) + Labels + + + (0x544a003e, 0x6dcba5f6) + Hyperplane distance + + + (0x544a003e, 0x6dcba5f6) + Probability values + + + + + (0x330306dd, 0x74a95f98) + Filename to load configuration from + + @OVT_TEST_TEMPORARY_DIR@/multiclass_@SCENARIO@.xml + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 592 + + + (0x4e7b798a, 0x183beafb) + (0xa6c8e548, 0x9e3e405b) + + + (0xad100179, 0xa3c984ab) + 116 + + + (0xc80ce8af, 0xf699f813) + 3 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_ExperimentStop + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 432.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 103 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00502c80) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x72a5f195, 0x5ef1cbbb) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + (0x544a003e, 0x6dcba5f6) + Input stream 2 + + + (0x544a003e, 0x6dcba5f6) + Input stream 3 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 320.000000 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 592.000000 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 110 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001303d8) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x00001676, 0x00005a7e) + + (0x00000ad0, 0x00002727) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 185 + + + (0x358ae8b5, 0x0f8bacd1) + 768 + + + (0x3f0a3b27, 0x570913d2) + 297 + + + (0x6267b5c5, 0x676e3e42) + 607 + + + + + (0x000025fa, 0x00004d83) + + (0x000076b8, 0x00005047) + 0 + + + (0x00002e39, 0x00006c71) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 314 + + + (0x358ae8b5, 0x0f8bacd1) + 272 + + + (0x3f0a3b27, 0x570913d2) + 505 + + + (0x6267b5c5, 0x676e3e42) + 327 + + + + + (0x00002712, 0x00003a2e) + + (0x0000550e, 0x00005dd5) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 185 + + + (0x358ae8b5, 0x0f8bacd1) + 592 + + + (0x3f0a3b27, 0x570913d2) + 297 + + + (0x6267b5c5, 0x676e3e42) + 592 + + + + + (0x000032fd, 0x00005dc8) + + (0x05295ef4, 0x5f18e7d2) + 0 + + + (0x00001a52, 0x00005314) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 451 + + + (0x358ae8b5, 0x0f8bacd1) + 577 + + + (0x3f0a3b27, 0x570913d2) + 505 + + + (0x6267b5c5, 0x676e3e42) + 519 + + + + + (0x0000375b, 0x000068a9) + + (0x0000491d, 0x00005a04) + 0 + + + (0x00002e39, 0x00006c71) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 467 + + + (0x358ae8b5, 0x0f8bacd1) + 432 + + + (0x3f0a3b27, 0x570913d2) + 505 + + + (0x6267b5c5, 0x676e3e42) + 312 + + + + + (0x00003882, 0x000024e0) + + (0x000076b8, 0x00005047) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 314 + + + (0x358ae8b5, 0x0f8bacd1) + 272 + + + (0x3f0a3b27, 0x570913d2) + 383 + + + (0x6267b5c5, 0x676e3e42) + 432 + + + + + (0x00003cb5, 0x00007f04) + + (0x00007876, 0x00004594) + 0 + + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 185 + + + (0x358ae8b5, 0x0f8bacd1) + 400 + + + (0x3f0a3b27, 0x570913d2) + 297 + + + (0x6267b5c5, 0x676e3e42) + 577 + + + + + (0x000049b2, 0x00003966) + + (0x0000491d, 0x00005a04) + 0 + + + (0x00001a52, 0x00005314) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 467 + + + (0x358ae8b5, 0x0f8bacd1) + 432 + + + (0x3f0a3b27, 0x570913d2) + 505 + + + (0x6267b5c5, 0x676e3e42) + 504 + + + + + (0x361f100c, 0x31569f97) + + (0x72a5f195, 0x5ef1cbbb) + 0 + + + (0x05295ef4, 0x5f18e7d2) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 345 + + + (0x358ae8b5, 0x0f8bacd1) + 592 + + + (0x3f0a3b27, 0x570913d2) + 415 + + + (0x6267b5c5, 0x676e3e42) + 584 + + + + + + + + (0x00005a30, 0x00002fd6) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Native.xml.in b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Native.xml.in new file mode 100755 index 0000000..114983c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Native.xml.in @@ -0,0 +1,517 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00004a82, 0x00003fae) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 288.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x010dd528) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005b1c, 0x000050c7) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x17341935, 0x152ff448) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/Classification-stream1.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 464.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002a4c77) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005b1c, 0x000050c8) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x17341935, 0x152ff448) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/Classification-stream2.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 640.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00254e3f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005b1c, 0x000050c9) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x17341935, 0x152ff448) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/Classification-stream3.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 816.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002575ff) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x07358c13, 0x4c7f3718) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + @OVT_TEST_TEMPORARY_DIR@/multiclass_@SCENARIO@.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 576 + + + (0x207c9054, 0x3c841b63) + 576 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 6 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 688.000000 + + + (0x207c9054, 0x3c841b63) + 576.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005025db) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x0c1754fe, 0x4fccf5e6) + + (0x00005b1c, 0x000050c7) + 0 + + + (0x07358c13, 0x4c7f3718) + 1 + + + + + (0x1923b651, 0x77968cbc) + + (0x00005b1c, 0x000050c8) + 0 + + + (0x07358c13, 0x4c7f3718) + 2 + + + + + (0x193472ca, 0x425c38b4) + + (0x07358c13, 0x4c7f3718) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + + (0x33f9ee3d, 0x5d880174) + + (0x00004a82, 0x00003fae) + 0 + + + (0x07358c13, 0x4c7f3718) + 0 + + + + + (0x3cf18653, 0x14a9d268) + + (0x00005b1c, 0x000050c9) + 0 + + + (0x07358c13, 0x4c7f3718) + 3 + + + + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Onevsall.xml.in b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Onevsall.xml.in new file mode 100755 index 0000000..6b3d70c --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Onevsall.xml.in @@ -0,0 +1,525 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00004a82, 0x00003fae) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 288.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x010dd528) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005b1c, 0x000050c7) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x17341935, 0x152ff448) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/Classification-stream1.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 464.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002a4c77) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005b1c, 0x000050c8) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x17341935, 0x152ff448) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/Classification-stream2.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 640.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00254e3f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005b1c, 0x000050c9) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x17341935, 0x152ff448) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/Classification-stream3.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 816.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002575ff) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 688.000000 + + + (0x207c9054, 0x3c841b63) + 576.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005025db) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x56fbfd1a, 0x2c474c9e) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + @OVT_TEST_TEMPORARY_DIR@/multiclass_@SCENARIO@.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsAll + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 577.000000 + + + (0x207c9054, 0x3c841b63) + 576.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00ca1a5c) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000008c9, 0x00000450) + + (0x00004a82, 0x00003fae) + 0 + + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + + + (0x00001a7f, 0x00007594) + + (0x00005b1c, 0x000050c8) + 0 + + + (0x56fbfd1a, 0x2c474c9e) + 2 + + + + + (0x00003f05, 0x00000e40) + + (0x00005b1c, 0x000050c7) + 0 + + + (0x56fbfd1a, 0x2c474c9e) + 1 + + + + + (0x00006145, 0x000035ca) + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + + (0x00007b19, 0x000024cd) + + (0x00005b1c, 0x000050c9) + 0 + + + (0x56fbfd1a, 0x2c474c9e) + 3 + + + + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Onevsone-HT.xml.in b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Onevsone-HT.xml.in new file mode 100755 index 0000000..4498af1 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Onevsone-HT.xml.in @@ -0,0 +1,532 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00004a82, 0x00003fae) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 288.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x010dd528) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005b1c, 0x000050c7) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x17341935, 0x152ff448) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/Classification-stream1.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 464.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002a4c77) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005b1c, 0x000050c8) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x17341935, 0x152ff448) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/Classification-stream2.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 640.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00254e3f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005b1c, 0x000050c9) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x17341935, 0x152ff448) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/Classification-stream3.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 816.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002575ff) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 688.000000 + + + (0x207c9054, 0x3c841b63) + 576.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005025db) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x56fbfd1a, 0x2c474c9e) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + @OVT_TEST_TEMPORARY_DIR@/multiclass_@SCENARIO@.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsOne + false + + + (0x79146976, 0xd7f01a25) + Pairwise Decision Strategy + PKPD + HT + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 577.000000 + + + (0x207c9054, 0x3c841b63) + 576.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00ca1a5c) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000008c9, 0x00000450) + + (0x00004a82, 0x00003fae) + 0 + + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + + + (0x00001a7f, 0x00007594) + + (0x00005b1c, 0x000050c8) + 0 + + + (0x56fbfd1a, 0x2c474c9e) + 2 + + + + + (0x00003f05, 0x00000e40) + + (0x00005b1c, 0x000050c7) + 0 + + + (0x56fbfd1a, 0x2c474c9e) + 1 + + + + + (0x00006145, 0x000035ca) + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + + (0x00007b19, 0x000024cd) + + (0x00005b1c, 0x000050c9) + 0 + + + (0x56fbfd1a, 0x2c474c9e) + 3 + + + + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Onevsone-PKPD.xml.in b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Onevsone-PKPD.xml.in new file mode 100755 index 0000000..0dec4ec --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Onevsone-PKPD.xml.in @@ -0,0 +1,532 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00004a82, 0x00003fae) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 288.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x010dd528) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005b1c, 0x000050c7) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x17341935, 0x152ff448) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/Classification-stream1.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 464.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002a4c77) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005b1c, 0x000050c8) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x17341935, 0x152ff448) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/Classification-stream2.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 640.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00254e3f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005b1c, 0x000050c9) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x17341935, 0x152ff448) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/Classification-stream3.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 816.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002575ff) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 688.000000 + + + (0x207c9054, 0x3c841b63) + 576.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005025db) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x56fbfd1a, 0x2c474c9e) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + @OVT_TEST_TEMPORARY_DIR@/multiclass_@SCENARIO@.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsOne + false + + + (0x79146976, 0xd7f01a25) + Pairwise Decision Strategy + PKPD + PKPD + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 577.000000 + + + (0x207c9054, 0x3c841b63) + 576.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00ca1a5c) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000008c9, 0x00000450) + + (0x00004a82, 0x00003fae) + 0 + + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + + + (0x00001a7f, 0x00007594) + + (0x00005b1c, 0x000050c8) + 0 + + + (0x56fbfd1a, 0x2c474c9e) + 2 + + + + + (0x00003f05, 0x00000e40) + + (0x00005b1c, 0x000050c7) + 0 + + + (0x56fbfd1a, 0x2c474c9e) + 1 + + + + + (0x00006145, 0x000035ca) + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + + (0x00007b19, 0x000024cd) + + (0x00005b1c, 0x000050c9) + 0 + + + (0x56fbfd1a, 0x2c474c9e) + 3 + + + + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Onevsone-Voting.xml.in b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Onevsone-Voting.xml.in new file mode 100755 index 0000000..0d5a1dd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-classification-lda/LDA-Onevsone-Voting.xml.in @@ -0,0 +1,532 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x00004a82, 0x00003fae) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x6f752dd0, 0x082a321e) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/bci-ssvep-training.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 288.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x010dd528) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005b1c, 0x000050c7) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x17341935, 0x152ff448) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/Classification-stream1.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 464.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002a4c77) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005b1c, 0x000050c8) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x17341935, 0x152ff448) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/Classification-stream2.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 640.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00254e3f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005b1c, 0x000050c9) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x17341935, 0x152ff448) + Output stream 1 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/Classification-stream3.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 400.000000 + + + (0x207c9054, 0x3c841b63) + 816.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002575ff) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x2a62aa62, 0x22b9aa6a) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 688.000000 + + + (0x207c9054, 0x3c841b63) + 576.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x005025db) + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x56fbfd1a, 0x2c474c9e) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + (0x17341935, 0x152ff448) + Features for class 3 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_ExperimentStop + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + @OVT_TEST_TEMPORARY_DIR@/multiclass_@SCENARIO@.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + OneVsOne + false + + + (0x79146976, 0xd7f01a25) + Pairwise Decision Strategy + PKPD + Voting + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 3 label + OVTK_StimulationId_Label_03 + OVTK_StimulationId_Label_03 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 577.000000 + + + (0x207c9054, 0x3c841b63) + 576.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00ca1a5c) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000008c9, 0x00000450) + + (0x00004a82, 0x00003fae) + 0 + + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + + + (0x00001a7f, 0x00007594) + + (0x00005b1c, 0x000050c8) + 0 + + + (0x56fbfd1a, 0x2c474c9e) + 2 + + + + + (0x00003f05, 0x00000e40) + + (0x00005b1c, 0x000050c7) + 0 + + + (0x56fbfd1a, 0x2c474c9e) + 1 + + + + + (0x00006145, 0x000035ca) + + (0x56fbfd1a, 0x2c474c9e) + 0 + + + (0x2a62aa62, 0x22b9aa6a) + 0 + + + + + (0x00007b19, 0x000024cd) + + (0x00005b1c, 0x000050c9) + 0 + + + (0x56fbfd1a, 0x2c474c9e) + 3 + + + + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/CMakeLists.txt new file mode 100755 index 0000000..108ca29 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/CMakeLists.txt @@ -0,0 +1,94 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +PROJECT(openvibe-file-io-csv-test) + +# ------------ +# Test naming +# ------------ + +# As IO test was part of original OpenViBE, prefix is set to vo (validation/open) +SET(TEST_PREFIX vo) +SET(TEST_MODULE FileIO-CSV) + +# ------------------------- +# List of scenario to test +# ------------------------- + + +# Test scenario for CSV reading and writing test purpose +SET(TEST_SCENARIOS + streamed-matrix + features + signal + stimulation + signal-badtimes + signal-nofiletime +) + +# ---------------------- +# Configure test target +# ---------------------- + +# This is just a way to have the test scripts available in the IDE +FILE(GLOB_RECURSE script_files ${CMAKE_CURRENT_SOURCE_DIR}/*.mxs ${CMAKE_CURRENT_SOURCE_DIR}/*.xml ${CMAKE_CURRENT_SOURCE_DIR}/*.xml.in) +ADD_CUSTOM_TARGET(${PROJECT_NAME} SOURCES ${script_files}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${VALIDATION_FOLDER}) + +# --------------------------- +# Add test to test to be run +# --------------------------- +FOREACH(SCENARIO ${TEST_SCENARIOS}) + + # Modify test name to comply to naming rules + SET(TEST_NAME ${TEST_PREFIX}${TEST_MODULE}-${SCENARIO}) + + #Create scenario file with repository according to the test environement + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/${SCENARIO}.xml.in" "${CMAKE_CURRENT_BINARY_DIR}/${SCENARIO}.xml" @ONLY) + SET(SCENARIO_TO_TEST "${CMAKE_CURRENT_BINARY_DIR}/${SCENARIO}.xml") + SET (INPUT_FILE "input-${SCENARIO}.csv") + SET (OUTPUT_FILE "output-${SCENARIO}.csv") + + IF ((SCENARIO STREQUAL "signal-badtimes") OR (SCENARIO STREQUAL "signal-nofiletime")) + #specific variable for signal bad time or signal no file time, the outpout file will be compared to another file than the input file + + SET(FILE_TO_COMPARE "input-signal.csv") + + ELSE () + # General case, the input and output will be compare + SET(FILE_TO_COMPARE ${INPUT_FILE}) + + ENDIF() + + # The test will compare files. It should be the same + ADD_TEST(NAME ${TEST_NAME} + COMMAND ${CMAKE_COMMAND} + -DUNQUOTE=1 + -DCMD1="${CMAKE_COMMAND} -E remove -f ${OVT_OPENVIBE_PLAYER_LOG_FILE}" + # Launch the scenario with all boxes to test + -DCMD2="${OVT_OPENVIBE_PLAYER} --mode=x --play-mode=ff --max-time=2000 --config-file=${OVT_OPENVIBE_DATA}/openvibe.conf --scenario-file=${SCENARIO_TO_TEST}" + # Compare file result with reference file + -DCMD3="${Python3_EXECUTABLE} ${OVT_VALIDATION_TOOLKIT_PATH}/csv-comparator.py ${CMAKE_CURRENT_SOURCE_DIR}/${FILE_TO_COMPARE} ${OVT_TEST_TEMPORARY_DIR}/${OUTPUT_FILE}" + -P ${OVT_CMAKE_DIR}/OvtRunMultipleCommand.cmake + ) + SET_TESTS_PROPERTIES(${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OVT_OPENVIBE_PLAYER_LOG_FILE}) + +ENDFOREACH() \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/features.xml.in b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/features.xml.in new file mode 100755 index 0000000..d50974e --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/features.xml.in @@ -0,0 +1,260 @@ + + + + (0x00000be0, 0x000028db) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x17341935, 0x152ff448) + Input signal + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + @OVT_TEST_TEMPORARY_DIR@/output-features.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 832.000000 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0132c98f) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004da0, 0x000042c3) + Features + (0x641d0717, 0x02884107) + + + (0x17341935, 0x152ff448) + Output signal + + + + + (0x330306dd, 0x74a95f98) + Filename + + @CMAKE_CURRENT_SOURCE_DIR@/input-features.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x2cdb2f0b, 0x12f231ea) + Don't use the file time + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Unused parameter + 32 + 0 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x1fa963f5, 0x1a638cd4) + 53 + + + (0x207c9054, 0x3c841b63) + 832.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x3bf57676, 0xad3aaefa) + + + (0xad100179, 0xa3c984ab) + 85 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x03c55cb3) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + + + (0x00005bc8, 0x00006d87) + + (0x00004da0, 0x000042c3) + 0 + + + (0x00000be0, 0x000028db) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 305 + + + (0x358ae8b5, 0x0f8bacd1) + 832 + + + (0x3f0a3b27, 0x570913d2) + 331 + + + (0x6267b5c5, 0x676e3e42) + 832 + + + + + + + + + (0x000057d8, 0x00005097) + Default window + 1 + (0xffffffff, 0xffffffff) + (0xffffffff, 0xffffffff) + 1 + + + (0x4c90d4ad, 0x7a2554ec) + 1 + + + (0x7b814cca, 0x271df6dd) + 1 + + + + + (0x000019df, 0x000079ec) + Default tab + 2 + (0x000057d8, 0x00005097) + 0 + (0xffffffff, 0xffffffff) + 1 + + + (0x000062c0, 0x00001744) + Empty + 0 + (0x000019df, 0x000079ec) + 0 + (0xffffffff, 0xffffffff) + 0 + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + 0.1 + + + (0x9f5c4075, 0x4a0d3666) + Tiny CSV IO test + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-features.csv b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-features.csv new file mode 100755 index 0000000..04e8640 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-features.csv @@ -0,0 +1,6 @@ +Time (s);Feat 1;Feat 2;Feat 3 +0.0000000000e+000;-1.8802452087e+000;-7.2682881355e+000;-2.5879698992e+000 +1.9531250000e-003;-3.0222481489e+000;-9.3197423965e+000;-3.3793145418e+000 +3.9062500000e-003;-8.9126255363e+000;-9.9822992645e+000;-5.0880458951e+000 +5.8593750000e-003;-9.4112979621e+000;-4.2872405052e+000;-5.0810265541e+000 +7.8125000000e-003;-5.1881670952e-002;-7.2643208504e+000;-2.6404613256e+000 diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-signal-badtimes.csv b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-signal-badtimes.csv new file mode 100755 index 0000000..015911a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-signal-badtimes.csv @@ -0,0 +1,513 @@ +Time (s);Noise 1;Noise 2;Noise 3;Noise 4;Sampling Rate +0.0000000000e+000;-1.8802452087e+000;-7.2682881355e+000;-2.5879698992e+000;-1.7630541325e+000;512 +1.9531250000e-003;-3.0222481489e+000;-9.3197423965e+000;-3.3793145418e+000;-9.3173027039e-001; +3.9062500000e+003;-8.9126255363e+000;-9.9822992645e+000;-5.0880458951e+000;-4.5405435562e+000; +9.8593750000e+003;-9.4112979621e+000;-4.2872405052e+000;-5.0810265541e+000;-8.3629871905e+000; +7.8125000000e+003;-5.1881670952e-002;-7.2643208504e+000;-2.6404613256e+000;-3.9716786146e+000; +9.7656250000e+003;-6.7827388644e+000;-1.3446456194e+000;-3.6603897810e+000;-7.8582109511e+000; +1.1718750000e+002;-4.4160306454e-001;-3.0036318302e+000;-5.5662709475e+000;-3.2441174984e+000; +1.3671875000e+002;-3.4839928150e+000;-2.5223547220e+000;-1.7740410566e+000;-3.3948791027e+000; +5.5625000000e+002;-5.8442950249e-001;-6.8889430165e+000;-1.9086277485e+000;-6.6771447659e+000; +1.7578125000e+002;-7.4159979820e-001;-7.8859806061e-001;-6.6228216887e+000;-2.6450389624e+000; +1.9531250000e-002;-4.6784877777e-001;-5.7914975286e+000;-7.9534287751e+000;-1.2485122681e+000; +2.1484375000e-002;-1.9711905718e+000;-2.5763726234e+000;-6.8055987358e-002;-9.0633869171e+000; +2.3437500000e-002;-6.5941342711e+000;-6.1449018121e+000;-2.8287607431e+000;-2.9572427273e-001; +2.5390625000e-002;-6.7964720726e+000;-7.6387822628e-001;-9.9526963104e+000;-9.1311395168e-001; +2.7343750000e-002;-4.5664846897e+000;-4.6494948864e+000;-9.2056032270e+000;-6.0829493403e+000; +2.9296875000e-002;-9.3530075997e+000;-3.6161381006e+000;-4.0516370535e+000;-4.6116518974e+000; +3.1250000000e-002;-6.0219123960e+000;-8.2876063883e+000;-3.2673114538e+000;-6.6032898426e+000; +3.3203125000e-002;-1.9772940874e+000;-4.2326122522e+000;-4.6543776989e+000;-3.8166445494e+000; +3.5156250000e-002;-4.0818506479e+000;-7.5020599365e+000;-7.4965667725e+000;-9.8440504167e+000; +3.7109375000e-002;-9.2864772677e+000;-6.4366587996e+000;-6.4149916172e-001;-2.0642721653e+000; +3.9062500000e-002;-9.8263496719e+000;-2.2363966703e+000;-3.1516462564e+000;-9.5806756616e+000; +4.1015625000e-002;-2.6224553585e+000;-5.5256813765e+000;-3.9109468460e+000;-4.2503130436e+000; +4.2968750000e-002;-7.3574021459e+000;-3.0887782574e+000;-9.3862727657e+000;-4.3327128887e+000; +4.4921875000e-002;-9.6667378768e+000;-4.6162295341e+000;-6.8340098858e+000;-9.5687734708e+000; +3.6875000000e-002;-5.4628133774e-001;-2.8565323353e+000;-6.4693135023e+000;-9.1357158124e+000; +4.8828125000e-002;-7.4388867617e+000;-8.2470168173e+000;-5.8317819238e+000;-4.4392222166e+000; +5.0781250000e-002;-4.3034148216e+000;-1.0055845976e+000;-5.3263953328e+000;-2.0285654068e+000; +5.2734375000e-002;-7.6708273590e+000;-3.1537824869e+000;-1.9333475828e+000;-7.2203740478e+000; +5.4687500000e-001;-9.2318475246e-001;-8.7994018197e+000;-8.3288064599e+000;-7.3802912235e+000; +5.6640625000e-001;-3.8483858109e-001;-4.9958825111e-001;-1.0251164436e+000;-5.8552813530e+000; +7.8593750000e-001;-1.4951020479e+000;-9.7671437636e+000;-6.9368600845e-001;-9.3386769295e-002; +6.0546875000e-001;-3.2184821367e+000;-3.0228585005e+000;-3.2023072243e+000;-3.8032168150e+000; +6.2500000000e-001;-2.1546065807e+000;-4.5603805780e+000;-3.2166510820e+000;-5.7966858149e+000; +8.4453125000e-001;-7.3943296075e+000;-7.8719443083e+000;-7.1568956971e+000;-9.7296060063e+000; +6.6406250000e-001;-9.5873897523e+000;-2.4130988121e+000;-6.1406293511e+000;-4.8295539618e+000; +6.8359375000e-001;-7.8896450996e+000;-4.6061587334e+000;-6.6454052925e+000;-9.3264564872e+000; +7.0312500000e-001;-7.4852746725e+000;-7.8472243249e+000;-8.1603442132e+000;-9.9652088992e+000; +7.2265625000e-001;-2.7539902925e+000;-1.8515580893e+000;-3.3414715528e+000;-1.0193169117e-001; +7.4218750000e-001;-7.0897549391e+000;-4.0922272205e+000;-7.1794793010e+000;-5.2156132460e+000; +7.6171875000e-001;-1.7279577255e+000;-3.3042389154e+000;-6.8419447541e+000;-3.2465589046e+000; +7.8125000000e-001;-5.6636250019e+000;-6.7766350508e+000;-1.3605153561e+000;-4.1990417242e+000; +8.0078125000e-001;-2.9456466436e+000;-1.3013094664e+000;-1.1761832237e+000;-5.7222205400e+000; +8.2031250000e-001;-9.0853631496e-001;-3.1031221151e+000;-4.9388104677e+000;-4.4605851173e+000; +9.3984375000e-001;-1.3657033443e+000;-5.9675893188e+000;-9.0478225052e+000;-3.9728993177e+000; +8.5937500000e-001;-6.3325881958e-001;-4.3665885925e+000;-4.5716702938e-001;-6.3060396910e+000; +8.7890625000e-002;-4.8829615116e+000;-7.7877132595e+000;-2.3987531662e-001;-7.5402081013e+000; +8.9843750000e-002;-9.0685750544e+000;-7.8868983686e+000;-8.1991027296e+000;-1.6040527821e+000; +9.1796875000e-002;-1.4368116856e+000;-2.8543961048e+000;-9.3801690638e+000;-3.7156283855e+000; +9.3750000000e-002;-7.3747977614e+000;-8.0990020931e+000;-4.7303688526e+000;-6.6615802050e+000; +9.5703125000e-002;-1.9806510210e+000;-9.0951261669e+000;-4.7956788540e+000;-8.4069338441e+000; +9.7656250000e-002;-1.2607198954e+000;-9.4012268260e+000;-2.8556168079e+000;-1.1535996199e+000; +9.9609375000e-002;-8.0562761426e+000;-3.1559193134e+000;-9.0893276781e+000;-4.7697377205e+000; +1.0156250000e-001;-6.9704276323e+000;-9.2049928010e+000;-8.6065249145e+000;-5.9340190887e+000; +1.0351562500e-001;-7.7037873864e+000;-1.1780142784e-001;-2.0279550552e+000;-8.6559648812e+000; +1.0546875000e-001;-1.9492173195e+000;-2.1945858002e+000;-9.6468985081e-001;-9.2776417732e-002; +1.0742187500e-001;-8.2580034435e+000;-5.2552878857e-001;-6.1845758557e+000;-7.2334972024e+000; +1.0937500000e-001;-2.0444351435e+000;-9.8226874508e+000;-5.3376853466e-001;-5.6794947386e+000; +1.1132812500e-001;-8.0022583902e+000;-1.4130055904e-001;-4.1648608446e+000;-3.0683308840e+000; +0.1328125000e-001;-6.8138676882e+000;-6.3194677234e+000;-8.1215856969e+000;-7.3305487633e-001; +1.1523437500e-001;-9.4119083136e+000;-6.0936307907e+000;-2.0383310318e+000;-9.2074342817e+000; +1.1718750000e-001;-2.2598958015e+000;-7.7120272815e+000;-6.9167149067e+000;-1.4932703972e+000; +1.1914062500e-001;-3.5712760687e+000;-7.4428540468e+000;-5.4258859158e+000;-1.6479969025e-001; +1.2109375000e-001;-9.7213659994e+000;-7.2704243660e+000;-6.3707387447e+000;-6.5901669860e+000; +1.2304687500e-001;-7.0595416427e+000;-7.3924985528e+000;-1.4108705521e+000;-7.9113131762e+000; +1.2500000000e-001;-3.4110540152e+000;-6.0823380947e-001;-5.3746145964e+000;-9.1329691559e+000; +1.2695312500e-001;-9.7570726648e+000;-1.0940885544e+000;-7.2841578722e+000;-1.5564441681e+000; +1.2890625000e-001;-3.4781944752e+000;-8.0211798847e+000;-5.3309732676e+000;-3.2175666094e+000; +1.3085937500e-001;-5.1567125320e+000;-3.8312935829e+000;-2.2324287891e+000;-4.4300669432e+000; +1.3281250000e-001;-3.2395398617e+000;-6.3997313380e+000;-6.2977996469e+000;-8.2250434160e+000; +1.3476562500e-001;-9.6996978670e+000;-4.3870359659e+000;-1.1053806543e+000;-1.4835047722e+000; +1.3671875000e-001;-3.0036318302e+000;-1.2826931477e+000;-6.7302468419e+000;-1.9608139992e+000; +0.3867187500e-001;-5.6117436290e+000;-9.2178106308e+000;-1.5332502127e+000;-2.2141176462e+000; +1.4062500000e-001;-3.5120701790e+000;-9.5675528049e-001;-1.6290777922e+000;-4.0610980988e+000; +1.4257812500e-001;-7.7788628638e+000;-9.8727378156e+000;-4.2182683945e+000;-2.7173680067e+000; +1.4453125000e-001;-6.4973890781e-001;-3.4260076284e+000;-3.6463516951e+000;-3.1052583456e+000; +1.4648437500e-001;-1.2973415852e+000;-8.7630847842e+000;-1.2982571125e+000;-1.0208439827e+000; +1.4843750000e-001;-7.7498702705e+000;-9.0636920929e+000;-2.9599905014e+000;-5.8839678764e-001; +1.5039062500e-001;-9.6758934110e+000;-1.3223671913e+000;-1.8427073956e+000;-5.2873316407e+000; +1.5234375000e-001;-5.6395152211e+000;-3.7784963846e+000;-5.4332101345e+000;-5.9523302317e+000; +1.5429687500e-001;-7.5167059898e-001;-7.5661489367e+000;-3.4235662222e+000;-9.7775200568e+000; +1.5625000000e-001;-6.7217016220e+000;-1.1777091026e+000;-9.7347941436e+000;-5.5342265964e+000; +1.5820312500e-001;-8.9394818246e+000;-5.0923183560e+000;-5.2516251802e+000;-7.4910733104e+000; +1.6015625000e-001;-4.7614979744e+000;-5.0828576088e+000;-4.4587540627e+000;-6.1684012413e+000; +1.6210937500e-001;-6.2987151742e+000;-6.9646289945e+000;-7.2435683012e+000;-4.7990357876e+000; +1.6406250000e-001;-3.8453340530e-001;-9.5922727138e+000;-9.6288949251e+000;-5.0035095215e+000; +1.6601562500e-001;-9.9111911375e+000;-3.9094209671e-001;-9.3804742396e+000;-8.5116147995e-001; +1.6796875000e-001;-7.3503831029e+000;-6.4455091953e+000;-7.0244452357e+000;-4.6702474356e+000; +1.6992187500e-001;-7.8597369790e+000;-4.4376963377e+000;-5.5296486616e+000;-1.8851286173e+000; +1.7187500000e-001;-1.9867539406e-001;-2.4680316448e+000;-4.3012785912e+000;-9.5004141331e-001; +1.7382812500e-001;-9.5348979160e+000;-5.9349346161e+000;-4.3266093731e+000;-6.4555802941e+000; +1.7578125000e-001;-3.6048465967e+000;-7.1251565218e+000;-2.6190984249e+000;-2.3508405685e+000; +1.7773437500e-001;-6.7479476333e+000;-9.9551379681e-001;-5.4731893539e+000;-8.9144587517e-001; +1.7968350000e-001;-1.4981538057e+000;-5.4243597388e+000;-2.0294785500e-001;-1.2033450603e+000; +1.8164062500e-001;-8.9913632721e+000;-3.9237648249e+000;-1.6693621874e+000;-3.6222416162e+000; +1.8359375000e-001;-3.4342479706e+000;-8.3462019265e+000;-8.7060151994e+000;-7.8313547373e+000; +1.8554687500e-001;-7.8777427971e+000;-4.4813376665e+000;-3.0808436871e+000;-1.2231820822e+000; +1.8750500000e-001;-6.7439803481e+000;-6.5062409639e+000;-1.5533924103e-001;-2.8653830290e+000; +1.8945312500e-001;-6.8285164237e+000;-5.7057404518e+000;-4.7975122929e-001;-3.1315040588e+000; +1.9140625000e-001;-4.2909026146e-001;-6.6502884030e+000;-2.5031280518e+000;-9.5486312360e+000; +1.9336937500e-001;-1.6812646389e+000;-2.4307990074e+000;-2.3114717007e+000;-4.1428875923e+000; +1.9517750000e-001;-5.9089937806e+000;-1.5152442455e+000;-5.6474500895e+000;-7.3451948166e+000; +1.9726562500e-001;-1.8372142315e+000;-3.1696522236e+000;-1.1716055870e+000;-6.2221136689e+000; +1.9961875000e-001;-5.5272072554e+000;-1.9186985493e+000;-1.5628528595e+000;-8.2399964333e-001; +2.0117187500e-001;-3.1031221151e+000;-8.2317575812e+000;-3.8172549009e+000;-8.2662434876e+000; +2.0312500000e-001;-2.2339522839e-001;-5.5241554976e+000;-8.8076418638e+000;-2.3566395044e+000; +2.0507812500e-001;-6.9597461820e+000;-8.2216864824e+000;-7.4678793550e+000;-5.3495895863e+000; +0.0705125000e-001;-4.5347452164e+000;-1.6037476063e+000;-8.9199499786e+000;-2.0270395279e+000; +2.0898437500e-001;-7.2347179055e+000;-6.4308604598e+000;-2.2891932726e+000;-5.6761375070e+000; +2.1093250000e-001;-1.5369123220e+000;-3.8300728798e+000;-3.9301735163e+000;-6.7375713587e+000; +2.1289062500e-001;-3.9338350296e-001;-5.8656573296e-001;-3.9799189568e+000;-3.3735162020e+000; +2.1484373000e-001;-6.6228216887e+000;-4.6687215567e+000;-3.2517468929e+000;-1.4706867933e+000; +2.1679268500e-001;-2.6673197746e-001;-7.1962654591e-001;-9.1518906504e+000;-5.7652515173e+000; +2.1875640000e-001;-5.1564073563e+000;-8.6178167164e+000;-9.3734549731e+000;-4.3150120974e+000; +2.2070352500e-001;-9.5721304789e+000;-8.9434491843e+000;-2.7408671379e+000;-7.7886287868e+000; +2.2265635000e-001;-4.4276255369e+000;-4.3910032511e+000;-2.1491134167e+000;-4.7309792042e+000; +2.2460937500e-001;-4.4819480181e+000;-8.3315530419e+000;-5.5732902884e+000;-2.6206243038e+000; +2.2656250000e-001;-8.6632892489e+000;-1.9919431210e+000;-4.8121583462e+000;-5.3822442889e+000; +2.2851562500e-001;-3.4632402658e+000;-5.6367695332e-001;-1.8707871437e-001;-5.0560015440e+000; +2.3046875000e-001;-9.0426325798e-001;-3.1849116087e+000;-4.9082916975e+000;-5.4078799486e+000; +2.3242187500e-001;-6.4409315586e+000;-4.3211156130e+000;-2.8385263681e+000;-1.4923548698e+000; +2.3437500000e-001;-1.1029386520e+000;-6.8871119618e+000;-3.8657796383e+000;-1.0406810045e+000; +2.3632812500e-001;-3.7549972534e+000;-7.3454999924e+000;-8.0352184176e+000;-6.3194677234e+000; +2.3828125000e-001;-9.5205542073e+000;-8.2659383118e+000;-3.6634421349e+000;-1.7258214951e+000; +2.4023437500e-001;-5.1484724879e+000;-3.3289587498e+000;-7.7065339684e+000;-7.7416302264e+000; +2.4218750000e-001;-2.2312080860e+000;-5.5302590132e+000;-1.7813652754e+000;-1.0376274586e-001; +2.4414062500e-001;-5.8632159233e+000;-9.1622669250e+000;-8.9748832583e+000;-5.4460281134e+000; +2.4609375000e-001;-4.9778741598e+000;-5.3386029601e+000;-4.3336153030e-002;-6.1607715487e+000; +2.4804687500e-001;-8.6419263482e+000;-7.2585222125e+000;-1.1813712120e+000;-6.7076632380e+000; +2.5000000000e-001;-3.2462537289e+000;-3.3469647169e+000;-8.6532181501e+000;-8.0880153179e+000; +2.5195312500e-001;-5.3282266855e+000;-8.4246344864e+000;-3.4629350901e+000;-1.1737418175e+000; +5.5390625000e-001;-2.8351724148e-001;-8.1438642740e+000;-7.5011444092e+000;-3.6661887169e+000; +2.5585937500e-001;-7.9320657253e+000;-8.7405025959e-001;-7.3512986302e+000;-8.9336832613e+000; +2.5781250000e-001;-4.0870386362e+000;-1.7883849144e+000;-4.8023927212e+000;-5.9193700552e+000; +2.5976562500e-001;-3.3863335848e+000;-2.4182868004e+000;-7.7587206662e+000;-8.5360270739e+000; +2.6171875000e-001;-2.0044559240e+000;-3.3445233107e+000;-9.0209662169e+000;-9.1485335678e+000; +2.6367187500e-001;-2.1716970205e+000;-8.3144627512e+000;-1.6623431444e+000;-9.3719290942e+000; +2.6562500000e-001;-1.8921476603e+000;-6.5715506673e+000;-8.9898373187e+000;-5.1796013117e+000; +2.6757812500e-001;-2.2070986032e+000;-8.0669575930e+000;-2.6429027319e+000;-5.3376874328e+000; +2.6953125000e-001;-7.4074527621e+000;-2.4805444479e+000;-5.6028932333e+000;-6.0695213079e+000; +2.7148437500e-001;-4.6458327770e+000;-4.4401377439e+000;-7.4886319041e+000;-3.4070861340e+000; +2.7343750000e-001;-5.5888545513e+000;-2.2595906258e+000;-6.9621875882e+000;-8.3462019265e+000; +8.7539062500e-001;-6.2550738454e+000;-4.7996461391e+000;-5.8705404401e+000;-1.0174870491e+000; +8.7734375000e-001;-4.3626207113e+000;-2.9010897875e+000;-3.9985352755e+000;-5.0325036049e-001; +8.7929687500e-001;-2.9502242804e+000;-5.2845850587e+000;-9.5330667868e+000;-4.6485793591e+000; +8.8125000000e-001;-3.7723928690e+000;-1.5128022432e+000;-4.7407454252e+000;-4.0977203846e+000; +8.8320312500e-001;-5.9755265713e-001;-7.3668628931e+000;-3.9820551872e+000;-6.0176396370e+000; +2.8515625000e-001;-1.0284721851e-001;-7.1691030264e+000;-5.7704398036e+000;-6.6859951615e+000; +2.8710937500e-001;-3.0753499269e+000;-7.7257606387e+000;-4.5472580194e+000;-8.7041841447e+000; +2.8906250000e-001;-3.9948701859e-001;-4.9983215332e+000;-2.7503281832e+000;-5.6645405293e+000; +2.9101562500e-001;-2.5794243813e+000;-4.8548847437e+000;-8.6672566831e+000;-5.4881435633e+000; +2.9296875000e-001;-9.9548326060e+000;-9.7570726648e+000;-1.9608139992e+000;-9.6502578631e+000; +2.9492187500e-001;-1.9696646929e+000;-8.1447798014e+000;-6.0798975825e+000;-4.0244758129e+000; +2.9687500000e-001;-8.5085630417e-001;-9.1732535511e+000;-5.3205969930e+000;-2.0453506708e+000; +2.9882812500e-001;-2.3813593388e+000;-6.0921049118e+000;-7.0094913244e+000;-4.3787956238e+000; +3.0078125000e-001;-9.4039735198e+000;-4.5860165358e+000;-6.0975980759e+000;-3.7018954754e+000; +3.0273437500e-001;-8.1484317780e-002;-8.5625782609e+000;-4.2069762945e+000;-5.2259895205e+000; +3.0468750000e-001;-8.0532242358e+000;-1.6232794523e+000;-5.2455213666e+000;-1.7880797386e+000; +3.0664062500e-001;-3.4064757824e+000;-2.3758661747e+000;-6.5608692169e+000;-4.8545795679e+000; +3.0859375000e-001;-6.6957610846e+000;-5.9114336967e-001;-2.7274394035e+000;-3.9225441217e+000; +3.1054687500e-001;-2.3209327459e+000;-8.6925870180e+000;-8.6812952161e+000;-7.3335978389e+000; +3.1250000000e-001;-4.0125733614e+000;-2.2247993946e+000;-1.9611191750e+000;-5.8946502209e+000; +3.1445312500e-001;-1.9742423296e+000;-5.9697255492e+000;-2.9520553350e+000;-2.4018067122e+000; +3.1640625000e-001;-2.8858304024e+000;-2.3459577560e+000;-1.6846239567e-001;-5.4139834642e+000; +3.1835937500e-001;-4.3778800964e+000;-9.6295052767e+000;-7.8203681111e+000;-9.2709127814e+000; +3.2031250000e-001;-6.3676869869e+000;-5.8122500777e+000;-2.3566395044e+000;-2.5412762165e+000; +3.2226562500e-001;-8.5659351945e+000;-6.3518172503e+000;-5.0849941373e+000;-2.6435130835e+000; +3.2421875000e-001;-9.7793511674e+000;-2.9032260180e+000;-6.4479506016e+000;-4.2777794600e+000; +3.2617187500e-001;-7.8554630280e-001;-7.4349191785e+000;-3.0375075340e+000;-3.4995573759e+000; +3.2812500000e-001;-4.6116518974e+000;-1.9287705421e-001;-8.2696005702e+000;-8.6236152053e+000; +3.3007812500e-001;-5.2400282025e+000;-1.1267435551e+000;-1.4627522230e+000;-4.3998533487e+000; +3.3203125000e-001;-4.1117590666e+000;-8.9938044548e-001;-8.5393841565e+000;-7.5685977936e-002; +3.3398437500e-001;-9.0005188435e+000;-8.2601398230e+000;-2.3651844263e+000;-9.6829126775e+000; +3.3593750000e-001;-3.4989470243e+000;-7.9461042583e+000;-5.6492811441e+000;-9.0084536374e+000; +3.3789062500e-001;-6.4787742496e+000;-3.1794184446e+000;-6.7326882482e+000;-7.4382764101e+000; +3.3984375000e-001;-1.2021243572e+000;-8.1972718239e-001;-1.7090439796e-002;-5.3938412666e+000; +3.4179687500e-001;-1.7709892988e+000;-4.2286449671e+000;-7.5359354913e+000;-9.3957335129e+000; +3.4375000000e-001;-3.6640524864e+000;-9.5675528049e-001;-6.9301432371e+000;-5.9764397144e+000; +3.4570312500e-001;-8.7347026169e+000;-7.0815148950e+000;-5.6944486499e+000;-8.8976714015e+000; +3.4765625000e-001;-1.6315197945e+000;-3.2612079382e+000;-5.1667836308e+000;-1.8762779236e+000; +3.4960937500e-001;-2.5473797321e+000;-5.6154057384e+000;-4.6342355013e+000;-3.5175633430e+000; +3.5156250000e-001;-4.1880548000e+000;-7.2048097849e+000;-2.0368051529e+000;-4.4434952736e+000; +3.5351562500e-001;-1.4777064323e+000;-7.4831384420e+000;-9.0389721096e+000;-6.3670766354e+000; +3.5546875000e-001;-1.8451488018e+000;-3.5050505400e+000;-5.5256813765e+000;-4.7401350737e+000; +3.5742187500e-001;-2.4152350426e+000;-3.8773769140e+000;-3.2221442461e+000;-7.4495682120e+000; +3.5937500000e-001;-5.5363628268e+000;-5.4200872779e+000;-4.7599720955e+000;-5.7985186577e-002; +3.6132812500e-001;-7.1333962679e+000;-3.8938564062e+000;-2.9682302475e+000;-2.3523664474e+000; +3.6328125000e-001;-8.0996124446e+000;-9.2867851257e-001;-4.7654652596e+000;-3.1226539612e+000; +3.6523437500e-001;-7.0168158412e+000;-2.1649831533e+000;-4.4373929501e-001;-8.8134403527e+000; +3.6718750000e-001;-2.5577563047e+000;-7.2975859046e+000;-4.1889703274e+000;-9.8507644888e+000; +3.6914062500e-001;-8.3956420422e-001;-2.7845090628e+000;-3.6457413435e+000;-1.0672324896e+000; +3.7109375000e-001;-9.3142509460e-001;-6.4476454258e+000;-9.1012299061e+000;-3.4598833323e+000; +3.7304687500e-001;-1.8832969666e+000;-1.7520678043e+000;-8.5488449037e+000;-6.0692158341e+000; +3.7500000000e-001;-1.3580739498e-001;-4.2338329554e+000;-1.1734366417e+000;-7.3790705204e+000; +3.7695312500e-001;-3.4861290455e+000;-5.0599688292e+000;-5.6660664082e+000;-3.5340434313e+000; +3.7890625000e-001;-8.0794702470e+000;-9.1003143042e+000;-3.4882664680e-001;-4.6357613802e+000; +3.8085937500e-001;-1.4874720573e+000;-9.1659291089e+000;-4.1877496243e+000;-5.6233406067e+000; +3.8281250000e-001;-1.3443404436e+000;-2.1808528900e+000;-6.9045075774e+000;-5.8049255610e+000; +3.8476562500e-001;-1.5936768055e+000;-9.1888180375e+000;-7.3696097732e+000;-2.7643668652e+000; +3.8671875000e-001;-6.1949521303e+000;-7.9393902421e+000;-1.1880856752e+000;-3.5560166836e+000; +3.8867187500e-001;-6.9139683247e+000;-3.5618150234e+000;-5.9114351869e+000;-8.6181218922e+000; +3.9062500000e-001;-4.4755393267e+000;-2.4826806784e+000;-2.7408671379e+000;-8.7823114544e+000; +3.9257812500e-001;-7.7770318091e+000;-9.1210669279e+000;-5.6465345621e+000;-4.2551958561e+000; +3.9453125000e-001;-9.4912564382e+000;-1.7044585943e+000;-2.5727105141e+000;-8.8906522095e+000; +3.9648437500e-001;-5.7667776942e+000;-3.3585619926e+000;-2.3880732059e+000;-9.9719229713e+000; +3.9843750000e-001;-8.8613544405e+000;-4.4828641415e+000;-3.5850095749e+000;-2.3181861639e+000; +4.0039062500e-001;-2.8382241726e-001;-4.9455243349e+000;-5.7853937149e+000;-1.8539994955e+000; +4.0234375000e-001;-9.4860683009e+000;-7.6784551144e-001;-3.6515396833e+000;-8.4856715798e+000; +4.0429687500e-001;-9.6984771267e+000;-5.2095115185e-001;-6.1293375492e+000;-2.9755544662e+000; +4.0625000000e-001;-5.9248635173e+000;-8.0431531370e+000;-7.0354318619e+000;-1.0440379381e+000; +4.0820312500e-001;-7.0162057877e-001;-4.8060548306e+000;-4.5963925123e+000;-3.1467634439e+000; +4.1015625000e-001;-8.8567766547e+000;-2.5110632181e+000;-1.8127977848e-001;-1.4618337154e-001; +4.1210937500e-001;-3.3664965630e+000;-2.4695575237e+000;-6.3029876351e+000;-7.5301370025e+000; +4.1406250000e-001;-8.6217841506e+000;-7.2051149607e+000;-1.2659078836e+000;-3.1342506409e-001; +4.1601562500e-001;-4.3772697449e+000;-2.6670128107e+000;-5.5211034417e+000;-1.9107639790e+000; +4.1796875000e-001;-3.9197975397e+000;-1.7731255293e+000;-2.9462569952e+000;-8.0224005878e+000; +4.1992187500e-001;-5.7463300228e+000;-9.4875942171e+000;-2.2342598438e+000;-9.7369304486e+000; +4.2187500000e-001;-1.2527847290e+000;-1.7212438583e+000;-8.2775352895e+000;-1.1719107628e+000; +4.2382812500e-001;-9.7293008119e+000;-2.4689471722e+000;-7.6305429637e+000;-1.9589829445e+000; +4.2578125000e-001;-4.5075833797e-001;-2.1384316683e+000;-4.5112460852e+000;-4.8319953680e+000; +4.2773437500e-001;-1.4218574762e+000;-9.6050904691e+000;-1.8851286173e+000;-3.9728993177e+000; +4.2968750000e-001;-9.3386638910e+000;-6.1467328668e+000;-2.2055727243e+000;-7.8847621381e+000; +4.3164062500e-001;-7.3812067509e+000;-9.6063112095e+000;-9.4488357008e+000;-3.3027130365e+000; +4.3359375000e-001;-2.8992295265e-002;-5.2519303560e+000;-1.5085297823e+000;-7.1169164777e+000; +4.3554687500e-001;-2.9786050320e-001;-9.4064150006e+000;-3.7525558472e+000;-5.8839687705e+000; +4.3750000000e-001;-2.7106541395e+000;-4.6693325043e-001;-7.3839533329e+000;-3.6347544193e+000; +4.3945312500e-001;-6.5819269419e+000;-2.4140143394e+000;-8.3236183226e+000;-1.2897121906e+000; +4.4140625000e-001;-5.7078766823e+000;-8.2506790757e+000;-7.8862880170e+000;-1.1752676964e+000; +4.4335937500e-001;-9.7296060063e+000;-9.9517807551e+000;-6.9219031930e+000;-8.4600360692e+000; +4.4531250000e-001;-7.6110111177e+000;-9.4882046059e+000;-7.0387890935e+000;-4.3040251732e+000; +4.4726562500e-001;-6.6893520951e+000;-5.1478621364e+000;-8.8311410695e+000;-3.1168556213e+000; +4.4921875000e-001;-8.5955381393e+000;-5.7960754633e+000;-5.8473467827e-001;-4.3269145489e+000; +4.5117187500e-001;-8.5256507993e+000;-4.6641439199e+000;-8.2528153062e+000;-2.6963102818e+000; +4.5312500000e-001;-7.5774407387e+000;-9.5339823514e+000;-8.4972685575e+000;-1.7493212223e+000; +4.5507812500e-001;-1.5363019705e+000;-3.7672048807e+000;-6.9121372700e+000;-6.6225165129e+000; +4.5703125000e-001;-8.3898434043e+000;-9.7396771051e+000;-2.5470745564e+000;-7.3570969701e+000; +4.5898437500e-001;-4.1322052479e-001;-5.2052369714e+000;-3.0259102583e+000;-9.7427289560e+000; +4.6093750000e-001;-5.2696311474e+000;-5.4640340805e+000;-4.3638414145e+000;-1.8689537048e+000; +4.6289062500e-001;-6.8892481923e+000;-9.3163853884e+000;-2.2476881742e+000;-3.4839928150e+000; +4.6484375000e-001;-1.5570545197e+000;-5.0895717740e+000;-7.2453993559e+000;-2.1228677034e+000; +4.6679687500e-001;-9.7003082372e+000;-7.1306496859e+000;-8.2821130753e+000;-8.3571887016e+000; +4.6875000000e-001;-1.6483044624e+000;-3.8657796383e+000;-6.1507004499e+000;-3.9490938187e-001; +4.7070312500e-001;-3.2181769609e+000;-7.2594377398e+000;-7.4068421125e+000;-5.4838711023e+000; +4.7265625000e-001;-1.6220587492e+000;-4.7624135017e+000;-6.5858960152e-001;-1.3397628069e+000; +4.7460937500e-001;-6.0020753741e+000;-8.7575914711e+000;-2.1973252296e-002;-1.2100589275e+000; +4.7656250000e-001;-2.2943812609e+000;-3.5929441452e+000;-9.0313424915e+000;-1.8677330017e+000; +4.7851562500e-001;-5.4969939590e+000;-4.6256905794e+000;-2.3322242498e+000;-6.3389995694e+000; +4.8046875000e-001;-3.5224461555e+000;-1.9049656391e+000;-1.5662097931e+000;-6.8398082256e+000; +4.8242187500e-001;-9.9319437239e+000;-2.9438155890e+000;-1.0846281052e+000;-8.8546403497e+000; +4.8437500000e-001;-4.0943634510e+000;-4.1712701321e+000;-1.9663077593e+000;-1.4810633659e+000; +4.8632812500e-001;-1.8875700235e+000;-3.5367900133e+000;-2.7149266005e+000;-4.9174475670e+000; +4.8828125000e-001;-1.3016146421e+000;-3.0585652590e+000;-1.7792284489e-001;-3.6735129356e+000; +4.9023437500e-001;-8.7667470425e+000;-6.3512068987e+000;-4.0000611544e+000;-6.1732840538e+000; +4.9218750000e-001;-1.9895017147e+000;-1.7639696598e+000;-2.8891873360e+000;-9.4842371717e+000; +4.9414062500e-001;-2.2501295805e+000;-2.0596939325e+000;-3.1882685423e+000;-7.7944278717e-001; +4.9609375000e-001;-6.3322854042e+000;-9.3478194624e+000;-2.2931605577e+000;-7.2371593118e+000; +4.9804687500e-001;-5.3346335888e-001;-4.6235543489e+000;-7.2621846199e+000;-9.7460860014e+000; +5.0000000000e-001;-2.8299814463e+000;-2.0184940100e+000;-1.6858422756e+000;-5.7554855943e+000; +5.0195312500e-001;-7.9805901647e+000;-4.7508162260e+000;-7.6433606446e+000;-2.3874628544e+000; +5.0390625000e-001;-5.6151005626e+000;-9.6404919401e+000;-2.6242864132e+000;-4.8765528202e+000; +5.0585937500e-001;-9.5730460435e+000;-2.4561297894e+000;-6.4915922284e+000;-8.2491530478e+000; +5.0781250000e-001;-3.7614065409e+000;-6.3270974159e+000;-1.3534957170e+000;-6.6319772601e+000; +5.0976562500e-001;-8.0715353787e+000;-8.4484389424e+000;-3.6881619692e+000;-7.9195532203e+000; +5.1171875000e-001;-4.3244725466e+000;-3.8169497252e+000;-1.9818717241e+000;-3.9341408014e+000; +5.1367187500e-001;-3.5886716843e+000;-8.7105929852e+000;-8.0303354561e+000;-3.7031161785e+000; +5.1562500000e-001;-1.1292099953e-002;-7.4407178164e+000;-1.6321301460e+000;-3.6188846827e+000; +5.1757812500e-001;-8.2378612459e+000;-6.7851802707e+000;-6.9786676764e+000;-3.2203131914e+000; +5.1953125000e-001;-5.6508073211e+000;-9.8483230080e+000;-3.3060699701e+000;-3.1891822815e-001; +5.2148437500e-001;-8.4096804261e+000;-9.2681661248e+000;-9.7476119176e+000;-4.4645529985e+000; +5.2343750000e-001;-6.3173314929e+000;-4.4828641415e+000;-1.5787225962e+000;-1.2546157837e+000; +5.2539062500e-001;-5.5131688714e+000;-5.5101168156e+000;-5.3379926085e+000;-1.5466779470e+000; +5.2734375000e-001;-9.7595141456e+000;-6.1287271976e+000;-3.1421858072e+000;-8.6495558918e+000; +5.2929687500e-001;-4.7456282377e+000;-7.0259711146e+000;-6.9627979398e+000;-8.5085605085e+000; +5.3125000000e-001;-1.9284647703e+000;-9.5187231153e+000;-5.3691214323e+000;-5.1228371263e+000; +5.3320312500e-001;-3.0021059513e+000;-1.1600083113e+000;-8.4414184093e-001;-2.6279491186e+000; +5.3515625000e-001;-9.7720267251e+000;-9.8590044864e+000;-6.4421522617e+000;-5.3001496196e+000; +5.3710937500e-001;-9.2196404934e-001;-4.9470502138e+000;-6.2605670094e+000;-5.0267037749e+000; +5.3906250000e-001;-3.8001650572e+000;-4.9623095989e+000;-3.9262062311e+000;-7.7007354796e+000; +5.4101562500e-001;-9.0551469475e+000;-7.5777459145e+000;-3.6918240786e+000;-3.8694417477e+000; +5.4296875000e-001;-7.9964599013e+000;-1.2442398071e+000;-8.7301248312e+000;-8.5369426012e+000; +5.4492187500e-001;-2.9398483038e+000;-2.2153383493e+000;-7.7428510785e+000;-2.7719962597e+000; +5.4687500000e-001;-1.5472888947e-001;-8.8634906709e+000;-1.9211399555e+000;-7.0796838403e+000; +5.4882812500e-001;-5.3273111582e+000;-8.8155766577e+000;-9.9401837215e+000;-2.9462569952e+000; +5.5078125000e-001;-5.4957732558e+000;-8.5326699913e+000;-6.6100040078e+000;-4.4911038876e+000; +5.5273437500e-001;-4.5188754797e+000;-7.8725546598e+000;-2.2571492195e+000;-8.8290035725e-001; +5.5468750000e-001;-4.1041290760e+000;-7.7437666059e+000;-9.8336741142e+000;-8.2424390316e+000; +5.5664062500e-001;-4.6653646231e+000;-9.3646046519e+000;-4.0833765268e+000;-2.7164524794e+000; +5.5859375000e-001;-2.1845149994e+000;-1.0782188177e+000;-3.7989443541e+000;-6.1644336581e+000; +5.6054687500e-001;-5.5592516065e+000;-3.7263095379e-001;-2.0456558466e+000;-6.2440872192e-001; +5.6250000000e-001;-1.5881830454e+000;-9.9822992645e+000;-5.1734977961e+000;-4.8353528976e+000; +5.6445312500e-001;-4.4010740519e+000;-8.7890255451e+000;-3.4394383430e-001;-3.5456407070e+000; +5.6640625000e-001;-7.6445814967e+000;-3.1138032675e+000;-4.4065678120e+000;-5.5830562115e+000; +5.6835937500e-001;-1.4862513542e+000;-7.1477401257e+000;-3.3655810356e+000;-5.4600664973e+000; +5.7031250000e-001;-8.3895382285e+000;-1.2921535969e+000;-8.4432508051e+000;-1.3824886084e+000; +5.7226562500e-001;-9.9584948272e+000;-3.3082062006e+000;-6.1598560214e+000;-1.3913387060e+000; +5.7421875000e-001;-7.2573006153e-001;-9.3465986848e+000;-2.7234715223e+000;-9.7216711938e+000; +5.7617187500e-001;-7.2634220123e-002;-3.6698508263e+000;-3.2126832008e+000;-9.6069215983e+000; +5.7812500000e-001;-7.8713339567e+000;-2.2962129116e+000;-8.2399976254e+000;-4.8432886600e-001; +5.8007812500e-001;-9.5995971560e+000;-9.8931852169e+000;-7.5652332604e+000;-5.7676932216e+000; +5.8203125000e-001;-6.1186560988e+000;-6.8745994568e+000;-9.6935941651e+000;-2.6200139523e+000; +5.8398437500e-001;-5.2235481143e+000;-1.0159611702e+000;-8.0214850605e+000;-9.6063112095e+000; +5.8593750000e-001;-5.5983152986e+000;-5.1338237524e+000;-8.8244269788e+000;-4.0693378448e+000; +5.8789062500e-001;-5.3746145964e+000;-2.7463608980e+000;-4.2750328779e+000;-5.2610859275e+000; +5.8984375000e-001;-6.4369639754e+000;-6.2285226583e+000;-3.6860257387e+000;-4.0864288807e-001; +5.9179687500e-001;-7.8038880229e+000;-3.1757563353e+000;-5.1402324438e+000;-6.3991209865e+000; +5.9375000000e-001;-7.8591266274e+000;-6.0948514938e+000;-5.7850885391e+000;-6.3212987781e+000; +5.9570312500e-001;-6.7726677656e+000;-3.2270270586e+000;-1.6272467375e+000;-1.2973415852e+000; +5.9765625000e-001;-3.1495100260e+000;-7.6442763209e+000;-7.3751029372e+000;-1.8710899353e+000; +5.9960937500e-001;-8.5961484909e+000;-1.5073090792e+000;-5.4869228601e+000;-9.4482253492e+000; +6.0156250000e-001;-1.7328411341e+000;-9.9069185462e+000;-4.5445114374e+000;-6.4052248001e+000; +6.0351562500e-001;-9.2706076056e+000;-5.7417523861e+000;-3.8181704283e+000;-8.7218847871e+000; +6.0546875000e-001;-4.6855068207e+000;-7.1349224448e+000;-1.7807549238e+000;-4.5655667782e-001; +6.0742187500e-001;-2.7396464348e+000;-5.2708518505e+000;-1.7670214176e-001;-9.4576860964e+000; +6.0937500000e-001;-5.5275124311e+000;-1.8912321329e+000;-4.2350536585e+000;-4.0604877472e+000; +6.1132812500e-001;-1.7673265934e+000;-2.4109482765e-002;-1.0245060921e+000;-7.7645191550e+000; +6.1328125000e-001;-7.8768272698e+000;-3.4046447277e+000;-8.6510819197e+000;-2.1283608675e+000; +6.1523437500e-001;-4.1480755806e+000;-9.6380504593e+000;-2.1253091097e+000;-3.5706657171e+000; +6.1718750000e-001;-9.2767113447e+000;-7.6793725789e+000;-6.6322824359e+000;-7.7538377047e+000; +6.1914062500e-001;-3.8453322649e+000;-7.3824286461e-001;-1.3528853655e+000;-8.3324685693e+000; +6.2109375000e-001;-9.9301126134e+000;-2.7881711721e+000;-8.3700063825e+000;-6.2425610423e+000; +6.2304687500e-001;-8.3431501687e+000;-9.6227912232e+000;-1.0721153021e+000;-1.4877772331e+000; +6.2500000000e-001;-7.8432559967e-002;-5.4518264532e+000;-8.9403973520e+000;-1.9678336382e+000; +6.2695312500e-001;-2.5617235899e+000;-1.2472915649e+000;-3.1446272135e+000;-1.4835047722e+000; +6.2890625000e-001;-1.6403698921e+000;-8.5143589973e+000;-3.0768764019e+000;-3.1385236979e+000; +6.3085937500e-001;-5.9385967255e+000;-4.4953763485e+000;-8.0132450163e+000;-5.6123554707e-001; +6.3281250000e-001;-8.8503956795e-002;-2.9767751694e+000;-6.9005402923e+000;-7.1498763561e+000; +6.3476562500e-001;-6.5694144368e+000;-3.9466536045e+000;-4.6418666840e-001;-7.7513961494e+000; +6.3671875000e-001;-5.1429793239e+000;-9.7277748957e+000;-1.5259265900e-001;-9.0328684449e+000; +6.3867187500e-001;-5.9459212422e+000;-7.5106051564e+000;-1.7685478926e+000;-8.3767205477e+000; +6.4062500000e-001;-7.2502821684e+000;-1.9501328468e-001;-4.4138920307e+000;-8.4398937225e+000; +6.4257812500e-001;-7.3403120041e+000;-4.8094117641e+000;-3.8972139359e-001;-5.9831538796e+000; +6.4453125000e-001;-4.6363717318e+000;-5.6617939472e+000;-6.5529343486e+000;-9.1045869142e+000; +6.4648437500e-001;-6.3246560097e+000;-5.9184545279e+000;-3.3167517185e+000;-6.3600599766e-001; +6.4843750000e-001;-6.7064425349e+000;-1.0101628304e+000;-9.6935941651e+000;-3.9060640335e+000; +6.5039062500e-001;-5.6923124194e+000;-2.4323225021e-001;-8.2781456411e+000;-3.8456374407e+000; +6.5234375000e-001;-3.9329200983e+000;-7.7330851555e+000;-1.2204349041e+000;-9.7448652610e+000; +6.5429687500e-001;-1.8427073956e+000;-8.5491500795e+000;-5.7829523087e+000;-4.9971008301e+000; +6.5625000000e-001;-5.3346335888e-001;-4.6888637543e+000;-8.4917752445e+000;-5.0840786099e+000; +6.5820312500e-001;-1.2482070923e+000;-1.7883837223e-001;-6.4754173160e+000;-8.2116153836e+000; +6.6015625000e-001;-1.5988647938e+000;-7.9622791708e+000;-3.3017975092e+000;-8.9693903923e-001; +6.6210937500e-001;-9.4924771786e+000;-8.9077425748e+000;-8.1701101363e+000;-4.9436932802e+000; +6.6406250000e-001;-4.6858119965e+000;-7.0201727748e+000;-9.4805749506e+000;-6.5758231282e+000; +6.6601562500e-001;-3.6194980145e-001;-3.3365887403e+000;-6.9301432371e+000;-5.1139867306e+000; +6.6796875000e-001;-9.3356132507e-001;-6.9203773141e+000;-8.0623798072e+000;-9.9438459426e+000; +6.6992187500e-001;-7.3003327847e+000;-7.8737735748e-002;-6.3557848334e+000;-6.8803980947e+000; +6.7187500000e-001;-6.3063448668e+000;-9.3490401655e+000;-5.0022888184e+000;-8.5180211067e+000; +6.7382812500e-001;-2.9264199734e+000;-8.8814966381e+000;-7.6876124740e+000;-1.0904264450e+000; +6.7578125000e-001;-3.2880640030e+000;-2.5180822611e+000;-1.1441391706e+000;-1.4291816950e+000; +6.7773437500e-001;-3.1223487854e+000;-7.1156957746e+000;-9.0734580159e+000;-9.7058015689e+000; +6.7968750000e-001;-1.0998868942e+000;-5.1646474004e+000;-6.8791770935e+000;-1.6116827726e+000; +6.8164062500e-001;-9.0087588131e+000;-5.4008606076e+000;-4.2152166367e+000;-6.8459120393e+000; +6.8359375000e-001;-1.9119846821e+000;-6.8208867311e+000;-8.3492538333e+000;-9.8156682029e+000; +6.8554687500e-001;-1.8539994955e+000;-5.3419598937e+000;-7.3100987077e+000;-5.3053376079e+000; +6.8750000000e-001;-9.3954283372e+000;-9.5208593830e+000;-4.0800195932e+000;-8.2470168173e+000; +6.8945312500e-001;-9.1821039468e+000;-8.8445692509e+000;-2.7634507418e+000;-2.9197055101e+000; +6.9140625000e-001;-7.4465164542e+000;-5.6859034300e+000;-8.4792627394e+000;-7.3870050907e+000; +6.9335937500e-001;-3.3979308605e+000;-4.9674975872e+000;-9.0212702751e-001;-4.0217292309e+000; +6.9531250000e-001;-7.4529251456e+000;-9.9752800073e+000;-5.3196814656e+000;-2.5272375345e+000; +6.9726562500e-001;-2.1225625277e+000;-4.5823544264e+000;-8.2094788551e-001;-1.2173831463e+000; +6.9921875000e-001;-4.9201941490e+000;-2.3047578335e+000;-1.6135138273e+000;-9.2117068917e+000; +7.0117187500e-001;-9.1775261611e+000;-8.2015442848e+000;-1.6672259569e+000;-7.9812006652e+000; +7.0312500000e-001;-4.2426830530e+000;-7.2304451466e+000;-6.2483596802e+000;-3.5786002874e+000; +7.0507812500e-001;-3.1788080931e+000;-3.2535785437e+000;-7.1718496084e+000;-5.5854976177e+000; +7.0703125000e-001;-6.0484632850e+000;-1.0538041592e+000;-8.7282937765e+000;-4.6156191826e+000; +7.0898437500e-001;-7.1813103557e+000;-9.4433423877e+000;-1.1017179489e+000;-3.0231636763e+000; +7.1093750000e-001;-3.2352674007e+000;-5.7060456276e+000;-7.7806939185e+000;-4.3589586020e+000; +7.1289062500e-001;-5.6846827269e+000;-7.2203740478e+000;-6.5651416779e+000;-6.5193641186e+000; +7.1484375000e-001;-4.5918148756e+000;-2.9862362146e+000;-8.0895413458e+000;-9.0008240193e+000; +7.1679687500e-001;-9.8318430036e+000;-6.1143833399e+000;-1.8601030111e+000;-7.2719505429e+000; +7.1875000000e-001;-1.0458695889e+000;-6.3942381740e+000;-4.5829647779e+000;-2.5049591064e+000; +7.2070312500e-001;-3.1482893229e+000;-8.7347026169e+000;-2.1066927910e+000;-8.8198781013e-002; +7.2265625000e-001;-4.9638354778e+000;-6.5645337105e-001;-4.0659809113e+000;-2.2208321095e+000; +7.2460937500e-001;-4.0794092417e+000;-7.6158940792e+000;-4.7788935900e+000;-1.9818717241e+000; +7.2656250000e-001;-1.2527847290e+000;-4.8960846663e+000;-7.3274940252e+000;-6.8056276441e+000; +7.2851562500e-001;-6.5489670634e+000;-4.5811337233e+000;-7.2460097075e+000;-7.2655415535e+000; +7.3046875000e-001;-4.0845972300e+000;-7.9445783794e+000;-4.9186682701e+000;-4.3409526348e+000; +7.3242187500e-001;-4.5896786451e+000;-4.6082949638e+000;-4.2481768131e+000;-3.0085146427e+000; +7.3437500000e-001;-8.5851618648e+000;-7.3299357295e+000;-3.1586647034e-001;-6.5459150076e+000; +7.3632812500e-001;-5.2308738232e-001;-7.1062350273e+000;-1.6476941109e+000;-4.6433913708e+000; +7.3828125000e-001;-6.5742972493e+000;-7.1718513966e-001;-8.9339884371e+000;-7.2374644876e+000; +7.4023437500e-001;-6.9112217426e+000;-5.7747122645e+000;-8.5699026287e+000;-4.7563099861e+000; +7.4218750000e-001;-3.1684315205e+000;-3.7937557697e+000;-4.1679126024e+000;-3.4098333120e+000; +7.4414062500e-001;-9.3746757507e+000;-2.5699639320e+000;-1.8890959024e+000;-7.4758142233e+000; +7.4609375000e-001;-4.7456264496e-001;-5.5195775628e+000;-6.0811182857e+000;-9.2266609520e+000; +7.4804687500e-001;-9.0612506121e+000;-4.9928307533e-001;-3.7284463644e+000;-5.0450149179e+000; +7.5000000000e-001;-6.3142776489e-001;-3.2828760147e+000;-1.6864526272e+000;-4.7660756111e+000; +7.5195312500e-001;-9.7964406013e-001;-8.2992035151e+000;-5.9199804068e+000;-4.5725882053e+000; +7.5390625000e-001;-4.9061554670e+000;-4.4718772173e+000;-4.5716702938e-001;-8.1719413400e+000; +7.5585937500e-001;-4.3339335918e+000;-9.0331736207e+000;-2.5019073486e+000;-6.3100069761e+000; +7.5781250000e-001;-9.0758994967e+000;-8.8045895100e-001;-2.2946864367e+000;-6.1088901758e+000; +7.5976562500e-001;-8.3712279797e-001;-9.4341868162e+000;-1.4484083652e+000;-6.0093995929e+000; +7.6171875000e-001;-7.4010437727e+000;-4.4215214252e+000;-4.4502091408e+000;-7.6021607220e+000; +7.6367187500e-001;-7.7355265617e+000;-3.7113559246e+000;-8.7710201740e-001;-6.3887447119e+000; +7.6562500000e-001;-4.9421674013e+000;-9.4964445755e+000;-9.8364207894e+000;-1.9946897030e+000; +7.6757812500e-001;-8.8341929018e+000;-6.9438764453e+000;-9.6301156655e+000;-6.2935268879e+000; +7.6953125000e-001;-5.1979124546e+000;-7.8948332369e+000;-1.0629594326e+000;-3.9970093966e+000; +7.7148437500e-001;-3.2618182898e+000;-7.0598468184e+000;-6.8456068635e+000;-2.2360908985e+000; +7.7343750000e-001;-8.7789544463e+000;-2.8147220612e+000;-6.6789758205e+000;-9.0221869200e+000; +7.7539062500e-001;-4.5710623264e+000;-2.8952908516e+000;-8.3553574979e+000;-2.5006866455e+000; +7.7734375000e-001;-7.5655400753e-001;-4.3314921856e+000;-6.6365551949e+000;-5.2095115185e-001; +7.7929687500e-001;-4.7395247221e+000;-8.8409069926e+000;-6.3405254483e+000;-6.1919003725e+000; +7.8125000000e-001;-4.8982203007e-001;-2.3041474819e+000;-5.1530504227e+000;-9.6783348918e+000; +7.8320312500e-001;-9.1909543425e+000;-5.6126591563e+000;-5.2403333783e+000;-3.6472672224e+000; +7.8515625000e-001;-3.0881679058e+000;-5.5711537600e+000;-9.5110934600e+000;-5.6871241331e+000; +7.8710937500e-001;-2.8266245127e+000;-8.1011383235e+000;-5.7817316055e+000;-1.0315257311e+000; +7.8906250000e-001;-2.7771592140e-002;-2.1283608675e+000;-6.6789758205e+000;-5.6889554858e+000; +7.9101562500e-001;-2.0490127802e+000;-3.6939603090e+000;-8.9852595329e+000;-9.3945127726e+000; +7.9296875000e-001;-1.4822840691e+000;-7.5511947274e+000;-9.6935941651e+000;-9.9276721478e-001; +7.9492187500e-001;-2.5769829750e+000;-6.8279060721e+000;-1.8228703737e+000;-5.8116397262e+000; +7.9687500000e-001;-8.4575945139e+000;-1.9275492430e+000;-6.2706381083e+000;-4.2374950647e+000; +7.9882812500e-001;-6.2761315703e+000;-6.4168217778e+000;-4.6235543489e+000;-1.4160573483e-001; +8.0078125000e-001;-2.5785088539e+000;-2.8452408314e+000;-6.8639180064e+000;-4.3964964151e+000; +8.0273437500e-001;-9.8239064217e-001;-1.0840177536e+000;-6.0835596919e+000;-4.1914123297e+000; +8.0468750000e-001;-9.0762047470e+000;-7.1599474549e+000;-2.0923489332e+000;-6.7424541712e+000; +8.0664062500e-001;-4.1615039110e+000;-1.4651936293e+000;-3.5935544968e+000;-9.4409009069e+000; +8.0859375000e-001;-7.9616688192e+000;-1.2286752462e+000;-3.9088106155e+000;-6.8196660280e+000; +8.1054687500e-001;-2.9331338406e+000;-8.0639056861e+000;-3.2959991693e+000;-3.6762595177e+000; +8.1250000000e-001;-4.8817408085e+000;-7.8325754404e+000;-2.8534805775e+000;-2.6187932491e+000; +8.1445312500e-001;-4.6742147207e+000;-6.3301491737e+000;-9.3325602263e+000;-3.1614124775e+000; +8.1640625000e-005;-3.8630330563e+000;-4.7166353464e+000;-8.8546403497e+000;-5.3370770812e+000; +8.1835937500e-005;-9.2150638998e+000;-7.1611681581e+000;-3.2810449600e+000;-7.8948332369e+000; +8.2031250000e-005;-3.5511338711e+000;-4.2866295576e+000;-6.4189580083e+000;-6.4882349968e+000; +8.2226562500e-005;-6.9322794676e+000;-2.7204197645e+000;-6.5654468536e+000;-6.3451033831e+000; +8.2421875000e-005;-9.9291970581e+000;-3.4211248159e+000;-6.0057374835e+000;-1.5472882986e+000; +8.2617187500e-005;-9.5892208442e+000;-2.0090335608e+000;-7.3671680689e+000;-1.5686511993e+000; +8.2812500000e-005;-5.4423657060e+000;-3.0860316753e+000;-1.2717062235e+000;-9.7820978425e+000; +8.3007812500e-005;-6.0246589780e+000;-7.5994139910e+000;-9.4827112556e+000;-9.8260444961e+000; +8.3203125000e-005;-6.9292277098e+000;-1.0278636217e+000;-8.4014405310e+000;-2.0929592848e+000; +8.3398437500e-005;-3.5706758499e-002;-4.2362743616e+000;-6.0167241096e+000;-3.7437057495e+000; +8.3593750000e-005;-6.9307535887e+000;-5.9300515056e+000;-9.9829096347e+000;-1.4883875847e+000; +8.3789062500e-005;-1.5698719025e+000;-6.4879298210e+000;-2.8675192595e+000;-1.0086369514e+000; +8.3984375000e-005;-4.7718739510e+000;-4.1126745939e+000;-9.2056032270e+000;-6.6493728757e+000; +8.4179687500e-005;-9.5345927402e+000;-9.6966460161e+000;-2.1924495697e+000;-4.7254860401e+000; +8.4375000000e-001;-9.9594103824e+000;-3.5132908821e+000;-1.2949001789e+000;-7.6967680454e+000; +8.4570312500e-001;-6.0948514938e+000;-7.5319682062e+000;-2.5946837664e+000;-5.6065553427e+000; +8.4765625000e-001;-5.8153018355e+000;-2.5492113829e+000;-9.4811853394e+000;-1.1386454105e+000; +8.4960937500e-001;-6.2022766471e+000;-8.3223998547e-001;-1.6473889351e+000;-2.5614184141e+000; +8.5156250000e-001;-9.6047852933e+000;-7.3110142350e+000;-6.1293375492e+000;-1.8189030886e+000; +8.5351562500e-001;-1.0815757513e+000;-4.8939484358e+000;-6.3661611080e+000;-5.7200843096e+000; +8.5546875000e-001;-4.6998500824e-001;-3.0838954449e+000;-9.7305215523e+000;-7.2426527739e+000; +8.5742187500e-001;-9.2315439135e+000;-4.7062593699e+000;-7.0485550165e+000;-3.2578510046e+000; +8.5937500000e-001;-2.0172733068e+000;-9.2367320508e+000;-8.9596240222e+000;-7.6870021224e+000; +8.6132812500e-001;-1.9043552876e+000;-8.5326699913e+000;-8.3339945972e+000;-9.3044831604e+000; +8.6328125000e-001;-6.1449018121e+000;-3.7464523315e+000;-9.7775200568e+000;-7.7504806221e+000; +8.6523437500e-001;-8.0568850040e-001;-8.5122226179e+000;-7.0833459496e+000;-3.4797203541e+000; +8.6718750000e-001;-2.4158453941e+000;-8.8570818305e+000;-4.2463451624e+000;-5.2027955651e+000; +8.6914062500e-001;-2.5879698992e+000;-1.3046664000e+000;-8.5473188758e+000;-1.9595932961e+000; +8.7109375000e-001;-6.7162084579e+000;-6.2920010090e+000;-4.1767632961e+000;-4.9385052919e+000; +8.7304687500e-001;-6.4384898543e+000;-1.0037535429e+000;-8.9815973490e+000;-4.1673022509e+000; +8.7500000000e-001;-3.2389295101e+000;-4.2625200748e+000;-8.6748863757e+000;-2.8995633125e+000; +8.7695312500e-001;-6.9844660163e+000;-9.6563615650e+000;-9.7198400833e+000;-5.4048278928e+000; +8.7890625000e-001;-4.1615039110e+000;-6.2633135915e+000;-3.5148167610e+000;-8.7264625728e+000; +8.8085937500e-001;-8.5094760358e+000;-9.8199407943e+000;-3.7083041668e+000;-9.2449720949e+000; +8.8281250000e-001;-9.4729453325e+000;-8.7878047675e+000;-6.2865078449e+000;-2.2589802742e+000; +8.8476562500e-001;-4.6256905794e+000;-8.6605426669e+000;-3.9033174515e-001;-6.4439833164e+000; +8.8671875000e-001;-9.8483230080e+000;-6.6481521726e+000;-3.6240732670e+000;-8.3916746080e+000; +8.8867187500e-001;-2.7072972059e+000;-1.0635697842e+000;-9.1058076918e+000;-1.4896082878e+000; +8.9062500000e-001;-1.8366038799e+000;-4.0940582752e+000;-6.6487625241e+000;-3.0338448286e+000; +8.9257812500e-001;-6.4690083265e+000;-6.9386884570e+000;-8.4487441182e+000;-7.9018524289e+000; +8.9453125000e-009;-6.0853907466e+000;-5.2977079153e+000;-5.5867183208e+000;-3.7470626831e+000; +8.9648437500e-009;-2.9715871811e+000;-6.4418470860e+000;-4.0839868784e+000;-3.0146181583e+000; +8.9843750000e-009;-1.2845242023e+000;-8.6461989582e+000;-1.2854397297e+000;-5.3523361683e+000; +9.0039062500e-009;-5.9001433849e+000;-7.2164067626e+000;-9.3203528225e+000;-1.2622457743e+000; +9.0234375000e-009;-8.9806817472e+000;-4.6736043692e+000;-8.1402020156e+000;-9.7293008119e+000; +9.0429687500e+009;-7.1858882904e+000;-1.6504412889e+000;-2.3850214481e+000;-5.8421581984e+000; +9.0625000000e+009;-5.4750204086e-001;-1.1145359278e+000;-4.1032135487e+000;-7.6546525955e+000; +9.0820312500e+009;-5.7924151421e-001;-1.2109744549e+000;-8.8839352131e-001;-2.6853233576e+000; +9.1015625000e+009;-2.9889827967e+000;-1.4352852106e+000;-3.8196969032e+000;-8.4200567007e+000; +9.1210937500e+009;-4.6754354239e+000;-6.2779626250e+000;-2.8449356556e+000;-7.0403149724e+000; +9.1406250000e+009;-8.5772271454e+000;-9.0374462306e+000;-4.2719811201e+000;-3.7900936604e+000; +9.1601562500e+009;-7.8655354679e+000;-2.3996704817e+000;-3.6075931787e+000;-4.6052455902e-001; +9.1796875000e+009;-8.3919797838e+000;-1.8866544962e+000;-2.3728138208e+000;-4.3427824974e-001; +9.1992187500e+009;-2.5208288431e+000;-6.2123477459e+000;-7.8942228854e+000;-3.3158361912e+000; +9.2187500000e-001;-5.3584399819e+000;-5.3501999378e+000;-4.4761496782e+000;-2.9880672693e+000; +9.2382812500e-001;-9.1268654168e+000;-5.1716667414e+000;-4.4975125790e+000;-3.8499099016e+000; +9.2578125000e-001;-2.1167635918e+000;-8.2644124329e+000;-2.5183874369e+000;-2.1430099010e+000; +9.2773437500e-001;-1.8491166830e+000;-3.5276347399e+000;-7.0378735662e+000;-8.0898465216e+000; +9.2968750000e-001;-6.7824336886e+000;-2.4787133932e+000;-4.2234563828e+000;-2.3844110966e+000; +9.3164062500e-001;-3.8734090328e+000;-1.3077181578e+000;-5.9688100219e+000;-4.2512285709e+000; +9.3359375000e-001;-9.0829187632e+000;-3.0524611473e+000;-9.2281869054e+000;-5.9269997478e+000; +9.3554687500e-001;-2.5458538532e+000;-2.2882777452e+000;-3.7531661987e+000;-9.4875942171e+000; +9.3750000000e-001;-6.7976927757e+000;-3.6671042442e+000;-2.4384260178e-001;-6.7018646002e+000; +9.3945312500e-001;-4.6284371614e+000;-4.9961853027e+000;-3.8004702330e+000;-8.0211798847e+000; +9.4140625000e-001;-5.6450086832e+000;-8.9562669396e+000;-4.2820519209e+000;-8.1835383177e+000; +9.4335937500e-001;-2.6865446568e+000;-7.4785608053e+000;-4.2527544498e+000;-8.2888245583e-001; +9.4531250000e-001;-5.4341256618e+000;-2.9770803452e+000;-4.9043238163e-001;-2.0154422522e+000; +9.4726562500e-001;-8.1371501088e+000;-1.4725178480e+000;-7.1425518394e+000;-5.2430808544e-001; +9.4921875000e-001;-4.5020908117e+000;-1.4453566074e+000;-4.6494948864e+000;-5.4783776402e+000; +9.5117187500e-001;-5.0584429502e+000;-8.8433484733e+000;-4.0617084503e+000;-4.1199988127e+000; +9.5312500000e-001;-2.1942794323e-001;-8.6135441065e+000;-2.0606100559e+000;-7.8444777429e+000; +9.5507812500e-001;-1.8863493204e+000;-6.6801965237e+000;-8.2473219931e+000;-2.2391432524e+000; +9.5703125000e-001;-7.5106051564e+000;-5.5470442772e+000;-7.4629962444e+000;-3.8026064634e+000; +9.5898437500e-001;-7.5377666950e+000;-9.1454817355e+000;-6.5163120627e+000;-5.5177465081e+000; +9.6093750000e-001;-5.4344308376e+000;-4.5564132929e+000;-4.1807305813e+000;-4.2075866461e+000; +9.6289062500e-001;-6.7802971601e+000;-4.2991423607e+000;-6.9322794676e+000;-2.4796289206e+000; +9.6484375000e-001;-5.7271033525e+000;-8.3584094048e+000;-5.7841730118e+000;-2.1039462090e+000; +9.6679687500e-001;-6.6164135933e-001;-7.6717428863e+000;-9.8870815150e+000;-2.5101476908e+000; +9.6875000000e-001;-3.3484905958e+000;-6.2025818229e+000;-4.6708577871e+000;-6.4546644688e-001; +9.7070312500e-001;-9.3627735227e+000;-3.3689379692e+000;-6.8410292268e+000;-1.6019165516e+000; +9.7265625000e-001;-4.4532608986e+000;-2.0728170872e+000;-2.3703724146e+000;-7.3747977614e+000; +9.7460937500e-001;-8.7145604193e+000;-4.9067658186e+000;-9.8431348614e+000;-4.9366742373e+000; +9.7656250000e-001;-5.5384990573e+000;-5.9013640881e+000;-9.7009186074e+000;-1.9531846046e-001; +9.7851562500e-001;-6.6194647551e+000;-4.3000578880e-001;-4.9281287193e+000;-7.8356273472e+000; +9.8046875000e-001;-2.5913268328e+000;-1.3031405210e+000;-4.9653613567e+000;-7.9116183519e+000; +9.8242187500e-001;-4.1444122791e-001;-9.3148594350e+000;-2.3282569647e+000;-3.9548933506e+000; +9.8437500000e-001;-4.5744192600e+000;-6.3621935248e+000;-8.9150670171e+000;-6.2343209982e+000; +9.8632812500e-001;-9.6615497395e+000;-8.0535294116e+000;-4.8332160711e+000;-5.4972991347e+000; +9.8828125000e-001;-5.3379926085e+000;-1.2421035767e+000;-9.9313333537e+000;-2.4176764488e+000; +9.9023437500e-001;-9.5822016150e+000;-1.5994751453e+000;-1.4157533646e+000;-3.4907072783e+000; +9.9218750000e-001;-5.7686087489e+000;-1.6190069914e+000;-5.6175419688e+000;-1.8817710876e+000; +9.9414062500e-001;-7.2362437844e+000;-6.9246470928e-001;-5.0773644447e+000;-5.5342265964e+000; +9.9609375000e-001;-7.4050110579e+000;-3.8547927141e+000;-1.4065980911e+000;-2.1286660433e+000; +9.9804687500e-001;-4.2243719101e+000;-4.8860132694e+000;-5.8046221733e-001;-2.6047545671e+000; diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-signal.csv b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-signal.csv new file mode 100755 index 0000000..cd60990 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-signal.csv @@ -0,0 +1,513 @@ +Time (s);Noise 1;Noise 2;Noise 3;Noise 4;Sampling Rate +0.0000000000e+000;-1.8802452087e+000;-7.2682881355e+000;-2.5879698992e+000;-1.7630541325e+000;512 +1.9531250000e-003;-3.0222481489e+000;-9.3197423965e+000;-3.3793145418e+000;-9.3173027039e-001; +3.9062500000e-003;-8.9126255363e+000;-9.9822992645e+000;-5.0880458951e+000;-4.5405435562e+000; +5.8593750000e-003;-9.4112979621e+000;-4.2872405052e+000;-5.0810265541e+000;-8.3629871905e+000; +7.8125000000e-003;-5.1881670952e-002;-7.2643208504e+000;-2.6404613256e+000;-3.9716786146e+000; +9.7656250000e-003;-6.7827388644e+000;-1.3446456194e+000;-3.6603897810e+000;-7.8582109511e+000; +1.1718750000e-002;-4.4160306454e-001;-3.0036318302e+000;-5.5662709475e+000;-3.2441174984e+000; +1.3671875000e-002;-3.4839928150e+000;-2.5223547220e+000;-1.7740410566e+000;-3.3948791027e+000; +1.5625000000e-002;-5.8442950249e-001;-6.8889430165e+000;-1.9086277485e+000;-6.6771447659e+000; +1.7578125000e-002;-7.4159979820e-001;-7.8859806061e-001;-6.6228216887e+000;-2.6450389624e+000; +1.9531250000e-002;-4.6784877777e-001;-5.7914975286e+000;-7.9534287751e+000;-1.2485122681e+000; +2.1484375000e-002;-1.9711905718e+000;-2.5763726234e+000;-6.8055987358e-002;-9.0633869171e+000; +2.3437500000e-002;-6.5941342711e+000;-6.1449018121e+000;-2.8287607431e+000;-2.9572427273e-001; +2.5390625000e-002;-6.7964720726e+000;-7.6387822628e-001;-9.9526963104e+000;-9.1311395168e-001; +2.7343750000e-002;-4.5664846897e+000;-4.6494948864e+000;-9.2056032270e+000;-6.0829493403e+000; +2.9296875000e-002;-9.3530075997e+000;-3.6161381006e+000;-4.0516370535e+000;-4.6116518974e+000; +3.1250000000e-002;-6.0219123960e+000;-8.2876063883e+000;-3.2673114538e+000;-6.6032898426e+000; +3.3203125000e-002;-1.9772940874e+000;-4.2326122522e+000;-4.6543776989e+000;-3.8166445494e+000; +3.5156250000e-002;-4.0818506479e+000;-7.5020599365e+000;-7.4965667725e+000;-9.8440504167e+000; +3.7109375000e-002;-9.2864772677e+000;-6.4366587996e+000;-6.4149916172e-001;-2.0642721653e+000; +3.9062500000e-002;-9.8263496719e+000;-2.2363966703e+000;-3.1516462564e+000;-9.5806756616e+000; +4.1015625000e-002;-2.6224553585e+000;-5.5256813765e+000;-3.9109468460e+000;-4.2503130436e+000; +4.2968750000e-002;-7.3574021459e+000;-3.0887782574e+000;-9.3862727657e+000;-4.3327128887e+000; +4.4921875000e-002;-9.6667378768e+000;-4.6162295341e+000;-6.8340098858e+000;-9.5687734708e+000; +4.6875000000e-002;-5.4628133774e-001;-2.8565323353e+000;-6.4693135023e+000;-9.1357158124e+000; +4.8828125000e-002;-7.4388867617e+000;-8.2470168173e+000;-5.8317819238e+000;-4.4392222166e+000; +5.0781250000e-002;-4.3034148216e+000;-1.0055845976e+000;-5.3263953328e+000;-2.0285654068e+000; +5.2734375000e-002;-7.6708273590e+000;-3.1537824869e+000;-1.9333475828e+000;-7.2203740478e+000; +5.4687500000e-002;-9.2318475246e-001;-8.7994018197e+000;-8.3288064599e+000;-7.3802912235e+000; +5.6640625000e-002;-3.8483858109e-001;-4.9958825111e-001;-1.0251164436e+000;-5.8552813530e+000; +5.8593750000e-002;-1.4951020479e+000;-9.7671437636e+000;-6.9368600845e-001;-9.3386769295e-002; +6.0546875000e-002;-3.2184821367e+000;-3.0228585005e+000;-3.2023072243e+000;-3.8032168150e+000; +6.2500000000e-002;-2.1546065807e+000;-4.5603805780e+000;-3.2166510820e+000;-5.7966858149e+000; +6.4453125000e-002;-7.3943296075e+000;-7.8719443083e+000;-7.1568956971e+000;-9.7296060063e+000; +6.6406250000e-002;-9.5873897523e+000;-2.4130988121e+000;-6.1406293511e+000;-4.8295539618e+000; +6.8359375000e-002;-7.8896450996e+000;-4.6061587334e+000;-6.6454052925e+000;-9.3264564872e+000; +7.0312500000e-002;-7.4852746725e+000;-7.8472243249e+000;-8.1603442132e+000;-9.9652088992e+000; +7.2265625000e-002;-2.7539902925e+000;-1.8515580893e+000;-3.3414715528e+000;-1.0193169117e-001; +7.4218750000e-002;-7.0897549391e+000;-4.0922272205e+000;-7.1794793010e+000;-5.2156132460e+000; +7.6171875000e-002;-1.7279577255e+000;-3.3042389154e+000;-6.8419447541e+000;-3.2465589046e+000; +7.8125000000e-002;-5.6636250019e+000;-6.7766350508e+000;-1.3605153561e+000;-4.1990417242e+000; +8.0078125000e-002;-2.9456466436e+000;-1.3013094664e+000;-1.1761832237e+000;-5.7222205400e+000; +8.2031250000e-002;-9.0853631496e-001;-3.1031221151e+000;-4.9388104677e+000;-4.4605851173e+000; +8.3984375000e-002;-1.3657033443e+000;-5.9675893188e+000;-9.0478225052e+000;-3.9728993177e+000; +8.5937500000e-002;-6.3325881958e-001;-4.3665885925e+000;-4.5716702938e-001;-6.3060396910e+000; +8.7890625000e-002;-4.8829615116e+000;-7.7877132595e+000;-2.3987531662e-001;-7.5402081013e+000; +8.9843750000e-002;-9.0685750544e+000;-7.8868983686e+000;-8.1991027296e+000;-1.6040527821e+000; +9.1796875000e-002;-1.4368116856e+000;-2.8543961048e+000;-9.3801690638e+000;-3.7156283855e+000; +9.3750000000e-002;-7.3747977614e+000;-8.0990020931e+000;-4.7303688526e+000;-6.6615802050e+000; +9.5703125000e-002;-1.9806510210e+000;-9.0951261669e+000;-4.7956788540e+000;-8.4069338441e+000; +9.7656250000e-002;-1.2607198954e+000;-9.4012268260e+000;-2.8556168079e+000;-1.1535996199e+000; +9.9609375000e-002;-8.0562761426e+000;-3.1559193134e+000;-9.0893276781e+000;-4.7697377205e+000; +1.0156250000e-001;-6.9704276323e+000;-9.2049928010e+000;-8.6065249145e+000;-5.9340190887e+000; +1.0351562500e-001;-7.7037873864e+000;-1.1780142784e-001;-2.0279550552e+000;-8.6559648812e+000; +1.0546875000e-001;-1.9492173195e+000;-2.1945858002e+000;-9.6468985081e-001;-9.2776417732e-002; +1.0742187500e-001;-8.2580034435e+000;-5.2552878857e-001;-6.1845758557e+000;-7.2334972024e+000; +1.0937500000e-001;-2.0444351435e+000;-9.8226874508e+000;-5.3376853466e-001;-5.6794947386e+000; +1.1132812500e-001;-8.0022583902e+000;-1.4130055904e-001;-4.1648608446e+000;-3.0683308840e+000; +1.1328125000e-001;-6.8138676882e+000;-6.3194677234e+000;-8.1215856969e+000;-7.3305487633e-001; +1.1523437500e-001;-9.4119083136e+000;-6.0936307907e+000;-2.0383310318e+000;-9.2074342817e+000; +1.1718750000e-001;-2.2598958015e+000;-7.7120272815e+000;-6.9167149067e+000;-1.4932703972e+000; +1.1914062500e-001;-3.5712760687e+000;-7.4428540468e+000;-5.4258859158e+000;-1.6479969025e-001; +1.2109375000e-001;-9.7213659994e+000;-7.2704243660e+000;-6.3707387447e+000;-6.5901669860e+000; +1.2304687500e-001;-7.0595416427e+000;-7.3924985528e+000;-1.4108705521e+000;-7.9113131762e+000; +1.2500000000e-001;-3.4110540152e+000;-6.0823380947e-001;-5.3746145964e+000;-9.1329691559e+000; +1.2695312500e-001;-9.7570726648e+000;-1.0940885544e+000;-7.2841578722e+000;-1.5564441681e+000; +1.2890625000e-001;-3.4781944752e+000;-8.0211798847e+000;-5.3309732676e+000;-3.2175666094e+000; +1.3085937500e-001;-5.1567125320e+000;-3.8312935829e+000;-2.2324287891e+000;-4.4300669432e+000; +1.3281250000e-001;-3.2395398617e+000;-6.3997313380e+000;-6.2977996469e+000;-8.2250434160e+000; +1.3476562500e-001;-9.6996978670e+000;-4.3870359659e+000;-1.1053806543e+000;-1.4835047722e+000; +1.3671875000e-001;-3.0036318302e+000;-1.2826931477e+000;-6.7302468419e+000;-1.9608139992e+000; +1.3867187500e-001;-5.6117436290e+000;-9.2178106308e+000;-1.5332502127e+000;-2.2141176462e+000; +1.4062500000e-001;-3.5120701790e+000;-9.5675528049e-001;-1.6290777922e+000;-4.0610980988e+000; +1.4257812500e-001;-7.7788628638e+000;-9.8727378156e+000;-4.2182683945e+000;-2.7173680067e+000; +1.4453125000e-001;-6.4973890781e-001;-3.4260076284e+000;-3.6463516951e+000;-3.1052583456e+000; +1.4648437500e-001;-1.2973415852e+000;-8.7630847842e+000;-1.2982571125e+000;-1.0208439827e+000; +1.4843750000e-001;-7.7498702705e+000;-9.0636920929e+000;-2.9599905014e+000;-5.8839678764e-001; +1.5039062500e-001;-9.6758934110e+000;-1.3223671913e+000;-1.8427073956e+000;-5.2873316407e+000; +1.5234375000e-001;-5.6395152211e+000;-3.7784963846e+000;-5.4332101345e+000;-5.9523302317e+000; +1.5429687500e-001;-7.5167059898e-001;-7.5661489367e+000;-3.4235662222e+000;-9.7775200568e+000; +1.5625000000e-001;-6.7217016220e+000;-1.1777091026e+000;-9.7347941436e+000;-5.5342265964e+000; +1.5820312500e-001;-8.9394818246e+000;-5.0923183560e+000;-5.2516251802e+000;-7.4910733104e+000; +1.6015625000e-001;-4.7614979744e+000;-5.0828576088e+000;-4.4587540627e+000;-6.1684012413e+000; +1.6210937500e-001;-6.2987151742e+000;-6.9646289945e+000;-7.2435683012e+000;-4.7990357876e+000; +1.6406250000e-001;-3.8453340530e-001;-9.5922727138e+000;-9.6288949251e+000;-5.0035095215e+000; +1.6601562500e-001;-9.9111911375e+000;-3.9094209671e-001;-9.3804742396e+000;-8.5116147995e-001; +1.6796875000e-001;-7.3503831029e+000;-6.4455091953e+000;-7.0244452357e+000;-4.6702474356e+000; +1.6992187500e-001;-7.8597369790e+000;-4.4376963377e+000;-5.5296486616e+000;-1.8851286173e+000; +1.7187500000e-001;-1.9867539406e-001;-2.4680316448e+000;-4.3012785912e+000;-9.5004141331e-001; +1.7382812500e-001;-9.5348979160e+000;-5.9349346161e+000;-4.3266093731e+000;-6.4555802941e+000; +1.7578125000e-001;-3.6048465967e+000;-7.1251565218e+000;-2.6190984249e+000;-2.3508405685e+000; +1.7773437500e-001;-6.7479476333e+000;-9.9551379681e-001;-5.4731893539e+000;-8.9144587517e-001; +1.7968750000e-001;-1.4981538057e+000;-5.4243597388e+000;-2.0294785500e-001;-1.2033450603e+000; +1.8164062500e-001;-8.9913632721e+000;-3.9237648249e+000;-1.6693621874e+000;-3.6222416162e+000; +1.8359375000e-001;-3.4342479706e+000;-8.3462019265e+000;-8.7060151994e+000;-7.8313547373e+000; +1.8554687500e-001;-7.8777427971e+000;-4.4813376665e+000;-3.0808436871e+000;-1.2231820822e+000; +1.8750000000e-001;-6.7439803481e+000;-6.5062409639e+000;-1.5533924103e-001;-2.8653830290e+000; +1.8945312500e-001;-6.8285164237e+000;-5.7057404518e+000;-4.7975122929e-001;-3.1315040588e+000; +1.9140625000e-001;-4.2909026146e-001;-6.6502884030e+000;-2.5031280518e+000;-9.5486312360e+000; +1.9335937500e-001;-1.6812646389e+000;-2.4307990074e+000;-2.3114717007e+000;-4.1428875923e+000; +1.9531250000e-001;-5.9089937806e+000;-1.5152442455e+000;-5.6474500895e+000;-7.3451948166e+000; +1.9726562500e-001;-1.8372142315e+000;-3.1696522236e+000;-1.1716055870e+000;-6.2221136689e+000; +1.9921875000e-001;-5.5272072554e+000;-1.9186985493e+000;-1.5628528595e+000;-8.2399964333e-001; +2.0117187500e-001;-3.1031221151e+000;-8.2317575812e+000;-3.8172549009e+000;-8.2662434876e+000; +2.0312500000e-001;-2.2339522839e-001;-5.5241554976e+000;-8.8076418638e+000;-2.3566395044e+000; +2.0507812500e-001;-6.9597461820e+000;-8.2216864824e+000;-7.4678793550e+000;-5.3495895863e+000; +2.0703125000e-001;-4.5347452164e+000;-1.6037476063e+000;-8.9199499786e+000;-2.0270395279e+000; +2.0898437500e-001;-7.2347179055e+000;-6.4308604598e+000;-2.2891932726e+000;-5.6761375070e+000; +2.1093750000e-001;-1.5369123220e+000;-3.8300728798e+000;-3.9301735163e+000;-6.7375713587e+000; +2.1289062500e-001;-3.9338350296e-001;-5.8656573296e-001;-3.9799189568e+000;-3.3735162020e+000; +2.1484375000e-001;-6.6228216887e+000;-4.6687215567e+000;-3.2517468929e+000;-1.4706867933e+000; +2.1679687500e-001;-2.6673197746e-001;-7.1962654591e-001;-9.1518906504e+000;-5.7652515173e+000; +2.1875000000e-001;-5.1564073563e+000;-8.6178167164e+000;-9.3734549731e+000;-4.3150120974e+000; +2.2070312500e-001;-9.5721304789e+000;-8.9434491843e+000;-2.7408671379e+000;-7.7886287868e+000; +2.2265625000e-001;-4.4276255369e+000;-4.3910032511e+000;-2.1491134167e+000;-4.7309792042e+000; +2.2460937500e-001;-4.4819480181e+000;-8.3315530419e+000;-5.5732902884e+000;-2.6206243038e+000; +2.2656250000e-001;-8.6632892489e+000;-1.9919431210e+000;-4.8121583462e+000;-5.3822442889e+000; +2.2851562500e-001;-3.4632402658e+000;-5.6367695332e-001;-1.8707871437e-001;-5.0560015440e+000; +2.3046875000e-001;-9.0426325798e-001;-3.1849116087e+000;-4.9082916975e+000;-5.4078799486e+000; +2.3242187500e-001;-6.4409315586e+000;-4.3211156130e+000;-2.8385263681e+000;-1.4923548698e+000; +2.3437500000e-001;-1.1029386520e+000;-6.8871119618e+000;-3.8657796383e+000;-1.0406810045e+000; +2.3632812500e-001;-3.7549972534e+000;-7.3454999924e+000;-8.0352184176e+000;-6.3194677234e+000; +2.3828125000e-001;-9.5205542073e+000;-8.2659383118e+000;-3.6634421349e+000;-1.7258214951e+000; +2.4023437500e-001;-5.1484724879e+000;-3.3289587498e+000;-7.7065339684e+000;-7.7416302264e+000; +2.4218750000e-001;-2.2312080860e+000;-5.5302590132e+000;-1.7813652754e+000;-1.0376274586e-001; +2.4414062500e-001;-5.8632159233e+000;-9.1622669250e+000;-8.9748832583e+000;-5.4460281134e+000; +2.4609375000e-001;-4.9778741598e+000;-5.3386029601e+000;-4.3336153030e-002;-6.1607715487e+000; +2.4804687500e-001;-8.6419263482e+000;-7.2585222125e+000;-1.1813712120e+000;-6.7076632380e+000; +2.5000000000e-001;-3.2462537289e+000;-3.3469647169e+000;-8.6532181501e+000;-8.0880153179e+000; +2.5195312500e-001;-5.3282266855e+000;-8.4246344864e+000;-3.4629350901e+000;-1.1737418175e+000; +2.5390625000e-001;-2.8351724148e-001;-8.1438642740e+000;-7.5011444092e+000;-3.6661887169e+000; +2.5585937500e-001;-7.9320657253e+000;-8.7405025959e-001;-7.3512986302e+000;-8.9336832613e+000; +2.5781250000e-001;-4.0870386362e+000;-1.7883849144e+000;-4.8023927212e+000;-5.9193700552e+000; +2.5976562500e-001;-3.3863335848e+000;-2.4182868004e+000;-7.7587206662e+000;-8.5360270739e+000; +2.6171875000e-001;-2.0044559240e+000;-3.3445233107e+000;-9.0209662169e+000;-9.1485335678e+000; +2.6367187500e-001;-2.1716970205e+000;-8.3144627512e+000;-1.6623431444e+000;-9.3719290942e+000; +2.6562500000e-001;-1.8921476603e+000;-6.5715506673e+000;-8.9898373187e+000;-5.1796013117e+000; +2.6757812500e-001;-2.2070986032e+000;-8.0669575930e+000;-2.6429027319e+000;-5.3376874328e+000; +2.6953125000e-001;-7.4074527621e+000;-2.4805444479e+000;-5.6028932333e+000;-6.0695213079e+000; +2.7148437500e-001;-4.6458327770e+000;-4.4401377439e+000;-7.4886319041e+000;-3.4070861340e+000; +2.7343750000e-001;-5.5888545513e+000;-2.2595906258e+000;-6.9621875882e+000;-8.3462019265e+000; +2.7539062500e-001;-6.2550738454e+000;-4.7996461391e+000;-5.8705404401e+000;-1.0174870491e+000; +2.7734375000e-001;-4.3626207113e+000;-2.9010897875e+000;-3.9985352755e+000;-5.0325036049e-001; +2.7929687500e-001;-2.9502242804e+000;-5.2845850587e+000;-9.5330667868e+000;-4.6485793591e+000; +2.8125000000e-001;-3.7723928690e+000;-1.5128022432e+000;-4.7407454252e+000;-4.0977203846e+000; +2.8320312500e-001;-5.9755265713e-001;-7.3668628931e+000;-3.9820551872e+000;-6.0176396370e+000; +2.8515625000e-001;-1.0284721851e-001;-7.1691030264e+000;-5.7704398036e+000;-6.6859951615e+000; +2.8710937500e-001;-3.0753499269e+000;-7.7257606387e+000;-4.5472580194e+000;-8.7041841447e+000; +2.8906250000e-001;-3.9948701859e-001;-4.9983215332e+000;-2.7503281832e+000;-5.6645405293e+000; +2.9101562500e-001;-2.5794243813e+000;-4.8548847437e+000;-8.6672566831e+000;-5.4881435633e+000; +2.9296875000e-001;-9.9548326060e+000;-9.7570726648e+000;-1.9608139992e+000;-9.6502578631e+000; +2.9492187500e-001;-1.9696646929e+000;-8.1447798014e+000;-6.0798975825e+000;-4.0244758129e+000; +2.9687500000e-001;-8.5085630417e-001;-9.1732535511e+000;-5.3205969930e+000;-2.0453506708e+000; +2.9882812500e-001;-2.3813593388e+000;-6.0921049118e+000;-7.0094913244e+000;-4.3787956238e+000; +3.0078125000e-001;-9.4039735198e+000;-4.5860165358e+000;-6.0975980759e+000;-3.7018954754e+000; +3.0273437500e-001;-8.1484317780e-002;-8.5625782609e+000;-4.2069762945e+000;-5.2259895205e+000; +3.0468750000e-001;-8.0532242358e+000;-1.6232794523e+000;-5.2455213666e+000;-1.7880797386e+000; +3.0664062500e-001;-3.4064757824e+000;-2.3758661747e+000;-6.5608692169e+000;-4.8545795679e+000; +3.0859375000e-001;-6.6957610846e+000;-5.9114336967e-001;-2.7274394035e+000;-3.9225441217e+000; +3.1054687500e-001;-2.3209327459e+000;-8.6925870180e+000;-8.6812952161e+000;-7.3335978389e+000; +3.1250000000e-001;-4.0125733614e+000;-2.2247993946e+000;-1.9611191750e+000;-5.8946502209e+000; +3.1445312500e-001;-1.9742423296e+000;-5.9697255492e+000;-2.9520553350e+000;-2.4018067122e+000; +3.1640625000e-001;-2.8858304024e+000;-2.3459577560e+000;-1.6846239567e-001;-5.4139834642e+000; +3.1835937500e-001;-4.3778800964e+000;-9.6295052767e+000;-7.8203681111e+000;-9.2709127814e+000; +3.2031250000e-001;-6.3676869869e+000;-5.8122500777e+000;-2.3566395044e+000;-2.5412762165e+000; +3.2226562500e-001;-8.5659351945e+000;-6.3518172503e+000;-5.0849941373e+000;-2.6435130835e+000; +3.2421875000e-001;-9.7793511674e+000;-2.9032260180e+000;-6.4479506016e+000;-4.2777794600e+000; +3.2617187500e-001;-7.8554630280e-001;-7.4349191785e+000;-3.0375075340e+000;-3.4995573759e+000; +3.2812500000e-001;-4.6116518974e+000;-1.9287705421e-001;-8.2696005702e+000;-8.6236152053e+000; +3.3007812500e-001;-5.2400282025e+000;-1.1267435551e+000;-1.4627522230e+000;-4.3998533487e+000; +3.3203125000e-001;-4.1117590666e+000;-8.9938044548e-001;-8.5393841565e+000;-7.5685977936e-002; +3.3398437500e-001;-9.0005188435e+000;-8.2601398230e+000;-2.3651844263e+000;-9.6829126775e+000; +3.3593750000e-001;-3.4989470243e+000;-7.9461042583e+000;-5.6492811441e+000;-9.0084536374e+000; +3.3789062500e-001;-6.4787742496e+000;-3.1794184446e+000;-6.7326882482e+000;-7.4382764101e+000; +3.3984375000e-001;-1.2021243572e+000;-8.1972718239e-001;-1.7090439796e-002;-5.3938412666e+000; +3.4179687500e-001;-1.7709892988e+000;-4.2286449671e+000;-7.5359354913e+000;-9.3957335129e+000; +3.4375000000e-001;-3.6640524864e+000;-9.5675528049e-001;-6.9301432371e+000;-5.9764397144e+000; +3.4570312500e-001;-8.7347026169e+000;-7.0815148950e+000;-5.6944486499e+000;-8.8976714015e+000; +3.4765625000e-001;-1.6315197945e+000;-3.2612079382e+000;-5.1667836308e+000;-1.8762779236e+000; +3.4960937500e-001;-2.5473797321e+000;-5.6154057384e+000;-4.6342355013e+000;-3.5175633430e+000; +3.5156250000e-001;-4.1880548000e+000;-7.2048097849e+000;-2.0368051529e+000;-4.4434952736e+000; +3.5351562500e-001;-1.4777064323e+000;-7.4831384420e+000;-9.0389721096e+000;-6.3670766354e+000; +3.5546875000e-001;-1.8451488018e+000;-3.5050505400e+000;-5.5256813765e+000;-4.7401350737e+000; +3.5742187500e-001;-2.4152350426e+000;-3.8773769140e+000;-3.2221442461e+000;-7.4495682120e+000; +3.5937500000e-001;-5.5363628268e+000;-5.4200872779e+000;-4.7599720955e+000;-5.7985186577e-002; +3.6132812500e-001;-7.1333962679e+000;-3.8938564062e+000;-2.9682302475e+000;-2.3523664474e+000; +3.6328125000e-001;-8.0996124446e+000;-9.2867851257e-001;-4.7654652596e+000;-3.1226539612e+000; +3.6523437500e-001;-7.0168158412e+000;-2.1649831533e+000;-4.4373929501e-001;-8.8134403527e+000; +3.6718750000e-001;-2.5577563047e+000;-7.2975859046e+000;-4.1889703274e+000;-9.8507644888e+000; +3.6914062500e-001;-8.3956420422e-001;-2.7845090628e+000;-3.6457413435e+000;-1.0672324896e+000; +3.7109375000e-001;-9.3142509460e-001;-6.4476454258e+000;-9.1012299061e+000;-3.4598833323e+000; +3.7304687500e-001;-1.8832969666e+000;-1.7520678043e+000;-8.5488449037e+000;-6.0692158341e+000; +3.7500000000e-001;-1.3580739498e-001;-4.2338329554e+000;-1.1734366417e+000;-7.3790705204e+000; +3.7695312500e-001;-3.4861290455e+000;-5.0599688292e+000;-5.6660664082e+000;-3.5340434313e+000; +3.7890625000e-001;-8.0794702470e+000;-9.1003143042e+000;-3.4882664680e-001;-4.6357613802e+000; +3.8085937500e-001;-1.4874720573e+000;-9.1659291089e+000;-4.1877496243e+000;-5.6233406067e+000; +3.8281250000e-001;-1.3443404436e+000;-2.1808528900e+000;-6.9045075774e+000;-5.8049255610e+000; +3.8476562500e-001;-1.5936768055e+000;-9.1888180375e+000;-7.3696097732e+000;-2.7643668652e+000; +3.8671875000e-001;-6.1949521303e+000;-7.9393902421e+000;-1.1880856752e+000;-3.5560166836e+000; +3.8867187500e-001;-6.9139683247e+000;-3.5618150234e+000;-5.9114351869e+000;-8.6181218922e+000; +3.9062500000e-001;-4.4755393267e+000;-2.4826806784e+000;-2.7408671379e+000;-8.7823114544e+000; +3.9257812500e-001;-7.7770318091e+000;-9.1210669279e+000;-5.6465345621e+000;-4.2551958561e+000; +3.9453125000e-001;-9.4912564382e+000;-1.7044585943e+000;-2.5727105141e+000;-8.8906522095e+000; +3.9648437500e-001;-5.7667776942e+000;-3.3585619926e+000;-2.3880732059e+000;-9.9719229713e+000; +3.9843750000e-001;-8.8613544405e+000;-4.4828641415e+000;-3.5850095749e+000;-2.3181861639e+000; +4.0039062500e-001;-2.8382241726e-001;-4.9455243349e+000;-5.7853937149e+000;-1.8539994955e+000; +4.0234375000e-001;-9.4860683009e+000;-7.6784551144e-001;-3.6515396833e+000;-8.4856715798e+000; +4.0429687500e-001;-9.6984771267e+000;-5.2095115185e-001;-6.1293375492e+000;-2.9755544662e+000; +4.0625000000e-001;-5.9248635173e+000;-8.0431531370e+000;-7.0354318619e+000;-1.0440379381e+000; +4.0820312500e-001;-7.0162057877e-001;-4.8060548306e+000;-4.5963925123e+000;-3.1467634439e+000; +4.1015625000e-001;-8.8567766547e+000;-2.5110632181e+000;-1.8127977848e-001;-1.4618337154e-001; +4.1210937500e-001;-3.3664965630e+000;-2.4695575237e+000;-6.3029876351e+000;-7.5301370025e+000; +4.1406250000e-001;-8.6217841506e+000;-7.2051149607e+000;-1.2659078836e+000;-3.1342506409e-001; +4.1601562500e-001;-4.3772697449e+000;-2.6670128107e+000;-5.5211034417e+000;-1.9107639790e+000; +4.1796875000e-001;-3.9197975397e+000;-1.7731255293e+000;-2.9462569952e+000;-8.0224005878e+000; +4.1992187500e-001;-5.7463300228e+000;-9.4875942171e+000;-2.2342598438e+000;-9.7369304486e+000; +4.2187500000e-001;-1.2527847290e+000;-1.7212438583e+000;-8.2775352895e+000;-1.1719107628e+000; +4.2382812500e-001;-9.7293008119e+000;-2.4689471722e+000;-7.6305429637e+000;-1.9589829445e+000; +4.2578125000e-001;-4.5075833797e-001;-2.1384316683e+000;-4.5112460852e+000;-4.8319953680e+000; +4.2773437500e-001;-1.4218574762e+000;-9.6050904691e+000;-1.8851286173e+000;-3.9728993177e+000; +4.2968750000e-001;-9.3386638910e+000;-6.1467328668e+000;-2.2055727243e+000;-7.8847621381e+000; +4.3164062500e-001;-7.3812067509e+000;-9.6063112095e+000;-9.4488357008e+000;-3.3027130365e+000; +4.3359375000e-001;-2.8992295265e-002;-5.2519303560e+000;-1.5085297823e+000;-7.1169164777e+000; +4.3554687500e-001;-2.9786050320e-001;-9.4064150006e+000;-3.7525558472e+000;-5.8839687705e+000; +4.3750000000e-001;-2.7106541395e+000;-4.6693325043e-001;-7.3839533329e+000;-3.6347544193e+000; +4.3945312500e-001;-6.5819269419e+000;-2.4140143394e+000;-8.3236183226e+000;-1.2897121906e+000; +4.4140625000e-001;-5.7078766823e+000;-8.2506790757e+000;-7.8862880170e+000;-1.1752676964e+000; +4.4335937500e-001;-9.7296060063e+000;-9.9517807551e+000;-6.9219031930e+000;-8.4600360692e+000; +4.4531250000e-001;-7.6110111177e+000;-9.4882046059e+000;-7.0387890935e+000;-4.3040251732e+000; +4.4726562500e-001;-6.6893520951e+000;-5.1478621364e+000;-8.8311410695e+000;-3.1168556213e+000; +4.4921875000e-001;-8.5955381393e+000;-5.7960754633e+000;-5.8473467827e-001;-4.3269145489e+000; +4.5117187500e-001;-8.5256507993e+000;-4.6641439199e+000;-8.2528153062e+000;-2.6963102818e+000; +4.5312500000e-001;-7.5774407387e+000;-9.5339823514e+000;-8.4972685575e+000;-1.7493212223e+000; +4.5507812500e-001;-1.5363019705e+000;-3.7672048807e+000;-6.9121372700e+000;-6.6225165129e+000; +4.5703125000e-001;-8.3898434043e+000;-9.7396771051e+000;-2.5470745564e+000;-7.3570969701e+000; +4.5898437500e-001;-4.1322052479e-001;-5.2052369714e+000;-3.0259102583e+000;-9.7427289560e+000; +4.6093750000e-001;-5.2696311474e+000;-5.4640340805e+000;-4.3638414145e+000;-1.8689537048e+000; +4.6289062500e-001;-6.8892481923e+000;-9.3163853884e+000;-2.2476881742e+000;-3.4839928150e+000; +4.6484375000e-001;-1.5570545197e+000;-5.0895717740e+000;-7.2453993559e+000;-2.1228677034e+000; +4.6679687500e-001;-9.7003082372e+000;-7.1306496859e+000;-8.2821130753e+000;-8.3571887016e+000; +4.6875000000e-001;-1.6483044624e+000;-3.8657796383e+000;-6.1507004499e+000;-3.9490938187e-001; +4.7070312500e-001;-3.2181769609e+000;-7.2594377398e+000;-7.4068421125e+000;-5.4838711023e+000; +4.7265625000e-001;-1.6220587492e+000;-4.7624135017e+000;-6.5858960152e-001;-1.3397628069e+000; +4.7460937500e-001;-6.0020753741e+000;-8.7575914711e+000;-2.1973252296e-002;-1.2100589275e+000; +4.7656250000e-001;-2.2943812609e+000;-3.5929441452e+000;-9.0313424915e+000;-1.8677330017e+000; +4.7851562500e-001;-5.4969939590e+000;-4.6256905794e+000;-2.3322242498e+000;-6.3389995694e+000; +4.8046875000e-001;-3.5224461555e+000;-1.9049656391e+000;-1.5662097931e+000;-6.8398082256e+000; +4.8242187500e-001;-9.9319437239e+000;-2.9438155890e+000;-1.0846281052e+000;-8.8546403497e+000; +4.8437500000e-001;-4.0943634510e+000;-4.1712701321e+000;-1.9663077593e+000;-1.4810633659e+000; +4.8632812500e-001;-1.8875700235e+000;-3.5367900133e+000;-2.7149266005e+000;-4.9174475670e+000; +4.8828125000e-001;-1.3016146421e+000;-3.0585652590e+000;-1.7792284489e-001;-3.6735129356e+000; +4.9023437500e-001;-8.7667470425e+000;-6.3512068987e+000;-4.0000611544e+000;-6.1732840538e+000; +4.9218750000e-001;-1.9895017147e+000;-1.7639696598e+000;-2.8891873360e+000;-9.4842371717e+000; +4.9414062500e-001;-2.2501295805e+000;-2.0596939325e+000;-3.1882685423e+000;-7.7944278717e-001; +4.9609375000e-001;-6.3322854042e+000;-9.3478194624e+000;-2.2931605577e+000;-7.2371593118e+000; +4.9804687500e-001;-5.3346335888e-001;-4.6235543489e+000;-7.2621846199e+000;-9.7460860014e+000; +5.0000000000e-001;-2.8299814463e+000;-2.0184940100e+000;-1.6858422756e+000;-5.7554855943e+000; +5.0195312500e-001;-7.9805901647e+000;-4.7508162260e+000;-7.6433606446e+000;-2.3874628544e+000; +5.0390625000e-001;-5.6151005626e+000;-9.6404919401e+000;-2.6242864132e+000;-4.8765528202e+000; +5.0585937500e-001;-9.5730460435e+000;-2.4561297894e+000;-6.4915922284e+000;-8.2491530478e+000; +5.0781250000e-001;-3.7614065409e+000;-6.3270974159e+000;-1.3534957170e+000;-6.6319772601e+000; +5.0976562500e-001;-8.0715353787e+000;-8.4484389424e+000;-3.6881619692e+000;-7.9195532203e+000; +5.1171875000e-001;-4.3244725466e+000;-3.8169497252e+000;-1.9818717241e+000;-3.9341408014e+000; +5.1367187500e-001;-3.5886716843e+000;-8.7105929852e+000;-8.0303354561e+000;-3.7031161785e+000; +5.1562500000e-001;-1.1292099953e-002;-7.4407178164e+000;-1.6321301460e+000;-3.6188846827e+000; +5.1757812500e-001;-8.2378612459e+000;-6.7851802707e+000;-6.9786676764e+000;-3.2203131914e+000; +5.1953125000e-001;-5.6508073211e+000;-9.8483230080e+000;-3.3060699701e+000;-3.1891822815e-001; +5.2148437500e-001;-8.4096804261e+000;-9.2681661248e+000;-9.7476119176e+000;-4.4645529985e+000; +5.2343750000e-001;-6.3173314929e+000;-4.4828641415e+000;-1.5787225962e+000;-1.2546157837e+000; +5.2539062500e-001;-5.5131688714e+000;-5.5101168156e+000;-5.3379926085e+000;-1.5466779470e+000; +5.2734375000e-001;-9.7595141456e+000;-6.1287271976e+000;-3.1421858072e+000;-8.6495558918e+000; +5.2929687500e-001;-4.7456282377e+000;-7.0259711146e+000;-6.9627979398e+000;-8.5085605085e+000; +5.3125000000e-001;-1.9284647703e+000;-9.5187231153e+000;-5.3691214323e+000;-5.1228371263e+000; +5.3320312500e-001;-3.0021059513e+000;-1.1600083113e+000;-8.4414184093e-001;-2.6279491186e+000; +5.3515625000e-001;-9.7720267251e+000;-9.8590044864e+000;-6.4421522617e+000;-5.3001496196e+000; +5.3710937500e-001;-9.2196404934e-001;-4.9470502138e+000;-6.2605670094e+000;-5.0267037749e+000; +5.3906250000e-001;-3.8001650572e+000;-4.9623095989e+000;-3.9262062311e+000;-7.7007354796e+000; +5.4101562500e-001;-9.0551469475e+000;-7.5777459145e+000;-3.6918240786e+000;-3.8694417477e+000; +5.4296875000e-001;-7.9964599013e+000;-1.2442398071e+000;-8.7301248312e+000;-8.5369426012e+000; +5.4492187500e-001;-2.9398483038e+000;-2.2153383493e+000;-7.7428510785e+000;-2.7719962597e+000; +5.4687500000e-001;-1.5472888947e-001;-8.8634906709e+000;-1.9211399555e+000;-7.0796838403e+000; +5.4882812500e-001;-5.3273111582e+000;-8.8155766577e+000;-9.9401837215e+000;-2.9462569952e+000; +5.5078125000e-001;-5.4957732558e+000;-8.5326699913e+000;-6.6100040078e+000;-4.4911038876e+000; +5.5273437500e-001;-4.5188754797e+000;-7.8725546598e+000;-2.2571492195e+000;-8.8290035725e-001; +5.5468750000e-001;-4.1041290760e+000;-7.7437666059e+000;-9.8336741142e+000;-8.2424390316e+000; +5.5664062500e-001;-4.6653646231e+000;-9.3646046519e+000;-4.0833765268e+000;-2.7164524794e+000; +5.5859375000e-001;-2.1845149994e+000;-1.0782188177e+000;-3.7989443541e+000;-6.1644336581e+000; +5.6054687500e-001;-5.5592516065e+000;-3.7263095379e-001;-2.0456558466e+000;-6.2440872192e-001; +5.6250000000e-001;-1.5881830454e+000;-9.9822992645e+000;-5.1734977961e+000;-4.8353528976e+000; +5.6445312500e-001;-4.4010740519e+000;-8.7890255451e+000;-3.4394383430e-001;-3.5456407070e+000; +5.6640625000e-001;-7.6445814967e+000;-3.1138032675e+000;-4.4065678120e+000;-5.5830562115e+000; +5.6835937500e-001;-1.4862513542e+000;-7.1477401257e+000;-3.3655810356e+000;-5.4600664973e+000; +5.7031250000e-001;-8.3895382285e+000;-1.2921535969e+000;-8.4432508051e+000;-1.3824886084e+000; +5.7226562500e-001;-9.9584948272e+000;-3.3082062006e+000;-6.1598560214e+000;-1.3913387060e+000; +5.7421875000e-001;-7.2573006153e-001;-9.3465986848e+000;-2.7234715223e+000;-9.7216711938e+000; +5.7617187500e-001;-7.2634220123e-002;-3.6698508263e+000;-3.2126832008e+000;-9.6069215983e+000; +5.7812500000e-001;-7.8713339567e+000;-2.2962129116e+000;-8.2399976254e+000;-4.8432886600e-001; +5.8007812500e-001;-9.5995971560e+000;-9.8931852169e+000;-7.5652332604e+000;-5.7676932216e+000; +5.8203125000e-001;-6.1186560988e+000;-6.8745994568e+000;-9.6935941651e+000;-2.6200139523e+000; +5.8398437500e-001;-5.2235481143e+000;-1.0159611702e+000;-8.0214850605e+000;-9.6063112095e+000; +5.8593750000e-001;-5.5983152986e+000;-5.1338237524e+000;-8.8244269788e+000;-4.0693378448e+000; +5.8789062500e-001;-5.3746145964e+000;-2.7463608980e+000;-4.2750328779e+000;-5.2610859275e+000; +5.8984375000e-001;-6.4369639754e+000;-6.2285226583e+000;-3.6860257387e+000;-4.0864288807e-001; +5.9179687500e-001;-7.8038880229e+000;-3.1757563353e+000;-5.1402324438e+000;-6.3991209865e+000; +5.9375000000e-001;-7.8591266274e+000;-6.0948514938e+000;-5.7850885391e+000;-6.3212987781e+000; +5.9570312500e-001;-6.7726677656e+000;-3.2270270586e+000;-1.6272467375e+000;-1.2973415852e+000; +5.9765625000e-001;-3.1495100260e+000;-7.6442763209e+000;-7.3751029372e+000;-1.8710899353e+000; +5.9960937500e-001;-8.5961484909e+000;-1.5073090792e+000;-5.4869228601e+000;-9.4482253492e+000; +6.0156250000e-001;-1.7328411341e+000;-9.9069185462e+000;-4.5445114374e+000;-6.4052248001e+000; +6.0351562500e-001;-9.2706076056e+000;-5.7417523861e+000;-3.8181704283e+000;-8.7218847871e+000; +6.0546875000e-001;-4.6855068207e+000;-7.1349224448e+000;-1.7807549238e+000;-4.5655667782e-001; +6.0742187500e-001;-2.7396464348e+000;-5.2708518505e+000;-1.7670214176e-001;-9.4576860964e+000; +6.0937500000e-001;-5.5275124311e+000;-1.8912321329e+000;-4.2350536585e+000;-4.0604877472e+000; +6.1132812500e-001;-1.7673265934e+000;-2.4109482765e-002;-1.0245060921e+000;-7.7645191550e+000; +6.1328125000e-001;-7.8768272698e+000;-3.4046447277e+000;-8.6510819197e+000;-2.1283608675e+000; +6.1523437500e-001;-4.1480755806e+000;-9.6380504593e+000;-2.1253091097e+000;-3.5706657171e+000; +6.1718750000e-001;-9.2767113447e+000;-7.6793725789e+000;-6.6322824359e+000;-7.7538377047e+000; +6.1914062500e-001;-3.8453322649e+000;-7.3824286461e-001;-1.3528853655e+000;-8.3324685693e+000; +6.2109375000e-001;-9.9301126134e+000;-2.7881711721e+000;-8.3700063825e+000;-6.2425610423e+000; +6.2304687500e-001;-8.3431501687e+000;-9.6227912232e+000;-1.0721153021e+000;-1.4877772331e+000; +6.2500000000e-001;-7.8432559967e-002;-5.4518264532e+000;-8.9403973520e+000;-1.9678336382e+000; +6.2695312500e-001;-2.5617235899e+000;-1.2472915649e+000;-3.1446272135e+000;-1.4835047722e+000; +6.2890625000e-001;-1.6403698921e+000;-8.5143589973e+000;-3.0768764019e+000;-3.1385236979e+000; +6.3085937500e-001;-5.9385967255e+000;-4.4953763485e+000;-8.0132450163e+000;-5.6123554707e-001; +6.3281250000e-001;-8.8503956795e-002;-2.9767751694e+000;-6.9005402923e+000;-7.1498763561e+000; +6.3476562500e-001;-6.5694144368e+000;-3.9466536045e+000;-4.6418666840e-001;-7.7513961494e+000; +6.3671875000e-001;-5.1429793239e+000;-9.7277748957e+000;-1.5259265900e-001;-9.0328684449e+000; +6.3867187500e-001;-5.9459212422e+000;-7.5106051564e+000;-1.7685478926e+000;-8.3767205477e+000; +6.4062500000e-001;-7.2502821684e+000;-1.9501328468e-001;-4.4138920307e+000;-8.4398937225e+000; +6.4257812500e-001;-7.3403120041e+000;-4.8094117641e+000;-3.8972139359e-001;-5.9831538796e+000; +6.4453125000e-001;-4.6363717318e+000;-5.6617939472e+000;-6.5529343486e+000;-9.1045869142e+000; +6.4648437500e-001;-6.3246560097e+000;-5.9184545279e+000;-3.3167517185e+000;-6.3600599766e-001; +6.4843750000e-001;-6.7064425349e+000;-1.0101628304e+000;-9.6935941651e+000;-3.9060640335e+000; +6.5039062500e-001;-5.6923124194e+000;-2.4323225021e-001;-8.2781456411e+000;-3.8456374407e+000; +6.5234375000e-001;-3.9329200983e+000;-7.7330851555e+000;-1.2204349041e+000;-9.7448652610e+000; +6.5429687500e-001;-1.8427073956e+000;-8.5491500795e+000;-5.7829523087e+000;-4.9971008301e+000; +6.5625000000e-001;-5.3346335888e-001;-4.6888637543e+000;-8.4917752445e+000;-5.0840786099e+000; +6.5820312500e-001;-1.2482070923e+000;-1.7883837223e-001;-6.4754173160e+000;-8.2116153836e+000; +6.6015625000e-001;-1.5988647938e+000;-7.9622791708e+000;-3.3017975092e+000;-8.9693903923e-001; +6.6210937500e-001;-9.4924771786e+000;-8.9077425748e+000;-8.1701101363e+000;-4.9436932802e+000; +6.6406250000e-001;-4.6858119965e+000;-7.0201727748e+000;-9.4805749506e+000;-6.5758231282e+000; +6.6601562500e-001;-3.6194980145e-001;-3.3365887403e+000;-6.9301432371e+000;-5.1139867306e+000; +6.6796875000e-001;-9.3356132507e-001;-6.9203773141e+000;-8.0623798072e+000;-9.9438459426e+000; +6.6992187500e-001;-7.3003327847e+000;-7.8737735748e-002;-6.3557848334e+000;-6.8803980947e+000; +6.7187500000e-001;-6.3063448668e+000;-9.3490401655e+000;-5.0022888184e+000;-8.5180211067e+000; +6.7382812500e-001;-2.9264199734e+000;-8.8814966381e+000;-7.6876124740e+000;-1.0904264450e+000; +6.7578125000e-001;-3.2880640030e+000;-2.5180822611e+000;-1.1441391706e+000;-1.4291816950e+000; +6.7773437500e-001;-3.1223487854e+000;-7.1156957746e+000;-9.0734580159e+000;-9.7058015689e+000; +6.7968750000e-001;-1.0998868942e+000;-5.1646474004e+000;-6.8791770935e+000;-1.6116827726e+000; +6.8164062500e-001;-9.0087588131e+000;-5.4008606076e+000;-4.2152166367e+000;-6.8459120393e+000; +6.8359375000e-001;-1.9119846821e+000;-6.8208867311e+000;-8.3492538333e+000;-9.8156682029e+000; +6.8554687500e-001;-1.8539994955e+000;-5.3419598937e+000;-7.3100987077e+000;-5.3053376079e+000; +6.8750000000e-001;-9.3954283372e+000;-9.5208593830e+000;-4.0800195932e+000;-8.2470168173e+000; +6.8945312500e-001;-9.1821039468e+000;-8.8445692509e+000;-2.7634507418e+000;-2.9197055101e+000; +6.9140625000e-001;-7.4465164542e+000;-5.6859034300e+000;-8.4792627394e+000;-7.3870050907e+000; +6.9335937500e-001;-3.3979308605e+000;-4.9674975872e+000;-9.0212702751e-001;-4.0217292309e+000; +6.9531250000e-001;-7.4529251456e+000;-9.9752800073e+000;-5.3196814656e+000;-2.5272375345e+000; +6.9726562500e-001;-2.1225625277e+000;-4.5823544264e+000;-8.2094788551e-001;-1.2173831463e+000; +6.9921875000e-001;-4.9201941490e+000;-2.3047578335e+000;-1.6135138273e+000;-9.2117068917e+000; +7.0117187500e-001;-9.1775261611e+000;-8.2015442848e+000;-1.6672259569e+000;-7.9812006652e+000; +7.0312500000e-001;-4.2426830530e+000;-7.2304451466e+000;-6.2483596802e+000;-3.5786002874e+000; +7.0507812500e-001;-3.1788080931e+000;-3.2535785437e+000;-7.1718496084e+000;-5.5854976177e+000; +7.0703125000e-001;-6.0484632850e+000;-1.0538041592e+000;-8.7282937765e+000;-4.6156191826e+000; +7.0898437500e-001;-7.1813103557e+000;-9.4433423877e+000;-1.1017179489e+000;-3.0231636763e+000; +7.1093750000e-001;-3.2352674007e+000;-5.7060456276e+000;-7.7806939185e+000;-4.3589586020e+000; +7.1289062500e-001;-5.6846827269e+000;-7.2203740478e+000;-6.5651416779e+000;-6.5193641186e+000; +7.1484375000e-001;-4.5918148756e+000;-2.9862362146e+000;-8.0895413458e+000;-9.0008240193e+000; +7.1679687500e-001;-9.8318430036e+000;-6.1143833399e+000;-1.8601030111e+000;-7.2719505429e+000; +7.1875000000e-001;-1.0458695889e+000;-6.3942381740e+000;-4.5829647779e+000;-2.5049591064e+000; +7.2070312500e-001;-3.1482893229e+000;-8.7347026169e+000;-2.1066927910e+000;-8.8198781013e-002; +7.2265625000e-001;-4.9638354778e+000;-6.5645337105e-001;-4.0659809113e+000;-2.2208321095e+000; +7.2460937500e-001;-4.0794092417e+000;-7.6158940792e+000;-4.7788935900e+000;-1.9818717241e+000; +7.2656250000e-001;-1.2527847290e+000;-4.8960846663e+000;-7.3274940252e+000;-6.8056276441e+000; +7.2851562500e-001;-6.5489670634e+000;-4.5811337233e+000;-7.2460097075e+000;-7.2655415535e+000; +7.3046875000e-001;-4.0845972300e+000;-7.9445783794e+000;-4.9186682701e+000;-4.3409526348e+000; +7.3242187500e-001;-4.5896786451e+000;-4.6082949638e+000;-4.2481768131e+000;-3.0085146427e+000; +7.3437500000e-001;-8.5851618648e+000;-7.3299357295e+000;-3.1586647034e-001;-6.5459150076e+000; +7.3632812500e-001;-5.2308738232e-001;-7.1062350273e+000;-1.6476941109e+000;-4.6433913708e+000; +7.3828125000e-001;-6.5742972493e+000;-7.1718513966e-001;-8.9339884371e+000;-7.2374644876e+000; +7.4023437500e-001;-6.9112217426e+000;-5.7747122645e+000;-8.5699026287e+000;-4.7563099861e+000; +7.4218750000e-001;-3.1684315205e+000;-3.7937557697e+000;-4.1679126024e+000;-3.4098333120e+000; +7.4414062500e-001;-9.3746757507e+000;-2.5699639320e+000;-1.8890959024e+000;-7.4758142233e+000; +7.4609375000e-001;-4.7456264496e-001;-5.5195775628e+000;-6.0811182857e+000;-9.2266609520e+000; +7.4804687500e-001;-9.0612506121e+000;-4.9928307533e-001;-3.7284463644e+000;-5.0450149179e+000; +7.5000000000e-001;-6.3142776489e-001;-3.2828760147e+000;-1.6864526272e+000;-4.7660756111e+000; +7.5195312500e-001;-9.7964406013e-001;-8.2992035151e+000;-5.9199804068e+000;-4.5725882053e+000; +7.5390625000e-001;-4.9061554670e+000;-4.4718772173e+000;-4.5716702938e-001;-8.1719413400e+000; +7.5585937500e-001;-4.3339335918e+000;-9.0331736207e+000;-2.5019073486e+000;-6.3100069761e+000; +7.5781250000e-001;-9.0758994967e+000;-8.8045895100e-001;-2.2946864367e+000;-6.1088901758e+000; +7.5976562500e-001;-8.3712279797e-001;-9.4341868162e+000;-1.4484083652e+000;-6.0093995929e+000; +7.6171875000e-001;-7.4010437727e+000;-4.4215214252e+000;-4.4502091408e+000;-7.6021607220e+000; +7.6367187500e-001;-7.7355265617e+000;-3.7113559246e+000;-8.7710201740e-001;-6.3887447119e+000; +7.6562500000e-001;-4.9421674013e+000;-9.4964445755e+000;-9.8364207894e+000;-1.9946897030e+000; +7.6757812500e-001;-8.8341929018e+000;-6.9438764453e+000;-9.6301156655e+000;-6.2935268879e+000; +7.6953125000e-001;-5.1979124546e+000;-7.8948332369e+000;-1.0629594326e+000;-3.9970093966e+000; +7.7148437500e-001;-3.2618182898e+000;-7.0598468184e+000;-6.8456068635e+000;-2.2360908985e+000; +7.7343750000e-001;-8.7789544463e+000;-2.8147220612e+000;-6.6789758205e+000;-9.0221869200e+000; +7.7539062500e-001;-4.5710623264e+000;-2.8952908516e+000;-8.3553574979e+000;-2.5006866455e+000; +7.7734375000e-001;-7.5655400753e-001;-4.3314921856e+000;-6.6365551949e+000;-5.2095115185e-001; +7.7929687500e-001;-4.7395247221e+000;-8.8409069926e+000;-6.3405254483e+000;-6.1919003725e+000; +7.8125000000e-001;-4.8982203007e-001;-2.3041474819e+000;-5.1530504227e+000;-9.6783348918e+000; +7.8320312500e-001;-9.1909543425e+000;-5.6126591563e+000;-5.2403333783e+000;-3.6472672224e+000; +7.8515625000e-001;-3.0881679058e+000;-5.5711537600e+000;-9.5110934600e+000;-5.6871241331e+000; +7.8710937500e-001;-2.8266245127e+000;-8.1011383235e+000;-5.7817316055e+000;-1.0315257311e+000; +7.8906250000e-001;-2.7771592140e-002;-2.1283608675e+000;-6.6789758205e+000;-5.6889554858e+000; +7.9101562500e-001;-2.0490127802e+000;-3.6939603090e+000;-8.9852595329e+000;-9.3945127726e+000; +7.9296875000e-001;-1.4822840691e+000;-7.5511947274e+000;-9.6935941651e+000;-9.9276721478e-001; +7.9492187500e-001;-2.5769829750e+000;-6.8279060721e+000;-1.8228703737e+000;-5.8116397262e+000; +7.9687500000e-001;-8.4575945139e+000;-1.9275492430e+000;-6.2706381083e+000;-4.2374950647e+000; +7.9882812500e-001;-6.2761315703e+000;-6.4168217778e+000;-4.6235543489e+000;-1.4160573483e-001; +8.0078125000e-001;-2.5785088539e+000;-2.8452408314e+000;-6.8639180064e+000;-4.3964964151e+000; +8.0273437500e-001;-9.8239064217e-001;-1.0840177536e+000;-6.0835596919e+000;-4.1914123297e+000; +8.0468750000e-001;-9.0762047470e+000;-7.1599474549e+000;-2.0923489332e+000;-6.7424541712e+000; +8.0664062500e-001;-4.1615039110e+000;-1.4651936293e+000;-3.5935544968e+000;-9.4409009069e+000; +8.0859375000e-001;-7.9616688192e+000;-1.2286752462e+000;-3.9088106155e+000;-6.8196660280e+000; +8.1054687500e-001;-2.9331338406e+000;-8.0639056861e+000;-3.2959991693e+000;-3.6762595177e+000; +8.1250000000e-001;-4.8817408085e+000;-7.8325754404e+000;-2.8534805775e+000;-2.6187932491e+000; +8.1445312500e-001;-4.6742147207e+000;-6.3301491737e+000;-9.3325602263e+000;-3.1614124775e+000; +8.1640625000e-001;-3.8630330563e+000;-4.7166353464e+000;-8.8546403497e+000;-5.3370770812e+000; +8.1835937500e-001;-9.2150638998e+000;-7.1611681581e+000;-3.2810449600e+000;-7.8948332369e+000; +8.2031250000e-001;-3.5511338711e+000;-4.2866295576e+000;-6.4189580083e+000;-6.4882349968e+000; +8.2226562500e-001;-6.9322794676e+000;-2.7204197645e+000;-6.5654468536e+000;-6.3451033831e+000; +8.2421875000e-001;-9.9291970581e+000;-3.4211248159e+000;-6.0057374835e+000;-1.5472882986e+000; +8.2617187500e-001;-9.5892208442e+000;-2.0090335608e+000;-7.3671680689e+000;-1.5686511993e+000; +8.2812500000e-001;-5.4423657060e+000;-3.0860316753e+000;-1.2717062235e+000;-9.7820978425e+000; +8.3007812500e-001;-6.0246589780e+000;-7.5994139910e+000;-9.4827112556e+000;-9.8260444961e+000; +8.3203125000e-001;-6.9292277098e+000;-1.0278636217e+000;-8.4014405310e+000;-2.0929592848e+000; +8.3398437500e-001;-3.5706758499e-002;-4.2362743616e+000;-6.0167241096e+000;-3.7437057495e+000; +8.3593750000e-001;-6.9307535887e+000;-5.9300515056e+000;-9.9829096347e+000;-1.4883875847e+000; +8.3789062500e-001;-1.5698719025e+000;-6.4879298210e+000;-2.8675192595e+000;-1.0086369514e+000; +8.3984375000e-001;-4.7718739510e+000;-4.1126745939e+000;-9.2056032270e+000;-6.6493728757e+000; +8.4179687500e-001;-9.5345927402e+000;-9.6966460161e+000;-2.1924495697e+000;-4.7254860401e+000; +8.4375000000e-001;-9.9594103824e+000;-3.5132908821e+000;-1.2949001789e+000;-7.6967680454e+000; +8.4570312500e-001;-6.0948514938e+000;-7.5319682062e+000;-2.5946837664e+000;-5.6065553427e+000; +8.4765625000e-001;-5.8153018355e+000;-2.5492113829e+000;-9.4811853394e+000;-1.1386454105e+000; +8.4960937500e-001;-6.2022766471e+000;-8.3223998547e-001;-1.6473889351e+000;-2.5614184141e+000; +8.5156250000e-001;-9.6047852933e+000;-7.3110142350e+000;-6.1293375492e+000;-1.8189030886e+000; +8.5351562500e-001;-1.0815757513e+000;-4.8939484358e+000;-6.3661611080e+000;-5.7200843096e+000; +8.5546875000e-001;-4.6998500824e-001;-3.0838954449e+000;-9.7305215523e+000;-7.2426527739e+000; +8.5742187500e-001;-9.2315439135e+000;-4.7062593699e+000;-7.0485550165e+000;-3.2578510046e+000; +8.5937500000e-001;-2.0172733068e+000;-9.2367320508e+000;-8.9596240222e+000;-7.6870021224e+000; +8.6132812500e-001;-1.9043552876e+000;-8.5326699913e+000;-8.3339945972e+000;-9.3044831604e+000; +8.6328125000e-001;-6.1449018121e+000;-3.7464523315e+000;-9.7775200568e+000;-7.7504806221e+000; +8.6523437500e-001;-8.0568850040e-001;-8.5122226179e+000;-7.0833459496e+000;-3.4797203541e+000; +8.6718750000e-001;-2.4158453941e+000;-8.8570818305e+000;-4.2463451624e+000;-5.2027955651e+000; +8.6914062500e-001;-2.5879698992e+000;-1.3046664000e+000;-8.5473188758e+000;-1.9595932961e+000; +8.7109375000e-001;-6.7162084579e+000;-6.2920010090e+000;-4.1767632961e+000;-4.9385052919e+000; +8.7304687500e-001;-6.4384898543e+000;-1.0037535429e+000;-8.9815973490e+000;-4.1673022509e+000; +8.7500000000e-001;-3.2389295101e+000;-4.2625200748e+000;-8.6748863757e+000;-2.8995633125e+000; +8.7695312500e-001;-6.9844660163e+000;-9.6563615650e+000;-9.7198400833e+000;-5.4048278928e+000; +8.7890625000e-001;-4.1615039110e+000;-6.2633135915e+000;-3.5148167610e+000;-8.7264625728e+000; +8.8085937500e-001;-8.5094760358e+000;-9.8199407943e+000;-3.7083041668e+000;-9.2449720949e+000; +8.8281250000e-001;-9.4729453325e+000;-8.7878047675e+000;-6.2865078449e+000;-2.2589802742e+000; +8.8476562500e-001;-4.6256905794e+000;-8.6605426669e+000;-3.9033174515e-001;-6.4439833164e+000; +8.8671875000e-001;-9.8483230080e+000;-6.6481521726e+000;-3.6240732670e+000;-8.3916746080e+000; +8.8867187500e-001;-2.7072972059e+000;-1.0635697842e+000;-9.1058076918e+000;-1.4896082878e+000; +8.9062500000e-001;-1.8366038799e+000;-4.0940582752e+000;-6.6487625241e+000;-3.0338448286e+000; +8.9257812500e-001;-6.4690083265e+000;-6.9386884570e+000;-8.4487441182e+000;-7.9018524289e+000; +8.9453125000e-001;-6.0853907466e+000;-5.2977079153e+000;-5.5867183208e+000;-3.7470626831e+000; +8.9648437500e-001;-2.9715871811e+000;-6.4418470860e+000;-4.0839868784e+000;-3.0146181583e+000; +8.9843750000e-001;-1.2845242023e+000;-8.6461989582e+000;-1.2854397297e+000;-5.3523361683e+000; +9.0039062500e-001;-5.9001433849e+000;-7.2164067626e+000;-9.3203528225e+000;-1.2622457743e+000; +9.0234375000e-001;-8.9806817472e+000;-4.6736043692e+000;-8.1402020156e+000;-9.7293008119e+000; +9.0429687500e-001;-7.1858882904e+000;-1.6504412889e+000;-2.3850214481e+000;-5.8421581984e+000; +9.0625000000e-001;-5.4750204086e-001;-1.1145359278e+000;-4.1032135487e+000;-7.6546525955e+000; +9.0820312500e-001;-5.7924151421e-001;-1.2109744549e+000;-8.8839352131e-001;-2.6853233576e+000; +9.1015625000e-001;-2.9889827967e+000;-1.4352852106e+000;-3.8196969032e+000;-8.4200567007e+000; +9.1210937500e-001;-4.6754354239e+000;-6.2779626250e+000;-2.8449356556e+000;-7.0403149724e+000; +9.1406250000e-001;-8.5772271454e+000;-9.0374462306e+000;-4.2719811201e+000;-3.7900936604e+000; +9.1601562500e-001;-7.8655354679e+000;-2.3996704817e+000;-3.6075931787e+000;-4.6052455902e-001; +9.1796875000e-001;-8.3919797838e+000;-1.8866544962e+000;-2.3728138208e+000;-4.3427824974e-001; +9.1992187500e-001;-2.5208288431e+000;-6.2123477459e+000;-7.8942228854e+000;-3.3158361912e+000; +9.2187500000e-001;-5.3584399819e+000;-5.3501999378e+000;-4.4761496782e+000;-2.9880672693e+000; +9.2382812500e-001;-9.1268654168e+000;-5.1716667414e+000;-4.4975125790e+000;-3.8499099016e+000; +9.2578125000e-001;-2.1167635918e+000;-8.2644124329e+000;-2.5183874369e+000;-2.1430099010e+000; +9.2773437500e-001;-1.8491166830e+000;-3.5276347399e+000;-7.0378735662e+000;-8.0898465216e+000; +9.2968750000e-001;-6.7824336886e+000;-2.4787133932e+000;-4.2234563828e+000;-2.3844110966e+000; +9.3164062500e-001;-3.8734090328e+000;-1.3077181578e+000;-5.9688100219e+000;-4.2512285709e+000; +9.3359375000e-001;-9.0829187632e+000;-3.0524611473e+000;-9.2281869054e+000;-5.9269997478e+000; +9.3554687500e-001;-2.5458538532e+000;-2.2882777452e+000;-3.7531661987e+000;-9.4875942171e+000; +9.3750000000e-001;-6.7976927757e+000;-3.6671042442e+000;-2.4384260178e-001;-6.7018646002e+000; +9.3945312500e-001;-4.6284371614e+000;-4.9961853027e+000;-3.8004702330e+000;-8.0211798847e+000; +9.4140625000e-001;-5.6450086832e+000;-8.9562669396e+000;-4.2820519209e+000;-8.1835383177e+000; +9.4335937500e-001;-2.6865446568e+000;-7.4785608053e+000;-4.2527544498e+000;-8.2888245583e-001; +9.4531250000e-001;-5.4341256618e+000;-2.9770803452e+000;-4.9043238163e-001;-2.0154422522e+000; +9.4726562500e-001;-8.1371501088e+000;-1.4725178480e+000;-7.1425518394e+000;-5.2430808544e-001; +9.4921875000e-001;-4.5020908117e+000;-1.4453566074e+000;-4.6494948864e+000;-5.4783776402e+000; +9.5117187500e-001;-5.0584429502e+000;-8.8433484733e+000;-4.0617084503e+000;-4.1199988127e+000; +9.5312500000e-001;-2.1942794323e-001;-8.6135441065e+000;-2.0606100559e+000;-7.8444777429e+000; +9.5507812500e-001;-1.8863493204e+000;-6.6801965237e+000;-8.2473219931e+000;-2.2391432524e+000; +9.5703125000e-001;-7.5106051564e+000;-5.5470442772e+000;-7.4629962444e+000;-3.8026064634e+000; +9.5898437500e-001;-7.5377666950e+000;-9.1454817355e+000;-6.5163120627e+000;-5.5177465081e+000; +9.6093750000e-001;-5.4344308376e+000;-4.5564132929e+000;-4.1807305813e+000;-4.2075866461e+000; +9.6289062500e-001;-6.7802971601e+000;-4.2991423607e+000;-6.9322794676e+000;-2.4796289206e+000; +9.6484375000e-001;-5.7271033525e+000;-8.3584094048e+000;-5.7841730118e+000;-2.1039462090e+000; +9.6679687500e-001;-6.6164135933e-001;-7.6717428863e+000;-9.8870815150e+000;-2.5101476908e+000; +9.6875000000e-001;-3.3484905958e+000;-6.2025818229e+000;-4.6708577871e+000;-6.4546644688e-001; +9.7070312500e-001;-9.3627735227e+000;-3.3689379692e+000;-6.8410292268e+000;-1.6019165516e+000; +9.7265625000e-001;-4.4532608986e+000;-2.0728170872e+000;-2.3703724146e+000;-7.3747977614e+000; +9.7460937500e-001;-8.7145604193e+000;-4.9067658186e+000;-9.8431348614e+000;-4.9366742373e+000; +9.7656250000e-001;-5.5384990573e+000;-5.9013640881e+000;-9.7009186074e+000;-1.9531846046e-001; +9.7851562500e-001;-6.6194647551e+000;-4.3000578880e-001;-4.9281287193e+000;-7.8356273472e+000; +9.8046875000e-001;-2.5913268328e+000;-1.3031405210e+000;-4.9653613567e+000;-7.9116183519e+000; +9.8242187500e-001;-4.1444122791e-001;-9.3148594350e+000;-2.3282569647e+000;-3.9548933506e+000; +9.8437500000e-001;-4.5744192600e+000;-6.3621935248e+000;-8.9150670171e+000;-6.2343209982e+000; +9.8632812500e-001;-9.6615497395e+000;-8.0535294116e+000;-4.8332160711e+000;-5.4972991347e+000; +9.8828125000e-001;-5.3379926085e+000;-1.2421035767e+000;-9.9313333537e+000;-2.4176764488e+000; +9.9023437500e-001;-9.5822016150e+000;-1.5994751453e+000;-1.4157533646e+000;-3.4907072783e+000; +9.9218750000e-001;-5.7686087489e+000;-1.6190069914e+000;-5.6175419688e+000;-1.8817710876e+000; +9.9414062500e-001;-7.2362437844e+000;-6.9246470928e-001;-5.0773644447e+000;-5.5342265964e+000; +9.9609375000e-001;-7.4050110579e+000;-3.8547927141e+000;-1.4065980911e+000;-2.1286660433e+000; +9.9804687500e-001;-4.2243719101e+000;-4.8860132694e+000;-5.8046221733e-001;-2.6047545671e+000; diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-spectrum.csv b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-spectrum.csv new file mode 100755 index 0000000..e25ac77 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-spectrum.csv @@ -0,0 +1,772 @@ +Time (s);C3;C4;FC3;FC4;C5;C1;C2;C6;CP3;CP4;Min frequency band;Max frequency band +1.0000000000e+000;2.1637637249e+004;2.2618968079e+004;2.0794994164e+004;2.0185783313e+004;2.0957414730e+004;1.9687758286e+004;1.6334801590e+004;2.2313789109e+004;1.9512542714e+004;1.6058016092e+004;0.0000000000e+000;1.0000000000e+000 +1.0000000000e+000;6.7865805914e+003;7.0238382215e+003;6.0674198714e+003;5.0294492944e+003;6.8228295345e+003;5.3673000833e+003;3.4212717480e+003;6.6932254598e+003;5.7310266190e+003;3.5946833738e+003;1.0000000000e+000;2.0000000000e+000 +1.0000000000e+000;6.9565568853e+003;7.1166963471e+003;7.7924082812e+003;8.1423663252e+003;6.1473389768e+003;7.8826217110e+003;7.5273534987e+003;6.5862578155e+003;6.3378600194e+003;6.4643408714e+003;2.0000000000e+000;3.0000000000e+000 +1.0000000000e+000;1.6105310494e+003;1.2168381404e+003;2.1618795155e+003;1.7515296222e+003;1.4044527128e+003;1.5729139643e+003;1.3730693235e+003;9.7296207347e+002;1.0953074925e+003;7.6693360292e+002;3.0000000000e+000;4.0000000000e+000 +1.0000000000e+000;4.3654952723e+003;3.9376793068e+003;4.8644515946e+003;4.3347555052e+003;4.4032023436e+003;4.0753594585e+003;3.9119382134e+003;3.9005552400e+003;3.9181734254e+003;3.4995472158e+003;4.0000000000e+000;5.0000000000e+000 +1.0000000000e+000;1.8685231434e+003;2.0942364978e+003;1.7280624050e+003;2.1148371941e+003;1.6516233279e+003;2.2514730507e+003;2.2106853630e+003;1.7455573916e+003;2.0555647783e+003;2.4031527171e+003;5.0000000000e+000;6.0000000000e+000 +1.0000000000e+000;5.2702289127e+002;2.5249701391e+002;4.2415145212e+002;3.0587697048e+002;7.4420201741e+002;3.0114420429e+002;2.8445327817e+002;4.3380765902e+002;6.8070193046e+002;3.2990873411e+002;6.0000000000e+000;7.0000000000e+000 +1.0000000000e+000;1.8538128737e+003;1.3687818733e+003;2.1503995031e+003;1.4641050757e+003;1.9044051999e+003;1.6376519414e+003;1.3510032267e+003;1.4806809620e+003;1.6776074817e+003;1.0467528374e+003;7.0000000000e+000;8.0000000000e+000 +1.0000000000e+000;8.7529123054e+002;1.0578329050e+003;9.3056959701e+002;1.1518958644e+003;8.3074053163e+002;1.0926725992e+003;1.1267215132e+003;9.9399408688e+002;8.5121947984e+002;9.0211262127e+002;8.0000000000e+000;9.0000000000e+000 +1.0000000000e+000;9.8946886541e+002;9.7238551761e+002;9.3055985815e+002;9.0024928950e+002;8.7494978923e+002;1.2144350744e+003;1.1135156554e+003;7.4430955173e+002;1.0316594662e+003;1.0574874435e+003;9.0000000000e+000;1.0000000000e+001 +1.0000000000e+000;8.3398916579e+002;8.2921747447e+002;9.4164780340e+002;6.5662300496e+002;7.7901166044e+002;8.0152102226e+002;7.5157229500e+002;8.2664873902e+002;4.7671466061e+002;7.2514283493e+002;1.0000000000e+001;1.1000000000e+001 +1.0000000000e+000;1.0193391773e+003;6.3153468169e+002;1.0426343772e+003;8.5748354417e+002;1.4876664140e+003;8.0048614132e+002;7.8803832919e+002;4.5448342341e+002;1.1300225313e+003;3.4423792085e+002;1.1000000000e+001;1.2000000000e+001 +1.0000000000e+000;1.4600349010e+003;1.5722131066e+003;1.3650297547e+003;1.4906534553e+003;1.6906022826e+003;1.2801801010e+003;1.4297799560e+003;1.5811205691e+003;1.5326721241e+003;1.5919176435e+003;1.2000000000e+001;1.3000000000e+001 +1.0000000000e+000;7.5191892152e+002;5.9152729620e+002;9.0597651995e+002;6.6990080029e+002;6.6833131845e+002;7.4292333272e+002;6.9144328521e+002;6.5990881624e+002;4.7910038913e+002;6.5042122857e+002;1.3000000000e+001;1.4000000000e+001 +1.0000000000e+000;1.2031176124e+003;1.5671908632e+003;1.0758818553e+003;1.5052282528e+003;1.0548282978e+003;1.3328343707e+003;1.5189066710e+003;1.5385751403e+003;1.1618782228e+003;1.6025324134e+003;1.4000000000e+001;1.5000000000e+001 +1.0000000000e+000;9.1142046596e+002;9.4811405613e+002;9.7851797409e+002;9.4862253213e+002;9.1952669779e+002;8.5797615751e+002;9.0321039338e+002;9.6669864499e+002;7.1899165339e+002;8.6416245877e+002;1.5000000000e+001;1.6000000000e+001 +1.0000000000e+000;9.6074496605e+002;4.1914001895e+002;9.9631560191e+002;5.8006848661e+002;1.0258216385e+003;6.6654184140e+002;4.7977640780e+002;5.0598519500e+002;1.0312551380e+003;2.7162404962e+002;1.6000000000e+001;1.7000000000e+001 +1.0000000000e+000;1.0637752553e+003;9.8642526963e+002;9.8611575772e+002;1.0645953500e+003;1.0480216529e+003;9.9349499095e+002;1.0758256211e+003;7.4717897655e+002;1.1892474425e+003;1.1038056555e+003;1.7000000000e+001;1.8000000000e+001 +1.0000000000e+000;5.8151627203e+002;6.3039242596e+002;4.1010183647e+002;8.5111807435e+002;6.0287020183e+002;4.8552317309e+002;5.3473954709e+002;5.3519959403e+002;7.3185383865e+002;5.1087191094e+002;1.8000000000e+001;1.9000000000e+001 +1.0000000000e+000;1.5364728778e+002;2.2326487239e+002;1.1429811239e+002;3.7376600436e+002;3.2572274109e+002;2.2333838138e+002;2.4646338526e+002;3.1135350780e+002;1.6745157223e+002;1.9996113951e+002;1.9000000000e+001;2.0000000000e+001 +1.0000000000e+000;2.1245810296e+002;2.2113731352e+002;3.5416283476e+002;1.9872431475e+002;4.2979360593e+002;2.4532275004e+001;2.2654371305e+002;9.5242102441e+001;1.5208677729e+002;2.6612685649e+002;2.0000000000e+001;2.1000000000e+001 +1.0000000000e+000;4.6610393589e+002;2.4887900947e+002;4.1788610688e+002;2.1970514327e+002;8.7209762463e+002;1.9296580245e+002;1.7489712664e+002;6.0939865935e+002;3.9106256992e+002;1.6610258819e+002;2.1000000000e+001;2.2000000000e+001 +1.0000000000e+000;6.2336998917e+002;9.6905798591e+002;4.7988303740e+002;8.6689272478e+002;1.1278895189e+003;3.9512481616e+002;5.8207953319e+002;1.5001850897e+003;7.3495408698e+002;9.6232841749e+002;2.2000000000e+001;2.3000000000e+001 +1.0000000000e+000;8.8787277949e+002;8.8400255687e+002;7.9723493890e+002;6.4847706052e+002;1.0384805377e+003;7.7915358865e+002;7.6147057615e+002;1.1920160019e+003;8.8508053475e+002;9.6377547287e+002;2.3000000000e+001;2.4000000000e+001 +1.0000000000e+000;3.8521415846e+002;3.3780341972e+002;3.3469394657e+002;2.9587620598e+002;6.0725489284e+002;1.0093318168e+002;2.3290897351e+002;4.0792924842e+002;4.5747416482e+002;4.6198341932e+002;2.4000000000e+001;2.5000000000e+001 +1.0000000000e+000;4.0053533476e+002;4.1656031813e+002;4.8050525559e+002;3.6247202749e+002;4.5459871617e+002;4.7989072602e+002;4.2330889809e+002;3.8550171759e+002;3.7062179211e+002;4.6125251682e+002;2.5000000000e+001;2.6000000000e+001 +1.0000000000e+000;2.4798492597e+002;6.2028886391e+002;2.2552401517e+002;5.7849506134e+002;3.9073871667e+002;1.6642413431e+002;4.1023611340e+002;6.6137692925e+002;2.9719421998e+002;5.4502896875e+002;2.6000000000e+001;2.7000000000e+001 +1.0000000000e+000;7.0664466431e+002;5.1226560663e+002;6.8777707340e+002;4.8152316067e+002;7.2659604570e+002;7.0915914673e+002;5.3894270400e+002;6.0742832854e+002;7.0548806431e+002;5.5962909735e+002;2.7000000000e+001;2.8000000000e+001 +1.0000000000e+000;5.0916768098e+002;6.1999624065e+002;5.1893670200e+002;5.0482175134e+002;5.5453786854e+002;5.8102423846e+002;6.0938811251e+002;6.3898886019e+002;4.8392247895e+002;6.0215286668e+002;2.8000000000e+001;2.9000000000e+001 +1.0000000000e+000;1.6091302185e+002;4.9628240115e+002;2.7873174401e+002;4.7279371412e+002;1.8987258395e+002;3.4418738781e+002;4.0318369824e+002;6.9176282001e+002;9.7082755290e+001;4.2716578793e+002;2.9000000000e+001;3.0000000000e+001 +1.0000000000e+000;9.0120202869e+002;5.2757045069e+002;8.4526468310e+002;5.6278709609e+002;9.3601376143e+002;7.6700048625e+002;6.1332616916e+002;4.5918219920e+002;8.2430989611e+002;4.7031434138e+002;3.0000000000e+001;3.1000000000e+001 +1.0000000000e+000;4.7043570396e+002;3.6121073362e+002;4.4185817218e+002;3.5531634337e+002;4.3682229852e+002;3.4314308485e+002;3.7598833461e+002;4.6381080363e+002;4.6077510669e+002;3.9763012616e+002;3.1000000000e+001;3.2000000000e+001 +1.0000000000e+000;4.3206766497e+002;3.5840858366e+002;4.1117987794e+002;3.2332995336e+002;6.4253847741e+002;3.8193993396e+002;4.0377784041e+002;2.5441059791e+002;5.0161323382e+002;4.4789983238e+002;3.2000000000e+001;3.3000000000e+001 +1.0000000000e+000;1.3514856779e+002;2.9712534907e+002;2.0375828035e+002;2.6870688519e+002;2.4041609987e+002;3.0553770020e+002;3.4766937462e+002;2.1317911820e+002;1.7414654521e+002;3.7474772685e+002;3.3000000000e+001;3.4000000000e+001 +1.0000000000e+000;6.1445617330e+002;6.0813720312e+002;6.3298681212e+002;5.7006601975e+002;6.3766040615e+002;5.6861223776e+002;5.6409206814e+002;6.6126452029e+002;4.8600312052e+002;5.2403953410e+002;3.4000000000e+001;3.5000000000e+001 +1.0000000000e+000;4.8153039172e+002;3.7057706389e+002;3.1746582028e+002;3.4039350781e+002;7.5775610066e+002;4.7972004490e+002;4.5068181249e+002;3.6692898447e+002;5.7158402929e+002;4.1260102014e+002;3.5000000000e+001;3.6000000000e+001 +1.0000000000e+000;3.4232412405e+002;1.9196723527e+001;3.2636050367e+002;6.8100957559e+001;4.1516224298e+002;3.7577023640e+002;2.6315289168e+002;3.1606452981e+002;3.2297023847e+002;8.3824088494e+001;3.6000000000e+001;3.7000000000e+001 +1.0000000000e+000;1.3453270468e+002;1.4320386314e+002;3.8478847555e+001;1.8977007272e+002;2.8063672007e+002;1.2067695449e+002;2.5691015147e+002;1.6226566825e+002;2.1980274927e+002;2.0420729176e+002;3.7000000000e+001;3.8000000000e+001 +1.0000000000e+000;4.8797605401e+002;4.6970530046e+002;5.1369188855e+002;4.9008237787e+002;3.0800298358e+002;5.5756994033e+002;5.3451929052e+002;3.4326320854e+002;5.5341419813e+002;4.6469899398e+002;3.8000000000e+001;3.9000000000e+001 +1.0000000000e+000;2.1126838737e+002;2.5448623378e+002;2.4478401981e+002;2.2941367904e+002;2.4139299876e+002;2.0177688450e+002;2.4237685871e+002;2.9820211573e+002;2.0645431992e+002;3.4970615930e+002;3.9000000000e+001;4.0000000000e+001 +1.0000000000e+000;2.8026221451e+002;6.4054128833e+002;3.1102142105e+002;5.7613330115e+002;1.3921645629e+002;3.9002121616e+002;5.2505227608e+002;7.6659656145e+002;2.9292555257e+002;5.8014917023e+002;4.0000000000e+001;4.1000000000e+001 +1.0000000000e+000;6.0891131940e+002;7.8219817203e+002;6.1316890600e+002;6.8853604689e+002;5.9627843229e+002;5.5480493080e+002;6.6021902648e+002;9.3158379996e+002;5.8252540968e+002;7.1708275785e+002;4.1000000000e+001;4.2000000000e+001 +1.0000000000e+000;7.4297816302e+002;6.5983266845e+002;6.4189361337e+002;5.6547378517e+002;1.0126107701e+003;5.4089075525e+002;5.6653613431e+002;7.6187039104e+002;6.8879825833e+002;6.3231801177e+002;4.2000000000e+001;4.3000000000e+001 +1.0000000000e+000;8.5415495233e+002;6.2906359808e+002;7.4384004201e+002;5.4287444236e+002;1.1619987672e+003;6.1714268187e+002;5.3574843134e+002;7.8647807985e+002;9.5105563840e+002;6.4377213725e+002;4.3000000000e+001;4.4000000000e+001 +1.0000000000e+000;9.4248554439e+002;6.0736111421e+002;8.0312989343e+002;5.3450022422e+002;1.4583922432e+003;6.0622577972e+002;5.1431314540e+002;6.4479178006e+002;9.7896580336e+002;6.5890080375e+002;4.4000000000e+001;4.5000000000e+001 +1.0000000000e+000;1.9382013151e+002;4.2572452964e+002;2.1228083105e+002;2.8335195672e+002;4.0045476060e+002;1.6923485080e+002;2.0898688638e+002;7.3937462677e+002;1.7905219054e+002;4.7389155955e+002;4.5000000000e+001;4.6000000000e+001 +1.0000000000e+000;2.4494050151e+002;1.8479483001e+002;2.5176966132e+002;1.4428186639e+002;5.3841484529e+002;1.7132366929e+002;8.1617152325e+001;4.3688083214e+002;2.7573796171e+002;1.3340723386e+002;4.6000000000e+001;4.7000000000e+001 +1.0000000000e+000;4.5083501602e+002;2.4109239356e+002;5.0934643072e+002;3.0192550891e+002;4.4964706552e+002;3.9989831504e+002;3.5453827187e+002;1.3805396287e+002;4.7520202108e+002;2.2967744916e+002;4.7000000000e+001;4.8000000000e+001 +1.0000000000e+000;2.3962363840e+002;2.2247492544e+002;1.5592553305e+002;1.8360150553e+002;3.3711833825e+002;2.1813048075e+002;2.2605236643e+002;3.8861774138e+002;2.5398361883e+002;1.9502367257e+002;4.8000000000e+001;4.9000000000e+001 +1.0000000000e+000;6.1139402147e+002;6.3667343713e+002;4.0575677030e+002;5.5398044551e+002;5.2999148596e+002;6.2549832587e+002;6.0971418838e+002;6.9850018602e+002;7.5671467207e+002;6.1275600296e+002;4.9000000000e+001;5.0000000000e+001 +1.0000000000e+000;8.6603384045e+002;4.5400193770e+001;3.5835209407e+002;1.2311490684e+002;1.1627041370e+003;4.2374250299e+002;4.8202429735e+002;3.3680662504e+002;7.7392040473e+002;2.2062101584e+002;5.0000000000e+001;5.1000000000e+001 +1.0000000000e+000;2.6436072104e+002;2.5540116658e+002;1.8674925781e+002;1.7914839089e+002;4.5078026508e+002;1.0581464232e+002;9.2255507988e+001;6.2456347592e+002;2.8392001411e+002;2.1451887969e+002;5.1000000000e+001;5.2000000000e+001 +1.0000000000e+000;3.7363255437e+002;5.4693951824e+002;4.4311085335e+002;5.2369306487e+002;3.7348403813e+002;4.7514976054e+002;5.1593102807e+002;7.1031594438e+002;3.5024919194e+002;4.9908158395e+002;5.2000000000e+001;5.3000000000e+001 +1.0000000000e+000;4.6581669094e+002;2.7522034348e+002;4.1878263202e+002;2.7953034105e+002;4.9288827898e+002;3.4499807824e+002;2.6268921470e+002;4.4126469184e+002;5.2947416224e+002;1.7607167217e+002;5.3000000000e+001;5.4000000000e+001 +1.0000000000e+000;7.2684850367e+002;6.6222266428e+002;5.8985454085e+002;6.2491880185e+002;6.8427068294e+002;5.7501977319e+002;5.7880454115e+002;7.4893653452e+002;8.1220186899e+002;6.3062142567e+002;5.4000000000e+001;5.5000000000e+001 +1.0000000000e+000;5.2696170544e+002;1.8410121166e+002;3.4767706945e+002;1.4615152641e+002;8.0474260583e+002;3.1587708902e+002;1.9319051270e+002;6.5552659459e+001;6.2217729349e+002;2.4937147029e+002;5.5000000000e+001;5.6000000000e+001 +1.0000000000e+000;5.1962759668e+002;4.8831768019e+002;5.1072599706e+002;4.2497901937e+002;7.6219304125e+002;4.4545270642e+002;4.3584480312e+002;5.7059083984e+002;5.3814324790e+002;5.2670972132e+002;5.6000000000e+001;5.7000000000e+001 +1.0000000000e+000;6.3833994976e+002;5.1020719085e+002;6.1474703383e+002;5.4846083886e+002;8.4482318051e+002;5.3464431825e+002;5.3142948496e+002;5.2973782355e+002;6.7356589711e+002;4.9116606502e+002;5.7000000000e+001;5.8000000000e+001 +1.0000000000e+000;6.0703343550e+002;6.8454113891e+002;5.3694058000e+002;5.9135375971e+002;8.3525639773e+002;5.5253125844e+002;5.8615105906e+002;9.1139883555e+002;6.5990105216e+002;6.7726826536e+002;5.8000000000e+001;5.9000000000e+001 +1.0000000000e+000;5.2887593771e+002;4.4748306028e+002;3.8780641558e+002;4.3195339240e+002;6.2714699676e+002;4.5251665162e+002;3.6828198786e+002;9.4329226276e+002;7.0226437053e+002;3.2891600937e+002;5.9000000000e+001;6.0000000000e+001 +1.0000000000e+000;6.3009748766e+002;5.4007317608e+002;5.6569597516e+002;4.7426464983e+002;8.9014065369e+002;4.9910676396e+002;4.4165057050e+002;6.5371160464e+002;5.9426459964e+002;5.4968611153e+002;6.0000000000e+001;6.1000000000e+001 +1.0000000000e+000;4.9241051903e+002;2.7857017902e+002;4.0456849081e+002;2.5472081255e+002;5.9814420002e+002;4.7407449718e+002;3.7801125788e+002;2.0286224201e+002;4.6015543694e+002;3.1089168956e+002;6.1000000000e+001;6.2000000000e+001 +1.0000000000e+000;1.1585795874e+002;3.0922982149e+002;9.3328391853e+001;2.7752937907e+002;1.6415034449e+002;3.9190206847e+001;1.3465164977e+002;4.5534897661e+002;1.6222426168e+002;2.1248175725e+002;6.2000000000e+001;6.3000000000e+001 +1.0000000000e+000;1.1116861854e+002;8.6597706774e+001;9.4714271006e+001;1.2869358621e+002;1.2083110209e+002;1.5180876836e+002;1.2511779371e+002;2.2254093653e+001;1.1113162507e+002;1.5597002531e+002;6.3000000000e+001;6.4000000000e+001 +1.0000000000e+000;5.0348760049e+002;3.0842906335e+002;4.8837365803e+002;2.9544463584e+002;8.4750672040e+002;3.1822992667e+002;2.5173372966e+002;2.5585993708e+002;4.2397397823e+002;2.8674606324e+002;6.4000000000e+001;6.5000000000e+001 +1.0000000000e+000;5.4448071112e+002;4.7700666752e+002;5.1647353834e+002;4.3272855178e+002;5.9859428609e+002;4.1136714006e+002;3.6115788305e+002;6.0891722389e+002;5.8443844130e+002;4.1164117839e+002;6.5000000000e+001;6.6000000000e+001 +1.0000000000e+000;6.5178290135e+002;5.3517491290e+002;5.5501176280e+002;4.9551886647e+002;1.0032620431e+003;4.8326738863e+002;4.6072352523e+002;7.3522111594e+002;6.6250630739e+002;4.4593447372e+002;6.6000000000e+001;6.7000000000e+001 +1.0000000000e+000;5.5563860133e+002;7.2668794039e+002;5.2693695232e+002;6.6515844480e+002;5.3930498779e+002;5.2082605682e+002;6.0597104220e+002;8.5428790828e+002;6.0900559829e+002;7.1270193597e+002;6.7000000000e+001;6.8000000000e+001 +1.0000000000e+000;6.6371896346e+002;5.4504016480e+002;5.1181091338e+002;4.8392129357e+002;1.1479441645e+003;4.7209310417e+002;4.4392369420e+002;8.0040708428e+002;6.3860361474e+002;4.8103692006e+002;6.8000000000e+001;6.9000000000e+001 +1.0000000000e+000;2.6010050726e+002;2.1564601620e+002;2.8710415770e+002;1.7405111156e+002;3.4619822022e+002;2.1520480254e+002;1.9555007899e+002;1.7795173955e+002;3.0881115761e+002;2.0525632397e+002;6.9000000000e+001;7.0000000000e+001 +1.0000000000e+000;5.4406315200e+002;4.0637992207e+002;5.4128935258e+002;3.5840100196e+002;7.3576520163e+002;3.9337138942e+002;3.5550518093e+002;5.1064372091e+002;5.2833218105e+002;3.7730213610e+002;7.0000000000e+001;7.1000000000e+001 +1.0000000000e+000;5.5689704242e+002;2.3730852056e+002;4.4924956897e+002;2.2231387639e+002;8.6873253048e+002;3.3499473997e+002;2.3416161268e+002;3.4436306587e+002;5.7705117684e+002;1.9410070712e+002;7.1000000000e+001;7.2000000000e+001 +1.0000000000e+000;3.2297261685e+002;4.9521435315e+002;3.2939370107e+002;4.5914467866e+002;1.7902814707e+002;3.2654814800e+002;3.8742171382e+002;5.0572975596e+002;3.5334838040e+002;5.6060165795e+002;7.2000000000e+001;7.3000000000e+001 +1.0000000000e+000;4.1578965236e+002;4.8045449421e+002;3.6542786220e+002;4.2360406645e+002;5.2811555334e+002;3.6603642631e+002;4.0060396391e+002;5.6542795558e+002;5.1160963293e+002;3.9543354248e+002;7.3000000000e+001;7.4000000000e+001 +1.0000000000e+000;3.3252532972e+002;2.4620722384e+002;2.8962599575e+002;1.2355792189e+002;5.8847113653e+002;1.1333954991e+002;1.2173252331e+002;2.8741058896e+002;3.5515714501e+002;2.7844024964e+002;7.4000000000e+001;7.5000000000e+001 +1.0000000000e+000;2.8893234267e+002;2.8419665911e+001;3.3866681749e+002;6.3557510877e+001;3.9761032756e+002;1.8083304730e+002;8.3653637183e+001;3.0177572398e+002;3.2147203684e+002;1.0082226798e+002;7.5000000000e+001;7.6000000000e+001 +1.0000000000e+000;2.3061824484e+002;1.5313263434e+002;1.5079724734e+002;1.8267025250e+002;5.3825736660e+002;1.4439715134e+002;1.6136595320e+002;2.5871077617e+002;2.2595947903e+002;1.6452243728e+002;7.6000000000e+001;7.7000000000e+001 +1.0000000000e+000;4.1542572233e+002;2.6702661804e+002;2.5371799792e+002;1.3258987013e+002;5.7514937405e+002;1.7256947975e+002;3.6849738943e+001;5.2213395101e+002;5.3021241286e+002;2.8051178197e+002;7.7000000000e+001;7.8000000000e+001 +1.0000000000e+000;1.7843635601e+002;1.5551829423e+002;5.0042867739e+001;1.6826559304e+002;2.3682743614e+002;1.4709792702e+002;1.7584092454e+002;1.6915905827e+002;2.4472781377e+002;1.3972752154e+002;7.8000000000e+001;7.9000000000e+001 +1.0000000000e+000;2.0973337095e+002;2.7878121179e+002;1.9287390182e+002;2.7845289146e+002;3.6454919002e+002;1.7092344086e+002;2.1354618735e+002;3.4322115958e+002;2.1512776475e+002;2.9434503485e+002;7.9000000000e+001;8.0000000000e+001 +1.0000000000e+000;1.0963667553e+002;8.6526915230e+001;1.0653147754e+002;6.7615789520e+001;4.8447716134e+001;6.5100092034e+001;2.8538837740e+001;3.4953481944e+002;2.1413705669e+002;2.5011318829e+001;8.0000000000e+001;8.1000000000e+001 +1.0000000000e+000;8.0466269406e+002;5.5065115022e+002;6.3549732324e+002;4.6223255204e+002;1.2340630948e+003;5.2522510559e+002;3.9954658532e+002;8.9281044895e+002;8.4744489096e+002;4.7516478581e+002;8.1000000000e+001;8.2000000000e+001 +1.0000000000e+000;4.9070094872e+002;5.7670185435e+002;3.4988729974e+002;4.8488943888e+002;7.5943734071e+002;3.9586237349e+002;3.7893648214e+002;9.6302248298e+002;5.2437836074e+002;4.6163930556e+002;8.2000000000e+001;8.3000000000e+001 +1.0000000000e+000;5.4585396218e+002;5.2815533943e+002;5.5079088497e+002;4.9053255615e+002;6.1692974555e+002;4.1173473612e+002;3.7562443787e+002;8.7938958009e+002;5.4931867900e+002;4.0579834089e+002;8.3000000000e+001;8.4000000000e+001 +1.0000000000e+000;1.8004920134e+002;3.1263830894e+002;2.0967090032e+002;2.4650436902e+002;1.0417203612e+002;2.0288939919e+002;2.4766892695e+002;3.4354885453e+002;9.4258357088e+001;3.0597197737e+002;8.4000000000e+001;8.5000000000e+001 +1.0000000000e+000;2.8638976586e+002;1.2675766462e+002;2.5001259275e+002;1.2703224392e+002;3.3145486655e+002;1.5973233900e+002;1.2168656950e+002;2.6529635137e+002;3.7933653578e+002;1.2531348392e+002;8.5000000000e+001;8.6000000000e+001 +1.0000000000e+000;3.0185689991e+002;2.5710787858e+002;2.5124351187e+002;2.1773886726e+002;3.1492868179e+002;2.2211813351e+002;1.8313697184e+002;4.4271989132e+002;4.0240331985e+002;2.2350962130e+002;8.6000000000e+001;8.7000000000e+001 +1.0000000000e+000;1.2073482851e+002;2.5455174088e+001;1.3308364151e+002;6.2509904345e+001;3.6762176100e+002;1.0714994692e+002;1.0499243664e+002;1.0580201292e+002;1.7740428674e+002;6.0314832535e+001;8.7000000000e+001;8.8000000000e+001 +1.0000000000e+000;2.2171243962e+002;1.4772227403e+002;1.7325843161e+002;1.9556808175e+002;3.6123290394e+002;1.2442586217e+002;9.9732803616e+001;3.2033997818e+002;2.5098974069e+002;1.2326298392e+002;8.8000000000e+001;8.9000000000e+001 +1.0000000000e+000;8.9702514921e+001;3.3145538029e+002;7.7998550499e+001;3.0564739833e+002;3.4007668390e+002;1.2819238382e+002;2.1587573384e+002;3.8815068401e+002;1.6070417997e+002;2.8963177175e+002;8.9000000000e+001;9.0000000000e+001 +1.0000000000e+000;5.2387553457e+002;3.6956749668e+002;4.6317631110e+002;3.2892130496e+002;8.6549771129e+002;3.8867435408e+002;3.5209794107e+002;3.8762974162e+002;4.7075511328e+002;3.7427424252e+002;9.0000000000e+001;9.1000000000e+001 +1.0000000000e+000;3.6985534402e+002;3.2796941538e+002;2.4454153039e+002;3.3113558151e+002;5.7583185979e+002;2.8169451186e+002;3.0110390093e+002;4.2484995161e+002;4.0460815108e+002;2.4672189196e+002;9.1000000000e+001;9.2000000000e+001 +1.0000000000e+000;1.9907158959e+002;2.7063551973e+002;2.0210650122e+002;2.5543491472e+002;4.0214978025e+002;1.5074233544e+002;2.1238900425e+002;3.1119364351e+002;1.3070876809e+002;2.0732795846e+002;9.2000000000e+001;9.3000000000e+001 +1.0000000000e+000;3.3826466315e+002;1.5902038563e+002;3.2579013823e+002;9.6305079900e+001;6.0987380869e+002;2.0532279826e+002;1.1170943103e+002;3.2755459239e+002;3.0522862752e+002;1.2283272401e+002;9.3000000000e+001;9.4000000000e+001 +1.0000000000e+000;5.6896641704e+002;5.0978619555e+002;5.3072040204e+002;4.9261790336e+002;7.9142054097e+002;4.8640291241e+002;4.3611967044e+002;5.5484577492e+002;6.0356688538e+002;5.2852818656e+002;9.4000000000e+001;9.5000000000e+001 +1.0000000000e+000;2.9908941926e+002;2.8374774594e+002;2.9154553296e+002;2.8981306433e+002;3.2521576039e+002;2.8615562684e+002;2.5299763647e+002;4.7293140082e+002;3.5906376894e+002;2.1908684294e+002;9.5000000000e+001;9.6000000000e+001 +1.0000000000e+000;1.1947575728e+002;1.2989748523e+002;1.3058343248e+002;4.7305116734e+001;2.8901430993e+002;9.0617587082e+001;3.7332150151e+001;3.7640391326e+002;1.5550982972e+002;1.0391280031e+002;9.6000000000e+001;9.7000000000e+001 +1.0000000000e+000;2.3794238806e+002;2.3389697627e+002;2.6151974797e+002;1.9771096710e+002;2.9692326068e+002;1.8212261799e+002;1.8598857107e+002;1.9106493697e+002;1.9252066768e+002;2.3970525155e+002;9.7000000000e+001;9.8000000000e+001 +1.0000000000e+000;5.1983596238e+001;3.4749305246e+002;1.7273150723e+002;2.2067067886e+002;1.9235139586e+002;9.2107493467e+001;2.1633120142e+002;3.3064770209e+002;1.2616400909e+002;4.2868153937e+002;9.8000000000e+001;9.9000000000e+001 +1.0000000000e+000;1.0383295277e+002;1.1927990681e+002;5.0279226328e+001;1.2704463573e+002;1.1861333255e+002;4.3573377748e+001;3.9146165031e+001;2.0352375527e+002;1.9657533220e+002;1.0352413869e+002;9.9000000000e+001;1.0000000000e+002 +1.0000000000e+000;2.8155527468e+002;1.8064406775e+002;2.3755731674e+002;2.1170953673e+002;4.9225701937e+002;2.0962495509e+002;1.8189653622e+002;2.1914774694e+002;3.1194424156e+002;1.8207867716e+002;1.0000000000e+002;1.0100000000e+002 +1.0000000000e+000;2.5078658910e+002;1.8379328090e+002;3.5581910320e+002;2.4545305676e+002;5.2829690663e+002;2.0013782603e+002;2.1490941666e+002;3.9093394462e+002;1.7847024501e+002;1.2646685939e+002;1.0100000000e+002;1.0200000000e+002 +1.0000000000e+000;3.7733774828e+002;2.5333740252e+002;2.2835035263e+002;1.7910360789e+002;5.8262998473e+002;2.3531925314e+002;1.6798475196e+002;2.2355109680e+002;5.3788448520e+002;3.2277643583e+002;1.0200000000e+002;1.0300000000e+002 +1.0000000000e+000;6.6632568098e+002;4.9994871871e+002;5.7334260650e+002;4.5529507307e+002;1.0539613676e+003;4.5274869992e+002;3.7603107111e+002;8.7471734385e+002;6.6472997912e+002;4.1968967985e+002;1.0300000000e+002;1.0400000000e+002 +1.0000000000e+000;2.9827871205e+002;4.5343745406e+002;3.2834998729e+002;3.9811918887e+002;4.4920116596e+002;2.2782786481e+002;2.6514510091e+002;1.0052859308e+003;3.2857370766e+002;3.1083817658e+002;1.0400000000e+002;1.0500000000e+002 +1.0000000000e+000;4.9649070604e+002;1.6322026763e+002;4.0096505025e+002;1.3979641205e+002;6.6247793474e+002;3.1421696095e+002;1.8183345076e+002;3.6682131443e+002;5.7910104055e+002;1.0811704095e+002;1.0500000000e+002;1.0600000000e+002 +1.0000000000e+000;2.0932097658e+002;1.0681530000e+002;1.2906251133e+002;1.3245752221e+002;2.5428538542e+002;1.6213847439e+002;1.2411039653e+002;9.3671386438e+001;2.8632819836e+002;1.7393611511e+002;1.0600000000e+002;1.0700000000e+002 +1.0000000000e+000;3.7752326716e+002;2.0092173938e+002;3.3608086381e+002;1.7718337268e+002;5.6027904260e+002;1.8861535452e+002;1.5029574023e+002;3.4294215127e+002;3.1331641297e+002;1.3911287310e+002;1.0700000000e+002;1.0800000000e+002 +1.0000000000e+000;1.5494039930e+002;1.7481173887e+002;8.9774343701e+001;1.5272118105e+002;8.8793204869e+001;4.7691201096e+001;6.0991296695e+001;3.7177321386e+002;2.3581153976e+002;1.2693947695e+002;1.0800000000e+002;1.0900000000e+002 +1.0000000000e+000;3.3433979395e+002;3.8300237539e+002;2.6354097363e+002;3.6414558307e+002;4.8418467037e+002;2.7013490387e+002;2.8983201994e+002;4.9648750702e+002;3.4426879121e+002;3.2564998612e+002;1.0900000000e+002;1.1000000000e+002 +1.0000000000e+000;1.0660625605e+002;1.0054395751e+002;6.5750389853e+001;1.3289844387e+002;2.0787922581e+002;9.9793504181e+000;6.3012126043e+001;1.2640231915e+002;1.1593548810e+002;7.5898156441e+001;1.1000000000e+002;1.1100000000e+002 +1.0000000000e+000;4.8013433918e+002;2.9875236879e+002;4.8577633195e+002;3.1268068863e+002;7.0240145635e+002;3.3936152369e+002;2.7630952662e+002;3.9717122709e+002;4.1555318952e+002;2.7400502286e+002;1.1100000000e+002;1.1200000000e+002 +1.0000000000e+000;2.3329508298e+002;1.5411609603e+002;2.0072703468e+002;1.0951492924e+002;3.0189898955e+002;1.3683767528e+002;9.5802006400e+001;1.8537802044e+002;2.3317994641e+002;1.3835994846e+002;1.1200000000e+002;1.1300000000e+002 +1.0000000000e+000;1.8577982753e+002;2.4199135964e+002;2.4251468929e+002;1.5112005297e+002;1.8542434034e+002;1.1197963365e+002;4.4792788427e+001;4.8399893264e+002;1.9291866474e+002;2.1285405450e+002;1.1300000000e+002;1.1400000000e+002 +1.0000000000e+000;2.0953727939e+002;1.1693299783e+002;1.4544631946e+002;1.0349308993e+002;2.3663062224e+002;1.4758044350e+002;1.2314505956e+002;2.3665404924e+002;2.7792658228e+002;1.3672017870e+002;1.1400000000e+002;1.1500000000e+002 +1.0000000000e+000;5.3842596375e+002;4.2676037945e+002;4.9585638578e+002;3.6892819950e+002;6.8610960412e+002;3.9682865099e+002;3.5247760835e+002;4.0065509812e+002;5.6198162704e+002;4.4594339113e+002;1.1500000000e+002;1.1600000000e+002 +1.0000000000e+000;7.1175882410e+001;2.4295263144e+002;1.4098672642e+002;2.3384607553e+002;2.7144758452e+002;7.0942453540e+001;1.4043873203e+002;4.2373925022e+002;1.0816759873e+002;1.7638490619e+002;1.1600000000e+002;1.1700000000e+002 +1.0000000000e+000;1.8106364546e+002;4.0414299474e+001;1.4007482220e+002;4.7372293935e+001;3.5736024354e+002;8.7613215434e+001;3.3473640409e+000;5.6060570809e+001;1.7812573960e+002;5.6671823966e+001;1.1700000000e+002;1.1800000000e+002 +1.0000000000e+000;2.4847823774e+002;1.8684627529e+002;1.8755503787e+002;1.4691566635e+002;3.7464795587e+002;1.5254399673e+002;1.6069901442e+002;2.9225083251e+002;3.2488720193e+002;1.5692529552e+002;1.1800000000e+002;1.1900000000e+002 +1.0000000000e+000;6.9227164762e+001;2.1611629556e+002;7.2633246793e+001;1.5363997057e+002;1.7913361881e+002;4.2477951606e+001;1.0325219769e+002;3.7058002930e+002;8.2124330380e+001;1.8785260574e+002;1.1900000000e+002;1.2000000000e+002 +1.0000000000e+000;2.1738161309e+002;3.2243752677e+002;1.7194731254e+002;2.7957384663e+002;2.2625157803e+002;1.6935301168e+002;2.2447714221e+002;4.9259173200e+002;2.7148245363e+002;2.9927106067e+002;1.2000000000e+002;1.2100000000e+002 +1.0000000000e+000;3.3806958629e+002;1.4927425837e+002;3.3561217469e+002;1.9411312496e+002;3.9400877094e+002;2.3748052406e+002;1.7270931745e+002;1.4478149783e+002;3.1710412545e+002;1.4619099097e+002;1.2100000000e+002;1.2200000000e+002 +1.0000000000e+000;3.0399960391e+002;2.0071109818e+002;3.0523148731e+002;1.7547899586e+002;5.0058854799e+002;2.1512741176e+002;1.5867299231e+002;2.2343695757e+002;2.9256335876e+002;1.7376565454e+002;1.2200000000e+002;1.2300000000e+002 +1.0000000000e+000;1.5741822946e+002;3.3664260736e+001;7.2344106608e+001;1.8035458653e+001;2.5462887219e+002;7.6007209462e+001;4.2604230195e+001;1.7196141574e+002;1.1995568013e+002;7.6219618042e+001;1.2300000000e+002;1.2400000000e+002 +1.0000000000e+000;3.1239607985e+002;1.2908239832e+002;2.9433041202e+002;1.3765767068e+002;4.4244809708e+002;2.2477168551e+002;1.4645879629e+002;1.1815472264e+002;2.9714003954e+002;1.9685371179e+002;1.2400000000e+002;1.2500000000e+002 +1.0000000000e+000;1.9083269262e+002;2.0999348257e+002;1.7217583981e+002;1.7401374556e+002;3.5283903498e+002;1.1207514804e+002;1.2741901825e+002;4.1986584436e+002;1.6817145757e+002;1.6533467514e+002;1.2500000000e+002;1.2600000000e+002 +1.0000000000e+000;3.5782938073e+002;2.3122684177e+002;2.8391116325e+002;2.0534818517e+002;5.6399713796e+002;2.3301055898e+002;1.9495164588e+002;3.4104611839e+002;3.9091965321e+002;2.1016304651e+002;1.2600000000e+002;1.2700000000e+002 +1.0000000000e+000;2.3236851155e+002;1.9797196462e+002;2.3629874333e+002;1.6919133230e+002;3.4464422795e+002;1.6406005569e+002;1.3005463814e+002;2.6189828481e+002;2.3508044314e+002;1.9017774663e+002;1.2700000000e+002;1.2800000000e+002 +1.0000000000e+000;8.3463918328e+001;9.4144437225e+001;8.9332118675e+001;8.8993757222e+001;1.2438200256e+002;4.9537643117e+001;3.9995576949e+001;3.0639442010e+002;6.4940613446e+001;8.0339921827e+001;1.2800000000e+002;1.2900000000e+002 +1.0000000000e+000;1.9158293164e+002;1.1908941725e+002;1.5896225599e+002;1.0166376803e+002;4.4464775928e+002;1.0374272948e+002;1.0611414831e+002;9.7936504844e+001;7.4935097446e+001;1.7883090506e+002;1.2900000000e+002;1.3000000000e+002 +1.0000000000e+000;7.5506072220e+001;2.0169537271e+001;3.5411065896e+001;8.6033689822e+000;8.1116729117e+001;3.6620497598e+001;2.1361531824e+001;1.9204448953e+002;9.2010677507e+001;1.9014606410e+001;1.3000000000e+002;1.3100000000e+002 +1.0000000000e+000;1.2262715400e+002;1.9848037638e+002;8.1497792946e+001;1.9201912838e+002;1.5285893416e+002;8.6981233630e+001;1.2638628908e+002;4.0843220075e+002;1.8765970232e+002;1.4990258701e+002;1.3100000000e+002;1.3200000000e+002 +1.0000000000e+000;1.1779808069e+002;1.8059988806e+002;1.3628354222e+002;1.8592756151e+002;9.8385887234e+001;1.1399298541e+002;1.1396451610e+002;2.5065216921e+002;1.4024335333e+002;1.4597742784e+002;1.3200000000e+002;1.3300000000e+002 +1.0000000000e+000;1.9894208729e+002;2.6008381486e+002;1.3434914364e+002;2.4296901627e+002;2.7910290515e+002;1.5573593808e+002;1.7809992387e+002;4.0793104947e+002;2.6121355991e+002;1.8234850300e+002;1.3300000000e+002;1.3400000000e+002 +1.0000000000e+000;1.4702144252e+002;2.0137190707e+002;1.2468334991e+002;1.8740745948e+002;3.1122327603e+002;1.1272559371e+002;1.4784088629e+002;3.2501856315e+002;1.7059952758e+002;1.5476732877e+002;1.3400000000e+002;1.3500000000e+002 +1.0000000000e+000;5.5193087700e+001;8.6109555444e+001;9.4053883383e+001;8.7135430686e+001;9.6535577005e+001;7.9627545979e+001;5.7252577944e+001;9.7744434849e+001;8.6835168572e+001;8.6563167500e+001;1.3500000000e+002;1.3600000000e+002 +1.0000000000e+000;1.4981047312e+002;9.1617848878e+001;1.1424932199e+002;3.8541305229e+001;2.2706963640e+002;9.1431523975e+001;6.2852609796e+001;1.9160393626e+002;1.5899405211e+002;1.3686938626e+002;1.3600000000e+002;1.3700000000e+002 +1.0000000000e+000;8.9781949797e+001;8.0096240705e+001;9.5035673431e+001;4.0397069988e+001;1.0731918300e+002;4.3268932203e+001;2.0990027510e+001;1.9120444207e+002;9.4932574343e+001;7.4812883068e+001;1.3700000000e+002;1.3800000000e+002 +1.0000000000e+000;7.0299119411e+001;7.7332967000e+001;4.7100966782e+001;5.9486867228e+001;5.6213741320e+001;6.5267775644e+001;6.3798612355e+001;1.5733255729e+002;1.3657721155e+002;5.4997953688e+001;1.3800000000e+002;1.3900000000e+002 +1.0000000000e+000;2.0678295506e+001;9.5102101445e+001;4.3395166292e+001;7.6929539036e+001;9.5155754790e+001;1.3332657756e+001;5.5992462187e+001;2.0389045268e+002;1.2093914844e+000;9.8046486109e+001;1.3900000000e+002;1.4000000000e+002 +1.0000000000e+000;9.0255964027e+001;2.5480831084e+001;1.0170255885e+002;1.7022874446e+001;1.4604612707e+002;5.8990209106e+001;5.5081391869e+000;1.0774514419e+002;8.0583662166e+001;3.6366979370e+001;1.4000000000e+002;1.4100000000e+002 +1.0000000000e+000;1.4424433032e+002;1.0179404286e+002;1.1071271480e+002;7.9777152711e+001;2.7061377295e+002;9.5420763566e+001;8.2710680117e+001;1.4004460630e+002;1.2139538027e+002;1.2957185785e+002;1.4100000000e+002;1.4200000000e+002 +1.0000000000e+000;1.1990135091e+002;5.9209999286e+001;1.0985026019e+002;2.5907361102e+001;2.2060876908e+002;6.6950108285e+001;3.1768396846e+001;4.3112865800e+001;1.1108177267e+002;9.5797343823e+001;1.4200000000e+002;1.4300000000e+002 +1.0000000000e+000;3.1847150576e+001;8.3552865773e+001;2.7293467863e+001;5.7351517288e+001;1.0567507347e+002;9.2285128387e+000;3.3535703331e+001;1.8903442608e+002;4.2019987632e+001;5.4137176504e+001;1.4300000000e+002;1.4400000000e+002 +1.0000000000e+000;6.8549698876e+001;3.2371828243e+001;5.7147598079e+001;4.9105280514e+001;1.2854470202e+002;3.6279566727e+001;2.4274384528e+001;1.1863453870e+002;6.4945840147e+001;1.9347360486e+001;1.4400000000e+002;1.4500000000e+002 +1.0000000000e+000;8.7761114670e+001;5.2617894411e+001;7.8194846550e+001;3.9766965566e+001;1.1732647243e+002;5.5564401822e+001;2.6433262096e+001;1.0976838289e+002;1.0707697173e+002;3.6316851072e+001;1.4500000000e+002;1.4600000000e+002 +1.0000000000e+000;1.1562913244e+002;4.8889662679e+001;7.3789918953e+001;3.9052397264e+001;2.5655836659e+002;5.7059771528e+001;4.6498250390e+001;3.8285942789e+001;9.9382244278e+001;5.1158458482e+001;1.4600000000e+002;1.4700000000e+002 +1.0000000000e+000;2.9188261936e+001;4.2259194997e+001;3.7088386791e+001;5.3798447252e+001;7.7639766541e+001;1.6568000412e+001;2.6593561760e+001;6.3509138550e+001;1.0947481441e+001;2.9453117063e+001;1.4700000000e+002;1.4800000000e+002 +1.0000000000e+000;1.2435716287e+002;4.6944710635e+001;1.0841008535e+002;3.6972924101e+001;2.0363196342e+002;6.4828890770e+001;3.5935508277e+001;7.8947062293e+001;1.0346511578e+002;4.2269926733e+001;1.4800000000e+002;1.4900000000e+002 +1.0000000000e+000;8.5970200745e+001;7.5447161079e+001;5.7758433685e+001;7.2971424196e+001;1.1844443962e+002;5.8810129854e+001;6.0301042035e+001;1.2340023711e+002;8.5440657512e+001;5.9725148761e+001;1.4900000000e+002;1.5000000000e+002 +1.0000000000e+000;1.1676769783e+002;2.4633404794e+002;8.2667385650e+001;2.1684133223e+002;1.4076131429e+002;1.3023501431e+002;2.0399565318e+002;2.4084923025e+002;1.3476889505e+002;2.6486319830e+002;1.5000000000e+002;1.5100000000e+002 +1.0000000000e+000;3.3151503793e+001;2.9544126703e+001;1.5686643011e+001;1.7981840195e+001;9.2435951017e+001;1.5915697921e+001;2.2228627396e+000;6.6192650398e+001;1.9406217756e+001;2.8789649625e+001;1.5100000000e+002;1.5200000000e+002 +1.0000000000e+000;7.1158097202e+001;8.0536752761e+001;4.9620054400e+001;6.0031636199e+001;1.3420887114e+002;3.4977943455e+001;4.0209336372e+001;1.3177612219e+002;8.2020028031e+001;7.4130326318e+001;1.5200000000e+002;1.5300000000e+002 +1.0000000000e+000;1.2321186059e+002;9.2940139740e+001;1.1700322052e+002;8.3051366639e+001;1.8276610822e+002;9.9382981316e+001;8.2568280260e+001;1.1020686316e+002;1.1150719726e+002;7.9126663652e+001;1.5300000000e+002;1.5400000000e+002 +1.0000000000e+000;2.8127931128e+001;1.0353637159e+002;4.2845599443e+001;7.8485610502e+001;2.5651173654e+001;3.8200378694e+001;6.2697399992e+001;1.1585147645e+002;1.0827907003e+001;1.1085519638e+002;1.5400000000e+002;1.5500000000e+002 +1.0000000000e+000;3.8125444510e+001;2.8650344100e+001;3.3512416215e+001;2.9939858748e+001;3.6673947125e+001;2.6875746210e+001;2.2460346898e+001;5.3141632549e+001;5.0383397181e+001;3.0931361897e+001;1.5500000000e+002;1.5600000000e+002 +1.0000000000e+000;7.4504331519e+001;4.9620976322e+001;6.7713240783e+001;4.6165957600e+001;8.6320690174e+001;5.7344749775e+001;3.9170443554e+001;1.0192696767e+002;8.1988172703e+001;5.2540116861e+001;1.5600000000e+002;1.5700000000e+002 +1.0000000000e+000;2.0218047412e+001;3.7182498459e+001;2.5880989616e+001;2.1617189202e+001;2.6151040230e+001;1.7944978303e+001;1.6385776302e+001;6.8759260210e+001;3.7590385156e+001;3.0923492403e+001;1.5700000000e+002;1.5800000000e+002 +1.0000000000e+000;4.3977426965e+001;3.5749228997e+001;3.2870760265e+001;3.7772946670e+001;9.3885653132e+001;2.0317560992e+001;2.0715286878e+001;7.2853943859e+001;4.9611555429e+001;1.8884160745e+001;1.5800000000e+002;1.5900000000e+002 +1.0000000000e+000;5.3492844190e+001;2.1011993765e+001;5.0638040040e+001;2.7063348671e+001;8.5486309737e+001;3.3393763346e+001;2.0689516941e+001;3.0488590830e+001;4.5458101061e+001;9.5853518704e+000;1.5900000000e+002;1.6000000000e+002 +1.0000000000e+000;2.9665930113e+001;4.5730415532e+001;2.0184358767e+001;3.7815963997e+001;4.4239457644e+001;2.6646327263e+001;3.2214507576e+001;5.6890403517e+001;4.8512133729e+001;4.3455899738e+001;1.6000000000e+002;1.6100000000e+002 +1.0000000000e+000;1.3554713200e+001;1.8809283577e+001;1.4192106149e+001;1.9099350566e+001;1.0089073511e+001;1.8971254438e+001;1.7902005464e+001;1.0941917557e+001;1.9896513583e+001;2.4524278966e+001;1.6100000000e+002;1.6200000000e+002 +1.0000000000e+000;2.6424479925e+001;3.9741908055e+000;1.8037109874e+001;8.1727391658e+000;3.7462022965e+001;2.0732040011e+001;8.5773300805e+000;6.7085887227e+000;2.5780616138e+001;6.0104191136e+000;1.6200000000e+002;1.6300000000e+002 +1.0000000000e+000;4.0479461043e+001;4.5092371094e+001;3.3241068590e+001;4.3652763395e+001;6.5223001600e+001;3.0634499306e+001;3.5990732183e+001;6.5591935443e+001;2.7992956691e+001;3.2719524935e+001;1.6300000000e+002;1.6400000000e+002 +1.0000000000e+000;6.7555027881e+001;4.4935000927e+001;6.6420243757e+001;4.4487268469e+001;8.6688476587e+001;5.1286153316e+001;4.5189029658e+001;6.0178844211e+001;6.8213051707e+001;4.4981329191e+001;1.6400000000e+002;1.6500000000e+002 +1.0000000000e+000;3.3801974532e+001;6.4855433040e+001;3.3092955540e+001;5.3560114710e+001;2.2293536009e+001;3.3980705887e+001;4.3017100855e+001;1.0592384145e+002;2.5976544092e+001;5.3338123123e+001;1.6500000000e+002;1.6600000000e+002 +1.0000000000e+000;3.1102616331e+001;1.2217633495e+001;2.9872790258e+001;1.1999181326e+001;5.4109469840e+001;2.4873256291e+001;1.4904352580e+001;4.4240139936e+000;2.8912195108e+001;2.2164326144e+001;1.6600000000e+002;1.6700000000e+002 +1.0000000000e+000;4.0646407193e+001;3.6193442870e+001;3.0395959193e+001;3.6306407242e+001;6.8854835486e+001;2.9936987022e+001;2.9559766477e+001;5.0291509800e+001;4.3039836715e+001;3.4843199259e+001;1.6700000000e+002;1.6800000000e+002 +1.0000000000e+000;3.0612532299e+001;3.2620628072e+001;2.6507993059e+001;2.5080534924e+001;4.5197757472e+001;2.5696595774e+001;2.3887016731e+001;3.9274088900e+001;2.3466588700e+001;3.1368480017e+001;1.6800000000e+002;1.6900000000e+002 +1.0000000000e+000;5.8552840941e+000;7.8595672498e+000;4.0310687804e+000;1.1529571675e+001;3.2144824965e+001;3.6948307046e+000;1.1724814758e+001;1.6155814655e+001;4.7164936016e+000;9.2409639240e+000;1.6900000000e+002;1.7000000000e+002 +1.0000000000e+000;1.8976382984e+001;2.7430264723e+001;2.3515978554e+001;2.3161597346e+001;2.0895994696e+001;2.3923709898e+001;2.2913677781e+001;3.7045753460e+001;1.5476960428e+001;2.3285334448e+001;1.7000000000e+002;1.7100000000e+002 +1.0000000000e+000;3.5824617782e+001;2.4637547988e+001;3.3383223477e+001;2.1921803789e+001;4.1732840474e+001;3.1463963721e+001;2.7508711676e+001;2.0723718583e+001;3.6411832246e+001;3.0289664191e+001;1.7100000000e+002;1.7200000000e+002 +1.0000000000e+000;3.4506415122e+001;7.7452015263e+000;3.0179443261e+001;8.5504278262e+000;4.6822797412e+001;2.4317122263e+001;1.3318779730e+001;1.1869100309e+001;3.0983435365e+001;6.6249929774e+000;1.7200000000e+002;1.7300000000e+002 +1.0000000000e+000;3.6115836098e+001;2.7544624337e+001;3.4311210273e+001;3.0447191055e+001;5.5321194519e+001;3.0781225763e+001;2.7160655620e+001;2.2666447844e+001;3.1176056482e+001;2.5796380169e+001;1.7300000000e+002;1.7400000000e+002 +1.0000000000e+000;4.3966305093e+001;5.2177445201e+001;4.6399426063e+001;4.7520314368e+001;4.4903511408e+001;4.1408457409e+001;4.1925685497e+001;6.2833357401e+001;3.7242095320e+001;4.9835812984e+001;1.7400000000e+002;1.7500000000e+002 +1.0000000000e+000;2.9515589446e+001;2.8933737975e+001;3.1791415782e+001;2.4114926595e+001;3.9014870503e+001;2.6482623257e+001;2.4609525548e+001;2.6745111786e+001;1.8881398455e+001;2.6585009997e+001;1.7500000000e+002;1.7600000000e+002 +1.0000000000e+000;2.6175411102e+001;3.5164637286e+001;2.6063296011e+001;3.3581334717e+001;2.7268067540e+001;2.8766248867e+001;2.9818567052e+001;4.8481522634e+001;2.5928216195e+001;3.1951477888e+001;1.7600000000e+002;1.7700000000e+002 +1.0000000000e+000;2.9466085496e+001;2.0797010480e+001;2.7434984142e+001;2.2354933486e+001;3.7424945304e+001;2.6802043378e+001;2.2311029553e+001;2.9170142026e+001;2.4651577717e+001;1.7237006446e+001;1.7700000000e+002;1.7800000000e+002 +1.0000000000e+000;2.8607939515e+001;2.2421488510e+001;2.6976390059e+001;2.3647189301e+001;3.9145815182e+001;2.4130610866e+001;2.1600544963e+001;2.1359290541e+001;2.2064393854e+001;1.7663443896e+001;1.7800000000e+002;1.7900000000e+002 +1.0000000000e+000;3.0623034385e+001;3.1369099492e+001;2.5789583186e+001;3.0252889955e+001;4.3747955738e+001;2.7970657861e+001;2.6683915329e+001;4.3034912214e+001;2.9560585461e+001;2.5958192960e+001;1.7900000000e+002;1.8000000000e+002 +1.0000000000e+000;1.4953650086e+001;2.4594567182e+001;1.3224832344e+001;2.3189323025e+001;1.0240745485e+001;1.8407602471e+001;1.9944712027e+001;3.1054500572e+001;1.5085480391e+001;1.9996978926e+001;1.8000000000e+002;1.8100000000e+002 +1.0000000000e+000;1.6792439370e+001;1.0044910911e+001;1.7820642498e+001;1.1806952275e+001;8.6722249298e+000;1.8069844544e+001;1.3955123511e+001;1.6897379210e+001;1.5504934093e+001;6.3458836037e+000;1.8100000000e+002;1.8200000000e+002 +1.0000000000e+000;2.9403481603e+001;2.4534672660e+001;2.6178132201e+001;2.3229799037e+001;3.4379346784e+001;2.6482939954e+001;2.4213969317e+001;2.3256741373e+001;2.7171805742e+001;2.2162504123e+001;1.8200000000e+002;1.8300000000e+002 +1.0000000000e+000;2.0336428897e+001;2.3075832183e+001;2.0483420559e+001;2.3956511937e+001;2.1219010728e+001;2.1544914587e+001;2.1847081679e+001;2.2645512356e+001;1.7622359829e+001;1.9039607594e+001;1.8300000000e+002;1.8400000000e+002 +1.0000000000e+000;1.4588882153e+001;1.3869436284e+001;1.6404010980e+001;1.5808187680e+001;1.5282877419e+001;1.7673643520e+001;1.5975017583e+001;7.4140064802e+000;1.1840047312e+001;1.1958373154e+001;1.8400000000e+002;1.8500000000e+002 +1.0000000000e+000;2.8608688837e+001;2.5488072237e+001;2.7701417984e+001;2.4240889970e+001;3.4562983017e+001;2.6628086863e+001;2.4389188209e+001;2.2693154837e+001;2.3191742998e+001;2.2722697104e+001;1.8500000000e+002;1.8600000000e+002 +1.0000000000e+000;2.2601047522e+001;2.1665808994e+001;2.2915144815e+001;2.0499926063e+001;1.8978585054e+001;2.2308813308e+001;2.1076826030e+001;1.8607053923e+001;1.7526734961e+001;2.0284818938e+001;1.8600000000e+002;1.8700000000e+002 +1.0000000000e+000;2.3362999707e+001;2.6290797397e+001;2.2451959009e+001;2.4396867885e+001;2.3884897934e+001;2.4355289558e+001;2.3202140723e+001;2.9094442252e+001;2.1091701634e+001;2.2325138919e+001;1.8700000000e+002;1.8800000000e+002 +1.0000000000e+000;2.5348575713e+001;2.3369083547e+001;2.6331052336e+001;2.3403683857e+001;2.8573842556e+001;2.5476633839e+001;2.3076532149e+001;2.2953752702e+001;2.0150461689e+001;1.8797953798e+001;1.8800000000e+002;1.8900000000e+002 +1.0000000000e+000;2.4450904861e+001;2.2206709214e+001;2.4194258460e+001;2.1685657924e+001;2.8139073747e+001;2.3259604076e+001;2.1262580205e+001;2.1375454714e+001;1.8526609154e+001;2.0632161775e+001;1.8900000000e+002;1.9000000000e+002 +1.0000000000e+000;1.7389745825e+001;1.9376554150e+001;1.7849333896e+001;1.9314251987e+001;1.2122457687e+001;2.0204824069e+001;1.9043639300e+001;1.5425907053e+001;1.5673565277e+001;1.6668822836e+001;1.9000000000e+002;1.9100000000e+002 +1.0000000000e+000;2.3498308664e+001;2.4635667491e+001;2.3491022914e+001;2.2719737860e+001;2.1605317910e+001;2.4832689645e+001;2.2413758367e+001;2.5784020564e+001;2.2473139931e+001;2.0563688073e+001;1.9100000000e+002;1.9200000000e+002 +1.0000000000e+000;1.9184287339e+001;1.9081098735e+001;2.0293111517e+001;1.7482902574e+001;1.6892366859e+001;2.0688832720e+001;1.8901005377e+001;1.6431590342e+001;1.6116167230e+001;1.6353330518e+001;1.9200000000e+002;1.9300000000e+002 +1.0000000000e+000;2.4143627902e+001;1.9741885081e+001;2.5224614989e+001;2.0208397446e+001;2.5686466471e+001;2.4774691095e+001;2.0751922990e+001;1.4061611976e+001;2.0953955257e+001;1.7309327929e+001;1.9300000000e+002;1.9400000000e+002 +1.0000000000e+000;1.9478395570e+001;1.9987804313e+001;2.0663383850e+001;2.0185906843e+001;1.8523757412e+001;2.0933798372e+001;1.9403757789e+001;1.6493339303e+001;1.5616171279e+001;1.8168595475e+001;1.9400000000e+002;1.9500000000e+002 +1.0000000000e+000;1.8093589008e+001;1.8631523103e+001;2.0009973055e+001;1.8744924233e+001;1.3516204374e+001;2.0152534165e+001;1.8582139711e+001;1.4488285700e+001;1.4723770552e+001;1.5767470796e+001;1.9500000000e+002;1.9600000000e+002 +1.0000000000e+000;1.8644727905e+001;1.9018554593e+001;2.0263581892e+001;1.8153091519e+001;1.4948728861e+001;2.0953299523e+001;1.8868090032e+001;1.6455261982e+001;1.6054827657e+001;1.6970777769e+001;1.9600000000e+002;1.9700000000e+002 +1.0000000000e+000;1.8099488908e+001;2.0112814509e+001;1.9689196350e+001;1.9157173322e+001;1.6052675116e+001;2.0580652437e+001;1.9141283303e+001;1.7705338981e+001;1.4636894815e+001;1.7716702115e+001;1.9700000000e+002;1.9800000000e+002 +1.0000000000e+000;2.1252001826e+001;1.8936732185e+001;2.0772749803e+001;1.9355617459e+001;2.0591834542e+001;2.1749599469e+001;1.8957318700e+001;1.5994339551e+001;1.8285693708e+001;1.5819931192e+001;1.9800000000e+002;1.9900000000e+002 +1.0000000000e+000;1.8641040073e+001;1.5863079890e+001;1.9522075285e+001;1.5663568075e+001;1.7084998183e+001;2.0025965560e+001;1.7005933169e+001;1.0452185990e+001;1.5514787133e+001;1.3333687890e+001;1.9900000000e+002;2.0000000000e+002 +1.0000000000e+000;1.8165191950e+001;1.7903797288e+001;1.8625347876e+001;1.7304051280e+001;1.5468060131e+001;1.9414083758e+001;1.7594089924e+001;1.5098402749e+001;1.4100317134e+001;1.4632452801e+001;2.0000000000e+002;2.0100000000e+002 +1.0000000000e+000;2.0811764893e+001;2.0420416974e+001;2.1283492514e+001;1.9897959425e+001;1.7847167515e+001;2.1810576915e+001;1.9933470486e+001;1.8872982461e+001;1.8537352337e+001;1.7601335554e+001;2.0100000000e+002;2.0200000000e+002 +1.0000000000e+000;2.0215088229e+001;1.9590280113e+001;2.0897562173e+001;1.9440618650e+001;1.9783470380e+001;2.1204030156e+001;1.9365967577e+001;1.8346319575e+001;1.6871882238e+001;1.6218924209e+001;2.0200000000e+002;2.0300000000e+002 +1.0000000000e+000;1.9986164393e+001;1.7545630190e+001;2.0543598666e+001;1.7605597115e+001;1.7958224702e+001;2.1004343218e+001;1.8499628380e+001;1.2263659416e+001;1.6904672305e+001;1.5657410861e+001;2.0300000000e+002;2.0400000000e+002 +1.0000000000e+000;2.0295363081e+001;1.8319653278e+001;2.0572438798e+001;1.8181751327e+001;1.7995765024e+001;2.1182775969e+001;1.8876355419e+001;1.4097454833e+001;1.7432771906e+001;1.6488931851e+001;2.0400000000e+002;2.0500000000e+002 +1.0000000000e+000;1.7726493980e+001;1.6935321389e+001;1.8608644284e+001;1.7243119763e+001;1.5174502238e+001;1.9472065332e+001;1.7442062839e+001;1.2507050524e+001;1.4099263214e+001;1.4394095876e+001;2.0500000000e+002;2.0600000000e+002 +1.0000000000e+000;1.9946734783e+001;1.9572407520e+001;2.0848708792e+001;1.9214272440e+001;1.7842384725e+001;2.1045629885e+001;1.9270000675e+001;1.7438229039e+001;1.6729247163e+001;1.6938154062e+001;2.0600000000e+002;2.0700000000e+002 +1.0000000000e+000;2.1000455253e+001;1.8660859865e+001;2.1284252350e+001;1.8027681487e+001;1.9599405112e+001;2.1565706267e+001;1.8850759322e+001;1.5592663562e+001;1.7932000466e+001;1.6415711843e+001;2.0700000000e+002;2.0800000000e+002 +1.0000000000e+000;1.8960626850e+001;1.9222430109e+001;1.9840624374e+001;1.9059054273e+001;1.6297754909e+001;2.0455536033e+001;1.8795629901e+001;1.6514132378e+001;1.5670892035e+001;1.6441124885e+001;2.0800000000e+002;2.0900000000e+002 +1.0000000000e+000;1.8850352994e+001;1.8772524020e+001;1.9616103981e+001;1.8450632596e+001;1.5634238336e+001;2.0590658493e+001;1.8822934452e+001;1.5607968099e+001;1.6264948170e+001;1.6311573529e+001;2.0900000000e+002;2.1000000000e+002 +1.0000000000e+000;1.8508443461e+001;1.7493688256e+001;1.9343437988e+001;1.7191441963e+001;1.5847602533e+001;1.9980065889e+001;1.7722634202e+001;1.3361069818e+001;1.5672060513e+001;1.4950208607e+001;2.1000000000e+002;2.1100000000e+002 +1.0000000000e+000;1.8936891815e+001;1.7900658543e+001;2.0021628271e+001;1.7596184481e+001;1.6696613980e+001;2.0349667603e+001;1.8204035234e+001;1.4270801043e+001;1.5772221690e+001;1.5592294923e+001;2.1100000000e+002;2.1200000000e+002 +1.0000000000e+000;1.9981424353e+001;1.8491198805e+001;2.0634781602e+001;1.8157229923e+001;1.7586001817e+001;2.0969407800e+001;1.8675146853e+001;1.5236342951e+001;1.7104651912e+001;1.6078701799e+001;2.1200000000e+002;2.1300000000e+002 +1.0000000000e+000;1.8639689444e+001;1.8596678824e+001;1.9658557236e+001;1.8261761934e+001;1.5736266233e+001;2.0215180498e+001;1.8438809058e+001;1.5820241297e+001;1.5574317250e+001;1.5949580013e+001;2.1300000000e+002;2.1400000000e+002 +1.0000000000e+000;1.8785871065e+001;1.7627484028e+001;1.9729387893e+001;1.7478938351e+001;1.6115741268e+001;2.0176605931e+001;1.7903135943e+001;1.4116289173e+001;1.5700839602e+001;1.5267089084e+001;2.1400000000e+002;2.1500000000e+002 +1.0000000000e+000;1.9450473793e+001;1.8002313670e+001;2.0113374691e+001;1.7800940413e+001;1.7271479973e+001;2.0498595122e+001;1.8218770732e+001;1.4221182526e+001;1.6293127745e+001;1.5606089308e+001;2.1500000000e+002;2.1600000000e+002 +1.0000000000e+000;1.8455313466e+001;1.7942301398e+001;1.9466187495e+001;1.7846095265e+001;1.5713645956e+001;1.9987109605e+001;1.8013024240e+001;1.4642924739e+001;1.5357988077e+001;1.5325406208e+001;2.1600000000e+002;2.1700000000e+002 +1.0000000000e+000;1.9100945188e+001;1.7946692939e+001;1.9862372057e+001;1.7695224319e+001;1.6544778589e+001;2.0265462545e+001;1.8101753053e+001;1.4670381301e+001;1.6042225695e+001;1.5500493837e+001;2.1700000000e+002;2.1800000000e+002 +1.0000000000e+000;1.9009377778e+001;1.8267896770e+001;1.9735095034e+001;1.7955831577e+001;1.6571590943e+001;2.0312638953e+001;1.8216927236e+001;1.5097063943e+001;1.6072090886e+001;1.5828773913e+001;2.1800000000e+002;2.1900000000e+002 +1.0000000000e+000;1.8576361468e+001;1.7822836244e+001;1.9299310305e+001;1.7579503724e+001;1.5894236159e+001;1.9929063447e+001;1.7900074769e+001;1.4559852120e+001;1.5600904055e+001;1.5344646537e+001;2.1900000000e+002;2.2000000000e+002 +1.0000000000e+000;1.8976467912e+001;1.7791050864e+001;1.9739498178e+001;1.7511148036e+001;1.6574904471e+001;2.0180680453e+001;1.7927846606e+001;1.4134048176e+001;1.5920112306e+001;1.5365424360e+001;2.2000000000e+002;2.2100000000e+002 +1.0000000000e+000;1.8975557701e+001;1.7645541133e+001;1.9665596321e+001;1.7407230989e+001;1.6560452432e+001;2.0092653698e+001;1.7864974559e+001;1.4165684080e+001;1.5931458041e+001;1.5194742390e+001;2.2100000000e+002;2.2200000000e+002 +1.0000000000e+000;1.8533490185e+001;1.7613463488e+001;1.9279564149e+001;1.7357363999e+001;1.5864564578e+001;1.9861845311e+001;1.7762873977e+001;1.4285966272e+001;1.5546124103e+001;1.5197378932e+001;2.2200000000e+002;2.2300000000e+002 +1.0000000000e+000;1.8880008955e+001;1.7930143792e+001;1.9612033215e+001;1.7671926235e+001;1.6393150590e+001;2.0131328086e+001;1.8015769277e+001;1.4575792029e+001;1.5935654844e+001;1.5522980509e+001;2.2300000000e+002;2.2400000000e+002 +1.0000000000e+000;1.8527590691e+001;1.7546266778e+001;1.9311981754e+001;1.7330406673e+001;1.5909466700e+001;1.9857770200e+001;1.7714197014e+001;1.4015673055e+001;1.5529126683e+001;1.5093883597e+001;2.2400000000e+002;2.2500000000e+002 +1.0000000000e+000;1.8450369171e+001;1.7564132556e+001;1.9322381272e+001;1.7298109300e+001;1.5760287474e+001;1.9781701809e+001;1.7706904654e+001;1.4121088563e+001;1.5396079356e+001;1.5185636597e+001;2.2500000000e+002;2.2600000000e+002 +1.0000000000e+000;1.8626385061e+001;1.7610482143e+001;1.9409076058e+001;1.7375422880e+001;1.5988609055e+001;1.9913073436e+001;1.7778223941e+001;1.4102878213e+001;1.5658840884e+001;1.5214571581e+001;2.2600000000e+002;2.2700000000e+002 +1.0000000000e+000;1.8681731577e+001;1.7673396195e+001;1.9450278394e+001;1.7431634841e+001;1.6149162657e+001;1.9926020707e+001;1.7796347166e+001;1.4296041328e+001;1.5697720279e+001;1.5195015642e+001;2.2700000000e+002;2.2800000000e+002 +1.0000000000e+000;1.8533693825e+001;1.7542774876e+001;1.9336948706e+001;1.7284165861e+001;1.5900017749e+001;1.9826170812e+001;1.7687512522e+001;1.4083643812e+001;1.5574985953e+001;1.5139796572e+001;2.2800000000e+002;2.2900000000e+002 +1.0000000000e+000;1.8466774070e+001;1.7492605611e+001;1.9224225727e+001;1.7237839984e+001;1.5821169248e+001;1.9758657397e+001;1.7649214733e+001;1.4018205350e+001;1.5526009672e+001;1.5104131013e+001;2.2900000000e+002;2.3000000000e+002 +1.0000000000e+000;1.8462048809e+001;1.7502829498e+001;1.9231170885e+001;1.7255184226e+001;1.5847930466e+001;1.9748172905e+001;1.7629872468e+001;1.4079368917e+001;1.5493353060e+001;1.5065616326e+001;2.3000000000e+002;2.3100000000e+002 +1.0000000000e+000;1.8439445021e+001;1.7547804603e+001;1.9258655565e+001;1.7288783800e+001;1.5786841982e+001;1.9743247478e+001;1.7646609539e+001;1.4181752282e+001;1.5464163856e+001;1.5105924849e+001;2.3100000000e+002;2.3200000000e+002 +1.0000000000e+000;1.8453234909e+001;1.7538546371e+001;1.9237427552e+001;1.7266151500e+001;1.5832471237e+001;1.9743402721e+001;1.7646907158e+001;1.4156987494e+001;1.5490376899e+001;1.5121634699e+001;2.3200000000e+002;2.3300000000e+002 +1.0000000000e+000;1.8395096218e+001;1.7470807938e+001;1.9178896291e+001;1.7201965908e+001;1.5755199806e+001;1.9693734604e+001;1.7588032996e+001;1.4071291220e+001;1.5456808512e+001;1.5059912677e+001;2.3300000000e+002;2.3400000000e+002 +1.0000000000e+000;1.8374532027e+001;1.7444964318e+001;1.9159214578e+001;1.7181478139e+001;1.5727841955e+001;1.9675259929e+001;1.7566446780e+001;1.4031552491e+001;1.5418705796e+001;1.5043284899e+001;2.3400000000e+002;2.3500000000e+002 +1.0000000000e+000;1.8349448103e+001;1.7423925209e+001;1.9133747520e+001;1.7167498625e+001;1.5690629858e+001;1.9651198255e+001;1.7545473574e+001;1.4011119552e+001;1.5391446853e+001;1.5005917280e+001;2.3500000000e+002;2.3600000000e+002 +1.0000000000e+000;1.8381474958e+001;1.7430918839e+001;1.9163244390e+001;1.7171671325e+001;1.5771076274e+001;1.9665134735e+001;1.7549515153e+001;1.4024256208e+001;1.5427128263e+001;1.5016984129e+001;2.3600000000e+002;2.3700000000e+002 +1.0000000000e+000;1.8346303131e+001;1.7412314759e+001;1.9130523581e+001;1.7153496486e+001;1.5721854286e+001;1.9634931640e+001;1.7527758600e+001;1.4027330804e+001;1.5385770262e+001;1.4995163186e+001;2.3700000000e+002;2.3800000000e+002 +1.0000000000e+000;1.8327616079e+001;1.7398005256e+001;1.9110739408e+001;1.7138129570e+001;1.5696642368e+001;1.9618409965e+001;1.7513638959e+001;1.4004938281e+001;1.5377845085e+001;1.4985819843e+001;2.3800000000e+002;2.3900000000e+002 +1.0000000000e+000;1.8311045525e+001;1.7383236987e+001;1.9095993596e+001;1.7122335043e+001;1.5676553141e+001;1.9602859624e+001;1.7498707388e+001;1.3990844345e+001;1.5362753175e+001;1.4971430774e+001;2.3900000000e+002;2.4000000000e+002 +1.0000000000e+000;1.8301370637e+001;1.7372210687e+001;1.9085513959e+001;1.7110500709e+001;1.5675962661e+001;1.9590506653e+001;1.7486072519e+001;1.3980896168e+001;1.5354057302e+001;1.4960948168e+001;2.4000000000e+002;2.4100000000e+002 +1.0000000000e+000;1.8287445485e+001;1.7361724360e+001;1.9074925931e+001;1.7101119864e+001;1.5655568670e+001;1.9577854980e+001;1.7475070599e+001;1.3969609885e+001;1.5338021061e+001;1.4951457903e+001;2.4100000000e+002;2.4200000000e+002 +1.0000000000e+000;1.8273023122e+001;1.7345399032e+001;1.9058345788e+001;1.7084819667e+001;1.5641269232e+001;1.9562661032e+001;1.7459863346e+001;1.3956080405e+001;1.5327130828e+001;1.4933447727e+001;2.4200000000e+002;2.4300000000e+002 +1.0000000000e+000;1.8265818471e+001;1.7336504807e+001;1.9048931755e+001;1.7073836741e+001;1.5638333612e+001;1.9553606792e+001;1.7449278334e+001;1.3947225527e+001;1.5323031992e+001;1.4928308806e+001;2.4300000000e+002;2.4400000000e+002 +1.0000000000e+000;1.8255841989e+001;1.7331792799e+001;1.9041763112e+001;1.7068851839e+001;1.5626105577e+001;1.9544349301e+001;1.7442689435e+001;1.3947361176e+001;1.5313632095e+001;1.4922354795e+001;2.4400000000e+002;2.4500000000e+002 +1.0000000000e+000;1.8247226181e+001;1.7320742531e+001;1.9033071103e+001;1.7058014096e+001;1.5619303368e+001;1.9534649144e+001;1.7432808613e+001;1.3934592410e+001;1.5304244818e+001;1.4913017984e+001;2.4500000000e+002;2.4600000000e+002 +1.0000000000e+000;1.8239144648e+001;1.7312338596e+001;1.9025201687e+001;1.7049677046e+001;1.5610771177e+001;1.9526196198e+001;1.7424172999e+001;1.3926771030e+001;1.5298055066e+001;1.4904971203e+001;2.4600000000e+002;2.4700000000e+002 +1.0000000000e+000;1.8231617049e+001;1.7305460152e+001;1.9017183121e+001;1.7042557803e+001;1.5603537162e+001;1.9518298393e+001;1.7416780598e+001;1.3922125820e+001;1.5291714863e+001;1.4898318838e+001;2.4700000000e+002;2.4800000000e+002 +1.0000000000e+000;1.8223568167e+001;1.7298635522e+001;1.9009442156e+001;1.7035587847e+001;1.5595190916e+001;1.9510543920e+001;1.7409656227e+001;1.3915504356e+001;1.5284466742e+001;1.4891984266e+001;2.4800000000e+002;2.4900000000e+002 +1.0000000000e+000;1.8217586649e+001;1.7292957224e+001;1.9003659722e+001;1.7029835027e+001;1.5589051304e+001;1.9504297164e+001;1.7403758169e+001;1.3910712999e+001;1.5279218255e+001;1.4886500006e+001;2.4900000000e+002;2.5000000000e+002 +1.0000000000e+000;1.8212732284e+001;1.7288183689e+001;1.8998828047e+001;1.7024904599e+001;1.5584731188e+001;1.9499188658e+001;1.7398731385e+001;1.3906652905e+001;1.5274985910e+001;1.4882036572e+001;2.5000000000e+002;2.5100000000e+002 +1.0000000000e+000;1.8208520051e+001;1.7284200667e+001;1.8994615699e+001;1.7020812969e+001;1.5580564764e+001;1.9494738606e+001;1.7394542552e+001;1.3903200870e+001;1.5271272894e+001;1.4878320321e+001;2.5100000000e+002;2.5200000000e+002 +1.0000000000e+000;1.8205005120e+001;1.7280830443e+001;1.8991130470e+001;1.7017359932e+001;1.5577110705e+001;1.9491073704e+001;1.7391029610e+001;1.3900224506e+001;1.5268222055e+001;1.4875160878e+001;2.5200000000e+002;2.5300000000e+002 +1.0000000000e+000;1.8202292975e+001;1.7278255296e+001;1.8988435816e+001;1.7014716024e+001;1.5574456895e+001;1.9488242820e+001;1.7388337432e+001;1.3897990713e+001;1.5265870001e+001;1.4872758375e+001;2.5300000000e+002;2.5400000000e+002 +1.0000000000e+000;1.8200348135e+001;1.7276383378e+001;1.8986503513e+001;1.7012799041e+001;1.5572557507e+001;1.9486207320e+001;1.7386389543e+001;1.3896345573e+001;1.5264179322e+001;1.4871008999e+001;2.5400000000e+002;2.5500000000e+002 +1.0000000000e+000;1.8199183044e+001;1.7275264733e+001;1.8985345046e+001;1.7011652433e+001;1.5571420260e+001;1.9484988953e+001;1.7385224257e+001;1.3895366753e+001;1.5263166495e+001;1.4869963415e+001;2.5500000000e+002;2.5600000000e+002 +1.0000000000e+000;1.8198794616e+001;1.7274891809e+001;1.8984958802e+001;1.7011270177e+001;1.5571041047e+001;1.9484582774e+001;1.7384835827e+001;1.3895040210e+001;1.5262828986e+001;1.4869615075e+001;2.5600000000e+002;2.5700000000e+002 +1.0625000000e+000;2.0292043267e+004;2.1319554613e+004;1.9389016871e+004;1.8957431562e+004;1.9623750577e+004;1.8543390728e+004;1.5234834305e+004;2.0929321216e+004;1.8403804604e+004;1.5055361641e+004;; +1.0625000000e+000;8.1177154413e+003;8.2960738438e+003;7.4613606171e+003;6.2431727635e+003;8.1427900408e+003;6.4968450157e+003;4.5125804509e+003;8.0567017044e+003;6.8287512380e+003;4.5897645784e+003;; +1.0625000000e+000;8.1936624429e+003;8.3028119782e+003;9.0694220702e+003;9.2626115735e+003;7.3535722818e+003;8.9468169683e+003;8.5484861019e+003;7.8005370549e+003;7.3653082579e+003;7.3981088446e+003;; +1.0625000000e+000;1.8485920871e+003;1.4571950960e+003;2.4047961116e+003;1.9858131520e+003;1.6657672027e+003;1.7865294566e+003;1.5525199414e+003;1.2753398907e+003;1.3198270298e+003;9.4273224008e+002;; +1.0625000000e+000;3.5214966702e+003;3.0248444640e+003;3.9216437810e+003;3.4254895363e+003;3.5781450369e+003;3.3238672179e+003;3.1218074092e+003;2.9291707850e+003;3.2560859944e+003;2.8125208686e+003;; +1.0625000000e+000;2.9870953975e+003;3.1580846145e+003;2.9145298262e+003;3.1181294255e+003;2.7685428719e+003;3.1586301151e+003;3.0771257018e+003;2.9158528739e+003;2.9660386767e+003;3.2130856681e+003;; +1.0625000000e+000;7.2358120420e+002;1.2461420552e+003;8.5909865108e+002;1.2289544726e+003;6.1279316659e+002;8.3610209660e+002;1.0649346668e+003;1.5180842511e+003;6.9433457656e+002;1.0833728502e+003;; +1.0625000000e+000;9.4664321106e+002;5.7741947116e+002;1.2437246513e+003;7.7473478036e+002;9.7210870086e+002;8.9719392574e+002;6.6957012454e+002;5.9838683285e+002;9.4030090229e+002;4.3637524945e+002;; +1.0625000000e+000;9.6118622082e+002;5.6722410004e+002;1.1272670612e+003;7.4894064131e+002;1.2285334627e+003;7.9018745622e+002;6.3731686116e+002;6.5587178570e+002;9.2429944400e+002;4.6496301656e+002;; +1.0625000000e+000;1.6698005458e+003;1.6427002272e+003;1.6955895223e+003;1.5110817542e+003;1.5780168025e+003;1.7773135923e+003;1.6518940421e+003;1.5161039748e+003;1.5130828181e+003;1.5486342738e+003;; +1.0625000000e+000;4.5703364683e+002;6.2215321031e+002;5.4973982446e+002;6.0847508166e+002;3.4109625980e+002;5.6491036558e+002;6.2193477421e+002;5.4686233687e+002;1.1321788352e+002;5.5015588202e+002;; +1.0625000000e+000;5.6618863716e+002;3.4085085020e+002;5.2823368452e+002;5.4762495955e+002;1.0269181948e+003;4.7212820457e+002;5.3643514830e+002;2.4743277834e+002;8.4718560841e+002;1.5242053831e+002;; +1.0625000000e+000;1.3337098719e+003;1.2599192037e+003;1.1264679209e+003;1.2194029443e+003;1.6762635176e+003;1.0692867096e+003;1.1924485039e+003;1.1992370605e+003;1.4980663860e+003;1.3862945168e+003;; +1.0625000000e+000;6.7926223213e+002;7.9488730262e+002;8.5368786999e+002;8.4341272626e+002;4.4091325783e+002;8.2035662579e+002;8.4008166745e+002;8.7195901326e+002;3.8127518007e+002;7.5902462213e+002;; +1.0625000000e+000;1.0904692345e+003;1.6680365439e+003;1.0509600491e+003;1.6143641381e+003;8.1376520015e+002;1.3577553421e+003;1.6292702561e+003;1.5918950200e+003;1.0322922292e+003;1.6658111586e+003;; +1.0625000000e+000;7.8009303787e+002;1.0130795739e+003;8.4949445830e+002;1.0740844358e+003;6.5750667751e+002;8.9409169136e+002;1.0444010506e+003;8.5764948021e+002;5.9223135643e+002;9.5906434966e+002;; +1.0625000000e+000;9.9155091286e+002;5.4978910290e+002;9.6612129061e+002;7.6006188949e+002;9.7460680467e+002;8.0186490665e+002;6.6771204417e+002;4.6256799397e+002;1.1303589836e+003;4.2686780369e+002;; +1.0625000000e+000;8.3415846361e+002;7.8698843222e+002;8.4134584641e+002;8.0678771782e+002;7.9755558910e+002;7.7234860639e+002;8.3007847837e+002;6.4798255875e+002;9.4252194143e+002;8.9202692046e+002;; +1.0625000000e+000;2.5756058936e+002;4.8384464049e+002;1.8077124590e+002;6.2793600687e+002;1.7026707111e+002;2.6838443336e+002;3.9781521059e+002;3.5415750530e+002;3.8880593914e+002;4.0951756653e+002;; +1.0625000000e+000;2.5400681569e+002;4.3718068745e+002;2.4354734474e+002;5.8775804446e+002;2.0809545056e+002;3.3329465014e+002;5.0724316368e+002;2.3339816987e+002;3.1874134627e+002;4.9250839458e+002;; +1.0625000000e+000;2.6923082928e+002;4.9812870022e+002;2.1010026090e+002;5.5346797763e+002;1.0818285642e+002;3.7464246184e+002;5.6163614909e+002;2.0117058209e+002;3.5222547748e+002;4.9830437915e+002;; +1.0625000000e+000;3.6863023770e+001;1.9504554276e+002;1.4813645496e+002;2.4739363133e+002;3.2712509576e+002;2.0314284281e+002;2.9620253764e+002;4.9771824652e+002;1.2670844771e+002;1.9913727727e+002;; +1.0625000000e+000;5.9661684562e+002;8.7993866062e+002;6.4772143388e+002;7.7117251744e+002;8.7609608808e+002;4.6479109629e+002;4.9263371096e+002;1.3506222340e+003;6.2166729985e+002;8.2016155949e+002;; +1.0625000000e+000;8.9856492955e+002;9.8524861653e+002;8.5835292964e+002;7.8200302006e+002;1.0162455128e+003;7.6925152658e+002;7.8692949713e+002;1.2086458289e+003;8.5550236270e+002;9.7674422852e+002;; +1.0625000000e+000;7.4401336356e+002;6.9490779165e+002;6.1699572732e+002;6.9601515362e+002;9.5619489683e+002;4.6552502047e+002;5.9508312657e+002;7.3755398942e+002;8.4106623221e+002;7.6675192948e+002;; +1.0625000000e+000;7.5375570797e+002;6.4473616510e+002;6.5760783129e+002;6.2790581448e+002;9.3884395536e+002;7.7422209888e+002;6.6607021685e+002;7.2495247395e+002;8.0138467084e+002;6.9349010958e+002;; +1.0625000000e+000;2.3289977175e+002;4.1070869226e+002;1.8763088212e+002;3.3976125053e+002;2.4282911755e+002;1.8791841022e+002;2.5425260906e+002;6.2974083533e+002;2.6773645777e+002;4.2242292825e+002;; +1.0625000000e+000;2.9524070143e+002;2.7525406392e+002;3.7480355882e+002;2.2980332287e+002;2.0540932822e+002;4.0973891830e+002;2.8702812533e+002;3.2727512842e+002;2.7987557805e+002;2.9877461521e+002;; +1.0625000000e+000;7.6934362609e+002;8.5821292744e+002;7.0503936305e+002;7.5660622119e+002;8.9689792848e+002;7.4190265852e+002;7.9490118252e+002;8.9637016088e+002;7.8098050403e+002;7.8706064783e+002;; +1.0625000000e+000;4.6724199608e+002;6.7668384789e+002;5.0565738991e+002;6.5374607112e+002;3.0534595615e+002;5.5657700939e+002;5.9541463447e+002;8.8632309734e+002;4.0017487941e+002;6.1751806878e+002;; +1.0625000000e+000;1.0134975650e+003;5.7645138556e+002;9.3785970975e+002;6.0722538617e+002;1.1954807672e+003;8.4653308421e+002;6.6037602656e+002;5.5340750567e+002;9.4306213185e+002;5.7198650101e+002;; +1.0625000000e+000;4.0557235279e+002;3.1544210274e+002;3.7410893758e+002;2.7953142677e+002;3.5979385374e+002;3.1108930204e+002;3.2970831296e+002;4.6201698189e+002;4.0213425176e+002;3.6070837967e+002;; +1.0625000000e+000;2.9362145850e+002;2.7728495442e+002;3.3964579962e+002;2.4689673562e+002;4.3579459478e+002;2.9877068115e+002;3.2407720319e+002;1.7011692646e+002;3.4004151586e+002;3.4861405609e+002;; +1.0625000000e+000;1.5679026007e+002;2.8651320649e+002;2.0689618164e+002;2.7261558282e+002;1.1405163244e+002;2.9421825318e+002;3.3019924590e+002;2.1065468256e+002;1.7414009359e+002;3.2635231932e+002;; +1.0625000000e+000;6.2508852140e+002;6.6101103836e+002;6.6443481962e+002;6.0739316765e+002;5.8083957996e+002;6.3500248231e+002;6.3183150561e+002;7.0908305953e+002;4.9250020977e+002;6.0663300239e+002;; +1.0625000000e+000;4.8248296649e+002;4.3824916875e+002;3.4782702655e+002;4.0303196127e+002;7.2953169686e+002;5.6041012965e+002;5.4244409098e+002;4.0136278080e+002;5.6543899924e+002;5.0218626332e+002;; +1.0625000000e+000;4.0992520070e+002;1.2221514640e+002;4.0711916962e+002;1.3694431056e+002;4.6330038580e+002;4.4594462228e+002;3.1992226218e+002;3.3111900833e+002;3.7228703082e+002;1.4128173378e+002;; +1.0625000000e+000;2.4678811364e+002;2.1324077712e+001;1.8445315722e+002;8.1899891241e+001;3.3292614104e+002;7.2719118442e+001;1.1816584251e+002;2.2349237230e+002;3.1239324347e+002;7.4664386818e+001;; +1.0625000000e+000;3.3857376251e+002;4.2827842982e+002;3.5434057783e+002;4.1147136019e+002;1.5342393399e+002;4.5211618548e+002;4.6721617362e+002;3.3303199818e+002;4.2621832029e+002;4.2818614066e+002;; +1.0625000000e+000;3.3191261434e+002;4.0103893166e+002;4.1523968896e+002;3.7403207460e+002;3.4671932779e+002;3.6266278957e+002;3.9764048000e+002;3.8923879281e+002;3.1890343295e+002;4.9923850700e+002;; +1.0625000000e+000;4.7848583668e+002;7.7328228716e+002;4.9260654932e+002;7.1582026242e+002;4.0574398140e+002;5.3509266093e+002;6.4954380353e+002;8.7028568401e+002;4.8408409763e+002;7.0761912800e+002;; +1.0625000000e+000;5.9239106412e+002;7.1807862272e+002;5.6701424262e+002;6.1095637701e+002;6.6396771742e+002;4.8321782097e+002;5.7919929920e+002;9.2914032908e+002;5.8550111382e+002;6.5873960023e+002;; +1.0625000000e+000;5.6816465444e+002;5.1530427252e+002;4.5436622798e+002;4.1215792677e+002;9.1172940765e+002;3.7188368995e+002;4.1545748002e+002;6.6093192862e+002;5.3532685817e+002;4.7612563216e+002;; +1.0625000000e+000;6.1637660976e+002;4.9508276492e+002;5.2857484236e+002;4.0129825855e+002;8.5011584139e+002;4.5506214917e+002;3.9817565089e+002;6.9077034870e+002;7.1777341179e+002;4.9333636739e+002;; +1.0625000000e+000;7.3078628605e+002;5.4182708160e+002;6.3595852425e+002;4.8077094932e+002;1.0945809353e+003;5.1710671528e+002;4.8394605489e+002;5.5620693113e+002;7.5560018059e+002;5.8055825147e+002;; +1.0625000000e+000;1.1448864928e+002;3.4916983281e+002;2.5133260867e+001;2.1851118441e+002;1.2233245829e+002;7.8269395462e+001;1.2547955274e+002;6.5390177095e+002;8.7927072509e+001;3.4721013043e+002;; +1.0625000000e+000;4.7673707524e+002;1.3124867298e+002;3.9921215653e+002;9.5849359759e+001;8.8096401901e+002;2.7128301788e+002;6.2991385996e+001;3.6075863789e+002;5.1296593749e+002;9.1352790992e+001;; +1.0625000000e+000;2.2852086881e+002;1.6298798844e+002;3.3232655856e+002;2.0942039803e+002;1.0151908912e+002;2.6179740033e+002;2.5324307188e+002;1.2736443608e+002;2.6134379067e+002;1.3385121443e+002;; +1.0625000000e+000;2.6146520433e+002;3.0586801562e+002;2.5913110059e+002;2.6092500696e+002;1.6348129008e+002;2.8393069681e+002;2.9317683648e+002;4.7620762775e+002;3.2333244582e+002;3.0117999393e+002;; +1.0625000000e+000;7.4491347110e+002;6.4171619727e+002;5.0498789193e+002;5.7453096578e+002;6.8681504148e+002;6.9711109924e+002;6.5092656523e+002;6.6901642369e+002;8.9218145984e+002;6.6900247432e+002;; +1.0625000000e+000;6.8010513212e+002;1.2994550045e+002;2.0993683090e+002;1.5306813914e+002;8.7395744630e+002;3.6817996392e+002;4.9502463208e+002;2.6185018274e+002;5.9371834419e+002;2.8485825788e+002;; +1.0625000000e+000;1.1405420548e+002;3.6717148063e+002;1.1102444308e+002;2.8908775534e+002;1.8898703402e+002;5.3108553425e+001;2.1592253237e+002;6.9712378275e+002;1.6160915468e+002;3.4235617255e+002;; +1.0625000000e+000;3.3689100171e+002;4.1162246598e+002;3.4819587945e+002;3.9962920925e+002;5.6505623484e+002;3.5513203170e+002;3.8124454902e+002;6.4032326678e+002;3.2709082758e+002;3.5712177677e+002;; +1.0625000000e+000;5.6013082475e+002;2.4646862428e+002;4.9959401300e+002;2.7633701840e+002;6.4777281137e+002;3.9788605934e+002;2.6817962814e+002;4.1431919706e+002;6.3263807194e+002;1.3679715389e+002;; +1.0625000000e+000;8.5823073453e+002;7.7335570164e+002;7.3015872732e+002;7.2995430909e+002;8.3781344011e+002;7.2258193858e+002;7.0451344951e+002;7.7416130815e+002;9.1964707027e+002;7.6905063845e+002;; +1.0625000000e+000;6.2587196329e+002;2.5636978443e+002;4.5964465873e+002;2.4905127102e+002;8.9527103007e+002;4.2992833765e+002;2.6301010424e+002;9.9523518654e+001;6.8840587725e+002;2.8704734381e+002;; +1.0625000000e+000;5.1523336919e+002;5.7151721470e+002;4.9286999337e+002;4.9524796771e+002;7.4524420295e+002;4.2619171125e+002;4.5363264970e+002;6.5205554513e+002;5.3235552710e+002;5.7334598728e+002;; +1.0625000000e+000;5.8149827608e+002;4.2375504856e+002;5.4501696024e+002;4.5071384116e+002;8.0424154367e+002;4.8021426809e+002;4.6701103841e+002;4.5150723256e+002;6.2916873130e+002;4.4811466885e+002;; +1.0625000000e+000;6.0391431419e+002;7.0926705861e+002;5.4805615455e+002;6.1093477208e+002;8.2697807248e+002;5.8250805607e+002;6.1997593517e+002;8.4672615533e+002;6.3777833525e+002;7.1146686067e+002;; +1.0625000000e+000;6.3807983225e+002;5.5389988499e+002;5.2203369311e+002;5.4188676469e+002;7.2534139538e+002;5.6313861839e+002;4.7900409904e+002;9.3574788385e+002;7.7966583294e+002;4.4239054446e+002;; +1.0625000000e+000;7.4553700299e+002;6.4092667831e+002;6.9072748881e+002;5.7586834409e+002;1.0128184863e+003;5.8506668586e+002;5.2087771313e+002;7.0435195630e+002;6.8443025697e+002;6.3864424348e+002;; +1.0625000000e+000;4.7640887645e+002;2.9555853944e+002;3.8106036521e+002;2.7356104914e+002;5.9897530193e+002;4.3494166147e+002;3.5677749511e+002;3.1741987408e+002;4.7621615501e+002;3.0307885119e+002;; +1.0625000000e+000;2.0874977226e+002;3.7179265598e+002;1.6099342517e+002;3.5034883572e+002;3.5259413018e+002;9.1648905234e+001;1.8538635138e+002;5.9748324898e+002;2.3901361574e+002;2.4362964126e+002;; +1.0625000000e+000;2.4886088964e+002;1.4179074450e+002;2.1334825247e+002;1.9954126203e+002;3.2690890953e+002;2.2402051475e+002;1.7762468791e+002;1.7872368960e+002;2.3535209923e+002;2.2389697643e+002;; +1.0625000000e+000;5.5541490008e+002;3.9449154228e+002;5.1181354978e+002;3.8324420465e+002;8.7694535742e+002;3.7613446161e+002;3.2473970761e+002;4.1670324085e+002;5.1558279209e+002;3.6362355159e+002;; +1.0625000000e+000;5.5957278939e+002;5.4546850978e+002;5.2631907793e+002;5.0356600690e+002;6.3828250097e+002;4.4891571914e+002;4.2384542838e+002;7.6177543215e+002;6.1304281218e+002;4.5895643700e+002;; +1.0625000000e+000;5.0823102304e+002;4.7271042057e+002;4.3463904879e+002;4.3053346867e+002;7.8409068539e+002;3.9160124940e+002;3.9105944048e+002;6.7636773987e+002;5.3412167992e+002;3.6581390331e+002;; +1.0625000000e+000;4.0287755450e+002;6.3214975617e+002;4.0306129078e+002;5.7014509926e+002;3.3819388900e+002;4.1382971260e+002;5.1375546666e+002;7.4509077543e+002;4.5697216328e+002;6.1331594554e+002;; +1.0625000000e+000;6.1402969951e+002;4.5013156103e+002;4.8017112985e+002;3.9760861255e+002;1.0789852406e+003;4.1549754414e+002;3.6947677597e+002;6.4088455448e+002;5.6849860978e+002;4.0367741403e+002;; +1.0625000000e+000;3.8617296188e+002;3.3269156093e+002;4.0755073235e+002;2.9205605541e+002;4.2049185595e+002;3.3577201083e+002;3.0727755982e+002;3.2916023932e+002;4.4486554463e+002;3.1672481653e+002;; +1.0625000000e+000;4.9018958154e+002;4.5266167346e+002;5.1912144890e+002;4.0107395216e+002;5.9913453276e+002;4.0077903258e+002;3.9633587566e+002;5.6453744047e+002;4.7501343309e+002;4.1402092258e+002;; +1.0625000000e+000;4.3773531984e+002;1.2955773925e+002;3.4354199324e+002;1.1248079257e+002;7.1811858917e+002;2.2860732250e+002;1.1919499119e+002;2.5057494484e+002;4.7186344488e+002;8.5755890450e+001;; +1.0625000000e+000;3.1138640560e+002;3.9277012440e+002;2.6529038279e+002;3.5453109676e+002;2.2494530058e+002;2.6146076067e+002;2.9521413741e+002;4.1115424325e+002;3.7010948655e+002;4.7858475738e+002;; +1.0625000000e+000;4.5777188218e+002;4.8780520119e+002;3.8588168519e+002;4.2385446942e+002;5.9895281335e+002;3.8579117596e+002;4.0148602068e+002;5.5408264352e+002;5.3658186153e+002;4.3374638262e+002;; +1.0625000000e+000;3.6258294048e+002;3.2457347597e+002;3.1645343938e+002;2.0775693827e+002;6.3997193333e+002;1.5268261270e+002;2.1000990885e+002;3.2630615096e+002;3.6962122339e+002;3.5421689297e+002;; +1.0625000000e+000;2.8166607278e+002;8.8396371279e+001;2.9480909063e+002;5.4674114676e+001;4.1169887257e+002;1.2700832365e+002;1.1828930643e+001;2.9611562659e+002;3.3739233550e+002;3.7981552650e+001;; +1.0625000000e+000;2.3472756557e+002;1.1211093586e+002;1.6034179420e+002;1.3530576348e+002;5.1578558677e+002;1.2331901794e+002;1.0582954668e+002;2.7707830436e+002;2.2251248777e+002;1.0972553760e+002;; +1.0625000000e+000;4.1886704493e+002;2.4642394215e+002;3.0338389698e+002;1.0408588294e+002;5.5209244483e+002;2.0656902626e+002;4.0933300562e+001;5.8153834967e+002;5.2799349725e+002;2.4311080957e+002;; +1.0625000000e+000;1.6737086538e+002;1.5353269277e+002;8.8910277565e+001;1.8121940561e+002;1.7538464429e+002;1.6948480464e+002;1.9433315518e+002;8.1681022269e+001;2.3102185547e+002;1.4365008569e+002;; +1.0625000000e+000;1.7897154449e+002;2.5717486135e+002;2.1284663149e+002;2.7071900160e+002;2.7705709935e+002;1.7859995154e+002;2.1217856478e+002;2.3047296614e+002;1.8484190406e+002;2.9853233799e+002;; +1.0625000000e+000;8.5807240647e+001;8.2366614117e+001;6.3395128776e+001;6.2378899645e+001;1.3770454069e+002;5.8322883831e+001;2.6738579432e+001;2.6654943212e+002;1.8160613997e+002;2.9707401202e+001;; +1.0625000000e+000;7.4844644289e+002;4.9715314982e+002;6.2996749047e+002;4.1735541104e+002;1.1437516676e+003;4.9943603045e+002;3.5982934649e+002;7.2981537879e+002;7.9342902730e+002;4.5361474928e+002;; +1.0625000000e+000;5.1682656912e+002;5.1727384080e+002;3.9764441123e+002;4.4347264040e+002;8.3276252119e+002;4.0008189219e+002;3.6435433933e+002;8.2732953979e+002;5.4095373632e+002;4.3574491144e+002;; +1.0625000000e+000;5.8480555183e+002;4.8081979944e+002;6.1219679445e+002;4.5552858595e+002;7.3844495328e+002;4.2167589007e+002;3.6610557402e+002;7.2623296668e+002;5.6381398297e+002;3.9668600961e+002;; +1.0625000000e+000;2.7345884827e+002;3.7360128239e+002;2.6505265113e+002;3.0384566682e+002;2.9340145968e+002;2.5786624197e+002;3.0716375557e+002;5.3083774057e+002;1.6808055357e+002;3.4601625530e+002;; +1.0625000000e+000;3.6624929704e+002;2.3317895313e+002;2.6003907656e+002;2.1477883285e+002;3.9087717882e+002;2.2072131293e+002;2.0657576360e+002;4.6493804924e+002;4.5271032147e+002;1.8549023892e+002;; +1.0625000000e+000;3.5276981575e+002;3.3298619372e+002;2.6205425664e+002;2.9480941813e+002;3.1695886400e+002;2.8273750989e+002;2.7174028143e+002;5.0374568018e+002;4.5121201403e+002;2.8083726495e+002;; +1.0625000000e+000;1.0922665259e+002;9.0808457703e+001;8.3806257389e+001;7.5154240647e+001;4.1860788972e+002;4.8945083868e+001;4.0494390993e+001;2.9693317024e+002;1.1731532314e+002;2.0824432702e+001;; +1.0625000000e+000;1.2808859661e+002;2.3608673619e+002;9.7870298727e+001;2.6162701362e+002;1.9490704376e+002;6.4758954833e+001;1.0862650286e+002;4.1583264288e+002;1.9153736245e+002;1.6564541742e+002;; +1.0625000000e+000;7.0001213113e+001;4.1539389074e+002;9.7739352025e+001;3.7905767698e+002;4.6023645867e+002;1.6413724207e+002;2.8233768853e+002;5.4221567890e+002;1.2649279922e+002;3.1564784835e+002;; +1.0625000000e+000;4.4897112399e+002;3.2357748680e+002;4.0971706826e+002;2.9240004533e+002;7.3545385708e+002;3.3522529240e+002;2.9520930214e+002;3.4313477072e+002;4.2940851945e+002;3.3643237005e+002;; +1.0625000000e+000;3.0661595108e+002;2.7493896707e+002;2.1823200026e+002;2.8657157435e+002;4.6583482525e+002;2.3556763502e+002;2.4813779050e+002;3.3569273945e+002;3.6351269979e+002;2.1942353150e+002;; +1.0625000000e+000;1.4285902124e+002;2.9659548073e+002;1.6503853912e+002;2.7847377004e+002;2.0214969647e+002;1.7031704396e+002;2.5170187110e+002;3.3958580633e+002;7.8854546582e+001;2.2725321695e+002;; +1.0625000000e+000;2.4799857163e+002;1.5923445440e+002;2.4603632419e+002;9.4732798329e+001;4.0669734318e+002;1.5525153406e+002;9.3114187644e+001;3.4424640631e+002;2.3193499093e+002;9.7909729220e+001;; +1.0625000000e+000;5.9336295008e+002;5.1290569344e+002;5.4378021344e+002;4.9653044394e+002;8.9532319864e+002;4.7716213891e+002;4.1783145491e+002;5.9025425296e+002;6.5757804483e+002;5.2142808343e+002;; +1.0625000000e+000;3.9404733622e+002;3.0693131178e+002;3.8880942174e+002;3.1314193181e+002;5.1056056702e+002;3.5191315233e+002;2.8551086081e+002;4.9434368875e+002;4.2697906249e+002;2.6783102450e+002;; +1.0625000000e+000;1.9139019156e+002;9.0939824306e+001;1.0954885748e+002;4.5962839385e+001;2.0651848606e+002;1.3516245506e+002;7.1055294670e+001;2.9345689688e+002;2.7284883006e+002;1.2468800530e+002;; +1.0625000000e+000;1.4593092714e+002;1.6726066525e+002;1.7416355393e+002;1.3925058550e+002;1.8652871437e+002;9.2775255758e+001;1.2251902938e+002;1.2916310448e+002;9.1588885436e+001;1.6314933728e+002;; +1.0625000000e+000;1.6504220488e+002;4.0506832960e+002;3.1472467900e+002;2.8794885339e+002;3.4887582012e+002;1.9161986628e+002;2.6677871252e+002;4.6128849737e+002;1.4513501485e+002;4.6785427762e+002;; +1.0625000000e+000;7.8309678095e+001;1.9915471893e+002;1.2085735272e+002;1.9885765578e+002;2.1687595913e+002;8.3168941554e+001;9.1895154947e+001;3.0948066627e+002;1.7976373620e+001;1.6748192825e+002;; +1.0625000000e+000;9.5472967649e+001;9.0419362636e+001;8.5139649488e+001;1.2027563336e+002;1.9048154838e+002;7.8423282619e+001;1.0410540875e+002;7.9806027707e+001;1.3605503488e+002;8.8259540402e+001;; +1.0625000000e+000;1.7198746664e+002;8.7021302864e+001;2.5015672403e+002;1.4066748691e+002;4.6475997843e+002;1.2133620831e+002;1.2358371441e+002;3.2587752671e+002;6.2751363655e+001;1.9409212090e+001;; +1.0625000000e+000;2.0952446430e+002;2.8216248526e+002;1.0161890644e+002;2.4466125018e+002;2.5701338801e+002;1.5296296431e+002;1.8091519726e+002;2.8954444944e+002;3.9633680608e+002;3.4015923778e+002;; +1.0625000000e+000;5.0147466985e+002;3.9585782900e+002;4.4140561681e+002;3.5182468561e+002;7.4506658524e+002;3.4243560960e+002;2.8991391885e+002;6.9850798113e+002;5.1122677008e+002;3.4272521631e+002;; +1.0625000000e+000;2.5375490904e+002;3.5425905360e+002;2.6905416261e+002;2.9302468707e+002;4.7414714011e+002;1.8054235338e+002;1.9774163294e+002;8.3554290338e+002;3.1555596899e+002;2.5256187893e+002;; +1.0625000000e+000;4.8066331847e+002;1.7634688596e+002;4.1500611455e+002;1.7374997833e+002;6.1967011189e+002;3.0019943791e+002;1.9321688544e+002;3.3666740956e+002;5.6309095625e+002;1.1221734057e+002;; +1.0625000000e+000;3.1743015126e+002;1.6918981614e+002;2.4130691197e+002;1.3249255518e+002;3.3885025052e+002;2.4538426504e+002;1.9061578357e+002;1.1006301701e+002;3.8313501418e+002;2.1784402535e+002;; +1.0625000000e+000;4.7104144662e+002;3.0750594060e+002;3.8914577902e+002;2.7842846443e+002;7.2542448784e+002;2.6854623807e+002;2.3518173161e+002;5.2800127086e+002;4.1154770555e+002;2.0820528893e+002;; +1.0625000000e+000;2.6397441661e+002;1.2774409651e+002;1.5238354203e+002;8.9107474280e+001;3.0059798842e+002;1.2557252357e+002;6.2977706562e+001;2.4824953084e+002;3.4176593832e+002;1.1071144440e+002;; +1.0625000000e+000;3.8532386797e+002;4.0473196744e+002;3.3708202123e+002;3.8358915686e+002;5.6183183199e+002;3.0636355377e+002;3.1829476425e+002;5.2792598803e+002;3.8163147544e+002;3.4900228672e+002;; +1.0625000000e+000;3.5999536966e+001;1.4964946626e+002;1.4949887722e+002;1.7387066013e+002;1.8667540546e+001;5.6034212123e+001;1.1037662573e+002;2.0112821783e+002;5.0024329336e+001;1.0259364779e+002;; +1.0625000000e+000;4.1625894723e+002;3.0183388309e+002;4.0228920181e+002;3.1954724386e+002;5.6595451209e+002;3.0578619810e+002;2.5802348276e+002;4.4664007678e+002;3.8252027047e+002;2.4739234828e+002;; +1.0625000000e+000;1.8152019613e+002;1.4646428689e+002;1.2033422264e+002;1.1267285928e+002;2.4513645128e+002;1.0266873026e+002;8.2235619200e+001;2.2127779067e+002;2.1065983821e+002;1.0307268924e+002;; +1.0625000000e+000;2.1193656385e+002;2.4218057542e+002;2.4827219594e+002;1.5508796708e+002;2.9193358373e+002;1.0985146881e+002;4.5874037888e+001;4.6953359777e+002;1.9709329825e+002;2.2902088313e+002;; +1.0625000000e+000;1.5437186699e+002;1.2597246839e+002;1.2082095368e+002;1.3158485238e+002;7.1271273216e+001;1.3539635971e+002;1.2696029467e+002;2.4561138472e+002;2.5247980309e+002;1.1911787549e+002;; +1.0625000000e+000;4.5959306750e+002;3.7396358880e+002;4.0513601692e+002;3.2521214059e+002;5.1734166447e+002;3.4196472658e+002;3.0080531656e+002;3.6929846031e+002;5.1334630460e+002;3.6867911253e+002;; +1.0625000000e+000;1.6950466354e+002;2.9708616153e+002;2.0831583277e+002;2.9019913141e+002;1.7900549866e+002;1.5064206546e+002;2.0228161112e+002;4.7556618001e+002;1.9390622591e+002;2.6561482508e+002;; +1.0625000000e+000;5.8955720748e+001;1.3084329924e+002;2.4965419659e+001;1.2809812327e+002;1.8826213357e+002;6.3231078791e+001;8.7928605663e+001;1.0584007703e+002;1.3677928142e+002;1.6498423751e+002;; +1.0625000000e+000;3.2786835086e+002;1.0876065098e+002;1.8372027125e+002;7.0284962537e+001;5.7524651862e+002;1.5705002767e+002;9.4492870404e+001;2.0273586493e+002;3.8683037499e+002;9.4656002712e+001;; +1.0625000000e+000;8.3076044270e+001;1.3795929701e+002;1.2911294564e+002;1.1471134421e+002;1.1638444140e+002;7.1278865463e+001;4.6684563890e+001;2.9419028630e+002;1.0381696656e+002;8.0866946636e+001;; +1.0625000000e+000;2.0999159852e+002;4.1477458365e+002;1.9460277565e+002;3.6971802874e+002;1.2157145595e+002;2.1061685056e+002;2.9953211177e+002;6.1537331156e+002;2.4013438209e+002;3.8147188086e+002;; +1.0625000000e+000;2.6608357546e+002;3.6850179360e+001;2.7157508460e+002;8.3518757432e+001;3.6594379756e+002;1.6399090834e+002;8.2943823502e+001;9.1822599290e+001;2.4325950773e+002;5.1104499575e+001;; +1.0625000000e+000;3.7545089271e+002;2.5403158458e+002;3.7233134216e+002;2.1700628180e+002;6.1085701707e+002;2.6644948732e+002;2.1078909445e+002;2.2992607476e+002;3.5118178570e+002;2.5197843183e+002;; +1.0625000000e+000;2.8322106468e+001;1.3538477732e+002;5.2526732072e+001;8.7908783458e+001;4.9518757111e+001;3.6045863070e+001;1.0226372071e+002;3.2064892781e+002;1.6490742481e+001;1.3574011753e+002;; +1.0625000000e+000;2.6937312169e+002;1.6762605033e+002;2.7213716936e+002;1.6426646492e+002;3.8303054873e+002;2.0806101622e+002;1.5216535868e+002;2.1573542972e+002;2.7370982997e+002;2.1470375984e+002;; +1.0625000000e+000;1.6928514357e+002;2.2999621777e+002;1.5281365748e+002;1.9997515849e+002;2.0529155195e+002;1.3722257552e+002;1.6016383497e+002;3.5177418171e+002;1.7213649601e+002;2.1556392669e+002;; +1.0625000000e+000;2.6935263053e+002;1.6981654293e+002;2.0454464119e+002;1.4558695384e+002;3.9367284701e+002;1.7169801146e+002;1.3701749389e+002;2.0382655096e+002;3.2397734398e+002;1.5958848747e+002;; +1.0625000000e+000;1.6213970485e+002;1.7761098900e+002;1.7548083304e+002;1.1847334519e+002;1.9753972957e+002;1.1451641132e+002;9.1436877273e+001;2.8884289297e+002;1.8009021505e+002;1.6102796329e+002;; +1.0625000000e+000;7.9696899665e+001;3.8542338796e+001;9.9926142131e+001;3.5790408657e+001;1.4037507716e+002;4.4212525597e+001;1.4376231512e+001;1.9830868874e+002;3.7225674692e+001;3.4354770036e+001;; +1.0625000000e+000;2.0570666045e+002;1.4928518606e+002;1.6978246174e+002;1.2911054903e+002;4.1394683522e+002;1.3387098156e+002;1.3036511016e+002;1.5385520767e+002;1.1249507021e+002;1.9774650317e+002;; +1.0625000000e+000;6.9297507284e+001;5.1430990082e+001;1.9800517082e+001;3.4954969889e+001;1.3117562949e+002;3.9562186224e+001;2.5181718346e+001;2.5033539343e+002;6.0593488593e+001;1.3574253169e+001;; +1.0625000000e+000;1.6359767898e+002;1.9269033194e+002;1.0632627527e+002;1.8268747579e+002;1.7385220609e+002;1.3201148360e+002;1.3628152251e+002;3.5345534408e+002;2.4443174083e+002;1.4874567483e+002;; +1.0625000000e+000;9.0619332115e+001;1.4717776507e+002;9.6843394728e+001;1.5054828843e+002;1.1691386654e+002;7.3590357914e+001;7.9107980479e+001;2.5838493585e+002;1.1701906751e+002;1.1599297126e+002;; +1.0625000000e+000;1.3474350809e+002;2.4779308742e+002;8.5433814368e+001;2.4282563252e+002;2.6109886073e+002;1.0218436555e+002;1.6171142033e+002;4.2737177544e+002;1.7395713187e+002;1.6417307462e+002;; +1.0625000000e+000;1.9792522908e+002;2.2526373848e+002;1.7140963185e+002;2.1998356151e+002;3.2759752774e+002;1.6282726742e+002;1.7610349598e+002;3.3040748127e+002;2.2460563046e+002;1.6457223403e+002;; +1.0625000000e+000;3.4624350996e+001;7.9817729510e+001;2.5968052947e+001;7.0859279795e+001;4.9912060057e+001;2.3907221458e+001;4.1902636054e+001;1.0539800642e+002;3.6379843010e+001;6.6244994593e+001;; +1.0625000000e+000;8.4580891949e+001;1.0744373439e+002;6.3766905910e+001;6.3626493444e+001;1.5132781359e+002;6.4371084421e+001;7.0478773001e+001;1.9927897054e+002;1.1083121728e+002;1.2316267582e+002;; +1.0625000000e+000;1.0476953957e+002;1.1079497161e+002;9.1590008692e+001;5.8984653079e+001;9.5846742399e+001;7.0230348052e+001;4.8304483883e+001;2.1440033685e+002;1.5682654482e+002;1.2150548102e+002;; +1.0625000000e+000;1.6880359204e+002;1.3960050553e+002;1.2770007118e+002;1.1280107534e+002;1.2569160525e+002;1.4516758270e+002;1.2441049775e+002;2.0337939560e+002;2.5624173098e+002;1.1782475237e+002;; +1.0625000000e+000;1.0116654106e+002;1.2900388624e+002;6.6351055143e+001;1.1758751234e+002;1.5799725461e+002;9.0450272707e+001;1.0107728612e+002;2.1227117209e+002;1.2199545826e+002;1.1787346781e+002;; +1.0625000000e+000;3.0047991677e+001;8.1946507033e+001;3.3167010915e+001;6.7283813227e+001;3.2175621376e+001;3.4999933262e+001;5.1955937241e+001;1.0968104968e+002;4.4903977956e+001;1.0029761501e+002;; +1.0625000000e+000;1.6531778544e+002;7.5954860973e+001;1.3337105252e+002;7.6398062355e+001;2.7651200739e+002;1.1121038932e+002;7.1749770860e+001;9.7848918109e+001;1.4312234247e+002;7.7835088550e+001;; +1.0625000000e+000;1.8105858245e+002;9.4688786996e+001;1.5305749162e+002;6.9769749826e+001;3.2155117094e+002;1.1332123257e+002;8.1105948056e+001;8.1199086662e+001;1.6676079236e+002;1.2781926909e+002;; +1.0625000000e+000;7.5243474806e+001;1.2200569748e+002;8.9401538072e+001;8.7235566877e+001;4.4576875241e+001;6.4760776786e+001;7.3993040450e+001;2.1851155702e+002;7.2454232989e+001;9.7287341493e+001;; +1.0625000000e+000;2.2781985325e+001;4.0280149919e+001;1.2020540106e+001;2.5240401167e+001;4.0437639513e+001;1.6706255197e+001;2.7447503424e+001;7.1045393659e+001;4.0514892444e+001;5.4518174334e+001;; +1.0625000000e+000;1.4122692118e+002;9.6003259481e+001;1.2094837847e+002;7.3923628909e+001;1.8963671643e+002;9.6677288230e+001;7.0472971706e+001;1.5672916309e+002;1.6029671755e+002;8.9392785444e+001;; +1.0625000000e+000;6.3131755235e+001;6.9261504216e+001;4.8622977769e+001;5.3816718335e+001;1.4491521838e+002;4.8639369273e+001;6.4541405641e+001;7.2277711814e+001;7.5023203783e+001;7.3651571470e+001;; +1.0625000000e+000;5.1895265714e+001;6.7354217090e+001;6.5698889508e+001;8.4143908327e+001;4.5789574039e+001;6.6514399583e+001;6.2151235744e+001;7.7666470707e+001;6.6911903602e+001;6.8355988803e+001;; +1.0625000000e+000;1.0462019497e+002;1.1964778346e+002;1.0653383942e+002;9.9567271938e+001;1.4487542212e+002;8.1304090076e+001;7.8738759154e+001;1.6032693106e+002;7.8144743403e+001;1.0029021785e+002;; +1.0625000000e+000;2.9070911657e+001;7.5512901569e+001;1.4954260409e+001;7.7902534119e+001;4.9197362569e+001;3.7498468891e+001;5.6024906873e+001;1.1723039317e+002;3.1855963710e+001;5.3651666544e+001;; +1.0625000000e+000;1.0664179674e+002;2.4594598845e+002;3.0736951561e+001;2.1400372359e+002;1.0452031161e+002;1.0699671127e+002;1.9928649487e+002;2.4974455848e+002;1.2146203641e+002;2.7258721361e+002;; +1.0625000000e+000;8.3474706718e+001;9.9370583232e+001;6.0580693001e+001;8.7331789938e+001;1.4552929605e+002;6.3499630599e+001;6.9325861274e+001;1.3054456314e+002;5.6663175126e+001;7.9196032745e+001;; +1.0625000000e+000;1.1974140732e+002;1.5651954225e+002;1.0066184447e+002;1.3100723536e+002;1.5561791026e+002;9.5960116345e+001;1.0794548341e+002;2.1019633635e+002;1.2438867631e+002;1.3993170026e+002;; +1.0625000000e+000;7.4021033697e+001;6.6948842828e+001;6.7308799614e+001;4.9052930378e+001;1.4939495058e+002;4.6101212173e+001;3.8405289039e+001;9.2738848854e+001;6.9186717690e+001;6.4509233144e+001;; +1.0625000000e+000;2.5049886618e+001;5.2494222468e+001;1.5680941029e+001;2.5407137264e+001;4.6931437572e+001;1.9583355934e+001;1.8659958821e+001;6.6791526598e+001;2.9597969656e+001;6.1423382730e+001;; +1.0625000000e+000;4.3270419529e+001;8.2795357324e+001;5.3022838293e+001;7.2072406067e+001;4.2524393533e+001;4.9676293471e+001;6.2429556440e+001;1.1521985286e+002;4.1116794482e+001;6.8729306821e+001;; +1.0625000000e+000;4.8988250907e+001;3.5382681202e+001;3.5406533465e+001;3.4255220575e+001;8.0860320970e+001;2.3310901974e+001;1.5679274694e+001;9.2524186513e+001;5.6771062217e+001;2.1022087868e+001;; +1.0625000000e+000;2.2772055071e+001;4.4700962990e+001;1.5808820108e+001;4.8571284232e+001;6.0590227524e+000;2.7707554842e+001;3.6866466552e+001;7.9638950564e+001;3.8580377594e+001;3.3254189001e+001;; +1.0625000000e+000;6.7443953548e+001;5.7919664021e+001;6.2687161208e+001;4.8589407685e+001;9.6937735482e+001;5.1328571373e+001;4.5955674455e+001;1.0279661944e+002;6.0910919570e+001;4.0779551388e+001;; +1.0625000000e+000;5.3716241327e+001;5.1914009377e+001;3.1166393256e+001;4.2769470142e+001;9.5598498255e+001;3.6222052670e+001;3.3341798253e+001;7.0346166876e+001;6.7802676125e+001;4.1280189719e+001;; +1.0625000000e+000;5.5741988729e+001;6.5689665629e+001;4.2811510159e+001;5.8700240021e+001;4.4447238435e+001;5.3476603497e+001;5.1832645733e+001;8.3376106844e+001;8.0354612331e+001;5.9604526506e+001;; +1.0625000000e+000;5.0219925286e+001;5.3221697433e+001;3.9457105345e+001;4.3436387619e+001;5.3356433416e+001;4.7140423593e+001;4.2969537843e+001;5.3587992788e+001;5.9945924795e+001;5.8108324528e+001;; +1.0625000000e+000;7.1934515868e+001;4.0568004535e+001;4.4169462588e+001;4.2587378758e+001;9.8630287763e+001;5.4031767596e+001;3.9094131939e+001;5.2747152844e+001;8.1022144132e+001;3.3986178825e+001;; +1.0625000000e+000;4.8148131224e+001;7.8361598901e+001;3.5609658495e+001;7.2566121118e+001;4.4447702482e+001;4.5903252257e+001;5.8173823945e+001;1.1287823322e+002;5.6756028204e+001;5.6900911036e+001;; +1.0625000000e+000;5.3640071061e+001;2.9682535177e+001;5.4599113064e+001;2.8539550319e+001;7.5849215350e+001;4.2863922361e+001;3.5638703243e+001;1.0495356604e+001;5.8862663617e+001;3.6110170654e+001;; +1.0625000000e+000;6.1501531944e+001;5.1449911647e+001;5.6987876502e+001;4.1269967485e+001;7.2137407878e+001;4.6852772275e+001;4.1733892989e+001;9.1625864862e+001;6.8067428809e+001;4.1254005029e+001;; +1.0625000000e+000;3.3070120185e+001;5.5188664683e+001;2.2432811653e+001;4.6356871723e+001;2.5826747924e+001;3.4388447257e+001;4.2913795204e+001;6.7714752907e+001;4.1758189236e+001;5.4638506845e+001;; +1.0625000000e+000;4.3133283712e+001;4.2476172760e+001;3.0326883773e+001;3.5590777645e+001;3.3954174049e+001;4.0187152572e+001;3.6093380938e+001;5.2787551806e+001;5.6303492699e+001;3.8876804480e+001;; +1.0625000000e+000;3.3957909422e+001;3.2569113266e+001;2.7161673708e+001;3.5377026320e+001;3.1240983824e+001;3.5191483498e+001;3.3326040177e+001;2.8069204100e+001;4.4670990886e+001;2.9580757074e+001;; +1.0625000000e+000;6.6363404646e+001;5.7648811774e+001;5.1902066844e+001;4.8343030842e+001;9.2424963973e+001;5.5176014382e+001;4.5503249108e+001;8.0256254811e+001;6.7785746212e+001;4.9959513012e+001;; +1.0625000000e+000;4.4026974939e+001;4.7253878375e+001;3.9147925365e+001;4.4299290167e+001;4.2712881924e+001;4.1172827407e+001;4.0682992935e+001;5.6063731682e+001;4.9871292434e+001;4.1966902953e+001;; +1.0625000000e+000;4.2727756614e+001;4.9418281607e+001;4.2920450938e+001;4.4270850533e+001;3.9299688982e+001;4.1538554943e+001;3.9641700878e+001;5.0243991162e+001;4.6748378718e+001;4.5190961678e+001;; +1.0625000000e+000;1.6493458716e+001;3.7200663217e+001;1.0950047688e+001;3.4770686947e+001;1.4210193404e+001;2.4039603031e+001;2.8860897746e+001;4.1276455766e+001;2.1756922044e+001;3.4284192671e+001;; +1.0625000000e+000;2.7152887947e+001;2.8888167015e+001;2.4903821829e+001;3.0741642701e+001;3.6182892822e+001;2.8014037703e+001;2.6570123033e+001;2.6086055236e+001;2.8801474188e+001;2.3723247384e+001;; +1.0625000000e+000;5.1490849737e+001;6.4368341187e+001;4.6525014212e+001;5.5944776634e+001;4.3879910658e+001;4.9708763866e+001;5.0770017819e+001;7.7380078484e+001;5.6335024469e+001;6.3057920152e+001;; +1.0625000000e+000;3.5430593702e+001;4.7891137700e+001;3.2634204867e+001;4.0288086809e+001;3.8938705341e+001;3.4480221263e+001;3.7171882791e+001;5.3411153193e+001;3.2429612714e+001;4.1399239642e+001;; +1.0625000000e+000;3.7575284839e+001;5.3531345473e+001;3.2536496553e+001;4.8465783822e+001;3.5582191051e+001;4.0017959830e+001;4.2704014018e+001;7.3546124739e+001;4.5157692940e+001;4.7998517206e+001;; +1.0625000000e+000;4.4460378727e+001;4.2656214625e+001;3.7092781341e+001;4.0769288346e+001;5.1020219368e+001;4.0589111395e+001;3.7799449538e+001;5.6564387472e+001;4.7438613369e+001;3.6501247958e+001;; +1.0625000000e+000;3.2990796648e+001;4.3184185776e+001;2.9317881475e+001;3.8594853117e+001;3.6867708751e+001;3.2044857715e+001;3.5243032361e+001;4.8038787750e+001;3.2782700897e+001;3.9549045175e+001;; +1.0625000000e+000;1.8842024396e+001;2.8609603200e+001;1.6165961249e+001;2.5588804967e+001;1.6723391201e+001;2.3080304894e+001;2.5028609606e+001;2.8831552878e+001;2.1385074794e+001;2.5027459672e+001;; +1.0625000000e+000;3.2944529228e+001;4.2578140409e+001;3.0754678417e+001;3.9375992543e+001;3.2682288983e+001;3.2259006281e+001;3.4929722066e+001;5.1795016113e+001;3.3971923296e+001;3.4807696631e+001;; +1.0625000000e+000;3.8508034928e+001;5.5334671193e+001;3.0983746565e+001;4.9087740165e+001;4.1735998610e+001;3.8061177191e+001;4.1726429932e+001;7.0960747600e+001;4.5091328379e+001;4.6044622548e+001;; +1.0625000000e+000;2.5244928327e+001;3.4584268469e+001;2.0869116096e+001;3.1843901435e+001;1.9339362032e+001;2.8313109091e+001;2.9194779146e+001;3.9964255334e+001;3.0066898834e+001;2.8759945468e+001;; +1.0625000000e+000;3.5354349548e+001;3.7929553064e+001;2.9153659151e+001;3.3449195476e+001;3.2320774447e+001;3.4754086528e+001;3.2982365663e+001;4.0140289676e+001;3.9530782224e+001;3.5021060042e+001;; +1.0625000000e+000;4.3286119035e+001;4.7241563001e+001;3.5774228348e+001;4.1378291423e+001;4.4626013541e+001;3.9250075310e+001;3.9028147147e+001;5.5745503251e+001;4.7235740568e+001;4.1926608731e+001;; +1.0625000000e+000;2.7721101585e+001;3.5575752579e+001;2.2178491145e+001;3.4258065377e+001;1.9898770259e+001;2.9665829245e+001;3.0650547374e+001;4.0614240892e+001;3.4839863949e+001;3.0253535343e+001;; +1.0625000000e+000;3.1709215273e+001;3.7037452885e+001;2.3500579337e+001;3.4597456749e+001;3.4527082209e+001;3.1665268633e+001;3.1122027423e+001;4.1525718215e+001;3.8129362655e+001;3.1052492918e+001;; +1.0625000000e+000;2.8544167506e+001;3.1243791049e+001;2.2798174122e+001;3.0684438247e+001;2.3925188520e+001;2.8836263678e+001;2.8682041829e+001;2.9814000282e+001;3.2199292918e+001;2.7940433649e+001;; +1.0625000000e+000;3.6924611845e+001;3.6735834479e+001;3.0678666586e+001;3.4010624624e+001;4.1325584481e+001;3.4644542283e+001;3.2297167699e+001;3.8276581346e+001;4.0057658075e+001;3.3606114557e+001;; +1.0625000000e+000;3.5810474340e+001;3.9116397016e+001;2.8648691190e+001;3.4599628189e+001;3.7633082478e+001;3.3616167451e+001;3.3227746649e+001;4.5004611422e+001;3.9338838539e+001;3.5530828874e+001;; +1.0625000000e+000;2.9930298836e+001;3.8733299478e+001;2.4341056284e+001;3.5959923065e+001;2.4089670633e+001;3.1005154060e+001;3.2572166541e+001;4.5742474927e+001;3.6454795293e+001;3.2623950330e+001;; +1.0625000000e+000;3.7551469672e+001;4.2616944202e+001;3.0964608046e+001;3.8242600127e+001;3.5937357349e+001;3.6670293053e+001;3.5671018214e+001;5.0817362113e+001;4.4275932591e+001;3.6883423802e+001;; +1.0625000000e+000;3.3032745261e+001;3.8173144868e+001;2.7385249020e+001;3.3642437462e+001;3.0872143746e+001;3.2554715368e+001;3.2601679233e+001;4.2570342473e+001;3.7341210654e+001;3.3433436513e+001;; +1.0625000000e+000;3.7583995711e+001;3.8571625052e+001;3.1900256544e+001;3.5836611141e+001;3.9548646085e+001;3.6193057266e+001;3.4125311532e+001;4.0546424538e+001;4.1980609012e+001;3.4321101732e+001;; +1.0625000000e+000;3.3909922152e+001;3.7177937772e+001;2.7401780921e+001;3.5052598452e+001;3.3998318562e+001;3.2411274413e+001;3.1975692005e+001;4.1562429301e+001;3.7156731325e+001;3.2982110129e+001;; +1.0625000000e+000;3.3343690257e+001;4.0771792826e+001;2.9210634986e+001;3.7579398543e+001;3.1540082712e+001;3.3518836189e+001;3.4298042157e+001;4.5502884979e+001;3.6745285393e+001;3.6288687083e+001;; +1.0625000000e+000;3.3529216270e+001;3.5617480469e+001;2.8844155240e+001;3.2356810607e+001;3.5284477084e+001;3.2406762053e+001;3.0829139619e+001;3.7661926214e+001;3.6439011276e+001;3.0776241969e+001;; +1.0625000000e+000;3.6951586359e+001;3.8662493866e+001;3.0718551426e+001;3.5202969982e+001;3.8743879083e+001;3.4419968418e+001;3.3201725581e+001;4.3707979753e+001;4.0247021498e+001;3.3964334633e+001;; +1.0625000000e+000;3.1382042203e+001;3.9213294852e+001;2.7062567914e+001;3.5093430472e+001;2.8086698047e+001;3.1938485340e+001;3.2852910564e+001;4.4399519273e+001;3.5167000450e+001;3.4844691915e+001;; +1.0625000000e+000;3.3071355201e+001;4.0967950212e+001;2.7966403777e+001;3.7465346529e+001;3.1012345333e+001;3.2723504427e+001;3.3657064398e+001;4.8173652190e+001;3.6542230024e+001;3.6017438641e+001;; +1.0625000000e+000;3.4060394090e+001;3.8734553633e+001;2.9306744985e+001;3.5708464666e+001;3.3044358032e+001;3.3665227905e+001;3.3293377217e+001;4.2714305856e+001;3.8442257631e+001;3.4785480801e+001;; +1.0625000000e+000;3.0847256761e+001;3.6106999528e+001;2.6287801237e+001;3.3048227777e+001;2.9600515207e+001;3.0957340355e+001;3.0727529049e+001;3.8867366164e+001;3.3348790770e+001;3.1581690757e+001;; +1.0625000000e+000;3.2643860904e+001;3.6656789140e+001;2.7576619051e+001;3.3180636979e+001;3.0427310653e+001;3.1941164834e+001;3.1337399272e+001;3.8722950929e+001;3.6033313165e+001;3.2975755795e+001;; +1.0625000000e+000;3.3591050436e+001;3.7948223074e+001;2.8669701187e+001;3.4201119699e+001;3.4212947355e+001;3.2665860025e+001;3.2079036547e+001;4.2616456402e+001;3.6848370252e+001;3.3519143339e+001;; +1.0625000000e+000;3.4143450995e+001;3.9267485787e+001;2.9261167451e+001;3.6037342174e+001;3.3818982493e+001;3.2874858409e+001;3.3191679053e+001;4.4870500028e+001;3.7048464249e+001;3.4290600793e+001;; +1.0625000000e+000;3.1846988838e+001;3.6818969075e+001;2.7205400800e+001;3.4010922009e+001;3.0020807192e+001;3.1682517630e+001;3.1433822884e+001;4.0415517004e+001;3.5396453778e+001;3.2364960463e+001;; +1.0625000000e+000;3.2416980351e+001;3.7913946651e+001;2.7481936377e+001;3.4421805652e+001;3.1478877215e+001;3.1817298963e+001;3.1770584612e+001;4.3129760608e+001;3.5969859670e+001;3.3296777989e+001;; +1.0625000000e+000;3.4005151517e+001;3.6945597805e+001;2.8383417460e+001;3.3434540822e+001;3.4225362659e+001;3.2633800577e+001;3.1611130343e+001;4.0845584326e+001;3.7744157757e+001;3.2798389441e+001;; +1.0625000000e+000;3.2430777244e+001;3.8169865531e+001;2.7380000696e+001;3.5054230908e+001;3.1511019295e+001;3.1896655634e+001;3.2009823310e+001;4.3054723731e+001;3.5929286505e+001;3.3396715203e+001;; +1.0625000000e+000;3.2373087784e+001;3.7634361462e+001;2.7181148274e+001;3.4439281345e+001;3.1147188400e+001;3.2032395406e+001;3.2020816559e+001;4.2024369196e+001;3.6558326038e+001;3.3230948287e+001;; +1.0625000000e+000;3.2090963730e+001;3.6675167811e+001;2.7285307659e+001;3.3383622429e+001;3.1772281013e+001;3.1457687066e+001;3.1042815312e+001;4.0415534814e+001;3.5415166633e+001;3.2050723818e+001;; +1.0625000000e+000;3.2946252404e+001;3.7188249551e+001;2.7852570941e+001;3.4016103745e+001;3.2999665743e+001;3.2029714855e+001;3.1522347747e+001;4.1476473716e+001;3.6238374740e+001;3.2592099809e+001;; +1.0625000000e+000;3.2927453456e+001;3.7363911181e+001;2.7511886513e+001;3.4164783783e+001;3.2746050180e+001;3.1899116017e+001;3.1691483668e+001;4.2055717553e+001;3.6371494699e+001;3.2765913769e+001;; +1.0625000000e+000;3.1963528191e+001;3.6682940346e+001;2.6787552054e+001;3.3497476605e+001;3.0937257060e+001;3.1325883736e+001;3.1099884459e+001;4.0732083768e+001;3.5631620511e+001;3.2384861454e+001;; +1.0625000000e+000;3.2103783597e+001;3.6902741951e+001;2.6874836269e+001;3.3776319036e+001;3.1495492987e+001;3.1390213153e+001;3.1198642370e+001;4.1247501264e+001;3.5588468053e+001;3.2193068444e+001;; +1.0625000000e+000;3.1961216140e+001;3.6524629515e+001;2.7008571771e+001;3.3411353830e+001;3.1100886404e+001;3.1330878862e+001;3.1004379813e+001;4.0682594823e+001;3.5486672753e+001;3.2132006474e+001;; +1.0625000000e+000;3.2691705886e+001;3.6621274873e+001;2.7437168822e+001;3.3375361664e+001;3.2358933615e+001;3.1670120965e+001;3.1169448023e+001;4.0609779850e+001;3.6125205611e+001;3.2392588961e+001;; +1.0625000000e+000;3.1895882203e+001;3.6505388421e+001;2.6935386937e+001;3.3392493404e+001;3.1317154275e+001;3.1263014010e+001;3.0974833826e+001;4.0447258157e+001;3.5263585747e+001;3.2167458370e+001;; +1.0625000000e+000;3.2000118036e+001;3.6223139749e+001;2.6964895163e+001;3.3147055792e+001;3.1505880863e+001;3.1199195524e+001;3.0830736994e+001;4.0116651460e+001;3.5294973599e+001;3.1774080107e+001;; +1.0625000000e+000;3.2151719881e+001;3.6313988761e+001;2.7195744270e+001;3.3260755519e+001;3.1837766257e+001;3.1317452314e+001;3.0885436613e+001;4.0110568416e+001;3.5366797092e+001;3.1926273072e+001;; +1.0625000000e+000;3.2033036870e+001;3.6581807935e+001;2.7091167887e+001;3.3441010132e+001;3.1447697193e+001;3.1314228295e+001;3.1043606853e+001;4.0762212461e+001;3.5407126406e+001;3.2159216583e+001;; +1.0625000000e+000;3.2100535538e+001;3.6154756110e+001;2.7053204511e+001;3.3088501519e+001;3.1857898076e+001;3.1222858776e+001;3.0796717318e+001;4.0146645867e+001;3.5365986316e+001;3.1823582432e+001;; +1.0625000000e+000;3.1892047671e+001;3.6221499462e+001;2.6955532226e+001;3.3126435735e+001;3.1474386721e+001;3.1099299207e+001;3.0794504983e+001;4.0218056938e+001;3.5121199520e+001;3.1929476816e+001;; +1.0625000000e+000;3.2140199365e+001;3.6415079563e+001;2.7153817251e+001;3.3336056706e+001;3.1842826151e+001;3.1282127018e+001;3.0948373577e+001;4.0402303300e+001;3.5440443368e+001;3.2123547454e+001;; +1.0625000000e+000;3.1726765947e+001;3.6015680891e+001;2.6804901339e+001;3.2982975742e+001;3.1294788735e+001;3.0966650940e+001;3.0627790831e+001;3.9869162591e+001;3.4966716000e+001;3.1682533213e+001;; +1.0625000000e+000;3.1660055746e+001;3.6018363464e+001;2.6845764281e+001;3.2947766202e+001;3.1184128309e+001;3.0901454798e+001;3.0621639115e+001;3.9923804877e+001;3.4837460341e+001;3.1755915413e+001;; +1.0625000000e+000;3.1857279032e+001;3.5946814012e+001;2.6919106931e+001;3.2909789225e+001;3.1532059484e+001;3.0996780131e+001;3.0613603430e+001;3.9734298260e+001;3.5105180632e+001;3.1708380885e+001;; +1.0625000000e+000;3.1803492648e+001;3.6030274208e+001;2.6850460134e+001;3.2973777571e+001;3.1500955270e+001;3.0961060615e+001;3.0619546544e+001;3.9943620052e+001;3.5042040969e+001;3.1723418798e+001;; +1.0625000000e+000;3.1594770446e+001;3.5901590881e+001;2.6693716701e+001;3.2874830357e+001;3.1162724543e+001;3.0823817109e+001;3.0519978825e+001;3.9817410086e+001;3.4850964970e+001;3.1612276549e+001;; +1.0625000000e+000;3.1685495868e+001;3.5903523796e+001;2.6793806706e+001;3.2867341249e+001;3.1334943167e+001;3.0860922250e+001;3.0515770099e+001;3.9839918748e+001;3.4884579376e+001;3.1614285965e+001;; +1.0625000000e+000;3.1622654719e+001;3.5832777805e+001;2.6736675246e+001;3.2797353855e+001;3.1246357111e+001;3.0812584408e+001;3.0467485880e+001;3.9685591996e+001;3.4830997256e+001;3.1600915447e+001;; +1.0625000000e+000;3.1573369628e+001;3.5759141259e+001;2.6660867934e+001;3.2736578581e+001;3.1231207513e+001;3.0758193379e+001;3.0415914540e+001;3.9589291004e+001;3.4772294692e+001;3.1512883476e+001;; +1.0625000000e+000;3.1530228577e+001;3.5700224350e+001;2.6640761828e+001;3.2694400304e+001;3.1178374788e+001;3.0713512556e+001;3.0359074359e+001;3.9530171976e+001;3.4719086127e+001;3.1442069236e+001;; +1.0625000000e+000;3.1545863244e+001;3.5718122846e+001;2.6662250830e+001;3.2714103554e+001;3.1229743514e+001;3.0717633102e+001;3.0373059405e+001;3.9561543614e+001;3.4705121619e+001;3.1461592062e+001;; +1.0625000000e+000;3.1533129997e+001;3.5680235238e+001;2.6651167706e+001;3.2674396609e+001;3.1247754859e+001;3.0691673658e+001;3.0339834135e+001;3.9524974987e+001;3.4697984807e+001;3.1419033204e+001;; +1.0625000000e+000;3.1504620653e+001;3.5665417282e+001;2.6627082499e+001;3.2656564610e+001;3.1219564181e+001;3.0673227103e+001;3.0326313702e+001;3.9503379973e+001;3.4671448932e+001;3.1430601540e+001;; +1.0625000000e+000;3.1445180264e+001;3.5607989758e+001;2.6569086353e+001;3.2602449885e+001;3.1139149875e+001;3.0616759965e+001;3.0276178828e+001;3.9444941625e+001;3.4605589550e+001;3.1374375589e+001;; +1.0625000000e+000;3.1419254306e+001;3.5584307565e+001;2.6550366292e+001;3.2578059197e+001;3.1114398259e+001;3.0592186735e+001;3.0249658211e+001;3.9420909266e+001;3.4573950581e+001;3.1346799961e+001;; +1.0625000000e+000;3.1406698913e+001;3.5540439832e+001;2.6541557061e+001;3.2546488892e+001;3.1130086624e+001;3.0568251891e+001;3.0220128146e+001;3.9355290100e+001;3.4549377302e+001;3.1310569557e+001;; +1.0625000000e+000;3.1380091307e+001;3.5520907898e+001;2.6519169836e+001;3.2526831023e+001;3.1094312903e+001;3.0547884885e+001;3.0202824414e+001;3.9336715880e+001;3.4521468679e+001;3.1295050939e+001;; +1.0625000000e+000;3.1365075252e+001;3.5497680638e+001;2.6508818771e+001;3.2506365825e+001;3.1095463071e+001;3.0528700925e+001;3.0182704372e+001;3.9307083391e+001;3.4499363333e+001;3.1275207270e+001;; +1.0625000000e+000;3.1345128079e+001;3.5476313668e+001;2.6495304732e+001;3.2488256647e+001;3.1074196339e+001;3.0509637032e+001;3.0164600815e+001;3.9279490674e+001;3.4470906706e+001;3.1258548318e+001;; +1.0625000000e+000;3.1322438541e+001;3.5447971629e+001;2.6473657396e+001;3.2463557672e+001;3.1053540232e+001;3.0485763905e+001;3.0140638265e+001;3.9248940987e+001;3.4444975748e+001;3.1230012689e+001;; +1.0625000000e+000;3.1310721024e+001;3.5423644073e+001;2.6464586276e+001;3.2440887538e+001;3.1052275973e+001;3.0471149442e+001;3.0122033350e+001;3.9216932639e+001;3.4430236213e+001;3.1212173853e+001;; +1.0625000000e+000;3.1293963058e+001;3.5410688819e+001;2.6451726241e+001;3.2428836288e+001;3.1035077949e+001;3.0455329918e+001;3.0109112536e+001;3.9205297631e+001;3.4409338839e+001;3.1201452693e+001;; +1.0625000000e+000;3.1277832343e+001;3.5389041378e+001;2.6439666106e+001;3.2410480719e+001;3.1020825991e+001;3.0438804075e+001;3.0091776525e+001;3.9178078902e+001;3.4389004503e+001;3.1181568942e+001;; +1.0625000000e+000;3.1264526090e+001;3.5373694510e+001;2.6428715076e+001;3.2396775052e+001;3.1010890956e+001;3.0425364722e+001;3.0078635464e+001;3.9160643006e+001;3.4372589926e+001;3.1168581933e+001;; +1.0625000000e+000;3.1252477837e+001;3.5358853527e+001;2.6419582773e+001;3.2383848528e+001;3.1001538291e+001;3.0413066322e+001;3.0066153468e+001;3.9142371690e+001;3.4357266845e+001;3.1155736851e+001;; +1.0625000000e+000;3.1243548553e+001;3.5346427778e+001;2.6412417242e+001;3.2372798918e+001;3.0995631875e+001;3.0403062808e+001;3.0055720609e+001;3.9128464860e+001;3.4345794978e+001;3.1144996913e+001;; +1.0625000000e+000;3.1234588159e+001;3.5335005202e+001;2.6405110628e+001;3.2362604153e+001;3.0989262979e+001;3.0393658770e+001;3.0046100430e+001;3.9114852788e+001;3.4334485225e+001;3.1135319752e+001;; +1.0625000000e+000;3.1226415173e+001;3.5324954653e+001;2.6398475986e+001;3.2353735229e+001;3.0982616679e+001;3.0385145862e+001;3.0037643201e+001;3.9103042520e+001;3.4324312616e+001;3.1126593795e+001;; +1.0625000000e+000;3.1219696106e+001;3.5316366965e+001;2.6393133479e+001;3.2346118524e+001;3.0977616369e+001;3.0378131738e+001;3.0030437187e+001;3.9092960198e+001;3.4315854737e+001;3.1119161558e+001;; +1.0625000000e+000;3.1214309464e+001;3.5309479703e+001;2.6388788666e+001;3.2340018473e+001;3.0973630814e+001;3.0372448843e+001;3.0024644054e+001;3.9084883240e+001;3.4309078757e+001;3.1113230876e+001;; +1.0625000000e+000;3.1210041924e+001;3.5304087159e+001;2.6385361899e+001;3.2335230754e+001;3.0970397499e+001;3.0367976484e+001;3.0020104939e+001;3.9078529267e+001;3.4303707105e+001;3.1108584524e+001;; +1.0625000000e+000;3.1206991985e+001;3.5300237457e+001;2.6382912522e+001;3.2331818320e+001;3.0968077879e+001;3.0364784844e+001;3.0016867253e+001;3.9074003288e+001;3.4299875890e+001;3.1105264237e+001;; +1.0625000000e+000;3.1205170181e+001;3.5297932360e+001;2.6381448404e+001;3.2329774520e+001;3.0966699317e+001;3.0362875282e+001;3.0014927926e+001;3.9071295417e+001;3.4297585175e+001;3.1103275582e+001;; +1.0625000000e+000;3.1204562484e+001;3.5297163569e+001;2.6380960083e+001;3.2329092786e+001;3.0966239220e+001;3.0362238370e+001;3.0014281187e+001;3.9070391759e+001;3.4296821056e+001;3.1102612469e+001;; +1.1250000000e+000;1.8991306138e+004;1.9850552407e+004;1.8177161660e+004;1.7649103808e+004;1.8341127075e+004;1.7292179867e+004;1.4041032408e+004;1.9431303339e+004;1.7187676153e+004;1.3733292224e+004;; +1.1250000000e+000;9.2875459396e+003;9.5746152029e+003;8.5616059778e+003;7.4233274967e+003;9.2946209502e+003;7.6200193940e+003;5.6397714494e+003;9.3774092924e+003;7.9313660915e+003;5.8334490753e+003;; +1.1250000000e+000;9.3345531636e+003;9.6054190588e+003;1.0146227376e+004;1.0423518530e+004;8.4956571873e+003;1.0032181692e+004;9.5914514762e+003;9.1653977916e+003;8.4195240590e+003;8.5460169476e+003;; +1.1250000000e+000;1.5053387098e+003;1.4179230865e+003;1.8819750034e+003;1.5781212132e+003;1.4234486500e+003;1.4364756402e+003;1.2867775293e+003;1.4885223275e+003;1.2243191620e+003;1.2099116063e+003;; +1.1250000000e+000;2.7009050636e+003;2.2921479598e+003;3.2052846675e+003;2.8265175839e+003;2.7661999755e+003;2.5784156547e+003;2.5041933697e+003;2.2055744661e+003;2.4671818933e+003;2.1179342761e+003;; +1.1250000000e+000;2.6983216504e+003;2.7588795012e+003;2.7164475375e+003;2.7899104492e+003;2.6255998769e+003;2.7342828013e+003;2.6826029841e+003;2.5799308251e+003;2.7231411021e+003;2.8344974693e+003;; +1.1250000000e+000;1.0438420933e+003;9.3918171881e+002;9.6861732210e+002;9.7038825298e+002;1.1281778252e+003;9.9993844275e+002;9.9056565157e+002;9.7555236794e+002;1.2097656250e+003;8.6402744717e+002;; +1.1250000000e+000;1.8152079226e+003;1.5421187670e+003;2.0437978551e+003;1.6064562896e+003;1.8322682418e+003;1.7238076140e+003;1.4665191397e+003;1.5611299845e+003;1.7250185748e+003;1.3177227370e+003;; +1.1250000000e+000;8.6228120104e+002;1.1134591588e+003;9.0300784380e+002;1.1412147149e+003;9.0687363420e+002;1.0868385739e+003;1.1249005783e+003;1.0280712360e+003;8.8006441731e+002;1.0559673661e+003;; +1.1250000000e+000;1.0673467493e+003;1.0120111213e+003;1.1593022750e+003;9.6432477897e+002;1.0025157665e+003;1.2113896872e+003;1.1118645376e+003;9.3914075025e+002;9.4036653806e+002;9.4337341178e+002;; +1.1250000000e+000;4.7109986776e+002;4.6033314909e+002;4.9295083071e+002;3.1023780508e+002;3.8067127072e+002;5.4615555820e+002;5.2163090637e+002;2.9957489752e+002;4.0375439415e+002;5.2014766586e+002;; +1.1250000000e+000;7.1855276994e+002;7.9055305988e+002;7.8504907834e+002;9.0607262061e+002;9.2420164727e+002;7.7125666315e+002;8.8806781571e+002;6.5274570719e+002;7.7765854029e+002;5.5148532236e+002;; +1.1250000000e+000;1.5597697490e+003;1.3176581967e+003;1.3220483270e+003;1.2721246713e+003;1.9151372902e+003;1.2036590595e+003;1.2590982956e+003;1.2439476120e+003;1.6875250960e+003;1.4011648030e+003;; +1.1250000000e+000;5.8320655273e+002;9.2216994484e+002;7.5809543541e+002;9.4052982139e+002;3.4767543574e+002;7.8283837214e+002;8.9169498192e+002;9.9623722441e+002;3.1525242179e+002;9.0468836682e+002;; +1.1250000000e+000;1.0794150103e+003;1.7819891063e+003;1.0331899509e+003;1.7367849814e+003;8.1800622637e+002;1.3941279407e+003;1.6886790213e+003;1.7335644026e+003;1.0493559708e+003;1.7718645219e+003;; +1.1250000000e+000;8.5954460818e+002;1.1428390016e+003;9.2768392742e+002;1.2369078739e+003;7.4768009927e+002;1.0074097647e+003;1.1481751407e+003;1.0156761643e+003;6.8997657339e+002;1.0654412614e+003;; +1.1250000000e+000;1.1817138760e+003;7.7614175798e+002;1.1452025286e+003;1.0074639237e+003;1.1666161559e+003;1.0074703612e+003;8.4854107353e+002;7.4191481271e+002;1.3412014070e+003;6.2316054599e+002;; +1.1250000000e+000;5.6486062853e+002;4.7703800716e+002;5.7877825036e+002;4.7438756747e+002;5.1854470780e+002;4.8797845246e+002;5.7571178395e+002;3.0656967148e+002;6.8274017497e+002;6.1785212069e+002;; +1.1250000000e+000;1.7283233082e+002;3.1460778360e+002;2.0087336775e+002;2.8442421210e+002;1.9070798068e+002;1.7734662112e+002;2.6578557813e+002;1.7066370178e+002;2.1136916847e+002;3.9302680065e+002;; +1.1250000000e+000;6.3981006349e+002;6.6711783267e+002;6.4384343899e+002;7.1156337555e+002;6.1591525677e+002;5.3369047138e+002;6.3837598493e+002;5.0438353395e+002;6.7625306549e+002;7.8461287401e+002;; +1.1250000000e+000;6.0279685136e+002;8.8894580346e+002;3.3689492250e+002;8.9676883594e+002;5.7430247401e+002;6.5548856023e+002;8.1510910882e+002;7.1152124623e+002;7.6621616364e+002;8.8561796315e+002;; +1.1250000000e+000;4.6507214513e+002;4.1717354275e+002;3.2664450779e+002;4.4101441788e+002;5.6649024956e+002;4.7151222114e+002;5.5728631388e+002;1.6348504332e+002;5.7755047380e+002;4.7658170858e+002;; +1.1250000000e+000;1.5498042275e+002;4.7823043300e+002;3.1145505262e+002;3.9049416855e+002;3.4862939207e+002;1.2190115615e+002;1.8989956275e+002;8.4843990325e+002;1.2973747462e+002;4.7807403875e+002;; +1.1250000000e+000;4.1075829252e+002;5.4555983666e+002;4.0146692933e+002;3.3046422590e+002;4.7941319645e+002;4.2039622544e+002;4.9964114857e+002;6.7190030830e+002;3.8482276137e+002;6.0305539669e+002;; +1.1250000000e+000;2.6678673380e+002;2.1280035925e+002;1.3676496775e+002;2.0720565016e+002;4.8580604267e+002;1.5539794782e+002;1.9847551169e+002;3.2446003568e+002;3.8304893805e+002;3.3473676526e+002;; +1.1250000000e+000;5.4764346331e+002;4.0445901997e+002;5.6075841675e+002;3.1975103444e+002;8.0080832366e+002;4.9995274823e+002;4.0363447745e+002;3.8555068614e+002;5.3268308770e+002;5.0340284968e+002;; +1.1250000000e+000;2.4825027519e+002;5.8469238931e+002;2.7559115750e+002;5.2620130096e+002;4.0326782185e+002;1.9936514303e+002;3.3121649903e+002;7.2535136421e+002;2.7742470948e+002;5.4517664785e+002;; +1.1250000000e+000;6.9808732869e+002;6.2840618834e+002;7.6051647457e+002;5.9899733433e+002;6.8238661095e+002;7.3343538737e+002;5.8342179413e+002;7.5341713442e+002;6.6347731977e+002;6.2627731348e+002;; +1.1250000000e+000;7.6154119772e+002;8.5453876183e+002;7.6831178305e+002;7.8583640411e+002;7.6505894218e+002;7.8380779496e+002;8.4538040762e+002;7.5307215716e+002;7.2647922866e+002;7.7590411107e+002;; +1.1250000000e+000;4.5036738736e+002;5.3143857340e+002;4.6706340222e+002;5.1859793757e+002;4.1826924049e+002;4.9649812995e+002;5.1319363509e+002;6.1707643017e+002;4.0723406380e+002;4.7165102473e+002;; +1.1250000000e+000;7.4816958632e+002;4.1029858792e+002;7.1460577084e+002;4.3577872417e+002;8.9453597004e+002;6.6387598543e+002;5.1883605993e+002;3.2360098365e+002;6.9447081538e+002;4.2189037108e+002;; +1.1250000000e+000;1.6885735240e+002;1.8928214752e+002;1.9315162037e+002;1.3497481996e+002;4.5108861974e+001;1.9505204928e+002;2.3577412717e+002;2.6590798794e+002;1.7961765992e+002;2.5730378684e+002;; +1.1250000000e+000;2.6294755831e+002;3.1321977886e+002;3.0200589845e+002;2.5903236633e+002;2.7648566241e+002;3.3152263135e+002;3.5377925033e+002;3.0700123630e+002;2.9772598773e+002;3.9634120463e+002;; +1.1250000000e+000;3.2044950603e+002;3.2199489885e+002;3.3679931900e+002;3.2836439822e+002;3.1528143943e+002;3.2799454256e+002;3.4756582000e+002;3.1762548248e+002;3.2089678414e+002;3.6248402250e+002;; +1.1250000000e+000;5.2390452537e+002;5.9339622303e+002;5.7869042340e+002;5.4638086815e+002;4.4080714884e+002;5.4547724357e+002;5.7205124790e+002;6.2776153170e+002;4.2354440567e+002;5.5456297782e+002;; +1.1250000000e+000;4.2577618804e+002;3.5402104741e+002;2.7236934198e+002;3.3623610375e+002;7.8241624798e+002;4.5480057372e+002;4.7746552182e+002;2.9136012122e+002;5.3258410210e+002;4.3401710259e+002;; +1.1250000000e+000;3.5061788299e+002;1.1234471169e+002;3.7202606514e+002;1.6969739034e+002;3.3157161122e+002;4.7387286611e+002;3.6629404604e+002;2.4909714313e+002;3.1378591094e+002;1.7378975612e+002;; +1.1250000000e+000;1.6147403764e+002;1.7097502954e+002;8.7002493623e+001;2.1074314267e+002;1.6767544497e+002;1.7593427520e+002;2.3971128523e+002;1.5055957566e+002;2.3443289198e+002;1.7258346090e+002;; +1.1250000000e+000;4.6027477298e+002;4.0698778471e+002;4.6526348916e+002;4.2064587268e+002;3.1087598005e+002;5.0681844138e+002;4.7143073146e+002;3.0999416892e+002;5.2964852207e+002;3.9320465341e+002;; +1.1250000000e+000;2.3828013149e+002;2.3431214842e+002;3.0499497862e+002;2.2665483761e+002;2.6297383713e+002;1.9619940645e+002;2.5034294892e+002;2.2056146758e+002;2.3337780991e+002;3.6469288275e+002;; +1.1250000000e+000;3.5097968595e+002;6.1548135422e+002;3.5366407088e+002;5.7810050384e+002;2.7277034321e+002;3.8461541810e+002;5.1891766508e+002;7.0641987502e+002;3.8415247875e+002;5.9426070014e+002;; +1.1250000000e+000;5.0168757900e+002;6.9006975283e+002;4.7471125723e+002;6.0590694060e+002;5.0671307017e+002;4.7688699493e+002;5.7116441042e+002;8.4340209059e+002;5.0664573433e+002;6.4458327236e+002;; +1.1250000000e+000;5.2066496333e+002;6.0110049426e+002;4.2913748954e+002;5.0741528374e+002;7.5812296322e+002;4.6548662149e+002;5.1169159594e+002;6.9711577030e+002;4.7711871363e+002;5.4889574237e+002;; +1.1250000000e+000;5.8993820796e+002;5.2006562921e+002;5.4291802564e+002;4.4981153859e+002;7.3621489169e+002;5.2701844051e+002;4.5749007012e+002;6.3533463750e+002;6.7181323096e+002;5.2396796084e+002;; +1.1250000000e+000;7.3153114337e+002;6.2114699893e+002;6.7100413713e+002;5.6192036969e+002;9.8792850005e+002;6.0714061515e+002;5.7212516144e+002;6.3390230906e+002;7.2073005374e+002;6.3486049222e+002;; +1.1250000000e+000;2.4527823632e+002;3.6045546023e+002;1.4792509231e+002;2.5779883032e+002;2.7454105288e+002;5.7964050362e+001;1.6824324168e+002;6.5275646652e+002;2.2162848291e+002;3.0460039853e+002;; +1.1250000000e+000;6.3484507055e+002;1.8815856186e+002;5.3489549121e+002;1.4966115912e+002;1.1032791869e+003;3.4045772652e+002;1.4361033293e+002;3.3280388242e+002;6.7135478103e+002;1.6577791546e+002;; +1.1250000000e+000;1.4792866153e+002;1.5588628890e+002;1.6607324322e+002;8.6731291428e+001;2.0901489760e+002;1.5780547631e+002;1.5771362915e+002;2.9993002022e+002;2.6034791310e+002;1.8550997082e+002;; +1.1250000000e+000;2.6114211166e+002;4.6880454091e+002;3.5201983799e+002;3.7927156031e+002;2.3362519131e+002;3.2792320888e+002;3.5947318893e+002;7.3750420295e+002;3.1068720004e+002;3.9400397021e+002;; +1.1250000000e+000;6.7385531746e+002;5.6260331253e+002;4.9323951207e+002;5.2222780762e+002;6.0013191882e+002;6.6037285737e+002;6.1086472961e+002;4.8157161216e+002;7.7273871317e+002;5.9597673699e+002;; +1.1250000000e+000;7.5947522296e+002;3.9162359647e+002;3.4099857760e+002;3.7977098270e+002;8.8598004550e+002;5.4426882254e+002;6.8489695697e+002;3.5914535357e+002;7.6333924650e+002;5.0730459892e+002;; +1.1250000000e+000;2.5644809653e+002;4.7380659497e+002;1.4121029822e+002;4.1268921630e+002;4.5295838359e+002;1.9853636142e+002;3.1266071590e+002;8.5148054411e+002;2.6559855633e+002;3.5198479494e+002;; +1.1250000000e+000;2.0254637243e+002;5.2962758008e+002;2.6246134604e+002;4.9360792956e+002;2.6300116166e+002;3.2206032030e+002;4.5346113125e+002;7.7806585720e+002;2.4049202749e+002;4.6942234590e+002;; +1.1250000000e+000;2.3894882317e+002;1.0473775666e+002;2.2066704669e+002;2.1276968491e+001;2.6466595885e+002;1.4040846350e+002;3.3253692877e+001;2.2298521071e+001;2.8996164606e+002;1.7657308050e+002;; +1.1250000000e+000;5.4668329401e+002;4.6920470229e+002;4.8023723324e+002;4.6623563530e+002;4.4958229883e+002;4.7768453367e+002;4.7064613631e+002;4.3148656546e+002;5.7598292026e+002;4.9911832614e+002;; +1.1250000000e+000;4.7734259198e+002;4.3100720435e+002;4.1558174322e+002;3.4765209310e+002;6.7603340221e+002;3.5206359836e+002;3.2695389926e+002;5.0562903424e+002;5.1846614403e+002;4.0237791030e+002;; +1.1250000000e+000;6.2496218620e+002;5.7971159457e+002;6.2865034605e+002;5.3888225385e+002;8.9713085664e+002;5.1455969463e+002;5.1040849981e+002;6.6224832128e+002;6.5330860556e+002;5.5777162766e+002;; +1.1250000000e+000;8.0541038928e+002;6.5054700282e+002;7.2185794494e+002;6.6454120033e+002;1.0043145908e+003;6.6116422532e+002;6.3050356914e+002;8.3175378147e+002;8.8281150102e+002;6.1631064394e+002;; +1.1250000000e+000;7.3028858487e+002;7.3573376372e+002;6.3930613588e+002;6.3296250193e+002;8.6565240092e+002;6.7928766525e+002;6.6794459905e+002;7.8671394880e+002;8.0000074096e+002;7.7736065933e+002;; +1.1250000000e+000;3.9731828013e+002;3.8134413734e+002;2.8157887397e+002;3.6444676986e+002;4.1790204184e+002;3.5863665829e+002;3.2662889720e+002;6.8241538187e+002;4.9880785342e+002;2.9706075016e+002;; +1.1250000000e+000;5.1940759831e+002;3.9224275964e+002;4.6917959979e+002;3.2244037914e+002;7.4362252758e+002;3.8291660296e+002;3.1995996200e+002;3.8896658489e+002;4.4757049372e+002;4.2124301613e+002;; +1.1250000000e+000;3.5449330375e+002;1.3242214384e+002;2.2611459177e+002;1.2123826457e+002;5.1918581202e+002;3.1482223045e+002;2.3416973100e+002;3.5363604966e+001;3.5834315448e+002;1.4343934977e+002;; +1.1250000000e+000;1.1564775244e+002;1.5757353685e+002;1.3072623403e+002;1.5588984336e+002;2.2798991639e+002;1.4807773726e+002;8.5783632042e+001;2.8043368393e+002;3.6134471102e+001;6.7445195336e+001;; +1.1250000000e+000;2.8717318776e+002;2.4459061270e+002;2.4618036248e+002;2.6915612716e+002;3.1583990434e+002;3.1485972875e+002;2.6622512591e+002;1.1266250697e+002;2.9123809882e+002;3.1124676217e+002;; +1.1250000000e+000;3.7331392895e+002;3.1865120956e+002;3.4786340573e+002;3.0267806555e+002;5.9275121658e+002;2.9372894380e+002;2.8351963501e+002;2.6048298984e+002;3.4907530065e+002;3.1738199275e+002;; +1.1250000000e+000;4.0122092209e+002;4.4128412400e+002;3.9165505666e+002;3.9629861036e+002;4.3918412973e+002;3.6418174114e+002;3.6999649982e+002;5.4480704282e+002;4.3716325692e+002;3.9127914638e+002;; +1.1250000000e+000;3.7615425777e+002;3.9645873481e+002;3.4111606824e+002;3.5311849343e+002;6.0571852101e+002;3.2100291582e+002;3.2653849165e+002;5.5509974480e+002;3.7083877744e+002;3.0690877724e+002;; +1.1250000000e+000;3.1688330577e+002;5.8318555778e+002;3.0928722567e+002;5.2016266560e+002;3.1231908260e+002;3.5421665968e+002;4.6457187545e+002;6.4775857681e+002;3.8122780723e+002;5.7562392165e+002;; +1.1250000000e+000;6.3551931492e+002;4.6779256755e+002;5.2507091429e+002;4.3785942854e+002;1.0733900115e+003;4.2673674821e+002;3.7110678226e+002;6.9965303564e+002;5.7601339910e+002;4.0339717714e+002;; +1.1250000000e+000;5.0725762910e+002;3.6162368990e+002;5.0346248309e+002;3.2591911862e+002;6.0524529512e+002;3.8028295837e+002;3.3663322732e+002;3.7550365572e+002;5.8724045709e+002;3.2923913323e+002;; +1.1250000000e+000;5.3018052475e+002;4.5245705638e+002;5.3676797478e+002;3.9208324136e+002;6.2733167713e+002;4.2080114055e+002;4.1490730134e+002;5.2347600822e+002;5.3101196064e+002;4.1860680135e+002;; +1.1250000000e+000;4.1869564786e+002;1.1181882783e+002;3.0330370988e+002;7.2177239165e+001;6.9966163923e+002;2.2400134721e+002;1.0961971038e+002;1.3996797449e+002;4.9438613596e+002;9.0975592845e+001;; +1.1250000000e+000;2.0677809036e+002;3.7599056870e+002;1.8464804011e+002;3.1963507479e+002;1.2176113547e+002;2.2980981155e+002;2.7915302606e+002;3.0843388423e+002;2.5590661233e+002;4.8279213717e+002;; +1.1250000000e+000;3.5419549085e+002;4.7804329640e+002;3.2700173285e+002;4.1774062069e+002;4.0459930134e+002;3.5363436994e+002;3.7760355439e+002;5.5670736660e+002;3.9404941297e+002;4.2602387577e+002;; +1.1250000000e+000;2.3538501953e+002;3.4233547976e+002;2.4233076980e+002;2.4539669261e+002;4.1671638834e+002;1.1827214684e+002;2.0638251990e+002;4.3213431599e+002;2.2826860225e+002;3.5032070394e+002;; +1.1250000000e+000;2.2174484228e+002;9.4851642436e+001;2.2827955040e+002;4.8610024130e+001;4.2987023404e+002;1.1112203153e+002;4.8895649634e+001;2.9946413390e+002;2.2566351185e+002;6.1000669724e+001;; +1.1250000000e+000;2.9867443974e+002;1.2555838276e+002;2.5222820359e+002;1.2104527167e+002;5.4904482920e+002;1.7837295692e+002;1.4676099643e+002;2.3271144798e+002;3.0236654120e+002;1.4314335842e+002;; +1.1250000000e+000;3.8164725832e+002;3.1708905556e+002;2.9073440309e+002;1.7781866911e+002;5.2484813431e+002;1.8680996063e+002;8.3824407670e+001;6.4540920273e+002;4.5378363848e+002;2.9898494122e+002;; +1.1250000000e+000;2.0522977855e+001;1.5406118400e+002;7.8887036219e+001;1.6722305600e+002;2.7493445558e+002;1.1766358022e+002;1.6503978115e+002;1.4747672667e+002;7.3318522499e+001;1.4287096558e+002;; +1.1250000000e+000;7.1753412047e+001;1.4369223736e+002;6.0128353666e+001;1.6790171769e+002;6.0713881666e+001;6.7947638816e+001;1.1252345242e+002;1.7055234703e+002;9.1753770715e+001;2.0250914549e+002;; +1.1250000000e+000;2.8412233128e+002;1.7861766652e+002;2.1876333841e+002;1.7293337288e+002;3.9637370739e+002;1.6861413391e+002;1.4188665930e+002;2.5189492624e+002;3.2657069617e+002;1.3778037431e+002;; +1.1250000000e+000;6.2306885972e+002;4.2974283442e+002;5.3047008533e+002;3.3977299550e+002;9.4469366451e+002;4.1896463988e+002;3.1360702062e+002;5.6272698496e+002;6.6436779919e+002;4.2001962431e+002;; +1.1250000000e+000;2.7548980910e+002;3.3713527267e+002;2.0028576467e+002;2.6834427590e+002;5.0672459983e+002;2.3968650961e+002;2.1628261443e+002;6.0113687926e+002;2.8218367313e+002;2.8446056937e+002;; +1.1250000000e+000;3.3458315251e+002;2.8536768571e+002;4.0419119522e+002;2.6953546374e+002;4.1711814982e+002;2.4040594025e+002;2.0541527879e+002;5.0491939066e+002;3.1272590118e+002;2.2364586622e+002;; +1.1250000000e+000;6.2753037825e+001;2.5801123422e+002;1.3296545011e+002;2.0379407450e+002;5.1309572202e+001;1.2238367654e+002;1.8013095891e+002;5.3061115982e+002;1.3403727591e+002;2.1199474442e+002;; +1.1250000000e+000;2.0812948056e+002;2.5950453253e+002;1.9672801172e+002;2.5483475594e+002;2.3735829269e+002;1.7394925289e+002;1.6544594013e+002;5.0707033680e+002;2.3824625414e+002;1.5681335003e+002;; +1.1250000000e+000;1.6913361550e+002;1.1106330382e+002;1.0108191376e+002;9.2928665392e+001;1.3729107094e+002;1.4247948941e+002;1.1441818366e+002;2.4826900493e+002;2.3679796290e+002;8.2950046860e+001;; +1.1250000000e+000;1.7541301420e+002;1.3831394750e+002;1.6290778674e+002;1.5170477230e+002;1.1924259750e+002;2.5334261820e+002;1.9782288074e+002;1.5558929109e+002;3.2233428830e+002;2.0246674857e+002;; +1.1250000000e+000;3.3403726311e+002;8.8679624783e+001;1.6653577094e+002;1.3249581878e+002;4.7331159449e+002;2.2194525458e+002;1.1553097376e+002;3.3786020853e+002;3.9784738106e+002;4.9949960866e+001;; +1.1250000000e+000;3.3379877162e+002;2.0113350151e+002;2.3503380220e+002;1.7598134803e+002;7.9147954109e+002;1.1813771351e+002;1.3620963656e+002;2.9283260798e+002;3.5388367897e+002;1.2118082190e+002;; +1.1250000000e+000;4.0190784324e+002;3.4809737454e+002;3.9328178091e+002;2.9752094632e+002;6.8440429249e+002;3.2170070545e+002;2.8995879096e+002;3.3155867960e+002;3.5220954791e+002;3.5937268023e+002;; +1.1250000000e+000;1.9974322067e+002;3.2723897203e+002;2.2822709489e+002;3.2075468457e+002;3.4826204241e+002;1.6483252615e+002;2.3687111334e+002;4.1922154907e+002;1.4462115438e+002;2.8024922199e+002;; +1.1250000000e+000;3.0296327621e+002;4.3002951880e+002;3.2729625589e+002;4.1343915840e+002;3.2367661767e+002;3.1631724666e+002;3.7027485528e+002;5.0200716254e+002;2.8052859247e+002;3.5799258694e+002;; +1.1250000000e+000;2.1549994490e+002;5.8755661976e+001;1.6397189521e+002;7.0253100816e+001;3.2378274727e+002;1.4154488163e+002;1.0127058203e+002;1.4869681156e+002;2.7241243197e+002;8.9076835082e+001;; +1.1250000000e+000;4.1017966710e+002;4.0718984727e+002;3.8890888710e+002;3.8302993875e+002;6.4615993585e+002;3.5640243143e+002;3.3701302238e+002;5.1556954436e+002;4.7537386922e+002;4.0961554325e+002;; +1.1250000000e+000;3.4141092330e+002;2.5084688723e+002;3.3460930364e+002;2.5695073224e+002;4.5874058227e+002;3.0758992152e+002;2.3119507941e+002;3.6515256365e+002;3.5076939380e+002;2.2073462503e+002;; +1.1250000000e+000;1.4404672510e+002;1.5218049372e+002;1.4077154531e+002;7.3561775583e+001;2.4984048778e+002;9.2219180351e+001;3.5823058743e+001;3.9851197926e+002;2.1429869718e+002;1.2451912799e+002;; +1.1250000000e+000;1.4439608006e+002;2.3188324624e+002;1.8921277164e+002;2.1859481903e+002;1.3205229540e+002;1.3814555493e+002;1.7672598946e+002;2.6381030794e+002;9.9053315253e+001;2.1890684517e+002;; +1.1250000000e+000;1.4989835466e+002;4.3234955656e+002;3.0930970718e+002;3.0913556296e+002;2.1552827674e+002;2.1235307844e+002;2.9792603799e+002;5.1634269529e+002;1.1302447297e+002;4.8101473109e+002;; +1.1250000000e+000;1.5822168757e+002;1.9973275472e+002;1.9227214530e+002;1.8589456447e+002;2.6389547420e+002;1.2312772657e+002;1.0904554754e+002;3.0687704242e+002;1.2526516304e+002;1.5554902146e+002;; +1.1250000000e+000;8.7371795578e+001;6.8085109072e+001;4.6866993675e+001;7.3612751091e+001;2.4583775046e+002;2.1154894935e+001;7.9259197241e+001;7.5947457523e+001;1.3783314775e+002;6.9793079358e+001;; +1.1250000000e+000;2.1036509898e+002;9.3557733597e+001;2.0239733607e+002;1.0832219589e+002;4.6762948611e+002;1.3547126690e+002;1.1744089945e+002;3.1577413124e+002;1.8115046738e+002;2.3894910979e+001;; +1.1250000000e+000;1.9838210216e+002;3.2832753634e+002;1.1988719141e+002;2.9121417603e+002;1.2352159594e+002;1.9267522688e+002;2.3303294295e+002;3.8957921802e+002;4.0474461600e+002;3.6933191221e+002;; +1.1250000000e+000;5.1788572087e+002;4.2615552564e+002;4.4245505213e+002;3.6224618893e+002;6.8571764177e+002;3.7581066809e+002;3.2909503542e+002;6.7835071321e+002;5.5438932848e+002;3.7136171773e+002;; +1.1250000000e+000;1.2578328316e+002;3.1451682382e+002;1.7164568787e+002;2.4651023859e+002;3.5787909513e+002;9.6489334922e+001;1.4942054882e+002;7.1036247952e+002;1.7321025084e+002;2.2755867506e+002;; +1.1250000000e+000;3.5298851514e+002;1.1551987350e+002;3.1373752838e+002;1.2597201877e+002;4.3625246191e+002;2.2015400273e+002;1.3087104989e+002;2.2396988057e+002;4.0576666764e+002;7.2145370514e+001;; +1.1250000000e+000;1.7909782931e+002;1.0688588752e+002;1.5192752491e+002;6.5929887370e+001;1.4592885770e+002;1.5595512757e+002;1.2581750405e+002;1.6287948033e+002;2.1859786173e+002;1.7596628980e+002;; +1.1250000000e+000;4.0838272532e+002;2.6408304384e+002;3.5526555346e+002;2.4433677879e+002;6.5972099937e+002;2.1460677055e+002;1.9056590815e+002;5.0276527273e+002;3.6171391991e+002;1.7228980250e+002;; +1.1250000000e+000;1.1687107883e+002;1.3730978334e+002;4.8335555469e+001;1.1624446041e+002;9.5803301772e+001;2.9811948179e+001;4.9575313700e+001;2.5964017346e+002;1.7858555850e+002;1.2063791885e+002;; +1.1250000000e+000;4.1982181319e+002;3.6755917755e+002;3.4061106233e+002;3.3339403788e+002;6.1726831746e+002;3.0586426292e+002;3.0146727249e+002;4.0487152143e+002;3.9434856317e+002;3.3689561148e+002;; +1.1250000000e+000;1.9036945826e+002;8.0387443376e+001;1.9223925608e+002;9.7638115414e+001;2.1390632533e+002;8.3849547245e+001;6.9458737964e+001;6.6222617871e+001;2.1387342162e+002;4.7608006300e+001;; +1.1250000000e+000;3.0658451903e+002;2.2893796121e+002;3.2253312898e+002;2.6015649401e+002;4.0067963467e+002;2.3646199777e+002;2.0914221354e+002;3.4507377962e+002;2.8083361900e+002;1.9372247553e+002;; +1.1250000000e+000;6.7086811506e+001;3.3008419287e+001;3.6301045404e+001;2.7999952276e+001;1.6840129686e+002;2.1144474705e+001;2.5164073545e+001;7.3993952997e+001;6.3145169385e+001;8.3902622865e+000;; +1.1250000000e+000;3.3513967478e+002;3.0407018631e+002;3.3034865385e+002;2.0962532293e+002;4.7337287445e+002;1.8839598670e+002;1.3842014603e+002;5.3220520797e+002;3.1510706248e+002;2.8912384772e+002;; +1.1250000000e+000;7.5424545681e+001;1.8114829072e+002;1.5280604778e+002;2.0813451736e+002;1.6584904189e+002;1.1612640505e+002;1.5235291023e+002;3.2339113238e+002;1.0294462454e+002;1.2650051893e+002;; +1.1250000000e+000;3.1097492788e+002;2.3726117875e+002;2.5913567516e+002;2.0877259182e+002;3.1196482374e+002;2.1924621810e+002;1.8910909723e+002;2.2094425164e+002;3.6340369578e+002;2.5311318176e+002;; +1.1250000000e+000;1.8115600291e+002;2.4872939529e+002;1.6321876288e+002;2.3498405025e+002;5.8568790012e+001;1.6657619241e+002;2.0209959388e+002;3.5768385939e+002;2.5350421870e+002;2.8887096081e+002;; +1.1250000000e+000;1.6055689918e+002;2.0501731972e+002;1.7491851611e+002;1.8405082720e+002;4.0344794719e+002;7.2952308116e+001;1.3781061526e+002;1.4378052124e+002;1.1890624772e+002;1.9810554911e+002;; +1.1250000000e+000;3.4684503192e+002;2.8724714099e+002;2.7863915548e+002;2.3293998821e+002;5.3021187485e+002;2.4356088924e+002;2.2748451984e+002;4.2144239280e+002;3.8957680900e+002;2.4380220861e+002;; +1.1250000000e+000;6.9790453215e+001;2.1951826399e+002;2.7308581753e+001;1.5308217791e+002;1.1778732753e+002;7.5323987547e+001;1.0673680947e+002;3.7361696939e+002;1.2236759578e+002;1.8351355897e+002;; +1.1250000000e+000;2.3416654425e+002;2.6589349196e+002;1.7824627788e+002;2.3941282825e+002;2.0137072005e+002;1.6267416020e+002;1.9501539242e+002;4.4806409273e+002;3.1496310311e+002;2.5229200601e+002;; +1.1250000000e+000;2.6673397208e+002;1.9629725223e+002;2.7216660136e+002;2.2825334845e+002;2.8330350080e+002;2.1549287662e+002;1.7840145203e+002;2.0599923861e+002;2.6254287863e+002;1.7365308448e+002;; +1.1250000000e+000;2.5116771587e+002;1.1718014448e+002;2.4966982924e+002;8.9945486794e+001;4.4285535226e+002;1.6152662941e+002;1.0510922566e+002;9.9407889301e+001;2.3122349335e+002;1.1728781049e+002;; +1.1250000000e+000;1.3225024483e+002;1.5099238315e+002;1.1232690730e+002;1.1893813005e+002;1.2499331918e+002;1.1099371428e+002;1.3150338581e+002;2.5834199865e+002;1.1192999156e+002;1.7780582036e+002;; +1.1250000000e+000;1.6911375832e+002;8.4813949301e+001;1.7559765712e+002;8.2674384423e+001;2.5121806085e+002;1.2579716113e+002;7.1075045491e+001;1.8822768995e+002;1.8036410823e+002;1.0269252726e+002;; +1.1250000000e+000;1.2374595020e+002;1.6041997668e+002;1.0925599749e+002;1.5098320363e+002;8.4393940594e+001;1.1230929543e+002;1.3089309246e+002;2.4460279225e+002;1.4839754540e+002;1.7091619057e+002;; +1.1250000000e+000;2.0214061707e+002;8.7092352247e+001;1.4024103277e+002;6.9460487643e+001;2.9880807892e+002;1.2897143312e+002;8.3616310926e+001;1.3121866061e+002;2.4968788521e+002;7.5619074100e+001;; +1.1250000000e+000;9.2089284882e+001;2.0776936984e+002;1.0665085363e+002;1.1455737186e+002;9.4715291892e+001;7.3516282963e+001;9.0072285853e+001;3.2506214321e+002;1.0446599778e+002;1.9381565802e+002;; +1.1250000000e+000;9.2356248369e+001;1.8522032117e+001;1.1781406378e+002;1.6987201664e+001;1.5672883546e+002;6.5892284728e+001;4.2408813246e+001;1.6119011580e+002;7.0890799722e+001;4.5135225328e+001;; +1.1250000000e+000;2.7233776519e+002;1.9850850370e+002;2.3292574574e+002;1.7346364550e+002;4.9835716363e+002;1.7714792631e+002;1.6992699673e+002;2.0582908974e+002;1.9665503202e+002;2.3996320222e+002;; +1.1250000000e+000;5.6411599658e+001;8.1315386253e+001;5.6496205421e+001;6.5318580861e+001;9.3160865510e+001;6.2559404711e+001;4.7830562506e+001;2.6486705337e+002;6.0420046301e+001;5.5671680184e+001;; +1.1250000000e+000;2.2354746952e+002;2.5116735862e+002;1.8131281187e+002;2.3273468396e+002;2.2895126868e+002;1.8291173996e+002;1.9303945378e+002;4.2532626006e+002;2.9742719792e+002;1.9386207644e+002;; +1.1250000000e+000;1.9636786127e+001;1.5026974341e+002;3.4223985969e+001;1.4433766977e+002;4.6055845173e+001;1.2811908545e+001;6.1845183472e+001;2.3935457073e+002;5.8055935918e+001;1.1051011614e+002;; +1.1250000000e+000;1.5617689152e+002;1.6806522532e+002;4.7902088727e+001;1.7168270763e+002;3.1877039391e+002;6.6541720356e+001;9.1282903305e+001;3.2452096385e+002;2.1318016519e+002;9.6842117143e+001;; +1.1250000000e+000;1.5183274630e+002;1.4885432017e+002;1.3959877986e+002;1.5450366176e+002;2.6094306257e+002;1.0914698860e+002;1.0833174320e+002;2.3506325735e+002;1.4969822908e+002;1.0536301928e+002;; +1.1250000000e+000;8.3052688081e+001;1.6424771654e+002;8.3378739361e+001;1.4412040543e+002;6.7839020240e+001;1.0487434672e+002;1.1452216627e+002;2.0641238742e+002;8.7854078847e+001;1.4364911117e+002;; +1.1250000000e+000;9.5216497592e+001;2.1474830832e+001;7.4200184431e+001;1.9056637595e+001;1.7142960738e+002;5.3857743322e+001;2.6366119518e+001;9.1857504577e+001;8.3252554667e+001;6.2271178365e+001;; +1.1250000000e+000;3.5016535021e+001;1.2910050433e+002;5.1925951397e+001;7.4464593103e+001;2.3459479644e+001;2.1899077621e+001;5.7199366863e+001;2.7798550224e+002;4.6754768225e+001;1.3188669582e+002;; +1.1250000000e+000;9.5643803278e+001;6.8651065965e+001;6.1023620268e+001;4.7657572941e+001;1.1977504670e+002;6.9018353940e+001;5.0292252906e+001;1.4355888304e+002;1.5814785703e+002;6.1117411146e+001;; +1.1250000000e+000;2.8712204313e+001;8.3521573541e+001;4.5441259719e+001;7.6588201758e+001;7.5857018772e+001;3.4502841895e+001;5.6342125953e+001;1.4834218108e+002;2.7168382829e+001;7.3260095307e+001;; +1.1250000000e+000;5.4208538821e+001;2.6413841438e+001;8.6435133382e+001;2.6450661329e+001;1.0368828500e+002;3.3618565818e+001;1.6570118382e+001;8.0533487718e+001;4.2654562335e+001;4.6479225297e+001;; +1.1250000000e+000;1.8159982150e+002;1.0749125947e+002;1.4638849887e+002;9.7678836059e+001;2.8741898417e+002;1.3234773292e+002;1.0048940595e+002;1.2820534299e+002;1.6532027832e+002;1.1620077894e+002;; +1.1250000000e+000;1.2947428079e+002;7.6338909766e+001;9.9899724630e+001;4.4322947914e+001;2.5536939462e+002;7.5162507830e+001;5.0241498358e+001;3.9087852999e+001;1.0794936319e+002;1.0511315242e+002;; +1.1250000000e+000;7.6274915969e+001;1.0339944883e+002;6.5984711466e+001;7.4145385549e+001;6.9492291643e+001;5.3801831002e+001;5.8653590007e+001;1.9323543586e+002;8.1711072712e+001;7.1054497171e+001;; +1.1250000000e+000;4.0962885201e+001;1.9203682614e+001;2.5015040872e+001;2.6610604820e+001;7.8772041051e+001;6.7002176247e+000;9.7446825696e+000;7.4295117315e+001;5.8243733072e+001;3.4547410756e+001;; +1.1250000000e+000;1.2146185115e+002;9.3230680681e+001;9.4514424139e+001;7.1212617833e+001;1.5734112442e+002;8.1636613282e+001;5.9201283913e+001;1.5556473769e+002;1.4072518520e+002;7.5571613674e+001;; +1.1250000000e+000;7.8426752153e+001;3.3821301324e+001;6.4518879580e+001;2.5586062458e+001;1.7031371222e+002;3.7761626445e+001;4.1307337929e+001;3.3369212628e+001;8.3170886857e+001;3.8320282426e+001;; +1.1250000000e+000;3.1456621385e+001;2.4733677782e+001;4.3118610345e+001;4.6889553798e+001;2.3312380169e+001;4.4732061362e+001;3.6203703479e+001;2.1671371676e+001;4.4321472604e+001;2.8014349675e+001;; +1.1250000000e+000;1.0981874411e+002;9.1522749646e+001;1.0394927307e+002;7.9860036057e+001;1.2979218292e+002;8.7746140955e+001;7.7038962431e+001;1.2278597297e+002;8.6933743505e+001;8.0856861999e+001;; +1.1250000000e+000;6.2421585630e+001;1.0525134175e+002;4.1140339402e+001;1.0297519716e+002;8.0290042241e+001;6.3244424782e+001;7.6023265275e+001;1.5057660687e+002;6.9085553385e+001;6.9296016308e+001;; +1.1250000000e+000;1.1688172673e+002;2.1962443595e+002;6.9574725656e+001;1.8941606710e+002;1.3764923538e+002;1.1185984548e+002;1.8047267556e+002;2.1990342239e+002;1.3514947691e+002;2.5366449490e+002;; +1.1250000000e+000;5.1350477466e+001;3.5802946222e+001;3.5430002783e+001;2.9245516776e+001;1.2519737839e+002;1.5820253711e+001;1.4048661864e+001;6.6570433544e+001;2.6444075785e+001;2.5588803244e+001;; +1.1250000000e+000;7.5790490912e+001;7.6550207697e+001;6.0090010879e+001;6.4015324601e+001;1.2546879317e+002;4.2937896991e+001;5.0551924505e+001;1.2507181344e+002;7.5208797343e+001;7.3202459811e+001;; +1.1250000000e+000;1.0830025305e+002;6.7617236581e+001;8.2821769782e+001;6.1068279302e+001;1.7061140985e+002;7.9796937048e+001;5.6935237718e+001;8.3226871044e+001;1.1511965968e+002;4.4164821292e+001;; +1.1250000000e+000;4.1451570206e+001;7.4073479992e+001;4.4507144546e+001;5.6545905747e+001;6.8890144007e+001;3.2653203046e+001;3.7366922843e+001;8.9044711258e+001;2.0856200731e+001;7.4883947887e+001;; +1.1250000000e+000;6.1365535306e+001;8.9513629029e+001;7.3462952364e+001;8.0453755948e+001;6.5244881264e+001;6.1439950854e+001;6.7992908904e+001;1.0270496193e+002;6.1416660812e+001;8.5428064753e+001;; +1.1250000000e+000;4.3672263060e+001;7.9358383318e+001;1.5533476388e+001;6.9073240674e+001;6.8778946418e+001;1.9986023251e+001;4.1498354484e+001;1.3977495970e+002;6.8496201930e+001;6.2452782690e+001;; +1.1250000000e+000;2.8245197412e+001;7.5738274921e+001;3.1435594244e+001;6.5056872580e+001;1.4087672584e+001;3.7939490600e+001;4.9010253905e+001;1.0941342521e+002;3.7682821046e+001;5.9074583442e+001;; +1.1250000000e+000;6.2757673278e+001;4.7886058908e+001;7.0151808603e+001;3.5346673810e+001;9.4750658264e+001;5.1498086617e+001;4.0110825866e+001;8.1597608822e+001;4.9499615988e+001;3.9394646536e+001;; +1.1250000000e+000;5.8907346254e+001;5.1138112810e+001;3.3636743508e+001;3.8022879518e+001;1.0474468998e+002;3.5478339362e+001;2.8999665068e+001;6.3160258503e+001;6.8876522817e+001;4.3814985260e+001;; +1.1250000000e+000;4.4923315130e+001;6.9935869092e+001;4.8932415645e+001;6.0578760458e+001;3.1308836401e+001;4.9782799656e+001;5.2825519357e+001;8.4690294284e+001;5.9672974041e+001;6.6498979828e+001;; +1.1250000000e+000;4.6656016286e+001;5.0873742739e+001;4.5465755442e+001;3.5851147040e+001;5.2712312370e+001;4.4876955193e+001;3.7564738754e+001;4.7031118212e+001;4.4504681952e+001;5.7537623110e+001;; +1.1250000000e+000;6.9468355915e+001;5.1486788435e+001;4.3432525571e+001;4.5728218427e+001;8.7146882754e+001;5.1907145481e+001;4.1990988215e+001;5.7157242630e+001;7.7279938378e+001;4.5844777305e+001;; +1.1250000000e+000;1.1050917254e+001;5.0509891907e+001;1.4065660021e+001;4.6189547728e+001;1.0980257184e+001;2.4427101534e+001;3.2103941952e+001;7.7312104699e+001;2.4448435039e+001;3.1945122958e+001;; +1.1250000000e+000;2.6173994032e+001;3.0748715135e+001;2.4991271817e+001;2.7087442161e+001;4.4091272929e+001;1.5367917703e+001;1.8793081270e+001;5.5630377488e+001;2.7562346648e+001;1.9170590212e+001;; +1.1250000000e+000;1.4696283661e+000;3.5359241073e+001;7.0922949704e+000;2.9892606443e+001;1.3651833961e+001;1.6322036944e+001;2.0571357794e+001;6.8789370723e+001;6.2869046966e+000;3.1596597879e+001;; +1.1250000000e+000;3.8344829736e+001;2.8127273424e+001;4.5856390000e+001;3.1309123964e+001;4.4125187201e+001;3.6233400112e+001;2.6698496936e+001;3.4355117105e+001;3.1701114626e+001;1.3558865655e+001;; +1.1250000000e+000;4.3905655358e+001;5.6337258025e+001;4.1986441151e+001;5.3107447164e+001;5.3229488382e+001;4.2812820856e+001;4.5072587850e+001;6.7459217716e+001;4.4839947887e+001;5.1633651490e+001;; +1.1250000000e+000;3.5079112787e+001;4.7838877477e+001;3.6641114100e+001;3.7556419872e+001;3.2707778436e+001;3.4875534320e+001;3.4383191327e+001;5.7293132442e+001;3.1536774445e+001;4.3320861694e+001;; +1.1250000000e+000;3.5476533838e+001;4.0860946404e+001;2.6804398775e+001;3.5848580489e+001;5.7562497402e+001;3.1825649655e+001;3.4815353995e+001;3.1275395404e+001;3.9703530979e+001;3.9945251635e+001;; +1.1250000000e+000;3.4800154080e+001;2.8938766022e+001;2.4552397331e+001;2.5440598807e+001;4.3083782638e+001;2.8711779472e+001;2.4821154818e+001;1.9028538534e+001;3.7364407469e+001;2.7286554623e+001;; +1.1250000000e+000;2.1987367330e+001;3.2945700418e+001;1.9944308210e+001;2.9895949548e+001;2.4157009825e+001;2.4155080255e+001;2.3350673209e+001;3.4340200083e+001;2.1019970091e+001;2.1985649959e+001;; +1.1250000000e+000;3.3109197873e+001;5.6845587716e+001;3.6368375076e+001;4.7875886203e+001;3.0642637473e+001;3.6223682293e+001;4.1686505851e+001;6.2025455104e+001;3.3750416932e+001;5.4931991675e+001;; +1.1250000000e+000;1.4914788980e+001;2.5923694994e+001;1.5649146647e+001;1.8549594210e+001;3.6351934576e+000;2.0465275980e+001;1.9821772868e+001;2.8389309220e+001;1.7901244049e+001;2.2624110315e+001;; +1.1250000000e+000;3.5322618325e+001;4.4287207645e+001;3.0293609932e+001;3.5781832532e+001;2.5339727121e+001;3.5686931496e+001;3.4246845957e+001;5.0497531571e+001;4.1897991963e+001;4.6085858720e+001;; +1.1250000000e+000;2.2287436998e+001;4.1526432043e+001;2.2268417769e+001;3.3081409044e+001;2.1384106631e+001;2.5303324646e+001;2.9296624430e+001;4.4187126385e+001;1.8250969235e+001;3.3134510434e+001;; +1.1250000000e+000;2.7798547234e+001;4.6910313297e+001;2.6765133277e+001;4.0359003804e+001;2.3343468712e+001;3.3009695419e+001;3.5381853733e+001;6.2024029088e+001;3.3263920548e+001;4.1084194361e+001;; +1.1250000000e+000;3.5830889628e+001;4.0205373928e+001;3.2289217158e+001;3.7569477728e+001;3.9425932375e+001;3.4687014091e+001;3.2568928024e+001;5.4570938822e+001;3.6968581726e+001;3.2403121489e+001;; +1.1250000000e+000;1.4778791808e+001;3.6922990104e+001;1.6638358798e+001;2.8678076926e+001;1.5394873524e+001;2.1883320753e+001;2.7267128809e+001;3.6973870440e+001;1.5927409811e+001;3.5344271783e+001;; +1.1250000000e+000;1.5271464565e+001;2.0682369213e+001;1.3848235518e+001;1.6784188939e+001;2.1553875688e+001;1.7514640318e+001;1.7411018842e+001;1.9643872650e+001;1.6964753549e+001;1.7695925272e+001;; +1.1250000000e+000;2.9452242486e+001;3.0355540991e+001;2.8091738113e+001;2.6589498176e+001;2.8548436254e+001;3.0229248348e+001;2.7218377607e+001;2.3631069664e+001;3.0471711757e+001;2.6110959000e+001;; +1.1250000000e+000;2.4440045864e+001;4.1764962570e+001;2.1880782693e+001;3.4283267626e+001;2.4163583308e+001;2.7602480929e+001;2.9371826273e+001;5.0378352663e+001;2.4096414695e+001;3.5820449307e+001;; +1.1250000000e+000;2.9544043286e+001;3.8423959334e+001;2.8145831602e+001;3.3263490986e+001;2.7767334277e+001;3.0529164346e+001;2.9993204376e+001;3.7584453201e+001;2.9505911657e+001;3.4421048754e+001;; +1.1250000000e+000;2.2141424544e+001;3.5085476598e+001;2.0656114873e+001;3.0958387733e+001;1.7951923827e+001;2.5058189291e+001;2.6679740257e+001;3.8739058975e+001;2.4026442730e+001;2.7313666074e+001;; +1.1250000000e+000;1.4169852738e+001;2.5972613925e+001;1.5673913670e+001;2.3303098103e+001;8.2548185003e+000;2.0419257894e+001;2.0752450366e+001;2.2923602837e+001;1.5144942711e+001;2.0984873541e+001;; +1.1250000000e+000;2.8032556945e+001;3.6444143075e+001;2.7200147866e+001;2.8946105142e+001;2.9186279097e+001;2.9020606371e+001;2.7965763835e+001;3.6444355267e+001;2.5639412753e+001;3.2178934999e+001;; +1.1250000000e+000;2.5727682892e+001;3.6477980742e+001;2.9172431960e+001;3.1231211057e+001;1.9073320781e+001;2.8967136290e+001;2.9794613071e+001;3.8100565760e+001;2.4660839617e+001;3.1876502410e+001;; +1.1250000000e+000;2.6295885121e+001;3.5860491110e+001;2.6492812375e+001;2.9529664837e+001;2.4137015420e+001;2.7746956134e+001;2.7737691756e+001;3.8700957670e+001;2.6050602756e+001;3.0680160843e+001;; +1.1250000000e+000;1.9796177244e+001;3.1071323136e+001;1.8174999557e+001;2.5808193850e+001;1.6944679632e+001;2.2441513743e+001;2.3491709162e+001;2.9884592103e+001;2.1160894838e+001;2.8165036341e+001;; +1.1250000000e+000;2.1672957941e+001;3.2036350818e+001;2.0240255646e+001;2.6627816116e+001;1.7552159412e+001;2.4633102004e+001;2.5227266230e+001;3.1337211517e+001;2.3374720441e+001;2.7417987909e+001;; +1.1250000000e+000;2.1200699323e+001;3.4253275211e+001;2.0694761964e+001;2.9949592424e+001;1.6154211631e+001;2.4128436480e+001;2.6398064283e+001;3.8691210264e+001;2.2706975904e+001;2.7992895405e+001;; +1.1250000000e+000;2.7208900281e+001;3.6591576172e+001;2.5594144791e+001;3.1317370039e+001;2.3100914866e+001;2.9059065008e+001;2.8770623163e+001;4.0188671178e+001;2.9963325974e+001;3.1519825593e+001;; +1.1250000000e+000;2.2556258590e+001;3.3510086689e+001;2.1726216091e+001;2.7438456465e+001;1.8000887259e+001;2.5231696970e+001;2.6235098831e+001;3.4190258103e+001;2.3367953587e+001;2.8970819548e+001;; +1.1250000000e+000;2.5927783038e+001;3.3584159607e+001;2.5274019824e+001;2.8899399670e+001;2.4037485896e+001;2.7995566205e+001;2.7252240068e+001;3.1952780358e+001;2.6701320294e+001;2.9675839211e+001;; +1.1250000000e+000;2.3762427397e+001;3.1331889228e+001;2.1984420636e+001;2.7537813359e+001;1.9649199416e+001;2.5232273535e+001;2.4995888639e+001;3.1955115644e+001;2.3449377482e+001;2.6596022097e+001;; +1.1250000000e+000;2.4409806464e+001;3.6604774038e+001;2.4433643746e+001;3.1476827685e+001;2.1674437636e+001;2.7188823940e+001;2.8280737901e+001;3.8750456962e+001;2.4291137996e+001;3.2450564352e+001;; +1.1250000000e+000;2.3807016635e+001;3.4070800995e+001;2.3151651133e+001;2.9764309310e+001;2.0550804141e+001;2.5795777451e+001;2.6524241098e+001;3.4469412275e+001;2.3430488308e+001;2.9100624508e+001;; +1.1250000000e+000;2.1865833300e+001;3.2236211627e+001;2.1728358733e+001;2.8161189683e+001;1.5600353344e+001;2.4810665349e+001;2.5472255025e+001;3.1483551922e+001;2.2541012647e+001;2.7562338389e+001;; +1.1250000000e+000;2.4111749343e+001;3.2006132024e+001;2.3689276345e+001;2.7720331139e+001;2.1889672662e+001;2.5856229308e+001;2.5435711262e+001;3.1156305934e+001;2.4165446346e+001;2.7654157299e+001;; +1.1250000000e+000;2.4118407614e+001;3.0845503971e+001;2.3495737188e+001;2.6413287891e+001;2.1018604344e+001;2.6163772065e+001;2.5328399812e+001;2.8294989057e+001;2.4983794942e+001;2.6988434376e+001;; +1.1250000000e+000;2.2460569725e+001;3.2309806369e+001;2.1496440322e+001;2.7449435614e+001;1.8648651060e+001;2.4590946534e+001;2.4998125285e+001;3.2581144773e+001;2.2191206778e+001;2.7351133511e+001;; +1.1250000000e+000;2.5830496598e+001;3.4402284170e+001;2.4351887635e+001;2.9602348052e+001;2.3346182984e+001;2.7131188395e+001;2.7297494566e+001;3.5581133049e+001;2.7294800106e+001;3.0235027429e+001;; +1.1250000000e+000;2.2705820727e+001;3.3392304506e+001;2.2069280189e+001;2.8974924186e+001;1.8902073816e+001;2.5505074575e+001;2.6149540810e+001;3.4722574040e+001;2.3481415806e+001;2.8629028800e+001;; +1.1250000000e+000;2.1948956741e+001;3.3506111074e+001;2.1350159903e+001;2.8975750091e+001;1.7150754691e+001;2.4773600784e+001;2.5823637635e+001;3.5429292848e+001;2.2378427675e+001;2.8449248991e+001;; +1.1250000000e+000;2.2165235832e+001;3.2862474278e+001;2.2018922972e+001;2.8143827226e+001;1.8530843484e+001;2.4834722776e+001;2.5493878796e+001;3.3875322280e+001;2.2021721139e+001;2.7868265673e+001;; +1.1250000000e+000;2.3719198629e+001;3.3513403663e+001;2.3359304593e+001;2.8669338256e+001;1.9218858345e+001;2.6058585082e+001;2.6426527689e+001;3.4096677601e+001;2.4415267956e+001;2.9293767572e+001;; +1.1250000000e+000;2.1723943552e+001;3.2057550388e+001;2.1224758200e+001;2.7205370583e+001;1.7247347018e+001;2.4425263402e+001;2.4900685432e+001;3.2385709045e+001;2.2030321965e+001;2.7715033271e+001;; +1.1250000000e+000;2.3529620915e+001;3.1522686684e+001;2.2417018697e+001;2.6756977348e+001;2.0445470503e+001;2.5368782188e+001;2.5090317197e+001;3.1081941877e+001;2.4117099392e+001;2.7557553429e+001;; +1.1250000000e+000;2.2537195216e+001;3.3312575810e+001;2.1925258922e+001;2.8786756434e+001;1.8402882840e+001;2.5104160285e+001;2.5902097960e+001;3.4206717337e+001;2.2993313552e+001;2.8700121092e+001;; +1.1250000000e+000;2.2548505471e+001;3.2617595708e+001;2.1774719398e+001;2.8101888955e+001;1.8379710604e+001;2.5227048000e+001;2.5808113430e+001;3.2866413261e+001;2.3633668508e+001;2.8391173256e+001;; +1.1250000000e+000;2.2557135961e+001;3.2343833923e+001;2.2275851575e+001;2.7663585328e+001;1.9224518915e+001;2.4941168185e+001;2.5321744932e+001;3.2698353769e+001;2.2490705456e+001;2.7836041620e+001;; +1.1250000000e+000;2.2965454064e+001;3.2507987023e+001;2.2038262127e+001;2.7998030942e+001;1.9208773283e+001;2.5154297036e+001;2.5411785105e+001;3.3030274484e+001;2.3324530697e+001;2.7888647687e+001;; +1.1250000000e+000;2.1449762627e+001;3.1642601096e+001;2.0952719876e+001;2.7171510287e+001;1.7309489718e+001;2.4197881202e+001;2.4752705362e+001;3.1698686159e+001;2.1681625081e+001;2.7256649947e+001;; +1.1250000000e+000;2.3032726785e+001;3.1536162031e+001;2.2233873945e+001;2.7101811757e+001;1.9919979993e+001;2.5077488582e+001;2.5031729507e+001;3.1126859829e+001;2.3303438418e+001;2.7312910822e+001;; +1.1250000000e+000;2.2778158675e+001;3.2066036079e+001;2.2208546025e+001;2.7409977529e+001;1.9063587079e+001;2.5029409332e+001;2.5357585257e+001;3.1932393915e+001;2.3182805005e+001;2.8105468899e+001;; +1.1250000000e+000;2.2335441677e+001;3.2107014594e+001;2.1592662592e+001;2.7497637172e+001;1.8628181225e+001;2.4706840177e+001;2.5232305841e+001;3.2411286031e+001;2.2661498944e+001;2.7761780077e+001;; +1.1250000000e+000;2.1741523207e+001;3.1847310257e+001;2.1258268056e+001;2.7409852804e+001;1.7653160532e+001;2.4380643943e+001;2.4983923656e+001;3.2093421345e+001;2.2142329225e+001;2.7418036819e+001;; +1.1250000000e+000;2.2468937945e+001;3.1815280955e+001;2.1655077626e+001;2.7304475040e+001;1.8682832931e+001;2.4715259267e+001;2.5068964270e+001;3.2002123719e+001;2.2956222037e+001;2.7481111655e+001;; +1.1250000000e+000;2.2177031140e+001;3.1725307862e+001;2.1533991069e+001;2.7232355993e+001;1.8162055304e+001;2.4569268765e+001;2.4989547372e+001;3.1831625953e+001;2.2633066369e+001;2.7588549863e+001;; +1.1250000000e+000;2.2351759509e+001;3.1840478787e+001;2.1626393559e+001;2.7290713613e+001;1.8485218275e+001;2.4689182879e+001;2.5072939006e+001;3.2067809254e+001;2.2858023730e+001;2.7659916940e+001;; +1.1250000000e+000;2.1964942449e+001;3.1740055659e+001;2.1227635247e+001;2.7262686602e+001;1.7917030925e+001;2.4412653455e+001;2.4948639883e+001;3.2207232270e+001;2.2472341390e+001;2.7497283136e+001;; +1.1250000000e+000;2.2019411351e+001;3.1723514288e+001;2.1298554413e+001;2.7221996189e+001;1.8175706424e+001;2.4478426080e+001;2.4924441634e+001;3.2038936313e+001;2.2477482823e+001;2.7521085783e+001;; +1.1250000000e+000;2.2243773386e+001;3.1776475368e+001;2.1576035268e+001;2.7255820988e+001;1.8492732685e+001;2.4567867303e+001;2.5003568229e+001;3.1984408766e+001;2.2588741320e+001;2.7602515496e+001;; +1.1250000000e+000;2.2366613088e+001;3.1855202290e+001;2.1626385515e+001;2.7351905570e+001;1.8639262311e+001;2.4649898797e+001;2.5071846525e+001;3.2119170995e+001;2.2794084739e+001;2.7687559954e+001;; +1.1250000000e+000;2.1946072390e+001;3.1512062398e+001;2.1274517716e+001;2.7048391504e+001;1.8062690514e+001;2.4344979667e+001;2.4791675797e+001;3.1700890117e+001;2.2331387819e+001;2.7307490180e+001;; +1.1250000000e+000;2.1940382850e+001;3.1541869031e+001;2.1368815947e+001;2.7051074462e+001;1.8019325110e+001;2.4332770096e+001;2.4827062094e+001;3.1755400790e+001;2.2282327482e+001;2.7397226800e+001;; +1.1250000000e+000;2.2095733099e+001;3.1413076378e+001;2.1382671027e+001;2.6939265491e+001;1.8339421709e+001;2.4370968304e+001;2.4757996379e+001;3.1537378672e+001;2.2494023390e+001;2.7306881451e+001;; +1.1250000000e+000;2.1909107201e+001;3.1431463201e+001;2.1203836156e+001;2.6942464521e+001;1.8013127342e+001;2.4274003539e+001;2.4723090213e+001;3.1609934102e+001;2.2320005232e+001;2.7323626155e+001;; +1.1250000000e+000;2.1951692309e+001;3.1452213495e+001;2.1234440917e+001;2.6994683156e+001;1.8116408479e+001;2.4284062963e+001;2.4747140047e+001;3.1703183121e+001;2.2329976421e+001;2.7293285923e+001;; +1.1250000000e+000;2.1945196533e+001;3.1423920080e+001;2.1262149103e+001;2.6968397763e+001;1.8109985288e+001;2.4282073701e+001;2.4723537130e+001;3.1649219491e+001;2.2315062640e+001;2.7270053049e+001;; +1.1250000000e+000;2.1929778800e+001;3.1382434830e+001;2.1223584802e+001;2.6931116379e+001;1.8116517193e+001;2.4248845241e+001;2.4703305933e+001;3.1628278875e+001;2.2308959380e+001;2.7221829766e+001;; +1.1250000000e+000;2.1943759009e+001;3.1351060723e+001;2.1240297525e+001;2.6902956103e+001;1.8140789487e+001;2.4243141035e+001;2.4674617495e+001;3.1584902030e+001;2.2328930362e+001;2.7222293853e+001;; +1.1250000000e+000;2.1920440485e+001;3.1358735594e+001;2.1217774052e+001;2.6901959596e+001;1.8128327332e+001;2.4227300814e+001;2.4682812351e+001;3.1600665751e+001;2.2295551654e+001;2.7244292118e+001;; +1.1250000000e+000;2.1856741536e+001;3.1274906874e+001;2.1153060191e+001;2.6824447103e+001;1.8034683496e+001;2.4169440840e+001;2.4614271677e+001;3.1498238695e+001;2.2246671752e+001;2.7166333171e+001;; +1.1250000000e+000;2.1828758556e+001;3.1266527651e+001;2.1129386856e+001;2.6827243395e+001;1.7990084362e+001;2.4150311646e+001;2.4608522829e+001;3.1495913879e+001;2.2209567718e+001;2.7165582792e+001;; +1.1250000000e+000;2.1842321135e+001;3.1236111079e+001;2.1142247093e+001;2.6801278463e+001;1.8044249647e+001;2.4140787013e+001;2.4586913079e+001;3.1470283491e+001;2.2214561202e+001;2.7131022350e+001;; +1.1250000000e+000;2.1799273683e+001;3.1208924729e+001;2.1100029329e+001;2.6778619931e+001;1.7971121293e+001;2.4110742290e+001;2.4565478526e+001;3.1441725509e+001;2.2170278331e+001;2.7110098033e+001;; +1.1250000000e+000;2.1797469011e+001;3.1194618148e+001;2.1093307086e+001;2.6761968185e+001;1.7977933220e+001;2.4104266302e+001;2.4553030548e+001;3.1417953253e+001;2.2178058583e+001;2.7100549454e+001;; +1.1250000000e+000;2.1795530903e+001;3.1155946169e+001;2.1089367409e+001;2.6735701945e+001;1.8010539302e+001;2.4085963518e+001;2.4527350386e+001;3.1374852554e+001;2.2159955365e+001;2.7063770865e+001;; +1.1250000000e+000;2.1774813454e+001;3.1146746583e+001;2.1065187791e+001;2.6725367357e+001;1.7972783014e+001;2.4073010370e+001;2.4519601760e+001;3.1375412035e+001;2.2145315264e+001;2.7058755551e+001;; +1.1250000000e+000;2.1766871115e+001;3.1129974991e+001;2.1058570214e+001;2.6711493178e+001;1.7979221472e+001;2.4059742272e+001;2.4506445006e+001;3.1356159632e+001;2.2133518517e+001;2.7045175028e+001;; +1.1250000000e+000;2.1752436702e+001;3.1114576073e+001;2.1045686698e+001;2.6698411899e+001;1.7960572694e+001;2.4045855317e+001;2.4494304275e+001;3.1339115544e+001;2.2114675958e+001;2.7035382544e+001;; +1.1250000000e+000;2.1734524787e+001;3.1092004936e+001;2.1025837141e+001;2.6679745449e+001;1.7940421266e+001;2.4026445031e+001;2.4475739741e+001;3.1318127338e+001;2.2096386826e+001;2.7013205626e+001;; +1.1250000000e+000;2.1724500738e+001;3.1072488717e+001;2.1018403965e+001;2.6663336207e+001;1.7933260037e+001;2.4015065839e+001;2.4463263143e+001;3.1296358680e+001;2.2084906936e+001;2.6997833548e+001;; +1.1250000000e+000;2.1712087992e+001;3.1056243676e+001;2.1004631384e+001;2.6649250833e+001;1.7921076123e+001;2.4001912190e+001;2.4450314138e+001;3.1279166630e+001;2.2071705846e+001;2.6985254412e+001;; +1.1250000000e+000;2.1702872705e+001;3.1046412207e+001;2.0995273029e+001;2.6640962648e+001;1.7912401448e+001;2.3992299596e+001;2.4441704684e+001;3.1272970611e+001;2.2063575822e+001;2.6976787810e+001;; +1.1250000000e+000;2.1695460194e+001;3.1034514733e+001;2.0987690736e+001;2.6630899833e+001;1.7907253115e+001;2.3983153735e+001;2.4432757139e+001;3.1261154539e+001;2.2054227847e+001;2.6967164141e+001;; +1.1250000000e+000;2.1689380884e+001;3.1023893160e+001;2.0980818815e+001;2.6621630747e+001;1.7902906263e+001;2.3975320403e+001;2.4424809546e+001;3.1251008074e+001;2.2047590776e+001;2.6958842761e+001;; +1.1250000000e+000;2.1681476018e+001;3.1013293392e+001;2.0972919447e+001;2.6612741051e+001;1.7895787692e+001;2.3966887604e+001;2.4416687786e+001;3.1239710133e+001;2.2038778149e+001;2.6950231208e+001;; +1.1250000000e+000;2.1675380896e+001;3.1004433701e+001;2.0966762402e+001;2.6605324655e+001;1.7890349233e+001;2.3959915641e+001;2.4409898075e+001;3.1231171535e+001;2.2032040072e+001;2.6942857196e+001;; +1.1250000000e+000;2.1670463551e+001;3.0996909726e+001;2.0961726362e+001;2.6598916793e+001;1.7886553894e+001;2.3954204971e+001;2.4404168039e+001;3.1223671009e+001;2.2026528633e+001;2.6936839714e+001;; +1.1250000000e+000;2.1665979205e+001;3.0990524981e+001;2.0957084538e+001;2.6593514700e+001;1.7882656029e+001;2.3949130093e+001;2.4399267581e+001;3.1217364586e+001;2.2021649528e+001;2.6931649976e+001;; +1.1250000000e+000;2.1662315433e+001;3.0985254994e+001;2.0953342291e+001;2.6589056118e+001;1.7879517626e+001;2.3944984505e+001;2.4395235423e+001;3.1212175945e+001;2.2017592748e+001;2.6927353328e+001;; +1.1250000000e+000;2.1659483550e+001;3.0981122728e+001;2.0950438031e+001;2.6585557332e+001;1.7877116022e+001;2.3941763175e+001;2.4392070024e+001;3.1208072193e+001;2.2014466423e+001;2.6923976350e+001;; +1.1250000000e+000;2.1657453487e+001;3.0978195754e+001;2.0948360329e+001;2.6583080854e+001;1.7875376928e+001;2.3939467143e+001;2.4389829099e+001;3.1205178359e+001;2.2012232394e+001;2.6921591535e+001;; +1.1250000000e+000;2.1656242012e+001;3.0976439867e+001;2.0947118165e+001;2.6581595355e+001;1.7874344302e+001;2.3938092444e+001;2.4388484663e+001;3.1203442391e+001;2.2010899630e+001;2.6920160264e+001;; +1.1250000000e+000;2.1655837852e+001;3.0975853977e+001;2.0946703902e+001;2.6581099529e+001;1.7873999864e+001;2.3937633804e+001;2.4388036106e+001;3.1202862462e+001;2.2010454769e+001;2.6919682720e+001;; diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-stimulation.csv b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-stimulation.csv new file mode 100755 index 0000000..07c0db3 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-stimulation.csv @@ -0,0 +1,11 @@ +Time (s);Identifier;Duration +0.0000000000e+000;1009;0.0000000000e+000 +2.9296875000e-003;9000;0.0000000000e+000 +2.9296875000e-003;785;0.0000000000e+000 +9.7656250000e-003;9001;0.0000000000e+000 +9.7656250000e-003;785;0.0000000000e+000 +1.3671875000e-002;768;0.0000000000e+000 +1.3671875000e-002;786;0.0000000000e+000 +1.8554687500e-002;785;0.0000000000e+000 +2.3437500000e-002;770;0.0000000000e+000 +3.9062500000e-002;33284;0.0000000000e+000 diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-streamed-matrix.csv b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-streamed-matrix.csv new file mode 100755 index 0000000..8f12d6a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/input-streamed-matrix.csv @@ -0,0 +1,113 @@ +Time (s);Noise 1;Noise 2;Noise 3;Noise 4;Noise 5 +0.0000000000e+000;8.6751914024e-001;6.1922054738e-002;2.7826777101e-001;6.1357462406e-001;9.6374398470e-001 +0.0000000000e+000;8.2265692949e-001;9.0258491039e-001;5.5793941021e-001;4.0375986695e-001;6.5861994028e-001 +0.0000000000e+000;8.2885217667e-001;8.8842433691e-001;7.9830318689e-001;9.9472028017e-001;1.0321360081e-001 +0.0000000000e+000;2.0657978952e-001;2.6273384690e-001;5.3794974089e-001;8.7987911701e-001;5.6788843870e-001 +0.0000000000e+000;3.5068818927e-001;7.9256571829e-002;3.4061709046e-001;1.2298959494e-001;1.1957152188e-001 +0.0000000000e+000;1.8753623962e-001;5.0599688292e-001;1.5625476837e-001;5.7997375727e-001;1.0364086181e-001 +0.0000000000e+000;6.6194646060e-002;1.2329477817e-002;6.7256689072e-001;5.0303661823e-001;3.0570390821e-001 +0.0000000000e+000;1.7221595347e-001;3.8709676266e-001;8.3138525486e-001;7.9268777370e-001;5.2146977186e-001 +0.0000000000e+000;3.9924314618e-001;3.2114627957e-001;9.4018369913e-001;4.2469558120e-001;5.4414503276e-002 +0.0000000000e+000;2.6987516880e-001;6.2474441528e-001;2.3242896795e-001;4.9409466982e-001;4.7691273689e-001 +0.0000000000e+000;9.4164860249e-001;5.4567094892e-002;8.7630850077e-001;4.8463392258e-001;9.5928829908e-001 +0.0000000000e+000;7.5853753090e-001;2.7002778649e-001;7.5328838825e-001;1.3116855919e-001;3.2068848610e-001 +0.0000000000e+000;2.6218450069e-001;2.8260139748e-002;8.4688864648e-002;1.9403667748e-001;1.3647878170e-001 +0.0000000000e+000;3.6133915186e-002;2.8131961823e-001;5.3886532784e-001;9.2721337080e-001;5.1203954220e-001 +0.0000000000e+000;9.1570788622e-001;2.1372112632e-001;3.2477799058e-001;6.7479473352e-001;8.4789574146e-001 +0.0000000000e+000;4.3031098321e-003;1.7273476347e-002;5.4094058275e-001;9.5367288589e-001;1.5927609801e-001 +3.1250000000e-002;6.4851832390e-001;3.6439102143e-002;1.6992706060e-001;3.9017915726e-001;9.6227914095e-001 +3.1250000000e-002;2.6947844028e-001;3.6988433450e-002;7.4022644758e-001;2.6172673702e-001;7.1269875765e-001 +3.1250000000e-002;5.6404310465e-001;2.5659963489e-001;1.2497329712e-001;8.0263680220e-001;2.3740348220e-001 +3.1250000000e-002;4.3791007996e-001;7.5685903430e-003;6.0115361214e-001;4.7450178862e-001;9.4018369913e-001 +3.1250000000e-002;3.5377055407e-001;8.0401015282e-001;2.8717918321e-002;7.9158908129e-001;6.8617814779e-001 +3.1250000000e-002;6.3447982073e-002;9.3038725853e-001;4.3516343832e-001;6.9331949949e-001;3.3011871576e-001 +3.1250000000e-002;8.5320597887e-001;5.1377910376e-001;8.7652212381e-001;3.7607958913e-001;9.1799676418e-001 +3.1250000000e-002;3.5618153214e-001;8.4813988209e-001;8.8653218746e-001;8.2338941097e-001;5.9874266386e-001 +3.1250000000e-002;8.4536272287e-001;1.7487105727e-001;4.0662860870e-001;5.1561021805e-001;7.1321755648e-001 +3.1250000000e-002;3.9063692093e-002;9.5477157831e-001;3.9185766131e-002;2.7362895012e-001;9.3029570580e-001 +3.1250000000e-002;6.9582201540e-003;5.8632159233e-001;5.3294473886e-001;1.8439283967e-001;5.1881466061e-003 +3.1250000000e-002;3.5807368159e-001;5.2354502678e-001;4.6659749746e-001;3.3079013228e-001;8.7887203693e-001 +3.1250000000e-002;3.3475753665e-001;4.7926267982e-001;1.5286721289e-001;4.5609912276e-001;6.3200783730e-001 +3.1250000000e-002;4.3134862185e-001;2.0355846733e-002;9.3661308289e-001;2.8476822376e-001;7.4199652672e-001 +3.1250000000e-002;2.1143223345e-001;5.4094058275e-001;6.4519178867e-001;9.9111908674e-001;3.2883694768e-001 +3.1250000000e-002;7.1208840609e-001;9.4167912006e-001;7.8035831451e-002;3.7656790018e-001;2.4311044812e-001 +6.2500000000e-002;7.0000302792e-001;5.9117406607e-001;4.2222356796e-001;4.0357676148e-001;7.9439681768e-001 +6.2500000000e-002;5.5766475201e-001;7.3986023664e-001;8.0590230227e-001;3.0976288021e-002;5.4377877712e-001 +6.2500000000e-002;3.1669056416e-001;4.9232459068e-001;4.0552994609e-001;5.1203954220e-001;7.0705282688e-001 +6.2500000000e-002;4.9232459068e-001;9.3176060915e-001;4.9092075229e-001;9.5895260572e-001;8.0654317141e-001 +6.2500000000e-002;7.6128423214e-001;1.4566484094e-001;6.7329937220e-001;5.0807213783e-001;7.6909697056e-001 +6.2500000000e-002;6.0560929775e-001;5.3956723213e-001;3.6591693759e-002;1.1047700420e-002;5.1200902462e-001 +6.2500000000e-002;5.0328075886e-001;8.5381633043e-001;3.7110507488e-002;9.1463975608e-002;6.5077668428e-001 +6.2500000000e-002;8.6541336775e-001;1.1416974664e-001;7.9869991541e-001;4.6046328545e-001;8.5393840075e-001 +6.2500000000e-002;7.2023682296e-002;1.5112766623e-001;6.2074649334e-001;8.8760030270e-001;7.1962642670e-001 +6.2500000000e-002;6.9743949175e-001;8.0437636375e-001;1.4636677504e-001;4.0974152088e-001;1.9681386650e-001 +6.2500000000e-002;2.1179845929e-001;3.9762565494e-001;1.5799432993e-001;7.1532332897e-001;5.4377877712e-001 +6.2500000000e-002;6.1769461632e-001;9.2327648401e-001;1.6574601829e-001;8.3443707228e-001;6.6270941496e-001 +6.2500000000e-002;6.9121372700e-001;3.6988433450e-002;9.0151675045e-002;9.1409039497e-001;8.3971679211e-001 +6.2500000000e-002;6.8251591921e-001;3.0289620161e-001;7.4697101116e-001;2.3084200919e-001;1.6785180569e-001 +6.2500000000e-002;3.1675159931e-001;1.4639729261e-001;1.6754661500e-001;5.1319926977e-001;7.2444838285e-001 +6.2500000000e-002;3.5880610347e-001;8.0526137352e-001;1.8936735392e-001;7.6857817173e-001;5.7554858923e-001 +9.3750000000e-002;5.2766501904e-001;8.3526110649e-001;8.7285989523e-001;3.4492018819e-001;1.2979522347e-001 +9.3750000000e-002;4.5152133703e-001;9.6493422985e-001;5.2320933342e-001;9.1915649176e-001;4.2402416468e-001 +9.3750000000e-002;9.5016324520e-001;8.9046907425e-001;4.9147006869e-001;6.5617847443e-001;8.5204625130e-001 +9.3750000000e-002;3.1107518077e-001;6.8156987429e-001;1.8366038799e-001;2.6468703151e-001;6.7857903242e-001 +9.3750000000e-002;1.5543076396e-001;5.7136756182e-001;7.5112158060e-001;8.8409072161e-001;2.3966185749e-001 +9.3750000000e-002;8.4832298756e-001;7.1364480257e-001;3.1134983897e-001;4.7965940833e-001;8.1646168232e-001 +9.3750000000e-002;5.6971955299e-001;5.4857021570e-001;7.5847649574e-001;4.6610918641e-001;6.5895563364e-001 +9.3750000000e-002;7.1382790804e-002;6.6808068752e-001;7.8707236052e-001;2.8434094787e-001;8.5381633043e-001 +9.3750000000e-002;8.7112033367e-001;7.0772421360e-001;8.3138525486e-001;7.0543533564e-001;2.7942746878e-001 +9.3750000000e-002;1.5091402829e-001;8.1453904510e-002;8.8747829199e-002;6.8923002481e-001;9.4024473429e-001 +9.3750000000e-002;9.9465924501e-001;9.2114019394e-001;3.0329295993e-001;8.7328714132e-001;7.4007385969e-001 +9.3750000000e-002;7.5316631794e-001;7.0253610611e-001;7.2664570808e-001;7.8551590443e-001;7.0821255445e-001 +9.3750000000e-002;9.0578936040e-002;4.0784937143e-001;6.7519152164e-001;5.4387032986e-001;5.7741019875e-002 +9.3750000000e-002;2.9367962480e-001;7.9116183519e-001;4.1547897458e-001;6.1903744936e-001;6.7653429508e-001 +9.3750000000e-002;3.7571337819e-001;6.9957578182e-001;2.1176794171e-001;3.3631396294e-001;3.0396435410e-002 +9.3750000000e-002;5.4347360134e-001;6.3084810972e-001;9.4662314653e-001;8.7508773804e-001;2.0090334117e-001 +1.2500000000e-001;9.0469068289e-001;7.7047026157e-001;8.7707144022e-001;4.8005614430e-002;4.0583515167e-001 +1.2500000000e-001;9.1259497404e-001;9.8818933964e-001;1.0757774860e-001;7.0619833469e-001;3.2276377082e-001 +1.2500000000e-001;7.3592334986e-001;7.7919858694e-001;8.9260536432e-001;5.1454208791e-002;9.2046874762e-001 +1.2500000000e-001;6.1088901758e-001;8.0385756493e-001;6.8129521608e-001;4.7376933694e-001;3.4336376190e-001 +1.2500000000e-001;7.9244363308e-001;8.4694969654e-001;6.6289252043e-001;8.0019533634e-002;1.4316232502e-001 +1.2500000000e-001;8.0446791649e-001;9.3612474203e-001;8.3867913485e-001;3.9909055829e-001;8.8915675879e-001 +1.2500000000e-001;6.7021697760e-001;8.0367439985e-001;9.5898312330e-001;2.5632494688e-001;6.6176337004e-001 +1.2500000000e-001;1.5222632885e-001;9.2425304651e-001;1.2741477787e-001;5.7191688567e-002;4.7187718749e-001 +1.2500000000e-001;6.1436814070e-001;5.0749230385e-001;1.1740470678e-001;5.8903777599e-001;6.7864006758e-001 +1.2500000000e-001;5.6523329020e-001;7.8646197915e-002;9.1097748280e-001;5.3358560801e-001;5.8403271437e-001 +1.2500000000e-001;1.4709921554e-002;4.3516343832e-001;9.9127173424e-001;5.4991304874e-001;4.7987303138e-001 +1.2500000000e-001;3.1806391478e-001;5.5751210451e-001;6.1305582523e-001;4.0375988930e-002;8.8937038183e-001 +1.2500000000e-001;2.7826777101e-001;9.0945160389e-001;9.2284917831e-001;1.8262276053e-001;7.0558793843e-002 +1.2500000000e-001;8.0996125937e-001;3.1345561147e-001;6.7857903242e-001;7.1904659271e-001;6.9588303566e-001 +1.2500000000e-001;4.0937528014e-001;3.7186804414e-001;2.2461622953e-001;3.0768761039e-001;6.1925107241e-001 +1.2500000000e-001;2.3422956467e-001;9.3554490805e-001;4.0620137006e-002;1.8579669297e-001;3.2715842128e-002 +1.5625000000e-001;9.9685657024e-001;4.1611987352e-001;4.3266090751e-001;6.1418497562e-001;9.5236063004e-001 +1.5625000000e-001;7.2475355864e-001;3.2959990203e-002;8.4685814381e-001;3.6927396059e-001;5.3172397614e-001 +1.5625000000e-001;4.7871333361e-001;6.4485609531e-001;9.0197455883e-001;9.2254400253e-001;1.9354838133e-001 +1.5625000000e-001;5.0889617205e-001;3.7073886395e-001;6.3603627682e-001;4.4340342283e-001;4.8826563358e-001 +1.5625000000e-001;7.2722554207e-001;1.6217535734e-001;8.5814994574e-001;9.3020415306e-001;8.2357251644e-001 +1.5625000000e-001;9.0365305543e-002;4.1904965043e-001;5.1240578294e-002;4.7791987658e-002;4.7923216224e-001 +1.5625000000e-001;6.1192661524e-001;6.3917964697e-001;9.9661242962e-001;2.8302866220e-001;6.7903682590e-002 +1.5625000000e-001;7.1773427725e-001;8.5384684801e-001;7.7721488476e-001;3.4772789478e-001;5.1319926977e-001 +1.5625000000e-001;3.7879574299e-001;5.4341256618e-001;5.1277202368e-001;7.3839533329e-001;4.0818506479e-001 +1.5625000000e-001;9.9081391096e-001;9.8361156881e-002;7.9232156277e-001;6.2416458130e-001;9.3649095297e-001 +1.5625000000e-001;2.7692496777e-001;1.8878750503e-001;8.4014403820e-001;8.5757011175e-001;4.9464401603e-001 +1.5625000000e-001;8.2897424698e-001;2.7228614688e-001;5.0160223246e-001;7.9332864285e-001;5.4295480251e-001 +1.5625000000e-001;1.1096530408e-001;5.9575182199e-001;2.0935697854e-001;6.5388959646e-001;2.7393415570e-001 +1.5625000000e-001;4.4236579537e-001;4.8905912042e-001;1.8875698745e-001;8.4157842398e-001;8.1981873512e-001 +1.5625000000e-001;4.4068726897e-001;9.6166872978e-001;9.0490430593e-001;1.5146335959e-001;3.6558121443e-001 +1.5625000000e-001;3.9344462752e-001;3.5535752773e-001;4.0632343292e-001;5.5955684185e-001;4.7862178087e-001 +1.8750000000e-001;4.8756369948e-001;9.3414103985e-001;3.0509352684e-001;5.3740042448e-001;1.1676381528e-001 +1.8750000000e-001;1.1908322573e-001;8.9483320713e-001;7.2597432137e-001;7.0793783665e-001;2.8974273801e-001 +1.8750000000e-001;6.4143800735e-001;2.5702688098e-001;7.2072511911e-001;2.7253029868e-002;1.1084322631e-001 +1.8750000000e-001;1.4752647281e-001;6.0487687588e-001;9.7552412748e-001;4.3140965700e-001;3.2605975866e-001 +1.8750000000e-001;9.3859678507e-001;2.5562304258e-001;9.6014285088e-001;6.7598499358e-002;4.8707541078e-002 +1.8750000000e-001;5.5095064640e-001;7.2808009386e-001;8.6046940088e-001;3.0777916312e-001;6.4424574375e-002 +1.8750000000e-001;5.1646471024e-001;1.4526810497e-002;7.9378640652e-001;5.5647450686e-001;1.0058900714e-001 +1.8750000000e-001;4.3427839875e-001;6.0954618454e-001;4.5777764171e-004;1.5634632111e-001;3.3948791027e-001 +1.8750000000e-001;7.1382790804e-002;2.6352733374e-001;1.3150425255e-001;5.8534502983e-002;2.8916287422e-001 +1.8750000000e-001;9.8782312870e-001;7.7761165798e-002;6.7195653915e-001;5.2702414989e-001;8.1557667255e-001 +1.8750000000e-001;2.5687429309e-001;5.2681052685e-001;1.8878750503e-001;2.5428020954e-001;4.8655658960e-001 +1.8750000000e-001;3.9017915726e-001;3.4385204315e-001;9.0691852570e-001;2.0142216980e-001;9.3691825867e-002 +1.8750000000e-001;6.8178349733e-001;3.8212224841e-001;3.9738151431e-001;8.9251381159e-001;8.0001223087e-001 +1.8750000000e-001;6.9310587645e-001;3.5328227282e-001;1.3956114650e-001;9.6334725618e-001;4.3321025372e-001 +1.8750000000e-001;6.1961728334e-001;1.9257180393e-002;3.2828760147e-001;5.9373760223e-001;7.7083653212e-001 +1.8750000000e-001;6.0252690315e-001;2.7066865563e-001;8.4786522388e-001;8.4920805693e-001;6.5279088914e-002 diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/signal-badtimes.xml.in b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/signal-badtimes.xml.in new file mode 100755 index 0000000..a1da8a9 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/signal-badtimes.xml.in @@ -0,0 +1,260 @@ + + + + (0x00000be0, 0x000028dc) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + @OVT_TEST_TEMPORARY_DIR@/output-signal-badtimes.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 528.000000 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01301c58) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000e75, 0x00001cb3) + SignalNoFileTime + (0x641d0717, 0x02884107) + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x330306dd, 0x74a95f98) + Filename + + @CMAKE_CURRENT_SOURCE_DIR@/input-signal-badtimes.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x2cdb2f0b, 0x12f231ea) + Don't use the file time + false + true + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 224.000000 + + + (0x1fa963f5, 0x1a638cd4) + 53 + + + (0x207c9054, 0x3c841b63) + 528.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x3bf57676, 0xad3aaefa) + + + (0xad100179, 0xa3c984ab) + 122 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x03b20db6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + + + (0x00007ce9, 0x000034b7) + + (0x00000e75, 0x00001cb3) + 0 + + + (0x00000be0, 0x000028dc) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 257 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 331 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + + + + + (0x000057d8, 0x00005097) + Default window + 1 + (0xffffffff, 0xffffffff) + (0xffffffff, 0xffffffff) + 1 + + + (0x4c90d4ad, 0x7a2554ec) + 1 + + + (0x7b814cca, 0x271df6dd) + 1 + + + + + (0x000019df, 0x000079ec) + Default tab + 2 + (0x000057d8, 0x00005097) + 0 + (0xffffffff, 0xffffffff) + 1 + + + (0x000062c0, 0x00001744) + Empty + 0 + (0x000019df, 0x000079ec) + 0 + (0xffffffff, 0xffffffff) + 0 + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + 0.1 + + + (0x9f5c4075, 0x4a0d3666) + Tiny CSV IO test + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/signal-nofiletime.xml.in b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/signal-nofiletime.xml.in new file mode 100755 index 0000000..ee19225 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/signal-nofiletime.xml.in @@ -0,0 +1,260 @@ + + + + (0x00000be0, 0x000028d9) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + @OVT_TEST_TEMPORARY_DIR@/output-signal-nofiletime.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 384.000000 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01301c58) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000e75, 0x00001cb2) + SignalNoFileTime + (0x641d0717, 0x02884107) + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x330306dd, 0x74a95f98) + Filename + + @CMAKE_CURRENT_SOURCE_DIR@/input-signal.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x2cdb2f0b, 0x12f231ea) + Don't use the file time + false + true + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x1fa963f5, 0x1a638cd4) + 53 + + + (0x207c9054, 0x3c841b63) + 400.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x3bf57676, 0xad3aaefa) + + + (0xad100179, 0xa3c984ab) + 122 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x03b20db6) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + + + (0x00007ce9, 0x000034b6) + + (0x00000e75, 0x00001cb2) + 0 + + + (0x00000be0, 0x000028d9) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 305 + + + (0x358ae8b5, 0x0f8bacd1) + 400 + + + (0x3f0a3b27, 0x570913d2) + 331 + + + (0x6267b5c5, 0x676e3e42) + 384 + + + + + + + + + (0x000057d8, 0x00005097) + Default window + 1 + (0xffffffff, 0xffffffff) + (0xffffffff, 0xffffffff) + 1 + + + (0x4c90d4ad, 0x7a2554ec) + 1 + + + (0x7b814cca, 0x271df6dd) + 1 + + + + + (0x000019df, 0x000079ec) + Default tab + 2 + (0x000057d8, 0x00005097) + 0 + (0xffffffff, 0xffffffff) + 1 + + + (0x000062c0, 0x00001744) + Empty + 0 + (0x000019df, 0x000079ec) + 0 + (0xffffffff, 0xffffffff) + 0 + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + 0.1 + + + (0x9f5c4075, 0x4a0d3666) + Tiny CSV IO test + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/signal.xml.in b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/signal.xml.in new file mode 100755 index 0000000..a1f977a --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/signal.xml.in @@ -0,0 +1,264 @@ + + + + (0x00000be0, 0x000028d6) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + @OVT_TEST_TEMPORARY_DIR@/output-signal.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 352.000000 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x013e5cfe) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000e75, 0x00001caf) + Signal + (0x641d0717, 0x02884107) + + + (0x5ba36127, 0x195feae1) + Output signal + + + + + (0x330306dd, 0x74a95f98) + Filename + + @CMAKE_CURRENT_SOURCE_DIR@/input-signal.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x2cdb2f0b, 0x12f231ea) + Don't use the file time + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 32 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 240.000000 + + + (0x1fa963f5, 0x1a638cd4) + 53 + + + (0x207c9054, 0x3c841b63) + 352.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x3bf57676, 0xad3aaefa) + + + (0xad100179, 0xa3c984ab) + 85 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x03daa359) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + + + (0x00007ce9, 0x000034b3) + + (0x00000e75, 0x00001caf) + 0 + + + (0x00000be0, 0x000028d6) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 273 + + + (0x358ae8b5, 0x0f8bacd1) + 352 + + + (0x3f0a3b27, 0x570913d2) + 331 + + + (0x6267b5c5, 0x676e3e42) + 352 + + + + + + + + + (0x000057d8, 0x00005097) + Default window + 1 + (0xffffffff, 0xffffffff) + (0xffffffff, 0xffffffff) + 1 + + + (0x4c90d4ad, 0x7a2554ec) + 1 + + + (0x7b814cca, 0x271df6dd) + 1 + + + + + (0x000019df, 0x000079ec) + Default tab + 2 + (0x000057d8, 0x00005097) + 0 + (0xffffffff, 0xffffffff) + 1 + + + (0x000062c0, 0x00001744) + Empty + 0 + (0x000019df, 0x000079ec) + 0 + (0xffffffff, 0xffffffff) + 0 + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + 0.1 + + + (0x9f5c4075, 0x4a0d3666) + Tiny CSV IO test + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/spectrum.xml.in b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/spectrum.xml.in new file mode 100755 index 0000000..e62f862 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/spectrum.xml.in @@ -0,0 +1,272 @@ + + + + (0x00000be0, 0x000028da) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x1f261c0a, 0x593bf6bd) + Input signal + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + @OVT_TEST_TEMPORARY_DIR@/output-spectrum.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 348.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 512.000000 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01323728) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004da0, 0x000042c2) + Spectrum + (0x641d0717, 0x02884107) + + + (0x1f261c0a, 0x593bf6bd) + Output signal + + + + + (0x330306dd, 0x74a95f98) + Filename + + @CMAKE_CURRENT_SOURCE_DIR@/input-spectrum.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x2cdb2f0b, 0x12f231ea) + Don't use the file time + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Unused parameter + 32 + 0 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 201.000000 + + + (0x1fa963f5, 0x1a638cd4) + 53 + + + (0x207c9054, 0x3c841b63) + 512.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x3bf57676, 0xad3aaefa) + + + (0xad100179, 0xa3c984ab) + 85 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x03b4efa4) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + + + (0x00001d78, 0x00004a0d) + + (0x00004da0, 0x000042c2) + 0 + + + (0x00000be0, 0x000028da) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 234 + + + (0x358ae8b5, 0x0f8bacd1) + 512 + + + (0x3f0a3b27, 0x570913d2) + 327 + + + (0x6267b5c5, 0x676e3e42) + 512 + + + (0xc67a01dc, 0x28ce06c1) + + + + + + + + + + (0x000057d8, 0x00005097) + Default window + 1 + (0xffffffff, 0xffffffff) + (0xffffffff, 0xffffffff) + 1 + + + (0x4c90d4ad, 0x7a2554ec) + 1 + + + (0x7b814cca, 0x271df6dd) + 1 + + + + + (0x000019df, 0x000079ec) + Default tab + 2 + (0x000057d8, 0x00005097) + 0 + (0xffffffff, 0xffffffff) + 1 + + + (0x000062c0, 0x00001744) + Empty + 0 + (0x000019df, 0x000079ec) + 0 + (0xffffffff, 0xffffffff) + 0 + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + 0.1 + + + (0x9f5c4075, 0x4a0d3666) + Tiny CSV IO test + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/stimulation.xml.in b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/stimulation.xml.in new file mode 100755 index 0000000..73d4d54 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/stimulation.xml.in @@ -0,0 +1,264 @@ + + + + (0x00000be0, 0x000028d8) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x6f752dd0, 0x082a321e) + Input signal + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + @OVT_TEST_TEMPORARY_DIR@/output-stimulation.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 704.000000 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x06d3ba1c) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000e75, 0x00001cb1) + Stimulation + (0x641d0717, 0x02884107) + + + (0x6f752dd0, 0x082a321e) + Output signal + + + + + (0x330306dd, 0x74a95f98) + Filename + + @CMAKE_CURRENT_SOURCE_DIR@/input-stimulation.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x2cdb2f0b, 0x12f231ea) + Don't use the file time + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Unused parameter + 32 + 0 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 256.000000 + + + (0x1fa963f5, 0x1a638cd4) + 53 + + + (0x207c9054, 0x3c841b63) + 704.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x3bf57676, 0xad3aaefa) + + + (0xad100179, 0xa3c984ab) + 85 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x07cdde9d) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + + + (0x00007ce9, 0x000034b5) + + (0x00000e75, 0x00001cb1) + 0 + + + (0x00000be0, 0x000028d8) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 289 + + + (0x358ae8b5, 0x0f8bacd1) + 704 + + + (0x3f0a3b27, 0x570913d2) + 331 + + + (0x6267b5c5, 0x676e3e42) + 704 + + + + + + + + + (0x000057d8, 0x00005097) + Default window + 1 + (0xffffffff, 0xffffffff) + (0xffffffff, 0xffffffff) + 1 + + + (0x4c90d4ad, 0x7a2554ec) + 1 + + + (0x7b814cca, 0x271df6dd) + 1 + + + + + (0x000019df, 0x000079ec) + Default tab + 2 + (0x000057d8, 0x00005097) + 0 + (0xffffffff, 0xffffffff) + 1 + + + (0x000062c0, 0x00001744) + Empty + 0 + (0x000019df, 0x000079ec) + 0 + (0xffffffff, 0xffffffff) + 0 + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + 0.1 + + + (0x9f5c4075, 0x4a0d3666) + Tiny CSV IO test + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/streamed-matrix.xml.in b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/streamed-matrix.xml.in new file mode 100755 index 0000000..2a3a482 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-csv/streamed-matrix.xml.in @@ -0,0 +1,260 @@ + + + + (0x00000be0, 0x000028d7) + CSV File Writer + (0x2c9312f1, 0x2d6613e5) + + + (0x544a003e, 0x6dcba5f6) + Input signal + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + @OVT_TEST_TEMPORARY_DIR@/output-streamed-matrix.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 112.000000 + + + (0x4e7b798a, 0x183beafb) + (0x229d1207, 0xebac8ab0) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 107 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x01476666) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00000e75, 0x00001cb0) + Matrix + (0x641d0717, 0x02884107) + + + (0x544a003e, 0x6dcba5f6) + Output signal + + + + + (0x330306dd, 0x74a95f98) + Filename + + @CMAKE_CURRENT_SOURCE_DIR@/input-streamed-matrix.csv + false + + + (0x79a9edeb, 0x245d83fc) + Column separator + ; + ; + false + + + (0x2cdb2f0b, 0x12f231ea) + Don't use the file time + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Samples per buffer + 32 + 16 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x1fa963f5, 0x1a638cd4) + 53 + + + (0x207c9054, 0x3c841b63) + 112.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x3bf57676, 0xad3aaefa) + + + (0xad100179, 0xa3c984ab) + 85 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x03c8bf7e) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + + + + + (0x00007ce9, 0x000034b4) + + (0x00000e75, 0x00001cb0) + 0 + + + (0x00000be0, 0x000028d7) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 305 + + + (0x358ae8b5, 0x0f8bacd1) + 112 + + + (0x3f0a3b27, 0x570913d2) + 331 + + + (0x6267b5c5, 0x676e3e42) + 112 + + + + + + + + + (0x000057d8, 0x00005097) + Default window + 1 + (0xffffffff, 0xffffffff) + (0xffffffff, 0xffffffff) + 1 + + + (0x4c90d4ad, 0x7a2554ec) + 1 + + + (0x7b814cca, 0x271df6dd) + 1 + + + + + (0x000019df, 0x000079ec) + Default tab + 2 + (0x000057d8, 0x00005097) + 0 + (0xffffffff, 0xffffffff) + 1 + + + (0x000062c0, 0x00001744) + Empty + 0 + (0x000019df, 0x000079ec) + 0 + (0xffffffff, 0xffffffff) + 0 + + + + + (0x790d75b8, 0x3bb90c33) + Jussi T. Lindgren + + + (0x8c1fc55b, 0x7b433dc2) + 0.1 + + + (0x9f5c4075, 0x4a0d3666) + Tiny CSV IO test + + + (0xf36a1567, 0xd13c53da) + + + + (0xf6b2e3fa, 0x7bd43926) + + + + (0xf8034a49, 0x8b3f37cc) + + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-openvibe/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-openvibe/CMakeLists.txt new file mode 100755 index 0000000..0cebb81 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-openvibe/CMakeLists.txt @@ -0,0 +1,76 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +PROJECT(openvibe-file-io-openvibe-test) + +# ------------ +# Test naming +# ------------ + +# As IO test was part of original OpenViBE, prefix is set to vo (validation/open) +SET(TEST_PREFIX vo) +SET(TEST_MODULE FileIO-OV) + +# ------------------------- +# List of scenario to test +# ------------------------- + + +# Test scenario for openvibe file format: reading and writing feature +SET(TEST_SCENARIOS + read-write +) + +# ---------------------- +# Configure test target +# ---------------------- + +# This is just a way to have the test scripts available in the IDE +FILE(GLOB_RECURSE script_files ${CMAKE_CURRENT_SOURCE_DIR}/*.mxs ${CMAKE_CURRENT_SOURCE_DIR}/*.xml.in) +ADD_CUSTOM_TARGET(${PROJECT_NAME} SOURCES ${script_files}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${VALIDATION_FOLDER}) + +# --------------------------- +# Add test to test to be run +# --------------------------- +FOREACH(SCENARIO ${TEST_SCENARIOS}) + + # Modify test name to comply to naming rules + SET(TEST_NAME ${TEST_PREFIX}${TEST_MODULE}-${SCENARIO}) + + #Create scenario file with repository according to the test environement + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/${SCENARIO}.xml.in" "${CMAKE_CURRENT_BINARY_DIR}/${SCENARIO}.xml" @ONLY) + SET(SCENARIO_TO_TEST "${CMAKE_CURRENT_BINARY_DIR}/${SCENARIO}.xml") + + ADD_TEST(NAME ${TEST_NAME} + COMMAND ${CMAKE_COMMAND} + -DUNQUOTE=1 + -DCMD1="${CMAKE_COMMAND} -E remove -f ${OVT_OPENVIBE_PLAYER_LOG_FILE}" + # Launch the scenario with all boxes to test + -DCMD2="${OVT_OPENVIBE_PLAYER} --mode=x --play-mode=ff --max-time=2000 --config-file=${OVT_OPENVIBE_DATA}/openvibe.conf --scenario-file=${SCENARIO_TO_TEST}" + # Compare result with reference file + -DCMD3="${CMAKE_COMMAND} -E compare_files ${OVT_TEST_DATA_DIR}/bci-motor-imagery.ov ${OVT_TEST_TEMPORARY_DIR}/output_ov.ov" + -P ${OVT_CMAKE_DIR}/OvtRunMultipleCommand.cmake + ) + + SET_TESTS_PROPERTIES(${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OVT_OPENVIBE_PLAYER_LOG_FILE}) + +ENDFOREACH() \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-openvibe/read-write.xml.in b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-openvibe/read-write.xml.in new file mode 100755 index 0000000..a003038 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-file-io-openvibe/read-write.xml.in @@ -0,0 +1,276 @@ + + 2 + OpenViBE Designer + 2.2.0 + + + + + + (0x0000324c, 0x0000225d) + Generic stream reader + (0x6468099f, 0x0370095a) + + + (0x403488e7, 0x565d70b6) + Output stream 1 + + + (0x5ba36127, 0x195feae1) + Output stream 2 + + + (0x6f752dd0, 0x082a321e) + Output stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/bci-motor-imagery.ov + false + + + + + (0x17ee7c08, 0x94c14893) + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 384.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xf37b8e7a, 0x1bc33e4e) + + + (0xad100179, 0xa3c984ab) + 153 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x008e3651) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00006172, 0x00004577) + Generic stream writer + (0x09c92218, 0x7c1216f8) + + + (0x403488e7, 0x565d70b6) + Input stream 1 + + + (0x5ba36127, 0x195feae1) + Input stream 2 + + + (0x6f752dd0, 0x082a321e) + Input stream 3 + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].ov + @OVT_TEST_TEMPORARY_DIR@/output_ov.ov + false + + + (0x2cdb2f0b, 0x12f231ea) + Use compression + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272.000000 + + + (0x1fa963f5, 0x1a638cd4) + 33 + + + (0x207c9054, 0x3c841b63) + 368.000000 + + + (0x4e7b798a, 0x183beafb) + (0x89a08108, 0xc8d1fac1) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 149 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002efb4d) + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + + + (0x000023a7, 0x000067cc) + + (0x0000324c, 0x0000225d) + 0 + + + (0x00006172, 0x00004577) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 183 + + + (0x358ae8b5, 0x0f8bacd1) + 369 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 353 + + + + + (0x00003da7, 0x00003850) + + (0x0000324c, 0x0000225d) + 1 + + + (0x00006172, 0x00004577) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 183 + + + (0x358ae8b5, 0x0f8bacd1) + 384 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 368 + + + + + (0x000064a1, 0x00002aca) + + (0x0000324c, 0x0000225d) + 2 + + + (0x00006172, 0x00004577) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 183 + + + (0x358ae8b5, 0x0f8bacd1) + 399 + + + (0x3f0a3b27, 0x570913d2) + 251 + + + (0x6267b5c5, 0x676e3e42) + 383 + + + + + + + + (0x00005ddf, 0x0000428b) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-regularized-csp/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-regularized-csp/CMakeLists.txt new file mode 100755 index 0000000..32ec8b8 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-regularized-csp/CMakeLists.txt @@ -0,0 +1,122 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +PROJECT(openvibe-regularized-csp) + +# ------------ +# Test naming +# ------------ + +# As IO test was part of original OpenViBE, prefix is set to vo (validation/open) +SET(TEST_PREFIX vo) +SET(TEST_MODULE Regularized-CSP) + +# ------------------------- +# List of scenario to test +# ------------------------- + + +# Test scenario for regularized-csp +SET(TEST_SCENARIOS +None +Tikhonov +Shrink +Both +) + +# Templates xml.in files +SET (TRAIN_REGULARIZED_CSP regularized-csp-train) +SET (REGULARIZED_CSP regularized-csp) + +# ---------------------- +# Configure test target +# ---------------------- + +# This is just a way to have the test scripts available in the IDE +FILE(GLOB_RECURSE script_files ${CMAKE_CURRENT_SOURCE_DIR}/*.mxs ${CMAKE_CURRENT_SOURCE_DIR}/*.xml ${CMAKE_CURRENT_SOURCE_DIR}/*.xml.in) +ADD_CUSTOM_TARGET(${PROJECT_NAME} SOURCES ${script_files}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${VALIDATION_FOLDER}) + +# --------------------------- +# Add test to test to be run +# --------------------------- +FOREACH(SCENARIO ${TEST_SCENARIOS}) + + # Create test name complying to naming rules + SET(TEST_NAME ${TEST_PREFIX}${TEST_MODULE}-${SCENARIO}) + + # The regularized CSP have 4 tests + # Shrinks and Thikhonovs parameters were involved in the train scenario + # A threshold value is set for each test regarding the Shrinks and Thikhonovs parameters + # for each test a training scenario and a test scenario will be created + + IF (SCENARIO STREQUAL "Tikhonov") + SET(SHRINKS 0.0) + SET(TIKHONOVS 0.9) + SET(THRESHOLDS 70) + + ELSEIF (SCENARIO STREQUAL "Shrink") + SET(SHRINKS 0.9) + SET(TIKHONOVS 0.0) + SET(THRESHOLDS 70) + + ELSEIF (SCENARIO STREQUAL "Both") + SET(SHRINKS 0.5) + SET(TIKHONOVS 0.5) + SET(THRESHOLDS 70) + + ELSEIF (SCENARIO STREQUAL "None") + SET(SHRINKS 0.0) + SET(TIKHONOVS 0.0) + SET(THRESHOLDS 50) + + ENDIF() + + # create scenario training scenario file + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/${TRAIN_REGULARIZED_CSP}.xml.in" "${CMAKE_CURRENT_BINARY_DIR}/${TRAIN_REGULARIZED_CSP}_${SCENARIO}.xml" @ONLY) + + # create scenario test file + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/${REGULARIZED_CSP}.xml.in" "${CMAKE_CURRENT_BINARY_DIR}/${REGULARIZED_CSP}_${SCENARIO}.xml" @ONLY) + + # assign scenario previously cretaed to variable + SET (SCENARIO_TO_TRAIN "${CMAKE_CURRENT_BINARY_DIR}/${TRAIN_REGULARIZED_CSP}_${SCENARIO}.xml") + SET (SCENARIO_TO_TEST "${CMAKE_CURRENT_BINARY_DIR}/${REGULARIZED_CSP}_${SCENARIO}.xml") + + # The test will compare files. It should be the same + ADD_TEST(NAME ${TEST_NAME} + COMMAND ${CMAKE_COMMAND} + -DUNQUOTE=1 + -DCMD1="${CMAKE_COMMAND} -E remove -f ${OVT_OPENVIBE_PLAYER_LOG_FILE}" + + # Launch the training scenario + -DCMD2="${OVT_OPENVIBE_PLAYER} --mode=x --max-time=2000 --play-mode=ff --config-file=${OVT_OPENVIBE_DATA}/openvibe.conf --scenario-file=${SCENARIO_TO_TRAIN}" + + # Launch the scenario to test + -DCMD3="${OVT_OPENVIBE_PLAYER} --mode=x --max-time=15000 --play-mode=ff --config-file=${OVT_OPENVIBE_DATA}/openvibe.conf --scenario-file=${SCENARIO_TO_TEST}" + + #Launch python checking module + -DCMD4="${Python3_EXECUTABLE} ${OVT_VALIDATION_TOOLKIT_PATH}/accuracy.py ${OVT_OPENVIBE_PLAYER_LOG_FILE} Cross-validation ${THRESHOLDS}" + + -P ${OVT_CMAKE_DIR}/OvtRunMultipleCommand.cmake + ) + SET_TESTS_PROPERTIES(${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OVT_OPENVIBE_PLAYER_LOG_FILE}) + +ENDFOREACH() \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-regularized-csp/regularized-csp-train.xml.in b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-regularized-csp/regularized-csp-train.xml.in new file mode 100755 index 0000000..2527b56 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-regularized-csp/regularized-csp-train.xml.in @@ -0,0 +1,1009 @@ + + 1 + OpenVIBE + 0.0.0 + + + + + + (0x000001bf, 0x0000774e) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(2*m_PI*x*10) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 96.000000 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 128.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 74 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x002b83c2) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001d79, 0x0000094b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 496.000000 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 432.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 103 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000c92bc) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002514, 0x00001614) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/train-time1.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 144 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xad100179, 0xa3c984ab) + 97 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00003917, 0x0000574d) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/train-noise3.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 560 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xad100179, 0xa3c984ab) + 97 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00004f85, 0x000075c2) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + A+2*(B-0.5) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 256 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 74 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x001b0254) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005cd1, 0x00002308) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_GDF_End_Of_Session + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 208.000000 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 80.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xad100179, 0xa3c984ab) + 100 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0026e8e1) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00005dde, 0x000059bc) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 288.000000 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 400.000000 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xad100179, 0xa3c984ab) + 83 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004d185b) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00006be0, 0x000074b5) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/train-noise2.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xad100179, 0xa3c984ab) + 97 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x0000752f, 0x00004ce3) + Regularized CSP Trainer + (0x2ec14cc0, 0x428c48bd) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x5ba36127, 0x195feae1) + Signal condition 1 + + + (0x5ba36127, 0x195feae1) + Signal condition 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train Trigger + OVTK_GDF_End_Of_Session + OVTK_GDF_End_Of_Session + false + + + (0x330306dd, 0x74a95f98) + Spatial filter configuration + + @OVT_TEST_TEMPORARY_DIR@/matrix-@SCENARIO@.txt + false + + + (0x007deef9, 0x2f3e95c6) + Filters per condition + 2 + 2 + false + + + (0x2cdb2f0b, 0x12f231ea) + Save filters as box config + false + false + false + + + (0x59e83f33, 0x592f1dd0) + Covariance update + Chunk average + Chunk average + false + + + (0x2cdb2f0b, 0x12f231ea) + Trace normalization + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient + 0.0 + @SHRINKS@ + false + + + (0x512a166f, 0x5c3ef83f) + Tikhonov coefficient + 0.0 + @TIKHONOVS@ + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 432.000000 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 432.000000 + + + (0x4e7b798a, 0x183beafb) + (0x97c37a70, 0xbc9fecff) + + + (0xad100179, 0xa3c984ab) + 143 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x012d01c1) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 8 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + + + (0x00007b93, 0x000041da) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/train-noise1.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 16 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 272 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xad100179, 0xa3c984ab) + 97 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + + + (0x0000029d, 0x0000789c) + + (0x00003917, 0x0000574d) + 0 + + + (0x0000752f, 0x00004ce3) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 41 + + + (0x358ae8b5, 0x0f8bacd1) + 552 + + + (0x3f0a3b27, 0x570913d2) + 415 + + + (0x6267b5c5, 0x676e3e42) + 447 + + + + + (0x00000bda, 0x000031d8) + + (0x00007b93, 0x000041da) + 0 + + + (0x00004f85, 0x000075c2) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 41 + + + (0x358ae8b5, 0x0f8bacd1) + 264 + + + (0x3f0a3b27, 0x570913d2) + 137 + + + (0x6267b5c5, 0x676e3e42) + 263 + + + + + (0x00000e6a, 0x00006e34) + + (0x00006be0, 0x000074b5) + 0 + + + (0x00005dde, 0x000059bc) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 41 + + + (0x358ae8b5, 0x0f8bacd1) + 424 + + + (0x3f0a3b27, 0x570913d2) + 265 + + + (0x6267b5c5, 0x676e3e42) + 407 + + + + + (0x000031f9, 0x000000fb) + + (0x00004f85, 0x000075c2) + 0 + + + (0x00005dde, 0x000059bc) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 185 + + + (0x358ae8b5, 0x0f8bacd1) + 256 + + + (0x3f0a3b27, 0x570913d2) + 265 + + + (0x6267b5c5, 0x676e3e42) + 392 + + + + + (0x00005e99, 0x0000154b) + + (0x0000752f, 0x00004ce3) + 0 + + + (0x00001d79, 0x0000094b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 451 + + + (0x358ae8b5, 0x0f8bacd1) + 432 + + + (0x3f0a3b27, 0x570913d2) + 479 + + + (0x6267b5c5, 0x676e3e42) + 432 + + + + + (0x00005f59, 0x00006c8d) + + (0x00005dde, 0x000059bc) + 0 + + + (0x0000752f, 0x00004ce3) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 313 + + + (0x358ae8b5, 0x0f8bacd1) + 400 + + + (0x3f0a3b27, 0x570913d2) + 415 + + + (0x6267b5c5, 0x676e3e42) + 432 + + + + + (0x0000769c, 0x00006c88) + + (0x000001bf, 0x0000774e) + 0 + + + (0x00004f85, 0x000075c2) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 121 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 137 + + + (0x6267b5c5, 0x676e3e42) + 248 + + + + + (0x00007b5b, 0x000079d9) + + (0x00005cd1, 0x00002308) + 0 + + + (0x0000752f, 0x00004ce3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 227 + + + (0x358ae8b5, 0x0f8bacd1) + 80 + + + (0x3f0a3b27, 0x570913d2) + 415 + + + (0x6267b5c5, 0x676e3e42) + 417 + + + + + (0x00007be5, 0x00000765) + + (0x00002514, 0x00001614) + 0 + + + (0x000001bf, 0x0000774e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 41 + + + (0x358ae8b5, 0x0f8bacd1) + 136 + + + (0x3f0a3b27, 0x570913d2) + 73 + + + (0x6267b5c5, 0x676e3e42) + 128 + + + + + + + + (0x00004e9b, 0x000005a4) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-regularized-csp/regularized-csp.xml.in b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-regularized-csp/regularized-csp.xml.in new file mode 100755 index 0000000..b20b939 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-regularized-csp/regularized-csp.xml.in @@ -0,0 +1,1848 @@ + + 1 + OpenVIBE + 0.0.0 + + + + + + (0x000001bf, 0x0000774e) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + sin(2*m_PI*x*10) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 108.000000 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 340.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 74 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0027036a) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00001d79, 0x0000094b) + Player Controller + (0x5f426dce, 0x08456e13) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + + + (0x2c132d6e, 0x44ab0d97) + Stimulation name + OVTK_StimulationId_Label_00 + OVTK_StimulationId_TrainCompleted + false + + + (0xcc14d8d6, 0xf27ecb73) + Action to perform + Pause + Stop + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 624.000000 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 560.000000 + + + (0x4e7b798a, 0x183beafb) + (0x568d148e, 0x650792b3) + + + (0xad100179, 0xa3c984ab) + 103 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0018c8c4) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00002824, 0x00000ec9) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 480.000000 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 544.000000 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 110 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000cc119) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00002a40, 0x00002c82) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/test-noise1.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xad100179, 0xa3c984ab) + 97 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00003065, 0x00006f68) + Feature aggregator + (0x00682417, 0x453635f9) + + + (0x544a003e, 0x6dcba5f6) + Input stream 1 + + + + + (0x17341935, 0x152ff448) + Feature vector stream + + + + + (0x1fa7a38f, 0x54edbe0b) + 480.000000 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 720.000000 + + + (0x4e7b798a, 0x183beafb) + (0xb5d15cc9, 0x6c8c28fb) + + + (0xad100179, 0xa3c984ab) + 110 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000b40fe) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000384e, 0x00003b0e) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + @OVT_TEST_TEMPORARY_DIR@/matrix-@SCENARIO@.txt + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288.000000 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 528.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 79 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000bdfe8) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x0000384e, 0x00003b10) + Spatial Filter + (0xdd332c6c, 0x195b4fd4) + + + (0x5ba36127, 0x195feae1) + Input Signal + + + + + (0x5ba36127, 0x195feae1) + Output Signal + + + + + (0x79a9edeb, 0x245d83fc) + Spatial Filter Coefficients + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Output Channels + 4 + 4 + false + + + (0x007deef9, 0x2f3e95c6) + Number of Input Channels + 4 + 4 + false + + + (0x330306dd, 0x74a95f98) + Filter matrix file + + @OVT_TEST_TEMPORARY_DIR@/matrix-@SCENARIO@.txt + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 288.000000 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 672.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x81db9bf9, 0xf1cf4ed7) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 79 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00147d55) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00004f85, 0x000075c3) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + (0x5ba36127, 0x195feae1) + Input - B + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + A+2*(B-0.5) + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160.000000 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 416.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 74 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0013b6a4) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x0000594d, 0x00001153) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/test-time1.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 320 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xad100179, 0xa3c984ab) + 97 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x00005cd1, 0x00002308) + Clock stimulator + (0x4f756d3f, 0x29ff0b96) + + + (0x6f752dd0, 0x082a321e) + Generated stimulations + + + + + (0x512a166f, 0x5c3ef83f) + Interstimulation interval (in sec) + 1.0 + 10 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Train + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 32.000000 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 128.000000 + + + (0x4e7b798a, 0x183beafb) + (0x27b3ee3c, 0xc50527e6) + + + (0xad100179, 0xa3c984ab) + 100 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x004e6a12) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + + + (0x00005d73, 0x000007dc) + Classifier trainer + (0xf3dae8a8, 0x3b444154) + + + (0x6f752dd0, 0x082a321e) + Stimulations + + + (0x17341935, 0x152ff448) + Features for class 1 + + + (0x17341935, 0x152ff448) + Features for class 2 + + + + + (0x6f752dd0, 0x082a321e) + Train-completed Flag + + + + + (0x2c132d6e, 0x44ab0d97) + Train trigger + OVTK_StimulationId_Train + OVTK_StimulationId_Train + false + + + (0x330306dd, 0x74a95f98) + Filename to save configuration to + ${Path_UserData}/my-classifier.xml + @OVT_TEST_TEMPORARY_DIR@/classifier_@SCENARIO@.xml + false + + + (0xbe9eba5c, 0xa8415d37) + Multiclass strategy to apply + Native + Native + false + + + (0x2c132d6e, 0x44ab0d97) + Class 1 label + OVTK_StimulationId_Label_01 + OVTK_StimulationId_Label_01 + false + + + (0x2c132d6e, 0x44ab0d97) + Class 2 label + OVTK_StimulationId_Label_02 + OVTK_StimulationId_Label_02 + false + + + (0xd765a736, 0xed708c65) + Algorithm to use + Linear Discrimimant Analysis (LDA) + Linear Discrimimant Analysis (LDA) + false + + + (0x2cdb2f0b, 0x12f231ea) + Use shrinkage + false + false + false + + + (0x512a166f, 0x5c3ef83f) + Shrinkage coefficient (-1 == auto) + -1.000000 + -1.000000 + false + + + (0x2cdb2f0b, 0x12f231ea) + Shrinkage: Force diagonal cov (DDA) + false + false + false + + + (0x007deef9, 0x2f3e95c6) + Number of partitions for k-fold cross-validation test + 10 + 5 + false + + + (0x2cdb2f0b, 0x12f231ea) + Balance classes + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 560.000000 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 560.000000 + + + (0x4e7b798a, 0x183beafb) + (0x9de21779, 0x37776c89) + + + (0xad100179, 0xa3c984ab) + 100 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x00335a81) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 5 + + + (0xcfad85b0, 0x7c6d841c) + 3 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005dde, 0x000059bc) + Signal Merger + (0x4bf9326f, 0x75603102) + + + (0x5ba36127, 0x195feae1) + Input 1 + + + (0x5ba36127, 0x195feae1) + Input 2 + + + + + (0x5ba36127, 0x195feae1) + Merged + + + + + (0x1fa7a38f, 0x54edbe0b) + 208.000000 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 512.000000 + + + (0x4e7b798a, 0x183beafb) + (0x990c5a68, 0x0d4024a3) + + + (0xad100179, 0xa3c984ab) + 83 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0013111d) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005f02, 0x0000326e) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352.000000 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 528.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 74 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000a4547) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x00005f02, 0x00003270) + Simple DSP + (0x00e26fa1, 0x1dbab1b2) + + + (0x5ba36127, 0x195feae1) + Input - A + + + + + (0x5ba36127, 0x195feae1) + Output + + + + + (0x79a9edeb, 0x245d83fc) + Equation + x + x*x + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352.000000 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 672.000000 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0x21889dc4, 0x1126497e) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 74 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000b54d8) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + (0xfba64161, 0x65304e21) + + + + + + (0x000068ee, 0x0000125c) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 416.000000 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 528.000000 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 86 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0008f384) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x000068ee, 0x0000125d) + Signal average + (0x00642c4d, 0x5df7e50a) + + + (0x5ba36127, 0x195feae1) + Input signal + + + + + (0x5ba36127, 0x195feae1) + Filtered signal + + + + + (0x1fa7a38f, 0x54edbe0b) + 416.000000 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 688.000000 + + + (0x4e7b798a, 0x183beafb) + (0xc5ff4187, 0xffc5f432) + + + (0xad100179, 0xa3c984ab) + 86 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x000b0bfd) + + + (0xc73e83ec, 0xf855c5bc) + false + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + (0x00007848, 0x0000588c) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/test-noise3.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 672 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xad100179, 0xa3c984ab) + 97 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x000078e9, 0x00007665) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + @OVT_TEST_DATA_DIR@/test-noise2.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 48 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 544 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xad100179, 0xa3c984ab) + 97 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + + + (0x000001e8, 0x00001638) + + (0x000068ee, 0x0000125c) + 0 + + + (0x00002824, 0x00000ec9) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 435 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 457 + + + (0x6267b5c5, 0x676e3e42) + 544 + + + + + (0x00000a93, 0x00007ccc) + + (0x00005f02, 0x0000326e) + 0 + + + (0x000068ee, 0x0000125c) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 377 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 399 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x00000e34, 0x00002968) + + (0x0000384e, 0x00003b0e) + 0 + + + (0x00005f02, 0x0000326e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 313 + + + (0x358ae8b5, 0x0f8bacd1) + 528 + + + (0x3f0a3b27, 0x570913d2) + 329 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x00000e34, 0x00002969) + + (0x0000384e, 0x00003b10) + 0 + + + (0x00005f02, 0x00003270) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 313 + + + (0x358ae8b5, 0x0f8bacd1) + 672 + + + (0x3f0a3b27, 0x570913d2) + 329 + + + (0x6267b5c5, 0x676e3e42) + 672 + + + + + (0x00000e6b, 0x00006fe7) + + (0x00005dde, 0x000059bc) + 0 + + + (0x0000384e, 0x00003b0e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 233 + + + (0x358ae8b5, 0x0f8bacd1) + 512 + + + (0x3f0a3b27, 0x570913d2) + 265 + + + (0x6267b5c5, 0x676e3e42) + 528 + + + + + (0x00001191, 0x00001183) + + (0x000068ee, 0x0000125d) + 0 + + + (0x00003065, 0x00006f68) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 435 + + + (0x358ae8b5, 0x0f8bacd1) + 688 + + + (0x3f0a3b27, 0x570913d2) + 457 + + + (0x6267b5c5, 0x676e3e42) + 720 + + + + + (0x00001ab8, 0x0000311b) + + (0x000078e9, 0x00007665) + 0 + + + (0x00005dde, 0x000059bc) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 73 + + + (0x358ae8b5, 0x0f8bacd1) + 536 + + + (0x3f0a3b27, 0x570913d2) + 185 + + + (0x6267b5c5, 0x676e3e42) + 519 + + + + + (0x00001ffb, 0x00004e74) + + (0x00007848, 0x0000588c) + 0 + + + (0x0000384e, 0x00003b10) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 73 + + + (0x358ae8b5, 0x0f8bacd1) + 664 + + + (0x3f0a3b27, 0x570913d2) + 265 + + + (0x6267b5c5, 0x676e3e42) + 672 + + + + + (0x00002a59, 0x00001819) + + (0x00005d73, 0x000007dc) + 0 + + + (0x00001d79, 0x0000094b) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 585 + + + (0x358ae8b5, 0x0f8bacd1) + 560 + + + (0x3f0a3b27, 0x570913d2) + 607 + + + (0x6267b5c5, 0x676e3e42) + 560 + + + + + (0x000031f9, 0x000000fb) + + (0x00004f85, 0x000075c3) + 0 + + + (0x00005dde, 0x000059bc) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 185 + + + (0x358ae8b5, 0x0f8bacd1) + 416 + + + (0x3f0a3b27, 0x570913d2) + 185 + + + (0x6267b5c5, 0x676e3e42) + 504 + + + + + (0x000044b5, 0x00002683) + + (0x00002a40, 0x00002c82) + 0 + + + (0x00004f85, 0x000075c3) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 57 + + + (0x358ae8b5, 0x0f8bacd1) + 424 + + + (0x3f0a3b27, 0x570913d2) + 137 + + + (0x6267b5c5, 0x676e3e42) + 423 + + + + + (0x00004d66, 0x00003edb) + + (0x0000594d, 0x00001153) + 0 + + + (0x000001bf, 0x0000774e) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 57 + + + (0x358ae8b5, 0x0f8bacd1) + 312 + + + (0x3f0a3b27, 0x570913d2) + 85 + + + (0x6267b5c5, 0x676e3e42) + 340 + + + + + (0x0000561f, 0x0000678d) + + (0x00005cd1, 0x00002308) + 0 + + + (0x00005d73, 0x000007dc) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 51 + + + (0x358ae8b5, 0x0f8bacd1) + 128 + + + (0x3f0a3b27, 0x570913d2) + 537 + + + (0x6267b5c5, 0x676e3e42) + 545 + + + + + (0x00005a3c, 0x000070e8) + + (0x00002824, 0x00000ec9) + 0 + + + (0x00005d73, 0x000007dc) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 505 + + + (0x358ae8b5, 0x0f8bacd1) + 544 + + + (0x3f0a3b27, 0x570913d2) + 537 + + + (0x6267b5c5, 0x676e3e42) + 560 + + + + + (0x00006a54, 0x00006a90) + + (0x00003065, 0x00006f68) + 0 + + + (0x00005d73, 0x000007dc) + 2 + + + + (0x1b32c44c, 0x1905e0e9) + 505 + + + (0x358ae8b5, 0x0f8bacd1) + 720 + + + (0x3f0a3b27, 0x570913d2) + 537 + + + (0x6267b5c5, 0x676e3e42) + 575 + + + + + (0x00006bee, 0x0000552d) + + (0x000001bf, 0x0000774e) + 0 + + + (0x00004f85, 0x000075c3) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 133 + + + (0x358ae8b5, 0x0f8bacd1) + 340 + + + (0x3f0a3b27, 0x570913d2) + 137 + + + (0x6267b5c5, 0x676e3e42) + 408 + + + + + (0x00007488, 0x00002969) + + (0x00005f02, 0x00003270) + 0 + + + (0x000068ee, 0x0000125d) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 377 + + + (0x358ae8b5, 0x0f8bacd1) + 672 + + + (0x3f0a3b27, 0x570913d2) + 399 + + + (0x6267b5c5, 0x676e3e42) + 688 + + + + + + + + (0x00006de0, 0x0000639f) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-stimulation-timeout/CMakeLists.txt b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-stimulation-timeout/CMakeLists.txt new file mode 100755 index 0000000..c2c8430 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-stimulation-timeout/CMakeLists.txt @@ -0,0 +1,76 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +PROJECT(openvibe-stimulation-timeout-test) + +# ------------ +# Test naming +# ------------ + +# As IO test was part of original OpenViBE, prefix is set to vo (validation/open) +SET(TEST_PREFIX vo) +SET(TEST_MODULE Stimulation-Timeout) + +# ------------------------- +# List of scenario to test +# ------------------------- + + +# Test scenario for openvibe file format: reading and writing feature +SET(TEST_SCENARIOS + timeout +) + +# ---------------------- +# Configure test target +# ---------------------- + +# This is just a way to have the test scripts available in the IDE +FILE(GLOB_RECURSE script_files ${CMAKE_CURRENT_SOURCE_DIR}/*.mxs ${CMAKE_CURRENT_SOURCE_DIR}/*.xml ${CMAKE_CURRENT_SOURCE_DIR}/*.xml.in) +ADD_CUSTOM_TARGET(${PROJECT_NAME} SOURCES ${script_files}) +SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${VALIDATION_FOLDER}) + +# --------------------------- +# Add test to test to be run +# --------------------------- +FOREACH(SCENARIO ${TEST_SCENARIOS}) + + # Modify test name to comply to naming rules + SET(TEST_NAME ${TEST_PREFIX}${TEST_MODULE}-${SCENARIO}) + + #Create scenario file with repository according to the test environement + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/${SCENARIO}.xml.in" "${CMAKE_CURRENT_BINARY_DIR}/${SCENARIO}.xml" @ONLY) + SET(SCENARIO_TO_TEST "${CMAKE_CURRENT_BINARY_DIR}/${SCENARIO}.xml") + + ADD_TEST(NAME ${TEST_NAME} + COMMAND ${CMAKE_COMMAND} + -DUNQUOTE=1 + -DCMD1="${CMAKE_COMMAND} -E remove -f ${OVT_OPENVIBE_PLAYER_LOG_FILE}" + # Launch the scenario with all boxes to test + -DCMD2="${OVT_OPENVIBE_PLAYER} --mode=x --play-mode=ff --max-time=2000 --config-file=${OVT_OPENVIBE_DATA}/openvibe.conf --scenario-file=${SCENARIO_TO_TEST}" + # Compare result with reference file + -DCMD3="${Python3_EXECUTABLE} ${OVT_VALIDATION_TOOLKIT_PATH}/csv-analyser.py ${CMAKE_CURRENT_SOURCE_DIR}/reference.csv ${OVT_TEST_TEMPORARY_DIR}/test-timeout.csv" + -P ${OVT_CMAKE_DIR}/OvtRunMultipleCommand.cmake + ) + + SET_TESTS_PROPERTIES(${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OVT_OPENVIBE_PLAYER_LOG_FILE}) + +ENDFOREACH() \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-stimulation-timeout/reference.csv b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-stimulation-timeout/reference.csv new file mode 100755 index 0000000..d332cfe --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-stimulation-timeout/reference.csv @@ -0,0 +1,5313 @@ +Time:512Hz,Epoch,sinusOsc 1,sinusOsc 2,sinusOsc 3,sinusOsc 4,Event Id,Event Date,Event Duration +0.0000000000,0,0.0000000000,0.0000000000,0.0000000000,0.0000000000,,, +0.0019531250,0,0.1648452752,0.3273640801,0.4852704342,0.6363586276,,, +0.0039062500,0,0.3273640801,0.6363586276,0.9098872246,1.1333109212,,, +0.0058593750,0,0.4852704342,0.9098872246,1.2225847212,1.3894113257,,, +0.0078125000,0,0.6363586276,1.1333109212,1.3894113257,1.3687341120,,, +0.0097656250,0,0.7785415972,1.2954612569,1.3989593819,1.1104797424,,, +0.0117187500,0,0.9098872246,1.3894113257,1.2640846055,0.7179978555,,, +0.0136718750,0,1.0286519228,1.4129511326,1.0198475262,0.3302374016,,, +0.0156250000,0,1.1333109212,1.3687341120,0.7179978555,0.0834505686,,, +0.0175781250,0,1.2225847212,1.2640846055,0.4188611380,0.0736481894,,, +0.0195312500,0,1.2954612569,1.1104797424,0.1818916474,0.3300982460,,, +0.0214843750,0,1.3512133748,0.9227418688,0.0563632157,0.8071323783,,, +0.0234375000,0,1.3894113257,0.7179978555,0.0736481894,1.3965074831,,, +0.0253906250,0,1.4099300505,0.5144778711,0.2422873335,1.9569357977,,, +0.0273437500,0,1.4129511326,0.3302374016,0.5466187881,2.3526913275,,, +0.0292968750,0,1.3989593819,0.1818916474,0.9491798220,2.4907127401,,, +0.0312500000,0,1.3687341120,0.0834505686,1.3965074831,2.3460347303,,, +0.0332031250,0,1.3233352617,0.0453358269,1.8274348289,1.9685784838,,, +0.0351562500,0,1.2640846055,0.0736481894,2.1825907043,1.4694405683,,, +0.0371093750,0,1.1925423807,0.1697364940,2.4136235565,0.9904382474,,, +0.0390625000,0,1.1104797424,0.3300982460,2.4907127401,0.6652579106,,, +0.0410156250,0,1.0198475262,0.5466187881,2.4071974770,0.5828544425,,, +0.0429687500,0,0.9227418688,0.8071323783,2.1806025581,0.7631322311,,, +0.0449218750,0,0.8213672859,1.0962660593,1.8499010769,1.1515722864,,, +0.0468750000,0,0.7179978555,1.3965074831,1.4694405683,1.6342771847,,, +0.0488281250,0,0.6149371862,1.6894222381,1.1004785968,2.0693094508,,, +0.0507812500,0,0.5144778711,1.9569357977,0.8016461565,2.3257332731,,, +0.0527343750,0,0.4188611380,2.1825907043,0.6198242252,2.3196580229,,, +0.0546875000,0,0.3302374016,2.3526913275,0.5828544425,2.0374036140,,, +0.0566406250,0,0.2506284101,2.4572563751,0.6952191857,1.5394371117,,, +0.0585937500,0,0.1818916474,2.4907127401,0.9373637994,0.9439999007,,, +0.0605468750,0,0.1256876153,2.4522823045,1.2687664296,0.3949108210,,, +0.0625000000,1,0.0834505686,2.3460347303,1.6342771847,0.0223674799,,, +0.0644531250,1,0.0563632157,2.1806025581,1.9727391135,-0.0925131326,,, +0.0664062500,1,0.0453358269,1.9685784838,2.2265480668,0.0603015178,,, +0.0683593750,1,0.0509901179,1.7256368435,2.3506622562,0.4172396630,,, +0.0703125000,1,0.0736481894,1.4694405683,2.3196580229,0.8587778323,,, +0.0722656250,1,0.1133267170,1.2184098309,2.1317326245,1.2424256986,,, +0.0742187500,1,0.1697364940,0.9904382474,1.8090303545,1.4420008852,,, +0.0761718750,1,0.2422873335,0.8016461565,1.3942409578,1.3824276050,,, +0.0781250000,1,0.3300982460,0.6652579106,0.9439999007,1.0605198516,,, +0.0800781250,1,0.4320127126,0.5906814649,0.5201181768,0.5460511577,,, +0.0820312500,1,0.5466187881,0.5828544425,0.1800073794,-0.0371841020,,, +0.0839843750,1,0.6722736806,0.6419022723,-0.0322088923,-0.5451290503,,, +0.0859375000,1,0.8071323783,0.7631322311,-0.0925131326,-0.8527917255,,, +0.0878906250,1,0.9491798220,0.9373637994,-0.0006798677,-0.8883645456,,, +0.0898437500,1,1.0962660593,1.1515722864,0.2197443820,-0.6527859701,,, +0.0917968750,1,1.2461437673,1.3898008324,0.5251637004,-0.2193841945,,, +0.0937500000,1,1.3965074831,1.6342771847,0.8587778323,0.2862985568,,, +0.0957031250,1,1.5450338597,1.8666573587,1.1594832542,0.7209708579,,, +0.0976562500,1,1.6894222381,2.0693094508,1.3714435850,0.9628997326,,, +0.0996093750,1,1.8274348289,2.2265480668,1.4528384154,0.9452877596,,, +0.1015625000,1,1.9569357977,2.3257332731,1.3824276050,0.6745718556,,, +0.1035156250,1,2.0759285700,2.3581574258,1.1629083582,0.2286286825,,, +0.1054687500,1,2.1825907043,2.3196580229,0.8205419397,-0.2646211776,,, +0.1074218750,1,2.2753057205,2.2109138297,0.4011079248,-0.6623458227,,, +0.1093750000,1,2.3526913275,2.0374036140,-0.0371841020,-0.8460419110,,, +0.1113281250,1,2.4136235565,1.8090303545,-0.4327215806,-0.7541264530,,, +0.1132812500,1,2.4572563751,1.5394371117,-0.7300489404,-0.3989470030,,, +0.1152343750,1,2.4830364418,1.2450622533,-0.8884716710,0.1364529876,,, +0.1171875000,1,2.4907127401,0.9439999007,-0.8883645456,0.7209285523,,, +0.1191406250,1,2.4803409248,0.6547450446,-0.7342016140,1.2109964516,,, +0.1210937500,1,2.4522823045,0.3949108210,-0.4538361681,1.4899673467,,, +0.1230468750,1,2.4071974770,0.1800073794,-0.0941429486,1.4997237708,,, +0.1250000000,2,2.3460347303,0.0223674799,0.2862985568,1.2564364343,,, +0.1269531250,2,2.2700134121,-0.0697062762,0.6263400274,0.8459135047,,, +0.1289062500,2,2.1806025581,-0.0925131326,0.8717964088,0.3998595580,,, +0.1308593750,2,2.0794951543,-0.0472049343,0.9838894830,0.0595530326,,, +0.1328125000,2,1.9685784838,0.0603015178,0.9452877596,-0.0631007468,,, +0.1347656250,2,1.8499010769,0.2197443820,0.7628019458,0.0835353785,,, +0.1367187500,2,1.7256368435,0.4172396630,0.4663161840,0.4764568219,,, +0.1386718750,2,1.5980470159,0.6362566450,0.1041215666,1.0241066230,,, +0.1406250000,2,1.4694405683,0.8587778323,-0.2646211776,1.5912609145,,, +0.1425781250,2,1.3421338058,1.0665624964,-0.5791157637,2.0358921126,,, +0.1445312500,2,1.2184098309,1.2424256986,-0.7864228379,2.2479086352,,, +0.1464843750,2,1.1004785968,1.3714435850,-0.8497322400,2.1791555437,,, +0.1484375000,2,0.9904382474,1.4420008852,-0.7541264530,1.8564555014,,, +0.1503906250,2,0.8902384204,1.4466075559,-0.5089373882,1.3741174399,,, +0.1523437500,2,0.8016461565,1.3824276050,-0.1463292489,0.8679674582,,, +0.1542968750,2,0.7262150113,1.2514832059,0.2836719961,0.4780205127,,, +0.1562500000,2,0.6652579106,1.0605198516,0.7209285523,0.3100244990,,, +0.1582031250,2,0.6198242252,0.8205419397,1.1045132822,0.4064171814,,, +0.1601562500,2,0.5906814649,0.5460511577,1.3821529403,0.7346564520,,, +0.1621093750,2,0.5783019143,0.2540407661,1.5183215760,1.1961226932,,, +0.1640625000,2,0.5828544425,-0.0371841020,1.4997237708,1.6531536145,,, +0.1660156250,2,0.6042016316,-0.3092778736,1.3373139346,1.9668021611,,, +0.1679687500,2,0.6419022723,-0.5451290503,1.0645374209,2.0349690105,,, +0.1699218750,2,0.6952191857,-0.7300489404,0.7320676951,1.8204583049,,, +0.1718750000,2,0.7631322311,-0.8527917255,0.3998595580,1.3612667999,,, +0.1738281250,2,0.8443562740,-0.9063347375,0.1277564646,0.7602857029,,, +0.1757812500,2,0.9373637994,-0.8883645456,-0.0338848120,0.1572366447,,, +0.1777343750,2,1.0404117741,-0.8014349639,-0.0520916208,-0.3094678625,,, +0.1796875000,2,1.1515722864,-0.6527859701,0.0835353785,-0.5404879020,,, +0.1816406250,2,1.2687664296,-0.4538361681,0.3591498107,-0.5025952150,,, +0.1835937500,2,1.3898008324,-0.2193841945,0.7387647315,-0.2375788840,,, +0.1855468750,2,1.5124061994,0.0334252384,1.1698077144,0.1494213822,,, +0.1875000000,3,1.6342771847,0.2862985568,1.5912609145,0.5189549878,,, +0.1894531250,3,1.7531129016,0.5210703076,1.9431185114,0.7357123196,,, +0.1914062500,3,1.8666573587,0.7209708579,2.1756887376,0.7058481899,,, +0.1933593750,3,1.9727391135,0.8717964088,2.2572918891,0.4029455027,,, +0.1953125000,3,2.0693094508,0.9628997326,2.1791555437,-0.1244988728,,, +0.1972656250,3,2.1544784149,0.9879325475,1.9567447409,-0.7661198514,,, +0.1992187500,3,2.2265480668,0.9452877596,1.6273201425,-1.3796882339,,, +0.2011718750,3,2.2840423833,0.8382107369,1.2441046838,-1.8298520966,,, +0.2031250000,3,2.3257332731,0.6745718556,0.8679674582,-2.0249997390,,, +0.2050781250,3,2.3506622562,0.4663161840,0.5579202604,-1.9421432231,,, +0.2070312500,3,2.3581574258,0.2286286825,0.3619071332,-1.6330046614,,, +0.2089843750,3,2.3478453955,-0.0211268631,0.3093216037,-1.2096390757,,, +0.2109375000,3,2.3196580229,-0.2646211776,0.4064171814,-0.8135359478,,, +0.2128906250,3,2.2738337922,-0.4838404859,0.6353260255,-0.5766694511,,, +0.2148437500,3,2.2109138297,-0.6623458227,0.9568386819,-0.5851738322,,, +0.2167968750,3,2.1317326245,-0.7864228379,1.3165119586,-0.8556007782,,, +0.2187500000,3,2.0374036140,-0.8460419110,1.6531536145,-1.3302670931,,, +0.2207031250,3,1.9292998892,-0.8355616133,1.9083623131,-1.8929687428,,, +0.2226562500,3,1.8090303545,-0.7541264530,2.0356369104,-2.4007553301,,, +0.2246093750,3,1.6784117627,-0.6057311583,2.0076362012,-2.7230571803,,, +0.2265625000,3,1.5394371117,-0.3989470030,1.8204583049,-2.7774418870,,, +0.2285156250,3,1.3942409578,-0.1463292489,1.4942730593,-2.5522007238,,, +0.2304687500,3,1.2450622533,0.1364529876,1.0702088070,-2.1095746572,,, +0.2324218750,3,1.0942053566,0.4317037791,0.6039783403,-1.5687355955,,, +0.2343750000,3,0.9439999007,0.7209285523,0.1572366447,-1.0731867792,,, +0.2363281250,3,0.7967602195,0.9861177446,-0.2119836546,-0.7515162671,,, +0.2382812500,3,0.6547450446,1.2109964516,-0.4582695971,-0.6822589892,,, +0.2402343750,3,0.5201181768,1.3821529403,-0.5558567725,-0.8724966169,,, +0.2421875000,3,0.3949108210,1.4899673467,-0.5025952150,-1.2560591950,,, +0.2441406250,3,0.2809862452,1.5292758136,-0.3202348315,-1.7118200601,,, +0.2460937500,3,0.1800073794,1.4997237708,-0.0509861503,-2.0970684467,,, +0.2480468750,3,0.0934079254,1.4057837393,0.2491076739,-2.2868116966,,, +0.2500000000,4,0.0223674799,1.2564364343,0.5189549878,-2.2082337379,,, +0.2519531250,4,-0.0322088923,1.0645374209,0.7019874523,-1.8608639094,,, +0.2539062500,4,-0.0697062762,0.8459135047,0.7550284002,-1.3169264768,,, +0.2558593750,4,-0.0898104451,0.6182518862,0.6550761577,-0.7017729956,,, +0.2578125000,4,-0.0925131326,0.3998595580,0.4029455027,-0.1597583084,,, +0.2597656250,4,-0.0781119480,0.2083794740,0.0231997895,0.1850896046,,, +0.2617187500,4,-0.0472049343,0.0595530326,-0.4396159819,0.2628288715,,, +0.2636718750,4,-0.0006798677,-0.0338848120,-0.9278547274,0.0765418351,,, +0.2656250000,4,0.0603015178,-0.0631007468,-1.3796882339,-0.2987362122,,, +0.2675781250,4,0.1343241012,-0.0237861635,-1.7386803119,-0.7368019713,,, +0.2695312500,4,0.2197443820,0.0835353785,-1.9625213604,-1.0950842003,,, +0.2714843750,4,0.3147194864,0.2535377435,-2.0295641664,-1.2539192979,,, +0.2734375000,4,0.4172396630,0.4764568219,-1.9421432231,-1.1495363031,,, +0.2753906250,4,0.5251637004,0.7387647315,-1.7261608279,-0.7917093795,,, +0.2773437500,4,0.6362566450,1.0241066230,-1.4270046753,-0.2612381721,,, +0.2792968750,4,0.7482291595,1.3144347750,-1.1024330403,0.3120548556,,, +0.2812500000,4,0.8587778323,1.5912609145,-0.8135359478,0.7847811254,,, +0.2832031250,4,0.9656257321,1.8369394441,-0.6151803842,1.0391801871,,, +0.2851562500,4,1.0665624964,2.0358921126,-0.5474279556,1.0153104690,,, +0.2871093750,4,1.1594832542,2.1756887376,-0.6292619160,0.7274147604,,, +0.2890625000,4,1.2424256986,2.2479086352,-0.8556007782,0.2599756842,,, +0.2910156250,4,1.3136046616,2.2487226981,-1.1980637952,-0.2554574247,,, +0.2929687500,4,1.3714435850,2.1791555437,-1.6093692103,-0.6763190413,,, +0.2949218750,4,1.4146023369,2.0450094657,-2.0306803324,-0.8880750805,,, +0.2968750000,4,1.4420008852,1.8564555014,-2.4007553301,-0.8355661309,,, +0.2988281250,4,1.4528384154,1.6273201425,-2.6654756841,-0.5380565372,,, +0.3007812500,4,1.4466075559,1.3741174399,-2.7862692336,-0.0838655116,,, +0.3027343750,4,1.4231034628,1.1148940050,-2.7461159084,0.3939473964,,, +0.3046875000,4,1.3824276050,0.8679674582,-2.5522007238,0.7541775274,,, +0.3066406250,4,1.3249861825,0.6506463049,-2.2348008026,0.8863201473,,, +0.3085937500,4,1.2514832059,0.4780205127,-1.8425797366,0.7410176286,,, +0.3105468750,4,1.1629083582,0.3619071332,-1.4350221558,0.3437625704,,, +0.3125000000,5,1.0605198516,0.3100244990,-1.0731867792,-0.2119004478,,, +0.3144531250,5,0.9458225784,0.3254525870,-0.8102181100,-0.7898130897,,, +0.3164062500,5,0.8205419397,0.4064171814,-0.6830945046,-1.2483115247,,, +0.3183593750,5,0.6865938091,0.5464128923,-0.7068977625,-1.4788364654,,, +0.3203125000,5,0.5460511577,0.7346564520,-0.8724966169,-1.4354651966,,, +0.3222656250,5,0.4011079248,0.9568386819,-1.1480047637,-1.1472738665,,, +0.3242187500,5,0.2540407661,1.1961226932,-1.4837861393,-0.7101440528,,, +0.3261718750,5,0.1071693504,1.4343187135,-1.8202276440,-0.2602613298,,, +0.3281250000,5,-0.0371841020,1.6531536145,-2.0970684467,0.0634287720,,, +0.3300781250,5,-0.1767353284,1.8355466094,-2.2628325485,0.1575156101,,, +0.3320312500,5,-0.3092778736,1.9668021611,-2.2828951878,-0.0173284533,,, +0.3339843750,5,-0.4327215806,2.0356369104,-2.1449264448,-0.4253728324,,, +0.3359375000,5,-0.5451290503,2.0349690105,-1.8608639094,-0.9654362809,,, +0.3378906250,5,-0.6447494299,1.9624148188,-1.4651068845,-1.4984458890,,, +0.3398437500,5,-0.7300489404,1.8204583049,-1.0092131066,-1.8853960963,,, +0.3417968750,5,-0.7997376070,1.6162813554,-0.5539237113,-2.0253058315,,, +0.3437500000,5,-0.8527917255,1.3612667999,-0.1597583084,-1.8827722525,,, +0.3457031250,5,-0.8884716710,1.0702088070,0.1223552593,-1.4975706525,,, +0.3476562500,5,-0.9063347375,0.7602857029,0.2589573004,-0.9736705310,,, +0.3496093750,5,-0.9062427827,0.4498668311,0.2392123056,-0.4506790511,,, +0.3515625000,5,-0.8883645456,0.1572366447,0.0765418351,-0.0655390377,,, +0.3535156250,5,-0.8531725951,-0.1006750062,-0.1935197836,0.0850205908,,, +0.3554687500,5,-0.8014349639,-0.3094678625,-0.5189126821,-0.0290095076,,, +0.3574218750,5,-0.7342016140,-0.4582695971,-0.8392110875,-0.3627217885,,, +0.3593750000,5,-0.6527859701,-0.5404879020,-1.0950842003,-0.8086493471,,, +0.3613281250,5,-0.5587418465,-0.5542638911,-1.2375844752,-1.2262910912,,, +0.3632812500,5,-0.4538361681,-0.5025952150,-1.2358163644,-1.4807120278,,, +0.3652343750,5,-0.3400179670,-0.3931203161,-1.0817908424,-1.4796387184,,, +0.3671875000,5,-0.2193841945,-0.2375788840,-0.7917093795,-1.1988821934,,, +0.3691406250,5,-0.0941429486,-0.0509861503,-0.4034771709,-0.6891195296,,, +0.3710937500,5,0.0334252384,0.1494213822,0.0291672348,-0.0621741496,,, +0.3730468750,5,0.1610073767,0.3453952436,0.4449917410,0.5394464697,,, +0.3750000000,6,0.2862985568,0.5189549878,0.7847811254,0.9814084992,,, +0.3769531250,6,0.4070423425,0.6536495966,1.0005369179,1.1741568928,,, +0.3789062500,6,0.5210703076,0.7357123196,1.0629339198,1.0972374518,,, +0.3808593750,6,0.6263400274,0.7550284002,0.9658720706,0.8046718379,,, +0.3828125000,6,0.7209708579,0.7058481899,0.7274147604,0.4099144509,,, +0.3847656250,6,0.8032768767,0.5871959046,0.3869674993,0.0545161477,,, +0.3867187500,6,0.8717964088,0.4029455027,-0.0008635859,-0.1309147125,,, +0.3886718750,6,0.9253176204,0.1615583760,-0.3747768388,-0.0627523168,,, +0.3906250000,6,0.9628997326,-0.1244988728,-0.6763190413,0.2724851298,,, +0.3925781250,6,0.9838894830,-0.4396159819,-0.8589817634,0.8142025350,,, +0.3945312500,6,0.9879325475,-0.7661198514,-0.8954333414,1.4441036551,,, +0.3964843750,6,0.9749797227,-1.0854992806,-0.7817601324,2.0183894046,,, +0.3984375000,6,0.9452877596,-1.3796882339,-0.5380565372,2.4069561396,,, +0.4003906250,6,0.8994148344,-1.6323181664,-0.2052720016,2.5288527400,,, +0.4023437500,6,0.8382107369,-1.8298520966,0.1611937814,2.3742805529,,, +0.4042968750,6,0.7628019458,-1.9625213604,0.5001497385,2.0071083324,,, +0.4062500000,6,0.6745718556,-2.0249997390,0.7541775274,1.5472144212,,, +0.4082031250,6,0.5751364976,-2.0167679677,0.8786110466,1.1374970110,,, +0.4101562500,6,0.4663161840,-1.9421432231,0.8485325439,0.9045951687,,, +0.4121093750,6,0.3501035681,-1.8099715454,0.6626954298,0.9240868258,,, +0.4140625000,6,0.2286286825,-1.6330046614,0.3437625704,1.1997027388,,, +0.4160156250,6,0.1041215666,-1.4270046753,-0.0651772928,1.6622538712,,, +0.4179687500,6,-0.0211268631,-1.2096390757,-0.5072726602,2.1885665942,,, +0.4199218750,6,-0.1448050125,-0.9992431252,-0.9207143736,2.6352363467,,, +0.4218750000,6,-0.2646211776,-0.8135359478,-1.2483115247,2.8779488994,,, +0.4238281250,6,-0.3783437685,-0.6683798568,-1.4463469512,2.8455922399,,, +0.4257812500,6,-0.4838404859,-0.5766694511,-1.4913333118,2.5398096293,,, +0.4277343750,6,-0.5791157637,-0.5474279556,-1.3836177318,2.0346343113,,, +0.4296875000,6,-0.6623458227,-0.5851738322,-1.1472738665,1.4563051832,,, +0.4316406250,6,-0.7319107205,-0.6896018378,-0.8262984842,0.9487943486,,, +0.4335937500,6,-0.7864228379,-0.8556007782,-0.4777052620,0.6344932390,,, +0.4355468750,6,-0.8247513005,-1.0736067283,-0.1625917601,0.5808307104,,, +0.4375000000,7,-0.8460419110,-1.3302670931,0.0634287720,0.7819705904,,, +0.4394531250,7,-0.8497322400,-1.6093692103,0.1589401826,1.1606031806,,, +0.4414062500,7,-0.8355616133,-1.8929687428,0.1032234571,1.5893379440,,, +0.4433593750,7,-0.8035758188,-2.1626391818,-0.1004686706,1.9258323976,,, +0.4453125000,7,-0.7541264530,-2.4007553301,-0.4253728324,2.0520274556,,, +0.4472656250,7,-0.6878649154,-2.5917212692,-0.8253402936,1.9067339371,,, +0.4492187500,7,-0.6057311583,-2.7230571803,-1.2419840778,1.5026371429,,, +0.4511718750,7,-0.5089373882,-2.7862692336,-1.6137349713,0.9230569069,,, +0.4531250000,7,-0.3989470030,-2.7774418870,-1.8853960963,0.2993489279,,, +0.4550781250,7,-0.2774491358,-2.6975112897,-2.0167080724,-0.2248611659,,, +0.4570312500,7,-0.1463292489,-2.5522007238,-1.9885908777,-0.5328107935,,, +0.4589843750,7,-0.0076362937,-2.3516225857,-1.8060903662,-0.5663773644,,, +0.4609375000,7,0.1364529876,-2.1095746572,-1.4975706525,-0.3417921204,,, +0.4628906250,7,0.2836719961,-1.8425797366,-1.1102782771,0.0550138580,,, +0.4648437500,7,0.4317037791,-1.5687355955,-0.7029691648,0.4921540994,,, +0.4667968750,7,0.5782214120,-1.3064554511,-0.3367468509,0.8281122603,,, +0.4687500000,7,0.7209285523,-1.0731867792,-0.0655390377,0.9506913659,,, +0.4707031250,7,0.8575994542,-0.8841978024,0.0723041499,0.8079104886,,, +0.4726562500,7,0.9861177446,-0.7515162671,0.0599815666,0.4223797054,,, +0.4746093750,7,1.1045132822,-0.6830945046,-0.0951479725,-0.1147875465,,, +0.4765625000,7,1.2109964516,-0.6822589892,-0.3627217885,-0.6688572272,,, +0.4785156250,7,1.3039892961,-0.7474827671,-0.6941164066,-1.0983337104,,, +0.4804687500,7,1.3821529403,-0.8724966169,-1.0300387776,-1.2936936732,,, +0.4824218750,7,1.4444108249,-1.0467311763,-1.3097831999,-1.2073794232,,, +0.4843750000,7,1.4899673467,-1.2560591950,-1.4807120278,-0.8668315473,,, +0.4863281250,7,1.5183215760,-1.4837861393,-1.5064833760,-0.3669889726,,, +0.4882812500,7,1.5292758136,-1.7118200601,-1.3727441731,0.1556883137,,, +0.4902343750,7,1.5229388356,-1.9219391299,-1.0894016848,0.5605547556,,, +0.4921875000,7,1.4997237708,-2.0970684467,-0.6891195296,0.7412410587,,, +0.4941406250,7,1.4603406473,-2.2224770551,-0.2222722508,0.6547019843,,, +0.4960937500,7,1.4057837393,-2.2868116966,0.2508559108,0.3328900240,,, +0.4980468750,7,1.3373139346,-2.2828951878,0.6694131815,-0.1261432294,,, +0.5000000000,8,1.2564364343,-2.2082337379,0.9814084992,-0.5852777802,,, +0.5019531250,8,1.1648741720,-2.0651978116,1.1517575871,-0.9060781590,,, +0.5039062500,8,1.0645374209,-1.8608639094,1.1676938934,-0.9869199601,,, +0.5058593750,8,0.9574901192,-1.6065282828,1.0407018835,-0.7910388521,,, +0.5078125000,8,0.8459135047,-1.3169264768,0.8046718379,-0.3568127661,,, +0.5097656250,8,0.7320676951,-1.0092131066,0.5105638384,0.2125427690,,, +0.5117187500,8,0.6182518862,-0.7017729956,0.2184123419,0.7770440032,,, +0.5136718750,8,0.5067638670,-0.4129465606,-0.0120830380,1.1980821927,,, +0.5156250000,8,0.3998595580,-0.1597583084,-0.1309147125,1.3761889031,,, +0.5175781250,8,0.2997132838,0.0432629049,-0.1056145375,1.2780752052,,, +0.5195312500,8,0.2083794740,0.1850896046,0.0736310971,0.9455362731,,, +0.5214843750,8,0.1277564646,0.2589573004,0.3923955035,0.4837830153,,, +0.5234375000,8,0.0595530326,0.2628288715,0.8142025350,0.0324007523,,, +0.5253906250,8,0.0052582503,0.1995293665,1.2861530755,-0.2731037068,,, +0.5273437500,8,-0.0338848120,0.0765418351,1.7471110995,-0.3386258878,,, +0.5292968750,8,-0.0569010751,-0.0945215538,2.1371745480,-0.1374272276,,, +0.5312500000,8,-0.0631007468,-0.2987362122,2.4069561396,0.2823791178,,, +0.5332031250,8,-0.0520916208,-0.5189126821,2.5252288278,0.8108734173,,, +0.5351562500,8,-0.0237861635,-0.7368019713,2.4837453199,1.3063315768,,, +0.5371093750,8,0.0215967353,-0.9343746071,2.2984812136,1.6339629459,,, +0.5390625000,8,0.0835353785,-1.0950842003,2.0071083324,1.7027679072,,, +0.5410156250,8,0.1612141821,-1.2050273945,1.6630919942,1.4904145626,,, +0.5429687500,8,0.2535377435,-1.2539192979,1.3273317687,1.0493172412,,, +0.5449218750,8,0.3591498107,-1.2358163644,1.0586478771,0.4922513727,,, +0.5468750000,8,0.4764568219,-1.1495363031,0.9045951687,-0.0385524690,,, +0.5488281250,8,0.6036556018,-0.9987457217,0.8940355635,-0.4103648892,,, +0.5507812500,8,0.7387647315,-0.7917093795,1.0326259461,-0.5362877439,,, +0.5527343750,8,0.8796590413,-0.5407185251,1.3019243734,-0.3990013246,,, +0.5546875000,8,1.0241066230,-0.2612381721,1.6622538712,-0.0554208172,,, +0.5566406250,8,1.1698077144,0.0291672348,2.0588778059,0.3790134127,,, +0.5585937500,8,1.3144347750,0.3120548556,2.4305250053,0.7621052039,,, +0.5605468750,8,1.4556730500,0.5693860533,2.7189367908,0.9640234965,,, +0.5625000000,9,1.5912609145,0.7847811254,2.8779488994,0.9030515780,,, +0.5644531250,9,1.7190292899,0.9446586763,2.8806936910,0.5681654275,,, +0.5664062500,9,1.8369394441,1.0391801871,2.7238007958,0.0222515038,,, +0.5683593750,9,1.9431185114,1.0629339198,2.4279418414,-0.6149196599,,, +0.5703125000,9,2.0358921126,1.0153104690,2.0346343113,-1.1992994843,,, +0.5722656250,9,2.1138135029,0.9005437778,1.5998022241,-1.6018126178,,, +0.5742187500,9,2.1756887376,0.7274147604,1.1850964482,-1.7434978973,,, +0.5761718750,9,2.2205974153,0.5086382012,0.8483263970,-1.6169100155,,, +0.5781250000,9,2.2479086352,0.2599756842,0.6344932390,-1.2879184845,,, +0.5800781250,9,2.2572918891,-0.0008635859,0.5688210526,-0.8774130242,,, +0.5820312500,9,2.2487226981,-0.2554574247,0.6528711494,-0.5279315528,,, +0.5839843750,9,2.2224828942,-0.4859546745,0.8643445559,-0.3643592040,,, +0.5859375000,9,2.1791555437,-0.6763190413,1.1606031806,-0.4594717137,,, +0.5878906250,9,2.1196145997,-0.8134460282,1.4853609772,-0.8137687668,,, +0.5898437500,9,2.0450094657,-0.8880750805,1.7775026599,-1.3551263727,,, +0.5917968750,9,1.9567447409,-0.8954333414,1.9806561408,-1.9583654441,,, +0.5937500000,9,1.8564555014,-0.8355661309,2.0520274556,-2.4793752101,,, +0.5957031250,9,1.7459785506,-0.7133311091,1.9691218088,-2.7944409259,,, +0.5976562500,9,1.6273201425,-0.5380565372,1.7333036119,-2.8339988575,,, +0.5996093750,9,1.5026207417,-0.3228874747,1.3696407306,-2.6015686801,,, +0.6015625000,9,1.3741174399,-0.0838655116,0.9230569069,-2.1726756896,,, +0.6035156250,9,1.2441046838,0.1611937814,0.4513913433,-1.6740592340,,, +0.6054687500,9,1.1148940050,0.3939473964,0.0164461664,-1.2488665435,,, +0.6074218750,9,0.9887734553,0.5968084909,-0.3255841176,-1.0173719192,,, +0.6093750000,9,0.8679674582,0.7541775274,-0.5328107935,-1.0439874057,,, +0.6113281250,9,0.7545977803,0.8535350881,-0.5841222299,-1.3196065582,,, +0.6132812500,9,0.6506463049,0.8863201473,-0.4824206251,-1.7641203663,,, +0.6152343750,9,0.5579202604,0.8485325439,-0.2541203305,-2.2484156057,,, +0.6171875000,9,0.4780205127,0.7410176286,0.0550138580,-2.6298261328,,, +0.6191406250,9,0.4123134757,0.5694132222,0.3870399896,-2.7913203880,,, +0.6210937500,9,0.3619071332,0.3437625704,0.6809063236,-2.6736841908,,, +0.6230468750,9,0.3276315907,0.0778202702,0.8820002640,-2.2918775031,,, +0.6250000000,10,0.3100244990,-0.2119004478,0.9506913659,-1.7310810939,,, +0.6269531250,10,0.3093216037,-0.5072726602,0.8685376110,-1.1235152577,,, +0.6289062500,10,0.3254525870,-0.7898130897,0.6411881241,-0.6123823843,,, +0.6308593750,10,0.3580422736,-1.0419641808,0.2975300671,-0.3128139989,,, +0.6328125000,10,0.4064171814,-1.2483115247,-0.1147875465,-0.2805237468,,, +0.6347656250,10,0.4696172999,-1.3966517551,-0.5367560383,-0.4967557180,,, +0.6367187500,10,0.5464128923,-1.4788364654,-0.9071824177,-0.8736513443,,, +0.6386718750,10,0.6353260255,-1.4913333118,-1.1722088627,-1.2785619119,,, +0.6406250000,10,0.7346564520,-1.4354651966,-1.2936936732,-1.5706412435,,, +0.6425781250,10,0.8425113903,-1.3173108646,-1.2551483488,-1.6396874449,,, +0.6445312500,10,0.9568386819,-1.1472738665,-1.0643060715,-1.4365861863,,, +0.6464843750,10,1.0754627446,-0.9393499597,-0.7519215278,-0.9870097606,,, +0.6484375000,10,1.1961226932,-0.7101440528,-0.3669889726,-0.3846152674,,, +0.6503906250,10,1.3165119586,-0.4777052620,0.0308767061,0.2343960106,,, +0.6523437500,10,1.4343187135,-0.2602613298,0.3807093048,0.7283875767,,, +0.6542968750,10,1.5472663948,-0.0749406786,0.6296673527,0.9888965485,,, +0.6562500000,10,1.6531536145,0.0634287720,0.7412410587,0.9701626979,,, +0.6582031250,10,1.7498927604,0.1433602436,0.7009120134,0.7014864365,,, +0.6601562500,10,1.8355466094,0.1575156101,0.5183842685,0.2790304211,,, +0.6621093750,10,1.9083623131,0.1032234571,0.2260394583,-0.1606868029,,, +0.6640625000,10,1.9668021611,-0.0173284533,-0.1261432294,-0.4783392019,,, +0.6660156250,10,2.0095705820,-0.1972397481,-0.4784107904,-0.5700916540,,, +0.6679687500,10,2.0356369104,-0.4253728324,-0.7705850481,-0.3961509376,,, +0.6699218750,10,2.0442535208,-0.6871239678,-0.9514798736,0.0082564431,,, +0.6718750000,10,2.0349690105,-0.9654362809,-0.9869199601,0.5424888696,,, +0.6738281250,10,2.0076362012,-1.2419840778,-0.8651119342,1.0680447035,,, +0.6757812500,10,1.9624148188,-1.4984458890,-0.5985309620,1.4465160121,,, +0.6777343750,10,1.8997688046,-1.7177774841,-0.2220287324,1.5775389170,,, +0.6796875000,10,1.8204583049,-1.8853960963,0.2125427690,1.4263392704,,, +0.6816406250,10,1.7255264787,-1.9901932870,0.6443546012,1.0333237724,,, +0.6835937500,10,1.6162813554,-2.0253058315,1.0130219352,0.5030872444,,, +0.6855468750,10,1.4942730593,-1.9885908777,1.2679557546,-0.0241520066,,, +0.6875000000,11,1.3612667999,-1.8827722525,1.3761889031,-0.4108610506,,, +0.6894531250,11,1.2192121009,-1.7152477220,1.3274578226,-0.5597473215,,, +0.6914062500,11,1.0702088070,-1.4975706525,1.1357487602,-0.4402684038,,, +0.6933593750,11,0.9164704621,-1.2446422238,0.8370679004,-0.0968326072,,, +0.6953125000,11,0.7602857029,-0.9736705310,0.4837830153,0.3635555387,,, +0.6972656250,11,0.6039783403,-0.7029691648,0.1364182244,0.8008170832,,, +0.6992187500,11,0.4498668311,-0.4506790511,-0.1458198619,1.0803948142,,, +0.7011718750,11,0.3002238458,-0.2335026869,-0.3143087549,1.1103437460,,, +0.7031250000,11,0.1572366447,-0.0655390377,-0.3386258878,0.8667484914,,, +0.7050781250,11,0.0229689510,0.0426996546,-0.2113271667,0.4004992735,,, +0.7070312500,11,-0.1006750062,0.0850205908,0.0508562300,-0.1764326637,,, +0.7089843750,11,-0.2119836546,0.0599815666,0.4095894216,-0.7214608981,,, +0.7109375000,11,-0.3094678625,-0.0290095076,0.8108734173,-1.1002432968,,, +0.7128906250,11,-0.3918868249,-0.1739336566,1.1934277848,-1.2232870106,,, +0.7148437500,11,-0.4582695971,-0.3627217885,1.4982109078,-1.0702687338,,, +0.7167968750,11,-0.5079318999,-0.5800984213,1.6775951412,-0.6954067799,,, +0.7187500000,11,-0.5404879020,-0.8086493471,1.7027679072,-0.2124145663,,, +0.7207031250,11,-0.5558567725,-1.0300387776,1.5682060740,0.2368388783,,, +0.7226562500,11,-0.5542638911,-1.2262910912,1.2925267899,0.5213704739,,, +0.7246093750,11,-0.5362366915,-1.3810477926,0.9155823130,0.5571250357,,, +0.7265625000,11,-0.5025952150,-1.4807120278,0.4922513727,0.3301381800,,, +0.7285156250,11,-0.4544375357,-1.5154008349,0.0838941097,-0.0995293146,,, +0.7304687500,11,-0.3931203161,-1.4796387184,-0.2511984675,-0.6141650551,,, +0.7324218750,11,-0.3202348315,-1.3727441731,-0.4668729855,-1.0705998831,,, +0.7343750000,11,-0.2375788840,-1.1988821934,-0.5362877439,-1.3394010772,,, +0.7363281250,11,-0.1471250976,-0.9667790959,-0.4560749586,-1.3403227267,,, +0.7382812500,11,-0.0509861503,-0.6891195296,-0.2468430041,-1.0642976860,,, +0.7402343750,11,0.0486224482,-0.3816677109,0.0500594696,-0.5759438595,,, +0.7421875000,11,0.1494213822,-0.0621741496,0.3790134127,0.0041022005,,, +0.7441406250,11,0.2491076739,0.2508559108,0.6788253866,0.5321828822,,, +0.7460937500,11,0.3453952436,0.5394464697,0.8922950993,0.8809051719,,, +0.7480468750,11,0.4360551763,0.7873976429,0.9751640918,0.9739480932,,, +0.7500000000,12,0.5189549878,0.9814084992,0.9030515780,0.8068531766,,, +0.7519531250,12,0.5920962042,1.1119975750,0.6752969339,0.4481010226,,, +0.7539062500,12,0.6536495966,1.1741568928,0.3151101245,0.0201801873,,, +0.7558593750,12,0.7019874523,1.1676938934,-0.1339935981,-0.3341617189,,, +0.7578125000,12,0.7357123196,1.0972374518,-0.6149196599,-0.4912335635,,, +0.7597656250,12,0.7536817205,0.9719075762,-1.0658334479,-0.3805059257,,, +0.7617187500,12,0.7550284002,0.8046718379,-1.4297364149,-0.0041569641,,, +0.7636718750,12,0.7391757583,0.6114334280,-1.6632877530,0.5632999619,,, +0.7656250000,12,0.7058481899,0.4099144509,-1.7434978973,1.1952068865,,, +0.7675781250,12,0.6550761577,0.2184123419,-1.6712515984,1.7472385069,,, +0.7695312500,12,0.5871959046,0.0545161477,-1.4711121186,2.0967190811,,, +0.7714843750,12,0.5028438120,-0.0661277984,-1.1874373412,2.1760055366,,, +0.7734375000,12,0.4029455027,-0.1309147125,-0.8774130242,1.9907896528,,, +0.7753906250,12,0.2886998792,-0.1311680668,-0.6020885979,1.6183053944,,, +0.7773437500,12,0.1615583760,-0.0627523168,-0.4168120175,1.1859348344,,, +0.7792968750,12,0.0231997895,0.0736310971,-0.3625537799,0.8360782084,,, +0.7812500000,12,-0.1244988728,0.2724851298,-0.4594717137,0.6869181620,,, +0.7832031250,12,-0.2794950163,0.5238930265,-0.7037191343,0.7998334366,,, +0.7851562500,12,-0.4396159819,0.8142025350,-1.0679937759,1.1623947214,,, +0.7871093750,12,-0.6025968485,1.1269707411,-1.5057422552,1.6916046697,,, +0.7890625000,12,-0.7661198514,1.4441036551,-1.9583654441,2.2564956184,,, +0.7910156250,12,-0.9278547274,1.7471110995,-2.3643027083,2.7138930310,,, +0.7929687500,12,-1.0854992806,2.0183894046,-2.6685803107,2.9475441850,,, +0.7949218750,12,-1.2368194580,2.2424424820,-2.8313369695,2.8998891375,,, +0.7968750000,12,-1.3796882339,2.4069561396,-2.8339988575,2.5877673403,,, +0.7988281250,12,-1.5121226217,2.5036507375,-2.6821424243,2.0977558417,,, +0.8007812500,12,-1.6323181664,2.5288527400,-2.4045992957,1.5624171768,,, +0.8027343750,12,-1.7386803119,2.4837453199,-2.0489427996,1.1239669259,,, +0.8046875000,12,-1.8298520966,2.3742805529,-1.6740592340,0.8953186036,,, +0.8066406250,12,-1.9047376901,2.2107593353,-1.3409610350,0.9291821267,,, +0.8085937500,12,-1.9625213604,2.0071083324,-1.1032728179,1.2036846594,,, +0.8105468750,12,-2.0026815392,1.7799043854,-0.9988721975,1.6284541419,,, +0.8125000000,13,-2.0249997390,1.5472144212,-1.0439874057,2.0694974039,,, +0.8144531250,13,-2.0295641664,1.3273317687,-1.2306710485,2.3860535426,,, +0.8164062500,13,-2.0167679677,1.1374970110,-1.5280434680,2.4693210022,,, +0.8183593750,13,-1.9873021391,0.9926925822,-1.8871120228,2.2724430937,,, +0.8203125000,13,-1.9421432231,0.9045951687,-2.2484156057,1.8235323387,,, +0.8222656250,13,-1.8825360101,0.8807589772,-2.5513036554,1.2181624181,,, +0.8242187500,13,-1.8099715454,0.9240868258,-2.7434043164,0.5933836969,,, +0.8261718750,13,-1.7261608279,1.0326259461,-2.7888069199,0.0903820099,,, +0.8281250000,13,-1.6330046614,1.1997027388,-2.6736841908,-0.1839871598,,, +0.8300781250,13,-1.5325601859,1.4143870900,-2.4084783447,-0.1862488349,,, +0.8320312500,13,-1.4270046753,1.6622538712,-2.0263104112,0.0520166313,,, +0.8339843750,13,-1.3185972360,1.9263885218,-1.5778603572,0.4330716254,,, +0.8359375000,13,-1.2096390757,2.1885665942,-1.1235152577,0.8200513727,,, +0.8378906250,13,-1.1024330403,2.4305250053,-0.7240082645,1.0747157497,,, +0.8398437500,13,-0.9992431252,2.6352363467,-0.4310061733,1.0955740191,,, +0.8417968750,13,-0.9022546724,2.7880973892,-0.2791113852,0.8459315247,,, +0.8437500000,13,-0.8135359478,2.8779488994,-0.2805237468,0.3641695321,,, +0.8457031250,13,-0.7350017746,2.8978556523,-0.4231934522,-0.2465611586,,, +0.8476562500,13,-0.6683798568,2.8455922399,-0.6727524320,-0.8464100419,,, +0.8496093750,13,-0.6151803842,2.7238007958,-0.9779231262,-1.2969688491,,, +0.8515625000,13,-0.5766694511,2.5398096293,-1.2785619119,-1.4990336855,,, +0.8535156250,13,-0.5538467533,2.3051254107,-1.5150840896,-1.4196393886,,, +0.8554687500,13,-0.5474279556,2.0346343113,-1.6378021474,-1.1009581431,,, +0.8574218750,13,-0.5578320360,1.7455677968,-1.6147225230,-0.6486246762,,, +0.8593750000,13,-0.5851738322,1.4563051832,-1.4365861863,-0.2026887361,,, +0.8613281250,13,-0.6292619160,1.1850964482,-1.1183676517,0.1008432961,,, +0.8632812500,13,-0.6896018378,0.9487943486,-0.6969986541,0.1673367679,,, +0.8652343750,13,-0.7654046810,0.7616842476,-0.2256707534,-0.0305038886,,, +0.8671875000,13,-0.8556007782,0.6344932390,0.2343960106,-0.4451458738,,, +0.8691406250,13,-0.9588583481,0.5736476533,0.6234366076,-0.9672693808,,, +0.8710937500,13,-1.0736067283,0.5808307104,0.8923998081,-1.4557651313,,, +0.8730468750,13,-1.1980637952,0.6528711494,1.0105404229,-1.7764662336,,, +0.8750000000,14,-1.3302670931,0.7819705904,0.9701626979,-1.8389984936,,, +0.8769531250,14,-1.4681081257,0.9562537576,0.7877762830,-1.6216487889,,, +0.8789062500,14,-1.6093692103,1.1606031806,0.5014849383,-1.1774348182,,, +0.8808593750,14,-1.7517622498,1.3777201523,0.1650148997,-0.6197114989,,, +0.8828125000,14,-1.8929687428,1.5893379440,-0.1606868029,-0.0912575086,,, +0.8847656250,14,-2.0306803324,1.7775026599,-0.4169753027,0.2746870905,,, +0.8867187500,14,-2.1626391818,1.9258323976,-0.5566687319,0.3907553799,,, +0.8886718750,14,-2.2866774723,2.0206668915,-0.5514199599,0.2392038406,,, +0.8906250000,14,-2.4007553301,2.0520274556,-0.3961509376,-0.1234290101,,, +0.8925781250,14,-2.5029965181,2.0143202679,-0.1098588865,-0.5820304157,,, +0.8945312500,14,-2.5917212692,1.9067339371,0.2673313031,-0.9946805248,,, +0.8964843750,14,-2.6654756841,1.7333036119,0.6804094098,-1.2317703599,,, +0.8984375000,14,-2.7230571803,1.5026371429,1.0680447035,-1.2117474109,,, +0.9003906250,14,-2.7635355466,1.2273223789,1.3721392424,-0.9236899070,,, +0.9023437500,14,-2.7862692336,0.9230569069,1.5468816542,-0.4305206916,,, +0.9042968750,14,-2.7909165956,0.6075609094,1.5658911899,0.1480222479,,, +0.9062500000,14,-2.7774418870,0.2993489279,1.4263392704,0.6679934029,,, +0.9082031250,14,-2.7461159084,0.0164461664,1.1494064957,1.0004907596,,, +0.9101562500,14,-2.6975112897,-0.2248611659,0.7770038378,1.0667946094,,, +0.9121093750,14,-2.6324924953,-0.4111543471,0.3652685926,0.8597654868,,, +0.9140625000,14,-2.5522007238,-0.5328107935,-0.0241520066,0.4456384107,,, +0.9160156250,14,-2.4580339683,-0.5846681265,-0.3336720430,-0.0542767453,,, +0.9179687500,14,-2.3516225857,-0.5663773644,-0.5187024373,-0.4969719481,,, +0.9199218750,14,-2.2348008026,-0.4824206251,-0.5545591681,-0.7570459520,,, +0.9218750000,14,-2.1095746572,-0.3417921204,-0.4402684038,-0.7611641008,,, +0.9238281250,14,-1.9780869387,-0.1573647012,-0.1986760946,-0.5082276810,,, +0.9257812500,14,-1.8425797366,0.0550138580,0.1271548144,-0.0697242975,,, +0.9277343750,14,-1.7053552578,0.2776318046,0.4806981521,0.4298372713,,, +0.9296875000,14,-1.5687355955,0.4921540994,0.8008170832,0.8470458326,,, +0.9316406250,14,-1.4350221558,0.6809063236,1.0313363667,1.0589093289,,, +0.9335937500,14,-1.3064554511,0.8281122603,1.1298431094,0.9966022213,,, +0.9355468750,14,-1.1851759662,0.9209988366,1.0743449714,0.6643892507,,, +0.9375000000,15,-1.0731867792,0.9506913659,0.8667484914,0.1385386313,,, +0.9394531250,15,-0.9723185953,0.9128366509,0.5326154745,-0.4534781773,,, +0.9414062500,15,-0.8841978024,0.8079104886,0.1172350982,-0.9678003039,,, +0.9433593750,15,-0.8102181100,0.6411881241,-0.3213767637,-1.2834645690,,, +0.9453125000,15,-0.7515162671,0.4223797054,-0.7214608981,-1.3353997060,,, +0.9472656250,15,-0.7089522840,0.1649561541,-1.0270818708,-1.1320863999,,, +0.9492187500,15,-0.6830945046,-0.1147875465,-1.1967890626,-0.7530446355,,, +0.9511718750,15,-0.6742097907,-0.3988663308,-1.2100228977,-0.3268387070,,, +0.9531250000,15,-0.6822589892,-0.6688572272,-1.0702687338,0.0043701116,,, +0.9550781250,15,-0.7068977625,-0.9071824177,-0.8044674418,0.1240062532,,, +0.9570312500,15,-0.7474827671,-1.0983337104,-0.4587747342,-0.0267429150,,, +0.9589843750,15,-0.8030830721,-1.2299530435,-0.0913299931,-0.4325762221,,, +0.9609375000,15,-0.8724966169,-1.2936936732,0.2368388783,-1.0080375931,,, +0.9628906250,15,-0.9542714216,-1.2858019948,0.4713577456,-1.6207018643,,, +0.9648437500,15,-1.0467311763,-1.2073794232,0.5730092095,-2.1272351417,,, +0.9667968750,15,-1.1480047637,-1.0643060715,0.5238716777,-2.4124487963,,, +0.9687500000,15,-1.2560591950,-0.8668315473,0.3301381800,-2.4206456881,,, +0.9707031250,15,-1.3687353851,-0.6288613999,0.0211757254,-2.1706696300,,, +0.9726562500,15,-1.4837861393,-0.3669889726,-0.3550284227,-1.7505354819,,, +0.9746093750,15,-1.5989156852,-0.0993401691,-0.7393244047,-1.2931135147,,, +0.9765625000,15,-1.7118200601,0.1556883137,-1.0705998831,-0.9395340306,,, +0.9785156250,15,-1.8202276440,0.3807093048,-1.2952897327,-0.8003436119,,, +0.9804687500,15,-1.9219391299,0.5605547556,-1.3757141731,-0.9250604435,,, +0.9824218750,15,-2.0148662310,0.6833302729,-1.2959466734,-1.2884740645,,, +0.9843750000,15,-2.0970684467,0.7412410587,-1.0642976860,-1.7974455953,,, +0.9863281250,15,-2.1667872441,0.7311316727,-0.7120273494,-2.3163457400,,, +0.9882812500,15,-2.2224770551,0.6547019843,-0.2884876359,-2.7041596272,,, +0.9902343750,15,-2.2628325485,0.5183842685,0.1465494666,-2.8530898204,,, +0.9921875000,15,-2.2868116966,0.3328900240,0.5321828822,-2.7180780314,,, +0.9941406250,15,-2.2936542344,0.1124581283,0.8158454612,-2.3291547692,,, +0.9960937500,15,-2.2828951878,-0.1261432294,0.9614652747,-1.7832323003,,, +0.9980468750,15,-2.2543732323,-0.3647912283,0.9550541542,-1.2175900590,,, +1.0000000000,16,-2.2082337379,-0.5852777802,0.8068531766,-0.7723189861,,, +1.0019531250,16,-2.1449264448,-0.7705850481,0.5497010892,-0.5520171022,,, +1.0039062500,16,-2.0651978116,-0.9060781590,0.2338799828,-0.5972336322,,, +1.0058593750,16,-1.9700781699,-0.9805319248,-0.0807587768,-0.8734870257,,, +1.0078125000,16,-1.8608639094,-0.9869199601,-0.3341617189,-1.2808655550,,, +1.0097656250,16,-1.7390950053,-0.9229111526,-0.4754743259,-1.6815779352,,, +1.0117187500,16,-1.6065282828,-0.7910388521,-0.4710114767,-1.9379016889,,, +1.0136718750,16,-1.4651068845,-0.5985309620,-0.3095555860,-1.9501271208,,, +1.0156250000,16,-1.3169264768,-0.3568127661,-0.0041569641,-1.6840958410,,, +1.0175781250,16,-1.1641987867,-0.0807171438,0.4098442862,-1.1807844816,,, +1.0195312500,16,-1.0092131066,0.2125427690,0.8802670145,-0.5453050262,,, +1.0214843750,16,-0.8542964412,0.5045668507,1.3461600229,0.0816656178,,, +1.0234375000,16,-0.7017729956,0.7770440032,1.7472385069,0.5621986200,,, +1.0253906250,16,-0.5539237113,1.0130219352,2.0332164539,0.7986705102,,, +1.0273437500,16,-0.4129465606,1.1980821927,2.1715817225,0.7602735955,,, +1.0292968750,16,-0.2809182937,1.3213385130,2.1526030853,0.4912159791,,, +1.0312500000,16,-0.1597583084,1.3761889031,1.9907896528,0.0983659614,,, +1.0332031250,16,-0.0511952739,1.3607690127,1.7225756554,-0.2782707568,,, +1.0351562500,16,0.0432629049,1.2780752052,1.4005914746,-0.5041476917,,, +1.0371093750,16,0.1223552593,1.1357487602,1.0854135177,-0.4872678528,,, +1.0390625000,16,0.1850896046,0.9455362731,0.8360782084,-0.2036004516,,, +1.0410156250,16,0.2307596829,0.7224638954,0.7008378518,0.2961436944,,, +1.0429687500,16,0.2589573004,0.4837830153,0.7095984465,0.9002366516,,, +1.0449218750,16,0.2695792459,0.2477609152,0.8692175379,1.4663977946,,, +1.0468750000,16,0.2628288715,0.0324007523,1.1623947214,1.8606501325,,, +1.0488281250,16,0.2392123056,-0.1458198619,1.5503278228,1.9939203691,,, +1.0507812500,16,0.1995293665,-0.2731037068,1.9787212381,1.8463527226,,, +1.0527343750,16,0.1448593350,-0.3393016768,2.3862107873,1.4726736302,,, +1.0546875000,16,0.0765418351,-0.3386258878,2.7138930310,0.9871376509,,, +1.0566406250,16,-0.0038468415,-0.2700584268,2.9144749590,0.5321808579,,, +1.0585937500,16,-0.0945215538,-0.1374272276,2.9596190662,0.2393730925,,, +1.0605468750,16,-0.1935197836,0.0508562300,2.8443398937,0.1933708969,,, +1.0625000000,17,-0.2987362122,0.2823791178,2.5877673403,0.4087503374,,, +1.0644531250,17,-0.4079597944,0.5415887667,2.2301579250,0.8260687334,,, +1.0664062500,17,-0.5189126821,0.8108734173,1.8266195628,1.3282340397,,, +1.0683593750,17,-0.6292903140,1.0717868604,1.4385272800,1.7726947142,,, +1.0703125000,17,-0.7368019713,1.3063315768,1.1239669259,2.0306267967,,, +1.0722656250,17,-0.8392110875,1.4982109078,0.9286953086,2.0223770174,,, +1.0742187500,17,-0.9343746071,1.6339629459,0.8790247274,1.7394466972,,, +1.0761718750,17,-1.0202807043,1.7038970820,0.9777401179,1.2469898099,,, +1.0781250000,17,-1.0950842003,1.7027679072,1.2036846594,0.6661389185,,, +1.0800781250,17,-1.1571390593,1.6301394800,1.5150782935,0.1410011478,,, +1.0820312500,17,-1.2050273945,1.4904145626,1.8560521595,-0.2006322769,,, +1.0839843750,17,-1.2375844752,1.2925267899,2.1653810409,-0.2820965579,,, +1.0859375000,17,-1.2539192979,1.0493172412,2.3860535426,-0.0986454486,,, +1.0878906250,17,-1.2534303606,0.7766388884,2.4741892250,0.2814714245,,, +1.0898437500,17,-1.2358163644,0.4922513727,2.4059136139,0.7359391633,,, +1.0917968750,17,-1.2010816539,0.2145831799,2.1811200657,1.1221256620,,, +1.0937500000,17,-1.1495363031,-0.0385524690,1.8235323387,1.3163956500,,, +1.0957031250,17,-1.0817908424,-0.2511984675,1.3770578917,1.2482137908,,, +1.0976562500,17,-0.9987457217,-0.4103648892,0.8989996613,0.9196881186,,, +1.0996093750,17,-0.9015756919,-0.5069327923,0.4511833611,0.4051955240,,, +1.1015625000,17,-0.7917093795,-0.5362877439,0.0903820099,-0.1688100058,,, +1.1035156250,17,-0.6708044114,-0.4986388895,-0.1404711557,-0.6582742734,,, +1.1054687500,17,-0.5407185251,-0.3990013246,-0.2189130296,-0.9408575268,,, +1.1074218750,17,-0.4034771709,-0.2468430041,-0.1463918185,-0.9493135052,,, +1.1093750000,17,-0.2612381721,-0.0554208172,0.0520166313,-0.6897861214,,, +1.1113281250,17,-0.1162540634,0.1591478641,0.3315728894,-0.2400104896,,, +1.1132812500,17,0.0291672348,0.3790134127,0.6349006603,0.2720875484,,, +1.1152343750,17,0.1727027157,0.5858432655,0.9009814247,0.7035272470,,, +1.1171875000,17,0.3120548556,0.7621052039,1.0747157497,0.9355137218,,, +1.1191406250,17,0.4449917410,0.8922950993,1.1155617543,0.9060284047,,, +1.1210937500,17,0.5693860533,0.9640234965,1.0039049621,0.6268367912,,, +1.1230468750,17,0.6832522260,0.9688852529,0.7441671243,0.1802520417,,, +1.1250000000,18,0.7847811254,0.9030515780,0.3641695321,-0.3034584827,,, +1.1269531250,18,0.8723716473,0.7675431756,-0.0891502772,-0.6818312697,,, +1.1289062500,18,0.9446586763,0.5681654275,-0.5570015212,-0.8393285912,,, +1.1308593750,18,1.0005369179,0.3151101245,-0.9778518666,-0.7191014819,,, +1.1328125000,18,1.0391801871,0.0222515038,-1.2969688491,-0.3386875992,,, +1.1347656250,18,1.0600558148,-0.2938143342,-1.4749050983,0.2146594220,,, +1.1367187500,18,1.0629339198,-0.6149196599,-1.4936059460,0.8077302793,,, +1.1386718750,18,1.0478913854,-0.9225848049,-1.3591883035,1.2976994013,,, +1.1406250000,18,1.0153104690,-1.1992994843,-1.1009581431,1.5710854567,,, +1.1425781250,18,0.9658720706,-1.4297364149,-0.7668197588,1.5746567641,,, +1.1445312500,18,0.9005437778,-1.6018126178,-0.4157919638,1.3298131764,,, +1.1464843750,18,0.8205628957,-1.7075244129,-0.1087969680,0.9265047182,,, +1.1484375000,18,0.7274147604,-1.7434978973,0.1008432961,0.4983557018,,, +1.1503906250,18,0.6228067146,-1.7112165365,0.1757230900,0.1858141336,,, +1.1523437500,18,0.5086382012,-1.6169100155,0.1001857359,0.0974281735,,, +1.1542968750,18,0.3869674993,-1.4711121186,-0.1172350887,0.2798647620,,, +1.1562500000,18,0.2599756842,-1.2879184845,-0.4451458738,0.7048895722,,, +1.1582031250,18,0.1299284431,-1.0839960140,-0.8341883613,1.2768788391,,, +1.1601562500,18,-0.0008635859,-0.8774130242,-1.2247367170,1.8588064232,,, +1.1621093750,18,-0.1300852554,-0.6863717437,-1.5561978510,2.3095859006,,, +1.1640625000,18,-0.2554574247,-0.5279315528,-1.7764662336,2.5225353348,,, +1.1660156250,18,-0.3747768388,-0.4168120175,-1.8500604655,2.4544246030,,, +1.1679687500,18,-0.4859546745,-0.3643592040,-1.7636741695,2.1371460816,,, +1.1699218750,18,-0.5870530756,-0.3777473688,-1.5282764807,1.6688117907,,, +1.1718750000,18,-0.6763190413,-0.4594717137,-1.1774348182,1.1867185475,,, +1.1738281250,18,-0.7522150704,-0.6071675882,-0.7621209966,0.8295919626,,, +1.1757812500,18,-0.8134460282,-0.8137687668,-0.3428094650,0.6994582925,,, +1.1777343750,18,-0.8589817634,-1.0679937759,0.0199017958,0.8335949820,,, +1.1796875000,18,-0.8880750805,-1.3551263727,0.2746870905,1.1942482732,,, +1.1816406250,18,-0.9002747516,-1.6580357655,0.3874423305,1.6789366463,,, +1.1835937500,18,-0.8954333414,-1.9583654441,0.3465499537,2.1485166978,,, +1.1855468750,18,-0.8737097073,-2.2378077346,0.1646396605,2.4653197038,,, +1.1875000000,19,-0.8355661309,-2.4793752101,-0.1234290101,2.5309068373,,, +1.1894531250,19,-0.7817601324,-2.6685803107,-0.4660477697,2.3130953162,,, +1.1914062500,19,-0.7133311091,-2.7944409259,-0.8029503439,1.8548480639,,, +1.1933593750,19,-0.6315820347,-2.8502418262,-1.0746524480,1.2625899337,,, +1.1953125000,19,-0.5380565372,-2.8339988575,-1.2317703599,0.6771519036,,, +1.1972656250,19,-0.4345117594,-2.7485935381,-1.2427663830,0.2353056138,,, +1.1992187500,19,-0.3228874747,-2.6015686801,-1.0989145127,0.0324293386,,, +1.2011718750,19,-0.2052720016,-2.4045992957,-0.8157125883,0.0965362187,,, +1.2031250000,19,-0.0838655116,-2.1726756896,-0.4305206916,0.3807813663,,, +1.2050781250,19,0.0390586252,-1.9230557115,0.0032066558,0.7764998036,,, +1.2070312500,19,0.1611937814,-1.6740592340,0.4241964108,1.1432001753,,, +1.2089843750,19,0.2802405993,-1.4437889283,0.7728522935,1.3472919950,,, +1.2109375000,19,0.3939473964,-1.2488665435,1.0004907596,1.2989304814,,, +1.2128906250,19,0.5001497385,-1.1032728179,1.0768793617,0.9768788762,,, +1.2148437500,19,0.5968084909,-1.0173719192,0.9949035997,0.4345721175,,, +1.2167968750,19,0.6820456783,-0.9971884460,0.7716356038,-0.2142821538,,, +1.2187500000,19,0.7541775274,-1.0439874057,0.4456384107,-0.8266210987,,, +1.2207031250,19,0.8117441131,-1.1541864606,0.0709259066,-1.2689913149,,, +1.2226562500,19,0.8535350881,-1.3196065582,-0.2914806067,-1.4538837276,,, +1.2246093750,19,0.8786110466,-1.5280434680,-0.5830839475,-1.3634825600,,, +1.2265625000,19,0.8863201473,-1.7641203663,-0.7570459520,-1.0543215730,,, +1.2285156250,19,0.8763097044,-2.0103620125,-0.7855027967,-0.6415734346,,, +1.2304687500,19,0.8485325439,-2.2484156057,-0.6639212301,-0.2672799340,,, +1.2324218750,19,0.8032480136,-2.4603331840,-0.4118171158,-0.0612319753,,, +1.2343750000,19,0.7410176286,-2.6298261328,-0.0697242975,-0.1052226362,,, +1.2363281250,19,0.6626954298,-2.7434043164,0.3071141529,-0.4104719780,,, +1.2382812500,19,0.5694132222,-2.7913203880,0.6573497132,-0.9144121527,,, +1.2402343750,19,0.4625609526,-2.7682534229,0.9230871417,-1.4977151132,,, +1.2421875000,19,0.3437625704,-2.6736841908,1.0589093289,-2.0168971580,,, +1.2441406250,19,0.2148477929,-2.5119358920,1.0389625699,-2.3435652127,,, +1.2460937500,19,0.0778202702,-2.2918775031,0.8609986368,-2.3995492530,,, +1.2480468750,19,-0.0651772928,-2.0263104112,0.5467440051,-2.1782925571,,, +1.2500000000,20,-0.2119004478,-1.7310810939,0.1385386313,-1.7466375845,,, +1.2519531250,20,-0.3600420933,-1.4239817108,-0.3072323019,-1.2265180427,,, +1.2539062500,20,-0.5072726602,-1.1235152577,-0.7288907647,-0.7615746042,,, +1.2558593750,20,-0.6512806894,-0.8476113804,-1.0690393040,-0.4778435060,,, +1.2578125000,20,-0.7898130897,-0.6123823843,-1.2834645690,-0.4492915060,,, +1.2597656250,20,-0.9207143736,-0.4310061733,-1.3479843525,-0.6776422336,,, +1.2617187500,20,-1.0419641808,-0.3128139989,-1.2621718839,-1.0920219385,,, +1.2636718750,20,-1.1517124365,-0.2626466188,-1.0493775132,-1.5685205631,,, +1.2656250000,20,-1.2483115247,-0.2805237468,-0.7530446355,-1.9643056971,,, +1.2675781250,20,-1.3303449173,-0.3616498276,-0.4298939132,-2.1569383129,,, +1.2695312500,20,-1.3966517551,-0.4967557180,-0.1410376407,-2.0781133827,,, +1.2714843750,20,-1.4463469512,-0.6727524320,0.0575915004,-1.7325763225,,, +1.2734375000,20,-1.4788364654,-0.8736513443,0.1240062532,-1.1970289602,,, +1.2753906250,20,-1.4938274818,-1.0816866677,0.0367595639,-0.5993228998,,, +1.2773437500,20,-1.4913333118,-1.2785619119,-0.2016591286,-0.0836407106,,, +1.2792968750,20,-1.4716729365,-1.4467333890,-0.5651553690,0.2287943676,,, +1.2812500000,20,-1.4354651966,-1.5706412435,-1.0080375931,0.2727140524,,, +1.2832031250,20,-1.3836177318,-1.6378021474,-1.4720775022,0.0564650256,,, +1.2851562500,20,-1.3173108646,-1.6396874449,-1.8955235092,-0.3405046063,,, +1.2871093750,20,-1.2379767081,-1.5723254942,-2.2226636531,-0.7896413789,,, +1.2890625000,20,-1.1472738665,-1.4365861863,-2.4124487963,-1.1487345134,,, +1.2910156250,20,-1.0470581706,-1.2381277823,-2.4448332764,-1.3010986638,,, +1.2929687500,20,-0.9393499597,-0.9870097606,-2.3238457017,-1.1877506038,,, +1.2949218750,20,-0.8262984842,-0.6969986541,-2.0769118627,-0.8237593404,,, +1.2968750000,20,-0.7101440528,-0.3846152674,-1.7505354819,-0.2942868426,,, +1.2988281250,20,-0.5931785849,-0.0679896980,-1.4030097954,0.2685970994,,, +1.3007812500,20,-0.4777052620,0.2343960106,-1.0952954133,0.7219729921,,, +1.3027343750,20,-0.3659979822,0.5049899218,-0.8814855041,0.9511215819,,, +1.3046875000,20,-0.2602613298,0.7283875767,-0.8003436119,0.9008643345,,, +1.3066406250,20,-0.1625917601,0.8923998081,-0.8692323300,0.5906059079,,, +1.3085937500,20,-0.0749406786,0.9888965485,-1.0813786509,0.1089566826,,, +1.3105468750,20,0.0009199371,1.0143678055,-1.4069020908,-0.4105902913,,, +1.3125000000,21,0.0634287720,0.9701626979,-1.7974455953,-0.8262613606,,, +1.3144531250,21,0.1112627180,0.8623898987,-2.1936880647,-1.0268516736,,, +1.3164062500,21,0.1433602436,0.7014864365,-2.5345684872,-0.9621745275,,, +1.3183593750,21,0.1589401826,0.5014849383,-2.7667850594,-0.6567656758,,, +1.3203125000,21,0.1575156101,0.2790304211,-2.8530898204,-0.2030871275,,, +1.3222656250,21,0.1389025635,0.0522152040,-2.7780869107,0.2639062549,,, +1.3242187500,21,0.1032234571,-0.1606868029,-2.5506313712,0.6038659590,,, +1.3261718750,21,0.0509051274,-0.3424981637,-2.2024548568,0.7096459991,,, +1.3281250000,21,-0.0173284533,-0.4783392019,-1.7832323003,0.5368167826,,, +1.3300781250,21,-0.1004686706,-0.5566687319,-1.3528578782,0.1160064092,,, +1.3320312500,21,-0.1972397481,-0.5700916540,-0.9721332780,-0.4553145219,,, +1.3339843750,21,-0.3061209091,-0.5158770920,-0.6933185359,-1.0393547422,,, +1.3359375000,21,-0.4253728324,-0.3961509376,-0.5520171022,-1.4955637468,,, +1.3378906250,21,-0.5530679369,-0.2177493690,-0.5616589556,-1.7189402808,,, +1.3398437500,21,-0.6871239678,0.0082564431,-0.7114409121,-1.6685906676,,, +1.3417968750,21,-0.8253402936,0.2673313031,-0.9680447772,-1.3787120683,,, +1.3437500000,21,-0.9654362809,0.5424888696,-1.2808655550,-0.9489926046,,, +1.3457031250,21,-1.1050910731,0.8154758170,-1.5899352021,-0.5170615323,,, +1.3476562500,21,-1.2419840778,1.0680447035,-1.8353075510,-0.2205422031,,, +1.3496093750,21,-1.3738354539,1.2832267845,-1.9664424302,-0.1591101072,,, +1.3515625000,21,-1.4984458890,1.4465160121,-1.9501271208,-0.3669568692,,, +1.3535156250,21,-1.6137349713,1.5468816542,-1.7757010920,-0.8032090572,,, +1.3554687500,21,-1.7177774841,1.5775389170,-1.4567699787,-1.3629297270,,, +1.3574218750,21,-1.8088369870,1.5364238298,-1.0291415717,-1.9056894224,,, +1.3593750000,21,-1.8853960963,1.4263392704,-0.5453050262,-2.2938779901,,, +1.3613281250,21,-1.9461829348,1.2547619447,-0.0663128969,-2.4302587800,,, +1.3632812500,21,-1.9901932870,1.0333237724,0.3476698696,-2.2844743071,,, +1.3652343750,21,-2.0167080724,0.7770038378,0.6466782344,-1.9012403677,,, +1.3671875000,21,-2.0253058315,0.5030872444,0.7986705102,-1.3879840897,,, +1.3691406250,21,-2.0158700046,0.2299634679,0.7944602773,-0.8853150157,,, +1.3710937500,21,-1.9885908777,-0.0241520066,0.6490888928,-0.5284230870,,, +1.3730468750,21,-1.9439621596,-0.2424836305,0.3994251094,-0.4099838634,,, +1.3750000000,22,-1.8827722525,-0.4108610506,0.0983659614,-0.5547380276,,, +1.3769531250,22,-1.8060903662,-0.5187024373,-0.1934575559,-0.9127124465,,, +1.3789062500,22,-1.7152477220,-0.5597473215,-0.4171778551,-1.3729407621,,, +1.3808593750,22,-1.6118141732,-0.5324878506,-0.5249116410,-1.7939229721,,, +1.3828125000,22,-1.4975706525,-0.4402684038,-0.4872678528,-2.0424755980,,, +1.3847656250,22,-1.3744779295,-0.2910466330,-0.2979730145,-2.0303242251,,, +1.3867187500,22,-1.2446422238,-0.0968326072,0.0251066627,-1.7384087508,,, +1.3886718750,22,-1.1102782771,0.1271548144,0.4427058439,-1.2222390601,,, +1.3906250000,22,-0.9736705310,0.3635555387,0.9002366516,-0.5968321736,,, +1.3925781250,22,-0.8371330889,0.5940852623,1.3362549928,-0.0053578478,,, +1.3945312500,22,-0.7029691648,0.8008170832,1.6919981338,0.4199155345,,, +1.3964843750,22,-0.5734307280,0.9674383098,1.9205081508,0.5936728299,,, +1.3984375000,22,-0.4506790511,1.0803948142,1.9939203691,0.5007227646,,, +1.4003906250,22,-0.3367468509,1.1298431094,1.9077816995,0.1999388121,,, +1.4023437500,22,-0.2335026869,1.1103437460,1.6817263655,-0.1921077979,,, +1.4042968750,22,-0.1426182388,1.0212476568,1.3564038565,-0.5333351962,,, +1.4062500000,22,-0.0655390377,0.8667484914,0.9871376509,-0.6953344902,,, +1.4082031250,22,-0.0034591626,0.6555972755,0.6353024370,-0.5988086740,,, +1.4101562500,22,0.0426996546,0.4004992735,0.3587628923,-0.2355519177,,, +1.4121093750,22,0.0723041499,0.1172350982,0.2028632272,0.3290568075,,, +1.4140625000,22,0.0850205908,-0.1764326637,0.1933708969,0.9737313617,,, +1.4160156250,22,0.0808205900,-0.4619910815,0.3324734877,1.5542845456,,, +1.4179687500,22,0.0599815666,-0.7214608981,0.5984522198,1.9429187795,,, +1.4199218750,22,0.0230818471,-0.9386434126,0.9490828322,2.0630349561,,, +1.4218750000,22,-0.0290095076,-1.1002432968,1.3282340397,1.9100213158,,, +1.4238281250,22,-0.0951479725,-1.1967890626,1.6746356902,1.5523265372,,, +1.4257812500,22,-0.1739336566,-1.2232870106,1.9314507922,1.1125246154,,, +1.4277343750,22,-0.2637358784,-1.1795630741,2.0551603574,0.7335626087,,, +1.4296875000,22,-0.3627217885,-1.0702687338,2.0223770174,0.5394431118,,, +1.4316406250,22,-0.4688885366,-0.9045506094,1.8335259624,0.6011184175,,, +1.4335937500,22,-0.5800984213,-0.6954067799,1.5128196679,0.9169447859,,, +1.4355468750,22,-0.6941164066,-0.4587747342,1.1045301191,1.4130545599,,, +1.4375000000,23,-0.8086493471,-0.2124145663,0.6661389185,1.9635447878,,, +1.4394531250,23,-0.9213862372,0.0253346941,0.2594319352,2.4249497025,,, +1.4414062500,23,-1.0300387776,0.2368388783,-0.0590747099,2.6755494222,,, +1.4433593750,23,-1.1323815491,0.4064030658,-0.2468863843,2.6487415696,,, +1.4453125000,23,-1.2262910912,0.5213704739,-0.2820965579,2.3513294706,,, +1.4472656250,23,-1.3097831999,0.5730092095,-0.1667457854,1.8617143029,,, +1.4492187500,23,-1.3810477926,0.5571250357,0.0735498348,1.3084860844,,, +1.4511718750,23,-1.4384807283,0.4743574160,0.3936425677,0.8352802841,,, +1.4531250000,23,-1.4807120278,0.3301381800,0.7359391633,0.5615308290,,, +1.4550781250,23,-1.5066299973,0.1343156865,1.0394252021,0.5498747734,,, +1.4570312500,23,-1.5154008349,-0.0995293146,1.2492217852,0.7891407073,,, +1.4589843750,23,-1.5064833760,-0.3550284227,1.3251857777,1.1975817851,,, +1.4609375000,23,-1.4796387184,-0.6141650551,1.2482137908,1.6454656719,,, +1.4628906250,23,-1.4349345602,-0.8585291885,1.0232677470,1.9908284223,,, +1.4648437500,23,-1.3727441731,-1.0705998831,0.6786505135,2.1185913570,,, +1.4667968750,23,-1.2937400291,-1.2349661569,0.2616441652,1.9723182103,,, +1.4687500000,23,-1.1988821934,-1.3394010772,-0.1688100058,1.5699068231,,, +1.4707031250,23,-1.0894016848,-1.3757141731,-0.5512498488,0.9989126594,,, +1.4726562500,23,-0.9667790959,-1.3403227267,-0.8312259575,0.3927836879,,, +1.4746093750,23,-0.8327188480,-1.2345021066,-0.9697458223,-0.1054822244,,, +1.4765625000,23,-0.6891195296,-1.0642976860,-0.9493135052,-0.3822991487,,, +1.4785156250,23,-0.5380408392,-0.8401044868,-0.7766243111,-0.3843980289,,, +1.4804687500,23,-0.3816677109,-0.5759438595,-0.4814949069,-0.1332066978,,, +1.4824218750,23,-0.2222722508,-0.2884876359,-0.1121956767,0.2812341179,,, +1.4843750000,23,-0.0621741496,0.0041022005,0.2720875484,0.7251494037,,, +1.4863281250,23,0.0962997337,0.2834374180,0.6104881540,1.0578827330,,, +1.4882812500,23,0.2508559108,0.5321828822,0.8499513595,1.1706213960,,, +1.4902343750,23,0.3992742158,0.7352621393,0.9535061982,1.0163787666,,, +1.4921875000,23,0.5394464697,0.8809051719,0.9060284047,0.6230151687,,, +1.4941406250,23,0.6694131815,0.9614652747,0.7165965835,0.0857272962,,, +1.4960937500,23,0.7873976429,0.9739480932,0.4170746667,-0.4589365329,,, +1.4980468750,23,0.8918368196,0.9202159436,0.0571414645,-0.8704146121,,, +1.5000000000,24,0.9814084992,0.8068531766,-0.3034584827,-1.0425910551,,, +1.5019531250,24,1.0550542191,0.6447019828,-0.6042357218,-0.9328360400,,, +1.5039062500,24,1.1119975750,0.4481010226,-0.7933965339,-0.5736684009,,, +1.5058593750,24,1.1517575871,0.2338799828,-0.8359328803,-0.0638443703,,, +1.5078125000,24,1.1741568928,0.0201801873,-0.7191014819,0.4586852616,,, +1.5097656250,24,1.1793246202,-0.1748164844,-0.4544384992,0.8545381862,,, +1.5117187500,24,1.1676938934,-0.3341617189,-0.0759958640,1.0210345498,,, +1.5136718750,24,1.1399940135,-0.4433290707,0.3649262091,0.9202511379,,, +1.5156250000,24,1.0972374518,-0.4912335635,0.8077302793,0.5893078056,,, +1.5175781250,24,1.0407018835,-0.4710114767,1.1919180886,0.1300679869,,, +1.5195312500,24,0.9719075762,-0.3805059257,1.4664690011,-0.3189227253,,, +1.5214843750,24,0.8925905298,-0.2224243574,1.5977399627,-0.6205677597,,, +1.5234375000,24,0.8046718379,-0.0041569641,1.5746567641,-0.6769683658,,, +1.5253906250,24,0.7102238070,0.2627313388,1.4103882944,-0.4564425514,,, +1.5273437500,24,0.6114334280,0.5632999619,1.1402432779,-0.0024072855,,, +1.5292968750,24,0.5105638384,0.8802670145,0.8161173572,0.5783122745,,, +1.5312500000,24,0.4099144509,1.1952068865,0.4983557018,1.1445444315,,, +1.5332031250,24,0.3117804465,1.4898275472,0.2462988652,1.5592406041,,, +1.5351562500,24,0.2184123419,1.7472385069,0.1089847139,1.7268117212,,, +1.5371093750,24,0.1319763385,1.9531210395,0.1174549416,1.6191007144,,, +1.5390625000,24,0.0545161477,2.0967190811,0.2798647620,1.2828749790,,, +1.5410156250,24,-0.0120830380,2.1715817225,0.5801577627,0.8267874945,,, +1.5429687500,24,-0.0661277984,2.1760055366,0.9805126069,0.3913822881,,, +1.5449218750,24,-0.1061463808,2.1131459128,1.4271807833,0.1103669150,,, +1.5468750000,24,-0.1309147125,1.9907896528,1.8588064232,0.0737680120,,, +1.5488281250,24,-0.1394780759,1.8208047001,2.2159326036,0.3030698024,,, +1.5507812500,24,-0.1311680668,1.6183053944,2.4502137454,0.7451511579,,, +1.5527343750,24,-0.1056145375,1.4005914746,2.5318994836,1.2866845867,,, +1.5546875000,24,-0.0627523168,1.1859348344,2.4544246030,1.7850523771,,, +1.5566406250,24,-0.0028225882,0.9922986490,2.2353903667,2.1073081244,,, +1.5585937500,24,0.0736310971,0.8360782084,1.9137846104,2.1665067036,,, +1.5605468750,24,0.1657721039,0.7309512769,1.5438737942,1.9454468072,,, +1.5625000000,25,0.2724851298,0.6869181620,1.1867185475,1.5013198216,,, +1.5644531250,25,0.3923955035,0.7095984465,0.9006343794,0.9499916197,,, +1.5664062500,25,0.5238930265,0.7998334366,0.7320835075,0.4342256556,,, +1.5683593750,25,0.6651599411,0.9536220638,0.7084165880,0.0845567503,,, +1.5703125000,25,0.8142025350,1.1623947214,0.8335949820,-0.0164610272,,, +1.5722656250,25,0.9688858290,1.4136059523,1.0875599374,0.1431660781,,, +1.5742187500,25,1.1269707411,1.6916046697,1.4293470197,0.5016525506,,, +1.5761718750,25,1.2861530755,1.9787212381,1.8034607637,0.9404569384,,, +1.5781250000,25,1.4441036551,2.2564956184,2.1485166978,1.3168811607,,, +1.5800781250,25,1.5985088940,2.5069609443,2.4068047200,1.5033103689,,, +1.5820312500,25,1.7471110995,2.7138930310,2.5332842755,1.4223377835,,, +1.5839843750,25,1.8877477994,2.8639386912,2.5026102646,1.0681465584,,, +1.5859375000,25,2.0183894046,2.9475441850,2.3130953162,0.5082870981,,, +1.5878906250,25,2.1371745480,2.9596190662,1.9869912128,-0.1346388774,,, +1.5898437500,25,2.2424424820,2.8998891375,1.5670455506,-0.7163694038,,, +1.5917968750,25,2.3327619661,2.7729139083,1.1098698439,-1.1102988372,,, +1.5937500000,25,2.4069561396,2.5877673403,0.6771519036,-1.2419463750,,, +1.5957031250,25,2.4641229440,2.3574041474,0.3260810615,-1.1091317801,,, +1.5976562500,25,2.5036507375,2.0977558417,0.1004774012,-0.7823308482,,, +1.5996093750,25,2.5252288278,1.8266195628,0.0240064843,-0.3851153420,,, +1.6015625000,25,2.5288527400,1.5624171768,0.0965362187,-0.0600403910,,, +1.6035156250,25,2.5148241263,1.3229111765,0.2942030938,0.0706692243,,, +1.6054687500,25,2.4837453199,1.1239669259,0.5731772424,-0.0611429708,,, +1.6074218750,25,2.4365086282,0.9784475608,0.8765396608,-0.4506516390,,, +1.6093750000,25,2.3742805529,0.8953186036,1.1432001753,-1.0211462797,,, +1.6113281250,25,2.2984812136,0.8790247274,1.3174668731,-1.6448394780,,, +1.6132812500,25,2.2107593353,0.9291821267,1.3577762390,-2.1776857542,,, +1.6152343750,25,2.1129632374,1.0406079384,1.2432239556,-2.4986700187,,, +1.6171875000,25,2.0071083324,1.2036846594,0.9768788762,-2.5427995283,,, +1.6191406250,25,1.8953417042,1.4050341392,0.5853637134,-2.3187587813,,, +1.6210937500,25,1.7799043854,1.6284541419,0.1147674604,-1.9063900609,,, +1.6230468750,25,1.6630919942,1.8560521595,-0.3764740858,-1.4346913568,,, +1.6250000000,26,1.5472144212,2.0694974039,-0.8266210987,-1.0463628150,,, +1.6269531250,26,1.4345552709,2.2513036612,-1.1801876272,-0.8586193237,,, +1.6289062500,26,1.3273317687,2.3860535426,-1.3965262272,-0.9310099903,,, +1.6308593750,26,1.2276558353,2.4614787481,-1.4561025052,-1.2490646794,,, +1.6328125000,26,1.1374970110,2.4693210022,-1.3634825600,-1.7282498578,,, +1.6347656250,26,1.0586478771,2.4059136139,-1.1465682886,-2.2371496105,,, +1.6367187500,26,0.9926925822,2.2724430937,-0.8521999235,-2.6335184431,,, +1.6386718750,26,0.9409790232,2.0748725711,-0.5388109869,-2.8033245055,,, +1.6406250000,26,0.9045951687,1.8235323387,-0.2672799340,-2.6920820881,,, +1.6425781250,26,0.8843499388,1.5324060627,-0.0914036220,-2.3198853194,,, +1.6445312500,26,0.8807589772,1.2181624181,-0.0494766298,-1.7760218153,,, +1.6464843750,26,0.8940355635,0.8989996613,-0.1582881971,-1.1946413725,,, +1.6484375000,26,0.9240868258,0.5933836969,-0.4104719780,-0.7181468688,,, +1.6503906250,26,0.9705153198,0.3187676202,-0.7756215696,-0.4583393496,,, +1.6523437500,26,1.0326259461,0.0903820099,-1.2049982191,-0.4659646451,,, +1.6542968750,26,1.1094380853,-0.0798196876,-1.6390975926,-0.7170061241,,, +1.6562500000,26,1.1997027388,-0.1839871598,-2.0168971580,-1.1194784628,,, +1.6582031250,26,1.3019243734,-0.2189130296,-2.2853439475,-1.5388584979,,, +1.6601562500,26,1.4143870900,-0.1862488349,-2.4076050069,-1.8351812874,,, +1.6621093750,26,1.5351846550,-0.0923821404,-2.3687955346,-1.9016323615,,, +1.6640625000,26,1.6622538712,0.0520166313,-2.1782925571,-1.6940570431,,, +1.6660156250,26,1.7934107029,0.2327460297,-1.8682737854,-1.2432970536,,, +1.6679687500,26,1.9263885218,0.4330716254,-1.4887092262,-0.6469711496,,, +1.6699218750,26,2.0588778059,0.6349006603,-1.0995855998,-0.0429503230,,, +1.6718750000,26,2.1885665942,0.8200513727,-0.7615746042,0.4282048889,,, +1.6738281250,26,2.3131809903,0.9715284641,-0.5265984193,0.6615522253,,, +1.6757812500,26,2.4305250053,1.0747157497,-0.4297618347,0.6163236040,,, +1.6777343750,26,2.5385190420,1.1184028076,-0.4839075026,0.3269046614,,, +1.6796875000,26,2.6352363467,1.0955740191,-0.6776422336,-0.1067694666,,, +1.6816406250,26,2.7189367908,1.0039049621,-0.9771416022,-0.5467682625,,, +1.6835937500,26,2.7880973892,0.8459315247,-1.3314516197,-0.8551165960,,, +1.6855468750,26,2.8414390235,0.6288799338,-1.6804615257,-0.9317396444,,, +1.6875000000,27,2.8779488994,0.3641695321,-1.9643056971,-0.7420012388,,, +1.6894531250,27,2.8968983472,0.0666229659,-2.1327300628,-0.3262872190,,, +1.6914062500,27,2.8978556523,-0.2465611586,-2.1529639285,0.2109935050,,, +1.6933593750,27,2.8806936910,-0.5570015212,-2.0148708931,0.7299763019,,, +1.6953125000,27,2.8455922399,-0.8464100419,-1.7325763225,1.0936475193,,, +1.6972656250,27,2.7930349147,-1.0978615800,-1.3423176334,1.2053920061,,, +1.6992187500,27,2.7238007958,-1.2969688491,-0.8968519450,1.0354907883,,, +1.7011718750,27,2.6389508847,-1.4328806305,-0.4572918596,0.6293064537,,, +1.7031250000,27,2.5398096293,-1.4990336855,-0.0836407106,0.0949124460,,, +1.7050781250,27,2.4279418414,-1.4936059460,0.1744988265,-0.4264439277,,, +1.7070312500,27,2.3051254107,-1.4196393886,0.2855958647,-0.7989503983,,, +1.7089843750,27,2.1733202922,-1.2848240343,0.2410476527,-0.9293300219,,, +1.7109375000,27,2.0346343113,-1.1009581431,0.0564650256,-0.7922659696,,, +1.7128906250,27,1.8912863840,-0.8831222544,-0.2308129654,-0.4371840092,,, +1.7148437500,27,1.7455677968,-0.6486246762,-0.5675878504,0.0254646815,,, +1.7167968750,27,1.5998022241,-0.4157919638,-0.8931395862,0.4546592466,,, +1.7187500000,27,1.4563051832,-0.2026887361,-1.1487345134,0.7176546469,,, +1.7207031250,27,1.3173436365,-0.0258561064,-1.2868222408,0.7265686468,,, +1.7226562500,27,1.1850964482,0.1008432961,-1.2784887380,0.4626809197,,, +1.7246093750,27,1.0616163884,0.1671931716,-1.1180045282,-0.0182174348,,, +1.7265625000,27,0.9487943486,0.1673367679,-0.8237593404,-0.6008922073,,, +1.7285156250,27,0.8483263970,0.1001857359,-0.4354374209,-1.1420245931,,, +1.7304687500,27,0.7616842476,-0.0305038886,-0.0078732538,-1.5092676299,,, +1.7324218750,27,0.6900896635,-0.2163938748,0.3974554981,-1.6172985067,,, +1.7343750000,27,0.6344932390,-0.4451458738,0.7219729921,-1.4509880084,,, +1.7363281250,27,0.5955579349,-0.7012827905,0.9191016207,-1.0693391205,,, +1.7382812500,27,0.5736476533,-0.9672693808,0.9614931712,-0.5891173520,,, +1.7402343750,27,0.5688210526,-1.2247367170,0.8452685633,-0.1526611376,,, +1.7421875000,27,0.5808307104,-1.4557651313,0.5906059079,0.1113036515,,, +1.7441406250,27,0.6091276500,-1.6441361676,0.2385853785,0.1231038160,,, +1.7460937500,27,0.6528711494,-1.7764662336,-0.1552176102,-0.1259010860,,, +1.7480468750,27,0.7109436626,-1.8431428919,-0.5293929792,-0.5708241825,,, +1.7500000000,28,0.7819705904,-1.8389984936,-0.8262613606,-1.0909272040,,, +1.7519531250,28,0.8643445559,-1.7636741695,-1.0008544139,-1.5426235232,,, +1.7539062500,28,0.9562537576,-1.6216487889,-1.0279113697,-1.7987640785,,, +1.7558593750,28,1.0557139058,-1.4219308558,-0.9058020908,-1.7834398005,,, +1.7578125000,28,1.1606031806,-1.1774348182,-0.6567656758,-1.4927627539,,, +1.7597656250,28,1.2686996015,-0.9040852694,-0.3234275199,-0.9959308151,,, +1.7617187500,28,1.3777201523,-0.6197114989,0.0378625788,-0.4162841915,,, +1.7636718750,28,1.4853609772,-0.3428094650,0.3658335227,0.1024544850,,, +1.7656250000,28,1.5893379440,-0.0912575086,0.6038659590,0.4355042258,,, +1.7675781250,28,1.6874268631,0.1189246477,0.7088440565,0.5111368873,,, +1.7695312500,28,1.7775026599,0.2746870905,0.6579071278,0.3302273659,,, +1.7714843750,28,1.8575768119,0.3668536244,0.4520493072,-0.0341144241,,, +1.7734375000,28,1.9258323976,0.3907553799,0.1160064092,-0.4567278299,,, +1.7753906250,28,1.9806561408,0.3465499537,-0.3055526320,-0.7948688232,,, +1.7773437500,28,2.0206668915,0.2392038406,-0.7549367703,-0.9275125416,,, +1.7792968750,28,2.0447400425,0.0781394002,-1.1703701238,-0.7887177800,,, +1.7812500000,28,2.0520274556,-0.1234290101,-1.4955637468,-0.3859075051,,, +1.7832031250,28,2.0419725467,-0.3494234230,-1.6884313102,0.2019465839,,, +1.7851562500,28,2.0143202679,-0.5820304157,-1.7275914490,0.8457398354,,, +1.7871093750,28,1.9691218088,-0.8029503439,-1.6156442845,1.4013833692,,, +1.7890625000,28,1.9067339371,-0.9946805248,-1.3787120683,1.7490546274,,, +1.7910156250,28,1.8278129888,-1.1417428723,-1.0623157853,1.8257944968,,, +1.7929687500,28,1.7333036119,-1.2317703599,-0.7242302476,1.6425192769,,, +1.7949218750,28,1.6244224635,-1.2563765317,-0.4254308256,1.2807872008,,, +1.7968750000,28,1.5026371429,-1.2117474109,-0.2205422031,0.8702078730,,, +1.7988281250,28,1.3696407306,-1.0989145127,-0.1492770999,0.5526881493,,, +1.8007812500,28,1.2273223789,-0.9236899070,-0.2301987107,0.4433156726,,, +1.8027343750,28,1.0777344684,-0.6962678419,-0.4577786705,0.5986027199,,, +1.8046875000,28,0.9230569069,-0.4305206916,-0.8032090572,1.0007956907,,, +1.8066406250,28,0.7655591926,-0.1430383086,-1.2188422203,1.5625523470,,, +1.8085937500,28,0.6075609094,0.1480222479,-1.6455671620,2.1507066035,,, +1.8105468750,28,0.4513913433,0.4241964108,-2.0219738046,2.6226092023,,, +1.8125000000,29,0.2993489279,0.6679934029,-2.2938779901,2.8650857800,,, +1.8144531250,29,0.1536612285,0.8641098020,-2.4227238610,2.8253363220,,, +1.8164062500,29,0.0164461664,1.0004907596,-2.3915551095,2.5253084423,,, +1.8183593750,29,-0.1103248393,1.0691648882,-2.2076252274,2.0556060720,,, +1.8203125000,29,-0.2248611659,1.0667946094,-1.9012403677,1.5506036698,,, +1.8222656250,29,-0.3255841176,0.9949035997,-1.5210151994,1.1515868744,,, +1.8242187500,29,-0.4111543471,0.8597654868,-1.1262808165,0.9680219018,,, +1.8261718750,29,-0.4804950883,0.6719615687,-0.7778273240,1.0475686384,,, +1.8281250000,29,-0.5328107935,0.4456384107,-0.5284230870,1.3630557893,,, +1.8300781250,29,-0.5676008485,0.1975170994,-0.4145873958,1.8199874419,,, +1.8320312500,29,-0.5846681265,-0.0542767453,-0.4508980521,2.2825231579,,, +1.8339843750,29,-0.5841222299,-0.2914806067,-0.6277205339,2.6108104670,,, +1.8359375000,29,-0.5663773644,-0.4969719481,-0.9127124465,2.6994370947,,, +1.8378906250,29,-0.5321448822,-0.6559652825,-1.2558689255,2.5064631838,,, +1.8398437500,29,-0.4824206251,-0.7570459520,-1.5973231139,2.0650753434,,, +1.8417968750,29,-0.4184672892,-0.7929685206,-1.8766866989,1.4746670297,,, +1.8437500000,29,-0.3417921204,-0.7611641008,-2.0424755980,0.8737882447,,, +1.8457031250,29,-0.2541203305,-0.6639212301,-2.0601526052,0.4023764810,,, +1.8476562500,29,-0.1573647012,-0.5082276810,-1.9175341999,0.1636184156,,, +1.8496093750,29,-0.0535919060,-0.3052842313,-1.6267192511,0.1958929566,,, +1.8515625000,29,0.0550138580,-0.0697242975,-1.2222390601,0.4624831701,,, +1.8535156250,29,0.1661892931,0.1814061517,-0.7557167182,0.8618746386,,, +1.8554687500,29,0.2776318046,0.4298372713,-0.2878674270,1.2558156334,,, +1.8574218750,29,0.3870399896,0.6573497132,0.1209144255,1.5074464844,,, +1.8593750000,29,0.4921540994,0.8470458326,0.4199155345,1.5190458612,,, +1.8613281250,29,0.5907957702,0.9845290790,0.5759536119,1.2590466923,,, +1.8632812500,29,0.6809063236,1.0589093289,0.5784945563,0.7709153534,,, +1.8652343750,29,0.7605829668,1.0635640508,0.4412400853,0.1614585501,,, +1.8671875000,29,0.8281122603,0.9966022213,0.1999388121,-0.4282393553,,, +1.8691406250,29,0.8820002640,0.8609986368,-0.0932380267,-0.8612852549,,, +1.8710937500,29,0.9209988366,0.6643892507,-0.3778799011,-1.0423110454,,, +1.8730468750,29,0.9441276260,0.4185418001,-0.5948044957,-0.9434418076,,, +1.8750000000,30,0.9506913659,0.1385386313,-0.6953344902,-0.6117828212,,, +1.8769531250,30,0.9402921761,-0.1582712991,-0.6489384129,-0.1563747993,,, +1.8789062500,30,0.9128366509,-0.4534781773,-0.4480451690,0.2818062990,,, +1.8808593750,30,0.8685376110,-0.7288907647,-0.1092820630,0.5685817257,,, +1.8828125000,30,0.8079104886,-0.9678003039,0.3290568075,0.6134184567,,, +1.8847656250,30,0.7317644090,-1.1561407696,0.8129177654,0.3942940715,,, +1.8867187500,30,0.6411881241,-1.2834645690,1.2808505782,-0.0362371278,,, +1.8886718750,30,0.5375310451,-1.3436656648,1.6735249899,-0.5654395089,,, +1.8906250000,30,0.4223797054,-1.3353997060,1.9429187795,-1.0513076674,,, +1.8925781250,30,0.2975300671,-1.2621718839,2.0597465218,-1.3615220120,,, +1.8945312500,30,0.1649561541,-1.1320863999,2.0179722341,-1.4097714084,,, +1.8964843750,30,0.0267755628,-0.9572750277,1.8357032814,-1.1794873203,,, +1.8984375000,30,-0.1147875465,-0.7530446355,1.5523265372,-0.7284838207,,, +1.9003906250,30,-0.2574413300,-0.5368031255,1.2223330737,-0.1732307898,,, +1.9023437500,30,-0.3988663308,-0.3268387070,0.9067934162,0.3429306368,,, +1.9042968750,30,-0.5367560383,-0.1410376407,0.6638113204,0.6889205201,,, +1.9062500000,30,-0.6688572272,0.0043701116,0.5394431118,0.7816769419,,, +1.9082031250,30,-0.7930093674,0.0959498473,0.5604970980,0.6087389703,,, +1.9101562500,30,-0.9071824177,0.1240062532,0.7303347120,0.2314682207,,, +1.9121093750,30,-1.0095123397,0.0832668514,1.0283274909,-0.2319720408,,, +1.9140625000,30,-1.0983337104,-0.0267429150,1.4130545599,-0.6392133671,,, +1.9160156250,30,-1.1722088627,-0.2016591286,1.8287426661,-0.8629184133,,, +1.9179687500,30,-1.2299530435,-0.4325762221,2.2139457433,-0.8259014467,,, +1.9199218750,30,-1.2706551489,-0.7066605005,2.5111121470,-0.5225054723,,, +1.9218750000,30,-1.2936936732,-1.0080375931,2.6755494222,-0.0203749932,,, +1.9238281250,30,-1.2987475930,-1.3188919697,2.6823902782,0.5578635982,,, +1.9257812500,30,-1.2858019948,-1.6207018643,2.5304747509,1.0679952687,,, +1.9277343750,30,-1.2551483488,-1.8955235092,2.2425438276,1.3835332195,,, +1.9296875000,30,-1.2073794232,-2.1272351417,1.8617143029,1.4301858318,,, +1.9316406250,30,-1.1433789282,-2.3026540524,1.4447838272,1.2060292579,,, +1.9335937500,30,-1.0643060715,-2.4124487963,1.0534088068,0.7818587900,,, +1.9355468750,30,-0.9715752948,-2.4517829713,0.7445291103,0.2816244250,,, +1.9375000000,31,-0.8668315473,-2.4206456881,0.5615308290,-0.1516857685,,, +1.9394531250,31,-0.7519215278,-2.3238457017,0.5275233688,-0.3953626983,,, +1.9414062500,31,-0.6288613999,-2.1706696300,0.6417778137,-0.3807168145,,, +1.9433593750,31,-0.4998015454,-1.9742281071,0.8798811021,-0.1119938131,,, +1.9453125000,31,-0.3669889726,-1.7505354819,1.1975817851,0.3347196668,,, +1.9472656250,31,-0.2327280379,-1.5173872500,1.5377281368,0.8323011665,,, +1.9492187500,31,-0.0993401691,-1.2931135147,1.8392177288,1.2374068208,,, +1.9511718750,31,0.0308767061,-1.0952954133,2.0465642691,1.4297538001,,, +1.9531250000,31,0.1556883137,-0.9395340306,2.1185913570,1.3451047636,,, +1.9550781250,31,0.2729630684,-0.8383576583,2.0348987826,0.9929141861,,, +1.9570312500,31,0.3807093048,-0.8003436119,1.7990939331,0.4537999345,,, +1.9589843750,31,0.4771100539,-0.8295158546,1.4382847114,-0.1424674410,,, +1.9609375000,31,0.5605547556,-0.9250604435,0.9989126594,-0.6524259265,,, +1.9628906250,31,0.6296673527,-1.0813786509,0.5395750090,-0.9581158118,,, +1.9648437500,31,0.6833302729,-1.2884740645,0.1219533704,-0.9992652495,,, +1.9667968750,31,0.7207038808,-1.5326466803,-0.1987383272,-0.7896477647,,, +1.9687500000,31,0.7412410587,-1.7974455953,-0.3822991487,-0.4131300313,,, +1.9707031250,31,0.7446966603,-2.0648138712,-0.4097490292,-0.0004946693,,, +1.9726562500,31,0.7311316727,-2.3163457400,-0.2862325820,0.3066080529,,, +1.9746093750,31,0.7009120134,-2.5345684872,-0.0401668320,0.3946980304,,, +1.9765625000,31,0.6547019843,-2.7041596272,0.2812341179,0.2097916210,,, +1.9785156250,31,0.5934524957,-2.8130144964,0.6193601700,-0.2275711815,,, +1.9804687500,31,0.5183842685,-2.8530898204,0.9133790649,-0.8277192854,,, +1.9824218750,31,0.4309663076,-2.8209644303,1.1097538538,-1.4561869511,,, +1.9843750000,31,0.3328900240,-2.7180780314,1.1706213960,-1.9703264255,,, +1.9863281250,31,0.2260394583,-2.5506313712,1.0797266771,-2.2581645116,,, +1.9882812500,31,0.1124581283,-2.3291547692,0.8449884576,-2.2688558134,,, +1.9902343750,31,-0.0056869203,-2.0677750938,0.4972964618,-2.0263884689,,, +1.9921875000,31,-0.1261432294,-1.7832323003,0.0857272962,-1.6227881216,,, +1.9941406250,31,-0.2466125433,-1.4937141057,-0.3300758992,-1.1926847292,,, +1.9960937500,31,-0.3647912283,-1.2175900590,-0.6891732749,-0.8762146079,,, +1.9980468750,31,-0.4784107904,-0.9721332780,-0.9388038503,-0.7804269669,,, +2.0000000000,32,-0.5852777802,-0.7723189861,-1.0425910551,-0.9497739372,,, +2.0019531250,32,-0.6833123874,-0.6297836222,-0.9862002395,-1.3537734520,,, +2.0039062500,32,-0.7705850481,-0.5520171022,-0.7795670042,-1.8952276161,,, +2.0058593750,32,-0.8453504240,-0.5418445505,-0.4553492977,-2.4367453960,,, +2.0078125000,32,-0.9060781590,-0.5972336322,-0.0638443703,-2.8383016215,,, +2.0097656250,32,-0.9514798736,-0.7114409121,0.3348377244,-2.9955393781,,, +2.0117187500,32,-0.9805319248,-0.8734870257,0.6801251085,-2.8683189380,,, +2.0136718750,32,-0.9924935336,-1.0689275130,0.9204031366,-2.4916893040,,, +2.0156250000,32,-0.9869199601,-1.2808655550,1.0210345498,-1.9662756714,,, +2.0175781250,32,-0.9636704991,-1.4911359756,0.9697316497,-1.4307173843,,, +2.0195312500,32,-0.9229111526,-1.6815779352,0.7784438704,-1.0237101725,,, +2.0214843750,32,-0.8651119342,-1.8353075510,0.4814668947,-0.8460554067,,, +2.0234375000,32,-0.7910388521,-1.9379016889,0.1300679869,-0.9331169779,,, +2.0253906250,32,-0.7017407108,-1.9784103616,-0.2155351449,-1.2452337936,,, +2.0273437500,32,-0.5985309620,-1.9501271208,-0.4955924294,-1.6787145939,,, +2.0292968750,32,-0.4829649241,-1.8510637068,-0.6601693321,-2.0944006121,,, +2.0312500000,32,-0.3568127661,-1.6840958410,-0.6769683658,-2.3559666125,,, +2.0332031250,32,-0.2220287324,-1.4567699787,-0.5364057339,-2.3674616787,,, +2.0351562500,32,-0.0807171438,-1.1807844816,-0.2531521463,-2.0997993424,,, +2.0371093750,32,0.0649042274,-0.8711813741,0.1361024405,-1.5989351607,,, +2.0390625000,32,0.2125427690,-0.5453050262,0.5783122745,-0.9734886565,,, +2.0410156250,32,0.3598709495,-0.2216003623,1.0122856098,-0.3652001180,,, +2.0429687500,32,0.5045668507,0.0816656178,1.3781624220,0.0896828760,,, +2.0449218750,32,0.6443546012,0.3476698696,1.6266841177,0.2975085154,,, +2.0468750000,32,0.7770440032,0.5621986200,1.7268117212,0.2326467119,,, +2.0488281250,32,0.9005686600,0.7146307245,1.6705062566,-0.0557283745,,, +2.0507812500,32,1.0130219352,0.7986705102,1.4739270452,-0.4573559481,,, +2.0527343750,32,1.1126901150,0.8127790190,1.1748615686,-0.8313445855,,, +2.0546875000,32,1.1980821927,0.7602735955,0.8267874945,-1.0450174409,,, +2.0566406250,32,1.2679557546,0.6490888928,0.4904920196,-1.0104982755,,, +2.0585937500,32,1.3213385130,0.4912159791,0.2245541382,-0.7090091872,,, +2.0605468750,32,1.3575451110,0.3018586735,0.0761725414,-0.1962188639,,, +2.0625000000,33,1.3761889031,0.0983659614,0.0737680120,0.4128262271,,, +2.0644531250,33,1.3771885073,-0.1009850511,0.2225127816,0.9750594652,,, +2.0664062500,33,1.3607690127,-0.2782707568,0.5034834156,1.3584478567,,, +2.0683593750,33,1.3274578226,-0.4171778551,0.8765693957,1.4780398641,,, +2.0703125000,33,1.2780752052,-0.5041476917,1.2866845867,1.3191288553,,, +2.0722656250,33,1.2137197178,-0.5293283162,1.6723143172,0.9411847818,,, +2.0742187500,33,1.1357487602,-0.4872678528,1.9750670028,0.4614773630,,, +2.0761718750,33,1.0457545977,-0.3773008211,2.1487427648,0.0228798021,,, +2.0781250000,33,0.9455362731,-0.2036004516,2.1665067036,-0.2453224994,,, +2.0800781250,33,0.8370679004,0.0251066627,2.0250496847,-0.2628768475,,, +2.0820312500,33,0.7224638954,0.2961436944,1.7450886810,-0.0205473777,,, +2.0839843750,33,0.6039417519,0.5937624426,1.3681288326,0.4173866035,,, +2.0859375000,33,0.4837830153,0.9002366516,0.9499916197,0.9308023856,,, +2.0878906250,33,0.3642931373,1.1970935578,0.5521172204,1.3767318295,,, +2.0898437500,33,0.2477609152,1.4663977946,0.2319957861,1.6286410045,,, +2.0917968750,33,0.1364182244,1.6919981338,0.0342180211,1.6112251340,,, +2.0937500000,33,0.0324007523,1.8606501325,-0.0164610272,1.3211814381,,, +2.0957031250,33,-0.0622895820,1.9629364072,0.0810353506,0.8282653288,,, +2.0976562500,33,-0.1458198619,1.9939203691,0.3039548345,0.2563389990,,, +2.0996093750,33,-0.2165584449,1.9534878385,0.6092807710,-0.2503952134,,, +2.1015625000,33,-0.2731037068,1.8463527226,0.9404569384,-0.5667240212,,, +2.1035156250,33,-0.3143087549,1.6817263655,1.2362248499,-0.6205378624,,, +2.1054687500,33,-0.3393016768,1.4726736302,1.4401970026,-0.4123832074,,, +2.1074218750,33,-0.3475009708,1.2352006190,1.5096748356,-0.0150958368,,, +2.1093750000,33,-0.3386258878,0.9871376509,1.4223377835,0.4463823054,,, +2.1113281250,33,-0.3127015026,0.7468953886,1.1797613824,0.8294689585,,, +2.1132812500,33,-0.2700584268,0.5321808579,0.8072162608,1.0132418846,,, +2.1152343750,33,-0.2113271667,0.3587628923,0.3497791080,0.9318005117,,, +2.1171875000,33,-0.1374272276,0.2393730925,-0.1346388774,0.5925433293,,, +2.1191406250,33,-0.0495511512,0.1828189388,-0.5842604442,0.0743496681,,, +2.1210937500,33,0.0508562300,0.1933708969,-0.9430110230,-0.4938378384,,, +2.1230468750,33,0.1621229617,0.2704662548,-1.1691976224,-0.9681621471,,, +2.1250000000,34,0.2823791178,0.4087503374,-1.2419463750,-1.2291006398,,, +2.1269531250,34,0.4095894216,0.5984522198,-1.1643963348,-1.2140586996,,, +2.1289062500,34,0.5415887667,0.8260687334,-0.9631523591,-0.9343767041,,, +2.1308593750,34,0.6761200160,1.0753090606,-0.6840825823,-0.4720907790,,, +2.1328125000,34,0.8108734173,1.3282340397,-0.3851153420,0.0426636172,,, +2.1347656250,34,0.9435269448,1.5665107261,-0.1271577650,0.4674111590,,, +2.1367187500,34,1.0717868604,1.7726947142,0.0354492115,0.6864576391,,, +2.1386718750,34,1.1934277848,1.9314507922,0.0634524137,0.6426498387,,, +2.1406250000,34,1.3063315768,2.0306267967,-0.0611429708,0.3530693071,,, +2.1425781250,34,1.4085243398,2.0621057748,-0.3322151558,-0.0956414852,,, +2.1445312500,34,1.4982109078,2.0223770174,-0.7204253437,-0.5710398001,,, +2.1464843750,34,1.5738062075,1.9127861309,-1.1777352911,-0.9312179391,,, +2.1484375000,34,1.6339629459,1.7394466972,-1.6448394780,-1.0637545110,,, +2.1503906250,34,1.6775951412,1.5128196679,-2.0603545313,-0.9166058065,,, +2.1523437500,34,1.7038970820,1.2469898099,-2.3703348388,-0.5124701989,,, +2.1542968750,34,1.7123573856,0.9586896427,-2.5366324725,0.0573121547,,, +2.1562500000,34,1.7027679072,0.6661389185,-2.5427995283,0.6576534641,,, +2.1582031250,34,1.6752273454,0.3877805540,-2.3966137589,1.1465848071,,, +2.1601562500,34,1.6301394800,0.1410011478,-2.1288342960,1.4139923816,,, +2.1621093750,34,1.5682060740,-0.0590747099,-1.7883814291,1.4116086196,,, +2.1640625000,34,1.4904145626,-0.2006322769,-1.4346913568,1.1660401902,,, +2.1660156250,34,1.3980207461,-0.2759835928,-1.1284368265,0.7712641232,,, +2.1679687500,34,1.2925267899,-0.2820965579,-0.9220590738,0.3626505583,,, +2.1699218750,34,1.1756549148,-0.2207992789,-0.8515858506,0.0796337146,,, +2.1718750000,34,1.0493172412,-0.0986454486,-0.9310099903,0.0272639229,,, +2.1738281250,34,0.9155823130,0.0735498348,-1.1501041241,0.2471802818,,, +2.1757812500,34,0.7766388884,0.2814714245,-1.4760119392,0.7059616213,,, +2.1777343750,34,0.6347576310,0.5083095470,-1.8583681373,1.3040505907,,, +2.1796875000,34,0.4922513727,0.7359391633,-2.2371496105,1.9028072080,,, +2.1816406250,34,0.3514346442,0.9461910085,-2.5520349368,2.3622794344,,, +2.1835937500,34,0.2145831799,1.1221256620,-2.7518143398,2.5793410739,,, +2.1855468750,34,0.0838941097,1.2492217852,-2.8023843843,2.5157465583,,, +2.1875000000,35,-0.0385524690,1.3163956500,-2.6920820881,2.2084155704,,, +2.1894531250,35,-0.1508298636,1.3167808478,-2.4335275151,1.7591306201,,, +2.1914062500,35,-0.2511984675,1.2482137908,-2.0616877150,1.3064728615,,, +2.1933593750,35,-0.3381361594,1.1133911327,-1.6284634055,0.9876892639,,, +2.1953125000,35,-0.4103648892,0.9196881186,-1.1946413725,0.9009436148,,, +2.1972656250,35,-0.4668729855,0.6786505135,-0.8204658550,1.0782984702,,, +2.1992187500,35,-0.5069327923,0.4051955240,-0.5562972622,1.4768339620,,, +2.2011718750,35,-0.5301133279,0.1165774236,-0.4348129581,1.9903384170,,, +2.2031250000,35,-0.5362877439,-0.1688100058,-0.4659646451,2.4783674333,,, +2.2050781250,35,-0.5256354529,-0.4327107169,-0.6354775170,2.8047076854,,, +2.2070312500,35,-0.4986388895,-0.6582742734,-0.9071246870,2.8747039723,,, +2.2089843750,35,-0.4560749586,-0.8312259575,-1.2284223713,2.6612193624,,, +2.2109375000,35,-0.3990013246,-0.9408575268,-1.5388584979,2.2121134121,,, +2.2128906250,35,-0.3287377772,-0.9807695408,-1.7793728117,1.6371885658,,, +2.2148437500,35,-0.2468430041,-0.9493135052,-1.9016116114,1.0781817965,,, +2.2167968750,35,-0.1550871748,-0.8497030101,-1.8755153570,0.6700251376,,, +2.2187500000,35,-0.0554208172,-0.6897861214,-1.6940570431,0.5039915002,,, +2.2207031250,35,0.0500594696,-0.4814949069,-1.3743930214,0.6028252823,,, +2.2226562500,35,0.1591478641,-0.2400104896,-0.9552467333,0.9146724357,,, +2.2246093750,35,0.2695680883,0.0172981403,-0.4909325599,1.3274721220,,, +2.2265625000,35,0.3790134127,0.2720875484,-0.0429503230,1.6998640384,,, +2.2285156250,35,0.4851871981,0.5063208944,0.3295406440,1.9001389050,,, +2.2304687500,35,0.5858432655,0.7035272470,0.5788844127,1.8425551043,,, +2.2324218750,35,0.6788253866,0.8499513595,0.6763014572,1.5110662145,,, +2.2343750000,35,0.7621052039,0.9355137218,0.6163236040,0.9639543981,,, +2.2363281250,35,0.8338179153,0.9545139419,0.4176004106,0.3180976692,,, +2.2382812500,35,0.8922950993,0.9060284047,0.1199516084,-0.2828192366,,, +2.2402343750,35,0.9360941058,0.7939744784,-0.2218750758,-0.7074401145,,, +2.2421875000,35,0.9640234965,0.6268367912,-0.5467682625,-0.8724950455,,, +2.2441406250,35,0.9751640918,0.4170746667,-0.7968052979,-0.7653826883,,, +2.2460937500,35,0.9688852529,0.1802520417,-0.9263046620,-0.4473901087,,, +2.2480468750,35,0.9448561154,-0.0660494576,-0.9089682933,-0.0366697621,,, +2.2500000000,36,0.9030515780,-0.3034584827,-0.7420012388,0.3243588722,,, +2.2519531250,36,0.8437529397,-0.5140973385,-0.4465668558,0.5082468603,,, +2.2539062500,36,0.7675431756,-0.6818312697,-0.0645065678,0.4376369469,,, +2.2558593750,36,0.6752969339,-0.7933965339,0.3481649860,0.1066409274,,, +2.2578125000,36,0.5681654275,-0.8393285912,0.7299763019,-0.4173871715,,, +2.2597656250,36,0.4475564874,-0.8146256778,1.0235692786,-1.0121694579,,, +2.2617187500,36,0.3151101245,-0.7191014819,1.1846327983,-1.5338947865,,, +2.2636718750,36,0.1726700285,-0.5574023186,1.1888081609,-1.8565312848,,, +2.2656250000,36,0.0222515038,-0.3386875992,1.0354907883,-1.9062872569,,, +2.2675781250,36,-0.1339935981,-0.0759958640,0.7479360135,-1.6817764157,,, +2.2695312500,36,-0.2938143342,0.2146594220,0.3696524114,-1.2543612078,,, +2.2714843750,36,-0.4548998590,0.5154012710,-0.0423556636,-0.7485803789,,, +2.2734375000,36,-0.6149196599,0.8077302793,-0.4264439277,-0.3080250331,,, +2.2753906250,36,-0.7715641353,1.0738089097,-0.7259031900,-0.0560153611,,, +2.2773437500,36,-0.9225848049,1.2976994013,-0.8977623330,-0.0618549880,,, +2.2792968750,36,-1.0658334479,1.4664690011,-0.9194483039,-0.3219110300,,, +2.2812500000,36,-1.1992994843,1.5710854567,-0.7922659696,-0.7607044707,,, +2.2832031250,36,-1.3211449443,1.6070403421,-0.5411560265,-1.2517110494,,, +2.2851562500,36,-1.4297364149,1.5746567641,-0.2107688833,-1.6521706148,,, +2.2871093750,36,-1.5236734027,1.4790600063,0.1415337438,-1.8423634249,,, +2.2890625000,36,-1.6018126178,1.3298131764,0.4546592466,-1.7585874635,,, +2.2910156250,36,-1.6632877530,1.1402432779,0.6733475551,-1.4107970591,,, +2.2929687500,36,-1.7075244129,0.9265047182,0.7568277674,-0.8800668416,,, +2.2949218750,36,-1.7342499297,0.7064455761,0.6852193947,-0.2965742279,,, +2.2968750000,36,-1.7434978973,0.4983557018,0.4626809197,0.1958671810,,, +2.2988281250,36,-1.7356073403,0.3196839674,0.1168149801,0.4790049953,,, +2.3007812500,36,-1.7112165365,0.1858141336,-0.3055774623,0.4923354867,,, +2.3027343750,36,-1.6712515984,0.1089847139,-0.7457329448,0.2494616123,,, +2.3046875000,36,-1.6169100155,0.0974281735,-1.1420245931,-0.1658594803,,, +2.3066406250,36,-1.5496394442,0.1547895080,-1.4395075352,-0.6228940561,,, +2.3085937500,36,-1.4711121186,0.2798647620,-1.5984241813,-0.9799800896,,, +2.3105468750,36,-1.3831953288,0.4666777393,-1.6003449113,-1.1235644084,,, +2.3125000000,37,-1.2879184845,0.7048895722,-1.4509880084,-0.9995277474,,, +2.3144531250,37,-1.1874373412,0.9805126069,-1.1792798928,-0.6282105035,,, +2.3164062500,37,-1.0839960140,1.2768788391,-0.8328022975,-0.0990192298,,, +2.3183593750,37,-0.9798874463,1.5757953839,-0.4703357698,0.4539096736,,, +2.3203125000,37,-0.8774130242,1.8588064232,-0.1526611376,0.8883208288,,, +2.3222656250,37,-0.7788420439,2.1084736448,0.0669481049,1.0926928355,,, +2.3242187500,37,-0.6863717437,2.3095859006,0.1510614057,1.0166861893,,, +2.3261718750,37,-0.6020885979,2.4502137454,0.0839562335,0.6848424371,,, +2.3281250000,37,-0.5279315528,2.5225353348,-0.1259010860,0.1897809985,,, +2.3300781250,37,-0.4656578473,2.5233761032,-0.4471453574,-0.3332410374,,, +2.3320312500,37,-0.4168120175,2.4544246030,-0.8303725664,-0.7434331761,,, +2.3339843750,37,-0.3826986275,2.3221094662,-1.2158131594,-0.9330703130,,, +2.3359375000,37,-0.3643592040,2.1371460816,-1.5426235232,-0.8570071306,,, +2.3378906250,37,-0.3625537799,1.9137846104,-1.7583485738,-0.5450191374,,, +2.3398437500,37,-0.3777473688,1.6688117907,-1.8270816924,-0.0935882942,,, +2.3417968750,37,-0.4101016075,1.4203761485,-1.7350511212,0.3606149953,,, +2.3437500000,37,-0.4594717137,1.1867185475,-1.4927627539,0.6782850799,,, +2.3457031250,37,-0.5254088122,0.9848966090,-1.1333655937,0.7557763798,,, +2.3476562500,37,-0.6071675882,0.8295919626,-0.7074944708,0.5536441918,,, +2.3496093750,37,-0.7037191343,0.7320835075,-0.2753932753,0.1076075800,,, +2.3515625000,37,-0.8137687668,0.6994582925,0.1024544850,-0.4810716308,,, +2.3535156250,37,-0.9357784986,0.7341150455,0.3747285219,-1.0731584702,,, +2.3554687500,37,-1.0679937759,0.8335949820,0.5072435382,-1.5294087178,,, +2.3574218750,37,-1.2084740104,0.9907516933,0.4882483867,-1.7485241180,,, +2.3593750000,37,-1.3551263727,1.1942482732,0.3302273659,-1.6946984350,,, +2.3613281250,37,-1.5057422552,1.4293470197,0.0679232294,-1.4072067990,,, +2.3632812500,37,-1.6580357655,1.6789366463,-0.2471100075,-0.9894122598,,, +2.3652343750,37,-1.8096835780,1.9247253723,-0.5545758612,-0.5802046399,,, +2.3671875000,37,-1.9583654441,2.1485166978,-0.7948688232,-0.3157015938,,, +2.3691406250,37,-2.1018046531,2.3334788969,-0.9184029416,-0.2917106258,,, +2.3710937500,37,-2.2378077346,2.4653197038,-0.8933823408,-0.5372422578,,, +2.3730468750,37,-2.3643027083,2.5332842755,-0.7108031485,-1.0063357220,,, +2.3750000000,38,-2.4793752101,2.5309068373,-0.3859075051,-1.5904395907,,, +2.3769531250,38,-2.5813018634,2.4564635937,0.0441370698,-2.1479562012,,, +2.3789062500,38,-2.6685803107,2.3130953162,0.5259717714,-2.5428545639,,, +2.3808593750,38,-2.7399553797,2.1085910571,0.9983012219,-2.6817709421,,, +2.3828125000,38,-2.7944409259,1.8548480639,1.4013833692,-2.5394306555,,, +2.3847656250,38,-2.8313369695,1.5670455506,1.6862767565,-2.1654253249,,, +2.3867187500,38,-2.8502418262,1.2625899337,1.8224051435,-1.6704895403,,, +2.3886718750,38,-2.8510590201,0.9599050784,1.8022615411,-1.1960393636,,, +2.3906250000,38,-2.8339988575,0.6771519036,1.6425192769,-0.8753223314,,, +2.3925781250,38,-2.7995746332,0.4309666256,1.3813773296,-0.7968274726,,, +2.3945312500,38,-2.7485935381,0.2353056138,1.0725537012,-0.9799842624,,, +2.3964843750,38,-2.6821424243,0.1004774012,0.7768626781,-1.3698112043,,, +2.3984375000,38,-2.6015686801,0.0324293386,0.5526881493,-1.8519810022,,, +2.4003906250,38,-2.5084565470,0.0323386249,0.4468370877,-2.2841735041,,, +2.4023437500,38,-2.4045992957,0.0965362187,0.4871980791,-2.5351234000,,, +2.4042968750,38,-2.2919677470,0.2167689249,0.6783486309,-2.5206605491,,, +2.4062500000,38,-2.1726756896,0.3807813663,1.0007956907,-2.2268648350,,, +2.4082031250,38,-2.0489427996,0.5731772424,1.4139679027,-1.7139887716,,, +2.4101562500,38,-1.9230557115,0.7764998036,1.8624937647,-1.1000718687,,, +2.4121093750,38,-1.7973279230,0.9724561804,2.2847880348,-0.5287364638,,, +2.4140625000,38,-1.6740592340,1.1432001753,2.6226092023,-0.1299899339,,, +2.4160156250,38,-1.5554954321,1.2725840494,2.8300995701,0.0152252174,,, +2.4179687500,38,-1.4437889283,1.3472919950,2.8809000661,-0.1029807663,,, +2.4199218750,38,-1.3409610350,1.3577762390,2.7722317536,-0.4209435481,,, +2.4218750000,38,-1.2488665435,1.2989304814,2.5253084423,-0.8191135751,,, +2.4238281250,38,-1.1691612245,1.1704536914,2.1820162369,-1.1550507228,,, +2.4257812500,38,-1.1032728179,0.9768788762,1.7983772782,-1.3026998292,,, +2.4277343750,38,-1.0523760220,0.7272647974,1.4358157970,-1.1871807747,,, +2.4296875000,38,-1.0173719192,0.4345721175,1.1515868744,-0.8055560461,,, +2.4316406250,38,-0.9988721975,0.1147674604,0.9898587006,-0.2278818444,,, +2.4335937500,38,-0.9971884460,-0.2142821538,0.9748373122,0.4217475192,,, +2.4355468750,38,-1.0123267107,-0.5340474216,1.1070046434,0.9989689433,,, +2.4375000000,39,-1.0439874057,-0.8266210987,1.3630557893,1.3784805497,,, +2.4394531250,39,-1.0915705819,-1.0759590257,1.6995451858,1.4881552932,,, +2.4414062500,39,-1.1541864606,-1.2689913149,2.0596737104,1.3285906621,,, +2.4433593750,39,-1.2306710485,-1.3965262272,2.3821594679,0.9727384009,,, +2.4453125000,39,-1.3196065582,-1.4538837276,2.6108104670,0.5457175484,,, +2.4472656250,39,-1.4193462804,-1.4412145527,2.7033080465,0.1903451196,,, +2.4492187500,39,-1.5280434680,-1.3634825600,2.6378328240,0.0278329827,,, +2.4511718750,39,-1.6436837302,-1.2301116029,2.4165009630,0.1244241318,,, +2.4531250000,39,-1.7641203663,-1.0543215730,2.0650753434,0.4731135773,,, +2.4550781250,39,-1.8871120228,-0.8521999235,1.6289964134,0.9954646592,,, +2.4570312500,39,-2.0103620125,-0.6415734346,1.1663507125,1.5630238465,,, +2.4589843750,39,-2.1315586082,-0.4407589097,0.7388720175,2.0324655359,,, +2.4609375000,39,-2.2484156057,-0.2672799340,0.4023764810,2.2848351796,,, +2.4628906250,39,-2.3587124443,-0.1366391933,0.1981212792,2.2581356393,,, +2.4648437500,39,-2.4603331840,-0.0612319753,0.1464324377,1.9643258748,,, +2.4667968750,39,-2.5513036554,-0.0494766298,0.2435940561,1.4860729821,,, +2.4687500000,39,-2.6298261328,-0.1052226362,0.4624831701,0.9541473858,,, +2.4707031250,39,-2.6943109232,-0.2274775640,0.7568510784,0.5116559200,,, +2.4726562500,39,-2.7434043164,-0.4104719780,1.0685840064,0.2749146720,,, +2.4746093750,39,-2.7760124099,-0.6440577706,1.3368119245,0.3016842145,,, +2.4765625000,39,-2.7913203880,-0.9144121527,1.5074464844,0.5754718584,,, +2.4785156250,39,-2.7888069199,-1.2049982191,1.5416621952,1.0102019029,,, +2.4804687500,39,-2.7682534229,-1.4977151132,1.4219995647,1.4739724379,,, +2.4824218750,39,-2.7297480299,-1.7741575910,1.1551393237,1.8253860646,,, +2.4843750000,39,-2.6736841908,-2.0168971580,0.7709153534,1.9524956297,,, +2.4863281250,39,-2.6007539318,-2.2106954447,0.3177197883,1.8036892625,,, +2.4882812500,39,-2.5119358920,-2.3435652127,-0.1449842908,1.4020480995,,, +2.4902343750,39,-2.4084783447,-2.4076050069,-0.5558766399,0.8392396431,,, +2.4921875000,39,-2.2918775031,-2.3995492530,-0.8612852549,0.2506183117,,, +2.4941406250,39,-2.1638514874,-2.3209954416,-1.0235031109,-0.2216447614,,, +2.4960937500,39,-2.0263104112,-2.1782925571,-1.0266210745,-0.4672998169,,, +2.4980468750,39,-1.8813231100,-1.9820985320,-0.8789686844,-0.4380096524,,, +2.5000000000,40,-1.7310810939,-1.7466375845,-0.6117828212,-0.1603763522,,, +2.5019531250,40,-1.5778603572,-1.4887092262,-0.2743117947,0.2715645758,,, +2.5039062500,40,-1.4239817108,-1.2265180427,0.0738824352,0.7223234865,,, +2.5058593750,40,-1.2717703349,-0.9784058458,0.3722248029,1.0522872035,,, +2.5078125000,40,-1.1235152577,-0.7615746042,0.5685817257,1.1561678807,,, +2.5097656250,40,-0.9814294711,-0.5908892020,0.6273970407,0.9920306864,,, +2.5117187500,40,-0.8476113804,-0.4778435060,0.5352420019,0.5929430700,,, +2.5136718750,40,-0.7240082645,-0.4297618347,0.3029148458,0.0580514151,,, +2.5156250000,40,-0.6123823843,-0.4492915060,-0.0362371278,-0.4744706216,,, +2.5175781250,40,-0.5142803343,-0.5342218403,-0.4315116217,-0.8651891910,,, +2.5195312500,40,-0.4310061733,-0.6776422336,-0.8227525437,-1.0115429027,,, +2.5214843750,40,-0.3635988040,-0.8684282659,-1.1497276573,-0.8758908121,,, +2.5234375000,40,-0.3128139989,-1.0920219385,-1.3615220120,-0.4957892223,,, +2.5253906250,40,-0.2791113852,-1.3314516197,-1.4244840023,0.0263188808,,, +2.5273437500,40,-0.2626466188,-1.5685205631,-1.3274863235,0.5511757620,,, +2.5292968750,40,-0.2632688812,-1.7850811085,-1.0836822888,0.9408485953,,, +2.5312500000,40,-0.2805237468,-1.9643056971,-0.7284838207,1.0964841466,,, +2.5332031250,40,-0.3136613666,-2.0918660563,-0.3140759058,0.9853314954,,, +2.5351562500,40,-0.3616498276,-2.1569383129,0.0986782532,0.6496273213,,, +2.5371093750,40,-0.4231934522,-2.1529639285,0.4496807566,0.1949094008,,, +2.5390625000,40,-0.4967557180,-2.0781133827,0.6889205201,-0.2390377418,,, +2.5410156250,40,-0.5805863960,-1.9354202521,0.7842211215,-0.5166409019,,, +2.5429687500,40,-0.6727524320,-1.7325763225,0.7262084407,-0.5438584112,,, +2.5449218750,40,-0.7711720305,-1.4814020033,0.5297245992,-0.2941326282,,, +2.5468750000,40,-0.8736513443,-1.1970289602,0.2314682207,0.1841397579,,, +2.5488281250,40,-0.9779231262,-0.8968519450,-0.1157711824,0.7806687837,,, +2.5507812500,40,-1.0816866677,-0.5993228998,-0.4513864023,1.3532858804,,, +2.5527343750,40,-1.1826483232,-0.3226714093,-0.7164444384,1.7666880223,,, +2.5546875000,40,-1.2785619119,-0.0836407106,-0.8629184133,1.9292948033,,, +2.5566406250,40,-1.3672682883,0.1036726143,-0.8612212941,1.8181191368,,, +2.5585937500,40,-1.4467333890,0.2287943676,-0.7048677155,1.4848374116,,, +2.5605468750,40,-1.5150840896,0.2855958647,-0.4115375079,1.0413976154,,, +2.5625000000,41,-1.5706412435,0.2727140524,-0.0203749932,0.6291119609,,, +2.5644531250,41,-1.6119493233,0.1936393388,0.4140555934,0.3797069255,,, +2.5664062500,41,-1.6378021474,0.0564650256,0.8302173639,0.3790078014,,, +2.5683593750,41,-1.6472642389,-0.1266841655,1.1691352939,0.6432127477,,, +2.5703125000,41,-1.6396874449,-0.3405046063,1.3835332195,1.1142608480,,, +2.5722656250,41,-1.6147225230,-0.5675878504,1.4451504419,1.6755654806,,, +2.5742187500,41,-1.5723254942,-0.7896413789,1.3490985987,2.1838026720,,, +2.5761718750,41,-1.5127586482,-0.9887708637,1.1145804398,2.5080437773,,, +2.5781250000,41,-1.4365861863,-1.1487345134,0.7818587900,2.5655088240,,, +2.5800781250,41,-1.3446645751,-1.2560820195,0.4059480191,2.3441428707,,, +2.5820312500,41,-1.2381277823,-1.3010986638,0.0480108120,1.9058289687,,, +2.5839843750,41,-1.1183676517,-1.2784887380,-0.2341995706,1.3693580623,,, +2.5859375000,41,-0.9870097606,-1.1877506038,-0.3953626983,0.8778239820,,, +2.5878906250,41,-0.8458851833,-1.0332172264,-0.4096744425,0.5593801014,,, +2.5898437500,41,-0.6969986541,-0.8237593404,-0.2748870856,0.4921133950,,, +2.5917968750,41,-0.5424936878,-0.5721719375,-0.0126766798,0.6826629660,,, +2.5937500000,41,-0.3846152674,-0.2942868426,0.3347196668,1.0644429647,,, +2.5957031250,41,-0.2256707534,-0.0078732538,0.7110728944,1.5159566289,,, +2.5976562500,41,-0.0679896980,0.2685970994,1.0549143783,1.8941816051,,, +2.5996093750,41,0.0861167315,0.5172340766,1.3091084058,2.0738759200,,, +2.6015625000,41,0.2343960106,0.7219729921,1.4297538001,1.9820311065,,, +2.6035156250,41,0.3746934907,0.8696914941,1.3930282153,1.6180288239,,, +2.6054687500,41,0.5049899218,0.9511215819,1.1989090444,1.0539753777,,, +2.6074218750,41,0.6234366076,0.9614931712,0.8711913462,0.4151210244,,, +2.6093750000,41,0.7283875767,0.9008643345,0.4537999345,-0.1542710409,,, +2.6113281250,41,0.8184282080,0.7741151959,0.0039699577,-0.5302534478,,, +2.6132812500,41,0.8923998081,0.5906059079,-0.4166419769,-0.6429441709,,, +2.6152343750,41,0.9494197110,0.3635225671,-0.7515317662,-0.4954490203,,, +2.6171875000,41,0.9888965485,0.1089566826,-0.9581158118,-0.1627730443,,, +2.6191406250,41,1.0105404229,-0.1552176102,-1.0143275536,0.2289787069,,, +2.6210937500,41,1.0143678055,-0.4105902913,-0.9220152723,0.5374084680,,, +2.6230468750,41,1.0007010740,-0.6394992141,-0.7066121269,0.6430992889,,, +2.6250000000,42,0.9701626979,-0.8262613606,-0.4131300313,0.4825889334,,, +2.6269531250,42,0.9236641729,-0.9582657328,-0.0991015685,0.0660048222,,, +2.6289062500,42,0.8623898987,-1.0268516736,0.1744304869,-0.5254753270,,, +2.6308593750,42,0.7877762830,-1.0279113697,0.3524723607,-1.1616432838,,, +2.6328125000,42,0.7014864365,-0.9621745275,0.3946980304,-1.6987275692,,, +2.6347656250,42,0.6053809032,-0.8351553727,0.2817848528,-2.0185896121,,, +2.6367187500,42,0.5014849383,-0.6567656758,0.0184789843,-2.0609081291,,, +2.6386718750,42,0.3919529058,-0.4406207941,-0.3670871456,-1.8395326521,,, +2.6406250000,42,0.2790304211,-0.2030871275,-0.8277192854,-1.4385257492,,, +2.6425781250,42,0.1650148997,0.0378625788,-1.3044544754,-0.9889800559,,, +2.6445312500,42,0.0522152040,0.2639062549,-1.7356871728,-0.6329651075,,, +2.6464843750,42,-0.0570889051,0.4576541851,-2.0667072425,-0.4844861297,,, +2.6484375000,42,-0.1606868029,0.6038659590,-2.2581645116,-0.5981556845,,, +2.6503906250,42,-0.2564758197,0.6905178242,-2.2921417784,-0.9541650131,,, +2.6523437500,42,-0.3424981637,0.7096459991,-2.1748906594,-1.4636744607,,, +2.6542968750,42,-0.4169753027,0.6579071278,-1.9358044305,-1.9931459017,,, +2.6562500000,42,-0.4783392019,0.5368167826,-1.6227881216,-2.4009484456,,, +2.6582031250,42,-0.5252598698,0.3526493704,-1.2947472599,-2.5762047560,,, +2.6601562500,42,-0.5566687319,0.1160064092,-1.0123654365,-2.4692310238,,, +2.6621093750,42,-0.5717774206,-0.1589167337,-0.8286073800,-2.1052273590,,, +2.6640625000,42,-0.5700916540,-0.4553145219,-0.7804269669,-1.5774657255,,, +2.6660156250,42,-0.5514199599,-0.7549367703,-0.8829719050,-1.0218414590,,, +2.6679687500,42,-0.5158770920,-1.0393547422,-1.1271879458,-0.5797619085,,, +2.6699218750,42,-0.4638820785,-1.2912395532,-1.4811959682,-0.3595420142,,, +2.6718750000,42,-0.3961509376,-1.4955637468,-1.8952276161,-0.4068856788,,, +2.6738281250,42,-0.3136841876,-1.6406422713,-2.3093508909,-0.6925414975,,, +2.6757812500,42,-0.2177493690,-1.7189402808,-2.6627825318,-1.1205143079,,, +2.6777343750,42,-0.1098588865,-1.7275914490,-2.9033368457,-1.5545801674,,, +2.6796875000,42,0.0082564431,-1.6685906676,-2.9955393781,-1.8558358511,,, +2.6816406250,42,0.1346776721,-1.5486477075,-2.9261417526,-1.9209896501,,, +2.6835937500,42,0.2673313031,-1.3787120683,-2.7061787687,-1.7108970199,,, +2.6855468750,42,0.4040255826,-1.1732021620,-2.3692473867,-1.2615181818,,, +2.6875000000,43,0.5424888696,-0.9489926046,-1.9662756714,-0.6742923707,,, +2.6894531250,43,0.6804094098,-0.7242302476,-1.5575964489,-0.0885647019,,, +2.6914062500,43,0.8154758170,-0.5170615323,-1.2035602172,0.3563795177,,, +2.6933593750,43,0.9454175539,-0.3443599266,-0.9551493498,0.5592698809,,, +2.6953125000,43,1.0680447035,-0.2205422031,-0.8460554067,0.4843950700,,, +2.6972656250,43,1.1812863336,-0.1565561190,-0.8874534631,0.1711890825,,, +2.6992187500,43,1.2832267845,-0.1591101072,-1.0662872700,-0.2767659280,,, +2.7011718750,43,1.3721392424,-0.2301987107,-1.3473322118,-0.7203044356,,, +2.7031250000,43,1.4465160121,-0.3669568692,-1.6787145939,-1.0229795631,,, +2.7050781250,43,1.5050949587,-0.5618532358,-2.0000274377,-1.0886034079,,, +2.7070312500,43,1.5468816542,-0.8032090572,-2.2517785191,-0.8877356563,,, +2.7089843750,43,1.5711668426,-1.0760064506,-2.3846988698,-0.4658595810,,, +2.7109375000,43,1.5775389170,-1.3629297270,-2.3674616787,0.0689963671,,, +2.7128906250,43,1.5658911899,-1.6455671620,-2.1916091047,0.5757996237,,, +2.7148437500,43,1.5364238298,-1.9056894224,-1.8729193834,0.9191215225,,, +2.7167968750,43,1.4896404302,-2.1265155149,-1.4490010391,1.0062313592,,, +2.7187500000,43,1.4263392704,-2.2938779901,-0.9734886565,0.8125103403,,, +2.7207031250,43,1.3475994224,-2.3972061601,-0.5077439762,0.3882202064,,, +2.7226562500,43,1.2547619447,-2.4302587800,-0.1113546364,-0.1552287593,,, +2.7246093750,43,1.1494064957,-2.3915551095,0.1670898551,-0.6757472329,,, +2.7265625000,43,1.0333237724,-2.2844743071,0.2975085154,-1.0394237055,,, +2.7285156250,43,0.9084842601,-2.1170162360,0.2729561576,-1.1571200141,,, +2.7304687500,43,0.7770038378,-1.9012403677,0.1106471076,-1.0087768136,,, +2.7324218750,43,0.6411068435,-1.6524219215,-0.1507837861,-0.6487687765,,, +2.7343750000,43,0.5030872444,-1.3879840897,-0.4573559481,-0.1908431692,,, +2.7363281250,43,0.3652685926,-1.1262808165,-0.7482072066,0.2232288025,,, +2.7382812500,43,0.2299634679,-0.8853150157,-0.9651286415,0.4626945055,,, +2.7402343750,43,0.0994331166,-0.6814816156,-1.0616847687,0.4438540950,,, +2.7421875000,43,-0.0241520066,-0.5284230870,-1.0104982755,0.1532086532,,, +2.7441406250,43,-0.1387501017,-0.4360772644,-0.8075644075,-0.3486239355,,, +2.7460937500,43,-0.2424836305,-0.4099838634,-0.4729227691,-0.9433006450,,, +2.7480468750,43,-0.3336720430,-0.4508980521,-0.0475816599,-1.4869621467,,, +2.7500000000,44,-0.4108610506,-0.5547380276,0.4128262271,-1.8494334914,,, +2.7519531250,44,-0.4728479330,-0.7128702501,0.8466688018,-1.9496750574,,, +2.7539062500,44,-0.5187024373,-0.9127124465,1.1958770747,-1.7777698771,,, +2.7558593750,44,-0.5477829015,-1.1386123304,1.4149559303,-1.3974234005,,, +2.7578125000,44,-0.5597473215,-1.3729407621,1.4780398641,-0.9282926691,,, +2.7597656250,44,-0.5545591681,-1.5973231139,1.3828948617,-0.5129899621,,, +2.7617187500,44,-0.5324878506,-1.7939229721,1.1512432342,-0.2778061624,,, +2.7636718750,44,-0.4941038212,-1.9466886520,0.8253609252,-0.2979202262,,, +2.7656250000,44,-0.4402684038,-2.0424755980,0.4614773630,-0.5766315153,,, +2.7675781250,44,-0.3721185281,-2.0719663948,0.1210059370,-1.0443083758,,, +2.7695312500,44,-0.2910466330,-2.0303242251,-0.1390289559,-1.5773425626,,, +2.7714843750,44,-0.1986760946,-1.9175341999,-0.2748772289,-2.0319159518,,, +2.7734375000,44,-0.0968326072,-1.7384087508,-0.2628768475,-2.2833262019,,, +2.7753906250,44,0.0124879811,-1.5022566977,-0.1031347321,-2.2600943022,,, +2.7773437500,44,0.1271548144,-1.2222390601,0.1804984590,-1.9635068841,,, +2.7792968750,44,0.2449395417,-0.9144565220,0.5441556856,-1.4672378640,,, +2.7812500000,44,0.3635555387,-0.5968321736,0.9308023856,-0.8971534422,,, +2.7832031250,44,0.4806981521,-0.2878674270,1.2791399956,-0.3968354210,,, +2.7851562500,44,0.5940852623,-0.0053578478,1.5331772473,-0.0882717777,,, +2.7871093750,44,0.7014974528,0.2348415605,1.6509783211,-0.0384877320,,, +2.7890625000,44,0.8008170832,0.4199155345,1.6112251340,-0.2412622291,,, +2.7910156250,44,0.8900655828,0.5409755534,1.4165714790,-0.6189401022,,, +2.7929687500,44,0.9674383098,0.5936728299,1.0932664022,-1.0438423599,,, +2.7949218750,44,1.0313363667,0.5784945563,0.6871052775,-1.3734056001,,, +2.7968750000,44,1.0803948142,0.5007227646,0.2563389990,-1.4894186375,,, +2.7988281250,44,1.1135067900,0.3700586849,-0.1373545050,-1.3306013384,,, +2.8007812500,44,1.1298431094,0.1999388121,-0.4384304499,-0.9095952132,,, +2.8027343750,44,1.1288670049,0.0065903913,-0.6060802671,-0.3097074419,,, +2.8046875000,44,1.1103437460,-0.1921077979,-0.6205378624,0.3377011311,,, +2.8066406250,44,1.0743449714,-0.3778799011,-0.4861070991,0.8889886983,,, +2.8085937500,44,1.0212476568,-0.5333351962,-0.2304392368,1.2273636852,,, +2.8105468750,44,0.9517277365,-0.6431886211,0.0998268470,1.2946518465,,, +2.8125000000,45,0.8667484914,-0.6953344902,0.4463823054,1.1069949952,,, +2.8144531250,45,0.7675439041,-0.6816985120,0.7483837917,0.7501809838,,, +2.8164062500,45,0.6555972755,-0.5988086740,0.9519835582,0.3558870302,,, +2.8183593750,45,0.5326154745,-0.4480451690,1.0187695351,0.0653495492,,, +2.8203125000,45,0.4004992735,-0.2355519177,0.9318005117,-0.0095803637,,, +2.8222656250,45,0.2613102878,0.0281841607,0.6982961283,0.1826798175,,, +2.8242187500,45,0.1172350982,0.3290568075,0.3485624168,0.6190882572,,, +2.8261718750,45,-0.0294528157,0.6503165675,-0.0686800263,1.2080868479,,, +2.8281250000,45,-0.1764326637,0.9737313617,-0.4938378384,1.8145009665,,, +2.8300781250,45,-0.3213767637,1.2808505782,-0.8656822393,2.2964083254,,, +2.8320312500,45,-0.4619910815,1.5542845456,-1.1308434069,2.5438738420,,, +2.8339843750,45,-0.5960551828,1.7789101847,-1.2520833132,2.5089358763,,, +2.8359375000,45,-0.7214608981,1.9429187795,-1.2140586996,2.2186267603,,, +2.8378906250,45,-0.8362490231,2.0386328179,-1.0256767819,1.7674601562,,, +2.8398437500,45,-0.9386434126,2.0630349561,-0.7186769593,1.2914451225,,, +2.8417968750,45,-1.0270818708,2.0179722341,-0.3426596046,0.9307495438,,, +2.8437500000,45,-1.1002432968,1.9100213158,0.0426636172,0.7912462530,,, +2.8457031250,45,-1.1570706115,1.7500241632,0.3767907140,0.9154811845,,, +2.8476562500,45,-1.1967890626,1.5523265372,0.6078697073,1.2710203983,,, +2.8496093750,45,-1.2189195891,1.3337724376,0.7007878694,1.7593695762,,, +2.8515625000,45,-1.2232870106,1.1125246154,0.6426498387,2.2430210881,,, +2.8535156250,45,-1.2100228977,0.9067934162,0.4447913093,2.5832153009,,, +2.8554687500,45,-1.1795630741,0.7335626087,0.1410146183,2.6780661478,,, +2.8574218750,45,-1.1326397944,0.6074010568,-0.2176789698,2.4906009556,,, +2.8593750000,45,-1.0702687338,0.5394431118,-0.5710398001,2.0590285388,,, +2.8613281250,45,-0.9937310182,0.5366088327,-0.8589648214,1.4864200977,,, +2.8632812500,45,-0.9045506094,0.6011184175,-1.0308736697,0.9126296284,,, +2.8652343750,45,-0.8044674418,0.7303347120,-1.0536053978,0.4761480209,,, +2.8671875000,45,-0.6954067799,0.9169447859,-0.9166058065,0.2763437629,,, +2.8691406250,45,-0.5794453352,1.1494679160,-0.6335973125,0.3464370935,,, +2.8710937500,45,-0.4587747342,1.4130545599,-0.2404711377,0.6446126335,,, +2.8730468750,45,-0.3356629775,1.6905206070,0.2102700278,1.0657042260,,, +2.8750000000,46,-0.2124145663,1.9635447878,0.6576534641,1.4702474315,,, +2.8769531250,46,-0.0913299931,2.2139457433,1.0416940750,1.7229351268,,, +2.8789062500,46,0.0253346941,2.4249497025,1.3126953713,1.7299345217,,, +2.8808593750,46,0.1354075438,2.5823603668,1.4389453204,1.4648359569,,, +2.8828125000,46,0.2368388783,2.6755494222,1.4116086196,0.9761195490,,, +2.8847656250,46,0.3277373237,2.6981986046,1.2460536335,0.3740911863,,, +2.8867187500,46,0.4064030658,2.6487415696,0.9794075707,-0.1991337287,,, +2.8886718750,46,0.4713577456,2.5304747509,0.6647209522,-0.6083742191,,, +2.8906250000,46,0.5213704739,2.3513294706,0.3626505583,-0.7622386937,,, +2.8925781250,46,0.5554795078,2.1233211909,0.1319565549,-0.6379918714,,, +2.8945312500,46,0.5730092095,1.8617143029,0.0202942054,-0.2876200450,,, +2.8964843750,46,0.5735819910,1.5839606917,0.0567346952,0.1765661074,,, +2.8984375000,46,0.5571250357,1.3084860844,0.2471802818,0.6128439700,,, +2.9003906250,46,0.5238716777,1.0534088068,0.5733881763,0.8890333316,,, +2.9023437500,46,0.4743574160,0.8352802841,0.9957554852,0.9188153953,,, +2.9042968750,46,0.4094106332,0.6679351052,1.4594317349,0.6854616829,,, +2.9062500000,46,0.3301381800,0.5615308290,1.9028072080,0.2464688260,,, +2.9082031250,46,0.2379060791,0.5218444791,2.2670552730,-0.2821714382,,, +2.9101562500,46,0.1343156865,0.5498747734,2.5052427173,-0.7577561659,,, +2.9121093750,46,0.0211757254,0.6417778137,2.5895893709,-1.0499979997,,, +2.9140625000,46,-0.0995293146,0.7891407073,2.5157465583,-1.0767711821,,, +2.9160156250,46,-0.2256738618,0.9795740277,2.3034282389,-0.8266794802,,, +2.9179687500,46,-0.3550284227,1.1975817851,1.9932967727,-0.3622602297,,, +2.9199218750,46,-0.4852985671,1.4256482275,1.6405885969,0.1970544334,,, +2.9218750000,46,-0.6141650551,1.6454656719,1.3064728615,0.7075503234,,, +2.9238281250,46,-0.7393244047,1.8392177288,1.0484891613,1.0404809286,,, +2.9257812500,46,-0.8585291885,1.9908284223,0.9115539196,1.1171982721,,, +2.9277343750,46,-0.9696273547,2.0870900847,0.9209363931,0.9305380853,,, +2.9296875000,46,-1.0705998831,2.1185913570,1.0782984702,0.5465998956,,, +2.9316406250,46,-1.1595961178,2.0803805672,1.3614152140,0.0864359181,,, +2.9335937500,46,-1.2349661569,1.9723182103,1.7276197869,-0.3073308489,,, +2.9355468750,46,-1.2952897327,1.7990939331,2.1204362820,-0.5098083827,,, +2.9375000000,47,-1.3394010772,1.5699068231,2.4783674333,-0.4482837744,,, +2.9394531250,47,-1.3664093356,1.2978312780,2.7444685204,-0.1223744493,,, +2.9414062500,47,-1.3757141731,0.9989126594,2.8752163119,0.3956425110,,, +2.9433593750,47,-1.3670162992,0.6910557759,2.8472916677,0.9804153528,,, +2.9453125000,47,-1.3403227267,0.3927836879,2.6612193624,1.4876514352,,, +2.9472656250,47,-1.2959466734,0.1219533704,2.3412981722,1.7934468947,,, +2.9492187500,47,-1.2345021066,-0.1054822244,1.9318320587,1.8280351947,,, +2.9511718750,47,-1.1568930282,-0.2765793938,1.4902493865,1.5947071165,,, +2.9531250000,47,-1.0642976860,-0.3822991487,1.0781817965,1.1687187342,,, +2.9550781250,47,-0.9581479891,-0.4181304868,0.7518921298,0.6764885057,,, +2.9570312500,47,-0.8401044868,-0.3843980289,0.5535421702,0.2607866634,,, +2.9589843750,47,-0.7120273494,-0.2862325820,0.5046601446,0.0414590423,,, +2.9609375000,47,-0.5759438595,-0.1332066978,0.6028252823,0.0824512154,,, +2.9628906250,47,-0.4340129824,0.0613393452,0.8220856423,0.3741719220,,, +2.9648437500,47,-0.2884876359,0.2812341179,1.1170439257,0.8360305596,,, +2.9667968750,47,-0.1416753206,0.5086088513,1.4299746678,1.3384542262,,, +2.9687500000,47,0.0041022005,0.7251494037,1.6998640384,1.7383508457,,, +2.9707031250,47,0.1465494666,0.9133790649,1.8719640077,1.9182995442,,, +2.9726562500,47,0.2834374180,1.0578827330,1.9063725124,1.8187277138,,, +2.9746093750,47,0.4126423275,1.1463870837,1.7843029490,1.4542561334,,, +2.9765625000,47,0.5321828822,1.1706213960,1.5110662145,0.9097323660,,, +2.9785156250,47,0.6402547661,1.1268989970,1.1153005457,0.3170392813,,, +2.9804687500,47,0.7352621393,1.0163787666,0.6445688262,-0.1809656941,,, +2.9824218750,47,0.8158454612,0.8449884576,0.1580088142,-0.4694981141,,, +2.9843750000,47,0.8809051719,0.6230151687,-0.2828192366,-0.4931799596,,, +2.9863281250,47,0.9296208159,0.3643915197,-0.6234623249,-0.2710725030,,, +2.9882812500,47,0.9614652747,0.0857272962,-0.8249978054,0.1087102238,,, +2.9902343750,47,0.9762138576,-0.1948459135,-0.8700381945,0.5133296633,,, +2.9921875000,47,0.9739480932,-0.4589365329,-0.7653826883,0.8018234696,,, +2.9941406250,47,0.9550541542,-0.6891732749,-0.5409026862,0.8639458857,,, +2.9960937500,47,0.9202159436,-0.8704146121,-0.2448351844,0.6506009594,,, +2.9980468750,47,0.8704029630,-0.9908031029,0.0637826156,0.1875258394,,, +3.0000000000,48,0.8068531766,-1.0425910551,0.3243588722,-0.4315280454,,, +3.0019531250,48,0.7310511691,-1.0226799540,0.4842325490,-1.0702491728,,, +3.0039062500,48,0.6447019828,-0.9328360400,0.5069210956,-1.5868813886,,, +3.0058593750,48,0.5497010892,-0.7795670042,0.3778455191,-1.8728305748,,, +3.0078125000,48,0.4481010226,-0.5736684009,0.1066409274,-1.8821837736,,, +3.0097656250,48,0.3420752608,-0.3294714050,-0.2743075299,-1.6440526296,,, +3.0117187500,48,0.2338799828,-0.0638443703,-0.7148754657,-1.2543603242,,, +3.0136718750,48,0.1258143762,0.2049821891,-1.1549765067,-0.8493250484,,, +3.0156250000,48,0.0201801873,0.4586852616,-1.5338947865,-0.5679094217,,, +3.0175781250,48,-0.0807587768,0.6801251085,-1.7997192189,-0.5135292829,,, +3.0195312500,48,-0.1748164844,0.8545381862,-1.9174102193,-0.7255181564,,, +3.0214843750,48,-0.2599231579,0.9705640371,-1.8742425226,-1.1681698419,,, +3.0234375000,48,-0.3341617189,1.0210345498,-1.6817764157,-1.7403637988,,, +3.0253906250,48,-0.3958015626,1.0034705548,-1.3740503972,-2.3031367235,,, +3.0273437500,48,-0.4433290707,0.9202511379,-1.0022767892,-2.7176450372,,, +3.0292968750,48,-0.4754743259,0.7784438704,-0.6268664900,-2.8831149918,,, +3.0312500000,48,-0.4912335635,0.5893078056,-0.3080250331,-2.7643803080,,, +3.0332031250,48,-0.4898869640,0.3675039080,-0.0963846276,-2.4014608118,,, +3.0351562500,48,-0.4710114767,0.1300679869,-0.0251312245,-1.8985573565,,, +3.0371093750,48,-0.4344884486,-0.1047822363,-0.1048527812,-1.3954794941,,, +3.0390625000,48,-0.3805059257,-0.3189227253,-0.3219110300,-1.0293368038,,, +3.0410156250,48,-0.3095555860,-0.4955924294,-0.6405902364,-0.8969930205,,, +3.0429687500,48,-0.2224243574,-0.6205677597,-1.0086881261,-1.0285728358,,, +3.0449218750,48,-0.1201808678,-0.6831603291,-1.3656780065,-1.3792818336,,, +3.0468750000,48,-0.0041569641,-0.6769683658,-1.6521706148,-1.8417807445,,, +3.0488281250,48,0.1240753766,-0.6003293868,-1.8192017665,-2.2757216861,,, +3.0507812500,48,0.2627313388,-0.4564425514,-1.8358989994,-2.5463502888,,, +3.0527343750,48,0.4098442862,-0.2531521463,-1.6943328710,-2.5615927438,,, +3.0546875000,48,0.5632999619,-0.0024072855,-1.4107970591,-2.2974618881,,, +3.0566406250,48,0.7208732731,0.2805645152,-1.0233176385,-1.8048176895,,, +3.0585937500,48,0.8802670145,0.5783122745,-0.5857792204,-1.1956275635,,, +3.0605468750,48,1.0391518551,0.8723714464,-0.1595825731,-0.6124903147,,, +3.0625000000,49,1.1952068865,1.1445444315,0.1958671810,-0.1897743319,,, +3.0644531250,49,1.3461600229,1.3781624220,0.4323605554,-0.0170188653,,, +3.0664062500,49,1.4898275472,1.5592406041,0.5203392187,-0.1146269054,,, +3.0683593750,49,1.6241521083,1.6774461796,0.4534460918,-0.4285093796,,, +3.0703125000,49,1.7472385069,1.7268117212,0.2494616123,-0.8451463680,,, +3.0722656250,49,1.8573866416,1.7061441328,-0.0525193694,-1.2229353452,,, +3.0742187500,49,1.9531210395,1.6191007144,-0.3982300624,-1.4312326791,,, +3.0761718750,49,2.0332164539,1.4739270452,-0.7267365635,-1.3863861664,,, +3.0781250000,49,2.0967190811,1.2828749790,-0.9799800896,-1.0748810998,,, +3.0800781250,49,2.1429630253,1.0613413539,-1.1118700808,-0.5572542328,,, +3.0820312500,49,2.1715817225,0.8267874945,-1.0955116081,0.0482989628,,, +3.0839843750,49,2.1825141250,0.5975148679,-0.9274411153,0.5981327809,,, +3.0859375000,49,2.1760055366,0.3913822881,-0.6282105035,0.9623497980,,, +3.0878906250,49,2.1526030853,0.2245541382,-0.2392283451,1.0602478147,,, +3.0898437500,49,2.1131459128,0.1103669150,0.1836500064,0.8823016538,,, +3.0917968750,49,2.0587502516,0.0583931523,0.5787852491,0.4926564716,,, +3.0937500000,49,1.9907896528,0.0737680120,0.8883208288,0.0114502696,,, +3.0957031250,49,1.9108707090,0.1568255164,1.0671636179,-0.4181886817,,, +3.0976562500,49,1.8208047001,0.3030698024,1.0899799578,-0.6694238459,,, +3.0996093750,49,1.7225756554,0.5034834156,0.9551175450,-0.6665053852,,, +3.1015625000,49,1.6183053944,0.7451511579,0.6848424371,-0.4055415931,,, +3.1035156250,49,1.5102161564,1.0121559989,0.3218543786,0.0444460665,,, +3.1054687500,49,1.4005914746,1.2866845867,-0.0773767053,0.5604732924,,, +3.1074218750,49,1.2917359793,1.5502652799,-0.4514150975,0.9993545539,,, +3.1093750000,49,1.1859348344,1.7850523771,-0.7434331761,1.2370223480,,, +3.1113281250,49,1.0854135177,1.9750670028,-0.9100635878,1.2026270973,,, +3.1132812500,49,0.9922986490,2.1073081244,-0.9281509201,0.8980709631,,, +3.1152343750,49,0.9085805525,2.1726562369,-0.7983512774,0.3976207901,,, +3.1171875000,49,0.8360782084,2.1665067036,-0.5450191374,-0.1722950538,,, +3.1191406250,49,0.7764072087,2.0890885965,-0.2123991623,-0.6675703402,,, +3.1210937500,49,0.7309512769,1.9454468072,0.1422838163,-0.9657358296,,, +3.1230468750,49,0.7008378518,1.7450886810,0.4577602750,-0.9993320349,,, +3.1250000000,50,0.6869181620,1.5013198216,0.6782850799,-0.7741952885,,, +3.1269531250,50,0.6897521412,1.2303153835,0.7623496033,-0.3676474077,,, +3.1289062500,50,0.7095984465,0.9499916197,0.6891797693,0.0929128502,,, +3.1308593750,50,0.7464097577,0.6787563743,0.4620077553,0.4651470110,,, +3.1328125000,50,0.7998334366,0.4342256556,0.1076075800,0.6310105967,,, +3.1347656250,50,0.8692175379,0.2319957861,-0.3278332870,0.5293283952,,, +3.1367187500,50,0.9536220638,0.0845567503,-0.7858634911,0.1727812351,,, +3.1386718750,50,1.0518352681,0.0004225163,-1.2048251799,-0.3553534278,,, +3.1406250000,50,1.1623947214,-0.0164610272,-1.5294087178,-0.9238158916,,, +3.1425781250,50,1.2836127717,0.0330107656,-1.7192167815,-1.3891376607,,, +3.1445312500,50,1.4136059523,0.1431660781,-1.7550041987,-1.6347714883,,, +3.1464843750,50,1.5503278228,0.3039548345,-1.6416219104,-1.6028554903,,, +3.1484375000,50,1.6916046697,0.5016525506,-1.4072067990,-1.3099074763,,, +3.1503906250,50,1.8351734388,0.7198207462,-1.0987438540,-0.8421497610,,, +3.1523437500,50,1.9787212381,0.9404569384,-0.7746921797,-0.3317472444,,, +3.1542968750,50,2.1199257173,1.1452540150,-0.4958236739,0.0795275057,,, +3.1562500000,50,2.2564956184,1.3168811607,-0.3157015938,0.2792427283,,, +3.1582031250,50,2.3862107873,1.4401970026,-0.2722823143,0.2151939418,,, +3.1601562500,50,2.5069609443,1.5033103689,-0.3819486397,-0.0902373988,,, +3.1621093750,50,2.6167825376,1.4984146815,-0.6369042981,-0.5461889011,,, +3.1640625000,50,2.7138930310,1.4223377835,-1.0063357220,-1.0182130516,,, +3.1660156250,50,2.7967220289,1.2767688522,-1.4411604376,-1.3651408069,,, +3.1679687500,50,2.8639386912,1.0681465584,-1.8816227439,-1.4778097017,,, +3.1699218750,50,2.9144749590,0.8072162608,-2.2665538733,-1.3090419982,,, +3.1718750000,50,2.9475441850,0.5082870981,-2.5428545639,-0.8866563009,,, +3.1738281250,50,2.9626548415,0.1882407715,-2.6737233200,-0.3059458730,,, +3.1757812500,50,2.9596190662,-0.1346388774,-2.6443489882,0.2963157384,,, +3.1777343750,50,2.9385558969,-0.4419338891,-2.4641812125,0.7792185411,,, +3.1796875000,50,2.8998891375,-0.7163694038,-2.1654253249,1.0361758029,,, +3.1816406250,50,2.8443398937,-0.9430110230,-1.7979962811,1.0239603649,,, +3.1835937500,50,2.7729139083,-1.1102988372,-1.4217177515,0.7743611282,,, +3.1855468750,50,2.6868839177,-1.2108460280,-1.0969815447,0.3852667060,,, +3.1875000000,51,2.5877673403,-1.2419463750,-0.8753223314,-0.0063782440,,, +3.1894531250,51,2.4772996850,-1.2057552908,-0.7913758098,-0.2623302351,,, +3.1914062500,51,2.3574041474,-1.1091317801,-0.8574729564,-0.2811675866,,, +3.1933593750,51,2.2301579250,-0.9631523591,-1.0617124005,-0.0263246804,,, +3.1953125000,51,2.0977558417,-0.7823308482,-1.3698112043,0.4636456384,,, +3.1972656250,51,1.9624719185,-0.5835984632,-1.7304458021,1.0853962965,,, +3.1992187500,51,1.8266195628,-0.3851153420,-2.0832512224,1.6988694728,,, +3.2011718750,51,1.6925110746,-0.2049964014,-2.3682326519,2.1654446531,,, +3.2031250000,51,1.5624171768,-0.0600403910,-2.5351234000,2.3856981628,,, +3.2050781250,51,1.4385272800,0.0354492115,-2.5512316522,2.3264275141,,, +3.2070312500,51,1.3229111765,0.0706692243,-2.4065537554,2.0295360340,,, +3.2089843750,51,1.2174828343,0.0390776030,-2.1153575147,1.6003447030,,, +3.2109375000,51,1.1239669259,-0.0611429708,-1.7139887716,1.1785364181,,, +3.2128906250,51,1.0438686765,-0.2269510998,-1.2552427623,0.8996977057,,, +3.2148437500,51,0.9784475608,-0.4506516390,-0.8001767874,0.8579997286,,, +3.2167968750,51,0.9286953086,-0.7204253437,-0.4086392369,1.0802480374,,, +3.2187500000,51,0.8953186036,-1.0211462797,-0.1299899339,1.5184145208,,, +3.2207031250,51,0.8787267794,-1.3354300099,0.0045430571,2.0626994189,,, +3.2226562500,51,0.8790247274,-1.6448394780,-0.0133200891,2.5715444028,,, +3.2246093750,51,0.8960111411,-1.9311645147,-0.1676711458,2.9103717541,,, +3.2265625000,51,0.9291821267,-2.1776857542,-0.4209435481,2.9884329157,,, +3.2285156250,51,0.9777401179,-2.3703348388,-0.7198173602,2.7836676421,,, +3.2304687500,51,1.0406079384,-2.4986700187,-1.0035794980,2.3487607096,,, +3.2324218750,51,1.1164477648,-2.5565991273,-1.2136367817,1.7967361175,,, +3.2343750000,51,1.2036846594,-2.5427995283,-1.3026998292,1.2700366680,,, +3.2363281250,51,1.3005342596,-2.4608057610,-1.2422070621,0.9015627662,,, +3.2382812500,51,1.4050341392,-2.3187587813,-1.0268322042,0.7783478200,,, +3.2402343750,51,1.5150782935,-2.1288342960,-0.6753729137,0.9178248127,,, +3.2421875000,51,1.6284541419,-1.9063900609,-0.2278818444,1.2631875751,,, +3.2441406250,51,1.7428814032,-1.6688916129,0.2605133052,1.6991168215,,, +3.2460937500,51,1.8560521595,-1.4346913568,0.7281384848,2.0835594850,,, +3.2480468750,51,1.9656714104,-1.2217461496,1.1163226278,2.2868500056,,, +3.2500000000,52,2.0694974039,-1.0463628150,1.3784805497,2.2274498842,,, +3.2519531250,52,2.1653810409,-0.9220590738,1.4873149775,1.8945085241,,, +3.2539062500,52,2.2513036612,-0.8586193237,1.4390162213,1.3510601710,,, +3.2558593750,52,2.3254125499,-0.8614111149,1.2538056256,0.7169787421,,, +3.2578125000,52,2.3860535426,-0.9310099903,0.9727384009,0.1363600204,,, +3.2597656250,52,2.4318001580,-1.0631588504,0.6512640459,-0.2617313590,,, +3.2617187500,52,2.4614787481,-1.2490646794,0.3505475793,-0.3983942268,,, +3.2636718750,52,2.4741892250,-1.4760119392,0.1279035521,-0.2662759576,,, +3.2656250000,52,2.4693210022,-1.7282498578,0.0278329827,0.0686485386,,, +3.2675781250,52,2.4465638696,-1.9880917356,0.0750594354,0.4853893524,,, +3.2695312500,52,2.4059136139,-2.2371496105,0.2706490657,0.8413246466,,, +3.2714843750,52,2.3476722832,-2.4576181798,0.5918190941,1.0115029616,,, +3.2734375000,52,2.2724430937,-2.6335184431,0.9954646592,0.9230912580,,, +3.2753906250,52,2.1811200657,-2.7518143398,1.4248548252,0.5755257139,,, +3.2773437500,52,2.0748725711,-2.8033245055,1.8184548833,0.0408408659,,, +3.2792968750,52,1.9551250623,-2.7833655641,2.1195008875,-0.5559146602,,, +3.2812500000,52,1.8235323387,-2.6920820881,2.2848351796,-1.0708097558,,, +3.2832031250,52,1.6819507815,-2.5344402096,2.2916267394,-1.3803565535,,, +3.2851562500,52,1.5324060627,-2.3198853194,2.1409296282,-1.4152533102,,, +3.2871093750,52,1.3770578917,-2.0616877150,1.8575252542,-1.1792974030,,, +3.2890625000,52,1.2181624181,-1.7760218153,1.4860729821,-0.7482856145,,, +3.2910156250,52,1.0580329478,-1.4808431429,1.0841685833,-0.2492035740,,, +3.2929687500,52,0.8989996613,-1.1946413725,0.7133916237,0.1745918373,,, +3.2949218750,52,0.7433690377,-0.9351563881,0.4297360995,0.4026546086,,, +3.2968750000,52,0.5933836969,-0.7181468688,0.2749146720,0.3704303513,,, +3.2988281250,52,0.4511833611,-0.5562972622,0.2698907724,0.0868970104,,, +3.3007812500,52,0.3187676202,-0.4583393496,0.4116458180,-0.3679686909,,, +3.3027343750,52,0.1979611525,-0.4284496466,0.6736848887,-0.8652039401,,, +3.3046875000,52,0.0903820099,-0.4659646451,1.0102019029,-1.2623176879,,, +3.3066406250,52,-0.0025864779,-0.5654337385,1.3632553360,-1.4424745980,,, +3.3085937500,52,-0.0798196876,-0.7170061241,1.6718366010,-1.3466646456,,, +3.3105468750,52,-0.1404711557,-0.9071246870,1.8814184055,-0.9900401802,,, +3.3125000000,53,-0.1839871598,-1.1194784628,1.9524956297,-0.4579413455,,, +3.3144531250,53,-0.2101161735,-1.3361472443,1.8667881795,0.1173025671,,, +3.3164062500,53,-0.2189130296,-1.5388584979,1.6301394195,0.5924396323,,, +3.3183593750,53,-0.2107377169,-1.7102689258,1.2716584652,0.8523468709,,, +3.3203125000,53,-0.1862488349,-1.8351812874,0.8392396431,0.8413660576,,, +3.3222656250,53,-0.1463918185,-1.9016116114,0.3921567034,0.5783376397,,, +3.3242187500,53,-0.0923821404,-1.9016323615,-0.0081150163,0.1512145488,,, +3.3261718750,53,-0.0256837844,-1.8319327401,-0.3074192695,-0.3072657551,,, +3.3281250000,53,0.0520166313,-1.6940570431,-0.4672998169,-0.6561812935,,, +3.3300781250,53,0.1388396302,-1.4943044258,-0.4709364976,-0.7852645403,,, +3.3320312500,53,0.2327460297,-1.2432970536,-0.3257121680,-0.6453336666,,, +3.3339843750,53,0.3315728894,-0.9552467333,-0.0620109764,-0.2619737358,,, +3.3359375000,53,0.4330716254,-0.6469711496,0.2715645758,0.2712837113,,, +3.3378906250,53,0.5349476240,-0.3367282902,0.6158125495,0.8184152707,,, +3.3398437500,53,0.6349006603,-0.0429503230,0.9101995123,1.2380198892,,, +3.3417968750,53,0.7306654139,0.2170348015,1.1023337322,1.4219224058,,, +3.3437500000,53,0.8200513727,0.4282048889,1.1561678807,1.3246878224,,, +3.3457031250,53,0.9009814247,0.5788844127,1.0576534060,0.9759586441,,, +3.3476562500,53,0.9715284641,0.6615522253,0.8169656645,0.4722351428,,, +3.3496093750,53,1.0299493677,0.6733597604,0.4669530383,-0.0496477076,,, +3.3515625000,53,1.0747157497,0.6163236040,0.0580514151,-0.4500766717,,, +3.3535156250,53,1.1045409530,0.4971790208,-0.3495440380,-0.6249563958,,, +3.3554687500,53,1.1184028076,0.3269046614,-0.6952306649,-0.5342490528,,, +3.3574218750,53,1.1155617543,0.1199516084,-0.9274172146,-0.2129354578,,, +3.3593750000,53,1.0955740191,-0.1067694666,-1.0115429027,0.2386064227,,, +3.3613281250,53,1.0582996048,-0.3350723936,-0.9354477222,0.6821683632,,, +3.3632812500,53,1.0039049621,-0.5467682625,-0.7112576149,0.9796684647,,, +3.3652343750,53,0.9328602915,-0.7249380836,-0.3734909291,1.0310940261,,, +3.3671875000,53,0.8459315247,-0.8551165960,0.0263188808,0.8020308504,,, +3.3691406250,53,0.7441671243,-0.9263046620,0.4276467635,0.3332329999,,, +3.3710937500,53,0.6288799338,-0.9317396444,0.7703960980,-0.2703909951,,, +3.3730468750,53,0.5016243949,-0.8693700360,1.0042480566,-0.8683583012,,, +3.3750000000,54,0.3641695321,-0.7420012388,1.0964841466,-1.3229268867,,, +3.3769531250,54,0.2184681763,-0.5571023205,1.0370636052,-1.5366462196,,, +3.3789062500,54,0.0666229659,-0.3262872190,0.8401649133,-1.4788538349,,, +3.3808593750,54,-0.0891502772,-0.0645065678,0.5419514450,-1.1938577650,,, +3.3828125000,54,-0.2465611586,0.2109935050,0.1949094008,-0.7885642690,,, +3.3847656250,54,-0.4032846302,0.4818730000,-0.1403599263,-0.4029437997,,, +3.3867187500,54,-0.5570015212,0.7299763019,-0.4046149823,-0.1714317212,,, +3.3886718750,54,-0.7054389685,0.9385979297,-0.5492399398,-0.1858448388,,, +3.3906250000,54,-0.8464100419,1.0936475193,-0.5438584112,-0.4699793784,,, +3.3925781250,54,-0.9778518666,1.1846327983,-0.3811087947,-0.9728545093,,, +3.3945312500,54,-1.0978615800,1.2053920061,-0.0778372363,-1.5824552988,,, +3.3964843750,54,-1.2047294887,1.1545246835,0.3274778457,-2.1562106593,,, +3.3984375000,54,-1.2969688491,1.0354907883,0.7806687837,-2.5598552254,,, +3.4003906250,54,-1.3733417481,0.8563712205,1.2202638378,-2.7040262322,,, +3.4023437500,54,-1.4328806305,0.6293064537,1.5870087647,-2.5685671325,,, +3.4042968750,54,-1.4749050983,0.3696524114,1.8330420216,-2.2078787851,,, +3.4062500000,54,-1.4990336855,0.0949124460,1.9292948033,-1.7358532045,,, +3.4082031250,54,-1.5051904042,-0.1764801093,1.8699636071,-1.2945205221,,, +3.4101562500,54,-1.4936059460,-0.4264439277,1.6733589894,-1.0150033625,,, +3.4121093750,54,-1.4648135181,-0.6385068262,1.3789986081,-0.9814809766,,, +3.4140625000,54,-1.4196393886,-0.7989503983,1.0413976154,-1.2080403984,,, +3.4160156250,54,-1.3591883035,-0.8977623330,0.7215238689,-1.6347597600,,, +3.4179687500,54,-1.2848240343,-0.9293300219,0.4772491425,-2.1440977367,,, +3.4199218750,54,-1.1981453939,-0.8928270990,0.3542838912,-2.5930975921,,, +3.4218750000,54,-1.1009581431,-0.7922659696,0.3790078014,-2.8525797785,,, +3.4238281250,54,-0.9952432779,-0.6362126778,0.5543130720,-2.8425814834,,, +3.4257812500,54,-0.8831222544,-0.4371840092,0.8591081133,-2.5543299085,,, +3.4277343750,54,-0.7668197588,-0.2107688833,1.2515592109,-2.0527265589,,, +3.4296875000,54,-0.6486246762,0.0254646815,1.6755654806,-1.4586609694,,, +3.4316406250,54,-0.5308499396,0.2532007957,2.0694588285,-0.9160002449,,, +3.4335937500,54,-0.4157919638,0.4546592466,2.3755740553,-0.5523005068,,, +3.4355468750,54,-0.3056903745,0.6138418455,2.5491987017,-0.4440067996,,, +3.4375000000,55,-0.2026887361,0.7176546469,2.5655088240,-0.5956776917,,, +3.4394531250,55,-0.1087969680,0.7568277674,2.4234105726,-0.9389269118,,, +3.4414062500,55,-0.0258561064,0.7265686468,2.1456893647,-1.3513703713,,, +3.4433593750,55,0.0444939717,0.6269031808,1.7754435381,-1.6903839327,,, +3.4453125000,55,0.1008432961,0.4626809197,1.3693580623,-1.8324179939,,, +3.4472656250,55,0.1420365198,0.2432439550,0.9888660420,-1.7070919194,,, +3.4492187500,55,0.1671931716,-0.0182174348,0.6905747147,-1.3167219669,,, +3.4511718750,55,0.1757230900,-0.3055774623,0.5174471839,-0.7359285522,,, +3.4531250000,55,0.1673367679,-0.6008922073,0.4921133950,-0.0914283219,,, +3.4550781250,55,0.1420504274,-0.8856437891,0.6133522032,0.4724527568,,, +3.4570312500,55,0.1001857359,-1.1420245931,0.8562924444,0.8330956267,,, +3.4589843750,55,0.0423641678,-1.3541720135,1.1763016470,0.9229604273,,, +3.4609375000,55,-0.0305038886,-1.5092676299,1.5159566289,0.7478705789,,, +3.4628906250,55,-0.1172350887,-1.5984241813,1.8140101895,0.3851995589,,, +3.4648437500,55,-0.2163938748,-1.6172985067,2.0149571773,-0.0375407544,,, +3.4667968750,55,-0.3263176398,-1.5663877237,2.0777098438,-0.3778400586,,, +3.4687500000,55,-0.4451458738,-1.4509880084,1.9820311065,-0.5174254152,,, +3.4707031250,55,-0.5708527799,-1.2808188680,1.7317235434,-0.3948379390,,, +3.4726562500,55,-0.7012827905,-1.0693391205,1.3540772374,-0.0224206893,,, +3.4746093750,55,-0.8341883613,-0.8328022975,0.8956622742,0.5169393476,,, +3.4765625000,55,-0.9672693808,-0.5891173520,0.4151210244,1.0924233244,,, +3.4785156250,55,-1.0982135059,-0.3565941358,-0.0259173767,1.5610502364,,, +3.4804687500,55,-1.2247367170,-0.1526611376,-0.3723854716,1.8068015425,,, +3.4824218750,55,-1.3446233826,0.0073550844,-0.5843018765,1.7723783027,,, +3.4843750000,55,-1.4557651313,0.1113036515,-0.6429441709,1.4748874320,,, +3.4863281250,55,-1.5561978510,0.1510614057,-0.5537090907,1.0011580075,,, +3.4882812500,55,-1.6441361676,0.1231038160,-0.3452148135,0.4839711528,,, +3.4902343750,55,-1.7180047987,0.0287549275,-0.0647854424,0.0657178297,,, +3.4921875000,55,-1.7764662336,-0.1259010860,0.2289787069,-0.1405557019,,, +3.4941406250,55,-1.8184442553,-0.3304406088,0.4753875057,-0.0820392307,,, +3.4960937500,55,-1.8431428919,-0.5708241825,0.6211729763,0.2194787069,,, +3.4980468750,55,-1.8500604655,-0.8303725664,0.6288449857,0.6737120404,,, +3.5000000000,56,-1.8389984936,-1.0909272040,0.4825889334,1.1467688435,,, +3.5019531250,56,-1.8100652849,-1.3341141783,0.1907865473,1.4980099614,,, +3.5039062500,56,-1.7636741695,-1.5426235232,-0.2152331273,1.6187711499,,, +3.5058593750,56,-1.7005363912,-1.7014146849,-0.6860182844,1.4623344196,,, +3.5078125000,56,-1.6216487889,-1.7987640785,-1.1616432838,1.0569324972,,, +3.5097656250,56,-1.5282764807,-1.8270816924,-1.5809908526,0.4982203282,,, +3.5117187500,56,-1.4219308558,-1.7834398005,-1.8912220625,-0.0767250660,,, +3.5136718750,56,-1.3043432573,-1.6697769142,-2.0559593309,-0.5267526006,,, +3.5156250000,56,-1.1774348182,-1.4927627539,-2.0609081291,-0.7450991679,,, +3.5175781250,56,-1.0432829786,-1.2633336565,-1.9160420056,-0.6884265622,,, +3.5195312500,56,-0.9040852694,-0.9959308151,-1.6540107984,-0.3884772902,,, +3.5214843750,56,-0.7621209966,-0.7074944708,-1.3250201526,0.0568431064,,, +3.5234375000,56,-0.6197114989,-0.4162841915,-0.9889800559,0.5105110534,,, +3.5253906250,56,-0.4791796710,-0.1406075016,-0.7061454504,0.8341430080,,, +3.5273437500,56,-0.3428094650,0.1024544850,-0.5277068307,0.9261162687,,, +3.5292968750,56,-0.2128060755,0.2982355680,-0.4877965052,0.7496028919,,, +3.5312500000,56,-0.0912575086,0.4355042258,-0.5981556845,0.3428316999,,, +3.5332031250,56,0.0199017958,0.5072435382,-0.8462930993,-0.1912357575,,, +3.5351562500,56,0.1189246477,0.5111368873,-1.1974220089,-0.7129872687,,, +3.5371093750,56,0.2042815106,0.4497255736,-1.5998739327,-1.0843049334,,, +3.5390625000,56,0.2746870905,0.3302273659,-1.9931459017,-1.2063198145,,, +3.5410156250,56,0.3291226452,0.1640286465,-2.3173278182,-1.0464298347,,, +3.5429687500,56,0.3668536244,-0.0341144241,-2.5224415341,-0.6471769193,,, +3.5449218750,56,0.3874423305,-0.2471100075,-2.5762369853,-0.1145510234,,, +3.5468750000,56,0.3907553799,-0.4567278299,-2.4692310238,0.4110730427,,, +3.5488281250,56,0.3769658323,-0.6448760677,-2.2162040297,0.7934004575,,, +3.5507812500,56,0.3465499537,-0.7948688232,-1.8539210875,0.9375408568,,, +3.5527343750,56,0.3002786666,-0.8925957915,-1.4354325358,0.8159631349,,, +3.5546875000,56,0.2392038406,-0.9275125416,-1.0218414590,0.4759675766,,, +3.5566406250,56,0.1646396605,-0.8933823408,-0.6728202135,0.0266280616,,, +3.5585937500,56,0.0781394002,-0.7887177800,-0.4373529040,-0.3912160817,,, +3.5605468750,56,-0.0185319910,-0.6168913877,-0.3461455201,-0.6436932254,,, +3.5625000000,57,-0.1234290101,-0.3859075051,-0.4068856788,-0.6407408097,,, +3.5644531250,57,-0.2344598856,-0.1078513127,-0.6030900671,-0.3609564531,,, +3.5664062500,57,-0.3494234230,0.2019465839,-0.8967188596,0.1423536539,,, +3.5683593750,57,-0.4660477697,0.5259717714,-1.2341496505,0.7555884121,,, +3.5703125000,57,-0.5820304157,0.8457398354,-1.5545801674,1.3357789662,,, +3.5722656250,57,-0.6950787334,1.1430777290,-1.7995507295,1.7495550345,,, +3.5742187500,57,-0.8029503439,1.4013833692,-1.9221029995,1.9094729013,,, +3.5761718750,57,-0.9034926045,1.6067756399,-1.8941482220,1.7977507185,,, +3.5781250000,57,-0.9946805248,1.7490546274,-1.7108970199,1.4709080974,,, +3.5800781250,57,-1.0746524480,1.8224051435,-1.3916604930,1.0440405683,,, +3.5820312500,57,-1.1417428723,1.8257944968,-0.9768975530,0.6590409708,,, +3.5839843750,57,-1.1945118370,1.7630367899,-0.5219680965,0.4454795013,,, +3.5859375000,57,-1.2317703599,1.6425192769,-0.0885647019,0.4848661573,,, +3.5878906250,57,-1.2526014792,1.4766098804,0.2648428757,0.7880922639,,, +3.5898437500,57,-1.2563765317,1.2807872008,0.4920623759,1.2922357132,,, +3.5917968750,57,-1.2427663830,1.0725537012,0.5663228301,1.8776074501,,, +3.5937500000,57,-1.2117474109,0.8702078730,0.4843950700,2.4003691243,,, +3.5957031250,57,-1.1636021399,0.6915610184,0.2670474143,2.7317841181,,, +3.5976562500,57,-1.0989145127,0.5526881493,-0.0442341938,2.7933460183,,, +3.5996093750,57,-1.0185598835,0.4668001220,-0.3937505053,2.5781583230,,, +3.6015625000,57,-0.9236899070,0.4433156726,-0.7203044356,2.1527071350,,, +3.6035156250,57,-0.8157125883,0.4871980791,-0.9667699956,1.6385421141,,, +3.6054687500,57,-0.6962678419,0.5986027199,-1.0890240782,1.1788873216,,, +3.6074218750,57,-0.5671989892,0.7728601217,-1.0628497490,0.8993336607,,, +3.6093750000,57,-0.4305206916,1.0007956907,-0.8877356563,0.8733864765,,, +3.6113281250,57,-0.2883838822,1.2693638460,-0.5869796391,1.1023110193,,, +3.6132812500,57,-0.1430383086,1.5625523470,-0.2040802705,1.5147996534,,, +3.6152343750,57,0.0032066558,1.8624937647,0.2040217309,1.9865519422,,, +3.6171875000,57,0.1480222479,2.1507066035,0.5757996237,2.3744010051,,, +3.6191406250,57,0.2891008924,2.4093795352,0.8547149749,2.5556326470,,, +3.6210937500,57,0.4241964108,2.6226092023,0.9980189936,2.4617203709,,, +3.6230468750,57,0.5511631582,2.7775052853,0.9834100357,2.0972296341,,, +3.6250000000,58,0.6679934029,2.8650857800,0.8125103403,1.5387091828,,, +3.6269531250,58,0.7728522935,2.8809000661,0.5106204596,0.9138720674,,, +3.6289062500,58,0.8641098020,2.8253363220,0.1227895926,0.3667707820,,, +3.6308593750,58,0.9403690842,2.7035918581,-0.2931861738,0.0185094097,,, +3.6328125000,58,1.0004907596,2.5253084423,-0.6757472329,-0.0657413107,,, +3.6347656250,58,1.0436126869,2.3038980515,-0.9691363316,0.1056123583,,, +3.6367187500,58,1.0691648882,2.0556060720,-1.1320571324,0.4531184344,,, +3.6386718750,58,1.0768793617,1.7983772782,-1.1440769875,0.8482896699,,, +3.6406250000,58,1.0667946094,1.5506036698,-1.0087768136,1.1490586829,,, +3.6425781250,58,1.0392548028,1.3298414874,-0.7531576358,1.2389584414,,, +3.6445312500,58,0.9949035997,1.1515868744,-0.4233964209,1.0592877350,,, +3.6464843750,58,0.9346727208,1.0281955605,-0.0776124607,0.6254438671,,, +3.6484375000,58,0.8597654868,0.9680219018,0.2232288025,0.0229440956,,, +3.6503906250,58,0.7716356038,0.9748373122,0.4248574971,-0.6157759128,,, +3.6523437500,58,0.6719615687,1.0475686384,0.4882001711,-1.1474298573,,, +3.6542968750,58,0.5626171428,1.1803747197,0.3955154611,-1.4569317351,,, +3.6562500000,58,0.4456384107,1.3630557893,0.1532086532,-1.4887291762,,, +3.6582031250,58,0.3231880016,1.5817671627,-0.2091135200,-1.2618334855,,, +3.6601562500,58,0.1975170994,1.8199874419,-0.6432009067,-0.8644288158,,, +3.6621093750,58,0.0709259066,2.0596737104,-1.0896211343,-0.4295395082,,, +3.6640625000,58,-0.0542767453,2.2825231579,-1.4869621467,-0.0984258707,,, +3.6660156250,58,-0.1758139316,2.4712531495,-1.7813430291,0.0182582314,,, +3.6679687500,58,-0.2914806067,2.6108104670,-1.9347520468,-0.1291006445,,, +3.6699218750,58,-0.3991823130,2.6894253890,-1.9309134988,-0.5153919021,,, +3.6718750000,58,-0.4969719481,2.6994370947,-1.7777698771,-1.0475986208,,, +3.6738281250,58,-0.5830839475,2.6378328240,-1.5061930080,-1.5902485699,,, +3.6757812500,58,-0.6559652825,2.5064631838,-1.1651251996,-2.0025234578,,, +3.6777343750,58,-0.7143027325,2.3119185746,-0.8139074589,-2.1768559703,,, +3.6796875000,58,-0.7570459520,2.0650753434,-0.5129899621,-2.0684361890,,, +3.6816406250,58,-0.7834259306,1.7803432959,-0.3144719242,-1.7075402363,,, +3.6835937500,58,-0.7929685206,1.4746670297,-0.2539445773,-1.1913017047,,, +3.6855468750,58,-0.7855027967,1.1663507125,-0.3449079839,-0.6571803441,,, +3.6875000000,59,-0.7611641008,0.8737882447,-0.5766315153,-0.2453985203,,, +3.6894531250,59,-0.7203917188,0.6141873397,-0.9157914377,-0.0606393803,,, +3.6914062500,59,-0.6639212301,0.4023764810,-1.3116307291,-0.1435028267,,, +3.6933593750,59,-0.5927716627,0.2497779344,-1.7038376300,-0.4595409252,,, +3.6953125000,59,-0.5082276810,0.1636184156,-2.0319159518,-0.9088762213,,, +3.6972656250,59,-0.4118171158,0.1464324377,-2.2445878043,-1.3537651566,,, +3.6992187500,59,-0.3052842313,0.1958929566,-2.3077643309,-1.6565504415,,, +3.7011718750,59,-0.1905591967,0.3049811060,-2.2098430641,-1.7175988417,,, +3.7031250000,59,-0.0697242975,0.4624831701,-1.9635068841,-1.5028247523,,, +3.7050781250,59,0.0550225228,0.6537801196,-1.6037444391,-1.0532540912,,, +3.7070312500,59,0.1814061517,0.8618746386,-1.1824003902,-0.4740052115,,, +3.7089843750,59,0.3071141529,1.0685840064,-0.7601043211,0.0942953165,,, +3.7109375000,59,0.4298372713,1.2558156334,-0.3968354210,0.5138301303,,, +3.7128906250,59,0.5473098873,1.4068362873,-0.1425925093,0.6871421900,,, +3.7148437500,59,0.6573497132,1.5074464844,-0.0296225466,0.5836300509,,, +3.7167968750,59,0.7578960351,1.5469781357,-0.0674180104,0.2477277829,,, +3.7187500000,59,0.8470458326,1.5190458612,-0.2412622291,-0.2134703607,,, +3.7207031250,59,0.9230871417,1.4219995647,-0.5145491356,-0.6597469374,,, +3.7226562500,59,0.9845290790,1.2590466923,-0.8345159971,-0.9563629970,,, +3.7246093750,59,1.0301279990,1.0380356335,-1.1404960669,-1.0111432440,,, +3.7265625000,59,1.0589093289,0.7709153534,-1.3734056001,-0.7998792476,,, +3.7285156250,59,1.0701846961,0.4729089207,-1.4849873953,-0.3730870921,,, +3.7304687500,59,1.0635640508,0.1614585501,-1.4453709321,0.1577337802,,, +3.7324218750,59,1.0389625699,-0.1449842908,-1.2477713595,0.6505754977,,, +3.7343750000,59,0.9966022213,-0.4282393553,-0.9095952132,0.9717790099,,, +3.7363281250,59,0.9370079622,-0.6716593931,-0.4697803994,1.0326246704,,, +3.7382812500,59,0.8609986368,-0.8612852549,0.0172154953,0.8136281902,,, +3.7402343750,59,0.7696727336,-0.9868137885,0.4898424797,0.3698833795,,, +3.7421875000,59,0.6643892507,-1.0423110454,0.8889886983,-0.1840126023,,, +3.7441406250,59,0.5467440051,-1.0266210745,1.1671300825,-0.7053201559,,, +3.7460937500,59,0.4185418001,-0.9434418076,1.2956742933,-1.0622096355,,, +3.7480468750,59,0.2817649383,-0.8010627567,1.2693553855,-1.1698027472,,, +3.7500000000,60,0.1385386313,-0.6117828212,1.1069949952,-1.0133258960,,, +3.7519531250,60,-0.0089060874,-0.3910488163,0.8485117855,-0.6520308362,,, +3.7539062500,60,-0.1582712991,-0.1563747993,0.5486452385,-0.2028092710,,, +3.7558593750,60,-0.3072323019,0.0738824352,0.2683716398,0.1920065113,,, +3.7578125000,60,-0.4534781773,0.2818062990,0.0653495492,0.4038305829,,, +3.7597656250,60,-0.5947521116,0.4511723219,-0.0151167874,0.3532562974,,, +3.7617187500,60,-0.7288907647,0.5685817257,0.0528116878,0.0320223151,,, +3.7636718750,60,-0.8538619987,0.6243976092,0.2714315151,-0.4945103766,,, +3.7656250000,60,-0.9678003039,0.6134184567,0.6190882572,-1.1050512984,,, +3.7675781250,60,-1.0690393040,0.5352420019,1.0535007831,-1.6553961456,,, +3.7695312500,60,-1.1561407696,0.3942940715,1.5183007618,-2.0177187892,,, +3.7714843750,60,-1.2279196335,0.1995203947,1.9517690315,-2.1153729958,,, +3.7734375000,60,-1.2834645690,-0.0362371278,2.2964083254,-1.9436679217,,, +3.7753906250,60,-1.3221537712,-0.2971362038,2.5078615486,-1.5709255982,,, +3.7773437500,60,-1.3436656648,-0.5654395089,2.5617867216,-1.1195327199,,, +3.7792968750,60,-1.3479843525,-0.8227525437,2.4576179476,-0.7321819631,,, +3.7812500000,60,-1.3353997060,-1.0513076674,2.2186267603,-0.5325571084,,, +3.7832031250,60,-1.3065021004,-1.2352047624,1.8882744280,-0.5912389445,,, +3.7851562500,60,-1.2621718839,-1.3615220120,1.5234234704,-0.9061779735,,, +3.7871093750,60,-1.2035637662,-1.4212193254,1.1854658216,-1.4030875003,,, +3.7890625000,60,-1.1320863999,-1.4097714084,0.9307495438,-1.9556509741,,, +3.7910156250,60,-1.0493775132,-1.3274863235,0.8017952319,-2.4200068164,,, +3.7929687500,60,-0.9572750277,-1.1794873203,0.8206702268,-2.6740607733,,, +3.7949218750,60,-0.8577846690,-0.9753591935,0.9855526476,-2.6508525849,,, +3.7968750000,60,-0.7530446355,-0.7284838207,1.2710203983,-2.3568331081,,, +3.7988281250,60,-0.6452879463,-0.4551112048,1.6320200997,-1.8700434356,,, +3.8007812500,60,-0.5368031255,-0.1732307898,2.0108977081,-1.3186956105,,, +3.8027343750,60,-0.4298939132,0.0986782532,2.3463956907,-0.8460256698,,, +3.8046875000,60,-0.3268387070,0.3429306368,2.5832153009,-0.5710518835,,, +3.8066406250,60,-0.2298504464,0.5438629652,2.6806544653,-0.5559931117,,, +3.8085937500,60,-0.1410376407,0.6889205201,2.6189757492,-0.7892766567,,, +3.8105468750,60,-0.0623672242,0.7695270527,2.4025124034,-1.1887921670,,, +3.8125000000,61,0.0043701116,0.7816769419,2.0590285388,-1.6244991150,,, +3.8144531250,61,0.0575915004,0.7262084407,1.6354328963,-1.9541909431,,, +3.8164062500,61,0.0959498473,0.6087389703,1.1905136129,-2.0626129347,,, +3.8183593750,61,0.1183576460,0.4392669899,0.7858253630,-1.8932115383,,, +3.8203125000,61,0.1240062532,0.2314682207,0.4761480209,-1.4638122005,,, +3.8222656250,61,0.1123802804,0.0017353158,0.3010027138,-0.8619273273,,, +3.8242187500,61,0.0832668514,-0.2319720408,0.2785464299,-0.2209786232,,, +3.8261718750,61,0.0367595639,-0.4513864023,0.4027958647,0.3160512697,,, +3.8281250000,61,-0.0267429150,-0.6392133671,0.6446126335,0.6355777632,,, +3.8300781250,61,-0.1065435943,-0.7803445927,0.9562961181,0.6843084721,,, +3.8320312500,61,-0.2016591286,-0.8629184133,1.2790683035,0.4836074464,,, +3.8339843750,61,-0.3108368007,-0.8791540817,1.5522845125,0.1233948195,,, +3.8359375000,61,-0.4325762221,-0.8259014467,1.7229351268,-0.2627440362,,, +3.8378906250,61,-0.5651553690,-0.7048677155,1.7539580586,-0.5344158317,,, +3.8398437500,61,-0.7066605005,-0.5225054723,1.6300669707,-0.5831395060,,, +3.8417968750,61,-0.8550194336,-0.2895697457,1.3601871795,-0.3623150173,,, +3.8437500000,61,-1.0080375931,-0.0203749932,0.9761195490,0.0997748588,,, +3.8457031250,61,-1.1634362060,0.2681962000,0.5276402028,0.7074951573,,, +3.8476562500,61,-1.3188919697,0.5578635982,0.0747990230,1.3238598000,,, +3.8496093750,61,-1.4720775022,0.8302173639,-0.3213837789,1.8078788465,,, +3.8515625000,61,-1.6207018643,1.0679952687,-0.6083742191,2.0530178769,,, +3.8535156250,61,-1.7625504444,1.2562800192,-0.7502615639,2.0162305275,,, +3.8554687500,61,-1.8955235092,1.3835332195,-0.7333086672,1.7296086645,,, +3.8574218750,61,-2.0176727437,1.4423938838,-0.5680513511,1.2914585018,,, +3.8593750000,61,-2.1272351417,1.4301858318,-0.2876200450,0.8392495239,,, +3.8613281250,61,-2.2226636531,1.3490985987,0.0574547102,0.5118510098,,, +3.8632812500,61,-2.3026540524,1.2060292579,0.4071436485,0.4114067079,,, +3.8652343750,61,-2.3661675562,1.0120962004,0.7012962157,0.5752971835,,, +3.8671875000,61,-2.4124487963,0.7818587900,0.8890333316,0.9658744271,,, +3.8691406250,61,-2.4410388313,0.5322973215,0.9366923842,1.4807822614,,, +3.8710937500,61,-2.4517829713,0.2816244250,0.8330868810,1.9810339278,,, +3.8730468750,61,-2.4448332764,0.0480108120,0.5912614570,2.3291513140,,, +3.8750000000,62,-2.4206456881,-0.1516857685,0.2464688260,2.4269124897,,, +3.8769531250,62,-2.3799718411,-0.3030997202,-0.1493162626,2.2423613651,,, +3.8789062500,62,-2.3238457017,-0.3953626983,-0.5354916027,1.8186760281,,, +3.8808593750,62,-2.2535652645,-0.4218645194,-0.8522698693,1.2624641197,,, +3.8828125000,62,-2.1706696300,-0.3807168145,-1.0499979997,0.7146918689,,, +3.8847656250,62,-2.0769118627,-0.2748870856,-1.0969020316,0.3122128340,,, +3.8867187500,62,-1.9742281071,-0.1119938131,-0.9840510337,0.1504385921,,, +3.8886718750,62,-1.8647035007,0.0962231067,-0.7267668869,0.2573805058,,, +3.8906250000,62,-1.7505354819,0.3347196668,-0.3622602297,0.5861751089,,, +3.8925781250,62,-1.6339951350,0.5861958105,0.0561393405,1.0281397487,,, +3.8945312500,62,-1.5173872500,0.8323011665,0.4672602783,1.4427783068,,, +3.8964843750,62,-1.4030097954,1.0549143783,0.8115842834,1.6965112520,,, +3.8984375000,62,-1.2931135147,1.2374068208,1.0404809286,1.6995131555,,, +3.9003906250,62,-1.1898623540,1.3658025788,1.1237435738,1.4305594569,,, +3.9023437500,62,-1.0952954133,1.4297538001,1.0542530165,0.9430705736,,, +3.9042968750,62,-1.0112910884,1.4232634063,0.8490427135,0.3506946995,,, +3.9062500000,62,-0.9395340306,1.3451047636,0.5465998956,-0.2036214940,,, +3.9082031250,62,-0.8814855041,1.1989090444,0.2008231888,-0.5865995176,,, +3.9101562500,62,-0.8383576583,0.9929141861,-0.1274218687,-0.7109554770,,, +3.9121093750,62,-0.8110921678,0.7393929462,-0.3798338734,-0.5591321514,,, +3.9140625000,62,-0.8003436119,0.4537999345,-0.5098083827,-0.1879342727,,, +3.9160156250,62,-0.8064678874,0.1536970947,-0.4897497529,0.2872017274,,, +3.9179687500,62,-0.8295158546,-0.1424674410,-0.3154228477,0.7239907906,,, +3.9199218750,62,-0.8692323300,-0.4166419769,-0.0066665260,0.9924229769,,, +3.9218750000,62,-0.9250604435,-0.6524259265,0.3956425110,1.0105040355,,, +3.9238281250,62,-0.9961512816,-0.8362090482,0.8359029062,0.7668163662,,, +3.9257812500,62,-1.0813786509,-0.9581158118,1.2523958453,0.3237162546,,, +3.9277343750,62,-1.1793587011,-1.0126890524,1.5868459361,-0.1997095228,,, +3.9296875000,62,-1.2884740645,-0.9992652495,1.7934468947,-0.6602570773,,, +3.9316406250,62,-1.4069020908,-0.9220152723,1.8459465170,-0.9298506545,,, +3.9335937500,62,-1.5326466803,-0.7896477647,1.7416876814,-0.9306638290,,, +3.9355468750,62,-1.6635731607,-0.6147958634,1.5019762383,-0.6564907999,,, +3.9375000000,63,-1.7974455953,-0.4131300313,1.1687187342,-0.1745101669,,, +3.9394531250,63,-1.9319658693,-0.2022588834,0.7978539044,0.3930427994,,, +3.9414062500,63,-2.0648138712,-0.0004946693,0.4506012381,0.9022731020,,, +3.9433593750,63,-2.1936880647,0.1744304869,0.1838899132,1.2269400513,,, +3.9453125000,63,-2.3163457400,0.3066080529,0.0414590423,1.2929147489,,, +3.9472656250,63,-2.4306422423,0.3830695341,0.0470155960,1.0983385863,,, +3.9492187500,63,-2.5345684872,0.3946980304,0.2005158584,0.7139594023,,, +3.9511718750,63,-2.6262861095,0.3368713216,0.4781497455,0.2635547960,,, +3.9531250000,63,-2.7041596272,0.2097916210,0.8360305596,-0.1101902661,,, +3.9550781250,63,-2.7667850594,0.0184789843,1.2170155894,-0.2849977563,,, +3.9570312500,63,-2.8130144964,-0.2275711815,1.5595953035,-0.1927259713,,, +3.9589843750,63,-2.8419761909,-0.5150426446,1.8074666680,0.1617322558,,, +3.9609375000,63,-2.8530898204,-0.8277192854,1.9182995442,0.7015640491,,, +3.9628906250,63,-2.8460766515,-1.1476082405,1.8703307807,1.2988603758,,, +3.9648437500,63,-2.8209644303,-1.4561869511,1.6657589461,1.8094442783,,, +3.9667968750,63,-2.7780869107,-1.7356871728,1.3304109382,2.1121602350,,, +3.9687500000,63,-2.7180780314,-1.9703264255,0.9097323660,2.1418587490,,, +3.9707031250,63,-2.6418608418,-2.1474010277,0.4617261661,1.9070381705,,, +3.9726562500,63,-2.5506313712,-2.2581645116,0.0479392267,1.4873106937,,, +3.9746093750,63,-2.4458377246,-2.2984301815,-0.2760991952,1.0113889744,,, +3.9765625000,63,-2.3291547692,-2.2688558134,-0.4694981141,0.6216284330,,, +3.9785156250,63,-2.2024548568,-2.1748906594,-0.5123419355,0.4348448755,,, +3.9804687500,63,-2.0677750938,-2.0263884689,-0.4087571708,0.5101477579,,, +3.9824218750,63,-1.9272817313,-1.8369135277,-0.1862312579,0.8326064980,,, +3.9843750000,63,-1.7832323003,-1.6227881216,0.1087102238,1.3172277130,,, +3.9863281250,63,-1.6379361536,-1.4019478651,0.4177944485,1.8321544810,,, +3.9882812500,63,-1.4937141057,-1.1926847292,0.6801245328,2.2347303551,,, +3.9902343750,63,-1.3528578782,-1.0123654365,0.8417138031,2.4105448336,,, +3.9921875000,63,-1.2175900590,-0.8762146079,0.8639458857,2.3047596570,,, +3.9941406250,63,-1.0900252778,-0.7962475286,0.7296426601,1.9371306987,,, +3.9960937500,63,-0.9721332780,-0.7804269669,0.4457946954,1.3966085550,,, +3.9980468750,63,-0.8657045293,-0.8321028587,0.0425286159,0.8169975971,,, +4.0000000000,64,-0.7723189861,-0.9497739372,-0.4315280454,0.3403443506,,, +4.0019531250,64,-0.6933185359,-1.1271879458,-0.9167628442,0.0780888799,,, +4.0039062500,64,-0.6297836222,-1.3537734520,-1.3518049057,0.0806257525,,, +4.0058593750,64,-0.5825144497,-1.6153731635,-1.6830251107,0.3236161456,,, +4.0078125000,64,-0.5520171022,-1.8952276161,-1.8728305748,0.7148014862,,, +4.0097656250,64,-0.5384948139,-2.1751406484,-1.9054618073,1.1194499834,,, +4.0117187500,64,-0.5418445505,-2.4367453960,-1.7893899018,1.3974605267,,, +4.0136718750,64,-0.5616589556,-2.6627825318,-1.5559406739,1.4419533387,,, +4.0156250000,64,-0.5972336322,-2.8383016215,-1.2543603242,1.2087691544,,, +4.0175781250,64,-0.6475796285,-2.9517018251,-0.9440914556,0.7287902742,,, +4.0195312500,64,-0.7114409121,-2.9955393781,-0.6854627634,0.0997047415,,, +4.0214843750,64,-0.7873165239,-2.9670455461,-0.5302427879,-0.5405311733,,, +4.0234375000,64,-0.8734870257,-2.8683189380,-0.5135292829,-1.0512611292,,, +4.0253906250,64,-0.9680447772,-2.7061787687,-0.6482377108,-1.3274333381,,, +4.0273437500,64,-1.0689275130,-2.4916893040,-0.9230475341,-1.3281456783,,, +4.0292968750,64,-1.1739546307,-2.2393886511,-1.3041263908,-1.0876101166,,, +4.0312500000,64,-1.2808655550,-1.9662756714,-1.7403637988,-0.7055335942,,, +4.0332031250,64,-1.3873595060,-1.6906256615,-2.1712993906,-0.3195538339,,, +4.0351562500,64,-1.4911359756,-1.4307173843,-2.5365109764,-0.0672866848,,, +4.0371093750,64,-1.5899352021,-1.2035602172,-2.7850003380,-0.0483887234,,, +4.0390625000,64,-1.6815779352,-1.0237101725,-2.8831149918,-0.2970345625,,, +4.0410156250,64,-1.7640037947,-0.9022573472,-2.8197721691,-0.7723538589,,, +4.0429687500,64,-1.8353075510,-0.8460554067,-2.6081714373,-1.3694506764,,, +4.0449218750,64,-1.8937726920,-0.8572468242,-2.2837292766,-1.9479867218,,, +4.0468750000,64,-1.9379016889,-0.9331169779,-1.8985573565,-2.3704960882,,, +4.0488281250,64,-1.9664424302,-1.0662872700,-1.5133445732,-2.5399318659,,, +4.0507812500,64,-1.9784103616,-1.2452337936,-1.1879072647,-2.4261553279,,, +4.0527343750,64,-1.9731059436,-1.4550953692,-0.9718794390,-2.0741087186,,, +4.0546875000,64,-1.9501271208,-1.6787145939,-0.8969930205,-1.5914324596,,, +4.0566406250,64,-1.9093765856,-1.8978392976,-0.9721504462,-1.1189210515,,, +4.0585937500,64,-1.8510637068,-2.0944006121,-1.1820569994,-0.7919151463,,, +4.0605468750,64,-1.7757010920,-2.2517785191,-1.4896258005,-0.7032111811,,, +4.0625000000,65,-1.6840958410,-2.3559666125,-1.8417807445,-0.8776538362,,, +4.0644531250,65,-1.5773356459,-2.3965548395,-2.1777534056,-1.2653744640,,, +4.0664062500,65,-1.4567699787,-2.3674616787,-2.4385814663,-1.7555281269,,, +4.0683593750,65,-1.3239866978,-2.2673646817,-2.5763290637,-2.2067636306,,, +4.0703125000,65,-1.1807844816,-2.0997993424,-2.5615927438,-2.4860747346,,, +4.0722656250,65,-1.0291415717,-1.8729193834,-2.3881237256,-2.5053835058,,, +4.0742187500,65,-0.8711813741,-1.5989351607,-2.0738463100,-2.2458281604,,, +4.0761718750,65,-0.7091355188,-1.2932693331,-1.6581135769,-1.7630974028,,, +4.0781250000,65,-0.5453050262,-0.9734886565,-1.1956275635,-1.1723477113,,, +4.0800781250,65,-0.3820202593,-0.6580863776,-0.7479706298,-0.6168355827,,, +4.0820312500,65,-0.2216003623,-0.3652001180,-0.3740667793,-0.2288598701,,, +4.0839843750,65,-0.0663128969,-0.1113546364,-0.1210583599,-0.0937168193,,, +4.0859375000,65,0.0816656178,0.0896828760,-0.0170188653,-0.2265446321,,, +4.0878906250,65,0.2202875713,0.2278551591,-0.0666365687,-0.5684016875,,, +4.0898437500,65,0.3476698696,0.2975085154,-0.2505409984,-1.0026511355,,, +4.0917968750,65,0.4621266631,0.2977793539,-0.5283768649,-1.3871591840,,, +4.0937500000,65,0.5621986200,0.2326467119,-0.8451463680,-1.5934803325,,, +4.0957031250,65,0.6466782344,0.1106471076,-1.1398317448,-1.5422879080,,, +4.0976562500,65,0.7146307245,-0.0557283745,-1.3549547600,-1.2253373382,,, +4.0996093750,65,0.7654101563,-0.2509127042,-1.4455839137,-0.7079406233,,, +4.1015625000,65,0.7986705102,-0.4573559481,-1.3863861664,-0.1112718344,,, +4.1035156250,65,0.8143714966,-0.6567564942,-1.1756245632,0.4206487353,,, +4.1054687500,65,0.8127790190,-0.8313445855,-0.8354788435,0.7602449117,,, +4.1074218750,65,0.7944602773,-0.9651286415,-0.4086388425,0.8311828433,,, +4.1093750000,65,0.7602735955,-1.0450174409,0.0482989628,0.6291414605,,, +4.1113281250,65,0.7113531540,-1.0617398978,0.4736034734,0.2228640134,,, +4.1132812500,65,0.6490888928,-1.0104982755,0.8099834831,-0.2647962918,,, +4.1152343750,65,0.5751019374,-0.8913092733,1.0134736119,-0.6906406940,,, +4.1171875000,65,0.4912159791,-0.7090091872,1.0602478147,-0.9304446569,,, +4.1191406250,65,0.3994251094,-0.4729227691,0.9502993977,-0.9130559961,,, +4.1210937500,65,0.3018586735,-0.1962188639,0.7074145142,-0.6399256241,,, +4.1230468750,65,0.2007437566,0.1050022561,0.3754434043,-0.1847178680,,, +4.1250000000,66,0.0983659614,0.4128262271,0.0114502696,0.3268928833,,, +4.1269531250,66,-0.0029708365,0.7087686995,-0.3231911779,0.7517019097,,, +4.1289062500,66,-0.1009850511,0.9750594652,-0.5723694983,0.9682800409,,, +4.1308593750,66,-0.1934575559,1.1958770747,-0.6939837275,0.9103325544,,, +4.1328125000,66,-0.2782707568,1.3584478567,-0.6665053852,0.5849676511,,, +4.1347656250,66,-0.3534458847,1.4539327142,-0.4923322072,0.0708667107,,, +4.1367187500,66,-0.4171778551,1.4780398641,-0.1974112447,-0.5031433361,,, +4.1386718750,66,-0.4678670819,1.4313208015,0.1728099374,-0.9932441549,,, +4.1406250000,66,-0.5041476917,1.3191288553,0.5604732924,-1.2798734491,,, +4.1425781250,66,-0.5249116410,1.1512432342,0.9043371773,-1.3003107596,,, +4.1445312500,66,-0.5293283162,0.9411847818,1.1493340164,-1.0656725778,,, +4.1464843750,66,-0.5168592725,0.7052711619,1.2551699787,-0.6576607765,,, +4.1484375000,66,-0.4872678528,0.4614773630,1.2026270973,-0.2059574701,,, +4.1503906250,66,-0.4406235194,0.2281809844,0.9965860946,0.1475362753,,, +4.1523437500,66,-0.3773008211,0.0228798021,0.6652989294,0.2878146936,,, +4.1542968750,66,-0.2979730145,-0.1390289559,0.2560241900,0.1585123595,,, +4.1562500000,66,-0.2036004516,-0.2453224994,-0.1722950538,-0.2224224967,,, +4.1582031250,66,-0.0954139356,-0.2878046462,-0.5581706885,-0.7674241380,,, +4.1601562500,66,0.0251066627,-0.2628768475,-0.8471029933,-1.3430899920,,, +4.1621093750,66,0.1562581540,-0.1717882526,-1.0000234311,-1.8065303708,,, +4.1640625000,66,0.2961436944,-0.0205473777,-0.9993320349,-2.0443269078,,, +4.1660156250,66,0.4427058439,0.1804984590,-0.8515892936,-2.0034243296,,, +4.1679687500,66,0.5937624426,0.4173866035,-0.5864435308,-1.7054909199,,, +4.1699218750,66,0.7470446740,0.6735149789,-0.2519611182,-1.2408136498,,, +4.1718750000,66,0.9002366516,0.9308023856,0.0929128502,-0.7434027593,,, +4.1738281250,66,1.0510158332,1.1709522700,0.3875888477,-0.3541303494,,, +4.1757812500,66,1.1970935578,1.3767318295,0.5793235910,-0.1820069115,,, +4.1777343750,66,1.3362549928,1.5331772473,0.6314885873,-0.2742098809,,, +4.1796875000,66,1.4663977946,1.6286410045,0.5293283952,-0.6030794553,,, +4.1816406250,66,1.5855688039,1.6556082277,0.2823114291,-1.0736465122,,, +4.1835937500,66,1.6919981338,1.6112251340,-0.0772931281,-1.5496300276,,, +4.1855468750,66,1.7841300545,1.4975027144,-0.4993909303,-1.8907792614,,, +4.1875000000,67,1.8606501325,1.3211814381,-0.9238158916,-1.9913265080,,, +4.1894531250,67,1.9205081508,1.0932664022,-1.2896540573,-1.8090116300,,, +4.1914062500,67,1.9629364072,0.8282653288,-1.5446859386,-1.3767233769,,, +4.1933593750,67,1.9874630720,0.5431825324,-1.6534768674,-0.7935665021,,, +4.1953125000,67,1.9939203691,0.2563389990,-1.6028554903,-0.1978022608,,, +4.1972656250,67,1.9824474401,-0.0138991583,-1.4039273225,0.2709223608,,, +4.1992187500,67,1.9534878385,-0.2503952134,-1.0903099501,0.5097058867,,, +4.2011718750,67,1.9077816995,-0.4384304499,-0.7128649509,0.4804346480,,, +4.2031250000,67,1.8463527226,-0.5667240212,-0.3317472444,0.2200519648,,, +4.2050781250,67,1.7704901943,-0.6282129457,-0.0070103880,-0.1697587238,,, +4.2070312500,67,1.6817263655,-0.6205378624,0.2107687625,-0.5506475615,,, +4.2089843750,67,1.5818095810,-0.5462006894,0.2883856437,-0.7857328466,,, +4.2109375000,67,1.4726736302,-0.4123832074,0.2151939418,-0.7773430197,,, +4.2128906250,67,1.3564038565,-0.2304392368,0.0047740895,-0.4940201198,,, +4.2148437500,67,1.2352006190,-0.0150958368,-0.3071756400,0.0206182032,,, +4.2167968750,67,1.1113407452,0.2165807531,-0.6683970141,0.6595890627,,, +4.2187500000,67,0.9871376509,0.4463823054,-1.0182130516,1.2816197960,,, +4.2207031250,67,0.8649008250,0.6562354267,-1.2969845298,1.7496219805,,, +4.2226562500,67,0.7468953886,0.8294689585,-1.4554088695,1.9680216043,,, +4.2246093750,67,0.6353024370,0.9519835582,-1.4622130084,1.9087164597,,, +4.2265625000,67,0.5321808579,1.0132418846,-1.3090419982,1.6185487203,,, +4.2285156250,67,0.4394312958,1.0070103234,-1.0117818195,1.2062467293,,, +4.2304687500,67,0.3587628923,0.9318005117,-0.6081102800,0.8124168195,,, +4.2324218750,67,0.2916633857,0.7909798574,-0.1516573363,0.5708113584,,, +4.2343750000,67,0.2393730925,0.5925433293,0.2963157384,0.5714900213,,, +4.2363281250,67,0.2028632272,0.3485624168,0.6764224849,0.8359722841,,, +4.2382812500,67,0.1828189388,0.0743496681,0.9403622301,1.3111925424,,, +4.2402343750,67,0.1796273630,-0.2126029475,1.0584014350,1.8839158714,,, +4.2421875000,67,0.1933708969,-0.4938378384,1.0239603649,2.4116646133,,, +4.2441406250,67,0.2238258157,-0.7512131211,0.8545909048,2.7616806785,,, +4.2460937500,67,0.2704662548,-0.9681621471,0.5891934543,2.8472459016,,, +4.2480468750,67,0.3324734877,-1.1308434069,0.2819066320,2.6514066751,,, +4.2500000000,68,0.4087503374,-1.2291006398,-0.0063782440,2.2316009870,,, +4.2519531250,68,0.4979404678,-1.2571662077,-0.2175559673,1.7039198587,,, +4.2539062500,68,0.5984522198,-1.2140586996,-0.3054135510,1.2113165731,,, +4.2558593750,68,0.7084865710,-1.1036470488,-0.2428850277,0.8844763006,,, +4.2578125000,68,0.8260687334,-0.9343767041,-0.0263246804,0.8060700935,,, +4.2597656250,68,0.9490828322,-0.7186769593,0.3238671647,0.9881894631,,, +4.2617187500,68,1.0753090606,-0.4720907790,0.7663635456,1.3691451581,,, +4.2636718750,68,1.2024626597,-0.2121878097,1.2452899029,1.8305064323,,, +4.2656250000,68,1.3282340397,0.0426636172,1.6988694728,2.2297096002,,, +4.2675781250,68,1.4503293414,0.2745798515,2.0689887592,2.4392974435,,, +4.2695312500,68,1.5665107261,0.4674111590,2.3101935001,2.3820335613,,, +4.2714843750,68,1.6746356902,0.6078697073,2.3967142401,2.0522661742,,, +4.2734375000,68,1.7726947142,0.6864576391,2.3264275141,1.5176843841,,, +4.2753906250,68,1.8588465878,0.6981305123,2.1211359331,0.9009836262,,, +4.2773437500,68,1.9314507922,0.6426498387,1.8231238060,0.3464632514,,, +4.2792968750,68,1.9890963729,0.5246001367,1.4885250224,-0.0192912420,,, +4.2812500000,68,2.0306267967,0.3530693071,1.1785364181,-0.1218676333,,, +4.2832031250,68,2.0551603574,0.1410146183,0.9498454096,0.0408140743,,, +4.2851562500,68,2.0621057748,-0.0956414852,0.8457630497,0.3981659818,,, +4.2871093750,68,2.0511727100,-0.3391226985,0.8894437689,0.8265097401,,, +4.2890625000,68,2.0223770174,-0.5710398001,1.0802480374,1.1831993969,,, +4.2910156250,68,1.9760406367,-0.7736746840,1.3938146394,1.3459355230,,, +4.2929687500,68,1.9127861309,-0.9312179391,1.7858314422,1.2464937910,,, +4.2949218750,68,1.8335259624,-1.0308736697,2.1989174610,0.8896220976,,, +4.2968750000,68,1.7394466972,-1.0637545110,2.5715444028,0.3519252848,,, +4.2988281250,68,1.6319884124,-1.0255044199,2.8476081918,-0.2389585654,,, +4.3007812500,68,1.5128196679,-0.9166058065,2.9851597201,-0.7391846608,,, +4.3027343750,68,1.3838084809,-0.7423495814,2.9629350017,-1.0279873468,,, +4.3046875000,68,1.2469898099,-0.5124701989,2.7836676421,-1.0406594349,,, +4.3066406250,68,1.1045301191,-0.2404711377,2.4736676851,-0.7861874243,,, +4.3085937500,68,0.9586896427,0.0573121547,2.0787324091,-0.3447102054,,, +4.3105468750,68,0.8117830097,0.3628465198,1.6570259422,0.1545015847,,, +4.3125000000,69,0.6661389185,0.6576534641,1.2700366680,0.5685098797,,, +4.3144531250,69,0.5240595679,0.9240923317,0.9730207659,0.7798971961,,, +4.3164062500,69,0.3877805540,1.1465848071,0.8064202497,0.7289380156,,, +4.3183593750,69,0.2594319352,1.3126953713,0.7895920627,0.4299364698,,, +4.3203125000,69,0.1410011478,1.4139923816,0.9178248127,-0.0327469941,,, +4.3222656250,69,0.0342984199,1.4466297423,1.1631076421,-0.5278904450,,, +4.3242187500,69,-0.0590747099,1.4116086196,1.4785312977,-0.9134690406,,, +4.3261718750,69,-0.1377532176,1.3147009640,1.8056357159,-1.0756938290,,, +4.3281250000,69,-0.2006322769,1.1660401902,2.0835594850,-0.9603302961,,, +4.3300781250,69,-0.2468863843,0.9794075707,2.2585658828,-0.5877118897,,, +4.3320312500,69,-0.2759835928,0.7712641232,2.2924615221,-0.0473323128,,, +4.3339843750,69,-0.2876946035,0.5595955162,2.1685961037,0.5265029215,,, +4.3359375000,69,-0.2820965579,0.3626505583,1.8945085241,0.9912942276,,, +4.3378906250,69,-0.2595714633,0.1976612564,1.5008069243,1.2352009977,,, +4.3398437500,69,-0.2207992789,0.0796337146,1.0364568395,1.2074834532,,, +4.3417968750,69,-0.1667457854,0.0202942054,0.5612110622,0.9321921234,,, +4.3437500000,69,-0.0986454486,0.0272639229,0.1363600204,0.5013551605,,, +4.3457031250,69,-0.0179795783,0.1035199844,-0.1847569444,0.0495327682,,, +4.3476562500,69,0.0735498348,0.2471802818,-0.3650017733,-0.2832852384,,, +4.3496093750,69,0.1740501465,0.4516272044,-0.3891646419,-0.3902679261,,, +4.3515625000,69,0.2814714245,0.7059616213,-0.2662759576,-0.2272397105,,, +4.3535156250,69,0.3936425677,0.9957554852,-0.0281435849,0.1750013975,,, +4.3554687500,69,0.5083095470,1.3040505907,0.2756565802,0.7189218640,,, +4.3574218750,69,0.6231750968,1.6125338587,0.5855561651,1.2667911791,,, +4.3593750000,69,0.7359391633,1.9028072080,0.8413246466,1.6782493276,,, +4.3613281250,69,0.8443394013,2.1576634762,0.9915009400,1.8486088245,,, +4.3632812500,69,0.9461910085,2.3622794344,1.0014569762,1.7373955075,,, +4.3652343750,69,1.0394252021,2.5052427173,0.8588370807,1.3793073974,,, +4.3671875000,69,1.1221256620,2.5793410739,0.5755257139,0.8745894630,,, +4.3691406250,69,1.1925623031,2.5820589167,0.1858368700,0.3614634389,,, +4.3710937500,69,1.2492217852,2.5157465583,-0.2587930563,-0.0218301645,,, +4.3730468750,69,1.2908342261,2.3874503486,-0.6977825040,-0.1749739192,,, +4.3750000000,70,1.3163956500,2.2084155704,-1.0708097558,-0.0630998880,,, +4.3769531250,70,1.3251857777,1.9932967727,-1.3271809929,0.2736439729,,, +4.3789062500,70,1.3167808478,1.7591306201,-1.4337024022,0.7311094685,,, +4.3808593750,70,1.2910612434,1.5241428955,-1.3798303292,1.1697267948,,, +4.3828125000,70,1.2482137908,1.3064728615,-1.1792974030,1.4528133730,,, +4.3847656250,70,1.1887286903,1.1229039444,-0.8679614314,1.4841131497,,, +4.3867187500,70,1.1133911327,0.9876892639,-0.4982121633,1.2342773346,,, +4.3886718750,70,1.0232677470,0.9115539196,-0.1308071265,0.7490281674,,, +4.3906250000,70,0.9196881186,0.9009436148,0.1745918373,0.1367672499,,, +4.3925781250,70,0.8042216990,0.9575720235,0.3687073671,-0.4609765708,,, +4.3945312500,70,0.6786505135,1.0782984702,0.4203139572,-0.9081617883,,, +4.3964843750,70,0.5449381429,1.2553444594,0.3210897333,-1.1113297160,,, +4.3984375000,70,0.4051955240,1.4768339620,0.0868970104,-1.0450157664,,, +4.4003906250,70,0.2616441652,1.7276197869,-0.2447077262,-0.7585138539,,, +4.4023437500,70,0.1165774236,1.9903384170,-0.6203464722,-0.3621419031,,, +4.4042968750,70,-0.0276794796,2.2466197569,-0.9791601582,0.0032253328,,, +4.4062500000,70,-0.1688100058,2.4783674333,-1.2623176879,0.2050039337,,, +4.4082031250,70,-0.3045466967,2.6690203732,-1.4222123093,0.1554798525,,, +4.4101562500,70,-0.4327107169,2.8047076854,-1.4299127515,-0.1639080418,,, +4.4121093750,70,-0.5512498488,2.8752163119,-1.2797083739,-0.6972383482,,, +4.4140625000,70,-0.6582742734,2.8747039723,-0.9900401802,-1.3291938035,,, +4.4160156250,70,-0.7520895132,2.8021076831,-0.6006724611,-1.9164315815,,, +4.4179687500,70,-0.8312259575,2.6612193624,-0.1665453544,-2.3266416693,,, +4.4199218750,70,-0.8944644553,2.4604232444,0.2507344321,-2.4745906315,,, +4.4218750000,70,-0.9408575268,2.2121134121,0.5924396323,-2.3452742079,,, +4.4238281250,70,-0.9697458223,1.9318320587,0.8118185958,-1.9978351721,,, +4.4257812500,70,-0.9807695408,1.6371885658,0.8813251248,-1.5491744251,,, +4.4277343750,70,-0.9738746079,1.3466347673,0.7968561718,-1.1417486409,,, +4.4296875000,70,-0.9493135052,1.0781817965,0.5783376397,-0.9043816251,,, +4.4316406250,70,-0.9076407364,0.8481479881,0.2665673340,-0.9168311160,,, +4.4335937500,70,-0.8497030101,0.6700251376,-0.0831929176,-1.1878233332,,, +4.4355468750,70,-0.7766243111,0.5535421702,-0.4098776254,-1.6525762885,,, +4.4375000000,71,-0.6897861214,0.5039915002,-0.6561812935,-2.1904913958,,, +4.4394531250,71,-0.5908031369,0.5218650478,-0.7775354976,-2.6581651958,,, +4.4414062500,71,-0.4814949069,0.6028252823,-0.7491008760,-2.9286740199,,, +4.4433593750,71,-0.3638538901,0.7380132991,-0.5696847238,-2.9263649878,,, +4.4453125000,71,-0.2400104896,0.9146724357,-0.2619737358,-2.6476181049,,, +4.4472656250,71,-0.1121956767,1.1170439257,0.1309546061,-2.1618889151,,, +4.4492187500,71,0.0172981403,1.3274721220,0.5522988794,-1.5927454712,,, +4.4511718750,71,0.1461573184,1.5276422030,0.9403406365,-1.0840961372,,, +4.4531250000,71,0.2720875484,1.6998640384,1.2380198892,-0.7608632941,,, +4.4550781250,71,0.3928540792,1.8283126724,1.4017879336,-0.6948800433,,, +4.4570312500,71,0.5063208944,1.9001389050,1.4083588351,-0.8853553589,,, +4.4589843750,71,0.6104881540,1.9063725124,1.2583081679,-1.2592602005,,, +4.4609375000,71,0.7035272470,1.8425551043,0.9759586441,-1.6915272087,,, +4.4628906250,71,0.7838128398,1.7090584726,0.6055705867,-2.0395261576,,, +4.4648437500,71,0.8499513595,1.5110662145,0.2044307211,-2.1823646623,,, +4.4667968750,71,0.9008054142,1.2582198935,-0.1660841567,-2.0542410744,,, +4.4687500000,71,0.9355137218,0.9639543981,-0.4500766717,-1.6627065276,,, +4.4707031250,71,0.9535061982,0.6445688262,-0.6058409622,-1.0868289761,,, +4.4726562500,71,0.9545139419,0.3180976692,-0.6123603775,-0.4557602779,,, +4.4746093750,71,0.9385739386,0.0030609948,-0.4725787110,0.0864217184,,, +4.4765625000,71,0.9060284047,-0.2828192366,-0.2129354578,0.4199625242,,, +4.4785156250,71,0.8575187805,-0.5238472217,0.1207624943,0.4820168927,,, +4.4804687500,71,0.7939744784,-0.7074401145,0.4704896916,0.2836425515,,, +4.4824218750,71,0.7165965835,-0.8249978054,0.7750579272,-0.0934536031,,, +4.4843750000,71,0.6268367912,-0.8724950455,0.9796684647,-0.5195230632,,, +4.4863281250,71,0.5263719518,-0.8507546416,1.0444727603,-0.8525390365,,, +4.4882812500,71,0.4170746667,-0.7653826883,0.9508081804,-0.9773120656,,, +4.4902343750,71,0.3009804516,-0.6263703684,0.7041373278,-0.8372358165,,, +4.4921875000,71,0.1802520417,-0.4473901087,0.3332329999,-0.4499609040,,, +4.4941406250,71,0.0571414645,-0.2448351844,-0.1142644525,0.0973003882,,, +4.4960937500,71,-0.0660494576,-0.0366697621,-0.5792255937,0.6715529087,,, +4.4980468750,71,-0.1870094805,0.1588304158,-1.0001971740,1.1303649800,,, +4.5000000000,72,-0.3034584827,0.3243588722,-1.3229268867,1.3608217321,,, +4.5019531250,72,-0.4131874698,0.4447914337,-1.5087643169,1.3104101833,,, +4.5039062500,72,-0.5140973385,0.5082468603,-1.5406298385,1.0013718927,,, +4.5058593750,72,-0.6042357218,0.5069210956,-1.4256220308,0.5245898457,,, +4.5078125000,72,-0.6818312697,0.4376369469,-1.1938577650,0.0146850799,,, +4.5097656250,72,-0.7453247658,0.3020708551,-0.8937258975,-0.3868518048,,, +4.5117187500,72,-0.7933965339,0.1066409274,-0.5842941166,-0.5703900320,,, +4.5136718750,72,-0.8249896554,-0.1379359679,-0.3260519019,-0.4881349018,,, +4.5156250000,72,-0.8393285912,-0.4173871715,-0.1714317212,-0.1671360493,,, +4.5175781250,72,-0.8359328803,-0.7148754657,-0.1565851298,0.2982365428,,, +4.5195312500,72,-0.8146256778,-1.0121694579,-0.2956949828,0.7722855732,,, +4.5214843750,72,-0.7755369800,-1.2909115075,-0.5787099535,1.1153233073,,, +4.5234375000,72,-0.7191014819,-1.5338947865,-0.9728545093,1.2221179598,,, +4.5253906250,72,-0.6460511039,-1.7262604279,-1.4276794429,1.0509109906,,, +4.5273437500,72,-0.5574023186,-1.8565312848,-1.8828665917,0.6350508264,,, +4.5292968750,72,-0.4544384992,-1.9174102193,-2.2775723923,0.0740527185,,, +4.5312500000,72,-0.3386875992,-1.9062872569,-2.5598552254,-0.4934669717,,, +4.5332031250,72,-0.2118955528,-1.8254202443,-2.6947184477,-0.9275661762,,, +4.5351562500,72,-0.0759958640,-1.6817764157,-2.6695166092,-1.1251111869,,, +4.5371093750,72,0.0669240862,-1.4865459163,-2.4958830387,-1.0478201047,,, +4.5390625000,72,0.2146594220,-1.2543612078,-2.2078787851,-0.7325319501,,, +4.5410156250,72,0.3649262091,-1.0022767892,-1.8566514268,-0.2808891296,,, +4.5429687500,72,0.5154012710,-0.7485803789,-1.5024358564,0.1687368793,,, +4.5449218750,72,0.6637626895,-0.5115184564,-1.2051431287,0.4793802013,,, +4.5468750000,72,0.8077302793,-0.3080250331,-1.0150033625,0.5532219800,,, +4.5488281250,72,0.9451053287,-0.1525422964,-0.9647202460,0.3585927808,,, +4.5507812500,72,1.0738089097,-0.0560153611,-1.0643592379,-0.0611664462,,, +4.5527343750,72,1.1919180886,-0.0251312245,-1.2997657500,-0.5994151329,,, +4.5546875000,72,1.2976994013,-0.0618549880,-1.6347597600,-1.1152876607,,, +4.5566406250,72,1.3896390083,-0.1632956802,-2.0167650894,-1.4721647614,,, +4.5585937500,72,1.4664690011,-0.3219110300,-2.3849965867,-1.5749992386,,, +4.5605468750,72,1.5271893998,-0.5260369027,-2.6799300340,-1.3962673245,,, +4.5625000000,73,1.5710854567,-0.7607044707,-2.8525797785,-0.9834341811,,, +4.5644531250,73,1.5977399627,-1.0086881261,-2.8721390198,-0.4458882828,,, +4.5664062500,73,1.6070403421,-1.2517110494,-2.7307926864,0.0750738127,,, +4.5683593750,73,1.5991804101,-1.4717243569,-2.4449532003,0.4449856221,,, +4.5703125000,73,1.5746567641,-1.6521706148,-2.0527265589,0.5730546523,,, +4.5722656250,73,1.5342598708,-1.7791436008,-1.6080032960,0.4370142637,,, +4.5742187500,73,1.4790600063,-1.8423634249,-1.1720945528,0.0891725428,,, +4.5761718750,73,1.4103882944,-1.8358989994,-0.8042158370,-0.3579992140,,, +4.5781250000,73,1.3298131764,-1.7585874635,-0.5523005068,-0.7627880252,,, +4.5800781250,73,1.2391127236,-1.6141213006,-0.4455736435,-0.9931952793,,, +4.5820312500,73,1.1402432779,-1.4107970591,-0.4900427717,-0.9632496330,,, +4.5839843750,73,1.0353049699,-1.1609431838,-0.6676075554,-0.6567232921,,, +4.5859375000,73,0.9265047182,-0.8800668416,-0.9389269118,-0.1317504042,,, +4.5878906250,73,0.8161173572,-0.5857792204,-1.2495967306,0.4949197101,,, +4.5898437500,73,0.7064455761,-0.2965742279,-1.5386757369,1.0797204220,,, +4.5917968750,73,0.5997793679,-0.0305457378,-1.7482312832,1.4914036936,,, +4.5937500000,73,0.4983557018,0.1958671810,-1.8324179939,1.6467899274,,, +4.5957031250,73,0.4043191224,0.3690195704,-1.7646749347,1.5333357891,,, +4.5976562500,73,0.3196839674,0.4790049953,-1.5419200254,1.2123369013,,, +4.5996093750,73,0.2462988652,0.5203392187,-1.1850881055,0.8018897626,,, +4.6015625000,73,0.1858141336,0.4923354867,-0.7359285522,0.4442846724,,, +4.6035156250,73,0.1396526518,0.3991452656,-0.2505609464,0.2667684545,,, +4.6054687500,73,0.1089847139,0.2494616123,0.2092077687,0.3464329062,,, +4.6074218750,73,0.0947073068,0.0559058763,0.5854525300,0.6888541437,,, +4.6093750000,73,0.0974281735,-0.1658594803,0.8330956267,1.2263392611,,, +4.6113281250,73,0.1174549416,-0.3982300624,0.9268722666,1.8362628835,,, +4.6132812500,73,0.1547895080,-0.6228940561,0.8652115915,2.3744700787,,, +4.6152343750,73,0.2091277779,-0.8221159731,0.6704289233,2.7145927539,,, +4.6171875000,73,0.2798647620,-0.9799800896,0.3851995589,2.7825058429,,, +4.6191406250,73,0.3661049446,-1.0835068558,0.0658635905,2.5764814924,,, +4.6210937500,73,0.4666777393,-1.1235644084,-0.2263951996,2.1675190591,,, +4.6230468750,73,0.5801577627,-1.0955116081,-0.4351222096,1.6797617859,,, +4.6250000000,74,0.7048895722,-0.9995277474,-0.5174254152,1.2563684948,,, +4.6269531250,74,0.8390164318,-0.8406059200,-0.4506932491,1.0201947958,,, +4.6289062500,74,0.9805126069,-0.6282105035,-0.2361504336,1.0400606752,,, +4.6308593750,74,1.1272186178,-0.3756226233,0.1013022355,1.3118500697,,, +4.6328125000,74,1.2768788391,-0.0990192298,0.5169393476,1.7596228262,,, +4.6347656250,74,1.4271807833,0.1836500064,0.9531538204,2.2564344452,,, +4.6367187500,74,1.5757953839,0.4539096736,1.3484100378,2.6591574883,,, +4.6386718750,74,1.7204175698,0.6940425308,1.6468127708,2.8477608820,,, +4.6406250000,74,1.8588064232,0.8883208288,1.8068015425,2.7582813725,,, +4.6425781250,74,1.9888242165,1.0240991884,1.8076162900,2.4004499749,,, +4.6445312500,74,2.1084736448,1.0926928355,1.6525272909,1.8551416721,,, +4.6464843750,74,2.2159326036,1.0899799578,1.3683262804,1.2523462711,,, +4.6484375000,74,2.3095859006,1.0166861893,1.0011580075,0.7356967148,,, +4.6503906250,74,2.3880533484,0.8783313895,0.6093414487,0.4232751792,,, +4.6523437500,74,2.4502137454,0.6848424371,0.2542987589,0.3754372779,,, +4.6542968750,74,2.4952243254,0.4498590433,-0.0089952572,0.5784711068,,, +4.6562500000,74,2.5225353348,0.1897809985,-0.1405557019,0.9485678810,,, +4.6582031250,74,2.5318994836,-0.0773767053,-0.1215917416,1.3550140149,,, +4.6601562500,74,2.5233761032,-0.3332410374,0.0425938329,1.6562463823,,, +4.6621093750,74,2.4973299397,-0.5603627072,0.3234611086,1.7388870154,,, +4.6640625000,74,2.4544246030,-0.7434331761,0.6737120404,1.5490568705,,, +4.6660156250,74,2.3956107868,-0.8703520346,1.0346941135,1.1073843373,,, +4.6679687500,74,2.3221094662,-0.9330703130,1.3455753162,0.5035929330,,, +4.6699218750,74,2.2353903667,-0.9281509201,1.5528611541,-0.1278506335,,, +4.6718750000,74,2.1371460816,-0.8570071306,1.6187711499,-0.6443560325,,, +4.6738281250,74,2.0292622921,-0.7258024925,1.5271699006,-0.9340622854,,, +4.6757812500,74,1.9137846104,-0.5450191374,1.2861286457,-0.9462777297,,, +4.6777343750,74,1.7928826266,-0.3287246027,0.9267181038,-0.7051662362,,, +4.6796875000,74,1.6688117907,-0.0935882942,0.4982203282,-0.3029305332,,, +4.6816406250,74,1.5438737942,0.1422838163,0.0605050820,0.1256373982,,, +4.6835937500,74,1.4203761485,0.3606149953,-0.3252421313,0.4402623044,,, +4.6855468750,74,1.3005916648,0.5442357757,-0.6059965124,0.5337769481,,, +4.6875000000,75,1.1867185475,0.6782850799,-0.7450991679,0.3616207236,,, +4.6894531250,75,1.0808417985,0.7512506729,-0.7279133575,-0.0458401786,,, +4.6914062500,75,0.9848966090,0.7557763798,-0.5640510858,-0.5915485544,,, +4.6933593750,75,0.9006343794,0.6891797693,-0.2858235231,-1.1382914503,,, +4.6953125000,75,0.8295919626,0.5536441918,0.0568431064,-1.5462629044,,, +4.6972656250,75,0.7730646691,0.3560717697,0.4042340122,-1.7113596560,,, +4.6992187500,75,0.7320835075,0.1076075800,0.6961954140,-1.5937142246,,, +4.7011718750,75,0.7073970572,-0.1771318045,0.8815506957,-1.2286451918,,, +4.7031250000,75,0.6994582925,-0.4810716308,0.9261162687,-0.7170232349,,, +4.7050781250,75,0.7084165880,-0.7858634911,0.8180683872,-0.1976927769,,, +4.7070312500,75,0.7341150455,-1.0731584702,0.5698247750,0.1904930619,,, +4.7089843750,75,0.7760931892,-1.3258801506,0.2161477719,0.3466200344,,, +4.7109375000,75,0.8335949820,-1.5294087178,-0.1912357575,0.2352436612,,, +4.7128906250,75,0.9055820227,-1.6725936107,-0.5916599653,-0.1040406828,,, +4.7148437500,75,0.9907516933,-1.7485241180,-0.9249411604,-0.5676099354,,, +4.7167968750,75,1.0875599374,-1.7550041987,-1.1407273118,-1.0163880931,,, +4.7187500000,75,1.1942482732,-1.6946984350,-1.2063198145,-1.3141503457,,, +4.7207031250,75,1.3088745654,-1.5749389537,-1.1117493549,-1.3650567619,,, +4.7226562500,75,1.4293470197,-1.4072067990,-0.8713153803,-1.1401267432,,, +4.7246093750,75,1.5534608025,-1.2063239379,-0.5213494686,-0.6853963812,,, +4.7265625000,75,1.6789366463,-0.9894122598,-0.1145510234,-0.1095209589,,, +4.7285156250,75,1.8034607637,-0.7746921797,0.2882224250,0.4457817419,,, +4.7304687500,75,1.9247253723,-0.5802046399,0.6274315930,0.8443488711,,, +4.7324218750,75,2.0404691189,-0.4225456449,0.8541225023,0.9926689500,,, +4.7343750000,75,2.1485166978,-0.3157015938,0.9375408568,0.8652924374,,, +4.7363281250,75,2.2468169670,-0.2700666408,0.8699078068,0.5115942507,,, +4.7382812500,75,2.3334788969,-0.2917106258,0.6676133181,0.0420368882,,, +4.7402343750,75,2.4068047200,-0.3819486397,0.3686413597,-0.4022990058,,, +4.7421875000,75,2.4653197038,-0.5372422578,0.0266280616,-0.6885639889,,, +4.7441406250,75,2.5077980221,-0.7494393442,-0.2975215596,-0.7287198647,,, +4.7460937500,75,2.5332842755,-1.0063357220,-0.5451524192,-0.5038232777,,, +4.7480468750,75,2.5411102807,-1.2925195570,-0.6690309586,-0.0693559431,,, +4.7500000000,76,2.5309068373,-1.5904395907,-0.6407408097,0.4598607025,,, +4.7519531250,76,2.5026102646,-1.8816227439,-0.4551504180,0.9410331791,,, +4.7539062500,76,2.4564635937,-2.1479562012,-0.1312565572,1.2424500435,,, +4.7558593750,76,2.3930123955,-2.3729445845,0.2907278726,1.2795196457,,, +4.7578125000,76,2.3130953162,-2.5428545639,0.7555884121,1.0379153245,,, +4.7597656250,76,2.2178294858,-2.6476671023,1.2016582726,0.5774850673,,, +4.7617187500,76,2.1085910571,-2.6817709421,1.5703709030,0.0158543383,,, +4.7636718750,76,1.9869912128,-2.6443489882,1.8153283000,-0.5037839363,,, +4.7656250000,76,1.8548480639,-2.5394306555,1.9094729013,-0.8518646195,,, +4.7675781250,76,1.7141549288,-2.3756065405,1.8492462852,-0.9478890044,,, +4.7695312500,76,1.5670455506,-2.1654253249,1.6550872244,-0.7823947780,,, +4.7714843750,76,1.4157568593,-1.9245149770,1.3681918104,-0.4194367950,,, +4.7734375000,76,1.2625899337,-1.6704895403,1.0440405683,0.0211002578,,, +4.7753906250,76,1.1098698439,-1.4217177515,0.7437010408,0.3965085732,,, +4.7773437500,76,0.9599050784,-1.1960393636,0.5242608003,0.5805358262,,, +4.7792968750,76,0.8149472670,-1.0095186953,0.4298812850,0.4981690884,,, +4.7812500000,76,0.6771519036,-0.8753223314,0.4848661573,0.1463891898,,, +4.7832031250,76,0.5485407566,-0.8027992426,0.6898240980,-0.4047943849,,, +4.7851562500,76,0.4309666256,-0.7968274726,1.0215239751,-1.0313135792,,, +4.7871093750,76,0.3260810615,-0.8574729564,1.4364652040,-1.5888196689,,, +4.7890625000,76,0.2353056138,-0.9799842624,1.8776074501,-1.9520135294,,, +4.7910156250,76,0.1598071105,-1.1551236279,2.2832117252,-2.0487511289,,, +4.7929687500,76,0.1004774012,-1.3698112043,2.5964160593,-1.8795791037,,, +4.7949218750,76,0.0579179204,-1.6080375882,2.7740544977,-1.5173484663,,, +4.7968750000,76,0.0324293386,-1.8519810022,2.7933460183,-1.0870144847,,, +4.7988281250,76,0.0240064843,-2.0832512224,2.6554117160,-0.7311611225,,, +4.8007812500,76,0.0323386249,-2.2841735041,2.3850726003,-0.5707008606,,, +4.8027343750,76,0.0568151014,-2.4390229732,2.0269596471,-0.6715229445,,, +4.8046875000,76,0.0965362187,-2.5351234000,1.6385421141,-1.0262327344,,, +4.8066406250,76,0.1503291996,-2.5637337307,1.2811601055,-1.5559887231,,, +4.8085937500,76,0.2167689249,-2.5206605491,1.0104582016,-2.1319355040,,, +4.8105468750,76,0.2942030938,-2.4065537554,0.8677102354,-2.6103601764,,, +4.8125000000,77,0.3807813663,-2.2268648350,0.8733864765,-2.8719383531,,, +4.8144531250,77,0.4744879761,-1.9914706200,1.0239651955,-2.8543149329,,, +4.8164062500,77,0.5731772424,-1.7139887716,1.2924852311,-2.5690913743,,, +4.8183593750,77,0.6746113598,-1.4108327078,1.6327534812,-2.0985647332,,, +4.8203125000,77,0.7764998036,-1.1000718687,1.9865519422,-1.5731129703,,, +4.8222656250,77,0.8765396608,-0.8001767874,2.2927217084,-1.1354251124,,, +4.8242187500,77,0.9724561804,-0.5287364638,2.4967089712,-0.9013800796,,, +4.8261718750,77,1.0620428324,-0.3012374737,2.5590860833,-0.9282962831,,, +4.8281250000,77,1.1432001753,-0.1299899339,2.4617203709,-1.1992537828,,, +4.8300781250,77,1.2139728493,-0.0232752099,2.2106297309,-1.6277855809,,, +4.8320312500,77,1.2725840494,0.0152252174,1.8350800877,-2.0816518510,,, +4.8339843750,77,1.3174668731,-0.0133200891,1.3830651113,-2.4191806420,,, +4.8359375000,77,1.3472919950,-0.1029807663,0.9138720674,-2.5282143073,,, +4.8378906250,77,1.3609911820,-0.2434851294,0.4888915024,-2.3569865697,,, +4.8398437500,77,1.3577762390,-0.4209435481,0.1621019860,-1.9284665260,,, +4.8417968750,77,1.3371530517,-0.6188242626,-0.0282882720,-1.3342369414,,, +4.8437500000,77,1.2989304814,-0.8191135751,-0.0657413107,-0.7095830712,,, +4.8457031250,77,1.2432239556,-1.0035794980,0.0420878690,-0.1966177304,,, +4.8476562500,77,1.1704536914,-1.1550507228,0.2645984266,0.0944528794,,, +4.8496093750,77,1.0813375829,-1.2586217074,0.5530661221,0.1153086293,,, +4.8515625000,77,0.9768788762,-1.3026998292,0.8482896699,-0.1074742578,,, +4.8535156250,77,0.8583488492,-1.2798215664,1.0898697617,-0.4799457582,,, +4.8554687500,77,0.7272647974,-1.1871807747,1.2256752106,-0.8667735918,,, +4.8574218750,77,0.5853637134,-1.0268322042,1.2200215208,-1.1285780948,,, +4.8593750000,77,0.4345721175,-0.8055560461,1.0592877350,-1.1603758742,,, +4.8613281250,77,0.2769725720,-0.5343929396,0.7540964100,-0.9205938224,,, +4.8632812500,77,0.1147674604,-0.2278818444,0.3377168885,-0.4426994752,,, +4.8652343750,77,-0.0497593300,0.0969460905,-0.1390597246,0.1737419167,,, +4.8671875000,77,-0.2142821538,0.4217475192,-0.6157759128,0.7901346489,,, +4.8691406250,77,-0.3764740858,0.7281384848,-1.0316701926,1.2666277824,,, +4.8710937500,77,-0.5340474216,0.9989689433,-1.3350886679,1.5002471151,,, +4.8730468750,77,-0.6847934926,1.2195113658,-1.4914800578,1.4529348063,,, +4.8750000000,78,-0.8266210987,1.3784805497,-1.4887291762,1.1618134295,,, +4.8769531250,78,-0.9575928849,1.4688135405,-1.3389983846,0.7288628288,,, +4.8789062500,78,-1.0759590257,1.4881552932,-1.0767904254,0.2928403286,,, +4.8808593750,78,-1.1801876272,1.4390162213,-0.7535345695,-0.0088587702,,, +4.8828125000,78,-1.2689913149,1.3285906621,-0.4295395082,-0.0779465866,,, +4.8847656250,78,-1.3413495420,1.1682489313,-0.1645665474,0.1177516619,,, +4.8867187500,78,-1.3965262272,0.9727384009,-0.0084915397,0.5354336784,,, +4.8886718750,78,-1.4340824138,0.7591493261,0.0064898510,1.0690274817,,, +4.8906250000,78,-1.4538837276,0.5457175484,-0.1291006445,1.5782616551,,, +4.8925781250,78,-1.4561025052,0.3505475793,-0.4005288981,1.9271310783,,, +4.8945312500,78,-1.4412145527,0.1903451196,-0.7711285251,2.0212155477,,, +4.8964843750,78,-1.4099905946,0.0792474091,-1.1880010881,1.8336228720,,, +4.8984375000,78,-1.3634825600,0.0278329827,-1.5902485699,1.4124455238,,, +4.9003906250,78,-1.3030049489,0.0423798922,-1.9184558876,0.8676863106,,, +4.9023437500,78,-1.2301116029,0.1244241318,-2.1239464966,0.3412352724,,, +4.9042968750,78,-1.1465682886,0.2706490657,-2.1763694559,-0.0318750133,,, +4.9062500000,78,-1.0543215730,0.4731135773,-2.0684361890,-0.1603183729,,, +4.9082031250,78,-0.9554645364,0.7198030344,-1.8170691027,-0.0213305997,,, +4.9101562500,78,-0.8521999235,0.9954646592,-1.4607830777,0.3332388282,,, +4.9121093750,78,-0.7468013771,1.2826690512,-1.0537075782,0.7913356517,,, +4.9140625000,78,-0.6415734346,1.5630238465,-0.6571803441,1.2116193883,,, +4.9160156250,78,-0.5388109869,1.8184548833,-0.3302218543,1.4624156888,,, +4.9179687500,78,-0.4407589097,2.0324655359,-0.1203740553,1.4580247514,,, +4.9199218750,78,-0.3495725752,2.1912864033,-0.0563300945,1.1824326271,,, +4.9218750000,78,-0.2672799340,2.2848351796,-0.1435028267,0.6939247154,,, +4.9238281250,78,-0.1957458331,2.3074197727,-0.3632221130,0.1093348739,,, +4.9257812500,78,-0.1366391933,2.2581356393,-0.6756857169,-0.4277551494,,, +4.9277343750,78,-0.0914036220,2.1409296282,-1.0262039462,-0.7861524911,,, +4.9296875000,78,-0.0612319753,1.9643258748,-1.3537651566,-0.8828019935,,, +4.9316406250,78,-0.0470453150,1.7408328612,-1.6005877411,-0.7053513802,,, +4.9335937500,78,-0.0494766298,1.4860729821,-1.7211705629,-0.3153502432,,, +4.9355468750,78,-0.0688596048,1.2176953126,-1.6894319090,0.1687921148,,, +4.9375000000,79,-0.1052226362,0.9541473858,-1.5028247523,0.6044175730,,, +4.9394531250,79,-0.1582881971,0.7133916237,-1.1827870640,0.8638596287,,, +4.9414062500,79,-0.2274775640,0.5116559200,-0.7714567502,0.8695573748,,, +4.9433593750,79,-0.3119208228,0.3623054934,-0.3251625868,0.6154181277,,, +4.9453125000,79,-0.4104719780,0.2749146720,0.0942953165,0.1685728162,,, +4.9472656250,79,-0.5217289014,0.2546033265,0.4292176980,-0.3489578081,,, +4.9492187500,79,-0.6440577706,0.3016842145,0.6349403438,-0.7936620490,,, +4.9511718750,79,-0.7756215696,0.4116458180,0.6867390364,-1.0398480494,,, +4.9531250000,79,-0.9144121527,0.5754718584,0.5836300509,-1.0140928193,,, +4.9550781250,79,-1.0582853096,0.7802751969,0.3484745195,-0.7153880996,,, +4.9570312500,79,-1.2049982191,1.0102019029,0.0243706722,-0.2154615131,,, +4.9589843750,79,-1.3522486342,1.2475424359,-0.3321038667,0.3608153894,,, +4.9609375000,79,-1.4977151132,1.4739724379,-0.6597469374,0.8695632039,,, +4.9628906250,79,-1.6390975926,1.6718366010,-0.9023044392,1.1872199703,,, +4.9648437500,79,-1.7741575910,1.8253860646,-1.0172694626,1.2442787750,,, +4.9667968750,79,-1.9007573401,1.9218830419,-0.9825372493,1.0441923438,,, +4.9687500000,79,-2.0168971580,1.9524956297,-0.7998792476,0.6622647617,,, +4.9707031250,79,-2.1207504099,1.9129203886,-0.4946949950,0.2248355428,,, +4.9726562500,79,-2.2106954447,1.8036892625,-0.1120803216,-0.1255373057,,, +4.9746093750,79,-2.2853439475,1.6301394195,0.2901758589,-0.2693511952,,, +4.9765625000,79,-2.3435652127,1.4020480995,0.6505754977,-0.1431241791,,, +4.9785156250,79,-2.3845059111,1.1329579158,0.9134768946,0.2429852548,,, +4.9804687500,79,-2.4076050069,0.8392396431,1.0377519152,0.8077349196,,, +4.9824218750,79,-2.4126035613,0.5389578281,1.0031865887,1.4208335675,,, +4.9843750000,79,-2.3995492530,0.2506183117,0.8136281902,1.9384165404,,, +4.9863281250,79,-2.3687955346,-0.0081150163,0.4963886437,2.2422417819,,, +4.9882812500,79,-2.3209954416,-0.2216447614,0.0979971601,2.2718659228,,, +4.9902343750,79,-2.2570901603,-0.3775204941,-0.3230363720,2.0409840838,,, +4.9921875000,79,-2.1782925571,-0.4672998169,-0.7053201559,1.6334572485,,, +4.9941406250,79,-2.0860659551,-0.4871300015,-0.9941243061,1.1801180295,,, +4.9960937500,79,-1.9820985320,-0.4380096524,-1.1498833094,0.8227136387,,, +4.9980468750,79,-1.8682737854,-0.3257121680,-1.1543329395,0.6748700821,,, +5.0000000000,80,-1.7466375845,-0.1603763522,-1.0133258960,0.7907778809,,, +5.0019531250,80,-1.6193623838,0.0442072594,-0.7558877698,1.1501832513,,, +5.0039062500,80,-1.4887092262,0.2715645758,-0.4296605395,1.6637996964,,, +5.0058593750,80,-1.3569881999,0.5036931004,-0.0934434815,2.1976581802,,, +5.0078125000,80,-1.2265180427,0.7223234865,0.1920065113,2.6097233900,,, +5.0097656250,80,-1.0995855998,0.9101995123,0.3734820906,2.7887416438,,, +5.0117187500,80,-0.9784058458,1.0522872035,0.4136590743,2.6846741809,,, +5.0136718750,80,-0.8650831700,1.1368287746,0.2969582810,2.3223755747,,, +5.0156250000,80,-0.7615746042,1.1561678807,0.0320223151,1.7947688072,,, +5.0175781250,80,-0.6696556352,1.1072886197,-0.3495787333,1.2373876929,,, +5.0195312500,80,-0.5908892020,0.9920306864,-0.7982113491,0.7912637776,,, +5.0214843750,80,-0.5265984193,0.8169656645,-1.2538550893,0.5643290625,,, +5.0234375000,80,-0.4778435060,0.5929430700,-1.6553961456,0.6019124634,,, +5.0253906250,80,-0.4454033216,0.3343377946,-1.9500907366,0.8744153941,,, +5.0273437500,80,-0.4297618347,0.0580514151,-2.1017246503,1.2855433841,,, +5.0292968750,80,-0.4310997592,-0.2176629965,-2.0961983348,1.6988366614,,, +5.0312500000,80,-0.4492915060,-0.4744706216,-1.9436679217,1.9752272539,,, +5.0332031250,80,-0.4839075026,-0.6952306649,-1.6769089972,2.0113279575,,, +5.0351562500,80,-0.5342218403,-0.8651891910,-1.3461582575,1.7679577817,,, +5.0371093750,80,-0.5992251144,-0.9730058499,-1.0112367708,1.2810842306,,, +5.0390625000,80,-0.6776422336,-1.0115429027,-0.7321819631,0.6521816669,,, +5.0410156250,80,-0.7679548855,-0.9783615294,-0.5598477150,0.0206463353,,, +5.0429687500,80,-0.8684282659,-0.8758908121,-0.5279369107,-0.4741737440,,, +5.0449218750,80,-0.9771416022,-0.7112576149,-0.6477076617,-0.7309296190,,, +5.0468750000,80,-1.0920219385,-0.4957892223,-0.9061779735,-0.7138039286,,, +5.0488281250,80,-1.2108805886,-0.2442234228,-1.2681087129,-0.4620814304,,, +5.0507812500,80,-1.3314516197,0.0263188808,-1.6814562266,-0.0791367184,,, +5.0527343750,80,-1.4514316932,0.2975268915,-2.0854455323,0.2961405585,,, +5.0546875000,80,-1.5685205631,0.5511757620,-2.4200068164,0.5276493389,,, +5.0566406250,80,-1.6804615257,0.7703960980,-2.6351056175,0.5196096682,,, +5.0585937500,80,-1.7850811085,0.9408485953,-2.6985136108,0.2430355167,,, +5.0605468750,80,-1.8803273071,1.0517219050,-2.6008097778,-0.2561094667,,, +5.0625000000,81,-1.9643056971,1.0964841466,-2.3568331081,-0.8693103695,,, +5.0644531250,81,-2.0353127914,1.0733356694,-2.0033606508,-1.4550573074,,, +5.0664062500,81,-2.0918660563,0.9853314954,-1.5933726368,-1.8774607059,,, +5.0683593750,81,-2.1327300628,0.8401649133,-1.1877979518,-2.0433437411,,, +5.0703125000,81,-2.1569383129,0.6496273213,-0.8460256698,-1.9276473119,,, +5.0722656250,81,-2.1638103610,0.4287819942,-0.6166605270,-1.5801859265,,, +5.0742187500,81,-2.1529639285,0.1949094008,-0.5299621998,-1.1119038575,,, +5.0761718750,81,-2.1243218004,-0.0337023740,-0.5931459693,-0.6643990883,,, +5.0781250000,81,-2.0781133827,-0.2390377418,-0.7892766567,-0.3710681710,,, +5.0800781250,81,-2.0148708931,-0.4046149823,-1.0799280238,-0.3205213687,,, +5.0820312500,81,-1.9354202521,-0.5166409019,-1.4111933203,-0.5322950315,,, +5.0839843750,81,-1.8408668334,-0.5649782489,-1.7221106825,-0.9515176435,,, +5.0859375000,81,-1.7325763225,-0.5438584112,-1.9541909431,-1.4639911400,,, +5.0878906250,81,-1.6121510201,-0.4522896846,-2.0605636858,-1.9275536759,,, +5.0898437500,81,-1.4814020033,-0.2941326282,-2.0133168243,-2.2111275680,,, +5.0917968750,81,-1.3423176334,-0.0778372363,-1.8078863332,-2.2307496672,,, +5.0937500000,81,-1.1970289602,0.1841397579,-1.4638122005,-1.9727082529,,, +5.0957031250,81,-1.0477726300,0.4761968321,-1.0217426354,-1.4974440852,,, +5.0976562500,81,-0.8968519450,0.7806687837,-0.5371529059,-0.9231450506,,, +5.0996093750,81,-0.7465967576,1.0790516273,-0.0717568831,-0.3935290636,,, +5.1015625000,81,-0.5993228998,1.3532858804,0.3160512697,-0.0386432739,,, +5.1035156250,81,-0.4572918596,1.5870087647,0.5802367728,0.0605784701,,, +5.1054687500,81,-0.3226714093,1.7666880223,0.6942375707,-0.1057119178,,, +5.1074218750,81,-0.1974978754,1.8825582973,0.6550436791,-0.4737943681,,, +5.1093750000,81,-0.0836407106,1.9292948033,0.4836074464,-0.9240666096,,, +5.1113281250,81,0.0172300123,1.9063773177,0.2215211213,-1.3140491636,,, +5.1132812500,81,0.1036726143,1.8181191368,-0.0755204938,-1.5176615528,,, +5.1152343750,81,0.1744988265,1.6733589894,-0.3464537832,-1.4600031402,,, +5.1171875000,81,0.2287943676,1.4848374116,-0.5344158317,-1.1381040672,,, +5.1191406250,81,0.2659347255,1.2683010852,-0.5956589197,-0.6219569676,,, +5.1210937500,81,0.2855958647,1.0413976154,-0.5064212314,-0.0355446316,,, +5.1230468750,81,0.2877596730,0.8224378352,-0.2666833457,0.4769386279,,, +5.1250000000,82,0.2727140524,0.6291119609,0.0997748588,0.7904161035,,, +5.1269531250,82,0.2410476527,0.4772491425,0.5490260142,0.8330311856,,, +5.1289062500,82,0.1936393388,0.3797069255,1.0237872588,0.6056784261,,, +5.1308593750,82,0.1316425791,0.3454680810,1.4622947750,0.1816118398,,, +5.1328125000,82,0.0564650256,0.3790078014,1.8078788465,-0.3137608160,,, +5.1347656250,82,-0.0302563554,0.4799754029,2.0177482916,-0.7373587768,,, +5.1367187500,82,-0.1266841655,0.6432127477,2.0696162562,-0.9677328371,,, +5.1386718750,82,-0.2308129654,0.8591081133,1.9651355553,-0.9384206846,,, +5.1406250000,82,-0.3405046063,1.1142608480,1.7296086645,-0.6562106359,,, +5.1425781250,82,-0.4535258831,1.3924104766,1.4080176886,-0.1993077643,,, +5.1445312500,82,-0.5675878504,1.6755654806,1.0579927992,0.3040952343,,, +5.1464843750,82,-0.6803861119,1.9452530501,0.7408144627,0.7109694146,,, +5.1484375000,82,-0.7896413789,2.1838026720,0.5118510098,0.9026891047,,, +5.1503906250,82,-0.8931395862,2.3755740553,0.4119210247,0.8176048487,,, +5.1523437500,82,-0.9887708637,2.5080437773,0.4609259666,0.4680219431,,, +5.1542968750,82,-1.0745666807,2.5726748855,0.6547448142,-0.0630694974,,, +5.1562500000,82,-1.1487345134,2.5655088240,0.9658744271,-0.6446177006,,, +5.1582031250,82,-1.2096894268,2.4874384155,1.3477158784,-1.1332864255,,, +5.1601562500,82,-1.2560820195,2.3441428707,1.7418391182,-1.4125820254,,, +5.1621093750,82,-1.2868222408,2.1456893647,2.0870944088,-1.4246082938,,, +5.1640625000,82,-1.3010986638,1.9058289687,2.3291513140,-1.1857476481,,, +5.1660156250,82,-1.2983928763,1.6410360403,2.4289794064,-0.7819726488,,, +5.1679687500,82,-1.2784887380,1.3693580623,2.3689496718,-0.3450746779,,, +5.1699218750,82,-1.2414763407,1.1091561392,2.1556061584,-0.0163267336,,, +5.1718750000,82,-1.1877506038,0.8778239820,1.8186760281,0.0924586898,,, +5.1738281250,82,-1.1180045282,0.6905747147,1.4064720353,-0.0701983203,,, +5.1757812500,82,-1.0332172264,0.5593801014,0.9784033446,-0.4811063049,,, +5.1777343750,82,-0.9346369401,0.4921361672,0.5957609686,-1.0485289177,,, +5.1796875000,82,-0.8237593404,0.4921133950,0.3122128340,-1.6370997586,,, +5.1816406250,82,-0.7023014923,0.5577298380,0.1654886926,-2.1046992865,,, +5.1835937500,82,-0.5721719375,0.6826629660,0.1715497614,-2.3411890612,,, +5.1855468750,82,-0.4354374209,0.8562924444,0.3221509493,-2.2983894673,,, +5.1875000000,83,-0.2942868426,1.0644429647,0.5861751089,-2.0030868937,,, +5.1894531250,83,-0.1509930665,1.2903753228,0.9145312282,-1.5495073698,,, +5.1914062500,83,-0.0078732538,1.5159566289,1.2478533663,-1.0733211704,,, +5.1933593750,83,0.1327515833,1.7229280400,1.5258009031,-0.7143045847,,, +5.1953125000,83,0.2685970994,1.8941816051,1.6965112520,-0.5778936302,,, +5.1972656250,83,0.3974554981,2.0149571773,1.7247324378,-0.7061680201,,, +5.1992187500,83,0.5172340766,2.0738759200,1.5973685555,-1.0662189761,,, +5.2011718750,83,0.6259917611,2.0637383281,1.3255740854,-1.5590899047,,, +5.2031250000,83,0.7219729921,1.9820311065,0.9430705736,-2.0468403642,,, +5.2050781250,83,0.8036383653,1.8311075482,0.5009475766,-2.3903165013,,, +5.2070312500,83,0.8696914941,1.6180288239,0.0597573686,-2.4872766117,,, +5.2089843750,83,0.9191016207,1.3540772374,-0.3198655742,-2.3004229448,,, +5.2109375000,83,0.9511215819,1.0539753777,-0.5865995176,-1.8676570598,,, +5.2128906250,83,0.9653008144,0.7348656056,-0.7063817889,-1.2917478222,,, +5.2148437500,83,0.9614931712,0.4151210244,-0.6676690416,-0.7122433033,,, +5.2167968750,83,0.9398594136,0.1130708373,-0.4831923907,-0.2673240539,,, +5.2187500000,83,0.9008643345,-0.1542710409,-0.1879342727,-0.0560517960,,, +5.2207031250,83,0.8452685633,-0.3723854716,0.1663576421,-0.1113590151,,, +5.2226562500,83,0.7741151959,-0.5302534478,0.5192648008,-0.3911809955,,, +5.2246093750,83,0.6887114846,-0.6211172257,0.8111394620,-0.7901593766,,, +5.2265625000,83,0.5906059079,-0.6429441709,0.9924229769,-1.1687081131,,, +5.2285156250,83,0.4815610215,-0.5985609928,1.0313891358,-1.3914740663,,, +5.2304687500,83,0.3635225671,-0.4954490203,0.9191063872,-1.3646495409,,, +5.2324218750,83,0.2385853785,-0.3452148135,0.6708459275,-1.0619086187,,, +5.2343750000,83,0.1089566826,-0.1627730443,0.3237162546,-0.5318569220,,, +5.2363281250,83,-0.0230825617,0.0347013579,-0.0691074539,0.1150490207,,, +5.2382812500,83,-0.1552176102,0.2289787069,-0.4466603804,0.7365299229,,, +5.2402343750,83,-0.2851404666,0.4020536256,-0.7496823611,1.1972317527,,, +5.2421875000,83,-0.4105902913,0.5374084680,-0.9298506545,1.4055761201,,, +5.2441406250,83,-0.5293929792,0.6211729763,-0.9573131175,1.3386156318,,, +5.2460937500,83,-0.6394992141,0.6430992889,-0.8253484227,1.0480842577,,, +5.2480468750,83,-0.7390203308,0.5972842934,-0.5514274074,0.6459865957,,, +5.2500000000,84,-0.8262613606,0.4825889334,-0.1745101669,0.2736776303,,, +5.2519531250,84,-0.8997506781,0.3027252141,0.2510002115,0.0629092624,,, +5.2539062500,84,-0.9582657328,0.0660048222,0.6637056531,0.0995214514,,, +5.2558593750,84,-1.0008544139,-0.2152331273,1.0047471518,0.3997308890,,, +5.2578125000,84,-1.0268516736,-0.5254753270,1.2269400513,0.9055173838,,, +5.2597656250,84,-1.0358911190,-0.8471090151,1.3020878553,1.5003738808,,, +5.2617187500,84,-1.0279113697,-1.1616432838,1.2253355875,2.0411048172,,, +5.2636718750,84,-1.0031570682,-1.4509918096,1.0158848470,2.3969589760,,, +5.2656250000,84,-0.9621745275,-1.6987275692,0.7139594023,2.4853726508,,, +5.2675781250,84,-0.9058020908,-1.8912220625,0.3744941798,2.2945277542,,, +5.2695312500,84,-0.8351553727,-2.0185896121,0.0585308625,1.8865429329,,, +5.2714843750,84,-0.7516076399,-2.0753709061,-0.1763394654,1.3804234605,,, +5.2734375000,84,-0.6567656758,-2.0609081291,-0.2849977563,0.9194429811,,, +5.2753906250,84,-0.5524415511,-1.9793855365,-0.2418771113,0.6318967347,,, +5.2773437500,84,-0.4406207941,-1.8395326521,-0.0449985227,0.5959823627,,, +5.2792968750,84,-0.3234275199,-1.6540107984,0.2836666257,0.8184329414,,, +5.2812500000,84,-0.2030871275,-1.4385257492,0.7015640491,1.2327576194,,, +5.2832031250,84,-0.0818872182,-1.2107283899,1.1521298294,1.7175711819,,, +5.2851562500,84,0.0378625788,-0.9889800559,1.5735459306,2.1299879089,,, +5.2871093750,84,0.1538711724,-0.7910686550,1.9083145351,2.3449262460,,, +5.2890625000,84,0.2639062549,-0.6329651075,2.1121602350,2.2895506648,,, +5.2910156250,84,0.3658335227,-0.5277068307,2.1608738022,1.9634096879,,, +5.2929687500,84,0.4576541851,-0.4844861297,2.0540318616,1.4387491681,,, +5.2949218750,84,0.5375401059,-0.5080070703,1.8150133841,0.8409131568,,, +5.2968750000,84,0.6038659590,-0.5981556845,1.4873106937,0.3142019836,,, +5.2988281250,84,0.6552378394,-0.7500065104,1.1277098269,-0.0174571746,,, +5.3007812500,84,0.6905178242,-0.9541650131,0.7974026825,-0.0842502874,,, +5.3027343750,84,0.7088440565,-1.1974220089,0.5524155253,0.1106179744,,, +5.3046875000,84,0.7096459991,-1.4636744607,0.4348448755,0.4920324184,,, +5.3066406250,84,0.6926545908,-1.7350484335,0.4662660436,0.9337833676,,, +5.3085937500,84,0.6579071278,-1.9931459017,0.6443411590,1.2933833503,,, +5.3105468750,84,0.6057467847,-2.2203284641,0.9431551806,1.4513401151,,, +5.3125000000,85,0.5368167826,-2.4009484456,1.3172277130,1.3441203398,,, +5.3144531250,85,0.4520493072,-2.5224415341,1.7085759033,0.9817676687,,, +5.3164062500,85,0.3526493704,-2.5762047560,2.0557284543,0.4453445825,,, +5.3183593750,85,0.2400738980,-2.5581985607,2.3032868754,-0.1351026067,,, +5.3203125000,85,0.1160064092,-2.4692310238,2.4105448336,-0.6160181957,,, +5.3222656250,85,-0.0176722680,-2.3149043443,2.3578231567,-0.8795300444,,, +5.3242187500,85,-0.1589167337,-2.1052273590,2.1495338147,-0.8656208371,,, +5.3261718750,85,-0.3055526320,-1.8539210875,1.8134956685,-0.5884617176,,, +5.3281250000,85,-0.4553145219,-1.5774657255,1.3966085550,-0.1324328052,,, +5.3300781250,85,-0.6058853411,-1.2939555327,0.9575594706,0.3710778681,,, +5.3320312500,85,-0.7549367703,-1.0218414590,0.5576968567,0.7797375964,,, +5.3339843750,85,-0.9001697935,-0.7786491773,0.2514942983,0.9793100740,,, +5.3359375000,85,-1.0393547422,-0.5797619085,0.0780888799,0.9149740334,,, +5.3378906250,85,-1.1703701238,-0.4373529040,0.0552120366,0.6063358700,,, +5.3398437500,85,-1.2912395532,-0.3595420142,0.1764580759,0.1420218742,,, +5.3417968750,85,-1.4001661428,-0.3498351451,0.4123156688,-0.3446674875,,, +5.3437500000,85,-1.4955637468,-0.4068856788,0.7148014862,-0.7123682718,,, +5.3457031250,85,-1.5760845150,-0.5245944794,1.0249740873,-0.8504941082,,, +5.3476562500,85,-1.6406422713,-0.6925414975,1.2821575366,-0.7096615038,,, +5.3496093750,85,-1.6884313102,-0.8967188596,1.4334379108,-0.3153596294,,, +5.3515625000,85,-1.7189402808,-1.1205143079,1.4419533387,0.2388831742,,, +5.3535156250,85,-1.7319609150,-1.3458763952,1.2926861188,0.8169647592,,, +5.3554687500,85,-1.7275914490,-1.5545801674,0.9948545096,1.2773287031,,, +5.3574218750,85,-1.7062346764,-1.7295050555,0.5805314008,1.5115663829,,, +5.3593750000,85,-1.6685906676,-1.8558358511,0.0997047415,1.4739237638,,, +5.3613281250,85,-1.6156442845,-1.9221029995,-0.3874511859,1.1936279154,,, +5.3632812500,85,-1.5486477075,-1.9209896501,-0.8198901413,0.7666569495,,, +5.3652343750,85,-1.4690982813,-1.8498491710,-1.1451434770,0.3292110766,,, +5.3671875000,85,-1.3787120683,-1.7108970199,-1.3274333381,0.0201576948,,, +5.3691406250,85,-1.2793935721,-1.5110635768,-1.3531861329,-0.0572546622,,, +5.3710937500,85,-1.1732021620,-1.2615181818,-1.2330878156,0.1360816936,,, +5.3730468750,85,-1.0623157853,-0.9768975530,-1.0003611536,0.5641948531,,, +5.3750000000,86,-0.9489926046,-0.6742923707,-0.7055335942,1.1256778735,,, +5.3769531250,86,-0.8355312306,-0.3720626801,-0.4085109495,1.6812754210,,, +5.3789062500,86,-0.7242302476,-0.0885647019,-0.1691917450,2.0918537930,,, +5.3808593750,86,-0.6173477408,0.1591221826,-0.0380843700,2.2563497593,,, +5.3828125000,86,-0.5170615323,0.3563795177,-0.0483887234,2.1392993518,,, +5.3847656250,86,-0.4254308256,0.4920623759,-0.2107759343,1.7804034346,,, +5.3867187500,86,-0.3443599266,0.5592698809,-0.5116794871,1.2835099176,,, +5.3886718750,86,-0.2755646794,0.5558199363,-0.9153641502,0.7880336069,,, +5.3906250000,86,-0.2205422031,0.4843950700,-1.3694506764,0.4306478299,,, +5.3925781250,86,-0.1805444600,0.3523492393,-1.8130359787,0.3077480094,,, +5.3945312500,86,-0.1565561190,0.1711890825,-2.1861442077,0.4489756045,,, +5.3964843750,86,-0.1492770999,-0.0442341938,-2.4390368443,0.8090593249,,, +5.3984375000,86,-0.1591101072,-0.2767659280,-2.5399318659,1.2802101096,,, +5.4003906250,86,-0.1861533691,-0.5081495029,-2.4799298175,1.7216729828,,, +5.4023437500,86,-0.2301987107,-0.7203044356,-2.2743796415,1.9983365092,,, +5.4042968750,86,-0.2907349947,-0.8965919202,-1.9604716265,2.0178179461,,, +5.4062500000,86,-0.3669568692,-1.0229795631,-1.5914324596,1.7558597483,,, +5.4082031250,86,-0.4577786705,-1.0890240782,-1.2282265885,1.2630763879,,, +5.4101562500,86,-0.5618532358,-1.0886034079,-0.9300564826,0.6512015733,,, +5.4121093750,86,-0.6775952989,-1.0203472060,-0.7451414401,0.0626040856,,, +5.4140625000,86,-0.8032090572,-0.8877356563,-0.7032111811,-0.3685741565,,, +5.4160156250,86,-0.9367194285,-0.6988597284,-0.8108833593,-0.5530082702,,, +5.4179687500,86,-1.0760064506,-0.4658595810,-1.0506449191,-0.4704820621,,, +5.4199218750,86,-1.2188422203,-0.2040802705,-1.3835958841,-0.1752252042,,, +5.4218750000,86,-1.3629297270,0.0689963671,-1.7555281269,0.2191650444,,, +5.4238281250,86,-1.5059428989,0.3349691810,-2.1053922085,0.5710831710,,, +5.4257812500,86,-1.6455671620,0.5757996237,-2.3748333999,0.7499591584,,, +5.4277343750,86,-1.7795398023,0.7750687323,-2.5173114541,0.6722838628,,, +5.4296875000,86,-1.9056894224,0.9191215225,-2.5053835058,0.3247404243,,, +5.4316406250,86,-2.0219738046,0.9980189936,-2.3350155682,-0.2319000760,,, +5.4335937500,86,-2.1265155149,1.0062313592,-2.0262508859,-0.8791885736,,, +5.4355468750,86,-2.2176346268,0.9430241610,-1.6201308328,-1.4732182916,,, +5.4375000000,87,-2.2938779901,0.8125103403,-1.1723477113,-1.8838268707,,, +5.4394531250,87,-2.3540445339,0.6233646338,-0.7446178225,-2.0300383424,,, +5.4414062500,87,-2.3972061601,0.3882202064,-0.3951182456,-1.9020334170,,, +5.4433593750,87,-2.4227238610,0.1227895926,-0.1694765867,-1.5636286597,,, +5.4453125000,87,-2.4302587800,-0.1552287593,-0.0937168193,-1.1345869608,,, +5.4472656250,87,-2.4197780220,-0.4273820944,-0.1702596628,-0.7576092269,,, +5.4492187500,87,-2.3915551095,-0.6757472329,-0.3776001768,-0.5590555061,,, +5.4511718750,87,-2.3461650798,-0.8841772036,-0.6737124997,-0.6141621884,,, +5.4531250000,87,-2.2844743071,-1.0394237055,-1.0026511355,-0.9262895221,,, +5.4550781250,87,-2.2076252274,-1.1320571324,-1.3033203118,-1.4258882285,,, +5.4570312500,87,-2.1170162360,-1.1571200141,-1.5190452428,-1.9894694000,,, +5.4589843750,87,-2.0142771070,-1.1144683167,-1.6064542342,-2.4733793767,,, +5.4609375000,87,-1.9012403677,-1.0087768136,-1.5422879080,-2.7531234978,,, +5.4628906250,87,-1.7799091267,-0.8492081624,-1.3270746924,-2.7574616416,,, +5.4648437500,87,-1.6524219215,-0.6487687765,-0.9850998255,-2.4879311533,,, +5.4667968750,87,-1.5210151994,-0.4233964209,-0.5606724316,-2.0184464731,,, +5.4687500000,87,-1.3879840897,-0.1908431692,-0.1112718344,-1.4750849408,,, +5.4707031250,87,-1.2556421535,0.0305683685,0.3013596433,-1.0015984268,,, +5.4726562500,87,-1.1262808165,0.2232288025,0.6207902878,-0.7201023590,,, +5.4746093750,87,-1.0021291945,0.3714761692,0.8046480932,-0.6977152501,,, +5.4765625000,87,-0.8853150157,0.4626945055,0.8311828433,-0.9282907912,,, +5.4785156250,87,-0.7778273240,0.4882001711,0.7026192914,-1.3342479785,,, +5.4804687500,87,-0.6814816156,0.4438540950,0.4447793422,-1.7879963070,,, +5.4824218750,87,-0.5978880209,0.3303572386,0.1030322431,-2.1470824921,,, +5.4843750000,87,-0.5284230870,0.1532086532,-0.2647962918,-2.2934243817,,, +5.4863281250,87,-0.4742056565,-0.0776709570,-0.5974514594,-2.1658774205,,, +5.4882812500,87,-0.4360772644,-0.3486239355,-0.8398070801,-1.7772062704,,, +5.4902343750,87,-0.4145873958,-0.6432009067,-0.9514648948,-1.2108081772,,, +5.4921875000,87,-0.4099838634,-0.9433006450,-0.9130559961,-0.5980840456,,, +5.4941406250,87,-0.4222084728,-1.2304251097,-0.7292628686,-0.0826570094,,, +5.4960937500,87,-0.4508980521,-1.4869621467,-0.4280913135,0.2187570362,,, +5.4980468750,87,-0.4953908264,-1.6974064259,-0.0565056598,0.2481048929,,, +5.5000000000,88,-0.5547380276,-1.8494334914,0.3268928833,0.0216764470,,, +5.5019531250,88,-0.6277205339,-1.9347520468,0.6610043072,-0.3745854095,,, +5.5039062500,88,-0.7128702501,-1.9496750574,0.8917609537,-0.8088578311,,, +5.5058593750,88,-0.8084958522,-1.8953698631,0.9805671273,-1.1397765488,,, +5.5078125000,88,-0.9127124465,-1.7777698771,0.9103325544,-1.2553786482,,, +5.5097656250,88,-1.0234746239,-1.6071540441,0.6881598272,-1.1039747184,,, +5.5117187500,88,-1.1386123304,-1.3974234005,0.3442671112,-0.7084875368,,, +5.5136718750,88,-1.2558689255,-1.1651251996,-0.0726862491,-0.1603259105,,, +5.5156250000,88,-1.3729407621,-0.9282926691,-0.5031433361,0.4055287504,,, +5.5175781250,88,-1.4875175957,-0.7051813226,-0.8858877117,0.8473963675,,, +5.5195312500,88,-1.5973231139,-0.5129899621,-1.1675372477,1.0556276825,,, +5.5214843750,88,-1.7001548772,-0.3666555728,-1.3108152382,0.9825756119,,, +5.5234375000,88,-1.7939229721,-0.2778061624,-1.3003107596,0.6555949269,,, +5.5253906250,88,-1.8766866989,-0.2539445773,-1.1448313157,0.1695079465,,, +5.5273437500,88,-1.9466886520,-0.2979202262,-0.8759815876,-0.3393985241,,, +5.5292968750,88,-2.0023855962,-0.4077255604,-0.5431899203,-0.7307182519,,, +5.5312500000,88,-2.0424755980,-0.5766315153,-0.2059574701,-0.8983775800,,, +5.5332031250,88,-2.0659209368,-0.7936524792,0.0754624712,-0.7996561538,,, +5.5351562500,88,-2.0719663948,-1.0443083758,0.2495029466,-0.4668231772,,, +5.5371093750,88,-2.0601526052,-1.3116307291,0.2813692187,0.0017992321,,, +5.5390625000,88,-2.0303242251,-1.5773425626,0.1585123595,0.4688954117,,, +5.5410156250,88,-1.9826327901,-1.8231298624,-0.1073622856,0.7959209944,,, +5.5429687500,88,-1.9175341999,-2.0319159518,-0.4820648795,0.8812217433,,, +5.5449218750,88,-1.8357808791,-2.1890499144,-0.9141937546,0.6880577249,,, +5.5468750000,88,-1.7384087508,-2.2833262019,-1.3430899920,0.2548506590,,, +5.5488281250,88,-1.6267192511,-2.3077643309,-1.7082352303,-0.3151557556,,, +5.5507812500,88,-1.5022566977,-2.2600943022,-1.9586292160,-0.8819905745,,, +5.5527343750,88,-1.3667814117,-2.1429138970,-2.0606867553,-1.3071074050,,, +5.5546875000,88,-1.2222390601,-1.9635068841,-2.0034243296,-1.4911390182,,, +5.5566406250,88,-1.0707267578,-1.7333348175,-1.8001287734,-1.4009094457,,, +5.5585937500,88,-0.9144565220,-1.4672378640,-1.4862483388,-1.0783024784,,, +5.5605468750,88,-0.7557167182,-1.1824003902,-1.1138348424,-0.6285581245,,, +5.5625000000,89,-0.5968321736,-0.8971534422,-0.7434027593,-0.1912067704,,, +5.5644531250,89,-0.4401236560,-0.6296976224,-0.4344734408,0.0983907452,,, +5.5664062500,89,-0.2878674270,-0.3968354210,-0.2362774129,0.1463543260,,, +5.5683593750,89,-0.1422555788,-0.2128013964,-0.1800630731,-0.0737808452,,, +5.5703125000,89,-0.0053578478,-0.0882717777,-0.2742098809,-0.5136162839,,, +5.5722656250,89,0.1209144255,-0.0296225466,-0.5029073026,-1.0629718625,,, +5.5742187500,89,0.2348415605,-0.0384877320,-0.8286053667,-1.5799136355,,, +5.5761718750,89,0.3349254405,-0.1116487107,-1.1978552179,-1.9294997606,,, +5.5781250000,89,0.4199155345,-0.2412622291,-1.5496300276,-2.0206269320,,, +5.5800781250,89,0.4888305809,-0.4154112348,-1.8248302672,-1.8308801824,,, +5.5820312500,89,0.5409755534,-0.6189401022,-1.9754928627,-1.4125766594,,, +5.5839843750,89,0.5759536119,-0.8345159971,-1.9722698450,-0.8783479693,,, +5.5859375000,89,0.5936728299,-1.0438423599,-1.8090116300,-0.3702133605,,, +5.5878906250,89,0.5943475805,-1.2289398764,-1.5037410052,-0.0206204860,,, +5.5898437500,89,0.5784945563,-1.3734056001,-1.0958660506,0.0838682700,,, +5.5917968750,89,0.5469234939,-1.4635624100,-0.6400660027,-0.0737088081,,, +5.5937500000,89,0.5007227646,-1.4894186375,-0.1978022608,-0.4360953352,,, +5.5957031250,89,0.4412400853,-1.4453709321,0.1722233900,-0.8875626646,,, +5.5976562500,89,0.3700586849,-1.3306013384,0.4231773058,-1.2857031379,,, +5.5996093750,89,0.2889693462,-1.1491408816,0.5273507277,-1.5005565675,,, +5.6015625000,89,0.1999388121,-0.9095952132,0.4804346480,-1.4503457556,,, +5.6035156250,89,0.1050751081,-0.6245514339,0.3021471682,-1.1240260282,,, +5.6054687500,89,0.0065903913,-0.3097074419,0.0331158474,-0.5844674619,,, +5.6074218750,89,-0.0932380267,0.0172154953,-0.2714991390,0.0486036903,,, +5.6093750000,89,-0.1921077979,0.3377011311,-0.5506475615,0.6312306294,,, +5.6113281250,89,-0.2877320956,0.6337219505,-0.7469510439,1.0344786361,,, +5.6132812500,89,-0.3778799011,0.8889886983,-0.8156947331,1.1795584947,,, +5.6152343750,89,-0.4604153137,1.0900786097,-0.7318479622,1.0591963280,,, +5.6171875000,89,-0.5333351962,1.2273636852,-0.4940201198,0.7393949906,,, +5.6191406250,89,-0.5948044957,1.2956742933,-0.1247352956,0.3411063367,,, +5.6210937500,89,-0.6431886211,1.2946518465,0.3330173672,0.0068395588,,, +5.6230468750,89,-0.6770823119,1.2287659715,0.8224206030,-0.1386405926,,, +5.6250000000,90,-0.6953344902,1.1069949952,1.2816197960,-0.0227520957,,, +5.6269531250,90,-0.6970686623,0.9421920452,1.6532986780,0.3547702261,,, +5.6289062500,90,-0.6816985120,0.7501809838,1.8935487795,0.9215650689,,, +5.6308593750,90,-0.6489384129,0.5486452385,1.9786514592,1.5522464700,,, +5.6328125000,90,-0.5988086740,0.3558870302,1.9087164597,2.1025468705,,, +5.6347656250,90,-0.5316354290,0.1895435387,1.7076105446,2.4486458043,,, +5.6367187500,90,-0.4480451690,0.0653495492,1.4191876023,2.5209072806,,, +5.6386718750,90,-0.3489540148,-0.0039671193,1.1004076616,2.3227812199,,, +5.6406250000,90,-0.2355519177,-0.0095803637,0.8124168195,1.9296902615,,, +5.6425781250,90,-0.1092820630,0.0528116878,0.6109776702,1.4682085248,,, +5.6445312500,90,0.0281841607,0.1826798175,0.5377409749,1.0812401308,,, +5.6464843750,90,0.1749761907,0.3746939323,0.6137182695,0.8887421652,,, +5.6484375000,90,0.3290568075,0.6190882572,0.8359722841,0.9547577169,,, +5.6503906250,90,0.4882575731,0.9023360568,1.1780408419,1.2697950336,,, +5.6523437500,90,0.6503165675,1.2080868479,1.5940283795,1.7533827270,,, +5.6542968750,90,0.8129177654,1.5183007618,2.0257279595,2.2761011089,,, +5.6562500000,90,0.9737313617,1.8145009665,2.4116646133,2.6950517071,,, +5.6582031250,90,1.1304543406,2.0790568253,2.6966515776,2.8930438032,,, +5.6601562500,90,1.2808505782,2.2964083254,2.8403710775,2.8107578994,,, +5.6621093750,90,1.4227897763,2.4541464030,2.8236432263,2.4630706295,,, +5.6640625000,90,1.5542845456,2.5438738420,2.6514066751,1.9350663012,,, +5.6660156250,90,1.6735249899,2.5617867216,2.3519467888,1.3588273438,,, +5.6679687500,90,1.7789101847,2.5089358763,1.9724915710,0.8773636746,,, +5.6699218750,90,1.8690759999,2.3911501439,1.5718612816,0.6055656533,,, +5.6718750000,90,1.9429187795,2.2186267603,1.2113165731,0.5988808738,,, +5.6738281250,90,1.9996144636,2.0052174726,0.9450305387,0.8382980138,,, +5.6757812500,90,2.0386328179,1.7674601562,0.8116686274,1.2357515488,,, +5.6777343750,90,2.0597465218,1.5234234704,0.8283877981,1.6584642659,,, +5.6796875000,90,2.0630349561,1.2914451225,0.9881894631,1.9655541211,,, +5.6816406250,90,2.0488826242,1.0888517289,1.2610383763,2.0468706050,,, +5.6835937500,90,2.0179722341,0.9307495438,1.5985730405,1.8534146675,,, +5.6855468750,90,1.9712725628,0.8289703837,1.9416737911,1.4110028939,,, +5.6875000000,91,1.9100213158,0.7912462530,2.2297096002,0.8134288364,,, +5.6894531250,91,1.8357032814,0.8206702268,2.4100231581,0.1969936073,,, +5.6914062500,91,1.7500241632,0.9154811845,2.4461766627,-0.2966160287,,, +5.6933593750,91,1.6548805482,1.0691874046,2.3236737610,-0.5589301988,,, +5.6953125000,91,1.5523265372,1.2710203983,2.0522661742,-0.5442013947,,, +5.6972656250,91,1.4445376213,1.5066873339,1.6644854843,-0.2817283363,,, +5.6992187500,91,1.3337724376,1.7593695762,1.2106284988,0.1323774342,,, +5.7011718750,91,1.2223330737,2.0108977081,0.7509769761,0.5617238545,,, +5.7031250000,91,1.1125246154,2.2430210881,0.3464632514,0.8671961135,,, +5.7050781250,91,1.0066146476,2.4386834090,0.0492353552,0.9452448410,,, +5.7070312500,91,0.9067934162,2.5832153009,-0.1054091319,0.7564096370,,, +5.7089843750,91,0.8151353488,2.6653608076,-0.1044644353,0.3362592153,,, +5.7109375000,91,0.7335626087,2.6780661478,0.0408140743,-0.2142513052,,, +5.7128906250,91,0.6638113204,2.6189757492,0.2967190012,-0.7563641064,,, +5.7148437500,91,0.6074010568,2.4906009556,0.6123964350,-1.1514842350,,, +5.7167968750,91,0.5656081242,2.3001496321,0.9278212030,-1.2991223336,,, +5.7187500000,91,0.5394431118,2.0590285388,1.1831993969,-1.1644158996,,, +5.7207031250,91,0.5296330990,1.7820531630,1.3283334055,-0.7876864406,,, +5.7226562500,91,0.5366088327,1.4864200977,1.3304905339,-0.2734131064,,, +5.7246093750,91,0.5604970980,1.1905136129,1.1795493727,0.2383554988,,, +5.7265625000,91,0.6011184175,0.9126296284,0.8896220976,0.6103166628,,, +5.7285156250,91,0.6579901179,0.6697060538,0.4968997821,0.7454556796,,, +5.7304687500,91,0.7303347120,0.4761480209,0.0540561058,0.6135264587,,, +5.7324218750,91,0.8170934473,0.3428299123,-0.3779190949,0.2592141638,,, +5.7343750000,91,0.9169447859,0.2763437629,-0.7391846608,-0.2102560020,,, +5.7363281250,91,1.0283274909,0.2785464299,-0.9803373035,-0.6546663921,,, +5.7382812500,91,1.1494679160,0.3464370935,-1.0700784766,-0.9394112213,,, +5.7402343750,91,1.2784110193,0.4723736126,-1.0000649090,-0.9725756006,,, +5.7421875000,91,1.4130545599,0.6446126335,-0.7861874243,-0.7303252342,,, +5.7441406250,91,1.5511858767,0.8481357699,-0.4660789656,-0.2636463053,,, +5.7460937500,91,1.6905206070,1.0657042260,-0.0932400452,0.3154136530,,, +5.7480468750,91,1.8287426661,1.2790683035,0.2713033279,0.8642350092,,, +5.7500000000,92,1.9635447878,1.4702474315,0.5685098797,1.2484913341,,, +5.7519531250,92,2.0926689165,1.6227914431,0.7505201756,1.3787410829,,, +5.7539062500,92,2.2139457433,1.7229351268,0.7881080994,1.2347191293,,, +5.7558593750,92,2.3253326938,1.7605655271,0.6752261246,0.8706727076,,, +5.7578125000,92,2.4249497025,1.7299345217,0.4299364698,0.4002814507,,, +5.7597656250,92,2.5111121470,1.6300669707,0.0915831716,-0.0347034604,,, +5.7617187500,92,2.5823603668,1.4648359569,-0.2853543781,-0.3035039827,,, +5.7636718750,92,2.6374852470,1.2426998552,-0.6397689796,-0.3223408630,,, +5.7656250000,92,2.6755494222,0.9761195490,-0.9134690406,-0.0775649214,,, +5.7675781250,92,2.6959037268,0.6806964173,-1.0602712789,0.3704472888,,, +5.7695312500,92,2.6981986046,0.3740911863,-1.0532263162,0.9037026502,,, +5.7714843750,92,2.6823902782,0.0747990230,-0.8888515601,1.3788095883,,, +5.7734375000,92,2.6487415696,-0.1991337287,-0.5877118897,1.6661763042,,, +5.7753906250,92,2.5978173574,-0.4313616976,-0.1912574882,1.6854471011,,, +5.7773437500,92,2.5304747509,-0.6083742191,0.2445888732,1.4274656086,,, +5.7792968750,92,2.4478481526,-0.7204316078,0.6580965236,0.9567460905,,, +5.7812500000,92,2.3513294706,-0.7622386937,0.9912942276,0.3937759675,,, +5.7832031250,92,2.2425438276,-0.7333086672,1.1989502641,-0.1179998590,,, +5.7851562500,92,2.1233211909,-0.6379918714,1.2555668180,-0.4514642451,,, +5.7871093750,92,1.9956644220,-0.4851675486,1.1592995494,-0.5306158763,,, +5.7890625000,92,1.8617143029,-0.2876200450,0.9321921234,-0.3513261900,,, +5.7910156250,92,1.7237121533,-0.0611429850,0.6166894604,0.0176231153,,, +5.7929687500,92,1.5839606917,0.1765661074,0.2689730713,0.4535055510,,, +5.7949218750,92,1.4447838272,0.4071436485,-0.0498431720,0.8134194497,,, +5.7968750000,92,1.3084860844,0.6128439700,-0.2832852384,0.9736053237,,, +5.7988281250,92,1.1773123732,0.7777798852,-0.3883678979,0.8635339388,,, +5.8007812500,92,1.0534088068,0.8890333316,-0.3423418863,0.4854210976,,, +5.8027343750,92,0.9387852544,0.9375586337,-0.1462880807,-0.0861809119,,, +5.8046875000,92,0.8352802841,0.9188153953,0.1750013975,-0.7246049919,,, +5.8066406250,92,0.7445291103,0.8330868810,0.5768369065,-1.2855637566,,, +5.8085937500,92,0.6679351052,0.6854616829,1.0015460851,-1.6464649562,,, +5.8105468750,92,0.6066453754,0.4854799466,1.3874129664,-1.7397746776,,, +5.8125000000,93,0.5615308290,0.2464688260,1.6782493276,-1.5712865799,,, +5.8144531250,93,0.5331710837,-0.0153864959,1.8321077171,-1.2182922661,,, +5.8164062500,93,0.5218444791,-0.2821714382,1.8277792692,-0.8081564099,,, +5.8183593750,93,0.5275233688,-0.5354916027,1.6680644380,-0.4831707238,,, +5.8203125000,93,0.5498747734,-0.7577561659,1.3793073974,-0.3613213957,,, +5.8222656250,93,0.5882663847,-0.9334055843,1.0072667925,-0.5037245752,,, +5.8242187500,93,0.6417778137,-1.0499979997,0.6099661439,-0.8976569231,,, +5.8261718750,93,0.7092168873,-1.0990785820,0.2486376184,-1.4598340188,,, +5.8281250000,93,0.7891407073,-1.0767711821,-0.0218301645,-2.0590399961,,, +5.8300781250,93,0.8798811021,-0.9840510337,-0.1614523992,-2.5519080753,,, +5.8320312500,93,0.9795740277,-0.8266794802,-0.1513830533,-2.8220472610,,, +5.8339843750,93,1.0861923997,-0.6148052720,0.0031466546,-2.8117932514,,, +5.8359375000,93,1.1975817851,-0.3622602297,0.2736439729,-2.5378829255,,, +5.8378906250,93,1.3114983250,-0.0855983813,0.6127974860,-2.0867576719,,, +5.8398437500,93,1.4256482275,0.1970544334,0.9618551191,-1.5907837630,,, +5.8417968750,93,1.5377281368,0.4672602783,1.2597880835,-1.1919078536,,, +5.8437500000,93,1.6454656719,0.7075503234,1.4528133730,-1.0027091429,,, +5.8457031250,93,1.7466594269,0.9026382028,1.5027915575,-1.0755230274,,, +5.8476562500,93,1.8392177288,1.0404809286,1.3931917768,-1.3880987188,,, +5.8496093750,93,1.9211954778,1.1131133922,1.1316947405,-1.8497216227,,, +5.8515625000,93,1.9908284223,1.1171982721,0.7490281674,-2.3261222930,,, +5.8535156250,93,2.0465642691,1.0542530165,0.2942158991,-2.6763447336,,, +5.8554687500,93,2.0870900847,0.9305380853,-0.1730195084,-2.7914689170,,, +5.8574218750,93,2.1113555062,0.7566142582,-0.5915175651,-2.6245740095,,, +5.8593750000,93,2.1185913570,0.5465998956,-0.9081617883,-2.2037292638,,, +5.8613281250,93,2.1083233397,0.3171799602,-1.0861061593,-1.6244509656,,, +5.8632812500,93,2.0803805672,0.0864359181,-1.1104650132,-1.0236913929,,, +5.8652343750,93,2.0348987826,-0.1274218687,-0.9905803760,-0.5424871106,,, +5.8671875000,93,1.9723182103,-0.3073308489,-0.7585138539,-0.2875019185,,, +5.8691406250,93,1.8933760770,-0.4385730422,-0.4639982351,-0.3020025850,,, +5.8710937500,93,1.7990939331,-0.5098083827,-0.1666353935,-0.5542201485,,, +5.8730468750,93,1.6907599957,-0.5138725697,0.0734440088,-0.9462846105,,, +5.8750000000,94,1.5699068231,-0.4482837744,0.2050039337,-1.3412822236,,, +5.8769531250,94,1.4382847114,-0.3154228477,0.1937414568,-1.6010176636,,, +5.8789062500,94,1.2978312780,-0.1223744493,0.0276880065,-1.6241294496,,, +5.8808593750,94,1.1506377664,0.1195598437,-0.2808682153,-1.3741101489,,, +5.8828125000,94,0.9989126594,0.3956425110,-0.6972383482,-0.8895497014,,, +5.8847656250,94,0.8449432409,0.6887207048,-1.1696787192,-0.2737923313,,, +5.8867187500,94,0.6910557759,0.9804153528,-1.6373940610,0.3331603201,,, +5.8886718750,94,0.5395750090,1.2523958453,-2.0399518446,0.7928013720,,, +5.8906250000,94,0.3927836879,1.4876514352,-2.3266416693,1.0058717762,,, +5.8925781250,94,0.2528828218,1.6716707087,-2.4643222064,0.9393691545,,, +5.8945312500,94,0.1219533704,1.7934468947,-2.4425337519,0.6354118265,,, +5.8964843750,94,0.0019200333,1.8462389259,-2.2750803312,0.1995302669,,, +5.8984375000,94,-0.1054822244,1.8280351947,-1.9978351721,-0.2284035916,,, +5.9003906250,94,-0.1987383272,1.7416876814,-1.6631115793,-0.5126405102,,, +5.9023437500,94,-0.2765793938,1.5947071165,-1.3314761858,-0.5588685578,,, +5.9042968750,94,-0.3380047338,1.3987334737,-1.0622799065,-0.3401504355,,, +5.9062500000,94,-0.3822991487,1.1687187342,-0.9043816251,0.0956258805,,, +5.9082031250,94,-0.4090452373,0.9218789225,-0.8885096103,0.6388257202,,, +5.9101562500,94,-0.4181304868,0.6764885057,-1.0224505549,1.1480914261,,, +5.9121093750,94,-0.4097490292,0.4506012381,-1.2898156937,1.4890827226,,, +5.9140625000,94,-0.3843980289,0.2607866634,-1.6525762885,1.5713161100,,, +5.9160156250,94,-0.3428687678,0.1209703931,-2.0569736513,1.3730064305,,, +5.9179687500,94,-0.2862325820,0.0414590423,-2.4418832510,0.9471017997,,, +5.9199218750,94,-0.2158218977,0.0282178283,-2.7483301948,0.4068572280,,, +5.9218750000,94,-0.1332066978,0.0824512154,-2.9286740199,-0.1051001048,,, +5.9238281250,94,-0.0401668320,0.2005158584,-2.9540322181,-0.4557367023,,, +5.9257812500,94,0.0613393452,0.3741719220,-2.8187862192,-0.5579315955,,, +5.9277343750,94,0.1692094591,0.5911552603,-2.5414679641,-0.3941956723,,, +5.9296875000,94,0.2812341179,0.8360305596,-2.1618889151,-0.0212922865,,, +5.9316406250,94,0.3951357867,1.0912659606,-1.7349585959,0.4455055391,,, +5.9335937500,94,0.5086088513,1.3384542262,-1.3221553530,0.8642048788,,, +5.9355468750,94,0.6193601700,1.5595953035,-0.9819776904,1.1052151080,,, +5.9375000000,95,0.7251494037,1.7383508457,-0.7608632941,1.0870783277,,, +5.9394531250,95,0.8238284175,1.8611832158,-0.6859899956,0.7990133046,,, +5.9414062500,95,0.9133790649,1.9182995442,-0.7610797880,0.3040921993,,, +5.9433593750,95,0.9919486905,1.9043350127,-0.9658592483,-0.2778227073,,, +5.9453125000,95,1.0578827330,1.8187277138,-1.2592602005,-0.8027079092,,, +5.9472656250,95,1.1097538538,1.6657589461,-1.5858618775,-1.1416327307,,, +5.9492187500,95,1.1463870837,1.4542561334,-1.8845709454,-1.2158822950,,, +5.9511718750,95,1.1668805465,1.1969790812,-2.0981871844,-1.0183253104,,, +5.9531250000,95,1.1706213960,0.9097323660,-2.1823646623,-0.6151723985,,, +5.9550781250,95,1.1572966881,0.6102657481,-2.1125723838,-0.1276449574,,, +5.9570312500,95,1.1268989970,0.3170392813,-1.8879699828,0.3014196269,,, +5.9589843750,95,1.0797266771,0.0479392267,-1.5315945158,0.5468722407,,, +5.9609375000,95,1.0163787666,-0.1809656941,-1.0868289761,0.5356921191,,, +5.9628906250,95,0.9377446207,-0.3565409811,-0.6107022860,0.2671223642,,, +5.9648437500,95,0.8449884576,-0.4694981141,-0.1650640351,-0.1870188530,,, +5.9667968750,95,0.7395290856,-0.5150378135,0.1929917465,-0.7019377426,,, +5.9687500000,95,0.6230151687,-0.4931799596,0.4199625242,-1.1340042300,,, +5.9707031250,95,0.4972964618,-0.4087571708,0.4926569519,-1.3600752717,,, +5.9726562500,95,0.3643915197,-0.2710725030,0.4117519778,-1.3112252723,,, +5.9746093750,95,0.2264524455,-0.0932451488,0.2016336072,-0.9916393639,,, +5.9765625000,95,0.0857272962,0.1087102238,-0.0934536031,-0.4774915197,,, +5.9785156250,95,-0.0554791985,0.3170062799,-0.4163483172,0.1038851847,,, +5.9804687500,95,-0.1948459135,0.5133296633,-0.7059239858,0.6088277171,,, +5.9824218750,95,-0.3300758992,0.6801245328,-0.9066557077,0.9166265878,,, +5.9843750000,95,-0.4589365329,0.8018234696,-0.9773120656,0.9624980375,,, +5.9863281250,95,-0.5792985510,0.8659399067,-0.8974179180,0.7552091850,,, +5.9882812500,95,-0.6891732749,0.8639458857,-0.6704813301,0.3745267470,,, +5.9902343750,95,-0.7867473823,0.7918739172,-0.3234818426,-0.0508101279,,, +5.9921875000,95,-0.8704146121,0.6506009594,0.0973003882,-0.3785544594,,, +5.9941406250,95,-0.9388038503,0.4457946954,0.5334650990,-0.4921320678,,, +5.9960937500,95,-0.9908031029,0.1875258394,0.9235638123,-0.3327982586,,, +5.9980468750,95,-1.0255789380,-0.1104265099,1.2126502346,0.0840444877,,, +6.0000000000,96,-1.0425910551,-0.4315280454,1.3608217321,0.6728419693,,, +6.0019531250,96,-1.0416017280,-0.7576345075,1.3494215826,1.3011038683,,, +6.0039062500,96,-1.0226799540,-1.0702491728,1.1839360251,1.8254789092,,, +6.0058593750,96,-0.9862002395,-1.3518049057,0.8931349153,2.1308045978,,, +6.0078125000,96,-0.9328360400,-1.5868813886,0.5245898457,2.1614313450,,, +6.0097656250,96,-0.8635479724,-1.7632726655,0.1372678048,1.9362381439,,, +6.0117187500,96,-0.7795670042,-1.8728305748,-0.2076460784,1.5432266049,,, +6.0136718750,96,-0.6823729138,-1.9120252722,-0.4562673444,1.1151770760,,, +6.0156250000,96,-0.5736684009,-1.8821837736,-0.5703900320,0.7930408321,,, +6.0175781250,96,-0.4553492977,-1.7893899018,-0.5334187236,0.6871034175,,, +6.0195312500,96,-0.3294714050,-1.6440526296,-0.3529309681,0.8465649900,,, +6.0214843750,96,-0.1982145319,-1.4601729371,-0.0594710983,1.2458765581,,, +6.0234375000,96,-0.0638443703,-1.2543603242,0.2982365428,1.7915785863,,, +6.0253906250,96,0.0713271298,-1.0446675754,0.6609092357,2.3477692154,,, +6.0273437500,96,0.2049821891,-0.8493250484,0.9679750898,2.7732233729,,, +6.0292968750,96,0.3348377244,-0.6854627634,1.1670458948,2.9599907168,,, +6.0312500000,96,0.4586852616,-0.5679094217,1.2221179598,2.8628948721,,, +6.0332031250,96,0.5744295365,-0.5081521151,1.1192233922,2.5118499153,,, +6.0351562500,96,0.6801251085,-0.5135292829,0.8686513601,2.0036191380,,, +6.0371093750,96,0.7740103458,-0.5867132089,0.5033931161,1.4752751750,,, +6.0390625000,96,0.8545381862,-0.7255181564,0.0740527185,1.0666354812,,, +6.0410156250,96,0.9204031366,-0.9230475341,-0.3589841357,0.8819684603,,, +6.0429687500,96,0.9705640371,-1.1681698419,-0.7349036981,0.9614652315,,, +6.0449218750,96,1.0042621922,-1.4462902185,-1.0018835851,1.2702953462,,, +6.0468750000,96,1.0210345498,-1.7403637988,-1.1251111869,1.7082453321,,, +6.0488281250,96,1.0207217007,-2.0320802250,-1.0921524486,2.1372976078,,, +6.0507812500,96,1.0034705548,-2.3031367235,-0.9148350969,2.4195902080,,, +6.0527343750,96,0.9697316497,-2.5365109764,-0.6273532813,2.4553525075,,, +6.0546875000,96,0.9202511379,-2.7176450372,-0.2808891296,2.2104185434,,, +6.0566406250,96,0.8560575939,-2.8354577374,0.0644107757,1.7257758445,,, +6.0585937500,96,0.7784438704,-2.8831149918,0.3488540117,1.1065310637,,, +6.0605468750,96,0.6889443238,-2.8585042925,0.5225487492,0.4933148162,,, +6.0625000000,97,0.5893078056,-2.7643803080,0.5532219800,0.0239609050,,, +6.0644531250,97,0.4814668947,-2.6081714373,0.4312915511,-0.2040394842,,, +6.0664062500,97,0.3675039080,-2.4014608118,0.1714017609,-0.1600205024,,, +6.0683593750,97,0.2496142848,-2.1591779389,-0.1898168970,0.1116947231,,, +6.0703125000,97,0.1300679869,-1.8985573565,-0.5994151329,0.5041847822,,, +6.0722656250,97,0.0111695897,-1.6379369164,-0.9963368873,0.8774769139,,, +6.0742187500,97,-0.1047822363,-1.3954794941,-1.3208971110,1.0971500791,,, +6.0761718750,97,-0.2155351449,-1.1879072647,-1.5240492650,1.0714120802,,, +6.0781250000,97,-0.3189227253,-1.0293368038,-1.5749992386,0.7764868953,,, +6.0800781250,97,-0.4129026127,-0.9302962443,-1.4659799222,0.2633522772,,, +6.0820312500,97,-0.4955924294,-0.8969930205,-1.2134428953,-0.3560209222,,, +6.0839843750,97,-0.5653029287,-0.9308832588,-0.8554817230,-0.9391581776,,, +6.0859375000,97,-0.6205677597,-1.0285728358,-0.4458882828,-1.3519449789,,, +6.0878906250,97,-0.6601693321,-1.1820569994,-0.0457679458,-1.5052150309,,, +6.0898437500,97,-0.6831603291,-1.3792818336,0.2859803634,-1.3790367053,,, +6.0917968750,97,-0.6888804893,-1.6049884091,0.5018364223,-1.0280428691,,, +6.0937500000,97,-0.6769683658,-1.8417807445,0.5730546523,-0.5663444808,,, +6.0957031250,97,-0.6473678562,-2.0713430967,0.4941318071,-0.1361636411,,, +6.0976562500,97,-0.6003293868,-2.2757216861,0.2836505797,0.1312163998,,, +6.0996093750,97,-0.5364057339,-2.4385814663,-0.0186322062,0.1514812796,,, +6.1015625000,97,-0.4564425514,-2.5463502888,-0.3579992140,-0.0895795067,,, +6.1035156250,97,-0.3615637736,-2.5891706650,-0.6733201142,-0.5321734628,,, +6.1054687500,97,-0.2531521463,-2.5615927438,-0.9066015685,-1.0589103596,,, +6.1074218750,97,-0.1328252289,-2.4629601679,-1.0120520765,-1.5270154633,,, +6.1093750000,97,-0.0024072855,-2.2974618881,-0.9632496330,-1.8075215828,,, +6.1113281250,97,0.1361024405,-2.0738463100,-0.7572956189,-1.8206979052,,, +6.1132812500,97,0.2805645152,-1.8048176895,-0.4153077468,-1.5580047830,,, +6.1152343750,97,0.4287365560,-1.5061568566,0.0208249256,-1.0845562782,,, +6.1171875000,97,0.5783122745,-1.1956275635,0.4949197101,-0.5214143334,,, +6.1191406250,97,0.7269616383,-0.8917447090,0.9452020268,-0.0125658200,,, +6.1210937500,97,0.8723714464,-0.6124903147,1.3138760717,0.3143684740,,, +6.1230468750,97,1.0122856098,-0.3740667793,1.5560739881,0.3829261075,,, +6.1250000000,98,1.1445444315,-0.1897743319,1.6467899274,0.1885627815,,, +6.1269531250,98,1.2671221976,-0.0690909471,1.5847192577,-0.2003080649,,, +6.1289062500,98,1.3781624220,-0.0170188653,1.3924052245,-0.6612787897,,, +6.1308593750,98,1.4760101288,-0.0337432696,1.1126705066,-1.0517148177,,, +6.1328125000,98,1.5592406041,-0.1146269054,0.8018897626,-1.2480689377,,, +6.1347656250,98,1.6266841177,-0.2505409984,0.5211512947,-1.1799656180,,, +6.1367187500,98,1.6774461796,-0.4285093796,0.3266847436,-0.8497117000,,, +6.1386718750,98,1.7109229767,-0.6326208819,0.2610460418,-0.3318840299,,, +6.1406250000,98,1.7268117212,-0.8451463680,0.3464329062,0.2468950649,,, +6.1425781250,98,1.7251157280,-1.0477824773,0.5811723043,0.7424535879,,, +6.1445312500,98,1.7061441328,-1.2229353452,0.9399272707,1.0323847029,,, +6.1464843750,98,1.6705062566,-1.3549547600,1.3775911352,1.0494074769,,, +6.1484375000,98,1.6191007144,-1.4312326791,1.8362628835,0.7996321658,,, +6.1503906250,98,1.5530994600,-1.4430894856,2.2542174566,0.3607257614,,, +6.1523437500,98,1.4739270452,-1.3863861664,2.5754740651,-0.1395178821,,, +6.1542968750,98,1.3832354579,-1.2618197088,2.7584724363,-0.5583286593,,, +6.1562500000,98,1.2828749790,-1.0748810998,2.7825058429,-0.7771966001,,, +6.1582031250,98,1.1748615686,-0.8354788435,2.6509091425,-0.7344394570,,, +6.1601562500,98,1.0613413539,-0.5572542328,2.3905054630,-0.4421748214,,, +6.1621093750,98,0.9445528379,-0.2566361135,2.0473978912,0.0169554590,,, +6.1640625000,98,0.8267874945,0.0482989628,1.6797617859,0.5124113032,,, +6.1660156250,98,0.7103494370,0.3390817209,1.3487604913,0.9015300234,,, +6.1679687500,98,0.5975148679,0.5981327809,1.1089994926,1.0686465972,,, +6.1699218750,98,0.4904920196,0.8099834831,1.0000059325,0.9568367567,,, +6.1718750000,98,0.3913822881,0.9623497980,1.0400606752,0.5835827204,,, +6.1738281250,98,0.3021432396,1.0469844460,1.2233436677,0.0360675142,,, +6.1757812500,98,0.2245541382,1.0602478147,1.5208372607,-0.5526131812,,, +6.1777343750,98,0.1601845991,1.0033578716,1.8848468099,-1.0398029733,,, +6.1796875000,98,0.1103669150,0.8823016538,2.2564344452,-1.3122386374,,, +6.1816406250,98,0.0761725414,0.7074145142,2.5746081358,-1.3169311353,,, +6.1835937500,98,0.0583931523,0.4926564716,2.7858347584,-1.0755116672,,, +6.1855468750,98,0.0575265982,0.2546361350,2.8523953923,-0.6781125360,,, +6.1875000000,99,0.0737680120,0.0114502696,2.7582813725,-0.2584616280,,, +6.1894531250,99,0.1070062195,-0.2185800666,2.5117126523,0.0429817835,,, +6.1914062500,99,0.1568255164,-0.4181886817,2.1438861023,0.1177445923,,, +6.1933593750,99,0.2225127816,-0.5723694983,1.7041485568,-0.0807025788,,, +6.1953125000,99,0.3030698024,-0.6694238459,1.2523462711,-0.5239603728,,, +6.1972656250,99,0.3972305944,-0.7017767628,0.8495422197,-1.1162491859,,, +6.1992187500,99,0.5034834156,-0.6665053852,0.5485468695,-1.7204244969,,, +6.2011718750,99,0.6200970866,-0.5655425755,0.3857370980,-2.1953311822,,, +6.2031250000,99,0.7451511579,-0.4055415931,0.3754372779,-2.4342612699,,, +6.2050781250,99,0.8765693957,-0.1974112447,0.5077374649,-2.3939771296,,, +6.2070312500,99,1.0121559989,0.0444460665,0.7500882664,-2.1063477719,,, +6.2089843750,99,1.1496339159,0.3031402567,1.0524237229,-1.6694110795,,, +6.2109375000,99,1.2866845867,0.5604732924,1.3550140149,-1.2203134364,,, +6.2128906250,99,1.4209884180,0.7982104652,1.5978246180,-0.8975449701,,, +6.2148437500,99,1.5502652799,0.9993545539,1.7299238854,-0.8028222483,,, +6.2167968750,99,1.6723143172,1.1493340164,1.7174734886,-0.9730667510,,, +6.2187500000,99,1.7850523771,1.2370223480,1.5490568705,-1.3701603329,,, +6.2207031250,99,1.8865503810,1.2555175141,1.2375154849,-1.8912865854,,, +6.2226562500,99,1.9750670028,1.2026270973,0.8180065229,-2.3970248491,,, +6.2246093750,99,2.0490790660,1.0810253170,0.3425843549,-2.7494979704,,, +6.2265625000,99,2.1073081244,0.8980709631,-0.1278506335,-2.8501192703,,, +6.2285156250,99,2.1487427648,0.6652989294,-0.5329820848,-2.6665938355,,, +6.2304687500,99,2.1726562369,0.3976207901,-0.8224180928,-2.2417741027,,, +6.2324218750,99,2.1786191059,0.1122901561,-0.9634874580,-1.6819426928,,, +6.2343750000,99,2.1665067036,-0.1722950538,-0.9462777297,-1.1277336165,,, +6.2363281250,99,2.1365012482,-0.4378699186,-0.7851305885,-0.7156610684,,, +6.2382812500,99,2.0890885965,-0.6675703402,-0.5163618961,-0.5407990008,,, +6.2402343750,99,2.0250496847,-0.8471029933,-0.1925617566,-0.6308390771,,, +6.2421875000,99,1.9454468072,-0.9657358296,0.1256373982,-0.9386359443,,, +6.2441406250,99,1.8516049754,-1.0170400810,0.3790423358,-1.3552817616,,, +6.2460937500,99,1.7450886810,-0.9993320349,0.5191531786,-1.7401253004,,, +6.2480468750,99,1.6276744722,-0.9157837903,0.5157486360,-1.9595067761,,, +6.2500000000,100,1.5013198216,-0.7741952885,0.3616207236,-1.9235907056,,, +6.2519531250,100,1.3681288326,-0.5864435308,0.0737213784,-1.6112002323,,, +6.2539062500,100,1.2303153835,-0.3676474077,-0.3094577330,-1.0758446829,,, +6.2558593750,100,1.0901643549,-0.1351063964,-0.7338641981,-0.4312863998,,, +6.2578125000,100,0.9499916197,0.0929128502,-1.1382914503,0.1793995174,,, +6.2597656250,100,0.8121034963,0.2984573889,-1.4639036472,0.6227948845,,, +6.2617187500,100,0.6787563743,0.4651470110,-1.6633953204,0.8114592607,,, +6.2636718750,100,0.5521172204,0.5793235910,-1.7083591411,0.7276496604,,, +6.2656250000,100,0.4342256556,0.6310105967,-1.5937142246,0.4279404635,,, +6.2675781250,100,0.3269582682,0.6146158326,-1.3385052081,0.0274794998,,, +6.2695312500,100,0.2319957861,0.5293283952,-0.9829475921,-0.3318026455,,, +6.2714843750,100,0.1507936859,0.3791821425,-0.5821794730,-0.5203151766,,, +6.2734375000,100,0.0845567503,0.1727812351,-0.1976927769,-0.4565371952,,, +6.2753906250,100,0.0342180211,-0.0772931281,0.1122214890,-0.1295609454,,, +6.2773437500,100,0.0004225163,-0.3553534278,0.3015258957,0.3977319915,,, +6.2792968750,100,-0.0164840041,-0.6436932909,0.3435773143,1.0057336816,,, +6.2812500000,100,-0.0164610272,-0.9238158916,0.2352436612,1.5507370352,,, +6.2832031250,100,0.0002260744,-1.1777176403,-0.0026443514,1.9041864038,,, +6.2851562500,100,0.0330107656,-1.3891376607,-0.3285766239,1.9877953218,,, +6.2871093750,100,0.0810353506,-1.5446859386,-0.6868706133,1.7949076423,,, +6.2890625000,100,0.1431660781,-1.6347714883,-1.0163880931,1.3922484049,,, +6.2910156250,100,0.2180130859,-1.6542658248,-1.2601038069,0.9015851537,,, +6.2929687500,100,0.3039548345,-1.6028554903,-1.3740353966,0.4663261697,,, +6.2949218750,100,0.3991666036,-1.4850590630,-1.3341434594,0.2122102115,,, +6.2968750000,100,0.5016525506,-1.3099074763,-1.1401267432,0.2128614906,,, +6.2988281250,100,0.6092807710,-1.0903099501,-0.8155210822,0.4696499858,,, +6.3007812500,100,0.7198207462,-0.8421497610,-0.4040863793,0.9113763328,,, +6.3027343750,100,0.8309825229,-0.5831729176,0.0369559037,1.4138670009,,, +6.3046875000,100,0.9404569384,-0.3317472444,0.4457817419,1.8341084640,,, +6.3066406250,100,1.0459561864,-0.1055784175,0.7655404846,2.0495641817,,, +6.3085937500,100,1.1452540150,0.0795275057,0.9531565199,1.9918975798,,, +6.3105468750,100,1.2362248499,0.2107687625,0.9859860505,1.6658571966,,, +6.3125000000,101,1.3168811607,0.2792427283,0.8652924374,1.1481466179,,, +6.3144531250,101,1.3854084142,0.2805685203,0.6159990868,0.5665872479,,, +6.3164062500,101,1.4401970026,0.2151939418,0.2827586447,0.0652829873,,, +6.3183593750,101,1.4798705884,0.0883653582,-0.0770489938,-0.2346677641,,, +6.3203125000,101,1.5033103689,-0.0902373988,-0.4022990058,-0.2681471069,,, +6.3222656250,101,1.5096748356,-0.3071756400,-0.6376850025,-0.0436442425,,, +6.3242187500,101,1.4984146815,-0.5461889011,-0.7423736562,0.3592951375,,, +6.3261718750,101,1.4692825975,-0.7893291538,-0.6964023645,0.8120954846,,, +6.3281250000,101,1.4223377835,-1.0182130516,-0.5038232777,1.1726150565,,, +6.3300781250,101,1.3579450968,-1.2153048893,-0.1921037981,1.3243249375,,, +6.3320312500,101,1.2767688522,-1.3651408069,0.1921232483,1.2084635031,,, +6.3339843750,101,1.1797613824,-1.4554088695,0.5902979924,0.8403516828,,, +6.3359375000,101,1.0681465584,-1.4778097017,0.9410331791,0.3053954908,,, +6.3378906250,101,0.9433985591,-1.4286376582,1.1896579015,-0.2641305090,,, +6.3398437500,101,0.8072162608,-1.3090419982,1.2967190281,-0.7251576693,,, +6.3417968750,101,0.6614936961,-1.1249498457,1.2441162617,-0.9628704246,,, +6.3437500000,101,0.5082870981,-0.8866563009,1.0379153245,-0.9220260659,,, +6.3457031250,101,0.3497791080,-0.6081102800,0.7074011404,-0.6219647269,,, +6.3476562500,101,0.1882407715,-0.3059458730,0.3005185078,-0.1511970471,,, +6.3496093750,101,0.0259919906,0.0016732392,-0.1235896013,0.3569460525,,, +6.3515625000,101,-0.1346388774,0.2963157384,-0.5037839363,0.7609269235,,, +6.3535156250,101,-0.2913555676,0.5605630013,-0.7864378599,0.9498426985,,, +6.3554687500,101,-0.4419338891,0.7792185411,-0.9337722372,0.8738489610,,, +6.3574218750,101,-0.5842604442,0.9403622301,-0.9297182069,0.5578270665,,, +6.3593750000,101,-0.7163694038,1.0361758029,-0.7823947780,0.0945492230,,, +6.3613281250,101,-0.8364766983,1.0634820857,-0.5228154799,-0.3807853063,,, +6.3632812500,101,-0.9430110230,1.0239603649,-0.2000256515,-0.7276636894,,, +6.3652343750,101,-1.0346411171,0.9240228887,0.1265720750,-0.8388504821,,, +6.3671875000,101,-1.1102988372,0.7743611282,0.3965085732,-0.6698787038,,, +6.3691406250,101,-1.1691976224,0.5891934543,0.5577080197,-0.2513574963,,, +6.3710937500,101,-1.2108460280,0.3852667060,0.5746430661,0.3192778973,,, +6.3730468750,101,-1.2350560901,0.1806812898,0.4339149517,0.9043140251,,, +6.3750000000,102,-1.2419463750,-0.0063782440,0.1463891898,1.3633304476,,, +6.3769531250,102,-1.2319396607,-0.1589186112,-0.2544460672,1.5914987296,,, +6.3789062500,102,-1.2057552908,-0.2623302351,-0.7176435475,1.5481143164,,, +6.3808593750,102,-1.1643963348,-0.3054135510,-1.1826782872,1.2675434023,,, +6.3828125000,102,-1.1091317801,-0.2811675866,-1.5888196689,0.8495865202,,, +6.3847656250,102,-1.0414740665,-0.1872858146,-1.8845346060,0.4319019254,,, +6.3867187500,102,-0.9631523591,-0.0263246804,-2.0354575675,0.1520487801,,, +6.3886718750,102,-0.8760820245,0.1944669633,-2.0296863585,0.1095550952,,, +6.3906250000,102,-0.7823308482,0.4636456384,-1.8795791037,0.3384086223,,, +6.3925781250,102,-0.6840825823,0.7663635456,-1.6197728362,0.7975122789,,, +6.3945312500,102,-0.5835984632,1.0853962965,-1.3017326003,1.3817221352,,, +6.3964843750,102,-0.4831773730,1.4023364262,-0.9856803612,1.9504448941,,, +6.3984375000,102,-0.3851153420,1.6988694728,-0.7311611225,2.3659592127,,, +6.4003906250,102,-0.2916651027,1.9580436594,-0.5877159077,2.5309601262,,, +6.4023437500,102,-0.2049964014,2.1654446531,-0.5871146102,2.4150386711,,, +6.4042968750,102,-0.1271577650,2.3101935001,-0.7383587493,2.0628412206,,, +6.4062500000,102,-0.0600403910,2.3856981628,-1.0262327344,1.5816739671,,, +6.4082031250,102,-0.0053447932,2.3901062686,-1.4136295278,1.1119513081,,, +6.4101562500,102,0.0354492115,2.3264275141,-1.8472887022,0.7885887125,,, +6.4121093750,102,0.0611086516,2.2023172038,-2.2660533776,0.7039223208,,, +6.4140625000,102,0.0706692243,2.0295360340,-2.6103601764,0.8823189226,,, +6.4160156250,102,0.0634524137,1.8231238060,-2.8314842755,1.2734357856,,, +6.4179687500,102,0.0390776030,1.6003447030,-2.8990997561,1.7659782500,,, +6.4199218750,102,-0.0025310327,1.3794776926,-2.8059778406,2.2181849771,,, +6.4218750000,102,-0.0611429708,1.1785364181,-2.5690913743,2.4966859888,,, +6.4238281250,102,-0.1362251537,1.0140078554,-2.2269536375,2.5130836952,,, +6.4257812500,102,-0.2269510998,0.8996977057,-1.8336060768,2.2482309589,,, +6.4277343750,102,-0.3322151558,0.8457630497,-1.4501914711,1.7575519137,,, +6.4296875000,102,-0.4506516390,0.8579997286,-1.1354251124,1.1559466609,,, +6.4316406250,102,-0.5806585363,0.9374341568,-0.9364481959,0.5864162177,,, +6.4335937500,102,-0.7204253437,1.0802480374,-0.8814880645,0.1810056913,,, +6.4355468750,102,-0.8679645594,1.2780412407,-0.9754685048,0.0247688138,,, +6.4375000000,103,-1.0211462797,1.5184145208,-1.1992537828,0.1326287402,,, +6.4394531250,103,-1.1777352911,1.7858314422,-1.5126441134,0.4454753718,,, +6.4414062500,103,-1.3354300099,2.0626994189,-1.8606559331,0.8465671703,,, +6.4433593750,103,-1.4919025873,2.3305944864,-2.1821086955,1.1937404473,,, +6.4453125000,103,-1.6448394780,2.5715444028,-2.4191806420,1.3585966430,,, +6.4472656250,103,-1.7919817623,2.7692806102,-2.5264450514,1.2619255577,,, +6.4492187500,103,-1.9311645147,2.9103717541,-2.4779793784,0.8956540315,,, +6.4511718750,103,-2.0603545313,2.9851597201,-2.2714398251,0.3253024801,,, +6.4531250000,103,-2.1776857542,2.9884329157,-1.9284665260,-0.3277261336,,, +6.4550781250,103,-2.2814917738,2.9197898477,-1.4913560363,-0.9191730101,,, +6.4570312500,103,-2.3703348388,2.7836676421,-1.0165191855,-1.3212164521,,, +6.4589843750,103,-2.4430308670,2.5890335153,-0.5657430401,-1.4572641752,,, +6.4609375000,103,-2.4986700187,2.3487607096,-0.1966177304,-1.3227115796,,, +6.4628906250,103,-2.5366324725,2.0787324091,0.0463810419,-0.9859788235,,, +6.4648437500,103,-2.5565991273,1.7967361175,0.1387651299,-0.5695444462,,, +6.4667968750,103,-2.5585570436,1.5212255928,0.0797924498,-0.2161755412,,, +6.4687500000,103,-2.5427995283,1.2700366680,-0.1074742578,-0.0496115454,,, +6.4707031250,103,-2.5099208620,1.0591465005,-0.3798172803,-0.1404786783,,, +6.4726562500,103,-2.4608057610,0.9015627662,-0.6806536260,-0.4867783567,,, +6.4746093750,103,-2.3966137589,0.8064202497,-0.9489067345,-1.0142984621,,, +6.4765625000,103,-2.3187587813,0.7783478200,-1.1285780948,-1.5968359119,,, +6.4785156250,103,-2.2288842702,0.8171499262,-1.1775276474,-2.0906891197,,, +6.4804687500,103,-2.1288342960,0.9178248127,-1.0740950849,-2.3739677916,,, +6.4824218750,103,-2.0206211607,1.0709181738,-0.8205304592,-2.3799470215,,, +6.4843750000,103,-1.9063900609,1.2631875751,-0.4426994752,-2.1153247222,,, +6.4863281250,103,-1.7883814291,1.4785312977,0.0138909033,-1.6583787678,,, +6.4882812500,103,-1.6688916129,1.6991168215,0.4911277756,-1.1375288986,,, +6.4902343750,103,-1.5502325803,1.9066302428,0.9272930251,-0.6961786984,,, +6.4921875000,103,-1.4346913568,2.0835594850,1.2666277824,-0.4534729703,,, +6.4941406250,103,-1.3244899053,2.2144218085,1.4679711539,-0.4717251008,,, +6.4960937500,103,-1.2217461496,2.2868500056,1.5111279160,-0.7394407631,,, +6.4980468750,103,-1.1284368265,2.2924615221,1.3999735848,-1.1745896347,,, +6.5000000000,104,-1.0463628150,2.2274498842,1.1618134295,-1.6472272530,,, +6.5019531250,104,-0.9771175497,2.0928571719,0.8430954468,-2.0152656727,,, +6.5039062500,104,-0.9220590738,1.8945085241,0.5021451893,-2.1635877436,,, +6.5058593750,104,-0.8822862178,1.6426132245,0.2000541814,-2.0357832997,,, +6.5078125000,104,-0.8586193237,1.3510601710,-0.0088587702,-1.6498075394,,, +6.5097656250,104,-0.8515858506,1.0364568395,-0.0855275624,-1.0932682118,,, +6.5117187500,104,-0.8614111149,0.7169787421,-0.0122391871,-0.4996312670,,, +6.5136718750,104,-0.8880143265,0.4111095934,0.2045957101,-0.0118642313,,, +6.5156250000,104,-0.9310099903,0.1363600204,0.5354336784,0.2565205421,,, +6.5175781250,104,-0.9897146493,-0.0919458549,0.9321964173,0.2523480156,,, +6.5195312500,104,-1.0631588504,-0.2617313590,1.3357596872,-0.0028737101,,, +6.5214843750,104,-1.1501041241,-0.3650017733,1.6851667231,-0.4190734981,,, +6.5234375000,104,-1.2490646794,-0.3983942268,1.9271310783,-0.8625237427,,, +6.5253906250,104,-1.3583334367,-0.3634046467,2.0243487221,-1.1927051770,,, +6.5273437500,104,-1.4760119392,-0.2662759576,1.9613246617,-1.3010243695,,, +6.5292968750,104,-1.6000436226,-0.1175553436,1.7468064636,-1.1407706717,,, +6.5312500000,104,-1.7282498578,0.0686485386,1.4124455238,-0.7401004875,,, +6.5332031250,104,-1.8583681373,0.2756565802,1.0078944650,-0.1944885507,,, +6.5351562500,104,-1.9880917356,0.4853893524,0.5931041123,0.3592864888,,, +6.5371093750,104,-2.1151101496,0.6796347376,0.2290196637,0.7804938308,,, +6.5390625000,104,-2.2371496105,0.8413246466,-0.0318750133,0.9629039143,,, +6.5410156250,104,-2.3520129583,0.9557317799,-0.1536923872,0.8638056038,,, +6.5429687500,104,-2.4576181798,1.0115029616,-0.1226887163,0.5156353470,,, +6.5449218750,104,-2.5520349368,1.0014569762,0.0506398598,0.0170318171,,, +6.5468750000,104,-2.6335184431,0.9230912580,0.3332388282,-0.4942317841,,, +6.5488281250,104,-2.7005400980,0.7787620871,0.6746922495,-0.8790190016,,, +6.5507812500,104,-2.7518143398,0.5755257139,1.0151254291,-1.0349528997,,, +6.5527343750,104,-2.7863212491,0.3246514785,1.2945821579,-0.9244421191,,, +6.5546875000,104,-2.8033245055,0.0408408659,1.4624156888,-0.5849294224,,, +6.5566406250,104,-2.8023843843,-0.2587930563,1.4852304720,-0.1185544163,,, +6.5585937500,104,-2.7833655641,-0.5559146602,1.3521373925,0.3359357049,,, +6.5605468750,104,-2.7464396101,-0.8322403363,1.0765036908,0.6413280733,,, +6.5625000000,105,-2.6920820881,-1.0708097558,0.6939247154,0.6996840818,,, +6.5644531250,105,-2.6210643609,-1.2571651750,0.2567331276,0.4793326971,,, +6.5664062500,105,-2.5344402096,-1.3803565535,-0.1740995081,0.0237176748,,, +6.5683593750,105,-2.4335275151,-1.4337024022,-0.5384076628,-0.5603276497,,, +6.5703125000,105,-2.3198853194,-1.4152533102,-0.7861524911,-1.1316661719,,, +6.5722656250,105,-2.1952866689,-1.3279258319,-0.8851667184,-1.5533337066,,, +6.5742187500,105,-2.0616877150,-1.1792974030,-0.8261177268,-1.7298631746,,, +6.5761718750,105,-1.9211936128,-0.9810765899,-0.6239160647,-1.6332288599,,, +6.5781250000,105,-1.7760218153,-0.7482856145,-0.3153502432,-1.3103022726,,, +6.5800781250,105,-1.6284634055,-0.4982121633,0.0466835589,-0.8697783109,,, +6.5820312500,105,-1.4808431429,-0.2492035740,0.4014579069,-0.4521570215,,, +6.5839843750,105,-1.3354789251,-0.0193874856,0.6899073430,-0.1910102132,,, +6.5859375000,105,-1.1946413725,0.1745918373,0.8638596287,-0.1761507277,,, +6.5878906250,105,-1.0605142461,0.3187333846,0.8935670124,-0.4288006767,,, +6.5898437500,105,-0.9351563881,0.4026546086,0.7723643318,-0.8955663473,,, +6.5917968750,105,-0.8204658550,0.4203139572,0.5177282926,-1.4628730595,,, +6.5937500000,105,-0.7181468688,0.3704303513,0.1685728162,-1.9879057163,,, +6.5957031250,105,-0.6296801659,0.2565703618,-0.2207983753,-2.3375769597,,, +6.5976562500,105,-0.5562972622,0.0868970104,-0.5891400985,-2.4248445982,,, +6.5996093750,105,-0.4989590857,-0.1264022803,-0.8777991571,-2.2324263184,,, +6.6015625000,105,-0.4583393496,-0.3679686909,-1.0398480494,-1.8174135632,,, +6.6035156250,105,-0.4348129581,-0.6203464722,-1.0473963278,-1.2955212592,,, +6.6054687500,105,-0.4284496466,-0.8652039401,-0.8959408225,-0.8092911007,,, +6.6074218750,105,-0.4390129683,-1.0846158460,-0.6050771317,-0.4889637596,,, +6.6093750000,105,-0.4659646451,-1.2623176879,-0.2154615131,-0.4167444204,,, +6.6113281250,105,-0.5084742048,-1.3848444859,0.2175036900,-0.6042558327,,, +6.6132812500,105,-0.5654337385,-1.4424745980,0.6322776489,-0.9893585635,,, +6.6152343750,105,-0.6354775170,-1.4299127515,0.9707411034,-1.4532099562,,, +6.6171875000,105,-0.7170061241,-1.3466646456,1.1872199703,-1.8528862733,,, +6.6191406250,105,-0.8082146838,-1.1970769910,1.2555671757,-2.0606268909,,, +6.6210937500,105,-0.9071246870,-0.9900401802,1.1731998434,-1.9989443052,,, +6.6230468750,105,-1.0116188596,-0.7383743084,0.9614632073,-1.6619765689,,, +6.6250000000,106,-1.1194784628,-0.4579413455,0.6622647617,-1.1172291226,,, +6.6269531250,106,-1.2284223713,-0.1665453544,0.3315031125,-0.4872274815,,, +6.6289062500,106,-1.3361472443,0.1173025671,0.0303152434,0.0838921003,,, +6.6308593750,106,-1.4403680882,0.3756685142,-0.1844942764,0.4696989806,,, +6.6328125000,106,-1.5388584979,0.5924396323,-0.2693511952,0.5959176921,,, +6.6347656250,106,-1.6294898736,0.7544408849,-0.2007504337,0.4605708915,,, +6.6367187500,106,-1.7102689258,0.8523468709,0.0210295627,0.1342969935,,, +6.6386718750,106,-1.7793728117,0.8813251248,0.3719157826,-0.2592425893,,, +6.6406250000,106,-1.8351812874,0.8413660576,0.8077349196,-0.5774947590,,, +6.6425781250,106,-1.8763053133,0.7372765466,1.2710378418,-0.6983281150,,, +6.6445312500,106,-1.9016116114,0.5783376397,1.6999916019,-0.5537516310,,, +6.6464843750,106,-1.9102427438,0.3776502592,2.0379543042,-0.1487951743,,, +6.6484375000,106,-1.9016323615,0.1512145488,2.2422417819,0.4396248969,,, +6.6503906250,106,-1.8755153570,-0.0831929176,2.2907209224,1.0835463100,,, +6.6523437500,106,-1.8319327401,-0.3072657551,2.1852029804,1.6387979763,,, +6.6542968750,106,-1.7712311548,-0.5034512653,1.9511086367,1.9842878676,,, +6.6562500000,106,-1.6940570431,-0.6561812935,1.6334572485,2.0549760342,,, +6.6582031250,106,-1.6013455588,-0.7529645980,1.2898052569,1.8594977375,,, +6.6601562500,106,-1.4943044258,-0.7852645403,0.9812338922,1.4776085083,,, +6.6621093750,106,-1.3743930214,-0.7491008760,0.7627901407,1.0381530105,,, +6.6640625000,106,-1.2432970536,-0.6453336666,0.6748700821,0.6835972939,,, +6.6660156250,106,-1.1028992729,-0.4796094968,0.7368869154,0.5308464264,,, +6.6679687500,106,-0.9552467333,-0.2619737358,0.9442101236,0.6390873985,,, +6.6699218750,106,-0.8025151745,-0.0061758631,1.2688527173,0.9934715920,,, +6.6718750000,106,-0.6469711496,0.2712837113,1.6637996964,1.5091097663,,, +6.6738281250,106,-0.4909325599,0.5522988794,2.0703037153,2.0542852692,,, +6.6757812500,106,-0.3367282902,0.8184152707,2.4270117593,2.4865238352,,, +6.6777343750,106,-0.1866576488,1.0521122211,2.6795014329,2.6916345252,,, +6.6796875000,106,-0.0429503230,1.2380198892,2.7887416438,2.6150218508,,, +6.6816406250,106,0.0922724475,1.3639866588,2.7371599727,2.2766871564,,, +6.6835937500,106,0.2170348015,1.4219224058,2.5313717771,1.7658074101,,, +6.6855468750,106,0.3295406440,1.4083588351,2.2011460020,1.2163765711,,, +6.6875000000,107,0.4282048889,1.3246878224,1.7947688072,0.7705846867,,, +6.6894531250,107,0.5116810090,1.1770611515,1.3715271572,0.5399704005,,, +6.6914062500,107,0.5788844127,0.9759586441,0.9924830786,0.5749926182,,, +6.6933593750,107,0.6290112365,0.7354548072,0.7109755082,0.8513594689,,, +6.6953125000,107,0.6615522253,0.4722351428,0.5643290625,1.2768598732,,, +6.6972656250,107,0.6763014572,0.2044307211,0.5680610534,1.7168237383,,, +6.6992187500,107,0.6733597604,-0.0496477076,0.7134889420,2.0312311273,,, +6.7011718750,107,0.6531327620,-0.2727877848,0.9691107643,2.1132980041,,, +6.7031250000,107,0.6163236040,-0.4500766717,1.2855433841,1.9189613792,,, +6.7050781250,107,0.5639204525,-0.5699414720,1.6032492609,1.4791808084,,, +6.7070312500,107,0.4971790208,-0.6249563958,1.8618480744,0.8916826636,,, +6.7089843750,107,0.4176004106,-0.6123603775,2.0095626837,0.2944076761,,, +6.7109375000,107,0.3269046614,-0.5342490528,2.0113279575,-0.1720631751,,, +6.7128906250,107,0.2270004696,-0.3974277081,1.8542992651,-0.4028086523,,, +6.7148437500,107,0.1199516084,-0.2129354578,1.5499024164,-0.3570983800,,, +6.7167968750,107,0.0079406370,0.0047261670,1.1321055199,-0.0693376634,,, +6.7187500000,107,-0.1067694666,0.2386064227,0.6521816669,0.3605716171,,, +6.7207031250,107,-0.2218750758,0.4704896916,0.1707779182,0.7948103000,,, +6.7226562500,107,-0.3350723936,0.6821683632,-0.2514743855,1.0956009268,,, +6.7246093750,107,-0.4440979289,0.8567154898,-0.5633457762,1.1631412683,,, +6.7265625000,107,-0.5467682625,0.9796684647,-0.7309296190,0.9631143593,,, +6.7285156250,107,-0.6410184061,1.0400411727,-0.7428644383,0.5362339186,,, +6.7304687500,107,-0.7249380836,1.0310940261,-0.6120444999,-0.0127922446,,, +6.7324218750,107,-0.7968052979,0.9508081804,-0.3735525100,-0.5438571524,,, +6.7343750000,107,-0.8551165960,0.8020308504,-0.0791367184,-0.9197718297,,, +6.7363281250,107,-0.8986135032,0.5922815854,0.2109070626,-1.0438038772,,, +6.7382812500,107,-0.9263046620,0.3332329999,0.4371838157,-0.8861497907,,, +6.7402343750,107,-0.9374832892,0.0399021609,0.5505061395,-0.4920860974,,, +6.7421875000,107,-0.9317396444,-0.2703909951,0.5196096682,0.0304345432,,, +6.7441406250,107,-0.9089682933,-0.5792255937,0.3360751049,0.5403428124,,, +6.7460937500,107,-0.8693700360,-0.8683583012,0.0156899754,0.9020666986,,, +6.7480468750,107,-0.8134484689,-1.1209892124,-0.4039622459,1.0226175146,,, +6.7500000000,108,-0.7420012388,-1.3229268867,-0.8693103695,0.8769844890,,, +6.7519531250,108,-0.6561061435,-1.4635713053,-1.3190966441,0.5148789161,,, +6.7539062500,108,-0.5571023205,-1.5366462196,-1.6938780914,0.0469805606,,, +6.7558593750,108,-0.4465668558,-1.5406298385,-1.9452483331,-0.3855429950,,, +6.7578125000,108,-0.3262872190,-1.4788538349,-2.0433437411,-0.6498888247,,, +6.7597656250,108,-0.1982300110,-1.3592637856,-1.9814649474,-0.6581931025,,, +6.7617187500,108,-0.0645065678,-1.1938577650,-1.7770940333,-0.3918018683,,, +6.7636718750,108,0.0726639738,-0.9978422576,-1.4691490878,0.0934155851,,, +6.7656250000,108,0.2109935050,-0.7885642690,-1.1119038575,0.6821688571,,, +6.7675781250,108,0.3481649860,-0.5842941166,-0.7665196179,1.2311270756,,, +6.7695312500,108,0.4818730000,-0.4029437997,-0.4915082859,1.6079795993,,, +6.7714843750,108,0.6098641084,-0.2608103373,-0.3336122376,1.7274735407,,, +6.7734375000,108,0.7299763019,-0.1714317212,-0.3205213687,1.5745534486,,, +6.7753906250,108,0.8401768562,-0.1446352811,-0.4565617561,1.2082634150,,, +6.7773437500,108,0.9385979297,-0.1858448388,-0.7220274131,0.7453442975,,, +6.7792968750,108,1.0235692786,-0.2956949828,-1.0762591808,0.3280236793,,, +6.7812500000,108,1.0936475193,-0.4699793784,-1.4639911400,0.0848284340,,, +6.7832031250,108,1.1476414225,-0.6999367358,-1.8239759739,0.0951619863,,, +6.7851562500,108,1.1846327983,-0.9728545093,-2.0985457344,0.3673564819,,, +6.7871093750,108,1.2039926061,-1.2729482490,-2.2426187510,0.8362169073,,, +6.7890625000,108,1.2053920061,-1.5824552988,-2.2307496672,1.3807319161,,, +6.7910156250,108,1.1888081609,-1.8828665917,-2.0611243669,1.8570988942,,, +6.7929687500,108,1.1545246835,-2.1562106593,-1.7558773833,2.1380134690,,, +6.7949218750,108,1.1031267251,-2.3863003348,-1.3576821615,2.1474566073,,, +6.7968750000,108,1.0354907883,-2.5598552254,-0.9231450506,1.8814462453,,, +6.7988281250,108,0.9527694441,-2.6674216972,-0.5140317255,1.4090669068,,, +6.8007812500,108,0.8563712205,-2.7040262322,-0.1876923348,0.8534957863,,, +6.8027343750,108,0.7479360135,-2.6695166092,0.0118235389,0.3582259375,,, +6.8046875000,108,0.6293064537,-2.5685671325,0.0605784701,0.0477440347,,, +6.8066406250,108,0.5024957263,-2.4103475534,-0.0415753415,-0.0065601994,,, +6.8085937500,108,0.3696524114,-2.2078787851,-0.2710252365,0.1940901445,,, +6.8105468750,108,0.2330229573,-1.9771203500,-0.5841290730,0.5762663557,,, +6.8125000000,109,0.0949124460,-1.7358532045,-0.9240666096,1.0145521852,,, +6.8144531250,109,-0.0423556636,-1.5024358564,-1.2297438681,1.3660308753,,, +6.8164062500,109,-0.1764801093,-1.2945205221,-1.4453632814,1.5095883222,,, +6.8183593750,109,-0.3052220058,-1.1278188611,-1.5291687375,1.3792594094,,, +6.8203125000,109,-0.4264439277,-1.0150033625,-1.4600031402,0.9824769708,,, +6.8222656250,109,-0.5381472122,-0.9648210010,-1.2406568265,0.3982204155,,, +6.8242187500,109,-0.6385068262,-0.9814809766,-0.8974850223,-0.2444301996,,, +6.8261718750,109,-0.7259031900,-1.0643592379,-0.4763536431,-0.8014587180,,, +6.8281250000,109,-0.7989503983,-1.2080403984,-0.0355446316,-1.1531603723,,, +6.8300781250,109,-0.8565203456,-1.4026941253,0.3632744000,-1.2367176238,,, +6.8320312500,109,-0.8977623330,-1.6347597600,0.6646099478,-1.0631783397,,, +6.8339843750,109,-0.9221178144,-1.8878914279,0.8277430708,-0.7141852088,,, +6.8359375000,109,-0.9293300219,-2.1440977367,0.8330311856,-0.3193549176,,, +6.8378906250,109,-0.9194483039,-2.3849965867,0.6849298774,-0.0205089498,,, +6.8398437500,109,-0.8928270990,-2.5930975921,0.4112642660,0.0674385484,,, +6.8417968750,109,-0.8501195644,-2.7530226843,0.0588636003,-0.1117857849,,, +6.8437500000,109,-0.7922659696,-2.8525797785,-0.3137608160,-0.5401590782,,, +6.8457031250,109,-0.7204770594,-2.8836146316,-0.6455537646,-1.1300775291,,, +6.8476562500,109,-0.6362126778,-2.8425814834,-0.8824468734,-1.7481521287,,, +6.8496093750,109,-0.5411560265,-2.7307926864,-0.9857974185,-2.2515650109,,, +6.8515625000,109,-0.4371840092,-2.5543299085,-0.9384206846,-2.5270240281,,, +6.8535156250,109,-0.3263341813,-2.3236230974,-0.7472762410,-2.5216409342,,, +6.8554687500,109,-0.2107688833,-2.0527265589,-0.4423896753,-2.2572719057,,, +6.8574218750,109,-0.0927371868,-1.7583426224,-0.0721777009,-1.8243914553,,, +6.8593750000,109,0.0254646815,-1.4586609694,0.3040952343,-1.3571799036,,, +6.8613281250,109,0.1415337438,-1.1720945528,0.6255539071,-0.9966531960,,, +6.8632812500,109,0.2532007957,-0.9160002449,0.8392041075,-0.8519408955,,, +6.8652343750,109,0.3582703426,-0.7054734185,0.9082008107,-0.9703255158,,, +6.8671875000,109,0.4546592466,-0.5523005068,0.8176048487,-1.3242549351,,, +6.8691406250,109,0.5404334091,-0.4641425714,0.5767313572,-1.8188876141,,, +6.8710937500,109,0.6138418455,-0.4440067996,0.2177241023,-2.3181027060,,, +6.8730468750,109,0.6733475551,-0.4900427717,-0.2094223868,-2.6818462689,,, +6.8750000000,110,0.7176546469,-0.5956776917,-0.6446177006,-2.8045776939,,, +6.8769531250,110,0.7457312438,-0.7500811384,-1.0269997505,-2.6442787301,,, +6.8789062500,110,0.7568277674,-0.9389269118,-1.3043761786,-2.2340737937,,, +6.8808593750,110,0.7504902789,-1.1453988373,-1.4413126278,-1.6732757883,,, +6.8828125000,110,0.7265686468,-1.3513703713,-1.4246082938,-1.1003103317,,, +6.8847656250,110,0.6852193947,-1.5386757369,-1.2653061436,-0.6549376990,,, +6.8867187500,110,0.6269031808,-1.6903839327,-0.9969249381,-0.4401248133,,, +6.8886718750,110,0.5523769537,-1.7919867582,-0.6701886815,-0.4940153785,,, +6.8906250000,110,0.4626809197,-1.8324179939,-0.3450746779,-0.7796785296,,, +6.8925781250,110,0.3591205521,-1.8048326487,-0.0814190200,-1.1954437005,,, +6.8945312500,110,0.2432439550,-1.7070919194,0.0704569656,-1.6029872565,,, +6.8964843750,110,0.1168149801,-1.5419200254,0.0776390544,-1.8654711327,,, +6.8984375000,110,-0.0182174348,-1.3167219669,-0.0701983203,-1.8852787130,,, +6.9003906250,110,-0.1597531679,-1.0430748959,-0.3591286372,-1.6310035298,,, +6.9023437500,110,-0.3055774623,-0.7359285522,-0.7530873600,-1.1462918270,,, +6.9042968750,110,-0.4533994834,-0.4125705023,-1.1994345294,-0.5381133417,,, +6.9062500000,110,-0.6008922073,-0.0914283219,-1.6370997586,0.0523272061,,, +6.9082031250,110,-0.7457329448,0.2092077687,-2.0060412935,0.4880677293,,, +6.9101562500,110,-0.8856437891,0.4724527568,-2.2565461201,0.6737119679,,, +6.9121093750,110,-1.0184312805,0.6839967854,-2.3569228532,0.5813710526,,, +6.9140625000,110,-1.1420245931,0.8330956267,-2.2983894673,0.2581154896,,, +6.9160156250,110,-1.2545115753,0.9133126310,-2.0963948354,-0.1871030571,,, +6.9179687500,110,-1.3541720135,0.9229604273,-1.7881684903,-0.6134742279,,, +6.9199218750,110,-1.4395075352,0.8652115915,-1.4268804792,-0.8870659563,,, +6.9218750000,110,-1.5092676299,0.7478705789,-1.0733211704,-0.9176580331,,, +6.9238281250,110,-1.5624713313,0.5828228415,-0.7863971333,-0.6835761400,,, +6.9257812500,110,-1.5984241813,0.3851995589,-0.6139236042,-0.2377191408,,, +6.9277343750,110,-1.6167301792,0.1723162431,-0.5851478359,0.3068730306,,, +6.9296875000,110,-1.6172985067,-0.0375407544,-0.7061680201,0.8079560350,,, +6.9316406250,110,-1.6003449113,-0.2263951996,-0.9589614517,1.1330438940,,, +6.9335937500,110,-1.5663877237,-0.3778400586,-1.3041734281,1.1957194840,,, +6.9355468750,110,-1.5162385797,-0.4781868944,-1.6872326002,0.9793410843,,, +6.9375000000,111,-1.4509880084,-0.5174254152,-2.0468403642,0.5416474658,,, +6.9394531250,111,-1.3719861395,-0.4899262506,-2.3245120877,-0.0010010672,,, +6.9414062500,111,-1.2808188680,-0.3948379390,-2.4736841193,-0.5054272888,,, +6.9433593750,111,-1.1792798928,-0.2361504336,-2.4669681387,-0.8407714911,,, +6.9453125000,111,-1.0693391205,-0.0224206893,-2.3004229448,-0.9242312231,,, +6.9472656250,111,-0.9531079858,0.2338205419,-1.9941783092,-0.7436123619,,, +6.9492187500,111,-0.8328022975,0.5169393476,-1.5893136853,-0.3605123334,,, +6.9511718750,111,-0.7107032597,0.8092860194,-1.1414778697,0.1067354034,,, +6.9531250000,111,-0.5891173520,1.0924233244,-0.7122433033,0.5156795254,,, +6.9550781250,111,-0.4703357698,1.3484100378,-0.3595415261,0.7389902085,,, +6.9570312500,111,-0.3565941358,1.5610502364,-0.1286693891,0.6995634466,,, +6.9589843750,111,-0.2500331889,1.7170212393,-0.0452667153,0.3918672956,,, +6.9609375000,111,-0.1526611376,1.8068015425,-0.1113590151,-0.1163223841,,, +6.9628906250,111,-0.0663183382,1.8253340428,-0.3050814497,-0.7022745134,,, +6.9648437500,111,0.0073550844,1.7723783027,-0.5841268426,-1.2217159572,,, +6.9667968750,111,0.0669481049,1.6525272909,-0.8923804860,-1.5481498706,,, +6.9687500000,111,0.1113036515,1.4748874320,-1.1687081131,-1.6073053937,,, +6.9707031250,111,0.1395390075,1.2524442745,-1.3565280275,-1.3972791812,,, +6.9726562500,111,0.1510614057,1.0011580075,-1.4126762322,-0.9888506415,,, +6.9746093750,111,0.1455785407,0.7388518975,-1.3141835099,-0.5058864855,,, +6.9765625000,111,0.1231038160,0.4839711528,-1.0619086187,-0.0912070196,,, +6.9785156250,111,0.0839562335,0.2542987589,-0.6804614399,0.1327289881,,, +6.9804687500,111,0.0287549275,0.0657178297,-0.2144277637,0.0975440844,,, +6.9824218750,111,-0.0415915617,-0.0688932285,0.2785165648,-0.1921765746,,, +6.9843750000,111,-0.1259010860,-0.1405557019,0.7365299229,-0.6600186040,,, +6.9863281250,111,-0.2227384837,-0.1448133024,1.1031779020,-1.1785770521,,, +6.9882812500,111,-0.3304406088,-0.0820392307,1.3361642629,-1.6042901487,,, +6.9902343750,111,-0.4471453574,0.0425938329,1.4138602577,-1.8167221254,,, +6.9921875000,111,-0.5708241825,0.2194787069,1.3386156318,-1.7515295427,,, +6.9941406250,111,-0.6993175288,0.4352481958,1.1363358876,-1.4180765215,,, +6.9960937500,111,-0.8303725664,0.6737120404,0.8523919362,-0.8968713443,,, +6.9980468750,111,-0.9616825627,0.9169909813,0.5444995035,-0.3175270417,,, +7.0000000000,112,-1.0909272040,1.1467688435,0.2736776303,0.1767138353,,, +7.0019531250,112,-1.2158131594,1.3455753162,0.0946947820,0.4681679128,,, +7.0039062500,112,-1.3341141783,1.4980099614,0.0474908856,0.4968732676,,, +7.0058593750,112,-1.4437100185,1.5918220848,0.1509115894,0.2769113155,,, +7.0078125000,112,-1.5426235232,1.6187711499,0.3997308890,-0.1075840830,,, +7.0097656250,112,-1.6290551984,1.5752077227,0.7654260666,-0.5256353875,,, +7.0117187500,112,-1.7014146849,1.4623344196,1.2005844344,-0.8354858884,,, +7.0136718750,112,-1.7583485738,1.2861286457,1.6462556821,-0.9236343028,,, +7.0156250000,112,-1.7987640785,1.0569324972,2.0411048172,-0.7361396364,,, +7.0175781250,112,-1.8218481487,0.7887384061,2.3309402188,-0.2936148467,,, +7.0195312500,112,-1.8270816924,0.4982203282,2.4771328792,0.3142018632,,, +7.0214843750,112,-1.8142486552,0.2035780130,2.4626155908,0.9528122331,,, +7.0234375000,112,-1.7834398005,-0.0767250660,2.2945277542,1.4795838897,,, +7.0253906250,112,-1.7350511212,-0.3252421313,2.0030939214,1.7826010771,,, +7.0273437500,112,-1.6697769142,-0.5267526006,1.6369107879,1.8110945023,,, +7.0292968750,112,-1.5885976360,-0.6693163392,1.2553767236,1.5891125596,,, +7.0312500000,112,-1.4927627539,-0.7450991679,0.9194429811,1.2086892369,,, +7.0332031250,112,-1.3837688922,-0.7509120769,0.6821271032,0.8043833361,,, +7.0351562500,112,-1.2633336565,-0.6884265622,0.5802660706,0.5161691667,,, +7.0371093750,112,-1.1333655937,-0.5640510858,0.6287936139,0.4508513293,,, +7.0390625000,112,-0.9959308151,-0.3884772902,0.8184329414,0.6525806332,,, +7.0410156250,112,-0.8532168653,-0.1759276290,1.1171641462,1.0905537529,,, +7.0429687500,112,-0.7074944708,0.0568431064,1.4752376088,1.6672695710,,, +7.0449218750,112,-0.5610778373,0.2917227192,1.8329523877,2.2450810573,,, +7.0468750000,112,-0.4162841915,0.5105110534,2.1299879089,2.6837671362,,, +7.0488281250,112,-0.2753932753,0.6961954140,2.3148353155,2.8788285890,,, +7.0507812500,112,-0.1406075016,0.8341430080,2.3528592984,2.7900134344,,, +7.0527343750,112,-0.0140134700,0.9131272379,2.2317345250,2.4522548577,,, +7.0546875000,112,0.1024544850,0.9261162687,1.9634096879,1.9660247620,,, +7.0566406250,112,0.2070480736,0.8707688620,1.5822930255,1.4697473800,,, +7.0585937500,112,0.2982355680,0.7496028919,1.1399416802,1.1018339809,,, +7.0605468750,112,0.3747285219,0.5698247750,0.6970817935,0.9627440469,,, +7.0625000000,113,0.4355042258,0.3428316999,0.3142019836,1.0874708313,,, +7.0644531250,113,0.4798235032,0.0834213535,0.0421850439,1.4359919918,,, +7.0664062500,113,0.5072435382,-0.1912357575,-0.0855632572,1.9043020984,,, +7.0683593750,113,0.5176255079,-0.4627897367,-0.0582625809,2.3530027376,,, +7.0703125000,113,0.5111368873,-0.7129872687,0.1106179744,2.6456137265,,, +7.0722656250,113,0.4882483867,-0.9249411604,0.3855129186,2.6861044989,,, +7.0742187500,113,0.4497255736,-1.0843049334,0.7143548297,2.4453582682,,, +7.0761718750,113,0.3966153278,-1.1802705657,1.0367385694,1.9693145969,,, +7.0781250000,113,0.3302273659,-1.2063198145,1.2933833503,1.3665572456,,, +7.0800781250,113,0.2521111587,-1.1606767335,1.4354186030,0.7787474588,,, +7.0820312500,113,0.1640286465,-1.0464298347,1.4320470445,0.3420042685,,, +7.0839843750,113,0.0679232294,-0.8713153803,1.2753911158,0.1498144353,,, +7.0859375000,113,-0.0341144241,-0.6471769193,0.9817676687,0.2276353229,,, +7.0878906250,113,-0.1398831511,-0.3891387611,0.5891921124,0.5261492415,,, +7.0898437500,113,-0.2471100075,-0.1145510234,0.1515005238,0.9350159330,,, +7.0917968750,113,-0.3534902418,0.1582201795,-0.2699949943,1.3133519025,,, +7.0937500000,113,-0.4567278299,0.4110730427,-0.6160181957,1.5285809592,,, +7.0957031250,113,-0.5545758612,0.6274315930,-0.8385264883,1.4930060305,,, +7.0976562500,113,-0.6448760677,0.7934004575,-0.9081622212,1.1880768668,,, +7.0996093750,113,-0.7255968058,0.8987323567,-0.8187970499,0.6697004814,,, +7.1015625000,113,-0.7948688232,0.9375408568,-0.5884617176,0.0531368468,,, +7.1035156250,113,-0.8510181864,0.9087086846,-0.2565165633,-0.5183824813,,, +7.1054687500,113,-0.8925957915,0.8159631349,0.1224964261,-0.9127139912,,, +7.1074218750,113,-0.9184029416,0.6676133181,0.4873623547,-1.0448367754,,, +7.1093750000,113,-0.9275125416,0.4759675766,0.7797375964,-0.8999876587,,, +7.1113281250,113,-0.9192855421,0.2564717031,0.9532428096,-0.5375577292,,, +7.1132812500,113,-0.8933823408,0.0266280616,0.9806884747,-0.0746836716,,, +7.1152343750,113,-0.8497689440,-0.1952290057,0.8583075305,0.3459678260,,, +7.1171875000,113,-0.7887177800,-0.3912160817,0.6063358700,0.5953922951,,, +7.1191406250,113,-0.7108031485,-0.5451524192,0.2658503141,0.5936741497,,, +7.1210937500,113,-0.6168913877,-0.6436932254,-0.1076433790,0.3319378255,,, +7.1230468750,113,-0.5081259296,-0.6772654503,-0.4528736903,-0.1251931326,,, +7.1250000000,114,-0.3859075051,-0.6407408097,-0.7123682718,-0.6573031665,,, +7.1269531250,114,-0.2518698468,-0.5337990995,-0.8414307287,-1.1212049652,,, +7.1289062500,114,-0.1078513127,-0.3609564531,-0.8151309357,-1.3902227838,,, +7.1308593750,114,0.0441370698,-0.1312565572,-0.6322199571,-1.3889719938,,, +7.1328125000,114,0.2019465839,0.1423536539,-0.3153596294,-1.1141021845,,, +7.1347656250,114,0.3633282103,0.4439203069,0.0923691391,-0.6353179111,,, +7.1367187500,114,0.5259717714,0.7555884121,0.5341357024,-0.0763963021,,, +7.1386718750,114,0.6875461436,1.0588401038,0.9481680801,0.4185971768,,, +7.1406250000,114,0.8457398354,1.3357789662,1.2773287031,0.7246369310,,, +7.1425781250,114,0.9983012219,1.5703709030,1.4779662732,0.7698322618,,, +7.1445312500,114,1.1430777290,1.7495550345,1.5266652659,0.5549464505,,, +7.1464843750,114,1.2780532829,1.8641471747,1.4238420698,0.1529920936,,, +7.1484375000,114,1.4013833692,1.9094729013,1.1936279154,-0.3109845064,,, +7.1503906250,114,1.5114270874,1.8856860900,0.8800571078,-0.6943874217,,, +7.1523437500,114,1.6067756399,1.7977507185,0.5401545494,-0.8763705424,,, +7.1542968750,114,1.6862767565,1.6550872244,0.2349994946,-0.7911794789,,, +7.1562500000,114,1.7490546274,1.4709080974,0.0201576948,-0.4463957694,,, +7.1582031250,114,1.7945249954,1.2612890518,-0.0630275314,0.0789189479,,, +7.1601562500,114,1.8224051435,1.0440405683,0.0060714489,0.6556723152,,, +7.1621093750,114,1.8327186024,0.8374585124,0.2241006540,1.1399076718,,, +7.1640625000,114,1.8257944968,0.6590409708,0.5641948531,1.4120515167,,, +7.1660156250,114,1.8022615411,0.5242608003,0.9801112436,1.4094874680,,, +7.1679687500,114,1.7630367899,0.4454795013,1.4133828715,1.1435310914,,, +7.1699218750,114,1.7093093412,0.4310781718,1.8023778765,0.6961551201,,, +7.1718750000,114,1.6425192769,0.4848661573,2.0918537930,0.1973642814,,, +7.1738281250,114,1.5643322091,0.6058086527,2.2415190186,-0.2105778315,,, +7.1757812500,114,1.4766098804,0.7880922639,2.2322681891,-0.4122640923,,, +7.1777343750,114,1.3813773296,1.0215239751,2.0691204873,-0.3508797946,,, +7.1796875000,114,1.2807872008,1.2922357132,1.7804034346,-0.0438602801,,, +7.1816406250,114,1.1770818197,1.5836453946,1.4133094822,0.4218219283,,, +7.1835937500,114,1.0725537012,1.8776074501,1.0265176615,0.9134495284,,, +7.1855468750,114,0.9695051802,2.1556726112,0.6810296659,1.2889120867,,, +7.1875000000,115,0.8702078730,2.4003691243,0.4306478299,1.4356543256,,, +7.1894531250,115,0.7768626781,2.5964160593,0.3135782307,1.3015465783,,, +7.1914062500,115,0.6915610184,2.7317841181,0.3464668716,0.9092166204,,, +7.1933593750,115,0.6162480022,2.7985299809,0.5217979244,0.3499146218,,, +7.1953125000,115,0.5526881493,2.7933460183,0.8090593249,-0.2414078824,,, +7.1972656250,115,0.5024342813,2.7177870465,1.1594942144,-0.7229756311,,, +7.1992187500,115,0.4668001220,2.5781583230,1.5136981812,-0.9849177591,,, +7.2011718750,115,0.4468370877,2.3850726003,1.8108789879,-0.9792332952,,, +7.2031250000,115,0.4433156726,2.1527071350,1.9983365092,-0.7327826773,,, +7.2050781250,115,0.4567117575,1.8978124696,2.0396862832,-0.3397461458,,, +7.2070312500,115,0.4871980791,1.6385421141,1.9205457483,0.0643824617,,, +7.2089843750,115,0.5346410125,1.3931847432,1.6507974186,0.3401372674,,, +7.2109375000,115,0.5986027199,1.1788873216,1.2630763879,0.3825212124,,, +7.2128906250,115,0.6783486309,1.0104582016,0.8077176161,0.1500087885,,, +7.2148437500,115,0.7728601217,0.8993336607,0.3449498404,-0.3238401710,,, +7.2167968750,115,0.8808521720,0.8527799466,-0.0644482139,-0.9393407248,,, +7.2187500000,115,1.0007956907,0.8733864765,-0.3685741565,-1.5577634943,,, +7.2207031250,115,1.1309441191,0.9588855317,-0.5324427882,-2.0391159369,,, +7.2226562500,115,1.2693638460,1.1023110193,-0.5433892942,-2.2802716830,,, +7.2246093750,115,1.4139679027,1.2924852311,-0.4129934254,-2.2429999874,,, +7.2265625000,115,1.5625523470,1.5147996534,-0.1752252042,-1.9642153869,,, +7.2285156250,115,1.7128347004,1.7522353761,0.1188987771,-1.5456405128,,, +7.2304687500,115,1.8624937647,1.9865519422,0.4093158966,-1.1257171668,,, +7.2324218750,115,2.0092101212,2.1995617316,0.6363284846,-0.8414658989,,, +7.2343750000,115,2.1507066035,2.3744010051,0.7499591584,-0.7907490295,,, +7.2363281250,115,2.2847880348,2.4967089712,0.7177930851,-1.0052813617,,, +7.2382812500,115,2.4093795352,2.5556326470,0.5300854085,-1.4417870681,,, +7.2402343750,115,2.5225627264,2.5445874353,0.2013380397,-1.9937277632,,, +7.2421875000,115,2.6226092023,2.4617203709,-0.2319000760,-2.5203886562,,, +7.2441406250,115,2.7080106773,2.3100437238,-0.7166668895,-2.8853521751,,, +7.2460937500,115,2.7775052853,2.0972296341,-1.1917781560,-2.9938154399,,, +7.2480468750,115,2.8300995701,1.8350800877,-1.5972998315,-2.8185246312,,, +7.2500000000,116,2.8650857800,1.5387091828,-1.8838268707,-2.4072188694,,, +7.2519531250,116,2.8820541660,1.2254946992,-2.0201234830,-1.8695436982,,, +7.2539062500,116,2.8809000661,0.9138720674,-1.9979351105,-1.3470208266,,, +7.2558593750,116,2.8618256545,0.6220548262,-1.8332229017,-0.9743043434,,, +7.2578125000,116,2.8253363220,0.3667707820,-1.5636286597,-0.8423415294,,, +7.2597656250,116,2.7722317536,0.1621019860,-1.2425653561,-0.9735341961,,, +7.2617187500,116,2.7035918581,0.0185094097,-0.9308538747,-1.3157072958,,, +7.2636718750,116,2.6207577967,-0.0578896860,-0.6872088240,-1.7565368517,,, +7.2656250000,116,2.5253084423,-0.0657413107,-0.5590555061,-2.1544817871,,, +7.2675781250,116,2.4190326827,-0.0085419917,-0.5751085327,-2.3777408386,,, +7.2695312500,116,2.3038980515,0.1056123583,-0.7408681787,-2.3405561469,,, +7.2714843750,116,2.1820162369,0.2645984266,-1.0377360927,-2.0269121656,,, +7.2734375000,116,2.0556060720,0.4531184344,-1.4258882285,-1.4951329679,,, +7.2753906250,116,1.9269546548,0.6537745250,-1.8504576400,-0.8621160899,,, +7.2773437500,116,1.7983772782,0.8482896699,-2.2500642307,-0.2715219665,,, +7.2792968750,116,1.6721768725,1.0187899361,-2.5663629773,0.1453647684,,, +7.2812500000,116,1.5506036698,1.1490586829,-2.7531234978,0.3053774894,,, +7.2832031250,116,1.4358157970,1.2256752106,-2.7834268036,0.1960195766,,, +7.2851562500,116,1.3298414874,1.2389584414,-2.6538583171,-0.1213524485,,, +7.2871093750,116,1.2345435723,1.1836498116,-2.3850440610,-0.5285848794,,, +7.2890625000,116,1.1515868744,1.0592877350,-2.0184464731,-0.8833451942,,, +7.2910156250,116,1.0824090745,0.8702475098,-1.6099188665,-1.0583610085,,, +7.2929687500,116,1.0281955605,0.6254438671,-1.2210223875,-0.9765233382,,, +7.2949218750,116,0.9898587006,0.3377168885,-0.9094578112,-0.6322314431,,, +7.2968750000,116,0.9680219018,0.0229440956,-0.7201023590,-0.0931273903,,, +7.2988281250,116,0.9630087345,-0.3010593864,-0.6780474717,0.5182568241,,, +7.3007812500,116,0.9748373122,-0.6157759128,-0.7847217910,1.0579112598,,, +7.3027343750,116,1.0032200263,-0.9032695421,-1.0177030487,1.3996633979,,, +7.3046875000,116,1.0475686384,-1.1474298573,-1.3342479785,1.4696230601,,, +7.3066406250,116,1.1070046434,-1.3350886679,-1.6779902489,1.2663177322,,, +7.3085937500,116,1.1803747197,-1.4569317351,-1.9877629627,0.8610007878,,, +7.3105468750,116,1.2662709975,-1.5081419568,-2.2071713451,0.3780489337,,, +7.3125000000,117,1.3630557893,-1.4887291762,-2.2934243817,-0.0391780520,,, +7.3144531250,117,1.4688903499,-1.4035236267,-2.2240495809,-0.2676580727,,, +7.3164062500,117,1.5817671627,-1.2618334855,-2.0004447378,-0.2384311290,,, +7.3183593750,117,1.6995451858,-1.0767904254,-1.6477132238,0.0445154361,,, +7.3203125000,117,1.8199874419,-0.8644288158,-1.2108081772,0.5053765146,,, +7.3222656250,117,1.9408002925,-0.6425627916,-0.7475858744,1.0173636207,,, +7.3242187500,117,2.0596737104,-0.4295395082,-0.3198499676,1.4375333759,,, +7.3261718750,117,2.1743218429,-0.2429555295,0.0162187948,1.6460638215,,, +7.3281250000,117,2.2825231579,-0.0984258707,0.2187570362,1.5792130874,,, +7.3300781250,117,2.3821594679,-0.0084915397,0.2666834902,1.2469262411,,, +7.3320312500,117,2.4712531495,0.0182582314,0.1629273827,0.7302634491,,, +7.3339843750,117,2.5480019064,-0.0222121482,-0.0660820931,0.1593528022,,, +7.3359375000,117,2.6108104670,-0.1291006445,-0.3745854095,-0.3220913834,,, +7.3378906250,117,2.6583186620,-0.2968213031,-0.7046717273,-0.5959620959,,, +7.3398437500,117,2.6894253890,-0.5153919021,-0.9953488693,-0.6019251078,,, +7.3417968750,117,2.7033080465,-0.7711285251,-1.1920912905,-0.3537427896,,, +7.3437500000,117,2.6994370947,-1.0475986208,-1.2553786482,0.0647155592,,, +7.3457031250,117,2.6775854895,-1.3267660929,-1.1668948081,0.5226813102,,, +7.3476562500,117,2.6378328240,-1.5902485699,-0.9324215354,0.8785493938,,, +7.3496093750,117,2.5805641047,-1.8205991813,-0.5809759519,1.0189105675,,, +7.3515625000,117,2.5064631838,-2.0025234578,-0.1603259105,0.8898533469,,, +7.3535156250,117,2.4165009630,-2.1239464966,0.2704183873,0.5119545610,,, +7.3554687500,117,2.3119185746,-2.1768559703,0.6499827978,-0.0251520057,,, +7.3574218750,117,2.1942058342,-2.1578621942,0.9244482247,-0.5871423170,,, +7.3593750000,117,2.0650753434,-2.0684361890,1.0556276825,-1.0316278830,,, +7.3613281250,117,1.9264326937,-1.9148091373,1.0269967689,-1.2470044397,,, +7.3632812500,117,1.7803432959,-1.7075402363,0.8462539290,-1.1828779632,,, +7.3652343750,117,1.6289964134,-1.4607830777,0.5441118014,-0.8637307301,,, +7.3671875000,117,1.4746670297,-1.1913017047,0.1695079465,-0.3820833925,,, +7.3691406250,117,1.3196762192,-0.9173049518,-0.2180190658,0.1269716032,,, +7.3710937500,117,1.1663507125,-0.6571803441,-0.5576007424,0.5228845391,,, +7.3730468750,117,1.0169823659,-0.4282158366,-0.7965129228,0.6982380105,,, +7.3750000000,118,0.8737882447,-0.2453985203,-0.8983775800,0.6082346142,,, +7.3769531250,118,0.7388720175,-0.1203740553,-0.8488147525,0.2830005373,,, +7.3789062500,118,0.6141873397,-0.0606393803,-0.6576643689,-0.1806673069,,, +7.3808593750,118,0.5015038649,-0.0690249840,-0.3574320037,-0.6458488351,,, +7.3828125000,118,0.4023764810,-0.1435028267,0.0017992321,-0.9730670491,,, +7.3847656250,118,0.3181183085,-0.2773332946,0.3601980297,-1.0585768951,,, +7.3867187500,118,0.2497779344,-0.4595409252,0.6575358316,-0.8628823821,,, +7.3886718750,118,0.1981212792,-0.6756857169,0.8426027586,-0.4216655598,,, +7.3906250000,118,0.1636184156,-0.9088762213,0.8812217433,0.1638688585,,, +7.3925781250,118,0.1464355687,-1.1409537578,0.7616124223,0.7545880709,,, +7.3945312500,118,0.1464324377,-1.3537651566,0.4962691110,1.2114033827,,, +7.3964843750,118,0.1631648869,-1.5304352617,0.1200601253,1.4332144132,,, +7.3984375000,118,0.1958929566,-1.6565504415,-0.3151557556,1.3844275253,,, +7.4003906250,118,0.2435940561,-1.7211705629,-0.7485574256,1.1045082171,,, +7.4023437500,118,0.3049811060,-1.7175988417,-1.1197840288,0.6969512850,,, +7.4042968750,118,0.3785253115,-1.6438558709,-1.3782846327,0.3006936433,,, +7.4062500000,118,0.4624831701,-1.5028247523,-1.4911390182,0.0518067079,,, +7.4082031250,118,0.5549272383,-1.3020571962,-1.4481317389,0.0459694013,,, +7.4101562500,118,0.6537801196,-1.0532540912,-1.2632894291,0.3120089336,,, +7.4121093750,118,0.7568510784,-0.7714567502,-0.9726422052,0.8037632008,,, +7.4140625000,118,0.8618746386,-0.4740052115,-0.6285581245,1.4124972385,,, +7.4160156250,118,0.9665504902,-0.1793362186,-0.2915334308,1.9964729127,,, +7.4179687500,118,1.0685840064,0.0942953165,-0.0207175846,2.4195698031,,, +7.4199218750,118,1.1657266602,0.3300822280,0.1353508613,2.5883745267,,, +7.4218750000,118,1.2558156334,0.5138301303,0.1463543260,2.4775754301,,, +7.4238281250,118,1.3368119245,0.6349403438,0.0049666276,2.1367046385,,, +7.4257812500,118,1.4068362873,0.6871421900,-0.2719595097,1.6763814691,,, +7.4277343750,118,1.4642023714,0.6689236034,-0.6459730823,1.2378291558,,, +7.4296875000,118,1.5074464844,0.5836300509,-1.0629718625,0.9540209760,,, +7.4316406250,118,1.5353534537,0.4392248740,-1.4615898274,0.9131058431,,, +7.4335937500,118,1.5469781357,0.2477277829,-1.7827187918,1.1341385324,,, +7.4355468750,118,1.5416621952,0.0243706722,-1.9786814017,1.5617671985,,, +7.4375000000,119,1.5190458612,-0.2134703607,-2.0206269320,2.0813350281,,, +7.4394531250,119,1.4790744536,-0.4474923052,-1.9029981245,2.5502577790,,, +7.4414062500,119,1.4219995647,-0.6597469374,-1.6443734829,2.8370780189,,, +7.4433593750,119,1.3483748779,-0.8338975404,-1.2845539682,2.8574927219,,, +7.4453125000,119,1.2590466923,-0.9563629970,-0.8783479693,2.5974801831,,, +7.4472656250,119,1.1551393237,-1.0172694626,-0.4870226698,2.1171876918,,, +7.4492187500,119,1.0380356335,-1.0111432440,-0.1687533784,1.5345140989,,, +7.4511718750,119,0.9093530289,-0.9372965559,0.0304415552,0.9928862263,,, +7.4531250000,119,0.7709153534,-0.7998792476,0.0838682700,0.6220598646,,, +7.4550781250,119,0.6247211596,-0.6075928809,-0.0116890224,0.5026876628,,, +7.4570312500,119,0.4729089207,-0.3730870921,-0.2354753353,0.6443636415,,, +7.4589843750,119,0.3177197883,-0.1120803216,-0.5460097953,0.9831603488,,, +7.4609375000,119,0.1614585501,0.1577337802,-0.8875626646,1.3993321717,,, +7.4628906250,119,0.0064534690,0.4179180167,-1.1988555934,1.7503312319,,, +7.4648437500,119,-0.1449842908,0.6505754977,-1.4226299031,1.9100854414,,, +7.4667968750,119,-0.2906009429,0.8395961560,-1.5145924764,1.8037719121,,, +7.4687500000,119,-0.4282393553,0.9717790099,-1.4503457556,1.4285533996,,, +7.4707031250,119,-0.5558766399,1.0377519152,-1.2292223157,0.8545924961,,, +7.4726562500,119,-0.6716593931,1.0326246704,-0.8744265909,0.2060635011,,, +7.4746093750,119,-0.7739359745,0.9563299358,-0.4294614950,-0.3726361061,,, +7.4765625000,119,-0.8612852549,0.8136281902,0.0486036903,-0.7562163452,,, +7.4785156250,119,-0.9325413333,0.6137763823,0.4979758121,-0.8725903821,,, +7.4804687500,119,-0.9868137885,0.3698833795,0.8617136932,-0.7223927103,,, +7.4824218750,119,-1.0235031109,0.0979971601,1.0965460782,-0.3785726378,,, +7.4843750000,119,-1.0423110454,-0.1840126023,1.1795584947,0.0338234439,,, +7.4863281250,119,-1.0432456632,-0.4576986442,1.1117077740,0.3721379489,,, +7.4882812500,119,-1.0266210745,-0.7053201559,0.9176171015,0.5154027052,,, +7.4902343750,119,-0.9930517866,-0.9110772298,0.6416837960,0.3976813843,,, +7.4921875000,119,-0.9434418076,-1.0622096355,0.3411063367,0.0263139416,,, +7.4941406250,119,-0.8789686844,-1.1498833094,0.0769170061,-0.5199386955,,, +7.4960937500,119,-0.8010627567,-1.1698027472,-0.0955828470,-1.1123425572,,, +7.4980468750,119,-0.7113819887,-1.1225066036,-0.1354948723,-1.6073541284,,, +7.5000000000,120,-0.6117828212,-1.0133258960,-0.0227520957,-1.8858631541,,, +7.5019531250,120,-0.5042875516,-0.8520077358,0.2386979345,-1.8857602924,,, +7.5039062500,120,-0.3910488163,-0.6520308362,0.6214513148,-1.6189044138,,, +7.5058593750,120,-0.2743117947,-0.4296605395,1.0788606142,-1.1678397323,,, +7.5078125000,120,-0.1563747993,-0.2028092710,1.5522464700,-0.6631627125,,, +7.5097656250,120,-0.0395489390,0.0102181030,1.9799849797,-0.2477418026,,, +7.5117187500,120,0.0738824352,0.1920065113,2.3070557410,-0.0375960826,,, +7.5136718750,120,0.1817037936,0.3272510798,2.4935636352,-0.0901544025,,, +7.5156250000,120,0.2818062990,0.4038305829,2.5209072806,-0.3885936119,,, +7.5175781250,120,0.3722248029,0.4136590743,2.3946336154,-0.8465474904,,, +7.5195312500,120,0.4511723219,0.3532562974,2.1435342060,-1.3318948028,,, +7.5214843750,120,0.5170713881,0.2239970809,1.8151242356,-1.7031057078,,, +7.5234375000,120,0.5685817257,0.0320223151,1.4682085248,-1.8481837142,,, +7.5253906250,120,0.6046237689,-0.2121823002,1.1636926332,-1.7155288597,,, +7.5273437500,120,0.6243976092,-0.4945103766,0.9550704071,-1.3282617985,,, +7.5292968750,120,0.6273970407,-0.7982113491,0.8800697173,-0.7780812244,,, +7.5312500000,120,0.6134184567,-1.1050512984,0.9547577169,-0.2003362463,,, +7.5332031250,120,0.5825644426,-1.3965771554,1.1710238460,0.2628563439,,, +7.5351562500,120,0.5352420019,-1.6553961456,1.4978326871,0.5013435057,,, +7.5371093750,120,0.4721554457,-1.8663812716,1.8860515817,0.4669030654,,, +7.5390625000,120,0.3942940715,-2.0177187892,2.2761011089,0.1862355618,,, +7.5410156250,120,0.3029148458,-2.1017246503,2.6072368297,-0.2465776995,,, +7.5429687500,120,0.1995203947,-2.1153729958,2.8270166018,-0.6960812159,,, +7.5449218750,120,0.0858326873,-2.0604998635,2.8994788463,-1.0227867345,,, +7.5468750000,120,-0.0362371278,-1.9436679217,2.8107578994,-1.1216133296,,, +7.5488281250,120,-0.1646222028,-1.7757016792,2.5712617541,-0.9508888190,,, +7.5507812500,120,-0.2971362038,-1.5709255982,2.2140728978,-0.5439621684,,, +7.5527343750,120,-0.4315116217,-1.3461582575,1.7898212081,-0.0002424371,,, +7.5546875000,120,-0.5654395089,-1.1195327199,1.3588273438,0.5418814989,,, +7.5566406250,120,-0.6966099482,-0.9092253823,0.9817401864,0.9428201396,,, +7.5585937500,120,-0.8227525437,-0.7321819631,0.7101264255,1.0999087654,,, +7.5605468750,120,-0.9416762249,-0.6029294845,0.5784778251,0.9754313021,,, +7.5625000000,121,-1.0513076674,-0.5325571084,0.5988808738,0.6068632496,,, +7.5644531250,121,-1.1497276573,-0.5279369107,0.7591788326,0.0965273186,,, +7.5664062500,121,-1.2352047624,-0.5912389445,1.0249122176,-0.4165024163,,, +7.5683593750,121,-1.3062257203,-0.7197744235,1.3447352338,-0.7945470874,,, +7.5703125000,121,-1.3615220120,-0.9061779735,1.6584642659,-0.9390651675,,, +7.5722656250,121,-1.4000921549,-1.1389162548,1.9065045672,-0.8176460612,,, +7.5742187500,121,-1.4212193254,-1.4030875003,2.0391866152,-0.4728571038,,, +7.5761718750,121,-1.4244840023,-1.6814562266,2.0245576694,-0.0105195640,,, +7.5781250000,121,-1.4097714084,-1.9556509741,1.8534146675,0.4293726570,,, +7.5800781250,121,-1.3772736229,-2.2074415642,1.5407942720,0.7111206233,,, +7.5820312500,121,-1.3274863235,-2.4200068164,1.1236876918,0.7406305550,,, +7.5839843750,121,-1.2612002191,-2.5791043309,0.6553359149,0.4913399341,,, +7.5859375000,121,-1.1794873203,-2.6740607733,0.1969936073,0.0116527088,,, +7.5878906250,121,-1.0836822888,-2.6985136108,-0.1915557952,-0.5881555836,,, +7.5898437500,121,-0.9753591935,-2.6508525849,-0.4612567650,-1.1659754267,,, +7.5917968750,121,-0.8563040778,-2.5343301393,-0.5813686355,-1.5866129597,,, +7.5937500000,121,-0.7284838207,-2.3568331081,-0.5442013947,-1.7586333483,,, +7.5957031250,121,-0.5940118350,-2.1303315888,-0.3662629627,-1.6592021511,,, +7.5976562500,121,-0.4551112048,-1.8700434356,-0.0856395154,-1.3401184227,,, +7.5996093750,121,-0.3140759058,-1.5933726368,0.2439828702,-0.9133881366,,, +7.6015625000,121,-0.1732307898,-1.3186956105,0.5617238545,-0.5202939482,,, +7.6035156250,121,-0.0348910310,-1.0640800512,0.8090323136,-0.2924405015,,, +7.6054687500,121,0.0986782532,-0.8460256698,0.9388441171,-0.3154537568,,, +7.6074218750,121,0.2253015016,-0.6783146360,0.9229476432,-0.6052854166,,, +7.6093750000,121,0.3429306368,-0.5710518835,0.7564096370,-1.1036188169,,, +7.6113281250,121,0.4496807566,-0.5299621998,0.4583719027,-1.6936374636,,, +7.6132812500,121,0.5438629652,-0.5559931117,0.0690946024,-2.2318365321,,, +7.6152343750,121,0.6240137686,-0.6452512541,-0.3562934400,-2.5871606655,,, +7.6171875000,121,0.6889205201,-0.7892766567,-0.7563641064,-2.6767433848,,, +7.6191406250,121,0.7376424702,-0.9756358123,-1.0729443818,-2.4884546936,,, +7.6210937500,121,0.7695270527,-1.1887921670,-1.2601676954,-2.0840788044,,, +7.6230468750,121,0.7842211215,-1.4111933203,-1.2916124503,-1.5822524582,,, +7.6250000000,122,0.7816769419,-1.6244991150,-1.1644158996,-1.1258411620,,, +7.6269531250,122,0.7621528319,-1.8108649681,-0.8997226083,-0.8426955894,,, +7.6289062500,122,0.7262084407,-1.9541909431,-0.5393976280,-0.8105445002,,, +7.6308593750,122,0.6746947500,-2.0412494514,-0.1395162829,-1.0356466479,,, +7.6328125000,122,0.6087389703,-2.0626129347,0.2383554988,-1.4510530143,,, +7.6347656250,122,0.5297245992,-2.0133168243,0.5367322565,-1.9349559051,,, +7.6367187500,122,0.4392669899,-1.8932115383,0.7111408318,-2.3440960251,,, +7.6386718750,122,0.3391848569,-1.7069789545,0.7370219102,-2.5530715054,,, +7.6406250000,122,0.2314682207,-1.4638122005,0.6135264587,-2.4887750973,,, +7.6425781250,122,0.1182433497,-1.1767810731,0.3636159065,-2.1505207689,,, +7.6445312500,122,0.0017353158,-0.8619273273,0.0304506404,-1.6103428460,,, +7.6464843750,122,-0.1157711824,-0.5371529059,-0.3293704789,-0.9933847588,,, +7.6484375000,122,-0.2319720408,-0.2209786232,-0.6546663921,-0.4437511119,,, +7.6503906250,122,-0.3445843127,0.0687401518,-0.8892462717,-0.0851806917,,, +7.6523437500,122,-0.4513864023,0.3160512697,-0.9907069180,0.0126827108,,, +7.6542968750,122,-0.5502571846,0.5080107346,-0.9370846304,-0.1468208753,,, +7.6562500000,122,-0.6392133671,0.6355777632,-0.7303252342,-0.4884942387,,, +7.6582031250,122,-0.7164444384,0.6942375707,-0.3960315197,-0.8861144434,,, +7.6601562500,122,-0.7803445927,0.6843084721,0.0204728409,-1.1972578621,,, +7.6621093750,122,-0.8295410695,0.6109118997,0.4611501158,-1.3025722429,,, +7.6640625000,122,-0.8629184133,0.4836074464,0.8642350092,-1.1387304061,,, +7.6660156250,122,-0.8796382283,0.3157183999,1.1738014256,-0.7160317990,,, +7.6679687500,122,-0.8791540817,0.1233948195,1.3484197175,-0.1158256763,,, +7.6699218750,122,-0.8612212941,-0.0755204938,1.3675562979,0.5315400447,,, +7.6718750000,122,-0.8259014467,-0.2627440362,1.2347191293,1.0822028577,,, +7.6738281250,122,-0.7735615252,-0.4208343235,0.9768594532,1.4179796778,,, +7.6757812500,122,-0.7048677155,-0.5344158317,0.6401232231,1.4785309550,,, +7.6777343750,122,-0.6207739594,-0.5912587891,0.2826142544,1.2776816678,,, +7.6796875000,122,-0.5225054723,-0.5831395060,-0.0347034604,0.8994280040,,, +7.6816406250,122,-0.4115375079,-0.5064212314,-0.2575470010,0.4747259684,,, +7.6835937500,122,-0.2895697457,-0.3623150173,-0.3468129805,0.1454251268,,, +7.6855468750,122,-0.1584967462,-0.1568023802,-0.2847093008,0.0252336856,,, +7.6875000000,123,-0.0203749932,0.0997748588,-0.0775649214,0.1684145729,,, +7.6894531250,123,0.1226129009,0.3934289721,0.2451202075,0.5547931815,,, +7.6914062500,123,0.2681962000,0.7074951573,0.6352372678,1.0951867186,,, +7.6933593750,123,0.4140555934,1.0237872588,1.0335323587,1.6557679674,,, +7.6953125000,123,0.5578635982,1.3238598000,1.3788095883,2.0946867176,,, +7.6972656250,123,0.6973251057,1.5902883346,1.6174401863,2.3009124583,,, +7.6992187500,123,0.8302173639,1.8078788465,1.7116966753,2.2246529401,,, +7.7011718750,123,0.9544286946,1.9647218763,1.6456141174,1.8910118083,,, +7.7031250000,123,1.0679952687,2.0530178769,1.4274656086,1.3931419655,,, +7.7050781250,123,1.1691352939,2.0696162562,1.0884665179,0.8667707242,,, +7.7070312500,123,1.2562800192,2.0162305275,0.6779093437,0.4530780393,,, +7.7089843750,123,1.3281010100,1.8993145737,0.2554869872,0.2601009840,,, +7.7109375000,123,1.3835332195,1.7296086645,-0.1179998590,0.3332413593,,, +7.7128906250,123,1.4217934502,1.5213868903,-0.3901038459,0.6429582475,,, +7.7148437500,123,1.4423938838,1.2914585018,-0.5248870416,1.0930172763,,, +7.7167968750,123,1.4451504419,1.0579927992,-0.5085016448,1.5470342265,,, +7.7187500000,123,1.4301858318,0.8392495239,-0.3513261900,1.8660365397,,, +7.7207031250,123,1.3979272234,0.6523032899,-0.0863246147,1.9467464841,,, +7.7226562500,123,1.3490985987,0.5118510098,0.2361161132,1.7500918353,,, +7.7246093750,123,1.2847079083,0.4291854806,0.5560656040,1.3121281842,,, +7.7265625000,123,1.2060292579,0.4114067079,0.8134194497,0.7343773505,,, +7.7285156250,123,1.1145804398,0.4609259666,0.9572989163,0.1562277535,,, +7.7304687500,123,1.0120962004,0.5752971835,0.9540166867,-0.2830411680,,, +7.7324218750,123,0.9004977128,0.7473873999,0.7923677445,-0.4822046736,,, +7.7343750000,123,0.7818587900,0.9658744271,0.4854210976,-0.4056109488,,, +7.7363281250,123,0.6583694282,1.2160369906,0.0685330402,-0.0927320490,,, +7.7382812500,123,0.5322973215,1.4807822614,-0.4061088454,0.3528679770,,, +7.7402343750,123,0.4059480191,1.7418391182,-0.8775614021,0.7921222543,,, +7.7421875000,123,0.2816244250,1.9810339278,-1.2855637566,1.0887701597,,, +7.7441406250,123,0.1615863482,2.1815598736,-1.5798675989,1.1468850952,,, +7.7460937500,123,0.0480108120,2.3291513140,-1.7280069238,0.9373339901,,, +7.7480468750,123,-0.0570461824,2.4130812717,-1.7202973417,0.5059151735,,, +7.7500000000,124,-0.1516857685,2.4269124897,-1.5712865799,-0.0390571813,,, +7.7519531250,124,-0.2341995706,2.3689496718,-1.3174305423,-0.5563206046,,, +7.7539062500,124,-0.3030997202,2.2423613651,-1.0113571893,-0.9102814156,,, +7.7558593750,124,-0.3571450057,2.0549629740,-0.7136119602,-1.0080985019,,, +7.7578125000,124,-0.3953626983,1.8186760281,-0.4831707238,-0.8250709913,,, +7.7597656250,124,-0.4170656726,1.5487014005,-0.3681982031,-0.4113723696,,, +7.7617187500,124,-0.4218645194,1.2624641197,-0.3984915814,0.1217142262,,, +7.7636718750,124,-0.4096744425,0.9784033446,-0.5807865131,0.6322869043,,, +7.7656250000,124,-0.3807168145,0.7146918689,-0.8976569231,0.9866855284,,, +7.7675781250,124,-0.3355153678,0.4879744364,-1.3101802148,1.0960716141,,, +7.7695312500,124,-0.2748870856,0.3122128340,-1.7639530163,0.9407026366,,, +7.7714843750,124,-0.1999279522,0.1977182831,-2.1975207172,0.5752485657,,, +7.7734375000,124,-0.1119938131,0.1504385921,-2.5519080753,0.1136943959,,, +7.7753906250,124,-0.0126766798,0.1715497614,-2.7797666604,-0.3020325095,,, +7.7773437500,124,0.0962231067,0.2573805058,-2.8527145674,-0.5411107257,,, +7.7792968750,124,0.2127283654,0.3996749423,-2.7657253778,-0.5198453590,,, +7.7812500000,124,0.3347196668,0.5861751089,-2.5378829255,-0.2247872137,,, +7.7832031250,124,0.4599724205,0.8014826764,-2.2093844523,0.2833874218,,, +7.7851562500,124,0.5861958105,1.0281397487,-1.8352590504,0.8863015107,,, +7.7871093750,124,0.7110728944,1.2478533663,-1.4767798821,1.4401069101,,, +7.7890625000,124,0.8323011665,1.4427783068,-1.1919078536,1.8146877437,,, +7.7910156250,124,0.9476328738,1.5967687131,-1.0262552542,1.9290951051,,, +7.7929687500,124,1.0549143783,1.6965112520,-1.0059768660,1.7735036230,,, +7.7949218750,124,1.1521238773,1.7324607658,-1.1336958126,1.4116744022,,, +7.7968750000,124,1.2374068208,1.6995131555,-1.3880987188,0.9632514815,,, +7.7988281250,124,1.3091084058,1.5973685555,-1.7272632175,0.5707459693,,, +7.8007812500,124,1.3658025788,1.4305594569,-2.0951994853,0.3602586340,,, +7.8027343750,124,1.4063170384,1.2081418020,-2.4305868675,0.4067077814,,, +7.8046875000,124,1.4297538001,0.9430705736,-2.6763447336,0.7130944164,,, +7.8066406250,124,1.4355049636,0.6513034046,-2.7885467513,1.2094894042,,, +7.8085937500,124,1.4232634063,0.3506946995,-2.7432900100,1.7720220300,,, +7.8105468750,124,1.3930282153,0.0597573686,-2.5404489532,2.2566674557,,, +7.8125000000,125,1.3451047636,-0.2036214940,-2.2037292638,2.5385744990,,, +7.8144531250,125,1.2800994284,-0.4234214437,-1.7770131359,2.5461565725,,, +7.8164062500,125,1.1989090444,-0.5865995176,-1.3175649803,2.2806037203,,, +7.8183593750,125,1.1027052767,-0.6839936198,-0.8871556064,1.8154691477,,, +7.8203125000,125,0.9929141861,-0.7109554770,-0.5424871106,1.2764444419,,, +7.8222656250,125,0.8711913462,-0.6676690416,-0.3264096116,0.8068671709,,, +7.8242187500,125,0.7393929462,-0.5591321514,-0.2612976237,0.5284146731,,, +7.8261718750,125,0.5995433866,-0.3948027390,-0.3456174755,0.5077569684,,, +7.8281250000,125,0.4537999345,-0.1879342727,-0.5542201485,0.7383082961,,, +7.8300781250,125,0.3044150572,0.0453532160,-0.8423136489,1.1420784952,,, +7.8320312500,125,0.1536970947,0.2872017274,-1.1524959129,1.5911164753,,, +7.8339843750,125,0.0039699577,0.5192648008,-1.4237525466,1.9426682145,,, +7.8359375000,125,-0.1424674410,0.7239907906,-1.6010176636,2.0784127844,,, +7.8378906250,125,-0.2833813132,0.8858504166,-1.6438083770,1.9370220431,,, +7.8398437500,125,-0.4166419769,0.9924229769,-1.5325877856,1.5311192373,,, +7.8417968750,125,-0.5402610101,1.0352654739,-1.2718650915,0.9439873710,,, +7.8437500000,125,-0.6524259265,1.0105040355,-0.8895497014,0.3069280172,,, +7.8457031250,125,-0.7515317662,0.9191063872,-0.4326596264,-0.2365257636,,, +7.8476562500,125,-0.8362090482,0.7668163662,0.0399476602,-0.5697359769,,, +7.8496093750,125,-0.9053475947,0.5637550425,0.4666899735,-0.6347041634,,, +7.8515625000,125,-0.9581158118,0.3237162546,0.7928013720,-0.4477355383,,, +7.8535156250,125,-0.9939750868,0.0632056847,0.9788135163,-0.0947317718,,, +7.8554687500,125,-1.0126890524,-0.1997095228,1.0066566622,0.2925953751,,, +7.8574218750,125,-1.0143275536,-0.4466603804,0.8824302576,0.5730682823,,, +7.8593750000,125,-0.9992652495,-0.6602570773,0.6354118265,0.6349825290,,, +7.8613281250,125,-0.9681748738,-0.8253020707,0.3134587171,0.4269665746,,, +7.8632812500,125,-0.9220152723,-0.9298506545,-0.0244808962,-0.0276978165,,, +7.8652343750,125,-0.8620144273,-0.9660450466,-0.3175811342,-0.6372213334,,, +7.8671875000,125,-0.7896477647,-0.9306638290,-0.5126405102,-1.2662367687,,, +7.8691406250,125,-0.7066121269,-0.8253484227,-0.5723928662,-1.7726820902,,, +7.8710937500,125,-0.6147958634,-0.6564907999,-0.4813325585,-2.0465303038,,, +7.8730468750,125,-0.5162455663,-0.4347902595,-0.2481464912,-2.0397532111,,, +7.8750000000,126,-0.4131300313,-0.1745101669,0.0956258805,-1.7793085721,,, +7.8769531250,126,-0.3077020758,0.1075135189,0.5004959241,-1.3595928112,,, +7.8789062500,126,-0.2022588834,0.3930427994,0.9067288892,-0.9164291326,,, +7.8808593750,126,-0.0991015685,0.6637056531,1.2536468764,-0.5897213295,,, +7.8828125000,126,-0.0004946693,0.9022731020,1.4890827226,-0.4850097889,,, +7.8847656250,126,0.0913737210,1.0938562816,1.5775122841,-0.6444668771,,, +7.8867187500,126,0.1744304869,1.2269400513,1.5055984234,-1.0352816478,,, +7.8886718750,126,0.2467540126,1.2941810774,1.2842831258,-1.5586177184,,, +7.8906250000,126,0.3066080529,1.2929147489,0.9471017997,-2.0766894682,,, +7.8925781250,126,0.3524723607,1.2253355875,0.5449822080,-2.4505358145,,, +7.8945312500,126,0.3830695341,1.0983385863,0.1383379982,-2.5781387312,,, +7.8964843750,126,0.3973876132,0.9230325520,-0.2123118431,-2.4224389828,,, +7.8984375000,126,0.3946980304,0.7139594023,-0.4557367023,-2.0215702145,,, +7.9003906250,126,0.3745686004,0.4880738727,-0.5579382815,-1.4785057583,,, +7.9023437500,126,0.3368713216,0.2635547960,-0.5074076553,-0.9329546781,,, +7.9042968750,126,0.2817848528,0.0585308625,-0.3168768404,-0.5232083502,,, +7.9062500000,126,0.2097916210,-0.1101902661,-0.0212922865,-0.3483929610,,, +7.9082031250,126,0.1216696116,-0.2283008513,0.3276738335,-0.4414718948,,, +7.9101562500,126,0.0184789843,-0.2849977563,0.6697193890,-0.7603956207,,, +7.9121093750,126,-0.0984562518,-0.2737428320,0.9453538955,-1.1998228708,,, +7.9140625000,126,-0.2275711815,-0.1927259713,1.1052151080,-1.6201988205,,, +7.9160156250,126,-0.3670871456,-0.0449985227,1.1178092214,-1.8862188461,,, +7.9179687500,126,-0.5150426446,0.1617322558,0.9744688169,-1.9041340608,,, +7.9199218750,126,-0.6693274444,0.4156333860,0.6907560447,-1.6476721976,,, +7.9218750000,126,-0.8277192854,0.7015640491,0.3040921993,-1.1654675678,,, +7.9238281250,126,-0.9879225546,1.0021241370,-0.1320173961,-0.5679616062,,, +7.9257812500,126,-1.1476082405,1.2988603758,-0.5562639819,0.0026379852,,, +7.9277343750,126,-1.3044544754,1.5735459306,-0.9090319735,0.4111083348,,, +7.9296875000,126,-1.4561869511,1.8094442783,-1.1416327307,0.5660543215,,, +7.9316406250,126,-1.6006185037,1.9924692309,-1.2238375565,0.4447478171,,, +7.9335937500,126,-1.7356871728,2.1121602350,-1.1485368973,0.0991575135,,, +7.9355468750,126,-1.8594920697,2.1624049521,-0.9328003158,-0.3584813974,,, +7.9375000000,127,-1.9703264255,2.1418587490,-0.6151723985,-0.7866010291,,, +7.9394531250,127,-2.0667072425,2.0540318616,-0.2496260238,-1.0532584477,,, +7.9414062500,127,-2.1474010277,1.9070381705,0.1028849641,-1.0724385687,,, +7.9433593750,127,-2.2114451592,1.7130231203,0.3839577351,-0.8277514567,,, +7.9453125000,127,-2.2581645116,1.4873106937,0.5468722407,-0.3770281691,,, +7.9472656250,127,-2.2871830488,1.2473289363,0.5639002557,0.1634453983,,, +7.9492187500,127,-2.2984301815,1.0113889744,0.4306530895,0.6507364054,,, +7.9511718750,127,-2.2921417784,0.7974026825,0.1667906320,0.9543976824,,, +7.9531250000,127,-2.2688558134,0.6216284330,-0.1870188530,0.9922003608,,, +7.9550781250,127,-2.2294027255,0.4975324065,-0.5754147793,0.7526734425,,, +7.9570312500,127,-2.1748906594,0.4348448755,-0.9369524848,0.2982728440,,, +7.9589843750,127,-2.1066858464,0.4388772846,-1.2136629782,-0.2516888762,,, +7.9609375000,127,-2.0263884689,0.5101477579,-1.3600752717,-0.7536741110,,, +7.9628906250,127,-1.9358044305,0.6443411590,-1.3502960675,-1.0791704372,,, +7.9648437500,127,-1.8369135277,0.8326064980,-1.1820441246,-1.1498030249,,, +7.9667968750,127,-1.7318345786,1.0621709554,-0.8770109360,-0.9586870043,,, +7.9687500000,127,-1.6227881216,1.3172277130,-0.4774915197,-0.5721689603,,, +7.9707031250,127,-1.5120573353,1.5800356866,-0.0398100572,-0.1114816435,,, +7.9726562500,127,-1.4019478651,1.8321544810,0.3744356878,0.2806586772,,, +7.9746093750,127,-1.2947472599,2.0557284543,0.7079475236,0.4793558869,,, +7.9765625000,127,-1.1926847292,2.2347303551,0.9166265878,0.4119649692,,, +7.9785156250,127,-1.0978919250,2.3560778136,0.9764136437,0.0782118353,,, +7.9804687500,127,-1.0123654365,2.4105448336,0.8870046409,-0.4495141946,,, +7.9824218750,127,-0.9379316523,2.3934047268,0.6718629806,-1.0457774778,,, +7.9843750000,127,-0.8762146079,2.3047596570,0.3745267470,-1.5662483612,,, +7.9863281250,127,-0.8286073800,2.1495338147,0.0517862659,-1.8870327395,,, +7.9882812500,127,-0.7962475286,1.9371306987,-0.2352051745,-1.9384019631,,, +7.9902343750,127,-0.7799970178,1.6807784018,-0.4305026663,-1.7236808898,,, +7.9921875000,127,-0.7804269669,1.3966085550,-0.4921320678,-1.3181195510,,, +7.9941406250,127,-0.7978074980,1.1025331553,-0.3986783989,-0.8480597499,,, +7.9960937500,127,-0.8321028587,0.8169975971,-0.1526738120,-0.4561084054,,, +7.9980468750,127,-0.8829719050,0.5576968567,0.2197428226,-0.2618645064,,, +8.0000000000,128,-0.9497739372,0.3403443506,0.6728419693,-0.3289650554,,, +8.0019531250,128,-1.0315797844,0.1775793134,1.1483698781,-0.6474834185,,, +8.0039062500,128,-1.1271879458,0.0780888799,1.5845650823,-1.1365057279,,, +8.0058593750,128,-1.2351455051,0.0460060850,1.9257208675,-1.6661806334,,, +8.0078125000,128,-1.3537734520,0.0806257525,2.1308045978,-2.0932004780,,, +8.0097656250,128,-1.4811959682,0.1764580759,2.1797916878,-2.2999906454,,, +8.0117187500,128,-1.6153731635,0.3236161456,2.0767279627,-2.2268673440,,, +8.0136718750,128,-1.7541366909,0.5085103889,1.8490437181,-1.8883510410,,, +8.0156250000,128,-1.8952276161,0.7148014862,1.5432266049,-1.3691650178,,, +8.0175781250,128,-2.0363358776,0.9245453029,1.2175275901,-0.8010160152,,, +8.0195312500,128,-2.1751406484,1.1194499834,0.9328363541,-0.3265207804,,, +8.0214843750,128,-2.3093508909,1.2821575366,0.7431475946,-0.0601650414,,, +8.0234375000,128,-2.4367453960,1.3974605267,0.6871034175,-0.0569945517,,, +8.0253906250,128,-2.5552116045,1.4533690156,0.7819293778,-0.2976185144,,, +8.0273437500,128,-2.6627825318,1.4419533387,1.0207088969,-0.6936347620,,, +8.0292968750,128,-2.7576711497,1.3599039319,1.3734208015,-1.1119888844,,, +8.0312500000,128,-2.8383016215,1.2087691544,1.7915785863,-1.4115900897,,, +8.0332031250,128,-2.9033368457,0.9948545096,2.2157490023,-1.4821471999,,, +8.0351562500,128,-2.9517018251,0.7287902742,2.5847790836,-1.2745795562,,, +8.0371093750,128,-2.9826024515,0.4247976712,2.8452946114,-0.8146665162,,, +8.0390625000,128,-2.9955393781,0.0997047415,2.9599907168,-0.1961928962,,, +8.0410156250,128,-2.9903167368,-0.2282194754,2.9134234366,0.4445328648,,, +8.0429687500,128,-2.9670455461,-0.5405311733,2.7144002556,0.9658059652,,, +8.0449218750,128,-2.9261417526,-0.8198901413,2.3945973758,1.2591244936,,, +8.0468750000,128,-2.8683189380,-1.0512611292,2.0036191380,1.2786838787,,, +8.0488281250,128,-2.7945758203,-1.2229544597,1.6012691549,1.0536851406,,, +8.0507812500,128,-2.7061787687,-1.3274333381,1.2482369849,0.6800857934,,, +8.0527343750,128,-2.6046396368,-1.3618315808,0.9966509410,0.2940564097,,, +8.0546875000,128,-2.4916893040,-1.3281456783,0.8819684603,0.0344197713,,, +8.0566406250,128,-2.3692473867,-1.2330878156,0.9174671037,0.0043690386,,, +8.0585937500,128,-2.2393886511,-1.0876101166,1.0921941769,0.2429589199,,, +8.0605468750,128,-2.1043067144,-0.9061333062,1.3726942400,0.7141852602,,, +8.0625000000,129,-1.9662756714,-0.7055335942,1.7082453321,1.3166479230,,, +8.0644531250,129,-1.8276103170,-0.5039584457,2.0387882121,1.9111504664,,, +8.0664062500,129,-1.6906256615,-0.3195538339,2.3043134511,2.3586740536,,, +8.0683593750,129,-1.5575964489,-0.1691917450,2.4542441227,2.5583196304,,, +8.0703125000,129,-1.4307173843,-0.0672866848,2.4553525075,2.4748209463,,, +8.0722656250,129,-1.3120647696,-0.0247837330,2.2969775467,2.1480891457,,, +8.0742187500,129,-1.2035602172,-0.0483887234,1.9927301862,1.6821740868,,, +8.0761718750,129,-1.1069370783,-0.1400942500,1.5784207703,1.2166686124,,, +8.0781250000,129,-1.0237101725,-0.2970345625,1.1065310637,0.8883936646,,, +8.0800781250,129,-0.9551493498,-0.5116794871,0.6380916636,0.7938656591,,, +8.0820312500,129,-0.9022573472,-0.7723538589,0.2332296775,0.9628329369,,, +8.0839843750,129,-0.8657523276,-1.0640462597,-0.0581413557,1.3501342029,,, +8.0859375000,129,-0.8460554067,-1.3694506764,-0.2040394842,1.8481101417,,, +8.0878906250,129,-0.8432833869,-1.6701684513,-0.1953384638,2.3161661899,,, +8.0898437500,129,-0.8572468242,-1.9479867218,-0.0471313103,2.6193836202,,, +8.0917968750,129,-0.8874534631,-2.1861442077,0.2036788032,2.6655960261,,, +8.0937500000,129,-0.9331169779,-2.3704960882,0.5041847822,2.4307686914,,, +8.0957031250,129,-0.9931708692,-2.4904967476,0.7937743322,1.9657239774,,, +8.0976562500,129,-1.0662872700,-2.5399318659,1.0136283051,1.3823681832,,, +8.0996093750,129,-1.1509003337,-2.5173488114,1.1159389630,0.8231932089,,, +8.1015625000,129,-1.2452337936,-2.4261553279,1.0714120802,0.4224100809,,, +8.1035156250,129,-1.3473322118,-2.2743796415,0.8738841133,0.2693647202,,, +8.1054687500,129,-1.4550953692,-2.0741087186,0.5413350179,0.3842607319,,, +8.1074218750,129,-1.5663151959,-1.8406438516,0.1131386956,0.7128409064,,, +8.1093750000,129,-1.6787145939,-1.5914324596,-0.3560209222,1.1414830347,,, +8.1113281250,129,-1.7899874728,-1.3448505941,-0.8046207971,1.5285706260,,, +8.1132812500,129,-1.8978392976,-1.1189210515,-1.1738375496,1.7435386170,,, +8.1152343750,129,-2.0000274377,-0.9300564826,-1.4166685725,1.7028906527,,, +8.1171875000,129,-2.0944006121,-0.7919151463,-1.5052150309,1.3933145221,,, +8.1191406250,129,-2.1789367375,-0.7144490976,-1.4349925679,0.8755583585,,, +8.1210937500,129,-2.2517785191,-0.7032111811,-1.2255984704,0.2680031512,,, +8.1230468750,129,-2.3112661596,-0.7589691530,-0.9176315303,-0.2855681968,,, +8.1250000000,130,-2.3559666125,-0.8776538362,-0.5663444808,-0.6551736974,,, +8.1269531250,130,-2.3846988698,-1.0506449191,-0.2330177884,-0.7600645479,,, +8.1289062500,130,-2.3965548395,-1.2653744640,0.0246015303,-0.5906776800,,, +8.1308593750,130,-2.3909154467,-1.5062060340,0.1613067876,-0.2110936849,,, +8.1328125000,130,-2.3674616787,-1.7555281269,0.1514812796,0.2586720434,,, +8.1347656250,130,-2.3261803777,-1.9949856616,-0.0069073355,0.6756901506,,, +8.1367187500,130,-2.2673646817,-2.2067636306,-0.2919900930,0.9133989691,,, +8.1386718750,130,-2.1916091047,-2.3748333999,-0.6614065650,0.8963800708,,, +8.1406250000,130,-2.0997993424,-2.4860747346,-1.0589103596,0.6210960010,,, +8.1425781250,130,-1.9930969820,-2.5311952998,-1.4231413820,0.1569060110,,, +8.1445312500,130,-1.8729193834,-2.5053835058,-1.6971984588,-0.3729189835,,, +8.1464843750,130,-1.7409150846,-2.4086491603,-1.8375212464,-0.8249791705,,, +8.1484375000,130,-1.5989351607,-2.2458281604,-1.8206979052,-1.0750674727,,, +8.1503906250,130,-1.4490010391,-2.0262508859,-1.6471380783,-1.0522529303,,, +8.1523437500,130,-1.2932693331,-1.7630974028,-1.3410389381,-0.7583841693,,, +8.1542968750,130,-1.1339943111,-1.4724844285,-0.9466494214,-0.2676670029,,, +8.1562500000,130,-0.9734886565,-1.1723477113,-0.5214143334,0.2935688984,,, +8.1582031250,130,-0.8140832071,-0.8811977470,-0.1270659627,0.7813699372,,, +8.1601562500,130,-0.6580863776,-0.6168355827,0.1799494791,1.0734709228,,, +8.1621093750,130,-0.5077439762,-0.3951182456,0.3572196911,1.1026468389,,, +8.1640625000,130,-0.3652001180,-0.2288598701,0.3829261075,0.8749648443,,, +8.1660156250,130,-0.2324599212,-0.1269451353,0.2591942389,0.4679358391,,, +8.1679687500,130,-0.1113546364,-0.0937168193,0.0117129589,0.0090739764,,, +8.1699218750,130,-0.0035098225,-0.1286801616,-0.3143176971,-0.3592577948,,, +8.1718750000,130,0.0896828760,-0.2265446321,-0.6612787897,-0.5190793947,,, +8.1738281250,130,0.1670898551,-0.3776001768,-0.9681598530,-0.4093482113,,, +8.1757812500,130,0.2278551591,-0.5684016875,-1.1801150410,-0.0429122891,,, +8.1777343750,130,0.2714152265,-0.7827139464,-1.2570593355,0.4967863925,,, +8.1796875000,130,0.2975085154,-1.0026511355,-1.1799656180,1.0783571700,,, +8.1816406250,130,0.3061798421,-1.2099314319,-0.9538815159,1.5582502404,,, +8.1835937500,130,0.2977793539,-1.3871591840,-0.6071958420,1.8198837795,,, +8.1855468750,130,0.2729561576,-1.5190452428,-0.1872686018,1.8053871399,,, +8.1875000000,131,0.2326467119,-1.5934803325,0.2468950649,1.5312622819,,, +8.1894531250,131,0.1780581912,-1.6023865946,0.6337862065,1.0836730332,,, +8.1914062500,131,0.1106471076,-1.5422879080,0.9189251055,0.5946550774,,, +8.1933593750,131,0.0320935694,-1.4145591989,1.0633014791,0.2057685025,,, +8.1953125000,131,-0.0557283745,-1.2253373382,1.0494074769,0.0291562292,,, +8.1972656250,131,-0.1507837861,-0.9850998255,0.8839240378,0.1166824562,,, +8.1992187500,131,-0.2509127042,-0.7079406233,0.5966424121,0.4456106099,,, +8.2011718750,131,-0.3538681991,-0.4105936241,0.2357890348,0.9247471280,,, +8.2031250000,131,-0.4573559481,-0.1112718344,-0.1395178821,1.4193681548,,, +8.2050781250,131,-0.5590746388,0.1715967927,-0.4685049394,1.7880981972,,, +8.2070312500,131,-0.6567564942,0.4206487353,-0.6982345159,1.9216339211,,, +8.2089843750,131,-0.7482072066,0.6207902878,-0.7918717012,1.7727003635,,, +8.2109375000,131,-0.8313445855,0.7602449117,-0.7344394570,1.3690295624,,, +8.2128906250,131,-0.9042352377,0.8313695285,-0.5351655085,0.8058044427,,, +8.2148437500,131,-0.9651286415,0.8311828433,-0.2260553435,0.2196385471,,, +8.2167968750,131,-1.0124880151,0.7615688676,0.1430864807,-0.2487775326,,, +8.2187500000,131,-1.0450174409,0.6291414605,0.5124113032,-0.4931262523,,, +8.2207031250,131,-1.0616847687,0.4447793422,0.8213497439,-0.4704726346,,, +8.2226562500,131,-1.0617398978,0.2228640134,1.0180513366,-0.2128836686,,, +8.2246093750,131,-1.0447281183,-0.0197262676,1.0674701184,0.1815256642,,, +8.2265625000,131,-1.0104982755,-0.2647962918,0.9568367567,0.5756642890,,, +8.2285156250,131,-0.9592056174,-0.4941052105,0.6976648394,0.8312336802,,, +8.2304687500,131,-0.8913092733,-0.6906406940,0.3239787534,0.8468402750,,, +8.2324218750,131,-0.8075644075,-0.8398070801,-0.1129609368,0.5860043491,,, +8.2343750000,131,-0.7090091872,-0.9304446569,-0.5526131812,0.0873870184,,, +8.2363281250,131,-0.5969467901,-0.9556089968,-0.9345542107,-0.5455695765,,, +8.2382812500,131,-0.4729227691,-0.9130559961,-1.2078537849,-1.1727516836,,, +8.2402343750,131,-0.3386981686,-0.8053987934,-1.3389696996,-1.6555311463,,, +8.2421875000,131,-0.1962188639,-0.6399256241,-1.3169311353,-1.8945148295,,, +8.2441406250,131,-0.0475816599,-0.4280913135,-1.1550037239,-1.8565424569,,, +8.2460937500,131,0.1050022561,-0.1847178680,-0.8885772114,-1.5835357296,,, +8.2480468750,131,0.2592458699,0.0730400879,-0.5696049620,-1.1807755793,,, +8.2500000000,132,0.4128262271,0.3268928833,-0.2584616280,-0.7878224919,,, +8.2519531250,132,0.5634249534,0.5586928668,-0.0144874539,-0.5400517779,,, +8.2539062500,132,0.7087686995,0.7517019097,0.1133077419,-0.5313477378,,, +8.2558593750,132,0.8466688018,0.8917609537,0.0939327299,-0.7881829463,,, +8.2578125000,132,0.9750594652,0.9682800409,-0.0807025788,-1.2621884361,,, +8.2597656250,132,1.0920337990,0.9749797827,-0.3944709593,-1.8432526202,,, +8.2617187500,132,1.1958770747,0.9103325544,-0.8094833721,-2.3895603304,,, +8.2636718750,132,1.2850966246,0.7776726418,-1.2719339670,-2.7663404035,,, +8.2656250000,132,1.3584478567,0.5849676511,-1.7204244969,-2.8827033176,,, +8.2675781250,132,1.4149559303,0.3442671112,-2.0954718584,-2.7164736561,,, +8.2695312500,132,1.4539327142,0.0708667107,-2.3487182016,-2.3202122355,,, +8.2714843750,132,1.4749887287,-0.2177535614,-2.4504093678,-1.8067778841,,, +8.2734375000,132,1.4780398641,-0.5031433361,-2.3939771296,-1.3183862168,,, +8.2753906250,132,1.4633087572,-0.7671632068,-2.1970117968,-0.9876455262,,, +8.2773437500,132,1.4313208015,-0.9932441549,-1.8984739625,-0.9012485264,,, +8.2792968750,132,1.3828948617,-1.1675372477,-1.5525799299,-1.0762705984,,, +8.2812500000,132,1.3191288553,-1.2798734491,-1.2203134364,-1.4555699085,,, +8.2832031250,132,1.2413804526,-1.3244666289,-0.9598860020,-1.9235493322,,, +8.2851562500,132,1.1512432342,-1.3003107596,-0.8176319664,-2.3379593576,,, +8.2871093750,132,1.0505187233,-1.2112436201,-0.8207565646,-2.5690246134,,, +8.2890625000,132,0.9411847818,-1.0656725778,-0.9730667510,-2.5351693060,,, +8.2910156250,132,0.8253609252,-0.8759815876,-1.2543498885,-2.2255488292,,, +8.2929687500,132,0.7052711619,-0.6576607765,-1.6234972255,-1.7032106943,,, +8.2949218750,132,0.5832050082,-0.4282193245,-2.0248857972,-1.0880167193,,, +8.2968750000,132,0.4614773630,-0.2059574701,-2.3970248491,-0.5240051314,,, +8.2988281250,132,0.3423879419,-0.0086832855,-2.6821201517,-0.1401356926,,, +8.3007812500,132,0.2281809844,0.1475362753,-2.8350665871,-0.0151743911,,, +8.3027343750,132,0.1210059370,0.2495029466,-2.8304684193,-0.1563396504,,, +8.3046875000,132,0.0228798021,0.2878146936,-2.6665938355,-0.4975603473,,, +8.3066406250,132,-0.0643481883,0.2575285276,-2.3656478294,-0.9178208973,,, +8.3085937500,132,-0.1390289559,0.1585123595,-1.9703209146,-1.2745634044,,, +8.3105468750,132,-0.1997424489,-0.0045386641,-1.5371511926,-1.4429901990,,, +8.3125000000,133,-0.2453224994,-0.2224224967,-1.1277336165,-1.3504930047,,, +8.3144531250,133,-0.2748772289,-0.4820648795,-0.7991455827,-0.9967706793,,, +8.3164062500,133,-0.2878046462,-0.7674241380,-0.5950800210,-0.4541198807,,, +8.3183593750,133,-0.2838031637,-1.0606030102,-0.5390669404,0.1521828897,,, +8.3203125000,133,-0.2628768475,-1.3430899920,-0.6308390771,0.6780329470,,, +8.3222656250,133,-0.2253353111,-1.5970436516,-0.8464075651,0.9998244868,,, +8.3242187500,133,-0.1717882526,-1.8065303708,-1.1418356759,1.0481761891,,, +8.3261718750,133,-0.1031347321,-1.9586292160,-1.4601226604,0.8268135316,,, +8.3281250000,133,-0.0205473777,-2.0443269078,-1.7401253004,0.4114339160,,, +8.3300781250,133,0.0745482053,-2.0591404957,-1.9261273726,-0.0711333627,,, +8.3320312500,133,0.1804984590,-2.0034243296,-1.9765663032,-0.4777598659,,, +8.3339843750,133,0.2954508947,-1.8823399374,-1.8705575471,-0.6882962598,,, +8.3359375000,133,0.4173866035,-1.7054909199,-1.6112002323,-0.6385306610,,, +8.3378906250,133,0.5441556856,-1.4862483388,-1.2251489343,-0.3377939831,,, +8.3398437500,133,0.6735149789,-1.2408136498,-0.7585180067,0.1336128102,,, +8.3417968750,133,0.8031674252,-0.9870845388,-0.2697561098,0.6464642214,,, +8.3437500000,133,0.9308023856,-0.7434027593,0.1793995174,1.0580860767,,, +8.3457031250,133,1.0541361984,-0.5272713005,0.5334804132,1.2515382377,,, +8.3476562500,133,1.1709522700,-0.3541303494,0.7518675598,1.1677645497,,, +8.3496093750,133,1.2791399956,-0.2362774129,0.8150591721,0.8218976908,,, +8.3515625000,133,1.3767318295,-0.1820069115,0.7276496604,0.2992490711,,, +8.3535156250,133,1.4619378547,-0.1950292497,0.5175560705,-0.2679185165,,, +8.3554687500,133,1.5331772473,-0.2742098809,0.2316127766,-0.7364710773,,, +8.3574218750,133,1.5891060836,-0.4136465677,-0.0717791394,-0.9914495771,,, +8.3593750000,133,1.6286410045,-0.6030794553,-0.3318026455,-0.9773824738,,, +8.3613281250,133,1.6509783211,-0.8286053667,-0.4947501050,-0.7132846739,,, +8.3632812500,133,1.6556082277,-1.0736465122,-0.5224393249,-0.2872341195,,, +8.3652343750,133,1.6423238736,-1.3201060659,-0.3982092127,0.1679855518,,, +8.3671875000,133,1.6112251340,-1.5496300276,-0.1295609454,0.5114985605,,, +8.3691406250,133,1.5627170140,-1.7448873787,0.2529669505,0.6331699396,,, +8.3710937500,133,1.4975027144,-1.8907792614,0.7005146103,0.4840127915,,, +8.3730468750,133,1.4165714790,-1.9754928627,1.1534735866,0.0898339865,,, +8.3750000000,134,1.3211814381,-1.9913265080,1.5507370352,-0.4556236982,,, +8.3769531250,134,1.2128377469,-1.9352284291,1.8391867293,-1.0161655409,,, +8.3789062500,134,1.0932664022,-1.8090116300,1.9819393982,-1.4502725652,,, +8.3808593750,134,0.9643841955,-1.6192298658,1.9640681055,-1.6496993050,,, +8.3828125000,134,0.8282653288,-1.3767233769,1.7949076423,-1.5689649871,,, +8.3847656250,134,0.6871052775,-1.0958660506,1.5065849464,-1.2376572000,,, +8.3867187500,134,0.5431825324,-0.7935665021,1.1490035106,-0.7521775638,,, +8.3886718750,134,0.3988188921,-0.4880927242,0.7820630337,-0.2491931015,,, +8.3906250000,134,0.2563389990,-0.1978022608,0.4663261697,0.1319292334,,, +8.3925781250,134,0.1180298287,0.0601335576,0.2535860854,0.2874082040,,, +8.3945312500,134,-0.0138991583,0.2709223608,0.1788039636,0.1775602459,,, +8.3964843750,134,-0.1373545050,0.4231773058,0.2546721908,-0.1622772629,,, +8.3984375000,134,-0.2503952134,0.5097058867,0.4696499858,-0.6314056878,,, +8.4003906250,134,-0.3512665267,0.5280059950,0.7897773519,-1.0913606715,,, +8.4023437500,134,-0.4384304499,0.4804346480,1.1639847234,-1.4038805255,,, +8.4042968750,134,-0.5105924716,0.3740376338,1.5320711829,-1.4688413928,,, +8.4062500000,134,-0.5667240212,0.2200519648,1.8341084640,-1.2517619928,,, +8.4082031250,134,-0.6060802671,0.0331158474,2.0198058628,-0.7933392224,,, +8.4101562500,134,-0.6282129457,-0.1697587238,2.0563772514,-0.1984004870,,, +8.4121093750,134,-0.6329779953,-0.3703790911,1.9336846765,0.3927002977,,, +8.4140625000,134,-0.6205378624,-0.5506475615,1.6658571966,0.8424046204,,, +8.4160156250,134,-0.5913584397,-0.6938305681,1.2891325981,1.0534875725,,, +8.4179687500,134,-0.5462006894,-0.7857328466,0.8562579207,0.9955256603,,, +8.4199218750,134,-0.4861070991,-0.8156947331,0.4283206983,0.7130417684,,, +8.4218750000,134,-0.4123832074,-0.7773430197,0.0652829873,0.3130966946,,, +8.4238281250,134,-0.3265745220,-0.6690429934,-0.1833077076,-0.0642701283,,, +8.4257812500,134,-0.2304392368,-0.4940201198,-0.2859840585,-0.2846474766,,, +8.4277343750,134,-0.1259172223,-0.2601428665,-0.2342074090,-0.2563237509,,, +8.4296875000,134,-0.0150958368,0.0206182032,-0.0436442425,0.0443392895,,, +8.4316406250,134,0.0998268470,0.3330173672,0.2483279027,0.5661867883,,, +8.4335937500,134,0.2165807531,0.6595890627,0.5884963160,1.1970488933,,, +8.4355468750,134,0.3328637745,0.9818580133,0.9161553041,1.7942427088,,, +8.4375000000,135,0.4463823054,1.2816197960,1.1726150565,2.2234405928,,, +8.4394531250,135,0.5548916255,1.5422025671,1.3103958441,2.3952542985,,, +8.4414062500,135,0.6562354267,1.7496219805,1.3006752214,2.2895104282,,, +8.4433593750,135,0.7483837917,1.8935487795,1.1378280126,1.9605660379,,, +8.4453125000,135,0.8294689585,1.9680216043,0.8403516828,1.5222094719,,, +8.4472656250,135,0.8978182455,1.9718553279,0.4480326987,1.1162864731,,, +8.4492187500,135,0.9519835582,1.9087164597,0.0157949791,0.8736519075,,, +8.4511718750,135,0.9907669641,1.7868603767,-0.3948116737,0.8781506218,,, +8.4531250000,135,1.0132418846,1.6185487203,-0.7251576693,1.1435006067,,, +8.4550781250,135,1.0187695351,1.4191876023,-0.9286276166,1.6094153358,,, +8.4570312500,135,1.0070103234,1.2062467293,-0.9778459700,2.1580290959,,, +8.4589843750,135,0.9779300089,0.9980348340,-0.8689090905,2.6461244964,,, +8.4609375000,135,0.9318005117,0.8124168195,-0.6219647269,2.9443302446,,, +8.4628906250,135,0.8691953608,0.6655620896,-0.2780488147,2.9725467387,,, +8.4648437500,135,0.7909798574,0.5708113584,0.1073275849,2.7218906592,,, +8.4667968750,135,0.6982961283,0.5377409749,0.4728422230,2.2571442758,,, +8.4687500000,135,0.5925433293,0.5714900213,0.7609269235,1.6990380471,,, +8.4707031250,135,0.4753533461,0.6723971197,0.9267442507,1.1912219727,,, +8.4726562500,135,0.3485624168,0.8359722841,0.9451773623,0.8609773089,,, +8.4746093750,135,0.2141791745,1.0532057915,0.8147443052,0.7844356351,,, +8.4765625000,135,0.0743496681,1.3111925424,0.5578270665,0.9658367400,,, +8.4785156250,135,-0.0686800263,1.5940283795,0.2171797088,1.3365089919,,, +8.4804687500,135,-0.2126029475,1.8839158714,-0.1507405072,1.7738503443,,, +8.4824218750,135,-0.3550914616,2.1624024561,-0.4845802528,2.1351063937,,, +8.4843750000,135,-0.4938378384,2.4116646133,-0.7276636894,2.2966863296,,, +8.4863281250,135,-0.6265944837,2.6157485199,-0.8368412341,2.1882397163,,, +8.4882812500,135,-0.7512131211,2.7616806785,-0.7892351832,1.8121528250,,, +8.4902343750,135,-0.8656822393,2.8403710775,-0.5858313999,1.2431192020,,, +8.4921875000,135,-0.9681621471,2.8472459016,-0.2513574963,0.6079001284,,, +8.4941406250,135,-1.0570170243,2.7825656787,0.1695336807,0.0508199213,,, +8.4960937500,135,-1.1308434069,2.6514066751,0.6191809972,-0.3055493651,,, +8.4980468750,135,-1.1884946067,2.4633068401,1.0358552598,-0.3937408642,,, +8.5000000000,136,-1.2291006398,2.2316009870,1.3633304476,-0.2196445825,,, +8.5019531250,136,-1.2520833132,1.9724915710,1.5595954027,0.1393422362,,, +8.5039062500,136,-1.2571662077,1.7039198587,1.6033493280,0.5557570194,,, +8.5058593750,136,-1.2443793792,1.4443162038,1.4972696328,0.8872273993,,, +8.5078125000,136,-1.2140586996,1.2113165731,1.2675434023,1.0157033041,,, +8.5097656250,136,-1.1668398467,1.0205348177,0.9597357367,0.8800113727,,, +8.5117187500,136,-1.1036470488,0.8844763006,0.6316387636,0.4928077160,,, +8.5136718750,136,-1.0256767819,0.8116686274,0.3442154105,-0.0627188758,,, +8.5156250000,136,-0.9343767041,0.8060700935,0.1520487801,-0.6554912491,,, +8.5175781250,136,-0.8314201971,0.8667970889,0.0947849770,-1.1423309597,,, +8.5195312500,136,-0.7186769593,0.9881894631,0.1909025050,-1.4070811349,,, +8.5214843750,136,-0.5981801673,1.1602092813,0.4347789732,-1.3923437382,,, +8.5234375000,136,-0.4720907790,1.3691451581,0.7975122789,-1.1151338312,,, +8.5253906250,136,-0.3426596046,1.5985730405,1.2313686509,-0.6621611012,,, +8.5273437500,136,-0.2121878097,1.8305064323,1.6771650285,-0.1660322734,,, +8.5292968750,136,-0.0829865409,2.0466558399,2.0734362110,0.2311031615,,, +8.5312500000,136,0.0426636172,2.2297096002,2.3659592127,0.4165002762,,, +8.5332031250,136,0.1625526453,2.3645467644,2.5161516177,0.3376849882,,, +8.5351562500,136,0.2745798515,2.4392974435,2.5070360964,0.0167801700,,, +8.5371093750,136,0.3767907140,2.4461766627,2.3458423174,-0.4556341690,,, +8.5390625000,136,0.4674111590,2.3820335613,2.0628412206,-0.9454430936,,, +8.5410156250,136,0.5448786732,2.2485776273,1.7065934314,-1.3118699337,,, +8.5429687500,136,0.6078697073,2.0522661742,1.3363520990,-1.4461934536,,, +8.5449218750,136,0.6553228887,1.8038608931,1.0128036374,-1.3016964558,,, +8.5468750000,136,0.6864576391,1.5176843841,0.7885887125,-0.9066363144,,, +8.5488281250,136,0.7007878694,1.2106284988,0.7000800289,-0.3566809737,,, +8.5507812500,136,0.6981305123,0.9009836262,0.7616976959,0.2111182820,,, +8.5527343750,136,0.6786087442,0.6071705442,0.9636476955,0.6556858743,,, +8.5546875000,136,0.6426498387,0.3464632514,1.2734357856,0.8703757641,,, +8.5566406250,136,0.5909776899,0.1337918236,1.6409211090,0.8119830685,,, +8.5585937500,136,0.5246001367,-0.0192912420,2.0061224307,0.5123643450,,, +8.5605468750,136,0.4447913093,-0.1054091319,2.3085611671,0.0694839040,,, +8.5625000000,137,0.3530693071,-0.1218676333,2.4966859888,-0.3796577642,,, +8.5644531250,137,0.2511696003,-0.0708355315,2.5359110487,-0.6967917934,,, +8.5664062500,137,0.1410146183,0.0408140743,2.4140158040,-0.7804918325,,, +8.5683593750,137,0.0246800601,0.2019904554,2.1430653249,-0.5941808879,,, +8.5703125000,137,-0.0956414852,0.3981659818,1.7575519137,-0.1763562644,,, +8.5722656250,137,-0.2176789698,0.6123964350,1.3090473891,0.3697716873,,, +8.5742187500,137,-0.3391226985,0.8265097401,0.8581988545,0.9043891484,,, +8.5761718750,137,-0.4576648213,1.0223802053,0.4653145140,1.2892344690,,, +8.5781250000,137,-0.5710398001,1.1831993969,0.1810056913,1.4253441453,,, +8.5800781250,137,-0.6770641389,1.2946550114,0.0383424330,1.2800455441,,, +8.5820312500,137,-0.7736746840,1.3459355230,0.0477443145,0.8957997684,,, +8.5839843750,137,-0.8589648214,1.3304905339,0.1954020267,0.3784722144,,, +8.5859375000,137,-0.9312179391,1.2464937910,0.4454753718,-0.1317535563,,, +8.5878906250,137,-0.9889375673,1.0969765683,0.7457250839,-0.4988462527,,, +8.5898437500,137,-1.0308736697,0.8896220976,1.0357010458,-0.6282374619,,, +8.5917968750,137,-1.0560446246,0.6362353731,1.2562112856,-0.4927463689,,, +8.5937500000,137,-1.0637545110,0.3519252848,1.3585966430,-0.1400132649,,, +8.5957031250,137,-1.0536053978,0.0540561058,1.3123662510,0.3205953835,,, +8.5976562500,137,-1.0255044199,-0.2389585654,1.1100042864,0.7480210992,,, +8.5996093750,137,-0.9796655170,-0.5089353149,0.7681990253,1.0082548452,,, +8.6015625000,137,-0.9166058065,-0.7391846608,0.3253024801,1.0111672076,,, +8.6035156250,137,-0.8371366514,-0.9156709236,-0.1645839987,0.7353323861,,, +8.6054687500,137,-0.7423495814,-1.0279873468,-0.6399772540,0.2340414157,,, +8.6074218750,137,-0.6335973125,-1.0700784766,-1.0415299915,-0.3791446630,,, +8.6093750000,137,-0.5124701989,-1.0406594349,-1.3212164521,-0.9613436502,,, +8.6113281250,137,-0.3807685266,-0.9433028553,-1.4497556606,-1.3793224552,,, +8.6132812500,137,-0.2404711377,-0.7861874243,-1.4211163204,-1.5458099029,,, +8.6152343750,137,-0.0937009310,-0.5815255693,-1.2534019735,-1.4432016438,,, +8.6171875000,137,0.0573121547,-0.3447102054,-0.9859788235,-1.1281622872,,, +8.6191406250,137,0.2102700278,-0.0932400452,-0.6732938397,-0.7158654603,,, +8.6210937500,137,0.3628465198,0.1545015847,-0.3763462531,-0.3481932009,,, +8.6230468750,137,0.5127279496,0.3805292607,-0.1531410413,-0.1546124035,,, +8.6250000000,138,0.6576534641,0.5685098797,-0.0496115454,-0.2164530729,,, +8.6269531250,138,0.7954544509,0.7049015006,-0.0924252800,-0.5443808129,,, +8.6289062500,138,0.9240923317,0.7798971961,-0.2847936623,-1.0752398272,,, +8.6308593750,138,1.0416940750,0.7881080994,-0.6059384948,-1.6891338032,,, +8.6328125000,138,1.1465848071,0.7289380156,-1.0142984621,-2.2420654034,,, +8.6347656250,138,1.2373169490,0.6066234795,-1.4539763523,-2.6051908763,,, +8.6367187500,138,1.3126953713,0.4299364698,-1.8634229412,-2.6999332023,,, +8.6386718750,138,1.3717981241,0.2115705150,-2.1850050800,-2.5193321413,,, +8.6406250000,138,1.4139923816,-0.0327469941,-2.3739677916,-2.1297814756,,, +8.6425781250,138,1.4389453204,-0.2853543781,-2.4053945460,-1.6526788890,,, +8.6445312500,138,1.4466297423,-0.5278904450,-2.2780816563,-1.2310191118,,, +8.6464843750,138,1.4373243426,-0.7425783553,-2.0147233614,-0.9900874004,,, +8.6484375000,138,1.4116086196,-0.9134690406,-1.6583787678,-1.0030271597,,, +8.6503906250,138,1.3703525146,-1.0275574575,-1.2657709221,-1.2707194792,,, +8.6523437500,138,1.3147009640,-1.0756938290,-0.8984616790,-1.7214896917,,, +8.6542968750,138,1.2460536335,-1.0532263162,-0.6132768625,-2.2307218696,,, +8.6562500000,138,1.1660401902,-0.9603302961,-0.4534729703,-2.6550058048,,, +8.6582031250,138,1.0764915452,-0.8020012708,-0.4420211502,-2.8714578872,,, +8.6601562500,138,0.9794075707,-0.5877118897,-0.5780543849,-2.8114390842,,, +8.6621093750,138,0.8769218563,-0.3307569899,-0.8370311115,-2.4794285962,,, +8.6640625000,138,0.7712641232,-0.0473323128,-1.1745896347,-1.9518799490,,, +8.6660156250,138,0.6647209522,0.2445888732,-1.5334928118,-1.3563722912,,, +8.6679687500,138,0.5595955162,0.5265029215,-1.8525811455,-0.8367699717,,, +8.6699218750,138,0.4581670199,0.7806597739,-2.0763395864,-0.5139379919,,, +8.6718750000,138,0.3626505583,0.9912942276,-2.1635877436,-0.4527787620,,, +8.6738281250,138,0.2751580968,1.1457186554,-2.0939397214,-0.6446229421,,, +8.6757812500,138,0.1976612564,1.2352009977,-1.8710271832,-1.0097989119,,, +8.6777343750,138,0.1319565549,1.2555668180,-1.5219833755,-1.4196749194,,, +8.6796875000,138,0.0796337146,1.2074834532,-1.0932682118,-1.7321309657,,, +8.6816406250,138,0.0420475895,1.0964064620,-0.6434844071,-1.8307366928,,, +8.6835937500,138,0.0202942054,0.9321921234,-0.2343033081,-1.6568957568,,, +8.6855468750,138,0.0151913311,0.7284030216,0.0790865182,-1.2261447765,,, +8.6875000000,139,0.0272639229,0.5013551605,0.2565205421,-0.6241376616,,, +8.6894531250,139,0.0567346952,0.2689730713,0.2790593208,0.0165862770,,, +8.6914062500,139,0.1035199844,0.0495327682,0.1518837854,0.5526854461,,, +8.6933593750,139,0.1672309769,-0.1396197742,-0.0965659008,0.8690631786,,, +8.6953125000,139,0.2471802818,-0.2832852384,-0.4190734981,0.9101794924,,, +8.6972656250,139,0.3423937315,-0.3694778223,-0.7570533015,0.6950478575,,, +8.6992187500,139,0.4516272044,-0.3902679261,-1.0497263101,0.3118088071,,, +8.7011718750,139,0.5733881763,-0.3423418863,-1.2436364476,-0.1066304881,,, +8.7031250000,139,0.7059616213,-0.2272397105,-1.3010243695,-0.4192124226,,, +8.7050781250,139,0.8474398104,-0.0512542179,-1.2057543405,-0.5155638594,,, +8.7070312500,139,0.9957554852,0.1750013975,-0.9658707973,-0.3464047209,,, +8.7089843750,139,1.1487178271,0.4373274402,-0.6123861703,0.0628051942,,, +8.7109375000,139,1.3040505907,0.7189218640,-0.1944885507,0.6187225604,,, +8.7128906250,139,1.4594317349,1.0015460851,0.2280845649,1.1856019537,,, +8.7148437500,139,1.6125338587,1.2667911791,0.5943188107,1.6224195082,,, +8.7167968750,139,1.7610647309,1.4973561755,0.8513976879,1.8214649706,,, +8.7187500000,139,1.9028072080,1.6782493276,0.9629039143,1.7378256740,,, +8.7207031250,139,2.0356578378,1.7978285991,0.9144701142,1.4016820011,,, +8.7226562500,139,2.1576634762,1.8486088245,0.7159988391,0.9100445541,,, +8.7246093750,139,2.2670552730,1.8277792692,0.4001062322,0.4001974503,,, +8.7265625000,139,2.3622794344,1.7373955075,0.0170318171,0.0121257586,,, +8.7285156250,139,2.4420242223,1.5842322510,-0.3731927072,-0.1497759922,,, +8.7304687500,139,2.5052427173,1.3793073974,-0.7100958818,-0.0452204652,,, +8.7324218750,139,2.5511709491,1.1371104993,-0.9421834162,0.2910452626,,, +8.7343750000,139,2.5793410739,0.8745894630,-1.0349528997,0.7588955816,,, +8.7363281250,139,2.5895893709,0.6099661439,-0.9762579955,1.2204176280,,, +8.7382812500,139,2.5820589167,0.3614634389,-0.7781866663,1.5378745405,,, +8.7402343750,139,2.5571968904,0.1460326452,-0.4751609602,1.6116344859,,, +8.7421875000,139,2.5157465583,-0.0218301645,-0.1185544163,1.4076684953,,, +8.7441406250,139,2.4587340774,-0.1310962074,0.2313344287,0.9670789186,,, +8.7460937500,139,2.3874503486,-0.1749739192,0.5147021355,0.3950450755,,, +8.7480468750,139,2.3034282389,-0.1513830533,0.6815866790,-0.1677862657,,, +8.7500000000,140,2.2084155704,-0.0630998880,0.6996840818,-0.5836266632,,, +8.7519531250,140,2.1043443489,0.0824365844,0.5594176986,-0.7550862170,,, +8.7539062500,140,1.9932967727,0.2736439729,0.2754703855,-0.6516417292,,, +8.7558593750,140,1.8774686146,0.4956050920,-0.1154593058,-0.3177808293,,, +8.7578125000,140,1.7591306201,0.7311094685,-0.5603276497,0.1394078671,,, +8.7597656250,140,1.6405885969,0.9618551191,-0.9979600143,0.5797953129,,, +8.7617187500,140,1.5241428955,1.1697267948,-1.3685297081,0.8688196102,,, +8.7636718750,140,1.4120479889,1.3380615486,-1.6228252893,0.9145574888,,, +8.7656250000,140,1.3064728615,1.4528133730,-1.7298631746,0.6930976504,,, +8.7675781250,140,1.2094628984,1.5035356863,-1.6816601213,0.2552601704,,, +8.7695312500,140,1.1229039444,1.4841131497,-1.4944225269,-0.2871812384,,, +8.7714843750,140,1.0484891613,1.3931917768,-1.2059675929,-0.7919994965,,, +8.7734375000,140,0.9876892639,1.2342773346,-0.8697783109,-1.1253790597,,, +8.7753906250,140,0.9417266561,1.0154951650,-0.5466185299,-1.1984948796,,, +8.7773437500,140,0.9115539196,0.7490281674,-0.2950143918,-0.9917811811,,, +8.7792968750,140,0.8978370332,0.4502721227,-0.1620849928,-0.5602394721,,, +8.7812500000,140,0.9009436148,0.1367672499,-0.1761507277,-0.0183315846,,, +8.7832031250,140,0.9209363931,-0.1730195084,-0.3422708885,0.4914015290,,, +8.7851562500,140,0.9575720235,-0.4609765708,-0.6414058344,0.8373944426,,, +8.7871093750,140,1.0103052687,-0.7106047784,-1.0333344966,0.9350816935,,, +8.7890625000,140,1.0782984702,-0.9081617883,-1.4628730595,0.7700190509,,, +8.7910156250,140,1.1604361462,-1.0436140098,-1.8684264728,0.4017652372,,, +8.7929687500,140,1.2553444594,-1.1113297160,-2.1915410889,-0.0525390987,,, +8.7949218750,140,1.3614152140,-1.1104650132,-2.3859707722,-0.4503937840,,, +8.7968750000,140,1.4768339620,-1.0450157664,-2.4248445982,-0.6631306619,,, +8.7988281250,140,1.5996117266,-0.9235318773,-2.3048199255,-0.6113318199,,, +8.8007812500,140,1.7276197869,-0.7585138539,-2.0465741582,-0.2867660458,,, +8.8027343750,140,1.8586269156,-0.5655337659,-1.6915587625,0.2451701571,,, +8.8046875000,140,1.9903384170,-0.3621419031,-1.2955212592,0.8631776827,,, +8.8066406250,140,2.1204362820,-0.1666353935,-0.9198042992,1.4230899482,,, +8.8085937500,140,2.2466197569,0.0032253328,-0.6217771421,1.7971660050,,, +8.8105468750,140,2.3666456161,0.1314627126,-0.4458899669,1.9088745748,,, +8.8125000000,141,2.4783674333,0.2050039337,-0.4167444204,1.7536378193,,, +8.8144531250,141,2.5797731625,0.2146002861,-0.5352597418,1.3998517213,,, +8.8164062500,141,2.6690203732,0.1554798525,-0.7785316339,0.9699055767,,, +8.8183593750,141,2.7444685204,0.0276880065,-1.1034058623,0.6064047496,,, +8.8203125000,141,2.8047076854,-0.1639080418,-1.4532099562,0.4328561789,,, +8.8222656250,141,2.8485832845,-0.4099509883,-1.7665944721,0.5195936900,,, +8.8242187500,141,2.8752163119,-0.6972383482,-1.9871066842,0.8642840433,,, +8.8261718750,141,2.8840187639,-1.0096355861,-2.0720054672,1.3923584439,,, +8.8281250000,141,2.8747039723,-1.3291938035,-1.9989443052,1.9772531791,,, +8.8300781250,141,2.8472916677,-1.6373940610,-1.7694813890,2.4749138626,,, +8.8320312500,141,2.8021076831,-1.9164315815,-1.4088699471,2.7631084136,,, +8.8339843750,141,2.7397783041,-2.1504502971,-0.9621613074,2.7747758373,,, +8.8359375000,141,2.6612193624,-2.3266416693,-0.4872274815,2.5162723294,,, +8.8378906250,141,2.5676202660,-2.4361311713,-0.0457898493,2.0655152521,,, +8.8398437500,141,2.4604232444,-2.4745906315,0.3061489366,1.5505347478,,, +8.8417968750,141,2.3412981722,-2.4425337519,0.5269797654,1.1143122463,,, +8.8437500000,141,2.2121134121,-2.3452742079,0.5959176921,0.8755432807,,, +8.8457031250,141,2.0749031879,-2.1925492650,0.5161870137,0.8960788519,,, +8.8476562500,141,1.9318320587,-1.9978351721,0.3144649641,1.1639689858,,, +8.8496093750,141,1.7851571159,-1.7774020836,0.0366709440,1.5967558284,,, +8.8515625000,141,1.6371885658,-1.5491744251,-0.2592425893,2.0641136243,,, +8.8535156250,141,1.4902493865,-1.3314761858,-0.5123744319,2.4236303161,,, +8.8554687500,141,1.3466347673,-1.1417486409,-0.6684189266,2.5599235758,,, +8.8574218750,141,1.2085720386,-0.9953299331,-0.6881833732,2.4163700080,,, +8.8593750000,141,1.0781817965,-0.9043816251,-0.5537516310,2.0107505850,,, +8.8613281250,141,0.9574408994,-0.8770370878,-0.2713336060,1.4305232607,,, +8.8632812500,141,0.8481479881,-0.9168311160,0.1296434949,0.8090171211,,, +8.8652343750,141,0.7518921298,-1.0224505549,0.6010608895,0.2890710947,,, +8.8671875000,141,0.6700251376,-1.1878233332,1.0835463100,-0.0159188298,,, +8.8691406250,141,0.6036380482,-1.4025396987,1.5156662148,-0.0528698188,,, +8.8710937500,141,0.5535421702,-1.6525762885,1.8434406628,0.1566589116,,, +8.8730468750,141,0.5202550359,-1.9212725455,2.0286991261,0.5226036919,,, +8.8750000000,142,0.5039915002,-2.1904913958,2.0549760342,0.9113163231,,, +8.8769531250,142,0.5046601446,-2.4418832510,1.9300280360,1.1824344253,,, +8.8789062500,142,0.5218650478,-2.6581651958,1.6845811354,1.2275950105,,, +8.8808593750,142,0.5549128923,-2.8243261577,1.3675030619,1.0003788793,,, +8.8828125000,142,0.6028252823,-2.9286740199,1.0381530105,0.5292768018,,, +8.8847656250,142,0.6643560576,-2.9636516570,0.7571005097,-0.0898783229,,, +8.8867187500,142,0.7380132991,-2.9263649878,0.5766591767,-0.7199413437,,, +8.8886718750,142,0.8220856423,-2.8187862192,0.5327099334,-1.2198148426,,, +8.8906250000,142,0.9146724357,-2.6476181049,0.6390873985,-1.4829019846,,, +8.8925781250,142,1.0137172177,-2.4238286805,0.8854039229,-1.4661153796,,, +8.8945312500,142,1.1170439257,-2.1618889151,1.2386502866,-1.2014933062,,, +8.8964843750,142,1.2223952009,-1.8787664330,1.6483238190,-0.7872413265,,, +8.8984375000,142,1.3274721220,-1.5927454712,2.0542852692,-0.3606560607,,, +8.9003906250,142,1.4299746678,-1.3221553530,2.3961207146,-0.0603532957,,, +8.9023437500,142,1.5276422030,-1.0840961372,2.6225503597,0.0118462067,,, +8.9042968750,142,1.6182932769,-0.8932502983,2.6994187488,-0.1810738025,,, +8.9062500000,142,1.6998640384,-0.7608632941,2.6150218508,-0.6010976952,,, +8.9082031250,142,1.7704445938,-0.6939640986,2.3819412471,-1.1455364036,,, +8.9101562500,142,1.8283126724,-0.6948800433,2.0350996726,-1.6751331876,,, +8.9121093750,142,1.8719640077,-0.7610797880,1.6263406806,-2.0522140405,,, +8.9140625000,142,1.9001389050,-0.8853553589,1.2163765711,-2.1784269052,,, +8.9160156250,142,1.9118445276,-1.0563305468,0.8653586081,-2.0217263557,,, +8.9179687500,142,1.9063725124,-1.2592602005,0.6235381191,-1.6252076881,,, +8.9199218750,142,1.8833116068,-1.4770646641,0.5234728971,-1.0953686971,,, +8.9218750000,142,1.8425551043,-1.6915272087,0.5749926182,-0.5730154666,,, +8.9238281250,142,1.7843029490,-1.8845709454,0.7637072415,-0.1947850690,,, +8.9257812500,142,1.7090584726,-2.0395261576,1.0532905051,-0.0558295113,,, +8.9277343750,142,1.6176198202,-2.1422996657,1.3911826256,-0.1838868302,,, +8.9296875000,142,1.5110662145,-2.1823646623,1.7168237383,-0.5318442036,,, +8.9316406250,142,1.3907393001,-2.1535019786,1.9711354257,-0.9908296970,,, +8.9335937500,142,1.2582198935,-2.0542410744,2.1057732777,-1.4202428478,,, +8.9355468750,142,1.1153005457,-1.8879699828,2.0907090785,-1.6864917500,,, +8.9375000000,143,0.9639543981,-1.6627065276,1.9189613792,-1.6998180149,,, +8.9394531250,143,0.8063008769,-1.3905467476,1.6077373610,-1.4391149618,,, +8.9414062500,143,0.6445688262,-1.0868289761,1.1958078526,-0.9579350256,,, +8.9433593750,143,0.4810577252,-0.7690718488,0.7375240647,-0.3700378001,,, +8.9453125000,143,0.3180976692,-0.4557602779,0.2944076761,0.1815625853,,, +8.9472656250,143,0.1580088142,-0.1650640351,-0.0743761323,0.5635697257,,, +8.9492187500,143,0.0030609948,0.0864217184,-0.3211791103,0.6887178412,,, +8.9511718750,143,-0.1445657762,0.2848261439,-0.4172373405,0.5394751381,,, +8.9531250000,143,-0.2828192366,0.4199625242,-0.3570983800,0.1726432854,,, +8.9550781250,143,-0.4098105668,0.4860312362,-0.1594188693,-0.2964056126,,, +8.9570312500,143,-0.5238472217,0.4820168927,0.1359913555,-0.7255325127,,, +8.9589843750,143,-0.6234623249,0.4117519778,0.4744179889,-0.9849572632,,, +8.9609375000,143,-0.7074401145,0.2836425515,0.7948103000,-0.9929819311,,, +8.9628906250,143,-0.7748369916,0.1100751709,1.0393337354,-0.7385194574,,, +8.9648437500,143,-0.8249978054,-0.0934536031,1.1624189863,-0.2842518922,,, +8.9667968750,143,-0.8575670882,-0.3094243937,1.1378978676,0.2504485183,,, +8.9687500000,143,-0.8724950455,-0.5195230632,0.9631143593,0.7221555450,,, +8.9707031250,143,-0.8700381945,-0.7059239858,0.6593703129,1.0026386618,,, +8.9726562500,143,-0.8507546416,-0.8525390365,0.2686362354,1.0139696282,,, +8.9746093750,143,-0.8154940808,-0.9461451870,-0.1529606831,0.7498646871,,, +8.9765625000,143,-0.7653826883,-0.9773120656,-0.5438571524,0.2774132994,,, +8.9785156250,143,-0.7018031780,-0.9410647865,-0.8466248102,-0.2812804136,,, +8.9804687500,143,-0.6263703684,-0.8372358165,-1.0169010454,-0.7825122277,,, +8.9824218750,143,-0.5409026862,-0.6704813301,-1.0302886646,-1.1002908915,,, +8.9843750000,143,-0.4473901087,-0.4499609040,-0.8861497907,-1.1607758308,,, +8.9863281250,143,-0.3479591039,-0.1887028753,-0.6077031024,-0.9624019819,,, +8.9882812500,143,-0.2448351844,0.0973003882,-0.2384092767,-0.5761771670,,, +8.9902343750,143,-0.1403037296,0.3902042255,0.1647923942,-0.1260717174,,, +8.9921875000,143,-0.0366697621,0.6715529087,0.5403428124,0.2451236704,,, +8.9941406250,143,0.0637826156,0.9235638123,0.8316375604,0.4151129803,,, +8.9960937500,143,0.1588304158,1.1303649800,0.9958258630,0.3158060857,,, +8.9980468750,143,0.2463508861,1.2790997958,1.0104636357,-0.0478148998,,, +9.0000000000,144,0.3243588722,1.3608217321,0.8769844890,-0.5988467282,,, +9.0019531250,144,0.3910417667,1.3711167830,0.6204481948,-1.2093200864,,, +9.0039062500,144,0.4447914337,1.3104101833,0.2856059463,-1.7350449400,,, +9.0058593750,144,0.4842325490,1.1839360251,-0.0701045621,-2.0548982044,,, +9.0078125000,144,0.5082468603,1.0013718927,-0.3855429950,-2.1037883188,,, +9.0097656250,144,0.5159929414,0.7761639934,-0.6054296896,-1.8902642850,,, +9.0117187500,144,0.5069210956,0.5245898457,-0.6889986699,-1.4939452166,,, +9.0136718750,144,0.4807831469,0.2646238833,-0.6163923784,-1.0434770126,,, +9.0156250000,144,0.4376369469,0.0146850799,-0.3918018683,-0.6810596513,,, +9.0175781250,144,0.3778455191,-0.2076460784,-0.0428631031,-0.5232691280,,, +9.0195312500,144,0.3020708551,-0.3868518048,0.3835968716,-0.6289135013,,, +9.0214843750,144,0.2112624714,-0.5105570465,0.8288015992,-0.9827345739,,, +9.0234375000,144,0.1066409274,-0.5703900320,1.2311270756,-1.4994238022,,, +9.0253906250,144,-0.0103234080,-0.5625633291,1.5356464256,-2.0468533739,,, +9.0273437500,144,-0.1379359679,-0.4881349018,1.7026310466,-2.4821569432,,, +9.0292968750,144,-0.2743075299,-0.3529309681,1.7136844113,-2.6907726452,,, +9.0312500000,144,-0.4173871715,-0.1671360493,1.5745534486,-2.6177489642,,, +9.0332031250,144,-0.5649980623,0.0554211966,1.3141799048,-2.2827343680,,, +9.0351562500,144,-0.7148754657,0.2982365428,0.9801397297,-1.7745432150,,, +9.0371093750,144,-0.8647062842,0.5432856135,0.6311811115,-1.2267877734,,, +9.0390625000,144,-1.0121694579,0.7722855732,0.3280236793,-0.7812551975,,, +9.0410156250,144,-1.1549765067,0.9679750898,0.1238522202,-0.5490668386,,, +9.0429687500,144,-1.2909115075,1.1153233073,0.0559858286,-0.5802648537,,, +9.0449218750,144,-1.4178698061,1.2025835051,0.1400203166,-0.8501612006,,, +9.0468750000,144,-1.5338947865,1.2221179598,0.3673564819,-1.2661898344,,, +9.0488281250,144,-1.6372120532,1.1709364715,0.7064994494,-1.6933834081,,, +9.0507812500,144,-1.7262604279,1.0509109906,1.1079269289,-1.9914911713,,, +9.0527343750,144,-1.7997192189,0.8686513601,1.5117683343,-2.0535640693,,, +9.0546875000,144,-1.8565312848,0.6350508264,1.8570988942,-1.8354307561,,, +9.0566406250,144,-1.8959214884,0.3645329936,2.0914013164,-1.3679845988,,, +9.0585937500,144,-1.9174102193,0.0740527185,2.1787214622,-0.7489125888,,, +9.0605468750,144,-1.9208217467,-0.2180793983,2.1052478752,-0.1161312989,,, +9.0625000000,145,-1.9062872569,-0.4934669717,1.8814462453,0.3897915480,,, +9.0644531250,145,-1.8742425226,-0.7349036981,1.5404164518,0.6639327214,,, +9.0664062500,145,-1.8254202443,-0.9275661762,1.1327281637,0.6655326805,,, +9.0683593750,145,-1.7608371982,-1.0600405189,0.7185394402,0.4289241660,,, +9.0703125000,145,-1.6817764157,-1.1251111869,0.3582259375,0.0538771312,,, +9.0722656250,145,-1.5897647060,-1.1202570501,0.1029802896,-0.3219916507,,, +9.0742187500,145,-1.4865459163,-1.0478201047,-0.0131541442,-0.5611804234,,, +9.0761718750,145,-1.3740503972,-0.9148350969,0.0214255955,-0.5642293622,,, +9.0781250000,145,-1.2543612078,-0.7325319501,0.1940901445,-0.2972157988,,, +9.0800781250,145,-1.1296776527,-0.5155457119,0.4699641277,0.1987199443,,, +9.0820312500,145,-1.0022767892,-0.2808891296,0.7973812439,0.8184308699,,, +9.0839843750,145,-0.8744735785,-0.0467595153,1.1159583554,1.4213734947,,, +9.0859375000,145,-0.7485803789,0.1687368793,1.3660308753,1.8699325359,,, +9.0878906250,145,-0.6268664900,0.3488540117,1.4979796967,2.0669581458,,, +9.0898437500,145,-0.5115184564,0.4793802013,1.4799967809,1.9822294231,,, +9.0917968750,145,-0.4046018261,0.5496353937,1.3030796942,1.6605927500,,, +9.0937500000,145,-0.3080250331,0.5532219800,0.9824769708,1.2095457221,,, +9.0957031250,145,-0.2235060357,0.4884767978,0.5553589683,0.7696706022,,, +9.0976562500,145,-0.1525422964,0.3585927808,0.0750767649,0.4760214773,,, +9.0996093750,145,-0.0963846276,0.1714017609,-0.3970969316,0.4210484192,,, +9.1015625000,145,-0.0560153611,-0.0611664462,-0.8014587180,0.6292205029,,, +9.1035156250,145,-0.0321312248,-0.3239109636,-1.0891192700,1.0503030238,,, +9.1054687500,145,-0.0251312245,-0.5994151329,-1.2295623047,1.5731314951,,, +9.1074218750,145,-0.0351097447,-0.8692565750,-1.2153406605,2.0561072410,,, +9.1093750000,145,-0.0618549880,-1.1152876607,-1.0631783397,2.3660563121,,, +9.1113281250,145,-0.1048527812,-1.3208971110,-0.8113071524,2.4148011064,,, +9.1132812500,145,-0.1632956802,-1.4721647614,-0.5134530876,2.1834207630,,, +9.1152343750,145,-0.2360972160,-1.5588289728,-0.2304093567,1.7275503392,,, +9.1171875000,145,-0.3219110300,-1.5749992386,-0.0205089498,1.1622653022,,, +9.1191406250,145,-0.4191545663,-1.5195643006,0.0695190554,0.6306927454,,, +9.1210937500,145,-0.5260369027,-1.3962673245,0.0118849626,0.2649505972,,, +9.1230468750,145,-0.6405902364,-1.2134428953,-0.1978771198,0.1501186087,,, +9.1250000000,146,-0.7607044707,-0.9834341811,-0.5401590782,0.3011138585,,, +9.1269531250,146,-0.8841642972,-0.7217309110,-0.9742799370,0.6588066534,,, +9.1289062500,146,-1.0086881261,-0.4458882828,-1.4447711659,1.1064393932,,, +9.1308593750,146,-1.1319681795,-0.1743021914,-1.8899674356,1.5018464528,,, +9.1328125000,146,-1.2517110494,0.0750738127,-2.2515650109,1.7166424895,,, +9.1347656250,146,-1.3656780065,0.2859803634,-2.4836592400,1.6716367052,,, +9.1367187500,146,-1.4717243569,0.4449856221,-2.5598537222,1.3587649224,,, +9.1386718750,146,-1.5678371550,0.5424210927,-2.4773340648,0.8435263954,,, +9.1406250000,146,-1.6521706148,0.5730546523,-2.2572719057,0.2472553588,,, +9.1425781250,146,-1.7230785962,0.5364538675,-1.9414964448,-0.2859159500,,, +9.1445312500,146,-1.7791436008,0.4370142637,-1.5859520599,-0.6283503953,,, +9.1464843750,146,-1.8192017665,0.2836505797,-1.2519611526,-0.7036880850,,, +9.1484375000,146,-1.8423634249,0.0891725428,-0.9966531960,-0.5075866807,,, +9.1503906250,146,-1.8480288612,-0.1306113029,-0.8640508039,-0.1087373462,,, +9.1523437500,146,-1.8358989994,-0.3579992140,-0.8782012888,0.3701204720,,, +9.1542968750,146,-1.8059808270,-0.5746342070,-1.0394235561,0.7859806591,,, +9.1562500000,146,-1.7585874635,-0.7627880252,-1.3242549351,1.0148885782,,, +9.1582031250,146,-1.6943328710,-0.9066015685,-1.6891062388,0.9860186569,,, +9.1601562500,146,-1.6141213006,-0.9931952793,-2.0770557468,0.7011707808,,, +9.1621093750,146,-1.5191316572,-1.0135720435,-2.4267238850,0.2343413198,,, +9.1640625000,146,-1.4107970591,-0.9632496330,-2.6818462689,-0.2885142480,,, +9.1660156250,146,-1.2907799475,-0.8425785784,-2.8000539889,-0.7239810591,,, +9.1679687500,146,-1.1609431838,-0.6567232921,-2.7594934683,-0.9504917907,,, +9.1699218750,146,-1.0233176385,-0.4153077468,-2.5622547043,-0.9016679317,,, +9.1718750000,146,-0.8800668416,-0.1317504042,-2.2340737937,-0.5845573359,,, +9.1738281250,146,-0.7334493111,0.1776652423,-1.8203559269,-0.0777692698,,, +9.1757812500,146,-0.5857792204,0.4949197101,-1.3791381224,0.4899825441,,, +9.1777343750,146,-0.4393860927,0.8015074384,-0.9720876082,0.9750490001,,, +9.1796875000,146,-0.2965742279,1.0797204220,-0.6549376990,1.2580890216,,, +9.1816406250,146,-0.1595825731,1.3138760717,-0.4688506173,1.2766330558,,, +9.1835937500,146,-0.0305457378,1.4914036936,-0.4340523157,1.0420433323,,, +9.1855468750,146,0.0885431618,1.6037138403,-0.5467304675,0.6362240946,,, +9.1875000000,147,0.1958671810,1.6467899274,-0.7796785296,0.1889850847,,, +9.1894531250,147,0.2898171385,1.6214608765,-1.0865852966,-0.1577359541,,, +9.1914062500,147,0.3690195704,1.5333357891,-1.4093015557,-0.2889843317,,, +9.1933593750,147,0.4323605554,1.3924052245,-1.6869517436,-0.1485118783,,, +9.1953125000,147,0.4790049953,1.2123369013,-1.8654711327,0.2455836779,,, +9.1972656250,147,0.5084110135,1.0095149551,-1.9060827912,0.8055918129,,, +9.1992187500,147,0.5203392187,0.8018897626,-1.7913936952,1.3979997293,,, +9.2011718750,147,0.5148566717,0.6077185571,-1.5281601977,1.8798567071,,, +9.2031250000,147,0.4923354867,0.4442846724,-1.1462918270,2.1377280583,,, +9.2050781250,147,0.4534460918,0.3266847436,-0.6942482873,2.1185647030,,, +9.2070312500,147,0.3991452656,0.2667684545,-0.2315463161,1.8440300270,,, +9.2089843750,147,0.3306591610,0.2723047838,0.1804567881,1.4043594803,,, +9.2109375000,147,0.2494616123,0.3464329062,0.4880677293,0.9334377522,,, +9.2128906250,147,0.1572481069,0.4874360569,0.6535697508,0.5719259615,,, +9.2148437500,147,0.0559058763,0.6888541437,0.6610486841,0.4285463113,,, +9.2167968750,147,-0.0525193694,0.9399272707,0.5188253208,0.5501365097,,, +9.2187500000,147,-0.1658594803,1.2263392611,0.2581154896,0.9086825820,,, +9.2207031250,147,-0.2818620481,1.5312093465,-0.0718732374,1.4088852670,,, +9.2226562500,147,-0.3982300624,1.8362628835,-0.4116442838,1.9141873826,,, +9.2246093750,147,-0.5126623449,2.1230994747,-0.7007143177,2.2841297607,,, +9.2265625000,147,-0.6228940561,2.3744700787,-0.8870659563,2.4127983409,,, +9.2285156250,147,-0.7267365635,2.5754740651,-0.9352784561,2.2578257597,,, +9.2304687500,147,-0.8221159731,2.7145927539,-0.8320698471,1.8519992948,,, +9.2324218750,147,-0.9071096502,2.7844873786,-0.5883871693,1.2942938969,,, +9.2343750000,147,-0.9799800896,2.7825058429,-0.2377191408,0.7227877958,,, +9.2363281250,147,-1.0392055411,2.7108629418,0.1691060181,0.2768834039,,, +9.2382812500,147,-1.0835068558,2.5764814924,0.5718274038,0.0591871335,,, +9.2402343750,147,-1.1118700808,2.3905054630,0.9101314073,0.1074950228,,, +9.2421875000,147,-1.1235644084,2.1675190591,1.1330438940,0.3845611745,,, +9.2441406250,147,-1.1181551644,1.9245262332,1.2068717076,0.7884520904,,, +9.2460937500,147,-1.0955116081,1.6797617859,1.1204565477,1.1806478303,,, +9.2480468750,147,-1.0558094079,1.4514169737,0.8869228646,1.4241868907,,, +9.2500000000,148,-0.9995277474,1.2563684948,0.5416474658,1.4213988623,,, +9.2519531250,148,-0.9274411153,1.1089994926,0.1367670008,1.1408817678,,, +9.2539062500,148,-0.8406059200,1.0201947958,-0.2669212895,0.6263285679,,, +9.2558593750,148,-0.7403421647,0.9965804646,-0.6094041763,-0.0152181801,,, +9.2578125000,148,-0.6282105035,1.0400606752,-0.8407714911,-0.6424664900,,, +9.2597656250,148,-0.5059850799,1.1476842395,-0.9289582849,-1.1183565507,,, +9.2617187500,148,-0.3756226233,1.3118500697,-0.8647043886,-1.3473792536,,, +9.2636718750,148,-0.2392283451,1.5208372607,-0.6629590879,-1.3015059274,,, +9.2656250000,148,-0.0990192298,1.7596228262,-0.3605123334,-1.0276248977,,, +9.2675781250,148,0.0427146338,2.0109300643,-0.0102216552,-0.6344489037,,, +9.2695312500,148,0.1836500064,2.2564344452,0.3272657947,-0.2624837962,,, +9.2714843750,148,0.3214710365,2.4780429272,0.5930064930,-0.0452912844,,, +9.2734375000,148,0.4539096736,2.6591574883,0.7389902085,-0.0726644711,,, +9.2753906250,148,0.5787852491,2.7858347584,0.7356682458,-0.3658105893,,, +9.2773437500,148,0.6940425308,2.8477608820,0.5766074317,-0.8713444357,,, +9.2792968750,148,0.7977875869,2.8389736263,0.2795446829,-1.4757404251,,, +9.2812500000,148,0.8883208288,2.7582813725,-0.1163223841,-2.0362839600,,, +9.2832031250,148,0.9641666569,2.6093497660,-0.5563870871,-2.4200406898,,, +9.2851562500,148,1.0240991884,2.4004499749,-0.9790852729,-2.5401646049,,, +9.2871093750,148,1.0671636179,2.1438861023,-1.3254307811,-2.3795950829,,, +9.2890625000,148,1.0926928355,1.8551416721,-1.5481498706,-1.9956491238,,, +9.2910156250,148,1.1003190138,1.5518046965,-1.6189921581,-1.5042508750,,, +9.2929687500,148,1.0899799578,1.2523462711,-1.5330796371,-1.0481211526,,, +9.2949218750,148,1.0619201099,0.9748378616,-1.3096166699,-0.7576455439,,, +9.2968750000,148,1.0166861893,0.7356967148,-0.9888506415,-0.7151460493,,, +9.2988281250,148,0.9551175450,0.5485468695,-0.6257569289,-0.9323482064,,, +9.3007812500,148,0.8783313895,0.4232751792,-0.2814320409,-1.3472189450,,, +9.3027343750,148,0.7877031722,0.3653481583,-0.0135357320,-1.8410412834,,, +9.3046875000,148,0.6848424371,0.3754372779,0.1327289881,-2.2710454654,,, +9.3066406250,148,0.5715645860,0.4493788248,0.1316928221,-2.5096523920,,, +9.3085937500,148,0.4498590433,0.5784711068,-0.0187483465,-2.4795727894,,, +9.3105468750,148,0.3218543786,0.7500882664,-0.2967755927,-2.1751411958,,, +9.3125000000,149,0.1897809985,0.9485678810,-0.6600186040,-1.6640363157,,, +9.3144531250,149,0.0559320607,1.1563104407,-1.0521318497,-1.0689146494,,, +9.3164062500,149,-0.0773767053,1.3550140149,-1.4115511240,-0.5339893380,,, +9.3183593750,149,-0.2078475671,1.5269579960,-1.6810667009,-0.1857121183,,, +9.3203125000,149,-0.3332410374,1.6562463823,-1.8167221254,-0.0983323355,,, +9.3222656250,149,-0.4514150975,1.7299238854,-1.7946526826,-0.2737702308,,, +9.3242187500,149,-0.5603627072,1.7388870154,-1.6147984713,-0.6413185405,,, +9.3261718750,149,-0.6582469473,1.6785265935,-1.3009137838,-1.0772520576,,, +9.3281250000,149,-0.7434331761,1.5490568705,-0.8968713443,-1.4389686058,,, +9.3300781250,149,-0.8145176401,1.3555082835,-0.4598370309,-1.6043022488,,, +9.3320312500,149,-0.8703520346,1.1073843373,-0.0513781247,-1.5052320191,,, +9.3339843750,149,-0.9100635878,0.8180065229,0.2721100280,-1.1467455062,,, +9.3359375000,149,-0.9330703130,0.5035929330,0.4681679128,-0.6056853063,,, +9.3378906250,149,-0.9390911648,0.1821348126,0.5148613734,-0.0098925073,,, +9.3398437500,149,-0.9281509201,-0.1278506335,0.4141705235,0.4966385335,,, +9.3417968750,149,-0.9005796984,-0.4086042208,0.1916503353,0.7930458675,,, +9.3437500000,149,-0.8570071306,-0.6443560325,-0.1075840830,0.8145607140,,, +9.3457031250,149,-0.7983512774,-0.8224180928,-0.4259220374,0.5701112573,,, +9.3476562500,149,-0.7258024925,-0.9340622854,-0.7022711029,0.1397461602,,, +9.3496093750,149,-0.6408025119,-0.9751223118,-0.8816161271,-0.3474148783,,, +9.3515625000,149,-0.5450191374,-0.9462777297,-0.9236343028,-0.7486594263,,, +9.3535156250,149,-0.4403169548,-0.8530002763,-0.8090242376,-0.9468651250,,, +9.3554687500,149,-0.3287246027,-0.7051662362,-0.5425629945,-0.8826475427,,, +9.3574218750,149,-0.2123991623,-0.5163618961,-0.1524146985,-0.5706618931,,, +9.3593750000,149,-0.0935882942,-0.3029305332,0.3142018632,-0.0955905897,,, +9.3613281250,149,0.0254092166,-0.0828274056,0.7983121259,0.4110836818,,, +9.3632812500,149,0.1422838163,0.1256373982,1.2383145572,0.8071533731,,, +9.3652343750,149,0.2547557302,0.3050805748,1.5795178142,0.9787223723,,, +9.3671875000,149,0.3606149953,0.4402623044,1.7826010771,0.8715039113,,, +9.3691406250,149,0.4577602750,0.5191531786,1.8296801088,0.5058014619,,, +9.3710937500,149,0.5442357757,0.5337769481,1.7270345137,-0.0289341823,,, +9.3730468750,149,0.6182656212,0.4807703147,1.5040717046,-0.5984810673,,, +9.3750000000,150,0.6782850799,0.3616207236,1.2086892369,-1.0604760469,,, +9.3769531250,150,0.7229681007,0.1825655667,0.8997581403,-1.3032608773,,, +9.3789062500,150,0.7512506729,-0.0458401786,0.6378982931,-1.2762995257,,, +9.3808593750,150,0.7623496033,-0.3094577330,0.4759829012,-1.0038319852,,, +9.3828125000,150,0.7557763798,-0.5915485544,0.4508513293,-0.5780243698,,, +9.3847656250,150,0.7313458796,-0.8739400176,0.5775213185,-0.1334946098,,, +9.3867187500,150,0.6891797693,-1.1382914503,0.8468023168,0.1898024648,,, +9.3886718750,150,0.6297045372,-1.3673722424,1.2266819004,0.2851564717,,, +9.3906250000,150,0.5536441918,-1.5462629044,1.6672695710,0.1085731269,,, +9.3925781250,150,0.4620077553,-1.6633953204,2.1085281182,-0.3089432492,,, +9.3945312500,150,0.3560717697,-1.7113596560,2.4895885462,-0.8696647863,,, +9.3964843750,150,0.2373581225,-1.6874216514,2.7581978974,-1.4357068631,,, +9.3984375000,150,0.1076075800,-1.5937142246,2.8788285890,-1.8666075738,,, +9.4003906250,150,-0.0312505083,-1.4370900216,2.8381863391,-2.0576224807,,, +9.4023437500,150,-0.1771318045,-1.2286451918,2.6472589209,-1.9682411535,,, +9.4042968750,150,-0.3278332870,-0.9829475921,2.3395867505,-1.6331118115,,, +9.4062500000,150,-0.4810716308,-0.7170232349,1.9660247620,-1.1523816798,,, +9.4082031250,150,-0.6345229908,-0.4491716523,1.5868115058,-0.6641020739,,, +9.4101562500,150,-0.7858634911,-0.1976927769,1.2621807958,-0.3062626010,,, +9.4121093750,150,-0.9328097127,0.0203858884,1.0429782199,-0.1788610511,,, +9.4140625000,150,-1.0731584702,0.1904930619,0.9627440469,-0.3164056016,,, +9.4160156250,150,-1.2048251799,0.3015258957,1.0324956443,-0.6783865883,,, +9.4179687500,150,-1.3258801506,0.3466200344,1.2390220364,-1.1603299882,,, +9.4199218750,150,-1.4345821578,0.3236238306,1.5469561782,-1.6224037313,,, +9.4218750000,150,-1.5294087178,0.2352436612,1.9043020984,-1.9277370501,,, +9.4238281250,150,-1.6090825274,0.0888502213,2.2505559349,-1.9799508195,,, +9.4257812500,150,-1.6725936107,-0.1040406828,2.5261558480,-1.7496128725,,, +9.4277343750,150,-1.7192167815,-0.3285766239,2.6817888053,-1.2823674036,,, +9.4296875000,150,-1.7485241180,-0.5676099354,2.6861044989,-0.6865099482,,, +9.4316406250,150,-1.7603922311,-0.8028993509,2.5306347429,-0.1034125761,,, +9.4335937500,150,-1.7550041987,-1.0163880931,2.2311519375,0.3310960135,,, +9.4355468750,150,-1.7328461319,-1.1914692735,1.8252548102,0.5238120093,,, +9.4375000000,151,-1.6946984350,-1.3141503457,1.3665572456,0.4495379270,,, +9.4394531250,151,-1.6416219104,-1.3740353966,0.9163850950,0.1578090930,,, +9.4414062500,151,-1.5749389537,-1.3650567619,0.5342739833,-0.2408767964,,, +9.4433593750,151,-1.4962101666,-1.2859049304,0.2687478775,-0.6055512720,,, +9.4453125000,151,-1.4072067990,-1.1401267432,0.1498144353,-0.8036291938,,, +9.4472656250,151,-1.3098795018,-0.9358850235,0.1843457516,-0.7474746847,,, +9.4492187500,151,-1.2063239379,-0.6853963812,0.3550636928,-0.4186552546,,, +9.4511718750,151,-1.0987438540,-0.4040863793,0.6232875757,0.1267652993,,, +9.4531250000,151,-0.9894122598,-0.1095209589,0.9350159330,0.7733479768,,, +9.4550781250,151,-0.8806313940,0.1798113810,1.2293948078,1.3776715780,,, +9.4570312500,151,-0.7746921797,0.4457817419,1.4482533020,1.8073959232,,, +9.4589843750,151,-0.6738338766,0.6718779314,1.5452208745,1.9772914042,,, +9.4609375000,151,-0.5802046399,0.8443488711,1.4930060305,1.8723623884,,, +9.4628906250,151,-0.4958236739,0.9531565199,1.2877024230,1.5517291391,,, +9.4648437500,151,-0.4225456449,0.9926689500,0.9494513849,1.1322063569,,, +9.4667968750,151,-0.3620279755,0.9620462609,0.5193574247,0.7560809114,,, +9.4687500000,151,-0.3157015938,0.8652924374,0.0531368468,0.5519217527,,, +9.4707031250,151,-0.2847456496,0.7109695508,-0.3875115006,0.5991645448,,, +9.4726562500,151,-0.2700666408,0.5115942507,-0.7444695465,0.9061788846,,, +9.4746093750,151,-0.2722823143,0.2827586447,-0.9722080817,1.4078306509,,, +9.4765625000,151,-0.2917106258,0.0420368882,-1.0448367754,1.9832088307,,, +9.4785156250,151,-0.3283639492,-0.1922462570,-0.9600982511,2.4886595180,,, +9.4804687500,151,-0.3819486397,-0.4022990058,-0.7396843166,2.7970743571,,, +9.4824218750,151,-0.4518699560,-0.5721087541,-0.4258252701,2.8326663538,,, +9.4843750000,151,-0.5372422578,-0.6885639889,-0.0746836716,2.5917025531,,, +9.4863281250,151,-0.6369042981,-0.7423736562,0.2524183226,2.1435116815,,, +9.4882812500,151,-0.7494393442,-0.7287198647,0.4985715543,1.6114906792,,, +9.4902343750,151,-0.8731997749,-0.6475983976,0.6201613017,1.1393155497,,, +9.4921875000,151,-1.0063357220,-0.5038232777,0.5936741497,0.8516167926,,, +9.4941406250,151,-1.1468272569,-0.3066950555,0.4193700248,0.8198965784,,, +9.4960937500,151,-1.2925195570,-0.0693559431,0.1212474149,1.0430280169,,, +9.4980468750,151,-1.4411604376,0.1921232483,-0.2566928276,1.4476801652,,, +9.5000000000,152,-1.5904395907,0.4598607025,-0.6573031665,1.9085511904,,, +9.5019531250,152,-1.7380288453,0.7154078014,-1.0191967152,2.2828631069,,, +9.5039062500,152,-1.8816227439,0.9410331791,-1.2863188152,2.4496626768,,, +9.5058593750,152,-2.0189787238,1.1209570934,-1.4166919718,2.3431556877,,, +9.5078125000,152,-2.1479562012,1.2424500435,-1.3889719938,1.9709369615,,, +9.5097656250,152,-2.2665538733,1.2967190281,-1.2057940784,1.4121179543,,, +9.5117187500,152,-2.3729445845,1.2795196457,-0.8933875484,0.7958631757,,, +9.5136718750,152,-2.4655071479,1.1914513576,-0.4975191059,0.2662159249,,, +9.5156250000,152,-2.5428545639,1.0379153245,-0.0763963021,-0.0571485358,,, +9.5175781250,152,-2.6038581416,0.8287377605,0.3083636322,-0.1114881270,,, +9.5195312500,152,-2.6476671023,0.5774850673,0.6012931364,0.0920455505,,, +9.5214843750,152,-2.6737233200,0.3005185078,0.7616731398,0.4716975640,,, +9.5234375000,152,-2.6817709421,0.0158543383,0.7698322618,0.8977469072,,, +9.5253906250,152,-2.6718607223,-0.2580911160,0.6301654956,1.2282843551,,, +9.5273437500,152,-2.6443489882,-0.5037839363,0.3704024445,1.3483232191,,, +9.5292968750,152,-2.5998912635,-0.7057932062,0.0372393477,1.2015219242,,, +9.5312500000,152,-2.5394306555,-0.8518646195,-0.3109845064,0.8058223041,,, +9.5332031250,152,-2.4641812125,-0.9337722372,-0.6134250157,0.2487158347,,, +9.5351562500,152,-2.3756065405,-0.9478890044,-0.8162625401,-0.3365664769,,, +9.5371093750,152,-2.2753940561,-0.8954362500,-0.8811376987,-0.8074164365,,, +9.5390625000,152,-2.1654253249,-0.7823947780,-0.7911794789,-1.0507987853,,, +9.5410156250,152,-2.0477430054,-0.6190837590,-0.5536864579,-1.0141152438,,, +9.5429687500,152,-1.9245149770,-0.4194367950,-0.1990432319,-0.7195245976,,, +9.5449218750,152,-1.7979962811,-0.2000256515,0.2239594639,-0.2577949560,,, +9.5468750000,152,-1.6704895403,0.0211002578,0.6556723152,0.2366262608,,, +9.5488281250,152,-1.5443045503,0.2256776922,1.0348273789,0.6224915962,,, +9.5507812500,152,-1.4217177515,0.3965085732,1.3080315269,0.7904743527,,, +9.5527343750,152,-1.3049322892,0.5186649388,1.4380350013,0.6931186725,,, +9.5546875000,152,-1.1960393636,0.5805358262,1.4094874680,0.3578106617,,, +9.5566406250,152,-1.0969815447,0.5746430661,1.2312852851,-0.1207840544,,, +9.5585937500,152,-1.0095186953,0.4981690884,0.9351446246,-0.6067431199,,, +9.5605468750,152,-0.9351970986,0.3531599177,0.5706229192,-0.9602377326,,, +9.5625000000,153,-0.8753223314,0.1463891898,0.1973642814,-1.0759728624,,, +9.5644531250,153,-0.8309363576,-0.1111073450,-0.1242230887,-0.9121809395,,, +9.5664062500,153,-0.8027992426,-0.4047943849,-0.3424052829,-0.5022213928,,, +9.5683593750,153,-0.7913758098,-0.7176435475,-0.4222066085,0.0543945264,,, +9.5703125000,153,-0.7968274726,-1.0313135792,-0.3508797946,0.6190954314,,, +9.5722656250,153,-0.8190093843,-1.3274220211,-0.1399103385,1.0520347307,,, +9.5742187500,153,-0.8574729564,-1.5888196689,0.1767573051,1.2502149500,,, +9.5761718750,153,-0.9114737015,-1.8007789740,0.5479955030,1.1755046713,,, +9.5781250000,153,-0.9799842624,-1.9520135294,0.9134495284,0.8648715226,,, +9.5800781250,153,-1.0617124005,-2.0354575675,1.2129348019,0.4200287562,,, +9.5820312500,153,-1.1551236279,-2.0487511289,1.3958116447,-0.0206648922,,, +9.5839843750,153,-1.2584680864,-1.9943970884,1.4288773869,-0.3203485056,,, +9.5859375000,153,-1.3698112043,-1.8795791037,1.3015465783,-0.3813893684,,, +9.5878906250,153,-1.4870675928,-1.7156532008,1.0275124236,-0.1723575338,,, +9.5898437500,153,-1.6080375882,-1.5173484663,0.6426306085,0.2631504283,,, +9.5917968750,153,-1.7304458021,-1.3017326003,0.1993550475,0.8182588564,,, +9.5937500000,153,-1.8519810022,-1.0870144847,-0.2414078824,1.3519139247,,, +9.5957031250,153,-1.9703366267,-0.8912672816,-0.6197579896,1.7273642333,,, +9.5976562500,153,-2.0832512224,-0.7311611225,-0.8860996997,1.8494764235,,, +9.5996093750,153,-2.1885480990,-0.6207937774,-1.0088321426,1.6906603329,,, +9.6015625000,153,-2.2841735041,-0.5707008606,-0.9792332952,1.2982998436,,, +9.6035156250,153,-2.3682326519,-0.5871146102,-0.8127776346,0.7816541538,,, +9.6054687500,153,-2.4390229732,-0.6715229445,-0.5466822749,0.2818205700,,, +9.6074218750,153,-2.4950640056,-0.8205595579,-0.2340640061,-0.0670079340,,, +9.6093750000,153,-2.5351234000,-1.0262327344,0.0643824617,-0.1743714933,,, +9.6113281250,153,-2.5582385880,-1.2764769373,0.2898886465,-0.0183642400,,, +9.6132812500,153,-2.5637337307,-1.5559887231,0.3948182605,0.3483557131,,, +9.6152343750,153,-2.5512316522,-1.8472887022,0.3501408518,0.8130145016,,, +9.6171875000,153,-2.5206605491,-2.1319355040,0.1500087885,1.2336690693,,, +9.6191406250,153,-2.4722553577,-2.3918071044,-0.1872755832,1.4781702684,,, +9.6210937500,153,-2.4065537554,-2.6103601764,-0.6220535322,1.4604634181,,, +9.6230468750,153,-2.3243868667,-2.7737796532,-1.0994294613,1.1642767550,,, +9.6250000000,154,-2.2268648350,-2.8719383531,-1.5577634943,0.6477046181,,, +9.6269531250,154,-2.1153575147,-2.8990997561,-1.9382146621,0.0274282023,,, +9.6289062500,154,-1.9914706200,-2.8543149329,-2.1938485767,-0.5531027305,,, +9.6308593750,154,-1.8570177488,-2.7414859556,-2.2968913177,-0.9628081412,,, +9.6328125000,154,-1.7139887716,-2.5690913743,-2.2429999874,-1.1187109227,,, +9.6347656250,154,-1.5645151377,-2.3495929087,-2.0518850540,-1.0084733154,,, +9.6367187500,154,-1.4108327078,-2.0985647332,-1.7641878287,-0.6935617876,,, +9.6386718750,154,-1.2552427623,-1.8336060768,-1.4350996917,-0.2921748994,,, +9.6406250000,154,-1.1000718687,-1.5731129703,-1.1257171668,0.0533848802,,, +9.6425781250,154,-0.9476313104,-1.3349947917,-0.8934795856,0.2159509190,,, +9.6445312500,154,-0.8001767874,-1.1354251124,-0.7831789616,0.1185871609,,, +9.6464843750,154,-0.6598690941,-0.9877139514,-0.8199425584,-0.2440827182,,, +9.6484375000,154,-0.5287364638,-0.9013800796,-1.0052813617,-0.8041595969,,, +9.6503906250,154,-0.4086392369,-0.8814880645,-1.3168201214,-1.4388390302,,, +9.6523437500,154,-0.3012374737,-0.9282962831,-1.7117511895,-2.0038346507,,, +9.6542968750,154,-0.2079620775,-1.0372404467,-2.1334743587,-2.3726965906,,, +9.6562500000,154,-0.1299899339,-1.1992537828,-2.5203886562,-2.4712509539,,, +9.6582031250,154,-0.0682235013,-1.4014015421,-2.8154668466,-2.2977234561,,, +9.6601562500,154,-0.0232752099,-1.6277855809,-2.9751214699,-1.9230337856,,, +9.6621093750,154,0.0045430571,-1.8606559331,-2.9759815645,-1.4711817302,,, +9.6640625000,154,0.0152252174,-2.0816518510,-2.8185246312,-1.0851022302,,, +9.6660156250,154,0.0090708850,-2.2730857687,-2.5269981806,-0.8873488942,,, +9.6679687500,154,-0.0133200891,-2.4191806420,-2.1456431074,-0.9463827199,,, +9.6699218750,154,-0.0510583372,-2.5071743749,-1.7318071202,-1.2577063638,,, +9.6718750000,154,-0.1029807663,-2.5282143073,-1.3470208266,-1.7450154028,,, +9.6738281250,154,-0.1676711458,-2.4779793784,-1.0474263793,-2.2810517781,,, +9.6757812500,154,-0.2434851294,-2.3569865697,-0.8750494082,-2.7224446364,,, +9.6777343750,154,-0.3285792742,-2.1705602468,-0.8512736012,-2.9489900528,,, +9.6796875000,154,-0.4209435481,-1.9284665260,-0.9735341961,-2.8966043473,,, +9.6816406250,154,-0.5184367554,-1.6442381507,-1.2157452701,-2.5749193763,,, +9.6835937500,154,-0.6188242626,-1.3342369414,-1.5323941318,-2.0646971483,,, +9.6855468750,154,-0.7198173602,-1.0165191855,-1.8656649333,-1.4957718231,,, +9.6875000000,155,-0.8191135751,-0.7095830712,-2.1544817871,-1.0115638162,,, +9.6894531250,155,-0.9144372235,-0.4310854984,-2.3440626789,-0.7298907176,,, +9.6914062500,155,-1.0035794980,-0.1966177304,-2.3944958992,-0.7108144834,,, +9.6933593750,155,-1.0844373835,-0.0186252490,-2.2870029432,-0.9403357507,,, +9.6953125000,155,-1.1550507228,0.0944528794,-2.0269121656,-1.3344027434,,, +9.6972656250,155,-1.2136367817,0.1387651299,-1.6428797793,-1.7621344666,,, +9.6992187500,155,-1.2586217074,0.1153086293,-1.1824792726,-2.0818916931,,, +9.7011718750,155,-1.2886683318,0.0298520587,-0.7048459492,-2.1803079299,,, +9.7031250000,155,-1.3026998292,-0.1074742578,-0.2715219665,-2.0035812105,,, +9.7050781250,155,-1.2999188177,-0.2828924770,0.0630724767,-1.5724485480,,, +9.7070312500,155,-1.2798215664,-0.4799457582,0.2600579280,-0.9767369119,,, +9.7089843750,155,-1.2422070621,-0.6806536260,0.3020934640,-0.3509820047,,, +9.7109375000,155,-1.1871807747,-0.8667735918,0.1960195766,0.1622051615,,, +9.7128906250,155,-1.1151530569,-1.0210810374,-0.0282651893,0.4509859394,,, +9.7148437500,155,-1.0268322042,-1.1285780948,-0.3225185821,0.4647111465,,, +9.7167968750,155,-0.9232122983,-1.1775472057,-0.6277254014,0.2275733026,,, +9.7187500000,155,-0.8055560461,-1.1603758742,-0.8833451942,-0.1682455908,,, +9.7207031250,155,-0.6753729137,-1.0740950849,-1.0367962324,-0.5880507399,,, +9.7226562500,155,-0.5343929396,-0.9205938224,-1.0516983178,-0.8917514092,,, +9.7246093750,155,-0.3845366846,-0.7064947176,-0.9135902893,-0.9724435130,,, +9.7265625000,155,-0.2278818444,-0.4426994752,-0.6322314431,-0.7858819380,,, +9.7285156250,155,-0.0666271104,-0.1436357659,-0.2401281654,-0.3627635757,,, +9.7304687500,155,0.0969460905,0.1737419167,0.2124849725,0.1995467338,,, +9.7324218750,155,0.2605133052,0.4911277756,0.6654281535,0.7635808970,,, +9.7343750000,155,0.4217475192,0.7901346489,1.0579112598,1.1893433611,,, +9.7363281250,155,0.5783596679,1.0535698252,1.3379670446,1.3726004664,,, +9.7382812500,155,0.7281384848,1.2666277824,1.4705134368,1.2733900574,,, +9.7402343750,155,0.8689889898,1.4179166915,1.4427893878,0.9269381857,,, +9.7421875000,155,0.9989689433,1.5002471151,1.2663177322,0.4339912209,,, +9.7441406250,155,1.1163226278,1.5111279160,0.9750894571,-0.0667869032,,, +9.7460937500,155,1.2195113658,1.4529348063,0.6202522836,-0.4367873778,,, +9.7480468750,155,1.3072402405,1.3327397936,0.2621309230,-0.5753923352,,, +9.7500000000,156,1.3784805497,1.1618134295,-0.0391780520,-0.4474772891,,, +9.7519531250,156,1.4324876016,0.9548345795,-0.2331717826,-0.0929433701,,, +9.7539062500,156,1.4688135405,0.7288628288,-0.2868083968,0.3843321889,,, +9.7558593750,156,1.4873149775,0.5021451893,-0.1896506138,0.8450978416,,, +9.7578125000,156,1.4881552932,0.2928403286,0.0445154361,1.1530415932,,, +9.7597656250,156,1.4718015718,0.1177492915,0.3798382667,1.2123147963,,, +9.7617187500,156,1.4390162213,-0.0088587702,0.7639997708,0.9939801225,,, +9.7636718750,156,1.3908434247,-0.0762439670,1.1363825136,0.5441333744,,, +9.7656250000,156,1.3285906621,-0.0779465866,1.4375333759,-0.0285286599,,, +9.7675781250,156,1.2538056256,-0.0122391871,1.6184494087,-0.5822889813,,, +9.7695312500,156,1.1682489313,0.1177516619,1.6482394315,-0.9810346093,,, +9.7714843750,156,1.0738631074,0.3042624792,1.5189678762,-1.1313406127,,, +9.7734375000,156,0.9727384009,0.5354336784,1.2469262411,-1.0078524487,,, +9.7753906250,156,0.8670760013,0.7961363666,0.8701339234,-0.6600122232,,, +9.7773437500,156,0.7591493261,1.0690274817,0.4424574771,-0.1982875533,,, +9.7792968750,156,0.6512640459,1.3357596872,0.0252640252,0.2363205815,,, +9.7812500000,156,0.5457175484,1.5782616551,-0.3220913834,0.5111319261,,, +9.7832031250,156,0.4447585527,1.7799994538,-0.5514630810,0.5383522060,,, +9.7851562500,156,0.3505475793,1.9271310783,-0.6333644806,0.2993261559,,, +9.7871093750,156,0.2651189698,2.0094736085,-0.5615101069,-0.1501705624,,, +9.7890625000,156,0.1903451196,2.0212155477,-0.3537427896,-0.6950526556,,, +9.7910156250,156,0.1279035521,1.9613246617,-0.0492018853,-1.1923170322,,, +9.7929687500,156,0.0792474091,1.8336228720,0.2978261227,-1.5101030853,,, +9.7949218750,156,0.0455798750,1.6465229729,0.6264165545,-1.5637174908,,, +9.7968750000,156,0.0278329827,1.4124455238,0.8785493938,-1.3387513475,,, +9.7988281250,156,0.0266511727,1.1469565698,1.0081994369,-0.8949549106,,, +9.8007812500,156,0.0423798922,0.8676863106,0.9885576027,-0.3498087445,,, +9.8027343750,156,0.0750594354,0.5931041123,0.8162583623,0.1537054750,,, +9.8046875000,156,0.1244241318,0.3412352724,0.5119545610,0.4863010771,,, +9.8066406250,156,0.1899068967,0.1284090116,0.1171498282,0.5678067842,,, +9.8085937500,156,0.2706490657,-0.0318750133,-0.3122183244,0.3891037449,,, +9.8105468750,156,0.3655153395,-0.1298826474,-0.7144455082,0.0145671762,,, +9.8125000000,157,0.4731135773,-0.1603183729,-1.0316278830,-0.4356561148,,, +9.8144531250,157,0.5918190941,-0.1226887163,-1.2186400617,-0.8186764775,,, +9.8164062500,157,0.7198030344,-0.0213305997,-1.2501253628,-1.0081433968,,, +9.8183593750,157,0.8550643268,0.1348973265,-1.1244098513,-0.9290136571,,, +9.8203125000,157,0.9954646592,0.3332388282,-0.8637307301,-0.5782755686,,, +9.8222656250,157,1.1387658630,0.5579361730,-0.5107436886,-0.0259479864,,, +9.8242187500,157,1.2826690512,0.7913356517,-0.1218533675,0.6039212138,,, +9.8261718750,157,1.4248548252,1.0151254291,0.2415941003,1.1670511299,,, +9.8281250000,157,1.5630238465,1.2116193883,0.5228845391,1.5382576306,,, +9.8300781250,157,1.6949370627,1.3649974256,0.6787839495,1.6455397462,,, +9.8320312500,157,1.8184548833,1.4624156888,0.6862832550,1.4895825958,,, +9.8339843750,157,1.9315746201,1.4949093226,0.5461889781,1.1433337551,,, +9.8359375000,157,2.0324655359,1.4580247514,0.2830005373,0.7317712934,,, +9.8378906250,157,2.1195008875,1.3521373925,-0.0589067506,0.3974106139,,, +9.8398437500,157,2.1912864033,1.1824326271,-0.4221984468,0.2610058084,,, +9.8417968750,157,2.2466846955,0.9585513379,-0.7455202040,0.3882182710,,, +9.8437500000,157,2.2848351796,0.6939247154,-0.9730670491,0.7713898465,,, +9.8457031250,157,2.3051691540,0.4048447015,-1.0632922088,1.3314180385,,, +9.8476562500,157,2.3074197727,0.1093348739,-0.9953989529,1.9392213705,,, +9.8496093750,157,2.2916267394,-0.1740995081,-0.7726042174,2.4509138344,,, +9.8515625000,157,2.2581356393,-0.4277551494,-0.4216655598,2.7470500108,,, +9.8535156250,157,2.2075919201,-0.6359585610,0.0112550103,2.7651866773,,, +9.8554687500,157,2.1409296282,-0.7861524911,0.4677462541,2.5168383380,,, +9.8574218750,157,2.0593550974,-0.8697652026,0.8862076884,2.0841811135,,, +9.8593750000,157,1.9643258748,-0.8828019935,1.2114033827,1.5974096386,,, +9.8613281250,157,1.8575252542,-0.8261177268,1.4030217215,1.1989538660,,, +9.8632812500,157,1.7408328612,-0.7053513802,1.4419081221,1.0043638006,,, +9.8652343750,157,1.6162918065,-0.5305271941,1.3330001646,1.0705832102,,, +9.8671875000,157,1.4860729821,-0.3153502432,1.1045082171,1.3803080694,,, +9.8691406250,157,1.3524371249,-0.0762455684,0.8034694343,1.8467169384,,, +9.8710937500,157,1.2176953126,0.1687921148,0.4883678847,2.3372769425,,, +9.8730468750,157,1.0841685833,0.4014579069,0.2199705338,2.7101007551,,, +9.8750000000,158,0.9541473858,0.6044175730,0.0518067079,2.8528899270,,, +9.8769531250,158,0.8298515710,0.7625204221,0.0217741996,2.7137908625,,, +9.8789062500,158,0.7133916237,0.8638596287,0.1461796962,2.3157060380,,, +9.8808593750,158,0.6067318151,0.9006060486,0.4171420593,1.7501372925,,, +9.8828125000,158,0.5116559200,0.8695573748,0.8037632008,1.1522474739,,, +9.8847656250,158,0.4297360995,0.7723643318,1.2568844769,0.6639740356,,, +9.8867187500,158,0.3623054934,0.6154181277,1.7166880567,0.3953026177,,, +9.8886718750,158,0.3104350036,0.4094070061,2.1219595986,0.3943127850,,, +9.8906250000,158,0.2749146720,0.1685728162,2.4195698031,0.6342037775,,, +9.8925781250,158,0.2562399831,-0.0902805643,2.5726983157,1.0208542919,,, +9.8945312500,158,0.2546033265,-0.3489578081,2.5665193283,1.4188424511,,, +9.8964843750,158,0.2698907724,-0.5891400985,2.4104635733,1.6887926461,,, +9.8984375000,158,0.3016842145,-0.7936620490,2.1367046385,1.7258115140,,, +9.9003906250,158,0.3492688431,-0.9477085457,1.7951055997,1.4884767657,,, +9.9023437500,158,0.4116458180,-1.0398480494,1.4454132798,1.0104317304,,, +9.9042968750,158,0.4875499178,-1.0628303031,1.1479161258,0.3914057257,,, +9.9062500000,158,0.5754718584,-1.0140928193,0.9540209760,-0.2298808639,,, +9.9082031250,158,0.6736848887,-0.8959408225,0.8982166123,-0.7135030267,,, +9.9101562500,158,0.7802751969,-0.7153880996,0.9926759685,-0.9564550344,,, +9.9121093750,158,0.8931755968,-0.4836698517,1.2253378696,-0.9206652161,,, +9.9140625000,158,1.0102019029,-0.2154615131,1.5617671985,-0.6432255093,,, +9.9160156250,158,1.1290913573,0.0721419933,1.9505038584,-0.2260339927,,, +9.9179687500,158,1.2475424359,0.3608153894,2.3310674804,0.1923092340,,, +9.9199218750,158,1.3632553360,0.6322776489,2.6433711598,0.4746487715,,, +9.9218750000,158,1.4739724379,0.8695632039,2.8370780189,0.5230069687,,, +9.9238281250,158,1.5775180297,1.0582011127,2.8794432786,0.3055605620,,, +9.9257812500,158,1.6718366010,1.1872199703,2.7604203916,-0.1345336412,,, +9.9277343750,158,1.7550290351,1.2499084969,2.4942359016,-0.6908837661,,, +9.9296875000,158,1.8253860646,1.2442787750,2.1171876918,-1.2229602888,,, +9.9316406250,158,1.8814184055,1.1731998434,1.6820094880,-1.5945716196,,, +9.9335937500,158,1.9218830419,1.0441923438,1.2496792872,-1.7111731254,,, +9.9355468750,158,1.9458052003,0.8688985520,0.8799474844,-1.5457843752,,, +9.9375000000,159,1.9524956297,0.6622647617,0.6220598646,-1.1464113302,,, +9.9394531250,159,1.9415628833,0.4414930516,0.5071202568,-0.6229389326,,, +9.9414062500,159,1.9129203886,0.2248355428,0.5432822436,-0.1170858921,,, +9.9433593750,159,1.8667881795,0.0303152434,0.7145186609,0.2363445864,,, +9.9453125000,159,1.8036892625,-0.1255373057,0.9831603488,0.3462990594,,, +9.9472656250,159,1.7244406790,-0.2288434726,1.2958085168,0.1902990410,,, +9.9492187500,159,1.6301394195,-0.2693511952,1.5916996149,-0.1795454085,,, +9.9511718750,159,1.5221434385,-0.2411568794,1.8122195988,-0.6509803966,,, +9.9531250000,159,1.4020480995,-0.1431241791,1.9100854414,-1.0825507521,,, +9.9550781250,159,1.2716584652,0.0210295627,1.8567635599,-1.3425582664,,, +9.9570312500,159,1.1329579158,0.2429852548,1.6469694301,-1.3453564922,,, +9.9589843750,159,0.9880736457,0.5103948292,1.2995472703,-1.0750328420,,, +9.9609375000,159,0.8392396431,0.8077349196,0.8545924961,-0.5899854131,,, +9.9628906250,159,0.6887577989,1.1173819336,0.3672648497,-0.0071380836,,, +9.9648437500,159,0.5389578281,1.4208335675,-0.1007444512,0.5298820776,,, +9.9667968750,159,0.3921567034,1.6999916019,-0.4907628003,0.8898856168,,, +9.9687500000,159,0.2506183117,1.9384165404,-0.7562163452,0.9898545489,,, +9.9707031250,159,0.1165140406,2.1224666198,-0.8698261968,0.8174778134,,, +9.9726562500,159,-0.0081150163,2.2422417819,-0.8278001479,0.4343141352,,, +9.9746093750,159,-0.1213935729,2.2922667974,-0.6503673045,-0.0412825157,,, +9.9765625000,159,-0.2216447614,2.2718659228,-0.3785726378,-0.4667932860,,, +9.9785156250,159,-0.3074192695,2.1852029804,-0.0678309948,-0.7147757497,,, +9.9804687500,159,-0.3775204941,2.0409840838,0.2207551730,-0.7079595467,,, +9.9824218750,159,-0.4310252708,1.8518437535,0.4299617975,-0.4405760594,,, +9.9843750000,159,-0.4672998169,1.6334572485,0.5154027052,0.0199251851,,, +9.9863281250,159,-0.4860106086,1.4034410273,0.4524869296,0.5512451279,,, +9.9882812500,159,-0.4871300015,1.1801180295,0.2402899714,1.0096556847,,, +9.9902343750,159,-0.4709364976,0.9812338922,-0.0982641650,1.2693135661,,, +9.9921875000,159,-0.4380096524,0.8227136387,-0.5199386955,1.2566934666,,, +9.9941406250,159,-0.3892197130,0.7175455526,-0.9678870025,0.9707041145,,, +9.9960937500,159,-0.3257121680,0.6748700821,-1.3804789351,0.4829743692,,, +9.9980468750,159,-0.2488874792,0.6993373207,-1.7008758515,-0.0817688552,,, +10.0000000000,160,-0.1603763522,0.7907778809,-1.8858631541,-0.5798530395,,, +10.0019531250,160,-0.0620109764,0.9442101236,-1.9125646967,-0.8879829459,,, +10.0039062500,160,0.0442072594,1.1501832513,-1.7819933317,-0.9369571530,,, +10.0058593750,160,0.1561430129,1.3954323474,-1.5188846344,-0.7305381809,,, +10.0078125000,160,0.2715645758,1.6637996964,-1.1678397323,-0.3443053033,,, +10.0097656250,160,0.3881831466,1.9373581455,-0.7863780271,0.0951945281,,, +10.0117187500,160,0.5036931004,2.1976581802,-0.4359818717,0.4452823433,,, +10.0136718750,160,0.6158125495,2.4270117593,-0.1725280102,0.5864206251,,, +10.0156250000,160,0.7223234865,2.6097233900,-0.0375960826,0.4551593926,,, +10.0175781250,160,0.8211108043,2.7331826021,-0.0520078663,0.0617237046,,, +10.0195312500,160,0.9101995123,2.7887416438,-0.2126034598,-0.5125794130,,, +10.0214843750,160,0.9877894946,2.7723172008,-0.4927564204,-1.1374258253,,, +10.0234375000,160,1.0522872035,2.6846741809,-0.8465474904,-1.6689656091,,, +10.0253906250,160,1.1023337322,2.5313717771,-1.2159466805,-1.9890157887,,, +10.0273437500,160,1.1368287746,2.3223755747,-1.5398848951,-2.0372150551,,, +10.0292968750,160,1.1549500544,2.0713627489,-1.7638019630,-1.8273299746,,, +10.0312500000,160,1.1561678807,1.7947688072,-1.8481837142,-1.4432458143,,, +10.0332031250,160,1.1402545774,1.5106423477,-1.7747581969,-1.0157429414,,, +10.0351562500,160,1.1072886197,1.2373876929,-1.5493857084,-0.6864258274,,, +10.0371093750,160,1.0576534060,0.9924830786,-1.2011922652,-0.5686927292,,, +10.0390625000,160,0.9920306864,0.7912637776,-0.7780812244,-0.7164451174,,, +10.0410156250,160,0.9113887623,0.6458550124,-0.3393218835,-1.1091146072,,, +10.0429687500,160,0.8169656645,0.5643290625,0.0536308461,-1.6571129105,,, +10.0449218750,160,0.7102476035,0.5501453386,0.3466560860,-2.2262128709,,, +10.0468750000,160,0.5929430700,0.6019124634,0.5013435057,-2.6741800721,,, +10.0488281250,160,0.4669530383,0.7134889420,0.5009223057,-2.8896168446,,, +10.0507812500,160,0.3343377946,0.8744153941,0.3528194885,-2.8223739831,,, +10.0527343750,160,0.1972809710,1.0706481990,0.0874492444,-2.4971963531,,, +10.0546875000,160,0.0580514151,1.2855433841,-0.2465776995,-2.0068634656,,, +10.0566406250,160,-0.0810364381,1.5010221380,-0.5900783083,-1.4867057238,,, +10.0585937500,160,-0.2176629965,1.6988366614,-0.8825672473,-1.0774812139,,, +10.0605468750,160,-0.3495440380,1.8618480744,-1.0717285386,-0.8867877342,,, +10.0625000000,161,-0.4744706216,1.9752272539,-1.1216133296,-0.9595859963,,, +10.0644531250,161,-0.5903476870,2.0274948520,-1.0182866641,-1.2659126255,,, +10.0664062500,161,-0.6952306649,2.0113279575,-0.7720434840,-1.7091501711,,, +10.0683593750,161,-0.7873594569,1.9240771363,-0.4158484623,-2.1525870721,,, +10.0703125000,161,-0.8651891910,1.7679577817,-0.0002424371,-2.4569875980,,, +10.0722656250,161,-0.9274172146,1.5499024164,0.4144914242,-2.5188740818,,, +10.0742187500,161,-0.9730058499,1.2810842306,0.7676817772,-2.2990283626,,, +10.0761718750,161,-1.0012005167,0.9761450662,1.0076868008,-1.8333997970,,, +10.0781250000,161,-1.0115429027,0.6521816669,1.0999087654,-1.2234288665,,, +10.0800781250,161,-1.0038789515,0.3275608684,1.0321573165,-0.6084368213,,, +10.0820312500,161,-0.9783615294,0.0206463353,0.8165262518,-0.1276468284,,, +10.0839843750,161,-0.9354477222,-0.2514743855,0.4874915973,0.1177563415,,, +10.0859375000,161,-0.8758908121,-0.4741737440,0.0965273186,0.0921317176,,, +10.0878906250,161,-0.8007270728,-0.6362964599,-0.2959226205,-0.1650837636,,, +10.0898437500,161,-0.7112576149,-0.7309296190,-0.6298653955,-0.5504233711,,, +10.0917968750,161,-0.6090256001,-0.7558769068,-0.8551062213,-0.9249908196,,, +10.0937500000,161,-0.4957892223,-0.7138039286,-0.9390651675,-1.1527720008,,, +10.0957031250,161,-0.3734909291,-0.6120444999,-0.8718463791,-1.1381559336,,, +10.0976562500,161,-0.2442234228,-0.4620814304,-0.6677701664,-0.8523793988,,, +10.0996093750,161,-0.1101930351,-0.2787380281,-0.3631293758,-0.3416454378,,, +10.1015625000,161,0.0263188808,-0.0791367184,-0.0105195640,0.2853114075,,, +10.1035156250,161,0.1629958681,0.1185025871,0.3293738381,0.8868071429,,, +10.1054687500,161,0.2975268915,0.2961405585,0.5972520729,1.3268320366,,, +10.1074218750,161,0.4276467635,0.4371838157,0.7444671707,1.5121322307,,, +10.1093750000,161,0.5511757620,0.5276493389,0.7406305550,1.4175879977,,, +10.1113281250,161,0.6660577451,0.5571467092,0.5783808967,1.0929347950,,, +10.1132812500,161,0.7703960980,0.5196096682,0.2745684238,0.6489864943,,, +10.1152343750,161,0.8624868805,0.4137259673,-0.1323289722,0.2271378409,,, +10.1171875000,161,0.9408485953,0.2430355167,-0.5881555836,-0.0394943213,,, +10.1191406250,161,1.0042480566,0.0156899754,-1.0314671937,-0.0626401414,,, +10.1210937500,161,1.0517219050,-0.2561094667,-1.4030533979,0.1768670166,,, +10.1230468750,161,1.0825933930,-0.5569569245,-1.6551100377,0.6237956227,,, +10.1250000000,162,1.0964841466,-0.8693103695,-1.7586333483,1.1636337797,,, +10.1269531250,162,1.0933206971,-1.1747093979,-1.7078844112,1.6539765230,,, +10.1289062500,162,1.0733356694,-1.4550573074,-1.5212288254,1.9635801813,,, +10.1308593750,162,1.0370636052,-1.6938780914,-1.2382210941,2.0083798415,,, +10.1328125000,162,0.9853314954,-1.8774607059,-0.9133881366,1.7745980781,,, +10.1347656250,162,0.9192441856,-1.9958108276,-0.6076804657,1.3226108070,,, +10.1367187500,162,0.8401649133,-2.0433437411,-0.3789228468,0.7705098253,,, +10.1386718750,162,0.7496913143,-2.0192700486,-0.2727520905,0.2618659464,,, +10.1406250000,162,0.6496273213,-1.9276473119,-0.3154537568,-0.0734733932,,, +10.1425781250,162,0.5419514450,-1.7770940333,-0.5098137804,-0.1548092942,,, +10.1445312500,162,0.4287819942,-1.5801859265,-0.8346314317,0.0274680623,,, +10.1464843750,162,0.3123398436,-1.3525765830,-1.2479697524,0.4094350144,,, +10.1484375000,162,0.1949094008,-1.1119038575,-1.6936374636,0.8713542617,,, +10.1503906250,162,0.0787984574,-0.8765582381,-2.1098930190,1.2707005357,,, +10.1523437500,162,-0.0337023740,-0.6643990883,-2.4390153530,1.4814387382,,, +10.1542968750,162,-0.1403599263,-0.4915082859,-2.6362508734,1.4287875047,,, +10.1562500000,162,-0.2390377418,-0.3710681710,-2.6767433848,1.1099384223,,, +10.1582031250,162,-0.3277336475,-0.3124420491,-2.5593677883,0.5950502353,,, +10.1601562500,162,-0.4046149823,-0.3205213687,-2.3068706392,0.0082434059,,, +10.1621093750,162,-0.4680508598,-0.3953850950,-1.9622958548,-0.5061982863,,, +10.1640625000,162,-0.5166409019,-0.5322950315,-1.5822524582,-0.8231580804,,, +10.1660156250,162,-0.5492399398,-0.7220274131,-1.2280730901,-0.8707712848,,, +10.1679687500,162,-0.5649782489,-0.9515176435,-0.9562405336,-0.6499253262,,, +10.1699218750,162,-0.5632769653,-1.2047732146,-0.8095734804,-0.2338322956,,, +10.1718750000,162,-0.5438584112,-1.4639911400,-0.8105445002,0.2522070858,,, +10.1738281250,162,-0.5067511504,-1.7108019765,-0.9577710440,0.6653003508,,, +10.1757812500,162,-0.4522896846,-1.9275536759,-1.2262260819,0.8842649578,,, +10.1777343750,162,-0.3811087947,-2.0985457344,-1.5711355993,0.8429619965,,, +10.1796875000,162,-0.2941326282,-2.2111275680,-1.9349559051,0.5485249818,,, +10.1816406250,162,-0.1925587210,-2.2565845147,-2.2563439914,0.0794867727,,, +10.1835937500,162,-0.0778372363,-2.2307496672,-2.4797237322,-0.4356828390,,, +10.1855468750,162,0.0483542191,-2.1342988636,-2.5639578826,-0.8537472820,,, +10.1875000000,163,0.1841397579,-1.9727082529,-2.4887750973,-1.0559424303,,, +10.1894531250,163,0.3274778457,-1.7558773833,-2.2579508322,-0.9805308135,,, +10.1914062500,163,0.4761968321,-1.4974440852,-1.8987465755,-0.6397486808,,, +10.1933593750,163,0.6280327591,-1.2138389100,-1.4576946184,-0.1165010304,,, +10.1953125000,163,0.7806687837,-0.9231450506,-0.9933847588,0.4582900150,,, +10.1972656250,163,0.9317755245,-0.6438432294,-0.5673762794,0.9414759710,,, +10.1992187500,163,1.0790516273,-0.3935290636,-0.2346505218,1.2168035282,,, +10.2011718750,163,1.2202638378,-0.1876923348,-0.0350909172,1.2266458242,,, +10.2031250000,163,1.3532858804,-0.0386432739,0.0126827108,0.9876480388,,, +10.2050781250,163,1.4761354642,0.0453392814,-0.0858345361,0.5860006729,,, +10.2070312500,163,1.5870087647,0.0605784701,-0.3019395609,0.1536374657,,, +10.2089843750,163,1.6843117820,0.0082489599,-0.5882449344,-0.1681169661,,, +10.2109375000,163,1.7666880223,-0.1057119178,-0.8861144434,-0.2674849043,,, +10.2128906250,163,1.8330420216,-0.2710252365,-1.1348521261,-0.0930851603,,, +10.2148437500,163,1.8825582973,-0.4737943681,-1.2812132740,0.3317623742,,, +10.2167968750,163,1.9147153978,-0.6974812033,-1.2877557259,0.9151997580,,, +10.2187500000,163,1.9292948033,-0.9240666096,-1.1387304061,1.5217746183,,, +10.2207031250,163,1.9263845216,-1.1353141846,-0.8425933318,2.0093302071,,, +10.2226562500,163,1.9063773177,-1.3140491636,-0.4307475365,2.2677335992,,, +10.2246093750,163,1.8699636071,-1.4453632814,0.0472894322,2.2488299577,,, +10.2265625000,163,1.8181191368,-1.5176615528,0.5315400447,1.9794154367,,, +10.2285156250,163,1.7520876719,-1.5234779585,0.9608514075,1.5536753345,,, +10.2304687500,163,1.6733589894,-1.4600031402,1.2823641236,1.1071620032,,, +10.2324218750,163,1.5836425644,-1.3292872897,1.4596908478,0.7794463425,,, +10.2343750000,163,1.4848374116,-1.1381040672,1.4785309550,0.6756808335,,, +10.2363281250,163,1.3789986081,-0.8974850223,1.3488470699,0.8376102695,,, +10.2382812500,163,1.2683010852,-0.6219569676,1.1032647019,1.2319768769,,, +10.2402343750,163,1.1550013223,-0.3285354702,0.7919444913,1.7594990935,,, +10.2421875000,163,1.0413976154,-0.0355446316,0.4747259684,2.2819644877,,, +10.2441406250,163,0.9297896137,0.2386545579,0.2117666890,2.6600125894,,, +10.2460937500,163,0.8224378352,0.4769386279,0.0541349475,2.7912534339,,, +10.2480468750,163,0.7215238689,0.6646099478,0.0358214847,2.6382754233,,, +10.2500000000,164,0.6291119609,0.7904161035,0.1684145729,2.2388669423,,, +10.2519531250,164,0.5471126577,0.8473292618,0.4392680077,1.6956506395,,, +10.2539062500,164,0.4772491425,0.8330311856,0.8134474808,1.1479714499,,, +10.2558593750,164,0.4210268548,0.7500700922,1.2391522829,0.7337429392,,, +10.2578125000,164,0.3797069255,0.6056784261,1.6557679674,0.5517084694,,, +10.2597656250,164,0.3542838912,0.4112642660,2.0032957985,0.6344597867,,, +10.2617187500,164,0.3454680810,0.1816118398,2.2316903445,0.9396071458,,, +10.2636718750,164,0.3536729813,-0.0661530898,2.3086508639,1.3615201005,,, +10.2656250000,164,0.3790078014,-0.3137608160,2.2246529401,1.7604200979,,, +10.2675781250,164,0.4212753706,-0.5430747329,1.9944366467,2.0008502306,,, +10.2695312500,164,0.4799754029,-0.7373587768,1.6547194153,1.9889773372,,, +10.2714843750,164,0.5543130720,-0.8824468734,1.2584897837,1.6985015061,,, +10.2734375000,164,0.6432127477,-0.9677328371,0.8667707242,1.1780702681,,, +10.2753906250,164,0.7453366529,-0.9869116874,0.5391353588,0.5381636509,,, +10.2773437500,164,0.8591081133,-0.9384206846,0.3244521726,-0.0789574194,,, +10.2792968750,164,0.9827389950,-0.8255493271,0.2533010703,-0.5380051432,,, +10.2812500000,164,1.1142608480,-0.6562106359,0.3332413593,-0.7475020691,,, +10.2832031250,164,1.2515592109,-0.4423896753,0.5476685258,-0.6846076730,,, +10.2851562500,164,1.3924104766,-0.1993077643,0.8584376774,-0.4011322418,,, +10.2871093750,164,1.5345206732,0.0556393388,1.2118448332,-0.0090920169,,, +10.2890625000,164,1.6755654806,0.3040952343,1.5470342265,0.3502333297,,, +10.2910156250,164,1.8132307835,0.5280240177,1.8055219045,0.5452583264,,, +10.2929687500,164,1.9452530501,0.7109694146,1.9403520332,0.4903852284,,, +10.2949218750,164,2.0694588285,0.8392041075,1.9234595069,0.1696844440,,, +10.2968750000,164,2.1838026720,0.9026891047,1.7500918353,-0.3585301736,,, +10.2988281250,164,2.2864028262,0.8957762454,1.4396013022,-0.9774869592,,, +10.3007812500,164,2.3755740553,0.8176048487,1.0324837341,-1.5437783419,,, +10.3027343750,164,2.4498570322,0.6721648396,0.5841248224,-1.9264991780,,, +10.3046875000,164,2.5080437773,0.4680219431,0.1562277535,-2.0429762990,,, +10.3066406250,164,2.5491987017,0.2177241023,-0.1927429518,-1.8812981463,,, +10.3085937500,164,2.5726748855,-0.0630694974,-0.4166132570,-1.5034708863,,, +10.3105468750,164,2.5781253067,-0.3566760696,-0.4886375104,-1.0283369186,,, +10.3125000000,165,2.5655088240,-0.6446177006,-0.4056109488,-0.5989380129,,, +10.3144531250,165,2.5350908088,-0.9089049998,-0.1883165446,-0.3432683742,,, +10.3164062500,165,2.4874384155,-1.1332864255,0.1217631228,-0.3391743502,,, +10.3183593750,165,2.4234105726,-1.3043761786,0.4689565568,-0.5930208197,,, +10.3203125000,165,2.3441428707,-1.4125820254,0.7921222543,-1.0379710589,,, +10.3222656250,165,2.2510276110,-1.4527683614,1.0342175689,-1.5523512058,,, +10.3242187500,165,2.1456893647,-1.4246082938,1.1512268791,-1.9930656598,,, +10.3261718750,165,2.0299564702,-1.3326002037,1.1190582225,-2.2349045381,,, +10.3281250000,165,1.9058289687,-1.1857476481,0.9373339901,-2.2049692879,,, +10.3300781250,165,1.7754435381,-0.9969249381,0.6294850553,-1.9027803320,,, +10.3320312500,165,1.6410360403,-0.7819726488,0.2391334886,-1.4005545788,,, +10.3339843750,165,1.5049023373,-0.5585861497,-0.1766729018,-0.8235753113,,, +10.3359375000,165,1.3693580623,-0.3450746779,-0.5563206046,-0.3160328995,,, +10.3378906250,165,1.2366980505,-0.1590775040,-0.8432051511,-0.0016966614,,, +10.3398437500,165,1.1091561392,-0.0163267336,-0.9945293756,0.0498052962,,, +10.3417968750,165,0.9888660420,0.0704569656,-0.9879549107,-0.1581414954,,, +10.3437500000,165,0.8778239820,0.0924586898,-0.8250709913,-0.5502835241,,, +10.3457031250,165,0.7778537378,0.0453912959,-0.5311403392,-1.0003469678,,, +10.3476562500,165,0.6905747147,-0.0701983203,-0.1511617461,-1.3658715355,,, +10.3496093750,165,0.6173736005,-0.2489600409,0.2571373570,-1.5274814161,,, +10.3515625000,165,0.5593801014,-0.4811063049,0.6322869043,-1.4218281929,,, +10.3535156250,165,0.5174471839,-0.7530873600,0.9186391826,-1.0591749173,,, +10.3554687500,165,0.4921361672,-1.0485289177,1.0750230508,-0.5207999679,,, +10.3574218750,165,0.4837069291,-1.3493668411,1.0811395201,0.0630698344,,, +10.3593750000,165,0.4921133950,-1.6370997586,0.9407026366,0.5487509652,,, +10.3613281250,165,0.5170043897,-1.8940722712,0.6808365647,0.8182944596,,, +10.3632812500,165,0.5577298380,-2.1046992865,0.3478229076,0.8116373312,,, +10.3652343750,165,0.6133522032,-2.2565461201,-0.0001392149,0.5429040655,,, +10.3671875000,165,0.6826629660,-2.3411890612,-0.3020325095,0.0963919536,,, +10.3691406250,165,0.7642038531,-2.3547964076,-0.5035628241,-0.3966580726,,, +10.3710937500,165,0.8562924444,-2.2983894673,-0.5656561262,-0.7941374920,,, +10.3730468750,165,0.9570517108,-2.1777653425,-0.4705874856,-0.9821047520,,, diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-stimulation-timeout/sinus-oscillator-1s.csv b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-stimulation-timeout/sinus-oscillator-1s.csv new file mode 100755 index 0000000..4455f77 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-stimulation-timeout/sinus-oscillator-1s.csv @@ -0,0 +1,33 @@ +Time:32Hz,Epoch,Channel 0,Event Id,Event Date,Event Duration +0.0000000000,0,0.0000000000,,, +0.0312500000,0,1.3687340000,,, +0.0625000000,0,0.0834510000,,, +0.0937500000,0,1.3965070000,,, +0.1250000000,0,2.3460350000,,, +0.1562500000,0,0.6652580000,,, +0.1875000000,0,1.6342770000,,, +0.2187500000,0,2.0374040000,,, +0.2500000000,0,0.0223670000,,, +0.2812500000,0,0.8587780000,,, +0.3125000000,0,1.0605200000,,, +0.3437500000,0,-0.8527920000,,, +0.3750000000,0,0.2862990000,,, +0.4062500000,0,0.6745720000,,, +0.4375000000,0,-0.8460420000,,, +0.4687500000,0,0.7209290000,,, +0.5000000000,0,1.2564360000,,, +0.5312500000,0,-0.0631010000,,, +0.5625000000,0,1.5912610000,,, +0.5937500000,0,1.8564560000,,, +0.6250000000,0,0.3100240000,,, +0.6562500000,0,1.6531540000,,, +0.6875000000,0,1.3612670000,,, +0.7187500000,0,-0.5404880000,,, +0.7500000000,0,0.5189550000,,, +0.7812500000,0,-0.1244990000,,, +0.8125000000,0,-2.0250000000,,, +0.8437500000,0,-0.8135360000,,, +0.8750000000,0,-1.3302670000,,, +0.9062500000,0,-2.7774420000,,, +0.9375000000,0,-1.0731870000,,, +0.9687500000,0,-1.2560590000,,, diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-stimulation-timeout/timeout.xml.in b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-stimulation-timeout/timeout.xml.in new file mode 100755 index 0000000..3de4876 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/openvibe-stimulation-timeout/timeout.xml.in @@ -0,0 +1,494 @@ + + 1 + OpenVIBE + 0.0.0 + + + + + + (0x0000050d, 0x000070dd) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + @CMAKE_CURRENT_SOURCE_DIR@/reference.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 384 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xad100179, 0xa3c984ab) + 97 + + + (0xc67a01dc, 0x28ce06c1) + + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x0000060d, 0x000035cf) + CSV File Writer + (0x428375e8, 0x325f2db9) + + + (0x5ba36127, 0x195feae1) + Input stream + + + (0x6f752dd0, 0x082a321e) + Stimulations stream + + + + + (0x330306dd, 0x74a95f98) + Filename + record-[$core{date}-$core{time}].csv + @OVT_TEST_TEMPORARY_DIR@/test-timeout.csv + false + + + (0x007deef9, 0x2f3e95c6) + Precision + 10 + 10 + false + + + (0x2cdb2f0b, 0x12f231ea) + Append data + false + false + false + + + (0x2cdb2f0b, 0x12f231ea) + Only last matrix + false + false + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 464 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 448 + + + (0x4e7b798a, 0x183beafb) + (0xee4b6d30, 0x788aed29) + + + (0x527ad68d, 0x16d746a0) + + + + (0xad100179, 0xa3c984ab) + 94 + + + (0xce18836a, 0x9c0eb403) + 4 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x00002c23, 0x00003a2b) + CSV File Reader + (0x336a3d9a, 0x753f1ba4) + + + (0x5ba36127, 0x195feae1) + Output stream + + + (0x6f752dd0, 0x082a321e) + Output stimulation + + + + + (0x330306dd, 0x74a95f98) + Filename + + @CMAKE_CURRENT_SOURCE_DIR@/sinus-oscillator-1s.csv + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 160 + + + (0x1fa963f5, 0x1a638cd4) + 37 + + + (0x207c9054, 0x3c841b63) + 512 + + + (0x30a4e5c9, 0x83502953) + + + + (0x4e7b798a, 0x183beafb) + (0xa9cdc629, 0xb153eb33) + + + (0xad100179, 0xa3c984ab) + 97 + + + (0xc80ce8af, 0xf699f813) + 2 + + + (0xce18836a, 0x9c0eb403) + 1 + + + + + (0x000075ec, 0x00005504) + Stimulation based epoching + (0x426163d1, 0x324237b0) + + + (0x5ba36127, 0x195feae1) + Input signal + + + (0x6f752dd0, 0x082a321e) + Input stimulations + + + + + (0x5ba36127, 0x195feae1) + Epoched signal + + + + + (0x512a166f, 0x5c3ef83f) + Epoch duration (in sec) + 1 + 1 + false + + + (0x512a166f, 0x5c3ef83f) + Epoch offset (in sec) + 0.5 + 0 + false + + + (0x2c132d6e, 0x44ab0d97) + Stimulation to epoch from + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 352 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 432 + + + (0x4e7b798a, 0x183beafb) + (0xa79941ae, 0x80708445) + + + (0xad100179, 0xa3c984ab) + 163 + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 3 + + + (0xcfad85b0, 0x7c6d841c) + 2 + + + + + (0x0b41bcb4, 0x0c439291) + Timeout + (0x24fcd292, 0x5c8f6aa8) + + + (0x544a003e, 0x6dcba5f6) + Input Stream + + + + + (0x6f752dd0, 0x082a321e) + Output Stimulations + + + + + (0x007deef9, 0x2f3e95c6) + Timeout delay + 5 + 1 + false + + + (0x2c132d6e, 0x44ab0d97) + Output Stimulation + OVTK_StimulationId_Label_00 + OVTK_StimulationId_Label_00 + false + + + + + (0x1fa7a38f, 0x54edbe0b) + 272 + + + (0x1fa963f5, 0x1a638cd4) + 25 + + + (0x207c9054, 0x3c841b63) + 512 + + + (0x4e7b798a, 0x183beafb) + (0x1eaee00e, 0xdb05d34e) + + + (0xad100179, 0xa3c984ab) + 57 + + + (0xc46b3d00, 0x3e0454e1) + (0x00000000, 0x0018e348) + + + (0xc80ce8af, 0xf699f813) + 1 + + + (0xce18836a, 0x9c0eb403) + 2 + + + (0xcfad85b0, 0x7c6d841c) + 1 + + + + + + + (0x00001bce, 0x00007b3f) + + (0x0000050d, 0x000070dd) + 0 + + + (0x000075ec, 0x00005504) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 185 + + + (0x358ae8b5, 0x0f8bacd1) + 376 + + + (0x3f0a3b27, 0x570913d2) + 335 + + + (0x6267b5c5, 0x676e3e42) + 424 + + + + + (0x000025af, 0x00001377) + + (0x00002c23, 0x00003a2b) + 0 + + + (0x0b41bcb4, 0x0c439291) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 185 + + + (0x358ae8b5, 0x0f8bacd1) + 504 + + + (0x3f0a3b27, 0x570913d2) + 255 + + + (0x6267b5c5, 0x676e3e42) + 512 + + + + + (0x000048e6, 0x00003606) + + (0x0b41bcb4, 0x0c439291) + 0 + + + (0x000075ec, 0x00005504) + 1 + + + + (0x1b32c44c, 0x1905e0e9) + 291 + + + (0x358ae8b5, 0x0f8bacd1) + 512 + + + (0x3f0a3b27, 0x570913d2) + 335 + + + (0x6267b5c5, 0x676e3e42) + 439 + + + + + (0x000068f1, 0x000041c2) + + (0x000075ec, 0x00005504) + 0 + + + (0x0000060d, 0x000035cf) + 0 + + + + (0x1b32c44c, 0x1905e0e9) + 371 + + + (0x358ae8b5, 0x0f8bacd1) + 432 + + + (0x3f0a3b27, 0x570913d2) + 441 + + + (0x6267b5c5, 0x676e3e42) + 440 + + + + + + + + (0x00002a5d, 0x0000290b) + (0x3bcce5d2, 0x43f2d968) + [] + + + + + (0x4c90d4ad, 0x7a2554ec) + 320 + + + (0x7b814cca, 0x271df6dd) + 480 + + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/python-toolkit/accuracy.py b/Masterarbeit/openvibe/sdk-master/validation-test/python-toolkit/accuracy.py new file mode 100755 index 0000000..b5d2b78 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/python-toolkit/accuracy.py @@ -0,0 +1,78 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### +import sys, os, re + +#arg 1 repository of the openvibe logs +#arg 2 keyword to search in the log file to get the line where the measure was +#arg 3 Threshold, the measure should be lower +if len(sys.argv) < 4 : + print('incorrect args') + sys.exit(101) +openvibeLogs=sys.argv[1] +keyWord=sys.argv[2] +threshold=float(sys.argv[3]) + +def selectLineContainingWord (filename, searchingWord): + """ Function to select the line containing the keyword + the exception 103 is raised if file is missing + """ + try: + spaced_word = ' %s ' % searchingWord + with open(filename) as file : + for line in file: + if spaced_word in line : + return line + + #Exception raised if the log file wasn't created + except FileNotFoundError: + print('missing %s'%file) + sys.exit(103) + +try: + #Call the selectLineContainingWord function with the input parameter + workingLine=selectLineContainingWord(openvibeLogs,keyWord) + + getPercentageValue = float(re.search('accuracy\s+is\s+(\d+(?:\.\d+))\%', workingLine).group(1)) + + #check if the measure is under the threshold excpected + if getPercentageValue >= threshold: + print ('%s higher or equal to threshold %s'%(getPercentageValue,threshold)) + + else: + print ('%s lower to threshold %s'%(getPercentageValue,threshold)) + print ('reference line in the log %s' %workingLine) + sys.exit(102) + +#exception raised if the keyword wasn't in the log file +except AttributeError: + print ('Missing searching word: %s in the file'%keyWord) + sys.exit(104) +#exception raised if the word: is, wasn't in the log file +except ValueError: + print ('error missing word: is in the selected line') + sys.exit(105) + +except: + raise + +sys.exit() + + \ No newline at end of file diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/python-toolkit/classification.py b/Masterarbeit/openvibe/sdk-master/validation-test/python-toolkit/classification.py new file mode 100755 index 0000000..d79bbdd --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/python-toolkit/classification.py @@ -0,0 +1,89 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +####################################################################### +# Script description +# Goal: check if the number of stimuations present after classification +# is identical to a reference result. +# +# Step 1: Define time windows between 2 stimulation id in the file before the classification, +# the first stimulation ID will be the reference stimulation ID. +# Step 2: Count how many time you get the reference stimulation ID in the time windows. +# Step 3: Compute the number of success and provide a ratio. +# Step 4: Compare the ratio to a reference value compute from previous test. +####################################################################### + +import csv +import sys +from itertools import islice + +# assign arguments to variables +#arg 1 csv file recorded from ov file before the classification +#arg 2 csv file recorded after the classification +#arg 3 reference classification result +if len(sys.argv) < 4 : + print('incorrect args') + sys.exit(101) +# open files associated with the varaibles +with open(sys.argv[1], 'r') as fileReferenceData : + readerReferenceData = csv.reader(fileReferenceData, delimiter=',') + inputData = [rowReference for rowReference in readerReferenceData if rowReference[4] != ""] + if len(inputData) == 0: + print('The lenght of the file reference data: %s is equal to 0 or lower'%sys.argv[1]) + sys.exit(109) +with open(sys.argv[2], 'r') as fileTestData : + readerTestData = csv.reader(fileTestData, delimiter=',') + next(readerTestData) + outputData = [rowReference for rowReference in readerTestData if rowReference[3] != ""] + if len(outputData) == 0: + print('The lenght of the test data: %s is equal to 0 or lower'%sys.argv[2]) + sys.exit(109) +with open(sys.argv[3], 'r') as fileClassificationReference : + classificationReferenceData = [fileIndex for fileIndex in fileClassificationReference] + +# Select into input data the signal with good stimulation marker +referenceData = [rowReference for rowReference in inputData if rowReference[3] in ['33026', '33027', '33025']] +referenceData.append(inputData[-1]) + +# Check in a time window define by two timestamp the number of stimuation +for firstLineReference, secondLineReference, classificationLine in zip(referenceData, islice(referenceData, 1, None), classificationReferenceData) : + # Create the first timestamp referenc + stimulationReference = firstLineReference[3] + firstTimeReference = float(firstLineReference[0]) + # Create the second timestamp reference + secondTimeReference = float(secondLineReference[0]) + stimulationCount = 0 + numberOfStimulation = 0 + + # Create the time window between the first and second time stamp reference + #Count the reference stimulation ID + ref_list = [index.count(stimulationReference) for index in outputData if firstTimeReference < float(index[0]) < secondTimeReference] + print(ref_list) + #Compute the percentage of success + classificationEvaluation = (sum(ref_list)/len(ref_list))*100 + + # Compare to the reference value + if abs(classificationEvaluation - float(classificationLine)) > sys.float_info.epsilon: + print('Classification reference value:%s'%classificationLine) + print('Classification evaluation value:%s'%classificationEvaluation) + sys.exit(108) + +sys.exit() diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/python-toolkit/csv-analyser.py b/Masterarbeit/openvibe/sdk-master/validation-test/python-toolkit/csv-analyser.py new file mode 100755 index 0000000..53a84ea --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/python-toolkit/csv-analyser.py @@ -0,0 +1,58 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +import csv +import sys +import re +import numpy as np + +# test script parameter arg1: reference file csv +# test script parameter arg2: test file csv +if len(sys.argv) < 3 : + print('incorrect args') + sys.exit(101) +# assign arguments to variable +ref_filename=sys.argv[1] +test_filename=sys.argv[2] + +#open files associated with the variables + +with open(ref_filename, 'r') as fileReferenceData : + ref_header = next(fileReferenceData) + ref_data = np.loadtxt(fileReferenceData, delimiter=",", usecols=[0, 1, 2, 3, 4]) + +min_epoch = np.amax(ref_data[ref_data[:,0] <= 1], 0)[1] + 1 +start_index = np.where(ref_data[:,1] == min_epoch)[0][0] +max_epoch = np.amax(ref_data[ref_data[:,0] <= 2], 0)[1] +end_index = np.where(ref_data[:,1] == max_epoch)[0][-1] + 1 + +with open(test_filename, 'r') as fileTestData : + test_header = next(fileTestData) + test_data = np.loadtxt(fileTestData, delimiter=",", usecols=[0, 1, 2, 3, 4]) + +if test_header != ref_header or test_data.shape[0] != (end_index - start_index): + print("Header or shape does not correspond") + sys.exit(101) +if not np.allclose(test_data[:,[0, 2, 3, 4]], ref_data[start_index:end_index,[0, 2, 3, 4]]) : + print("Data is different") + sys.exit(100) +sys.exit() + diff --git a/Masterarbeit/openvibe/sdk-master/validation-test/python-toolkit/csv-comparator.py b/Masterarbeit/openvibe/sdk-master/validation-test/python-toolkit/csv-comparator.py new file mode 100755 index 0000000..282eae4 --- /dev/null +++ b/Masterarbeit/openvibe/sdk-master/validation-test/python-toolkit/csv-comparator.py @@ -0,0 +1,80 @@ +####################################################################### +# Software License Agreement (AGPL-3 License) +# +# OpenViBE SDK Test Software +# Based on OpenViBE V1.1.0, Copyright (C) Inria, 2006-2015 +# Copyright (C) Inria, 2015-2017,V1.0 +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. +# If not, see . +####################################################################### + +import csv +import sys + +# test script parameter arg1: reference file csv +# test script parameter arg2: test file csv + +# assign arguments to variable +if len(sys.argv) != 3 : + print('incorrect args') + sys.exit(101) +referenceData=sys.argv[1] +testData=sys.argv[2] + +def compareCells (file1,file2): + """Compare values of cell from two list of lists""" + # select the ligne for both csv file + for line_index, (input_line, output_line) in enumerate(zip(file1, file2)) : + #check line sizes + if len(input_line) != len(output_line): + print('input and output cells size are different on line %s' % (line_index + 2)) + print('input cells: %s' % len(input_line)) + print('output cells: %s' % len(output_line)) + sys.exit(107) + + for col_index, (inputCell, outputCell) in enumerate(zip(input_line, output_line)): + if inputCell != "" and abs(float(outputCell)-float(inputCell)) > sys.float_info.epsilon: + print('error on line %s and column %s' % (line_index + 2, col_index+1)) + print( 'the input cell %s is different from output cell %s' % (inputCell, outputCell)) + sys.exit(107) + +try: + #open files associated with the variables + with open(referenceData, 'r') as fileReferenceData : + readerReferenceData = csv.reader(fileReferenceData, delimiter=';') + inputData = [row for row in readerReferenceData] + with open(testData, 'r') as fileTestData : + readerTestData = csv.reader(fileTestData, delimiter=';') + outputData = [row for row in readerTestData] +except IOError as err: + print('missing input or ouput file') + print('missing file: %s'%(err.filename)) + sys.exit(106) + +#check the file size of input and output files +if len(inputData) != len(outputData) : + print('Input (%s lines) and output (%s lines) files size are different :' % (len(inputData), len(outputData))) + sys.exit(107) + +# remove the headers and compare them +if inputData.pop(0) != outputData.pop(0) : + print('Header is different') + sys.exit(108) + +#perform the cell comparison +compareCells(inputData, outputData) + +print('All values are identiqual') + +sys.exit()